ZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS8zdy05eHh4LmMgYi9kcml2ZXJzL3Njc2kvM3ctOXh4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYjE4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvM3ctOXh4eC5jCkBAIC0wLDAgKzEsMjE2NyBAQAorLyoKKyAgIDN3LTl4eHguYyAtLSAzd2FyZSA5MDAwIFN0b3JhZ2UgQ29udHJvbGxlciBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKworICAgV3JpdHRlbiBCeTogQWRhbSBSYWRmb3JkIDxsaW51eHJhaWRAYW1jYy5jb20+CisKKyAgIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEFwcGxpZWQgTWljcm8gQ2lyY3VpdHMgQ29ycG9yYXRpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBOTyBXQVJSQU5UWQorICAgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisgICBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVAorICAgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyAgIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKyAgIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworICAgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLAorICAgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisKKyAgIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisgICBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorICAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORAorICAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgICBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKKyAgIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgIEJ1Z3MvQ29tbWVudHMvU3VnZ2VzdGlvbnMgc2hvdWxkIGJlIG1haWxlZCB0bzoKKyAgIGxpbnV4cmFpZEBhbWNjLmNvbQorCisgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZ290bzoKKyAgIGh0dHA6Ly93d3cuYW1jYy5jb20KKworICAgTm90ZTogVGhpcyB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgZG9lcyBub3QgY29udGFpbiBhIGJ1bmRsZWQgZmlybXdhcmUKKyAgICAgICAgIGltYWdlLgorCisgICBIaXN0b3J5CisgICAtLS0tLS0tCisgICAyLjI2LjAyLjAwMCAtIERyaXZlciBjbGVhbnVwIGZvciBrZXJuZWwgc3VibWlzc2lvbi4KKyAgIDIuMjYuMDIuMDAxIC0gUmVwbGFjZSBzY2hlZHVsZV90aW1lb3V0KCkgY2FsbHMgd2l0aCBtc2xlZXAoKS4KKyAgIDIuMjYuMDIuMDAyIC0gQWRkIHN1cHBvcnQgZm9yIFBBRSBtb2RlLgorICAgICAgICAgICAgICAgICBBZGQgbHVuIHN1cHBvcnQuCisgICAgICAgICAgICAgICAgIEZpeCB0d2FfcmVtb3ZlKCkgdG8gZnJlZSBpcnEgaGFuZGxlci91bnJlZ2lzdGVyX2NocmRldigpCisgICAgICAgICAgICAgICAgIGJlZm9yZSBzaHV0dGluZyBkb3duIGNhcmQuCisgICAgICAgICAgICAgICAgIENoYW5nZSB0byBuZXcgJ2NoYW5nZV9xdWV1ZV9kZXB0aCcgYXBpLgorICAgICAgICAgICAgICAgICBGaXggJ2hhbmRsZWQ9MScgSVNSIHVzYWdlLCByZW1vdmUgYm9ndXMgSVJRIGNoZWNrLgorICAgICAgICAgICAgICAgICBSZW1vdmUgdW4tbmVlZGVkIGVoX2Fib3J0IGhhbmRsZXIuCisgICAgICAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBlbWJlZGRlZCBmaXJtd2FyZSBlcnJvciBzdHJpbmdzLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlICIzdy05eHh4LmgiCisKKy8qIEdsb2JhbHMgKi8KKyNkZWZpbmUgVFdfRFJJVkVSX1ZFUlNJT04gIjIuMjYuMDIuMDAyIgorc3RhdGljIFRXX0RldmljZV9FeHRlbnNpb24gKnR3YV9kZXZpY2VfZXh0ZW5zaW9uX2xpc3RbVFdfTUFYX1NMT1RdOworc3RhdGljIHVuc2lnbmVkIGludCB0d2FfZGV2aWNlX2V4dGVuc2lvbl9jb3VudDsKK3N0YXRpYyBpbnQgdHdhX21ham9yID0gLTE7CitleHRlcm4gc3RydWN0IHRpbWV6b25lIHN5c190ejsKKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KK01PRFVMRV9BVVRIT1IgKCJBTUNDIik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCIzd2FyZSA5MDAwIFN0b3JhZ2UgQ29udHJvbGxlciBMaW51eCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFRXX0RSSVZFUl9WRVJTSU9OKTsKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgdHdhX2Flbl9xdWV1ZV9ldmVudChUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIFRXX0NvbW1hbmRfQXBhY2hlX0hlYWRlciAqaGVhZGVyKTsKK3N0YXRpYyBpbnQgdHdhX2Flbl9yZWFkX3F1ZXVlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpOworc3RhdGljIGNoYXIgKnR3YV9hZW5fc2V2ZXJpdHlfbG9va3VwKHVuc2lnbmVkIGNoYXIgc2V2ZXJpdHlfY29kZSk7CitzdGF0aWMgdm9pZCB0d2FfYWVuX3N5bmNfdGltZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkKTsKK3N0YXRpYyBpbnQgdHdhX2NocmRldl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCB0d2FfY2hyZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCB0d2FfZmlsbF9zZW5zZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkLCBpbnQgY29weV9zZW5zZSwgaW50IHByaW50X2hvc3QpOworc3RhdGljIHZvaWQgdHdhX2ZyZWVfcmVxdWVzdF9pZChUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsaW50IHJlcXVlc3RfaWQpOworc3RhdGljIHZvaWQgdHdhX2dldF9yZXF1ZXN0X2lkKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50ICpyZXF1ZXN0X2lkKTsKK3N0YXRpYyBpbnQgdHdhX2luaXRjb25uZWN0aW9uKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IG1lc3NhZ2VfY3JlZGl0cywKKyAJCQkgICAgICB1MzIgc2V0X2ZlYXR1cmVzLCB1bnNpZ25lZCBzaG9ydCBjdXJyZW50X2Z3X3NybCwgCisJCQkgICAgICB1bnNpZ25lZCBzaG9ydCBjdXJyZW50X2Z3X2FyY2hfaWQsIAorCQkJICAgICAgdW5zaWduZWQgc2hvcnQgY3VycmVudF9md19icmFuY2gsIAorCQkJICAgICAgdW5zaWduZWQgc2hvcnQgY3VycmVudF9md19idWlsZCwgCisJCQkgICAgICB1bnNpZ25lZCBzaG9ydCAqZndfb25fY3Rscl9zcmwsIAorCQkJICAgICAgdW5zaWduZWQgc2hvcnQgKmZ3X29uX2N0bHJfYXJjaF9pZCwgCisJCQkgICAgICB1bnNpZ25lZCBzaG9ydCAqZndfb25fY3Rscl9icmFuY2gsIAorCQkJICAgICAgdW5zaWduZWQgc2hvcnQgKmZ3X29uX2N0bHJfYnVpbGQsIAorCQkJICAgICAgdTMyICppbml0X2Nvbm5lY3RfcmVzdWx0KTsKK3N0YXRpYyB2b2lkIHR3YV9sb2FkX3NnbChUV19Db21tYW5kX0Z1bGwgKmZ1bGxfY29tbWFuZF9wYWNrZXQsIGludCByZXF1ZXN0X2lkLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsIGludCBsZW5ndGgpOworc3RhdGljIGludCB0d2FfcG9sbF9yZXNwb25zZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkLCBpbnQgc2Vjb25kcyk7CitzdGF0aWMgaW50IHR3YV9wb2xsX3N0YXR1c19nb25lKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgdTMyIGZsYWcsIGludCBzZWNvbmRzKTsKK3N0YXRpYyBpbnQgdHdhX3Bvc3RfY29tbWFuZF9wYWNrZXQoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCwgY2hhciBpbnRlcm5hbCk7CitzdGF0aWMgaW50IHR3YV9yZXNldF9kZXZpY2VfZXh0ZW5zaW9uKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IGlvY3RsX3Jlc2V0KTsKK3N0YXRpYyBpbnQgdHdhX3Jlc2V0X3NlcXVlbmNlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHNvZnRfcmVzZXQpOworc3RhdGljIGludCB0d2Ffc2NzaW9wX2V4ZWN1dGVfc2NzaShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkLCBjaGFyICpjZGIsIGludCB1c2Vfc2csIFRXX1NHX0VudHJ5ICpzZ2xpc3RhcmcpOworc3RhdGljIHZvaWQgdHdhX3Njc2lvcF9leGVjdXRlX3Njc2lfY29tcGxldGUoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCk7CitzdGF0aWMgY2hhciAqdHdhX3N0cmluZ19sb29rdXAodHdhX21lc3NhZ2VfdHlwZSAqdGFibGUsIHVuc2lnbmVkIGludCBhZW5fY29kZSk7CitzdGF0aWMgdm9pZCB0d2FfdW5tYXBfc2NzaV9kYXRhKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpOworCisvKiBGdW5jdGlvbnMgKi8KKworLyogU2hvdyBzb21lIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGNhcmQgKi8KK3N0YXRpYyBzc2l6ZV90IHR3YV9zaG93X3N0YXRzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjbGFzc190b19zaG9zdChjbGFzc19kZXYpOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc3NpemVfdCBsZW47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiM3ctOXh4eCBEcml2ZXIgdmVyc2lvbjogJXNcbiIKKwkJICAgICAgICJDdXJyZW50IGNvbW1hbmRzIHBvc3RlZDogICAlNGRcbiIKKwkJICAgICAgICJNYXggY29tbWFuZHMgcG9zdGVkOiAgICAgICAlNGRcbiIKKwkJICAgICAgICJDdXJyZW50IHBlbmRpbmcgY29tbWFuZHM6ICAlNGRcbiIKKwkJICAgICAgICJNYXggcGVuZGluZyBjb21tYW5kczogICAgICAlNGRcbiIKKwkJICAgICAgICJMYXN0IHNnbCBsZW5ndGg6ICAgICAgICAgICAlNGRcbiIKKwkJICAgICAgICJNYXggc2dsIGxlbmd0aDogICAgICAgICAgICAlNGRcbiIKKwkJICAgICAgICJMYXN0IHNlY3RvciBjb3VudDogICAgICAgICAlNGRcbiIKKwkJICAgICAgICJNYXggc2VjdG9yIGNvdW50OiAgICAgICAgICAlNGRcbiIKKwkJICAgICAgICJTQ1NJIEhvc3QgUmVzZXRzOiAgICAgICAgICAlNGRcbiIKKwkJICAgICAgICJBRU4nczogICAgICAgICAgICAgICAgICAgICAlNGRcbiIsIAorCQkgICAgICAgVFdfRFJJVkVSX1ZFUlNJT04sCisJCSAgICAgICB0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50LAorCQkgICAgICAgdHdfZGV2LT5tYXhfcG9zdGVkX3JlcXVlc3RfY291bnQsCisJCSAgICAgICB0d19kZXYtPnBlbmRpbmdfcmVxdWVzdF9jb3VudCwKKwkJICAgICAgIHR3X2Rldi0+bWF4X3BlbmRpbmdfcmVxdWVzdF9jb3VudCwKKwkJICAgICAgIHR3X2Rldi0+c2dsX2VudHJpZXMsCisJCSAgICAgICB0d19kZXYtPm1heF9zZ2xfZW50cmllcywKKwkJICAgICAgIHR3X2Rldi0+c2VjdG9yX2NvdW50LAorCQkgICAgICAgdHdfZGV2LT5tYXhfc2VjdG9yX2NvdW50LAorCQkgICAgICAgdHdfZGV2LT5udW1fcmVzZXRzLAorCQkgICAgICAgdHdfZGV2LT5hZW5fY291bnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbGVuOworfSAvKiBFbmQgdHdhX3Nob3dfc3RhdHMoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2V0IGEgZGV2aWNlcyBxdWV1ZSBkZXB0aCAqLworc3RhdGljIGludCB0d2FfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHF1ZXVlX2RlcHRoKQoreworCWlmIChxdWV1ZV9kZXB0aCA+IFRXX1FfTEVOR1RILTIpCisJCXF1ZXVlX2RlcHRoID0gVFdfUV9MRU5HVEgtMjsKKwlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBNU0dfT1JERVJFRF9UQUcsIHF1ZXVlX2RlcHRoKTsKKwlyZXR1cm4gcXVldWVfZGVwdGg7Cit9IC8qIEVuZCB0d2FfY2hhbmdlX3F1ZXVlX2RlcHRoKCkgKi8KKworLyogQ3JlYXRlIHN5c2ZzICdzdGF0cycgZW50cnkgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSB0d2FfaG9zdF9zdGF0c19hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9IAkic3RhdHMiLAorCQkubW9kZSA9CQlTX0lSVUdPLAorCX0sCisJLnNob3cgPSB0d2Ffc2hvd19zdGF0cworfTsKKworLyogSG9zdCBhdHRyaWJ1dGVzIGluaXRpYWxpemVyICovCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKnR3YV9ob3N0X2F0dHJzW10gPSB7CisJJnR3YV9ob3N0X3N0YXRzX2F0dHIsCisJTlVMTCwKK307CisKKy8qIEZpbGUgb3BlcmF0aW9ucyBzdHJ1Y3QgZm9yIGNoYXJhY3RlciBkZXZpY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHR3YV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW9jdGwJCT0gdHdhX2NocmRldl9pb2N0bCwKKwkub3BlbgkJPSB0d2FfY2hyZGV2X29wZW4sCisJLnJlbGVhc2UJPSBOVUxMCit9OworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY29tcGxldGUgYW4gYWVuIHJlcXVlc3QgZnJvbSB0aGUgaXNyICovCitzdGF0aWMgaW50IHR3YV9hZW5fY29tcGxldGUoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCkKK3sKKwlUV19Db21tYW5kX0Z1bGwgKmZ1bGxfY29tbWFuZF9wYWNrZXQ7CisJVFdfQ29tbWFuZCAqY29tbWFuZF9wYWNrZXQ7CisJVFdfQ29tbWFuZF9BcGFjaGVfSGVhZGVyICpoZWFkZXI7CisJdW5zaWduZWQgc2hvcnQgYWVuOworCWludCByZXR2YWwgPSAxOworCisJaGVhZGVyID0gKFRXX0NvbW1hbmRfQXBhY2hlX0hlYWRlciAqKXR3X2Rldi0+Z2VuZXJpY19idWZmZXJfdmlydFtyZXF1ZXN0X2lkXTsKKwl0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50LS07CisJYWVuID0gaGVhZGVyLT5zdGF0dXNfYmxvY2suZXJyb3I7CisJZnVsbF9jb21tYW5kX3BhY2tldCA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFtyZXF1ZXN0X2lkXTsKKwljb21tYW5kX3BhY2tldCA9ICZmdWxsX2NvbW1hbmRfcGFja2V0LT5jb21tYW5kLm9sZGNvbW1hbmQ7CisKKwkvKiBGaXJzdCBjaGVjayBmb3IgaW50ZXJuYWwgY29tcGxldGlvbiBvZiBzZXQgcGFyYW0gZm9yIHRpbWUgc3luYyAqLworCWlmIChUV19PUF9PVVQoY29tbWFuZF9wYWNrZXQtPm9wY29kZV9fc2dsb2Zmc2V0KSA9PSBUV19PUF9TRVRfUEFSQU0pIHsKKwkJLyogS2VlcCByZWFkaW5nIHRoZSBxdWV1ZSBpbiBjYXNlIHRoZXJlIGFyZSBtb3JlIGFlbidzICovCisJCWlmICh0d2FfYWVuX3JlYWRfcXVldWUodHdfZGV2LCByZXF1ZXN0X2lkKSkKKwkJCWdvdG8gb3V0MjsKKwkgICAgICAgIGVsc2UgeworCQkJcmV0dmFsID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJc3dpdGNoIChhZW4pIHsKKwljYXNlIFRXX0FFTl9RVUVVRV9FTVBUWToKKwkJLyogUXVpdCByZWFkaW5nIHRoZSBxdWV1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IG9uZSAqLworCQlicmVhazsKKwljYXNlIFRXX0FFTl9TWU5DX1RJTUVfV0lUSF9IT1NUOgorCQl0d2FfYWVuX3N5bmNfdGltZSh0d19kZXYsIHJlcXVlc3RfaWQpOworCQlyZXR2YWwgPSAwOworCQlnb3RvIG91dDsKKwlkZWZhdWx0OgorCQl0d2FfYWVuX3F1ZXVlX2V2ZW50KHR3X2RldiwgaGVhZGVyKTsKKworCQkvKiBJZiB0aGVyZSBhcmUgbW9yZSBhZW4ncywga2VlcCByZWFkaW5nIHRoZSBxdWV1ZSAqLworCQlpZiAodHdhX2Flbl9yZWFkX3F1ZXVlKHR3X2RldiwgcmVxdWVzdF9pZCkpCisJCQlnb3RvIG91dDI7CisJCWVsc2UgeworCQkJcmV0dmFsID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXJldHZhbCA9IDA7CitvdXQyOgorCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwl0d2FfZnJlZV9yZXF1ZXN0X2lkKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJY2xlYXJfYml0KFRXX0lOX0FUVEVOVElPTl9MT09QLCAmdHdfZGV2LT5mbGFncyk7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9hZW5fY29tcGxldGUoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHJhaW4gYWVuIHF1ZXVlICovCitzdGF0aWMgaW50IHR3YV9hZW5fZHJhaW5fcXVldWUoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgbm9fY2hlY2tfcmVzZXQpCit7CisJaW50IHJlcXVlc3RfaWQgPSAwOworCWNoYXIgY2RiW1RXX01BWF9DREJfTEVOXTsKKwlUV19TR19FbnRyeSBzZ2xpc3RbMV07CisJaW50IGZpbmlzaGVkID0gMCwgY291bnQgPSAwOworCVRXX0NvbW1hbmRfRnVsbCAqZnVsbF9jb21tYW5kX3BhY2tldDsKKwlUV19Db21tYW5kX0FwYWNoZV9IZWFkZXIgKmhlYWRlcjsKKwl1bnNpZ25lZCBzaG9ydCBhZW47CisJaW50IGZpcnN0X3Jlc2V0ID0gMCwgcXVldWUgPSAwLCByZXR2YWwgPSAxOworCisJaWYgKG5vX2NoZWNrX3Jlc2V0KQorCQlmaXJzdF9yZXNldCA9IDA7CisJZWxzZQorCQlmaXJzdF9yZXNldCA9IDE7CisKKwlmdWxsX2NvbW1hbmRfcGFja2V0ID0gdHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0W3JlcXVlc3RfaWRdOworCW1lbXNldChmdWxsX2NvbW1hbmRfcGFja2V0LCAwLCBzaXplb2YoVFdfQ29tbWFuZF9GdWxsKSk7CisKKwkvKiBJbml0aWFsaXplIGNkYiAqLworCW1lbXNldCgmY2RiLCAwLCBUV19NQVhfQ0RCX0xFTik7CisJY2RiWzBdID0gUkVRVUVTVF9TRU5TRTsgLyogb3Bjb2RlICovCisJY2RiWzRdID0gVFdfQUxMT0NBVElPTl9MRU5HVEg7IC8qIGFsbG9jYXRpb24gbGVuZ3RoICovCisKKwkvKiBJbml0aWFsaXplIHNnbGlzdCAqLworCW1lbXNldCgmc2dsaXN0LCAwLCBzaXplb2YoVFdfU0dfRW50cnkpKTsKKwlzZ2xpc3RbMF0ubGVuZ3RoID0gVFdfU0VDVE9SX1NJWkU7CisJc2dsaXN0WzBdLmFkZHJlc3MgPSB0d19kZXYtPmdlbmVyaWNfYnVmZmVyX3BoeXNbcmVxdWVzdF9pZF07CisKKwlpZiAoc2dsaXN0WzBdLmFkZHJlc3MgJiBUV19BTElHTk1FTlRfOTAwMF9TR0wpIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDEsICJGb3VuZCB1bmFsaWduZWQgYWRkcmVzcyBkdXJpbmcgQUVOIGRyYWluIik7CisJCWdvdG8gb3V0OworCX0KKworCS8qIE1hcmsgaW50ZXJuYWwgY29tbWFuZCAqLworCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdID0gTlVMTDsKKworCWRvIHsKKwkJLyogU2VuZCBjb21tYW5kIHRvIHRoZSBib2FyZCAqLworCQlpZiAodHdhX3Njc2lvcF9leGVjdXRlX3Njc2kodHdfZGV2LCByZXF1ZXN0X2lkLCBjZGIsIDEsIHNnbGlzdCkpIHsKKwkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyLCAiRXJyb3IgcG9zdGluZyByZXF1ZXN0IHNlbnNlIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIE5vdyBwb2xsIGZvciBjb21wbGV0aW9uICovCisJCWlmICh0d2FfcG9sbF9yZXNwb25zZSh0d19kZXYsIHJlcXVlc3RfaWQsIDMwKSkgeworCQkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDMsICJObyB2YWxpZCByZXNwb25zZSB3aGlsZSBkcmFpbmluZyBBRU4gcXVldWUiKTsKKwkJCXR3X2Rldi0+cG9zdGVkX3JlcXVlc3RfY291bnQtLTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudC0tOworCQloZWFkZXIgPSAoVFdfQ29tbWFuZF9BcGFjaGVfSGVhZGVyICopdHdfZGV2LT5nZW5lcmljX2J1ZmZlcl92aXJ0W3JlcXVlc3RfaWRdOworCQlhZW4gPSBoZWFkZXItPnN0YXR1c19ibG9jay5lcnJvcjsKKwkJcXVldWUgPSAwOworCQljb3VudCsrOworCisJCXN3aXRjaCAoYWVuKSB7CisJCWNhc2UgVFdfQUVOX1FVRVVFX0VNUFRZOgorCQkJaWYgKGZpcnN0X3Jlc2V0ICE9IDEpCisJCQkJZ290byBvdXQ7CisJCQllbHNlCisJCQkJZmluaXNoZWQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgVFdfQUVOX1NPRlRfUkVTRVQ6CisJCQlpZiAoZmlyc3RfcmVzZXQgPT0gMCkKKwkJCQlmaXJzdF9yZXNldCA9IDE7CisJCQllbHNlCisJCQkJcXVldWUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgVFdfQUVOX1NZTkNfVElNRV9XSVRIX0hPU1Q6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXF1ZXVlID0gMTsKKwkJfQorCisJCS8qIE5vdyBxdWV1ZSBhbiBldmVudCBpbmZvICovCisJCWlmIChxdWV1ZSkKKwkJCXR3YV9hZW5fcXVldWVfZXZlbnQodHdfZGV2LCBoZWFkZXIpOworCX0gd2hpbGUgKChmaW5pc2hlZCA9PSAwKSAmJiAoY291bnQgPCBUV19NQVhfQUVOX0RSQUlOKSk7CisKKwlpZiAoY291bnQgPT0gVFdfTUFYX0FFTl9EUkFJTikKKwkJZ290byBvdXQ7CisKKwlyZXR2YWwgPSAwOworb3V0OgorCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0lOSVRJQUw7CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9hZW5fZHJhaW5fcXVldWUoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcXVldWUgYW4gZXZlbnQgKi8KK3N0YXRpYyB2b2lkIHR3YV9hZW5fcXVldWVfZXZlbnQoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBUV19Db21tYW5kX0FwYWNoZV9IZWFkZXIgKmhlYWRlcikKK3sKKwl1MzIgbG9jYWxfdGltZTsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lOworCVRXX0V2ZW50ICpldmVudDsKKwl1bnNpZ25lZCBzaG9ydCBhZW47CisJY2hhciBob3N0WzE2XTsKKwljaGFyICplcnJvcl9zdHI7CisKKwl0d19kZXYtPmFlbl9jb3VudCsrOworCisJLyogRmlsbCBvdXQgZXZlbnQgaW5mbyAqLworCWV2ZW50ID0gdHdfZGV2LT5ldmVudF9xdWV1ZVt0d19kZXYtPmVycm9yX2luZGV4XTsKKworCS8qIENoZWNrIGZvciBjbG9iYmVyICovCisJaG9zdFswXSA9ICdcMCc7CisJaWYgKHR3X2Rldi0+aG9zdCkgeworCQlzcHJpbnRmKGhvc3QsICIgc2NzaSVkOiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubyk7CisJCWlmIChldmVudC0+cmV0cmlldmVkID09IFRXX0FFTl9OT1RfUkVUUklFVkVEKQorCQkJdHdfZGV2LT5hZW5fY2xvYmJlciA9IDE7CisJfQorCisJYWVuID0gaGVhZGVyLT5zdGF0dXNfYmxvY2suZXJyb3I7CisJbWVtc2V0KGV2ZW50LCAwLCBzaXplb2YoVFdfRXZlbnQpKTsKKworCWV2ZW50LT5zZXZlcml0eSA9IFRXX1NFVl9PVVQoaGVhZGVyLT5zdGF0dXNfYmxvY2suc2V2ZXJpdHlfX3Jlc2VydmVkKTsKKwlkb19nZXR0aW1lb2ZkYXkoJnRpbWUpOworCWxvY2FsX3RpbWUgPSAodTMyKSh0aW1lLnR2X3NlYyAtIChzeXNfdHoudHpfbWludXRlc3dlc3QgKiA2MCkpOworCWV2ZW50LT50aW1lX3N0YW1wX3NlYyA9IGxvY2FsX3RpbWU7CisJZXZlbnQtPmFlbl9jb2RlID0gYWVuOworCWV2ZW50LT5yZXRyaWV2ZWQgPSBUV19BRU5fTk9UX1JFVFJJRVZFRDsKKwlldmVudC0+c2VxdWVuY2VfaWQgPSB0d19kZXYtPmVycm9yX3NlcXVlbmNlX2lkOworCXR3X2Rldi0+ZXJyb3Jfc2VxdWVuY2VfaWQrKzsKKworCS8qIENoZWNrIGZvciBlbWJlZGRlZCBlcnJvciBzdHJpbmcgKi8KKwllcnJvcl9zdHIgPSAmKGhlYWRlci0+ZXJyX3NwZWNpZmljX2Rlc2Nbc3RybGVuKGhlYWRlci0+ZXJyX3NwZWNpZmljX2Rlc2MpKzFdKTsKKworCWhlYWRlci0+ZXJyX3NwZWNpZmljX2Rlc2Nbc2l6ZW9mKGhlYWRlci0+ZXJyX3NwZWNpZmljX2Rlc2MpIC0gMV0gPSAnXDAnOworCWV2ZW50LT5wYXJhbWV0ZXJfbGVuID0gc3RybGVuKGhlYWRlci0+ZXJyX3NwZWNpZmljX2Rlc2MpOworCW1lbWNweShldmVudC0+cGFyYW1ldGVyX2RhdGEsIGhlYWRlci0+ZXJyX3NwZWNpZmljX2Rlc2MsIGV2ZW50LT5wYXJhbWV0ZXJfbGVuKTsKKwlpZiAoZXZlbnQtPnNldmVyaXR5ICE9IFRXX0FFTl9TRVZFUklUWV9ERUJVRykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3ctOXh4eDolcyBBRU46ICVzICgweCUwMlg6MHglMDRYKTogJXM6JXMuXG4iLAorCQkgICAgICAgaG9zdCwKKwkJICAgICAgIHR3YV9hZW5fc2V2ZXJpdHlfbG9va3VwKFRXX1NFVl9PVVQoaGVhZGVyLT5zdGF0dXNfYmxvY2suc2V2ZXJpdHlfX3Jlc2VydmVkKSksCisJCSAgICAgICBUV19NRVNTQUdFX1NPVVJDRV9DT05UUk9MTEVSX0VWRU5ULCBhZW4sCisJCSAgICAgICBlcnJvcl9zdHJbMF0gPT0gJ1wwJyA/IHR3YV9zdHJpbmdfbG9va3VwKHR3YV9hZW5fdGFibGUsIGFlbikgOiBlcnJvcl9zdHIsCisJCSAgICAgICBoZWFkZXItPmVycl9zcGVjaWZpY19kZXNjKTsKKwllbHNlCisJCXR3X2Rldi0+YWVuX2NvdW50LS07CisKKwlpZiAoKHR3X2Rldi0+ZXJyb3JfaW5kZXggKyAxKSA9PSBUV19RX0xFTkdUSCkKKwkJdHdfZGV2LT5ldmVudF9xdWV1ZV93cmFwcGVkID0gMTsKKwl0d19kZXYtPmVycm9yX2luZGV4ID0gKHR3X2Rldi0+ZXJyb3JfaW5kZXggKyAxICkgJSBUV19RX0xFTkdUSDsKK30gLyogRW5kIHR3YV9hZW5fcXVldWVfZXZlbnQoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVhZCB0aGUgYWVuIHF1ZXVlIGZyb20gdGhlIGlzciAqLworc3RhdGljIGludCB0d2FfYWVuX3JlYWRfcXVldWUoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCkKK3sKKwljaGFyIGNkYltUV19NQVhfQ0RCX0xFTl07CisJVFdfU0dfRW50cnkgc2dsaXN0WzFdOworCVRXX0NvbW1hbmRfRnVsbCAqZnVsbF9jb21tYW5kX3BhY2tldDsKKwlpbnQgcmV0dmFsID0gMTsKKworCWZ1bGxfY29tbWFuZF9wYWNrZXQgPSB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnRbcmVxdWVzdF9pZF07CisJbWVtc2V0KGZ1bGxfY29tbWFuZF9wYWNrZXQsIDAsIHNpemVvZihUV19Db21tYW5kX0Z1bGwpKTsKKworCS8qIEluaXRpYWxpemUgY2RiICovCisJbWVtc2V0KCZjZGIsIDAsIFRXX01BWF9DREJfTEVOKTsKKwljZGJbMF0gPSBSRVFVRVNUX1NFTlNFOyAvKiBvcGNvZGUgKi8KKwljZGJbNF0gPSBUV19BTExPQ0FUSU9OX0xFTkdUSDsgLyogYWxsb2NhdGlvbiBsZW5ndGggKi8KKworCS8qIEluaXRpYWxpemUgc2dsaXN0ICovCisJbWVtc2V0KCZzZ2xpc3QsIDAsIHNpemVvZihUV19TR19FbnRyeSkpOworCXNnbGlzdFswXS5sZW5ndGggPSBUV19TRUNUT1JfU0laRTsKKwlzZ2xpc3RbMF0uYWRkcmVzcyA9IHR3X2Rldi0+Z2VuZXJpY19idWZmZXJfcGh5c1tyZXF1ZXN0X2lkXTsKKworCS8qIE1hcmsgaW50ZXJuYWwgY29tbWFuZCAqLworCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdID0gTlVMTDsKKworCS8qIE5vdyBwb3N0IHRoZSBjb21tYW5kIHBhY2tldCAqLworCWlmICh0d2Ffc2NzaW9wX2V4ZWN1dGVfc2NzaSh0d19kZXYsIHJlcXVlc3RfaWQsIGNkYiwgMSwgc2dsaXN0KSkgeworCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4NCwgIlBvc3QgZmFpbGVkIHdoaWxlIHJlYWRpbmcgQUVOIHF1ZXVlIik7CisJCWdvdG8gb3V0OworCX0KKwlyZXR2YWwgPSAwOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2FfYWVuX3JlYWRfcXVldWUoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbG9vayB1cCBhbiBBRU4gc2V2ZXJpdHkgc3RyaW5nICovCitzdGF0aWMgY2hhciAqdHdhX2Flbl9zZXZlcml0eV9sb29rdXAodW5zaWduZWQgY2hhciBzZXZlcml0eV9jb2RlKQoreworCWNoYXIgKnJldHZhbCA9IE5VTEw7CisKKwlpZiAoKHNldmVyaXR5X2NvZGUgPCAodW5zaWduZWQgY2hhcikgVFdfQUVOX1NFVkVSSVRZX0VSUk9SKSB8fAorCSAgICAoc2V2ZXJpdHlfY29kZSA+ICh1bnNpZ25lZCBjaGFyKSBUV19BRU5fU0VWRVJJVFlfREVCVUcpKQorCQlnb3RvIG91dDsKKworCXJldHZhbCA9IHR3YV9hZW5fc2V2ZXJpdHlfdGFibGVbc2V2ZXJpdHlfY29kZV07CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9hZW5fc2V2ZXJpdHlfbG9va3VwKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHN5bmMgZmlybXdhcmUgdGltZSB3aXRoIHRoZSBob3N0IHRpbWUgKi8KK3N0YXRpYyB2b2lkIHR3YV9hZW5fc3luY190aW1lKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJdTMyIHNjaGVkdWxlcnRpbWU7CisJc3RydWN0IHRpbWV2YWwgdXRjOworCVRXX0NvbW1hbmRfRnVsbCAqZnVsbF9jb21tYW5kX3BhY2tldDsKKwlUV19Db21tYW5kICpjb21tYW5kX3BhY2tldDsKKwlUV19QYXJhbV9BcGFjaGUgKnBhcmFtOworCXUzMiBsb2NhbF90aW1lOworCisJLyogRmlsbCBvdXQgdGhlIGNvbW1hbmQgcGFja2V0ICovCisJZnVsbF9jb21tYW5kX3BhY2tldCA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFtyZXF1ZXN0X2lkXTsKKwltZW1zZXQoZnVsbF9jb21tYW5kX3BhY2tldCwgMCwgc2l6ZW9mKFRXX0NvbW1hbmRfRnVsbCkpOworCWNvbW1hbmRfcGFja2V0ID0gJmZ1bGxfY29tbWFuZF9wYWNrZXQtPmNvbW1hbmQub2xkY29tbWFuZDsKKwljb21tYW5kX3BhY2tldC0+b3Bjb2RlX19zZ2xvZmZzZXQgPSBUV19PUFNHTF9JTigyLCBUV19PUF9TRVRfUEFSQU0pOworCWNvbW1hbmRfcGFja2V0LT5yZXF1ZXN0X2lkID0gcmVxdWVzdF9pZDsKKwljb21tYW5kX3BhY2tldC0+Ynl0ZThfb2Zmc2V0LnBhcmFtLnNnbFswXS5hZGRyZXNzID0gdHdfZGV2LT5nZW5lcmljX2J1ZmZlcl9waHlzW3JlcXVlc3RfaWRdOworCWNvbW1hbmRfcGFja2V0LT5ieXRlOF9vZmZzZXQucGFyYW0uc2dsWzBdLmxlbmd0aCA9IFRXX1NFQ1RPUl9TSVpFOworCWNvbW1hbmRfcGFja2V0LT5zaXplID0gVFdfQ09NTUFORF9TSVpFOworCWNvbW1hbmRfcGFja2V0LT5ieXRlNl9vZmZzZXQucGFyYW1ldGVyX2NvdW50ID0gMTsKKworCS8qIFNldHVwIHRoZSBwYXJhbSAqLworCXBhcmFtID0gKFRXX1BhcmFtX0FwYWNoZSAqKXR3X2Rldi0+Z2VuZXJpY19idWZmZXJfdmlydFtyZXF1ZXN0X2lkXTsKKwltZW1zZXQocGFyYW0sIDAsIFRXX1NFQ1RPUl9TSVpFKTsKKwlwYXJhbS0+dGFibGVfaWQgPSBUV19USU1FS0VFUF9UQUJMRSB8IDB4ODAwMDsgLyogQ29udHJvbGxlciB0aW1lIGtlZXAgdGFibGUgKi8KKwlwYXJhbS0+cGFyYW1ldGVyX2lkID0gMHgzOyAvKiBTY2hlZHVsZXJUaW1lICovCisJcGFyYW0tPnBhcmFtZXRlcl9zaXplX2J5dGVzID0gNDsKKworCS8qIENvbnZlcnQgc3lzdGVtIHRpbWUgaW4gVVRDIHRvIGxvY2FsIHRpbWUgc2Vjb25kcyBzaW5jZSBsYXN0IAorICAgICAgICAgICBTdW5kYXkgMTI6MDBBTSAqLworCWRvX2dldHRpbWVvZmRheSgmdXRjKTsKKwlsb2NhbF90aW1lID0gKHUzMikodXRjLnR2X3NlYyAtIChzeXNfdHoudHpfbWludXRlc3dlc3QgKiA2MCkpOworCXNjaGVkdWxlcnRpbWUgPSBsb2NhbF90aW1lIC0gKDMgKiA4NjQwMCk7CisJc2NoZWR1bGVydGltZSA9IHNjaGVkdWxlcnRpbWUgJSA2MDQ4MDA7CisKKwltZW1jcHkocGFyYW0tPmRhdGEsICZzY2hlZHVsZXJ0aW1lLCBzaXplb2YodTMyKSk7CisKKwkvKiBNYXJrIGludGVybmFsIGNvbW1hbmQgKi8KKwl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSA9IE5VTEw7CisKKwkvKiBOb3cgcG9zdCB0aGUgY29tbWFuZCAqLworCXR3YV9wb3N0X2NvbW1hbmRfcGFja2V0KHR3X2RldiwgcmVxdWVzdF9pZCwgMSk7Cit9IC8qIEVuZCB0d2FfYWVuX3N5bmNfdGltZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSBtZW1vcnkgYW5kIGNoZWNrIGlmIGl0IGlzIGNvcnJlY3RseSBhbGlnbmVkICovCitzdGF0aWMgaW50IHR3YV9hbGxvY2F0ZV9tZW1vcnkoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgc2l6ZSwgaW50IHdoaWNoKQoreworCWludCBpOworCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKKwl1bnNpZ25lZCBsb25nICpjcHVfYWRkcjsKKwlpbnQgcmV0dmFsID0gMTsKKworCWNwdV9hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQodHdfZGV2LT50d19wY2lfZGV2LCBzaXplKlRXX1FfTEVOR1RILCAmZG1hX2hhbmRsZSk7CisJaWYgKCFjcHVfYWRkcikgeworCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4NSwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpY3B1X2FkZHIgJSAoVFdfQUxJR05NRU5UXzkwMDApKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHg2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNvcnJlY3RseSBhbGlnbmVkIG1lbW9yeSIpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHR3X2Rldi0+dHdfcGNpX2Rldiwgc2l6ZSpUV19RX0xFTkdUSCwgY3B1X2FkZHIsIGRtYV9oYW5kbGUpOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1zZXQoY3B1X2FkZHIsIDAsIHNpemUqVFdfUV9MRU5HVEgpOworCisJZm9yIChpID0gMDsgaSA8IFRXX1FfTEVOR1RIOyBpKyspIHsKKwkJc3dpdGNoKHdoaWNoKSB7CisJCWNhc2UgMDoKKwkJCXR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfcGh5c1tpXSA9IGRtYV9oYW5kbGUrKGkqc2l6ZSk7CisJCQl0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnRbaV0gPSAoVFdfQ29tbWFuZF9GdWxsICopKCh1bnNpZ25lZCBjaGFyICopY3B1X2FkZHIgKyAoaSpzaXplKSk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJdHdfZGV2LT5nZW5lcmljX2J1ZmZlcl9waHlzW2ldID0gZG1hX2hhbmRsZSsoaSpzaXplKTsKKwkJCXR3X2Rldi0+Z2VuZXJpY19idWZmZXJfdmlydFtpXSA9ICh1bnNpZ25lZCBsb25nICopKCh1bnNpZ25lZCBjaGFyICopY3B1X2FkZHIgKyAoaSpzaXplKSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR2YWwgPSAwOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2FfYWxsb2NhdGVfbWVtb3J5KCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIHRoZSBzdGF0dXMgcmVnaXN0ZXIgZm9yIHVuZXhwZWN0ZWQgYml0cyAqLworc3RhdGljIGludCB0d2FfY2hlY2tfYml0cyh1MzIgc3RhdHVzX3JlZ192YWx1ZSkKK3sKKwlpbnQgcmV0dmFsID0gMTsKKworCWlmICgoc3RhdHVzX3JlZ192YWx1ZSAmIFRXX1NUQVRVU19FWFBFQ1RFRF9CSVRTKSAhPSBUV19TVEFUVVNfRVhQRUNURURfQklUUykKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1VORVhQRUNURURfQklUUykgIT0gMCkKKwkJZ290byBvdXQ7CisKKwlyZXR2YWwgPSAwOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2FfY2hlY2tfYml0cygpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGVjayB0aGUgc3JsIGFuZCBkZWNpZGUgaWYgd2UgYXJlIGNvbXBhdGlibGUgICovCitzdGF0aWMgaW50IHR3YV9jaGVja19zcmwoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgKmZsYXNoZWQpCit7CisJaW50IHJldHZhbCA9IDE7CisJdW5zaWduZWQgc2hvcnQgZndfb25fY3Rscl9zcmwgPSAwLCBmd19vbl9jdGxyX2FyY2hfaWQgPSAwOworCXVuc2lnbmVkIHNob3J0IGZ3X29uX2N0bHJfYnJhbmNoID0gMCwgZndfb25fY3Rscl9idWlsZCA9IDA7CisJdTMyIGluaXRfY29ubmVjdF9yZXN1bHQgPSAwOworCisJaWYgKHR3YV9pbml0Y29ubmVjdGlvbih0d19kZXYsIFRXX0lOSVRfTUVTU0FHRV9DUkVESVRTLAorCQkJICAgICAgIFRXX0VYVEVOREVEX0lOSVRfQ09OTkVDVCwgVFdfQ1VSUkVOVF9EUklWRVJfU1JMLAorCQkJICAgICAgIFRXXzkwMDBfQVJDSF9JRCwgVFdfQ1VSUkVOVF9EUklWRVJfQlJBTkNILAorCQkJICAgICAgIFRXX0NVUlJFTlRfRFJJVkVSX0JVSUxELCAmZndfb25fY3Rscl9zcmwsCisJCQkgICAgICAgJmZ3X29uX2N0bHJfYXJjaF9pZCwgJmZ3X29uX2N0bHJfYnJhbmNoLAorCQkJICAgICAgICZmd19vbl9jdGxyX2J1aWxkLCAmaW5pdF9jb25uZWN0X3Jlc3VsdCkpIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDcsICJJbml0Y29ubmVjdGlvbiBmYWlsZWQgd2hpbGUgY2hlY2tpbmcgU1JMIik7CisJCWdvdG8gb3V0OworCX0KKworCXR3X2Rldi0+d29ya2luZ19zcmwgPSBmd19vbl9jdGxyX3NybDsKKwl0d19kZXYtPndvcmtpbmdfYnJhbmNoID0gZndfb25fY3Rscl9icmFuY2g7CisJdHdfZGV2LT53b3JraW5nX2J1aWxkID0gZndfb25fY3Rscl9idWlsZDsKKworCS8qIFRyeSBiYXNlIG1vZGUgY29tcGF0aWJpbGl0eSAqLworCWlmICghKGluaXRfY29ubmVjdF9yZXN1bHQgJiBUV19DVExSX0ZXX0NPTVBBVElCTEUpKSB7CisJCWlmICh0d2FfaW5pdGNvbm5lY3Rpb24odHdfZGV2LCBUV19JTklUX01FU1NBR0VfQ1JFRElUUywKKwkJCQkgICAgICAgVFdfRVhURU5ERURfSU5JVF9DT05ORUNULAorCQkJCSAgICAgICBUV19CQVNFX0ZXX1NSTCwgVFdfOTAwMF9BUkNIX0lELAorCQkJCSAgICAgICBUV19CQVNFX0ZXX0JSQU5DSCwgVFdfQkFTRV9GV19CVUlMRCwKKwkJCQkgICAgICAgJmZ3X29uX2N0bHJfc3JsLCAmZndfb25fY3Rscl9hcmNoX2lkLAorCQkJCSAgICAgICAmZndfb25fY3Rscl9icmFuY2gsICZmd19vbl9jdGxyX2J1aWxkLAorCQkJCSAgICAgICAmaW5pdF9jb25uZWN0X3Jlc3VsdCkpIHsKKwkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHhhLCAiSW5pdGNvbm5lY3Rpb24gKGJhc2UgbW9kZSkgZmFpbGVkIHdoaWxlIGNoZWNraW5nIFNSTCIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKCEoaW5pdF9jb25uZWN0X3Jlc3VsdCAmIFRXX0NUTFJfRldfQ09NUEFUSUJMRSkpIHsKKwkJCWlmIChUV19DVVJSRU5UX0RSSVZFUl9TUkwgPiBmd19vbl9jdGxyX3NybCkgeworCQkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgzMiwgIkZpcm13YXJlIGFuZCBkcml2ZXIgaW5jb21wYXRpYmlsaXR5OiBwbGVhc2UgdXBncmFkZSBmaXJtd2FyZSIpOworCQkJfSBlbHNlIHsKKwkJCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MzMsICJGaXJtd2FyZSBhbmQgZHJpdmVyIGluY29tcGF0aWJpbGl0eTogcGxlYXNlIHVwZ3JhZGUgZHJpdmVyIik7CisJCQl9CisJCQlnb3RvIG91dDsKKwkJfQorCQl0d19kZXYtPndvcmtpbmdfc3JsID0gVFdfQkFTRV9GV19TUkw7CisJCXR3X2Rldi0+d29ya2luZ19icmFuY2ggPSBUV19CQVNFX0ZXX0JSQU5DSDsKKwkJdHdfZGV2LT53b3JraW5nX2J1aWxkID0gVFdfQkFTRV9GV19CVUlMRDsKKwl9CisJcmV0dmFsID0gMDsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdhX2NoZWNrX3NybCgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBpb2N0bCBmb3IgdGhlIGNoYXJhY3RlciBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgdHdhX2NocmRldl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJbG9uZyB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgKmNwdV9hZGRyLCBkYXRhX2J1ZmZlcl9sZW5ndGhfYWRqdXN0ZWQgPSAwLCBmbGFncyA9IDA7CisJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOworCWludCByZXF1ZXN0X2lkID0gMDsKKwl1bnNpZ25lZCBpbnQgc2VxdWVuY2VfaWQgPSAwOworCXVuc2lnbmVkIGNoYXIgZXZlbnRfaW5kZXgsIHN0YXJ0X2luZGV4OworCVRXX0lvY3RsX0RyaXZlcl9Db21tYW5kIGRyaXZlcl9jb21tYW5kOworCVRXX0lvY3RsX0J1Zl9BcGFjaGUgKnR3X2lvY3RsOworCVRXX0xvY2sgKnR3X2xvY2s7CisJVFdfQ29tbWFuZF9GdWxsICpmdWxsX2NvbW1hbmRfcGFja2V0OworCVRXX0NvbXBhdGliaWxpdHlfSW5mbyAqdHdfY29tcGF0X2luZm87CisJVFdfRXZlbnQgKmV2ZW50OworCXN0cnVjdCB0aW1ldmFsIGN1cnJlbnRfdGltZTsKKwl1MzIgY3VycmVudF90aW1lX21zOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IHR3YV9kZXZpY2VfZXh0ZW5zaW9uX2xpc3RbaW1pbm9yKGlub2RlKV07CisJaW50IHJldHZhbCA9IFRXX0lPQ1RMX0VSUk9SX09TX0VGQVVMVDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCS8qIE9ubHkgbGV0IG9uZSBvZiB0aGVzZSB0aHJvdWdoIGF0IGEgdGltZSAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnR3X2Rldi0+aW9jdGxfc2VtKSkgeworCQlyZXR2YWwgPSBUV19JT0NUTF9FUlJPUl9PU19FSU5UUjsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRmlyc3QgY29weSBkb3duIHRoZSBkcml2ZXIgY29tbWFuZCAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmZHJpdmVyX2NvbW1hbmQsIGFyZ3AsIHNpemVvZihUV19Jb2N0bF9Ecml2ZXJfQ29tbWFuZCkpKQorCQlnb3RvIG91dDI7CisKKwkvKiBDaGVjayBkYXRhIGJ1ZmZlciBzaXplICovCisJaWYgKGRyaXZlcl9jb21tYW5kLmJ1ZmZlcl9sZW5ndGggPiBUV19NQVhfU0VDVE9SUyAqIDUxMikgeworCQlyZXR2YWwgPSBUV19JT0NUTF9FUlJPUl9PU19FSU5WQUw7CisJCWdvdG8gb3V0MjsKKwl9CisKKwkvKiBIYXJkd2FyZSBjYW4gb25seSBkbyBtdWx0aXBsZSBvZiA1MTIgYnl0ZSB0cmFuc2ZlcnMgKi8KKwlkYXRhX2J1ZmZlcl9sZW5ndGhfYWRqdXN0ZWQgPSAoZHJpdmVyX2NvbW1hbmQuYnVmZmVyX2xlbmd0aCArIDUxMSkgJiB+NTExOworCisJLyogTm93IGFsbG9jYXRlIGlvY3RsIGJ1ZiBtZW1vcnkgKi8KKwljcHVfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudCgmdHdfZGV2LT50d19wY2lfZGV2LT5kZXYsIGRhdGFfYnVmZmVyX2xlbmd0aF9hZGp1c3RlZCtzaXplb2YoVFdfSW9jdGxfQnVmX0FwYWNoZSkgLSAxLCAmZG1hX2hhbmRsZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjcHVfYWRkcikgeworCQlyZXR2YWwgPSBUV19JT0NUTF9FUlJPUl9PU19FTk9NRU07CisJCWdvdG8gb3V0MjsKKwl9CisKKwl0d19pb2N0bCA9IChUV19Jb2N0bF9CdWZfQXBhY2hlICopY3B1X2FkZHI7CisKKwkvKiBOb3cgY29weSBkb3duIHRoZSBlbnRpcmUgaW9jdGwgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIodHdfaW9jdGwsIGFyZ3AsIGRyaXZlcl9jb21tYW5kLmJ1ZmZlcl9sZW5ndGggKyBzaXplb2YoVFdfSW9jdGxfQnVmX0FwYWNoZSkgLSAxKSkKKwkJZ290byBvdXQzOworCisJLyogU2VlIHdoaWNoIGlvY3RsIHdlIGFyZSBkb2luZyAqLworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUV19JT0NUTF9GSVJNV0FSRV9QQVNTX1RIUk9VR0g6CisJCXNwaW5fbG9ja19pcnFzYXZlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXR3YV9nZXRfcmVxdWVzdF9pZCh0d19kZXYsICZyZXF1ZXN0X2lkKTsKKworCQkvKiBGbGFnIGludGVybmFsIGNvbW1hbmQgKi8KKwkJdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0gPSBOVUxMOworCisJCS8qIEZsYWcgY2hyZGV2IGlvY3RsICovCisJCXR3X2Rldi0+Y2hyZGV2X3JlcXVlc3RfaWQgPSByZXF1ZXN0X2lkOworCisJCWZ1bGxfY29tbWFuZF9wYWNrZXQgPSAmdHdfaW9jdGwtPmZpcm13YXJlX2NvbW1hbmQ7CisKKwkJLyogTG9hZCByZXF1ZXN0IGlkIGFuZCBzZ2xpc3QgZm9yIGJvdGggY29tbWFuZCB0eXBlcyAqLworCQl0d2FfbG9hZF9zZ2woZnVsbF9jb21tYW5kX3BhY2tldCwgcmVxdWVzdF9pZCwgZG1hX2hhbmRsZSwgZGF0YV9idWZmZXJfbGVuZ3RoX2FkanVzdGVkKTsKKworCQltZW1jcHkodHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0W3JlcXVlc3RfaWRdLCAmKHR3X2lvY3RsLT5maXJtd2FyZV9jb21tYW5kKSwgc2l6ZW9mKFRXX0NvbW1hbmRfRnVsbCkpOworCisJCS8qIE5vdyBwb3N0IHRoZSBjb21tYW5kIHBhY2tldCB0byB0aGUgY29udHJvbGxlciAqLworCQl0d2FfcG9zdF9jb21tYW5kX3BhY2tldCh0d19kZXYsIHJlcXVlc3RfaWQsIDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkJdGltZW91dCA9IFRXX0lPQ1RMX0NIUkRFVl9USU1FT1VUKkhaOworCisJCS8qIE5vdyB3YWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlICovCisJCXRpbWVvdXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodHdfZGV2LT5pb2N0bF93cXVldWUsIHR3X2Rldi0+Y2hyZGV2X3JlcXVlc3RfaWQgPT0gVFdfSU9DVExfQ0hSREVWX0ZSRUUsIHRpbWVvdXQpOworCisJCS8qIFNlZSBpZiB3ZSByZXNldCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgaW9jdGwgdG8gY29tcGxldGUgKi8KKwkJaWYgKHRlc3RfYml0KFRXX0lOX1JFU0VULCAmdHdfZGV2LT5mbGFncykpIHsKKwkJCWNsZWFyX2JpdChUV19JTl9SRVNFVCwgJnR3X2Rldi0+ZmxhZ3MpOworCQkJcmV0dmFsID0gVFdfSU9DVExfRVJST1JfT1NfRVJFU1RBUlRTWVM7CisJCQlnb3RvIG91dDM7CisJCX0KKworCQkvKiBXZSB0aW1lZCBvdXQsIGFuZCBkaWRuJ3QgZ2V0IGFuIGludGVycnVwdCAqLworCQlpZiAodHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCAhPSBUV19JT0NUTF9DSFJERVZfRlJFRSkgeworCQkJLyogTm93IHdlIG5lZWQgdG8gcmVzZXQgdGhlIGJvYXJkICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy05eHh4OiBzY3NpJWQ6IFdBUk5JTkc6ICgweCUwMlg6MHglMDRYKTogQ2hhcmFjdGVyIGlvY3RsICgweCV4KSB0aW1lZCBvdXQsIHJlc2V0dGluZyBjYXJkLlxuIiwKKwkJCSAgICAgICB0d19kZXYtPmhvc3QtPmhvc3Rfbm8sIFRXX0RSSVZFUiwgMHhjLAorCQkJICAgICAgIGNtZCk7CisJCQlyZXR2YWwgPSBUV19JT0NUTF9FUlJPUl9PU19FSU87CisJCQlzcGluX2xvY2tfaXJxc2F2ZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQkJdHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSA9IFRXX1NfQ09NUExFVEVEOworCQkJdHdhX2ZyZWVfcmVxdWVzdF9pZCh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudC0tOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQkJdHdhX3Jlc2V0X2RldmljZV9leHRlbnNpb24odHdfZGV2LCAxKTsKKwkJCWdvdG8gb3V0MzsKKwkJfQorCisJCS8qIE5vdyBjb3B5IGluIHRoZSBjb21tYW5kIHBhY2tldCByZXNwb25zZSAqLworCQltZW1jcHkoJih0d19pb2N0bC0+ZmlybXdhcmVfY29tbWFuZCksIHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFtyZXF1ZXN0X2lkXSwgc2l6ZW9mKFRXX0NvbW1hbmRfRnVsbCkpOworCQkKKwkJLyogTm93IGNvbXBsZXRlIHRoZSBpbyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQl0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50LS07CisJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJdHdhX2ZyZWVfcmVxdWVzdF9pZCh0d19kZXYsIHJlcXVlc3RfaWQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWNhc2UgVFdfSU9DVExfR0VUX0NPTVBBVElCSUxJVFlfSU5GTzoKKwkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IDA7CisJCS8qIENvcHkgY29tcGF0aWJsaXR5IHN0cnVjdCBpbnRvIGlvY3RsIGRhdGEgYnVmZmVyICovCisJCXR3X2NvbXBhdF9pbmZvID0gKFRXX0NvbXBhdGliaWxpdHlfSW5mbyAqKXR3X2lvY3RsLT5kYXRhX2J1ZmZlcjsKKwkJc3RybmNweSh0d19jb21wYXRfaW5mby0+ZHJpdmVyX3ZlcnNpb24sIFRXX0RSSVZFUl9WRVJTSU9OLCBzdHJsZW4oVFdfRFJJVkVSX1ZFUlNJT04pKTsKKwkJdHdfY29tcGF0X2luZm8tPndvcmtpbmdfc3JsID0gdHdfZGV2LT53b3JraW5nX3NybDsKKwkJdHdfY29tcGF0X2luZm8tPndvcmtpbmdfYnJhbmNoID0gdHdfZGV2LT53b3JraW5nX2JyYW5jaDsKKwkJdHdfY29tcGF0X2luZm8tPndvcmtpbmdfYnVpbGQgPSB0d19kZXYtPndvcmtpbmdfYnVpbGQ7CisJCXR3X2NvbXBhdF9pbmZvLT5kcml2ZXJfc3JsX2hpZ2ggPSBUV19DVVJSRU5UX0RSSVZFUl9TUkw7CisJCXR3X2NvbXBhdF9pbmZvLT5kcml2ZXJfYnJhbmNoX2hpZ2ggPSBUV19DVVJSRU5UX0RSSVZFUl9CUkFOQ0g7CisJCXR3X2NvbXBhdF9pbmZvLT5kcml2ZXJfYnVpbGRfaGlnaCA9IFRXX0NVUlJFTlRfRFJJVkVSX0JVSUxEOworCQl0d19jb21wYXRfaW5mby0+ZHJpdmVyX3NybF9sb3cgPSBUV19CQVNFX0ZXX1NSTDsKKwkJdHdfY29tcGF0X2luZm8tPmRyaXZlcl9icmFuY2hfbG93ID0gVFdfQkFTRV9GV19CUkFOQ0g7CisJCXR3X2NvbXBhdF9pbmZvLT5kcml2ZXJfYnVpbGRfbG93ID0gVFdfQkFTRV9GV19CVUlMRDsKKwkJYnJlYWs7CisJY2FzZSBUV19JT0NUTF9HRVRfTEFTVF9FVkVOVDoKKwkJaWYgKHR3X2Rldi0+ZXZlbnRfcXVldWVfd3JhcHBlZCkgeworCQkJaWYgKHR3X2Rldi0+YWVuX2Nsb2JiZXIpIHsKKwkJCQl0d19pb2N0bC0+ZHJpdmVyX2NvbW1hbmQuc3RhdHVzID0gVFdfSU9DVExfRVJST1JfU1RBVFVTX0FFTl9DTE9CQkVSOworCQkJCXR3X2Rldi0+YWVuX2Nsb2JiZXIgPSAwOworCQkJfSBlbHNlCisJCQkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAoIXR3X2Rldi0+ZXJyb3JfaW5kZXgpIHsKKwkJCQl0d19pb2N0bC0+ZHJpdmVyX2NvbW1hbmQuc3RhdHVzID0gVFdfSU9DVExfRVJST1JfU1RBVFVTX05PX01PUkVfRVZFTlRTOworCQkJCWJyZWFrOworCQkJfQorCQkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IDA7CisJCX0KKwkJZXZlbnRfaW5kZXggPSAodHdfZGV2LT5lcnJvcl9pbmRleCAtIDEgKyBUV19RX0xFTkdUSCkgJSBUV19RX0xFTkdUSDsKKwkJbWVtY3B5KHR3X2lvY3RsLT5kYXRhX2J1ZmZlciwgdHdfZGV2LT5ldmVudF9xdWV1ZVtldmVudF9pbmRleF0sIHNpemVvZihUV19FdmVudCkpOworCQl0d19kZXYtPmV2ZW50X3F1ZXVlW2V2ZW50X2luZGV4XS0+cmV0cmlldmVkID0gVFdfQUVOX1JFVFJJRVZFRDsKKwkJYnJlYWs7CisJY2FzZSBUV19JT0NUTF9HRVRfRklSU1RfRVZFTlQ6CisJCWlmICh0d19kZXYtPmV2ZW50X3F1ZXVlX3dyYXBwZWQpIHsKKwkJCWlmICh0d19kZXYtPmFlbl9jbG9iYmVyKSB7CisJCQkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IFRXX0lPQ1RMX0VSUk9SX1NUQVRVU19BRU5fQ0xPQkJFUjsKKwkJCQl0d19kZXYtPmFlbl9jbG9iYmVyID0gMDsKKwkJCX0gZWxzZSAKKwkJCQl0d19pb2N0bC0+ZHJpdmVyX2NvbW1hbmQuc3RhdHVzID0gMDsKKwkJCWV2ZW50X2luZGV4ID0gdHdfZGV2LT5lcnJvcl9pbmRleDsKKwkJfSBlbHNlIHsKKwkJCWlmICghdHdfZGV2LT5lcnJvcl9pbmRleCkgeworCQkJCXR3X2lvY3RsLT5kcml2ZXJfY29tbWFuZC5zdGF0dXMgPSBUV19JT0NUTF9FUlJPUl9TVEFUVVNfTk9fTU9SRV9FVkVOVFM7CisJCQkJYnJlYWs7CisJCQl9CisJCQl0d19pb2N0bC0+ZHJpdmVyX2NvbW1hbmQuc3RhdHVzID0gMDsKKwkJCWV2ZW50X2luZGV4ID0gMDsKKwkJfQorCQltZW1jcHkodHdfaW9jdGwtPmRhdGFfYnVmZmVyLCB0d19kZXYtPmV2ZW50X3F1ZXVlW2V2ZW50X2luZGV4XSwgc2l6ZW9mKFRXX0V2ZW50KSk7CisJCXR3X2Rldi0+ZXZlbnRfcXVldWVbZXZlbnRfaW5kZXhdLT5yZXRyaWV2ZWQgPSBUV19BRU5fUkVUUklFVkVEOworCQlicmVhazsKKwljYXNlIFRXX0lPQ1RMX0dFVF9ORVhUX0VWRU5UOgorCQlldmVudCA9IChUV19FdmVudCAqKXR3X2lvY3RsLT5kYXRhX2J1ZmZlcjsKKwkJc2VxdWVuY2VfaWQgPSBldmVudC0+c2VxdWVuY2VfaWQ7CisJCXR3X2lvY3RsLT5kcml2ZXJfY29tbWFuZC5zdGF0dXMgPSAwOworCisJCWlmICh0d19kZXYtPmV2ZW50X3F1ZXVlX3dyYXBwZWQpIHsKKwkJCWlmICh0d19kZXYtPmFlbl9jbG9iYmVyKSB7CisJCQkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IFRXX0lPQ1RMX0VSUk9SX1NUQVRVU19BRU5fQ0xPQkJFUjsKKwkJCQl0d19kZXYtPmFlbl9jbG9iYmVyID0gMDsKKwkJCX0KKwkJCXN0YXJ0X2luZGV4ID0gdHdfZGV2LT5lcnJvcl9pbmRleDsKKwkJfSBlbHNlIHsKKwkJCWlmICghdHdfZGV2LT5lcnJvcl9pbmRleCkgeworCQkJCXR3X2lvY3RsLT5kcml2ZXJfY29tbWFuZC5zdGF0dXMgPSBUV19JT0NUTF9FUlJPUl9TVEFUVVNfTk9fTU9SRV9FVkVOVFM7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzdGFydF9pbmRleCA9IDA7CisJCX0KKwkJZXZlbnRfaW5kZXggPSAoc3RhcnRfaW5kZXggKyBzZXF1ZW5jZV9pZCAtIHR3X2Rldi0+ZXZlbnRfcXVldWVbc3RhcnRfaW5kZXhdLT5zZXF1ZW5jZV9pZCArIDEpICUgVFdfUV9MRU5HVEg7CisKKwkJaWYgKCEodHdfZGV2LT5ldmVudF9xdWV1ZVtldmVudF9pbmRleF0tPnNlcXVlbmNlX2lkID4gc2VxdWVuY2VfaWQpKSB7CisJCQlpZiAodHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9PSBUV19JT0NUTF9FUlJPUl9TVEFUVVNfQUVOX0NMT0JCRVIpCisJCQkJdHdfZGV2LT5hZW5fY2xvYmJlciA9IDE7CisJCQl0d19pb2N0bC0+ZHJpdmVyX2NvbW1hbmQuc3RhdHVzID0gVFdfSU9DVExfRVJST1JfU1RBVFVTX05PX01PUkVfRVZFTlRTOworCQkJYnJlYWs7CisJCX0KKwkJbWVtY3B5KHR3X2lvY3RsLT5kYXRhX2J1ZmZlciwgdHdfZGV2LT5ldmVudF9xdWV1ZVtldmVudF9pbmRleF0sIHNpemVvZihUV19FdmVudCkpOworCQl0d19kZXYtPmV2ZW50X3F1ZXVlW2V2ZW50X2luZGV4XS0+cmV0cmlldmVkID0gVFdfQUVOX1JFVFJJRVZFRDsKKwkJYnJlYWs7CisJY2FzZSBUV19JT0NUTF9HRVRfUFJFVklPVVNfRVZFTlQ6CisJCWV2ZW50ID0gKFRXX0V2ZW50ICopdHdfaW9jdGwtPmRhdGFfYnVmZmVyOworCQlzZXF1ZW5jZV9pZCA9IGV2ZW50LT5zZXF1ZW5jZV9pZDsKKwkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IDA7CisKKwkJaWYgKHR3X2Rldi0+ZXZlbnRfcXVldWVfd3JhcHBlZCkgeworCQkJaWYgKHR3X2Rldi0+YWVuX2Nsb2JiZXIpIHsKKwkJCQl0d19pb2N0bC0+ZHJpdmVyX2NvbW1hbmQuc3RhdHVzID0gVFdfSU9DVExfRVJST1JfU1RBVFVTX0FFTl9DTE9CQkVSOworCQkJCXR3X2Rldi0+YWVuX2Nsb2JiZXIgPSAwOworCQkJfQorCQkJc3RhcnRfaW5kZXggPSB0d19kZXYtPmVycm9yX2luZGV4OworCQl9IGVsc2UgeworCQkJaWYgKCF0d19kZXYtPmVycm9yX2luZGV4KSB7CisJCQkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IFRXX0lPQ1RMX0VSUk9SX1NUQVRVU19OT19NT1JFX0VWRU5UUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXN0YXJ0X2luZGV4ID0gMDsKKwkJfQorCQlldmVudF9pbmRleCA9IChzdGFydF9pbmRleCArIHNlcXVlbmNlX2lkIC0gdHdfZGV2LT5ldmVudF9xdWV1ZVtzdGFydF9pbmRleF0tPnNlcXVlbmNlX2lkIC0gMSkgJSBUV19RX0xFTkdUSDsKKworCQlpZiAoISh0d19kZXYtPmV2ZW50X3F1ZXVlW2V2ZW50X2luZGV4XS0+c2VxdWVuY2VfaWQgPCBzZXF1ZW5jZV9pZCkpIHsKKwkJCWlmICh0d19pb2N0bC0+ZHJpdmVyX2NvbW1hbmQuc3RhdHVzID09IFRXX0lPQ1RMX0VSUk9SX1NUQVRVU19BRU5fQ0xPQkJFUikKKwkJCQl0d19kZXYtPmFlbl9jbG9iYmVyID0gMTsKKwkJCXR3X2lvY3RsLT5kcml2ZXJfY29tbWFuZC5zdGF0dXMgPSBUV19JT0NUTF9FUlJPUl9TVEFUVVNfTk9fTU9SRV9FVkVOVFM7CisJCQlicmVhazsKKwkJfQorCQltZW1jcHkodHdfaW9jdGwtPmRhdGFfYnVmZmVyLCB0d19kZXYtPmV2ZW50X3F1ZXVlW2V2ZW50X2luZGV4XSwgc2l6ZW9mKFRXX0V2ZW50KSk7CisJCXR3X2Rldi0+ZXZlbnRfcXVldWVbZXZlbnRfaW5kZXhdLT5yZXRyaWV2ZWQgPSBUV19BRU5fUkVUUklFVkVEOworCQlicmVhazsKKwljYXNlIFRXX0lPQ1RMX0dFVF9MT0NLOgorCQl0d19sb2NrID0gKFRXX0xvY2sgKil0d19pb2N0bC0+ZGF0YV9idWZmZXI7CisJCWRvX2dldHRpbWVvZmRheSgmY3VycmVudF90aW1lKTsKKwkJY3VycmVudF90aW1lX21zID0gKGN1cnJlbnRfdGltZS50dl9zZWMgKiAxMDAwKSArIChjdXJyZW50X3RpbWUudHZfdXNlYyAvIDEwMDApOworCisJCWlmICgodHdfbG9jay0+Zm9yY2VfZmxhZyA9PSAxKSB8fCAodHdfZGV2LT5pb2N0bF9zZW1fbG9jayA9PSAwKSB8fCAoY3VycmVudF90aW1lX21zID49IHR3X2Rldi0+aW9jdGxfbXNlYykpIHsKKwkJCXR3X2Rldi0+aW9jdGxfc2VtX2xvY2sgPSAxOworCQkJdHdfZGV2LT5pb2N0bF9tc2VjID0gY3VycmVudF90aW1lX21zICsgdHdfbG9jay0+dGltZW91dF9tc2VjOworCQkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IDA7CisJCQl0d19sb2NrLT50aW1lX3JlbWFpbmluZ19tc2VjID0gdHdfbG9jay0+dGltZW91dF9tc2VjOworCQl9IGVsc2UgeworCQkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IFRXX0lPQ1RMX0VSUk9SX1NUQVRVU19MT0NLRUQ7CisJCQl0d19sb2NrLT50aW1lX3JlbWFpbmluZ19tc2VjID0gdHdfZGV2LT5pb2N0bF9tc2VjIC0gY3VycmVudF90aW1lX21zOworCQl9CisJCWJyZWFrOworCWNhc2UgVFdfSU9DVExfUkVMRUFTRV9MT0NLOgorCQlpZiAodHdfZGV2LT5pb2N0bF9zZW1fbG9jayA9PSAxKSB7CisJCQl0d19kZXYtPmlvY3RsX3NlbV9sb2NrID0gMDsKKwkJCXR3X2lvY3RsLT5kcml2ZXJfY29tbWFuZC5zdGF0dXMgPSAwOworCQl9IGVsc2UgeworCQkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IFRXX0lPQ1RMX0VSUk9SX1NUQVRVU19OT1RfTE9DS0VEOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHZhbCA9IFRXX0lPQ1RMX0VSUk9SX09TX0VOT1RUWTsKKwkJZ290byBvdXQzOworCX0KKworCS8qIE5vdyBjb3B5IHRoZSBlbnRpcmUgcmVzcG9uc2UgdG8gdXNlcnNwYWNlICovCisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCB0d19pb2N0bCwgc2l6ZW9mKFRXX0lvY3RsX0J1Zl9BcGFjaGUpICsgZHJpdmVyX2NvbW1hbmQuYnVmZmVyX2xlbmd0aCAtIDEpID09IDApCisJCXJldHZhbCA9IDA7CitvdXQzOgorCS8qIE5vdyBmcmVlIGlvY3RsIGJ1ZiBtZW1vcnkgKi8KKwlkbWFfZnJlZV9jb2hlcmVudCgmdHdfZGV2LT50d19wY2lfZGV2LT5kZXYsIGRhdGFfYnVmZmVyX2xlbmd0aF9hZGp1c3RlZCtzaXplb2YoVFdfSW9jdGxfQnVmX0FwYWNoZSkgLSAxLCBjcHVfYWRkciwgZG1hX2hhbmRsZSk7CitvdXQyOgorCXVwKCZ0d19kZXYtPmlvY3RsX3NlbSk7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9jaHJkZXZfaW9jdGwoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgb3BlbiBmb3IgdGhlIGNoYXJhY3RlciBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgdHdhX2NocmRldl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vcl9udW1iZXI7CisJaW50IHJldHZhbCA9IFRXX0lPQ1RMX0VSUk9SX09TX0VOT0RFVjsKKworCW1pbm9yX251bWJlciA9IGltaW5vcihpbm9kZSk7CisJaWYgKG1pbm9yX251bWJlciA+PSB0d2FfZGV2aWNlX2V4dGVuc2lvbl9jb3VudCkKKwkJZ290byBvdXQ7CisJcmV0dmFsID0gMDsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdhX2NocmRldl9vcGVuKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHByaW50IHJlYWRhYmxlIG1lc3NhZ2VzIGZyb20gc3RhdHVzIHJlZ2lzdGVyIGVycm9ycyAqLworc3RhdGljIGludCB0d2FfZGVjb2RlX2JpdHMoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCB1MzIgc3RhdHVzX3JlZ192YWx1ZSkKK3sKKwlpbnQgcmV0dmFsID0gMTsKKworCS8qIENoZWNrIGZvciB2YXJpb3VzIGVycm9yIGNvbmRpdGlvbnMgYW5kIGhhbmRsZSB0aGVtIGFwcHJvcHJpYXRlbHkgKi8KKwlpZiAoc3RhdHVzX3JlZ192YWx1ZSAmIFRXX1NUQVRVU19QQ0lfUEFSSVRZX0VSUk9SKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHhjLCAiUENJIFBhcml0eSBFcnJvcjogY2xlYXJpbmciKTsKKwkJd3JpdGVsKFRXX0NPTlRST0xfQ0xFQVJfUEFSSVRZX0VSUk9SLCBUV19DT05UUk9MX1JFR19BRERSKHR3X2RldikpOworCX0KKworCWlmIChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1BDSV9BQk9SVCkgeworCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4ZCwgIlBDSSBBYm9ydDogY2xlYXJpbmciKTsKKwkJd3JpdGVsKFRXX0NPTlRST0xfQ0xFQVJfUENJX0FCT1JULCBUV19DT05UUk9MX1JFR19BRERSKHR3X2RldikpOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQodHdfZGV2LT50d19wY2lfZGV2LCBQQ0lfU1RBVFVTLCBUV19QQ0lfQ0xFQVJfUENJX0FCT1JUKTsKKwl9CisKKwlpZiAoc3RhdHVzX3JlZ192YWx1ZSAmIFRXX1NUQVRVU19RVUVVRV9FUlJPUikgeworCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4ZSwgIkNvbnRyb2xsZXIgUXVldWUgRXJyb3I6IGNsZWFyaW5nIik7CisJCXdyaXRlbChUV19DT05UUk9MX0NMRUFSX1FVRVVFX0VSUk9SLCBUV19DT05UUk9MX1JFR19BRERSKHR3X2RldikpOworCX0KKworCWlmIChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1NCVUZfV1JJVEVfRVJST1IpIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweGYsICJTQlVGIFdyaXRlIEVycm9yOiBjbGVhcmluZyIpOworCQl3cml0ZWwoVFdfQ09OVFJPTF9DTEVBUl9TQlVGX1dSSVRFX0VSUk9SLCBUV19DT05UUk9MX1JFR19BRERSKHR3X2RldikpOworCX0KKworCWlmIChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX01JQ1JPQ09OVFJPTExFUl9FUlJPUikgeworCQlpZiAodHdfZGV2LT5yZXNldF9wcmludCA9PSAwKSB7CisJCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MTAsICJNaWNyb2NvbnRyb2xsZXIgRXJyb3I6IGNsZWFyaW5nIik7CisJCQl0d19kZXYtPnJlc2V0X3ByaW50ID0gMTsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisJcmV0dmFsID0gMDsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdhX2RlY29kZV9iaXRzKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIGVtcHR5IHRoZSByZXNwb25zZSBxdWV1ZSAqLworc3RhdGljIGludCB0d2FfZW1wdHlfcmVzcG9uc2VfcXVldWUoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2KQoreworCXUzMiBzdGF0dXNfcmVnX3ZhbHVlLCByZXNwb25zZV9xdWVfdmFsdWU7CisJaW50IGNvdW50ID0gMCwgcmV0dmFsID0gMTsKKworCXN0YXR1c19yZWdfdmFsdWUgPSByZWFkbChUV19TVEFUVVNfUkVHX0FERFIodHdfZGV2KSk7CisKKwl3aGlsZSAoKChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1JFU1BPTlNFX1FVRVVFX0VNUFRZKSA9PSAwKSAmJiAoY291bnQgPCBUV19NQVhfUkVTUE9OU0VfRFJBSU4pKSB7CisJCXJlc3BvbnNlX3F1ZV92YWx1ZSA9IHJlYWRsKFRXX1JFU1BPTlNFX1FVRVVFX1JFR19BRERSKHR3X2RldikpOworCQlzdGF0dXNfcmVnX3ZhbHVlID0gcmVhZGwoVFdfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOworCQljb3VudCsrOworCX0KKwlpZiAoY291bnQgPT0gVFdfTUFYX1JFU1BPTlNFX0RSQUlOKQorCQlnb3RvIG91dDsKKworCXJldHZhbCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9lbXB0eV9yZXNwb25zZV9xdWV1ZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gcGFzc2VzIHNlbnNlIGtleXMgZnJvbSBmaXJtd2FyZSB0byBzY3NpIGxheWVyICovCitzdGF0aWMgaW50IHR3YV9maWxsX3NlbnNlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQsIGludCBjb3B5X3NlbnNlLCBpbnQgcHJpbnRfaG9zdCkKK3sKKwlUV19Db21tYW5kX0Z1bGwgKmZ1bGxfY29tbWFuZF9wYWNrZXQ7CisJdW5zaWduZWQgc2hvcnQgZXJyb3I7CisJaW50IHJldHZhbCA9IDE7CisJY2hhciAqZXJyb3Jfc3RyOworCisJZnVsbF9jb21tYW5kX3BhY2tldCA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFtyZXF1ZXN0X2lkXTsKKworCS8qIENoZWNrIGZvciBlbWJlZGRlZCBlcnJvciBzdHJpbmcgKi8KKwllcnJvcl9zdHIgPSAmKGZ1bGxfY29tbWFuZF9wYWNrZXQtPmhlYWRlci5lcnJfc3BlY2lmaWNfZGVzY1tzdHJsZW4oZnVsbF9jb21tYW5kX3BhY2tldC0+aGVhZGVyLmVycl9zcGVjaWZpY19kZXNjKSArIDFdKTsKKworCS8qIERvbid0IHByaW50IGVycm9yIGZvciBMb2dpY2FsIHVuaXQgbm90IHN1cHBvcnRlZCBkdXJpbmcgcm9sbGNhbGwgKi8KKwllcnJvciA9IGZ1bGxfY29tbWFuZF9wYWNrZXQtPmhlYWRlci5zdGF0dXNfYmxvY2suZXJyb3I7CisJaWYgKChlcnJvciAhPSBUV19FUlJPUl9MT0dJQ0FMX1VOSVRfTk9UX1NVUFBPUlRFRCkgJiYgKGVycm9yICE9IFRXX0VSUk9SX1VOSVRfT0ZGTElORSkpIHsKKwkJaWYgKHByaW50X2hvc3QpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy05eHh4OiBzY3NpJWQ6IEVSUk9SOiAoMHglMDJYOjB4JTA0WCk6ICVzOiVzLlxuIiwKKwkJCSAgICAgICB0d19kZXYtPmhvc3QtPmhvc3Rfbm8sCisJCQkgICAgICAgVFdfTUVTU0FHRV9TT1VSQ0VfQ09OVFJPTExFUl9FUlJPUiwKKwkJCSAgICAgICBmdWxsX2NvbW1hbmRfcGFja2V0LT5oZWFkZXIuc3RhdHVzX2Jsb2NrLmVycm9yLAorCQkJICAgICAgIGVycm9yX3N0clswXSA9PSAnXDAnID8KKwkJCSAgICAgICB0d2Ffc3RyaW5nX2xvb2t1cCh0d2FfZXJyb3JfdGFibGUsCisJCQkJCQkgZnVsbF9jb21tYW5kX3BhY2tldC0+aGVhZGVyLnN0YXR1c19ibG9jay5lcnJvcikgOiBlcnJvcl9zdHIsCisJCQkgICAgICAgZnVsbF9jb21tYW5kX3BhY2tldC0+aGVhZGVyLmVycl9zcGVjaWZpY19kZXNjKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3ctOXh4eDogRVJST1I6ICgweCUwMlg6MHglMDRYKTogJXM6JXMuXG4iLAorCQkJICAgICAgIFRXX01FU1NBR0VfU09VUkNFX0NPTlRST0xMRVJfRVJST1IsCisJCQkgICAgICAgZnVsbF9jb21tYW5kX3BhY2tldC0+aGVhZGVyLnN0YXR1c19ibG9jay5lcnJvciwKKwkJCSAgICAgICBlcnJvcl9zdHJbMF0gPT0gJ1wwJyA/CisJCQkgICAgICAgdHdhX3N0cmluZ19sb29rdXAodHdhX2Vycm9yX3RhYmxlLAorCQkJCQkJIGZ1bGxfY29tbWFuZF9wYWNrZXQtPmhlYWRlci5zdGF0dXNfYmxvY2suZXJyb3IpIDogZXJyb3Jfc3RyLAorCQkJICAgICAgIGZ1bGxfY29tbWFuZF9wYWNrZXQtPmhlYWRlci5lcnJfc3BlY2lmaWNfZGVzYyk7CisJfQorCisJaWYgKGNvcHlfc2Vuc2UpIHsKKwkJbWVtY3B5KHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5zZW5zZV9idWZmZXIsIGZ1bGxfY29tbWFuZF9wYWNrZXQtPmhlYWRlci5zZW5zZV9kYXRhLCBUV19TRU5TRV9EQVRBX0xFTkdUSCk7CisJCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXN1bHQgPSAoZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5uZXdjb21tYW5kLnN0YXR1cyA8PCAxKTsKKwkJcmV0dmFsID0gVFdfSVNSX0RPTlRfUkVTVUxUOworCQlnb3RvIG91dDsKKwl9CisJcmV0dmFsID0gMDsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdhX2ZpbGxfc2Vuc2UoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZnJlZSB1cCBkZXZpY2UgZXh0ZW5zaW9uIHJlc291cmNlcyAqLworc3RhdGljIHZvaWQgdHdhX2ZyZWVfZGV2aWNlX2V4dGVuc2lvbihUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYpCit7CisJaWYgKHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFswXSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCh0d19kZXYtPnR3X3BjaV9kZXYsCisJCQkJICAgIHNpemVvZihUV19Db21tYW5kX0Z1bGwpKlRXX1FfTEVOR1RILAorCQkJCSAgICB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnRbMF0sCisJCQkJICAgIHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfcGh5c1swXSk7CisKKwlpZiAodHdfZGV2LT5nZW5lcmljX2J1ZmZlcl92aXJ0WzBdKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHR3X2Rldi0+dHdfcGNpX2RldiwKKwkJCQkgICAgVFdfU0VDVE9SX1NJWkUqVFdfUV9MRU5HVEgsCisJCQkJICAgIHR3X2Rldi0+Z2VuZXJpY19idWZmZXJfdmlydFswXSwKKwkJCQkgICAgdHdfZGV2LT5nZW5lcmljX2J1ZmZlcl9waHlzWzBdKTsKKworCWlmICh0d19kZXYtPmV2ZW50X3F1ZXVlWzBdKQorCQlrZnJlZSh0d19kZXYtPmV2ZW50X3F1ZXVlWzBdKTsKK30gLyogRW5kIHR3YV9mcmVlX2RldmljZV9leHRlbnNpb24oKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZnJlZSBhIHJlcXVlc3QgaWQgKi8KK3N0YXRpYyB2b2lkIHR3YV9mcmVlX3JlcXVlc3RfaWQoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCkKK3sKKwl0d19kZXYtPmZyZWVfcXVldWVbdHdfZGV2LT5mcmVlX3RhaWxdID0gcmVxdWVzdF9pZDsKKwl0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdID0gVFdfU19GSU5JU0hFRDsKKwl0d19kZXYtPmZyZWVfdGFpbCA9ICh0d19kZXYtPmZyZWVfdGFpbCArIDEpICUgVFdfUV9MRU5HVEg7Cit9IC8qIEVuZCB0d2FfZnJlZV9yZXF1ZXN0X2lkKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIGdldCBwYXJhbWV0ZXIgdGFibGUgZW50aXJlcyBmcm9tIHRoZSBmaXJtd2FyZSAqLworc3RhdGljIHZvaWQgKnR3YV9nZXRfcGFyYW0oVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCwgaW50IHRhYmxlX2lkLCBpbnQgcGFyYW1ldGVyX2lkLCBpbnQgcGFyYW1ldGVyX3NpemVfYnl0ZXMpCit7CisJVFdfQ29tbWFuZF9GdWxsICpmdWxsX2NvbW1hbmRfcGFja2V0OworCVRXX0NvbW1hbmQgKmNvbW1hbmRfcGFja2V0OworCVRXX1BhcmFtX0FwYWNoZSAqcGFyYW07CisJdW5zaWduZWQgbG9uZyBwYXJhbV92YWx1ZTsKKwl2b2lkICpyZXR2YWwgPSBOVUxMOworCisJLyogU2V0dXAgdGhlIGNvbW1hbmQgcGFja2V0ICovCisJZnVsbF9jb21tYW5kX3BhY2tldCA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFtyZXF1ZXN0X2lkXTsKKwltZW1zZXQoZnVsbF9jb21tYW5kX3BhY2tldCwgMCwgc2l6ZW9mKFRXX0NvbW1hbmRfRnVsbCkpOworCWNvbW1hbmRfcGFja2V0ID0gJmZ1bGxfY29tbWFuZF9wYWNrZXQtPmNvbW1hbmQub2xkY29tbWFuZDsKKworCWNvbW1hbmRfcGFja2V0LT5vcGNvZGVfX3NnbG9mZnNldCA9IFRXX09QU0dMX0lOKDIsIFRXX09QX0dFVF9QQVJBTSk7CisJY29tbWFuZF9wYWNrZXQtPnNpemUgICAgICAgICAgICAgID0gVFdfQ09NTUFORF9TSVpFOworCWNvbW1hbmRfcGFja2V0LT5yZXF1ZXN0X2lkICAgICAgICA9IHJlcXVlc3RfaWQ7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU2X29mZnNldC5ibG9ja19jb3VudCA9IDE7CisKKwkvKiBOb3cgc2V0dXAgdGhlIHBhcmFtICovCisJcGFyYW0gPSAoVFdfUGFyYW1fQXBhY2hlICopdHdfZGV2LT5nZW5lcmljX2J1ZmZlcl92aXJ0W3JlcXVlc3RfaWRdOworCW1lbXNldChwYXJhbSwgMCwgVFdfU0VDVE9SX1NJWkUpOworCXBhcmFtLT50YWJsZV9pZCA9IHRhYmxlX2lkIHwgMHg4MDAwOworCXBhcmFtLT5wYXJhbWV0ZXJfaWQgPSBwYXJhbWV0ZXJfaWQ7CisJcGFyYW0tPnBhcmFtZXRlcl9zaXplX2J5dGVzID0gcGFyYW1ldGVyX3NpemVfYnl0ZXM7CisJcGFyYW1fdmFsdWUgPSB0d19kZXYtPmdlbmVyaWNfYnVmZmVyX3BoeXNbcmVxdWVzdF9pZF07CisKKwljb21tYW5kX3BhY2tldC0+Ynl0ZThfb2Zmc2V0LnBhcmFtLnNnbFswXS5hZGRyZXNzID0gcGFyYW1fdmFsdWU7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4X29mZnNldC5wYXJhbS5zZ2xbMF0ubGVuZ3RoID0gVFdfU0VDVE9SX1NJWkU7CisKKwkvKiBQb3N0IHRoZSBjb21tYW5kIHBhY2tldCB0byB0aGUgYm9hcmQgKi8KKwl0d2FfcG9zdF9jb21tYW5kX3BhY2tldCh0d19kZXYsIHJlcXVlc3RfaWQsIDEpOworCisJLyogUG9sbCBmb3IgY29tcGxldGlvbiAqLworCWlmICh0d2FfcG9sbF9yZXNwb25zZSh0d19kZXYsIHJlcXVlc3RfaWQsIDMwKSkKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDEzLCAiTm8gdmFsaWQgcmVzcG9uc2UgZHVyaW5nIGdldCBwYXJhbSIpCisJZWxzZQorCQlyZXR2YWwgPSAodm9pZCAqKSYocGFyYW0tPmRhdGFbMF0pOworCisJdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudC0tOworCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0lOSVRJQUw7CisKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdhX2dldF9wYXJhbSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBhc3NpZ24gYW4gYXZhaWxhYmxlIHJlcXVlc3QgaWQgKi8KK3N0YXRpYyB2b2lkIHR3YV9nZXRfcmVxdWVzdF9pZChUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCAqcmVxdWVzdF9pZCkKK3sKKwkqcmVxdWVzdF9pZCA9IHR3X2Rldi0+ZnJlZV9xdWV1ZVt0d19kZXYtPmZyZWVfaGVhZF07CisJdHdfZGV2LT5mcmVlX2hlYWQgPSAodHdfZGV2LT5mcmVlX2hlYWQgKyAxKSAlIFRXX1FfTEVOR1RIOworCXR3X2Rldi0+c3RhdGVbKnJlcXVlc3RfaWRdID0gVFdfU19TVEFSVEVEOworfSAvKiBFbmQgdHdhX2dldF9yZXF1ZXN0X2lkKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHNlbmQgYW4gaW5pdGNvbm5lY3Rpb24gY29tbWFuZCB0byBjb250cm9sbGVyICovCitzdGF0aWMgaW50IHR3YV9pbml0Y29ubmVjdGlvbihUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCBtZXNzYWdlX2NyZWRpdHMsCisgCQkJICAgICAgdTMyIHNldF9mZWF0dXJlcywgdW5zaWduZWQgc2hvcnQgY3VycmVudF9md19zcmwsIAorCQkJICAgICAgdW5zaWduZWQgc2hvcnQgY3VycmVudF9md19hcmNoX2lkLCAKKwkJCSAgICAgIHVuc2lnbmVkIHNob3J0IGN1cnJlbnRfZndfYnJhbmNoLCAKKwkJCSAgICAgIHVuc2lnbmVkIHNob3J0IGN1cnJlbnRfZndfYnVpbGQsIAorCQkJICAgICAgdW5zaWduZWQgc2hvcnQgKmZ3X29uX2N0bHJfc3JsLCAKKwkJCSAgICAgIHVuc2lnbmVkIHNob3J0ICpmd19vbl9jdGxyX2FyY2hfaWQsIAorCQkJICAgICAgdW5zaWduZWQgc2hvcnQgKmZ3X29uX2N0bHJfYnJhbmNoLCAKKwkJCSAgICAgIHVuc2lnbmVkIHNob3J0ICpmd19vbl9jdGxyX2J1aWxkLCAKKwkJCSAgICAgIHUzMiAqaW5pdF9jb25uZWN0X3Jlc3VsdCkKK3sKKwlUV19Db21tYW5kX0Z1bGwgKmZ1bGxfY29tbWFuZF9wYWNrZXQ7CisJVFdfSW5pdGNvbm5lY3QgKnR3X2luaXRjb25uZWN0OworCWludCByZXF1ZXN0X2lkID0gMCwgcmV0dmFsID0gMTsKKworCS8qIEluaXRpYWxpemUgSW5pdENvbm5lY3Rpb24gY29tbWFuZCBwYWNrZXQgKi8KKwlmdWxsX2NvbW1hbmRfcGFja2V0ID0gdHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0W3JlcXVlc3RfaWRdOworCW1lbXNldChmdWxsX2NvbW1hbmRfcGFja2V0LCAwLCBzaXplb2YoVFdfQ29tbWFuZF9GdWxsKSk7CisJZnVsbF9jb21tYW5kX3BhY2tldC0+aGVhZGVyLmhlYWRlcl9kZXNjLnNpemVfaGVhZGVyID0gMTI4OworCQorCXR3X2luaXRjb25uZWN0ID0gKFRXX0luaXRjb25uZWN0ICopJmZ1bGxfY29tbWFuZF9wYWNrZXQtPmNvbW1hbmQub2xkY29tbWFuZDsKKwl0d19pbml0Y29ubmVjdC0+b3Bjb2RlX19yZXNlcnZlZCA9IFRXX09QUkVTX0lOKDAsIFRXX09QX0lOSVRfQ09OTkVDVElPTik7CisJdHdfaW5pdGNvbm5lY3QtPnJlcXVlc3RfaWQgPSByZXF1ZXN0X2lkOworCXR3X2luaXRjb25uZWN0LT5tZXNzYWdlX2NyZWRpdHMgPSBtZXNzYWdlX2NyZWRpdHM7CisJdHdfaW5pdGNvbm5lY3QtPmZlYXR1cmVzID0gc2V0X2ZlYXR1cmVzOworCisJLyogVHVybiBvbiA2NC1iaXQgc2dsIHN1cHBvcnQgaWYgd2UgbmVlZCB0byAqLworCXR3X2luaXRjb25uZWN0LT5mZWF0dXJlcyB8PSBzaXplb2YoZG1hX2FkZHJfdCkgPiA0ID8gMSA6IDA7CisKKwlpZiAoc2V0X2ZlYXR1cmVzICYgVFdfRVhURU5ERURfSU5JVF9DT05ORUNUKSB7CisJCXR3X2luaXRjb25uZWN0LT5zaXplID0gVFdfSU5JVF9DT01NQU5EX1BBQ0tFVF9TSVpFX0VYVEVOREVEOworCQl0d19pbml0Y29ubmVjdC0+Zndfc3JsID0gY3VycmVudF9md19zcmw7CisJCXR3X2luaXRjb25uZWN0LT5md19hcmNoX2lkID0gY3VycmVudF9md19hcmNoX2lkOworCQl0d19pbml0Y29ubmVjdC0+ZndfYnJhbmNoID0gY3VycmVudF9md19icmFuY2g7CisJCXR3X2luaXRjb25uZWN0LT5md19idWlsZCA9IGN1cnJlbnRfZndfYnVpbGQ7CisJfSBlbHNlIAorCQl0d19pbml0Y29ubmVjdC0+c2l6ZSA9IFRXX0lOSVRfQ09NTUFORF9QQUNLRVRfU0laRTsKKworCS8qIFNlbmQgY29tbWFuZCBwYWNrZXQgdG8gdGhlIGJvYXJkICovCisJdHdhX3Bvc3RfY29tbWFuZF9wYWNrZXQodHdfZGV2LCByZXF1ZXN0X2lkLCAxKTsKKworCS8qIFBvbGwgZm9yIGNvbXBsZXRpb24gKi8KKwlpZiAodHdhX3BvbGxfcmVzcG9uc2UodHdfZGV2LCByZXF1ZXN0X2lkLCAzMCkpIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDE1LCAiTm8gdmFsaWQgcmVzcG9uc2UgZHVyaW5nIGluaXQgY29ubmVjdGlvbiIpOworCX0gZWxzZSB7CisJCWlmIChzZXRfZmVhdHVyZXMgJiBUV19FWFRFTkRFRF9JTklUX0NPTk5FQ1QpIHsKKwkJCSpmd19vbl9jdGxyX3NybCA9IHR3X2luaXRjb25uZWN0LT5md19zcmw7CisJCQkqZndfb25fY3Rscl9hcmNoX2lkID0gdHdfaW5pdGNvbm5lY3QtPmZ3X2FyY2hfaWQ7CisJCQkqZndfb25fY3Rscl9icmFuY2ggPSB0d19pbml0Y29ubmVjdC0+ZndfYnJhbmNoOworCQkJKmZ3X29uX2N0bHJfYnVpbGQgPSB0d19pbml0Y29ubmVjdC0+ZndfYnVpbGQ7CisJCQkqaW5pdF9jb25uZWN0X3Jlc3VsdCA9IHR3X2luaXRjb25uZWN0LT5yZXN1bHQ7CisJCX0KKwkJcmV0dmFsID0gMDsKKwl9CisKKwl0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50LS07CisJdHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSA9IFRXX1NfSU5JVElBTDsKKworCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2FfaW5pdGNvbm5lY3Rpb24oKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5pdGlhbGl6ZSB0aGUgZmllbGRzIG9mIGEgZGV2aWNlIGV4dGVuc2lvbiAqLworc3RhdGljIGludCB0d2FfaW5pdGlhbGl6ZV9kZXZpY2VfZXh0ZW5zaW9uKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldikKK3sKKwlpbnQgaSwgcmV0dmFsID0gMTsKKworCS8qIEluaXRpYWxpemUgY29tbWFuZCBwYWNrZXQgYnVmZmVycyAqLworCWlmICh0d2FfYWxsb2NhdGVfbWVtb3J5KHR3X2Rldiwgc2l6ZW9mKFRXX0NvbW1hbmRfRnVsbCksIDApKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgxNiwgIkNvbW1hbmQgcGFja2V0IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBJbml0aWFsaXplIGdlbmVyaWMgYnVmZmVyICovCisJaWYgKHR3YV9hbGxvY2F0ZV9tZW1vcnkodHdfZGV2LCBUV19TRUNUT1JfU0laRSwgMSkpIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDE3LCAiR2VuZXJpYyBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQWxsb2NhdGUgZXZlbnQgaW5mbyBzcGFjZSAqLworCXR3X2Rldi0+ZXZlbnRfcXVldWVbMF0gPSBrbWFsbG9jKHNpemVvZihUV19FdmVudCkgKiBUV19RX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0d19kZXYtPmV2ZW50X3F1ZXVlWzBdKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgxOCwgIkV2ZW50IGluZm8gbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCWdvdG8gb3V0OworCX0KKworCW1lbXNldCh0d19kZXYtPmV2ZW50X3F1ZXVlWzBdLCAwLCBzaXplb2YoVFdfRXZlbnQpICogVFdfUV9MRU5HVEgpOworCisJZm9yIChpID0gMDsgaSA8IFRXX1FfTEVOR1RIOyBpKyspIHsKKwkJdHdfZGV2LT5ldmVudF9xdWV1ZVtpXSA9IChUV19FdmVudCAqKSgodW5zaWduZWQgY2hhciAqKXR3X2Rldi0+ZXZlbnRfcXVldWVbMF0gKyAoaSAqIHNpemVvZihUV19FdmVudCkpKTsKKwkJdHdfZGV2LT5mcmVlX3F1ZXVlW2ldID0gaTsKKwkJdHdfZGV2LT5zdGF0ZVtpXSA9IFRXX1NfSU5JVElBTDsKKwl9CisKKwl0d19kZXYtPnBlbmRpbmdfaGVhZCA9IFRXX1FfU1RBUlQ7CisJdHdfZGV2LT5wZW5kaW5nX3RhaWwgPSBUV19RX1NUQVJUOworCXR3X2Rldi0+ZnJlZV9oZWFkID0gVFdfUV9TVEFSVDsKKwl0d19kZXYtPmZyZWVfdGFpbCA9IFRXX1FfU1RBUlQ7CisJdHdfZGV2LT5lcnJvcl9zZXF1ZW5jZV9pZCA9IDE7CisJdHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCA9IFRXX0lPQ1RMX0NIUkRFVl9GUkVFOworCisJaW5pdF9NVVRFWCgmdHdfZGV2LT5pb2N0bF9zZW0pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnR3X2Rldi0+aW9jdGxfd3F1ZXVlKTsKKworCXJldHZhbCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9pbml0aWFsaXplX2RldmljZV9leHRlbnNpb24oKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lICovCitzdGF0aWMgaXJxcmV0dXJuX3QgdHdhX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCByZXF1ZXN0X2lkLCBlcnJvciA9IDA7CisJdTMyIHN0YXR1c19yZWdfdmFsdWU7CisJVFdfUmVzcG9uc2VfUXVldWUgcmVzcG9uc2VfcXVlOworCVRXX0NvbW1hbmRfRnVsbCAqZnVsbF9jb21tYW5kX3BhY2tldDsKKwlUV19Db21tYW5kICpjb21tYW5kX3BhY2tldDsKKwlUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYgPSAoVFdfRGV2aWNlX0V4dGVuc2lvbiAqKWRldl9pbnN0YW5jZTsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwkvKiBHZXQgdGhlIHBlciBhZGFwdGVyIGxvY2sgKi8KKwlzcGluX2xvY2sodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2spOworCisJLyogUmVhZCB0aGUgcmVnaXN0ZXJzICovCisJc3RhdHVzX3JlZ192YWx1ZSA9IHJlYWRsKFRXX1NUQVRVU19SRUdfQUREUih0d19kZXYpKTsKKworCS8qIENoZWNrIGlmIHRoaXMgaXMgb3VyIGludGVycnVwdCwgb3RoZXJ3aXNlIGJhaWwgKi8KKwlpZiAoIShzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1ZBTElEX0lOVEVSUlVQVCkpCisJCWdvdG8gdHdhX2ludGVycnVwdF9iYWlsOworCisJaGFuZGxlZCA9IDE7CisKKwkvKiBDaGVjayBjb250cm9sbGVyIGZvciBlcnJvcnMgKi8KKwlpZiAodHdhX2NoZWNrX2JpdHMoc3RhdHVzX3JlZ192YWx1ZSkpIHsKKwkJaWYgKHR3YV9kZWNvZGVfYml0cyh0d19kZXYsIHN0YXR1c19yZWdfdmFsdWUpKSB7CisJCQlUV19DTEVBUl9BTExfSU5URVJSVVBUUyh0d19kZXYpOworCQkJZ290byB0d2FfaW50ZXJydXB0X2JhaWw7CisJCX0KKwl9CisKKwkvKiBIYW5kbGUgaG9zdCBpbnRlcnJ1cHQgKi8KKwlpZiAoc3RhdHVzX3JlZ192YWx1ZSAmIFRXX1NUQVRVU19IT1NUX0lOVEVSUlVQVCkKKwkJVFdfQ0xFQVJfSE9TVF9JTlRFUlJVUFQodHdfZGV2KTsKKworCS8qIEhhbmRsZSBhdHRlbnRpb24gaW50ZXJydXB0ICovCisJaWYgKHN0YXR1c19yZWdfdmFsdWUgJiBUV19TVEFUVVNfQVRURU5USU9OX0lOVEVSUlVQVCkgeworCQlUV19DTEVBUl9BVFRFTlRJT05fSU5URVJSVVBUKHR3X2Rldik7CisJCWlmICghKHRlc3RfYW5kX3NldF9iaXQoVFdfSU5fQVRURU5USU9OX0xPT1AsICZ0d19kZXYtPmZsYWdzKSkpIHsKKwkJCXR3YV9nZXRfcmVxdWVzdF9pZCh0d19kZXYsICZyZXF1ZXN0X2lkKTsKKworCQkJZXJyb3IgPSB0d2FfYWVuX3JlYWRfcXVldWUodHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJCQl0d2FfZnJlZV9yZXF1ZXN0X2lkKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCQkJY2xlYXJfYml0KFRXX0lOX0FUVEVOVElPTl9MT09QLCAmdHdfZGV2LT5mbGFncyk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBIYW5kbGUgY29tbWFuZCBpbnRlcnJ1cHQgKi8KKwlpZiAoc3RhdHVzX3JlZ192YWx1ZSAmIFRXX1NUQVRVU19DT01NQU5EX0lOVEVSUlVQVCkgeworCQlUV19NQVNLX0NPTU1BTkRfSU5URVJSVVBUKHR3X2Rldik7CisJCS8qIERyYWluIGFzIG1hbnkgcGVuZGluZyBjb21tYW5kcyBhcyB3ZSBjYW4gKi8KKwkJd2hpbGUgKHR3X2Rldi0+cGVuZGluZ19yZXF1ZXN0X2NvdW50ID4gMCkgeworCQkJcmVxdWVzdF9pZCA9IHR3X2Rldi0+cGVuZGluZ19xdWV1ZVt0d19kZXYtPnBlbmRpbmdfaGVhZF07CisJCQlpZiAodHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSAhPSBUV19TX1BFTkRJTkcpIHsKKwkJCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MTksICJGb3VuZCByZXF1ZXN0IGlkIHRoYXQgd2Fzbid0IHBlbmRpbmciKTsKKwkJCQlUV19DTEVBUl9BTExfSU5URVJSVVBUUyh0d19kZXYpOworCQkJCWdvdG8gdHdhX2ludGVycnVwdF9iYWlsOworCQkJfQorCQkJaWYgKHR3YV9wb3N0X2NvbW1hbmRfcGFja2V0KHR3X2RldiwgcmVxdWVzdF9pZCwgMSk9PTApIHsKKwkJCQl0d19kZXYtPnBlbmRpbmdfaGVhZCA9ICh0d19kZXYtPnBlbmRpbmdfaGVhZCArIDEpICUgVFdfUV9MRU5HVEg7CisJCQkJdHdfZGV2LT5wZW5kaW5nX3JlcXVlc3RfY291bnQtLTsKKwkJCX0gZWxzZSB7CisJCQkJLyogSWYgd2UgZ2V0IGhlcmUsIHdlIHdpbGwgY29udGludWUgcmUtcG9zdGluZyBvbiB0aGUgbmV4dCBjb21tYW5kIGludGVycnVwdCAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLyogSGFuZGxlIHJlc3BvbnNlIGludGVycnVwdCAqLworCWlmIChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1JFU1BPTlNFX0lOVEVSUlVQVCkgeworCisJCS8qIERyYWluIHRoZSByZXNwb25zZSBxdWV1ZSBmcm9tIHRoZSBib2FyZCAqLworCQl3aGlsZSAoKHN0YXR1c19yZWdfdmFsdWUgJiBUV19TVEFUVVNfUkVTUE9OU0VfUVVFVUVfRU1QVFkpID09IDApIHsKKwkJCS8qIENvbXBsZXRlIHRoZSByZXNwb25zZSAqLworCQkJcmVzcG9uc2VfcXVlLnZhbHVlID0gcmVhZGwoVFdfUkVTUE9OU0VfUVVFVUVfUkVHX0FERFIodHdfZGV2KSk7CisJCQlyZXF1ZXN0X2lkID0gVFdfUkVTSURfT1VUKHJlc3BvbnNlX3F1ZS5yZXNwb25zZV9pZCk7CisJCQlmdWxsX2NvbW1hbmRfcGFja2V0ID0gdHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0W3JlcXVlc3RfaWRdOworCQkJZXJyb3IgPSAwOworCQkJY29tbWFuZF9wYWNrZXQgPSAmZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5vbGRjb21tYW5kOworCQkJLyogQ2hlY2sgZm9yIGNvbW1hbmQgcGFja2V0IGVycm9ycyAqLworCQkJaWYgKGZ1bGxfY29tbWFuZF9wYWNrZXQtPmNvbW1hbmQubmV3Y29tbWFuZC5zdGF0dXMgIT0gMCkgeworCQkJCWlmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSAhPSAwKSB7CisJCQkJCWVycm9yID0gdHdhX2ZpbGxfc2Vuc2UodHdfZGV2LCByZXF1ZXN0X2lkLCAxLCAxKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBTa2lwIGlvY3RsIGVycm9yIHByaW50cyAqLworCQkJCQlpZiAocmVxdWVzdF9pZCAhPSB0d19kZXYtPmNocmRldl9yZXF1ZXN0X2lkKSB7CisJCQkJCQllcnJvciA9IHR3YV9maWxsX3NlbnNlKHR3X2RldiwgcmVxdWVzdF9pZCwgMCwgMSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8qIENoZWNrIGZvciBjb3JyZWN0IHN0YXRlICovCisJCQlpZiAodHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSAhPSBUV19TX1BPU1RFRCkgeworCQkJCWlmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSAhPSAwKSB7CisJCQkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgxYSwgIlJlY2VpdmVkIGEgcmVxdWVzdCBpZCB0aGF0IHdhc24ndCBwb3N0ZWQiKTsKKwkJCQkJVFdfQ0xFQVJfQUxMX0lOVEVSUlVQVFModHdfZGV2KTsKKwkJCQkJZ290byB0d2FfaW50ZXJydXB0X2JhaWw7CisJCQkJfQorCQkJfQorCisJCQkvKiBDaGVjayBmb3IgaW50ZXJuYWwgY29tbWFuZCBjb21wbGV0aW9uICovCisJCQlpZiAodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0gPT0gMCkgeworCQkJCWlmIChyZXF1ZXN0X2lkICE9IHR3X2Rldi0+Y2hyZGV2X3JlcXVlc3RfaWQpIHsKKwkJCQkJaWYgKHR3YV9hZW5fY29tcGxldGUodHdfZGV2LCByZXF1ZXN0X2lkKSkKKwkJCQkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgxYiwgIkVycm9yIGNvbXBsZXRpbmcgQUVOIGR1cmluZyBhdHRlbnRpb24gaW50ZXJydXB0Iik7CisJCQkJfSBlbHNlIHsKKwkJCQkJdHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCA9IFRXX0lPQ1RMX0NIUkRFVl9GUkVFOworCQkJCQl3YWtlX3VwKCZ0d19kZXYtPmlvY3RsX3dxdWV1ZSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl0d2Ffc2NzaW9wX2V4ZWN1dGVfc2NzaV9jb21wbGV0ZSh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJCS8qIElmIG5vIGVycm9yIGNvbW1hbmQgd2FzIGEgc3VjY2VzcyAqLworCQkJCWlmIChlcnJvciA9PSAwKSB7CisJCQkJCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KTsKKwkJCQl9CisKKwkJCQkvKiBJZiBlcnJvciwgY29tbWFuZCBmYWlsZWQgKi8KKwkJCQlpZiAoZXJyb3IgPT0gMSkgeworCQkJCQkvKiBBc2sgZm9yIGEgaG9zdCByZXNldCAqLworCQkJCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCAoQ0hFQ0tfQ09ORElUSU9OIDw8IDEpOworCQkJCX0KKworCQkJCS8qIFJlcG9ydCByZXNpZHVhbCBieXRlcyBmb3Igc2luZ2xlIHNnbCAqLworCQkJCWlmICgodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnVzZV9zZyA8PSAxKSAmJiAoZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5uZXdjb21tYW5kLnN0YXR1cyA9PSAwKSkgeworCQkJCQlpZiAoZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5uZXdjb21tYW5kLnNnX2xpc3RbMF0ubGVuZ3RoIDwgdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlcXVlc3RfYnVmZmxlbikKKwkJCQkJCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXNpZCA9IHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXF1ZXN0X2J1ZmZsZW4gLSBmdWxsX2NvbW1hbmRfcGFja2V0LT5jb21tYW5kLm5ld2NvbW1hbmQuc2dfbGlzdFswXS5sZW5ndGg7CisJCQkJfQorCisJCQkJLyogTm93IGNvbXBsZXRlIHRoZSBpbyAqLworCQkJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJCQl0d2FfZnJlZV9yZXF1ZXN0X2lkKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCQkJdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudC0tOworCQkJCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5zY3NpX2RvbmUodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0pOworCQkJCXR3YV91bm1hcF9zY3NpX2RhdGEodHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJCX0KKworCQkJLyogQ2hlY2sgZm9yIHZhbGlkIHN0YXR1cyBhZnRlciBlYWNoIGRyYWluICovCisJCQlzdGF0dXNfcmVnX3ZhbHVlID0gcmVhZGwoVFdfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOworCQkJaWYgKHR3YV9jaGVja19iaXRzKHN0YXR1c19yZWdfdmFsdWUpKSB7CisJCQkJaWYgKHR3YV9kZWNvZGVfYml0cyh0d19kZXYsIHN0YXR1c19yZWdfdmFsdWUpKSB7CisJCQkJCVRXX0NMRUFSX0FMTF9JTlRFUlJVUFRTKHR3X2Rldik7CisJCQkJCWdvdG8gdHdhX2ludGVycnVwdF9iYWlsOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwordHdhX2ludGVycnVwdF9iYWlsOgorCXNwaW5fdW5sb2NrKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30gLyogRW5kIHR3YV9pbnRlcnJ1cHQoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbG9hZCB0aGUgcmVxdWVzdCBpZCBhbmQgdmFyaW91cyBzZ2xzIGZvciBpb2N0bHMgKi8KK3N0YXRpYyB2b2lkIHR3YV9sb2FkX3NnbChUV19Db21tYW5kX0Z1bGwgKmZ1bGxfY29tbWFuZF9wYWNrZXQsIGludCByZXF1ZXN0X2lkLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsIGludCBsZW5ndGgpCit7CisJVFdfQ29tbWFuZCAqb2xkY29tbWFuZDsKKwlUV19Db21tYW5kX0FwYWNoZSAqbmV3Y29tbWFuZDsKKwlUV19TR19FbnRyeSAqc2dsOworCisJaWYgKFRXX09QX09VVChmdWxsX2NvbW1hbmRfcGFja2V0LT5jb21tYW5kLm5ld2NvbW1hbmQub3Bjb2RlX19yZXNlcnZlZCkgPT0gVFdfT1BfRVhFQ1VURV9TQ1NJKSB7CisJCW5ld2NvbW1hbmQgPSAmZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5uZXdjb21tYW5kOworCQluZXdjb21tYW5kLT5yZXF1ZXN0X2lkX19sdW5sID0gCisJCQlUV19SRVFfTFVOX0lOKFRXX0xVTl9PVVQobmV3Y29tbWFuZC0+cmVxdWVzdF9pZF9fbHVubCksIHJlcXVlc3RfaWQpOworCQluZXdjb21tYW5kLT5zZ19saXN0WzBdLmFkZHJlc3MgPSBkbWFfaGFuZGxlICsgc2l6ZW9mKFRXX0lvY3RsX0J1Zl9BcGFjaGUpIC0gMTsKKwkJbmV3Y29tbWFuZC0+c2dfbGlzdFswXS5sZW5ndGggPSBsZW5ndGg7CisJCW5ld2NvbW1hbmQtPnNnbF9lbnRyaWVzX19sdW5oID0KKwkJCVRXX1JFUV9MVU5fSU4oVFdfTFVOX09VVChuZXdjb21tYW5kLT5zZ2xfZW50cmllc19fbHVuaCksIDEpOworCX0gZWxzZSB7CisJCW9sZGNvbW1hbmQgPSAmZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5vbGRjb21tYW5kOworCQlvbGRjb21tYW5kLT5yZXF1ZXN0X2lkID0gcmVxdWVzdF9pZDsKKworCQlpZiAoVFdfU0dMX09VVChvbGRjb21tYW5kLT5vcGNvZGVfX3NnbG9mZnNldCkpIHsKKwkJCS8qIExvYWQgdGhlIHNnIGxpc3QgKi8KKwkJCXNnbCA9IChUV19TR19FbnRyeSAqKSgodTMyICopb2xkY29tbWFuZCtUV19TR0xfT1VUKG9sZGNvbW1hbmQtPm9wY29kZV9fc2dsb2Zmc2V0KSk7CisJCQlzZ2wtPmFkZHJlc3MgPSBkbWFfaGFuZGxlICsgc2l6ZW9mKFRXX0lvY3RsX0J1Zl9BcGFjaGUpIC0gMTsKKwkJCXNnbC0+bGVuZ3RoID0gbGVuZ3RoOworCisJCQlpZiAoKHNpemVvZihsb25nKSA8IDgpICYmIChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSkKKwkJCQlvbGRjb21tYW5kLT5zaXplICs9IDE7CisJCX0KKwl9Cit9IC8qIEVuZCB0d2FfbG9hZF9zZ2woKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcGVyZm9ybSBhIHBjaS1kbWEgbWFwcGluZyBmb3IgYSBzY2F0dGVyIGdhdGhlciBsaXN0ICovCitzdGF0aWMgaW50IHR3YV9tYXBfc2NzaV9zZ19kYXRhKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJaW50IHVzZV9zZzsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHR3X2Rldi0+dHdfcGNpX2RldjsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChjbWQtPnVzZV9zZyA9PSAwKQorCQlnb3RvIG91dDsKKworCXVzZV9zZyA9IHBjaV9tYXBfc2cocGRldiwgY21kLT5idWZmZXIsIGNtZC0+dXNlX3NnLCBETUFfQklESVJFQ1RJT05BTCk7CisKKwlpZiAodXNlX3NnID09IDApIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDFjLCAiRmFpbGVkIHRvIG1hcCBzY2F0dGVyIGdhdGhlciBsaXN0Iik7CisJCWdvdG8gb3V0OworCX0KKworCWNtZC0+U0NwLnBoYXNlID0gVFdfUEhBU0VfU0dMSVNUOworCWNtZC0+U0NwLmhhdmVfZGF0YV9pbiA9IHVzZV9zZzsKKwlyZXR2YWwgPSB1c2Vfc2c7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9tYXBfc2NzaV9zZ19kYXRhKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHBlcmZvcm0gYSBwY2ktZG1hIG1hcCBmb3IgYSBzaW5nbGUgYnVmZmVyICovCitzdGF0aWMgZG1hX2FkZHJfdCB0d2FfbWFwX3Njc2lfc2luZ2xlX2RhdGEoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCkKK3sKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF07CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0d19kZXYtPnR3X3BjaV9kZXY7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPT0gMCkgeworCQlyZXR2YWwgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUocGRldiwgY21kLT5yZXF1ZXN0X2J1ZmZlciwgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sIERNQV9CSURJUkVDVElPTkFMKTsKKworCWlmIChtYXBwaW5nID09IDApIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDFkLCAiRmFpbGVkIHRvIG1hcCBwYWdlIik7CisJCWdvdG8gb3V0OworCX0KKworCWNtZC0+U0NwLnBoYXNlID0gVFdfUEhBU0VfU0lOR0xFOworCWNtZC0+U0NwLmhhdmVfZGF0YV9pbiA9IG1hcHBpbmc7CisJcmV0dmFsID0gbWFwcGluZzsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdhX21hcF9zY3NpX3NpbmdsZV9kYXRhKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHBvbGwgZm9yIGEgcmVzcG9uc2UgaW50ZXJydXB0IG9mIGEgcmVxdWVzdCAqLworc3RhdGljIGludCB0d2FfcG9sbF9yZXNwb25zZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkLCBpbnQgc2Vjb25kcykKK3sKKwlpbnQgcmV0dmFsID0gMSwgZm91bmQgPSAwLCByZXNwb25zZV9yZXF1ZXN0X2lkOworCVRXX1Jlc3BvbnNlX1F1ZXVlIHJlc3BvbnNlX3F1ZXVlOworCVRXX0NvbW1hbmRfRnVsbCAqZnVsbF9jb21tYW5kX3BhY2tldCA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFtyZXF1ZXN0X2lkXTsKKworCWlmICh0d2FfcG9sbF9zdGF0dXNfZ29uZSh0d19kZXYsIFRXX1NUQVRVU19SRVNQT05TRV9RVUVVRV9FTVBUWSwgc2Vjb25kcykgPT0gMCkgeworCQlyZXNwb25zZV9xdWV1ZS52YWx1ZSA9IHJlYWRsKFRXX1JFU1BPTlNFX1FVRVVFX1JFR19BRERSKHR3X2RldikpOworCQlyZXNwb25zZV9yZXF1ZXN0X2lkID0gVFdfUkVTSURfT1VUKHJlc3BvbnNlX3F1ZXVlLnJlc3BvbnNlX2lkKTsKKwkJaWYgKHJlcXVlc3RfaWQgIT0gcmVzcG9uc2VfcmVxdWVzdF9pZCkgeworCQkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDFlLCAiRm91bmQgdW5leHBlY3RlZCByZXF1ZXN0IGlkIHdoaWxlIHBvbGxpbmcgZm9yIHJlc3BvbnNlIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoVFdfT1BfT1VUKGZ1bGxfY29tbWFuZF9wYWNrZXQtPmNvbW1hbmQubmV3Y29tbWFuZC5vcGNvZGVfX3Jlc2VydmVkKSA9PSBUV19PUF9FWEVDVVRFX1NDU0kpIHsKKwkJCWlmIChmdWxsX2NvbW1hbmRfcGFja2V0LT5jb21tYW5kLm5ld2NvbW1hbmQuc3RhdHVzICE9IDApIHsKKwkJCQkvKiBiYWQgcmVzcG9uc2UgKi8KKwkJCQl0d2FfZmlsbF9zZW5zZSh0d19kZXYsIHJlcXVlc3RfaWQsIDAsIDApOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJZm91bmQgPSAxOworCQl9IGVsc2UgeworCQkJaWYgKGZ1bGxfY29tbWFuZF9wYWNrZXQtPmNvbW1hbmQub2xkY29tbWFuZC5zdGF0dXMgIT0gMCkgeworCQkJCS8qIGJhZCByZXNwb25zZSAqLworCQkJCXR3YV9maWxsX3NlbnNlKHR3X2RldiwgcmVxdWVzdF9pZCwgMCwgMCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlmb3VuZCA9IDE7CisJCX0KKwl9CisKKwlpZiAoZm91bmQpCisJCXJldHZhbCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9wb2xsX3Jlc3BvbnNlKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHBvbGwgdGhlIHN0YXR1cyByZWdpc3RlciBmb3IgYSBmbGFnICovCitzdGF0aWMgaW50IHR3YV9wb2xsX3N0YXR1cyhUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIHUzMiBmbGFnLCBpbnQgc2Vjb25kcykKK3sKKwl1MzIgc3RhdHVzX3JlZ192YWx1ZTsgCisJdW5zaWduZWQgbG9uZyBiZWZvcmU7CisJaW50IHJldHZhbCA9IDE7CisKKwlzdGF0dXNfcmVnX3ZhbHVlID0gcmVhZGwoVFdfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOworCWJlZm9yZSA9IGppZmZpZXM7CisKKwlpZiAodHdhX2NoZWNrX2JpdHMoc3RhdHVzX3JlZ192YWx1ZSkpCisJCXR3YV9kZWNvZGVfYml0cyh0d19kZXYsIHN0YXR1c19yZWdfdmFsdWUpOworCisJd2hpbGUgKChzdGF0dXNfcmVnX3ZhbHVlICYgZmxhZykgIT0gZmxhZykgeworCQlzdGF0dXNfcmVnX3ZhbHVlID0gcmVhZGwoVFdfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOworCisJCWlmICh0d2FfY2hlY2tfYml0cyhzdGF0dXNfcmVnX3ZhbHVlKSkKKwkJCXR3YV9kZWNvZGVfYml0cyh0d19kZXYsIHN0YXR1c19yZWdfdmFsdWUpOworCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGJlZm9yZSArIEhaICogc2Vjb25kcykpCisJCQlnb3RvIG91dDsKKworCQltc2xlZXAoNTApOworCX0KKwlyZXR2YWwgPSAwOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2FfcG9sbF9zdGF0dXMoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcG9sbCB0aGUgc3RhdHVzIHJlZ2lzdGVyIGZvciBkaXNhcHBlYXJhbmNlIG9mIGEgZmxhZyAqLworc3RhdGljIGludCB0d2FfcG9sbF9zdGF0dXNfZ29uZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIHUzMiBmbGFnLCBpbnQgc2Vjb25kcykKK3sKKwl1MzIgc3RhdHVzX3JlZ192YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGJlZm9yZTsKKwlpbnQgcmV0dmFsID0gMTsKKworCXN0YXR1c19yZWdfdmFsdWUgPSByZWFkbChUV19TVEFUVVNfUkVHX0FERFIodHdfZGV2KSk7CisJYmVmb3JlID0gamlmZmllczsKKworCWlmICh0d2FfY2hlY2tfYml0cyhzdGF0dXNfcmVnX3ZhbHVlKSkKKwkJdHdhX2RlY29kZV9iaXRzKHR3X2Rldiwgc3RhdHVzX3JlZ192YWx1ZSk7CisKKwl3aGlsZSAoKHN0YXR1c19yZWdfdmFsdWUgJiBmbGFnKSAhPSAwKSB7CisJCXN0YXR1c19yZWdfdmFsdWUgPSByZWFkbChUV19TVEFUVVNfUkVHX0FERFIodHdfZGV2KSk7CisJCWlmICh0d2FfY2hlY2tfYml0cyhzdGF0dXNfcmVnX3ZhbHVlKSkKKwkJCXR3YV9kZWNvZGVfYml0cyh0d19kZXYsIHN0YXR1c19yZWdfdmFsdWUpOworCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGJlZm9yZSArIEhaICogc2Vjb25kcykpCisJCQlnb3RvIG91dDsKKworCQltc2xlZXAoNTApOworCX0KKwlyZXR2YWwgPSAwOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2FfcG9sbF9zdGF0dXNfZ29uZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBhdHRlbXB0IHRvIHBvc3QgYSBjb21tYW5kIHBhY2tldCB0byB0aGUgYm9hcmQgKi8KK3N0YXRpYyBpbnQgdHdhX3Bvc3RfY29tbWFuZF9wYWNrZXQoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCwgY2hhciBpbnRlcm5hbCkKK3sKKwl1MzIgc3RhdHVzX3JlZ192YWx1ZTsKKwlkbWFfYWRkcl90IGNvbW1hbmRfcXVlX3ZhbHVlOworCWludCByZXR2YWwgPSAxOworCisJY29tbWFuZF9xdWVfdmFsdWUgPSB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3BoeXNbcmVxdWVzdF9pZF07CisJc3RhdHVzX3JlZ192YWx1ZSA9IHJlYWRsKFRXX1NUQVRVU19SRUdfQUREUih0d19kZXYpKTsKKworCWlmICh0d2FfY2hlY2tfYml0cyhzdGF0dXNfcmVnX3ZhbHVlKSkKKwkJdHdhX2RlY29kZV9iaXRzKHR3X2Rldiwgc3RhdHVzX3JlZ192YWx1ZSk7CisKKwlpZiAoKCh0d19kZXYtPnBlbmRpbmdfcmVxdWVzdF9jb3VudCA+IDApICYmICh0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdICE9IFRXX1NfUEVORElORykpIHx8IChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX0NPTU1BTkRfUVVFVUVfRlVMTCkpIHsKKworCQkvKiBPbmx5IHBlbmQgaW50ZXJuYWwgZHJpdmVyIGNvbW1hbmRzICovCisJCWlmICghaW50ZXJuYWwpIHsKKwkJCXJldHZhbCA9IFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIENvdWxkbid0IHBvc3QgdGhlIGNvbW1hbmQgcGFja2V0LCBzbyB3ZSBkbyBpdCBsYXRlciAqLworCQlpZiAodHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSAhPSBUV19TX1BFTkRJTkcpIHsKKwkJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX1BFTkRJTkc7CisJCQl0d19kZXYtPnBlbmRpbmdfcmVxdWVzdF9jb3VudCsrOworCQkJaWYgKHR3X2Rldi0+cGVuZGluZ19yZXF1ZXN0X2NvdW50ID4gdHdfZGV2LT5tYXhfcGVuZGluZ19yZXF1ZXN0X2NvdW50KSB7CisJCQkJdHdfZGV2LT5tYXhfcGVuZGluZ19yZXF1ZXN0X2NvdW50ID0gdHdfZGV2LT5wZW5kaW5nX3JlcXVlc3RfY291bnQ7CisJCQl9CisJCQl0d19kZXYtPnBlbmRpbmdfcXVldWVbdHdfZGV2LT5wZW5kaW5nX3RhaWxdID0gcmVxdWVzdF9pZDsKKwkJCXR3X2Rldi0+cGVuZGluZ190YWlsID0gKHR3X2Rldi0+cGVuZGluZ190YWlsICsgMSkgJSBUV19RX0xFTkdUSDsKKwkJfQorCQlUV19VTk1BU0tfQ09NTUFORF9JTlRFUlJVUFQodHdfZGV2KTsKKwkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJLyogV2Ugc3VjY2Vzc2Z1bGx5IHBvc3RlZCB0aGUgY29tbWFuZCBwYWNrZXQgKi8KKwkJaWYgKHNpemVvZihkbWFfYWRkcl90KSA+IDQpIHsKKwkJCWNvbW1hbmRfcXVlX3ZhbHVlICs9IFRXX0NPTU1BTkRfT0ZGU0VUOworCQkJd3JpdGVsKCh1MzIpY29tbWFuZF9xdWVfdmFsdWUsIFRXX0NPTU1BTkRfUVVFVUVfUkVHX0FERFIodHdfZGV2KSk7CisJCQl3cml0ZWwoKHUzMikoKHU2NCljb21tYW5kX3F1ZV92YWx1ZSA+PiAzMiksIFRXX0NPTU1BTkRfUVVFVUVfUkVHX0FERFIodHdfZGV2KSArIDB4NCk7CisJCX0gZWxzZSB7CisJCQl3cml0ZWwoVFdfQ09NTUFORF9PRkZTRVQgKyBjb21tYW5kX3F1ZV92YWx1ZSwgVFdfQ09NTUFORF9RVUVVRV9SRUdfQUREUih0d19kZXYpKTsKKwkJfQorCQl0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdID0gVFdfU19QT1NURUQ7CisJCXR3X2Rldi0+cG9zdGVkX3JlcXVlc3RfY291bnQrKzsKKwkJaWYgKHR3X2Rldi0+cG9zdGVkX3JlcXVlc3RfY291bnQgPiB0d19kZXYtPm1heF9wb3N0ZWRfcmVxdWVzdF9jb3VudCkgeworCQkJdHdfZGV2LT5tYXhfcG9zdGVkX3JlcXVlc3RfY291bnQgPSB0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50OworCQl9CisJfQorCXJldHZhbCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9wb3N0X2NvbW1hbmRfcGFja2V0KCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHJlc2V0IGEgZGV2aWNlIGV4dGVuc2lvbiAqLworc3RhdGljIGludCB0d2FfcmVzZXRfZGV2aWNlX2V4dGVuc2lvbihUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCBpb2N0bF9yZXNldCkKK3sKKwlpbnQgaSA9IDA7CisJaW50IHJldHZhbCA9IDE7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwlzZXRfYml0KFRXX0lOX1JFU0VULCAmdHdfZGV2LT5mbGFncyk7CisJVFdfRElTQUJMRV9JTlRFUlJVUFRTKHR3X2Rldik7CisJVFdfTUFTS19DT01NQU5EX0lOVEVSUlVQVCh0d19kZXYpOworCXNwaW5fbG9ja19pcnFzYXZlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkvKiBBYm9ydCBhbGwgcmVxdWVzdHMgdGhhdCBhcmUgaW4gcHJvZ3Jlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVFdfUV9MRU5HVEg7IGkrKykgeworCQlpZiAoKHR3X2Rldi0+c3RhdGVbaV0gIT0gVFdfU19GSU5JU0hFRCkgJiYKKwkJICAgICh0d19kZXYtPnN0YXRlW2ldICE9IFRXX1NfSU5JVElBTCkgJiYKKwkJICAgICh0d19kZXYtPnN0YXRlW2ldICE9IFRXX1NfQ09NUExFVEVEKSkgeworCQkJaWYgKHR3X2Rldi0+c3JiW2ldKSB7CisJCQkJdHdfZGV2LT5zcmJbaV0tPnJlc3VsdCA9IChESURfUkVTRVQgPDwgMTYpOworCQkJCXR3X2Rldi0+c3JiW2ldLT5zY3NpX2RvbmUodHdfZGV2LT5zcmJbaV0pOworCQkJCXR3YV91bm1hcF9zY3NpX2RhdGEodHdfZGV2LCBpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFJlc2V0IHF1ZXVlcyBhbmQgY291bnRzICovCisJZm9yIChpID0gMDsgaSA8IFRXX1FfTEVOR1RIOyBpKyspIHsKKwkJdHdfZGV2LT5mcmVlX3F1ZXVlW2ldID0gaTsKKwkJdHdfZGV2LT5zdGF0ZVtpXSA9IFRXX1NfSU5JVElBTDsKKwl9CisJdHdfZGV2LT5mcmVlX2hlYWQgPSBUV19RX1NUQVJUOworCXR3X2Rldi0+ZnJlZV90YWlsID0gVFdfUV9TVEFSVDsKKwl0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50ID0gMDsKKwl0d19kZXYtPnBlbmRpbmdfcmVxdWVzdF9jb3VudCA9IDA7CisJdHdfZGV2LT5wZW5kaW5nX2hlYWQgPSBUV19RX1NUQVJUOworCXR3X2Rldi0+cGVuZGluZ190YWlsID0gVFdfUV9TVEFSVDsKKwl0d19kZXYtPnJlc2V0X3ByaW50ID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCWlmICh0d2FfcmVzZXRfc2VxdWVuY2UodHdfZGV2LCAxKSkKKwkJZ290byBvdXQ7CisKKwlUV19FTkFCTEVfQU5EX0NMRUFSX0lOVEVSUlVQVFModHdfZGV2KTsKKworCS8qIFdha2UgdXAgYW55IGlvY3RsIHRoYXQgd2FzIHBlbmRpbmcgYmVmb3JlIHRoZSByZXNldCAqLworCWlmICgodHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCA9PSBUV19JT0NUTF9DSFJERVZfRlJFRSkgfHwgKGlvY3RsX3Jlc2V0KSkgeworCQljbGVhcl9iaXQoVFdfSU5fUkVTRVQsICZ0d19kZXYtPmZsYWdzKTsKKwl9IGVsc2UgeworCQl0d19kZXYtPmNocmRldl9yZXF1ZXN0X2lkID0gVFdfSU9DVExfQ0hSREVWX0ZSRUU7CisJCXdha2VfdXAoJnR3X2Rldi0+aW9jdGxfd3F1ZXVlKTsKKwl9CisJcmV0dmFsID0gMDsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdhX3Jlc2V0X2RldmljZV9leHRlbnNpb24oKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXQgYSBjb250cm9sbGVyICovCitzdGF0aWMgaW50IHR3YV9yZXNldF9zZXF1ZW5jZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCBzb2Z0X3Jlc2V0KQoreworCWludCB0cmllcyA9IDAsIHJldHZhbCA9IDEsIGZsYXNoZWQgPSAwLCBkb19zb2Z0X3Jlc2V0ID0gc29mdF9yZXNldDsKKworCXdoaWxlICh0cmllcyA8IFRXX01BWF9SRVNFVF9UUklFUykgeworCQlpZiAoZG9fc29mdF9yZXNldCkKKwkJCVRXX1NPRlRfUkVTRVQodHdfZGV2KTsKKworCQkvKiBNYWtlIHN1cmUgY29udHJvbGxlciBpcyBpbiBhIGdvb2Qgc3RhdGUgKi8KKwkJaWYgKHR3YV9wb2xsX3N0YXR1cyh0d19kZXYsIFRXX1NUQVRVU19NSUNST0NPTlRST0xMRVJfUkVBRFkgfCAoZG9fc29mdF9yZXNldCA9PSAxID8gVFdfU1RBVFVTX0FUVEVOVElPTl9JTlRFUlJVUFQgOiAwKSwgNjApKSB7CisJCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MWYsICJNaWNyb2NvbnRyb2xsZXIgbm90IHJlYWR5IGR1cmluZyByZXNldCBzZXF1ZW5jZSIpOworCQkJZG9fc29mdF9yZXNldCA9IDE7CisJCQl0cmllcysrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBFbXB0eSByZXNwb25zZSBxdWV1ZSAqLworCQlpZiAodHdhX2VtcHR5X3Jlc3BvbnNlX3F1ZXVlKHR3X2RldikpIHsKKwkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyMCwgIlJlc3BvbnNlIHF1ZXVlIGVtcHR5IGZhaWxlZCBkdXJpbmcgcmVzZXQgc2VxdWVuY2UiKTsKKwkJCWRvX3NvZnRfcmVzZXQgPSAxOworCQkJdHJpZXMrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZmxhc2hlZCA9IDA7CisKKwkJLyogQ2hlY2sgZm9yIGNvbXBhdGliaWxpdHkvZmxhc2ggKi8KKwkJaWYgKHR3YV9jaGVja19zcmwodHdfZGV2LCAmZmxhc2hlZCkpIHsKKwkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyMSwgIkNvbXBhdGliaWxpdHkgY2hlY2sgZmFpbGVkIGR1cmluZyByZXNldCBzZXF1ZW5jZSIpOworCQkJZG9fc29mdF9yZXNldCA9IDE7CisJCQl0cmllcysrOworCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQlpZiAoZmxhc2hlZCkgeworCQkJCXRyaWVzKys7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKiBEcmFpbiB0aGUgQUVOIHF1ZXVlICovCisJCWlmICh0d2FfYWVuX2RyYWluX3F1ZXVlKHR3X2Rldiwgc29mdF9yZXNldCkpIHsKKwkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyMiwgIkFFTiBkcmFpbiBmYWlsZWQgZHVyaW5nIHJlc2V0IHNlcXVlbmNlIik7CisJCQlkb19zb2Z0X3Jlc2V0ID0gMTsKKwkJCXRyaWVzKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIElmIHdlIGdvdCBoZXJlLCBjb250cm9sbGVyIGlzIGluIGEgZ29vZCBzdGF0ZSAqLworCQlyZXR2YWwgPSAwOworCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9yZXNldF9zZXF1ZW5jZSgpICovCisKKy8qIFRoaXMgZnVuY2l0b24gcmV0dXJucyB1bml0IGdlb21ldHJ5IGluIGN5bGluZGVycy9oZWFkcy9zZWN0b3JzICovCitzdGF0aWMgaW50IHR3YV9zY3NpX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgZ2VvbVtdKQoreworCWludCBoZWFkcywgc2VjdG9ycywgY3lsaW5kZXJzOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldjsKKworCXR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisKKwlpZiAoY2FwYWNpdHkgPj0gMHgyMDAwMDApIHsKKwkJaGVhZHMgPSAyNTU7CisJCXNlY3RvcnMgPSA2MzsKKwkJY3lsaW5kZXJzID0gc2VjdG9yX2RpdihjYXBhY2l0eSwgaGVhZHMgKiBzZWN0b3JzKTsKKwl9IGVsc2UgeworCQloZWFkcyA9IDY0OworCQlzZWN0b3JzID0gMzI7CisJCWN5bGluZGVycyA9IHNlY3Rvcl9kaXYoY2FwYWNpdHksIGhlYWRzICogc2VjdG9ycyk7CisJfQorCisJZ2VvbVswXSA9IGhlYWRzOworCWdlb21bMV0gPSBzZWN0b3JzOworCWdlb21bMl0gPSBjeWxpbmRlcnM7CisKKwlyZXR1cm4gMDsKK30gLyogRW5kIHR3YV9zY3NpX2Jpb3NwYXJhbSgpICovCisKKy8qIFRoaXMgaXMgdGhlIG5ldyBzY3NpIGVoIHJlc2V0IGZ1bmN0aW9uICovCitzdGF0aWMgaW50IHR3YV9zY3NpX2VoX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IE5VTEw7CisJaW50IHJldHZhbCA9IEZBSUxFRDsKKworCXR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlzcGluX3VubG9ja19pcnEodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2spOworCisJdHdfZGV2LT5udW1fcmVzZXRzKys7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIzdy05eHh4OiBzY3NpJWQ6IFdBUk5JTkc6ICgweCUwMlg6MHglMDRYKTogVW5pdCAjJWQ6IENvbW1hbmQgKDB4JXgpIHRpbWVkIG91dCwgcmVzZXR0aW5nIGNhcmQuXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8sIFRXX0RSSVZFUiwgMHgyYywgU0NwbnQtPmRldmljZS0+aWQsIFNDcG50LT5jbW5kWzBdKTsKKworCS8qIE5vdyByZXNldCB0aGUgY2FyZCBhbmQgc29tZSBvZiB0aGUgZGV2aWNlIGV4dGVuc2lvbiBkYXRhICovCisJaWYgKHR3YV9yZXNldF9kZXZpY2VfZXh0ZW5zaW9uKHR3X2RldiwgMCkpIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDJiLCAiQ29udHJvbGxlciByZXNldCBmYWlsZWQgZHVyaW5nIHNjc2kgaG9zdCByZXNldCIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXR2YWwgPSBTVUNDRVNTOworb3V0OgorCXNwaW5fbG9ja19pcnEodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2spOworCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2Ffc2NzaV9laF9yZXNldCgpICovCisKKy8qIFRoaXMgaXMgdGhlIG1haW4gc2NzaSBxdWV1ZSBmdW5jdGlvbiB0byBoYW5kbGUgc2NzaSBvcGNvZGVzICovCitzdGF0aWMgaW50IHR3YV9zY3NpX3F1ZXVlKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlpbnQgcmVxdWVzdF9pZCwgcmV0dmFsOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwkvKiBDaGVjayBpZiB0aGlzIEZXIHN1cHBvcnRzIGx1bnMgKi8KKwlpZiAoKFNDcG50LT5kZXZpY2UtPmx1biAhPSAwKSAmJiAodHdfZGV2LT53b3JraW5nX3NybCA8IFRXX0ZXX1NSTF9MVU5TX1NVUFBPUlRFRCkpIHsKKwkJU0NwbnQtPnJlc3VsdCA9IChESURfQkFEX1RBUkdFVCA8PCAxNik7CisJCWRvbmUoU0NwbnQpOworCQlyZXR2YWwgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTYXZlIGRvbmUgZnVuY3Rpb24gaW50byBzY3NpX2NtbmQgc3RydWN0ICovCisJU0NwbnQtPnNjc2lfZG9uZSA9IGRvbmU7CisJCQorCS8qIEdldCBhIGZyZWUgcmVxdWVzdCBpZCAqLworCXR3YV9nZXRfcmVxdWVzdF9pZCh0d19kZXYsICZyZXF1ZXN0X2lkKTsKKworCS8qIFNhdmUgdGhlIHNjc2kgY29tbWFuZCBmb3IgdXNlIGJ5IHRoZSBJU1IgKi8KKwl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSA9IFNDcG50OworCisJLyogSW5pdGlhbGl6ZSBwaGFzZSB0byB6ZXJvICovCisJU0NwbnQtPlNDcC5waGFzZSA9IFRXX1BIQVNFX0lOSVRJQUw7CisKKwlyZXR2YWwgPSB0d2Ffc2NzaW9wX2V4ZWN1dGVfc2NzaSh0d19kZXYsIHJlcXVlc3RfaWQsIE5VTEwsIDAsIE5VTEwpOworCXN3aXRjaCAocmV0dmFsKSB7CisJY2FzZSBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOgorCQl0d2FfZnJlZV9yZXF1ZXN0X2lkKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSA9IFRXX1NfQ09NUExFVEVEOworCQl0d2FfZnJlZV9yZXF1ZXN0X2lkKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCVNDcG50LT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJZG9uZShTQ3BudCk7CisJCXJldHZhbCA9IDA7CisJfQorb3V0OgorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2Ffc2NzaV9xdWV1ZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZHMgc2NzaSBjZGIncyB0byB0aGUgZmlybXdhcmUgKi8KK3N0YXRpYyBpbnQgdHdhX3Njc2lvcF9leGVjdXRlX3Njc2koVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCwgY2hhciAqY2RiLCBpbnQgdXNlX3NnLCBUV19TR19FbnRyeSAqc2dsaXN0YXJnKQoreworCVRXX0NvbW1hbmRfRnVsbCAqZnVsbF9jb21tYW5kX3BhY2tldDsKKwlUV19Db21tYW5kX0FwYWNoZSAqY29tbWFuZF9wYWNrZXQ7CisJdTMyIG51bV9zZWN0b3JzID0gMHgwOworCWludCBpLCBzZ19jb3VudDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIgPSBOVUxMOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0ID0gTlVMTDsKKwl1MzIgYnVmZmFkZHIgPSAweDA7CisJaW50IHJldHZhbCA9IDE7CisKKwlpZiAodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0pIHsKKwkJaWYgKHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXF1ZXN0X2J1ZmZlcikgeworCQkJc2dsaXN0ID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJfQorCQlzcmIgPSB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXTsKKwl9CisKKwkvKiBJbml0aWFsaXplIGNvbW1hbmQgcGFja2V0ICovCisJZnVsbF9jb21tYW5kX3BhY2tldCA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFtyZXF1ZXN0X2lkXTsKKwlmdWxsX2NvbW1hbmRfcGFja2V0LT5oZWFkZXIuaGVhZGVyX2Rlc2Muc2l6ZV9oZWFkZXIgPSAxMjg7CisJZnVsbF9jb21tYW5kX3BhY2tldC0+aGVhZGVyLnN0YXR1c19ibG9jay5lcnJvciA9IDA7CisJZnVsbF9jb21tYW5kX3BhY2tldC0+aGVhZGVyLnN0YXR1c19ibG9jay5zZXZlcml0eV9fcmVzZXJ2ZWQgPSAwOworCisJY29tbWFuZF9wYWNrZXQgPSAmZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5uZXdjb21tYW5kOworCWNvbW1hbmRfcGFja2V0LT5zdGF0dXMgPSAwOworCWNvbW1hbmRfcGFja2V0LT5vcGNvZGVfX3Jlc2VydmVkID0gVFdfT1BSRVNfSU4oMCwgVFdfT1BfRVhFQ1VURV9TQ1NJKTsKKworCS8qIFdlIGZvcmNlZCAxNiBieXRlIGNkYiB1c2UgZWFybGllciAqLworCWlmICghY2RiKQorCQltZW1jcHkoY29tbWFuZF9wYWNrZXQtPmNkYiwgc3JiLT5jbW5kLCBUV19NQVhfQ0RCX0xFTik7CisJZWxzZQorCQltZW1jcHkoY29tbWFuZF9wYWNrZXQtPmNkYiwgY2RiLCBUV19NQVhfQ0RCX0xFTik7CisKKwlpZiAoc3JiKSB7CisJCWNvbW1hbmRfcGFja2V0LT51bml0ID0gc3JiLT5kZXZpY2UtPmlkOworCQljb21tYW5kX3BhY2tldC0+cmVxdWVzdF9pZF9fbHVubCA9CisJCQlUV19SRVFfTFVOX0lOKHNyYi0+ZGV2aWNlLT5sdW4sIHJlcXVlc3RfaWQpOworCX0gZWxzZSB7CisJCWNvbW1hbmRfcGFja2V0LT5yZXF1ZXN0X2lkX19sdW5sID0KKwkJCVRXX1JFUV9MVU5fSU4oMCwgcmVxdWVzdF9pZCk7CisJCWNvbW1hbmRfcGFja2V0LT51bml0ID0gMDsKKwl9CisKKwljb21tYW5kX3BhY2tldC0+c2dsX29mZnNldCA9IDE2OworCisJaWYgKCFzZ2xpc3RhcmcpIHsKKwkJLyogTWFwIHNnbGlzdCBmcm9tIHNjc2kgbGF5ZXIgdG8gY21kIHBhY2tldCAqLworCQlpZiAodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnVzZV9zZyA9PSAwKSB7CisJCQlpZiAodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlcXVlc3RfYnVmZmxlbiA8IFRXX01JTl9TR0xfTEVOR1RIKSB7CisJCQkJY29tbWFuZF9wYWNrZXQtPnNnX2xpc3RbMF0uYWRkcmVzcyA9IHR3X2Rldi0+Z2VuZXJpY19idWZmZXJfcGh5c1tyZXF1ZXN0X2lkXTsKKwkJCQljb21tYW5kX3BhY2tldC0+c2dfbGlzdFswXS5sZW5ndGggPSBUV19NSU5fU0dMX0xFTkdUSDsKKwkJCX0gZWxzZSB7CisJCQkJYnVmZmFkZHIgPSB0d2FfbWFwX3Njc2lfc2luZ2xlX2RhdGEodHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJCQlpZiAoYnVmZmFkZHIgPT0gMCkKKwkJCQkJZ290byBvdXQ7CisKKwkJCQljb21tYW5kX3BhY2tldC0+c2dfbGlzdFswXS5hZGRyZXNzID0gYnVmZmFkZHI7CisJCQkJY29tbWFuZF9wYWNrZXQtPnNnX2xpc3RbMF0ubGVuZ3RoID0gdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlcXVlc3RfYnVmZmxlbjsKKwkJCX0KKwkJCWNvbW1hbmRfcGFja2V0LT5zZ2xfZW50cmllc19fbHVuaCA9IFRXX1JFUV9MVU5fSU4oKHNyYi0+ZGV2aWNlLT5sdW4gPj4gNCksIDEpOworCisJCQlpZiAoY29tbWFuZF9wYWNrZXQtPnNnX2xpc3RbMF0uYWRkcmVzcyAmIFRXX0FMSUdOTUVOVF85MDAwX1NHTCkgeworCQkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyZCwgIkZvdW5kIHVuYWxpZ25lZCBhZGRyZXNzIGR1cmluZyBleGVjdXRlIHNjc2kiKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCisJCWlmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+dXNlX3NnID4gMCkgeworCQkJaWYgKCh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+dXNlX3NnID09IDEpICYmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmbGVuIDwgVFdfTUlOX1NHTF9MRU5HVEgpKSB7CisJCQkJY29tbWFuZF9wYWNrZXQtPnNnX2xpc3RbMF0uYWRkcmVzcyA9IHR3X2Rldi0+Z2VuZXJpY19idWZmZXJfcGh5c1tyZXF1ZXN0X2lkXTsKKwkJCQljb21tYW5kX3BhY2tldC0+c2dfbGlzdFswXS5sZW5ndGggPSBUV19NSU5fU0dMX0xFTkdUSDsKKwkJCX0gZWxzZSB7CisJCQkJc2dfY291bnQgPSB0d2FfbWFwX3Njc2lfc2dfZGF0YSh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJCWlmIChzZ19jb3VudCA9PSAwKQorCQkJCQlnb3RvIG91dDsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBzZ19jb3VudDsgaSsrKSB7CisJCQkJCWNvbW1hbmRfcGFja2V0LT5zZ19saXN0W2ldLmFkZHJlc3MgPSBzZ19kbWFfYWRkcmVzcygmc2dsaXN0W2ldKTsKKwkJCQkJY29tbWFuZF9wYWNrZXQtPnNnX2xpc3RbaV0ubGVuZ3RoID0gc2dfZG1hX2xlbigmc2dsaXN0W2ldKTsKKwkJCQkJaWYgKGNvbW1hbmRfcGFja2V0LT5zZ19saXN0W2ldLmFkZHJlc3MgJiBUV19BTElHTk1FTlRfOTAwMF9TR0wpIHsKKwkJCQkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyZSwgIkZvdW5kIHVuYWxpZ25lZCBzZ2wgYWRkcmVzcyBkdXJpbmcgZXhlY3V0ZSBzY3NpIik7CisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWNvbW1hbmRfcGFja2V0LT5zZ2xfZW50cmllc19fbHVuaCA9IFRXX1JFUV9MVU5fSU4oKHNyYi0+ZGV2aWNlLT5sdW4gPj4gNCksIHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT51c2Vfc2cpOworCQl9CisJfSBlbHNlIHsKKwkJLyogSW50ZXJuYWwgY2RiIHBvc3QgKi8KKwkJZm9yIChpID0gMDsgaSA8IHVzZV9zZzsgaSsrKSB7CisJCQljb21tYW5kX3BhY2tldC0+c2dfbGlzdFtpXS5hZGRyZXNzID0gc2dsaXN0YXJnW2ldLmFkZHJlc3M7CisJCQljb21tYW5kX3BhY2tldC0+c2dfbGlzdFtpXS5sZW5ndGggPSBzZ2xpc3RhcmdbaV0ubGVuZ3RoOworCQkJaWYgKGNvbW1hbmRfcGFja2V0LT5zZ19saXN0W2ldLmFkZHJlc3MgJiBUV19BTElHTk1FTlRfOTAwMF9TR0wpIHsKKwkJCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MmYsICJGb3VuZCB1bmFsaWduZWQgc2dsIGFkZHJlc3MgZHVyaW5nIGludGVybmFsIHBvc3QiKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQljb21tYW5kX3BhY2tldC0+c2dsX2VudHJpZXNfX2x1bmggPSBUV19SRVFfTFVOX0lOKDAsIHVzZV9zZyk7CisJfQorCisJaWYgKHNyYikgeworCQlpZiAoc3JiLT5jbW5kWzBdID09IFJFQURfNiB8fCBzcmItPmNtbmRbMF0gPT0gV1JJVEVfNikKKwkJCW51bV9zZWN0b3JzID0gKHUzMilzcmItPmNtbmRbNF07CisKKwkJaWYgKHNyYi0+Y21uZFswXSA9PSBSRUFEXzEwIHx8IHNyYi0+Y21uZFswXSA9PSBXUklURV8xMCkKKwkJCW51bV9zZWN0b3JzID0gKHUzMilzcmItPmNtbmRbOF0gfCAoKHUzMilzcmItPmNtbmRbN10gPDwgOCk7CisJfQorCisJLyogVXBkYXRlIHNlY3RvciBzdGF0aXN0aWMgKi8KKwl0d19kZXYtPnNlY3Rvcl9jb3VudCA9IG51bV9zZWN0b3JzOworCWlmICh0d19kZXYtPnNlY3Rvcl9jb3VudCA+IHR3X2Rldi0+bWF4X3NlY3Rvcl9jb3VudCkKKwkJdHdfZGV2LT5tYXhfc2VjdG9yX2NvdW50ID0gdHdfZGV2LT5zZWN0b3JfY291bnQ7CisKKwkvKiBVcGRhdGUgU0cgc3RhdGlzdGljcyAqLworCWlmIChzcmIpIHsKKwkJdHdfZGV2LT5zZ2xfZW50cmllcyA9IHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT51c2Vfc2c7CisJCWlmICh0d19kZXYtPnNnbF9lbnRyaWVzID4gdHdfZGV2LT5tYXhfc2dsX2VudHJpZXMpCisJCQl0d19kZXYtPm1heF9zZ2xfZW50cmllcyA9IHR3X2Rldi0+c2dsX2VudHJpZXM7CisJfQorCisJLyogTm93IHBvc3QgdGhlIGNvbW1hbmQgdG8gdGhlIGJvYXJkICovCisJaWYgKHNyYikgeworCQlyZXR2YWwgPSB0d2FfcG9zdF9jb21tYW5kX3BhY2tldCh0d19kZXYsIHJlcXVlc3RfaWQsIDApOworCX0gZWxzZSB7CisJCXR3YV9wb3N0X2NvbW1hbmRfcGFja2V0KHR3X2RldiwgcmVxdWVzdF9pZCwgMSk7CisJCXJldHZhbCA9IDA7CisJfQorb3V0OgorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2Ffc2NzaW9wX2V4ZWN1dGVfc2NzaSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gY29tcGxldGVzIGFuIGV4ZWN1dGUgc2NzaSBvcGVyYXRpb24gKi8KK3N0YXRpYyB2b2lkIHR3YV9zY3Npb3BfZXhlY3V0ZV9zY3NpX2NvbXBsZXRlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJLyogQ29weSB0aGUgcmVzcG9uc2UgaWYgdG9vIHNtYWxsICovCisJaWYgKCh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmZXIpICYmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmbGVuIDwgVFdfTUlOX1NHTF9MRU5HVEgpKSB7CisJCW1lbWNweSh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmZXIsCisJCSAgICAgICB0d19kZXYtPmdlbmVyaWNfYnVmZmVyX3ZpcnRbcmVxdWVzdF9pZF0sCisJCSAgICAgICB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmbGVuKTsKKwl9Cit9IC8qIEVuZCB0d2Ffc2NzaW9wX2V4ZWN1dGVfc2NzaV9jb21wbGV0ZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gdGVsbHMgdGhlIGNvbnRyb2xsZXIgdG8gc2h1dCBkb3duICovCitzdGF0aWMgdm9pZCBfX3R3YV9zaHV0ZG93bihUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYpCit7CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJVFdfRElTQUJMRV9JTlRFUlJVUFRTKHR3X2Rldik7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIzdy05eHh4OiBTaHV0dGluZyBkb3duIGhvc3QgJWQuXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8pOworCisJLyogVGVsbCB0aGUgY2FyZCB3ZSBhcmUgc2h1dHRpbmcgZG93biAqLworCWlmICh0d2FfaW5pdGNvbm5lY3Rpb24odHdfZGV2LCAxLCAwLCAwLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkgeworCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MzEsICJDb25uZWN0aW9uIHNodXRkb3duIGZhaWxlZCIpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LTl4eHg6IFNodXRkb3duIGNvbXBsZXRlLlxuIik7CisJfQorCisJLyogQ2xlYXIgYWxsIGludGVycnVwdHMganVzdCBiZWZvcmUgZXhpdCAqLworCVRXX0NMRUFSX0FMTF9JTlRFUlJVUFRTKHR3X2Rldik7Cit9IC8qIEVuZCBfX3R3YV9zaHV0ZG93bigpICovCisKKy8qIFdyYXBwZXIgZm9yIF9fdHdhX3NodXRkb3duICovCitzdGF0aWMgdm9pZCB0d2Ffc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwY2lfZ2V0X2RydmRhdGEodG9fcGNpX2RldihkZXYpKTsKKwlUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYgPSAoVFdfRGV2aWNlX0V4dGVuc2lvbiAqKWhvc3QtPmhvc3RkYXRhOworCisJX190d2Ffc2h1dGRvd24odHdfZGV2KTsKK30gLyogRW5kIHR3YV9zaHV0ZG93bigpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBsb29rIHVwIGEgc3RyaW5nICovCitzdGF0aWMgY2hhciAqdHdhX3N0cmluZ19sb29rdXAodHdhX21lc3NhZ2VfdHlwZSAqdGFibGUsIHVuc2lnbmVkIGludCBjb2RlKQoreworCWludCBpbmRleDsKKworCWZvciAoaW5kZXggPSAwOyAoKGNvZGUgIT0gdGFibGVbaW5kZXhdLmNvZGUpICYmCisJCSAgICAgICh0YWJsZVtpbmRleF0udGV4dCAhPSAoY2hhciAqKTApKTsgaW5kZXgrKyk7CisJcmV0dXJuKHRhYmxlW2luZGV4XS50ZXh0KTsKK30gLyogRW5kIHR3YV9zdHJpbmdfbG9va3VwKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHBlcmZvcm0gYSBwY2ktZG1hIHVubWFwICovCitzdGF0aWMgdm9pZCB0d2FfdW5tYXBfc2NzaV9kYXRhKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF07CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0d19kZXYtPnR3X3BjaV9kZXY7CisKKwlzd2l0Y2goY21kLT5TQ3AucGhhc2UpIHsKKwljYXNlIFRXX1BIQVNFX1NJTkdMRToKKwkJcGNpX3VubWFwX3NpbmdsZShwZGV2LCBjbWQtPlNDcC5oYXZlX2RhdGFfaW4sIGNtZC0+cmVxdWVzdF9idWZmbGVuLCBETUFfQklESVJFQ1RJT05BTCk7CisJCWJyZWFrOworCWNhc2UgVFdfUEhBU0VfU0dMSVNUOgorCQlwY2lfdW5tYXBfc2cocGRldiwgY21kLT5yZXF1ZXN0X2J1ZmZlciwgY21kLT51c2Vfc2csIERNQV9CSURJUkVDVElPTkFMKTsKKwkJYnJlYWs7CisJfQorfSAvKiBFbmQgdHdhX3VubWFwX3Njc2lfZGF0YSgpICovCisKKy8qIHNjc2lfaG9zdF90ZW1wbGF0ZSBpbml0aWFsaXplciAqLworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSAiM3dhcmUgOTAwMCBTdG9yYWdlIENvbnRyb2xsZXIiLAorCS5xdWV1ZWNvbW1hbmQJCT0gdHdhX3Njc2lfcXVldWUsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IHR3YV9zY3NpX2VoX3Jlc2V0LAorCS5iaW9zX3BhcmFtCQk9IHR3YV9zY3NpX2Jpb3NwYXJhbSwKKwkuY2hhbmdlX3F1ZXVlX2RlcHRoCT0gdHdhX2NoYW5nZV9xdWV1ZV9kZXB0aCwKKwkuY2FuX3F1ZXVlCQk9IFRXX1FfTEVOR1RILTIsCisJLnRoaXNfaWQJCT0gLTEsCisJLnNnX3RhYmxlc2l6ZQkJPSBUV19BUEFDSEVfTUFYX1NHTF9MRU5HVEgsCisJLm1heF9zZWN0b3JzCQk9IFRXX01BWF9TRUNUT1JTLAorCS5jbWRfcGVyX2x1bgkJPSBUV19NQVhfQ01EU19QRVJfTFVOLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKKwkuc2hvc3RfYXR0cnMJCT0gdHdhX2hvc3RfYXR0cnMsCisJLmVtdWxhdGVkCQk9IDEKK307CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBwcm9iZSBhbmQgaW5pdGlhbGl6ZSBhIGNhcmQgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHR3YV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gTlVMTDsKKwlUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXY7CisJdTMyIG1lbV9hZGRyOworCWludCByZXR2YWwgPSAtRU5PREVWOworCisJcmV0dmFsID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldHZhbCkgeworCQlUV19QUklOVEsoaG9zdCwgVFdfRFJJVkVSLCAweDM0LCAiRmFpbGVkIHRvIGVuYWJsZSBwY2kgZGV2aWNlIik7CisJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcmV0dmFsID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBzaXplb2YoZG1hX2FkZHJfdCkgPiA0ID8gRE1BXzY0QklUX01BU0sgOiBETUFfMzJCSVRfTUFTSyk7CisJaWYgKHJldHZhbCkgeworCQlUV19QUklOVEsoaG9zdCwgVFdfRFJJVkVSLCAweDIzLCAiRmFpbGVkIHRvIHNldCBkbWEgbWFzayIpOworCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKKwl9CisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZkcml2ZXJfdGVtcGxhdGUsIHNpemVvZihUV19EZXZpY2VfRXh0ZW5zaW9uKSk7CisJaWYgKCFob3N0KSB7CisJCVRXX1BSSU5USyhob3N0LCBUV19EUklWRVIsIDB4MjQsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2UgZXh0ZW5zaW9uIik7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOworCX0KKwl0d19kZXYgPSAoVFdfRGV2aWNlX0V4dGVuc2lvbiAqKWhvc3QtPmhvc3RkYXRhOworCisJbWVtc2V0KHR3X2RldiwgMCwgc2l6ZW9mKFRXX0RldmljZV9FeHRlbnNpb24pKTsKKworCS8qIFNhdmUgdmFsdWVzIHRvIGRldmljZSBleHRlbnNpb24gKi8KKwl0d19kZXYtPmhvc3QgPSBob3N0OworCXR3X2Rldi0+dHdfcGNpX2RldiA9IHBkZXY7CisKKwlpZiAodHdhX2luaXRpYWxpemVfZGV2aWNlX2V4dGVuc2lvbih0d19kZXYpKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyNSwgIkZhaWxlZCB0byBpbml0aWFsaXplIGRldmljZSBleHRlbnNpb24iKTsKKwkJZ290byBvdXRfZnJlZV9kZXZpY2VfZXh0ZW5zaW9uOworCX0KKworCS8qIFJlcXVlc3QgSU8gcmVnaW9ucyAqLworCXJldHZhbCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgIjN3LTl4eHgiKTsKKwlpZiAocmV0dmFsKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyNiwgIkZhaWxlZCB0byBnZXQgbWVtIHJlZ2lvbiIpOworCQlnb3RvIG91dF9mcmVlX2RldmljZV9leHRlbnNpb247CisJfQorCisJbWVtX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisKKwkvKiBTYXZlIGJhc2UgYWRkcmVzcyAqLworCXR3X2Rldi0+YmFzZV9hZGRyID0gaW9yZW1hcChtZW1fYWRkciwgUEFHRV9TSVpFKTsKKwlpZiAoIXR3X2Rldi0+YmFzZV9hZGRyKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgzNSwgIkZhaWxlZCB0byBpb3JlbWFwIik7CisJCWdvdG8gb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjsKKwl9CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgb24gdGhlIGNhcmQgKi8KKwlUV19ESVNBQkxFX0lOVEVSUlVQVFModHdfZGV2KTsKKworCS8qIEluaXRpYWxpemUgdGhlIGNhcmQgKi8KKwlpZiAodHdhX3Jlc2V0X3NlcXVlbmNlKHR3X2RldiwgMCkpCisJCWdvdG8gb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjsKKworCS8qIFNldCBob3N0IHNwZWNpZmljIHBhcmFtZXRlcnMgKi8KKwlob3N0LT5tYXhfaWQgPSBUV19NQVhfVU5JVFM7CisJaG9zdC0+bWF4X2NtZF9sZW4gPSBUV19NQVhfQ0RCX0xFTjsKKworCS8qIENoYW5uZWxzIGFyZW4ndCBzdXBwb3J0ZWQgYnkgYWRhcHRlciAqLworCWhvc3QtPm1heF9sdW4gPSBUV19NQVhfTFVOUyh0d19kZXYtPndvcmtpbmdfc3JsKTsKKwlob3N0LT5tYXhfY2hhbm5lbCA9IDA7CisKKwkvKiBSZWdpc3RlciB0aGUgY2FyZCB3aXRoIHRoZSBrZXJuZWwgU0NTSSBsYXllciAqLworCXJldHZhbCA9IHNjc2lfYWRkX2hvc3QoaG9zdCwgJnBkZXYtPmRldik7CisJaWYgKHJldHZhbCkgeworCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MjcsICJzY3NpIGFkZCBob3N0IGZhaWxlZCIpOworCQlnb3RvIG91dF9yZWxlYXNlX21lbV9yZWdpb247CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiM3ctOXh4eDogc2NzaSVkOiBGb3VuZCBhIDN3YXJlIDkwMDAgU3RvcmFnZSBDb250cm9sbGVyIGF0IDB4JXgsIElSUTogJWQuXG4iLAorCSAgICAgICBob3N0LT5ob3N0X25vLCBtZW1fYWRkciwgcGRldi0+aXJxKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIzdy05eHh4OiBzY3NpJWQ6IEZpcm13YXJlICVzLCBCSU9TICVzLCBQb3J0czogJWQuXG4iLAorCSAgICAgICBob3N0LT5ob3N0X25vLAorCSAgICAgICAoY2hhciAqKXR3YV9nZXRfcGFyYW0odHdfZGV2LCAwLCBUV19WRVJTSU9OX1RBQkxFLAorCQkJCSAgICAgVFdfUEFSQU1fRldWRVIsIFRXX1BBUkFNX0ZXVkVSX0xFTkdUSCksCisJICAgICAgIChjaGFyICopdHdhX2dldF9wYXJhbSh0d19kZXYsIDEsIFRXX1ZFUlNJT05fVEFCTEUsCisJCQkJICAgICBUV19QQVJBTV9CSU9TVkVSLCBUV19QQVJBTV9CSU9TVkVSX0xFTkdUSCksCisJICAgICAgICooaW50ICopdHdhX2dldF9wYXJhbSh0d19kZXYsIDIsIFRXX0lORk9STUFUSU9OX1RBQkxFLAorCQkJCSAgICAgVFdfUEFSQU1fUE9SVENPVU5ULCBUV19QQVJBTV9QT1JUQ09VTlRfTEVOR1RIKSk7CisKKwkvKiBOb3cgc2V0dXAgdGhlIGludGVycnVwdCBoYW5kbGVyICovCisJcmV0dmFsID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCB0d2FfaW50ZXJydXB0LCBTQV9TSElSUSwgIjN3LTl4eHgiLCB0d19kZXYpOworCWlmIChyZXR2YWwpIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDMwLCAiRXJyb3IgcmVxdWVzdGluZyBJUlEiKTsKKwkJZ290byBvdXRfcmVtb3ZlX2hvc3Q7CisJfQorCisJdHdhX2RldmljZV9leHRlbnNpb25fbGlzdFt0d2FfZGV2aWNlX2V4dGVuc2lvbl9jb3VudF0gPSB0d19kZXY7CisJdHdhX2RldmljZV9leHRlbnNpb25fY291bnQrKzsKKworCS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBjYXJkICovCisJVFdfRU5BQkxFX0FORF9DTEVBUl9JTlRFUlJVUFRTKHR3X2Rldik7CisKKwkvKiBGaW5hbGx5LCBzY2FuIHRoZSBob3N0ICovCisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisKKwlpZiAodHdhX21ham9yID09IC0xKSB7CisJCWlmICgodHdhX21ham9yID0gcmVnaXN0ZXJfY2hyZGV2ICgwLCAidHdhIiwgJnR3YV9mb3BzKSkgPCAwKQorCQkJVFdfUFJJTlRLKGhvc3QsIFRXX0RSSVZFUiwgMHgyOSwgIkZhaWxlZCB0byByZWdpc3RlciBjaGFyYWN0ZXIgZGV2aWNlIik7CisJfQorCXJldHVybiAwOworCitvdXRfcmVtb3ZlX2hvc3Q6CisJc2NzaV9yZW1vdmVfaG9zdChob3N0KTsKK291dF9yZWxlYXNlX21lbV9yZWdpb246CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK291dF9mcmVlX2RldmljZV9leHRlbnNpb246CisJdHdhX2ZyZWVfZGV2aWNlX2V4dGVuc2lvbih0d19kZXYpOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7CitvdXRfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9wcm9iZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlbW92ZSBhIGRldmljZSAqLworc3RhdGljIHZvaWQgdHdhX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopaG9zdC0+aG9zdGRhdGE7CisKKwlzY3NpX3JlbW92ZV9ob3N0KHR3X2Rldi0+aG9zdCk7CisKKwkvKiBVbnJlZ2lzdGVyIGNoYXJhY3RlciBkZXZpY2UgKi8KKwlpZiAodHdhX21ham9yID49IDApIHsKKwkJdW5yZWdpc3Rlcl9jaHJkZXYodHdhX21ham9yLCAidHdhIik7CisJCXR3YV9tYWpvciA9IC0xOworCX0KKworCS8qIEZyZWUgdXAgdGhlIElSUSAqLworCWZyZWVfaXJxKHR3X2Rldi0+dHdfcGNpX2Rldi0+aXJxLCB0d19kZXYpOworCisJLyogU2h1dGRvd24gdGhlIGNhcmQgKi8KKwlfX3R3YV9zaHV0ZG93bih0d19kZXYpOworCisJLyogRnJlZSB1cCB0aGUgbWVtIHJlZ2lvbiAqLworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKKwkvKiBGcmVlIHVwIGRldmljZSBleHRlbnNpb24gcmVzb3VyY2VzICovCisJdHdhX2ZyZWVfZGV2aWNlX2V4dGVuc2lvbih0d19kZXYpOworCisJc2NzaV9ob3N0X3B1dCh0d19kZXYtPmhvc3QpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwl0d2FfZGV2aWNlX2V4dGVuc2lvbl9jb3VudC0tOworfSAvKiBFbmQgdHdhX3JlbW92ZSgpICovCisKKy8qIFBDSSBEZXZpY2VzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHR3YV9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfM1dBUkUsIFBDSV9ERVZJQ0VfSURfM1dBUkVfOTAwMCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB0d2FfcGNpX3RibCk7CisKKy8qIHBjaV9kcml2ZXIgaW5pdGlhbGl6ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB0d2FfZHJpdmVyID0geworCS5uYW1lCQk9ICIzdy05eHh4IiwKKwkuaWRfdGFibGUJPSB0d2FfcGNpX3RibCwKKwkucHJvYmUJCT0gdHdhX3Byb2JlLAorCS5yZW1vdmUJCT0gdHdhX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLnNodXRkb3duID0gdHdhX3NodXRkb3duCisJfQorfTsKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZHJpdmVyIGluaXRpYWxpemF0aW9uICovCitzdGF0aWMgaW50IF9faW5pdCB0d2FfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3YXJlIDkwMDAgU3RvcmFnZSBDb250cm9sbGVyIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IHYlcy5cbiIsIFRXX0RSSVZFUl9WRVJTSU9OKTsKKworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnR3YV9kcml2ZXIpOworfSAvKiBFbmQgdHdhX2luaXQoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBkcml2ZXIgZXhpdCAqLworc3RhdGljIHZvaWQgX19leGl0IHR3YV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ0d2FfZHJpdmVyKTsKK30gLyogRW5kIHR3YV9leGl0KCkgKi8KKworbW9kdWxlX2luaXQodHdhX2luaXQpOworbW9kdWxlX2V4aXQodHdhX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvM3ctOXh4eC5oIGIvZHJpdmVycy9zY3NpLzN3LTl4eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzhlY2JlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpLzN3LTl4eHguaApAQCAtMCwwICsxLDY4MiBAQAorLyoKKyAgIDN3LTl4eHguaCAtLSAzd2FyZSA5MDAwIFN0b3JhZ2UgQ29udHJvbGxlciBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKworICAgV3JpdHRlbiBCeTogQWRhbSBSYWRmb3JkIDxsaW51eHJhaWRAYW1jYy5jb20+CisKKyAgIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEFwcGxpZWQgTWljcm8gQ2lyY3VpdHMgQ29ycG9yYXRpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBOTyBXQVJSQU5UWQorICAgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisgICBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVAorICAgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyAgIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKyAgIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworICAgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLAorICAgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisKKyAgIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisgICBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorICAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORAorICAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgICBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKKyAgIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgIEJ1Z3MvQ29tbWVudHMvU3VnZ2VzdGlvbnMgc2hvdWxkIGJlIG1haWxlZCB0bzoKKyAgIGxpbnV4cmFpZEBhbWNjLmNvbQorCisgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZ290bzoKKyAgIGh0dHA6Ly93d3cuYW1jYy5jb20KKyovCisKKyNpZm5kZWYgXzNXXzlYWFhfSAorI2RlZmluZSBfM1dfOVhYWF9ICisKKy8qIEFFTiBzdHJpbmcgdHlwZSAqLwordHlwZWRlZiBzdHJ1Y3QgVEFHX3R3YV9tZXNzYWdlX3R5cGUgeworICB1bnNpZ25lZCBpbnQgICBjb2RlOworICBjaGFyKiAgICAgICAgICB0ZXh0OworfSB0d2FfbWVzc2FnZV90eXBlOworCisvKiBBRU4gc3RyaW5ncyAqLworc3RhdGljIHR3YV9tZXNzYWdlX3R5cGUgdHdhX2Flbl90YWJsZVtdID0geworCXsweDAwMDAsICJBRU4gcXVldWUgZW1wdHkifSwKKwl7MHgwMDAxLCAiQ29udHJvbGxlciByZXNldCBvY2N1cnJlZCJ9LAorCXsweDAwMDIsICJEZWdyYWRlZCB1bml0IGRldGVjdGVkIn0sCisJezB4MDAwMywgIkNvbnRyb2xsZXIgZXJyb3Igb2NjdXJlZCJ9LAorCXsweDAwMDQsICJCYWNrZ3JvdW5kIHJlYnVpbGQgZmFpbGVkIn0sCisJezB4MDAwNSwgIkJhY2tncm91bmQgcmVidWlsZCBkb25lIn0sCisJezB4MDAwNiwgIkluY29tcGxldGUgdW5pdCBkZXRlY3RlZCJ9LAorCXsweDAwMDcsICJCYWNrZ3JvdW5kIGluaXRpYWxpemUgZG9uZSJ9LAorCXsweDAwMDgsICJVbmNsZWFuIHNodXRkb3duIGRldGVjdGVkIn0sCisJezB4MDAwOSwgIkRyaXZlIHRpbWVvdXQgZGV0ZWN0ZWQifSwKKwl7MHgwMDBBLCAiRHJpdmUgZXJyb3IgZGV0ZWN0ZWQifSwKKwl7MHgwMDBCLCAiUmVidWlsZCBzdGFydGVkIn0sCisJezB4MDAwQywgIkJhY2tncm91bmQgaW5pdGlhbGl6ZSBzdGFydGVkIn0sCisJezB4MDAwRCwgIkVudGlyZSBsb2dpY2FsIHVuaXQgd2FzIGRlbGV0ZWQifSwKKwl7MHgwMDBFLCAiQmFja2dyb3VuZCBpbml0aWFsaXplIGZhaWxlZCJ9LAorCXsweDAwMEYsICJTTUFSVCBhdHRyaWJ1dGUgZXhjZWVkZWQgdGhyZXNob2xkIn0sCisJezB4MDAxMCwgIlBvd2VyIHN1cHBseSByZXBvcnRlZCBBQyB1bmRlciByYW5nZSJ9LAorCXsweDAwMTEsICJQb3dlciBzdXBwbHkgcmVwb3J0ZWQgREMgb3V0IG9mIHJhbmdlIn0sCisJezB4MDAxMiwgIlBvd2VyIHN1cHBseSByZXBvcnRlZCBhIG1hbGZ1bmN0aW9uIn0sCisJezB4MDAxMywgIlBvd2VyIHN1cHBseSBwcmVkaWN0ZWQgbWFsZnVuY3Rpb24ifSwKKwl7MHgwMDE0LCAiQmF0dGVyeSBjaGFyZ2UgaXMgYmVsb3cgdGhyZXNob2xkIn0sCisJezB4MDAxNSwgIkZhbiBzcGVlZCBpcyBiZWxvdyB0aHJlc2hvbGQifSwKKwl7MHgwMDE2LCAiVGVtcGVyYXR1cmUgc2Vuc29yIGlzIGFib3ZlIHRocmVzaG9sZCJ9LAorCXsweDAwMTcsICJQb3dlciBzdXBwbHkgd2FzIHJlbW92ZWQifSwKKwl7MHgwMDE4LCAiUG93ZXIgc3VwcGx5IHdhcyBpbnNlcnRlZCJ9LAorCXsweDAwMTksICJEcml2ZSB3YXMgcmVtb3ZlZCBmcm9tIGEgYmF5In0sCisJezB4MDAxQSwgIkRyaXZlIHdhcyBpbnNlcnRlZCBpbnRvIGEgYmF5In0sCisJezB4MDAxQiwgIkRyaXZlIGJheSBjb3ZlciBkb29yIHdhcyBvcGVuZWQifSwKKwl7MHgwMDFDLCAiRHJpdmUgYmF5IGNvdmVyIGRvb3Igd2FzIGNsb3NlZCJ9LAorCXsweDAwMUQsICJQcm9kdWN0IGNhc2Ugd2FzIG9wZW5lZCJ9LAorCXsweDAwMjAsICJQcmVwYXJlIGZvciBzaHV0ZG93biAocG93ZXItb2ZmKSJ9LAorCXsweDAwMjEsICJEb3duZ3JhZGUgVURNQSBtb2RlIHRvIGxvd2VyIHNwZWVkIn0sCisJezB4MDAyMiwgIlVwZ3JhZGUgVURNQSBtb2RlIHRvIGhpZ2hlciBzcGVlZCJ9LAorCXsweDAwMjMsICJTZWN0b3IgcmVwYWlyIGNvbXBsZXRlZCJ9LAorCXsweDAwMjQsICJTYnVmIG1lbW9yeSB0ZXN0IGZhaWxlZCJ9LAorCXsweDAwMjUsICJFcnJvciBmbHVzaGluZyBjYWNoZWQgd3JpdGUgZGF0YSB0byBhcnJheSJ9LAorCXsweDAwMjYsICJEcml2ZSByZXBvcnRlZCBkYXRhIEVDQyBlcnJvciJ9LAorCXsweDAwMjcsICJEQ0IgaGFzIGNoZWNrc3VtIGVycm9yIn0sCisJezB4MDAyOCwgIkRDQiB2ZXJzaW9uIGlzIHVuc3VwcG9ydGVkIn0sCisJezB4MDAyOSwgIkJhY2tncm91bmQgdmVyaWZ5IHN0YXJ0ZWQifSwKKwl7MHgwMDJBLCAiQmFja2dyb3VuZCB2ZXJpZnkgZmFpbGVkIn0sCisJezB4MDAyQiwgIkJhY2tncm91bmQgdmVyaWZ5IGRvbmUifSwKKwl7MHgwMDJDLCAiQmFkIHNlY3RvciBvdmVyd3JpdHRlbiBkdXJpbmcgcmVidWlsZCJ9LAorCXsweDAwMkQsICJCYWNrZ3JvdW5kIHJlYnVpbGQgZXJyb3Igb24gc291cmNlIGRyaXZlIn0sCisJezB4MDAyRSwgIlJlcGxhY2UgZmFpbGVkIGJlY2F1c2UgcmVwbGFjZW1lbnQgZHJpdmUgdG9vIHNtYWxsIn0sCisJezB4MDAyRiwgIlZlcmlmeSBmYWlsZWQgYmVjYXVzZSBhcnJheSB3YXMgbmV2ZXIgaW5pdGlhbGl6ZWQifSwKKwl7MHgwMDMwLCAiVW5zdXBwb3J0ZWQgQVRBIGRyaXZlIn0sCisJezB4MDAzMSwgIlN5bmNocm9uaXplIGhvc3QvY29udHJvbGxlciB0aW1lIn0sCisJezB4MDAzMiwgIlNwYXJlIGNhcGFjaXR5IGlzIGluYWRlcXVhdGUgZm9yIHNvbWUgdW5pdHMifSwKKwl7MHgwMDMzLCAiQmFja2dyb3VuZCBtaWdyYXRpb24gc3RhcnRlZCJ9LAorCXsweDAwMzQsICJCYWNrZ3JvdW5kIG1pZ3JhdGlvbiBmYWlsZWQifSwKKwl7MHgwMDM1LCAiQmFja2dyb3VuZCBtaWdyYXRpb24gZG9uZSJ9LAorCXsweDAwMzYsICJWZXJpZnkgZGV0ZWN0ZWQgYW5kIGZpeGVkIGRhdGEvcGFyaXR5IG1pc21hdGNoIn0sCisJezB4MDAzNywgIlNPLURJTU0gaW5jb21wYXRpYmxlIn0sCisJezB4MDAzOCwgIlNPLURJTU0gbm90IGRldGVjdGVkIn0sCisJezB4MDAzOSwgIkNvcnJlY3RlZCBTYnVmIEVDQyBlcnJvciJ9LAorCXsweDAwM0EsICJEcml2ZSBwb3dlciBvbiByZXNldCBkZXRlY3RlZCJ9LAorCXsweDAwM0IsICJCYWNrZ3JvdW5kIHJlYnVpbGQgcGF1c2VkIn0sCisJezB4MDAzQywgIkJhY2tncm91bmQgaW5pdGlhbGl6ZSBwYXVzZWQifSwKKwl7MHgwMDNELCAiQmFja2dyb3VuZCB2ZXJpZnkgcGF1c2VkIn0sCisJezB4MDAzRSwgIkJhY2tncm91bmQgbWlncmF0aW9uIHBhdXNlZCJ9LAorCXsweDAwM0YsICJDb3JydXB0IGZsYXNoIGZpbGUgc3lzdGVtIGRldGVjdGVkIn0sCisJezB4MDA0MCwgIkZsYXNoIGZpbGUgc3lzdGVtIHJlcGFpcmVkIn0sCisJezB4MDA0MSwgIlVuaXQgbnVtYmVyIGFzc2lnbm1lbnRzIHdlcmUgbG9zdCJ9LAorCXsweDAwNDIsICJFcnJvciBkdXJpbmcgcmVhZCBvZiBwcmltYXJ5IERDQiJ9LAorCXsweDAwNDMsICJMYXRlbnQgZXJyb3IgZm91bmQgaW4gYmFja3VwIERDQiJ9LAorCXsweDAwRkMsICJSZWNvdmVyZWQvZmluaXNoZWQgYXJyYXkgbWVtYmVyc2hpcCB1cGRhdGUifSwKKwl7MHgwMEZELCAiSGFuZGxlciBsb2NrdXAifSwKKwl7MHgwMEZFLCAiUmV0cnlpbmcgUENJIHRyYW5zZmVyIn0sCisJezB4MDBGRiwgIkFFTiBxdWV1ZSBpcyBmdWxsIn0sCisJezB4RkZGRkZGRkYsIChjaGFyKikgMH0KK307CisKKy8qIEFFTiBzZXZlcml0eSB0YWJsZSAqLworc3RhdGljIGNoYXIgKnR3YV9hZW5fc2V2ZXJpdHlfdGFibGVbXSA9Cit7CisJIk5vbmUiLCAiRVJST1IiLCAiV0FSTklORyIsICJJTkZPIiwgIkRFQlVHIiwgKGNoYXIqKSAwCit9OworCisvKiBFcnJvciBzdHJpbmdzICovCitzdGF0aWMgdHdhX21lc3NhZ2VfdHlwZSB0d2FfZXJyb3JfdGFibGVbXSA9IHsKKwl7MHgwMTAwLCAiU0dMIGVudHJ5IGNvbnRhaW5zIHplcm8gZGF0YSJ9LAorCXsweDAxMDEsICJJbnZhbGlkIGNvbW1hbmQgb3Bjb2RlIn0sCisJezB4MDEwMiwgIlNHTCBlbnRyeSBoYXMgdW5hbGlnbmVkIGFkZHJlc3MifSwKKwl7MHgwMTAzLCAiU0dMIHNpemUgZG9lcyBub3QgbWF0Y2ggY29tbWFuZCJ9LAorCXsweDAxMDQsICJTR0wgZW50cnkgaGFzIGlsbGVnYWwgbGVuZ3RoIn0sCisJezB4MDEwNSwgIkNvbW1hbmQgcGFja2V0IGlzIG5vdCBhbGlnbmVkIn0sCisJezB4MDEwNiwgIkludmFsaWQgcmVxdWVzdCBJRCJ9LAorCXsweDAxMDcsICJEdXBsaWNhdGUgcmVxdWVzdCBJRCJ9LAorCXsweDAxMDgsICJJRCBub3QgbG9ja2VkIn0sCisJezB4MDEwOSwgIkxCQSBvdXQgb2YgcmFuZ2UifSwKKwl7MHgwMTBBLCAiTG9naWNhbCB1bml0IG5vdCBzdXBwb3J0ZWQifSwKKwl7MHgwMTBCLCAiUGFyYW1ldGVyIHRhYmxlIGRvZXMgbm90IGV4aXN0In0sCisJezB4MDEwQywgIlBhcmFtZXRlciBpbmRleCBkb2VzIG5vdCBleGlzdCJ9LAorCXsweDAxMEQsICJJbnZhbGlkIGZpZWxkIGluIENEQiJ9LAorCXsweDAxMEUsICJTcGVjaWZpZWQgcG9ydCBoYXMgaW52YWxpZCBkcml2ZSJ9LAorCXsweDAxMEYsICJQYXJhbWV0ZXIgaXRlbSBzaXplIG1pc21hdGNoIn0sCisJezB4MDExMCwgIkZhaWxlZCBtZW1vcnkgYWxsb2NhdGlvbiJ9LAorCXsweDAxMTEsICJNZW1vcnkgcmVxdWVzdCB0b28gbGFyZ2UifSwKKwl7MHgwMTEyLCAiT3V0IG9mIG1lbW9yeSBzZWdtZW50cyJ9LAorCXsweDAxMTMsICJJbnZhbGlkIGFkZHJlc3MgdG8gZGVhbGxvY2F0ZSJ9LAorCXsweDAxMTQsICJPdXQgb2YgbWVtb3J5In0sCisJezB4MDExNSwgIk91dCBvZiBoZWFwIn0sCisJezB4MDEyMCwgIkRvdWJsZSBkZWdyYWRlIn0sCisJezB4MDEyMSwgIkRyaXZlIG5vdCBkZWdyYWRlZCJ9LAorCXsweDAxMjIsICJSZWNvbnN0cnVjdCBlcnJvciJ9LAorCXsweDAxMjMsICJSZXBsYWNlIG5vdCBhY2NlcHRlZCJ9LAorCXsweDAxMjQsICJSZXBsYWNlIGRyaXZlIGNhcGFjaXR5IHRvbyBzbWFsbCJ9LAorCXsweDAxMjUsICJTZWN0b3IgY291bnQgbm90IGFsbG93ZWQifSwKKwl7MHgwMTI2LCAiTm8gc3BhcmVzIGxlZnQifSwKKwl7MHgwMTI3LCAiUmVjb25zdHJ1Y3QgZXJyb3IifSwKKwl7MHgwMTI4LCAiVW5pdCBpcyBvZmZsaW5lIn0sCisJezB4MDEyOSwgIkNhbm5vdCB1cGRhdGUgc3RhdHVzIHRvIERDQiJ9LAorCXsweDAxMzAsICJJbnZhbGlkIHN0cmlwZSBoYW5kbGUifSwKKwl7MHgwMTMxLCAiSGFuZGxlIHRoYXQgd2FzIG5vdCBsb2NrZWQifSwKKwl7MHgwMTMyLCAiSGFuZGxlIHRoYXQgd2FzIG5vdCBlbXB0eSJ9LAorCXsweDAxMzMsICJIYW5kbGUgaGFzIGRpZmZlcmVudCBvd25lciJ9LAorCXsweDAxNDAsICJJUFIgaGFzIHBhcmVudCJ9LAorCXsweDAxNTAsICJJbGxlZ2FsIFBidWYgYWRkcmVzcyBhbGlnbm1lbnQifSwKKwl7MHgwMTUxLCAiSWxsZWdhbCBQYnVmIHRyYW5zZmVyIGxlbmd0aCJ9LAorCXsweDAxNTIsICJJbGxlZ2FsIFNidWYgYWRkcmVzcyBhbGlnbm1lbnQifSwKKwl7MHgwMTUzLCAiSWxsZWdhbCBTYnVmIHRyYW5zZmVyIGxlbmd0aCJ9LAorCXsweDAxNjAsICJDb21tYW5kIHBhY2tldCB0b28gbGFyZ2UifSwKKwl7MHgwMTYxLCAiU0dMIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGgifSwKKwl7MHgwMTYyLCAiU0dMIGhhcyB0b28gbWFueSBlbnRyaWVzIn0sCisJezB4MDE3MCwgIkluc3VmZmljaWVudCByZXNvdXJjZXMgZm9yIHJlYnVpbGRlciJ9LAorCXsweDAxNzEsICJWZXJpZnkgZXJyb3IgKGRhdGEgIT0gcGFyaXR5KSJ9LAorCXsweDAxODAsICJSZXF1ZXN0ZWQgc2VnbWVudCBub3QgaW4gZGlyZWN0b3J5IG9mIHRoaXMgRENCIn0sCisJezB4MDE4MSwgIkRDQiBzZWdtZW50IGhhcyB1bnN1cHBvcnRlZCB2ZXJzaW9uIn0sCisJezB4MDE4MiwgIkRDQiBzZWdtZW50IGhhcyBjaGVja3N1bSBlcnJvciJ9LAorCXsweDAxODMsICJEQ0Igc3VwcG9ydCAoc2V0dGluZ3MpIHNlZ21lbnQgaW52YWxpZCJ9LAorCXsweDAxODQsICJEQ0IgVURCICh1bml0IGRlc2NyaXB0b3IgYmxvY2spIHNlZ21lbnQgaW52YWxpZCJ9LAorCXsweDAxODUsICJEQ0IgR1VJRCAoZ2xvYmFsbHkgdW5pcXVlIGlkZW50aWZpZXIpIHNlZ21lbnQgaW52YWxpZCJ9LAorCXsweDAxQTAsICJDb3VsZCBub3QgY2xlYXIgU2J1ZiJ9LAorCXsweDAxQzAsICJGbGFzaCBpZGVudGlmeSBmYWlsZWQifSwKKwl7MHgwMUMxLCAiRmxhc2ggb3V0IG9mIGJvdW5kcyJ9LAorCXsweDAxQzIsICJGbGFzaCB2ZXJpZnkgZXJyb3IifSwKKwl7MHgwMUMzLCAiRmxhc2ggZmlsZSBvYmplY3Qgbm90IGZvdW5kIn0sCisJezB4MDFDNCwgIkZsYXNoIGZpbGUgYWxyZWFkeSBwcmVzZW50In0sCisJezB4MDFDNSwgIkZsYXNoIGZpbGUgc3lzdGVtIGZ1bGwifSwKKwl7MHgwMUM2LCAiRmxhc2ggZmlsZSBub3QgcHJlc2VudCJ9LAorCXsweDAxQzcsICJGbGFzaCBmaWxlIHNpemUgZXJyb3IifSwKKwl7MHgwMUM4LCAiQmFkIGZsYXNoIGZpbGUgY2hlY2tzdW0ifSwKKwl7MHgwMUNBLCAiQ29ycnVwdCBmbGFzaCBmaWxlIHN5c3RlbSBkZXRlY3RlZCJ9LAorCXsweDAxRDAsICJJbnZhbGlkIGZpZWxkIGluIHBhcmFtZXRlciBsaXN0In0sCisJezB4MDFEMSwgIlBhcmFtZXRlciBsaXN0IGxlbmd0aCBlcnJvciJ9LAorCXsweDAxRDIsICJQYXJhbWV0ZXIgaXRlbSBpcyBub3QgY2hhbmdlYWJsZSJ9LAorCXsweDAxRDMsICJQYXJhbWV0ZXIgaXRlbSBpcyBub3Qgc2F2ZWFibGUifSwKKwl7MHgwMjAwLCAiVURNQSBDUkMgZXJyb3IifSwKKwl7MHgwMjAxLCAiSW50ZXJuYWwgQ1JDIGVycm9yIn0sCisJezB4MDIwMiwgIkRhdGEgRUNDIGVycm9yIn0sCisJezB4MDIwMywgIkFEUCBsZXZlbCAxIGVycm9yIn0sCisJezB4MDIwNCwgIlBvcnQgdGltZW91dCJ9LAorCXsweDAyMDUsICJEcml2ZSBwb3dlciBvbiByZXNldCJ9LAorCXsweDAyMDYsICJBRFAgbGV2ZWwgMiBlcnJvciJ9LAorCXsweDAyMDcsICJTb2Z0IHJlc2V0IGZhaWxlZCJ9LAorCXsweDAyMDgsICJEcml2ZSBub3QgcmVhZHkifSwKKwl7MHgwMjA5LCAiVW5jbGFzc2lmaWVkIHBvcnQgZXJyb3IifSwKKwl7MHgwMjBBLCAiRHJpdmUgYWJvcnRlZCBjb21tYW5kIn0sCisJezB4MDIxMCwgIkludGVybmFsIENSQyBlcnJvciJ9LAorCXsweDAyMTEsICJQQ0kgYWJvcnQgZXJyb3IifSwKKwl7MHgwMjEyLCAiUENJIHBhcml0eSBlcnJvciJ9LAorCXsweDAyMTMsICJQb3J0IGhhbmRsZXIgZXJyb3IifSwKKwl7MHgwMjE0LCAiVG9rZW4gaW50ZXJydXB0IGNvdW50IGVycm9yIn0sCisJezB4MDIxNSwgIlRpbWVvdXQgd2FpdGluZyBmb3IgUENJIHRyYW5zZmVyIn0sCisJezB4MDIxNiwgIkNvcnJlY3RlZCBidWZmZXIgRUNDIn0sCisJezB4MDIxNywgIlVuY29ycmVjdGVkIGJ1ZmZlciBFQ0MifSwKKwl7MHgwMjMwLCAiVW5zdXBwb3J0ZWQgY29tbWFuZCBkdXJpbmcgZmxhc2ggcmVjb3ZlcnkifSwKKwl7MHgwMjMxLCAiTmV4dCBpbWFnZSBidWZmZXIgZXhwZWN0ZWQifSwKKwl7MHgwMjMyLCAiQmluYXJ5IGltYWdlIGFyY2hpdGVjdHVyZSBpbmNvbXBhdGlibGUifSwKKwl7MHgwMjMzLCAiQmluYXJ5IGltYWdlIGhhcyBubyBzaWduYXR1cmUifSwKKwl7MHgwMjM0LCAiQmluYXJ5IGltYWdlIGhhcyBiYWQgY2hlY2tzdW0ifSwKKwl7MHgwMjM1LCAiSW1hZ2UgZG93bmxvYWRlZCBvdmVyZmxvd2VkIGJ1ZmZlciJ9LAorCXsweDAyNDAsICJJMkMgZGV2aWNlIG5vdCBmb3VuZCJ9LAorCXsweDAyNDEsICJJMkMgdHJhbnNhY3Rpb24gYWJvcnRlZCJ9LAorCXsweDAyNDIsICJTTy1ESU1NIHBhcmFtZXRlcihzKSBpbmNvbXBhdGlibGUgdXNpbmcgZGVmYXVsdHMifSwKKwl7MHgwMjQzLCAiU08tRElNTSB1bnN1cHBvcnRlZCJ9LAorCXsweDAyNDgsICJTUEkgdHJhbnNmZXIgc3RhdHVzIGVycm9yIn0sCisJezB4MDI0OSwgIlNQSSB0cmFuc2ZlciB0aW1lb3V0IGVycm9yIn0sCisJezB4MDI1MCwgIkludmFsaWQgdW5pdCBkZXNjcmlwdG9yIHNpemUgaW4gQ3JlYXRlVW5pdCJ9LAorCXsweDAyNTEsICJVbml0IGRlc2NyaXB0b3Igc2l6ZSBleGNlZWRzIGRhdGEgYnVmZmVyIGluIENyZWF0ZVVuaXQifSwKKwl7MHgwMjUyLCAiSW52YWxpZCB2YWx1ZSBpbiBDcmVhdGVVbml0IGRlc2NyaXB0b3IifSwKKwl7MHgwMjUzLCAiSW5hZGVxdWF0ZSBkaXNrIHNwYWNlIHRvIHN1cHBvcnQgZGVzY3JpcHRvciBpbiBDcmVhdGVVbml0In0sCisJezB4MDI1NCwgIlVuYWJsZSB0byBjcmVhdGUgZGF0YSBjaGFubmVsIGZvciB0aGlzIHVuaXQgZGVzY3JpcHRvciJ9LAorCXsweDAyNTUsICJDcmVhdGVVbml0IGRlc2NyaXB0b3Igc3BlY2lmaWVzIGEgZHJpdmUgYWxyZWFkeSBpbiB1c2UifSwKKwl7MHgwMjU2LCAiVW5hYmxlIHRvIHdyaXRlIGNvbmZpZ3VyYXRpb24gdG8gYWxsIGRpc2tzIGR1cmluZyBDcmVhdGVVbml0In0sCisJezB4MDI1NywgIkNyZWF0ZVVuaXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGRlc2NyaXB0b3IgdmVyc2lvbiJ9LAorCXsweDAyNTgsICJJbnZhbGlkIHN1YnVuaXQgZm9yIFJBSUQgMCBvciA1IGluIENyZWF0ZVVuaXQifSwKKwl7MHgwMjU5LCAiVG9vIG1hbnkgZGVzY3JpcHRvcnMgaW4gQ3JlYXRlVW5pdCJ9LAorCXsweDAyNUEsICJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkIGluIENyZWF0ZVVuaXQgZGVzY3JpcHRvciJ9LAorCXsweDAyNUIsICJJbnZhbGlkIExCQSBvZmZzZXQgc3BlY2lmaWVkIGluIENyZWF0ZVVuaXQgZGVzY3JpcHRvciJ9LAorCXsweDAyNUMsICJJbnZhbGlkIHN0cmlwZWxldCBzaXplIHNwZWNpZmllZCBpbiBDcmVhdGVVbml0IGRlc2NyaXB0b3IifSwKKwl7MHgwMjYwLCAiU01BUlQgYXR0cmlidXRlIGV4Y2VlZGVkIHRocmVzaG9sZCJ9LAorCXsweEZGRkZGRkZGLCAoY2hhciopIDB9Cit9OworCisvKiBDb250cm9sIHJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBUV19DT05UUk9MX0NMRUFSX0hPU1RfSU5URVJSVVBUCSAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIFRXX0NPTlRST0xfQ0xFQVJfQVRURU5USU9OX0lOVEVSUlVQVCAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgVFdfQ09OVFJPTF9NQVNLX0NPTU1BTkRfSU5URVJSVVBUICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBUV19DT05UUk9MX01BU0tfUkVTUE9OU0VfSU5URVJSVVBUICAgICAweDAwMDEwMDAwCisjZGVmaW5lIFRXX0NPTlRST0xfVU5NQVNLX0NPTU1BTkRfSU5URVJSVVBUICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgVFdfQ09OVFJPTF9VTk1BU0tfUkVTUE9OU0VfSU5URVJSVVBUICAgMHgwMDAwNDAwMAorI2RlZmluZSBUV19DT05UUk9MX0NMRUFSX0VSUk9SX1NUQVRVUwkgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBUV19DT05UUk9MX0lTU1VFX1NPRlRfUkVTRVQJICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgVFdfQ09OVFJPTF9FTkFCTEVfSU5URVJSVVBUUwkgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBUV19DT05UUk9MX0RJU0FCTEVfSU5URVJSVVBUUwkgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBUV19DT05UUk9MX0lTU1VFX0hPU1RfSU5URVJSVVBUCSAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFRXX0NPTlRST0xfQ0xFQVJfUEFSSVRZX0VSUk9SICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgVFdfQ09OVFJPTF9DTEVBUl9RVUVVRV9FUlJPUiAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBUV19DT05UUk9MX0NMRUFSX1BDSV9BQk9SVCAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIFRXX0NPTlRST0xfQ0xFQVJfU0JVRl9XUklURV9FUlJPUiAgICAgIDB4MDAwMDAwMDgKKworLyogU3RhdHVzIHJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBUV19TVEFUVVNfTUFKT1JfVkVSU0lPTl9NQVNLCSAgICAgICAweEYwMDAwMDAwCisjZGVmaW5lIFRXX1NUQVRVU19NSU5PUl9WRVJTSU9OX01BU0sJICAgICAgIDB4MEYwMDAwMDAKKyNkZWZpbmUgVFdfU1RBVFVTX1BDSV9QQVJJVFlfRVJST1IJICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgVFdfU1RBVFVTX1FVRVVFX0VSUk9SCQkgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBUV19TVEFUVVNfTUlDUk9DT05UUk9MTEVSX0VSUk9SCSAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIFRXX1NUQVRVU19QQ0lfQUJPUlQJCSAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIFRXX1NUQVRVU19IT1NUX0lOVEVSUlVQVAkgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBUV19TVEFUVVNfQVRURU5USU9OX0lOVEVSUlVQVAkgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBUV19TVEFUVVNfQ09NTUFORF9JTlRFUlJVUFQJICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgVFdfU1RBVFVTX1JFU1BPTlNFX0lOVEVSUlVQVAkgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBUV19TVEFUVVNfQ09NTUFORF9RVUVVRV9GVUxMCSAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIFRXX1NUQVRVU19SRVNQT05TRV9RVUVVRV9FTVBUWQkgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBUV19TVEFUVVNfTUlDUk9DT05UUk9MTEVSX1JFQURZCSAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFRXX1NUQVRVU19DT01NQU5EX1FVRVVFX0VNUFRZCSAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIFRXX1NUQVRVU19FWFBFQ1RFRF9CSVRTCQkgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBUV19TVEFUVVNfVU5FWFBFQ1RFRF9CSVRTCSAgICAgICAweDAwRjAwMDA4CisjZGVmaW5lIFRXX1NUQVRVU19TQlVGX1dSSVRFX0VSUk9SICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgVFdfU1RBVFVTX1ZBTElEX0lOVEVSUlVQVCAgICAgICAgICAgICAgMHgwMERGMDAwOAorCisvKiBSRVNQT05TRSBRVUVVRSBCSVQgREVGSU5JVElPTlMgKi8KKyNkZWZpbmUgVFdfUkVTUE9OU0VfSURfTUFTSwkJICAgICAgIDB4MDAwMDBGRjAKKworLyogUENJIHJlbGF0ZWQgZGVmaW5lcyAqLworI2RlZmluZSBUV19OVU1ERVZJQ0VTIDEKKyNkZWZpbmUgVFdfUENJX0NMRUFSX1BBUklUWV9FUlJPUlMgMHhjMTAwCisjZGVmaW5lIFRXX1BDSV9DTEVBUl9QQ0lfQUJPUlQgICAgIDB4MjAwMAorCisvKiBDb21tYW5kIHBhY2tldCBvcGNvZGVzIHVzZWQgYnkgdGhlIGRyaXZlciAqLworI2RlZmluZSBUV19PUF9JTklUX0NPTk5FQ1RJT04gMHgxCisjZGVmaW5lIFRXX09QX0dFVF9QQVJBTQkgICAgICAweDEyCisjZGVmaW5lIFRXX09QX1NFVF9QQVJBTQkgICAgICAweDEzCisjZGVmaW5lIFRXX09QX0VYRUNVVEVfU0NTSSAgICAweDEwCisjZGVmaW5lIFRXX09QX0RPV05MT0FEX0ZJUk1XQVJFIDB4MTYKKyNkZWZpbmUgVFdfT1BfUkVTRVQgICAgICAgICAgICAgMHgxQworCisvKiBBc3luY2hyb25vdXMgRXZlbnQgTm90aWZpY2F0aW9uIChBRU4pIGNvZGVzIHVzZWQgYnkgdGhlIGRyaXZlciAqLworI2RlZmluZSBUV19BRU5fUVVFVUVfRU1QVFkgICAgICAgMHgwMDAwCisjZGVmaW5lIFRXX0FFTl9TT0ZUX1JFU0VUICAgICAgICAweDAwMDEKKyNkZWZpbmUgVFdfQUVOX1NZTkNfVElNRV9XSVRIX0hPU1QgMHgwMzEKKyNkZWZpbmUgVFdfQUVOX1NFVkVSSVRZX0VSUk9SICAgIDB4MQorI2RlZmluZSBUV19BRU5fU0VWRVJJVFlfREVCVUcgICAgMHg0CisjZGVmaW5lIFRXX0FFTl9OT1RfUkVUUklFVkVEIDB4MQorI2RlZmluZSBUV19BRU5fUkVUUklFVkVEIDB4MgorCisvKiBDb21tYW5kIHN0YXRlIGRlZmluZXMgKi8KKyNkZWZpbmUgVFdfU19JTklUSUFMICAgMHgxICAvKiBJbml0aWFsIHN0YXRlICovCisjZGVmaW5lIFRXX1NfU1RBUlRFRCAgIDB4MiAgLyogSWQgaW4gdXNlICovCisjZGVmaW5lIFRXX1NfUE9TVEVEICAgIDB4NCAgLyogUG9zdGVkIHRvIHRoZSBjb250cm9sbGVyICovCisjZGVmaW5lIFRXX1NfUEVORElORyAgIDB4OCAgLyogV2FpdGluZyB0byBiZSBwb3N0ZWQgaW4gaXNyICovCisjZGVmaW5lIFRXX1NfQ09NUExFVEVEIDB4MTAgLyogQ29tcGxldGVkIGJ5IGlzciAqLworI2RlZmluZSBUV19TX0ZJTklTSEVEICAweDIwIC8qIEkvTyBjb21wbGV0ZWx5IGRvbmUgKi8KKworLyogQ29tcGF0aWJpbGl0eSBkZWZpbmVzICovCisjZGVmaW5lIFRXXzkwMDBfQVJDSF9JRCAweDUKKyNkZWZpbmUgVFdfQ1VSUkVOVF9EUklWRVJfU1JMIDI4CisjZGVmaW5lIFRXX0NVUlJFTlRfRFJJVkVSX0JVSUxEIDkKKyNkZWZpbmUgVFdfQ1VSUkVOVF9EUklWRVJfQlJBTkNIIDQKKworLyogUGhhc2UgZGVmaW5lcyAqLworI2RlZmluZSBUV19QSEFTRV9JTklUSUFMIDAKKyNkZWZpbmUgVFdfUEhBU0VfU0lOR0xFICAxCisjZGVmaW5lIFRXX1BIQVNFX1NHTElTVCAgMgorCisvKiBNaXNjIGRlZmluZXMgKi8KKyNkZWZpbmUgVFdfU0VDVE9SX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgVFdfQUxJR05NRU5UXzkwMDAgICAgICAgICAgICAgICAgICAgICA0ICAvKiA0IGJ5dGVzICovCisjZGVmaW5lIFRXX0FMSUdOTUVOVF85MDAwX1NHTCAgICAgICAgICAgICAgICAgMHgzCisjZGVmaW5lIFRXX01BWF9VTklUUwkJCSAgICAgIDE2CisjZGVmaW5lIFRXX0lOSVRfTUVTU0FHRV9DUkVESVRTCQkgICAgICAweDEwMAorI2RlZmluZSBUV19JTklUX0NPTU1BTkRfUEFDS0VUX1NJWkUJICAgICAgMHgzCisjZGVmaW5lIFRXX0lOSVRfQ09NTUFORF9QQUNLRVRfU0laRV9FWFRFTkRFRCAgMHg2CisjZGVmaW5lIFRXX0VYVEVOREVEX0lOSVRfQ09OTkVDVAkgICAgICAweDIKKyNkZWZpbmUgVFdfQlVORExFRF9GV19TQUZFX1RPX0ZMQVNICSAgICAgIDB4NAorI2RlZmluZSBUV19DVExSX0ZXX1JFQ09NTUVORFNfRkxBU0gJICAgICAgMHg4CisjZGVmaW5lIFRXX0NUTFJfRldfQ09NUEFUSUJMRQkJICAgICAgMHgyCisjZGVmaW5lIFRXX0JBU0VfRldfU1JMCQkJICAgICAgMjQKKyNkZWZpbmUgVFdfQkFTRV9GV19CUkFOQ0gJCSAgICAgIDAKKyNkZWZpbmUgVFdfQkFTRV9GV19CVUlMRAkJICAgICAgMQorI2RlZmluZSBUV19GV19TUkxfTFVOU19TVVBQT1JURUQgICAgICAgICAgICAgIDI4CisjZGVmaW5lIFRXX1FfTEVOR1RICQkJICAgICAgMjU2CisjZGVmaW5lIFRXX1FfU1RBUlQJCQkgICAgICAwCisjZGVmaW5lIFRXX01BWF9TTE9UCQkJICAgICAgMzIKKyNkZWZpbmUgVFdfTUFYX1JFU0VUX1RSSUVTCQkgICAgICAyCisjZGVmaW5lIFRXX01BWF9DTURTX1BFUl9MVU4JCSAgICAgIDI1NAorI2RlZmluZSBUV19NQVhfUkVTUE9OU0VfRFJBSU4JCSAgICAgIDI1NgorI2RlZmluZSBUV19NQVhfQUVOX0RSQUlOCQkgICAgICA0MAorI2RlZmluZSBUV19JTl9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgVFdfSU5fQ0hSREVWX0lPQ1RMICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFRXX0lOX0FUVEVOVElPTl9MT09QCQkgICAgICA0CisjZGVmaW5lIFRXX01BWF9TRUNUT1JTICAgICAgICAgICAgICAgICAgICAgICAgMjU2CisjZGVmaW5lIFRXX0FFTl9XQUlUX1RJTUUgICAgICAgICAgICAgICAgICAgICAgMTAwMAorI2RlZmluZSBUV19JT0NUTF9XQUlUX1RJTUUgICAgICAgICAgICAgICAgICAgICgxICogSFopIC8qIDEgc2Vjb25kICovCisjZGVmaW5lIFRXX01BWF9DREJfTEVOICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgVFdfSVNSX0RPTlRfQ09NUExFVEUgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFRXX0lTUl9ET05UX1JFU1VMVCAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBUV19JT0NUTF9DSFJERVZfVElNRU9VVCAgICAgICAgICAgICAgIDYwIC8qIDYwIHNlY29uZHMgKi8KKyNkZWZpbmUgVFdfSU9DVExfQ0hSREVWX0ZSRUUgICAgICAgICAgICAgICAgICAtMQorI2RlZmluZSBUV19DT01NQU5EX09GRlNFVCAgICAgICAgICAgICAgICAgICAgIDEyOCAvKiAxMjggYnl0ZXMgKi8KKyNkZWZpbmUgVFdfVkVSU0lPTl9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAweDA0MDIKKyNkZWZpbmUgVFdfVElNRUtFRVBfVEFCTEUJCSAgICAgIDB4MDQwQQorI2RlZmluZSBUV19JTkZPUk1BVElPTl9UQUJMRQkJICAgICAgMHgwNDAzCisjZGVmaW5lIFRXX1BBUkFNX0ZXVkVSCQkJICAgICAgMworI2RlZmluZSBUV19QQVJBTV9GV1ZFUl9MRU5HVEgJCSAgICAgIDE2CisjZGVmaW5lIFRXX1BBUkFNX0JJT1NWRVIJCSAgICAgIDQKKyNkZWZpbmUgVFdfUEFSQU1fQklPU1ZFUl9MRU5HVEgJCSAgICAgIDE2CisjZGVmaW5lIFRXX1BBUkFNX1BPUlRDT1VOVAkJICAgICAgMworI2RlZmluZSBUV19QQVJBTV9QT1JUQ09VTlRfTEVOR1RICSAgICAgIDEKKyNkZWZpbmUgVFdfTUlOX1NHTF9MRU5HVEggICAgICAgICAgICAgICAgICAgICAweDIwMCAvKiA1MTIgYnl0ZXMgKi8KKyNkZWZpbmUgVFdfTUFYX1NFTlNFX0xFTkdUSCAgICAgICAgICAgICAgICAgICAyNTYKKyNkZWZpbmUgVFdfRVZFTlRfU09VUkNFX0FFTiAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgVFdfRVZFTlRfU09VUkNFX0NPTU1BTkQgICAgICAgICAgICAgICAweDEwMDEKKyNkZWZpbmUgVFdfRVZFTlRfU09VUkNFX1BDSElQICAgICAgICAgICAgICAgICAweDEwMDIKKyNkZWZpbmUgVFdfRVZFTlRfU09VUkNFX0RSSVZFUiAgICAgICAgICAgICAgICAweDEwMDMKKyNkZWZpbmUgVFdfSU9DVExfR0VUX0NPTVBBVElCSUxJVFlfSU5GTwkgICAgICAweDEwMQorI2RlZmluZSBUV19JT0NUTF9HRVRfTEFTVF9FVkVOVCAgICAgICAgICAgICAgIDB4MTAyCisjZGVmaW5lIFRXX0lPQ1RMX0dFVF9GSVJTVF9FVkVOVCAgICAgICAgICAgICAgMHgxMDMKKyNkZWZpbmUgVFdfSU9DVExfR0VUX05FWFRfRVZFTlQgICAgICAgICAgICAgICAweDEwNAorI2RlZmluZSBUV19JT0NUTF9HRVRfUFJFVklPVVNfRVZFTlQgICAgICAgICAgIDB4MTA1CisjZGVmaW5lIFRXX0lPQ1RMX0dFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgMHgxMDYKKyNkZWZpbmUgVFdfSU9DVExfUkVMRUFTRV9MT0NLICAgICAgICAgICAgICAgICAweDEwNworI2RlZmluZSBUV19JT0NUTF9GSVJNV0FSRV9QQVNTX1RIUk9VR0ggICAgICAgIDB4MTA4CisjZGVmaW5lIFRXX0lPQ1RMX0VSUk9SX1NUQVRVU19OT1RfTE9DS0VEICAgICAgMHgxMDAxIC8vIE5vdCBsb2NrZWQKKyNkZWZpbmUgVFdfSU9DVExfRVJST1JfU1RBVFVTX0xPQ0tFRCAgICAgICAgICAweDEwMDIgLy8gQWxyZWFkeSBsb2NrZWQKKyNkZWZpbmUgVFdfSU9DVExfRVJST1JfU1RBVFVTX05PX01PUkVfRVZFTlRTICAweDEwMDMgLy8gTm8gbW9yZSBldmVudHMKKyNkZWZpbmUgVFdfSU9DVExfRVJST1JfU1RBVFVTX0FFTl9DTE9CQkVSICAgICAweDEwMDQgLy8gQUVOIGNsb2JiZXIgb2NjdXJyZWQKKyNkZWZpbmUgVFdfSU9DVExfRVJST1JfT1NfRUZBVUxUCSAgICAgIC1FRkFVTFQgLy8gQmFkIGFkZHJlc3MKKyNkZWZpbmUgVFdfSU9DVExfRVJST1JfT1NfRUlOVFIJCSAgICAgIC1FSU5UUiAgLy8gSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwKKyNkZWZpbmUgVFdfSU9DVExfRVJST1JfT1NfRUlOVkFMCSAgICAgIC1FSU5WQUwgLy8gSW52YWxpZCBhcmd1bWVudAorI2RlZmluZSBUV19JT0NUTF9FUlJPUl9PU19FTk9NRU0JICAgICAgLUVOT01FTSAvLyBPdXQgb2YgbWVtb3J5CisjZGVmaW5lIFRXX0lPQ1RMX0VSUk9SX09TX0VSRVNUQVJUU1lTCSAgICAgIC1FUkVTVEFSVFNZUyAvLyBSZXN0YXJ0IHN5c3RlbSBjYWxsCisjZGVmaW5lIFRXX0lPQ1RMX0VSUk9SX09TX0VJTwkJICAgICAgLUVJTyAvLyBJL08gZXJyb3IKKyNkZWZpbmUgVFdfSU9DVExfRVJST1JfT1NfRU5PVFRZCSAgICAgIC1FTk9UVFkgLy8gTm90IGEgdHlwZXdyaXRlcgorI2RlZmluZSBUV19JT0NUTF9FUlJPUl9PU19FTk9ERVYJICAgICAgLUVOT0RFViAvLyBObyBzdWNoIGRldmljZQorI2RlZmluZSBUV19BTExPQ0FUSU9OX0xFTkdUSAkJICAgICAgMTI4CisjZGVmaW5lIFRXX1NFTlNFX0RBVEFfTEVOR1RICQkgICAgICAxOAorI2RlZmluZSBUV19TVEFUVVNfQ0hFQ0tfQ09ORElUSU9OCSAgICAgIDIKKyNkZWZpbmUgVFdfRVJST1JfTE9HSUNBTF9VTklUX05PVF9TVVBQT1JURUQgICAweDEwYQorI2RlZmluZSBUV19FUlJPUl9VTklUX09GRkxJTkUgICAgICAgICAgICAgICAgIDB4MTI4CisjZGVmaW5lIFRXX01FU1NBR0VfU09VUkNFX0NPTlRST0xMRVJfRVJST1IgICAgMworI2RlZmluZSBUV19NRVNTQUdFX1NPVVJDRV9DT05UUk9MTEVSX0VWRU5UICAgIDQKKyNkZWZpbmUgVFdfTUVTU0FHRV9TT1VSQ0VfTElOVVhfRFJJVkVSICAgICAgICA2CisjZGVmaW5lIFRXX0RSSVZFUiBUV19NRVNTQUdFX1NPVVJDRV9MSU5VWF9EUklWRVIKKyNkZWZpbmUgVFdfTUVTU0FHRV9TT1VSQ0VfTElOVVhfT1MgICAgICAgICAgICA5CisjZGVmaW5lIFRXX09TIFRXX01FU1NBR0VfU09VUkNFX0xJTlVYX09TCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfM1dBUkVfOTAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNXQVJFXzkwMDAgMHgxMDAyCisjZW5kaWYKKworLyogQml0bWFzayBtYWNyb3MgdG8gZWxpbWluYXRlIGJpdGZpZWxkcyAqLworCisvKiBvcGNvZGU6IDUsIHJlc2VydmVkOiAzICovCisjZGVmaW5lIFRXX09QUkVTX0lOKHgseSkgKCh4IDw8IDUpIHwgKHkgJiAweDFmKSkKKyNkZWZpbmUgVFdfT1BfT1VUKHgpICh4ICYgMHgxZikKKworLyogb3Bjb2RlOiA1LCBzZ2xvZmZzZXQ6IDMgKi8KKyNkZWZpbmUgVFdfT1BTR0xfSU4oeCx5KSAoKHggPDwgNSkgfCAoeSAmIDB4MWYpKQorI2RlZmluZSBUV19TR0xfT1VUKHgpICgoeCA+PiA1KSAmIDB4NykKKworLyogc2V2ZXJpdHk6IDMsIHJlc2VydmVkOiA1ICovCisjZGVmaW5lIFRXX1NFVl9PVVQoeCkgKHggJiAweDcpCisKKy8qIHJlc2VydmVkXzE6IDQsIHJlc3BvbnNlX2lkOiA4LCByZXNlcnZlZF8yOiAyMCAqLworI2RlZmluZSBUV19SRVNJRF9PVVQoeCkgKCh4ID4+IDQpICYgMHhmZikKKworLyogcmVxdWVzdF9pZDogMTIsIGx1bjogNCAqLworI2RlZmluZSBUV19SRVFfTFVOX0lOKGx1biwgcmVxdWVzdF9pZCkgKCgobHVuIDw8IDEyKSAmIDB4ZjAwMCkgfCAocmVxdWVzdF9pZCAmIDB4ZmZmKSkKKyNkZWZpbmUgVFdfTFVOX09VVChsdW4pICgobHVuID4+IDEyKSAmIDB4ZikKKworLyogTWFjcm9zICovCisjZGVmaW5lIFRXX0NPTlRST0xfUkVHX0FERFIoeCkgKHgtPmJhc2VfYWRkcikKKyNkZWZpbmUgVFdfU1RBVFVTX1JFR19BRERSKHgpICgodW5zaWduZWQgY2hhciBfX2lvbWVtICopeC0+YmFzZV9hZGRyICsgMHg0KQorI2RlZmluZSBUV19DT01NQU5EX1FVRVVFX1JFR19BRERSKHgpIChzaXplb2YoZG1hX2FkZHJfdCkgPiA0ID8gKCh1bnNpZ25lZCBjaGFyIF9faW9tZW0gKil4LT5iYXNlX2FkZHIgKyAweDIwKSA6ICgodW5zaWduZWQgY2hhciBfX2lvbWVtICopeC0+YmFzZV9hZGRyICsgMHg4KSkKKyNkZWZpbmUgVFdfUkVTUE9OU0VfUVVFVUVfUkVHX0FERFIoeCkgKCh1bnNpZ25lZCBjaGFyIF9faW9tZW0gKil4LT5iYXNlX2FkZHIgKyAweEMpCisjZGVmaW5lIFRXX0NMRUFSX0FMTF9JTlRFUlJVUFRTKHgpICh3cml0ZWwoVFdfU1RBVFVTX1ZBTElEX0lOVEVSUlVQVCwgVFdfQ09OVFJPTF9SRUdfQUREUih4KSkpCisjZGVmaW5lIFRXX0NMRUFSX0FUVEVOVElPTl9JTlRFUlJVUFQoeCkgKHdyaXRlbChUV19DT05UUk9MX0NMRUFSX0FUVEVOVElPTl9JTlRFUlJVUFQsIFRXX0NPTlRST0xfUkVHX0FERFIoeCkpKQorI2RlZmluZSBUV19DTEVBUl9IT1NUX0lOVEVSUlVQVCh4KSAod3JpdGVsKFRXX0NPTlRST0xfQ0xFQVJfSE9TVF9JTlRFUlJVUFQsIFRXX0NPTlRST0xfUkVHX0FERFIoeCkpKQorI2RlZmluZSBUV19ESVNBQkxFX0lOVEVSUlVQVFMoeCkgKHdyaXRlbChUV19DT05UUk9MX0RJU0FCTEVfSU5URVJSVVBUUywgVFdfQ09OVFJPTF9SRUdfQUREUih4KSkpCisjZGVmaW5lIFRXX0VOQUJMRV9BTkRfQ0xFQVJfSU5URVJSVVBUUyh4KSAod3JpdGVsKFRXX0NPTlRST0xfQ0xFQVJfQVRURU5USU9OX0lOVEVSUlVQVCB8IFRXX0NPTlRST0xfVU5NQVNLX1JFU1BPTlNFX0lOVEVSUlVQVCB8IFRXX0NPTlRST0xfRU5BQkxFX0lOVEVSUlVQVFMsIFRXX0NPTlRST0xfUkVHX0FERFIoeCkpKQorI2RlZmluZSBUV19NQVNLX0NPTU1BTkRfSU5URVJSVVBUKHgpICh3cml0ZWwoVFdfQ09OVFJPTF9NQVNLX0NPTU1BTkRfSU5URVJSVVBULCBUV19DT05UUk9MX1JFR19BRERSKHgpKSkKKyNkZWZpbmUgVFdfVU5NQVNLX0NPTU1BTkRfSU5URVJSVVBUKHgpICh3cml0ZWwoVFdfQ09OVFJPTF9VTk1BU0tfQ09NTUFORF9JTlRFUlJVUFQsIFRXX0NPTlRST0xfUkVHX0FERFIoeCkpKQorI2RlZmluZSBUV19TT0ZUX1JFU0VUKHgpICh3cml0ZWwoVFdfQ09OVFJPTF9JU1NVRV9TT0ZUX1JFU0VUIHwgXAorCQkJVFdfQ09OVFJPTF9DTEVBUl9IT1NUX0lOVEVSUlVQVCB8IFwKKwkJCVRXX0NPTlRST0xfQ0xFQVJfQVRURU5USU9OX0lOVEVSUlVQVCB8IFwKKwkJCVRXX0NPTlRST0xfTUFTS19DT01NQU5EX0lOVEVSUlVQVCB8IFwKKwkJCVRXX0NPTlRST0xfTUFTS19SRVNQT05TRV9JTlRFUlJVUFQgfCBcCisJCQlUV19DT05UUk9MX0NMRUFSX0VSUk9SX1NUQVRVUyB8IFwKKwkJCVRXX0NPTlRST0xfRElTQUJMRV9JTlRFUlJVUFRTLCBUV19DT05UUk9MX1JFR19BRERSKHgpKSkKKyNkZWZpbmUgVFdfUFJJTlRLKGgsYSxiLGMpIHsgXAoraWYgKGgpIFwKK3ByaW50ayhLRVJOX1dBUk5JTkcgIjN3LTl4eHg6IHNjc2klZDogRVJST1I6ICgweCUwMlg6MHglMDRYKTogJXMuXG4iLGgtPmhvc3Rfbm8sYSxiLGMpOyBcCitlbHNlIFwKK3ByaW50ayhLRVJOX1dBUk5JTkcgIjN3LTl4eHg6IEVSUk9SOiAoMHglMDJYOjB4JTA0WCk6ICVzLlxuIixhLGIsYyk7IFwKK30KKyNkZWZpbmUgVFdfTUFYX0xVTlMoc3JsKSAoc3JsIDwgVFdfRldfU1JMX0xVTlNfU1VQUE9SVEVEID8gMSA6IDE2KQorI2RlZmluZSBUV19DT01NQU5EX1NJWkUgKHNpemVvZihkbWFfYWRkcl90KSA+IDQgPyA1IDogNCkKKyNkZWZpbmUgVFdfQVBBQ0hFX01BWF9TR0xfTEVOR1RIIChzaXplb2YoZG1hX2FkZHJfdCkgPiA0ID8gNzIgOiAxMDkpCisjZGVmaW5lIFRXX0VTQ0FMQURFX01BWF9TR0xfTEVOR1RIIChzaXplb2YoZG1hX2FkZHJfdCkgPiA0ID8gNDEgOiA2MikKKyNkZWZpbmUgVFdfUEFERElOR19MRU5HVEggKHNpemVvZihkbWFfYWRkcl90KSA+IDQgPyA4IDogMCkKKworI3ByYWdtYSBwYWNrKDEpCisKKy8qIFNjYXR0ZXIgR2F0aGVyIExpc3QgRW50cnkgKi8KK3R5cGVkZWYgc3RydWN0IFRBR19UV19TR19FbnRyeSB7CisJZG1hX2FkZHJfdCBhZGRyZXNzOworCXUzMiBsZW5ndGg7Cit9IFRXX1NHX0VudHJ5OworCisvKiBDb21tYW5kIFBhY2tldCAqLwordHlwZWRlZiBzdHJ1Y3QgVFdfQ29tbWFuZCB7CisJdW5zaWduZWQgY2hhciBvcGNvZGVfX3NnbG9mZnNldDsKKwl1bnNpZ25lZCBjaGFyIHNpemU7CisJdW5zaWduZWQgY2hhciByZXF1ZXN0X2lkOworCXVuc2lnbmVkIGNoYXIgdW5pdF9faG9zdGlkOworCS8qIFNlY29uZCBEV09SRCAqLworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CisJdW5pb24geworCQl1bnNpZ25lZCBzaG9ydCBibG9ja19jb3VudDsKKwkJdW5zaWduZWQgc2hvcnQgcGFyYW1ldGVyX2NvdW50OworCX0gYnl0ZTZfb2Zmc2V0OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMiBsYmE7CisJCQlUV19TR19FbnRyeSBzZ2xbVFdfRVNDQUxBREVfTUFYX1NHTF9MRU5HVEhdOworCQkJZG1hX2FkZHJfdCBwYWRkaW5nOworCQl9IGlvOworCQlzdHJ1Y3QgeworCQkJVFdfU0dfRW50cnkgc2dsW1RXX0VTQ0FMQURFX01BWF9TR0xfTEVOR1RIXTsKKwkJCXUzMiBwYWRkaW5nOworCQkJZG1hX2FkZHJfdCBwYWRkaW5nMjsKKwkJfSBwYXJhbTsKKwl9IGJ5dGU4X29mZnNldDsKK30gVFdfQ29tbWFuZDsKKworLyogQ29tbWFuZCBQYWNrZXQgZm9yIDkwMDArIGNvbnRyb2xsZXJzICovCit0eXBlZGVmIHN0cnVjdCBUQUdfVFdfQ29tbWFuZF9BcGFjaGUgeworCXVuc2lnbmVkIGNoYXIgb3Bjb2RlX19yZXNlcnZlZDsKKwl1bnNpZ25lZCBjaGFyIHVuaXQ7CisJdW5zaWduZWQgc2hvcnQgcmVxdWVzdF9pZF9fbHVubDsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIHNnbF9vZmZzZXQ7CisJdW5zaWduZWQgc2hvcnQgc2dsX2VudHJpZXNfX2x1bmg7CisJdW5zaWduZWQgY2hhciBjZGJbMTZdOworCVRXX1NHX0VudHJ5IHNnX2xpc3RbVFdfQVBBQ0hFX01BWF9TR0xfTEVOR1RIXTsKKwl1bnNpZ25lZCBjaGFyIHBhZGRpbmdbVFdfUEFERElOR19MRU5HVEhdOworfSBUV19Db21tYW5kX0FwYWNoZTsKKworLyogTmV3IGNvbW1hbmQgcGFja2V0IGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgVEFHX1RXX0NvbW1hbmRfQXBhY2hlX0hlYWRlciB7CisJdW5zaWduZWQgY2hhciBzZW5zZV9kYXRhW1RXX1NFTlNFX0RBVEFfTEVOR1RIXTsKKwlzdHJ1Y3QgeworCQljaGFyIHJlc2VydmVkWzRdOworCQl1bnNpZ25lZCBzaG9ydCBlcnJvcjsKKwkJdW5zaWduZWQgY2hhciBwYWRkaW5nOworCQl1bnNpZ25lZCBjaGFyIHNldmVyaXR5X19yZXNlcnZlZDsKKwl9IHN0YXR1c19ibG9jazsKKwl1bnNpZ25lZCBjaGFyIGVycl9zcGVjaWZpY19kZXNjWzk4XTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIHNpemVfaGVhZGVyOworCQl1bnNpZ25lZCBzaG9ydCByZXNlcnZlZDsKKwkJdW5zaWduZWQgY2hhciBzaXplX3NlbnNlOworCX0gaGVhZGVyX2Rlc2M7Cit9IFRXX0NvbW1hbmRfQXBhY2hlX0hlYWRlcjsKKworLyogVGhpcyBzdHJ1Y3QgaXMgYSB1bmlvbiBvZiB0aGUgMiBjb21tYW5kIHBhY2tldHMgKi8KK3R5cGVkZWYgc3RydWN0IFRBR19UV19Db21tYW5kX0Z1bGwgeworCVRXX0NvbW1hbmRfQXBhY2hlX0hlYWRlciBoZWFkZXI7CisJdW5pb24geworCQlUV19Db21tYW5kIG9sZGNvbW1hbmQ7CisJCVRXX0NvbW1hbmRfQXBhY2hlIG5ld2NvbW1hbmQ7CisJfSBjb21tYW5kOworfSBUV19Db21tYW5kX0Z1bGw7CisKKy8qIEluaXRjb25uZWN0aW9uIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgVEFHX1RXX0luaXRjb25uZWN0IHsKKwl1bnNpZ25lZCBjaGFyIG9wY29kZV9fcmVzZXJ2ZWQ7CisJdW5zaWduZWQgY2hhciBzaXplOworCXVuc2lnbmVkIGNoYXIgcmVxdWVzdF9pZDsKKwl1bnNpZ25lZCBjaGFyIHJlczI7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCBtZXNzYWdlX2NyZWRpdHM7CisJdTMyIGZlYXR1cmVzOworCXVuc2lnbmVkIHNob3J0IGZ3X3NybDsKKwl1bnNpZ25lZCBzaG9ydCBmd19hcmNoX2lkOworCXVuc2lnbmVkIHNob3J0IGZ3X2JyYW5jaDsKKwl1bnNpZ25lZCBzaG9ydCBmd19idWlsZDsKKwl1MzIgcmVzdWx0OworfSBUV19Jbml0Y29ubmVjdDsKKworLyogRXZlbnQgaW5mbyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IFRBR19UV19FdmVudAoreworCXVuc2lnbmVkIGludCBzZXF1ZW5jZV9pZDsKKwl1bnNpZ25lZCBpbnQgdGltZV9zdGFtcF9zZWM7CisJdW5zaWduZWQgc2hvcnQgYWVuX2NvZGU7CisJdW5zaWduZWQgY2hhciBzZXZlcml0eTsKKwl1bnNpZ25lZCBjaGFyIHJldHJpZXZlZDsKKwl1bnNpZ25lZCBjaGFyIHJlcGVhdF9jb3VudDsKKwl1bnNpZ25lZCBjaGFyIHBhcmFtZXRlcl9sZW47CisJdW5zaWduZWQgY2hhciBwYXJhbWV0ZXJfZGF0YVs5OF07Cit9IFRXX0V2ZW50OworCit0eXBlZGVmIHN0cnVjdCBUQUdfVFdfSW9jdGxfRHJpdmVyX0NvbW1hbmQgeworCXVuc2lnbmVkIGludCBjb250cm9sX2NvZGU7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgdW5pcXVlX2lkOworCXVuc2lnbmVkIGludCBzZXF1ZW5jZV9pZDsKKwl1bnNpZ25lZCBpbnQgb3Nfc3BlY2lmaWM7CisJdW5zaWduZWQgaW50IGJ1ZmZlcl9sZW5ndGg7Cit9IFRXX0lvY3RsX0RyaXZlcl9Db21tYW5kOworCit0eXBlZGVmIHN0cnVjdCBUQUdfVFdfSW9jdGxfQXBhY2hlIHsKKwlUV19Jb2N0bF9Ecml2ZXJfQ29tbWFuZCBkcml2ZXJfY29tbWFuZDsKKyAgICAgICAgY2hhciBwYWRkaW5nWzQ4OF07CisJVFdfQ29tbWFuZF9GdWxsIGZpcm13YXJlX2NvbW1hbmQ7CisJY2hhciBkYXRhX2J1ZmZlclsxXTsKK30gVFdfSW9jdGxfQnVmX0FwYWNoZTsKKworLyogTG9jayBzdHJ1Y3R1cmUgZm9yIGlvY3RsIGdldC9yZWxlYXNlIGxvY2sgKi8KK3R5cGVkZWYgc3RydWN0IFRBR19UV19Mb2NrIHsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXRfbXNlYzsKKwl1bnNpZ25lZCBsb25nIHRpbWVfcmVtYWluaW5nX21zZWM7CisJdW5zaWduZWQgbG9uZyBmb3JjZV9mbGFnOworfSBUV19Mb2NrOworCisvKiBHZXRQYXJhbSBkZXNjcmlwdG9yICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQJdGFibGVfaWQ7CisJdW5zaWduZWQgc2hvcnQJcGFyYW1ldGVyX2lkOworCXVuc2lnbmVkIHNob3J0CXBhcmFtZXRlcl9zaXplX2J5dGVzOworCXVuc2lnbmVkIHNob3J0ICBhY3R1YWxfcGFyYW1ldGVyX3NpemVfYnl0ZXM7CisJdW5zaWduZWQgY2hhcglkYXRhWzFdOworfSBUV19QYXJhbV9BcGFjaGUsICpQVFdfUGFyYW1fQXBhY2hlOworCisvKiBSZXNwb25zZSBxdWV1ZSAqLwordHlwZWRlZiB1bmlvbiBUQUdfVFdfUmVzcG9uc2VfUXVldWUgeworCXUzMiByZXNwb25zZV9pZDsKKwl1MzIgdmFsdWU7Cit9IFRXX1Jlc3BvbnNlX1F1ZXVlOworCit0eXBlZGVmIHN0cnVjdCBUQUdfVFdfSW5mbyB7CisJY2hhciAqYnVmZmVyOworCWludCBsZW5ndGg7CisJaW50IG9mZnNldDsKKwlpbnQgcG9zaXRpb247Cit9IFRXX0luZm87CisKKy8qIENvbXBhdGliaWxpdHkgaW5mb3JtYXRpb24gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBUQUdfVFdfQ29tcGF0aWJpbGl0eV9JbmZvCit7CisJY2hhciBkcml2ZXJfdmVyc2lvblszMl07CisJdW5zaWduZWQgc2hvcnQgd29ya2luZ19zcmw7CisJdW5zaWduZWQgc2hvcnQgd29ya2luZ19icmFuY2g7CisJdW5zaWduZWQgc2hvcnQgd29ya2luZ19idWlsZDsKKwl1bnNpZ25lZCBzaG9ydCBkcml2ZXJfc3JsX2hpZ2g7CisJdW5zaWduZWQgc2hvcnQgZHJpdmVyX2JyYW5jaF9oaWdoOworCXVuc2lnbmVkIHNob3J0IGRyaXZlcl9idWlsZF9oaWdoOworCXVuc2lnbmVkIHNob3J0IGRyaXZlcl9zcmxfbG93OworCXVuc2lnbmVkIHNob3J0IGRyaXZlcl9icmFuY2hfbG93OworCXVuc2lnbmVkIHNob3J0IGRyaXZlcl9idWlsZF9sb3c7Cit9IFRXX0NvbXBhdGliaWxpdHlfSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVEFHX1RXX0RldmljZV9FeHRlbnNpb24geworCXUzMiAgICAgICAgICAgICAgICAgICAgIF9faW9tZW0gKmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nCSAgICAgICAJKmdlbmVyaWNfYnVmZmVyX3ZpcnRbVFdfUV9MRU5HVEhdOworCWRtYV9hZGRyX3QJICAgICAgIAlnZW5lcmljX2J1ZmZlcl9waHlzW1RXX1FfTEVOR1RIXTsKKwlUV19Db21tYW5kX0Z1bGwJICAgICAgIAkqY29tbWFuZF9wYWNrZXRfdmlydFtUV19RX0xFTkdUSF07CisJZG1hX2FkZHJfdAkJY29tbWFuZF9wYWNrZXRfcGh5c1tUV19RX0xFTkdUSF07CisJc3RydWN0IHBjaV9kZXYJCSp0d19wY2lfZGV2OworCXN0cnVjdCBzY3NpX2NtbmQJKnNyYltUV19RX0xFTkdUSF07CisJdW5zaWduZWQgY2hhcgkJZnJlZV9xdWV1ZVtUV19RX0xFTkdUSF07CisJdW5zaWduZWQgY2hhcgkJZnJlZV9oZWFkOworCXVuc2lnbmVkIGNoYXIJCWZyZWVfdGFpbDsKKwl1bnNpZ25lZCBjaGFyCQlwZW5kaW5nX3F1ZXVlW1RXX1FfTEVOR1RIXTsKKwl1bnNpZ25lZCBjaGFyCQlwZW5kaW5nX2hlYWQ7CisJdW5zaWduZWQgY2hhcgkJcGVuZGluZ190YWlsOworCWludCAgICAgCQlzdGF0ZVtUV19RX0xFTkdUSF07CisJdW5zaWduZWQgaW50CQlwb3N0ZWRfcmVxdWVzdF9jb3VudDsKKwl1bnNpZ25lZCBpbnQJCW1heF9wb3N0ZWRfcmVxdWVzdF9jb3VudDsKKwl1bnNpZ25lZCBpbnQJICAgICAgICBwZW5kaW5nX3JlcXVlc3RfY291bnQ7CisJdW5zaWduZWQgaW50CQltYXhfcGVuZGluZ19yZXF1ZXN0X2NvdW50OworCXVuc2lnbmVkIGludAkJbWF4X3NnbF9lbnRyaWVzOworCXVuc2lnbmVkIGludAkJc2dsX2VudHJpZXM7CisJdW5zaWduZWQgaW50CQludW1fcmVzZXRzOworCXVuc2lnbmVkIGludAkJc2VjdG9yX2NvdW50OworCXVuc2lnbmVkIGludAkJbWF4X3NlY3Rvcl9jb3VudDsKKwl1bnNpZ25lZCBpbnQJCWFlbl9jb3VudDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0CSpob3N0OworCWxvbmcJCQlmbGFnczsKKwlpbnQJCQlyZXNldF9wcmludDsKKwlUV19FdmVudCAgICAgICAgICAgICAgICAqZXZlbnRfcXVldWVbVFdfUV9MRU5HVEhdOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgIGVycm9yX2luZGV4OworCXVuc2lnbmVkIGNoYXIJCWV2ZW50X3F1ZXVlX3dyYXBwZWQ7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgZXJyb3Jfc2VxdWVuY2VfaWQ7CisJaW50ICAgICAgICAgICAgICAgICAgICAgaW9jdGxfc2VtX2xvY2s7CisJdTMyICAgICAgICAgICAgICAgICAgICAgaW9jdGxfbXNlYzsKKwlpbnQJCQljaHJkZXZfcmVxdWVzdF9pZDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAlpb2N0bF93cXVldWU7CisJc3RydWN0IHNlbWFwaG9yZQlpb2N0bF9zZW07CisJY2hhcgkJCWFlbl9jbG9iYmVyOworCXVuc2lnbmVkIHNob3J0CQl3b3JraW5nX3NybDsKKwl1bnNpZ25lZCBzaG9ydAkJd29ya2luZ19icmFuY2g7CisJdW5zaWduZWQgc2hvcnQJCXdvcmtpbmdfYnVpbGQ7Cit9IFRXX0RldmljZV9FeHRlbnNpb247CisKKyNwcmFnbWEgcGFjaygpCisKKyNlbmRpZiAvKiBfM1dfOVhYWF9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS8zdy14eHh4LmMgYi9kcml2ZXJzL3Njc2kvM3cteHh4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZjllY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvM3cteHh4eC5jCkBAIC0wLDAgKzEsMjQ3OCBAQAorLyogCisgICAzdy14eHh4LmMgLS0gM3dhcmUgU3RvcmFnZSBDb250cm9sbGVyIGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorCisgICBXcml0dGVuIEJ5OiBBZGFtIFJhZGZvcmQgPGxpbnV4cmFpZEBhbWNjLmNvbT4KKyAgIE1vZGlmaWNhdGlvbnMgQnk6IEpvZWwgSmFjb2Jzb24gPGxpbnV4QDN3YXJlLmNvbT4KKyAgIAkJICAgICBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAgICAgICAgICAgICAgICAgICAgIEJyYWQgU3RyYW5kIDxsaW51eEAzd2FyZS5jb20+CisKKyAgIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IDN3YXJlIEluYy4KKworICAgS2VybmVsIGNvbXBhdGlibGl0eSBCeTogCUFuZHJlIEhlZHJpY2sgPGFuZHJlQHN1c2UuY29tPgorICAgTm9uLUNvcHlyaWdodCAoQykgMjAwMAlBbmRyZSBIZWRyaWNrIDxhbmRyZUBzdXNlLmNvbT4KKyAgIAorICAgRnVydGhlciB0aW55IGJ1aWxkIGZpeGVzIGFuZCB0cml2aWFsIGhvb3ZlcmluZyAgICBBbGFuIENveAorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgICAKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICAgCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAgIAorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgTk8gV0FSUkFOVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAgICAgICAgCisgICBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCAgICAgIAorICAgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgICAgICAKKyAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgICAgCisgICBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kICAgICAgIAorICAgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzICAgICAgICAKKyAgIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byAgICAgCisgICB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCAgICAgICAgIAorICAgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuICAKKworICAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZICAgCisgICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgICAgICAgIAorICAgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgICAKKyAgIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAgICAgCisgICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFICAgIAorICAgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEICAKKyAgIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMgICAgICAgICAgICAgCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICAgCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAgIAorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKworICAgQnVncy9Db21tZW50cy9TdWdnZXN0aW9ucyBzaG91bGQgYmUgbWFpbGVkIHRvOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGxpbnV4cmFpZEBhbWNjLmNvbQorCisgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZ290bzoKKyAgIGh0dHA6Ly93d3cuYW1jYy5jb20KKworICAgSGlzdG9yeQorICAgLS0tLS0tLQorICAgMC4xLjAwMCAtICAgICBJbml0aWFsIHJlbGVhc2UuCisgICAwLjQuMDAwIC0gICAgIEFkZGVkIHN1cHBvcnQgZm9yIEFzeW5jaHJvbm91cyBFdmVudCBOb3RpZmljYXRpb24gdGhyb3VnaAorICAgICAgICAgICAgICAgICBpb2N0bHMgZm9yIDNETS4KKyAgIDEuMC4wMDAgLSAgICAgQWRkZWQgRFBPICYgRlVBIGJpdCBzdXBwb3J0IGZvciBXUklURV8xMCAmIFdSSVRFXzYgY2RiCisgICAgICAgICAgICAgICAgIHRvIGRpc2FibGUgZHJpdmUgd3JpdGUtY2FjaGUgYmVmb3JlIHdyaXRlcy4KKyAgIDEuMS4wMDAgLSAgICAgRml4ZWQgcGVyZm9ybWFuY2UgYnVnIHdpdGggRFBPICYgRlVBIG5vdCBleGlzdGluZyBmb3IgV1JJVEVfNi4KKyAgIDEuMi4wMDAgLSAgICAgQWRkZWQgc3VwcG9ydCBmb3IgY2xlYW4gc2h1dGRvd24gbm90aWZpY2F0aW9uL2ZlYXR1cmUgdGFibGUuCisgICAxLjAyLjAwLjAwMSAtIEFkZGVkIHN1cHBvcnQgZm9yIGZ1bGwgY29tbWFuZCBwYWNrZXQgcG9zdHMgdGhyb3VnaCBpb2N0bHMKKyAgICAgICAgICAgICAgICAgZm9yIDNETS4KKyAgICAgICAgICAgICAgICAgQnVnIGZpeCBzbyBob3Qgc3BhcmUgZHJpdmVzIGRvbid0IHNob3cgdXAuCisgICAxLjAyLjAwLjAwMiAtIEZpeCBidWcgd2l0aCB0d19zZXRmZWF0dXJlKCkgY2FsbCB0aGF0IGNhdXNlZCBvb3BzIG9uIHNvbWUKKyAgICAgICAgICAgICAgICAgc3lzdGVtcy4KKyAgIDA4LzIxLzAwICAgIC0gcmVsZWFzZSBwcmV2aW91c2x5IGFsbG9jYXRlZCByZXNvdXJjZXMgb24gZmFpbHVyZSBhdAorICAgICAgICAgICAgICAgICB0d19hbGxvY2F0ZV9tZW1vcnkgKGFjbWUpCisgICAxLjAyLjAwLjAwMyAtIEZpeCB0d19pbnRlcnJ1cHQoKSB0byByZXBvcnQgZXJyb3IgdG8gc2NzaSBsYXllciB3aGVuCisgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIgc3RhdHVzIGlzIG5vbi16ZXJvLgorICAgICAgICAgICAgICAgICBBZGRlZCBoYW5kbGluZyBvZiByZXF1ZXN0X3NlbnNlIG9wY29kZS4KKyAgICAgICAgICAgICAgICAgRml4IHBvc3NpYmxlIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZSBpbiAKKyAgICAgICAgICAgICAgICAgdHdfcmVzZXRfZGV2aWNlX2V4dGVuc2lvbigpCisgICAxLjAyLjAwLjAwNCAtIEFkZCBzdXBwb3J0IGZvciBkZXZpY2UgaWQgb2YgM3dhcmUgNzAwMCBzZXJpZXMgY29udHJvbGxlcnMuCisgICAgICAgICAgICAgICAgIE1ha2UgdHdfc2V0ZmVhdHVyZSgpIGNhbGwgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICBSZWdpc3RlciBpbnRlcnJ1cHQgaGFuZGxlciBiZWZvcmUgZW5hYmxpbmcgaW50ZXJydXB0cy4KKyAgICAgICAgICAgICAgICAgQ2xlYXIgYXR0ZW50aW9uIGludGVycnVwdCBiZWZvcmUgZHJhaW5pbmcgYWVuIHF1ZXVlLgorICAgMS4wMi4wMC4wMDUgLSBBbGxvY2F0ZSBib3VuY2UgYnVmZmVycyBhbmQgY3VzdG9tIHF1ZXVlIGRlcHRoIGZvciByYWlkNSBmb3IKKyAgICAgICAgICAgICAgICAgNjAwMCBhbmQgNTAwMCBzZXJpZXMgY29udHJvbGxlcnMuCisgICAgICAgICAgICAgICAgIFJlZHVjZSBwb2xsaW5nIG1kZWxheXMgY2F1c2luZyBwcm9ibGVtcyBvbiBzb21lIHN5c3RlbXMuCisgICAgICAgICAgICAgICAgIEZpeCB1c2Vfc2cgPSAxIGNhbGN1bGF0aW9uIGJ1Zy4KKyAgICAgICAgICAgICAgICAgQ2hlY2sgZm9yIHNjc2lfcmVnaXN0ZXIgcmV0dXJuaW5nIE5VTEwuCisgICAgICAgICAgICAgICAgIEFkZCBhZW4gY291bnQgdG8gL3Byb2Mvc2NzaS8zdy14eHh4LgorICAgICAgICAgICAgICAgICBSZW1vdmUgYWVuIGNvZGUgdW5pdCBtYXNraW5nIGluIHR3X2Flbl9jb21wbGV0ZSgpLgorICAgMS4wMi4wMC4wMDYgLSBSZW1vdmUgdW5pdCBmcm9tIHByaW50ayBpbiB0d19zY3NpX2VoX2Fib3J0KCksIGNhdXNpbmcKKyAgICAgICAgICAgICAgICAgcG9zc2libGUgb29wcy4KKyAgICAgICAgICAgICAgICAgRml4IHBvc3NpYmxlIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZSBpbiB0d19zY3NpX3F1ZXVlKCkKKyAgICAgICAgICAgICAgICAgaWYgZG9uZSBmdW5jdGlvbiBwb2ludGVyIHdhcyBpbnZhbGlkLgorICAgMS4wMi4wMC4wMDcgLSBGaXggcG9zc2libGUgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlcyBpbiB0d19pb2N0bCgpLgorICAgICAgICAgICAgICAgICBSZW1vdmUgY2hlY2sgZm9yIGludmFsaWQgZG9uZSBmdW5jdGlvbiBwb2ludGVyIGZyb20KKyAgICAgICAgICAgICAgICAgdHdfc2NzaV9xdWV1ZSgpLgorICAgMS4wMi4wMC4wMDggLSBTZXQgbWF4IHNlY3RvcnMgcGVyIGlvIHRvIFRXX01BWF9TRUNUT1JTIGluIHR3X2ZpbmRjYXJkcygpLgorICAgICAgICAgICAgICAgICBBZGQgdHdfZGVjb2RlX2Vycm9yKCkgZm9yIHByaW50aW5nIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2VzLgorICAgICAgICAgICAgICAgICBQcmludCBzb21lIHVzZWZ1bCBpbmZvcm1hdGlvbiBvbiBjZXJ0YWluIGFlbiBjb2Rlcy4KKyAgICAgICAgICAgICAgICAgQWRkIHR3X2RlY29kZV9iaXRzKCkgZm9yIGludGVycHJldGluZyBzdGF0dXMgcmVnaXN0ZXIgb3V0cHV0LgorICAgICAgICAgICAgICAgICBNYWtlIHNjc2lfc2V0X3BjaV9kZXZpY2UoKSBmb3Iga2VybmVscyA+PSAyLjQuNAorICAgICAgICAgICAgICAgICBGaXggYnVnIHdoZXJlIGFlbidzIGNvdWxkIGJlIGxvc3QgYmVmb3JlIGEgcmVzZXQuCisgICAgICAgICAgICAgICAgIFJlLWFkZCBzcGlubG9ja3MgaW4gdHdfc2NzaV9kZXRlY3QoKS4KKyAgICAgICAgICAgICAgICAgRml4IHBvc3NpYmxlIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZSBpbiB0d19hZW5fZHJhaW5fcXVldWUoKQorICAgICAgICAgICAgICAgICBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgICAgICAgICAgICAgICAgIENsZWFyIHBjaSBwYXJpdHkgZXJyb3JzIGR1cmluZyBpbml0aWFsaXphdGlvbiBhbmQgZHVyaW5nIGlvLgorICAgMS4wMi4wMC4wMDkgLSBSZW1vdmUgcmVkdW5kYW50IGluY3JlbWVudCBpbiB0d19zdGF0ZV9yZXF1ZXN0X3N0YXJ0KCkuCisgICAgICAgICAgICAgICAgIEFkZCBpb2N0bCBzdXBwb3J0IGZvciBkaXJlY3QgQVRBIGNvbW1hbmQgcGFzc3RocnUuCisgICAgICAgICAgICAgICAgIEFkZCBlbnRpcmUgYWVuIGNvZGUgc3RyaW5nIGxpc3QuCisgICAxLjAyLjAwLjAxMCAtIENsZWFudXAgcXVldWVpbmcgY29kZSwgZml4IGpib2QgdGhvdWdocHV0LgorICAgICAgICAgICAgICAgICBGaXggZ2V0X3BhcmFtIGZvciBzcGVjaWZpYyB1bml0cy4KKyAgIDEuMDIuMDAuMDExIC0gRml4IGJ1ZyBpbiB0d19hZW5fY29tcGxldGUoKSB3aGVyZSBhZW4ncyBjb3VsZCBiZSBsb3N0LgorICAgICAgICAgICAgICAgICBGaXggdHdfYWVuX2RyYWluX3F1ZXVlKCkgdG8gZGlzcGxheSB1c2VmdWwgaW5mbyBhdCBpbml0LgorICAgICAgICAgICAgICAgICBTZXQgdHdfaG9zdC0+bWF4X2lkIGZvciAxMiBwb3J0IGNhcmRzLgorICAgICAgICAgICAgICAgICBBZGQgaW9jdGwgc3VwcG9ydCBmb3IgcmF3IGNvbW1hbmQgcGFja2V0IHBvc3QgZnJvbSB1c2Vyc3BhY2UKKyAgICAgICAgICAgICAgICAgd2l0aCBzZ2xpc3QgZnJhZ21lbnRzIChwYXJhbWV0ZXIgYW5kIGlvKS4KKyAgIDEuMDIuMDAuMDEyIC0gRml4IHJlYWQgY2FwYWNpdHkgdG8gdW5kZXIgcmVwb3J0IGJ5IDEgc2VjdG9yIHRvIGZpeCBnZXQKKyAgICAgICAgICAgICAgICAgbGFzdCBzZWN0b3IgaW9jdGwuCisgICAxLjAyLjAwLjAxMyAtIEZpeCBidWcgd2hlcmUgbW9yZSBBRU4gY29kZXMgd2VyZW4ndCBjb21pbmcgb3V0IGR1cmluZworICAgICAgICAgICAgICAgICBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCisgICAgICAgICAgICAgICAgIEltcHJvdmVkIGhhbmRsaW5nIG9mIFBDSSBhYm9ydHMuCisgICAxLjAyLjAwLjAxNCAtIEZpeCBidWcgaW4gdHdfZmluZGNhcmRzKCkgd2hlcmUgQUVOIGNvZGUgY291bGQgYmUgbG9zdC4KKyAgICAgICAgICAgICAgICAgSW5jcmVhc2UgdGltZW91dCBpbiB0d19hZW5fZHJhaW5fcXVldWUoKSB0byAzMCBzZWNvbmRzLgorICAgMS4wMi4wMC4wMTUgLSBSZS13cml0ZSByYXcgY29tbWFuZCBwb3N0IHdpdGggZGF0YSBpb2N0bCBtZXRob2QuCisgICAgICAgICAgICAgICAgIFJlbW92ZSByYWlkNSBib3VuY2UgYnVmZmVycyBmb3IgcmFpZDUgZm9yIDZYWFggZm9yIGtlcm5lbCAyLjUKKyAgICAgICAgICAgICAgICAgQWRkIHR3X21hcC91bm1hcF9zY3NpX3NnL3NpbmdsZV9kYXRhKCkgZm9yIGtlcm5lbCAyLjUKKyAgICAgICAgICAgICAgICAgUmVwbGFjZSBpb19yZXF1ZXN0X2xvY2sgd2l0aCBob3N0X2xvY2sgZm9yIGtlcm5lbCAyLjUKKyAgICAgICAgICAgICAgICAgU2V0IG1heF9jbWRfbGVuIHRvIDE2IGZvciAzZG0gZm9yIGtlcm5lbCAyLjUKKyAgIDEuMDIuMDAuMDE2IC0gU2V0IGhvc3QtPm1heF9zZWN0b3JzIGJhY2sgdXAgdG8gMjU2LgorICAgMS4wMi4wMC4wMTcgLSBNb2RpZmllZCBwY2kgcGFyaXR5IGVycm9yIGhhbmRsaW5nL2NsZWFyaW5nIGZyb20gY29uZmlnIHNwYWNlCisgICAgICAgICAgICAgICAgIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAgIDEuMDIuMDAuMDE4IC0gQmV0dGVyIGhhbmRsaW5nIG9mIHJlcXVlc3Qgc2Vuc2Ugb3Bjb2RlIGFuZCBzZW5zZSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICBmb3IgZmFpbGVkIGNvbW1hbmRzLiAgQWRkIHR3X2RlY29kZV9zZW5zZSgpLgorICAgICAgICAgICAgICAgICBSZXBsYWNlIGFsbCBtZGVsYXkoKSdzIHdpdGggc2NzaV9zbGVlcCgpLgorICAgMS4wMi4wMC4wMTkgLSBSZXZlcnQgbWRlbGF5J3MgYW5kIHNjc2lfc2xlZXAncywgdGhpcyBjYXVzZWQgcHJvYmxlbXMgb24KKyAgICAgICAgICAgICAgICAgc29tZSBTTVAgc3lzdGVtcy4KKyAgIDEuMDIuMDAuMDIwIC0gQWRkIHBjaV9zZXRfZG1hX21hc2soKSwgcmV3cml0ZSBrbWFsbG9jKCkvdmlydF90b19idXMoKSB0bworICAgICAgICAgICAgICAgICBwY2lfYWxsb2MvZnJlZV9jb25zaXN0ZW50KCkuCisgICAgICAgICAgICAgICAgIEJldHRlciBhbGlnbm1lbnQgY2hlY2tpbmcgaW4gdHdfYWxsb2NhdGVfbWVtb3J5KCkuCisgICAgICAgICAgICAgICAgIENsZWFudXAgdHdfaW5pdGlhbGl6ZV9kZXZpY2VfZXh0ZW5zaW9uKCkuCisgICAxLjAyLjAwLjAyMSAtIEJ1bXAgY21kX3Blcl9sdW4gaW4gU0hUIHRvIDI1NSBmb3IgYmV0dGVyIGpib2QgcGVyZm9ybWFuY2UuCisgICAgICAgICAgICAgICAgIEltcHJvdmUgaGFuZGxpbmcgb2YgZXJyb3JzIGluIHR3X2ludGVycnVwdCgpLgorICAgICAgICAgICAgICAgICBBZGQgaGFuZGxpbmcvY2xlYXJpbmcgb2YgY29udHJvbGxlciBxdWV1ZSBlcnJvci4KKyAgICAgICAgICAgICAgICAgRW1wdHkgc3RhbGUgcmVzcG9uc2VzIGJlZm9yZSBkcmFpbmluZyBhZW4gcXVldWUuCisgICAgICAgICAgICAgICAgIEZpeCB0d19zY3NpX2VoX2Fib3J0KCkgdG8gbm90IHJlc2V0IG9uIGV2ZXJ5IGlvIGFib3J0LgorICAgICAgICAgICAgICAgICBTZXQgY2FuX3F1ZXVlIGluIFNIVCB0byAyNTUgdG8gcHJldmVudCBoYW5nIGZyb20gQUVOLgorICAgMS4wMi4wMC4wMjIgLSBGaXggcG9zc2libGUgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlIGluIHR3X3Njc2lfcmVsZWFzZSgpLgorICAgMS4wMi4wMC4wMjMgLSBGaXggYnVnIGluIHR3X2Flbl9kcmFpbl9xdWV1ZSgpIHdoZXJlIHVuaXQgIyB3YXMgYWx3YXlzIHplcm8uCisgICAxLjAyLjAwLjAyNCAtIEFkZCBzZXZlcml0eSBsZXZlbHMgdG8gQUVOIHN0cmluZ3MuCisgICAxLjAyLjAwLjAyNSAtIEZpeCBjb21tYW5kIGludGVycnVwdCBzcHVyaW91cyBlcnJvciBtZXNzYWdlcy4KKyAgICAgICAgICAgICAgICAgRml4IGJ1ZyBpbiByYXcgY29tbWFuZCBwb3N0IHdpdGggZGF0YSBpb2N0bCBtZXRob2QuCisgICAgICAgICAgICAgICAgIEZpeCBidWcgd2hlcmUgcm9sbGNhbGwgc29tZXRpbWVzIGZhaWxlZCB3aXRoIGNhYmxlIGVycm9ycy4KKyAgICAgICAgICAgICAgICAgUHJpbnQgdW5pdCAjIG9uIGFsbCBjb21tYW5kIHRpbWVvdXRzLgorICAgMS4wMi4wMC4wMjYgLSBGaXggcG9zc2libGUgaW5maW5pdGUgcmV0cnkgYnVnIHdpdGggcG93ZXIgZ2xpdGNoIGluZHVjZWQKKyAgICAgICAgICAgICAgICAgZHJpdmUgdGltZW91dHMuCisgICAgICAgICAgICAgICAgIENsZWFudXAgc29tZSBBRU4gc2V2ZXJpdHkgbGV2ZWxzLgorICAgMS4wMi4wMC4wMjcgLSBBZGQgZHJpdmUgbm90IHN1cHBvcnRlZCBBRU4gY29kZSBmb3IgU0FUQSBjb250cm9sbGVycy4KKyAgICAgICAgICAgICAgICAgUmVtb3ZlIHNwdXJpb3VzIHVua25vd24gaW9jdGwgZXJyb3IgbWVzc2FnZS4KKyAgIDEuMDIuMDAuMDI4IC0gRml4IGJ1ZyB3aGVyZSBtdWx0aXBsZSBjb250cm9sbGVycyB3aXRoIG5vIHVuaXRzIHdlcmUgdGhlCisgICAgICAgICAgICAgICAgIHNhbWUgY2FyZCBudW1iZXIuCisgICAgICAgICAgICAgICAgIEZpeCBidWcgd2hlcmUgY2FyZHMgd2VyZSBiZWluZyBzaHV0IGRvd24gbW9yZSB0aGFuIG9uY2UuCisgICAxLjAyLjAwLjAyOSAtIEFkZCBtaXNzaW5nIHBjaV9mcmVlX2NvbnNpc3RlbnQoKSBpbiB0d19hbGxvY2F0ZV9tZW1vcnkoKS4KKyAgICAgICAgICAgICAgICAgUmVwbGFjZSBwY2lfbWFwX3NpbmdsZSgpIHdpdGggcGNpX21hcF9wYWdlKCkgZm9yIGhpZ2htZW0uCisgICAgICAgICAgICAgICAgIENoZWNrIGZvciB0d19zZXRmZWF0dXJlKCkgZmFpbHVyZS4KKyAgIDEuMDIuMDAuMDMwIC0gTWFrZSBkcml2ZXIgNjQtYml0IGNsZWFuLgorICAgMS4wMi4wMC4wMzEgLSBDbGVhbnVwIHBvbGxpbmcgdGltZW91dHMvcm91dGluZXMgaW4gc2V2ZXJhbCBwbGFjZXMuCisgICAgICAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBtb2RlIHNlbnNlIG9wY29kZS4KKyAgICAgICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIGNhY2hlIG1vZGUgcGFnZS4KKyAgICAgICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIHN5bmNocm9uaXplIGNhY2hlIG9wY29kZS4KKyAgIDEuMDIuMDAuMDMyIC0gRml4IHNtYWxsIG11bHRpY2FyZCByb2xsY2FsbCBidWcuCisgICAgICAgICAgICAgICAgIE1ha2UgZHJpdmVyIHN0YXkgbG9hZGVkIHdpdGggbm8gdW5pdHMgZm9yIGhvdCBhZGQvc3dhcC4KKyAgICAgICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yICJ0d2UiIGNoYXJhY3RlciBkZXZpY2UgZm9yIGlvY3Rscy4KKyAgICAgICAgICAgICAgICAgQ2xlYW4gdXAgcmVxdWVzdF9pZCBxdWV1ZWluZyBjb2RlLgorICAgICAgICAgICAgICAgICBGaXggdHdfc2NzaV9xdWV1ZSgpIHNwaW5sb2Nrcy4KKyAgIDEuMDIuMDAuMDMzIC0gRml4IHR3X2Flbl9jb21wbGV0ZSgpIHRvIG5vdCBxdWV1ZSAncXVldWUgZW1wdHknIEFFTidzLgorICAgICAgICAgICAgICAgICBJbml0aWFsaXplIHF1ZXVlcyBjb3JyZWN0bHkgd2hlbiBsb2FkaW5nIHdpdGggbm8gdmFsaWQgdW5pdHMuCisgICAxLjAyLjAwLjAzNCAtIEZpeCB0d19kZWNvZGVfYml0cygpIHRvIGhhbmRsZSBtdWx0aXBsZSBlcnJvcnMuCisgICAgICAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciB1c2VyIGNvbmZpZ3VyYWJsZSBjbWRfcGVyX2x1bi4KKyAgICAgICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIHNodC0+c2xhdmVfY29uZmlndXJlKCkuCisgICAxLjAyLjAwLjAzNSAtIEltcHJvdmUgdHdfYWxsb2NhdGVfbWVtb3J5KCkgbWVtb3J5IGFsbG9jYXRpb24uCisgICAgICAgICAgICAgICAgIEZpeCB0d19jaHJkZXZfaW9jdGwoKSB0byBzbGVlcCBjb3JyZWN0bHkuCisgICAxLjAyLjAwLjAzNiAtIEluY3JlYXNlIGNoYXJhY3RlciBpb2N0bCB0aW1lb3V0IHRvIDYwIHNlY29uZHMuCisgICAxLjAyLjAwLjAzNyAtIEZpeCB0d19pb2N0bCgpIHRvIGhhbmRsZSBhbGwgbm9uLWRhdGEgQVRBIHBhc3N0aHJ1IGNtZHMKKyAgICAgICAgICAgICAgICAgZm9yICdzbWFydG1vbnRvb2xzJyBzdXBwb3J0LgorICAgMS4yNi4wMC4wMzggLSBSb2xsIGRyaXZlciBtaW5vciB2ZXJzaW9uIHRvIDI2IHRvIGRlbm90ZSBrZXJuZWwgMi42LgorICAgICAgICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgY21kc19wZXJfbHVuIG1vZHVsZSBwYXJhbWV0ZXIuCisgICAxLjI2LjAwLjAzOSAtIEZpeCBidWcgaW4gdHdfY2hyZGV2X2lvY3RsKCkgcG9sbGluZyBjb2RlLgorICAgICAgICAgICAgICAgICBGaXggZGF0YV9idWZmZXJfbGVuZ3RoIHVzYWdlIGluIHR3X2NocmRldl9pb2N0bCgpLgorICAgICAgICAgICAgICAgICBVcGRhdGUgY29udGFjdCBpbmZvcm1hdGlvbi4KKyAgIDEuMjYuMDIuMDAwIC0gQ29udmVydCBkcml2ZXIgdG8gcGNpX2RyaXZlciBmb3JtYXQuCisgICAxLjI2LjAyLjAwMSAtIEluY3JlYXNlIG1heCBpb2N0bCBidWZmZXIgc2l6ZSB0byA1MTIgc2VjdG9ycy4KKyAgICAgICAgICAgICAgICAgTWFrZSB0d19zY3NpX3F1ZXVlKCkgcmV0dXJuIDAgZm9yICdVbmtub3duIHNjc2kgb3Bjb2RlJy4KKyAgICAgICAgICAgICAgICAgRml4IHR3X3JlbW92ZSgpIHRvIGZyZWUgaXJxIGhhbmRsZXIvdW5yZWdpc3Rlcl9jaHJkZXYoKQorICAgICAgICAgICAgICAgICBiZWZvcmUgc2h1dHRpbmcgZG93biBjYXJkLgorICAgICAgICAgICAgICAgICBDaGFuZ2UgdG8gbmV3ICdjaGFuZ2VfcXVldWVfZGVwdGgnIGFwaS4KKyAgICAgICAgICAgICAgICAgRml4ICdoYW5kbGVkPTEnIElTUiB1c2FnZSwgcmVtb3ZlIGJvZ3VzIElSUSBjaGVjay4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSAiM3cteHh4eC5oIgorCisvKiBHbG9iYWxzICovCisjZGVmaW5lIFRXX0RSSVZFUl9WRVJTSU9OICIxLjI2LjAyLjAwMSIKK3N0YXRpYyBUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXZpY2VfZXh0ZW5zaW9uX2xpc3RbVFdfTUFYX1NMT1RdOworc3RhdGljIGludCB0d19kZXZpY2VfZXh0ZW5zaW9uX2NvdW50ID0gMDsKK3N0YXRpYyBpbnQgdHdlX21ham9yID0gLTE7CisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCitNT0RVTEVfQVVUSE9SKCJBTUNDIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIjN3YXJlIFN0b3JhZ2UgQ29udHJvbGxlciBMaW51eCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFRXX0RSSVZFUl9WRVJTSU9OKTsKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworc3RhdGljIGludCB0d19yZXNldF9kZXZpY2VfZXh0ZW5zaW9uKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IGlvY3RsX3Jlc2V0KTsKKworLyogRnVuY3Rpb25zICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGVjayB0aGUgc3RhdHVzIHJlZ2lzdGVyIGZvciB1bmV4cGVjdGVkIGJpdHMgKi8KK3N0YXRpYyBpbnQgdHdfY2hlY2tfYml0cyh1MzIgc3RhdHVzX3JlZ192YWx1ZSkKK3sKKwlpZiAoKHN0YXR1c19yZWdfdmFsdWUgJiBUV19TVEFUVVNfRVhQRUNURURfQklUUykgIT0gVFdfU1RBVFVTX0VYUEVDVEVEX0JJVFMpIHsgIAorCQlkcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfY2hlY2tfYml0cygpOiBObyBleHBlY3RlZCBiaXRzICgweCV4KS5cbiIsIHN0YXR1c19yZWdfdmFsdWUpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1VORVhQRUNURURfQklUUykgIT0gMCkgeworCQlkcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfY2hlY2tfYml0cygpOiBGb3VuZCB1bmV4cGVjdGVkIGJpdHMgKDB4JXgpLlxuIiwgc3RhdHVzX3JlZ192YWx1ZSk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfSAvKiBFbmQgdHdfY2hlY2tfYml0cygpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBwcmludCByZWFkYWJsZSBtZXNzYWdlcyBmcm9tIHN0YXR1cyByZWdpc3RlciBlcnJvcnMgKi8KK3N0YXRpYyBpbnQgdHdfZGVjb2RlX2JpdHMoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCB1MzIgc3RhdHVzX3JlZ192YWx1ZSwgaW50IHByaW50X2hvc3QpCit7CisJY2hhciBob3N0WzE2XTsKKworCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19kZWNvZGVfYml0cygpXG4iKTsKKworCWlmIChwcmludF9ob3N0KQorCQlzcHJpbnRmKGhvc3QsICIgc2NzaSVkOiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubyk7CisJZWxzZQorCQlob3N0WzBdID0gJ1wwJzsKKworCWlmIChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1BDSV9QQVJJVFlfRVJST1IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDolcyBQQ0kgUGFyaXR5IEVycm9yOiBjbGVhcmluZy5cbiIsIGhvc3QpOworCQlvdXRsKFRXX0NPTlRST0xfQ0xFQVJfUEFSSVRZX0VSUk9SLCBUV19DT05UUk9MX1JFR19BRERSKHR3X2RldikpOworCX0KKworCWlmIChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1BDSV9BQk9SVCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiVzIFBDSSBBYm9ydDogY2xlYXJpbmcuXG4iLCBob3N0KTsKKwkJb3V0bChUV19DT05UUk9MX0NMRUFSX1BDSV9BQk9SVCwgVFdfQ09OVFJPTF9SRUdfQUREUih0d19kZXYpKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHR3X2Rldi0+dHdfcGNpX2RldiwgUENJX1NUQVRVUywgVFdfUENJX0NMRUFSX1BDSV9BQk9SVCk7CisJfQorCisJaWYgKHN0YXR1c19yZWdfdmFsdWUgJiBUV19TVEFUVVNfUVVFVUVfRVJST1IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDolcyBDb250cm9sbGVyIFF1ZXVlIEVycm9yOiBjbGVhcmluZy5cbiIsIGhvc3QpOworCQlvdXRsKFRXX0NPTlRST0xfQ0xFQVJfUVVFVUVfRVJST1IsIFRXX0NPTlRST0xfUkVHX0FERFIodHdfZGV2KSk7CisJfQorCisJaWYgKHN0YXR1c19yZWdfdmFsdWUgJiBUV19TVEFUVVNfU0JVRl9XUklURV9FUlJPUikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiVzIFNCVUYgV3JpdGUgRXJyb3I6IGNsZWFyaW5nLlxuIiwgaG9zdCk7CisJCW91dGwoVFdfQ09OVFJPTF9DTEVBUl9TQlVGX1dSSVRFX0VSUk9SLCBUV19DT05UUk9MX1JFR19BRERSKHR3X2RldikpOworCX0KKworCWlmIChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX01JQ1JPQ09OVFJPTExFUl9FUlJPUikgeworCQlpZiAodHdfZGV2LT5yZXNldF9wcmludCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiVzIE1pY3JvY29udHJvbGxlciBFcnJvcjogY2xlYXJpbmcuXG4iLCBob3N0KTsKKwkJCXR3X2Rldi0+cmVzZXRfcHJpbnQgPSAxOworCQl9CisJCXJldHVybiAxOworCX0KKwkKKwlyZXR1cm4gMDsKK30gLyogRW5kIHR3X2RlY29kZV9iaXRzKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHBvbGwgdGhlIHN0YXR1cyByZWdpc3RlciBmb3IgYSBmbGFnICovCitzdGF0aWMgaW50IHR3X3BvbGxfc3RhdHVzKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgdTMyIGZsYWcsIGludCBzZWNvbmRzKQoreworCXUzMiBzdGF0dXNfcmVnX3ZhbHVlOworCXVuc2lnbmVkIGxvbmcgYmVmb3JlOworCWludCByZXR2YWwgPSAxOworCisJc3RhdHVzX3JlZ192YWx1ZSA9IGlubChUV19TVEFUVVNfUkVHX0FERFIodHdfZGV2KSk7CisJYmVmb3JlID0gamlmZmllczsKKworCWlmICh0d19jaGVja19iaXRzKHN0YXR1c19yZWdfdmFsdWUpKQorCQl0d19kZWNvZGVfYml0cyh0d19kZXYsIHN0YXR1c19yZWdfdmFsdWUsIDApOworCisJd2hpbGUgKChzdGF0dXNfcmVnX3ZhbHVlICYgZmxhZykgIT0gZmxhZykgeworCQlzdGF0dXNfcmVnX3ZhbHVlID0gaW5sKFRXX1NUQVRVU19SRUdfQUREUih0d19kZXYpKTsKKworCQlpZiAodHdfY2hlY2tfYml0cyhzdGF0dXNfcmVnX3ZhbHVlKSkKKwkJCXR3X2RlY29kZV9iaXRzKHR3X2Rldiwgc3RhdHVzX3JlZ192YWx1ZSwgMCk7CisKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgYmVmb3JlICsgSFogKiBzZWNvbmRzKSkKKwkJCWdvdG8gb3V0OworCisJCW1zbGVlcCg1MCk7CisJfQorCXJldHZhbCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3X3BvbGxfc3RhdHVzKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHBvbGwgdGhlIHN0YXR1cyByZWdpc3RlciBmb3IgZGlzYXBwZWFyYW5jZSBvZiBhIGZsYWcgKi8KK3N0YXRpYyBpbnQgdHdfcG9sbF9zdGF0dXNfZ29uZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIHUzMiBmbGFnLCBpbnQgc2Vjb25kcykKK3sKKwl1MzIgc3RhdHVzX3JlZ192YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGJlZm9yZTsKKwlpbnQgcmV0dmFsID0gMTsKKworCXN0YXR1c19yZWdfdmFsdWUgPSBpbmwoVFdfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOworCWJlZm9yZSA9IGppZmZpZXM7CisKKwlpZiAodHdfY2hlY2tfYml0cyhzdGF0dXNfcmVnX3ZhbHVlKSkKKwkJdHdfZGVjb2RlX2JpdHModHdfZGV2LCBzdGF0dXNfcmVnX3ZhbHVlLCAwKTsKKworCXdoaWxlICgoc3RhdHVzX3JlZ192YWx1ZSAmIGZsYWcpICE9IDApIHsKKwkJc3RhdHVzX3JlZ192YWx1ZSA9IGlubChUV19TVEFUVVNfUkVHX0FERFIodHdfZGV2KSk7CisKKwkJaWYgKHR3X2NoZWNrX2JpdHMoc3RhdHVzX3JlZ192YWx1ZSkpCisJCQl0d19kZWNvZGVfYml0cyh0d19kZXYsIHN0YXR1c19yZWdfdmFsdWUsIDApOworCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGJlZm9yZSArIEhaICogc2Vjb25kcykpCisJCQlnb3RvIG91dDsKKworCQltc2xlZXAoNTApOworCX0KKwlyZXR2YWwgPSAwOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d19wb2xsX3N0YXR1c19nb25lKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIGF0dGVtcHQgdG8gcG9zdCBhIGNvbW1hbmQgcGFja2V0IHRvIHRoZSBib2FyZCAqLworc3RhdGljIGludCB0d19wb3N0X2NvbW1hbmRfcGFja2V0KFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJdTMyIHN0YXR1c19yZWdfdmFsdWU7CisJdW5zaWduZWQgbG9uZyBjb21tYW5kX3F1ZV92YWx1ZTsKKworCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Bvc3RfY29tbWFuZF9wYWNrZXQoKVxuIik7CisJY29tbWFuZF9xdWVfdmFsdWUgPSB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3BoeXNpY2FsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisJc3RhdHVzX3JlZ192YWx1ZSA9IGlubChUV19TVEFUVVNfUkVHX0FERFIodHdfZGV2KSk7CisKKwlpZiAodHdfY2hlY2tfYml0cyhzdGF0dXNfcmVnX3ZhbHVlKSkgeworCQlkcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfcG9zdF9jb21tYW5kX3BhY2tldCgpOiBVbmV4cGVjdGVkIGJpdHMuXG4iKTsKKwkJdHdfZGVjb2RlX2JpdHModHdfZGV2LCBzdGF0dXNfcmVnX3ZhbHVlLCAxKTsKKwl9CisKKwlpZiAoKHN0YXR1c19yZWdfdmFsdWUgJiBUV19TVEFUVVNfQ09NTUFORF9RVUVVRV9GVUxMKSA9PSAwKSB7CisJCS8qIFdlIHN1Y2Nlc3NmdWxseSBwb3N0ZWQgdGhlIGNvbW1hbmQgcGFja2V0ICovCisJCW91dGwoY29tbWFuZF9xdWVfdmFsdWUsIFRXX0NPTU1BTkRfUVVFVUVfUkVHX0FERFIodHdfZGV2KSk7CisJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX1BPU1RFRDsKKwkJdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudCsrOworCQlpZiAodHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudCA+IHR3X2Rldi0+bWF4X3Bvc3RlZF9yZXF1ZXN0X2NvdW50KSB7CisJCQl0d19kZXYtPm1heF9wb3N0ZWRfcmVxdWVzdF9jb3VudCA9IHR3X2Rldi0+cG9zdGVkX3JlcXVlc3RfY291bnQ7CisJCX0KKwl9IGVsc2UgeworCQkvKiBDb3VsZG4ndCBwb3N0IHRoZSBjb21tYW5kIHBhY2tldCwgc28gd2UgZG8gaXQgaW4gdGhlIGlzciAqLworCQlpZiAodHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSAhPSBUV19TX1BFTkRJTkcpIHsKKwkJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX1BFTkRJTkc7CisJCQl0d19kZXYtPnBlbmRpbmdfcmVxdWVzdF9jb3VudCsrOworCQkJaWYgKHR3X2Rldi0+cGVuZGluZ19yZXF1ZXN0X2NvdW50ID4gdHdfZGV2LT5tYXhfcGVuZGluZ19yZXF1ZXN0X2NvdW50KSB7CisJCQkJdHdfZGV2LT5tYXhfcGVuZGluZ19yZXF1ZXN0X2NvdW50ID0gdHdfZGV2LT5wZW5kaW5nX3JlcXVlc3RfY291bnQ7CisJCQl9CisJCQl0d19kZXYtPnBlbmRpbmdfcXVldWVbdHdfZGV2LT5wZW5kaW5nX3RhaWxdID0gcmVxdWVzdF9pZDsKKwkJCWlmICh0d19kZXYtPnBlbmRpbmdfdGFpbCA9PSBUV19RX0xFTkdUSC0xKSB7CisJCQkJdHdfZGV2LT5wZW5kaW5nX3RhaWwgPSBUV19RX1NUQVJUOworCQkJfSBlbHNlIHsKKwkJCQl0d19kZXYtPnBlbmRpbmdfdGFpbCA9IHR3X2Rldi0+cGVuZGluZ190YWlsICsgMTsKKwkJCX0KKwkJfSAKKwkJVFdfVU5NQVNLX0NPTU1BTkRfSU5URVJSVVBUKHR3X2Rldik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30gLyogRW5kIHR3X3Bvc3RfY29tbWFuZF9wYWNrZXQoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHZhbGlkIHNlbnNlIGJ1ZmZlciBpbmZvcm1hdGlvbiBmb3IgZmFpbGVkIGNtZHMgKi8KK3N0YXRpYyBpbnQgdHdfZGVjb2RlX3NlbnNlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQsIGludCBmaWxsX3NlbnNlKQoreworCWludCBpOworCVRXX0NvbW1hbmQgKmNvbW1hbmQ7CisKKyAgICAgICAgZHByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2RlY29kZV9zZW5zZSgpXG4iKTsKKwljb21tYW5kID0gKFRXX0NvbW1hbmQgKil0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHNjc2klZDogQ29tbWFuZCBmYWlsZWQ6IHN0YXR1cyA9IDB4JXgsIGZsYWdzID0gMHgleCwgdW5pdCAjJWQuXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8sIGNvbW1hbmQtPnN0YXR1cywgY29tbWFuZC0+ZmxhZ3MsIFRXX1VOSVRfT1VUKGNvbW1hbmQtPnVuaXRfX2hvc3RpZCkpOworCisJLyogQXR0ZW1wdCB0byByZXR1cm4gaW50ZWxsaWdlbnQgc2Vuc2UgaW5mb3JtYXRpb24gKi8KKwlpZiAoZmlsbF9zZW5zZSkgeworCQlpZiAoKGNvbW1hbmQtPnN0YXR1cyA9PSAweGM3KSB8fCAoY29tbWFuZC0+c3RhdHVzID09IDB4Y2IpKSB7CisJCQlmb3IgKGk9MDtpPChzaXplb2YodHdfc2Vuc2VfdGFibGUpL3NpemVvZih0d19zZW5zZV90YWJsZVswXSkpO2krKykgeworCQkJCWlmIChjb21tYW5kLT5mbGFncyA9PSB0d19zZW5zZV90YWJsZVtpXVswXSkgeworCisJCQkJCS8qIFZhbGlkIGJpdCBhbmQgJ2N1cnJlbnQgZXJyb3JzJyAqLworCQkJCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+c2Vuc2VfYnVmZmVyWzBdID0gKDB4MSA8PCA3IHwgMHg3MCk7CisKKwkJCQkJLyogU2Vuc2Uga2V5ICovCisJCQkJCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5zZW5zZV9idWZmZXJbMl0gPSB0d19zZW5zZV90YWJsZVtpXVsxXTsKKworCQkJCQkvKiBBZGRpdGlvbmFsIHNlbnNlIGxlbmd0aCAqLworCQkJCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+c2Vuc2VfYnVmZmVyWzddID0gMHhhOyAvKiAxMCBieXRlcyAqLworCisJCQkJCS8qIEFkZGl0aW9uYWwgc2Vuc2UgY29kZSAqLworCQkJCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+c2Vuc2VfYnVmZmVyWzEyXSA9IHR3X3NlbnNlX3RhYmxlW2ldWzJdOworCisJCQkJCS8qIEFkZGl0aW9uYWwgc2Vuc2UgY29kZSBxdWFsaWZpZXIgKi8KKwkJCQkJdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnNlbnNlX2J1ZmZlclsxM10gPSB0d19zZW5zZV90YWJsZVtpXVszXTsKKworCQkJCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCAoQ0hFQ0tfQ09ORElUSU9OIDw8IDEpOworCQkJCQlyZXR1cm4gVFdfSVNSX0RPTlRfUkVTVUxUOyAvKiBTcGVjaWFsIGNhc2UgZm9yIGlzciB0byBub3Qgb3Zlci13cml0ZSByZXN1bHQgKi8KKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBJZiBubyB0YWJsZSBtYXRjaCwgZXJyb3Igc28gd2UgZ2V0IGEgcmVzZXQgKi8KKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19kZWNvZGVfc2Vuc2UoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVwb3J0IGNvbnRyb2xsZXIgZXJyb3Igc3RhdHVzICovCitzdGF0aWMgaW50IHR3X2NoZWNrX2Vycm9ycyhUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYpIAoreworCXUzMiBzdGF0dXNfcmVnX3ZhbHVlOworICAKKwlzdGF0dXNfcmVnX3ZhbHVlID0gaW5sKFRXX1NUQVRVU19SRUdfQUREUih0d19kZXYpKTsKKworCWlmIChUV19TVEFUVVNfRVJST1JTKHN0YXR1c19yZWdfdmFsdWUpIHx8IHR3X2NoZWNrX2JpdHMoc3RhdHVzX3JlZ192YWx1ZSkpIHsKKwkJdHdfZGVjb2RlX2JpdHModHdfZGV2LCBzdGF0dXNfcmVnX3ZhbHVlLCAwKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19jaGVja19lcnJvcnMoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZW1wdHkgdGhlIHJlc3BvbnNlIHF1ZSAqLworc3RhdGljIHZvaWQgdHdfZW1wdHlfcmVzcG9uc2VfcXVlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldikgCit7CisJdTMyIHN0YXR1c19yZWdfdmFsdWUsIHJlc3BvbnNlX3F1ZV92YWx1ZTsKKworCXN0YXR1c19yZWdfdmFsdWUgPSBpbmwoVFdfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOworCisJd2hpbGUgKChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1JFU1BPTlNFX1FVRVVFX0VNUFRZKSA9PSAwKSB7CisJCXJlc3BvbnNlX3F1ZV92YWx1ZSA9IGlubChUV19SRVNQT05TRV9RVUVVRV9SRUdfQUREUih0d19kZXYpKTsKKwkJc3RhdHVzX3JlZ192YWx1ZSA9IGlubChUV19TVEFUVVNfUkVHX0FERFIodHdfZGV2KSk7CisJfQorfSAvKiBFbmQgdHdfZW1wdHlfcmVzcG9uc2VfcXVlKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIGZyZWUgYSByZXF1ZXN0X2lkICovCitzdGF0aWMgdm9pZCB0d19zdGF0ZV9yZXF1ZXN0X2ZpbmlzaChUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkKQoreworCXR3X2Rldi0+ZnJlZV9xdWV1ZVt0d19kZXYtPmZyZWVfdGFpbF0gPSByZXF1ZXN0X2lkOworCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0ZJTklTSEVEOworCXR3X2Rldi0+ZnJlZV90YWlsID0gKHR3X2Rldi0+ZnJlZV90YWlsICsgMSkgJSBUV19RX0xFTkdUSDsKK30gLyogRW5kIHR3X3N0YXRlX3JlcXVlc3RfZmluaXNoKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIGFzc2lnbiBhbiBhdmFpbGFibGUgcmVxdWVzdF9pZCAqLworc3RhdGljIHZvaWQgdHdfc3RhdGVfcmVxdWVzdF9zdGFydChUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCAqcmVxdWVzdF9pZCkKK3sKKwkqcmVxdWVzdF9pZCA9IHR3X2Rldi0+ZnJlZV9xdWV1ZVt0d19kZXYtPmZyZWVfaGVhZF07CisJdHdfZGV2LT5mcmVlX2hlYWQgPSAodHdfZGV2LT5mcmVlX2hlYWQgKyAxKSAlIFRXX1FfTEVOR1RIOworCXR3X2Rldi0+c3RhdGVbKnJlcXVlc3RfaWRdID0gVFdfU19TVEFSVEVEOworfSAvKiBFbmQgdHdfc3RhdGVfcmVxdWVzdF9zdGFydCgpICovCisKKy8qIFNob3cgc29tZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBjYXJkICovCitzdGF0aWMgc3NpemVfdCB0d19zaG93X3N0YXRzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjbGFzc190b19zaG9zdChjbGFzc19kZXYpOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc3NpemVfdCBsZW47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiM3cteHh4eCBEcml2ZXIgdmVyc2lvbjogJXNcbiIKKwkJICAgICAgICJDdXJyZW50IGNvbW1hbmRzIHBvc3RlZDogICAlNGRcbiIKKwkJICAgICAgICJNYXggY29tbWFuZHMgcG9zdGVkOiAgICAgICAlNGRcbiIKKwkJICAgICAgICJDdXJyZW50IHBlbmRpbmcgY29tbWFuZHM6ICAlNGRcbiIKKwkJICAgICAgICJNYXggcGVuZGluZyBjb21tYW5kczogICAgICAlNGRcbiIKKwkJICAgICAgICJMYXN0IHNnbCBsZW5ndGg6ICAgICAgICAgICAlNGRcbiIKKwkJICAgICAgICJNYXggc2dsIGxlbmd0aDogICAgICAgICAgICAlNGRcbiIKKwkJICAgICAgICJMYXN0IHNlY3RvciBjb3VudDogICAgICAgICAlNGRcbiIKKwkJICAgICAgICJNYXggc2VjdG9yIGNvdW50OiAgICAgICAgICAlNGRcbiIKKwkJICAgICAgICJTQ1NJIEhvc3QgUmVzZXRzOiAgICAgICAgICAlNGRcbiIKKwkJICAgICAgICJBRU4nczogICAgICAgICAgICAgICAgICAgICAlNGRcbiIsIAorCQkgICAgICAgVFdfRFJJVkVSX1ZFUlNJT04sCisJCSAgICAgICB0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50LAorCQkgICAgICAgdHdfZGV2LT5tYXhfcG9zdGVkX3JlcXVlc3RfY291bnQsCisJCSAgICAgICB0d19kZXYtPnBlbmRpbmdfcmVxdWVzdF9jb3VudCwKKwkJICAgICAgIHR3X2Rldi0+bWF4X3BlbmRpbmdfcmVxdWVzdF9jb3VudCwKKwkJICAgICAgIHR3X2Rldi0+c2dsX2VudHJpZXMsCisJCSAgICAgICB0d19kZXYtPm1heF9zZ2xfZW50cmllcywKKwkJICAgICAgIHR3X2Rldi0+c2VjdG9yX2NvdW50LAorCQkgICAgICAgdHdfZGV2LT5tYXhfc2VjdG9yX2NvdW50LAorCQkgICAgICAgdHdfZGV2LT5udW1fcmVzZXRzLAorCQkgICAgICAgdHdfZGV2LT5hZW5fY291bnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbGVuOworfSAvKiBFbmQgdHdfc2hvd19zdGF0cygpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBzZXQgYSBkZXZpY2VzIHF1ZXVlIGRlcHRoICovCitzdGF0aWMgaW50IHR3X2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxdWV1ZV9kZXB0aCkKK3sKKwlpZiAocXVldWVfZGVwdGggPiBUV19RX0xFTkdUSC0yKQorCQlxdWV1ZV9kZXB0aCA9IFRXX1FfTEVOR1RILTI7CisJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RldiwgTVNHX09SREVSRURfVEFHLCBxdWV1ZV9kZXB0aCk7CisJcmV0dXJuIHF1ZXVlX2RlcHRoOworfSAvKiBFbmQgdHdfY2hhbmdlX3F1ZXVlX2RlcHRoKCkgKi8KKworLyogQ3JlYXRlIHN5c2ZzICdzdGF0cycgZW50cnkgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSB0d19ob3N0X3N0YXRzX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0gCSJzdGF0cyIsCisJCS5tb2RlID0JCVNfSVJVR08sCisJfSwKKwkuc2hvdyA9IHR3X3Nob3dfc3RhdHMKK307CisKKy8qIEhvc3QgYXR0cmlidXRlcyBpbml0aWFsaXplciAqLworc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICp0d19ob3N0X2F0dHJzW10gPSB7CisJJnR3X2hvc3Rfc3RhdHNfYXR0ciwKKwlOVUxMLAorfTsKKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHJlYWQgdGhlIGFlbiBxdWV1ZSBmcm9tIHRoZSBpc3IgKi8KK3N0YXRpYyBpbnQgdHdfYWVuX3JlYWRfcXVldWUoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCkgCit7CisJVFdfQ29tbWFuZCAqY29tbWFuZF9wYWNrZXQ7CisJVFdfUGFyYW0gKnBhcmFtOworCXVuc2lnbmVkIGxvbmcgY29tbWFuZF9xdWVfdmFsdWU7CisJdTMyIHN0YXR1c19yZWdfdmFsdWU7CisJdW5zaWduZWQgbG9uZyBwYXJhbV92YWx1ZSA9IDA7CisKKwlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19hZW5fcmVhZF9xdWV1ZSgpXG4iKTsKKworCXN0YXR1c19yZWdfdmFsdWUgPSBpbmwoVFdfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOworCWlmICh0d19jaGVja19iaXRzKHN0YXR1c19yZWdfdmFsdWUpKSB7CisJCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19hZW5fcmVhZF9xdWV1ZSgpOiBVbmV4cGVjdGVkIGJpdHMuXG4iKTsKKwkJdHdfZGVjb2RlX2JpdHModHdfZGV2LCBzdGF0dXNfcmVnX3ZhbHVlLCAxKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICh0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2Flbl9yZWFkX3F1ZXVlKCk6IEJhZCBjb21tYW5kIHBhY2tldCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWNvbW1hbmRfcGFja2V0ID0gKFRXX0NvbW1hbmQgKil0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwltZW1zZXQoY29tbWFuZF9wYWNrZXQsIDAsIHNpemVvZihUV19TZWN0b3IpKTsKKwljb21tYW5kX3BhY2tldC0+b3Bjb2RlX19zZ2xvZmZzZXQgPSBUV19PUFNHTF9JTigyLCBUV19PUF9HRVRfUEFSQU0pOworCWNvbW1hbmRfcGFja2V0LT5zaXplID0gNDsKKwljb21tYW5kX3BhY2tldC0+cmVxdWVzdF9pZCA9IHJlcXVlc3RfaWQ7CisJY29tbWFuZF9wYWNrZXQtPnN0YXR1cyA9IDA7CisJY29tbWFuZF9wYWNrZXQtPmZsYWdzID0gMDsKKwljb21tYW5kX3BhY2tldC0+Ynl0ZTYucGFyYW1ldGVyX2NvdW50ID0gMTsKKwljb21tYW5kX3F1ZV92YWx1ZSA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfcGh5c2ljYWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAoY29tbWFuZF9xdWVfdmFsdWUgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19hZW5fcmVhZF9xdWV1ZSgpOiBCYWQgY29tbWFuZCBwYWNrZXQgcGh5c2ljYWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJLyogTm93IHNldHVwIHRoZSBwYXJhbSAqLworCWlmICh0d19kZXYtPmFsaWdubWVudF92aXJ0dWFsX2FkZHJlc3NbcmVxdWVzdF9pZF0gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19hZW5fcmVhZF9xdWV1ZSgpOiBCYWQgYWxpZ25tZW50IHZpcnR1YWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJcGFyYW0gPSAoVFdfUGFyYW0gKil0d19kZXYtPmFsaWdubWVudF92aXJ0dWFsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisJbWVtc2V0KHBhcmFtLCAwLCBzaXplb2YoVFdfU2VjdG9yKSk7CisJcGFyYW0tPnRhYmxlX2lkID0gMHg0MDE7IC8qIEFFTiB0YWJsZSAqLworCXBhcmFtLT5wYXJhbWV0ZXJfaWQgPSAyOyAvKiBVbml0IGNvZGUgKi8KKwlwYXJhbS0+cGFyYW1ldGVyX3NpemVfYnl0ZXMgPSAyOworCXBhcmFtX3ZhbHVlID0gdHdfZGV2LT5hbGlnbm1lbnRfcGh5c2ljYWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAocGFyYW1fdmFsdWUgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19hZW5fcmVhZF9xdWV1ZSgpOiBCYWQgYWxpZ25tZW50IHBoeXNpY2FsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWNvbW1hbmRfcGFja2V0LT5ieXRlOC5wYXJhbS5zZ2xbMF0uYWRkcmVzcyA9IHBhcmFtX3ZhbHVlOworCWNvbW1hbmRfcGFja2V0LT5ieXRlOC5wYXJhbS5zZ2xbMF0ubGVuZ3RoID0gc2l6ZW9mKFRXX1NlY3Rvcik7CisKKwkvKiBOb3cgcG9zdCB0aGUgY29tbWFuZCBwYWNrZXQgKi8KKwlpZiAoKHN0YXR1c19yZWdfdmFsdWUgJiBUV19TVEFUVVNfQ09NTUFORF9RVUVVRV9GVUxMKSA9PSAwKSB7CisJCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19hZW5fcmVhZF9xdWV1ZSgpOiBQb3N0IHN1Y2NlZWRlZC5cbiIpOworCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSA9IE5VTEw7IC8qIEZsYWcgaW50ZXJuYWwgY29tbWFuZCAqLworCQl0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdID0gVFdfU19QT1NURUQ7CisJCW91dGwoY29tbWFuZF9xdWVfdmFsdWUsIFRXX0NPTU1BTkRfUVVFVUVfUkVHX0FERFIodHdfZGV2KSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfYWVuX3JlYWRfcXVldWUoKTogUG9zdCBmYWlsZWQsIHdpbGwgcmV0cnkuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19hZW5fcmVhZF9xdWV1ZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBjb21wbGV0ZSBhbiBhZW4gcmVxdWVzdCBmcm9tIHRoZSBpc3IgKi8KK3N0YXRpYyBpbnQgdHdfYWVuX2NvbXBsZXRlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpIAoreworCVRXX1BhcmFtICpwYXJhbTsKKwl1bnNpZ25lZCBzaG9ydCBhZW47CisJaW50IGVycm9yID0gMCwgdGFibGVfbWF4ID0gMDsKKworCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19hZW5fY29tcGxldGUoKVxuIik7CisJaWYgKHR3X2Rldi0+YWxpZ25tZW50X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2Flbl9jb21wbGV0ZSgpOiBCYWQgYWxpZ25tZW50IHZpcnR1YWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJcGFyYW0gPSAoVFdfUGFyYW0gKil0d19kZXYtPmFsaWdubWVudF92aXJ0dWFsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisJYWVuID0gKih1bnNpZ25lZCBzaG9ydCAqKShwYXJhbS0+ZGF0YSk7CisJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfYWVuX2NvbXBsZXRlKCk6IFF1ZXVlJ2QgY29kZSAweCV4XG4iLCBhZW4pOworCisJLyogUHJpbnQgc29tZSB1c2VmdWwgaW5mbyB3aGVuIGNlcnRhaW4gYWVuIGNvZGVzIGNvbWUgb3V0ICovCisJaWYgKGFlbiA9PSAweDBmZikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBzY3NpJWQ6IEFFTjogSU5GTzogQUVOIHF1ZXVlIG92ZXJmbG93LlxuIiwgdHdfZGV2LT5ob3N0LT5ob3N0X25vKTsKKwl9IGVsc2UgeworCQl0YWJsZV9tYXggPSBzaXplb2YodHdfYWVuX3N0cmluZykvc2l6ZW9mKGNoYXIgKik7CisJCWlmICgoYWVuICYgMHgwZmYpIDwgdGFibGVfbWF4KSB7CisJCQlpZiAoKHR3X2Flbl9zdHJpbmdbYWVuICYgMHhmZl1bc3RybGVuKHR3X2Flbl9zdHJpbmdbYWVuICYgMHhmZl0pLTFdKSA9PSAnIycpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBzY3NpJWQ6IEFFTjogJXMlZC5cbiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubywgdHdfYWVuX3N0cmluZ1thZW4gJiAweGZmXSwgYWVuID4+IDgpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoYWVuICE9IDB4MCkgCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHNjc2klZDogQUVOOiAlcy5cbiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubywgdHdfYWVuX3N0cmluZ1thZW4gJiAweGZmXSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBzY3NpJWQ6IFJlY2VpdmVkIEFFTiAlZC5cbiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubywgYWVuKTsKKwkJfQorCX0KKwlpZiAoYWVuICE9IFRXX0FFTl9RVUVVRV9FTVBUWSkgeworCQl0d19kZXYtPmFlbl9jb3VudCsrOworCisJCS8qIE5vdyBxdWV1ZSB0aGUgY29kZSAqLworCQl0d19kZXYtPmFlbl9xdWV1ZVt0d19kZXYtPmFlbl90YWlsXSA9IGFlbjsKKwkJaWYgKHR3X2Rldi0+YWVuX3RhaWwgPT0gVFdfUV9MRU5HVEggLSAxKSB7CisJCQl0d19kZXYtPmFlbl90YWlsID0gVFdfUV9TVEFSVDsKKwkJfSBlbHNlIHsKKwkJCXR3X2Rldi0+YWVuX3RhaWwgPSB0d19kZXYtPmFlbl90YWlsICsgMTsKKwkJfQorCQlpZiAodHdfZGV2LT5hZW5faGVhZCA9PSB0d19kZXYtPmFlbl90YWlsKSB7CisJCQlpZiAodHdfZGV2LT5hZW5faGVhZCA9PSBUV19RX0xFTkdUSCAtIDEpIHsKKwkJCQl0d19kZXYtPmFlbl9oZWFkID0gVFdfUV9TVEFSVDsKKwkJCX0gZWxzZSB7CisJCQkJdHdfZGV2LT5hZW5faGVhZCA9IHR3X2Rldi0+YWVuX2hlYWQgKyAxOworCQkJfQorCQl9CisKKwkJZXJyb3IgPSB0d19hZW5fcmVhZF9xdWV1ZSh0d19kZXYsIHJlcXVlc3RfaWQpOworCQlpZiAoZXJyb3IpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHNjc2klZDogRXJyb3IgY29tcGxldGluZyBBRU4uXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8pOworCQkJdHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSA9IFRXX1NfQ09NUExFVEVEOworCQkJdHdfc3RhdGVfcmVxdWVzdF9maW5pc2godHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJfQorCX0gZWxzZSB7CisJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJdHdfc3RhdGVfcmVxdWVzdF9maW5pc2godHdfZGV2LCByZXF1ZXN0X2lkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30gLyogRW5kIHR3X2Flbl9jb21wbGV0ZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBkcmFpbiB0aGUgYWVuIHF1ZXVlIGFmdGVyIGEgc29mdCByZXNldCAqLworc3RhdGljIGludCB0d19hZW5fZHJhaW5fcXVldWUoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2KQoreworCVRXX0NvbW1hbmQgKmNvbW1hbmRfcGFja2V0OworCVRXX1BhcmFtICpwYXJhbTsKKwlpbnQgcmVxdWVzdF9pZCA9IDA7CisJdW5zaWduZWQgbG9uZyBjb21tYW5kX3F1ZV92YWx1ZTsKKwl1bnNpZ25lZCBsb25nIHBhcmFtX3ZhbHVlOworCVRXX1Jlc3BvbnNlX1F1ZXVlIHJlc3BvbnNlX3F1ZXVlOworCXVuc2lnbmVkIHNob3J0IGFlbjsKKwl1bnNpZ25lZCBzaG9ydCBhZW5fY29kZTsKKwlpbnQgZmluaXNoZWQgPSAwOworCWludCBmaXJzdF9yZXNldCA9IDA7CisJaW50IHF1ZXVlID0gMDsKKwlpbnQgZm91bmQgPSAwLCB0YWJsZV9tYXggPSAwOworCisJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfYWVuX2RyYWluX3F1ZXVlKClcbiIpOworCisJaWYgKHR3X3BvbGxfc3RhdHVzKHR3X2RldiwgVFdfU1RBVFVTX0FUVEVOVElPTl9JTlRFUlJVUFQgfCBUV19TVEFUVVNfTUlDUk9DT05UUk9MTEVSX1JFQURZLCAzMCkpIHsKKwkJZHByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2Flbl9kcmFpbl9xdWV1ZSgpOiBObyBhdHRlbnRpb24gaW50ZXJydXB0IGZvciBjYXJkICVkLlxuIiwgdHdfZGV2aWNlX2V4dGVuc2lvbl9jb3VudCk7CisJCXJldHVybiAxOworCX0KKwlUV19DTEVBUl9BVFRFTlRJT05fSU5URVJSVVBUKHR3X2Rldik7CisKKwkvKiBFbXB0eSByZXNwb25zZSBxdWV1ZSAqLworCXR3X2VtcHR5X3Jlc3BvbnNlX3F1ZSh0d19kZXYpOworCisJLyogSW5pdGlhbGl6ZSBjb21tYW5kIHBhY2tldCAqLworCWlmICh0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2Flbl9kcmFpbl9xdWV1ZSgpOiBCYWQgY29tbWFuZCBwYWNrZXQgdmlydHVhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAxOworCX0KKwljb21tYW5kX3BhY2tldCA9IChUV19Db21tYW5kICopdHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0dWFsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisJbWVtc2V0KGNvbW1hbmRfcGFja2V0LCAwLCBzaXplb2YoVFdfU2VjdG9yKSk7CisJY29tbWFuZF9wYWNrZXQtPm9wY29kZV9fc2dsb2Zmc2V0ID0gVFdfT1BTR0xfSU4oMiwgVFdfT1BfR0VUX1BBUkFNKTsKKwljb21tYW5kX3BhY2tldC0+c2l6ZSA9IDQ7CisJY29tbWFuZF9wYWNrZXQtPnJlcXVlc3RfaWQgPSByZXF1ZXN0X2lkOworCWNvbW1hbmRfcGFja2V0LT5zdGF0dXMgPSAwOworCWNvbW1hbmRfcGFja2V0LT5mbGFncyA9IDA7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU2LnBhcmFtZXRlcl9jb3VudCA9IDE7CisJY29tbWFuZF9xdWVfdmFsdWUgPSB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3BoeXNpY2FsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisJaWYgKGNvbW1hbmRfcXVlX3ZhbHVlID09IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfYWVuX2RyYWluX3F1ZXVlKCk6IEJhZCBjb21tYW5kIHBhY2tldCBwaHlzaWNhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAxOworCX0KKworCS8qIE5vdyBzZXR1cCB0aGUgcGFyYW0gKi8KKwlpZiAodHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfYWVuX2RyYWluX3F1ZXVlKCk6IEJhZCBhbGlnbm1lbnQgdmlydHVhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAxOworCX0KKwlwYXJhbSA9IChUV19QYXJhbSAqKXR3X2Rldi0+YWxpZ25tZW50X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwltZW1zZXQocGFyYW0sIDAsIHNpemVvZihUV19TZWN0b3IpKTsKKwlwYXJhbS0+dGFibGVfaWQgPSAweDQwMTsgLyogQUVOIHRhYmxlICovCisJcGFyYW0tPnBhcmFtZXRlcl9pZCA9IDI7IC8qIFVuaXQgY29kZSAqLworCXBhcmFtLT5wYXJhbWV0ZXJfc2l6ZV9ieXRlcyA9IDI7CisJcGFyYW1fdmFsdWUgPSB0d19kZXYtPmFsaWdubWVudF9waHlzaWNhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCWlmIChwYXJhbV92YWx1ZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2Flbl9kcmFpbl9xdWV1ZSgpOiBCYWQgYWxpZ25tZW50IHBoeXNpY2FsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWNvbW1hbmRfcGFja2V0LT5ieXRlOC5wYXJhbS5zZ2xbMF0uYWRkcmVzcyA9IHBhcmFtX3ZhbHVlOworCWNvbW1hbmRfcGFja2V0LT5ieXRlOC5wYXJhbS5zZ2xbMF0ubGVuZ3RoID0gc2l6ZW9mKFRXX1NlY3Rvcik7CisKKwkvKiBOb3cgZHJhaW4gdGhlIGNvbnRyb2xsZXIncyBhZW4gcXVldWUgKi8KKwlkbyB7CisJCS8qIFBvc3QgY29tbWFuZCBwYWNrZXQgKi8KKwkJb3V0bChjb21tYW5kX3F1ZV92YWx1ZSwgVFdfQ09NTUFORF9RVUVVRV9SRUdfQUREUih0d19kZXYpKTsKKworCQkvKiBOb3cgcG9sbCBmb3IgY29tcGxldGlvbiAqLworCQlpZiAodHdfcG9sbF9zdGF0dXNfZ29uZSh0d19kZXYsIFRXX1NUQVRVU19SRVNQT05TRV9RVUVVRV9FTVBUWSwgMzApID09IDApIHsKKwkJCXJlc3BvbnNlX3F1ZXVlLnZhbHVlID0gaW5sKFRXX1JFU1BPTlNFX1FVRVVFX1JFR19BRERSKHR3X2RldikpOworCQkJcmVxdWVzdF9pZCA9IFRXX1JFU0lEX09VVChyZXNwb25zZV9xdWV1ZS5yZXNwb25zZV9pZCk7CisKKwkJCWlmIChyZXF1ZXN0X2lkICE9IDApIHsKKwkJCQkvKiBVbmV4cGVjdGVkIHJlcXVlc3QgaWQgKi8KKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19hZW5fZHJhaW5fcXVldWUoKTogVW5leHBlY3RlZCByZXF1ZXN0IGlkLlxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQkKKwkJCWlmIChjb21tYW5kX3BhY2tldC0+c3RhdHVzICE9IDApIHsKKwkJCQlpZiAoY29tbWFuZF9wYWNrZXQtPmZsYWdzICE9IFRXX0FFTl9UQUJMRV9VTkRFRklORUQpIHsKKwkJCQkJLyogQmFkIHJlc3BvbnNlICovCisJCQkJCXR3X2RlY29kZV9zZW5zZSh0d19kZXYsIHJlcXVlc3RfaWQsIDApOworCQkJCQlyZXR1cm4gMTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBXZSBrbm93IHRoaXMgaXMgYSAzdy0xeDAwLCBhbmQgZG9lc24ndCBzdXBwb3J0IGFlbidzICovCisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKworCQkJLyogTm93IGNoZWNrIHRoZSBhZW4gKi8KKwkJCWFlbiA9ICoodW5zaWduZWQgc2hvcnQgKikocGFyYW0tPmRhdGEpOworCQkJYWVuX2NvZGUgPSAoYWVuICYgMHgwZmYpOworCQkJcXVldWUgPSAwOworCQkJc3dpdGNoIChhZW5fY29kZSkgeworCQkJCWNhc2UgVFdfQUVOX1FVRVVFX0VNUFRZOgorCQkJCQlkcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogQUVOOiAlcy5cbiIsIHR3X2Flbl9zdHJpbmdbYWVuICYgMHhmZl0pOworCQkJCQlpZiAoZmlyc3RfcmVzZXQgIT0gMSkgeworCQkJCQkJcmV0dXJuIDE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlmaW5pc2hlZCA9IDE7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUV19BRU5fU09GVF9SRVNFVDoKKwkJCQkJaWYgKGZpcnN0X3Jlc2V0ID09IDApIHsKKwkJCQkJCWZpcnN0X3Jlc2V0ID0gMTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IEFFTjogJXMuXG4iLCB0d19hZW5fc3RyaW5nW2FlbiAmIDB4ZmZdKTsKKwkJCQkJCXR3X2Rldi0+YWVuX2NvdW50Kys7CisJCQkJCQlxdWV1ZSA9IDE7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJaWYgKGFlbiA9PSAweDBmZikgeworCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogQUVOOiBJTkZPOiBBRU4gcXVldWUgb3ZlcmZsb3cuXG4iKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXRhYmxlX21heCA9IHNpemVvZih0d19hZW5fc3RyaW5nKS9zaXplb2YoY2hhciAqKTsKKwkJCQkJCWlmICgoYWVuICYgMHgwZmYpIDwgdGFibGVfbWF4KSB7CisJCQkJCQkJaWYgKCh0d19hZW5fc3RyaW5nW2FlbiAmIDB4ZmZdW3N0cmxlbih0d19hZW5fc3RyaW5nW2FlbiAmIDB4ZmZdKS0xXSkgPT0gJyMnKSB7CisJCQkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IEFFTjogJXMlZC5cbiIsIHR3X2Flbl9zdHJpbmdbYWVuICYgMHhmZl0sIGFlbiA+PiA4KTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBBRU46ICVzLlxuIiwgdHdfYWVuX3N0cmluZ1thZW4gJiAweGZmXSk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlCisJCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogUmVjZWl2ZWQgQUVOICVkLlxuIiwgYWVuKTsKKwkJCQkJfQorCQkJCQl0d19kZXYtPmFlbl9jb3VudCsrOworCQkJCQlxdWV1ZSA9IDE7CisJCQl9CisKKwkJCS8qIE5vdyBwdXQgdGhlIGFlbiBvbiB0aGUgYWVuX3F1ZXVlICovCisJCQlpZiAocXVldWUgPT0gMSkgeworCQkJCXR3X2Rldi0+YWVuX3F1ZXVlW3R3X2Rldi0+YWVuX3RhaWxdID0gYWVuOworCQkJCWlmICh0d19kZXYtPmFlbl90YWlsID09IFRXX1FfTEVOR1RIIC0gMSkgeworCQkJCQl0d19kZXYtPmFlbl90YWlsID0gVFdfUV9TVEFSVDsKKwkJCQl9IGVsc2UgeworCQkJCQl0d19kZXYtPmFlbl90YWlsID0gdHdfZGV2LT5hZW5fdGFpbCArIDE7CisJCQkJfQorCQkJCWlmICh0d19kZXYtPmFlbl9oZWFkID09IHR3X2Rldi0+YWVuX3RhaWwpIHsKKwkJCQkJaWYgKHR3X2Rldi0+YWVuX2hlYWQgPT0gVFdfUV9MRU5HVEggLSAxKSB7CisJCQkJCQl0d19kZXYtPmFlbl9oZWFkID0gVFdfUV9TVEFSVDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXR3X2Rldi0+YWVuX2hlYWQgPSB0d19kZXYtPmFlbl9oZWFkICsgMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWZvdW5kID0gMTsKKwkJfQorCQlpZiAoZm91bmQgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfYWVuX2RyYWluX3F1ZXVlKCk6IFJlc3BvbnNlIG5ldmVyIHJlY2VpdmVkLlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gd2hpbGUgKGZpbmlzaGVkID09IDApOworCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19hZW5fZHJhaW5fcXVldWUoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgbWVtb3J5ICovCitzdGF0aWMgaW50IHR3X2FsbG9jYXRlX21lbW9yeShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCBzaXplLCBpbnQgd2hpY2gpCit7CisJaW50IGk7CisJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOworCXVuc2lnbmVkIGxvbmcgKmNwdV9hZGRyID0gTlVMTDsKKworCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X2FsbG9jYXRlX21lbW9yeSgpXG4iKTsKKworCWNwdV9hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQodHdfZGV2LT50d19wY2lfZGV2LCBzaXplKlRXX1FfTEVOR1RILCAmZG1hX2hhbmRsZSk7CisJaWYgKGNwdV9hZGRyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogcGNpX2FsbG9jX2NvbnNpc3RlbnQoKSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCh1bnNpZ25lZCBsb25nKWNwdV9hZGRyICUgKHR3X2Rldi0+dHdfcGNpX2Rldi0+ZGV2aWNlID09IFRXX0RFVklDRV9JRCA/IFRXX0FMSUdOTUVOVF82MDAwIDogVFdfQUxJR05NRU5UXzcwMDApKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IENvdWxkbid0IGFsbG9jYXRlIGNvcnJlY3RseSBhbGlnbmVkIG1lbW9yeS5cbiIpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHR3X2Rldi0+dHdfcGNpX2Rldiwgc2l6ZSpUV19RX0xFTkdUSCwgY3B1X2FkZHIsIGRtYV9oYW5kbGUpOworCQlyZXR1cm4gMTsKKwl9CisKKwltZW1zZXQoY3B1X2FkZHIsIDAsIHNpemUqVFdfUV9MRU5HVEgpOworCisJZm9yIChpPTA7aTxUV19RX0xFTkdUSDtpKyspIHsKKwkJc3dpdGNoKHdoaWNoKSB7CisJCWNhc2UgMDoKKwkJCXR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfcGh5c2ljYWxfYWRkcmVzc1tpXSA9IGRtYV9oYW5kbGUrKGkqc2l6ZSk7CisJCQl0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tpXSA9ICh1bnNpZ25lZCBsb25nICopKCh1bnNpZ25lZCBjaGFyICopY3B1X2FkZHIgKyAoaSpzaXplKSk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJdHdfZGV2LT5hbGlnbm1lbnRfcGh5c2ljYWxfYWRkcmVzc1tpXSA9IGRtYV9oYW5kbGUrKGkqc2l6ZSk7CisJCQl0d19kZXYtPmFsaWdubWVudF92aXJ0dWFsX2FkZHJlc3NbaV0gPSAodW5zaWduZWQgbG9uZyAqKSgodW5zaWduZWQgY2hhciAqKWNwdV9hZGRyICsgKGkqc2l6ZSkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19hbGxvY2F0ZV9tZW1vcnkoKTogY2FzZSBzbGlwIGluIHR3X2FsbG9jYXRlX21lbW9yeSgpXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19hbGxvY2F0ZV9tZW1vcnkoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgaW9jdGwgZm9yIHRoZSBjaGFyYWN0ZXIgZGV2aWNlICovCitzdGF0aWMgaW50IHR3X2NocmRldl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJlcXVlc3RfaWQ7CisJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOworCXVuc2lnbmVkIHNob3J0IHR3X2Flbl9jb2RlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGRhdGFfYnVmZmVyX2xlbmd0aCA9IDA7CisJdW5zaWduZWQgbG9uZyBkYXRhX2J1ZmZlcl9sZW5ndGhfYWRqdXN0ZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgKmNwdV9hZGRyOworCWxvbmcgdGltZW91dDsKKwlUV19OZXdfSW9jdGwgKnR3X2lvY3RsOworCVRXX1Bhc3N0aHJ1ICpwYXNzdGhydTsKKwlUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYgPSB0d19kZXZpY2VfZXh0ZW5zaW9uX2xpc3RbaW1pbm9yKGlub2RlKV07CisJaW50IHJldHZhbCA9IC1FRkFVTFQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlkcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfY2hyZGV2X2lvY3RsKClcbiIpOworCisJLyogT25seSBsZXQgb25lIG9mIHRoZXNlIHRocm91Z2ggYXQgYSB0aW1lICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmdHdfZGV2LT5pb2N0bF9zZW0pKQorCQlyZXR1cm4gLUVJTlRSOworCisJLyogRmlyc3QgY29weSBkb3duIHRoZSBidWZmZXIgbGVuZ3RoICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhX2J1ZmZlcl9sZW5ndGgsIGFyZ3AsIHNpemVvZih1bnNpZ25lZCBpbnQpKSkKKwkJZ290byBvdXQ7CisKKwkvKiBDaGVjayBzaXplICovCisJaWYgKGRhdGFfYnVmZmVyX2xlbmd0aCA+IFRXX01BWF9JT0NUTF9TRUNUT1JTICogNTEyKSB7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEhhcmR3YXJlIGNhbiBvbmx5IGRvIG11bHRpcGxlIG9mIDUxMiBieXRlIHRyYW5zZmVycyAqLworCWRhdGFfYnVmZmVyX2xlbmd0aF9hZGp1c3RlZCA9IChkYXRhX2J1ZmZlcl9sZW5ndGggKyA1MTEpICYgfjUxMTsKKwkKKwkvKiBOb3cgYWxsb2NhdGUgaW9jdGwgYnVmIG1lbW9yeSAqLworCWNwdV9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZ0d19kZXYtPnR3X3BjaV9kZXYtPmRldiwgZGF0YV9idWZmZXJfbGVuZ3RoX2FkanVzdGVkK3NpemVvZihUV19OZXdfSW9jdGwpIC0gMSwgJmRtYV9oYW5kbGUsIEdGUF9LRVJORUwpOworCWlmIChjcHVfYWRkciA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXR3X2lvY3RsID0gKFRXX05ld19Jb2N0bCAqKWNwdV9hZGRyOworCisJLyogTm93IGNvcHkgZG93biB0aGUgZW50aXJlIGlvY3RsICovCisJaWYgKGNvcHlfZnJvbV91c2VyKHR3X2lvY3RsLCBhcmdwLCBkYXRhX2J1ZmZlcl9sZW5ndGggKyBzaXplb2YoVFdfTmV3X0lvY3RsKSAtIDEpKQorCQlnb3RvIG91dDI7CisKKwlwYXNzdGhydSA9IChUV19QYXNzdGhydSAqKSZ0d19pb2N0bC0+ZmlybXdhcmVfY29tbWFuZDsKKworCS8qIFNlZSB3aGljaCBpb2N0bCB3ZSBhcmUgZG9pbmcgKi8KKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFRXX09QX05PUDoKKwkJCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19jaHJkZXZfaW9jdGwoKTogY2F1Z2h0IFRXX09QX05PUC5cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgVFdfT1BfQUVOX0xJU1RFTjoKKwkJCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19jaHJkZXZfaW9jdGwoKTogY2F1Z2h0IFRXX0FFTl9MSVNURU4uXG4iKTsKKwkJCW1lbXNldCh0d19pb2N0bC0+ZGF0YV9idWZmZXIsIDAsIGRhdGFfYnVmZmVyX2xlbmd0aCk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQlpZiAodHdfZGV2LT5hZW5faGVhZCA9PSB0d19kZXYtPmFlbl90YWlsKSB7CisJCQkJdHdfYWVuX2NvZGUgPSBUV19BRU5fUVVFVUVfRU1QVFk7CisJCQl9IGVsc2UgeworCQkJCXR3X2Flbl9jb2RlID0gdHdfZGV2LT5hZW5fcXVldWVbdHdfZGV2LT5hZW5faGVhZF07CisJCQkJaWYgKHR3X2Rldi0+YWVuX2hlYWQgPT0gVFdfUV9MRU5HVEggLSAxKSB7CisJCQkJCXR3X2Rldi0+YWVuX2hlYWQgPSBUV19RX1NUQVJUOworCQkJCX0gZWxzZSB7CisJCQkJCXR3X2Rldi0+YWVuX2hlYWQgPSB0d19kZXYtPmFlbl9oZWFkICsgMTsKKwkJCQl9CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQltZW1jcHkodHdfaW9jdGwtPmRhdGFfYnVmZmVyLCAmdHdfYWVuX2NvZGUsIHNpemVvZih0d19hZW5fY29kZSkpOworCQkJYnJlYWs7CisJCWNhc2UgVFdfQ01EX1BBQ0tFVF9XSVRIX0RBVEE6CisJCQlkcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfY2hyZGV2X2lvY3RsKCk6IGNhdWdodCBUV19DTURfUEFDS0VUX1dJVEhfREFUQS5cbiIpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCQkJdHdfc3RhdGVfcmVxdWVzdF9zdGFydCh0d19kZXYsICZyZXF1ZXN0X2lkKTsKKworCQkJLyogRmxhZyBpbnRlcm5hbCBjb21tYW5kICovCisJCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSA9IE5VTEw7CisKKwkJCS8qIEZsYWcgY2hyZGV2IGlvY3RsICovCisJCQl0d19kZXYtPmNocmRldl9yZXF1ZXN0X2lkID0gcmVxdWVzdF9pZDsKKworCQkJdHdfaW9jdGwtPmZpcm13YXJlX2NvbW1hbmQucmVxdWVzdF9pZCA9IHJlcXVlc3RfaWQ7CisKKwkJCS8qIExvYWQgdGhlIHNnIGxpc3QgKi8KKwkJCXN3aXRjaCAoVFdfU0dMX09VVCh0d19pb2N0bC0+ZmlybXdhcmVfY29tbWFuZC5vcGNvZGVfX3NnbG9mZnNldCkpIHsKKwkJCWNhc2UgMjoKKwkJCQl0d19pb2N0bC0+ZmlybXdhcmVfY29tbWFuZC5ieXRlOC5wYXJhbS5zZ2xbMF0uYWRkcmVzcyA9IGRtYV9oYW5kbGUgKyBzaXplb2YoVFdfTmV3X0lvY3RsKSAtIDE7CisJCQkJdHdfaW9jdGwtPmZpcm13YXJlX2NvbW1hbmQuYnl0ZTgucGFyYW0uc2dsWzBdLmxlbmd0aCA9IGRhdGFfYnVmZmVyX2xlbmd0aF9hZGp1c3RlZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQl0d19pb2N0bC0+ZmlybXdhcmVfY29tbWFuZC5ieXRlOC5pby5zZ2xbMF0uYWRkcmVzcyA9IGRtYV9oYW5kbGUgKyBzaXplb2YoVFdfTmV3X0lvY3RsKSAtIDE7CisJCQkJdHdfaW9jdGwtPmZpcm13YXJlX2NvbW1hbmQuYnl0ZTguaW8uc2dsWzBdLmxlbmd0aCA9IGRhdGFfYnVmZmVyX2xlbmd0aF9hZGp1c3RlZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQlwYXNzdGhydS0+c2dfbGlzdFswXS5hZGRyZXNzID0gZG1hX2hhbmRsZSArIHNpemVvZihUV19OZXdfSW9jdGwpIC0gMTsKKwkJCQlwYXNzdGhydS0+c2dfbGlzdFswXS5sZW5ndGggPSBkYXRhX2J1ZmZlcl9sZW5ndGhfYWRqdXN0ZWQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCW1lbWNweSh0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXSwgJih0d19pb2N0bC0+ZmlybXdhcmVfY29tbWFuZCksIHNpemVvZihUV19Db21tYW5kKSk7CisKKwkJCS8qIE5vdyBwb3N0IHRoZSBjb21tYW5kIHBhY2tldCB0byB0aGUgY29udHJvbGxlciAqLworCQkJdHdfcG9zdF9jb21tYW5kX3BhY2tldCh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJCQl0aW1lb3V0ID0gVFdfSU9DVExfQ0hSREVWX1RJTUVPVVQqSFo7CisKKwkJCS8qIE5vdyB3YWl0IGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSAqLworCQkJdGltZW91dCA9IHdhaXRfZXZlbnRfdGltZW91dCh0d19kZXYtPmlvY3RsX3dxdWV1ZSwgdHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCA9PSBUV19JT0NUTF9DSFJERVZfRlJFRSwgdGltZW91dCk7CisKKwkJCS8qIFNlZSBpZiB3ZSByZXNldCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgaW9jdGwgdG8gY29tcGxldGUgKi8KKwkJCWlmICh0ZXN0X2JpdChUV19JTl9SRVNFVCwgJnR3X2Rldi0+ZmxhZ3MpKSB7CisJCQkJY2xlYXJfYml0KFRXX0lOX1JFU0VULCAmdHdfZGV2LT5mbGFncyk7CisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJCWdvdG8gb3V0MjsKKwkJCX0KKworCQkJLyogV2UgdGltZWQgb3V0LCBhbmQgZGlkbid0IGdldCBhbiBpbnRlcnJ1cHQgKi8KKwkJCWlmICh0d19kZXYtPmNocmRldl9yZXF1ZXN0X2lkICE9IFRXX0lPQ1RMX0NIUkRFVl9GUkVFKSB7CisJCQkJLyogTm93IHdlIG5lZWQgdG8gcmVzZXQgdGhlIGJvYXJkICovCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogc2NzaSVkOiBDaGFyYWN0ZXIgaW9jdGwgKDB4JXgpIHRpbWVkIG91dCwgcmVzZXR0aW5nIGNhcmQuXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8sIGNtZCk7CisJCQkJcmV0dmFsID0gLUVJTzsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQkJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJCQl0d19zdGF0ZV9yZXF1ZXN0X2ZpbmlzaCh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJCXR3X2Rldi0+cG9zdGVkX3JlcXVlc3RfY291bnQtLTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQkJaWYgKHR3X3Jlc2V0X2RldmljZV9leHRlbnNpb24odHdfZGV2LCAxKSkgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19jaHJkZXZfaW9jdGwoKTogUmVzZXQgZmFpbGVkIGZvciBjYXJkICVkLlxuIiwgdHdfZGV2LT5ob3N0LT5ob3N0X25vKTsKKwkJCQl9CisJCQkJZ290byBvdXQyOworCQkJfQorCisJCQkvKiBOb3cgY29weSBpbiB0aGUgY29tbWFuZCBwYWNrZXQgcmVzcG9uc2UgKi8KKwkJCW1lbWNweSgmKHR3X2lvY3RsLT5maXJtd2FyZV9jb21tYW5kKSwgdHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0dWFsX2FkZHJlc3NbcmVxdWVzdF9pZF0sIHNpemVvZihUV19Db21tYW5kKSk7CisKKwkJCS8qIE5vdyBjb21wbGV0ZSB0aGUgaW8gKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQl0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50LS07CisJCQl0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdID0gVFdfU19DT01QTEVURUQ7CisJCQl0d19zdGF0ZV9yZXF1ZXN0X2ZpbmlzaCh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR2YWwgPSAtRU5PVFRZOworCQkJZ290byBvdXQyOworCX0KKworCS8qIE5vdyBjb3B5IHRoZSByZXNwb25zZSB0byB1c2Vyc3BhY2UgKi8KKwlpZiAoY29weV90b191c2VyKGFyZ3AsIHR3X2lvY3RsLCBzaXplb2YoVFdfTmV3X0lvY3RsKSArIGRhdGFfYnVmZmVyX2xlbmd0aCAtIDEpKQorCQlnb3RvIG91dDI7CisJcmV0dmFsID0gMDsKK291dDI6CisJLyogTm93IGZyZWUgaW9jdGwgYnVmIG1lbW9yeSAqLworCWRtYV9mcmVlX2NvaGVyZW50KCZ0d19kZXYtPnR3X3BjaV9kZXYtPmRldiwgZGF0YV9idWZmZXJfbGVuZ3RoX2FkanVzdGVkK3NpemVvZihUV19OZXdfSW9jdGwpIC0gMSwgY3B1X2FkZHIsIGRtYV9oYW5kbGUpOworb3V0OgorCXVwKCZ0d19kZXYtPmlvY3RsX3NlbSk7CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3X2NocmRldl9pb2N0bCgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBvcGVuIGZvciB0aGUgY2hhcmFjdGVyIGRldmljZSAqLworc3RhdGljIGludCB0d19jaHJkZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3JfbnVtYmVyOworCisJZHByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2lvY3RsX29wZW4oKVxuIik7CisKKwltaW5vcl9udW1iZXIgPSBpbWlub3IoaW5vZGUpOworCWlmIChtaW5vcl9udW1iZXIgPj0gdHdfZGV2aWNlX2V4dGVuc2lvbl9jb3VudCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30gLyogRW5kIHR3X2NocmRldl9vcGVuKCkgKi8KKworLyogRmlsZSBvcGVyYXRpb25zIHN0cnVjdCBmb3IgY2hhcmFjdGVyIGRldmljZSAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHdfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlvY3RsCQk9IHR3X2NocmRldl9pb2N0bCwKKwkub3BlbgkJPSB0d19jaHJkZXZfb3BlbiwKKwkucmVsZWFzZQk9IE5VTEwKK307CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBmcmVlIHVwIGRldmljZSBleHRlbnNpb24gcmVzb3VyY2VzICovCitzdGF0aWMgdm9pZCB0d19mcmVlX2RldmljZV9leHRlbnNpb24oVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2KQoreworCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X2ZyZWVfZGV2aWNlX2V4dGVuc2lvbigpXG4iKTsKKworCS8qIEZyZWUgY29tbWFuZCBwYWNrZXQgYW5kIGdlbmVyaWMgYnVmZmVyIG1lbW9yeSAqLworCWlmICh0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1swXSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCh0d19kZXYtPnR3X3BjaV9kZXYsIHNpemVvZihUV19Db21tYW5kKSpUV19RX0xFTkdUSCwgdHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0dWFsX2FkZHJlc3NbMF0sIHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfcGh5c2ljYWxfYWRkcmVzc1swXSk7CisKKwlpZiAodHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzWzBdKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHR3X2Rldi0+dHdfcGNpX2Rldiwgc2l6ZW9mKFRXX1NlY3RvcikqVFdfUV9MRU5HVEgsIHR3X2Rldi0+YWxpZ25tZW50X3ZpcnR1YWxfYWRkcmVzc1swXSwgdHdfZGV2LT5hbGlnbm1lbnRfcGh5c2ljYWxfYWRkcmVzc1swXSk7Cit9IC8qIEVuZCB0d19mcmVlX2RldmljZV9leHRlbnNpb24oKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2VuZCBhbiBpbml0Y29ubmVjdGlvbiBjb21tYW5kIHRvIGNvbnRyb2xsZXIgKi8KK3N0YXRpYyBpbnQgdHdfaW5pdGNvbm5lY3Rpb24oVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgbWVzc2FnZV9jcmVkaXRzKSAKK3sKKwl1bnNpZ25lZCBsb25nIGNvbW1hbmRfcXVlX3ZhbHVlOworCVRXX0NvbW1hbmQgICpjb21tYW5kX3BhY2tldDsKKwlUV19SZXNwb25zZV9RdWV1ZSByZXNwb25zZV9xdWV1ZTsKKwlpbnQgcmVxdWVzdF9pZCA9IDA7CisKKwlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19pbml0Y29ubmVjdGlvbigpXG4iKTsKKworCS8qIEluaXRpYWxpemUgSW5pdENvbm5lY3Rpb24gY29tbWFuZCBwYWNrZXQgKi8KKwlpZiAodHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0dWFsX2FkZHJlc3NbcmVxdWVzdF9pZF0gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19pbml0Y29ubmVjdGlvbigpOiBCYWQgY29tbWFuZCBwYWNrZXQgdmlydHVhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAxOworCX0KKworCWNvbW1hbmRfcGFja2V0ID0gKFRXX0NvbW1hbmQgKil0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwltZW1zZXQoY29tbWFuZF9wYWNrZXQsIDAsIHNpemVvZihUV19TZWN0b3IpKTsKKwljb21tYW5kX3BhY2tldC0+b3Bjb2RlX19zZ2xvZmZzZXQgPSBUV19PUFNHTF9JTigwLCBUV19PUF9JTklUX0NPTk5FQ1RJT04pOworCWNvbW1hbmRfcGFja2V0LT5zaXplID0gVFdfSU5JVF9DT01NQU5EX1BBQ0tFVF9TSVpFOworCWNvbW1hbmRfcGFja2V0LT5yZXF1ZXN0X2lkID0gcmVxdWVzdF9pZDsKKwljb21tYW5kX3BhY2tldC0+c3RhdHVzID0gMHgwOworCWNvbW1hbmRfcGFja2V0LT5mbGFncyA9IDB4MDsKKwljb21tYW5kX3BhY2tldC0+Ynl0ZTYubWVzc2FnZV9jcmVkaXRzID0gbWVzc2FnZV9jcmVkaXRzOyAKKwljb21tYW5kX3BhY2tldC0+Ynl0ZTguaW5pdF9jb25uZWN0aW9uLnJlc3BvbnNlX3F1ZXVlX3BvaW50ZXIgPSAweDA7CisJY29tbWFuZF9xdWVfdmFsdWUgPSB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3BoeXNpY2FsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisKKwlpZiAoY29tbWFuZF9xdWVfdmFsdWUgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19pbml0Y29ubmVjdGlvbigpOiBCYWQgY29tbWFuZCBwYWNrZXQgcGh5c2ljYWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisgIAorCS8qIFNlbmQgY29tbWFuZCBwYWNrZXQgdG8gdGhlIGJvYXJkICovCisJb3V0bChjb21tYW5kX3F1ZV92YWx1ZSwgVFdfQ09NTUFORF9RVUVVRV9SRUdfQUREUih0d19kZXYpKTsKKyAgICAKKwkvKiBQb2xsIGZvciBjb21wbGV0aW9uICovCisJaWYgKHR3X3BvbGxfc3RhdHVzX2dvbmUodHdfZGV2LCBUV19TVEFUVVNfUkVTUE9OU0VfUVVFVUVfRU1QVFksIDMwKSA9PSAwKSB7CisJCXJlc3BvbnNlX3F1ZXVlLnZhbHVlID0gaW5sKFRXX1JFU1BPTlNFX1FVRVVFX1JFR19BRERSKHR3X2RldikpOworCQlyZXF1ZXN0X2lkID0gVFdfUkVTSURfT1VUKHJlc3BvbnNlX3F1ZXVlLnJlc3BvbnNlX2lkKTsKKworCQlpZiAocmVxdWVzdF9pZCAhPSAwKSB7CisJCQkvKiB1bmV4cGVjdGVkIHJlcXVlc3QgaWQgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2luaXRjb25uZWN0aW9uKCk6IFVuZXhwZWN0ZWQgcmVxdWVzdCBpZC5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGNvbW1hbmRfcGFja2V0LT5zdGF0dXMgIT0gMCkgeworCQkJLyogYmFkIHJlc3BvbnNlICovCisJCQl0d19kZWNvZGVfc2Vuc2UodHdfZGV2LCByZXF1ZXN0X2lkLCAwKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfSAvKiBFbmQgdHdfaW5pdGNvbm5lY3Rpb24oKSAqLworCisvKiBTZXQgYSB2YWx1ZSBpbiB0aGUgZmVhdHVyZXMgdGFibGUgKi8KK3N0YXRpYyBpbnQgdHdfc2V0ZmVhdHVyZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCBwYXJtLCBpbnQgcGFyYW1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnZhbCkKK3sKKwlUV19QYXJhbSAqcGFyYW07CisJVFdfQ29tbWFuZCAgKmNvbW1hbmRfcGFja2V0OworCVRXX1Jlc3BvbnNlX1F1ZXVlIHJlc3BvbnNlX3F1ZXVlOworCWludCByZXF1ZXN0X2lkID0gMDsKKwl1bnNpZ25lZCBsb25nIGNvbW1hbmRfcXVlX3ZhbHVlOworCXVuc2lnbmVkIGxvbmcgcGFyYW1fdmFsdWU7CisKKyAgCS8qIEluaXRpYWxpemUgU2V0UGFyYW0gY29tbWFuZCBwYWNrZXQgKi8KKwlpZiAodHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0dWFsX2FkZHJlc3NbcmVxdWVzdF9pZF0gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zZXRmZWF0dXJlKCk6IEJhZCBjb21tYW5kIHBhY2tldCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWNvbW1hbmRfcGFja2V0ID0gKFRXX0NvbW1hbmQgKil0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwltZW1zZXQoY29tbWFuZF9wYWNrZXQsIDAsIHNpemVvZihUV19TZWN0b3IpKTsKKwlwYXJhbSA9IChUV19QYXJhbSAqKXR3X2Rldi0+YWxpZ25tZW50X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKworCWNvbW1hbmRfcGFja2V0LT5vcGNvZGVfX3NnbG9mZnNldCA9IFRXX09QU0dMX0lOKDIsIFRXX09QX1NFVF9QQVJBTSk7CisJcGFyYW0tPnRhYmxlX2lkID0gMHg0MDQ7ICAvKiBGZWF0dXJlcyB0YWJsZSAqLworCXBhcmFtLT5wYXJhbWV0ZXJfaWQgPSBwYXJtOworCXBhcmFtLT5wYXJhbWV0ZXJfc2l6ZV9ieXRlcyA9IHBhcmFtX3NpemU7CisJbWVtY3B5KHBhcmFtLT5kYXRhLCB2YWwsIHBhcmFtX3NpemUpOworCisJcGFyYW1fdmFsdWUgPSB0d19kZXYtPmFsaWdubWVudF9waHlzaWNhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCWlmIChwYXJhbV92YWx1ZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3NldGZlYXR1cmUoKTogQmFkIGFsaWdubWVudCBwaHlzaWNhbCBhZGRyZXNzLlxuIik7CisJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJdHdfc3RhdGVfcmVxdWVzdF9maW5pc2godHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlc3VsdCA9IChESURfT0sgPDwgMTYpOworCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+c2NzaV9kb25lKHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdKTsKKwl9CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LnBhcmFtLnNnbFswXS5hZGRyZXNzID0gcGFyYW1fdmFsdWU7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LnBhcmFtLnNnbFswXS5sZW5ndGggPSBzaXplb2YoVFdfU2VjdG9yKTsKKworCWNvbW1hbmRfcGFja2V0LT5zaXplID0gNDsKKwljb21tYW5kX3BhY2tldC0+cmVxdWVzdF9pZCA9IHJlcXVlc3RfaWQ7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU2LnBhcmFtZXRlcl9jb3VudCA9IDE7CisKKyAgCWNvbW1hbmRfcXVlX3ZhbHVlID0gdHdfZGV2LT5jb21tYW5kX3BhY2tldF9waHlzaWNhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCWlmIChjb21tYW5kX3F1ZV92YWx1ZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3NldGZlYXR1cmUoKTogQmFkIGNvbW1hbmQgcGFja2V0IHBoeXNpY2FsIGFkZHJlc3MuXG4iKTsKKwlyZXR1cm4gMTsKKwl9CisKKwkvKiBTZW5kIGNvbW1hbmQgcGFja2V0IHRvIHRoZSBib2FyZCAqLworCW91dGwoY29tbWFuZF9xdWVfdmFsdWUsIFRXX0NPTU1BTkRfUVVFVUVfUkVHX0FERFIodHdfZGV2KSk7CisKKwkvKiBQb2xsIGZvciBjb21wbGV0aW9uICovCisJaWYgKHR3X3BvbGxfc3RhdHVzX2dvbmUodHdfZGV2LCBUV19TVEFUVVNfUkVTUE9OU0VfUVVFVUVfRU1QVFksIDMwKSA9PSAwKSB7CisJCXJlc3BvbnNlX3F1ZXVlLnZhbHVlID0gaW5sKFRXX1JFU1BPTlNFX1FVRVVFX1JFR19BRERSKHR3X2RldikpOworCQlyZXF1ZXN0X2lkID0gVFdfUkVTSURfT1VUKHJlc3BvbnNlX3F1ZXVlLnJlc3BvbnNlX2lkKTsKKworCQlpZiAocmVxdWVzdF9pZCAhPSAwKSB7CisJCQkvKiB1bmV4cGVjdGVkIHJlcXVlc3QgaWQgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3NldGZlYXR1cmUoKTogVW5leHBlY3RlZCByZXF1ZXN0IGlkLlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoY29tbWFuZF9wYWNrZXQtPnN0YXR1cyAhPSAwKSB7CisJCQkvKiBiYWQgcmVzcG9uc2UgKi8KKwkJCXR3X2RlY29kZV9zZW5zZSh0d19kZXYsIHJlcXVlc3RfaWQsIDApOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30gLyogRW5kIHR3X3NldGZlYXR1cmUoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXQgYSBjb250cm9sbGVyICovCitzdGF0aWMgaW50IHR3X3Jlc2V0X3NlcXVlbmNlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldikgCit7CisJaW50IGVycm9yID0gMDsKKwlpbnQgdHJpZXMgPSAwOworCXVuc2lnbmVkIGNoYXIgYyA9IDE7CisKKwkvKiBSZXNldCB0aGUgYm9hcmQgKi8KKwl3aGlsZSAodHJpZXMgPCBUV19NQVhfUkVTRVRfVFJJRVMpIHsKKwkJVFdfU09GVF9SRVNFVCh0d19kZXYpOworCisJCWVycm9yID0gdHdfYWVuX2RyYWluX3F1ZXVlKHR3X2Rldik7CisJCWlmIChlcnJvcikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogc2NzaSVkOiBBRU4gZHJhaW4gZmFpbGVkLCByZXRyeWluZy5cbiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubyk7CisJCQl0cmllcysrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBDaGVjayBmb3IgY29udHJvbGxlciBlcnJvcnMgKi8KKwkJaWYgKHR3X2NoZWNrX2Vycm9ycyh0d19kZXYpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBzY3NpJWQ6IENvbnRyb2xsZXIgZXJyb3JzIGZvdW5kLCByZXRyeWluZy5cbiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubyk7CisJCQl0cmllcysrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBOb3cgdGhlIGNvbnRyb2xsZXIgaXMgaW4gYSBnb29kIHN0YXRlICovCisJCWJyZWFrOworCX0KKworCWlmICh0cmllcyA+PSBUV19NQVhfUkVTRVRfVFJJRVMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogc2NzaSVkOiBDb250cm9sbGVyIGVycm9ycywgY2FyZCBub3QgcmVzcG9uZGluZywgY2hlY2sgYWxsIGNhYmxpbmcuXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8pOworCQlyZXR1cm4gMTsKKwl9CisKKwllcnJvciA9IHR3X2luaXRjb25uZWN0aW9uKHR3X2RldiwgVFdfSU5JVF9NRVNTQUdFX0NSRURJVFMpOworCWlmIChlcnJvcikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBzY3NpJWQ6IENvbm5lY3Rpb24gaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIiwgdHdfZGV2LT5ob3N0LT5ob3N0X25vKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZXJyb3IgPSB0d19zZXRmZWF0dXJlKHR3X2RldiwgMiwgMSwgJmMpOworCWlmIChlcnJvcikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBVbmFibGUgdG8gc2V0IGZlYXR1cmVzIGZvciBjYXJkLCBwcm9iYWJsZSBvbGQgZmlybXdhcmUgb3IgY2FyZC5cbiIpOworCX0KKworCXJldHVybiAwOworfSAvKiBFbmQgdHdfcmVzZXRfc2VxdWVuY2UoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5pdGlhbGl6ZSB0aGUgZmllbGRzIG9mIGEgZGV2aWNlIGV4dGVuc2lvbiAqLworc3RhdGljIGludCB0d19pbml0aWFsaXplX2RldmljZV9leHRlbnNpb24oVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2KQoreworCWludCBpLCBlcnJvcj0wOworCisJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfaW5pdGlhbGl6ZV9kZXZpY2VfZXh0ZW5zaW9uKClcbiIpOworCisJLyogSW5pdGlhbGl6ZSBjb21tYW5kIHBhY2tldCBidWZmZXJzICovCisJZXJyb3IgPSB0d19hbGxvY2F0ZV9tZW1vcnkodHdfZGV2LCBzaXplb2YoVFdfQ29tbWFuZCksIDApOworCWlmIChlcnJvcikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBDb21tYW5kIHBhY2tldCBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogSW5pdGlhbGl6ZSBnZW5lcmljIGJ1ZmZlciAqLworCWVycm9yID0gdHdfYWxsb2NhdGVfbWVtb3J5KHR3X2Rldiwgc2l6ZW9mKFRXX1NlY3RvciksIDEpOworCWlmIChlcnJvcikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBHZW5lcmljIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlmb3IgKGk9MDtpPFRXX1FfTEVOR1RIO2krKykgeworCQl0d19kZXYtPmZyZWVfcXVldWVbaV0gPSBpOworCQl0d19kZXYtPnN0YXRlW2ldID0gVFdfU19JTklUSUFMOworCX0KKworCXR3X2Rldi0+cGVuZGluZ19oZWFkID0gVFdfUV9TVEFSVDsKKwl0d19kZXYtPnBlbmRpbmdfdGFpbCA9IFRXX1FfU1RBUlQ7CisJdHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCA9IFRXX0lPQ1RMX0NIUkRFVl9GUkVFOworCisJaW5pdF9NVVRFWCgmdHdfZGV2LT5pb2N0bF9zZW0pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnR3X2Rldi0+aW9jdGxfd3F1ZXVlKTsKKworCXJldHVybiAwOworfSAvKiBFbmQgdHdfaW5pdGlhbGl6ZV9kZXZpY2VfZXh0ZW5zaW9uKCkgKi8KKworc3RhdGljIGludCB0d19tYXBfc2NzaV9zZ19kYXRhKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJaW50IHVzZV9zZzsKKworCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19tYXBfc2NzaV9zZ19kYXRhKClcbiIpOworCQorCWlmIChjbWQtPnVzZV9zZyA9PSAwKQorCQlyZXR1cm4gMDsKKworCXVzZV9zZyA9IHBjaV9tYXBfc2cocGRldiwgY21kLT5idWZmZXIsIGNtZC0+dXNlX3NnLCBETUFfQklESVJFQ1RJT05BTCk7CisJCisJaWYgKHVzZV9zZyA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X21hcF9zY3NpX3NnX2RhdGEoKTogcGNpX21hcF9zZygpIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljbWQtPlNDcC5waGFzZSA9IFRXX1BIQVNFX1NHTElTVDsKKwljbWQtPlNDcC5oYXZlX2RhdGFfaW4gPSB1c2Vfc2c7CisJCisJcmV0dXJuIHVzZV9zZzsKK30gLyogRW5kIHR3X21hcF9zY3NpX3NnX2RhdGEoKSAqLworCitzdGF0aWMgdTMyIHR3X21hcF9zY3NpX3NpbmdsZV9kYXRhKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJZG1hX2FkZHJfdCBtYXBwaW5nOworCisJZHByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X21hcF9zY3NpX3NpbmdsZV9kYXRhKClcbiIpOworCisJaWYgKGNtZC0+cmVxdWVzdF9idWZmbGVuID09IDApCisJCXJldHVybiAwOworCisJbWFwcGluZyA9IHBjaV9tYXBfcGFnZShwZGV2LCB2aXJ0X3RvX3BhZ2UoY21kLT5yZXF1ZXN0X2J1ZmZlciksIG9mZnNldF9pbl9wYWdlKGNtZC0+cmVxdWVzdF9idWZmZXIpLCBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgRE1BX0JJRElSRUNUSU9OQUwpOworCisJaWYgKG1hcHBpbmcgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19tYXBfc2NzaV9zaW5nbGVfZGF0YSgpOiBwY2lfbWFwX3BhZ2UoKSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY21kLT5TQ3AucGhhc2UgPSBUV19QSEFTRV9TSU5HTEU7CisJY21kLT5TQ3AuaGF2ZV9kYXRhX2luID0gbWFwcGluZzsKKworCXJldHVybiBtYXBwaW5nOworfSAvKiBFbmQgdHdfbWFwX3Njc2lfc2luZ2xlX2RhdGEoKSAqLworCitzdGF0aWMgdm9pZCB0d191bm1hcF9zY3NpX2RhdGEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlkcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfdW5tYXBfc2NzaV9kYXRhKClcbiIpOworCisJc3dpdGNoKGNtZC0+U0NwLnBoYXNlKSB7CisJCWNhc2UgVFdfUEhBU0VfU0lOR0xFOgorCQkJcGNpX3VubWFwX3BhZ2UocGRldiwgY21kLT5TQ3AuaGF2ZV9kYXRhX2luLCBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgRE1BX0JJRElSRUNUSU9OQUwpOworCQkJYnJlYWs7CisJCWNhc2UgVFdfUEhBU0VfU0dMSVNUOgorCQkJcGNpX3VubWFwX3NnKHBkZXYsIGNtZC0+cmVxdWVzdF9idWZmZXIsIGNtZC0+dXNlX3NnLCBETUFfQklESVJFQ1RJT05BTCk7CisJCQlicmVhazsKKwl9Cit9IC8qIEVuZCB0d191bm1hcF9zY3NpX2RhdGEoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXQgYSBkZXZpY2UgZXh0ZW5zaW9uICovCitzdGF0aWMgaW50IHR3X3Jlc2V0X2RldmljZV9leHRlbnNpb24oVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgaW9jdGxfcmVzZXQpIAoreworCWludCBpID0gMDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzcmI7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19yZXNldF9kZXZpY2VfZXh0ZW5zaW9uKClcbiIpOworCisJc2V0X2JpdChUV19JTl9SRVNFVCwgJnR3X2Rldi0+ZmxhZ3MpOworCVRXX0RJU0FCTEVfSU5URVJSVVBUUyh0d19kZXYpOworCVRXX01BU0tfQ09NTUFORF9JTlRFUlJVUFQodHdfZGV2KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJLyogQWJvcnQgYWxsIHJlcXVlc3RzIHRoYXQgYXJlIGluIHByb2dyZXNzICovCisJZm9yIChpPTA7aTxUV19RX0xFTkdUSDtpKyspIHsKKwkJaWYgKCh0d19kZXYtPnN0YXRlW2ldICE9IFRXX1NfRklOSVNIRUQpICYmIAorCQkgICAgKHR3X2Rldi0+c3RhdGVbaV0gIT0gVFdfU19JTklUSUFMKSAmJgorCQkgICAgKHR3X2Rldi0+c3RhdGVbaV0gIT0gVFdfU19DT01QTEVURUQpKSB7CisJCQlzcmIgPSB0d19kZXYtPnNyYltpXTsKKwkJCWlmIChzcmIgIT0gTlVMTCkgeworCQkJCXNyYi0+cmVzdWx0ID0gKERJRF9SRVNFVCA8PCAxNik7CisJCQkJdHdfZGV2LT5zcmJbaV0tPnNjc2lfZG9uZSh0d19kZXYtPnNyYltpXSk7CisJCQkJdHdfdW5tYXBfc2NzaV9kYXRhKHR3X2Rldi0+dHdfcGNpX2RldiwgdHdfZGV2LT5zcmJbaV0pOworCQkJfQorCQl9CisJfQorCisJLyogUmVzZXQgcXVldWVzIGFuZCBjb3VudHMgKi8KKwlmb3IgKGk9MDtpPFRXX1FfTEVOR1RIO2krKykgeworCQl0d19kZXYtPmZyZWVfcXVldWVbaV0gPSBpOworCQl0d19kZXYtPnN0YXRlW2ldID0gVFdfU19JTklUSUFMOworCX0KKwl0d19kZXYtPmZyZWVfaGVhZCA9IFRXX1FfU1RBUlQ7CisJdHdfZGV2LT5mcmVlX3RhaWwgPSBUV19RX1NUQVJUOworCXR3X2Rldi0+cG9zdGVkX3JlcXVlc3RfY291bnQgPSAwOworCXR3X2Rldi0+cGVuZGluZ19yZXF1ZXN0X2NvdW50ID0gMDsKKwl0d19kZXYtPnBlbmRpbmdfaGVhZCA9IFRXX1FfU1RBUlQ7CisJdHdfZGV2LT5wZW5kaW5nX3RhaWwgPSBUV19RX1NUQVJUOworCXR3X2Rldi0+cmVzZXRfcHJpbnQgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKHR3X3Jlc2V0X3NlcXVlbmNlKHR3X2RldikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogc2NzaSVkOiBSZXNldCBzZXF1ZW5jZSBmYWlsZWQuXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8pOworCQlyZXR1cm4gMTsKKwl9CisJVFdfRU5BQkxFX0FORF9DTEVBUl9JTlRFUlJVUFRTKHR3X2Rldik7CisKKwkvKiBXYWtlIHVwIGFueSBpb2N0bCB0aGF0IHdhcyBwZW5kaW5nIGJlZm9yZSB0aGUgcmVzZXQgKi8KKwlpZiAoKHR3X2Rldi0+Y2hyZGV2X3JlcXVlc3RfaWQgPT0gVFdfSU9DVExfQ0hSREVWX0ZSRUUpIHx8IChpb2N0bF9yZXNldCkpIHsKKwkJY2xlYXJfYml0KFRXX0lOX1JFU0VULCAmdHdfZGV2LT5mbGFncyk7CisJfSBlbHNlIHsKKwkJdHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCA9IFRXX0lPQ1RMX0NIUkRFVl9GUkVFOworCQl3YWtlX3VwKCZ0d19kZXYtPmlvY3RsX3dxdWV1ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19yZXNldF9kZXZpY2VfZXh0ZW5zaW9uKCkgKi8KKworLyogVGhpcyBmdW5jaXRvbiByZXR1cm5zIHVuaXQgZ2VvbWV0cnkgaW4gY3lsaW5kZXJzL2hlYWRzL3NlY3RvcnMgKi8KK3N0YXRpYyBpbnQgdHdfc2NzaV9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQlzZWN0b3JfdCBjYXBhY2l0eSwgaW50IGdlb21bXSkgCit7CisJaW50IGhlYWRzLCBzZWN0b3JzLCBjeWxpbmRlcnM7CisJVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2OworCQorCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lfYmlvc3BhcmFtKClcbiIpOworCXR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisKKwloZWFkcyA9IDY0OworCXNlY3RvcnMgPSAzMjsKKwljeWxpbmRlcnMgPSBzZWN0b3JfZGl2KGNhcGFjaXR5LCBoZWFkcyAqIHNlY3RvcnMpOworCisJaWYgKGNhcGFjaXR5ID49IDB4MjAwMDAwKSB7CisJCWhlYWRzID0gMjU1OworCQlzZWN0b3JzID0gNjM7CisJCWN5bGluZGVycyA9IHNlY3Rvcl9kaXYoY2FwYWNpdHksIGhlYWRzICogc2VjdG9ycyk7CisJfQorCisJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaV9iaW9zcGFyYW0oKTogaGVhZHMgPSAlZCwgc2VjdG9ycyA9ICVkLCBjeWxpbmRlcnMgPSAlZFxuIiwgaGVhZHMsIHNlY3RvcnMsIGN5bGluZGVycyk7CisJZ2VvbVswXSA9IGhlYWRzOwkJCSAKKwlnZW9tWzFdID0gc2VjdG9yczsKKwlnZW9tWzJdID0gY3lsaW5kZXJzOworCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19zY3NpX2Jpb3NwYXJhbSgpICovCisKKy8qIFRoaXMgaXMgdGhlIG5ldyBzY3NpIGVoIHJlc2V0IGZ1bmN0aW9uICovCitzdGF0aWMgaW50IHR3X3Njc2lfZWhfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpIAoreworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2Rldj1OVUxMOworCWludCByZXR2YWwgPSBGQUlMRUQ7CisKKwl0d19kZXYgPSAoVFdfRGV2aWNlX0V4dGVuc2lvbiAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJc3Bpbl91bmxvY2tfaXJxKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrKTsKKworCXR3X2Rldi0+bnVtX3Jlc2V0cysrOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogc2NzaSVkOiBXQVJOSU5HOiBVbml0ICMlZDogQ29tbWFuZCAoMHgleCkgdGltZWQgb3V0LCByZXNldHRpbmcgY2FyZC5cbiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubywgU0NwbnQtPmRldmljZS0+aWQsIFNDcG50LT5jbW5kWzBdKTsKKworCS8qIE5vdyByZXNldCB0aGUgY2FyZCBhbmQgc29tZSBvZiB0aGUgZGV2aWNlIGV4dGVuc2lvbiBkYXRhICovCisJaWYgKHR3X3Jlc2V0X2RldmljZV9leHRlbnNpb24odHdfZGV2LCAwKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBzY3NpJWQ6IFJlc2V0IGZhaWxlZC5cbiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubyk7CisJCWdvdG8gb3V0OworCX0KKworCXJldHZhbCA9IFNVQ0NFU1M7CitvdXQ6CisJc3Bpbl9sb2NrX2lycSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3X3Njc2lfZWhfcmVzZXQoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgc2NzaSBpbnF1aXJ5IGNvbW1hbmRzICovCitzdGF0aWMgaW50IHR3X3Njc2lvcF9pbnF1aXJ5KFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJVFdfUGFyYW0gKnBhcmFtOworCVRXX0NvbW1hbmQgKmNvbW1hbmRfcGFja2V0OworCXVuc2lnbmVkIGxvbmcgY29tbWFuZF9xdWVfdmFsdWU7CisJdW5zaWduZWQgbG9uZyBwYXJhbV92YWx1ZTsKKworCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lvcF9pbnF1aXJ5KClcbiIpOworCisJLyogSW5pdGlhbGl6ZSBjb21tYW5kIHBhY2tldCAqLworCWNvbW1hbmRfcGFja2V0ID0gKFRXX0NvbW1hbmQgKil0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAoY29tbWFuZF9wYWNrZXQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfaW5xdWlyeSgpOiBCYWQgY29tbWFuZCBwYWNrZXQgdmlydHVhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAxOworCX0KKwltZW1zZXQoY29tbWFuZF9wYWNrZXQsIDAsIHNpemVvZihUV19TZWN0b3IpKTsKKwljb21tYW5kX3BhY2tldC0+b3Bjb2RlX19zZ2xvZmZzZXQgPSBUV19PUFNHTF9JTigyLCBUV19PUF9HRVRfUEFSQU0pOworCWNvbW1hbmRfcGFja2V0LT5zaXplID0gNDsKKwljb21tYW5kX3BhY2tldC0+cmVxdWVzdF9pZCA9IHJlcXVlc3RfaWQ7CisJY29tbWFuZF9wYWNrZXQtPnN0YXR1cyA9IDA7CisJY29tbWFuZF9wYWNrZXQtPmZsYWdzID0gMDsKKwljb21tYW5kX3BhY2tldC0+Ynl0ZTYucGFyYW1ldGVyX2NvdW50ID0gMTsKKworCS8qIE5vdyBzZXR1cCB0aGUgcGFyYW0gKi8KKwlpZiAodHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfc2NzaW9wX2lucXVpcnkoKTogQmFkIGFsaWdubWVudCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXBhcmFtID0gKFRXX1BhcmFtICopdHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCW1lbXNldChwYXJhbSwgMCwgc2l6ZW9mKFRXX1NlY3RvcikpOworCXBhcmFtLT50YWJsZV9pZCA9IDM7CSAvKiB1bml0IHN1bW1hcnkgdGFibGUgKi8KKwlwYXJhbS0+cGFyYW1ldGVyX2lkID0gMzsgLyogdW5pdHNzdGF0dXMgcGFyYW1ldGVyICovCisJcGFyYW0tPnBhcmFtZXRlcl9zaXplX2J5dGVzID0gVFdfTUFYX1VOSVRTOworCXBhcmFtX3ZhbHVlID0gdHdfZGV2LT5hbGlnbm1lbnRfcGh5c2ljYWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAocGFyYW1fdmFsdWUgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfaW5xdWlyeSgpOiBCYWQgYWxpZ25tZW50IHBoeXNpY2FsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LnBhcmFtLnNnbFswXS5hZGRyZXNzID0gcGFyYW1fdmFsdWU7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LnBhcmFtLnNnbFswXS5sZW5ndGggPSBzaXplb2YoVFdfU2VjdG9yKTsKKwljb21tYW5kX3F1ZV92YWx1ZSA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfcGh5c2ljYWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAoY29tbWFuZF9xdWVfdmFsdWUgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfaW5xdWlyeSgpOiBCYWQgY29tbWFuZCBwYWNrZXQgcGh5c2ljYWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBOb3cgdHJ5IHRvIHBvc3QgdGhlIGNvbW1hbmQgcGFja2V0ICovCisJdHdfcG9zdF9jb21tYW5kX3BhY2tldCh0d19kZXYsIHJlcXVlc3RfaWQpOworCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19zY3Npb3BfaW5xdWlyeSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBpc3IgdG8gY29tcGxldGUgYW4gaW5xdWlyeSBjb21tYW5kICovCitzdGF0aWMgaW50IHR3X3Njc2lvcF9pbnF1aXJ5X2NvbXBsZXRlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJdW5zaWduZWQgY2hhciAqaXNfdW5pdF9wcmVzZW50OworCXVuc2lnbmVkIGNoYXIgKnJlcXVlc3RfYnVmZmVyOworCVRXX1BhcmFtICpwYXJhbTsKKworCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lvcF9pbnF1aXJ5X2NvbXBsZXRlKClcbiIpOworCisJLyogRmlsbCByZXF1ZXN0IGJ1ZmZlciAqLworCWlmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmZXIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfaW5xdWlyeV9jb21wbGV0ZSgpOiBSZXF1ZXN0IGJ1ZmZlciBOVUxMLlxuIik7CisJCXJldHVybiAxOworCX0KKwlyZXF1ZXN0X2J1ZmZlciA9IHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXF1ZXN0X2J1ZmZlcjsKKwltZW1zZXQocmVxdWVzdF9idWZmZXIsIDAsIHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXF1ZXN0X2J1ZmZsZW4pOworCXJlcXVlc3RfYnVmZmVyWzBdID0gVFlQRV9ESVNLOyAvKiBQZXJpcGhlcmFsIGRldmljZSB0eXBlICovCisJcmVxdWVzdF9idWZmZXJbMV0gPSAwOwkgICAgICAgLyogRGV2aWNlIHR5cGUgbW9kaWZpZXIgKi8KKwlyZXF1ZXN0X2J1ZmZlclsyXSA9IDA7CSAgICAgICAvKiBObyBhbnNpL2lzbyBjb21wbGlhbmNlICovCisJcmVxdWVzdF9idWZmZXJbNF0gPSAzMTsJICAgICAgIC8qIEFkZGl0aW9uYWwgbGVuZ3RoICovCisJbWVtY3B5KCZyZXF1ZXN0X2J1ZmZlcls4XSwgIjN3YXJlICAgIiwgOCk7CSAvKiBWZW5kb3IgSUQgKi8KKwlzcHJpbnRmKCZyZXF1ZXN0X2J1ZmZlclsxNl0sICJMb2dpY2FsIERpc2sgJS0yZCAiLCB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+ZGV2aWNlLT5pZCk7CisJbWVtY3B5KCZyZXF1ZXN0X2J1ZmZlclszMl0sIFRXX0RSSVZFUl9WRVJTSU9OLCAzKTsKKworCXBhcmFtID0gKFRXX1BhcmFtICopdHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCWlmIChwYXJhbSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3Njc2lvcF9pbnF1aXJ5X2NvbXBsZXRlKCk6IEJhZCBhbGlnbm1lbnQgdmlydHVhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAxOworCX0KKwlpc191bml0X3ByZXNlbnQgPSAmKHBhcmFtLT5kYXRhWzBdKTsKKworCWlmIChpc191bml0X3ByZXNlbnRbdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPmRldmljZS0+aWRdICYgVFdfVU5JVF9PTkxJTkUpIHsKKwkJdHdfZGV2LT5pc191bml0X3ByZXNlbnRbdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPmRldmljZS0+aWRdID0gMTsKKwl9IGVsc2UgeworCQl0d19kZXYtPmlzX3VuaXRfcHJlc2VudFt0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+ZGV2aWNlLT5pZF0gPSAwOworCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwkJcmV0dXJuIFRXX0lTUl9ET05UX1JFU1VMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30gLyogRW5kIHR3X3Njc2lvcF9pbnF1aXJ5X2NvbXBsZXRlKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHNjc2kgbW9kZV9zZW5zZSBjb21tYW5kcyAqLworc3RhdGljIGludCB0d19zY3Npb3BfbW9kZV9zZW5zZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkKQoreworCVRXX1BhcmFtICpwYXJhbTsKKwlUV19Db21tYW5kICpjb21tYW5kX3BhY2tldDsKKwl1bnNpZ25lZCBsb25nIGNvbW1hbmRfcXVlX3ZhbHVlOworCXVuc2lnbmVkIGxvbmcgcGFyYW1fdmFsdWU7CisKKwlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3Npb3BfbW9kZV9zZW5zZSgpXG4iKTsKKworCS8qIE9ubHkgcGFnZSBjb250cm9sID0gMCwgcGFnZSBjb2RlID0gMHg4IChjYWNoZSBwYWdlKSBzdXBwb3J0ZWQgKi8KKwlpZiAodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPmNtbmRbMl0gIT0gMHg4KSB7CisJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJdHdfc3RhdGVfcmVxdWVzdF9maW5pc2godHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlc3VsdCA9IChESURfT0sgPDwgMTYpOworCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+c2NzaV9kb25lKHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTm93IHJlYWQgZmlybXdhcmUgY2FjaGUgc2V0dGluZyBmb3IgdGhpcyB1bml0ICovCisJY29tbWFuZF9wYWNrZXQgPSAoVFdfQ29tbWFuZCAqKXR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCWlmIChjb21tYW5kX3BhY2tldCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3Njc2lvcF9tb2RlX3NlbnNlKCk6IEJhZCBjb21tYW5kIHBhY2tldCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogU2V0dXAgdGhlIGNvbW1hbmQgcGFja2V0ICovCisJbWVtc2V0KGNvbW1hbmRfcGFja2V0LCAwLCBzaXplb2YoVFdfU2VjdG9yKSk7CisJY29tbWFuZF9wYWNrZXQtPm9wY29kZV9fc2dsb2Zmc2V0ID0gVFdfT1BTR0xfSU4oMiwgVFdfT1BfR0VUX1BBUkFNKTsKKwljb21tYW5kX3BhY2tldC0+c2l6ZSA9IDQ7CisJY29tbWFuZF9wYWNrZXQtPnJlcXVlc3RfaWQgPSByZXF1ZXN0X2lkOworCWNvbW1hbmRfcGFja2V0LT5zdGF0dXMgPSAwOworCWNvbW1hbmRfcGFja2V0LT5mbGFncyA9IDA7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU2LnBhcmFtZXRlcl9jb3VudCA9IDE7CisKKwkvKiBTZXR1cCB0aGUgcGFyYW0gKi8KKwlpZiAodHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfc2NzaW9wX21vZGVfc2Vuc2UoKTogQmFkIGFsaWdubWVudCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcGFyYW0gPSAoVFdfUGFyYW0gKil0d19kZXYtPmFsaWdubWVudF92aXJ0dWFsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisJbWVtc2V0KHBhcmFtLCAwLCBzaXplb2YoVFdfU2VjdG9yKSk7CisJcGFyYW0tPnRhYmxlX2lkID0gVFdfVU5JVF9JTkZPUk1BVElPTl9UQUJMRV9CQVNFICsgdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPmRldmljZS0+aWQ7CisJcGFyYW0tPnBhcmFtZXRlcl9pZCA9IDc7IC8qIHVuaXQgZmxhZ3MgKi8KKwlwYXJhbS0+cGFyYW1ldGVyX3NpemVfYnl0ZXMgPSAxOworCXBhcmFtX3ZhbHVlID0gdHdfZGV2LT5hbGlnbm1lbnRfcGh5c2ljYWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAocGFyYW1fdmFsdWUgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfbW9kZV9zZW5zZSgpOiBCYWQgYWxpZ25tZW50IHBoeXNpY2FsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LnBhcmFtLnNnbFswXS5hZGRyZXNzID0gcGFyYW1fdmFsdWU7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LnBhcmFtLnNnbFswXS5sZW5ndGggPSBzaXplb2YoVFdfU2VjdG9yKTsKKwljb21tYW5kX3F1ZV92YWx1ZSA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfcGh5c2ljYWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAoY29tbWFuZF9xdWVfdmFsdWUgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfbW9kZV9zZW5zZSgpOiBCYWQgY29tbWFuZCBwYWNrZXQgcGh5c2ljYWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBOb3cgdHJ5IHRvIHBvc3QgdGhlIGNvbW1hbmQgcGFja2V0ICovCisJdHdfcG9zdF9jb21tYW5kX3BhY2tldCh0d19kZXYsIHJlcXVlc3RfaWQpOworCQorCXJldHVybiAwOworfSAvKiBFbmQgdHdfc2NzaW9wX21vZGVfc2Vuc2UoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgaXNyIHRvIGNvbXBsZXRlIGEgbW9kZSBzZW5zZSBjb21tYW5kICovCitzdGF0aWMgaW50IHR3X3Njc2lvcF9tb2RlX3NlbnNlX2NvbXBsZXRlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJVFdfUGFyYW0gKnBhcmFtOworCXVuc2lnbmVkIGNoYXIgKmZsYWdzOworCXVuc2lnbmVkIGNoYXIgKnJlcXVlc3RfYnVmZmVyOworCisJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaW9wX21vZGVfc2Vuc2VfY29tcGxldGUoKVxuIik7CisKKwlwYXJhbSA9IChUV19QYXJhbSAqKXR3X2Rldi0+YWxpZ25tZW50X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAocGFyYW0gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfbW9kZV9zZW5zZV9jb21wbGV0ZSgpOiBCYWQgYWxpZ25tZW50IHZpcnR1YWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJZmxhZ3MgPSAoY2hhciAqKSYocGFyYW0tPmRhdGFbMF0pOworCXJlcXVlc3RfYnVmZmVyID0gdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPmJ1ZmZlcjsKKwltZW1zZXQocmVxdWVzdF9idWZmZXIsIDAsIHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXF1ZXN0X2J1ZmZsZW4pOworCisJcmVxdWVzdF9idWZmZXJbMF0gPSAweGY7ICAgICAgICAvKiBtb2RlIGRhdGEgbGVuZ3RoICovCisJcmVxdWVzdF9idWZmZXJbMV0gPSAwOyAgICAgICAgICAvKiBkZWZhdWx0IG1lZGl1bSB0eXBlICovCisJcmVxdWVzdF9idWZmZXJbMl0gPSAweDEwOyAgICAgICAvKiBkcG8vZnVhIHN1cHBvcnQgb24gKi8KKwlyZXF1ZXN0X2J1ZmZlclszXSA9IDA7ICAgICAgICAgIC8qIG5vIGJsb2NrIGRlc2NyaXB0b3JzICovCisJcmVxdWVzdF9idWZmZXJbNF0gPSAweDg7ICAgICAgICAvKiBjYWNoaW5nIHBhZ2UgKi8KKwlyZXF1ZXN0X2J1ZmZlcls1XSA9IDB4YTsgICAgICAgIC8qIHBhZ2UgbGVuZ3RoICovCisJaWYgKCpmbGFncyAmIDB4MSkKKwkJcmVxdWVzdF9idWZmZXJbNl0gPSAweDQ7ICAgICAgICAvKiBXQ0Ugb24gKi8KKwllbHNlCisJCXJlcXVlc3RfYnVmZmVyWzZdID0gMHgwOyAgICAgICAgLyogV0NFIG9mZiAqLworCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19zY3Npb3BfbW9kZV9zZW5zZV9jb21wbGV0ZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzY3NpIHJlYWRfY2FwYWNpdHkgY29tbWFuZHMgKi8KK3N0YXRpYyBpbnQgdHdfc2NzaW9wX3JlYWRfY2FwYWNpdHkoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCkgCit7CisJVFdfUGFyYW0gKnBhcmFtOworCVRXX0NvbW1hbmQgKmNvbW1hbmRfcGFja2V0OworCXVuc2lnbmVkIGxvbmcgY29tbWFuZF9xdWVfdmFsdWU7CisJdW5zaWduZWQgbG9uZyBwYXJhbV92YWx1ZTsKKworCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lvcF9yZWFkX2NhcGFjaXR5KClcbiIpOworCisJLyogSW5pdGlhbGl6ZSBjb21tYW5kIHBhY2tldCAqLworCWNvbW1hbmRfcGFja2V0ID0gKFRXX0NvbW1hbmQgKil0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKworCWlmIChjb21tYW5kX3BhY2tldCA9PSBOVUxMKSB7CisJCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lvcF9yZWFkX2NhcGFjaXR5KCk6IEJhZCBjb21tYW5kIHBhY2tldCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCW1lbXNldChjb21tYW5kX3BhY2tldCwgMCwgc2l6ZW9mKFRXX1NlY3RvcikpOworCWNvbW1hbmRfcGFja2V0LT5vcGNvZGVfX3NnbG9mZnNldCA9IFRXX09QU0dMX0lOKDIsIFRXX09QX0dFVF9QQVJBTSk7CisJY29tbWFuZF9wYWNrZXQtPnNpemUgPSA0OworCWNvbW1hbmRfcGFja2V0LT5yZXF1ZXN0X2lkID0gcmVxdWVzdF9pZDsKKwljb21tYW5kX3BhY2tldC0+dW5pdF9faG9zdGlkID0gVFdfVU5JVEhPU1RfSU4oMCwgdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPmRldmljZS0+aWQpOworCWNvbW1hbmRfcGFja2V0LT5zdGF0dXMgPSAwOworCWNvbW1hbmRfcGFja2V0LT5mbGFncyA9IDA7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU2LmJsb2NrX2NvdW50ID0gMTsKKworCS8qIE5vdyBzZXR1cCB0aGUgcGFyYW0gKi8KKwlpZiAodHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdID09IE5VTEwpIHsKKwkJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaW9wX3JlYWRfY2FwYWNpdHkoKTogQmFkIGFsaWdubWVudCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXBhcmFtID0gKFRXX1BhcmFtICopdHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCW1lbXNldChwYXJhbSwgMCwgc2l6ZW9mKFRXX1NlY3RvcikpOworCXBhcmFtLT50YWJsZV9pZCA9IFRXX1VOSVRfSU5GT1JNQVRJT05fVEFCTEVfQkFTRSArIAorCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5kZXZpY2UtPmlkOworCXBhcmFtLT5wYXJhbWV0ZXJfaWQgPSA0OwkvKiB1bml0Y2FwYWNpdHkgcGFyYW1ldGVyICovCisJcGFyYW0tPnBhcmFtZXRlcl9zaXplX2J5dGVzID0gNDsKKwlwYXJhbV92YWx1ZSA9IHR3X2Rldi0+YWxpZ25tZW50X3BoeXNpY2FsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisJaWYgKHBhcmFtX3ZhbHVlID09IDApIHsKKwkJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaW9wX3JlYWRfY2FwYWNpdHkoKTogQmFkIGFsaWdubWVudCBwaHlzaWNhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAxOworCX0KKyAgCisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LnBhcmFtLnNnbFswXS5hZGRyZXNzID0gcGFyYW1fdmFsdWU7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LnBhcmFtLnNnbFswXS5sZW5ndGggPSBzaXplb2YoVFdfU2VjdG9yKTsKKwljb21tYW5kX3F1ZV92YWx1ZSA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfcGh5c2ljYWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAoY29tbWFuZF9xdWVfdmFsdWUgPT0gMCkgeworCQlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3Npb3BfcmVhZF9jYXBhY2l0eSgpOiBCYWQgY29tbWFuZCBwYWNrZXQgcGh5c2ljYWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBOb3cgdHJ5IHRvIHBvc3QgdGhlIGNvbW1hbmQgdG8gdGhlIGJvYXJkICovCisJdHdfcG9zdF9jb21tYW5kX3BhY2tldCh0d19kZXYsIHJlcXVlc3RfaWQpOworICAKKwlyZXR1cm4gMDsKK30gLyogRW5kIHR3X3Njc2lvcF9yZWFkX2NhcGFjaXR5KCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGlzciB0byBjb21wbGV0ZSBhIHJlYWRjYXBhY2l0eSBjb21tYW5kICovCitzdGF0aWMgaW50IHR3X3Njc2lvcF9yZWFkX2NhcGFjaXR5X2NvbXBsZXRlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJdW5zaWduZWQgY2hhciAqcGFyYW1fZGF0YTsKKwl1MzIgY2FwYWNpdHk7CisJY2hhciAqYnVmZjsKKwlUV19QYXJhbSAqcGFyYW07CisKKwlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3Npb3BfcmVhZF9jYXBhY2l0eV9jb21wbGV0ZSgpXG4iKTsKKworCWJ1ZmYgPSB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmZXI7CisJaWYgKGJ1ZmYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfcmVhZF9jYXBhY2l0eV9jb21wbGV0ZSgpOiBSZXF1ZXN0IGJ1ZmZlciBOVUxMLlxuIik7CisJCXJldHVybiAxOworCX0KKwltZW1zZXQoYnVmZiwgMCwgdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlcXVlc3RfYnVmZmxlbik7CisJcGFyYW0gPSAoVFdfUGFyYW0gKil0d19kZXYtPmFsaWdubWVudF92aXJ0dWFsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisJaWYgKHBhcmFtID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfc2NzaW9wX3JlYWRfY2FwYWNpdHlfY29tcGxldGUoKTogQmFkIGFsaWdubWVudCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXBhcmFtX2RhdGEgPSAmKHBhcmFtLT5kYXRhWzBdKTsKKworCWNhcGFjaXR5ID0gKHBhcmFtX2RhdGFbM10gPDwgMjQpIHwgKHBhcmFtX2RhdGFbMl0gPDwgMTYpIHwgCisJCSAgIChwYXJhbV9kYXRhWzFdIDw8IDgpIHwgcGFyYW1fZGF0YVswXTsKKworCS8qIFN1YnRyYWN0IG9uZSBzZWN0b3IgdG8gZml4IGdldCBsYXN0IHNlY3RvciBpb2N0bCAqLworCWNhcGFjaXR5IC09IDE7CisKKwlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3Npb3BfcmVhZF9jYXBhY2l0eV9jb21wbGV0ZSgpOiBDYXBhY2l0eSA9IDB4JXguXG4iLCBjYXBhY2l0eSk7CisKKwkvKiBOdW1iZXIgb2YgTEJBJ3MgKi8KKwlidWZmWzBdID0gKGNhcGFjaXR5ID4+IDI0KTsKKwlidWZmWzFdID0gKGNhcGFjaXR5ID4+IDE2KSAmIDB4ZmY7CisJYnVmZlsyXSA9IChjYXBhY2l0eSA+PiA4KSAmIDB4ZmY7CisJYnVmZlszXSA9IGNhcGFjaXR5ICYgMHhmZjsKKworCS8qIEJsb2NrIHNpemUgaW4gYnl0ZXMgKDUxMikgKi8KKwlidWZmWzRdID0gKFRXX0JMT0NLX1NJWkUgPj4gMjQpOworCWJ1ZmZbNV0gPSAoVFdfQkxPQ0tfU0laRSA+PiAxNikgJiAweGZmOworCWJ1ZmZbNl0gPSAoVFdfQkxPQ0tfU0laRSA+PiA4KSAmIDB4ZmY7CisJYnVmZls3XSA9IFRXX0JMT0NLX1NJWkUgJiAweGZmOworCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19zY3Npb3BfcmVhZF9jYXBhY2l0eV9jb21wbGV0ZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzY3NpIHJlYWQgb3Igd3JpdGUgY29tbWFuZHMgKi8KK3N0YXRpYyBpbnQgdHdfc2NzaW9wX3JlYWRfd3JpdGUoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCkgCit7CisJVFdfQ29tbWFuZCAqY29tbWFuZF9wYWNrZXQ7CisJdW5zaWduZWQgbG9uZyBjb21tYW5kX3F1ZV92YWx1ZTsKKwl1MzIgbGJhID0gMHgwLCBudW1fc2VjdG9ycyA9IDB4MCwgYnVmZmFkZHIgPSAweDA7CisJaW50IGksIHVzZV9zZzsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzcmI7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3Q7CisKKwlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3Npb3BfcmVhZF93cml0ZSgpXG4iKTsKKworCWlmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmZXIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfcmVhZF93cml0ZSgpOiBSZXF1ZXN0IGJ1ZmZlciBOVUxMLlxuIik7CisJCXJldHVybiAxOworCX0KKwlzZ2xpc3QgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlcXVlc3RfYnVmZmVyOworCXNyYiA9IHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdOworCisJLyogSW5pdGlhbGl6ZSBjb21tYW5kIHBhY2tldCAqLworCWNvbW1hbmRfcGFja2V0ID0gKFRXX0NvbW1hbmQgKil0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAoY29tbWFuZF9wYWNrZXQgPT0gTlVMTCkgeworCQlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3Npb3BfcmVhZF93cml0ZSgpOiBCYWQgY29tbWFuZCBwYWNrZXQgdmlydHVhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChzcmItPmNtbmRbMF0gPT0gUkVBRF82IHx8IHNyYi0+Y21uZFswXSA9PSBSRUFEXzEwKSB7CisJCWNvbW1hbmRfcGFja2V0LT5vcGNvZGVfX3NnbG9mZnNldCA9IFRXX09QU0dMX0lOKDMsIFRXX09QX1JFQUQpOworCX0gZWxzZSB7CisJCWNvbW1hbmRfcGFja2V0LT5vcGNvZGVfX3NnbG9mZnNldCA9IFRXX09QU0dMX0lOKDMsIFRXX09QX1dSSVRFKTsKKwl9CisKKwljb21tYW5kX3BhY2tldC0+c2l6ZSA9IDM7CisJY29tbWFuZF9wYWNrZXQtPnJlcXVlc3RfaWQgPSByZXF1ZXN0X2lkOworCWNvbW1hbmRfcGFja2V0LT51bml0X19ob3N0aWQgPSBUV19VTklUSE9TVF9JTigwLCBzcmItPmRldmljZS0+aWQpOworCWNvbW1hbmRfcGFja2V0LT5zdGF0dXMgPSAwOworCWNvbW1hbmRfcGFja2V0LT5mbGFncyA9IDA7CisKKwlpZiAoc3JiLT5jbW5kWzBdID09IFdSSVRFXzEwKSB7CisJCWlmICgoc3JiLT5jbW5kWzFdICYgMHg4KSB8fCAoc3JiLT5jbW5kWzFdICYgMHgxMCkpCisJCQljb21tYW5kX3BhY2tldC0+ZmxhZ3MgPSAxOworCX0KKworCWlmIChzcmItPmNtbmRbMF0gPT0gUkVBRF82IHx8IHNyYi0+Y21uZFswXSA9PSBXUklURV82KSB7CisJCWxiYSA9ICgodTMyKXNyYi0+Y21uZFsxXSA8PCAxNikgfCAoKHUzMilzcmItPmNtbmRbMl0gPDwgOCkgfCAodTMyKXNyYi0+Y21uZFszXTsKKwkJbnVtX3NlY3RvcnMgPSAodTMyKXNyYi0+Y21uZFs0XTsKKwl9IGVsc2UgeworCQlsYmEgPSAoKHUzMilzcmItPmNtbmRbMl0gPDwgMjQpIHwgKCh1MzIpc3JiLT5jbW5kWzNdIDw8IDE2KSB8ICgodTMyKXNyYi0+Y21uZFs0XSA8PCA4KSB8ICh1MzIpc3JiLT5jbW5kWzVdOworCQludW1fc2VjdG9ycyA9ICh1MzIpc3JiLT5jbW5kWzhdIHwgKCh1MzIpc3JiLT5jbW5kWzddIDw8IDgpOworCX0KKyAgCisJLyogVXBkYXRlIHNlY3RvciBzdGF0aXN0aWMgKi8KKwl0d19kZXYtPnNlY3Rvcl9jb3VudCA9IG51bV9zZWN0b3JzOworCWlmICh0d19kZXYtPnNlY3Rvcl9jb3VudCA+IHR3X2Rldi0+bWF4X3NlY3Rvcl9jb3VudCkKKwkJdHdfZGV2LT5tYXhfc2VjdG9yX2NvdW50ID0gdHdfZGV2LT5zZWN0b3JfY291bnQ7CisgIAorCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lvcF9yZWFkX3dyaXRlKCk6IGxiYSA9IDB4JXggbnVtX3NlY3RvcnMgPSAweCV4XG4iLCBsYmEsIG51bV9zZWN0b3JzKTsKKwljb21tYW5kX3BhY2tldC0+Ynl0ZTguaW8ubGJhID0gbGJhOworCWNvbW1hbmRfcGFja2V0LT5ieXRlNi5ibG9ja19jb3VudCA9IG51bV9zZWN0b3JzOworCisJLyogRG8gdGhpcyBpZiB0aGVyZSBhcmUgbm8gc2cgbGlzdCBlbnRyaWVzICovCisJaWYgKHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT51c2Vfc2cgPT0gMCkgeyAgICAKKwkJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaW9wX3JlYWRfd3JpdGUoKTogU0cgPSAwXG4iKTsKKwkJYnVmZmFkZHIgPSB0d19tYXBfc2NzaV9zaW5nbGVfZGF0YSh0d19kZXYtPnR3X3BjaV9kZXYsIHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdKTsKKwkJaWYgKGJ1ZmZhZGRyID09IDApCisJCQlyZXR1cm4gMTsKKworCQljb21tYW5kX3BhY2tldC0+Ynl0ZTguaW8uc2dsWzBdLmFkZHJlc3MgPSBidWZmYWRkcjsKKwkJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LmlvLnNnbFswXS5sZW5ndGggPSB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmbGVuOworCQljb21tYW5kX3BhY2tldC0+c2l6ZSs9MjsKKwl9CisKKwkvKiBEbyB0aGlzIGlmIHdlIGhhdmUgbXVsdGlwbGUgc2cgbGlzdCBlbnRyaWVzICovCisJaWYgKHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT51c2Vfc2cgPiAwKSB7CisJCXVzZV9zZyA9IHR3X21hcF9zY3NpX3NnX2RhdGEodHdfZGV2LT50d19wY2lfZGV2LCB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSk7CisJCWlmICh1c2Vfc2cgPT0gMCkKKwkJCXJldHVybiAxOworCisJCWZvciAoaT0wO2k8dXNlX3NnOyBpKyspIHsKKwkJCWNvbW1hbmRfcGFja2V0LT5ieXRlOC5pby5zZ2xbaV0uYWRkcmVzcyA9IHNnX2RtYV9hZGRyZXNzKCZzZ2xpc3RbaV0pOworCQkJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LmlvLnNnbFtpXS5sZW5ndGggPSBzZ19kbWFfbGVuKCZzZ2xpc3RbaV0pOworCQkJY29tbWFuZF9wYWNrZXQtPnNpemUrPTI7CisJCX0KKwl9CisKKwkvKiBVcGRhdGUgU0cgc3RhdGlzdGljcyAqLworCXR3X2Rldi0+c2dsX2VudHJpZXMgPSB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+dXNlX3NnOworCWlmICh0d19kZXYtPnNnbF9lbnRyaWVzID4gdHdfZGV2LT5tYXhfc2dsX2VudHJpZXMpCisJCXR3X2Rldi0+bWF4X3NnbF9lbnRyaWVzID0gdHdfZGV2LT5zZ2xfZW50cmllczsKKworCWNvbW1hbmRfcXVlX3ZhbHVlID0gdHdfZGV2LT5jb21tYW5kX3BhY2tldF9waHlzaWNhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCWlmIChjb21tYW5kX3F1ZV92YWx1ZSA9PSAwKSB7CisJCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfcmVhZF93cml0ZSgpOiBCYWQgY29tbWFuZCBwYWNrZXQgcGh5c2ljYWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisgICAgICAKKwkvKiBOb3cgdHJ5IHRvIHBvc3QgdGhlIGNvbW1hbmQgdG8gdGhlIGJvYXJkICovCisJdHdfcG9zdF9jb21tYW5kX3BhY2tldCh0d19kZXYsIHJlcXVlc3RfaWQpOworCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19zY3Npb3BfcmVhZF93cml0ZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBoYW5kbGUgdGhlIHJlcXVlc3Qgc2Vuc2Ugc2NzaSBjb21tYW5kICovCitzdGF0aWMgaW50IHR3X3Njc2lvcF9yZXF1ZXN0X3NlbnNlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaW9wX3JlcXVlc3Rfc2Vuc2UoKVxuIik7CisKKwkvKiBGb3Igbm93IHdlIGp1c3QgemVybyB0aGUgcmVxdWVzdCBidWZmZXIgKi8KKwltZW1zZXQodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlcXVlc3RfYnVmZmVyLCAwLCB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmbGVuKTsKKwl0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdID0gVFdfU19DT01QTEVURUQ7CisJdHdfc3RhdGVfcmVxdWVzdF9maW5pc2godHdfZGV2LCByZXF1ZXN0X2lkKTsKKworCS8qIElmIHdlIGdvdCBhIHJlcXVlc3Rfc2Vuc2UsIHdlIHByb2JhYmx5IHdhbnQgYSByZXNldCwgcmV0dXJuIGVycm9yICovCisJdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOworCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5zY3NpX2RvbmUodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0pOworCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19zY3Npb3BfcmVxdWVzdF9zZW5zZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBoYW5kbGUgc3luY2hyb25pemUgY2FjaGUgc2NzaSBjb21tYW5kICovCitzdGF0aWMgaW50IHR3X3Njc2lvcF9zeW5jaHJvbml6ZV9jYWNoZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkKQoreworCVRXX0NvbW1hbmQgKmNvbW1hbmRfcGFja2V0OworCXVuc2lnbmVkIGxvbmcgY29tbWFuZF9xdWVfdmFsdWU7CisKKwlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3Npb3Bfc3luY2hyb25pemVfY2FjaGUoKVxuIik7CisKKwkvKiBTZW5kIGZpcm13YXJlIGZsdXNoIGNvbW1hbmQgZm9yIHRoaXMgdW5pdCAqLworCWNvbW1hbmRfcGFja2V0ID0gKFRXX0NvbW1hbmQgKil0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAoY29tbWFuZF9wYWNrZXQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3Bfc3luY2hyb25pemVfY2FjaGUoKTogQmFkIGNvbW1hbmQgcGFja2V0IHZpcnR1YWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBTZXR1cCB0aGUgY29tbWFuZCBwYWNrZXQgKi8KKwltZW1zZXQoY29tbWFuZF9wYWNrZXQsIDAsIHNpemVvZihUV19TZWN0b3IpKTsKKwljb21tYW5kX3BhY2tldC0+b3Bjb2RlX19zZ2xvZmZzZXQgPSBUV19PUFNHTF9JTigwLCBUV19PUF9GTFVTSF9DQUNIRSk7CisJY29tbWFuZF9wYWNrZXQtPnNpemUgPSAyOworCWNvbW1hbmRfcGFja2V0LT5yZXF1ZXN0X2lkID0gcmVxdWVzdF9pZDsKKwljb21tYW5kX3BhY2tldC0+dW5pdF9faG9zdGlkID0gVFdfVU5JVEhPU1RfSU4oMCwgdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPmRldmljZS0+aWQpOworCWNvbW1hbmRfcGFja2V0LT5zdGF0dXMgPSAwOworCWNvbW1hbmRfcGFja2V0LT5mbGFncyA9IDA7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU2LnBhcmFtZXRlcl9jb3VudCA9IDE7CisJY29tbWFuZF9xdWVfdmFsdWUgPSB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3BoeXNpY2FsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisJaWYgKGNvbW1hbmRfcXVlX3ZhbHVlID09IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfc2NzaW9wX3N5bmNocm9uaXplX2NhY2hlKCk6IEJhZCBjb21tYW5kIHBhY2tldCBwaHlzaWNhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAxOworCX0KKworCS8qIE5vdyB0cnkgdG8gcG9zdCB0aGUgY29tbWFuZCBwYWNrZXQgKi8KKwl0d19wb3N0X2NvbW1hbmRfcGFja2V0KHR3X2RldiwgcmVxdWVzdF9pZCk7CisKKwlyZXR1cm4gMDsKK30gLyogRW5kIHR3X3Njc2lvcF9zeW5jaHJvbml6ZV9jYWNoZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBoYW5kbGUgdGVzdCB1bml0IHJlYWR5IHNjc2kgY29tbWFuZCAqLworc3RhdGljIGludCB0d19zY3Npb3BfdGVzdF91bml0X3JlYWR5KFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJVFdfUGFyYW0gKnBhcmFtOworCVRXX0NvbW1hbmQgKmNvbW1hbmRfcGFja2V0OworCXVuc2lnbmVkIGxvbmcgY29tbWFuZF9xdWVfdmFsdWU7CisJdW5zaWduZWQgbG9uZyBwYXJhbV92YWx1ZTsKKworCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lvcF90ZXN0X3VuaXRfcmVhZHkoKVxuIik7CisKKwkvKiBJbml0aWFsaXplIGNvbW1hbmQgcGFja2V0ICovCisJY29tbWFuZF9wYWNrZXQgPSAoVFdfQ29tbWFuZCAqKXR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCWlmIChjb21tYW5kX3BhY2tldCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3Njc2lvcF90ZXN0X3VuaXRfcmVhZHkoKTogQmFkIGNvbW1hbmQgcGFja2V0IHZpcnR1YWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJbWVtc2V0KGNvbW1hbmRfcGFja2V0LCAwLCBzaXplb2YoVFdfU2VjdG9yKSk7CisJY29tbWFuZF9wYWNrZXQtPm9wY29kZV9fc2dsb2Zmc2V0ID0gVFdfT1BTR0xfSU4oMiwgVFdfT1BfR0VUX1BBUkFNKTsKKwljb21tYW5kX3BhY2tldC0+c2l6ZSA9IDQ7CisJY29tbWFuZF9wYWNrZXQtPnJlcXVlc3RfaWQgPSByZXF1ZXN0X2lkOworCWNvbW1hbmRfcGFja2V0LT5zdGF0dXMgPSAwOworCWNvbW1hbmRfcGFja2V0LT5mbGFncyA9IDA7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU2LnBhcmFtZXRlcl9jb3VudCA9IDE7CisKKwkvKiBOb3cgc2V0dXAgdGhlIHBhcmFtICovCisJaWYgKHR3X2Rldi0+YWxpZ25tZW50X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3Njc2lvcF90ZXN0X3VuaXRfcmVhZHkoKTogQmFkIGFsaWdubWVudCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXBhcmFtID0gKFRXX1BhcmFtICopdHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCW1lbXNldChwYXJhbSwgMCwgc2l6ZW9mKFRXX1NlY3RvcikpOworCXBhcmFtLT50YWJsZV9pZCA9IDM7CSAvKiB1bml0IHN1bW1hcnkgdGFibGUgKi8KKwlwYXJhbS0+cGFyYW1ldGVyX2lkID0gMzsgLyogdW5pdHNzdGF0dXMgcGFyYW1ldGVyICovCisJcGFyYW0tPnBhcmFtZXRlcl9zaXplX2J5dGVzID0gVFdfTUFYX1VOSVRTOworCXBhcmFtX3ZhbHVlID0gdHdfZGV2LT5hbGlnbm1lbnRfcGh5c2ljYWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAocGFyYW1fdmFsdWUgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfdGVzdF91bml0X3JlYWR5KCk6IEJhZCBhbGlnbm1lbnQgcGh5c2ljYWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwljb21tYW5kX3BhY2tldC0+Ynl0ZTgucGFyYW0uc2dsWzBdLmFkZHJlc3MgPSBwYXJhbV92YWx1ZTsKKwljb21tYW5kX3BhY2tldC0+Ynl0ZTgucGFyYW0uc2dsWzBdLmxlbmd0aCA9IHNpemVvZihUV19TZWN0b3IpOworCWNvbW1hbmRfcXVlX3ZhbHVlID0gdHdfZGV2LT5jb21tYW5kX3BhY2tldF9waHlzaWNhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCWlmIChjb21tYW5kX3F1ZV92YWx1ZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3Njc2lvcF90ZXN0X3VuaXRfcmVhZHkoKTogQmFkIGNvbW1hbmQgcGFja2V0IHBoeXNpY2FsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogTm93IHRyeSB0byBwb3N0IHRoZSBjb21tYW5kIHBhY2tldCAqLworCXR3X3Bvc3RfY29tbWFuZF9wYWNrZXQodHdfZGV2LCByZXF1ZXN0X2lkKTsKKworCXJldHVybiAwOworfSAvKiBFbmQgdHdfc2NzaW9wX3Rlc3RfdW5pdF9yZWFkeSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBpc3IgdG8gY29tcGxldGUgYSB0ZXN0dW5pdHJlYWR5IGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgdHdfc2NzaW9wX3Rlc3RfdW5pdF9yZWFkeV9jb21wbGV0ZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkKQoreworCXVuc2lnbmVkIGNoYXIgKmlzX3VuaXRfcHJlc2VudDsKKwlUV19QYXJhbSAqcGFyYW07CisKKwlkcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfc2NzaW9wX3Rlc3RfdW5pdF9yZWFkeV9jb21wbGV0ZSgpXG4iKTsKKworCXBhcmFtID0gKFRXX1BhcmFtICopdHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCWlmIChwYXJhbSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3Njc2lvcF90ZXN0X3VuaXRfcmVhZHlfY29tcGxldGUoKTogQmFkIGFsaWdubWVudCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWlzX3VuaXRfcHJlc2VudCA9ICYocGFyYW0tPmRhdGFbMF0pOworCisJaWYgKGlzX3VuaXRfcHJlc2VudFt0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+ZGV2aWNlLT5pZF0gJiBUV19VTklUX09OTElORSkgeworCQl0d19kZXYtPmlzX3VuaXRfcHJlc2VudFt0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+ZGV2aWNlLT5pZF0gPSAxOworCX0gZWxzZSB7CisJCXR3X2Rldi0+aXNfdW5pdF9wcmVzZW50W3R3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5kZXZpY2UtPmlkXSA9IDA7CisJCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOworCQlyZXR1cm4gVFdfSVNSX0RPTlRfUkVTVUxUOworCX0KKworCXJldHVybiAwOworfSAvKiBFbmQgdHdfc2NzaW9wX3Rlc3RfdW5pdF9yZWFkeV9jb21wbGV0ZSgpICovCisKKy8qIFRoaXMgaXMgdGhlIG1haW4gc2NzaSBxdWV1ZSBmdW5jdGlvbiB0byBoYW5kbGUgc2NzaSBvcGNvZGVzICovCitzdGF0aWMgaW50IHR3X3Njc2lfcXVldWUoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKSAKK3sKKwl1bnNpZ25lZCBjaGFyICpjb21tYW5kID0gU0NwbnQtPmNtbmQ7CisJaW50IHJlcXVlc3RfaWQgPSAwOworCWludCByZXR2YWwgPSAxOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwkvKiBTYXZlIGRvbmUgZnVuY3Rpb24gaW50byBTY3NpX0NtbmQgc3RydWN0ICovCisJU0NwbnQtPnNjc2lfZG9uZSA9IGRvbmU7CisJCSAKKwkvKiBRdWV1ZSB0aGUgY29tbWFuZCBhbmQgZ2V0IGEgcmVxdWVzdCBpZCAqLworCXR3X3N0YXRlX3JlcXVlc3Rfc3RhcnQodHdfZGV2LCAmcmVxdWVzdF9pZCk7CisKKwkvKiBTYXZlIHRoZSBzY3NpIGNvbW1hbmQgZm9yIHVzZSBieSB0aGUgSVNSICovCisJdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0gPSBTQ3BudDsKKworCS8qIEluaXRpYWxpemUgcGhhc2UgdG8gemVybyAqLworCVNDcG50LT5TQ3AucGhhc2UgPSBUV19QSEFTRV9JTklUSUFMOworCisJc3dpdGNoICgqY29tbWFuZCkgeworCQljYXNlIFJFQURfMTA6CisJCWNhc2UgUkVBRF82OgorCQljYXNlIFdSSVRFXzEwOgorCQljYXNlIFdSSVRFXzY6CisJCQlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3NpX3F1ZXVlKCk6IGNhdWdodCBSRUFEL1dSSVRFLlxuIik7CisJCQlyZXR2YWwgPSB0d19zY3Npb3BfcmVhZF93cml0ZSh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJYnJlYWs7CisJCWNhc2UgVEVTVF9VTklUX1JFQURZOgorCQkJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaV9xdWV1ZSgpOiBjYXVnaHQgVEVTVF9VTklUX1JFQURZLlxuIik7CisJCQlyZXR2YWwgPSB0d19zY3Npb3BfdGVzdF91bml0X3JlYWR5KHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCQlicmVhazsKKwkJY2FzZSBJTlFVSVJZOgorCQkJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaV9xdWV1ZSgpOiBjYXVnaHQgSU5RVUlSWS5cbiIpOworCQkJcmV0dmFsID0gdHdfc2NzaW9wX2lucXVpcnkodHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJCWJyZWFrOworCQljYXNlIFJFQURfQ0FQQUNJVFk6CisJCQlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3NpX3F1ZXVlKCk6IGNhdWdodCBSRUFEX0NBUEFDSVRZLlxuIik7CisJCQlyZXR2YWwgPSB0d19zY3Npb3BfcmVhZF9jYXBhY2l0eSh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJYnJlYWs7CisJICAgICAgICBjYXNlIFJFUVVFU1RfU0VOU0U6CisJCSAgICAgICAgZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaV9xdWV1ZSgpOiBjYXVnaHQgUkVRVUVTVF9TRU5TRS5cbiIpOworCQkgICAgICAgIHJldHZhbCA9IHR3X3Njc2lvcF9yZXF1ZXN0X3NlbnNlKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCSAgICAgICAgYnJlYWs7CisJCWNhc2UgTU9ERV9TRU5TRToKKwkJCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lfcXVldWUoKTogY2F1Z2h0IE1PREVfU0VOU0UuXG4iKTsKKwkJCXJldHZhbCA9IHR3X3Njc2lvcF9tb2RlX3NlbnNlKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCQlicmVhazsKKwkJY2FzZSBTWU5DSFJPTklaRV9DQUNIRToKKwkJCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lfcXVldWUoKTogY2F1Z2h0IFNZTkNIUk9OSVpFX0NBQ0hFLlxuIik7CisJCQlyZXR2YWwgPSB0d19zY3Npb3Bfc3luY2hyb25pemVfY2FjaGUodHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJCWJyZWFrOworCQljYXNlIFRXX0lPQ1RMOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogU0NTSV9JT0NUTF9TRU5EX0NPTU1BTkQgZGVwcmVjYXRlZCwgcGxlYXNlIHVwZGF0ZSB5b3VyIDN3YXJlIHRvb2xzLlxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogc2NzaSVkOiBVbmtub3duIHNjc2kgb3Bjb2RlOiAweCV4XG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8sICpjb21tYW5kKTsKKwkJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJCXR3X3N0YXRlX3JlcXVlc3RfZmluaXNoKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCQlTQ3BudC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwkJCWRvbmUoU0NwbnQpOworCQkJcmV0dmFsID0gMDsKKwl9CisJaWYgKHJldHZhbCkgeworCQl0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdID0gVFdfU19DT01QTEVURUQ7CisJCXR3X3N0YXRlX3JlcXVlc3RfZmluaXNoKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCVNDcG50LT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJZG9uZShTQ3BudCk7CisJCXJldHZhbCA9IDA7CisJfQorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d19zY3NpX3F1ZXVlKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAqLworc3RhdGljIGlycXJldHVybl90IHR3X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCisJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpIAoreworCWludCByZXF1ZXN0X2lkOworCXUzMiBzdGF0dXNfcmVnX3ZhbHVlOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopZGV2X2luc3RhbmNlOworCVRXX1Jlc3BvbnNlX1F1ZXVlIHJlc3BvbnNlX3F1ZTsKKwlpbnQgZXJyb3IgPSAwLCByZXR2YWwgPSAwOworCVRXX0NvbW1hbmQgKmNvbW1hbmRfcGFja2V0OworCWludCBoYW5kbGVkID0gMDsKKworCS8qIEdldCB0aGUgaG9zdCBsb2NrIGZvciBpbyBjb21wbGV0aW9ucyAqLworCXNwaW5fbG9jayh0d19kZXYtPmhvc3QtPmhvc3RfbG9jayk7CisKKwkvKiBSZWFkIHRoZSByZWdpc3RlcnMgKi8KKwlzdGF0dXNfcmVnX3ZhbHVlID0gaW5sKFRXX1NUQVRVU19SRUdfQUREUih0d19kZXYpKTsKKworCS8qIENoZWNrIGlmIHRoaXMgaXMgb3VyIGludGVycnVwdCwgb3RoZXJ3aXNlIGJhaWwgKi8KKwlpZiAoIShzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1ZBTElEX0lOVEVSUlVQVCkpCisJCWdvdG8gdHdfaW50ZXJydXB0X2JhaWw7CisKKwloYW5kbGVkID0gMTsKKworCS8qIENoZWNrIGNvbnRyb2xsZXIgZm9yIGVycm9ycyAqLworCWlmICh0d19jaGVja19iaXRzKHN0YXR1c19yZWdfdmFsdWUpKSB7CisJCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19pbnRlcnJ1cHQoKTogVW5leHBlY3RlZCBiaXRzLlxuIik7CisJCWlmICh0d19kZWNvZGVfYml0cyh0d19kZXYsIHN0YXR1c19yZWdfdmFsdWUsIDEpKSB7CisJCQlUV19DTEVBUl9BTExfSU5URVJSVVBUUyh0d19kZXYpOworCQkJZ290byB0d19pbnRlcnJ1cHRfYmFpbDsKKwkJfQorCX0KKworCS8qIEhhbmRsZSBob3N0IGludGVycnVwdCAqLworCWlmIChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX0hPU1RfSU5URVJSVVBUKSB7CisJCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X2ludGVycnVwdCgpOiBSZWNlaXZlZCBob3N0IGludGVycnVwdC5cbiIpOworCQlUV19DTEVBUl9IT1NUX0lOVEVSUlVQVCh0d19kZXYpOworCX0KKworCS8qIEhhbmRsZSBhdHRlbnRpb24gaW50ZXJydXB0ICovCisJaWYgKHN0YXR1c19yZWdfdmFsdWUgJiBUV19TVEFUVVNfQVRURU5USU9OX0lOVEVSUlVQVCkgeworCQlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19pbnRlcnJ1cHQoKTogUmVjZWl2ZWQgYXR0ZW50aW9uIGludGVycnVwdC5cbiIpOworCQlUV19DTEVBUl9BVFRFTlRJT05fSU5URVJSVVBUKHR3X2Rldik7CisJCXR3X3N0YXRlX3JlcXVlc3Rfc3RhcnQodHdfZGV2LCAmcmVxdWVzdF9pZCk7CisJCWVycm9yID0gdHdfYWVuX3JlYWRfcXVldWUodHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJaWYgKGVycm9yKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBzY3NpJWQ6IEVycm9yIHJlYWRpbmcgYWVuIHF1ZXVlLlxuIiwgdHdfZGV2LT5ob3N0LT5ob3N0X25vKTsKKwkJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJCXR3X3N0YXRlX3JlcXVlc3RfZmluaXNoKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCX0KKwl9CisKKwkvKiBIYW5kbGUgY29tbWFuZCBpbnRlcnJ1cHQgKi8KKwlpZiAoc3RhdHVzX3JlZ192YWx1ZSAmIFRXX1NUQVRVU19DT01NQU5EX0lOVEVSUlVQVCkgeworCQkvKiBEcmFpbiBhcyBtYW55IHBlbmRpbmcgY29tbWFuZHMgYXMgd2UgY2FuICovCisJCXdoaWxlICh0d19kZXYtPnBlbmRpbmdfcmVxdWVzdF9jb3VudCA+IDApIHsKKwkJCXJlcXVlc3RfaWQgPSB0d19kZXYtPnBlbmRpbmdfcXVldWVbdHdfZGV2LT5wZW5kaW5nX2hlYWRdOworCQkJaWYgKHR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gIT0gVFdfU19QRU5ESU5HKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogc2NzaSVkOiBGb3VuZCByZXF1ZXN0IGlkIHRoYXQgd2Fzbid0IHBlbmRpbmcuXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8pOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHR3X3Bvc3RfY29tbWFuZF9wYWNrZXQodHdfZGV2LCByZXF1ZXN0X2lkKT09MCkgeworCQkJCWlmICh0d19kZXYtPnBlbmRpbmdfaGVhZCA9PSBUV19RX0xFTkdUSC0xKSB7CisJCQkJCXR3X2Rldi0+cGVuZGluZ19oZWFkID0gVFdfUV9TVEFSVDsKKwkJCQl9IGVsc2UgeworCQkJCQl0d19kZXYtPnBlbmRpbmdfaGVhZCA9IHR3X2Rldi0+cGVuZGluZ19oZWFkICsgMTsKKwkJCQl9CisJCQkJdHdfZGV2LT5wZW5kaW5nX3JlcXVlc3RfY291bnQtLTsKKwkJCX0gZWxzZSB7CisJCQkJLyogSWYgd2UgZ2V0IGhlcmUsIHdlIHdpbGwgY29udGludWUgcmUtcG9zdGluZyBvbiB0aGUgbmV4dCBjb21tYW5kIGludGVycnVwdCAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qIElmIHRoZXJlIGFyZSBubyBtb3JlIHBlbmRpbmcgcmVxdWVzdHMsIHdlIG1hc2sgY29tbWFuZCBpbnRlcnJ1cHQgKi8KKwkJaWYgKHR3X2Rldi0+cGVuZGluZ19yZXF1ZXN0X2NvdW50ID09IDApIAorCQkJVFdfTUFTS19DT01NQU5EX0lOVEVSUlVQVCh0d19kZXYpOworCX0KKworCS8qIEhhbmRsZSByZXNwb25zZSBpbnRlcnJ1cHQgKi8KKwlpZiAoc3RhdHVzX3JlZ192YWx1ZSAmIFRXX1NUQVRVU19SRVNQT05TRV9JTlRFUlJVUFQpIHsKKwkJLyogRHJhaW4gdGhlIHJlc3BvbnNlIHF1ZXVlIGZyb20gdGhlIGJvYXJkICovCisJCXdoaWxlICgoc3RhdHVzX3JlZ192YWx1ZSAmIFRXX1NUQVRVU19SRVNQT05TRV9RVUVVRV9FTVBUWSkgPT0gMCkgeworCQkJLyogUmVhZCByZXNwb25zZSBxdWV1ZSByZWdpc3RlciAqLworCQkJcmVzcG9uc2VfcXVlLnZhbHVlID0gaW5sKFRXX1JFU1BPTlNFX1FVRVVFX1JFR19BRERSKHR3X2RldikpOworCQkJcmVxdWVzdF9pZCA9IFRXX1JFU0lEX09VVChyZXNwb25zZV9xdWUucmVzcG9uc2VfaWQpOworCQkJY29tbWFuZF9wYWNrZXQgPSAoVFdfQ29tbWFuZCAqKXR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCQkJZXJyb3IgPSAwOworCisJCQkvKiBDaGVjayBmb3IgYmFkIHJlc3BvbnNlICovCisJCQlpZiAoY29tbWFuZF9wYWNrZXQtPnN0YXR1cyAhPSAwKSB7CisJCQkJLyogSWYgaW50ZXJuYWwgY29tbWFuZCwgZG9uJ3QgZXJyb3IsIGRvbid0IGZpbGwgc2Vuc2UgKi8KKwkJCQlpZiAodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0gPT0gTlVMTCkgeworCQkJCQl0d19kZWNvZGVfc2Vuc2UodHdfZGV2LCByZXF1ZXN0X2lkLCAwKTsKKwkJCQl9IGVsc2UgeworCQkJCQllcnJvciA9IHR3X2RlY29kZV9zZW5zZSh0d19kZXYsIHJlcXVlc3RfaWQsIDEpOworCQkJCX0KKwkJCX0KKworCQkJLyogQ2hlY2sgZm9yIGNvcnJlY3Qgc3RhdGUgKi8KKwkJCWlmICh0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdICE9IFRXX1NfUE9TVEVEKSB7CisJCQkJaWYgKHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdICE9IE5VTEwpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogc2NzaSVkOiBSZWNlaXZlZCBhIHJlcXVlc3QgaWQgdGhhdCB3YXNuJ3QgcG9zdGVkLlxuIiwgdHdfZGV2LT5ob3N0LT5ob3N0X25vKTsKKwkJCQkJZXJyb3IgPSAxOworCQkJCX0KKwkJCX0KKworCQkJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfaW50ZXJydXB0KCk6IFJlc3BvbnNlIHF1ZXVlIHJlcXVlc3QgaWQ6ICVkLlxuIiwgcmVxdWVzdF9pZCk7CisKKwkJCS8qIENoZWNrIGZvciBpbnRlcm5hbCBjb21tYW5kIGNvbXBsZXRpb24gKi8KKwkJCWlmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSA9PSBOVUxMKSB7CisJCQkJZHByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2ludGVycnVwdCgpOiBGb3VuZCBpbnRlcm5hbGx5IHBvc3RlZCBjb21tYW5kLlxuIik7CisJCQkJLyogQ2hlY2sgZm9yIGNocmRldiBpb2N0bCBjb21wbGV0aW9uICovCisJCQkJaWYgKHJlcXVlc3RfaWQgIT0gdHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCkgeworCQkJCQlyZXR2YWwgPSB0d19hZW5fY29tcGxldGUodHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJCQkJaWYgKHJldHZhbCkgeworCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogc2NzaSVkOiBFcnJvciBjb21wbGV0aW5nIGFlbi5cbiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubyk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl0d19kZXYtPmNocmRldl9yZXF1ZXN0X2lkID0gVFdfSU9DVExfQ0hSREVWX0ZSRUU7CisJCQkJCXdha2VfdXAoJnR3X2Rldi0+aW9jdGxfd3F1ZXVlKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN3aXRjaCAodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPmNtbmRbMF0pIHsKKwkJCQljYXNlIFJFQURfMTA6CisJCQkJY2FzZSBSRUFEXzY6CisJCQkJCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X2ludGVycnVwdCgpOiBjYXVnaHQgUkVBRF8xMC9SRUFEXzZcbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFdSSVRFXzEwOgorCQkJCWNhc2UgV1JJVEVfNjoKKwkJCQkJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfaW50ZXJydXB0KCk6IGNhdWdodCBXUklURV8xMC9XUklURV82XG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBURVNUX1VOSVRfUkVBRFk6CisJCQkJCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X2ludGVycnVwdCgpOiBjYXVnaHQgVEVTVF9VTklUX1JFQURZXG4iKTsKKwkJCQkJZXJyb3IgPSB0d19zY3Npb3BfdGVzdF91bml0X3JlYWR5X2NvbXBsZXRlKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU5RVUlSWToKKwkJCQkJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfaW50ZXJydXB0KCk6IGNhdWdodCBJTlFVSVJZXG4iKTsKKwkJCQkJZXJyb3IgPSB0d19zY3Npb3BfaW5xdWlyeV9jb21wbGV0ZSh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFJFQURfQ0FQQUNJVFk6CisJCQkJCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X2ludGVycnVwdCgpOiBjYXVnaHQgUkVBRF9DQVBBQ0lUWVxuIik7CisJCQkJCWVycm9yID0gdHdfc2NzaW9wX3JlYWRfY2FwYWNpdHlfY29tcGxldGUodHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBNT0RFX1NFTlNFOgorCQkJCQlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19pbnRlcnJ1cHQoKTogY2F1Z2h0IE1PREVfU0VOU0VcbiIpOworCQkJCQllcnJvciA9IHR3X3Njc2lvcF9tb2RlX3NlbnNlX2NvbXBsZXRlKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU1lOQ0hST05JWkVfQ0FDSEU6CisJCQkJCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X2ludGVycnVwdCgpOiBjYXVnaHQgU1lOQ0hST05JWkVfQ0FDSEVcbiIpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBjYXNlIHNsaXAgaW4gdHdfaW50ZXJydXB0KClcbiIpOworCQkJCQllcnJvciA9IDE7CisJCQkJfQorCisJCQkJLyogSWYgbm8gZXJyb3IgY29tbWFuZCB3YXMgYSBzdWNjZXNzICovCisJCQkJaWYgKGVycm9yID09IDApIHsKKwkJCQkJdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlc3VsdCA9IChESURfT0sgPDwgMTYpOworCQkJCX0KKworCQkJCS8qIElmIGVycm9yLCBjb21tYW5kIGZhaWxlZCAqLworCQkJCWlmIChlcnJvciA9PSAxKSB7CisJCQkJCS8qIEFzayBmb3IgYSBob3N0IHJlc2V0ICovCisJCQkJCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KSB8IChDSEVDS19DT05ESVRJT04gPDwgMSk7CisJCQkJfQorCisJCQkJLyogTm93IGNvbXBsZXRlIHRoZSBpbyAqLworCQkJCWlmICgoZXJyb3IgIT0gVFdfSVNSX0RPTlRfQ09NUExFVEUpKSB7CisJCQkJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJCQkJdHdfc3RhdGVfcmVxdWVzdF9maW5pc2godHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJCQkJdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudC0tOworCQkJCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+c2NzaV9kb25lKHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdKTsKKwkJCQkJCisJCQkJCXR3X3VubWFwX3Njc2lfZGF0YSh0d19kZXYtPnR3X3BjaV9kZXYsIHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdKTsKKwkJCQl9CisJCQl9CisJCQkJCisJCQkvKiBDaGVjayBmb3IgdmFsaWQgc3RhdHVzIGFmdGVyIGVhY2ggZHJhaW4gKi8KKwkJCXN0YXR1c19yZWdfdmFsdWUgPSBpbmwoVFdfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOworCQkJaWYgKHR3X2NoZWNrX2JpdHMoc3RhdHVzX3JlZ192YWx1ZSkpIHsKKwkJCQlkcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfaW50ZXJydXB0KCk6IFVuZXhwZWN0ZWQgYml0cy5cbiIpOworCQkJCWlmICh0d19kZWNvZGVfYml0cyh0d19kZXYsIHN0YXR1c19yZWdfdmFsdWUsIDEpKSB7CisJCQkJCVRXX0NMRUFSX0FMTF9JTlRFUlJVUFRTKHR3X2Rldik7CisJCQkJCWdvdG8gdHdfaW50ZXJydXB0X2JhaWw7CisJCQkJfQorCQkJfQorCQl9CisJfQorCit0d19pbnRlcnJ1cHRfYmFpbDoKKwlzcGluX3VubG9jayh0d19kZXYtPmhvc3QtPmhvc3RfbG9jayk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9IC8qIEVuZCB0d19pbnRlcnJ1cHQoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHRlbGxzIHRoZSBjb250cm9sbGVyIHRvIHNodXQgZG93biAqLworc3RhdGljIHZvaWQgX190d19zaHV0ZG93bihUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYpCit7CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJVFdfRElTQUJMRV9JTlRFUlJVUFRTKHR3X2Rldik7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBTaHV0dGluZyBkb3duIGhvc3QgJWQuXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8pOworCisJLyogVGVsbCB0aGUgY2FyZCB3ZSBhcmUgc2h1dHRpbmcgZG93biAqLworCWlmICh0d19pbml0Y29ubmVjdGlvbih0d19kZXYsIDEpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IENvbm5lY3Rpb24gc2h1dGRvd24gZmFpbGVkLlxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogU2h1dGRvd24gY29tcGxldGUuXG4iKTsKKwl9CisKKwkvKiBDbGVhciBhbGwgaW50ZXJydXB0cyBqdXN0IGJlZm9yZSBleGl0ICovCisJVFdfRU5BQkxFX0FORF9DTEVBUl9JTlRFUlJVUFRTKHR3X2Rldik7Cit9IC8qIEVuZCBfX3R3X3NodXRkb3duKCkgKi8KKworLyogV3JhcHBlciBmb3IgX190d19zaHV0ZG93biAqLworc3RhdGljIHZvaWQgdHdfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwY2lfZ2V0X2RydmRhdGEodG9fcGNpX2RldihkZXYpKTsKKwlUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYgPSAoVFdfRGV2aWNlX0V4dGVuc2lvbiAqKWhvc3QtPmhvc3RkYXRhOworCisJX190d19zaHV0ZG93bih0d19kZXYpOworfSAvKiBFbmQgdHdfc2h1dGRvd24oKSAqLworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9ICIzd2FyZSBTdG9yYWdlIENvbnRyb2xsZXIiLAorCS5xdWV1ZWNvbW1hbmQJCT0gdHdfc2NzaV9xdWV1ZSwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCT0gdHdfc2NzaV9laF9yZXNldCwKKwkuYmlvc19wYXJhbQkJPSB0d19zY3NpX2Jpb3NwYXJhbSwKKwkuY2hhbmdlX3F1ZXVlX2RlcHRoCT0gdHdfY2hhbmdlX3F1ZXVlX2RlcHRoLAorCS5jYW5fcXVldWUJCT0gVFdfUV9MRU5HVEgtMiwKKwkudGhpc19pZAkJPSAtMSwKKwkuc2dfdGFibGVzaXplCQk9IFRXX01BWF9TR0xfTEVOR1RILAorCS5tYXhfc2VjdG9ycwkJPSBUV19NQVhfU0VDVE9SUywKKwkuY21kX3Blcl9sdW4JCT0gVFdfTUFYX0NNRFNfUEVSX0xVTiwJCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAorCS5zaG9zdF9hdHRycwkJPSB0d19ob3N0X2F0dHJzLAorCS5lbXVsYXRlZAkJPSAxCit9OworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJvYmUgYW5kIGluaXRpYWxpemUgYSBjYXJkICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0d19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gTlVMTDsKKwlUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXY7CisJaW50IHJldHZhbCA9IC1FTk9ERVY7CisKKwlyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IEZhaWxlZCB0byBlbmFibGUgcGNpIGRldmljZS4iKTsKKwkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlyZXR2YWwgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIFRXX0RNQV9NQVNLKTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IEZhaWxlZCB0byBzZXQgZG1hIG1hc2suIik7CisJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOworCX0KKworCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmRyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKFRXX0RldmljZV9FeHRlbnNpb24pKTsKKwlpZiAoIWhvc3QpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZGV2aWNlIGV4dGVuc2lvbi4iKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CisJfQorCXR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopaG9zdC0+aG9zdGRhdGE7CisKKwltZW1zZXQodHdfZGV2LCAwLCBzaXplb2YoVFdfRGV2aWNlX0V4dGVuc2lvbikpOworCisJLyogU2F2ZSB2YWx1ZXMgdG8gZGV2aWNlIGV4dGVuc2lvbiAqLworCXR3X2Rldi0+aG9zdCA9IGhvc3Q7CisJdHdfZGV2LT50d19wY2lfZGV2ID0gcGRldjsKKworCWlmICh0d19pbml0aWFsaXplX2RldmljZV9leHRlbnNpb24odHdfZGV2KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZXZpY2UgZXh0ZW5zaW9uLiIpOworCQlnb3RvIG91dF9mcmVlX2RldmljZV9leHRlbnNpb247CisJfQorCisJLyogUmVxdWVzdCBJTyByZWdpb25zICovCisJcmV0dmFsID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAiM3cteHh4eCIpOworCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogRmFpbGVkIHRvIGdldCBtZW0gcmVnaW9uLiIpOworCQlnb3RvIG91dF9mcmVlX2RldmljZV9leHRlbnNpb247CisJfQorCisJLyogU2F2ZSBiYXNlIGFkZHJlc3MgKi8KKwl0d19kZXYtPmJhc2VfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlpZiAoIXR3X2Rldi0+YmFzZV9hZGRyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IEZhaWxlZCB0byBnZXQgaW8gYWRkcmVzcy4iKTsKKwkJZ290byBvdXRfcmVsZWFzZV9tZW1fcmVnaW9uOworCX0KKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBvbiB0aGUgY2FyZCAqLworCVRXX0RJU0FCTEVfSU5URVJSVVBUUyh0d19kZXYpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY2FyZCAqLworCWlmICh0d19yZXNldF9zZXF1ZW5jZSh0d19kZXYpKQorCQlnb3RvIG91dF9yZWxlYXNlX21lbV9yZWdpb247CisKKwkvKiBTZXQgaG9zdCBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCisJaG9zdC0+bWF4X2lkID0gVFdfTUFYX1VOSVRTOworCWhvc3QtPm1heF9jbWRfbGVuID0gVFdfTUFYX0NEQl9MRU47CisKKwkvKiBMdW5zIGFuZCBjaGFubmVscyBhcmVuJ3Qgc3VwcG9ydGVkIGJ5IGFkYXB0ZXIgKi8KKwlob3N0LT5tYXhfbHVuID0gMDsKKwlob3N0LT5tYXhfY2hhbm5lbCA9IDA7CisKKwkvKiBSZWdpc3RlciB0aGUgY2FyZCB3aXRoIHRoZSBrZXJuZWwgU0NTSSBsYXllciAqLworCXJldHZhbCA9IHNjc2lfYWRkX2hvc3QoaG9zdCwgJnBkZXYtPmRldik7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBzY3NpIGFkZCBob3N0IGZhaWxlZCIpOworCQlnb3RvIG91dF9yZWxlYXNlX21lbV9yZWdpb247CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogc2NzaSVkOiBGb3VuZCBhIDN3YXJlIFN0b3JhZ2UgQ29udHJvbGxlciBhdCAweCV4LCBJUlE6ICVkLlxuIiwgaG9zdC0+aG9zdF9ubywgdHdfZGV2LT5iYXNlX2FkZHIsIHBkZXYtPmlycSk7CisKKwkvKiBOb3cgc2V0dXAgdGhlIGludGVycnVwdCBoYW5kbGVyICovCisJcmV0dmFsID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCB0d19pbnRlcnJ1cHQsIFNBX1NISVJRLCAiM3cteHh4eCIsIHR3X2Rldik7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBFcnJvciByZXF1ZXN0aW5nIElSUS4iKTsKKwkJZ290byBvdXRfcmVtb3ZlX2hvc3Q7CisJfQorCisJdHdfZGV2aWNlX2V4dGVuc2lvbl9saXN0W3R3X2RldmljZV9leHRlbnNpb25fY291bnRdID0gdHdfZGV2OworCXR3X2RldmljZV9leHRlbnNpb25fY291bnQrKzsKKworCS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBjYXJkICovCisJVFdfRU5BQkxFX0FORF9DTEVBUl9JTlRFUlJVUFRTKHR3X2Rldik7CisKKwkvKiBGaW5hbGx5LCBzY2FuIHRoZSBob3N0ICovCisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisKKwlpZiAodHdlX21ham9yID09IC0xKSB7CisJCWlmICgodHdlX21ham9yID0gcmVnaXN0ZXJfY2hyZGV2ICgwLCAidHdlIiwgJnR3X2ZvcHMpKSA8IDApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBGYWlsZWQgdG8gcmVnaXN0ZXIgY2hhcmFjdGVyIGRldmljZS4iKTsKKwl9CisJcmV0dXJuIDA7CisKK291dF9yZW1vdmVfaG9zdDoKKwlzY3NpX3JlbW92ZV9ob3N0KGhvc3QpOworb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworb3V0X2ZyZWVfZGV2aWNlX2V4dGVuc2lvbjoKKwl0d19mcmVlX2RldmljZV9leHRlbnNpb24odHdfZGV2KTsKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworb3V0X2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d19wcm9iZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlbW92ZSBhIGRldmljZSAqLworc3RhdGljIHZvaWQgdHdfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2ID0gKFRXX0RldmljZV9FeHRlbnNpb24gKilob3N0LT5ob3N0ZGF0YTsKKworCXNjc2lfcmVtb3ZlX2hvc3QodHdfZGV2LT5ob3N0KTsKKworCS8qIFVucmVnaXN0ZXIgY2hhcmFjdGVyIGRldmljZSAqLworCWlmICh0d2VfbWFqb3IgPj0gMCkgeworCQl1bnJlZ2lzdGVyX2NocmRldih0d2VfbWFqb3IsICJ0d2UiKTsKKwkJdHdlX21ham9yID0gLTE7CisJfQorCisJLyogRnJlZSB1cCB0aGUgSVJRICovCisJZnJlZV9pcnEodHdfZGV2LT50d19wY2lfZGV2LT5pcnEsIHR3X2Rldik7CisKKwkvKiBTaHV0ZG93biB0aGUgY2FyZCAqLworCV9fdHdfc2h1dGRvd24odHdfZGV2KTsKKworCS8qIEZyZWUgdXAgdGhlIG1lbSByZWdpb24gKi8KKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCisJLyogRnJlZSB1cCBkZXZpY2UgZXh0ZW5zaW9uIHJlc291cmNlcyAqLworCXR3X2ZyZWVfZGV2aWNlX2V4dGVuc2lvbih0d19kZXYpOworCisJc2NzaV9ob3N0X3B1dCh0d19kZXYtPmhvc3QpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwl0d19kZXZpY2VfZXh0ZW5zaW9uX2NvdW50LS07Cit9IC8qIEVuZCB0d19yZW1vdmUoKSAqLworCisvKiBQQ0kgRGV2aWNlcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0d19wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfM1dBUkUsIFBDSV9ERVZJQ0VfSURfM1dBUkVfMTAwMCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgUENJX1ZFTkRPUl9JRF8zV0FSRSwgUENJX0RFVklDRV9JRF8zV0FSRV83MDAwLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHR3X3BjaV90YmwpOworCisvKiBwY2lfZHJpdmVyIGluaXRpYWxpemVyICovCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdHdfZHJpdmVyID0geworCS5uYW1lCQk9ICIzdy14eHh4IiwKKwkuaWRfdGFibGUJPSB0d19wY2lfdGJsLAorCS5wcm9iZQkJPSB0d19wcm9iZSwKKwkucmVtb3ZlCQk9IHR3X3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLnNodXRkb3duID0gdHdfc2h1dGRvd24KKwl9Cit9OworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBkcml2ZXIgaW5pdGlhbGl6YXRpb24gKi8KK3N0YXRpYyBpbnQgX19pbml0IHR3X2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIzd2FyZSBTdG9yYWdlIENvbnRyb2xsZXIgZGV2aWNlIGRyaXZlciBmb3IgTGludXggdiVzLlxuIiwgVFdfRFJJVkVSX1ZFUlNJT04pOworCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmdHdfZHJpdmVyKTsKK30gLyogRW5kIHR3X2luaXQoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBkcml2ZXIgZXhpdCAqLworc3RhdGljIHZvaWQgX19leGl0IHR3X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnR3X2RyaXZlcik7Cit9IC8qIEVuZCB0d19leGl0KCkgKi8KKworbW9kdWxlX2luaXQodHdfaW5pdCk7Cittb2R1bGVfZXhpdCh0d19leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpLzN3LXh4eHguaCBiL2RyaXZlcnMvc2NzaS8zdy14eHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThiYWQ3NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS8zdy14eHh4LmgKQEAgLTAsMCArMSw0MzYgQEAKKy8qIAorICAgM3cteHh4eC5oIC0tIDN3YXJlIFN0b3JhZ2UgQ29udHJvbGxlciBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAgIAorICAgV3JpdHRlbiBCeTogQWRhbSBSYWRmb3JkIDxsaW51eHJhaWRAYW1jYy5jb20+CisgICBNb2RpZmljYXRpb25zIEJ5OiBKb2VsIEphY29ic29uIDxsaW51eEAzd2FyZS5jb20+CisgICAJCSAgICAgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgICAgICAgICAgICAgICAgICAgICBCcmFkIFN0cmFuZCA8bGludXhAM3dhcmUuY29tPgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSAzd2FyZSBJbmMuCisKKyAgIEtlcm5lbCBjb21wYXRpYmxpdHkgQnk6CUFuZHJlIEhlZHJpY2sgPGFuZHJlQHN1c2UuY29tPgorICAgTm9uLUNvcHlyaWdodCAoQykgMjAwMAlBbmRyZSBIZWRyaWNrIDxhbmRyZUBzdXNlLmNvbT4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICAgCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgIAorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgICAKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgIE5PIFdBUlJBTlRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgICAgICAgIAorICAgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgICAgICAKKyAgIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsICAgICAgCisgICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzICAgIAorICAgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCAgICAgICAKKyAgIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyAgICAgICAgCisgICBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gICAgIAorICAgdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgICAgICAgICAKKyAgIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiAgCisKKyAgIERJU0NMQUlNRVIgT0YgTElBQklMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSAgIAorICAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMICAgICAgICAKKyAgIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EICAgCisgICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgICAgIAorICAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSAgICAKKyAgIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCAgCisgICBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTICAgICAgICAgICAgIAorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAgIAorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgICAKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisKKyAgIEJ1Z3MvQ29tbWVudHMvU3VnZ2VzdGlvbnMgc2hvdWxkIGJlIG1haWxlZCB0bzogICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBsaW51eHJhaWRAYW1jYy5jb20KKyAgIAorICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIGdvdG86CisgICBodHRwOi8vd3d3LmFtY2MuY29tCisqLworCisjaWZuZGVmIF8zV19YWFhYX0gKKyNkZWZpbmUgXzNXX1hYWFhfSAorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEFFTiBzdHJpbmdzICovCitzdGF0aWMgY2hhciAqdHdfYWVuX3N0cmluZ1tdID0geworCVsweDAwMF0gPSAiSU5GTzogQUVOIHF1ZXVlIGVtcHR5IiwKKwlbMHgwMDFdID0gIklORk86IFNvZnQgcmVzZXQgb2NjdXJyZWQiLAorCVsweDAwMl0gPSAiRVJST1I6IFVuaXQgZGVncmFkZWQ6IFVuaXQgIyIsCisJWzB4MDAzXSA9ICJFUlJPUjogQ29udHJvbGxlciBlcnJvciIsCisJWzB4MDA0XSA9ICJFUlJPUjogUmVidWlsZCBmYWlsZWQ6IFVuaXQgIyIsCisJWzB4MDA1XSA9ICJJTkZPOiBSZWJ1aWxkIGNvbXBsZXRlOiBVbml0ICMiLAorCVsweDAwNl0gPSAiRVJST1I6IEluY29tcGxldGUgdW5pdCBkZXRlY3RlZDogVW5pdCAjIiwKKwlbMHgwMDddID0gIklORk86IEluaXRpYWxpemF0aW9uIGNvbXBsZXRlOiBVbml0ICMiLAorCVsweDAwOF0gPSAiV0FSTklORzogVW5jbGVhbiBzaHV0ZG93biBkZXRlY3RlZDogVW5pdCAjIiwKKwlbMHgwMDldID0gIldBUk5JTkc6IEFUQSBwb3J0IHRpbWVvdXQ6IFBvcnQgIyIsCisJWzB4MDBBXSA9ICJFUlJPUjogRHJpdmUgZXJyb3I6IFBvcnQgIyIsCisJWzB4MDBCXSA9ICJJTkZPOiBSZWJ1aWxkIHN0YXJ0ZWQ6IFVuaXQgIyIsCisJWzB4MDBDXSA9ICJJTkZPOiBJbml0aWFsaXphdGlvbiBzdGFydGVkOiBVbml0ICMiLAorCVsweDAwRF0gPSAiRVJST1I6IExvZ2ljYWwgdW5pdCBkZWxldGVkOiBVbml0ICMiLAorCVsweDAwRl0gPSAiV0FSTklORzogU01BUlQgdGhyZXNob2xkIGV4Y2VlZGVkOiBQb3J0ICMiLAorCVsweDAyMV0gPSAiV0FSTklORzogQVRBIFVETUEgZG93bmdyYWRlOiBQb3J0ICMiLAorCVsweDAyMV0gPSAiV0FSTklORzogQVRBIFVETUEgdXBncmFkZTogUG9ydCAjIiwKKwlbMHgwMjNdID0gIldBUk5JTkc6IFNlY3RvciByZXBhaXIgb2NjdXJyZWQ6IFBvcnQgIyIsCisJWzB4MDI0XSA9ICJFUlJPUjogU0JVRiBpbnRlZ3JpdHkgY2hlY2sgZmFpbHVyZSIsCisJWzB4MDI1XSA9ICJFUlJPUjogTG9zdCBjYWNoZWQgd3JpdGU6IFBvcnQgIyIsCisJWzB4MDI2XSA9ICJFUlJPUjogRHJpdmUgRUNDIGVycm9yIGRldGVjdGVkOiBQb3J0ICMiLAorCVsweDAyN10gPSAiRVJST1I6IERDQiBjaGVja3N1bSBlcnJvcjogUG9ydCAjIiwKKwlbMHgwMjhdID0gIkVSUk9SOiBEQ0IgdW5zdXBwb3J0ZWQgdmVyc2lvbjogUG9ydCAjIiwKKwlbMHgwMjldID0gIklORk86IFZlcmlmeSBzdGFydGVkOiBVbml0ICMiLAorCVsweDAyQV0gPSAiRVJST1I6IFZlcmlmeSBmYWlsZWQ6IFBvcnQgIyIsCisJWzB4MDJCXSA9ICJJTkZPOiBWZXJpZnkgY29tcGxldGU6IFVuaXQgIyIsCisJWzB4MDJDXSA9ICJXQVJOSU5HOiBPdmVyd3JvdGUgYmFkIHNlY3RvciBkdXJpbmcgcmVidWlsZDogUG9ydCAjIiwKKwlbMHgwMkRdID0gIkVSUk9SOiBFbmNvdW50ZXJlZCBiYWQgc2VjdG9yIGR1cmluZyByZWJ1aWxkOiBQb3J0ICMiLAorCVsweDAyRV0gPSAiRVJST1I6IFJlcGxhY2VtZW50IGRyaXZlIGlzIHRvbyBzbWFsbDogUG9ydCAjIiwKKwlbMHgwMkZdID0gIldBUk5JTkc6IFZlcmlmeSBlcnJvcjogVW5pdCBub3QgcHJldmlvdXNseSBpbml0aWFsaXplZDogVW5pdCAjIiwKKwlbMHgwMzBdID0gIkVSUk9SOiBEcml2ZSBub3Qgc3VwcG9ydGVkOiBQb3J0ICMiCit9OworCisvKgorICAgU2Vuc2Uga2V5IGxvb2t1cCB0YWJsZQorICAgRm9ybWF0OiBFU0RDL2ZsYWdzLFNlbnNlS2V5LEFkZGl0aW9uYWxTZW5zZUNvZGUsQWRkaXRpb25hbFNlbnNlQ29kZVF1YWxpZmllcgorKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHR3X3NlbnNlX3RhYmxlW11bNF0gPQoreworICAvKiBDb2RlcyBmb3IgbmV3ZXIgZmlybXdhcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBVEEgRXJyb3IgICAgICAgICAgICAgICAgICAgIFNDU0kgRXJyb3IKKyAgezB4MDEsIDB4MDMsIDB4MTMsIDB4MDB9LCAvLyBBZGRyZXNzIG1hcmsgbm90IGZvdW5kICAgICAgIEFkZHJlc3MgbWFyayBub3QgZm91bmQgZm9yIGRhdGEgZmllbGQKKyAgezB4MDQsIDB4MGIsIDB4MDAsIDB4MDB9LCAvLyBBYm9ydGVkIGNvbW1hbmQgICAgICAgICAgICAgIEFib3J0ZWQgY29tbWFuZAorICB7MHgxMCwgMHgwYiwgMHgxNCwgMHgwMH0sIC8vIElEIG5vdCBmb3VuZCAgICAgICAgICAgICAgICAgUmVjb3JkZWQgZW50aXR5IG5vdCBmb3VuZAorICB7MHg0MCwgMHgwMywgMHgxMSwgMHgwMH0sIC8vIFVuY29ycmVjdGFibGUgRUNDIGVycm9yICAgICAgVW5yZWNvdmVyZWQgcmVhZCBlcnJvcgorICB7MHg2MSwgMHgwNCwgMHgwMCwgMHgwMH0sIC8vIERldmljZSBmYXVsdCAgICAgICAgICAgICAgICAgSGFyZHdhcmUgZXJyb3IKKyAgezB4ODQsIDB4MGIsIDB4NDcsIDB4MDB9LCAvLyBEYXRhIENSQyBlcnJvciAgICAgICAgICAgICAgIFNDU0kgcGFyaXR5IGVycm9yCisgIHsweGQwLCAweDBiLCAweDAwLCAweDAwfSwgLy8gRGV2aWNlIGJ1c3kgICAgICAgICAgICAgICAgICBBYm9ydGVkIGNvbW1hbmQKKyAgezB4ZDEsIDB4MGIsIDB4MDAsIDB4MDB9LCAvLyBEZXZpY2UgYnVzeSAgICAgICAgICAgICAgICAgIEFib3J0ZWQgY29tbWFuZAorICB7MHgzNywgMHgwMiwgMHgwNCwgMHgwMH0sIC8vIFVuaXQgb2ZmbGluZSAgICAgICAgICAgICAgICAgTm90IHJlYWR5CisgIHsweDA5LCAweDAyLCAweDA0LCAweDAwfSwgLy8gVW5yZWNvdmVyZWQgZGlzayBlcnJvciAgICAgICBOb3QgcmVhZHkKKworICAvKiBDb2RlcyBmb3Igb2xkZXIgZmlybXdhcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzd2FyZSBFcnJvciAgICAgICAgICAgICAgICAgIFNDU0kgRXJyb3IKKyAgezB4NTEsIDB4MGIsIDB4MDAsIDB4MDB9ICAvLyBVbnNwZWNpZmllZCAgICAgICAgICAgICAgICAgIEFib3J0ZWQgY29tbWFuZAorfTsKKworLyogQ29udHJvbCByZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVFdfQ09OVFJPTF9DTEVBUl9IT1NUX0lOVEVSUlVQVAkgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBUV19DT05UUk9MX0NMRUFSX0FUVEVOVElPTl9JTlRFUlJVUFQgICAweDAwMDQwMDAwCisjZGVmaW5lIFRXX0NPTlRST0xfTUFTS19DT01NQU5EX0lOVEVSUlVQVCAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgVFdfQ09OVFJPTF9NQVNLX1JFU1BPTlNFX0lOVEVSUlVQVCAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBUV19DT05UUk9MX1VOTUFTS19DT01NQU5EX0lOVEVSUlVQVCAgICAweDAwMDA4MDAwCisjZGVmaW5lIFRXX0NPTlRST0xfVU5NQVNLX1JFU1BPTlNFX0lOVEVSUlVQVCAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgVFdfQ09OVFJPTF9DTEVBUl9FUlJPUl9TVEFUVVMJICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgVFdfQ09OVFJPTF9JU1NVRV9TT0ZUX1JFU0VUCSAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFRXX0NPTlRST0xfRU5BQkxFX0lOVEVSUlVQVFMJICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgVFdfQ09OVFJPTF9ESVNBQkxFX0lOVEVSUlVQVFMJICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgVFdfQ09OVFJPTF9JU1NVRV9IT1NUX0lOVEVSUlVQVAkgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBUV19DT05UUk9MX0NMRUFSX1BBUklUWV9FUlJPUiAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIFRXX0NPTlRST0xfQ0xFQVJfUVVFVUVfRVJST1IgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgVFdfQ09OVFJPTF9DTEVBUl9QQ0lfQUJPUlQgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBUV19DT05UUk9MX0NMRUFSX1NCVUZfV1JJVEVfRVJST1IgICAgICAweDAwMDAwMDA4CisKKy8qIFN0YXR1cyByZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVFdfU1RBVFVTX01BSk9SX1ZFUlNJT05fTUFTSwkgICAgICAgMHhGMDAwMDAwMAorI2RlZmluZSBUV19TVEFUVVNfTUlOT1JfVkVSU0lPTl9NQVNLCSAgICAgICAweDBGMDAwMDAwCisjZGVmaW5lIFRXX1NUQVRVU19QQ0lfUEFSSVRZX0VSUk9SCSAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIFRXX1NUQVRVU19RVUVVRV9FUlJPUgkJICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgVFdfU1RBVFVTX01JQ1JPQ09OVFJPTExFUl9FUlJPUgkgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBUV19TVEFUVVNfUENJX0FCT1JUCQkgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBUV19TVEFUVVNfSE9TVF9JTlRFUlJVUFQJICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgVFdfU1RBVFVTX0FUVEVOVElPTl9JTlRFUlJVUFQJICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgVFdfU1RBVFVTX0NPTU1BTkRfSU5URVJSVVBUCSAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIFRXX1NUQVRVU19SRVNQT05TRV9JTlRFUlJVUFQJICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgVFdfU1RBVFVTX0NPTU1BTkRfUVVFVUVfRlVMTAkgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBUV19TVEFUVVNfUkVTUE9OU0VfUVVFVUVfRU1QVFkJICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgVFdfU1RBVFVTX01JQ1JPQ09OVFJPTExFUl9SRUFEWQkgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBUV19TVEFUVVNfQ09NTUFORF9RVUVVRV9FTVBUWQkgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBUV19TVEFUVVNfQUxMX0lOVEVSUlVQVFMJICAgICAgIDB4MDAwRjAwMDAKKyNkZWZpbmUgVFdfU1RBVFVTX0NMRUFSQUJMRV9CSVRTCSAgICAgICAweDAwRDAwMDAwCisjZGVmaW5lIFRXX1NUQVRVU19FWFBFQ1RFRF9CSVRTCQkgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBUV19TVEFUVVNfVU5FWFBFQ1RFRF9CSVRTCSAgICAgICAweDAwRjAwMDA4CisjZGVmaW5lIFRXX1NUQVRVU19TQlVGX1dSSVRFX0VSUk9SICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgVFdfU1RBVFVTX1ZBTElEX0lOVEVSUlVQVCAgICAgICAgICAgICAgMHgwMERGMDAwOAorCisvKiBSRVNQT05TRSBRVUVVRSBCSVQgREVGSU5JVElPTlMgKi8KKyNkZWZpbmUgVFdfUkVTUE9OU0VfSURfTUFTSwkJICAgICAgIDB4MDAwMDBGRjAKKworLyogUENJIHJlbGF0ZWQgZGVmaW5lcyAqLworI2RlZmluZSBUV19JT19BRERSRVNTX1JBTkdFCQkgICAgICAgMHgxMAorI2RlZmluZSBUV19ERVZJQ0VfTkFNRQkJCSAgICAgICAiM3dhcmUgU3RvcmFnZSBDb250cm9sbGVyIgorI2RlZmluZSBUV19WRU5ET1JfSUQgKDB4MTNDMSkJLyogM3dhcmUgKi8KKyNkZWZpbmUgVFdfREVWSUNFX0lEICgweDEwMDApCS8qIFN0b3JhZ2UgQ29udHJvbGxlciAqLworI2RlZmluZSBUV19ERVZJQ0VfSUQyICgweDEwMDEpICAvKiA3MDAwIHNlcmllcyBjb250cm9sbGVyICovCisjZGVmaW5lIFRXX05VTURFVklDRVMgMgorI2RlZmluZSBUV19QQ0lfQ0xFQVJfUEFSSVRZX0VSUk9SUyAweGMxMDAKKyNkZWZpbmUgVFdfUENJX0NMRUFSX1BDSV9BQk9SVCAgICAgMHgyMDAwCisKKy8qIENvbW1hbmQgcGFja2V0IG9wY29kZXMgKi8KKyNkZWZpbmUgVFdfT1BfTk9QCSAgICAgIDB4MAorI2RlZmluZSBUV19PUF9JTklUX0NPTk5FQ1RJT04gMHgxCisjZGVmaW5lIFRXX09QX1JFQUQJICAgICAgMHgyCisjZGVmaW5lIFRXX09QX1dSSVRFCSAgICAgIDB4MworI2RlZmluZSBUV19PUF9WRVJJRlkJICAgICAgMHg0CisjZGVmaW5lIFRXX09QX0dFVF9QQVJBTQkgICAgICAweDEyCisjZGVmaW5lIFRXX09QX1NFVF9QQVJBTQkgICAgICAweDEzCisjZGVmaW5lIFRXX09QX1NFQ1RPUl9JTkZPICAgICAweDFhCisjZGVmaW5lIFRXX09QX0FFTl9MSVNURU4gICAgICAweDFjCisjZGVmaW5lIFRXX09QX0ZMVVNIX0NBQ0hFICAgICAweDBlCisjZGVmaW5lIFRXX0NNRF9QQUNLRVQgICAgICAgICAweDFkCisjZGVmaW5lIFRXX0NNRF9QQUNLRVRfV0lUSF9EQVRBIDB4MWYKKworLyogQXN5bmNocm9ub3VzIEV2ZW50IE5vdGlmaWNhdGlvbiAoQUVOKSBDb2RlcyAqLworI2RlZmluZSBUV19BRU5fUVVFVUVfRU1QVFkgICAgICAgMHgwMDAwCisjZGVmaW5lIFRXX0FFTl9TT0ZUX1JFU0VUICAgICAgICAweDAwMDEKKyNkZWZpbmUgVFdfQUVOX0RFR1JBREVEX01JUlJPUiAgIDB4MDAwMgorI2RlZmluZSBUV19BRU5fQ09OVFJPTExFUl9FUlJPUiAgMHgwMDAzCisjZGVmaW5lIFRXX0FFTl9SRUJVSUxEX0ZBSUwgICAgICAweDAwMDQKKyNkZWZpbmUgVFdfQUVOX1JFQlVJTERfRE9ORSAgICAgIDB4MDAwNQorI2RlZmluZSBUV19BRU5fUVVFVUVfRlVMTCAgICAgICAgMHgwMGZmCisjZGVmaW5lIFRXX0FFTl9UQUJMRV9VTkRFRklORUQgICAweDE1CisjZGVmaW5lIFRXX0FFTl9BUE9SVF9USU1FT1VUICAgICAweDAwMDkKKyNkZWZpbmUgVFdfQUVOX0RSSVZFX0VSUk9SICAgICAgIDB4MDAwQQorI2RlZmluZSBUV19BRU5fU01BUlRfRkFJTCAgICAgICAgMHgwMDBGCisjZGVmaW5lIFRXX0FFTl9TQlVGX0ZBSUwgICAgICAgICAweDAwMjQKKworLyogUGhhc2UgZGVmaW5lcyAqLworI2RlZmluZSBUV19QSEFTRV9JTklUSUFMIDAKKyNkZWZpbmUgVFdfUEhBU0VfU0lOR0xFIDEKKyNkZWZpbmUgVFdfUEhBU0VfU0dMSVNUIDIKKworLyogTWlzYyBkZWZpbmVzICovCisjZGVmaW5lIFRXX0FMSUdOTUVOVF82MDAwCQkgICAgICA2NCAvKiA2NCBieXRlcyAqLworI2RlZmluZSBUV19BTElHTk1FTlRfNzAwMCAgICAgICAgICAgICAgICAgICAgIDQgIC8qIDQgYnl0ZXMgKi8KKyNkZWZpbmUgVFdfTUFYX1VOSVRTCQkJICAgICAgMTYKKyNkZWZpbmUgVFdfQ09NTUFORF9BTElHTk1FTlRfTUFTSwkgICAgICAweDFmZgorI2RlZmluZSBUV19JTklUX01FU1NBR0VfQ1JFRElUUwkJICAgICAgMHgxMDAKKyNkZWZpbmUgVFdfSU5JVF9DT01NQU5EX1BBQ0tFVF9TSVpFCSAgICAgIDB4MworI2RlZmluZSBUV19QT0xMX01BWF9SRVRSSUVTICAgICAgICAJICAgICAgMjAwMDAKKyNkZWZpbmUgVFdfTUFYX1NHTF9MRU5HVEgJCSAgICAgIDYyCisjZGVmaW5lIFRXX0FUQV9QQVNTX1NHTF9NQVggICAgICAgICAgICAgICAgICAgNjAKKyNkZWZpbmUgVFdfUV9MRU5HVEgJCQkgICAgICAyNTYKKyNkZWZpbmUgVFdfUV9TVEFSVAkJCSAgICAgIDAKKyNkZWZpbmUgVFdfTUFYX1NMT1QJCQkgICAgICAzMgorI2RlZmluZSBUV19NQVhfUENJX0JVU0VTCQkgICAgICAyNTUKKyNkZWZpbmUgVFdfTUFYX1JFU0VUX1RSSUVTCQkgICAgICAzCisjZGVmaW5lIFRXX1VOSVRfSU5GT1JNQVRJT05fVEFCTEVfQkFTRQkgICAgICAweDMwMAorI2RlZmluZSBUV19NQVhfQ01EU19QRVJfTFVOCQkgICAgICAyNTQgLyogMjU0IGZvciBpbywgMSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hyZGV2IGlvY3RsLCBvbmUgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIGFlbiBwb3N0ICovCisjZGVmaW5lIFRXX0JMT0NLX1NJWkUJCQkgICAgICAweDIwMCAvKiA1MTItYnl0ZSBibG9ja3MgKi8KKyNkZWZpbmUgVFdfSU9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIFRXX1VOSVRfT05MSU5FICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUV19JTl9JTlRSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVFdfSU5fUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFRXX0lOX0NIUkRFVl9JT0NUTCAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBUV19NQVhfU0VDVE9SUyAgICAgICAgICAgICAgICAgICAgICAgIDI1NgorI2RlZmluZSBUV19NQVhfSU9DVExfU0VDVE9SUwkJICAgICAgNTEyCisjZGVmaW5lIFRXX0FFTl9XQUlUX1RJTUUgICAgICAgICAgICAgICAgICAgICAgMTAwMAorI2RlZmluZSBUV19JT0NUTF9XQUlUX1RJTUUgICAgICAgICAgICAgICAgICAgICgxICogSFopIC8qIDEgc2Vjb25kICovCisjZGVmaW5lIFRXX0lTUl9ET05UX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBUV19JU1JfRE9OVF9SRVNVTFQgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgVFdfSU9DVExfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAyNSAvKiAyNSBzZWNvbmRzICovCisjZGVmaW5lIFRXX0lPQ1RMX0NIUkRFVl9USU1FT1VUICAgICAgICAgICAgICAgNjAgLyogNjAgc2Vjb25kcyAqLworI2RlZmluZSBUV19JT0NUTF9DSFJERVZfRlJFRSAgICAgICAgICAgICAgICAgIC0xCisjZGVmaW5lIFRXX0RNQV9NQVNLCQkJICAgICAgRE1BXzMyQklUX01BU0sKKyNkZWZpbmUgVFdfTUFYX0NEQl9MRU4JCQkgICAgICAxNgorCisvKiBCaXRtYXNrIG1hY3JvcyB0byBlbGltaW5hdGUgYml0ZmllbGRzICovCisKKy8qIG9wY29kZTogNSwgc2dsb2Zmc2V0OiAzICovCisjZGVmaW5lIFRXX09QU0dMX0lOKHgseSkgKCh4IDw8IDUpIHwgKHkgJiAweDFmKSkKKyNkZWZpbmUgVFdfU0dMX09VVCh4KSAoKHggPj4gNSkgJiAweDcpCisKKy8qIHJlc2VydmVkXzE6IDQsIHJlc3BvbnNlX2lkOiA4LCByZXNlcnZlZF8yOiAyMCAqLworI2RlZmluZSBUV19SRVNJRF9PVVQoeCkgKCh4ID4+IDQpICYgMHhmZikKKworLyogdW5pdDogNCwgaG9zdF9pZDogNCAqLworI2RlZmluZSBUV19VTklUSE9TVF9JTih4LHkpICgoeCA8PCA0KSB8ICggeSAmIDB4ZikpCisjZGVmaW5lIFRXX1VOSVRfT1VUKHgpICh4ICYgMHhmKQorCisvKiBNYWNyb3MgKi8KKyNkZWZpbmUgVFdfQ09OVFJPTF9SRUdfQUREUih4KSAoeC0+YmFzZV9hZGRyKQorI2RlZmluZSBUV19TVEFUVVNfUkVHX0FERFIoeCkgKHgtPmJhc2VfYWRkciArIDB4NCkKKyNkZWZpbmUgVFdfQ09NTUFORF9RVUVVRV9SRUdfQUREUih4KSAoeC0+YmFzZV9hZGRyICsgMHg4KQorI2RlZmluZSBUV19SRVNQT05TRV9RVUVVRV9SRUdfQUREUih4KSAoeC0+YmFzZV9hZGRyICsgMHhDKQorI2RlZmluZSBUV19DTEVBUl9BTExfSU5URVJSVVBUUyh4KSAob3V0bChUV19TVEFUVVNfVkFMSURfSU5URVJSVVBULCBUV19DT05UUk9MX1JFR19BRERSKHgpKSkKKyNkZWZpbmUgVFdfQ0xFQVJfQVRURU5USU9OX0lOVEVSUlVQVCh4KSAob3V0bChUV19DT05UUk9MX0NMRUFSX0FUVEVOVElPTl9JTlRFUlJVUFQsIFRXX0NPTlRST0xfUkVHX0FERFIoeCkpKQorI2RlZmluZSBUV19DTEVBUl9IT1NUX0lOVEVSUlVQVCh4KSAob3V0bChUV19DT05UUk9MX0NMRUFSX0hPU1RfSU5URVJSVVBULCBUV19DT05UUk9MX1JFR19BRERSKHgpKSkKKyNkZWZpbmUgVFdfRElTQUJMRV9JTlRFUlJVUFRTKHgpIChvdXRsKFRXX0NPTlRST0xfRElTQUJMRV9JTlRFUlJVUFRTLCBUV19DT05UUk9MX1JFR19BRERSKHgpKSkKKyNkZWZpbmUgVFdfRU5BQkxFX0FORF9DTEVBUl9JTlRFUlJVUFRTKHgpIChvdXRsKFRXX0NPTlRST0xfQ0xFQVJfQVRURU5USU9OX0lOVEVSUlVQVCB8IFRXX0NPTlRST0xfVU5NQVNLX1JFU1BPTlNFX0lOVEVSUlVQVCB8IFRXX0NPTlRST0xfRU5BQkxFX0lOVEVSUlVQVFMsIFRXX0NPTlRST0xfUkVHX0FERFIoeCkpKQorI2RlZmluZSBUV19NQVNLX0NPTU1BTkRfSU5URVJSVVBUKHgpIChvdXRsKFRXX0NPTlRST0xfTUFTS19DT01NQU5EX0lOVEVSUlVQVCwgVFdfQ09OVFJPTF9SRUdfQUREUih4KSkpCisjZGVmaW5lIFRXX1VOTUFTS19DT01NQU5EX0lOVEVSUlVQVCh4KSAob3V0bChUV19DT05UUk9MX1VOTUFTS19DT01NQU5EX0lOVEVSUlVQVCwgVFdfQ09OVFJPTF9SRUdfQUREUih4KSkpCisjZGVmaW5lIFRXX1NPRlRfUkVTRVQoeCkgKG91dGwoVFdfQ09OVFJPTF9JU1NVRV9TT0ZUX1JFU0VUIHwgXAorCQkJVFdfQ09OVFJPTF9DTEVBUl9IT1NUX0lOVEVSUlVQVCB8IFwKKwkJCVRXX0NPTlRST0xfQ0xFQVJfQVRURU5USU9OX0lOVEVSUlVQVCB8IFwKKwkJCVRXX0NPTlRST0xfTUFTS19DT01NQU5EX0lOVEVSUlVQVCB8IFwKKwkJCVRXX0NPTlRST0xfTUFTS19SRVNQT05TRV9JTlRFUlJVUFQgfCBcCisJCQlUV19DT05UUk9MX0NMRUFSX0VSUk9SX1NUQVRVUyB8IFwKKwkJCVRXX0NPTlRST0xfRElTQUJMRV9JTlRFUlJVUFRTLCBUV19DT05UUk9MX1JFR19BRERSKHgpKSkKKyNkZWZpbmUgVFdfU1RBVFVTX0VSUk9SUyh4KSBcCisJKCgoeCAmIFRXX1NUQVRVU19QQ0lfQUJPUlQpIHx8IFwKKwkoeCAmIFRXX1NUQVRVU19QQ0lfUEFSSVRZX0VSUk9SKSB8fCBcCisJKHggJiBUV19TVEFUVVNfUVVFVUVfRVJST1IpIHx8IFwKKwkoeCAmIFRXX1NUQVRVU19NSUNST0NPTlRST0xMRVJfRVJST1IpKSAmJiBcCisJKHggJiBUV19TVEFUVVNfTUlDUk9DT05UUk9MTEVSX1JFQURZKSkKKworI2lmZGVmIFRXX0RFQlVHCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBwcmludGsobXNnKQorI2Vsc2UKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNwcmFnbWEgcGFjaygxKQorCisvKiBTY2F0dGVyIEdhdGhlciBMaXN0IEVudHJ5ICovCit0eXBlZGVmIHN0cnVjdCBUQUdfVFdfU0dfRW50cnkgeworCXUzMiBhZGRyZXNzOworCXUzMiBsZW5ndGg7Cit9IFRXX1NHX0VudHJ5OworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVFdfU2VjdG9yWzUxMl07CisKKy8qIENvbW1hbmQgUGFja2V0ICovCit0eXBlZGVmIHN0cnVjdCBUV19Db21tYW5kIHsKKwl1bnNpZ25lZCBjaGFyIG9wY29kZV9fc2dsb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIHJlcXVlc3RfaWQ7CisJdW5zaWduZWQgY2hhciB1bml0X19ob3N0aWQ7CisJLyogU2Vjb25kIERXT1JEICovCisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBmbGFnczsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIHNob3J0IGJsb2NrX2NvdW50OworCQl1bnNpZ25lZCBzaG9ydCBwYXJhbWV0ZXJfY291bnQ7CisJCXVuc2lnbmVkIHNob3J0IG1lc3NhZ2VfY3JlZGl0czsKKwl9IGJ5dGU2OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMiBsYmE7CisJCQlUV19TR19FbnRyeSBzZ2xbVFdfTUFYX1NHTF9MRU5HVEhdOworCQkJdTMyIHBhZGRpbmc7CS8qIHBhZCB0byA1MTIgYnl0ZXMgKi8KKwkJfSBpbzsKKwkJc3RydWN0IHsKKwkJCVRXX1NHX0VudHJ5IHNnbFtUV19NQVhfU0dMX0xFTkdUSF07CisJCQl1MzIgcGFkZGluZ1syXTsKKwkJfSBwYXJhbTsKKwkJc3RydWN0IHsKKwkJCXUzMiByZXNwb25zZV9xdWV1ZV9wb2ludGVyOworCQkJdTMyIHBhZGRpbmdbMTI1XTsKKwkJfSBpbml0X2Nvbm5lY3Rpb247CisJCXN0cnVjdCB7CisJCQljaGFyIHZlcnNpb25bNTA0XTsKKwkJfSBpb2N0bF9taW5pcG9ydF92ZXJzaW9uOworCX0gYnl0ZTg7Cit9IFRXX0NvbW1hbmQ7CisKKyNwcmFnbWEgcGFjaygpCisKK3R5cGVkZWYgc3RydWN0IFRBR19UV19Jb2N0bCB7CisJdW5zaWduZWQgY2hhciBvcGNvZGU7CisJdW5zaWduZWQgc2hvcnQgdGFibGVfaWQ7CisJdW5zaWduZWQgY2hhciBwYXJhbWV0ZXJfaWQ7CisJdW5zaWduZWQgY2hhciBwYXJhbWV0ZXJfc2l6ZV9ieXRlczsKKwl1bnNpZ25lZCBjaGFyIHVuaXRfaW5kZXg7CisJdW5zaWduZWQgY2hhciBkYXRhWzFdOworfSBUV19Jb2N0bDsKKworI3ByYWdtYSBwYWNrKDEpCisKKy8qIFN0cnVjdHVyZSBmb3IgbmV3IGNoYXJkZXYgaW9jdGxzICovCit0eXBlZGVmIHN0cnVjdCBUQUdfVFdfTmV3X0lvY3RsIHsKKwl1bnNpZ25lZCBpbnQgZGF0YV9idWZmZXJfbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgcGFkZGluZyBbNTA4XTsKKwlUV19Db21tYW5kIGZpcm13YXJlX2NvbW1hbmQ7CisJY2hhciBkYXRhX2J1ZmZlclsxXTsKK30gVFdfTmV3X0lvY3RsOworCisvKiBHZXRQYXJhbSBkZXNjcmlwdG9yICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQJdGFibGVfaWQ7CisJdW5zaWduZWQgY2hhcglwYXJhbWV0ZXJfaWQ7CisJdW5zaWduZWQgY2hhcglwYXJhbWV0ZXJfc2l6ZV9ieXRlczsKKwl1bnNpZ25lZCBjaGFyCWRhdGFbMV07Cit9IFRXX1BhcmFtLCAqUFRXX1BhcmFtOworCisvKiBSZXNwb25zZSBxdWV1ZSAqLwordHlwZWRlZiB1bmlvbiBUQUdfVFdfUmVzcG9uc2VfUXVldWUgeworCXUzMiByZXNwb25zZV9pZDsKKwl1MzIgdmFsdWU7Cit9IFRXX1Jlc3BvbnNlX1F1ZXVlOworCit0eXBlZGVmIGludCBUV19DbWRfU3RhdGU7CisKKyNkZWZpbmUgVFdfU19JTklUSUFMICAgMHgxICAvKiBJbml0aWFsIHN0YXRlICovCisjZGVmaW5lIFRXX1NfU1RBUlRFRCAgIDB4MiAgLyogSWQgaW4gdXNlICovCisjZGVmaW5lIFRXX1NfUE9TVEVEICAgIDB4NCAgLyogUG9zdGVkIHRvIHRoZSBjb250cm9sbGVyICovCisjZGVmaW5lIFRXX1NfUEVORElORyAgIDB4OCAgLyogV2FpdGluZyB0byBiZSBwb3N0ZWQgaW4gaXNyICovCisjZGVmaW5lIFRXX1NfQ09NUExFVEVEIDB4MTAgLyogQ29tcGxldGVkIGJ5IGlzciAqLworI2RlZmluZSBUV19TX0ZJTklTSEVEICAweDIwIC8qIEkvTyBjb21wbGV0ZWx5IGRvbmUgKi8KKyNkZWZpbmUgVFdfU1RBUlRfTUFTSyAoVFdfU19TVEFSVEVEIHwgVFdfU19QT1NURUQgfCBUV19TX1BFTkRJTkcgfCBUV19TX0NPTVBMRVRFRCkKKworLyogQ29tbWFuZCBoZWFkZXIgZm9yIEFUQSBwYXNzLXRocnUgKi8KK3R5cGVkZWYgc3RydWN0IFRBR19UV19QYXNzdGhydQoreworCXVuc2lnbmVkIGNoYXIgb3Bjb2RlX19zZ2xvZmZzZXQ7CisJdW5zaWduZWQgY2hhciBzaXplOworCXVuc2lnbmVkIGNoYXIgcmVxdWVzdF9pZDsKKwl1bnNpZ25lZCBjaGFyIGFwb3J0X19ob3N0aWQ7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCBwYXJhbTsKKwl1bnNpZ25lZCBzaG9ydCBmZWF0dXJlczsKKwl1bnNpZ25lZCBzaG9ydCBzZWN0b3JfY291bnQ7CisJdW5zaWduZWQgc2hvcnQgc2VjdG9yX251bTsKKwl1bnNpZ25lZCBzaG9ydCBjeWxpbmRlcl9sbzsKKwl1bnNpZ25lZCBzaG9ydCBjeWxpbmRlcl9oaTsKKwl1bnNpZ25lZCBjaGFyIGRyaXZlX2hlYWQ7CisJdW5zaWduZWQgY2hhciBjb21tYW5kOworCVRXX1NHX0VudHJ5IHNnX2xpc3RbVFdfQVRBX1BBU1NfU0dMX01BWF07CisJdW5zaWduZWQgY2hhciBwYWRkaW5nWzEyXTsKK30gVFdfUGFzc3RocnU7CisKK3R5cGVkZWYgc3RydWN0IFRBR19UV19EZXZpY2VfRXh0ZW5zaW9uIHsKKwl1MzIJCQliYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZwkJKmFsaWdubWVudF92aXJ0dWFsX2FkZHJlc3NbVFdfUV9MRU5HVEhdOworCXVuc2lnbmVkIGxvbmcJCWFsaWdubWVudF9waHlzaWNhbF9hZGRyZXNzW1RXX1FfTEVOR1RIXTsKKwlpbnQJCQlpc191bml0X3ByZXNlbnRbVFdfTUFYX1VOSVRTXTsKKwl1bnNpZ25lZCBsb25nCQkqY29tbWFuZF9wYWNrZXRfdmlydHVhbF9hZGRyZXNzW1RXX1FfTEVOR1RIXTsKKwl1bnNpZ25lZCBsb25nCQljb21tYW5kX3BhY2tldF9waHlzaWNhbF9hZGRyZXNzW1RXX1FfTEVOR1RIXTsKKwlzdHJ1Y3QgcGNpX2RldgkJKnR3X3BjaV9kZXY7CisJc3RydWN0IHNjc2lfY21uZAkqc3JiW1RXX1FfTEVOR1RIXTsKKwl1bnNpZ25lZCBjaGFyCQlmcmVlX3F1ZXVlW1RXX1FfTEVOR1RIXTsKKwl1bnNpZ25lZCBjaGFyCQlmcmVlX2hlYWQ7CisJdW5zaWduZWQgY2hhcgkJZnJlZV90YWlsOworCXVuc2lnbmVkIGNoYXIJCXBlbmRpbmdfcXVldWVbVFdfUV9MRU5HVEhdOworCXVuc2lnbmVkIGNoYXIJCXBlbmRpbmdfaGVhZDsKKwl1bnNpZ25lZCBjaGFyCQlwZW5kaW5nX3RhaWw7CisJVFdfQ21kX1N0YXRlCQlzdGF0ZVtUV19RX0xFTkdUSF07CisJdTMyCQkJcG9zdGVkX3JlcXVlc3RfY291bnQ7CisJdTMyCQkJbWF4X3Bvc3RlZF9yZXF1ZXN0X2NvdW50OworCXUzMgkJCXJlcXVlc3RfY291bnRfbWFya2VkX3BlbmRpbmc7CisJdTMyCQkJcGVuZGluZ19yZXF1ZXN0X2NvdW50OworCXUzMgkJCW1heF9wZW5kaW5nX3JlcXVlc3RfY291bnQ7CisJdTMyCQkJbWF4X3NnbF9lbnRyaWVzOworCXUzMgkJCXNnbF9lbnRyaWVzOworCXUzMgkJCW51bV9yZXNldHM7CisJdTMyCQkJc2VjdG9yX2NvdW50OworCXUzMgkJCW1heF9zZWN0b3JfY291bnQ7CisJdTMyCQkJYWVuX2NvdW50OworCXN0cnVjdCBTY3NpX0hvc3QJKmhvc3Q7CisJc3RydWN0IHNlbWFwaG9yZQlpb2N0bF9zZW07CisJdW5zaWduZWQgc2hvcnQJCWFlbl9xdWV1ZVtUV19RX0xFTkdUSF07CisJdW5zaWduZWQgY2hhcgkJYWVuX2hlYWQ7CisJdW5zaWduZWQgY2hhcgkJYWVuX3RhaWw7CisJdm9sYXRpbGUgbG9uZwkJZmxhZ3M7IC8qIGxvbmcgcmVxJ2QgZm9yIHNldF9iaXQgLS1SUiAqLworCWludAkJCXJlc2V0X3ByaW50OworCXZvbGF0aWxlIGludAkJY2hyZGV2X3JlcXVlc3RfaWQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QJaW9jdGxfd3F1ZXVlOworfSBUV19EZXZpY2VfRXh0ZW5zaW9uOworCisjcHJhZ21hIHBhY2soKQorCisjZW5kaWYgLyogXzNXX1hYWFhfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpLzUzYzcwMC5jIGIvZHJpdmVycy9zY3NpLzUzYzcwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OTFmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvNTNjNzAwLmMKQEAgLTAsMCArMSwyMTc1IEBACisvKiAtKi0gbW9kZTogYzsgYy1iYXNpYy1vZmZzZXQ6IDggLSotICovCisKKy8qIE5DUiAob3IgU3ltYmlvcykgNTNjNzAwIGFuZCA1M2M3MDAtNjYgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEphbWVzLkJvdHRvbWxleUBIYW5zZW5QYXJ0bmVyc2hpcC5jb20KKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqICAKKyoqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyoqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKioKKyoqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKioKKyoqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIE5vdGVzOgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGRlc2lnbmVkIGV4Y2x1c2l2ZWx5IGZvciB0aGVzZSBjaGlwcyAodmlydHVhbGx5IHRoZQorICogZWFybGllc3Qgb2YgdGhlIHNjcmlwdHMgZW5naW5lIGNoaXBzKS4gIFRoZXkgbmVlZCB0aGVpciBvd24gZHJpdmVycworICogYmVjYXVzZSB0aGV5IGFyZSBtaXNzaW5nIHNvIG1hbnkgb2YgdGhlIHNjcmlwdHMgYW5kIHNuYXp6eSByZWdpc3RlcgorICogZmVhdHVyZXMgb2YgdGhlaXIgZWxkZXIgYnJvdGhlcnMgKHRoZSA3MTAsIDcyMCBhbmQgNzcwKS4KKyAqCisgKiBUaGUgNzAwIGlzIHRoZSBsb3dsaWVzdCBvZiB0aGUgbGluZSwgaXQgY2FuIG9ubHkgZG8gYXN5bmMgU0NTSS4KKyAqIFRoZSA3MDAtNjYgY2FuIGF0IGxlYXN0IGRvIHN5bmNocm9ub3VzIFNDU0kgdXAgdG8gMTBNSHouCisgKiAKKyAqIFRoZSA3MDAgY2hpcCBoYXMgbm8gaG9zdCBidXMgaW50ZXJmYWNlIGxvZ2ljIG9mIGl0cyBvd24uICBIb3dldmVyLAorICogaXQgaXMgdXN1YWxseSBtYXBwZWQgdG8gYSBsb2NhdGlvbiB3aXRoIHdlbGwgZGVmaW5lZCByZWdpc3RlcgorICogb2Zmc2V0cy4gIFRoZXJlZm9yZSwgaWYgeW91IGNhbiBkZXRlcm1pbmUgdGhlIGJhc2UgYWRkcmVzcyBhbmQgdGhlCisgKiBpcnEgeW91ciBib2FyZCBpbmNvcnBvcmF0aW5nIHRoaXMgY2hpcCB1c2VzLCB5b3UgY2FuIHByb2JhYmx5IHVzZQorICogdGhpcyBkcml2ZXIgdG8gcnVuIGl0IChhbHRob3VnaCB5b3UnbGwgcHJvYmFibHkgaGF2ZSB0byB3cml0ZSBhCisgKiBtaW5pbWFsIHdyYXBwZXIgZm9yIHRoZSBwdXJwb3NlLS0tc2VlIHRoZSBOQ1JfRDcwMCBkcml2ZXIgZm9yCisgKiBkZXRhaWxzIGFib3V0IGhvdyB0byBkbyB0aGlzKS4KKyAqCisgKgorICogVE9ETyBMaXN0OgorICoKKyAqIDEuIEJldHRlciBzdGF0aXN0aWNzIGluIHRoZSBwcm9jIGZzCisgKgorICogMi4gSW1wbGVtZW50IG1lc3NhZ2UgcXVldWUgKHF1ZXVlcyBTQ1NJIG1lc3NhZ2VzIGxpa2UgY29tbWFuZHMpIGFuZCBtYWtlCisgKiAgICB0aGUgYWJvcnQgYW5kIGRldmljZSByZXNldCBmdW5jdGlvbnMgdXNlIHRoZW0uCisgKiAqLworCisvKiBDSEFOR0VMT0cKKyAqCisgKiBWZXJzaW9uIDIuOAorICoKKyAqIEZpeGVkIGJhZCBidWcgYWZmZWN0aW5nIHRhZyBzdGFydmF0aW9uIHByb2Nlc3NpbmcgKHByZXZpb3VzbHkgdGhlCisgKiBkcml2ZXIgd291bGQgaGFuZyB0aGUgc3lzdGVtIGlmIHRvbyBtYW55IHRhZ3Mgc3RhcnZlZC4gIEFsc28gZml4ZWQKKyAqIGJhZCBidWcgaGF2aW5nIHRvIGRvIHdpdGggMTAgYnl0ZSBjb21tYW5kIHByb2Nlc3NpbmcgYW5kIFJFUVVFU1QKKyAqIFNFTlNFICh0aGUgY29tbWFuZCB3b3VsZCBsb29wIGZvcmV2ZXIgZ2V0dGluZyBhIHRyYW5zZmVyIGxlbmd0aAorICogbWlzbWF0Y2ggaW4gdGhlIENNRCBwaGFzZSkuCisgKgorICogVmVyc2lvbiAyLjcKKyAqCisgKiBGaXhlZCBzY3JpcHRzIHByb2JsZW0gd2hpY2ggY2F1c2VkIGNlcnRhaW4gZGV2aWNlcyAobm90YWJseSBDRFJXcykKKyAqIHRvIGhhbmcgb24gaW5pdGlhbCBJTlFVSVJZLiAgVXBkYXRlZCBOQ1JfNzAwX3JlYWRsL3dyaXRlbCB0byB1c2UKKyAqIF9fcmF3X3JlYWRsL3dyaXRlbCBmb3IgcGFyaXNjIGNvbXBhdGliaWxpdHkgKFRob21hcworICogQm9nZW5kb2VyZmVyKS4gQWRkZWQgbWlzc2luZyBTQ3AtPnJlcXVlc3RfYnVmZmxlbiBpbml0aWFsaXNhdGlvbgorICogZm9yIHNlbnNlIHJlcXVlc3RzIChSeWFuIEJyYWRldGljaCkuCisgKgorICogVmVyc2lvbiAyLjYKKyAqCisgKiBGb2xsb3dpbmcgdGVzdCBvZiB0aGUgNjQgYml0IHBhcmlzYyBrZXJuZWwgYnkgUmljaGFyZCBIaXJzdCwKKyAqIHNldmVyYWwgcHJvYmxlbXMgaGF2ZSBub3cgYmVlbiBjb3JyZWN0ZWQuICBBbHNvIGFkZHMgc3VwcG9ydCBmb3IKKyAqIGNvbnNpc3RlbnQgbWVtb3J5IGFsbG9jYXRpb24uCisgKgorICogVmVyc2lvbiAyLjUKKyAqIAorICogTW9yZSBDb21wYXRpYmlsaXR5IGNoYW5nZXMgZm9yIDcxMCAobm93IGFjdHVhbGx5IHdvcmtzKS4gIEVuaGFuY2VkCisgKiBzdXBwb3J0IGZvciBvZGQgY2xvY2sgc3BlZWRzIHdoaWNoIGNvbnN0cmFpbiBTRFRSIG5lZ290aWF0aW9ucy4KKyAqIGNvcnJlY3QgY2FjaGVsaW5lIHNlcGFyYXRpb24gZm9yIHNjc2kgbWVzc2FnZXMgYW5kIHN0YXR1cyBmb3IKKyAqIGluY29oZXJlbnQgYXJjaGl0ZWN0dXJlcy4gIFVzZSBvZiB0aGUgcGNpIG1hcHBpbmcgZnVuY3Rpb25zIG9uCisgKiBidWZmZXJzIHRvIGJlZ2luIHN1cHBvcnQgZm9yIDY0IGJpdCBkcml2ZXJzLgorICoKKyAqIFZlcnNpb24gMi40CisgKgorICogQWRkZWQgc3VwcG9ydCBmb3IgdGhlIDUzYzcxMCBjaGlwIChpbiA1M2M3MDAgZW11bGF0aW9uIG1vZGUgb25seS0tLW5vIAorICogc3BlY2lhbCA1M2M3MTAgaW5zdHJ1Y3Rpb25zIG9yIHJlZ2lzdGVycyBhcmUgdXNlZCkuCisgKgorICogVmVyc2lvbiAyLjMKKyAqCisgKiBNb3JlIGVuZGlhbm5lc3MvY2FjaGUgY29oZXJlbmN5IGNoYW5nZXMuCisgKgorICogQmV0dGVyIGJhZCBkZXZpY2UgaGFuZGxpbmcgKGhhbmRsZXMgZGV2aWNlcyBseWluZyBhYm91dCB0YWcKKyAqIHF1ZXVlaW5nIHN1cHBvcnQgYW5kIGRldmljZXMgd2hpY2ggZmFpbCB0byBwcm92aWRlIHNlbnNlIGRhdGEgb24KKyAqIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb25zKQorICoKKyAqIE1hbnkgdGhhbmtzIHRvIFJpY2hhcmQgSGlyc3QgPHJoaXJzdEBsaW51eGNhcmUuY29tPiBmb3IgcGF0aWVudGx5CisgKiBkZWJ1Z2dpbmcgdGhpcyBkcml2ZXIgb24gdGhlIHBhcmlzYyBhcmNoaXRlY3R1cmUgYW5kIHN1Z2dlc3RpbmcKKyAqIG1hbnkgaW1wcm92ZW1lbnRzIGFuZCBidWcgZml4ZXMuCisgKgorICogVGhhbmtzIGFsc28gZ28gdG8gTGludXhjYXJlIEluYy4gZm9yIHByb3ZpZGluZyBzZXZlcmFsIFBBUklTQworICogbWFjaGluZXMgZm9yIG1lIHRvIGRlYnVnIHRoZSBkcml2ZXIgb24uCisgKgorICogVmVyc2lvbiAyLjIKKyAqCisgKiBNYWRlIHRoZSBkcml2ZXIgbWVtIG9yIGlvIG1hcHBlZDsgYWRkZWQgZW5kaWFuIGludmFyaWFuY2U7IGFkZGVkCisgKiBkbWEgY2FjaGUgZmx1c2hpbmcgb3BlcmF0aW9ucyBmb3IgYXJjaGl0ZWN0dXJlcyB3aGljaCBuZWVkIGl0OworICogYWRkZWQgc3VwcG9ydCBmb3IgbW9yZSB2YXJpZWQgY2xvY2tpbmcgc3BlZWRzLgorICoKKyAqIFZlcnNpb24gMi4xCisgKgorICogSW5pdGlhbCBtb2R1bGFyaXNhdGlvbiBmcm9tIHRoZSBENzAwLiAgU2VlIE5DUl9ENzAwLmMgZm9yIHRoZSByZXN0IG9mCisgKiB0aGUgY2hhbmdlbG9nLgorICogKi8KKyNkZWZpbmUgTkNSXzcwMF9WRVJTSU9OICIyLjgiCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuaD4KKworI2luY2x1ZGUgIjUzYzcwMC5oIgorCisvKiBOT1RFOiBGb3IgNjQgYml0IGRyaXZlcnMgdGhlcmUgYXJlIHBvaW50cyBpbiB0aGUgY29kZSB3aGVyZSB3ZSB1c2UKKyAqIGEgbm9uIGRlcmVmZXJlbmNlYWJsZSBwb2ludGVyIHRvIHBvaW50IHRvIGEgc3RydWN0dXJlIGluIGRtYS1hYmxlCisgKiBtZW1vcnkgKHdoaWNoIGlzIDMyIGJpdHMpIHNvIHRoYXQgd2UgY2FuIHVzZSBhbGwgb2YgdGhlIHN0cnVjdHVyZQorICogb3BlcmF0aW9ucyBidXQgdGFrZSB0aGUgYWRkcmVzcyBhdCB0aGUgZW5kLiAgVGhpcyBtYWNybyBhbGxvd3MgdXMKKyAqIHRvIHRydW5jYXRlIHRoZSA2NCBiaXQgcG9pbnRlciBkb3duIHRvIDMyIGJpdHMgd2l0aG91dCB0aGUgY29tcGlsZXIKKyAqIGNvbXBsYWluaW5nICovCisjZGVmaW5lIHRvMzJiaXQoeCkJKChfX3UzMikoKHVuc2lnbmVkIGxvbmcpKHgpKSkKKworI2lmZGVmIE5DUl83MDBfREVCVUcKKyNkZWZpbmUgU1RBVElDCisjZWxzZQorI2RlZmluZSBTVEFUSUMgc3RhdGljCisjZW5kaWYKKworTU9EVUxFX0FVVEhPUigiSmFtZXMgQm90dG9tbGV5Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIjUzYzcwMCBhbmQgNTNjNzAwLTY2IERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBUaGlzIGlzIHRoZSBzY3JpcHQgKi8KKyNpbmNsdWRlICI1M2M3MDBfZC5oIgorCisKK1NUQVRJQyBpbnQgTkNSXzcwMF9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSk7CitTVEFUSUMgaW50IE5DUl83MDBfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KTsKK1NUQVRJQyBpbnQgTkNSXzcwMF9idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KTsKK1NUQVRJQyBpbnQgTkNSXzcwMF9kZXZfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KTsKK1NUQVRJQyBpbnQgTkNSXzcwMF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCk7CitTVEFUSUMgdm9pZCBOQ1JfNzAwX2NoaXBfc2V0dXAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CitTVEFUSUMgdm9pZCBOQ1JfNzAwX2NoaXBfcmVzZXQoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CitTVEFUSUMgaW50IE5DUl83MDBfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqU0RwbnQpOworU1RBVElDIHZvaWQgTkNSXzcwMF9zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqU0RwbnQpOworc3RhdGljIGludCBOQ1JfNzAwX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKlNEcG50LCBpbnQgZGVwdGgpOworc3RhdGljIGludCBOQ1JfNzAwX2NoYW5nZV9xdWV1ZV90eXBlKHN0cnVjdCBzY3NpX2RldmljZSAqU0RwbnQsIGludCBkZXB0aCk7CisKK1NUQVRJQyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqTkNSXzcwMF9kZXZfYXR0cnNbXTsKKworU1RBVElDIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqTkNSXzcwMF90cmFuc3BvcnRfdGVtcGxhdGUgPSBOVUxMOworCitzdGF0aWMgY2hhciAqTkNSXzcwMF9waGFzZVtdID0geworCSIiLAorCSJhZnRlciBzZWxlY3Rpb24iLAorCSJiZWZvcmUgY29tbWFuZCBwaGFzZSIsCisJImFmdGVyIGNvbW1hbmQgcGhhc2UiLAorCSJhZnRlciBzdGF0dXMgcGhhc2UiLAorCSJhZnRlciBkYXRhIGluIHBoYXNlIiwKKwkiYWZ0ZXIgZGF0YSBvdXQgcGhhc2UiLAorCSJkdXJpbmcgZGF0YSBwaGFzZSIsCit9OworCitzdGF0aWMgY2hhciAqTkNSXzcwMF9jb25kaXRpb25bXSA9IHsKKwkiIiwKKwkiTk9UIE1TR19PVVQiLAorCSJVTkVYUEVDVEVEIFBIQVNFIiwKKwkiTk9UIE1TR19JTiIsCisJIlVORVhQRUNURUQgTVNHIiwKKwkiTVNHX0lOIiwKKwkiU0RUUl9NU0cgUkVDRUlWRUQiLAorCSJSRUpFQ1RfTVNHIFJFQ0VJVkVEIiwKKwkiRElTQ09OTkVDVF9NU0cgUkVDRUlWRUQiLAorCSJNU0dfT1VUIiwKKwkiREFUQV9JTiIsCisJCit9OworCitzdGF0aWMgY2hhciAqTkNSXzcwMF9mYXRhbF9tZXNzYWdlc1tdID0geworCSJ1bmV4cGVjdGVkIG1lc3NhZ2UgYWZ0ZXIgcmVzZWxlY3Rpb24iLAorCSJzdGlsbCBNU0dfT1VUIGFmdGVyIG1lc3NhZ2UgaW5qZWN0aW9uIiwKKwkibm90IE1TR19JTiBhZnRlciBzZWxlY3Rpb24iLAorCSJJbGxlZ2FsIG1lc3NhZ2UgbGVuZ3RoIHJlY2VpdmVkIiwKK307CisKK3N0YXRpYyBjaGFyICpOQ1JfNzAwX1NCQ0xfYml0c1tdID0geworCSJJTyAiLAorCSJDRCAiLAorCSJNU0cgIiwKKwkiQVROICIsCisJIlNFTCAiLAorCSJCU1kgIiwKKwkiQUNLICIsCisJIlJFUSAiLAorfTsKKworc3RhdGljIGNoYXIgKk5DUl83MDBfU0JDTF90b19waGFzZVtdID0geworCSJEQVRBX09VVCIsCisJIkRBVEFfSU4iLAorCSJDTURfT1VUIiwKKwkiU1RBVEUiLAorCSJJTExFR0FMIFBIQVNFIiwKKwkiSUxMRUdBTCBQSEFTRSIsCisJIk1TRyBPVVQiLAorCSJNU0cgSU4iLAorfTsKKworc3RhdGljIF9fdTggTkNSXzcwMF9TRFRSX21zZ1tdID0geworCTB4MDEsCQkJLyogRXh0ZW5kZWQgbWVzc2FnZSAqLworCTB4MDMsCQkJLyogRXh0ZW5kZWQgbWVzc2FnZSBMZW5ndGggKi8KKwkweDAxLAkJCS8qIFNEVFIgRXh0ZW5kZWQgbWVzc2FnZSAqLworCU5DUl83MDBfTUlOX1BFUklPRCwKKwlOQ1JfNzAwX01BWF9PRkZTRVQKK307CisKKy8qIFRoaXMgdHJhbnNsYXRlcyB0aGUgU0RUUiBtZXNzYWdlIG9mZnNldCBhbmQgcGVyaW9kIHRvIGEgdmFsdWUKKyAqIHdoaWNoIGNhbiBiZSBsb2FkZWQgaW50byB0aGUgU1hGRVJfUkVHLgorICoKKyAqIE5PVEU6IEFjY29yZGluZyB0byBTQ1NJLTIsIHRoZSB0cnVlIHRyYW5zZmVyIHBlcmlvZCAoaW4gbnMpIGlzCisgKiAgICAgICBhY3R1YWxseSBmb3VyIHRpbWVzIHRoaXMgcGVyaW9kIHZhbHVlICovCitzdGF0aWMgaW5saW5lIF9fdTgKK05DUl83MDBfb2Zmc2V0X3BlcmlvZF90b19zeGZlcihzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhLAorCQkJICAgICAgIF9fdTggb2Zmc2V0LCBfX3U4IHBlcmlvZCkKK3sKKwlpbnQgWEZFUlA7CisKKwlfX3U4IG1pbl94ZmVycCA9IChob3N0ZGF0YS0+Y2hpcDcxMAorCQkJICA/IE5DUl83MTBfTUlOX1hGRVJQIDogTkNSXzcwMF9NSU5fWEZFUlApOworCV9fdTggbWF4X29mZnNldCA9IChob3N0ZGF0YS0+Y2hpcDcxMAorCQkJICAgPyBOQ1JfNzEwX01BWF9PRkZTRVQgOiBOQ1JfNzAwX01BWF9PRkZTRVQpOworCisJaWYob2Zmc2V0ID09IDApCisJCXJldHVybiAwOworCisJaWYocGVyaW9kIDwgaG9zdGRhdGEtPm1pbl9wZXJpb2QpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiNTNjNzAwOiBQZXJpb2QgJWRucyBpcyBsZXNzIHRoYW4gdGhpcyBjaGlwJ3MgbWluaW11bSwgc2V0dGluZyB0byAlZFxuIiwgcGVyaW9kKjQsIE5DUl83MDBfU0RUUl9tc2dbM10qNCk7CisJCXBlcmlvZCA9IGhvc3RkYXRhLT5taW5fcGVyaW9kOworCX0KKwlYRkVSUCA9IChwZXJpb2QqNCAqIGhvc3RkYXRhLT5zeW5jX2Nsb2NrKS8xMDAwIC0gNDsKKwlpZihvZmZzZXQgPiBtYXhfb2Zmc2V0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjUzYzcwMDogT2Zmc2V0ICVkIGV4Y2VlZHMgY2hpcCBtYXhpbXVtLCBzZXR0aW5nIHRvICVkXG4iLAorCQkgICAgICAgb2Zmc2V0LCBtYXhfb2Zmc2V0KTsKKwkJb2Zmc2V0ID0gbWF4X29mZnNldDsKKwl9CisJaWYoWEZFUlAgPCBtaW5feGZlcnApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiNTNjNzAwOiBYRkVSUCAlZCBpcyBsZXNzIHRoYW4gbWluaXVtLCBzZXR0aW5nIHRvICVkXG4iLAorCQkgICAgICAgWEZFUlAsICBtaW5feGZlcnApOworCQlYRkVSUCA9ICBtaW5feGZlcnA7CisJfQorCXJldHVybiAob2Zmc2V0ICYgMHgwZikgfCAoWEZFUlAgJiAweDA3KTw8NDsKK30KKworc3RhdGljIGlubGluZSBfX3U4CitOQ1JfNzAwX2dldF9TWEZFUihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKlNEcCkKK3sKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhID0gCisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilTRHAtPmhvc3QtPmhvc3RkYXRhWzBdOworCisJcmV0dXJuIE5DUl83MDBfb2Zmc2V0X3BlcmlvZF90b19zeGZlcihob3N0ZGF0YSwKKwkJCQkJICAgICAgc3BpX29mZnNldChTRHAtPnNkZXZfdGFyZ2V0KSwKKwkJCQkJICAgICAgc3BpX3BlcmlvZChTRHAtPnNkZXZfdGFyZ2V0KSk7Cit9CisKK3N0cnVjdCBTY3NpX0hvc3QgKgorTkNSXzcwMF9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCwKKwkgICAgICAgc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSwgc3RydWN0IGRldmljZSAqZGV2KQoreworCWRtYV9hZGRyX3QgcFNjcmlwdCwgcFNsb3RzOworCV9fdTggKm1lbW9yeTsKKwlfX3UzMiAqc2NyaXB0OworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RhdGljIGludCBiYW5uZXIgPSAwOworCWludCBqOworCisJaWYodHBudC0+c2Rldl9hdHRycyA9PSBOVUxMKQorCQl0cG50LT5zZGV2X2F0dHJzID0gTkNSXzcwMF9kZXZfYXR0cnM7CisKKwltZW1vcnkgPSBkbWFfYWxsb2Nfbm9uY29oZXJlbnQoaG9zdGRhdGEtPmRldiwgVE9UQUxfTUVNX1NJWkUsCisJCQkJICAgICAgICZwU2NyaXB0LCBHRlBfS0VSTkVMKTsKKwlpZihtZW1vcnkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIjUzYzcwMDogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZHJpdmVyLCBkZXRhdGNoaW5nXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2NyaXB0ID0gKF9fdTMyICopbWVtb3J5OworCWhvc3RkYXRhLT5tc2dpbiA9IG1lbW9yeSArIE1TR0lOX09GRlNFVDsKKwlob3N0ZGF0YS0+bXNnb3V0ID0gbWVtb3J5ICsgTVNHT1VUX09GRlNFVDsKKwlob3N0ZGF0YS0+c3RhdHVzID0gbWVtb3J5ICsgU1RBVFVTX09GRlNFVDsKKwkvKiBhbGwgb2YgdGhlc2Ugb2Zmc2V0cyBhcmUgTDFfQ0FDSEVfQllURVMgc2VwYXJhdGVkLiAgSXQgaXMgZmF0YWwKKwkgKiBpZiB0aGlzIGlzbid0IHN1ZmZpY2llbnQgc2VwYXJhdGlvbiB0byBhdm9pZCBkbWEgZmx1c2hpbmcgaXNzdWVzICovCisJQlVHX09OKCFkbWFfaXNfY29uc2lzdGVudChwU2NyaXB0KSAmJiBMMV9DQUNIRV9CWVRFUyA8IGRtYV9nZXRfY2FjaGVfYWxpZ25tZW50KCkpOworCWhvc3RkYXRhLT5zbG90cyA9IChzdHJ1Y3QgTkNSXzcwMF9jb21tYW5kX3Nsb3QgKikobWVtb3J5ICsgU0xPVFNfT0ZGU0VUKTsKKwlob3N0ZGF0YS0+ZGV2ID0gZGV2OworCQkKKwlwU2xvdHMgPSBwU2NyaXB0ICsgU0xPVFNfT0ZGU0VUOworCisJLyogRmlsbCBpbiB0aGUgbWlzc2luZyByb3V0aW5lcyBmcm9tIHRoZSBob3N0IHRlbXBsYXRlICovCisJdHBudC0+cXVldWVjb21tYW5kID0gTkNSXzcwMF9xdWV1ZWNvbW1hbmQ7CisJdHBudC0+ZWhfYWJvcnRfaGFuZGxlciA9IE5DUl83MDBfYWJvcnQ7CisJdHBudC0+ZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBOQ1JfNzAwX2Rldl9yZXNldDsKKwl0cG50LT5laF9idXNfcmVzZXRfaGFuZGxlciA9IE5DUl83MDBfYnVzX3Jlc2V0OworCXRwbnQtPmVoX2hvc3RfcmVzZXRfaGFuZGxlciA9IE5DUl83MDBfaG9zdF9yZXNldDsKKwl0cG50LT5jYW5fcXVldWUgPSBOQ1JfNzAwX0NPTU1BTkRfU0xPVFNfUEVSX0hPU1Q7CisJdHBudC0+c2dfdGFibGVzaXplID0gTkNSXzcwMF9TR19TRUdNRU5UUzsKKwl0cG50LT5jbWRfcGVyX2x1biA9IE5DUl83MDBfQ01EX1BFUl9MVU47CisJdHBudC0+dXNlX2NsdXN0ZXJpbmcgPSBFTkFCTEVfQ0xVU1RFUklORzsKKwl0cG50LT5zbGF2ZV9jb25maWd1cmUgPSBOQ1JfNzAwX3NsYXZlX2NvbmZpZ3VyZTsKKwl0cG50LT5zbGF2ZV9kZXN0cm95ID0gTkNSXzcwMF9zbGF2ZV9kZXN0cm95OworCXRwbnQtPmNoYW5nZV9xdWV1ZV9kZXB0aCA9IE5DUl83MDBfY2hhbmdlX3F1ZXVlX2RlcHRoOworCXRwbnQtPmNoYW5nZV9xdWV1ZV90eXBlID0gTkNSXzcwMF9jaGFuZ2VfcXVldWVfdHlwZTsKKwkKKwlpZih0cG50LT5uYW1lID09IE5VTEwpCisJCXRwbnQtPm5hbWUgPSAiNTNjNzAwIjsKKwlpZih0cG50LT5wcm9jX25hbWUgPT0gTlVMTCkKKwkJdHBudC0+cHJvY19uYW1lID0gIjUzYzcwMCI7CisJCisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKHRwbnQsIDQpOworCWlmICghaG9zdCkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KGhvc3RkYXRhLT5zbG90cywgMCwgc2l6ZW9mKHN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCkKKwkgICAgICAgKiBOQ1JfNzAwX0NPTU1BTkRfU0xPVFNfUEVSX0hPU1QpOworCWZvcihqID0gMDsgaiA8IE5DUl83MDBfQ09NTUFORF9TTE9UU19QRVJfSE9TVDsgaisrKSB7CisJCWRtYV9hZGRyX3Qgb2Zmc2V0ID0gKGRtYV9hZGRyX3QpKCh1bnNpZ25lZCBsb25nKSZob3N0ZGF0YS0+c2xvdHNbal0uU0dbMF0KKwkJCQkJICAtICh1bnNpZ25lZCBsb25nKSZob3N0ZGF0YS0+c2xvdHNbMF0uU0dbMF0pOworCQlob3N0ZGF0YS0+c2xvdHNbal0ucFNHID0gKHN0cnVjdCBOQ1JfNzAwX1NHX0xpc3QgKikoKHVuc2lnbmVkIGxvbmcpKHBTbG90cyArIG9mZnNldCkpOworCQlpZihqID09IDApCisJCQlob3N0ZGF0YS0+ZnJlZV9saXN0ID0gJmhvc3RkYXRhLT5zbG90c1tqXTsKKwkJZWxzZQorCQkJaG9zdGRhdGEtPnNsb3RzW2otMV0uSVRMX2ZvcncgPSAmaG9zdGRhdGEtPnNsb3RzW2pdOworCQlob3N0ZGF0YS0+c2xvdHNbal0uc3RhdGUgPSBOQ1JfNzAwX1NMT1RfRlJFRTsKKwl9CisKKwlmb3IoaiA9IDA7IGogPCBzaXplb2YoU0NSSVBUKS9zaXplb2YoU0NSSVBUWzBdKTsgaisrKSB7CisJCXNjcmlwdFtqXSA9IGJTX3RvX2hvc3QoU0NSSVBUW2pdKTsKKwl9CisKKwkvKiBhZGp1c3QgYWxsIGxhYmVscyB0byBiZSBidXMgcGh5c2ljYWwgKi8KKwlmb3IoaiA9IDA7IGogPCBQQVRDSEVTOyBqKyspIHsKKwkJc2NyaXB0W0xBQkVMUEFUQ0hFU1tqXV0gPSBiU190b19ob3N0KHBTY3JpcHQgKyBTQ1JJUFRbTEFCRUxQQVRDSEVTW2pdXSk7CisJfQorCS8qIG5vdyBwYXRjaCB1cCBmaXhlZCBhZGRyZXNzZXMuICovCisJc2NyaXB0X3BhdGNoXzMyKHNjcmlwdCwgTWVzc2FnZUxvY2F0aW9uLAorCQkJcFNjcmlwdCArIE1TR09VVF9PRkZTRVQpOworCXNjcmlwdF9wYXRjaF8zMihzY3JpcHQsIFN0YXR1c0FkZHJlc3MsCisJCQlwU2NyaXB0ICsgU1RBVFVTX09GRlNFVCk7CisJc2NyaXB0X3BhdGNoXzMyKHNjcmlwdCwgUmVjZWl2ZU1zZ0FkZHJlc3MsCisJCQlwU2NyaXB0ICsgTVNHSU5fT0ZGU0VUKTsKKworCWhvc3RkYXRhLT5zY3JpcHQgPSBzY3JpcHQ7CisJaG9zdGRhdGEtPnBTY3JpcHQgPSBwU2NyaXB0OworCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGhvc3RkYXRhLT5kZXYsIHBTY3JpcHQsIHNpemVvZihTQ1JJUFQpLCBETUFfVE9fREVWSUNFKTsKKwlob3N0ZGF0YS0+c3RhdGUgPSBOQ1JfNzAwX0hPU1RfRlJFRTsKKwlob3N0ZGF0YS0+Y21kID0gTlVMTDsKKwlob3N0LT5tYXhfaWQgPSA3OworCWhvc3QtPm1heF9sdW4gPSBOQ1JfNzAwX01BWF9MVU5TOworCUJVR19PTihOQ1JfNzAwX3RyYW5zcG9ydF90ZW1wbGF0ZSA9PSBOVUxMKTsKKwlob3N0LT50cmFuc3BvcnR0ID0gTkNSXzcwMF90cmFuc3BvcnRfdGVtcGxhdGU7CisJaG9zdC0+dW5pcXVlX2lkID0gaG9zdGRhdGEtPmJhc2U7CisJaG9zdC0+YmFzZSA9IGhvc3RkYXRhLT5iYXNlOworCWhvc3RkYXRhLT5laF9jb21wbGV0ZSA9IE5VTEw7CisJaG9zdC0+aG9zdGRhdGFbMF0gPSAodW5zaWduZWQgbG9uZylob3N0ZGF0YTsKKwkvKiBraWNrIHRoZSBjaGlwICovCisJTkNSXzcwMF93cml0ZWIoMHhmZiwgaG9zdCwgQ1RFU1Q5X1JFRyk7CisJaWYoaG9zdGRhdGEtPmNoaXA3MTApIAorCQlob3N0ZGF0YS0+cmV2ID0gKE5DUl83MDBfcmVhZGIoaG9zdCwgQ1RFU1Q4X1JFRyk+PjQpICYgMHgwZjsKKwllbHNlCisJCWhvc3RkYXRhLT5yZXYgPSAoTkNSXzcwMF9yZWFkYihob3N0LCBDVEVTVDdfUkVHKT4+NCkgJiAweDBmOworCWhvc3RkYXRhLT5mYXN0ID0gKE5DUl83MDBfcmVhZGIoaG9zdCwgQ1RFU1Q5X1JFRykgPT0gMCk7CisJaWYoYmFubmVyID09IDApIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICI1M2M3MDA6IFZlcnNpb24gIiBOQ1JfNzAwX1ZFUlNJT04gIiBCeSBKYW1lcy5Cb3R0b21sZXlASGFuc2VuUGFydG5lcnNoaXAuY29tXG4iKTsKKwkJYmFubmVyID0gMTsKKwl9CisJcHJpbnRrKEtFUk5fTk9USUNFICJzY3NpJWQ6ICVzIHJldiAlZCAlc1xuIiwgaG9zdC0+aG9zdF9ubywKKwkgICAgICAgaG9zdGRhdGEtPmNoaXA3MTAgPyAiNTNjNzEwIiA6IAorCSAgICAgICAoaG9zdGRhdGEtPmZhc3QgPyAiNTNjNzAwLTY2IiA6ICI1M2M3MDAiKSwKKwkgICAgICAgaG9zdGRhdGEtPnJldiwgaG9zdGRhdGEtPmRpZmZlcmVudGlhbCA/CisJICAgICAgICIoRGlmZmVyZW50aWFsKSIgOiAiIik7CisJLyogcmVzZXQgdGhlIGNoaXAgKi8KKwlOQ1JfNzAwX2NoaXBfcmVzZXQoaG9zdCk7CisKKwlpZiAoc2NzaV9hZGRfaG9zdChob3N0LCBkZXYpKSB7CisJCWRldl9wcmludGsoS0VSTl9FUlIsIGRldiwgIjUzYzcwMDogc2NzaV9hZGRfaG9zdCBmYWlsZWRcbiIpOworCQlzY3NpX2hvc3RfcHV0KGhvc3QpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzcGlfc2lnbmFsbGluZyhob3N0KSA9IGhvc3RkYXRhLT5kaWZmZXJlbnRpYWwgPyBTUElfU0lHTkFMX0hWRCA6CisJCVNQSV9TSUdOQUxfU0U7CisKKwlyZXR1cm4gaG9zdDsKK30KKworaW50CitOQ1JfNzAwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhID0gCisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKworCWRtYV9mcmVlX25vbmNvaGVyZW50KGhvc3RkYXRhLT5kZXYsIFRPVEFMX01FTV9TSVpFLAorCQkJICAgICAgIGhvc3RkYXRhLT5zY3JpcHQsIGhvc3RkYXRhLT5wU2NyaXB0KTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBfX3U4CitOQ1JfNzAwX2lkZW50aWZ5KGludCBjYW5fZGlzY29ubmVjdCwgX191OCBsdW4pCit7CisJcmV0dXJuIElERU5USUZZX0JBU0UgfAorCQkoKGNhbl9kaXNjb25uZWN0KSA/IDB4NDAgOiAwKSB8CisJCShsdW4gJiBOQ1JfNzAwX0xVTl9NQVNLKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogc3RhdGljIGludCBkYXRhX3Jlc2lkdWFsIChTY3NpX0hvc3QgKmhvc3QpCisgKgorICogUHVycG9zZSA6IHJldHVybiByZXNpZHVhbCBkYXRhIGNvdW50IG9mIHdoYXQncyBpbiB0aGUgY2hpcC4gIElmIHlvdQorICogcmVhbGx5IHdhbnQgdG8ga25vdyB3aGF0IHRoaXMgZnVuY3Rpb24gaXMgZG9pbmcsIGl0J3MgYWxtb3N0IGEKKyAqIGRpcmVjdCB0cmFuc2NyaXB0aW9uIG9mIHRoZSBhbGdvcml0aG0gZGVzY3JpYmVkIGluIHRoZSA1M2M3MTAKKyAqIGd1aWRlLCBleGNlcHQgdGhhdCB0aGUgREJDIGFuZCBERklGTyByZWdpc3RlcnMgYXJlIG9ubHkgNiBiaXRzCisgKiB3aWRlIG9uIGEgNTNjNzAwLgorICoKKyAqIElucHV0cyA6IGhvc3QgLSBTQ1NJIGhvc3QgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitOQ1JfNzAwX2RhdGFfcmVzaWR1YWwgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhID0gCisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKwlpbnQgY291bnQsIHN5bmNocm9ub3VzID0gMDsKKwl1bnNpZ25lZCBpbnQgZGRpcjsKKworCWlmKGhvc3RkYXRhLT5jaGlwNzEwKSB7CisJCWNvdW50ID0gKChOQ1JfNzAwX3JlYWRiKGhvc3QsIERGSUZPX1JFRykgJiAweDdmKSAtCisJCQkgKE5DUl83MDBfcmVhZGwoaG9zdCwgREJDX1JFRykgJiAweDdmKSkgJiAweDdmOworCX0gZWxzZSB7CisJCWNvdW50ID0gKChOQ1JfNzAwX3JlYWRiKGhvc3QsIERGSUZPX1JFRykgJiAweDNmKSAtCisJCQkgKE5DUl83MDBfcmVhZGwoaG9zdCwgREJDX1JFRykgJiAweDNmKSkgJiAweDNmOworCX0KKwkKKwlpZihob3N0ZGF0YS0+ZmFzdCkKKwkJc3luY2hyb25vdXMgPSBOQ1JfNzAwX3JlYWRiKGhvc3QsIFNYRkVSX1JFRykgJiAweDBmOworCQorCS8qIGdldCB0aGUgZGF0YSBkaXJlY3Rpb24gKi8KKwlkZGlyID0gTkNSXzcwMF9yZWFkYihob3N0LCBDVEVTVDBfUkVHKSAmIDB4MDE7CisKKwlpZiAoZGRpcikgeworCQkvKiBSZWNlaXZlICovCisJCWlmIChzeW5jaHJvbm91cykgCisJCQljb3VudCArPSAoTkNSXzcwMF9yZWFkYihob3N0LCBTU1RBVDJfUkVHKSAmIDB4ZjApID4+IDQ7CisJCWVsc2UKKwkJCWlmIChOQ1JfNzAwX3JlYWRiKGhvc3QsIFNTVEFUMV9SRUcpICYgU0lETF9SRUdfRlVMTCkKKwkJCQkrK2NvdW50OworCX0gZWxzZSB7CisJCS8qIFNlbmQgKi8KKwkJX191OCBzc3RhdCA9IE5DUl83MDBfcmVhZGIoaG9zdCwgU1NUQVQxX1JFRyk7CisJCWlmIChzc3RhdCAmIFNPRExfUkVHX0ZVTEwpCisJCQkrK2NvdW50OworCQlpZiAoc3luY2hyb25vdXMgJiYgKHNzdGF0ICYgU09EUl9SRUdfRlVMTCkpCisJCQkrK2NvdW50OworCX0KKyNpZmRlZiBOQ1JfNzAwX0RFQlVHCisJaWYoY291bnQpCisJCXByaW50aygiUkVTSURVQUwgSVMgJWQgKGRkaXIgJWQpXG4iLCBjb3VudCwgZGRpcik7CisjZW5kaWYKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIHByaW50IG91dCB0aGUgU0NTSSB3aXJlcyBhbmQgY29ycmVzcG9uZGluZyBwaGFzZSBmcm9tIHRoZSBTQkNMIHJlZ2lzdGVyCisgKiBpbiB0aGUgY2hpcCAqLworc3RhdGljIGlubGluZSBjaGFyICoKK3NiY2xfdG9fc3RyaW5nKF9fdTggc2JjbCkKK3sKKwlpbnQgaTsKKwlzdGF0aWMgY2hhciByZXRbMjU2XTsKKworCXJldFswXT0nXDAnOworCWZvcihpPTA7IGk8ODsgaSsrKSB7CisJCWlmKCgxPDxpKSAmIHNiY2wpIAorCQkJc3RyY2F0KHJldCwgTkNSXzcwMF9TQkNMX2JpdHNbaV0pOworCX0KKwlzdHJjYXQocmV0LCBOQ1JfNzAwX1NCQ0xfdG9fcGhhc2Vbc2JjbCAmIDB4MDddKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIF9fdTgKK2JpdG1hcF90b19udW1iZXIoX191OCBiaXRtYXApCit7CisJX191OCBpOworCisJZm9yKGk9MDsgaTw4ICYmICEoYml0bWFwICYoMTw8aSkpOyBpKyspCisJCTsKKwlyZXR1cm4gaTsKK30KKworLyogUHVsbCBhIHNsb3Qgb2ZmIHRoZSBmcmVlIGxpc3QgKi8KK1NUQVRJQyBzdHJ1Y3QgTkNSXzcwMF9jb21tYW5kX3Nsb3QgKgorZmluZF9lbXB0eV9zbG90KHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEpCit7CisJc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICpzbG90ID0gaG9zdGRhdGEtPmZyZWVfbGlzdDsKKworCWlmKHNsb3QgPT0gTlVMTCkgeworCQkvKiBzYW5pdHkgY2hlY2sgKi8KKwkJaWYoaG9zdGRhdGEtPmNvbW1hbmRfc2xvdF9jb3VudCAhPSBOQ1JfNzAwX0NPTU1BTkRfU0xPVFNfUEVSX0hPU1QpCisJCQlwcmludGsoS0VSTl9FUlIgIlNMT1RTIEZVTEwsIGJ1dCBjb3VudCBpcyAlZCwgc2hvdWxkIGJlICVkXG4iLCBob3N0ZGF0YS0+Y29tbWFuZF9zbG90X2NvdW50LCBOQ1JfNzAwX0NPTU1BTkRfU0xPVFNfUEVSX0hPU1QpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZihzbG90LT5zdGF0ZSAhPSBOQ1JfNzAwX1NMT1RfRlJFRSkKKwkJLyogc2hvdWxkIHBhbmljISAqLworCQlwcmludGsoS0VSTl9FUlIgIkJVU1kgU0xPVCBPTiBGUkVFIExJU1QhISFcbiIpOworCQkKKworCWhvc3RkYXRhLT5mcmVlX2xpc3QgPSBzbG90LT5JVExfZm9ydzsKKwlzbG90LT5JVExfZm9ydyA9IE5VTEw7CisKKworCS8qIE5PVEU6IHNldCB0aGUgc3RhdGUgdG8gYnVzeSBoZXJlLCBub3QgcXVldWVkLCBzaW5jZSB0aGlzCisJICogaW5kaWNhdGVzIHRoZSBzbG90IGlzIGluIHVzZSBhbmQgY2Fubm90IGJlIHJ1biBieSB0aGUgSVJRCisJICogZmluaXNoIHJvdXRpbmUuICBJZiB3ZSBjYW5ub3QgcXVldWUgdGhlIGNvbW1hbmQgd2hlbiBpdAorCSAqIGlzIHByb3Blcmx5IGJ1aWxkLCB3ZSB0aGVuIGNoYW5nZSB0byBOQ1JfNzAwX1NMT1RfUVVFVUVEICovCisJc2xvdC0+c3RhdGUgPSBOQ1JfNzAwX1NMT1RfQlVTWTsKKwlob3N0ZGF0YS0+Y29tbWFuZF9zbG90X2NvdW50Kys7CisJCisJcmV0dXJuIHNsb3Q7Cit9CisKK1NUQVRJQyB2b2lkIAorZnJlZV9zbG90KHN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqc2xvdCwKKwkgIHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEpCit7CisJaWYoKHNsb3QtPnN0YXRlICYgTkNSXzcwMF9TTE9UX01BU0spICE9IE5DUl83MDBfU0xPVF9NQUdJQykgeworCQlwcmludGsoS0VSTl9FUlIgIjUzYzcwMDogU0xPVCAlcCBpcyBub3QgTUFHSUMhISFcbiIsIHNsb3QpOworCX0KKwlpZihzbG90LT5zdGF0ZSA9PSBOQ1JfNzAwX1NMT1RfRlJFRSkgeworCQlwcmludGsoS0VSTl9FUlIgIjUzYzcwMDogU0xPVCAlcCBpcyBGUkVFISEhXG4iLCBzbG90KTsKKwl9CisJCisJc2xvdC0+cmVzdW1lX29mZnNldCA9IDA7CisJc2xvdC0+Y21uZCA9IE5VTEw7CisJc2xvdC0+c3RhdGUgPSBOQ1JfNzAwX1NMT1RfRlJFRTsKKwlzbG90LT5JVExfZm9ydyA9IGhvc3RkYXRhLT5mcmVlX2xpc3Q7CisJaG9zdGRhdGEtPmZyZWVfbGlzdCA9IHNsb3Q7CisJaG9zdGRhdGEtPmNvbW1hbmRfc2xvdF9jb3VudC0tOworfQorCisKKy8qIFRoaXMgcm91dGluZSByZWFsbHkgZG9lcyB2ZXJ5IGxpdHRsZS4gIFRoZSBjb21tYW5kIGlzIGluZGV4ZWQgb24KKyAgIHRoZSBJVEwgYW5kIChpZiB0YWdnZWQpIHRoZSBJVExRIGxpc3RzIGluIF9xdWV1ZWNvbW1hbmQgKi8KK1NUQVRJQyB2b2lkCitzYXZlX2Zvcl9yZXNlbGVjdGlvbihzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhLAorCQkgICAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcCwgX191MzIgZHNwKQoreworCS8qIEl0cyBqdXN0IHBvc3NpYmxlIHRoYXQgdGhpcyBnZXRzIGV4ZWN1dGVkIHR3aWNlICovCisJaWYoU0NwICE9IE5VTEwpIHsKKwkJc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICpzbG90ID0KKwkJCShzdHJ1Y3QgTkNSXzcwMF9jb21tYW5kX3Nsb3QgKilTQ3AtPmhvc3Rfc2NyaWJibGU7CisKKwkJc2xvdC0+cmVzdW1lX29mZnNldCA9IGRzcDsKKwl9CisJaG9zdGRhdGEtPnN0YXRlID0gTkNSXzcwMF9IT1NUX0ZSRUU7CisJaG9zdGRhdGEtPmNtZCA9IE5VTEw7Cit9CisKK1NUQVRJQyBpbmxpbmUgdm9pZAorTkNSXzcwMF91bm1hcChzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhLCBzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3AsCisJICAgICAgc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICpzbG90KQoreworCWlmKFNDcC0+c2NfZGF0YV9kaXJlY3Rpb24gIT0gRE1BX05PTkUgJiYKKwkgICBTQ3AtPnNjX2RhdGFfZGlyZWN0aW9uICE9IERNQV9CSURJUkVDVElPTkFMKSB7CisJCWlmKFNDcC0+dXNlX3NnKSB7CisJCQlkbWFfdW5tYXBfc2coaG9zdGRhdGEtPmRldiwgU0NwLT5idWZmZXIsCisJCQkJICAgICBTQ3AtPnVzZV9zZywgU0NwLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCX0gZWxzZSB7CisJCQlkbWFfdW5tYXBfc2luZ2xlKGhvc3RkYXRhLT5kZXYsIHNsb3QtPmRtYV9oYW5kbGUsCisJCQkJCSBTQ3AtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkJIFNDcC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQl9CisJfQorfQorCitTVEFUSUMgaW5saW5lIHZvaWQKK05DUl83MDBfc2NzaV9kb25lKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEsCisJICAgICAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcCwgaW50IHJlc3VsdCkKK3sKKwlob3N0ZGF0YS0+c3RhdGUgPSBOQ1JfNzAwX0hPU1RfRlJFRTsKKwlob3N0ZGF0YS0+Y21kID0gTlVMTDsKKworCWlmKFNDcCAhPSBOVUxMKSB7CisJCXN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqc2xvdCA9IAorCQkJKHN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqKVNDcC0+aG9zdF9zY3JpYmJsZTsKKwkJCisJCU5DUl83MDBfdW5tYXAoaG9zdGRhdGEsIFNDcCwgc2xvdCk7CisJCWRtYV91bm1hcF9zaW5nbGUoaG9zdGRhdGEtPmRldiwgc2xvdC0+cENtZCwKKwkJCQkgc2l6ZW9mKFNDcC0+Y21uZCksIERNQV9UT19ERVZJQ0UpOworCQlpZihTQ3AtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSAmJiBTQ3AtPmNtbmRbNl0gPT0gTkNSXzcwMF9JTlRFUk5BTF9TRU5TRV9NQUdJQykgeworI2lmZGVmIE5DUl83MDBfREVCVUcKKwkJCXByaW50aygiIE9SSUdJTkFMIENNRCAlcCBSRVRVUk5FRCAlZCwgbmV3IHJldHVybiBpcyAlZCBzZW5zZSBpc1xuIiwKKwkJCSAgICAgICBTQ3AsIFNDcC0+Y21uZFs3XSwgcmVzdWx0KTsKKwkJCXNjc2lfcHJpbnRfc2Vuc2UoIjUzYzcwMCIsIFNDcCk7CisKKyNlbmRpZgorCQkJLyogcmVzdG9yZSB0aGUgb2xkIHJlc3VsdCBpZiB0aGUgcmVxdWVzdCBzZW5zZSB3YXMKKwkJCSAqIHN1Y2Nlc3NmdWwgKi8KKwkJCWlmKHJlc3VsdCA9PSAwKQorCQkJCXJlc3VsdCA9IFNDcC0+Y21uZFs3XTsKKwkJCS8qIG5vdyByZXN0b3JlIHRoZSBvcmlnaW5hbCBjb21tYW5kICovCisJCQltZW1jcHkoKHZvaWQgKikgU0NwLT5jbW5kLCAodm9pZCAqKSBTQ3AtPmRhdGFfY21uZCwKKwkJCSAgICAgICBzaXplb2YoU0NwLT5kYXRhX2NtbmQpKTsKKwkJCVNDcC0+cmVxdWVzdF9idWZmZXIgPSBTQ3AtPmJ1ZmZlcjsKKwkJCVNDcC0+cmVxdWVzdF9idWZmbGVuID0gU0NwLT5idWZmbGVuOworCQkJU0NwLT51c2Vfc2cgPSBTQ3AtPm9sZF91c2Vfc2c7CisJCQlTQ3AtPmNtZF9sZW4gPSBTQ3AtPm9sZF9jbWRfbGVuOworCQkJU0NwLT5zY19kYXRhX2RpcmVjdGlvbiA9IFNDcC0+c2Nfb2xkX2RhdGFfZGlyZWN0aW9uOworCQkJU0NwLT51bmRlcmZsb3cgPSBTQ3AtPm9sZF91bmRlcmZsb3c7CisJCQkKKwkJfQorCQlmcmVlX3Nsb3Qoc2xvdCwgaG9zdGRhdGEpOworI2lmZGVmIE5DUl83MDBfREVCVUcKKwkJaWYoTkNSXzcwMF9nZXRfZGVwdGgoU0NwLT5kZXZpY2UpID09IDAgfHwKKwkJICAgTkNSXzcwMF9nZXRfZGVwdGgoU0NwLT5kZXZpY2UpID4gU0NwLT5kZXZpY2UtPnF1ZXVlX2RlcHRoKQorCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGRlcHRoIGluIE5DUl83MDBfc2NzaV9kb25lKCk6ICVkXG4iLAorCQkJICAgICAgIE5DUl83MDBfZ2V0X2RlcHRoKFNDcC0+ZGV2aWNlKSk7CisjZW5kaWYgLyogTkNSXzcwMF9ERUJVRyAqLworCQlOQ1JfNzAwX3NldF9kZXB0aChTQ3AtPmRldmljZSwgTkNSXzcwMF9nZXRfZGVwdGgoU0NwLT5kZXZpY2UpIC0gMSk7CisKKwkJU0NwLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwkJU0NwLT5yZXN1bHQgPSByZXN1bHQ7CisJCVNDcC0+c2NzaV9kb25lKFNDcCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICI1M2M3MDA6IFNDU0kgRE9ORSBIQVMgTlVMTCBTQ3BcbiIpOworCX0KK30KKworCitTVEFUSUMgdm9pZAorTkNSXzcwMF9pbnRlcm5hbF9idXNfcmVzZXQoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwkvKiBCdXMgcmVzZXQgKi8KKwlOQ1JfNzAwX3dyaXRlYihBU1NFUlRfUlNULCBob3N0LCBTQ05UTDFfUkVHKTsKKwl1ZGVsYXkoNTApOworCU5DUl83MDBfd3JpdGViKDAsIGhvc3QsIFNDTlRMMV9SRUcpOworCit9CisKK1NUQVRJQyB2b2lkCitOQ1JfNzAwX2NoaXBfc2V0dXAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhID0gCisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKwlfX3UzMiBkY250bF9leHRyYSA9IDA7CisJX191OCBtaW5fcGVyaW9kOworCV9fdTggbWluX3hmZXJwID0gKGhvc3RkYXRhLT5jaGlwNzEwID8gTkNSXzcxMF9NSU5fWEZFUlAgOiBOQ1JfNzAwX01JTl9YRkVSUCk7CisKKwlpZihob3N0ZGF0YS0+Y2hpcDcxMCkgeworCQlfX3U4IGJ1cnN0X2Rpc2FibGUgPSBob3N0ZGF0YS0+YnVyc3RfZGlzYWJsZQorCQkJPyBCVVJTVF9ESVNBQkxFIDogMDsKKwkJZGNudGxfZXh0cmEgPSBDT01QQVRfNzAwX01PREU7CisKKwkJTkNSXzcwMF93cml0ZWIoZGNudGxfZXh0cmEsIGhvc3QsIERDTlRMX1JFRyk7CisJCU5DUl83MDBfd3JpdGViKEJVUlNUX0xFTkdUSF84ICB8IGhvc3RkYXRhLT5kbW9kZV9leHRyYSwKKwkJCSAgICAgICBob3N0LCBETU9ERV83MTBfUkVHKTsKKwkJTkNSXzcwMF93cml0ZWIoYnVyc3RfZGlzYWJsZSB8IChob3N0ZGF0YS0+ZGlmZmVyZW50aWFsID8gCisJCQkJCQlESUZGIDogMCksIGhvc3QsIENURVNUN19SRUcpOworCQlOQ1JfNzAwX3dyaXRlYihCVEJfVElNRVJfRElTQUJMRSwgaG9zdCwgQ1RFU1QwX1JFRyk7CisJCU5DUl83MDBfd3JpdGViKEZVTExfQVJCSVRSQVRJT04gfCBFTkFCTEVfUEFSSVRZIHwgUEFSSVRZCisJCQkgICAgICAgfCBBVVRPX0FUTiwgaG9zdCwgU0NOVEwwX1JFRyk7CisJfSBlbHNlIHsKKwkJTkNSXzcwMF93cml0ZWIoQlVSU1RfTEVOR1RIXzggfCBob3N0ZGF0YS0+ZG1vZGVfZXh0cmEsCisJCQkgICAgICAgaG9zdCwgRE1PREVfNzAwX1JFRyk7CisJCU5DUl83MDBfd3JpdGViKGhvc3RkYXRhLT5kaWZmZXJlbnRpYWwgPyAKKwkJCSAgICAgICBESUZGIDogMCwgaG9zdCwgQ1RFU1Q3X1JFRyk7CisJCWlmKGhvc3RkYXRhLT5mYXN0KSB7CisJCQkvKiB0aGlzIGlzIGZvciA3MDAtNjYsIGRvZXMgbm90aGluZyBvbiA3MDAgKi8KKwkJCU5DUl83MDBfd3JpdGViKExBU1RfRElTX0VOQkwgfCBFTkFCTEVfQUNUSVZFX05FR0FUSU9OIAorCQkJCSAgICAgICB8IEdFTkVSQVRFX1JFQ0VJVkVfUEFSSVRZLCBob3N0LAorCQkJCSAgICAgICBDVEVTVDhfUkVHKTsKKwkJfSBlbHNlIHsKKwkJCU5DUl83MDBfd3JpdGViKEZVTExfQVJCSVRSQVRJT04gfCBFTkFCTEVfUEFSSVRZCisJCQkJICAgICAgIHwgUEFSSVRZIHwgQVVUT19BVE4sIGhvc3QsIFNDTlRMMF9SRUcpOworCQl9CisJfQorCisJTkNSXzcwMF93cml0ZWIoMSA8PCBob3N0LT50aGlzX2lkLCBob3N0LCBTQ0lEX1JFRyk7CisJTkNSXzcwMF93cml0ZWIoMCwgaG9zdCwgU0JDTF9SRUcpOworCU5DUl83MDBfd3JpdGViKEFTWU5DX09QRVJBVElPTiwgaG9zdCwgU1hGRVJfUkVHKTsKKworCU5DUl83MDBfd3JpdGViKFBIQVNFX01NX0lOVCB8IFNFTF9USU1FT1VUX0lOVCB8IEdST1NTX0VSUl9JTlQgfCBVWF9ESVNDX0lOVAorCSAgICAgfCBSU1RfSU5UIHwgUEFSX0VSUl9JTlQgfCBTRUxFQ1RfSU5ULCBob3N0LCBTSUVOX1JFRyk7CisKKwlOQ1JfNzAwX3dyaXRlYihBQk9SVF9JTlQgfCBJTlRfSU5TVF9JTlQgfCBJTEdMX0lOU1RfSU5ULCBob3N0LCBESUVOX1JFRyk7CisJTkNSXzcwMF93cml0ZWIoRU5BQkxFX1NFTEVDVCwgaG9zdCwgU0NOVEwxX1JFRyk7CisJaWYoaG9zdGRhdGEtPmNsb2NrID4gNzUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICI1M2M3MDA6IENsb2NrIHNwZWVkICVkTUh6IGlzIHRvbyBoaWdoOiA3NU1oeiBpcyB0aGUgbWF4aW11bSB0aGlzIGNoaXAgY2FuIGJlIGRyaXZlbiBhdFxuIiwgaG9zdGRhdGEtPmNsb2NrKTsKKwkJLyogZG8gdGhlIGJlc3Qgd2UgY2FuLCBidXQgdGhlIGFzeW5jIGNsb2NrIHdpbGwgYmUgb3V0CisJCSAqIG9mIHNwZWM6IHN5bmMgZGl2aWRlciAyLCBhc3luYyBkaXZpZGVyIDMgKi8KKwkJREVCVUcoKCI1M2M3MDA6IHN5bmMgMiBhc3luYyAzXG4iKSk7CisJCU5DUl83MDBfd3JpdGViKFNZTkNfRElWXzJfMCwgaG9zdCwgU0JDTF9SRUcpOworCQlOQ1JfNzAwX3dyaXRlYihBU1lOQ19ESVZfM18wIHwgZGNudGxfZXh0cmEsIGhvc3QsIERDTlRMX1JFRyk7CisJCWhvc3RkYXRhLT5zeW5jX2Nsb2NrID0gaG9zdGRhdGEtPmNsb2NrLzI7CisJfSBlbHNlCWlmKGhvc3RkYXRhLT5jbG9jayA+IDUwICAmJiBob3N0ZGF0YS0+Y2xvY2sgPD0gNzUpIHsKKwkJLyogc3luYyBkaXZpZGVyIDEuNSwgYXN5bmMgZGl2aWRlciAzICovCisJCURFQlVHKCgiNTNjNzAwOiBzeW5jIDEuNSBhc3luYyAzXG4iKSk7CisJCU5DUl83MDBfd3JpdGViKFNZTkNfRElWXzFfNSwgaG9zdCwgU0JDTF9SRUcpOworCQlOQ1JfNzAwX3dyaXRlYihBU1lOQ19ESVZfM18wIHwgZGNudGxfZXh0cmEsIGhvc3QsIERDTlRMX1JFRyk7CisJCWhvc3RkYXRhLT5zeW5jX2Nsb2NrID0gaG9zdGRhdGEtPmNsb2NrKjI7CisJCWhvc3RkYXRhLT5zeW5jX2Nsb2NrIC89IDM7CisJCQorCX0gZWxzZSBpZihob3N0ZGF0YS0+Y2xvY2sgPiAzNyAmJiBob3N0ZGF0YS0+Y2xvY2sgPD0gNTApIHsKKwkJLyogc3luYyBkaXZpZGVyIDEsIGFzeW5jIGRpdmlkZXIgMiAqLworCQlERUJVRygoIjUzYzcwMDogc3luYyAxIGFzeW5jIDJcbiIpKTsKKwkJTkNSXzcwMF93cml0ZWIoU1lOQ19ESVZfMV8wLCBob3N0LCBTQkNMX1JFRyk7CisJCU5DUl83MDBfd3JpdGViKEFTWU5DX0RJVl8yXzAgfCBkY250bF9leHRyYSwgaG9zdCwgRENOVExfUkVHKTsKKwkJaG9zdGRhdGEtPnN5bmNfY2xvY2sgPSBob3N0ZGF0YS0+Y2xvY2s7CisJfSBlbHNlIGlmKGhvc3RkYXRhLT5jbG9jayA+IDI1ICYmIGhvc3RkYXRhLT5jbG9jayA8PTM3KSB7CisJCS8qIHN5bmMgZGl2aWRlciAxLCBhc3luYyBkaXZpZGVyIDEuNSAqLworCQlERUJVRygoIjUzYzcwMDogc3luYyAxIGFzeW5jIDEuNVxuIikpOworCQlOQ1JfNzAwX3dyaXRlYihTWU5DX0RJVl8xXzAsIGhvc3QsIFNCQ0xfUkVHKTsKKwkJTkNSXzcwMF93cml0ZWIoQVNZTkNfRElWXzFfNSB8IGRjbnRsX2V4dHJhLCBob3N0LCBEQ05UTF9SRUcpOworCQlob3N0ZGF0YS0+c3luY19jbG9jayA9IGhvc3RkYXRhLT5jbG9jazsKKwl9IGVsc2UgeworCQlERUJVRygoIjUzYzcwMDogc3luYyAxIGFzeW5jIDFcbiIpKTsKKwkJTkNSXzcwMF93cml0ZWIoU1lOQ19ESVZfMV8wLCBob3N0LCBTQkNMX1JFRyk7CisJCU5DUl83MDBfd3JpdGViKEFTWU5DX0RJVl8xXzAgfCBkY250bF9leHRyYSwgaG9zdCwgRENOVExfUkVHKTsKKwkJLyogc3luYyBkaXZpZGVyIDEsIGFzeW5jIGRpdmlkZXIgMSAqLworCQlob3N0ZGF0YS0+c3luY19jbG9jayA9IGhvc3RkYXRhLT5jbG9jazsKKwl9CisJLyogQ2FsY3VsYXRlIHRoZSBhY3R1YWwgbWluaW11bSBwZXJpb2QgdGhhdCBjYW4gYmUgc3VwcG9ydGVkCisJICogYnkgb3VyIHN5bmNocm9ub3VzIGNsb2NrIHNwZWVkLiAgU2VlIHRoZSA3MTAgbWFudWFsIGZvcgorCSAqIGV4YWN0IGRldGFpbHMgb2YgdGhpcyBjYWxjdWxhdGlvbiB3aGljaCBpcyBiYXNlZCBvbiBhCisJICogc2V0dGluZyBvZiB0aGUgU1hGRVIgcmVnaXN0ZXIgKi8KKwltaW5fcGVyaW9kID0gMTAwMCooNCttaW5feGZlcnApLyg0Kmhvc3RkYXRhLT5zeW5jX2Nsb2NrKTsKKwlob3N0ZGF0YS0+bWluX3BlcmlvZCA9IE5DUl83MDBfTUlOX1BFUklPRDsKKwlpZihtaW5fcGVyaW9kID4gTkNSXzcwMF9NSU5fUEVSSU9EKQorCQlob3N0ZGF0YS0+bWluX3BlcmlvZCA9IG1pbl9wZXJpb2Q7Cit9CisKK1NUQVRJQyB2b2lkCitOQ1JfNzAwX2NoaXBfcmVzZXQoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhID0gCisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKwlpZihob3N0ZGF0YS0+Y2hpcDcxMCkgeworCQlOQ1JfNzAwX3dyaXRlYihTT0ZUV0FSRV9SRVNFVF83MTAsIGhvc3QsIElTVEFUX1JFRyk7CisJCXVkZWxheSgxMDApOworCisJCU5DUl83MDBfd3JpdGViKDAsIGhvc3QsIElTVEFUX1JFRyk7CisJfSBlbHNlIHsKKwkJTkNSXzcwMF93cml0ZWIoU09GVFdBUkVfUkVTRVQsIGhvc3QsIERDTlRMX1JFRyk7CisJCXVkZWxheSgxMDApOworCQkKKwkJTkNSXzcwMF93cml0ZWIoMCwgaG9zdCwgRENOVExfUkVHKTsKKwl9CisKKwltZGVsYXkoMTAwMCk7CisKKwlOQ1JfNzAwX2NoaXBfc2V0dXAoaG9zdCk7Cit9CisKKy8qIFRoZSBoZWFydCBvZiB0aGUgbWVzc2FnZSBwcm9jZXNzaW5nIGVuZ2luZSBpcyB0aGF0IHRoZSBpbnN0cnVjdGlvbgorICogaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIElOVCBpcyB0aGUgbm9ybWFsIGNhc2UgKGFuZCBzbyBtdXN0IGJlIENMRUFSCisgKiBBQ0spLiAgSWYgd2Ugd2FudCB0byBkbyBzb21ldGhpbmcgZWxzZSwgd2UgY2FsbCB0aGF0IHJvdXRpbmUgaW4KKyAqIHNjcmlwdHMgYW5kIHNldCB0ZW1wIHRvIGJlIHRoZSBub3JtYWwgY2FzZSArIDggKHNraXBwaW5nIHRoZSBDTEVBUgorICogQUNLKSBzbyB0aGF0IHRoZSByb3V0aW5lIHJldHVybnMgY29ycmVjdGx5IHRvIHJlc3VtZSBpdHMgYWN0aXZpdHkKKyAqICovCitTVEFUSUMgX191MzIKK3Byb2Nlc3NfZXh0ZW5kZWRfbWVzc2FnZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCAKKwkJCSBzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhLAorCQkJIHN0cnVjdCBzY3NpX2NtbmQgKlNDcCwgX191MzIgZHNwLCBfX3UzMiBkc3BzKQoreworCV9fdTMyIHJlc3VtZV9vZmZzZXQgPSBkc3AsIHRlbXAgPSBkc3AgKyA4OworCV9fdTggcHVuID0gMHhmZiwgbHVuID0gMHhmZjsKKworCWlmKFNDcCAhPSBOVUxMKSB7CisJCXB1biA9IFNDcC0+ZGV2aWNlLT5pZDsKKwkJbHVuID0gU0NwLT5kZXZpY2UtPmx1bjsKKwl9CisKKwlzd2l0Y2goaG9zdGRhdGEtPm1zZ2luWzJdKSB7CisJY2FzZSBBX1NEVFJfTVNHOgorCQlpZihTQ3AgIT0gTlVMTCAmJiBOQ1JfNzAwX2lzX2ZsYWdfc2V0KFNDcC0+ZGV2aWNlLCBOQ1JfNzAwX0RFVl9CRUdJTl9TWU5DX05FR09USUFUSU9OKSkgeworCQkJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gU0NwLT5kZXZpY2UtPnNkZXZfdGFyZ2V0OworCQkJX191OCBwZXJpb2QgPSBob3N0ZGF0YS0+bXNnaW5bM107CisJCQlfX3U4IG9mZnNldCA9IGhvc3RkYXRhLT5tc2dpbls0XTsKKworCQkJaWYob2Zmc2V0ID09IDAgfHwgcGVyaW9kID09IDApIHsKKwkJCQlvZmZzZXQgPSAwOworCQkJCXBlcmlvZCA9IDA7CisJCQl9CisKKwkJCXNwaV9vZmZzZXQoc3RhcmdldCkgPSBvZmZzZXQ7CisJCQlzcGlfcGVyaW9kKHN0YXJnZXQpID0gcGVyaW9kOworCQkJCisJCQlpZihOQ1JfNzAwX2lzX2ZsYWdfc2V0KFNDcC0+ZGV2aWNlLCBOQ1JfNzAwX0RFVl9QUklOVF9TWU5DX05FR09USUFUSU9OKSkgeworCQkJCXNwaV9kaXNwbGF5X3hmZXJfYWdyZWVtZW50KHN0YXJnZXQpOworCQkJCU5DUl83MDBfY2xlYXJfZmxhZyhTQ3AtPmRldmljZSwgTkNSXzcwMF9ERVZfUFJJTlRfU1lOQ19ORUdPVElBVElPTik7CisJCQl9CisJCQkKKwkJCU5DUl83MDBfc2V0X2ZsYWcoU0NwLT5kZXZpY2UsIE5DUl83MDBfREVWX05FR09USUFURURfU1lOQyk7CisJCQlOQ1JfNzAwX2NsZWFyX2ZsYWcoU0NwLT5kZXZpY2UsIE5DUl83MDBfREVWX0JFR0lOX1NZTkNfTkVHT1RJQVRJT04pOworCQkJCisJCQlOQ1JfNzAwX3dyaXRlYihOQ1JfNzAwX2dldF9TWEZFUihTQ3AtPmRldmljZSksCisJCQkJICAgICAgIGhvc3QsIFNYRkVSX1JFRyk7CisKKwkJfSBlbHNlIHsKKwkJCS8qIFNEVFIgbWVzc2FnZSBvdXQgb2YgdGhlIGJsdWUsIHJlamVjdCBpdCAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkIFVuZXhwZWN0ZWQgU0RUUiBtc2dcbiIsCisJCQkgICAgICAgaG9zdC0+aG9zdF9ubyk7CisJCQlob3N0ZGF0YS0+bXNnb3V0WzBdID0gQV9SRUpFQ1RfTVNHOworCQkJZG1hX2NhY2hlX3N5bmMoaG9zdGRhdGEtPm1zZ291dCwgMSwgRE1BX1RPX0RFVklDRSk7CisJCQlzY3JpcHRfcGF0Y2hfMTYoaG9zdGRhdGEtPnNjcmlwdCwgTWVzc2FnZUNvdW50LCAxKTsKKwkJCS8qIFNlbmRNc2dPdXQgcmV0dXJucywgc28gc2V0IHVwIHRoZSByZXR1cm4KKwkJCSAqIGFkZHJlc3MgKi8KKwkJCXJlc3VtZV9vZmZzZXQgPSBob3N0ZGF0YS0+cFNjcmlwdCArIEVudF9TZW5kTWVzc2FnZVdpdGhBVE47CisJCX0KKwkJYnJlYWs7CisJCisJY2FzZSBBX1dEVFJfTVNHOgorCQlwcmludGsoS0VSTl9JTkZPICJzY3NpJWQ6ICglZDolZCksIFVuc29saWNpdGVkIFdEVFIgYWZ0ZXIgQ01ELCBSZWplY3RpbmdcbiIsCisJCSAgICAgICBob3N0LT5ob3N0X25vLCBwdW4sIGx1bik7CisJCWhvc3RkYXRhLT5tc2dvdXRbMF0gPSBBX1JFSkVDVF9NU0c7CisJCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5tc2dvdXQsIDEsIERNQV9UT19ERVZJQ0UpOworCQlzY3JpcHRfcGF0Y2hfMTYoaG9zdGRhdGEtPnNjcmlwdCwgTWVzc2FnZUNvdW50LCAxKTsKKwkJcmVzdW1lX29mZnNldCA9IGhvc3RkYXRhLT5wU2NyaXB0ICsgRW50X1NlbmRNZXNzYWdlV2l0aEFUTjsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0lORk8gInNjc2klZCAoJWQ6JWQpOiBVbmV4cGVjdGVkIG1lc3NhZ2UgJXM6ICIsCisJCSAgICAgICBob3N0LT5ob3N0X25vLCBwdW4sIGx1biwKKwkJICAgICAgIE5DUl83MDBfcGhhc2VbKGRzcHMgJiAweGYwMCkgPj4gOF0pOworCQlzY3NpX3ByaW50X21zZyhob3N0ZGF0YS0+bXNnaW4pOworCQlwcmludGsoIlxuIik7CisJCS8qIGp1c3QgcmVqZWN0IGl0ICovCisJCWhvc3RkYXRhLT5tc2dvdXRbMF0gPSBBX1JFSkVDVF9NU0c7CisJCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5tc2dvdXQsIDEsIERNQV9UT19ERVZJQ0UpOworCQlzY3JpcHRfcGF0Y2hfMTYoaG9zdGRhdGEtPnNjcmlwdCwgTWVzc2FnZUNvdW50LCAxKTsKKwkJLyogU2VuZE1zZ091dCByZXR1cm5zLCBzbyBzZXQgdXAgdGhlIHJldHVybgorCQkgKiBhZGRyZXNzICovCisJCXJlc3VtZV9vZmZzZXQgPSBob3N0ZGF0YS0+cFNjcmlwdCArIEVudF9TZW5kTWVzc2FnZVdpdGhBVE47CisJfQorCU5DUl83MDBfd3JpdGVsKHRlbXAsIGhvc3QsIFRFTVBfUkVHKTsKKwlyZXR1cm4gcmVzdW1lX29mZnNldDsKK30KKworU1RBVElDIF9fdTMyCitwcm9jZXNzX21lc3NhZ2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwJc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSwKKwkJc3RydWN0IHNjc2lfY21uZCAqU0NwLCBfX3UzMiBkc3AsIF9fdTMyIGRzcHMpCit7CisJLyogd29yayBvdXQgd2hlcmUgdG8gcmV0dXJuIHRvICovCisJX191MzIgdGVtcCA9IGRzcCArIDgsIHJlc3VtZV9vZmZzZXQgPSBkc3A7CisJX191OCBwdW4gPSAweGZmLCBsdW4gPSAweGZmOworCisJaWYoU0NwICE9IE5VTEwpIHsKKwkJcHVuID0gU0NwLT5kZXZpY2UtPmlkOworCQlsdW4gPSBTQ3AtPmRldmljZS0+bHVuOworCX0KKworI2lmZGVmIE5DUl83MDBfREVCVUcKKwlwcmludGsoInNjc2klZCAoJWQ6JWQpOiBtZXNzYWdlICVzOiAiLCBob3N0LT5ob3N0X25vLCBwdW4sIGx1biwKKwkgICAgICAgTkNSXzcwMF9waGFzZVsoZHNwcyAmIDB4ZjAwKSA+PiA4XSk7CisJc2NzaV9wcmludF9tc2coaG9zdGRhdGEtPm1zZ2luKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKworCXN3aXRjaChob3N0ZGF0YS0+bXNnaW5bMF0pIHsKKworCWNhc2UgQV9FWFRFTkRFRF9NU0c6CisJCXJlc3VtZV9vZmZzZXQgPSAgcHJvY2Vzc19leHRlbmRlZF9tZXNzYWdlKGhvc3QsIGhvc3RkYXRhLCBTQ3AsCisJCQkJCQkJICBkc3AsIGRzcHMpOworCQlicmVhazsKKworCWNhc2UgQV9SRUpFQ1RfTVNHOgorCQlpZihTQ3AgIT0gTlVMTCAmJiBOQ1JfNzAwX2lzX2ZsYWdfc2V0KFNDcC0+ZGV2aWNlLCBOQ1JfNzAwX0RFVl9CRUdJTl9TWU5DX05FR09USUFUSU9OKSkgeworCQkJLyogUmVqZWN0ZWQgb3VyIHN5bmMgbmVnb3RpYXRpb24gYXR0ZW1wdCAqLworCQkJc3BpX3BlcmlvZChTQ3AtPmRldmljZS0+c2Rldl90YXJnZXQpID0KKwkJCQlzcGlfb2Zmc2V0KFNDcC0+ZGV2aWNlLT5zZGV2X3RhcmdldCkgPSAwOworCQkJTkNSXzcwMF9zZXRfZmxhZyhTQ3AtPmRldmljZSwgTkNSXzcwMF9ERVZfTkVHT1RJQVRFRF9TWU5DKTsKKwkJCU5DUl83MDBfY2xlYXJfZmxhZyhTQ3AtPmRldmljZSwgTkNSXzcwMF9ERVZfQkVHSU5fU1lOQ19ORUdPVElBVElPTik7CisJCX0gZWxzZSBpZihTQ3AgIT0gTlVMTCAmJiBOQ1JfNzAwX2dldF90YWdfbmVnX3N0YXRlKFNDcC0+ZGV2aWNlKSA9PSBOQ1JfNzAwX0RVUklOR19UQUdfTkVHT1RJQVRJT04pIHsKKwkJCS8qIHJlamVjdGVkIG91ciBmaXJzdCBzaW1wbGUgdGFnIG1lc3NhZ2UgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZCAoJWQ6JWQpIFJlamVjdGVkIGZpcnN0IHRhZyBxdWV1ZSBhdHRlbXB0LCB0dXJuaW5nIG9mZiB0YWcgcXVldWVpbmdcbiIsIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuKTsKKwkJCS8qIHdlJ3JlIGRvbmUgbmVnb3RpYXRpbmcgKi8KKwkJCU5DUl83MDBfc2V0X3RhZ19uZWdfc3RhdGUoU0NwLT5kZXZpY2UsIE5DUl83MDBfRklOSVNIRURfVEFHX05FR09USUFUSU9OKTsKKwkJCWhvc3RkYXRhLT50YWdfbmVnb3RpYXRlZCAmPSB+KDE8PFNDcC0+ZGV2aWNlLT5pZCk7CisJCQlTQ3AtPmRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCA9IDA7CisJCQlzY3NpX2RlYWN0aXZhdGVfdGNxKFNDcC0+ZGV2aWNlLCBob3N0LT5jbWRfcGVyX2x1bik7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQgKCVkOiVkKSBVbmV4cGVjdGVkIFJFSkVDVCBNZXNzYWdlICVzXG4iLAorCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuLAorCQkJICAgICAgIE5DUl83MDBfcGhhc2VbKGRzcHMgJiAweGYwMCkgPj4gOF0pOworCQkJLyogaG93ZXZlciwganVzdCBpZ25vcmUgaXQgKi8KKwkJfQorCQlicmVhazsKKworCWNhc2UgQV9QQVJJVFlfRVJST1JfTVNHOgorCQlwcmludGsoS0VSTl9FUlIgInNjc2klZCAoJWQ6JWQpIFBhcml0eSBFcnJvciFcbiIsIGhvc3QtPmhvc3Rfbm8sCisJCSAgICAgICBwdW4sIGx1bik7CisJCU5DUl83MDBfaW50ZXJuYWxfYnVzX3Jlc2V0KGhvc3QpOworCQlicmVhazsKKwljYXNlIEFfU0lNUExFX1RBR19NU0c6CisJCXByaW50ayhLRVJOX0lORk8gInNjc2klZCAoJWQ6JWQpIFNJTVBMRSBUQUcgJWQgJXNcbiIsIGhvc3QtPmhvc3Rfbm8sCisJCSAgICAgICBwdW4sIGx1biwgaG9zdGRhdGEtPm1zZ2luWzFdLAorCQkgICAgICAgTkNSXzcwMF9waGFzZVsoZHNwcyAmIDB4ZjAwKSA+PiA4XSk7CisJCS8qIGp1c3QgaWdub3JlIGl0ICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0lORk8gInNjc2klZCAoJWQ6JWQpOiBVbmV4cGVjdGVkIG1lc3NhZ2UgJXM6ICIsCisJCSAgICAgICBob3N0LT5ob3N0X25vLCBwdW4sIGx1biwKKwkJICAgICAgIE5DUl83MDBfcGhhc2VbKGRzcHMgJiAweGYwMCkgPj4gOF0pOworCisJCXNjc2lfcHJpbnRfbXNnKGhvc3RkYXRhLT5tc2dpbik7CisJCXByaW50aygiXG4iKTsKKwkJLyoganVzdCByZWplY3QgaXQgKi8KKwkJaG9zdGRhdGEtPm1zZ291dFswXSA9IEFfUkVKRUNUX01TRzsKKwkJZG1hX2NhY2hlX3N5bmMoaG9zdGRhdGEtPm1zZ291dCwgMSwgRE1BX1RPX0RFVklDRSk7CisJCXNjcmlwdF9wYXRjaF8xNihob3N0ZGF0YS0+c2NyaXB0LCBNZXNzYWdlQ291bnQsIDEpOworCQkvKiBTZW5kTXNnT3V0IHJldHVybnMsIHNvIHNldCB1cCB0aGUgcmV0dXJuCisJCSAqIGFkZHJlc3MgKi8KKwkJcmVzdW1lX29mZnNldCA9IGhvc3RkYXRhLT5wU2NyaXB0ICsgRW50X1NlbmRNZXNzYWdlV2l0aEFUTjsKKworCQlicmVhazsKKwl9CisJTkNSXzcwMF93cml0ZWwodGVtcCwgaG9zdCwgVEVNUF9SRUcpOworCS8qIHNldCB1cyB1cCB0byByZWNlaXZlIGFub3RoZXIgbWVzc2FnZSAqLworCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5tc2dpbiwgTVNHX0FSUkFZX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJcmV0dXJuIHJlc3VtZV9vZmZzZXQ7Cit9CisKK1NUQVRJQyBfX3UzMgorcHJvY2Vzc19zY3JpcHRfaW50ZXJydXB0KF9fdTMyIGRzcHMsIF9fdTMyIGRzcCwgc3RydWN0IHNjc2lfY21uZCAqU0NwLAorCQkJIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsCisJCQkgc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSkKK3sKKwlfX3UzMiByZXN1bWVfb2Zmc2V0ID0gMDsKKwlfX3U4IHB1biA9IDB4ZmYsIGx1bj0weGZmOworCisJaWYoU0NwICE9IE5VTEwpIHsKKwkJcHVuID0gU0NwLT5kZXZpY2UtPmlkOworCQlsdW4gPSBTQ3AtPmRldmljZS0+bHVuOworCX0KKworCWlmKGRzcHMgPT0gQV9HT09EX1NUQVRVU19BRlRFUl9TVEFUVVMpIHsKKwkJREVCVUcoKCIgIENPTU1BTkQgQ09NUExFVEUsIHN0YXR1cz0lMDJ4XG4iLAorCQkgICAgICAgaG9zdGRhdGEtPnN0YXR1c1swXSkpOworCQkvKiBPSywgaWYgVENRIHN0aWxsIHVuZGVyIG5lZ290aWF0aW9uLCB3ZSBub3cga25vdyBpdCB3b3JrcyAqLworCQlpZiAoTkNSXzcwMF9nZXRfdGFnX25lZ19zdGF0ZShTQ3AtPmRldmljZSkgPT0gTkNSXzcwMF9EVVJJTkdfVEFHX05FR09USUFUSU9OKQorCQkJTkNSXzcwMF9zZXRfdGFnX25lZ19zdGF0ZShTQ3AtPmRldmljZSwKKwkJCQkJCSAgTkNSXzcwMF9GSU5JU0hFRF9UQUdfTkVHT1RJQVRJT04pOworCQkJCisJCS8qIGNoZWNrIGZvciBjb250aW5nZW50IGFsbGVnaWFuY2UgY29udGl0aW9ucyAqLworCQlpZihzdGF0dXNfYnl0ZShob3N0ZGF0YS0+c3RhdHVzWzBdKSA9PSBDSEVDS19DT05ESVRJT04gfHwKKwkJICAgc3RhdHVzX2J5dGUoaG9zdGRhdGEtPnN0YXR1c1swXSkgPT0gQ09NTUFORF9URVJNSU5BVEVEKSB7CisJCQlzdHJ1Y3QgTkNSXzcwMF9jb21tYW5kX3Nsb3QgKnNsb3QgPQorCQkJCShzdHJ1Y3QgTkNSXzcwMF9jb21tYW5kX3Nsb3QgKilTQ3AtPmhvc3Rfc2NyaWJibGU7CisJCQlpZihTQ3AtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkgeworCQkJCS8qIE9PUFM6IGJhZCBkZXZpY2UsIHJldHVybmluZyBhbm90aGVyCisJCQkJICogY29udGluZ2VudCBhbGxlZ2lhbmNlIGNvbmRpdGlvbiAqLworCQkJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkICglZDolZCkgYnJva2VuIGRldmljZSBpcyBsb29waW5nIGluIGNvbnRpbmdlbnQgYWxsZWdpYW5jZTogaWdub3JpbmdcbiIsIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuKTsKKwkJCQlOQ1JfNzAwX3Njc2lfZG9uZShob3N0ZGF0YSwgU0NwLCBob3N0ZGF0YS0+c3RhdHVzWzBdKTsKKwkJCX0gZWxzZSB7CisjaWZkZWYgTkNSX0RFQlVHCisJCQkJc2NzaV9wcmludF9jb21tYW5kKFNDcCk7CisJCQkJcHJpbnRrKCIgIGNtZCAlcCBoYXMgc3RhdHVzICVkLCByZXF1ZXN0aW5nIHNlbnNlXG4iLAorCQkJCSAgICAgICBTQ3AsIGhvc3RkYXRhLT5zdGF0dXNbMF0pOworI2VuZGlmCisJCQkJLyogd2UgY2FuIGRlc3Ryb3kgdGhlIGNvbW1hbmQgaGVyZQorCQkJCSAqIGJlY2F1c2UgdGhlIGNvbnRpbmdlbnQgYWxsZWdpYW5jZQorCQkJCSAqIGNvbmRpdGlvbiB3aWxsIGNhdXNlIGEgcmV0cnkgd2hpY2gKKwkJCQkgKiB3aWxsIHJlLWNvcHkgdGhlIGNvbW1hbmQgZnJvbSB0aGUKKwkJCQkgKiBzYXZlZCBkYXRhX2NtbmQuICBXZSBhbHNvIHVubWFwIGFueQorCQkJCSAqIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21tYW5kCisJCQkJICogaGVyZSAqLworCQkJCU5DUl83MDBfdW5tYXAoaG9zdGRhdGEsIFNDcCwgc2xvdCk7CisKKwkJCQlTQ3AtPmNtbmRbMF0gPSBSRVFVRVNUX1NFTlNFOworCQkJCVNDcC0+Y21uZFsxXSA9IChTQ3AtPmRldmljZS0+bHVuICYgMHg3KSA8PCA1OworCQkJCVNDcC0+Y21uZFsyXSA9IDA7CisJCQkJU0NwLT5jbW5kWzNdID0gMDsKKwkJCQlTQ3AtPmNtbmRbNF0gPSBzaXplb2YoU0NwLT5zZW5zZV9idWZmZXIpOworCQkJCVNDcC0+Y21uZFs1XSA9IDA7CisJCQkJU0NwLT5jbWRfbGVuID0gNjsKKwkJCQkvKiBIZXJlJ3MgYSBxdWlldCBoYWNrOiB0aGUKKwkJCQkgKiBSRVFVRVNUX1NFTlNFIGNvbW1hbmQgaXMgc2l4IGJ5dGVzLAorCQkJCSAqIHNvIHN0b3JlIGEgZmxhZyBpbmRpY2F0aW5nIHRoYXQKKwkJCQkgKiB0aGlzIHdhcyBhbiBpbnRlcm5hbCBzZW5zZSByZXF1ZXN0CisJCQkJICogYW5kIHRoZSBvcmlnaW5hbCBzdGF0dXMgYXQgdGhlIGVuZAorCQkJCSAqIG9mIHRoZSBjb21tYW5kICovCisJCQkJU0NwLT5jbW5kWzZdID0gTkNSXzcwMF9JTlRFUk5BTF9TRU5TRV9NQUdJQzsKKwkJCQlTQ3AtPmNtbmRbN10gPSBob3N0ZGF0YS0+c3RhdHVzWzBdOworCQkJCVNDcC0+dXNlX3NnID0gMDsKKwkJCQlTQ3AtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCQkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGhvc3RkYXRhLT5kZXYsIHNsb3QtPnBDbWQsCisJCQkJCQkJICAgU0NwLT5jbWRfbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJCQlTQ3AtPnJlcXVlc3RfYnVmZmxlbiA9IHNpemVvZihTQ3AtPnNlbnNlX2J1ZmZlcik7CisJCQkJc2xvdC0+ZG1hX2hhbmRsZSA9IGRtYV9tYXBfc2luZ2xlKGhvc3RkYXRhLT5kZXYsIFNDcC0+c2Vuc2VfYnVmZmVyLCBzaXplb2YoU0NwLT5zZW5zZV9idWZmZXIpLCBETUFfRlJPTV9ERVZJQ0UpOworCQkJCXNsb3QtPlNHWzBdLmlucyA9IGJTX3RvX2hvc3QoU0NSSVBUX01PVkVfREFUQV9JTiB8IHNpemVvZihTQ3AtPnNlbnNlX2J1ZmZlcikpOworCQkJCXNsb3QtPlNHWzBdLnBBZGRyID0gYlNfdG9faG9zdChzbG90LT5kbWFfaGFuZGxlKTsKKwkJCQlzbG90LT5TR1sxXS5pbnMgPSBiU190b19ob3N0KFNDUklQVF9SRVRVUk4pOworCQkJCXNsb3QtPlNHWzFdLnBBZGRyID0gMDsKKwkJCQlzbG90LT5yZXN1bWVfb2Zmc2V0ID0gaG9zdGRhdGEtPnBTY3JpcHQ7CisJCQkJZG1hX2NhY2hlX3N5bmMoc2xvdC0+U0csIHNpemVvZihzbG90LT5TR1swXSkqMiwgRE1BX1RPX0RFVklDRSk7CisJCQkJZG1hX2NhY2hlX3N5bmMoU0NwLT5zZW5zZV9idWZmZXIsIHNpemVvZihTQ3AtPnNlbnNlX2J1ZmZlciksIERNQV9GUk9NX0RFVklDRSk7CisJCQkJCisJCQkJLyogcXVldWUgdGhlIGNvbW1hbmQgZm9yIHJlaXNzdWUgKi8KKwkJCQlzbG90LT5zdGF0ZSA9IE5DUl83MDBfU0xPVF9RVUVVRUQ7CisJCQkJaG9zdGRhdGEtPnN0YXRlID0gTkNSXzcwMF9IT1NUX0ZSRUU7CisJCQkJaG9zdGRhdGEtPmNtZCA9IE5VTEw7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBDdXJyZW50bHkgcmVseSBvbiB0aGUgbWlkIGxheWVyIGV2YWx1YXRpb24KKwkJCS8vIG9mIHRoZSB0YWcgcXVldWluZyBjYXBhYmlsaXR5CisJCQkvLworCQkJLy9pZihzdGF0dXNfYnl0ZShob3N0ZGF0YS0+c3RhdHVzWzBdKSA9PSBHT09EICYmCisJCQkvLyAgIFNDcC0+Y21uZFswXSA9PSBJTlFVSVJZICYmIFNDcC0+dXNlX3NnID09IDApIHsKKwkJCS8vCS8qIFBpZ2d5IGJhY2sgdGhlIHRhZyBxdWV1ZWluZyBzdXBwb3J0CisJCQkvLwkgKiBvbiB0aGlzIGNvbW1hbmQgKi8KKwkJCS8vCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGhvc3RkYXRhLT5kZXYsCisJCQkvLwkJCSAgICBzbG90LT5kbWFfaGFuZGxlLAorCQkJLy8JCQkgICAgU0NwLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkvLwkJCSAgICBETUFfRlJPTV9ERVZJQ0UpOworCQkJLy8JaWYoKChjaGFyICopU0NwLT5yZXF1ZXN0X2J1ZmZlcilbN10gJiAweDAyKSB7CisJCQkvLwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSVkOiAoJWQ6JWQpIEVuYWJsaW5nIFRhZyBDb21tYW5kIFF1ZXVpbmdcbiIsIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuKTsKKwkJCS8vCQlob3N0ZGF0YS0+dGFnX25lZ290aWF0ZWQgfD0gKDE8PFNDcC0+ZGV2aWNlLT5pZCk7CisJCQkvLwkJTkNSXzcwMF9zZXRfZmxhZyhTQ3AtPmRldmljZSwgTkNSXzcwMF9ERVZfQkVHSU5fVEFHX1FVRVVFSU5HKTsKKwkJCS8vCX0gZWxzZSB7CisJCQkvLwkJTkNSXzcwMF9jbGVhcl9mbGFnKFNDcC0+ZGV2aWNlLCBOQ1JfNzAwX0RFVl9CRUdJTl9UQUdfUVVFVUVJTkcpOworCQkJLy8JCWhvc3RkYXRhLT50YWdfbmVnb3RpYXRlZCAmPSB+KDE8PFNDcC0+ZGV2aWNlLT5pZCk7CisJCQkvLwl9CisJCQkvL30KKwkJCU5DUl83MDBfc2NzaV9kb25lKGhvc3RkYXRhLCBTQ3AsIGhvc3RkYXRhLT5zdGF0dXNbMF0pOworCQl9CisJfSBlbHNlIGlmKChkc3BzICYgMHhmZmZmZjBmMCkgPT0gQV9VTkVYUEVDVEVEX1BIQVNFKSB7CisJCV9fdTggaSA9IChkc3BzICYgMHhmMDApID4+IDg7CisKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6ICglZDolZCksIFVORVhQRUNURUQgUEhBU0UgJXMgKCVzKVxuIiwKKwkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuLAorCQkgICAgICAgTkNSXzcwMF9waGFzZVtpXSwKKwkJICAgICAgIHNiY2xfdG9fc3RyaW5nKE5DUl83MDBfcmVhZGIoaG9zdCwgU0JDTF9SRUcpKSk7CisJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgbGVuID0gJWQsIGNtZCA9IiwgU0NwLT5jbWRfbGVuKTsKKwkJc2NzaV9wcmludF9jb21tYW5kKFNDcCk7CisKKwkJTkNSXzcwMF9pbnRlcm5hbF9idXNfcmVzZXQoaG9zdCk7CisJfSBlbHNlIGlmKChkc3BzICYgMHhmZmZmZjAwMCkgPT0gQV9GQVRBTCkgeworCQlpbnQgaSA9IChkc3BzICYgMHhmZmYpOworCisJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkOiAoJWQ6JWQpIEZBVEFMIEVSUk9SOiAlc1xuIiwKKwkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuLCBOQ1JfNzAwX2ZhdGFsX21lc3NhZ2VzW2ldKTsKKwkJaWYoZHNwcyA9PSBBX0ZBVEFMX0lMTEVHQUxfTVNHX0xFTkdUSCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIgICAgIG1zZyBiZWdpbnMgJTAyeCAlMDJ4XG4iLAorCQkJICAgICAgIGhvc3RkYXRhLT5tc2dpblswXSwgaG9zdGRhdGEtPm1zZ2luWzFdKTsKKwkJfQorCQlOQ1JfNzAwX2ludGVybmFsX2J1c19yZXNldChob3N0KTsKKwl9IGVsc2UgaWYoKGRzcHMgJiAweGZmZmZmMGYwKSA9PSBBX0RJU0NPTk5FQ1QpIHsKKyNpZmRlZiBOQ1JfNzAwX0RFQlVHCisJCV9fdTggaSA9IChkc3BzICYgMHhmMDApID4+IDg7CisKKwkJcHJpbnRrKCJzY3NpJWQ6ICglZDolZCksIERJU0NPTk5FQ1RFRCAoJWQpICVzXG4iLAorCQkgICAgICAgaG9zdC0+aG9zdF9ubywgcHVuLCBsdW4sCisJCSAgICAgICBpLCBOQ1JfNzAwX3BoYXNlW2ldKTsKKyNlbmRpZgorCQlzYXZlX2Zvcl9yZXNlbGVjdGlvbihob3N0ZGF0YSwgU0NwLCBkc3ApOworCisJfSBlbHNlIGlmKGRzcHMgPT0gQV9SRVNFTEVDVElPTl9JREVOVElGSUVEKSB7CisJCV9fdTggbHVuOworCQlzdHJ1Y3QgTkNSXzcwMF9jb21tYW5kX3Nsb3QgKnNsb3Q7CisJCV9fdTggcmVzZWxlY3Rpb25faWQgPSBob3N0ZGF0YS0+cmVzZWxlY3Rpb25faWQ7CisJCXN0cnVjdCBzY3NpX2RldmljZSAqU0RwOworCisJCWx1biA9IGhvc3RkYXRhLT5tc2dpblswXSAmIDB4MWY7CisKKwkJaG9zdGRhdGEtPnJlc2VsZWN0aW9uX2lkID0gMHhmZjsKKwkJREVCVUcoKCJzY3NpJWQ6ICglZDolZCkgUkVTRUxFQ1RFRCFcbiIsCisJCSAgICAgICBob3N0LT5ob3N0X25vLCByZXNlbGVjdGlvbl9pZCwgbHVuKSk7CisJCS8qIGNsZWFyIHRoZSByZXNlbGVjdGlvbiBpbmRpY2F0b3IgKi8KKwkJU0RwID0gX19zY3NpX2RldmljZV9sb29rdXAoaG9zdCwgMCwgcmVzZWxlY3Rpb25faWQsIGx1bik7CisJCWlmKHVubGlrZWx5KFNEcCA9PSBOVUxMKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6ICglZDolZCkgSEFTIE5PIGRldmljZVxuIiwKKwkJCSAgICAgICBob3N0LT5ob3N0X25vLCByZXNlbGVjdGlvbl9pZCwgbHVuKTsKKwkJCUJVRygpOworCQl9CisJCWlmKGhvc3RkYXRhLT5tc2dpblsxXSA9PSBBX1NJTVBMRV9UQUdfTVNHKSB7CisJCQlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3AgPSBzY3NpX2ZpbmRfdGFnKFNEcCwgaG9zdGRhdGEtPm1zZ2luWzJdKTsKKwkJCWlmKHVubGlrZWx5KFNDcCA9PSBOVUxMKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkOiAoJWQ6JWQpIG5vIHNhdmVkIHJlcXVlc3QgZm9yIHRhZyAlZFxuIiwgCisJCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHJlc2VsZWN0aW9uX2lkLCBsdW4sIGhvc3RkYXRhLT5tc2dpblsyXSk7CisJCQkJQlVHKCk7CisJCQl9CisKKwkJCXNsb3QgPSAoc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICopU0NwLT5ob3N0X3NjcmliYmxlOworCQkJREVCVUcoKCI1M2M3MDA6ICVkOiVkOiVkLCByZXNlbGVjdGlvbiBpcyB0YWcgJWQsIHNsb3QgJXAoJWQpXG4iLAorCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIFNEcC0+aWQsIFNEcC0+bHVuLAorCQkJICAgICAgIGhvc3RkYXRhLT5tc2dpblsyXSwgc2xvdCwgc2xvdC0+dGFnKSk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3AgPSBzY3NpX2ZpbmRfdGFnKFNEcCwgU0NTSV9OT19UQUcpOworCQkJaWYodW5saWtlbHkoU0NwID09IE5VTEwpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6ICglZDolZCkgbm8gc2F2ZWQgcmVxdWVzdCBmb3IgdW50YWdnZWQgY21kXG4iLCAKKwkJCQkgICAgICAgaG9zdC0+aG9zdF9ubywgcmVzZWxlY3Rpb25faWQsIGx1bik7CisJCQkJQlVHKCk7CisJCQl9CisJCQlzbG90ID0gKHN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqKVNDcC0+aG9zdF9zY3JpYmJsZTsKKwkJfQorCisJCWlmKHNsb3QgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6ICglZDolZCkgUkVTRUxFQ1RFRCBidXQgbm8gc2F2ZWQgY29tbWFuZCAoTVNHID0gJTAyeCAlMDJ4ICUwMngpISFcbiIsCisJCQkgICAgICAgaG9zdC0+aG9zdF9ubywgcmVzZWxlY3Rpb25faWQsIGx1biwKKwkJCSAgICAgICBob3N0ZGF0YS0+bXNnaW5bMF0sIGhvc3RkYXRhLT5tc2dpblsxXSwKKwkJCSAgICAgICBob3N0ZGF0YS0+bXNnaW5bMl0pOworCQl9IGVsc2UgeworCQkJaWYoaG9zdGRhdGEtPnN0YXRlICE9IE5DUl83MDBfSE9TVF9CVVNZKQorCQkJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkOiBGQVRBTCwgaG9zdCBub3QgYnVzeSBkdXJpbmcgdmFsaWQgcmVzZWxlY3Rpb24hXG4iLAorCQkJCSAgICAgICBob3N0LT5ob3N0X25vKTsKKwkJCXJlc3VtZV9vZmZzZXQgPSBzbG90LT5yZXN1bWVfb2Zmc2V0OworCQkJaG9zdGRhdGEtPmNtZCA9IHNsb3QtPmNtbmQ7CisKKwkJCS8qIHJlLXBhdGNoIGZvciB0aGlzIGNvbW1hbmQgKi8KKwkJCXNjcmlwdF9wYXRjaF8zMl9hYnMoaG9zdGRhdGEtPnNjcmlwdCwgQ29tbWFuZEFkZHJlc3MsIAorCQkJCQkgICAgc2xvdC0+cENtZCk7CisJCQlzY3JpcHRfcGF0Y2hfMTYoaG9zdGRhdGEtPnNjcmlwdCwKKwkJCQkJQ29tbWFuZENvdW50LCBzbG90LT5jbW5kLT5jbWRfbGVuKTsKKwkJCXNjcmlwdF9wYXRjaF8zMl9hYnMoaG9zdGRhdGEtPnNjcmlwdCwgU0dTY3JpcHRTdGFydEFkZHJlc3MsCisJCQkJCSAgICB0bzMyYml0KCZzbG90LT5wU0dbMF0uaW5zKSk7CisKKwkJCS8qIE5vdGU6IHNldHRpbmcgU1hGRVIgb25seSB3b3JrcyBpZiB3ZSdyZQorCQkJICogc3RpbGwgaW4gdGhlIE1FU1NBR0UgcGhhc2UsIHNvIGl0IGlzIHZpdGFsCisJCQkgKiB0aGF0IEFDSyBpcyBzdGlsbCBhc3NlcnRlZCB3aGVuIHdlIHByb2Nlc3MKKwkJCSAqIHRoZSByZXNlbGVjdGlvbiBtZXNzYWdlLiAgVGhlIHJlc3VtZSBvZmZzZXQKKwkJCSAqIHNob3VsZCB0aGVyZWZvcmUgYWx3YXlzIGNsZWFyIEFDSyAqLworCQkJTkNSXzcwMF93cml0ZWIoTkNSXzcwMF9nZXRfU1hGRVIoaG9zdGRhdGEtPmNtZC0+ZGV2aWNlKSwKKwkJCQkgICAgICAgaG9zdCwgU1hGRVJfUkVHKTsKKwkJCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5tc2dpbiwKKwkJCQkgICAgICAgTVNHX0FSUkFZX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCQlkbWFfY2FjaGVfc3luYyhob3N0ZGF0YS0+bXNnb3V0LAorCQkJCSAgICAgICBNU0dfQVJSQVlfU0laRSwgRE1BX1RPX0RFVklDRSk7CisJCQkvKiBJJ20ganVzdCBiZWluZyBwYXJhbm9pZCBoZXJlLCB0aGUgY29tbWFuZCBzaG91bGQKKwkJCSAqIGFscmVhZHkgaGF2ZSBiZWVuIGZsdXNoZWQgZnJvbSB0aGUgY2FjaGUgKi8KKwkJCWRtYV9jYWNoZV9zeW5jKHNsb3QtPmNtbmQtPmNtbmQsCisJCQkJICAgICAgIHNsb3QtPmNtbmQtPmNtZF9sZW4sIERNQV9UT19ERVZJQ0UpOworCisKKwkJCQorCQl9CisJfSBlbHNlIGlmKGRzcHMgPT0gQV9SRVNFTEVDVEVEX0RVUklOR19TRUxFQ1RJT04pIHsKKworCQkvKiBUaGlzIHNlY3Rpb24gaXMgZnVsbCBvZiBkZWJ1Z2dpbmcgY29kZSBiZWNhdXNlIEkndmUKKwkJICogbmV2ZXIgbWFuYWdlZCB0byByZWFjaCBpdC4gIEkgdGhpbmsgd2hhdCBoYXBwZW5zIGlzCisJCSAqIHRoYXQsIGJlY2F1c2UgdGhlIDcwMCBydW5zIHdpdGggc2VsZWN0aW9uCisJCSAqIGludGVycnVwdHMgZW5hYmxlZCB0aGUgd2hvbGUgdGltZSB0aGF0IHdlIHRha2UgYQorCQkgKiBzZWxlY3Rpb24gaW50ZXJydXB0IGJlZm9yZSB3ZSBtYW5hZ2UgdG8gZ2V0IHRvIHRoZQorCQkgKiByZXNlbGVjdGVkIHNjcmlwdCBpbnRlcnJ1cHQgKi8KKworCQlfX3U4IHJlc2VsZWN0aW9uX2lkID0gTkNSXzcwMF9yZWFkYihob3N0LCBTRkJSX1JFRyk7CisJCXN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqc2xvdDsKKwkJCisJCS8qIFRha2Ugb3V0IG91ciBvd24gSUQgKi8KKwkJcmVzZWxlY3Rpb25faWQgJj0gfigxPDxob3N0LT50aGlzX2lkKTsKKwkJCisJCS8qIEkndmUgbmV2ZXIgc2VlbiB0aGlzIGhhcHBlbiwgc28ga2VlcCB0aGlzIGFzIGEgcHJpbnRrIHJhdGhlcgorCQkgKiB0aGFuIGEgZGVidWcgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSVkOiAoJWQ6JWQpIFJFU0VMRUNUSU9OIERVUklORyBTRUxFQ1RJT04sIGRzcD0lMDh4WyUwNHhdIHN0YXRlPSVkLCBjb3VudD0lZFxuIiwKKwkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHJlc2VsZWN0aW9uX2lkLCBsdW4sIGRzcCwgZHNwIC0gaG9zdGRhdGEtPnBTY3JpcHQsIGhvc3RkYXRhLT5zdGF0ZSwgaG9zdGRhdGEtPmNvbW1hbmRfc2xvdF9jb3VudCk7CisKKwkJeworCQkJLyogRklYTUU6IERFQlVHR0lORyBDT0RFICovCisJCQlfX3UzMiBTRyA9IChfX3UzMiliU190b19jcHUoaG9zdGRhdGEtPnNjcmlwdFtBX1NHU2NyaXB0U3RhcnRBZGRyZXNzX3VzZWRbMF1dKTsKKwkJCWludCBpOworCisJCQlmb3IoaT0wOyBpPCBOQ1JfNzAwX0NPTU1BTkRfU0xPVFNfUEVSX0hPU1Q7IGkrKykgeworCQkJCWlmKFNHID49IHRvMzJiaXQoJmhvc3RkYXRhLT5zbG90c1tpXS5wU0dbMF0pCisJCQkJICAgJiYgU0cgPD0gdG8zMmJpdCgmaG9zdGRhdGEtPnNsb3RzW2ldLnBTR1tOQ1JfNzAwX1NHX1NFR01FTlRTXSkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiSURFTlRJRklFRCBTRyBzZWdtZW50IGFzIGJlaW5nICUwOHggaW4gc2xvdCAlcCwgY21kICVwLCBzbG90LT5yZXN1bWVfb2Zmc2V0PSUwOHhcbiIsIFNHLCAmaG9zdGRhdGEtPnNsb3RzW2ldLCBob3N0ZGF0YS0+c2xvdHNbaV0uY21uZCwgaG9zdGRhdGEtPnNsb3RzW2ldLnJlc3VtZV9vZmZzZXQpOworCQkJU0NwID0gIGhvc3RkYXRhLT5zbG90c1tpXS5jbW5kOworCQl9CisKKwkJaWYoU0NwICE9IE5VTEwpIHsKKwkJCXNsb3QgPSAoc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICopU0NwLT5ob3N0X3NjcmliYmxlOworCQkJLyogY2hhbmdlIHNsb3QgZnJvbSBidXN5IHRvIHF1ZXVlZCB0byByZWRvIGNvbW1hbmQgKi8KKwkJCXNsb3QtPnN0YXRlID0gTkNSXzcwMF9TTE9UX1FVRVVFRDsKKwkJfQorCQlob3N0ZGF0YS0+Y21kID0gTlVMTDsKKwkJCisJCWlmKHJlc2VsZWN0aW9uX2lkID09IDApIHsKKwkJCWlmKGhvc3RkYXRhLT5yZXNlbGVjdGlvbl9pZCA9PSAweGZmKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6IEludmFsaWQgcmVzZWxlY3Rpb24gZHVyaW5nIHNlbGVjdGlvbiEhXG4iLCBob3N0LT5ob3N0X25vKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6IHNjcmlwdCByZXNlbGVjdGVkIGFuZCB3ZSB0b29rIGEgc2VsZWN0aW9uIGludGVycnVwdFxuIiwKKwkJCQkgICAgICAgaG9zdC0+aG9zdF9ubyk7CisJCQkJcmVzZWxlY3Rpb25faWQgPSBob3N0ZGF0YS0+cmVzZWxlY3Rpb25faWQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQkKKwkJCS8qIGNvbnZlcnQgdG8gcmVhbCBJRCAqLworCQkJcmVzZWxlY3Rpb25faWQgPSBiaXRtYXBfdG9fbnVtYmVyKHJlc2VsZWN0aW9uX2lkKTsKKwkJfQorCQlob3N0ZGF0YS0+cmVzZWxlY3Rpb25faWQgPSByZXNlbGVjdGlvbl9pZDsKKwkJLyoganVzdCBpbiBjYXNlIHdlIGhhdmUgYSBzdGFsZSBzaW1wbGUgdGFnIG1lc3NhZ2UsIGNsZWFyIGl0ICovCisJCWhvc3RkYXRhLT5tc2dpblsxXSA9IDA7CisJCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5tc2dpbiwKKwkJCSAgICAgICBNU0dfQVJSQVlfU0laRSwgRE1BX0JJRElSRUNUSU9OQUwpOworCQlpZihob3N0ZGF0YS0+dGFnX25lZ290aWF0ZWQgJiAoMTw8cmVzZWxlY3Rpb25faWQpKSB7CisJCQlyZXN1bWVfb2Zmc2V0ID0gaG9zdGRhdGEtPnBTY3JpcHQgKyBFbnRfR2V0UmVzZWxlY3Rpb25XaXRoVGFnOworCQl9IGVsc2UgeworCQkJcmVzdW1lX29mZnNldCA9IGhvc3RkYXRhLT5wU2NyaXB0ICsgRW50X0dldFJlc2VsZWN0aW9uRGF0YTsKKwkJfQorCX0gZWxzZSBpZihkc3BzID09IEFfQ09NUExFVEVEX1NFTEVDVElPTl9BU19UQVJHRVQpIHsKKwkJLyogd2UndmUganVzdCBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgYnVzLCBkbyBub3RoaW5nIHNpbmNlCisJCSAqIGEgcmV0dXJuIGhlcmUgd2lsbCByZS1ydW4gdGhlIHF1ZXVlZCBjb21tYW5kIHNsb3QKKwkJICogdGhhdCBtYXkgaGF2ZSBiZWVuIGludGVycnVwdGVkIGJ5IHRoZSBpbml0aWFsIHNlbGVjdGlvbiAqLworCQlERUJVRygoIiBTRUxFQ1RJT04gQ09NUExFVEVEXG4iKSk7CisJfSBlbHNlIGlmKChkc3BzICYgMHhmZmZmZjBmMCkgPT0gQV9NU0dfSU4pIHsgCisJCXJlc3VtZV9vZmZzZXQgPSBwcm9jZXNzX21lc3NhZ2UoaG9zdCwgaG9zdGRhdGEsIFNDcCwKKwkJCQkJCWRzcCwgZHNwcyk7CisJfSBlbHNlIGlmKChkc3BzICYgIDB4ZmZmZmYwMDApID09IDApIHsKKwkJX191OCBpID0gKGRzcHMgJiAweGYwKSA+PiA0LCBqID0gKGRzcHMgJiAweGYwMCkgPj4gODsKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6ICglZDolZCksIHVuaGFuZGxlZCBzY3JpcHQgY29uZGl0aW9uICVzICVzIGF0ICUwNHhcbiIsCisJCSAgICAgICBob3N0LT5ob3N0X25vLCBwdW4sIGx1biwgTkNSXzcwMF9jb25kaXRpb25baV0sCisJCSAgICAgICBOQ1JfNzAwX3BoYXNlW2pdLCBkc3AgLSBob3N0ZGF0YS0+cFNjcmlwdCk7CisJCWlmKFNDcCAhPSBOVUxMKSB7CisJCQlzY3NpX3ByaW50X2NvbW1hbmQoU0NwKTsKKworCQkJaWYoU0NwLT51c2Vfc2cpIHsKKwkJCQlmb3IoaSA9IDA7IGkgPCBTQ3AtPnVzZV9zZyArIDE7IGkrKykgeworCQkJCQlwcmludGsoS0VSTl9JTkZPICIgU0dbJWRdLmxlbmd0aCA9ICVkLCBtb3ZlX2luc249JTA4eCwgYWRkciAlMDh4XG4iLCBpLCAoKHN0cnVjdCBzY2F0dGVybGlzdCAqKVNDcC0+YnVmZmVyKVtpXS5sZW5ndGgsICgoc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICopU0NwLT5ob3N0X3NjcmliYmxlKS0+U0dbaV0uaW5zLCAoKHN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqKVNDcC0+aG9zdF9zY3JpYmJsZSktPlNHW2ldLnBBZGRyKTsKKwkJCQl9CisJCQl9CisJCX0JICAgICAgIAorCQlOQ1JfNzAwX2ludGVybmFsX2J1c19yZXNldChob3N0KTsKKwl9IGVsc2UgaWYoKGRzcHMgJiAweGZmZmZmMDAwKSA9PSBBX0RFQlVHX0lOVEVSUlVQVCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgInNjc2klZCAoJWQ6JWQpIERFQlVHIElOVEVSUlVQVCAlZCBBVCAlMDh4WyUwNHhdLCBjb250aW51aW5nXG4iLAorCQkgICAgICAgaG9zdC0+aG9zdF9ubywgcHVuLCBsdW4sIGRzcHMgJiAweGZmZiwgZHNwLCBkc3AgLSBob3N0ZGF0YS0+cFNjcmlwdCk7CisJCXJlc3VtZV9vZmZzZXQgPSBkc3A7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6ICglZDolZCksIHVuaWRlbnRpZmllZCBzY3JpcHQgaW50ZXJydXB0IDB4JXggYXQgJTA0eFxuIiwKKwkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuLCBkc3BzLCBkc3AgLSBob3N0ZGF0YS0+cFNjcmlwdCk7CisJCU5DUl83MDBfaW50ZXJuYWxfYnVzX3Jlc2V0KGhvc3QpOworCX0KKwlyZXR1cm4gcmVzdW1lX29mZnNldDsKK30KKworLyogV2UgcnVuIHRoZSA1M2M3MDAgd2l0aCBzZWxlY3Rpb24gaW50ZXJydXB0cyBhbHdheXMgZW5hYmxlZC4gIFRoaXMKKyAqIG1lYW5zIHRoYXQgdGhlIGNoaXAgbWF5IGJlIHNlbGVjdGVkIGFzIHNvb24gYXMgdGhlIGJ1cyBmcmVlcy4gIE9uIGEKKyAqIGJ1c3kgYnVzLCB0aGlzIGNhbiBiZSBiZWZvcmUgdGhlIHNjcmlwdHMgZW5naW5lIGZpbmlzaGVzIGl0cworICogcHJvY2Vzc2luZy4gIFRoZXJlZm9yZSwgcGFydCBvZiB0aGUgc2VsZWN0aW9uIHByb2Nlc3NpbmcgaGFzIHRvIGJlCisgKiB0byBmaW5kIG91dCB3aGF0IHRoZSBzY3JpcHRzIGVuZ2luZSBpcyBkb2luZyBhbmQgY29tcGxldGUgdGhlCisgKiBmdW5jdGlvbiBpZiBuZWNlc3NhcnkgKGkuZS4gcHJvY2VzcyB0aGUgcGVuZGluZyBkaXNjb25uZWN0IG9yIHNhdmUKKyAqIHRoZSBpbnRlcnJ1cHRlZCBpbml0aWFsIHNlbGVjdGlvbiAqLworU1RBVElDIGlubGluZSBfX3UzMgorcHJvY2Vzc19zZWxlY3Rpb24oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgX191MzIgZHNwKQoreworCV9fdTggaWQgPSAwOwkvKiBTcXVhc2ggY29tcGlsZXIgd2FybmluZyAqLworCWludCBjb3VudCA9IDA7CisJX191MzIgcmVzdW1lX29mZnNldCA9IDA7CisJc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSA9CisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3AgPSBob3N0ZGF0YS0+Y21kOworCV9fdTggc2JjbDsKKworCWZvcihjb3VudCA9IDA7IGNvdW50IDwgNTsgY291bnQrKykgeworCQlpZCA9IE5DUl83MDBfcmVhZGIoaG9zdCwgaG9zdGRhdGEtPmNoaXA3MTAgPworCQkJCSAgIENURVNUOV9SRUcgOiBTRkJSX1JFRyk7CisKKwkJLyogVGFrZSBvdXQgb3VyIG93biBJRCAqLworCQlpZCAmPSB+KDE8PGhvc3QtPnRoaXNfaWQpOworCQlpZihpZCAhPSAwKSAKKwkJCWJyZWFrOworCQl1ZGVsYXkoNSk7CisJfQorCXNiY2wgPSBOQ1JfNzAwX3JlYWRiKGhvc3QsIFNCQ0xfUkVHKTsKKwlpZigoc2JjbCAmIFNCQ0xfSU8pID09IDApIHsKKwkJLyogbWFyayBhcyBoYXZpbmcgYmVlbiBzZWxlY3RlZCByYXRoZXIgdGhhbiByZXNlbGVjdGVkICovCisJCWlkID0gMHhmZjsKKwl9IGVsc2UgeworCQkvKiBjb252ZXJ0IHRvIHJlYWwgSUQgKi8KKwkJaG9zdGRhdGEtPnJlc2VsZWN0aW9uX2lkID0gaWQgPSBiaXRtYXBfdG9fbnVtYmVyKGlkKTsKKwkJREVCVUcoKCJzY3NpJWQ6ICBSZXNlbGVjdGVkIGJ5ICVkXG4iLAorCQkgICAgICAgaG9zdC0+aG9zdF9ubywgaWQpKTsKKwl9CisJaWYoaG9zdGRhdGEtPnN0YXRlID09IE5DUl83MDBfSE9TVF9CVVNZICYmIFNDcCAhPSBOVUxMKSB7CisJCXN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqc2xvdCA9CisJCQkoc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICopU0NwLT5ob3N0X3NjcmliYmxlOworCQlERUJVRygoIiAgSUQgJWQgV0FSTklORzogUkVTRUxFQ1RJT04gT0YgQlVTWSBIT1NULCBzYXZpbmcgY21kICVwLCBzbG90ICVwLCBhZGRyICV4IFslMDR4XSwgcmVzdW1lICV4IVxuIiwgaWQsIGhvc3RkYXRhLT5jbWQsIHNsb3QsIGRzcCwgZHNwIC0gaG9zdGRhdGEtPnBTY3JpcHQsIHJlc3VtZV9vZmZzZXQpKTsKKwkJCisJCXN3aXRjaChkc3AgLSBob3N0ZGF0YS0+cFNjcmlwdCkgeworCQljYXNlIEVudF9EaXNjb25uZWN0MToKKwkJY2FzZSBFbnRfRGlzY29ubmVjdDI6CisJCQlzYXZlX2Zvcl9yZXNlbGVjdGlvbihob3N0ZGF0YSwgU0NwLCBFbnRfRGlzY29ubmVjdDIgKyBob3N0ZGF0YS0+cFNjcmlwdCk7CisJCQlicmVhazsKKwkJY2FzZSBFbnRfRGlzY29ubmVjdDM6CisJCWNhc2UgRW50X0Rpc2Nvbm5lY3Q0OgorCQkJc2F2ZV9mb3JfcmVzZWxlY3Rpb24oaG9zdGRhdGEsIFNDcCwgRW50X0Rpc2Nvbm5lY3Q0ICsgaG9zdGRhdGEtPnBTY3JpcHQpOworCQkJYnJlYWs7CisJCWNhc2UgRW50X0Rpc2Nvbm5lY3Q1OgorCQljYXNlIEVudF9EaXNjb25uZWN0NjoKKwkJCXNhdmVfZm9yX3Jlc2VsZWN0aW9uKGhvc3RkYXRhLCBTQ3AsIEVudF9EaXNjb25uZWN0NiArIGhvc3RkYXRhLT5wU2NyaXB0KTsKKwkJCWJyZWFrOworCQljYXNlIEVudF9EaXNjb25uZWN0NzoKKwkJY2FzZSBFbnRfRGlzY29ubmVjdDg6CisJCQlzYXZlX2Zvcl9yZXNlbGVjdGlvbihob3N0ZGF0YSwgU0NwLCBFbnRfRGlzY29ubmVjdDggKyBob3N0ZGF0YS0+cFNjcmlwdCk7CisJCQlicmVhazsKKwkJY2FzZSBFbnRfRmluaXNoMToKKwkJY2FzZSBFbnRfRmluaXNoMjoKKwkJCXByb2Nlc3Nfc2NyaXB0X2ludGVycnVwdChBX0dPT0RfU1RBVFVTX0FGVEVSX1NUQVRVUywgZHNwLCBTQ3AsIGhvc3QsIGhvc3RkYXRhKTsKKwkJCWJyZWFrOworCQkJCisJCWRlZmF1bHQ6CisJCQlzbG90LT5zdGF0ZSA9IE5DUl83MDBfU0xPVF9RVUVVRUQ7CisJCQlicmVhazsKKwkJCX0KKwl9CisJaG9zdGRhdGEtPnN0YXRlID0gTkNSXzcwMF9IT1NUX0JVU1k7CisJaG9zdGRhdGEtPmNtZCA9IE5VTEw7CisJLyogY2xlYXIgYW55IHN0YWxlIHNpbXBsZSB0YWcgbWVzc2FnZSAqLworCWhvc3RkYXRhLT5tc2dpblsxXSA9IDA7CisJZG1hX2NhY2hlX3N5bmMoaG9zdGRhdGEtPm1zZ2luLCBNU0dfQVJSQVlfU0laRSwKKwkJICAgICAgIERNQV9CSURJUkVDVElPTkFMKTsKKworCWlmKGlkID09IDB4ZmYpIHsKKwkJLyogU2VsZWN0ZWQgYXMgdGFyZ2V0LCBJZ25vcmUgKi8KKwkJcmVzdW1lX29mZnNldCA9IGhvc3RkYXRhLT5wU2NyaXB0ICsgRW50X1NlbGVjdGVkQXNUYXJnZXQ7CisJfSBlbHNlIGlmKGhvc3RkYXRhLT50YWdfbmVnb3RpYXRlZCAmICgxPDxpZCkpIHsKKwkJcmVzdW1lX29mZnNldCA9IGhvc3RkYXRhLT5wU2NyaXB0ICsgRW50X0dldFJlc2VsZWN0aW9uV2l0aFRhZzsKKwl9IGVsc2UgeworCQlyZXN1bWVfb2Zmc2V0ID0gaG9zdGRhdGEtPnBTY3JpcHQgKyBFbnRfR2V0UmVzZWxlY3Rpb25EYXRhOworCX0KKwlyZXR1cm4gcmVzdW1lX29mZnNldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitOQ1JfNzAwX2NsZWFyX2ZpZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkgeworCWNvbnN0IHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEKKwkJPSAoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICopaG9zdC0+aG9zdGRhdGFbMF07CisJaWYoaG9zdGRhdGEtPmNoaXA3MTApIHsKKwkJTkNSXzcwMF93cml0ZWIoQ0xSX0ZJRk9fNzEwLCBob3N0LCBDVEVTVDhfUkVHKTsKKwl9IGVsc2UgeworCQlOQ1JfNzAwX3dyaXRlYihDTFJfRklGTywgaG9zdCwgREZJRk9fUkVHKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorTkNSXzcwMF9mbHVzaF9maWZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKKwljb25zdCBzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhCisJCT0gKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqKWhvc3QtPmhvc3RkYXRhWzBdOworCWlmKGhvc3RkYXRhLT5jaGlwNzEwKSB7CisJCU5DUl83MDBfd3JpdGViKEZMVVNIX0RNQV9GSUZPXzcxMCwgaG9zdCwgQ1RFU1Q4X1JFRyk7CisJCXVkZWxheSgxMCk7CisJCU5DUl83MDBfd3JpdGViKDAsIGhvc3QsIENURVNUOF9SRUcpOworCX0gZWxzZSB7CisJCU5DUl83MDBfd3JpdGViKEZMVVNIX0RNQV9GSUZPLCBob3N0LCBERklGT19SRUcpOworCQl1ZGVsYXkoMTApOworCQlOQ1JfNzAwX3dyaXRlYigwLCBob3N0LCBERklGT19SRUcpOworCX0KK30KKworCisvKiBUaGUgcXVldWUgbG9jayB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgbXVzdCBiZSBoZWxkIG9uIGVudHJ5IHRvCisgKiB0aGlzIGZ1bmN0aW9uICovCitTVEFUSUMgaW50CitOQ1JfNzAwX3N0YXJ0X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqU0NwKQoreworCXN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqc2xvdCA9CisJCShzdHJ1Y3QgTkNSXzcwMF9jb21tYW5kX3Nsb3QgKilTQ3AtPmhvc3Rfc2NyaWJibGU7CisJc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSA9CisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilTQ3AtPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF07CisJX191MTYgY291bnQgPSAxOwkvKiBmb3IgSURFTlRJRlkgbWVzc2FnZSAqLworCQorCWlmKGhvc3RkYXRhLT5zdGF0ZSAhPSBOQ1JfNzAwX0hPU1RfRlJFRSkgeworCQkvKiBrZWVwIHRoaXMgaW5zaWRlIHRoZSBsb2NrIHRvIGNsb3NlIHRoZSByYWNlIHdpbmRvdyB3aGVyZQorCQkgKiB0aGUgcnVubmluZyBjb21tYW5kIGZpbmlzaGVzIG9uIGFub3RoZXIgQ1BVIHdoaWxlIHdlIGRvbid0CisJCSAqIGNoYW5nZSB0aGUgc3RhdGUgdG8gcXVldWVkIG9uIHRoaXMgb25lICovCisJCXNsb3QtPnN0YXRlID0gTkNSXzcwMF9TTE9UX1FVRVVFRDsKKworCQlERUJVRygoInNjc2klZDogaG9zdCBidXN5LCBxdWV1ZWluZyBjb21tYW5kICVwLCBzbG90ICVwXG4iLAorCQkgICAgICAgU0NwLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8sIHNsb3QtPmNtbmQsIHNsb3QpKTsKKwkJcmV0dXJuIDA7CisJfQorCWhvc3RkYXRhLT5zdGF0ZSA9IE5DUl83MDBfSE9TVF9CVVNZOworCWhvc3RkYXRhLT5jbWQgPSBTQ3A7CisJc2xvdC0+c3RhdGUgPSBOQ1JfNzAwX1NMT1RfQlVTWTsKKwkvKiBrZWVwIGludGVycnVwdHMgZGlzYWJsZWQgdW50aWwgd2UgaGF2ZSB0aGUgY29tbWFuZCBjb3JyZWN0bHkKKwkgKiBzZXQgdXAgc28gd2UgY2Fubm90IHRha2UgYSBzZWxlY3Rpb24gaW50ZXJydXB0ICovCisKKwlob3N0ZGF0YS0+bXNnb3V0WzBdID0gTkNSXzcwMF9pZGVudGlmeShTQ3AtPmNtbmRbMF0gIT0gUkVRVUVTVF9TRU5TRSwKKwkJCQkJICAgICAgIFNDcC0+ZGV2aWNlLT5sdW4pOworCS8qIGZvciBJTlFVSVJZIG9yIFJFUVVFU1RfU0VOU0UgY29tbWFuZHMsIHdlIGNhbm5vdCBiZSBzdXJlCisJICogaWYgdGhlIG5lZ290aWF0ZWQgdHJhbnNmZXIgcGFyYW1ldGVycyBzdGlsbCBob2xkLCBzbworCSAqIGFsd2F5cyByZW5lZ290aWF0ZSB0aGVtICovCisJaWYoU0NwLT5jbW5kWzBdID09IElOUVVJUlkgfHwgU0NwLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpIHsKKwkJTkNSXzcwMF9jbGVhcl9mbGFnKFNDcC0+ZGV2aWNlLCBOQ1JfNzAwX0RFVl9ORUdPVElBVEVEX1NZTkMpOworCX0KKworCS8qIFJFUVVFU1RfU0VOU0UgaXMgYXNraW5nIGZvciBjb250aW5nZW50IElfVF9MKF9RKSBzdGF0dXMuCisJICogSWYgYSBjb250aW5nZW50IGFsbGVnaWFuY2UgY29uZGl0aW9uIGV4aXN0cywgdGhlIGRldmljZQorCSAqIHdpbGwgcmVmdXNlIGFsbCB0YWdzLCBzbyBzZW5kIHRoZSByZXF1ZXN0IHNlbnNlIGFzIHVudGFnZ2VkCisJICogKi8KKwlpZigoaG9zdGRhdGEtPnRhZ19uZWdvdGlhdGVkICYgKDE8PFNDcC0+ZGV2aWNlLT5pZCkpCisJICAgJiYgKHNsb3QtPnRhZyAhPSBTQ1NJX05PX1RBRyAmJiBTQ3AtPmNtbmRbMF0gIT0gUkVRVUVTVF9TRU5TRSkpIHsKKwkJY291bnQgKz0gc2NzaV9wb3B1bGF0ZV90YWdfbXNnKFNDcCwgJmhvc3RkYXRhLT5tc2dvdXRbY291bnRdKTsKKwl9CisKKwlpZihob3N0ZGF0YS0+ZmFzdCAmJgorCSAgIE5DUl83MDBfaXNfZmxhZ19jbGVhcihTQ3AtPmRldmljZSwgTkNSXzcwMF9ERVZfTkVHT1RJQVRFRF9TWU5DKSkgeworCQltZW1jcHkoJmhvc3RkYXRhLT5tc2dvdXRbY291bnRdLCBOQ1JfNzAwX1NEVFJfbXNnLAorCQkgICAgICAgc2l6ZW9mKE5DUl83MDBfU0RUUl9tc2cpKTsKKwkJaG9zdGRhdGEtPm1zZ291dFtjb3VudCszXSA9IHNwaV9wZXJpb2QoU0NwLT5kZXZpY2UtPnNkZXZfdGFyZ2V0KTsKKwkJaG9zdGRhdGEtPm1zZ291dFtjb3VudCs0XSA9IHNwaV9vZmZzZXQoU0NwLT5kZXZpY2UtPnNkZXZfdGFyZ2V0KTsKKwkJY291bnQgKz0gc2l6ZW9mKE5DUl83MDBfU0RUUl9tc2cpOworCQlOQ1JfNzAwX3NldF9mbGFnKFNDcC0+ZGV2aWNlLCBOQ1JfNzAwX0RFVl9CRUdJTl9TWU5DX05FR09USUFUSU9OKTsKKwl9CisKKwlzY3JpcHRfcGF0Y2hfMTYoaG9zdGRhdGEtPnNjcmlwdCwgTWVzc2FnZUNvdW50LCBjb3VudCk7CisKKworCXNjcmlwdF9wYXRjaF9JRChob3N0ZGF0YS0+c2NyaXB0LAorCQkJRGV2aWNlX0lELCAxPDxTQ3AtPmRldmljZS0+aWQpOworCisJc2NyaXB0X3BhdGNoXzMyX2Ficyhob3N0ZGF0YS0+c2NyaXB0LCBDb21tYW5kQWRkcmVzcywgCisJCQkgICAgc2xvdC0+cENtZCk7CisJc2NyaXB0X3BhdGNoXzE2KGhvc3RkYXRhLT5zY3JpcHQsIENvbW1hbmRDb3VudCwgU0NwLT5jbWRfbGVuKTsKKwkvKiBmaW5hbGx5IHBsdW1iIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFNHIGxpc3QgaW50byB0aGUgc2NyaXB0CisJICogKi8KKwlzY3JpcHRfcGF0Y2hfMzJfYWJzKGhvc3RkYXRhLT5zY3JpcHQsIFNHU2NyaXB0U3RhcnRBZGRyZXNzLAorCQkJICAgIHRvMzJiaXQoJnNsb3QtPnBTR1swXS5pbnMpKTsKKwlOQ1JfNzAwX2NsZWFyX2ZpZm8oU0NwLT5kZXZpY2UtPmhvc3QpOworCisJaWYoc2xvdC0+cmVzdW1lX29mZnNldCA9PSAwKQorCQlzbG90LT5yZXN1bWVfb2Zmc2V0ID0gaG9zdGRhdGEtPnBTY3JpcHQ7CisJLyogbm93IHBlcmZvcm0gYWxsIHRoZSB3cml0ZWJhY2tzIGFuZCBpbnZhbGlkYXRlcyAqLworCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5tc2dvdXQsIGNvdW50LCBETUFfVE9fREVWSUNFKTsKKwlkbWFfY2FjaGVfc3luYyhob3N0ZGF0YS0+bXNnaW4sIE1TR19BUlJBWV9TSVpFLAorCQkgICAgICAgRE1BX0ZST01fREVWSUNFKTsKKwlkbWFfY2FjaGVfc3luYyhTQ3AtPmNtbmQsIFNDcC0+Y21kX2xlbiwgRE1BX1RPX0RFVklDRSk7CisJZG1hX2NhY2hlX3N5bmMoaG9zdGRhdGEtPnN0YXR1cywgMSwgRE1BX0ZST01fREVWSUNFKTsKKworCS8qIHNldCB0aGUgc3luY2hyb25vdXMgcGVyaW9kL29mZnNldCAqLworCU5DUl83MDBfd3JpdGViKE5DUl83MDBfZ2V0X1NYRkVSKFNDcC0+ZGV2aWNlKSwKKwkJICAgICAgIFNDcC0+ZGV2aWNlLT5ob3N0LCBTWEZFUl9SRUcpOworCU5DUl83MDBfd3JpdGVsKHNsb3QtPnRlbXAsIFNDcC0+ZGV2aWNlLT5ob3N0LCBURU1QX1JFRyk7CisJTkNSXzcwMF93cml0ZWwoc2xvdC0+cmVzdW1lX29mZnNldCwgU0NwLT5kZXZpY2UtPmhvc3QsIERTUF9SRUcpOworCisJcmV0dXJuIDE7Cit9CisKK2lycXJldHVybl90CitOQ1JfNzAwX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gKHN0cnVjdCBTY3NpX0hvc3QgKilkZXZfaWQ7CisJc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSA9CisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKwlfX3U4IGlzdGF0OworCV9fdTMyIHJlc3VtZV9vZmZzZXQgPSAwOworCV9fdTggcHVuID0gMHhmZiwgbHVuID0gMHhmZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBoYW5kbGVkID0gMDsKKworCS8qIFVzZSB0aGUgaG9zdCBsb2NrIHRvIHNlcmlhbGlzZSBhY2VzcyB0byB0aGUgNTNjNzAwCisJICogaGFyZHdhcmUuICBOb3RlOiBJbiBmdXR1cmUsIHdlIG1heSBuZWVkIHRvIHRha2UgdGhlIHF1ZXVlCisJICogbG9jayB0byBlbnRlciB0aGUgZG9uZSByb3V0aW5lcy4gIFdoZW4gdGhhdCBoYXBwZW5zLCB3ZQorCSAqIG5lZWQgdG8gZW5zdXJlIHRoYXQgZm9yIHRoaXMgZHJpdmVyLCB0aGUgaG9zdCBsb2NrIGFuZCB0aGUKKwkgKiBxdWV1ZSBsb2NrIHBvaW50IHRvIHRoZSBzYW1lIHRoaW5nLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWlmKChpc3RhdCA9IE5DUl83MDBfcmVhZGIoaG9zdCwgSVNUQVRfUkVHKSkKKwkgICAgICAmIChTQ1NJX0lOVF9QRU5ESU5HIHwgRE1BX0lOVF9QRU5ESU5HKSkgeworCQlfX3UzMiBkc3BzOworCQlfX3U4IHNzdGF0MCA9IDAsIGRzdGF0ID0gMDsKKwkJX191MzIgZHNwOworCQlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3AgPSBob3N0ZGF0YS0+Y21kOworCQllbnVtIE5DUl83MDBfSG9zdF9TdGF0ZSBzdGF0ZTsKKworCQloYW5kbGVkID0gMTsKKwkJc3RhdGUgPSBob3N0ZGF0YS0+c3RhdGU7CisJCVNDcCA9IGhvc3RkYXRhLT5jbWQ7CisKKwkJaWYoaXN0YXQgJiBTQ1NJX0lOVF9QRU5ESU5HKSB7CisJCQl1ZGVsYXkoMTApOworCisJCQlzc3RhdDAgPSBOQ1JfNzAwX3JlYWRiKGhvc3QsIFNTVEFUMF9SRUcpOworCQl9CisKKwkJaWYoaXN0YXQgJiBETUFfSU5UX1BFTkRJTkcpIHsKKwkJCXVkZWxheSgxMCk7CisKKwkJCWRzdGF0ID0gTkNSXzcwMF9yZWFkYihob3N0LCBEU1RBVF9SRUcpOworCQl9CisKKwkJZHNwcyA9IE5DUl83MDBfcmVhZGwoaG9zdCwgRFNQU19SRUcpOworCQlkc3AgPSBOQ1JfNzAwX3JlYWRsKGhvc3QsIERTUF9SRUcpOworCisJCURFQlVHKCgic2NzaSVkOiBpc3RhdCAlMDJ4IHNzdGF0MCAlMDJ4IGRzdGF0ICUwMnggZHNwICUwNHhbJTA4eF0gZHNwcyAweCV4XG4iLAorCQkgICAgICAgaG9zdC0+aG9zdF9ubywgaXN0YXQsIHNzdGF0MCwgZHN0YXQsCisJCSAgICAgICAoZHNwIC0gKF9fdTMyKShob3N0ZGF0YS0+cFNjcmlwdCkpLzQsCisJCSAgICAgICBkc3AsIGRzcHMpKTsKKworCQlpZihTQ3AgIT0gTlVMTCkgeworCQkJcHVuID0gU0NwLT5kZXZpY2UtPmlkOworCQkJbHVuID0gU0NwLT5kZXZpY2UtPmx1bjsKKwkJfQorCisJCWlmKHNzdGF0MCAmIFNDU0lfUkVTRVRfREVURUNURUQpIHsKKwkJCXN0cnVjdCBzY3NpX2RldmljZSAqU0RwOworCQkJaW50IGk7CisKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IE5DUl83MDBfSE9TVF9CVVNZOworCisJCQlwcmludGsoS0VSTl9FUlIgInNjc2klZDogQnVzIFJlc2V0IGRldGVjdGVkLCBleGVjdXRpbmcgY29tbWFuZCAlcCwgc2xvdCAlcCwgZHNwICUwOHhbJTA0eF1cbiIsCisJCQkgICAgICAgaG9zdC0+aG9zdF9ubywgU0NwLCBTQ3AgPT0gTlVMTCA/IE5VTEwgOiBTQ3AtPmhvc3Rfc2NyaWJibGUsIGRzcCwgZHNwIC0gaG9zdGRhdGEtPnBTY3JpcHQpOworCisJCQlzY3NpX3JlcG9ydF9idXNfcmVzZXQoaG9zdCwgMCk7CisKKwkJCS8qIGNsZWFyIGFsbCB0aGUgbmVnb3RpYXRlZCBwYXJhbWV0ZXJzICovCisJCQlfX3Nob3N0X2Zvcl9lYWNoX2RldmljZShTRHAsIGhvc3QpCisJCQkJU0RwLT5ob3N0ZGF0YSA9IE5VTEw7CisJCQkKKwkJCS8qIGNsZWFyIGFsbCB0aGUgc2xvdHMgYW5kIHRoZWlyIHBlbmRpbmcgY29tbWFuZHMgKi8KKwkJCWZvcihpID0gMDsgaSA8IE5DUl83MDBfQ09NTUFORF9TTE9UU19QRVJfSE9TVDsgaSsrKSB7CisJCQkJc3RydWN0IHNjc2lfY21uZCAqU0NwOworCQkJCXN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqc2xvdCA9CisJCQkJCSZob3N0ZGF0YS0+c2xvdHNbaV07CisKKwkJCQlpZihzbG90LT5zdGF0ZSA9PSBOQ1JfNzAwX1NMT1RfRlJFRSkKKwkJCQkJY29udGludWU7CisJCQkJCisJCQkJU0NwID0gc2xvdC0+Y21uZDsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiBmYWlsaW5nIGNvbW1hbmQgYmVjYXVzZSBvZiByZXNldCwgc2xvdCAlcCwgY21uZCAlcFxuIiwKKwkJCQkgICAgICAgc2xvdCwgU0NwKTsKKwkJCQlmcmVlX3Nsb3Qoc2xvdCwgaG9zdGRhdGEpOworCQkJCVNDcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJCQkJTkNSXzcwMF9zZXRfZGVwdGgoU0NwLT5kZXZpY2UsIDApOworCQkJCS8qIE5PVEU6IGRlYWRsb2NrIHBvdGVudGlhbCBoZXJlOiB3ZQorCQkJCSAqIHJlbHkgb24gbWlkLWxheWVyIGd1YXJhbnRlZXMgdGhhdAorCQkJCSAqIHNjc2lfZG9uZSB3b24ndCB0cnkgdG8gaXNzdWUgdGhlCisJCQkJICogY29tbWFuZCBhZ2FpbiBvdGhlcndpc2Ugd2UnbGwKKwkJCQkgKiBkZWFkbG9jayBvbiB0aGUKKwkJCQkgKiBob3N0ZGF0YS0+c3RhdGVfbG9jayAqLworCQkJCVNDcC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQkJCVNDcC0+c2NzaV9kb25lKFNDcCk7CisJCQl9CisJCQltZGVsYXkoMjUpOworCQkJTkNSXzcwMF9jaGlwX3NldHVwKGhvc3QpOworCisJCQlob3N0ZGF0YS0+c3RhdGUgPSBOQ1JfNzAwX0hPU1RfRlJFRTsKKwkJCWhvc3RkYXRhLT5jbWQgPSBOVUxMOworCQkJLyogc2lnbmFsIGJhY2sgaWYgdGhpcyB3YXMgYW4gZWggaW5kdWNlZCByZXNldCAqLworCQkJaWYoaG9zdGRhdGEtPmVoX2NvbXBsZXRlICE9IE5VTEwpCisJCQkJY29tcGxldGUoaG9zdGRhdGEtPmVoX2NvbXBsZXRlKTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfSBlbHNlIGlmKHNzdGF0MCAmIFNFTEVDVElPTl9USU1FT1VUKSB7CisJCQlERUJVRygoInNjc2klZDogKCVkOiVkKSBzZWxlY3Rpb24gdGltZW91dFxuIiwKKwkJCSAgICAgICBob3N0LT5ob3N0X25vLCBwdW4sIGx1bikpOworCQkJTkNSXzcwMF9zY3NpX2RvbmUoaG9zdGRhdGEsIFNDcCwgRElEX05PX0NPTk5FQ1Q8PDE2KTsKKwkJfSBlbHNlIGlmKHNzdGF0MCAmIFBIQVNFX01JU01BVENIKSB7CisJCQlzdHJ1Y3QgTkNSXzcwMF9jb21tYW5kX3Nsb3QgKnNsb3QgPSAoU0NwID09IE5VTEwpID8gTlVMTCA6CisJCQkJKHN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqKVNDcC0+aG9zdF9zY3JpYmJsZTsKKworCQkJaWYoZHNwID09IEVudF9TZW5kTWVzc2FnZSArIDggKyBob3N0ZGF0YS0+cFNjcmlwdCkgeworCQkJCS8qIEl0IHdhbnRzIHRvIHJlcGx5IHRvIHNvbWUgcGFydCBvZgorCQkJCSAqIG91ciBtZXNzYWdlICovCisjaWZkZWYgTkNSXzcwMF9ERUJVRworCQkJCV9fdTMyIHRlbXAgPSBOQ1JfNzAwX3JlYWRsKGhvc3QsIFRFTVBfUkVHKTsKKwkJCQlpbnQgY291bnQgPSAoaG9zdGRhdGEtPnNjcmlwdFtFbnRfU2VuZE1lc3NhZ2UvNF0gJiAweGZmZmZmZikgLSAoKE5DUl83MDBfcmVhZGwoaG9zdCwgREJDX1JFRykgJiAweGZmZmZmZikgKyBOQ1JfNzAwX2RhdGFfcmVzaWR1YWwoaG9zdCkpOworCQkJCXByaW50aygic2NzaSVkICglZDolZCkgUEhBU0UgTUlTTUFUQ0ggSU4gU0VORCBNRVNTQUdFICVkIHJlbWFpbiwgcmV0dXJuICVwWyUwNHhdLCBwaGFzZSAlc1xuIiwgaG9zdC0+aG9zdF9ubywgcHVuLCBsdW4sIGNvdW50LCAodm9pZCAqKXRlbXAsIHRlbXAgLSBob3N0ZGF0YS0+cFNjcmlwdCwgc2JjbF90b19zdHJpbmcoTkNSXzcwMF9yZWFkYihob3N0LCBTQkNMX1JFRykpKTsKKyNlbmRpZgorCQkJCXJlc3VtZV9vZmZzZXQgPSBob3N0ZGF0YS0+cFNjcmlwdCArIEVudF9TZW5kTWVzc2FnZVBoYXNlTWlzbWF0Y2g7CisJCQl9IGVsc2UgaWYoZHNwID49IHRvMzJiaXQoJnNsb3QtPnBTR1swXS5pbnMpICYmCisJCQkJICBkc3AgPD0gdG8zMmJpdCgmc2xvdC0+cFNHW05DUl83MDBfU0dfU0VHTUVOVFNdLmlucykpIHsKKwkJCQlpbnQgZGF0YV90cmFuc2ZlciA9IE5DUl83MDBfcmVhZGwoaG9zdCwgREJDX1JFRykgJiAweGZmZmZmZjsKKwkJCQlpbnQgU0djb3VudCA9IChkc3AgLSB0bzMyYml0KCZzbG90LT5wU0dbMF0uaW5zKSkvc2l6ZW9mKHN0cnVjdCBOQ1JfNzAwX1NHX0xpc3QpOworCQkJCWludCByZXNpZHVhbCA9IE5DUl83MDBfZGF0YV9yZXNpZHVhbChob3N0KTsKKwkJCQlpbnQgaTsKKyNpZmRlZiBOQ1JfNzAwX0RFQlVHCisJCQkJX191MzIgbmFkZHIgPSBOQ1JfNzAwX3JlYWRsKGhvc3QsIEROQURfUkVHKTsKKworCQkJCXByaW50aygic2NzaSVkOiAoJWQ6JWQpIEV4cGVjdGVkIHBoYXNlIG1pc21hdGNoIGluIHNsb3QtPlNHWyVkXSwgdHJhbnNmZXJyZWQgMHgleFxuIiwKKwkJCQkgICAgICAgaG9zdC0+aG9zdF9ubywgcHVuLCBsdW4sCisJCQkJICAgICAgIFNHY291bnQsIGRhdGFfdHJhbnNmZXIpOworCQkJCXNjc2lfcHJpbnRfY29tbWFuZChTQ3ApOworCQkJCWlmKHJlc2lkdWFsKSB7CisJCQkJCXByaW50aygic2NzaSVkOiAoJWQ6JWQpIEV4cGVjdGVkIHBoYXNlIG1pc21hdGNoIGluIHNsb3QtPlNHWyVkXSwgdHJhbnNmZXJyZWQgMHgleCwgcmVzaWR1YWwgJWRcbiIsCisJCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuLAorCQkJCSAgICAgICBTR2NvdW50LCBkYXRhX3RyYW5zZmVyLCByZXNpZHVhbCk7CisJCQkJfQorI2VuZGlmCisJCQkJZGF0YV90cmFuc2ZlciArPSByZXNpZHVhbDsKKworCQkJCWlmKGRhdGFfdHJhbnNmZXIgIT0gMCkgeworCQkJCQlpbnQgY291bnQ7IAorCQkJCQlfX3UzMiBwQWRkcjsKKworCQkJCQlTR2NvdW50LS07CisKKwkJCQkJY291bnQgPSAoYlNfdG9fY3B1KHNsb3QtPlNHW1NHY291bnRdLmlucykgJiAweDAwZmZmZmZmKTsKKwkJCQkJREVCVUcoKCJEQVRBIFRSQU5TRkVSIE1JU01BVENILCBjb3VudCA9ICVkLCB0cmFuc2ZlcnJlZCAlZFxuIiwgY291bnQsIGNvdW50LWRhdGFfdHJhbnNmZXIpKTsKKwkJCQkJc2xvdC0+U0dbU0djb3VudF0uaW5zICY9IGJTX3RvX2hvc3QoMHhmZjAwMDAwMCk7CisJCQkJCXNsb3QtPlNHW1NHY291bnRdLmlucyB8PSBiU190b19ob3N0KGRhdGFfdHJhbnNmZXIpOworCQkJCQlwQWRkciA9IGJTX3RvX2NwdShzbG90LT5TR1tTR2NvdW50XS5wQWRkcik7CisJCQkJCXBBZGRyICs9IChjb3VudCAtIGRhdGFfdHJhbnNmZXIpOworI2lmZGVmIE5DUl83MDBfREVCVUcKKwkJCQkJaWYocEFkZHIgIT0gbmFkZHIpIHsKKwkJCQkJCXByaW50aygic2NzaSVkICglZDolZCkgdHJhbnNmZXIgbWlzbWF0Y2ggcEFkZHI9JWx4LCBuYWRkcj0lbHgsIGRhdGFfdHJhbnNmZXI9JWQsIHJlc2lkdWFsPSVkXG4iLCBob3N0LT5ob3N0X25vLCBwdW4sIGx1biwgKHVuc2lnbmVkIGxvbmcpcEFkZHIsICh1bnNpZ25lZCBsb25nKW5hZGRyLCBkYXRhX3RyYW5zZmVyLCByZXNpZHVhbCk7CisJCQkJCX0KKyNlbmRpZgorCQkJCQlzbG90LT5TR1tTR2NvdW50XS5wQWRkciA9IGJTX3RvX2hvc3QocEFkZHIpOworCQkJCX0KKwkJCQkvKiBzZXQgdGhlIGV4ZWN1dGVkIG1vdmVzIHRvIG5vcHMgKi8KKwkJCQlmb3IoaT0wOyBpPFNHY291bnQ7IGkrKykgeworCQkJCQlzbG90LT5TR1tpXS5pbnMgPSBiU190b19ob3N0KFNDUklQVF9OT1ApOworCQkJCQlzbG90LT5TR1tpXS5wQWRkciA9IDA7CisJCQkJfQorCQkJCWRtYV9jYWNoZV9zeW5jKHNsb3QtPlNHLCBzaXplb2Yoc2xvdC0+U0cpLCBETUFfVE9fREVWSUNFKTsKKwkJCQkvKiBhbmQgcHJldGVuZCB3ZSBkaXNjb25uZWN0ZWQgYWZ0ZXIKKwkJCQkgKiB0aGUgY29tbWFuZCBwaGFzZSAqLworCQkJCXJlc3VtZV9vZmZzZXQgPSBob3N0ZGF0YS0+cFNjcmlwdCArIEVudF9Nc2dJbkR1cmluZ0RhdGE7CisJCQkJLyogbWFrZSBzdXJlIGFsbCB0aGUgZGF0YSBpcyBmbHVzaGVkICovCisJCQkJTkNSXzcwMF9mbHVzaF9maWZvKGhvc3QpOworCQkJfSBlbHNlIHsKKwkJCQlfX3U4IHNiY2wgPSBOQ1JfNzAwX3JlYWRiKGhvc3QsIFNCQ0xfUkVHKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgInNjc2klZDogKCVkOiVkKSBwaGFzZSBtaXNtYXRjaCBhdCAlMDR4LCBwaGFzZSAlc1xuIiwKKwkJCQkgICAgICAgaG9zdC0+aG9zdF9ubywgcHVuLCBsdW4sIGRzcCAtIGhvc3RkYXRhLT5wU2NyaXB0LCBzYmNsX3RvX3N0cmluZyhzYmNsKSk7CisJCQkJTkNSXzcwMF9pbnRlcm5hbF9idXNfcmVzZXQoaG9zdCk7CisJCQl9CisKKwkJfSBlbHNlIGlmKHNzdGF0MCAmIFNDU0lfR1JPU1NfRVJST1IpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkOiAoJWQ6JWQpIEdST1NTIEVSUk9SXG4iLAorCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuKTsKKwkJCU5DUl83MDBfc2NzaV9kb25lKGhvc3RkYXRhLCBTQ3AsIERJRF9FUlJPUjw8MTYpOworCQl9IGVsc2UgaWYoc3N0YXQwICYgUEFSSVRZX0VSUk9SKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNjc2klZDogKCVkOiVkKSBQQVJJVFkgRVJST1JcbiIsCisJCQkgICAgICAgaG9zdC0+aG9zdF9ubywgcHVuLCBsdW4pOworCQkJTkNSXzcwMF9zY3NpX2RvbmUoaG9zdGRhdGEsIFNDcCwgRElEX0VSUk9SPDwxNik7CisJCX0gZWxzZSBpZihkc3RhdCAmIFNDUklQVF9JTlRfUkVDRUlWRUQpIHsKKwkJCURFQlVHKCgic2NzaSVkOiAoJWQ6JWQpID09PT0+U0NSSVBUIElOVEVSUlVQVDw9PT09XG4iLAorCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuKSk7CisJCQlyZXN1bWVfb2Zmc2V0ID0gcHJvY2Vzc19zY3JpcHRfaW50ZXJydXB0KGRzcHMsIGRzcCwgU0NwLCBob3N0LCBob3N0ZGF0YSk7CisJCX0gZWxzZSBpZihkc3RhdCAmIChJTEdMX0lOU1RfREVURUNURUQpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNjc2klZDogKCVkOiVkKSBJbGxlZ2FsIEluc3RydWN0aW9uIGRldGVjdGVkIGF0IDB4JTA4eFsweCV4XSEhIVxuIgorCQkJICAgICAgICIgICAgICAgICBQbGVhc2UgZW1haWwgSmFtZXMuQm90dG9tbGV5QEhhbnNlblBhcnRuZXJzaGlwLmNvbSB3aXRoIHRoZSBkZXRhaWxzXG4iLAorCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuLAorCQkJICAgICAgIGRzcCwgZHNwIC0gaG9zdGRhdGEtPnBTY3JpcHQpOworCQkJTkNSXzcwMF9zY3NpX2RvbmUoaG9zdGRhdGEsIFNDcCwgRElEX0VSUk9SPDwxNik7CisJCX0gZWxzZSBpZihkc3RhdCAmIChXQVRDSF9ET0dfSU5URVJSVVBUfEFCT1JURUQpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNjc2klZDogKCVkOiVkKSBzZXJpb3VzIERNQSBwcm9ibGVtLCBkc3RhdD0lMDJ4XG4iLAorCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuLCBkc3RhdCk7CisJCQlOQ1JfNzAwX3Njc2lfZG9uZShob3N0ZGF0YSwgU0NwLCBESURfRVJST1I8PDE2KTsKKwkJfQorCisJCQorCQkvKiBOT1RFOiBzZWxlY3Rpb24gaW50ZXJydXB0IHByb2Nlc3NpbmcgTVVTVCBvY2N1cgorCQkgKiBhZnRlciBzY3JpcHQgaW50ZXJydXB0IHByb2Nlc3NpbmcgdG8gY29ycmVjdGx5IGNvcGUKKwkJICogd2l0aCB0aGUgY2FzZSB3aGVyZSB3ZSBwcm9jZXNzIGEgZGlzY29ubmVjdCBhbmQKKwkJICogdGhlbiBnZXQgcmVzZWxlY3RlZCBiZWZvcmUgd2UgcHJvY2VzcyB0aGUKKwkJICogZGlzY29ubmVjdGlvbiAqLworCQlpZihzc3RhdDAgJiBTRUxFQ1RFRCkgeworCQkJLyogRklYTUU6IEl0IGN1cnJlbnRseSB0YWtlcyBhdCBsZWFzdCBGT1VSCisJCQkgKiBpbnRlcnJ1cHRzIHRvIGNvbXBsZXRlIGEgY29tbWFuZCB0aGF0CisJCQkgKiBkaXNjb25uZWN0czogb25lIGZvciB0aGUgZGlzY29ubmVjdCwgb25lCisJCQkgKiBmb3IgdGhlIHJlc2VsZWN0aW9uLCBvbmUgdG8gZ2V0IHRoZQorCQkJICogcmVzZWxlY3Rpb24gZGF0YSBhbmQgb25lIHRvIGNvbXBsZXRlIHRoZQorCQkJICogY29tbWFuZC4gIElmIHdlIGd1ZXNzIHRoZSByZXNlbGVjdGVkCisJCQkgKiBjb21tYW5kIGhlcmUgYW5kIHByZXBhcmUgaXQsIHdlIG9ubHkgbmVlZAorCQkJICogdG8gZ2V0IGEgcmVzZWxlY3Rpb24gZGF0YSBpbnRlcnJ1cHQgaWYgd2UKKwkJCSAqIGd1ZXNzZWQgd3JvbmdseS4gIFNpbmNlIHRoZSBpbnRlcnJ1cHQKKwkJCSAqIG92ZXJoZWFkIGlzIG11Y2ggZ3JlYXRlciB0aGFuIHRoZSBjb21tYW5kCisJCQkgKiBzZXR1cCwgdGhpcyB3b3VsZCBiZSBhbiBlZmZpY2llbnQKKwkJCSAqIG9wdGltaXNhdGlvbiBwYXJ0aWN1bGFybHkgYXMgd2UgcHJvYmFibHkKKwkJCSAqIG9ubHkgaGF2ZSBvbmUgb3V0c3RhbmRpbmcgY29tbWFuZCBvbiBhCisJCQkgKiB0YXJnZXQgbW9zdCBvZiB0aGUgdGltZSAqLworCisJCQlyZXN1bWVfb2Zmc2V0ID0gcHJvY2Vzc19zZWxlY3Rpb24oaG9zdCwgZHNwKTsKKworCQl9CisKKwl9CisKKwlpZihyZXN1bWVfb2Zmc2V0KSB7CisJCWlmKGhvc3RkYXRhLT5zdGF0ZSAhPSBOQ1JfNzAwX0hPU1RfQlVTWSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6IERyaXZlciBlcnJvcjogcmVzdW1lIGF0IDB4JTA4eCBbMHglMDR4XSB3aXRoIG5vbiBidXN5IGhvc3QhXG4iLAorCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHJlc3VtZV9vZmZzZXQsIHJlc3VtZV9vZmZzZXQgLSBob3N0ZGF0YS0+cFNjcmlwdCk7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBOQ1JfNzAwX0hPU1RfQlVTWTsKKwkJfQorCisJCURFQlVHKCgiQXR0ZW1wdGluZyB0byByZXN1bWUgYXQgJXhcbiIsIHJlc3VtZV9vZmZzZXQpKTsKKwkJTkNSXzcwMF9jbGVhcl9maWZvKGhvc3QpOworCQlOQ1JfNzAwX3dyaXRlbChyZXN1bWVfb2Zmc2V0LCBob3N0LCBEU1BfUkVHKTsKKwl9IAorCS8qIFRoZXJlIGlzIHByb2JhYmx5IGEgdGVjaG5pY2FsIG5vLW5vIGFib3V0IHRoaXM6IElmIHdlJ3JlIGEKKwkgKiBzaGFyZWQgaW50ZXJydXB0IGFuZCB3ZSBnb3QgdGhpcyBpbnRlcnJ1cHQgYmVjYXVzZSB0aGUKKwkgKiBvdGhlciBkZXZpY2UgbmVlZHMgc2VydmljaW5nIG5vdCB1cywgd2UncmUgc3RpbGwgZ29pbmcgdG8KKwkgKiBjaGVjayBvdXIgcXVldWVkIGNvbW1hbmRzIGhlcmUtLS1vZiBjb3Vyc2UsIHRoZXJlIHNob3VsZG4ndAorCSAqIGJlIGFueSBvdXRzdGFuZGluZy4uLi4gKi8KKwlpZihob3N0ZGF0YS0+c3RhdGUgPT0gTkNSXzcwMF9IT1NUX0ZSRUUpIHsKKwkJaW50IGk7CisKKwkJZm9yKGkgPSAwOyBpIDwgTkNSXzcwMF9DT01NQU5EX1NMT1RTX1BFUl9IT1NUOyBpKyspIHsKKwkJCS8qIGZhaXJuZXNzOiBhbHdheXMgcnVuIHRoZSBxdWV1ZSBmcm9tIHRoZSBsYXN0CisJCQkgKiBwb3NpdGlvbiB3ZSBsZWZ0IG9mZiAqLworCQkJaW50IGogPSAoaSArIGhvc3RkYXRhLT5zYXZlZF9zbG90X3Bvc2l0aW9uKQorCQkJCSUgTkNSXzcwMF9DT01NQU5EX1NMT1RTX1BFUl9IT1NUOworCQkJCisJCQlpZihob3N0ZGF0YS0+c2xvdHNbal0uc3RhdGUgIT0gTkNSXzcwMF9TTE9UX1FVRVVFRCkKKwkJCQljb250aW51ZTsKKwkJCWlmKE5DUl83MDBfc3RhcnRfY29tbWFuZChob3N0ZGF0YS0+c2xvdHNbal0uY21uZCkpIHsKKwkJCQlERUJVRygoInNjc2klZDogSXNzdWluZyBzYXZlZCBjb21tYW5kIHNsb3QgJXAsIGNtZCAlcFx0XG4iLAorCQkJCSAgICAgICBob3N0LT5ob3N0X25vLCAmaG9zdGRhdGEtPnNsb3RzW2pdLAorCQkJCSAgICAgICBob3N0ZGF0YS0+c2xvdHNbal0uY21uZCkpOworCQkJCWhvc3RkYXRhLT5zYXZlZF9zbG90X3Bvc2l0aW9uID0gaiArIDE7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJfQorIG91dF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworU1RBVElDIGludAorTkNSXzcwMF9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqU0NwLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhID0gCisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilTQ3AtPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF07CisJX191MzIgbW92ZV9pbnM7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uOworCXN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqc2xvdDsKKworCWlmKGhvc3RkYXRhLT5jb21tYW5kX3Nsb3RfY291bnQgPj0gTkNSXzcwMF9DT01NQU5EX1NMT1RTX1BFUl9IT1NUKSB7CisJCS8qIFdlJ3JlIG92ZXIgb3VyIGFsbG9jYXRpb24sIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgorCQkgKiBzaW5jZSB3ZSByZXBvcnQgdGhlIG1heCBhbGxvY2F0aW9uIHRvIHRoZSBtaWQgbGF5ZXIgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkOiBDb21tYW5kIGRlcHRoIGhhcyBnb25lIG92ZXIgcXVldWUgZGVwdGhcbiIsIFNDcC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vKTsKKwkJcmV0dXJuIDE7CisJfQorCS8qIGNoZWNrIGZvciB1bnRhZ2dlZCBjb21tYW5kcy4gIFdlIGNhbm5vdCBoYXZlIGFueSBvdXRzdGFuZGluZworCSAqIGNvbW1hbmRzIGlmIHdlIGFjY2VwdCB0aGVtLiAgQ29tbWFuZHMgY291bGQgYmUgdW50YWdnZWQgYmVjYXVzZToKKwkgKgorCSAqIC0gVGhlIHRhZyBuZWdvdGlhdGVkIGJpdG1hcCBpcyBjbGVhcgorCSAqIC0gVGhlIGJsayBsYXllciBzZW50IGFuZCB1bnRhZ2dlZCBjb21tYW5kCisJICovCisJaWYoTkNSXzcwMF9nZXRfZGVwdGgoU0NwLT5kZXZpY2UpICE9IDAKKwkgICAmJiAoIShob3N0ZGF0YS0+dGFnX25lZ290aWF0ZWQgJiAoMTw8U0NwLT5kZXZpY2UtPmlkKSkKKwkgICAgICAgfHwgIWJsa19ycV90YWdnZWQoU0NwLT5yZXF1ZXN0KSkpIHsKKwkJREVCVUcoKEtFUk5fRVJSICJzY3NpJWQgKCVkOiVkKSBoYXMgbm9uIHplcm8gZGVwdGggJWRcbiIsCisJCSAgICAgICBTQ3AtPmRldmljZS0+aG9zdC0+aG9zdF9ubywgU0NwLT5kZXZpY2UtPmlkLCBTQ3AtPmRldmljZS0+bHVuLAorCQkgICAgICAgTkNSXzcwMF9nZXRfZGVwdGgoU0NwLT5kZXZpY2UpKSk7CisJCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7CisJfQorCWlmKE5DUl83MDBfZ2V0X2RlcHRoKFNDcC0+ZGV2aWNlKSA+PSBTQ3AtPmRldmljZS0+cXVldWVfZGVwdGgpIHsKKwkJREVCVUcoKEtFUk5fRVJSICJzY3NpJWQgKCVkOiVkKSBoYXMgbWF4IHRhZyBkZXB0aCAlZFxuIiwKKwkJICAgICAgIFNDcC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLCBTQ3AtPmRldmljZS0+aWQsIFNDcC0+ZGV2aWNlLT5sdW4sCisJCSAgICAgICBOQ1JfNzAwX2dldF9kZXB0aChTQ3AtPmRldmljZSkpKTsKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKKwl9CisJTkNSXzcwMF9zZXRfZGVwdGgoU0NwLT5kZXZpY2UsIE5DUl83MDBfZ2V0X2RlcHRoKFNDcC0+ZGV2aWNlKSArIDEpOworCisJLyogYmVnaW4gdGhlIGNvbW1hbmQgaGVyZSAqLworCS8qIG5vIG5lZWQgdG8gY2hlY2sgZm9yIE5VTEwsIHRlc3QgZm9yIGNvbW1hbmRfc2xvdF9jb3VudCBhYm92ZQorCSAqIGVuc3VyZXMgYSBzbG90IGlzIGZyZWUgKi8KKwlzbG90ID0gZmluZF9lbXB0eV9zbG90KGhvc3RkYXRhKTsKKworCXNsb3QtPmNtbmQgPSBTQ3A7CisKKwlTQ3AtPnNjc2lfZG9uZSA9IGRvbmU7CisJU0NwLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKilzbG90OworCVNDcC0+U0NwLnB0ciA9IE5VTEw7CisJU0NwLT5TQ3AuYnVmZmVyID0gTlVMTDsKKworI2lmZGVmIE5DUl83MDBfREVCVUcKKwlwcmludGsoIjUzYzcwMDogc2NzaSVkLCBjb21tYW5kICIsIFNDcC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vKTsKKwlzY3NpX3ByaW50X2NvbW1hbmQoU0NwKTsKKyNlbmRpZgorCWlmKGJsa19ycV90YWdnZWQoU0NwLT5yZXF1ZXN0KQorCSAgICYmIChob3N0ZGF0YS0+dGFnX25lZ290aWF0ZWQgJigxPDxTQ3AtPmRldmljZS0+aWQpKSA9PSAwCisJICAgJiYgTkNSXzcwMF9nZXRfdGFnX25lZ19zdGF0ZShTQ3AtPmRldmljZSkgPT0gTkNSXzcwMF9TVEFSVF9UQUdfTkVHT1RJQVRJT04pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6ICglZDolZCkgRW5hYmxpbmcgVGFnIENvbW1hbmQgUXVldWluZ1xuIiwgU0NwLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8sIFNDcC0+ZGV2aWNlLT5pZCwgU0NwLT5kZXZpY2UtPmx1bik7CisJCWhvc3RkYXRhLT50YWdfbmVnb3RpYXRlZCB8PSAoMTw8U0NwLT5kZXZpY2UtPmlkKTsKKwkJTkNSXzcwMF9zZXRfdGFnX25lZ19zdGF0ZShTQ3AtPmRldmljZSwgTkNSXzcwMF9EVVJJTkdfVEFHX05FR09USUFUSU9OKTsKKwl9CisKKwkvKiBoZXJlIHdlIG1heSBoYXZlIHRvIHByb2Nlc3MgYW4gdW50YWdnZWQgY29tbWFuZC4gIFRoZSBnYXRlCisJICogYWJvdmUgZW5zdXJlcyB0aGF0IHRoaXMgd2lsbCBiZSB0aGUgb25seSBvbmUgb3V0c3RhbmRpbmcsCisJICogc28gY2xlYXIgdGhlIHRhZyBuZWdvdGlhdGVkIGJpdC4KKwkgKgorCSAqIEZJWE1FOiBUaGlzIHdpbGwgcm95YWxseSBzY3JldyB1cCBvbiBtdWx0aXBsZSBMVU4gZGV2aWNlcworCSAqICovCisJaWYoIWJsa19ycV90YWdnZWQoU0NwLT5yZXF1ZXN0KQorCSAgICYmIChob3N0ZGF0YS0+dGFnX25lZ290aWF0ZWQgJigxPDxTQ3AtPmRldmljZS0+aWQpKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJzY3NpJWQ6ICglZDolZCkgRGlzYWJsaW5nIFRhZyBDb21tYW5kIFF1ZXVpbmdcbiIsIFNDcC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLCBTQ3AtPmRldmljZS0+aWQsIFNDcC0+ZGV2aWNlLT5sdW4pOworCQlob3N0ZGF0YS0+dGFnX25lZ290aWF0ZWQgJj0gfigxPDxTQ3AtPmRldmljZS0+aWQpOworCX0KKworCWlmKChob3N0ZGF0YS0+dGFnX25lZ290aWF0ZWQgJigxPDxTQ3AtPmRldmljZS0+aWQpKQorCSAgICYmIHNjc2lfZ2V0X3RhZ190eXBlKFNDcC0+ZGV2aWNlKSkgeworCQlzbG90LT50YWcgPSBTQ3AtPnJlcXVlc3QtPnRhZzsKKwkJREVCVUcoKCI1M2M3MDAgJWQ6JWQ6JWQsIHNlbmRpbmcgb3V0IHRhZyAlZCwgc2xvdCAlcFxuIiwKKwkJICAgICAgIFNDcC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLCBTQ3AtPmRldmljZS0+aWQsIFNDcC0+ZGV2aWNlLT5sdW4sIHNsb3QtPnRhZywKKwkJICAgICAgIHNsb3QpKTsKKwl9IGVsc2UgeworCQlzbG90LT50YWcgPSBTQ1NJX05PX1RBRzsKKwkJLyogbXVzdCBwb3B1bGF0ZSBjdXJyZW50X2NtbmQgZm9yIHNjc2lfZmluZF90YWcgdG8gd29yayAqLworCQlTQ3AtPmRldmljZS0+Y3VycmVudF9jbW5kID0gU0NwOworCX0KKwkvKiBzYW5pdHkgY2hlY2s6IHNvbWUgb2YgdGhlIGNvbW1hbmRzIGdlbmVyYXRlZCBieSB0aGUgbWlkLWxheWVyCisJICogaGF2ZSBhbiBlY2NlbnRyaWMgaWRlYSBvZiB0aGVpciBzY19kYXRhX2RpcmVjdGlvbiAqLworCWlmKCFTQ3AtPnVzZV9zZyAmJiAhU0NwLT5yZXF1ZXN0X2J1ZmZsZW4gCisJICAgJiYgU0NwLT5zY19kYXRhX2RpcmVjdGlvbiAhPSBETUFfTk9ORSkgeworI2lmZGVmIE5DUl83MDBfREVCVUcKKwkJcHJpbnRrKCI1M2M3MDA6IENvbW1hbmQiKTsKKwkJc2NzaV9wcmludF9jb21tYW5kKFNDcCk7CisJCXByaW50aygiSGFzIHdyb25nIGRhdGEgZGlyZWN0aW9uICVkXG4iLCBTQ3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKyNlbmRpZgorCQlTQ3AtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7CisJfQorCisJc3dpdGNoIChTQ3AtPmNtbmRbMF0pIHsKKwljYXNlIFJFUVVFU1RfU0VOU0U6CisJCS8qIGNsZWFyIHRoZSBpbnRlcm5hbCBzZW5zZSBtYWdpYyAqLworCQlTQ3AtPmNtbmRbNl0gPSAwOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQkvKiBPSywgZ2V0IGl0IGZyb20gdGhlIGNvbW1hbmQgKi8KKwkJc3dpdGNoKFNDcC0+c2NfZGF0YV9kaXJlY3Rpb24pIHsKKwkJY2FzZSBETUFfQklESVJFQ1RJT05BTDoKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiNTNjNzAwOiBVbmtub3duIGNvbW1hbmQgZm9yIGRhdGEgZGlyZWN0aW9uICIpOworCQkJc2NzaV9wcmludF9jb21tYW5kKFNDcCk7CisJCQkKKwkJCW1vdmVfaW5zID0gMDsKKwkJCWJyZWFrOworCQljYXNlIERNQV9OT05FOgorCQkJbW92ZV9pbnMgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQkJbW92ZV9pbnMgPSBTQ1JJUFRfTU9WRV9EQVRBX0lOOworCQkJYnJlYWs7CisJCWNhc2UgRE1BX1RPX0RFVklDRToKKwkJCW1vdmVfaW5zID0gU0NSSVBUX01PVkVfREFUQV9PVVQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIG5vdyBidWlsZCB0aGUgc2NhdHRlciBnYXRoZXIgbGlzdCAqLworCWRpcmVjdGlvbiA9IFNDcC0+c2NfZGF0YV9kaXJlY3Rpb247CisJaWYobW92ZV9pbnMgIT0gMCkgeworCQlpbnQgaTsKKwkJaW50IHNnX2NvdW50OworCQlkbWFfYWRkcl90IHZQdHIgPSAwOworCQlfX3UzMiBjb3VudCA9IDA7CisKKwkJaWYoU0NwLT51c2Vfc2cpIHsKKwkJCXNnX2NvdW50ID0gZG1hX21hcF9zZyhob3N0ZGF0YS0+ZGV2LCBTQ3AtPmJ1ZmZlciwKKwkJCQkJICAgICAgU0NwLT51c2Vfc2csIGRpcmVjdGlvbik7CisJCX0gZWxzZSB7CisJCQl2UHRyID0gZG1hX21hcF9zaW5nbGUoaG9zdGRhdGEtPmRldiwKKwkJCQkJICAgICAgU0NwLT5yZXF1ZXN0X2J1ZmZlciwgCisJCQkJCSAgICAgIFNDcC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCQkgICAgICBkaXJlY3Rpb24pOworCQkJY291bnQgPSBTQ3AtPnJlcXVlc3RfYnVmZmxlbjsKKwkJCXNsb3QtPmRtYV9oYW5kbGUgPSB2UHRyOworCQkJc2dfY291bnQgPSAxOworCQl9CisJCQkKKworCQlmb3IoaSA9IDA7IGkgPCBzZ19jb3VudDsgaSsrKSB7CisKKwkJCWlmKFNDcC0+dXNlX3NnKSB7CisJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IFNDcC0+YnVmZmVyOworCisJCQkJdlB0ciA9IHNnX2RtYV9hZGRyZXNzKCZzZ1tpXSk7CisJCQkJY291bnQgPSBzZ19kbWFfbGVuKCZzZ1tpXSk7CisJCQl9CisKKwkJCXNsb3QtPlNHW2ldLmlucyA9IGJTX3RvX2hvc3QobW92ZV9pbnMgfCBjb3VudCk7CisJCQlERUJVRygoIiBzY2F0dGVyIGJsb2NrICVkOiBtb3ZlICVkWyUwOHhdIGZyb20gMHglbHhcbiIsCisJCQkgICAgICAgaSwgY291bnQsIHNsb3QtPlNHW2ldLmlucywgKHVuc2lnbmVkIGxvbmcpdlB0cikpOworCQkJc2xvdC0+U0dbaV0ucEFkZHIgPSBiU190b19ob3N0KHZQdHIpOworCQl9CisJCXNsb3QtPlNHW2ldLmlucyA9IGJTX3RvX2hvc3QoU0NSSVBUX1JFVFVSTik7CisJCXNsb3QtPlNHW2ldLnBBZGRyID0gMDsKKwkJZG1hX2NhY2hlX3N5bmMoc2xvdC0+U0csIHNpemVvZihzbG90LT5TRyksIERNQV9UT19ERVZJQ0UpOworCQlERUJVRygoIiBTRVRUSU5HICUwOGx4IHRvICV4XG4iLAorCQkgICAgICAgKCZzbG90LT5wU0dbaV0uaW5zKSwgCisJCSAgICAgICBzbG90LT5TR1tpXS5pbnMpKTsKKwl9CisJc2xvdC0+cmVzdW1lX29mZnNldCA9IDA7CisJc2xvdC0+cENtZCA9IGRtYV9tYXBfc2luZ2xlKGhvc3RkYXRhLT5kZXYsIFNDcC0+Y21uZCwKKwkJCQkgICAgc2l6ZW9mKFNDcC0+Y21uZCksIERNQV9UT19ERVZJQ0UpOworCU5DUl83MDBfc3RhcnRfY29tbWFuZChTQ3ApOworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50CitOQ1JfNzAwX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3ApCit7CisJc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICpzbG90OworCisJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSVkICglZDolZCkgTmV3IGVycm9yIGhhbmRsZXIgd2FudHMgdG8gYWJvcnQgY29tbWFuZFxuXHQiLAorCSAgICAgICBTQ3AtPmRldmljZS0+aG9zdC0+aG9zdF9ubywgU0NwLT5kZXZpY2UtPmlkLCBTQ3AtPmRldmljZS0+bHVuKTsKKwlzY3NpX3ByaW50X2NvbW1hbmQoU0NwKTsKKworCXNsb3QgPSAoc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICopU0NwLT5ob3N0X3NjcmliYmxlOworCisJaWYoc2xvdCA9PSBOVUxMKQorCQkvKiBubyBvdXRzdGFuZGluZyBjb21tYW5kIHRvIGFib3J0ICovCisJCXJldHVybiBTVUNDRVNTOworCWlmKFNDcC0+Y21uZFswXSA9PSBURVNUX1VOSVRfUkVBRFkpIHsKKwkJLyogRklYTUU6IFRoaXMgaXMgYmVjYXVzZSBvZiBhIHByb2JsZW0gaW4gdGhlIG5ldworCQkgKiBlcnJvciBoYW5kbGVyLiAgV2hlbiBpdCBpcyBpbiBlcnJvciByZWNvdmVyeSwgaXQKKwkJICogd2lsbCBzZW5kIGEgVFVSIHRvIGEgZGV2aWNlIGl0IHRoaW5rcyBtYXkgc3RpbGwgYmUKKwkJICogc2hvd2luZyBhIHByb2JsZW0uICBJZiB0aGUgVFVSIGlzbid0IHJlc3BvbmRlZCB0bywKKwkJICogaXQgd2lsbCBhYm9ydCBpdCBhbmQgbWFyayB0aGUgZGV2aWNlIG9mZiBsaW5lLgorCQkgKiBVbmZvcnR1bmF0ZWx5LCBpdCBkb2VzIG5vIG90aGVyIGVycm9yIHJlY292ZXJ5LCBzbworCQkgKiB0aGlzIHdvdWxkIGxlYXZlIHVzIHdpdGggYW4gb3V0c3RhbmRpbmcgY29tbWFuZAorCQkgKiBvY2N1cHlpbmcgYSBzbG90LiAgUmF0aGVyIHRoYW4gYWxsb3cgdGhpcyB0bworCQkgKiBoYXBwZW4sIHdlIGlzc3VlIGEgYnVzIHJlc2V0IHRvIGZvcmNlIGFsbAorCQkgKiBvdXRzdGFuZGluZyBjb21tYW5kcyB0byB0ZXJtaW5hdGUgaGVyZS4gKi8KKwkJTkNSXzcwMF9pbnRlcm5hbF9idXNfcmVzZXQoU0NwLT5kZXZpY2UtPmhvc3QpOworCQkvKiBzdGlsbCBkcm9wIHRocm91Z2ggYW5kIHJldHVybiBmYWlsZWQgKi8KKwl9CisJcmV0dXJuIEZBSUxFRDsKKworfQorCitTVEFUSUMgaW50CitOQ1JfNzAwX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwKQoreworCURFQ0xBUkVfQ09NUExFVElPTihjb21wbGV0ZSk7CisJc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSA9IAorCQkoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICopU0NwLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhWzBdOworCisJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSVkICglZDolZCkgTmV3IGVycm9yIGhhbmRsZXIgd2FudHMgQlVTIHJlc2V0LCBjbWQgJXBcblx0IiwKKwkgICAgICAgU0NwLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8sIFNDcC0+ZGV2aWNlLT5pZCwgU0NwLT5kZXZpY2UtPmx1biwgU0NwKTsKKwlzY3NpX3ByaW50X2NvbW1hbmQoU0NwKTsKKwkvKiBJbiB0aGVvcnksIGVoX2NvbXBsZXRlIHNob3VsZCBhbHdheXMgYmUgbnVsbCBiZWNhdXNlIHRoZQorCSAqIGVoIGlzIHNpbmdsZSB0aHJlYWRlZCwgYnV0IGp1c3QgaW4gY2FzZSB3ZSdyZSBoYW5kbGluZyBhCisJICogcmVzZXQgdmlhIHNnIG9yIHNvbWV0aGluZyAqLworCXdoaWxlKGhvc3RkYXRhLT5laF9jb21wbGV0ZSAhPSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycShTQ3AtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrKTsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwKTsKKwkJc3Bpbl9sb2NrX2lycShTQ3AtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrKTsKKwl9CisJaG9zdGRhdGEtPmVoX2NvbXBsZXRlID0gJmNvbXBsZXRlOworCU5DUl83MDBfaW50ZXJuYWxfYnVzX3Jlc2V0KFNDcC0+ZGV2aWNlLT5ob3N0KTsKKwlzcGluX3VubG9ja19pcnEoU0NwLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jayk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmY29tcGxldGUpOworCXNwaW5fbG9ja19pcnEoU0NwLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jayk7CisJaG9zdGRhdGEtPmVoX2NvbXBsZXRlID0gTlVMTDsKKwkvKiBSZXZhbGlkYXRlIHRoZSB0cmFuc3BvcnQgcGFyYW1ldGVycyBvZiB0aGUgZmFpbGluZyBkZXZpY2UgKi8KKwlpZihob3N0ZGF0YS0+ZmFzdCkKKwkJc3BpX3NjaGVkdWxlX2R2X2RldmljZShTQ3AtPmRldmljZSk7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK1NUQVRJQyBpbnQKK05DUl83MDBfZGV2X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3ApCit7CisJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSVkICglZDolZCkgTmV3IGVycm9yIGhhbmRsZXIgd2FudHMgZGV2aWNlIHJlc2V0XG5cdCIsCisJICAgICAgIFNDcC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLCBTQ3AtPmRldmljZS0+aWQsIFNDcC0+ZGV2aWNlLT5sdW4pOworCXNjc2lfcHJpbnRfY29tbWFuZChTQ3ApOworCQorCXJldHVybiBGQUlMRUQ7Cit9CisKK1NUQVRJQyBpbnQKK05DUl83MDBfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwKQoreworCXByaW50ayhLRVJOX0lORk8gInNjc2klZCAoJWQ6JWQpIE5ldyBlcnJvciBoYW5kbGVyIHdhbnRzIEhPU1QgcmVzZXRcblx0IiwKKwkgICAgICAgU0NwLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8sIFNDcC0+ZGV2aWNlLT5pZCwgU0NwLT5kZXZpY2UtPmx1bik7CisJc2NzaV9wcmludF9jb21tYW5kKFNDcCk7CisKKwlOQ1JfNzAwX2ludGVybmFsX2J1c19yZXNldChTQ3AtPmRldmljZS0+aG9zdCk7CisJTkNSXzcwMF9jaGlwX3Jlc2V0KFNDcC0+ZGV2aWNlLT5ob3N0KTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworU1RBVElDIHZvaWQKK05DUl83MDBfc2V0X3BlcmlvZChzdHJ1Y3Qgc2NzaV90YXJnZXQgKlNUcCwgaW50IHBlcmlvZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpTSHAgPSBkZXZfdG9fc2hvc3QoU1RwLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhID0gCisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilTSHAtPmhvc3RkYXRhWzBdOworCQorCWlmKCFob3N0ZGF0YS0+ZmFzdCkKKwkJcmV0dXJuOworCisJaWYocGVyaW9kIDwgaG9zdGRhdGEtPm1pbl9wZXJpb2QpCisJCXBlcmlvZCA9IGhvc3RkYXRhLT5taW5fcGVyaW9kOworCisJc3BpX3BlcmlvZChTVHApID0gcGVyaW9kOworCXNwaV9mbGFncyhTVHApICY9IH4oTkNSXzcwMF9ERVZfTkVHT1RJQVRFRF9TWU5DIHwKKwkJCSAgICBOQ1JfNzAwX0RFVl9CRUdJTl9TWU5DX05FR09USUFUSU9OKTsKKwlzcGlfZmxhZ3MoU1RwKSB8PSBOQ1JfNzAwX0RFVl9QUklOVF9TWU5DX05FR09USUFUSU9OOworfQorCitTVEFUSUMgdm9pZAorTkNSXzcwMF9zZXRfb2Zmc2V0KHN0cnVjdCBzY3NpX3RhcmdldCAqU1RwLCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKlNIcCA9IGRldl90b19zaG9zdChTVHAtPmRldi5wYXJlbnQpOworCXN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEgPSAKKwkJKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqKVNIcC0+aG9zdGRhdGFbMF07CisJaW50IG1heF9vZmZzZXQgPSBob3N0ZGF0YS0+Y2hpcDcxMAorCQk/IE5DUl83MTBfTUFYX09GRlNFVCA6IE5DUl83MDBfTUFYX09GRlNFVDsKKwkKKwlpZighaG9zdGRhdGEtPmZhc3QpCisJCXJldHVybjsKKworCWlmKG9mZnNldCA+IG1heF9vZmZzZXQpCisJCW9mZnNldCA9IG1heF9vZmZzZXQ7CisKKwkvKiBpZiB3ZSdyZSBjdXJyZW50bHkgYXN5bmMsIG1ha2Ugc3VyZSB0aGUgcGVyaW9kIGlzIHJlYXNvbmFibGUgKi8KKwlpZihzcGlfb2Zmc2V0KFNUcCkgPT0gMCAmJiAoc3BpX3BlcmlvZChTVHApIDwgaG9zdGRhdGEtPm1pbl9wZXJpb2QgfHwKKwkJCQkgICAgc3BpX3BlcmlvZChTVHApID4gMHhmZikpCisJCXNwaV9wZXJpb2QoU1RwKSA9IGhvc3RkYXRhLT5taW5fcGVyaW9kOworCisJc3BpX29mZnNldChTVHApID0gb2Zmc2V0OworCXNwaV9mbGFncyhTVHApICY9IH4oTkNSXzcwMF9ERVZfTkVHT1RJQVRFRF9TWU5DIHwKKwkJCSAgICBOQ1JfNzAwX0RFVl9CRUdJTl9TWU5DX05FR09USUFUSU9OKTsKKwlzcGlfZmxhZ3MoU1RwKSB8PSBOQ1JfNzAwX0RFVl9QUklOVF9TWU5DX05FR09USUFUSU9OOworfQorCisKKworU1RBVElDIGludAorTkNSXzcwMF9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpTRHApCit7CisJc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSA9IAorCQkoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICopU0RwLT5ob3N0LT5ob3N0ZGF0YVswXTsKKworCS8qIHRvIGRvIGhlcmU6IGFsbG9jYXRlIG1lbW9yeTsgYnVpbGQgYSBxdWV1ZV9mdWxsIGxpc3QgKi8KKwlpZihTRHAtPnRhZ2dlZF9zdXBwb3J0ZWQpIHsKKwkJc2NzaV9zZXRfdGFnX3R5cGUoU0RwLCBNU0dfT1JERVJFRF9UQUcpOworCQlzY3NpX2FjdGl2YXRlX3RjcShTRHAsIE5DUl83MDBfREVGQVVMVF9UQUdTKTsKKwkJTkNSXzcwMF9zZXRfdGFnX25lZ19zdGF0ZShTRHAsIE5DUl83MDBfU1RBUlRfVEFHX05FR09USUFUSU9OKTsKKwl9IGVsc2UgeworCQkvKiBpbml0aWFsaXNlIHRvIGRlZmF1bHQgZGVwdGggKi8KKwkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoU0RwLCAwLCBTRHAtPmhvc3QtPmNtZF9wZXJfbHVuKTsKKwl9CisJaWYoaG9zdGRhdGEtPmZhc3QpIHsKKwkJLyogRmluZCB0aGUgY29ycmVjdCBvZmZzZXQgYW5kIHBlcmlvZCB2aWEgZG9tYWluIHZhbGlkYXRpb24gKi8KKwkJaWYgKCFzcGlfaW5pdGlhbF9kdihTRHAtPnNkZXZfdGFyZ2V0KSkKKwkJCXNwaV9kdl9kZXZpY2UoU0RwKTsKKwl9IGVsc2UgeworCQlzcGlfb2Zmc2V0KFNEcC0+c2Rldl90YXJnZXQpID0gMDsKKwkJc3BpX3BlcmlvZChTRHAtPnNkZXZfdGFyZ2V0KSA9IDA7CisJfQorCXJldHVybiAwOworfQorCitTVEFUSUMgdm9pZAorTkNSXzcwMF9zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqU0RwKQoreworCS8qIHRvIGRvIGhlcmU6IGRlYWxsb2NhdGUgbWVtb3J5ICovCit9CisKK3N0YXRpYyBpbnQKK05DUl83MDBfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqU0RwLCBpbnQgZGVwdGgpCit7CisJaWYgKGRlcHRoID4gTkNSXzcwMF9NQVhfVEFHUykKKwkJZGVwdGggPSBOQ1JfNzAwX01BWF9UQUdTOworCisJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoU0RwLCBzY3NpX2dldF90YWdfdHlwZShTRHApLCBkZXB0aCk7CisJcmV0dXJuIGRlcHRoOworfQorCitzdGF0aWMgaW50IE5DUl83MDBfY2hhbmdlX3F1ZXVlX3R5cGUoc3RydWN0IHNjc2lfZGV2aWNlICpTRHAsIGludCB0YWdfdHlwZSkKK3sKKwlpbnQgY2hhbmdlX3RhZyA9ICgodGFnX3R5cGUgPT0wICYmICBzY3NpX2dldF90YWdfdHlwZShTRHApICE9IDApCisJCQkgIHx8ICh0YWdfdHlwZSAhPSAwICYmIHNjc2lfZ2V0X3RhZ190eXBlKFNEcCkgPT0gMCkpOworCXN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEgPSAKKwkJKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqKVNEcC0+aG9zdC0+aG9zdGRhdGFbMF07CisKKwlzY3NpX3NldF90YWdfdHlwZShTRHAsIHRhZ190eXBlKTsKKworCS8qIFdlIGhhdmUgYSBnbG9iYWwgKHBlciB0YXJnZXQpIGZsYWcgdG8gdHJhY2sgd2hldGhlciBUQ1EgaXMKKwkgKiBlbmFibGVkLCBzbyB3ZSdsbCBiZSB0dXJuaW5nIGl0IG9mZiBmb3IgdGhlIGVudGlyZSB0YXJnZXQgaGVyZS4KKwkgKiBvdXIgdGFnIGFsZ29yaXRobSB3aWxsIGZhaWwgaWYgd2UgbWl4IHRhZ2dlZCBhbmQgdW50YWdnZWQgY29tbWFuZHMsCisJICogc28gcXVpZXNjZSB0aGUgZGV2aWNlIGJlZm9yZSBkb2luZyB0aGlzICovCisJaWYgKGNoYW5nZV90YWcpCisJCXNjc2lfdGFyZ2V0X3F1aWVzY2UoU0RwLT5zZGV2X3RhcmdldCk7CisKKwlpZiAoIXRhZ190eXBlKSB7CisJCS8qIHNoaWZ0IGJhY2sgdG8gdGhlIGRlZmF1bHQgdW5xdWV1ZWQgbnVtYmVyIG9mIGNvbW1hbmRzCisJCSAqICh0aGUgdXNlciBjYW4gc3RpbGwgcmFpc2UgdGhpcykgKi8KKwkJc2NzaV9kZWFjdGl2YXRlX3RjcShTRHAsIFNEcC0+aG9zdC0+Y21kX3Blcl9sdW4pOworCQlob3N0ZGF0YS0+dGFnX25lZ290aWF0ZWQgJj0gfigxIDw8IFNEcC0+aWQpOworCX0gZWxzZSB7CisJCS8qIEhlcmUsIHdlIGNsZWFyZWQgdGhlIG5lZ290aWF0aW9uIGZsYWcgYWJvdmUsIHNvIHRoaXMKKwkJICogd2lsbCBmb3JjZSB0aGUgZHJpdmVyIHRvIHJlbmVnb3RpYXRlICovCisJCXNjc2lfYWN0aXZhdGVfdGNxKFNEcCwgU0RwLT5xdWV1ZV9kZXB0aCk7CisJCWlmIChjaGFuZ2VfdGFnKQorCQkJTkNSXzcwMF9zZXRfdGFnX25lZ19zdGF0ZShTRHAsIE5DUl83MDBfU1RBUlRfVEFHX05FR09USUFUSU9OKTsKKwl9CisJaWYgKGNoYW5nZV90YWcpCisJCXNjc2lfdGFyZ2V0X3Jlc3VtZShTRHAtPnNkZXZfdGFyZ2V0KTsKKworCXJldHVybiB0YWdfdHlwZTsKK30KKworc3RhdGljIHNzaXplX3QKK05DUl83MDBfc2hvd19hY3RpdmVfdGFncyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKlNEcCA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgIiVkXG4iLCBOQ1JfNzAwX2dldF9kZXB0aChTRHApKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIE5DUl83MDBfYWN0aXZlX3RhZ3NfYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPQkJImFjdGl2ZV90YWdzIiwKKwkJLm1vZGUgPQkJU19JUlVHTywKKwl9LAorCS5zaG93ID0gTkNSXzcwMF9zaG93X2FjdGl2ZV90YWdzLAorfTsKKworU1RBVElDIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpOQ1JfNzAwX2Rldl9hdHRyc1tdID0geworCSZOQ1JfNzAwX2FjdGl2ZV90YWdzX2F0dHIsCisJTlVMTCwKK307CisKK0VYUE9SVF9TWU1CT0woTkNSXzcwMF9kZXRlY3QpOworRVhQT1JUX1NZTUJPTChOQ1JfNzAwX3JlbGVhc2UpOworRVhQT1JUX1NZTUJPTChOQ1JfNzAwX2ludHIpOworCitzdGF0aWMgc3RydWN0IHNwaV9mdW5jdGlvbl90ZW1wbGF0ZSBOQ1JfNzAwX3RyYW5zcG9ydF9mdW5jdGlvbnMgPSAgeworCS5zZXRfcGVyaW9kCT0gTkNSXzcwMF9zZXRfcGVyaW9kLAorCS5zaG93X3BlcmlvZAk9IDEsCisJLnNldF9vZmZzZXQJPSBOQ1JfNzAwX3NldF9vZmZzZXQsCisJLnNob3dfb2Zmc2V0CT0gMSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IE5DUl83MDBfaW5pdCh2b2lkKQoreworCU5DUl83MDBfdHJhbnNwb3J0X3RlbXBsYXRlID0gc3BpX2F0dGFjaF90cmFuc3BvcnQoJk5DUl83MDBfdHJhbnNwb3J0X2Z1bmN0aW9ucyk7CisJaWYoIU5DUl83MDBfdHJhbnNwb3J0X3RlbXBsYXRlKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IE5DUl83MDBfZXhpdCh2b2lkKQoreworCXNwaV9yZWxlYXNlX3RyYW5zcG9ydChOQ1JfNzAwX3RyYW5zcG9ydF90ZW1wbGF0ZSk7Cit9CisKK21vZHVsZV9pbml0KE5DUl83MDBfaW5pdCk7Cittb2R1bGVfZXhpdChOQ1JfNzAwX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvNTNjNzAwLmggYi9kcml2ZXJzL3Njc2kvNTNjNzAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0YWEzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS81M2M3MDAuaApAQCAtMCwwICsxLDY0OSBAQAorLyogLSotIG1vZGU6IGM7IGMtYmFzaWMtb2Zmc2V0OiA4IC0qLSAqLworCisvKiBEcml2ZXIgZm9yIDUzYzcwMCBhbmQgNTNjNzAwLTY2IGNoaXBzIGZyb20gTkNSIGFuZCBTeW1iaW9zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEphbWVzLkJvdHRvbWxleUBIYW5zZW5QYXJ0bmVyc2hpcC5jb20KKyAqLworCisjaWZuZGVmIF81M0M3MDBfSAorI2RlZmluZSBfNTNDNzAwX0gKKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorCisKKyNpZiBkZWZpbmVkKENPTkZJR181M0M3MDBfTUVNX01BUFBFRCkgJiYgZGVmaW5lZChDT05GSUdfNTNDNzAwX0lPX01BUFBFRCkKKyNkZWZpbmUgQ09ORklHXzUzQzcwMF9CT1RIX01BUFBFRAorI2VuZGlmCisKKy8qIFR1cm4gb24gZm9yIGdlbmVyYWwgZGVidWdnaW5nLS0tdG9vIHZlcmJvc2UgZm9yIG5vcm1hbCB1c2UgKi8KKyN1bmRlZglOQ1JfNzAwX0RFQlVHCisvKiBEZWJ1ZyB0aGUgdGFnIHF1ZXVlcywgY2hlY2tpbmcgaGFzaCBxdWV1ZSBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24KKyAqIGFuZCBzZWFyY2ggZm9yIGR1cGxpY2F0ZSB0YWdzICovCisjdW5kZWYgTkNSXzcwMF9UQUdfREVCVUcKKworI2lmZGVmIE5DUl83MDBfREVCVUcKKyNkZWZpbmUgREVCVUcoeCkJcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIERFQlVHKHgpCisjZW5kaWYKKworLyogVGhlIG51bWJlciBvZiBhdmFpbGFibGUgY29tbWFuZCBzbG90cyAqLworI2RlZmluZSBOQ1JfNzAwX0NPTU1BTkRfU0xPVFNfUEVSX0hPU1QJNjQKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBTY2F0dGVyIEdhdGhlcnMgd2UgYWxsb3cgKi8KKyNkZWZpbmUgTkNSXzcwMF9TR19TRUdNRU5UUwkJMzIKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBsdW5zIChtYWtlIHRoaXMgb2YgdGhlIGZvcm0gMl5uKSAqLworI2RlZmluZSBOQ1JfNzAwX01BWF9MVU5TCQkzMgorI2RlZmluZSBOQ1JfNzAwX0xVTl9NQVNLCQkoTkNSXzcwMF9NQVhfTFVOUyAtIDEpCisvKiBNYXhpbXVtIG51bWJlciBvZiB0YWdzIHRoZSBkcml2ZXIgZXZlciBhbGxvd3MgcGVyIGRldmljZSAqLworI2RlZmluZSBOQ1JfNzAwX01BWF9UQUdTCQkxNgorLyogVGFnIGRlcHRoIHRoZSBkcml2ZXIgc3RhcnRzIG91dCB3aXRoIChjYW4gYmUgYWx0ZXJlZCBpbiBzeXNmcykgKi8KKyNkZWZpbmUgTkNSXzcwMF9ERUZBVUxUX1RBR1MJCTQKKy8qIFRoaXMgaXMgdGhlIGRlZmF1bHQgbnVtYmVyIG9mIGNvbW1hbmRzIHBlciBMVU4gaW4gdGhlIHVudGFnZ2VkIGNhc2UuCisgKiB0d28gaXMgYSBnb29kIHZhbHVlIGJlY2F1c2UgaXQgbWVhbnMgd2UgY2FuIGhhdmUgb25lIGNvbW1hbmQgYWN0aXZlIGFuZAorICogb25lIGNvbW1hbmQgZnVsbHkgcHJlcGFyZWQgYW5kIHdhaXRpbmcKKyAqLworI2RlZmluZSBOQ1JfNzAwX0NNRF9QRVJfTFVOCQkyCisvKiBtYWdpYyBieXRlIGlkZW50aWZ5aW5nIGFuIGludGVybmFsbHkgZ2VuZXJhdGVkIFJFUVVFU1RfU0VOU0UgY29tbWFuZCAqLworI2RlZmluZSBOQ1JfNzAwX0lOVEVSTkFMX1NFTlNFX01BR0lDCTB4NDIKKworLyogV0FSTklORzogTGVhdmUgdGhpcyBpbiBmb3Igbm93OiB0aGUgZGVwZW5kZW5jeSBwcmVwcm9jZXNzb3IgZG9lc24ndAorICogcGljayB1cCBmaWxlIHNwZWNpZmljIGZsYWdzLCBzbyBtdXN0IGRlZmluZSBoZXJlIGlmIHRoZXkgYXJlIG5vdAorICogc2V0ICovCisjaWYgIWRlZmluZWQoQ09ORklHXzUzQzcwMF9JT19NQVBQRUQpICYmICFkZWZpbmVkKENPTkZJR181M0M3MDBfTUVNX01BUFBFRCkKKyNlcnJvciAiQ29uZmlnLmluIG11c3QgZGVmaW5lIGVpdGhlciBDT05GSUdfNTNDNzAwX0lPX01BUFBFRCBvciBDT05GSUdfNTNDNzAwX01FTV9NQVBQRUQgdG8gdXNlIHRoaXMgc2NzaSBjb3JlLiIKKyNlbmRpZgorCitzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnM7CisKKy8qIFRoZXNlIGFyZSB0aGUgZXh0ZXJuYWxseSB1c2VkIHJvdXRpbmVzICovCitzdHJ1Y3QgU2NzaV9Ib3N0ICpOQ1JfNzAwX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICosCisJCXN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqLCBzdHJ1Y3QgZGV2aWNlICopOworaW50IE5DUl83MDBfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKK2lycXJldHVybl90IE5DUl83MDBfaW50cihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CisKKworZW51bSBOQ1JfNzAwX0hvc3RfU3RhdGUgeworCU5DUl83MDBfSE9TVF9CVVNZLAorCU5DUl83MDBfSE9TVF9GUkVFLAorfTsKKworc3RydWN0IE5DUl83MDBfU0dfTGlzdCB7CisJLyogVGhlIGZvbGxvd2luZyBpcyBhIHNjcmlwdCBmcmFnbWVudCB0byBtb3ZlIHRoZSBidWZmZXIgb250byB0aGUKKwkgKiBidXMgYW5kIHRoZW4gbGluayB0aGUgbmV4dCBmcmFnbWVudCBvciByZXR1cm4gKi8KKwkjZGVmaW5lCVNDUklQVF9NT1ZFX0RBVEFfSU4JCTB4MDkwMDAwMDAKKwkjZGVmaW5lCVNDUklQVF9NT1ZFX0RBVEFfT1VUCQkweDA4MDAwMDAwCisJX191MzIJaW5zOworCV9fdTMyCXBBZGRyOworCSNkZWZpbmUJU0NSSVBUX05PUAkJCTB4ODAwMDAwMDAKKwkjZGVmaW5lCVNDUklQVF9SRVRVUk4JCQkweDkwMDgwMDAwCit9OworCisvKiBXZSB1c2UgZGV2aWNlLT5ob3N0ZGF0YSB0byBzdG9yZSBuZWdvdGlhdGVkIHBhcmFtZXRlcnMuICBUaGlzIGlzCisgKiBzdXBwb3NlZCB0byBiZSBhIHBvaW50ZXIgdG8gYSBkZXZpY2UgcHJpdmF0ZSBhcmVhLCBidXQgd2UgY2Fubm90CisgKiByZWFsbHkgdXNlIGl0IGFzIHN1Y2ggc2luY2UgaXQgd2lsbCBuZXZlciBiZSBmcmVlZCwgc28ganVzdCB1c2UgdGhlCisgKiAzMiBiaXRzIHRvIGNyYW0gdGhlIGluZm9ybWF0aW9uLiAgVGhlIFNZTkMgbmVnb3RpYXRpb24gc2VxdWVuY2UgbG9va3MKKyAqIGxpa2U6CisgKiAKKyAqIElmIERFVl9ORUdPVElBVEVEX1NZTkMgbm90IHNldCwgdGFjayBhbmQgU0RUUiBtZXNzYWdlIG9uIHRvIHRoZQorICogaW5pdGlhbCBpZGVudGlmeSBmb3IgdGhlIGRldmljZSBhbmQgc2V0IERFVl9CRUdJTl9TWU5DX05FR09UQVRJT04KKyAqIElmIHdlIGdldCBhbiBTRFRSIHJlcGx5LCB3b3JrIG91dCB0aGUgU1hGRVIgcGFyYW1ldGVycywgc3F1aXJyZWwKKyAqIHRoZW0gYXdheSBoZXJlLCBjbGVhciBERVZfQkVHSU5fU1lOQ19ORUdPVElBVElPTiBhbmQgc2V0CisgKiBERVZfTkVHT1RJQVRFRF9TWU5DLiAgSWYgd2UgZ2V0IGEgUkVKRUNUIG1zZywgc3F1aXJyZWwKKyAqCisgKgorICogMDo3CVNYRkVSX1JFRyBuZWdvdGlhdGVkIHZhbHVlIGZvciB0aGlzIGRldmljZQorICogODoxNSBDdXJyZW50IHF1ZXVlIGRlcHRoCisgKiAxNgluZWdvdGlhdGVkIFNZTkMgZmxhZworICogMTcgYmVnaW4gU1lOQyBuZWdvdGlhdGlvbiBmbGFnIAorICogMTggZGV2aWNlIHN1cHBvcnRzIHRhZyBxdWV1ZWluZyAqLworI2RlZmluZSBOQ1JfNzAwX0RFVl9ORUdPVElBVEVEX1NZTkMJKDE8PDE2KQorI2RlZmluZSBOQ1JfNzAwX0RFVl9CRUdJTl9TWU5DX05FR09USUFUSU9OCSgxPDwxNykKKyNkZWZpbmUgTkNSXzcwMF9ERVZfUFJJTlRfU1lOQ19ORUdPVElBVElPTiAoMTw8MTkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorTkNSXzcwMF9zZXRfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpTRHAsIF9fdTggZGVwdGgpCit7CisJbG9uZyBsID0gKGxvbmcpU0RwLT5ob3N0ZGF0YTsKKworCWwgJj0gMHhmZmZmMDBmZjsKKwlsIHw9IDB4ZmYwMCAmIChkZXB0aCA8PCA4KTsKKwlTRHAtPmhvc3RkYXRhID0gKHZvaWQgKilsOworfQorc3RhdGljIGlubGluZSBfX3U4CitOQ1JfNzAwX2dldF9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKlNEcCkKK3sKKwlyZXR1cm4gKCgoKHVuc2lnbmVkIGxvbmcpU0RwLT5ob3N0ZGF0YSkgJiAweGZmMDApPj44KTsKK30KK3N0YXRpYyBpbmxpbmUgaW50CitOQ1JfNzAwX2lzX2ZsYWdfc2V0KHN0cnVjdCBzY3NpX2RldmljZSAqU0RwLCBfX3UzMiBmbGFnKQoreworCXJldHVybiAoc3BpX2ZsYWdzKFNEcC0+c2Rldl90YXJnZXQpICYgZmxhZykgPT0gZmxhZzsKK30KK3N0YXRpYyBpbmxpbmUgaW50CitOQ1JfNzAwX2lzX2ZsYWdfY2xlYXIoc3RydWN0IHNjc2lfZGV2aWNlICpTRHAsIF9fdTMyIGZsYWcpCit7CisJcmV0dXJuIChzcGlfZmxhZ3MoU0RwLT5zZGV2X3RhcmdldCkgJiBmbGFnKSA9PSAwOworfQorc3RhdGljIGlubGluZSB2b2lkCitOQ1JfNzAwX3NldF9mbGFnKHN0cnVjdCBzY3NpX2RldmljZSAqU0RwLCBfX3UzMiBmbGFnKQoreworCXNwaV9mbGFncyhTRHAtPnNkZXZfdGFyZ2V0KSB8PSBmbGFnOworfQorc3RhdGljIGlubGluZSB2b2lkCitOQ1JfNzAwX2NsZWFyX2ZsYWcoc3RydWN0IHNjc2lfZGV2aWNlICpTRHAsIF9fdTMyIGZsYWcpCit7CisJc3BpX2ZsYWdzKFNEcC0+c2Rldl90YXJnZXQpICY9IH5mbGFnOworfQorCitlbnVtIE5DUl83MDBfdGFnX25lZ19zdGF0ZSB7CisJTkNSXzcwMF9TVEFSVF9UQUdfTkVHT1RJQVRJT04gPSAwLAorCU5DUl83MDBfRFVSSU5HX1RBR19ORUdPVElBVElPTiA9IDEsCisJTkNSXzcwMF9GSU5JU0hFRF9UQUdfTkVHT1RJQVRJT04gPSAyLAorfTsKKworc3RhdGljIGlubGluZSBlbnVtIE5DUl83MDBfdGFnX25lZ19zdGF0ZQorTkNSXzcwMF9nZXRfdGFnX25lZ19zdGF0ZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKlNEcCkKK3sKKwlyZXR1cm4gKGVudW0gTkNSXzcwMF90YWdfbmVnX3N0YXRlKSgoc3BpX2ZsYWdzKFNEcC0+c2Rldl90YXJnZXQpPj4yMCkgJiAweDMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK05DUl83MDBfc2V0X3RhZ19uZWdfc3RhdGUoc3RydWN0IHNjc2lfZGV2aWNlICpTRHAsCisJCQkgIGVudW0gTkNSXzcwMF90YWdfbmVnX3N0YXRlIHN0YXRlKQoreworCS8qIGNsZWFyIHRoZSBzbG90ICovCisJc3BpX2ZsYWdzKFNEcC0+c2Rldl90YXJnZXQpICY9IH4oMHgzIDw8IDIwKTsKKwlzcGlfZmxhZ3MoU0RwLT5zZGV2X3RhcmdldCkgfD0gKChfX3UzMilzdGF0ZSkgPDwgMjA7Cit9CisKK3N0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCB7CisJc3RydWN0IE5DUl83MDBfU0dfTGlzdAlTR1tOQ1JfNzAwX1NHX1NFR01FTlRTKzFdOworCXN0cnVjdCBOQ1JfNzAwX1NHX0xpc3QJKnBTRzsKKwkjZGVmaW5lIE5DUl83MDBfU0xPVF9NQVNLIDB4RkMKKwkjZGVmaW5lIE5DUl83MDBfU0xPVF9NQUdJQyAweGI4CisJI2RlZmluZQlOQ1JfNzAwX1NMT1RfRlJFRSAoMHxOQ1JfNzAwX1NMT1RfTUFHSUMpIC8qIHNsb3QgbWF5IGJlIHVzZWQgKi8KKwkjZGVmaW5lIE5DUl83MDBfU0xPVF9CVVNZICgxfE5DUl83MDBfU0xPVF9NQUdJQykgLyogc2xvdCBoYXMgY29tbWFuZCBhY3RpdmUgb24gSEEgKi8KKwkjZGVmaW5lIE5DUl83MDBfU0xPVF9RVUVVRUQgKDJ8TkNSXzcwMF9TTE9UX01BR0lDKSAvKiBzbG90IGhhcyBjb21tYW5kIHRvIGJlIG1hZGUgYWN0aXZlIG9uIEhBICovCisJX191OAlzdGF0ZTsKKwlpbnQJdGFnOworCV9fdTMyCXJlc3VtZV9vZmZzZXQ7CisJc3RydWN0IHNjc2lfY21uZCAqY21uZDsKKwkvKiBUaGUgcGNpX21hcHBlZCBhZGRyZXNzIG9mIHRoZSBhY3R1YWwgY29tbWFuZCBpbiBjbW5kICovCisJZG1hX2FkZHJfdAlwQ21kOworCV9fdTMyCQl0ZW1wOworCS8qIGlmIHRoaXMgY29tbWFuZCBpcyBhIHBjaV9zaW5nbGUgbWFwcGluZywgaG9sZHMgdGhlIGRtYSBhZGRyZXNzCisJICogZm9yIGxhdGVyIHVubWFwcGluZyBpbiB0aGUgZG9uZSByb3V0aW5lICovCisJZG1hX2FkZHJfdAlkbWFfaGFuZGxlOworCS8qIGhpc3RvcmljYWwgcmVtbmFudCwgbm93IHVzZWQgdG8gbGluayBmcmVlIGNvbW1hbmRzICovCisJc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICpJVExfZm9ydzsKK307CisKK3N0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyB7CisJLyogVGhlc2UgbXVzdCBiZSBmaWxsZWQgaW4gYnkgdGhlIGNhbGxpbmcgZHJpdmVyICovCisJaW50CWNsb2NrOwkJCS8qIGJvYXJkIGNsb2NrIHNwZWVkIGluIE1IeiAqLworCXVuc2lnbmVkIGxvbmcJYmFzZTsJCS8qIHRoZSBiYXNlIGZvciB0aGUgcG9ydCAoY29waWVkIHRvIGhvc3QpICovCisJc3RydWN0IGRldmljZQkqZGV2OworCV9fdTMyCWRtb2RlX2V4dHJhOwkvKiBhZGp1c3RhYmxlIGJ1cyBzZXR0aW5ncyAqLworCV9fdTMyCWRpZmZlcmVudGlhbDoxOwkvKiBpZiB3ZSBhcmUgZGlmZmVyZW50aWFsICovCisjaWZkZWYgQ09ORklHXzUzQzcwMF9MRV9PTl9CRQorCS8qIFRoaXMgb3B0aW9uIGlzIGZvciBIUCBvbmx5LiAgU2V0IGl0IGlmIHlvdXIgY2hpcCBpcyB3aXJlZCBmb3IKKwkgKiBsaXR0bGUgZW5kaWFuIG9uIHRoaXMgcGxhdGZvcm0gKHdoaWNoIGlzIGJpZyBlbmRpYW4pICovCisJX191MzIJZm9yY2VfbGVfb25fYmU6MTsKKyNlbmRpZgorCV9fdTMyCWNoaXA3MTA6MTsJLyogc2V0IGlmIHJlYWxseSBhIDcxMCBub3QgNzAwICovCisJX191MzIJYnVyc3RfZGlzYWJsZToxOwkvKiBzZXQgdG8gMSB0byBkaXNhYmxlIDcxMCBidXJzdGluZyAqLworCisJLyogTk9USElORyBCRUxPVyBIRVJFIE5FRURTIEFMVEVSSU5HICovCisJX191MzIJZmFzdDoxOwkJLyogaWYgd2UgY2FuIGFsdGVyIHRoZSBTQ1NJIGJ1cyBjbG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZCAoc28gY2FuIG5lZ2lvdGlhdGUgc3luYykgKi8KKyNpZmRlZiBDT05GSUdfNTNDNzAwX0JPVEhfTUFQUEVECisJX191MzIJbWVtX21hcHBlZDsJLyogc2V0IGlmIG1lbW9yeSBtYXBwZWQgKi8KKyNlbmRpZgorCWludAlzeW5jX2Nsb2NrOwkvKiBUaGUgc3BlZWQgb2YgdGhlIFNZTkMgY29yZSAqLworCisJX191MzIJKnNjcmlwdDsJCS8qIHBvaW50ZXIgdG8gc2NyaXB0IGxvY2F0aW9uICovCisJX191MzIJcFNjcmlwdDsJCS8qIHBoeXNpY2FsIG1lbSBhZGRyIG9mIHNjcmlwdCAqLworCisJZW51bSBOQ1JfNzAwX0hvc3RfU3RhdGUgc3RhdGU7IC8qIHByb3RlY3RlZCBieSBzdGF0ZSBsb2NrICovCisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCS8qIE5vdGU6IHBTY3JpcHQgY29udGFpbnMgdGhlIHNpbmdsZSBjb25zaXN0ZW50IGJsb2NrIG9mCisJICogbWVtb3J5LiAgQWxsIHRoZSBtc2dpbiwgbXNnb3V0IGFuZCBzdGF0dXMgYXJlIGFsbG9jYXRlZCBpbgorCSAqIHRoaXMgbWVtb3J5IHRvbyAoYXQgc2VwYXJhdGUgY2FjaGUgbGluZXMpLiAgVE9UQUxfTUVNX1NJWkUKKwkgKiByZXByZXNlbnRzIHRoZSB0b3RhbCBzaXplIG9mIHRoaXMgYXJlYSAqLworI2RlZmluZQlNU0dfQVJSQVlfU0laRQk4CisjZGVmaW5lCU1TR09VVF9PRkZTRVQJKEwxX0NBQ0hFX0FMSUdOKHNpemVvZihTQ1JJUFQpKSkKKwlfX3U4CSptc2dvdXQ7CisjZGVmaW5lIE1TR0lOX09GRlNFVAkoTVNHT1VUX09GRlNFVCArIEwxX0NBQ0hFX0FMSUdOKE1TR19BUlJBWV9TSVpFKSkKKwlfX3U4CSptc2dpbjsKKyNkZWZpbmUgU1RBVFVTX09GRlNFVAkoTVNHSU5fT0ZGU0VUICsgTDFfQ0FDSEVfQUxJR04oTVNHX0FSUkFZX1NJWkUpKQorCV9fdTgJKnN0YXR1czsKKyNkZWZpbmUgU0xPVFNfT0ZGU0VUCShTVEFUVVNfT0ZGU0VUICsgTDFfQ0FDSEVfQUxJR04oTVNHX0FSUkFZX1NJWkUpKQorCXN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdAkqc2xvdHM7CisjZGVmaW5lCVRPVEFMX01FTV9TSVpFCShTTE9UU19PRkZTRVQgKyBMMV9DQUNIRV9BTElHTihzaXplb2Yoc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90KSAqIE5DUl83MDBfQ09NTUFORF9TTE9UU19QRVJfSE9TVCkpCisJaW50CXNhdmVkX3Nsb3RfcG9zaXRpb247CisJaW50CWNvbW1hbmRfc2xvdF9jb3VudDsgLyogcHJvdGVjdGVkIGJ5IHN0YXRlIGxvY2sgKi8KKwlfX3U4CXRhZ19uZWdvdGlhdGVkOworCV9fdTgJcmV2OworCV9fdTgJcmVzZWxlY3Rpb25faWQ7CisJX191OAltaW5fcGVyaW9kOworCisJLyogRnJlZSBsaXN0LCBzaW5nbHkgbGlua2VkIGJ5IElUTF9mb3J3IGVsZW1lbnRzICovCisJc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICpmcmVlX2xpc3Q7CisJLyogQ29tcGxldGlvbiBmb3Igd2FpdGVkIGZvciBvcHMsIGxpa2UgcmVzZXQsIGFib3J0IG9yCisJICogZGV2aWNlIHJlc2V0LgorCSAqCisJICogTk9URTogcmVsaWVzIG9uIHNpbmdsZSB0aHJlYWRpbmcgaW4gdGhlIGVycm9yIGhhbmRsZXIgdG8KKwkgKiBoYXZlIG9ubHkgb25lIG91dHN0YW5kaW5nIGF0IG9uY2UgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiAqZWhfY29tcGxldGU7Cit9OworCisvKgorICoJNTNDNzAwIFJlZ2lzdGVyIEludGVyZmFjZSAtIHRoZSBvZmZzZXQgZnJvbSB0aGUgU2VsZWN0ZWQgYmFzZQorICoJSS9PIGFkZHJlc3MgKi8KKyNpZmRlZiBDT05GSUdfNTNDNzAwX0xFX09OX0JFCisjZGVmaW5lIGJFCShob3N0ZGF0YS0+Zm9yY2VfbGVfb25fYmUgPyAwIDogMykKKyNkZWZpbmUJYlNXQVAJKGhvc3RkYXRhLT5mb3JjZV9sZV9vbl9iZSkKKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorI2RlZmluZSBiRQkzCisjZGVmaW5lIGJTV0FQCTAKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorI2RlZmluZSBiRQkwCisjZGVmaW5lIGJTV0FQCTAKKyNlbHNlCisjZXJyb3IgIl9fQklHX0VORElBTiBvciBfX0xJVFRMRV9FTkRJQU4gbXVzdCBiZSBkZWZpbmVkLCBkaWQgeW91IGluY2x1ZGUgYnl0ZW9yZGVyLmg/IgorI2VuZGlmCisjZGVmaW5lIGJTX3RvX2NwdSh4KQkoYlNXQVAgPyBsZTMyX3RvX2NwdSh4KSA6ICh4KSkKKyNkZWZpbmUgYlNfdG9faG9zdCh4KQkoYlNXQVAgPyBjcHVfdG9fbGUzMih4KSA6ICh4KSkKKworLyogTk9URTogVGhlc2UgcmVnaXN0ZXJzIGFyZSBpbiB0aGUgTEUgcmVnaXN0ZXIgc3BhY2Ugb25seSwgdGhlIHJlcXVpcmVkIGJ5dGUKKyAqIHN3YXBwaW5nIGlzIGRvbmUgYnkgdGhlIE5DUl83MDBfe3JlYWR8d3JpdGV9W2JdIGZ1bmN0aW9ucyAqLworI2RlZmluZQlTQ05UTDBfUkVHCQkJMHgwMAorI2RlZmluZQkJRlVMTF9BUkJJVFJBVElPTgkweGMwCisjZGVmaW5lIAlQQVJJVFkJCQkweDA4CisjZGVmaW5lCQlFTkFCTEVfUEFSSVRZCQkweDA0CisjZGVmaW5lIAlBVVRPX0FUTgkJMHgwMgorI2RlZmluZQlTQ05UTDFfUkVHCQkJMHgwMQorI2RlZmluZSAJU0xPV19CVVMJCTB4ODAKKyNkZWZpbmUJCUVOQUJMRV9TRUxFQ1QJCTB4MjAKKyNkZWZpbmUJCUFTU0VSVF9SU1QJCTB4MDgKKyNkZWZpbmUJCUFTU0VSVF9FVkVOX1BBUklUWQkweDA0CisjZGVmaW5lCVNESURfUkVHCQkJMHgwMgorI2RlZmluZQlTSUVOX1JFRwkJCTB4MDMKKyNkZWZpbmUgCVBIQVNFX01NX0lOVAkJMHg4MAorI2RlZmluZSAJRlVOQ19DT01QX0lOVAkJMHg0MAorI2RlZmluZSAJU0VMX1RJTUVPVVRfSU5UCQkweDIwCisjZGVmaW5lIAlTRUxFQ1RfSU5UCQkweDEwCisjZGVmaW5lIAlHUk9TU19FUlJfSU5UCQkweDA4CisjZGVmaW5lIAlVWF9ESVNDX0lOVAkJMHgwNAorI2RlZmluZSAJUlNUX0lOVAkJCTB4MDIKKyNkZWZpbmUgCVBBUl9FUlJfSU5UCQkweDAxCisjZGVmaW5lCVNDSURfUkVHCQkJMHgwNAorI2RlZmluZSBTWEZFUl9SRUcJCQkweDA1CisjZGVmaW5lCQlBU1lOQ19PUEVSQVRJT04JCTB4MDAKKyNkZWZpbmUgU09ETF9SRUcgICAgICAgICAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lCVNPQ0xfUkVHCQkJMHgwNworI2RlZmluZQlTRkJSX1JFRwkJCTB4MDgKKyNkZWZpbmUJU0lETF9SRUcJCQkweDA5CisjZGVmaW5lCVNCRExfUkVHCQkJMHgwQQorI2RlZmluZQlTQkNMX1JFRwkJCTB4MEIKKy8qIHJlYWQgYml0cyAqLworI2RlZmluZQkJU0JDTF9JTwkJCTB4MDEKKy8qd3JpdGUgYml0cyAqLworI2RlZmluZQkJU1lOQ19ESVZfQVNfQVNZTkMJMHgwMAorI2RlZmluZQkJU1lOQ19ESVZfMV8wCQkweDAxCisjZGVmaW5lCQlTWU5DX0RJVl8xXzUJCTB4MDIKKyNkZWZpbmUJCVNZTkNfRElWXzJfMAkJMHgwMworI2RlZmluZQlEU1RBVF9SRUcJCQkweDBDCisjZGVmaW5lCQlJTEdMX0lOU1RfREVURUNURUQJMHgwMQorI2RlZmluZQkJV0FUQ0hfRE9HX0lOVEVSUlVQVAkweDAyCisjZGVmaW5lCQlTQ1JJUFRfSU5UX1JFQ0VJVkVECTB4MDQKKyNkZWZpbmUJCUFCT1JURUQJCQkweDEwCisjZGVmaW5lCVNTVEFUMF9SRUcJCQkweDBECisjZGVmaW5lCQlQQVJJVFlfRVJST1IJCTB4MDEKKyNkZWZpbmUJCVNDU0lfUkVTRVRfREVURUNURUQJMHgwMgorI2RlZmluZQkJVU5FWFBFQ1RFRF9ESVNDT05ORUNUCTB4MDQKKyNkZWZpbmUJCVNDU0lfR1JPU1NfRVJST1IJMHgwOAorI2RlZmluZQkJU0VMRUNURUQJCTB4MTAKKyNkZWZpbmUJCVNFTEVDVElPTl9USU1FT1VUCTB4MjAKKyNkZWZpbmUJCUZVTkNUSU9OX0NPTVBMRVRFCTB4NDAKKyNkZWZpbmUJCVBIQVNFX01JU01BVENIIAkJMHg4MAorI2RlZmluZQlTU1RBVDFfUkVHCQkJMHgwRQorI2RlZmluZQkJU0lETF9SRUdfRlVMTAkJMHg4MAorI2RlZmluZQkJU09EUl9SRUdfRlVMTAkJMHg0MAorI2RlZmluZQkJU09ETF9SRUdfRlVMTAkJMHgyMAorI2RlZmluZSBTU1RBVDJfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MEYKKyNkZWZpbmUgQ1RFU1QwX1JFRyAgICAgICAgICAgICAgICAgICAgICAweDE0CisjZGVmaW5lCQlCVEJfVElNRVJfRElTQUJMRQkweDQwCisjZGVmaW5lIENURVNUMV9SRUcgICAgICAgICAgICAgICAgICAgICAgMHgxNQorI2RlZmluZSBDVEVTVDJfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MTYKKyNkZWZpbmUgQ1RFU1QzX1JFRyAgICAgICAgICAgICAgICAgICAgICAweDE3CisjZGVmaW5lIENURVNUNF9SRUcgICAgICAgICAgICAgICAgICAgICAgMHgxOAorI2RlZmluZSAgICAgICAgIERJU0FCTEVfRklGTyAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgICAgICBTTEJFICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lICAgICAgICAgU0ZXUiAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSAgICAgICAgIEJZVEVfTEFORTAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgICAgICAgICBCWVRFX0xBTkUxICAgICAgICAgICAgICAweDA1CisjZGVmaW5lICAgICAgICAgQllURV9MQU5FMiAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSAgICAgICAgIEJZVEVfTEFORTMgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgICAgICAgICBTQ1NJX1pNT0RFICAgICAgICAgICAgICAweDIwCisjZGVmaW5lICAgICAgICAgWk1PREUgICAgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBDVEVTVDVfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MTkKKyNkZWZpbmUgICAgICAgICBNQVNURVJfQ09OVFJPTCAgICAgICAgICAweDEwCisjZGVmaW5lICAgICAgICAgRE1BX0RJUkVDVElPTiAgICAgICAgICAgMHgwOAorI2RlZmluZSBDVEVTVDdfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MUIKKyNkZWZpbmUJCUJVUlNUX0RJU0FCTEUJCTB4ODAgLyogNzEwIG9ubHkgKi8KKyNkZWZpbmUJCVNFTF9USU1FT1VUX0RJU0FCTEUJMHgxMCAvKiA3MTAgb25seSAqLworI2RlZmluZSAgICAgICAgIERGUCAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgICAgICAgICBFVlAgICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lCQlESUZGCQkJMHgwMQorI2RlZmluZSBDVEVTVDZfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MUEKKyNkZWZpbmUJVEVNUF9SRUcJCQkweDFDCisjZGVmaW5lCURGSUZPX1JFRwkJCTB4MjAKKyNkZWZpbmUJCUZMVVNIX0RNQV9GSUZPCQkweDgwCisjZGVmaW5lCQlDTFJfRklGTwkJMHg0MAorI2RlZmluZQlJU1RBVF9SRUcJCQkweDIxCisjZGVmaW5lCQlBQk9SVF9PUEVSQVRJT04JCTB4ODAKKyNkZWZpbmUJCVNPRlRXQVJFX1JFU0VUXzcxMAkweDQwCisjZGVmaW5lCQlETUFfSU5UX1BFTkRJTkcJCTB4MDEKKyNkZWZpbmUJCVNDU0lfSU5UX1BFTkRJTkcJMHgwMgorI2RlZmluZQkJQ09OTkVDVEVECQkweDA4CisjZGVmaW5lIENURVNUOF9SRUcgICAgICAgICAgICAgICAgICAgICAgMHgyMgorI2RlZmluZSAgICAgICAgIExBU1RfRElTX0VOQkwgICAgICAgICAgIDB4MDEKKyNkZWZpbmUJCVNIT1JURU5fRklMVEVSSU5HCTB4MDQKKyNkZWZpbmUJCUVOQUJMRV9BQ1RJVkVfTkVHQVRJT04JMHgxMAorI2RlZmluZQkJR0VORVJBVEVfUkVDRUlWRV9QQVJJVFkJMHgyMAorI2RlZmluZQkJQ0xSX0ZJRk9fNzEwCQkweDA0CisjZGVmaW5lCQlGTFVTSF9ETUFfRklGT183MTAJMHgwOAorI2RlZmluZSBDVEVTVDlfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MjMKKyNkZWZpbmUJREJDX1JFRwkJCQkweDI0CisjZGVmaW5lCURDTURfUkVHCQkJMHgyNworI2RlZmluZQlETkFEX1JFRwkJCTB4MjgKKyNkZWZpbmUJRElFTl9SRUcJCQkweDM5CisjZGVmaW5lCQlCVVNfRkFVTFQJCTB4MjAKKyNkZWZpbmUgCUFCT1JUX0lOVAkJMHgxMAorI2RlZmluZSAJSU5UX0lOU1RfSU5UCQkweDA0CisjZGVmaW5lIAlXRF9JTlQJCQkweDAyCisjZGVmaW5lIAlJTEdMX0lOU1RfSU5UCQkweDAxCisjZGVmaW5lCURDTlRMX1JFRwkJCTB4M0IKKyNkZWZpbmUJCVNPRlRXQVJFX1JFU0VUCQkweDAxCisjZGVmaW5lCQlDT01QQVRfNzAwX01PREUJCTB4MDEKKyNkZWZpbmUgCVNDUlBUU18xNkJJVFMJCTB4MjAKKyNkZWZpbmUJCUFTWU5DX0RJVl8yXzAJCTB4MDAKKyNkZWZpbmUJCUFTWU5DX0RJVl8xXzUJCTB4NDAKKyNkZWZpbmUJCUFTWU5DX0RJVl8xXzAJCTB4ODAKKyNkZWZpbmUJCUFTWU5DX0RJVl8zXzAJCTB4YzAKKyNkZWZpbmUgRE1PREVfNzEwX1JFRwkJCTB4MzgKKyNkZWZpbmUJRE1PREVfNzAwX1JFRwkJCTB4MzQKKyNkZWZpbmUJCUJVUlNUX0xFTkdUSF8xCQkweDAwCisjZGVmaW5lCQlCVVJTVF9MRU5HVEhfMgkJMHg0MAorI2RlZmluZQkJQlVSU1RfTEVOR1RIXzQJCTB4ODAKKyNkZWZpbmUJCUJVUlNUX0xFTkdUSF84CQkweEMwCisjZGVmaW5lCQlETU9ERV9GQzEJCTB4MTAKKyNkZWZpbmUJCURNT0RFX0ZDMgkJMHgyMAorI2RlZmluZSAJQlcxNgkJCTMyIAorI2RlZmluZSAJTU9ERV8yODYJCTE2CisjZGVmaW5lIAlJT19YRkVSCQkJOAorI2RlZmluZSAJRklYRURfQUREUgkJNAorCisjZGVmaW5lIERTUF9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgMHgyQworI2RlZmluZSBEU1BTX1JFRyAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAKKworLyogUGFyYW1ldGVycyB0byBiZWdpbiBTRFRSIG5lZ290aWF0aW9ucy4gIEVtcGlyaWNhbGx5LCBJIGZpbmQgdGhhdAorICogdGhlIDUzYzcwMC02NiBjYW5ub3QgaGFuZGxlIGFuIG9mZnNldCA+OCwgc28gZG9uJ3QgY2hhbmdlIHRoaXMgICovCisjZGVmaW5lIE5DUl83MDBfTUFYX09GRlNFVAk4CisvKiBXYXMgaG9waW5nIHRoZSBtYXggb2Zmc2V0IHdvdWxkIGJlIGdyZWF0ZXIgZm9yIHRoZSA3MTAsIGJ1dAorICogZW1waXJpY2FsbHkgaXQgc2VlbXMgdG8gYmUgOCBhbHNvICovCisjZGVmaW5lIE5DUl83MTBfTUFYX09GRlNFVAk4CisjZGVmaW5lIE5DUl83MDBfTUlOX1hGRVJQCTEKKyNkZWZpbmUgTkNSXzcxMF9NSU5fWEZFUlAJMAorI2RlZmluZSBOQ1JfNzAwX01JTl9QRVJJT0QJMjUgLyogZm9yIFNEVFIgbWVzc2FnZSwgMTAwbnMgKi8KKworI2RlZmluZSBzY3JpcHRfcGF0Y2hfMzIoc2NyaXB0LCBzeW1ib2wsIHZhbHVlKSBcCit7IFwKKwlpbnQgaTsgXAorCWZvcihpPTA7IGk8IChzaXplb2YoQV8jI3N5bWJvbCMjX3VzZWQpIC8gc2l6ZW9mKF9fdTMyKSk7IGkrKykgeyBcCisJCV9fdTMyIHZhbCA9IGJTX3RvX2NwdSgoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXV0pICsgdmFsdWU7IFwKKwkJKHNjcmlwdClbQV8jI3N5bWJvbCMjX3VzZWRbaV1dID0gYlNfdG9faG9zdCh2YWwpOyBcCisJCWRtYV9jYWNoZV9zeW5jKCYoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXV0sIDQsIERNQV9UT19ERVZJQ0UpOyBcCisJCURFQlVHKCgiIHNjcmlwdCwgcGF0Y2hpbmcgJXMgYXQgJWQgdG8gMHglbHhcbiIsIFwKKwkJICAgICAgICNzeW1ib2wsIEFfIyNzeW1ib2wjI191c2VkW2ldLCAodmFsdWUpKSk7IFwKKwl9IFwKK30KKworI2RlZmluZSBzY3JpcHRfcGF0Y2hfMzJfYWJzKHNjcmlwdCwgc3ltYm9sLCB2YWx1ZSkgXAoreyBcCisJaW50IGk7IFwKKwlmb3IoaT0wOyBpPCAoc2l6ZW9mKEFfIyNzeW1ib2wjI191c2VkKSAvIHNpemVvZihfX3UzMikpOyBpKyspIHsgXAorCQkoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXV0gPSBiU190b19ob3N0KHZhbHVlKTsgXAorCQlkbWFfY2FjaGVfc3luYygmKHNjcmlwdClbQV8jI3N5bWJvbCMjX3VzZWRbaV1dLCA0LCBETUFfVE9fREVWSUNFKTsgXAorCQlERUJVRygoIiBzY3JpcHQsIHBhdGNoaW5nICVzIGF0ICVkIHRvIDB4JWx4XG4iLCBcCisJCSAgICAgICAjc3ltYm9sLCBBXyMjc3ltYm9sIyNfdXNlZFtpXSwgKHZhbHVlKSkpOyBcCisJfSBcCit9CisKKy8qIFVzZWQgZm9yIHBhdGNoaW5nIHRoZSBTQ1NJIElEIGluIHRoZSBTRUxFQ1QgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgc2NyaXB0X3BhdGNoX0lEKHNjcmlwdCwgc3ltYm9sLCB2YWx1ZSkgXAoreyBcCisJaW50IGk7IFwKKwlmb3IoaT0wOyBpPCAoc2l6ZW9mKEFfIyNzeW1ib2wjI191c2VkKSAvIHNpemVvZihfX3UzMikpOyBpKyspIHsgXAorCQlfX3UzMiB2YWwgPSBiU190b19jcHUoKHNjcmlwdClbQV8jI3N5bWJvbCMjX3VzZWRbaV1dKTsgXAorCQl2YWwgJj0gMHhmZjAwZmZmZjsgXAorCQl2YWwgfD0gKCh2YWx1ZSkgJiAweGZmKSA8PCAxNjsgXAorCQkoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXV0gPSBiU190b19ob3N0KHZhbCk7IFwKKwkJZG1hX2NhY2hlX3N5bmMoJihzY3JpcHQpW0FfIyNzeW1ib2wjI191c2VkW2ldXSwgNCwgRE1BX1RPX0RFVklDRSk7IFwKKwkJREVCVUcoKCIgc2NyaXB0LCBwYXRjaGluZyBJRCBmaWVsZCAlcyBhdCAlZCB0byAweCV4XG4iLCBcCisJCSAgICAgICAjc3ltYm9sLCBBXyMjc3ltYm9sIyNfdXNlZFtpXSwgdmFsKSk7IFwKKwl9IFwKK30KKworI2RlZmluZSBzY3JpcHRfcGF0Y2hfMTYoc2NyaXB0LCBzeW1ib2wsIHZhbHVlKSBcCit7IFwKKwlpbnQgaTsgXAorCWZvcihpPTA7IGk8IChzaXplb2YoQV8jI3N5bWJvbCMjX3VzZWQpIC8gc2l6ZW9mKF9fdTMyKSk7IGkrKykgeyBcCisJCV9fdTMyIHZhbCA9IGJTX3RvX2NwdSgoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXV0pOyBcCisJCXZhbCAmPSAweGZmZmYwMDAwOyBcCisJCXZhbCB8PSAoKHZhbHVlKSAmIDB4ZmZmZik7IFwKKwkJKHNjcmlwdClbQV8jI3N5bWJvbCMjX3VzZWRbaV1dID0gYlNfdG9faG9zdCh2YWwpOyBcCisJCWRtYV9jYWNoZV9zeW5jKCYoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXV0sIDQsIERNQV9UT19ERVZJQ0UpOyBcCisJCURFQlVHKCgiIHNjcmlwdCwgcGF0Y2hpbmcgc2hvcnQgZmllbGQgJXMgYXQgJWQgdG8gMHgleFxuIiwgXAorCQkgICAgICAgI3N5bWJvbCwgQV8jI3N5bWJvbCMjX3VzZWRbaV0sIHZhbCkpOyBcCisJfSBcCit9CisKKworc3RhdGljIGlubGluZSBfX3U4CitOQ1JfNzAwX21lbV9yZWFkYihzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBfX3UzMiByZWcpCit7CisJY29uc3Qgc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCQk9IChzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKworCXJldHVybiByZWFkYihob3N0LT5iYXNlICsgKHJlZ15iRSkpOworfQorCitzdGF0aWMgaW5saW5lIF9fdTMyCitOQ1JfNzAwX21lbV9yZWFkbChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBfX3UzMiByZWcpCit7CisJX191MzIgdmFsdWUgPSBfX3Jhd19yZWFkbChob3N0LT5iYXNlICsgcmVnKTsKKwljb25zdCBzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisJCT0gKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqKWhvc3QtPmhvc3RkYXRhWzBdOworI2lmIDEKKwkvKiBzYW5pdHkgY2hlY2sgdGhlIHJlZ2lzdGVyICovCisJaWYoKHJlZyAmIDB4MykgIT0gMCkKKwkJQlVHKCk7CisjZW5kaWYKKworCXJldHVybiBiU190b19jcHUodmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK05DUl83MDBfbWVtX3dyaXRlYihfX3U4IHZhbHVlLCBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBfX3UzMiByZWcpCit7CisJY29uc3Qgc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCQk9IChzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKworCXdyaXRlYih2YWx1ZSwgaG9zdC0+YmFzZSArIChyZWdeYkUpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitOQ1JfNzAwX21lbV93cml0ZWwoX191MzIgdmFsdWUsIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIF9fdTMyIHJlZykKK3sKKwljb25zdCBzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisJCT0gKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqKWhvc3QtPmhvc3RkYXRhWzBdOworCisjaWYgMQorCS8qIHNhbml0eSBjaGVjayB0aGUgcmVnaXN0ZXIgKi8KKwlpZigocmVnICYgMHgzKSAhPSAwKQorCQlCVUcoKTsKKyNlbmRpZgorCisJX19yYXdfd3JpdGVsKGJTX3RvX2hvc3QodmFsdWUpLCBob3N0LT5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSBfX3U4CitOQ1JfNzAwX2lvX3JlYWRiKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIF9fdTMyIHJlZykKK3sKKwljb25zdCBzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisJCT0gKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqKWhvc3QtPmhvc3RkYXRhWzBdOworCisJcmV0dXJuIGluYihob3N0LT5iYXNlICsgKHJlZ15iRSkpOworfQorCitzdGF0aWMgaW5saW5lIF9fdTMyCitOQ1JfNzAwX2lvX3JlYWRsKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIF9fdTMyIHJlZykKK3sKKwlfX3UzMiB2YWx1ZSA9IGlubChob3N0LT5iYXNlICsgcmVnKTsKKwljb25zdCBzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisJCT0gKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqKWhvc3QtPmhvc3RkYXRhWzBdOworCisjaWYgMQorCS8qIHNhbml0eSBjaGVjayB0aGUgcmVnaXN0ZXIgKi8KKwlpZigocmVnICYgMHgzKSAhPSAwKQorCQlCVUcoKTsKKyNlbmRpZgorCisJcmV0dXJuIGJTX3RvX2NwdSh2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorTkNSXzcwMF9pb193cml0ZWIoX191OCB2YWx1ZSwgc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgX191MzIgcmVnKQoreworCWNvbnN0IHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKwkJPSAoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICopaG9zdC0+aG9zdGRhdGFbMF07CisKKwlvdXRiKHZhbHVlLCBob3N0LT5iYXNlICsgKHJlZ15iRSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK05DUl83MDBfaW9fd3JpdGVsKF9fdTMyIHZhbHVlLCBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBfX3UzMiByZWcpCit7CisJY29uc3Qgc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCQk9IChzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKworI2lmIDEKKwkvKiBzYW5pdHkgY2hlY2sgdGhlIHJlZ2lzdGVyICovCisJaWYoKHJlZyAmIDB4MykgIT0gMCkKKwkJQlVHKCk7CisjZW5kaWYKKworCW91dGwoYlNfdG9faG9zdCh2YWx1ZSksIGhvc3QtPmJhc2UgKyByZWcpOworfQorCisjaWZkZWYgQ09ORklHXzUzQzcwMF9CT1RIX01BUFBFRAorCitzdGF0aWMgaW5saW5lIF9fdTgKK05DUl83MDBfcmVhZGIoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgX191MzIgcmVnKQoreworCV9fdTggdmFsOworCisJY29uc3Qgc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCQk9IChzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKworCWlmKGhvc3RkYXRhLT5tZW1fbWFwcGVkKQorCQl2YWwgPSBOQ1JfNzAwX21lbV9yZWFkYihob3N0LCByZWcpOworCWVsc2UKKwkJdmFsID0gTkNSXzcwMF9pb19yZWFkYihob3N0LCByZWcpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSBfX3UzMgorTkNSXzcwMF9yZWFkbChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBfX3UzMiByZWcpCit7CisJX191MzIgdmFsOworCisJY29uc3Qgc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCQk9IChzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKworCWlmKGhvc3RkYXRhLT5tZW1fbWFwcGVkKQorCQl2YWwgPSBOQ1JfNzAwX21lbV9yZWFkbChob3N0LCByZWcpOworCWVsc2UKKwkJdmFsID0gTkNSXzcwMF9pb19yZWFkbChob3N0LCByZWcpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitOQ1JfNzAwX3dyaXRlYihfX3U4IHZhbHVlLCBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBfX3UzMiByZWcpCit7CisJY29uc3Qgc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCQk9IChzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKworCWlmKGhvc3RkYXRhLT5tZW1fbWFwcGVkKQorCQlOQ1JfNzAwX21lbV93cml0ZWIodmFsdWUsIGhvc3QsIHJlZyk7CisJZWxzZQorCQlOQ1JfNzAwX2lvX3dyaXRlYih2YWx1ZSwgaG9zdCwgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitOQ1JfNzAwX3dyaXRlbChfX3UzMiB2YWx1ZSwgc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgX191MzIgcmVnKQoreworCWNvbnN0IHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKwkJPSAoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICopaG9zdC0+aG9zdGRhdGFbMF07CisKKwlpZihob3N0ZGF0YS0+bWVtX21hcHBlZCkKKwkJTkNSXzcwMF9tZW1fd3JpdGVsKHZhbHVlLCBob3N0LCByZWcpOworCWVsc2UKKwkJTkNSXzcwMF9pb193cml0ZWwodmFsdWUsIGhvc3QsIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorTkNSXzcwMF9zZXRfbWVtX21hcHBlZChzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhKQoreworCWhvc3RkYXRhLT5tZW1fbWFwcGVkID0gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitOQ1JfNzAwX3NldF9pb19tYXBwZWQoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSkKK3sKKwlob3N0ZGF0YS0+bWVtX21hcHBlZCA9IDA7Cit9CisKKworI2VsaWYgZGVmaW5lZChDT05GSUdfNTNDNzAwX0lPX01BUFBFRCkKKworI2RlZmluZSBOQ1JfNzAwX3JlYWRiIE5DUl83MDBfaW9fcmVhZGIKKyNkZWZpbmUgTkNSXzcwMF9yZWFkbCBOQ1JfNzAwX2lvX3JlYWRsCisjZGVmaW5lIE5DUl83MDBfd3JpdGViIE5DUl83MDBfaW9fd3JpdGViCisjZGVmaW5lIE5DUl83MDBfd3JpdGVsIE5DUl83MDBfaW9fd3JpdGVsCisKKyNkZWZpbmUgTkNSXzcwMF9zZXRfaW9fbWFwcGVkKHgpCisjZGVmaW5lIE5DUl83MDBfc2V0X21lbV9tYXBwZWQoeCkJZXJyb3IgSS9PIG1hcHBlZCBvbmx5CisKKyNlbGlmIGRlZmluZWQoQ09ORklHXzUzQzcwMF9NRU1fTUFQUEVEKQorCisjZGVmaW5lIE5DUl83MDBfcmVhZGIgTkNSXzcwMF9tZW1fcmVhZGIKKyNkZWZpbmUgTkNSXzcwMF9yZWFkbCBOQ1JfNzAwX21lbV9yZWFkbAorI2RlZmluZSBOQ1JfNzAwX3dyaXRlYiBOQ1JfNzAwX21lbV93cml0ZWIKKyNkZWZpbmUgTkNSXzcwMF93cml0ZWwgTkNSXzcwMF9tZW1fd3JpdGVsCisKKyNkZWZpbmUgTkNSXzcwMF9zZXRfaW9fbWFwcGVkKHgpCWVycm9yIE1FTSBtYXBwZWQgb25seQorI2RlZmluZSBOQ1JfNzAwX3NldF9tZW1fbWFwcGVkKHgpCisKKyNlbHNlCisjZXJyb3IgbmVpdGhlciBDT05GSUdfNTNDNzAwX01FTV9NQVBQRUQgbm9yIENPTkZJR181M0M3MDBfSU9fTUFQUEVEIGlzIHNldAorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpLzUzYzcwMC5zY3IgYi9kcml2ZXJzL3Njc2kvNTNjNzAwLnNjcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDY0YTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpLzUzYzcwMC5zY3IKQEAgLTAsMCArMSw0MTEgQEAKKzsgU2NyaXB0IGZvciB0aGUgTkNSIChvciBzeW1iaW9zKSA1M2M3MDAgYW5kIDUzYzcwMC02NiBjaGlwCis7Cis7IENvcHlyaWdodCAoQykgMjAwMSBKYW1lcy5Cb3R0b21sZXlASGFuc2VuUGFydG5lcnNoaXAuY29tCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OyAgCis7OyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKzs7ICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCis7OyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzs7Cis7OyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7OyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzs7ICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCis7OyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzs7Cis7OyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKzs7ICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOzsgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorOzsKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgVGhpcyBzY3JpcHQgaXMgZGVzaWduZWQgdG8gYmUgbW9kaWZpZWQgZm9yIHRoZSBwYXJ0aWN1bGFyIGNvbW1hbmQgaW4KKzsgb3BlcmF0aW9uLiAgVGhlIHBhcnRpY3VsYXIgdmFyaWFibGVzIHBlcnRhaW5pbmcgdG8gdGhlIGNvbW1hbmRzIGFyZToKKzsKK0FCU09MVVRFCURldmljZV9JRCA9IDAJCTsgSUQgb2YgdGFyZ2V0IGZvciBjb21tYW5kCitBQlNPTFVURQlNZXNzYWdlQ291bnQgPSAwCTsgTnVtYmVyIG9mIGJ5dGVzIGluIG1lc3NhZ2UKK0FCU09MVVRFCU1lc3NhZ2VMb2NhdGlvbiA9IDAJOyBBZGRyIG9mIG1lc3NhZ2UKK0FCU09MVVRFCUNvbW1hbmRDb3VudCA9IDAJOyBOdW1iZXIgb2YgYnl0ZXMgaW4gY29tbWFuZAorQUJTT0xVVEUJQ29tbWFuZEFkZHJlc3MgPSAwCTsgQWRkciBvZiBDb21tYW5kCitBQlNPTFVURQlTdGF0dXNBZGRyZXNzID0gMAk7IEFkZHIgdG8gcmVjZWl2ZSBzdGF0dXMgcmV0dXJuCitBQlNPTFVURQlSZWNlaXZlTXNnQWRkcmVzcyA9IDAJOyBBZGRyIHRvIHJlY2VpdmUgbXNnCis7Cis7IFRoaXMgaXMgdGhlIG1hZ2ljIGNvbXBvbmVudCBmb3IgaGFuZGxpbmcgc2NhdHRlci1nYXRoZXIuICBFYWNoIG9mIHRoZQorOyBTRyBjb21wb25lbnRzIGlzIHByZWNlZWRlZCBieSBhIHNjcmlwdCBmcmFnbWVudCB3aGljaCBtb3ZlcyB0aGUKKzsgbmVjZXNzYXJ5IGFtb3VudCBvZiBkYXRhIGFuZCBqdW1wcyB0byB0aGUgbmV4dCBTRyBzZWdtZW50LiAgVGhlIGZpbmFsCis7IFNHIHNlZ21lbnQganVtcHMgYmFjayB0byAuICBIb3dldmVyLCB0aGlzIGFkZHJlc3MgaXMgdGhlIGZpcnN0IFNHIHNjcmlwdAorOyBzZWdtZW50LgorOworQUJTT0xVVEUJU0dTY3JpcHRTdGFydEFkZHJlc3MgPSAwCisKKzsgVGhlIGZvbGxvd2luZyByZXByZXNlbnQgc3RhdHVzIGludGVycnVwdHMgd2UgdXNlIDMgaGV4IGRpZ2l0cyBmb3IKKzsgdGhpczogMHhQUlMgd2hlcmUgCisKKzsgUDoKK0FCU09MVVRFCUFGVEVSX1NFTEVDVElPTiAJPSAweDEwMAorQUJTT0xVVEUJQkVGT1JFX0NNRCAJCT0gMHgyMDAKK0FCU09MVVRFCUFGVEVSX0NNRCAJCT0gMHgzMDAKK0FCU09MVVRFCUFGVEVSX1NUQVRVUyAJCT0gMHg0MDAKK0FCU09MVVRFCUFGVEVSX0RBVEFfSU4JCT0gMHg1MDAKK0FCU09MVVRFCUFGVEVSX0RBVEFfT1VUCQk9IDB4NjAwCitBQlNPTFVURQlEVVJJTkdfREFUQV9JTgkJPSAweDcwMAorCis7IFI6CitBQlNPTFVURQlOT1RfTVNHX09VVCAJCT0gMHgxMAorQUJTT0xVVEUJVU5FWFBFQ1RFRF9QSEFTRSAJPSAweDIwCitBQlNPTFVURQlOT1RfTVNHX0lOIAkJPSAweDMwCitBQlNPTFVURQlVTkVYUEVDVEVEX01TRwkJPSAweDQwCitBQlNPTFVURQlNU0dfSU4JCQk9IDB4NTAKK0FCU09MVVRFCVNEVFJfTVNHX1IJCT0gMHg2MAorQUJTT0xVVEUJUkVKRUNUX01TR19SCQk9IDB4NzAKK0FCU09MVVRFCURJU0NPTk5FQ1QJCT0gMHg4MAorQUJTT0xVVEUJTVNHX09VVAkJCT0gMHg5MAorQUJTT0xVVEUJV0RUUl9NU0dfUgkJPSAweEEwCisKKzsgUzoKK0FCU09MVVRFCUdPT0RfU1RBVFVTIAkJPSAweDEKKworOyBDb21iaW5hdGlvbnMsIHNpbmNlIHRoZSBzY3JpcHQgYXNzZW1ibGVyIGNhbid0IHByb2Nlc3MgfAorQUJTT0xVVEUJTk9UX01TR19PVVRfQUZURVJfU0VMRUNUSU9OID0gMHgxMTAKK0FCU09MVVRFCVVORVhQRUNURURfUEhBU0VfQkVGT1JFX0NNRCA9IDB4MjIwCitBQlNPTFVURQlVTkVYUEVDVEVEX1BIQVNFX0FGVEVSX0NNRCA9IDB4MzIwCitBQlNPTFVURQlOT1RfTVNHX0lOX0FGVEVSX1NUQVRVUyA9IDB4NDMwCitBQlNPTFVURQlHT09EX1NUQVRVU19BRlRFUl9TVEFUVVMgPSAweDQwMQorQUJTT0xVVEUJVU5FWFBFQ1RFRF9QSEFTRV9BRlRFUl9EQVRBX0lOID0gMHg1MjAKK0FCU09MVVRFCVVORVhQRUNURURfUEhBU0VfQUZURVJfREFUQV9PVVQgPSAweDYyMAorQUJTT0xVVEUJVU5FWFBFQ1RFRF9NU0dfQkVGT1JFX0NNRCA9IDB4MjQwCitBQlNPTFVURQlNU0dfSU5fQkVGT1JFX0NNRCA9IDB4MjUwCitBQlNPTFVURQlNU0dfSU5fQUZURVJfQ01EID0gMHgzNTAKK0FCU09MVVRFCVNEVFJfTVNHX0JFRk9SRV9DTUQgPSAweDI2MAorQUJTT0xVVEUJUkVKRUNUX01TR19CRUZPUkVfQ01EID0gMHgyNzAKK0FCU09MVVRFCURJU0NPTk5FQ1RfQUZURVJfQ01EID0gMHgzODAKK0FCU09MVVRFCVNEVFJfTVNHX0FGVEVSX0NNRCA9IDB4MzYwCitBQlNPTFVURQlXRFRSX01TR19BRlRFUl9DTUQgPSAweDNBMAorQUJTT0xVVEUJTVNHX0lOX0FGVEVSX1NUQVRVUyA9IDB4NDQwCitBQlNPTFVURQlESVNDT05ORUNUX0FGVEVSX0RBVEEgPSAweDU4MAorQUJTT0xVVEUJTVNHX0lOX0FGVEVSX0RBVEFfSU4gPSAweDU1MAorQUJTT0xVVEUJTVNHX0lOX0FGVEVSX0RBVEFfT1VUID0gMHg2NTAKK0FCU09MVVRFCU1TR19PVVRfQUZURVJfREFUQV9JTiA9IDB4NTkwCitBQlNPTFVURQlEQVRBX0lOX0FGVEVSX0RBVEFfSU4gPSAweDVhMAorQUJTT0xVVEUJTVNHX0lOX0RVUklOR19EQVRBX0lOID0gMHg3NTAKK0FCU09MVVRFCURJU0NPTk5FQ1RfRFVSSU5HX0RBVEEgPSAweDc4MAorCis7Cis7IE90aGVyIGludGVycnVwdCBjb25kaXRpb25zCis7IAorQUJTT0xVVEUJUkVTRUxFQ1RFRF9EVVJJTkdfU0VMRUNUSU9OID0gMHgxMDAwCitBQlNPTFVURQlDT01QTEVURURfU0VMRUNUSU9OX0FTX1RBUkdFVCA9IDB4MTAwMQorQUJTT0xVVEUJUkVTRUxFQ1RJT05fSURFTlRJRklFRCA9IDB4MTAwMworOworOyBGYXRhbCBpbnRlcnJ1cHQgY29uZGl0aW9ucy4gIElmIHlvdSBhZGQgdG8gdGhpcywgYWxzbyBhZGQgdG8gdGhlCis7IGFycmF5IG9mIGNvcnJlc3BvbmRpbmcgbWVzc2FnZXMKKzsKK0FCU09MVVRFCUZBVEFMID0gMHgyMDAwCitBQlNPTFVURQlGQVRBTF9VTkVYUEVDVEVEX1JFU0VMRUNUSU9OX01TRyA9IDB4MjAwMAorQUJTT0xVVEUJRkFUQUxfU0VORF9NU0cgPSAweDIwMDEKK0FCU09MVVRFCUZBVEFMX05PVF9NU0dfSU5fQUZURVJfU0VMRUNUSU9OID0gMHgyMDAyCitBQlNPTFVURQlGQVRBTF9JTExFR0FMX01TR19MRU5HVEggPSAweDIwMDMKKworQUJTT0xVVEUJREVCVUdfSU5URVJSVVBUCT0gMHgzMDAwCitBQlNPTFVURQlERUJVR19JTlRFUlJVUFQxID0gMHgzMDAxCitBQlNPTFVURQlERUJVR19JTlRFUlJVUFQyID0gMHgzMDAyCitBQlNPTFVURQlERUJVR19JTlRFUlJVUFQzID0gMHgzMDAzCitBQlNPTFVURQlERUJVR19JTlRFUlJVUFQ0ID0gMHgzMDA0CitBQlNPTFVURQlERUJVR19JTlRFUlJVUFQ1ID0gMHgzMDA1CitBQlNPTFVURQlERUJVR19JTlRFUlJVUFQ2ID0gMHgzMDA2CisKKworOworOyBTQ1NJIE1lc3NhZ2VzIHdlIGludGVycHJldCBpbiB0aGUgc2NyaXB0Cis7CitBQlNPTFVURQlDT01NQU5EX0NPTVBMRVRFX01TRwk9IDB4MDAKK0FCU09MVVRFCUVYVEVOREVEX01TRwkJPSAweDAxCitBQlNPTFVURQlTRFRSX01TRwkJPSAweDAxCitBQlNPTFVURQlTQVZFX0RBVEFfUFRSU19NU0cJPSAweDAyCitBQlNPTFVURQlSRVNUT1JFX0RBVEFfUFRSU19NU0cJPSAweDAzCitBQlNPTFVURQlXRFRSX01TRwkJPSAweDAzCitBQlNPTFVURQlESVNDT05ORUNUX01TRwkJPSAweDA0CitBQlNPTFVURQlSRUpFQ1RfTVNHCQk9IDB4MDcKK0FCU09MVVRFCVBBUklUWV9FUlJPUl9NU0cJPSAweDA5CitBQlNPTFVURQlTSU1QTEVfVEFHX01TRwkJPSAweDIwCitBQlNPTFVURQlJREVOVElGWV9NU0cJCT0gMHg4MAorQUJTT0xVVEUJSURFTlRJRllfTVNHX01BU0sJPSAweDdGCitBQlNPTFVURQlUV09fQllURV9NU0cJCT0gMHgyMAorQUJTT0xVVEUJVFdPX0JZVEVfTVNHX01BU0sJPSAweDBGCisKKzsgVGhpcyBpcyB3aGVyZSB0aGUgc2NyaXB0IGJlZ2lucworCitFTlRSWQlTdGFydFVwCisKK1N0YXJ0VXA6CisJU0VMRUNUCUFUTiBEZXZpY2VfSUQsIFJlc2VsZWN0CisJSlVNUAlGaW5pc2gsIFdIRU4gU1RBVFVTCisJSlVNUAlTZW5kSWRlbnRpZnlNc2csIElGIE1TR19PVVQKKwlJTlQJTk9UX01TR19PVVRfQUZURVJfU0VMRUNUSU9OCisKK1Jlc2VsZWN0OgorCVdBSVQJUkVTRUxFQ1QgU2VsZWN0ZWRBc1RhcmdldAorCUlOVAlSRVNFTEVDVEVEX0RVUklOR19TRUxFQ1RJT04sIFdIRU4gTVNHX0lOCisJSU5UCUZBVEFMX05PVF9NU0dfSU5fQUZURVJfU0VMRUNUSU9OCisKKwlFTlRSWQlHZXRSZXNlbGVjdGlvbkRhdGEKK0dldFJlc2VsZWN0aW9uRGF0YToKKwlNT1ZFCTEsIFJlY2VpdmVNc2dBZGRyZXNzLCBXSEVOIE1TR19JTgorCUlOVAlSRVNFTEVDVElPTl9JREVOVElGSUVECisKKwlFTlRSWQlHZXRSZXNlbGVjdGlvbldpdGhUYWcKK0dldFJlc2VsZWN0aW9uV2l0aFRhZzoKKwlNT1ZFCTMsIFJlY2VpdmVNc2dBZGRyZXNzLCBXSEVOIE1TR19JTgorCUlOVAlSRVNFTEVDVElPTl9JREVOVElGSUVECisJCisJRU5UUlkJU2VsZWN0ZWRBc1RhcmdldAorU2VsZWN0ZWRBc1RhcmdldDoKKzsgQmFzaWNhbGx5IHRlbGwgdGhlIHNlbGVjdGluZyBkZXZpY2UgdGhhdCB0aGVyZSdzIG5vdGhpbmcgaGVyZQorCVNFVAlUQVJHRVQKKwlESVNDT05ORUNUCisJQ0xFQVIJVEFSR0VUCisJSU5UCUNPTVBMRVRFRF9TRUxFQ1RJT05fQVNfVEFSR0VUCis7Cis7IFRoZXNlIGFyZSB0aGUgbWVzc2FnaW5nIGVudHJpZXMKKzsKKzsgU2VuZCBhIG1lc3NhZ2UuICBNZXNzYWdlIGNvdW50IHNob3VsZCBiZSBjb3JyZWN0bHkgcGF0Y2hlZAorCUVOVFJZCVNlbmRNZXNzYWdlCitTZW5kTWVzc2FnZToKKwlNT1ZFCU1lc3NhZ2VDb3VudCwgTWVzc2FnZUxvY2F0aW9uLCBXSEVOIE1TR19PVVQKK1Jlc3VtZVNlbmRNZXNzYWdlOgorCVJFVFVSTiwJV0hFTiBOT1QgTVNHX09VVAorCUlOVAlGQVRBTF9TRU5EX01TRworCisJRU5UUlkJU2VuZE1lc3NhZ2VQaGFzZU1pc21hdGNoCitTZW5kTWVzc2FnZVBoYXNlTWlzbWF0Y2g6CisJQ0xFQVIJQUNLCisJSlVNUAlSZXN1bWVTZW5kTWVzc2FnZQorOworOyBSZWNlaXZlIGEgbWVzc2FnZS4gIE5lZWQgdG8gaWRlbnRpZnkgdGhlIG1lc3NhZ2UgdG8KKzsgcmVjZWl2ZSBpdCBjb3JyZWN0bHkKKwlFTlRSWQlSZWNlaXZlTWVzc2FnZQorUmVjZWl2ZU1lc3NhZ2U6CisJTU9WRQkxLCBSZWNlaXZlTXNnQWRkcmVzcywgV0hFTiBNU0dfSU4KKzsKKzsgVXNlIHRoaXMgZW50cnkgaWYgd2UndmUganVzdCB0cmllZCB0byBsb29rIGF0IHRoZSBmaXJzdCBieXRlCis7IG9mIHRoZSBtZXNzYWdlIGFuZCB3YW50IHRvIHByb2Nlc3MgaXQgZnVydGhlcgorUHJvY2Vzc1JlY2VpdmVNZXNzYWdlOgorCUpVTVAJUmVjZWl2ZUV4dGVuZGVkTWVzc2FnZSwgSUYgRVhURU5ERURfTVNHCisJUkVUVVJOLAlJRiBOT1QgVFdPX0JZVEVfTVNHLCBBTkQgTUFTSyBUV09fQllURV9NU0dfTUFTSworCUNMRUFSCUFDSworCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAxLCBXSEVOIE1TR19JTgorCVJFVFVSTgorUmVjZWl2ZUV4dGVuZGVkTWVzc2FnZToKKwlDTEVBUglBQ0sKKwlNT1ZFCTEsIFJlY2VpdmVNc2dBZGRyZXNzICsgMSwgV0hFTiBNU0dfSU4KKwlKVU1QCVJlY2VpdmUxQnl0ZSwgSUYgMHgwMQorCUpVTVAJUmVjZWl2ZTJCeXRlLCBJRiAweDAyCisJSlVNUAlSZWNlaXZlM0J5dGUsIElGIDB4MDMKKwlKVU1QCVJlY2VpdmU0Qnl0ZSwgSUYgMHgwNAorCUpVTVAJUmVjZWl2ZTVCeXRlLCBJRiAweDA1CisJSU5UCUZBVEFMX0lMTEVHQUxfTVNHX0xFTkdUSAorUmVjZWl2ZTFCeXRlOgorCUNMRUFSCUFDSworCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCVJFVFVSTgorUmVjZWl2ZTJCeXRlOgorCUNMRUFSCUFDSworCU1PVkUJMiwgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCVJFVFVSTgorUmVjZWl2ZTNCeXRlOgorCUNMRUFSCUFDSworCU1PVkUJMywgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCVJFVFVSTgorUmVjZWl2ZTRCeXRlOgorCUNMRUFSCUFDSworCU1PVkUJNCwgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCVJFVFVSTgorUmVjZWl2ZTVCeXRlOgorCUNMRUFSCUFDSworCU1PVkUJNSwgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCVJFVFVSTgorOworOyBDb21lIGhlcmUgZnJvbSB0aGUgbWVzc2FnZSBwcm9jZXNzb3IgdG8gaWdub3JlIHRoZSBtZXNzYWdlCis7CisJRU5UUlkJSWdub3JlTWVzc2FnZQorSWdub3JlTWVzc2FnZToKKwlDTEVBUglBQ0sKKwlSRVRVUk4KKzsKKzsgQ29tZSBoZXJlIHRvIHNlbmQgYSByZXBseSB0byBhIG1lc3NhZ2UKKzsKKwlFTlRSWQlTZW5kTWVzc2FnZVdpdGhBVE4KK1NlbmRNZXNzYWdlV2l0aEFUTjoKKwlTRVQJQVROCisJQ0xFQVIJQUNLCisJSlVNUAlTZW5kTWVzc2FnZQorCitTZW5kSWRlbnRpZnlNc2c6CisJQ0FMTAlTZW5kTWVzc2FnZQorCUNMRUFSCUFUTgorCitJZ25vcmVNc2dCZWZvcmVDb21tYW5kOgorCUNMRUFSCUFDSworCUVOVFJZCVNlbmRDb21tYW5kCitTZW5kQ29tbWFuZDoKKwlKVU1QCUZpbmlzaCwgV0hFTiBTVEFUVVMKKwlKVU1QCU1zZ0luQmVmb3JlQ29tbWFuZCwgSUYgTVNHX0lOCisJSU5UCVVORVhQRUNURURfUEhBU0VfQkVGT1JFX0NNRCwgSUYgTk9UIENNRAorCU1PVkUJQ29tbWFuZENvdW50LCBDb21tYW5kQWRkcmVzcywgV0hFTiBDTUQKK1Jlc3VtZVNlbmRDb21tYW5kOgorCUpVTVAJRmluaXNoLCBXSEVOIFNUQVRVUworCUpVTVAJTXNnSW5BZnRlckNtZCwgSUYgTVNHX0lOCisJSlVNUAlEYXRhSW4sIElGIERBVEFfSU4KKwlKVU1QCURhdGFPdXQsIElGIERBVEFfT1VUCisJSU5UCVVORVhQRUNURURfUEhBU0VfQUZURVJfQ01ECisKK0lnbm9yZU1zZ0R1cmluZ0RhdGE6CisJQ0xFQVIJQUNLCisJOyBmYWxsIHRocm91Z2ggdG8gTXNnSW5EdXJpbmdEYXRhCisKK0VudHJ5IE1zZ0luRHVyaW5nRGF0YQorTXNnSW5EdXJpbmdEYXRhOgorOworOyBDb3VsZCBiZSB3ZSBoYXZlIG5vdGhpbmcgbW9yZSB0byB0cmFuc2ZlcgorOworCUpVTVAJRmluaXNoLCBXSEVOIFNUQVRVUworCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MsIFdIRU4gTVNHX0lOCisJSlVNUAlEaXNjb25uZWN0RHVyaW5nRGF0YUluLCBJRiBESVNDT05ORUNUX01TRworCUpVTVAJSWdub3JlTXNnRHVyaW5nRGF0YSwgSUYgU0FWRV9EQVRBX1BUUlNfTVNHCisJSlVNUAlJZ25vcmVNc2dEdXJpbmdEYXRhLCBJRiBSRVNUT1JFX0RBVEFfUFRSU19NU0cKKwlJTlQJTVNHX0lOX0RVUklOR19EQVRBX0lOCisKK01zZ0luQWZ0ZXJDbWQ6CisJTU9WRQkxLCBSZWNlaXZlTXNnQWRkcmVzcywgV0hFTiBNU0dfSU4KKwlKVU1QCURpc2Nvbm5lY3RBZnRlckNtZCwgSUYgRElTQ09OTkVDVF9NU0cKKwlKVU1QCUlnbm9yZU1zZ0luQWZ0ZXJDbWQsIElGIFNBVkVfREFUQV9QVFJTX01TRworCUpVTVAJSWdub3JlTXNnSW5BZnRlckNtZCwgSUYgUkVTVE9SRV9EQVRBX1BUUlNfTVNHCisJQ0FMTAlQcm9jZXNzUmVjZWl2ZU1lc3NhZ2UKKwlJTlQJTVNHX0lOX0FGVEVSX0NNRAorCUNMRUFSCUFDSworCUpVTVAJUmVzdW1lU2VuZENvbW1hbmQKKworSWdub3JlTXNnSW5BZnRlckNtZDoKKwlDTEVBUglBQ0sKKwlKVU1QCVJlc3VtZVNlbmRDb21tYW5kCisKK0Rpc2Nvbm5lY3RBZnRlckNtZDoKKwlDTEVBUglBQ0sKKwlXQUlUCURJU0NPTk5FQ1QKKwlFTlRSWQlEaXNjb25uZWN0MQorRGlzY29ubmVjdDE6CisJSU5UCURJU0NPTk5FQ1RfQUZURVJfQ01ECisJRU5UUlkJRGlzY29ubmVjdDIKK0Rpc2Nvbm5lY3QyOgorOyBXZSByZXR1cm4gaGVyZSBhZnRlciBhIHJlc2VsZWN0aW9uCisJQ0xFQVIJQUNLCisJSlVNUAlSZXN1bWVTZW5kQ29tbWFuZAorCitNc2dJbkJlZm9yZUNvbW1hbmQ6CisJTU9WRQkxLCBSZWNlaXZlTXNnQWRkcmVzcywgV0hFTiBNU0dfSU4KKwlKVU1QCUlnbm9yZU1zZ0JlZm9yZUNvbW1hbmQsIElGIFNBVkVfREFUQV9QVFJTX01TRworCUpVTVAJSWdub3JlTXNnQmVmb3JlQ29tbWFuZCwgSUYgUkVTVE9SRV9EQVRBX1BUUlNfTVNHCisJQ0FMTAlQcm9jZXNzUmVjZWl2ZU1lc3NhZ2UKKwlJTlQJTVNHX0lOX0JFRk9SRV9DTUQKKwlDTEVBUglBQ0sKKwlKVU1QCVNlbmRDb21tYW5kCisKK0RhdGFJbjoKKwlDQUxMCVNHU2NyaXB0U3RhcnRBZGRyZXNzCitSZXN1bWVEYXRhSW46CisJSlVNUAlGaW5pc2gsIFdIRU4gU1RBVFVTCisJSlVNUAlNc2dJbkFmdGVyRGF0YUluLCBJRiBNU0dfSU4KKwlKVU1QCURhdGFJbkFmdGVyRGF0YUluLCBpZiBEQVRBX0lOCisJSU5UCU1TR19PVVRfQUZURVJfREFUQV9JTiwgaWYgTVNHX09VVAorCUlOVAlVTkVYUEVDVEVEX1BIQVNFX0FGVEVSX0RBVEFfSU4KKworRGF0YUluQWZ0ZXJEYXRhSW46CisJSU5UCURBVEFfSU5fQUZURVJfREFUQV9JTgorCUpVTVAJUmVzdW1lRGF0YUluCisKK0RhdGFPdXQ6CisJQ0FMTAlTR1NjcmlwdFN0YXJ0QWRkcmVzcworUmVzdW1lRGF0YU91dDoKKwlKVU1QCUZpbmlzaCwgV0hFTiBTVEFUVVMKKwlKVU1QCU1zZ0luQWZ0ZXJEYXRhT3V0LCBJRiBNU0dfSU4KKwlJTlQJVU5FWFBFQ1RFRF9QSEFTRV9BRlRFUl9EQVRBX09VVAorCitNc2dJbkFmdGVyRGF0YUluOgorCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MsIFdIRU4gTVNHX0lOCisJSlVNUAlEaXNjb25uZWN0QWZ0ZXJEYXRhSW4sIElGIERJU0NPTk5FQ1RfTVNHCisJSlVNUAlJZ25vcmVNc2dBZnRlckRhdGEsIElGIFNBVkVfREFUQV9QVFJTX01TRworCUpVTVAJSWdub3JlTXNnQWZ0ZXJEYXRhLCBJRiBSRVNUT1JFX0RBVEFfUFRSU19NU0cKKwlDQUxMCVByb2Nlc3NSZWNlaXZlTWVzc2FnZQorCUlOVAlNU0dfSU5fQUZURVJfREFUQV9JTgorCUNMRUFSCUFDSworCUpVTVAJUmVzdW1lRGF0YUluCisKK0Rpc2Nvbm5lY3REdXJpbmdEYXRhSW46CisJQ0xFQVIJQUNLCisJV0FJVAlESVNDT05ORUNUCisJRU5UUlkJRGlzY29ubmVjdDMKK0Rpc2Nvbm5lY3QzOgorCUlOVAlESVNDT05ORUNUX0RVUklOR19EQVRBCisJRU5UUlkJRGlzY29ubmVjdDQKK0Rpc2Nvbm5lY3Q0OgorOyB3ZSByZXR1cm4gaGVyZSBhZnRlciBhIHJlc2VsZWN0aW9uCisJQ0xFQVIJQUNLCisJSlVNUAlSZXN1bWVTZW5kQ29tbWFuZAorCisKK0Rpc2Nvbm5lY3RBZnRlckRhdGFJbjoKKwlDTEVBUglBQ0sKKwlXQUlUCURJU0NPTk5FQ1QKKwlFTlRSWQlEaXNjb25uZWN0NQorRGlzY29ubmVjdDU6CisJSU5UCURJU0NPTk5FQ1RfQUZURVJfREFUQQorCUVOVFJZCURpc2Nvbm5lY3Q2CitEaXNjb25uZWN0NjoKKzsgd2UgcmV0dXJuIGhlcmUgYWZ0ZXIgYSByZXNlbGVjdGlvbgorCUNMRUFSCUFDSworCUpVTVAJUmVzdW1lRGF0YUluCisKK01zZ0luQWZ0ZXJEYXRhT3V0OgorCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MsIFdIRU4gTVNHX0lOCisJSlVNUAlEaXNjb25uZWN0QWZ0ZXJEYXRhT3V0LCBpZiBESVNDT05ORUNUX01TRworCUpVTVAJSWdub3JlTXNnQWZ0ZXJEYXRhLCBJRiBTQVZFX0RBVEFfUFRSU19NU0cKKwlKVU1QCUlnbm9yZU1zZ0FmdGVyRGF0YSwgSUYgUkVTVE9SRV9EQVRBX1BUUlNfTVNHCisJQ0FMTAlQcm9jZXNzUmVjZWl2ZU1lc3NhZ2UKKwlJTlQJTVNHX0lOX0FGVEVSX0RBVEFfT1VUCisJQ0xFQVIJQUNLCisJSlVNUAlSZXN1bWVEYXRhT3V0CisKK0lnbm9yZU1zZ0FmdGVyRGF0YToKKwlDTEVBUglBQ0sKKzsgRGF0YSBpbiBhbmQgb3V0IGRvIHRoZSBzYW1lIHRoaW5nIG9uIHJlc3VtZSwgc28gcGljayBvbmUKKwlKVU1QCVJlc3VtZURhdGFJbgorCitEaXNjb25uZWN0QWZ0ZXJEYXRhT3V0OgorCUNMRUFSCUFDSworCVdBSVQJRElTQ09OTkVDVAorCUVOVFJZCURpc2Nvbm5lY3Q3CitEaXNjb25uZWN0NzoKKwlJTlQJRElTQ09OTkVDVF9BRlRFUl9EQVRBCisJRU5UUlkJRGlzY29ubmVjdDgKK0Rpc2Nvbm5lY3Q4OgorOyB3ZSByZXR1cm4gaGVyZSBhZnRlciBhIHJlc2VsZWN0aW9uCisJQ0xFQVIJQUNLCisJSlVNUAlSZXN1bWVEYXRhT3V0CisKK0ZpbmlzaDoKKwlNT1ZFCTEsIFN0YXR1c0FkZHJlc3MsIFdIRU4gU1RBVFVTCisJSU5UCU5PVF9NU0dfSU5fQUZURVJfU1RBVFVTLCBXSEVOIE5PVCBNU0dfSU4KKwlNT1ZFCTEsIFJlY2VpdmVNc2dBZGRyZXNzLCBXSEVOIE1TR19JTgorCUpVTVAJRmluaXNoQ29tbWFuZENvbXBsZXRlLCBJRiBDT01NQU5EX0NPTVBMRVRFX01TRworCUNBTEwJUHJvY2Vzc1JlY2VpdmVNZXNzYWdlCisJSU5UCU1TR19JTl9BRlRFUl9TVEFUVVMKKwlFTlRSWQlGaW5pc2hDb21tYW5kQ29tcGxldGUKK0ZpbmlzaENvbW1hbmRDb21wbGV0ZToKKwlDTEVBUglBQ0sKKwlXQUlUCURJU0NPTk5FQ1QKKwlFTlRSWQlGaW5pc2gxCitGaW5pc2gxOgorCUlOVAlHT09EX1NUQVRVU19BRlRFUl9TVEFUVVMKKwlFTlRSWQlGaW5pc2gyCitGaW5pc2gyOgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvNTNjNzAwX2QuaF9zaGlwcGVkIGIvZHJpdmVycy9zY3NpLzUzYzcwMF9kLmhfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjQyYTUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpLzUzYzcwMF9kLmhfc2hpcHBlZApAQCAtMCwwICsxLDEzMjkgQEAKKy8qIERPIE5PVCBFRElUIC0gR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgc2NyaXB0X2FzbS5wbCAqLworc3RhdGljIHUzMiBTQ1JJUFRbXSA9IHsKKy8qCis7IFNjcmlwdCBmb3IgdGhlIE5DUiAob3Igc3ltYmlvcykgNTNjNzAwIGFuZCA1M2M3MDAtNjYgY2hpcAorOworOyBDb3B5cmlnaHQgKEMpIDIwMDEgSmFtZXMuQm90dG9tbGV5QEhhbnNlblBhcnRuZXJzaGlwLmNvbQorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgIAorOzsgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cis7OyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzs7ICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorOzsgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7OworOzsgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOzsgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7OyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorOzsgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7OworOzsgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCis7OyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzs7ICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKzs7Cis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IFRoaXMgc2NyaXB0IGlzIGRlc2lnbmVkIHRvIGJlIG1vZGlmaWVkIGZvciB0aGUgcGFydGljdWxhciBjb21tYW5kIGluCis7IG9wZXJhdGlvbi4gIFRoZSBwYXJ0aWN1bGFyIHZhcmlhYmxlcyBwZXJ0YWluaW5nIHRvIHRoZSBjb21tYW5kcyBhcmU6Cis7CitBQlNPTFVURQlEZXZpY2VfSUQgPSAwCQk7IElEIG9mIHRhcmdldCBmb3IgY29tbWFuZAorQUJTT0xVVEUJTWVzc2FnZUNvdW50ID0gMAk7IE51bWJlciBvZiBieXRlcyBpbiBtZXNzYWdlCitBQlNPTFVURQlNZXNzYWdlTG9jYXRpb24gPSAwCTsgQWRkciBvZiBtZXNzYWdlCitBQlNPTFVURQlDb21tYW5kQ291bnQgPSAwCTsgTnVtYmVyIG9mIGJ5dGVzIGluIGNvbW1hbmQKK0FCU09MVVRFCUNvbW1hbmRBZGRyZXNzID0gMAk7IEFkZHIgb2YgQ29tbWFuZAorQUJTT0xVVEUJU3RhdHVzQWRkcmVzcyA9IDAJOyBBZGRyIHRvIHJlY2VpdmUgc3RhdHVzIHJldHVybgorQUJTT0xVVEUJUmVjZWl2ZU1zZ0FkZHJlc3MgPSAwCTsgQWRkciB0byByZWNlaXZlIG1zZworOworOyBUaGlzIGlzIHRoZSBtYWdpYyBjb21wb25lbnQgZm9yIGhhbmRsaW5nIHNjYXR0ZXItZ2F0aGVyLiAgRWFjaCBvZiB0aGUKKzsgU0cgY29tcG9uZW50cyBpcyBwcmVjZWVkZWQgYnkgYSBzY3JpcHQgZnJhZ21lbnQgd2hpY2ggbW92ZXMgdGhlCis7IG5lY2Vzc2FyeSBhbW91bnQgb2YgZGF0YSBhbmQganVtcHMgdG8gdGhlIG5leHQgU0cgc2VnbWVudC4gIFRoZSBmaW5hbAorOyBTRyBzZWdtZW50IGp1bXBzIGJhY2sgdG8gLiAgSG93ZXZlciwgdGhpcyBhZGRyZXNzIGlzIHRoZSBmaXJzdCBTRyBzY3JpcHQKKzsgc2VnbWVudC4KKzsKK0FCU09MVVRFCVNHU2NyaXB0U3RhcnRBZGRyZXNzID0gMAorCis7IFRoZSBmb2xsb3dpbmcgcmVwcmVzZW50IHN0YXR1cyBpbnRlcnJ1cHRzIHdlIHVzZSAzIGhleCBkaWdpdHMgZm9yCis7IHRoaXM6IDB4UFJTIHdoZXJlIAorCis7IFA6CitBQlNPTFVURQlBRlRFUl9TRUxFQ1RJT04gCT0gMHgxMDAKK0FCU09MVVRFCUJFRk9SRV9DTUQgCQk9IDB4MjAwCitBQlNPTFVURQlBRlRFUl9DTUQgCQk9IDB4MzAwCitBQlNPTFVURQlBRlRFUl9TVEFUVVMgCQk9IDB4NDAwCitBQlNPTFVURQlBRlRFUl9EQVRBX0lOCQk9IDB4NTAwCitBQlNPTFVURQlBRlRFUl9EQVRBX09VVAkJPSAweDYwMAorQUJTT0xVVEUJRFVSSU5HX0RBVEFfSU4JCT0gMHg3MDAKKworOyBSOgorQUJTT0xVVEUJTk9UX01TR19PVVQgCQk9IDB4MTAKK0FCU09MVVRFCVVORVhQRUNURURfUEhBU0UgCT0gMHgyMAorQUJTT0xVVEUJTk9UX01TR19JTiAJCT0gMHgzMAorQUJTT0xVVEUJVU5FWFBFQ1RFRF9NU0cJCT0gMHg0MAorQUJTT0xVVEUJTVNHX0lOCQkJPSAweDUwCitBQlNPTFVURQlTRFRSX01TR19SCQk9IDB4NjAKK0FCU09MVVRFCVJFSkVDVF9NU0dfUgkJPSAweDcwCitBQlNPTFVURQlESVNDT05ORUNUCQk9IDB4ODAKK0FCU09MVVRFCU1TR19PVVQJCQk9IDB4OTAKK0FCU09MVVRFCVdEVFJfTVNHX1IJCT0gMHhBMAorCis7IFM6CitBQlNPTFVURQlHT09EX1NUQVRVUyAJCT0gMHgxCisKKzsgQ29tYmluYXRpb25zLCBzaW5jZSB0aGUgc2NyaXB0IGFzc2VtYmxlciBjYW4ndCBwcm9jZXNzIHwKK0FCU09MVVRFCU5PVF9NU0dfT1VUX0FGVEVSX1NFTEVDVElPTiA9IDB4MTEwCitBQlNPTFVURQlVTkVYUEVDVEVEX1BIQVNFX0JFRk9SRV9DTUQgPSAweDIyMAorQUJTT0xVVEUJVU5FWFBFQ1RFRF9QSEFTRV9BRlRFUl9DTUQgPSAweDMyMAorQUJTT0xVVEUJTk9UX01TR19JTl9BRlRFUl9TVEFUVVMgPSAweDQzMAorQUJTT0xVVEUJR09PRF9TVEFUVVNfQUZURVJfU1RBVFVTID0gMHg0MDEKK0FCU09MVVRFCVVORVhQRUNURURfUEhBU0VfQUZURVJfREFUQV9JTiA9IDB4NTIwCitBQlNPTFVURQlVTkVYUEVDVEVEX1BIQVNFX0FGVEVSX0RBVEFfT1VUID0gMHg2MjAKK0FCU09MVVRFCVVORVhQRUNURURfTVNHX0JFRk9SRV9DTUQgPSAweDI0MAorQUJTT0xVVEUJTVNHX0lOX0JFRk9SRV9DTUQgPSAweDI1MAorQUJTT0xVVEUJTVNHX0lOX0FGVEVSX0NNRCA9IDB4MzUwCitBQlNPTFVURQlTRFRSX01TR19CRUZPUkVfQ01EID0gMHgyNjAKK0FCU09MVVRFCVJFSkVDVF9NU0dfQkVGT1JFX0NNRCA9IDB4MjcwCitBQlNPTFVURQlESVNDT05ORUNUX0FGVEVSX0NNRCA9IDB4MzgwCitBQlNPTFVURQlTRFRSX01TR19BRlRFUl9DTUQgPSAweDM2MAorQUJTT0xVVEUJV0RUUl9NU0dfQUZURVJfQ01EID0gMHgzQTAKK0FCU09MVVRFCU1TR19JTl9BRlRFUl9TVEFUVVMgPSAweDQ0MAorQUJTT0xVVEUJRElTQ09OTkVDVF9BRlRFUl9EQVRBID0gMHg1ODAKK0FCU09MVVRFCU1TR19JTl9BRlRFUl9EQVRBX0lOID0gMHg1NTAKK0FCU09MVVRFCU1TR19JTl9BRlRFUl9EQVRBX09VVCA9IDB4NjUwCitBQlNPTFVURQlNU0dfT1VUX0FGVEVSX0RBVEFfSU4gPSAweDU5MAorQUJTT0xVVEUJREFUQV9JTl9BRlRFUl9EQVRBX0lOID0gMHg1YTAKK0FCU09MVVRFCU1TR19JTl9EVVJJTkdfREFUQV9JTiA9IDB4NzUwCitBQlNPTFVURQlESVNDT05ORUNUX0RVUklOR19EQVRBID0gMHg3ODAKKworOworOyBPdGhlciBpbnRlcnJ1cHQgY29uZGl0aW9ucworOyAKK0FCU09MVVRFCVJFU0VMRUNURURfRFVSSU5HX1NFTEVDVElPTiA9IDB4MTAwMAorQUJTT0xVVEUJQ09NUExFVEVEX1NFTEVDVElPTl9BU19UQVJHRVQgPSAweDEwMDEKK0FCU09MVVRFCVJFU0VMRUNUSU9OX0lERU5USUZJRUQgPSAweDEwMDMKKzsKKzsgRmF0YWwgaW50ZXJydXB0IGNvbmRpdGlvbnMuICBJZiB5b3UgYWRkIHRvIHRoaXMsIGFsc28gYWRkIHRvIHRoZQorOyBhcnJheSBvZiBjb3JyZXNwb25kaW5nIG1lc3NhZ2VzCis7CitBQlNPTFVURQlGQVRBTCA9IDB4MjAwMAorQUJTT0xVVEUJRkFUQUxfVU5FWFBFQ1RFRF9SRVNFTEVDVElPTl9NU0cgPSAweDIwMDAKK0FCU09MVVRFCUZBVEFMX1NFTkRfTVNHID0gMHgyMDAxCitBQlNPTFVURQlGQVRBTF9OT1RfTVNHX0lOX0FGVEVSX1NFTEVDVElPTiA9IDB4MjAwMgorQUJTT0xVVEUJRkFUQUxfSUxMRUdBTF9NU0dfTEVOR1RIID0gMHgyMDAzCisKK0FCU09MVVRFCURFQlVHX0lOVEVSUlVQVAk9IDB4MzAwMAorQUJTT0xVVEUJREVCVUdfSU5URVJSVVBUMSA9IDB4MzAwMQorQUJTT0xVVEUJREVCVUdfSU5URVJSVVBUMiA9IDB4MzAwMgorQUJTT0xVVEUJREVCVUdfSU5URVJSVVBUMyA9IDB4MzAwMworQUJTT0xVVEUJREVCVUdfSU5URVJSVVBUNCA9IDB4MzAwNAorQUJTT0xVVEUJREVCVUdfSU5URVJSVVBUNSA9IDB4MzAwNQorQUJTT0xVVEUJREVCVUdfSU5URVJSVVBUNiA9IDB4MzAwNgorCisKKzsKKzsgU0NTSSBNZXNzYWdlcyB3ZSBpbnRlcnByZXQgaW4gdGhlIHNjcmlwdAorOworQUJTT0xVVEUJQ09NTUFORF9DT01QTEVURV9NU0cJPSAweDAwCitBQlNPTFVURQlFWFRFTkRFRF9NU0cJCT0gMHgwMQorQUJTT0xVVEUJU0RUUl9NU0cJCT0gMHgwMQorQUJTT0xVVEUJU0FWRV9EQVRBX1BUUlNfTVNHCT0gMHgwMgorQUJTT0xVVEUJUkVTVE9SRV9EQVRBX1BUUlNfTVNHCT0gMHgwMworQUJTT0xVVEUJV0RUUl9NU0cJCT0gMHgwMworQUJTT0xVVEUJRElTQ09OTkVDVF9NU0cJCT0gMHgwNAorQUJTT0xVVEUJUkVKRUNUX01TRwkJPSAweDA3CitBQlNPTFVURQlQQVJJVFlfRVJST1JfTVNHCT0gMHgwOQorQUJTT0xVVEUJU0lNUExFX1RBR19NU0cJCT0gMHgyMAorQUJTT0xVVEUJSURFTlRJRllfTVNHCQk9IDB4ODAKK0FCU09MVVRFCUlERU5USUZZX01TR19NQVNLCT0gMHg3RgorQUJTT0xVVEUJVFdPX0JZVEVfTVNHCQk9IDB4MjAKK0FCU09MVVRFCVRXT19CWVRFX01TR19NQVNLCT0gMHgwRgorCis7IFRoaXMgaXMgd2hlcmUgdGhlIHNjcmlwdCBiZWdpbnMKKworRU5UUlkJU3RhcnRVcAorCitTdGFydFVwOgorCVNFTEVDVAlBVE4gRGV2aWNlX0lELCBSZXNlbGVjdAorCithdCAweDAwMDAwMDAwIDogKi8JMHg0MTAwMDAwMCwweDAwMDAwMDIwLAorLyoKKwlKVU1QCUZpbmlzaCwgV0hFTiBTVEFUVVMKKworYXQgMHgwMDAwMDAwMiA6ICovCTB4ODMwYjAwMDAsMHgwMDAwMDQ2MCwKKy8qCisJSlVNUAlTZW5kSWRlbnRpZnlNc2csIElGIE1TR19PVVQKKworYXQgMHgwMDAwMDAwNCA6ICovCTB4ODYwYTAwMDAsMHgwMDAwMDFiMCwKKy8qCisJSU5UCU5PVF9NU0dfT1VUX0FGVEVSX1NFTEVDVElPTgorCithdCAweDAwMDAwMDA2IDogKi8JMHg5ODA4MDAwMCwweDAwMDAwMTEwLAorLyoKKworUmVzZWxlY3Q6CisJV0FJVAlSRVNFTEVDVCBTZWxlY3RlZEFzVGFyZ2V0CisKK2F0IDB4MDAwMDAwMDggOiAqLwkweDUwMDAwMDAwLDB4MDAwMDAwNTgsCisvKgorCUlOVAlSRVNFTEVDVEVEX0RVUklOR19TRUxFQ1RJT04sIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAwMGEgOiAqLwkweDlmMGIwMDAwLDB4MDAwMDEwMDAsCisvKgorCUlOVAlGQVRBTF9OT1RfTVNHX0lOX0FGVEVSX1NFTEVDVElPTgorCithdCAweDAwMDAwMDBjIDogKi8JMHg5ODA4MDAwMCwweDAwMDAyMDAyLAorLyoKKworCUVOVFJZCUdldFJlc2VsZWN0aW9uRGF0YQorR2V0UmVzZWxlY3Rpb25EYXRhOgorCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MsIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAwMGUgOiAqLwkweDBmMDAwMDAxLDB4MDAwMDAwMDAsCisvKgorCUlOVAlSRVNFTEVDVElPTl9JREVOVElGSUVECisKK2F0IDB4MDAwMDAwMTAgOiAqLwkweDk4MDgwMDAwLDB4MDAwMDEwMDMsCisvKgorCisJRU5UUlkJR2V0UmVzZWxlY3Rpb25XaXRoVGFnCitHZXRSZXNlbGVjdGlvbldpdGhUYWc6CisJTU9WRQkzLCBSZWNlaXZlTXNnQWRkcmVzcywgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDAxMiA6ICovCTB4MGYwMDAwMDMsMHgwMDAwMDAwMCwKKy8qCisJSU5UCVJFU0VMRUNUSU9OX0lERU5USUZJRUQKKworYXQgMHgwMDAwMDAxNCA6ICovCTB4OTgwODAwMDAsMHgwMDAwMTAwMywKKy8qCisJCisJRU5UUlkJU2VsZWN0ZWRBc1RhcmdldAorU2VsZWN0ZWRBc1RhcmdldDoKKzsgQmFzaWNhbGx5IHRlbGwgdGhlIHNlbGVjdGluZyBkZXZpY2UgdGhhdCB0aGVyZSdzIG5vdGhpbmcgaGVyZQorCVNFVAlUQVJHRVQKKworYXQgMHgwMDAwMDAxNiA6ICovCTB4NTgwMDAyMDAsMHgwMDAwMDAwMCwKKy8qCisJRElTQ09OTkVDVAorCithdCAweDAwMDAwMDE4IDogKi8JMHg0ODAwMDAwMCwweDAwMDAwMDAwLAorLyoKKwlDTEVBUglUQVJHRVQKKworYXQgMHgwMDAwMDAxYSA6ICovCTB4NjAwMDAyMDAsMHgwMDAwMDAwMCwKKy8qCisJSU5UCUNPTVBMRVRFRF9TRUxFQ1RJT05fQVNfVEFSR0VUCisKK2F0IDB4MDAwMDAwMWMgOiAqLwkweDk4MDgwMDAwLDB4MDAwMDEwMDEsCisvKgorOworOyBUaGVzZSBhcmUgdGhlIG1lc3NhZ2luZyBlbnRyaWVzCis7Cis7IFNlbmQgYSBtZXNzYWdlLiAgTWVzc2FnZSBjb3VudCBzaG91bGQgYmUgY29ycmVjdGx5IHBhdGNoZWQKKwlFTlRSWQlTZW5kTWVzc2FnZQorU2VuZE1lc3NhZ2U6CisJTU9WRQlNZXNzYWdlQ291bnQsIE1lc3NhZ2VMb2NhdGlvbiwgV0hFTiBNU0dfT1VUCisKK2F0IDB4MDAwMDAwMWUgOiAqLwkweDBlMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorUmVzdW1lU2VuZE1lc3NhZ2U6CisJUkVUVVJOLAlXSEVOIE5PVCBNU0dfT1VUCisKK2F0IDB4MDAwMDAwMjAgOiAqLwkweDk2MDMwMDAwLDB4MDAwMDAwMDAsCisvKgorCUlOVAlGQVRBTF9TRU5EX01TRworCithdCAweDAwMDAwMDIyIDogKi8JMHg5ODA4MDAwMCwweDAwMDAyMDAxLAorLyoKKworCUVOVFJZCVNlbmRNZXNzYWdlUGhhc2VNaXNtYXRjaAorU2VuZE1lc3NhZ2VQaGFzZU1pc21hdGNoOgorCUNMRUFSCUFDSworCithdCAweDAwMDAwMDI0IDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKwlKVU1QCVJlc3VtZVNlbmRNZXNzYWdlCisKK2F0IDB4MDAwMDAwMjYgOiAqLwkweDgwMDgwMDAwLDB4MDAwMDAwODAsCisvKgorOworOyBSZWNlaXZlIGEgbWVzc2FnZS4gIE5lZWQgdG8gaWRlbnRpZnkgdGhlIG1lc3NhZ2UgdG8KKzsgcmVjZWl2ZSBpdCBjb3JyZWN0bHkKKwlFTlRSWQlSZWNlaXZlTWVzc2FnZQorUmVjZWl2ZU1lc3NhZ2U6CisJTU9WRQkxLCBSZWNlaXZlTXNnQWRkcmVzcywgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDAyOCA6ICovCTB4MGYwMDAwMDEsMHgwMDAwMDAwMCwKKy8qCis7Cis7IFVzZSB0aGlzIGVudHJ5IGlmIHdlJ3ZlIGp1c3QgdHJpZWQgdG8gbG9vayBhdCB0aGUgZmlyc3QgYnl0ZQorOyBvZiB0aGUgbWVzc2FnZSBhbmQgd2FudCB0byBwcm9jZXNzIGl0IGZ1cnRoZXIKK1Byb2Nlc3NSZWNlaXZlTWVzc2FnZToKKwlKVU1QCVJlY2VpdmVFeHRlbmRlZE1lc3NhZ2UsIElGIEVYVEVOREVEX01TRworCithdCAweDAwMDAwMDJhIDogKi8JMHg4MDBjMDAwMSwweDAwMDAwMGQwLAorLyoKKwlSRVRVUk4sCUlGIE5PVCBUV09fQllURV9NU0csIEFORCBNQVNLIFRXT19CWVRFX01TR19NQVNLCisKK2F0IDB4MDAwMDAwMmMgOiAqLwkweDkwMDQwZjIwLDB4MDAwMDAwMDAsCisvKgorCUNMRUFSCUFDSworCithdCAweDAwMDAwMDJlIDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKwlNT1ZFCTEsIFJlY2VpdmVNc2dBZGRyZXNzICsgMSwgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDAzMCA6ICovCTB4MGYwMDAwMDEsMHgwMDAwMDAwMSwKKy8qCisJUkVUVVJOCisKK2F0IDB4MDAwMDAwMzIgOiAqLwkweDkwMDgwMDAwLDB4MDAwMDAwMDAsCisvKgorUmVjZWl2ZUV4dGVuZGVkTWVzc2FnZToKKwlDTEVBUglBQ0sKKworYXQgMHgwMDAwMDAzNCA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisJTU9WRQkxLCBSZWNlaXZlTXNnQWRkcmVzcyArIDEsIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAwMzYgOiAqLwkweDBmMDAwMDAxLDB4MDAwMDAwMDEsCisvKgorCUpVTVAJUmVjZWl2ZTFCeXRlLCBJRiAweDAxCisKK2F0IDB4MDAwMDAwMzggOiAqLwkweDgwMGMwMDAxLDB4MDAwMDAxMTAsCisvKgorCUpVTVAJUmVjZWl2ZTJCeXRlLCBJRiAweDAyCisKK2F0IDB4MDAwMDAwM2EgOiAqLwkweDgwMGMwMDAyLDB4MDAwMDAxMjgsCisvKgorCUpVTVAJUmVjZWl2ZTNCeXRlLCBJRiAweDAzCisKK2F0IDB4MDAwMDAwM2MgOiAqLwkweDgwMGMwMDAzLDB4MDAwMDAxNDAsCisvKgorCUpVTVAJUmVjZWl2ZTRCeXRlLCBJRiAweDA0CisKK2F0IDB4MDAwMDAwM2UgOiAqLwkweDgwMGMwMDA0LDB4MDAwMDAxNTgsCisvKgorCUpVTVAJUmVjZWl2ZTVCeXRlLCBJRiAweDA1CisKK2F0IDB4MDAwMDAwNDAgOiAqLwkweDgwMGMwMDA1LDB4MDAwMDAxNzAsCisvKgorCUlOVAlGQVRBTF9JTExFR0FMX01TR19MRU5HVEgKKworYXQgMHgwMDAwMDA0MiA6ICovCTB4OTgwODAwMDAsMHgwMDAwMjAwMywKKy8qCitSZWNlaXZlMUJ5dGU6CisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwNDQgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMDQ2IDogKi8JMHgwZjAwMDAwMSwweDAwMDAwMDAyLAorLyoKKwlSRVRVUk4KKworYXQgMHgwMDAwMDA0OCA6ICovCTB4OTAwODAwMDAsMHgwMDAwMDAwMCwKKy8qCitSZWNlaXZlMkJ5dGU6CisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwNGEgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCU1PVkUJMiwgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMDRjIDogKi8JMHgwZjAwMDAwMiwweDAwMDAwMDAyLAorLyoKKwlSRVRVUk4KKworYXQgMHgwMDAwMDA0ZSA6ICovCTB4OTAwODAwMDAsMHgwMDAwMDAwMCwKKy8qCitSZWNlaXZlM0J5dGU6CisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwNTAgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCU1PVkUJMywgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMDUyIDogKi8JMHgwZjAwMDAwMywweDAwMDAwMDAyLAorLyoKKwlSRVRVUk4KKworYXQgMHgwMDAwMDA1NCA6ICovCTB4OTAwODAwMDAsMHgwMDAwMDAwMCwKKy8qCitSZWNlaXZlNEJ5dGU6CisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwNTYgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCU1PVkUJNCwgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMDU4IDogKi8JMHgwZjAwMDAwNCwweDAwMDAwMDAyLAorLyoKKwlSRVRVUk4KKworYXQgMHgwMDAwMDA1YSA6ICovCTB4OTAwODAwMDAsMHgwMDAwMDAwMCwKKy8qCitSZWNlaXZlNUJ5dGU6CisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwNWMgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCU1PVkUJNSwgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMDVlIDogKi8JMHgwZjAwMDAwNSwweDAwMDAwMDAyLAorLyoKKwlSRVRVUk4KKworYXQgMHgwMDAwMDA2MCA6ICovCTB4OTAwODAwMDAsMHgwMDAwMDAwMCwKKy8qCis7Cis7IENvbWUgaGVyZSBmcm9tIHRoZSBtZXNzYWdlIHByb2Nlc3NvciB0byBpZ25vcmUgdGhlIG1lc3NhZ2UKKzsKKwlFTlRSWQlJZ25vcmVNZXNzYWdlCitJZ25vcmVNZXNzYWdlOgorCUNMRUFSCUFDSworCithdCAweDAwMDAwMDYyIDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKwlSRVRVUk4KKworYXQgMHgwMDAwMDA2NCA6ICovCTB4OTAwODAwMDAsMHgwMDAwMDAwMCwKKy8qCis7Cis7IENvbWUgaGVyZSB0byBzZW5kIGEgcmVwbHkgdG8gYSBtZXNzYWdlCis7CisJRU5UUlkJU2VuZE1lc3NhZ2VXaXRoQVROCitTZW5kTWVzc2FnZVdpdGhBVE46CisJU0VUCUFUTgorCithdCAweDAwMDAwMDY2IDogKi8JMHg1ODAwMDAwOCwweDAwMDAwMDAwLAorLyoKKwlDTEVBUglBQ0sKKworYXQgMHgwMDAwMDA2OCA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisJSlVNUAlTZW5kTWVzc2FnZQorCithdCAweDAwMDAwMDZhIDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMDc4LAorLyoKKworU2VuZElkZW50aWZ5TXNnOgorCUNBTEwJU2VuZE1lc3NhZ2UKKworYXQgMHgwMDAwMDA2YyA6ICovCTB4ODgwODAwMDAsMHgwMDAwMDA3OCwKKy8qCisJQ0xFQVIJQVROCisKK2F0IDB4MDAwMDAwNmUgOiAqLwkweDYwMDAwMDA4LDB4MDAwMDAwMDAsCisvKgorCitJZ25vcmVNc2dCZWZvcmVDb21tYW5kOgorCUNMRUFSCUFDSworCithdCAweDAwMDAwMDcwIDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKwlFTlRSWQlTZW5kQ29tbWFuZAorU2VuZENvbW1hbmQ6CisJSlVNUAlGaW5pc2gsIFdIRU4gU1RBVFVTCisKK2F0IDB4MDAwMDAwNzIgOiAqLwkweDgzMGIwMDAwLDB4MDAwMDA0NjAsCisvKgorCUpVTVAJTXNnSW5CZWZvcmVDb21tYW5kLCBJRiBNU0dfSU4KKworYXQgMHgwMDAwMDA3NCA6ICovCTB4ODcwYTAwMDAsMHgwMDAwMDJjMCwKKy8qCisJSU5UCVVORVhQRUNURURfUEhBU0VfQkVGT1JFX0NNRCwgSUYgTk9UIENNRAorCithdCAweDAwMDAwMDc2IDogKi8JMHg5YTAyMDAwMCwweDAwMDAwMjIwLAorLyoKKwlNT1ZFCUNvbW1hbmRDb3VudCwgQ29tbWFuZEFkZHJlc3MsIFdIRU4gQ01ECisKK2F0IDB4MDAwMDAwNzggOiAqLwkweDBhMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorUmVzdW1lU2VuZENvbW1hbmQ6CisJSlVNUAlGaW5pc2gsIFdIRU4gU1RBVFVTCisKK2F0IDB4MDAwMDAwN2EgOiAqLwkweDgzMGIwMDAwLDB4MDAwMDA0NjAsCisvKgorCUpVTVAJTXNnSW5BZnRlckNtZCwgSUYgTVNHX0lOCisKK2F0IDB4MDAwMDAwN2MgOiAqLwkweDg3MGEwMDAwLDB4MDAwMDAyNDgsCisvKgorCUpVTVAJRGF0YUluLCBJRiBEQVRBX0lOCisKK2F0IDB4MDAwMDAwN2UgOiAqLwkweDgxMGEwMDAwLDB4MDAwMDAyZjgsCisvKgorCUpVTVAJRGF0YU91dCwgSUYgREFUQV9PVVQKKworYXQgMHgwMDAwMDA4MCA6ICovCTB4ODAwYTAwMDAsMHgwMDAwMDMzOCwKKy8qCisJSU5UCVVORVhQRUNURURfUEhBU0VfQUZURVJfQ01ECisKK2F0IDB4MDAwMDAwODIgOiAqLwkweDk4MDgwMDAwLDB4MDAwMDAzMjAsCisvKgorCitJZ25vcmVNc2dEdXJpbmdEYXRhOgorCUNMRUFSCUFDSworCithdCAweDAwMDAwMDg0IDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKwk7IGZhbGwgdGhyb3VnaCB0byBNc2dJbkR1cmluZ0RhdGEKKworRW50cnkgTXNnSW5EdXJpbmdEYXRhCitNc2dJbkR1cmluZ0RhdGE6Cis7Cis7IENvdWxkIGJlIHdlIGhhdmUgbm90aGluZyBtb3JlIHRvIHRyYW5zZmVyCis7CisJSlVNUAlGaW5pc2gsIFdIRU4gU1RBVFVTCisKK2F0IDB4MDAwMDAwODYgOiAqLwkweDgzMGIwMDAwLDB4MDAwMDA0NjAsCisvKgorCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MsIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAwODggOiAqLwkweDBmMDAwMDAxLDB4MDAwMDAwMDAsCisvKgorCUpVTVAJRGlzY29ubmVjdER1cmluZ0RhdGFJbiwgSUYgRElTQ09OTkVDVF9NU0cKKworYXQgMHgwMDAwMDA4YSA6ICovCTB4ODAwYzAwMDQsMHgwMDAwMDM5OCwKKy8qCisJSlVNUAlJZ25vcmVNc2dEdXJpbmdEYXRhLCBJRiBTQVZFX0RBVEFfUFRSU19NU0cKKworYXQgMHgwMDAwMDA4YyA6ICovCTB4ODAwYzAwMDIsMHgwMDAwMDIxMCwKKy8qCisJSlVNUAlJZ25vcmVNc2dEdXJpbmdEYXRhLCBJRiBSRVNUT1JFX0RBVEFfUFRSU19NU0cKKworYXQgMHgwMDAwMDA4ZSA6ICovCTB4ODAwYzAwMDMsMHgwMDAwMDIxMCwKKy8qCisJSU5UCU1TR19JTl9EVVJJTkdfREFUQV9JTgorCithdCAweDAwMDAwMDkwIDogKi8JMHg5ODA4MDAwMCwweDAwMDAwNzUwLAorLyoKKworTXNnSW5BZnRlckNtZDoKKwlNT1ZFCTEsIFJlY2VpdmVNc2dBZGRyZXNzLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMDkyIDogKi8JMHgwZjAwMDAwMSwweDAwMDAwMDAwLAorLyoKKwlKVU1QCURpc2Nvbm5lY3RBZnRlckNtZCwgSUYgRElTQ09OTkVDVF9NU0cKKworYXQgMHgwMDAwMDA5NCA6ICovCTB4ODAwYzAwMDQsMHgwMDAwMDI5OCwKKy8qCisJSlVNUAlJZ25vcmVNc2dJbkFmdGVyQ21kLCBJRiBTQVZFX0RBVEFfUFRSU19NU0cKKworYXQgMHgwMDAwMDA5NiA6ICovCTB4ODAwYzAwMDIsMHgwMDAwMDI4OCwKKy8qCisJSlVNUAlJZ25vcmVNc2dJbkFmdGVyQ21kLCBJRiBSRVNUT1JFX0RBVEFfUFRSU19NU0cKKworYXQgMHgwMDAwMDA5OCA6ICovCTB4ODAwYzAwMDMsMHgwMDAwMDI4OCwKKy8qCisJQ0FMTAlQcm9jZXNzUmVjZWl2ZU1lc3NhZ2UKKworYXQgMHgwMDAwMDA5YSA6ICovCTB4ODgwODAwMDAsMHgwMDAwMDBhOCwKKy8qCisJSU5UCU1TR19JTl9BRlRFUl9DTUQKKworYXQgMHgwMDAwMDA5YyA6ICovCTB4OTgwODAwMDAsMHgwMDAwMDM1MCwKKy8qCisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwOWUgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCUpVTVAJUmVzdW1lU2VuZENvbW1hbmQKKworYXQgMHgwMDAwMDBhMCA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDFlOCwKKy8qCisKK0lnbm9yZU1zZ0luQWZ0ZXJDbWQ6CisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwYTIgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCUpVTVAJUmVzdW1lU2VuZENvbW1hbmQKKworYXQgMHgwMDAwMDBhNCA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDFlOCwKKy8qCisKK0Rpc2Nvbm5lY3RBZnRlckNtZDoKKwlDTEVBUglBQ0sKKworYXQgMHgwMDAwMDBhNiA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisJV0FJVAlESVNDT05ORUNUCisKK2F0IDB4MDAwMDAwYTggOiAqLwkweDQ4MDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCUVOVFJZCURpc2Nvbm5lY3QxCitEaXNjb25uZWN0MToKKwlJTlQJRElTQ09OTkVDVF9BRlRFUl9DTUQKKworYXQgMHgwMDAwMDBhYSA6ICovCTB4OTgwODAwMDAsMHgwMDAwMDM4MCwKKy8qCisJRU5UUlkJRGlzY29ubmVjdDIKK0Rpc2Nvbm5lY3QyOgorOyBXZSByZXR1cm4gaGVyZSBhZnRlciBhIHJlc2VsZWN0aW9uCisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwYWMgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCUpVTVAJUmVzdW1lU2VuZENvbW1hbmQKKworYXQgMHgwMDAwMDBhZSA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDFlOCwKKy8qCisKK01zZ0luQmVmb3JlQ29tbWFuZDoKKwlNT1ZFCTEsIFJlY2VpdmVNc2dBZGRyZXNzLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMGIwIDogKi8JMHgwZjAwMDAwMSwweDAwMDAwMDAwLAorLyoKKwlKVU1QCUlnbm9yZU1zZ0JlZm9yZUNvbW1hbmQsIElGIFNBVkVfREFUQV9QVFJTX01TRworCithdCAweDAwMDAwMGIyIDogKi8JMHg4MDBjMDAwMiwweDAwMDAwMWMwLAorLyoKKwlKVU1QCUlnbm9yZU1zZ0JlZm9yZUNvbW1hbmQsIElGIFJFU1RPUkVfREFUQV9QVFJTX01TRworCithdCAweDAwMDAwMGI0IDogKi8JMHg4MDBjMDAwMywweDAwMDAwMWMwLAorLyoKKwlDQUxMCVByb2Nlc3NSZWNlaXZlTWVzc2FnZQorCithdCAweDAwMDAwMGI2IDogKi8JMHg4ODA4MDAwMCwweDAwMDAwMGE4LAorLyoKKwlJTlQJTVNHX0lOX0JFRk9SRV9DTUQKKworYXQgMHgwMDAwMDBiOCA6ICovCTB4OTgwODAwMDAsMHgwMDAwMDI1MCwKKy8qCisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwYmEgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCUpVTVAJU2VuZENvbW1hbmQKKworYXQgMHgwMDAwMDBiYyA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDFjOCwKKy8qCisKK0RhdGFJbjoKKwlDQUxMCVNHU2NyaXB0U3RhcnRBZGRyZXNzCisKK2F0IDB4MDAwMDAwYmUgOiAqLwkweDg4MDgwMDAwLDB4MDAwMDAwMDAsCisvKgorUmVzdW1lRGF0YUluOgorCUpVTVAJRmluaXNoLCBXSEVOIFNUQVRVUworCithdCAweDAwMDAwMGMwIDogKi8JMHg4MzBiMDAwMCwweDAwMDAwNDYwLAorLyoKKwlKVU1QCU1zZ0luQWZ0ZXJEYXRhSW4sIElGIE1TR19JTgorCithdCAweDAwMDAwMGMyIDogKi8JMHg4NzBhMDAwMCwweDAwMDAwMzU4LAorLyoKKwlKVU1QCURhdGFJbkFmdGVyRGF0YUluLCBpZiBEQVRBX0lOCisKK2F0IDB4MDAwMDAwYzQgOiAqLwkweDgxMGEwMDAwLDB4MDAwMDAzMjgsCisvKgorCUlOVAlNU0dfT1VUX0FGVEVSX0RBVEFfSU4sIGlmIE1TR19PVVQKKworYXQgMHgwMDAwMDBjNiA6ICovCTB4OWUwYTAwMDAsMHgwMDAwMDU5MCwKKy8qCisJSU5UCVVORVhQRUNURURfUEhBU0VfQUZURVJfREFUQV9JTgorCithdCAweDAwMDAwMGM4IDogKi8JMHg5ODA4MDAwMCwweDAwMDAwNTIwLAorLyoKKworRGF0YUluQWZ0ZXJEYXRhSW46CisJSU5UCURBVEFfSU5fQUZURVJfREFUQV9JTgorCithdCAweDAwMDAwMGNhIDogKi8JMHg5ODA4MDAwMCwweDAwMDAwNWEwLAorLyoKKwlKVU1QCVJlc3VtZURhdGFJbgorCithdCAweDAwMDAwMGNjIDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMzAwLAorLyoKKworRGF0YU91dDoKKwlDQUxMCVNHU2NyaXB0U3RhcnRBZGRyZXNzCisKK2F0IDB4MDAwMDAwY2UgOiAqLwkweDg4MDgwMDAwLDB4MDAwMDAwMDAsCisvKgorUmVzdW1lRGF0YU91dDoKKwlKVU1QCUZpbmlzaCwgV0hFTiBTVEFUVVMKKworYXQgMHgwMDAwMDBkMCA6ICovCTB4ODMwYjAwMDAsMHgwMDAwMDQ2MCwKKy8qCisJSlVNUAlNc2dJbkFmdGVyRGF0YU91dCwgSUYgTVNHX0lOCisKK2F0IDB4MDAwMDAwZDIgOiAqLwkweDg3MGEwMDAwLDB4MDAwMDAzZTgsCisvKgorCUlOVAlVTkVYUEVDVEVEX1BIQVNFX0FGVEVSX0RBVEFfT1VUCisKK2F0IDB4MDAwMDAwZDQgOiAqLwkweDk4MDgwMDAwLDB4MDAwMDA2MjAsCisvKgorCitNc2dJbkFmdGVyRGF0YUluOgorCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MsIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAwZDYgOiAqLwkweDBmMDAwMDAxLDB4MDAwMDAwMDAsCisvKgorCUpVTVAJRGlzY29ubmVjdEFmdGVyRGF0YUluLCBJRiBESVNDT05ORUNUX01TRworCithdCAweDAwMDAwMGQ4IDogKi8JMHg4MDBjMDAwNCwweDAwMDAwM2MwLAorLyoKKwlKVU1QCUlnbm9yZU1zZ0FmdGVyRGF0YSwgSUYgU0FWRV9EQVRBX1BUUlNfTVNHCisKK2F0IDB4MDAwMDAwZGEgOiAqLwkweDgwMGMwMDAyLDB4MDAwMDA0MjgsCisvKgorCUpVTVAJSWdub3JlTXNnQWZ0ZXJEYXRhLCBJRiBSRVNUT1JFX0RBVEFfUFRSU19NU0cKKworYXQgMHgwMDAwMDBkYyA6ICovCTB4ODAwYzAwMDMsMHgwMDAwMDQyOCwKKy8qCisJQ0FMTAlQcm9jZXNzUmVjZWl2ZU1lc3NhZ2UKKworYXQgMHgwMDAwMDBkZSA6ICovCTB4ODgwODAwMDAsMHgwMDAwMDBhOCwKKy8qCisJSU5UCU1TR19JTl9BRlRFUl9EQVRBX0lOCisKK2F0IDB4MDAwMDAwZTAgOiAqLwkweDk4MDgwMDAwLDB4MDAwMDA1NTAsCisvKgorCUNMRUFSCUFDSworCithdCAweDAwMDAwMGUyIDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKwlKVU1QCVJlc3VtZURhdGFJbgorCithdCAweDAwMDAwMGU0IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMzAwLAorLyoKKworRGlzY29ubmVjdER1cmluZ0RhdGFJbjoKKwlDTEVBUglBQ0sKKworYXQgMHgwMDAwMDBlNiA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisJV0FJVAlESVNDT05ORUNUCisKK2F0IDB4MDAwMDAwZTggOiAqLwkweDQ4MDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCUVOVFJZCURpc2Nvbm5lY3QzCitEaXNjb25uZWN0MzoKKwlJTlQJRElTQ09OTkVDVF9EVVJJTkdfREFUQQorCithdCAweDAwMDAwMGVhIDogKi8JMHg5ODA4MDAwMCwweDAwMDAwNzgwLAorLyoKKwlFTlRSWQlEaXNjb25uZWN0NAorRGlzY29ubmVjdDQ6Cis7IHdlIHJldHVybiBoZXJlIGFmdGVyIGEgcmVzZWxlY3Rpb24KKwlDTEVBUglBQ0sKKworYXQgMHgwMDAwMDBlYyA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisJSlVNUAlSZXN1bWVTZW5kQ29tbWFuZAorCithdCAweDAwMDAwMGVlIDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMWU4LAorLyoKKworCitEaXNjb25uZWN0QWZ0ZXJEYXRhSW46CisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwZjAgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCVdBSVQJRElTQ09OTkVDVAorCithdCAweDAwMDAwMGYyIDogKi8JMHg0ODAwMDAwMCwweDAwMDAwMDAwLAorLyoKKwlFTlRSWQlEaXNjb25uZWN0NQorRGlzY29ubmVjdDU6CisJSU5UCURJU0NPTk5FQ1RfQUZURVJfREFUQQorCithdCAweDAwMDAwMGY0IDogKi8JMHg5ODA4MDAwMCwweDAwMDAwNTgwLAorLyoKKwlFTlRSWQlEaXNjb25uZWN0NgorRGlzY29ubmVjdDY6Cis7IHdlIHJldHVybiBoZXJlIGFmdGVyIGEgcmVzZWxlY3Rpb24KKwlDTEVBUglBQ0sKKworYXQgMHgwMDAwMDBmNiA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisJSlVNUAlSZXN1bWVEYXRhSW4KKworYXQgMHgwMDAwMDBmOCA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDMwMCwKKy8qCisKK01zZ0luQWZ0ZXJEYXRhT3V0OgorCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MsIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAwZmEgOiAqLwkweDBmMDAwMDAxLDB4MDAwMDAwMDAsCisvKgorCUpVTVAJRGlzY29ubmVjdEFmdGVyRGF0YU91dCwgaWYgRElTQ09OTkVDVF9NU0cKKworYXQgMHgwMDAwMDBmYyA6ICovCTB4ODAwYzAwMDQsMHgwMDAwMDQzOCwKKy8qCisJSlVNUAlJZ25vcmVNc2dBZnRlckRhdGEsIElGIFNBVkVfREFUQV9QVFJTX01TRworCithdCAweDAwMDAwMGZlIDogKi8JMHg4MDBjMDAwMiwweDAwMDAwNDI4LAorLyoKKwlKVU1QCUlnbm9yZU1zZ0FmdGVyRGF0YSwgSUYgUkVTVE9SRV9EQVRBX1BUUlNfTVNHCisKK2F0IDB4MDAwMDAxMDAgOiAqLwkweDgwMGMwMDAzLDB4MDAwMDA0MjgsCisvKgorCUNBTEwJUHJvY2Vzc1JlY2VpdmVNZXNzYWdlCisKK2F0IDB4MDAwMDAxMDIgOiAqLwkweDg4MDgwMDAwLDB4MDAwMDAwYTgsCisvKgorCUlOVAlNU0dfSU5fQUZURVJfREFUQV9PVVQKKworYXQgMHgwMDAwMDEwNCA6ICovCTB4OTgwODAwMDAsMHgwMDAwMDY1MCwKKy8qCisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAxMDYgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCUpVTVAJUmVzdW1lRGF0YU91dAorCithdCAweDAwMDAwMTA4IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMzQwLAorLyoKKworSWdub3JlTXNnQWZ0ZXJEYXRhOgorCUNMRUFSCUFDSworCithdCAweDAwMDAwMTBhIDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKzsgRGF0YSBpbiBhbmQgb3V0IGRvIHRoZSBzYW1lIHRoaW5nIG9uIHJlc3VtZSwgc28gcGljayBvbmUKKwlKVU1QCVJlc3VtZURhdGFJbgorCithdCAweDAwMDAwMTBjIDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMzAwLAorLyoKKworRGlzY29ubmVjdEFmdGVyRGF0YU91dDoKKwlDTEVBUglBQ0sKKworYXQgMHgwMDAwMDEwZSA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisJV0FJVAlESVNDT05ORUNUCisKK2F0IDB4MDAwMDAxMTAgOiAqLwkweDQ4MDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCUVOVFJZCURpc2Nvbm5lY3Q3CitEaXNjb25uZWN0NzoKKwlJTlQJRElTQ09OTkVDVF9BRlRFUl9EQVRBCisKK2F0IDB4MDAwMDAxMTIgOiAqLwkweDk4MDgwMDAwLDB4MDAwMDA1ODAsCisvKgorCUVOVFJZCURpc2Nvbm5lY3Q4CitEaXNjb25uZWN0ODoKKzsgd2UgcmV0dXJuIGhlcmUgYWZ0ZXIgYSByZXNlbGVjdGlvbgorCUNMRUFSCUFDSworCithdCAweDAwMDAwMTE0IDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKwlKVU1QCVJlc3VtZURhdGFPdXQKKworYXQgMHgwMDAwMDExNiA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDM0MCwKKy8qCisKK0ZpbmlzaDoKKwlNT1ZFCTEsIFN0YXR1c0FkZHJlc3MsIFdIRU4gU1RBVFVTCisKK2F0IDB4MDAwMDAxMTggOiAqLwkweDBiMDAwMDAxLDB4MDAwMDAwMDAsCisvKgorCUlOVAlOT1RfTVNHX0lOX0FGVEVSX1NUQVRVUywgV0hFTiBOT1QgTVNHX0lOCisKK2F0IDB4MDAwMDAxMWEgOiAqLwkweDlmMDMwMDAwLDB4MDAwMDA0MzAsCisvKgorCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MsIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAxMWMgOiAqLwkweDBmMDAwMDAxLDB4MDAwMDAwMDAsCisvKgorCUpVTVAJRmluaXNoQ29tbWFuZENvbXBsZXRlLCBJRiBDT01NQU5EX0NPTVBMRVRFX01TRworCithdCAweDAwMDAwMTFlIDogKi8JMHg4MDBjMDAwMCwweDAwMDAwNDkwLAorLyoKKwlDQUxMCVByb2Nlc3NSZWNlaXZlTWVzc2FnZQorCithdCAweDAwMDAwMTIwIDogKi8JMHg4ODA4MDAwMCwweDAwMDAwMGE4LAorLyoKKwlJTlQJTVNHX0lOX0FGVEVSX1NUQVRVUworCithdCAweDAwMDAwMTIyIDogKi8JMHg5ODA4MDAwMCwweDAwMDAwNDQwLAorLyoKKwlFTlRSWQlGaW5pc2hDb21tYW5kQ29tcGxldGUKK0ZpbmlzaENvbW1hbmRDb21wbGV0ZToKKwlDTEVBUglBQ0sKKworYXQgMHgwMDAwMDEyNCA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisJV0FJVAlESVNDT05ORUNUCisKK2F0IDB4MDAwMDAxMjYgOiAqLwkweDQ4MDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCUVOVFJZCUZpbmlzaDEKK0ZpbmlzaDE6CisJSU5UCUdPT0RfU1RBVFVTX0FGVEVSX1NUQVRVUworCithdCAweDAwMDAwMTI4IDogKi8JMHg5ODA4MDAwMCwweDAwMDAwNDAxLAorfTsKKworI2RlZmluZSBBX0FGVEVSX0NNRAkweDAwMDAwMzAwCitzdGF0aWMgdTMyIEFfQUZURVJfQ01EX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfQUZURVJfREFUQV9JTgkweDAwMDAwNTAwCitzdGF0aWMgdTMyIEFfQUZURVJfREFUQV9JTl91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX0FGVEVSX0RBVEFfT1VUCTB4MDAwMDA2MDAKK3N0YXRpYyB1MzIgQV9BRlRFUl9EQVRBX09VVF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX0FGVEVSX1NFTEVDVElPTgkweDAwMDAwMTAwCitzdGF0aWMgdTMyIEFfQUZURVJfU0VMRUNUSU9OX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfQUZURVJfU1RBVFVTCTB4MDAwMDA0MDAKK3N0YXRpYyB1MzIgQV9BRlRFUl9TVEFUVVNfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9CRUZPUkVfQ01ECTB4MDAwMDAyMDAKK3N0YXRpYyB1MzIgQV9CRUZPUkVfQ01EX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfQ09NTUFORF9DT01QTEVURV9NU0cJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX0NPTU1BTkRfQ09NUExFVEVfTVNHX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDExZSwKK307CisKKyNkZWZpbmUgQV9DT01QTEVURURfU0VMRUNUSU9OX0FTX1RBUkdFVAkweDAwMDAxMDAxCitzdGF0aWMgdTMyIEFfQ09NUExFVEVEX1NFTEVDVElPTl9BU19UQVJHRVRfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDFkLAorfTsKKworI2RlZmluZSBBX0NvbW1hbmRBZGRyZXNzCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9Db21tYW5kQWRkcmVzc191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwNzksCit9OworCisjZGVmaW5lIEFfQ29tbWFuZENvdW50CTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9Db21tYW5kQ291bnRfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDc4LAorfTsKKworI2RlZmluZSBBX0RBVEFfSU5fQUZURVJfREFUQV9JTgkweDAwMDAwNWEwCitzdGF0aWMgdTMyIEFfREFUQV9JTl9BRlRFUl9EQVRBX0lOX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDBjYiwKK307CisKKyNkZWZpbmUgQV9ERUJVR19JTlRFUlJVUFQJMHgwMDAwMzAwMAorc3RhdGljIHUzMiBBX0RFQlVHX0lOVEVSUlVQVF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX0RFQlVHX0lOVEVSUlVQVDEJMHgwMDAwMzAwMQorc3RhdGljIHUzMiBBX0RFQlVHX0lOVEVSUlVQVDFfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9ERUJVR19JTlRFUlJVUFQyCTB4MDAwMDMwMDIKK3N0YXRpYyB1MzIgQV9ERUJVR19JTlRFUlJVUFQyX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfREVCVUdfSU5URVJSVVBUMwkweDAwMDAzMDAzCitzdGF0aWMgdTMyIEFfREVCVUdfSU5URVJSVVBUM191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX0RFQlVHX0lOVEVSUlVQVDQJMHgwMDAwMzAwNAorc3RhdGljIHUzMiBBX0RFQlVHX0lOVEVSUlVQVDRfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9ERUJVR19JTlRFUlJVUFQ1CTB4MDAwMDMwMDUKK3N0YXRpYyB1MzIgQV9ERUJVR19JTlRFUlJVUFQ1X3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfREVCVUdfSU5URVJSVVBUNgkweDAwMDAzMDA2CitzdGF0aWMgdTMyIEFfREVCVUdfSU5URVJSVVBUNl91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX0RJU0NPTk5FQ1QJMHgwMDAwMDA4MAorc3RhdGljIHUzMiBBX0RJU0NPTk5FQ1RfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9ESVNDT05ORUNUX0FGVEVSX0NNRAkweDAwMDAwMzgwCitzdGF0aWMgdTMyIEFfRElTQ09OTkVDVF9BRlRFUl9DTURfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMGFiLAorfTsKKworI2RlZmluZSBBX0RJU0NPTk5FQ1RfQUZURVJfREFUQQkweDAwMDAwNTgwCitzdGF0aWMgdTMyIEFfRElTQ09OTkVDVF9BRlRFUl9EQVRBX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDBmNSwKKwkweDAwMDAwMTEzLAorfTsKKworI2RlZmluZSBBX0RJU0NPTk5FQ1RfRFVSSU5HX0RBVEEJMHgwMDAwMDc4MAorc3RhdGljIHUzMiBBX0RJU0NPTk5FQ1RfRFVSSU5HX0RBVEFfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMGViLAorfTsKKworI2RlZmluZSBBX0RJU0NPTk5FQ1RfTVNHCTB4MDAwMDAwMDQKK3N0YXRpYyB1MzIgQV9ESVNDT05ORUNUX01TR191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwOGEsCisJMHgwMDAwMDA5NCwKKwkweDAwMDAwMGQ4LAorCTB4MDAwMDAwZmMsCit9OworCisjZGVmaW5lIEFfRFVSSU5HX0RBVEFfSU4JMHgwMDAwMDcwMAorc3RhdGljIHUzMiBBX0RVUklOR19EQVRBX0lOX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfRGV2aWNlX0lECTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9EZXZpY2VfSURfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDAwLAorfTsKKworI2RlZmluZSBBX0VYVEVOREVEX01TRwkweDAwMDAwMDAxCitzdGF0aWMgdTMyIEFfRVhURU5ERURfTVNHX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDAyYSwKK307CisKKyNkZWZpbmUgQV9GQVRBTAkweDAwMDAyMDAwCitzdGF0aWMgdTMyIEFfRkFUQUxfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9GQVRBTF9JTExFR0FMX01TR19MRU5HVEgJMHgwMDAwMjAwMworc3RhdGljIHUzMiBBX0ZBVEFMX0lMTEVHQUxfTVNHX0xFTkdUSF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwNDMsCit9OworCisjZGVmaW5lIEFfRkFUQUxfTk9UX01TR19JTl9BRlRFUl9TRUxFQ1RJT04JMHgwMDAwMjAwMgorc3RhdGljIHUzMiBBX0ZBVEFMX05PVF9NU0dfSU5fQUZURVJfU0VMRUNUSU9OX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDAwZCwKK307CisKKyNkZWZpbmUgQV9GQVRBTF9TRU5EX01TRwkweDAwMDAyMDAxCitzdGF0aWMgdTMyIEFfRkFUQUxfU0VORF9NU0dfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDIzLAorfTsKKworI2RlZmluZSBBX0ZBVEFMX1VORVhQRUNURURfUkVTRUxFQ1RJT05fTVNHCTB4MDAwMDIwMDAKK3N0YXRpYyB1MzIgQV9GQVRBTF9VTkVYUEVDVEVEX1JFU0VMRUNUSU9OX01TR191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX0dPT0RfU1RBVFVTCTB4MDAwMDAwMDEKK3N0YXRpYyB1MzIgQV9HT09EX1NUQVRVU191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX0dPT0RfU1RBVFVTX0FGVEVSX1NUQVRVUwkweDAwMDAwNDAxCitzdGF0aWMgdTMyIEFfR09PRF9TVEFUVVNfQUZURVJfU1RBVFVTX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDEyOSwKK307CisKKyNkZWZpbmUgQV9JREVOVElGWV9NU0cJMHgwMDAwMDA4MAorc3RhdGljIHUzMiBBX0lERU5USUZZX01TR191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX0lERU5USUZZX01TR19NQVNLCTB4MDAwMDAwN2YKK3N0YXRpYyB1MzIgQV9JREVOVElGWV9NU0dfTUFTS191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX01TR19JTgkweDAwMDAwMDUwCitzdGF0aWMgdTMyIEFfTVNHX0lOX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfTVNHX0lOX0FGVEVSX0NNRAkweDAwMDAwMzUwCitzdGF0aWMgdTMyIEFfTVNHX0lOX0FGVEVSX0NNRF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwOWQsCit9OworCisjZGVmaW5lIEFfTVNHX0lOX0FGVEVSX0RBVEFfSU4JMHgwMDAwMDU1MAorc3RhdGljIHUzMiBBX01TR19JTl9BRlRFUl9EQVRBX0lOX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDBlMSwKK307CisKKyNkZWZpbmUgQV9NU0dfSU5fQUZURVJfREFUQV9PVVQJMHgwMDAwMDY1MAorc3RhdGljIHUzMiBBX01TR19JTl9BRlRFUl9EQVRBX09VVF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAxMDUsCit9OworCisjZGVmaW5lIEFfTVNHX0lOX0FGVEVSX1NUQVRVUwkweDAwMDAwNDQwCitzdGF0aWMgdTMyIEFfTVNHX0lOX0FGVEVSX1NUQVRVU191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAxMjMsCit9OworCisjZGVmaW5lIEFfTVNHX0lOX0JFRk9SRV9DTUQJMHgwMDAwMDI1MAorc3RhdGljIHUzMiBBX01TR19JTl9CRUZPUkVfQ01EX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDBiOSwKK307CisKKyNkZWZpbmUgQV9NU0dfSU5fRFVSSU5HX0RBVEFfSU4JMHgwMDAwMDc1MAorc3RhdGljIHUzMiBBX01TR19JTl9EVVJJTkdfREFUQV9JTl91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwOTEsCit9OworCisjZGVmaW5lIEFfTVNHX09VVAkweDAwMDAwMDkwCitzdGF0aWMgdTMyIEFfTVNHX09VVF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX01TR19PVVRfQUZURVJfREFUQV9JTgkweDAwMDAwNTkwCitzdGF0aWMgdTMyIEFfTVNHX09VVF9BRlRFUl9EQVRBX0lOX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDBjNywKK307CisKKyNkZWZpbmUgQV9NZXNzYWdlQ291bnQJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX01lc3NhZ2VDb3VudF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMWUsCit9OworCisjZGVmaW5lIEFfTWVzc2FnZUxvY2F0aW9uCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9NZXNzYWdlTG9jYXRpb25fdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDFmLAorfTsKKworI2RlZmluZSBBX05PVF9NU0dfSU4JMHgwMDAwMDAzMAorc3RhdGljIHUzMiBBX05PVF9NU0dfSU5fdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9OT1RfTVNHX0lOX0FGVEVSX1NUQVRVUwkweDAwMDAwNDMwCitzdGF0aWMgdTMyIEFfTk9UX01TR19JTl9BRlRFUl9TVEFUVVNfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMTFiLAorfTsKKworI2RlZmluZSBBX05PVF9NU0dfT1VUCTB4MDAwMDAwMTAKK3N0YXRpYyB1MzIgQV9OT1RfTVNHX09VVF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX05PVF9NU0dfT1VUX0FGVEVSX1NFTEVDVElPTgkweDAwMDAwMTEwCitzdGF0aWMgdTMyIEFfTk9UX01TR19PVVRfQUZURVJfU0VMRUNUSU9OX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDAwNywKK307CisKKyNkZWZpbmUgQV9QQVJJVFlfRVJST1JfTVNHCTB4MDAwMDAwMDkKK3N0YXRpYyB1MzIgQV9QQVJJVFlfRVJST1JfTVNHX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfUkVKRUNUX01TRwkweDAwMDAwMDA3CitzdGF0aWMgdTMyIEFfUkVKRUNUX01TR191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX1JFSkVDVF9NU0dfQkVGT1JFX0NNRAkweDAwMDAwMjcwCitzdGF0aWMgdTMyIEFfUkVKRUNUX01TR19CRUZPUkVfQ01EX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfUkVKRUNUX01TR19SCTB4MDAwMDAwNzAKK3N0YXRpYyB1MzIgQV9SRUpFQ1RfTVNHX1JfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9SRVNFTEVDVEVEX0RVUklOR19TRUxFQ1RJT04JMHgwMDAwMTAwMAorc3RhdGljIHUzMiBBX1JFU0VMRUNURURfRFVSSU5HX1NFTEVDVElPTl91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMGIsCit9OworCisjZGVmaW5lIEFfUkVTRUxFQ1RJT05fSURFTlRJRklFRAkweDAwMDAxMDAzCitzdGF0aWMgdTMyIEFfUkVTRUxFQ1RJT05fSURFTlRJRklFRF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMTEsCisJMHgwMDAwMDAxNSwKK307CisKKyNkZWZpbmUgQV9SRVNUT1JFX0RBVEFfUFRSU19NU0cJMHgwMDAwMDAwMworc3RhdGljIHUzMiBBX1JFU1RPUkVfREFUQV9QVFJTX01TR191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwOGUsCisJMHgwMDAwMDA5OCwKKwkweDAwMDAwMGI0LAorCTB4MDAwMDAwZGMsCisJMHgwMDAwMDEwMCwKK307CisKKyNkZWZpbmUgQV9SZWNlaXZlTXNnQWRkcmVzcwkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfUmVjZWl2ZU1zZ0FkZHJlc3NfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDBmLAorCTB4MDAwMDAwMTMsCisJMHgwMDAwMDAyOSwKKwkweDAwMDAwMDMxLAorCTB4MDAwMDAwMzcsCisJMHgwMDAwMDA0NywKKwkweDAwMDAwMDRkLAorCTB4MDAwMDAwNTMsCisJMHgwMDAwMDA1OSwKKwkweDAwMDAwMDVmLAorCTB4MDAwMDAwODksCisJMHgwMDAwMDA5MywKKwkweDAwMDAwMGIxLAorCTB4MDAwMDAwZDcsCisJMHgwMDAwMDBmYiwKKwkweDAwMDAwMTFkLAorfTsKKworI2RlZmluZSBBX1NBVkVfREFUQV9QVFJTX01TRwkweDAwMDAwMDAyCitzdGF0aWMgdTMyIEFfU0FWRV9EQVRBX1BUUlNfTVNHX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDA4YywKKwkweDAwMDAwMDk2LAorCTB4MDAwMDAwYjIsCisJMHgwMDAwMDBkYSwKKwkweDAwMDAwMGZlLAorfTsKKworI2RlZmluZSBBX1NEVFJfTVNHCTB4MDAwMDAwMDEKK3N0YXRpYyB1MzIgQV9TRFRSX01TR191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX1NEVFJfTVNHX0FGVEVSX0NNRAkweDAwMDAwMzYwCitzdGF0aWMgdTMyIEFfU0RUUl9NU0dfQUZURVJfQ01EX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfU0RUUl9NU0dfQkVGT1JFX0NNRAkweDAwMDAwMjYwCitzdGF0aWMgdTMyIEFfU0RUUl9NU0dfQkVGT1JFX0NNRF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX1NEVFJfTVNHX1IJMHgwMDAwMDA2MAorc3RhdGljIHUzMiBBX1NEVFJfTVNHX1JfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9TR1NjcmlwdFN0YXJ0QWRkcmVzcwkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfU0dTY3JpcHRTdGFydEFkZHJlc3NfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMGJmLAorCTB4MDAwMDAwY2YsCit9OworCisjZGVmaW5lIEFfU0lNUExFX1RBR19NU0cJMHgwMDAwMDAyMAorc3RhdGljIHUzMiBBX1NJTVBMRV9UQUdfTVNHX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfU3RhdHVzQWRkcmVzcwkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfU3RhdHVzQWRkcmVzc191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAxMTksCit9OworCisjZGVmaW5lIEFfVFdPX0JZVEVfTVNHCTB4MDAwMDAwMjAKK3N0YXRpYyB1MzIgQV9UV09fQllURV9NU0dfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDJjLAorfTsKKworI2RlZmluZSBBX1RXT19CWVRFX01TR19NQVNLCTB4MDAwMDAwMGYKK3N0YXRpYyB1MzIgQV9UV09fQllURV9NU0dfTUFTS191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMmMsCit9OworCisjZGVmaW5lIEFfVU5FWFBFQ1RFRF9NU0cJMHgwMDAwMDA0MAorc3RhdGljIHUzMiBBX1VORVhQRUNURURfTVNHX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfVU5FWFBFQ1RFRF9NU0dfQkVGT1JFX0NNRAkweDAwMDAwMjQwCitzdGF0aWMgdTMyIEFfVU5FWFBFQ1RFRF9NU0dfQkVGT1JFX0NNRF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX1VORVhQRUNURURfUEhBU0UJMHgwMDAwMDAyMAorc3RhdGljIHUzMiBBX1VORVhQRUNURURfUEhBU0VfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9VTkVYUEVDVEVEX1BIQVNFX0FGVEVSX0NNRAkweDAwMDAwMzIwCitzdGF0aWMgdTMyIEFfVU5FWFBFQ1RFRF9QSEFTRV9BRlRFUl9DTURfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDgzLAorfTsKKworI2RlZmluZSBBX1VORVhQRUNURURfUEhBU0VfQUZURVJfREFUQV9JTgkweDAwMDAwNTIwCitzdGF0aWMgdTMyIEFfVU5FWFBFQ1RFRF9QSEFTRV9BRlRFUl9EQVRBX0lOX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDBjOSwKK307CisKKyNkZWZpbmUgQV9VTkVYUEVDVEVEX1BIQVNFX0FGVEVSX0RBVEFfT1VUCTB4MDAwMDA2MjAKK3N0YXRpYyB1MzIgQV9VTkVYUEVDVEVEX1BIQVNFX0FGVEVSX0RBVEFfT1VUX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDBkNSwKK307CisKKyNkZWZpbmUgQV9VTkVYUEVDVEVEX1BIQVNFX0JFRk9SRV9DTUQJMHgwMDAwMDIyMAorc3RhdGljIHUzMiBBX1VORVhQRUNURURfUEhBU0VfQkVGT1JFX0NNRF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwNzcsCit9OworCisjZGVmaW5lIEFfV0RUUl9NU0cJMHgwMDAwMDAwMworc3RhdGljIHUzMiBBX1dEVFJfTVNHX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfV0RUUl9NU0dfQUZURVJfQ01ECTB4MDAwMDAzYTAKK3N0YXRpYyB1MzIgQV9XRFRSX01TR19BRlRFUl9DTURfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9XRFRSX01TR19SCTB4MDAwMDAwYTAKK3N0YXRpYyB1MzIgQV9XRFRSX01TR19SX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEVudF9EaXNjb25uZWN0MQkweDAwMDAwMmE4CisjZGVmaW5lIEVudF9EaXNjb25uZWN0MgkweDAwMDAwMmIwCisjZGVmaW5lIEVudF9EaXNjb25uZWN0MwkweDAwMDAwM2E4CisjZGVmaW5lIEVudF9EaXNjb25uZWN0NAkweDAwMDAwM2IwCisjZGVmaW5lIEVudF9EaXNjb25uZWN0NQkweDAwMDAwM2QwCisjZGVmaW5lIEVudF9EaXNjb25uZWN0NgkweDAwMDAwM2Q4CisjZGVmaW5lIEVudF9EaXNjb25uZWN0NwkweDAwMDAwNDQ4CisjZGVmaW5lIEVudF9EaXNjb25uZWN0OAkweDAwMDAwNDUwCisjZGVmaW5lIEVudF9GaW5pc2gxCTB4MDAwMDA0YTAKKyNkZWZpbmUgRW50X0ZpbmlzaDIJMHgwMDAwMDRhOAorI2RlZmluZSBFbnRfRmluaXNoQ29tbWFuZENvbXBsZXRlCTB4MDAwMDA0OTAKKyNkZWZpbmUgRW50X0dldFJlc2VsZWN0aW9uRGF0YQkweDAwMDAwMDM4CisjZGVmaW5lIEVudF9HZXRSZXNlbGVjdGlvbldpdGhUYWcJMHgwMDAwMDA0OAorI2RlZmluZSBFbnRfSWdub3JlTWVzc2FnZQkweDAwMDAwMTg4CisjZGVmaW5lIEVudF9Nc2dJbkR1cmluZ0RhdGEJMHgwMDAwMDIxOAorI2RlZmluZSBFbnRfUmVjZWl2ZU1lc3NhZ2UJMHgwMDAwMDBhMAorI2RlZmluZSBFbnRfU2VsZWN0ZWRBc1RhcmdldAkweDAwMDAwMDU4CisjZGVmaW5lIEVudF9TZW5kQ29tbWFuZAkweDAwMDAwMWM4CisjZGVmaW5lIEVudF9TZW5kTWVzc2FnZQkweDAwMDAwMDc4CisjZGVmaW5lIEVudF9TZW5kTWVzc2FnZVBoYXNlTWlzbWF0Y2gJMHgwMDAwMDA5MAorI2RlZmluZSBFbnRfU2VuZE1lc3NhZ2VXaXRoQVROCTB4MDAwMDAxOTgKKyNkZWZpbmUgRW50X1N0YXJ0VXAJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBMQUJFTFBBVENIRVNbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDAwMSwKKwkweDAwMDAwMDAzLAorCTB4MDAwMDAwMDUsCisJMHgwMDAwMDAwOSwKKwkweDAwMDAwMDI3LAorCTB4MDAwMDAwMmIsCisJMHgwMDAwMDAzOSwKKwkweDAwMDAwMDNiLAorCTB4MDAwMDAwM2QsCisJMHgwMDAwMDAzZiwKKwkweDAwMDAwMDQxLAorCTB4MDAwMDAwNmIsCisJMHgwMDAwMDA2ZCwKKwkweDAwMDAwMDczLAorCTB4MDAwMDAwNzUsCisJMHgwMDAwMDA3YiwKKwkweDAwMDAwMDdkLAorCTB4MDAwMDAwN2YsCisJMHgwMDAwMDA4MSwKKwkweDAwMDAwMDg3LAorCTB4MDAwMDAwOGIsCisJMHgwMDAwMDA4ZCwKKwkweDAwMDAwMDhmLAorCTB4MDAwMDAwOTUsCisJMHgwMDAwMDA5NywKKwkweDAwMDAwMDk5LAorCTB4MDAwMDAwOWIsCisJMHgwMDAwMDBhMSwKKwkweDAwMDAwMGE1LAorCTB4MDAwMDAwYWYsCisJMHgwMDAwMDBiMywKKwkweDAwMDAwMGI1LAorCTB4MDAwMDAwYjcsCisJMHgwMDAwMDBiZCwKKwkweDAwMDAwMGMxLAorCTB4MDAwMDAwYzMsCisJMHgwMDAwMDBjNSwKKwkweDAwMDAwMGNkLAorCTB4MDAwMDAwZDEsCisJMHgwMDAwMDBkMywKKwkweDAwMDAwMGQ5LAorCTB4MDAwMDAwZGIsCisJMHgwMDAwMDBkZCwKKwkweDAwMDAwMGRmLAorCTB4MDAwMDAwZTUsCisJMHgwMDAwMDBlZiwKKwkweDAwMDAwMGY5LAorCTB4MDAwMDAwZmQsCisJMHgwMDAwMDBmZiwKKwkweDAwMDAwMTAxLAorCTB4MDAwMDAxMDMsCisJMHgwMDAwMDEwOSwKKwkweDAwMDAwMTBkLAorCTB4MDAwMDAxMTcsCisJMHgwMDAwMDExZiwKKwkweDAwMDAwMTIxLAorfTsKKworc3RhdGljIHN0cnVjdCB7CisJdTMyCW9mZnNldDsKKwl2b2lkCQkqYWRkcmVzczsKK30gRVhURVJOQUxfUEFUQ0hFU1tdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKK3N0YXRpYyB1MzIgSU5TVFJVQ1RJT05TIF9fYXR0cmlidXRlKCh1bnVzZWQpKQk9IDE0OTsKK3N0YXRpYyB1MzIgUEFUQ0hFUyBfX2F0dHJpYnV0ZSgodW51c2VkKSkJPSA1NjsKK3N0YXRpYyB1MzIgRVhURVJOQUxfUEFUQ0hFU19MRU4gX19hdHRyaWJ1dGUoKHVudXNlZCkpCT0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS81M2M3eHguYyBiL2RyaXZlcnMvc2NzaS81M2M3eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWFkNTVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpLzUzYzd4eC5jCkBAIC0wLDAgKzEsNjEwMiBAQAorLyoKKyAqIDUzYzcxMCBkcml2ZXIuICBNb2RpZmllZCBmcm9tIERyZXcgRWNraGFyZHRzIGRyaXZlcgorICogZm9yIDUzYzgxMCBieSBSaWNoYXJkIEhpcnN0IFtyaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWtdCisgKiBDaGVjayBvdXQgUEVSTV9PUFRJT05TIGFuZCBFWFBFQ1RFRF9DTE9DSywgd2hpY2ggbWF5IGJlIGRlZmluZWQgaW4gdGhlCisgKiByZWxldmFudCBtYWNoaW5lIHNwZWNpZmljIGZpbGUgKGVnLiBtdm1lMTZ4LltjaF0sIGFtaWdhN3h4LltjaF0pLgorICogVGhlcmUgYXJlIGFsc28gY3VycmVudGx5IHNvbWUgZGVmaW5lcyBhdCB0aGUgdG9wIG9mIDUzYzd4eC5zY3IuCisgKiBUaGUgY2hpcCB0eXBlIGlzICNkZWZpbmVkIGluIHNjcmlwdF9hc20ucGwsIGFzIHdlbGwgYXMgdGhlIE1ha2VmaWxlLgorICogSG9zdCBzY3NpIElEIGV4cGVjdGVkIHRvIGJlIDcgLSBzZWUgTkNSNTNjN3gwX2luaXQoKS4KKyAqCisgKiBJIGhhdmUgcmVtb3ZlZCB0aGUgUENJIGNvZGUgYW5kIHNvbWUgb2YgdGhlIDUzYzh4eCBzcGVjaWZpYyBjb2RlIC0gCisgKiBzaW1wbHkgdG8gbWFrZSB0aGlzIGZpbGUgc21hbGxlciBhbmQgZWFzaWVyIHRvIG1hbmFnZS4KKyAqCisgKiBNVk1FMTZ4IGlzc3VlczoKKyAqICAgUHJvYmxlbXMgdHJ5aW5nIHRvIHJlYWQgYW55IGNoaXAgcmVnaXN0ZXJzIGluIE5DUjUzYzd4MF9pbml0KCksIGFzIHRoZXkKKyAqICAgbWF5IG5ldmVyIGhhdmUgYmVlbiBzZXQgYnkgMTZ4QnVnIChlZy4gSWYga2VybmVsIGhhcyBjb21lIGluIG92ZXIgdGZ0cCkuCisgKi8KKworLyoKKyAqIEFkYXB0ZWQgZm9yIExpbnV4L202OGsgQW1pZ2EgcGxhdGZvcm1zIGZvciB0aGUgQTQwMDBUL0E0MDkxIGFuZAorICogV2FycEVuZ2luZSBTQ1NJIGNvbnRyb2xsZXJzLgorICogQnkgQWxhbiBIb3VyaWhhbmUgPGFsYW5oQGZhaXJsaXRlLmRlbW9uLmNvLnVrPgorICogVGhhbmtzIHRvIFJpY2hhcmQgSGlyc3QgZm9yIG1ha2luZyBpdCBwb3NzaWJsZSB3aXRoIHRoZSBNVk1FIGFkZGl0aW9ucworICovCisKKy8qCisgKiA1M2M3MTAgcmV2IDAgZG9lc24ndCBzdXBwb3J0IGFkZCB3aXRoIGNhcnJ5LiAgUmV2IDEgYW5kIDIgZG9lcy4gIFRvCisgKiBvdmVyY29tZSB0aGlzIHByb2JsZW0geW91IGNhbiBkZWZpbmUgRk9SQ0VfRFNBX0FMSUdOTUVOVCwgd2hpY2ggZW5zdXJlcworICogdGhhdCB0aGUgRFNBIGFkZHJlc3MgaXMgYWx3YXlzIHh4eHh4eDAwLiAgSWYgZGlzY29ubmVjdGlvbiBpcyBub3QgYWxsb3dlZCwKKyAqIHRoZW4gdGhlIHNjcmlwdCBvbmx5IGV2ZXIgdHJpZXMgdG8gYWRkIHNtYWxsICg8IDI1NikgcG9zaXRpdmUgb2Zmc2V0cyB0bworICogRFNBLCBzbyBsYWNrIG9mIGNhcnJ5IGlzbid0IGEgcHJvYmxlbS4gIEZPUkNFX0RTQV9BTElHTk1FTlQgY2FuLCBvZiBjb3Vyc2UsCisgKiBiZSBkZWZpbmVkIGZvciBhbGwgY2hpcCByZXZpc2lvbnMgYXQgYSBzbWFsbCBjb3N0IGluIG1lbW9yeSB1c2FnZS4KKyAqLworCisjZGVmaW5lIEZPUkNFX0RTQV9BTElHTk1FTlQKKworLyoKKyAqIFNlbGVjdGlvbiB0aW1lciBkb2VzIG5vdCBhbHdheXMgd29yayBvbiB0aGUgNTNjNzEwLCBkZXBlbmRpbmcgb24gdGhlCisgKiB0aW1pbmcgYXQgdGhlIGxhc3QgZGlzY29ubmVjdCwgaWYgdGhpcyBpcyBhIHByb2JsZW0gZm9yIHlvdSwgdHJ5CisgKiB1c2luZyB2YWxpZGlkcyBhcyBkZXRhaWxlZCBiZWxvdy4KKyAqCisgKiBPcHRpb25zIGZvciB0aGUgTkNSN3h4IGRyaXZlcgorICoKKyAqIG5vYXN5bmM6MAkJLQlkaXNhYmxlcyBzeW5jIGFuZCBhc3luY2hyb25vdXMgbmVnb3RpYXRpb24KKyAqIG5vc3luYzowCQktCWRpc2FibGVzIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uIChkb2VzIGFzeW5jKQorICogbm9kaXNjb25uZWN0OjAJLQlkaXNhYmxlcyBkaXNjb25uZWN0aW9uCisgKiB2YWxpZGlkczoweD8/CS0JQml0bWFzayBmaWVsZCB0aGF0IGRpc2FsbG93cyBjZXJ0YWluIElEJ3MuCisgKgkJCS0JZS5nLgkweDAzCWFsbG93cyBJRCAwLDEKKyAqCQkJLQkJMHgxRglhbGxvd3MgSUQgMCwxLDIsMyw0CisgKiBvcHRoaTpuCQktCXJlcGxhY2UgdG9wIHdvcmQgb2Ygb3B0aW9ucyB3aXRoICduJworICogb3B0bG86bgkJLQlyZXBsYWNlIGJvdHRvbSB3b3JkIG9mIG9wdGlvbnMgd2l0aCAnbicKKyAqCQkJLQlBTFdBWVMgU1BFQ0lGWSBvcHRoaSBUSEVOIG9wdGxvIDw8PDw8PDw8PDwKKyAqLworCisvKgorICogUEVSTV9PUFRJT05TIGFyZSBkcml2ZXIgb3B0aW9ucyB3aGljaCB3aWxsIGJlIGVuYWJsZWQgZm9yIGFsbCBOQ1IgYm9hcmRzCisgKiBpbiB0aGUgc3lzdGVtIGF0IGRyaXZlciBpbml0aWFsaXphdGlvbiB0aW1lLgorICoKKyAqIERvbid0IFRISU5LIGFib3V0IHRvdWNoaW5nIHRoZXNlIGluIFBFUk1fT1BUSU9OUyA6IAorICogICBPUFRJT05fTUVNT1JZX01BUFBFRCAKKyAqIAk2ODB4MCBkb2Vzbid0IGhhdmUgYW4gSU8gbWFwIQorICoKKyAqICAgT1BUSU9OX0RFQlVHX1RFU1QxCisgKglUZXN0IDEgZG9lcyBidXMgbWFzdGVyaW5nIGFuZCBpbnRlcnJ1cHQgdGVzdHMsIHdoaWNoIHdpbGwgaGVscCB3ZWVkIAorICoJb3V0IGJyYWluIGRhbWFnZWQgbWFpbiBib2FyZHMuCisgKgorICogT3RoZXIgUEVSTV9PUFRJT05TIHNldHRpbmdzIGFyZSBsaXN0ZWQgYmVsb3cuICBOb3RlIHRoZSBhY3R1YWwgb3B0aW9ucworICogcmVxdWlyZWQgYXJlIHNldCBpbiB0aGUgcmVsZXZhbnQgZmlsZSAobXZtZTE2eC5jLCBhbWlnYTd4eC5jLCBldGMpOgorICoKKyAqICAgT1BUSU9OX05PX0FTWU5DCisgKglEb24ndCBuZWdvdGlhdGUgZm9yIGFzeW5jaHJvbm91cyB0cmFuc2ZlcnMgb24gdGhlIGZpcnN0IGNvbW1hbmQgCisgKgl3aGVuIE9QVElPTl9BTFdBWVNfU1lOQ0hST05PVVMgaXMgc2V0LiAgVXNlZnVsIGZvciBkYWluIGJyYW1hZ2VkCisgKglkZXZpY2VzIHdoaWNoIGRvIHNvbWV0aGluZyBiYWQgcmF0aGVyIHRoYW4gc2VuZGluZyBhIE1FU1NBR0UgCisgKglSRUpFQ1QgYmFjayB0byB1cyBsaWtlIHRoZXkgc2hvdWxkIGlmIHRoZXkgY2FuJ3QgY29wZS4KKyAqCisgKiAgIE9QVElPTl9TWU5DSFJPTk9VUworICoJRW5hYmxlIHN1cHBvcnQgZm9yIHN5bmNocm9ub3VzIHRyYW5zZmVycy4gIFRhcmdldCBuZWdvdGlhdGVkIAorICoJc3luY2hyb25vdXMgdHJhbnNmZXJzIHdpbGwgYmUgcmVzcG9uZGVkIHRvLiAgVG8gaW5pdGlhdGUgCisgKglhIHN5bmNocm9ub3VzIHRyYW5zZmVyIHJlcXVlc3QsICBjYWxsIAorICoKKyAqCSAgICByZXF1ZXN0X3N5bmNocm9ub3VzIChob3N0bm8sIHRhcmdldCkgCisgKgorICoJZnJvbSB3aXRoaW4gS0dEQi4KKyAqCisgKiAgIE9QVElPTl9BTFdBWVNfU1lOQ0hST05PVVMKKyAqCU5lZ290aWF0ZSBmb3Igc3luY2hyb25vdXMgdHJhbnNmZXJzIHdpdGggZXZlcnkgdGFyZ2V0IGFmdGVyCisgKglkcml2ZXIgaW5pdGlhbGl6YXRpb24gb3IgYSBTQ1NJIGJ1cyByZXNldC4gIFRoaXMgaXMgYSBiaXQgZGFuZ2Vyb3VzLCAKKyAqCXNpbmNlIHRoZXJlIGFyZSBzb21lIGRhaW4gYnJhbWFnZWQgU0NTSSBkZXZpY2VzIHdoaWNoIHdpbGwgYWNjZXB0CisgKglTRFRSIG1lc3NhZ2VzIGJ1dCBrZWVwIHRhbGtpbmcgYXN5bmNocm9ub3VzbHkuCisgKgorICogICBPUFRJT05fRElTQ09OTkVDVAorICoJRW5hYmxlIHN1cHBvcnQgZm9yIGRpc2Nvbm5lY3QvcmVjb25uZWN0LiAgVG8gY2hhbmdlIHRoZSAKKyAqCWRlZmF1bHQgc2V0dGluZyBvbiBhIGdpdmVuIGhvc3QgYWRhcHRlciwgY2FsbAorICoKKyAqCSAgICByZXF1ZXN0X2Rpc2Nvbm5lY3QgKGhvc3RubywgYWxsb3cpCisgKgorICoJd2hlcmUgYWxsb3cgaXMgbm9uLXplcm8gdG8gYWxsb3csIDAgdG8gZGlzYWxsb3cuCisgKiAKKyAqICBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gcnVuIDEwTUh6IEZBU1QgU0NTSS1JSSB0cmFuc2ZlcnMsIHlvdSBzaG91bGQgCisgKiAga25vdyB0aGF0IHRoZSBOQ1IgZHJpdmVyIGN1cnJlbnRseSBpZ25vcmVzIHBhcml0eSBpbmZvcm1hdGlvbi4gIE1vc3QKKyAqICBzeXN0ZW1zIGRvIDVNSHogU0NTSSBmaW5lLiAgSSd2ZSBzZWVuIGEgbG90IHRoYXQgaGF2ZSBwcm9ibGVtcyBmYXN0ZXIKKyAqICB0aGFuIDhNSHouICBUbyBwbGF5IGl0IHNhZmUsIHdlIG9ubHkgcmVxdWVzdCA1TUh6IHRyYW5zZmVycy4KKyAqCisgKiAgSWYgeW91J2QgcmF0aGVyIGdldCAxME1IeiB0cmFuc2ZlcnMsIGVkaXQgc2R0cl9tZXNzYWdlIGFuZCBjaGFuZ2UgCisgKiAgdGhlIGZvdXJ0aCBieXRlIGZyb20gNTAgdG8gMjUuCisgKi8KKworLyoKKyAqIFNwb25zb3JlZCBieSAKKyAqCWlYIE11bHRpdXNlciBNdWx0aXRhc2tpbmcgTWFnYXppbmUKKyAqCUhhbm5vdmVyLCBHZXJtYW55CisgKglobUBpeC5kZQorICoKKyAqIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk1IERyZXcgRWNraGFyZHQKKyAqICAgICAgVmlzaW9uYXJ5IENvbXB1dGluZyAKKyAqICAgICAgKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyAqICAgICAgZHJld0BQb29oU3RpY2tzLk9SRworICoJKzEgKDMwMykgNzg2LTc5NzUKKyAqCisgKiBUb2xlckFOVCBhbmQgU0NTSSBTQ1JJUFRTIGFyZSByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgTkNSIENvcnBvcmF0aW9uLgorICogCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKgorICogTkNSNTNDODEwIAorICogU0NTSSBJL08gUHJvY2Vzc29yCisgKiBQcm9ncmFtbWVyJ3MgR3VpZGUKKyAqCisgKiBOQ1IgNTNDODEwCisgKiBQQ0ktU0NTSSBJL08gUHJvY2Vzc29yCisgKiBEYXRhIE1hbnVhbAorICoKKyAqIE5DUiA1M0M4MTAvNTNDODIwCisgKiBQQ0ktU0NTSSBJL08gUHJvY2Vzc29yIERlc2lnbiBJbiBHdWlkZQorICoKKyAqIEZvciBsaXRlcmF0dXJlIG9uIFN5bWJpb3MgTG9naWMgSW5jLiBmb3JtZXJseSBOQ1IsIFNDU0ksIAorICogYW5kIENvbW11bmljYXRpb24gcHJvZHVjdHMgcGxlYXNlIGNhbGwgKDgwMCkgMzM0LTU0NTQgb3IKKyAqICg3MTkpIDUzNi0zMzAwLiAKKyAqIAorICogUENJIEJJT1MgU3BlY2lmaWNhdGlvbiBSZXZpc2lvbgorICogUENJIExvY2FsIEJ1cyBTcGVjaWZpY2F0aW9uCisgKiBQQ0kgU3lzdGVtIERlc2lnbiBHdWlkZQorICoKKyAqIFBDSSBTcGVjaWFsIEludGVyZXN0IEdyb3VwCisgKiBNL1MgSEYzLTE1QQorICogNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheQorICogSGlsbHNib3JvLCBPcmVnb24gOTcxMjQtNjQ5NworICogKzEgKDUwMykgNjk2LTIwMDAgCisgKiArMSAoODAwKSA0MzMtNTE3NworICovCisKKy8qCisgKiBEZXNpZ24gaXNzdWVzIDogCisgKiBUaGUgY3VtdWxhdGl2ZSBsYXRlbmN5IG5lZWRlZCB0byBwcm9wYWdhdGUgYSByZWFkL3dyaXRlIHJlcXVlc3QgCisgKiB0aHJvdWdoIHRoZSBmaWxlIHN5c3RlbSwgYnVmZmVyIGNhY2hlLCBkcml2ZXIgc3RhY2tzLCBTQ1NJIGhvc3QsIGFuZCAKKyAqIFNDU0kgZGV2aWNlIGlzIHVsdGltYXRlbHkgdGhlIGxpbWl0aW5nIGZhY3RvciBpbiB0aHJvdWdocHV0IG9uY2Ugd2UgCisgKiBoYXZlIGEgc3VmZmljaWVudGx5IGZhc3QgaG9zdCBhZGFwdGVyLgorICogIAorICogU28sIHRvIG1heGltaXplIHBlcmZvcm1hbmNlIHdlIHdhbnQgdG8ga2VlcCB0aGUgcmF0aW8gb2YgbGF0ZW5jeSB0byBkYXRhIAorICogdHJhbnNmZXIgdGltZSB0byBhIG1pbmltdW0gYnkKKyAqIDEuICBNaW5pbWl6aW5nIHRoZSB0b3RhbCBudW1iZXIgb2YgY29tbWFuZHMgc2VudCAodHlwaWNhbCBjb21tYW5kIGxhdGVuY3kKKyAqCWluY2x1ZGluZyBkcml2ZSBhbmQgYnVzIG1hc3RlcmluZyBob3N0IG92ZXJoZWFkIGlzIGFzIGhpZ2ggYXMgNC41bXMpCisgKgl0byB0cmFuc2ZlciBhIGdpdmVuIGFtb3VudCBvZiBkYXRhLiAgCisgKgorICogICAgICBUaGlzIGlzIGFjY29tcGxpc2hlZCBieSBwbGFjaW5nIG5vIGFyYml0cmFyeSBsaW1pdCBvbiB0aGUgbnVtYmVyCisgKglvZiBzY2F0dGVyL2dhdGhlciBidWZmZXJzIHN1cHBvcnRlZCwgc2luY2Ugd2UgY2FuIHRyYW5zZmVyIDFLCisgKglwZXIgc2NhdHRlci9nYXRoZXIgYnVmZmVyIHdpdGhvdXQgRXJpYydzIGNsdXN0ZXIgcGF0Y2hlcywgCisgKgk0SyB3aXRoLiAgCisgKgorICogMi4gIE1pbmltaXppbmcgdGhlIG51bWJlciBvZiBmYXRhbCBpbnRlcnJ1cHRzIHNlcnZpY2VkLCBzaW5jZQorICogCWZhdGFsIGludGVycnVwdHMgaGFsdCB0aGUgU0NTSSBJL08gcHJvY2Vzc29yLiAgQmFzaWNhbGx5LAorICoJdGhpcyBtZWFucyBvZmZsb2FkaW5nIHRoZSBwcmFjdGljYWwgbWF4aW11bSBhbW91bnQgb2YgcHJvY2Vzc2luZyAKKyAqCXRvIHRoZSBTQ1NJIGNoaXAuCisgKiAKKyAqCU9uIHRoZSBOQ1I1M2M4MTAvODIwLzcyMCwgIHRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIAorICoJCWludGVycnVwdC1vbi10aGUtZmx5IHNpZ25hbHMgd2hlbiBjb21tYW5kcyBjb21wbGV0ZSwgCisgKgkJYW5kIG9ubHkgaGFuZGxpbmcgZmF0YWwgZXJyb3JzIGFuZCBTRFRSIC8gV0RUUiAJbWVzc2FnZXMgCisgKgkJaW4gdGhlIGhvc3QgY29kZS4KKyAqCisgKglPbiB0aGUgTkNSNTNjNzEwLCBpbnRlcnJ1cHRzIGFyZSBnZW5lcmF0ZWQgYXMgb24gdGhlIE5DUjUzYzh4MCwKKyAqCQlvbmx5IHRoZSBsYWNrIG9mIGEgaW50ZXJydXB0LW9uLXRoZS1mbHkgZmFjaWxpdHkgY29tcGxpY2F0ZXMKKyAqCQl0aGluZ3MuICAgQWxzbywgU0NTSSBJRCByZWdpc3RlcnMgYW5kIGNvbW1hbmRzIGFyZSAKKyAqCQliaXQgZmllbGRlZCByYXRoZXIgdGhhbiBiaW5hcnkgZW5jb2RlZC4KKyAqCQkKKyAqIAlPbiB0aGUgTkNSNTNjNzAwIGFuZCBOQ1I1M2M3MDAtNjYsIG9wZXJhdGlvbnMgdGhhdCBhcmUgZG9uZSB2aWEgCisgKgkJaW5kaXJlY3QsIHRhYmxlIG1vZGUgb24gdGhlIG1vcmUgYWR2YW5jZWQgY2hpcHMgbXVzdCBiZQorICoJICAgICAgICByZXBsYWNlZCBieSBjYWxscyB0aHJvdWdoIGEganVtcCB0YWJsZSB3aGljaCAKKyAqCQlhY3RzIGFzIGEgc3Vycm9nYXRlIGZvciB0aGUgRFNBLiAgVW5mb3J0dW5hdGVseSwgdGhpcyAKKyAqIAkJd2lsbCBtZWFuIHRoYXQgd2UgbXVzdCBzZXJ2aWNlIGFuIGludGVycnVwdCBmb3IgZWFjaCAKKyAqCQlkaXNjb25uZWN0L3JlY29ubmVjdC4KKyAqIAorICogMy4gIEVsaW1pbmF0aW5nIGxhdGVuY3kgYnkgcGlwZWxpbmluZyBvcGVyYXRpb25zIGF0IHRoZSBkaWZmZXJlbnQgbGV2ZWxzLgorICogCQorICoJVGhpcyBkcml2ZXIgYWxsb3dzIGEgY29uZmlndXJhYmxlIG51bWJlciBvZiBjb21tYW5kcyB0byBiZSBlbnF1ZXVlZAorICoJZm9yIGVhY2ggdGFyZ2V0L2x1biBjb21iaW5hdGlvbiAoZXhwZXJpbWVudGFsbHksIEkgaGF2ZSBkaXNjb3ZlcmVkCisgKgl0aGF0IHR3byBzZWVtcyB0byB3b3JrIGJlc3QpIGFuZCB3aWxsIHVsdGltYXRlbHkgYWxsb3cgZm9yIAorICoJU0NTSS1JSSB0YWdnZWQgcXVldWluZy4KKyAqIAkKKyAqCisgKiBBcmNoaXRlY3R1cmUgOiAKKyAqIFRoaXMgZHJpdmVyIGlzIGJ1aWx0IGFyb3VuZCBhIExpbnV4IHF1ZXVlIG9mIGNvbW1hbmRzIHdhaXRpbmcgdG8gCisgKiBiZSBleGVjdXRlZCwgYW5kIGEgc2hhcmVkIExpbnV4L05DUiBhcnJheSBvZiBjb21tYW5kcyB0byBzdGFydC4gIENvbW1hbmRzCisgKiBhcmUgdHJhbnNmZXJyZWQgdG8gdGhlIGFycmF5ICBieSB0aGUgcnVuX3Byb2Nlc3NfaXNzdWVfcXVldWUoKSBmdW5jdGlvbiAKKyAqIHdoaWNoIGlzIGNhbGxlZCB3aGVuZXZlciBhIGNvbW1hbmQgY29tcGxldGVzLgorICoKKyAqIEFzIGNvbW1hbmRzIGFyZSBjb21wbGV0ZWQsIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBpcyB0cmlnZ2VyZWQsCisgKiBsb29rcyBmb3IgY29tbWFuZHMgaW4gdGhlIGxpbmtlZCBsaXN0IG9mIGNvbXBsZXRlZCBjb21tYW5kcyB3aXRoCisgKiB2YWxpZCBzdGF0dXMsIHJlbW92ZXMgdGhlc2UgY29tbWFuZHMgZnJvbSBhIGxpc3Qgb2YgcnVubmluZyBjb21tYW5kcywgCisgKiBjYWxscyB0aGUgZG9uZSByb3V0aW5lLCBhbmQgZmxhZ3MgdGhlaXIgdGFyZ2V0L2x1bnMgYXMgbm90IGJ1c3kuCisgKgorICogRHVlIHRvIGxpbWl0YXRpb25zIGluIHRoZSBpbnRlbGxpZ2VuY2Ugb2YgdGhlIE5DUiBjaGlwcywgY2VydGFpbgorICogY29uY2Vzc2lvbnMgYXJlIG1hZGUuICBJbiBtYW55IGNhc2VzLCBpdCBpcyBlYXNpZXIgdG8gZHluYW1pY2FsbHkgCisgKiBnZW5lcmF0ZS9maXgtdXAgY29kZSByYXRoZXIgdGhhbiBjYWxjdWxhdGUgb24gdGhlIE5DUiBhdCBydW4gdGltZS4gIAorICogU28sIGNvZGUgaXMgZ2VuZXJhdGVkIG9yIGZpeGVkIHVwIGZvcgorICoKKyAqIC0gSGFuZGxpbmcgZGF0YSB0cmFuc2ZlcnMsIHVzaW5nIGEgdmFyaWFibGUgbnVtYmVyIG9mIE1PVkUgaW5zdHJ1Y3Rpb25zCisgKglpbnRlcnNwZXJzZWQgd2l0aCBDQUxMIE1TR19JTiwgV0hFTiBNU0dJTiBpbnN0cnVjdGlvbnMuCisgKgorICogCVRoZSBEQVRBSU4gYW5kIERBVEFPVVQgcm91dGluZXMJYXJlIHNlcGFyYXRlLCBzbyB0aGF0IGFuIGluY29ycmVjdAorICoJZGlyZWN0aW9uIGNhbiBiZSB0cmFwcGVkLCBhbmQgc3BhY2UgaXNuJ3Qgd2FzdGVkLiAKKyAqCisgKglJdCBtYXkgdHVybiBvdXQgdGhhdCB3ZSdyZSBiZXR0ZXIgb2ZmIHVzaW5nIHNvbWUgc29ydCAKKyAqCW9mIHRhYmxlIGluZGlyZWN0IGluc3RydWN0aW9uIGluIGEgbG9vcCB3aXRoIGEgdmFyaWFibGUKKyAqCXNpemVkIHRhYmxlIG9uIHRoZSBOQ1I1M2M3MTAgYW5kIG5ld2VyIGNoaXBzLgorICoKKyAqIC0gQ2hlY2tpbmcgZm9yIHJlc2VsZWN0aW9uIChOQ1I1M2M3MTAgYW5kIGJldHRlcikKKyAqCisgKiAtIEhhbmRsaW5nIHRoZSBkZXRhaWxzIG9mIFNDU0kgY29udGV4dCBzd2l0Y2hlcyAoTkNSNTNjNzEwIGFuZCBiZXR0ZXIpLAorICoJc3VjaCBhcyByZXByb2dyYW1taW5nIGFwcHJvcHJpYXRlIHN5bmNocm9ub3VzIHBhcmFtZXRlcnMsIAorICoJcmVtb3ZpbmcgdGhlIGRzYSBzdHJ1Y3R1cmUgZnJvbSB0aGUgTkNSJ3MgcXVldWUgb2Ygb3V0c3RhbmRpbmcKKyAqCWNvbW1hbmRzLCBldGMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisjaWZkZWYgQ09ORklHX0FNSUdBCisjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjZGVmaW5lIEJJR19FTkRJQU4KKyNkZWZpbmUgTk9fSU9fU1BBQ0UKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01WTUUxNngKKyNpbmNsdWRlIDxhc20vbXZtZTE2eGh3Lmg+CisKKyNkZWZpbmUgQklHX0VORElBTgorI2RlZmluZSBOT19JT19TUEFDRQorI2RlZmluZSBWQUxJRF9JRFMKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0JWTUU2MDAwCisjaW5jbHVkZSA8YXNtL2J2bWU2MDAwaHcuaD4KKworI2RlZmluZSBCSUdfRU5ESUFOCisjZGVmaW5lIE5PX0lPX1NQQUNFCisjZGVmaW5lIFZBTElEX0lEUworI2VuZGlmCisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICI1M2M3eHguaCIKKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisKKyNpZmRlZiBOT19JT19TUEFDRQorLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFrZSB0aGUgZGVmaW5pdGlvbnMgaW4gNTNjN3h4LmggKHdyaXRlOCwgZXRjKSBzbWFsbGVyLAorICogd2UgZG9uJ3QgaGF2ZSBzZXBhcmF0ZSBpL28gc3BhY2UgYW55d2F5LgorICovCisjdW5kZWYgaW5iCisjdW5kZWYgb3V0YgorI3VuZGVmIGludworI3VuZGVmIG91dHcKKyN1bmRlZiBpbmwKKyN1bmRlZiBvdXRsCisjZGVmaW5lIGluYih4KSAgICAgICAgICAxCisjZGVmaW5lIGludyh4KSAgICAgICAgICAxCisjZGVmaW5lIGlubCh4KSAgICAgICAgICAxCisjZGVmaW5lIG91dGIoeCx5KSAgICAgICAxCisjZGVmaW5lIG91dHcoeCx5KSAgICAgICAxCisjZGVmaW5lIG91dGwoeCx5KSAgICAgICAxCisjZW5kaWYKKworc3RhdGljIGludCBjaGVja19hZGRyZXNzICh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBzaXplKTsKK3N0YXRpYyB2b2lkIGR1bXBfZXZlbnRzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBpbnQgY291bnQpOworc3RhdGljIFNjc2lfQ21uZCAqIHJldHVybl9vdXRzdGFuZGluZ19jb21tYW5kcyAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgCisgICAgaW50IGZyZWUsIGludCBpc3N1ZSk7CitzdGF0aWMgdm9pZCBoYXJkX3Jlc2V0IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKK3N0YXRpYyB2b2lkIG5jcl9zY3NpX3Jlc2V0IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKK3N0YXRpYyB2b2lkIHByaW50X2xvdHMgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpOworc3RhdGljIHZvaWQgc2V0X3N5bmNocm9ub3VzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBpbnQgdGFyZ2V0LCBpbnQgc3hmZXIsIAorICAgIGludCBzY250bDMsIGludCBub3dfY29ubmVjdGVkKTsKK3N0YXRpYyBpbnQgZGF0YXBhdGhfcmVzaWR1YWwgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpOworc3RhdGljIGNvbnN0IGNoYXIgKiBzYmNsX3RvX3BoYXNlIChpbnQgc2JjbCk7CitzdGF0aWMgdm9pZCBwcmludF9wcm9ncmVzcyAoU2NzaV9DbW5kICpjbWQpOworc3RhdGljIHZvaWQgcHJpbnRfcXVldWVzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKK3N0YXRpYyB2b2lkIHByb2Nlc3NfaXNzdWVfcXVldWUgKHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworc3RhdGljIGludCBzaHV0ZG93biAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CitzdGF0aWMgdm9pZCBhYm5vcm1hbF9maW5pc2hlZCAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKmNtZCwgaW50IHJlc3VsdCk7CitzdGF0aWMgaW50IGRpc2FibGUgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpOworc3RhdGljIGludCBOQ1I1M2M3eHhfcnVuX3Rlc3RzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBOQ1I1M2M3eDBfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncyk7CitzdGF0aWMgdm9pZCBOQ1I1M2M3eDBfaW50Zmx5IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKK3N0YXRpYyBpbnQgbmNyX2hhbHQgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpOworc3RhdGljIHZvaWQgaW50cl9waGFzZV9taXNtYXRjaCAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgc3RydWN0IE5DUjUzYzd4MF9jbWQgCisgICAgKmNtZCk7CitzdGF0aWMgdm9pZCBpbnRyX2RtYSAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgc3RydWN0IE5DUjUzYzd4MF9jbWQgKmNtZCk7CitzdGF0aWMgdm9pZCBwcmludF9kc2EgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHUzMiAqZHNhLAorICAgIGNvbnN0IGNoYXIgKnByZWZpeCk7CitzdGF0aWMgaW50IHByaW50X2luc24gKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNvbnN0IHUzMiAqaW5zbiwKKyAgICBjb25zdCBjaGFyICpwcmVmaXgsIGludCBrZXJuZWwpOworCitzdGF0aWMgdm9pZCBOQ1I1M2M3eHhfZHNhX2ZpeHVwIChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqY21kKTsKK3N0YXRpYyB2b2lkIE5DUjUzYzd4MF9pbml0X2ZpeHVwIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKK3N0YXRpYyBpbnQgTkNSNTNjN3gwX2RzdGF0X3Npcl9pbnRyIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBzdHJ1Y3QgCisgICAgTkNSNTNjN3gwX2NtZCAqY21kKTsKK3N0YXRpYyB2b2lkIE5DUjUzYzd4MF9zb2Z0X3Jlc2V0IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKKworLyogU2l6ZSBvZiBldmVudCBsaXN0IChwZXIgaG9zdCBhZGFwdGVyKSAqLworc3RhdGljIGludCB0cmFja19ldmVudHMgPSAwOworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKmZpcnN0X2hvc3QgPSBOVUxMOwkvKiBIZWFkIG9mIGxpc3Qgb2YgTkNSIGJvYXJkcyAqLworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSAqdGhlX3RlbXBsYXRlID0gTlVMTDsJCisKKy8qIE5DUjUzYzcxMCBzY3JpcHQgaGFuZGxpbmcgY29kZSAqLworCisjaW5jbHVkZSAiNTNjN3h4X2QuaCIKKyNpZmRlZiBBX2ludF9kZWJ1Z19zeW5jCisjZGVmaW5lIERFQlVHX1NZTkNfSU5UUiBBX2ludF9kZWJ1Z19zeW5jCisjZW5kaWYKK2ludCBOQ1I1M2M3eHhfc2NyaXB0X2xlbiA9IHNpemVvZiAoU0NSSVBUKTsKK2ludCBOQ1I1M2M3eHhfZHNhX2xlbiA9IEFfZHNhX2VuZCArIEVudF9kc2FfemVybyAtIEVudF9kc2FfY29kZV90ZW1wbGF0ZTsKKyNpZmRlZiBGT1JDRV9EU0FfQUxJR05NRU5UCitpbnQgQ21kUGFnZVN0YXJ0ID0gKDAgLSBFbnRfZHNhX3plcm8gLSBzaXplb2Yoc3RydWN0IE5DUjUzYzd4MF9jbWQpKSAmIDB4ZmY7CisjZW5kaWYKKworc3RhdGljIGNoYXIgKnNldHVwX3N0cmluZ3NbXSA9CisJeyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIifTsKKworI2RlZmluZSBNQVhfU0VUVVBfU1RSSU5HUyAoc2l6ZW9mKHNldHVwX3N0cmluZ3MpIC8gc2l6ZW9mKGNoYXIgKikpCisjZGVmaW5lIFNFVFVQX0JVRkZFUl9TSVpFIDIwMAorc3RhdGljIGNoYXIgc2V0dXBfYnVmZmVyW1NFVFVQX0JVRkZFUl9TSVpFXTsKK3N0YXRpYyBjaGFyIHNldHVwX3VzZWRbTUFYX1NFVFVQX1NUUklOR1NdOworCit2b2lkIG5jcjUzYzd4eF9zZXR1cCAoY2hhciAqc3RyLCBpbnQgKmludHMpCit7CisgICBpbnQgaTsKKyAgIGNoYXIgKnAxLCAqcDI7CisKKyAgIHAxID0gc2V0dXBfYnVmZmVyOworICAgKnAxID0gJ1wwJzsKKyAgIGlmIChzdHIpCisgICAgICBzdHJuY3B5KHAxLCBzdHIsIFNFVFVQX0JVRkZFUl9TSVpFIC0gc3RybGVuKHNldHVwX2J1ZmZlcikpOworICAgc2V0dXBfYnVmZmVyW1NFVFVQX0JVRkZFUl9TSVpFIC0gMV0gPSAnXDAnOworICAgcDEgPSBzZXR1cF9idWZmZXI7CisgICBpID0gMDsKKyAgIHdoaWxlICgqcDEgJiYgKGkgPCBNQVhfU0VUVVBfU1RSSU5HUykpIHsKKyAgICAgIHAyID0gc3RyY2hyKHAxLCAnLCcpOworICAgICAgaWYgKHAyKSB7CisgICAgICAgICAqcDIgPSAnXDAnOworICAgICAgICAgaWYgKHAxICE9IHAyKQorICAgICAgICAgICAgc2V0dXBfc3RyaW5nc1tpXSA9IHAxOworICAgICAgICAgcDEgPSBwMiArIDE7CisgICAgICAgICBpKys7CisgICAgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIHNldHVwX3N0cmluZ3NbaV0gPSBwMTsKKyAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorICAgZm9yIChpPTA7IGk8TUFYX1NFVFVQX1NUUklOR1M7IGkrKykKKyAgICAgIHNldHVwX3VzZWRbaV0gPSAwOworfQorCisKKy8qIGNoZWNrX3NldHVwX3N0cmluZ3MoKSByZXR1cm5zIGluZGV4IGlmIGtleSBmb3VuZCwgMCBpZiBub3QKKyAqLworCitzdGF0aWMgaW50IGNoZWNrX3NldHVwX3N0cmluZ3MoY2hhciAqa2V5LCBpbnQgKmZsYWdzLCBpbnQgKnZhbCwgY2hhciAqYnVmKQoreworaW50IHg7CitjaGFyICpjcDsKKworICAgZm9yICAoeD0wOyB4PE1BWF9TRVRVUF9TVFJJTkdTOyB4KyspIHsKKyAgICAgIGlmIChzZXR1cF91c2VkW3hdKQorICAgICAgICAgY29udGludWU7CisgICAgICBpZiAoIXN0cm5jbXAoc2V0dXBfc3RyaW5nc1t4XSwga2V5LCBzdHJsZW4oa2V5KSkpCisgICAgICAgICBicmVhazsKKyAgICAgIGlmICghc3RybmNtcChzZXR1cF9zdHJpbmdzW3hdLCAibmV4dCIsIHN0cmxlbigibmV4dCIpKSkKKyAgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgaWYgKHggPT0gTUFYX1NFVFVQX1NUUklOR1MpCisgICAgICByZXR1cm4gMDsKKyAgIHNldHVwX3VzZWRbeF0gPSAxOworICAgY3AgPSBzZXR1cF9zdHJpbmdzW3hdICsgc3RybGVuKGtleSk7CisgICAqdmFsID0gLTE7CisgICBpZiAoKmNwICE9ICc6JykKKyAgICAgIHJldHVybiArK3g7CisgICBjcCsrOworICAgaWYgKCgqY3AgPj0gJzAnKSAmJiAoKmNwIDw9ICc5JykpIHsKKyAgICAgICp2YWwgPSBzaW1wbGVfc3RydG91bChjcCxOVUxMLDApOworICAgICAgfQorICAgcmV0dXJuICsreDsKK30KKworCisKKy8qCisgKiBLTk9XTiBCVUdTIDoKKyAqIC0gVGhlcmUgaXMgc29tZSBzb3J0IG9mIGNvbmZsaWN0IHdoZW4gdGhlIFBQUCBkcml2ZXIgaXMgY29tcGlsZWQgd2l0aCAKKyAqIAlzdXBwb3J0IGZvciAxNiBjaGFubmVscz8KKyAqIAorICogLSBPbiBzeXN0ZW1zIHdoaWNoIHByZWRhdGUgdGhlIDEuMy54IGluaXRpYWxpemF0aW9uIG9yZGVyIGNoYW5nZSwKKyAqICAgICAgdGhlIE5DUiBkcml2ZXIgd2lsbCBjYXVzZSBDYW5ub3QgZ2V0IGZyZWUgcGFnZSBtZXNzYWdlcyB0byBhcHBlYXIuICAKKyAqICAgICAgVGhlc2UgYXJlIGhhcm1sZXNzLCBidXQgSSBkb24ndCBrbm93IG9mIGFuIGVhc3kgd2F5IHRvIGF2b2lkIHRoZW0uCisgKgorICogLSBXaXRoIE9QVElPTl9ESVNDT05ORUNULCBvbiB0d28gc3lzdGVtcyB1bmRlciB1bmtub3duIGNpcmN1bXN0YW5jZXMsCisgKgl3ZSBnZXQgYSBQSEFTRSBNSVNNQVRDSCB3aXRoIERTQSBzZXQgdG8gemVybyAoc3VnZ2VzdHMgdGhhdCB3ZSAKKyAqCWFyZSBvY2N1cnJpbmcgc29tZXdoZXJlIGluIHRoZSByZXNlbGVjdGlvbiBjb2RlKSB3aGVyZSAKKyAqCURTUD1zb21lIHZhbHVlIERDTUR8REJDPXNhbWUgdmFsdWUuICAKKyAqIAkKKyAqCUNsb3NlciBpbnNwZWN0aW9uIHN1Z2dlc3RzIHRoYXQgd2UgbWF5IGJlIHRyeWluZyB0byBleGVjdXRlCisgKglzb21lIHBvcnRpb24gb2YgdGhlIERTQT8KKyAqIHNjc2kwIDogaGFuZGxpbmcgcmVzaWR1YWwgdHJhbnNmZXIgKCsgMCBieXRlcyBmcm9tIERNQSBGSUZPKQorICogc2NzaTAgOiBoYW5kbGluZyByZXNpZHVhbCB0cmFuc2ZlciAoKyAwIGJ5dGVzIGZyb20gRE1BIEZJRk8pCisgKiBzY3NpMCA6IG5vIGN1cnJlbnQgY29tbWFuZCA6IHVuZXhwZWN0ZWQgcGhhc2UgTVNHSU4uCisgKiAgICAgICAgIERTUD0weDFjNDZjYywgRENNRHxEQkM9MHgxYzQ2YWMsIERTQT0weDAKKyAqICAgICAgICAgRFNQUz0weDAsIFRFTVA9MHgxYzNlNzAsIERNT0RFPTB4ODAKKyAqIHNjc2kwIDogRFNQLT4KKyAqIDAwMWM0NmNjIDogMHgwMDFjNDZjYyAweDAwMDAwMDAwCisgKiAwMDFjNDZkNCA6IDB4MDAxYzVlYTAgMHgwMDAwMTFmOAorICoKKyAqCUNoYW5nZWQgdGhlIHByaW50IGNvZGUgaW4gdGhlIHBoYXNlX21pc21hdGNoIGhhbmRsZXIgc28KKyAqCXRoYXQgd2UgY2FsbCBwcmludF9sb3RzIHRvIHRyeSB0byBkaWFnbm9zZSB0aGlzLgorICoKKyAqLworCisvKiAKKyAqIFBvc3NpYmxlIGZ1dHVyZSBkaXJlY3Rpb24gb2YgYXJjaGl0ZWN0dXJlIGZvciBtYXggcGVyZm9ybWFuY2UgOgorICoKKyAqIFdlJ3JlIHVzaW5nIGEgc2luZ2xlIHN0YXJ0IGFycmF5IGZvciB0aGUgTkNSIGNoaXAuICBUaGlzIGlzIAorICogc3ViLW9wdGltYWwsIGJlY2F1c2Ugd2UgY2Fubm90IGFkZCBhIGNvbW1hbmQgd2hpY2ggd291bGQgY29uZmxpY3Qgd2l0aCAKKyAqIGFuIGV4ZWN1dGluZyBjb21tYW5kIHRvIHRoaXMgc3RhcnQgcXVldWUsIGFuZCB0aGVyZWZvcmUgbXVzdCBpbnNlcnQgdGhlIAorICogbmV4dCBjb21tYW5kIGZvciBhIGdpdmVuIEkvVC9MIGNvbWJpbmF0aW9uIGFmdGVyIHRoZSBmaXJzdCBoYXMgY29tcGxldGVkOworICogaW5jdXJyaW5nIG91ciBpbnRlcnJ1cHQgbGF0ZW5jeSBiZXR3ZWVuIFNDU0kgY29tbWFuZHMuCisgKgorICogVG8gYWxsb3cgZnVydGhlciBwaXBlbGluaW5nIG9mIHRoZSBOQ1IgYW5kIGhvc3QgQ1BVIG9wZXJhdGlvbiwgd2Ugd2FudCAKKyAqIHRvIHNldCB0aGluZ3MgdXAgc28gdGhhdCBpbW1lZGlhdGVseSBvbiB0ZXJtaW5hdGlvbiBvZiBhIGNvbW1hbmQgZGVzdGluZWQgCisgKiBmb3IgYSBnaXZlbiBMVU4sIHdlIGdldCB0aGF0IExVTiBidXN5IGFnYWluLiAgCisgKiAKKyAqIFRvIGRvIHRoaXMsIHdlIG5lZWQgdG8gYWRkIGEgMzIgYml0IHBvaW50ZXIgdG8gd2hpY2ggaXMganVtcGVkIHRvIAorICogb24gY29tcGxldGlvbiBvZiBhIGNvbW1hbmQuICBJZiBubyBuZXcgY29tbWFuZCBpcyBhdmFpbGFibGUsIHRoaXMgCisgKiB3b3VsZCBwb2ludCB0byB0aGUgdXN1YWwgRFNBIGlzc3VlIHF1ZXVlIHNlbGVjdCByb3V0aW5lLgorICoKKyAqIElmIG9uZSB3ZXJlLCBpdCB3b3VsZCBwb2ludCB0byBhIHBlci1OQ1I1M2M3eDBfY21kIHNlbGVjdCByb3V0aW5lIAorICogd2hpY2ggc3RhcnRzIGV4ZWN1dGlvbiBpbW1lZGlhdGVseSwgaW5zZXJ0aW5nIHRoZSBjb21tYW5kIGF0IHRoZSBoZWFkIAorICogb2YgdGhlIHN0YXJ0IHF1ZXVlIGlmIHRoZSBOQ1IgY2hpcCBpcyBzZWxlY3RlZCBvciByZXNlbGVjdGVkLgorICoKKyAqIFdlIHdvdWxkIGNoYW5nZSBzbyB0aGF0IHdlIGtlZXAgYSBsaXN0IG9mIG91dHN0YW5kaW5nIGNvbW1hbmRzIAorICogZm9yIGVhY2ggdW5pdCwgcmF0aGVyIHRoYW4gYSBzaW5nbGUgcnVubmluZ19saXN0LiAgV2UnZCBpbnNlcnQgCisgKiBhIG5ldyBjb21tYW5kIGludG8gdGhlIHJpZ2h0IHJ1bm5pbmcgbGlzdDsgaWYgdGhlIE5DUiBkaWRuJ3QgCisgKiBoYXZlIHNvbWV0aGluZyBydW5uaW5nIGZvciB0aGF0IHlldCwgd2UnZCBwdXQgaXQgaW4gdGhlIAorICogc3RhcnQgcXVldWUgYXMgd2VsbC4gIFNvbWUgbWFnaWMgbmVlZHMgdG8gaGFwcGVuIHRvIGhhbmRsZSB0aGUgCisgKiByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIHRoZSBmaXJzdCBjb21tYW5kIHRlcm1pbmF0aW5nIGJlZm9yZSB0aGUgCisgKiBuZXcgb25lIGlzIHdyaXR0ZW4uCisgKgorICogUG90ZW50aWFsIGZvciBwcm9maWxpbmcgOiAKKyAqIENhbGwgZG9fZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0dikgdG8gZ2V0IDgwMG5zIHJlc29sdXRpb24uCisgKi8KKworCisvKgorICogVE9ETyA6IAorICogMS4gIFRvIHN1cHBvcnQgV0lERSB0cmFuc2ZlcnMsIG5vdCBtdWNoIG5lZWRzIHRvIGhhcHBlbi4gIFdlCisgKglzaG91bGQgZG8gQ0hNT1ZFIGluc3RydWN0aW9ucyBpbnN0ZWFkIG9mIE1PVkVzIHdoZW4KKyAqCXdlIGhhdmUgc2NhdHRlci9nYXRoZXIgc2VnbWVudHMgb2YgdW5ldmVuIGxlbmd0aC4gIFdoZW4KKyAqIAl3ZSBkbyB0aGlzLCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBkaXNjb25uZWN0CisgKgliZXR3ZWVuIHNlZ21lbnRzLgorICogCisgKiAyLiAgQ3VycmVudGx5LCB3aGVuIElja3kgdGhpbmdzIGhhcHBlbiB3ZSBkbyBhIEZBVEFMKCkuICBJbnN0ZWFkLAorICogICAgIHdlIHdhbnQgdG8gZG8gYW4gaW50ZWdyaXR5IGNoZWNrIG9uIHRoZSBwYXJ0cyBvZiB0aGUgTkNSIGhvc3RkYXRhCisgKiAgICAgc3RydWN0dXJlIHdoaWNoIHdlcmUgaW5pdGlhbGl6ZWQgYXQgYm9vdCB0aW1lOyBGQVRBTCgpIGlmIHRoYXQgCisgKiAgICAgZmFpbHMsIGFuZCBvdGhlcndpc2UgdHJ5IHRvIHJlY292ZXIuICBLZWVwIHRyYWNrIG9mIGhvdyBtYW55CisgKiAgICAgdGltZXMgdGhpcyBoYXMgaGFwcGVuZWQgd2l0aGluIGEgc2luZ2xlIFNDU0kgY29tbWFuZDsgaWYgaXQgCisgKiAgICAgZ2V0cyBleGNlc3NpdmUsIHRoZW4gRkFUQUwoKS4KKyAqCisgKiAzLiAgUGFyaXR5IGNoZWNraW5nIGlzIGN1cnJlbnRseSBkaXNhYmxlZCwgYW5kIGEgZmV3IHRoaW5ncyBzaG91bGQgCisgKiAgICAgaGFwcGVuIGhlcmUgbm93IHRoYXQgd2Ugc3VwcG9ydCBzeW5jaHJvbm91cyBTQ1NJIHRyYW5zZmVycyA6CisgKiAgICAgMS4gIE9uIHNvZnQtcmVzZXQsIHdlIHNob291bGQgc2V0IHRoZSBFUEMgKEVuYWJsZSBQYXJpdHkgQ2hlY2tpbmcpCisgKgkgICBhbmQgQUFQIChBc3NlcnQgU0FUTi8gb24gcGFyaXR5IGVycm9yKSBiaXRzIGluIFNDTlRMMC4KKyAqCQorICogICAgIDIuICBXZSBzaG91bGQgZW5hYmxlIHRoZSBwYXJpdHkgaW50ZXJydXB0IGluIHRoZSBTSUVOMCByZWdpc3Rlci4KKyAqIAorICogICAgIDMuICBpbnRyX3BoYXNlX21pc21hdGNoKCkgbmVlZHMgdG8gYmVsaWV2ZSB0aGF0IG1lc3NhZ2Ugb3V0IGlzIAorICoJICAgYWx3YXlzIGFuICJhY2NlcHRhYmxlIiBwaGFzZSB0byBoYXZlIGEgbWlzbWF0Y2ggaW4uICBJZiAKKyAqCSAgIHRoZSBvbGQgcGhhc2Ugd2FzIE1TR19JTiwgd2Ugc2hvdWxkIHNlbmQgYSBNRVNTQUdFIFBBUklUWSAKKyAqCSAgIGVycm9yLiAgSWYgdGhlIG9sZCBwaGFzZSB3YXMgc29tZXRoaW5nIGVsc2UsIHdlIHNob3VsZCBzZW5kCisgKgkgICBhIElOSVRJQVRPUl9ERVRFQ1RFRF9FUlJPUiBtZXNzYWdlLiAgTm90ZSB0aGF0IHRoaXMgY291bGQKKyAqCSAgIGNhdXNlIGEgUkVTVE9SRSBQT0lOVEVSUyBtZXNzYWdlOyBzbyB3ZSBzaG91bGQgaGFuZGxlIHRoYXQgCisgKgkgICBjb3JyZWN0bHkgZmlyc3QuICBJbnN0ZWFkLCB3ZSBzaG91bGQgcHJvYmFibHkgZG8gYW4gCisgKgkgICBpbml0aWF0b3JfYWJvcnQuCisgKgorICogNC4gIE1QRUUgYml0IG9mIENURVNUNCBzaG91bGQgYmUgc2V0IHNvIHdlIGdldCBpbnRlcnJ1cHRlZCBpZiAKKyAqICAgICB3ZSBkZXRlY3QgYW4gZXJyb3IuCisgKgorICogIAorICogNS4gIFRoZSBpbml0aWFsIGNvZGUgaGFzIGJlZW4gdGVzdGVkIG9uIHRoZSBOQ1I1M2M4MTAuICBJIGRvbid0IAorICogICAgIGhhdmUgYWNjZXNzIHRvIE5DUjUzYzcwMCwgNzAwLTY2IChGb3JleCBib2FyZHMpLCBOQ1I1M2M3MTAKKyAqICAgICAoTkNSIFBlbnRpdW0gc3lzdGVtcyksIE5DUjUzYzcyMCwgTkNSNTNjODIwLCBvciBOQ1I1M2M4MjUgYm9hcmRzIHRvIAorICogICAgIGZpbmlzaCBkZXZlbG9wbWVudCBvbiB0aG9zZSBwbGF0Zm9ybXMuCisgKgorICogICAgIE5DUjUzYzgyMC84MjUvNzIwIC0gbmVlZCB0byBhZGQgd2lkZSB0cmFuc2ZlciBzdXBwb3J0LCBpbmNsdWRpbmcgV0RUUiAKKyAqICAgICAJCW5lZ290aWF0aW9uLCBwcm9ncmFtbWluZyBvZiB3aWRlIHRyYW5zZmVyIGNhcGFiaWxpdGllcworICoJCW9uIHJlc2VsZWN0aW9uIGFuZCB0YWJsZSBpbmRpcmVjdCBzZWxlY3Rpb24uCisgKgorICogICAgIE5DUjUzYzcxMCAtIG5lZWQgdG8gYWRkIGZhdGFsIGludGVycnVwdCBvciBHRU4gY29kZSBmb3IgCisgKgkJY29tbWFuZCBjb21wbGV0aW9uIHNpZ25hbGluZy4gICBOZWVkIHRvIG1vZGlmeSBhbGwgCisgKgkJU0RJRCwgU0NJRCwgZXRjLiByZWdpc3RlcnMsIGFuZCB0YWJsZSBpbmRpcmVjdCBzZWxlY3QgY29kZSAKKyAqCQlzaW5jZSB0aGVzZSB1c2UgYml0IGZpZWxkZWQgKGllIDE8PHRhcmdldCkgaW5zdGVhZCBvZiAKKyAqCQliaW5hcnkgZW5jb2RlZCB0YXJnZXQgaWRzLiAgTmVlZCB0byBhY2NvbW1vZGF0ZQorICoJCWRpZmZlcmVudCByZWdpc3RlciBtYXBwaW5ncywgcHJvYmFibHkgc2NhbiB0aHJvdWdoCisgKgkJdGhlIFNDUklQVCBjb2RlIGFuZCBjaGFuZ2UgdGhlIG5vbiBTRkJSIHJlZ2lzdGVyIG9wZXJhbmQKKyAqCQlvZiBhbGwgTU9WRSBpbnN0cnVjdGlvbnMuCisgKgorICoJCUl0IGlzIHJhdGhlciB3b3JzZSB0aGFuIHRoaXMgYWN0dWFsbHksIHRoZSA3MTAgY29ycnVwdHMKKyAqCQlib3RoIFRFTVAgYW5kIERTQSB3aGVuIHlvdSBkbyBhIE1PVkUgTUVNT1JZLiAgVGhpcworICoJCXNjcmV3cyB5b3UgdXAgYWxsIG92ZXIgdGhlIHBsYWNlLiAgTU9WRSBNRU1PUlkgNCB3aXRoIGEKKyAqCQlkZXN0aW5hdGlvbiBvZiBEU0Egc2VlbXMgdG8gd29yayBPSywgd2hpY2ggaGVscHMgc29tZS4KKyAqCQlSaWNoYXJkIEhpcnN0ICByaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWsKKyAqIAorICogICAgIE5DUjUzYzcwMC83MDAtNjYgLSBuZWVkIHRvIGFkZCBjb2RlIHRvIHJlZml4IGFkZHJlc3NlcyBvbiAKKyAqCQlldmVyeSBuZXh1cyBjaGFuZ2UsIGVsaW1pbmF0ZSBhbGwgdGFibGUgaW5kaXJlY3QgY29kZSwKKyAqCQl2ZXJ5IG1lc3N5LgorICoKKyAqIDYuICBUaGUgTkNSNTNjN3gwIHNlcmllcyBpcyB2ZXJ5IHBvcHVsYXIgb24gb3RoZXIgcGxhdGZvcm1zIHRoYXQgCisgKiAgICAgY291bGQgYmUgcnVubmluZyBMaW51eCAtIGllLCBzb21lIGhpZ2ggcGVyZm9ybWFuY2UgQU1JR0EgU0NTSSAKKyAqICAgICBib2FyZHMgdXNlIGl0LiAgCisgKgkKKyAqICAgICBTbywgSSBzaG91bGQgaW5jbHVkZSAjaWZkZWYnZCBjb2RlIHNvIHRoYXQgaXQgaXMgCisgKiAgICAgY29tcGF0aWJsZSB3aXRoIHRoZXNlIHN5c3RlbXMuCisgKgkKKyAqICAgICBTcGVjaWZpY2FsbHksIHRoZSBsaXR0bGUgRW5kaWFuIGFzc3VtcHRpb25zIEkgbWFkZSBpbiBteSAKKyAqICAgICBiaXQgZmllbGRzIG5lZWQgdG8gY2hhbmdlLCBhbmQgaWYgdGhlIE5DUiBkb2Vzbid0IHNlZSBtZW1vcnkKKyAqICAgICB0aGUgcmlnaHQgd2F5LCB3ZSBuZWVkIHRvIHByb3ZpZGUgb3B0aW9ucyB0byByZXZlcnNlIHdvcmRzCisgKiAgICAgd2hlbiB0aGUgc2NyaXB0cyBhcmUgcmVsb2NhdGVkLgorICoKKyAqIDcuICBVc2UgdnJlbWFwKCkgdG8gYWNjZXNzIG1lbW9yeSBtYXBwZWQgYm9hcmRzLiAgCisgKi8KKworLyogCisgKiBBbGxvdyBmb3Igc2ltdWx0YW5lb3VzIGV4aXN0ZW5jZSBvZiBtdWx0aXBsZSBTQ1NJIHNjcmlwdHMgc28gd2UgCisgKiBjYW4gaGF2ZSBhIHNpbmdsZSBkcml2ZXIgYmluYXJ5IGZvciBhbGwgb2YgdGhlIGZhbWlseS4KKyAqCisgKiAtIG9uZSBmb3IgTkNSNTNjNzAwIGFuZCBOQ1I1M2M3MDAtNjYgY2hpcHMJKG5vdCB5ZXQgc3VwcG9ydGVkKQorICogLSBvbmUgZm9yIHJlc3QgKG9ubHkgdGhlIE5DUjUzYzgxMCwgODE1LCA4MjAsIGFuZCA4MjUgYXJlIGN1cnJlbnRseSAKKyAqCXN1cHBvcnRlZCkKKyAqIAorICogU28gdGhhdCB3ZSBvbmx5IG5lZWQgdHdvIFNDU0kgc2NyaXB0cywgd2UgbmVlZCB0byBtb2RpZnkgdGhpbmdzIHNvCisgKiB0aGF0IHdlIGZpeHVwIHJlZ2lzdGVyIGFjY2Vzc2VzIGluIFJFQUQvV1JJVEUgaW5zdHJ1Y3Rpb25zLCBhbmQgCisgKiB3ZSdsbCBhbHNvIGhhdmUgdG8gYWNjb21tb2RhdGUgdGhlIGJpdCB2cy4gYmluYXJ5IGVuY29kaW5nIG9mIElEcworICogd2l0aCB0aGUgN3h4IGNoaXBzLgorICovCisKKyNkZWZpbmUgUk9VTkRVUChhZHIsdHlwZSkJXAorICAoKHZvaWQgKikgKCgobG9uZykgKGFkcikgKyBzaXplb2YodHlwZSkgLSAxKSAmIH4oc2l6ZW9mKHR5cGUpIC0gMSkpKQorCisKKy8qCisgKiBGdW5jdGlvbjogaXNzdWVfdG9fY21kCisgKgorICogUHVycG9zZTogY29udmVydCBqdW1wIGluc3RydWN0aW9uIGluIGlzc3VlIGFycmF5IHRvIE5DUjUzYzd4MF9jbWQKKyAqCXN0cnVjdHVyZSBwb2ludGVyLiAgCisgKgorICogSW5wdXRzOyBpc3N1ZSAtIHBvaW50ZXIgdG8gc3RhcnQgb2YgTk9QIG9yIEpVTVAgaW5zdHJ1Y3Rpb24KKyAqCWluIGlzc3VlIGFycmF5LgorICoKKyAqIFJldHVybnM6IHBvaW50ZXIgdG8gY29tbWFuZCBvbiBzdWNjZXNzOyAwIGlmIG9wY29kZSBpcyBOT1AuCisgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqCitpc3N1ZV90b19jbWQgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhLAorICAgIHUzMiAqaXNzdWUpCit7CisgICAgcmV0dXJuIChpc3N1ZVswXSAhPSBob3N0ZGF0YS0+Tk9QX2luc24pID8gCisgICAgLyogCisgICAgICogSWYgdGhlIElGIFRSVUUgYml0IGlzIHNldCwgaXQncyBhIEpVTVAgaW5zdHJ1Y3Rpb24uICBUaGUKKyAgICAgKiBvcGVyYW5kIGlzIGEgYnVzIHBvaW50ZXIgdG8gdGhlIGRzYV9iZWdpbiByb3V0aW5lIGZvciB0aGlzIERTQS4gIFRoZQorICAgICAqIGRzYSBmaWVsZCBvZiB0aGUgTkNSNTNjN3gwX2NtZCBzdHJ1Y3R1cmUgc3RhcnRzIHdpdGggdGhlIAorICAgICAqIERTQSBjb2RlIHRlbXBsYXRlLiAgQnkgY29udmVydGluZyB0byBhIHZpcnR1YWwgYWRkcmVzcywKKyAgICAgKiBzdWJ0cmFjdGluZyB0aGUgY29kZSB0ZW1wbGF0ZSBzaXplLCBhbmQgb2Zmc2V0IG9mIHRoZSAKKyAgICAgKiBkc2EgZmllbGQsIHdlIGVuZCB1cCB3aXRoIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIAorICAgICAqIHN0cnVjdHVyZSAoYWx0ZXJuYXRpdmVseSwgd2UgY291bGQgdXNlIHRoZSAKKyAgICAgKiBkc2FfY21uZCBmaWVsZCwgYW4gYW5hY2hyb25pc20gZnJvbSB3aGVuIHdlIHdlcmVuJ3QKKyAgICAgKiBzdXJlIHdoYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBOQ1Igc3RydWN0dXJlcworICAgICAqIGFuZCBob3N0IHN0cnVjdHVyZXMgd2VyZSBnb2luZyB0byBiZS4KKyAgICAgKi8KKwkoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgKChjaGFyICopIGJ1c190b192aXJ0IChpc3N1ZVsxXSkgLSAKKwkgICAgKGhvc3RkYXRhLT5FX2RzYV9jb2RlX2JlZ2luIC0gaG9zdGRhdGEtPkVfZHNhX2NvZGVfdGVtcGxhdGUpIC0KKwkgICAgb2Zmc2V0b2Yoc3RydWN0IE5DUjUzYzd4MF9jbWQsIGRzYSkpIAorICAgIC8qIElmIHRoZSBJRiBUUlVFIGJpdCBpcyBub3Qgc2V0LCBpdCdzIGEgTk9QICovCisJOiBOVUxMOworfQorCisKKy8qIAorICogRklYTUU6IHdlIHNob3VsZCBqdW5rIHRoZXNlLCBpbiBmYXZvciBvZiBzeW5jaHJvbm91c193YW50IGFuZCAKKyAqIHdpZGVfd2FudCBpbiB0aGUgTkNSNTNjN3gwX2hvc3RkYXRhIHN0cnVjdHVyZS4KKyAqLworCisvKiBUZW1wbGF0ZSBmb3IgInByZWZlcnJlZCIgc3luY2hyb25vdXMgdHJhbnNmZXIgcGFyYW1ldGVycy4gKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2R0cl9tZXNzYWdlW10gPSB7CisjaWZkZWYgQ09ORklHX1NDU0lfTkNSNTNDN3h4X0ZBU1QKKyAgICBFWFRFTkRFRF9NRVNTQUdFLCAzIC8qIGxlbmd0aCAqLywgRVhURU5ERURfU0RUUiwgMjUgLyogKjRucyAqLywgOCAvKiBvZmYgKi8KKyNlbHNlCisgICAgRVhURU5ERURfTUVTU0FHRSwgMyAvKiBsZW5ndGggKi8sIEVYVEVOREVEX1NEVFIsIDUwIC8qICo0bnMgKi8sIDggLyogb2ZmICovIAorI2VuZGlmCit9OworCisvKiBUZW1wbGF0ZSB0byByZXF1ZXN0IGFzeW5jaHJvbm91cyB0cmFuc2ZlcnMgKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYXN5bmNfbWVzc2FnZVtdID0geworICAgIEVYVEVOREVEX01FU1NBR0UsIDMgLyogbGVuZ3RoICovLCBFWFRFTkRFRF9TRFRSLCAwLCAwIC8qIGFzeW5jaHJvbm91cyAqLworfTsKKworLyogVGVtcGxhdGUgZm9yICJwcmVmZXJyZWQiIFdJREUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB3ZHRyX21lc3NhZ2VbXSA9IHsKKyAgICBFWFRFTkRFRF9NRVNTQUdFLCAyIC8qIGxlbmd0aCAqLywgRVhURU5ERURfV0RUUiwgMSAvKiAyXjEgYnl0ZXMgKi8KK307CisKKyNpZiAwCisvKgorICogRnVuY3Rpb24gOiBzdHJ1Y3QgU2NzaV9Ib3N0ICpmaW5kX2hvc3QgKGludCBob3N0KQorICogCisgKiBQdXJwb3NlIDogS0dEQiBzdXBwb3J0IGZ1bmN0aW9uIHdoaWNoIHRyYW5zbGF0ZXMgYSBob3N0IG51bWJlciAKKyAqIAl0byBhIGhvc3Qgc3RydWN0dXJlLiAKKyAqCisgKiBJbnB1dHMgOiBob3N0IC0gbnVtYmVyIG9mIFNDU0kgaG9zdAorICoKKyAqIFJldHVybnMgOiBOVUxMIG9uIGZhaWx1cmUsIHBvaW50ZXIgdG8gaG9zdCBzdHJ1Y3R1cmUgb24gc3VjY2Vzcy4KKyAqLworCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqCitmaW5kX2hvc3QgKGludCBob3N0KSB7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaDsKKyAgICBmb3IgKGggPSBmaXJzdF9ob3N0OyBoICYmIGgtPmhvc3Rfbm8gIT0gaG9zdDsgaCA9IGgtPm5leHQpOworICAgIGlmICghaCkgeworCXByaW50ayAoS0VSTl9BTEVSVCAic2NzaSVkIG5vdCBmb3VuZFxuIiwgaG9zdCk7CisJcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIGlmIChoLT5ob3N0dCAhPSB0aGVfdGVtcGxhdGUpIHsKKwlwcmludGsgKEtFUk5fQUxFUlQgInNjc2klZCBpcyBub3QgYSBOQ1IgYm9hcmRcbiIsIGhvc3QpOworCXJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gaDsKK30KKworI2lmIDAKKy8qCisgKiBGdW5jdGlvbiA6IHJlcXVlc3Rfc3luY2hyb25vdXMgKGludCBob3N0LCBpbnQgdGFyZ2V0KQorICogCisgKiBQdXJwb3NlIDogS0dEQiBpbnRlcmZhY2Ugd2hpY2ggd2lsbCBhbGxvdyB1cyB0byBuZWdvdGlhdGUgZm9yIAorICogCXN5bmNocm9ub3VzIHRyYW5zZmVycy4gIFRoaXMgaWxsIGJlIHJlcGxhY2VkIHdpdGggYSBtb3JlIAorICogCWludGVncmF0ZWQgZnVuY3Rpb247IHBlcmhhcHMgYSBuZXcgZW50cnkgaW4gdGhlIHNjc2lfaG9zdCAKKyAqCXN0cnVjdHVyZSwgYWNjZXNzaWJsZSB2aWEgYW4gaW9jdGwoKSBvciBwZXJoYXBzIC9wcm9jL3Njc2kuCisgKgorICogSW5wdXRzIDogaG9zdCAtIG51bWJlciBvZiBTQ1NJIGhvc3Q7IHRhcmdldCAtIG51bWJlciBvZiB0YXJnZXQuCisgKgorICogUmV0dXJucyA6IDAgd2hlbiBuZWdvdGlhdGlvbiBoYXMgYmVlbiBzZXR1cCBmb3IgbmV4dCBTQ1NJIGNvbW1hbmQsCisgKgktMSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQKK3JlcXVlc3Rfc3luY2hyb25vdXMgKGludCBob3N0LCBpbnQgdGFyZ2V0KSB7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaDsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGlmICh0YXJnZXQgPCAwKSB7CisJcHJpbnRrIChLRVJOX0FMRVJUICJ0YXJnZXQgJWQgaXMgYm9ndXNcbiIsIHRhcmdldCk7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIShoID0gZmluZF9ob3N0IChob3N0KSkpCisJcmV0dXJuIC0xOworICAgIGVsc2UgaWYgKGgtPnRoaXNfaWQgPT0gdGFyZ2V0KSB7CisJcHJpbnRrIChLRVJOX0FMRVJUICJ0YXJnZXQgJWQgaXMgaG9zdCBJRFxuIiwgdGFyZ2V0KTsKKwlyZXR1cm4gLTE7CisgICAgfSAKKyAgICBlbHNlIGlmICh0YXJnZXQgPiBoLT5tYXhfaWQpIHsKKwlwcmludGsgKEtFUk5fQUxFUlQgInRhcmdldCAlZCBleGNlZWRzIG1heGltdW0gb2YgJWRcbiIsIHRhcmdldCwKKwkgICAgaC0+bWF4X2lkKTsKKwlyZXR1cm4gLTE7CisgICAgfQorICAgIGhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKiloLT5ob3N0ZGF0YVswXTsKKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICBpZiAoaG9zdGRhdGEtPmluaXRpYXRlX3NkdHIgJiAoMSA8PCB0YXJnZXQpKSB7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXByaW50ayAoS0VSTl9BTEVSVCAidGFyZ2V0ICVkIGFscmVhZHkgZG9pbmcgU0RUUlxuIiwgdGFyZ2V0KTsKKwlyZXR1cm4gLTE7CisgICAgfSAKKyAgICBob3N0ZGF0YS0+aW5pdGlhdGVfc2R0ciB8PSAoMSA8PCB0YXJnZXQpOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogRnVuY3Rpb24gOiByZXF1ZXN0X2Rpc2Nvbm5lY3QgKGludCBob3N0LCBpbnQgb25fb3Jfb2ZmKQorICogCisgKiBQdXJwb3NlIDogS0dEQiBzdXBwb3J0IGZ1bmN0aW9uLCB0ZWxscyB1cyB0byBhbGxvdyBvciBkaXNhbGxvdyAKKyAqCWRpc2Nvbm5lY3Rpb25zLgorICoKKyAqIElucHV0cyA6IGhvc3QgLSBudW1iZXIgb2YgU0NTSSBob3N0OyBvbl9vcl9vZmYgLSBub24temVybyB0byBhbGxvdywKKyAqCXplcm8gdG8gZGlzYWxsb3cuCisgKgorICogUmV0dXJucyA6IDAgb24gc3VjY2VzcywgKgktMSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgCityZXF1ZXN0X2Rpc2Nvbm5lY3QgKGludCBob3N0LCBpbnQgb25fb3Jfb2ZmKSB7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaDsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YTsKKyAgICBpZiAoIShoID0gZmluZF9ob3N0IChob3N0KSkpCisJcmV0dXJuIC0xOworICAgIGhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikgaC0+aG9zdGRhdGFbMF07CisgICAgaWYgKG9uX29yX29mZikgCisJaG9zdGRhdGEtPm9wdGlvbnMgfD0gT1BUSU9OX0RJU0NPTk5FQ1Q7CisgICAgZWxzZQorCWhvc3RkYXRhLT5vcHRpb25zICY9IH5PUFRJT05fRElTQ09OTkVDVDsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogRnVuY3Rpb24gOiBzdGF0aWMgdm9pZCBOQ1I1M2M3eDBfZHJpdmVyX2luaXQgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCisgKgorICogUHVycG9zZSA6IEluaXRpYWxpemUgaW50ZXJuYWwgc3RydWN0dXJlcywgYXMgcmVxdWlyZWQgb24gc3RhcnR1cCwgb3IgCisgKglhZnRlciBhIFNDU0kgYnVzIHJlc2V0LgorICogCisgKiBJbnB1dHMgOiBob3N0IC0gcG9pbnRlciB0byB0aGlzIGhvc3QgYWRhcHRlcidzIHN0cnVjdHVyZQorICovCisKK3N0YXRpYyB2b2lkIAorTkNSNTNjN3gwX2RyaXZlcl9pbml0IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KSB7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorCWhvc3QtPmhvc3RkYXRhWzBdOworICAgIGludCBpLCBqOworICAgIHUzMiAqbmNyY3VycmVudDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisJaG9zdGRhdGEtPnJlcXVlc3Rfc2Vuc2VbaV0gPSAwOworICAgIAlmb3IgKGogPSAwOyBqIDwgODsgKytqKSAKKwkgICAgaG9zdGRhdGEtPmJ1c3lbaV1bal0gPSAwOworCXNldF9zeW5jaHJvbm91cyAoaG9zdCwgaSwgLyogc3hmZXIgKi8gMCwgaG9zdGRhdGEtPnNhdmVkX3NjbnRsMywgMCk7CisgICAgfQorICAgIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IE5VTEw7CisgICAgaG9zdGRhdGEtPnJ1bm5pbmdfbGlzdCA9IGhvc3RkYXRhLT5maW5pc2hlZF9xdWV1ZSA9IAorCWhvc3RkYXRhLT5uY3JjdXJyZW50ID0gTlVMTDsKKyAgICBmb3IgKGkgPSAwLCBuY3JjdXJyZW50ID0gKHUzMiAqKSBob3N0ZGF0YS0+c2NoZWR1bGU7IAorCWkgPCBob3N0LT5jYW5fcXVldWU7ICsraSwgbmNyY3VycmVudCArPSAyKSB7CisJbmNyY3VycmVudFswXSA9IGhvc3RkYXRhLT5OT1BfaW5zbjsKKwluY3JjdXJyZW50WzFdID0gMHhkZWFkYmVlZjsKKyAgICB9CisgICAgbmNyY3VycmVudFswXSA9ICgoRENNRF9UWVBFX1RDSXxEQ01EX1RDSV9PUF9KVU1QKSA8PCAyNCkgfCBEQkNfVENJX1RSVUU7CisgICAgbmNyY3VycmVudFsxXSA9ICh1MzIpIHZpcnRfdG9fYnVzIChob3N0ZGF0YS0+c2NyaXB0KSArCisJaG9zdGRhdGEtPkVfd2FpdF9yZXNlbGVjdDsKKyAgICBob3N0ZGF0YS0+cmVjb25uZWN0X2RzYV9oZWFkID0gMDsKKyAgICBob3N0ZGF0YS0+YWRkcl9yZWNvbm5lY3RfZHNhX2hlYWQgPSAodTMyKSAKKwl2aXJ0X3RvX2J1cygodm9pZCAqKSAmKGhvc3RkYXRhLT5yZWNvbm5lY3RfZHNhX2hlYWQpKTsKKyAgICBob3N0ZGF0YS0+ZXhwZWN0aW5nX2lpZCA9IDA7CisgICAgaG9zdGRhdGEtPmV4cGVjdGluZ19zdG8gPSAwOworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9BTFdBWVNfU1lOQ0hST05PVVMpIAorCWhvc3RkYXRhLT5pbml0aWF0ZV9zZHRyID0gMHhmZmZmOyAKKyAgICBlbHNlCisgICAgCWhvc3RkYXRhLT5pbml0aWF0ZV9zZHRyID0gMDsKKyAgICBob3N0ZGF0YS0+dGFsa2VkX3RvID0gMDsKKyAgICBob3N0ZGF0YS0+aWRsZSA9IDE7Cit9CisKKy8qIAorICogRnVuY3Rpb24gOiBzdGF0aWMgaW50IGNsb2NrX3RvX2NjZl83MTAgKGludCBjbG9jaykKKyAqCisgKiBQdXJwb3NlIDogIFJldHVybiB0aGUgY2xvY2sgY29udmVyc2lvbiBmYWN0b3IgZm9yIGEgZ2l2ZW4gU0NTSSBjbG9jay4KKyAqCisgKiBJbnB1dHMgOiBjbG9jayAtIFNDU0kgY2xvY2sgZXhwcmVzc2VkIGluIEh6LgorICoKKyAqIFJldHVybnMgOiBjY2Ygb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IAorY2xvY2tfdG9fY2NmXzcxMCAoaW50IGNsb2NrKSB7CisgICAgaWYgKGNsb2NrIDw9IDE2NjY2NjY2KQorCXJldHVybiAtMTsKKyAgICBpZiAoY2xvY2sgPD0gMjUwMDAwMDApCisJcmV0dXJuIDI7IAkvKiBEaXZpZGUgYnkgMS4wICovCisgICAgZWxzZSBpZiAoY2xvY2sgPD0gMzc1MDAwMDApCisJcmV0dXJuIDE7IAkvKiBEaXZpZGUgYnkgMS41ICovCisgICAgZWxzZSBpZiAoY2xvY2sgPD0gNTAwMDAwMDApCisJcmV0dXJuIDA7CS8qIERpdmlkZSBieSAyLjAgKi8KKyAgICBlbHNlIGlmIChjbG9jayA8PSA2NjAwMDAwMCkKKwlyZXR1cm4gMzsJLyogRGl2aWRlIGJ5IDMuMCAqLworICAgIGVsc2UgCisJcmV0dXJuIC0xOworfQorICAgIAorLyogCisgKiBGdW5jdGlvbiA6IHN0YXRpYyBpbnQgTkNSNTNjN3gwX2luaXQgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCisgKgorICogUHVycG9zZSA6ICBpbml0aWFsaXplIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmVzIGZvciBhIGdpdmVuIFNDU0kgaG9zdAorICoKKyAqIElucHV0cyA6IGhvc3QgLSBwb2ludGVyIHRvIHRoaXMgaG9zdCBhZGFwdGVyJ3Mgc3RydWN0dXJlCisgKgorICogUHJlY29uZGl0aW9ucyA6IHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSBjaGlwX3R5cGUgCisgKiAJZmllbGQgb2YgdGhlIGhvc3RkYXRhIHN0cnVjdHVyZSBNVVNUIGhhdmUgYmVlbiBzZXQuCisgKgorICogUmV0dXJucyA6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqLworCitpbnQgCitOQ1I1M2M3eDBfaW5pdCAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkgeworICAgIE5DUjUzYzd4MF9sb2NhbF9kZWNsYXJlKCk7CisgICAgaW50IGksIGNjZjsKKyAgICB1bnNpZ25lZCBjaGFyIHJldmlzaW9uOworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikKKwlob3N0LT5ob3N0ZGF0YVswXTsKKyAgICAvKiAKKyAgICAgKiBUaGVyZSBhcmUgc29tZSB0aGluZ3Mgd2hpY2ggd2UgbmVlZCB0byBrbm93IGFib3V0IGluIG9yZGVyIHRvIHByb3ZpZGUKKyAgICAgKiBhIHNlbWJsYW5jZSBvZiBzdXBwb3J0LiAgUHJpbnQgJ2VtIGlmIHRoZXkgYXJlbid0IHdoYXQgd2UgZXhwZWN0LCAKKyAgICAgKiBvdGhlcndpc2UgZG9uJ3QgYWRkIHRvIHRoZSBub2lzZS4KKyAgICAgKiAKKyAgICAgKiAtMSBtZWFucyB3ZSBkb24ndCBrbm93IHdoYXQgdG8gZXhwZWN0LgorICAgICAqLworICAgIGludCB2YWwsIGZsYWdzOworICAgIGNoYXIgYnVmWzMyXTsKKyAgICBpbnQgZXhwZWN0ZWRfaWQgPSAtMTsKKyAgICBpbnQgZXhwZWN0ZWRfY2xvY2sgPSAtMTsKKyAgICBpbnQgdW5pbml0aWFsaXplZCA9IDA7CisjaWZkZWYgTk9fSU9fU1BBQ0UKKyAgICBpbnQgZXhwZWN0ZWRfbWFwcGluZyA9IE9QVElPTl9NRU1PUllfTUFQUEVEOworI2Vsc2UKKyAgICBpbnQgZXhwZWN0ZWRfbWFwcGluZyA9IE9QVElPTl9JT19NQVBQRUQ7CisjZW5kaWYKKyAgICBmb3IgKGk9MDtpPDc7aSsrKQorCWhvc3RkYXRhLT52YWxpZF9pZHNbaV0gPSAxOwkvKiBEZWZhdWx0IGFsbCBJRCdzIHRvIHNjYW4gKi8KKworICAgIC8qIFBhcnNlIGNvbW1hbmRsaW5lIGZsYWdzICovCisgICAgaWYgKGNoZWNrX3NldHVwX3N0cmluZ3MoIm5vYXN5bmMiLCZmbGFncywmdmFsLGJ1ZikpCisgICAgeworCWhvc3RkYXRhLT5vcHRpb25zIHw9IE9QVElPTl9OT19BU1lOQzsKKwlob3N0ZGF0YS0+b3B0aW9ucyAmPSB+KE9QVElPTl9TWU5DSFJPTk9VUyB8IE9QVElPTl9BTFdBWVNfU1lOQ0hST05PVVMpOworICAgIH0KKworICAgIGlmIChjaGVja19zZXR1cF9zdHJpbmdzKCJub3N5bmMiLCZmbGFncywmdmFsLGJ1ZikpCisgICAgeworCWhvc3RkYXRhLT5vcHRpb25zICY9IH4oT1BUSU9OX1NZTkNIUk9OT1VTIHwgT1BUSU9OX0FMV0FZU19TWU5DSFJPTk9VUyk7CisgICAgfQorCisgICAgaWYgKGNoZWNrX3NldHVwX3N0cmluZ3MoIm5vZGlzY29ubmVjdCIsJmZsYWdzLCZ2YWwsYnVmKSkKKwlob3N0ZGF0YS0+b3B0aW9ucyAmPSB+T1BUSU9OX0RJU0NPTk5FQ1Q7CisKKyAgICBpZiAoY2hlY2tfc2V0dXBfc3RyaW5ncygidmFsaWRpZHMiLCZmbGFncywmdmFsLGJ1ZikpCisgICAgeworCWZvciAoaT0wO2k8NztpKyspIAorCQlob3N0ZGF0YS0+dmFsaWRfaWRzW2ldID0gdmFsICYgKDE8PGkpOworICAgIH0KKyAKKyAgICBpZiAgKChpID0gY2hlY2tfc2V0dXBfc3RyaW5ncygibmV4dCIsJmZsYWdzLCZ2YWwsYnVmKSkpCisgICAgeworCXdoaWxlIChpKQorCQlzZXR1cF91c2VkWy0taV0gPSAxOworICAgIH0KKworICAgIGlmIChjaGVja19zZXR1cF9zdHJpbmdzKCJvcHRoaSIsJmZsYWdzLCZ2YWwsYnVmKSkKKwlob3N0ZGF0YS0+b3B0aW9ucyA9IChsb25nIGxvbmcpdmFsIDw8IDMyOworICAgIGlmIChjaGVja19zZXR1cF9zdHJpbmdzKCJvcHRsbyIsJmZsYWdzLCZ2YWwsYnVmKSkKKwlob3N0ZGF0YS0+b3B0aW9ucyB8PSB2YWw7CisKKyAgICBOQ1I1M2M3eDBfbG9jYWxfc2V0dXAoaG9zdCk7CisgICAgc3dpdGNoIChob3N0ZGF0YS0+Y2hpcCkgeworICAgIGNhc2UgNzEwOgorICAgIGNhc2UgNzcwOgorICAgIAlob3N0ZGF0YS0+ZHN0YXRfc2lyX2ludHIgPSBOQ1I1M2M3eDBfZHN0YXRfc2lyX2ludHI7CisgICAgCWhvc3RkYXRhLT5pbml0X3NhdmVfcmVncyA9IE5VTEw7CisgICAgCWhvc3RkYXRhLT5kc2FfZml4dXAgPSBOQ1I1M2M3eHhfZHNhX2ZpeHVwOworICAgIAlob3N0ZGF0YS0+aW5pdF9maXh1cCA9IE5DUjUzYzd4MF9pbml0X2ZpeHVwOworICAgIAlob3N0ZGF0YS0+c29mdF9yZXNldCA9IE5DUjUzYzd4MF9zb2Z0X3Jlc2V0OworCWhvc3RkYXRhLT5ydW5fdGVzdHMgPSBOQ1I1M2M3eHhfcnVuX3Rlc3RzOworCWV4cGVjdGVkX2Nsb2NrID0gaG9zdGRhdGEtPnNjc2lfY2xvY2s7CisJZXhwZWN0ZWRfaWQgPSA3OworICAgIAlicmVhazsKKyAgICBkZWZhdWx0OgorCXByaW50ayAoInNjc2klZCA6IGNoaXAgdHlwZSBvZiAlZCBpcyBub3Qgc3VwcG9ydGVkIHlldCwgZGV0YWNoaW5nLlxuIiwKKwkgICAgaG9zdC0+aG9zdF9ubywgaG9zdGRhdGEtPmNoaXApOworCXNjc2lfdW5yZWdpc3RlciAoaG9zdCk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIEFzc2lnbiBjb25zdGFudHMgYWNjZXNzZWQgYnkgTkNSICovCisgICAgaG9zdGRhdGEtPk5DUjUzYzd4eF96ZXJvID0gMDsJCQkKKyAgICBob3N0ZGF0YS0+TkNSNTNjN3h4X21zZ19yZWplY3QgPSBNRVNTQUdFX1JFSkVDVDsKKyAgICBob3N0ZGF0YS0+TkNSNTNjN3h4X21zZ19hYm9ydCA9IEFCT1JUOworICAgIGhvc3RkYXRhLT5OQ1I1M2M3eHhfbXNnX25vcCA9IE5PUDsKKyAgICBob3N0ZGF0YS0+Tk9QX2luc24gPSAoRENNRF9UWVBFX1RDSXxEQ01EX1RDSV9PUF9KVU1QKSA8PCAyNDsKKyAgICBpZiAoZXhwZWN0ZWRfbWFwcGluZyA9PSAtMSB8fCAKKwkoaG9zdGRhdGEtPm9wdGlvbnMgJiAoT1BUSU9OX01FTU9SWV9NQVBQRUQpKSAhPSAKKwkoZXhwZWN0ZWRfbWFwcGluZyAmIE9QVElPTl9NRU1PUllfTUFQUEVEKSkKKwlwcmludGsgKCJzY3NpJWQgOiB1c2luZyAlcyBtYXBwZWQgYWNjZXNzXG4iLCBob3N0LT5ob3N0X25vLCAKKwkgICAgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX01FTU9SWV9NQVBQRUQpID8gIm1lbW9yeSIgOiAKKwkgICAgImlvIik7CisKKyAgICBob3N0ZGF0YS0+ZG1vZGUgPSAoaG9zdGRhdGEtPmNoaXAgPT0gNzAwIHx8IGhvc3RkYXRhLT5jaGlwID09IDcwMDY2KSA/IAorCURNT0RFX1JFR18wMCA6IERNT0RFX1JFR18xMDsKKyAgICBob3N0ZGF0YS0+aXN0YXQgPSAoKGhvc3RkYXRhLT5jaGlwIC8gMTAwKSA9PSA4KSA/IAorICAgIAlJU1RBVF9SRUdfODAwIDogSVNUQVRfUkVHXzcwMDsKKworLyogV2UgaGF2ZSB0byBhc3N1bWUgdGhhdCB0aGlzIG1heSBiZSB0aGUgZmlyc3QgYWNjZXNzIHRvIHRoZSBjaGlwLCBzbworICogd2UgbXVzdCBzZXQgRUEgaW4gRENOVEwuICovCisKKyAgICBOQ1I1M2M3eDBfd3JpdGU4IChEQ05UTF9SRUcsIERDTlRMXzEwX0VBfERDTlRMXzEwX0NPTSk7CisKKworLyogT25seSB0aGUgSVNUQVQgcmVnaXN0ZXIgaXMgcmVhZGFibGUgd2hlbiB0aGUgTkNSIGlzIHJ1bm5pbmcsIHNvIG1ha2UgCisgICBzdXJlIGl0J3MgaGFsdGVkLiAqLworICAgIG5jcl9oYWx0KGhvc3QpOworCisvKiAKKyAqIFhYWCAtIHRoZSBOQ1I1M2M3MDAgdXNlcyBiaXRmaWVsZGVkIHJlZ2lzdGVycyBmb3IgU0NJRCwgU0RJRCwgZXRjLAorICoJYXMgZG9lcyB0aGUgNzEwIHdpdGggb25lIGJpdCBwZXIgU0NTSSBJRC4gIENvbnZlcnNlbHksIHRoZSBOQ1IKKyAqIAl1c2VzIGEgbm9ybWFsLCAzIGJpdCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlc2UgdmFsdWVzLgorICoKKyAqIEdldCB0aGUgcmVzdCBvZiB0aGUgTkNSIGRvY3VtZW50YXRpb24sIGFuZCBGSU5EIE9VVCB3aGVyZSB0aGUgY2hhbmdlCisgKiB3YXMuCisgKi8KKworI2lmIDAKKwkvKiBNYXkgbm90IGJlIGFibGUgdG8gZG8gdGhpcyAtIGNoaXAgbXkgbm90IGhhdmUgYmVlbiBzZXQgdXAgeWV0ICovCisJdG1wID0gaG9zdGRhdGEtPnRoaXNfaWRfbWFzayA9IE5DUjUzYzd4MF9yZWFkOChTQ0lEX1JFRyk7CisJZm9yIChob3N0LT50aGlzX2lkID0gMDsgdG1wICE9IDE7IHRtcCA+Pj0xLCArK2hvc3QtPnRoaXNfaWQpOworI2Vsc2UKKwlob3N0LT50aGlzX2lkID0gNzsKKyNlbmRpZgorCisvKgorICogTm90ZSA6IHdlIHNob3VsZCBuZXZlciBlbmNvdW50ZXIgYSBib2FyZCBzZXR1cCBmb3IgSUQwLiAgU28sCisgKiAJaWYgd2Ugc2VlIElEMCwgYXNzdW1lIHRoYXQgaXQgd2FzIHVuaW5pdGlhbGl6ZWQgYW5kIHNldCBpdAorICogCXRvIHRoZSBpbmR1c3RyeSBzdGFuZGFyZCA3LgorICovCisgICAgaWYgKCFob3N0LT50aGlzX2lkKSB7CisJcHJpbnRrKCJzY3NpJWQgOiBpbml0aWF0b3IgSUQgd2FzICVkLCBjaGFuZ2luZyB0byA3XG4iLAorCSAgICBob3N0LT5ob3N0X25vLCBob3N0LT50aGlzX2lkKTsKKwlob3N0LT50aGlzX2lkID0gNzsKKwlob3N0ZGF0YS0+dGhpc19pZF9tYXNrID0gMSA8PCA3OworCXVuaW5pdGlhbGl6ZWQgPSAxOworICAgIH07CisKKyAgICBpZiAoZXhwZWN0ZWRfaWQgPT0gLTEgfHwgaG9zdC0+dGhpc19pZCAhPSBleHBlY3RlZF9pZCkKKyAgICAJcHJpbnRrKCJzY3NpJWQgOiB1c2luZyBpbml0aWF0b3IgSUQgJWRcbiIsIGhvc3QtPmhvc3Rfbm8sCisgICAgCSAgICBob3N0LT50aGlzX2lkKTsKKworICAgIC8qCisgICAgICogU2F2ZSBpbXBvcnRhbnQgcmVnaXN0ZXJzIHRvIGFsbG93IGEgc29mdCByZXNldC4KKyAgICAgKi8KKworICAgIC8qCisgICAgICogQ1RFU1Q3IGNvbnRyb2xzIGNhY2hlIHNub29waW5nLCBidXJzdCBtb2RlLCBhbmQgc3VwcG9ydCBmb3IgCisgICAgICogZXh0ZXJuYWwgZGlmZmVyZW50aWFsIGRyaXZlcnMuICBUaGlzIGlzbid0IGN1cnJlbnRseSB1c2VkIC0gdGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBtYXkgbm90IGJlIG9wdGltYWwgYW55d2F5LgorICAgICAqIEV2ZW4gd29yc2UsIGl0IG1heSBuZXZlciBoYXZlIGJlZW4gc2V0IHVwIHNpbmNlIHJlc2V0LgorICAgICAqLworICAgIGhvc3RkYXRhLT5zYXZlZF9jdGVzdDcgPSBOQ1I1M2M3eDBfcmVhZDgoQ1RFU1Q3X1JFRykgJiBDVEVTVDdfU0FWRTsKKyAgICByZXZpc2lvbiA9IChOQ1I1M2M3eDBfcmVhZDgoQ1RFU1Q4X1JFRykgJiAweEYwKSA+PiA0OworICAgIHN3aXRjaCAocmV2aXNpb24pIHsKKwljYXNlIDE6IHJldmlzaW9uID0gMDsgICAgYnJlYWs7CisJY2FzZSAyOiByZXZpc2lvbiA9IDE7ICAgIGJyZWFrOworCWNhc2UgNDogcmV2aXNpb24gPSAyOyAgICBicmVhazsKKwljYXNlIDg6IHJldmlzaW9uID0gMzsgICAgYnJlYWs7CisJZGVmYXVsdDogcmV2aXNpb24gPSAyNTU7IGJyZWFrOworICAgIH0KKyAgICBwcmludGsoInNjc2klZDogUmV2aXNpb24gMHgleFxuIixob3N0LT5ob3N0X25vLHJldmlzaW9uKTsKKworICAgIGlmICgocmV2aXNpb24gPT0gMCB8fCByZXZpc2lvbiA9PSAyNTUpICYmIChob3N0ZGF0YS0+b3B0aW9ucyAmIChPUFRJT05fU1lOQ0hST05PVVN8T1BUSU9OX0RJU0NPTk5FQ1R8T1BUSU9OX0FMV0FZU19TWU5DSFJPTk9VUykpKQorICAgIHsKKwlwcmludGsgKCJzY3NpJWQ6IERpc2FibGluZyBzeW5jIHdvcmtpbmcgYW5kIGRpc2Nvbm5lY3QvcmVzZWxlY3RcbiIsCisJCQkJCQkJaG9zdC0+aG9zdF9ubyk7CisJaG9zdGRhdGEtPm9wdGlvbnMgJj0gfihPUFRJT05fU1lOQ0hST05PVVN8T1BUSU9OX0RJU0NPTk5FQ1R8T1BUSU9OX0FMV0FZU19TWU5DSFJPTk9VUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBPbiBOQ1I1M2M3MDAgc2VyaWVzIGNoaXBzLCBEQ05UTCBjb250cm9scyB0aGUgU0NTSSBjbG9jayBkaXZpc29yLAorICAgICAqIG9uIDgwMCBzZXJpZXMgY2hpcHMsIGl0IGFsbG93cyBmb3IgYSB0b3RlbS1wb2xlIElSUSBkcml2ZXIuCisgICAgICogTk9URSBzYXZlZF9kY250bCBjdXJyZW50bHkgb3ZlcndyaXR0ZW4gaW4gaW5pdCBmdW5jdGlvbi4KKyAgICAgKiBUaGUgdmFsdWUgcmVhZCBoZXJlIG1heSBiZSBnYXJiYWdlIGFueXdheSwgTVZNRTE2eCBib2FyZCBhdCBsZWFzdAorICAgICAqIGRvZXMgbm90IGluaXRpYWxpc2UgY2hpcCBpZiBrZXJuZWwgYXJyaXZlZCB2aWEgdGZ0cC4KKyAgICAgKi8KKworICAgIGhvc3RkYXRhLT5zYXZlZF9kY250bCA9IE5DUjUzYzd4MF9yZWFkOChEQ05UTF9SRUcpOworCisgICAgLyoKKyAgICAgKiBETU9ERSBjb250cm9scyBETUEgYnVyc3QgbGVuZ3RoLCBhbmQgb24gNzAwIHNlcmllcyBjaGlwcywKKyAgICAgKiAyODYgbW9kZSBhbmQgYnVzIHdpZHRoICAKKyAgICAgKiBOT1RFOiAgT24gTVZNRTE2eCwgY2hpcCBtYXkgaGF2ZSBiZWVuIHJlc2V0LCBzbyB0aGlzIGNvdWxkIGJlIGEKKyAgICAgKiBwb3dlci1vbi9yZXNldCBkZWZhdWx0IHZhbHVlLgorICAgICAqLworICAgIGhvc3RkYXRhLT5zYXZlZF9kbW9kZSA9IE5DUjUzYzd4MF9yZWFkOChob3N0ZGF0YS0+ZG1vZGUpOworCisgICAgLyogCisgICAgICogTm93IHRoYXQgYnVyc3QgbGVuZ3RoIGFuZCBlbmFibGVkL2Rpc2FibGVkIHN0YXR1cyBpcyBrbm93biwgCisgICAgICogY2x1ZSB0aGUgdXNlciBpbiBvbiBpdC4gIAorICAgICAqLworICAgCisgICAgY2NmID0gY2xvY2tfdG9fY2NmXzcxMCAoZXhwZWN0ZWRfY2xvY2spOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIAorCWhvc3RkYXRhLT5jbWRfYWxsb2NhdGVkW2ldID0gMDsKKworICAgIGlmIChob3N0ZGF0YS0+aW5pdF9zYXZlX3JlZ3MpCisgICAgCWhvc3RkYXRhLT5pbml0X3NhdmVfcmVncyAoaG9zdCk7CisgICAgaWYgKGhvc3RkYXRhLT5pbml0X2ZpeHVwKQorICAgIAlob3N0ZGF0YS0+aW5pdF9maXh1cCAoaG9zdCk7CisKKyAgICBpZiAoIXRoZV90ZW1wbGF0ZSkgeworCXRoZV90ZW1wbGF0ZSA9IGhvc3QtPmhvc3R0OworCWZpcnN0X2hvc3QgPSBob3N0OworICAgIH0KKworICAgIC8qIAorICAgICAqIExpbnV4IFNDU0kgZHJpdmVycyBoYXZlIGFsd2F5cyBiZWVuIHBsYWd1ZWQgd2l0aCBpbml0aWFsaXphdGlvbiAKKyAgICAgKiBwcm9ibGVtcyAtIHNvbWUgZGlkbid0IHdvcmsgd2l0aCB0aGUgQklPUyBkaXNhYmxlZCBzaW5jZSB0aGV5IGV4cGVjdGVkCisgICAgICogaW5pdGlhbGl6YXRpb24gZnJvbSBpdCwgc29tZSBkaWRuJ3Qgd29yayB3aGVuIHRoZSBuZXR3b3JraW5nIGNvZGUKKyAgICAgKiB3YXMgZW5hYmxlZCBhbmQgcmVnaXN0ZXJzIGdvdCBzY3JhbWJsZWQsIGV0Yy4KKyAgICAgKgorICAgICAqIFRvIGF2b2lkIHByb2JsZW1zIGxpa2UgdGhpcywgaW4gdGhlIGZ1dHVyZSwgd2Ugd2lsbCBkbyBhIHNvZnQgCisgICAgICogcmVzZXQgb24gdGhlIFNDU0kgY2hpcCwgdGFraW5nIGl0IGJhY2sgdG8gYSBzYW5lIHN0YXRlLgorICAgICAqLworCisgICAgaG9zdGRhdGEtPnNvZnRfcmVzZXQgKGhvc3QpOworCisjaWYgMQorICAgIGhvc3RkYXRhLT5kZWJ1Z19jb3VudF9saW1pdCA9IC0xOworI2Vsc2UKKyAgICBob3N0ZGF0YS0+ZGVidWdfY291bnRfbGltaXQgPSAxOworI2VuZGlmCisgICAgaG9zdGRhdGEtPmludHJzID0gLTE7CisgICAgaG9zdGRhdGEtPnJlc2V0cyA9IC0xOworICAgIG1lbWNweSAoKHZvaWQgKikgaG9zdGRhdGEtPnN5bmNocm9ub3VzX3dhbnQsICh2b2lkICopIHNkdHJfbWVzc2FnZSwgCisJc2l6ZW9mIChob3N0ZGF0YS0+c3luY2hyb25vdXNfd2FudCkpOworCisgICAgTkNSNTNjN3gwX2RyaXZlcl9pbml0IChob3N0KTsKKworICAgIGlmIChyZXF1ZXN0X2lycShob3N0LT5pcnEsIE5DUjUzYzd4MF9pbnRyLCBTQV9TSElSUSwgIjUzYzd4eCIsIGhvc3QpKQorICAgIHsKKwlwcmludGsoInNjc2klZCA6IElSUSVkIG5vdCBmcmVlLCBkZXRhY2hpbmdcbiIsCisJCWhvc3QtPmhvc3Rfbm8sIGhvc3QtPmlycSk7CisJZ290byBlcnJfdW5yZWdpc3RlcjsKKyAgICB9IAorCisgICAgaWYgKChob3N0ZGF0YS0+cnVuX3Rlc3RzICYmIGhvc3RkYXRhLT5ydW5fdGVzdHMoaG9zdCkgPT0gLTEpIHx8CisgICAgICAgIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19URVNUU19PTkxZKSkgeworICAgIAkvKiBYWFggU2hvdWxkIGRpc2FibGUgaW50ZXJydXB0cywgZXRjLiBoZXJlICovCisJZ290byBlcnJfZnJlZV9pcnE7CisgICAgfSBlbHNlIHsKKwlpZiAoaG9zdC0+aW9fcG9ydCkgIHsKKwkgICAgaG9zdC0+bl9pb19wb3J0ID0gMTI4OworCSAgICBpZiAoIXJlcXVlc3RfcmVnaW9uIChob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQsICJuY3I1M2M3eHgiKSkKKwkJZ290byBlcnJfZnJlZV9pcnE7CisJfQorICAgIH0KKyAgICAKKyAgICBpZiAoTkNSNTNjN3gwX3JlYWQ4IChTQkNMX1JFRykgJiBTQkNMX0JTWSkgeworCXByaW50ayAoInNjc2klZCA6IGJ1cyB3ZWRnZSwgZG9pbmcgU0NTSSByZXNldFxuIiwgaG9zdC0+aG9zdF9ubyk7CisJaGFyZF9yZXNldCAoaG9zdCk7CisgICAgfQorICAgIHJldHVybiAwOworCisgZXJyX2ZyZWVfaXJxOgorICAgIGZyZWVfaXJxKGhvc3QtPmlycSwgIE5DUjUzYzd4MF9pbnRyKTsKKyBlcnJfdW5yZWdpc3RlcjoKKyAgICBzY3NpX3VucmVnaXN0ZXIoaG9zdCk7CisgICAgcmV0dXJuIC0xOworfQorCisvKiAKKyAqIEZ1bmN0aW9uIDogaW50IG5jcjUzYzd4eF9pbml0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCwgaW50IGJvYXJkLCBpbnQgY2hpcCwKKyAqCXVuc2lnbmVkIGxvbmcgYmFzZSwgaW50IGlvX3BvcnQsIGludCBpcnEsIGludCBkbWEsIGxvbmcgbG9uZyBvcHRpb25zLAorICoJaW50IGNsb2NrKTsKKyAqCisgKiBQdXJwb3NlIDogaW5pdGlhbGl6ZXMgYSBOQ1I1M2M3LDh4MCBiYXNlZCBvbiBiYXNlIGFkZHJlc3NlcywKKyAqCUlSUSwgYW5kIERNQSBjaGFubmVsLgkKKyAqCQorICogSW5wdXRzIDogdHBudCAtIFRlbXBsYXRlIGZvciB0aGlzIFNDU0kgYWRhcHRlciwgYm9hcmQgLSBib2FyZCBsZXZlbAorICoJcHJvZHVjdCwgY2hpcCAtIDcxMAorICogCisgKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorICoKKyAqLworCitpbnQgCituY3I1M2M3eHhfaW5pdCAoU2NzaV9Ib3N0X1RlbXBsYXRlICp0cG50LCBpbnQgYm9hcmQsIGludCBjaGlwLAorICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwgaW50IGlvX3BvcnQsIGludCBpcnEsIGludCBkbWEsIAorICAgIGxvbmcgbG9uZyBvcHRpb25zLCBpbnQgY2xvY2spCit7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisgICAgY2hhciBjaGlwX3N0cls4MF07CisgICAgaW50IHNjcmlwdF9sZW4gPSAwLCBkc2FfbGVuID0gMCwgc2l6ZSA9IDAsIG1heF9jbWRfc2l6ZSA9IDAsCisJc2NoZWR1bGVfc2l6ZSA9IDAsIG9rID0gMDsKKyAgICB2b2lkICp0bXA7CisgICAgdW5zaWduZWQgbG9uZyBwYWdlOworCisgICAgc3dpdGNoIChjaGlwKSB7CisgICAgY2FzZSA3MTA6CisgICAgY2FzZSA3NzA6CisJc2NoZWR1bGVfc2l6ZSA9ICh0cG50LT5jYW5fcXVldWUgKyAxKSAqIDggLyogSlVNUCBpbnN0cnVjdGlvbiBzaXplICovOworCXNjcmlwdF9sZW4gPSBOQ1I1M2M3eHhfc2NyaXB0X2xlbjsKKyAgICAJZHNhX2xlbiA9IE5DUjUzYzd4eF9kc2FfbGVuOworICAgIAlvcHRpb25zIHw9IE9QVElPTl9JTlRGTFk7CisgICAgCXNwcmludGYgKGNoaXBfc3RyLCAiTkNSNTNjJWQiLCBjaGlwKTsKKyAgICAJYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAJcHJpbnRrKCJzY3NpLW5jcjUzYzd4eCA6IHVuc3VwcG9ydGVkIFNDU0kgY2hpcCAlZFxuIiwgY2hpcCk7CisgICAgCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBwcmludGsoInNjc2ktbmNyNTNjN3h4IDogJXMgYXQgbWVtb3J5IDB4JWx4LCBpbyAweCV4LCBpcnEgJWQiLAorICAgIAljaGlwX3N0ciwgYmFzZSwgaW9fcG9ydCwgaXJxKTsKKyAgICBpZiAoZG1hID09IERNQV9OT05FKQorICAgIAlwcmludGsoIlxuIik7CisgICAgZWxzZSAKKyAgICAJcHJpbnRrKCIsIGRtYSAlZFxuIiwgZG1hKTsKKworICAgIGlmIChvcHRpb25zICYgT1BUSU9OX0RFQlVHX1BST0JFX09OTFkpIHsKKyAgICAJcHJpbnRrICgic2NzaS1uY3I1M2M3eHggOiBwcm9iZSBvbmx5IGVuYWJsZWQsIGFib3J0aW5nIGluaXRpYWxpemF0aW9uXG4iKTsKKyAgICAJcmV0dXJuIC0xOworICAgIH0KKworICAgIG1heF9jbWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgTkNSNTNjN3gwX2NtZCkgKyBkc2FfbGVuICsKKyAgICAJLyogU2l6ZSBvZiBkeW5hbWljIHBhcnQgb2YgY29tbWFuZCBzdHJ1Y3R1cmUgOiAqLworCTIgKiAvKiBXb3JzdCBjYXNlIDogd2UgZG9uJ3Qga25vdyBpZiB3ZSBuZWVkIERBVEEgSU4gb3IgREFUQSBvdXQgKi8KKwkJKCAyICogLyogQ3VycmVudCBpbnN0cnVjdGlvbnMgcGVyIHNjYXR0ZXIvZ2F0aGVyIHNlZ21lbnQgKi8gCisgICAgICAgIAkgIHRwbnQtPnNnX3RhYmxlc2l6ZSArIAorICAgICAgICAgICAgICAgICAgMyAvKiBDdXJyZW50IHN0YXJ0dXAgLyB0ZXJtaW5hdGlvbiByZXF1aXJlZCBwZXIgcGhhc2UgKi8KKwkJKSAqCisJOCAvKiBFYWNoIGluc3RydWN0aW9uIGlzIGVpZ2h0IGJ5dGVzICovOworCisgICAgLyogQWxsb2NhdGUgZml4ZWQgcGFydCBvZiBob3N0ZGF0YSwgZHluYW1pYyBwYXJ0IHRvIGhvbGQgYXBwcm9wcmlhdGUKKyAgICAgICBTQ1NJIFNDUklQVCh0bSkgcGx1cyBhIHNpbmdsZSwgbWF4aW11bS1zaXplZCBOQ1I1M2M3eDBfY21kIHN0cnVjdHVyZS4KKworICAgICAgIFdlIG5lZWQgYSBOQ1I1M2M3eDBfY21kIHN0cnVjdHVyZSBmb3Igc2Nhbl9zY3NpcygpIHdoZW4gd2UgYXJlIAorICAgICAgIG5vdCBsb2FkZWQgYXMgYSBtb2R1bGUsIGFuZCB3aGVuIHdlJ3JlIGxvYWRlZCBhcyBhIG1vZHVsZSwgd2UgCisgICAgICAgY2FuJ3QgdXNlIGEgbm9uLWR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHJ1Y3R1cmUgYmVjYXVzZSBtb2R1bGVzCisgICAgICAgYXJlIHZtYWxsb2MoKSdkLCB3aGljaCBjYW4gYWxsb3cgc3RydWN0dXJlcyB0byBjcm9zcyBwYWdlIAorICAgICAgIGJvdW5kYXJpZXMgYW5kIGJyZWFrcyBvdXIgcGh5c2ljYWwvdmlydHVhbCBhZGRyZXNzIGFzc3VtcHRpb25zCisgICAgICAgZm9yIERNQS4KKworICAgICAgIFNvLCB3ZSBzdGljayBpdCBwYXN0IHRoZSBlbmQgb2Ygb3VyIGhvc3RkYXRhIHN0cnVjdHVyZS4KKworICAgICAgIEFTU1VNUFRJT04gOiAKKyAgICAgICAJIFJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgc2ltdWx0YW5lb3VzIFNDU0kgY29tbWFuZHMgd2UgYWxsb3csCisJIHRoZSBwcm9iZSBjb2RlIG9ubHkgZXhlY3V0ZXMgYSBfc2luZ2xlXyBpbnN0cnVjdGlvbiBhdCBhIHRpbWUsCisJIHNvIHdlIG9ubHkgbmVlZCBvbmUgaGVyZSwgYW5kIGRvbid0IG5lZWQgdG8gYWxsb2NhdGUgTkNSNTNjN3gwX2NtZAorCSBzdHJ1Y3R1cmVzIGZvciBlYWNoIHRhcmdldCB1bnRpbCB3ZSBhcmUgbm8gbG9uZ2VyIGluIHNjYW5fc2NzaXMKKwkgYW5kIGttYWxsb2MoKSBoYXMgYmVjb21lIGZ1bmN0aW9uYWwgKG1lbW9yeV9pbml0KCkgaGFwcGVucyAKKwkgYWZ0ZXIgYWxsIGRldmljZSBkcml2ZXIgaW5pdGlhbGl6YXRpb24pLgorICAgICovCisKKyAgICBzaXplID0gc2l6ZW9mKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEpICsgc2NyaXB0X2xlbiArIAorICAgIC8qIE5vdGUgdGhhdCBhbGlnbm1lbnQgd2lsbCBiZSBndWFyYW50ZWVkLCBzaW5jZSB3ZSBwdXQgdGhlIGNvbW1hbmQKKyAgICAgICBhbGxvY2F0ZWQgYXQgcHJvYmUgdGltZSBhZnRlciB0aGUgZml4ZWQtdXAgU0NTSSBzY3JpcHQsIHdoaWNoIAorICAgICAgIGNvbnNpc3RzIG9mIDMyIGJpdCB3b3JkcywgYWxpZ25lZCBvbiBhIDMyIGJpdCBib3VuZGFyeS4gIEJ1dAorICAgICAgIG9uIGEgNjRiaXQgbWFjaGluZSB3ZSBuZWVkIDggYnl0ZSBhbGlnbm1lbnQgZm9yIGhvc3RkYXRhLT5mcmVlLCBzbworICAgICAgIHdlIGFkZCBpbiBhbm90aGVyIDQgYnl0ZXMgdG8gdGFrZSBjYXJlIG9mIHBvdGVudGlhbCBtaXNhbGlnbm1lbnQKKyAgICAgICAqLworCShzaXplb2Yodm9pZCAqKSAtIHNpemVvZih1MzIpKSArIG1heF9jbWRfc2l6ZSArIHNjaGVkdWxlX3NpemU7CisKKyAgICBwYWdlID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDLDEpOworICAgIGlmKHBhZ2U9PTApCisgICAgeworICAgIAlwcmludGsoS0VSTl9FUlIgIjUzYzd4eDogb3V0IG9mIG1lbW9yeS5cbiIpOworICAgIAlyZXR1cm4gLUVOT01FTTsKKyAgICB9CisjaWZkZWYgRk9SQ0VfRFNBX0FMSUdOTUVOVAorICAgIC8qCisgICAgICogNTNjNzEwIHJldi4wIGRvZXNuJ3QgaGF2ZSBhbiBhZGQtd2l0aC1jYXJyeSBpbnN0cnVjdGlvbi4KKyAgICAgKiBFbnN1cmUgd2UgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSB0byBmb3JjZSBEU0EgYWxpZ25tZW50LgorICAgICovCisgICAgc2l6ZSArPSAyNTY7CisjZW5kaWYKKyAgICAvKiBTaXplIHNob3VsZCBiZSA8IDhLLCBzbyB3ZSBjYW4gZml0IGl0IGluIHR3byBwYWdlcy4gKi8KKyAgICBpZiAoc2l6ZSA+IDgxOTIpIHsKKyAgICAgIHByaW50ayhLRVJOX0VSUiAiNTNjN3h4OiBob3N0ZGF0YSA+IDhLXG4iKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnN0YW5jZSA9IHNjc2lfcmVnaXN0ZXIgKHRwbnQsIDQpOworICAgIGlmICghaW5zdGFuY2UpCisgICAgeworICAgICAgICBmcmVlX3BhZ2UocGFnZSk7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBpbnN0YW5jZS0+aG9zdGRhdGFbMF0gPSBwYWdlOworICAgIG1lbXNldCgodm9pZCAqKWluc3RhbmNlLT5ob3N0ZGF0YVswXSwgMCwgODE5Mik7CisgICAgY2FjaGVfcHVzaCh2aXJ0X3RvX3BoeXMoKHZvaWQgKikoaW5zdGFuY2UtPmhvc3RkYXRhWzBdKSksIDgxOTIpOworICAgIGNhY2hlX2NsZWFyKHZpcnRfdG9fcGh5cygodm9pZCAqKShpbnN0YW5jZS0+aG9zdGRhdGFbMF0pKSwgODE5Mik7CisgICAga2VybmVsX3NldF9jYWNoZW1vZGUoKHZvaWQgKilpbnN0YW5jZS0+aG9zdGRhdGFbMF0sIDgxOTIsIElPTUFQX05PQ0FDSEVfU0VSKTsKKworICAgIC8qIEZJWE1FIDogaWYgd2UgZXZlciBzdXBwb3J0IGFuIElTQSBOQ1I1M2M3eHggYmFzZWQgYm9hcmQsIHdlCisgICAgICAgbmVlZCB0byBjaGVjayBpZiB0aGUgY2hpcCBpcyBydW5uaW5nIGluIGEgMTYgYml0IG1vZGUsIGFuZCBpZiBzbyAKKyAgICAgICB1bnJlZ2lzdGVyIGl0IGlmIGl0IGlzIHBhc3QgdGhlIDE2TSAoMHgxMDAwMDAwKSBtYXJrICovCisKKyAgICBob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopaW5zdGFuY2UtPmhvc3RkYXRhWzBdOworICAgIGhvc3RkYXRhLT5zaXplID0gc2l6ZTsKKyAgICBob3N0ZGF0YS0+c2NyaXB0X2NvdW50ID0gc2NyaXB0X2xlbiAvIHNpemVvZih1MzIpOworICAgIGhvc3RkYXRhLT5ib2FyZCA9IGJvYXJkOworICAgIGhvc3RkYXRhLT5jaGlwID0gY2hpcDsKKworICAgIC8qCisgICAgICogQmVpbmcgbWVtb3J5IG1hcHBlZCBpcyBtb3JlIGRlc2lyYWJsZSwgc2luY2UgCisgICAgICoKKyAgICAgKiAtIE1lbW9yeSBhY2Nlc3NlcyBtYXkgYmUgZmFzdGVyLgorICAgICAqCisgICAgICogLSBUaGUgZGVzdGluYXRpb24gYW5kIHNvdXJjZSBhZGRyZXNzIHNwYWNlcyBhcmUgdGhlIHNhbWUgZm9yIAorICAgICAqCSBhbGwgaW5zdHJ1Y3Rpb25zLCBtZWFuaW5nIHdlIGRvbid0IGhhdmUgdG8gdHdpZGRsZSBkbW9kZSBvciAKKyAgICAgKgkgYW55IG90aGVyIHJlZ2lzdGVycy4KKyAgICAgKgorICAgICAqIFNvLCB3ZSB0cnkgZm9yIG1lbW9yeSBtYXBwZWQsIGFuZCBpZiB3ZSBkb24ndCBnZXQgaXQsCisgICAgICogd2UgZ28gZm9yIHBvcnQgbWFwcGVkLCBhbmQgdGhhdCBmYWlsaW5nIHdlIHRlbGwgdGhlIHVzZXIKKyAgICAgKiBpdCBjYW4ndCB3b3JrLgorICAgICAqLworCisgICAgaWYgKGJhc2UpIHsKKwlpbnN0YW5jZS0+YmFzZSA9IGJhc2U7CisJLyogQ2hlY2sgZm9yIGZvcmNlZCBJL08gbWFwcGluZyAqLworICAgIAlpZiAoIShvcHRpb25zICYgT1BUSU9OX0lPX01BUFBFRCkpIHsKKwkgICAgb3B0aW9ucyB8PSBPUFRJT05fTUVNT1JZX01BUFBFRDsKKwkgICAgb2sgPSAxOworCX0KKyAgICB9IGVsc2UgeworCW9wdGlvbnMgJj0gfk9QVElPTl9NRU1PUllfTUFQUEVEOworICAgIH0KKworICAgIGlmIChpb19wb3J0KSB7CisJaW5zdGFuY2UtPmlvX3BvcnQgPSBpb19wb3J0OworCW9wdGlvbnMgfD0gT1BUSU9OX0lPX01BUFBFRDsKKwlvayA9IDE7CisgICAgfSBlbHNlIHsKKwlvcHRpb25zICY9IH5PUFRJT05fSU9fTUFQUEVEOworICAgIH0KKworICAgIGlmICghb2spIHsKKwlwcmludGsgKCJzY3NpJWQgOiBub3QgaW5pdGlhbGl6aW5nLCBubyBJL08gb3IgbWVtb3J5IG1hcHBpbmcga25vd24gXG4iLAorCSAgICBpbnN0YW5jZS0+aG9zdF9ubyk7CisJc2NzaV91bnJlZ2lzdGVyIChpbnN0YW5jZSk7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBpbnN0YW5jZS0+aXJxID0gaXJxOworICAgIGluc3RhbmNlLT5kbWFfY2hhbm5lbCA9IGRtYTsKKworICAgIGhvc3RkYXRhLT5vcHRpb25zID0gb3B0aW9uczsKKyAgICBob3N0ZGF0YS0+ZHNhX2xlbiA9IGRzYV9sZW47CisgICAgaG9zdGRhdGEtPm1heF9jbWRfc2l6ZSA9IG1heF9jbWRfc2l6ZTsKKyAgICBob3N0ZGF0YS0+bnVtX2NtZHMgPSAxOworICAgIGhvc3RkYXRhLT5zY3NpX2Nsb2NrID0gY2xvY2s7CisgICAgLyogSW5pdGlhbGl6ZSBzaW5nbGUgY29tbWFuZCAqLworICAgIHRtcCA9IChob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPnNjcmlwdF9jb3VudCk7CisjaWZkZWYgRk9SQ0VfRFNBX0FMSUdOTUVOVAorICAgIHsKKwl2b2lkICp0ID0gUk9VTkRVUCh0bXAsIHZvaWQgKik7CisJaWYgKCgodTMyKXQgJiAweGZmKSA+IENtZFBhZ2VTdGFydCkKKwkgICAgdCA9ICh2b2lkICopKCh1MzIpdCArIDI1NSk7CisJdCA9ICh2b2lkICopKCgodTMyKXQgJiB+MHhmZikgKyBDbWRQYWdlU3RhcnQpOworICAgICAgICBob3N0ZGF0YS0+ZnJlZSA9IHQ7CisjaWYgMAorCXByaW50ayAoInNjc2k6IFJlZ2lzdGVyZWQgc2l6ZSBpbmNyZWFzZWQgYnkgMjU2IHRvICVkXG4iLCBzaXplKTsKKwlwcmludGsgKCJzY3NpOiBDbWRQYWdlU3RhcnQgPSAweCUwMnhcbiIsIENtZFBhZ2VTdGFydCk7CisJcHJpbnRrICgic2NzaTogdG1wID0gMHglMDh4LCBob3N0ZGF0YS0+ZnJlZSBzZXQgdG8gMHglMDh4XG4iLAorCQkJKHUzMil0bXAsICh1MzIpdCk7CisjZW5kaWYKKyAgICB9CisjZWxzZQorICAgIGhvc3RkYXRhLT5mcmVlID0gUk9VTkRVUCh0bXAsIHZvaWQgKik7CisjZW5kaWYKKyAgICBob3N0ZGF0YS0+ZnJlZS0+cmVhbCA9IHRtcDsKKyAgICBob3N0ZGF0YS0+ZnJlZS0+c2l6ZSA9IG1heF9jbWRfc2l6ZTsKKyAgICBob3N0ZGF0YS0+ZnJlZS0+ZnJlZSA9IE5VTEw7CisgICAgaG9zdGRhdGEtPmZyZWUtPm5leHQgPSBOVUxMOworICAgIGhvc3RkYXRhLT5leHRyYV9hbGxvY2F0ZSA9IDA7CisKKyAgICAvKiBBbGxvY2F0ZSBjb21tYW5kIHN0YXJ0IGNvZGUgc3BhY2UgKi8KKyAgICBob3N0ZGF0YS0+c2NoZWR1bGUgPSAoY2hpcCA9PSA3MDAgfHwgY2hpcCA9PSA3MDA2NikgPworCU5VTEwgOiAodTMyICopICgoY2hhciAqKWhvc3RkYXRhLT5mcmVlICsgbWF4X2NtZF9zaXplKTsKKworLyogCisgKiBGb3IgZGlhZ25vc3RpYyBwdXJwb3Nlcywgd2UgZG9uJ3QgcmVhbGx5IGNhcmUgaG93IGZhc3QgdGhpbmdzIGJsYXplLgorICogRm9yIHByb2ZpbGluZywgd2Ugd2FudCB0byBhY2Nlc3MgdGhlIDgwMG5zIHJlc29sdXRpb24gc3lzdGVtIGNsb2NrLAorICogdXNpbmcgYSAnQycgY2FsbCBvbiB0aGUgaG9zdCBwcm9jZXNzb3IuCisgKgorICogVGhlcmVmb3JlLCB0aGVyZSdzIG5vIG5lZWQgZm9yIHRoZSBOQ1IgY2hpcCB0byBkaXJlY3RseSBtYW5pcHVsYXRlCisgKiB0aGlzIGRhdGEsIGFuZCB3ZSBzaG91bGQgcHV0IGl0IHdoZXJldmVyIGlzIG1vc3QgY29udmVuaWVudCBmb3IgCisgKiBMaW51eC4KKyAqLworICAgIGlmICh0cmFja19ldmVudHMpIAorCWhvc3RkYXRhLT5ldmVudHMgPSAoc3RydWN0IE5DUjUzYzd4MF9ldmVudCAqKSAodHJhY2tfZXZlbnRzID8gCisJICAgIHZtYWxsb2MgKHNpemVvZiAoc3RydWN0IE5DUjUzYzd4MF9ldmVudCkgKiB0cmFja19ldmVudHMpIDogTlVMTCk7CisgICAgZWxzZQorCWhvc3RkYXRhLT5ldmVudHMgPSBOVUxMOworCisgICAgaWYgKGhvc3RkYXRhLT5ldmVudHMpIHsKKwltZW1zZXQgKCh2b2lkICopIGhvc3RkYXRhLT5ldmVudHMsIDAsIHNpemVvZihzdHJ1Y3QgTkNSNTNjN3gwX2V2ZW50KSAqCisJICAgIHRyYWNrX2V2ZW50cyk7CQorCWhvc3RkYXRhLT5ldmVudF9zaXplID0gdHJhY2tfZXZlbnRzOworCWhvc3RkYXRhLT5ldmVudF9pbmRleCA9IDA7CisgICAgfSBlbHNlIAorCWhvc3RkYXRhLT5ldmVudF9zaXplID0gMDsKKworICAgIHJldHVybiBOQ1I1M2M3eDBfaW5pdChpbnN0YW5jZSk7Cit9CisKKworLyogCisgKiBGdW5jdGlvbiA6IHN0YXRpYyB2b2lkIE5DUjUzYzd4MF9pbml0X2ZpeHVwIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQorICoKKyAqIFB1cnBvc2UgOiAgY29weSBhbmQgZml4dXAgdGhlIFNDU0kgU0NSSVBUUyh0bSkgY29kZSBmb3IgdGhpcyBkZXZpY2UuCisgKgorICogSW5wdXRzIDogaG9zdCAtIHBvaW50ZXIgdG8gdGhpcyBob3N0IGFkYXB0ZXIncyBzdHJ1Y3R1cmUKKyAqCisgKi8KKworc3RhdGljIHZvaWQgCitOQ1I1M2M3eDBfaW5pdF9maXh1cCAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkgeworICAgIE5DUjUzYzd4MF9sb2NhbF9kZWNsYXJlKCk7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorCWhvc3QtPmhvc3RkYXRhWzBdOworICAgIHVuc2lnbmVkIGNoYXIgdG1wOworICAgIGludCBpLCBuY3JfdG9fbWVtb3J5LCBtZW1vcnlfdG9fbmNyOworICAgIHUzMiBiYXNlOworICAgIE5DUjUzYzd4MF9sb2NhbF9zZXR1cChob3N0KTsKKworCisgICAgLyogWFhYIC0gTk9URSA6IHRoaXMgY29kZSBNVVNUIGJlIG1hZGUgZW5kaWFuIGF3YXJlICovCisgICAgLyogIENvcHkgY29kZSBpbnRvIGJ1ZmZlciB0aGF0IHdhcyBhbGxvY2F0ZWQgYXQgZGV0ZWN0aW9uIHRpbWUuICAqLworICAgIG1lbWNweSAoKHZvaWQgKikgaG9zdGRhdGEtPnNjcmlwdCwgKHZvaWQgKikgU0NSSVBULCAKKwlzaXplb2YoU0NSSVBUKSk7CisgICAgLyogRml4dXAgbGFiZWxzICovCisgICAgZm9yIChpID0gMDsgaSA8IFBBVENIRVM7ICsraSkgCisJaG9zdGRhdGEtPnNjcmlwdFtMQUJFTFBBVENIRVNbaV1dICs9IAorICAgIAkgICAgdmlydF90b19idXMoaG9zdGRhdGEtPnNjcmlwdCk7CisgICAgLyogRml4dXAgYWRkcmVzc2VzIG9mIGNvbnN0YW50cyB0aGF0IHVzZWQgdG8gYmUgRVhURVJOQUwgKi8KKworICAgIHBhdGNoX2Fic18zMiAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgTkNSNTNjN3h4X21zZ19hYm9ydCwgCisgICAgCXZpcnRfdG9fYnVzKCYoaG9zdGRhdGEtPk5DUjUzYzd4eF9tc2dfYWJvcnQpKSk7CisgICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBOQ1I1M2M3eHhfbXNnX3JlamVjdCwgCisgICAgCXZpcnRfdG9fYnVzKCYoaG9zdGRhdGEtPk5DUjUzYzd4eF9tc2dfcmVqZWN0KSkpOworICAgIHBhdGNoX2Fic18zMiAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgTkNSNTNjN3h4X3plcm8sIAorICAgIAl2aXJ0X3RvX2J1cygmKGhvc3RkYXRhLT5OQ1I1M2M3eHhfemVybykpKTsKKyAgICBwYXRjaF9hYnNfMzIgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIE5DUjUzYzd4eF9zaW5rLCAKKyAgICAJdmlydF90b19idXMoJihob3N0ZGF0YS0+TkNSNTNjN3h4X3NpbmspKSk7CisgICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBOT1BfaW5zbiwKKwl2aXJ0X3RvX2J1cygmKGhvc3RkYXRhLT5OT1BfaW5zbikpKTsKKyAgICBwYXRjaF9hYnNfMzIgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIHNjaGVkdWxlLAorCXZpcnRfdG9fYnVzKCh2b2lkICopIGhvc3RkYXRhLT5zY2hlZHVsZSkpOworCisgICAgLyogRml4dXAgcmVmZXJlbmNlcyB0byBleHRlcm5hbCB2YXJpYWJsZXM6ICovCisgICAgZm9yIChpID0gMDsgaSA8IEVYVEVSTkFMX1BBVENIRVNfTEVOOyArK2kpCisgICAgICAgaG9zdGRhdGEtPnNjcmlwdFtFWFRFUk5BTF9QQVRDSEVTW2ldLm9mZnNldF0gKz0KKyAgICAgICAgIHZpcnRfdG9fYnVzKEVYVEVSTkFMX1BBVENIRVNbaV0uYWRkcmVzcyk7CisKKyAgICAvKiAKKyAgICAgKiBGaXh1cCBhYnNvbHV0ZXMgc2V0IGF0IGJvb3QtdGltZS4KKyAgICAgKiAKKyAgICAgKiBBbGwgbm9uLWNvZGUgYWJzb2x1dGUgdmFyaWFibGVzIHN1ZmZpeGVkIHdpdGggImRzYV8iIGFuZCAiaW50XyIKKyAgICAgKiBhcmUgY29uc3RhbnRzLCBhbmQgbmVlZCBubyBmaXh1cCBwcm92aWRlZCB0aGUgYXNzZW1ibGVyIGhhcyBkb25lIAorICAgICAqIGl0IGZvciB1cyAoSSBkb24ndCBrbm93IHdoYXQgdGhlICJyZWFsIiBOQ1IgYXNzZW1ibGVyIGRvZXMgaW4gCisgICAgICogdGhpcyBjYXNlLCBteSBhc3NlbWJsZXIgZG9lcyB0aGUgcmlnaHQgbWFnaWMpLgorICAgICAqLworCisgICAgcGF0Y2hfYWJzX3J3cmlfZGF0YSAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgZHNhX3NhdmVfZGF0YV9wb2ludGVyLCAKKyAgICAJRW50X2RzYV9jb2RlX3NhdmVfZGF0YV9wb2ludGVyIC0gRW50X2RzYV96ZXJvKTsKKyAgICBwYXRjaF9hYnNfcndyaV9kYXRhIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBkc2FfcmVzdG9yZV9wb2ludGVycywKKyAgICAJRW50X2RzYV9jb2RlX3Jlc3RvcmVfcG9pbnRlcnMgLSBFbnRfZHNhX3plcm8pOworICAgIHBhdGNoX2Fic19yd3JpX2RhdGEgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIGRzYV9jaGVja19yZXNlbGVjdCwKKyAgICAJRW50X2RzYV9jb2RlX2NoZWNrX3Jlc2VsZWN0IC0gRW50X2RzYV96ZXJvKTsKKworICAgIC8qCisgICAgICogSnVzdCBmb3IgdGhlIGhlbGwgb2YgaXQsIHByZXNlcnZlIHRoZSBzZXR0aW5ncyBvZiAKKyAgICAgKiBCdXJzdCBMZW5ndGggYW5kIEVuYWJsZSBSZWFkIExpbmUgYml0cyBmcm9tIHRoZSBETU9ERSAKKyAgICAgKiByZWdpc3Rlci4gIE1ha2Ugc3VyZSBTQ1JJUFRTIHN0YXJ0IGF1dG9tYWdpY2FsbHkuCisgICAgICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVk1FMTZ4KSB8fCBkZWZpbmVkKENPTkZJR19CVk1FNjAwMCkKKyAgICAvKiBXZSBrbm93IGJldHRlciB3aGF0IHdlIHdhbnQgdGhhbiAxNnhCdWcgZG9lcyEgKi8KKyAgICB0bXAgPSBETU9ERV8xMF9CTF84IHwgRE1PREVfMTBfRkMyOworI2Vsc2UKKyAgICB0bXAgPSBOQ1I1M2M3eDBfcmVhZDgoRE1PREVfUkVHXzEwKTsKKyAgICB0bXAgJj0gKERNT0RFX0JMX01BU0sgfCBETU9ERV8xMF9GQzIgfCBETU9ERV8xMF9GQzEgfCBETU9ERV83MTBfUEQgfAorCQkJCQkJCQlETU9ERV83MTBfVU8pOworI2VuZGlmCisKKyAgICBpZiAoIShob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9NRU1PUllfTUFQUEVEKSkgeworICAgIAliYXNlID0gKHUzMikgaG9zdC0+aW9fcG9ydDsKKyAgICAJbWVtb3J5X3RvX25jciA9IHRtcHxETU9ERV84MDBfRElPTTsKKyAgICAJbmNyX3RvX21lbW9yeSA9IHRtcHxETU9ERV84MDBfU0lPTTsKKyAgICB9IGVsc2UgeworICAgIAliYXNlID0gdmlydF90b19idXMoKHZvaWQgKilob3N0LT5iYXNlKTsKKwltZW1vcnlfdG9fbmNyID0gbmNyX3RvX21lbW9yeSA9IHRtcDsKKyAgICB9CisKKyAgICAvKiBTQ1JBVENIQl9SRUdfMTAgPT0gU0NSQVRDSEFfUkVHXzgwMCwgYXMgaXQgaGFwcGVucyAqLworICAgIHBhdGNoX2Fic18zMiAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgYWRkcl9zY3JhdGNoLCBiYXNlICsgU0NSQVRDSEFfUkVHXzgwMCk7CisgICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBhZGRyX3RlbXAsIGJhc2UgKyBURU1QX1JFRyk7CisgICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBhZGRyX2RzYSwgYmFzZSArIERTQV9SRUcpOworCisgICAgLyoKKyAgICAgKiBJIG5lZWRlZCBzb21lIHZhcmlhYmxlcyBpbiB0aGUgc2NyaXB0IHRvIGJlIGFjY2Vzc2libGUgdG8gCisgICAgICogYm90aCB0aGUgTkNSIGNoaXAgYW5kIHRoZSBob3N0IHByb2Nlc3Nvci4gRm9yIHRoZXNlIHZhcmlhYmxlcywKKyAgICAgKiBJIG1hZGUgdGhlIGFyYml0cmFyeSBkZWNpc2lvbiB0byBzdG9yZSB0aGVtIGRpcmVjdGx5IGluIHRoZSAKKyAgICAgKiBob3N0ZGF0YSBzdHJ1Y3R1cmUgcmF0aGVyIHRoYW4gaW4gdGhlIFJFTEFUSVZFIGFyZWEgb2YgdGhlIAorICAgICAqIFNDUklQVFMuCisgICAgICovCisgICAgCisKKyAgICBwYXRjaF9hYnNfcndyaV9kYXRhIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBkbW9kZV9tZW1vcnlfdG9fbWVtb3J5LCB0bXApOworICAgIHBhdGNoX2Fic19yd3JpX2RhdGEgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIGRtb2RlX21lbW9yeV90b19uY3IsIG1lbW9yeV90b19uY3IpOworICAgIHBhdGNoX2Fic19yd3JpX2RhdGEgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIGRtb2RlX25jcl90b19tZW1vcnksIG5jcl90b19tZW1vcnkpOworCisgICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBtc2dfYnVmLCAKKwl2aXJ0X3RvX2J1cygodm9pZCAqKSYoaG9zdGRhdGEtPm1zZ19idWYpKSk7CisgICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCByZWNvbm5lY3RfZHNhX2hlYWQsIAorICAgIAl2aXJ0X3RvX2J1cygodm9pZCAqKSYoaG9zdGRhdGEtPnJlY29ubmVjdF9kc2FfaGVhZCkpKTsKKyAgICBwYXRjaF9hYnNfMzIgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIGFkZHJfcmVjb25uZWN0X2RzYV9oZWFkLCAKKwl2aXJ0X3RvX2J1cygodm9pZCAqKSYoaG9zdGRhdGEtPmFkZHJfcmVjb25uZWN0X2RzYV9oZWFkKSkpOworICAgIHBhdGNoX2Fic18zMiAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgcmVzZWxlY3RlZF9pZGVudGlmeSwgCisgICAgCXZpcnRfdG9fYnVzKCh2b2lkICopJihob3N0ZGF0YS0+cmVzZWxlY3RlZF9pZGVudGlmeSkpKTsKKy8qIHJlc2VsZWN0ZWRfdGFnIGlzIGN1cnJlbnRseSB1bnVzZWQgKi8KKyNpZiAwCisgICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCByZXNlbGVjdGVkX3RhZywgCisgICAgCXZpcnRfdG9fYnVzKCh2b2lkICopJihob3N0ZGF0YS0+cmVzZWxlY3RlZF90YWcpKSk7CisjZW5kaWYKKworICAgIHBhdGNoX2Fic18zMiAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgdGVzdF9kZXN0LCAKKwl2aXJ0X3RvX2J1cygodm9pZCopJmhvc3RkYXRhLT50ZXN0X2Rlc3QpKTsKKyAgICBwYXRjaF9hYnNfMzIgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIHRlc3Rfc3JjLCAKKwl2aXJ0X3RvX2J1cygmaG9zdGRhdGEtPnRlc3Rfc291cmNlKSk7CisgICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBzYXZlZF9kc2EsCisJdmlydF90b19idXMoKHZvaWQgKikmaG9zdGRhdGEtPnNhdmVkMl9kc2EpKTsKKyAgICBwYXRjaF9hYnNfMzIgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIGVtdWxmbHksCisJdmlydF90b19idXMoKHZvaWQgKikmaG9zdGRhdGEtPmVtdWxhdGVkX2ludGZseSkpOworCisgICAgcGF0Y2hfYWJzX3J3cmlfZGF0YSAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgZHNhX2NoZWNrX3Jlc2VsZWN0LCAKKwkodW5zaWduZWQgY2hhcikoRW50X2RzYV9jb2RlX2NoZWNrX3Jlc2VsZWN0IC0gRW50X2RzYV96ZXJvKSk7CisKKy8qIFRoZXNlIGFyZSBmb3IgZXZlbnQgbG9nZ2luZzsgdGhlIG5jcl9ldmVudCBlbnVtIGNvbnRhaW5zIHRoZSAKKyAgIGFjdHVhbCBpbnRlcnJ1cHQgbnVtYmVycy4gKi8KKyNpZmRlZiBBX2ludF9FVkVOVF9TRUxFQ1QKKyAgIHBhdGNoX2Fic18zMiAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgaW50X0VWRU5UX1NFTEVDVCwgKHUzMikgRVZFTlRfU0VMRUNUKTsKKyNlbmRpZgorI2lmZGVmIEFfaW50X0VWRU5UX0RJU0NPTk5FQ1QKKyAgIHBhdGNoX2Fic18zMiAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgaW50X0VWRU5UX0RJU0NPTk5FQ1QsICh1MzIpIEVWRU5UX0RJU0NPTk5FQ1QpOworI2VuZGlmCisjaWZkZWYgQV9pbnRfRVZFTlRfUkVTRUxFQ1QKKyAgIHBhdGNoX2Fic18zMiAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgaW50X0VWRU5UX1JFU0VMRUNULCAodTMyKSBFVkVOVF9SRVNFTEVDVCk7CisjZW5kaWYKKyNpZmRlZiBBX2ludF9FVkVOVF9DT01QTEVURQorICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBpbnRfRVZFTlRfQ09NUExFVEUsICh1MzIpIEVWRU5UX0NPTVBMRVRFKTsKKyNlbmRpZgorI2lmZGVmIEFfaW50X0VWRU5UX0lETEUKKyAgIHBhdGNoX2Fic18zMiAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgaW50X0VWRU5UX0lETEUsICh1MzIpIEVWRU5UX0lETEUpOworI2VuZGlmCisjaWZkZWYgQV9pbnRfRVZFTlRfU0VMRUNUX0ZBSUxFRAorICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBpbnRfRVZFTlRfU0VMRUNUX0ZBSUxFRCwgCisJKHUzMikgRVZFTlRfU0VMRUNUX0ZBSUxFRCk7CisjZW5kaWYKKyNpZmRlZiBBX2ludF9FVkVOVF9CRUZPUkVfU0VMRUNUCisgICBwYXRjaF9hYnNfMzIgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIGludF9FVkVOVF9CRUZPUkVfU0VMRUNULAorCSh1MzIpIEVWRU5UX0JFRk9SRV9TRUxFQ1QpOworI2VuZGlmCisjaWZkZWYgQV9pbnRfRVZFTlRfUkVTRUxFQ1RfRkFJTEVECisgICBwYXRjaF9hYnNfMzIgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIGludF9FVkVOVF9SRVNFTEVDVF9GQUlMRUQsIAorCSh1MzIpIEVWRU5UX1JFU0VMRUNUX0ZBSUxFRCk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogTWFrZSBzdXJlIHRoZSBOQ1IgYW5kIExpbnV4IGNvZGUgYWdyZWUgb24gdGhlIGxvY2F0aW9uIG9mIAorICAgICAqIGNlcnRhaW4gZmllbGRzLgorICAgICAqLworCisgICAgaG9zdGRhdGEtPkVfYWNjZXB0X21lc3NhZ2UgPSBFbnRfYWNjZXB0X21lc3NhZ2U7CisgICAgaG9zdGRhdGEtPkVfY29tbWFuZF9jb21wbGV0ZSA9IEVudF9jb21tYW5kX2NvbXBsZXRlOwkJCisgICAgaG9zdGRhdGEtPkVfY21kb3V0X2NtZG91dCA9IEVudF9jbWRvdXRfY21kb3V0OworICAgIGhvc3RkYXRhLT5FX2RhdGFfdHJhbnNmZXIgPSBFbnRfZGF0YV90cmFuc2ZlcjsKKyAgICBob3N0ZGF0YS0+RV9kZWJ1Z19icmVhayA9IEVudF9kZWJ1Z19icmVhazsJCisgICAgaG9zdGRhdGEtPkVfZHNhX2NvZGVfdGVtcGxhdGUgPSBFbnRfZHNhX2NvZGVfdGVtcGxhdGU7CisgICAgaG9zdGRhdGEtPkVfZHNhX2NvZGVfdGVtcGxhdGVfZW5kID0gRW50X2RzYV9jb2RlX3RlbXBsYXRlX2VuZDsKKyAgICBob3N0ZGF0YS0+RV9lbmRfZGF0YV90cmFuc2ZlciA9IEVudF9lbmRfZGF0YV90cmFuc2ZlcjsKKyAgICBob3N0ZGF0YS0+RV9pbml0aWF0b3JfYWJvcnQgPSBFbnRfaW5pdGlhdG9yX2Fib3J0OworICAgIGhvc3RkYXRhLT5FX21zZ19pbiA9IEVudF9tc2dfaW47CisgICAgaG9zdGRhdGEtPkVfb3RoZXJfdHJhbnNmZXIgPSBFbnRfb3RoZXJfdHJhbnNmZXI7CisgICAgaG9zdGRhdGEtPkVfb3RoZXJfaW4gPSBFbnRfb3RoZXJfaW47CisgICAgaG9zdGRhdGEtPkVfb3RoZXJfb3V0ID0gRW50X290aGVyX291dDsKKyAgICBob3N0ZGF0YS0+RV9yZWplY3RfbWVzc2FnZSA9IEVudF9yZWplY3RfbWVzc2FnZTsKKyAgICBob3N0ZGF0YS0+RV9yZXNwb25kX21lc3NhZ2UgPSBFbnRfcmVzcG9uZF9tZXNzYWdlOworICAgIGhvc3RkYXRhLT5FX3NlbGVjdCA9IEVudF9zZWxlY3Q7CisgICAgaG9zdGRhdGEtPkVfc2VsZWN0X21zZ291dCA9IEVudF9zZWxlY3RfbXNnb3V0OworICAgIGhvc3RkYXRhLT5FX3RhcmdldF9hYm9ydCA9IEVudF90YXJnZXRfYWJvcnQ7CisjaWZkZWYgRW50X3Rlc3RfMAorICAgIGhvc3RkYXRhLT5FX3Rlc3RfMCA9IEVudF90ZXN0XzA7CisjZW5kaWYKKyAgICBob3N0ZGF0YS0+RV90ZXN0XzEgPSBFbnRfdGVzdF8xOworICAgIGhvc3RkYXRhLT5FX3Rlc3RfMiA9IEVudF90ZXN0XzI7CisjaWZkZWYgRW50X3Rlc3RfMworICAgIGhvc3RkYXRhLT5FX3Rlc3RfMyA9IEVudF90ZXN0XzM7CisjZW5kaWYKKyAgICBob3N0ZGF0YS0+RV93YWl0X3Jlc2VsZWN0ID0gRW50X3dhaXRfcmVzZWxlY3Q7CisgICAgaG9zdGRhdGEtPkVfZHNhX2NvZGVfYmVnaW4gPSBFbnRfZHNhX2NvZGVfYmVnaW47CisKKyAgICBob3N0ZGF0YS0+ZHNhX2NtZG91dCA9IEFfZHNhX2NtZG91dDsKKyAgICBob3N0ZGF0YS0+ZHNhX2NtbmQgPSBBX2RzYV9jbW5kOworICAgIGhvc3RkYXRhLT5kc2FfZGF0YWluID0gQV9kc2FfZGF0YWluOworICAgIGhvc3RkYXRhLT5kc2FfZGF0YW91dCA9IEFfZHNhX2RhdGFvdXQ7CisgICAgaG9zdGRhdGEtPmRzYV9lbmQgPSBBX2RzYV9lbmQ7CQkJCisgICAgaG9zdGRhdGEtPmRzYV9tc2dpbiA9IEFfZHNhX21zZ2luOworICAgIGhvc3RkYXRhLT5kc2FfbXNnb3V0ID0gQV9kc2FfbXNnb3V0OworICAgIGhvc3RkYXRhLT5kc2FfbXNnb3V0X290aGVyID0gQV9kc2FfbXNnb3V0X290aGVyOworICAgIGhvc3RkYXRhLT5kc2FfbmV4dCA9IEFfZHNhX25leHQ7CisgICAgaG9zdGRhdGEtPmRzYV9zZWxlY3QgPSBBX2RzYV9zZWxlY3Q7CisgICAgaG9zdGRhdGEtPmRzYV9zdGFydCA9IEVudF9kc2FfY29kZV90ZW1wbGF0ZSAtIEVudF9kc2FfemVybzsKKyAgICBob3N0ZGF0YS0+ZHNhX3N0YXR1cyA9IEFfZHNhX3N0YXR1czsKKyAgICBob3N0ZGF0YS0+ZHNhX2p1bXBfZGVzdCA9IEVudF9kc2FfY29kZV9maXhfanVtcCAtIEVudF9kc2FfemVybyArIAorCTggLyogZGVzdGluYXRpb24gb3BlcmFuZCAqLzsKKworICAgIC8qIHNhbml0eSBjaGVjayAqLworICAgIGlmIChBX2RzYV9maWVsZHNfc3RhcnQgIT0gRW50X2RzYV9jb2RlX3RlbXBsYXRlX2VuZCAtIAorICAgIAlFbnRfZHNhX3plcm8pIAorICAgIAlwcmludGsoInNjc2klZCA6IE5DUiBkc2FfZmllbGRzIHN0YXJ0IGlzICVkIG5vdCAlZFxuIiwKKyAgICAJICAgIGhvc3QtPmhvc3Rfbm8sIEFfZHNhX2ZpZWxkc19zdGFydCwgRW50X2RzYV9jb2RlX3RlbXBsYXRlX2VuZCAtIAorICAgIAkgICAgRW50X2RzYV96ZXJvKTsKKworICAgIHByaW50aygic2NzaSVkIDogTkNSIGNvZGUgcmVsb2NhdGVkIHRvIDB4JWx4ICh2aXJ0IDB4JXApXG4iLCBob3N0LT5ob3N0X25vLAorCXZpcnRfdG9fYnVzKGhvc3RkYXRhLT5zY3JpcHQpLCBob3N0ZGF0YS0+c2NyaXB0KTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogc3RhdGljIGludCBOQ1I1M2M3eHhfcnVuX3Rlc3RzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQorICoKKyAqIFB1cnBvc2UgOiBydW4gdmFyaW91cyB2ZXJpZmljYXRpb24gdGVzdHMgb24gdGhlIE5DUiBjaGlwLCAKKyAqCWluY2x1ZGluZyBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiwgYW5kIHByb3BlciBidXMgbWFzdGVyaW5nCisgKiAJb3BlcmF0aW9uLgorICogCisgKiBJbnB1dHMgOiBob3N0IC0gYSBwcm9wZXJseSBpbml0aWFsaXplZCBTY3NpX0hvc3Qgc3RydWN0dXJlCisgKgorICogUHJlY29uZGl0aW9ucyA6IHRoZSBOQ1IgY2hpcCBtdXN0IGJlIGluIGEgaGFsdGVkIHN0YXRlLgorICoKKyAqIFJldHVybnMgOiAwIGlmIGFsbCB0ZXN0cyB3ZXJlIHN1Y2Nlc3NmdWwsIC0xIG9uIGVycm9yLgorICogCisgKi8KKworc3RhdGljIGludCAKK05DUjUzYzd4eF9ydW5fdGVzdHMgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikKKwlob3N0LT5ob3N0ZGF0YVswXTsKKyAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisgICAgdTMyIHN0YXJ0OworICAgIGludCBmYWlsZWQsIGk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfc2V0dXAoaG9zdCk7CisKKyAgICAvKiBUaGUgTkNSIGNoaXAgX211c3RfIGJlIGlkbGUgdG8gcnVuIHRoZSB0ZXN0IHNjcmlwdHMgKi8KKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICBpZiAoIWhvc3RkYXRhLT5pZGxlKSB7CisJcHJpbnRrICgic2NzaSVkIDogY2hpcCBub3QgaWRsZSwgYWJvcnRpbmcgdGVzdHNcbiIsIGhvc3QtPmhvc3Rfbm8pOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogCisgICAgICogQ2hlY2sgZm9yIGZ1bmN0aW9uYWwgaW50ZXJydXB0cywgdGhpcyBjb3VsZCB3b3JrIGFzIGFuCisgICAgICogYXV0b3Byb2JlIHJvdXRpbmUuCisgICAgICovCisKKyAgICBpZiAoKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX1RFU1QxKSAmJiAKKwkgICAgaG9zdGRhdGEtPnN0YXRlICE9IFNUQVRFX0RJU0FCTEVEKSB7CisJaG9zdGRhdGEtPmlkbGUgPSAwOworCWhvc3RkYXRhLT50ZXN0X3J1bm5pbmcgPSAxOworCWhvc3RkYXRhLT50ZXN0X2NvbXBsZXRlZCA9IC0xOworCWhvc3RkYXRhLT50ZXN0X2Rlc3QgPSAwOworCWhvc3RkYXRhLT50ZXN0X3NvdXJjZSA9IDB4ZGVhZGJlZWY7CisJc3RhcnQgPSB2aXJ0X3RvX2J1cyAoaG9zdGRhdGEtPnNjcmlwdCkgKyBob3N0ZGF0YS0+RV90ZXN0XzE7CisgICAgCWhvc3RkYXRhLT5zdGF0ZSA9IFNUQVRFX1JVTk5JTkc7CisJcHJpbnRrICgic2NzaSVkIDogdGVzdCAxIiwgaG9zdC0+aG9zdF9ubyk7CisJTkNSNTNjN3gwX3dyaXRlMzIgKERTUF9SRUcsIHN0YXJ0KTsKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfVFJBQ0UpCisJICAgIE5DUjUzYzd4MF93cml0ZTggKERDTlRMX1JFRywgaG9zdGRhdGEtPnNhdmVkX2RjbnRsIHwgRENOVExfU1NNIHwKKwkJCQkJCURDTlRMX1NURCk7CisJcHJpbnRrICgiIHN0YXJ0ZWRcbiIpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCS8qIAorCSAqIFRoaXMgaXMgY3VycmVudGx5IGEgLjUgc2Vjb25kIHRpbWVvdXQsIHNpbmNlIChpbiB0aGVvcnkpIG5vIHNsb3cgCisJICogYm9hcmQgd2lsbCB0YWtlIHRoYXQgbG9uZy4gIEluIHByYWN0aWNlLCB3ZSd2ZSBzZWVuIG9uZSAKKwkgKiBwZW50aXVtIHdoaWNoIG9jY2Fzc2lvbmFsbHkgZmFpbHMgd2l0aCB0aGlzLCBidXQgd29ya3Mgd2l0aCAKKwkgKiAxMCB0aW1lcyBhcyBtdWNoPworCSAqLworCisJdGltZW91dCA9IGppZmZpZXMgKyA1ICogSFogLyAxMDsKKwl3aGlsZSAoKGhvc3RkYXRhLT50ZXN0X2NvbXBsZXRlZCA9PSAtMSkgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpCisJCWJhcnJpZXIoKTsKKworCWZhaWxlZCA9IDE7CisJaWYgKGhvc3RkYXRhLT50ZXN0X2NvbXBsZXRlZCA9PSAtMSkKKwkgICAgcHJpbnRrICgic2NzaSVkIDogZHJpdmVyIHRlc3QgMSB0aW1lZCBvdXQlc1xuIixob3N0LT5ob3N0X25vICwKKwkJKGhvc3RkYXRhLT50ZXN0X2Rlc3QgPT0gMHhkZWFkYmVlZikgPyAKKwkJICAgICIgZHVlIHRvIGxvc3QgaW50ZXJydXB0LlxuIgorCQkgICAgIiAgICAgICAgIFBsZWFzZSB2ZXJpZnkgdGhhdCB0aGUgY29ycmVjdCBJUlEgaXMgYmVpbmcgdXNlZCBmb3IgeW91ciBib2FyZCxcbiIKKwkJICAgIDogIiIpOworCWVsc2UgaWYgKGhvc3RkYXRhLT50ZXN0X2NvbXBsZXRlZCAhPSAxKSAKKwkgICAgcHJpbnRrICgic2NzaSVkIDogdGVzdCAxIGJhZCBpbnRlcnJ1cHQgdmFsdWUgKCVkKVxuIiwgCisJCWhvc3QtPmhvc3Rfbm8sIGhvc3RkYXRhLT50ZXN0X2NvbXBsZXRlZCk7CisJZWxzZSAKKwkgICAgZmFpbGVkID0gKGhvc3RkYXRhLT50ZXN0X2Rlc3QgIT0gMHhkZWFkYmVlZik7CisKKwlpZiAoaG9zdGRhdGEtPnRlc3RfZGVzdCAhPSAweGRlYWRiZWVmKSB7CisJICAgIHByaW50ayAoInNjc2klZCA6IGRyaXZlciB0ZXN0IDEgcmVhZCAweCV4IGluc3RlYWQgb2YgMHhkZWFkYmVlZiBpbmRpY2F0aW5nIGFcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgIHByb2JhYmxlIGNhY2hlIGludmFsaWRhdGlvbiBwcm9ibGVtLiAgUGxlYXNlIGNvbmZpZ3VyZSBjYWNoaW5nXG4iCisJCSAgICAiICAgICAgICAgYXMgd3JpdGUtdGhyb3VnaCBvciBkaXNhYmxlZFxuIiwKKwkJaG9zdC0+aG9zdF9ubywgaG9zdGRhdGEtPnRlc3RfZGVzdCk7CisJfQorCisJaWYgKGZhaWxlZCkgeworCSAgICBwcmludGsgKCJzY3NpJWQgOiBEU1AgPSAweCVwIChzY3JpcHQgYXQgMHglcCwgc3RhcnQgYXQgMHgleClcbiIsCisJCWhvc3QtPmhvc3Rfbm8sIGJ1c190b192aXJ0KE5DUjUzYzd4MF9yZWFkMzIoRFNQX1JFRykpLAorCQlob3N0ZGF0YS0+c2NyaXB0LCBzdGFydCk7CisJICAgIHByaW50ayAoInNjc2klZCA6IERTUFMgPSAweCV4XG4iLCBob3N0LT5ob3N0X25vLAorCQlOQ1I1M2M3eDBfcmVhZDMyKERTUFNfUkVHKSk7CisJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKyAgICAJaG9zdGRhdGEtPnRlc3RfcnVubmluZyA9IDA7CisgICAgfQorCisgICAgaWYgKChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19URVNUMikgJiYgCisJaG9zdGRhdGEtPnN0YXRlICE9IFNUQVRFX0RJU0FCTEVEKSB7CisJdTMyIGRzYVs0OF07CisgICAgCXVuc2lnbmVkIGNoYXIgaWRlbnRpZnkgPSBJREVOVElGWSgwLCAwKTsKKwl1bnNpZ25lZCBjaGFyIGNtZFs2XTsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbMzZdOworICAgIAl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IDB4ZmY7CisgICAgCXVuc2lnbmVkIGNoYXIgbXNnID0gMHhmZjsKKworICAgIAljbWRbMF0gPSBJTlFVSVJZOworICAgIAljbWRbMV0gPSBjbWRbMl0gPSBjbWRbM10gPSBjbWRbNV0gPSAwOworICAgIAljbWRbNF0gPSBzaXplb2YoZGF0YSk7IAorCisgICAgCWRzYVsyXSA9IDE7CisgICAgCWRzYVszXSA9IHZpcnRfdG9fYnVzKCZpZGVudGlmeSk7CisgICAgCWRzYVs0XSA9IDY7CisgICAgCWRzYVs1XSA9IHZpcnRfdG9fYnVzKCZjbWQpOworICAgIAlkc2FbNl0gPSBzaXplb2YoZGF0YSk7CisgICAgCWRzYVs3XSA9IHZpcnRfdG9fYnVzKCZkYXRhKTsKKyAgICAJZHNhWzhdID0gMTsKKyAgICAJZHNhWzldID0gdmlydF90b19idXMoJnN0YXR1cyk7CisgICAgCWRzYVsxMF0gPSAxOworICAgIAlkc2FbMTFdID0gdmlydF90b19idXMoJm1zZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgKytpKSB7CisjaWZkZWYgVkFMSURfSURTCisJICAgIGlmICghaG9zdGRhdGEtPnZhbGlkX2lkc1tpXSkKKwkJY29udGludWU7CisjZW5kaWYKKwkgICAgbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkgICAgaWYgKCFob3N0ZGF0YS0+aWRsZSkgeworCQlwcmludGsgKCJzY3NpJWQgOiBjaGlwIG5vdCBpZGxlLCBhYm9ydGluZyB0ZXN0c1xuIiwgaG9zdC0+aG9zdF9ubyk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuIC0xOworCSAgICB9CisKKwkgICAgLyogNzEwOiBiaXQgbWFwcGVkIHNjc2kgSUQsIGFzeW5jICAgKi8KKyAgICAgICAgICAgIGRzYVswXSA9ICgxIDw8IGkpIDw8IDE2OworCSAgICBob3N0ZGF0YS0+aWRsZSA9IDA7CisJICAgIGhvc3RkYXRhLT50ZXN0X3J1bm5pbmcgPSAyOworCSAgICBob3N0ZGF0YS0+dGVzdF9jb21wbGV0ZWQgPSAtMTsKKwkgICAgc3RhcnQgPSB2aXJ0X3RvX2J1cyhob3N0ZGF0YS0+c2NyaXB0KSArIGhvc3RkYXRhLT5FX3Rlc3RfMjsKKwkgICAgaG9zdGRhdGEtPnN0YXRlID0gU1RBVEVfUlVOTklORzsKKwkgICAgTkNSNTNjN3gwX3dyaXRlMzIgKERTQV9SRUcsIHZpcnRfdG9fYnVzKGRzYSkpOworCSAgICBOQ1I1M2M3eDBfd3JpdGUzMiAoRFNQX1JFRywgc3RhcnQpOworCSAgICBpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfVFJBQ0UpCisJICAgICAgICBOQ1I1M2M3eDBfd3JpdGU4IChEQ05UTF9SRUcsIGhvc3RkYXRhLT5zYXZlZF9kY250bCB8CisJCQkJRENOVExfU1NNIHwgRENOVExfU1REKTsKKwkgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJICAgIHRpbWVvdXQgPSBqaWZmaWVzICsgNSAqIEhaOwkvKiBhcmJpdHJhcnkgKi8KKwkgICAgd2hpbGUgKChob3N0ZGF0YS0+dGVzdF9jb21wbGV0ZWQgPT0gLTEpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQorCSAgICAJYmFycmllcigpOworCisJICAgIE5DUjUzYzd4MF93cml0ZTMyIChEU0FfUkVHLCAwKTsKKworCSAgICBpZiAoaG9zdGRhdGEtPnRlc3RfY29tcGxldGVkID09IDIpIHsKKwkJZGF0YVszNV0gPSAwOworCQlwcmludGsgKCJzY3NpJWQgOiB0ZXN0IDIgSU5RVUlSWSB0byB0YXJnZXQgJWQsIGx1biAwIDogJXNcbiIsCisJCSAgICBob3N0LT5ob3N0X25vLCBpLCBkYXRhICsgOCk7CisJCXByaW50ayAoInNjc2klZCA6IHN0YXR1cyAiLCBob3N0LT5ob3N0X25vKTsKKwkJcHJpbnRfc3RhdHVzIChzdGF0dXMpOworCQlwcmludGsgKCJcbnNjc2klZCA6IG1lc3NhZ2UgIiwgaG9zdC0+aG9zdF9ubyk7CisJCXByaW50X21zZyAoJm1zZyk7CisJCXByaW50ayAoIlxuIik7CisJICAgIH0gZWxzZSBpZiAoaG9zdGRhdGEtPnRlc3RfY29tcGxldGVkID09IDMpIHsKKwkJcHJpbnRrKCJzY3NpJWQgOiB0ZXN0IDIgbm8gY29ubmVjdGlvbiB3aXRoIHRhcmdldCAlZFxuIiwKKwkJICAgIGhvc3QtPmhvc3Rfbm8sIGkpOworCQlpZiAoIWhvc3RkYXRhLT5pZGxlKSB7CisJCSAgICBwcmludGsoInNjc2klZCA6IG5vdCBpZGxlXG4iLCBob3N0LT5ob3N0X25vKTsKKwkJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJICAgIHJldHVybiAtMTsKKwkJfQorCSAgICB9IGVsc2UgaWYgKGhvc3RkYXRhLT50ZXN0X2NvbXBsZXRlZCA9PSAtMSkgeworCQlwcmludGsgKCJzY3NpJWQgOiB0ZXN0IDIgdGltZWQgb3V0XG4iLCBob3N0LT5ob3N0X25vKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJICAgIH0gCisJICAgIGhvc3RkYXRhLT50ZXN0X3J1bm5pbmcgPSAwOworCX0KKyAgICB9CisKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IHN0YXRpYyB2b2lkIE5DUjUzYzd4eF9kc2FfZml4dXAgKHN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQpCisgKgorICogUHVycG9zZSA6IGNvcHkgdGhlIE5DUjUzYzh4eCBkc2Egc3RydWN0dXJlIGludG8gY21kJ3MgZHNhIGJ1ZmZlciwKKyAqIAlwZXJmb3JtaW5nIGFsbCBuZWNlc3NhcnkgcmVsb2NhdGlvbi4KKyAqCisgKiBJbnB1dHMgOiBjbWQsIGEgTkNSNTNjN3gwX2NtZCBzdHJ1Y3R1cmUgd2l0aCBhIGRzYSBhcmVhIGxhcmdlCisgKgllbm91Z2ggdG8gaG9sZCB0aGUgTkNSNTNjOHh4IGRzYS4KKyAqLworCitzdGF0aWMgdm9pZCAKK05DUjUzYzd4eF9kc2FfZml4dXAgKHN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQpIHsKKyAgICBTY3NpX0NtbmQgKmMgPSBjbWQtPmNtZDsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gYy0+ZGV2aWNlLT5ob3N0OworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikKKyAgICAJaG9zdC0+aG9zdGRhdGFbMF07CisgICAgaW50IGk7CisKKyAgICBtZW1jcHkgKGNtZC0+ZHNhLCBob3N0ZGF0YS0+c2NyaXB0ICsgKGhvc3RkYXRhLT5FX2RzYV9jb2RlX3RlbXBsYXRlIC8gNCksCisgICAgCWhvc3RkYXRhLT5FX2RzYV9jb2RlX3RlbXBsYXRlX2VuZCAtIGhvc3RkYXRhLT5FX2RzYV9jb2RlX3RlbXBsYXRlKTsKKworICAgIC8qIAorICAgICAqIE5vdGUgOiB3aXRoaW4gdGhlIE5DUiAnQycgY29kZSwgZHNhIHBvaW50cyB0byB0aGUgX3N0YXJ0XworICAgICAqIG9mIHRoZSBEU0Egc3RydWN0dXJlLCBhbmQgX25vdF8gdGhlIG9mZnNldCBvZiBkc2FfemVybyB3aXRoaW4KKyAgICAgKiB0aGF0IHN0cnVjdHVyZSB1c2VkIHRvIGZhY2lsaXRhdGUgc2hvcnRlciBzaWduZWQgb2Zmc2V0cworICAgICAqIGZvciB0aGUgOCBiaXQgQUxVLgorICAgICAqIAorICAgICAqIFRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBhcmUgdGhhdCAKKyAgICAgKiAKKyAgICAgKiAtIDMyIGJpdCBBX2RzYV8qIGFic29sdXRlIHZhbHVlcyByZXF1aXJlIGFuIGFkZGl0aW9uYWwgCisgICAgICogCSBkc2FfemVybyBhZGRlZCB0byB0aGVpciB2YWx1ZSB0byBiZSBjb3JyZWN0LCBzaW5jZSB0aGV5IGFyZSAKKyAgICAgKiAgIHJlbGF0aXZlIHRvIGRzYV96ZXJvIHdoaWNoIGlzIGluIGVzc2VudGlhbGx5IGEgc2VwYXJhdGUKKyAgICAgKiAgIHNwYWNlIGZyb20gdGhlIGNvZGUgc3ltYm9scy4KKyAgICAgKgorICAgICAqIC0gQWxsIG90aGVyIHN5bWJvbHMgcmVxdWlyZSBubyBzcGVjaWFsIHRyZWF0bWVudC4KKyAgICAgKi8KKworICAgIHBhdGNoX2Fic190Y2lfZGF0YSAoY21kLT5kc2EsIEVudF9kc2FfY29kZV90ZW1wbGF0ZSAvIHNpemVvZih1MzIpLAorICAgIAlkc2FfdGVtcF9sdW4sIGMtPmRldmljZS0+bHVuKTsKKyAgICBwYXRjaF9hYnNfMzIgKGNtZC0+ZHNhLCBFbnRfZHNhX2NvZGVfdGVtcGxhdGUgLyBzaXplb2YodTMyKSwKKwlkc2FfdGVtcF9hZGRyX25leHQsIHZpcnRfdG9fYnVzKCZjbWQtPmRzYV9uZXh0X2FkZHIpKTsKKyAgICBwYXRjaF9hYnNfMzIgKGNtZC0+ZHNhLCBFbnRfZHNhX2NvZGVfdGVtcGxhdGUgLyBzaXplb2YodTMyKSwKKyAgICAJZHNhX3RlbXBfbmV4dCwgdmlydF90b19idXMoY21kLT5kc2EpICsgRW50X2RzYV96ZXJvIC0KKwlFbnRfZHNhX2NvZGVfdGVtcGxhdGUgKyBBX2RzYV9uZXh0KTsKKyAgICBwYXRjaF9hYnNfMzIgKGNtZC0+ZHNhLCBFbnRfZHNhX2NvZGVfdGVtcGxhdGUgLyBzaXplb2YodTMyKSwgCisgICAgCWRzYV90ZW1wX3N5bmMsIHZpcnRfdG9fYnVzKCh2b2lkICopaG9zdGRhdGEtPnN5bmNbYy0+ZGV2aWNlLT5pZF0uc2NyaXB0KSk7CisgICAgcGF0Y2hfYWJzXzMyIChjbWQtPmRzYSwgRW50X2RzYV9jb2RlX3RlbXBsYXRlIC8gc2l6ZW9mKHUzMiksIAorICAgIAlkc2Ffc3NjZl83MTAsIHZpcnRfdG9fYnVzKCh2b2lkICopJmhvc3RkYXRhLT5zeW5jW2MtPmRldmljZS0+aWRdLnNzY2ZfNzEwKSk7CisgICAgcGF0Y2hfYWJzX3RjaV9kYXRhIChjbWQtPmRzYSwgRW50X2RzYV9jb2RlX3RlbXBsYXRlIC8gc2l6ZW9mKHUzMiksCisgICAgCSAgICBkc2FfdGVtcF90YXJnZXQsIDEgPDwgYy0+ZGV2aWNlLT5pZCk7CisgICAgLyogWFhYIC0gbmV3IHBvaW50ZXIgc3R1ZmYgKi8KKyAgICBwYXRjaF9hYnNfMzIgKGNtZC0+ZHNhLCBFbnRfZHNhX2NvZGVfdGVtcGxhdGUgLyBzaXplb2YodTMyKSwKKyAgICAJZHNhX3RlbXBfYWRkcl9zYXZlZF9wb2ludGVyLCB2aXJ0X3RvX2J1cygmY21kLT5zYXZlZF9kYXRhX3BvaW50ZXIpKTsKKyAgICBwYXRjaF9hYnNfMzIgKGNtZC0+ZHNhLCBFbnRfZHNhX2NvZGVfdGVtcGxhdGUgLyBzaXplb2YodTMyKSwKKyAgICAJZHNhX3RlbXBfYWRkcl9zYXZlZF9yZXNpZHVhbCwgdmlydF90b19idXMoJmNtZC0+c2F2ZWRfcmVzaWR1YWwpKTsKKyAgICBwYXRjaF9hYnNfMzIgKGNtZC0+ZHNhLCBFbnRfZHNhX2NvZGVfdGVtcGxhdGUgLyBzaXplb2YodTMyKSwKKyAgICAJZHNhX3RlbXBfYWRkcl9yZXNpZHVhbCwgdmlydF90b19idXMoJmNtZC0+cmVzaWR1YWwpKTsKKworICAgIC8qICBYWFggLSBuZXcgc3RhcnQgc3R1ZmYgKi8KKworICAgIHBhdGNoX2Fic18zMiAoY21kLT5kc2EsIEVudF9kc2FfY29kZV90ZW1wbGF0ZSAvIHNpemVvZih1MzIpLAorCWRzYV90ZW1wX2FkZHJfZHNhX3ZhbHVlLCB2aXJ0X3RvX2J1cygmY21kLT5kc2FfYWRkcikpOworfQorCisvKiAKKyAqIEZ1bmN0aW9uIDogcnVuX3Byb2Nlc3NfaXNzdWVfcXVldWUgKHZvaWQpCisgKiAKKyAqIFB1cnBvc2UgOiBpbnN1cmUgdGhhdCB0aGUgY29yb3V0aW5lIGlzIHJ1bm5pbmcgYW5kIHdpbGwgcHJvY2VzcyBvdXIgCisgKiAJcmVxdWVzdC4gIHByb2Nlc3NfaXNzdWVfcXVldWVfcnVubmluZyBpcyBjaGVja2VkL3NldCBoZXJlIChpbiBhbiAKKyAqCWlubGluZSBmdW5jdGlvbikgcmF0aGVyIHRoYW4gaW4gcHJvY2Vzc19pc3N1ZV9xdWV1ZSBpdHNlbGYgdG8gcmVkdWNlIAorICogCXRoZSBjaGFuY2VzIG9mIHN0YWNrIG92ZXJmbG93LgorICoKKyAqLworCitzdGF0aWMgdm9sYXRpbGUgaW50IHByb2Nlc3NfaXNzdWVfcXVldWVfcnVubmluZyA9IDA7CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgCitydW5fcHJvY2Vzc19pc3N1ZV9xdWV1ZSh2b2lkKSB7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgaWYgKCFwcm9jZXNzX2lzc3VlX3F1ZXVlX3J1bm5pbmcpIHsKKwlwcm9jZXNzX2lzc3VlX3F1ZXVlX3J1bm5pbmcgPSAxOworICAgICAgICBwcm9jZXNzX2lzc3VlX3F1ZXVlKGZsYWdzKTsKKwkvKiAKKyAgICAgICAgICogcHJvY2Vzc19pc3N1ZV9xdWV1ZV9ydW5uaW5nIGlzIGNsZWFyZWQgaW4gcHJvY2Vzc19pc3N1ZV9xdWV1ZSAKKwkgKiBvbmNlIGl0IGNhbid0IGRvIG1vcmUgd29yaywgYW5kIHByb2Nlc3NfaXNzdWVfcXVldWUgZXhpdHMgd2l0aCAKKwkgKiBpbnRlcnJ1cHRzIGRpc2FibGVkLgorCSAqLworICAgIH0KKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IHN0YXRpYyB2b2lkIGFibm9ybWFsX2ZpbmlzaGVkIChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqY21kLCBpbnQKKyAqCXJlc3VsdCkKKyAqCisgKiBQdXJwb3NlIDogbWFyayBTQ1NJIGNvbW1hbmQgYXMgZmluaXNoZWQsIE9SJ2luZyB0aGUgaG9zdCBwb3J0aW9uIAorICoJb2YgdGhlIHJlc3VsdCB3b3JkIGludG8gdGhlIHJlc3VsdCBmaWVsZCBvZiB0aGUgY29ycmVzcG9uZGluZworICoJU2NzaV9DbW5kIHN0cnVjdHVyZSwgYW5kIHJlbW92aW5nIGl0IGZyb20gdGhlIGludGVybmFsIHF1ZXVlcy4KKyAqCisgKiBJbnB1dHMgOiBjbWQgLSBjb21tYW5kLCByZXN1bHQgLSBlbnRpcmUgcmVzdWx0IGZpZWxkCisgKgorICogUHJlY29uZGl0aW9ucyA6IHRoZSAJTkNSIGNoaXAgc2hvdWxkIGJlIGluIGEgaGFsdGVkIHN0YXRlIHdoZW4gCisgKglhYm5vcm1hbF9maW5pc2hlZCBpcyBydW4sIHNpbmNlIGl0IG1vZGlmaWVzIHN0cnVjdHVyZXMgd2hpY2gKKyAqCXRoZSBOQ1IgZXhwZWN0cyB0byBoYXZlIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8uCisgKi8KKworc3RhdGljIHZvaWQgCithYm5vcm1hbF9maW5pc2hlZCAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKmNtZCwgaW50IHJlc3VsdCkgeworICAgIFNjc2lfQ21uZCAqYyA9IGNtZC0+Y21kOworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjLT5kZXZpY2UtPmhvc3Q7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorICAgIAlob3N0LT5ob3N0ZGF0YVswXTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGludCBsZWZ0LCBmb3VuZDsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqIGxpbnV4X3NlYXJjaDsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqIHZvbGF0aWxlICpsaW51eF9wcmV2OworICAgIHZvbGF0aWxlIHUzMiAqbmNyX3ByZXYsICpuY3JjdXJyZW50LCBuY3Jfc2VhcmNoOworCisjaWYgMAorICAgIHByaW50ayAoInNjc2klZDogYWJub3JtYWwgZmluaXNoZWRcbiIsIGhvc3QtPmhvc3Rfbm8pOworI2VuZGlmCisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgZm91bmQgPSAwOworICAgIC8qIAorICAgICAqIFRyYXZlcnNlIHRoZSBOQ1IgaXNzdWUgYXJyYXkgdW50aWwgd2UgZmluZCBhIG1hdGNoIG9yIHJ1biBvdXQgCisgICAgICogb2YgaW5zdHJ1Y3Rpb25zLiAgSW5zdHJ1Y3Rpb25zIGluIHRoZSBOQ1IgaXNzdWUgYXJyYXkgYXJlIAorICAgICAqIGVpdGhlciBKVU1QIG9yIE5PUCBpbnN0cnVjdGlvbnMsIHdoaWNoIGFyZSAyIHdvcmRzIGluIGxlbmd0aC4KKyAgICAgKi8KKworCisgICAgZm9yIChmb3VuZCA9IDAsIGxlZnQgPSBob3N0LT5jYW5fcXVldWUsIG5jcmN1cnJlbnQgPSBob3N0ZGF0YS0+c2NoZWR1bGU7IAorCWxlZnQgPiAwOyAtLWxlZnQsIG5jcmN1cnJlbnQgKz0gMikKKyAgICB7CisJaWYgKGlzc3VlX3RvX2NtZCAoaG9zdCwgaG9zdGRhdGEsICh1MzIgKikgbmNyY3VycmVudCkgPT0gY21kKSAKKwl7CisJICAgIG5jcmN1cnJlbnRbMF0gPSBob3N0ZGF0YS0+Tk9QX2luc247CisJICAgIG5jcmN1cnJlbnRbMV0gPSAweGRlYWRiZWVmOworCSAgICArK2ZvdW5kOworCSAgICBicmVhazsKKwl9CisgICAgfQorCQorICAgIC8qIAorICAgICAqIFRyYXZlcnNlIHRoZSBOQ1IgcmVjb25uZWN0IGxpc3Qgb2YgRFNBIHN0cnVjdHVyZXMgdW50aWwgd2UgZmluZCAKKyAgICAgKiBhIHBvaW50ZXIgdG8gdGhpcyBkc2Egb3IgaGF2ZSBmb3VuZCB0b28gbWFueSBjb21tYW5kIHN0cnVjdHVyZXMuICAKKyAgICAgKiBXZSBsZXQgcHJldiBwb2ludCBhdCB0aGUgbmV4dCBmaWVsZCBvZiB0aGUgcHJldmlvdXMgZWxlbWVudCBvciAKKyAgICAgKiBoZWFkIG9mIHRoZSBsaXN0LCBzbyB3ZSBkb24ndCBkbyBhbnl0aGluZyBkaWZmZXJlbnQgZm9yIHJlbW92aW5nIAorICAgICAqIHRoZSBoZWFkIGVsZW1lbnQuICAKKyAgICAgKi8KKworICAgIGZvciAobGVmdCA9IGhvc3QtPmNhbl9xdWV1ZSwKKwkgICAgbmNyX3NlYXJjaCA9IGhvc3RkYXRhLT5yZWNvbm5lY3RfZHNhX2hlYWQsIAorCSAgICBuY3JfcHJldiA9ICZob3N0ZGF0YS0+cmVjb25uZWN0X2RzYV9oZWFkOworCWxlZnQgPj0gMCAmJiBuY3Jfc2VhcmNoICYmIAorCSAgICAoKGNoYXIqKWJ1c190b192aXJ0KG5jcl9zZWFyY2gpICsgaG9zdGRhdGEtPmRzYV9zdGFydCkgCisJCSE9IChjaGFyICopIGNtZC0+ZHNhOworCW5jcl9wcmV2ID0gKHUzMiopICgoY2hhciopYnVzX3RvX3ZpcnQobmNyX3NlYXJjaCkgKyAKKwkgICAgaG9zdGRhdGEtPmRzYV9uZXh0KSwgbmNyX3NlYXJjaCA9ICpuY3JfcHJldiwgLS1sZWZ0KTsKKworICAgIGlmIChsZWZ0IDwgMCkgCisJcHJpbnRrKCJzY3NpJWQ6IGxvb3AgZGV0ZWN0ZWQgaW4gbmNyIHJlY29ubmNlY3QgbGlzdFxuIiwKKwkgICAgaG9zdC0+aG9zdF9ubyk7CisgICAgZWxzZSBpZiAobmNyX3NlYXJjaCkgeworCWlmIChmb3VuZCkKKwkgICAgcHJpbnRrKCJzY3NpJWQ6IHNjc2kgJWxkIGluIG5jciBpc3N1ZSBhcnJheSBhbmQgcmVjb25uZWN0IGxpc3RzXG4iLAorCQlob3N0LT5ob3N0X25vLCBjLT5waWQpOworCWVsc2UgeworCSAgICB2b2xhdGlsZSB1MzIgKiBuZXh0ID0gKHUzMiAqKSAKKwkgICAgCSgoY2hhciAqKWJ1c190b192aXJ0KG5jcl9zZWFyY2gpICsgaG9zdGRhdGEtPmRzYV9uZXh0KTsKKwkgICAgKm5jcl9wcmV2ID0gKm5leHQ7CisvKiBJZiB3ZSdyZSBhdCB0aGUgdGFpbCBlbmQgb2YgdGhlIGlzc3VlIHF1ZXVlLCB1cGRhdGUgdGhhdCBwb2ludGVyIHRvby4gKi8KKwkgICAgZm91bmQgPSAxOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRyYXZlcnNlIHRoZSBob3N0IHJ1bm5pbmcgbGlzdCB1bnRpbCB3ZSBmaW5kIHRoaXMgY29tbWFuZCBvciBkaXNjb3ZlcgorICAgICAqIHdlIGhhdmUgdG9vIG1hbnkgZWxlbWVudHMsIHBvaW50aW5nIGxpbnV4X3ByZXYgYXQgdGhlIG5leHQgZmllbGQgb2YgdGhlIAorICAgICAqIGxpbnV4X3ByZXZpb3VzIGVsZW1lbnQgb3IgaGVhZCBvZiB0aGUgbGlzdCwgc2VhcmNoIGF0IHRoaXMgZWxlbWVudC4KKyAgICAgKi8KKworICAgIGZvciAobGVmdCA9IGhvc3QtPmNhbl9xdWV1ZSwgbGludXhfc2VhcmNoID0gaG9zdGRhdGEtPnJ1bm5pbmdfbGlzdCwgCisJICAgIGxpbnV4X3ByZXYgPSAmaG9zdGRhdGEtPnJ1bm5pbmdfbGlzdDsKKwlsZWZ0ID49IDAgJiYgbGludXhfc2VhcmNoICYmIGxpbnV4X3NlYXJjaCAhPSBjbWQ7CisJbGludXhfcHJldiA9ICYobGludXhfc2VhcmNoLT5uZXh0KSwgCisJICAgIGxpbnV4X3NlYXJjaCA9IGxpbnV4X3NlYXJjaC0+bmV4dCwgLS1sZWZ0KTsKKyAgICAKKyAgICBpZiAobGVmdCA8IDApIAorCXByaW50ayAoInNjc2klZDogbG9vcCBkZXRlY3RlZCBpbiBob3N0IHJ1bm5pbmcgbGlzdCBmb3Igc2NzaSBwaWQgJWxkXG4iLAorCSAgICBob3N0LT5ob3N0X25vLCBjLT5waWQpOworICAgIGVsc2UgaWYgKGxpbnV4X3NlYXJjaCkgeworCSpsaW51eF9wcmV2ID0gbGludXhfc2VhcmNoLT5uZXh0OworCS0taG9zdGRhdGEtPmJ1c3lbYy0+ZGV2aWNlLT5pZF1bYy0+ZGV2aWNlLT5sdW5dOworICAgIH0KKworICAgIC8qIFJldHVybiB0aGUgTkNSIGNvbW1hbmQgc3RydWN0dXJlIHRvIHRoZSBmcmVlIGxpc3QgKi8KKyAgICBjbWQtPm5leHQgPSBob3N0ZGF0YS0+ZnJlZTsKKyAgICBob3N0ZGF0YS0+ZnJlZSA9IGNtZDsKKyAgICBjLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworICAgIC8qIEFuZCByZXR1cm4gKi8KKyAgICBjLT5yZXN1bHQgPSByZXN1bHQ7CisgICAgYy0+c2NzaV9kb25lKGMpOworCisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIHJ1bl9wcm9jZXNzX2lzc3VlX3F1ZXVlKCk7Cit9CisKKy8qIAorICogRnVuY3Rpb24gOiBzdGF0aWMgdm9pZCBpbnRyX2JyZWFrIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LAorICogCXN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQpCisgKgorICogUHVycG9zZSA6ICBIYW5kbGVyIGZvciBicmVha3BvaW50IGludGVycnVwdHMgZnJvbSBhIFNDU0kgc2NyaXB0CisgKgorICogSW5wdXRzIDogaG9zdCAtIHBvaW50ZXIgdG8gdGhpcyBob3N0IGFkYXB0ZXIncyBzdHJ1Y3R1cmUsCisgKiAJY21kIC0gcG9pbnRlciB0byB0aGUgY29tbWFuZCAoaWYgYW55KSBkc2Egd2FzIHBvaW50aW5nIAorICogCXRvLgorICoKKyAqLworCitzdGF0aWMgdm9pZCAKK2ludHJfYnJlYWsgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCAKKyAgICBOQ1I1M2M3eDBfY21kICpjbWQpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHN0cnVjdCBOQ1I1M2M3eDBfYnJlYWsgKmJwOworI2lmIDAKKyAgICBTY3NpX0NtbmQgKmMgPSBjbWQgPyBjbWQtPmNtZCA6IE5VTEw7CisjZW5kaWYKKyAgICB1MzIgKmRzcDsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopCisJaG9zdC0+aG9zdGRhdGFbMF07CQkKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIE5DUjUzYzd4MF9sb2NhbF9zZXR1cChob3N0KTsKKworICAgIC8qCisgICAgICogRmluZCB0aGUgYnJlYWsgcG9pbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIGFkZHJlc3MsIGFuZCAKKyAgICAgKiBkdW1wIHRoZSBhcHByb3ByaWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gc3RhbmRhcmQgCisgICAgICogb3V0cHV0LiAgCisgICAgICovCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIGRzcCA9ICh1MzIgKikgYnVzX3RvX3ZpcnQoTkNSNTNjN3gwX3JlYWQzMihEU1BfUkVHKSk7CisgICAgZm9yIChicCA9IGhvc3RkYXRhLT5icmVha3BvaW50czsgYnAgJiYgYnAtPmFkZHJlc3MgIT0gZHNwOyAKKyAgICAJYnAgPSBicC0+bmV4dCk7CisgICAgaWYgKCFicCkgCisgICAgCXBhbmljKCJzY3NpJWQgOiBicmVhayBwb2ludCBpbnRlcnJ1cHQgZnJvbSAlcCB3aXRoIG5vIGJyZWFrcG9pbnQhIiwKKyAgICAJICAgIGhvc3QtPmhvc3Rfbm8sIGRzcCk7CisKKyAgICAvKgorICAgICAqIENvbmZpZ3VyZSB0aGUgTkNSIGNoaXAgZm9yIG1hbnVhbCBzdGFydCBtb2RlLCBzbyB0aGF0IHdlIGNhbiAKKyAgICAgKiBwb2ludCB0aGUgRFNQIHJlZ2lzdGVyIGF0IHRoZSBpbnN0cnVjdGlvbiB0aGF0IGZvbGxvd3MgdGhlIAorICAgICAqIElOVCBpbnRfZGVidWdfYnJlYWsgaW5zdHJ1Y3Rpb24uCisgICAgICovCisKKyAgICBOQ1I1M2M3eDBfd3JpdGU4IChob3N0ZGF0YS0+ZG1vZGUsIAorCU5DUjUzYzd4MF9yZWFkOChob3N0ZGF0YS0+ZG1vZGUpfERNT0RFX01BTik7CisKKyAgICAvKgorICAgICAqIEFuZCB1cGRhdGUgdGhlIERTUCByZWdpc3RlciwgdXNpbmcgdGhlIHNpemUgb2YgdGhlIG9sZCAKKyAgICAgKiBpbnN0cnVjdGlvbiBpbiBieXRlcy4KKyAgICAgKi8KKworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKy8qCisgKiBGdW5jdGlvbiA6IHN0YXRpYyB2b2lkIHByaW50X3N5bmNocm9ub3VzIChjb25zdCBjaGFyICpwcmVmaXgsIAorICoJY29uc3QgdW5zaWduZWQgY2hhciAqbXNnKQorICogCisgKiBQdXJwb3NlIDogcHJpbnQgYSBwcmV0dHksIHVzZXIgYW5kIG1hY2hpbmUgcGFyc2FibGUgcmVwcmVzZW50YXRpb24KKyAqCW9mIGEgU0RUUiBtZXNzYWdlLCBpbmNsdWRpbmcgdGhlICJyZWFsIiBwYXJhbWV0ZXJzLCBkYXRhCisgKgljbG9jayBzbyB3ZSBjYW4gdGVsbCB0cmFuc2ZlciByYXRlIGF0IGEgZ2xhbmNlLgorICoKKyAqIElucHV0cyA7IHByZWZpeCAtIHRleHQgdG8gcHJlcGVuZCwgbXNnIC0gU0RUUiBtZXNzYWdlICg1IGJ5dGVzKQorICovCisKK3N0YXRpYyB2b2lkCitwcmludF9zeW5jaHJvbm91cyAoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCB1bnNpZ25lZCBjaGFyICptc2cpIHsKKyAgICBpZiAobXNnWzRdKSB7CisJaW50IEh6ID0gMTAwMDAwMDAwMCAvIChtc2dbM10gKiA0KTsKKwlpbnQgaW50ZWdlciA9IEh6IC8gMTAwMDAwMDsKKwlpbnQgZnJhY3Rpb24gPSAoSHogLSAoaW50ZWdlciAqIDEwMDAwMDApKSAvIDEwMDAwOworCXByaW50ayAoIiVzcGVyaW9kICVkbnMgb2Zmc2V0ICVkICVkLiUwMmRNSHogJXMgU0NTSSVzXG4iLAorCSAgICBwcmVmaXgsIChpbnQpIG1zZ1szXSAqIDQsIChpbnQpIG1zZ1s0XSwgaW50ZWdlciwgZnJhY3Rpb24sCisJICAgICgoKG1zZ1szXSAqIDQpIDwgMjAwKSA/ICJGQVNUIiA6ICJzeW5jaHJvbm91cyIpLAorCSAgICAoKChtc2dbM10gKiA0KSA8IDIwMCkgPyAiLUlJIiA6ICIiKSk7CisgICAgfSBlbHNlIAorCXByaW50ayAoIiVzYXN5bmNocm9ub3VzIFNDU0lcbiIsIHByZWZpeCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IHN0YXRpYyB2b2lkIHNldF9zeW5jaHJvbm91cyAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgCisgKgkgCWludCB0YXJnZXQsIGludCBzeGZlciwgaW50IHNjbnRsMywgaW50IG5vd19jb25uZWN0ZWQpCisgKgorICogUHVycG9zZSA6IHJlcHJvZ3JhbSB0cmFuc2ZlcnMgYmV0d2VlbiB0aGUgc2VsZWN0ZWQgU0NTSSBpbml0aWF0b3IgYW5kIAorICoJdGFyZ2V0IHdpdGggdGhlIGdpdmVuIHJlZ2lzdGVyIHZhbHVlczsgaW4gdGhlIGluZGlyZWN0CisgKglzZWxlY3Qgb3BlcmFuZCwgcmVzZWxlY3Rpb24gc2NyaXB0LCBhbmQgY2hpcCByZWdpc3RlcnMuCisgKgorICogSW5wdXRzIDogaG9zdCAtIE5DUjUzYzcsOHh4IFNDU0kgaG9zdCwgdGFyZ2V0IC0gbnVtYmVyIFNDU0kgdGFyZ2V0IGlkLAorICoJc3hmZXIgYW5kIHNjbnRsMyAtIE5DUiByZWdpc3RlcnMuIG5vd19jb25uZWN0ZWQgLSBpZiBub24temVybywgCisgKgl3ZSBzaG91bGQgcmVwcm9ncmFtIHRoZSByZWdpc3RlcnMgbm93IHRvby4KKyAqCisgKiAgICAgIE5PVEU6ICBGb3IgNTNjNzEwLCBzY250bDMgaXMgYWN0dWFsbHkgdXNlZCBmb3IgU0NGIGJpdHMgZnJvbQorICoJU0JDTCwgYXMgd2UgZG9uJ3QgaGF2ZSBhIFNDTlRMMy4KKyAqLworCitzdGF0aWMgdm9pZAorc2V0X3N5bmNocm9ub3VzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBpbnQgdGFyZ2V0LCBpbnQgc3hmZXIsIGludCBzY250bDMsCisgICAgaW50IG5vd19jb25uZWN0ZWQpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikgCisJaG9zdC0+aG9zdGRhdGFbMF07CisgICAgdTMyICpzY3JpcHQ7CisgICAgTkNSNTNjN3gwX2xvY2FsX3NldHVwKGhvc3QpOworCisgICAgLyogVGhlc2UgYXJlIGVpZ2h0IGJpdCByZWdpc3RlcnMgKi8KKyAgICBzeGZlciAmPSAweGZmOworICAgIHNjbnRsMyAmPSAweGZmOworCisgICAgaG9zdGRhdGEtPnN5bmNbdGFyZ2V0XS5zeGZlcl9zYW5pdHkgPSBzeGZlcjsKKyAgICBob3N0ZGF0YS0+c3luY1t0YXJnZXRdLnNjbnRsM19zYW5pdHkgPSBzY250bDM7CisKKy8qIAorICogSEFSRCBDT0RFRCA6IHN5bmNocm9ub3VzIHNjcmlwdCBpcyBFSUdIVCB3b3JkcyBsb25nLiAgVGhpcyAKKyAqIG11c3QgYWdyZWUgd2l0aCA1M2M3Ljh4eC5oCisgKi8KKworICAgIGlmICgoaG9zdGRhdGEtPmNoaXAgIT0gNzAwKSAmJiAoaG9zdGRhdGEtPmNoaXAgIT0gNzAwNjYpKSB7CisJaG9zdGRhdGEtPnN5bmNbdGFyZ2V0XS5zZWxlY3RfaW5kaXJlY3QgPSAoMSA8PCB0YXJnZXQpIDw8IDE2IHwKKwkJKHN4ZmVyIDw8IDgpOworCWhvc3RkYXRhLT5zeW5jW3RhcmdldF0uc3NjZl83MTAgPSBzY250bDM7CisKKwlzY3JpcHQgPSAodTMyICopIGhvc3RkYXRhLT5zeW5jW3RhcmdldF0uc2NyaXB0OworCisJLyogWFhYIC0gYWRkIE5DUjUzYzd4MCBjb2RlIHRvIHJlcHJvZ3JhbSBTQ0YgYml0cyBpZiB3ZSB3YW50IHRvICovCisJc2NyaXB0WzBdID0gKChEQ01EX1RZUEVfUldSSSB8IERDTURfUldSSV9PUENfTU9ESUZZIHwKKwkJRENNRF9SV1JJX09QX01PVkUpIDw8IDI0KSB8CisJCShTQkNMX1JFRyA8PCAxNikgfCAoc2NudGwzIDw8IDgpOworCXNjcmlwdFsxXSA9IDA7CisJc2NyaXB0ICs9IDI7CisKKwlzY3JpcHRbMF0gPSAoKERDTURfVFlQRV9SV1JJIHwgRENNRF9SV1JJX09QQ19NT0RJRlkgfAorCSAgICBEQ01EX1JXUklfT1BfTU9WRSkgPDwgMjQpIHwKKwkJKFNYRkVSX1JFRyA8PCAxNikgfCAoc3hmZXIgPDwgOCk7CisJc2NyaXB0WzFdID0gMDsKKwlzY3JpcHQgKz0gMjsKKworI2lmZGVmIERFQlVHX1NZTkNfSU5UUgorCWlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19ESVNDT05ORUNUKSB7CisJICAgIHNjcmlwdFswXSA9ICgoRENNRF9UWVBFX1RDSXxEQ01EX1RDSV9PUF9JTlQpIDw8IDI0KSB8IERCQ19UQ0lfVFJVRTsKKwkgICAgc2NyaXB0WzFdID0gREVCVUdfU1lOQ19JTlRSOworCSAgICBzY3JpcHQgKz0gMjsKKwl9CisjZW5kaWYKKworCXNjcmlwdFswXSA9ICgoRENNRF9UWVBFX1RDSXxEQ01EX1RDSV9PUF9SRVRVUk4pIDw8IDI0KSB8IERCQ19UQ0lfVFJVRTsKKwlzY3JpcHRbMV0gPSAwOworCXNjcmlwdCArPSAyOworICAgIH0KKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19TWU5DSFJPTk9VUykgCisJcHJpbnRrICgic2NzaSVkIDogdGFyZ2V0ICVkIHN5bmMgcGFyYW1ldGVycyBhcmUgc3hmZXI9MHgleCwgc2NudGwzPTB4JXhcbiIsCisJaG9zdC0+aG9zdF9ubywgdGFyZ2V0LCBzeGZlciwgc2NudGwzKTsKKworICAgIGlmIChub3dfY29ubmVjdGVkKSB7CisJTkNSNTNjN3gwX3dyaXRlOChTQkNMX1JFRywgc2NudGwzKTsKKwlOQ1I1M2M3eDBfd3JpdGU4KFNYRkVSX1JFRywgc3hmZXIpOworICAgIH0KK30KKworCisvKgorICogRnVuY3Rpb24gOiBzdGF0aWMgaW50IGFzeW5jaHJvbm91cyAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgaW50IHRhcmdldCkKKyAqCisgKiBQdXJwb3NlIDogcmVwcm9ncmFtIGJldHdlZW4gdGhlIHNlbGVjdGVkIFNDU0kgSG9zdCBhZGFwdGVyIGFuZCB0YXJnZXQgCisgKiAgICAgIChhc3N1bWVkIHRvIGJlIGN1cnJlbnRseSBjb25uZWN0ZWQpIGZvciBhc3luY2hyb25vdXMgdHJhbnNmZXJzLgorICoKKyAqIElucHV0cyA6IGhvc3QgLSBTQ1NJIGhvc3Qgc3RydWN0dXJlLCB0YXJnZXQgLSBudW1lcmljIHRhcmdldCBJRC4KKyAqCisgKiBQcmVjb25kaXRpb25zIDogdGhlIE5DUiBjaGlwIHNob3VsZCBiZSBpbiBvbmUgb2YgdGhlIGhhbHRlZCBzdGF0ZXMKKyAqLworICAgIAorc3RhdGljIHZvaWQKK2FzeW5jaHJvbm91cyAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgaW50IHRhcmdldCkgeworICAgIE5DUjUzYzd4MF9sb2NhbF9kZWNsYXJlKCk7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorCWhvc3QtPmhvc3RkYXRhWzBdOworICAgIE5DUjUzYzd4MF9sb2NhbF9zZXR1cChob3N0KTsKKyAgICBzZXRfc3luY2hyb25vdXMgKGhvc3QsIHRhcmdldCwgLyogbm8gb2Zmc2V0ICovIDAsIGhvc3RkYXRhLT5zYXZlZF9zY250bDMsCisJMSk7CisgICAgcHJpbnRrICgic2NzaSVkIDogc2V0dGluZyB0YXJnZXQgJWQgdG8gYXN5bmNocm9ub3VzIFNDU0lcbiIsCisJaG9zdC0+aG9zdF9ubywgdGFyZ2V0KTsKK30KKworLyogCisgKiBYWFggLSBkbyB3ZSB3YW50IHRvIGdvIG91dCBvZiBvdXIgd2F5IChpZSwgYWRkIGV4dHJhIGNvZGUgdG8gc2VsZWN0aW9uCisgKiAJaW4gdGhlIE5DUjUzYzcxMC9OQ1I1M2M3MjAgc2NyaXB0KSB0byByZXByb2dyYW0gdGhlIHN5bmNocm9ub3VzCisgKiAJY29udmVyc2lvbiBiaXRzLCBvciBjYW4gd2UgYmUgY29udGVudCBpbiBqdXN0IHNldHRpbmcgdGhlIAorICogCXN4ZmVyIGJpdHM/ICBJIGNob3NlIHRvIGRvIHNvIFtyaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWtdCisgKi8KKworLyogVGFibGUgZm9yIE5DUjUzYzh4eCBzeW5jaHJvbm91cyB2YWx1ZXMgKi8KKworLyogVGhpcyB0YWJsZSBpcyBhbHNvIGNvcnJlY3QgZm9yIDcxMCwgYWxsb3dpbmcgdGhhdCBzY2Y9NCBpcyBlcXVpdmFsZW50CisgKiBvZiBTU0NGPTAgKGllIHVzZSBEQ05UTCwgZGl2aWRlIGJ5IDMpIGZvciBhIDUwLjAxLTY2LjAwTUh6IGNsb2NrLgorICogRm9yIGFueSBvdGhlciBjbG9jayB2YWx1ZXMsIHdlIGNhbm5vdCB1c2UgZW50cmllcyB3aXRoIFNDRiB2YWx1ZXMgb2YKKyAqIDQuICBJIGd1ZXNzIHRoYXQgZm9yIGEgNjZNSHogY2xvY2ssIHRoZSBzbG93ZXN0IGl0IHdpbGwgc2V0IGlzIDJNSHosCisgKiBhbmQgZm9yIGEgNTBNSHogY2xvY2ssIHRoZSBzbG93ZXN0IHdpbGwgYmUgMi4yN01oei4gIFNob3VsZCBjaGVjaworICogdGhhdCBhIGRldmljZSBkb2Vzbid0IHRyeSBhbmQgbmVnb3RpYXRlIHN5bmMgYmVsb3cgdGhlc2UgbGltaXRzIQorICovCisgCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBpbnQgZGl2OwkJLyogVG90YWwgY2xvY2sgZGl2aXNvciAqIDEwICovCisgICAgdW5zaWduZWQgY2hhciBzY2Y7CS8qICovCisgICAgdW5zaWduZWQgY2hhciB0cDsJLyogNCArIHRwID0geGZlcnAgZGl2aXNvciAqLworfSBzeW5jc1tdID0geworLyoJZGl2CXNjZgl0cAlkaXYJc2NmCXRwCWRpdglzY2YJdHAgKi8KKyAgICB7CTQwLAkxLAkwfSwgewk1MCwJMSwJMX0sIHsJNjAsCTEsCTJ9LCAKKyAgICB7CTcwLAkxLAkzfSwgewk3NSwJMiwJMX0sIHsJODAsCTEsCTR9LAorICAgIHsJOTAsCTEsCTV9LCB7CTEwMCwJMSwJNn0sIHsJMTA1LAkyLAkzfSwKKyAgICB7CTExMCwJMSwJN30sIHsJMTIwLAkyLAk0fSwgewkxMzUsCTIsCTV9LAorICAgIHsJMTQwLAkzLAkzfSwgewkxNTAsCTIsCTZ9LCB7CTE2MCwJMywJNH0sCisgICAgewkxNjUsCTIsCTd9LCB7CTE4MCwJMywJNX0sIHsJMjAwLAkzLAk2fSwKKyAgICB7CTIxMCwJNCwJM30sIHsJMjIwLAkzLAk3fSwgewkyNDAsCTQsCTR9LAorICAgIHsJMjcwLAk0LAk1fSwgewkzMDAsCTQsCTZ9LCB7CTMzMCwJNCwJN30KK307CisKKy8qCisgKiBGdW5jdGlvbiA6IHN0YXRpYyB2b2lkIHN5bmNocm9ub3VzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBpbnQgdGFyZ2V0LCAKKyAqCWNoYXIgKm1zZykKKyAqCisgKiBQdXJwb3NlIDogcmVwcm9ncmFtIHRyYW5zZmVycyBiZXR3ZWVuIHRoZSBzZWxlY3RlZCBTQ1NJIGluaXRpYXRvciBhbmQgCisgKgl0YXJnZXQgZm9yIHN5bmNocm9ub3VzIFNDU0kgdHJhbnNmZXJzIHN1Y2ggdGhhdCB0aGUgc3luY2hyb25vdXMgCisgKglvZmZzZXQgaXMgbGVzcyB0aGFuIHRoYXQgcmVxdWVzdGVkIGFuZCBwZXJpb2QgYXQgbGVhc3QgYXMgbG9uZyAKKyAqCWFzIHRoYXQgcmVxdWVzdGVkLiAgQWxzbyBtb2RpZnkgKm1zZyBzdWNoIHRoYXQgaXQgY29udGFpbnMgCisgKglhbiBhcHByb3ByaWF0ZSByZXNwb25zZS4gCisgKgorICogSW5wdXRzIDogaG9zdCAtIE5DUjUzYzcsOHh4IFNDU0kgaG9zdCwgdGFyZ2V0IC0gbnVtYmVyIFNDU0kgdGFyZ2V0IGlkLAorICoJbXNnIC0gc3luY2hyb25vdXMgdHJhbnNmZXIgcmVxdWVzdC4KKyAqLworCisKK3N0YXRpYyB2b2lkIAorc3luY2hyb25vdXMgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGludCB0YXJnZXQsIGNoYXIgKm1zZykgeworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikKKwlob3N0LT5ob3N0ZGF0YVswXTsKKyAgICBpbnQgZGVzaXJlLCBkaXZpc29yLCBpLCBsaW1pdDsKKyAgICB1bnNpZ25lZCBjaGFyIHNjbnRsMywgc3hmZXI7CisvKiBUaGUgZGlhZ25vc3RpYyBtZXNzYWdlIGZpdHMgb24gb25lIGxpbmUsIGV2ZW4gd2l0aCBtYXguIHdpZHRoIGludGVnZXJzICovCisgICAgY2hhciBidWZbODBdOwkKKyAgIAorLyogRGVzaXJlZCB0cmFuc2ZlciBjbG9jayBpbiBIeiAqLworICAgIGRlc2lyZSA9IDEwMDAwMDAwMDBMIC8gKG1zZ1szXSAqIDQpOworLyogU2NhbGUgdGhlIGF2YWlsYWJsZSBTQ1NJIGNsb2NrIGJ5IDEwIHNvIHdlIGdldCB0ZW50aHMgKi8KKyAgICBkaXZpc29yID0gKGhvc3RkYXRhLT5zY3NpX2Nsb2NrICogMTApIC8gZGVzaXJlOworCisvKiBOQ1IgY2hpcHMgY2FuIGhhbmRsZSBhdCBtb3N0IGFuIG9mZnNldCBvZiA4ICovCisgICAgaWYgKG1zZ1s0XSA+IDgpCisJbXNnWzRdID0gODsKKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19TRFRSKQorICAgIAlwcmludGsoInNjc2klZCA6IG9wdGltYWwgc3luY2hyb25vdXMgZGl2aXNvciBvZiAlZC4lMDFkXG4iLCAKKwkgICAgaG9zdC0+aG9zdF9ubywgZGl2aXNvciAvIDEwLCBkaXZpc29yICUgMTApOworCisgICAgbGltaXQgPSAoc2l6ZW9mKHN5bmNzKSAvIHNpemVvZihzeW5jc1swXSkgLTEpOworICAgIGZvciAoaSA9IDA7IChpIDwgbGltaXQpICYmIChkaXZpc29yID4gc3luY3NbaV0uZGl2KTsgKytpKTsKKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19TRFRSKQorICAgIAlwcmludGsoInNjc2klZCA6IHNlbGVjdGVkIHN5bmNocm9ub3VzIGRpdmlzb3Igb2YgJWQuJTAxZFxuIiwgCisJICAgIGhvc3QtPmhvc3Rfbm8sIHN5bmNzW2ldLmRpdiAvIDEwLCBzeW5jc1tpXS5kaXYgJSAxMCk7CisKKyAgICBtc2dbM10gPSAoKDEwMDAwMDAwMDBMIC8gaG9zdGRhdGEtPnNjc2lfY2xvY2spICogc3luY3NbaV0uZGl2IC8gMTAgLyA0KTsKKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19TRFRSKQorICAgIAlwcmludGsoInNjc2klZCA6IHNlbGVjdGVkIHN5bmNocm9ub3VzIHBlcmlvZCBvZiAlZG5zXG4iLCBob3N0LT5ob3N0X25vLAorCSAgICBtc2dbM10gKiA0KTsKKworICAgIHNjbnRsMyA9IHN5bmNzW2ldLnNjZjsKKyAgICBzeGZlciA9IChtc2dbNF0gPDwgU1hGRVJfTU9fU0hJRlQpIHwgKHN5bmNzW2ldLnRwIDw8IDQpOworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19TRFRSKQorICAgIAlwcmludGsgKCJzY3NpJWQgOiBzeGZlcj0weCV4IHNjbnRsMz0weCV4XG4iLCAKKwkgICAgaG9zdC0+aG9zdF9ubywgKGludCkgc3hmZXIsIChpbnQpIHNjbnRsMyk7CisgICAgc2V0X3N5bmNocm9ub3VzIChob3N0LCB0YXJnZXQsIHN4ZmVyLCBzY250bDMsIDEpOworICAgIHNwcmludGYgKGJ1ZiwgInNjc2klZCA6IHNldHRpbmcgdGFyZ2V0ICVkIHRvICIsIGhvc3QtPmhvc3Rfbm8sIHRhcmdldCk7CisgICAgcHJpbnRfc3luY2hyb25vdXMgKGJ1ZiwgbXNnKTsKK30KKworLyogCisgKiBGdW5jdGlvbiA6IHN0YXRpYyBpbnQgTkNSNTNjN3gwX2RzdGF0X3Npcl9pbnRyIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LAorICogCXN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQpCisgKgorICogUHVycG9zZSA6ICBIYW5kbGVyIGZvciBJTlQgZ2VuZXJhdGVkIGluc3RydWN0aW9ucyBmb3IgdGhlIAorICogCU5DUjUzYzgxMC84MjAgU0NTSSBTQ1JJUFQKKyAqCisgKiBJbnB1dHMgOiBob3N0IC0gcG9pbnRlciB0byB0aGlzIGhvc3QgYWRhcHRlcidzIHN0cnVjdHVyZSwKKyAqIAljbWQgLSBwb2ludGVyIHRvIHRoZSBjb21tYW5kIChpZiBhbnkpIGRzYSB3YXMgcG9pbnRpbmcgCisgKiAJdG8uCisgKgorICovCisKK3N0YXRpYyBpbnQgCitOQ1I1M2M3eDBfZHN0YXRfc2lyX2ludHIgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCAKKyAgICBOQ1I1M2M3eDBfY21kICpjbWQpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIGludCBwcmludDsKKyAgICBTY3NpX0NtbmQgKmMgPSBjbWQgPyBjbWQtPmNtZCA6IE5VTEw7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorCWhvc3QtPmhvc3RkYXRhWzBdOwkJCisgICAgdTMyIGRzcHMsKmRzcDsJLyogQXJndW1lbnQgb2YgdGhlIElOVCBpbnN0cnVjdGlvbiAqLworCisgICAgTkNSNTNjN3gwX2xvY2FsX3NldHVwKGhvc3QpOworICAgIGRzcHMgPSBOQ1I1M2M3eDBfcmVhZDMyKERTUFNfUkVHKTsKKyAgICBkc3AgPSAodTMyICopIGJ1c190b192aXJ0KE5DUjUzYzd4MF9yZWFkMzIoRFNQX1JFRykpOworCisgICAgLyogUkdIIDE1MDU5NzogIEZyaWcuICBDb21tYW5kcyB3aGljaCBmYWlsIHdpdGggQ2hlY2sgQ29uZGl0aW9uIGFyZQorICAgICAqIEZsYWdnZWQgYXMgc3VjY2Vzc2Z1bCAtIGhhY2sgZHNwcyB0byBpbmRpY2F0ZSBjaGVjayBjb25kaXRpb24gKi8KKyNpZiAwCisgICAgLyogUkdIIDIwMDU5NzogIE5lZWQgdG8gZGlzYWJsZSBmb3IgQlZNRTYwMDAsIGFzIGl0IGdldHMgQ2hlY2sgQ29uZGl0aW9ucworICAgICAqIGFuZCB0aGVuIGRpZXMuICBTZWVtcyB0byBoYW5kbGUgQ2hlY2sgQ29uZGl0aW9uIGF0IHN0YXJ0dXAsIGJ1dAorICAgICAqIG5vdCBtaWQga2VybmVsIGJ1aWxkLiAqLworICAgIGlmIChkc3BzID09IEFfaW50X25vcm1fZW11bGF0ZWludGZseSAmJiBjbWQgJiYgY21kLT5yZXN1bHQgPT0gMikKKyAgICAgICAgZHNwcyA9IEFfaW50X2Vycl9jaGVja19jb25kaXRpb247CisjZW5kaWYKKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19JTlRSKSAKKwlwcmludGsgKCJzY3NpJWQgOiBEU1BTID0gMHgleFxuIiwgaG9zdC0+aG9zdF9ubywgZHNwcyk7CisKKyAgICBzd2l0Y2ggKGRzcHMpIHsKKyAgICBjYXNlIEFfaW50X21zZ18xOgorCXByaW50ID0gMTsKKwlzd2l0Y2ggKGhvc3RkYXRhLT5tc2dfYnVmWzBdKSB7CisJLyogCisJICogVW5sZXNzIHdlJ3ZlIGluaXRpYXRlZCBzeW5jaHJvbm91cyBuZWdvdGlhdGlvbiwgSSBkb24ndAorCSAqIHRoaW5rIHRoYXQgdGhpcyBzaG91bGQgaGFwcGVuLgorCSAqLworCWNhc2UgTUVTU0FHRV9SRUpFQ1Q6CisJICAgIGhvc3RkYXRhLT5kc3AgPSBob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfYWNjZXB0X21lc3NhZ2UgLworCQlzaXplb2YodTMyKTsKKwkgICAgaG9zdGRhdGEtPmRzcF9jaGFuZ2VkID0gMTsKKwkgICAgaWYgKGNtZCAmJiAoY21kLT5mbGFncyAmIENNRF9GTEFHX1NEVFIpKSB7CisJCXByaW50ayAoInNjc2klZCA6IHRhcmdldCAlZCByZWplY3RlZCBTRFRSXG4iLCBob3N0LT5ob3N0X25vLCAKKwkJICAgIGMtPmRldmljZS0+aWQpOworCQljbWQtPmZsYWdzICY9IH5DTURfRkxBR19TRFRSOworCQlhc3luY2hyb25vdXMgKGhvc3QsIGMtPmRldmljZS0+aWQpOworCQlwcmludCA9IDA7CisJICAgIH0gCisJICAgIGJyZWFrOworCWNhc2UgSU5JVElBVEVfUkVDT1ZFUlk6CisJICAgIHByaW50ayAoInNjc2klZCA6IGV4dGVuZGVkIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBub3Qgc3VwcG9ydGVkIHlldCwgcmVqZWN0aW5nXG4iLAorCQlob3N0LT5ob3N0X25vKTsKKwkgICAgLyogRmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQgKi8KKwkgICAgaG9zdGRhdGEtPmRzcCA9IGhvc3RkYXRhLT5zY3JpcHQgKyBob3N0ZGF0YS0+RV9yZWplY3RfbWVzc2FnZSAvCisJCXNpemVvZih1MzIpOworCSAgICBob3N0ZGF0YS0+ZHNwX2NoYW5nZWQgPSAxOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBwcmludGsgKCJzY3NpJWQgOiB1bnN1cHBvcnRlZCBtZXNzYWdlLCByZWplY3RpbmdcbiIsCisJCWhvc3QtPmhvc3Rfbm8pOworCSAgICBob3N0ZGF0YS0+ZHNwID0gaG9zdGRhdGEtPnNjcmlwdCArIGhvc3RkYXRhLT5FX3JlamVjdF9tZXNzYWdlIC8KKwkJc2l6ZW9mKHUzMik7CisJICAgIGhvc3RkYXRhLT5kc3BfY2hhbmdlZCA9IDE7CisJfQorCWlmIChwcmludCkgeworCSAgICBwcmludGsgKCJzY3NpJWQgOiByZWNlaXZlZCBtZXNzYWdlIiwgaG9zdC0+aG9zdF9ubyk7CisJICAgIGlmIChjKSAKKwkgICAgCXByaW50ayAoIiBmcm9tIHRhcmdldCAlZCBsdW4gJWQgIiwgYy0+ZGV2aWNlLT5pZCwgYy0+ZGV2aWNlLT5sdW4pOworCSAgICBwcmludF9tc2cgKCh1bnNpZ25lZCBjaGFyICopIGhvc3RkYXRhLT5tc2dfYnVmKTsKKwkgICAgcHJpbnRrKCJcbiIpOworCX0KKwkKKwlyZXR1cm4gU1BFQ0lGSUNfSU5UX05PVEhJTkc7CisKKworICAgIGNhc2UgQV9pbnRfbXNnX3NkdHI6CisvKgorICogQXQgdGhpcyBwb2ludCwgaG9zdGRhdGEtPm1zZ19idWYgY29udGFpbnMKKyAqIDAgRVhURU5ERUQgTUVTU0FHRQorICogMSBsZW5ndGggCisgKiAyIFNEVFIKKyAqIDMgcGVyaW9kICogNG5zCisgKiA0IG9mZnNldAorICovCisKKwlpZiAoY21kKSB7CisJICAgIGNoYXIgYnVmWzgwXTsKKwkgICAgc3ByaW50ZiAoYnVmLCAic2NzaSVkIDogdGFyZ2V0ICVkICVzICIsIGhvc3QtPmhvc3Rfbm8sIGMtPmRldmljZS0+aWQsCisJCShjbWQtPmZsYWdzICYgQ01EX0ZMQUdfU0RUUikgPyAiYWNjZXB0aW5nIiA6ICJyZXF1ZXN0aW5nIik7CisJICAgIHByaW50X3N5bmNocm9ub3VzIChidWYsICh1bnNpZ25lZCBjaGFyICopIGhvc3RkYXRhLT5tc2dfYnVmKTsKKworCS8qIAorCSAqIEluaXRpYXRvciBpbml0aWF0ZWQsIHdvbid0IGhhcHBlbiB1bmxlc3Mgc3luY2hyb25vdXMgCisJICogCXRyYW5zZmVycyBhcmUgZW5hYmxlZC4gIElmIHdlIGdldCBhIFNEVFIgbWVzc2FnZSBpbgorCSAqIAlyZXNwb25zZSB0byBvdXIgU0RUUiwgd2Ugc2hvdWxkIHByb2dyYW0gb3VyIHBhcmFtZXRlcnMKKwkgKiAJc3VjaCB0aGF0IAorCSAqCQlvZmZzZXQgPD0gcmVxdWVzdGVkIG9mZnNldAorCSAqCQlwZXJpb2QgPj0gcmVxdWVzdGVkIHBlcmlvZAkJIAkKKyAgIAkgKi8KKwkgICAgaWYgKGNtZC0+ZmxhZ3MgJiBDTURfRkxBR19TRFRSKSB7CisJCWNtZC0+ZmxhZ3MgJj0gfkNNRF9GTEFHX1NEVFI7IAorCQlpZiAoaG9zdGRhdGEtPm1zZ19idWZbNF0pIAorCQkgICAgc3luY2hyb25vdXMgKGhvc3QsIGMtPmRldmljZS0+aWQsICh1bnNpZ25lZCBjaGFyICopIAorCQkgICAgCWhvc3RkYXRhLT5tc2dfYnVmKTsKKwkJZWxzZSAKKwkJICAgIGFzeW5jaHJvbm91cyAoaG9zdCwgYy0+ZGV2aWNlLT5pZCk7CisJCWhvc3RkYXRhLT5kc3AgPSBob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfYWNjZXB0X21lc3NhZ2UgLworCQkgICAgc2l6ZW9mKHUzMik7CisJCWhvc3RkYXRhLT5kc3BfY2hhbmdlZCA9IDE7CisJCXJldHVybiBTUEVDSUZJQ19JTlRfTk9USElORzsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX1NZTkNIUk9OT1VTKSAgeworCQkgICAgY21kLT5mbGFncyB8PSBDTURfRkxBR19ESURfU0RUUjsKKwkJICAgIHN5bmNocm9ub3VzIChob3N0LCBjLT5kZXZpY2UtPmlkLCAodW5zaWduZWQgY2hhciAqKSAKKwkJCWhvc3RkYXRhLT5tc2dfYnVmKTsKKwkJfSBlbHNlIHsKKwkJICAgIGhvc3RkYXRhLT5tc2dfYnVmWzRdID0gMDsJCS8qIDAgb2Zmc2V0ID0gYXN5bmMgKi8KKwkJICAgIGFzeW5jaHJvbm91cyAoaG9zdCwgYy0+ZGV2aWNlLT5pZCk7CisJCX0KKwkJcGF0Y2hfZHNhXzMyIChjbWQtPmRzYSwgZHNhX21zZ291dF9vdGhlciwgMCwgNSk7CisJCXBhdGNoX2RzYV8zMiAoY21kLT5kc2EsIGRzYV9tc2dvdXRfb3RoZXIsIDEsICh1MzIpIAorCQkgICAgdmlydF90b19idXMgKCh2b2lkICopJmhvc3RkYXRhLT5tc2dfYnVmKSk7CisJCWhvc3RkYXRhLT5kc3AgPSBob3N0ZGF0YS0+c2NyaXB0ICsgCisJCSAgICBob3N0ZGF0YS0+RV9yZXNwb25kX21lc3NhZ2UgLyBzaXplb2YodTMyKTsKKwkJaG9zdGRhdGEtPmRzcF9jaGFuZ2VkID0gMTsKKwkgICAgfQorCSAgICByZXR1cm4gU1BFQ0lGSUNfSU5UX05PVEhJTkc7CisJfQorCS8qIEZhbGwgdGhyb3VnaCB0byBhYm9ydCBpZiB3ZSBjb3VsZG4ndCBmaW5kIGEgY21kLCBhbmQgCisJICAgdGhlcmVmb3JlIGEgZHNhIHN0cnVjdHVyZSB0byB0d2lkZGxlICovCisgICAgY2FzZSBBX2ludF9tc2dfd2R0cjoKKwlob3N0ZGF0YS0+ZHNwID0gaG9zdGRhdGEtPnNjcmlwdCArIGhvc3RkYXRhLT5FX3JlamVjdF9tZXNzYWdlIC8KKwkgICAgc2l6ZW9mKHUzMik7CisJaG9zdGRhdGEtPmRzcF9jaGFuZ2VkID0gMTsKKwlyZXR1cm4gU1BFQ0lGSUNfSU5UX05PVEhJTkc7CisgICAgY2FzZSBBX2ludF9lcnJfdW5leHBlY3RlZF9waGFzZToKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfSU5UUikgCisJICAgIHByaW50ayAoInNjc2klZCA6IHVuZXhwZWN0ZWQgcGhhc2VcbiIsIGhvc3QtPmhvc3Rfbm8pOworCXJldHVybiBTUEVDSUZJQ19JTlRfQUJPUlQ7CisgICAgY2FzZSBBX2ludF9lcnJfc2VsZWN0ZWQ6CisJaWYgKChob3N0ZGF0YS0+Y2hpcCAvIDEwMCkgPT0gOCkKKwkgICAgcHJpbnRrICgic2NzaSVkIDogc2VsZWN0ZWQgYnkgdGFyZ2V0ICVkXG4iLCBob3N0LT5ob3N0X25vLAorCSAgICAgICAgKGludCkgTkNSNTNjN3gwX3JlYWQ4KFNESURfUkVHXzgwMCkgJjcpOworCWVsc2UKKyAgICAgICAgICAgIHByaW50ayAoInNjc2klZCA6IHNlbGVjdGVkIGJ5IHRhcmdldCBMQ1JDPTB4JTAyeFxuIiwgaG9zdC0+aG9zdF9ubywKKyAgICAgICAgICAgICAgICAoaW50KSBOQ1I1M2M3eDBfcmVhZDgoTENSQ19SRUdfMTApKTsKKwlob3N0ZGF0YS0+ZHNwID0gaG9zdGRhdGEtPnNjcmlwdCArIGhvc3RkYXRhLT5FX3RhcmdldF9hYm9ydCAvIAorICAgIAkgICAgc2l6ZW9mKHUzMik7CisJaG9zdGRhdGEtPmRzcF9jaGFuZ2VkID0gMTsKKwlyZXR1cm4gU1BFQ0lGSUNfSU5UX05PVEhJTkc7CisgICAgY2FzZSBBX2ludF9lcnJfdW5leHBlY3RlZF9yZXNlbGVjdDoKKwlpZiAoKGhvc3RkYXRhLT5jaGlwIC8gMTAwKSA9PSA4KQorCSAgICBwcmludGsgKCJzY3NpJWQgOiB1bmV4cGVjdGVkIHJlc2VsZWN0IGJ5IHRhcmdldCAlZCBsdW4gJWRcbiIsIAorCSAgICAgICAgaG9zdC0+aG9zdF9ubywgKGludCkgTkNSNTNjN3gwX3JlYWQ4KFNESURfUkVHXzgwMCkgJiA3LAorCSAgICAgICAgaG9zdGRhdGEtPnJlc2VsZWN0ZWRfaWRlbnRpZnkgJiA3KTsKKwllbHNlCisgICAgICAgICAgICBwcmludGsgKCJzY3NpJWQgOiB1bmV4cGVjdGVkIHJlc2VsZWN0IExDUkM9MHglMDJ4XG4iLCBob3N0LT5ob3N0X25vLAorICAgICAgICAgICAgICAgIChpbnQpIE5DUjUzYzd4MF9yZWFkOChMQ1JDX1JFR18xMCkpOworCWhvc3RkYXRhLT5kc3AgPSBob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfaW5pdGlhdG9yX2Fib3J0IC8KKyAgICAJICAgIHNpemVvZih1MzIpOworCWhvc3RkYXRhLT5kc3BfY2hhbmdlZCA9IDE7CisJcmV0dXJuIFNQRUNJRklDX0lOVF9OT1RISU5HOworLyoKKyAqIFNpbmNlIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb25zIGFyZSBjbGVhcmVkIGJ5IHRoZSBuZXh0IAorICogY29tbWFuZCBpc3N1ZWQgdG8gYSB0YXJnZXQsIHdlIG11c3QgaXNzdWUgYSBSRVFVRVNUIFNFTlNFIAorICogY29tbWFuZCBhZnRlciByZWNlaXZpbmcgYSBDSEVDSyBDT05ESVRJT04gc3RhdHVzLCBiZWZvcmUKKyAqIGFub3RoZXIgY29tbWFuZCBpcyBpc3N1ZWQuCisgKiAKKyAqIFNpbmNlIHRoaXMgTkNSNTNjN3gwX2NtZCB3aWxsIGJlIGZyZWVkIGFmdGVyIHVzZSwgd2UgZG9uJ3QgCisgKiBjYXJlIGlmIHdlIHN0ZXAgb24gdGhlIHZhcmlvdXMgZmllbGRzLCBzbyBtb2RpZnkgYSBmZXcgdGhpbmdzLgorICovCisgICAgY2FzZSBBX2ludF9lcnJfY2hlY2tfY29uZGl0aW9uOiAKKyNpZiAwCisJaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX0lOVFIpIAorI2VuZGlmCisJICAgIHByaW50ayAoInNjc2klZCA6IENIRUNLIENPTkRJVElPTlxuIiwgaG9zdC0+aG9zdF9ubyk7CisJaWYgKCFjKSB7CisJICAgIHByaW50aygic2NzaSVkIDogQ0hFQ0sgQ09ORElUSU9OIHdpdGggbm8gU0NTSSBjb21tYW5kXG4iLAorCQlob3N0LT5ob3N0X25vKTsKKwkgICAgcmV0dXJuIFNQRUNJRklDX0lOVF9QQU5JQzsKKwl9CisKKwkvKiAKKwkgKiBGSVhNRSA6IHRoaXMgdXNlcyB0aGUgbm9ybWFsIG9uZS1ieXRlIHNlbGVjdGlvbiBtZXNzYWdlLgorCSAqIAlXZSBtYXkgd2FudCB0byByZW5lZ290aWF0ZSBmb3Igc3luY2hyb25vdXMgJiBXSURFIHRyYW5zZmVycworCSAqIAlzaW5jZSB0aGVzZSBjb3VsZCBiZSB0aGUgY3J1eCBvZiBvdXIgcHJvYmxlbS4KKwkgKgorCSBob3N0ZGF0YS0+Tk9QX2luc24qIEZJWE1FIDogb25jZSBTQ1NJLUlJIHRhZ2dlZCBxdWV1aW5nIGlzIGltcGxlbWVudGVkLCB3ZSdsbAorCSAqIAloYXZlIHRvIHNldCB0aGlzIHVwIHNvIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIERTQQorCSAqCWFncmVlcyB3aXRoIHRoaXMgYmVpbmcgYW4gdW50YWdnZWQgcXVldWUnZCBjb21tYW5kLgorCSAqLworCisgICAgCXBhdGNoX2RzYV8zMiAoY21kLT5kc2EsIGRzYV9tc2dvdXQsIDAsIDEpOworCisgICAgCS8qIAorICAgIAkgKiBNb2RpZnkgdGhlIHRhYmxlIGluZGlyZWN0IGZvciBDT01NQU5EIE9VVCBwaGFzZSwgc2luY2UgCisgICAgCSAqIFJlcXVlc3QgU2Vuc2UgaXMgYSBzaXggYnl0ZSBjb21tYW5kLgorICAgIAkgKi8KKworICAgIAlwYXRjaF9kc2FfMzIgKGNtZC0+ZHNhLCBkc2FfY21kb3V0LCAwLCA2KTsKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgQ0RCIGlzIG5vdyBtaXJyb3JlZCBpbiBvdXIgbG9jYWwgbm9uLWNhY2hlZAorICAgICAgICAgKiBzdHJ1Y3R1cmUsIGJ1dCBrZWVwIHRoZSBvbGQgc3RydWN0dXJlIHVwIHRvIGRhdGUgYXMgd2VsbCwKKyAgICAgICAgICoganVzdCBpbiBjYXNlIGFueW9uZSBsb29rcyBhdCBpdC4KKyAgICAgICAgICovCisKKwkvKgorCSAqIFhYWCBOZWVkIHRvIHdvcnJ5IGFib3V0IGRhdGEgYnVmZmVyIGFsaWdubWVudC9jYWNoZSBzdGF0ZQorCSAqIFhYWCBoZXJlLCBidXQgY3VycmVudGx5IG5ldmVyIGdldCBBX2ludF9lcnJfY2hlY2tfY29uZGl0aW9uLAorCSAqIFhYWCBzbyBpZ25vcmUgcHJvYmxlbSBmb3Igbm93LgorICAgICAgICAgKi8KKwljbWQtPmNtbmRbMF0gPSBjLT5jbW5kWzBdID0gUkVRVUVTVF9TRU5TRTsKKwljbWQtPmNtbmRbMF0gPSBjLT5jbW5kWzFdICY9IDB4ZTA7CS8qIFplcm8gYWxsIGJ1dCBMVU4gKi8KKwljbWQtPmNtbmRbMF0gPSBjLT5jbW5kWzJdID0gMDsKKwljbWQtPmNtbmRbMF0gPSBjLT5jbW5kWzNdID0gMDsKKwljbWQtPmNtbmRbMF0gPSBjLT5jbW5kWzRdID0gc2l6ZW9mKGMtPnNlbnNlX2J1ZmZlcik7CisJY21kLT5jbW5kWzBdID0gYy0+Y21uZFs1XSA9IDA7IAorCisJLyoKKwkgKiBEaXNhYmxlIGRhdGFvdXQgcGhhc2UsIGFuZCBwcm9ncmFtIGRhdGFpbiB0byB0cmFuc2ZlciB0byB0aGUgCisJICogc2Vuc2UgYnVmZmVyLCBhbmQgYWRkIGEganVtcCB0byBvdGhlcl90cmFuc2ZlciBhZnRlciB0aGUgCisgICAgCSAqIGNvbW1hbmQgc28gb3ZlcmZsb3cvdW5kZXJydW4gY29uZGl0aW9ucyBhcmUgZGV0ZWN0ZWQuCisJICovCisKKyAgICAJcGF0Y2hfZHNhXzMyIChjbWQtPmRzYSwgZHNhX2RhdGFvdXQsIDAsIAorCSAgICB2aXJ0X3RvX2J1cyhob3N0ZGF0YS0+c2NyaXB0KSArIGhvc3RkYXRhLT5FX290aGVyX3RyYW5zZmVyKTsKKyAgICAJcGF0Y2hfZHNhXzMyIChjbWQtPmRzYSwgZHNhX2RhdGFpbiwgMCwgCisJICAgIHZpcnRfdG9fYnVzKGNtZC0+ZGF0YV90cmFuc2Zlcl9zdGFydCkpOworICAgIAljbWQtPmRhdGFfdHJhbnNmZXJfc3RhcnRbMF0gPSAoKChEQ01EX1RZUEVfQk1JIHwgRENNRF9CTUlfT1BfTU9WRV9JIHwgCisgICAgCSAgICBEQ01EX0JNSV9JTykpIDw8IDI0KSB8IHNpemVvZihjLT5zZW5zZV9idWZmZXIpOworICAgIAljbWQtPmRhdGFfdHJhbnNmZXJfc3RhcnRbMV0gPSAodTMyKSB2aXJ0X3RvX2J1cyhjLT5zZW5zZV9idWZmZXIpOworCisJY21kLT5kYXRhX3RyYW5zZmVyX3N0YXJ0WzJdID0gKChEQ01EX1RZUEVfVENJIHwgRENNRF9UQ0lfT1BfSlVNUCkgCisgICAgCSAgICA8PCAyNCkgfCBEQkNfVENJX1RSVUU7CisJY21kLT5kYXRhX3RyYW5zZmVyX3N0YXJ0WzNdID0gKHUzMikgdmlydF90b19idXMoaG9zdGRhdGEtPnNjcmlwdCkgKyAKKwkgICAgaG9zdGRhdGEtPkVfb3RoZXJfdHJhbnNmZXI7CisKKyAgICAJLyoKKyAgICAJICogQ3VycmVudGx5LCB0aGlzIGNvbW1hbmQgaXMgZmxhZ2dlZCBhcyBjb21wbGV0ZWQsIGllIAorICAgIAkgKiBpdCBoYXMgdmFsaWQgc3RhdHVzIGFuZCBtZXNzYWdlIGRhdGEuICBSZWZsYWcgaXQgYXMKKyAgICAJICogaW5jb21wbGV0ZS4gIFEgLSBuZWVkIHRvIGRvIHNvbWV0aGluZyBzbyB0aGF0IG9yaWdpbmFsCisJICogc3RhdHVzLCBldGMgYXJlIHVzZWQuCisgICAgCSAqLworCisJY21kLT5yZXN1bHQgPSBjbWQtPmNtZC0+cmVzdWx0ID0gMHhmZmZmOwkJCisKKwkvKiAKKwkgKiBSZXN0YXJ0IGNvbW1hbmQgYXMgYSBSRVFVRVNUIFNFTlNFLgorCSAqLworCWhvc3RkYXRhLT5kc3AgPSAodTMyICopIGhvc3RkYXRhLT5zY3JpcHQgKyBob3N0ZGF0YS0+RV9zZWxlY3QgLworCSAgICBzaXplb2YodTMyKTsKKwlob3N0ZGF0YS0+ZHNwX2NoYW5nZWQgPSAxOworCXJldHVybiBTUEVDSUZJQ19JTlRfTk9USElORzsKKyAgICBjYXNlIEFfaW50X2RlYnVnX2JyZWFrOgorCXJldHVybiBTUEVDSUZJQ19JTlRfQlJFQUs7CisgICAgY2FzZSBBX2ludF9ub3JtX2Fib3J0ZWQ6CisJaG9zdGRhdGEtPmRzcCA9ICh1MzIgKikgaG9zdGRhdGEtPnNjaGVkdWxlOworCWhvc3RkYXRhLT5kc3BfY2hhbmdlZCA9IDE7CisJaWYgKGNtZCkKKwkgICAgYWJub3JtYWxfZmluaXNoZWQgKGNtZCwgRElEX0VSUk9SIDw8IDE2KTsKKwlyZXR1cm4gU1BFQ0lGSUNfSU5UX05PVEhJTkc7CisgICAgY2FzZSBBX2ludF9ub3JtX2VtdWxhdGVpbnRmbHk6CisJTkNSNTNjN3gwX2ludGZseShob3N0KTsKKwlyZXR1cm4gU1BFQ0lGSUNfSU5UX05PVEhJTkc7CisgICAgY2FzZSBBX2ludF90ZXN0XzE6CisgICAgY2FzZSBBX2ludF90ZXN0XzI6CisJaG9zdGRhdGEtPmlkbGUgPSAxOworCWhvc3RkYXRhLT50ZXN0X2NvbXBsZXRlZCA9IChkc3BzIC0gQV9pbnRfdGVzdF8xKSAvIDB4MDAwMTAwMDAgKyAxOworCWlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19JTlRSKQorCSAgICBwcmludGsoInNjc2klZCA6IHRlc3QlZCBjb21wbGV0ZVxuIiwgaG9zdC0+aG9zdF9ubywKKwkJaG9zdGRhdGEtPnRlc3RfY29tcGxldGVkKTsKKwlyZXR1cm4gU1BFQ0lGSUNfSU5UX05PVEhJTkc7CisjaWZkZWYgQV9pbnRfZGVidWdfcmVzZWxlY3RlZF9vaworICAgIGNhc2UgQV9pbnRfZGVidWdfcmVzZWxlY3RlZF9vazoKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiAoT1BUSU9OX0RFQlVHX1NDUklQVHxPUFRJT05fREVCVUdfSU5UUnwKKyAgICAJICAgIAlPUFRJT05fREVCVUdfRElTQ09OTkVDVCkpIHsKKwkgICAgLyogCisJICAgICAqIE5vdGUgLSB0aGlzIGRzYSBpcyBub3QgYmFzZWQgb24gbG9jYXRpb24gcmVsYXRpdmUgdG8gCisJICAgICAqIHRoZSBjb21tYW5kIHN0cnVjdHVyZSwgYnV0IHRvIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSAKKwkgICAgICogRFNBIHJlZ2lzdGVyIAorCSAgICAgKi8JCisJICAgIHUzMiAqZHNhOworCSAgICBkc2EgPSAodTMyICopIGJ1c190b192aXJ0IChOQ1I1M2M3eDBfcmVhZDMyKERTQV9SRUcpKTsKKworCSAgICBwcmludGsoInNjc2klZCA6IHJlc2VsZWN0ZWRfb2sgKERTQSA9IDB4JXggKHZpcnQgMHglcClcbiIsIAorCQlob3N0LT5ob3N0X25vLCBOQ1I1M2M3eDBfcmVhZDMyKERTQV9SRUcpLCBkc2EpOworCSAgICBwcmludGsoInNjc2klZCA6IHJlc3VtZSBhZGRyZXNzIGlzIDB4JXggKHZpcnQgMHglcClcbiIsCisJCSAgICBob3N0LT5ob3N0X25vLCBjbWQtPnNhdmVkX2RhdGFfcG9pbnRlciwKKwkJICAgIGJ1c190b192aXJ0KGNtZC0+c2F2ZWRfZGF0YV9wb2ludGVyKSk7CisJICAgIHByaW50X2luc24gKGhvc3QsIGhvc3RkYXRhLT5zY3JpcHQgKyBFbnRfcmVzZWxlY3RlZF9vayAvIAorICAgIAkgICAgCSAgICBzaXplb2YodTMyKSwgIiIsIDEpOworCSAgICBpZiAoKGhvc3RkYXRhLT5jaGlwIC8gMTAwKSA9PSA4KQorICAgIAkgICAgICAgIHByaW50ayAoInNjc2klZCA6IHN4ZmVyPTB4JXgsIHNjbnRsMz0weCV4XG4iLAorCQkgICAgaG9zdC0+aG9zdF9ubywgTkNSNTNjN3gwX3JlYWQ4KFNYRkVSX1JFRyksCisJCSAgICBOQ1I1M2M3eDBfcmVhZDgoU0NOVEwzX1JFR184MDApKTsKKwkgICAgZWxzZQorICAgIAkgICAgICAgIHByaW50ayAoInNjc2klZCA6IHN4ZmVyPTB4JXgsIGNhbm5vdCByZWFkIFNCQ0xcbiIsCisJCSAgICBob3N0LT5ob3N0X25vLCBOQ1I1M2M3eDBfcmVhZDgoU1hGRVJfUkVHKSk7CisJICAgIGlmIChjKSB7CisJCXByaW50X2luc24gKGhvc3QsICh1MzIgKikgCisJCSAgICBob3N0ZGF0YS0+c3luY1tjLT5kZXZpY2UtPmlkXS5zY3JpcHQsICIiLCAxKTsKKwkJcHJpbnRfaW5zbiAoaG9zdCwgKHUzMiAqKSAKKwkJICAgIGhvc3RkYXRhLT5zeW5jW2MtPmRldmljZS0+aWRdLnNjcmlwdCArIDIsICIiLCAxKTsKKwkgICAgfQorCX0KKyAgICAJcmV0dXJuIFNQRUNJRklDX0lOVF9SRVNUQVJUOworI2VuZGlmCisjaWZkZWYgQV9pbnRfZGVidWdfcmVzZWxlY3RfY2hlY2sKKyAgICBjYXNlIEFfaW50X2RlYnVnX3Jlc2VsZWN0X2NoZWNrOgorCWlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIChPUFRJT05fREVCVUdfU0NSSVBUfE9QVElPTl9ERUJVR19JTlRSKSkgeworCSAgICB1MzIgKmRzYTsKKyNpZiAwCisJICAgIHUzMiAqY29kZTsKKyNlbmRpZgorCSAgICAvKiAKKwkgICAgICogTm90ZSAtIHRoaXMgZHNhIGlzIG5vdCBiYXNlZCBvbiBsb2NhdGlvbiByZWxhdGl2ZSB0byAKKwkgICAgICogdGhlIGNvbW1hbmQgc3RydWN0dXJlLCBidXQgdG8gbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIAorCSAgICAgKiBEU0EgcmVnaXN0ZXIgCisJICAgICAqLwkKKwkgICAgZHNhID0gYnVzX3RvX3ZpcnQgKE5DUjUzYzd4MF9yZWFkMzIoRFNBX1JFRykpOworCSAgICBwcmludGsoInNjc2klZCA6IHJlc2VsZWN0ZWRfY2hlY2tfbmV4dCAoRFNBID0gMHglbHggKHZpcnQgMHglcCkpXG4iLAorCQlob3N0LT5ob3N0X25vLCB2aXJ0X3RvX2J1cyhkc2EpLCBkc2EpOworCSAgICBpZiAoZHNhKSB7CisJCXByaW50aygic2NzaSVkIDogcmVzdW1lIGFkZHJlc3MgaXMgMHgleCAodmlydCAweCVwKVxuIiwKKwkJICAgIGhvc3QtPmhvc3Rfbm8sIGNtZC0+c2F2ZWRfZGF0YV9wb2ludGVyLAorCQkgICAgYnVzX3RvX3ZpcnQgKGNtZC0+c2F2ZWRfZGF0YV9wb2ludGVyKSk7CisjaWYgMAorCQlwcmludGsoInNjc2klZCA6IHRlbXBsYXRlIGNvZGUgOlxuIiwgaG9zdC0+aG9zdF9ubyk7CisJCWZvciAoY29kZSA9IGRzYSArIChFbnRfZHNhX2NvZGVfY2hlY2tfcmVzZWxlY3QgLSBFbnRfZHNhX3plcm8pIAorCQkgICAgLyBzaXplb2YodTMyKTsgY29kZSA8IChkc2EgKyBFbnRfZHNhX3plcm8gLyBzaXplb2YodTMyKSk7IAorCQkgICAgY29kZSArPSBwcmludF9pbnNuIChob3N0LCBjb2RlLCAiIiwgMSkpOworI2VuZGlmCisJICAgIH0KKwkgICAgcHJpbnRfaW5zbiAoaG9zdCwgaG9zdGRhdGEtPnNjcmlwdCArIEVudF9yZXNlbGVjdGVkX29rIC8gCisgICAgCSAgICAJICAgIHNpemVvZih1MzIpLCAiIiwgMSk7CisJfQorICAgIAlyZXR1cm4gU1BFQ0lGSUNfSU5UX1JFU1RBUlQ7CisjZW5kaWYKKyNpZmRlZiBBX2ludF9kZWJ1Z19kc2Ffc2NoZWR1bGUKKyAgICBjYXNlIEFfaW50X2RlYnVnX2RzYV9zY2hlZHVsZToKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiAoT1BUSU9OX0RFQlVHX1NDUklQVHxPUFRJT05fREVCVUdfSU5UUikpIHsKKwkgICAgdTMyICpkc2E7CisJICAgIC8qIAorCSAgICAgKiBOb3RlIC0gdGhpcyBkc2EgaXMgbm90IGJhc2VkIG9uIGxvY2F0aW9uIHJlbGF0aXZlIHRvIAorCSAgICAgKiB0aGUgY29tbWFuZCBzdHJ1Y3R1cmUsIGJ1dCB0byBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgCisJICAgICAqIERTQSByZWdpc3RlciAKKwkgICAgICovCQorCSAgICBkc2EgPSAodTMyICopIGJ1c190b192aXJ0IChOQ1I1M2M3eDBfcmVhZDMyKERTQV9SRUcpKTsKKwkgICAgcHJpbnRrKCJzY3NpJWQgOiBkc2Ffc2NoZWR1bGUgKG9sZCBEU0EgPSAweCVseCAodmlydCAweCVwKSlcbiIsIAorCQlob3N0LT5ob3N0X25vLCB2aXJ0X3RvX2J1cyhkc2EpLCBkc2EpOworCSAgICBpZiAoZHNhKSAKKwkJcHJpbnRrKCJzY3NpJWQgOiByZXN1bWUgYWRkcmVzcyBpcyAweCV4ICh2aXJ0IDB4JXApXG4iCisJCSAgICAgICAiICAgICAgICAgKHRlbXAgd2FzIDB4JXggKHZpcnQgMHglcCkpXG4iLAorCQkgICAgaG9zdC0+aG9zdF9ubywgY21kLT5zYXZlZF9kYXRhX3BvaW50ZXIsCisJCSAgICBidXNfdG9fdmlydCAoY21kLT5zYXZlZF9kYXRhX3BvaW50ZXIpLAorCQkgICAgTkNSNTNjN3gwX3JlYWQzMiAoVEVNUF9SRUcpLAorCQkgICAgYnVzX3RvX3ZpcnQgKE5DUjUzYzd4MF9yZWFkMzIoVEVNUF9SRUcpKSk7CisJfQorICAgIAlyZXR1cm4gU1BFQ0lGSUNfSU5UX1JFU1RBUlQ7CisjZW5kaWYKKyNpZmRlZiBBX2ludF9kZWJ1Z19zY2hlZHVsZWQKKyAgICBjYXNlIEFfaW50X2RlYnVnX3NjaGVkdWxlZDoKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiAoT1BUSU9OX0RFQlVHX1NDUklQVHxPUFRJT05fREVCVUdfSU5UUikpIHsKKwkgICAgcHJpbnRrKCJzY3NpJWQgOiBuZXcgSS9PIDB4JXggKHZpcnQgMHglcCkgc2NoZWR1bGVkXG4iLCAKKwkJaG9zdC0+aG9zdF9ubywgTkNSNTNjN3gwX3JlYWQzMihEU0FfUkVHKSwKKwkgICAgCWJ1c190b192aXJ0KE5DUjUzYzd4MF9yZWFkMzIoRFNBX1JFRykpKTsKKwl9CisJcmV0dXJuIFNQRUNJRklDX0lOVF9SRVNUQVJUOworI2VuZGlmCisjaWZkZWYgQV9pbnRfZGVidWdfaWRsZQorICAgIGNhc2UgQV9pbnRfZGVidWdfaWRsZToKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiAoT1BUSU9OX0RFQlVHX1NDUklQVHxPUFRJT05fREVCVUdfSU5UUikpIHsKKwkgICAgcHJpbnRrKCJzY3NpJWQgOiBpZGxlXG4iLCBob3N0LT5ob3N0X25vKTsKKwl9CisJcmV0dXJuIFNQRUNJRklDX0lOVF9SRVNUQVJUOworI2VuZGlmCisjaWZkZWYgQV9pbnRfZGVidWdfY21kCisgICAgY2FzZSBBX2ludF9kZWJ1Z19jbWQ6CisJaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgKE9QVElPTl9ERUJVR19TQ1JJUFR8T1BUSU9OX0RFQlVHX0lOVFIpKSB7CisJICAgIHByaW50aygic2NzaSVkIDogY29tbWFuZCBzZW50XG4iKTsKKwl9CisgICAgCXJldHVybiBTUEVDSUZJQ19JTlRfUkVTVEFSVDsKKyNlbmRpZgorI2lmZGVmIEFfaW50X2RlYnVnX2RzYV9sb2FkZWQKKyAgICBjYXNlIEFfaW50X2RlYnVnX2RzYV9sb2FkZWQ6CisJaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgKE9QVElPTl9ERUJVR19TQ1JJUFR8T1BUSU9OX0RFQlVHX0lOVFIpKSB7CisJICAgIHByaW50aygic2NzaSVkIDogRFNBIGxvYWRlZCB3aXRoIDB4JXggKHZpcnQgMHglcClcbiIsIGhvc3QtPmhvc3Rfbm8sCisJCU5DUjUzYzd4MF9yZWFkMzIoRFNBX1JFRyksIAorCQlidXNfdG9fdmlydChOQ1I1M2M3eDBfcmVhZDMyKERTQV9SRUcpKSk7CisJfQorCXJldHVybiBTUEVDSUZJQ19JTlRfUkVTVEFSVDsgCisjZW5kaWYKKyNpZmRlZiBBX2ludF9kZWJ1Z19yZXNlbGVjdGVkCisgICAgY2FzZSBBX2ludF9kZWJ1Z19yZXNlbGVjdGVkOgorCWlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIChPUFRJT05fREVCVUdfU0NSSVBUfE9QVElPTl9ERUJVR19JTlRSfAorCSAgICBPUFRJT05fREVCVUdfRElTQ09OTkVDVCkpIHsKKwkgICAgaWYgKChob3N0ZGF0YS0+Y2hpcCAvIDEwMCkgPT0gOCkKKwkJcHJpbnRrKCJzY3NpJWQgOiByZXNlbGVjdGVkIGJ5IHRhcmdldCAlZCBsdW4gJWRcbiIsCisJCSAgICBob3N0LT5ob3N0X25vLCAoaW50KSBOQ1I1M2M3eDBfcmVhZDgoU0RJRF9SRUdfODAwKSAmIH4weDgwLCAKKwkJICAgIChpbnQpIGhvc3RkYXRhLT5yZXNlbGVjdGVkX2lkZW50aWZ5ICYgNyk7CisJICAgIGVsc2UKKwkJcHJpbnRrKCJzY3NpJWQgOiByZXNlbGVjdGVkIGJ5IExDUkM9MHglMDJ4IGx1biAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgaG9zdC0+aG9zdF9ubywgKGludCkgTkNSNTNjN3gwX3JlYWQ4KExDUkNfUkVHXzEwKSwKKyAgICAgICAgICAgICAgICAgICAgKGludCkgaG9zdGRhdGEtPnJlc2VsZWN0ZWRfaWRlbnRpZnkgJiA3KTsKKwkgICAgcHJpbnRfcXVldWVzKGhvc3QpOworCX0KKyAgICAJcmV0dXJuIFNQRUNJRklDX0lOVF9SRVNUQVJUOworI2VuZGlmCisjaWZkZWYgQV9pbnRfZGVidWdfZGlzY29ubmVjdF9tc2cKKyAgICBjYXNlIEFfaW50X2RlYnVnX2Rpc2Nvbm5lY3RfbXNnOgorCWlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIChPUFRJT05fREVCVUdfU0NSSVBUfE9QVElPTl9ERUJVR19JTlRSKSkgeworCSAgICBpZiAoYykKKwkJcHJpbnRrKCJzY3NpJWQgOiB0YXJnZXQgJWQgbHVuICVkIGRpc2Nvbm5lY3RpbmdcbiIsIAorCQkgICAgaG9zdC0+aG9zdF9ubywgYy0+ZGV2aWNlLT5pZCwgYy0+ZGV2aWNlLT5sdW4pOworCSAgICBlbHNlCisJCXByaW50aygic2NzaSVkIDogdW5rbm93biB0YXJnZXQgZGlzY29ubmVjdGluZ1xuIiwKKwkJICAgIGhvc3QtPmhvc3Rfbm8pOworCX0KKwlyZXR1cm4gU1BFQ0lGSUNfSU5UX1JFU1RBUlQ7CisjZW5kaWYKKyNpZmRlZiBBX2ludF9kZWJ1Z19kaXNjb25uZWN0ZWQKKyAgICBjYXNlIEFfaW50X2RlYnVnX2Rpc2Nvbm5lY3RlZDoKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiAoT1BUSU9OX0RFQlVHX1NDUklQVHxPUFRJT05fREVCVUdfSU5UUnwKKwkJT1BUSU9OX0RFQlVHX0RJU0NPTk5FQ1QpKSB7CisJICAgIHByaW50ayAoInNjc2klZCA6IGRpc2Nvbm5lY3RlZCwgbmV3IHF1ZXVlcyBhcmVcbiIsIAorCQlob3N0LT5ob3N0X25vKTsKKwkgICAgcHJpbnRfcXVldWVzKGhvc3QpOworI2lmIDAKKwkgICAgLyogTm90IHZhbGlkIG9uIG5jcjUzYzcxMCEgKi8KKyAgICAJICAgIHByaW50ayAoInNjc2klZCA6IHN4ZmVyPTB4JXgsIHNjbnRsMz0weCV4XG4iLAorCQlob3N0LT5ob3N0X25vLCBOQ1I1M2M3eDBfcmVhZDgoU1hGRVJfUkVHKSwKKwkJTkNSNTNjN3gwX3JlYWQ4KFNDTlRMM19SRUdfODAwKSk7CisjZW5kaWYKKwkgICAgaWYgKGMpIHsKKwkJcHJpbnRfaW5zbiAoaG9zdCwgKHUzMiAqKSAKKwkJICAgIGhvc3RkYXRhLT5zeW5jW2MtPmRldmljZS0+aWRdLnNjcmlwdCwgIiIsIDEpOworCQlwcmludF9pbnNuIChob3N0LCAodTMyICopIAorCQkgICAgaG9zdGRhdGEtPnN5bmNbYy0+ZGV2aWNlLT5pZF0uc2NyaXB0ICsgMiwgIiIsIDEpOworCSAgICB9CisJfQorCXJldHVybiBTUEVDSUZJQ19JTlRfUkVTVEFSVDsKKyNlbmRpZgorI2lmZGVmIEFfaW50X2RlYnVnX3BhbmljCisgICAgY2FzZSBBX2ludF9kZWJ1Z19wYW5pYzoKKwlwcmludGsoInNjc2klZCA6IGludF9kZWJ1Z19wYW5pYyByZWNlaXZlZFxuIiwgaG9zdC0+aG9zdF9ubyk7CisJcHJpbnRfbG90cyAoaG9zdCk7CisJcmV0dXJuIFNQRUNJRklDX0lOVF9QQU5JQzsKKyNlbmRpZgorI2lmZGVmIEFfaW50X2RlYnVnX3NhdmVkCisgICAgY2FzZSBBX2ludF9kZWJ1Z19zYXZlZDoKKyAgICAJaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgKE9QVElPTl9ERUJVR19TQ1JJUFR8T1BUSU9OX0RFQlVHX0lOVFJ8CisgICAgCSAgICBPUFRJT05fREVCVUdfRElTQ09OTkVDVCkpIHsKKyAgICAJICAgIHByaW50ayAoInNjc2klZCA6IHNhdmVkIGRhdGEgcG9pbnRlciAweCV4ICh2aXJ0IDB4JXApXG4iLAorICAgIAkgICAgCWhvc3QtPmhvc3Rfbm8sIGNtZC0+c2F2ZWRfZGF0YV9wb2ludGVyLAorCQlidXNfdG9fdmlydCAoY21kLT5zYXZlZF9kYXRhX3BvaW50ZXIpKTsKKyAgICAJICAgIHByaW50X3Byb2dyZXNzIChjKTsKKyAgICAJfQorICAgIAlyZXR1cm4gU1BFQ0lGSUNfSU5UX1JFU1RBUlQ7CisjZW5kaWYKKyNpZmRlZiBBX2ludF9kZWJ1Z19yZXN0b3JlZAorICAgIGNhc2UgQV9pbnRfZGVidWdfcmVzdG9yZWQ6CisgICAgCWlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIChPUFRJT05fREVCVUdfU0NSSVBUfE9QVElPTl9ERUJVR19JTlRSfAorICAgIAkgICAgT1BUSU9OX0RFQlVHX0RJU0NPTk5FQ1QpKSB7CisgICAgCSAgICBpZiAoY21kKSB7CisJCWludCBzaXplOworICAgIAkgICAgCXByaW50ayAoInNjc2klZCA6IHJlc3RvcmVkIGRhdGEgcG9pbnRlciAweCV4ICh2aXJ0IDB4JXApXG4iLAorICAgIAkgICAgCSAgICBob3N0LT5ob3N0X25vLCBjbWQtPnNhdmVkX2RhdGFfcG9pbnRlciwgYnVzX3RvX3ZpcnQgKAorCQkgICAgY21kLT5zYXZlZF9kYXRhX3BvaW50ZXIpKTsKKwkJc2l6ZSA9IHByaW50X2luc24gKGhvc3QsICh1MzIgKikgCisJCSAgICBidXNfdG9fdmlydChjbWQtPnNhdmVkX2RhdGFfcG9pbnRlciksICIiLCAxKTsKKwkJc2l6ZSA9IHByaW50X2luc24gKGhvc3QsICh1MzIgKikgCisJCSAgICBidXNfdG9fdmlydChjbWQtPnNhdmVkX2RhdGFfcG9pbnRlcikgKyBzaXplLCAiIiwgMSk7CisgICAgCSAgICAJcHJpbnRfcHJvZ3Jlc3MgKGMpOworCSAgICB9CisjaWYgMAorCSAgICBwcmludGsgKCJzY3NpJWQgOiBkYXRhcGF0aCByZXNpZHVhbCAlZFxuIiwKKwkJaG9zdC0+aG9zdF9ubywgZGF0YXBhdGhfcmVzaWR1YWwgKGhvc3QpKSA7CisjZW5kaWYKKyAgICAJfQorICAgIAlyZXR1cm4gU1BFQ0lGSUNfSU5UX1JFU1RBUlQ7CisjZW5kaWYKKyNpZmRlZiBBX2ludF9kZWJ1Z19zeW5jCisgICAgY2FzZSBBX2ludF9kZWJ1Z19zeW5jOgorICAgIAlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiAoT1BUSU9OX0RFQlVHX1NDUklQVHxPUFRJT05fREVCVUdfSU5UUnwKKyAgICAJICAgIE9QVElPTl9ERUJVR19ESVNDT05ORUNUfE9QVElPTl9ERUJVR19TRFRSKSkgeworCSAgICB1bnNpZ25lZCBjaGFyIHN4ZmVyID0gTkNSNTNjN3gwX3JlYWQ4IChTWEZFUl9SRUcpLCBzY250bDM7CisJICAgIGlmICgoaG9zdGRhdGEtPmNoaXAgLyAxMDApID09IDgpIHsKKwkJc2NudGwzID0gTkNSNTNjN3gwX3JlYWQ4IChTQ05UTDNfUkVHXzgwMCk7CisJCWlmIChjKSB7CisJCSAgaWYgKHN4ZmVyICE9IGhvc3RkYXRhLT5zeW5jW2MtPmRldmljZS0+aWRdLnN4ZmVyX3Nhbml0eSB8fAorCQkgICAgc2NudGwzICE9IGhvc3RkYXRhLT5zeW5jW2MtPmRldmljZS0+aWRdLnNjbnRsM19zYW5pdHkpIHsKKwkJICAgCXByaW50ayAoInNjc2klZCA6ICBzeW5jIHNhbml0eSBjaGVjayBmYWlsZWQgc3hmZXI9MHgleCwgc2NudGwzPTB4JXgiLAorCQkJICAgIGhvc3QtPmhvc3Rfbm8sIHN4ZmVyLCBzY250bDMpOworCQkJTkNSNTNjN3gwX3dyaXRlOCAoU1hGRVJfUkVHLCBzeGZlcik7CisJCQlOQ1I1M2M3eDBfd3JpdGU4IChTQ05UTDNfUkVHXzgwMCwgc2NudGwzKTsKKwkJICAgIH0KKwkJfSBlbHNlIAorICAgIAkgICAgCSAgcHJpbnRrICgic2NzaSVkIDogdW5rbm93biBjb21tYW5kIHN4ZmVyPTB4JXgsIHNjbnRsMz0weCV4XG4iLAorCQkgICAgaG9zdC0+aG9zdF9ubywgKGludCkgc3hmZXIsIChpbnQpIHNjbnRsMyk7CisJICAgIH0gZWxzZSB7CisJCWlmIChjKSB7CisJCSAgaWYgKHN4ZmVyICE9IGhvc3RkYXRhLT5zeW5jW2MtPmRldmljZS0+aWRdLnN4ZmVyX3Nhbml0eSkgeworCQkgICAJcHJpbnRrICgic2NzaSVkIDogIHN5bmMgc2FuaXR5IGNoZWNrIGZhaWxlZCBzeGZlcj0weCV4IiwKKwkJCSAgICBob3N0LT5ob3N0X25vLCBzeGZlcik7CisJCQlOQ1I1M2M3eDBfd3JpdGU4IChTWEZFUl9SRUcsIHN4ZmVyKTsKKwkJCU5DUjUzYzd4MF93cml0ZTggKFNCQ0xfUkVHLAorCQkJCWhvc3RkYXRhLT5zeW5jW2MtPmRldmljZS0+aWRdLnNzY2ZfNzEwKTsKKwkJICAgIH0KKwkJfSBlbHNlIAorICAgIAkgICAgCSAgcHJpbnRrICgic2NzaSVkIDogdW5rbm93biBjb21tYW5kIHN4ZmVyPTB4JXhcbiIsCisJCSAgICBob3N0LT5ob3N0X25vLCAoaW50KSBzeGZlcik7CisJICAgIH0KKwl9CisgICAgCXJldHVybiBTUEVDSUZJQ19JTlRfUkVTVEFSVDsKKyNlbmRpZgorI2lmZGVmIEFfaW50X2RlYnVnX2RhdGFpbgorCWNhc2UgQV9pbnRfZGVidWdfZGF0YWluOgorCSAgICBpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiAoT1BUSU9OX0RFQlVHX1NDUklQVHxPUFRJT05fREVCVUdfSU5UUnwKKwkJT1BUSU9OX0RFQlVHX0RJU0NPTk5FQ1R8T1BUSU9OX0RFQlVHX1NEVFIpKSB7CisJCWludCBzaXplOworCQlpZiAoKGhvc3RkYXRhLT5jaGlwIC8gMTAwKSA9PSA4KQorCQkgIHByaW50ayAoInNjc2klZCA6IEluIGRvX2RhdGFpbiAoJXMpIHN4ZmVyPTB4JXgsIHNjbnRsMz0weCV4XG4iCisJCQkiICAgICAgICAgZGF0YXBhdGggcmVzaWR1YWw9JWRcbiIsCisJCSAgICBob3N0LT5ob3N0X25vLCBzYmNsX3RvX3BoYXNlIChOQ1I1M2M3eDBfcmVhZDggKFNCQ0xfUkVHKSksCisJCSAgICAoaW50KSBOQ1I1M2M3eDBfcmVhZDgoU1hGRVJfUkVHKSwgCisJCSAgICAoaW50KSBOQ1I1M2M3eDBfcmVhZDgoU0NOVEwzX1JFR184MDApLAorCQkgICAgZGF0YXBhdGhfcmVzaWR1YWwgKGhvc3QpKSA7CisJCWVsc2UKKwkJICBwcmludGsgKCJzY3NpJWQgOiBJbiBkb19kYXRhaW4gKCVzKSBzeGZlcj0weCV4XG4iCisJCQkiICAgICAgICAgZGF0YXBhdGggcmVzaWR1YWw9JWRcbiIsCisJCSAgICBob3N0LT5ob3N0X25vLCBzYmNsX3RvX3BoYXNlIChOQ1I1M2M3eDBfcmVhZDggKFNCQ0xfUkVHKSksCisJCSAgICAoaW50KSBOQ1I1M2M3eDBfcmVhZDgoU1hGRVJfUkVHKSwgCisJCSAgICBkYXRhcGF0aF9yZXNpZHVhbCAoaG9zdCkpIDsKKwkJcHJpbnRfaW5zbiAoaG9zdCwgZHNwLCAiIiwgMSk7CisJCXNpemUgPSBwcmludF9pbnNuIChob3N0LCAodTMyICopIGJ1c190b192aXJ0KGRzcFsxXSksICIiLCAxKTsKKwkJcHJpbnRfaW5zbiAoaG9zdCwgKHUzMiAqKSBidXNfdG9fdmlydChkc3BbMV0pICsgc2l6ZSwgIiIsIDEpOworCSAgIH0gCisJcmV0dXJuIFNQRUNJRklDX0lOVF9SRVNUQVJUOworI2VuZGlmCisjaWZkZWYgQV9pbnRfZGVidWdfY2hlY2tfZHNhCisJY2FzZSBBX2ludF9kZWJ1Z19jaGVja19kc2E6CisJICAgIGlmIChOQ1I1M2M3eDBfcmVhZDggKFNDTlRMMV9SRUcpICYgU0NOVEwxX0NPTikgeworCQlpbnQgc2RpZDsKKwkJaW50IHRtcDsKKwkJY2hhciAqd2hlcmU7CisJCWlmIChob3N0ZGF0YS0+Y2hpcCAvIDEwMCA9PSA4KQorCQkgICAgc2RpZCA9IE5DUjUzYzd4MF9yZWFkOCAoU0RJRF9SRUdfODAwKSAmIDE1OworCQllbHNlIHsKKwkJICAgIHRtcCA9IE5DUjUzYzd4MF9yZWFkOCAoU0RJRF9SRUdfNzAwKTsKKwkJICAgIGlmICghdG1wKQorCQkJcGFuaWMgKCJTRElEX1JFR183MDAgPSAwIik7CisJCSAgICB0bXAgPj49IDE7CisJCSAgICBzZGlkID0gMDsKKwkJICAgIHdoaWxlICh0bXApIHsKKwkJCXRtcCA+Pj0gMTsKKwkJCXNkaWQrKzsKKwkJICAgIH0KKwkJfQorCQl3aGVyZSA9IGRzcCAtIE5DUjUzYzd4MF9pbnNuX3NpemUoTkNSNTNjN3gwX3JlYWQ4IAorCQkJKERDTURfUkVHKSkgPT0gaG9zdGRhdGEtPnNjcmlwdCArIAorCQkgICAgCUVudF9zZWxlY3RfY2hlY2tfZHNhIC8gc2l6ZW9mKHUzMikgPworCQkgICAgInNlbGVjdGlvbiIgOiAicmVzZWxlY3Rpb24iOworCQlpZiAoYyAmJiBzZGlkICE9IGMtPmRldmljZS0+aWQpIHsKKwkJICAgIHByaW50ayAoInNjc2klZCA6IFNESUQgdGFyZ2V0ICVkICE9IERTQSB0YXJnZXQgJWQgYXQgJXNcbiIsCisJCQlob3N0LT5ob3N0X25vLCBzZGlkLCBjLT5kZXZpY2UtPmlkLCB3aGVyZSk7CisJCSAgICBwcmludF9sb3RzKGhvc3QpOworCQkgICAgZHVtcF9ldmVudHMgKGhvc3QsIDIwKTsKKwkJICAgIHJldHVybiBTUEVDSUZJQ19JTlRfUEFOSUM7CisJCX0KKwkgICAgfQorCSAgICByZXR1cm4gU1BFQ0lGSUNfSU5UX1JFU1RBUlQ7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorCWlmICgoZHNwcyAmIDB4ZmYwMDAwMDApID09IDB4MDMwMDAwMDApIHsKKwkgICAgIHByaW50ayAoInNjc2klZCA6IG1pc2MgZGVidWcgaW50ZXJydXB0IDB4JXhcbiIsCisJCWhvc3QtPmhvc3Rfbm8sIGRzcHMpOworCSAgICByZXR1cm4gU1BFQ0lGSUNfSU5UX1JFU1RBUlQ7CisJfSBlbHNlIGlmICgoZHNwcyAmIDB4ZmYwMDAwMDApID09IDB4MDUwMDAwMDApIHsKKwkgICAgaWYgKGhvc3RkYXRhLT5ldmVudHMpIHsKKwkJc3RydWN0IE5DUjUzYzd4MF9ldmVudCAqZXZlbnQ7CisJCSsraG9zdGRhdGEtPmV2ZW50X2luZGV4OworCQlpZiAoaG9zdGRhdGEtPmV2ZW50X2luZGV4ID49IGhvc3RkYXRhLT5ldmVudF9zaXplKQorCQkgICAgaG9zdGRhdGEtPmV2ZW50X2luZGV4ID0gMDsKKwkJZXZlbnQgPSAoc3RydWN0IE5DUjUzYzd4MF9ldmVudCAqKSBob3N0ZGF0YS0+ZXZlbnRzICsgCisJCSAgICBob3N0ZGF0YS0+ZXZlbnRfaW5kZXg7CisJCWV2ZW50LT5ldmVudCA9IChlbnVtIG5jcl9ldmVudCkgZHNwczsKKwkJZXZlbnQtPmRzYSA9IGJ1c190b192aXJ0KE5DUjUzYzd4MF9yZWFkMzIoRFNBX1JFRykpOworCQlpZiAoTkNSNTNjN3gwX3JlYWQ4IChTQ05UTDFfUkVHKSAmIFNDTlRMMV9DT04pIHsKKwkJICAgIGlmIChob3N0ZGF0YS0+Y2hpcCAvIDEwMCA9PSA4KQorCQkJZXZlbnQtPnRhcmdldCA9IE5DUjUzYzd4MF9yZWFkOChTU0lEX1JFR184MDApOworCQkgICAgZWxzZSB7CisJCQl1bnNpZ25lZCBjaGFyIHRtcCwgc2RpZDsKKwkJICAgICAgICB0bXAgPSBOQ1I1M2M3eDBfcmVhZDggKFNESURfUkVHXzcwMCk7CisJCSAgICAgICAgaWYgKCF0bXApCisJCQkgICAgcGFuaWMgKCJTRElEX1JFR183MDAgPSAwIik7CisJCSAgICAgICAgdG1wID4+PSAxOworCQkgICAgICAgIHNkaWQgPSAwOworCQkgICAgICAgIHdoaWxlICh0bXApIHsKKwkJCSAgICB0bXAgPj49IDE7CisJCQkgICAgc2RpZCsrOworCQkgICAgICAgIH0KKwkJCWV2ZW50LT50YXJnZXQgPSBzZGlkOworCQkgICAgfQorCQl9CisJCWVsc2UgCisJCQlldmVudC0+dGFyZ2V0ID0gMjU1OworCisJCWlmIChldmVudC0+ZXZlbnQgPT0gRVZFTlRfUkVTRUxFQ1QpCisJCSAgICBldmVudC0+bHVuID0gaG9zdGRhdGEtPnJlc2VsZWN0ZWRfaWRlbnRpZnkgJiAweGY7CisJCWVsc2UgaWYgKGMpCisJCSAgICBldmVudC0+bHVuID0gYy0+ZGV2aWNlLT5sdW47CisJCWVsc2UKKwkJICAgIGV2ZW50LT5sdW4gPSAyNTU7CisJCWRvX2dldHRpbWVvZmRheSgmKGV2ZW50LT50aW1lKSk7CisJCWlmIChjKSB7CisJCSAgICBldmVudC0+cGlkID0gYy0+cGlkOworCQkgICAgbWVtY3B5ICgodm9pZCAqKSBldmVudC0+Y21uZCwgKHZvaWQgKikgYy0+Y21uZCwgCisJCQlzaXplb2YgKGV2ZW50LT5jbW5kKSk7CisJCX0gZWxzZSB7CisJCSAgICBldmVudC0+cGlkID0gLTE7CisJCX0KKwkgICAgfQorCSAgICByZXR1cm4gU1BFQ0lGSUNfSU5UX1JFU1RBUlQ7CisJfQorCisJcHJpbnRrICgic2NzaSVkIDogdW5rbm93biB1c2VyIGludGVycnVwdCAweCV4XG4iLCAKKwkgICAgaG9zdC0+aG9zdF9ubywgKHVuc2lnbmVkKSBkc3BzKTsKKwlyZXR1cm4gU1BFQ0lGSUNfSU5UX1BBTklDOworICAgIH0KK30KKworLyogCisgKiBYWFggLSB0aGUgc3RvY2sgTkNSIGFzc2VtYmxlciB3b24ndCBvdXRwdXQgdGhlIHNjcmlwdHUuaCBmaWxlLAorICogd2hpY2ggdW5kZWZpbmUncyBhbGwgI2RlZmluZSdkIENQUCBzeW1ib2xzIGZyb20gdGhlIHNjcmlwdC5oCisgKiBmaWxlLCB3aGljaCB3aWxsIGNyZWF0ZSBwcm9ibGVtcyBpZiB5b3UgdXNlIG11bHRpcGxlIHNjcmlwdHMKKyAqIHdpdGggdGhlIHNhbWUgIHN5bWJvbCBuYW1lcy4KKyAqCisgKiBJZiB5b3UgaW5zaXN0IG9uIHVzaW5nIE5DUidzIGFzc2VtYmxlciwgeW91IGNvdWxkIGdlbmVyYXRlCisgKiBzY3JpcHR1LmggZnJvbSBzY3JpcHQuaCB1c2luZyBzb21ldGhpbmcgbGlrZSAKKyAqCisgKiBncmVwICNkZWZpbmUgc2NyaXB0LmggfCBcCisgKiBzZWQgJ3MvI2RlZmluZVsgCV1bIAldKlwoW19hLXpBLVpdW19hLXpBLVowLTldKlwpLiokLyN1bmRlZmluZSBcMS8nIFwKKyAqID4gc2NyaXB0dS5oCisgKi8KKworI2luY2x1ZGUgIjUzYzd4eF91LmgiCisKKy8qIFhYWCAtIGFkZCBhbHRlcm5hdGUgc2NyaXB0IGhhbmRsaW5nIGNvZGUgaGVyZSAqLworCisKKy8qIAorICogRnVuY3Rpb24gOiBzdGF0aWMgdm9pZCBOQ1I1Mzd4eF9zb2Z0X3Jlc2V0IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQorICoKKyAqIFB1cnBvc2UgOiAgcGVyZm9ybSBhIHNvZnQgcmVzZXQgb2YgdGhlIE5DUjUzYzd4eCBjaGlwCisgKgorICogSW5wdXRzIDogaG9zdCAtIHBvaW50ZXIgdG8gdGhpcyBob3N0IGFkYXB0ZXIncyBzdHJ1Y3R1cmUKKyAqCisgKiBQcmVjb25kaXRpb25zIDogTkNSNTNjN3gwX2luaXQgbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIAorICogICAgICBob3N0LgorICogCisgKi8KKworc3RhdGljIHZvaWQgCitOQ1I1M2M3eDBfc29mdF9yZXNldCAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkgeworICAgIE5DUjUzYzd4MF9sb2NhbF9kZWNsYXJlKCk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopCisJaG9zdC0+aG9zdGRhdGFbMF07CisgICAgTkNSNTNjN3gwX2xvY2FsX3NldHVwKGhvc3QpOworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisgICAgLyogRGlzYWJsZSBzY3NpIGNoaXAgYW5kIHMvdyBsZXZlbCA3IGludHMgKi8KKworI2lmZGVmIENPTkZJR19NVk1FMTZ4CisgICAgaWYgKE1BQ0hfSVNfTVZNRTE2eCkKKyAgICB7CisgICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdjsKKworICAgICAgICB2ID0gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopMHhmZmY0MDA2YzsKKyAgICAgICAgdiAmPSB+MHg4MDAwOworICAgICAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikweGZmZjQwMDZjID0gdjsKKyAgICAgICAgdiA9ICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKTB4ZmZmNDIwMmM7CisgICAgICAgIHYgJj0gfjB4MTA7CisgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKTB4ZmZmNDIwMmMgPSB2OworICAgIH0KKyNlbmRpZgorICAgIC8qIEFueXRoaW5nIHNwZWNpZmljIGZvciB5b3VyIGhhcmR3YXJlPyAqLworCisgICAgLyoKKyAgICAgKiBEbyBhIHNvZnQgcmVzZXQgb2YgdGhlIGNoaXAgc28gdGhhdCBldmVyeXRoaW5nIGlzIAorICAgICAqIHJlaW5pdGlhbGl6ZWQgdG8gdGhlIHBvd2VyLW9uIHN0YXRlLgorICAgICAqCisgICAgICogQmFzaWNhbGx5IGZvbGxvdyB0aGUgcHJvY2VkdXJlIG91dGxpbmVkIGluIHRoZSBOQ1I1M2M3MDAKKyAgICAgKiBkYXRhIG1hbnVhbCB1bmRlciBDaGFwdGVyIFNpeCwgSG93IHRvIFVzZSwgU3RlcHMgTmVjZXNzYXJ5IHRvCisgICAgICogU3RhcnQgU0NSSVBUUywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFjdHVhbGx5IHN0YXJ0aW5nIHRoZSAKKyAgICAgKiBzY3JpcHQgYW5kIHNldHRpbmcgdXAgdGhlIHN5bmNocm9ub3VzIHRyYW5zZmVyIGd1bmsuCisgICAgICovCisKKyAgICAvKiBTaG91bGQgd2UgcmVzZXQgdGhlIHNjc2kgYnVzIGhlcmU/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ICovCisKKyAgICBOQ1I1M2M3eDBfd3JpdGU4KElTVEFUX1JFR183MDAsIElTVEFUXzEwX1NSU1QpOworICAgIE5DUjUzYzd4MF93cml0ZTgoSVNUQVRfUkVHXzcwMCwgMCk7CisKKyAgICAvKgorICAgICAqIHNhdmVkX2RjbnRsIGlzIHNldCB1cCBpbiBOQ1I1M2M3eDBfaW5pdCgpIGJlZm9yZSBpdCBpcyBvdmVyd3JpdHRlbgorICAgICAqIGhlcmUuICBXZSBzaG91bGQgaGF2ZSBzb21lIGJldHRlciB3YXkgb2Ygd29ya2luZyBvdXQgdGhlIENGIGJpdAorICAgICAqIHNldHRpbmcuLgorICAgICAqLworCisgICAgaG9zdGRhdGEtPnNhdmVkX2RjbnRsID0gRENOVExfMTBfRUF8RENOVExfMTBfQ09NOworICAgIGlmIChob3N0ZGF0YS0+c2NzaV9jbG9jayA+IDUwMDAwMDAwKQorCWhvc3RkYXRhLT5zYXZlZF9kY250bCB8PSBEQ05UTF83MDBfQ0ZfMzsKKyAgICBlbHNlCisgICAgaWYgKGhvc3RkYXRhLT5zY3NpX2Nsb2NrID4gMzc1MDAwMDApCisgICAgICAgIGhvc3RkYXRhLT5zYXZlZF9kY250bCB8PSBEQ05UTF83MDBfQ0ZfMjsKKyNpZiAwCisgICAgZWxzZQorCS8qIEFueSBjbG9ja3MgbGVzcyB0aGFuIDM3LjVNSHo/ICovCisjZW5kaWYKKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19UUkFDRSkKKyAgICAJTkNSNTNjN3gwX3dyaXRlOChEQ05UTF9SRUcsIGhvc3RkYXRhLT5zYXZlZF9kY250bCB8IERDTlRMX1NTTSk7CisgICAgZWxzZQorICAgIAlOQ1I1M2M3eDBfd3JpdGU4KERDTlRMX1JFRywgaG9zdGRhdGEtPnNhdmVkX2RjbnRsKTsKKyAgICAvKiBGb2xsb3dpbmcgZGlzYWJsZXMgc25vb3BpbmcgLSBzbm9vcGluZyBpcyBub3QgcmVxdWlyZWQsIGFzIG5vbi0KKyAgICAgKiBjYWNoZWQgcGFnZXMgYXJlIHVzZWQgZm9yIHNoYXJlZCBkYXRhLCBhbmQgYXBwcm9wcmlhdGUgdXNlIGlzCisgICAgICogbWFkZSBvZiBjYWNoZV9wdXNoL2NhY2hlX2NsZWFyLiAgSW5kZWVkLCBmb3IgNjgwNjAKKyAgICAgKiBlbmFibGluZyBzbm9vcGluZyBjYXVzZXMgZGlzayBjb3JydXB0aW9uIG9mIGV4dDJmcyBmcmVlIGJsb2NrCisgICAgICogYml0bWFwcyBhbmQgdGhlIGxpa2UuICBJZiB5b3UgaGF2ZSBhIDY4MDYwIHdpdGggc25vb3BpbmcgaGFyZHdhcmVkCisgICAgICogb24sIHRoZW4geW91IG5lZWQgdG8gZW5hYmxlIENPTkZJR18wNjBfV1JJVEVUSFJPVUdILgorICAgICAqLworICAgIE5DUjUzYzd4MF93cml0ZTgoQ1RFU1Q3X1JFRywgQ1RFU1Q3XzEwX1RUMXxDVEVTVDdfU1REKTsKKyAgICAvKiBBY3R1YWxseSBidXJzdCBvZiBlaWdodCwgYWNjb3JkaW5nIHRvIG15IDUzYzcxMCBkYXRhYm9vayAqLworICAgIE5DUjUzYzd4MF93cml0ZTgoaG9zdGRhdGEtPmRtb2RlLCBETU9ERV8xMF9CTF84IHwgRE1PREVfMTBfRkMyKTsKKyAgICBOQ1I1M2M3eDBfd3JpdGU4KFNDSURfUkVHLCAxIDw8IGhvc3QtPnRoaXNfaWQpOworICAgIE5DUjUzYzd4MF93cml0ZTgoU0JDTF9SRUcsIDApOworICAgIE5DUjUzYzd4MF93cml0ZTgoU0NOVEwxX1JFRywgU0NOVEwxX0VTUl83MDApOworICAgIE5DUjUzYzd4MF93cml0ZTgoU0NOVEwwX1JFRywgKChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9QQVJJVFkpID8gCisgICAgICAgICAgICBTQ05UTDBfRVBDIDogMCkgfCBTQ05UTDBfRVBHXzcwMCB8IFNDTlRMMF9BUkIxIHwgU0NOVEwwX0FSQjIpOworCisgICAgLyoKKyAgICAgKiBFbmFibGUgYWxsIGludGVycnVwdHMsIGV4Y2VwdCBwYXJpdHkgd2hpY2ggd2Ugb25seSB3YW50IHdoZW4KKyAgICAgKiB0aGUgdXNlciByZXF1ZXN0cyBpdC4KKyAgICAgKi8KKworICAgIE5DUjUzYzd4MF93cml0ZTgoRElFTl9SRUcsIERJRU5fNzAwX0JGIHwKKwkJRElFTl9BQlJUIHwgRElFTl9TU0kgfCBESUVOX1NJUiB8IERJRU5fNzAwX09QQyk7CisKKyAgICBOQ1I1M2M3eDBfd3JpdGU4KFNJRU5fUkVHXzcwMCwgKChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9QQVJJVFkpID8KKwkgICAgU0lFTl9QQVIgOiAwKSB8IFNJRU5fNzAwX1NUTyB8IFNJRU5fUlNUIHwgU0lFTl9VREMgfAorCQlTSUVOX1NHRSB8IFNJRU5fTUEpOworCisjaWZkZWYgQ09ORklHX01WTUUxNngKKyAgICBpZiAoTUFDSF9JU19NVk1FMTZ4KQorICAgIHsKKyAgICAgICAgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB2OworCisgICAgICAgIC8qIEVuYWJsZSBzY3NpIGNoaXAgYW5kIHMvdyBsZXZlbCA3IGludHMgKi8KKyAgICAgICAgdiA9ICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKTB4ZmZmNDAwODA7CisgICAgICAgIHYgPSAodiAmIH4oMHhmIDw8IDI4KSkgfCAoNCA8PCAyOCk7CisgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKTB4ZmZmNDAwODAgPSB2OworICAgICAgICB2ID0gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopMHhmZmY0MDA2YzsKKyAgICAgICAgdiB8PSAweDgwMDA7CisgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKTB4ZmZmNDAwNmMgPSB2OworICAgICAgICB2ID0gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopMHhmZmY0MjAyYzsKKyAgICAgICAgdiA9ICh2ICYgfjB4ZmYpIHwgMHgxMCB8IDQ7CisgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKTB4ZmZmNDIwMmMgPSB2OworICAgIH0KKyNlbmRpZgorICAgIC8qIEFueXRoaW5nIG5lZWRlZCBmb3IgeW91ciBoYXJkd2FyZT8gKi8KKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIHN0YXRpYyBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqYWxsb2NhdGVfY21kIChTY3NpX0NtbmQgKmNtZCkKKyAqIAorICogUHVycG9zZSA6IFJldHVybiB0aGUgZmlyc3QgZnJlZSBOQ1I1M2M3eDBfY21kIHN0cnVjdHVyZSAod2hpY2ggYXJlIAorICogCXJldXNlZCBpbiBhIExJRk8gbWFubmVyIHRvIG1pbmltaXplIGNhY2hlIHRocmFzaGluZykuCisgKgorICogU2lkZSBlZmZlY3RzIDogSWYgd2UgaGF2ZW4ndCB5ZXQgc2NoZWR1bGVkIGFsbG9jYXRpb24gb2YgTkNSNTNjN3gwX2NtZAorICoJc3RydWN0dXJlcyBmb3IgdGhpcyBkZXZpY2UsIGRvIHNvLiAgQXR0ZW1wdCB0byBjb21wbGV0ZSBhbGwgc2NoZWR1bGVkCisgKglhbGxvY2F0aW9ucyB1c2luZyBnZXRfemVyb2VkX3BhZ2UoKSwgcHV0dGluZyBOQ1I1M2M3eDBfY21kIHN0cnVjdHVyZXMgb24KKyAqCXRoZSBmcmVlIGxpc3QuICBUZWFjaCBwcm9ncmFtbWVycyBub3QgdG8gZHJpbmsgYW5kIGhhY2suCisgKgorICogSW5wdXRzIDogY21kIC0gU0NTSSBjb21tYW5kCisgKgorICogUmV0dXJucyA6IE5DUjUzYzd4MF9jbWQgc3RydWN0dXJlIGFsbG9jYXRlZCBvbiBiZWhhbGYgb2YgY21kOworICoJTlVMTCBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyB2b2lkCitteV9mcmVlX3BhZ2UgKHZvaWQgKmFkZHIsIGludCBkdW1teSkKK3sKKyAgICAvKiBYWFggVGhpcyBhc3N1bWVzIGRlZmF1bHQgY2FjaGUgbW9kZSB0byBiZSBJT01BUF9GVUxMX0NBQ0hJTkcsIHdoaWNoCisgICAgICogWFhYIG1heSBiZSBpbnZhbGlkIChDT05GSUdfMDYwX1dSSVRFVEhST1VHSCkKKyAgICAgKi8KKyAgICBrZXJuZWxfc2V0X2NhY2hlbW9kZSgodm9pZCAqKWFkZHIsIDQwOTYsIElPTUFQX0ZVTExfQ0FDSElORyk7CisgICAgZnJlZV9wYWdlICgodTMyKWFkZHIpOworfQorCitzdGF0aWMgc3RydWN0IE5DUjUzYzd4MF9jbWQgKgorYWxsb2NhdGVfY21kIChTY3NpX0NtbmQgKmNtZCkgeworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjbWQtPmRldmljZS0+aG9zdDsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSA9IAorCShzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhWzBdOworICAgIHUzMiByZWFsOwkJCS8qIFJlYWwgYWRkcmVzcyAqLworICAgIGludCBzaXplOwkJCS8qIFNpemUgb2YgKnRtcCAqLworICAgIHN0cnVjdCBOQ1I1M2M3eDBfY21kICp0bXA7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19BTExPQ0FUSU9OKQorCXByaW50ayAoInNjc2klZCA6IG51bV9jbWRzID0gJWQsIGNhbl9xdWV1ZSA9ICVkXG4iCisJCSIgICAgICAgICB0YXJnZXQgPSAlZCwgbHVuID0gJWQsICVzXG4iLAorCSAgICBob3N0LT5ob3N0X25vLCBob3N0ZGF0YS0+bnVtX2NtZHMsIGhvc3QtPmNhbl9xdWV1ZSwKKwkgICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLCAoaG9zdGRhdGEtPmNtZF9hbGxvY2F0ZWRbY21kLT5kZXZpY2UtPmlkXSAmCisJCSgxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pKSA/ICJhbHJlYWR5IGFsbG9jYXRlZCIgOiAibm90IGFsbG9jYXRlZCIpOworCisvKgorICogSWYgd2UgaGF2ZSBub3QgeWV0IHJlc2VydmVkIGNvbW1hbmRzIGZvciB0aGlzIElfVF9MIG5leHVzLCBhbmQKKyAqIHRoZSBkZXZpY2UgZXhpc3RzIChhcyBpbmRpY2F0ZWQgYnkgcGVybWFuZW50IFNjc2lfQ21uZCBzdHJ1Y3R1cmVzCisgKiBiZWluZyBhbGxvY2F0ZWQgdW5kZXIgMS4zLngsIG9yIGJlaW5nIG91dHNpZGUgb2Ygc2Nhbl9zY3NpcyBpbgorICogMS4yLngpLCBkbyBzbyBub3cuCisgKi8KKyAgICBpZiAoIShob3N0ZGF0YS0+Y21kX2FsbG9jYXRlZFtjbWQtPmRldmljZS0+aWRdICYgKDEgPDwgY21kLT5kZXZpY2UtPmx1bikpICYmCisJCQkJY21kLT5kZXZpY2UgJiYgY21kLT5kZXZpY2UtPmhhc19jbWRibG9ja3MpIHsKKyAgICAgIGlmICgoaG9zdGRhdGEtPmV4dHJhX2FsbG9jYXRlICsgaG9zdGRhdGEtPm51bV9jbWRzKSA8IGhvc3QtPmNhbl9xdWV1ZSkKKyAgICAgICAgICBob3N0ZGF0YS0+ZXh0cmFfYWxsb2NhdGUgKz0gaG9zdC0+Y21kX3Blcl9sdW47CisgICAgICBob3N0ZGF0YS0+Y21kX2FsbG9jYXRlZFtjbWQtPmRldmljZS0+aWRdIHw9ICgxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworICAgIH0KKworICAgIGZvciAoOyBob3N0ZGF0YS0+ZXh0cmFfYWxsb2NhdGUgPiAwIDsgLS1ob3N0ZGF0YS0+ZXh0cmFfYWxsb2NhdGUsIAorICAgIAkrK2hvc3RkYXRhLT5udW1fY21kcykgeworICAgIC8qIGhpc3RvcmljYWxseSwga21hbGxvYyBoYXMgcmV0dXJuZWQgdW5hbGlnbmVkIGFkZHJlc3NlczsgcGFkIHNvIHdlCisgICAgICAgaGF2ZSBlbm91Z2ggcm9vbSB0byBST1VORFVQICovCisJc2l6ZSA9IGhvc3RkYXRhLT5tYXhfY21kX3NpemUgKyBzaXplb2YgKHZvaWQgKik7CisjaWZkZWYgRk9SQ0VfRFNBX0FMSUdOTUVOVAorCS8qCisJICogNTNjNzEwIHJldi4wIGRvZXNuJ3QgaGF2ZSBhbiBhZGQtd2l0aC1jYXJyeSBpbnN0cnVjdGlvbi4KKwkgKiBFbnN1cmUgd2UgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSB0byBmb3JjZSBhbGlnbm1lbnQuCisJICovCisJc2l6ZSArPSAyNTY7CisjZW5kaWYKKy8qIEZJWE1FOiBmb3IgSVNBIGJ1cyAnN3h4IGNoaXBzLCB3ZSBuZWVkIHRvIG9yIEdGUF9ETUEgaW4gaGVyZSAqLworCisgICAgICAgIGlmIChzaXplID4gNDA5NikgeworICAgICAgICAgICAgcHJpbnRrIChLRVJOX0VSUiAiNTNjN3h4OiBhbGxvY2F0ZV9jbWQgc2l6ZSA+IDRLXG4iKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorICAgICAgICByZWFsID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOworICAgICAgICBpZiAocmVhbCA9PSAwKQorICAgICAgICAJcmV0dXJuIE5VTEw7CisgICAgICAgIG1lbXNldCgodm9pZCAqKXJlYWwsIDAsIDQwOTYpOworICAgICAgICBjYWNoZV9wdXNoKHZpcnRfdG9fcGh5cygodm9pZCAqKXJlYWwpLCA0MDk2KTsKKyAgICAgICAgY2FjaGVfY2xlYXIodmlydF90b19waHlzKCh2b2lkICopcmVhbCksIDQwOTYpOworICAgICAgICBrZXJuZWxfc2V0X2NhY2hlbW9kZSgodm9pZCAqKXJlYWwsIDQwOTYsIElPTUFQX05PQ0FDSEVfU0VSKTsKKwl0bXAgPSBST1VORFVQKHJlYWwsIHZvaWQgKik7CisjaWZkZWYgRk9SQ0VfRFNBX0FMSUdOTUVOVAorCXsKKwkgICAgaWYgKCgodTMyKXRtcCAmIDB4ZmYpID4gQ21kUGFnZVN0YXJ0KQorCQl0bXAgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikoKHUzMil0bXAgKyAyNTUpOworCSAgICB0bXAgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikoKCh1MzIpdG1wICYgfjB4ZmYpICsgQ21kUGFnZVN0YXJ0KTsKKyNpZiAwCisJICAgIHByaW50ayAoInNjc2k6IHNpemUgPSAlZCwgcmVhbCA9IDB4JTA4eCwgdG1wIHNldCB0byAweCUwOHhcbiIsCisJCQlzaXplLCByZWFsLCAodTMyKXRtcCk7CisjZW5kaWYKKwl9CisjZW5kaWYKKwl0bXAtPnJlYWwgPSAodm9pZCAqKXJlYWw7CisJdG1wLT5zaXplID0gc2l6ZTsJCQkKKwl0bXAtPmZyZWUgPSAoKHZvaWQgKCopKHZvaWQgKiwgaW50KSkgbXlfZnJlZV9wYWdlKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdG1wLT5uZXh0ID0gaG9zdGRhdGEtPmZyZWU7CisJaG9zdGRhdGEtPmZyZWUgPSB0bXA7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIH0KKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgdG1wID0gKHN0cnVjdCBOQ1I1M2M3eDBfY21kICopIGhvc3RkYXRhLT5mcmVlOworICAgIGlmICh0bXApIHsKKwlob3N0ZGF0YS0+ZnJlZSA9IHRtcC0+bmV4dDsKKyAgICB9CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIGlmICghdG1wKQorCXByaW50ayAoInNjc2klZCA6IGNhbid0IGFsbG9jYXRlIGNvbW1hbmQgZm9yIHRhcmdldCAlZCBsdW4gJWRcbiIsCisJICAgIGhvc3QtPmhvc3Rfbm8sIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisgICAgcmV0dXJuIHRtcDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHN0YXRpYyBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqY3JlYXRlX2NtZCAoU2NzaV9DbW5kICpjbWQpIAorICoKKyAqCisgKiBQdXJwb3NlIDogYWxsb2NhdGUgYSBOQ1I1M2M3eDBfY21kIHN0cnVjdHVyZSwgaW5pdGlhbGl6ZSBpdCBiYXNlZCBvbiB0aGUgCisgKiAJU2NzaV9DbW5kIHN0cnVjdHVyZSBwYXNzZWQgaW4gY21kLCBpbmNsdWRpbmcgZHNhIGFuZCBMaW51eCBmaWVsZCAKKyAqIAlpbml0aWFsaXphdGlvbiwgYW5kIGRzYSBjb2RlIHJlbG9jYXRpb24uCisgKgorICogSW5wdXRzIDogY21kIC0gU0NTSSBjb21tYW5kCisgKgorICogUmV0dXJucyA6IE5DUjUzYzd4MF9jbWQgc3RydWN0dXJlIGNvcnJlc3BvbmRpbmcgdG8gY21kLAorICoJTlVMTCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgc3RydWN0IE5DUjUzYzd4MF9jbWQgKgorY3JlYXRlX2NtZCAoU2NzaV9DbW5kICpjbWQpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjbWQtPmRldmljZS0+aG9zdDsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopCisgICAgICAgIGhvc3QtPmhvc3RkYXRhWzBdOwkKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqdG1wOyAJLyogTkNSNTNjN3gwX2NtZCBzdHJ1Y3R1cmUgZm9yIHRoaXMgY29tbWFuZCAqLworICAgIGludCBkYXRhaW4sICAJCS8qIE51bWJlciBvZiBpbnN0cnVjdGlvbnMgcGVyIHBoYXNlICovCisJZGF0YW91dDsKKyAgICBpbnQgZGF0YV90cmFuc2Zlcl9pbnN0cnVjdGlvbnMsIC8qIENvdW50IG9mIGR5bmFtaWMgaW5zdHJ1Y3Rpb25zICovCisgICAgCWk7CQkJLyogQ291bnRlciAqLworICAgIHUzMiAqY21kX2RhdGFpbiwJCS8qIEFkZHJlc3Mgb2YgZGF0YWluL2RhdGFvdXQgY29kZSAqLworCSpjbWRfZGF0YW91dDsJCS8qIEluY3JlbWVudGVkIGFzIHdlIGFzc2VtYmxlICovCisjaWZkZWYgbm90eWV0CisgICAgdW5zaWduZWQgY2hhciAqbXNncHRyOwkvKiBDdXJyZW50IGJ5dGUgaW4gc2VsZWN0IG1lc3NhZ2UgKi8KKyAgICBpbnQgbXNnbGVuOwkJCS8qIExlbmd0aCBvZiB3aG9sZSBzZWxlY3QgbWVzc2FnZSAqLworI2VuZGlmCisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICB1MzIgZXhwX3NlbGVjdF9pbmRpcmVjdDsJLyogVXNlZCBpbiBzYW5pdHkgY2hlY2sgKi8KKyAgICBOQ1I1M2M3eDBfbG9jYWxfc2V0dXAoY21kLT5kZXZpY2UtPmhvc3QpOworCisgICAgaWYgKCEodG1wID0gYWxsb2NhdGVfY21kIChjbWQpKSkKKwlyZXR1cm4gTlVMTDsKKworICAgIC8qCisgICAgICogQ29weSBDREIgYW5kIGluaXRpYWxpc2VkIHJlc3VsdCBmaWVsZHMgZnJvbSBTY3NpX0NtbmQgdG8gTkNSNTNjN3gwX2NtZC4KKyAgICAgKiBXZSBkbyB0aGlzIGJlY2F1c2UgTkNSNTNjN3gwX2NtZCBtYXkgaGF2ZSBhIHNwZWNpYWwgY2FjaGUgbW9kZQorICAgICAqIHNlbGVjdGVkIHRvIGNvcGUgd2l0aCBsYWNrIG9mIGJ1cyBzbm9vcGluZywgZXRjLgorICAgICAqLworCisgICAgbWVtY3B5KHRtcC0+Y21uZCwgY21kLT5jbW5kLCAxMik7CisgICAgdG1wLT5yZXN1bHQgPSBjbWQtPnJlc3VsdDsKKworICAgIC8qCisgICAgICogRGVjaWRlIHdoZXRoZXIgd2UgbmVlZCB0byBnZW5lcmF0ZSBjb21tYW5kcyBmb3IgREFUQSBJTiwKKyAgICAgKiBEQVRBIE9VVCwgbmVpdGhlciwgb3IgYm90aCBiYXNlZCBvbiB0aGUgU0NTSSBjb21tYW5kIAorICAgICAqLworCisgICAgc3dpdGNoIChjbWQtPmNtbmRbMF0pIHsKKyAgICAvKiBUaGVzZSBjb21tYW5kcyBkbyBEQVRBIElOICovCisgICAgY2FzZSBJTlFVSVJZOgorICAgIGNhc2UgTU9ERV9TRU5TRToKKyAgICBjYXNlIFJFQURfNjoKKyAgICBjYXNlIFJFQURfMTA6CisgICAgY2FzZSBSRUFEX0NBUEFDSVRZOgorICAgIGNhc2UgUkVRVUVTVF9TRU5TRToKKyAgICBjYXNlIFJFQURfQkxPQ0tfTElNSVRTOgorICAgIGNhc2UgUkVBRF9UT0M6CisJZGF0YWluID0gMiAqIChjbWQtPnVzZV9zZyA/IGNtZC0+dXNlX3NnIDogMSkgKyAzOworICAgIAlkYXRhb3V0ID0gMDsKKwlicmVhazsKKyAgICAvKiBUaGVzZSBjb21tYW5kcyBkbyBEQVRBIE9VVCAqLworICAgIGNhc2UgTU9ERV9TRUxFQ1Q6IAorICAgIGNhc2UgV1JJVEVfNjoKKyAgICBjYXNlIFdSSVRFXzEwOgorI2lmIDAKKwlwcmludGsoInNjc2klZCA6IGNvbW1hbmQgaXMgIiwgaG9zdC0+aG9zdF9ubyk7CisJcHJpbnRfY29tbWFuZChjbWQtPmNtbmQpOworI2VuZGlmCisjaWYgMAorCXByaW50ayAoInNjc2klZCA6ICVkIHNjYXR0ZXIvZ2F0aGVyIHNlZ21lbnRzXG4iLCBob3N0LT5ob3N0X25vLAorCSAgICBjbWQtPnVzZV9zZyk7CisjZW5kaWYKKyAgICAJZGF0YWluID0gMDsKKwlkYXRhb3V0ID0gMiAqIChjbWQtPnVzZV9zZyA/IGNtZC0+dXNlX3NnIDogMSkgKyAzOworI2lmIDAKKwlob3N0ZGF0YS0+b3B0aW9ucyB8PSBPUFRJT05fREVCVUdfSU5UUjsKKyNlbmRpZgorCWJyZWFrOworICAgIC8qIAorICAgICAqIFRoZXNlIGNvbW1hbmRzIGRvIG5vIGRhdGEgdHJhbnNmZXIsIHdlIHNob3VsZCBmb3JjZSBhbgorICAgICAqIGludGVycnVwdCBpZiBhIGRhdGEgcGhhc2UgaXMgYXR0ZW1wdGVkIG9uIHRoZW0uCisgICAgICovCisgICAgY2FzZSBURVNUX1VOSVRfUkVBRFk6CisgICAgY2FzZSBBTExPV19NRURJVU1fUkVNT1ZBTDoKKyAgICBjYXNlIFNUQVJUX1NUT1A6CisgICAgCWRhdGFpbiA9IGRhdGFvdXQgPSAwOworCWJyZWFrOworICAgIC8qCisgICAgICogV2UgZG9uJ3Qga25vdyBhYm91dCB0aGVzZSBjb21tYW5kcywgc28gZ2VuZXJhdGUgY29kZSB0byBoYW5kbGUKKyAgICAgKiBib3RoIERBVEEgSU4gYW5kIERBVEEgT1VUIHBoYXNlcy4gIE1vcmUgZWZmaWNpZW50IHRvIGlkZW50aWZ5IHRoZW0KKyAgICAgKiBhbmQgYWRkIHRoZW0gdG8gdGhlIGFib3ZlIGNhc2VzLgorICAgICAqLworICAgIGRlZmF1bHQ6CisJcHJpbnRrKCJzY3NpJWQgOiBkYXRhaW4rZGF0YW91dCBmb3IgY29tbWFuZCAiLCBob3N0LT5ob3N0X25vKTsKKwlwcmludF9jb21tYW5kKGNtZC0+Y21uZCk7CisJZGF0YWluID0gZGF0YW91dCA9IDIgKiAoY21kLT51c2Vfc2cgPyBjbWQtPnVzZV9zZyA6IDEpICsgMzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5ldyBjb2RlIDogc28gdGhhdCBhY3RpdmUgcG9pbnRlcnMgd29yayBjb3JyZWN0bHkgcmVnYXJkbGVzcworICAgICAqIAlvZiB3aGVyZSB0aGUgc2F2ZWQgZGF0YSBwb2ludGVyIGlzIGF0LCB3ZSB3YW50IHRvIGltbWVkaWF0ZWx5CisgICAgICogCWVudGVyIHRoZSBkeW5hbWljIGNvZGUgYWZ0ZXIgc2VsZWN0aW9uLCBhbmQgb24gYSBub24tZGF0YQorICAgICAqIAlwaGFzZSBwZXJmb3JtIGEgQ0FMTCB0byB0aGUgbm9uLWRhdGEgcGhhc2UgaGFuZGxlciwgd2l0aAorICAgICAqIAlyZXR1cm5zIGJhY2sgdG8gdGhpcyBhZGRyZXNzLgorICAgICAqCisgICAgICogCUlmIGEgcGhhc2UgbWlzbWF0Y2ggaXMgZW5jb3VudGVyZWQgaW4gdGhlIG1pZGRsZSBvZiBhIAorICAgICAqIAlCbG9jayBNT1ZFIGluc3RydWN0aW9uLCB3ZSB3YW50IHRvIF9sZWF2ZV8gdGhhdCBpbnN0cnVjdGlvbgorICAgICAqCXVuY2hhbmdlZCBhcyB0aGUgY3VycmVudCBjYXNlIGlzLCBtb2RpZnkgYSB0ZW1wb3JhcnkgYnVmZmVyLAorICAgICAqCWFuZCBwb2ludCB0aGUgYWN0aXZlIHBvaW50ZXIgKFRFTVApIGF0IHRoYXQuCisgICAgICoKKyAgICAgKiAJRnVydGhlcm1vcmUsIHdlIHdhbnQgdG8gaW1wbGVtZW50IGEgc2F2ZWQgZGF0YSBwb2ludGVyLCAKKyAgICAgKiAJc2V0IGJ5IHRoZSBTQVZFX0RBVEFfUE9JTlRFUnMgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIAlTbywgdGhlIGRhdGEgdHJhbnNmZXIgc2VnbWVudHMgd2lsbCBjaGFuZ2UgdG8gCisgICAgICoJCUNBTEwgZGF0YV90cmFuc2ZlciwgV0hFTiBOT1QgZGF0YSBwaGFzZQorICAgICAqCQlNT1ZFIHgsIHgsIFdIRU4gZGF0YSBwaGFzZQorICAgICAqCQkoIHJlcGVhdCApCisgICAgICoJCUpVTVAgb3RoZXJfdHJhbnNmZXIKKyAgICAgKi8KKworICAgIGRhdGFfdHJhbnNmZXJfaW5zdHJ1Y3Rpb25zID0gZGF0YWluICsgZGF0YW91dDsKKworICAgIC8qCisgICAgICogV2hlbiB3ZSBwZXJmb3JtIGEgcmVxdWVzdCBzZW5zZSwgd2Ugb3ZlcndyaXRlIHZhcmlvdXMgdGhpbmdzLAorICAgICAqIGluY2x1ZGluZyB0aGUgZGF0YSB0cmFuc2ZlciBjb2RlLiAgTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoCisgICAgICogc3BhY2UgdG8gZG8gdGhhdC4KKyAgICAgKi8KKworICAgIGlmIChkYXRhX3RyYW5zZmVyX2luc3RydWN0aW9ucyA8IDIpCisgICAgCWRhdGFfdHJhbnNmZXJfaW5zdHJ1Y3Rpb25zID0gMjsKKworCisgICAgLyoKKyAgICAgKiBUaGUgc2F2ZWQgZGF0YSBwb2ludGVyIGlzIHNldCB1cCBzbyB0aGF0IGEgUkVTVE9SRSBQT0lOVEVSUyBtZXNzYWdlIAorICAgICAqIHdpbGwgc3RhcnQgdGhlIGRhdGEgdHJhbnNmZXIgb3ZlciBhdCB0aGUgYmVnaW5uaW5nLgorICAgICAqLworCisgICAgdG1wLT5zYXZlZF9kYXRhX3BvaW50ZXIgPSB2aXJ0X3RvX2J1cyAoaG9zdGRhdGEtPnNjcmlwdCkgKyAKKwlob3N0ZGF0YS0+RV9kYXRhX3RyYW5zZmVyOworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXplIExpbnV4IHNwZWNpZmljIGZpZWxkcy4KKyAgICAgKi8KKworICAgIHRtcC0+Y21kID0gY21kOworICAgIHRtcC0+bmV4dCA9IE5VTEw7CisgICAgdG1wLT5mbGFncyA9IDA7CisgICAgdG1wLT5kc2FfbmV4dF9hZGRyID0gdmlydF90b19idXModG1wLT5kc2EpICsgaG9zdGRhdGEtPmRzYV9uZXh0IC0gCisJaG9zdGRhdGEtPmRzYV9zdGFydDsKKyAgICB0bXAtPmRzYV9hZGRyID0gdmlydF90b19idXModG1wLT5kc2EpIC0gaG9zdGRhdGEtPmRzYV9zdGFydDsKKworICAgIC8qIAorICAgICAqIENhbGN1bGF0ZSBhZGRyZXNzZXMgb2YgZHluYW1pYyBjb2RlIHRvIGZpbGwgaW4gRFNBCisgICAgICovCisKKyAgICB0bXAtPmRhdGFfdHJhbnNmZXJfc3RhcnQgPSB0bXAtPmRzYSArIChob3N0ZGF0YS0+ZHNhX2VuZCAtIAorICAgIAlob3N0ZGF0YS0+ZHNhX3N0YXJ0KSAvIHNpemVvZih1MzIpOworICAgIHRtcC0+ZGF0YV90cmFuc2Zlcl9lbmQgPSB0bXAtPmRhdGFfdHJhbnNmZXJfc3RhcnQgKyAKKyAgICAJMiAqIGRhdGFfdHJhbnNmZXJfaW5zdHJ1Y3Rpb25zOworCisgICAgY21kX2RhdGFpbiA9IGRhdGFpbiA/IHRtcC0+ZGF0YV90cmFuc2Zlcl9zdGFydCA6IE5VTEw7CisgICAgY21kX2RhdGFvdXQgPSBkYXRhb3V0ID8gKGRhdGFpbiA/IGNtZF9kYXRhaW4gKyAyICogZGF0YWluIDogdG1wLT4KKyAgICAJZGF0YV90cmFuc2Zlcl9zdGFydCkgOiBOVUxMOworCisgICAgLyoKKyAgICAgKiBGaWxsIGluIHRoZSBOQ1I1M2M3eDBfY21kIHN0cnVjdHVyZSBhcyBmb2xsb3dzCisgICAgICogZHNhLCB3aXRoIGZpeGVkIHVwIERTQSBjb2RlCisgICAgICogZGF0YWluIGNvZGUKKyAgICAgKiBkYXRhb3V0IGNvZGUKKyAgICAgKi8KKworICAgIC8qIENvcHkgdGVtcGxhdGUgY29kZSBpbnRvIGRzYSBhbmQgcGVyZm9ybSBhbGwgbmVjZXNzYXJ5IGZpeHVwcyAqLworICAgIGlmIChob3N0ZGF0YS0+ZHNhX2ZpeHVwKQorICAgIAlob3N0ZGF0YS0+ZHNhX2ZpeHVwKHRtcCk7CisKKyAgICBwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9uZXh0LCAwLCAwKTsKKyAgICAvKgorICAgICAqIFhYWCBpcyB0aGlzIGdpdmluZyA1M2M3MTAgYWNjZXNzIHRvIHRoZSBTY3NpX0NtbmQgaW4gc29tZSB3YXk/CisgICAgICogRG8gd2UgbmVlZCB0byBjaGFuZ2UgaXQgZm9yIGNhY2hpbmcgcmVhc29ucz8KKyAgICAgKi8KKyAgICBwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9jbW5kLCAwLCB2aXJ0X3RvX2J1cyhjbWQpKTsKKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19TWU5DSFJPTk9VUykgeworCisJZXhwX3NlbGVjdF9pbmRpcmVjdCA9ICgoMSA8PCBjbWQtPmRldmljZS0+aWQpIDw8IDE2KSB8CisJCQkoaG9zdGRhdGEtPnN5bmNbY21kLT5kZXZpY2UtPmlkXS5zeGZlcl9zYW5pdHkgPDwgOCk7CisKKwlpZiAoaG9zdGRhdGEtPnN5bmNbY21kLT5kZXZpY2UtPmlkXS5zZWxlY3RfaW5kaXJlY3QgIT0KKwkJCQlleHBfc2VsZWN0X2luZGlyZWN0KSB7CisJICAgIHByaW50ayAoInNjc2klZCA6ICBzYW5pdHkgY2hlY2sgZmFpbGVkIHNlbGVjdF9pbmRpcmVjdD0weCV4XG4iLAorCQlob3N0LT5ob3N0X25vLCBob3N0ZGF0YS0+c3luY1tjbWQtPmRldmljZS0+aWRdLnNlbGVjdF9pbmRpcmVjdCk7CisJICAgIEZBVEFMKGhvc3QpOworCisJfQorICAgIH0KKworICAgIHBhdGNoX2RzYV8zMih0bXAtPmRzYSwgZHNhX3NlbGVjdCwgMCwKKwkJaG9zdGRhdGEtPnN5bmNbY21kLT5kZXZpY2UtPmlkXS5zZWxlY3RfaW5kaXJlY3QpOworCisgICAgLyoKKyAgICAgKiBSaWdodCBub3csIHdlJ2xsIGRvIHRoZSBXSURFIGFuZCBTWU5DSFJPTk9VUyBuZWdvdGlhdGlvbnMgb24KKyAgICAgKiBkaWZmZXJlbnQgY29tbWFuZHM7IGFsdGhvdWdoIGl0IHNob3VsZCBiZSB0cml2aWFsIHRvIGRvIHRoZW0KKyAgICAgKiBib3RoIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICovCisgICAgaWYgKGhvc3RkYXRhLT5pbml0aWF0ZV93ZHRyICYgKDEgPDwgY21kLT5kZXZpY2UtPmlkKSkgeworCW1lbWNweSAoKHZvaWQgKikgKHRtcC0+c2VsZWN0ICsgMSksICh2b2lkICopIHdkdHJfbWVzc2FnZSwKKwkgICAgc2l6ZW9mKHdkdHJfbWVzc2FnZSkpOworICAgIAlwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9tc2dvdXQsIDAsIDEgKyBzaXplb2Yod2R0cl9tZXNzYWdlKSk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWhvc3RkYXRhLT5pbml0aWF0ZV93ZHRyICY9IH4oMSA8PCBjbWQtPmRldmljZS0+aWQpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICB9IGVsc2UgaWYgKGhvc3RkYXRhLT5pbml0aWF0ZV9zZHRyICYgKDEgPDwgY21kLT5kZXZpY2UtPmlkKSkgeworCW1lbWNweSAoKHZvaWQgKikgKHRtcC0+c2VsZWN0ICsgMSksICh2b2lkICopIHNkdHJfbWVzc2FnZSwgCisJICAgIHNpemVvZihzZHRyX21lc3NhZ2UpKTsKKyAgICAJcGF0Y2hfZHNhXzMyKHRtcC0+ZHNhLCBkc2FfbXNnb3V0LCAwLCAxICsgc2l6ZW9mKHNkdHJfbWVzc2FnZSkpOworCXRtcC0+ZmxhZ3MgfD0gQ01EX0ZMQUdfU0RUUjsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaG9zdGRhdGEtPmluaXRpYXRlX3NkdHIgJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5pZCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIAorICAgIH0KKyNpZiAxCisgICAgZWxzZSBpZiAoIShob3N0ZGF0YS0+dGFsa2VkX3RvICYgKDEgPDwgY21kLT5kZXZpY2UtPmlkKSkgJiYKKwkJIShob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9OT19BU1lOQykpIHsKKworCW1lbWNweSAoKHZvaWQgKikgKHRtcC0+c2VsZWN0ICsgMSksICh2b2lkICopIGFzeW5jX21lc3NhZ2UsIAorCSAgICBzaXplb2YoYXN5bmNfbWVzc2FnZSkpOworICAgIAlwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9tc2dvdXQsIDAsIDEgKyBzaXplb2YoYXN5bmNfbWVzc2FnZSkpOworCXRtcC0+ZmxhZ3MgfD0gQ01EX0ZMQUdfU0RUUjsKKyAgICB9IAorI2VuZGlmCisgICAgZWxzZSAKKyAgICAJcGF0Y2hfZHNhXzMyKHRtcC0+ZHNhLCBkc2FfbXNnb3V0LCAwLCAxKTsKKworICAgIGhvc3RkYXRhLT50YWxrZWRfdG8gfD0gKDEgPDwgY21kLT5kZXZpY2UtPmlkKTsKKyAgICB0bXAtPnNlbGVjdFswXSA9IChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ESVNDT05ORUNUKSA/IAorCUlERU5USUZZICgxLCBjbWQtPmRldmljZS0+bHVuKSA6IElERU5USUZZICgwLCBjbWQtPmRldmljZS0+bHVuKTsKKyAgICBwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9tc2dvdXQsIDEsIHZpcnRfdG9fYnVzKHRtcC0+c2VsZWN0KSk7CisgICAgcGF0Y2hfZHNhXzMyKHRtcC0+ZHNhLCBkc2FfY21kb3V0LCAwLCBjbWQtPmNtZF9sZW4pOworICAgIHBhdGNoX2RzYV8zMih0bXAtPmRzYSwgZHNhX2NtZG91dCwgMSwgdmlydF90b19idXModG1wLT5jbW5kKSk7CisgICAgcGF0Y2hfZHNhXzMyKHRtcC0+ZHNhLCBkc2FfZGF0YW91dCwgMCwgY21kX2RhdGFvdXQgPyAKKyAgICAJICAgIHZpcnRfdG9fYnVzIChjbWRfZGF0YW91dCkKKwk6IHZpcnRfdG9fYnVzIChob3N0ZGF0YS0+c2NyaXB0KSArIGhvc3RkYXRhLT5FX290aGVyX3RyYW5zZmVyKTsKKyAgICBwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9kYXRhaW4sIDAsIGNtZF9kYXRhaW4gPyAKKyAgICAJICAgIHZpcnRfdG9fYnVzIChjbWRfZGF0YWluKSAKKwk6IHZpcnRfdG9fYnVzIChob3N0ZGF0YS0+c2NyaXB0KSArIGhvc3RkYXRhLT5FX290aGVyX3RyYW5zZmVyKTsKKyAgICAvKiAKKyAgICAgKiBYWFggLSBuZWVkIHRvIG1ha2UgZW5kaWFuIGF3YXJlLCBzaG91bGQgdXNlIHNlcGFyYXRlIHZhcmlhYmxlcworICAgICAqIGZvciBib3RoIHN0YXR1cyBhbmQgbWVzc2FnZSBieXRlcy4KKyAgICAgKi8KKyAgICBwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9tc2dpbiwgMCwgMSk7CisvKiAKKyAqIEZJWE1FIDogdGhlc2Ugb25seSB3b3JrcyBmb3IgbGl0dGxlIGVuZGlhbi4gIFdlIHByb2JhYmx5IHdhbnQgdG8gCisgKiAJcHJvdmlkZSBtZXNzYWdlIGFuZCBzdGF0dXMgZmllbGRzIGluIHRoZSBOQ1I1M2M3eDBfY21kIAorICoJc3RydWN0dXJlLCBhbmQgYXNzaWduIHRoZW0gdG8gY21kLT5yZXN1bHQgd2hlbiB3ZSdyZSBkb25lLgorICovCisjaWZkZWYgQklHX0VORElBTgorICAgIHBhdGNoX2RzYV8zMih0bXAtPmRzYSwgZHNhX21zZ2luLCAxLCB2aXJ0X3RvX2J1cygmdG1wLT5yZXN1bHQpICsgMik7CisgICAgcGF0Y2hfZHNhXzMyKHRtcC0+ZHNhLCBkc2Ffc3RhdHVzLCAwLCAxKTsKKyAgICBwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9zdGF0dXMsIDEsIHZpcnRfdG9fYnVzKCZ0bXAtPnJlc3VsdCkgKyAzKTsKKyNlbHNlCisgICAgcGF0Y2hfZHNhXzMyKHRtcC0+ZHNhLCBkc2FfbXNnaW4sIDEsIHZpcnRfdG9fYnVzKCZ0bXAtPnJlc3VsdCkgKyAxKTsKKyAgICBwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9zdGF0dXMsIDAsIDEpOworICAgIHBhdGNoX2RzYV8zMih0bXAtPmRzYSwgZHNhX3N0YXR1cywgMSwgdmlydF90b19idXMoJnRtcC0+cmVzdWx0KSk7CisjZW5kaWYKKyAgICBwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9tc2dvdXRfb3RoZXIsIDAsIDEpOworICAgIHBhdGNoX2RzYV8zMih0bXAtPmRzYSwgZHNhX21zZ291dF9vdGhlciwgMSwgCisJdmlydF90b19idXMoJihob3N0ZGF0YS0+TkNSNTNjN3h4X21zZ19ub3ApKSk7CisgICAgCisgICAgLyoKKyAgICAgKiBHZW5lcmF0ZSBjb2RlIGZvciB6ZXJvIG9yIG1vcmUgb2YgdGhlIERBVEEgSU4sIERBVEEgT1VUIHBoYXNlcyAKKyAgICAgKiBpbiB0aGUgZm9ybWF0IAorICAgICAqCisgICAgICogQ0FMTCBkYXRhX3RyYW5zZmVyLCBXSEVOIE5PVCBwaGFzZQorICAgICAqIE1PVkUgZmlyc3QgYnVmZmVyIGxlbmd0aCwgZmlyc3QgYnVmZmVyIGFkZHJlc3MsIFdIRU4gcGhhc2UKKyAgICAgKiAuLi4KKyAgICAgKiBNT1ZFIGxhc3QgYnVmZmVyIGxlbmd0aCwgbGFzdCBidWZmZXIgYWRkcmVzcywgV0hFTiBwaGFzZQorICAgICAqIEpVTVAgb3RoZXJfdHJhbnNmZXIKKyAgICAgKi8KKworLyogCisgKiBTZWUgaWYgd2UncmUgZ2V0dGluZyB0byBkYXRhIHRyYW5zZmVyIGJ5IGdlbmVyYXRpbmcgYW4gdW5jb25kaXRpb25hbCAKKyAqIGludGVycnVwdC4KKyAqLworI2lmIDAKKyAgICBpZiAoZGF0YWluKSB7CisJY21kX2RhdGFpblswXSA9IDB4OTgwODAwMDA7CisJY21kX2RhdGFpblsxXSA9IDB4MDNmZmQwMGQ7CisJY21kX2RhdGFpbiArPSAyOworICAgIH0KKyNlbmRpZgorCisvKiAKKyAqIFhYWCAtIEknbSB1bmRlY2lkZWQgd2hldGhlciBhbGwgb2YgdGhpcyBub25zZW5zZSBpcyBmYXN0ZXIKKyAqIGluIHRoZSBsb25nIHJ1biwgb3Igd2hldGhlciBJIHNob3VsZCBqdXN0IGdvIGFuZCBpbXBsZW1lbnQgYSBsb29wCisgKiBvbiB0aGUgTkNSIGNoaXAgdXNpbmcgdGFibGUgaW5kaXJlY3QgbW9kZT8KKyAqCisgKiBJbiBhbnkgY2FzZSwgdGhpcyBpcyBob3cgaXQgX211c3RfIGJlIGRvbmUgZm9yIDUzYzcwMC83MDAtNjYgY2hpcHMsCisgKiBzbyB0aGlzIHN0YXlzIGV2ZW4gd2hlbiB3ZSBjb21lIHVwIHdpdGggc29tZXRoaW5nIGJldHRlci4KKyAqCisgKiBXaGVuIHdlJ3JlIGxpbWl0ZWQgdG8gMSBzaW11bHRhbmVvdXMgY29tbWFuZCwgbm8gb3ZlcmxhcHBpbmcgcHJvY2Vzc2luZywKKyAqIHdlJ3JlIHNlZWluZyA2MzBLL3NlYywgd2l0aCA3JSBDUFUgdXNhZ2Ugb24gYSBzbG93IFN5cXVlc3QgNDVNCisgKiBkcml2ZS4KKyAqCisgKiBOb3QgYmFkLCBub3QgZ29vZC4gV2UnbGwgc2VlLgorICovCisKKyAgICB0bXAtPmJvdW5jZS5sZW4gPSAwOwkvKiBBc3N1bWUgYWxpZ25lZCBidWZmZXIgKi8KKworICAgIGZvciAoaSA9IDA7IGNtZC0+dXNlX3NnID8gKGkgPCBjbWQtPnVzZV9zZykgOiAhaTsgY21kX2RhdGFpbiArPSA0LCAKKwljbWRfZGF0YW91dCArPSA0LCArK2kpIHsKKwl1MzIgdmJ1ZiA9IGNtZC0+dXNlX3NnCisJICAgID8gKHUzMilwYWdlX2FkZHJlc3MoKChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPmJ1ZmZlcilbaV0ucGFnZSkrCisJICAgICAgKChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPmJ1ZmZlcilbaV0ub2Zmc2V0CisJICAgIDogKHUzMikoY21kLT5yZXF1ZXN0X2J1ZmZlcik7CisJdTMyIGJidWYgPSB2aXJ0X3RvX2J1cygodm9pZCAqKXZidWYpOworCXUzMiBjb3VudCA9IGNtZC0+dXNlX3NnID8KKwkgICAgKChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPmJ1ZmZlcilbaV0ubGVuZ3RoIDoKKwkgICAgY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisKKwkvKgorCSAqIElmIHdlIGhhdmUgYnVmZmVycyB3aGljaCBhcmUgbm90IGFsaWduZWQgd2l0aCAxNiBieXRlIGNhY2hlCisJICogbGluZXMsIHRoZW4gd2UganVzdCBob3BlIG5vdGhpbmcgYWNjZXNzZXMgdGhlIG90aGVyIHBhcnRzIG9mCisJICogdGhvc2UgY2FjaGUgbGluZXMgd2hpbGUgdGhlIHRyYW5zZmVyIGlzIGluIHByb2dyZXNzLiAgVGhhdCB3b3VsZAorCSAqIGZpbGwgdGhlIGNhY2hlLCBhbmQgc3Vic2VxdWVudCByZWFkcyBvZiB0aGUgZG1hIGRhdGEgd291bGQgcGljaworCSAqIHVwIHRoZSB3cm9uZyB0aGluZy4KKwkgKiBYWFggV2UgbmVlZCBhIGJvdW5jZSBidWZmZXIgdG8gaGFuZGxlIHRoYXQgY29ycmVjdGx5LgorCSAqLworCisJaWYgKCgoYmJ1ZiAmIDE1KSB8fCAoY291bnQgJiAxNSkpICYmIChkYXRhaW4gfHwgZGF0YW91dCkpCisJeworCSAgICAvKiBCb3VuY2UgYnVmZmVyIG5lZWRlZCAqLworCSAgICBpZiAoY21kLT51c2Vfc2cpCisJCXByaW50ayAoIjUzYzd4eDogTm9uLWFsaWduZWQgYnVmZmVyIHdpdGggdXNlX3NnXG4iKTsKKwkgICAgZWxzZSBpZiAoZGF0YWluICYmIGRhdGFvdXQpCisgICAgICAgICAgICAgICAgcHJpbnRrICgiNTNjN3h4OiBOb24tYWxpZ25lZCBidWZmZXIgd2l0aCBkYXRhaW4gJiYgZGF0YW91dFxuIik7CisgICAgICAgICAgICBlbHNlIGlmIChjb3VudCA+IDI1NikKKwkJcHJpbnRrICgiNTNjN3h4OiBOb24tYWxpZ25lZCB0cmFuc2ZlciA+IDI1NiBieXRlc1xuIik7CisJICAgIGVsc2UKKwkgICAgeworCQkgICAgaWYgKGRhdGFpbikKKwkJICAgIHsKKwkJCXRtcC0+Ym91bmNlLmxlbiA9IGNvdW50OworCQkJdG1wLT5ib3VuY2UuYWRkciA9IHZidWY7CisJCQliYnVmID0gdmlydF90b19idXModG1wLT5ib3VuY2UuYnVmKTsKKwkJCXRtcC0+Ym91bmNlLmJ1ZlswXSA9IDB4ZmY7CisJCQl0bXAtPmJvdW5jZS5idWZbMV0gPSAweGZlOworCQkJdG1wLT5ib3VuY2UuYnVmWzJdID0gMHhmZDsKKwkJCXRtcC0+Ym91bmNlLmJ1ZlszXSA9IDB4ZmM7CisJICAgIAkgICAgfQorCSAgICAJICAgIGlmIChkYXRhb3V0KQorCSAgICAJICAgIHsKKwkJCW1lbWNweSAoKHZvaWQgKil0bXAtPmJvdW5jZS5idWYsICh2b2lkICopdmJ1ZiwgY291bnQpOworCQkJYmJ1ZiA9IHZpcnRfdG9fYnVzKHRtcC0+Ym91bmNlLmJ1Zik7CisJCSAgICB9CisJICAgIH0KKwl9CisKKwlpZiAoZGF0YWluKSB7CisgICAgICAgICAgICBjYWNoZV9jbGVhcih2aXJ0X3RvX3BoeXMoKHZvaWQgKil2YnVmKSwgY291bnQpOworCSAgICAvKiBDQUxMIG90aGVyX2luLCBXSEVOIE5PVCBEQVRBX0lOICovICAKKwkgICAgY21kX2RhdGFpblswXSA9ICgoRENNRF9UWVBFX1RDSSB8IERDTURfVENJX09QX0NBTEwgfCAKKwkJRENNRF9UQ0lfSU8pIDw8IDI0KSB8IAorCQlEQkNfVENJX1dBSVRfRk9SX1ZBTElEIHwgREJDX1RDSV9DT01QQVJFX1BIQVNFOworCSAgICBjbWRfZGF0YWluWzFdID0gdmlydF90b19idXMgKGhvc3RkYXRhLT5zY3JpcHQpICsgCisJCWhvc3RkYXRhLT5FX290aGVyX2luOworCSAgICAvKiBNT1ZFIGNvdW50LCBidWYsIFdIRU4gREFUQV9JTiAqLworCSAgICBjbWRfZGF0YWluWzJdID0gKChEQ01EX1RZUEVfQk1JIHwgRENNRF9CTUlfT1BfTU9WRV9JIHwgRENNRF9CTUlfSU8pIAorICAgIAkgICAgCTw8IDI0KSB8IGNvdW50OworCSAgICBjbWRfZGF0YWluWzNdID0gYmJ1ZjsKKyNpZiAwCisJICAgIHByaW50X2luc24gKGhvc3QsIGNtZF9kYXRhaW4sICJkeW5hbWljICIsIDEpOworCSAgICBwcmludF9pbnNuIChob3N0LCBjbWRfZGF0YWluICsgMiwgImR5bmFtaWMgIiwgMSk7CisjZW5kaWYKKwl9CisJaWYgKGRhdGFvdXQpIHsKKyAgICAgICAgICAgIGNhY2hlX3B1c2godmlydF90b19waHlzKCh2b2lkICopdmJ1ZiksIGNvdW50KTsKKwkgICAgLyogQ0FMTCBvdGhlcl9vdXQsIFdIRU4gTk9UIERBVEFfT1VUICovCisJICAgIGNtZF9kYXRhb3V0WzBdID0gKChEQ01EX1RZUEVfVENJIHwgRENNRF9UQ0lfT1BfQ0FMTCkgPDwgMjQpIHwgCisJCURCQ19UQ0lfV0FJVF9GT1JfVkFMSUQgfCBEQkNfVENJX0NPTVBBUkVfUEhBU0U7CisJICAgIGNtZF9kYXRhb3V0WzFdID0gdmlydF90b19idXMoaG9zdGRhdGEtPnNjcmlwdCkgKyAKKyAgICAJICAgIAlob3N0ZGF0YS0+RV9vdGhlcl9vdXQ7CisJICAgIC8qIE1PVkUgY291bnQsIGJ1ZiwgV0hFTiBEQVRBK09VVCAqLworCSAgICBjbWRfZGF0YW91dFsyXSA9ICgoRENNRF9UWVBFX0JNSSB8IERDTURfQk1JX09QX01PVkVfSSkgPDwgMjQpIAorCQl8IGNvdW50OworCSAgICBjbWRfZGF0YW91dFszXSA9IGJidWY7CisjaWYgMAorCSAgICBwcmludF9pbnNuIChob3N0LCBjbWRfZGF0YW91dCwgImR5bmFtaWMgIiwgMSk7CisJICAgIHByaW50X2luc24gKGhvc3QsIGNtZF9kYXRhb3V0ICsgMiwgImR5bmFtaWMgIiwgMSk7CisjZW5kaWYKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJbnN0YWxsIEpVTVAgaW5zdHJ1Y3Rpb25zIGFmdGVyIHRoZSBkYXRhIHRyYW5zZmVyIHJvdXRpbmVzIHRvIHJldHVybgorICAgICAqIGNvbnRyb2wgdG8gdGhlIGRvX290aGVyX3RyYW5zZmVyIHJvdXRpbmVzLgorICAgICAqLworICAKKyAgICAKKyAgICBpZiAoZGF0YWluKSB7CisJY21kX2RhdGFpblswXSA9ICgoRENNRF9UWVBFX1RDSSB8IERDTURfVENJX09QX0pVTVApIDw8IDI0KSB8CisgICAgCSAgICBEQkNfVENJX1RSVUU7CisJY21kX2RhdGFpblsxXSA9IHZpcnRfdG9fYnVzKGhvc3RkYXRhLT5zY3JpcHQpICsgCisgICAgCSAgICBob3N0ZGF0YS0+RV9vdGhlcl90cmFuc2ZlcjsKKyNpZiAwCisJcHJpbnRfaW5zbiAoaG9zdCwgY21kX2RhdGFpbiwgImR5bmFtaWMganVtcCAiLCAxKTsKKyNlbmRpZgorCWNtZF9kYXRhaW4gKz0gMjsgCisgICAgfQorI2lmIDAKKyAgICBpZiAoZGF0YWluKSB7CisJY21kX2RhdGFpblswXSA9IDB4OTgwODAwMDA7CisJY21kX2RhdGFpblsxXSA9IDB4MDNmZmRlZWQ7CisJY21kX2RhdGFpbiArPSAyOworICAgIH0KKyNlbmRpZgorICAgIGlmIChkYXRhb3V0KSB7CisJY21kX2RhdGFvdXRbMF0gPSAoKERDTURfVFlQRV9UQ0kgfCBEQ01EX1RDSV9PUF9KVU1QKSA8PCAyNCkgfAorICAgIAkgICAgREJDX1RDSV9UUlVFOworCWNtZF9kYXRhb3V0WzFdID0gdmlydF90b19idXMoaG9zdGRhdGEtPnNjcmlwdCkgKyAKKyAgICAJICAgIGhvc3RkYXRhLT5FX290aGVyX3RyYW5zZmVyOworI2lmIDAKKwlwcmludF9pbnNuIChob3N0LCBjbWRfZGF0YW91dCwgImR5bmFtaWMganVtcCAiLCAxKTsKKyNlbmRpZgorCWNtZF9kYXRhb3V0ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIHRtcDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzYzd4eF9xdWV1ZV9jb21tYW5kIChTY3NpX0NtbmQgKmNtZCwKKyAqICAgICAgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKKyAqCisgKiBQdXJwb3NlIDogIGVucXVldWVzIGEgU0NTSSBjb21tYW5kCisgKgorICogSW5wdXRzIDogY21kIC0gU0NTSSBjb21tYW5kLCBkb25lIC0gZnVuY3Rpb24gY2FsbGVkIG9uIGNvbXBsZXRpb24sIHdpdGgKKyAqICAgICAgYSBwb2ludGVyIHRvIHRoZSBjb21tYW5kIGRlc2NyaXB0b3IuCisgKgorICogUmV0dXJucyA6IDAKKyAqCisgKiBTaWRlIGVmZmVjdHMgOgorICogICAgICBjbWQgaXMgYWRkZWQgdG8gdGhlIHBlciBpbnN0YW5jZSBkcml2ZXIgaXNzdWVfcXVldWUsIHdpdGggbWFqb3IKKyAqICAgICAgdHdpZGRsaW5nIGRvbmUgdG8gdGhlIGhvc3Qgc3BlY2lmaWMgZmllbGRzIG9mIGNtZC4gIElmIHRoZQorICogICAgICBwcm9jZXNzX2lzc3VlX3F1ZXVlIGNvcm91dGluZSBpc24ndCBydW5uaW5nLCBpdCBpcyByZXN0YXJ0ZWQuCisgKiAKKyAqIE5PVEUgOiB3ZSB1c2UgdGhlIGhvc3Rfc2NyaWJibGUgZmllbGQgb2YgdGhlIFNjc2lfQ21uZCBzdHJ1Y3R1cmUgdG8gCisgKglob2xkIG91ciBvd24gZGF0YSwgYW5kIHBlcnZlcnQgdGhlIHB0ciBmaWVsZCBvZiB0aGUgU0NwIGZpZWxkCisgKgl0byBjcmVhdGUgYSBsaW5rZWQgbGlzdC4KKyAqLworCitpbnQKK05DUjUzYzd4eF9xdWV1ZV9jb21tYW5kIChTY3NpX0NtbmQgKmNtZCwgdm9pZCAoKiBkb25lKShTY3NpX0NtbmQgKikpIHsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gY21kLT5kZXZpY2UtPmhvc3Q7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAKKwkoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YVswXTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIFNjc2lfQ21uZCAqdG1wOworCisgICAgY21kLT5zY3NpX2RvbmUgPSBkb25lOworICAgIGNtZC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisgICAgY21kLT5TQ3AucHRyID0gTlVMTDsKKyAgICBjbWQtPlNDcC5idWZmZXIgPSBOVUxMOworCisjaWZkZWYgVkFMSURfSURTCisgICAgLyogSWdub3JlIGNvbW1hbmRzIG9uIGludmFsaWQgSURzICovCisgICAgaWYgKCFob3N0ZGF0YS0+dmFsaWRfaWRzW2NtZC0+ZGV2aWNlLT5pZF0pIHsKKyAgICAgICAgcHJpbnRrKCJzY3NpJWQgOiBpZ25vcmluZyB0YXJnZXQgJWQgbHVuICVkXG4iLCBob3N0LT5ob3N0X25vLAorICAgICAgICAgICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKyAgICAgICAgY21kLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOworICAgICAgICBkb25lKGNtZCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyNlbmRpZgorCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIGlmICgoaG9zdGRhdGEtPm9wdGlvbnMgJiAoT1BUSU9OX0RFQlVHX0lOSVRfT05MWXxPUFRJT05fREVCVUdfUFJPQkVfT05MWSkpIAorCXx8ICgoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfVEFSR0VUX0xJTUlUKSAmJgorCSAgICAhKGhvc3RkYXRhLT5kZWJ1Z19sdW5fbGltaXRbY21kLT5kZXZpY2UtPmlkXSAmICgxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pKSkKKyNpZmRlZiBMSU5VWF8xXzIKKwl8fCBjbWQtPmRldmljZS0+aWQgPiA3CisjZWxzZQorCXx8IGNtZC0+ZGV2aWNlLT5pZCA+IGhvc3QtPm1heF9pZAorI2VuZGlmCisJfHwgY21kLT5kZXZpY2UtPmlkID09IGhvc3QtPnRoaXNfaWQKKwl8fCBob3N0ZGF0YS0+c3RhdGUgPT0gU1RBVEVfRElTQUJMRUQpIHsKKwlwcmludGsoInNjc2klZCA6IGRpc2FibGVkIG9yIGJhZCB0YXJnZXQgJWQgbHVuICVkXG4iLCBob3N0LT5ob3N0X25vLAorCSAgICBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCWNtZC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwlkb25lKGNtZCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworICAgIH0KKworICAgIGlmICgoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfTkNPTU1BTkRTX0xJTUlUKSAmJgorCShob3N0ZGF0YS0+ZGVidWdfY291bnRfbGltaXQgPT0gMCkpIHsKKwlwcmludGsoInNjc2klZCA6IG1heGltdW0gY29tbWFuZHMgZXhjZWVkZWRcbiIsIGhvc3QtPmhvc3Rfbm8pOworCWNtZC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwlkb25lKGNtZCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworICAgIH0KKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19SRUFEX09OTFkpIHsKKwlzd2l0Y2ggKGNtZC0+Y21uZFswXSkgeworCWNhc2UgV1JJVEVfNjoKKwljYXNlIFdSSVRFXzEwOgorCSAgICBwcmludGsoInNjc2klZCA6IFdSSVRFIGF0dGVtcHRlZCB3aXRoIE5PX1dSSVRFIGRlYnVnZ2luZyBmbGFnIHNldFxuIiwKKwkJaG9zdC0+aG9zdF9ubyk7CisJICAgIGNtZC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwkgICAgZG9uZShjbWQpOworCSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJICAgIHJldHVybiAwOworCX0KKyAgICB9CisKKyAgICBpZiAoKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX1RBUkdFVF9MSU1JVCkgJiYKKwkgICAgaG9zdGRhdGEtPmRlYnVnX2NvdW50X2xpbWl0ICE9IC0xKSAKKwktLWhvc3RkYXRhLT5kZWJ1Z19jb3VudF9saW1pdDsKKworICAgIGNtZC0+cmVzdWx0ID0gMHhmZmZmOwkvKiBUaGUgTkNSIHdpbGwgb3ZlcndyaXRlIG1lc3NhZ2UKKwkJCQkgICAgICAgYW5kIHN0YXR1cyB3aXRoIHZhbGlkIGRhdGEgKi8KKyAgICBjbWQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSB0bXAgPSBjcmVhdGVfY21kIChjbWQpOworCisgICAgLyoKKyAgICAgKiBSRVFVRVNUIFNFTlNFIGNvbW1hbmRzIGFyZSBpbnNlcnRlZCBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgCisgICAgICogc28gdGhhdCB3ZSBkbyBub3QgY2xlYXIgdGhlIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb24KKyAgICAgKiB0aGV5IG1heSBiZSBsb29raW5nIGF0LgorICAgICAqLworCisgICAgaWYgKCEoaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKSB8fCAoY21kLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpKSB7CisJY21kLT5TQ3AucHRyID0gKHVuc2lnbmVkIGNoYXIgKikgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOworCWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IGNtZDsKKyAgICB9IGVsc2UgeworCWZvciAodG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7IHRtcC0+U0NwLnB0cjsgCisJCXRtcCA9IChTY3NpX0NtbmQgKikgdG1wLT5TQ3AucHRyKTsKKwl0bXAtPlNDcC5wdHIgPSAodW5zaWduZWQgY2hhciAqKSBjbWQ7CisgICAgfQorICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICBydW5fcHJvY2Vzc19pc3N1ZV9xdWV1ZSgpOworICAgIHJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gOiB2b2lkIHRvX3NjaGVkdWxlX2xpc3QgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsCisgKiAJc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqIGhvc3RkYXRhLCBTY3NpX0NtbmQgKmNtZCkKKyAqCisgKiBQdXJwb3NlIDogdGFrZXMgYSBTQ1NJIGNvbW1hbmQgd2hpY2ggd2FzIGp1c3QgcmVtb3ZlZCBmcm9tIHRoZSAKKyAqCWlzc3VlIHF1ZXVlLCBhbmQgZGVhbHMgd2l0aCBpdCBieSBpbnNlcnRpbmcgaXQgaW4gdGhlIGZpcnN0CisgKglmcmVlIHNsb3QgaW4gdGhlIHNjaGVkdWxlIGxpc3Qgb3IgYnkgdGVybWluYXRpbmcgaXQgaW1tZWRpYXRlbHkuCisgKgorICogSW5wdXRzIDogCisgKglob3N0IC0gU0NTSSBob3N0IGFkYXB0ZXI7IGhvc3RkYXRhIC0gaG9zdGRhdGEgc3RydWN0dXJlIGZvciAKKyAqCXRoaXMgYWRhcHRlcjsgY21kIC0gYSBwb2ludGVyIHRvIHRoZSBjb21tYW5kOyBzaG91bGQgaGF2ZSAKKyAqCXRoZSBob3N0X3NjcmliYmxlIGZpZWxkIGluaXRpYWxpemVkIHRvIHBvaW50IHRvIGEgdmFsaWQgCisgKgkKKyAqIFNpZGUgZWZmZWN0cyA6IAorICogICAgICBjbWQgaXMgYWRkZWQgdG8gdGhlIHBlciBpbnN0YW5jZSBzY2hlZHVsZSBsaXN0LCB3aXRoIG1pbm9yIAorICogICAgICB0d2lkZGxpbmcgZG9uZSB0byB0aGUgaG9zdCBzcGVjaWZpYyBmaWVsZHMgb2YgY21kLgorICoKKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCit0b19zY2hlZHVsZV9saXN0IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSwKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqY21kKSB7CisgICAgTkNSNTNjN3gwX2xvY2FsX2RlY2xhcmUoKTsKKyAgICBTY3NpX0NtbmQgKnRtcCA9IGNtZC0+Y21kOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgLyogZHNhIHN0YXJ0IGlzIG5lZ2F0aXZlLCBzbyBzdWJ0cmFjdGlvbiBpcyB1c2VkICovCisgICAgdm9sYXRpbGUgdTMyICpuY3JjdXJyZW50OworCisgICAgaW50IGk7CisgICAgTkNSNTNjN3gwX2xvY2FsX3NldHVwKGhvc3QpOworI2lmIDAKKyAgICBwcmludGsoInNjc2klZCA6IG5ldyBkc2EgaXMgMHglbHggKHZpcnQgMHglcClcbiIsIGhvc3QtPmhvc3Rfbm8sIAorCXZpcnRfdG9fYnVzKGhvc3RkYXRhLT5kc2EpLCBob3N0ZGF0YS0+ZHNhKTsKKyNlbmRpZgorCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIAorICAgIC8qIAorICAgICAqIFdvcmsgYXJvdW5kIHJhY2UgY29uZGl0aW9uIDogaWYgYW4gaW50ZXJydXB0IGZpcmVkIGFuZCB3ZSAKKyAgICAgKiBnb3QgZGlzYWJsZWQgZm9yZ2V0IGFib3V0IHRoaXMgY29tbWFuZC4KKyAgICAgKi8KKworICAgIGlmIChob3N0ZGF0YS0+c3RhdGUgPT0gU1RBVEVfRElTQUJMRUQpIHsKKwlwcmludGsoInNjc2klZCA6IGRyaXZlciBkaXNhYmxlZFxuIiwgaG9zdC0+aG9zdF9ubyk7CisJdG1wLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOworCWNtZC0+bmV4dCA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKSBob3N0ZGF0YS0+ZnJlZTsKKwlob3N0ZGF0YS0+ZnJlZSA9IGNtZDsKKwl0bXAtPnNjc2lfZG9uZSh0bXApOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgZm9yIChpID0gaG9zdC0+Y2FuX3F1ZXVlLCBuY3JjdXJyZW50ID0gaG9zdGRhdGEtPnNjaGVkdWxlOyAKKwlpID4gMCAgJiYgbmNyY3VycmVudFswXSAhPSBob3N0ZGF0YS0+Tk9QX2luc247CisJLS1pLCBuY3JjdXJyZW50ICs9IDIgLyogSlVNUCBpbnN0cnVjdGlvbnMgYXJlIHR3byB3b3JkcyAqLyk7CisKKyAgICBpZiAoaSA+IDApIHsKKwkrK2hvc3RkYXRhLT5idXN5W3RtcC0+ZGV2aWNlLT5pZF1bdG1wLT5kZXZpY2UtPmx1bl07CisJY21kLT5uZXh0ID0gaG9zdGRhdGEtPnJ1bm5pbmdfbGlzdDsKKwlob3N0ZGF0YS0+cnVubmluZ19saXN0ID0gY21kOworCisJLyogUmVzdG9yZSB0aGlzIGluc3RydWN0aW9uIHRvIGEgTk9QIG9uY2UgdGhlIGNvbW1hbmQgc3RhcnRzICovCisJY21kLT5kc2EgWyhob3N0ZGF0YS0+ZHNhX2p1bXBfZGVzdCAtIGhvc3RkYXRhLT5kc2Ffc3RhcnQpIC8gCisJICAgIHNpemVvZih1MzIpXSA9ICh1MzIpIHZpcnRfdG9fYnVzICgodm9pZCAqKW5jcmN1cnJlbnQpOworCS8qIFJlcGxhY2UgdGhlIGN1cnJlbnQganVtcCBvcGVyYW5kLiAgKi8KKwluY3JjdXJyZW50WzFdID0KKwkgICAgdmlydF90b19idXMgKCh2b2lkICopIGNtZC0+ZHNhKSArIGhvc3RkYXRhLT5FX2RzYV9jb2RlX2JlZ2luIC0KKwkgICAgaG9zdGRhdGEtPkVfZHNhX2NvZGVfdGVtcGxhdGU7CisJLyogUmVwbGFjZSB0aGUgTk9QIGluc3RydWN0aW9uIHdpdGggYSBKVU1QICovCisJbmNyY3VycmVudFswXSA9ICgoRENNRF9UWVBFX1RDSXxEQ01EX1RDSV9PUF9KVU1QKSA8PCAyNCkgfAorCSAgICBEQkNfVENJX1RSVUU7CisgICAgfSAgZWxzZSB7CisJcHJpbnRrICgic2NzaSVkOiBubyBmcmVlIHNsb3RcbiIsIGhvc3QtPmhvc3Rfbm8pOworCWRpc2FibGUoaG9zdCk7CisJdG1wLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwljbWQtPm5leHQgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgaG9zdGRhdGEtPmZyZWU7CisJaG9zdGRhdGEtPmZyZWUgPSBjbWQ7CisJdG1wLT5zY3NpX2RvbmUodG1wKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIAorICAgICAqIElmIHRoZSBOQ1IgY2hpcCBpcyBpbiBhbiBpZGxlIHN0YXRlLCBzdGFydCBpdCBydW5uaW5nIHRoZSBzY2hlZHVsZXIKKyAgICAgKiBpbW1lZGlhdGVseS4gIE90aGVyd2lzZSwgc2lnbmFsIHRoZSBjaGlwIHRvIGp1bXAgdG8gc2NoZWR1bGUgYXMgCisgICAgICogc29vbiBhcyBpdCBpcyBpZGxlLgorICAgICAqLworCisgICAgaWYgKGhvc3RkYXRhLT5pZGxlKSB7CisJaG9zdGRhdGEtPmlkbGUgPSAwOworCWhvc3RkYXRhLT5zdGF0ZSA9IFNUQVRFX1JVTk5JTkc7CisJTkNSNTNjN3gwX3dyaXRlMzIgKERTUF9SRUcsICB2aXJ0X3RvX2J1cyAoKHZvaWQgKilob3N0ZGF0YS0+c2NoZWR1bGUpKTsKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfVFJBQ0UpCisJICAgIE5DUjUzYzd4MF93cml0ZTggKERDTlRMX1JFRywgaG9zdGRhdGEtPnNhdmVkX2RjbnRsIHwKKwkJCQlEQ05UTF9TU00gfCBEQ05UTF9TVEQpOworICAgIH0gZWxzZSB7CisJTkNSNTNjN3gwX3dyaXRlOChob3N0ZGF0YS0+aXN0YXQsIElTVEFUXzEwX1NJR1ApOworICAgIH0KKworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogYnVzeXAgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgCisgKgkqaG9zdGRhdGEsIFNjc2lfQ21uZCAqY21kKQorICoKKyAqIFB1cnBvc2UgOiBkZWNpZGUgaWYgd2UgY2FuIHBhc3MgdGhlIGdpdmVuIFNDU0kgY29tbWFuZCBvbiB0byB0aGUgCisgKglkZXZpY2UgaW4gcXVlc3Rpb24gb3Igbm90LgorICogIAorICogUmV0dXJucyA6IG5vbi16ZXJvIHdoZW4gd2UncmUgYnVzeSwgMCB3aGVuIHdlIGFyZW4ndC4KKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK2J1c3lwIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSwgCisgICAgU2NzaV9DbW5kICpjbWQpIHsKKyAgICAvKiBGSVhNRSA6IGluIHRoZSBmdXR1cmUsIHRoaXMgbmVlZHMgdG8gYWNjb21tb2RhdGUgU0NTSS1JSSB0YWdnZWQKKyAgICAgICBxdWV1aW5nLCBhbmQgd2UgbWF5IGJlIGFibGUgdG8gcGxheSB3aXRoIGZhaXJuZXNzIGhlcmUgYSBiaXQuCisgICAgICovCisgICAgcmV0dXJuIGhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF1bY21kLT5kZXZpY2UtPmx1bl07Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IHByb2Nlc3NfaXNzdWVfcXVldWUgKHZvaWQpCisgKgorICogUHVycG9zZSA6IHRyYW5zZmVyIGNvbW1hbmRzIGZyb20gdGhlIGlzc3VlIHF1ZXVlIHRvIE5DUiBzdGFydCBxdWV1ZSAKKyAqCW9mIGVhY2ggTkNSNTNjNy84eHggaW4gdGhlIHN5c3RlbSwgYXZvaWRpbmcga2VybmVsIHN0YWNrIAorICoJb3ZlcmZsb3dzIHdoZW4gdGhlIHNjc2lfZG9uZSgpIGZ1bmN0aW9uIGlzIGludm9rZWQgcmVjdXJzaXZlbHkuCisgKiAKKyAqIE5PVEUgOiBwcm9jZXNzX2lzc3VlX3F1ZXVlIGV4aXRzIHdpdGggaW50ZXJydXB0cyAqZGlzYWJsZWQqLCBzbyB0aGUgCisgKgljYWxsZXIgbXVzdCByZWVuYWJsZSB0aGVtIGlmIGl0IGRlc2lyZXMuCisgKiAKKyAqIE5PVEUgOiBwcm9jZXNzX2lzc3VlX3F1ZXVlIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBib3RoIAorICoJTkNSNTNjN3gwX3F1ZXVlX2NvbW1hbmQoKSBhbmQgZnJvbSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgCisgKglhZnRlciBjb21tYW5kIGNvbXBsZXRpb24gaW4gY2FzZSBOQ1I1M2M3eDBfcXVldWVfY29tbWFuZCgpCisgKiAJaXNuJ3QgaW52b2tlZCBhZ2FpbiBidXQgd2UndmUgZnJlZWQgdXAgcmVzb3VyY2VzIHRoYXQgYXJlCisgKgluZWVkZWQuCisgKi8KKworc3RhdGljIHZvaWQgCitwcm9jZXNzX2lzc3VlX3F1ZXVlICh1bnNpZ25lZCBsb25nIGZsYWdzKSB7CisgICAgU2NzaV9DbW5kICp0bXAsICpwcmV2OworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisgICAgaW50IGRvbmU7CisKKyAgICAvKgorICAgICAqIFdlIHJ1biAod2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkKSB1bnRpbCB3ZSdyZSBzdXJlIHRoYXQgbm9uZSBvZiAKKyAgICAgKiB0aGUgaG9zdCBhZGFwdGVycyBoYXZlIGFueXRoaW5nIHRoYXQgY2FuIGJlIGRvbmUsIGF0IHdoaWNoIHBvaW50IAorICAgICAqIHdlIHNldCBwcm9jZXNzX2lzc3VlX3F1ZXVlX3J1bm5pbmcgdG8gMCBhbmQgZXhpdC4KKyAgICAgKgorICAgICAqIEludGVycnVwdHMgYXJlIGVuYWJsZWQgYmVmb3JlIGRvaW5nIHZhcmlvdXMgb3RoZXIgaW50ZXJuYWwgCisgICAgICogaW5zdHJ1Y3Rpb25zLCBhZnRlciB3ZSd2ZSBkZWNpZGVkIHRoYXQgd2UgbmVlZCB0byBydW4gdGhyb3VnaAorICAgICAqIHRoZSBsb29wIGFnYWluLgorICAgICAqCisgICAgICovCisKKyAgICBkbyB7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsgLyogRnJlZXplIHJlcXVlc3QgcXVldWVzICovCisJZG9uZSA9IDE7CisJZm9yIChob3N0ID0gZmlyc3RfaG9zdDsgaG9zdCAmJiBob3N0LT5ob3N0dCA9PSB0aGVfdGVtcGxhdGU7CisJICAgIGhvc3QgPSBob3N0LT5uZXh0KSB7CisJICAgIGhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGFbMF07CisJICAgIGxvY2FsX2lycV9kaXNhYmxlKCk7CisJICAgIGlmIChob3N0ZGF0YS0+aXNzdWVfcXVldWUpIHsKKwkgICAgCWlmIChob3N0ZGF0YS0+c3RhdGUgPT0gU1RBVEVfRElTQUJMRUQpIHsKKwkJICAgIHRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOworCQkgICAgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlID0gKFNjc2lfQ21uZCAqKSB0bXAtPlNDcC5wdHI7CisJCSAgICB0bXAtPnJlc3VsdCA9IChESURfQkFEX1RBUkdFVCA8PCAxNik7CisJCSAgICBpZiAodG1wLT5ob3N0X3NjcmliYmxlKSB7CisJCQkoKHN0cnVjdCBOQ1I1M2M3eDBfY21kICopdG1wLT5ob3N0X3NjcmliYmxlKS0+bmV4dCA9IAorCQkJICAgIGhvc3RkYXRhLT5mcmVlOworCQkJaG9zdGRhdGEtPmZyZWUgPSAKKwkJCSAgICAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKil0bXAtPmhvc3Rfc2NyaWJibGU7CisJCQl0bXAtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCQkgICAgfQorCQkgICAgdG1wLT5zY3NpX2RvbmUgKHRtcCk7CisJCSAgICBkb25lID0gMDsKKwkJfSBlbHNlIAorCQkgICAgZm9yICh0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSwgCisJCQlwcmV2ID0gTlVMTDsgdG1wOyBwcmV2ID0gdG1wLCB0bXAgPSAoU2NzaV9DbW5kICopIAorCQkJdG1wLT5TQ3AucHRyKSAKKwkJCWlmICghdG1wLT5ob3N0X3NjcmliYmxlIHx8IAorCQkJICAgICFidXN5cCAoaG9zdCwgaG9zdGRhdGEsIHRtcCkpIHsKKwkJCQlpZiAocHJldikKKwkJCQkgICAgcHJldi0+U0NwLnB0ciA9IHRtcC0+U0NwLnB0cjsKKwkJCQllbHNlCisJCQkJICAgIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IChTY3NpX0NtbmQgKikgCisJCQkJCXRtcC0+U0NwLnB0cjsKKwkJCSAgICB0bXAtPlNDcC5wdHIgPSBOVUxMOworCQkJICAgIGlmICh0bXAtPmhvc3Rfc2NyaWJibGUpIHsKKwkJCQlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfUVVFVUVTKSAKKwkJCQkgICAgcHJpbnRrICgic2NzaSVkIDogbW92aW5nIGNvbW1hbmQgZm9yIHRhcmdldCAlZCBsdW4gJWQgdG8gc3RhcnQgbGlzdFxuIiwKKwkJCQkJaG9zdC0+aG9zdF9ubywgdG1wLT5kZXZpY2UtPmlkLCB0bXAtPmRldmljZS0+bHVuKTsKKwkJCisKKwkJCSAgICAJdG9fc2NoZWR1bGVfbGlzdCAoaG9zdCwgaG9zdGRhdGEsIAorCQkJCSAgICAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikKKwkJCQkgICAgdG1wLT5ob3N0X3NjcmliYmxlKTsKKwkJCSAgICB9IGVsc2UgeworCQkJCWlmICgoKHRtcC0+cmVzdWx0ICYgMHhmZikgPT0gMHhmZikgfHwKKwkJCSAgICAJICAgICgodG1wLT5yZXN1bHQgJiAweGZmMDApID09IDB4ZmYwMCkpIHsKKwkJCQkgICAgcHJpbnRrICgic2NzaSVkIDogZGFuZ2VyIFdpbGwgUm9iaW5zb24hXG4iLAorCQkJCQlob3N0LT5ob3N0X25vKTsKKwkJCQkgICAgdG1wLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCQkJICAgIGRpc2FibGUgKGhvc3QpOworCQkJCX0KKwkJCQl0bXAtPnNjc2lfZG9uZSh0bXApOworCQkJICAgIH0KKwkJCSAgICBkb25lID0gMDsKKwkJCX0gLyogaWYgdGFyZ2V0L2x1biBpcyBub3QgYnVzeSAqLworCSAgICB9IC8qIGlmIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSAqLworCSAgICBpZiAoIWRvbmUpCisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICAJfSAvKiBmb3IgaG9zdCAqLworICAgIH0gd2hpbGUgKCFkb25lKTsKKyAgICBwcm9jZXNzX2lzc3VlX3F1ZXVlX3J1bm5pbmcgPSAwOworfQorCisvKgorICogRnVuY3Rpb24gOiBzdGF0aWMgdm9pZCBpbnRyX3Njc2kgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIAorICogCXN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQpCisgKgorICogUHVycG9zZSA6IGhhbmRsZSBhbGwgU0NTSSBpbnRlcnJ1cHRzLCBpbmRpY2F0ZWQgYnkgdGhlIHNldHRpbmcgCisgKiAJb2YgdGhlIFNJUCBiaXQgaW4gdGhlIElTVEFUIHJlZ2lzdGVyLgorICoKKyAqIElucHV0cyA6IGhvc3QsIGNtZCAtIGhvc3QgYW5kIE5DUiBjb21tYW5kIGNhdXNpbmcgdGhlIGludGVycnVwdCwgY21kCisgKiAJbWF5IGJlIE5VTEwuCisgKi8KKworc3RhdGljIHZvaWQgCitpbnRyX3Njc2kgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhID0gCisgICAgCShzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhWzBdOworICAgIHVuc2lnbmVkIGNoYXIgc3N0YXQwX3Npc3QwLCBzaXN0MSwgCQkvKiBSZWdpc3RlcnMgKi8KKwkgICAgZmF0YWw7IAkJCQkvKiBEaWQgYSBmYXRhbCBpbnRlcnJ1cHQgCisJCQkJCQkgICBvY2N1ciA/ICovCisgICAKKyAgICBOQ1I1M2M3eDBfbG9jYWxfc2V0dXAoaG9zdCk7CisKKyAgICBmYXRhbCA9IDA7CisKKyAgICBzc3RhdDBfc2lzdDAgPSBOQ1I1M2M3eDBfcmVhZDgoU1NUQVQwX1JFRyk7CisgICAgc2lzdDEgPSAwOworCisgICAgaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX0lOVFIpIAorCXByaW50ayAoInNjc2klZCA6IFNJU1QwIDB4JTB4LCBTSVNUMSAweCUweFxuIiwgaG9zdC0+aG9zdF9ubywKKwkgICAgc3N0YXQwX3Npc3QwLCBzaXN0MSk7CisKKyAgICAvKiAyNTBtcyBzZWxlY3Rpb24gdGltZW91dCAqLworICAgIGlmIChzc3RhdDBfc2lzdDAgJiBTU1RBVDBfNzAwX1NUTykgeworCWZhdGFsID0gMTsKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfSU5UUikgeworCSAgICBwcmludGsgKCJzY3NpJWQgOiBTZWxlY3Rpb24gVGltZW91dFxuIiwgaG9zdC0+aG9zdF9ubyk7CisgICAgCSAgICBpZiAoY21kKSB7CisgICAgCSAgICAJcHJpbnRrKCJzY3NpJWQgOiB0YXJnZXQgJWQsIGx1biAlZCwgY29tbWFuZCAiLAorCQkgICAgaG9zdC0+aG9zdF9ubywgY21kLT5jbWQtPmRldmljZS0+aWQsIGNtZC0+Y21kLT5kZXZpY2UtPmx1bik7CisgICAgCSAgICAJcHJpbnRfY29tbWFuZCAoY21kLT5jbWQtPmNtbmQpOworCQlwcmludGsoInNjc2klZCA6IGRzcCA9IDB4JXggKHZpcnQgMHglcClcbiIsIGhvc3QtPmhvc3Rfbm8sCisJCSAgICBOQ1I1M2M3eDBfcmVhZDMyKERTUF9SRUcpLAorCQkgICAgYnVzX3RvX3ZpcnQoTkNSNTNjN3gwX3JlYWQzMihEU1BfUkVHKSkpOworICAgIAkgICAgfSBlbHNlIHsKKyAgICAJICAgIAlwcmludGsoInNjc2klZCA6IG5vIGNvbW1hbmRcbiIsIGhvc3QtPmhvc3Rfbm8pOworICAgIAkgICAgfQorICAgIAl9CisvKgorICogWFhYIC0gcXVlc3Rpb24gOiBob3cgZG8gd2Ugd2FudCB0byBoYW5kbGUgdGhlIElsbGVnYWwgSW5zdHJ1Y3Rpb24KKyAqIAlpbnRlcnJ1cHQsIHdoaWNoIG1heSBvY2N1ciBiZWZvcmUgb3IgYWZ0ZXIgdGhlIFNlbGVjdGlvbiBUaW1lb3V0CisgKiAJaW50ZXJydXB0PworICovCisKKwlpZiAoMSkgeworCSAgICBob3N0ZGF0YS0+aWRsZSA9IDE7CisJICAgIGhvc3RkYXRhLT5leHBlY3Rpbmdfc3RvID0gMDsKKworCSAgICBpZiAoaG9zdGRhdGEtPnRlc3RfcnVubmluZykgeworCQlob3N0ZGF0YS0+dGVzdF9ydW5uaW5nID0gMDsKKwkJaG9zdGRhdGEtPnRlc3RfY29tcGxldGVkID0gMzsKKwkgICAgfSBlbHNlIGlmIChjbWQpIHsKKwkJYWJub3JtYWxfZmluaXNoZWQoY21kLCBESURfQkFEX1RBUkdFVCA8PCAxNik7CisJICAgIH0KKyNpZiAwCSAgICAKKwkgICAgaG9zdGRhdGEtPmludHJzID0gMDsKKyNlbmRpZgorCX0KKyAgICB9IAorCisvKgorICogRklYTUUgOiBpbiB0aGVvcnksIHdlIGNhbiBhbHNvIGdldCBhIFVEQyB3aGVuIGEgU1RPIG9jY3Vycy4KKyAqLworICAgIGlmIChzc3RhdDBfc2lzdDAgJiBTU1RBVDBfVURDKSB7CisJZmF0YWwgPSAxOworCWlmIChjbWQpIHsKKwkgICAgcHJpbnRrKCJzY3NpJWQgOiB0YXJnZXQgJWQgbHVuICVkIHVuZXhwZWN0ZWQgZGlzY29ubmVjdFxuIiwKKwkJaG9zdC0+aG9zdF9ubywgY21kLT5jbWQtPmRldmljZS0+aWQsIGNtZC0+Y21kLT5kZXZpY2UtPmx1bik7CisJICAgIHByaW50X2xvdHMgKGhvc3QpOworCSAgICBhYm5vcm1hbF9maW5pc2hlZChjbWQsIERJRF9FUlJPUiA8PCAxNik7CisJfSBlbHNlIAorCSAgICAgcHJpbnRrKCJzY3NpJWQgOiB1bmV4cGVjdGVkIGRpc2Nvbm5lY3QgKG5vIGNvbW1hbmQpXG4iLAorCQlob3N0LT5ob3N0X25vKTsKKworCWhvc3RkYXRhLT5kc3AgPSAodTMyICopIGhvc3RkYXRhLT5zY2hlZHVsZTsKKwlob3N0ZGF0YS0+ZHNwX2NoYW5nZWQgPSAxOworICAgIH0KKworICAgIC8qIFNDU0kgUEFSSVRZIGVycm9yICovCisgICAgaWYgKHNzdGF0MF9zaXN0MCAmIFNTVEFUMF9QQVIpIHsKKwlmYXRhbCA9IDE7CisJaWYgKGNtZCAmJiBjbWQtPmNtZCkgeworCSAgICBwcmludGsoInNjc2klZCA6IHRhcmdldCAlZCBsdW4gJWQgcGFyaXR5IGVycm9yLlxuIiwKKwkJaG9zdC0+aG9zdF9ubywgY21kLT5jbWQtPmRldmljZS0+aWQsIGNtZC0+Y21kLT5kZXZpY2UtPmx1bik7CisJICAgIGFibm9ybWFsX2ZpbmlzaGVkIChjbWQsIERJRF9QQVJJVFkgPDwgMTYpOyAKKwl9IGVsc2UKKwkgICAgcHJpbnRrKCJzY3NpJWQgOiBwYXJpdHkgZXJyb3JcbiIsIGhvc3QtPmhvc3Rfbm8pOworCS8qIFNob3VsZCBzZW5kIG1lc3NhZ2Ugb3V0LCBwYXJpdHkgZXJyb3IgKi8KKworCS8qIFhYWCAtIFJlZHVjZSBzeW5jaHJvbm91cyB0cmFuc2ZlciByYXRlISAqLworCWhvc3RkYXRhLT5kc3AgPSBob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfaW5pdGlhdG9yX2Fib3J0IC8KKyAgICAJICAgIHNpemVvZih1MzIpOworCWhvc3RkYXRhLT5kc3BfY2hhbmdlZCA9IDE7IAorICAgIC8qIFNDU0kgR1JPU1MgZXJyb3IgKi8KKyAgICB9IAorCisgICAgaWYgKHNzdGF0MF9zaXN0MCAmIFNTVEFUMF9TR0UpIHsKKwlmYXRhbCA9IDE7CisJcHJpbnRrKCJzY3NpJWQgOiBncm9zcyBlcnJvciwgc2F2ZWQyX2RzYSA9IDB4JXhcbiIsIGhvc3QtPmhvc3Rfbm8sCisJCQkJCSh1bnNpZ25lZCBpbnQpaG9zdGRhdGEtPnNhdmVkMl9kc2EpOworCXByaW50X2xvdHMgKGhvc3QpOworCQorCS8qIAorICAgICAgICAgKiBBIFNDU0kgZ3Jvc3MgZXJyb3IgbWF5IG9jY3VyIHdoZW4gd2UgaGF2ZSAKKwkgKgorCSAqIC0gQSBzeW5jaHJvbm91cyBvZmZzZXQgd2hpY2ggY2F1c2VzIHRoZSBTQ1NJIEZJRk8gdG8gYmUgb3ZlcndyaXR0ZW4uCisJICoKKwkgKiAtIEEgUkVRIHdoaWNoIGNhdXNlcyB0aGUgbWF4aW11bSBzeW5jaHJvbm91cyBvZmZzZXQgcHJvZ3JhbW1lZCBpbiAKKwkgKiAJdGhlIFNYRkVSIHJlZ2lzdGVyIHRvIGJlIGV4Y2VlZGVkLgorCSAqCisJICogLSBBIHBoYXNlIGNoYW5nZSB3aXRoIGFuIG91dHN0YW5kaW5nIHN5bmNocm9ub3VzIG9mZnNldC4KKwkgKgorCSAqIC0gUmVzaWR1YWwgZGF0YSBpbiB0aGUgc3luY2hyb25vdXMgZGF0YSBGSUZPLCB3aXRoIGEgdHJhbnNmZXIKKwkgKglvdGhlciB0aGFuIGEgc3luY2hyb25vdXMgcmVjZWl2ZSBpcyBzdGFydGVkLiQjCisJICovCisJCQorCisJLyogWFhYIFNob3VsZCBkZWR1Y2Ugc3luY2hyb25vdXMgdHJhbnNmZXIgcmF0ZSEgKi8KKwlob3N0ZGF0YS0+ZHNwID0gaG9zdGRhdGEtPnNjcmlwdCArIGhvc3RkYXRhLT5FX2luaXRpYXRvcl9hYm9ydCAvCisgICAgCSAgICBzaXplb2YodTMyKTsKKwlob3N0ZGF0YS0+ZHNwX2NoYW5nZWQgPSAxOworICAgIC8qIFBoYXNlIG1pc21hdGNoICovCisgICAgfSAKKworICAgIGlmIChzc3RhdDBfc2lzdDAgJiBTU1RBVDBfTUEpIHsKKwlmYXRhbCA9IDE7CisJaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX0lOVFIpCisJICAgIHByaW50ayAoInNjc2klZCA6IFNTVEFUMF9NQVxuIiwgaG9zdC0+aG9zdF9ubyk7CisJaW50cl9waGFzZV9taXNtYXRjaCAoaG9zdCwgY21kKTsKKyAgICB9CisKKyNpZiAwCisgICAgaWYgKHNzdGF0MF9zaXN0MCAmIFNJU1QwXzgwMF9SU0wpIAorCXByaW50ayAoInNjc2klZCA6IE9oIG5vIE1yLiBCaWxsIVxuIiwgaG9zdC0+aG9zdF9ubyk7CisjZW5kaWYKKyAgICAKKy8qCisgKiBJZiBhIGZhdGFsIFNDU0kgaW50ZXJydXB0IG9jY3Vycywgd2UgbXVzdCBpbnN1cmUgdGhhdCB0aGUgRE1BIGFuZAorICogU0NTSSBGSUZPcyB3ZXJlIGZsdXNoZWQuCisgKi8KKworICAgIGlmIChmYXRhbCkgeworCWlmICghaG9zdGRhdGEtPmRzdGF0X3ZhbGlkKSB7CisJICAgIGhvc3RkYXRhLT5kc3RhdCA9IE5DUjUzYzd4MF9yZWFkOChEU1RBVF9SRUcpOworCSAgICBob3N0ZGF0YS0+ZHN0YXRfdmFsaWQgPSAxOworCX0KKworCWlmICghKGhvc3RkYXRhLT5kc3RhdCAmIERTVEFUX0RGRSkpIHsKKwkgIHByaW50ayAoInNjc2klZCA6IERNQSBGSUZPIG5vdCBlbXB0eVxuIiwgaG9zdC0+aG9zdF9ubyk7CisJICAvKgorCSAgICogUmVhbGx5IG5lZWQgdG8gY2hlY2sgdGhpcyBjb2RlIGZvciA3MTAgIFJHSC4KKwkgICAqIEhhdm4ndCBzZWVuIGFueSBwcm9ibGVtcywgYnV0IG1heWJlIHdlIHNob3VsZCBGTFVTSCBiZWZvcmUKKwkgICAqIGNsZWFyaW5nIHNvbWV0aW1lcy4KKwkgICAqLworICAgICAgICAgIE5DUjUzYzd4MF93cml0ZTggKENURVNUOF9SRUcsIENURVNUOF8xMF9DTEYpOworICAgICAgICAgIHdoaWxlIChOQ1I1M2M3eDBfcmVhZDggKENURVNUOF9SRUcpICYgQ1RFU1Q4XzEwX0NMRikKKwkJOworCSAgaG9zdGRhdGEtPmRzdGF0IHw9IERTVEFUX0RGRTsKKyAgICAJfQorICAgIH0KK30KKworI2lmZGVmIENZQ0xJQ19UUkFDRQorCisvKgorICogVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRzIGEgY3ljbGljIGxvZyBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQsIGlmIHlvdSB0dXJuCisgKiBUUkFDRSBvbi4gIEl0IHdpbGwgYWxzbyBwcmludCB0aGUgbG9nIGZvciB5b3UuICBWZXJ5IHVzZWZ1bCB3aGVuIGRlYnVnZ2luZworICogNTNjNzEwIHN1cHBvcnQsIHBvc3NpYmx5IG5vdCByZWFsbHkgbmVlZGVkIGFueSBtb3JlLgorICovCisKK3UzMiBpbnNuX2xvZ1s0MDk2XTsKK3UzMiBpbnNuX2xvZ19pbmRleCA9IDA7CisKK3ZvaWQgbG9nMSAodTMyIGkpCit7CisJaW5zbl9sb2dbaW5zbl9sb2dfaW5kZXgrK10gPSBpOworCWlmIChpbnNuX2xvZ19pbmRleCA9PSA0MDk2KQorCQlpbnNuX2xvZ19pbmRleCA9IDA7Cit9CisKK3ZvaWQgbG9nX2luc24gKHUzMiAqaXApCit7CisJbG9nMSAoKHUzMilpcCk7CisJbG9nMSAoKmlwKTsKKwlsb2cxICgqKGlwKzEpKTsKKwlpZiAoKCgqaXAgPj4gMjQpICYgRENNRF9UWVBFX01BU0spID09IERDTURfVFlQRV9NTUkpCisJCWxvZzEgKCooaXArMikpOworfQorCit2b2lkIGR1bXBfbG9nKHZvaWQpCit7CisJaW50IGNudCA9IDA7CisJaW50IGkgPSBpbnNuX2xvZ19pbmRleDsKKwlpbnQgc2l6ZTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZmlyc3RfaG9zdDsKKworCXdoaWxlIChjbnQgPCA0MDk2KSB7CisJCXByaW50ayAoIiUwOHggKCslNngpOiAiLCBpbnNuX2xvZ1tpXSwgKGluc25fbG9nW2ldIC0gKHUzMikmKCgoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKWhvc3QtPmhvc3RkYXRhWzBdKS0+c2NyaXB0KSkvNCk7CisJCWlmICgrK2kgPT0gNDA5NikKKwkJCWkgPSAwOworCQljbnQrKzsKKwkJaWYgKCgoaW5zbl9sb2dbaV0gID4+IDI0KSAmIERDTURfVFlQRV9NQVNLKSA9PSBEQ01EX1RZUEVfTU1JKSAKKwkJCXNpemUgPSAzOworCQllbHNlCisJCQlzaXplID0gMjsKKwkJd2hpbGUgKHNpemUtLSkgeworCQkJcHJpbnRrICgiJTA4eCAiLCBpbnNuX2xvZ1tpXSk7CisJCQlpZiAoKytpID09IDQwOTYpCisJCQkJaSA9IDA7CisJCQljbnQrKzsKKwkJfQorCQlwcmludGsgKCJcbiIpOworCX0KK30KKyNlbmRpZgorCisKKy8qCisgKiBGdW5jdGlvbiA6IHN0YXRpYyB2b2lkIE5DUjUzYzd4MF9pbnRmbHkgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCisgKgorICogUHVycG9zZSA6IFNjYW4gY29tbWFuZCBxdWV1ZSBmb3Igc3BlY2lmaWVkIGhvc3QsIGxvb2tpbmcgZm9yIGNvbXBsZXRlZAorICogICAgICAgICAgIGNvbW1hbmRzLgorICogCisgKiBJbnB1dHMgOiBTY3NpX0hvc3QgcG9pbnRlci4KKyAqCisgKiAJVGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIHdoZW4gYSBzaW11bGF0ZWQgSU5URkxZCisgKiAJaW50ZXJydXB0IG9jY3Vycy4KKyAqLworCitzdGF0aWMgdm9pZAorTkNSNTNjN3gwX2ludGZseSAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhOwkvKiBob3N0LT5ob3N0ZGF0YVswXSAqLworICAgIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQsCQkJLyogY29tbWFuZCB3aGljaCBoYWx0ZWQgKi8KKwkqKmNtZF9wcmV2X3B0cjsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwkJCQkKKyAgICBjaGFyIHNlYXJjaF9mb3VuZCA9IDA7CQkJLyogR290IGF0IGxlYXN0IG9uZSA/ICovCisKKyAgICBob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhWzBdOworICAgIE5DUjUzYzd4MF9sb2NhbF9zZXR1cChob3N0KTsKKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19JTlRSKQorICAgIHByaW50ayAoInNjc2klZCA6IElOVEZMWVxuIiwgaG9zdC0+aG9zdF9ubyk7IAorCisgICAgLyoKKyAgICAqIFRyYXZlcnNlIG91ciBsaXN0IG9mIHJ1bm5pbmcgY29tbWFuZHMsIGFuZCBsb29rCisgICAgKiBmb3IgdGhvc2Ugd2l0aCB2YWxpZCAobm9uLTB4ZmYgZmYpIHN0YXR1cyBhbmQgbWVzc2FnZQorICAgICogYnl0ZXMgZW5jb2RlZCBpbiB0aGUgcmVzdWx0IHdoaWNoIHNpZ25pZnkgY29tbWFuZAorICAgICogY29tcGxldGlvbi4KKyAgICAqLworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworcmVzdGFydDoKKyAgICBmb3IgKGNtZF9wcmV2X3B0ciA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKikmKGhvc3RkYXRhLT5ydW5uaW5nX2xpc3QpLAorCWNtZCA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKSBob3N0ZGF0YS0+cnVubmluZ19saXN0OyBjbWQgOworCWNtZF9wcmV2X3B0ciA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKikgJihjbWQtPm5leHQpLCAKKyAgICAJY21kID0gKHN0cnVjdCBOQ1I1M2M3eDBfY21kICopIGNtZC0+bmV4dCkKKyAgICB7CisJU2NzaV9DbW5kICp0bXA7CisKKwlpZiAoIWNtZCkgeworCSAgICBwcmludGsoInNjc2klZCA6IHZlcnkgd2VpcmQuXG4iLCBob3N0LT5ob3N0X25vKTsKKwkgICAgYnJlYWs7CisJfQorCisJaWYgKCEodG1wID0gY21kLT5jbWQpKSB7CisJICAgIHByaW50aygic2NzaSVkIDogd2VpcmQuICBOQ1I1M2M3eDBfY21kIGhhcyBubyBTY3NpX0NtbmRcbiIsCisJCSAgICBob3N0LT5ob3N0X25vKTsKKwkgICAgY29udGludWU7CisJfQorCS8qIENvcHkgdGhlIHJlc3VsdCBvdmVyIG5vdzsgbWF5IG5vdCBiZSBjb21wbGV0ZSwKKwkgKiBidXQgc3Vic2VxdWVudCB0ZXN0cyBtYXkgYXMgd2VsbCBiZSBkb25lIG9uCisJICogY2FjaGVkIG1lbW9yeS4KKwkgKi8KKwl0bXAtPnJlc3VsdCA9IGNtZC0+cmVzdWx0OworCisJaWYgKCgodG1wLT5yZXN1bHQgJiAweGZmKSA9PSAweGZmKSB8fAorCQkJICAgICgodG1wLT5yZXN1bHQgJiAweGZmMDApID09IDB4ZmYwMCkpCisJICAgIGNvbnRpbnVlOworCisJc2VhcmNoX2ZvdW5kID0gMTsKKworCWlmIChjbWQtPmJvdW5jZS5sZW4pCisJICAgIG1lbWNweSAoKHZvaWQgKiljbWQtPmJvdW5jZS5hZGRyLAorCQkJCSh2b2lkICopY21kLT5ib3VuY2UuYnVmLCBjbWQtPmJvdW5jZS5sZW4pOworCisJLyogSW1wb3J0YW50IC0gcmVtb3ZlIGZyb20gbGlzdCBfYmVmb3JlXyBkb25lIGlzIGNhbGxlZCAqLworCWlmIChjbWRfcHJldl9wdHIpCisJICAgICpjbWRfcHJldl9wdHIgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgY21kLT5uZXh0OworCisJLS1ob3N0ZGF0YS0+YnVzeVt0bXAtPmRldmljZS0+aWRdW3RtcC0+ZGV2aWNlLT5sdW5dOworCWNtZC0+bmV4dCA9IGhvc3RkYXRhLT5mcmVlOworCWhvc3RkYXRhLT5mcmVlID0gY21kOworCisJdG1wLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworCWlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19JTlRSKSB7CisJICAgIHByaW50ayAoInNjc2klZCA6IGNvbW1hbmQgY29tcGxldGUgOiBwaWQgJWx1LCBpZCAlZCxsdW4gJWQgcmVzdWx0IDB4JXggIiwgCisJCSAgaG9zdC0+aG9zdF9ubywgdG1wLT5waWQsIHRtcC0+ZGV2aWNlLT5pZCwgdG1wLT5kZXZpY2UtPmx1biwgdG1wLT5yZXN1bHQpOworCSAgICBwcmludF9jb21tYW5kICh0bXAtPmNtbmQpOworCX0KKworCXRtcC0+c2NzaV9kb25lKHRtcCk7CisJZ290byByZXN0YXJ0OworICAgIH0KKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICBpZiAoIXNlYXJjaF9mb3VuZCkgIHsKKwlwcmludGsgKCJzY3NpJWQgOiBXQVJOSU5HIDogSU5URkxZIHdpdGggbm8gY29tcGxldGVkIGNvbW1hbmRzLlxuIiwKKwkJCSAgICBob3N0LT5ob3N0X25vKTsKKyAgICB9IGVsc2UgeworCXJ1bl9wcm9jZXNzX2lzc3VlX3F1ZXVlKCk7CisgICAgfQorICAgIHJldHVybjsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogc3RhdGljIGlycXJldHVybl90IE5DUjUzYzd4MF9pbnRyIChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKKyAqCisgKiBQdXJwb3NlIDogaGFuZGxlIE5DUjUzYzd4MCBpbnRlcnJ1cHRzIGZvciBhbGwgTkNSIGRldmljZXMgc2hhcmluZworICoJdGhlIHNhbWUgSVJRIGxpbmUuICAKKyAqIAorICogSW5wdXRzIDogU2luY2Ugd2UncmUgdXNpbmcgdGhlIFNBX0lOVEVSUlVQVCBpbnRlcnJ1cHQgaGFuZGxlcgorICoJc2VtYW50aWNzLCBpcnEgaW5kaWNhdGVzIHRoZSBpbnRlcnJ1cHQgd2hpY2ggaW52b2tlZCAKKyAqCXRoaXMgaGFuZGxlci4gIAorICoKKyAqIE9uIHRoZSA3MTAgd2Ugc2ltdWFsdGUgYW4gSU5URkxZIHdpdGggYSBzY3JpcHQgaW50ZXJydXB0LCBhbmQgdGhlCisgKiBzY3JpcHQgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCBjYWxsIGJhY2sgdG8gdGhpcyBmdW5jdGlvbi4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QKK05DUjUzYzd4MF9pbnRyIChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CQkJLyogSG9zdCB3ZSBhcmUgbG9va2luZyBhdCAqLworICAgIHVuc2lnbmVkIGNoYXIgaXN0YXQ7IAkJCS8qIFZhbHVlcyBvZiBpbnRlcnJ1cHQgcmVncyAqLworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhOwkvKiBob3N0LT5ob3N0ZGF0YVswXSAqLworICAgIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQ7CQkJLyogY29tbWFuZCB3aGljaCBoYWx0ZWQgKi8KKyAgICB1MzIgKmRzYTsJCQkJCS8qIERTQSAqLworICAgIGludCBoYW5kbGVkID0gMDsKKworI2lmZGVmIE5DUl9ERUJVRworICAgIGNoYXIgYnVmWzgwXTsJCQkJLyogRGVidWdnaW5nIHNwcmludGYgYnVmZmVyICovCisgICAgc2l6ZV90IGJ1ZmxlbjsJCQkJLyogTGVuZ3RoIG9mIHNhbWUgKi8KKyNlbmRpZgorCisgICAgaG9zdCAgICAgPSAoc3RydWN0IFNjc2lfSG9zdCAqKWRldl9pZDsKKyAgICBob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhWzBdOworICAgIE5DUjUzYzd4MF9sb2NhbF9zZXR1cChob3N0KTsKKworICAgIC8qCisgICAgICogT25seSByZWFkIGlzdGF0IG9uY2UgcGVyIGxvb3AsIHNpbmNlIHJlYWRpbmcgaXQgYWdhaW4gd2lsbCB1bnN0YWNrCisgICAgICogaW50ZXJydXB0cworICAgICAqLworCisgICAgd2hpbGUgKChpc3RhdCA9IE5DUjUzYzd4MF9yZWFkOChob3N0ZGF0YS0+aXN0YXQpKSAmIChJU1RBVF9TSVB8SVNUQVRfRElQKSkgeworCWhhbmRsZWQgPSAxOworCWhvc3RkYXRhLT5kc3BfY2hhbmdlZCA9IDA7CisJaG9zdGRhdGEtPmRzdGF0X3ZhbGlkID0gMDsKKyAgICAJaG9zdGRhdGEtPnN0YXRlID0gU1RBVEVfSEFMVEVEOworCisJaWYgKE5DUjUzYzd4MF9yZWFkOCAoU1NUQVQyX1JFRykgJiBTU1RBVDJfRkZfTUFTSykgCisJICAgIHByaW50ayAoInNjc2klZCA6IFNDU0kgRklGTyBub3QgZW1wdHlcbiIsIGhvc3QtPmhvc3Rfbm8pOworCisJLyoKKwkgKiBOQ1I1M2M3MDAgYW5kIE5DUjUzYzcwMC02NiBjaGFuZ2UgdGhlIGN1cnJlbnQgU0NTSQorCSAqIHByb2Nlc3MsIGhvc3RkYXRhLT5uY3JjdXJyZW50LCBpbiB0aGUgTGludXggZHJpdmVyIHNvCisJICogY21kID0gaG9zdGRhdGEtPm5jcmN1cnJlbnQuCisJICoKKwkgKiBXaXRoIG90aGVyIGNoaXBzLCB3ZSBtdXN0IGxvb2sgdGhyb3VnaCB0aGUgY29tbWFuZHMKKwkgKiBleGVjdXRpbmcgYW5kIGZpbmQgdGhlIGNvbW1hbmQgc3RydWN0dXJlIHdoaWNoIAorCSAqIGNvcnJlc3BvbmRzIHRvIHRoZSBEU0EgcmVnaXN0ZXIuCisJICovCisKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fNzAwKSB7CisJICAgIGNtZCA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKSBob3N0ZGF0YS0+bmNyY3VycmVudDsKKwl9IGVsc2UgeworCSAgICBkc2EgPSBidXNfdG9fdmlydChOQ1I1M2M3eDBfcmVhZDMyKERTQV9SRUcpKTsKKwkgICAgZm9yIChjbWQgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgaG9zdGRhdGEtPnJ1bm5pbmdfbGlzdDsKKwkJY21kICYmIChkc2EgKyAoaG9zdGRhdGEtPmRzYV9zdGFydCAvIHNpemVvZih1MzIpKSkgIT0gY21kLT5kc2E7CisJCSAgICBjbWQgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikoY21kLT5uZXh0KSkKKwkJOworCX0KKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfSU5UUikgeworCSAgICBpZiAoY21kKSB7CisJCXByaW50aygic2NzaSVkIDogaW50ZXJydXB0IGZvciBwaWQgJWx1LCBpZCAlZCwgbHVuICVkICIsIAorCQkgICAgaG9zdC0+aG9zdF9ubywgY21kLT5jbWQtPnBpZCwgKGludCkgY21kLT5jbWQtPmRldmljZS0+aWQsCisJCSAgICAoaW50KSBjbWQtPmNtZC0+ZGV2aWNlLT5sdW4pOworCQlwcmludF9jb21tYW5kIChjbWQtPmNtZC0+Y21uZCk7CisJICAgIH0gZWxzZSB7CisJCXByaW50aygic2NzaSVkIDogbm8gYWN0aXZlIGNvbW1hbmRcbiIsIGhvc3QtPmhvc3Rfbm8pOworCSAgICB9CisJfQorCQorCWlmIChpc3RhdCAmIElTVEFUX1NJUCkgeworCSAgICBpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfSU5UUikgCisJCXByaW50ayAoInNjc2klZCA6IElTVEFUX1NJUFxuIiwgaG9zdC0+aG9zdF9ubyk7CisJICAgIGludHJfc2NzaSAoaG9zdCwgY21kKTsKKwl9CisJCisJaWYgKGlzdGF0ICYgSVNUQVRfRElQKSB7CisJICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19JTlRSKSAKKwkJcHJpbnRrICgic2NzaSVkIDogSVNUQVRfRElQXG4iLCBob3N0LT5ob3N0X25vKTsKKwkgICAgaW50cl9kbWEgKGhvc3QsIGNtZCk7CisJfQorCQorCWlmICghaG9zdGRhdGEtPmRzdGF0X3ZhbGlkKSB7CisJICAgIGhvc3RkYXRhLT5kc3RhdCA9IE5DUjUzYzd4MF9yZWFkOChEU1RBVF9SRUcpOworCSAgICBob3N0ZGF0YS0+ZHN0YXRfdmFsaWQgPSAxOworCX0KKwkKKwlpZiAoIShob3N0ZGF0YS0+ZHN0YXQgJiBEU1RBVF9ERkUpKSB7CisJICAgIHByaW50ayAoInNjc2klZCA6IERNQSBGSUZPIG5vdCBlbXB0eVxuIiwgaG9zdC0+aG9zdF9ubyk7CisJICAgIC8qIFJlYWxseSBuZWVkIHRvIGNoZWNrIHRoaXMgb3V0IGZvciA3MTAgUkdIICovCisJICAgIE5DUjUzYzd4MF93cml0ZTggKENURVNUOF9SRUcsIENURVNUOF8xMF9DTEYpOworCSAgICB3aGlsZSAoTkNSNTNjN3gwX3JlYWQ4IChDVEVTVDhfUkVHKSAmIENURVNUOF8xMF9DTEYpCisJCTsKKwkgICAgaG9zdGRhdGEtPmRzdGF0IHw9IERTVEFUX0RGRTsKKwl9CisKKwlpZiAoIWhvc3RkYXRhLT5pZGxlICYmIGhvc3RkYXRhLT5zdGF0ZSA9PSBTVEFURV9IQUxURUQpIHsKKwkgICAgaWYgKCFob3N0ZGF0YS0+ZHNwX2NoYW5nZWQpCisJCWhvc3RkYXRhLT5kc3AgPSAodTMyICopYnVzX3RvX3ZpcnQoTkNSNTNjN3gwX3JlYWQzMihEU1BfUkVHKSk7CisjaWYgMAorCSAgICBwcmludGsoInNjc2klZCA6IG5ldyBkc3AgaXMgMHglbHggKHZpcnQgMHglcClcbiIsCisJCWhvc3QtPmhvc3Rfbm8sICB2aXJ0X3RvX2J1cyhob3N0ZGF0YS0+ZHNwKSwgaG9zdGRhdGEtPmRzcCk7CisjZW5kaWYKKwkJCisJICAgIGhvc3RkYXRhLT5zdGF0ZSA9IFNUQVRFX1JVTk5JTkc7CisJICAgIE5DUjUzYzd4MF93cml0ZTMyIChEU1BfUkVHLCB2aXJ0X3RvX2J1cyhob3N0ZGF0YS0+ZHNwKSk7CisJICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19UUkFDRSkgeworI2lmZGVmIENZQ0xJQ19UUkFDRQorCQlsb2dfaW5zbiAoaG9zdGRhdGEtPmRzcCk7CisjZWxzZQorCSAgICAJcHJpbnRfaW5zbiAoaG9zdCwgaG9zdGRhdGEtPmRzcCwgInQgIiwgMSk7CisjZW5kaWYKKwkJTkNSNTNjN3gwX3dyaXRlOCAoRENOVExfUkVHLAorCQkJaG9zdGRhdGEtPnNhdmVkX2RjbnRsIHwgRENOVExfU1NNIHwgRENOVExfU1REKTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKy8qIAorICogRnVuY3Rpb24gOiBzdGF0aWMgaW50IGFib3J0X2Nvbm5lY3RlZCAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKKyAqCisgKiBQdXJwb3NlIDogQXNzdW1pbmcgdGhhdCB0aGUgTkNSIFNDU0kgcHJvY2Vzc29yIGlzIGN1cnJlbnRseSAKKyAqIAloYWx0ZWQsIGJyZWFrIHRoZSBjdXJyZW50bHkgZXN0YWJsaXNoZWQgbmV4dXMuICBDbGVhbgorICoJdXAgb2YgdGhlIE5DUjUzYzd4MF9jbWQgYW5kIFNjc2lfQ21uZCBzdHJ1Y3R1cmVzIHNob3VsZAorICoJYmUgZG9uZSBvbiByZWNlaXB0IG9mIHRoZSBhYm9ydCBpbnRlcnJ1cHQuCisgKgorICogSW5wdXRzIDogaG9zdCAtIFNDU0kgaG9zdAorICoKKyAqLworCitzdGF0aWMgaW50IAorYWJvcnRfY29ubmVjdGVkIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KSB7CisjaWZkZWYgTkVXX0FCT1JUCisgICAgTkNSNTNjN3gwX2xvY2FsX2RlY2xhcmUoKTsKKyNlbmRpZgorICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikKKwlob3N0LT5ob3N0ZGF0YVswXTsKKy8qIEZJWE1FIDogdGhpcyBwcm9iYWJseSBzaG91bGQgY2hhbmdlIGZvciBwcm9kdWN0aW9uIGtlcm5lbHM7IGF0IHRoZSAKKyAgIGxlYXN0LCBjb3VudGVyIHNob3VsZCBtb3ZlIHRvIGEgcGVyLWhvc3Qgc3RydWN0dXJlLiAqLworICAgIHN0YXRpYyBpbnQgY291bnRlciA9IDU7CisjaWZkZWYgTkVXX0FCT1JUCisgICAgaW50IHNzdGF0LCBwaGFzZSwgb2Zmc2V0OworICAgIHUzMiAqc2NyaXB0OworICAgIE5DUjUzYzd4MF9sb2NhbF9zZXR1cChob3N0KTsKKyNlbmRpZgorCisgICAgaWYgKC0tY291bnRlciA8PSAwKSB7CisJZGlzYWJsZShob3N0KTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBwcmludGsgKCJzY3NpJWQgOiBEQU5HRVIgOiBhYm9ydF9jb25uZWN0ZWQoKSBjYWxsZWQgXG4iLAorCWhvc3QtPmhvc3Rfbm8pOworCisjaWZkZWYgTkVXX0FCT1JUCisKKy8qCisgKiBOZXcgc3RyYXRlZ3kgOiBSYXRoZXIgdGhhbiB1c2luZyBhIGdlbmVyaWMgYWJvcnQgcm91dGluZSwKKyAqIHdlJ2xsIHNwZWNpZmljYWxseSB0cnkgdG8gc291cmNlIG9yIHNpbmsgdGhlIGFwcHJvcHJpYXRlCisgKiBhbW91bnQgb2YgZGF0YSBmb3IgdGhlIHBoYXNlIHdlJ3JlIGN1cnJlbnRseSBpbiAodGFraW5nIGludG8gCisgKiBhY2NvdW50IHRoZSBjdXJyZW50IHN5bmNocm9ub3VzIG9mZnNldCkgCisgKi8KKworICAgIHNzdGF0ID0gKE5DUjUzYzh4MF9yZWFkOCAoU1NUQVQyX1JFRyk7CisgICAgb2Zmc2V0ID0gT0ZGU0VUIChzc3RhdCAmIFNTVEFUMl9GRl9NQVNLKSA+PiBTU1RBVDJfRkZfU0hJRlQ7CisgICAgcGhhc2UgPSBzc3RhdCAmIFNTVEFUMl9QSEFTRV9NQVNLOworCisvKgorICogU0VUIEFUTgorICogTU9WRSBzb3VyY2Vfb3Jfc2luaywgV0hFTiBDVVJSRU5UIFBIQVNFIAorICogPCByZXBlYXQgZm9yIGVhY2ggb3V0c3RhbmRpbmcgYnl0ZSA+CisgKiBKVU1QIHNlbmRfYWJvcnRfbWVzc2FnZQorICovCisKKyAgICBzY3JpcHQgPSBob3N0ZGF0YS0+YWJvcnRfc2NyaXB0ID0ga21hbGxvYyAoCisJOCAgLyogaW5zdHJ1Y3Rpb24gc2l6ZSAqLyAqICgKKwkgICAgMSAvKiBzZXQgQVROICovICsKKwkgICAgKCFvZmZzZXQgPyAxIDogb2Zmc2V0KSAvKiBPbmUgdHJhbnNmZXIgcGVyIG91dHN0YW5kaW5nIGJ5dGUgKi8gKworCSAgICAxIC8qIHNlbmQgYWJvcnQgbWVzc2FnZSAqLyksCisJR0ZQX0FUT01JQyk7CisKKworI2Vsc2UgLyogZGVmIE5FV19BQk9SVCAqLworICAgIGhvc3RkYXRhLT5kc3AgPSBob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfaW5pdGlhdG9yX2Fib3J0IC8KKwkgICAgc2l6ZW9mKHUzMik7CisjZW5kaWYgLyogZGVmIE5FV19BQk9SVCAqLworICAgIGhvc3RkYXRhLT5kc3BfY2hhbmdlZCA9IDE7CisKKy8qIFhYWCAtIG5lZWQgdG8gZmxhZyB0aGUgY29tbWFuZCBhcyBhYm9ydGVkIGFmdGVyIHRoZSBhYm9ydF9jb25uZWN0ZWQKKyAJIGNvZGUgcnVucyAKKyAqLworICAgIHJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gOiBzdGF0aWMgaW50IGRhdGFwYXRoX3Jlc2lkdWFsIChTY3NpX0hvc3QgKmhvc3QpCisgKgorICogUHVycG9zZSA6IHJldHVybiByZXNpZHVhbCBkYXRhIGNvdW50IG9mIHdoYXQncyBpbiB0aGUgY2hpcC4KKyAqCisgKiBJbnB1dHMgOiBob3N0IC0gU0NTSSBob3N0CisgKi8KKworc3RhdGljIGludAorZGF0YXBhdGhfcmVzaWR1YWwgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIGludCBjb3VudCwgc3luY2hyb25vdXMsIHNzdGF0OworICAgIHVuc2lnbmVkIGludCBkZGlyOworCisgICAgTkNSNTNjN3gwX2xvY2FsX3NldHVwKGhvc3QpOworICAgIC8qIENPTVBBVCA6IHRoZSA3MDAgYW5kIDcwMC02NiBuZWVkIHRvIHVzZSBERklGT18wMF9CT19NQVNLICovCisgICAgY291bnQgPSAoKE5DUjUzYzd4MF9yZWFkOCAoREZJRk9fUkVHKSAmIERGSUZPXzEwX0JPX01BU0spIC0KKwkoTkNSNTNjN3gwX3JlYWQzMiAoREJDX1JFRykgJiBERklGT18xMF9CT19NQVNLKSkgJiBERklGT18xMF9CT19NQVNLOworICAgIHN5bmNocm9ub3VzID0gTkNSNTNjN3gwX3JlYWQ4IChTWEZFUl9SRUcpICYgU1hGRVJfTU9fTUFTSzsKKyAgICAvKiBDT01QQVQgOiBERElSIGlzIGVsc2V3aGVyZSBvbiBub24tJzh4eCBjaGlwcy4gKi8KKyAgICBkZGlyID0gTkNSNTNjN3gwX3JlYWQ4IChDVEVTVDBfUkVHXzcwMCkgJiBDVEVTVDBfNzAwX0RESVI7CisKKyAgICBpZiAoZGRpcikgeworICAgIC8qIFJlY2VpdmUgKi8KKwlpZiAoc3luY2hyb25vdXMpIAorCSAgICBjb3VudCArPSAoTkNSNTNjN3gwX3JlYWQ4IChTU1RBVDJfUkVHKSAmIFNTVEFUMl9GRl9NQVNLKSA+PiBTU1RBVDJfRkZfU0hJRlQ7CisJZWxzZQorCSAgICBpZiAoTkNSNTNjN3gwX3JlYWQ4IChTU1RBVDFfUkVHKSAmIFNTVEFUMV9JTEYpCisJCSsrY291bnQ7CisgICAgfSBlbHNlIHsKKyAgICAvKiBTZW5kICovCisJc3N0YXQgPSBOQ1I1M2M3eDBfcmVhZDggKFNTVEFUMV9SRUcpOworCWlmIChzc3RhdCAmIFNTVEFUMV9PTEYpCisJICAgICsrY291bnQ7CisJaWYgKHN5bmNocm9ub3VzICYmIChzc3RhdCAmIFNTVEFUMV9PUkYpKQorCSAgICArK2NvdW50OworICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qIAorICogRnVuY3Rpb24gOiBzdGF0aWMgY29uc3QgY2hhciAqIHNiY2xfdG9fcGhhc2UgKGludCBzYmNsKV8KKyAqCisgKiBQdXJwb3NlIDogQ29udmVydCBTQkNMIHJlZ2lzdGVyIHRvIHVzZXItcGFyc2FibGUgcGhhc2UgcmVwcmVzZW50YXRpb24KKyAqCisgKiBJbnB1dHMgOiBzYmNsIC0gdmFsdWUgb2Ygc2JjbCByZWdpc3RlcgorICovCisKKworc3RhdGljIGNvbnN0IGNoYXIgKgorc2JjbF90b19waGFzZSAoaW50IHNiY2wpIHsKKyAgICBzd2l0Y2ggKHNiY2wgJiBTQkNMX1BIQVNFX01BU0spIHsKKyAgICBjYXNlIFNCQ0xfUEhBU0VfREFUQUlOOgorCXJldHVybiAiREFUQUlOIjsKKyAgICBjYXNlIFNCQ0xfUEhBU0VfREFUQU9VVDoKKwlyZXR1cm4gIkRBVEFPVVQiOworICAgIGNhc2UgU0JDTF9QSEFTRV9NU0dJTjoKKwlyZXR1cm4gIk1TR0lOIjsKKyAgICBjYXNlIFNCQ0xfUEhBU0VfTVNHT1VUOgorCXJldHVybiAiTVNHT1VUIjsKKyAgICBjYXNlIFNCQ0xfUEhBU0VfQ01ET1VUOgorCXJldHVybiAiQ01ET1VUIjsKKyAgICBjYXNlIFNCQ0xfUEhBU0VfU1RBVElOOgorCXJldHVybiAiU1RBVFVTSU4iOworICAgIGRlZmF1bHQ6CisJcmV0dXJuICJ1bmtub3duIjsKKyAgICB9Cit9CisKKy8qIAorICogRnVuY3Rpb24gOiBzdGF0aWMgY29uc3QgY2hhciAqIHNzdGF0Ml90b19waGFzZSAoaW50IHNzdGF0KV8KKyAqCisgKiBQdXJwb3NlIDogQ29udmVydCBTU1RBVDIgcmVnaXN0ZXIgdG8gdXNlci1wYXJzYWJsZSBwaGFzZSByZXByZXNlbnRhdGlvbgorICoKKyAqIElucHV0cyA6IHNzdGF0IC0gdmFsdWUgb2Ygc3N0YXQgcmVnaXN0ZXIKKyAqLworCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3NzdGF0Ml90b19waGFzZSAoaW50IHNzdGF0KSB7CisgICAgc3dpdGNoIChzc3RhdCAmIFNTVEFUMl9QSEFTRV9NQVNLKSB7CisgICAgY2FzZSBTU1RBVDJfUEhBU0VfREFUQUlOOgorCXJldHVybiAiREFUQUlOIjsKKyAgICBjYXNlIFNTVEFUMl9QSEFTRV9EQVRBT1VUOgorCXJldHVybiAiREFUQU9VVCI7CisgICAgY2FzZSBTU1RBVDJfUEhBU0VfTVNHSU46CisJcmV0dXJuICJNU0dJTiI7CisgICAgY2FzZSBTU1RBVDJfUEhBU0VfTVNHT1VUOgorCXJldHVybiAiTVNHT1VUIjsKKyAgICBjYXNlIFNTVEFUMl9QSEFTRV9DTURPVVQ6CisJcmV0dXJuICJDTURPVVQiOworICAgIGNhc2UgU1NUQVQyX1BIQVNFX1NUQVRJTjoKKwlyZXR1cm4gIlNUQVRVU0lOIjsKKyAgICBkZWZhdWx0OgorCXJldHVybiAidW5rbm93biI7CisgICAgfQorfQorCisvKiAKKyAqIEZ1bmN0aW9uIDogc3RhdGljIHZvaWQgaW50cl9waGFzZV9taXNtYXRjaCAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgCisgKglzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqY21kKQorICoKKyAqIFB1cnBvc2UgOiBIYW5kbGUgcGhhc2UgbWlzbWF0Y2ggaW50ZXJydXB0cworICoKKyAqIElucHV0cyA6IGhvc3QsIGNtZCAtIGhvc3QgYW5kIE5DUiBjb21tYW5kIGNhdXNpbmcgdGhlIGludGVycnVwdCwgY21kCisgKiAJbWF5IGJlIE5VTEwuCisgKgorICogU2lkZSBlZmZlY3RzIDogVGhlIGFib3J0X2Nvbm5lY3RlZCgpIHJvdXRpbmUgaXMgY2FsbGVkIG9yIHRoZSBOQ1IgY2hpcCAKKyAqCWlzIHJlc3RhcnRlZCwganVtcGluZyB0byB0aGUgY29tbWFuZF9jb21wbGV0ZSBlbnRyeSBwb2ludCwgb3IgCisgKglwYXRjaGluZyB0aGUgYWRkcmVzcyBhbmQgdHJhbnNmZXIgY291bnQgb2YgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gCisgKglhbmQgY2FsbGluZyB0aGUgbXNnX2luIGVudHJ5IHBvaW50IGFzIGFwcHJvcHJpYXRlLgorICovCisKK3N0YXRpYyB2b2lkIAoraW50cl9waGFzZV9taXNtYXRjaCAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgc3RydWN0IE5DUjUzYzd4MF9jbWQgKmNtZCkgeworICAgIE5DUjUzYzd4MF9sb2NhbF9kZWNsYXJlKCk7CisgICAgdTMyIGRiY19kY21kLCAqZHNwLCAqZHNwX25leHQ7CisgICAgdW5zaWduZWQgY2hhciBkY21kLCBzYmNsOworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikKKyAgICAJaG9zdC0+aG9zdGRhdGFbMF07CisgICAgaW50IHJlc2lkdWFsOworICAgIGVudW0ge0FDVElPTl9BQk9SVCwgQUNUSU9OX0FCT1JUX1BSSU5ULCBBQ1RJT05fQ09OVElOVUV9IGFjdGlvbiA9IAorCUFDVElPTl9BQk9SVF9QUklOVDsKKyAgICBjb25zdCBjaGFyICp3aGVyZSA9IE5VTEw7CisKKyAgICBOQ1I1M2M3eDBfbG9jYWxfc2V0dXAoaG9zdCk7CisKKyAgICAvKgorICAgICAqIENvcnJlY3RpdmUgYWN0aW9uIGlzIGJhc2VkIG9uIHdoZXJlIGluIHRoZSBTQ1NJIFNDUklQVCh0bSkgdGhlIGVycm9yIAorICAgICAqIG9jY3VycmVkLCBhcyB3ZWxsIGFzIHdoaWNoIFNDU0kgcGhhc2Ugd2UgYXJlIGN1cnJlbnRseSBpbi4KKyAgICAgKi8KKyAgICBkc3BfbmV4dCA9IGJ1c190b192aXJ0KE5DUjUzYzd4MF9yZWFkMzIoRFNQX1JFRykpOworCisgICAgLyogCisgICAgICogRmV0Y2ggdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24sIGFuZCByZW1vdmUgdGhlIG9wZXJhbmRzIGZvciBlYXNpZXIgCisgICAgICogaW50ZXJwcmV0YXRpb24uCisgICAgICovCisgICAgZGJjX2RjbWQgPSBOQ1I1M2M3eDBfcmVhZDMyKERCQ19SRUcpOworICAgIGRjbWQgPSAoZGJjX2RjbWQgJiAweGZmMDAwMDAwKSA+PiAyNDsKKyAgICAvKgorICAgICAqIExpa2Ugb3RoZXIgcHJvY2Vzc29ycywgdGhlIE5DUiBhZGp1c3RzIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIGJlZm9yZQorICAgICAqIGluc3RydWN0aW9uIGRlY29kZS4gIFNldCB0aGUgRFNQIGFkZHJlc3MgYmFjayB0byB3aGF0IGl0IHNob3VsZAorICAgICAqIGJlIGZvciB0aGlzIGluc3RydWN0aW9uIGJhc2VkIG9uIGl0cyBzaXplICgyIG9yIDMgMzIgYml0IHdvcmRzKS4KKyAgICAgKi8KKyAgICBkc3AgPSBkc3BfbmV4dCAtIE5DUjUzYzd4MF9pbnNuX3NpemUoZGNtZCk7CisKKworICAgIC8qCisgICAgICogUmVhZCBuZXcgU0NTSSBwaGFzZSBmcm9tIHRoZSBTQkNMIGxpbmVzLiAgU2luY2UgYWxsIG9mIG91ciBjb2RlIHVzZXMgCisgICAgICogYSBXSEVOIGNvbmRpdGlvbmFsIGluc3RlYWQgb2YgYW4gSUYgY29uZGl0aW9uYWwsIHdlIGRvbid0IG5lZWQgdG8gCisgICAgICogd2FpdCBmb3IgYSBuZXcgUkVRLgorICAgICAqLworICAgIHNiY2wgPSBOQ1I1M2M3eDBfcmVhZDgoU0JDTF9SRUcpICYgU0JDTF9QSEFTRV9NQVNLOworCisgICAgaWYgKCFjbWQpIHsKKwlhY3Rpb24gPSBBQ1RJT05fQUJPUlRfUFJJTlQ7CisJd2hlcmUgPSAibm8gY3VycmVudCBjb21tYW5kIjsKKyAgICAvKgorICAgICAqIFRoZSB3YXkgbXkgU0NTSSBTQ1JJUFRTKHRtKSBhcmUgYXJjaGl0ZWN0ZWQsIHJlY292ZXJhYmxlIHBoYXNlCisgICAgICogbWlzbWF0Y2hlcyBzaG91bGQgb25seSBvY2N1ciB3aGVyZSB3ZSdyZSBkb2luZyBhIG11bHRpLWJ5dGUgIAorICAgICAqIEJNSSBpbnN0cnVjdGlvbi4gIFNwZWNpZmljYWxseSwgdGhpcyBtZWFucyAKKyAgICAgKgorICAgICAqICAtIHNlbGVjdCBtZXNzYWdlcyAoYSBTQ1NJLUkgdGFyZ2V0IG1heSBpZ25vcmUgYWRkaXRpb25hbCBtZXNzYWdlcworICAgICAqIAkJYWZ0ZXIgdGhlIElERU5USUZZOyBhbnkgdGFyZ2V0IG1heSByZWplY3QgYSBTRFRSIG9yIFdEVFIpCisgICAgICoKKyAgICAgKiAgLSBjb21tYW5kIG91dCAodGFyZ2V0cyBtYXkgc2VuZCBhIG1lc3NhZ2UgdG8gc2lnbmFsIGFuIGVycm9yIAorICAgICAqIAkJY29uZGl0aW9uLCBvciBnbyBpbnRvIFNUQVRVU0lOIGFmdGVyIHRoZXkndmUgZGVjaWRlZCAKKyAgICAgKgkJdGhleSBkb24ndCBsaWtlIHRoZSBjb21tYW5kLgorICAgICAqCisgICAgICoJLSByZXBseV9tZXNzYWdlICh0YXJnZXRzIG1heSByZWplY3QgYSBtdWx0aS1ieXRlIG1lc3NhZ2UgaW4gdGhlIAorICAgICAqCQltaWRkbGUpCisgICAgICoKKyAgICAgKiAJLSBkYXRhIHRyYW5zZmVyIHJvdXRpbmVzIChjb21tYW5kIGNvbXBsZXRpb24gd2l0aCBidWZmZXIgc3BhY2UKKyAgICAgKgkJbGVmdCwgZGlzY29ubmVjdCBtZXNzYWdlLCBvciBlcnJvciBtZXNzYWdlKQorICAgICAqLworICAgIH0gZWxzZSBpZiAoKChkc3AgPj0gY21kLT5kYXRhX3RyYW5zZmVyX3N0YXJ0ICYmIAorCWRzcCA8IGNtZC0+ZGF0YV90cmFuc2Zlcl9lbmQpKSB8fCBkc3AgPT0gKGNtZC0+cmVzaWR1YWwgKyAyKSkgeworCWlmICgoZGNtZCAmIChEQ01EX1RZUEVfTUFTS3xEQ01EX0JNSV9PUF9NQVNLfERDTURfQk1JX0lORElSRUNUfAorCQlEQ01EX0JNSV9NU0d8RENNRF9CTUlfQ0QpKSA9PSAoRENNRF9UWVBFX0JNSXwKKwkJRENNRF9CTUlfT1BfTU9WRV9JKSkgeworCSAgICByZXNpZHVhbCA9IGRhdGFwYXRoX3Jlc2lkdWFsIChob3N0KTsKKwkgICAgaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX0RJU0NPTk5FQ1QpCisJICAgIAlwcmludGsgKCJzY3NpJWQgOiBoYW5kbGluZyByZXNpZHVhbCB0cmFuc2ZlciAoKyAlZCBieXRlcyBmcm9tIERNQSBGSUZPKVxuIiwgCisJCSAgICBob3N0LT5ob3N0X25vLCByZXNpZHVhbCk7CisKKwkgICAgLyoKKwkgICAgICogVGhlIGZpcnN0IGluc3RydWN0aW9uIGlzIGEgQ0FMTCB0byB0aGUgYWx0ZXJuYXRlIGhhbmRsZXIgZm9yIAorCSAgICAgKiB0aGlzIGRhdGEgdHJhbnNmZXIgcGhhc2UsIHNvIHdlIGNhbiBkbyBjYWxscyB0byAKKwkgICAgICogbXVuZ2VfbXNnX3Jlc3RhcnQgYXMgd2Ugd291bGQgaWYgY29udHJvbCB3ZXJlIHBhc3NlZCAKKwkgICAgICogZnJvbSBub3JtYWwgZHluYW1pYyBjb2RlLgorCSAgICAgKi8KKwkgICAgaWYgKGRzcCAhPSBjbWQtPnJlc2lkdWFsICsgMikgeworCQljbWQtPnJlc2lkdWFsWzBdID0gKChEQ01EX1RZUEVfVENJIHwgRENNRF9UQ0lfT1BfQ0FMTCB8CisJCQkoKGRjbWQgJiBEQ01EX0JNSV9JTykgPyBEQ01EX1RDSV9JTyA6IDApKSA8PCAyNCkgfCAKKwkJICAgIERCQ19UQ0lfV0FJVF9GT1JfVkFMSUQgfCBEQkNfVENJX0NPTVBBUkVfUEhBU0U7CisJCWNtZC0+cmVzaWR1YWxbMV0gPSB2aXJ0X3RvX2J1cyhob3N0ZGF0YS0+c2NyaXB0KQorCQkgICAgKyAoKGRjbWQgJiBEQ01EX0JNSV9JTykKKwkJICAgICAgID8gaG9zdGRhdGEtPkVfb3RoZXJfaW4gOiBob3N0ZGF0YS0+RV9vdGhlcl9vdXQpOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogVGhlIHNlY29uZCBpbnN0cnVjdGlvbiBpcyB0aGUgYSBkYXRhIHRyYW5zZmVyIGJsb2NrCisJICAgICAqIG1vdmUgaW5zdHJ1Y3Rpb24sIHJlZmxlY3RpbmcgdGhlIHBvaW50ZXIgYW5kIGNvdW50IGF0IHRoZSAKKwkgICAgICogdGltZSBvZiB0aGUgcGhhc2UgbWlzbWF0Y2guCisJICAgICAqLworCSAgICBjbWQtPnJlc2lkdWFsWzJdID0gZGJjX2RjbWQgKyByZXNpZHVhbDsKKwkgICAgY21kLT5yZXNpZHVhbFszXSA9IE5DUjUzYzd4MF9yZWFkMzIoRE5BRF9SRUcpIC0gcmVzaWR1YWw7CisKKwkgICAgLyoKKwkgICAgICogVGhlIHRoaXJkIGFuZCBmaW5hbCBpbnN0cnVjdGlvbiBpcyBhIGp1bXAgdG8gdGhlIGluc3RydWN0aW9uCisJICAgICAqIHdoaWNoIGZvbGxvd3MgdGhlIGluc3RydWN0aW9uIHdoaWNoIGhhZCB0byBiZSAnc3BsaXQnCisJICAgICAqLworCSAgICBpZiAoZHNwICE9IGNtZC0+cmVzaWR1YWwgKyAyKSB7CisJCWNtZC0+cmVzaWR1YWxbNF0gPSAoKERDTURfVFlQRV9UQ0l8RENNRF9UQ0lfT1BfSlVNUCkgCisJCSAgICA8PCAyNCkgfCBEQkNfVENJX1RSVUU7CisJCWNtZC0+cmVzaWR1YWxbNV0gPSB2aXJ0X3RvX2J1cyhkc3BfbmV4dCk7CisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBGb3IgdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eSwgdHJhbnNmZXIgY29udHJvbCB0byB0aGUgCisJICAgICAqIGNvbmRpdGlvbmFsIENBTEwgYXQgdGhlIHN0YXJ0IG9mIHRoZSByZXNpZHVhbCBidWZmZXIuCisJICAgICAqLworCSAgICBob3N0ZGF0YS0+ZHNwID0gY21kLT5yZXNpZHVhbDsKKwkgICAgaG9zdGRhdGEtPmRzcF9jaGFuZ2VkID0gMTsKKwkgICAgYWN0aW9uID0gQUNUSU9OX0NPTlRJTlVFOworCX0gZWxzZSB7CisJICAgIHdoZXJlID0gIm5vbi1CTUkgZHluYW1pYyBEU0EgY29kZSI7CisJICAgIGFjdGlvbiA9IEFDVElPTl9BQk9SVF9QUklOVDsKKwl9CisgICAgfSBlbHNlIGlmIChkc3AgPT0gKGhvc3RkYXRhLT5zY3JpcHQgKyBob3N0ZGF0YS0+RV9zZWxlY3RfbXNnb3V0IC8gNCArIDIpKSB7CisJLyogUkdIIDI5MDY5NzogIEFkZGVkICsyIGFib3ZlLCB0byBjb21wZW5zYXRlIGZvciB0aGUgc2NyaXB0CisJICogaW5zdHJ1Y3Rpb24gd2hpY2ggZGlzYWJsZXMgdGhlIHNlbGVjdGlvbiB0aW1lci4gKi8KKwkvKiBSZWxlYXNlIEFUTiAqLworCU5DUjUzYzd4MF93cml0ZTggKFNPQ0xfUkVHLCAwKTsKKwlzd2l0Y2ggKHNiY2wpIHsKKyAgICAvKiAKKyAgICAgKiBTb21lIGRldmljZXMgKFNRNTU1IGNvbWUgdG8gbWluZCkgZ3JhYiB0aGUgSURFTlRJRlkgbWVzc2FnZQorICAgICAqIHNlbnQgb24gc2VsZWN0aW9uLCBhbmQgZGVjaWRlIHRvIGdvIGludG8gQ09NTUFORCBPVVQgcGhhc2UKKyAgICAgKiByYXRoZXIgdGhhbiBhY2NlcHRpbmcgdGhlIHJlc3Qgb2YgdGhlIG1lc3NhZ2VzIG9yIHJlamVjdGluZworICAgICAqIHRoZW0uICBIYW5kbGUgdGhlc2UgZGV2aWNlcyBncmFjZWZ1bGx5LgorICAgICAqLworCWNhc2UgU0JDTF9QSEFTRV9DTURPVVQ6CisJICAgIGhvc3RkYXRhLT5kc3AgPSBkc3AgKyAyIC8qIHR3byBfd29yZHNfICovOworCSAgICBob3N0ZGF0YS0+ZHNwX2NoYW5nZWQgPSAxOworCSAgICBwcmludGsgKCJzY3NpJWQgOiB0YXJnZXQgJWQgaWdub3JlZCBTRFRSIGFuZCB3ZW50IGludG8gQ09NTUFORCBPVVRcbiIsIAorCQlob3N0LT5ob3N0X25vLCBjbWQtPmNtZC0+ZGV2aWNlLT5pZCk7CisJICAgIGNtZC0+ZmxhZ3MgJj0gfkNNRF9GTEFHX1NEVFI7CisJICAgIGFjdGlvbiA9IEFDVElPTl9DT05USU5VRTsKKwkgICAgYnJlYWs7CisJY2FzZSBTQkNMX1BIQVNFX01TR0lOOgorCSAgICBob3N0ZGF0YS0+ZHNwID0gaG9zdGRhdGEtPnNjcmlwdCArIGhvc3RkYXRhLT5FX21zZ19pbiAvIAorCQlzaXplb2YodTMyKTsKKwkgICAgaG9zdGRhdGEtPmRzcF9jaGFuZ2VkID0gMTsKKwkgICAgYWN0aW9uID0gQUNUSU9OX0NPTlRJTlVFOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICB3aGVyZT0ic2VsZWN0IG1lc3NhZ2Ugb3V0IjsKKwkgICAgYWN0aW9uID0gQUNUSU9OX0FCT1JUX1BSSU5UOworCX0KKyAgICAvKgorICAgICAqIFNvbWUgU0NTSSBkZXZpY2VzIHdpbGwgaW50ZXJwcmV0IGEgY29tbWFuZCBhcyB0aGV5IHJlYWQgdGhlIGJ5dGVzCisgICAgICogb2ZmIHRoZSBTQ1NJIGJ1cywgYW5kIG1heSBkZWNpZGUgdGhhdCB0aGUgY29tbWFuZCBpcyBCb2d1cyBiZWZvcmUgCisgICAgICogdGhleSd2ZSByZWFkIHRoZSBlbnRpcmUgY29tbWFuZCBvZmYgdGhlIGJ1cy4KKyAgICAgKi8KKyAgICB9IGVsc2UgaWYgKGRzcCA9PSBob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfY21kb3V0X2NtZG91dCAvIHNpemVvZiAKKwkodTMyKSkgeworCWhvc3RkYXRhLT5kc3AgPSBob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfZGF0YV90cmFuc2ZlciAvCisJICAgIHNpemVvZiAodTMyKTsKKwlob3N0ZGF0YS0+ZHNwX2NoYW5nZWQgPSAxOworCWFjdGlvbiA9IEFDVElPTl9DT05USU5VRTsKKyAgICAvKiBGSVhNRSA6IHdlIG5lZWQgdG8gaGFuZGxlIG1lc3NhZ2UgcmVqZWN0LCBldGMuIHdpdGhpbiBtc2dfcmVzcG9uZC4gKi8KKyNpZmRlZiBub3R5ZXQKKyAgICB9IGVsc2UgaWYgKGRzcCA9PSBob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfcmVwbHlfbWVzc2FnZSkgeworCXN3aXRjaCAoc2JjbCkgeworICAgIC8qIEFueSBvdGhlciBwaGFzZSBtaXNtYXRjaGVzIGFib3J0IHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbW1hbmQuICAqLworI2VuZGlmCisgICAgfSBlbHNlIHsKKwl3aGVyZSA9ICJ1bmtub3duIGxvY2F0aW9uIjsKKwlhY3Rpb24gPSBBQ1RJT05fQUJPUlRfUFJJTlQ7CisgICAgfQorCisgICAgLyogRmx1c2ggRE1BIEZJRk8gKi8KKyAgICBpZiAoIWhvc3RkYXRhLT5kc3RhdF92YWxpZCkgeworCWhvc3RkYXRhLT5kc3RhdCA9IE5DUjUzYzd4MF9yZWFkOChEU1RBVF9SRUcpOworCWhvc3RkYXRhLT5kc3RhdF92YWxpZCA9IDE7CisgICAgfQorICAgIGlmICghKGhvc3RkYXRhLT5kc3RhdCAmIERTVEFUX0RGRSkpIHsKKyAgICAgIC8qIFJlYWxseSBuZWVkIHRvIGNoZWNrIHRoaXMgb3V0IGZvciA3MTAgUkdIICovCisgICAgICBOQ1I1M2M3eDBfd3JpdGU4IChDVEVTVDhfUkVHLCBDVEVTVDhfMTBfQ0xGKTsKKyAgICAgIHdoaWxlIChOQ1I1M2M3eDBfcmVhZDggKENURVNUOF9SRUcpICYgQ1RFU1Q4XzEwX0NMRik7CisgICAgICBob3N0ZGF0YS0+ZHN0YXQgfD0gRFNUQVRfREZFOworICAgIH0KKworICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgY2FzZSBBQ1RJT05fQUJPUlRfUFJJTlQ6CisJcHJpbnRrKCJzY3NpJWQgOiAlcyA6IHVuZXhwZWN0ZWQgcGhhc2UgJXMuXG4iLAorCSAgICAgaG9zdC0+aG9zdF9ubywgd2hlcmUgPyB3aGVyZSA6ICJ1bmtub3duIGxvY2F0aW9uIiwgCisJICAgICBzYmNsX3RvX3BoYXNlKHNiY2wpKTsKKwlwcmludF9sb3RzIChob3N0KTsKKyAgICAvKiBGYWxsIHRocm91Z2ggdG8gQUNUSU9OX0FCT1JUICovCisgICAgY2FzZSBBQ1RJT05fQUJPUlQ6CisJYWJvcnRfY29ubmVjdGVkIChob3N0KTsKKwlicmVhazsKKyAgICBjYXNlIEFDVElPTl9DT05USU5VRToKKwlicmVhazsKKyAgICB9CisKKyNpZiAwCisgICAgaWYgKGhvc3RkYXRhLT5kc3BfY2hhbmdlZCkgeworCXByaW50aygic2NzaSVkOiBuZXcgZHNwIDB4JXBcbiIsIGhvc3QtPmhvc3Rfbm8sIGhvc3RkYXRhLT5kc3ApOworCXByaW50X2luc24gKGhvc3QsIGhvc3RkYXRhLT5kc3AsICIiLCAxKTsKKyAgICB9CisjZW5kaWYKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogc3RhdGljIHZvaWQgaW50cl9iZiAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgCisgKiAJc3RydWN0IE5DUjUzYzd4MF9jbWQgKmNtZCkKKyAqCisgKiBQdXJwb3NlIDogaGFuZGxlIEJVUyBGQVVMVCBpbnRlcnJ1cHRzIAorICoKKyAqIElucHV0cyA6IGhvc3QsIGNtZCAtIGhvc3QgYW5kIE5DUiBjb21tYW5kIGNhdXNpbmcgdGhlIGludGVycnVwdCwgY21kCisgKiAJbWF5IGJlIE5VTEwuCisgKi8KKworc3RhdGljIHZvaWQKK2ludHJfYmYgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHUzMiAqZHNwLAorCSpuZXh0X2RzcCwJCS8qIEN1cnJlbnQgZHNwICovCisgICAgCSpkc2EsCisJZGJjX2RjbWQ7CQkvKiBEQ01EIChoaWdoIGVpZ2h0IGJpdHMpICsgREJDICovCisgICAgY2hhciAqcmVhc29uID0gTlVMTDsKKyAgICAvKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciBhIHNpbGVudCBlcnJvciwgd2l0aCBhIHJldHJ5IHVudGlsIHdlJ3ZlCisgICAgICAgZXhoYXVzdGVkIHJldHJpZXMuICovCisgICAgZW51bSB7TUFZQkUsIEFMV0FZUywgTkVWRVJ9IHJldHJ5ID0gTUFZQkU7CisgICAgaW50IHJlcG9ydCA9IDA7CisgICAgTkNSNTNjN3gwX2xvY2FsX3NldHVwKGhvc3QpOworCisgICAgZGJjX2RjbWQgPSBOQ1I1M2M3eDBfcmVhZDMyIChEQkNfUkVHKTsKKyAgICBuZXh0X2RzcCA9IGJ1c190b192aXJ0IChOQ1I1M2M3eDBfcmVhZDMyKERTUF9SRUcpKTsKKyAgICBkc3AgPSBuZXh0X2RzcCAtIE5DUjUzYzd4MF9pbnNuX3NpemUgKChkYmNfZGNtZCA+PiAyNCkgJiAweGZmKTsKKy8qIEZJWE1FIC0gY2hlY2sgY2hpcCB0eXBlICAqLworICAgIGRzYSA9IGJ1c190b192aXJ0IChOQ1I1M2M3eDBfcmVhZDMyKERTQV9SRUcpKTsKKworICAgIC8qCisgICAgICogQnVzIGZhdWx0cyBjYW4gYmUgY2F1c2VkIGJ5IGVpdGhlciBhIEJhZCBBZGRyZXNzIG9yIAorICAgICAqIFRhcmdldCBBYm9ydC4gV2Ugc2hvdWxkIGNoZWNrIHRoZSBSZWNlaXZlZCBUYXJnZXQgQWJvcnQKKyAgICAgKiBiaXQgb2YgdGhlIFBDSSBzdGF0dXMgcmVnaXN0ZXIgYW5kIE1hc3RlciBBYm9ydCBCaXQuCisgICAgICoKKyAgICAgKiAJLSBNYXN0ZXIgQWJvcnQgYml0IGluZGljYXRlcyB0aGF0IG5vIGRldmljZSBjbGFpbWVkCisgICAgICoJCXRoZSBhZGRyZXNzIHdpdGggREVWU0VMIHdpdGhpbiBmaXZlIGNsb2NrcworICAgICAqCisgICAgICoJLSBUYXJnZXQgQWJvcnQgYml0IGluZGljYXRlcyB0aGF0IGEgdGFyZ2V0IGNsYWltZWQgaXQsCisgICAgICoJCWJ1dCBjaGFuZ2VkIGl0cyBtaW5kIG9uY2UgaXQgc2F3IHRoZSBieXRlIGVuYWJsZXMuCisgICAgICoKKyAgICAgKi8KKworICAgIC8qIDUzYzcxMCwgbm90IFBDSSBzeXN0ZW0gKi8KKyAgICByZXBvcnQgPSAxOworICAgIHJlYXNvbiA9ICJVbmtub3duIjsKKworI2lmbmRlZiBub3R5ZXQKKyAgICByZXBvcnQgPSAxOworI2VuZGlmCisgICAgaWYgKHJlcG9ydCAmJiByZWFzb24pCisgICAgeworCXByaW50ayhLRVJOX0FMRVJUICJzY3NpJWQgOiBCVVMgRkFVTFQgcmVhc29uID0gJXNcbiIsCisJICAgICBob3N0LT5ob3N0X25vLCByZWFzb24gPyByZWFzb24gOiAidW5rbm93biIpOworCXByaW50X2xvdHMgKGhvc3QpOworICAgIH0KKworI2lmbmRlZiBub3R5ZXQKKyAgICByZXRyeSA9IE5FVkVSOworI2VuZGlmCisKKyAgICAvKiAKKyAgICAgKiBUT0RPIDogd2Ugc2hvdWxkIGF0dGVtcHQgdG8gcmVjb3ZlciBmcm9tIGFueSBzcHVyaW91cyBidXMgCisgICAgICogZmF1bHRzLiAgQWZ0ZXIgWCByZXRyaWVzLCB3ZSBzaG91bGQgZmlndXJlIHRoYXQgdGhpbmdzIGFyZSAKKyAgICAgKiBzdWZmaWNpZW50bHkgd2VkZ2VkLCBhbmQgY2FsbCBOQ1I1M2M3eHhfcmVzZXQuCisgICAgICoKKyAgICAgKiBUaGlzIGNvZGUgc2hvdWxkIG9ubHkgZ2V0IGV4ZWN1dGVkIG9uY2Ugd2UndmUgZGVjaWRlZCB0aGF0IHdlIAorICAgICAqIGNhbm5vdCByZXRyeS4KKyAgICAgKi8KKworICAgIGlmIChyZXRyeSA9PSBORVZFUikgeworICAgIAlwcmludGsoS0VSTl9BTEVSVCAiICAgICAgICAgIG1haWwgcmljaGFyZEBzbGVlcGllLmRlbW9uLmNvLnVrXG4iKTsKKyAgICAJRkFUQUwgKGhvc3QpOworICAgIH0KK30KKworLyoKKyAqIEZ1bmN0aW9uIDogc3RhdGljIHZvaWQgaW50cl9kbWEgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIAorICogCXN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQpCisgKgorICogUHVycG9zZSA6IGhhbmRsZSBhbGwgRE1BIGludGVycnVwdHMsIGluZGljYXRlZCBieSB0aGUgc2V0dGluZyAKKyAqIAlvZiB0aGUgRElQIGJpdCBpbiB0aGUgSVNUQVQgcmVnaXN0ZXIuCisgKgorICogSW5wdXRzIDogaG9zdCwgY21kIC0gaG9zdCBhbmQgTkNSIGNvbW1hbmQgY2F1c2luZyB0aGUgaW50ZXJydXB0LCBjbWQKKyAqIAltYXkgYmUgTlVMTC4KKyAqLworCitzdGF0aWMgdm9pZCAKK2ludHJfZG1hIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqY21kKSB7CisgICAgTkNSNTNjN3gwX2xvY2FsX2RlY2xhcmUoKTsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopCisJaG9zdC0+aG9zdGRhdGFbMF07CisgICAgdW5zaWduZWQgY2hhciBkc3RhdDsJLyogRFNUQVQgKi8JCisgICAgdTMyICpkc3AsCisJKm5leHRfZHNwLAkJLyogQ3VycmVudCBkc3AgKi8KKyAgICAJKmRzYSwKKwlkYmNfZGNtZDsJCS8qIERDTUQgKGhpZ2ggZWlnaHQgYml0cykgKyBEQkMgKi8KKyAgICBpbnQgdG1wOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgTkNSNTNjN3gwX2xvY2FsX3NldHVwKGhvc3QpOworCisgICAgaWYgKCFob3N0ZGF0YS0+ZHN0YXRfdmFsaWQpIHsKKwlob3N0ZGF0YS0+ZHN0YXQgPSBOQ1I1M2M3eDBfcmVhZDgoRFNUQVRfUkVHKTsKKwlob3N0ZGF0YS0+ZHN0YXRfdmFsaWQgPSAxOworICAgIH0KKyAgICAKKyAgICBkc3RhdCA9IGhvc3RkYXRhLT5kc3RhdDsKKyAgICAKKyAgICBpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfSU5UUikKKwlwcmludGsoInNjc2klZCA6IERTVEFUPTB4JXhcbiIsIGhvc3QtPmhvc3Rfbm8sIChpbnQpIGRzdGF0KTsKKworICAgIGRiY19kY21kID0gTkNSNTNjN3gwX3JlYWQzMiAoREJDX1JFRyk7CisgICAgbmV4dF9kc3AgPSBidXNfdG9fdmlydChOQ1I1M2M3eDBfcmVhZDMyKERTUF9SRUcpKTsKKyAgICBkc3AgPSBuZXh0X2RzcCAtIE5DUjUzYzd4MF9pbnNuX3NpemUgKChkYmNfZGNtZCA+PiAyNCkgJiAweGZmKTsKKy8qIFhYWCAtIGNoZWNrIGNoaXAgdHlwZSAqLworICAgIGRzYSA9IGJ1c190b192aXJ0KE5DUjUzYzd4MF9yZWFkMzIoRFNBX1JFRykpOworCisgICAgLyoKKyAgICAgKiBEU1RBVF9BQlJUIGlzIHRoZSBhYm9ydGVkIGludGVycnVwdC4gIFRoaXMgaXMgc2V0IHdoZW5ldmVyIHRoZSAKKyAgICAgKiBTQ1NJIGNoaXAgaXMgYWJvcnRlZC4gIAorICAgICAqIAorICAgICAqIFdpdGggTkNSNTNjNzAwIGFuZCBOQ1I1M2M3MDAtNjYgc3R5bGUgY2hpcHMsIHdlIHNob3VsZCBvbmx5IAorICAgICAqIGdldCB0aGlzIHdoZW4gdGhlIGNoaXAgaXMgY3VycmVudGx5IHJ1bm5pbmcgdGhlIGFjY2VwdCAKKyAgICAgKiByZXNlbGVjdC9zZWxlY3QgY29kZSBhbmQgd2UgaGF2ZSBzZXQgdGhlIGFib3J0IGJpdCBpbiB0aGUgCisgICAgICogSVNUQVQgcmVnaXN0ZXIuCisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBpZiAoZHN0YXQgJiBEU1RBVF9BQlJUKSB7CisjaWYgMAorCS8qIFhYWCAtIGFkZCBjb2RlIGhlcmUgdG8gZGVhbCB3aXRoIG5vcm1hbCBhYm9ydCAqLworCWlmICgoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fNzAwKSAmJiAoaG9zdGRhdGEtPnN0YXRlID09CisJICAgIFNUQVRFX0FCT1JUSU5HKSkgeworCX0gZWxzZSAKKyNlbmRpZgorCXsKKwkgICAgcHJpbnRrKEtFUk5fQUxFUlQgInNjc2klZCA6IHVuZXhwZWN0ZWQgYWJvcnQgaW50ZXJydXB0IGF0XG4iIAorCQkgICAiICAgICAgICAgIiwgaG9zdC0+aG9zdF9ubyk7CisJICAgIHByaW50X2luc24gKGhvc3QsIGRzcCwgS0VSTl9BTEVSVCAicyAiLCAxKTsKKwkgICAgRkFUQUwgKGhvc3QpOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIERTVEFUX1NTSSBpcyB0aGUgc2luZ2xlIHN0ZXAgaW50ZXJydXB0LiAgU2hvdWxkIGJlIGdlbmVyYXRlZCAKKyAgICAgKiB3aGVuZXZlciB3ZSBoYXZlIHNpbmdsZSBzdGVwcGVkIG9yIGFyZSB0cmFjaW5nLgorICAgICAqLworCisgICAgaWYgKGRzdGF0ICYgRFNUQVRfU1NJKSB7CisJaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX1RSQUNFKSB7CisJICAgIC8qIERvbid0IHByaW50IGluc3RyLiB1bnRpbCB3ZSB3cml0ZSBEU1AgYXQgZW5kIG9mIGludHIgZnVuY3Rpb24gKi8KKwl9IGVsc2UgaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX1NJTkdMRSkgeworCSAgICBwcmludF9pbnNuIChob3N0LCBkc3AsICJzICIsIDApOworCSAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisvKiBYWFggLSBzaG91bGQgd2UgZG8gdGhpcywgb3IgY2FuIHdlIGdldCBhd2F5IHdpdGggd3JpdGluZyBkc3A/ICovCisKKwkgICAgTkNSNTNjN3gwX3dyaXRlOCAoRENOVExfUkVHLCAoTkNSNTNjN3gwX3JlYWQ4KERDTlRMX1JFRykgJiAKKyAgICAJICAgIAl+RENOVExfU1NNKSB8IERDTlRMX1NURCk7CisJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9IGVsc2UgeworCSAgICBwcmludGsoS0VSTl9BTEVSVCAic2NzaSVkIDogdW5leHBlY3RlZCBzaW5nbGUgc3RlcCBpbnRlcnJ1cHQgYXRcbiIKKwkJICAgIiAgICAgICAgICIsIGhvc3QtPmhvc3Rfbm8pOworCSAgICBwcmludF9pbnNuIChob3N0LCBkc3AsIEtFUk5fQUxFUlQgIiIsIDEpOworCSAgICBwcmludGsoS0VSTl9BTEVSVCAiICAgICAgICAgbWFpbCBkcmV3QFBvb2hTdGlja3MuT1JHXG4iKTsKKyAgICAJICAgIEZBVEFMIChob3N0KTsKKyAgICAJfQorICAgIH0KKworICAgIC8qCisgICAgICogRFNUQVRfSUlEIC8gRFNUQVRfT1BDIChzYW1lIGJpdCwgc2FtZSBtZWFuaW5nLCBvbmx5IHRoZSBuYW1lIAorICAgICAqIGlzIGRpZmZlcmVudCkgaXMgZ2VuZXJhdGVkIHdoZW5ldmVyIGFuIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gaXMgCisgICAgICogZW5jb3VudGVyZWQuICAKKyAgICAgKiAKKyAgICAgKiBYWFggLSB3ZSBtYXkgd2FudCB0byBlbXVsYXRlIElOVEZMWSBoZXJlLCBzbyB3ZSBjYW4gdXNlIAorICAgICAqICAgIHRoZSBzYW1lIFNDU0kgU0NSSVBUICh0bSkgZm9yIE5DUjUzYzcxMCB0aHJvdWdoIE5DUjUzYzgxMCAgCisgICAgICoJICBjaGlwcy4KKyAgICAgKi8KKworICAgIGlmIChkc3RhdCAmIERTVEFUX09QQykgeworICAgIC8qIAorICAgICAqIEFzY2VydGFpbiBpZiB0aGlzIElJRCBpbnRlcnJ1cHRzIG9jY3VycmVkIGJlZm9yZSBvciBhZnRlciBhIFNUTyAKKyAgICAgKiBpbnRlcnJ1cHQuICBTaW5jZSB0aGUgaW50ZXJydXB0IGhhbmRsaW5nIGNvZGUgbm93IGxlYXZlcyAKKyAgICAgKiBEU1AgdW5tb2RpZmllZCB1bnRpbCBfYWZ0ZXJfIGFsbCBzdGFja2VkIGludGVycnVwdHMgaGF2ZSBiZWVuCisgICAgICogcHJvY2Vzc2VkLCByZWFkaW5nIHRoZSBEU1AgcmV0dXJucyB0aGUgb3JpZ2luYWwgRFNQIHJlZ2lzdGVyLgorICAgICAqIFRoaXMgbWVhbnMgdGhhdCBpZiBkc3AgbGllcyBiZXR3ZWVuIHRoZSBzZWxlY3QgY29kZSwgYW5kIAorICAgICAqIG1lc3NhZ2Ugb3V0IGZvbGxvd2luZyB0aGUgc2VsZWN0aW9uIGNvZGUgKHdoZXJlIHRoZSBJSUQgaW50ZXJydXB0CisgICAgICogd291bGQgaGF2ZSB0byBoYXZlIG9jY3VycmVkIGJ5IGR1ZSB0byB0aGUgaW1wbGljaXQgd2FpdCBmb3IgUkVRKSwKKyAgICAgKiB3ZSBoYXZlIGFuIElJRCBpbnRlcnJ1cHQgcmVzdWx0aW5nIGZyb20gYSBTVE8gY29uZGl0aW9uIGFuZCAKKyAgICAgKiBjYW4gaWdub3JlIGl0LgorICAgICAqLworCisJaWYgKCgoZHNwID49IChob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfc2VsZWN0IC8gc2l6ZW9mKHUzMikpKSAmJgorCSAgICAoZHNwIDw9IChob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfc2VsZWN0X21zZ291dCAvIAorICAgIAkgICAgc2l6ZW9mKHUzMikgKyA4KSkpIHx8IChob3N0ZGF0YS0+dGVzdF9ydW5uaW5nID09IDIpKSB7CisJICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19JTlRSKSAKKwkJcHJpbnRrICgic2NzaSVkIDogaWdub3JpbmcgRFNUQVRfSUlEIGZvciBTU1RBVF9TVE9cbiIsCisJCSAgICBob3N0LT5ob3N0X25vKTsKKwkgICAgaWYgKGhvc3RkYXRhLT5leHBlY3RpbmdfaWlkKSB7CisJCWhvc3RkYXRhLT5leHBlY3RpbmdfaWlkID0gMDsKKwkJaG9zdGRhdGEtPmlkbGUgPSAxOworCQlpZiAoaG9zdGRhdGEtPnRlc3RfcnVubmluZyA9PSAyKSB7CisJCSAgICBob3N0ZGF0YS0+dGVzdF9ydW5uaW5nID0gMDsKKwkJICAgIGhvc3RkYXRhLT50ZXN0X2NvbXBsZXRlZCA9IDM7CisJCX0gZWxzZSBpZiAoY21kKSAKKwkJCWFibm9ybWFsX2ZpbmlzaGVkIChjbWQsIERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwkgICAgfSBlbHNlIHsKKwkJaG9zdGRhdGEtPmV4cGVjdGluZ19zdG8gPSAxOworCSAgICB9CisgICAgLyoKKyAgICAgKiBXZSBjYW4ndCBndWFyYW50ZWUgd2UnbGwgYmUgYWJsZSB0byBleGVjdXRlIHRoZSBXQUlUIERJU0NPTk5FQ1QKKyAgICAgKiBpbnN0cnVjdGlvbiB3aXRoaW4gdGhlIDMuNHVzIG9mIGJ1cyBmcmVlIGFuZCBhcmJpdHJhdGlvbiBkZWxheQorICAgICAqIHRoYXQgYSB0YXJnZXQgY2FuIFJFU0VMRUNUIGluIGFuZCBhc3NlcnQgUkVRIGFmdGVyIHdlJ3ZlIGRyb3BwZWQKKyAgICAgKiBBQ0suICBJZiB0aGlzIGhhcHBlbnMsIHdlJ2xsIGdldCBhbiBpbGxlZ2FsIGluc3RydWN0aW9uIGludGVycnVwdC4KKyAgICAgKiBEb2luZyBhd2F5IHdpdGggdGhlIFdBSVQgRElTQ09OTkVDVCBpbnN0cnVjdGlvbnMgYnJva2UgZXZlcnl0aGluZywKKyAgICAgKiBzbyBpbnN0ZWFkIEknbGwgc2V0dGxlIGZvciBtb3Zpbmcgb25lIFdBSVQgRElTQ09OTkVDVCBhIGZldyAKKyAgICAgKiBpbnN0cnVjdGlvbnMgY2xvc2VyIHRvIHRoZSBDTEVBUiBBQ0sgYmVmb3JlIGl0IHRvIG1pbmltaXplIHRoZQorICAgICAqIGNoYW5jZXMgb2YgdGhpcyBoYXBwZW5pbmcsIGFuZCBoYW5kbGUgaXQgaWYgaXQgb2NjdXJzIGFueXdheS4KKyAgICAgKgorICAgICAqIFNpbXBseSBjb250aW51ZSB3aXRoIHdoYXQgd2Ugd2VyZSBkb2luZywgYW5kIGNvbnRyb2wgc2hvdWxkCisgICAgICogYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHNjaGVkdWxlIHJvdXRpbmUgd2hpY2ggd2lsbCB1bHRpbWF0ZWx5CisgICAgICogcGFzcyBjb250cm9sIG9udG8gdGhlIHJlc2VsZWN0aW9uIG9yIHNlbGVjdGlvbiAobm90IHlldCkKKyAgICAgKiBjb2RlLgorICAgICAqLworCX0gZWxzZSBpZiAoZGJjX2RjbWQgPT0gMHg0ODAwMDAwMCAmJiAoTkNSNTNjN3gwX3JlYWQ4IChTQkNMX1JFRykgJgorCSAgICBTQkNMX1JFUSkpIHsKKwkgICAgaWYgKCEoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fTk9fUFJJTlRfUkFDRSkpCisJICAgIHsKKwkJcHJpbnRrKCJzY3NpJWQ6IFJFUSBiZWZvcmUgV0FJVCBESVNDT05ORUNUIElJRFxuIiwgCisJCSAgICBob3N0LT5ob3N0X25vKTsKKwkJaG9zdGRhdGEtPm9wdGlvbnMgfD0gT1BUSU9OX05PX1BSSU5UX1JBQ0U7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBwcmludGsoS0VSTl9BTEVSVCAic2NzaSVkIDogaW52YWxpZCBpbnN0cnVjdGlvblxuIiwgaG9zdC0+aG9zdF9ubyk7CisJICAgIHByaW50X2xvdHMgKGhvc3QpOworCSAgICBwcmludGsoS0VSTl9BTEVSVCAiICAgICAgICAgbWFpbCBSaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWsgd2l0aCBBTExcbiIKKwkJICAgICAgICAgICAgICAiICAgICAgICAgYm9vdCBtZXNzYWdlcyBhbmQgZGlhZ25vc3RpYyBvdXRwdXRcbiIpOworICAgIAkgICAgRkFUQUwgKGhvc3QpOworCX0KKyAgICB9CisKKyAgICAvKiAKKyAgICAgKiBEU1RBVF9CRiBhcmUgYnVzIGZhdWx0IGVycm9ycy4gIERTVEFUXzgwMF9CRiBpcyB2YWxpZCBmb3IgNzEwIGFsc28uCisgICAgICovCisgICAgCisgICAgaWYgKGRzdGF0ICYgRFNUQVRfODAwX0JGKSB7CisJaW50cl9iZiAoaG9zdCwgY21kKTsKKyAgICB9CisJCisKKyAgICAvKiAKKyAgICAgKiBEU1RBVF9TSVIgaW50ZXJydXB0cyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBleGVjdXRpb24gb2YgCisgICAgICogdGhlIElOVCBpbnN0cnVjdGlvbi4gIFNpbmNlIHRoZSBleGFjdCB2YWx1ZXMgYXZhaWxhYmxlIAorICAgICAqIGFyZSBkZXRlcm1pbmVkIGVudGlyZWx5IGJ5IHRoZSBTQ1NJIHNjcmlwdCBydW5uaW5nLCAKKyAgICAgKiBhbmQgYXJlIGxvY2FsIHRvIGEgcGFydGljdWxhciBzY3JpcHQsIGEgdW5pcXVlIGhhbmRsZXIKKyAgICAgKiBpcyBjYWxsZWQgZm9yIGVhY2ggc2NyaXB0LgorICAgICAqLworCisgICAgaWYgKGRzdGF0ICYgRFNUQVRfU0lSKSB7CisJaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX0lOVFIpCisJICAgIHByaW50ayAoInNjc2klZCA6IERTVEFUX1NJUlxuIiwgaG9zdC0+aG9zdF9ubyk7CisJc3dpdGNoICgodG1wID0gaG9zdGRhdGEtPmRzdGF0X3Npcl9pbnRyIChob3N0LCBjbWQpKSkgeworCWNhc2UgU1BFQ0lGSUNfSU5UX05PVEhJTkc6CisJY2FzZSBTUEVDSUZJQ19JTlRfUkVTVEFSVDoKKwkgICAgYnJlYWs7CisJY2FzZSBTUEVDSUZJQ19JTlRfQUJPUlQ6CisJICAgIGFib3J0X2Nvbm5lY3RlZChob3N0KTsKKwkgICAgYnJlYWs7CisJY2FzZSBTUEVDSUZJQ19JTlRfUEFOSUM6CisJICAgIHByaW50ayhLRVJOX0FMRVJUICJzY3NpJWQgOiBmYWlsdXJlIGF0ICIsIGhvc3QtPmhvc3Rfbm8pOworCSAgICBwcmludF9pbnNuIChob3N0LCBkc3AsIEtFUk5fQUxFUlQgIiIsIDEpOworCSAgICBwcmludGsoS0VSTl9BTEVSVCAiICAgICAgICAgIGRzdGF0X3Npcl9pbnRyKCkgcmV0dXJuZWQgU1BFQ0lGSUNfSU5UX1BBTklDXG4iKTsKKyAgICAJICAgIEZBVEFMIChob3N0KTsKKwkgICAgYnJlYWs7CisJY2FzZSBTUEVDSUZJQ19JTlRfQlJFQUs6CisJICAgIGludHJfYnJlYWsgKGhvc3QsIGNtZCk7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIHByaW50ayhLRVJOX0FMRVJUICJzY3NpJWQgOiBmYWlsdXJlIGF0ICIsIGhvc3QtPmhvc3Rfbm8pOworCSAgICBwcmludF9pbnNuIChob3N0LCBkc3AsIEtFUk5fQUxFUlQgIiIsIDEpOworCSAgICBwcmludGsoS0VSTl9BTEVSVCIgICAgICAgICAgZHN0YXRfc2lyX2ludHIoKSByZXR1cm5lZCB1bmtub3duIHZhbHVlICVkXG4iLCAKKwkJdG1wKTsKKyAgICAJICAgIEZBVEFMIChob3N0KTsKKwl9CisgICAgfSAKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogc3RhdGljIGludCBwcmludF9pbnNuIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCAKKyAqIAl1MzIgKmluc24sIGludCBrZXJuZWwpCisgKgorICogUHVycG9zZSA6IHByaW50IG51bWVyaWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGluc3RydWN0aW9uIHBvaW50ZWQKKyAqIAl0byBieSBpbnNuIHRvIHRoZSBkZWJ1Z2dpbmcgb3Iga2VybmVsIG1lc3NhZ2UgYnVmZmVyCisgKglhcyBhcHByb3ByaWF0ZS4gIAorICoKKyAqIAlJZiBkZXNpcmVkLCBhIHVzZXIgbGV2ZWwgcHJvZ3JhbSBjYW4gaW50ZXJwcmV0IHRoaXMgCisgKiAJaW5mb3JtYXRpb24uCisgKgorICogSW5wdXRzIDogaG9zdCwgaW5zbiAtIGhvc3QsIHBvaW50ZXIgdG8gaW5zdHJ1Y3Rpb24sIHByZWZpeCAtIAorICoJc3RyaW5nIHRvIHByZXBlbmQsIGtlcm5lbCAtIHVzZSBwcmludGsgaW5zdGVhZCBvZiBkZWJ1Z2dpbmcgYnVmZmVyLgorICoKKyAqIFJldHVybnMgOiBzaXplLCBpbiB1MzJzLCBvZiBpbnN0cnVjdGlvbiBwcmludGVkLgorICovCisKKy8qCisgKiBGSVhNRTogc2hvdWxkIGNoYW5nZSBrZXJuZWwgcGFyYW1ldGVyIHNvIHRoYXQgaXQgdGFrZXMgYW4gRU5VTQorICogCXNwZWNpZnlpbmcgc2V2ZXJpdHkgLSBlaXRoZXIgS0VSTl9BTEVSVCBvciBLRVJOX1BBTklDIHNvCisgKglhbGwgcGFuaWMgbWVzc2FnZXMgYXJlIG91dHB1dCB3aXRoIHRoZSBzYW1lIHNldmVyaXR5LgorICovCisKK3N0YXRpYyBpbnQgCitwcmludF9pbnNuIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjb25zdCB1MzIgKmluc24sIAorICAgIGNvbnN0IGNoYXIgKnByZWZpeCwgaW50IGtlcm5lbCkgeworICAgIGNoYXIgYnVmWzE2MF0sIAkJLyogVGVtcG9yYXJ5IGJ1ZmZlciBhbmQgcG9pbnRlci4gIElDS1kgCisJCQkJICAgYXJiaXRyYXJ5IGxlbmd0aC4gICovCisKKwkJCisJKnRtcDsJCQkKKyAgICB1bnNpZ25lZCBjaGFyIGRjbWQ7CQkvKiBkY21kIHJlZ2lzdGVyIGZvciAqaW5zbiAqLworICAgIGludCBzaXplOworCisgICAgLyogCisgICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIGlzIG5vdCBib2d1cyBiZWZvcmUgCisgICAgICogaW5kaXJlY3RpbmcgdGhyb3VnaCBpdDsgYXZvaWRpbmcgcmVkLXpvbmUgYXQgc3RhcnQgb2YgCisgICAgICogbWVtb3J5LgorICAgICAqCisgICAgICogRklYTUU6IGlja3kgbWFnaWMgbmVlZHMgdG8gaGFwcGVuIGhlcmUgb24gbm9uLWludGVsIGJveGVzIHdoaWNoCisgICAgICogZG9uJ3QgaGF2ZSBrZXJuZWwgbWVtb3J5IG1hcHBlZCBpbiBsaWtlIHRoaXMuICBNaWdodCBiZSByZWFzb25hYmxlCisgICAgICogdG8gdXNlIHZ2ZXJpZnkoKT8KKyAgICAgKi8KKworICAgIGlmICh2aXJ0X3RvX3BoeXMoKHZvaWQgKilpbnNuKSA8IFBBR0VfU0laRSB8fCAKKwl2aXJ0X3RvX3BoeXMoKHZvaWQgKikoaW5zbiArIDgpKSA+IHZpcnRfdG9fcGh5cyhoaWdoX21lbW9yeSkgfHwKKwkoKCgoZGNtZCA9IChpbnNuWzBdID4+IDI0KSAmIDB4ZmYpICYgRENNRF9UWVBFX01NSSkgPT0gRENNRF9UWVBFX01NSSkgJiYKKwl2aXJ0X3RvX3BoeXMoKHZvaWQgKikoaW5zbiArIDEyKSkgPiB2aXJ0X3RvX3BoeXMoaGlnaF9tZW1vcnkpKSkgeworCXNpemUgPSAwOworCXNwcmludGYgKGJ1ZiwgIiVzJXA6IGFkZHJlc3Mgb3V0IG9mIHJhbmdlXG4iLAorCSAgICBwcmVmaXgsIGluc24pOworICAgIH0gZWxzZSB7CisvKiAKKyAqIEZJWE1FIDogKHZvaWQgKikgY2FzdCBpbiB2aXJ0X3RvX2J1cyBzaG91bGQgYmUgdW5uZWNlc3NhcnksIGJlY2F1c2UKKyAqIAlpdCBzaG91bGQgdGFrZSBjb25zdCB2b2lkICogYXMgYXJndW1lbnQuCisgKi8KKyNpZiAhZGVmaW5lZChDT05GSUdfTVZNRTE2eCkgJiYgIWRlZmluZWQoQ09ORklHX0JWTUU2MDAwKQorCXNwcmludGYoYnVmLCAiJXMweCVseCAodmlydCAweCVwKSA6IDB4JTA4eCAweCUwOHggKHZpcnQgMHglcCkiLCAKKwkgICAgKHByZWZpeCA/IHByZWZpeCA6ICIiKSwgdmlydF90b19idXMoKHZvaWQgKikgaW5zbiksIGluc24sICAKKwkgICAgaW5zblswXSwgaW5zblsxXSwgYnVzX3RvX3ZpcnQgKGluc25bMV0pKTsKKyNlbHNlCisJLyogUmVtb3ZlIHZpcnR1YWwgYWRkcmVzc2VzIHRvIHJlZHVjZSBvdXRwdXQsIGFzIHRoZXkgYXJlIHRoZSBzYW1lICovCisJc3ByaW50ZihidWYsICIlczB4JXggKCsleCkgOiAweCUwOHggMHglMDh4IiwgCisJICAgIChwcmVmaXggPyBwcmVmaXggOiAiIiksICh1MzIpaW5zbiwgKCh1MzIpaW5zbiAtCisJCSh1MzIpJigoKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKilob3N0LT5ob3N0ZGF0YVswXSktPnNjcmlwdCkpLzQsIAorCSAgICBpbnNuWzBdLCBpbnNuWzFdKTsKKyNlbmRpZgorCXRtcCA9IGJ1ZiArIHN0cmxlbihidWYpOworCWlmICgoZGNtZCAmIERDTURfVFlQRV9NQVNLKSA9PSBEQ01EX1RZUEVfTU1JKSAgeworI2lmICFkZWZpbmVkKENPTkZJR19NVk1FMTZ4KSAmJiAhZGVmaW5lZChDT05GSUdfQlZNRTYwMDApCisJICAgIHNwcmludGYgKHRtcCwgIiAweCUwOHggKHZpcnQgMHglcClcbiIsIGluc25bMl0sIAorCQlidXNfdG9fdmlydChpbnNuWzJdKSk7CisjZWxzZQorCSAgICAvKiBSZW1vdmUgdmlydHVhbCBhZGRyIHRvIHJlZHVjZSBvdXRwdXQsIGFzIGl0IGlzIHRoZSBzYW1lICovCisJICAgIHNwcmludGYgKHRtcCwgIiAweCUwOHhcbiIsIGluc25bMl0pOworI2VuZGlmCisJICAgIHNpemUgPSAzOworCX0gZWxzZSB7CisJICAgIHNwcmludGYgKHRtcCwgIlxuIik7CisJICAgIHNpemUgPSAyOworCX0KKyAgICB9CisKKyAgICBpZiAoa2VybmVsKSAKKwlwcmludGsgKCIlcyIsIGJ1Zik7CisjaWZkZWYgTkNSX0RFQlVHCisgICAgZWxzZSB7CisJc2l6ZV90IGxlbiA9IHN0cmxlbihidWYpOworCWRlYnVnZ2VyX2tlcm5lbF93cml0ZShob3N0LCBidWYsIGxlbik7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHNpemU7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1M2M3eHhfYWJvcnQgKFNjc2lfQ21uZCAqY21kKQorICogCisgKiBQdXJwb3NlIDogQWJvcnQgYW4gZXJyYW50IFNDU0kgY29tbWFuZCwgZG9pbmcgYWxsIG5lY2Vzc2FyeQorICoJY2xlYW51cCBvZiB0aGUgaXNzdWVfcXVldWUsIHJ1bm5pbmdfbGlzdCwgc2hhcmVkIExpbnV4L05DUgorICoJZHNhIGlzc3VlIGFuZCByZWNvbm5lY3QgcXVldWVzLgorICoKKyAqIElucHV0cyA6IGNtZCAtIGNvbW1hbmQgdG8gYWJvcnQsIGNvZGUgLSBlbnRpcmUgcmVzdWx0IGZpZWxkCisgKgorICogUmV0dXJucyA6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqLworCitpbnQgCitOQ1I1M2M3eHhfYWJvcnQgKFNjc2lfQ21uZCAqY21kKSB7CisgICAgTkNSNTNjN3gwX2xvY2FsX2RlY2xhcmUoKTsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gY21kLT5kZXZpY2UtPmhvc3Q7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSBob3N0ID8gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikgCisJaG9zdC0+aG9zdGRhdGFbMF0gOiBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgc3RydWN0IE5DUjUzYzd4MF9jbWQgKmN1cnIsICoqcHJldjsKKyAgICBTY3NpX0NtbmQgKm1lLCAqKmxhc3Q7CisjaWYgMAorICAgIHN0YXRpYyBsb25nIGNhY2hlX3BpZCA9IC0xOworI2VuZGlmCisKKworICAgIGlmICghaG9zdCkgeworCXByaW50ayAoIkJvZ3VzIFNDU0kgY29tbWFuZCBwaWQgJWxkOyBubyBob3N0IHN0cnVjdHVyZVxuIiwKKwkgICAgY21kLT5waWQpOworCXJldHVybiBTQ1NJX0FCT1JUX0VSUk9SOworICAgIH0gZWxzZSBpZiAoIWhvc3RkYXRhKSB7CisJcHJpbnRrICgiQm9ndXMgU0NTSSBob3N0ICVkOyBubyBob3N0ZGF0YVxuIiwgaG9zdC0+aG9zdF9ubyk7CisJcmV0dXJuIFNDU0lfQUJPUlRfRVJST1I7CisgICAgfQorICAgIE5DUjUzYzd4MF9sb2NhbF9zZXR1cChob3N0KTsKKworLyoKKyAqIENIRUNLIDogSSBkb24ndCB0aGluayB0aGF0IHJlYWRpbmcgSVNUQVQgd2lsbCB1bnN0YWNrIGFueSBpbnRlcnJ1cHRzLAorICoJc2luY2Ugd2UgbmVlZCB0byB3cml0ZSB0aGUgSU5URiBiaXQgdG8gY2xlYXIgaXQsIGFuZCBTQ1NJL0RNQQorICogCWludGVycnVwdHMgZG9uJ3QgY2xlYXIgdW50aWwgd2UgcmVhZCBTU1RBVC9TSVNUIGFuZCBEU1RBVCByZWdpc3RlcnMuCisgKgkKKyAqCVNlZSB0aGF0IHRoaXMgaXMgdGhlIGNhc2UuICBBcHBlYXJzIHRvIGJlIGNvcnJlY3Qgb24gdGhlIDcxMCwgYXQgbGVhc3QuCisgKgorICogSSBzdXNwZWN0IHRoYXQgc2V2ZXJhbCBvZiBvdXIgZmFpbHVyZXMgbWF5IGJlIGNvbWluZyBmcm9tIGEgbmV3IGZhdGFsCisgKiBpbnRlcnJ1cHQgKHBvc3NpYmx5IGR1ZSB0byBhIHBoYXNlIG1pc21hdGNoKSBoYXBwZW5pbmcgYWZ0ZXIgd2UndmUgbGVmdAorICogdGhlIGludGVycnVwdCBoYW5kbGVyLCBidXQgYmVmb3JlIHRoZSBQSUMgaGFzIGhhZCB0aGUgaW50ZXJydXB0IGNvbmRpdGlvbgorICogY2xlYXJlZC4KKyAqLworCisgICAgaWYgKE5DUjUzYzd4MF9yZWFkOChob3N0ZGF0YS0+aXN0YXQpICYgKElTVEFUX0RJUHxJU1RBVF9TSVApKSB7CisJcHJpbnRrICgic2NzaSVkIDogZHJvcHBlZCBpbnRlcnJ1cHQgZm9yIGNvbW1hbmQgJWxkXG4iLCBob3N0LT5ob3N0X25vLAorCSAgICBjbWQtPnBpZCk7CisJTkNSNTNjN3gwX2ludHIgKGhvc3QtPmlycSwgTlVMTCwgTlVMTCk7CisJcmV0dXJuIFNDU0lfQUJPUlRfQlVTWTsKKyAgICB9CisJCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworI2lmIDAKKyAgICBpZiAoY2FjaGVfcGlkID09IGNtZC0+cGlkKSAKKwlwYW5pYyAoInNjc2klZCA6IGJsb29keSBmZXR1cyAlZFxuIiwgaG9zdC0+aG9zdF9ubywgY21kLT5waWQpOworICAgIGVsc2UKKwljYWNoZV9waWQgPSBjbWQtPnBpZDsKKyNlbmRpZgorCQorCisvKgorICogVGhlIGNvbW1hbmQgY291bGQgYmUgaGlkaW5nIGluIHRoZSBpc3N1ZV9xdWV1ZS4gIFRoaXMgd291bGQgYmUgdmVyeQorICogbmljZSwgYXMgY29tbWFuZHMgY2FuJ3QgYmUgbW92ZWQgZnJvbSB0aGUgaGlnaCBsZXZlbCBkcml2ZXIncyBpc3N1ZSBxdWV1ZSAKKyAqIGludG8gdGhlIHNoYXJlZCBxdWV1ZSB1bnRpbCBhbiBpbnRlcnJ1cHQgcm91dGluZSBpcyBzZXJ2aWNlZCwgYW5kIHRoaXMKKyAqIG1vdmluZyBpcyBhdG9taWMuICAKKyAqCisgKiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGFueXRoaW5nIC0gd2Ugc2ltcGx5CisgKiBwdWxsIHRoZSBjb21tYW5kIG91dCBvZiB0aGUgb2xkIHF1ZXVlLCBhbmQgY2FsbCBpdCBhYm9ydGVkLgorICovCisKKyAgICBmb3IgKG1lID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWUsIAorICAgICAgICAgbGFzdCA9IChTY3NpX0NtbmQgKiopICYoaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKTsKKwkgbWUgJiYgbWUgIT0gY21kOyAgbGFzdCA9IChTY3NpX0NtbmQgKiopJihtZS0+U0NwLnB0ciksIAorCSBtZSA9IChTY3NpX0NtbmQgKiltZS0+U0NwLnB0cik7CisKKyAgICBpZiAobWUpIHsKKwkqbGFzdCA9IChTY3NpX0NtbmQgKikgbWUtPlNDcC5wdHI7CisJaWYgKG1lLT5ob3N0X3NjcmliYmxlKSB7CisJICAgICgoc3RydWN0IE5DUjUzYzd4MF9jbWQgKiltZS0+aG9zdF9zY3JpYmJsZSktPm5leHQgPSBob3N0ZGF0YS0+ZnJlZTsKKwkgICAgaG9zdGRhdGEtPmZyZWUgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgbWUtPmhvc3Rfc2NyaWJibGU7CisJICAgIG1lLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwl9CisJY21kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJY21kLT5zY3NpX2RvbmUoY21kKTsKKwlwcmludGsgKCJzY3NpJWQgOiBmb3VuZCBjb21tYW5kICVsZCBpbiBMaW51eCBpc3N1ZSBxdWV1ZVxuIiwgCisJICAgIGhvc3QtPmhvc3Rfbm8sIG1lLT5waWQpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICAJcnVuX3Byb2Nlc3NfaXNzdWVfcXVldWUoKTsKKwlyZXR1cm4gU0NTSV9BQk9SVF9TVUNDRVNTOworICAgIH0KKworLyogCisgKiBUaGF0IGZhaWxpbmcsIHRoZSBjb21tYW5kIGNvdWxkIGJlIGluIG91ciBsaXN0IG9mIGFscmVhZHkgZXhlY3V0aW5nIAorICogY29tbWFuZHMuICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBkcmFzdGljIG1lYXN1cmVzIGFyZSBjYWxsZWQgZm9yLiAgCisgKi8gCisKKyAgICBmb3IgKGN1cnIgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgaG9zdGRhdGEtPnJ1bm5pbmdfbGlzdCwgCisgICAgCSBwcmV2ID0gKHN0cnVjdCBOQ1I1M2M3eDBfY21kICoqKSAmKGhvc3RkYXRhLT5ydW5uaW5nX2xpc3QpOworCSBjdXJyICYmIGN1cnItPmNtZCAhPSBjbWQ7IHByZXYgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKiopIAorICAgICAgICAgJihjdXJyLT5uZXh0KSwgY3VyciA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKSBjdXJyLT5uZXh0KTsKKworICAgIGlmIChjdXJyKSB7CisJaWYgKChjdXJyLT5yZXN1bHQgJiAweGZmKSAhPSAweGZmICYmIChjdXJyLT5yZXN1bHQgJiAweGZmMDApICE9IDB4ZmYwMCkgeworICAgICAgICAgICAgY21kLT5yZXN1bHQgPSBjdXJyLT5yZXN1bHQ7CisJICAgIGlmIChwcmV2KQorCQkqcHJldiA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKSBjdXJyLT5uZXh0OworCSAgICBjdXJyLT5uZXh0ID0gKHN0cnVjdCBOQ1I1M2M3eDBfY21kICopIGhvc3RkYXRhLT5mcmVlOworCSAgICBjbWQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCSAgICBob3N0ZGF0YS0+ZnJlZSA9IGN1cnI7CisJICAgIGNtZC0+c2NzaV9kb25lKGNtZCk7CisJcHJpbnRrICgic2NzaSVkIDogZm91bmQgZmluaXNoZWQgY29tbWFuZCAlbGQgaW4gcnVubmluZyBsaXN0XG4iLCAKKwkgICAgaG9zdC0+aG9zdF9ubywgY21kLT5waWQpOworCSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJICAgIHJldHVybiBTQ1NJX0FCT1JUX05PVF9SVU5OSU5HOworCX0gZWxzZSB7CisJICAgIHByaW50ayAoInNjc2klZCA6IERBTkdFUiA6IGNvbW1hbmQgcnVubmluZywgY2FuIG5vdCBhYm9ydC5cbiIsCisJCWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vKTsKKwkgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCSAgICByZXR1cm4gU0NTSV9BQk9SVF9CVVNZOworCX0KKyAgICB9CisKKy8qIAorICogQW5kIGlmIHdlIGNvdWxkbid0IGZpbmQgaXQgaW4gYW55IG9mIG91ciBxdWV1ZXMsIGl0IG11c3QgaGF2ZSBiZWVuIAorICogYSBkcm9wcGVkIGludGVycnVwdC4KKyAqLworCisgICAgY3VyciA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGU7CisgICAgaWYgKGN1cnIpIHsKKwljdXJyLT5uZXh0ID0gaG9zdGRhdGEtPmZyZWU7CisJaG9zdGRhdGEtPmZyZWUgPSBjdXJyOworCWNtZC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGN1cnIgPT0gTlVMTCB8fCAoKGN1cnItPnJlc3VsdCAmIDB4ZmYwMCkgPT0gMHhmZjAwKSB8fAorCQkoKGN1cnItPnJlc3VsdCAmIDB4ZmYpID09IDB4ZmYpKSB7CisJcHJpbnRrICgic2NzaSVkIDogZGlkIHRoaXMgY29tbWFuZCBldmVyIHJ1bj9cbiIsIGhvc3QtPmhvc3Rfbm8pOworCSAgICBjbWQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKyAgICB9IGVsc2UgeworCXByaW50ayAoInNjc2klZCA6IHByb2JhYmx5IGxvc3QgSU5URkxZLCBub3JtYWwgY29tcGxldGlvblxuIiwgCisJICAgIGhvc3QtPmhvc3Rfbm8pOworICAgICAgICBjbWQtPnJlc3VsdCA9IGN1cnItPnJlc3VsdDsKKy8qIAorICogRklYTUUgOiBXZSBuZWVkIHRvIGFkZCBhbiBhZGRpdGlvbmFsIGZsYWcgd2hpY2ggaW5kaWNhdGVzIGlmIGEgCisgKiBjb21tYW5kIHdhcyBldmVyIGNvdW50ZWQgYXMgQlVTWSwgc28gaWYgd2UgZW5kIHVwIGhlcmUgd2UgY2FuCisgKiBkZWNyZW1lbnQgdGhlIGJ1c3kgY291bnQgaWYgYW5kIG9ubHkgaWYgaXQgaXMgbmVjZXNzYXJ5LgorICovCisgICAgICAgIC0taG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXVtjbWQtPmRldmljZS0+bHVuXTsKKyAgICB9CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIGNtZC0+c2NzaV9kb25lKGNtZCk7CisKKy8qIAorICogV2UgbmVlZCB0byBydW4gcHJvY2Vzc19pc3N1ZV9xdWV1ZSBzaW5jZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIGNvbW1hbmQgCisgKiBtYXkgYWxsb3cgYW5vdGhlciBxdWV1ZWQgY29tbWFuZCB0byBleGVjdXRlIGZpcnN0PyAKKyAqLworICAgIHJldHVybiBTQ1NJX0FCT1JUX05PVF9SVU5OSU5HOworfQorCisvKgorICogRnVuY3Rpb24gOiBpbnQgTkNSNTNjN3h4X3Jlc2V0IChTY3NpX0NtbmQgKmNtZCkgCisgKiAKKyAqIFB1cnBvc2UgOiBwZXJmb3JtIGEgaGFyZCByZXNldCBvZiB0aGUgU0NTSSBidXMgYW5kIE5DUgorICogCWNoaXAuCisgKgorICogSW5wdXRzIDogY21kIC0gY29tbWFuZCB3aGljaCBjYXVzZWQgdGhlIFNDU0kgUkVTRVQKKyAqCisgKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzLgorICovCisgCitpbnQgCitOQ1I1M2M3eHhfcmVzZXQgKFNjc2lfQ21uZCAqY21kLCB1bnNpZ25lZCBpbnQgcmVzZXRfZmxhZ3MpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgaW50IGZvdW5kID0gMDsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqIGM7CisgICAgU2NzaV9DbW5kICp0bXA7CisgICAgLyoKKyAgICAgKiBXaGVuIHdlIGNhbGwgc2NzaV9kb25lKCksIGl0J3MgZ29pbmcgdG8gd2FrZSB1cCBhbnl0aGluZyBzbGVlcGluZyBvbiB0aGUKKyAgICAgKiByZXNvdXJjZXMgd2hpY2ggd2VyZSBpbiB1c2UgYnkgdGhlIGFib3J0ZWQgY29tbWFuZHMsIGFuZCB3ZSdsbCBzdGFydCB0byAKKyAgICAgKiBnZXQgbmV3IGNvbW1hbmRzLgorICAgICAqCisgICAgICogV2UgY2FuJ3QgbGV0IHRoaXMgaGFwcGVuIHVudGlsIGFmdGVyIHdlJ3ZlIHJlLWluaXRpYWxpemVkIHRoZSBkcml2ZXIKKyAgICAgKiBzdHJ1Y3R1cmVzLCBhbmQgY2FuJ3QgcmVpbml0aWFsaXplIHRob3NlIHN0cnVjdHVyZXMgdW50aWwgYWZ0ZXIgd2UndmUgCisgICAgICogZGVhbHQgd2l0aCB0aGVpciBjb250ZW50cy4KKyAgICAgKgorICAgICAqIFNvLCB3ZSBuZWVkIHRvIGZpbmQgYWxsIG9mIHRoZSBjb21tYW5kcyB3aGljaCB3ZXJlIHJ1bm5pbmcsIHN0aWNrCisgICAgICogdGhlbSBvbiBhIGxpbmtlZCBsaXN0IG9mIGNvbXBsZXRlZCBjb21tYW5kcyAod2UnbGwgdXNlIHRoZSBob3N0X3NjcmliYmxlCisgICAgICogcG9pbnRlciksIGRvIG91ciByZWluaXRpYWxpemF0aW9uLCBhbmQgdGhlbiBjYWxsIHRoZSBkb25lIGZ1bmN0aW9uIGZvcgorICAgICAqIGVhY2ggY29tbWFuZC4gIAorICAgICAqLworICAgIFNjc2lfQ21uZCAqbnVrZV9saXN0ID0gTlVMTDsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gY21kLT5kZXZpY2UtPmhvc3Q7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAKKyAgICAJKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGFbMF07CisKKyAgICBOQ1I1M2M3eDBfbG9jYWxfc2V0dXAoaG9zdCk7CisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIG5jcl9oYWx0IChob3N0KTsKKyAgICBwcmludF9sb3RzIChob3N0KTsKKyAgICBkdW1wX2V2ZW50cyAoaG9zdCwgMzApOworICAgIG5jcl9zY3NpX3Jlc2V0IChob3N0KTsKKyAgICBmb3IgKHRtcCA9IG51a2VfbGlzdCA9IHJldHVybl9vdXRzdGFuZGluZ19jb21tYW5kcyAoaG9zdCwgMSAvKiBmcmVlICovLAorCTAgLyogaXNzdWUgKi8gKTsgdG1wOyB0bXAgPSAoU2NzaV9DbW5kICopIHRtcC0+U0NwLmJ1ZmZlcikKKwlpZiAodG1wID09IGNtZCkgeworCSAgICBmb3VuZCA9IDE7CisJICAgIGJyZWFrOworCX0KKwkgICAgCisgICAgLyogCisgICAgICogSWYgd2UgZGlkbid0IGZpbmQgdGhlIGNvbW1hbmQgd2hpY2ggY2F1c2VkIHRoaXMgcmVzZXQgaW4gb3VyIHJ1bm5pbmcKKyAgICAgKiBsaXN0LCB0aGVuIHdlJ3ZlIGxvc3QgaXQuICBTZWUgdGhhdCBpdCB0ZXJtaW5hdGVzIG5vcm1hbGx5IGFueXdheS4KKyAgICAgKi8KKyAgICBpZiAoIWZvdW5kKSB7CisgICAgCWMgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgY21kLT5ob3N0X3NjcmliYmxlOworICAgIAlpZiAoYykgeworCSAgICBjbWQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworICAgIAkgICAgYy0+bmV4dCA9IGhvc3RkYXRhLT5mcmVlOworICAgIAkgICAgaG9zdGRhdGEtPmZyZWUgPSBjOworICAgIAl9IGVsc2UKKwkgICAgcHJpbnRrICgic2NzaSVkOiBsb3N0IGNvbW1hbmQgJWxkXG4iLCBob3N0LT5ob3N0X25vLCBjbWQtPnBpZCk7CisJY21kLT5TQ3AuYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBudWtlX2xpc3Q7CisJbnVrZV9saXN0ID0gY21kOworICAgIH0KKworICAgIE5DUjUzYzd4MF9kcml2ZXJfaW5pdCAoaG9zdCk7CisgICAgaG9zdGRhdGEtPnNvZnRfcmVzZXQgKGhvc3QpOworICAgIGlmIChob3N0ZGF0YS0+cmVzZXRzID09IDApIAorCWRpc2FibGUoaG9zdCk7CisgICAgZWxzZSBpZiAoaG9zdGRhdGEtPnJlc2V0cyAhPSAtMSkKKwktLWhvc3RkYXRhLT5yZXNldHM7CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIGZvciAoOyBudWtlX2xpc3Q7IG51a2VfbGlzdCA9IHRtcCkgeworCXRtcCA9IChTY3NpX0NtbmQgKikgbnVrZV9saXN0LT5TQ3AuYnVmZmVyOworICAgIAludWtlX2xpc3QtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwludWtlX2xpc3QtPnNjc2lfZG9uZSAobnVrZV9saXN0KTsKKyAgICB9CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIHJldHVybiBTQ1NJX1JFU0VUX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBUaGUgTkNSIFNETVMgYmlvcyBmb2xsb3dzIEFubmV4IEEgb2YgdGhlIFNDU0ktQ0FNIGRyYWZ0LCBhbmQgCisgKiB0aGVyZWZvcmUgc2hhcmVzIHRoZSBzY3NpY2FtX2Jpb3NfcGFyYW0gZnVuY3Rpb24uCisgKi8KKworLyoKKyAqIEZ1bmN0aW9uIDogaW50IGluc25fdG9fb2Zmc2V0IChTY3NpX0NtbmQgKmNtZCwgdTMyICppbnNuKQorICoKKyAqIFB1cnBvc2UgOiBjb252ZXJ0IGluc3RydWN0aW9ucyBzdG9yZWQgYXQgTkNSIHBvaW50ZXIgaW50byBkYXRhIAorICoJcG9pbnRlciBvZmZzZXQuCisgKiAKKyAqIElucHV0cyA6IGNtZCAtIFNDU0kgY29tbWFuZDsgaW5zbiAtIHBvaW50ZXIgdG8gaW5zdHJ1Y3Rpb24uICBFaXRoZXIgY3VycmVudAorICoJRFNQLCBvciBzYXZlZCBkYXRhIHBvaW50ZXIuCisgKgorICogUmV0dXJucyA6IG9mZnNldCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorICovCisKKworc3RhdGljIGludCAKK2luc25fdG9fb2Zmc2V0IChTY3NpX0NtbmQgKmNtZCwgdTMyICppbnNuKSB7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAKKwkoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKSBjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF07CisgICAgc3RydWN0IE5DUjUzYzd4MF9jbWQgKm5jbWQgPSAKKwkoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgY21kLT5ob3N0X3NjcmliYmxlOworICAgIGludCBvZmZzZXQgPSAwLCBidWZmZXJzOworICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2VnbWVudDsKKyAgICBjaGFyICpwdHI7CisgICAgaW50IGZvdW5kID0gMDsKKworLyoKKyAqIFdpdGggdGhlIGN1cnJlbnQgY29kZSBpbXBsZW1lbnRhdGlvbiwgaWYgdGhlIGluc24gaXMgaW5zaWRlIGR5bmFtaWNhbGx5IAorICogZ2VuZXJhdGVkIGNvZGUsIHRoZSBkYXRhIHBvaW50ZXIgd2lsbCBiZSB0aGUgaW5zdHJ1Y3Rpb24gcHJlY2VkaW5nIAorICogdGhlIG5leHQgdHJhbnNmZXIgc2VnbWVudC4KKyAqLworCisgICAgaWYgKCFjaGVja19hZGRyZXNzICgodW5zaWduZWQgbG9uZykgbmNtZCwgc2l6ZW9mIChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCkpICYmCisJKChpbnNuID49IG5jbWQtPmRhdGFfdHJhbnNmZXJfc3RhcnQgJiYgIAorICAgIAkgICAgaW5zbiA8IG5jbWQtPmRhdGFfdHJhbnNmZXJfZW5kKSB8fAorICAgIAkoaW5zbiA+PSBuY21kLT5yZXNpZHVhbCAmJgorICAgIAkgICAgaW5zbiA8IChuY21kLT5yZXNpZHVhbCArIAorICAgIAkgICAgCXNpemVvZihuY21kLT5yZXNpZHVhbCkpKSkpIHsKKwkgICAgcHRyID0gYnVzX3RvX3ZpcnQoaW5zblszXSk7CisKKwkgICAgaWYgKChidWZmZXJzID0gY21kLT51c2Vfc2cpKSB7CisgICAgCSAgICAJZm9yIChvZmZzZXQgPSAwLCAKKwkJICAgICAJc2VnbWVudCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgY21kLT5idWZmZXI7CisgICAgCSAgICAJICAgICBidWZmZXJzICYmICEoKGZvdW5kID0gKChwdHIgPj0gKGNoYXIgKilwYWdlX2FkZHJlc3Moc2VnbWVudC0+cGFnZSkrc2VnbWVudC0+b2Zmc2V0KSAmJiAKKyAgICAJICAgIAkgICAgCSAgICAocHRyIDwgKChjaGFyICopcGFnZV9hZGRyZXNzKHNlZ21lbnQtPnBhZ2UpK3NlZ21lbnQtPm9mZnNldCtzZWdtZW50LT5sZW5ndGgpKSkpKTsKKyAgICAJICAgIAkgICAgIC0tYnVmZmVycywgb2Zmc2V0ICs9IHNlZ21lbnQtPmxlbmd0aCwgKytzZWdtZW50KQorI2lmIDAKKwkJICAgIHByaW50aygic2NzaSVkOiBjb21wYXJpbmcgMHglcCB0byAweCVwXG4iLCAKKwkJCWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLCBzYXZlZCwgcGFnZV9hZGRyZXNzKHNlZ21lbnQtPnBhZ2Urc2VnbWVudC0+b2Zmc2V0KTsKKyNlbHNlCisJCSAgICA7CisjZW5kaWYKKyAgICAJICAgIAkgICAgb2Zmc2V0ICs9IHB0ciAtICgoY2hhciAqKXBhZ2VfYWRkcmVzcyhzZWdtZW50LT5wYWdlKStzZWdtZW50LT5vZmZzZXQpOworICAgIAkgICAgfSBlbHNlIHsKKwkJZm91bmQgPSAxOworICAgIAkgICAgCW9mZnNldCA9IHB0ciAtIChjaGFyICopIChjbWQtPnJlcXVlc3RfYnVmZmVyKTsKKyAgICAJICAgIH0KKyAgICB9IGVsc2UgaWYgKChpbnNuID49IGhvc3RkYXRhLT5zY3JpcHQgKyAKKwkJaG9zdGRhdGEtPkVfZGF0YV90cmFuc2ZlciAvIHNpemVvZih1MzIpKSAmJgorCSAgICAgICAoaW5zbiA8PSBob3N0ZGF0YS0+c2NyaXB0ICsKKwkJaG9zdGRhdGEtPkVfZW5kX2RhdGFfdHJhbnNmZXIgLyBzaXplb2YodTMyKSkpIHsKKyAgICAJZm91bmQgPSAxOworCW9mZnNldCA9IDA7CisgICAgfQorICAgIHJldHVybiBmb3VuZCA/IG9mZnNldCA6IC0xOworfQorCisKKworLyoKKyAqIEZ1bmN0aW9uIDogdm9pZCBwcmludF9wcm9ncmVzcyAoU2NzaV9DbW5kICpjbWQpIAorICogCisgKiBQdXJwb3NlIDogcHJpbnQgdGhlIGN1cnJlbnQgbG9jYXRpb24gb2YgdGhlIHNhdmVkIGRhdGEgcG9pbnRlcgorICoKKyAqIElucHV0cyA6IGNtZCAtIGNvbW1hbmQgd2UgYXJlIGludGVyZXN0ZWQgaW4KKyAqCisgKi8KKworc3RhdGljIHZvaWQgCitwcmludF9wcm9ncmVzcyAoU2NzaV9DbW5kICpjbWQpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpuY21kID0gCisJKHN0cnVjdCBOQ1I1M2M3eDBfY21kICopIGNtZC0+aG9zdF9zY3JpYmJsZTsKKyAgICBpbnQgb2Zmc2V0LCBpOworICAgIGNoYXIgKndoZXJlOworICAgIHUzMiAqcHRyOworICAgIE5DUjUzYzd4MF9sb2NhbF9zZXR1cCAoY21kLT5kZXZpY2UtPmhvc3QpOworCisgICAgaWYgKGNoZWNrX2FkZHJlc3MgKCh1bnNpZ25lZCBsb25nKSBuY21kLHNpemVvZiAoc3RydWN0IE5DUjUzYzd4MF9jbWQpKSA9PSAwKQorICAgIHsKKwlwcmludGsoIlxuTkNSNTNjN3gwX2NtZCBmaWVsZHM6XG4iKTsKKwlwcmludGsoIiAgYm91bmNlLmxlbj0weCV4LCBhZGRyPTB4JTB4LCBidWZbXT0weCUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJICAgIG5jbWQtPmJvdW5jZS5sZW4sIG5jbWQtPmJvdW5jZS5hZGRyLCBuY21kLT5ib3VuY2UuYnVmWzBdLAorCSAgICBuY21kLT5ib3VuY2UuYnVmWzFdLCBuY21kLT5ib3VuY2UuYnVmWzJdLCBuY21kLT5ib3VuY2UuYnVmWzNdKTsKKwlwcmludGsoIiAgcmVzdWx0PSUwNHgsIGNkYlswXT0weCUwMnhcbiIsIG5jbWQtPnJlc3VsdCwgbmNtZC0+Y21uZFswXSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworCWlmIChjaGVja19hZGRyZXNzICgodW5zaWduZWQgbG9uZykgbmNtZCwgCisJICAgIHNpemVvZiAoc3RydWN0IE5DUjUzYzd4MF9jbWQpKSA9PSAtMSkgCisJICAgIGNvbnRpbnVlOworCWlmICghaSkgeworCSAgICB3aGVyZSA9ICJzYXZlZCI7CisJICAgIHB0ciA9IGJ1c190b192aXJ0KG5jbWQtPnNhdmVkX2RhdGFfcG9pbnRlcik7CisJfSBlbHNlIHsKKwkgICAgd2hlcmUgPSAiYWN0aXZlIjsKKwkgICAgcHRyID0gYnVzX3RvX3ZpcnQgKE5DUjUzYzd4MF9yZWFkMzIgKERTUF9SRUcpIC0KKwkJTkNSNTNjN3gwX2luc25fc2l6ZSAoTkNSNTNjN3gwX3JlYWQ4IChEQ01EX1JFRykpICoKKwkJc2l6ZW9mKHUzMikpOworCX0gCisJb2Zmc2V0ID0gaW5zbl90b19vZmZzZXQgKGNtZCwgcHRyKTsKKworCWlmIChvZmZzZXQgIT0gLTEpIAorCSAgICBwcmludGsgKCJzY3NpJWQgOiAlcyBkYXRhIHBvaW50ZXIgYXQgb2Zmc2V0ICVkXG4iLAorCQljbWQtPmRldmljZS0+aG9zdC0+aG9zdF9ubywgd2hlcmUsIG9mZnNldCk7CisJZWxzZSB7CisJICAgIGludCBzaXplOworCSAgICBwcmludGsgKCJzY3NpJWQgOiBjYW4ndCBkZXRlcm1pbmUgJXMgZGF0YSBwb2ludGVyIG9mZnNldFxuIiwKKwkJY21kLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8sIHdoZXJlKTsKKwkgICAgaWYgKG5jbWQpIHsKKwkJc2l6ZSA9IHByaW50X2luc24gKGNtZC0+ZGV2aWNlLT5ob3N0LAorCQkgICAgYnVzX3RvX3ZpcnQobmNtZC0+c2F2ZWRfZGF0YV9wb2ludGVyKSwgIiIsIDEpOworCQlwcmludF9pbnNuIChjbWQtPmRldmljZS0+aG9zdCwKKwkJICAgIGJ1c190b192aXJ0KG5jbWQtPnNhdmVkX2RhdGFfcG9pbnRlcikgKyBzaXplICogc2l6ZW9mKHUzMiksCisJCSAgICAiIiwgMSk7CisJICAgIH0KKwl9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIAorcHJpbnRfZHNhIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCB1MzIgKmRzYSwgY29uc3QgY2hhciAqcHJlZml4KSB7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorCWhvc3QtPmhvc3RkYXRhWzBdOworICAgIGludCBpLCBsZW47CisgICAgY2hhciAqcHRyOworICAgIFNjc2lfQ21uZCAqY21kOworCisgICAgaWYgKGNoZWNrX2FkZHJlc3MgKCh1bnNpZ25lZCBsb25nKSBkc2EsIGhvc3RkYXRhLT5kc2FfZW5kIC0gCisJaG9zdGRhdGEtPmRzYV9zdGFydCkgPT0gLTEpIHsKKwlwcmludGsoInNjc2klZCA6IGJhZCBkc2EgdmlydCAweCVwXG4iLCBob3N0LT5ob3N0X25vLCBkc2EpOworCXJldHVybjsKKyAgICB9CisgICAgcHJpbnRrKCIlc3Njc2klZCA6IGRzYSBhdCBwaHlzIDB4JWx4ICh2aXJ0IDB4JXApXG4iCisJICAgICIgICAgICAgICsgJWQgOiBkc2FfbXNnb3V0IGxlbmd0aCA9ICV1LCBkYXRhID0gMHgleCAodmlydCAweCVwKVxuIiAsCisgICAgCSAgICBwcmVmaXggPyBwcmVmaXggOiAiIiwKKyAgICAJICAgIGhvc3QtPmhvc3Rfbm8sICB2aXJ0X3RvX2J1cyAoZHNhKSwgZHNhLCBob3N0ZGF0YS0+ZHNhX21zZ291dCwKKyAgICAJICAgIGRzYVtob3N0ZGF0YS0+ZHNhX21zZ291dCAvIHNpemVvZih1MzIpXSwKKwkgICAgZHNhW2hvc3RkYXRhLT5kc2FfbXNnb3V0IC8gc2l6ZW9mKHUzMikgKyAxXSwKKwkgICAgYnVzX3RvX3ZpcnQgKGRzYVtob3N0ZGF0YS0+ZHNhX21zZ291dCAvIHNpemVvZih1MzIpICsgMV0pKTsKKworICAgIC8qIAorICAgICAqIE9ubHkgcHJpbnQgbWVzc2FnZXMgaWYgdGhleSdyZSBzYW5lIGluIGxlbmd0aCBzbyB3ZSBkb24ndAorICAgICAqIGJsb3cgdGhlIGtlcm5lbCBwcmludGsgYnVmZmVyIG9uIHNvbWV0aGluZyB3aGljaCB3b24ndCBidXkgdXMKKyAgICAgKiBhbnl0aGluZy4KKyAgICAgKi8KKworICAgIGlmIChkc2FbaG9zdGRhdGEtPmRzYV9tc2dvdXQgLyBzaXplb2YodTMyKV0gPCAKKwkgICAgc2l6ZW9mIChob3N0ZGF0YS0+ZnJlZS0+c2VsZWN0KSkgCisJZm9yIChpID0gZHNhW2hvc3RkYXRhLT5kc2FfbXNnb3V0IC8gc2l6ZW9mKHUzMildLAorCSAgICBwdHIgPSBidXNfdG9fdmlydCAoZHNhW2hvc3RkYXRhLT5kc2FfbXNnb3V0IC8gc2l6ZW9mKHUzMikgKyAxXSk7IAorCSAgICBpID4gMCAmJiAhY2hlY2tfYWRkcmVzcyAoKHVuc2lnbmVkIGxvbmcpIHB0ciwgMSk7CisJICAgIHB0ciArPSBsZW4sIGkgLT0gbGVuKSB7CisJICAgIHByaW50aygiICAgICAgICAgICAgICAgIik7CisJICAgIGxlbiA9IHByaW50X21zZyAocHRyKTsKKwkgICAgcHJpbnRrKCJcbiIpOworCSAgICBpZiAoIWxlbikKKwkJYnJlYWs7CisJfQorCisgICAgcHJpbnRrKCIgICAgICAgICsgJWQgOiBzZWxlY3RfaW5kaXJlY3QgPSAweCV4XG4iLAorCWhvc3RkYXRhLT5kc2Ffc2VsZWN0LCBkc2FbaG9zdGRhdGEtPmRzYV9zZWxlY3QgLyBzaXplb2YodTMyKV0pOworICAgIGNtZCA9IChTY3NpX0NtbmQgKikgYnVzX3RvX3ZpcnQoZHNhW2hvc3RkYXRhLT5kc2FfY21uZCAvIHNpemVvZih1MzIpXSk7CisgICAgcHJpbnRrKCIgICAgICAgICsgJWQgOiBkc2FfY21uZCA9IDB4JXggIiwgaG9zdGRhdGEtPmRzYV9jbW5kLAorCSAgICh1MzIpIHZpcnRfdG9fYnVzKGNtZCkpOworICAgIC8qIFhYWCBNYXliZSB3ZSBzaG91bGQgYWNjZXNzIGNtZC0+aG9zdF9zY3JpYmJsZS0+cmVzdWx0IGhlcmUuIFJHSCAqLworICAgIGlmIChjbWQpIHsKKwlwcmludGsoIiAgICAgICAgICAgICAgIHJlc3VsdCA9IDB4JXgsIHRhcmdldCA9ICVkLCBsdW4gPSAlZCwgY21kID0gIiwKKwkgICAgY21kLT5yZXN1bHQsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisJcHJpbnRfY29tbWFuZChjbWQtPmNtbmQpOworICAgIH0gZWxzZQorCXByaW50aygiXG4iKTsKKyAgICBwcmludGsoIiAgICAgICAgKyAlZCA6IGRzYV9uZXh0ID0gMHgleFxuIiwgaG9zdGRhdGEtPmRzYV9uZXh0LAorCWRzYVtob3N0ZGF0YS0+ZHNhX25leHQgLyBzaXplb2YodTMyKV0pOworICAgIGlmIChjbWQpIHsgCisJcHJpbnRrKCJzY3NpJWQgdGFyZ2V0ICVkIDogc3hmZXJfc2FuaXR5ID0gMHgleCwgc2NudGwzX3Nhbml0eSA9IDB4JXhcbiIKKwkgICAgICAgIiAgICAgICAgICAgICAgICAgICBzY3JpcHQgOiAiLAorCSAgICBob3N0LT5ob3N0X25vLCBjbWQtPmRldmljZS0+aWQsCisJICAgIGhvc3RkYXRhLT5zeW5jW2NtZC0+ZGV2aWNlLT5pZF0uc3hmZXJfc2FuaXR5LAorCSAgICBob3N0ZGF0YS0+c3luY1tjbWQtPmRldmljZS0+aWRdLnNjbnRsM19zYW5pdHkpOworCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKGhvc3RkYXRhLT5zeW5jW2NtZC0+ZGV2aWNlLT5pZF0uc2NyaXB0KSAvIDQpOyArK2kpCisJICAgIHByaW50ayAoIjB4JXggIiwgaG9zdGRhdGEtPnN5bmNbY21kLT5kZXZpY2UtPmlkXS5zY3JpcHRbaV0pOworCXByaW50ayAoIlxuIik7CisgICAgCXByaW50X3Byb2dyZXNzIChjbWQpOworICAgIH0KK30KKy8qCisgKiBGdW5jdGlvbiA6IHZvaWQgcHJpbnRfcXVldWVzIChTY3NpX0hvc3QgKmhvc3QpIAorICogCisgKiBQdXJwb3NlIDogcHJpbnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBOQ1IgaXNzdWUgYW5kIHJlY29ubmVjdCBxdWV1ZXMKKyAqCisgKiBJbnB1dHMgOiBob3N0IC0gU0NTSSBob3N0IHdlIGFyZSBpbnRlcmVzdGVkIGluCisgKgorICovCisKK3N0YXRpYyB2b2lkIAorcHJpbnRfcXVldWVzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KSB7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorCWhvc3QtPmhvc3RkYXRhWzBdOworICAgIHUzMiAqZHNhLCAqbmV4dF9kc2E7CisgICAgdm9sYXRpbGUgdTMyICpuY3JjdXJyZW50OworICAgIGludCBsZWZ0OworICAgIFNjc2lfQ21uZCAqY21kLCAqbmV4dF9jbWQ7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIHByaW50ayAoInNjc2klZCA6IGlzc3VlIHF1ZXVlXG4iLCBob3N0LT5ob3N0X25vKTsKKworICAgIGZvciAobGVmdCA9IGhvc3QtPmNhbl9xdWV1ZSwgY21kID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7IAorCSAgICBsZWZ0ID49IDAgJiYgY21kOyAKKwkgICAgY21kID0gbmV4dF9jbWQpIHsKKwluZXh0X2NtZCA9IChTY3NpX0NtbmQgKikgY21kLT5TQ3AucHRyOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAoY21kLT5ob3N0X3NjcmliYmxlKSB7CisJICAgIGlmIChjaGVja19hZGRyZXNzICgodW5zaWduZWQgbG9uZykgKGNtZC0+aG9zdF9zY3JpYmJsZSksIAorCQlzaXplb2YgKGNtZC0+aG9zdF9zY3JpYmJsZSkpID09IC0xKQorCQlwcmludGsgKCJzY3NpJWQ6IHNjc2kgcGlkICVsZCBiYWQgcG9pbnRlciB0byBOQ1I1M2M3eDBfY21kXG4iLAorCQkgICAgaG9zdC0+aG9zdF9ubywgY21kLT5waWQpOworCSAgICAvKiBwcmludF9kc2EgZG9lcyBzYW5pdHkgY2hlY2sgb24gYWRkcmVzcywgbm8gbmVlZCB0byBjaGVjayAqLworCSAgICBlbHNlCisJICAgIAlwcmludF9kc2EgKGhvc3QsICgoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgY21kLT5ob3N0X3NjcmliYmxlKQorCQkgICAgLT4gZHNhLCAiIik7CisJfSBlbHNlIAorCSAgICBwcmludGsgKCJzY3NpJWQgOiBzY3NpIHBpZCAlbGQgZm9yIHRhcmdldCAlZCBsdW4gJWQgaGFzIG5vIE5DUjUzYzd4MF9jbWRcbiIsCisJCWhvc3QtPmhvc3Rfbm8sIGNtZC0+cGlkLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICB9CisKKyAgICBpZiAobGVmdCA8PSAwKSB7CisJcHJpbnRrICgic2NzaSVkIDogbG9vcCBkZXRlY3RlZCBpbiBpc3N1ZSBxdWV1ZVxuIiwKKwkgICAgaG9zdC0+aG9zdF9ubyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUcmF2ZXJzZSB0aGUgTkNSIHJlY29ubmVjdCBhbmQgc3RhcnQgRFNBIHN0cnVjdHVyZXMsIHByaW50aW5nIG91dCAKKyAgICAgKiBlYWNoIGVsZW1lbnQgdW50aWwgd2UgaGl0IHRoZSBlbmQgb3IgZGV0ZWN0IGEgbG9vcC4gIEN1cnJlbnRseSwKKyAgICAgKiB0aGUgcmVjb25uZWN0IHN0cnVjdHVyZSBpcyBhIGxpbmtlZCBsaXN0OyBhbmQgdGhlIHN0YXJ0IHN0cnVjdHVyZQorICAgICAqIGlzIGFuIGFycmF5LiAgRXZlbnR1YWxseSwgdGhlIHJlY29ubmVjdCBzdHJ1Y3R1cmUgd2lsbCBiZWNvbWUgYSAKKyAgICAgKiBsaXN0IGFzIHdlbGwsIHNpbmNlIHRoaXMgc2ltcGxpZmllcyB0aGUgY29kZS4KKyAgICAgKi8KKworICAgIHByaW50ayAoInNjc2klZCA6IHNjaGVkdWxlIGRzYSBhcnJheSA6XG4iLCBob3N0LT5ob3N0X25vKTsKKyAgICBmb3IgKGxlZnQgPSBob3N0LT5jYW5fcXVldWUsIG5jcmN1cnJlbnQgPSBob3N0ZGF0YS0+c2NoZWR1bGU7CisJICAgIGxlZnQgPiAwOyBuY3JjdXJyZW50ICs9IDIsIC0tbGVmdCkKKwlpZiAobmNyY3VycmVudFswXSAhPSBob3N0ZGF0YS0+Tk9QX2luc24pIAorLyogRklYTUUgOiBjb252ZXJ0IHBvaW50ZXIgdG8gZHNhX2JlZ2luIHRvIHBvaW50ZXIgdG8gZHNhLiAqLworCSAgICBwcmludF9kc2EgKGhvc3QsIGJ1c190b192aXJ0IChuY3JjdXJyZW50WzFdIC0gCisJCShob3N0ZGF0YS0+RV9kc2FfY29kZV9iZWdpbiAtIAorCQlob3N0ZGF0YS0+RV9kc2FfY29kZV90ZW1wbGF0ZSkpLCAiIik7CisgICAgcHJpbnRrICgic2NzaSVkIDogZW5kIHNjaGVkdWxlIGRzYSBhcnJheVxuIiwgaG9zdC0+aG9zdF9ubyk7CisgICAgCisgICAgcHJpbnRrICgic2NzaSVkIDogcmVjb25uZWN0X2RzYV9oZWFkIDpcbiIsIGhvc3QtPmhvc3Rfbm8pOworCSAgICAKKyAgICBmb3IgKGxlZnQgPSBob3N0LT5jYW5fcXVldWUsIAorCWRzYSA9IGJ1c190b192aXJ0IChob3N0ZGF0YS0+cmVjb25uZWN0X2RzYV9oZWFkKTsKKwlsZWZ0ID49IDAgJiYgZHNhOyAKKwlkc2EgPSBuZXh0X2RzYSkgeworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAoY2hlY2tfYWRkcmVzcyAoKHVuc2lnbmVkIGxvbmcpIGRzYSwgc2l6ZW9mKGRzYSkpID09IC0xKSB7CisJICAgIHByaW50ayAoInNjc2klZDogYmFkIERTQSBwb2ludGVyIDB4JXAiLCBob3N0LT5ob3N0X25vLAorCQlkc2EpOworCSAgICBuZXh0X2RzYSA9IE5VTEw7CisJfQorCWVsc2UgCisJeworCSAgICBuZXh0X2RzYSA9IGJ1c190b192aXJ0KGRzYVtob3N0ZGF0YS0+ZHNhX25leHQgLyBzaXplb2YodTMyKV0pOworCSAgICBwcmludF9kc2EgKGhvc3QsIGRzYSwgIiIpOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgICAgfQorICAgIHByaW50ayAoInNjc2klZCA6IGVuZCByZWNvbm5lY3RfZHNhX2hlYWRcbiIsIGhvc3QtPmhvc3Rfbm8pOworICAgIGlmIChsZWZ0IDwgMCkKKwlwcmludGsoInNjc2klZDogcG9zc2libGUgbG9vcCBpbiBuY3IgcmVjb25uZWN0IGxpc3RcbiIsCisJICAgIGhvc3QtPmhvc3Rfbm8pOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfbG90cyAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkgeworICAgIE5DUjUzYzd4MF9sb2NhbF9kZWNsYXJlKCk7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAKKwkoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YVswXTsKKyAgICB1MzIgKmRzcF9uZXh0LCAqZHNwLCAqZHNhLCBkYmNfZGNtZDsKKyAgICB1bnNpZ25lZCBjaGFyIGRjbWQsIHNiY2w7CisgICAgaW50IGksIHNpemU7CisgICAgTkNSNTNjN3gwX2xvY2FsX3NldHVwKGhvc3QpOworCisgICAgaWYgKChkc3BfbmV4dCA9IGJ1c190b192aXJ0KE5DUjUzYzd4MF9yZWFkMzIgKERTUF9SRUcpKSkpIHsKKyAgICAJZGJjX2RjbWQgPSBOQ1I1M2M3eDBfcmVhZDMyKERCQ19SRUcpOworICAgIAlkY21kID0gKGRiY19kY21kICYgMHhmZjAwMDAwMCkgPj4gMjQ7CisgICAgCWRzcCA9IGRzcF9uZXh0IC0gTkNSNTNjN3gwX2luc25fc2l6ZShkY21kKTsKKwlkc2EgPSBidXNfdG9fdmlydChOQ1I1M2M3eDBfcmVhZDMyKERTQV9SRUcpKTsKKwlzYmNsID0gTkNSNTNjN3gwX3JlYWQ4IChTQkNMX1JFRyk7CisJICAgIAorCS8qCisJICogRm9yIHRoZSA1M2M3MTAsIHRoZSBmb2xsb3dpbmcgd2lsbCByZXBvcnQgdmFsdWUgMCBmb3IgU0NOVEwzCisJICogYW5kIFNURVNUMCAtIHdlIGRvbid0IGhhdmUgdGhlc2UgcmVnaXN0ZXJzLgorCSAqLworICAgIAlwcmludGsgKCJzY3NpJWQgOiBEQ01EfERCQz0weCV4LCBETkFEPTB4JXggKHZpcnQgMHglcClcbiIKKwkJIiAgICAgICAgIERTQT0weCVseCAodmlydCAweCVwKVxuIgorCSAgICAgICAgIiAgICAgICAgIERTUFM9MHgleCwgVEVNUD0weCV4ICh2aXJ0IDB4JXApLCBETU9ERT0weCV4XG4iCisJCSIgICAgICAgICBTWEZFUj0weCV4LCBTQ05UTDM9MHgleFxuIgorCQkiICAgICAgICAgJXMlcyVzcGhhc2U9JXMsICVkIGJ5dGVzIGluIFNDU0kgRklGT1xuIgorCQkiICAgICAgICAgU0NSQVRDSD0weCV4LCBzYXZlZDJfZHNhPTB4JTBseFxuIiwKKwkgICAgaG9zdC0+aG9zdF9ubywgZGJjX2RjbWQsIE5DUjUzYzd4MF9yZWFkMzIoRE5BRF9SRUcpLAorCQlidXNfdG9fdmlydChOQ1I1M2M3eDBfcmVhZDMyKEROQURfUkVHKSksCisJICAgIHZpcnRfdG9fYnVzKGRzYSksIGRzYSwKKwkgICAgTkNSNTNjN3gwX3JlYWQzMihEU1BTX1JFRyksIE5DUjUzYzd4MF9yZWFkMzIoVEVNUF9SRUcpLCAKKwkgICAgYnVzX3RvX3ZpcnQgKE5DUjUzYzd4MF9yZWFkMzIoVEVNUF9SRUcpKSwKKwkgICAgKGludCkgTkNSNTNjN3gwX3JlYWQ4KGhvc3RkYXRhLT5kbW9kZSksCisJICAgIChpbnQpIE5DUjUzYzd4MF9yZWFkOChTWEZFUl9SRUcpLCAKKwkgICAgKChob3N0ZGF0YS0+Y2hpcCAvIDEwMCkgPT0gOCkgPworCQkoaW50KSBOQ1I1M2M3eDBfcmVhZDgoU0NOVEwzX1JFR184MDApIDogMCwKKwkgICAgKHNiY2wgJiBTQkNMX0JTWSkgPyAiQlNZICIgOiAiIiwKKwkgICAgKHNiY2wgJiBTQkNMX1NFTCkgPyAiU0VMICIgOiAiIiwKKwkgICAgKHNiY2wgJiBTQkNMX1JFUSkgPyAiUkVRICIgOiAiIiwKKwkgICAgc3N0YXQyX3RvX3BoYXNlKE5DUjUzYzd4MF9yZWFkOCAoKChob3N0ZGF0YS0+Y2hpcCAvIDEwMCkgPT0gOCkgPworCSAgICAJU1NUQVQxX1JFRyA6IFNTVEFUMl9SRUcpKSwKKwkgICAgKE5DUjUzYzd4MF9yZWFkOCAoKGhvc3RkYXRhLT5jaGlwIC8gMTAwKSA9PSA4ID8gCisJCVNTVEFUMV9SRUcgOiBTU1RBVDJfUkVHKSAmIFNTVEFUMl9GRl9NQVNLKSA+PiBTU1RBVDJfRkZfU0hJRlQsCisJICAgICgoaG9zdGRhdGEtPmNoaXAgLyAxMDApID09IDgpID8gTkNSNTNjN3gwX3JlYWQ4IChTVEVTVDBfUkVHXzgwMCkgOgorCQlOQ1I1M2M3eDBfcmVhZDMyKFNDUkFUQ0hBX1JFR184MDApLAorCSAgICBob3N0ZGF0YS0+c2F2ZWQyX2RzYSk7CisJcHJpbnRrICgic2NzaSVkIDogRFNQIDB4JWx4ICh2aXJ0IDB4JXApIC0+XG4iLCBob3N0LT5ob3N0X25vLCAKKwkgICAgdmlydF90b19idXMoZHNwKSwgZHNwKTsKKyAgICAJZm9yIChpID0gNjsgaSA+IDA7IC0taSwgZHNwICs9IHNpemUpCisJICAgIHNpemUgPSBwcmludF9pbnNuIChob3N0LCBkc3AsICIiLCAxKTsKKwlpZiAoTkNSNTNjN3gwX3JlYWQ4IChTQ05UTDFfUkVHKSAmIFNDTlRMMV9DT04pICB7CisJICAgIGlmICgoaG9zdGRhdGEtPmNoaXAgLyAxMDApID09IDgpCisJICAgICAgICBwcmludGsgKCJzY3NpJWQgOiBjb25uZWN0ZWQgKFNESUQ9MHgleCwgU1NJRD0weCV4KVxuIiwKKwkJICAgIGhvc3QtPmhvc3Rfbm8sIE5DUjUzYzd4MF9yZWFkOCAoU0RJRF9SRUdfODAwKSwKKwkJICAgIE5DUjUzYzd4MF9yZWFkOCAoU1NJRF9SRUdfODAwKSk7CisJICAgIGVsc2UKKwkJcHJpbnRrICgic2NzaSVkIDogY29ubmVjdGVkIChTRElEPTB4JXgpXG4iLAorCQkgICAgaG9zdC0+aG9zdF9ubywgTkNSNTNjN3gwX3JlYWQ4IChTRElEX1JFR183MDApKTsKKwkgICAgcHJpbnRfZHNhIChob3N0LCBkc2EsICIiKTsKKwl9CisKKyNpZiAxCisJcHJpbnRfcXVldWVzIChob3N0KTsKKyNlbmRpZgorICAgIH0KK30KKworLyoKKyAqIEZ1bmN0aW9uIDogc3RhdGljIGludCBzaHV0ZG93biAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKKyAqIAorICogUHVycG9zZSA6IGRvZXMgYSBjbGVhbiAod2UgaG9wZSkgc2h1dGRvd24gb2YgdGhlIE5DUiBTQ1NJIAorICoJY2hpcC4gIFVzZSBwcmlvciB0byBkdW1waW5nIGNvcmUsIHVubG9hZGluZyB0aGUgTkNSIGRyaXZlciwKKyAqIAorICogUmV0dXJucyA6IDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IAorc2h1dGRvd24gKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorCWhvc3QtPmhvc3RkYXRhWzBdOworICAgIE5DUjUzYzd4MF9sb2NhbF9zZXR1cChob3N0KTsKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisvKiBHZXQgaW4gYSBzdGF0ZSB3aGVyZSB3ZSBjYW4gcmVzZXQgdGhlIFNDU0kgYnVzICovCisgICAgbmNyX2hhbHQgKGhvc3QpOworICAgIG5jcl9zY3NpX3Jlc2V0IChob3N0KTsKKyAgICBob3N0ZGF0YS0+c29mdF9yZXNldChob3N0KTsKKworICAgIGRpc2FibGUgKGhvc3QpOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogdm9pZCBuY3Jfc2NzaV9yZXNldCAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKKyAqCisgKiBQdXJwb3NlIDogcmVzZXQgdGhlIFNDU0kgYnVzLgorICovCisKK3N0YXRpYyB2b2lkIAorbmNyX3Njc2lfcmVzZXQgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgTkNSNTNjN3gwX2xvY2FsX3NldHVwKGhvc3QpOworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICBOQ1I1M2M3eDBfd3JpdGU4KFNDTlRMMV9SRUcsIFNDTlRMMV9SU1QpOworICAgIHVkZWxheSgyNSk7CS8qIE1pbmltdW0gYW1vdW50IG9mIHRpbWUgdG8gYXNzZXJ0IFJTVCAqLworICAgIE5DUjUzYzd4MF93cml0ZTgoU0NOVEwxX1JFRywgMCk7CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKiAKKyAqIEZ1bmN0aW9uIDogdm9pZCBoYXJkX3Jlc2V0IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQorICoKKyAqLworCitzdGF0aWMgdm9pZCAKK2hhcmRfcmVzZXQgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopCisJaG9zdC0+aG9zdGRhdGFbMF07CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgbmNyX3Njc2lfcmVzZXQoaG9zdCk7CisgICAgTkNSNTNjN3gwX2RyaXZlcl9pbml0IChob3N0KTsKKyAgICBpZiAoaG9zdGRhdGEtPnNvZnRfcmVzZXQpCisJaG9zdGRhdGEtPnNvZnRfcmVzZXQgKGhvc3QpOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworCisvKgorICogRnVuY3Rpb24gOiBTY3NpX0NtbmQgKnJldHVybl9vdXRzdGFuZGluZ19jb21tYW5kcyAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwKKyAqCWludCBmcmVlLCBpbnQgaXNzdWUpCisgKgorICogUHVycG9zZSA6IHJldHVybiBhIGxpbmtlZCBsaXN0ICh1c2luZyB0aGUgU0NwLmJ1ZmZlciBmaWVsZCBhcyBuZXh0LAorICoJc28gd2UgZG9uJ3QgcGVydHVyYiBob3N0ZGF0YS4gIFdlIGRvbid0IHVzZSBhIGZpZWxkIG9mIHRoZSAKKyAqCU5DUjUzYzd4MF9jbWQgc3RydWN0dXJlIHNpbmNlIHdlIG1heSBub3QgaGF2ZSBhbGxvY2F0ZWQgb25lIAorICoJZm9yIHRoZSBjb21tYW5kIGNhdXNpbmcgdGhlIHJlc2V0Likgb2YgU2NzaV9DbW5kIHN0cnVjdHVyZXMgdGhhdCAKKyAqICAJaGFkIHByb3BhZ2F0ZWQgYmVsb3cgdGhlIExpbnV4IGlzc3VlIHF1ZXVlIGxldmVsLiAgSWYgZnJlZSBpcyBzZXQsIAorICoJZnJlZSB0aGUgTkNSNTNjN3gwX2NtZCBzdHJ1Y3R1cmVzIHdoaWNoIGFyZSBhc3NvY2lhdGVkIHdpdGggCisgKgl0aGUgU2NzaV9DbW5kIHN0cnVjdHVyZXMsIGFuZCBjbGVhbiB1cCBhbnkgaW50ZXJuYWwgCisgKglOQ1IgbGlzdHMgdGhhdCB0aGUgY29tbWFuZHMgd2VyZSBvbi4gIElmIGlzc3VlIGlzIHNldCwKKyAqCWFsc28gcmV0dXJuIGNvbW1hbmRzIGluIHRoZSBpc3N1ZSBxdWV1ZS4KKyAqCisgKiBSZXR1cm5zIDogbGlua2VkIGxpc3Qgb2YgY29tbWFuZHMKKyAqCisgKiBOT1RFIDogdGhlIGNhbGxlciBzaG91bGQgaW5zdXJlIHRoYXQgdGhlIE5DUiBjaGlwIGlzIGhhbHRlZAorICoJaWYgdGhlIGZyZWUgZmxhZyBpcyBzZXQuIAorICovCisKK3N0YXRpYyBTY3NpX0NtbmQgKgorcmV0dXJuX291dHN0YW5kaW5nX2NvbW1hbmRzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBpbnQgZnJlZSwgaW50IGlzc3VlKSB7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorCWhvc3QtPmhvc3RkYXRhWzBdOworICAgIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpjOworICAgIGludCBpOworICAgIHUzMiAqbmNyY3VycmVudDsKKyAgICBTY3NpX0NtbmQgKmxpc3QgPSBOVUxMLCAqdG1wOworICAgIGZvciAoYyA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKSBob3N0ZGF0YS0+cnVubmluZ19saXN0OyBjOyAKKyAgICAJYyA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKSBjLT5uZXh0KSAgeworCWlmIChjLT5jbWQtPlNDcC5idWZmZXIpIHsKKwkgICAgcHJpbnRrICgic2NzaSVkIDogbG9vcCBkZXRlY3RlZCBpbiBydW5uaW5nIGxpc3QhXG4iLCBob3N0LT5ob3N0X25vKTsKKwkgICAgYnJlYWs7CisJfSBlbHNlIHsKKwkgICAgcHJpbnRrICgiRHVoPyBCYWQgdGhpbmdzIGhhcHBlbmluZyBpbiB0aGUgTkNSIGRyaXZlclxuIik7CisJICAgIGJyZWFrOworCX0KKworCWMtPmNtZC0+U0NwLmJ1ZmZlciA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgbGlzdDsKKwlsaXN0ID0gYy0+Y21kOworCWlmIChmcmVlKSB7CisgICAgCSAgICBjLT5uZXh0ID0gaG9zdGRhdGEtPmZyZWU7CisgICAgCSAgICBob3N0ZGF0YS0+ZnJlZSA9IGM7CisJfQorICAgIH0KKworICAgIGlmIChmcmVlKSB7IAorCWZvciAoaSA9IDAsIG5jcmN1cnJlbnQgPSAodTMyICopIGhvc3RkYXRhLT5zY2hlZHVsZTsgCisJICAgIGkgPCBob3N0LT5jYW5fcXVldWU7ICsraSwgbmNyY3VycmVudCArPSAyKSB7CisJICAgIG5jcmN1cnJlbnRbMF0gPSBob3N0ZGF0YS0+Tk9QX2luc247CisJICAgIG5jcmN1cnJlbnRbMV0gPSAweGRlYWRiZWVmOworCX0KKwlob3N0ZGF0YS0+bmNyY3VycmVudCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGlzc3VlKSB7CisJZm9yICh0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsgdG1wOyB0bXAgPSB0bXAtPm5leHQpIHsKKwkgICAgaWYgKHRtcC0+U0NwLmJ1ZmZlcikgeworCQlwcmludGsgKCJzY3NpJWQgOiBsb29wIGRldGVjdGVkIGluIGlzc3VlIHF1ZXVlIVxuIiwgCisJCQlob3N0LT5ob3N0X25vKTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgdG1wLT5TQ3AuYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBsaXN0OworCSAgICBsaXN0ID0gdG1wOworCX0KKwlpZiAoZnJlZSkKKwkgICAgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlID0gTlVMTDsKKwkJCisgICAgfQorICAgIHJldHVybiBsaXN0OworfQorCisvKiAKKyAqIEZ1bmN0aW9uIDogc3RhdGljIGludCBkaXNhYmxlIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQorICoKKyAqIFB1cnBvc2UgOiBkaXNhYmxlcyB0aGUgZ2l2ZW4gTkNSIGhvc3QsIGNhdXNpbmcgYWxsIGNvbW1hbmRzCisgKiAJdG8gcmV0dXJuIGEgZHJpdmVyIGVycm9yLiAgQ2FsbCB0aGlzIHNvIHdlIGNhbiB1bmxvYWQgdGhlCisgKiAJbW9kdWxlIGR1cmluZyBkZXZlbG9wbWVudCBhbmQgdHJ5IGFnYWluLiAgRXZlbnR1YWxseSwgCisgKiAJd2Ugc2hvdWxkIGJlIGFibGUgdG8gZmluZCBjbGVhbiB3b3JrYXJvdW5kcyBmb3IgdGhlc2UKKyAqIAlwcm9ibGVtcy4KKyAqCisgKiBJbnB1dHMgOiBob3N0IC0gaG9zdGFkYXB0ZXIgdG8gdHdpZGRsZQorICoKKyAqIFJldHVybnMgOiAwIG9uIHN1Y2Nlc3MuCisgKi8KKworc3RhdGljIGludCAKK2Rpc2FibGUgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopCisJaG9zdC0+aG9zdGRhdGFbMF07CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBTY3NpX0NtbmQgKm51a2VfbGlzdCwgKnRtcDsKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgaWYgKGhvc3RkYXRhLT5zdGF0ZSAhPSBTVEFURV9IQUxURUQpCisJbmNyX2hhbHQgKGhvc3QpOworICAgIG51a2VfbGlzdCA9IHJldHVybl9vdXRzdGFuZGluZ19jb21tYW5kcyAoaG9zdCwgMSAvKiBmcmVlICovLCAxIC8qIGlzc3VlICovKTsKKyAgICBoYXJkX3Jlc2V0IChob3N0KTsKKyAgICBob3N0ZGF0YS0+c3RhdGUgPSBTVEFURV9ESVNBQkxFRDsKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgICAgcHJpbnRrICgic2NzaSVkIDogbnVraW5nIGNvbW1hbmRzXG4iLCBob3N0LT5ob3N0X25vKTsKKyAgICBmb3IgKDsgbnVrZV9saXN0OyBudWtlX2xpc3QgPSB0bXApIHsKKwkgICAgdG1wID0gKFNjc2lfQ21uZCAqKSBudWtlX2xpc3QtPlNDcC5idWZmZXI7CisJICAgIG51a2VfbGlzdC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCSAgICBudWtlX2xpc3QtPnNjc2lfZG9uZShudWtlX2xpc3QpOworICAgIH0KKyAgICBwcmludGsgKCJzY3NpJWQgOiBkb25lLiBcbiIsIGhvc3QtPmhvc3Rfbm8pOworICAgIHByaW50ayAoS0VSTl9BTEVSVCAic2NzaSVkIDogZGlzYWJsZWQuICBVbmxvYWQgYW5kIHJlbG9hZFxuIiwKKyAgICAJaG9zdC0+aG9zdF9ubyk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IHN0YXRpYyBpbnQgbmNyX2hhbHQgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCisgKiAKKyAqIFB1cnBvc2UgOiBoYWx0cyB0aGUgU0NTSSBTQ1JJUFRTKHRtKSBwcm9jZXNzb3Igb24gdGhlIE5DUiBjaGlwCisgKgorICogSW5wdXRzIDogaG9zdCAtIFNDU0kgY2hpcCB0byBoYWx0CisgKgorICogUmV0dXJucyA6IDAgb24gc3VjY2VzcworICovCisKK3N0YXRpYyBpbnQgCituY3JfaGFsdCAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkgeworICAgIE5DUjUzYzd4MF9sb2NhbF9kZWNsYXJlKCk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICB1bnNpZ25lZCBjaGFyIGlzdGF0LCB0bXA7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorCWhvc3QtPmhvc3RkYXRhWzBdOworICAgIGludCBzdGFnZTsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfc2V0dXAoaG9zdCk7CisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgLyogU3RhZ2UgMCA6IGVhdCBhbGwgaW50ZXJydXB0cworICAgICAgIFN0YWdlIDEgOiBzZXQgQUJPUlQKKyAgICAgICBTdGFnZSAyIDogZWF0IGFsbCBidXQgYWJvcnQgaW50ZXJydXB0cworICAgICAgIFN0YWdlIDMgOiBlYXQgYWxsIGludGVycnVwdHMKKyAgICAgKi8KKyAgICBmb3IgKHN0YWdlID0gMDs7KSB7CisJaWYgKHN0YWdlID09IDEpIHsKKwkgICAgTkNSNTNjN3gwX3dyaXRlOChob3N0ZGF0YS0+aXN0YXQsIElTVEFUX0FCUlQpOworCSAgICArK3N0YWdlOworCX0KKwlpc3RhdCA9IE5DUjUzYzd4MF9yZWFkOCAoaG9zdGRhdGEtPmlzdGF0KTsKKwlpZiAoaXN0YXQgJiBJU1RBVF9TSVApIHsKKwkgICAgdG1wID0gTkNSNTNjN3gwX3JlYWQ4KFNTVEFUMF9SRUcpOworCX0gZWxzZSBpZiAoaXN0YXQgJiBJU1RBVF9ESVApIHsKKwkgICAgdG1wID0gTkNSNTNjN3gwX3JlYWQ4KERTVEFUX1JFRyk7CisJICAgIGlmIChzdGFnZSA9PSAyKSB7CisJCWlmICh0bXAgJiBEU1RBVF9BQlJUKSB7CisJCSAgICBOQ1I1M2M3eDBfd3JpdGU4KGhvc3RkYXRhLT5pc3RhdCwgMCk7CisJCSAgICArK3N0YWdlOworCQl9IGVsc2UgeworCQkgICAgcHJpbnRrKEtFUk5fQUxFUlQgInNjc2klZCA6IGNvdWxkIG5vdCBoYWx0IE5DUiBjaGlwXG4iLCAKKwkJCWhvc3QtPmhvc3Rfbm8pOworCQkgICAgZGlzYWJsZSAoaG9zdCk7CisJICAgIAl9CisgICAgCSAgICB9CisJfQorCWlmICghKGlzdGF0ICYgKElTVEFUX1NJUHxJU1RBVF9ESVApKSkgeworCSAgICBpZiAoc3RhZ2UgPT0gMCkKKwkgICAgCSsrc3RhZ2U7CisJICAgIGVsc2UgaWYgKHN0YWdlID09IDMpCisJCWJyZWFrOworCX0KKyAgICB9CisgICAgaG9zdGRhdGEtPnN0YXRlID0gU1RBVEVfSEFMVEVEOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyNpZiAwCisgICAgcHJpbnRfbG90cyAoaG9zdCk7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworLyogCisgKiBGdW5jdGlvbjogZXZlbnRfbmFtZSAoaW50IGV2ZW50KQorICogCisgKiBQdXJwb3NlOiBtYXAgZXZlbnQgZW51bSBpbnRvIHVzZXItcmVhZGFibGUgc3RyaW5ncy4KKyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqCitldmVudF9uYW1lIChpbnQgZXZlbnQpIHsKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBFVkVOVF9OT05FOgkJcmV0dXJuICJub25lIjsKKyAgICBjYXNlIEVWRU5UX0lTU1VFX1FVRVVFOglyZXR1cm4gInRvIGlzc3VlIHF1ZXVlIjsKKyAgICBjYXNlIEVWRU5UX1NUQVJUX1FVRVVFOglyZXR1cm4gInRvIHN0YXJ0IHF1ZXVlIjsKKyAgICBjYXNlIEVWRU5UX1NFTEVDVDoJCXJldHVybiAic2VsZWN0ZWQiOworICAgIGNhc2UgRVZFTlRfRElTQ09OTkVDVDoJcmV0dXJuICJkaXNjb25uZWN0ZWQiOworICAgIGNhc2UgRVZFTlRfUkVTRUxFQ1Q6CXJldHVybiAicmVzZWxlY3RlZCI7CisgICAgY2FzZSBFVkVOVF9DT01QTEVURToJcmV0dXJuICJjb21wbGV0ZWQiOworICAgIGNhc2UgRVZFTlRfSURMRToJCXJldHVybiAiaWRsZSI7CisgICAgY2FzZSBFVkVOVF9TRUxFQ1RfRkFJTEVEOglyZXR1cm4gInNlbGVjdCBmYWlsZWQiOworICAgIGNhc2UgRVZFTlRfQkVGT1JFX1NFTEVDVDoJcmV0dXJuICJiZWZvcmUgc2VsZWN0IjsKKyAgICBjYXNlIEVWRU5UX1JFU0VMRUNUX0ZBSUxFRDoJcmV0dXJuICJyZXNlbGVjdCBmYWlsZWQiOworICAgIGRlZmF1bHQ6CQkJcmV0dXJuICJ1bmtub3duIjsKKyAgICB9Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IHZvaWQgZHVtcF9ldmVudHMgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNvdW50KQorICoKKyAqIFB1cnBvc2UgOiBwcmludCBsYXN0IGNvdW50IGV2ZW50cyB3aGljaCBoYXZlIG9jY3VycmVkLgorICovIAorc3RhdGljIHZvaWQKK2R1bXBfZXZlbnRzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBpbnQgY291bnQpIHsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopCisJaG9zdC0+aG9zdGRhdGFbMF07CisgICAgc3RydWN0IE5DUjUzYzd4MF9ldmVudCBldmVudDsKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGlmIChob3N0ZGF0YS0+ZXZlbnRzKSB7CisJaWYgKGNvdW50ID4gaG9zdGRhdGEtPmV2ZW50X3NpemUpCisJICAgIGNvdW50ID0gaG9zdGRhdGEtPmV2ZW50X3NpemU7CisJZm9yIChpID0gaG9zdGRhdGEtPmV2ZW50X2luZGV4OyBjb3VudCA+IDA7IAorCSAgICBpID0gKGkgPyBpIC0gMSA6IGhvc3RkYXRhLT5ldmVudF9zaXplIC0xKSwgLS1jb3VudCkgeworLyoKKyAqIEJ5IGNvcHlpbmcgdGhlIGV2ZW50IHdlJ3JlIGN1cnJlbnRseSBleGFtaW5pbmcgd2l0aCBpbnRlcnJ1cHRzCisgKiBkaXNhYmxlZCwgd2UgY2FuIGRvIG11bHRpcGxlIHByaW50aygpLCBldGMuIG9wZXJhdGlvbnMgYW5kIAorICogc3RpbGwgYmUgZ3VhcmFudGVlZCB0aGF0IHRoZXkncmUgaGFwcGVuaW5nIG9uIHRoZSBzYW1lIAorICogZXZlbnQgc3RydWN0dXJlLgorICovCisJICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyNpZiAwCisJICAgIGV2ZW50ID0gaG9zdGRhdGEtPmV2ZW50c1tpXTsKKyNlbHNlCisJICAgIG1lbWNweSAoKHZvaWQgKikgJmV2ZW50LCAodm9pZCAqKSAmKGhvc3RkYXRhLT5ldmVudHNbaV0pLAorCQlzaXplb2YoZXZlbnQpKTsKKyNlbmRpZgorCisJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkgICAgcHJpbnRrICgic2NzaSVkIDogJXMgZXZlbnQgJWQgYXQgJWxkIHNlY3MgJWxkIHVzZWNzIHRhcmdldCAlZCBsdW4gJWRcbiIsCisJCWhvc3QtPmhvc3Rfbm8sIGV2ZW50X25hbWUgKGV2ZW50LmV2ZW50KSwgY291bnQsCisJCShsb25nKSBldmVudC50aW1lLnR2X3NlYywgKGxvbmcpIGV2ZW50LnRpbWUudHZfdXNlYywKKwkJZXZlbnQudGFyZ2V0LCBldmVudC5sdW4pOworCSAgICBpZiAoZXZlbnQuZHNhKSAKKwkJcHJpbnRrICgiICAgICAgICAgZXZlbnQgZm9yIGRzYSAweCVseCAodmlydCAweCVwKVxuIiwgCisJCSAgICB2aXJ0X3RvX2J1cyhldmVudC5kc2EpLCBldmVudC5kc2EpOworCSAgICBpZiAoZXZlbnQucGlkICE9IC0xKSB7CisJCXByaW50ayAoIiAgICAgICAgIGV2ZW50IGZvciBwaWQgJWxkICIsIGV2ZW50LnBpZCk7CisJCXByaW50X2NvbW1hbmQgKGV2ZW50LmNtbmQpOworCSAgICB9CisJfQorICAgIH0KK30KKworLyoKKyAqIEZ1bmN0aW9uOiBjaGVja19hZGRyZXNzCisgKgorICogUHVycG9zZTogQ2hlY2sgdG8gc2VlIGlmIGEgcG9zc2libHkgY29ycnVwdCBwb2ludGVyIHdpbGwgZmF1bHQgdGhlIAorICoJa2VybmVsLgorICoKKyAqIElucHV0czogYWRkciAtIGFkZHJlc3M7IHNpemUgLSBzaXplIG9mIGFyZWEKKyAqCisgKiBSZXR1cm5zOiAwIGlmIGFyZWEgaXMgT0ssIC0xIG9uIGVycm9yLgorICoKKyAqIE5PVEVTOiBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdnZlcmlmeSBvbiBrZXJuZWxzIAorICoJdGhhdCBoYXZlIGl0LgorICovCisKK3N0YXRpYyBpbnQgCitjaGVja19hZGRyZXNzICh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBzaXplKSB7CisgICAgcmV0dXJuICh2aXJ0X3RvX3BoeXMoKHZvaWQgKilhZGRyKSA8IFBBR0VfU0laRSB8fCB2aXJ0X3RvX3BoeXMoKHZvaWQgKikoYWRkciArIHNpemUpKSA+IHZpcnRfdG9fcGh5cyhoaWdoX21lbW9yeSkgPyAgLTEgOiAwKTsKK30KKworI2lmZGVmIE1PRFVMRQoraW50IAorTkNSNTNjN3gwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkgeworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhID0gCisJKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGFbMF07CisgICAgc3RydWN0IE5DUjUzYzd4MF9jbWQgKmNtZCwgKnRtcDsKKyAgICBzaHV0ZG93biAoaG9zdCk7CisgICAgaWYgKGhvc3QtPmlycSAhPSBTQ1NJX0lSUV9OT05FKQorCXsKKwkgICAgaW50IGlycV9jb3VudDsKKwkgICAgc3RydWN0IFNjc2lfSG9zdCAqdG1wOworCSAgICBmb3IgKGlycV9jb3VudCA9IDAsIHRtcCA9IGZpcnN0X2hvc3Q7IHRtcDsgdG1wID0gdG1wLT5uZXh0KQorCQlpZiAodG1wLT5ob3N0dCA9PSB0aGVfdGVtcGxhdGUgJiYgdG1wLT5pcnEgPT0gaG9zdC0+aXJxKQorCQkgICAgKytpcnFfY291bnQ7CisJICAgIGlmIChpcnFfY291bnQgPT0gMSkKKwkJZnJlZV9pcnEoaG9zdC0+aXJxLCBOVUxMKTsKKwl9CisgICAgaWYgKGhvc3QtPmRtYV9jaGFubmVsICE9IERNQV9OT05FKQorCWZyZWVfZG1hKGhvc3QtPmRtYV9jaGFubmVsKTsKKyAgICBpZiAoaG9zdC0+aW9fcG9ydCkKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQpOworICAgIAorICAgIGZvciAoY21kID0gKHN0cnVjdCBOQ1I1M2M3eDBfY21kICopIGhvc3RkYXRhLT5mcmVlOyBjbWQ7IGNtZCA9IHRtcCwgCisJLS1ob3N0ZGF0YS0+bnVtX2NtZHMpIHsKKwl0bXAgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgY21kLT5uZXh0OworICAgIC8qIAorICAgICAqIElmIHdlJ3JlIGdvaW5nIHRvIGxvb3AsIHRyeSB0byBzdG9wIGl0IHRvIGdldCBhIG1vcmUgYWNjdXJhdGUKKyAgICAgKiBjb3VudCBvZiB0aGUgbGVha2VkIGNvbW1hbmRzLgorICAgICAqLworCWNtZC0+bmV4dCA9IE5VTEw7CisJaWYgKGNtZC0+ZnJlZSkKKwkgICAgY21kLT5mcmVlICgodm9pZCAqKSBjbWQtPnJlYWwsIGNtZC0+c2l6ZSk7CisgICAgfQorICAgIGlmIChob3N0ZGF0YS0+bnVtX2NtZHMpCisJcHJpbnRrICgic2NzaSVkIDogbGVha2VkICVkIE5DUjUzYzd4MF9jbWQgc3RydWN0dXJlc1xuIiwKKwkgICAgaG9zdC0+aG9zdF9ubywgaG9zdGRhdGEtPm51bV9jbWRzKTsKKyAgICBpZiAoaG9zdGRhdGEtPmV2ZW50cykgCisJdmZyZWUgKCh2b2lkICopaG9zdGRhdGEtPmV2ZW50cyk7CisKKyAgICAvKiBYWFggVGhpcyBhc3N1bWVzIGRlZmF1bHQgY2FjaGUgbW9kZSB0byBiZSBJT01BUF9GVUxMX0NBQ0hJTkcsIHdoaWNoCisgICAgICogWFhYIG1heSBiZSBpbnZhbGlkIChDT05GSUdfMDYwX1dSSVRFVEhST1VHSCkKKyAgICAgKi8KKyAgICBrZXJuZWxfc2V0X2NhY2hlbW9kZSgodm9pZCAqKWhvc3RkYXRhLCA4MTkyLCBJT01BUF9GVUxMX0NBQ0hJTkcpOworICAgIGZyZWVfcGFnZXMgKCh1MzIpaG9zdGRhdGEsIDEpOworICAgIHJldHVybiAxOworfQorI2VuZGlmIC8qIGRlZiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS81M2M3eHguaCBiL2RyaXZlcnMvc2NzaS81M2M3eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTA5OGJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpLzUzYzd4eC5oCkBAIC0wLDAgKzEsMTYwOCBAQAorLyoKKyAqIDUzYzcxMCBkcml2ZXIuICBNb2RpZmllZCBmcm9tIERyZXcgRWNraGFyZHRzIGRyaXZlcgorICogZm9yIDUzYzgxMCBieSBSaWNoYXJkIEhpcnN0IFtyaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWtdCisgKgorICogSSBoYXZlIGxlZnQgdGhlIGNvZGUgZm9yIHRoZSA1M2M4eHggZmFtaWx5IGluIGhlcmUsIGJlY2F1c2UgaXQgZGlkbid0CisgKiBzZWVtIHdvcnRoIHJlbW92aW5nIGl0LiAgVGhlIHBvc3NpYmlsaXR5IG9mIElPX01BUFBFRCBjaGlwcyByYXRoZXIKKyAqIHRoYW4gTUVNT1JZX01BUFBFRCByZW1haW5zLCBpbiBjYXNlIHNvbWVvbmUgd2FudHMgdG8gYWRkIHN1cHBvcnQgZm9yCisgKiA1M2M3MTAgY2hpcHMgb24gSW50ZWwgUENzIChzb21lIG9sZGVyIG1hY2hpbmVzIGhhdmUgdGhlbSBvbiB0aGUKKyAqIG1vdGhlcmJvYXJkKS4KKyAqCisgKiBOT1RFIFRIRVJFIE1BWSBCRSBQUk9CTEVNUyBXSVRIIENBU1RTIElOIHJlYWQ4IEFORCBDby4KKyAqLworCisvKgorICogTkNSIDUzY3s3LDh9MHgwIGRyaXZlciwgaGVhZGVyIGZpbGUKKyAqCisgKiBTcG9uc29yZWQgYnkKKyAqICAgICAgaVggTXVsdGl1c2VyIE11bHRpdGFza2luZyBNYWdhemluZQorICoJSGFubm92ZXIsIEdlcm1hbnkKKyAqCWhtQGl4LmRlCQorICoKKyAqIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk1IERyZXcgRWNraGFyZHQKKyAqICAgICAgVmlzaW9uYXJ5IENvbXB1dGluZyAKKyAqICAgICAgKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyAqICAgICAgZHJld0BQb29oU3RpY2tzLk9SRworICoJKzEgKDMwMykgNzg2LTc5NzUKKyAqCisgKiBUb2xlckFOVCBhbmQgU0NTSSBTQ1JJUFRTIGFyZSByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgTkNSIENvcnBvcmF0aW9uLgorICogCisgKiBQUkUtQUxQSEEKKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKgorICogTkNSIDUzQzcwMC81M0M3MDAtNjYKKyAqIFNDU0kgSS9PIFByb2Nlc3NvcgorICogRGF0YSBNYW51YWwKKyAqCisgKiBOQ1IgNTNDODEwCisgKiBQQ0ktU0NTSSBJL08gUHJvY2Vzc29yIAorICogRGF0YSBNYW51YWwKKyAqCisgKiBOQ1IgTWljcm9lbGVjdHJvbmljcworICogMTYzNSBBZXJvcGxhemEgRHJpdmUKKyAqIENvbG9yYWRvIFNwcmluZ3MsIENPIDgwOTE2CisgKiArMSAoNzE5KSA1NzgtMzQwMAorICoKKyAqIFRvbGwgZnJlZSBsaXRlcmF0dXJlIG51bWJlcgorICogKzEgKDgwMCkgMzM0LTU0NTQKKyAqCisgKi8KKworI2lmbmRlZiBOQ1I1M2M3MTBfSAorI2RlZmluZSBOQ1I1M2M3MTBfSAorCisjaWZuZGVmIEhPU1RTX0MKKworLyogU0NTSSBjb250cm9sIDAgcncsIGRlZmF1bHQgPSAweGMwICovIAorI2RlZmluZSBTQ05UTDBfUkVHIAkJMHgwMAkKKyNkZWZpbmUgU0NOVEwwX0FSQjEJCTB4ODAJLyogMCAwID0gc2ltcGxlIGFyYml0cmF0aW9uICovCisjZGVmaW5lIFNDTlRMMF9BUkIyCQkweDQwCS8qIDEgMSA9IGZ1bGwgYXJiaXRyYXRpb24gKi8KKyNkZWZpbmUgU0NOVEwwX1NUUlQJCTB4MjAJLyogU3RhcnQgU2VxdWVuY2UgKi8KKyNkZWZpbmUgU0NOVEwwX1dBVE4JCTB4MTAJLyogU2VsZWN0IHdpdGggQVROICovCisjZGVmaW5lIFNDTlRMMF9FUEMJCTB4MDgJLyogRW5hYmxlIHBhcml0eSBjaGVja2luZyAqLworLyogQml0IDIgaXMgcmVzZXJ2ZWQgb24gODAwIHNlcmllcyBjaGlwcyAqLworI2RlZmluZSBTQ05UTDBfRVBHXzcwMAkJMHgwNAkvKiBFbmFibGUgcGFyaXR5IGdlbmVyYXRpb24gKi8KKyNkZWZpbmUgU0NOVEwwX0FBUAkJMHgwMgkvKiAgQVROLyBvbiBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgU0NOVEwwX1RSRwkJMHgwMQkvKiBUYXJnZXQgbW9kZSAqLworCisvKiBTQ1NJIGNvbnRyb2wgMSBydywgZGVmYXVsdCA9IDB4MDAgKi8KKworI2RlZmluZSBTQ05UTDFfUkVHIAkJMHgwMQkKKyNkZWZpbmUgU0NOVEwxX0VYQwkJMHg4MAkvKiBFeHRyYSBDbG9jayBDeWNsZSBvZiBEYXRhIHNldHVwICovCisjZGVmaW5lIFNDTlRMMV9BREIJCTB4NDAJLyogIGNvbnRlbnRzIG9mIFNPREwgb24gYnVzICovCisjZGVmaW5lIFNDTlRMMV9FU1JfNzAwCQkweDIwCS8qIEVuYWJsZSBTSU9QIHJlc3BvbnNlIHRvIHNlbGVjdGlvbiAKKwkJCQkJICAgYW5kIHJlc2VsZWN0aW9uICovCisjZGVmaW5lIFNDTlRMMV9ESFBfODAwCQkweDIwCS8qIERpc2FibGUgaGFsdCBvbiBwYXJpdHkgZXJyb3Igb3IgQVROCisJCQkJCSAgIHRhcmdldCBtb2RlIG9ubHkgKi8KKyNkZWZpbmUgU0NOVEwxX0NPTgkJMHgxMAkvKiBDb25uZWN0ZWQgKi8KKyNkZWZpbmUgU0NOVEwxX1JTVAkJMHgwOAkvKiBTQ1NJIFJTVC8gKi8KKyNkZWZpbmUgU0NOVEwxX0FFU1AJCTB4MDQJLyogRm9yY2UgYmFkIHBhcml0eSAqLworI2RlZmluZSBTQ05UTDFfU05EXzcwMAkJMHgwMgkvKiBTdGFydCBTQ1NJIHNlbmQgKi8KKyNkZWZpbmUgU0NOVEwxX0lBUkJfODAwCQkweDAyCS8qIEltbWVkaWF0ZSBBcmJpdHJhdGlvbiwgc3RhcnQKKwkJCQkJICAgYXJiaXRyYXRpb24gaW1tZWRpYXRlbHkgYWZ0ZXIKKwkJCQkJICAgYnVzZnJlZSBpcyBkZXRlY3RlZCAqLworI2RlZmluZSBTQ05UTDFfUkNWXzcwMAkJMHgwMQkvKiBTdGFydCBTQ1NJIHJlY2VpdmUgKi8KKyNkZWZpbmUgU0NOVEwxX1NTVF84MDAJCTB4MDEJLyogU3RhcnQgU0NTSSB0cmFuc2ZlciAqLworCisvKiBTQ1NJIGNvbnRyb2wgMiBydywgKi8KKworI2RlZmluZSBTQ05UTDJfUkVHXzgwMAkJMHgwMgkKKyNkZWZpbmUgU0NOVEwyXzgwMF9TRFUJCTB4ODAJLyogU0NTSSBkaXNjb25uZWN0IHVuZXhwZWN0ZWQgKi8KKworLyogU0NTSSBjb250cm9sIDMgcncgKi8KKworI2RlZmluZSBTQ05UTDNfUkVHXzgwMCAJCTB4MDMJCisjZGVmaW5lIFNDTlRMM184MDBfU0NGX1NISUZUCTQKKyNkZWZpbmUgU0NOVEwzXzgwMF9TQ0ZfTUFTSwkweDcwCisjZGVmaW5lIFNDTlRMM184MDBfU0NGMgkJMHg0MAkvKiBTeW5jaHJvbm91cyBkaXZpc29yICovCisjZGVmaW5lIFNDTlRMM184MDBfU0NGMQkJMHgyMAkvKiAweDAwID0gU0NMSy8zICovCisjZGVmaW5lIFNDTlRMM184MDBfU0NGMAkJMHgxMAkvKiAweDEwID0gU0NMSy8xICovCisJCQkJCS8qIDB4MjAgPSBTQ0xLLzEuNSAKKwkJCQkJICAgMHgzMCA9IFNDTEsvMiAKKwkJCQkJICAgMHg0MCA9IFNDTEsvMyAqLworCSAgICAKKyNkZWZpbmUgU0NOVEwzXzgwMF9DQ0ZfU0hJRlQJMAorI2RlZmluZSBTQ05UTDNfODAwX0NDRl9NQVNLCTB4MDcKKyNkZWZpbmUgU0NOVEwzXzgwMF9DQ0YyCQkweDA0CS8qIDB4MDAgNTAuMDEgdG8gNjYgKi8KKyNkZWZpbmUgU0NOVEwzXzgwMF9DQ0YxCQkweDAyCS8qIDB4MDEgMTYuNjcgdG8gMjUgKi8KKyNkZWZpbmUgU0NOVEwzXzgwMF9DQ0YwCQkweDAxCS8qIDB4MDIJMjUuMDEgLSAzNy41IAorCQkJCQkgICAweDAzCTM3LjUxIC0gNTAgCisJCQkJCSAgIDB4MDQgNTAuMDEgLSA2NiAqLworCisvKiAgCisgKiBTQ1NJIGRlc3RpbmF0aW9uIElEIHJ3IC0gdGhlIGFwcHJvcHJpYXRlIGJpdCBpcyBzZXQgZm9yIHRoZSBzZWxlY3RlZAorICogdGFyZ2V0IElELiAgVGhpcyBpcyB3cml0dGVuIGJ5IHRoZSBTQ1NJIFNDUklQVFMgcHJvY2Vzc29yLgorICogZGVmYXVsdCA9IDB4MDAKKyAqLworI2RlZmluZSBTRElEX1JFR183MDAgIAkJMHgwMgkKKyNkZWZpbmUgU0RJRF9SRUdfODAwCQkweDA2CisKKyNkZWZpbmUgR1BfUkVHXzgwMAkJMHgwNwkvKiBHZW5lcmFsIHB1cnBvc2UgSU8gKi8KKyNkZWZpbmUgR1BfODAwX0lPMQkJMHgwMgorI2RlZmluZSBHUF84MDBfSU8yCQkweDAxCisKKy8qIFNDU0kgaW50ZXJydXB0IGVuYWJsZSBydywgZGVmYXVsdCA9IDB4MDAgKi8KKyNkZWZpbmUgU0lFTl9SRUdfNzAwCQkweDAzCQorI2RlZmluZSBTSUVOMF9SRUdfODAwCQkweDQwCisjZGVmaW5lIFNJRU5fTUEJCQkweDgwCS8qIFBoYXNlIG1pc21hdGNoIChpbmkpIG9yIEFUTiAodGd0KSAqLworI2RlZmluZSBTSUVOX0ZDCQkJMHg0MAkvKiBGdW5jdGlvbiBjb21wbGV0ZSAqLworI2RlZmluZSBTSUVOXzcwMF9TVE8JCTB4MjAJLyogU2VsZWN0aW9uIG9yIHJlc2VsZWN0aW9uIHRpbWVvdXQgKi8KKyNkZWZpbmUgU0lFTl84MDBfU0VMCQkweDIwCS8qIFNlbGVjdGVkICovCisjZGVmaW5lIFNJRU5fNzAwX1NFTAkJMHgxMAkvKiBTZWxlY3RlZCBvciByZXNlbGVjdGVkICovCisjZGVmaW5lIFNJRU5fODAwX1JFU0VMCQkweDEwCS8qIFJlc2VsZWN0ZWQgKi8KKyNkZWZpbmUgU0lFTl9TR0UJCTB4MDgJLyogU0NTSSBncm9zcyBlcnJvciAqLworI2RlZmluZSBTSUVOX1VEQwkJMHgwNAkvKiBVbmV4cGVjdGVkIGRpc2Nvbm5lY3QgKi8KKyNkZWZpbmUgU0lFTl9SU1QJCTB4MDIJLyogU0NTSSBSU1QvIHJlY2VpdmVkICovCisjZGVmaW5lIFNJRU5fUEFSCQkweDAxCS8qIFBhcml0eSBlcnJvciAqLworCisvKiAKKyAqIFNDU0kgY2hpcCBJRCBydworICogTkNSNTNjNzAwIDogCisgKiAJV2hlbiBhcmJpdHJhdGluZywgdGhlIGhpZ2hlc3QgYml0IGlzIHVzZWQsIHdoZW4gcmVzZWxlY3Rpb24gb3Igc2VsZWN0aW9uCisgKiAJb2NjdXJzLCB0aGUgY2hpcCByZXNwb25kcyB0byBhbGwgSURzIGZvciB3aGljaCBhIGJpdCBpcyBzZXQuCisgKiAJZGVmYXVsdCA9IDB4MDAgCisgKiBOQ1I1M2M4MTAgOiAKKyAqCVVzZXMgYml0IG1hcHBpbmcKKyAqLworI2RlZmluZSBTQ0lEX1JFRwkJMHgwNAkKKy8qIEJpdCA3IGlzIHJlc2VydmVkIG9uIDgwMCBzZXJpZXMgY2hpcHMgKi8KKyNkZWZpbmUgU0NJRF84MDBfUlJFCQkweDQwCS8qIEVuYWJsZSByZXNwb25zZSB0byByZXNlbGVjdGlvbiAqLworI2RlZmluZSBTQ0lEXzgwMF9TUkUJCTB4MjAJLyogRW5hYmxlIHJlc3BvbnNlIHRvIHNlbGVjdGlvbiAqLworLyogQml0cyBmb3VyIGFuZCB0aHJlZSBhcmUgcmVzZXJ2ZWQgb24gODAwIHNlcmllcyBjaGlwcyAqLworI2RlZmluZSBTQ0lEXzgwMF9FTkNfTUFTSwkweDA3CS8qIEVuY29kZWQgU0NTSSBJRCAqLworCisvKiBTQ1NJIHRyYW5zZmVyIHJ3LCBkZWZhdWx0ID0gMHgwMCAqLworI2RlZmluZSBTWEZFUl9SRUcJCTB4MDUKKyNkZWZpbmUgU1hGRVJfREhQCQkweDgwCS8qIERpc2FibGUgaGFsdCBvbiBwYXJpdHkgKi8KKworI2RlZmluZSBTWEZFUl9UUDIJCTB4NDAJLyogVHJhbnNmZXIgcGVyaW9kIG1zYiAqLworI2RlZmluZSBTWEZFUl9UUDEJCTB4MjAKKyNkZWZpbmUgU1hGRVJfVFAwCQkweDEwCS8qIGxzYiAqLworI2RlZmluZSBTWEZFUl9UUF9NQVNLCQkweDcwCisvKiBGSVhNRSA6IFNYRkVSX1RQX1NISUZUID09IDUgaXMgcmlnaHQgZm9yICc4eHggY2hpcHMgKi8KKyNkZWZpbmUgU1hGRVJfVFBfU0hJRlQJCTUKKyNkZWZpbmUgU1hGRVJfVFBfNAkJMHgwMAkvKiBEaXZpc29ycyAqLworI2RlZmluZSBTWEZFUl9UUF81CQkweDEwPDwxCisjZGVmaW5lIFNYRkVSX1RQXzYJCTB4MjA8PDEKKyNkZWZpbmUgU1hGRVJfVFBfNwkJMHgzMDw8MQorI2RlZmluZSBTWEZFUl9UUF84CQkweDQwPDwxCisjZGVmaW5lIFNYRkVSX1RQXzkJCTB4NTA8PDEKKyNkZWZpbmUgU1hGRVJfVFBfMTAJCTB4NjA8PDEKKyNkZWZpbmUgU1hGRVJfVFBfMTEJCTB4NzA8PDEKKworI2RlZmluZSBTWEZFUl9NTzMJCTB4MDgJLyogTWF4IG9mZnNldCBtc2IgKi8KKyNkZWZpbmUgU1hGRVJfTU8yCQkweDA0CisjZGVmaW5lIFNYRkVSX01PMQkJMHgwMgorI2RlZmluZSBTWEZFUl9NTzAJCTB4MDEJLyogbHNiICovCisjZGVmaW5lIFNYRkVSX01PX01BU0sJCTB4MGYKKyNkZWZpbmUgU1hGRVJfTU9fU0hJRlQJCTAKKworLyogCisgKiBTQ1NJIG91dHB1dCBkYXRhIGxhdGNoIHJ3CisgKiBUaGUgY29udGVudHMgb2YgdGhpcyByZWdpc3RlciBhcmUgZHJpdmVuIG9udG8gdGhlIFNDU0kgYnVzIHdoZW4gCisgKiB0aGUgQXNzZXJ0IERhdGEgQnVzIGJpdCBvZiB0aGUgU0NOVEwxIHJlZ2lzdGVyIGlzIHNldCBhbmQgCisgKiB0aGUgQ0QsIElPLCBhbmQgTVNHIGJpdHMgb2YgdGhlIFNPQ0wgcmVnaXN0ZXIgbWF0Y2ggdGhlIFNDU0kgcGhhc2UKKyAqLworI2RlZmluZSBTT0RMX1JFR183MDAJCTB4MDYJCisjZGVmaW5lIFNPRExfUkVHXzgwMAkJMHg1NAorCisKKy8qIAorICogU0NTSSBvdXRwdXQgY29udHJvbCBsYXRjaCBydywgZGVmYXVsdCA9IDAgCisgKiBOb3RlIHRoYXQgd2hlbiB0aGUgY2hpcCBpcyBiZWluZyBtYW51YWxseSBwcm9ncmFtbWVkIGFzIGFuIGluaXRpYXRvciwKKyAqIHRoZSBNU0csIENELCBhbmQgSU8gYml0cyBtdXN0IGJlIHNldCBjb3JyZWN0bHkgZm9yIHRoZSBwaGFzZSB0aGUgdGFyZ2V0CisgKiBpcyBkcml2aW5nIHRoZSBidXMgaW4uICBPdGhlcndpc2Ugbm8gZGF0YSB0cmFuc2ZlciB3aWxsIG9jY3VyIGR1ZSB0byAKKyAqIHBoYXNlIG1pc21hdGNoLgorICovCisKKyNkZWZpbmUgU09DTF9SRUcJCTB4MDcKKyNkZWZpbmUgU09DTF9SRVEJCTB4ODAJLyogIFJFUSAqLworI2RlZmluZSBTT0NMX0FDSwkJMHg0MAkvKiAgQUNLICovCisjZGVmaW5lIFNPQ0xfQlNZCQkweDIwCS8qICBCU1kgKi8KKyNkZWZpbmUgU09DTF9TRUwJCTB4MTAJLyogIFNFTCAqLworI2RlZmluZSBTT0NMX0FUTgkJMHgwOAkvKiAgQVROICovCisjZGVmaW5lIFNPQ0xfTVNHCQkweDA0CS8qICBNU0cgKi8KKyNkZWZpbmUgU09DTF9DRAkJCTB4MDIJLyogIEMvRCAqLworI2RlZmluZSBTT0NMX0lPCQkJMHgwMQkvKiAgSS9PICovCisKKy8qIAorICogU0NTSSBmaXJzdCBieXRlIHJlY2VpdmVkIGxhdGNoIHJvIAorICogVGhpcyByZWdpc3RlciBjb250YWlucyB0aGUgZmlyc3QgYnl0ZSByZWNlaXZlZCBkdXJpbmcgYSBibG9jayBNT1ZFIAorICogU0NTSSBTQ1JJUFRTIGluc3RydWN0aW9uLCBpbmNsdWRpbmcKKyAqIAorICogSW5pdGlhdG9yIG1vZGUJVGFyZ2V0IG1vZGUKKyAqIE1lc3NhZ2UgaW4JCUNvbW1hbmQKKyAqIFN0YXR1cwkJTWVzc2FnZSBvdXQKKyAqIERhdGEgaW4JCURhdGEgb3V0CisgKgorICogSXQgYWxzbyBjb250YWlucyB0aGUgc2VsZWN0aW5nIG9yIHJlc2VsZWN0aW5nIGRldmljZSdzIElEIGFuZCBvdXIgCisgKiBJRC4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgcmVnaXN0ZXIgdGhlIHZhcmlvdXMgSUYgY29uZGl0aW9uYWxzIGNhbiAKKyAqIG9wZXJhdGUgb24uCisgKi8KKyNkZWZpbmUgU0ZCUl9SRUcJCTB4MDgJCisKKy8qIAorICogU0NTSSBpbnB1dCBkYXRhIGxhdGNoIHJvCisgKiBJbiBpbml0aWF0b3IgbW9kZSwgZGF0YSBpcyBsYXRjaGVkIGludG8gdGhpcyByZWdpc3RlciBvbiB0aGUgcmlzaW5nCisgKiBlZGdlIG9mIFJFUS8uIEluIHRhcmdldCBtb2RlLCBkYXRhIGlzIGxhdGNoZWQgb24gdGhlIHJpc2luZyBlZGdlIG9mIAorICogQUNLLworICovCisjZGVmaW5lIFNJRExfUkVHXzcwMAkJMHgwOQorI2RlZmluZSBTSURMX1JFR184MDAJCTB4NTAKKworLyogCisgKiBTQ1NJIGJ1cyBkYXRhIGxpbmVzIHJvIAorICogVGhpcyByZWdpc3RlciByZWZsZWN0cyB0aGUgaW5zdGFudGFuZW91cyBzdGF0dXMgb2YgdGhlIFNDU0kgZGF0YSAKKyAqIGxpbmVzLiAgTm90ZSB0aGF0IFNDTlRMMCBtdXN0IGJlIHNldCB0byBkaXNhYmxlIHBhcml0eSBjaGVja2luZywgCisgKiBvdGhlcndpc2UgcmVhZGluZyB0aGlzIHJlZ2lzdGVyIHdpbGwgbGF0Y2ggbmV3IHBhcml0eS4KKyAqLworI2RlZmluZSBTQkRMX1JFR183MDAJCTB4MGEKKyNkZWZpbmUgU0JETF9SRUdfODAwCQkweDU4CisKKyNkZWZpbmUgU1NJRF9SRUdfODAwCQkweDBhCisjZGVmaW5lIFNTSURfODAwX1ZBTAkJMHg4MAkvKiBFeGFjdGx5IHR3byBiaXRzIGFzc2VydGVkIGF0IHNlbCAqLworI2RlZmluZSBTU0lEXzgwMF9FTkNJRF9NQVNLCTB4MDcJLyogRGV2aWNlIHdoaWNoIHBlcmZvcm1lZCBvcGVyYXRpb24gKi8KKworCisvKiAKKyAqIFNDU0kgYnVzIGNvbnRyb2wgbGluZXMgcncsIAorICogaW5zdGFudGFuZW91cyByZWFkb3V0IG9mIGNvbnRyb2wgbGluZXMgCisgKi8KKyNkZWZpbmUgU0JDTF9SRUcJCTB4MGIgCQorI2RlZmluZSBTQkNMX1JFUQkJMHg4MAkvKiAgUkVRIHJvICovCisjZGVmaW5lIFNCQ0xfQUNLCQkweDQwCS8qICBBQ0sgcm8gKi8KKyNkZWZpbmUgU0JDTF9CU1kJCTB4MjAJLyogIEJTWSBybyAqLworI2RlZmluZSBTQkNMX1NFTAkJMHgxMAkvKiAgU0VMIHJvICovCisjZGVmaW5lIFNCQ0xfQVROCQkweDA4CS8qICBBVE4gcm8gKi8KKyNkZWZpbmUgU0JDTF9NU0cJCTB4MDQJLyogIE1TRyBybyAqLworI2RlZmluZSBTQkNMX0NECQkJMHgwMgkvKiAgQy9EIHJvICovCisjZGVmaW5lIFNCQ0xfSU8JCQkweDAxCS8qICBJL08gcm8gKi8KKyNkZWZpbmUgU0JDTF9QSEFTRV9DTURPVVQJU0JDTF9DRAorI2RlZmluZSBTQkNMX1BIQVNFX0RBVEFJTglTQkNMX0lPCisjZGVmaW5lIFNCQ0xfUEhBU0VfREFUQU9VVAkwCisjZGVmaW5lIFNCQ0xfUEhBU0VfTVNHSU4JKFNCQ0xfQ0R8U0JDTF9JT3xTQkNMX01TRykKKyNkZWZpbmUgU0JDTF9QSEFTRV9NU0dPVVQJKFNCQ0xfQ0R8U0JDTF9NU0cpCisjZGVmaW5lIFNCQ0xfUEhBU0VfU1RBVElOCShTQkNMX0NEfFNCQ0xfSU8pCisjZGVmaW5lIFNCQ0xfUEhBU0VfTUFTSwkJKFNCQ0xfQ0R8U0JDTF9JT3xTQkNMX01TRykKKy8qIAorICogU3luY2hyb25vdXMgU0NTSSBDbG9jayBDb250cm9sIGJpdHMgCisgKiAwIC0gc2V0IGJ5IERDTlRMIAorICogMSAtIFNDTEsgLyAxLjAKKyAqIDIgLSBTQ0xLIC8gMS41CisgKiAzIC0gU0NMSyAvIDIuMCAKKyAqLworI2RlZmluZSBTQkNMX1NTQ0YxCQkweDAyCS8qIHdvLCAtNjYgb25seSAqLworI2RlZmluZSBTQkNMX1NTQ0YwCQkweDAxCS8qIHdvLCAtNjYgb25seSAqLworI2RlZmluZSBTQkNMX1NTQ0ZfTUFTSwkJMHgwMworCisvKiAKKyAqIFhYWCBub3RlIDogd2hlbiByZWFkaW5nIHRoZSBEU1RBVCBhbmQgU1RBVCByZWdpc3RlcnMgdG8gY2xlYXIgaW50ZXJydXB0cywKKyAqIGluc3VyZSB0aGF0IDEwIGNsb2NrcyBlbGFwc2UgYmV0d2VlbiB0aGUgdHdvICAKKyAqLworLyogRE1BIHN0YXR1cyBybyAqLworI2RlZmluZSBEU1RBVF9SRUcJCTB4MGMJCisjZGVmaW5lIERTVEFUX0RGRQkJMHg4MAkvKiBETUEgRklGTyBlbXB0eSAqLworI2RlZmluZSBEU1RBVF84MDBfTURQRQkJMHg0MAkvKiBNYXN0ZXIgRGF0YSBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUgRFNUQVRfODAwX0JGCQkweDIwCS8qIEJ1cyBGYXVsdCAqLworI2RlZmluZSBEU1RBVF9BQlJUCQkweDEwCS8qIEFib3J0ZWQgLSBzZXQgb24gZXJyb3IgKi8KKyNkZWZpbmUgRFNUQVRfU1NJCQkweDA4CS8qIFNDUklQVFMgc2luZ2xlIHN0ZXAgaW50ZXJydXB0ICovCisjZGVmaW5lIERTVEFUX1NJUgkJMHgwNAkvKiBTQ1JJUFRTIGludGVycnVwdCByZWNlaXZlZCAtIAorCQkJCQkgICBzZXQgd2hlbiBJTlQgaW5zdHJ1Y3Rpb24gaXMgCisJCQkJCSAgIGV4ZWN1dGVkICovCisjZGVmaW5lIERTVEFUX1dURAkJMHgwMgkvKiBXYXRjaGRvZyB0aW1lb3V0IGRldGVjdGVkICovCisjZGVmaW5lIERTVEFUX09QQwkJMHgwMQkvKiBJbGxlZ2FsIGluc3RydWN0aW9uICovCisjZGVmaW5lIERTVEFUXzgwMF9JSUQJCTB4MDEJLyogU2FtZSB0aGluZywgZGlmZmVyZW50IG5hbWUgKi8KKworCisvKiBOQ1I1M2M4MDAgbW92ZXMgdGhpcyBzdHVmZiBpbnRvIFNJU1QwICovCisjZGVmaW5lIFNTVEFUMF9SRUcJCTB4MGQJLyogU0NTSSBzdGF0dXMgMCBybyAqLworI2RlZmluZSBTSVNUMF9SRUdfODAwCQkweDQyCQorI2RlZmluZSBTU1RBVDBfTUEJCTB4ODAJLyogaW5pIDogcGhhc2UgbWlzbWF0Y2gsCisJCQkJCSAqIHRndCA6IEFUTi8gYXNzZXJ0ZWQgCisJCQkJCSAqLworI2RlZmluZSBTU1RBVDBfQ01QCQkweDQwCS8qIGZ1bmN0aW9uIGNvbXBsZXRlICovCisjZGVmaW5lIFNTVEFUMF83MDBfU1RPCQkweDIwCS8qIFNlbGVjdGlvbiBvciByZXNlbGVjdGlvbiB0aW1lb3V0ICovCisjZGVmaW5lIFNJU1QwXzgwMF9TRUwJCTB4MjAJLyogU2VsZWN0ZWQgKi8KKyNkZWZpbmUgU1NUQVQwXzcwMF9TRUwJCTB4MTAJLyogU2VsZWN0ZWQgb3IgcmVzZWxlY3RlZCAqLworI2RlZmluZSBTSVNUMF84MDBfUlNMCQkweDEwCS8qIFJlc2VsZWN0ZWQgKi8KKyNkZWZpbmUgU1NUQVQwX1NHRQkJMHgwOAkvKiBTQ1NJIGdyb3NzIGVycm9yICovCisjZGVmaW5lIFNTVEFUMF9VREMJCTB4MDQJLyogVW5leHBlY3RlZCBkaXNjb25uZWN0ICovCisjZGVmaW5lIFNTVEFUMF9SU1QJCTB4MDIJLyogU0NTSSBSU1QvIHJlY2VpdmVkICovCisjZGVmaW5lIFNTVEFUMF9QQVIJCTB4MDEJLyogUGFyaXR5IGVycm9yICovCisKKy8qIEFuZCB1c2VzIFNTVEFUMCBmb3Igd2hhdCB3YXMgU1NUQVQxICovCisKKyNkZWZpbmUgU1NUQVQxX1JFRwkJMHgwZQkvKiBTQ1NJIHN0YXR1cyAxIHJvICovCisjZGVmaW5lIFNTVEFUMV9JTEYJCTB4ODAJLyogU0lETCBmdWxsICovCisjZGVmaW5lIFNTVEFUMV9PUkYJCTB4NDAJLyogU09EUiBmdWxsICovCisjZGVmaW5lIFNTVEFUMV9PTEYJCTB4MjAJLyogU09ETCBmdWxsICovCisjZGVmaW5lIFNTVEFUMV9BSVAJCTB4MTAJLyogQXJiaXRyYXRpb24gaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgU1NUQVQxX0xPQQkJMHgwOAkvKiBMb3N0IGFyYml0cmF0aW9uICovCisjZGVmaW5lIFNTVEFUMV9XT0EJCTB4MDQJLyogV29uIGFyYml0cmF0aW9uICovCisjZGVmaW5lIFNTVEFUMV9SU1QJCTB4MDIJLyogSW5zdGFudCByZWFkb3V0IG9mIFJTVC8gKi8KKyNkZWZpbmUgU1NUQVQxX1NEUAkJMHgwMQkvKiBJbnN0YW50IHJlYWRvdXQgb2YgU0RQLyAqLworCisjZGVmaW5lIFNTVEFUMl9SRUcJCTB4MGYJLyogU0NTSSBzdGF0dXMgMiBybyAqLworI2RlZmluZSBTU1RBVDJfRkYzCQkweDgwIAkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gc3luY2hyb25vdXMgKi8KKyNkZWZpbmUgU1NUQVQyX0ZGMgkJMHg0MAkvKiBkYXRhIEZJRk8gKi8KKyNkZWZpbmUgU1NUQVQyX0ZGMQkJMHgyMAkKKyNkZWZpbmUgU1NUQVQyX0ZGMAkJMHgxMAorI2RlZmluZSBTU1RBVDJfRkZfTUFTSwkJMHhmMAorI2RlZmluZSBTU1RBVDJfRkZfU0hJRlQJCTQKKworLyogCisgKiBMYXRjaGVkIHNpZ25hbHMsIGxhdGNoZWQgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiBSRVEvIGZvciBpbml0aWF0b3JzLAorICogQUNLLyBmb3IgdGFyZ2V0cy4KKyAqLworI2RlZmluZSBTU1RBVDJfU0RQCQkweDA4CS8qIFNEUCAqLworI2RlZmluZSBTU1RBVDJfTVNHCQkweDA0CS8qIE1TRyAqLworI2RlZmluZSBTU1RBVDJfQ0QJCTB4MDIJLyogQy9EICovCisjZGVmaW5lIFNTVEFUMl9JTwkJMHgwMQkvKiBJL08gKi8KKyNkZWZpbmUgU1NUQVQyX1BIQVNFX0NNRE9VVAlTU1RBVDJfQ0QKKyNkZWZpbmUgU1NUQVQyX1BIQVNFX0RBVEFJTglTU1RBVDJfSU8KKyNkZWZpbmUgU1NUQVQyX1BIQVNFX0RBVEFPVVQJMAorI2RlZmluZSBTU1RBVDJfUEhBU0VfTVNHSU4JKFNTVEFUMl9DRHxTU1RBVDJfSU98U1NUQVQyX01TRykKKyNkZWZpbmUgU1NUQVQyX1BIQVNFX01TR09VVAkoU1NUQVQyX0NEfFNTVEFUMl9NU0cpCisjZGVmaW5lIFNTVEFUMl9QSEFTRV9TVEFUSU4JKFNTVEFUMl9DRHxTU1RBVDJfSU8pCisjZGVmaW5lIFNTVEFUMl9QSEFTRV9NQVNLCShTU1RBVDJfQ0R8U1NUQVQyX0lPfFNTVEFUMl9NU0cpCisKKworLyogTkNSNTNjNzAwLTY2IG9ubHkgKi8KKyNkZWZpbmUgU0NSQVRDSEFfUkVHXzAwCQkweDEwICAgIC8qIHRocm91Z2ggIDB4MTMgU2NyYXRjaCBBIHJ3ICovCisvKiBOQ1I1M2M3MTAgYW5kIGhpZ2hlciAqLworI2RlZmluZSBEU0FfUkVHCQkJMHgxMAkvKiBEQVRBIHN0cnVjdHVyZSBhZGRyZXNzICovCisKKyNkZWZpbmUgQ1RFU1QwX1JFR183MDAJCTB4MTQJLyogQ2hpcCB0ZXN0IDAgcm8gKi8KKyNkZWZpbmUgQ1RFU1QwX1JFR184MDAJCTB4MTgJLyogQ2hpcCB0ZXN0IDAgcncsIGdlbmVyYWwgcHVycG9zZSAqLworLyogMHg4MCAtIDB4MDQgYXJlIHJlc2VydmVkICovCisjZGVmaW5lIENURVNUMF83MDBfUlRSRwkJMHgwMgkvKiBSZWFsIHRhcmdldCBtb2RlICovCisjZGVmaW5lIENURVNUMF83MDBfRERJUgkJMHgwMQkvKiBEYXRhIGRpcmVjdGlvbiwgMSA9IAorCQkJCQkgKiBTQ1NJIGJ1cyB0byBob3N0LCAwICA9CisJCQkJCSAqIGhvc3QgdG8gU0NTSS4KKwkJCQkJICovCisKKyNkZWZpbmUgQ1RFU1QxX1JFR183MDAJCTB4MTUJLyogQ2hpcCB0ZXN0IDEgcm8gKi8KKyNkZWZpbmUgQ1RFU1QxX1JFR184MDAJCTB4MTkJLyogQ2hpcCB0ZXN0IDEgcm8gKi8KKyNkZWZpbmUgQ1RFU1QxX0ZNVDMJCTB4ODAJLyogSWRlbnRpZnkgd2hpY2ggYnl0ZSBsYW5lcyBhcmUgZW1wdHkgKi8KKyNkZWZpbmUgQ1RFU1QxX0ZNVDIJCTB4NDAgCS8qIGluIHRoZSBETUEgRklGTyAqLworI2RlZmluZSBDVEVTVDFfRk1UMQkJMHgyMAorI2RlZmluZSBDVEVTVDFfRk1UMAkJMHgxMAorCisjZGVmaW5lIENURVNUMV9GRkwzCQkweDA4CS8qIElkZW50aWZ5IHdoaWNoIGJ5dGVzIGxhbmVzIGFyZSBmdWxsICovCisjZGVmaW5lIENURVNUMV9GRkwyCQkweDA0CS8qIGluIHRoZSBETUEgRklGTyAqLworI2RlZmluZSBDVEVTVDFfRkZMMQkJMHgwMgorI2RlZmluZSBDVEVTVDFfRkZMMAkJMHgwMQorCisjZGVmaW5lIENURVNUMl9SRUdfNzAwCQkweDE2CS8qIENoaXAgdGVzdCAyIHJvICovCisjZGVmaW5lIENURVNUMl9SRUdfODAwCQkweDFhCS8qIENoaXAgdGVzdCAyIHJvICovCisKKyNkZWZpbmUgQ1RFU1QyXzgwMF9ERElSCQkweDgwCS8qIDEgPSBTQ1NJLT5ob3N0ICovCisjZGVmaW5lIENURVNUMl84MDBfU0lHUAkJMHg0MAkvKiBBIGNvcHkgb2YgU0lHUCBpbiBJU1RBVC4KKwkJCQkJICAgUmVhZGluZyB0aGlzIHJlZ2lzdGVyIGNsZWFycyAqLworI2RlZmluZSBDVEVTVDJfODAwX0NJTwkJMHgyMAkvKiBDb25maWd1cmVkIGFzIElPICovLgorI2RlZmluZSBDVEVTVDJfODAwX0NNCQkweDEwCS8qIENvbmZpZ3VyZWQgYXMgbWVtb3J5ICovCisKKy8qIDB4ODAgLSAweDQwIGFyZSByZXNlcnZlZCBvbiA3MDAgc2VyaWVzIGNoaXBzICovCisjZGVmaW5lIENURVNUMl83MDBfU09GRgkJMHgyMAkvKiBTQ1NJIE9mZnNldCBDb21wYXJlLAorCQkJCQkgKiBBcyBhbiBpbml0aWF0b3IsIHRoaXMgYml0IGlzIAorCQkJCQkgKiBvbmUgd2hlbiB0aGUgc3luY2hyb25vdXMgb2Zmc2V0CisJCQkJCSAqIGlzIHplcm8sIGFzIGEgdGFyZ2V0IHRoaXMgYml0IAorCQkJCQkgKiBpcyBvbmUgd2hlbiB0aGUgc3luY2hyb25vdXMgCisJCQkJCSAqIG9mZnNldCBpcyBhdCB0aGUgbWF4aW11bQorCQkJCQkgKiBkZWZpbmVkIGluIFNYRkVSCisJCQkJCSAqLworI2RlZmluZSBDVEVTVDJfNzAwX1NGUAkJMHgxMAkvKiBTQ1NJIEZJRk8gcGFyaXR5IGJpdCwKKwkJCQkJICogcmVhZGluZyBDVEVTVDMgdW5sb2FkcyBhIGJ5dGUKKwkJCQkJICogZnJvbSB0aGUgRklGTyBhbmQgc2V0cyB0aGlzCisJCQkJCSAqLworI2RlZmluZSBDVEVTVDJfNzAwX0RGUAkJMHgwOAkvKiBETUEgRklGTyBwYXJpdHkgYml0LAorCQkJCQkgKiByZWFkaW5nIENURVNUNiB1bmxvYWRzIGEgYnl0ZQorCQkJCQkgKiBmcm9tIHRoZSBGSUZPIGFuZCBzZXRzIHRoaXMKKwkJCQkJICovCisjZGVmaW5lIENURVNUMl9URU9QCQkweDA0CS8qIFNDU0kgdHJ1ZSBlbmQgb2YgcHJvY2VzcywKKwkJCQkJICogaW5kaWNhdGVzIGEgdG90YWxseSBmaW5pc2hlZAorCQkJCQkgKiB0cmFuc2ZlcgorCQkJCQkgKi8KKyNkZWZpbmUgQ1RFU1QyX0RSRVEJCTB4MDIJLyogRGF0YSByZXF1ZXN0IHNpZ25hbCAqLworLyogMHgwMSBpcyByZXNlcnZlZCBvbiA3MDAgc2VyaWVzIGNoaXBzICovCisjZGVmaW5lIENURVNUMl84MDBfREFDSwkJMHgwMQkKKworLyogCisgKiBDaGlwIHRlc3QgMyBybyAKKyAqIFVubG9hZHMgdGhlIGJvdHRvbSBieXRlIG9mIHRoZSBlaWdodCBkZWVwIFNDU0kgc3luY2hyb25vdXMgRklGTywKKyAqIGNoZWNrIFNTVEFUMiBGSUZPIGZ1bGwgYml0cyB0byBkZXRlcm1pbmUgc2l6ZS4gIE5vdGUgdGhhdCBhIEdST1NTCisgKiBlcnJvciByZXN1bHRzIGlmIGEgcmVhZCBpcyBhdHRlbXB0ZWQgb24gdGhpcyByZWdpc3Rlci4gIEFsc28gbm90ZSAKKyAqIHRoYXQgMTYgYW5kIDMyIGJpdCByZWFkcyBvZiB0aGlzIHJlZ2lzdGVyIHdpbGwgY2F1c2UgY29ycnVwdGlvbi4KKyAqLworI2RlZmluZSBDVEVTVDNfUkVHXzcwMAkJMHgxNwkKKy8qICBDaGlwIHRlc3QgMyBydyAqLworI2RlZmluZSBDVEVTVDNfUkVHXzgwMAkJMHgxYgorI2RlZmluZSBDVEVTVDNfODAwX1YzCQkweDgwCS8qIENoaXAgcmV2aXNpb24gKi8KKyNkZWZpbmUgQ1RFU1QzXzgwMF9WMgkJMHg0MAorI2RlZmluZSBDVEVTVDNfODAwX1YxCQkweDIwCisjZGVmaW5lIENURVNUM184MDBfVjAJCTB4MTAKKyNkZWZpbmUgQ1RFU1QzXzgwMF9GTEYJCTB4MDgJLyogRmx1c2ggRE1BIEZJRk8gKi8KKyNkZWZpbmUgQ1RFU1QzXzgwMF9DTEYJCTB4MDQJLyogQ2xlYXIgRE1BIEZJRk8gKi8KKyNkZWZpbmUgQ1RFU1QzXzgwMF9GTQkJMHgwMgkvKiBGZXRjaCBtb2RlIHBpbiAqLworLyogYml0IDAgaXMgcmVzZXJ2ZWQgb24gODAwIHNlcmllcyBjaGlwcyAqLworCisjZGVmaW5lIENURVNUNF9SRUdfNzAwCQkweDE4CS8qIENoaXAgdGVzdCA0IHJ3ICovCisjZGVmaW5lIENURVNUNF9SRUdfODAwCQkweDIxCS8qIENoaXAgdGVzdCA0IHJ3ICovCisvKiAweDgwIGlzIHJlc2VydmVkIG9uIDcwMCBzZXJpZXMgY2hpcHMgKi8KKyNkZWZpbmUgQ1RFU1Q0XzgwMF9CRElTCQkweDgwCS8qIEJ1cnN0IG1vZGUgZGlzYWJsZSAqLworI2RlZmluZSBDVEVTVDRfWk1PRAkJMHg0MAkvKiBIaWdoIGltcGVkYW5jZSBtb2RlICovCisjZGVmaW5lIENURVNUNF9TWk0JCTB4MjAJLyogU0NTSSBidXMgaGlnaCBpbXBlZGFuY2UgKi8KKyNkZWZpbmUgQ1RFU1Q0XzcwMF9TTEJFCQkweDEwCS8qIFNDU0kgbG9vcGJhY2sgZW5hYmxlZCAqLworI2RlZmluZSBDVEVTVDRfODAwX1NSVE0JCTB4MTAJLyogU2hhZG93IFJlZ2lzdGVyIFRlc3QgTW9kZSAqLworI2RlZmluZSBDVEVTVDRfNzAwX1NGV1IJCTB4MDgJLyogU0NTSSBGSUZPIHdyaXRlIGVuYWJsZSwgCisJCQkJCSAqIHJlZGlyZWN0cyB3cml0ZXMgZnJvbSBTT0RMCisJCQkJCSAqIHRvIHRoZSBTQ1NJIEZJRk8uCisJCQkJCSAqLworI2RlZmluZSBDVEVTVDRfODAwX01QRUUJCTB4MDgJLyogRW5hYmxlIHBhcml0eSBjaGVja2luZworCQkJCQkgICBkdXJpbmcgbWFzdGVyIGN5Y2xlcyBvbiBQQ0kKKwkJCQkJICAgYnVzICovCisKKy8qIAorICogVGhlc2UgYml0cyBzZW5kIHRoZSBjb250ZW50cyBvZiB0aGUgQ1RFU1Q2IHJlZ2lzdGVyIHRvIHRoZSBhcHByb3ByaWF0ZQorICogYnl0ZSBsYW5lIG9mIHRoZSAzMiBiaXQgRE1BIEZJRk8uICBOb3JtYWwgb3BlcmF0aW9uIGlzIHplcm8sIG90aGVyd2lzZSAKKyAqIHRoZSBoaWdoIGJpdCBtZWFucyB0aGUgbG93IHR3byBiaXRzIHNlbGVjdCB0aGUgYnl0ZSBsYW5lLgorICovCisjZGVmaW5lIENURVNUNF9GQkwyCQkweDA0CQorI2RlZmluZSBDVEVTVDRfRkJMMQkJMHgwMgorI2RlZmluZSBDVEVTVDRfRkJMMAkJMHgwMQkKKyNkZWZpbmUgQ1RFU1Q0X0ZCTF9NQVNLCQkweDA3CisjZGVmaW5lIENURVNUNF9GQkxfMAkJMHgwNAkvKiBTZWxlY3QgRE1BIEZJRk8gYnl0ZSBsYW5lIDAgKi8KKyNkZWZpbmUgQ1RFU1Q0X0ZCTF8xCQkweDA1CS8qIFNlbGVjdCBETUEgRklGTyBieXRlIGxhbmUgMSAqLworI2RlZmluZSBDVEVTVDRfRkJMXzIJCTB4MDYJLyogU2VsZWN0IERNQSBGSUZPIGJ5dGUgbGFuZSAyICovCisjZGVmaW5lIENURVNUNF9GQkxfMwkJMHgwNwkvKiBTZWxlY3QgRE1BIEZJRk8gYnl0ZSBsYW5lIDMgKi8KKyNkZWZpbmUgQ1RFU1Q0XzgwMF9TQVZFCQkoQ1RFU1Q0XzgwMF9CRElTKQorCisKKyNkZWZpbmUgQ1RFU1Q1X1JFR183MDAJCTB4MTkJLyogQ2hpcCB0ZXN0IDUgcncgKi8KKyNkZWZpbmUgQ1RFU1Q1X1JFR184MDAJCTB4MjIJLyogQ2hpcCB0ZXN0IDUgcncgKi8KKy8qIAorICogQ2xvY2sgQWRkcmVzcyBJbmNyZW1lbnRvci4gIFdoZW4gc2V0LCBpdCBpbmNyZW1lbnRzIHRoZSAKKyAqIEROQUQgcmVnaXN0ZXIgdG8gdGhlIG5leHQgYnVzIHNpemUgYm91bmRhcnkuICBJdCBhdXRvbWF0aWNhbGx5IAorICogcmVzZXRzIGl0c2VsZiB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGUuCisgKi8KKyNkZWZpbmUgQ1RFU1Q1X0FEQ0sJCTB4ODAKKy8qCisgKiBDbG9jayBCeXRlIENvdW50ZXIuICBXaGVuIHNldCwgaXQgZGVjcmVtZW50cyB0aGUgREJDIHJlZ2lzdGVyIHRvCisgKiB0aGUgbmV4dCBidXMgc2l6ZSBib3VuZGFyeS4KKyAqLworI2RlZmluZSBDVEVTVDVfQkJDSwkJMHg0MAorLyoKKyAqIFJlc2V0IFNDU0kgT2Zmc2V0LiAgU2V0dGluZyB0aGlzIGJpdCB0byAxIGNsZWFycyB0aGUgY3VycmVudCBvZmZzZXQKKyAqIHBvaW50ZXIgaW4gdGhlIFNDU0kgc3luY2hyb25vdXMgb2Zmc2V0IGNvdW50ZXIgKFNTVEFUKS4gIFRoaXMgYml0CisgKiBpcyBzZXQgdG8gMSBpZiBhIFNDU0kgR3Jvc3MgRXJyb3IgQ29uZGl0aW9uIG9jY3Vycy4gIFRoZSBvZmZzZXQgc2hvdWxkCisgKiBiZSBjbGVhcmVkIHdoZW4gYSBzeW5jaHJvbm91cyB0cmFuc2ZlciBmYWlscy4gIFdoZW4gd3JpdHRlbiwgaXQgaXMgCisgKiBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgYWZ0ZXIgdGhlIFNDU0kgc3luY2hyb25vdXMgb2Zmc2V0IGNvdW50ZXIgaXMgCisgKiByZXNldC4KKyAqLworLyogQml0IDUgaXMgcmVzZXJ2ZWQgb24gODAwIHNlcmllcyBjaGlwcyAqLworI2RlZmluZSBDVEVTVDVfNzAwX1JPRkYJCTB4MjAKKy8qIAorICogTWFzdGVyIENvbnRyb2wgZm9yIFNldCBvciBSZXNldCBwdWxzZXMuIFdoZW4gMSwgY2F1c2VzIHRoZSBsb3cgCisgKiBmb3VyIGJpdHMgb2YgcmVnaXN0ZXIgdG8gc2V0IHdoZW4gc2V0LCAwIGNhdXNlcyB0aGUgbG93IGJpdHMgdG8KKyAqIGNsZWFyIHdoZW4gc2V0LgorICovCisjZGVmaW5lIENURVNUNV9NQVNSIAkJMHgxMAkKKyNkZWZpbmUgQ1RFU1Q1X0RESVIJCTB4MDgJLyogRE1BIGRpcmVjdGlvbiAqLworLyoKKyAqIEJpdHMgMi0wIGFyZSByZXNlcnZlZCBvbiA4MDAgc2VyaWVzIGNoaXBzCisgKi8KKyNkZWZpbmUgQ1RFU1Q1XzcwMF9FT1AJCTB4MDQJLyogRW5kIG9mIHByb2Nlc3MgKi8KKyNkZWZpbmUgQ1RFU1Q1XzcwMF9EUkVRCQkweDAyCS8qIERhdGEgcmVxdWVzdCAqLworI2RlZmluZSBDVEVTVDVfNzAwX0RBQ0sJCTB4MDEJLyogRGF0YSBhY2tub3dsZWRnZSAqLworCisvKiAKKyAqIENoaXAgdGVzdCA2IHJ3IC0gd3JpdGluZyB0byB0aGlzIHJlZ2lzdGVyIHdyaXRlcyB0byB0aGUgYnl0ZSAKKyAqIGxhbmUgaW4gdGhlIERNQSBGSUZPIGFzIGRldGVybWluZWQgYnkgdGhlIEZCTCBiaXRzIGluIHRoZSBDVEVTVDQKKyAqIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIENURVNUNl9SRUdfNzAwCQkweDFhCisjZGVmaW5lIENURVNUNl9SRUdfODAwCQkweDIzCisKKyNkZWZpbmUgQ1RFU1Q3X1JFRwkJMHgxYgkvKiBDaGlwIHRlc3QgNyBydyAqLworLyogMHg4MCAtIDB4NDAgYXJlIHJlc2VydmVkIG9uIE5DUjUzYzcwMCBhbmQgTkNSNTNjNzAwLTY2IGNoaXBzICovCisjZGVmaW5lIENURVNUN18xMF9DRElTCQkweDgwCS8qIENhY2hlIGJ1cnN0IGRpc2FibGUgKi8KKyNkZWZpbmUgQ1RFU1Q3XzEwX1NDMQkJMHg0MAkvKiBTbm9vcCBjb250cm9sIGJpdHMgKi8KKyNkZWZpbmUgQ1RFU1Q3XzEwX1NDMAkJMHgyMAkKKyNkZWZpbmUgQ1RFU1Q3XzEwX1NDX01BU0sJMHg2MAorLyogMHgyMCBpcyByZXNlcnZlZCBvbiB0aGUgTkNSNTNjNzAwICovCisjZGVmaW5lIENURVNUN18wMDYwX0ZNCQkweDIwCS8qIEZldGNoIG1vZGUgKi8KKyNkZWZpbmUgQ1RFU1Q3X1NURAkJMHgxMAkvKiBTZWxlY3Rpb24gdGltZW91dCBkaXNhYmxlICovCisjZGVmaW5lIENURVNUN19ERlAJCTB4MDgJLyogRE1BIEZJRk8gcGFyaXR5IGJpdCBmb3IgQ1RFU1Q2ICovCisjZGVmaW5lIENURVNUN19FVlAJCTB4MDQJLyogMSA9IGhvc3QgYnVzIGV2ZW4gcGFyaXR5LCAwID0gb2RkICovCisjZGVmaW5lIENURVNUN18xMF9UVDEJCTB4MDIJLyogVHJhbnNmZXIgdHlwZSAqLworI2RlZmluZSBDVEVTVDdfMDBfREMJCTB4MDIJLyogU2V0IHRvIGRyaXZlIERDIGxvdyBkdXJpbmcgaW5zdHJ1Y3Rpb24gCisJCQkJCSAgIGZldGNoICovCisjZGVmaW5lIENURVNUN19ESUZGCQkweDAxCS8qIERpZmZlcmVudGlhbCBtb2RlICovCisKKyNkZWZpbmUgQ1RFU1Q3X1NBVkUgKCBDVEVTVDdfRVZQIHwgQ1RFU1Q3X0RJRkYgKQorCisKKyNkZWZpbmUgVEVNUF9SRUcJCTB4MWMJLyogdGhyb3VnaCAweDFmIFRlbXBvcmFyeSBzdGFjayBydyAqLworCisjZGVmaW5lIERGSUZPX1JFRwkJMHgyMAkvKiBETUEgRklGTyBydyAqLworLyogCisgKiAweDgwIGlzIHJlc2VydmVkIG9uIHRoZSBOQ1I1M2M3MTAsIHRoZSBDTEYgYW5kIEZMRiBiaXRzIGhhdmUgYmVlbgorICogbW92ZWQgaW50byB0aGUgQ1RFU1Q4IHJlZ2lzdGVyLgorICovCisjZGVmaW5lIERGSUZPXzAwX0ZMRgkJMHg4MAkvKiBGbHVzaCBETUEgRklGTyB0byBtZW1vcnkgKi8KKyNkZWZpbmUgREZJRk9fMDBfQ0xGCQkweDQwCS8qIENsZWFyIERNQSBhbmQgU0NTSSBGSUZPcyAqLworI2RlZmluZSBERklGT19CTzYJCTB4NDAKKyNkZWZpbmUgREZJRk9fQk81CQkweDIwCisjZGVmaW5lIERGSUZPX0JPNAkJMHgxMAorI2RlZmluZSBERklGT19CTzMJCTB4MDgKKyNkZWZpbmUgREZJRk9fQk8yCQkweDA0IAorI2RlZmluZSBERklGT19CTzEJCTB4MDIKKyNkZWZpbmUgREZJRk9fQk8wCQkweDAxCisjZGVmaW5lIERGSUZPXzEwX0JPX01BU0sJMHg3ZgkvKiA3IGJpdCBjb3VudGVyICovCisjZGVmaW5lIERGSUZPXzAwX0JPX01BU0sJMHgzZgkvKiA2IGJpdCBjb3VudGVyICovCisKKy8qIAorICogSW50ZXJydXB0IHN0YXR1cyBydyAKKyAqIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBvbmx5IHJlZ2lzdGVyIHdoaWNoIGNhbiBiZSByZWFkIHdoaWxlIFNDU0kKKyAqIFNDUklQVFMgYXJlIGJlaW5nIGV4ZWN1dGVkLgorICovCisjZGVmaW5lIElTVEFUX1JFR183MDAJCTB4MjEKKyNkZWZpbmUgSVNUQVRfUkVHXzgwMAkJMHgxNAorI2RlZmluZSBJU1RBVF9BQlJUCQkweDgwCS8qIFNvZnR3YXJlIGFib3J0LCB3cml0ZSAKKwkJCQkJICoxIHRvIGFib3J0LCB3YWl0IGZvciBpbnRlcnJ1cHQuICovCisvKiAweDQwIGFuZCAweDIwIGFyZSByZXNlcnZlZCBvbiBOQ1I1M2M3MDAgYW5kIE5DUjUzYzcwMC02NiBjaGlwcyAqLworI2RlZmluZSBJU1RBVF8xMF9TUlNUCQkweDQwCS8qIHNvZnR3YXJlIHJlc2V0ICovCisjZGVmaW5lIElTVEFUXzEwX1NJR1AJCTB4MjAJLyogc2lnbmFsIHNjcmlwdCAqLworLyogMHgxMCBpcyByZXNlcnZlZCBvbiBOQ1I1M2M3MDAgc2VyaWVzIGNoaXBzICovCisjZGVmaW5lIElTVEFUXzgwMF9TRU0JCTB4MTAJLyogc2VtYXBob3JlICovCisjZGVmaW5lIElTVEFUX0NPTgkJMHgwOAkvKiAxIHdoZW4gY29ubmVjdGVkICovCisjZGVmaW5lIElTVEFUXzgwMF9JTlRGCQkweDA0CS8qIEludGVycnVwdCBvbiB0aGUgZmx5ICovCisjZGVmaW5lIElTVEFUXzcwMF9QUkUJCTB4MDQJLyogUG9pbnRlciByZWdpc3RlciBlbXB0eS4KKwkJCQkJICogU2V0IHRvIDEgd2hlbiBEU1BTIGFuZCBEU1AKKwkJCQkJICogcmVnaXN0ZXJzIGFyZSBlbXB0eSBpbiBwaXBlbGluZQorCQkJCQkgKiBtb2RlLCBhbHdheXMgc2V0IG90aGVyd2lzZS4KKwkJCQkJICovCisjZGVmaW5lIElTVEFUX1NJUAkJMHgwMgkvKiBTQ1NJIGludGVycnVwdCBwZW5kaW5nIGZyb20KKwkJCQkJICogU0NTSSBwb3J0aW9uIG9mIFNJT1Agc2VlCisJCQkJCSAqIFNTVEFUMAorCQkJCQkgKi8KKyNkZWZpbmUgSVNUQVRfRElQCQkweDAxCS8qIERNQSBpbnRlcnJ1cHQgcGVuZGluZyAKKwkJCQkJICogc2VlIERTVEFUCisJCQkJCSAqLworCisvKiBOQ1I1M2M3MDAtNjYgYW5kIE5DUjUzYzcxMCBvbmx5ICovCisjZGVmaW5lIENURVNUOF9SRUcJCTB4MjIJLyogQ2hpcCB0ZXN0IDggcncgKi8KKyNkZWZpbmUgQ1RFU1Q4XzAwNjZfRUFTCQkweDgwCS8qIEVuYWJsZSBhbHRlcm5hdGUgU0NTSSBjbG9jaywKKwkJCQkJICogaWUgcmVhZCBmcm9tIFNDTEsvIHJhdGhlciB0aGFuIENMSy8KKwkJCQkJICovCisjZGVmaW5lIENURVNUOF8wMDY2X0VGTQkJMHg0MAkvKiBFbmFibGUgZmV0Y2ggYW5kIG1hc3RlciBvdXRwdXRzICovCisjZGVmaW5lIENURVNUOF8wMDY2X0dSUAkJMHgyMAkvKiBHZW5lcmF0ZSBSZWNlaXZlIFBhcml0eSBmb3IgCisJCQkJCSAqIHBhc3MgdGhyb3VnaC4gIFRoaXMgaW5zdXJlcyB0aGF0IAorCQkJCQkgKiBiYWQgcGFyaXR5IHdvbid0IHJlYWNoIHRoZSBob3N0IAorCQkJCQkgKiBidXMuCisJCQkJCSAqLworI2RlZmluZSBDVEVTVDhfMDA2Nl9URQkJMHgxMAkvKiBUb2xlckFOVCBlbmFibGUuICBFbmFibGUgCisJCQkJCSAqIGFjdGl2ZSBuZWdhdGlvbiwgc2hvdWxkIG9ubHkKKwkJCQkJICogYmUgdXNlZCBmb3Igc2xvdyBTQ1NJIAorCQkJCQkgKiBub24tZGlmZmVyZW50aWFsLgorCQkJCQkgKi8KKyNkZWZpbmUgQ1RFU1Q4XzAwNjZfSFNDCQkweDA4CS8qIEhhbHQgU0NTSSBjbG9jayAqLworI2RlZmluZSBDVEVTVDhfMDA2Nl9TUkEJCTB4MDQJLyogU2hvcnRlbiBSRVEvQUNLIGZpbHRlcmluZywKKwkJCQkJICogbXVzdCBiZSBzZXQgZm9yIGZhc3QgU0NTSS1JSQorCQkJCQkgKiBzcGVlZHMuCisJCQkJCSAqLworI2RlZmluZSBDVEVTVDhfMDA2Nl9EQVMJCTB4MDIJLyogRGlzYWJsZSBhdXRvbWF0aWMgdGFyZ2V0L2luaXRpYXRvcgorCQkJCQkgKiBzd2l0Y2hpbmcuCisJCQkJCSAqLworI2RlZmluZSBDVEVTVDhfMDA2Nl9MREUJCTB4MDEJLyogTGFzdCBkaXNjb25uZWN0IGVuYWJsZS4KKwkJCQkJICogVGhlIHN0YXR1cyBvZiBwZW5kaW5nIAorCQkJCQkgKiBkaXNjb25uZWN0IGlzIG1haW50YWluZWQgYnkKKwkJCQkJICogdGhlIGNvcmUsIGVsaW1pbmF0aW5nCisJCQkJCSAqIHRoZSBwb3NzaWJpbGl0eSBvZiBtaXNzaW5nIGEgCisJCQkJCSAqIHNlbGVjdGlvbiBvciByZXNlbGVjdGlvbgorCQkJCQkgKiB3aGlsZSB3YWl0aW5nIHRvIGZldGNoIGEgCisJCQkJCSAqIFdBSVQgRElTQ09OTkVDVCBvcGNvZGUuCisJCQkJCSAqLworCisjZGVmaW5lIENURVNUOF8xMF9WMwkJMHg4MAkvKiBDaGlwIHJldmlzaW9uICovCisjZGVmaW5lIENURVNUOF8xMF9WMgkJMHg0MAorI2RlZmluZSBDVEVTVDhfMTBfVjEJCTB4MjAJCisjZGVmaW5lIENURVNUOF8xMF9WMAkJMHgxMAorI2RlZmluZSBDVEVTVDhfMTBfVl9NQVNLCTB4ZjAJCisjZGVmaW5lIENURVNUOF8xMF9GTEYJCTB4MDgJLyogRmx1c2ggRklGT3MgKi8KKyNkZWZpbmUgQ1RFU1Q4XzEwX0NMRgkJMHgwNAkvKiBDbGVhciBGSUZPcyAqLworI2RlZmluZSBDVEVTVDhfMTBfRk0JCTB4MDIJLyogRmV0Y2ggcGluIG1vZGUgKi8KKyNkZWZpbmUgQ1RFU1Q4XzEwX1NNCQkweDAxCS8qIFNub29wIHBpbiBtb2RlICovCisKKworLyogCisgKiBUaGUgQ1RFU1Q5IHJlZ2lzdGVyIG1heSBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhCisgKiBOQ1I1M2M3MDAgYW5kIGEgTkNSNTNjNzEwLiAgCisgKgorICogV3JpdGUgMHhmZiB0byB0aGlzIHJlZ2lzdGVyLgorICogUmVhZCBpdC4KKyAqIElmIHRoZSBjb250ZW50cyBhcmUgMHhmZiwgaXQgaXMgYSBOQ1I1M2M3MDAKKyAqIElmIHRoZSBjb250ZW50cyBhcmUgMHgwMCwgaXQgaXMgYSBOQ1I1M2M3MDAtNjYgZmlyc3QgcmV2aXNpb24KKyAqIElmIHRoZSBjb250ZW50cyBhcmUgc29tZSBvdGhlciB2YWx1ZSwgaXQgaXMgc29tZSBvdGhlciBOQ1I1M2M3MDAtNjYKKyAqLworI2RlZmluZSBDVEVTVDlfUkVHXzAwCQkweDIzCS8qIENoaXAgdGVzdCA5IHJvICovCisjZGVmaW5lIExDUkNfUkVHXzEwCQkweDIzCQorCisvKgorICogMHgyNCB0aHJvdWdoIDB4MjcgYXJlIHRoZSBETUEgYnl0ZSBjb3VudGVyIHJlZ2lzdGVyLiAgSW5zdHJ1Y3Rpb25zCisgKiB3cml0ZSB0aGVpciBoaWdoIDggYml0cyBpbnRvIHRoZSBEQ01EIHJlZ2lzdGVyLCB0aGUgbG93IDI0IGJpdHMgaW50bworICogdGhlIERCQyByZWdpc3Rlci4KKyAqCisgKiBGdW5jdGlvbiBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbW1hbmQgdHlwZSBiZWluZyBleGVjdXRlZC4KKyAqLworCisgCisjZGVmaW5lIERCQ19SRUcJCQkweDI0CisvKiAKKyAqIEZvciBCbG9jayBNb3ZlIEluc3RydWN0aW9ucywgREJDIGlzIGEgMjQgYml0IHF1YW50aXR5IHJlcHJlc2VudGluZyAKKyAqICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyLgorICogRm9yIFRyYW5zZmVyIENvbnRyb2wgSW5zdHJ1Y3Rpb25zLCBEQkMgaXMgYml0IGZpZWxkZWQgYXMgZm9sbG93cyA6IAorICovCisvKiBCaXRzIDIwIC0gMjMgc2hvdWxkIGJlIGNsZWFyICovCisjZGVmaW5lIERCQ19UQ0lfVFJVRQkJKDEgPDwgMTkpIAkvKiBKdW1wIHdoZW4gdHJ1ZSAqLworI2RlZmluZSBEQkNfVENJX0NPTVBBUkVfREFUQQkoMSA8PCAxOCkJLyogQ29tcGFyZSBkYXRhICovCisjZGVmaW5lIERCQ19UQ0lfQ09NUEFSRV9QSEFTRQkoMSA8PCAxNykJLyogQ29tcGFyZSBwaGFzZSB3aXRoIERDTUQgZmllbGQgKi8KKyNkZWZpbmUgREJDX1RDSV9XQUlUX0ZPUl9WQUxJRAkoMSA8PCAxNikJLyogV2FpdCBmb3IgUkVRICovCisvKiBCaXRzIDggLSAxNSBhcmUgcmVzZXJ2ZWQgb24gc29tZSBpbXBsZW1lbnRhdGlvbnMgPyAqLworI2RlZmluZSBEQkNfVENJX01BU0tfTUFTSwkweGZmMDAgCQkvKiBNYXNrIGZvciBkYXRhIGNvbXBhcmUgKi8KKyNkZWZpbmUgREJDX1RDSV9NQVNLX1NISUZUCTgKKyNkZWZpbmUgREJDX1RDSV9EQVRBX01BU0sJMHhmZgkJLyogRGF0YSB0byBiZSBjb21wYXJlZCAqLyAKKyNkZWZpbmUgREJDX1RDSV9EQVRBX1NISUZUCTAKKworI2RlZmluZSBEQkNfUldSSV9JTU1FRElBVEVfTUFTSwkweGZmMDAJCS8qIEltbWVkaWF0ZSBkYXRhICovCisjZGVmaW5lIERCQ19SV1JJX0lNTUVESUFURV9TSElGVCA4CQkvKiBBbW91bnQgdG8gc2hpZnQgKi8KKyNkZWZpbmUgREJDX1JXUklfQUREUkVTU19NQVNLCTB4M2YwMDAwCS8qIFJlZ2lzdGVyIGFkZHJlc3MgKi8KKyNkZWZpbmUgREJDX1JXUklfQUREUkVTU19TSElGVCAJMTYKKworCisvKgorICogRE1BIGNvbW1hbmQgci93CisgKi8KKyNkZWZpbmUgRENNRF9SRUcJCTB4MjcJCisjZGVmaW5lIERDTURfVFlQRV9NQVNLCQkweGMwCS8qIE1hc2tzIG9mZiB0eXBlICovCisjZGVmaW5lIERDTURfVFlQRV9CTUkJCTB4MDAJLyogSW5kaWNhdGVzIGEgQmxvY2sgTW92ZSBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBEQ01EX0JNSV9JTwkJMHgwMQkvKiBJL08sIENELCBhbmQgTVNHIGJpdHMgc2VsZWN0aW5nICAgKi8KKyNkZWZpbmUgRENNRF9CTUlfQ0QJCTB4MDIJLyogdGhlIHBoYXNlIGZvciB0aGUgYmxvY2sgTU9WRSAgICAgICovCisjZGVmaW5lIERDTURfQk1JX01TRwkJMHgwNAkvKiBpbnN0cnVjdGlvbiAJCQkgICAgICovCisKKyNkZWZpbmUgRENNRF9CTUlfT1BfTUFTSwkweDE4CS8qIG1hc2sgZm9yIG9wY29kZSAqLworI2RlZmluZSBEQ01EX0JNSV9PUF9NT1ZFX1QJMHgwMAkvKiBNT1ZFICovCisjZGVmaW5lIERDTURfQk1JX09QX01PVkVfSQkweDA4CS8qIE1PVkUgSW5pdGlhdG9yICovCisKKyNkZWZpbmUgRENNRF9CTUlfSU5ESVJFQ1QJMHgyMAkvKiAgSW5kaXJlY3QgYWRkcmVzc2luZyAqLworCisjZGVmaW5lIERDTURfVFlQRV9UQ0kJCTB4ODAJLyogSW5kaWNhdGVzIGEgVHJhbnNmZXIgQ29udHJvbCAKKwkJCQkJICAgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgRENNRF9UQ0lfSU8JCTB4MDEJLyogSS9PLCBDRCwgYW5kIE1TRyBiaXRzIHNlbGVjdGluZyAgICovCisjZGVmaW5lIERDTURfVENJX0NECQkweDAyCS8qIHRoZSBwaGFzZSBmb3IgdGhlIGJsb2NrIE1PVkUgICAgICAqLworI2RlZmluZSBEQ01EX1RDSV9NU0cJCTB4MDQJLyogaW5zdHJ1Y3Rpb24gCQkJICAgICAqLworI2RlZmluZSBEQ01EX1RDSV9PUF9NQVNLCTB4MzgJLyogbWFzayBmb3Igb3Bjb2RlICovCisjZGVmaW5lIERDTURfVENJX09QX0pVTVAJMHgwMAkvKiBKVU1QICovCisjZGVmaW5lIERDTURfVENJX09QX0NBTEwJMHgwOAkvKiBDQUxMICovCisjZGVmaW5lIERDTURfVENJX09QX1JFVFVSTgkweDEwCS8qIFJFVFVSTiAqLworI2RlZmluZSBEQ01EX1RDSV9PUF9JTlQJCTB4MTgJLyogSU5UICovCisKKyNkZWZpbmUgRENNRF9UWVBFX1JXUkkJCTB4NDAJLyogSW5kaWNhdGVzIEkvTyBvciByZWdpc3RlciBSZWFkL1dyaXRlCisJCQkJCSAgIGluc3RydWN0aW9uICovCisjZGVmaW5lIERDTURfUldSSV9PUENfTUFTSwkweDM4CS8qIE9wY29kZSBtYXNrICovCisjZGVmaW5lIERDTURfUldSSV9PUENfV1JJVEUJMHgyOAkvKiBXcml0ZSBTRkJSIHRvIHJlZ2lzdGVyICovCisjZGVmaW5lIERDTURfUldSSV9PUENfUkVBRAkweDMwCS8qIFJlYWQgcmVnaXN0ZXIgdG8gU0ZCUiAqLworI2RlZmluZSBEQ01EX1JXUklfT1BDX01PRElGWQkweDM4CS8qIE1vZGlmeSBpbiBwbGFjZSAqLworCisjZGVmaW5lIERDTURfUldSSV9PUF9NQVNLCTB4MDcKKyNkZWZpbmUgRENNRF9SV1JJX09QX01PVkUJMHgwMAorI2RlZmluZSBEQ01EX1JXUklfT1BfU0hMCTB4MDEKKyNkZWZpbmUgRENNRF9SV1JJX09QX09SCQkweDAyCisjZGVmaW5lIERDTURfUldSSV9PUF9YT1IJMHgwMworI2RlZmluZSBEQ01EX1JXUklfT1BfQU5ECTB4MDQKKyNkZWZpbmUgRENNRF9SV1JJX09QX1NIUgkweDA1CisjZGVmaW5lIERDTURfUldSSV9PUF9BREQJMHgwNgorI2RlZmluZSBEQ01EX1JXUklfT1BfQUREQwkweDA3CisKKyNkZWZpbmUgRENNRF9UWVBFX01NSQkJMHhjMAkvKiBJbmRpY2F0ZXMgYSBNZW1vcnkgTW92ZSBpbnN0cnVjdGlvbiAKKwkJCQkJICAgKHRocmVlIHdvcmRzKSAqLworCisKKyNkZWZpbmUgRE5BRF9SRUcJCTB4MjgJLyogdGhyb3VnaCAweDJiIERNQSBuZXh0IGFkZHJlc3MgZm9yIAorCQkJCQkgICBkYXRhICovCisjZGVmaW5lIERTUF9SRUcJCQkweDJjCS8qIHRocm91Z2ggMHgyZiBETUEgU0NSSVBUUyBwb2ludGVyIHJ3ICovCisjZGVmaW5lIERTUFNfUkVHCQkweDMwCS8qIHRocm91Z2ggMHgzMyBETUEgU0NSSVBUUyBwb2ludGVyIAorCQkJCQkgICBzYXZlIHJ3ICovCisjZGVmaW5lIERNT0RFX1JFR18wMAkJMHgzNCAJLyogRE1BIG1vZGUgcncgKi8KKyNkZWZpbmUgRE1PREVfMDBfQkwxCTB4ODAJLyogQnVyc3QgbGVuZ3RoIGJpdHMgKi8KKyNkZWZpbmUgRE1PREVfMDBfQkwwCTB4NDAKKyNkZWZpbmUgRE1PREVfQkxfTUFTSwkweGMwCisvKiBCdXJzdCBsZW5ndGhzICg4MDApICovCisjZGVmaW5lIERNT0RFX0JMXzIJMHgwMAkvKiAyIHRyYW5zZmVyICovCisjZGVmaW5lIERNT0RFX0JMXzQJMHg0MAkvKiA0IHRyYW5zZmVycyAqLworI2RlZmluZSBETU9ERV9CTF84CTB4ODAJLyogOCB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgRE1PREVfQkxfMTYJMHhjMAkvKiAxNiB0cmFuc2ZlcnMgKi8KKworI2RlZmluZSBETU9ERV8xMF9CTF8xCTB4MDAJLyogMSB0cmFuc2ZlciAqLworI2RlZmluZSBETU9ERV8xMF9CTF8yCTB4NDAJLyogMiB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgRE1PREVfMTBfQkxfNAkweDgwCS8qIDQgdHJhbnNmZXJzICovCisjZGVmaW5lIERNT0RFXzEwX0JMXzgJMHhjMAkvKiA4IHRyYW5zZmVycyAqLworI2RlZmluZSBETU9ERV8xMF9GQzIJMHgyMAkvKiBEcml2ZW4gdG8gRkMyIHBpbiAqLworI2RlZmluZSBETU9ERV8xMF9GQzEJMHgxMAkvKiBEcml2ZW4gdG8gRkMxIHBpbiAqLworI2RlZmluZSBETU9ERV83MTBfUEQJMHgwOAkvKiBQcm9ncmFtL2RhdGEgb24gRkMwIHBpbiAqLworI2RlZmluZSBETU9ERV83MTBfVU8JMHgwMgkvKiBVc2VyIHByb2cuIG91dHB1dCAqLworCisjZGVmaW5lIERNT0RFXzcwMF9CVzE2CTB4MjAJLyogSG9zdCBidXN3aWR0aCA9IDE2ICovCisjZGVmaW5lIERNT0RFXzcwMF8yODYJMHgxMAkvKiAyODYgbW9kZSAqLworI2RlZmluZSBETU9ERV83MDBfSU9NCTB4MDgJLyogVHJhbnNmZXIgdG8gSU8gcG9ydCAqLworI2RlZmluZSBETU9ERV83MDBfRkFNCTB4MDQJLyogRml4ZWQgYWRkcmVzcyBtb2RlICovCisjZGVmaW5lIERNT0RFXzcwMF9QSVBFCTB4MDIJLyogUGlwZWxpbmUgbW9kZSBkaXNhYmxlcyAKKwkJCQkJICogYXV0b21hdGljIGZldGNoIC8gZXhlYyAKKwkJCQkJICovCisjZGVmaW5lIERNT0RFX01BTgkweDAxCQkvKiBNYW51YWwgc3RhcnQgbW9kZSwgCisJCQkJCSAqIHJlcXVpcmVzIGEgMSB0byBiZSB3cml0dGVuCisJCQkJCSAqIHRvIHRoZSBzdGFydCBETUEgYml0IGluIHRoZSBEQ05UTAorCQkJCQkgKiByZWdpc3RlciB0byBydW4gc2NyaXB0cyAKKwkJCQkJICovCisKKyNkZWZpbmUgRE1PREVfNzAwX1NBVkUgKCBETU9ERV8wMF9CTF9NQVNLIHwgRE1PREVfMDBfQlcxNiB8IERNT0RFXzAwXzI4NiApCisKKy8qIE5DUjUzYzgwMCBzZXJpZXMgb25seSAqLworI2RlZmluZSBTQ1JBVENIQV9SRUdfODAwCTB4MzQJLyogdGhyb3VnaCAweDM3IFNjcmF0Y2ggQSBydyAqLworLyogTkNSNTNjNzEwIG9ubHkgKi8KKyNkZWZpbmUgU0NSQVRDSEJfUkVHXzEwCQkweDM0CS8qIHRocm91Z2ggMHgzNyBzY3JhdGNoIEIgcncgKi8KKworI2RlZmluZSBETU9ERV9SRUdfMTAgICAgCTB4MzgJLyogRE1BIG1vZGUgcncsIE5DUjUzYzcxMCBhbmQgbmV3ZXIgKi8KKyNkZWZpbmUgRE1PREVfODAwX1NJT00JCTB4MjAJLyogU291cmNlIElPID0gMSAqLworI2RlZmluZSBETU9ERV84MDBfRElPTQkJMHgxMAkvKiBEZXN0aW5hdGlvbiBJTyA9IDEgKi8KKyNkZWZpbmUgRE1PREVfODAwX0VSTAkJMHgwOAkvKiBFbmFibGUgUmVhZCBMaW5lICovCisKKy8qIDM1LTM4IGFyZSByZXNlcnZlZCBvbiA3MDAgYW5kIDcwMC02NiBzZXJpZXMgY2hpcHMgKi8KKyNkZWZpbmUgRElFTl9SRUcJCTB4MzkJLyogRE1BIGludGVycnVwdCBlbmFibGUgcncgKi8KKy8qIDB4ODAsIDB4NDAsIGFuZCAweDIwIGFyZSByZXNlcnZlZCBvbiA3MDAtc2VyaWVzIGNoaXBzICovCisjZGVmaW5lIERJRU5fODAwX01EUEUJCTB4NDAJLyogTWFzdGVyIGRhdGEgcGFyaXR5IGVycm9yICovCisjZGVmaW5lIERJRU5fODAwX0JGCQkweDIwCS8qIEJVUyBmYXVsdCAqLworI2RlZmluZSBESUVOXzcwMF9CRgkJMHgyMAkvKiBCVVMgZmF1bHQgKi8KKyNkZWZpbmUgRElFTl9BQlJUCQkweDEwCS8qIEVuYWJsZSBhYm9ydGVkIGludGVycnVwdCAqLworI2RlZmluZSBESUVOX1NTSQkJMHgwOAkvKiBFbmFibGUgc2luZ2xlIHN0ZXAgaW50ZXJydXB0ICovCisjZGVmaW5lIERJRU5fU0lSCQkweDA0CS8qIEVuYWJsZSBTQ1JJUFRTIElOVCBjb21tYW5kIAorCQkJCQkgKiBpbnRlcnJ1cHQKKwkJCQkJICovCisvKiAweDAyIGlzIHJlc2VydmVkIG9uIDgwMCBzZXJpZXMgY2hpcHMgKi8KKyNkZWZpbmUgRElFTl83MDBfV1RECQkweDAyCS8qIEVuYWJsZSB3YXRjaGRvZyB0aW1lb3V0IGludGVycnVwdCAqLworI2RlZmluZSBESUVOXzcwMF9PUEMJCTB4MDEJLyogRW5hYmxlIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gCisJCQkJCSAqIGludGVycnVwdCAKKwkJCQkJICovCisjZGVmaW5lIERJRU5fODAwX0lJRAkJMHgwMQkvKiAgU2FtZSBtZWFuaW5nLCBkaWZmZXJlbnQgbmFtZSAqLyAKKworLyoKKyAqIERNQSB3YXRjaGRvZyB0aW1lciBydworICogc2V0IGluIDE2IENMSyBpbnB1dCBwZXJpb2RzLgorICovCisjZGVmaW5lIERXVF9SRUcJCQkweDNhCisKKy8qIERNQSBjb250cm9sIHJ3ICovCisjZGVmaW5lIERDTlRMX1JFRwkJMHgzYgorI2RlZmluZSBEQ05UTF83MDBfQ0YxCQkweDgwCS8qIENsb2NrIGRpdmlzb3IgYml0cyAqLworI2RlZmluZSBEQ05UTF83MDBfQ0YwCQkweDQwCisjZGVmaW5lIERDTlRMXzcwMF9DRl9NQVNLCTB4YzAKKy8qIENsb2NrIGRpdmlzb3JzIAkJCSAgIERpdmlzb3IgU0NMSyByYW5nZSAoTUhaKSAqLworI2RlZmluZSBEQ05UTF83MDBfQ0ZfMgkJMHgwMCAgICAvKiAyLjAJICAgMzcuNTEtNTAuMDAgKi8KKyNkZWZpbmUgRENOVExfNzAwX0NGXzFfNQkweDQwCS8qIDEuNQkgICAyNS4wMS0zNy41MCAqLworI2RlZmluZSBEQ05UTF83MDBfQ0ZfMQkJMHg4MAkvKiAxLjAgICAgIDE2LjY3LTI1LjAwICovCisjZGVmaW5lIERDTlRMXzcwMF9DRl8zCQkweGMwCS8qIDMuMAkgICA1MC4wMS02Ni42NyAoNTNjNzAwLTY2KSAqLworCisjZGVmaW5lIERDTlRMXzcwMF9TMTYJCTB4MjAJLyogTG9hZCBzY3JpcHRzIDE2IGJpdHMgYXQgYSB0aW1lICovCisjZGVmaW5lIERDTlRMX1NTTQkJMHgxMAkvKiBTaW5nbGUgc3RlcCBtb2RlICovCisjZGVmaW5lIERDTlRMXzcwMF9MTE0JCTB4MDgJLyogTG93IGxldmVsIG1vZGUsIGNhbiBvbmx5IGJlIHNldCAKKwkJCQkJICogYWZ0ZXIgc2VsZWN0aW9uICovCisjZGVmaW5lIERDTlRMXzgwMF9JUlFNCQkweDA4CS8qIFRvdGVtIHBvbGUgSVJRIHBpbiAqLworI2RlZmluZSBEQ05UTF9TVEQJCTB4MDQJLyogU3RhcnQgRE1BIC8gU0NSSVBUUyAqLworLyogMHgwMiBpcyByZXNlcnZlZCAqLworI2RlZmluZSBEQ05UTF8wMF9SU1QJCTB4MDEJLyogU29mdHdhcmUgcmVzZXQsIHJlc2V0cyBldmVyeXRoaW5nCisJCQkJCSAqIGJ1dCAyODYgbW9kZSBiaXQgIGluIERNT0RFLiBPbiB0aGUKKwkJCQkJICogTkNSNTNjNzEwLCB0aGlzIGJpdCBtb3ZlZCB0byBDVEVTVDgKKwkJCQkJICovCisjZGVmaW5lIERDTlRMXzEwX0NPTQkJMHgwMQkvKiA3MDAgc29mdHdhcmUgY29tcGF0aWJpbGl0eSBtb2RlICovCisjZGVmaW5lIERDTlRMXzEwX0VBCQkweDIwCS8qIEVuYWJsZSBBY2sgLSBuZWVkZWQgZm9yIE1WTUUxNnggKi8KKworI2RlZmluZSBEQ05UTF83MDBfU0FWRSAoIERDTlRMX0NGX01BU0sgfCBEQ05UTF9TMTYpCisKKworLyogTkNSNTNjNzAwLTY2IG9ubHkgKi8KKyNkZWZpbmUgU0NSQVRDSEJfUkVHXzAwCQkweDNjCS8qIHRocm91Z2ggMHgzZiBzY3JhdGNoIGIgcncgKi8KKyNkZWZpbmUgU0NSQVRDSEJfUkVHXzgwMAkweDVjCS8qIHRocm91Z2ggMHg1ZiBzY3JhdGNoIGIgcncgKi8KKy8qIE5DUjUzYzcxMCBvbmx5ICovCisjZGVmaW5lIEFEREVSX1JFR18xMAkJMHgzYwkvKiBBZGRlciwgTkNSNTNjNzEwIG9ubHkgKi8KKworI2RlZmluZSBTSUVOMV9SRUdfODAwCQkweDQxCisjZGVmaW5lIFNJRU4xXzgwMF9TVE8JCTB4MDQJLyogc2VsZWN0aW9uL3Jlc2VsZWN0aW9uIHRpbWVvdXQgKi8KKyNkZWZpbmUgU0lFTjFfODAwX0dFTgkJMHgwMgkvKiBnZW5lcmFsIHB1cnBvc2UgdGltZXIgKi8KKyNkZWZpbmUgU0lFTjFfODAwX0hUSAkJMHgwMQkvKiBoYW5kc2hha2UgdG8gaGFuZHNoYWtlICovCisKKyNkZWZpbmUgU0lTVDFfUkVHXzgwMAkJMHg0MworI2RlZmluZSBTSVNUMV84MDBfU1RPCQkweDA0CS8qIHNlbGVjdGlvbi9yZXNlbGVjdGlvbiB0aW1lb3V0ICovCisjZGVmaW5lIFNJU1QxXzgwMF9HRU4JCTB4MDIJLyogZ2VuZXJhbCBwdXJwb3NlIHRpbWVyICovCisjZGVmaW5lIFNJU1QxXzgwMF9IVEgJCTB4MDEJLyogaGFuZHNoYWtlIHRvIGhhbmRzaGFrZSAqLworCisjZGVmaW5lIFNMUEFSX1JFR184MDAJCTB4NDQJLyogUGFyaXR5ICovCisKKyNkZWZpbmUgTUFDTlRMX1JFR184MDAJCTB4NDYJLyogTWVtb3J5IGFjY2VzcyBjb250cm9sICovCisjZGVmaW5lIE1BQ05UTF84MDBfVFlQMwkJMHg4MAorI2RlZmluZSBNQUNOVExfODAwX1RZUDIJCTB4NDAKKyNkZWZpbmUgTUFDTlRMXzgwMF9UWVAxCQkweDIwCisjZGVmaW5lIE1BQ05UTF84MDBfVFlQMAkJMHgxMAorI2RlZmluZSBNQUNOVExfODAwX0RXUgkJMHgwOAorI2RlZmluZSBNQUNOVExfODAwX0RSRAkJMHgwNAorI2RlZmluZSBNQUNOVExfODAwX1BTQ1BUCTB4MDIKKyNkZWZpbmUgTUFDTlRMXzgwMF9TQ1BUUwkweDAxCisKKyNkZWZpbmUgR1BDTlRMX1JFR184MDAJCTB4NDcJLyogR2VuZXJhbCBQdXJwb3NlIFBpbiBDb250cm9sICovCisKKy8qIFRpbWVvdXRzIGFyZSBleHByZXNzZWQgc3VjaCB0aGF0IDA9b2ZmLCAxPTEwMHVzLCBkb3VibGluZyBhZnRlciB0aGF0ICovCisjZGVmaW5lIFNUSU1FMF9SRUdfODAwCQkweDQ4CS8qIFNDU0kgVGltZXIgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBTVElNRTBfODAwX0hUSF9NQVNLCTB4ZjAJLyogSGFuZHNoYWtlIHRvIEhhbmRzaGFrZSB0aW1lb3V0ICovCisjZGVmaW5lIFNUSU1FMF84MDBfSFRIX1NISUZUCTQKKyNkZWZpbmUgU1RJTUUwXzgwMF9TRUxfTUFTSwkweDBmCS8qIFNlbGVjdGlvbiB0aW1lb3V0ICovCisjZGVmaW5lIFNUSU1FMF84MDBfU0VMX1NISUZUCTAKKworI2RlZmluZSBTVElNRTFfUkVHXzgwMAkJMHg0OQorI2RlZmluZSBTVElNRTFfODAwX0dFTl9NQVNLCTB4MGYJLyogR2VuZXJhbCBwdXJwb3NlIHRpbWVyICovCisKKyNkZWZpbmUgUkVTUElEX1JFR184MDAJCTB4NGEJLyogUmVzcG9uc2UgSUQsIGJpdCBmaWVsZGVkLiAgOAorCQkJCQkgICBiaXRzIG9uIG5hcnJvdyBjaGlwcywgMTYgb24gV0lERSAqLworCisjZGVmaW5lIFNURVNUMF9SRUdfODAwCQkweDRjCQorI2RlZmluZSBTVEVTVDBfODAwX1NMVAkJMHgwOAkvKiBTZWxlY3Rpb24gcmVzcG9uc2UgbG9naWMgdGVzdCAqLworI2RlZmluZSBTVEVTVDBfODAwX0FSVAkJMHgwNAkvKiBBcmJpdHJhdGlvbiBwcmlvcml0eSBlbmNvZGVyIHRlc3QgKi8KKyNkZWZpbmUgU1RFU1QwXzgwMF9TT1oJCTB4MDIJLyogU3luY2hyb25vdXMgb2Zmc2V0IHplcm8gKi8KKyNkZWZpbmUgU1RFU1QwXzgwMF9TT00JCTB4MDEJLyogU3luY2hyb25vdXMgb2Zmc2V0IG1heGltdW0gKi8KKworI2RlZmluZSBTVEVTVDFfUkVHXzgwMAkJMHg0ZAorI2RlZmluZSBTVEVTVDFfODAwX1NDTEsJCTB4ODAJLyogRGlzYWJsZSBTQ1NJIGNsb2NrICovCisKKyNkZWZpbmUgU1RFU1QyX1JFR184MDAJCTB4NGUJCisjZGVmaW5lIFNURVNUMl84MDBfU0NFCQkweDgwCS8qIEVuYWJsZSBTT0NML1NPREwgKi8KKyNkZWZpbmUgU1RFU1QyXzgwMF9ST0YJCTB4NDAJLyogUmVzZXQgU0NTSSBzeW5jIG9mZnNldCAqLworI2RlZmluZSBTVEVTVDJfODAwX1NMQgkJMHgxMAkvKiBFbmFibGUgU0NTSSBsb29wYmFjayBtb2RlICovCisjZGVmaW5lIFNURVNUMl84MDBfU1pNCQkweDA4CS8qIFNDU0kgaGlnaCBpbXBlZGFuY2UgbW9kZSAqLworI2RlZmluZSBTVEVTVDJfODAwX0VYVAkJMHgwMgkvKiBFeHRlbmQgUkVRL0FDSyBmaWx0ZXIgMzAgdG8gNjBucyAqLworI2RlZmluZSBTVEVTVDJfODAwX0xPVwkJMHgwMQkvKiBTQ1NJIGxvdyBsZXZlbCBtb2RlICovCisKKyNkZWZpbmUgU1RFU1QzX1JFR184MDAJCTB4NGYJIAorI2RlZmluZSBTVEVTVDNfODAwX1RFCQkweDgwCS8qIEVuYWJsZSBhY3RpdmUgbmVnYXRpb24gKi8KKyNkZWZpbmUgU1RFU1QzXzgwMF9TVFIJCTB4NDAJLyogU0NTSSBGSUZPIHRlc3QgcmVhZCAqLworI2RlZmluZSBTVEVTVDNfODAwX0hTQwkJMHgyMAkvKiBIYWx0IFNDU0kgY2xvY2sgKi8KKyNkZWZpbmUgU1RFU1QzXzgwMF9EU0kJCTB4MTAJLyogRGlzYWJsZSBzaW5nbGUgaW5pdGlhdG9yIHJlc3BvbnNlICovCisjZGVmaW5lIFNURVNUM184MDBfVFRNCQkweDA0CS8qIFRpbWUgdGVzdCBtb2RlICovCisjZGVmaW5lIFNURVNUM184MDBfQ1NGCQkweDAyCS8qIENsZWFyIFNDU0kgRklGTyAqLworI2RlZmluZSBTVEVTVDNfODAwX1NUVwkJMHgwMQkvKiBTQ1NJIEZJRk8gdGVzdCB3cml0ZSAqLworCisjZGVmaW5lIE9QVElPTl9QQVJJVFkgCQkweDEJLyogRW5hYmxlIHBhcml0eSBjaGVja2luZyAqLworI2RlZmluZSBPUFRJT05fVEFHR0VEX1FVRVVFCTB4MgkvKiBFbmFibGUgU0NTSS1JSSB0YWdnZWQgcXVldWluZyAqLworI2RlZmluZSBPUFRJT05fNzAwCQkweDgJLyogQWx3YXlzIHJ1biBOQ1I1M2M3MDAgc2NyaXB0cyAqLworI2RlZmluZSBPUFRJT05fSU5URkxZCQkweDEwCS8qIFVzZSBJTlRGTFkgaW50ZXJydXB0cyAqLworI2RlZmluZSBPUFRJT05fREVCVUdfSU5UUgkweDIwCS8qIERlYnVnIGludGVycnVwdHMgKi8KKyNkZWZpbmUgT1BUSU9OX0RFQlVHX0lOSVRfT05MWQkweDQwCS8qIFJ1biBpbml0aWFsaXphdGlvbiBjb2RlIGFuZCAKKwkJCQkJICAgc2ltcGxlIHRlc3QgY29kZSwgcmV0dXJuCisJCQkJCSAgIERJRF9OT19DT05ORUNUIGlmIGFueSBTQ1NJCisJCQkJCSAgIGNvbW1hbmRzIGFyZSBhdHRlbXB0ZWQuICovCisjZGVmaW5lIE9QVElPTl9ERUJVR19SRUFEX09OTFkJMHg4MAkvKiBSZXR1cm4gRElEX0VSUk9SIGlmIGFueSAKKwkJCQkJICAgU0NTSSB3cml0ZSBpcyBhdHRlbXB0ZWQgKi8KKyNkZWZpbmUgT1BUSU9OX0RFQlVHX1RSQUNFCTB4MTAwCS8qIEFuaW1hdGVkIHRyYWNlIG1vZGUsIHByaW50IAorCQkJCQkgICBlYWNoIGFkZHJlc3MgYW5kIGluc3RydWN0aW9uIAorCQkJCQkgICBleGVjdXRlZCB0byBkZWJ1ZyBidWZmZXIuICovCisjZGVmaW5lIE9QVElPTl9ERUJVR19TSU5HTEUJMHgyMDAJLyogc3RvcCBhZnRlciBleGVjdXRpbmcgb25lIAorCQkJCQkgICBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBPUFRJT05fU1lOQ0hST05PVVMJMHg0MDAJLyogRW5hYmxlIHN5bmMgU0NTSS4gICovCisjZGVmaW5lIE9QVElPTl9NRU1PUllfTUFQUEVECTB4ODAwCS8qIE5DUiByZWdpc3RlcnMgaGF2ZSB2YWxpZCAKKwkJCQkJICAgbWVtb3J5IG1hcHBpbmcgKi8KKyNkZWZpbmUgT1BUSU9OX0lPX01BUFBFRAkweDEwMDAgIC8qIE5DUiByZWdpc3RlcnMgaGF2ZSB2YWxpZAorCQkJCQkgICAgIEkvTyBtYXBwaW5nICovCisjZGVmaW5lIE9QVElPTl9ERUJVR19QUk9CRV9PTkxZCTB4MjAwMCAgLyogUHJvYmUgb25seSwgZG9uJ3QgZXZlbiBpbml0ICovCisjZGVmaW5lIE9QVElPTl9ERUJVR19URVNUU19PTkxZCTB4NDAwMCAgLyogUHJvYmUsIGluaXQsIHJ1biBzZWxlY3RlZCB0ZXN0cyAqLworI2RlZmluZSBPUFRJT05fREVCVUdfVEVTVDAJMHgwODAwMCAvKiBSdW4gdGVzdCAwICovCisjZGVmaW5lIE9QVElPTl9ERUJVR19URVNUMQkweDEwMDAwIC8qIFJ1biB0ZXN0IDEgKi8KKyNkZWZpbmUgT1BUSU9OX0RFQlVHX1RFU1QyCTB4MjAwMDAgLyogUnVuIHRlc3QgMiAqLworI2RlZmluZSBPUFRJT05fREVCVUdfRFVNUAkweDQwMDAwIC8qIER1bXAgY29tbWFuZHMgKi8KKyNkZWZpbmUgT1BUSU9OX0RFQlVHX1RBUkdFVF9MSU1JVCAweDgwMDAwIC8qIE9ubHkgdGFsayB0byB0YXJnZXQrbHVucyBzcGVjaWZpZWQgKi8KKyNkZWZpbmUgT1BUSU9OX0RFQlVHX05DT01NQU5EU19MSU1JVCAweDEwMDAwMCAvKiBMaW1pdCB0aGUgbnVtYmVyIG9mIGNvbW1hbmRzICovCisjZGVmaW5lIE9QVElPTl9ERUJVR19TQ1JJUFQgMHgyMDAwMDAgLyogUHJpbnQgd2hlbiBjaGVja3BvaW50cyBhcmUgcGFzc2VkICovCisjZGVmaW5lIE9QVElPTl9ERUJVR19GSVhVUCAweDQwMDAwMCAvKiBwcmludCBmaXh1cCB2YWx1ZXMgKi8KKyNkZWZpbmUgT1BUSU9OX0RFQlVHX0RTQSAweDgwMDAwMAorI2RlZmluZSBPUFRJT05fREVCVUdfQ09SUlVQVElPTgkweDEwMDAwMDAJLyogRGV0ZWN0IHNjcmlwdCBjb3JydXB0aW9uICovCisjZGVmaW5lIE9QVElPTl9ERUJVR19TRFRSICAgICAgIDB4MjAwMDAwMAkvKiBEZWJ1ZyBTRFRSIHByb2JsZW0gKi8KKyNkZWZpbmUgT1BUSU9OX0RFQlVHX01JU01BVENIIAkweDQwMDAwMDAgCS8qIERlYnVnIHBoYXNlIG1pc21hdGNoZXMgKi8KKyNkZWZpbmUgT1BUSU9OX0RJU0NPTk5FQ1QJMHg4MDAwMDAwCS8qIEFsbG93IGRpc2Nvbm5lY3QgKi8KKyNkZWZpbmUgT1BUSU9OX0RFQlVHX0RJU0NPTk5FQ1QgMHgxMDAwMDAwMAkKKyNkZWZpbmUgT1BUSU9OX0FMV0FZU19TWU5DSFJPTk9VUyAweDIwMDAwMDAwCS8qIE5lZ290aWF0ZSBzeW5jLiB0cmFuc2ZlcnMKKwkJCQkJCSAgIG9uIHBvd2VyIHVwICovCisjZGVmaW5lIE9QVElPTl9ERUJVR19RVUVVRVMJMHg4MDAwMDAwMAkKKyNkZWZpbmUgT1BUSU9OX0RFQlVHX0FMTE9DQVRJT04gMHgxMDAwMDAwMDBMTAorI2RlZmluZSBPUFRJT05fREVCVUdfU1lOQ0hST05PVVMgMHgyMDAwMDAwMDBMTAkvKiBTYW5pdHkgY2hlY2sgU1hGRVIgYW5kIAorCQkJCQkJICAgU0NOVEwzIHJlZ2lzdGVycyAqLworI2RlZmluZSBPUFRJT05fTk9fQVNZTkMJMHg0MDAwMDAwMDBMTAkJLyogRG9uJ3QgYXV0b21hZ2ljYWxseSBzZW5kCisJCQkJCQkgICBTRFRSIGZvciBhc3luYyB0cmFuc2ZlcnMgd2hlbgorCQkJCQkJICAgd2UgaGF2ZW4ndCBiZWVuIHRvbGQgdG8gZG8KKwkJCQkJCSAgIGEgc3luY2hyb25vdXMgdHJhbnNmZXIuICovCisjZGVmaW5lIE9QVElPTl9OT19QUklOVF9SQUNFIDB4ODAwMDAwMDAwTEwJLyogRG9uJ3QgcHJpbnQgbWVzc2FnZSB3aGVuCisJCQkJCQkgICB0aGUgcmVzZWxlY3QvV0FJVCBESVNDT05ORUNUCisJCQkJCQkgICByYWNlIGNvbmRpdGlvbiBoaXRzICovCisjaWYgIWRlZmluZWQoUEVSTV9PUFRJT05TKQorI2RlZmluZSBQRVJNX09QVElPTlMgMAorI2VuZGlmCisJCQkJCisvKgorICogU29tZSBkYXRhIHdoaWNoIGlzIGFjY2Vzc2VkIGJ5IHRoZSBOQ1IgY2hpcCBtdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLgorICogRm9yIHNvbWUgaG9zdHMgdGhlIGRlZmF1bHQgaXMgbGVzcyB0aGFuIHRoYXQgKGVnLiA2OEsgdXNlcyAyLWJ5dGUpLgorICogQWxpZ25tZW50IGhhcyBvbmx5IGJlZW4gZm9yY2VkIHdoZXJlIGl0IGlzIGltcG9ydGFudDsgYWxzbyBpZiBvbmUKKyAqIDMyIGJpdCBzdHJ1Y3R1cmUgZmllbGQgaXMgYWxpZ25lZCB0aGVuIGl0IGlzIGFzc3VtZWQgdGhhdCBmb2xsb3dpbmcKKyAqIDMyIGJpdCBmaWVsZHMgYXJlIGFsc28gYWxpZ25lZC4gIFRha2UgY2FyZSB3aGVuIGFkZGluZyBmaWVsZHMKKyAqIHdoaWNoIGFyZSBvdGhlciB0aGFuIDMyIGJpdC4KKyAqLworCitzdHJ1Y3QgTkNSNTNjN3gwX3N5bmNocm9ub3VzIHsKKyAgICB1MzIgc2VsZWN0X2luZGlyZWN0CQkJLyogVmFsdWUgdXNlZCBmb3IgaW5kaXJlY3Qgc2VsZWN0aW9uICovCisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7CisgICAgdTMyIHNzY2ZfNzEwOwkJCS8qIFVzZWQgdG8gc2V0IFNTQ0YgYml0cyBmb3IgNzEwICovCisgICAgdTMyIHNjcmlwdFs4XTsJCQkvKiBTaXplID8/IFNjcmlwdCB1c2VkIHdoZW4gdGFyZ2V0IGlzIAorCQkJCQkJcmVzZWxlY3RlZCAqLworICAgIHVuc2lnbmVkIGNoYXIgc3luY2hyb25vdXNfd2FudFs1XTsJLyogUGVyIHRhcmdldCBkZXNpcmVkIFNEVFIgKi8KKy8qIAorICogU2V0X3N5bmNocm9ub3VzIHByb2dyYW1zIHRoZXNlLCBzZWxlY3RfaW5kaXJlY3QgYW5kIGN1cnJlbnQgc2V0dGluZ3MgYWZ0ZXIKKyAqIGludF9kZWJ1Z19zaG91bGQgc2hvdyBhIG1hdGNoLgorICovCisgICAgdW5zaWduZWQgY2hhciBzeGZlcl9zYW5pdHksIHNjbnRsM19zYW5pdHk7Cit9OworCisjZGVmaW5lIENNRF9GTEFHX1NEVFIgCQkxCS8qIEluaXRpYXRpbmcgc3luY2hyb25vdXMgCisJCQkJCSAgIHRyYW5zZmVyIG5lZ290aWF0aW9uICovCisjZGVmaW5lIENNRF9GTEFHX1dEVFIJCTIJLyogSW5pdGlhdGluZyB3aWRlIHRyYW5zZmVyCisJCQkJCSAgIG5lZ290aWF0aW9uICovCisjZGVmaW5lIENNRF9GTEFHX0RJRF9TRFRSCTQJLyogZGlkIFNEVFIgKi8KKyNkZWZpbmUgQ01EX0ZMQUdfRElEX1dEVFIJOAkvKiBkaWQgV0RUUiAqLworCitzdHJ1Y3QgTkNSNTNjN3gwX3RhYmxlX2luZGlyZWN0IHsKKyAgICB1MzIgY291bnQ7CisgICAgdm9pZCAqYWRkcmVzczsKK307CisKK2VudW0gbmNyX2V2ZW50IHsgCisgICAgRVZFTlRfTk9ORSA9IDAsCisvKiAKKyAqIE9yZGVyIGlzIElNUE9SVEFOVCwgc2luY2UgdGhlc2UgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBldmVudCBpbnRlcnJ1cHRzCisgKiBpbiA1M2M3LDh4eC5zY3IgCisgKi8KKworICAgIEVWRU5UX0lTU1VFX1FVRVVFID0gMHg1MDAwMDAwLAkvKiAwIENvbW1hbmQgd2FzIGFkZGVkIHRvIGlzc3VlIHF1ZXVlICovCisgICAgRVZFTlRfU1RBUlRfUVVFVUUsCQkJLyogMSBDb21tYW5kIG1vdmVkIHRvIHN0YXJ0IHF1ZXVlICovCisgICAgRVZFTlRfU0VMRUNULAkJCS8qIDIgQ29tbWFuZCBjb21wbGV0ZWQgc2VsZWN0aW9uICovCisgICAgRVZFTlRfRElTQ09OTkVDVCwJCQkvKiAzIENvbW1hbmQgZGlzY29ubmVjdGVkICovCisgICAgRVZFTlRfUkVTRUxFQ1QsCQkJLyogNCBDb21tYW5kIHJlc2VsZWN0ZWQgKi8KKyAgICBFVkVOVF9DT01QTEVURSwJCSAgICAgICAgLyogNSBDb21tYW5kIGNvbXBsZXRlZCAqLworICAgIEVWRU5UX0lETEUsCQkJCS8qIDYgKi8KKyAgICBFVkVOVF9TRUxFQ1RfRkFJTEVELAkJLyogNyAqLworICAgIEVWRU5UX0JFRk9SRV9TRUxFQ1QsCQkvKiA4ICovCisgICAgRVZFTlRfUkVTRUxFQ1RfRkFJTEVECQkvKiA5ICovCit9OworCitzdHJ1Y3QgTkNSNTNjN3gwX2V2ZW50IHsKKyAgICBlbnVtIG5jcl9ldmVudCBldmVudDsJLyogV2hhdCB0eXBlIG9mIGV2ZW50ICovCisgICAgdW5zaWduZWQgY2hhciB0YXJnZXQ7CisgICAgdW5zaWduZWQgY2hhciBsdW47CisgICAgc3RydWN0IHRpbWV2YWwgdGltZTsJCisgICAgdTMyICpkc2E7CQkJLyogV2hhdCdzIGluIHRoZSBEU0EgcmVnaXN0ZXIgbm93ICh2aXJ0KSAqLworLyogCisgKiBBIGZldyB0aGluZ3MgZnJvbSB0aGF0IFNDU0kgcGlkIHNvIHdlIGtub3cgd2hhdCBoYXBwZW5lZCBhZnRlciAKKyAqIHRoZSBTY3NpX0NtbmQgc3RydWN0dXJlIGluIHF1ZXN0aW9uIG1heSBoYXZlIGRpc2FwcGVhcmVkLgorICovCisgICAgdW5zaWduZWQgbG9uZyBwaWQ7CQkvKiBUaGUgU0NTSSBQSUQgd2hpY2ggY2F1c2VkIHRoaXMgCisJCQkJICAgZXZlbnQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGNtbmRbMTJdOworfTsKKworLyoKKyAqIFRoaW5ncyBpbiB0aGUgTkNSNTNjN3gwX2NtZCBzdHJ1Y3R1cmUgYXJlIHNwbGl0IGludG8gdHdvIHBhcnRzIDoKKyAqCisgKiAxLiAgQSBmaXhlZCBwb3J0aW9uLCBmb3IgdGhpbmdzIHdoaWNoIGFyZSBub3QgYWNjZXNzZWQgZGlyZWN0bHkgYnkgc3RhdGljIE5DUgorICoJY29kZSAoaWUsIGFyZSByZWZlcmVuY2VkIG9ubHkgYnkgdGhlIExpbnV4IHNpZGUgb2YgdGhlIGRyaXZlciwKKyAqCW9yIG9ubHkgYnkgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIGNvZGUpLiAgCisgKgorICogMi4gIFRoZSBEU0EgcG9ydGlvbiwgZm9yIHRoaW5ncyB3aGljaCBhcmUgYWNjZXNzZWQgZGlyZWN0bHkgYnkgc3RhdGljIE5DUgorICoJY29kZS4KKyAqCisgKiBUaGlzIGlzIGEgbGl0dGxlIHVnbHksIGJ1dCBpdCAKKyAqIDEuICBBdm9pZHMgY29uZmxpY3RzIGJldHdlZW4gdGhlIE5DUiBjb2RlJ3MgcGljdHVyZSBvZiB0aGUgc3RydWN0dXJlLCBhbmQgCisgKiAJTGludXggY29kZSdzIGlkZWEgb2Ygd2hhdCBpdCBsb29rcyBsaWtlLgorICoKKyAqIDIuICBNaW5pbWl6ZXMgdGhlIHBhaW4gaW4gdGhlIExpbnV4IHNpZGUgb2YgdGhlIGNvZGUgbmVlZGVkIAorICogCXRvIGNhbGN1bGF0ZSByZWFsIGRzYSBsb2NhdGlvbnMgZm9yIHRoaW5ncywgZXRjLgorICogCisgKi8KKworc3RydWN0IE5DUjUzYzd4MF9jbWQgeworICAgIHZvaWQgKnJlYWw7CQkJCS8qIFJlYWwsIHVuYWxpZ25lZCBhZGRyZXNzIGZvcgorCQkJCQkgICBmcmVlIGZ1bmN0aW9uICovCisgICAgdm9pZCAoKiBmcmVlKSh2b2lkICosIGludCk7CQkvKiBDb21tYW5kIHRvIGRlYWxsb2NhdGU7IE5VTEwKKwkJCQkJICAgZm9yIHN0cnVjdHVyZXMgYWxsb2NhdGVkIHdpdGgKKwkJCQkJICAgc2NzaV9yZWdpc3RlciwgZXRjLiAqLworICAgIFNjc2lfQ21uZCAqY21kOwkJCS8qIEFzc29jaWF0ZWQgU2NzaV9DbW5kIAorCQkJCQkgICBzdHJ1Y3R1cmUsIFNjc2lfQ21uZCBwb2ludHMKKwkJCQkJICAgYXQgTkNSNTNjN3gwX2NtZCB1c2luZyAKKwkJCQkJICAgaG9zdF9zY3JpYmJsZSBzdHJ1Y3R1cmUgKi8KKworICAgIGludCBzaXplOwkJCQkvKiBzY3NpX21hbGxvYydkIHNpemUgb2YgdGhpcyAKKwkJCQkJICAgc3RydWN0dXJlICovCisKKyAgICBpbnQgZmxhZ3M7CQkJCS8qIENNRF8qIGZsYWdzICovCisKKyAgICB1bnNpZ25lZCBjaGFyICAgICAgY21uZFsxMl07CS8qIENEQiwgY29waWVkIGZyb20gU2NzaV9DbW5kICovCisgICAgaW50ICAgICAgICAgICAgICAgIHJlc3VsdDsJCS8qIENvcHkgdG8gU2NzaV9DbW5kIHdoZW4gZG9uZSAqLworCisgICAgc3RydWN0IHsJCQkJLyogUHJpdmF0ZSBub24tY2FjaGVkIGJvdW5jZSBidWZmZXIgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciBidWZbMjU2XTsKKwl1MzIJICAgICAgYWRkcjsKKyAgICAgICAgdTMyICAgICAgICAgICBsZW47CisgICAgfSBib3VuY2U7CisKKy8qCisgKiBTRFRSIGFuZCBXSURFIG1lc3NhZ2VzIGFyZSBhbiBlaXRoZXIvb3IgYWZmYWlyCisgKiBpbiB0aGlzIG1lc3NhZ2UsIHNpbmNlIHdlIHdpbGwgZ28gaW50byBtZXNzYWdlIG91dCBhbmQgc2VuZAorICogX3RoZSB3aG9sZSBtZXNzXyB3aXRob3V0IGRyb3BwaW5nIG91dCBvZiBtZXNzYWdlIG91dCB0byAKKyAqIGxldCB0aGUgdGFyZ2V0IGdvIGludG8gbWVzc2FnZSBpbiBhZnRlciBzZW5kaW5nIHRoZSBmaXJzdCAKKyAqIG1lc3NhZ2UuCisgKi8KKworICAgIHVuc2lnbmVkIGNoYXIgc2VsZWN0WzExXTsJCS8qIFNlbGVjdCBtZXNzYWdlLCBpbmNsdWRlcworCQkJCQkgICBJREVOVElGWQorCQkJCQkgICAob3B0aW9uYWwpIFFVRVVFIFRBRworIAkJCQkgCSAgIChvcHRpb25hbCkgU0RUUiBvciBXRFRSCisJCQkJCSAqLworCisKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqbmV4dDsgLyogTGludXggbWFpbnRhaW5lZCBsaXN0cyAoZnJlZSwKKwkJCQkJICAgIHJ1bm5pbmcsIGV2ZW50dWFsbHkgZmluaXNoZWQgKi8KKyAgICAJCQkJCSAKKworICAgIHUzMiAqZGF0YV90cmFuc2Zlcl9zdGFydDsJCS8qIFN0YXJ0IG9mIGRhdGEgdHJhbnNmZXIgcm91dGluZXMgKi8KKyAgICB1MzIgKmRhdGFfdHJhbnNmZXJfZW5kOwkJLyogQWRkcmVzcyBhZnRlciBlbmQgb2YgZGF0YSB0cmFuc2ZlciBvCisgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgcm91dGluZXMgKi8KKy8qIAorICogVGhlIGZvbGxvd2luZyB0aHJlZSBmaWVsZHMgd2VyZSBtb3ZlZCBmcm9tIHRoZSBEU0EgcHJvcGVyIHRvIGhlcmUKKyAqIHNpbmNlIG9ubHkgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIE5DUiBjb2RlIHJlZmVycyB0byB0aGVtLCBtZWFuaW5nCisgKiB3ZSBkb24ndCBuZWVkIGRzYV8qIGFic29sdXRlcywgYW5kIGl0IGlzIHNpbXBsZXIgdG8gbGV0IHRoZSAKKyAqIGhvc3QgY29kZSByZWZlciB0byB0aGVtIGRpcmVjdGx5LgorICovCisKKy8qIAorICogSEFSRCBDT0RFRCA6IHJlc2lkdWFsIGFuZCBzYXZlZF9yZXNpZHVhbCBuZWVkIHRvIGFncmVlIHdpdGggdGhlIHNpemVzCisgKiB1c2VkIGluIE5DUjUzYzcsOHh4LnNjci4gIAorICogCisgKiBGSVhNRTogd2Ugd2FudCB0byBjb25zaWRlciB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIG9kZC1sZW5ndGggCisgKglzY2F0dGVyL2dhdGhlciBidWZmZXJzIGFuZCBhIFdJREUgdHJhbnNmZXIsIGluIHdoaWNoIGNhc2UgCisgKgl3ZSdsbCBuZWVkIHRvIHVzZSB0aGUgQ0hBSU4gTU9WRSBpbnN0cnVjdGlvbi4gIEljay4KKyAqLworICAgIHUzMiByZXNpZHVhbFs2XSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsKKwkJCQkJLyogUmVzaWR1YWwgZGF0YSB0cmFuc2ZlciB3aGljaAorCQkJCQkgICBhbGxvd3MgcG9pbnRlciBjb2RlIHRvIHdvcmsKKwkJCQkJICAgcmlnaHQuCisKKyAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgWzAtMV0gOiBDb25kaXRpb25hbCBjYWxsIHRvIAorICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJYXBwcm9wcmlhdGUgb3RoZXIgdHJhbnNmZXIgCisgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAlyb3V0aW5lLgorICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBbMi0zXSA6IFJlc2lkdWFsIGJsb2NrIHRyYW5zZmVyCisgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAlpbnN0cnVjdGlvbi4KKyAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgWzQtNV0gOiBKdW1wIHRvIGluc3RydWN0aW9uCisgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAlhZnRlciBzcGxpY2UuCisJCQkJCSAqLworICAgIHUzMiBzYXZlZF9yZXNpZHVhbFs2XTsgCQkvKiBDb3B5IG9mIG9sZCByZXNpZHVhbCwgc28gd2UgCisJCQkJCSAgIGNhbiBnZXQgYW5vdGhlciBwYXJ0aWFsIAorCQkJCQkgICB0cmFuc2ZlciBhbmQgc3RpbGwgcmVjb3ZlciAKKyAgICAJICAgIAkgICAgCSAgICAJICAgIAkgKi8KKyAgICAJICAgIAkKKyAgICB1MzIgc2F2ZWRfZGF0YV9wb2ludGVyOwkJLyogU2F2ZWQgZGF0YSBwb2ludGVyICovCisKKyAgICB1MzIgZHNhX25leHRfYWRkcjsJCSAgICAgICAgLyogX0FkZHJlc3NfIG9mIGRzYV9uZXh0IGZpZWxkICAKKwkJCQkJICAgaW4gdGhpcyBkc2EgZm9yIFJJU0N5IAorCQkJCQkgICBzdHlsZSBjb25zdGFudC4gKi8KKworICAgIHUzMiBkc2FfYWRkcjsJCQkvKiBBZGRyZXNzIG9mIGRzYTsgUklTQ3kgc3R5bGUKKwkJCQkJICAgY29uc3RhbnQgKi8KKworICAgIHUzMiBkc2FbMF07CQkJCS8qIFZhcmlhYmxlIGxlbmd0aCAoZGVwZW5kaW5nCisJCQkJCSAgIG9uIGhvc3QgdHlwZSwgbnVtYmVyIG9mIHNjYXR0ZXIgLworCQkJCQkgICBnYXRoZXIgYnVmZmVycywgZXRjKS4gICovCit9OworCitzdHJ1Y3QgTkNSNTNjN3gwX2JyZWFrIHsKKyAgICB1MzIgKmFkZHJlc3MsIG9sZF9pbnN0cnVjdGlvblsyXTsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2JyZWFrICpuZXh0OworICAgIHVuc2lnbmVkIGNoYXIgb2xkX3NpemU7CQkvKiBTaXplIG9mIG9sZCBpbnN0cnVjdGlvbiAqLworfTsKKworLyogSW5kaWNhdGVzIHRoYXQgdGhlIE5DUiBpcyBub3QgZXhlY3V0aW5nIGNvZGUgKi8KKyNkZWZpbmUgU1RBVEVfSEFMVEVECTAJCQorLyogCisgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgTkNSIGlzIGV4ZWN1dGluZyB0aGUgd2FpdCBmb3Igc2VsZWN0IC8gcmVzZWxlY3QgCisgKiBzY3JpcHQuICBPbmx5IHVzZWQgd2hlbiBydW5uaW5nIE5DUjUzYzcwMCBjb21wYXRpYmxlIHNjcmlwdHMsIG9ubHkgCisgKiBzdGF0ZSBkdXJpbmcgd2hpY2ggYW4gQUJPUlQgaXMgX25vdF8gY29uc2lkZXJlZCBhbiBlcnJvciBjb25kaXRpb24uCisgKi8KKyNkZWZpbmUgU1RBVEVfV0FJVElORwkxCQkKKy8qIEluZGljYXRlcyB0aGF0IHRoZSBOQ1IgaXMgZXhlY3V0aW5nIG90aGVyIGNvZGUuICovCisjZGVmaW5lIFNUQVRFX1JVTk5JTkcJMgkJCisvKiAKKyAqIEluZGljYXRlcyB0aGF0IHRoZSBOQ1Igd2FzIGJlaW5nIGFib3J0ZWQuCisgKi8KKyNkZWZpbmUgU1RBVEVfQUJPUlRJTkcJMworLyogSW5kaWNhdGVzIHRoYXQgdGhlIE5DUiB3YXMgc3VjY2Vzc2Z1bGx5IGFib3J0ZWQuICovCisjZGVmaW5lIFNUQVRFX0FCT1JURUQgNAorLyogSW5kaWNhdGVzIHRoYXQgdGhlIE5DUiBoYXMgYmVlbiBkaXNhYmxlZCBkdWUgdG8gYSBmYXRhbCBlcnJvciAqLworI2RlZmluZSBTVEFURV9ESVNBQkxFRCA1CisKKy8qIAorICogV2hlcmUga25vd2xlZGdlIG9mIFNDU0kgU0NSSVBUKHRtKSBzcGVjaWZpZWQgdmFsdWVzIGFyZSBuZWVkZWQgCisgKiBpbiBhbiBpbnRlcnJ1cHQgaGFuZGxlciwgYW4gaW50ZXJydXB0IGhhbmRsZXIgZXhpc3RzIGZvciBlYWNoIAorICogZGlmZmVyZW50IFNDU0kgc2NyaXB0IHNvIHdlIGRvbid0IGhhdmUgbmFtZSBzcGFjZSBwcm9ibGVtcy4KKyAqIAorICogUmV0dXJuIHZhbHVlcyBvZiB0aGVzZSBoYW5kbGVycyBhcmUgYXMgZm9sbG93cyA6IAorICovCisjZGVmaW5lIFNQRUNJRklDX0lOVF9OT1RISU5HIAkwCS8qIGRvbid0IGV2ZW4gcmVzdGFydCAqLworI2RlZmluZSBTUEVDSUZJQ19JTlRfUkVTVEFSVAkxCS8qIHJlc3RhcnQgYXQgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgU1BFQ0lGSUNfSU5UX0FCT1JUCTIJLyogcmVjb3ZlcmFibGUgZXJyb3IsIGFib3J0IGNtZCAqLworI2RlZmluZSBTUEVDSUZJQ19JTlRfUEFOSUMJMwkvKiB1bnJlY292ZXJhYmxlIGVycm9yLCBwYW5pYyAqLworI2RlZmluZSBTUEVDSUZJQ19JTlRfRE9ORQk0CS8qIG5vcm1hbCBjb21tYW5kIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgU1BFQ0lGSUNfSU5UX0JSRUFLCTUJLyogYnJlYWsgcG9pbnQgZW5jb3VudGVyZWQgKi8KKworc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSB7CisgICAgaW50IHNpemU7CQkJCS8qIFNpemUgb2YgZW50aXJlIFNjc2lfSG9zdAorCQkJCQkgICBzdHJ1Y3R1cmUgKi8KKyAgICBpbnQgYm9hcmQ7CQkJCS8qIHNldCB0byBib2FyZCB0eXBlLCB1c2VmdWwgaWYgCisJCQkJCSAgIHdlIGhhdmUgaG9zdCBzcGVjaWZpYyB0aGluZ3MsCisJCQkJCSAgIGllLCBhIGdlbmVyYWwgcHVycG9zZSBJL08gCisJCQkJCSAgIGJpdCBpcyBiZWluZyB1c2VkIHRvIGVuYWJsZQorCQkJCQkgICB0ZXJtaW5hdGlvbiwgZXRjLiAqLworCisgICAgaW50IGNoaXA7CQkJCS8qIHNldCB0byBjaGlwIHR5cGU7IDcwMC02NiBpcworCQkJCQkgICA3MDAtNjYsIHJlc3QgYXJlIGxhc3QgdGhyZWUKKwkJCQkJICAgZGlnaXRzIG9mIHBhcnQgbnVtYmVyICovCisKKyAgICBjaGFyIHZhbGlkX2lkc1s4XTsJCQkvKiBWYWxpZCBTQ1NJIElEJ3MgZm9yIGFkYXB0ZXIgKi8KKworICAgIHUzMiAqZHNwOwkJCQkvKiBkc3AgdG8gcmVzdGFydCB3aXRoIGFmdGVyCisJCQkJCSAgIGFsbCBzdGFja2VkIGludGVycnVwdHMgYXJlCisJCQkJCSAgIGhhbmRsZWQuICovCisKKyAgICB1bnNpZ25lZCBkc3BfY2hhbmdlZDoxOwkJLyogSGFzIGRzcCBjaGFuZ2VkIHdpdGhpbiB0aGlzCisJCQkJCSAgIHNldCBvZiBzdGFja2VkIGludGVycnVwdHMgPyAqLworCisgICAgdW5zaWduZWQgY2hhciBkc3RhdDsJCS8qIE1vc3QgcmVjZW50IHZhbHVlIG9mIGRzdGF0ICovCisgICAgdW5zaWduZWQgZHN0YXRfdmFsaWQ6MTsKKworICAgIHVuc2lnbmVkIGV4cGVjdGluZ19paWQ6MTsJCS8qIEV4cGVjdCBJSUQgaW50ZXJydXB0ICovCisgICAgdW5zaWduZWQgZXhwZWN0aW5nX3N0bzoxOwkJLyogRXhwZWN0IFNUTyBpbnRlcnJ1cHQgKi8KKyAgICAKKyAgICAvKiAKKyAgICAgKiBUaGUgY29kZSBzdGF5cyBjbGVhbmVyIGlmIHdlIHVzZSB2YXJpYWJsZXMgd2l0aCBmdW5jdGlvbgorICAgICAqIHBvaW50ZXJzIGFuZCBvZmZzZXRzIHRoYXQgYXJlIHVuaXF1ZSBmb3IgdGhlIGRpZmZlcmVudAorICAgICAqIHNjcmlwdHMgcmF0aGVyIHRoYW4gaGF2aW5nIGEgc2xldyBvZiBzd2l0Y2goaG9zdGRhdGEtPmNoaXApIAorICAgICAqIHN0YXRlbWVudHMuCisgICAgICogCisgICAgICogSXQgYWxzbyBtZWFucyB0aGF0IHRoZSAjZGVmaW5lcyBmcm9tIHRoZSBTQ1NJIFNDUklQVFModG0pCisgICAgICogZG9uJ3QgaGF2ZSB0byBiZSB2aXNpYmxlIG91dHNpZGUgb2YgdGhlIHNjcmlwdC1zcGVjaWZpYworICAgICAqIGluc3RydWN0aW9ucywgcHJldmVudGluZyBuYW1lIHNwYWNlIHBvbGx1dGlvbi4KKyAgICAgKi8KKworICAgIHZvaWQgKCogaW5pdF9maXh1cCkoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CisgICAgdm9pZCAoKiBpbml0X3NhdmVfcmVncykoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CisgICAgdm9pZCAoKiBkc2FfZml4dXApKHN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQpOworICAgIHZvaWQgKCogc29mdF9yZXNldCkoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CisgICAgaW50ICgqIHJ1bl90ZXN0cykoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CisKKyAgICAvKgorICAgICAqIENhbGxlZCB3aGVuIERTVEFUX1NJUiBpcyBzZXQsIGluZGljYXRpbmcgYW4gaW50ZXJydXB0IGdlbmVyYXRlZAorICAgICAqIGJ5IHRoZSBJTlQgaW5zdHJ1Y3Rpb24sIHdoZXJlIHZhbHVlcyBhcmUgdW5pcXVlIGZvciBlYWNoIFNDU0kKKyAgICAgKiBzY3JpcHQuICBTaG91bGQgcmV0dXJuIG9uZSBvZiB0aGUgU1BFQ18qIHZhbHVlcy4KKyAgICAgKi8KKworICAgIGludCAoKiBkc3RhdF9zaXJfaW50cikoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgc3RydWN0IE5DUjUzYzd4MF9jbWQgKmNtZCk7CisKKyAgICBpbnQgZHNhX2xlbjsgLyogU2l6ZSBvZiBEU0Egc3RydWN0dXJlICovCisKKyAgICAvKgorICAgICAqIExvY2F0aW9uIG9mIERTQSBmaWVsZHMgZm9yIHRoZSBTQ1NJIFNDUklQVCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgCisgICAgICogY2hpcC4gIAorICAgICAqLworCisgICAgczMyIGRzYV9zdGFydDsJCQkKKyAgICBzMzIgZHNhX2VuZDsJCQkKKyAgICBzMzIgZHNhX25leHQ7CisgICAgczMyIGRzYV9wcmV2OworICAgIHMzMiBkc2FfY21uZDsKKyAgICBzMzIgZHNhX3NlbGVjdDsKKyAgICBzMzIgZHNhX21zZ291dDsKKyAgICBzMzIgZHNhX2NtZG91dDsKKyAgICBzMzIgZHNhX2RhdGFvdXQ7CisgICAgczMyIGRzYV9kYXRhaW47CisgICAgczMyIGRzYV9tc2dpbjsKKyAgICBzMzIgZHNhX21zZ291dF9vdGhlcjsKKyAgICBzMzIgZHNhX3dyaXRlX3N5bmM7CisgICAgczMyIGRzYV93cml0ZV9yZXN1bWU7CisgICAgczMyIGRzYV9jaGVja19yZXNlbGVjdDsKKyAgICBzMzIgZHNhX3N0YXR1czsKKyAgICBzMzIgZHNhX3NhdmVkX3BvaW50ZXI7CisgICAgczMyIGRzYV9qdW1wX2Rlc3Q7CisKKyAgICAvKiAKKyAgICAgKiBJbXBvcnRhbnQgZW50cnkgcG9pbnRzIHRoYXQgZ2VuZXJpYyBmaXh1cCBjb2RlIG5lZWRzCisgICAgICogdG8ga25vdyBhYm91dCwgZml4ZWQgdXAuCisgICAgICovCisKKyAgICBzMzIgRV9hY2NlcHRfbWVzc2FnZTsKKyAgICBzMzIgRV9jb21tYW5kX2NvbXBsZXRlOwkJCisgICAgczMyIEVfZGF0YV90cmFuc2ZlcjsKKyAgICBzMzIgRV9kc2FfY29kZV90ZW1wbGF0ZTsKKyAgICBzMzIgRV9kc2FfY29kZV90ZW1wbGF0ZV9lbmQ7CisgICAgczMyIEVfZW5kX2RhdGFfdHJhbnNmZXI7CisgICAgczMyIEVfbXNnX2luOworICAgIHMzMiBFX2luaXRpYXRvcl9hYm9ydDsKKyAgICBzMzIgRV9vdGhlcl90cmFuc2ZlcjsKKyAgICBzMzIgRV9vdGhlcl9pbjsKKyAgICBzMzIgRV9vdGhlcl9vdXQ7CisgICAgczMyIEVfdGFyZ2V0X2Fib3J0OworICAgIHMzMiBFX2RlYnVnX2JyZWFrOwkKKyAgICBzMzIgRV9yZWplY3RfbWVzc2FnZTsKKyAgICBzMzIgRV9yZXNwb25kX21lc3NhZ2U7CisgICAgczMyIEVfc2VsZWN0OworICAgIHMzMiBFX3NlbGVjdF9tc2dvdXQ7CisgICAgczMyIEVfdGVzdF8wOworICAgIHMzMiBFX3Rlc3RfMTsKKyAgICBzMzIgRV90ZXN0XzI7CisgICAgczMyIEVfdGVzdF8zOworICAgIHMzMiBFX2RzYV96ZXJvOworICAgIHMzMiBFX2NtZG91dF9jbWRvdXQ7CisgICAgczMyIEVfd2FpdF9yZXNlbGVjdDsKKyAgICBzMzIgRV9kc2FfY29kZV9iZWdpbjsKKworICAgIGxvbmcgbG9uZyBvcHRpb25zOwkJCS8qIEJpdGZpZWxkZWQgc2V0IG9mIG9wdGlvbnMgZW5hYmxlZCAqLworICAgIHZvbGF0aWxlIHUzMiB0ZXN0X2NvbXBsZXRlZDsJLyogVGVzdCBjb21wbGV0ZWQgKi8KKyAgICBpbnQgdGVzdF9ydW5uaW5nOwkJCS8qIFRlc3QgY3VycmVudGx5IHJ1bm5pbmcgKi8KKyAgICBzMzIgdGVzdF9zb3VyY2UKKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsKKyAgICB2b2xhdGlsZSBzMzIgdGVzdF9kZXN0OworCisgICAgdm9sYXRpbGUgaW50IHN0YXRlOwkJCS8qIHN0YXRlIG9mIGRyaXZlciwgb25seSB1c2VkIGZvciAKKwkJCQkJICAgT1BUSU9OXzcwMCAqLworCisgICAgdW5zaWduZWQgY2hhciAgZG1vZGU7CQkvKiAKKwkJCQkJICogc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBETU9ERSAKKwkJCQkJICogcmVnaXN0ZXIgZm9yIHRoaXMgY2hpcC4KKwkJCQkJICovCisgICAgdW5zaWduZWQgY2hhciBpc3RhdDsJCS8qIAorICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAqIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgSVNUQVQgCisgICAgCSAgICAJICAgIAkgICAgCSAgICAJICogcmVnaXN0ZXIgZm9yIHRoaXMgY2hpcC4KKyAgICAJICAgIAkgICAgCSAgICAJICAgIAkgKi8KKyAgCisgICAgaW50IHNjc2lfY2xvY2s7CQkJLyogCisJCQkJCSAqIFNDU0kgY2xvY2sgaW4gSFouIDAgbWF5IGJlIHVzZWQgCisJCQkJCSAqIGZvciB1bmtub3duLCBhbHRob3VnaCB0aGlzIHdpbGwKKwkJCQkJICogZGlzYWJsZSBzeW5jaHJvbm91cyBuZWdvdGlhdGlvbi4KKwkJCQkJICovCisKKyAgICB2b2xhdGlsZSBpbnQgaW50cnM7CQkJLyogTnVtYmVyIG9mIGludGVycnVwdHMgKi8KKyAgICB2b2xhdGlsZSBpbnQgcmVzZXRzOwkJLyogTnVtYmVyIG9mIFNDU0kgcmVzZXRzICovCisgICAgdW5zaWduZWQgY2hhciBzYXZlZF9kbW9kZTsJCisgICAgdW5zaWduZWQgY2hhciBzYXZlZF9jdGVzdDQ7CisgICAgdW5zaWduZWQgY2hhciBzYXZlZF9jdGVzdDc7CisgICAgdW5zaWduZWQgY2hhciBzYXZlZF9kY250bDsKKyAgICB1bnNpZ25lZCBjaGFyIHNhdmVkX3NjbnRsMzsKKworICAgIHVuc2lnbmVkIGNoYXIgdGhpc19pZF9tYXNrOworCisgICAgLyogRGVidWdnZXIgaW5mb3JtYXRpb24gKi8KKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2JyZWFrICpicmVha3BvaW50cywgLyogTGlua2VkIGxpc3Qgb2YgYWxsIGJyZWFrIHBvaW50cyAqLworCSpicmVha3BvaW50X2N1cnJlbnQ7CQkvKiBDdXJyZW50IGJyZWFrcG9pbnQgYmVpbmcgc3RlcHBlZCAKKwkJCQkJICAgdGhyb3VnaCwgTlVMTCBpZiB3ZSBhcmUgcnVubmluZyAKKwkJCQkJICAgbm9ybWFsbHkuICovCisjaWZkZWYgTkNSX0RFQlVHCisgICAgaW50IGRlYnVnX3NpemU7CQkJLyogU2l6ZSBvZiBkZWJ1ZyBidWZmZXIgKi8KKyAgICB2b2xhdGlsZSBpbnQgZGVidWdfY291bnQ7CQkvKiBDdXJyZW50IGRhdGEgY291bnQgKi8KKyAgICB2b2xhdGlsZSBjaGFyICpkZWJ1Z19idWY7CQkvKiBPdXRwdXQgcmluZyBidWZmZXIgKi8KKyAgICB2b2xhdGlsZSBjaGFyICpkZWJ1Z193cml0ZTsJCS8qIEN1cnJlbnQgd3JpdGUgcG9pbnRlciAqLworICAgIHZvbGF0aWxlIGNoYXIgKmRlYnVnX3JlYWQ7CQkvKiBDdXJyZW50IHJlYWQgcG9pbnRlciAqLworI2VuZGlmIC8qIGRlZiBOQ1JfREVCVUcgKi8KKworICAgIC8qIFhYWCAtIHByaW1pdGl2ZSBkZWJ1Z2dpbmcganVuaywgcmVtb3ZlIHdoZW4gd29ya2luZyA/ICovCisgICAgaW50IGRlYnVnX3ByaW50X2xpbWl0OwkJLyogTnVtYmVyIG9mIGNvbW1hbmRzIHRvIHByaW50CisJCQkJCSAgIG91dCBleGhhdXN0aXZlIGRlYnVnZ2luZworCQkJCQkgICBpbmZvcm1hdGlvbiBmb3IgaWYgCisJCQkJCSAgIE9QVElPTl9ERUJVR19EVU1QIGlzIHNldCAqLyAKKworICAgIHVuc2lnbmVkIGNoYXIgZGVidWdfbHVuX2xpbWl0WzE2XTsJLyogSWYgT1BUSU9OX0RFQlVHX1RBUkdFVF9MSU1JVAorCQkJCQkgICBzZXQsIHB1a2UgaWYgY29tbWFuZHMgYXJlIHNlbnQKKwkJCQkJICAgdG8gb3RoZXIgdGFyZ2V0L2x1biBjb21iaW5hdGlvbnMgKi8KKworICAgIGludCBkZWJ1Z19jb3VudF9saW1pdDsJCS8qIE51bWJlciBvZiBjb21tYW5kcyB0byBleGVjdXRlCisJCQkJCSAgIGJlZm9yZSBwdWtpbmcgdG8gbGltaXQgZGVidWdnaW5nIAorCQkJCQkgICBvdXRwdXQgKi8KKwkJCQkgICAgCisKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBpZGxlOjE7CQkJLyogc2V0IHRvIDEgaWYgaWRsZSAqLworCisgICAgLyogCisgICAgICogVGFibGUgb2Ygc3luY2hyb25vdXMrd2lkZSB0cmFuc2ZlciBwYXJhbWV0ZXJzIHNldCBvbiBhIHBlci10YXJnZXQKKyAgICAgKiBiYXNpcy4KKyAgICAgKi8KKyAgICAKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgTkNSNTNjN3gwX3N5bmNocm9ub3VzIHN5bmNbMTZdCisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7CisKKyAgICB2b2xhdGlsZSBTY3NpX0NtbmQgKmlzc3VlX3F1ZXVlCisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7CisJCQkJCQkvKiB3YWl0aW5nIHRvIGJlIGlzc3VlZCBieQorCQkJCQkJICAgTGludXggZHJpdmVyICovCisgICAgdm9sYXRpbGUgc3RydWN0IE5DUjUzYzd4MF9jbWQgKnJ1bm5pbmdfbGlzdDsJCisJCQkJCQkvKiBjb21tYW5kcyBydW5uaW5nLCBtYWludGFpbmVkCisJCQkJCQkgICBieSBMaW51eCBkcml2ZXIgKi8KKworICAgIHZvbGF0aWxlIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpuY3JjdXJyZW50OwkvKiBjdXJyZW50bHkgY29ubmVjdGVkIAorCQkJCQkJICAgbmV4dXMsIE9OTFkgdmFsaWQgZm9yCisJCQkJCQkgICBOQ1I1M2M3MDAvTkNSNTNjNzAwLTY2CisJCQkJCQkgKi8KKworICAgIHZvbGF0aWxlIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpzcGFyZTsJLyogcG9pbnRlciB0byBzcGFyZSwKKyAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgIGFsbG9jYXRlZCBhdCBwcm9iZSB0aW1lLAorICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgd2hpY2ggd2UgY2FuIHVzZSBmb3IgCisJCQkJCQkgICBpbml0aWFsaXphdGlvbiAqLworICAgIHZvbGF0aWxlIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpmcmVlOworICAgIGludCBtYXhfY21kX3NpemU7CQkJCS8qIE1heGltdW0gc2l6ZSBvZiBOQ1I1M2M3eDBfY21kCisJCQkJCSAgICAJICAgYmFzZWQgb24gbnVtYmVyIG9mIAorCQkJCQkJICAgc2NhdHRlci9nYXRoZXIgc2VnbWVudHMsIGV0Yy4KKwkJCQkJCSAgICovCisgICAgdm9sYXRpbGUgaW50IG51bV9jbWRzOwkJCS8qIE51bWJlciBvZiBjb21tYW5kcyAKKwkJCQkJCSAgIGFsbG9jYXRlZCAqLworICAgIHZvbGF0aWxlIGludCBleHRyYV9hbGxvY2F0ZTsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGNtZF9hbGxvY2F0ZWRbMTZdOwkvKiBIYXZlIHdlIGFsbG9jYXRlZCBjb21tYW5kcworCQkJCQkJICAgZm9yIHRoaXMgdGFyZ2V0IHlldD8gIElmIG5vdCwKKwkJCQkJCSAgIGRvIHNvIEFTQVAgKi8KKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGJ1c3lbMTZdWzhdOyAgICAgCS8qIG51bWJlciBvZiBjb21tYW5kcyAKKwkJCQkJCSAgIGV4ZWN1dGluZyBvbiBlYWNoIHRhcmdldAorICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICovCisgICAgLyogCisgICAgICogRXZlbnR1YWxseSwgSSdsbCBzd2l0Y2ggdG8gYSBjb3JvdXRpbmUgZm9yIGNhbGxpbmcgCisgICAgICogY21kLT5kb25lKGNtZCksIGV0Yy4gc28gdGhhdCB3ZSBjYW4gb3ZlcmxhcCBpbnRlcnJ1cHQKKyAgICAgKiBwcm9jZXNzaW5nIHdpdGggdGhpcyBjb2RlIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlLgorICAgICAqLworICAgIAorICAgIHZvbGF0aWxlIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpmaW5pc2hlZF9xdWV1ZTsJCisJCQkJCQkKKyAgICAvKiBTaGFyZWQgdmFyaWFibGVzIGJldHdlZW4gU0NSSVBUIGFuZCBob3N0IGRyaXZlciAqLworICAgIHZvbGF0aWxlIHUzMiAqc2NoZWR1bGUKKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsJCS8qIEFycmF5IG9mIEpVTVBzIHRvIGRzYV9iZWdpbgorCQkJCQkJICAgcm91dGluZXMgb2YgdmFyaW91cyBEU0FzLiAgCisJCQkJCQkgICBXaGVuIG5vdCBpbiB1c2UsIHJlcGxhY2UKKwkJCQkJCSAgIHdpdGgganVtcCB0byBuZXh0IHNsb3QgKi8KKworCisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBtc2dfYnVmWzE2XTsJCS8qIGJ1ZmZlciBmb3IgbWVzc2FnZXMKKwkJCQkJCSAgIG90aGVyIHRoYW4gdGhlIGNvbW1hbmQKKwkJCQkJCSAgIGNvbXBsZXRlIG1lc3NhZ2UgKi8KKworICAgIC8qIFBlci10YXJnZXQgZGVmYXVsdCBzeW5jaHJvbm91cyBhbmQgV0lERSBtZXNzYWdlcyAqLworICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgc3luY2hyb25vdXNfd2FudFsxNl1bNV07CisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciB3aWRlX3dhbnRbMTZdWzRdOworCisgICAgLyogQml0IGZpZWxkZWQgc2V0IG9mIHRhcmdldHMgd2Ugd2FudCB0byBzcGVhayBzeW5jaHJvbm91c2x5IHdpdGggKi8gCisgICAgdm9sYXRpbGUgdTE2IGluaXRpYXRlX3NkdHI7CQorICAgIC8qIEJpdCBmaWVsZGVkIHNldCBvZiB0YXJnZXRzIHdlIHdhbnQgdG8gc3BlYWsgd2lkZSB3aXRoICovCisgICAgdm9sYXRpbGUgdTE2IGluaXRpYXRlX3dkdHI7CisgICAgLyogQml0IGZpZWxkZWQgbGlzdCBvZiB0YXJnZXRzIHdlJ3ZlIHRhbGtlZCB0by4gKi8KKyAgICB2b2xhdGlsZSB1MTYgdGFsa2VkX3RvOworCisgICAgLyogQXJyYXkgb2YgYml0LWZpZWxkZWQgbHVuIGxpc3RzIHRoYXQgd2UgbmVlZCB0byByZXF1ZXN0X3NlbnNlICovCisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciByZXF1ZXN0X3NlbnNlWzE2XTsKKworICAgIHUzMiBhZGRyX3JlY29ubmVjdF9kc2FfaGVhZAorCV9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpOwkJLyogUklTQ3kgc3R5bGUgY29uc3RhbnQsCisJCQkJCQkgICBhZGRyZXNzIG9mIGZvbGxvd2luZyAqLworICAgIHZvbGF0aWxlIHUzMiByZWNvbm5lY3RfZHNhX2hlYWQ7CQorICAgIC8qIERhdGEgaWRlbnRpZnlpbmcgbmV4dXMgd2UgYXJlIHRyeWluZyB0byBtYXRjaCBkdXJpbmcgcmVzZWxlY3Rpb24gKi8KKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHJlc2VsZWN0ZWRfaWRlbnRpZnk7IC8qIElERU5USUZZIG1lc3NhZ2UgKi8KKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHJlc2VsZWN0ZWRfdGFnOwkvKiBzZWNvbmQgYnl0ZSBvZiBxdWV1ZSB0YWcgCisJCQkJCQkgICBtZXNzYWdlIG9yIDAgKi8KKworICAgIC8qIFRoZXNlIHdlcmUgc3RhdGljIHZhcmlhYmxlcyBiZWZvcmUgd2UgbW92ZWQgdGhlbSAqLworCisgICAgczMyIE5DUjUzYzd4eF96ZXJvCisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7CisgICAgczMyIE5DUjUzYzd4eF9zaW5rOworICAgIHUzMiBOT1BfaW5zbjsKKyAgICBjaGFyIE5DUjUzYzd4eF9tc2dfcmVqZWN0OworICAgIGNoYXIgTkNSNTNjN3h4X21zZ19hYm9ydDsKKyAgICBjaGFyIE5DUjUzYzd4eF9tc2dfbm9wOworCisgICAgLyoKKyAgICAgKiBGb2xsb3dpbmcgaXRlbSBpbnRyb2R1Y2VkIGJ5IFJHSCB0byBzdXBwb3J0IE5DUmM3MTAsIHdoaWNoIGlzCisgICAgICogVkVSWSBicmFpbi1kZWFkIHdoZW4gaXQgY29tZSB0byBtZW1vcnkgbW92ZXMKKyAgICAgKi8KKworCQkJICAvKiBEU0Egc2F2ZSBhcmVhIHVzZWQgb25seSBieSB0aGUgTkNSIGNoaXAgKi8KKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHNhdmVkMl9kc2EKKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsKKworICAgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgZW11bGF0ZWRfaW50Zmx5CisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7CisKKyAgICB2b2xhdGlsZSBpbnQgZXZlbnRfc2l6ZSwgZXZlbnRfaW5kZXg7CisgICAgdm9sYXRpbGUgc3RydWN0IE5DUjUzYzd4MF9ldmVudCAqZXZlbnRzOworCisgICAgLyogSWYgd2UgbmVlZCB0byBnZW5lcmF0ZSBjb2RlIHRvIGtpbGwgb2ZmIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIAorICAgICAgIGNvbW1hbmQsIHRoaXMgaXMgd2hlcmUgd2UgZG8gaXQuIFNob3VsZCBoYXZlIGEgQk1JIGluc3RydWN0aW9uCisgICAgICAgdG8gc291cmNlIG9yIHNpbmsgdGhlIGN1cnJlbnQgZGF0YSwgZm9sbG93ZWQgYnkgYSBKVU1QCisgICAgICAgdG8gYWJvcnRfY29ubmVjdGVkICovCisKKyAgICB1MzIgKmFib3J0X3NjcmlwdDsKKworICAgIGludCBzY3JpcHRfY291bnQ7CQkJCS8qIFNpemUgb2Ygc2NyaXB0IGluIHdvcmRzICovCisgICAgdTMyIHNjcmlwdFswXTsJCQkJLyogUmVsb2NhdGVkIFNDU0kgc2NyaXB0ICovCisKK307CisKKyNkZWZpbmUgU0NTSV9JUlFfTk9ORQkyNTUKKyNkZWZpbmUgRE1BX05PTkUJMjU1CisjZGVmaW5lIElSUV9BVVRPCTI1NAorI2RlZmluZSBETUFfQVVUTwkyNTQKKworI2RlZmluZSBCT0FSRF9HRU5FUklDCTAKKworI2RlZmluZSBOQ1I1M2M3eDBfaW5zbl9zaXplKGluc24pCQkJCQlcCisgICAgKCgoaW5zbikgJiBEQ01EX1RZUEVfTUFTSykgPT0gRENNRF9UWVBFX01NSSA/IDMgOiAyKQorICAgIAorCisjZGVmaW5lIE5DUjUzYzd4MF9sb2NhbF9kZWNsYXJlKCkJCQkJCVwKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpOQ1I1M2M3eDBfYWRkcmVzc19tZW1vcnk7CQkJXAorICAgIHVuc2lnbmVkIGludCBOQ1I1M2M3eDBfYWRkcmVzc19pbzsJCQkJCVwKKyAgICBpbnQgTkNSNTNjN3gwX21lbW9yeV9tYXBwZWQKKworI2RlZmluZSBOQ1I1M2M3eDBfbG9jYWxfc2V0dXAoaG9zdCkJCQkJCVwKKyAgICBOQ1I1M2M3eDBfYWRkcmVzc19tZW1vcnkgPSAodm9pZCAqKSAoaG9zdCktPmJhc2U7CQkJXAorICAgIE5DUjUzYzd4MF9hZGRyZXNzX2lvID0gKHVuc2lnbmVkIGludCkgKGhvc3QpLT5pb19wb3J0OwkJXAorICAgIE5DUjUzYzd4MF9tZW1vcnlfbWFwcGVkID0gKChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopIAkJXAorCWhvc3QtPmhvc3RkYXRhWzBdKS0+IG9wdGlvbnMgJiBPUFRJT05fTUVNT1JZX01BUFBFRCAKKworI2lmZGVmIEJJR19FTkRJQU4KKy8qIFRoZXNlIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50LCBnaXZlbiB0aGF0IHdlIGFyZSBhbHdheXMgbWVtb3J5IG1hcHBlZCwKKyAqIGJ1dCB0aGV5IGRvbid0IGdpdmUgdGhlIHNhbWUgcHJvYmxlbXMgYXMgdGhlIHdyaXRlIG1hY3Jvcywgc28gbGVhdmUKKyAqIHRoZW0uICovCisjaWZkZWYgX19tYzY4MDAwX18KKyNkZWZpbmUgTkNSNTNjN3gwX3JlYWQ4KGFkZHJlc3MpIAkJCQkJXAorICAgICgodW5zaWduZWQgaW50KXJhd19pbmIoKHUzMilOQ1I1M2M3eDBfYWRkcmVzc19tZW1vcnkgKyAoKHUzMikoYWRkcmVzcyleMykpICkKKworI2RlZmluZSBOQ1I1M2M3eDBfcmVhZDE2KGFkZHJlc3MpIAkJCQkJXAorICAgICgodW5zaWduZWQgaW50KXJhd19pbncoKHUzMilOQ1I1M2M3eDBfYWRkcmVzc19tZW1vcnkgKyAoKHUzMikoYWRkcmVzcyleMikpKQorI2Vsc2UKKyNkZWZpbmUgTkNSNTNjN3gwX3JlYWQ4KGFkZHJlc3MpIAkJCQkJXAorICAgIChOQ1I1M2M3eDBfbWVtb3J5X21hcHBlZCA/IAkJCQkJCVwKKwkodW5zaWduZWQgaW50KXJlYWRiKCh1MzIpTkNSNTNjN3gwX2FkZHJlc3NfbWVtb3J5ICsgKCh1MzIpKGFkZHJlc3MpXjMpKSA6CVwKKwlpbmIoTkNSNTNjN3gwX2FkZHJlc3NfaW8gKyAoYWRkcmVzcykpKQorCisjZGVmaW5lIE5DUjUzYzd4MF9yZWFkMTYoYWRkcmVzcykgCQkJCQlcCisgICAgKE5DUjUzYzd4MF9tZW1vcnlfbWFwcGVkID8gCQkJCQkJXAorCSh1bnNpZ25lZCBpbnQpcmVhZHcoKHUzMilOQ1I1M2M3eDBfYWRkcmVzc19tZW1vcnkgKyAoKHUzMikoYWRkcmVzcyleMikpIDoJXAorCWludyhOQ1I1M2M3eDBfYWRkcmVzc19pbyArIChhZGRyZXNzKSkpCisjZW5kaWYgLyogbWM2ODAwMCAqLworI2Vsc2UKKyNkZWZpbmUgTkNSNTNjN3gwX3JlYWQ4KGFkZHJlc3MpIAkJCQkJXAorICAgIChOQ1I1M2M3eDBfbWVtb3J5X21hcHBlZCA/IAkJCQkJCVwKKwkodW5zaWduZWQgaW50KXJlYWRiKCh1MzIpTkNSNTNjN3gwX2FkZHJlc3NfbWVtb3J5ICsgKHUzMikoYWRkcmVzcykpIDoJXAorCWluYihOQ1I1M2M3eDBfYWRkcmVzc19pbyArIChhZGRyZXNzKSkpCisKKyNkZWZpbmUgTkNSNTNjN3gwX3JlYWQxNihhZGRyZXNzKSAJCQkJCVwKKyAgICAoTkNSNTNjN3gwX21lbW9yeV9tYXBwZWQgPyAJCQkJCQlcCisJKHVuc2lnbmVkIGludClyZWFkdygodTMyKU5DUjUzYzd4MF9hZGRyZXNzX21lbW9yeSArICh1MzIpKGFkZHJlc3MpKSA6CVwKKwlpbncoTkNSNTNjN3gwX2FkZHJlc3NfaW8gKyAoYWRkcmVzcykpKQorI2VuZGlmCisKKyNpZmRlZiBfX21jNjgwMDBfXworI2RlZmluZSBOQ1I1M2M3eDBfcmVhZDMyKGFkZHJlc3MpIAkJCQkJXAorICAgICgodW5zaWduZWQgaW50KSByYXdfaW5sKCh1MzIpTkNSNTNjN3gwX2FkZHJlc3NfbWVtb3J5ICsgKHUzMikoYWRkcmVzcykpKQorI2Vsc2UKKyNkZWZpbmUgTkNSNTNjN3gwX3JlYWQzMihhZGRyZXNzKSAJCQkJCVwKKyAgICAoTkNSNTNjN3gwX21lbW9yeV9tYXBwZWQgPyAJCQkJCQlcCisJKHVuc2lnbmVkIGludCkgcmVhZGwoKHUzMilOQ1I1M2M3eDBfYWRkcmVzc19tZW1vcnkgKyAodTMyKShhZGRyZXNzKSkgOiAJXAorCWlubChOQ1I1M2M3eDBfYWRkcmVzc19pbyArIChhZGRyZXNzKSkpCisjZW5kaWYgLyogbWM2ODAwMCovCisKKyNpZmRlZiBCSUdfRU5ESUFOCisvKiBJZiB3ZSBhcmUgYmlnLWVuZGlhbiwgdGhlbiB3ZSBhcmUgbm90IEludGVsLCBzbyBwcm9iYWJseSBkb24ndCBoYXZlCisgKiBhbiBpL28gbWFwIGFzIHdlbGwgYXMgYSBtZW1vcnkgbWFwLiAgU28sIGxldCdzIGFzc3VtZSBtZW1vcnkgbWFwcGVkLgorICogQWxzbywgSSBhbSBoYXZpbmcgdGVycmlibGUgcHJvYmxlbXMgdHJ5aW5nIHRvIHBlcnN1YWRlIHRoZSBjb21waWxlcgorICogbm90IHRvIGxheSBkb3duIGNvZGUgd2hpY2ggZG9lcyBhIHJlYWQgYWZ0ZXIgd3JpdGUgZm9yIHRoZXNlIG1hY3Jvcy4KKyAqIElmIHlvdSByZW1vdmUgJ3ZvbGF0aWxlJyBmcm9tIHdyaXRlYigpIGFuZCBmcmllbmRzIGl0IGlzIG9rLi4uLgorICovCisKKyNkZWZpbmUgTkNSNTNjN3gwX3dyaXRlOChhZGRyZXNzLHZhbHVlKSAJCQkJXAorCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKQkJCQkJXAorCQkoKHUzMilOQ1I1M2M3eDBfYWRkcmVzc19tZW1vcnkgKyAoKHUzMikoYWRkcmVzcyleMykpID0gKHZhbHVlKQorCisjZGVmaW5lIE5DUjUzYzd4MF93cml0ZTE2KGFkZHJlc3MsdmFsdWUpIAkJCQlcCisJKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKQkJCQkJXAorCQkoKHUzMilOQ1I1M2M3eDBfYWRkcmVzc19tZW1vcnkgKyAoKHUzMikoYWRkcmVzcyleMikpID0gKHZhbHVlKQorCisjZGVmaW5lIE5DUjUzYzd4MF93cml0ZTMyKGFkZHJlc3MsdmFsdWUpIAkJCQlcCisJKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopCQkJCQlcCisJCSgodTMyKU5DUjUzYzd4MF9hZGRyZXNzX21lbW9yeSArICgodTMyKShhZGRyZXNzKSkpID0gKHZhbHVlKQorCisjZWxzZQorCisjZGVmaW5lIE5DUjUzYzd4MF93cml0ZTgoYWRkcmVzcyx2YWx1ZSkgCQkJCVwKKyAgICAoTkNSNTNjN3gwX21lbW9yeV9tYXBwZWQgPyAJCQkJCQlcCisgICAgICh7d3JpdGViKCh2YWx1ZSksICh1MzIpTkNSNTNjN3gwX2FkZHJlc3NfbWVtb3J5ICsgKHUzMikoYWRkcmVzcykpOyBtYigpO30pIDoJXAorCW91dGIoKHZhbHVlKSwgTkNSNTNjN3gwX2FkZHJlc3NfaW8gKyAoYWRkcmVzcykpKQorCisjZGVmaW5lIE5DUjUzYzd4MF93cml0ZTE2KGFkZHJlc3MsdmFsdWUpIAkJCQlcCisgICAgKE5DUjUzYzd4MF9tZW1vcnlfbWFwcGVkID8gCQkJCQkJXAorICAgICAoe3dyaXRldygodmFsdWUpLCAodTMyKU5DUjUzYzd4MF9hZGRyZXNzX21lbW9yeSArICh1MzIpKGFkZHJlc3MpKTsgbWIoKTt9KSA6CVwKKwlvdXR3KCh2YWx1ZSksIE5DUjUzYzd4MF9hZGRyZXNzX2lvICsgKGFkZHJlc3MpKSkKKworI2RlZmluZSBOQ1I1M2M3eDBfd3JpdGUzMihhZGRyZXNzLHZhbHVlKSAJCQkJXAorICAgIChOQ1I1M2M3eDBfbWVtb3J5X21hcHBlZCA/IAkJCQkJCVwKKyAgICAgKHt3cml0ZWwoKHZhbHVlKSwgKHUzMilOQ1I1M2M3eDBfYWRkcmVzc19tZW1vcnkgKyAodTMyKShhZGRyZXNzKSk7IG1iKCk7fSkgOglcCisJb3V0bCgodmFsdWUpLCBOQ1I1M2M3eDBfYWRkcmVzc19pbyArIChhZGRyZXNzKSkpCisKKyNlbmRpZgorCisvKiBQYXRjaCBhcmJpdHJhcnkgMzIgYml0IHdvcmRzIGluIHRoZSBzY3JpcHQgKi8KKyNkZWZpbmUgcGF0Y2hfYWJzXzMyKHNjcmlwdCwgb2Zmc2V0LCBzeW1ib2wsIHZhbHVlKQkJCVwKKyAgICAJZm9yIChpID0gMDsgaSA8IChzaXplb2YgKEFfIyNzeW1ib2wjI191c2VkKSAvIHNpemVvZiAJCVwKKyAgICAJICAgICh1MzIpKTsgKytpKSB7CQkJCQlcCisJICAgIChzY3JpcHQpW0FfIyNzeW1ib2wjI191c2VkW2ldIC0gKG9mZnNldCldICs9ICh2YWx1ZSk7CVwKKwkgICAgaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX0ZJWFVQKSAJCVwKKwkgICAgICBwcmludGsoInNjc2klZCA6ICVzIHJlZmVyZW5jZSAlZCBhdCAweCV4IGluICVzIGlzIG5vdyAweCV4XG4iLFwKKwkJaG9zdC0+aG9zdF9ubywgI3N5bWJvbCwgaSwgQV8jI3N5bWJvbCMjX3VzZWRbaV0gLSAJXAorCQkoaW50KShvZmZzZXQpLCAjc2NyaXB0LCAoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXSAtCVwKKwkJKG9mZnNldCldKTsJCQkJCQlcCisgICAgCX0KKworLyogUGF0Y2ggcmVhZC93cml0ZSBpbnN0cnVjdGlvbiBpbW1lZGlhdGUgZmllbGQgKi8KKyNkZWZpbmUgcGF0Y2hfYWJzX3J3cmlfZGF0YShzY3JpcHQsIG9mZnNldCwgc3ltYm9sLCB2YWx1ZSkJCVwKKyAgICAJZm9yIChpID0gMDsgaSA8IChzaXplb2YgKEFfIyNzeW1ib2wjI191c2VkKSAvIHNpemVvZiAJCVwKKyAgICAJICAgICh1MzIpKTsgKytpKQkJCQkJXAorICAgIAkgICAgKHNjcmlwdClbQV8jI3N5bWJvbCMjX3VzZWRbaV0gLSAob2Zmc2V0KV0gPQkJCVwKKwkgICAgCSgoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXSAtIChvZmZzZXQpXSAmIAkJXAorCSAgICAJfkRCQ19SV1JJX0lNTUVESUFURV9NQVNLKSB8IAkJCQlcCisgICAgCSAgICAJKCgodmFsdWUpIDw8IERCQ19SV1JJX0lNTUVESUFURV9TSElGVCkgJgkJXAorCQkgREJDX1JXUklfSU1NRURJQVRFX01BU0spCisKKy8qIFBhdGNoIHRyYW5zZmVyIGNvbnRyb2wgaW5zdHJ1Y3Rpb24gZGF0YSBmaWVsZCAqLworI2RlZmluZSBwYXRjaF9hYnNfdGNpX2RhdGEoc2NyaXB0LCBvZmZzZXQsIHN5bWJvbCwgdmFsdWUpCSAgICAgICAgXAorICAgIAlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZiAoQV8jI3N5bWJvbCMjX3VzZWQpIC8gc2l6ZW9mIAkJXAorICAgIAkgICAgKHUzMikpOyArK2kpCQkJCQlcCisgICAgCSAgICAoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXSAtIChvZmZzZXQpXSA9CQkJXAorCSAgICAJKChzY3JpcHQpW0FfIyNzeW1ib2wjI191c2VkW2ldIC0gKG9mZnNldCldICYgCQlcCisJICAgIAl+REJDX1RDSV9EQVRBX01BU0spIHwgCQkJCQlcCisgICAgCSAgICAJKCgodmFsdWUpIDw8IERCQ19UQ0lfREFUQV9TSElGVCkgJgkJCVwKKwkJIERCQ19UQ0lfREFUQV9NQVNLKQorCisvKiBQYXRjaCBmaWVsZCBpbiBkc2Egc3RydWN0dXJlIChhc3NpZ25tZW50IHNob3VsZCBiZSArPT8pICovCisjZGVmaW5lIHBhdGNoX2RzYV8zMihkc2EsIHN5bWJvbCwgd29yZCwgdmFsdWUpCQkJCVwKKwl7CQkJCQkJCQlcCisJKGRzYSlbKGhvc3RkYXRhLT4jI3N5bWJvbCAtIGhvc3RkYXRhLT5kc2Ffc3RhcnQpIC8gc2l6ZW9mKHUzMikJXAorCSAgICArICh3b3JkKV0gPSAodmFsdWUpOwkJCQkJXAorCWlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19EU0EpCQkJXAorCSAgICBwcmludGsoInNjc2kgOiBkc2EgJXMgc3ltYm9sICVzKCVkKSB3b3JkICVkIG5vdyAweCV4XG4iLAlcCisJCSNkc2EsICNzeW1ib2wsIGhvc3RkYXRhLT4jI3N5bWJvbCwgCQkJXAorCQkod29yZCksICh1MzIpICh2YWx1ZSkpOwkJCQkJXAorCX0KKworLyogUGFyYW5vaWQgcGVvcGxlIGNvdWxkIHVzZSBwYW5pYygpIGhlcmUuICovCisjZGVmaW5lIEZBVEFMKGhvc3QpIHNodXRkb3duKChob3N0KSk7CisKK2V4dGVybiBpbnQgbmNyNTNjN3h4X2luaXQoU2NzaV9Ib3N0X1RlbXBsYXRlICp0cG50LCBpbnQgYm9hcmQsIGludCBjaGlwLAorCQkJICB1bnNpZ25lZCBsb25nIGJhc2UsIGludCBpb19wb3J0LCBpbnQgaXJxLCBpbnQgZG1hLAorCQkJICBsb25nIGxvbmcgb3B0aW9ucywgaW50IGNsb2NrKTsKKworI2VuZGlmIC8qIE5DUjUzYzcxMF9DICovCisjZW5kaWYgLyogTkNSNTNjNzEwX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS81M2M3eHguc2NyIGIvZHJpdmVycy9zY3NpLzUzYzd4eC5zY3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1Njk0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS81M2M3eHguc2NyCkBAIC0wLDAgKzEsMTU5MSBAQAorI3VuZGVmIERFQlVHCisjdW5kZWYgRVZFTlRTCisjdW5kZWYgTk9fU0VMRUNUSU9OX1RJTUVPVVQKKyNkZWZpbmUgQklHX0VORElBTgorCis7IDUzYzcxMCBkcml2ZXIuICBNb2RpZmllZCBmcm9tIERyZXcgRWNraGFyZHRzIGRyaXZlcgorOyBmb3IgNTNjODEwIGJ5IFJpY2hhcmQgSGlyc3QgW3JpY2hhcmRAc2xlZXBpZS5kZW1vbi5jby51a10KKzsKKzsgSSBoYXZlIGxlZnQgdGhlIHNjcmlwdCBmb3IgdGhlIDUzYzh4eCBmYW1pbHkgaW4gaGVyZSwgYXMgaXQgaXMgbGlrZWx5Cis7IHRvIGJlIHVzZWZ1bCB0byBzZWUgd2hhdCBJIGNoYW5nZWQgd2hlbiBidWcgaHVudGluZy4KKworOyBOQ1IgNTNjODEwIGRyaXZlciwgbWFpbiBzY3JpcHQKKzsgU3BvbnNvcmVkIGJ5IAorOwlpWCBNdWx0aXVzZXIgTXVsdGl0YXNraW5nIE1hZ2F6aW5lCis7CWhtQGl4LmRlCis7Cis7IENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk1IERyZXcgRWNraGFyZHQKKzsgICAgICBWaXNpb25hcnkgQ29tcHV0aW5nIAorOyAgICAgIChVbml4IGFuZCBMaW51eCBjb25zdWx0aW5nIGFuZCBjdXN0b20gcHJvZ3JhbW1pbmcpCis7ICAgICAgZHJld0BQb29oU3RpY2tzLk9SRworOyAgICAgICsxICgzMDMpIDc4Ni03OTc1Cis7Cis7IFRvbGVyQU5UIGFuZCBTQ1NJIFNDUklQVFMgYXJlIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBOQ1IgQ29ycG9yYXRpb24uCis7Cis7IFBSRS1BTFBIQQorOworOyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCis7Cis7IE5DUiA1M0M4MTAKKzsgUENJLVNDU0kgSS9PIFByb2Nlc3NvcgorOyBEYXRhIE1hbnVhbAorOworOyBOQ1IgNTNDNzEwIAorOyBTQ1NJIEkvTyBQcm9jZXNzb3IKKzsgUHJvZ3JhbW1lcnMgR3VpZGUKKzsKKzsgTkNSIE1pY3JvZWxlY3Ryb25pY3MKKzsgMTYzNSBBZXJvcGxhemEgRHJpdmUKKzsgQ29sb3JhZG8gU3ByaW5ncywgQ08gODA5MTYKKzsgMSsgKDcxOSkgNTc4LTM0MDAKKzsKKzsgVG9sbCBmcmVlIGxpdGVyYXR1cmUgbnVtYmVyCis7ICsxICg4MDApIDMzNC01NDU0Cis7Cis7IElNUE9SVEFOVCA6IFRoaXMgY29kZSBpcyBzZWxmIG1vZGlmeWluZyBkdWUgdG8gdGhlIGxpbWl0YXRpb25zIG9mIAorOwl0aGUgTkNSNTNjNyw4eHggc2VyaWVzIGNoaXBzLiAgUGVyc29ucyBkZWJ1Z2dpbmcgdGhpcyBjb2RlIHdpdGgKKzsJdGhlIHJlbW90ZSBkZWJ1Z2dlciBzaG91bGQgdGFrZSB0aGlzIGludG8gYWNjb3VudCwgYW5kIE5PVCBzZXQKKzsJYnJlYWtwb2ludHMgaW4gbW9kaWZpZWQgaW5zdHJ1Y3Rpb25zLgorOworOyBEZXNpZ246Cis7IFRoZSBOQ1I1M2M3LDh4eCBmYW1pbHkgb2YgU0NTSSBjaGlwcyBhcmUgYnVzbWFzdGVycyB3aXRoIGFuIG9uYm9hcmQgCis7IG1pY3JvY29udHJvbGxlciB1c2luZyBhIHNpbXBsZSBpbnN0cnVjdGlvbiBzZXQuICAgCis7Cis7IFNvLCB0byBtaW5pbWl6ZSB0aGUgZWZmZWN0cyBvZiBpbnRlcnJ1cHQgbGF0ZW5jeSwgYW5kIHRvIG1heGltaXplIAorOyB0aHJvdWdocHV0LCB0aGlzIGRyaXZlciBvZmZsb2FkcyB0aGUgcHJhY3RpY2FsIG1heGltdW0gYW1vdW50IAorOyBvZiBwcm9jZXNzaW5nIHRvIHRoZSBTQ1NJIGNoaXAgd2hpbGUgc3RpbGwgbWFpbnRhaW5pbmcgYSBjb21tb24KKzsgc3RydWN0dXJlLgorOworOyBXaGVyZSB0cmFkZW9mZnMgd2VyZSBuZWVkZWQgYmV0d2VlbiBlZmZpY2llbmN5IG9uIHRoZSBvbGRlcgorOyBjaGlwcyBhbmQgdGhlIG5ld2VyIE5DUjUzYzgwMCBzZXJpZXMsIHRoZSBOQ1I1M2M4MDAgc2VyaWVzIAorOyB3YXMgY2hvc2VuLgorOworOyBXaGlsZSB0aGUgTkNSNTNjNzAwIGFuZCBOQ1I1M2M3MDAtNjYgbGFja2VkIHRoZSBmYWNpbGl0aWVzIHRvIGZ1bGx5Cis7IGF1dG9tYXRlIFNDU0kgdHJhbnNmZXJzIHdpdGhvdXQgaG9zdCBwcm9jZXNzb3IgaW50ZXJ2ZW50aW9uLCB0aGlzIAorOyBpc24ndCB0aGUgY2FzZSB3aXRoIHRoZSBOQ1I1M2M3MTAgYW5kIG5ld2VyIGNoaXBzIHdoaWNoIGFsbG93IAorOworOyAtIHJlYWRzIGFuZCB3cml0ZXMgdG8gdGhlIGludGVybmFsIHJlZ2lzdGVycyBmcm9tIHdpdGhpbiB0aGUgU0NTSQorOyAJc2NyaXB0cywgYWxsb3dpbmcgdGhlIFNDU0kgU0NSSVBUUyh0bSkgY29kZSB0byBzYXZlIHByb2Nlc3NvcgorOyAJc3RhdGUgc28gdGhhdCBtdWx0aXBsZSB0aHJlYWRzIG9mIGV4ZWN1dGlvbiBhcmUgcG9zc2libGUsIGFuZCBhbHNvCis7IAlwcm92aWRlIGFuIEFMVSBmb3IgbG9vcCBjb250cm9sLCBldGMuCis7IAorOyAtIHRhYmxlIGluZGlyZWN0IGFkZHJlc3NpbmcgZm9yIHNvbWUgaW5zdHJ1Y3Rpb25zLiBUaGlzIGFsbG93cyAKKzsJcG9pbnRlcnMgdG8gYmUgbG9jYXRlZCByZWxhdGl2ZSB0byB0aGUgRFNBICgoRGF0YSBTdHJ1Y3R1cmUKKzsJQWRkcmVzcykgcmVnaXN0ZXIuCis7Cis7IFRoZXNlIGZlYXR1cmVzIG1ha2UgaXQgcG9zc2libGUgdG8gaW1wbGVtZW50IGEgbWFpbGJveCBzdHlsZSBpbnRlcmZhY2UsCis7IHdoZXJlIHRoZSBzYW1lIHBpZWNlIG9mIGNvZGUgaXMgcnVuIHRvIGhhbmRsZSBJL08gZm9yIG11bHRpcGxlIHRocmVhZHMKKzsgYXQgb25jZSBtaW5pbWl6aW5nIG91ciBuZWVkIHRvIHJlbG9jYXRlIGNvZGUuICBTaW5jZSB0aGUgTkNSNTNjNzAwLworOyBOQ1I1M2M4MDAgc2VyaWVzIGhhdmUgYSB1bmlxdWUgY29tYmluYXRpb24gb2YgZmVhdHVyZXMsIG1ha2luZyBhIAorOyBhIHN0YW5kYXJkIGluZ29pbmcvb3V0Z29pbmcgbWFpbGJveCBzeXN0ZW0sIGNvc3RseSwgSSd2ZSBtb2RpZmllZCBpdC4KKzsKKzsgLSBNYWlsYm94ZXMgYXJlIGEgbWl4dHVyZSBvZiBjb2RlIGFuZCBkYXRhLiAgVGhpcyBsZXRzIHVzIGdyZWF0bHkKKzsgCXNpbXBsaWZ5IHRoZSBOQ1I1M2M4MTAgY29kZSBhbmQgZG8gdGhpbmdzIHRoYXQgd291bGQgb3RoZXJ3aXNlCis7CW5vdCBiZSBwb3NzaWJsZS4KKzsKKzsgVGhlIHNhdmVkIGRhdGEgcG9pbnRlciBpcyBub3cgaW1wbGVtZW50ZWQgYXMgZm9sbG93cyA6Cis7Cis7IAlDb250cm9sIGZsb3cgaGFzIGJlZW4gYXJjaGl0ZWN0ZWQgc3VjaCB0aGF0IGlmIGNvbnRyb2wgcmVhY2hlcworOwltdW5nZV9zYXZlX2RhdGFfcG9pbnRlciwgb24gYSByZXN0b3JlIHBvaW50ZXJzIG1lc3NhZ2Ugb3IgCis7CXJlY29ubmVjdGlvbiwgYSBqdW1wIHRvIHRoZSBhZGRyZXNzIGZvcm1lcmx5IGluIHRoZSBURU1QIHJlZ2lzdGVyCis7CXdpbGwgYWxsb3cgdGhlIFNDU0kgY29tbWFuZCB0byByZXN1bWUgZXhlY3V0aW9uLgorOworCis7Cis7IE5vdGUgOiB0aGUgRFNBIHN0cnVjdHVyZXMgbXVzdCBiZSBhbGlnbmVkIG9uIDMyIGJpdCBib3VuZGFyaWVzLAorOyBzaW5jZSB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBvZiBNT1ZFIE1FTU9SWSBpbnN0cnVjdGlvbnMgCis7IG11c3Qgc2hhcmUgdGhlIHNhbWUgYWxpZ25tZW50IGFuZCB0aGlzIGlzIHRoZSBhbGlnbm1lbnQgb2YgdGhlCis7IE5DUiByZWdpc3RlcnMuCis7CisKKzsgRm9yIHNvbWUgc3lzdGVtcyAoTVZNRTE2NiwgZm9yIGV4YW1wbGUpIGRtb2RlIGlzIGFsd2F5cyB0aGUgc2FtZSwgc28gZG9uJ3QKKzsgd2FzdGUgdGltZSB3cml0aW5nIGl0CisKKyNpZiAxCisjZGVmaW5lIERNT0RFX01FTU9SWV9UT19OQ1IKKyNkZWZpbmUgRE1PREVfTUVNT1JZX1RPX01FTU9SWQorI2RlZmluZSBETU9ERV9OQ1JfVE9fTUVNT1JZCisjZWxzZQorI2RlZmluZSBETU9ERV9NRU1PUllfVE9fTkNSICAgIE1PVkUgZG1vZGVfbWVtb3J5X3RvX25jciBUTyBETU9ERQorI2RlZmluZSBETU9ERV9NRU1PUllfVE9fTUVNT1JZIE1PVkUgZG1vZGVfbWVtb3J5X3RvX21lbW9yeSBUTyBETU9ERQorI2RlZmluZSBETU9ERV9OQ1JfVE9fTUVNT1JZICAgIE1PVkUgZG1vZGVfbmNyX3RvX21lbW9yeSBUTyBETU9ERQorI2VuZGlmCisKK0FCU09MVVRFIGRzYV90ZW1wX2x1biA9IDAJCTsgUGF0Y2ggdG8gbHVuIGZvciBjdXJyZW50IGRzYQorQUJTT0xVVEUgZHNhX3RlbXBfbmV4dCA9IDAJCTsgUGF0Y2ggdG8gZHNhIG5leHQgZm9yIGN1cnJlbnQgZHNhCitBQlNPTFVURSBkc2FfdGVtcF9hZGRyX25leHQgPSAwCQk7IFBhdGNoIHRvIGFkZHJlc3Mgb2YgZHNhIG5leHQgYWRkcmVzcyAKKwkJCQkJOyAJZm9yIGN1cnJlbnQgZHNhCitBQlNPTFVURSBkc2FfdGVtcF9zeW5jID0gMAkJOyBQYXRjaCB0byBhZGRyZXNzIG9mIHBlci10YXJnZXQKKwkJCQkJOwlzeW5jIHJvdXRpbmUKK0FCU09MVVRFIGRzYV9zc2NmXzcxMCA9IDAJCTsgUGF0Y2ggdG8gYWRkcmVzcyBvZiBwZXItdGFyZ2V0CisJCQkJCTsJc3NjZiB2YWx1ZSAoNTNjNzEwKQorQUJTT0xVVEUgZHNhX3RlbXBfdGFyZ2V0ID0gMAkJOyBQYXRjaCB0byBpZCBmb3IgY3VycmVudCBkc2EKK0FCU09MVVRFIGRzYV90ZW1wX2FkZHJfc2F2ZWRfcG9pbnRlciA9IDA7IFBhdGNoIHRvIGFkZHJlc3Mgb2YgcGVyLWNvbW1hbmQKKwkJCQkJOyAJc2F2ZWQgZGF0YSBwb2ludGVyCitBQlNPTFVURSBkc2FfdGVtcF9hZGRyX3Jlc2lkdWFsID0gMAk7IFBhdGNoIHRvIGFkZHJlc3Mgb2YgcGVyLWNvbW1hbmQKKwkJCQkJOwljdXJyZW50IHJlc2lkdWFsIGNvZGUKK0FCU09MVVRFIGRzYV90ZW1wX2FkZHJfc2F2ZWRfcmVzaWR1YWwgPSAwOyBQYXRjaCB0byBhZGRyZXNzIG9mIHBlci1jb21tYW5kCisJCQkJCTsgc2F2ZWQgcmVzaWR1YWwgY29kZQorQUJTT0xVVEUgZHNhX3RlbXBfYWRkcl9uZXdfdmFsdWUgPSAwCTsgQWRkcmVzcyBvZiB2YWx1ZSBmb3IgSlVNUCBvcGVyYW5kCitBQlNPTFVURSBkc2FfdGVtcF9hZGRyX2FycmF5X3ZhbHVlID0gMCAJOyBBZGRyZXNzIHRvIGNvcHkgdG8KK0FCU09MVVRFIGRzYV90ZW1wX2FkZHJfZHNhX3ZhbHVlID0gMAk7IEFkZHJlc3Mgb2YgdGhpcyBEU0EgdmFsdWUKKworOworOyBPbmNlIGEgZGV2aWNlIGhhcyBpbml0aWF0ZWQgcmVzZWxlY3Rpb24sIHdlIG5lZWQgdG8gY29tcGFyZSBpdCAKKzsgYWdhaW5zdCB0aGUgc2luZ2x5IGxpbmtlZCBsaXN0IG9mIGNvbW1hbmRzIHdoaWNoIGhhdmUgZGlzY29ubmVjdGVkCis7IGFuZCBhcmUgcGVuZGluZyByZXNlbGVjdGlvbi4gIFRoZXNlIGNvbW1hbmRzIGFyZSBtYWludGFpbmVkIGluIAorOyBhbiB1bm9yZGVyZWQgc2luZ2x5IGxpbmtlZCBsaXN0IG9mIERTQSBzdHJ1Y3R1cmVzLCB0aHJvdWdoIHRoZQorOyBEU0EgcG9pbnRlcnMgYXQgdGhlaXIgJ2NlbnRlcnMnIGhlYWRlZCBieSB0aGUgcmVjb25uZWN0X2RzYV9oZWFkCis7IHBvaW50ZXIuCis7IAorOyBUbyBhdm9pZCBjb21wbGljYXRpb25zIGluIHJlbW92aW5nIGNvbW1hbmRzIGZyb20gdGhlIGxpc3QsCis7IEkgbWluaW1pemUgdGhlIGFtb3VudCBvZiBleHBlbnNpdmUgKGF0IGVpZ2h0IG9wZXJhdGlvbnMgcGVyCis7IGFkZGl0aW9uIEAgNTAwLTYwMG5zIGVhY2gpIHBvaW50ZXIgb3BlcmF0aW9ucyB3aGljaCBtdXN0Cis7IGJlIGRvbmUgaW4gdGhlIE5DUiBkcml2ZXIgYnkgcHJlY29tcHV0aW5nIHRoZW0gb24gdGhlIAorOyBob3N0IHByb2Nlc3NvciBkdXJpbmcgZHNhIHN0cnVjdHVyZSBnZW5lcmF0aW9uLgorOworOyBUaGUgZml4ZWQtdXAgcGVyIERTQSBjb2RlIGtub3dzIGhvdyB0byByZWNvZ25pemUgdGhlIG5leHVzCis7IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBTQ1NJIGNvbW1hbmQsIGFuZCBtb2RpZmllcworOyB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb2ludGVycyBmb3IgdGhlIE1PVkUgTUVNT1JZIAorOyBpbnN0cnVjdGlvbiB3aGljaCBpcyBleGVjdXRlZCB3aGVuIHJlc2VsZWN0ZWRfb2sgaXMgY2FsbGVkCis7IHRvIHJlbW92ZSB0aGUgY29tbWFuZCBmcm9tIHRoZSBsaXN0LiAgU2ltaWxhcmx5LCBEU0EgaXMgCis7IGxvYWRlZCB3aXRoIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IERTQSBzdHJ1Y3R1cmUgYW5kCis7IHJlc2VsZWN0ZWRfY2hlY2tfbmV4dCBpcyBjYWxsZWQgaWYgYSBmYWlsdXJlIG9jY3Vycy4KKzsKKzsgUGVyaGFwcyBtb3JlIGNvbmNpc2VseSwgdGhlIG5ldCBlZmZlY3Qgb2YgdGhlIG1lc3MgaXMgCis7Cis7IGZvciAoZHNhID0gcmVjb25uZWN0X2RzYV9oZWFkLCBkZXN0ID0gJnJlY29ubmVjdF9kc2FfaGVhZCwgCis7ICAgICBzcmMgPSBOVUxMOyBkc2E7IGRlc3QgPSAmZHNhLT5uZXh0LCBkc2EgPSBkc2EtPm5leHQpIHsKKzsgCXNyYyA9ICZkc2EtPm5leHQ7Cis7IAlpZiAodGFyZ2V0X2lkID09IGRzYS0+aWQgJiYgdGFyZ2V0X2x1biA9PSBkc2EtPmx1bikgeworOyAJCSpkZXN0ID0gKnNyYzsKKzsgCQlicmVhazsKKzsgICAgICAgICB9CQorOyB9Cis7Cis7IGlmICghZHNhKQorOyAgICAgICAgICAgZXJyb3IgKGludF9lcnJfdW5leHBlY3RlZF9yZXNlbGVjdCk7Cis7IGVsc2UgIAorOyAgICAgbG9uZ2ptcCAoZHNhLT5qdW1wX3Jlc3VtZSwgMCk7Cis7Cis7IAkKKworI2lmIChDSElQICE9IDcwMCkgJiYgKENISVAgIT0gNzAwNjYpCis7IERlZmluZSBEU0Egc3RydWN0dXJlIHVzZWQgZm9yIG1haWxib3hlcworRU5UUlkgZHNhX2NvZGVfdGVtcGxhdGUKK2RzYV9jb2RlX3RlbXBsYXRlOgorRU5UUlkgZHNhX2NvZGVfYmVnaW4KK2RzYV9jb2RlX2JlZ2luOgorOyBSR0g6IERvbid0IGNhcmUgYWJvdXQgVEVNUCBhbmQgRFNBIGhlcmUKKwlETU9ERV9NRU1PUllfVE9fTkNSCisJTU9WRSBNRU1PUlkgNCwgZHNhX3RlbXBfYWRkcl9kc2FfdmFsdWUsIGFkZHJfc2NyYXRjaAorCURNT0RFX01FTU9SWV9UT19NRU1PUlkKKyNpZiAoQ0hJUCA9PSA3MTApCisJTU9WRSBNRU1PUlkgNCwgYWRkcl9zY3JhdGNoLCBzYXZlZF9kc2EKKwk7IFdlIGFyZSBhYm91dCB0byBnbyBhbmQgc2VsZWN0IHRoZSBkZXZpY2UsIHNvIG11c3Qgc2V0IFNTQ0YgYml0cworCU1PVkUgTUVNT1JZIDQsIGRzYV9zc2NmXzcxMCwgYWRkcl9zY3JhdGNoCisjaWZkZWYgQklHX0VORElBTgorCU1PVkUgU0NSQVRDSDMgVE8gU0ZCUgorI2Vsc2UKKwlNT1ZFIFNDUkFUQ0gwIFRPIFNGQlIKKyNlbmRpZgorCU1PVkUgU0ZCUiBUTyBTQkNMCisJTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorI2Vsc2UKKwlDQUxMIHNjcmF0Y2hfdG9fZHNhCisjZW5kaWYKKwlDQUxMIHNlbGVjdAorOyBIYW5kbGUgdGhlIHBoYXNlIG1pc21hdGNoIHdoaWNoIG1heSBoYXZlIHJlc3VsdGVkIGZyb20gdGhlIAorOyBNT1ZFIEZST00gZHNhX21zZ291dCBpZiB3ZSByZXR1cm5lZCBoZXJlLiAgVGhlIENMRUFSIEFUTiAKKzsgbWF5IG9yIG1heSBub3QgYmUgbmVjZXNzYXJ5LCBhbmQgd2Ugc2hvdWxkIHVwZGF0ZSBzY3JpcHRfYXNtLnBsCis7IHRvIGhhbmRsZSBtdWx0aXBsZSBwaWVjZXMuCisgICAgQ0xFQVIgQVROCisgICAgQ0xFQVIgQUNLCisKKzsgUmVwbGFjZSBzZWNvbmQgb3BlcmFuZCB3aXRoIGFkZHJlc3Mgb2YgSlVNUCBpbnN0cnVjdGlvbiBkZXN0IG9wZXJhbmQKKzsgaW4gc2NoZWR1bGUgdGFibGUgZm9yIHRoaXMgRFNBLiAgQmVjb21lcyBkc2FfanVtcF9kZXN0IGluIDUzYzcsOHh4LmMuCitFTlRSWSBkc2FfY29kZV9maXhfanVtcAorZHNhX2NvZGVfZml4X2p1bXA6CisJTU9WRSBNRU1PUlkgNCwgTk9QX2luc24sIDAKKwlKVU1QIHNlbGVjdF9kb25lCisKKzsgd3JvbmdfZHNhIGxvYWRzIHRoZSBEU0EgcmVnaXN0ZXIgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGRzYV9uZXh0Cis7IGZpZWxkLgorOword3JvbmdfZHNhOgorI2lmIChDSElQID09IDcxMCkKKzsgICAgICAgICAgICAgICAgTk9URSBEU0EgaXMgY29ycnVwdCB3aGVuIHdlIGFycml2ZSBoZXJlIQorI2VuZGlmCis7CQlQYXRjaCB0aGUgTU9WRSBNRU1PUlkgSU5TVFJVQ1RJT04gc3VjaCB0aGF0IAorOwkJdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIE9MRCAKKzsJCW5leHQgcG9pbnRlci4KKzsKKwlNT1ZFIE1FTU9SWSA0LCBkc2FfdGVtcF9hZGRyX25leHQsIHJlc2VsZWN0ZWRfb2tfcGF0Y2ggKyA4CisJRE1PREVfTUVNT1JZX1RPX05DUgorOworOyAJTW92ZSB0aGUgX2NvbnRlbnRzXyBvZiB0aGUgbmV4dCBwb2ludGVyIGludG8gdGhlIERTQSByZWdpc3RlciBhcyAKKzsJdGhlIG5leHQgSV9UX0wgb3IgSV9UX0xfUSB0dXBwbGUgdG8gY2hlY2sgYWdhaW5zdCB0aGUgZXN0YWJsaXNoZWQKKzsJbmV4dXMuCis7CisJTU9WRSBNRU1PUlkgNCwgZHNhX3RlbXBfbmV4dCwgYWRkcl9zY3JhdGNoCisJRE1PREVfTUVNT1JZX1RPX01FTU9SWQorI2lmIChDSElQID09IDcxMCkKKwlNT1ZFIE1FTU9SWSA0LCBhZGRyX3NjcmF0Y2gsIHNhdmVkX2RzYQorCU1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9kc2EKKyNlbHNlCisJQ0FMTCBzY3JhdGNoX3RvX2RzYQorI2VuZGlmCisJSlVNUCByZXNlbGVjdGVkX2NoZWNrX25leHQKKworQUJTT0xVVEUgZHNhX3NhdmVfZGF0YV9wb2ludGVyID0gMAorRU5UUlkgZHNhX2NvZGVfc2F2ZV9kYXRhX3BvaW50ZXIKK2RzYV9jb2RlX3NhdmVfZGF0YV9wb2ludGVyOgorI2lmIChDSElQID09IDcxMCkKKwk7IFdoZW4gd2UgZ2V0IGhlcmUsIFRFTVAgaGFzIGJlZW4gc2F2ZWQgaW4ganVtcF90ZW1wKzQsIERTQSBpcyBjb3JydXB0CisJOyBXZSBNVVNUIHJldHVybiB3aXRoIERTQSBjb3JyZWN0CisgICAgCU1PVkUgTUVNT1JZIDQsIGp1bXBfdGVtcCs0LCBkc2FfdGVtcF9hZGRyX3NhdmVkX3BvaW50ZXIKKzsgSEFSRCBDT0RFRCA6IDI0IGJ5dGVzIG5lZWRzIHRvIGFncmVlIHdpdGggNTNjNyw4eHguaAorICAgIAlNT1ZFIE1FTU9SWSAyNCwgZHNhX3RlbXBfYWRkcl9yZXNpZHVhbCwgZHNhX3RlbXBfYWRkcl9zYXZlZF9yZXNpZHVhbAorICAgICAgICBDTEVBUiBBQ0sKKyNpZmRlZiBERUJVRworICAgICAgICBJTlQgaW50X2RlYnVnX3NhdmVkCisjZW5kaWYKKwlNT1ZFIE1FTU9SWSA0LCBzYXZlZF9kc2EsIGFkZHJfZHNhCisJSlVNUCBqdW1wX3RlbXAKKyNlbHNlCisgICAgCURNT0RFX05DUl9UT19NRU1PUlkKKyAgICAJTU9WRSBNRU1PUlkgNCwgYWRkcl90ZW1wLCBkc2FfdGVtcF9hZGRyX3NhdmVkX3BvaW50ZXIKKyAgICAJRE1PREVfTUVNT1JZX1RPX01FTU9SWQorOyBIQVJEIENPREVEIDogMjQgYnl0ZXMgbmVlZHMgdG8gYWdyZWUgd2l0aCA1M2M3LDh4eC5oCisgICAgCU1PVkUgTUVNT1JZIDI0LCBkc2FfdGVtcF9hZGRyX3Jlc2lkdWFsLCBkc2FfdGVtcF9hZGRyX3NhdmVkX3Jlc2lkdWFsCisgICAgICAgIENMRUFSIEFDSworI2lmZGVmIERFQlVHCisgICAgICAgIElOVCBpbnRfZGVidWdfc2F2ZWQKKyNlbmRpZgorICAgIAlSRVRVUk4KKyNlbmRpZgorQUJTT0xVVEUgZHNhX3Jlc3RvcmVfcG9pbnRlcnMgPSAwCitFTlRSWSBkc2FfY29kZV9yZXN0b3JlX3BvaW50ZXJzCitkc2FfY29kZV9yZXN0b3JlX3BvaW50ZXJzOgorI2lmIChDSElQID09IDcxMCkKKwk7IFRFTVAgYW5kIERTQSBhcmUgY29ycnVwdCB3aGVuIHdlIGdldCBoZXJlLCBidXQgd2hvIGNhcmVzIQorICAgIAlNT1ZFIE1FTU9SWSA0LCBkc2FfdGVtcF9hZGRyX3NhdmVkX3BvaW50ZXIsIGp1bXBfdGVtcCArIDQKKzsgSEFSRCBDT0RFRCA6IDI0IGJ5dGVzIG5lZWRzIHRvIGFncmVlIHdpdGggNTNjNyw4eHguaAorICAgIAlNT1ZFIE1FTU9SWSAyNCwgZHNhX3RlbXBfYWRkcl9zYXZlZF9yZXNpZHVhbCwgZHNhX3RlbXBfYWRkcl9yZXNpZHVhbAorICAgICAgICBDTEVBUiBBQ0sKKwk7IFJlc3RvcmUgRFNBLCBub3RlIHdlIGRvbid0IGNhcmUgYWJvdXQgVEVNUAorCU1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9kc2EKKyNpZmRlZiBERUJVRworICAgICAgICBJTlQgaW50X2RlYnVnX3Jlc3RvcmVkCisjZW5kaWYKKwlKVU1QIGp1bXBfdGVtcAorI2Vsc2UKKyAgICAJRE1PREVfTUVNT1JZX1RPX05DUgorICAgIAlNT1ZFIE1FTU9SWSA0LCBkc2FfdGVtcF9hZGRyX3NhdmVkX3BvaW50ZXIsIGFkZHJfdGVtcAorICAgIAlETU9ERV9NRU1PUllfVE9fTUVNT1JZCis7IEhBUkQgQ09ERUQgOiAyNCBieXRlcyBuZWVkcyB0byBhZ3JlZSB3aXRoIDUzYzcsOHh4LmgKKyAgICAJTU9WRSBNRU1PUlkgMjQsIGRzYV90ZW1wX2FkZHJfc2F2ZWRfcmVzaWR1YWwsIGRzYV90ZW1wX2FkZHJfcmVzaWR1YWwKKyAgICAgICAgQ0xFQVIgQUNLCisjaWZkZWYgREVCVUcKKyAgICAgICAgSU5UIGludF9kZWJ1Z19yZXN0b3JlZAorI2VuZGlmCisgICAgCVJFVFVSTgorI2VuZGlmCisKK0FCU09MVVRFIGRzYV9jaGVja19yZXNlbGVjdCA9IDAKKzsgZHNhX2NoZWNrX3Jlc2VsZWN0IGRldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIGN1cnJlbnQgdGFyZ2V0IGFuZAorOyBsdW4gbWF0Y2ggdGhlIGN1cnJlbnQgRFNBCitFTlRSWSBkc2FfY29kZV9jaGVja19yZXNlbGVjdAorZHNhX2NvZGVfY2hlY2tfcmVzZWxlY3Q6CisjaWYgKENISVAgPT0gNzEwKQorCS8qIEFycml2ZXMgaGVyZSB3aXRoIERTQSBjb3JyZWN0ICovCisJLyogQXNzdW1lcyB3ZSBhcmUgYWx3YXlzIElEIDcgKi8KKwlNT1ZFIExDUkMgVE8gU0ZCUgkJOyBMQ1JDIGhhcyBvdXIgSUQgYW5kIGhpcyBJRCBiaXRzIHNldAorCUpVTVAgUkVMICh3cm9uZ19kc2EpLCBJRiBOT1QgZHNhX3RlbXBfdGFyZ2V0LCBBTkQgTUFTSyAweDgwCisjZWxzZQorCU1PVkUgU1NJRCBUTyBTRkJSCQk7IFNTSUQgY29udGFpbnMgMyBiaXQgdGFyZ2V0IElECis7IEZJWE1FIDogd2UgbmVlZCB0byBhY2NvbW1vZGF0ZSBiaXQgZmllbGRlZCBhbmQgYmluYXJ5IGhlcmUgZm9yICc3eHgvJzh4eCBjaGlwcworCUpVTVAgUkVMICh3cm9uZ19kc2EpLCBJRiBOT1QgZHNhX3RlbXBfdGFyZ2V0LCBBTkQgTUFTSyAweGY4CisjZW5kaWYKKzsKKzsgSGFjayAtIG1vdmUgdG8gc2NyYXRjaCBmaXJzdCwgc2luY2UgU0ZCUiBpcyBub3Qgd3JpdGVhYmxlCis7IAl2aWEgdGhlIENQVSBhbmQgaGVuY2UgYSBNT1ZFIE1FTU9SWSBpbnN0cnVjdGlvbi4KKzsKKwlETU9ERV9NRU1PUllfVE9fTkNSCisJTU9WRSBNRU1PUlkgMSwgcmVzZWxlY3RlZF9pZGVudGlmeSwgYWRkcl9zY3JhdGNoCisJRE1PREVfTUVNT1JZX1RPX01FTU9SWQorI2lmZGVmIEJJR19FTkRJQU4KKwk7IEJJRyBFTkRJQU4gT04gTVZNRTE2eAorCU1PVkUgU0NSQVRDSDMgVE8gU0ZCUgorI2Vsc2UKKwlNT1ZFIFNDUkFUQ0gwIFRPIFNGQlIKKyNlbmRpZgorOyBGSVhNRSA6IHdlIG5lZWQgdG8gYWNjb21tb2RhdGUgYml0IGZpZWxkZWQgYW5kIGJpbmFyeSBoZXJlIGZvciAnN3h4Lyc4eHggY2hpcHMKKzsgQXJlIHlvdSBzdXJlIGFib3V0IHRoYXQ/ICByaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWsKKwlKVU1QIFJFTCAod3JvbmdfZHNhKSwgSUYgTk9UIGRzYV90ZW1wX2x1biwgQU5EIE1BU0sgMHhmOAorOwkJUGF0Y2ggdGhlIE1PVkUgTUVNT1JZIElOU1RSVUNUSU9OIHN1Y2ggdGhhdAorOwkJdGhlIHNvdXJjZSBhZGRyZXNzIGlzIHRoZSBhZGRyZXNzIG9mIHRoaXMgZHNhJ3MKKzsJCW5leHQgcG9pbnRlci4KKwlNT1ZFIE1FTU9SWSA0LCBkc2FfdGVtcF9hZGRyX25leHQsIHJlc2VsZWN0ZWRfb2tfcGF0Y2ggKyA0CisJQ0FMTCByZXNlbGVjdGVkX29rCisjaWYgKENISVAgPT0gNzEwKQorOwlSZXN0b3JlIERTQSBmb2xsb3dpbmcgbWVtb3J5IG1vdmVzIGluIHJlc2VsZWN0ZWRfb2sKKzsJZHNhX3RlbXBfc3luYyBkb2Vzbid0IHJlYWxseSBjYXJlIGFib3V0IERTQSwgYnV0IGl0IGhhcyBhbgorOwlvcHRpb25hbCBkZWJ1ZyBJTlQgc28gYSB2YWxpZCBEU0EgaXMgYSBnb29kIGlkZWEuCisJTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorI2VuZGlmCisJQ0FMTCBkc2FfdGVtcF9zeW5jCQorOyBSZWxlYXNlIEFDSyBvbiB0aGUgSURFTlRJRlkgbWVzc2FnZSBfYWZ0ZXJfIHdlJ3ZlIHNldCB0aGUgc3luY2hyb25vdXMgCis7IHRyYW5zZmVyIHBhcmFtZXRlcnMhIAorCUNMRUFSIEFDSworOyBJbXBsaWNpdGx5IHJlc3RvcmUgcG9pbnRlcnMgb24gcmVzZWxlY3Rpb24sIHNvIGEgUkVUVVJOCis7IHdpbGwgdHJhbnNmZXIgY29udHJvbCBiYWNrIHRvIHRoZSByaWdodCBzcG90LgorICAgIAlDQUxMIFJFTCAoZHNhX2NvZGVfcmVzdG9yZV9wb2ludGVycykKKyAgICAJUkVUVVJOCitFTlRSWSBkc2FfemVybworZHNhX3plcm86CitFTlRSWSBkc2FfY29kZV90ZW1wbGF0ZV9lbmQKK2RzYV9jb2RlX3RlbXBsYXRlX2VuZDoKKworOyBQZXJmb3JtIHNhbml0eSBjaGVjayBmb3IgZHNhX2ZpZWxkc19zdGFydCA9PSBkc2FfY29kZV90ZW1wbGF0ZV9lbmQgLSAKKzsgZHNhX3plcm8sIHB1a2UuCisKK0FCU09MVVRFIGRzYV9maWVsZHNfc3RhcnQgPSAgMAk7IFNhbml0eSBtYXJrZXIKKwkJCQk7IAlwYWQgNDggYnl0ZXMgKGZpeCB0aGlzIFJTTikKK0FCU09MVVRFIGRzYV9uZXh0ID0gNDgJCTsgbGVuIDQgTmV4dCBEU0EKKyAJCQkJOyBkZWwgNCBQcmV2aW91cyBEU0EgYWRkcmVzcworQUJTT0xVVEUgZHNhX2NtbmQgPSA1NgkJOyBsZW4gNCBTY3NpX0NtbmQgKiBmb3IgdGhpcyB0aHJlYWQuCitBQlNPTFVURSBkc2Ffc2VsZWN0ID0gNjAJOyBsZW4gNCBEZXZpY2UgSUQsIFBlcmlvZCwgT2Zmc2V0IGZvciAKKwkJCSAJOwl0YWJsZSBpbmRpcmVjdCBzZWxlY3QKK0FCU09MVVRFIGRzYV9tc2dvdXQgPSA2NAk7IGxlbiA4IHRhYmxlIGluZGlyZWN0IG1vdmUgcGFyYW1ldGVyIGZvciAKKwkJCQk7ICAgICAgIHNlbGVjdCBtZXNzYWdlCitBQlNPTFVURSBkc2FfY21kb3V0ID0gNzIJOyBsZW4gOCB0YWJsZSBpbmRpcmVjdCBtb3ZlIHBhcmFtZXRlciBmb3IgCisJCQkJOwljb21tYW5kCitBQlNPTFVURSBkc2FfZGF0YW91dCA9IDgwCTsgbGVuIDQgY29kZSBwb2ludGVyIGZvciBkYXRhb3V0CitBQlNPTFVURSBkc2FfZGF0YWluID0gODQJOyBsZW4gNCBjb2RlIHBvaW50ZXIgZm9yIGRhdGFpbgorQUJTT0xVVEUgZHNhX21zZ2luID0gODgJCTsgbGVuIDggdGFibGUgaW5kaXJlY3QgbW92ZSBmb3IgbXNnaW4KK0FCU09MVVRFIGRzYV9zdGF0dXMgPSA5NiAJOyBsZW4gOCB0YWJsZSBpbmRpcmVjdCBtb3ZlIGZvciBzdGF0dXMgYnl0ZQorQUJTT0xVVEUgZHNhX21zZ291dF9vdGhlciA9IDEwNAk7IGxlbiA4IHRhYmxlIGluZGlyZWN0IGZvciBub3JtYWwgbWVzc2FnZSBvdXQKKwkJCQk7IChTeW5jaHJvbm91cyB0cmFuc2ZlciBuZWdvdGlhdGlvbiwgZXRjKS4KK0FCU09MVVRFIGRzYV9lbmQgPSAxMTIKKworQUJTT0xVVEUgc2NoZWR1bGUgPSAwIAkJOyBBcnJheSBvZiBKVU1QIGRzYV9iZWdpbiBvciBKVU1QIChuZXh0KSwKKwkJCQk7IHRlcm1pbmF0ZWQgYnkgYSBjYWxsIHRvIEpVTVAgd2FpdF9yZXNlbGVjdAorCis7IExpbmtlZCBsaXN0cyBvZiBEU0Egc3RydWN0dXJlcworQUJTT0xVVEUgcmVjb25uZWN0X2RzYV9oZWFkID0gMAk7IExpbmsgbGlzdCBvZiBEU0FzIHdoaWNoIGNhbiByZWNvbm5lY3QKK0FCU09MVVRFIGFkZHJfcmVjb25uZWN0X2RzYV9oZWFkID0gMCA7IEFkZHJlc3Mgb2YgdmFyaWFibGUgY29udGFpbmluZworCQkJCTsgYWRkcmVzcyBvZiByZWNvbm5lY3RfZHNhX2hlYWQKKworOyBUaGVzZSBzZWxlY3QgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gb2YgYSBNT1ZFIE1FTU9SWSBpbnN0cnVjdGlvbgorQUJTT0xVVEUgZG1vZGVfbWVtb3J5X3RvX21lbW9yeSA9IDB4MAorQUJTT0xVVEUgZG1vZGVfbWVtb3J5X3RvX25jciA9IDB4MAorQUJTT0xVVEUgZG1vZGVfbmNyX3RvX21lbW9yeSA9IDB4MAorCitBQlNPTFVURSBhZGRyX3NjcmF0Y2ggPSAweDAKK0FCU09MVVRFIGFkZHJfdGVtcCA9IDB4MAorI2lmIChDSElQID09IDcxMCkKK0FCU09MVVRFIHNhdmVkX2RzYSA9IDB4MAorQUJTT0xVVEUgZW11bGZseSA9IDB4MAorQUJTT0xVVEUgYWRkcl9kc2EgPSAweDAKKyNlbmRpZgorI2VuZGlmIC8qIENISVAgIT0gNzAwICYmIENISVAgIT0gNzAwNjYgKi8KKworOyBJbnRlcnJ1cHRzIC0gCis7IE1TQiBpbmRpY2F0ZXMgdHlwZQorOyAwCWhhbmRsZSBlcnJvciBjb25kaXRpb24KKzsgMSAJaGFuZGxlIG1lc3NhZ2UgCis7IDIgCWhhbmRsZSBub3JtYWwgY29uZGl0aW9uCis7IDMJZGVidWdnaW5nIGludGVycnVwdAorOyA0IAl0ZXN0aW5nIGludGVycnVwdCAKKzsgTmV4dCBieXRlIGluZGljYXRlcyBzcGVjaWZpYyBlcnJvcgorCis7IFhYWCBub3QgeWV0IGltcGxlbWVudGVkLCBJJ20gbm90IHN1cmUgaWYgSSB3YW50IHRvIC0gCis7IE5leHQgYnl0ZSBpbmRpY2F0ZXMgdGhlIHJvdXRpbmUgdGhlIGVycm9yIG9jY3VycmVkIGluCis7IFRoZSBMU0IgaW5kaWNhdGVzIHRoZSBzcGVjaWZpYyBwbGFjZSB0aGUgZXJyb3Igb2NjdXJyZWQKKyAKK0FCU09MVVRFIGludF9lcnJfdW5leHBlY3RlZF9waGFzZSA9IDB4MDAwMDAwMDAJOyBVbmV4cGVjdGVkIHBoYXNlIGVuY291bnRlcmVkCitBQlNPTFVURSBpbnRfZXJyX3NlbGVjdGVkID0gMHgwMDAxMDAwMAkJOyBTRUxFQ1RFRCAobmVlIFJFU0VMRUNURUQpCitBQlNPTFVURSBpbnRfZXJyX3VuZXhwZWN0ZWRfcmVzZWxlY3QgPSAweDAwMDIwMDAwIAorQUJTT0xVVEUgaW50X2Vycl9jaGVja19jb25kaXRpb24gPSAweDAwMDMwMDAwCQorQUJTT0xVVEUgaW50X2Vycl9ub19waGFzZSA9IDB4MDAwNDAwMDAKK0FCU09MVVRFIGludF9tc2dfd2R0ciA9IDB4MDEwMDAwMDAJCTsgV0RUUiBtZXNzYWdlIHJlY2VpdmVkCitBQlNPTFVURSBpbnRfbXNnX3NkdHIgPSAweDAxMDEwMDAwCQk7IFNEVFIgcmVjZWl2ZWQKK0FCU09MVVRFIGludF9tc2dfMSA9IDB4MDEwMjAwMDAJCQk7IHNpbmdsZSBieXRlIHNwZWNpYWwgbWVzc2FnZQorCQkJCQkJOyByZWNlaXZlZAorCitBQlNPTFVURSBpbnRfbm9ybV9zZWxlY3RfY29tcGxldGUgPSAweDAyMDAwMDAwCTsgU2VsZWN0IGNvbXBsZXRlLCByZXByb2dyYW0KKwkJCQkJCTsgcmVnaXN0ZXJzLgorQUJTT0xVVEUgaW50X25vcm1fcmVzZWxlY3RfY29tcGxldGUgPSAweDAyMDEwMDAwCTsgTmV4dXMgZXN0YWJsaXNoZWQKK0FCU09MVVRFIGludF9ub3JtX2NvbW1hbmRfY29tcGxldGUgPSAweDAyMDIwMDAwIDsgQ29tbWFuZCBjb21wbGV0ZQorQUJTT0xVVEUgaW50X25vcm1fZGlzY29ubmVjdGVkID0gMHgwMjAzMDAwMAk7IERpc2Nvbm5lY3RlZCAKK0FCU09MVVRFIGludF9ub3JtX2Fib3J0ZWQgPTB4MDIwNDAwMDAJCTsgQWJvcnRlZCAqZHNhCitBQlNPTFVURSBpbnRfbm9ybV9yZXNldCA9IDB4MDIwNTAwMDAJCTsgR2VuZXJhdGVkIEJVUyByZXNldC4KK0FCU09MVVRFIGludF9ub3JtX2VtdWxhdGVpbnRmbHkgPSAweDAyMDYwMDAwCTsgNTNDNzEwIEVtdWxhdGVkIGludGZseQorQUJTT0xVVEUgaW50X2RlYnVnX2JyZWFrID0gMHgwMzAwMDAwMAkJOyBCcmVhayBwb2ludAorI2lmZGVmIERFQlVHCitBQlNPTFVURSBpbnRfZGVidWdfc2NoZWR1bGVkID0gMHgwMzAxMDAwMAk7IG5ldyBJL08gc2NoZWR1bGVkIAorQUJTT0xVVEUgaW50X2RlYnVnX2lkbGUgPSAweDAzMDIwMDAwCQk7IHNjaGVkdWxlciBpcyBpZGxlCitBQlNPTFVURSBpbnRfZGVidWdfZHNhX2xvYWRlZCA9IDB4MDMwMzAwMDAJOyBkc2EgcmVsb2FkZWQKK0FCU09MVVRFIGludF9kZWJ1Z19yZXNlbGVjdGVkID0gMHgwMzA0MDAwMAk7IE5DUiByZXNlbGVjdGVkCitBQlNPTFVURSBpbnRfZGVidWdfaGVhZCA9IDB4MDMwNTAwMDAJCTsgaXNzdWUgaGVhZCBvdmVyd3JpdHRlbgorQUJTT0xVVEUgaW50X2RlYnVnX2Rpc2Nvbm5lY3RlZCA9IDB4MDMwNjAwMDAJOyBkaXNjb25uZWN0ZWQKK0FCU09MVVRFIGludF9kZWJ1Z19kaXNjb25uZWN0X21zZyA9IDB4MDMwNzAwMDAJOyBnb3QgbWVzc2FnZSB0byBkaXNjb25uZWN0CitBQlNPTFVURSBpbnRfZGVidWdfZHNhX3NjaGVkdWxlID0gMHgwMzA4MDAwMAk7IGluIGRzYV9zY2hlZHVsZQorQUJTT0xVVEUgaW50X2RlYnVnX3Jlc2VsZWN0X2NoZWNrID0gMHgwMzA5MDAwMCAgOyBDaGVjayBmb3IgcmVzZWxlY3Rpb24gb2YgRFNBCitBQlNPTFVURSBpbnRfZGVidWdfcmVzZWxlY3RlZF9vayA9IDB4MDMwYTAwMDAgCTsgUmVzZWxlY3Rpb24gYWNjZXB0ZWQKKyNlbmRpZgorQUJTT0xVVEUgaW50X2RlYnVnX3BhbmljID0gMHgwMzBiMDAwMAkJOyBQYW5pYyBkcml2ZXIKKyNpZmRlZiBERUJVRworQUJTT0xVVEUgaW50X2RlYnVnX3NhdmVkID0gMHgwMzBjMDAwMCAJCTsgc2F2ZS9yZXN0b3JlIHBvaW50ZXJzCitBQlNPTFVURSBpbnRfZGVidWdfcmVzdG9yZWQgPSAweDAzMGQwMDAwCitBQlNPTFVURSBpbnRfZGVidWdfc3luYyA9IDB4MDMwZTAwMDAJCTsgU2FuaXR5IGNoZWNrIHN5bmNocm9ub3VzIAorCQkJCQkJOyBwYXJhbWV0ZXJzLiAKK0FCU09MVVRFIGludF9kZWJ1Z19kYXRhaW4gPSAweDAzMGYwMDAwCQk7IGdvaW5nIGludG8gZGF0YSBpbiBwaGFzZSAKKwkJCQkJCTsgbm93LgorQUJTT0xVVEUgaW50X2RlYnVnX2NoZWNrX2RzYSA9IDB4MDMxMDAwMDAJOyBTYW5pdHkgY2hlY2sgRFNBIGFnYWluc3QKKwkJCQkJCTsgU0RJRC4KKyNlbmRpZgorCitBQlNPTFVURSBpbnRfdGVzdF8xID0gMHgwNDAwMDAwMAkJOyBUZXN0IDEgY29tcGxldGUKK0FCU09MVVRFIGludF90ZXN0XzIgPSAweDA0MDEwMDAwCQk7IFRlc3QgMiBjb21wbGV0ZQorQUJTT0xVVEUgaW50X3Rlc3RfMyA9IDB4MDQwMjAwMDAJCTsgVGVzdCAzIGNvbXBsZXRlCisKKworOyBUaGVzZSBzaG91bGQgc3RhcnQgd2l0aCAweDA1MDAwMDAwLCB3aXRoIGxvdyBiaXRzIGluY3JlbWVudGluZyBmb3IgCis7IGVhY2ggb25lLgorCisjaWZkZWYgRVZFTlRTCitBQlNPTFVURSBpbnRfRVZFTlRfU0VMRUNUID0gMAorQUJTT0xVVEUgaW50X0VWRU5UX0RJU0NPTk5FQ1QgPSAwCitBQlNPTFVURSBpbnRfRVZFTlRfUkVTRUxFQ1QgPSAwCitBQlNPTFVURSBpbnRfRVZFTlRfQ09NUExFVEUgPSAwCitBQlNPTFVURSBpbnRfRVZFTlRfSURMRSA9IDAKK0FCU09MVVRFIGludF9FVkVOVF9TRUxFQ1RfRkFJTEVEID0gMAorQUJTT0xVVEUgaW50X0VWRU5UX0JFRk9SRV9TRUxFQ1QgPSAwCitBQlNPTFVURSBpbnRfRVZFTlRfUkVTRUxFQ1RfRkFJTEVEID0gMAorI2VuZGlmCisJCQkJCQkKK0FCU09MVVRFIE5DUjUzYzd4eF9tc2dfYWJvcnQgPSAwCTsgUG9pbnRlciB0byBhYm9ydCBtZXNzYWdlCitBQlNPTFVURSBOQ1I1M2M3eHhfbXNnX3JlamVjdCA9IDAgICAgICAgOyBQb2ludGVyIHRvIHJlamVjdCBtZXNzYWdlCitBQlNPTFVURSBOQ1I1M2M3eHhfemVybwk9IDAJCTsgbG9uZyB3aXRoIHplcm8gaW4gaXQsIHVzZSBmb3Igc291cmNlCitBQlNPTFVURSBOQ1I1M2M3eHhfc2luayA9IDAJCTsgbG9uZyB0byBkdW1wIHdvcnRobGVzcyBkYXRhIGluCitBQlNPTFVURSBOT1BfaW5zbiA9IDAJCQk7IE5PUCBpbnN0cnVjdGlvbgorCis7IFBvaW50ZXIgdG8gbWVzc2FnZSwgcG90ZW50aWFsbHkgbXVsdGktYnl0ZQorQUJTT0xVVEUgbXNnX2J1ZiA9IDAKKworOyBQb2ludGVyIHRvIGhvbGRpbmcgYXJlYSBmb3IgcmVzZWxlY3Rpb24gaW5mb3JtYXRpb24KK0FCU09MVVRFIHJlc2VsZWN0ZWRfaWRlbnRpZnkgPSAwCitBQlNPTFVURSByZXNlbGVjdGVkX3RhZyA9IDAKKworOyBSZXF1ZXN0IHNlbnNlIGNvbW1hbmQgcG9pbnRlciwgaXQncyBhIDYgYnl0ZSBjb21tYW5kLCBzaG91bGQKKzsgYmUgY29uc3RhbnQgZm9yIGFsbCBjb21tYW5kcyBzaW5jZSB3ZSBhbHdheXMgd2FudCAxNiBieXRlcyBvZiAKKzsgc2Vuc2UgYW5kIHdlIGRvbid0IG5lZWQgdG8gY2hhbmdlIGFueSBmaWVsZHMgYXMgd2UgZGlkIHVuZGVyIAorOyBTQ1NJLUkgd2hlbiB3ZSBhY3R1YWxseSBjYXJlZCBhYm91dCB0aGUgTFVOIGZpZWxkLgorO0VYVEVSTkFMIE5DUjUzYzd4eF9zZW5zZQkJOyBSZXF1ZXN0IHNlbnNlIGNvbW1hbmQKKworI2lmIChDSElQICE9IDcwMCkgJiYgKENISVAgIT0gNzAwNjYpCis7IGRzYV9zY2hlZHVsZSAgCis7IFBVUlBPU0UgOiBhZnRlciBhIERJU0NPTk5FQ1QgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZCwgYW5kIHBvaW50ZXJzCis7CXNhdmVkLCBpbnNlcnQgdGhlIGN1cnJlbnQgRFNBIHN0cnVjdHVyZSBhdCB0aGUgaGVhZCBvZiB0aGUgCis7IAlkaXNjb25uZWN0ZWQgcXVldWUgYW5kIGZhbGwgdGhyb3VnaCB0byB0aGUgc2NoZWR1bGVyLgorOworOyBDQUxMUyA6IE9LCis7Cis7IElOUFVUUyA6IGRzYSAtIGN1cnJlbnQgRFNBIHN0cnVjdHVyZSwgcmVjb25uZWN0X2RzYV9oZWFkIC0gbGlzdAorOwlvZiBkaXNjb25uZWN0ZWQgY29tbWFuZHMKKzsKKzsgTU9ESUZJRVMgOiBTQ1JBVENILCByZWNvbm5lY3RfZHNhX2hlYWQKKzsgCis7IEVYSVRTIDogYWx3YXlzIHBhc3NlcyBjb250cm9sIHRvIHNjaGVkdWxlCisKK0VOVFJZIGRzYV9zY2hlZHVsZQorZHNhX3NjaGVkdWxlOgorI2lmZGVmIERFQlVHCisgICAgSU5UIGludF9kZWJ1Z19kc2Ffc2NoZWR1bGUKKyNlbmRpZgorCis7Cis7IENhbGN1bGF0ZSB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBwb2ludGVyIHdpdGhpbiB0aGUgRFNBIAorOyBzdHJ1Y3R1cmUgb2YgdGhlIGNvbW1hbmQgdGhhdCBpcyBjdXJyZW50bHkgZGlzY29ubmVjdGluZworOworI2lmIChDSElQID09IDcxMCkKKyAgICA7IFJlYWQgd2hhdCBzaG91bGQgYmUgdGhlIGN1cnJlbnQgRFNBIGZyb20gbWVtb3J5IC0gYWN0dWFsIERTQQorICAgIDsgcmVnaXN0ZXIgaXMgcHJvYmFibHkgY29ycnVwdAorICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9zY3JhdGNoCisjZWxzZQorICAgIENBTEwgZHNhX3RvX3NjcmF0Y2gKKyNlbmRpZgorICAgIE1PVkUgU0NSQVRDSDAgKyBkc2FfbmV4dCBUTyBTQ1JBVENIMAorICAgIE1PVkUgU0NSQVRDSDEgKyAwIFRPIFNDUkFUQ0gxIFdJVEggQ0FSUlkKKyAgICBNT1ZFIFNDUkFUQ0gyICsgMCBUTyBTQ1JBVENIMiBXSVRIIENBUlJZCisgICAgTU9WRSBTQ1JBVENIMyArIDAgVE8gU0NSQVRDSDMgV0lUSCBDQVJSWQorCis7IFBvaW50IHRoZSBuZXh0IGZpZWxkIG9mIHRoaXMgRFNBIHN0cnVjdHVyZSBhdCB0aGUgY3VycmVudCBkaXNjb25uZWN0ZWQgCis7IGxpc3QKKyAgICBETU9ERV9OQ1JfVE9fTUVNT1JZCisgICAgTU9WRSBNRU1PUlkgNCwgYWRkcl9zY3JhdGNoLCBkc2Ffc2NoZWR1bGVfaW5zZXJ0ICsgOAorICAgIERNT0RFX01FTU9SWV9UT19NRU1PUlkKK2RzYV9zY2hlZHVsZV9pbnNlcnQ6CisgICAgTU9WRSBNRU1PUlkgNCwgcmVjb25uZWN0X2RzYV9oZWFkLCAwIAorCis7IEFuZCB1cGRhdGUgdGhlIGhlYWQgcG9pbnRlci4KKyNpZiAoQ0hJUCA9PSA3MTApCisgICAgOyBSZWFkIHdoYXQgc2hvdWxkIGJlIHRoZSBjdXJyZW50IERTQSBmcm9tIG1lbW9yeSAtIGFjdHVhbCBEU0EKKyAgICA7IHJlZ2lzdGVyIGlzIHByb2JhYmx5IGNvcnJ1cHQKKyAgICBNT1ZFIE1FTU9SWSA0LCBzYXZlZF9kc2EsIGFkZHJfc2NyYXRjaAorI2Vsc2UKKyAgICBDQUxMIGRzYV90b19zY3JhdGNoCisjZW5kaWYKKyAgICBETU9ERV9OQ1JfVE9fTUVNT1JZCisgICAgTU9WRSBNRU1PUlkgNCwgYWRkcl9zY3JhdGNoLCByZWNvbm5lY3RfZHNhX2hlYWQKKyAgICBETU9ERV9NRU1PUllfVE9fTUVNT1JZCisvKiBUZW1wb3JhcmlseSwgc2VlIHdoYXQgaGFwcGVucy4gKi8KKyNpZm5kZWYgT1JJR0lOQUwKKyNpZiAoQ0hJUCAhPSA3MTApCisgICAgTU9WRSBTQ05UTDIgJiAweDdmIFRPIFNDTlRMMgorI2VuZGlmCisgICAgQ0xFQVIgQUNLCisjZW5kaWYKKyNpZiAoQ0hJUCA9PSA3MTApCisgICAgOyBUaW1lIHRvIGNvcnJlY3QgRFNBIGZvbGxvd2luZyBtZW1vcnkgbW92ZQorICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9kc2EKKyNlbmRpZgorICAgIFdBSVQgRElTQ09OTkVDVAorI2lmZGVmIEVWRU5UUworICAgIElOVCBpbnRfRVZFTlRfRElTQ09OTkVDVDsKKyNlbmRpZgorI2lmZGVmIERFQlVHCisgICAgSU5UIGludF9kZWJ1Z19kaXNjb25uZWN0ZWQKKyNlbmRpZgorICAgIEpVTVAgc2NoZWR1bGUKKyNlbmRpZiAKKworOworOyBzZWxlY3QKKzsKKzsgUFVSUE9TRSA6IGVzdGFibGlzaCBhIG5leHVzIGZvciB0aGUgU0NTSSBjb21tYW5kIHJlZmVyZW5jZWQgYnkgRFNBLgorOwlPbiBzdWNjZXNzLCB0aGUgY3VycmVudCBEU0Egc3RydWN0dXJlIGlzIHJlbW92ZWQgZnJvbSB0aGUgaXNzdWUgCis7CXF1ZXVlLiAgVXN1YWxseSwgdGhpcyBpcyBlbnRlcmVkIGFzIGEgZmFsbC10aHJvdWdoIGZyb20gc2NoZWR1bGUsCis7CWFsdGhvdWdoIHRoZSBjb250aW5nZW50IGFsbGVnaWFuY2UgaGFuZGxpbmcgY29kZSB3aWxsIHdyaXRlCis7CXRoZSBzZWxlY3QgZW50cnkgYWRkcmVzcyB0byB0aGUgRFNQIHRvIHJlc3RhcnQgYSBjb21tYW5kIGFzIGEgCis7CVJFUVVFU1QgU0VOU0UuICBBIG1lc3NhZ2UgaXMgc2VudCAodXN1YWxseSBJREVOVElGWSwgYWx0aG91Z2gKKzsJYWRkaXRpb25hbCBTRFRSIG9yIFdEVFIgbWVzc2FnZXMgbWF5IGJlIHNlbnQpLiAgQ09NTUFORCBPVVQKKzsJaXMgaGFuZGxlZC4KKzsKKzsgSU5QVVRTIDogRFNBIC0gU0NTSSBjb21tYW5kLCBpc3N1ZV9kc2FfaGVhZAorOworOyBDQUxMUyA6IE5PVCBPSworOworOyBNT0RJRklFUyA6IFNDUkFUQ0gsIGlzc3VlX2RzYV9oZWFkCis7Cis7IEVYSVRTIDogb24gcmVzZWxlY3Rpb24gb3Igc2VsZWN0aW9uLCBnbyB0byBzZWxlY3RfZmFpbGVkCis7CW90aGVyd2lzZSwgUkVUVVJOIHNvIGNvbnRyb2wgaXMgcGFzc2VkIGJhY2sgdG8gCis7CWRzYV9iZWdpbi4KKzsKKworRU5UUlkgc2VsZWN0CitzZWxlY3Q6CisKKyNpZmRlZiBFVkVOVFMKKyAgICBJTlQgaW50X0VWRU5UX0JFRk9SRV9TRUxFQ1QKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKyAgICBJTlQgaW50X2RlYnVnX3NjaGVkdWxlZAorI2VuZGlmCisgICAgQ0xFQVIgVEFSR0VUCisKKzsgWFhYCis7Cis7IEluIGVmZmVjdCwgU0VMRUNUSU9OIG9wZXJhdGlvbnMgYXJlIGJhY2tncm91bmRlZCwgd2l0aCBleGVjdXRpb24KKzsgY29udGludWluZyB1bnRpbCBjb2RlIHdoaWNoIHdhaXRzIGZvciBSRVEgb3IgYSBmYXRhbCBpbnRlcnJ1cHQgaXMgCis7IGVuY291bnRlcmVkLgorOworOyBTbywgZm9yIG1vcmUgcGVyZm9ybWFuY2UsIHdlIGNvdWxkIG92ZXJsYXAgdGhlIGNvZGUgd2hpY2ggcmVtb3ZlcyAKKzsgdGhlIGNvbW1hbmQgZnJvbSB0aGUgTkNScyBpc3N1ZSBxdWV1ZSB3aXRoIHRoZSBzZWxlY3Rpb24sIGJ1dCAKKzsgYXQgdGhpcyBwb2ludCBJIGRvbid0IHdhbnQgdG8gZGVhbCB3aXRoIHRoZSBlcnJvciByZWNvdmVyeS4KKzsKKworI2lmIChDSElQICE9IDcwMCkgJiYgKENISVAgIT0gNzAwNjYpCisjaWYgKENISVAgPT0gNzEwKQorICAgIDsgRW5hYmxlIHNlbGVjdGlvbiB0aW1lcgorI2lmZGVmIE5PX1NFTEVDVElPTl9USU1FT1VUCisgICAgTU9WRSBDVEVTVDcgJiAweGZmIFRPIENURVNUNworI2Vsc2UKKyAgICBNT1ZFIENURVNUNyAmIDB4ZWYgVE8gQ1RFU1Q3CisjZW5kaWYKKyNlbmRpZgorICAgIFNFTEVDVCBBVE4gRlJPTSBkc2Ffc2VsZWN0LCBzZWxlY3RfZmFpbGVkCisgICAgSlVNUCBzZWxlY3RfbXNnb3V0LCBXSEVOIE1TR19PVVQKK0VOVFJZIHNlbGVjdF9tc2dvdXQKK3NlbGVjdF9tc2dvdXQ6CisjaWYgKENISVAgPT0gNzEwKQorICAgIDsgRGlzYWJsZSBzZWxlY3Rpb24gdGltZXIKKyAgICBNT1ZFIENURVNUNyB8IDB4MTAgVE8gQ1RFU1Q3CisjZW5kaWYKKyAgICBNT1ZFIEZST00gZHNhX21zZ291dCwgV0hFTiBNU0dfT1VUCisjZWxzZQorRU5UUlkgc2VsZWN0X21zZ291dAorICAgIFNFTEVDVCBBVE4gMCwgc2VsZWN0X2ZhaWxlZAorc2VsZWN0X21zZ291dDoKKyAgICBNT1ZFIDAsIDAsIFdIRU4gTVNHT1VUCisjZW5kaWYKKworI2lmZGVmIEVWRU5UUworICAgSU5UIGludF9FVkVOVF9TRUxFQ1QKKyNlbmRpZgorICAgUkVUVVJOCisKKzsgCis7IHNlbGVjdF9kb25lCis7IAorOyBQVVJQT1NFOiBjb250aW51ZSBvbiB0byBub3JtYWwgZGF0YSB0cmFuc2ZlcjsgY2FsbGVkIGFzIHRoZSBleGl0IAorOwlwb2ludCBmcm9tIGRzYV9iZWdpbi4KKzsKKzsgSU5QVVRTOiBkc2EKKzsKKzsgQ0FMTFM6IE9LCis7Cis7CisKK3NlbGVjdF9kb25lOgorI2lmIChDSElQID09IDcxMCkKKzsgTk9URSBEU0EgaXMgY29ycnVwdCB3aGVuIHdlIGFycml2ZSBoZXJlIQorICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9kc2EKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKK0VOVFJZIHNlbGVjdF9jaGVja19kc2EKK3NlbGVjdF9jaGVja19kc2E6CisgICAgSU5UIGludF9kZWJ1Z19jaGVja19kc2EKKyNlbmRpZgorCis7IEFmdGVyIGEgc3VjY2Vzc2Z1bCBzZWxlY3Rpb24sIHdlIHNob3VsZCBnZXQgZWl0aGVyIGEgQ01EIHBoYXNlIG9yIAorOyBzb21lIHRyYW5zZmVyIHJlcXVlc3QgbmVnb3RpYXRpb24gbWVzc2FnZS4KKworICAgIEpVTVAgY21kb3V0LCBXSEVOIENNRAorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gTk9UIE1TR19JTiAKKworc2VsZWN0X21zZ19pbjoKKyAgICBDQUxMIG1zZ19pbiwgV0hFTiBNU0dfSU4KKyAgICBKVU1QIHNlbGVjdF9tc2dfaW4sIFdIRU4gTVNHX0lOCisKK2NtZG91dDoKKyAgICBJTlQgaW50X2Vycl91bmV4cGVjdGVkX3BoYXNlLCBXSEVOIE5PVCBDTUQKKyNpZiAoQ0hJUCA9PSA3MDApCisgICAgSU5UIGludF9ub3JtX3NlbGVjdGVkCisjZW5kaWYKK0VOVFJZIGNtZG91dF9jbWRvdXQKK2NtZG91dF9jbWRvdXQ6CisjaWYgKENISVAgIT0gNzAwKSAmJiAoQ0hJUCAhPSA3MDA2NikKKyAgICBNT1ZFIEZST00gZHNhX2NtZG91dCwgV0hFTiBDTUQKKyNlbHNlCisgICAgTU9WRSAwLCAwLCBXSEVOIENNRAorI2VuZGlmIC8qIChDSElQICE9IDcwMCkgJiYgKENISVAgIT0gNzAwNjYpICovCisKKzsKKzsgZGF0YV90cmFuc2ZlciAgCis7IG90aGVyX291dAorOyBvdGhlcl9pbgorOyBvdGhlcl90cmFuc2ZlcgorOworOyBQVVJQT1NFIDogaGFuZGxlIHRoZSBtYWluIGRhdGEgdHJhbnNmZXIgZm9yIGEgU0NTSSBjb21tYW5kIGluIAorOwlzZXZlcmFsIHBhcnRzLiAgSW4gdGhlIGZpcnN0IHBhcnQsIGRhdGFfdHJhbnNmZXIsIERBVEFfSU4KKzsJYW5kIERBVEFfT1VUIHBoYXNlcyBhcmUgYWxsb3dlZCwgd2l0aCB0aGUgdXNlciBwcm92aWRlZAorOwljb2RlICh1c3VhbGx5IGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgc2NhdHRlci9nYXRoZXIKKzsJbGlzdCBhc3NvY2lhdGVkIHdpdGggYSBTQ1NJIGNvbW1hbmQpIGNhbGxlZCB0byBoYW5kbGUgdGhlc2UgCis7CXBoYXNlcy4KKzsKKzsJQWZ0ZXIgY29udHJvbCBoYXMgcGFzc2VkIHRvIG9uZSBvZiB0aGUgdXNlciBwcm92aWRlZCAKKzsJREFUQV9JTiBvciBEQVRBX09VVCByb3V0aW5lcywgYmFjayBjYWxscyBhcmUgbWFkZSB0byAKKzsJb3RoZXJfdHJhbnNmZXJfaW4gb3Igb3RoZXJfdHJhbnNmZXJfb3V0IHRvIGhhbmRsZSBub24tREFUQSBJTgorOwlhbmQgREFUQSBPVVQgcGhhc2VzIHJlc3BlY3RpdmVseSwgd2l0aCB0aGUgc3RhdGUgb2YgdGhlIGFjdGl2ZQorOwlkYXRhIHBvaW50ZXIgYmVpbmcgcHJlc2VydmVkIGluIFRFTVAuCis7Cis7CU9uIGNvbXBsZXRpb24sIHRoZSB1c2VyIGNvZGUgcGFzc2VzIGNvbnRyb2wgdG8gb3RoZXJfdHJhbnNmZXIKKzsJd2hpY2ggY2F1c2VzIERBVEFfSU4gYW5kIERBVEFfT1VUIHRvIHJlc3VsdCBpbiB1bmV4cGVjdGVkX3BoYXNlCis7CWludGVycnVwdHMgc28gdGhhdCBkYXRhIG92ZXJydW5zIG1heSBiZSB0cmFwcGVkLgorOworOyBJTlBVVFMgOiBEU0EgLSBTQ1NJIGNvbW1hbmQKKzsKKzsgQ0FMTFMgOiBPSyBpbiBkYXRhX3RyYW5zZmVyX3N0YXJ0LCBub3Qgb2sgaW4gb3RoZXJfb3V0IGFuZCBvdGhlcl9pbiwgb2sgaW4KKzsJb3RoZXJfdHJhbnNmZXIKKzsKKzsgTU9ESUZJRVMgOiBTQ1JBVENICis7Cis7IEVYSVRTIDogaWYgU1RBVFVTIElOIGlzIGRldGVjdGVkLCBzaWduaWZ5aW5nIGNvbW1hbmQgY29tcGxldGlvbiwKKzsJdGhlIE5DUiBqdW1wcyB0byBjb21tYW5kX2NvbXBsZXRlLiAgSWYgTVNHIElOIG9jY3VycywgYSAKKzsJQ0FMTCBpcyBtYWRlIHRvIG1zZ19pbi4gIE90aGVyd2lzZSwgb3RoZXJfdHJhbnNmZXIgcnVucyBpbiAKKzsJYW4gaW5maW5pdGUgbG9vcC4KKzsJCisKK0VOVFJZIGRhdGFfdHJhbnNmZXIKK2RhdGFfdHJhbnNmZXI6CisgICAgSlVNUCBjbWRvdXRfY21kb3V0LCBXSEVOIENNRAorICAgIENBTEwgbXNnX2luLCBXSEVOIE1TR19JTgorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gTVNHX09VVAorICAgIEpVTVAgZG9fZGF0YW91dCwgV0hFTiBEQVRBX09VVAorICAgIEpVTVAgZG9fZGF0YWluLCBXSEVOIERBVEFfSU4KKyAgICBKVU1QIGNvbW1hbmRfY29tcGxldGUsIFdIRU4gU1RBVFVTCisgICAgSlVNUCBkYXRhX3RyYW5zZmVyCitFTlRSWSBlbmRfZGF0YV90cmFuc2ZlcgorZW5kX2RhdGFfdHJhbnNmZXI6CisKKzsKKzsgRklYTUU6IE9uIE5DUjUzYzcwMCBhbmQgTkNSNTNjNzAwLTY2IGNoaXBzLCBkb19kYXRhb3V0L2RvX2RhdGFpbiAKKzsgc2hvdWxkIGJlIGZpeGVkIHVwIHdoZW5ldmVyIHRoZSBuZXh1cyBjaGFuZ2VzIHNvIGl0IGNhbiBwb2ludCB0byB0aGUgCis7IGNvcnJlY3Qgcm91dGluZSBmb3IgdGhhdCBjb21tYW5kLgorOworCisjaWYgKENISVAgIT0gNzAwKSAmJiAoQ0hJUCAhPSA3MDA2NikKKzsgTmFzdHkganVtcCB0byBkc2EtPmRhdGFvdXQKK2RvX2RhdGFvdXQ6CisjaWYgKENISVAgPT0gNzEwKQorICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9zY3JhdGNoCisjZWxzZQorICAgIENBTEwgZHNhX3RvX3NjcmF0Y2gKKyNlbmRpZgorICAgIE1PVkUgU0NSQVRDSDAgKyBkc2FfZGF0YW91dCBUTyBTQ1JBVENIMAkKKyAgICBNT1ZFIFNDUkFUQ0gxICsgMCBUTyBTQ1JBVENIMSBXSVRIIENBUlJZIAorICAgIE1PVkUgU0NSQVRDSDIgKyAwIFRPIFNDUkFUQ0gyIFdJVEggQ0FSUlkgCisgICAgTU9WRSBTQ1JBVENIMyArIDAgVE8gU0NSQVRDSDMgV0lUSCBDQVJSWSAKKyAgICBETU9ERV9OQ1JfVE9fTUVNT1JZCisgICAgTU9WRSBNRU1PUlkgNCwgYWRkcl9zY3JhdGNoLCBkYXRhb3V0X3RvX2p1bXAgKyA0CisgICAgRE1PREVfTUVNT1JZX1RPX01FTU9SWQorZGF0YW91dF90b19qdW1wOgorICAgIE1PVkUgTUVNT1JZIDQsIDAsIGRhdGFvdXRfanVtcCArIDQgCisjaWYgKENISVAgPT0gNzEwKQorICAgIDsgVGltZSB0byBjb3JyZWN0IERTQSBmb2xsb3dpbmcgbWVtb3J5IG1vdmUKKyAgICBNT1ZFIE1FTU9SWSA0LCBzYXZlZF9kc2EsIGFkZHJfZHNhCisjZW5kaWYKK2RhdGFvdXRfanVtcDoKKyAgICBKVU1QIDAKKworOyBOYXN0eSBqdW1wIHRvIGRzYS0+ZHNhaW4KK2RvX2RhdGFpbjoKKyNpZiAoQ0hJUCA9PSA3MTApCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX3NjcmF0Y2gKKyNlbHNlCisgICAgQ0FMTCBkc2FfdG9fc2NyYXRjaAorI2VuZGlmCisgICAgTU9WRSBTQ1JBVENIMCArIGRzYV9kYXRhaW4gVE8gU0NSQVRDSDAJCisgICAgTU9WRSBTQ1JBVENIMSArIDAgVE8gU0NSQVRDSDEgV0lUSCBDQVJSWSAKKyAgICBNT1ZFIFNDUkFUQ0gyICsgMCBUTyBTQ1JBVENIMiBXSVRIIENBUlJZIAorICAgIE1PVkUgU0NSQVRDSDMgKyAwIFRPIFNDUkFUQ0gzIFdJVEggQ0FSUlkgCisgICAgRE1PREVfTkNSX1RPX01FTU9SWQorICAgIE1PVkUgTUVNT1JZIDQsIGFkZHJfc2NyYXRjaCwgZGF0YWluX3RvX2p1bXAgKyA0CisgICAgRE1PREVfTUVNT1JZX1RPX01FTU9SWQorRU5UUlkgZGF0YWluX3RvX2p1bXAKK2RhdGFpbl90b19qdW1wOgorICAgIE1PVkUgTUVNT1JZIDQsIDAsIGRhdGFpbl9qdW1wICsgNAorI2lmIChDSElQID09IDcxMCkKKyAgICA7IFRpbWUgdG8gY29ycmVjdCBEU0EgZm9sbG93aW5nIG1lbW9yeSBtb3ZlCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorI2VuZGlmCisjaWZkZWYgREVCVUcKKyAgICBJTlQgaW50X2RlYnVnX2RhdGFpbgorI2VuZGlmCitkYXRhaW5fanVtcDoKKyAgICBKVU1QIDAKKyNlbmRpZiAvKiAoQ0hJUCAhPSA3MDApICYmIChDSElQICE9IDcwMDY2KSAqLworCisKKzsgTm90ZSB0aGF0IG90aGVyX291dCBhbmQgb3RoZXJfaW4gbG9vcCB1bnRpbCBhIG5vbi1kYXRhIHBoYXNlCis7IGlzIGRpc2NvdmVyZWQsIHNvIHdlIG9ubHkgZXhlY3V0ZSByZXR1cm4gc3RhdGVtZW50cyB3aGVuIHdlCis7IGNhbiBnbyBvbiB0byB0aGUgbmV4dCBkYXRhIHBoYXNlIGJsb2NrIG1vdmUgc3RhdGVtZW50LgorCitFTlRSWSBvdGhlcl9vdXQKK290aGVyX291dDoKKyNpZiAwCisgICAgSU5UIDB4MDNmZmRlYWQKKyNlbmRpZgorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gQ01ECisgICAgSlVNUCBtc2dfaW5fcmVzdGFydCwgV0hFTiBNU0dfSU4gCisgICAgSU5UIGludF9lcnJfdW5leHBlY3RlZF9waGFzZSwgV0hFTiBNU0dfT1VUCisgICAgSU5UIGludF9lcnJfdW5leHBlY3RlZF9waGFzZSwgV0hFTiBEQVRBX0lOCisgICAgSlVNUCBjb21tYW5kX2NvbXBsZXRlLCBXSEVOIFNUQVRVUworICAgIEpVTVAgb3RoZXJfb3V0LCBXSEVOIE5PVCBEQVRBX09VVAorI2lmIChDSElQID09IDcxMCkKKzsgVEVNUCBzaG91bGQgYmUgT0ssIGFzIHdlIGdvdCBoZXJlIGZyb20gYSBjYWxsIGluIHRoZSB1c2VyIGRhdGFvdXQgY29kZS4KKyNlbmRpZgorICAgIFJFVFVSTgorCitFTlRSWSBvdGhlcl9pbgorb3RoZXJfaW46CisjaWYgMAorICAgIElOVCAweDAzZmZkZWFkCisjZW5kaWYKKyAgICBJTlQgaW50X2Vycl91bmV4cGVjdGVkX3BoYXNlLCBXSEVOIENNRAorICAgIEpVTVAgbXNnX2luX3Jlc3RhcnQsIFdIRU4gTVNHX0lOIAorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gTVNHX09VVAorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gREFUQV9PVVQKKyAgICBKVU1QIGNvbW1hbmRfY29tcGxldGUsIFdIRU4gU1RBVFVTCisgICAgSlVNUCBvdGhlcl9pbiwgV0hFTiBOT1QgREFUQV9JTgorI2lmIChDSElQID09IDcxMCkKKzsgVEVNUCBzaG91bGQgYmUgT0ssIGFzIHdlIGdvdCBoZXJlIGZyb20gYSBjYWxsIGluIHRoZSB1c2VyIGRhdGFpbiBjb2RlLgorI2VuZGlmCisgICAgUkVUVVJOCisKKworRU5UUlkgb3RoZXJfdHJhbnNmZXIKK290aGVyX3RyYW5zZmVyOgorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gQ01ECisgICAgQ0FMTCBtc2dfaW4sIFdIRU4gTVNHX0lOCisgICAgSU5UIGludF9lcnJfdW5leHBlY3RlZF9waGFzZSwgV0hFTiBNU0dfT1VUCisgICAgSU5UIGludF9lcnJfdW5leHBlY3RlZF9waGFzZSwgV0hFTiBEQVRBX09VVAorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gREFUQV9JTgorICAgIEpVTVAgY29tbWFuZF9jb21wbGV0ZSwgV0hFTiBTVEFUVVMKKyAgICBKVU1QIG90aGVyX3RyYW5zZmVyCisKKzsKKzsgbXNnX2luX3Jlc3RhcnQKKzsgbXNnX2luCis7IG11bmdlX21zZworOworOyBQVVJQT1NFIDogcHJvY2VzcyBtZXNzYWdlcyBmcm9tIGEgdGFyZ2V0LiAgbXNnX2luIGlzIGNhbGxlZCB3aGVuIHRoZSAKKzsJY2FsbGVyIGhhc24ndCByZWFkIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBtZXNzYWdlLiAgbXVuZ2VfbWVzc2FnZQorOwlpcyBjYWxsZWQgd2hlbiB0aGUgY2FsbGVyIGhhcyByZWFkIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBtZXNzYWdlLAorOwlhbmQgbGVmdCBpdCBpbiBTRkJSLiAgbXNnX2luX3Jlc3RhcnQgaXMgY2FsbGVkIHdoZW4gdGhlIGNhbGxlciAKKzsJaGFzbid0IHJlYWQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UsIGFuZCB3aXNoZXMgUkVUVVJOCis7CXRvIHRyYW5zZmVyIGNvbnRyb2wgYmFjayB0byB0aGUgYWRkcmVzcyBvZiB0aGUgY29uZGl0aW9uYWwKKzsJQ0FMTCBpbnN0cnVjdGlvbiByYXRoZXIgdGhhbiB0byB0aGUgaW5zdHJ1Y3Rpb24gYWZ0ZXIgaXQuCis7Cis7CVZhcmlvdXMgaW50XyogaW50ZXJydXB0cyBhcmUgZ2VuZXJhdGVkIHdoZW4gdGhlIGhvc3Qgc3lzdGVtCis7CW5lZWRzIHRvIGludGVydmVuZSwgYXMgaXMgdGhlIGNhc2Ugd2l0aCBTRFRSLCBXRFRSLCBhbmQKKzsJSU5JVElBVEUgUkVDT1ZFUlkgbWVzc2FnZXMuCis7Cis7CVdoZW4gdGhlIGhvc3Qgc3lzdGVtIGhhbmRsZXMgb25lIG9mIHRoZXNlIGludGVycnVwdHMsCis7CWl0IGNhbiByZXNwb25kIGJ5IHJlZW50ZXJpbmcgYXQgcmVqZWN0X21lc3NhZ2UsIAorOwl3aGljaCByZWplY3RzIHRoZSBtZXNzYWdlIGFuZCByZXR1cm5zIGNvbnRyb2wgdG8KKzsJdGhlIGNhbGxlciBvZiBtc2dfaW4gb3IgbXVuZ2VfbXNnLCBhY2NlcHRfbWVzc2FnZQorOwl3aGljaCBjbGVhcnMgQUNLIGFuZCByZXR1cm5zIGNvbnRyb2wsIG9yIHJlcGx5X21lc3NhZ2UKKzsJd2hpY2ggc2VuZHMgdGhlIG1lc3NhZ2UgcG9pbnRlZCB0byBieSB0aGUgRFNBIAorOwltc2dvdXRfb3RoZXIgdGFibGUgaW5kaXJlY3QgZmllbGQuCis7Cis7CURJU0NPTk5FQ1QgbWVzc2FnZXMgYXJlIGhhbmRsZWQgYnkgbW92aW5nIHRoZSBjb21tYW5kCis7CXRvIHRoZSByZWNvbm5lY3RfZHNhX3F1ZXVlLgorI2lmIChDSElQID09IDcxMCkKKzsgTk9URTogRFNBIHNob3VsZCBiZSB2YWxpZCB3aGVuIHdlIGdldCBoZXJlIC0gd2UgY2Fubm90IHNhdmUgYm90aCBpdAorOwlhbmQgVEVNUCBpbiB0aGlzIHJvdXRpbmUuCisjZW5kaWYKKzsKKzsgSU5QVVRTIDogRFNBIC0gU0NTSSBDT01NQU5ELCBTRkJSIC0gZmlyc3QgYnl0ZSBvZiBtZXNzYWdlIChtdW5nZV9tc2cKKzsJb25seSkKKzsKKzsgQ0FMTFMgOiBOTy4gIFRoZSBURU1QIHJlZ2lzdGVyIGlzbid0IGJhY2tlZCB1cCB0byBhbGxvdyBuZXN0ZWQgY2FsbHMuCis7Cis7IE1PRElGSUVTIDogU0NSQVRDSCwgRFNBIG9uIERJU0NPTk5FQ1QKKzsKKzsgRVhJVFMgOiBPbiByZWNlaXB0IG9mIFNBVkUgREFUQSBQT0lOVEVSLCBSRVNUT1JFIFBPSU5URVJTLAorOwlhbmQgbm9ybWFsIHJldHVybiBmcm9tIG1lc3NhZ2UgaGFuZGxlcnMgcnVubmluZyB1bmRlcgorOwlMaW51eCwgY29udHJvbCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiAgUmVjZWlwdAorOwlvZiBESVNDT05ORUNUIG1lc3NhZ2VzIHBhc3MgY29udHJvbCB0byBkc2Ffc2NoZWR1bGUuCis7CitFTlRSWSBtc2dfaW5fcmVzdGFydAorbXNnX2luX3Jlc3RhcnQ6Cis7IFhYWCAtIGhhY2tpc2gKKzsKKzsgU2luY2UgaXQncyBlYXNpZXIgdG8gZGVidWcgY2hhbmdlcyB0byB0aGUgc3RhdGljYWxseSAKKzsgY29tcGlsZWQgY29kZSwgcmF0aGVyIHRoYW4gdGhlIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCAKKzsgc3R1ZmYsIHN1Y2ggYXMKKzsKKzsgCU1PVkUgeCwgeSwgV0hFTiBkYXRhX3BoYXNlCis7IAlDQUxMIG90aGVyX3osIFdIRU4gTk9UIGRhdGFfcGhhc2UKKzsgCU1PVkUgeCwgeSwgV0hFTiBkYXRhX3BoYXNlCis7Cis7IEknZCBsaWtlIHRvIGhhdmUgY2VydGFpbiByb3V0aW5lcyAobm90YWJseSB0aGUgbWVzc2FnZSBoYW5kbGVyKQorOyByZXN0YXJ0IG9uIHRoZSBjb25kaXRpb25hbCBjYWxsIHJhdGhlciB0aGFuIHRoZSBuZXh0IGluc3RydWN0aW9uLgorOworOyBTbywgc3VidHJhY3QgOCBmcm9tIHRoZSByZXR1cm4gYWRkcmVzcworCisgICAgTU9WRSBURU1QMCArIDB4ZjggVE8gVEVNUDAKKyAgICBNT1ZFIFRFTVAxICsgMHhmZiBUTyBURU1QMSBXSVRIIENBUlJZCisgICAgTU9WRSBURU1QMiArIDB4ZmYgVE8gVEVNUDIgV0lUSCBDQVJSWQorICAgIE1PVkUgVEVNUDMgKyAweGZmIFRPIFRFTVAzIFdJVEggQ0FSUlkKKworRU5UUlkgbXNnX2luCittc2dfaW46CisgICAgTU9WRSAxLCBtc2dfYnVmLCBXSEVOIE1TR19JTgorCittdW5nZV9tc2c6CisgICAgSlVNUCBtdW5nZV9leHRlbmRlZCwgSUYgMHgwMQkJOyBFWFRFTkRFRCBNRVNTQUdFCisgICAgSlVNUCBtdW5nZV8yLCBJRiAweDIwLCBBTkQgTUFTSyAweGRmCTsgdHdvIGJ5dGUgbWVzc2FnZQorOworOyBYWFggLSBJJ3ZlIHNlZW4gYSBoYW5kZnVsIG9mIGJyb2tlbiBTQ1NJIGRldmljZXMgd2hpY2ggZmFpbCB0byBpc3N1ZQorOyAJYSBTQVZFIFBPSU5URVJTIG1lc3NhZ2UgYmVmb3JlIGRpc2Nvbm5lY3RpbmcgaW4gdGhlIG1pZGRsZSBvZiAKKzsgCWEgdHJhbnNmZXIsIGFzc3VtaW5nIHRoYXQgdGhlIERBVEEgUE9JTlRFUiB3aWxsIGJlIGltcGxpY2l0bHkgCis7IAlyZXN0b3JlZC4gIAorOworOyBIaXN0b3JpY2FsbHksIEkndmUgb2Z0ZW4gZG9uZSBhbiBpbXBsaWNpdCBzYXZlIHdoZW4gdGhlIERJU0NPTk5FQ1QKKzsgbWVzc2FnZSBpcyBwcm9jZXNzZWQuICBXZSBtYXkgd2FudCB0byBjb25zaWRlciBoYXZpbmcgdGhlIG9wdGlvbiBvZiAKKzsgZG9pbmcgdGhhdCBoZXJlLiAKKzsKKyAgICBKVU1QIG11bmdlX3NhdmVfZGF0YV9wb2ludGVyLCBJRiAweDAyCTsgU0FWRSBEQVRBIFBPSU5URVIKKyAgICBKVU1QIG11bmdlX3Jlc3RvcmVfcG9pbnRlcnMsIElGIDB4MDMJOyBSRVNUT1JFIFBPSU5URVJTIAorICAgIEpVTVAgbXVuZ2VfZGlzY29ubmVjdCwgSUYgMHgwNAkJOyBESVNDT05ORUNUCisgICAgSU5UIGludF9tc2dfMSwgSUYgMHgwNwkJCTsgTUVTU0FHRSBSRUpFQ1QKKyAgICBJTlQgaW50X21zZ18xLCBJRiAweDBmCQkJOyBJTklUSUFURSBSRUNPVkVSWQorI2lmZGVmIEVWRU5UUyAKKyAgICBJTlQgaW50X0VWRU5UX1NFTEVDVF9GQUlMRUQgCisjZW5kaWYKKyAgICBKVU1QIHJlamVjdF9tZXNzYWdlCisKK211bmdlXzI6CisgICAgSlVNUCByZWplY3RfbWVzc2FnZQorOworOyBUaGUgU0NTSSBzdGFuZGFyZCBhbGxvd3MgdGFyZ2V0cyB0byByZWNvdmVyIGZyb20gdHJhbnNpZW50IAorOyBlcnJvciBjb25kaXRpb25zIGJ5IGJhY2tpbmcgdXAgdGhlIGRhdGEgcG9pbnRlciB3aXRoIGEgCis7IFJFU1RPUkUgUE9JTlRFUlMgbWVzc2FnZS4gIAorOwkKKzsgU28sIHdlIG11c3Qgc2F2ZSBhbmQgcmVzdG9yZSB0aGUgX3Jlc2lkdWFsXyBjb2RlIGFzIHdlbGwgYXMgCis7IHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHBvaW50ZXIuICBCZWNhdXNlIG9mIHRoaXMgbWVzc2luZXNzLAorOyBpdCBpcyBzaW1wbGVyIHRvIHB1dCBkeW5hbWljIGNvZGUgaW4gdGhlIGRzYSBmb3IgdGhpcyBhbmQgdG8KKzsganVzdCBkbyBhIHNpbXBsZSBqdW1wIGRvd24gdGhlcmUuIAorOworCittdW5nZV9zYXZlX2RhdGFfcG9pbnRlcjoKKyNpZiAoQ0hJUCA9PSA3MTApCisgICAgOyBXZSBoYXZlIHNvbWV0aGluZyBpbiBURU1QIGhlcmUsIHNvIGZpcnN0IHdlIG11c3Qgc2F2ZSB0aGF0CisgICAgTU9WRSBURU1QMCBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gwCisgICAgTU9WRSBURU1QMSBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gxCisgICAgTU9WRSBURU1QMiBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gyCisgICAgTU9WRSBURU1QMyBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gzCisgICAgTU9WRSBNRU1PUlkgNCwgYWRkcl9zY3JhdGNoLCBqdW1wX3RlbXAgKyA0CisgICAgOyBOb3cgcmVzdG9yZSBEU0EKKyAgICBNT1ZFIE1FTU9SWSA0LCBzYXZlZF9kc2EsIGFkZHJfZHNhCisjZW5kaWYKKyAgICBNT1ZFIERTQTAgKyBkc2Ffc2F2ZV9kYXRhX3BvaW50ZXIgVE8gU0ZCUgorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMAorICAgIE1PVkUgRFNBMSArIDB4ZmYgVE8gU0ZCUiBXSVRIIENBUlJZCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gxCisgICAgTU9WRSBEU0EyICsgMHhmZiBUTyBTRkJSIFdJVEggQ0FSUlkgCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gyCisgICAgTU9WRSBEU0EzICsgMHhmZiBUTyBTRkJSIFdJVEggQ0FSUlkKKyAgICBNT1ZFIFNGQlIgVE8gU0NSQVRDSDMKKworICAgIERNT0RFX05DUl9UT19NRU1PUlkKKyAgICBNT1ZFIE1FTU9SWSA0LCBhZGRyX3NjcmF0Y2gsIGp1bXBfZHNhX3NhdmUgKyA0CisgICAgRE1PREVfTUVNT1JZX1RPX01FTU9SWQoranVtcF9kc2Ffc2F2ZToKKyAgICBKVU1QIDAKKworbXVuZ2VfcmVzdG9yZV9wb2ludGVyczoKKyNpZiAoQ0hJUCA9PSA3MTApCisgICAgOyBUaGUgY29kZSBhdCBkc2FfcmVzdG9yZV9wb2ludGVycyB3aWxsIFJFVFVSTiwgYnV0IHdlIGRvbid0IGNhcmUKKyAgICA7IGFib3V0IFRFTVAgaGVyZSwgYXMgaXQgd2lsbCBvdmVyd3JpdGUgaXQgYW55d2F5LgorI2VuZGlmCisgICAgTU9WRSBEU0EwICsgZHNhX3Jlc3RvcmVfcG9pbnRlcnMgVE8gU0ZCUgorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMAorICAgIE1PVkUgRFNBMSArIDB4ZmYgVE8gU0ZCUiBXSVRIIENBUlJZCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gxCisgICAgTU9WRSBEU0EyICsgMHhmZiBUTyBTRkJSIFdJVEggQ0FSUlkKKyAgICBNT1ZFIFNGQlIgVE8gU0NSQVRDSDIKKyAgICBNT1ZFIERTQTMgKyAweGZmIFRPIFNGQlIgV0lUSCBDQVJSWQorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMworCisgICAgRE1PREVfTkNSX1RPX01FTU9SWQorICAgIE1PVkUgTUVNT1JZIDQsIGFkZHJfc2NyYXRjaCwganVtcF9kc2FfcmVzdG9yZSArIDQKKyAgICBETU9ERV9NRU1PUllfVE9fTUVNT1JZCitqdW1wX2RzYV9yZXN0b3JlOgorICAgIEpVTVAgMAorCisKK211bmdlX2Rpc2Nvbm5lY3Q6CisjaWZkZWYgREVCVUcKKyAgICBJTlQgaW50X2RlYnVnX2Rpc2Nvbm5lY3RfbXNnCisjZW5kaWYKKworLyogCisgKiBCZWZvcmUsIHdlIG92ZXJsYXBwZWQgcHJvY2Vzc2luZyB3aXRoIHdhaXRpbmcgZm9yIGRpc2Nvbm5lY3QsIGJ1dAorICogZGVidWdnaW5nIHdhcyBiZWdpbm5pbmcgdG8gYXBwZWFyIG1lc3N5LiAgVGVtcG9yYXJpbHkgbW92ZSB0aGluZ3MKKyAqIHRvIGp1c3QgYmVmb3JlIHRoZSBXQUlUIERJU0NPTk5FQ1QuCisgKi8KKyAKKyNpZmRlZiBPUklHSU5BTAorI2lmIChDSElQID09IDcxMCkKKzsgRm9sbG93aW5nIGNsZWFycyBVbmV4cGVjdGVkIERpc2Nvbm5lY3QgYml0LiAgV2hhdCBkbyB3ZSBkbz8KKyNlbHNlCisgICAgTU9WRSBTQ05UTDIgJiAweDdmIFRPIFNDTlRMMgorI2VuZGlmCisgICAgQ0xFQVIgQUNLCisjZW5kaWYKKworI2lmIChDSElQICE9IDcwMCkgJiYgKENISVAgIT0gNzAwNjYpCisgICAgSlVNUCBkc2Ffc2NoZWR1bGUKKyNlbHNlCisgICAgV0FJVCBESVNDT05ORUNUCisgICAgSU5UIGludF9ub3JtX2Rpc2Nvbm5lY3RlZAorI2VuZGlmCisKK211bmdlX2V4dGVuZGVkOgorICAgIENMRUFSIEFDSworICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gTk9UIE1TR19JTgorICAgIE1PVkUgMSwgbXNnX2J1ZiArIDEsIFdIRU4gTVNHX0lOCisgICAgSlVNUCBtdW5nZV9leHRlbmRlZF8yLCBJRiAweDAyCisgICAgSlVNUCBtdW5nZV9leHRlbmRlZF8zLCBJRiAweDAzIAorICAgIEpVTVAgcmVqZWN0X21lc3NhZ2UKKworbXVuZ2VfZXh0ZW5kZWRfMjoKKyAgICBDTEVBUiBBQ0sKKyAgICBNT1ZFIDEsIG1zZ19idWYgKyAyLCBXSEVOIE1TR19JTgorICAgIEpVTVAgcmVqZWN0X21lc3NhZ2UsIElGIE5PVCAweDAyCTsgTXVzdCBiZSBXRFRSCisgICAgQ0xFQVIgQUNLCisgICAgTU9WRSAxLCBtc2dfYnVmICsgMywgV0hFTiBNU0dfSU4KKyAgICBJTlQgaW50X21zZ193ZHRyCisKK211bmdlX2V4dGVuZGVkXzM6CisgICAgQ0xFQVIgQUNLCisgICAgTU9WRSAxLCBtc2dfYnVmICsgMiwgV0hFTiBNU0dfSU4KKyAgICBKVU1QIHJlamVjdF9tZXNzYWdlLCBJRiBOT1QgMHgwMQk7IE11c3QgYmUgU0RUUgorICAgIENMRUFSIEFDSworICAgIE1PVkUgMiwgbXNnX2J1ZiArIDMsIFdIRU4gTVNHX0lOCisgICAgSU5UIGludF9tc2dfc2R0cgorCitFTlRSWSByZWplY3RfbWVzc2FnZQorcmVqZWN0X21lc3NhZ2U6CisgICAgU0VUIEFUTgorICAgIENMRUFSIEFDSworICAgIE1PVkUgMSwgTkNSNTNjN3h4X21zZ19yZWplY3QsIFdIRU4gTVNHX09VVAorICAgIFJFVFVSTgorCitFTlRSWSBhY2NlcHRfbWVzc2FnZQorYWNjZXB0X21lc3NhZ2U6CisgICAgQ0xFQVIgQVROCisgICAgQ0xFQVIgQUNLCisgICAgUkVUVVJOCisKK0VOVFJZIHJlc3BvbmRfbWVzc2FnZQorcmVzcG9uZF9tZXNzYWdlOgorICAgIFNFVCBBVE4KKyAgICBDTEVBUiBBQ0sKKyAgICBNT1ZFIEZST00gZHNhX21zZ291dF9vdGhlciwgV0hFTiBNU0dfT1VUCisgICAgUkVUVVJOCisKKzsKKzsgY29tbWFuZF9jb21wbGV0ZQorOworOyBQVVJQT1NFIDogaGFuZGxlIGNvbW1hbmQgdGVybWluYXRpb24gd2hlbiBTVEFUVVMgSU4gaXMgZGV0ZWN0ZWQgYnkgcmVhZGluZworOwlhIHN0YXR1cyBieXRlIGZvbGxvd2VkIGJ5IGEgY29tbWFuZCB0ZXJtaW5hdGlvbiBtZXNzYWdlLiAKKzsKKzsJTm9ybWFsIHRlcm1pbmF0aW9uIHJlc3VsdHMgaW4gYW4gSU5URkxZIGluc3RydWN0aW9uLCBhbmQgCis7CXRoZSBob3N0IHN5c3RlbSBjYW4gcGljayBvdXQgd2hpY2ggY29tbWFuZCB0ZXJtaW5hdGVkIGJ5IAorOwlleGFtaW5pbmcgdGhlIE1FU1NBR0UgYW5kIFNUQVRVUyBidWZmZXJzIG9mIGFsbCBjdXJyZW50bHkgCis7CWV4ZWN1dGluZyBjb21tYW5kczsKKzsKKzsJQWJub3JtYWwgKENIRUNLX0NPTkRJVElPTikgdGVybWluYXRpb24gcmVzdWx0cyBpbiBhbgorOwlpbnRfZXJyX2NoZWNrX2NvbmRpdGlvbiBpbnRlcnJ1cHQgc28gdGhhdCBhIFJFUVVFU1QgU0VOU0UKKzsJY29tbWFuZCBjYW4gYmUgaXNzdWVkIG91dC1vZi1vcmRlciBzbyB0aGF0IG5vIG90aGVyIGNvbW1hbmQKKzsJY2xlYXJzIHRoZSBjb250aW5nZW50IGFsbGVnaWFuY2UgY29uZGl0aW9uLgorOwkKKzsKKzsgSU5QVVRTIDogRFNBIC0gY29tbWFuZAkKKzsKKzsgQ0FMTFMgOiBPSworOworOyBFWElUUyA6IE9uIHN1Y2Nlc3NmdWwgdGVybWluYXRpb24sIGNvbnRyb2wgaXMgcGFzc2VkIHRvIHNjaGVkdWxlLgorOwlPbiBhYm5vcm1hbCB0ZXJtaW5hdGlvbiwgdGhlIHVzZXIgd2lsbCB1c3VhbGx5IG1vZGlmeSB0aGUgCis7CURTQSBmaWVsZHMgYW5kIGNvcnJlc3BvbmRpbmcgYnVmZmVycyBhbmQgcmV0dXJuIGNvbnRyb2wKKzsJdG8gc2VsZWN0LgorOworCitFTlRSWSBjb21tYW5kX2NvbXBsZXRlCitjb21tYW5kX2NvbXBsZXRlOgorICAgIE1PVkUgRlJPTSBkc2Ffc3RhdHVzLCBXSEVOIFNUQVRVUworI2lmIChDSElQICE9IDcwMCkgJiYgKENISVAgIT0gNzAwNjYpCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gwCQk7IFNhdmUgc3RhdHVzCisjZW5kaWYgLyogKENISVAgIT0gNzAwKSAmJiAoQ0hJUCAhPSA3MDA2NikgKi8KK0VOVFJZIGNvbW1hbmRfY29tcGxldGVfbXNnaW4KK2NvbW1hbmRfY29tcGxldGVfbXNnaW46CisgICAgTU9WRSBGUk9NIGRzYV9tc2dpbiwgV0hFTiBNU0dfSU4KKzsgSW5kaWNhdGUgdGhhdCB3ZSBzaG91bGQgYmUgZXhwZWN0aW5nIGEgZGlzY29ubmVjdAorI2lmIChDSElQICE9IDcxMCkKKyAgICBNT1ZFIFNDTlRMMiAmIDB4N2YgVE8gU0NOVEwyCisjZWxzZQorICAgIDsgQWJvdmUgY29kZSBjbGVhcmVkIHRoZSBVbmV4cGVjdGVkIERpc2Nvbm5lY3QgYml0LCB3aGF0IGRvIHdlIGRvPworI2VuZGlmCisgICAgQ0xFQVIgQUNLCisjaWYgKENISVAgIT0gNzAwKSAmJiAoQ0hJUCAhPSA3MDA2NikKKyAgICBXQUlUIERJU0NPTk5FQ1QKKworOworOyBUaGUgU0NTSSBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0IHdoZW4gYSBVTklUIEFUVEVOVElPTiBjb25kaXRpb24KKzsgaXMgcGVuZGluZywgYXMgaW5kaWNhdGVkIGJ5IGEgQ0hFQ0sgQ09ORElUSU9OIHN0YXR1cyBtZXNzYWdlLAorOyB0aGUgdGFyZ2V0IHNoYWxsIHJldmVydCB0byBhc3luY2hyb25vdXMgdHJhbnNmZXJzLiAgU2luY2UKKzsgc3luY2hyb25vdXMgdHJhbnNmZXJzIHBhcmFtZXRlcnMgYXJlIG1haW50YWluZWQgb24gYSBwZXIgSU5JVElBVE9SL1RBUkdFVCAKKzsgYmFzaXMsIGFuZCByZXR1cm5pbmcgY29udHJvbCB0byBvdXIgc2NoZWR1bGVyIGNvdWxkIHdvcmsgb24gYSBjb21tYW5kCis7IHJ1bm5pbmcgb24gYW5vdGhlciBsdW4gb24gdGhhdCB0YXJnZXQgdXNpbmcgdGhlIG9sZCBwYXJhbWV0ZXJzLCB3ZSBtdXN0Cis7IGludGVycnVwdCB0aGUgaG9zdCBwcm9jZXNzb3IgdG8gZ2V0IHRoZW0gY2hhbmdlZCwgb3IgY2hhbmdlIHRoZW0gb3Vyc2VsdmVzLgorOworOyBPbmNlIFNDU0ktSUkgdGFnZ2VkIHF1ZXVlaW5nIGlzIGltcGxlbWVudGVkLCB0aGluZ3Mgd2lsbCBiZSBldmVuIG1vcmUKKzsgaGFpcnksIHNpbmNlIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb25zIGV4aXN0IG9uIGEgcGVyLXRhcmdldC9sdW4KKzsgYmFzaXMsIGFuZCBpc3N1aW5nIGEgbmV3IGNvbW1hbmQgd2l0aCBhIGRpZmZlcmVudCB0YWcgd291bGQgY2xlYXIgaXQuCis7IEluIHRoZXNlIGNhc2VzLCB3ZSBtdXN0IGludGVycnVwdCB0aGUgaG9zdCBwcm9jZXNzb3IgdG8gZ2V0IGEgcmVxdWVzdCAKKzsgYWRkZWQgdG8gdGhlIEhFQUQgb2YgdGhlIHF1ZXVlIHdpdGggdGhlIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZCwgb3Igd2UKKzsgbXVzdCBhdXRvbWF0aWNhbGx5IGlzc3VlIHRoZSByZXF1ZXN0IHNlbnNlIGNvbW1hbmQuCisKKyNpZiAwCisgICAgTU9WRSBTQ1JBVENIMCBUTyBTRkJSCQkJCisgICAgSlVNUCBjb21tYW5kX2ZhaWxlZCwgSUYgMHgwMgorI2VuZGlmCisjaWYgKENISVAgPT0gNzEwKQorI2lmIGRlZmluZWQoTVZNRTE2eF9JTlRGTFkpCis7IEZvciBNVk1FMTZ4IChpZSBDSElQPTcxMCkgd2Ugd2lsbCBmb3JjZSBhbiBJTlRGTFkgYnkgdHJpZ2dlcmluZyBhIHNvZnR3YXJlCis7IGludGVycnVwdCAoU1c3KS4gIFdlIGNhbiB1c2UgU0NSQVRDSCwgYXMgd2UgYXJlIGFib3V0IHRvIGp1bXAgdG8KKzsgc2NoZWR1bGUsIHdoaWNoIGNvcnJ1cHRzIGl0IGFueXdheS4gIFdpbGwgcHJvYmFibHkgcmVtb3ZlIHRoaXMgbGF0ZXIsCis7IGJ1dCB3YW50IHRvIGNoZWNrIHBlcmZvcm1hbmNlIGVmZmVjdHMgZmlyc3QuCisKKyNkZWZpbmUgSU5URkxZX0FERFIgICAgIDB4ZmZmNDAwNzAKKworICAgIE1PVkUgMCBUTyBTQ1JBVENIMAorICAgIE1PVkUgMHg4MCBUTyBTQ1JBVENIMQorICAgIE1PVkUgMCBUTyBTQ1JBVENIMgorICAgIE1PVkUgMCBUTyBTQ1JBVENIMworICAgIE1PVkUgTUVNT1JZIDQsIGFkZHJfc2NyYXRjaCwgSU5URkxZX0FERFIKKyNlbHNlCisgICAgSU5UIGludF9ub3JtX2VtdWxhdGVpbnRmbHkKKyNlbmRpZgorI2Vsc2UKKyAgICBJTlRGTFkKKyNlbmRpZgorI2VuZGlmIC8qIChDSElQICE9IDcwMCkgJiYgKENISVAgIT0gNzAwNjYpICovCisjaWYgKENISVAgPT0gNzEwKQorICAgIDsgVGltZSB0byBjb3JyZWN0IERTQSBmb2xsb3dpbmcgbWVtb3J5IG1vdmUKKyAgICBNT1ZFIE1FTU9SWSA0LCBzYXZlZF9kc2EsIGFkZHJfZHNhCisjZW5kaWYKKyNpZmRlZiBFVkVOVFMKKyAgICBJTlQgaW50X0VWRU5UX0NPTVBMRVRFCisjZW5kaWYKKyNpZiAoQ0hJUCAhPSA3MDApICYmIChDSElQICE9IDcwMDY2KQorICAgIEpVTVAgc2NoZWR1bGUKK2NvbW1hbmRfZmFpbGVkOgorICAgIElOVCBpbnRfZXJyX2NoZWNrX2NvbmRpdGlvbgorI2Vsc2UKKyAgICBJTlQgaW50X25vcm1fY29tbWFuZF9jb21wbGV0ZQorI2VuZGlmCisKKzsKKzsgd2FpdF9yZXNlbGVjdAorOworOyBQVVJQT1NFIDogVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgaWRsZSByb3V0aW5lLCB3aGVyZSBjb250cm9sIGxhbmRzCis7CXdoZW4gdGhlcmUgYXJlIG5vIG5ldyBwcm9jZXNzZXMgdG8gc2NoZWR1bGUuICB3YWl0X3Jlc2VsZWN0Cis7CXdhaXRzIGZvciByZXNlbGVjdGlvbiwgc2VsZWN0aW9uLCBhbmQgbmV3IGNvbW1hbmRzLgorOworOwlXaGVuIGEgc3VjY2Vzc2Z1bCByZXNlbGVjdGlvbiBvY2N1cnMsIHdpdGggdGhlIGFpZCAKKzsJb2YgZml4ZWQgdXAgY29kZSBpbiBlYWNoIERTQSwgd2FpdF9yZXNlbGVjdCB3YWxrcyB0aGUgCis7CXJlY29ubmVjdF9kc2FfcXVldWUsIGFza2luZyBlYWNoIGRzYSBpZiB0aGUgdGFyZ2V0IElECis7CWFuZCBMVU4gbWF0Y2ggaXRzLgorOworOwlJZiBhIG1hdGNoIGlzIGZvdW5kLCBhIGNhbGwgaXMgbWFkZSBiYWNrIHRvIHJlc2VsZWN0ZWRfb2ssCis7CXdoaWNoIHRocm91Z2ggdGhlIG1pcmFjbGVzIG9mIHNlbGYgbW9kaWZ5aW5nIGNvZGUsIGV4dHJhY3RzCis7CXRoZSBmb3VuZCBEU0EgZnJvbSB0aGUgcmVjb25uZWN0X2RzYV9xdWV1ZSBhbmQgdGhlbiAKKzsJcmV0dXJucyBjb250cm9sIHRvIHRoZSBEU0FzIHRocmVhZCBvZiBleGVjdXRpb24uCis7Cis7IElOUFVUUyA6IE5PTkUKKzsKKzsgQ0FMTFMgOiBPSworOworOyBNT0RJRklFUyA6IERTQSwKKzsKKzsgRVhJVFMgOiBPbiBzdWNjZXNzZnVsIHJlc2VsZWN0aW9uLCBjb250cm9sIGlzIHJldHVybmVkIHRvIHRoZSAKKzsJRFNBIHdoaWNoIGNhbGxlZCByZXNlbGVjdGVkX29rLiAgSWYgdGhlIFdBSVQgUkVTRUxFQ1QKKzsJd2FzIGludGVycnVwdGVkIGJ5IGEgbmV3IGNvbW1hbmRzIGFycml2YWwgc2lnbmFsZWQgYnkgCis7CVNJR19QLCBjb250cm9sIGlzIHBhc3NlZCB0byBzY2hlZHVsZS4gIElmIHRoZSBOQ1IgaXMgCis7CXNlbGVjdGVkLCB0aGUgaG9zdCBzeXN0ZW0gaXMgaW50ZXJydXB0ZWQgd2l0aCBhbiAKKzsJaW50X2Vycl9zZWxlY3RlZCB3aGljaCBpcyB1c3VhbGx5IHJlc3BvbmRlZCB0byBieQorOwlzZXR0aW5nIERTUCB0byB0aGUgdGFyZ2V0X2Fib3J0IGFkZHJlc3MuCisKK0VOVFJZIHdhaXRfcmVzZWxlY3QKK3dhaXRfcmVzZWxlY3Q6CisjaWZkZWYgRVZFTlRTCisgICAgaW50IGludF9FVkVOVF9JRExFCisjZW5kaWYKKyNpZmRlZiBERUJVRworICAgIGludCBpbnRfZGVidWdfaWRsZQorI2VuZGlmCisgICAgV0FJVCBSRVNFTEVDVCB3YWl0X3Jlc2VsZWN0X2ZhaWxlZAorCityZXNlbGVjdGVkOgorI2lmZGVmIEVWRU5UUworICAgIGludCBpbnRfRVZFTlRfUkVTRUxFQ1QKKyNlbmRpZgorICAgIENMRUFSIFRBUkdFVAorICAgIERNT0RFX01FTU9SWV9UT19NRU1PUlkKKyAgICA7IFJlYWQgYWxsIGRhdGEgbmVlZGVkIHRvIHJlZXN0YWJsaXNoIHRoZSBuZXh1cyAtIAorICAgIE1PVkUgMSwgcmVzZWxlY3RlZF9pZGVudGlmeSwgV0hFTiBNU0dfSU4KKyAgICA7IFdlIHVzZWQgdG8gQ0xFQVIgQUNLIGhlcmUuCisjaWYgKENISVAgIT0gNzAwKSAmJiAoQ0hJUCAhPSA3MDA2NikKKyNpZmRlZiBERUJVRworICAgIGludCBpbnRfZGVidWdfcmVzZWxlY3RlZAorI2VuZGlmCisKKyAgICA7IFBvaW50IERTQSBhdCB0aGUgY3VycmVudCBoZWFkIG9mIHRoZSBkaXNjb25uZWN0ZWQgcXVldWUuCisgICAgRE1PREVfTUVNT1JZX1RPX05DUgorICAgIE1PVkUgTUVNT1JZIDQsIHJlY29ubmVjdF9kc2FfaGVhZCwgYWRkcl9zY3JhdGNoCisgICAgRE1PREVfTUVNT1JZX1RPX01FTU9SWQorI2lmIChDSElQID09IDcxMCkKKyAgICBNT1ZFIE1FTU9SWSA0LCBhZGRyX3NjcmF0Y2gsIHNhdmVkX2RzYQorI2Vsc2UKKyAgICBDQUxMIHNjcmF0Y2hfdG9fZHNhCisjZW5kaWYKKworICAgIDsgRml4IHRoZSB1cGRhdGUtbmV4dCBwb2ludGVyIHNvIHRoYXQgdGhlIHJlY29ubmVjdF9kc2FfaGVhZAorICAgIDsgcG9pbnRlciBpcyB0aGUgb25lIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGlmIHRoaXMgRFNBIGlzIGEgaGl0IAorICAgIDsgYW5kIHdlIHJlbW92ZSBpdCBmcm9tIHRoZSBxdWV1ZS4KKworICAgIE1PVkUgTUVNT1JZIDQsIGFkZHJfcmVjb25uZWN0X2RzYV9oZWFkLCByZXNlbGVjdGVkX29rX3BhdGNoICsgOAorI2lmIChDSElQID09IDcxMCkKKyAgICA7IFRpbWUgdG8gY29ycmVjdCBEU0EgZm9sbG93aW5nIG1lbW9yeSBtb3ZlCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorI2VuZGlmCisKK0VOVFJZIHJlc2VsZWN0ZWRfY2hlY2tfbmV4dAorcmVzZWxlY3RlZF9jaGVja19uZXh0OgorI2lmZGVmIERFQlVHCisgICAgSU5UIGludF9kZWJ1Z19yZXNlbGVjdF9jaGVjaworI2VuZGlmCisgICAgOyBDaGVjayBmb3IgYSBOVUxMIHBvaW50ZXIuCisgICAgTU9WRSBEU0EwIFRPIFNGQlIKKyAgICBKVU1QIHJlc2VsZWN0ZWRfbm90X2VuZCwgSUYgTk9UIDAKKyAgICBNT1ZFIERTQTEgVE8gU0ZCUgorICAgIEpVTVAgcmVzZWxlY3RlZF9ub3RfZW5kLCBJRiBOT1QgMAorICAgIE1PVkUgRFNBMiBUTyBTRkJSCisgICAgSlVNUCByZXNlbGVjdGVkX25vdF9lbmQsIElGIE5PVCAwCisgICAgTU9WRSBEU0EzIFRPIFNGQlIKKyAgICBKVU1QIHJlc2VsZWN0ZWRfbm90X2VuZCwgSUYgTk9UIDAKKyAgICBJTlQgaW50X2Vycl91bmV4cGVjdGVkX3Jlc2VsZWN0CisKK3Jlc2VsZWN0ZWRfbm90X2VuZDoKKyAgICA7CisgICAgOyBYWFggdGhlIEFMVSBpcyBvbmx5IGVpZ2h0IGJpdHMgd2lkZSwgYW5kIHRoZSBhc3NlbWJsZXIKKyAgICA7IHdvbnQgZG8gdGhlIGRpcnQgd29yayBmb3IgdXMuICBBcyBsb25nIGFzIGRzYV9jaGVja19yZXNlbGVjdAorICAgIDsgaXMgbmVnYXRpdmUsIHdlIG5lZWQgdG8gc2lnbiBleHRlbmQgd2l0aCAxIGJpdHMgdG8gdGhlIGZ1bGwKKyAgICA7IDMyIGJpdCB3aWR0aCBvZiB0aGUgYWRkcmVzcy4KKyAgICA7CisgICAgOyBBIHBvdGVudGlhbCB3b3JrIGFyb3VuZCB3b3VsZCBiZSB0byBoYXZlIGEga25vd24gYWxpZ25tZW50IAorICAgIDsgb2YgdGhlIERTQSBzdHJ1Y3R1cmUgc3VjaCB0aGF0IHRoZSBiYXNlIGFkZHJlc3MgcGx1cyAKKyAgICA7IGRzYV9jaGVja19yZXNlbGVjdCBkb2Vzbid0IHJlcXVpcmUgY2FycnlpbmcgZnJvbSBieXRlcyAKKyAgICA7IGhpZ2hlciB0aGFuIHRoZSBMU0IuCisgICAgOworCisgICAgTU9WRSBEU0EwIFRPIFNGQlIKKyAgICBNT1ZFIFNGQlIgKyBkc2FfY2hlY2tfcmVzZWxlY3QgVE8gU0NSQVRDSDAKKyAgICBNT1ZFIERTQTEgVE8gU0ZCUgorICAgIE1PVkUgU0ZCUiArIDB4ZmYgVE8gU0NSQVRDSDEgV0lUSCBDQVJSWQorICAgIE1PVkUgRFNBMiBUTyBTRkJSCisgICAgTU9WRSBTRkJSICsgMHhmZiBUTyBTQ1JBVENIMiBXSVRIIENBUlJZCisgICAgTU9WRSBEU0EzIFRPIFNGQlIKKyAgICBNT1ZFIFNGQlIgKyAweGZmIFRPIFNDUkFUQ0gzIFdJVEggQ0FSUlkKKworICAgIERNT0RFX05DUl9UT19NRU1PUlkKKyAgICBNT1ZFIE1FTU9SWSA0LCBhZGRyX3NjcmF0Y2gsIHJlc2VsZWN0ZWRfY2hlY2sgKyA0CisgICAgRE1PREVfTUVNT1JZX1RPX01FTU9SWQorI2lmIChDSElQID09IDcxMCkKKyAgICA7IFRpbWUgdG8gY29ycmVjdCBEU0EgZm9sbG93aW5nIG1lbW9yeSBtb3ZlCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorI2VuZGlmCityZXNlbGVjdGVkX2NoZWNrOgorICAgIEpVTVAgMAorCisKKzsKKzsKKyNpZiAoQ0hJUCA9PSA3MTApCis7IFdlIGhhdmUgcHJvYmxlbXMgaGVyZSAtIHRoZSBtZW1vcnkgbW92ZSBjb3JydXB0cyBURU1QIGFuZCBEU0EuICBUaGlzCis7IHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gRFNBIGNvZGUsIGFuZCBwYXRjaGVkIGZyb20gbWFueSBwbGFjZXMuICBTY3JhdGNoCis7IGlzIHByb2JhYmx5IGZyZWUgd2hlbiBpdCBpcyBjYWxsZWQuCis7IFdlIGhhdmUgdG86Cis7ICAgY29weSB0ZW1wIHRvIHNjcmF0Y2gsIG9uZSBieXRlIGF0IGEgdGltZQorOyAgIHdyaXRlIHNjcmF0Y2ggdG8gcGF0Y2ggYSBqdW1wIGluIHBsYWNlIG9mIHRoZSByZXR1cm4KKzsgICBkbyB0aGUgbW92ZSBtZW1vcnkKKzsgICBqdW1wIHRvIHRoZSBwYXRjaGVkIGluIHJldHVybiBhZGRyZXNzCis7IERTQSBpcyBjb3JydXB0IHdoZW4gd2UgZ2V0IGhlcmUsIGFuZCBjYW4gYmUgbGVmdCBjb3JydXB0CisKK0VOVFJZIHJlc2VsZWN0ZWRfb2sKK3Jlc2VsZWN0ZWRfb2s6CisgICAgTU9WRSBURU1QMCBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gwCisgICAgTU9WRSBURU1QMSBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gxCisgICAgTU9WRSBURU1QMiBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gyCisgICAgTU9WRSBURU1QMyBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gzCisgICAgTU9WRSBNRU1PUlkgNCwgYWRkcl9zY3JhdGNoLCByZXNlbGVjdGVkX29rX2p1bXAgKyA0CityZXNlbGVjdGVkX29rX3BhdGNoOgorICAgIE1PVkUgTUVNT1JZIDQsIDAsIDAKK3Jlc2VsZWN0ZWRfb2tfanVtcDoKKyAgICBKVU1QIDAKKyNlbHNlCitFTlRSWSByZXNlbGVjdGVkX29rCityZXNlbGVjdGVkX29rOgorcmVzZWxlY3RlZF9va19wYXRjaDoKKyAgICBNT1ZFIE1FTU9SWSA0LCAwLCAwCQkJCTsgUGF0Y2hlZCA6IGZpcnN0IHdvcmQKKwkJCQkJCTsgCWlzIGFkZHJlc3Mgb2YgCisJCQkJCQk7ICAgICAgIHN1Y2Nlc3NmdWwgZHNhX25leHQKKwkJCQkJCTsgU2Vjb25kIHdvcmQgaXMgbGFzdCAKKwkJCQkJCTsJdW5zdWNjZXNzZnVsIGRzYV9uZXh0LAorCQkJCQkJOwlzdGFydGluZyB3aXRoIAorCQkJCQkJOyAgICAgICBkc2FfcmVjb25uZWN0X2hlYWQKKyAgICA7IFdlIHVzZWQgdG8gQ0xFQVIgQUNLIGhlcmUuCisjaWZkZWYgREVCVUcKKyAgICBJTlQgaW50X2RlYnVnX3Jlc2VsZWN0ZWRfb2sKKyNlbmRpZgorI2lmZGVmIERFQlVHCisgICAgSU5UIGludF9kZWJ1Z19jaGVja19kc2EKKyNlbmRpZgorICAgIFJFVFVSTgkJCQkJOyBSZXR1cm4gY29udHJvbCB0byB3aGVyZQorI2VuZGlmCisjZWxzZQorICAgIElOVCBpbnRfbm9ybV9yZXNlbGVjdGVkCisjZW5kaWYgLyogKENISVAgIT0gNzAwKSAmJiAoQ0hJUCAhPSA3MDA2NikgKi8KKworc2VsZWN0ZWQ6CisgICAgSU5UIGludF9lcnJfc2VsZWN0ZWQ7CisKKzsKKzsgQSBzZWxlY3Qgb3IgcmVzZWxlY3QgZmFpbHVyZSBjYW4gYmUgY2F1c2VkIGJ5IG9uZSBvZiB0d28gY29uZGl0aW9ucyA6IAorOyAxLiAgU0lHX1Agd2FzIHNldC4gIFRoaXMgd2lsbCBiZSB0aGUgY2FzZSBpZiB0aGUgdXNlciBoYXMgd3JpdHRlbgorOwlhIG5ldyB2YWx1ZSB0byBhIHByZXZpb3VzbHkgTlVMTCBoZWFkIG9mIHRoZSBpc3N1ZSBxdWV1ZS4KKzsKKzsgMi4gIFRoZSBOQ1I1M2M4MTAgd2FzIHNlbGVjdGVkIG9yIHJlc2VsZWN0ZWQgYnkgYW5vdGhlciBkZXZpY2UuCis7Cis7IDMuICBUaGUgYnVzIHdhcyBhbHJlYWR5IGJ1c3kgc2luY2Ugd2Ugd2VyZSBzZWxlY3RlZCBvciByZXNlbGVjdGVkCis7CWJlZm9yZSBzdGFydGluZyB0aGUgY29tbWFuZC4KKword2FpdF9yZXNlbGVjdF9mYWlsZWQ6CisjaWZkZWYgRVZFTlRTIAorCUlOVCBpbnRfRVZFTlRfUkVTRUxFQ1RfRkFJTEVECisjZW5kaWYKKzsgQ2hlY2sgc2VsZWN0ZWQgYml0LiAgCisjaWYgKENISVAgPT0gNzEwKQorICAgIDsgTXVzdCB3b3JrIG91dCBob3cgdG8gdGVsbCBpZiB3ZSBhcmUgc2VsZWN0ZWQuLi4uCisjZWxzZQorICAgIE1PVkUgU0lTVDAgJiAweDIwIFRPIFNGQlIKKyAgICBKVU1QIHNlbGVjdGVkLCBJRiAweDIwCisjZW5kaWYKKzsgUmVhZGluZyBDVEVTVDIgY2xlYXJzIHRoZSBTSUdfUCBiaXQgaW4gdGhlIElTVEFUIHJlZ2lzdGVyLgorICAgIE1PVkUgQ1RFU1QyICYgMHg0MCBUTyBTRkJSCQorICAgIEpVTVAgc2NoZWR1bGUsIElGIDB4NDAKKzsgQ2hlY2sgY29ubmVjdGVkIGJpdC4gIAorOyBGSVhNRTogdGhpcyBuZWVkcyB0byBjaGFuZ2UgaWYgd2Ugc3VwcG9ydCB0YXJnZXQgbW9kZQorICAgIE1PVkUgSVNUQVQgJiAweDA4IFRPIFNGQlIKKyAgICBKVU1QIHJlc2VsZWN0ZWQsIElGIDB4MDgKKzsgRklYTUUgOiBTb21ldGhpbmcgYm9ndXMgaGFwcGVuZWQsIGFuZCB3ZSBzaG91bGRuJ3QgZmFpbCBzaWxlbnRseS4KKyNpZiAwCisgICAgSlVNUCBzY2hlZHVsZQorI2Vsc2UKKyAgICBJTlQgaW50X2RlYnVnX3BhbmljCisjZW5kaWYKKworCitzZWxlY3RfZmFpbGVkOgorI2lmIChDSElQID09IDcxMCkKKyAgICA7IERpc2FibGUgc2VsZWN0aW9uIHRpbWVyCisgICAgTU9WRSBDVEVTVDcgfCAweDEwIFRPIENURVNUNworI2VuZGlmCisjaWZkZWYgRVZFTlRTCisgIGludCBpbnRfRVZFTlRfU0VMRUNUX0ZBSUxFRAorI2VuZGlmCis7IE90aGVyd2lzZSwgbWFzayB0aGUgc2VsZWN0ZWQgYW5kIHJlc2VsZWN0ZWQgYml0cyBvZmYgU0lTVDAKKyNpZiAoQ0hJUCA9PTcxMCkKKyAgICA7IExldCdzIGFzc3VtZSB3ZSBkb24ndCBnZXQgc2VsZWN0ZWQgZm9yIG5vdworICAgIE1PVkUgU1NUQVQwICYgMHgxMCBUTyBTRkJSCisjZWxzZQorICAgIE1PVkUgU0lTVDAgJiAweDMwIFRPIFNGQlIKKyAgICBKVU1QIHNlbGVjdGVkLCBJRiAweDIwCisjZW5kaWYKKyAgICBKVU1QIHJlc2VsZWN0ZWQsIElGIDB4MTAgCis7IElmIFNJR1AgaXMgc2V0LCB0aGUgdXNlciBqdXN0IGdhdmUgdXMgYW5vdGhlciBjb21tYW5kLCBhbmQKKzsgd2Ugc2hvdWxkIHJlc3RhcnQgb3IgcmV0dXJuIHRvIHRoZSBzY2hlZHVsZXIuCis7IFJlYWRpbmcgQ1RFU1QyIGNsZWFycyB0aGUgU0lHX1AgYml0IGluIHRoZSBJU1RBVCByZWdpc3Rlci4KKyAgICBNT1ZFIENURVNUMiAmIDB4NDAgVE8gU0ZCUgkKKyAgICBKVU1QIHNlbGVjdCwgSUYgMHg0MAorOyBDaGVjayBjb25uZWN0ZWQgYml0LiAgCis7IEZJWE1FOiB0aGlzIG5lZWRzIHRvIGNoYW5nZSBpZiB3ZSBzdXBwb3J0IHRhcmdldCBtb2RlCis7IEZJWE1FOiBpcyB0aGlzIHJlYWxseSBuZWNlc3Nhcnk/IAorICAgIE1PVkUgSVNUQVQgJiAweDA4IFRPIFNGQlIKKyAgICBKVU1QIHJlc2VsZWN0ZWQsIElGIDB4MDgKKzsgRklYTUUgOiBTb21ldGhpbmcgYm9ndXMgaGFwcGVuZWQsIGFuZCB3ZSBzaG91bGRuJ3QgZmFpbCBzaWxlbnRseS4KKyNpZiAwCisgICAgSlVNUCBzY2hlZHVsZQorI2Vsc2UKKyAgICBJTlQgaW50X2RlYnVnX3BhbmljCisjZW5kaWYKKworOworOyB0ZXN0XzEKKzsgdGVzdF8yCis7Cis7IFBVUlBPU0UgOiBydW4gc29tZSB2ZXJpZmljYXRpb24gdGVzdHMgb24gdGhlIE5DUi4gIHRlc3RfMQorOwljb3BpZXMgdGVzdF9zcmMgdG8gdGVzdF9kZXN0IGFuZCBpbnRlcnJ1cHRzIHRoZSBob3N0Cis7CXByb2Nlc3NvciwgdGVzdGluZyBmb3IgY2FjaGUgY29oZXJlbmN5IGFuZCBpbnRlcnJ1cHQKKzsgCXByb2JsZW1zIGluIHRoZSBwcm9jZXNzZXMuCis7Cis7CXRlc3RfMiBydW5zIGEgY29tbWFuZCB3aXRoIG9mZnNldHMgcmVsYXRpdmUgdG8gdGhlIAorOwlEU0Egb24gZW50cnksIGFuZCBpcyB1c2VmdWwgZm9yIG1pc2NlbGxhbmVvdXMgZXhwZXJpbWVudGF0aW9uLgorOworCis7IFZlcmlmeSB0aGF0IGludGVycnVwdHMgYXJlIHdvcmtpbmcgY29ycmVjdGx5IGFuZCB0aGF0IHdlIGRvbid0IAorOyBoYXZlIGEgY2FjaGUgaW52YWxpZGF0aW9uIHByb2JsZW0uCisKK0FCU09MVVRFIHRlc3Rfc3JjID0gMCwgdGVzdF9kZXN0ID0gMAorRU5UUlkgdGVzdF8xCit0ZXN0XzE6CisgICAgTU9WRSBNRU1PUlkgNCwgdGVzdF9zcmMsIHRlc3RfZGVzdAorICAgIElOVCBpbnRfdGVzdF8xCisKKzsKKzsgUnVuIGFyYml0cmFyeSBjb21tYW5kcywgd2l0aCB0ZXN0IGNvZGUgZXN0YWJsaXNoaW5nIGEgRFNBCis7CisgCitFTlRSWSB0ZXN0XzIKK3Rlc3RfMjoKKyAgICBDTEVBUiBUQVJHRVQKKyNpZiAoQ0hJUCA9PSA3MTApCisgICAgOyBFbmFibGUgc2VsZWN0aW9uIHRpbWVyCisjaWZkZWYgTk9fU0VMRUNUSU9OX1RJTUVPVVQKKyAgICBNT1ZFIENURVNUNyAmIDB4ZmYgVE8gQ1RFU1Q3CisjZWxzZQorICAgIE1PVkUgQ1RFU1Q3ICYgMHhlZiBUTyBDVEVTVDcKKyNlbmRpZgorI2VuZGlmCisgICAgU0VMRUNUIEFUTiBGUk9NIDAsIHRlc3RfMl9mYWlsCisgICAgSlVNUCB0ZXN0XzJfbXNnb3V0LCBXSEVOIE1TR19PVVQKK0VOVFJZIHRlc3RfMl9tc2dvdXQKK3Rlc3RfMl9tc2dvdXQ6CisjaWYgKENISVAgPT0gNzEwKQorICAgIDsgRGlzYWJsZSBzZWxlY3Rpb24gdGltZXIKKyAgICBNT1ZFIENURVNUNyB8IDB4MTAgVE8gQ1RFU1Q3CisjZW5kaWYKKyAgICBNT1ZFIEZST00gOCwgV0hFTiBNU0dfT1VUCisgICAgTU9WRSBGUk9NIDE2LCBXSEVOIENNRCAKKyAgICBNT1ZFIEZST00gMjQsIFdIRU4gREFUQV9JTgorICAgIE1PVkUgRlJPTSAzMiwgV0hFTiBTVEFUVVMKKyAgICBNT1ZFIEZST00gNDAsIFdIRU4gTVNHX0lOCisjaWYgKENISVAgIT0gNzEwKQorICAgIE1PVkUgU0NOVEwyICYgMHg3ZiBUTyBTQ05UTDIKKyNlbmRpZgorICAgIENMRUFSIEFDSworICAgIFdBSVQgRElTQ09OTkVDVAordGVzdF8yX2ZhaWw6CisjaWYgKENISVAgPT0gNzEwKQorICAgIDsgRGlzYWJsZSBzZWxlY3Rpb24gdGltZXIKKyAgICBNT1ZFIENURVNUNyB8IDB4MTAgVE8gQ1RFU1Q3CisjZW5kaWYKKyAgICBJTlQgaW50X3Rlc3RfMgorCitFTlRSWSBkZWJ1Z19icmVhaworZGVidWdfYnJlYWs6CisgICAgSU5UIGludF9kZWJ1Z19icmVhaworCis7Cis7IGluaXRpYXRvcl9hYm9ydAorOyB0YXJnZXRfYWJvcnQKKzsKKzsgUFVSUE9TRSA6IEFib3J0IHRoZSBjdXJyZW50bHkgZXN0YWJsaXNoZWQgbmV4dXMgZnJvbSB3aXRoIGluaXRpYXRvcgorOwlvciB0YXJnZXQgbW9kZS4KKzsKKzsgIAorCitFTlRSWSB0YXJnZXRfYWJvcnQKK3RhcmdldF9hYm9ydDoKKyAgICBTRVQgVEFSR0VUCisgICAgRElTQ09OTkVDVAorICAgIENMRUFSIFRBUkdFVAorICAgIEpVTVAgc2NoZWR1bGUKKyAgICAKK0VOVFJZIGluaXRpYXRvcl9hYm9ydAoraW5pdGlhdG9yX2Fib3J0OgorICAgIFNFVCBBVE4KKzsKKzsgVGhlIFNDU0ktSSBzcGVjaWZpY2F0aW9uIHNheXMgdGhhdCB0YXJnZXRzIG1heSBnbyBpbnRvIE1TRyBvdXQgYXQgCis7IHRoZWlyIGxlaXN1cmUgdXBvbiByZWNlaXB0IG9mIHRoZSBBVE4gc2luZ2xlLiAgT24gYWxsIHZlcnNpb25zIG9mIHRoZSAKKzsgc3BlY2lmaWNhdGlvbiwgd2UgY2FuJ3QgY2hhbmdlIHBoYXNlcyB1bnRpbCBSRVEgdHJhbnNpdGlvbnMgdHJ1ZS0+ZmFsc2UsIAorOyBzbyB3ZSBuZWVkIHRvIHNpbmsvc291cmNlIG9uZSBieXRlIG9mIGRhdGEgdG8gYWxsb3cgdGhlIHRyYW5zaXRpb24uCis7Cis7IEZvciB0aGUgc2FrZSBvZiBzYWZldHksIHdlJ2xsIG9ubHkgc291cmNlIG9uZSBieXRlIG9mIGRhdGEgaW4gYWxsIAorOyBjYXNlcywgYnV0IHRvIGFjY29tbW9kYXRlIHRoZSBTQ1NJLUkgZGFpbiBicmFtYWdlLCB3ZSdsbCBzaW5rIGFuICAKKzsgYXJiaXRyYXJ5IG51bWJlciBvZiBieXRlcy4KKyAgICBKVU1QIHNwZXdfY21kLCBXSEVOIENNRAorICAgIEpVTVAgZWF0X21zZ2luLCBXSEVOIE1TR19JTgorICAgIEpVTVAgZWF0X2RhdGFpbiwgV0hFTiBEQVRBX0lOCisgICAgSlVNUCBlYXRfc3RhdHVzLCBXSEVOIFNUQVRVUworICAgIEpVTVAgc3Bld19kYXRhb3V0LCBXSEVOIERBVEFfT1VUCisgICAgSlVNUCBzYXRlZAorc3Bld19jbWQ6CisgICAgTU9WRSAxLCBOQ1I1M2M3eHhfemVybywgV0hFTiBDTUQKKyAgICBKVU1QIHNhdGVkCitlYXRfbXNnaW46CisgICAgTU9WRSAxLCBOQ1I1M2M3eHhfc2luaywgV0hFTiBNU0dfSU4KKyAgICBKVU1QIGVhdF9tc2dpbiwgV0hFTiBNU0dfSU4KKyAgICBKVU1QIHNhdGVkCitlYXRfc3RhdHVzOgorICAgIE1PVkUgMSwgTkNSNTNjN3h4X3NpbmssIFdIRU4gU1RBVFVTCisgICAgSlVNUCBlYXRfc3RhdHVzLCBXSEVOIFNUQVRVUworICAgIEpVTVAgc2F0ZWQKK2VhdF9kYXRhaW46CisgICAgTU9WRSAxLCBOQ1I1M2M3eHhfc2luaywgV0hFTiBEQVRBX0lOCisgICAgSlVNUCBlYXRfZGF0YWluLCBXSEVOIERBVEFfSU4KKyAgICBKVU1QIHNhdGVkCitzcGV3X2RhdGFvdXQ6CisgICAgTU9WRSAxLCBOQ1I1M2M3eHhfemVybywgV0hFTiBEQVRBX09VVAorc2F0ZWQ6CisjaWYgKENISVAgIT0gNzEwKQorICAgIE1PVkUgU0NOVEwyICYgMHg3ZiBUTyBTQ05UTDIKKyNlbmRpZgorICAgIE1PVkUgMSwgTkNSNTNjN3h4X21zZ19hYm9ydCwgV0hFTiBNU0dfT1VUCisgICAgV0FJVCBESVNDT05ORUNUCisgICAgSU5UIGludF9ub3JtX2Fib3J0ZWQKKworI2lmIChDSElQICE9IDcxMCkKKzsKKzsgZHNhX3RvX3NjcmF0Y2gKKzsgc2NyYXRjaF90b19kc2EKKzsKKzsgUFVSUE9TRSA6Cis7IAlUaGUgTkNSIGNoaXBzIGNhbm5vdCBkbyBhIG1vdmUgbWVtb3J5IGluc3RydWN0aW9uIHdpdGggdGhlIERTQSByZWdpc3RlciAKKzsgCWFzIHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24uICBTbywgd2UgcHJvdmlkZSBhIGNvdXBsZSBvZiBzdWJyb3V0aW5lcworOyAJdGhhdCBsZXQgdXMgc3dpdGNoIGJldHdlZW4gdGhlIERTQSByZWdpc3RlciBhbmQgc2NyYXRjaCByZWdpc3Rlci4KKzsKKzsgCU1lbW9yeSBtb3ZlcyB0by9mcm9tIHRoZSBEU1BTICByZWdpc3RlciBhbHNvIGRvbid0IHdvcmssIGJ1dCB3ZSAKKzsgCWRvbid0IHVzZSB0aGVtLgorOworOworCisgCitkc2FfdG9fc2NyYXRjaDoKKyAgICBNT1ZFIERTQTAgVE8gU0ZCUgorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMAorICAgIE1PVkUgRFNBMSBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gxCisgICAgTU9WRSBEU0EyIFRPIFNGQlIKKyAgICBNT1ZFIFNGQlIgVE8gU0NSQVRDSDIKKyAgICBNT1ZFIERTQTMgVE8gU0ZCUgorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMworICAgIFJFVFVSTgorCitzY3JhdGNoX3RvX2RzYToKKyAgICBNT1ZFIFNDUkFUQ0gwIFRPIFNGQlIKKyAgICBNT1ZFIFNGQlIgVE8gRFNBMAorICAgIE1PVkUgU0NSQVRDSDEgVE8gU0ZCUgorICAgIE1PVkUgU0ZCUiBUTyBEU0ExCisgICAgTU9WRSBTQ1JBVENIMiBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIERTQTIKKyAgICBNT1ZFIFNDUkFUQ0gzIFRPIFNGQlIKKyAgICBNT1ZFIFNGQlIgVE8gRFNBMworICAgIFJFVFVSTgorI2VuZGlmCisgCisjaWYgKENISVAgPT0gNzEwKQorOyBMaXR0bGUgcGF0Y2hlZCBqdW1wLCB1c2VkIHRvIG92ZXJjb21lIHByb2JsZW1zIHdpdGggVEVNUCBnZXR0aW5nCis7IGNvcnJ1cHRlZCBvbiBtZW1vcnkgbW92ZXMuCisKK2p1bXBfdGVtcDoKKyAgICBKVU1QIDAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpLzUzYzd4eF9kLmhfc2hpcHBlZCBiL2RyaXZlcnMvc2NzaS81M2M3eHhfZC5oX3NoaXBwZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkMzFiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS81M2M3eHhfZC5oX3NoaXBwZWQKQEAgLTAsMCArMSwyODc0IEBACisvKiBETyBOT1QgRURJVCAtIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHNjcmlwdF9hc20ucGwgKi8KK3N0YXRpYyB1MzIgU0NSSVBUW10gPSB7CisvKgorCisKKworCisKKzsgNTNjNzEwIGRyaXZlci4gIE1vZGlmaWVkIGZyb20gRHJldyBFY2toYXJkdHMgZHJpdmVyCis7IGZvciA1M2M4MTAgYnkgUmljaGFyZCBIaXJzdCBbcmljaGFyZEBzbGVlcGllLmRlbW9uLmNvLnVrXQorOworOyBJIGhhdmUgbGVmdCB0aGUgc2NyaXB0IGZvciB0aGUgNTNjOHh4IGZhbWlseSBpbiBoZXJlLCBhcyBpdCBpcyBsaWtlbHkKKzsgdG8gYmUgdXNlZnVsIHRvIHNlZSB3aGF0IEkgY2hhbmdlZCB3aGVuIGJ1ZyBodW50aW5nLgorCis7IE5DUiA1M2M4MTAgZHJpdmVyLCBtYWluIHNjcmlwdAorOyBTcG9uc29yZWQgYnkgCis7CWlYIE11bHRpdXNlciBNdWx0aXRhc2tpbmcgTWFnYXppbmUKKzsJaG1AaXguZGUKKzsKKzsgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTUgRHJldyBFY2toYXJkdAorOyAgICAgIFZpc2lvbmFyeSBDb21wdXRpbmcgCis7ICAgICAgKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKzsgICAgICBkcmV3QFBvb2hTdGlja3MuT1JHCis7ICAgICAgKzEgKDMwMykgNzg2LTc5NzUKKzsKKzsgVG9sZXJBTlQgYW5kIFNDU0kgU0NSSVBUUyBhcmUgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIE5DUiBDb3Jwb3JhdGlvbi4KKzsKKzsgUFJFLUFMUEhBCis7Cis7IEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgY29uc3VsdCAKKzsKKzsgTkNSIDUzQzgxMAorOyBQQ0ktU0NTSSBJL08gUHJvY2Vzc29yCis7IERhdGEgTWFudWFsCis7Cis7IE5DUiA1M0M3MTAgCis7IFNDU0kgSS9PIFByb2Nlc3NvcgorOyBQcm9ncmFtbWVycyBHdWlkZQorOworOyBOQ1IgTWljcm9lbGVjdHJvbmljcworOyAxNjM1IEFlcm9wbGF6YSBEcml2ZQorOyBDb2xvcmFkbyBTcHJpbmdzLCBDTyA4MDkxNgorOyAxKyAoNzE5KSA1NzgtMzQwMAorOworOyBUb2xsIGZyZWUgbGl0ZXJhdHVyZSBudW1iZXIKKzsgKzEgKDgwMCkgMzM0LTU0NTQKKzsKKzsgSU1QT1JUQU5UIDogVGhpcyBjb2RlIGlzIHNlbGYgbW9kaWZ5aW5nIGR1ZSB0byB0aGUgbGltaXRhdGlvbnMgb2YgCis7CXRoZSBOQ1I1M2M3LDh4eCBzZXJpZXMgY2hpcHMuICBQZXJzb25zIGRlYnVnZ2luZyB0aGlzIGNvZGUgd2l0aAorOwl0aGUgcmVtb3RlIGRlYnVnZ2VyIHNob3VsZCB0YWtlIHRoaXMgaW50byBhY2NvdW50LCBhbmQgTk9UIHNldAorOwlicmVha3BvaW50cyBpbiBtb2RpZmllZCBpbnN0cnVjdGlvbnMuCis7Cis7IERlc2lnbjoKKzsgVGhlIE5DUjUzYzcsOHh4IGZhbWlseSBvZiBTQ1NJIGNoaXBzIGFyZSBidXNtYXN0ZXJzIHdpdGggYW4gb25ib2FyZCAKKzsgbWljcm9jb250cm9sbGVyIHVzaW5nIGEgc2ltcGxlIGluc3RydWN0aW9uIHNldC4gICAKKzsKKzsgU28sIHRvIG1pbmltaXplIHRoZSBlZmZlY3RzIG9mIGludGVycnVwdCBsYXRlbmN5LCBhbmQgdG8gbWF4aW1pemUgCis7IHRocm91Z2hwdXQsIHRoaXMgZHJpdmVyIG9mZmxvYWRzIHRoZSBwcmFjdGljYWwgbWF4aW11bSBhbW91bnQgCis7IG9mIHByb2Nlc3NpbmcgdG8gdGhlIFNDU0kgY2hpcCB3aGlsZSBzdGlsbCBtYWludGFpbmluZyBhIGNvbW1vbgorOyBzdHJ1Y3R1cmUuCis7Cis7IFdoZXJlIHRyYWRlb2ZmcyB3ZXJlIG5lZWRlZCBiZXR3ZWVuIGVmZmljaWVuY3kgb24gdGhlIG9sZGVyCis7IGNoaXBzIGFuZCB0aGUgbmV3ZXIgTkNSNTNjODAwIHNlcmllcywgdGhlIE5DUjUzYzgwMCBzZXJpZXMgCis7IHdhcyBjaG9zZW4uCis7Cis7IFdoaWxlIHRoZSBOQ1I1M2M3MDAgYW5kIE5DUjUzYzcwMC02NiBsYWNrZWQgdGhlIGZhY2lsaXRpZXMgdG8gZnVsbHkKKzsgYXV0b21hdGUgU0NTSSB0cmFuc2ZlcnMgd2l0aG91dCBob3N0IHByb2Nlc3NvciBpbnRlcnZlbnRpb24sIHRoaXMgCis7IGlzbid0IHRoZSBjYXNlIHdpdGggdGhlIE5DUjUzYzcxMCBhbmQgbmV3ZXIgY2hpcHMgd2hpY2ggYWxsb3cgCis7Cis7IC0gcmVhZHMgYW5kIHdyaXRlcyB0byB0aGUgaW50ZXJuYWwgcmVnaXN0ZXJzIGZyb20gd2l0aGluIHRoZSBTQ1NJCis7IAlzY3JpcHRzLCBhbGxvd2luZyB0aGUgU0NTSSBTQ1JJUFRTKHRtKSBjb2RlIHRvIHNhdmUgcHJvY2Vzc29yCis7IAlzdGF0ZSBzbyB0aGF0IG11bHRpcGxlIHRocmVhZHMgb2YgZXhlY3V0aW9uIGFyZSBwb3NzaWJsZSwgYW5kIGFsc28KKzsgCXByb3ZpZGUgYW4gQUxVIGZvciBsb29wIGNvbnRyb2wsIGV0Yy4KKzsgCis7IC0gdGFibGUgaW5kaXJlY3QgYWRkcmVzc2luZyBmb3Igc29tZSBpbnN0cnVjdGlvbnMuIFRoaXMgYWxsb3dzIAorOwlwb2ludGVycyB0byBiZSBsb2NhdGVkIHJlbGF0aXZlIHRvIHRoZSBEU0EgKChEYXRhIFN0cnVjdHVyZQorOwlBZGRyZXNzKSByZWdpc3Rlci4KKzsKKzsgVGhlc2UgZmVhdHVyZXMgbWFrZSBpdCBwb3NzaWJsZSB0byBpbXBsZW1lbnQgYSBtYWlsYm94IHN0eWxlIGludGVyZmFjZSwKKzsgd2hlcmUgdGhlIHNhbWUgcGllY2Ugb2YgY29kZSBpcyBydW4gdG8gaGFuZGxlIEkvTyBmb3IgbXVsdGlwbGUgdGhyZWFkcworOyBhdCBvbmNlIG1pbmltaXppbmcgb3VyIG5lZWQgdG8gcmVsb2NhdGUgY29kZS4gIFNpbmNlIHRoZSBOQ1I1M2M3MDAvCis7IE5DUjUzYzgwMCBzZXJpZXMgaGF2ZSBhIHVuaXF1ZSBjb21iaW5hdGlvbiBvZiBmZWF0dXJlcywgbWFraW5nIGEgCis7IGEgc3RhbmRhcmQgaW5nb2luZy9vdXRnb2luZyBtYWlsYm94IHN5c3RlbSwgY29zdGx5LCBJJ3ZlIG1vZGlmaWVkIGl0LgorOworOyAtIE1haWxib3hlcyBhcmUgYSBtaXh0dXJlIG9mIGNvZGUgYW5kIGRhdGEuICBUaGlzIGxldHMgdXMgZ3JlYXRseQorOyAJc2ltcGxpZnkgdGhlIE5DUjUzYzgxMCBjb2RlIGFuZCBkbyB0aGluZ3MgdGhhdCB3b3VsZCBvdGhlcndpc2UKKzsJbm90IGJlIHBvc3NpYmxlLgorOworOyBUaGUgc2F2ZWQgZGF0YSBwb2ludGVyIGlzIG5vdyBpbXBsZW1lbnRlZCBhcyBmb2xsb3dzIDoKKzsKKzsgCUNvbnRyb2wgZmxvdyBoYXMgYmVlbiBhcmNoaXRlY3RlZCBzdWNoIHRoYXQgaWYgY29udHJvbCByZWFjaGVzCis7CW11bmdlX3NhdmVfZGF0YV9wb2ludGVyLCBvbiBhIHJlc3RvcmUgcG9pbnRlcnMgbWVzc2FnZSBvciAKKzsJcmVjb25uZWN0aW9uLCBhIGp1bXAgdG8gdGhlIGFkZHJlc3MgZm9ybWVybHkgaW4gdGhlIFRFTVAgcmVnaXN0ZXIKKzsJd2lsbCBhbGxvdyB0aGUgU0NTSSBjb21tYW5kIHRvIHJlc3VtZSBleGVjdXRpb24uCis7CisKKzsKKzsgTm90ZSA6IHRoZSBEU0Egc3RydWN0dXJlcyBtdXN0IGJlIGFsaWduZWQgb24gMzIgYml0IGJvdW5kYXJpZXMsCis7IHNpbmNlIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG9mIE1PVkUgTUVNT1JZIGluc3RydWN0aW9ucyAKKzsgbXVzdCBzaGFyZSB0aGUgc2FtZSBhbGlnbm1lbnQgYW5kIHRoaXMgaXMgdGhlIGFsaWdubWVudCBvZiB0aGUKKzsgTkNSIHJlZ2lzdGVycy4KKzsKKworOyBGb3Igc29tZSBzeXN0ZW1zIChNVk1FMTY2LCBmb3IgZXhhbXBsZSkgZG1vZGUgaXMgYWx3YXlzIHRoZSBzYW1lLCBzbyBkb24ndAorOyB3YXN0ZSB0aW1lIHdyaXRpbmcgaXQKKworCisKKworCisKKworCisKKworCitBQlNPTFVURSBkc2FfdGVtcF9sdW4gPSAwCQk7IFBhdGNoIHRvIGx1biBmb3IgY3VycmVudCBkc2EKK0FCU09MVVRFIGRzYV90ZW1wX25leHQgPSAwCQk7IFBhdGNoIHRvIGRzYSBuZXh0IGZvciBjdXJyZW50IGRzYQorQUJTT0xVVEUgZHNhX3RlbXBfYWRkcl9uZXh0ID0gMAkJOyBQYXRjaCB0byBhZGRyZXNzIG9mIGRzYSBuZXh0IGFkZHJlc3MgCisJCQkJCTsgCWZvciBjdXJyZW50IGRzYQorQUJTT0xVVEUgZHNhX3RlbXBfc3luYyA9IDAJCTsgUGF0Y2ggdG8gYWRkcmVzcyBvZiBwZXItdGFyZ2V0CisJCQkJCTsJc3luYyByb3V0aW5lCitBQlNPTFVURSBkc2Ffc3NjZl83MTAgPSAwCQk7IFBhdGNoIHRvIGFkZHJlc3Mgb2YgcGVyLXRhcmdldAorCQkJCQk7CXNzY2YgdmFsdWUgKDUzYzcxMCkKK0FCU09MVVRFIGRzYV90ZW1wX3RhcmdldCA9IDAJCTsgUGF0Y2ggdG8gaWQgZm9yIGN1cnJlbnQgZHNhCitBQlNPTFVURSBkc2FfdGVtcF9hZGRyX3NhdmVkX3BvaW50ZXIgPSAwOyBQYXRjaCB0byBhZGRyZXNzIG9mIHBlci1jb21tYW5kCisJCQkJCTsgCXNhdmVkIGRhdGEgcG9pbnRlcgorQUJTT0xVVEUgZHNhX3RlbXBfYWRkcl9yZXNpZHVhbCA9IDAJOyBQYXRjaCB0byBhZGRyZXNzIG9mIHBlci1jb21tYW5kCisJCQkJCTsJY3VycmVudCByZXNpZHVhbCBjb2RlCitBQlNPTFVURSBkc2FfdGVtcF9hZGRyX3NhdmVkX3Jlc2lkdWFsID0gMDsgUGF0Y2ggdG8gYWRkcmVzcyBvZiBwZXItY29tbWFuZAorCQkJCQk7IHNhdmVkIHJlc2lkdWFsIGNvZGUKK0FCU09MVVRFIGRzYV90ZW1wX2FkZHJfbmV3X3ZhbHVlID0gMAk7IEFkZHJlc3Mgb2YgdmFsdWUgZm9yIEpVTVAgb3BlcmFuZAorQUJTT0xVVEUgZHNhX3RlbXBfYWRkcl9hcnJheV92YWx1ZSA9IDAgCTsgQWRkcmVzcyB0byBjb3B5IHRvCitBQlNPTFVURSBkc2FfdGVtcF9hZGRyX2RzYV92YWx1ZSA9IDAJOyBBZGRyZXNzIG9mIHRoaXMgRFNBIHZhbHVlCisKKzsKKzsgT25jZSBhIGRldmljZSBoYXMgaW5pdGlhdGVkIHJlc2VsZWN0aW9uLCB3ZSBuZWVkIHRvIGNvbXBhcmUgaXQgCis7IGFnYWluc3QgdGhlIHNpbmdseSBsaW5rZWQgbGlzdCBvZiBjb21tYW5kcyB3aGljaCBoYXZlIGRpc2Nvbm5lY3RlZAorOyBhbmQgYXJlIHBlbmRpbmcgcmVzZWxlY3Rpb24uICBUaGVzZSBjb21tYW5kcyBhcmUgbWFpbnRhaW5lZCBpbiAKKzsgYW4gdW5vcmRlcmVkIHNpbmdseSBsaW5rZWQgbGlzdCBvZiBEU0Egc3RydWN0dXJlcywgdGhyb3VnaCB0aGUKKzsgRFNBIHBvaW50ZXJzIGF0IHRoZWlyICdjZW50ZXJzJyBoZWFkZWQgYnkgdGhlIHJlY29ubmVjdF9kc2FfaGVhZAorOyBwb2ludGVyLgorOyAKKzsgVG8gYXZvaWQgY29tcGxpY2F0aW9ucyBpbiByZW1vdmluZyBjb21tYW5kcyBmcm9tIHRoZSBsaXN0LAorOyBJIG1pbmltaXplIHRoZSBhbW91bnQgb2YgZXhwZW5zaXZlIChhdCBlaWdodCBvcGVyYXRpb25zIHBlcgorOyBhZGRpdGlvbiBAIDUwMC02MDBucyBlYWNoKSBwb2ludGVyIG9wZXJhdGlvbnMgd2hpY2ggbXVzdAorOyBiZSBkb25lIGluIHRoZSBOQ1IgZHJpdmVyIGJ5IHByZWNvbXB1dGluZyB0aGVtIG9uIHRoZSAKKzsgaG9zdCBwcm9jZXNzb3IgZHVyaW5nIGRzYSBzdHJ1Y3R1cmUgZ2VuZXJhdGlvbi4KKzsKKzsgVGhlIGZpeGVkLXVwIHBlciBEU0EgY29kZSBrbm93cyBob3cgdG8gcmVjb2duaXplIHRoZSBuZXh1cworOyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgU0NTSSBjb21tYW5kLCBhbmQgbW9kaWZpZXMKKzsgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcnMgZm9yIHRoZSBNT1ZFIE1FTU9SWSAKKzsgaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgZXhlY3V0ZWQgd2hlbiByZXNlbGVjdGVkX29rIGlzIGNhbGxlZAorOyB0byByZW1vdmUgdGhlIGNvbW1hbmQgZnJvbSB0aGUgbGlzdC4gIFNpbWlsYXJseSwgRFNBIGlzIAorOyBsb2FkZWQgd2l0aCB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBEU0Egc3RydWN0dXJlIGFuZAorOyByZXNlbGVjdGVkX2NoZWNrX25leHQgaXMgY2FsbGVkIGlmIGEgZmFpbHVyZSBvY2N1cnMuCis7Cis7IFBlcmhhcHMgbW9yZSBjb25jaXNlbHksIHRoZSBuZXQgZWZmZWN0IG9mIHRoZSBtZXNzIGlzIAorOworOyBmb3IgKGRzYSA9IHJlY29ubmVjdF9kc2FfaGVhZCwgZGVzdCA9ICZyZWNvbm5lY3RfZHNhX2hlYWQsIAorOyAgICAgc3JjID0gTlVMTDsgZHNhOyBkZXN0ID0gJmRzYS0+bmV4dCwgZHNhID0gZHNhLT5uZXh0KSB7Cis7IAlzcmMgPSAmZHNhLT5uZXh0OworOyAJaWYgKHRhcmdldF9pZCA9PSBkc2EtPmlkICYmIHRhcmdldF9sdW4gPT0gZHNhLT5sdW4pIHsKKzsgCQkqZGVzdCA9ICpzcmM7Cis7IAkJYnJlYWs7Cis7ICAgICAgICAgfQkKKzsgfQorOworOyBpZiAoIWRzYSkKKzsgICAgICAgICAgIGVycm9yIChpbnRfZXJyX3VuZXhwZWN0ZWRfcmVzZWxlY3QpOworOyBlbHNlICAKKzsgICAgIGxvbmdqbXAgKGRzYS0+anVtcF9yZXN1bWUsIDApOworOworOyAJCisKKworOyBEZWZpbmUgRFNBIHN0cnVjdHVyZSB1c2VkIGZvciBtYWlsYm94ZXMKK0VOVFJZIGRzYV9jb2RlX3RlbXBsYXRlCitkc2FfY29kZV90ZW1wbGF0ZToKK0VOVFJZIGRzYV9jb2RlX2JlZ2luCitkc2FfY29kZV9iZWdpbjoKKzsgUkdIOiBEb24ndCBjYXJlIGFib3V0IFRFTVAgYW5kIERTQSBoZXJlCisJCisJTU9WRSBNRU1PUlkgNCwgZHNhX3RlbXBfYWRkcl9kc2FfdmFsdWUsIGFkZHJfc2NyYXRjaAorCithdCAweDAwMDAwMDAwIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCQorCisJTU9WRSBNRU1PUlkgNCwgYWRkcl9zY3JhdGNoLCBzYXZlZF9kc2EKKworYXQgMHgwMDAwMDAwMyA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKwk7IFdlIGFyZSBhYm91dCB0byBnbyBhbmQgc2VsZWN0IHRoZSBkZXZpY2UsIHNvIG11c3Qgc2V0IFNTQ0YgYml0cworCU1PVkUgTUVNT1JZIDQsIGRzYV9zc2NmXzcxMCwgYWRkcl9zY3JhdGNoCisKK2F0IDB4MDAwMDAwMDYgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKwlNT1ZFIFNDUkFUQ0gzIFRPIFNGQlIKKworYXQgMHgwMDAwMDAwOSA6ICovCTB4NzIzNzAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKworCisJTU9WRSBTRkJSIFRPIFNCQ0wKKworYXQgMHgwMDAwMDAwYiA6ICovCTB4NmEwYjAwMDAsMHgwMDAwMDAwMCwKKy8qCisJTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorCithdCAweDAwMDAwMDBkIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCisKKworCUNBTEwgc2VsZWN0CisKK2F0IDB4MDAwMDAwMTAgOiAqLwkweDg4MDgwMDAwLDB4MDAwMDAxZjgsCisvKgorOyBIYW5kbGUgdGhlIHBoYXNlIG1pc21hdGNoIHdoaWNoIG1heSBoYXZlIHJlc3VsdGVkIGZyb20gdGhlIAorOyBNT1ZFIEZST00gZHNhX21zZ291dCBpZiB3ZSByZXR1cm5lZCBoZXJlLiAgVGhlIENMRUFSIEFUTiAKKzsgbWF5IG9yIG1heSBub3QgYmUgbmVjZXNzYXJ5LCBhbmQgd2Ugc2hvdWxkIHVwZGF0ZSBzY3JpcHRfYXNtLnBsCis7IHRvIGhhbmRsZSBtdWx0aXBsZSBwaWVjZXMuCisgICAgQ0xFQVIgQVROCisKK2F0IDB4MDAwMDAwMTIgOiAqLwkweDYwMDAwMDA4LDB4MDAwMDAwMDAsCisvKgorICAgIENMRUFSIEFDSworCithdCAweDAwMDAwMDE0IDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKworOyBSZXBsYWNlIHNlY29uZCBvcGVyYW5kIHdpdGggYWRkcmVzcyBvZiBKVU1QIGluc3RydWN0aW9uIGRlc3Qgb3BlcmFuZAorOyBpbiBzY2hlZHVsZSB0YWJsZSBmb3IgdGhpcyBEU0EuICBCZWNvbWVzIGRzYV9qdW1wX2Rlc3QgaW4gNTNjNyw4eHguYy4KK0VOVFJZIGRzYV9jb2RlX2ZpeF9qdW1wCitkc2FfY29kZV9maXhfanVtcDoKKwlNT1ZFIE1FTU9SWSA0LCBOT1BfaW5zbiwgMAorCithdCAweDAwMDAwMDE2IDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCUpVTVAgc2VsZWN0X2RvbmUKKworYXQgMHgwMDAwMDAxOSA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDIzMCwKKy8qCisKKzsgd3JvbmdfZHNhIGxvYWRzIHRoZSBEU0EgcmVnaXN0ZXIgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGRzYV9uZXh0Cis7IGZpZWxkLgorOword3JvbmdfZHNhOgorCis7ICAgICAgICAgICAgICAgIE5PVEUgRFNBIGlzIGNvcnJ1cHQgd2hlbiB3ZSBhcnJpdmUgaGVyZSEKKworOwkJUGF0Y2ggdGhlIE1PVkUgTUVNT1JZIElOU1RSVUNUSU9OIHN1Y2ggdGhhdCAKKzsJCXRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBPTEQgCis7CQluZXh0IHBvaW50ZXIuCis7CisJTU9WRSBNRU1PUlkgNCwgZHNhX3RlbXBfYWRkcl9uZXh0LCByZXNlbGVjdGVkX29rX3BhdGNoICsgOAorCithdCAweDAwMDAwMDFiIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDA3ZWMsCisvKgorCQorOworOyAJTW92ZSB0aGUgX2NvbnRlbnRzXyBvZiB0aGUgbmV4dCBwb2ludGVyIGludG8gdGhlIERTQSByZWdpc3RlciBhcyAKKzsJdGhlIG5leHQgSV9UX0wgb3IgSV9UX0xfUSB0dXBwbGUgdG8gY2hlY2sgYWdhaW5zdCB0aGUgZXN0YWJsaXNoZWQKKzsJbmV4dXMuCis7CisJTU9WRSBNRU1PUlkgNCwgZHNhX3RlbXBfbmV4dCwgYWRkcl9zY3JhdGNoCisKK2F0IDB4MDAwMDAwMWUgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qCisJCisKKwlNT1ZFIE1FTU9SWSA0LCBhZGRyX3NjcmF0Y2gsIHNhdmVkX2RzYQorCithdCAweDAwMDAwMDIxIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCU1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9kc2EKKworYXQgMHgwMDAwMDAyNCA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKworCisKKwlKVU1QIHJlc2VsZWN0ZWRfY2hlY2tfbmV4dAorCithdCAweDAwMDAwMDI3IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwNmYwLAorLyoKKworQUJTT0xVVEUgZHNhX3NhdmVfZGF0YV9wb2ludGVyID0gMAorRU5UUlkgZHNhX2NvZGVfc2F2ZV9kYXRhX3BvaW50ZXIKK2RzYV9jb2RlX3NhdmVfZGF0YV9wb2ludGVyOgorCisJOyBXaGVuIHdlIGdldCBoZXJlLCBURU1QIGhhcyBiZWVuIHNhdmVkIGluIGp1bXBfdGVtcCs0LCBEU0EgaXMgY29ycnVwdAorCTsgV2UgTVVTVCByZXR1cm4gd2l0aCBEU0EgY29ycmVjdAorICAgIAlNT1ZFIE1FTU9SWSA0LCBqdW1wX3RlbXArNCwgZHNhX3RlbXBfYWRkcl9zYXZlZF9wb2ludGVyCisKK2F0IDB4MDAwMDAwMjkgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDA5YzgsMHgwMDAwMDAwMCwKKy8qCis7IEhBUkQgQ09ERUQgOiAyNCBieXRlcyBuZWVkcyB0byBhZ3JlZSB3aXRoIDUzYzcsOHh4LmgKKyAgICAJTU9WRSBNRU1PUlkgMjQsIGRzYV90ZW1wX2FkZHJfcmVzaWR1YWwsIGRzYV90ZW1wX2FkZHJfc2F2ZWRfcmVzaWR1YWwKKworYXQgMHgwMDAwMDAyYyA6ICovCTB4YzAwMDAwMTgsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICAgICAgQ0xFQVIgQUNLCisKK2F0IDB4MDAwMDAwMmYgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCisKKworCU1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9kc2EKKworYXQgMHgwMDAwMDAzMSA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKwlKVU1QIGp1bXBfdGVtcAorCithdCAweDAwMDAwMDM0IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwOWM0LAorLyoKKworQUJTT0xVVEUgZHNhX3Jlc3RvcmVfcG9pbnRlcnMgPSAwCitFTlRSWSBkc2FfY29kZV9yZXN0b3JlX3BvaW50ZXJzCitkc2FfY29kZV9yZXN0b3JlX3BvaW50ZXJzOgorCisJOyBURU1QIGFuZCBEU0EgYXJlIGNvcnJ1cHQgd2hlbiB3ZSBnZXQgaGVyZSwgYnV0IHdobyBjYXJlcyEKKyAgICAJTU9WRSBNRU1PUlkgNCwgZHNhX3RlbXBfYWRkcl9zYXZlZF9wb2ludGVyLCBqdW1wX3RlbXAgKyA0CisKK2F0IDB4MDAwMDAwMzYgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDljOCwKKy8qCis7IEhBUkQgQ09ERUQgOiAyNCBieXRlcyBuZWVkcyB0byBhZ3JlZSB3aXRoIDUzYzcsOHh4LmgKKyAgICAJTU9WRSBNRU1PUlkgMjQsIGRzYV90ZW1wX2FkZHJfc2F2ZWRfcmVzaWR1YWwsIGRzYV90ZW1wX2FkZHJfcmVzaWR1YWwKKworYXQgMHgwMDAwMDAzOSA6ICovCTB4YzAwMDAwMTgsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICAgICAgQ0xFQVIgQUNLCisKK2F0IDB4MDAwMDAwM2MgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCTsgUmVzdG9yZSBEU0EsIG5vdGUgd2UgZG9uJ3QgY2FyZSBhYm91dCBURU1QCisJTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorCithdCAweDAwMDAwMDNlIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCisKKworCUpVTVAganVtcF90ZW1wCisKK2F0IDB4MDAwMDAwNDEgOiAqLwkweDgwMDgwMDAwLDB4MDAwMDA5YzQsCisvKgorCisKK0FCU09MVVRFIGRzYV9jaGVja19yZXNlbGVjdCA9IDAKKzsgZHNhX2NoZWNrX3Jlc2VsZWN0IGRldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIGN1cnJlbnQgdGFyZ2V0IGFuZAorOyBsdW4gbWF0Y2ggdGhlIGN1cnJlbnQgRFNBCitFTlRSWSBkc2FfY29kZV9jaGVja19yZXNlbGVjdAorZHNhX2NvZGVfY2hlY2tfcmVzZWxlY3Q6CisKKwkKKwkKKwlNT1ZFIExDUkMgVE8gU0ZCUgkJOyBMQ1JDIGhhcyBvdXIgSUQgYW5kIGhpcyBJRCBiaXRzIHNldAorCithdCAweDAwMDAwMDQzIDogKi8JMHg3MjIzMDAwMCwweDAwMDAwMDAwLAorLyoKKwlKVU1QIFJFTCAod3JvbmdfZHNhKSwgSUYgTk9UIGRzYV90ZW1wX3RhcmdldCwgQU5EIE1BU0sgMHg4MAorCithdCAweDAwMDAwMDQ1IDogKi8JMHg4MDg0ODAwMCwweDAwZmZmZjUwLAorLyoKKworCisKKworCis7Cis7IEhhY2sgLSBtb3ZlIHRvIHNjcmF0Y2ggZmlyc3QsIHNpbmNlIFNGQlIgaXMgbm90IHdyaXRlYWJsZQorOyAJdmlhIHRoZSBDUFUgYW5kIGhlbmNlIGEgTU9WRSBNRU1PUlkgaW5zdHJ1Y3Rpb24uCis7CisJCisJTU9WRSBNRU1PUlkgMSwgcmVzZWxlY3RlZF9pZGVudGlmeSwgYWRkcl9zY3JhdGNoCisKK2F0IDB4MDAwMDAwNDcgOiAqLwkweGMwMDAwMDAxLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qCisJCisKKwk7IEJJRyBFTkRJQU4gT04gTVZNRTE2eAorCU1PVkUgU0NSQVRDSDMgVE8gU0ZCUgorCithdCAweDAwMDAwMDRhIDogKi8JMHg3MjM3MDAwMCwweDAwMDAwMDAwLAorLyoKKworCisKKzsgRklYTUUgOiB3ZSBuZWVkIHRvIGFjY29tbW9kYXRlIGJpdCBmaWVsZGVkIGFuZCBiaW5hcnkgaGVyZSBmb3IgJzd4eC8nOHh4IGNoaXBzCis7IEFyZSB5b3Ugc3VyZSBhYm91dCB0aGF0PyAgcmljaGFyZEBzbGVlcGllLmRlbW9uLmNvLnVrCisJSlVNUCBSRUwgKHdyb25nX2RzYSksIElGIE5PVCBkc2FfdGVtcF9sdW4sIEFORCBNQVNLIDB4ZjgKKworYXQgMHgwMDAwMDA0YyA6ICovCTB4ODA4NGY4MDAsMHgwMGZmZmYzNCwKKy8qCis7CQlQYXRjaCB0aGUgTU9WRSBNRU1PUlkgSU5TVFJVQ1RJT04gc3VjaCB0aGF0Cis7CQl0aGUgc291cmNlIGFkZHJlc3MgaXMgdGhlIGFkZHJlc3Mgb2YgdGhpcyBkc2EncworOwkJbmV4dCBwb2ludGVyLgorCU1PVkUgTUVNT1JZIDQsIGRzYV90ZW1wX2FkZHJfbmV4dCwgcmVzZWxlY3RlZF9va19wYXRjaCArIDQKKworYXQgMHgwMDAwMDA0ZSA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwN2U4LAorLyoKKwlDQUxMIHJlc2VsZWN0ZWRfb2sKKworYXQgMHgwMDAwMDA1MSA6ICovCTB4ODgwODAwMDAsMHgwMDAwMDc5OCwKKy8qCisKKzsJUmVzdG9yZSBEU0EgZm9sbG93aW5nIG1lbW9yeSBtb3ZlcyBpbiByZXNlbGVjdGVkX29rCis7CWRzYV90ZW1wX3N5bmMgZG9lc24ndCByZWFsbHkgY2FyZSBhYm91dCBEU0EsIGJ1dCBpdCBoYXMgYW4KKzsJb3B0aW9uYWwgZGVidWcgSU5UIHNvIGEgdmFsaWQgRFNBIGlzIGEgZ29vZCBpZGVhLgorCU1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9kc2EKKworYXQgMHgwMDAwMDA1MyA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKworCUNBTEwgZHNhX3RlbXBfc3luYwkKKworYXQgMHgwMDAwMDA1NiA6ICovCTB4ODgwODAwMDAsMHgwMDAwMDAwMCwKKy8qCis7IFJlbGVhc2UgQUNLIG9uIHRoZSBJREVOVElGWSBtZXNzYWdlIF9hZnRlcl8gd2UndmUgc2V0IHRoZSBzeW5jaHJvbm91cyAKKzsgdHJhbnNmZXIgcGFyYW1ldGVycyEgCisJQ0xFQVIgQUNLCisKK2F0IDB4MDAwMDAwNTggOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorOyBJbXBsaWNpdGx5IHJlc3RvcmUgcG9pbnRlcnMgb24gcmVzZWxlY3Rpb24sIHNvIGEgUkVUVVJOCis7IHdpbGwgdHJhbnNmZXIgY29udHJvbCBiYWNrIHRvIHRoZSByaWdodCBzcG90LgorICAgIAlDQUxMIFJFTCAoZHNhX2NvZGVfcmVzdG9yZV9wb2ludGVycykKKworYXQgMHgwMDAwMDA1YSA6ICovCTB4ODg4ODAwMDAsMHgwMGZmZmY2OCwKKy8qCisgICAgCVJFVFVSTgorCithdCAweDAwMDAwMDVjIDogKi8JMHg5MDA4MDAwMCwweDAwMDAwMDAwLAorLyoKK0VOVFJZIGRzYV96ZXJvCitkc2FfemVybzoKK0VOVFJZIGRzYV9jb2RlX3RlbXBsYXRlX2VuZAorZHNhX2NvZGVfdGVtcGxhdGVfZW5kOgorCis7IFBlcmZvcm0gc2FuaXR5IGNoZWNrIGZvciBkc2FfZmllbGRzX3N0YXJ0ID09IGRzYV9jb2RlX3RlbXBsYXRlX2VuZCAtIAorOyBkc2FfemVybywgcHVrZS4KKworQUJTT0xVVEUgZHNhX2ZpZWxkc19zdGFydCA9ICAwCTsgU2FuaXR5IG1hcmtlcgorCQkJCTsgCXBhZCA0OCBieXRlcyAoZml4IHRoaXMgUlNOKQorQUJTT0xVVEUgZHNhX25leHQgPSA0OAkJOyBsZW4gNCBOZXh0IERTQQorIAkJCQk7IGRlbCA0IFByZXZpb3VzIERTQSBhZGRyZXNzCitBQlNPTFVURSBkc2FfY21uZCA9IDU2CQk7IGxlbiA0IFNjc2lfQ21uZCAqIGZvciB0aGlzIHRocmVhZC4KK0FCU09MVVRFIGRzYV9zZWxlY3QgPSA2MAk7IGxlbiA0IERldmljZSBJRCwgUGVyaW9kLCBPZmZzZXQgZm9yIAorCQkJIAk7CXRhYmxlIGluZGlyZWN0IHNlbGVjdAorQUJTT0xVVEUgZHNhX21zZ291dCA9IDY0CTsgbGVuIDggdGFibGUgaW5kaXJlY3QgbW92ZSBwYXJhbWV0ZXIgZm9yIAorCQkJCTsgICAgICAgc2VsZWN0IG1lc3NhZ2UKK0FCU09MVVRFIGRzYV9jbWRvdXQgPSA3Mgk7IGxlbiA4IHRhYmxlIGluZGlyZWN0IG1vdmUgcGFyYW1ldGVyIGZvciAKKwkJCQk7CWNvbW1hbmQKK0FCU09MVVRFIGRzYV9kYXRhb3V0ID0gODAJOyBsZW4gNCBjb2RlIHBvaW50ZXIgZm9yIGRhdGFvdXQKK0FCU09MVVRFIGRzYV9kYXRhaW4gPSA4NAk7IGxlbiA0IGNvZGUgcG9pbnRlciBmb3IgZGF0YWluCitBQlNPTFVURSBkc2FfbXNnaW4gPSA4OAkJOyBsZW4gOCB0YWJsZSBpbmRpcmVjdCBtb3ZlIGZvciBtc2dpbgorQUJTT0xVVEUgZHNhX3N0YXR1cyA9IDk2IAk7IGxlbiA4IHRhYmxlIGluZGlyZWN0IG1vdmUgZm9yIHN0YXR1cyBieXRlCitBQlNPTFVURSBkc2FfbXNnb3V0X290aGVyID0gMTA0CTsgbGVuIDggdGFibGUgaW5kaXJlY3QgZm9yIG5vcm1hbCBtZXNzYWdlIG91dAorCQkJCTsgKFN5bmNocm9ub3VzIHRyYW5zZmVyIG5lZ290aWF0aW9uLCBldGMpLgorQUJTT0xVVEUgZHNhX2VuZCA9IDExMgorCitBQlNPTFVURSBzY2hlZHVsZSA9IDAgCQk7IEFycmF5IG9mIEpVTVAgZHNhX2JlZ2luIG9yIEpVTVAgKG5leHQpLAorCQkJCTsgdGVybWluYXRlZCBieSBhIGNhbGwgdG8gSlVNUCB3YWl0X3Jlc2VsZWN0CisKKzsgTGlua2VkIGxpc3RzIG9mIERTQSBzdHJ1Y3R1cmVzCitBQlNPTFVURSByZWNvbm5lY3RfZHNhX2hlYWQgPSAwCTsgTGluayBsaXN0IG9mIERTQXMgd2hpY2ggY2FuIHJlY29ubmVjdAorQUJTT0xVVEUgYWRkcl9yZWNvbm5lY3RfZHNhX2hlYWQgPSAwIDsgQWRkcmVzcyBvZiB2YXJpYWJsZSBjb250YWluaW5nCisJCQkJOyBhZGRyZXNzIG9mIHJlY29ubmVjdF9kc2FfaGVhZAorCis7IFRoZXNlIHNlbGVjdCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBvZiBhIE1PVkUgTUVNT1JZIGluc3RydWN0aW9uCitBQlNPTFVURSBkbW9kZV9tZW1vcnlfdG9fbWVtb3J5ID0gMHgwCitBQlNPTFVURSBkbW9kZV9tZW1vcnlfdG9fbmNyID0gMHgwCitBQlNPTFVURSBkbW9kZV9uY3JfdG9fbWVtb3J5ID0gMHgwCisKK0FCU09MVVRFIGFkZHJfc2NyYXRjaCA9IDB4MAorQUJTT0xVVEUgYWRkcl90ZW1wID0gMHgwCisKK0FCU09MVVRFIHNhdmVkX2RzYSA9IDB4MAorQUJTT0xVVEUgZW11bGZseSA9IDB4MAorQUJTT0xVVEUgYWRkcl9kc2EgPSAweDAKKworCisKKzsgSW50ZXJydXB0cyAtIAorOyBNU0IgaW5kaWNhdGVzIHR5cGUKKzsgMAloYW5kbGUgZXJyb3IgY29uZGl0aW9uCis7IDEgCWhhbmRsZSBtZXNzYWdlIAorOyAyIAloYW5kbGUgbm9ybWFsIGNvbmRpdGlvbgorOyAzCWRlYnVnZ2luZyBpbnRlcnJ1cHQKKzsgNCAJdGVzdGluZyBpbnRlcnJ1cHQgCis7IE5leHQgYnl0ZSBpbmRpY2F0ZXMgc3BlY2lmaWMgZXJyb3IKKworOyBYWFggbm90IHlldCBpbXBsZW1lbnRlZCwgSSdtIG5vdCBzdXJlIGlmIEkgd2FudCB0byAtIAorOyBOZXh0IGJ5dGUgaW5kaWNhdGVzIHRoZSByb3V0aW5lIHRoZSBlcnJvciBvY2N1cnJlZCBpbgorOyBUaGUgTFNCIGluZGljYXRlcyB0aGUgc3BlY2lmaWMgcGxhY2UgdGhlIGVycm9yIG9jY3VycmVkCisgCitBQlNPTFVURSBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UgPSAweDAwMDAwMDAwCTsgVW5leHBlY3RlZCBwaGFzZSBlbmNvdW50ZXJlZAorQUJTT0xVVEUgaW50X2Vycl9zZWxlY3RlZCA9IDB4MDAwMTAwMDAJCTsgU0VMRUNURUQgKG5lZSBSRVNFTEVDVEVEKQorQUJTT0xVVEUgaW50X2Vycl91bmV4cGVjdGVkX3Jlc2VsZWN0ID0gMHgwMDAyMDAwMCAKK0FCU09MVVRFIGludF9lcnJfY2hlY2tfY29uZGl0aW9uID0gMHgwMDAzMDAwMAkKK0FCU09MVVRFIGludF9lcnJfbm9fcGhhc2UgPSAweDAwMDQwMDAwCitBQlNPTFVURSBpbnRfbXNnX3dkdHIgPSAweDAxMDAwMDAwCQk7IFdEVFIgbWVzc2FnZSByZWNlaXZlZAorQUJTT0xVVEUgaW50X21zZ19zZHRyID0gMHgwMTAxMDAwMAkJOyBTRFRSIHJlY2VpdmVkCitBQlNPTFVURSBpbnRfbXNnXzEgPSAweDAxMDIwMDAwCQkJOyBzaW5nbGUgYnl0ZSBzcGVjaWFsIG1lc3NhZ2UKKwkJCQkJCTsgcmVjZWl2ZWQKKworQUJTT0xVVEUgaW50X25vcm1fc2VsZWN0X2NvbXBsZXRlID0gMHgwMjAwMDAwMAk7IFNlbGVjdCBjb21wbGV0ZSwgcmVwcm9ncmFtCisJCQkJCQk7IHJlZ2lzdGVycy4KK0FCU09MVVRFIGludF9ub3JtX3Jlc2VsZWN0X2NvbXBsZXRlID0gMHgwMjAxMDAwMAk7IE5leHVzIGVzdGFibGlzaGVkCitBQlNPTFVURSBpbnRfbm9ybV9jb21tYW5kX2NvbXBsZXRlID0gMHgwMjAyMDAwMCA7IENvbW1hbmQgY29tcGxldGUKK0FCU09MVVRFIGludF9ub3JtX2Rpc2Nvbm5lY3RlZCA9IDB4MDIwMzAwMDAJOyBEaXNjb25uZWN0ZWQgCitBQlNPTFVURSBpbnRfbm9ybV9hYm9ydGVkID0weDAyMDQwMDAwCQk7IEFib3J0ZWQgKmRzYQorQUJTT0xVVEUgaW50X25vcm1fcmVzZXQgPSAweDAyMDUwMDAwCQk7IEdlbmVyYXRlZCBCVVMgcmVzZXQuCitBQlNPTFVURSBpbnRfbm9ybV9lbXVsYXRlaW50Zmx5ID0gMHgwMjA2MDAwMAk7IDUzQzcxMCBFbXVsYXRlZCBpbnRmbHkKK0FCU09MVVRFIGludF9kZWJ1Z19icmVhayA9IDB4MDMwMDAwMDAJCTsgQnJlYWsgcG9pbnQKKworQUJTT0xVVEUgaW50X2RlYnVnX3BhbmljID0gMHgwMzBiMDAwMAkJOyBQYW5pYyBkcml2ZXIKKworCitBQlNPTFVURSBpbnRfdGVzdF8xID0gMHgwNDAwMDAwMAkJOyBUZXN0IDEgY29tcGxldGUKK0FCU09MVVRFIGludF90ZXN0XzIgPSAweDA0MDEwMDAwCQk7IFRlc3QgMiBjb21wbGV0ZQorQUJTT0xVVEUgaW50X3Rlc3RfMyA9IDB4MDQwMjAwMDAJCTsgVGVzdCAzIGNvbXBsZXRlCisKKworOyBUaGVzZSBzaG91bGQgc3RhcnQgd2l0aCAweDA1MDAwMDAwLCB3aXRoIGxvdyBiaXRzIGluY3JlbWVudGluZyBmb3IgCis7IGVhY2ggb25lLgorCisKKwkJCQkJCQorQUJTT0xVVEUgTkNSNTNjN3h4X21zZ19hYm9ydCA9IDAJOyBQb2ludGVyIHRvIGFib3J0IG1lc3NhZ2UKK0FCU09MVVRFIE5DUjUzYzd4eF9tc2dfcmVqZWN0ID0gMCAgICAgICA7IFBvaW50ZXIgdG8gcmVqZWN0IG1lc3NhZ2UKK0FCU09MVVRFIE5DUjUzYzd4eF96ZXJvCT0gMAkJOyBsb25nIHdpdGggemVybyBpbiBpdCwgdXNlIGZvciBzb3VyY2UKK0FCU09MVVRFIE5DUjUzYzd4eF9zaW5rID0gMAkJOyBsb25nIHRvIGR1bXAgd29ydGhsZXNzIGRhdGEgaW4KK0FCU09MVVRFIE5PUF9pbnNuID0gMAkJCTsgTk9QIGluc3RydWN0aW9uCisKKzsgUG9pbnRlciB0byBtZXNzYWdlLCBwb3RlbnRpYWxseSBtdWx0aS1ieXRlCitBQlNPTFVURSBtc2dfYnVmID0gMAorCis7IFBvaW50ZXIgdG8gaG9sZGluZyBhcmVhIGZvciByZXNlbGVjdGlvbiBpbmZvcm1hdGlvbgorQUJTT0xVVEUgcmVzZWxlY3RlZF9pZGVudGlmeSA9IDAKK0FCU09MVVRFIHJlc2VsZWN0ZWRfdGFnID0gMAorCis7IFJlcXVlc3Qgc2Vuc2UgY29tbWFuZCBwb2ludGVyLCBpdCdzIGEgNiBieXRlIGNvbW1hbmQsIHNob3VsZAorOyBiZSBjb25zdGFudCBmb3IgYWxsIGNvbW1hbmRzIHNpbmNlIHdlIGFsd2F5cyB3YW50IDE2IGJ5dGVzIG9mIAorOyBzZW5zZSBhbmQgd2UgZG9uJ3QgbmVlZCB0byBjaGFuZ2UgYW55IGZpZWxkcyBhcyB3ZSBkaWQgdW5kZXIgCis7IFNDU0ktSSB3aGVuIHdlIGFjdHVhbGx5IGNhcmVkIGFib3V0IHRoZSBMVU4gZmllbGQuCis7RVhURVJOQUwgTkNSNTNjN3h4X3NlbnNlCQk7IFJlcXVlc3Qgc2Vuc2UgY29tbWFuZAorCisKKzsgZHNhX3NjaGVkdWxlICAKKzsgUFVSUE9TRSA6IGFmdGVyIGEgRElTQ09OTkVDVCBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkLCBhbmQgcG9pbnRlcnMKKzsJc2F2ZWQsIGluc2VydCB0aGUgY3VycmVudCBEU0Egc3RydWN0dXJlIGF0IHRoZSBoZWFkIG9mIHRoZSAKKzsgCWRpc2Nvbm5lY3RlZCBxdWV1ZSBhbmQgZmFsbCB0aHJvdWdoIHRvIHRoZSBzY2hlZHVsZXIuCis7Cis7IENBTExTIDogT0sKKzsKKzsgSU5QVVRTIDogZHNhIC0gY3VycmVudCBEU0Egc3RydWN0dXJlLCByZWNvbm5lY3RfZHNhX2hlYWQgLSBsaXN0Cis7CW9mIGRpc2Nvbm5lY3RlZCBjb21tYW5kcworOworOyBNT0RJRklFUyA6IFNDUkFUQ0gsIHJlY29ubmVjdF9kc2FfaGVhZAorOyAKKzsgRVhJVFMgOiBhbHdheXMgcGFzc2VzIGNvbnRyb2wgdG8gc2NoZWR1bGUKKworRU5UUlkgZHNhX3NjaGVkdWxlCitkc2Ffc2NoZWR1bGU6CisKKworCisKKzsKKzsgQ2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IHBvaW50ZXIgd2l0aGluIHRoZSBEU0EgCis7IHN0cnVjdHVyZSBvZiB0aGUgY29tbWFuZCB0aGF0IGlzIGN1cnJlbnRseSBkaXNjb25uZWN0aW5nCis7CisKKyAgICA7IFJlYWQgd2hhdCBzaG91bGQgYmUgdGhlIGN1cnJlbnQgRFNBIGZyb20gbWVtb3J5IC0gYWN0dWFsIERTQQorICAgIDsgcmVnaXN0ZXIgaXMgcHJvYmFibHkgY29ycnVwdAorICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9zY3JhdGNoCisKK2F0IDB4MDAwMDAwNWUgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKworCisgICAgTU9WRSBTQ1JBVENIMCArIGRzYV9uZXh0IFRPIFNDUkFUQ0gwCisKK2F0IDB4MDAwMDAwNjEgOiAqLwkweDdlMzQzMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0NSQVRDSDEgKyAwIFRPIFNDUkFUQ0gxIFdJVEggQ0FSUlkKKworYXQgMHgwMDAwMDA2MyA6ICovCTB4N2YzNTAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBTQ1JBVENIMiArIDAgVE8gU0NSQVRDSDIgV0lUSCBDQVJSWQorCithdCAweDAwMDAwMDY1IDogKi8JMHg3ZjM2MDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNDUkFUQ0gzICsgMCBUTyBTQ1JBVENIMyBXSVRIIENBUlJZCisKK2F0IDB4MDAwMDAwNjcgOiAqLwkweDdmMzcwMDAwLDB4MDAwMDAwMDAsCisvKgorCis7IFBvaW50IHRoZSBuZXh0IGZpZWxkIG9mIHRoaXMgRFNBIHN0cnVjdHVyZSBhdCB0aGUgY3VycmVudCBkaXNjb25uZWN0ZWQgCis7IGxpc3QKKyAgICAKKyAgICBNT1ZFIE1FTU9SWSA0LCBhZGRyX3NjcmF0Y2gsIGRzYV9zY2hlZHVsZV9pbnNlcnQgKyA4CisKK2F0IDB4MDAwMDAwNjkgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDFiOCwKKy8qCisgICAgCitkc2Ffc2NoZWR1bGVfaW5zZXJ0OgorICAgIE1PVkUgTUVNT1JZIDQsIHJlY29ubmVjdF9kc2FfaGVhZCwgMCAKKworYXQgMHgwMDAwMDA2YyA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKworOyBBbmQgdXBkYXRlIHRoZSBoZWFkIHBvaW50ZXIuCisKKyAgICA7IFJlYWQgd2hhdCBzaG91bGQgYmUgdGhlIGN1cnJlbnQgRFNBIGZyb20gbWVtb3J5IC0gYWN0dWFsIERTQQorICAgIDsgcmVnaXN0ZXIgaXMgcHJvYmFibHkgY29ycnVwdAorICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9zY3JhdGNoCisKK2F0IDB4MDAwMDAwNmYgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKworCisgICAgCisgICAgTU9WRSBNRU1PUlkgNCwgYWRkcl9zY3JhdGNoLCByZWNvbm5lY3RfZHNhX2hlYWQKKworYXQgMHgwMDAwMDA3MiA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICAKKworCisKKworCisgICAgQ0xFQVIgQUNLCisKK2F0IDB4MDAwMDAwNzUgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCisKKyAgICA7IFRpbWUgdG8gY29ycmVjdCBEU0EgZm9sbG93aW5nIG1lbW9yeSBtb3ZlCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorCithdCAweDAwMDAwMDc3IDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCisgICAgV0FJVCBESVNDT05ORUNUCisKK2F0IDB4MDAwMDAwN2EgOiAqLwkweDQ4MDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCisKKworCisKKworICAgIEpVTVAgc2NoZWR1bGUKKworYXQgMHgwMDAwMDA3YyA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKworOworOyBzZWxlY3QKKzsKKzsgUFVSUE9TRSA6IGVzdGFibGlzaCBhIG5leHVzIGZvciB0aGUgU0NTSSBjb21tYW5kIHJlZmVyZW5jZWQgYnkgRFNBLgorOwlPbiBzdWNjZXNzLCB0aGUgY3VycmVudCBEU0Egc3RydWN0dXJlIGlzIHJlbW92ZWQgZnJvbSB0aGUgaXNzdWUgCis7CXF1ZXVlLiAgVXN1YWxseSwgdGhpcyBpcyBlbnRlcmVkIGFzIGEgZmFsbC10aHJvdWdoIGZyb20gc2NoZWR1bGUsCis7CWFsdGhvdWdoIHRoZSBjb250aW5nZW50IGFsbGVnaWFuY2UgaGFuZGxpbmcgY29kZSB3aWxsIHdyaXRlCis7CXRoZSBzZWxlY3QgZW50cnkgYWRkcmVzcyB0byB0aGUgRFNQIHRvIHJlc3RhcnQgYSBjb21tYW5kIGFzIGEgCis7CVJFUVVFU1QgU0VOU0UuICBBIG1lc3NhZ2UgaXMgc2VudCAodXN1YWxseSBJREVOVElGWSwgYWx0aG91Z2gKKzsJYWRkaXRpb25hbCBTRFRSIG9yIFdEVFIgbWVzc2FnZXMgbWF5IGJlIHNlbnQpLiAgQ09NTUFORCBPVVQKKzsJaXMgaGFuZGxlZC4KKzsKKzsgSU5QVVRTIDogRFNBIC0gU0NTSSBjb21tYW5kLCBpc3N1ZV9kc2FfaGVhZAorOworOyBDQUxMUyA6IE5PVCBPSworOworOyBNT0RJRklFUyA6IFNDUkFUQ0gsIGlzc3VlX2RzYV9oZWFkCis7Cis7IEVYSVRTIDogb24gcmVzZWxlY3Rpb24gb3Igc2VsZWN0aW9uLCBnbyB0byBzZWxlY3RfZmFpbGVkCis7CW90aGVyd2lzZSwgUkVUVVJOIHNvIGNvbnRyb2wgaXMgcGFzc2VkIGJhY2sgdG8gCis7CWRzYV9iZWdpbi4KKzsKKworRU5UUlkgc2VsZWN0CitzZWxlY3Q6CisKKworCisKKworCisKKworICAgIENMRUFSIFRBUkdFVAorCithdCAweDAwMDAwMDdlIDogKi8JMHg2MDAwMDIwMCwweDAwMDAwMDAwLAorLyoKKworOyBYWFgKKzsKKzsgSW4gZWZmZWN0LCBTRUxFQ1RJT04gb3BlcmF0aW9ucyBhcmUgYmFja2dyb3VuZGVkLCB3aXRoIGV4ZWN1dGlvbgorOyBjb250aW51aW5nIHVudGlsIGNvZGUgd2hpY2ggd2FpdHMgZm9yIFJFUSBvciBhIGZhdGFsIGludGVycnVwdCBpcyAKKzsgZW5jb3VudGVyZWQuCis7Cis7IFNvLCBmb3IgbW9yZSBwZXJmb3JtYW5jZSwgd2UgY291bGQgb3ZlcmxhcCB0aGUgY29kZSB3aGljaCByZW1vdmVzIAorOyB0aGUgY29tbWFuZCBmcm9tIHRoZSBOQ1JzIGlzc3VlIHF1ZXVlIHdpdGggdGhlIHNlbGVjdGlvbiwgYnV0IAorOyBhdCB0aGlzIHBvaW50IEkgZG9uJ3Qgd2FudCB0byBkZWFsIHdpdGggdGhlIGVycm9yIHJlY292ZXJ5LgorOworCisKKworICAgIDsgRW5hYmxlIHNlbGVjdGlvbiB0aW1lcgorCisKKworICAgIE1PVkUgQ1RFU1Q3ICYgMHhlZiBUTyBDVEVTVDcKKworYXQgMHgwMDAwMDA4MCA6ICovCTB4N2MxYmVmMDAsMHgwMDAwMDAwMCwKKy8qCisKKworICAgIFNFTEVDVCBBVE4gRlJPTSBkc2Ffc2VsZWN0LCBzZWxlY3RfZmFpbGVkCisKK2F0IDB4MDAwMDAwODIgOiAqLwkweDQzMDAwMDNjLDB4MDAwMDA4MjgsCisvKgorICAgIEpVTVAgc2VsZWN0X21zZ291dCwgV0hFTiBNU0dfT1VUCisKK2F0IDB4MDAwMDAwODQgOiAqLwkweDg2MGIwMDAwLDB4MDAwMDAyMTgsCisvKgorRU5UUlkgc2VsZWN0X21zZ291dAorc2VsZWN0X21zZ291dDoKKworICAgIDsgRGlzYWJsZSBzZWxlY3Rpb24gdGltZXIKKyAgICBNT1ZFIENURVNUNyB8IDB4MTAgVE8gQ1RFU1Q3CisKK2F0IDB4MDAwMDAwODYgOiAqLwkweDdhMWIxMDAwLDB4MDAwMDAwMDAsCisvKgorCisgICAgTU9WRSBGUk9NIGRzYV9tc2dvdXQsIFdIRU4gTVNHX09VVAorCithdCAweDAwMDAwMDg4IDogKi8JMHgxZTAwMDAwMCwweDAwMDAwMDQwLAorLyoKKworCisKKworCisKKworCisKKworICAgUkVUVVJOCisKK2F0IDB4MDAwMDAwOGEgOiAqLwkweDkwMDgwMDAwLDB4MDAwMDAwMDAsCisvKgorCis7IAorOyBzZWxlY3RfZG9uZQorOyAKKzsgUFVSUE9TRTogY29udGludWUgb24gdG8gbm9ybWFsIGRhdGEgdHJhbnNmZXI7IGNhbGxlZCBhcyB0aGUgZXhpdCAKKzsJcG9pbnQgZnJvbSBkc2FfYmVnaW4uCis7Cis7IElOUFVUUzogZHNhCis7Cis7IENBTExTOiBPSworOworOworCitzZWxlY3RfZG9uZToKKworOyBOT1RFIERTQSBpcyBjb3JydXB0IHdoZW4gd2UgYXJyaXZlIGhlcmUhCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorCithdCAweDAwMDAwMDhjIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCisKKworCisKKworCisKKzsgQWZ0ZXIgYSBzdWNjZXNzZnVsIHNlbGVjdGlvbiwgd2Ugc2hvdWxkIGdldCBlaXRoZXIgYSBDTUQgcGhhc2Ugb3IgCis7IHNvbWUgdHJhbnNmZXIgcmVxdWVzdCBuZWdvdGlhdGlvbiBtZXNzYWdlLgorCisgICAgSlVNUCBjbWRvdXQsIFdIRU4gQ01ECisKK2F0IDB4MDAwMDAwOGYgOiAqLwkweDgyMGIwMDAwLDB4MDAwMDAyNWMsCisvKgorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gTk9UIE1TR19JTiAKKworYXQgMHgwMDAwMDA5MSA6ICovCTB4OWYwMzAwMDAsMHgwMDAwMDAwMCwKKy8qCisKK3NlbGVjdF9tc2dfaW46CisgICAgQ0FMTCBtc2dfaW4sIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAwOTMgOiAqLwkweDhmMGIwMDAwLDB4MDAwMDA0MWMsCisvKgorICAgIEpVTVAgc2VsZWN0X21zZ19pbiwgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDA5NSA6ICovCTB4ODcwYjAwMDAsMHgwMDAwMDI0YywKKy8qCisKK2NtZG91dDoKKyAgICBJTlQgaW50X2Vycl91bmV4cGVjdGVkX3BoYXNlLCBXSEVOIE5PVCBDTUQKKworYXQgMHgwMDAwMDA5NyA6ICovCTB4OWEwMzAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKworCitFTlRSWSBjbWRvdXRfY21kb3V0CitjbWRvdXRfY21kb3V0OgorCisgICAgTU9WRSBGUk9NIGRzYV9jbWRvdXQsIFdIRU4gQ01ECisKK2F0IDB4MDAwMDAwOTkgOiAqLwkweDFhMDAwMDAwLDB4MDAwMDAwNDgsCisvKgorCisKKworCis7Cis7IGRhdGFfdHJhbnNmZXIgIAorOyBvdGhlcl9vdXQKKzsgb3RoZXJfaW4KKzsgb3RoZXJfdHJhbnNmZXIKKzsKKzsgUFVSUE9TRSA6IGhhbmRsZSB0aGUgbWFpbiBkYXRhIHRyYW5zZmVyIGZvciBhIFNDU0kgY29tbWFuZCBpbiAKKzsJc2V2ZXJhbCBwYXJ0cy4gIEluIHRoZSBmaXJzdCBwYXJ0LCBkYXRhX3RyYW5zZmVyLCBEQVRBX0lOCis7CWFuZCBEQVRBX09VVCBwaGFzZXMgYXJlIGFsbG93ZWQsIHdpdGggdGhlIHVzZXIgcHJvdmlkZWQKKzsJY29kZSAodXN1YWxseSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIHNjYXR0ZXIvZ2F0aGVyCis7CWxpc3QgYXNzb2NpYXRlZCB3aXRoIGEgU0NTSSBjb21tYW5kKSBjYWxsZWQgdG8gaGFuZGxlIHRoZXNlIAorOwlwaGFzZXMuCis7Cis7CUFmdGVyIGNvbnRyb2wgaGFzIHBhc3NlZCB0byBvbmUgb2YgdGhlIHVzZXIgcHJvdmlkZWQgCis7CURBVEFfSU4gb3IgREFUQV9PVVQgcm91dGluZXMsIGJhY2sgY2FsbHMgYXJlIG1hZGUgdG8gCis7CW90aGVyX3RyYW5zZmVyX2luIG9yIG90aGVyX3RyYW5zZmVyX291dCB0byBoYW5kbGUgbm9uLURBVEEgSU4KKzsJYW5kIERBVEEgT1VUIHBoYXNlcyByZXNwZWN0aXZlbHksIHdpdGggdGhlIHN0YXRlIG9mIHRoZSBhY3RpdmUKKzsJZGF0YSBwb2ludGVyIGJlaW5nIHByZXNlcnZlZCBpbiBURU1QLgorOworOwlPbiBjb21wbGV0aW9uLCB0aGUgdXNlciBjb2RlIHBhc3NlcyBjb250cm9sIHRvIG90aGVyX3RyYW5zZmVyCis7CXdoaWNoIGNhdXNlcyBEQVRBX0lOIGFuZCBEQVRBX09VVCB0byByZXN1bHQgaW4gdW5leHBlY3RlZF9waGFzZQorOwlpbnRlcnJ1cHRzIHNvIHRoYXQgZGF0YSBvdmVycnVucyBtYXkgYmUgdHJhcHBlZC4KKzsKKzsgSU5QVVRTIDogRFNBIC0gU0NTSSBjb21tYW5kCis7Cis7IENBTExTIDogT0sgaW4gZGF0YV90cmFuc2Zlcl9zdGFydCwgbm90IG9rIGluIG90aGVyX291dCBhbmQgb3RoZXJfaW4sIG9rIGluCis7CW90aGVyX3RyYW5zZmVyCis7Cis7IE1PRElGSUVTIDogU0NSQVRDSAorOworOyBFWElUUyA6IGlmIFNUQVRVUyBJTiBpcyBkZXRlY3RlZCwgc2lnbmlmeWluZyBjb21tYW5kIGNvbXBsZXRpb24sCis7CXRoZSBOQ1IganVtcHMgdG8gY29tbWFuZF9jb21wbGV0ZS4gIElmIE1TRyBJTiBvY2N1cnMsIGEgCis7CUNBTEwgaXMgbWFkZSB0byBtc2dfaW4uICBPdGhlcndpc2UsIG90aGVyX3RyYW5zZmVyIHJ1bnMgaW4gCis7CWFuIGluZmluaXRlIGxvb3AuCis7CQorCitFTlRSWSBkYXRhX3RyYW5zZmVyCitkYXRhX3RyYW5zZmVyOgorICAgIEpVTVAgY21kb3V0X2NtZG91dCwgV0hFTiBDTUQKKworYXQgMHgwMDAwMDA5YiA6ICovCTB4ODIwYjAwMDAsMHgwMDAwMDI2NCwKKy8qCisgICAgQ0FMTCBtc2dfaW4sIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAwOWQgOiAqLwkweDhmMGIwMDAwLDB4MDAwMDA0MWMsCisvKgorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gTVNHX09VVAorCithdCAweDAwMDAwMDlmIDogKi8JMHg5ZTBiMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBKVU1QIGRvX2RhdGFvdXQsIFdIRU4gREFUQV9PVVQKKworYXQgMHgwMDAwMDBhMSA6ICovCTB4ODAwYjAwMDAsMHgwMDAwMDJhNCwKKy8qCisgICAgSlVNUCBkb19kYXRhaW4sIFdIRU4gREFUQV9JTgorCithdCAweDAwMDAwMGEzIDogKi8JMHg4MTBiMDAwMCwweDAwMDAwMmZjLAorLyoKKyAgICBKVU1QIGNvbW1hbmRfY29tcGxldGUsIFdIRU4gU1RBVFVTCisKK2F0IDB4MDAwMDAwYTUgOiAqLwkweDgzMGIwMDAwLDB4MDAwMDA2NWMsCisvKgorICAgIEpVTVAgZGF0YV90cmFuc2ZlcgorCithdCAweDAwMDAwMGE3IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMjZjLAorLyoKK0VOVFJZIGVuZF9kYXRhX3RyYW5zZmVyCitlbmRfZGF0YV90cmFuc2ZlcjoKKworOworOyBGSVhNRTogT24gTkNSNTNjNzAwIGFuZCBOQ1I1M2M3MDAtNjYgY2hpcHMsIGRvX2RhdGFvdXQvZG9fZGF0YWluIAorOyBzaG91bGQgYmUgZml4ZWQgdXAgd2hlbmV2ZXIgdGhlIG5leHVzIGNoYW5nZXMgc28gaXQgY2FuIHBvaW50IHRvIHRoZSAKKzsgY29ycmVjdCByb3V0aW5lIGZvciB0aGF0IGNvbW1hbmQuCis7CisKKworOyBOYXN0eSBqdW1wIHRvIGRzYS0+ZGF0YW91dAorZG9fZGF0YW91dDoKKworICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9zY3JhdGNoCisKK2F0IDB4MDAwMDAwYTkgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKworCisgICAgTU9WRSBTQ1JBVENIMCArIGRzYV9kYXRhb3V0IFRPIFNDUkFUQ0gwCQorCithdCAweDAwMDAwMGFjIDogKi8JMHg3ZTM0NTAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNDUkFUQ0gxICsgMCBUTyBTQ1JBVENIMSBXSVRIIENBUlJZIAorCithdCAweDAwMDAwMGFlIDogKi8JMHg3ZjM1MDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNDUkFUQ0gyICsgMCBUTyBTQ1JBVENIMiBXSVRIIENBUlJZIAorCithdCAweDAwMDAwMGIwIDogKi8JMHg3ZjM2MDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNDUkFUQ0gzICsgMCBUTyBTQ1JBVENIMyBXSVRIIENBUlJZIAorCithdCAweDAwMDAwMGIyIDogKi8JMHg3ZjM3MDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICAKKyAgICBNT1ZFIE1FTU9SWSA0LCBhZGRyX3NjcmF0Y2gsIGRhdGFvdXRfdG9fanVtcCArIDQKKworYXQgMHgwMDAwMDBiNCA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMmUwLAorLyoKKyAgICAKK2RhdGFvdXRfdG9fanVtcDoKKyAgICBNT1ZFIE1FTU9SWSA0LCAwLCBkYXRhb3V0X2p1bXAgKyA0IAorCithdCAweDAwMDAwMGI3IDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAyZjgsCisvKgorCisgICAgOyBUaW1lIHRvIGNvcnJlY3QgRFNBIGZvbGxvd2luZyBtZW1vcnkgbW92ZQorICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9kc2EKKworYXQgMHgwMDAwMDBiYSA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKworZGF0YW91dF9qdW1wOgorICAgIEpVTVAgMAorCithdCAweDAwMDAwMGJkIDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMDAwLAorLyoKKworOyBOYXN0eSBqdW1wIHRvIGRzYS0+ZHNhaW4KK2RvX2RhdGFpbjoKKworICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9zY3JhdGNoCisKK2F0IDB4MDAwMDAwYmYgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKworCisgICAgTU9WRSBTQ1JBVENIMCArIGRzYV9kYXRhaW4gVE8gU0NSQVRDSDAJCisKK2F0IDB4MDAwMDAwYzIgOiAqLwkweDdlMzQ1NDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0NSQVRDSDEgKyAwIFRPIFNDUkFUQ0gxIFdJVEggQ0FSUlkgCisKK2F0IDB4MDAwMDAwYzQgOiAqLwkweDdmMzUwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0NSQVRDSDIgKyAwIFRPIFNDUkFUQ0gyIFdJVEggQ0FSUlkgCisKK2F0IDB4MDAwMDAwYzYgOiAqLwkweDdmMzYwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0NSQVRDSDMgKyAwIFRPIFNDUkFUQ0gzIFdJVEggQ0FSUlkgCisKK2F0IDB4MDAwMDAwYzggOiAqLwkweDdmMzcwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIAorICAgIE1PVkUgTUVNT1JZIDQsIGFkZHJfc2NyYXRjaCwgZGF0YWluX3RvX2p1bXAgKyA0CisKK2F0IDB4MDAwMDAwY2EgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDMzOCwKKy8qCisgICAgCitFTlRSWSBkYXRhaW5fdG9fanVtcAorZGF0YWluX3RvX2p1bXA6CisgICAgTU9WRSBNRU1PUlkgNCwgMCwgZGF0YWluX2p1bXAgKyA0CisKK2F0IDB4MDAwMDAwY2QgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDM1MCwKKy8qCisKKyAgICA7IFRpbWUgdG8gY29ycmVjdCBEU0EgZm9sbG93aW5nIG1lbW9yeSBtb3ZlCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorCithdCAweDAwMDAwMGQwIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCisKKworCitkYXRhaW5fanVtcDoKKyAgICBKVU1QIDAKKworYXQgMHgwMDAwMDBkMyA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKworCis7IE5vdGUgdGhhdCBvdGhlcl9vdXQgYW5kIG90aGVyX2luIGxvb3AgdW50aWwgYSBub24tZGF0YSBwaGFzZQorOyBpcyBkaXNjb3ZlcmVkLCBzbyB3ZSBvbmx5IGV4ZWN1dGUgcmV0dXJuIHN0YXRlbWVudHMgd2hlbiB3ZQorOyBjYW4gZ28gb24gdG8gdGhlIG5leHQgZGF0YSBwaGFzZSBibG9jayBtb3ZlIHN0YXRlbWVudC4KKworRU5UUlkgb3RoZXJfb3V0CitvdGhlcl9vdXQ6CisKKworCisgICAgSU5UIGludF9lcnJfdW5leHBlY3RlZF9waGFzZSwgV0hFTiBDTUQKKworYXQgMHgwMDAwMDBkNSA6ICovCTB4OWEwYjAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgSlVNUCBtc2dfaW5fcmVzdGFydCwgV0hFTiBNU0dfSU4gCisKK2F0IDB4MDAwMDAwZDcgOiAqLwkweDg3MGIwMDAwLDB4MDAwMDAzZmMsCisvKgorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gTVNHX09VVAorCithdCAweDAwMDAwMGQ5IDogKi8JMHg5ZTBiMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBJTlQgaW50X2Vycl91bmV4cGVjdGVkX3BoYXNlLCBXSEVOIERBVEFfSU4KKworYXQgMHgwMDAwMDBkYiA6ICovCTB4OTkwYjAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgSlVNUCBjb21tYW5kX2NvbXBsZXRlLCBXSEVOIFNUQVRVUworCithdCAweDAwMDAwMGRkIDogKi8JMHg4MzBiMDAwMCwweDAwMDAwNjVjLAorLyoKKyAgICBKVU1QIG90aGVyX291dCwgV0hFTiBOT1QgREFUQV9PVVQKKworYXQgMHgwMDAwMDBkZiA6ICovCTB4ODAwMzAwMDAsMHgwMDAwMDM1NCwKKy8qCisKKzsgVEVNUCBzaG91bGQgYmUgT0ssIGFzIHdlIGdvdCBoZXJlIGZyb20gYSBjYWxsIGluIHRoZSB1c2VyIGRhdGFvdXQgY29kZS4KKworICAgIFJFVFVSTgorCithdCAweDAwMDAwMGUxIDogKi8JMHg5MDA4MDAwMCwweDAwMDAwMDAwLAorLyoKKworRU5UUlkgb3RoZXJfaW4KK290aGVyX2luOgorCisKKworICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gQ01ECisKK2F0IDB4MDAwMDAwZTMgOiAqLwkweDlhMGIwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIEpVTVAgbXNnX2luX3Jlc3RhcnQsIFdIRU4gTVNHX0lOIAorCithdCAweDAwMDAwMGU1IDogKi8JMHg4NzBiMDAwMCwweDAwMDAwM2ZjLAorLyoKKyAgICBJTlQgaW50X2Vycl91bmV4cGVjdGVkX3BoYXNlLCBXSEVOIE1TR19PVVQKKworYXQgMHgwMDAwMDBlNyA6ICovCTB4OWUwYjAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgSU5UIGludF9lcnJfdW5leHBlY3RlZF9waGFzZSwgV0hFTiBEQVRBX09VVAorCithdCAweDAwMDAwMGU5IDogKi8JMHg5ODBiMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBKVU1QIGNvbW1hbmRfY29tcGxldGUsIFdIRU4gU1RBVFVTCisKK2F0IDB4MDAwMDAwZWIgOiAqLwkweDgzMGIwMDAwLDB4MDAwMDA2NWMsCisvKgorICAgIEpVTVAgb3RoZXJfaW4sIFdIRU4gTk9UIERBVEFfSU4KKworYXQgMHgwMDAwMDBlZCA6ICovCTB4ODEwMzAwMDAsMHgwMDAwMDM4YywKKy8qCisKKzsgVEVNUCBzaG91bGQgYmUgT0ssIGFzIHdlIGdvdCBoZXJlIGZyb20gYSBjYWxsIGluIHRoZSB1c2VyIGRhdGFpbiBjb2RlLgorCisgICAgUkVUVVJOCisKK2F0IDB4MDAwMDAwZWYgOiAqLwkweDkwMDgwMDAwLDB4MDAwMDAwMDAsCisvKgorCisKK0VOVFJZIG90aGVyX3RyYW5zZmVyCitvdGhlcl90cmFuc2ZlcjoKKyAgICBJTlQgaW50X2Vycl91bmV4cGVjdGVkX3BoYXNlLCBXSEVOIENNRAorCithdCAweDAwMDAwMGYxIDogKi8JMHg5YTBiMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBDQUxMIG1zZ19pbiwgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDBmMyA6ICovCTB4OGYwYjAwMDAsMHgwMDAwMDQxYywKKy8qCisgICAgSU5UIGludF9lcnJfdW5leHBlY3RlZF9waGFzZSwgV0hFTiBNU0dfT1VUCisKK2F0IDB4MDAwMDAwZjUgOiAqLwkweDllMGIwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gREFUQV9PVVQKKworYXQgMHgwMDAwMDBmNyA6ICovCTB4OTgwYjAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgSU5UIGludF9lcnJfdW5leHBlY3RlZF9waGFzZSwgV0hFTiBEQVRBX0lOCisKK2F0IDB4MDAwMDAwZjkgOiAqLwkweDk5MGIwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIEpVTVAgY29tbWFuZF9jb21wbGV0ZSwgV0hFTiBTVEFUVVMKKworYXQgMHgwMDAwMDBmYiA6ICovCTB4ODMwYjAwMDAsMHgwMDAwMDY1YywKKy8qCisgICAgSlVNUCBvdGhlcl90cmFuc2ZlcgorCithdCAweDAwMDAwMGZkIDogKi8JMHg4MDA4MDAwMCwweDAwMDAwM2M0LAorLyoKKworOworOyBtc2dfaW5fcmVzdGFydAorOyBtc2dfaW4KKzsgbXVuZ2VfbXNnCis7Cis7IFBVUlBPU0UgOiBwcm9jZXNzIG1lc3NhZ2VzIGZyb20gYSB0YXJnZXQuICBtc2dfaW4gaXMgY2FsbGVkIHdoZW4gdGhlIAorOwljYWxsZXIgaGFzbid0IHJlYWQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UuICBtdW5nZV9tZXNzYWdlCis7CWlzIGNhbGxlZCB3aGVuIHRoZSBjYWxsZXIgaGFzIHJlYWQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UsCis7CWFuZCBsZWZ0IGl0IGluIFNGQlIuICBtc2dfaW5fcmVzdGFydCBpcyBjYWxsZWQgd2hlbiB0aGUgY2FsbGVyIAorOwloYXNuJ3QgcmVhZCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbWVzc2FnZSwgYW5kIHdpc2hlcyBSRVRVUk4KKzsJdG8gdHJhbnNmZXIgY29udHJvbCBiYWNrIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBjb25kaXRpb25hbAorOwlDQUxMIGluc3RydWN0aW9uIHJhdGhlciB0aGFuIHRvIHRoZSBpbnN0cnVjdGlvbiBhZnRlciBpdC4KKzsKKzsJVmFyaW91cyBpbnRfKiBpbnRlcnJ1cHRzIGFyZSBnZW5lcmF0ZWQgd2hlbiB0aGUgaG9zdCBzeXN0ZW0KKzsJbmVlZHMgdG8gaW50ZXJ2ZW5lLCBhcyBpcyB0aGUgY2FzZSB3aXRoIFNEVFIsIFdEVFIsIGFuZAorOwlJTklUSUFURSBSRUNPVkVSWSBtZXNzYWdlcy4KKzsKKzsJV2hlbiB0aGUgaG9zdCBzeXN0ZW0gaGFuZGxlcyBvbmUgb2YgdGhlc2UgaW50ZXJydXB0cywKKzsJaXQgY2FuIHJlc3BvbmQgYnkgcmVlbnRlcmluZyBhdCByZWplY3RfbWVzc2FnZSwgCis7CXdoaWNoIHJlamVjdHMgdGhlIG1lc3NhZ2UgYW5kIHJldHVybnMgY29udHJvbCB0bworOwl0aGUgY2FsbGVyIG9mIG1zZ19pbiBvciBtdW5nZV9tc2csIGFjY2VwdF9tZXNzYWdlCis7CXdoaWNoIGNsZWFycyBBQ0sgYW5kIHJldHVybnMgY29udHJvbCwgb3IgcmVwbHlfbWVzc2FnZQorOwl3aGljaCBzZW5kcyB0aGUgbWVzc2FnZSBwb2ludGVkIHRvIGJ5IHRoZSBEU0EgCis7CW1zZ291dF9vdGhlciB0YWJsZSBpbmRpcmVjdCBmaWVsZC4KKzsKKzsJRElTQ09OTkVDVCBtZXNzYWdlcyBhcmUgaGFuZGxlZCBieSBtb3ZpbmcgdGhlIGNvbW1hbmQKKzsJdG8gdGhlIHJlY29ubmVjdF9kc2FfcXVldWUuCisKKzsgTk9URTogRFNBIHNob3VsZCBiZSB2YWxpZCB3aGVuIHdlIGdldCBoZXJlIC0gd2UgY2Fubm90IHNhdmUgYm90aCBpdAorOwlhbmQgVEVNUCBpbiB0aGlzIHJvdXRpbmUuCisKKzsKKzsgSU5QVVRTIDogRFNBIC0gU0NTSSBDT01NQU5ELCBTRkJSIC0gZmlyc3QgYnl0ZSBvZiBtZXNzYWdlIChtdW5nZV9tc2cKKzsJb25seSkKKzsKKzsgQ0FMTFMgOiBOTy4gIFRoZSBURU1QIHJlZ2lzdGVyIGlzbid0IGJhY2tlZCB1cCB0byBhbGxvdyBuZXN0ZWQgY2FsbHMuCis7Cis7IE1PRElGSUVTIDogU0NSQVRDSCwgRFNBIG9uIERJU0NPTk5FQ1QKKzsKKzsgRVhJVFMgOiBPbiByZWNlaXB0IG9mIFNBVkUgREFUQSBQT0lOVEVSLCBSRVNUT1JFIFBPSU5URVJTLAorOwlhbmQgbm9ybWFsIHJldHVybiBmcm9tIG1lc3NhZ2UgaGFuZGxlcnMgcnVubmluZyB1bmRlcgorOwlMaW51eCwgY29udHJvbCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiAgUmVjZWlwdAorOwlvZiBESVNDT05ORUNUIG1lc3NhZ2VzIHBhc3MgY29udHJvbCB0byBkc2Ffc2NoZWR1bGUuCis7CitFTlRSWSBtc2dfaW5fcmVzdGFydAorbXNnX2luX3Jlc3RhcnQ6Cis7IFhYWCAtIGhhY2tpc2gKKzsKKzsgU2luY2UgaXQncyBlYXNpZXIgdG8gZGVidWcgY2hhbmdlcyB0byB0aGUgc3RhdGljYWxseSAKKzsgY29tcGlsZWQgY29kZSwgcmF0aGVyIHRoYW4gdGhlIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCAKKzsgc3R1ZmYsIHN1Y2ggYXMKKzsKKzsgCU1PVkUgeCwgeSwgV0hFTiBkYXRhX3BoYXNlCis7IAlDQUxMIG90aGVyX3osIFdIRU4gTk9UIGRhdGFfcGhhc2UKKzsgCU1PVkUgeCwgeSwgV0hFTiBkYXRhX3BoYXNlCis7Cis7IEknZCBsaWtlIHRvIGhhdmUgY2VydGFpbiByb3V0aW5lcyAobm90YWJseSB0aGUgbWVzc2FnZSBoYW5kbGVyKQorOyByZXN0YXJ0IG9uIHRoZSBjb25kaXRpb25hbCBjYWxsIHJhdGhlciB0aGFuIHRoZSBuZXh0IGluc3RydWN0aW9uLgorOworOyBTbywgc3VidHJhY3QgOCBmcm9tIHRoZSByZXR1cm4gYWRkcmVzcworCisgICAgTU9WRSBURU1QMCArIDB4ZjggVE8gVEVNUDAKKworYXQgMHgwMDAwMDBmZiA6ICovCTB4N2UxY2Y4MDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBURU1QMSArIDB4ZmYgVE8gVEVNUDEgV0lUSCBDQVJSWQorCithdCAweDAwMDAwMTAxIDogKi8JMHg3ZjFkZmYwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFRFTVAyICsgMHhmZiBUTyBURU1QMiBXSVRIIENBUlJZCisKK2F0IDB4MDAwMDAxMDMgOiAqLwkweDdmMWVmZjAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgVEVNUDMgKyAweGZmIFRPIFRFTVAzIFdJVEggQ0FSUlkKKworYXQgMHgwMDAwMDEwNSA6ICovCTB4N2YxZmZmMDAsMHgwMDAwMDAwMCwKKy8qCisKK0VOVFJZIG1zZ19pbgorbXNnX2luOgorICAgIE1PVkUgMSwgbXNnX2J1ZiwgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDEwNyA6ICovCTB4MGYwMDAwMDEsMHgwMDAwMDAwMCwKKy8qCisKK211bmdlX21zZzoKKyAgICBKVU1QIG11bmdlX2V4dGVuZGVkLCBJRiAweDAxCQk7IEVYVEVOREVEIE1FU1NBR0UKKworYXQgMHgwMDAwMDEwOSA6ICovCTB4ODAwYzAwMDEsMHgwMDAwMDU3NCwKKy8qCisgICAgSlVNUCBtdW5nZV8yLCBJRiAweDIwLCBBTkQgTUFTSyAweGRmCTsgdHdvIGJ5dGUgbWVzc2FnZQorCithdCAweDAwMDAwMTBiIDogKi8JMHg4MDBjZGYyMCwweDAwMDAwNDY0LAorLyoKKzsKKzsgWFhYIC0gSSd2ZSBzZWVuIGEgaGFuZGZ1bCBvZiBicm9rZW4gU0NTSSBkZXZpY2VzIHdoaWNoIGZhaWwgdG8gaXNzdWUKKzsgCWEgU0FWRSBQT0lOVEVSUyBtZXNzYWdlIGJlZm9yZSBkaXNjb25uZWN0aW5nIGluIHRoZSBtaWRkbGUgb2YgCis7IAlhIHRyYW5zZmVyLCBhc3N1bWluZyB0aGF0IHRoZSBEQVRBIFBPSU5URVIgd2lsbCBiZSBpbXBsaWNpdGx5IAorOyAJcmVzdG9yZWQuICAKKzsKKzsgSGlzdG9yaWNhbGx5LCBJJ3ZlIG9mdGVuIGRvbmUgYW4gaW1wbGljaXQgc2F2ZSB3aGVuIHRoZSBESVNDT05ORUNUCis7IG1lc3NhZ2UgaXMgcHJvY2Vzc2VkLiAgV2UgbWF5IHdhbnQgdG8gY29uc2lkZXIgaGF2aW5nIHRoZSBvcHRpb24gb2YgCis7IGRvaW5nIHRoYXQgaGVyZS4gCis7CisgICAgSlVNUCBtdW5nZV9zYXZlX2RhdGFfcG9pbnRlciwgSUYgMHgwMgk7IFNBVkUgREFUQSBQT0lOVEVSCisKK2F0IDB4MDAwMDAxMGQgOiAqLwkweDgwMGMwMDAyLDB4MDAwMDA0NmMsCisvKgorICAgIEpVTVAgbXVuZ2VfcmVzdG9yZV9wb2ludGVycywgSUYgMHgwMwk7IFJFU1RPUkUgUE9JTlRFUlMgCisKK2F0IDB4MDAwMDAxMGYgOiAqLwkweDgwMGMwMDAzLDB4MDAwMDA1MTgsCisvKgorICAgIEpVTVAgbXVuZ2VfZGlzY29ubmVjdCwgSUYgMHgwNAkJOyBESVNDT05ORUNUCisKK2F0IDB4MDAwMDAxMTEgOiAqLwkweDgwMGMwMDA0LDB4MDAwMDA1NmMsCisvKgorICAgIElOVCBpbnRfbXNnXzEsIElGIDB4MDcJCQk7IE1FU1NBR0UgUkVKRUNUCisKK2F0IDB4MDAwMDAxMTMgOiAqLwkweDk4MGMwMDA3LDB4MDEwMjAwMDAsCisvKgorICAgIElOVCBpbnRfbXNnXzEsIElGIDB4MGYJCQk7IElOSVRJQVRFIFJFQ09WRVJZCisKK2F0IDB4MDAwMDAxMTUgOiAqLwkweDk4MGMwMDBmLDB4MDEwMjAwMDAsCisvKgorCisKKworICAgIEpVTVAgcmVqZWN0X21lc3NhZ2UKKworYXQgMHgwMDAwMDExNyA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDYwNCwKKy8qCisKK211bmdlXzI6CisgICAgSlVNUCByZWplY3RfbWVzc2FnZQorCithdCAweDAwMDAwMTE5IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwNjA0LAorLyoKKzsKKzsgVGhlIFNDU0kgc3RhbmRhcmQgYWxsb3dzIHRhcmdldHMgdG8gcmVjb3ZlciBmcm9tIHRyYW5zaWVudCAKKzsgZXJyb3IgY29uZGl0aW9ucyBieSBiYWNraW5nIHVwIHRoZSBkYXRhIHBvaW50ZXIgd2l0aCBhIAorOyBSRVNUT1JFIFBPSU5URVJTIG1lc3NhZ2UuICAKKzsJCis7IFNvLCB3ZSBtdXN0IHNhdmUgYW5kIHJlc3RvcmUgdGhlIF9yZXNpZHVhbF8gY29kZSBhcyB3ZWxsIGFzIAorOyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBwb2ludGVyLiAgQmVjYXVzZSBvZiB0aGlzIG1lc3NpbmVzcywKKzsgaXQgaXMgc2ltcGxlciB0byBwdXQgZHluYW1pYyBjb2RlIGluIHRoZSBkc2EgZm9yIHRoaXMgYW5kIHRvCis7IGp1c3QgZG8gYSBzaW1wbGUganVtcCBkb3duIHRoZXJlLiAKKzsKKworbXVuZ2Vfc2F2ZV9kYXRhX3BvaW50ZXI6CisKKyAgICA7IFdlIGhhdmUgc29tZXRoaW5nIGluIFRFTVAgaGVyZSwgc28gZmlyc3Qgd2UgbXVzdCBzYXZlIHRoYXQKKyAgICBNT1ZFIFRFTVAwIFRPIFNGQlIKKworYXQgMHgwMDAwMDExYiA6ICovCTB4NzIxYzAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gwCisKK2F0IDB4MDAwMDAxMWQgOiAqLwkweDZhMzQwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgVEVNUDEgVE8gU0ZCUgorCithdCAweDAwMDAwMTFmIDogKi8JMHg3MjFkMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNGQlIgVE8gU0NSQVRDSDEKKworYXQgMHgwMDAwMDEyMSA6ICovCTB4NmEzNTAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBURU1QMiBUTyBTRkJSCisKK2F0IDB4MDAwMDAxMjMgOiAqLwkweDcyMWUwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMgorCithdCAweDAwMDAwMTI1IDogKi8JMHg2YTM2MDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFRFTVAzIFRPIFNGQlIKKworYXQgMHgwMDAwMDEyNyA6ICovCTB4NzIxZjAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gzCisKK2F0IDB4MDAwMDAxMjkgOiAqLwkweDZhMzcwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgTUVNT1JZIDQsIGFkZHJfc2NyYXRjaCwganVtcF90ZW1wICsgNAorCithdCAweDAwMDAwMTJiIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDA5YzgsCisvKgorICAgIDsgTm93IHJlc3RvcmUgRFNBCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorCithdCAweDAwMDAwMTJlIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCisgICAgTU9WRSBEU0EwICsgZHNhX3NhdmVfZGF0YV9wb2ludGVyIFRPIFNGQlIKKworYXQgMHgwMDAwMDEzMSA6ICovCTB4NzYxMDAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gwCisKK2F0IDB4MDAwMDAxMzMgOiAqLwkweDZhMzQwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgRFNBMSArIDB4ZmYgVE8gU0ZCUiBXSVRIIENBUlJZCisKK2F0IDB4MDAwMDAxMzUgOiAqLwkweDc3MTFmZjAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMQorCithdCAweDAwMDAwMTM3IDogKi8JMHg2YTM1MDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIERTQTIgKyAweGZmIFRPIFNGQlIgV0lUSCBDQVJSWSAKKworYXQgMHgwMDAwMDEzOSA6ICovCTB4NzcxMmZmMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gyCisKK2F0IDB4MDAwMDAxM2IgOiAqLwkweDZhMzYwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgRFNBMyArIDB4ZmYgVE8gU0ZCUiBXSVRIIENBUlJZCisKK2F0IDB4MDAwMDAxM2QgOiAqLwkweDc3MTNmZjAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMworCithdCAweDAwMDAwMTNmIDogKi8JMHg2YTM3MDAwMCwweDAwMDAwMDAwLAorLyoKKworICAgIAorICAgIE1PVkUgTUVNT1JZIDQsIGFkZHJfc2NyYXRjaCwganVtcF9kc2Ffc2F2ZSArIDQKKworYXQgMHgwMDAwMDE0MSA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwNTE0LAorLyoKKyAgICAKK2p1bXBfZHNhX3NhdmU6CisgICAgSlVNUCAwCisKK2F0IDB4MDAwMDAxNDQgOiAqLwkweDgwMDgwMDAwLDB4MDAwMDAwMDAsCisvKgorCittdW5nZV9yZXN0b3JlX3BvaW50ZXJzOgorCisgICAgOyBUaGUgY29kZSBhdCBkc2FfcmVzdG9yZV9wb2ludGVycyB3aWxsIFJFVFVSTiwgYnV0IHdlIGRvbid0IGNhcmUKKyAgICA7IGFib3V0IFRFTVAgaGVyZSwgYXMgaXQgd2lsbCBvdmVyd3JpdGUgaXQgYW55d2F5LgorCisgICAgTU9WRSBEU0EwICsgZHNhX3Jlc3RvcmVfcG9pbnRlcnMgVE8gU0ZCUgorCithdCAweDAwMDAwMTQ2IDogKi8JMHg3NjEwMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNGQlIgVE8gU0NSQVRDSDAKKworYXQgMHgwMDAwMDE0OCA6ICovCTB4NmEzNDAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBEU0ExICsgMHhmZiBUTyBTRkJSIFdJVEggQ0FSUlkKKworYXQgMHgwMDAwMDE0YSA6ICovCTB4NzcxMWZmMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gxCisKK2F0IDB4MDAwMDAxNGMgOiAqLwkweDZhMzUwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgRFNBMiArIDB4ZmYgVE8gU0ZCUiBXSVRIIENBUlJZCisKK2F0IDB4MDAwMDAxNGUgOiAqLwkweDc3MTJmZjAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMgorCithdCAweDAwMDAwMTUwIDogKi8JMHg2YTM2MDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIERTQTMgKyAweGZmIFRPIFNGQlIgV0lUSCBDQVJSWQorCithdCAweDAwMDAwMTUyIDogKi8JMHg3NzEzZmYwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNGQlIgVE8gU0NSQVRDSDMKKworYXQgMHgwMDAwMDE1NCA6ICovCTB4NmEzNzAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKyAgICAKKyAgICBNT1ZFIE1FTU9SWSA0LCBhZGRyX3NjcmF0Y2gsIGp1bXBfZHNhX3Jlc3RvcmUgKyA0CisKK2F0IDB4MDAwMDAxNTYgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDU2OCwKKy8qCisgICAgCitqdW1wX2RzYV9yZXN0b3JlOgorICAgIEpVTVAgMAorCithdCAweDAwMDAwMTU5IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMDAwLAorLyoKKworCittdW5nZV9kaXNjb25uZWN0OgorCisKKworCisKKworCisKKworIAorCisKKworCisKKworCisKKworCisgICAgSlVNUCBkc2Ffc2NoZWR1bGUKKworYXQgMHgwMDAwMDE1YiA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDE3OCwKKy8qCisKKworCisKKworbXVuZ2VfZXh0ZW5kZWQ6CisgICAgQ0xFQVIgQUNLCisKK2F0IDB4MDAwMDAxNWQgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gTk9UIE1TR19JTgorCithdCAweDAwMDAwMTVmIDogKi8JMHg5ZjAzMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIDEsIG1zZ19idWYgKyAxLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMTYxIDogKi8JMHgwZjAwMDAwMSwweDAwMDAwMDAxLAorLyoKKyAgICBKVU1QIG11bmdlX2V4dGVuZGVkXzIsIElGIDB4MDIKKworYXQgMHgwMDAwMDE2MyA6ICovCTB4ODAwYzAwMDIsMHgwMDAwMDVhNCwKKy8qCisgICAgSlVNUCBtdW5nZV9leHRlbmRlZF8zLCBJRiAweDAzIAorCithdCAweDAwMDAwMTY1IDogKi8JMHg4MDBjMDAwMywweDAwMDAwNWQ0LAorLyoKKyAgICBKVU1QIHJlamVjdF9tZXNzYWdlCisKK2F0IDB4MDAwMDAxNjcgOiAqLwkweDgwMDgwMDAwLDB4MDAwMDA2MDQsCisvKgorCittdW5nZV9leHRlbmRlZF8yOgorICAgIENMRUFSIEFDSworCithdCAweDAwMDAwMTY5IDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIDEsIG1zZ19idWYgKyAyLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMTZiIDogKi8JMHgwZjAwMDAwMSwweDAwMDAwMDAyLAorLyoKKyAgICBKVU1QIHJlamVjdF9tZXNzYWdlLCBJRiBOT1QgMHgwMgk7IE11c3QgYmUgV0RUUgorCithdCAweDAwMDAwMTZkIDogKi8JMHg4MDA0MDAwMiwweDAwMDAwNjA0LAorLyoKKyAgICBDTEVBUiBBQ0sKKworYXQgMHgwMDAwMDE2ZiA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSAxLCBtc2dfYnVmICsgMywgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDE3MSA6ICovCTB4MGYwMDAwMDEsMHgwMDAwMDAwMywKKy8qCisgICAgSU5UIGludF9tc2dfd2R0cgorCithdCAweDAwMDAwMTczIDogKi8JMHg5ODA4MDAwMCwweDAxMDAwMDAwLAorLyoKKworbXVuZ2VfZXh0ZW5kZWRfMzoKKyAgICBDTEVBUiBBQ0sKKworYXQgMHgwMDAwMDE3NSA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSAxLCBtc2dfYnVmICsgMiwgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDE3NyA6ICovCTB4MGYwMDAwMDEsMHgwMDAwMDAwMiwKKy8qCisgICAgSlVNUCByZWplY3RfbWVzc2FnZSwgSUYgTk9UIDB4MDEJOyBNdXN0IGJlIFNEVFIKKworYXQgMHgwMDAwMDE3OSA6ICovCTB4ODAwNDAwMDEsMHgwMDAwMDYwNCwKKy8qCisgICAgQ0xFQVIgQUNLCisKK2F0IDB4MDAwMDAxN2IgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgMiwgbXNnX2J1ZiArIDMsIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAxN2QgOiAqLwkweDBmMDAwMDAyLDB4MDAwMDAwMDMsCisvKgorICAgIElOVCBpbnRfbXNnX3NkdHIKKworYXQgMHgwMDAwMDE3ZiA6ICovCTB4OTgwODAwMDAsMHgwMTAxMDAwMCwKKy8qCisKK0VOVFJZIHJlamVjdF9tZXNzYWdlCityZWplY3RfbWVzc2FnZToKKyAgICBTRVQgQVROCisKK2F0IDB4MDAwMDAxODEgOiAqLwkweDU4MDAwMDA4LDB4MDAwMDAwMDAsCisvKgorICAgIENMRUFSIEFDSworCithdCAweDAwMDAwMTgzIDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIDEsIE5DUjUzYzd4eF9tc2dfcmVqZWN0LCBXSEVOIE1TR19PVVQKKworYXQgMHgwMDAwMDE4NSA6ICovCTB4MGUwMDAwMDEsMHgwMDAwMDAwMCwKKy8qCisgICAgUkVUVVJOCisKK2F0IDB4MDAwMDAxODcgOiAqLwkweDkwMDgwMDAwLDB4MDAwMDAwMDAsCisvKgorCitFTlRSWSBhY2NlcHRfbWVzc2FnZQorYWNjZXB0X21lc3NhZ2U6CisgICAgQ0xFQVIgQVROCisKK2F0IDB4MDAwMDAxODkgOiAqLwkweDYwMDAwMDA4LDB4MDAwMDAwMDAsCisvKgorICAgIENMRUFSIEFDSworCithdCAweDAwMDAwMThiIDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKyAgICBSRVRVUk4KKworYXQgMHgwMDAwMDE4ZCA6ICovCTB4OTAwODAwMDAsMHgwMDAwMDAwMCwKKy8qCisKK0VOVFJZIHJlc3BvbmRfbWVzc2FnZQorcmVzcG9uZF9tZXNzYWdlOgorICAgIFNFVCBBVE4KKworYXQgMHgwMDAwMDE4ZiA6ICovCTB4NTgwMDAwMDgsMHgwMDAwMDAwMCwKKy8qCisgICAgQ0xFQVIgQUNLCisKK2F0IDB4MDAwMDAxOTEgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgRlJPTSBkc2FfbXNnb3V0X290aGVyLCBXSEVOIE1TR19PVVQKKworYXQgMHgwMDAwMDE5MyA6ICovCTB4MWUwMDAwMDAsMHgwMDAwMDA2OCwKKy8qCisgICAgUkVUVVJOCisKK2F0IDB4MDAwMDAxOTUgOiAqLwkweDkwMDgwMDAwLDB4MDAwMDAwMDAsCisvKgorCis7Cis7IGNvbW1hbmRfY29tcGxldGUKKzsKKzsgUFVSUE9TRSA6IGhhbmRsZSBjb21tYW5kIHRlcm1pbmF0aW9uIHdoZW4gU1RBVFVTIElOIGlzIGRldGVjdGVkIGJ5IHJlYWRpbmcKKzsJYSBzdGF0dXMgYnl0ZSBmb2xsb3dlZCBieSBhIGNvbW1hbmQgdGVybWluYXRpb24gbWVzc2FnZS4gCis7Cis7CU5vcm1hbCB0ZXJtaW5hdGlvbiByZXN1bHRzIGluIGFuIElOVEZMWSBpbnN0cnVjdGlvbiwgYW5kIAorOwl0aGUgaG9zdCBzeXN0ZW0gY2FuIHBpY2sgb3V0IHdoaWNoIGNvbW1hbmQgdGVybWluYXRlZCBieSAKKzsJZXhhbWluaW5nIHRoZSBNRVNTQUdFIGFuZCBTVEFUVVMgYnVmZmVycyBvZiBhbGwgY3VycmVudGx5IAorOwlleGVjdXRpbmcgY29tbWFuZHM7Cis7Cis7CUFibm9ybWFsIChDSEVDS19DT05ESVRJT04pIHRlcm1pbmF0aW9uIHJlc3VsdHMgaW4gYW4KKzsJaW50X2Vycl9jaGVja19jb25kaXRpb24gaW50ZXJydXB0IHNvIHRoYXQgYSBSRVFVRVNUIFNFTlNFCis7CWNvbW1hbmQgY2FuIGJlIGlzc3VlZCBvdXQtb2Ytb3JkZXIgc28gdGhhdCBubyBvdGhlciBjb21tYW5kCis7CWNsZWFycyB0aGUgY29udGluZ2VudCBhbGxlZ2lhbmNlIGNvbmRpdGlvbi4KKzsJCis7Cis7IElOUFVUUyA6IERTQSAtIGNvbW1hbmQJCis7Cis7IENBTExTIDogT0sKKzsKKzsgRVhJVFMgOiBPbiBzdWNjZXNzZnVsIHRlcm1pbmF0aW9uLCBjb250cm9sIGlzIHBhc3NlZCB0byBzY2hlZHVsZS4KKzsJT24gYWJub3JtYWwgdGVybWluYXRpb24sIHRoZSB1c2VyIHdpbGwgdXN1YWxseSBtb2RpZnkgdGhlIAorOwlEU0EgZmllbGRzIGFuZCBjb3JyZXNwb25kaW5nIGJ1ZmZlcnMgYW5kIHJldHVybiBjb250cm9sCis7CXRvIHNlbGVjdC4KKzsKKworRU5UUlkgY29tbWFuZF9jb21wbGV0ZQorY29tbWFuZF9jb21wbGV0ZToKKyAgICBNT1ZFIEZST00gZHNhX3N0YXR1cywgV0hFTiBTVEFUVVMKKworYXQgMHgwMDAwMDE5NyA6ICovCTB4MWIwMDAwMDAsMHgwMDAwMDA2MCwKKy8qCisKKyAgICBNT1ZFIFNGQlIgVE8gU0NSQVRDSDAJCTsgU2F2ZSBzdGF0dXMKKworYXQgMHgwMDAwMDE5OSA6ICovCTB4NmEzNDAwMDAsMHgwMDAwMDAwMCwKKy8qCisKK0VOVFJZIGNvbW1hbmRfY29tcGxldGVfbXNnaW4KK2NvbW1hbmRfY29tcGxldGVfbXNnaW46CisgICAgTU9WRSBGUk9NIGRzYV9tc2dpbiwgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDE5YiA6ICovCTB4MWYwMDAwMDAsMHgwMDAwMDA1OCwKKy8qCis7IEluZGljYXRlIHRoYXQgd2Ugc2hvdWxkIGJlIGV4cGVjdGluZyBhIGRpc2Nvbm5lY3QKKworCisKKyAgICA7IEFib3ZlIGNvZGUgY2xlYXJlZCB0aGUgVW5leHBlY3RlZCBEaXNjb25uZWN0IGJpdCwgd2hhdCBkbyB3ZSBkbz8KKworICAgIENMRUFSIEFDSworCithdCAweDAwMDAwMTlkIDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKworICAgIFdBSVQgRElTQ09OTkVDVAorCithdCAweDAwMDAwMTlmIDogKi8JMHg0ODAwMDAwMCwweDAwMDAwMDAwLAorLyoKKworOworOyBUaGUgU0NTSSBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0IHdoZW4gYSBVTklUIEFUVEVOVElPTiBjb25kaXRpb24KKzsgaXMgcGVuZGluZywgYXMgaW5kaWNhdGVkIGJ5IGEgQ0hFQ0sgQ09ORElUSU9OIHN0YXR1cyBtZXNzYWdlLAorOyB0aGUgdGFyZ2V0IHNoYWxsIHJldmVydCB0byBhc3luY2hyb25vdXMgdHJhbnNmZXJzLiAgU2luY2UKKzsgc3luY2hyb25vdXMgdHJhbnNmZXJzIHBhcmFtZXRlcnMgYXJlIG1haW50YWluZWQgb24gYSBwZXIgSU5JVElBVE9SL1RBUkdFVCAKKzsgYmFzaXMsIGFuZCByZXR1cm5pbmcgY29udHJvbCB0byBvdXIgc2NoZWR1bGVyIGNvdWxkIHdvcmsgb24gYSBjb21tYW5kCis7IHJ1bm5pbmcgb24gYW5vdGhlciBsdW4gb24gdGhhdCB0YXJnZXQgdXNpbmcgdGhlIG9sZCBwYXJhbWV0ZXJzLCB3ZSBtdXN0Cis7IGludGVycnVwdCB0aGUgaG9zdCBwcm9jZXNzb3IgdG8gZ2V0IHRoZW0gY2hhbmdlZCwgb3IgY2hhbmdlIHRoZW0gb3Vyc2VsdmVzLgorOworOyBPbmNlIFNDU0ktSUkgdGFnZ2VkIHF1ZXVlaW5nIGlzIGltcGxlbWVudGVkLCB0aGluZ3Mgd2lsbCBiZSBldmVuIG1vcmUKKzsgaGFpcnksIHNpbmNlIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb25zIGV4aXN0IG9uIGEgcGVyLXRhcmdldC9sdW4KKzsgYmFzaXMsIGFuZCBpc3N1aW5nIGEgbmV3IGNvbW1hbmQgd2l0aCBhIGRpZmZlcmVudCB0YWcgd291bGQgY2xlYXIgaXQuCis7IEluIHRoZXNlIGNhc2VzLCB3ZSBtdXN0IGludGVycnVwdCB0aGUgaG9zdCBwcm9jZXNzb3IgdG8gZ2V0IGEgcmVxdWVzdCAKKzsgYWRkZWQgdG8gdGhlIEhFQUQgb2YgdGhlIHF1ZXVlIHdpdGggdGhlIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZCwgb3Igd2UKKzsgbXVzdCBhdXRvbWF0aWNhbGx5IGlzc3VlIHRoZSByZXF1ZXN0IHNlbnNlIGNvbW1hbmQuCisKKworCisKKworCisKKyAgICBJTlQgaW50X25vcm1fZW11bGF0ZWludGZseQorCithdCAweDAwMDAwMWExIDogKi8JMHg5ODA4MDAwMCwweDAyMDYwMDAwLAorLyoKKworCisKKworCisKKyAgICA7IFRpbWUgdG8gY29ycmVjdCBEU0EgZm9sbG93aW5nIG1lbW9yeSBtb3ZlCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorCithdCAweDAwMDAwMWEzIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCisKKworCisKKyAgICBKVU1QIHNjaGVkdWxlCisKK2F0IDB4MDAwMDAxYTYgOiAqLwkweDgwMDgwMDAwLDB4MDAwMDAwMDAsCisvKgorY29tbWFuZF9mYWlsZWQ6CisgICAgSU5UIGludF9lcnJfY2hlY2tfY29uZGl0aW9uCisKK2F0IDB4MDAwMDAxYTggOiAqLwkweDk4MDgwMDAwLDB4MDAwMzAwMDAsCisvKgorCisKKworCis7Cis7IHdhaXRfcmVzZWxlY3QKKzsKKzsgUFVSUE9TRSA6IFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIGlkbGUgcm91dGluZSwgd2hlcmUgY29udHJvbCBsYW5kcworOwl3aGVuIHRoZXJlIGFyZSBubyBuZXcgcHJvY2Vzc2VzIHRvIHNjaGVkdWxlLiAgd2FpdF9yZXNlbGVjdAorOwl3YWl0cyBmb3IgcmVzZWxlY3Rpb24sIHNlbGVjdGlvbiwgYW5kIG5ldyBjb21tYW5kcy4KKzsKKzsJV2hlbiBhIHN1Y2Nlc3NmdWwgcmVzZWxlY3Rpb24gb2NjdXJzLCB3aXRoIHRoZSBhaWQgCis7CW9mIGZpeGVkIHVwIGNvZGUgaW4gZWFjaCBEU0EsIHdhaXRfcmVzZWxlY3Qgd2Fsa3MgdGhlIAorOwlyZWNvbm5lY3RfZHNhX3F1ZXVlLCBhc2tpbmcgZWFjaCBkc2EgaWYgdGhlIHRhcmdldCBJRAorOwlhbmQgTFVOIG1hdGNoIGl0cy4KKzsKKzsJSWYgYSBtYXRjaCBpcyBmb3VuZCwgYSBjYWxsIGlzIG1hZGUgYmFjayB0byByZXNlbGVjdGVkX29rLAorOwl3aGljaCB0aHJvdWdoIHRoZSBtaXJhY2xlcyBvZiBzZWxmIG1vZGlmeWluZyBjb2RlLCBleHRyYWN0cworOwl0aGUgZm91bmQgRFNBIGZyb20gdGhlIHJlY29ubmVjdF9kc2FfcXVldWUgYW5kIHRoZW4gCis7CXJldHVybnMgY29udHJvbCB0byB0aGUgRFNBcyB0aHJlYWQgb2YgZXhlY3V0aW9uLgorOworOyBJTlBVVFMgOiBOT05FCis7Cis7IENBTExTIDogT0sKKzsKKzsgTU9ESUZJRVMgOiBEU0EsCis7Cis7IEVYSVRTIDogT24gc3VjY2Vzc2Z1bCByZXNlbGVjdGlvbiwgY29udHJvbCBpcyByZXR1cm5lZCB0byB0aGUgCis7CURTQSB3aGljaCBjYWxsZWQgcmVzZWxlY3RlZF9vay4gIElmIHRoZSBXQUlUIFJFU0VMRUNUCis7CXdhcyBpbnRlcnJ1cHRlZCBieSBhIG5ldyBjb21tYW5kcyBhcnJpdmFsIHNpZ25hbGVkIGJ5IAorOwlTSUdfUCwgY29udHJvbCBpcyBwYXNzZWQgdG8gc2NoZWR1bGUuICBJZiB0aGUgTkNSIGlzIAorOwlzZWxlY3RlZCwgdGhlIGhvc3Qgc3lzdGVtIGlzIGludGVycnVwdGVkIHdpdGggYW4gCis7CWludF9lcnJfc2VsZWN0ZWQgd2hpY2ggaXMgdXN1YWxseSByZXNwb25kZWQgdG8gYnkKKzsJc2V0dGluZyBEU1AgdG8gdGhlIHRhcmdldF9hYm9ydCBhZGRyZXNzLgorCitFTlRSWSB3YWl0X3Jlc2VsZWN0Cit3YWl0X3Jlc2VsZWN0OgorCisKKworCisKKworICAgIFdBSVQgUkVTRUxFQ1Qgd2FpdF9yZXNlbGVjdF9mYWlsZWQKKworYXQgMHgwMDAwMDFhYSA6ICovCTB4NTAwMDAwMDAsMHgwMDAwMDgwMCwKKy8qCisKK3Jlc2VsZWN0ZWQ6CisKKworCisgICAgQ0xFQVIgVEFSR0VUCisKK2F0IDB4MDAwMDAxYWMgOiAqLwkweDYwMDAwMjAwLDB4MDAwMDAwMDAsCisvKgorICAgIAorICAgIDsgUmVhZCBhbGwgZGF0YSBuZWVkZWQgdG8gcmVlc3RhYmxpc2ggdGhlIG5leHVzIC0gCisgICAgTU9WRSAxLCByZXNlbGVjdGVkX2lkZW50aWZ5LCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMWFlIDogKi8JMHgwZjAwMDAwMSwweDAwMDAwMDAwLAorLyoKKyAgICA7IFdlIHVzZWQgdG8gQ0xFQVIgQUNLIGhlcmUuCisKKworCisKKworICAgIDsgUG9pbnQgRFNBIGF0IHRoZSBjdXJyZW50IGhlYWQgb2YgdGhlIGRpc2Nvbm5lY3RlZCBxdWV1ZS4KKyAgICAKKyAgICBNT1ZFIE1FTU9SWSA0LCByZWNvbm5lY3RfZHNhX2hlYWQsIGFkZHJfc2NyYXRjaAorCithdCAweDAwMDAwMWIwIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIAorCisgICAgTU9WRSBNRU1PUlkgNCwgYWRkcl9zY3JhdGNoLCBzYXZlZF9kc2EKKworYXQgMHgwMDAwMDFiMyA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKworCisKKworICAgIDsgRml4IHRoZSB1cGRhdGUtbmV4dCBwb2ludGVyIHNvIHRoYXQgdGhlIHJlY29ubmVjdF9kc2FfaGVhZAorICAgIDsgcG9pbnRlciBpcyB0aGUgb25lIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGlmIHRoaXMgRFNBIGlzIGEgaGl0IAorICAgIDsgYW5kIHdlIHJlbW92ZSBpdCBmcm9tIHRoZSBxdWV1ZS4KKworICAgIE1PVkUgTUVNT1JZIDQsIGFkZHJfcmVjb25uZWN0X2RzYV9oZWFkLCByZXNlbGVjdGVkX29rX3BhdGNoICsgOAorCithdCAweDAwMDAwMWI2IDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDA3ZWMsCisvKgorCisgICAgOyBUaW1lIHRvIGNvcnJlY3QgRFNBIGZvbGxvd2luZyBtZW1vcnkgbW92ZQorICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9kc2EKKworYXQgMHgwMDAwMDFiOSA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKworCitFTlRSWSByZXNlbGVjdGVkX2NoZWNrX25leHQKK3Jlc2VsZWN0ZWRfY2hlY2tfbmV4dDoKKworCisKKyAgICA7IENoZWNrIGZvciBhIE5VTEwgcG9pbnRlci4KKyAgICBNT1ZFIERTQTAgVE8gU0ZCUgorCithdCAweDAwMDAwMWJjIDogKi8JMHg3MjEwMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBKVU1QIHJlc2VsZWN0ZWRfbm90X2VuZCwgSUYgTk9UIDAKKworYXQgMHgwMDAwMDFiZSA6ICovCTB4ODAwNDAwMDAsMHgwMDAwMDczOCwKKy8qCisgICAgTU9WRSBEU0ExIFRPIFNGQlIKKworYXQgMHgwMDAwMDFjMCA6ICovCTB4NzIxMTAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgSlVNUCByZXNlbGVjdGVkX25vdF9lbmQsIElGIE5PVCAwCisKK2F0IDB4MDAwMDAxYzIgOiAqLwkweDgwMDQwMDAwLDB4MDAwMDA3MzgsCisvKgorICAgIE1PVkUgRFNBMiBUTyBTRkJSCisKK2F0IDB4MDAwMDAxYzQgOiAqLwkweDcyMTIwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIEpVTVAgcmVzZWxlY3RlZF9ub3RfZW5kLCBJRiBOT1QgMAorCithdCAweDAwMDAwMWM2IDogKi8JMHg4MDA0MDAwMCwweDAwMDAwNzM4LAorLyoKKyAgICBNT1ZFIERTQTMgVE8gU0ZCUgorCithdCAweDAwMDAwMWM4IDogKi8JMHg3MjEzMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBKVU1QIHJlc2VsZWN0ZWRfbm90X2VuZCwgSUYgTk9UIDAKKworYXQgMHgwMDAwMDFjYSA6ICovCTB4ODAwNDAwMDAsMHgwMDAwMDczOCwKKy8qCisgICAgSU5UIGludF9lcnJfdW5leHBlY3RlZF9yZXNlbGVjdAorCithdCAweDAwMDAwMWNjIDogKi8JMHg5ODA4MDAwMCwweDAwMDIwMDAwLAorLyoKKworcmVzZWxlY3RlZF9ub3RfZW5kOgorICAgIDsKKyAgICA7IFhYWCB0aGUgQUxVIGlzIG9ubHkgZWlnaHQgYml0cyB3aWRlLCBhbmQgdGhlIGFzc2VtYmxlcgorICAgIDsgd29udCBkbyB0aGUgZGlydCB3b3JrIGZvciB1cy4gIEFzIGxvbmcgYXMgZHNhX2NoZWNrX3Jlc2VsZWN0CisgICAgOyBpcyBuZWdhdGl2ZSwgd2UgbmVlZCB0byBzaWduIGV4dGVuZCB3aXRoIDEgYml0cyB0byB0aGUgZnVsbAorICAgIDsgMzIgYml0IHdpZHRoIG9mIHRoZSBhZGRyZXNzLgorICAgIDsKKyAgICA7IEEgcG90ZW50aWFsIHdvcmsgYXJvdW5kIHdvdWxkIGJlIHRvIGhhdmUgYSBrbm93biBhbGlnbm1lbnQgCisgICAgOyBvZiB0aGUgRFNBIHN0cnVjdHVyZSBzdWNoIHRoYXQgdGhlIGJhc2UgYWRkcmVzcyBwbHVzIAorICAgIDsgZHNhX2NoZWNrX3Jlc2VsZWN0IGRvZXNuJ3QgcmVxdWlyZSBjYXJyeWluZyBmcm9tIGJ5dGVzIAorICAgIDsgaGlnaGVyIHRoYW4gdGhlIExTQi4KKyAgICA7CisKKyAgICBNT1ZFIERTQTAgVE8gU0ZCUgorCithdCAweDAwMDAwMWNlIDogKi8JMHg3MjEwMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNGQlIgKyBkc2FfY2hlY2tfcmVzZWxlY3QgVE8gU0NSQVRDSDAKKworYXQgMHgwMDAwMDFkMCA6ICovCTB4NmUzNDAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBEU0ExIFRPIFNGQlIKKworYXQgMHgwMDAwMDFkMiA6ICovCTB4NzIxMTAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBTRkJSICsgMHhmZiBUTyBTQ1JBVENIMSBXSVRIIENBUlJZCisKK2F0IDB4MDAwMDAxZDQgOiAqLwkweDZmMzVmZjAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgRFNBMiBUTyBTRkJSCisKK2F0IDB4MDAwMDAxZDYgOiAqLwkweDcyMTIwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0ZCUiArIDB4ZmYgVE8gU0NSQVRDSDIgV0lUSCBDQVJSWQorCithdCAweDAwMDAwMWQ4IDogKi8JMHg2ZjM2ZmYwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIERTQTMgVE8gU0ZCUgorCithdCAweDAwMDAwMWRhIDogKi8JMHg3MjEzMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNGQlIgKyAweGZmIFRPIFNDUkFUQ0gzIFdJVEggQ0FSUlkKKworYXQgMHgwMDAwMDFkYyA6ICovCTB4NmYzN2ZmMDAsMHgwMDAwMDAwMCwKKy8qCisKKyAgICAKKyAgICBNT1ZFIE1FTU9SWSA0LCBhZGRyX3NjcmF0Y2gsIHJlc2VsZWN0ZWRfY2hlY2sgKyA0CisKK2F0IDB4MDAwMDAxZGUgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDc5NCwKKy8qCisgICAgCisKKyAgICA7IFRpbWUgdG8gY29ycmVjdCBEU0EgZm9sbG93aW5nIG1lbW9yeSBtb3ZlCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorCithdCAweDAwMDAwMWUxIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCityZXNlbGVjdGVkX2NoZWNrOgorICAgIEpVTVAgMAorCithdCAweDAwMDAwMWU0IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMDAwLAorLyoKKworCis7Cis7CisKKzsgV2UgaGF2ZSBwcm9ibGVtcyBoZXJlIC0gdGhlIG1lbW9yeSBtb3ZlIGNvcnJ1cHRzIFRFTVAgYW5kIERTQS4gIFRoaXMKKzsgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBEU0EgY29kZSwgYW5kIHBhdGNoZWQgZnJvbSBtYW55IHBsYWNlcy4gIFNjcmF0Y2gKKzsgaXMgcHJvYmFibHkgZnJlZSB3aGVuIGl0IGlzIGNhbGxlZC4KKzsgV2UgaGF2ZSB0bzoKKzsgICBjb3B5IHRlbXAgdG8gc2NyYXRjaCwgb25lIGJ5dGUgYXQgYSB0aW1lCis7ICAgd3JpdGUgc2NyYXRjaCB0byBwYXRjaCBhIGp1bXAgaW4gcGxhY2Ugb2YgdGhlIHJldHVybgorOyAgIGRvIHRoZSBtb3ZlIG1lbW9yeQorOyAgIGp1bXAgdG8gdGhlIHBhdGNoZWQgaW4gcmV0dXJuIGFkZHJlc3MKKzsgRFNBIGlzIGNvcnJ1cHQgd2hlbiB3ZSBnZXQgaGVyZSwgYW5kIGNhbiBiZSBsZWZ0IGNvcnJ1cHQKKworRU5UUlkgcmVzZWxlY3RlZF9vaworcmVzZWxlY3RlZF9vazoKKyAgICBNT1ZFIFRFTVAwIFRPIFNGQlIKKworYXQgMHgwMDAwMDFlNiA6ICovCTB4NzIxYzAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gwCisKK2F0IDB4MDAwMDAxZTggOiAqLwkweDZhMzQwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgVEVNUDEgVE8gU0ZCUgorCithdCAweDAwMDAwMWVhIDogKi8JMHg3MjFkMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNGQlIgVE8gU0NSQVRDSDEKKworYXQgMHgwMDAwMDFlYyA6ICovCTB4NmEzNTAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBURU1QMiBUTyBTRkJSCisKK2F0IDB4MDAwMDAxZWUgOiAqLwkweDcyMWUwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMgorCithdCAweDAwMDAwMWYwIDogKi8JMHg2YTM2MDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFRFTVAzIFRPIFNGQlIKKworYXQgMHgwMDAwMDFmMiA6ICovCTB4NzIxZjAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gzCisKK2F0IDB4MDAwMDAxZjQgOiAqLwkweDZhMzcwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgTUVNT1JZIDQsIGFkZHJfc2NyYXRjaCwgcmVzZWxlY3RlZF9va19qdW1wICsgNAorCithdCAweDAwMDAwMWY2IDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDA3ZjQsCisvKgorcmVzZWxlY3RlZF9va19wYXRjaDoKKyAgICBNT1ZFIE1FTU9SWSA0LCAwLCAwCisKK2F0IDB4MDAwMDAxZjkgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qCityZXNlbGVjdGVkX29rX2p1bXA6CisgICAgSlVNUCAwCisKK2F0IDB4MDAwMDAxZmMgOiAqLwkweDgwMDgwMDAwLDB4MDAwMDAwMDAsCisvKgorCisKKworCisKK3NlbGVjdGVkOgorICAgIElOVCBpbnRfZXJyX3NlbGVjdGVkOworCithdCAweDAwMDAwMWZlIDogKi8JMHg5ODA4MDAwMCwweDAwMDEwMDAwLAorLyoKKworOworOyBBIHNlbGVjdCBvciByZXNlbGVjdCBmYWlsdXJlIGNhbiBiZSBjYXVzZWQgYnkgb25lIG9mIHR3byBjb25kaXRpb25zIDogCis7IDEuICBTSUdfUCB3YXMgc2V0LiAgVGhpcyB3aWxsIGJlIHRoZSBjYXNlIGlmIHRoZSB1c2VyIGhhcyB3cml0dGVuCis7CWEgbmV3IHZhbHVlIHRvIGEgcHJldmlvdXNseSBOVUxMIGhlYWQgb2YgdGhlIGlzc3VlIHF1ZXVlLgorOworOyAyLiAgVGhlIE5DUjUzYzgxMCB3YXMgc2VsZWN0ZWQgb3IgcmVzZWxlY3RlZCBieSBhbm90aGVyIGRldmljZS4KKzsKKzsgMy4gIFRoZSBidXMgd2FzIGFscmVhZHkgYnVzeSBzaW5jZSB3ZSB3ZXJlIHNlbGVjdGVkIG9yIHJlc2VsZWN0ZWQKKzsJYmVmb3JlIHN0YXJ0aW5nIHRoZSBjb21tYW5kLgorCit3YWl0X3Jlc2VsZWN0X2ZhaWxlZDoKKworCisKKzsgQ2hlY2sgc2VsZWN0ZWQgYml0LiAgCisKKyAgICA7IE11c3Qgd29yayBvdXQgaG93IHRvIHRlbGwgaWYgd2UgYXJlIHNlbGVjdGVkLi4uLgorCisKKworCis7IFJlYWRpbmcgQ1RFU1QyIGNsZWFycyB0aGUgU0lHX1AgYml0IGluIHRoZSBJU1RBVCByZWdpc3Rlci4KKyAgICBNT1ZFIENURVNUMiAmIDB4NDAgVE8gU0ZCUgkKKworYXQgMHgwMDAwMDIwMCA6ICovCTB4NzQxNjQwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgSlVNUCBzY2hlZHVsZSwgSUYgMHg0MAorCithdCAweDAwMDAwMjAyIDogKi8JMHg4MDBjMDA0MCwweDAwMDAwMDAwLAorLyoKKzsgQ2hlY2sgY29ubmVjdGVkIGJpdC4gIAorOyBGSVhNRTogdGhpcyBuZWVkcyB0byBjaGFuZ2UgaWYgd2Ugc3VwcG9ydCB0YXJnZXQgbW9kZQorICAgIE1PVkUgSVNUQVQgJiAweDA4IFRPIFNGQlIKKworYXQgMHgwMDAwMDIwNCA6ICovCTB4NzQyMTA4MDAsMHgwMDAwMDAwMCwKKy8qCisgICAgSlVNUCByZXNlbGVjdGVkLCBJRiAweDA4CisKK2F0IDB4MDAwMDAyMDYgOiAqLwkweDgwMGMwMDA4LDB4MDAwMDA2YjAsCisvKgorOyBGSVhNRSA6IFNvbWV0aGluZyBib2d1cyBoYXBwZW5lZCwgYW5kIHdlIHNob3VsZG4ndCBmYWlsIHNpbGVudGx5LgorCisKKworICAgIElOVCBpbnRfZGVidWdfcGFuaWMKKworYXQgMHgwMDAwMDIwOCA6ICovCTB4OTgwODAwMDAsMHgwMzBiMDAwMCwKKy8qCisKKworCitzZWxlY3RfZmFpbGVkOgorCisgICAgOyBEaXNhYmxlIHNlbGVjdGlvbiB0aW1lcgorICAgIE1PVkUgQ1RFU1Q3IHwgMHgxMCBUTyBDVEVTVDcKKworYXQgMHgwMDAwMDIwYSA6ICovCTB4N2ExYjEwMDAsMHgwMDAwMDAwMCwKKy8qCisKKworCisKKzsgT3RoZXJ3aXNlLCBtYXNrIHRoZSBzZWxlY3RlZCBhbmQgcmVzZWxlY3RlZCBiaXRzIG9mZiBTSVNUMAorCisgICAgOyBMZXQncyBhc3N1bWUgd2UgZG9uJ3QgZ2V0IHNlbGVjdGVkIGZvciBub3cKKyAgICBNT1ZFIFNTVEFUMCAmIDB4MTAgVE8gU0ZCUgorCithdCAweDAwMDAwMjBjIDogKi8JMHg3NDBkMTAwMCwweDAwMDAwMDAwLAorLyoKKworCisKKworICAgIEpVTVAgcmVzZWxlY3RlZCwgSUYgMHgxMCAKKworYXQgMHgwMDAwMDIwZSA6ICovCTB4ODAwYzAwMTAsMHgwMDAwMDZiMCwKKy8qCis7IElmIFNJR1AgaXMgc2V0LCB0aGUgdXNlciBqdXN0IGdhdmUgdXMgYW5vdGhlciBjb21tYW5kLCBhbmQKKzsgd2Ugc2hvdWxkIHJlc3RhcnQgb3IgcmV0dXJuIHRvIHRoZSBzY2hlZHVsZXIuCis7IFJlYWRpbmcgQ1RFU1QyIGNsZWFycyB0aGUgU0lHX1AgYml0IGluIHRoZSBJU1RBVCByZWdpc3Rlci4KKyAgICBNT1ZFIENURVNUMiAmIDB4NDAgVE8gU0ZCUgkKKworYXQgMHgwMDAwMDIxMCA6ICovCTB4NzQxNjQwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgSlVNUCBzZWxlY3QsIElGIDB4NDAKKworYXQgMHgwMDAwMDIxMiA6ICovCTB4ODAwYzAwNDAsMHgwMDAwMDFmOCwKKy8qCis7IENoZWNrIGNvbm5lY3RlZCBiaXQuICAKKzsgRklYTUU6IHRoaXMgbmVlZHMgdG8gY2hhbmdlIGlmIHdlIHN1cHBvcnQgdGFyZ2V0IG1vZGUKKzsgRklYTUU6IGlzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8gCisgICAgTU9WRSBJU1RBVCAmIDB4MDggVE8gU0ZCUgorCithdCAweDAwMDAwMjE0IDogKi8JMHg3NDIxMDgwMCwweDAwMDAwMDAwLAorLyoKKyAgICBKVU1QIHJlc2VsZWN0ZWQsIElGIDB4MDgKKworYXQgMHgwMDAwMDIxNiA6ICovCTB4ODAwYzAwMDgsMHgwMDAwMDZiMCwKKy8qCis7IEZJWE1FIDogU29tZXRoaW5nIGJvZ3VzIGhhcHBlbmVkLCBhbmQgd2Ugc2hvdWxkbid0IGZhaWwgc2lsZW50bHkuCisKKworCisgICAgSU5UIGludF9kZWJ1Z19wYW5pYworCithdCAweDAwMDAwMjE4IDogKi8JMHg5ODA4MDAwMCwweDAzMGIwMDAwLAorLyoKKworCis7Cis7IHRlc3RfMQorOyB0ZXN0XzIKKzsKKzsgUFVSUE9TRSA6IHJ1biBzb21lIHZlcmlmaWNhdGlvbiB0ZXN0cyBvbiB0aGUgTkNSLiAgdGVzdF8xCis7CWNvcGllcyB0ZXN0X3NyYyB0byB0ZXN0X2Rlc3QgYW5kIGludGVycnVwdHMgdGhlIGhvc3QKKzsJcHJvY2Vzc29yLCB0ZXN0aW5nIGZvciBjYWNoZSBjb2hlcmVuY3kgYW5kIGludGVycnVwdAorOyAJcHJvYmxlbXMgaW4gdGhlIHByb2Nlc3Nlcy4KKzsKKzsJdGVzdF8yIHJ1bnMgYSBjb21tYW5kIHdpdGggb2Zmc2V0cyByZWxhdGl2ZSB0byB0aGUgCis7CURTQSBvbiBlbnRyeSwgYW5kIGlzIHVzZWZ1bCBmb3IgbWlzY2VsbGFuZW91cyBleHBlcmltZW50YXRpb24uCis7CisKKzsgVmVyaWZ5IHRoYXQgaW50ZXJydXB0cyBhcmUgd29ya2luZyBjb3JyZWN0bHkgYW5kIHRoYXQgd2UgZG9uJ3QgCis7IGhhdmUgYSBjYWNoZSBpbnZhbGlkYXRpb24gcHJvYmxlbS4KKworQUJTT0xVVEUgdGVzdF9zcmMgPSAwLCB0ZXN0X2Rlc3QgPSAwCitFTlRSWSB0ZXN0XzEKK3Rlc3RfMToKKyAgICBNT1ZFIE1FTU9SWSA0LCB0ZXN0X3NyYywgdGVzdF9kZXN0CisKK2F0IDB4MDAwMDAyMWEgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgSU5UIGludF90ZXN0XzEKKworYXQgMHgwMDAwMDIxZCA6ICovCTB4OTgwODAwMDAsMHgwNDAwMDAwMCwKKy8qCisKKzsKKzsgUnVuIGFyYml0cmFyeSBjb21tYW5kcywgd2l0aCB0ZXN0IGNvZGUgZXN0YWJsaXNoaW5nIGEgRFNBCis7CisgCitFTlRSWSB0ZXN0XzIKK3Rlc3RfMjoKKyAgICBDTEVBUiBUQVJHRVQKKworYXQgMHgwMDAwMDIxZiA6ICovCTB4NjAwMDAyMDAsMHgwMDAwMDAwMCwKKy8qCisKKyAgICA7IEVuYWJsZSBzZWxlY3Rpb24gdGltZXIKKworCisKKyAgICBNT1ZFIENURVNUNyAmIDB4ZWYgVE8gQ1RFU1Q3CisKK2F0IDB4MDAwMDAyMjEgOiAqLwkweDdjMWJlZjAwLDB4MDAwMDAwMDAsCisvKgorCisKKyAgICBTRUxFQ1QgQVROIEZST00gMCwgdGVzdF8yX2ZhaWwKKworYXQgMHgwMDAwMDIyMyA6ICovCTB4NDMwMDAwMDAsMHgwMDAwMDhkYywKKy8qCisgICAgSlVNUCB0ZXN0XzJfbXNnb3V0LCBXSEVOIE1TR19PVVQKKworYXQgMHgwMDAwMDIyNSA6ICovCTB4ODYwYjAwMDAsMHgwMDAwMDg5YywKKy8qCitFTlRSWSB0ZXN0XzJfbXNnb3V0Cit0ZXN0XzJfbXNnb3V0OgorCisgICAgOyBEaXNhYmxlIHNlbGVjdGlvbiB0aW1lcgorICAgIE1PVkUgQ1RFU1Q3IHwgMHgxMCBUTyBDVEVTVDcKKworYXQgMHgwMDAwMDIyNyA6ICovCTB4N2ExYjEwMDAsMHgwMDAwMDAwMCwKKy8qCisKKyAgICBNT1ZFIEZST00gOCwgV0hFTiBNU0dfT1VUCisKK2F0IDB4MDAwMDAyMjkgOiAqLwkweDFlMDAwMDAwLDB4MDAwMDAwMDgsCisvKgorICAgIE1PVkUgRlJPTSAxNiwgV0hFTiBDTUQgCisKK2F0IDB4MDAwMDAyMmIgOiAqLwkweDFhMDAwMDAwLDB4MDAwMDAwMTAsCisvKgorICAgIE1PVkUgRlJPTSAyNCwgV0hFTiBEQVRBX0lOCisKK2F0IDB4MDAwMDAyMmQgOiAqLwkweDE5MDAwMDAwLDB4MDAwMDAwMTgsCisvKgorICAgIE1PVkUgRlJPTSAzMiwgV0hFTiBTVEFUVVMKKworYXQgMHgwMDAwMDIyZiA6ICovCTB4MWIwMDAwMDAsMHgwMDAwMDAyMCwKKy8qCisgICAgTU9WRSBGUk9NIDQwLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMjMxIDogKi8JMHgxZjAwMDAwMCwweDAwMDAwMDI4LAorLyoKKworCisKKyAgICBDTEVBUiBBQ0sKKworYXQgMHgwMDAwMDIzMyA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisgICAgV0FJVCBESVNDT05ORUNUCisKK2F0IDB4MDAwMDAyMzUgOiAqLwkweDQ4MDAwMDAwLDB4MDAwMDAwMDAsCisvKgordGVzdF8yX2ZhaWw6CisKKyAgICA7IERpc2FibGUgc2VsZWN0aW9uIHRpbWVyCisgICAgTU9WRSBDVEVTVDcgfCAweDEwIFRPIENURVNUNworCithdCAweDAwMDAwMjM3IDogKi8JMHg3YTFiMTAwMCwweDAwMDAwMDAwLAorLyoKKworICAgIElOVCBpbnRfdGVzdF8yCisKK2F0IDB4MDAwMDAyMzkgOiAqLwkweDk4MDgwMDAwLDB4MDQwMTAwMDAsCisvKgorCitFTlRSWSBkZWJ1Z19icmVhaworZGVidWdfYnJlYWs6CisgICAgSU5UIGludF9kZWJ1Z19icmVhaworCithdCAweDAwMDAwMjNiIDogKi8JMHg5ODA4MDAwMCwweDAzMDAwMDAwLAorLyoKKworOworOyBpbml0aWF0b3JfYWJvcnQKKzsgdGFyZ2V0X2Fib3J0Cis7Cis7IFBVUlBPU0UgOiBBYm9ydCB0aGUgY3VycmVudGx5IGVzdGFibGlzaGVkIG5leHVzIGZyb20gd2l0aCBpbml0aWF0b3IKKzsJb3IgdGFyZ2V0IG1vZGUuCis7Cis7ICAKKworRU5UUlkgdGFyZ2V0X2Fib3J0Cit0YXJnZXRfYWJvcnQ6CisgICAgU0VUIFRBUkdFVAorCithdCAweDAwMDAwMjNkIDogKi8JMHg1ODAwMDIwMCwweDAwMDAwMDAwLAorLyoKKyAgICBESVNDT05ORUNUCisKK2F0IDB4MDAwMDAyM2YgOiAqLwkweDQ4MDAwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIENMRUFSIFRBUkdFVAorCithdCAweDAwMDAwMjQxIDogKi8JMHg2MDAwMDIwMCwweDAwMDAwMDAwLAorLyoKKyAgICBKVU1QIHNjaGVkdWxlCisKK2F0IDB4MDAwMDAyNDMgOiAqLwkweDgwMDgwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIAorRU5UUlkgaW5pdGlhdG9yX2Fib3J0Citpbml0aWF0b3JfYWJvcnQ6CisgICAgU0VUIEFUTgorCithdCAweDAwMDAwMjQ1IDogKi8JMHg1ODAwMDAwOCwweDAwMDAwMDAwLAorLyoKKzsKKzsgVGhlIFNDU0ktSSBzcGVjaWZpY2F0aW9uIHNheXMgdGhhdCB0YXJnZXRzIG1heSBnbyBpbnRvIE1TRyBvdXQgYXQgCis7IHRoZWlyIGxlaXN1cmUgdXBvbiByZWNlaXB0IG9mIHRoZSBBVE4gc2luZ2xlLiAgT24gYWxsIHZlcnNpb25zIG9mIHRoZSAKKzsgc3BlY2lmaWNhdGlvbiwgd2UgY2FuJ3QgY2hhbmdlIHBoYXNlcyB1bnRpbCBSRVEgdHJhbnNpdGlvbnMgdHJ1ZS0+ZmFsc2UsIAorOyBzbyB3ZSBuZWVkIHRvIHNpbmsvc291cmNlIG9uZSBieXRlIG9mIGRhdGEgdG8gYWxsb3cgdGhlIHRyYW5zaXRpb24uCis7Cis7IEZvciB0aGUgc2FrZSBvZiBzYWZldHksIHdlJ2xsIG9ubHkgc291cmNlIG9uZSBieXRlIG9mIGRhdGEgaW4gYWxsIAorOyBjYXNlcywgYnV0IHRvIGFjY29tbW9kYXRlIHRoZSBTQ1NJLUkgZGFpbiBicmFtYWdlLCB3ZSdsbCBzaW5rIGFuICAKKzsgYXJiaXRyYXJ5IG51bWJlciBvZiBieXRlcy4KKyAgICBKVU1QIHNwZXdfY21kLCBXSEVOIENNRAorCithdCAweDAwMDAwMjQ3IDogKi8JMHg4MjBiMDAwMCwweDAwMDAwOTRjLAorLyoKKyAgICBKVU1QIGVhdF9tc2dpbiwgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDI0OSA6ICovCTB4ODcwYjAwMDAsMHgwMDAwMDk1YywKKy8qCisgICAgSlVNUCBlYXRfZGF0YWluLCBXSEVOIERBVEFfSU4KKworYXQgMHgwMDAwMDI0YiA6ICovCTB4ODEwYjAwMDAsMHgwMDAwMDk4YywKKy8qCisgICAgSlVNUCBlYXRfc3RhdHVzLCBXSEVOIFNUQVRVUworCithdCAweDAwMDAwMjRkIDogKi8JMHg4MzBiMDAwMCwweDAwMDAwOTc0LAorLyoKKyAgICBKVU1QIHNwZXdfZGF0YW91dCwgV0hFTiBEQVRBX09VVAorCithdCAweDAwMDAwMjRmIDogKi8JMHg4MDBiMDAwMCwweDAwMDAwOWE0LAorLyoKKyAgICBKVU1QIHNhdGVkCisKK2F0IDB4MDAwMDAyNTEgOiAqLwkweDgwMDgwMDAwLDB4MDAwMDA5YWMsCisvKgorc3Bld19jbWQ6CisgICAgTU9WRSAxLCBOQ1I1M2M3eHhfemVybywgV0hFTiBDTUQKKworYXQgMHgwMDAwMDI1MyA6ICovCTB4MGEwMDAwMDEsMHgwMDAwMDAwMCwKKy8qCisgICAgSlVNUCBzYXRlZAorCithdCAweDAwMDAwMjU1IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwOWFjLAorLyoKK2VhdF9tc2dpbjoKKyAgICBNT1ZFIDEsIE5DUjUzYzd4eF9zaW5rLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMjU3IDogKi8JMHgwZjAwMDAwMSwweDAwMDAwMDAwLAorLyoKKyAgICBKVU1QIGVhdF9tc2dpbiwgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDI1OSA6ICovCTB4ODcwYjAwMDAsMHgwMDAwMDk1YywKKy8qCisgICAgSlVNUCBzYXRlZAorCithdCAweDAwMDAwMjViIDogKi8JMHg4MDA4MDAwMCwweDAwMDAwOWFjLAorLyoKK2VhdF9zdGF0dXM6CisgICAgTU9WRSAxLCBOQ1I1M2M3eHhfc2luaywgV0hFTiBTVEFUVVMKKworYXQgMHgwMDAwMDI1ZCA6ICovCTB4MGIwMDAwMDEsMHgwMDAwMDAwMCwKKy8qCisgICAgSlVNUCBlYXRfc3RhdHVzLCBXSEVOIFNUQVRVUworCithdCAweDAwMDAwMjVmIDogKi8JMHg4MzBiMDAwMCwweDAwMDAwOTc0LAorLyoKKyAgICBKVU1QIHNhdGVkCisKK2F0IDB4MDAwMDAyNjEgOiAqLwkweDgwMDgwMDAwLDB4MDAwMDA5YWMsCisvKgorZWF0X2RhdGFpbjoKKyAgICBNT1ZFIDEsIE5DUjUzYzd4eF9zaW5rLCBXSEVOIERBVEFfSU4KKworYXQgMHgwMDAwMDI2MyA6ICovCTB4MDkwMDAwMDEsMHgwMDAwMDAwMCwKKy8qCisgICAgSlVNUCBlYXRfZGF0YWluLCBXSEVOIERBVEFfSU4KKworYXQgMHgwMDAwMDI2NSA6ICovCTB4ODEwYjAwMDAsMHgwMDAwMDk4YywKKy8qCisgICAgSlVNUCBzYXRlZAorCithdCAweDAwMDAwMjY3IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwOWFjLAorLyoKK3NwZXdfZGF0YW91dDoKKyAgICBNT1ZFIDEsIE5DUjUzYzd4eF96ZXJvLCBXSEVOIERBVEFfT1VUCisKK2F0IDB4MDAwMDAyNjkgOiAqLwkweDA4MDAwMDAxLDB4MDAwMDAwMDAsCisvKgorc2F0ZWQ6CisKKworCisgICAgTU9WRSAxLCBOQ1I1M2M3eHhfbXNnX2Fib3J0LCBXSEVOIE1TR19PVVQKKworYXQgMHgwMDAwMDI2YiA6ICovCTB4MGUwMDAwMDEsMHgwMDAwMDAwMCwKKy8qCisgICAgV0FJVCBESVNDT05ORUNUCisKK2F0IDB4MDAwMDAyNmQgOiAqLwkweDQ4MDAwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIElOVCBpbnRfbm9ybV9hYm9ydGVkCisKK2F0IDB4MDAwMDAyNmYgOiAqLwkweDk4MDgwMDAwLDB4MDIwNDAwMDAsCisvKgorCisKKyAKKworOyBMaXR0bGUgcGF0Y2hlZCBqdW1wLCB1c2VkIHRvIG92ZXJjb21lIHByb2JsZW1zIHdpdGggVEVNUCBnZXR0aW5nCis7IGNvcnJ1cHRlZCBvbiBtZW1vcnkgbW92ZXMuCisKK2p1bXBfdGVtcDoKKyAgICBKVU1QIDAKKworYXQgMHgwMDAwMDI3MSA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDAwMCwKK307CisKKyNkZWZpbmUgQV9OQ1I1M2M3eHhfbXNnX2Fib3J0CTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9OQ1I1M2M3eHhfbXNnX2Fib3J0X3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDI2YywKK307CisKKyNkZWZpbmUgQV9OQ1I1M2M3eHhfbXNnX3JlamVjdAkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfTkNSNTNjN3h4X21zZ19yZWplY3RfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMTg2LAorfTsKKworI2RlZmluZSBBX05DUjUzYzd4eF9zaW5rCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9OQ1I1M2M3eHhfc2lua191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAyNTgsCisJMHgwMDAwMDI1ZSwKKwkweDAwMDAwMjY0LAorfTsKKworI2RlZmluZSBBX05DUjUzYzd4eF96ZXJvCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9OQ1I1M2M3eHhfemVyb191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAyNTQsCisJMHgwMDAwMDI2YSwKK307CisKKyNkZWZpbmUgQV9OT1BfaW5zbgkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfTk9QX2luc25fdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDE3LAorfTsKKworI2RlZmluZSBBX2FkZHJfZHNhCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9hZGRyX2RzYV91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMGYsCisJMHgwMDAwMDAyNiwKKwkweDAwMDAwMDMzLAorCTB4MDAwMDAwNDAsCisJMHgwMDAwMDA1NSwKKwkweDAwMDAwMDc5LAorCTB4MDAwMDAwOGUsCisJMHgwMDAwMDBiYywKKwkweDAwMDAwMGQyLAorCTB4MDAwMDAxMzAsCisJMHgwMDAwMDFhNSwKKwkweDAwMDAwMWJiLAorCTB4MDAwMDAxZTMsCit9OworCisjZGVmaW5lIEFfYWRkcl9yZWNvbm5lY3RfZHNhX2hlYWQJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX2FkZHJfcmVjb25uZWN0X2RzYV9oZWFkX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDFiNywKK307CisKKyNkZWZpbmUgQV9hZGRyX3NjcmF0Y2gJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX2FkZHJfc2NyYXRjaF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMDIsCisJMHgwMDAwMDAwNCwKKwkweDAwMDAwMDA4LAorCTB4MDAwMDAwMjAsCisJMHgwMDAwMDAyMiwKKwkweDAwMDAwMDQ5LAorCTB4MDAwMDAwNjAsCisJMHgwMDAwMDA2YSwKKwkweDAwMDAwMDcxLAorCTB4MDAwMDAwNzMsCisJMHgwMDAwMDBhYiwKKwkweDAwMDAwMGI1LAorCTB4MDAwMDAwYzEsCisJMHgwMDAwMDBjYiwKKwkweDAwMDAwMTJjLAorCTB4MDAwMDAxNDIsCisJMHgwMDAwMDE1NywKKwkweDAwMDAwMWIyLAorCTB4MDAwMDAxYjQsCisJMHgwMDAwMDFkZiwKKwkweDAwMDAwMWY3LAorfTsKKworI2RlZmluZSBBX2FkZHJfdGVtcAkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfYWRkcl90ZW1wX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfZG1vZGVfbWVtb3J5X3RvX21lbW9yeQkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfZG1vZGVfbWVtb3J5X3RvX21lbW9yeV91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX2Rtb2RlX21lbW9yeV90b19uY3IJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX2Rtb2RlX21lbW9yeV90b19uY3JfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9kbW9kZV9uY3JfdG9fbWVtb3J5CTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9kbW9kZV9uY3JfdG9fbWVtb3J5X3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfZHNhX2NoZWNrX3Jlc2VsZWN0CTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9kc2FfY2hlY2tfcmVzZWxlY3RfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMWQwLAorfTsKKworI2RlZmluZSBBX2RzYV9jbWRvdXQJMHgwMDAwMDA0OAorc3RhdGljIHUzMiBBX2RzYV9jbWRvdXRfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDlhLAorfTsKKworI2RlZmluZSBBX2RzYV9jbW5kCTB4MDAwMDAwMzgKK3N0YXRpYyB1MzIgQV9kc2FfY21uZF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX2RzYV9kYXRhaW4JMHgwMDAwMDA1NAorc3RhdGljIHUzMiBBX2RzYV9kYXRhaW5fdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMGMyLAorfTsKKworI2RlZmluZSBBX2RzYV9kYXRhb3V0CTB4MDAwMDAwNTAKK3N0YXRpYyB1MzIgQV9kc2FfZGF0YW91dF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwYWMsCit9OworCisjZGVmaW5lIEFfZHNhX2VuZAkweDAwMDAwMDcwCitzdGF0aWMgdTMyIEFfZHNhX2VuZF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX2RzYV9maWVsZHNfc3RhcnQJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX2RzYV9maWVsZHNfc3RhcnRfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9kc2FfbXNnaW4JMHgwMDAwMDA1OAorc3RhdGljIHUzMiBBX2RzYV9tc2dpbl91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAxOWMsCit9OworCisjZGVmaW5lIEFfZHNhX21zZ291dAkweDAwMDAwMDQwCitzdGF0aWMgdTMyIEFfZHNhX21zZ291dF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwODksCit9OworCisjZGVmaW5lIEFfZHNhX21zZ291dF9vdGhlcgkweDAwMDAwMDY4CitzdGF0aWMgdTMyIEFfZHNhX21zZ291dF9vdGhlcl91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAxOTQsCit9OworCisjZGVmaW5lIEFfZHNhX25leHQJMHgwMDAwMDAzMAorc3RhdGljIHUzMiBBX2RzYV9uZXh0X3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDA2MSwKK307CisKKyNkZWZpbmUgQV9kc2FfcmVzdG9yZV9wb2ludGVycwkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfZHNhX3Jlc3RvcmVfcG9pbnRlcnNfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMTQ2LAorfTsKKworI2RlZmluZSBBX2RzYV9zYXZlX2RhdGFfcG9pbnRlcgkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfZHNhX3NhdmVfZGF0YV9wb2ludGVyX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDEzMSwKK307CisKKyNkZWZpbmUgQV9kc2Ffc2VsZWN0CTB4MDAwMDAwM2MKK3N0YXRpYyB1MzIgQV9kc2Ffc2VsZWN0X3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDA4MiwKK307CisKKyNkZWZpbmUgQV9kc2Ffc3NjZl83MTAJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX2RzYV9zc2NmXzcxMF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMDcsCit9OworCisjZGVmaW5lIEFfZHNhX3N0YXR1cwkweDAwMDAwMDYwCitzdGF0aWMgdTMyIEFfZHNhX3N0YXR1c191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAxOTgsCit9OworCisjZGVmaW5lIEFfZHNhX3RlbXBfYWRkcl9hcnJheV92YWx1ZQkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfZHNhX3RlbXBfYWRkcl9hcnJheV92YWx1ZV91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX2RzYV90ZW1wX2FkZHJfZHNhX3ZhbHVlCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9kc2FfdGVtcF9hZGRyX2RzYV92YWx1ZV91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMDEsCit9OworCisjZGVmaW5lIEFfZHNhX3RlbXBfYWRkcl9uZXdfdmFsdWUJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX2RzYV90ZW1wX2FkZHJfbmV3X3ZhbHVlX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfZHNhX3RlbXBfYWRkcl9uZXh0CTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9kc2FfdGVtcF9hZGRyX25leHRfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDFjLAorCTB4MDAwMDAwNGYsCit9OworCisjZGVmaW5lIEFfZHNhX3RlbXBfYWRkcl9yZXNpZHVhbAkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfZHNhX3RlbXBfYWRkcl9yZXNpZHVhbF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMmQsCisJMHgwMDAwMDAzYiwKK307CisKKyNkZWZpbmUgQV9kc2FfdGVtcF9hZGRyX3NhdmVkX3BvaW50ZXIJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX2RzYV90ZW1wX2FkZHJfc2F2ZWRfcG9pbnRlcl91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMmIsCisJMHgwMDAwMDAzNywKK307CisKKyNkZWZpbmUgQV9kc2FfdGVtcF9hZGRyX3NhdmVkX3Jlc2lkdWFsCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9kc2FfdGVtcF9hZGRyX3NhdmVkX3Jlc2lkdWFsX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDAyZSwKKwkweDAwMDAwMDNhLAorfTsKKworI2RlZmluZSBBX2RzYV90ZW1wX2x1bgkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfZHNhX3RlbXBfbHVuX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDA0YywKK307CisKKyNkZWZpbmUgQV9kc2FfdGVtcF9uZXh0CTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9kc2FfdGVtcF9uZXh0X3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDAxZiwKK307CisKKyNkZWZpbmUgQV9kc2FfdGVtcF9zeW5jCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9kc2FfdGVtcF9zeW5jX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDA1NywKK307CisKKyNkZWZpbmUgQV9kc2FfdGVtcF90YXJnZXQJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX2RzYV90ZW1wX3RhcmdldF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwNDUsCit9OworCisjZGVmaW5lIEFfZW11bGZseQkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfZW11bGZseV91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX2ludF9kZWJ1Z19icmVhawkweDAzMDAwMDAwCitzdGF0aWMgdTMyIEFfaW50X2RlYnVnX2JyZWFrX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDIzYywKK307CisKKyNkZWZpbmUgQV9pbnRfZGVidWdfcGFuaWMJMHgwMzBiMDAwMAorc3RhdGljIHUzMiBBX2ludF9kZWJ1Z19wYW5pY191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAyMDksCisJMHgwMDAwMDIxOSwKK307CisKKyNkZWZpbmUgQV9pbnRfZXJyX2NoZWNrX2NvbmRpdGlvbgkweDAwMDMwMDAwCitzdGF0aWMgdTMyIEFfaW50X2Vycl9jaGVja19jb25kaXRpb25fdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMWE5LAorfTsKKworI2RlZmluZSBBX2ludF9lcnJfbm9fcGhhc2UJMHgwMDA0MDAwMAorc3RhdGljIHUzMiBBX2ludF9lcnJfbm9fcGhhc2VfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9pbnRfZXJyX3NlbGVjdGVkCTB4MDAwMTAwMDAKK3N0YXRpYyB1MzIgQV9pbnRfZXJyX3NlbGVjdGVkX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDFmZiwKK307CisKKyNkZWZpbmUgQV9pbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX2ludF9lcnJfdW5leHBlY3RlZF9waGFzZV91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwOTIsCisJMHgwMDAwMDA5OCwKKwkweDAwMDAwMGEwLAorCTB4MDAwMDAwZDYsCisJMHgwMDAwMDBkYSwKKwkweDAwMDAwMGRjLAorCTB4MDAwMDAwZTQsCisJMHgwMDAwMDBlOCwKKwkweDAwMDAwMGVhLAorCTB4MDAwMDAwZjIsCisJMHgwMDAwMDBmNiwKKwkweDAwMDAwMGY4LAorCTB4MDAwMDAwZmEsCisJMHgwMDAwMDE2MCwKK307CisKKyNkZWZpbmUgQV9pbnRfZXJyX3VuZXhwZWN0ZWRfcmVzZWxlY3QJMHgwMDAyMDAwMAorc3RhdGljIHUzMiBBX2ludF9lcnJfdW5leHBlY3RlZF9yZXNlbGVjdF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAxY2QsCit9OworCisjZGVmaW5lIEFfaW50X21zZ18xCTB4MDEwMjAwMDAKK3N0YXRpYyB1MzIgQV9pbnRfbXNnXzFfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMTE0LAorCTB4MDAwMDAxMTYsCit9OworCisjZGVmaW5lIEFfaW50X21zZ19zZHRyCTB4MDEwMTAwMDAKK3N0YXRpYyB1MzIgQV9pbnRfbXNnX3NkdHJfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMTgwLAorfTsKKworI2RlZmluZSBBX2ludF9tc2dfd2R0cgkweDAxMDAwMDAwCitzdGF0aWMgdTMyIEFfaW50X21zZ193ZHRyX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDE3NCwKK307CisKKyNkZWZpbmUgQV9pbnRfbm9ybV9hYm9ydGVkCTB4MDIwNDAwMDAKK3N0YXRpYyB1MzIgQV9pbnRfbm9ybV9hYm9ydGVkX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDI3MCwKK307CisKKyNkZWZpbmUgQV9pbnRfbm9ybV9jb21tYW5kX2NvbXBsZXRlCTB4MDIwMjAwMDAKK3N0YXRpYyB1MzIgQV9pbnRfbm9ybV9jb21tYW5kX2NvbXBsZXRlX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfaW50X25vcm1fZGlzY29ubmVjdGVkCTB4MDIwMzAwMDAKK3N0YXRpYyB1MzIgQV9pbnRfbm9ybV9kaXNjb25uZWN0ZWRfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9pbnRfbm9ybV9lbXVsYXRlaW50Zmx5CTB4MDIwNjAwMDAKK3N0YXRpYyB1MzIgQV9pbnRfbm9ybV9lbXVsYXRlaW50Zmx5X3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDFhMiwKK307CisKKyNkZWZpbmUgQV9pbnRfbm9ybV9yZXNlbGVjdF9jb21wbGV0ZQkweDAyMDEwMDAwCitzdGF0aWMgdTMyIEFfaW50X25vcm1fcmVzZWxlY3RfY29tcGxldGVfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9pbnRfbm9ybV9yZXNldAkweDAyMDUwMDAwCitzdGF0aWMgdTMyIEFfaW50X25vcm1fcmVzZXRfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9pbnRfbm9ybV9zZWxlY3RfY29tcGxldGUJMHgwMjAwMDAwMAorc3RhdGljIHUzMiBBX2ludF9ub3JtX3NlbGVjdF9jb21wbGV0ZV91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX2ludF90ZXN0XzEJMHgwNDAwMDAwMAorc3RhdGljIHUzMiBBX2ludF90ZXN0XzFfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMjFlLAorfTsKKworI2RlZmluZSBBX2ludF90ZXN0XzIJMHgwNDAxMDAwMAorc3RhdGljIHUzMiBBX2ludF90ZXN0XzJfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMjNhLAorfTsKKworI2RlZmluZSBBX2ludF90ZXN0XzMJMHgwNDAyMDAwMAorc3RhdGljIHUzMiBBX2ludF90ZXN0XzNfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9tc2dfYnVmCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9tc2dfYnVmX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDEwOCwKKwkweDAwMDAwMTYyLAorCTB4MDAwMDAxNmMsCisJMHgwMDAwMDE3MiwKKwkweDAwMDAwMTc4LAorCTB4MDAwMDAxN2UsCit9OworCisjZGVmaW5lIEFfcmVjb25uZWN0X2RzYV9oZWFkCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9yZWNvbm5lY3RfZHNhX2hlYWRfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDZkLAorCTB4MDAwMDAwNzQsCisJMHgwMDAwMDFiMSwKK307CisKKyNkZWZpbmUgQV9yZXNlbGVjdGVkX2lkZW50aWZ5CTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9yZXNlbGVjdGVkX2lkZW50aWZ5X3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDA0OCwKKwkweDAwMDAwMWFmLAorfTsKKworI2RlZmluZSBBX3Jlc2VsZWN0ZWRfdGFnCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9yZXNlbGVjdGVkX3RhZ191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX3NhdmVkX2RzYQkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfc2F2ZWRfZHNhX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDAwNSwKKwkweDAwMDAwMDBlLAorCTB4MDAwMDAwMjMsCisJMHgwMDAwMDAyNSwKKwkweDAwMDAwMDMyLAorCTB4MDAwMDAwM2YsCisJMHgwMDAwMDA1NCwKKwkweDAwMDAwMDVmLAorCTB4MDAwMDAwNzAsCisJMHgwMDAwMDA3OCwKKwkweDAwMDAwMDhkLAorCTB4MDAwMDAwYWEsCisJMHgwMDAwMDBiYiwKKwkweDAwMDAwMGMwLAorCTB4MDAwMDAwZDEsCisJMHgwMDAwMDEyZiwKKwkweDAwMDAwMWE0LAorCTB4MDAwMDAxYjUsCisJMHgwMDAwMDFiYSwKKwkweDAwMDAwMWUyLAorfTsKKworI2RlZmluZSBBX3NjaGVkdWxlCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9zY2hlZHVsZV91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwN2QsCisJMHgwMDAwMDFhNywKKwkweDAwMDAwMjAzLAorCTB4MDAwMDAyNDQsCit9OworCisjZGVmaW5lIEFfdGVzdF9kZXN0CTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV90ZXN0X2Rlc3RfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMjFjLAorfTsKKworI2RlZmluZSBBX3Rlc3Rfc3JjCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV90ZXN0X3NyY191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAyMWIsCit9OworCisjZGVmaW5lIEVudF9hY2NlcHRfbWVzc2FnZQkweDAwMDAwNjI0CisjZGVmaW5lIEVudF9jbWRvdXRfY21kb3V0CTB4MDAwMDAyNjQKKyNkZWZpbmUgRW50X2NvbW1hbmRfY29tcGxldGUJMHgwMDAwMDY1YworI2RlZmluZSBFbnRfY29tbWFuZF9jb21wbGV0ZV9tc2dpbgkweDAwMDAwNjZjCisjZGVmaW5lIEVudF9kYXRhX3RyYW5zZmVyCTB4MDAwMDAyNmMKKyNkZWZpbmUgRW50X2RhdGFpbl90b19qdW1wCTB4MDAwMDAzMzQKKyNkZWZpbmUgRW50X2RlYnVnX2JyZWFrCTB4MDAwMDA4ZWMKKyNkZWZpbmUgRW50X2RzYV9jb2RlX2JlZ2luCTB4MDAwMDAwMDAKKyNkZWZpbmUgRW50X2RzYV9jb2RlX2NoZWNrX3Jlc2VsZWN0CTB4MDAwMDAxMGMKKyNkZWZpbmUgRW50X2RzYV9jb2RlX2ZpeF9qdW1wCTB4MDAwMDAwNTgKKyNkZWZpbmUgRW50X2RzYV9jb2RlX3Jlc3RvcmVfcG9pbnRlcnMJMHgwMDAwMDBkOAorI2RlZmluZSBFbnRfZHNhX2NvZGVfc2F2ZV9kYXRhX3BvaW50ZXIJMHgwMDAwMDBhNAorI2RlZmluZSBFbnRfZHNhX2NvZGVfdGVtcGxhdGUJMHgwMDAwMDAwMAorI2RlZmluZSBFbnRfZHNhX2NvZGVfdGVtcGxhdGVfZW5kCTB4MDAwMDAxNzgKKyNkZWZpbmUgRW50X2RzYV9zY2hlZHVsZQkweDAwMDAwMTc4CisjZGVmaW5lIEVudF9kc2FfemVybwkweDAwMDAwMTc4CisjZGVmaW5lIEVudF9lbmRfZGF0YV90cmFuc2ZlcgkweDAwMDAwMmE0CisjZGVmaW5lIEVudF9pbml0aWF0b3JfYWJvcnQJMHgwMDAwMDkxNAorI2RlZmluZSBFbnRfbXNnX2luCTB4MDAwMDA0MWMKKyNkZWZpbmUgRW50X21zZ19pbl9yZXN0YXJ0CTB4MDAwMDAzZmMKKyNkZWZpbmUgRW50X290aGVyX2luCTB4MDAwMDAzOGMKKyNkZWZpbmUgRW50X290aGVyX291dAkweDAwMDAwMzU0CisjZGVmaW5lIEVudF9vdGhlcl90cmFuc2ZlcgkweDAwMDAwM2M0CisjZGVmaW5lIEVudF9yZWplY3RfbWVzc2FnZQkweDAwMDAwNjA0CisjZGVmaW5lIEVudF9yZXNlbGVjdGVkX2NoZWNrX25leHQJMHgwMDAwMDZmMAorI2RlZmluZSBFbnRfcmVzZWxlY3RlZF9vawkweDAwMDAwNzk4CisjZGVmaW5lIEVudF9yZXNwb25kX21lc3NhZ2UJMHgwMDAwMDYzYworI2RlZmluZSBFbnRfc2VsZWN0CTB4MDAwMDAxZjgKKyNkZWZpbmUgRW50X3NlbGVjdF9tc2dvdXQJMHgwMDAwMDIxOAorI2RlZmluZSBFbnRfdGFyZ2V0X2Fib3J0CTB4MDAwMDA4ZjQKKyNkZWZpbmUgRW50X3Rlc3RfMQkweDAwMDAwODY4CisjZGVmaW5lIEVudF90ZXN0XzIJMHgwMDAwMDg3YworI2RlZmluZSBFbnRfdGVzdF8yX21zZ291dAkweDAwMDAwODljCisjZGVmaW5lIEVudF93YWl0X3Jlc2VsZWN0CTB4MDAwMDA2YTgKK3N0YXRpYyB1MzIgTEFCRUxQQVRDSEVTW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMTEsCisJMHgwMDAwMDAxYSwKKwkweDAwMDAwMDFkLAorCTB4MDAwMDAwMjgsCisJMHgwMDAwMDAyYSwKKwkweDAwMDAwMDM1LAorCTB4MDAwMDAwMzgsCisJMHgwMDAwMDA0MiwKKwkweDAwMDAwMDUwLAorCTB4MDAwMDAwNTIsCisJMHgwMDAwMDA2YiwKKwkweDAwMDAwMDgzLAorCTB4MDAwMDAwODUsCisJMHgwMDAwMDA5MCwKKwkweDAwMDAwMDk0LAorCTB4MDAwMDAwOTYsCisJMHgwMDAwMDA5YywKKwkweDAwMDAwMDllLAorCTB4MDAwMDAwYTIsCisJMHgwMDAwMDBhNCwKKwkweDAwMDAwMGE2LAorCTB4MDAwMDAwYTgsCisJMHgwMDAwMDBiNiwKKwkweDAwMDAwMGI5LAorCTB4MDAwMDAwY2MsCisJMHgwMDAwMDBjZiwKKwkweDAwMDAwMGQ4LAorCTB4MDAwMDAwZGUsCisJMHgwMDAwMDBlMCwKKwkweDAwMDAwMGU2LAorCTB4MDAwMDAwZWMsCisJMHgwMDAwMDBlZSwKKwkweDAwMDAwMGY0LAorCTB4MDAwMDAwZmMsCisJMHgwMDAwMDBmZSwKKwkweDAwMDAwMTBhLAorCTB4MDAwMDAxMGMsCisJMHgwMDAwMDEwZSwKKwkweDAwMDAwMTEwLAorCTB4MDAwMDAxMTIsCisJMHgwMDAwMDExOCwKKwkweDAwMDAwMTFhLAorCTB4MDAwMDAxMmQsCisJMHgwMDAwMDE0MywKKwkweDAwMDAwMTU4LAorCTB4MDAwMDAxNWMsCisJMHgwMDAwMDE2NCwKKwkweDAwMDAwMTY2LAorCTB4MDAwMDAxNjgsCisJMHgwMDAwMDE2ZSwKKwkweDAwMDAwMTdhLAorCTB4MDAwMDAxYWIsCisJMHgwMDAwMDFiOCwKKwkweDAwMDAwMWJmLAorCTB4MDAwMDAxYzMsCisJMHgwMDAwMDFjNywKKwkweDAwMDAwMWNiLAorCTB4MDAwMDAxZTAsCisJMHgwMDAwMDFmOCwKKwkweDAwMDAwMjA3LAorCTB4MDAwMDAyMGYsCisJMHgwMDAwMDIxMywKKwkweDAwMDAwMjE3LAorCTB4MDAwMDAyMjQsCisJMHgwMDAwMDIyNiwKKwkweDAwMDAwMjQ4LAorCTB4MDAwMDAyNGEsCisJMHgwMDAwMDI0YywKKwkweDAwMDAwMjRlLAorCTB4MDAwMDAyNTAsCisJMHgwMDAwMDI1MiwKKwkweDAwMDAwMjU2LAorCTB4MDAwMDAyNWEsCisJMHgwMDAwMDI1YywKKwkweDAwMDAwMjYwLAorCTB4MDAwMDAyNjIsCisJMHgwMDAwMDI2NiwKKwkweDAwMDAwMjY4LAorfTsKKworc3RhdGljIHN0cnVjdCB7CisJdTMyCW9mZnNldDsKKwl2b2lkCQkqYWRkcmVzczsKK30gRVhURVJOQUxfUEFUQ0hFU1tdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKK3N0YXRpYyB1MzIgSU5TVFJVQ1RJT05TIF9fYXR0cmlidXRlKCh1bnVzZWQpKQk9IDI5MDsKK3N0YXRpYyB1MzIgUEFUQ0hFUyBfX2F0dHJpYnV0ZSgodW51c2VkKSkJPSA3ODsKK3N0YXRpYyB1MzIgRVhURVJOQUxfUEFUQ0hFU19MRU4gX19hdHRyaWJ1dGUoKHVudXNlZCkpCT0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS81M2M3eHhfdS5oX3NoaXBwZWQgYi9kcml2ZXJzL3Njc2kvNTNjN3h4X3UuaF9zaGlwcGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMzM3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvNTNjN3h4X3UuaF9zaGlwcGVkCkBAIC0wLDAgKzEsMTAyIEBACisjdW5kZWYgQV9OQ1I1M2M3eHhfbXNnX2Fib3J0CisjdW5kZWYgQV9OQ1I1M2M3eHhfbXNnX3JlamVjdAorI3VuZGVmIEFfTkNSNTNjN3h4X3NpbmsKKyN1bmRlZiBBX05DUjUzYzd4eF96ZXJvCisjdW5kZWYgQV9OT1BfaW5zbgorI3VuZGVmIEFfYWRkcl9kc2EKKyN1bmRlZiBBX2FkZHJfcmVjb25uZWN0X2RzYV9oZWFkCisjdW5kZWYgQV9hZGRyX3NjcmF0Y2gKKyN1bmRlZiBBX2FkZHJfdGVtcAorI3VuZGVmIEFfZG1vZGVfbWVtb3J5X3RvX21lbW9yeQorI3VuZGVmIEFfZG1vZGVfbWVtb3J5X3RvX25jcgorI3VuZGVmIEFfZG1vZGVfbmNyX3RvX21lbW9yeQorI3VuZGVmIEFfZHNhX2NoZWNrX3Jlc2VsZWN0CisjdW5kZWYgQV9kc2FfY21kb3V0CisjdW5kZWYgQV9kc2FfY21uZAorI3VuZGVmIEFfZHNhX2RhdGFpbgorI3VuZGVmIEFfZHNhX2RhdGFvdXQKKyN1bmRlZiBBX2RzYV9lbmQKKyN1bmRlZiBBX2RzYV9maWVsZHNfc3RhcnQKKyN1bmRlZiBBX2RzYV9tc2dpbgorI3VuZGVmIEFfZHNhX21zZ291dAorI3VuZGVmIEFfZHNhX21zZ291dF9vdGhlcgorI3VuZGVmIEFfZHNhX25leHQKKyN1bmRlZiBBX2RzYV9yZXN0b3JlX3BvaW50ZXJzCisjdW5kZWYgQV9kc2Ffc2F2ZV9kYXRhX3BvaW50ZXIKKyN1bmRlZiBBX2RzYV9zZWxlY3QKKyN1bmRlZiBBX2RzYV9zc2NmXzcxMAorI3VuZGVmIEFfZHNhX3N0YXR1cworI3VuZGVmIEFfZHNhX3RlbXBfYWRkcl9hcnJheV92YWx1ZQorI3VuZGVmIEFfZHNhX3RlbXBfYWRkcl9kc2FfdmFsdWUKKyN1bmRlZiBBX2RzYV90ZW1wX2FkZHJfbmV3X3ZhbHVlCisjdW5kZWYgQV9kc2FfdGVtcF9hZGRyX25leHQKKyN1bmRlZiBBX2RzYV90ZW1wX2FkZHJfcmVzaWR1YWwKKyN1bmRlZiBBX2RzYV90ZW1wX2FkZHJfc2F2ZWRfcG9pbnRlcgorI3VuZGVmIEFfZHNhX3RlbXBfYWRkcl9zYXZlZF9yZXNpZHVhbAorI3VuZGVmIEFfZHNhX3RlbXBfbHVuCisjdW5kZWYgQV9kc2FfdGVtcF9uZXh0CisjdW5kZWYgQV9kc2FfdGVtcF9zeW5jCisjdW5kZWYgQV9kc2FfdGVtcF90YXJnZXQKKyN1bmRlZiBBX2VtdWxmbHkKKyN1bmRlZiBBX2ludF9kZWJ1Z19icmVhaworI3VuZGVmIEFfaW50X2RlYnVnX3BhbmljCisjdW5kZWYgQV9pbnRfZXJyX2NoZWNrX2NvbmRpdGlvbgorI3VuZGVmIEFfaW50X2Vycl9ub19waGFzZQorI3VuZGVmIEFfaW50X2Vycl9zZWxlY3RlZAorI3VuZGVmIEFfaW50X2Vycl91bmV4cGVjdGVkX3BoYXNlCisjdW5kZWYgQV9pbnRfZXJyX3VuZXhwZWN0ZWRfcmVzZWxlY3QKKyN1bmRlZiBBX2ludF9tc2dfMQorI3VuZGVmIEFfaW50X21zZ19zZHRyCisjdW5kZWYgQV9pbnRfbXNnX3dkdHIKKyN1bmRlZiBBX2ludF9ub3JtX2Fib3J0ZWQKKyN1bmRlZiBBX2ludF9ub3JtX2NvbW1hbmRfY29tcGxldGUKKyN1bmRlZiBBX2ludF9ub3JtX2Rpc2Nvbm5lY3RlZAorI3VuZGVmIEFfaW50X25vcm1fZW11bGF0ZWludGZseQorI3VuZGVmIEFfaW50X25vcm1fcmVzZWxlY3RfY29tcGxldGUKKyN1bmRlZiBBX2ludF9ub3JtX3Jlc2V0CisjdW5kZWYgQV9pbnRfbm9ybV9zZWxlY3RfY29tcGxldGUKKyN1bmRlZiBBX2ludF90ZXN0XzEKKyN1bmRlZiBBX2ludF90ZXN0XzIKKyN1bmRlZiBBX2ludF90ZXN0XzMKKyN1bmRlZiBBX21zZ19idWYKKyN1bmRlZiBBX3JlY29ubmVjdF9kc2FfaGVhZAorI3VuZGVmIEFfcmVzZWxlY3RlZF9pZGVudGlmeQorI3VuZGVmIEFfcmVzZWxlY3RlZF90YWcKKyN1bmRlZiBBX3NhdmVkX2RzYQorI3VuZGVmIEFfc2NoZWR1bGUKKyN1bmRlZiBBX3Rlc3RfZGVzdAorI3VuZGVmIEFfdGVzdF9zcmMKKyN1bmRlZiBFbnRfYWNjZXB0X21lc3NhZ2UKKyN1bmRlZiBFbnRfY21kb3V0X2NtZG91dAorI3VuZGVmIEVudF9jb21tYW5kX2NvbXBsZXRlCisjdW5kZWYgRW50X2NvbW1hbmRfY29tcGxldGVfbXNnaW4KKyN1bmRlZiBFbnRfZGF0YV90cmFuc2ZlcgorI3VuZGVmIEVudF9kYXRhaW5fdG9fanVtcAorI3VuZGVmIEVudF9kZWJ1Z19icmVhaworI3VuZGVmIEVudF9kc2FfY29kZV9iZWdpbgorI3VuZGVmIEVudF9kc2FfY29kZV9jaGVja19yZXNlbGVjdAorI3VuZGVmIEVudF9kc2FfY29kZV9maXhfanVtcAorI3VuZGVmIEVudF9kc2FfY29kZV9yZXN0b3JlX3BvaW50ZXJzCisjdW5kZWYgRW50X2RzYV9jb2RlX3NhdmVfZGF0YV9wb2ludGVyCisjdW5kZWYgRW50X2RzYV9jb2RlX3RlbXBsYXRlCisjdW5kZWYgRW50X2RzYV9jb2RlX3RlbXBsYXRlX2VuZAorI3VuZGVmIEVudF9kc2Ffc2NoZWR1bGUKKyN1bmRlZiBFbnRfZHNhX3plcm8KKyN1bmRlZiBFbnRfZW5kX2RhdGFfdHJhbnNmZXIKKyN1bmRlZiBFbnRfaW5pdGlhdG9yX2Fib3J0CisjdW5kZWYgRW50X21zZ19pbgorI3VuZGVmIEVudF9tc2dfaW5fcmVzdGFydAorI3VuZGVmIEVudF9vdGhlcl9pbgorI3VuZGVmIEVudF9vdGhlcl9vdXQKKyN1bmRlZiBFbnRfb3RoZXJfdHJhbnNmZXIKKyN1bmRlZiBFbnRfcmVqZWN0X21lc3NhZ2UKKyN1bmRlZiBFbnRfcmVzZWxlY3RlZF9jaGVja19uZXh0CisjdW5kZWYgRW50X3Jlc2VsZWN0ZWRfb2sKKyN1bmRlZiBFbnRfcmVzcG9uZF9tZXNzYWdlCisjdW5kZWYgRW50X3NlbGVjdAorI3VuZGVmIEVudF9zZWxlY3RfbXNnb3V0CisjdW5kZWYgRW50X3RhcmdldF9hYm9ydAorI3VuZGVmIEVudF90ZXN0XzEKKyN1bmRlZiBFbnRfdGVzdF8yCisjdW5kZWYgRW50X3Rlc3RfMl9tc2dvdXQKKyN1bmRlZiBFbnRfd2FpdF9yZXNlbGVjdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL0J1c0xvZ2ljLmMgYi9kcml2ZXJzL3Njc2kvQnVzTG9naWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWI1MTk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL0J1c0xvZ2ljLmMKQEAgLTAsMCArMSwzNTc0IEBACisKKy8qCisKKyAgTGludXggRHJpdmVyIGZvciBCdXNMb2dpYyBNdWx0aU1hc3RlciBhbmQgRmxhc2hQb2ludCBTQ1NJIEhvc3QgQWRhcHRlcnMKKworICBDb3B5cmlnaHQgMTk5NS0xOTk4IGJ5IExlb25hcmQgTi4gWnVia29mZiA8bG56QGRhbmRlbGlvbi5jb20+CisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKKyAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgZm9yIGNvbXBsZXRlIGRldGFpbHMuCisKKyAgVGhlIGF1dGhvciByZXNwZWN0ZnVsbHkgcmVxdWVzdHMgdGhhdCBhbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIHNvZnR3YXJlIGJlCisgIHNlbnQgZGlyZWN0bHkgdG8gaGltIGZvciBldmFsdWF0aW9uIGFuZCB0ZXN0aW5nLgorCisgIFNwZWNpYWwgdGhhbmtzIHRvIFdheW5lIFllbiwgSmluLUxvbiBIb24sIGFuZCBBbGV4IFdpbiBvZiBCdXNMb2dpYywgd2hvc2UKKyAgYWR2aWNlIGhhcyBiZWVuIGludmFsdWFibGUsIHRvIERhdmlkIEdlbnR6ZWwsIGZvciB3cml0aW5nIHRoZSBvcmlnaW5hbCBMaW51eAorICBCdXNMb2dpYyBkcml2ZXIsIGFuZCB0byBQYXVsIEdvcnRtYWtlciwgZm9yIGJlaW5nIHN1Y2ggYSBkZWRpY2F0ZWQgdGVzdCBzaXRlLgorCisgIEZpbmFsbHksIHNwZWNpYWwgdGhhbmtzIHRvIE15bGV4L0J1c0xvZ2ljIGZvciBtYWtpbmcgdGhlIEZsYXNoUG9pbnQgU0NDQgorICBNYW5hZ2VyIGF2YWlsYWJsZSBhcyBmcmVlbHkgcmVkaXN0cmlidXRhYmxlIHNvdXJjZSBjb2RlLgorCisqLworCisjZGVmaW5lIEJ1c0xvZ2ljX0RyaXZlclZlcnNpb24JCSIyLjEuMTYiCisjZGVmaW5lIEJ1c0xvZ2ljX0RyaXZlckRhdGUJCSIxOCBKdWx5IDIwMDIiCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisjaW5jbHVkZSAiQnVzTG9naWMuaCIKKyNpbmNsdWRlICJGbGFzaFBvaW50LmMiCisKKyNpZm5kZWYgRkFJTFVSRQorI2RlZmluZSBGQUlMVVJFICgtMSkKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBCdXNfTG9naWNfdGVtcGxhdGU7CisKKy8qCisgIEJ1c0xvZ2ljX0RyaXZlck9wdGlvbnNDb3VudCBpcyBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgQnVzTG9naWMgRHJpdmVyCisgIE9wdGlvbnMgc3BlY2lmaWNhdGlvbnMgcHJvdmlkZWQgdmlhIHRoZSBMaW51eCBLZXJuZWwgQ29tbWFuZCBMaW5lIG9yIHZpYQorICB0aGUgTG9hZGFibGUgS2VybmVsIE1vZHVsZSBJbnN0YWxsYXRpb24gRmFjaWxpdHkuCisqLworCitzdGF0aWMgaW50IEJ1c0xvZ2ljX0RyaXZlck9wdGlvbnNDb3VudDsKKworCisvKgorICBCdXNMb2dpY19Ecml2ZXJPcHRpb25zIGlzIGFuIGFycmF5IG9mIERyaXZlciBPcHRpb25zIHN0cnVjdHVyZXMgcmVwcmVzZW50aW5nCisgIEJ1c0xvZ2ljIERyaXZlciBPcHRpb25zIHNwZWNpZmljYXRpb25zIHByb3ZpZGVkIHZpYSB0aGUgTGludXggS2VybmVsIENvbW1hbmQKKyAgTGluZSBvciB2aWEgdGhlIExvYWRhYmxlIEtlcm5lbCBNb2R1bGUgSW5zdGFsbGF0aW9uIEZhY2lsaXR5LgorKi8KKworc3RhdGljIHN0cnVjdCBCdXNMb2dpY19Ecml2ZXJPcHRpb25zIEJ1c0xvZ2ljX0RyaXZlck9wdGlvbnNbQnVzTG9naWNfTWF4SG9zdEFkYXB0ZXJzXTsKKworCisvKgorICBCdXNMb2dpYyBjYW4gYmUgYXNzaWduZWQgYSBzdHJpbmcgYnkgaW5zbW9kLgorKi8KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworI2lmZGVmIE1PRFVMRQorc3RhdGljIGNoYXIgKkJ1c0xvZ2ljOworbW9kdWxlX3BhcmFtKEJ1c0xvZ2ljLCBjaGFycCwgMCk7CisjZW5kaWYKKworCisvKgorICBCdXNMb2dpY19Qcm9iZU9wdGlvbnMgaXMgYSBzZXQgb2YgUHJvYmUgT3B0aW9ucyB0byBiZSBhcHBsaWVkIGFjcm9zcworICBhbGwgQnVzTG9naWMgSG9zdCBBZGFwdGVycy4KKyovCisKK3N0YXRpYyBzdHJ1Y3QgQnVzTG9naWNfUHJvYmVPcHRpb25zIEJ1c0xvZ2ljX1Byb2JlT3B0aW9uczsKKworCisvKgorICBCdXNMb2dpY19HbG9iYWxPcHRpb25zIGlzIGEgc2V0IG9mIEdsb2JhbCBPcHRpb25zIHRvIGJlIGFwcGxpZWQgYWNyb3NzCisgIGFsbCBCdXNMb2dpYyBIb3N0IEFkYXB0ZXJzLgorKi8KKworc3RhdGljIHN0cnVjdCBCdXNMb2dpY19HbG9iYWxPcHRpb25zIEJ1c0xvZ2ljX0dsb2JhbE9wdGlvbnM7CisKK3N0YXRpYyBMSVNUX0hFQUQoQnVzTG9naWNfaG9zdF9saXN0KTsKKworLyoKKyAgQnVzTG9naWNfUHJvYmVJbmZvQ291bnQgaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIEJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3QuCisqLworCitzdGF0aWMgaW50IEJ1c0xvZ2ljX1Byb2JlSW5mb0NvdW50OworCisKKy8qCisgIEJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3QgaXMgdGhlIGxpc3Qgb2YgSS9PIEFkZHJlc3NlcyBhbmQgQnVzIFByb2JlIEluZm9ybWF0aW9uCisgIHRvIGJlIGNoZWNrZWQgZm9yIHBvdGVudGlhbCBCdXNMb2dpYyBIb3N0IEFkYXB0ZXJzLiAgSXQgaXMgaW5pdGlhbGl6ZWQgYnkKKyAgaW50ZXJyb2dhdGluZyB0aGUgUENJIENvbmZpZ3VyYXRpb24gU3BhY2Ugb24gUENJIG1hY2hpbmVzIGFzIHdlbGwgYXMgZnJvbSB0aGUKKyAgbGlzdCBvZiBzdGFuZGFyZCBCdXNMb2dpYyBJL08gQWRkcmVzc2VzLgorKi8KKworc3RhdGljIHN0cnVjdCBCdXNMb2dpY19Qcm9iZUluZm8gKkJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3Q7CisKKworLyoKKyAgQnVzTG9naWNfQ29tbWFuZEZhaWx1cmVSZWFzb24gaG9sZHMgYSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIHJlYXNvbiB3aHkgYQorICBjYWxsIHRvIEJ1c0xvZ2ljX0NvbW1hbmQgZmFpbGVkLiAgSXQgaXMgb25seSBub24tTlVMTCB3aGVuIEJ1c0xvZ2ljX0NvbW1hbmQKKyAgcmV0dXJucyBhIGZhaWx1cmUgY29kZS4KKyovCisKK3N0YXRpYyBjaGFyICpCdXNMb2dpY19Db21tYW5kRmFpbHVyZVJlYXNvbjsKKworLyoKKyAgQnVzTG9naWNfQW5ub3VuY2VEcml2ZXIgYW5ub3VuY2VzIHRoZSBEcml2ZXIgVmVyc2lvbiBhbmQgRGF0ZSwgQXV0aG9yJ3MKKyAgTmFtZSwgQ29weXJpZ2h0IE5vdGljZSwgYW5kIEVsZWN0cm9uaWMgTWFpbCBBZGRyZXNzLgorKi8KKworc3RhdGljIHZvaWQgQnVzTG9naWNfQW5ub3VuY2VEcml2ZXIoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlcikKK3sKKwlCdXNMb2dpY19Bbm5vdW5jZSgiKioqKiogQnVzTG9naWMgU0NTSSBEcml2ZXIgVmVyc2lvbiAiIEJ1c0xvZ2ljX0RyaXZlclZlcnNpb24gIiBvZiAiIEJ1c0xvZ2ljX0RyaXZlckRhdGUgIiAqKioqKlxuIiwgSG9zdEFkYXB0ZXIpOworCUJ1c0xvZ2ljX0Fubm91bmNlKCJDb3B5cmlnaHQgMTk5NS0xOTk4IGJ5IExlb25hcmQgTi4gWnVia29mZiAiICI8bG56QGRhbmRlbGlvbi5jb20+XG4iLCBIb3N0QWRhcHRlcik7Cit9CisKKworLyoKKyAgQnVzTG9naWNfRHJpdmVySW5mbyByZXR1cm5zIHRoZSBIb3N0IEFkYXB0ZXIgTmFtZSB0byBpZGVudGlmeSB0aGlzIFNDU0kKKyAgRHJpdmVyIGFuZCBIb3N0IEFkYXB0ZXIuCisqLworCitzdGF0aWMgY29uc3QgY2hhciAqQnVzTG9naWNfRHJpdmVySW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpIb3N0KQoreworCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSAoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICopIEhvc3QtPmhvc3RkYXRhOworCXJldHVybiBIb3N0QWRhcHRlci0+RnVsbE1vZGVsTmFtZTsKK30KKworLyoKKyAgQnVzTG9naWNfSW5pdGlhbGl6ZUNDQnMgaW5pdGlhbGl6ZXMgYSBncm91cCBvZiBDb21tYW5kIENvbnRyb2wgQmxvY2tzIChDQ0JzKQorICBmb3IgSG9zdCBBZGFwdGVyIGZyb20gdGhlIEJsb2NrU2l6ZSBieXRlcyBsb2NhdGVkIGF0IEJsb2NrUG9pbnRlci4gIFRoZSBuZXdseQorICBjcmVhdGVkIENDQnMgYXJlIGFkZGVkIHRvIEhvc3QgQWRhcHRlcidzIGZyZWUgbGlzdC4KKyovCisKK3N0YXRpYyB2b2lkIEJ1c0xvZ2ljX0luaXRpYWxpemVDQ0JzKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIsIHZvaWQgKkJsb2NrUG9pbnRlciwgaW50IEJsb2NrU2l6ZSwgZG1hX2FkZHJfdCBCbG9ja1BvaW50ZXJIYW5kbGUpCit7CisJc3RydWN0IEJ1c0xvZ2ljX0NDQiAqQ0NCID0gKHN0cnVjdCBCdXNMb2dpY19DQ0IgKikgQmxvY2tQb2ludGVyOworCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwOworCW1lbXNldChCbG9ja1BvaW50ZXIsIDAsIEJsb2NrU2l6ZSk7CisJQ0NCLT5BbGxvY2F0aW9uR3JvdXBIZWFkID0gQmxvY2tQb2ludGVySGFuZGxlOworCUNDQi0+QWxsb2NhdGlvbkdyb3VwU2l6ZSA9IEJsb2NrU2l6ZTsKKwl3aGlsZSAoKEJsb2NrU2l6ZSAtPSBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX0NDQikpID49IDApIHsKKwkJQ0NCLT5TdGF0dXMgPSBCdXNMb2dpY19DQ0JfRnJlZTsKKwkJQ0NCLT5Ib3N0QWRhcHRlciA9IEhvc3RBZGFwdGVyOworCQlDQ0ItPkRNQV9IYW5kbGUgPSAodTMyKSBCbG9ja1BvaW50ZXJIYW5kbGUgKyBvZmZzZXQ7CisJCWlmIChCdXNMb2dpY19GbGFzaFBvaW50SG9zdEFkYXB0ZXJQKEhvc3RBZGFwdGVyKSkgeworCQkJQ0NCLT5DYWxsYmFja0Z1bmN0aW9uID0gQnVzTG9naWNfUXVldWVDb21wbGV0ZWRDQ0I7CisJCQlDQ0ItPkJhc2VBZGRyZXNzID0gSG9zdEFkYXB0ZXItPkZsYXNoUG9pbnRJbmZvLkJhc2VBZGRyZXNzOworCQl9CisJCUNDQi0+TmV4dCA9IEhvc3RBZGFwdGVyLT5GcmVlX0NDQnM7CisJCUNDQi0+TmV4dEFsbCA9IEhvc3RBZGFwdGVyLT5BbGxfQ0NCczsKKwkJSG9zdEFkYXB0ZXItPkZyZWVfQ0NCcyA9IENDQjsKKwkJSG9zdEFkYXB0ZXItPkFsbF9DQ0JzID0gQ0NCOworCQlIb3N0QWRhcHRlci0+QWxsb2NhdGVkQ0NCcysrOworCQlDQ0IrKzsKKwkJb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgQnVzTG9naWNfQ0NCKTsKKwl9Cit9CisKKworLyoKKyAgQnVzTG9naWNfQ3JlYXRlSW5pdGlhbENDQnMgYWxsb2NhdGVzIHRoZSBpbml0aWFsIENDQnMgZm9yIEhvc3QgQWRhcHRlci4KKyovCisKK3N0YXRpYyBib29sZWFuIF9faW5pdCBCdXNMb2dpY19DcmVhdGVJbml0aWFsQ0NCcyhzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyKQoreworCWludCBCbG9ja1NpemUgPSBCdXNMb2dpY19DQ0JfQWxsb2NhdGlvbkdyb3VwU2l6ZSAqIHNpemVvZihzdHJ1Y3QgQnVzTG9naWNfQ0NCKTsKKwl2b2lkICpCbG9ja1BvaW50ZXI7CisJZG1hX2FkZHJfdCBCbG9ja1BvaW50ZXJIYW5kbGU7CisJd2hpbGUgKEhvc3RBZGFwdGVyLT5BbGxvY2F0ZWRDQ0JzIDwgSG9zdEFkYXB0ZXItPkluaXRpYWxDQ0JzKSB7CisJCUJsb2NrUG9pbnRlciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KEhvc3RBZGFwdGVyLT5QQ0lfRGV2aWNlLCBCbG9ja1NpemUsICZCbG9ja1BvaW50ZXJIYW5kbGUpOworCQlpZiAoQmxvY2tQb2ludGVyID09IE5VTEwpIHsKKwkJCUJ1c0xvZ2ljX0Vycm9yKCJVTkFCTEUgVE8gQUxMT0NBVEUgQ0NCIEdST1VQIC0gREVUQUNISU5HXG4iLCBIb3N0QWRhcHRlcik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJQnVzTG9naWNfSW5pdGlhbGl6ZUNDQnMoSG9zdEFkYXB0ZXIsIEJsb2NrUG9pbnRlciwgQmxvY2tTaXplLCBCbG9ja1BvaW50ZXJIYW5kbGUpOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworCisvKgorICBCdXNMb2dpY19EZXN0cm95Q0NCcyBkZWFsbG9jYXRlcyB0aGUgQ0NCcyBmb3IgSG9zdCBBZGFwdGVyLgorKi8KKworc3RhdGljIHZvaWQgQnVzTG9naWNfRGVzdHJveUNDQnMoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlcikKK3sKKwlzdHJ1Y3QgQnVzTG9naWNfQ0NCICpOZXh0Q0NCID0gSG9zdEFkYXB0ZXItPkFsbF9DQ0JzLCAqQ0NCLCAqTGFzdF9DQ0IgPSBOVUxMOworCUhvc3RBZGFwdGVyLT5BbGxfQ0NCcyA9IE5VTEw7CisJSG9zdEFkYXB0ZXItPkZyZWVfQ0NCcyA9IE5VTEw7CisJd2hpbGUgKChDQ0IgPSBOZXh0Q0NCKSAhPSBOVUxMKSB7CisJCU5leHRDQ0IgPSBDQ0ItPk5leHRBbGw7CisJCWlmIChDQ0ItPkFsbG9jYXRpb25Hcm91cEhlYWQpIHsKKwkJCWlmIChMYXN0X0NDQikKKwkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KEhvc3RBZGFwdGVyLT5QQ0lfRGV2aWNlLCBMYXN0X0NDQi0+QWxsb2NhdGlvbkdyb3VwU2l6ZSwgTGFzdF9DQ0IsIExhc3RfQ0NCLT5BbGxvY2F0aW9uR3JvdXBIZWFkKTsKKwkJCUxhc3RfQ0NCID0gQ0NCOworCQl9CisJfQorCWlmIChMYXN0X0NDQikKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChIb3N0QWRhcHRlci0+UENJX0RldmljZSwgTGFzdF9DQ0ItPkFsbG9jYXRpb25Hcm91cFNpemUsIExhc3RfQ0NCLCBMYXN0X0NDQi0+QWxsb2NhdGlvbkdyb3VwSGVhZCk7Cit9CisKKworLyoKKyAgQnVzTG9naWNfQ3JlYXRlQWRkaXRpb25hbENDQnMgYWxsb2NhdGVzIEFkZGl0aW9uYWwgQ0NCcyBmb3IgSG9zdCBBZGFwdGVyLiAgSWYKKyAgYWxsb2NhdGlvbiBmYWlscyBhbmQgdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBDQ0JzIGF2YWlsYWJsZSwgdGhlIERyaXZlciBRdWV1ZQorICBEZXB0aCBpcyBkZWNyZWFzZWQgdG8gYSBrbm93biBzYWZlIHZhbHVlIHRvIGF2b2lkIHBvdGVudGlhbCBkZWFkbG9ja3Mgd2hlbgorICBtdWx0aXBsZSBob3N0IGFkYXB0ZXJzIHNoYXJlIHRoZSBzYW1lIElSUSBDaGFubmVsLgorKi8KKworc3RhdGljIHZvaWQgQnVzTG9naWNfQ3JlYXRlQWRkaXRpb25hbENDQnMoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlciwgaW50IEFkZGl0aW9uYWxDQ0JzLCBib29sZWFuIFN1Y2Nlc3NNZXNzYWdlUCkKK3sKKwlpbnQgQmxvY2tTaXplID0gQnVzTG9naWNfQ0NCX0FsbG9jYXRpb25Hcm91cFNpemUgKiBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX0NDQik7CisJaW50IFByZXZpb3VzbHlBbGxvY2F0ZWQgPSBIb3N0QWRhcHRlci0+QWxsb2NhdGVkQ0NCczsKKwl2b2lkICpCbG9ja1BvaW50ZXI7CisJZG1hX2FkZHJfdCBCbG9ja1BvaW50ZXJIYW5kbGU7CisJaWYgKEFkZGl0aW9uYWxDQ0JzIDw9IDApCisJCXJldHVybjsKKwl3aGlsZSAoSG9zdEFkYXB0ZXItPkFsbG9jYXRlZENDQnMgLSBQcmV2aW91c2x5QWxsb2NhdGVkIDwgQWRkaXRpb25hbENDQnMpIHsKKwkJQmxvY2tQb2ludGVyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoSG9zdEFkYXB0ZXItPlBDSV9EZXZpY2UsIEJsb2NrU2l6ZSwgJkJsb2NrUG9pbnRlckhhbmRsZSk7CisJCWlmIChCbG9ja1BvaW50ZXIgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlCdXNMb2dpY19Jbml0aWFsaXplQ0NCcyhIb3N0QWRhcHRlciwgQmxvY2tQb2ludGVyLCBCbG9ja1NpemUsIEJsb2NrUG9pbnRlckhhbmRsZSk7CisJfQorCWlmIChIb3N0QWRhcHRlci0+QWxsb2NhdGVkQ0NCcyA+IFByZXZpb3VzbHlBbGxvY2F0ZWQpIHsKKwkJaWYgKFN1Y2Nlc3NNZXNzYWdlUCkKKwkJCUJ1c0xvZ2ljX05vdGljZSgiQWxsb2NhdGVkICVkIGFkZGl0aW9uYWwgQ0NCcyAodG90YWwgbm93ICVkKVxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5BbGxvY2F0ZWRDQ0JzIC0gUHJldmlvdXNseUFsbG9jYXRlZCwgSG9zdEFkYXB0ZXItPkFsbG9jYXRlZENDQnMpOworCQlyZXR1cm47CisJfQorCUJ1c0xvZ2ljX05vdGljZSgiRmFpbGVkIHRvIGFsbG9jYXRlIGFkZGl0aW9uYWwgQ0NCc1xuIiwgSG9zdEFkYXB0ZXIpOworCWlmIChIb3N0QWRhcHRlci0+RHJpdmVyUXVldWVEZXB0aCA+IEhvc3RBZGFwdGVyLT5BbGxvY2F0ZWRDQ0JzIC0gSG9zdEFkYXB0ZXItPlRhcmdldERldmljZUNvdW50KSB7CisJCUhvc3RBZGFwdGVyLT5Ecml2ZXJRdWV1ZURlcHRoID0gSG9zdEFkYXB0ZXItPkFsbG9jYXRlZENDQnMgLSBIb3N0QWRhcHRlci0+VGFyZ2V0RGV2aWNlQ291bnQ7CisJCUhvc3RBZGFwdGVyLT5TQ1NJX0hvc3QtPmNhbl9xdWV1ZSA9IEhvc3RBZGFwdGVyLT5Ecml2ZXJRdWV1ZURlcHRoOworCX0KK30KKworLyoKKyAgQnVzTG9naWNfQWxsb2NhdGVDQ0IgYWxsb2NhdGVzIGEgQ0NCIGZyb20gSG9zdCBBZGFwdGVyJ3MgZnJlZSBsaXN0LAorICBhbGxvY2F0aW5nIG1vcmUgbWVtb3J5IGZyb20gdGhlIEtlcm5lbCBpZiBuZWNlc3NhcnkuICBUaGUgSG9zdCBBZGFwdGVyJ3MKKyAgTG9jayBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gYWNxdWlyZWQgYnkgdGhlIGNhbGxlci4KKyovCisKK3N0YXRpYyBzdHJ1Y3QgQnVzTG9naWNfQ0NCICpCdXNMb2dpY19BbGxvY2F0ZUNDQihzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIKKwkJCQkJCSAqSG9zdEFkYXB0ZXIpCit7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgU2VyaWFsTnVtYmVyID0gMDsKKwlzdHJ1Y3QgQnVzTG9naWNfQ0NCICpDQ0I7CisJQ0NCID0gSG9zdEFkYXB0ZXItPkZyZWVfQ0NCczsKKwlpZiAoQ0NCICE9IE5VTEwpIHsKKwkJQ0NCLT5TZXJpYWxOdW1iZXIgPSArK1NlcmlhbE51bWJlcjsKKwkJSG9zdEFkYXB0ZXItPkZyZWVfQ0NCcyA9IENDQi0+TmV4dDsKKwkJQ0NCLT5OZXh0ID0gTlVMTDsKKwkJaWYgKEhvc3RBZGFwdGVyLT5GcmVlX0NDQnMgPT0gTlVMTCkKKwkJCUJ1c0xvZ2ljX0NyZWF0ZUFkZGl0aW9uYWxDQ0JzKEhvc3RBZGFwdGVyLCBIb3N0QWRhcHRlci0+SW5jcmVtZW50YWxDQ0JzLCB0cnVlKTsKKwkJcmV0dXJuIENDQjsKKwl9CisJQnVzTG9naWNfQ3JlYXRlQWRkaXRpb25hbENDQnMoSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5JbmNyZW1lbnRhbENDQnMsIHRydWUpOworCUNDQiA9IEhvc3RBZGFwdGVyLT5GcmVlX0NDQnM7CisJaWYgKENDQiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlDQ0ItPlNlcmlhbE51bWJlciA9ICsrU2VyaWFsTnVtYmVyOworCUhvc3RBZGFwdGVyLT5GcmVlX0NDQnMgPSBDQ0ItPk5leHQ7CisJQ0NCLT5OZXh0ID0gTlVMTDsKKwlyZXR1cm4gQ0NCOworfQorCisKKy8qCisgIEJ1c0xvZ2ljX0RlYWxsb2NhdGVDQ0IgZGVhbGxvY2F0ZXMgYSBDQ0IsIHJldHVybmluZyBpdCB0byB0aGUgSG9zdCBBZGFwdGVyJ3MKKyAgZnJlZSBsaXN0LiAgVGhlIEhvc3QgQWRhcHRlcidzIExvY2sgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGFjcXVpcmVkIGJ5IHRoZQorICBjYWxsZXIuCisqLworCitzdGF0aWMgdm9pZCBCdXNMb2dpY19EZWFsbG9jYXRlQ0NCKHN0cnVjdCBCdXNMb2dpY19DQ0IgKkNDQikKK3sKKwlzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyID0gQ0NCLT5Ib3N0QWRhcHRlcjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBDQ0ItPkNvbW1hbmQ7CisKKwlpZiAoY21kLT51c2Vfc2cgIT0gMCkgeworCQlwY2lfdW5tYXBfc2coSG9zdEFkYXB0ZXItPlBDSV9EZXZpY2UsCisJCQkJKHN0cnVjdCBzY2F0dGVybGlzdCAqKWNtZC0+cmVxdWVzdF9idWZmZXIsCisJCQkJY21kLT51c2Vfc2csIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCX0gZWxzZSBpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4gIT0gMCkgeworCQlwY2lfdW5tYXBfc2luZ2xlKEhvc3RBZGFwdGVyLT5QQ0lfRGV2aWNlLCBDQ0ItPkRhdGFQb2ludGVyLAorCQkJCUNDQi0+RGF0YUxlbmd0aCwgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJfQorCXBjaV91bm1hcF9zaW5nbGUoSG9zdEFkYXB0ZXItPlBDSV9EZXZpY2UsIENDQi0+U2Vuc2VEYXRhUG9pbnRlciwKKwkJCUNDQi0+U2Vuc2VEYXRhTGVuZ3RoLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJQ0NCLT5Db21tYW5kID0gTlVMTDsKKwlDQ0ItPlN0YXR1cyA9IEJ1c0xvZ2ljX0NDQl9GcmVlOworCUNDQi0+TmV4dCA9IEhvc3RBZGFwdGVyLT5GcmVlX0NDQnM7CisJSG9zdEFkYXB0ZXItPkZyZWVfQ0NCcyA9IENDQjsKK30KKworCisvKgorICBCdXNMb2dpY19Db21tYW5kIHNlbmRzIHRoZSBjb21tYW5kIE9wZXJhdGlvbkNvZGUgdG8gSG9zdEFkYXB0ZXIsIG9wdGlvbmFsbHkKKyAgcHJvdmlkaW5nIFBhcmFtZXRlckxlbmd0aCBieXRlcyBvZiBQYXJhbWV0ZXJEYXRhIGFuZCByZWNlaXZpbmcgYXQgbW9zdAorICBSZXBseUxlbmd0aCBieXRlcyBvZiBSZXBseURhdGE7IGFueSBleGNlc3MgcmVwbHkgZGF0YSBpcyByZWNlaXZlZCBidXQKKyAgZGlzY2FyZGVkLgorCisgIE9uIHN1Y2Nlc3MsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlcGx5IGJ5dGVzIHJlYWQgZnJvbQorICB0aGUgSG9zdCBBZGFwdGVyIChpbmNsdWRpbmcgYW55IGRpc2NhcmRlZCBkYXRhKTsgb24gZmFpbHVyZSwgaXQgcmV0dXJucworICAtMSBpZiB0aGUgY29tbWFuZCB3YXMgaW52YWxpZCwgb3IgLTIgaWYgYSB0aW1lb3V0IG9jY3VycmVkLgorCisgIEJ1c0xvZ2ljX0NvbW1hbmQgaXMgY2FsbGVkIGV4Y2x1c2l2ZWx5IGR1cmluZyBob3N0IGFkYXB0ZXIgZGV0ZWN0aW9uIGFuZAorICBpbml0aWFsaXphdGlvbiwgc28gcGVyZm9ybWFuY2UgYW5kIGxhdGVuY3kgYXJlIG5vdCBjcml0aWNhbCwgYW5kIGV4Y2x1c2l2ZQorICBhY2Nlc3MgdG8gdGhlIEhvc3QgQWRhcHRlciBoYXJkd2FyZSBpcyBhc3N1bWVkLiAgT25jZSB0aGUgaG9zdCBhZGFwdGVyIGFuZAorICBkcml2ZXIgYXJlIGluaXRpYWxpemVkLCB0aGUgb25seSBIb3N0IEFkYXB0ZXIgY29tbWFuZCB0aGF0IGlzIGlzc3VlZCBpcyB0aGUKKyAgc2luZ2xlIGJ5dGUgRXhlY3V0ZSBNYWlsYm94IENvbW1hbmQgb3BlcmF0aW9uIGNvZGUsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUKKyAgd2FpdGluZyBmb3IgdGhlIEhvc3QgQWRhcHRlciBSZWFkeSBiaXQgdG8gYmUgc2V0IGluIHRoZSBTdGF0dXMgUmVnaXN0ZXIuCisqLworCitzdGF0aWMgaW50IEJ1c0xvZ2ljX0NvbW1hbmQoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlciwgZW51bSBCdXNMb2dpY19PcGVyYXRpb25Db2RlIE9wZXJhdGlvbkNvZGUsIHZvaWQgKlBhcmFtZXRlckRhdGEsIGludCBQYXJhbWV0ZXJMZW5ndGgsIHZvaWQgKlJlcGx5RGF0YSwgaW50IFJlcGx5TGVuZ3RoKQoreworCXVuc2lnbmVkIGNoYXIgKlBhcmFtZXRlclBvaW50ZXIgPSAodW5zaWduZWQgY2hhciAqKSBQYXJhbWV0ZXJEYXRhOworCXVuc2lnbmVkIGNoYXIgKlJlcGx5UG9pbnRlciA9ICh1bnNpZ25lZCBjaGFyICopIFJlcGx5RGF0YTsKKwl1bmlvbiBCdXNMb2dpY19TdGF0dXNSZWdpc3RlciBTdGF0dXNSZWdpc3RlcjsKKwl1bmlvbiBCdXNMb2dpY19JbnRlcnJ1cHRSZWdpc3RlciBJbnRlcnJ1cHRSZWdpc3RlcjsKKwl1bnNpZ25lZCBsb25nIFByb2Nlc3NvckZsYWdzID0gMDsKKwlpbnQgUmVwbHlCeXRlcyA9IDAsIFJlc3VsdDsKKwlsb25nIFRpbWVvdXRDb3VudGVyOworCS8qCisJICAgQ2xlYXIgb3V0IHRoZSBSZXBseSBEYXRhIGlmIHByb3ZpZGVkLgorCSAqLworCWlmIChSZXBseUxlbmd0aCA+IDApCisJCW1lbXNldChSZXBseURhdGEsIDAsIFJlcGx5TGVuZ3RoKTsKKwkvKgorCSAgIElmIHRoZSBJUlEgQ2hhbm5lbCBoYXMgbm90IHlldCBiZWVuIGFjcXVpcmVkLCB0aGVuIGludGVycnVwdHMgbXVzdCBiZQorCSAgIGRpc2FibGVkIHdoaWxlIGlzc3VpbmcgaG9zdCBhZGFwdGVyIGNvbW1hbmRzIHNpbmNlIGEgQ29tbWFuZCBDb21wbGV0ZQorCSAgIGludGVycnVwdCBjb3VsZCBvY2N1ciBpZiB0aGUgSVJRIENoYW5uZWwgd2FzIHByZXZpb3VzbHkgZW5hYmxlZCBieSBhbm90aGVyCisJICAgQnVzTG9naWMgSG9zdCBBZGFwdGVyIG9yIGFub3RoZXIgZHJpdmVyIHNoYXJpbmcgdGhlIHNhbWUgSVJRIENoYW5uZWwuCisJICovCisJaWYgKCFIb3N0QWRhcHRlci0+SVJRX0NoYW5uZWxBY3F1aXJlZCkgeworCQlsb2NhbF9pcnFfc2F2ZShQcm9jZXNzb3JGbGFncyk7CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJfQorCS8qCisJICAgV2FpdCBmb3IgdGhlIEhvc3QgQWRhcHRlciBSZWFkeSBiaXQgdG8gYmUgc2V0IGFuZCB0aGUgQ29tbWFuZC9QYXJhbWV0ZXIKKwkgICBSZWdpc3RlciBCdXN5IGJpdCB0byBiZSByZXNldCBpbiB0aGUgU3RhdHVzIFJlZ2lzdGVyLgorCSAqLworCVRpbWVvdXRDb3VudGVyID0gMTAwMDA7CisJd2hpbGUgKC0tVGltZW91dENvdW50ZXIgPj0gMCkgeworCQlTdGF0dXNSZWdpc3Rlci5BbGwgPSBCdXNMb2dpY19SZWFkU3RhdHVzUmVnaXN0ZXIoSG9zdEFkYXB0ZXIpOworCQlpZiAoU3RhdHVzUmVnaXN0ZXIuc3IuSG9zdEFkYXB0ZXJSZWFkeSAmJiAhU3RhdHVzUmVnaXN0ZXIuc3IuQ29tbWFuZFBhcmFtZXRlclJlZ2lzdGVyQnVzeSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTAwKTsKKwl9CisJaWYgKFRpbWVvdXRDb3VudGVyIDwgMCkgeworCQlCdXNMb2dpY19Db21tYW5kRmFpbHVyZVJlYXNvbiA9ICJUaW1lb3V0IHdhaXRpbmcgZm9yIEhvc3QgQWRhcHRlciBSZWFkeSI7CisJCVJlc3VsdCA9IC0yOworCQlnb3RvIERvbmU7CisJfQorCS8qCisJICAgV3JpdGUgdGhlIE9wZXJhdGlvbkNvZGUgdG8gdGhlIENvbW1hbmQvUGFyYW1ldGVyIFJlZ2lzdGVyLgorCSAqLworCUhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckNvbW1hbmRDb21wbGV0ZWQgPSBmYWxzZTsKKwlCdXNMb2dpY19Xcml0ZUNvbW1hbmRQYXJhbWV0ZXJSZWdpc3RlcihIb3N0QWRhcHRlciwgT3BlcmF0aW9uQ29kZSk7CisJLyoKKwkgICBXcml0ZSBhbnkgYWRkaXRpb25hbCBQYXJhbWV0ZXIgQnl0ZXMuCisJICovCisJVGltZW91dENvdW50ZXIgPSAxMDAwMDsKKwl3aGlsZSAoUGFyYW1ldGVyTGVuZ3RoID4gMCAmJiAtLVRpbWVvdXRDb3VudGVyID49IDApIHsKKwkJLyoKKwkJICAgV2FpdCAxMDAgbWljcm9zZWNvbmRzIHRvIGdpdmUgdGhlIEhvc3QgQWRhcHRlciBlbm91Z2ggdGltZSB0byBkZXRlcm1pbmUKKwkJICAgd2hldGhlciB0aGUgbGFzdCB2YWx1ZSB3cml0dGVuIHRvIHRoZSBDb21tYW5kL1BhcmFtZXRlciBSZWdpc3RlciB3YXMKKwkJICAgdmFsaWQgb3Igbm90LiAgSWYgdGhlIENvbW1hbmQgQ29tcGxldGUgYml0IGlzIHNldCBpbiB0aGUgSW50ZXJydXB0CisJCSAgIFJlZ2lzdGVyLCB0aGVuIHRoZSBDb21tYW5kIEludmFsaWQgYml0IGluIHRoZSBTdGF0dXMgUmVnaXN0ZXIgd2lsbCBiZQorCQkgICByZXNldCBpZiB0aGUgT3BlcmF0aW9uIENvZGUgb3IgUGFyYW1ldGVyIHdhcyB2YWxpZCBhbmQgdGhlIGNvbW1hbmQKKwkJICAgaGFzIGNvbXBsZXRlZCwgb3Igc2V0IGlmIHRoZSBPcGVyYXRpb24gQ29kZSBvciBQYXJhbWV0ZXIgd2FzIGludmFsaWQuCisJCSAgIElmIHRoZSBEYXRhIEluIFJlZ2lzdGVyIFJlYWR5IGJpdCBpcyBzZXQgaW4gdGhlIFN0YXR1cyBSZWdpc3RlciwgdGhlbgorCQkgICB0aGUgT3BlcmF0aW9uIENvZGUgd2FzIHZhbGlkLCBhbmQgZGF0YSBpcyB3YWl0aW5nIHRvIGJlIHJlYWQgYmFjaworCQkgICBmcm9tIHRoZSBIb3N0IEFkYXB0ZXIuICBPdGhlcndpc2UsIHdhaXQgZm9yIHRoZSBDb21tYW5kL1BhcmFtZXRlcgorCQkgICBSZWdpc3RlciBCdXN5IGJpdCBpbiB0aGUgU3RhdHVzIFJlZ2lzdGVyIHRvIGJlIHJlc2V0LgorCQkgKi8KKwkJdWRlbGF5KDEwMCk7CisJCUludGVycnVwdFJlZ2lzdGVyLkFsbCA9IEJ1c0xvZ2ljX1JlYWRJbnRlcnJ1cHRSZWdpc3RlcihIb3N0QWRhcHRlcik7CisJCVN0YXR1c1JlZ2lzdGVyLkFsbCA9IEJ1c0xvZ2ljX1JlYWRTdGF0dXNSZWdpc3RlcihIb3N0QWRhcHRlcik7CisJCWlmIChJbnRlcnJ1cHRSZWdpc3Rlci5pci5Db21tYW5kQ29tcGxldGUpCisJCQlicmVhazsKKwkJaWYgKEhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckNvbW1hbmRDb21wbGV0ZWQpCisJCQlicmVhazsKKwkJaWYgKFN0YXR1c1JlZ2lzdGVyLnNyLkRhdGFJblJlZ2lzdGVyUmVhZHkpCisJCQlicmVhazsKKwkJaWYgKFN0YXR1c1JlZ2lzdGVyLnNyLkNvbW1hbmRQYXJhbWV0ZXJSZWdpc3RlckJ1c3kpCisJCQljb250aW51ZTsKKwkJQnVzTG9naWNfV3JpdGVDb21tYW5kUGFyYW1ldGVyUmVnaXN0ZXIoSG9zdEFkYXB0ZXIsICpQYXJhbWV0ZXJQb2ludGVyKyspOworCQlQYXJhbWV0ZXJMZW5ndGgtLTsKKwl9CisJaWYgKFRpbWVvdXRDb3VudGVyIDwgMCkgeworCQlCdXNMb2dpY19Db21tYW5kRmFpbHVyZVJlYXNvbiA9ICJUaW1lb3V0IHdhaXRpbmcgZm9yIFBhcmFtZXRlciBBY2NlcHRhbmNlIjsKKwkJUmVzdWx0ID0gLTI7CisJCWdvdG8gRG9uZTsKKwl9CisJLyoKKwkgICBUaGUgTW9kaWZ5IEkvTyBBZGRyZXNzIGNvbW1hbmQgZG9lcyBub3QgY2F1c2UgYSBDb21tYW5kIENvbXBsZXRlIEludGVycnVwdC4KKwkgKi8KKwlpZiAoT3BlcmF0aW9uQ29kZSA9PSBCdXNMb2dpY19Nb2RpZnlJT0FkZHJlc3MpIHsKKwkJU3RhdHVzUmVnaXN0ZXIuQWxsID0gQnVzTG9naWNfUmVhZFN0YXR1c1JlZ2lzdGVyKEhvc3RBZGFwdGVyKTsKKwkJaWYgKFN0YXR1c1JlZ2lzdGVyLnNyLkNvbW1hbmRJbnZhbGlkKSB7CisJCQlCdXNMb2dpY19Db21tYW5kRmFpbHVyZVJlYXNvbiA9ICJNb2RpZnkgSS9PIEFkZHJlc3MgSW52YWxpZCI7CisJCQlSZXN1bHQgPSAtMTsKKwkJCWdvdG8gRG9uZTsKKwkJfQorCQlpZiAoQnVzTG9naWNfR2xvYmFsT3B0aW9ucy5UcmFjZUNvbmZpZ3VyYXRpb24pCisJCQlCdXNMb2dpY19Ob3RpY2UoIkJ1c0xvZ2ljX0NvbW1hbmQoJTAyWCkgU3RhdHVzID0gJTAyWDogIiAiKE1vZGlmeSBJL08gQWRkcmVzcylcbiIsIEhvc3RBZGFwdGVyLCBPcGVyYXRpb25Db2RlLCBTdGF0dXNSZWdpc3Rlci5BbGwpOworCQlSZXN1bHQgPSAwOworCQlnb3RvIERvbmU7CisJfQorCS8qCisJICAgU2VsZWN0IGFuIGFwcHJvcHJpYXRlIHRpbWVvdXQgdmFsdWUgZm9yIGF3YWl0aW5nIGNvbW1hbmQgY29tcGxldGlvbi4KKwkgKi8KKwlzd2l0Y2ggKE9wZXJhdGlvbkNvZGUpIHsKKwljYXNlIEJ1c0xvZ2ljX0lucXVpcmVJbnN0YWxsZWREZXZpY2VzSUQwdG83OgorCWNhc2UgQnVzTG9naWNfSW5xdWlyZUluc3RhbGxlZERldmljZXNJRDh0bzE1OgorCWNhc2UgQnVzTG9naWNfSW5xdWlyZVRhcmdldERldmljZXM6CisJCS8qIEFwcHJveGltYXRlbHkgNjAgc2Vjb25kcy4gKi8KKwkJVGltZW91dENvdW50ZXIgPSA2MCAqIDEwMDAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBBcHByb3hpbWF0ZWx5IDEgc2Vjb25kLiAqLworCQlUaW1lb3V0Q291bnRlciA9IDEwMDAwOworCQlicmVhazsKKwl9CisJLyoKKwkgICBSZWNlaXZlIGFueSBSZXBseSBCeXRlcywgd2FpdGluZyBmb3IgZWl0aGVyIHRoZSBDb21tYW5kIENvbXBsZXRlIGJpdCB0bworCSAgIGJlIHNldCBpbiB0aGUgSW50ZXJydXB0IFJlZ2lzdGVyLCBvciBmb3IgdGhlIEludGVycnVwdCBIYW5kbGVyIHRvIHNldCB0aGUKKwkgICBIb3N0IEFkYXB0ZXIgQ29tbWFuZCBDb21wbGV0ZWQgYml0IGluIHRoZSBIb3N0IEFkYXB0ZXIgc3RydWN0dXJlLgorCSAqLworCXdoaWxlICgtLVRpbWVvdXRDb3VudGVyID49IDApIHsKKwkJSW50ZXJydXB0UmVnaXN0ZXIuQWxsID0gQnVzTG9naWNfUmVhZEludGVycnVwdFJlZ2lzdGVyKEhvc3RBZGFwdGVyKTsKKwkJU3RhdHVzUmVnaXN0ZXIuQWxsID0gQnVzTG9naWNfUmVhZFN0YXR1c1JlZ2lzdGVyKEhvc3RBZGFwdGVyKTsKKwkJaWYgKEludGVycnVwdFJlZ2lzdGVyLmlyLkNvbW1hbmRDb21wbGV0ZSkKKwkJCWJyZWFrOworCQlpZiAoSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyQ29tbWFuZENvbXBsZXRlZCkKKwkJCWJyZWFrOworCQlpZiAoU3RhdHVzUmVnaXN0ZXIuc3IuRGF0YUluUmVnaXN0ZXJSZWFkeSkgeworCQkJaWYgKCsrUmVwbHlCeXRlcyA8PSBSZXBseUxlbmd0aCkKKwkJCQkqUmVwbHlQb2ludGVyKysgPSBCdXNMb2dpY19SZWFkRGF0YUluUmVnaXN0ZXIoSG9zdEFkYXB0ZXIpOworCQkJZWxzZQorCQkJCUJ1c0xvZ2ljX1JlYWREYXRhSW5SZWdpc3RlcihIb3N0QWRhcHRlcik7CisJCX0KKwkJaWYgKE9wZXJhdGlvbkNvZGUgPT0gQnVzTG9naWNfRmV0Y2hIb3N0QWRhcHRlckxvY2FsUkFNICYmIFN0YXR1c1JlZ2lzdGVyLnNyLkhvc3RBZGFwdGVyUmVhZHkpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwMCk7CisJfQorCWlmIChUaW1lb3V0Q291bnRlciA8IDApIHsKKwkJQnVzTG9naWNfQ29tbWFuZEZhaWx1cmVSZWFzb24gPSAiVGltZW91dCB3YWl0aW5nIGZvciBDb21tYW5kIENvbXBsZXRlIjsKKwkJUmVzdWx0ID0gLTI7CisJCWdvdG8gRG9uZTsKKwl9CisJLyoKKwkgICBDbGVhciBhbnkgcGVuZGluZyBDb21tYW5kIENvbXBsZXRlIEludGVycnVwdC4KKwkgKi8KKwlCdXNMb2dpY19JbnRlcnJ1cHRSZXNldChIb3N0QWRhcHRlcik7CisJLyoKKwkgICBQcm92aWRlIHRyYWNpbmcgaW5mb3JtYXRpb24gaWYgcmVxdWVzdGVkLgorCSAqLworCWlmIChCdXNMb2dpY19HbG9iYWxPcHRpb25zLlRyYWNlQ29uZmlndXJhdGlvbikgeworCQlpbnQgaTsKKwkJQnVzTG9naWNfTm90aWNlKCJCdXNMb2dpY19Db21tYW5kKCUwMlgpIFN0YXR1cyA9ICUwMlg6ICUyZCA9PT4gJTJkOiIsIEhvc3RBZGFwdGVyLCBPcGVyYXRpb25Db2RlLCBTdGF0dXNSZWdpc3Rlci5BbGwsIFJlcGx5TGVuZ3RoLCBSZXBseUJ5dGVzKTsKKwkJaWYgKFJlcGx5TGVuZ3RoID4gUmVwbHlCeXRlcykKKwkJCVJlcGx5TGVuZ3RoID0gUmVwbHlCeXRlczsKKwkJZm9yIChpID0gMDsgaSA8IFJlcGx5TGVuZ3RoOyBpKyspCisJCQlCdXNMb2dpY19Ob3RpY2UoIiAlMDJYIiwgSG9zdEFkYXB0ZXIsICgodW5zaWduZWQgY2hhciAqKSBSZXBseURhdGEpW2ldKTsKKwkJQnVzTG9naWNfTm90aWNlKCJcbiIsIEhvc3RBZGFwdGVyKTsKKwl9CisJLyoKKwkgICBQcm9jZXNzIENvbW1hbmQgSW52YWxpZCBjb25kaXRpb25zLgorCSAqLworCWlmIChTdGF0dXNSZWdpc3Rlci5zci5Db21tYW5kSW52YWxpZCkgeworCQkvKgorCQkgICBTb21lIGVhcmx5IEJ1c0xvZ2ljIEhvc3QgQWRhcHRlcnMgbWF5IG5vdCByZWNvdmVyIHByb3Blcmx5IGZyb20KKwkJICAgYSBDb21tYW5kIEludmFsaWQgY29uZGl0aW9uLCBzbyBpZiB0aGlzIGFwcGVhcnMgdG8gYmUgdGhlIGNhc2UsCisJCSAgIGEgU29mdCBSZXNldCBpcyBpc3N1ZWQgdG8gdGhlIEhvc3QgQWRhcHRlci4gIFBvdGVudGlhbGx5IGludmFsaWQKKwkJICAgY29tbWFuZHMgYXJlIG5ldmVyIGF0dGVtcHRlZCBhZnRlciBNYWlsYm94IEluaXRpYWxpemF0aW9uIGlzCisJCSAgIHBlcmZvcm1lZCwgc28gdGhlcmUgc2hvdWxkIGJlIG5vIEhvc3QgQWRhcHRlciBzdGF0ZSBsb3N0IGJ5IGEKKwkJICAgU29mdCBSZXNldCBpbiByZXNwb25zZSB0byBhIENvbW1hbmQgSW52YWxpZCBjb25kaXRpb24uCisJCSAqLworCQl1ZGVsYXkoMTAwMCk7CisJCVN0YXR1c1JlZ2lzdGVyLkFsbCA9IEJ1c0xvZ2ljX1JlYWRTdGF0dXNSZWdpc3RlcihIb3N0QWRhcHRlcik7CisJCWlmIChTdGF0dXNSZWdpc3Rlci5zci5Db21tYW5kSW52YWxpZCB8fAorCQkgICAgU3RhdHVzUmVnaXN0ZXIuc3IuUmVzZXJ2ZWQgfHwKKwkJICAgIFN0YXR1c1JlZ2lzdGVyLnNyLkRhdGFJblJlZ2lzdGVyUmVhZHkgfHwKKwkJICAgIFN0YXR1c1JlZ2lzdGVyLnNyLkNvbW1hbmRQYXJhbWV0ZXJSZWdpc3RlckJ1c3kgfHwgIVN0YXR1c1JlZ2lzdGVyLnNyLkhvc3RBZGFwdGVyUmVhZHkgfHwgIVN0YXR1c1JlZ2lzdGVyLnNyLkluaXRpYWxpemF0aW9uUmVxdWlyZWQgfHwgU3RhdHVzUmVnaXN0ZXIuc3IuRGlhZ25vc3RpY0FjdGl2ZSB8fCBTdGF0dXNSZWdpc3Rlci5zci5EaWFnbm9zdGljRmFpbHVyZSkgeworCQkJQnVzTG9naWNfU29mdFJlc2V0KEhvc3RBZGFwdGVyKTsKKwkJCXVkZWxheSgxMDAwKTsKKwkJfQorCQlCdXNMb2dpY19Db21tYW5kRmFpbHVyZVJlYXNvbiA9ICJDb21tYW5kIEludmFsaWQiOworCQlSZXN1bHQgPSAtMTsKKwkJZ290byBEb25lOworCX0KKwkvKgorCSAgIEhhbmRsZSBFeGNlc3MgUGFyYW1ldGVycyBTdXBwbGllZCBjb25kaXRpb25zLgorCSAqLworCWlmIChQYXJhbWV0ZXJMZW5ndGggPiAwKSB7CisJCUJ1c0xvZ2ljX0NvbW1hbmRGYWlsdXJlUmVhc29uID0gIkV4Y2VzcyBQYXJhbWV0ZXJzIFN1cHBsaWVkIjsKKwkJUmVzdWx0ID0gLTE7CisJCWdvdG8gRG9uZTsKKwl9CisJLyoKKwkgICBJbmRpY2F0ZSB0aGUgY29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorCSAqLworCUJ1c0xvZ2ljX0NvbW1hbmRGYWlsdXJlUmVhc29uID0gTlVMTDsKKwlSZXN1bHQgPSBSZXBseUJ5dGVzOworCS8qCisJICAgUmVzdG9yZSB0aGUgaW50ZXJydXB0IHN0YXR1cyBpZiBuZWNlc3NhcnkgYW5kIHJldHVybi4KKwkgKi8KKyAgICAgIERvbmU6CisJaWYgKCFIb3N0QWRhcHRlci0+SVJRX0NoYW5uZWxBY3F1aXJlZCkKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoUHJvY2Vzc29yRmxhZ3MpOworCXJldHVybiBSZXN1bHQ7Cit9CisKKworLyoKKyAgQnVzTG9naWNfQXBwZW5kUHJvYmVBZGRyZXNzSVNBIGFwcGVuZHMgYSBzaW5nbGUgSVNBIEkvTyBBZGRyZXNzIHRvIHRoZSBsaXN0CisgIG9mIEkvTyBBZGRyZXNzIGFuZCBCdXMgUHJvYmUgSW5mb3JtYXRpb24gdG8gYmUgY2hlY2tlZCBmb3IgcG90ZW50aWFsIEJ1c0xvZ2ljCisgIEhvc3QgQWRhcHRlcnMuCisqLworCitzdGF0aWMgdm9pZCBfX2luaXQgQnVzTG9naWNfQXBwZW5kUHJvYmVBZGRyZXNzSVNBKHVuc2lnbmVkIGxvbmcgSU9fQWRkcmVzcykKK3sKKwlzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvICpQcm9iZUluZm87CisJaWYgKEJ1c0xvZ2ljX1Byb2JlSW5mb0NvdW50ID49IEJ1c0xvZ2ljX01heEhvc3RBZGFwdGVycykKKwkJcmV0dXJuOworCVByb2JlSW5mbyA9ICZCdXNMb2dpY19Qcm9iZUluZm9MaXN0W0J1c0xvZ2ljX1Byb2JlSW5mb0NvdW50KytdOworCVByb2JlSW5mby0+SG9zdEFkYXB0ZXJUeXBlID0gQnVzTG9naWNfTXVsdGlNYXN0ZXI7CisJUHJvYmVJbmZvLT5Ib3N0QWRhcHRlckJ1c1R5cGUgPSBCdXNMb2dpY19JU0FfQnVzOworCVByb2JlSW5mby0+SU9fQWRkcmVzcyA9IElPX0FkZHJlc3M7CisJUHJvYmVJbmZvLT5QQ0lfRGV2aWNlID0gTlVMTDsKK30KKworCisvKgorICBCdXNMb2dpY19Jbml0aWFsaXplUHJvYmVJbmZvTGlzdElTQSBpbml0aWFsaXplcyB0aGUgbGlzdCBvZiBJL08gQWRkcmVzcyBhbmQKKyAgQnVzIFByb2JlIEluZm9ybWF0aW9uIHRvIGJlIGNoZWNrZWQgZm9yIHBvdGVudGlhbCBCdXNMb2dpYyBTQ1NJIEhvc3QgQWRhcHRlcnMKKyAgb25seSBmcm9tIHRoZSBsaXN0IG9mIHN0YW5kYXJkIEJ1c0xvZ2ljIE11bHRpTWFzdGVyIElTQSBJL08gQWRkcmVzc2VzLgorKi8KKworc3RhdGljIHZvaWQgX19pbml0IEJ1c0xvZ2ljX0luaXRpYWxpemVQcm9iZUluZm9MaXN0SVNBKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlcgorCQkJCQkJICAgICAgICpQcm90b3R5cGVIb3N0QWRhcHRlcikKK3sKKwkvKgorCSAgIElmIEJ1c0xvZ2ljIERyaXZlciBPcHRpb25zIHNwZWNpZmljYXRpb25zIHJlcXVlc3RlZCB0aGF0IElTQSBCdXMgUHJvYmVzCisJICAgYmUgaW5oaWJpdGVkLCBkbyBub3QgcHJvY2VlZCBmdXJ0aGVyLgorCSAqLworCWlmIChCdXNMb2dpY19Qcm9iZU9wdGlvbnMuTm9Qcm9iZUlTQSkKKwkJcmV0dXJuOworCS8qCisJICAgQXBwZW5kIHRoZSBsaXN0IG9mIHN0YW5kYXJkIEJ1c0xvZ2ljIE11bHRpTWFzdGVyIElTQSBJL08gQWRkcmVzc2VzLgorCSAqLworCWlmIChCdXNMb2dpY19Qcm9iZU9wdGlvbnMuTGltaXRlZFByb2JlSVNBID8gQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMzMwIDogY2hlY2tfcmVnaW9uKDB4MzMwLCBCdXNMb2dpY19NdWx0aU1hc3RlckFkZHJlc3NDb3VudCkgPT0gMCkKKwkJQnVzTG9naWNfQXBwZW5kUHJvYmVBZGRyZXNzSVNBKDB4MzMwKTsKKwlpZiAoQnVzTG9naWNfUHJvYmVPcHRpb25zLkxpbWl0ZWRQcm9iZUlTQSA/IEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5Qcm9iZTMzNCA6IGNoZWNrX3JlZ2lvbigweDMzNCwgQnVzTG9naWNfTXVsdGlNYXN0ZXJBZGRyZXNzQ291bnQpID09IDApCisJCUJ1c0xvZ2ljX0FwcGVuZFByb2JlQWRkcmVzc0lTQSgweDMzNCk7CisJaWYgKEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5MaW1pdGVkUHJvYmVJU0EgPyBCdXNMb2dpY19Qcm9iZU9wdGlvbnMuUHJvYmUyMzAgOiBjaGVja19yZWdpb24oMHgyMzAsIEJ1c0xvZ2ljX011bHRpTWFzdGVyQWRkcmVzc0NvdW50KSA9PSAwKQorCQlCdXNMb2dpY19BcHBlbmRQcm9iZUFkZHJlc3NJU0EoMHgyMzApOworCWlmIChCdXNMb2dpY19Qcm9iZU9wdGlvbnMuTGltaXRlZFByb2JlSVNBID8gQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMjM0IDogY2hlY2tfcmVnaW9uKDB4MjM0LCBCdXNMb2dpY19NdWx0aU1hc3RlckFkZHJlc3NDb3VudCkgPT0gMCkKKwkJQnVzTG9naWNfQXBwZW5kUHJvYmVBZGRyZXNzSVNBKDB4MjM0KTsKKwlpZiAoQnVzTG9naWNfUHJvYmVPcHRpb25zLkxpbWl0ZWRQcm9iZUlTQSA/IEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5Qcm9iZTEzMCA6IGNoZWNrX3JlZ2lvbigweDEzMCwgQnVzTG9naWNfTXVsdGlNYXN0ZXJBZGRyZXNzQ291bnQpID09IDApCisJCUJ1c0xvZ2ljX0FwcGVuZFByb2JlQWRkcmVzc0lTQSgweDEzMCk7CisJaWYgKEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5MaW1pdGVkUHJvYmVJU0EgPyBCdXNMb2dpY19Qcm9iZU9wdGlvbnMuUHJvYmUxMzQgOiBjaGVja19yZWdpb24oMHgxMzQsIEJ1c0xvZ2ljX011bHRpTWFzdGVyQWRkcmVzc0NvdW50KSA9PSAwKQorCQlCdXNMb2dpY19BcHBlbmRQcm9iZUFkZHJlc3NJU0EoMHgxMzQpOworfQorCisKKyNpZmRlZiBDT05GSUdfUENJCisKKworLyoKKyAgQnVzTG9naWNfU29ydFByb2JlSW5mbyBzb3J0cyBhIHNlY3Rpb24gb2YgQnVzTG9naWNfUHJvYmVJbmZvTGlzdCBpbiBvcmRlcgorICBvZiBpbmNyZWFzaW5nIFBDSSBCdXMgYW5kIERldmljZSBOdW1iZXIuCisqLworCitzdGF0aWMgdm9pZCBfX2luaXQgQnVzTG9naWNfU29ydFByb2JlSW5mbyhzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvICpQcm9iZUluZm9MaXN0LCBpbnQgUHJvYmVJbmZvQ291bnQpCit7CisJaW50IExhc3RJbnRlcmNoYW5nZSA9IFByb2JlSW5mb0NvdW50IC0gMSwgQm91bmQsIGo7CisJd2hpbGUgKExhc3RJbnRlcmNoYW5nZSA+IDApIHsKKwkJQm91bmQgPSBMYXN0SW50ZXJjaGFuZ2U7CisJCUxhc3RJbnRlcmNoYW5nZSA9IDA7CisJCWZvciAoaiA9IDA7IGogPCBCb3VuZDsgaisrKSB7CisJCQlzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvICpQcm9iZUluZm8xID0gJlByb2JlSW5mb0xpc3Rbal07CisJCQlzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvICpQcm9iZUluZm8yID0gJlByb2JlSW5mb0xpc3RbaiArIDFdOworCQkJaWYgKFByb2JlSW5mbzEtPkJ1cyA+IFByb2JlSW5mbzItPkJ1cyB8fCAoUHJvYmVJbmZvMS0+QnVzID09IFByb2JlSW5mbzItPkJ1cyAmJiAoUHJvYmVJbmZvMS0+RGV2aWNlID4gUHJvYmVJbmZvMi0+RGV2aWNlKSkpIHsKKwkJCQlzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvIFRlbXBQcm9iZUluZm87CisJCQkJbWVtY3B5KCZUZW1wUHJvYmVJbmZvLCBQcm9iZUluZm8xLCBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX1Byb2JlSW5mbykpOworCQkJCW1lbWNweShQcm9iZUluZm8xLCBQcm9iZUluZm8yLCBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX1Byb2JlSW5mbykpOworCQkJCW1lbWNweShQcm9iZUluZm8yLCAmVGVtcFByb2JlSW5mbywgc2l6ZW9mKHN0cnVjdCBCdXNMb2dpY19Qcm9iZUluZm8pKTsKKwkJCQlMYXN0SW50ZXJjaGFuZ2UgPSBqOworCQkJfQorCQl9CisJfQorfQorCisKKy8qCisgIEJ1c0xvZ2ljX0luaXRpYWxpemVNdWx0aU1hc3RlclByb2JlSW5mbyBpbml0aWFsaXplcyB0aGUgbGlzdCBvZiBJL08gQWRkcmVzcworICBhbmQgQnVzIFByb2JlIEluZm9ybWF0aW9uIHRvIGJlIGNoZWNrZWQgZm9yIHBvdGVudGlhbCBCdXNMb2dpYyBNdWx0aU1hc3RlcgorICBTQ1NJIEhvc3QgQWRhcHRlcnMgYnkgaW50ZXJyb2dhdGluZyB0aGUgUENJIENvbmZpZ3VyYXRpb24gU3BhY2Ugb24gUENJCisgIG1hY2hpbmVzIGFzIHdlbGwgYXMgZnJvbSB0aGUgbGlzdCBvZiBzdGFuZGFyZCBCdXNMb2dpYyBNdWx0aU1hc3RlciBJU0EKKyAgSS9PIEFkZHJlc3Nlcy4gIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBQQ0kgTXVsdGlNYXN0ZXIgSG9zdCBBZGFwdGVycyBmb3VuZC4KKyovCisKK3N0YXRpYyBpbnQgX19pbml0IEJ1c0xvZ2ljX0luaXRpYWxpemVNdWx0aU1hc3RlclByb2JlSW5mbyhzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIKKwkJCQkJCQkgICpQcm90b3R5cGVIb3N0QWRhcHRlcikKK3sKKwlzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvICpQcmltYXJ5UHJvYmVJbmZvID0gJkJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3RbQnVzTG9naWNfUHJvYmVJbmZvQ291bnRdOworCWludCBOb25QcmltYXJ5UENJTXVsdGlNYXN0ZXJJbmRleCA9IEJ1c0xvZ2ljX1Byb2JlSW5mb0NvdW50ICsgMTsKKwlpbnQgTm9uUHJpbWFyeVBDSU11bHRpTWFzdGVyQ291bnQgPSAwLCBQQ0lNdWx0aU1hc3RlckNvdW50ID0gMDsKKwlib29sZWFuIEZvcmNlQnVzRGV2aWNlU2Nhbm5pbmdPcmRlciA9IGZhbHNlOworCWJvb2xlYW4gRm9yY2VCdXNEZXZpY2VTY2FubmluZ09yZGVyQ2hlY2tlZCA9IGZhbHNlOworCWJvb2xlYW4gU3RhbmRhcmRBZGRyZXNzU2Vlbls2XTsKKwlzdHJ1Y3QgcGNpX2RldiAqUENJX0RldmljZSA9IE5VTEw7CisJaW50IGk7CisJaWYgKEJ1c0xvZ2ljX1Byb2JlSW5mb0NvdW50ID49IEJ1c0xvZ2ljX01heEhvc3RBZGFwdGVycykKKwkJcmV0dXJuIDA7CisJQnVzTG9naWNfUHJvYmVJbmZvQ291bnQrKzsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlTdGFuZGFyZEFkZHJlc3NTZWVuW2ldID0gZmFsc2U7CisJLyoKKwkgICBJdGVyYXRlIG92ZXIgdGhlIE11bHRpTWFzdGVyIFBDSSBIb3N0IEFkYXB0ZXJzLiAgRm9yIGVhY2ggZW51bWVyYXRlZCBob3N0CisJICAgYWRhcHRlciwgZGV0ZXJtaW5lIHdoZXRoZXIgaXRzIElTQSBDb21wYXRpYmxlIEkvTyBQb3J0IGlzIGVuYWJsZWQgYW5kIGlmCisJICAgc28sIHdoZXRoZXIgaXQgaXMgYXNzaWduZWQgdGhlIFByaW1hcnkgSS9PIEFkZHJlc3MuICBBIGhvc3QgYWRhcHRlciB0aGF0IGlzCisJICAgYXNzaWduZWQgdGhlIFByaW1hcnkgSS9PIEFkZHJlc3Mgd2lsbCBhbHdheXMgYmUgdGhlIHByZWZlcnJlZCBib290IGRldmljZS4KKwkgICBUaGUgTXVsdGlNYXN0ZXIgQklPUyB3aWxsIGZpcnN0IHJlY29nbml6ZSBhIGhvc3QgYWRhcHRlciBhdCB0aGUgUHJpbWFyeSBJL08KKwkgICBBZGRyZXNzLCB0aGVuIGFueSBvdGhlciBQQ0kgaG9zdCBhZGFwdGVycywgYW5kIGZpbmFsbHkgYW55IGhvc3QgYWRhcHRlcnMKKwkgICBsb2NhdGVkIGF0IHRoZSByZW1haW5pbmcgc3RhbmRhcmQgSVNBIEkvTyBBZGRyZXNzZXMuICBXaGVuIGEgUENJIGhvc3QKKwkgICBhZGFwdGVyIGlzIGZvdW5kIHdpdGggaXRzIElTQSBDb21wYXRpYmxlIEkvTyBQb3J0IGVuYWJsZWQsIGEgY29tbWFuZCBpcworCSAgIGlzc3VlZCB0byBkaXNhYmxlIHRoZSBJU0EgQ29tcGF0aWJsZSBJL08gUG9ydCwgYW5kIGl0IGlzIG5vdGVkIHRoYXQgdGhlCisJICAgcGFydGljdWxhciBzdGFuZGFyZCBJU0EgSS9PIEFkZHJlc3MgbmVlZCBub3QgYmUgcHJvYmVkLgorCSAqLworCVByaW1hcnlQcm9iZUluZm8tPklPX0FkZHJlc3MgPSAwOworCXdoaWxlICgoUENJX0RldmljZSA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0JVU0xPR0lDLCBQQ0lfREVWSUNFX0lEX0JVU0xPR0lDX01VTFRJTUFTVEVSLCBQQ0lfRGV2aWNlKSkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyID0gUHJvdG90eXBlSG9zdEFkYXB0ZXI7CisJCXN0cnVjdCBCdXNMb2dpY19QQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uIFBDSUhvc3RBZGFwdGVySW5mb3JtYXRpb247CisJCWVudW0gQnVzTG9naWNfSVNBQ29tcGF0aWJsZUlPUG9ydCBNb2RpZnlJT0FkZHJlc3NSZXF1ZXN0OworCQl1bnNpZ25lZCBjaGFyIEJ1czsKKwkJdW5zaWduZWQgY2hhciBEZXZpY2U7CisJCXVuc2lnbmVkIGludCBJUlFfQ2hhbm5lbDsKKwkJdW5zaWduZWQgbG9uZyBCYXNlQWRkcmVzczA7CisJCXVuc2lnbmVkIGxvbmcgQmFzZUFkZHJlc3MxOworCQl1bnNpZ25lZCBsb25nIElPX0FkZHJlc3M7CisJCXVuc2lnbmVkIGxvbmcgUENJX0FkZHJlc3M7CisKKwkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKFBDSV9EZXZpY2UpKQorCQkJY29udGludWU7CisKKwkJaWYgKHBjaV9zZXRfZG1hX21hc2soUENJX0RldmljZSwgKHU2NCkgMHhmZmZmZmZmZikpCisJCQljb250aW51ZTsKKworCQlCdXMgPSBQQ0lfRGV2aWNlLT5idXMtPm51bWJlcjsKKwkJRGV2aWNlID0gUENJX0RldmljZS0+ZGV2Zm4gPj4gMzsKKwkJSVJRX0NoYW5uZWwgPSBQQ0lfRGV2aWNlLT5pcnE7CisJCUlPX0FkZHJlc3MgPSBCYXNlQWRkcmVzczAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoUENJX0RldmljZSwgMCk7CisJCVBDSV9BZGRyZXNzID0gQmFzZUFkZHJlc3MxID0gcGNpX3Jlc291cmNlX3N0YXJ0KFBDSV9EZXZpY2UsIDEpOworCisJCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MoUENJX0RldmljZSwgMCkgJiBJT1JFU09VUkNFX01FTSkgeworCQkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBCYXNlIEFkZHJlc3MwIDB4JVggbm90IEkvTyBmb3IgIiAiTXVsdGlNYXN0ZXIgSG9zdCBBZGFwdGVyXG4iLCBOVUxMLCBCYXNlQWRkcmVzczApOworCQkJQnVzTG9naWNfRXJyb3IoImF0IFBDSSBCdXMgJWQgRGV2aWNlICVkIEkvTyBBZGRyZXNzIDB4JVhcbiIsIE5VTEwsIEJ1cywgRGV2aWNlLCBJT19BZGRyZXNzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MoUENJX0RldmljZSwgMSkgJiBJT1JFU09VUkNFX0lPKSB7CisJCQlCdXNMb2dpY19FcnJvcigiQnVzTG9naWM6IEJhc2UgQWRkcmVzczEgMHglWCBub3QgTWVtb3J5IGZvciAiICJNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXJcbiIsIE5VTEwsIEJhc2VBZGRyZXNzMSk7CisJCQlCdXNMb2dpY19FcnJvcigiYXQgUENJIEJ1cyAlZCBEZXZpY2UgJWQgUENJIEFkZHJlc3MgMHglWFxuIiwgTlVMTCwgQnVzLCBEZXZpY2UsIFBDSV9BZGRyZXNzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChJUlFfQ2hhbm5lbCA9PSAwKSB7CisJCQlCdXNMb2dpY19FcnJvcigiQnVzTG9naWM6IElSUSBDaGFubmVsICVkIGludmFsaWQgZm9yICIgIk11bHRpTWFzdGVyIEhvc3QgQWRhcHRlclxuIiwgTlVMTCwgSVJRX0NoYW5uZWwpOworCQkJQnVzTG9naWNfRXJyb3IoImF0IFBDSSBCdXMgJWQgRGV2aWNlICVkIEkvTyBBZGRyZXNzIDB4JVhcbiIsIE5VTEwsIEJ1cywgRGV2aWNlLCBJT19BZGRyZXNzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChCdXNMb2dpY19HbG9iYWxPcHRpb25zLlRyYWNlUHJvYmUpIHsKKwkJCUJ1c0xvZ2ljX05vdGljZSgiQnVzTG9naWM6IFBDSSBNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXIgIiAiZGV0ZWN0ZWQgYXRcbiIsIE5VTEwpOworCQkJQnVzTG9naWNfTm90aWNlKCJCdXNMb2dpYzogUENJIEJ1cyAlZCBEZXZpY2UgJWQgSS9PIEFkZHJlc3MgIiAiMHglWCBQQ0kgQWRkcmVzcyAweCVYXG4iLCBOVUxMLCBCdXMsIERldmljZSwgSU9fQWRkcmVzcywgUENJX0FkZHJlc3MpOworCQl9CisJCS8qCisJCSAgIElzc3VlIHRoZSBJbnF1aXJlIFBDSSBIb3N0IEFkYXB0ZXIgSW5mb3JtYXRpb24gY29tbWFuZCB0byBkZXRlcm1pbmUKKwkJICAgdGhlIElTQSBDb21wYXRpYmxlIEkvTyBQb3J0LiAgSWYgdGhlIElTQSBDb21wYXRpYmxlIEkvTyBQb3J0IGlzCisJCSAgIGtub3duIGFuZCBlbmFibGVkLCBub3RlIHRoYXQgdGhlIHBhcnRpY3VsYXIgU3RhbmRhcmQgSVNBIEkvTworCQkgICBBZGRyZXNzIHNob3VsZCBub3QgYmUgcHJvYmVkLgorCQkgKi8KKwkJSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MgPSBJT19BZGRyZXNzOworCQlCdXNMb2dpY19JbnRlcnJ1cHRSZXNldChIb3N0QWRhcHRlcik7CisJCWlmIChCdXNMb2dpY19Db21tYW5kKEhvc3RBZGFwdGVyLCBCdXNMb2dpY19JbnF1aXJlUENJSG9zdEFkYXB0ZXJJbmZvcm1hdGlvbiwgTlVMTCwgMCwgJlBDSUhvc3RBZGFwdGVySW5mb3JtYXRpb24sIHNpemVvZihQQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uKSkKKwkJICAgID09IHNpemVvZihQQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uKSkgeworCQkJaWYgKFBDSUhvc3RBZGFwdGVySW5mb3JtYXRpb24uSVNBQ29tcGF0aWJsZUlPUG9ydCA8IDYpCisJCQkJU3RhbmRhcmRBZGRyZXNzU2VlbltQQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uLklTQUNvbXBhdGlibGVJT1BvcnRdID0gdHJ1ZTsKKwkJfSBlbHNlCisJCQlQQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uLklTQUNvbXBhdGlibGVJT1BvcnQgPSBCdXNMb2dpY19JT19EaXNhYmxlOworCQkvKgorCQkgKiBJc3N1ZSB0aGUgTW9kaWZ5IEkvTyBBZGRyZXNzIGNvbW1hbmQgdG8gZGlzYWJsZSB0aGUgSVNBIENvbXBhdGlibGUKKwkJICogSS9PIFBvcnQuICBPbiBQQ0kgSG9zdCBBZGFwdGVycywgdGhlIE1vZGlmeSBJL08gQWRkcmVzcyBjb21tYW5kCisJCSAqIGFsbG93cyBtb2RpZmljYXRpb24gb2YgdGhlIElTQSBjb21wYXRpYmxlIEkvTyBBZGRyZXNzIHRoYXQgdGhlIEhvc3QKKwkJICogQWRhcHRlciByZXNwb25kcyB0bzsgaXQgZG9lcyBub3QgYWZmZWN0IHRoZSBQQ0kgY29tcGxpYW50IEkvTyBBZGRyZXNzCisJCSAqIGFzc2lnbmVkIGF0IHN5c3RlbSBpbml0aWFsaXphdGlvbi4KKwkJICovCisJCU1vZGlmeUlPQWRkcmVzc1JlcXVlc3QgPSBCdXNMb2dpY19JT19EaXNhYmxlOworCQlCdXNMb2dpY19Db21tYW5kKEhvc3RBZGFwdGVyLCBCdXNMb2dpY19Nb2RpZnlJT0FkZHJlc3MsICZNb2RpZnlJT0FkZHJlc3NSZXF1ZXN0LCBzaXplb2YoTW9kaWZ5SU9BZGRyZXNzUmVxdWVzdCksIE5VTEwsIDApOworCQkvKgorCQkgICBGb3IgdGhlIGZpcnN0IE11bHRpTWFzdGVyIEhvc3QgQWRhcHRlciBlbnVtZXJhdGVkLCBpc3N1ZSB0aGUgRmV0Y2gKKwkJICAgSG9zdCBBZGFwdGVyIExvY2FsIFJBTSBjb21tYW5kIHRvIHJlYWQgYnl0ZSA0NSBvZiB0aGUgQXV0b1NDU0kgYXJlYSwKKwkJICAgZm9yIHRoZSBzZXR0aW5nIG9mIHRoZSAiVXNlIEJ1cyBBbmQgRGV2aWNlICMgRm9yIFBDSSBTY2FubmluZyBTZXEuIgorCQkgICBvcHRpb24uICBJc3N1ZSB0aGUgSW5xdWlyZSBCb2FyZCBJRCBjb21tYW5kIHNpbmNlIHRoaXMgb3B0aW9uIGlzCisJCSAgIG9ubHkgdmFsaWQgZm9yIHRoZSBCVC05NDgvOTU4Lzk1OEQuCisJCSAqLworCQlpZiAoIUZvcmNlQnVzRGV2aWNlU2Nhbm5pbmdPcmRlckNoZWNrZWQpIHsKKwkJCXN0cnVjdCBCdXNMb2dpY19GZXRjaEhvc3RBZGFwdGVyTG9jYWxSQU1SZXF1ZXN0IEZldGNoSG9zdEFkYXB0ZXJMb2NhbFJBTVJlcXVlc3Q7CisJCQlzdHJ1Y3QgQnVzTG9naWNfQXV0b1NDU0lCeXRlNDUgQXV0b1NDU0lCeXRlNDU7CisJCQlzdHJ1Y3QgQnVzTG9naWNfQm9hcmRJRCBCb2FyZElEOworCQkJRmV0Y2hIb3N0QWRhcHRlckxvY2FsUkFNUmVxdWVzdC5CeXRlT2Zmc2V0ID0gQnVzTG9naWNfQXV0b1NDU0lfQmFzZU9mZnNldCArIDQ1OworCQkJRmV0Y2hIb3N0QWRhcHRlckxvY2FsUkFNUmVxdWVzdC5CeXRlQ291bnQgPSBzaXplb2YoQXV0b1NDU0lCeXRlNDUpOworCQkJQnVzTG9naWNfQ29tbWFuZChIb3N0QWRhcHRlciwgQnVzTG9naWNfRmV0Y2hIb3N0QWRhcHRlckxvY2FsUkFNLCAmRmV0Y2hIb3N0QWRhcHRlckxvY2FsUkFNUmVxdWVzdCwgc2l6ZW9mKEZldGNoSG9zdEFkYXB0ZXJMb2NhbFJBTVJlcXVlc3QpLCAmQXV0b1NDU0lCeXRlNDUsIHNpemVvZihBdXRvU0NTSUJ5dGU0NSkpOworCQkJQnVzTG9naWNfQ29tbWFuZChIb3N0QWRhcHRlciwgQnVzTG9naWNfSW5xdWlyZUJvYXJkSUQsIE5VTEwsIDAsICZCb2FyZElELCBzaXplb2YoQm9hcmRJRCkpOworCQkJaWYgKEJvYXJkSUQuRmlybXdhcmVWZXJzaW9uMXN0RGlnaXQgPT0gJzUnKQorCQkJCUZvcmNlQnVzRGV2aWNlU2Nhbm5pbmdPcmRlciA9IEF1dG9TQ1NJQnl0ZTQ1LkZvcmNlQnVzRGV2aWNlU2Nhbm5pbmdPcmRlcjsKKwkJCUZvcmNlQnVzRGV2aWNlU2Nhbm5pbmdPcmRlckNoZWNrZWQgPSB0cnVlOworCQl9CisJCS8qCisJCSAgIERldGVybWluZSB3aGV0aGVyIHRoaXMgTXVsdGlNYXN0ZXIgSG9zdCBBZGFwdGVyIGhhcyBpdHMgSVNBCisJCSAgIENvbXBhdGlibGUgSS9PIFBvcnQgZW5hYmxlZCBhbmQgaXMgYXNzaWduZWQgdGhlIFByaW1hcnkgSS9PIEFkZHJlc3MuCisJCSAgIElmIGl0IGRvZXMsIHRoZW4gaXQgaXMgdGhlIFByaW1hcnkgTXVsdGlNYXN0ZXIgSG9zdCBBZGFwdGVyIGFuZCBtdXN0CisJCSAgIGJlIHJlY29nbml6ZWQgZmlyc3QuICBJZiBpdCBkb2VzIG5vdCwgdGhlbiBpdCBpcyBhZGRlZCB0byB0aGUgbGlzdAorCQkgICBmb3IgcHJvYmluZyBhZnRlciBhbnkgUHJpbWFyeSBNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXIgaXMgcHJvYmVkLgorCQkgKi8KKwkJaWYgKFBDSUhvc3RBZGFwdGVySW5mb3JtYXRpb24uSVNBQ29tcGF0aWJsZUlPUG9ydCA9PSBCdXNMb2dpY19JT18zMzApIHsKKwkJCVByaW1hcnlQcm9iZUluZm8tPkhvc3RBZGFwdGVyVHlwZSA9IEJ1c0xvZ2ljX011bHRpTWFzdGVyOworCQkJUHJpbWFyeVByb2JlSW5mby0+SG9zdEFkYXB0ZXJCdXNUeXBlID0gQnVzTG9naWNfUENJX0J1czsKKwkJCVByaW1hcnlQcm9iZUluZm8tPklPX0FkZHJlc3MgPSBJT19BZGRyZXNzOworCQkJUHJpbWFyeVByb2JlSW5mby0+UENJX0FkZHJlc3MgPSBQQ0lfQWRkcmVzczsKKwkJCVByaW1hcnlQcm9iZUluZm8tPkJ1cyA9IEJ1czsKKwkJCVByaW1hcnlQcm9iZUluZm8tPkRldmljZSA9IERldmljZTsKKwkJCVByaW1hcnlQcm9iZUluZm8tPklSUV9DaGFubmVsID0gSVJRX0NoYW5uZWw7CisJCQlQcmltYXJ5UHJvYmVJbmZvLT5QQ0lfRGV2aWNlID0gUENJX0RldmljZTsKKwkJCVBDSU11bHRpTWFzdGVyQ291bnQrKzsKKwkJfSBlbHNlIGlmIChCdXNMb2dpY19Qcm9iZUluZm9Db3VudCA8IEJ1c0xvZ2ljX01heEhvc3RBZGFwdGVycykgeworCQkJc3RydWN0IEJ1c0xvZ2ljX1Byb2JlSW5mbyAqUHJvYmVJbmZvID0gJkJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3RbQnVzTG9naWNfUHJvYmVJbmZvQ291bnQrK107CisJCQlQcm9iZUluZm8tPkhvc3RBZGFwdGVyVHlwZSA9IEJ1c0xvZ2ljX011bHRpTWFzdGVyOworCQkJUHJvYmVJbmZvLT5Ib3N0QWRhcHRlckJ1c1R5cGUgPSBCdXNMb2dpY19QQ0lfQnVzOworCQkJUHJvYmVJbmZvLT5JT19BZGRyZXNzID0gSU9fQWRkcmVzczsKKwkJCVByb2JlSW5mby0+UENJX0FkZHJlc3MgPSBQQ0lfQWRkcmVzczsKKwkJCVByb2JlSW5mby0+QnVzID0gQnVzOworCQkJUHJvYmVJbmZvLT5EZXZpY2UgPSBEZXZpY2U7CisJCQlQcm9iZUluZm8tPklSUV9DaGFubmVsID0gSVJRX0NoYW5uZWw7CisJCQlQcm9iZUluZm8tPlBDSV9EZXZpY2UgPSBQQ0lfRGV2aWNlOworCQkJTm9uUHJpbWFyeVBDSU11bHRpTWFzdGVyQ291bnQrKzsKKwkJCVBDSU11bHRpTWFzdGVyQ291bnQrKzsKKwkJfSBlbHNlCisJCQlCdXNMb2dpY19XYXJuaW5nKCJCdXNMb2dpYzogVG9vIG1hbnkgSG9zdCBBZGFwdGVycyAiICJkZXRlY3RlZFxuIiwgTlVMTCk7CisJfQorCS8qCisJICAgSWYgdGhlIEF1dG9TQ1NJICJVc2UgQnVzIEFuZCBEZXZpY2UgIyBGb3IgUENJIFNjYW5uaW5nIFNlcS4iIG9wdGlvbiBpcyBPTgorCSAgIGZvciB0aGUgZmlyc3QgZW51bWVyYXRlZCBNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXIsIGFuZCBpZiB0aGF0IGhvc3QgYWRhcHRlcgorCSAgIGlzIGEgQlQtOTQ4Lzk1OC85NThELCB0aGVuIHRoZSBNdWx0aU1hc3RlciBCSU9TIHdpbGwgcmVjb2duaXplIE11bHRpTWFzdGVyCisJICAgSG9zdCBBZGFwdGVycyBpbiB0aGUgb3JkZXIgb2YgaW5jcmVhc2luZyBQQ0kgQnVzIGFuZCBEZXZpY2UgTnVtYmVyLiAgSW4KKwkgICB0aGF0IGNhc2UsIHNvcnQgdGhlIHByb2JlIGluZm9ybWF0aW9uIGludG8gdGhlIHNhbWUgb3JkZXIgdGhlIEJJT1MgdXNlcy4KKwkgICBJZiB0aGlzIG9wdGlvbiBpcyBPRkYsIHRoZW4gdGhlIE11bHRpTWFzdGVyIEJJT1Mgd2lsbCByZWNvZ25pemUgTXVsdGlNYXN0ZXIKKwkgICBIb3N0IEFkYXB0ZXJzIGluIHRoZSBvcmRlciB0aGV5IGFyZSBlbnVtZXJhdGVkIGJ5IHRoZSBQQ0kgQklPUywgYW5kIGhlbmNlCisJICAgbm8gc29ydGluZyBpcyBuZWNlc3NhcnkuCisJICovCisJaWYgKEZvcmNlQnVzRGV2aWNlU2Nhbm5pbmdPcmRlcikKKwkJQnVzTG9naWNfU29ydFByb2JlSW5mbygmQnVzTG9naWNfUHJvYmVJbmZvTGlzdFtOb25QcmltYXJ5UENJTXVsdGlNYXN0ZXJJbmRleF0sIE5vblByaW1hcnlQQ0lNdWx0aU1hc3RlckNvdW50KTsKKwkvKgorCSAgIElmIG5vIFBDSSBNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXIgaXMgYXNzaWduZWQgdGhlIFByaW1hcnkgSS9PIEFkZHJlc3MsCisJICAgdGhlbiB0aGUgUHJpbWFyeSBJL08gQWRkcmVzcyBtdXN0IGJlIHByb2JlZCBleHBsaWNpdGx5IGJlZm9yZSBhbnkgUENJCisJICAgaG9zdCBhZGFwdGVycyBhcmUgcHJvYmVkLgorCSAqLworCWlmICghQnVzTG9naWNfUHJvYmVPcHRpb25zLk5vUHJvYmVJU0EpCisJCWlmIChQcmltYXJ5UHJvYmVJbmZvLT5JT19BZGRyZXNzID09IDAgJiYgKEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5MaW1pdGVkUHJvYmVJU0EgPyBCdXNMb2dpY19Qcm9iZU9wdGlvbnMuUHJvYmUzMzAgOiBjaGVja19yZWdpb24oMHgzMzAsIEJ1c0xvZ2ljX011bHRpTWFzdGVyQWRkcmVzc0NvdW50KSA9PSAwKSkgeworCQkJUHJpbWFyeVByb2JlSW5mby0+SG9zdEFkYXB0ZXJUeXBlID0gQnVzTG9naWNfTXVsdGlNYXN0ZXI7CisJCQlQcmltYXJ5UHJvYmVJbmZvLT5Ib3N0QWRhcHRlckJ1c1R5cGUgPSBCdXNMb2dpY19JU0FfQnVzOworCQkJUHJpbWFyeVByb2JlSW5mby0+SU9fQWRkcmVzcyA9IDB4MzMwOworCQl9CisJLyoKKwkgICBBcHBlbmQgdGhlIGxpc3Qgb2Ygc3RhbmRhcmQgQnVzTG9naWMgTXVsdGlNYXN0ZXIgSVNBIEkvTyBBZGRyZXNzZXMsCisJICAgb21pdHRpbmcgdGhlIFByaW1hcnkgSS9PIEFkZHJlc3Mgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkLgorCSAqLworCWlmICghQnVzTG9naWNfUHJvYmVPcHRpb25zLk5vUHJvYmVJU0EpIHsKKwkJaWYgKCFTdGFuZGFyZEFkZHJlc3NTZWVuWzFdICYmIChCdXNMb2dpY19Qcm9iZU9wdGlvbnMuTGltaXRlZFByb2JlSVNBID8gQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMzM0IDogY2hlY2tfcmVnaW9uKDB4MzM0LCBCdXNMb2dpY19NdWx0aU1hc3RlckFkZHJlc3NDb3VudCkgPT0gMCkpCisJCQlCdXNMb2dpY19BcHBlbmRQcm9iZUFkZHJlc3NJU0EoMHgzMzQpOworCQlpZiAoIVN0YW5kYXJkQWRkcmVzc1NlZW5bMl0gJiYgKEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5MaW1pdGVkUHJvYmVJU0EgPyBCdXNMb2dpY19Qcm9iZU9wdGlvbnMuUHJvYmUyMzAgOiBjaGVja19yZWdpb24oMHgyMzAsIEJ1c0xvZ2ljX011bHRpTWFzdGVyQWRkcmVzc0NvdW50KSA9PSAwKSkKKwkJCUJ1c0xvZ2ljX0FwcGVuZFByb2JlQWRkcmVzc0lTQSgweDIzMCk7CisJCWlmICghU3RhbmRhcmRBZGRyZXNzU2VlblszXSAmJiAoQnVzTG9naWNfUHJvYmVPcHRpb25zLkxpbWl0ZWRQcm9iZUlTQSA/IEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5Qcm9iZTIzNCA6IGNoZWNrX3JlZ2lvbigweDIzNCwgQnVzTG9naWNfTXVsdGlNYXN0ZXJBZGRyZXNzQ291bnQpID09IDApKQorCQkJQnVzTG9naWNfQXBwZW5kUHJvYmVBZGRyZXNzSVNBKDB4MjM0KTsKKwkJaWYgKCFTdGFuZGFyZEFkZHJlc3NTZWVuWzRdICYmIChCdXNMb2dpY19Qcm9iZU9wdGlvbnMuTGltaXRlZFByb2JlSVNBID8gQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMTMwIDogY2hlY2tfcmVnaW9uKDB4MTMwLCBCdXNMb2dpY19NdWx0aU1hc3RlckFkZHJlc3NDb3VudCkgPT0gMCkpCisJCQlCdXNMb2dpY19BcHBlbmRQcm9iZUFkZHJlc3NJU0EoMHgxMzApOworCQlpZiAoIVN0YW5kYXJkQWRkcmVzc1NlZW5bNV0gJiYgKEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5MaW1pdGVkUHJvYmVJU0EgPyBCdXNMb2dpY19Qcm9iZU9wdGlvbnMuUHJvYmUxMzQgOiBjaGVja19yZWdpb24oMHgxMzQsIEJ1c0xvZ2ljX011bHRpTWFzdGVyQWRkcmVzc0NvdW50KSA9PSAwKSkKKwkJCUJ1c0xvZ2ljX0FwcGVuZFByb2JlQWRkcmVzc0lTQSgweDEzNCk7CisJfQorCS8qCisJICAgSXRlcmF0ZSBvdmVyIHRoZSBvbGRlciBub24tY29tcGxpYW50IE11bHRpTWFzdGVyIFBDSSBIb3N0IEFkYXB0ZXJzLAorCSAgIG5vdGluZyB0aGUgUENJIGJ1cyBsb2NhdGlvbiBhbmQgYXNzaWduZWQgSVJRIENoYW5uZWwuCisJICovCisJUENJX0RldmljZSA9IE5VTEw7CisJd2hpbGUgKChQQ0lfRGV2aWNlID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQlVTTE9HSUMsIFBDSV9ERVZJQ0VfSURfQlVTTE9HSUNfTVVMVElNQVNURVJfTkMsIFBDSV9EZXZpY2UpKSAhPSBOVUxMKSB7CisJCXVuc2lnbmVkIGNoYXIgQnVzOworCQl1bnNpZ25lZCBjaGFyIERldmljZTsKKwkJdW5zaWduZWQgaW50IElSUV9DaGFubmVsOworCQl1bnNpZ25lZCBsb25nIElPX0FkZHJlc3M7CisKKwkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKFBDSV9EZXZpY2UpKQorCQkJY29udGludWU7CisKKwkJaWYgKHBjaV9zZXRfZG1hX21hc2soUENJX0RldmljZSwgKHU2NCkgMHhmZmZmZmZmZikpCisJCQljb250aW51ZTsKKworCQlCdXMgPSBQQ0lfRGV2aWNlLT5idXMtPm51bWJlcjsKKwkJRGV2aWNlID0gUENJX0RldmljZS0+ZGV2Zm4gPj4gMzsKKwkJSVJRX0NoYW5uZWwgPSBQQ0lfRGV2aWNlLT5pcnE7CisJCUlPX0FkZHJlc3MgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoUENJX0RldmljZSwgMCk7CisKKwkJaWYgKElPX0FkZHJlc3MgPT0gMCB8fCBJUlFfQ2hhbm5lbCA9PSAwKQorCQkJY29udGludWU7CisJCWZvciAoaSA9IDA7IGkgPCBCdXNMb2dpY19Qcm9iZUluZm9Db3VudDsgaSsrKSB7CisJCQlzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvICpQcm9iZUluZm8gPSAmQnVzTG9naWNfUHJvYmVJbmZvTGlzdFtpXTsKKwkJCWlmIChQcm9iZUluZm8tPklPX0FkZHJlc3MgPT0gSU9fQWRkcmVzcyAmJiBQcm9iZUluZm8tPkhvc3RBZGFwdGVyVHlwZSA9PSBCdXNMb2dpY19NdWx0aU1hc3RlcikgeworCQkJCVByb2JlSW5mby0+SG9zdEFkYXB0ZXJCdXNUeXBlID0gQnVzTG9naWNfUENJX0J1czsKKwkJCQlQcm9iZUluZm8tPlBDSV9BZGRyZXNzID0gMDsKKwkJCQlQcm9iZUluZm8tPkJ1cyA9IEJ1czsKKwkJCQlQcm9iZUluZm8tPkRldmljZSA9IERldmljZTsKKwkJCQlQcm9iZUluZm8tPklSUV9DaGFubmVsID0gSVJRX0NoYW5uZWw7CisJCQkJUHJvYmVJbmZvLT5QQ0lfRGV2aWNlID0gUENJX0RldmljZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gUENJTXVsdGlNYXN0ZXJDb3VudDsKK30KKworCisvKgorICBCdXNMb2dpY19Jbml0aWFsaXplRmxhc2hQb2ludFByb2JlSW5mbyBpbml0aWFsaXplcyB0aGUgbGlzdCBvZiBJL08gQWRkcmVzcworICBhbmQgQnVzIFByb2JlIEluZm9ybWF0aW9uIHRvIGJlIGNoZWNrZWQgZm9yIHBvdGVudGlhbCBCdXNMb2dpYyBGbGFzaFBvaW50CisgIEhvc3QgQWRhcHRlcnMgYnkgaW50ZXJyb2dhdGluZyB0aGUgUENJIENvbmZpZ3VyYXRpb24gU3BhY2UuICBJdCByZXR1cm5zIHRoZQorICBudW1iZXIgb2YgRmxhc2hQb2ludCBIb3N0IEFkYXB0ZXJzIGZvdW5kLgorKi8KKworc3RhdGljIGludCBfX2luaXQgQnVzTG9naWNfSW5pdGlhbGl6ZUZsYXNoUG9pbnRQcm9iZUluZm8oc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyCisJCQkJCQkJICpQcm90b3R5cGVIb3N0QWRhcHRlcikKK3sKKwlpbnQgRmxhc2hQb2ludEluZGV4ID0gQnVzTG9naWNfUHJvYmVJbmZvQ291bnQsIEZsYXNoUG9pbnRDb3VudCA9IDA7CisJc3RydWN0IHBjaV9kZXYgKlBDSV9EZXZpY2UgPSBOVUxMOworCS8qCisJICAgSW50ZXJyb2dhdGUgUENJIENvbmZpZ3VyYXRpb24gU3BhY2UgZm9yIGFueSBGbGFzaFBvaW50IEhvc3QgQWRhcHRlcnMuCisJICovCisJd2hpbGUgKChQQ0lfRGV2aWNlID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQlVTTE9HSUMsIFBDSV9ERVZJQ0VfSURfQlVTTE9HSUNfRkxBU0hQT0lOVCwgUENJX0RldmljZSkpICE9IE5VTEwpIHsKKwkJdW5zaWduZWQgY2hhciBCdXM7CisJCXVuc2lnbmVkIGNoYXIgRGV2aWNlOworCQl1bnNpZ25lZCBpbnQgSVJRX0NoYW5uZWw7CisJCXVuc2lnbmVkIGxvbmcgQmFzZUFkZHJlc3MwOworCQl1bnNpZ25lZCBsb25nIEJhc2VBZGRyZXNzMTsKKwkJdW5zaWduZWQgbG9uZyBJT19BZGRyZXNzOworCQl1bnNpZ25lZCBsb25nIFBDSV9BZGRyZXNzOworCisJCWlmIChwY2lfZW5hYmxlX2RldmljZShQQ0lfRGV2aWNlKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwY2lfc2V0X2RtYV9tYXNrKFBDSV9EZXZpY2UsICh1NjQpIDB4ZmZmZmZmZmYpKQorCQkJY29udGludWU7CisKKwkJQnVzID0gUENJX0RldmljZS0+YnVzLT5udW1iZXI7CisJCURldmljZSA9IFBDSV9EZXZpY2UtPmRldmZuID4+IDM7CisJCUlSUV9DaGFubmVsID0gUENJX0RldmljZS0+aXJxOworCQlJT19BZGRyZXNzID0gQmFzZUFkZHJlc3MwID0gcGNpX3Jlc291cmNlX3N0YXJ0KFBDSV9EZXZpY2UsIDApOworCQlQQ0lfQWRkcmVzcyA9IEJhc2VBZGRyZXNzMSA9IHBjaV9yZXNvdXJjZV9zdGFydChQQ0lfRGV2aWNlLCAxKTsKKyNpZm5kZWYgQ09ORklHX1NDU0lfT01JVF9GTEFTSFBPSU5UCisJCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MoUENJX0RldmljZSwgMCkgJiBJT1JFU09VUkNFX01FTSkgeworCQkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBCYXNlIEFkZHJlc3MwIDB4JVggbm90IEkvTyBmb3IgIiAiRmxhc2hQb2ludCBIb3N0IEFkYXB0ZXJcbiIsIE5VTEwsIEJhc2VBZGRyZXNzMCk7CisJCQlCdXNMb2dpY19FcnJvcigiYXQgUENJIEJ1cyAlZCBEZXZpY2UgJWQgSS9PIEFkZHJlc3MgMHglWFxuIiwgTlVMTCwgQnVzLCBEZXZpY2UsIElPX0FkZHJlc3MpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhQQ0lfRGV2aWNlLCAxKSAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJCUJ1c0xvZ2ljX0Vycm9yKCJCdXNMb2dpYzogQmFzZSBBZGRyZXNzMSAweCVYIG5vdCBNZW1vcnkgZm9yICIgIkZsYXNoUG9pbnQgSG9zdCBBZGFwdGVyXG4iLCBOVUxMLCBCYXNlQWRkcmVzczEpOworCQkJQnVzTG9naWNfRXJyb3IoImF0IFBDSSBCdXMgJWQgRGV2aWNlICVkIFBDSSBBZGRyZXNzIDB4JVhcbiIsIE5VTEwsIEJ1cywgRGV2aWNlLCBQQ0lfQWRkcmVzcyk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoSVJRX0NoYW5uZWwgPT0gMCkgeworCQkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBJUlEgQ2hhbm5lbCAlZCBpbnZhbGlkIGZvciAiICJGbGFzaFBvaW50IEhvc3QgQWRhcHRlclxuIiwgTlVMTCwgSVJRX0NoYW5uZWwpOworCQkJQnVzTG9naWNfRXJyb3IoImF0IFBDSSBCdXMgJWQgRGV2aWNlICVkIEkvTyBBZGRyZXNzIDB4JVhcbiIsIE5VTEwsIEJ1cywgRGV2aWNlLCBJT19BZGRyZXNzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChCdXNMb2dpY19HbG9iYWxPcHRpb25zLlRyYWNlUHJvYmUpIHsKKwkJCUJ1c0xvZ2ljX05vdGljZSgiQnVzTG9naWM6IEZsYXNoUG9pbnQgSG9zdCBBZGFwdGVyICIgImRldGVjdGVkIGF0XG4iLCBOVUxMKTsKKwkJCUJ1c0xvZ2ljX05vdGljZSgiQnVzTG9naWM6IFBDSSBCdXMgJWQgRGV2aWNlICVkIEkvTyBBZGRyZXNzICIgIjB4JVggUENJIEFkZHJlc3MgMHglWFxuIiwgTlVMTCwgQnVzLCBEZXZpY2UsIElPX0FkZHJlc3MsIFBDSV9BZGRyZXNzKTsKKwkJfQorCQlpZiAoQnVzTG9naWNfUHJvYmVJbmZvQ291bnQgPCBCdXNMb2dpY19NYXhIb3N0QWRhcHRlcnMpIHsKKwkJCXN0cnVjdCBCdXNMb2dpY19Qcm9iZUluZm8gKlByb2JlSW5mbyA9ICZCdXNMb2dpY19Qcm9iZUluZm9MaXN0W0J1c0xvZ2ljX1Byb2JlSW5mb0NvdW50KytdOworCQkJUHJvYmVJbmZvLT5Ib3N0QWRhcHRlclR5cGUgPSBCdXNMb2dpY19GbGFzaFBvaW50OworCQkJUHJvYmVJbmZvLT5Ib3N0QWRhcHRlckJ1c1R5cGUgPSBCdXNMb2dpY19QQ0lfQnVzOworCQkJUHJvYmVJbmZvLT5JT19BZGRyZXNzID0gSU9fQWRkcmVzczsKKwkJCVByb2JlSW5mby0+UENJX0FkZHJlc3MgPSBQQ0lfQWRkcmVzczsKKwkJCVByb2JlSW5mby0+QnVzID0gQnVzOworCQkJUHJvYmVJbmZvLT5EZXZpY2UgPSBEZXZpY2U7CisJCQlQcm9iZUluZm8tPklSUV9DaGFubmVsID0gSVJRX0NoYW5uZWw7CisJCQlQcm9iZUluZm8tPlBDSV9EZXZpY2UgPSBQQ0lfRGV2aWNlOworCQkJRmxhc2hQb2ludENvdW50Kys7CisJCX0gZWxzZQorCQkJQnVzTG9naWNfV2FybmluZygiQnVzTG9naWM6IFRvbyBtYW55IEhvc3QgQWRhcHRlcnMgIiAiZGV0ZWN0ZWRcbiIsIE5VTEwpOworI2Vsc2UKKwkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBGbGFzaFBvaW50IEhvc3QgQWRhcHRlciBkZXRlY3RlZCBhdCAiICJQQ0kgQnVzICVkIERldmljZSAlZFxuIiwgTlVMTCwgQnVzLCBEZXZpY2UpOworCQlCdXNMb2dpY19FcnJvcigiQnVzTG9naWM6IEkvTyBBZGRyZXNzIDB4JVggUENJIEFkZHJlc3MgMHglWCwgaXJxICVkLCAiICJidXQgRmxhc2hQb2ludFxuIiwgTlVMTCwgSU9fQWRkcmVzcywgUENJX0FkZHJlc3MsIElSUV9DaGFubmVsKTsKKwkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBzdXBwb3J0IHdhcyBvbWl0dGVkIGluIHRoaXMga2VybmVsICIgImNvbmZpZ3VyYXRpb24uXG4iLCBOVUxMKTsKKyNlbmRpZgorCX0KKwkvKgorCSAgIFRoZSBGbGFzaFBvaW50IEJJT1Mgd2lsbCBzY2FuIGZvciBGbGFzaFBvaW50IEhvc3QgQWRhcHRlcnMgaW4gdGhlIG9yZGVyIG9mCisJICAgaW5jcmVhc2luZyBQQ0kgQnVzIGFuZCBEZXZpY2UgTnVtYmVyLCBzbyBzb3J0IHRoZSBwcm9iZSBpbmZvcm1hdGlvbiBpbnRvCisJICAgdGhlIHNhbWUgb3JkZXIgdGhlIEJJT1MgdXNlcy4KKwkgKi8KKwlCdXNMb2dpY19Tb3J0UHJvYmVJbmZvKCZCdXNMb2dpY19Qcm9iZUluZm9MaXN0W0ZsYXNoUG9pbnRJbmRleF0sIEZsYXNoUG9pbnRDb3VudCk7CisJcmV0dXJuIEZsYXNoUG9pbnRDb3VudDsKK30KKworCisvKgorICBCdXNMb2dpY19Jbml0aWFsaXplUHJvYmVJbmZvTGlzdCBpbml0aWFsaXplcyB0aGUgbGlzdCBvZiBJL08gQWRkcmVzcyBhbmQgQnVzCisgIFByb2JlIEluZm9ybWF0aW9uIHRvIGJlIGNoZWNrZWQgZm9yIHBvdGVudGlhbCBCdXNMb2dpYyBTQ1NJIEhvc3QgQWRhcHRlcnMgYnkKKyAgaW50ZXJyb2dhdGluZyB0aGUgUENJIENvbmZpZ3VyYXRpb24gU3BhY2Ugb24gUENJIG1hY2hpbmVzIGFzIHdlbGwgYXMgZnJvbSB0aGUKKyAgbGlzdCBvZiBzdGFuZGFyZCBCdXNMb2dpYyBNdWx0aU1hc3RlciBJU0EgSS9PIEFkZHJlc3Nlcy4gIEJ5IGRlZmF1bHQsIGlmIGJvdGgKKyAgRmxhc2hQb2ludCBhbmQgUENJIE11bHRpTWFzdGVyIEhvc3QgQWRhcHRlcnMgYXJlIHByZXNlbnQsIHRoaXMgZHJpdmVyIHdpbGwKKyAgcHJvYmUgZm9yIEZsYXNoUG9pbnQgSG9zdCBBZGFwdGVycyBmaXJzdCB1bmxlc3MgdGhlIEJJT1MgcHJpbWFyeSBkaXNrIGlzCisgIGNvbnRyb2xsZWQgYnkgdGhlIGZpcnN0IFBDSSBNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXIsIGluIHdoaWNoIGNhc2UKKyAgTXVsdGlNYXN0ZXIgSG9zdCBBZGFwdGVycyB3aWxsIGJlIHByb2JlZCBmaXJzdC4gIFRoZSBCdXNMb2dpYyBEcml2ZXIgT3B0aW9ucworICBzcGVjaWZpY2F0aW9ucyAiTXVsdGlNYXN0ZXJGaXJzdCIgYW5kICJGbGFzaFBvaW50Rmlyc3QiIGNhbiBiZSB1c2VkIHRvIGZvcmNlCisgIGEgcGFydGljdWxhciBwcm9iZSBvcmRlci4KKyovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBCdXNMb2dpY19Jbml0aWFsaXplUHJvYmVJbmZvTGlzdChzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIKKwkJCQkJCSAgICAqUHJvdG90eXBlSG9zdEFkYXB0ZXIpCit7CisJLyoKKwkgICBJZiBhIFBDSSBCSU9TIGlzIHByZXNlbnQsIGludGVycm9nYXRlIGl0IGZvciBNdWx0aU1hc3RlciBhbmQgRmxhc2hQb2ludAorCSAgIEhvc3QgQWRhcHRlcnM7IG90aGVyd2lzZSwgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgSVNBIE11bHRpTWFzdGVyIHByb2JlLgorCSAqLworCWlmICghQnVzTG9naWNfUHJvYmVPcHRpb25zLk5vUHJvYmVQQ0kpIHsKKwkJaWYgKEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5NdWx0aU1hc3RlckZpcnN0KSB7CisJCQlCdXNMb2dpY19Jbml0aWFsaXplTXVsdGlNYXN0ZXJQcm9iZUluZm8oUHJvdG90eXBlSG9zdEFkYXB0ZXIpOworCQkJQnVzTG9naWNfSW5pdGlhbGl6ZUZsYXNoUG9pbnRQcm9iZUluZm8oUHJvdG90eXBlSG9zdEFkYXB0ZXIpOworCQl9IGVsc2UgaWYgKEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5GbGFzaFBvaW50Rmlyc3QpIHsKKwkJCUJ1c0xvZ2ljX0luaXRpYWxpemVGbGFzaFBvaW50UHJvYmVJbmZvKFByb3RvdHlwZUhvc3RBZGFwdGVyKTsKKwkJCUJ1c0xvZ2ljX0luaXRpYWxpemVNdWx0aU1hc3RlclByb2JlSW5mbyhQcm90b3R5cGVIb3N0QWRhcHRlcik7CisJCX0gZWxzZSB7CisJCQlpbnQgRmxhc2hQb2ludENvdW50ID0gQnVzTG9naWNfSW5pdGlhbGl6ZUZsYXNoUG9pbnRQcm9iZUluZm8oUHJvdG90eXBlSG9zdEFkYXB0ZXIpOworCQkJaW50IFBDSU11bHRpTWFzdGVyQ291bnQgPSBCdXNMb2dpY19Jbml0aWFsaXplTXVsdGlNYXN0ZXJQcm9iZUluZm8oUHJvdG90eXBlSG9zdEFkYXB0ZXIpOworCQkJaWYgKEZsYXNoUG9pbnRDb3VudCA+IDAgJiYgUENJTXVsdGlNYXN0ZXJDb3VudCA+IDApIHsKKwkJCQlzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvICpQcm9iZUluZm8gPSAmQnVzTG9naWNfUHJvYmVJbmZvTGlzdFtGbGFzaFBvaW50Q291bnRdOworCQkJCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSBQcm90b3R5cGVIb3N0QWRhcHRlcjsKKwkJCQlzdHJ1Y3QgQnVzTG9naWNfRmV0Y2hIb3N0QWRhcHRlckxvY2FsUkFNUmVxdWVzdCBGZXRjaEhvc3RBZGFwdGVyTG9jYWxSQU1SZXF1ZXN0OworCQkJCXN0cnVjdCBCdXNMb2dpY19CSU9TRHJpdmVNYXBCeXRlIERyaXZlME1hcEJ5dGU7CisJCQkJd2hpbGUgKFByb2JlSW5mby0+SG9zdEFkYXB0ZXJCdXNUeXBlICE9IEJ1c0xvZ2ljX1BDSV9CdXMpCisJCQkJCVByb2JlSW5mbysrOworCQkJCUhvc3RBZGFwdGVyLT5JT19BZGRyZXNzID0gUHJvYmVJbmZvLT5JT19BZGRyZXNzOworCQkJCUZldGNoSG9zdEFkYXB0ZXJMb2NhbFJBTVJlcXVlc3QuQnl0ZU9mZnNldCA9IEJ1c0xvZ2ljX0JJT1NfQmFzZU9mZnNldCArIEJ1c0xvZ2ljX0JJT1NfRHJpdmVNYXBPZmZzZXQgKyAwOworCQkJCUZldGNoSG9zdEFkYXB0ZXJMb2NhbFJBTVJlcXVlc3QuQnl0ZUNvdW50ID0gc2l6ZW9mKERyaXZlME1hcEJ5dGUpOworCQkJCUJ1c0xvZ2ljX0NvbW1hbmQoSG9zdEFkYXB0ZXIsIEJ1c0xvZ2ljX0ZldGNoSG9zdEFkYXB0ZXJMb2NhbFJBTSwgJkZldGNoSG9zdEFkYXB0ZXJMb2NhbFJBTVJlcXVlc3QsIHNpemVvZihGZXRjaEhvc3RBZGFwdGVyTG9jYWxSQU1SZXF1ZXN0KSwgJkRyaXZlME1hcEJ5dGUsIHNpemVvZihEcml2ZTBNYXBCeXRlKSk7CisJCQkJLyoKKwkJCQkgICBJZiB0aGUgTWFwIEJ5dGUgZm9yIEJJT1MgRHJpdmUgMCBpbmRpY2F0ZXMgdGhhdCBCSU9TIERyaXZlIDAKKwkJCQkgICBpcyBjb250cm9sbGVkIGJ5IHRoaXMgUENJIE11bHRpTWFzdGVyIEhvc3QgQWRhcHRlciwgdGhlbgorCQkJCSAgIHJldmVyc2UgdGhlIHByb2JlIG9yZGVyIHNvIHRoYXQgTXVsdGlNYXN0ZXIgSG9zdCBBZGFwdGVycyBhcmUKKwkJCQkgICBwcm9iZWQgYmVmb3JlIEZsYXNoUG9pbnQgSG9zdCBBZGFwdGVycy4KKwkJCQkgKi8KKwkJCQlpZiAoRHJpdmUwTWFwQnl0ZS5EaXNrR2VvbWV0cnkgIT0gQnVzTG9naWNfQklPU19EaXNrX05vdF9JbnN0YWxsZWQpIHsKKwkJCQkJc3RydWN0IEJ1c0xvZ2ljX1Byb2JlSW5mbyBTYXZlZFByb2JlSW5mb1tCdXNMb2dpY19NYXhIb3N0QWRhcHRlcnNdOworCQkJCQlpbnQgTXVsdGlNYXN0ZXJDb3VudCA9IEJ1c0xvZ2ljX1Byb2JlSW5mb0NvdW50IC0gRmxhc2hQb2ludENvdW50OworCQkJCQltZW1jcHkoU2F2ZWRQcm9iZUluZm8sIEJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3QsIEJ1c0xvZ2ljX1Byb2JlSW5mb0NvdW50ICogc2l6ZW9mKHN0cnVjdCBCdXNMb2dpY19Qcm9iZUluZm8pKTsKKwkJCQkJbWVtY3B5KCZCdXNMb2dpY19Qcm9iZUluZm9MaXN0WzBdLCAmU2F2ZWRQcm9iZUluZm9bRmxhc2hQb2ludENvdW50XSwgTXVsdGlNYXN0ZXJDb3VudCAqIHNpemVvZihzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvKSk7CisJCQkJCW1lbWNweSgmQnVzTG9naWNfUHJvYmVJbmZvTGlzdFtNdWx0aU1hc3RlckNvdW50XSwgJlNhdmVkUHJvYmVJbmZvWzBdLCBGbGFzaFBvaW50Q291bnQgKiBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX1Byb2JlSW5mbykpOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZQorCQlCdXNMb2dpY19Jbml0aWFsaXplUHJvYmVJbmZvTGlzdElTQShQcm90b3R5cGVIb3N0QWRhcHRlcik7Cit9CisKKworI2VuZGlmCQkJCS8qIENPTkZJR19QQ0kgKi8KKworCisvKgorICBCdXNMb2dpY19GYWlsdXJlIHByaW50cyBhIHN0YW5kYXJkaXplZCBlcnJvciBtZXNzYWdlLCBhbmQgdGhlbiByZXR1cm5zIGZhbHNlLgorKi8KKworc3RhdGljIGJvb2xlYW4gQnVzTG9naWNfRmFpbHVyZShzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyLCBjaGFyICpFcnJvck1lc3NhZ2UpCit7CisJQnVzTG9naWNfQW5ub3VuY2VEcml2ZXIoSG9zdEFkYXB0ZXIpOworCWlmIChIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJCdXNUeXBlID09IEJ1c0xvZ2ljX1BDSV9CdXMpIHsKKwkJQnVzTG9naWNfRXJyb3IoIldoaWxlIGNvbmZpZ3VyaW5nIEJ1c0xvZ2ljIFBDSSBIb3N0IEFkYXB0ZXIgYXRcbiIsIEhvc3RBZGFwdGVyKTsKKwkJQnVzTG9naWNfRXJyb3IoIkJ1cyAlZCBEZXZpY2UgJWQgSS9PIEFkZHJlc3MgMHglWCBQQ0kgQWRkcmVzcyAweCVYOlxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5CdXMsIEhvc3RBZGFwdGVyLT5EZXZpY2UsIEhvc3RBZGFwdGVyLT5JT19BZGRyZXNzLCBIb3N0QWRhcHRlci0+UENJX0FkZHJlc3MpOworCX0gZWxzZQorCQlCdXNMb2dpY19FcnJvcigiV2hpbGUgY29uZmlndXJpbmcgQnVzTG9naWMgSG9zdCBBZGFwdGVyIGF0ICIgIkkvTyBBZGRyZXNzIDB4JVg6XG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MpOworCUJ1c0xvZ2ljX0Vycm9yKCIlcyBGQUlMRUQgLSBERVRBQ0hJTkdcbiIsIEhvc3RBZGFwdGVyLCBFcnJvck1lc3NhZ2UpOworCWlmIChCdXNMb2dpY19Db21tYW5kRmFpbHVyZVJlYXNvbiAhPSBOVUxMKQorCQlCdXNMb2dpY19FcnJvcigiQURESVRJT05BTCBGQUlMVVJFIElORk8gLSAlc1xuIiwgSG9zdEFkYXB0ZXIsIEJ1c0xvZ2ljX0NvbW1hbmRGYWlsdXJlUmVhc29uKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKworLyoKKyAgQnVzTG9naWNfUHJvYmVIb3N0QWRhcHRlciBwcm9iZXMgZm9yIGEgQnVzTG9naWMgSG9zdCBBZGFwdGVyLgorKi8KKworc3RhdGljIGJvb2xlYW4gX19pbml0IEJ1c0xvZ2ljX1Byb2JlSG9zdEFkYXB0ZXIoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlcikKK3sKKwl1bmlvbiBCdXNMb2dpY19TdGF0dXNSZWdpc3RlciBTdGF0dXNSZWdpc3RlcjsKKwl1bmlvbiBCdXNMb2dpY19JbnRlcnJ1cHRSZWdpc3RlciBJbnRlcnJ1cHRSZWdpc3RlcjsKKwl1bmlvbiBCdXNMb2dpY19HZW9tZXRyeVJlZ2lzdGVyIEdlb21ldHJ5UmVnaXN0ZXI7CisJLyoKKwkgICBGbGFzaFBvaW50IEhvc3QgQWRhcHRlcnMgYXJlIFByb2JlZCBieSB0aGUgRmxhc2hQb2ludCBTQ0NCIE1hbmFnZXIuCisJICovCisJaWYgKEJ1c0xvZ2ljX0ZsYXNoUG9pbnRIb3N0QWRhcHRlclAoSG9zdEFkYXB0ZXIpKSB7CisJCXN0cnVjdCBGbGFzaFBvaW50X0luZm8gKkZsYXNoUG9pbnRJbmZvID0gJkhvc3RBZGFwdGVyLT5GbGFzaFBvaW50SW5mbzsKKwkJRmxhc2hQb2ludEluZm8tPkJhc2VBZGRyZXNzID0gKHUzMikgSG9zdEFkYXB0ZXItPklPX0FkZHJlc3M7CisJCUZsYXNoUG9pbnRJbmZvLT5JUlFfQ2hhbm5lbCA9IEhvc3RBZGFwdGVyLT5JUlFfQ2hhbm5lbDsKKwkJRmxhc2hQb2ludEluZm8tPlByZXNlbnQgPSBmYWxzZTsKKwkJaWYgKCEoRmxhc2hQb2ludF9Qcm9iZUhvc3RBZGFwdGVyKEZsYXNoUG9pbnRJbmZvKSA9PSAwICYmIEZsYXNoUG9pbnRJbmZvLT5QcmVzZW50KSkgeworCQkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBGbGFzaFBvaW50IEhvc3QgQWRhcHRlciBkZXRlY3RlZCBhdCAiICJQQ0kgQnVzICVkIERldmljZSAlZFxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5CdXMsIEhvc3RBZGFwdGVyLT5EZXZpY2UpOworCQkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBJL08gQWRkcmVzcyAweCVYIFBDSSBBZGRyZXNzIDB4JVgsICIgImJ1dCBGbGFzaFBvaW50XG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MsIEhvc3RBZGFwdGVyLT5QQ0lfQWRkcmVzcyk7CisJCQlCdXNMb2dpY19FcnJvcigiQnVzTG9naWM6IFByb2JlIEZ1bmN0aW9uIGZhaWxlZCB0byB2YWxpZGF0ZSBpdC5cbiIsIEhvc3RBZGFwdGVyKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoQnVzTG9naWNfR2xvYmFsT3B0aW9ucy5UcmFjZVByb2JlKQorCQkJQnVzTG9naWNfTm90aWNlKCJCdXNMb2dpY19Qcm9iZSgweCVYKTogRmxhc2hQb2ludCBGb3VuZFxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5JT19BZGRyZXNzKTsKKwkJLyoKKwkJICAgSW5kaWNhdGUgdGhlIEhvc3QgQWRhcHRlciBQcm9iZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorCQkgKi8KKwkJcmV0dXJuIHRydWU7CisJfQorCS8qCisJICAgUmVhZCB0aGUgU3RhdHVzLCBJbnRlcnJ1cHQsIGFuZCBHZW9tZXRyeSBSZWdpc3RlcnMgdG8gdGVzdCBpZiB0aGVyZSBhcmUgSS9PCisJICAgcG9ydHMgdGhhdCByZXNwb25kLCBhbmQgdG8gY2hlY2sgdGhlIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZnJvbSBhCisJICAgQnVzTG9naWMgSG9zdCBBZGFwdGVyLiAgQSBub25leGlzdGVudCBJL08gcG9ydCB3aWxsIHJldHVybiAweEZGLCBpbiB3aGljaAorCSAgIGNhc2UgdGhlcmUgaXMgZGVmaW5pdGVseSBubyBCdXNMb2dpYyBIb3N0IEFkYXB0ZXIgYXQgdGhpcyBiYXNlIEkvTyBBZGRyZXNzLgorCSAgIFRoZSB0ZXN0IGhlcmUgaXMgYSBzdWJzZXQgb2YgdGhhdCB1c2VkIGJ5IHRoZSBCdXNMb2dpYyBIb3N0IEFkYXB0ZXIgQklPUy4KKwkgKi8KKwlTdGF0dXNSZWdpc3Rlci5BbGwgPSBCdXNMb2dpY19SZWFkU3RhdHVzUmVnaXN0ZXIoSG9zdEFkYXB0ZXIpOworCUludGVycnVwdFJlZ2lzdGVyLkFsbCA9IEJ1c0xvZ2ljX1JlYWRJbnRlcnJ1cHRSZWdpc3RlcihIb3N0QWRhcHRlcik7CisJR2VvbWV0cnlSZWdpc3Rlci5BbGwgPSBCdXNMb2dpY19SZWFkR2VvbWV0cnlSZWdpc3RlcihIb3N0QWRhcHRlcik7CisJaWYgKEJ1c0xvZ2ljX0dsb2JhbE9wdGlvbnMuVHJhY2VQcm9iZSkKKwkJQnVzTG9naWNfTm90aWNlKCJCdXNMb2dpY19Qcm9iZSgweCVYKTogU3RhdHVzIDB4JTAyWCwgSW50ZXJydXB0IDB4JTAyWCwgIiAiR2VvbWV0cnkgMHglMDJYXG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MsIFN0YXR1c1JlZ2lzdGVyLkFsbCwgSW50ZXJydXB0UmVnaXN0ZXIuQWxsLCBHZW9tZXRyeVJlZ2lzdGVyLkFsbCk7CisJaWYgKFN0YXR1c1JlZ2lzdGVyLkFsbCA9PSAwIHx8IFN0YXR1c1JlZ2lzdGVyLnNyLkRpYWdub3N0aWNBY3RpdmUgfHwgU3RhdHVzUmVnaXN0ZXIuc3IuQ29tbWFuZFBhcmFtZXRlclJlZ2lzdGVyQnVzeSB8fCBTdGF0dXNSZWdpc3Rlci5zci5SZXNlcnZlZCB8fCBTdGF0dXNSZWdpc3Rlci5zci5Db21tYW5kSW52YWxpZCB8fCBJbnRlcnJ1cHRSZWdpc3Rlci5pci5SZXNlcnZlZCAhPSAwKQorCQlyZXR1cm4gZmFsc2U7CisJLyoKKwkgICBDaGVjayB0aGUgdW5kb2N1bWVudGVkIEdlb21ldHJ5IFJlZ2lzdGVyIHRvIHRlc3QgaWYgdGhlcmUgaXMgYW4gSS9PIHBvcnQKKwkgICB0aGF0IHJlc3BvbmRlZC4gIEFkYXB0ZWMgSG9zdCBBZGFwdGVycyBkbyBub3QgaW1wbGVtZW50IHRoZSBHZW9tZXRyeQorCSAgIFJlZ2lzdGVyLCBzbyB0aGlzIHRlc3QgaGVscHMgc2VydmUgdG8gYXZvaWQgaW5jb3JyZWN0bHkgcmVjb2duaXppbmcgYW4KKwkgICBBZGFwdGVjIDE1NDJBIG9yIDE1NDJCIGFzIGEgQnVzTG9naWMuICBVbmZvcnR1bmF0ZWx5LCB0aGUgQWRhcHRlYyAxNTQyQworCSAgIHNlcmllcyBkb2VzIHJlc3BvbmQgdG8gdGhlIEdlb21ldHJ5IFJlZ2lzdGVyIEkvTyBwb3J0LCBidXQgaXQgd2lsbCBiZQorCSAgIHJlamVjdGVkIGxhdGVyIHdoZW4gdGhlIElucXVpcmUgRXh0ZW5kZWQgU2V0dXAgSW5mb3JtYXRpb24gY29tbWFuZCBpcworCSAgIGlzc3VlZCBpbiBCdXNMb2dpY19DaGVja0hvc3RBZGFwdGVyLiAgVGhlIEFNSSBGYXN0RGlzayBIb3N0IEFkYXB0ZXIgaXMgYQorCSAgIEJ1c0xvZ2ljIGNsb25lIHRoYXQgaW1wbGVtZW50cyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgZWFybGllciBCdXNMb2dpYworCSAgIEhvc3QgQWRhcHRlcnMsIGluY2x1ZGluZyB0aGUgdW5kb2N1bWVudGVkIGNvbW1hbmRzLCBhbmQgaXMgdGhlcmVmb3JlCisJICAgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLiAgSG93ZXZlciwgdGhlIEFNSSBGYXN0RGlzayBhbHdheXMgcmV0dXJucyAweDAwCisJICAgdXBvbiByZWFkaW5nIHRoZSBHZW9tZXRyeSBSZWdpc3Rlciwgc28gdGhlIGV4dGVuZGVkIHRyYW5zbGF0aW9uIG9wdGlvbgorCSAgIHNob3VsZCBhbHdheXMgYmUgbGVmdCBkaXNhYmxlZCBvbiB0aGUgQU1JIEZhc3REaXNrLgorCSAqLworCWlmIChHZW9tZXRyeVJlZ2lzdGVyLkFsbCA9PSAweEZGKQorCQlyZXR1cm4gZmFsc2U7CisJLyoKKwkgICBJbmRpY2F0ZSB0aGUgSG9zdCBBZGFwdGVyIFByb2JlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisJICovCisJcmV0dXJuIHRydWU7Cit9CisKKworLyoKKyAgQnVzTG9naWNfSGFyZHdhcmVSZXNldEhvc3RBZGFwdGVyIGlzc3VlcyBhIEhhcmR3YXJlIFJlc2V0IHRvIHRoZSBIb3N0IEFkYXB0ZXIKKyAgYW5kIHdhaXRzIGZvciBIb3N0IEFkYXB0ZXIgRGlhZ25vc3RpY3MgdG8gY29tcGxldGUuICBJZiBIYXJkUmVzZXQgaXMgdHJ1ZSwgYQorICBIYXJkIFJlc2V0IGlzIHBlcmZvcm1lZCB3aGljaCBhbHNvIGluaXRpYXRlcyBhIFNDU0kgQnVzIFJlc2V0LiAgT3RoZXJ3aXNlLCBhCisgIFNvZnQgUmVzZXQgaXMgcGVyZm9ybWVkIHdoaWNoIG9ubHkgcmVzZXRzIHRoZSBIb3N0IEFkYXB0ZXIgd2l0aG91dCBmb3JjaW5nIGEKKyAgU0NTSSBCdXMgUmVzZXQuCisqLworCitzdGF0aWMgYm9vbGVhbiBCdXNMb2dpY19IYXJkd2FyZVJlc2V0SG9zdEFkYXB0ZXIoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyCisJCQkJCQkgKkhvc3RBZGFwdGVyLCBib29sZWFuIEhhcmRSZXNldCkKK3sKKwl1bmlvbiBCdXNMb2dpY19TdGF0dXNSZWdpc3RlciBTdGF0dXNSZWdpc3RlcjsKKwlpbnQgVGltZW91dENvdW50ZXI7CisJLyoKKwkgICBGbGFzaFBvaW50IEhvc3QgQWRhcHRlcnMgYXJlIEhhcmQgUmVzZXQgYnkgdGhlIEZsYXNoUG9pbnQgU0NDQiBNYW5hZ2VyLgorCSAqLworCWlmIChCdXNMb2dpY19GbGFzaFBvaW50SG9zdEFkYXB0ZXJQKEhvc3RBZGFwdGVyKSkgeworCQlzdHJ1Y3QgRmxhc2hQb2ludF9JbmZvICpGbGFzaFBvaW50SW5mbyA9ICZIb3N0QWRhcHRlci0+Rmxhc2hQb2ludEluZm87CisJCUZsYXNoUG9pbnRJbmZvLT5Ib3N0U29mdFJlc2V0ID0gIUhhcmRSZXNldDsKKwkJRmxhc2hQb2ludEluZm8tPlJlcG9ydERhdGFVbmRlcnJ1biA9IHRydWU7CisJCUhvc3RBZGFwdGVyLT5DYXJkSGFuZGxlID0gRmxhc2hQb2ludF9IYXJkd2FyZVJlc2V0SG9zdEFkYXB0ZXIoRmxhc2hQb2ludEluZm8pOworCQlpZiAoSG9zdEFkYXB0ZXItPkNhcmRIYW5kbGUgPT0gRmxhc2hQb2ludF9CYWRDYXJkSGFuZGxlKQorCQkJcmV0dXJuIGZhbHNlOworCQkvKgorCQkgICBJbmRpY2F0ZSB0aGUgSG9zdCBBZGFwdGVyIEhhcmQgUmVzZXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKwkJICovCisJCXJldHVybiB0cnVlOworCX0KKwkvKgorCSAgIElzc3VlIGEgSGFyZCBSZXNldCBvciBTb2Z0IFJlc2V0IENvbW1hbmQgdG8gdGhlIEhvc3QgQWRhcHRlci4gIFRoZSBIb3N0CisJICAgQWRhcHRlciBzaG91bGQgcmVzcG9uZCBieSBzZXR0aW5nIERpYWdub3N0aWMgQWN0aXZlIGluIHRoZSBTdGF0dXMgUmVnaXN0ZXIuCisJICovCisJaWYgKEhhcmRSZXNldCkKKwkJQnVzTG9naWNfSGFyZFJlc2V0KEhvc3RBZGFwdGVyKTsKKwllbHNlCisJCUJ1c0xvZ2ljX1NvZnRSZXNldChIb3N0QWRhcHRlcik7CisJLyoKKwkgICBXYWl0IHVudGlsIERpYWdub3N0aWMgQWN0aXZlIGlzIHNldCBpbiB0aGUgU3RhdHVzIFJlZ2lzdGVyLgorCSAqLworCVRpbWVvdXRDb3VudGVyID0gNSAqIDEwMDAwOworCXdoaWxlICgtLVRpbWVvdXRDb3VudGVyID49IDApIHsKKwkJU3RhdHVzUmVnaXN0ZXIuQWxsID0gQnVzTG9naWNfUmVhZFN0YXR1c1JlZ2lzdGVyKEhvc3RBZGFwdGVyKTsKKwkJaWYgKFN0YXR1c1JlZ2lzdGVyLnNyLkRpYWdub3N0aWNBY3RpdmUpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwMCk7CisJfQorCWlmIChCdXNMb2dpY19HbG9iYWxPcHRpb25zLlRyYWNlSGFyZHdhcmVSZXNldCkKKwkJQnVzTG9naWNfTm90aWNlKCJCdXNMb2dpY19IYXJkd2FyZVJlc2V0KDB4JVgpOiBEaWFnbm9zdGljIEFjdGl2ZSwgIiAiU3RhdHVzIDB4JTAyWFxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5JT19BZGRyZXNzLCBTdGF0dXNSZWdpc3Rlci5BbGwpOworCWlmIChUaW1lb3V0Q291bnRlciA8IDApCisJCXJldHVybiBmYWxzZTsKKwkvKgorCSAgIFdhaXQgMTAwIG1pY3Jvc2Vjb25kcyB0byBhbGxvdyBjb21wbGV0aW9uIG9mIGFueSBpbml0aWFsIGRpYWdub3N0aWMKKwkgICBhY3Rpdml0eSB3aGljaCBtaWdodCBsZWF2ZSB0aGUgY29udGVudHMgb2YgdGhlIFN0YXR1cyBSZWdpc3RlcgorCSAgIHVucHJlZGljdGFibGUuCisJICovCisJdWRlbGF5KDEwMCk7CisJLyoKKwkgICBXYWl0IHVudGlsIERpYWdub3N0aWMgQWN0aXZlIGlzIHJlc2V0IGluIHRoZSBTdGF0dXMgUmVnaXN0ZXIuCisJICovCisJVGltZW91dENvdW50ZXIgPSAxMCAqIDEwMDAwOworCXdoaWxlICgtLVRpbWVvdXRDb3VudGVyID49IDApIHsKKwkJU3RhdHVzUmVnaXN0ZXIuQWxsID0gQnVzTG9naWNfUmVhZFN0YXR1c1JlZ2lzdGVyKEhvc3RBZGFwdGVyKTsKKwkJaWYgKCFTdGF0dXNSZWdpc3Rlci5zci5EaWFnbm9zdGljQWN0aXZlKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOworCX0KKwlpZiAoQnVzTG9naWNfR2xvYmFsT3B0aW9ucy5UcmFjZUhhcmR3YXJlUmVzZXQpCisJCUJ1c0xvZ2ljX05vdGljZSgiQnVzTG9naWNfSGFyZHdhcmVSZXNldCgweCVYKTogRGlhZ25vc3RpYyBDb21wbGV0ZWQsICIgIlN0YXR1cyAweCUwMlhcbiIsIEhvc3RBZGFwdGVyLCBIb3N0QWRhcHRlci0+SU9fQWRkcmVzcywgU3RhdHVzUmVnaXN0ZXIuQWxsKTsKKwlpZiAoVGltZW91dENvdW50ZXIgPCAwKQorCQlyZXR1cm4gZmFsc2U7CisJLyoKKwkgICBXYWl0IHVudGlsIGF0IGxlYXN0IG9uZSBvZiB0aGUgRGlhZ25vc3RpYyBGYWlsdXJlLCBIb3N0IEFkYXB0ZXIgUmVhZHksCisJICAgb3IgRGF0YSBJbiBSZWdpc3RlciBSZWFkeSBiaXRzIGlzIHNldCBpbiB0aGUgU3RhdHVzIFJlZ2lzdGVyLgorCSAqLworCVRpbWVvdXRDb3VudGVyID0gMTAwMDA7CisJd2hpbGUgKC0tVGltZW91dENvdW50ZXIgPj0gMCkgeworCQlTdGF0dXNSZWdpc3Rlci5BbGwgPSBCdXNMb2dpY19SZWFkU3RhdHVzUmVnaXN0ZXIoSG9zdEFkYXB0ZXIpOworCQlpZiAoU3RhdHVzUmVnaXN0ZXIuc3IuRGlhZ25vc3RpY0ZhaWx1cmUgfHwgU3RhdHVzUmVnaXN0ZXIuc3IuSG9zdEFkYXB0ZXJSZWFkeSB8fCBTdGF0dXNSZWdpc3Rlci5zci5EYXRhSW5SZWdpc3RlclJlYWR5KQorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOworCX0KKwlpZiAoQnVzTG9naWNfR2xvYmFsT3B0aW9ucy5UcmFjZUhhcmR3YXJlUmVzZXQpCisJCUJ1c0xvZ2ljX05vdGljZSgiQnVzTG9naWNfSGFyZHdhcmVSZXNldCgweCVYKTogSG9zdCBBZGFwdGVyIFJlYWR5LCAiICJTdGF0dXMgMHglMDJYXG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MsIFN0YXR1c1JlZ2lzdGVyLkFsbCk7CisJaWYgKFRpbWVvdXRDb3VudGVyIDwgMCkKKwkJcmV0dXJuIGZhbHNlOworCS8qCisJICAgSWYgRGlhZ25vc3RpYyBGYWlsdXJlIGlzIHNldCBvciBIb3N0IEFkYXB0ZXIgUmVhZHkgaXMgcmVzZXQsIHRoZW4gYW4KKwkgICBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIEhvc3QgQWRhcHRlciBkaWFnbm9zdGljcy4gIElmIERhdGEgSW4gUmVnaXN0ZXIKKwkgICBSZWFkeSBpcyBzZXQsIHRoZW4gdGhlcmUgaXMgYW4gRXJyb3IgQ29kZSBhdmFpbGFibGUuCisJICovCisJaWYgKFN0YXR1c1JlZ2lzdGVyLnNyLkRpYWdub3N0aWNGYWlsdXJlIHx8ICFTdGF0dXNSZWdpc3Rlci5zci5Ib3N0QWRhcHRlclJlYWR5KSB7CisJCUJ1c0xvZ2ljX0NvbW1hbmRGYWlsdXJlUmVhc29uID0gTlVMTDsKKwkJQnVzTG9naWNfRmFpbHVyZShIb3N0QWRhcHRlciwgIkhBUkQgUkVTRVQgRElBR05PU1RJQ1MiKTsKKwkJQnVzTG9naWNfRXJyb3IoIkhPU1QgQURBUFRFUiBTVEFUVVMgUkVHSVNURVIgPSAlMDJYXG4iLCBIb3N0QWRhcHRlciwgU3RhdHVzUmVnaXN0ZXIuQWxsKTsKKwkJaWYgKFN0YXR1c1JlZ2lzdGVyLnNyLkRhdGFJblJlZ2lzdGVyUmVhZHkpIHsKKwkJCXVuc2lnbmVkIGNoYXIgRXJyb3JDb2RlID0gQnVzTG9naWNfUmVhZERhdGFJblJlZ2lzdGVyKEhvc3RBZGFwdGVyKTsKKwkJCUJ1c0xvZ2ljX0Vycm9yKCJIT1NUIEFEQVBURVIgRVJST1IgQ09ERSA9ICVkXG4iLCBIb3N0QWRhcHRlciwgRXJyb3JDb2RlKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qCisJICAgSW5kaWNhdGUgdGhlIEhvc3QgQWRhcHRlciBIYXJkIFJlc2V0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisJICovCisJcmV0dXJuIHRydWU7Cit9CisKKworLyoKKyAgQnVzTG9naWNfQ2hlY2tIb3N0QWRhcHRlciBjaGVja3MgdG8gYmUgc3VyZSB0aGlzIHJlYWxseSBpcyBhIEJ1c0xvZ2ljCisgIEhvc3QgQWRhcHRlci4KKyovCisKK3N0YXRpYyBib29sZWFuIF9faW5pdCBCdXNMb2dpY19DaGVja0hvc3RBZGFwdGVyKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIpCit7CisJc3RydWN0IEJ1c0xvZ2ljX0V4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbiBFeHRlbmRlZFNldHVwSW5mb3JtYXRpb247CisJdW5zaWduZWQgY2hhciBSZXF1ZXN0ZWRSZXBseUxlbmd0aDsKKwlib29sZWFuIFJlc3VsdCA9IHRydWU7CisJLyoKKwkgICBGbGFzaFBvaW50IEhvc3QgQWRhcHRlcnMgZG8gbm90IHJlcXVpcmUgdGhpcyBwcm90ZWN0aW9uLgorCSAqLworCWlmIChCdXNMb2dpY19GbGFzaFBvaW50SG9zdEFkYXB0ZXJQKEhvc3RBZGFwdGVyKSkKKwkJcmV0dXJuIHRydWU7CisJLyoKKwkgICBJc3N1ZSB0aGUgSW5xdWlyZSBFeHRlbmRlZCBTZXR1cCBJbmZvcm1hdGlvbiBjb21tYW5kLiAgT25seSBnZW51aW5lCisJICAgQnVzTG9naWMgSG9zdCBBZGFwdGVycyBhbmQgdHJ1ZSBjbG9uZXMgc3VwcG9ydCB0aGlzIGNvbW1hbmQuICBBZGFwdGVjIDE1NDJDCisJICAgc2VyaWVzIEhvc3QgQWRhcHRlcnMgdGhhdCByZXNwb25kIHRvIHRoZSBHZW9tZXRyeSBSZWdpc3RlciBJL08gcG9ydCB3aWxsCisJICAgZmFpbCB0aGlzIGNvbW1hbmQuCisJICovCisJUmVxdWVzdGVkUmVwbHlMZW5ndGggPSBzaXplb2YoRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uKTsKKwlpZiAoQnVzTG9naWNfQ29tbWFuZChIb3N0QWRhcHRlciwgQnVzTG9naWNfSW5xdWlyZUV4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbiwgJlJlcXVlc3RlZFJlcGx5TGVuZ3RoLCBzaXplb2YoUmVxdWVzdGVkUmVwbHlMZW5ndGgpLCAmRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uLCBzaXplb2YoRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uKSkKKwkgICAgIT0gc2l6ZW9mKEV4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbikpCisJCVJlc3VsdCA9IGZhbHNlOworCS8qCisJICAgUHJvdmlkZSB0cmFjaW5nIGluZm9ybWF0aW9uIGlmIHJlcXVlc3RlZCBhbmQgcmV0dXJuLgorCSAqLworCWlmIChCdXNMb2dpY19HbG9iYWxPcHRpb25zLlRyYWNlUHJvYmUpCisJCUJ1c0xvZ2ljX05vdGljZSgiQnVzTG9naWNfQ2hlY2soMHglWCk6IE11bHRpTWFzdGVyICVzXG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MsIChSZXN1bHQgPyAiRm91bmQiIDogIk5vdCBGb3VuZCIpKTsKKwlyZXR1cm4gUmVzdWx0OworfQorCisKKy8qCisgIEJ1c0xvZ2ljX1JlYWRIb3N0QWRhcHRlckNvbmZpZ3VyYXRpb24gcmVhZHMgdGhlIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24KKyAgZnJvbSBIb3N0IEFkYXB0ZXIgYW5kIGluaXRpYWxpemVzIHRoZSBIb3N0IEFkYXB0ZXIgc3RydWN0dXJlLgorKi8KKworc3RhdGljIGJvb2xlYW4gX19pbml0IEJ1c0xvZ2ljX1JlYWRIb3N0QWRhcHRlckNvbmZpZ3VyYXRpb24oc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyCisJCQkJCQkJICAgICpIb3N0QWRhcHRlcikKK3sKKwlzdHJ1Y3QgQnVzTG9naWNfQm9hcmRJRCBCb2FyZElEOworCXN0cnVjdCBCdXNMb2dpY19Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb247CisJc3RydWN0IEJ1c0xvZ2ljX1NldHVwSW5mb3JtYXRpb24gU2V0dXBJbmZvcm1hdGlvbjsKKwlzdHJ1Y3QgQnVzTG9naWNfRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uIEV4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbjsKKwl1bnNpZ25lZCBjaGFyIEhvc3RBZGFwdGVyTW9kZWxOdW1iZXJbNV07CisJdW5zaWduZWQgY2hhciBGaXJtd2FyZVZlcnNpb24zcmREaWdpdDsKKwl1bnNpZ25lZCBjaGFyIEZpcm13YXJlVmVyc2lvbkxldHRlcjsKKwlzdHJ1Y3QgQnVzTG9naWNfUENJSG9zdEFkYXB0ZXJJbmZvcm1hdGlvbiBQQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uOworCXN0cnVjdCBCdXNMb2dpY19GZXRjaEhvc3RBZGFwdGVyTG9jYWxSQU1SZXF1ZXN0IEZldGNoSG9zdEFkYXB0ZXJMb2NhbFJBTVJlcXVlc3Q7CisJc3RydWN0IEJ1c0xvZ2ljX0F1dG9TQ1NJRGF0YSBBdXRvU0NTSURhdGE7CisJdW5pb24gQnVzTG9naWNfR2VvbWV0cnlSZWdpc3RlciBHZW9tZXRyeVJlZ2lzdGVyOworCXVuc2lnbmVkIGNoYXIgUmVxdWVzdGVkUmVwbHlMZW5ndGg7CisJdW5zaWduZWQgY2hhciAqVGFyZ2V0UG9pbnRlciwgQ2hhcmFjdGVyOworCWludCBUYXJnZXRJRCwgaTsKKwkvKgorCSAgIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gZm9yIEZsYXNoUG9pbnQgSG9zdCBBZGFwdGVycyBpcyBwcm92aWRlZCBpbiB0aGUKKwkgICBGbGFzaFBvaW50X0luZm8gc3RydWN0dXJlIGJ5IHRoZSBGbGFzaFBvaW50IFNDQ0IgTWFuYWdlcidzIFByb2JlIEZ1bmN0aW9uLgorCSAgIEluaXRpYWxpemUgZmllbGRzIGluIHRoZSBIb3N0IEFkYXB0ZXIgc3RydWN0dXJlIGZyb20gdGhlIEZsYXNoUG9pbnRfSW5mbworCSAgIHN0cnVjdHVyZS4KKwkgKi8KKwlpZiAoQnVzTG9naWNfRmxhc2hQb2ludEhvc3RBZGFwdGVyUChIb3N0QWRhcHRlcikpIHsKKwkJc3RydWN0IEZsYXNoUG9pbnRfSW5mbyAqRmxhc2hQb2ludEluZm8gPSAmSG9zdEFkYXB0ZXItPkZsYXNoUG9pbnRJbmZvOworCQlUYXJnZXRQb2ludGVyID0gSG9zdEFkYXB0ZXItPk1vZGVsTmFtZTsKKwkJKlRhcmdldFBvaW50ZXIrKyA9ICdCJzsKKwkJKlRhcmdldFBvaW50ZXIrKyA9ICdUJzsKKwkJKlRhcmdldFBvaW50ZXIrKyA9ICctJzsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihGbGFzaFBvaW50SW5mby0+TW9kZWxOdW1iZXIpOyBpKyspCisJCQkqVGFyZ2V0UG9pbnRlcisrID0gRmxhc2hQb2ludEluZm8tPk1vZGVsTnVtYmVyW2ldOworCQkqVGFyZ2V0UG9pbnRlcisrID0gJ1wwJzsKKwkJc3RyY3B5KEhvc3RBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb24sIEZsYXNoUG9pbnRfRmlybXdhcmVWZXJzaW9uKTsKKwkJSG9zdEFkYXB0ZXItPlNDU0lfSUQgPSBGbGFzaFBvaW50SW5mby0+U0NTSV9JRDsKKwkJSG9zdEFkYXB0ZXItPkV4dGVuZGVkVHJhbnNsYXRpb25FbmFibGVkID0gRmxhc2hQb2ludEluZm8tPkV4dGVuZGVkVHJhbnNsYXRpb25FbmFibGVkOworCQlIb3N0QWRhcHRlci0+UGFyaXR5Q2hlY2tpbmdFbmFibGVkID0gRmxhc2hQb2ludEluZm8tPlBhcml0eUNoZWNraW5nRW5hYmxlZDsKKwkJSG9zdEFkYXB0ZXItPkJ1c1Jlc2V0RW5hYmxlZCA9ICFGbGFzaFBvaW50SW5mby0+SG9zdFNvZnRSZXNldDsKKwkJSG9zdEFkYXB0ZXItPkxldmVsU2Vuc2l0aXZlSW50ZXJydXB0ID0gdHJ1ZTsKKwkJSG9zdEFkYXB0ZXItPkhvc3RXaWRlU0NTSSA9IEZsYXNoUG9pbnRJbmZvLT5Ib3N0V2lkZVNDU0k7CisJCUhvc3RBZGFwdGVyLT5Ib3N0RGlmZmVyZW50aWFsU0NTSSA9IGZhbHNlOworCQlIb3N0QWRhcHRlci0+SG9zdFN1cHBvcnRzU0NBTSA9IHRydWU7CisJCUhvc3RBZGFwdGVyLT5Ib3N0VWx0cmFTQ1NJID0gdHJ1ZTsKKwkJSG9zdEFkYXB0ZXItPkV4dGVuZGVkTFVOU3VwcG9ydCA9IHRydWU7CisJCUhvc3RBZGFwdGVyLT5UZXJtaW5hdGlvbkluZm9WYWxpZCA9IHRydWU7CisJCUhvc3RBZGFwdGVyLT5Mb3dCeXRlVGVybWluYXRlZCA9IEZsYXNoUG9pbnRJbmZvLT5Mb3dCeXRlVGVybWluYXRlZDsKKwkJSG9zdEFkYXB0ZXItPkhpZ2hCeXRlVGVybWluYXRlZCA9IEZsYXNoUG9pbnRJbmZvLT5IaWdoQnl0ZVRlcm1pbmF0ZWQ7CisJCUhvc3RBZGFwdGVyLT5TQ0FNX0VuYWJsZWQgPSBGbGFzaFBvaW50SW5mby0+U0NBTV9FbmFibGVkOworCQlIb3N0QWRhcHRlci0+U0NBTV9MZXZlbDIgPSBGbGFzaFBvaW50SW5mby0+U0NBTV9MZXZlbDI7CisJCUhvc3RBZGFwdGVyLT5Ecml2ZXJTY2F0dGVyR2F0aGVyTGltaXQgPSBCdXNMb2dpY19TY2F0dGVyR2F0aGVyTGltaXQ7CisJCUhvc3RBZGFwdGVyLT5NYXhUYXJnZXREZXZpY2VzID0gKEhvc3RBZGFwdGVyLT5Ib3N0V2lkZVNDU0kgPyAxNiA6IDgpOworCQlIb3N0QWRhcHRlci0+TWF4TG9naWNhbFVuaXRzID0gMzI7CisJCUhvc3RBZGFwdGVyLT5Jbml0aWFsQ0NCcyA9IDQgKiBCdXNMb2dpY19DQ0JfQWxsb2NhdGlvbkdyb3VwU2l6ZTsKKwkJSG9zdEFkYXB0ZXItPkluY3JlbWVudGFsQ0NCcyA9IEJ1c0xvZ2ljX0NDQl9BbGxvY2F0aW9uR3JvdXBTaXplOworCQlIb3N0QWRhcHRlci0+RHJpdmVyUXVldWVEZXB0aCA9IDI1NTsKKwkJSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyUXVldWVEZXB0aCA9IEhvc3RBZGFwdGVyLT5Ecml2ZXJRdWV1ZURlcHRoOworCQlIb3N0QWRhcHRlci0+U3luY2hyb25vdXNQZXJtaXR0ZWQgPSBGbGFzaFBvaW50SW5mby0+U3luY2hyb25vdXNQZXJtaXR0ZWQ7CisJCUhvc3RBZGFwdGVyLT5GYXN0UGVybWl0dGVkID0gRmxhc2hQb2ludEluZm8tPkZhc3RQZXJtaXR0ZWQ7CisJCUhvc3RBZGFwdGVyLT5VbHRyYVBlcm1pdHRlZCA9IEZsYXNoUG9pbnRJbmZvLT5VbHRyYVBlcm1pdHRlZDsKKwkJSG9zdEFkYXB0ZXItPldpZGVQZXJtaXR0ZWQgPSBGbGFzaFBvaW50SW5mby0+V2lkZVBlcm1pdHRlZDsKKwkJSG9zdEFkYXB0ZXItPkRpc2Nvbm5lY3RQZXJtaXR0ZWQgPSBGbGFzaFBvaW50SW5mby0+RGlzY29ubmVjdFBlcm1pdHRlZDsKKwkJSG9zdEFkYXB0ZXItPlRhZ2dlZFF1ZXVpbmdQZXJtaXR0ZWQgPSAweEZGRkY7CisJCWdvdG8gQ29tbW9uOworCX0KKwkvKgorCSAgIElzc3VlIHRoZSBJbnF1aXJlIEJvYXJkIElEIGNvbW1hbmQuCisJICovCisJaWYgKEJ1c0xvZ2ljX0NvbW1hbmQoSG9zdEFkYXB0ZXIsIEJ1c0xvZ2ljX0lucXVpcmVCb2FyZElELCBOVUxMLCAwLCAmQm9hcmRJRCwgc2l6ZW9mKEJvYXJkSUQpKSAhPSBzaXplb2YoQm9hcmRJRCkpCisJCXJldHVybiBCdXNMb2dpY19GYWlsdXJlKEhvc3RBZGFwdGVyLCAiSU5RVUlSRSBCT0FSRCBJRCIpOworCS8qCisJICAgSXNzdWUgdGhlIElucXVpcmUgQ29uZmlndXJhdGlvbiBjb21tYW5kLgorCSAqLworCWlmIChCdXNMb2dpY19Db21tYW5kKEhvc3RBZGFwdGVyLCBCdXNMb2dpY19JbnF1aXJlQ29uZmlndXJhdGlvbiwgTlVMTCwgMCwgJkNvbmZpZ3VyYXRpb24sIHNpemVvZihDb25maWd1cmF0aW9uKSkKKwkgICAgIT0gc2l6ZW9mKENvbmZpZ3VyYXRpb24pKQorCQlyZXR1cm4gQnVzTG9naWNfRmFpbHVyZShIb3N0QWRhcHRlciwgIklOUVVJUkUgQ09ORklHVVJBVElPTiIpOworCS8qCisJICAgSXNzdWUgdGhlIElucXVpcmUgU2V0dXAgSW5mb3JtYXRpb24gY29tbWFuZC4KKwkgKi8KKwlSZXF1ZXN0ZWRSZXBseUxlbmd0aCA9IHNpemVvZihTZXR1cEluZm9ybWF0aW9uKTsKKwlpZiAoQnVzTG9naWNfQ29tbWFuZChIb3N0QWRhcHRlciwgQnVzTG9naWNfSW5xdWlyZVNldHVwSW5mb3JtYXRpb24sICZSZXF1ZXN0ZWRSZXBseUxlbmd0aCwgc2l6ZW9mKFJlcXVlc3RlZFJlcGx5TGVuZ3RoKSwgJlNldHVwSW5mb3JtYXRpb24sIHNpemVvZihTZXR1cEluZm9ybWF0aW9uKSkKKwkgICAgIT0gc2l6ZW9mKFNldHVwSW5mb3JtYXRpb24pKQorCQlyZXR1cm4gQnVzTG9naWNfRmFpbHVyZShIb3N0QWRhcHRlciwgIklOUVVJUkUgU0VUVVAgSU5GT1JNQVRJT04iKTsKKwkvKgorCSAgIElzc3VlIHRoZSBJbnF1aXJlIEV4dGVuZGVkIFNldHVwIEluZm9ybWF0aW9uIGNvbW1hbmQuCisJICovCisJUmVxdWVzdGVkUmVwbHlMZW5ndGggPSBzaXplb2YoRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uKTsKKwlpZiAoQnVzTG9naWNfQ29tbWFuZChIb3N0QWRhcHRlciwgQnVzTG9naWNfSW5xdWlyZUV4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbiwgJlJlcXVlc3RlZFJlcGx5TGVuZ3RoLCBzaXplb2YoUmVxdWVzdGVkUmVwbHlMZW5ndGgpLCAmRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uLCBzaXplb2YoRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uKSkKKwkgICAgIT0gc2l6ZW9mKEV4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbikpCisJCXJldHVybiBCdXNMb2dpY19GYWlsdXJlKEhvc3RBZGFwdGVyLCAiSU5RVUlSRSBFWFRFTkRFRCBTRVRVUCBJTkZPUk1BVElPTiIpOworCS8qCisJICAgSXNzdWUgdGhlIElucXVpcmUgRmlybXdhcmUgVmVyc2lvbiAzcmQgRGlnaXQgY29tbWFuZC4KKwkgKi8KKwlGaXJtd2FyZVZlcnNpb24zcmREaWdpdCA9ICdcMCc7CisJaWYgKEJvYXJkSUQuRmlybXdhcmVWZXJzaW9uMXN0RGlnaXQgPiAnMCcpCisJCWlmIChCdXNMb2dpY19Db21tYW5kKEhvc3RBZGFwdGVyLCBCdXNMb2dpY19JbnF1aXJlRmlybXdhcmVWZXJzaW9uM3JkRGlnaXQsIE5VTEwsIDAsICZGaXJtd2FyZVZlcnNpb24zcmREaWdpdCwgc2l6ZW9mKEZpcm13YXJlVmVyc2lvbjNyZERpZ2l0KSkKKwkJICAgICE9IHNpemVvZihGaXJtd2FyZVZlcnNpb24zcmREaWdpdCkpCisJCQlyZXR1cm4gQnVzTG9naWNfRmFpbHVyZShIb3N0QWRhcHRlciwgIklOUVVJUkUgRklSTVdBUkUgM1JEIERJR0lUIik7CisJLyoKKwkgICBJc3N1ZSB0aGUgSW5xdWlyZSBIb3N0IEFkYXB0ZXIgTW9kZWwgTnVtYmVyIGNvbW1hbmQuCisJICovCisJaWYgKEV4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbi5CdXNUeXBlID09ICdBJyAmJiBCb2FyZElELkZpcm13YXJlVmVyc2lvbjFzdERpZ2l0ID09ICcyJykKKwkJLyogQnVzTG9naWMgQlQtNTQyQiBJU0EgMi54eCAqLworCQlzdHJjcHkoSG9zdEFkYXB0ZXJNb2RlbE51bWJlciwgIjU0MkIiKTsKKwllbHNlIGlmIChFeHRlbmRlZFNldHVwSW5mb3JtYXRpb24uQnVzVHlwZSA9PSAnRScgJiYgQm9hcmRJRC5GaXJtd2FyZVZlcnNpb24xc3REaWdpdCA9PSAnMicgJiYgKEJvYXJkSUQuRmlybXdhcmVWZXJzaW9uMm5kRGlnaXQgPD0gJzEnIHx8IChCb2FyZElELkZpcm13YXJlVmVyc2lvbjJuZERpZ2l0ID09ICcyJyAmJiBGaXJtd2FyZVZlcnNpb24zcmREaWdpdCA9PSAnMCcpKSkKKwkJLyogQnVzTG9naWMgQlQtNzQyQSBFSVNBIDIuMXggb3IgMi4yMCAqLworCQlzdHJjcHkoSG9zdEFkYXB0ZXJNb2RlbE51bWJlciwgIjc0MkEiKTsKKwllbHNlIGlmIChFeHRlbmRlZFNldHVwSW5mb3JtYXRpb24uQnVzVHlwZSA9PSAnRScgJiYgQm9hcmRJRC5GaXJtd2FyZVZlcnNpb24xc3REaWdpdCA9PSAnMCcpCisJCS8qIEFNSSBGYXN0RGlzayBFSVNBIFNlcmllcyA0NDEgMC54ICovCisJCXN0cmNweShIb3N0QWRhcHRlck1vZGVsTnVtYmVyLCAiNzQ3QSIpOworCWVsc2UgeworCQlSZXF1ZXN0ZWRSZXBseUxlbmd0aCA9IHNpemVvZihIb3N0QWRhcHRlck1vZGVsTnVtYmVyKTsKKwkJaWYgKEJ1c0xvZ2ljX0NvbW1hbmQoSG9zdEFkYXB0ZXIsIEJ1c0xvZ2ljX0lucXVpcmVIb3N0QWRhcHRlck1vZGVsTnVtYmVyLCAmUmVxdWVzdGVkUmVwbHlMZW5ndGgsIHNpemVvZihSZXF1ZXN0ZWRSZXBseUxlbmd0aCksICZIb3N0QWRhcHRlck1vZGVsTnVtYmVyLCBzaXplb2YoSG9zdEFkYXB0ZXJNb2RlbE51bWJlcikpCisJCSAgICAhPSBzaXplb2YoSG9zdEFkYXB0ZXJNb2RlbE51bWJlcikpCisJCQlyZXR1cm4gQnVzTG9naWNfRmFpbHVyZShIb3N0QWRhcHRlciwgIklOUVVJUkUgSE9TVCBBREFQVEVSIE1PREVMIE5VTUJFUiIpOworCX0KKwkvKgorCSAgIEJ1c0xvZ2ljIE11bHRpTWFzdGVyIEhvc3QgQWRhcHRlcnMgY2FuIGJlIGlkZW50aWZpZWQgYnkgdGhlaXIgbW9kZWwgbnVtYmVyCisJICAgYW5kIHRoZSBtYWpvciB2ZXJzaW9uIG51bWJlciBvZiB0aGVpciBmaXJtd2FyZSBhcyBmb2xsb3dzOgorCisJICAgNS54eCAgICAgICBCdXNMb2dpYyAiVyIgU2VyaWVzIEhvc3QgQWRhcHRlcnM6CisJICAgQlQtOTQ4Lzk1OC85NThECisJICAgNC54eCAgICAgICBCdXNMb2dpYyAiQyIgU2VyaWVzIEhvc3QgQWRhcHRlcnM6CisJICAgQlQtOTQ2Qy85NTZDLzk1NkNELzc0N0MvNzU3Qy83NTdDRC80NDVDLzU0NUMvNTQwQ0YKKwkgICAzLnh4ICAgICAgIEJ1c0xvZ2ljICJTIiBTZXJpZXMgSG9zdCBBZGFwdGVyczoKKwkgICBCVC03NDdTLzc0N0QvNzU3Uy83NTdELzQ0NVMvNTQ1Uy81NDJECisJICAgQlQtNTQyQi83NDJBIChyZXZpc2lvbiBIKQorCSAgIDIueHggICAgICAgQnVzTG9naWMgIkEiIFNlcmllcyBIb3N0IEFkYXB0ZXJzOgorCSAgIEJULTU0MkIvNzQyQSAocmV2aXNpb24gRyBhbmQgYmVsb3cpCisJICAgMC54eCAgICAgICBBTUkgRmFzdERpc2sgVkxCL0VJU0EgQnVzTG9naWMgQ2xvbmUgSG9zdCBBZGFwdGVyCisJICovCisJLyoKKwkgICBTYXZlIHRoZSBNb2RlbCBOYW1lIGFuZCBIb3N0IEFkYXB0ZXIgTmFtZSBpbiB0aGUgSG9zdCBBZGFwdGVyIHN0cnVjdHVyZS4KKwkgKi8KKwlUYXJnZXRQb2ludGVyID0gSG9zdEFkYXB0ZXItPk1vZGVsTmFtZTsKKwkqVGFyZ2V0UG9pbnRlcisrID0gJ0InOworCSpUYXJnZXRQb2ludGVyKysgPSAnVCc7CisJKlRhcmdldFBvaW50ZXIrKyA9ICctJzsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKEhvc3RBZGFwdGVyTW9kZWxOdW1iZXIpOyBpKyspIHsKKwkJQ2hhcmFjdGVyID0gSG9zdEFkYXB0ZXJNb2RlbE51bWJlcltpXTsKKwkJaWYgKENoYXJhY3RlciA9PSAnICcgfHwgQ2hhcmFjdGVyID09ICdcMCcpCisJCQlicmVhazsKKwkJKlRhcmdldFBvaW50ZXIrKyA9IENoYXJhY3RlcjsKKwl9CisJKlRhcmdldFBvaW50ZXIrKyA9ICdcMCc7CisJLyoKKwkgICBTYXZlIHRoZSBGaXJtd2FyZSBWZXJzaW9uIGluIHRoZSBIb3N0IEFkYXB0ZXIgc3RydWN0dXJlLgorCSAqLworCVRhcmdldFBvaW50ZXIgPSBIb3N0QWRhcHRlci0+RmlybXdhcmVWZXJzaW9uOworCSpUYXJnZXRQb2ludGVyKysgPSBCb2FyZElELkZpcm13YXJlVmVyc2lvbjFzdERpZ2l0OworCSpUYXJnZXRQb2ludGVyKysgPSAnLic7CisJKlRhcmdldFBvaW50ZXIrKyA9IEJvYXJkSUQuRmlybXdhcmVWZXJzaW9uMm5kRGlnaXQ7CisJaWYgKEZpcm13YXJlVmVyc2lvbjNyZERpZ2l0ICE9ICcgJyAmJiBGaXJtd2FyZVZlcnNpb24zcmREaWdpdCAhPSAnXDAnKQorCQkqVGFyZ2V0UG9pbnRlcisrID0gRmlybXdhcmVWZXJzaW9uM3JkRGlnaXQ7CisJKlRhcmdldFBvaW50ZXIgPSAnXDAnOworCS8qCisJICAgSXNzdWUgdGhlIElucXVpcmUgRmlybXdhcmUgVmVyc2lvbiBMZXR0ZXIgY29tbWFuZC4KKwkgKi8KKwlpZiAoc3RyY21wKEhvc3RBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb24sICIzLjMiKSA+PSAwKSB7CisJCWlmIChCdXNMb2dpY19Db21tYW5kKEhvc3RBZGFwdGVyLCBCdXNMb2dpY19JbnF1aXJlRmlybXdhcmVWZXJzaW9uTGV0dGVyLCBOVUxMLCAwLCAmRmlybXdhcmVWZXJzaW9uTGV0dGVyLCBzaXplb2YoRmlybXdhcmVWZXJzaW9uTGV0dGVyKSkKKwkJICAgICE9IHNpemVvZihGaXJtd2FyZVZlcnNpb25MZXR0ZXIpKQorCQkJcmV0dXJuIEJ1c0xvZ2ljX0ZhaWx1cmUoSG9zdEFkYXB0ZXIsICJJTlFVSVJFIEZJUk1XQVJFIFZFUlNJT04gTEVUVEVSIik7CisJCWlmIChGaXJtd2FyZVZlcnNpb25MZXR0ZXIgIT0gJyAnICYmIEZpcm13YXJlVmVyc2lvbkxldHRlciAhPSAnXDAnKQorCQkJKlRhcmdldFBvaW50ZXIrKyA9IEZpcm13YXJlVmVyc2lvbkxldHRlcjsKKwkJKlRhcmdldFBvaW50ZXIgPSAnXDAnOworCX0KKwkvKgorCSAgIFNhdmUgdGhlIEhvc3QgQWRhcHRlciBTQ1NJIElEIGluIHRoZSBIb3N0IEFkYXB0ZXIgc3RydWN0dXJlLgorCSAqLworCUhvc3RBZGFwdGVyLT5TQ1NJX0lEID0gQ29uZmlndXJhdGlvbi5Ib3N0QWRhcHRlcklEOworCS8qCisJICAgRGV0ZXJtaW5lIHRoZSBCdXMgVHlwZSBhbmQgc2F2ZSBpdCBpbiB0aGUgSG9zdCBBZGFwdGVyIHN0cnVjdHVyZSwgZGV0ZXJtaW5lCisJICAgYW5kIHNhdmUgdGhlIElSUSBDaGFubmVsIGlmIG5lY2Vzc2FyeSwgYW5kIGRldGVybWluZSBhbmQgc2F2ZSB0aGUgRE1BCisJICAgQ2hhbm5lbCBmb3IgSVNBIEhvc3QgQWRhcHRlcnMuCisJICovCisJSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyQnVzVHlwZSA9IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyQnVzVHlwZXNbSG9zdEFkYXB0ZXItPk1vZGVsTmFtZVszXSAtICc0J107CisJaWYgKEhvc3RBZGFwdGVyLT5JUlFfQ2hhbm5lbCA9PSAwKSB7CisJCWlmIChDb25maWd1cmF0aW9uLklSUV9DaGFubmVsOSkKKwkJCUhvc3RBZGFwdGVyLT5JUlFfQ2hhbm5lbCA9IDk7CisJCWVsc2UgaWYgKENvbmZpZ3VyYXRpb24uSVJRX0NoYW5uZWwxMCkKKwkJCUhvc3RBZGFwdGVyLT5JUlFfQ2hhbm5lbCA9IDEwOworCQllbHNlIGlmIChDb25maWd1cmF0aW9uLklSUV9DaGFubmVsMTEpCisJCQlIb3N0QWRhcHRlci0+SVJRX0NoYW5uZWwgPSAxMTsKKwkJZWxzZSBpZiAoQ29uZmlndXJhdGlvbi5JUlFfQ2hhbm5lbDEyKQorCQkJSG9zdEFkYXB0ZXItPklSUV9DaGFubmVsID0gMTI7CisJCWVsc2UgaWYgKENvbmZpZ3VyYXRpb24uSVJRX0NoYW5uZWwxNCkKKwkJCUhvc3RBZGFwdGVyLT5JUlFfQ2hhbm5lbCA9IDE0OworCQllbHNlIGlmIChDb25maWd1cmF0aW9uLklSUV9DaGFubmVsMTUpCisJCQlIb3N0QWRhcHRlci0+SVJRX0NoYW5uZWwgPSAxNTsKKwl9CisJaWYgKEhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckJ1c1R5cGUgPT0gQnVzTG9naWNfSVNBX0J1cykgeworCQlpZiAoQ29uZmlndXJhdGlvbi5ETUFfQ2hhbm5lbDUpCisJCQlIb3N0QWRhcHRlci0+RE1BX0NoYW5uZWwgPSA1OworCQllbHNlIGlmIChDb25maWd1cmF0aW9uLkRNQV9DaGFubmVsNikKKwkJCUhvc3RBZGFwdGVyLT5ETUFfQ2hhbm5lbCA9IDY7CisJCWVsc2UgaWYgKENvbmZpZ3VyYXRpb24uRE1BX0NoYW5uZWw3KQorCQkJSG9zdEFkYXB0ZXItPkRNQV9DaGFubmVsID0gNzsKKwl9CisJLyoKKwkgICBEZXRlcm1pbmUgd2hldGhlciBFeHRlbmRlZCBUcmFuc2xhdGlvbiBpcyBlbmFibGVkIGFuZCBzYXZlIGl0IGluCisJICAgdGhlIEhvc3QgQWRhcHRlciBzdHJ1Y3R1cmUuCisJICovCisJR2VvbWV0cnlSZWdpc3Rlci5BbGwgPSBCdXNMb2dpY19SZWFkR2VvbWV0cnlSZWdpc3RlcihIb3N0QWRhcHRlcik7CisJSG9zdEFkYXB0ZXItPkV4dGVuZGVkVHJhbnNsYXRpb25FbmFibGVkID0gR2VvbWV0cnlSZWdpc3Rlci5nci5FeHRlbmRlZFRyYW5zbGF0aW9uRW5hYmxlZDsKKwkvKgorCSAgIFNhdmUgdGhlIFNjYXR0ZXIgR2F0aGVyIExpbWl0cywgTGV2ZWwgU2Vuc2l0aXZlIEludGVycnVwdCBmbGFnLCBXaWRlCisJICAgU0NTSSBmbGFnLCBEaWZmZXJlbnRpYWwgU0NTSSBmbGFnLCBTQ0FNIFN1cHBvcnRlZCBmbGFnLCBhbmQKKwkgICBVbHRyYSBTQ1NJIGZsYWcgaW4gdGhlIEhvc3QgQWRhcHRlciBzdHJ1Y3R1cmUuCisJICovCisJSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyU2NhdHRlckdhdGhlckxpbWl0ID0gRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uLlNjYXR0ZXJHYXRoZXJMaW1pdDsKKwlIb3N0QWRhcHRlci0+RHJpdmVyU2NhdHRlckdhdGhlckxpbWl0ID0gSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyU2NhdHRlckdhdGhlckxpbWl0OworCWlmIChIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJTY2F0dGVyR2F0aGVyTGltaXQgPiBCdXNMb2dpY19TY2F0dGVyR2F0aGVyTGltaXQpCisJCUhvc3RBZGFwdGVyLT5Ecml2ZXJTY2F0dGVyR2F0aGVyTGltaXQgPSBCdXNMb2dpY19TY2F0dGVyR2F0aGVyTGltaXQ7CisJaWYgKEV4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbi5NaXNjLkxldmVsU2Vuc2l0aXZlSW50ZXJydXB0KQorCQlIb3N0QWRhcHRlci0+TGV2ZWxTZW5zaXRpdmVJbnRlcnJ1cHQgPSB0cnVlOworCUhvc3RBZGFwdGVyLT5Ib3N0V2lkZVNDU0kgPSBFeHRlbmRlZFNldHVwSW5mb3JtYXRpb24uSG9zdFdpZGVTQ1NJOworCUhvc3RBZGFwdGVyLT5Ib3N0RGlmZmVyZW50aWFsU0NTSSA9IEV4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbi5Ib3N0RGlmZmVyZW50aWFsU0NTSTsKKwlIb3N0QWRhcHRlci0+SG9zdFN1cHBvcnRzU0NBTSA9IEV4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbi5Ib3N0U3VwcG9ydHNTQ0FNOworCUhvc3RBZGFwdGVyLT5Ib3N0VWx0cmFTQ1NJID0gRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uLkhvc3RVbHRyYVNDU0k7CisJLyoKKwkgICBEZXRlcm1pbmUgd2hldGhlciBFeHRlbmRlZCBMVU4gRm9ybWF0IENDQnMgYXJlIHN1cHBvcnRlZCBhbmQgc2F2ZSB0aGUKKwkgICBpbmZvcm1hdGlvbiBpbiB0aGUgSG9zdCBBZGFwdGVyIHN0cnVjdHVyZS4KKwkgKi8KKwlpZiAoSG9zdEFkYXB0ZXItPkZpcm13YXJlVmVyc2lvblswXSA9PSAnNScgfHwgKEhvc3RBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb25bMF0gPT0gJzQnICYmIEhvc3RBZGFwdGVyLT5Ib3N0V2lkZVNDU0kpKQorCQlIb3N0QWRhcHRlci0+RXh0ZW5kZWRMVU5TdXBwb3J0ID0gdHJ1ZTsKKwkvKgorCSAgIElzc3VlIHRoZSBJbnF1aXJlIFBDSSBIb3N0IEFkYXB0ZXIgSW5mb3JtYXRpb24gY29tbWFuZCB0byByZWFkIHRoZQorCSAgIFRlcm1pbmF0aW9uIEluZm9ybWF0aW9uIGZyb20gIlciIHNlcmllcyBNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXJzLgorCSAqLworCWlmIChIb3N0QWRhcHRlci0+RmlybXdhcmVWZXJzaW9uWzBdID09ICc1JykgeworCQlpZiAoQnVzTG9naWNfQ29tbWFuZChIb3N0QWRhcHRlciwgQnVzTG9naWNfSW5xdWlyZVBDSUhvc3RBZGFwdGVySW5mb3JtYXRpb24sIE5VTEwsIDAsICZQQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uLCBzaXplb2YoUENJSG9zdEFkYXB0ZXJJbmZvcm1hdGlvbikpCisJCSAgICAhPSBzaXplb2YoUENJSG9zdEFkYXB0ZXJJbmZvcm1hdGlvbikpCisJCQlyZXR1cm4gQnVzTG9naWNfRmFpbHVyZShIb3N0QWRhcHRlciwgIklOUVVJUkUgUENJIEhPU1QgQURBUFRFUiBJTkZPUk1BVElPTiIpOworCQkvKgorCQkgICBTYXZlIHRoZSBUZXJtaW5hdGlvbiBJbmZvcm1hdGlvbiBpbiB0aGUgSG9zdCBBZGFwdGVyIHN0cnVjdHVyZS4KKwkJICovCisJCWlmIChQQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uLkdlbmVyaWNJbmZvVmFsaWQpIHsKKwkJCUhvc3RBZGFwdGVyLT5UZXJtaW5hdGlvbkluZm9WYWxpZCA9IHRydWU7CisJCQlIb3N0QWRhcHRlci0+TG93Qnl0ZVRlcm1pbmF0ZWQgPSBQQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uLkxvd0J5dGVUZXJtaW5hdGVkOworCQkJSG9zdEFkYXB0ZXItPkhpZ2hCeXRlVGVybWluYXRlZCA9IFBDSUhvc3RBZGFwdGVySW5mb3JtYXRpb24uSGlnaEJ5dGVUZXJtaW5hdGVkOworCQl9CisJfQorCS8qCisJICAgSXNzdWUgdGhlIEZldGNoIEhvc3QgQWRhcHRlciBMb2NhbCBSQU0gY29tbWFuZCB0byByZWFkIHRoZSBBdXRvU0NTSSBkYXRhCisJICAgZnJvbSAiVyIgYW5kICJDIiBzZXJpZXMgTXVsdGlNYXN0ZXIgSG9zdCBBZGFwdGVycy4KKwkgKi8KKwlpZiAoSG9zdEFkYXB0ZXItPkZpcm13YXJlVmVyc2lvblswXSA+PSAnNCcpIHsKKwkJRmV0Y2hIb3N0QWRhcHRlckxvY2FsUkFNUmVxdWVzdC5CeXRlT2Zmc2V0ID0gQnVzTG9naWNfQXV0b1NDU0lfQmFzZU9mZnNldDsKKwkJRmV0Y2hIb3N0QWRhcHRlckxvY2FsUkFNUmVxdWVzdC5CeXRlQ291bnQgPSBzaXplb2YoQXV0b1NDU0lEYXRhKTsKKwkJaWYgKEJ1c0xvZ2ljX0NvbW1hbmQoSG9zdEFkYXB0ZXIsIEJ1c0xvZ2ljX0ZldGNoSG9zdEFkYXB0ZXJMb2NhbFJBTSwgJkZldGNoSG9zdEFkYXB0ZXJMb2NhbFJBTVJlcXVlc3QsIHNpemVvZihGZXRjaEhvc3RBZGFwdGVyTG9jYWxSQU1SZXF1ZXN0KSwgJkF1dG9TQ1NJRGF0YSwgc2l6ZW9mKEF1dG9TQ1NJRGF0YSkpCisJCSAgICAhPSBzaXplb2YoQXV0b1NDU0lEYXRhKSkKKwkJCXJldHVybiBCdXNMb2dpY19GYWlsdXJlKEhvc3RBZGFwdGVyLCAiRkVUQ0ggSE9TVCBBREFQVEVSIExPQ0FMIFJBTSIpOworCQkvKgorCQkgICBTYXZlIHRoZSBQYXJpdHkgQ2hlY2tpbmcgRW5hYmxlZCwgQnVzIFJlc2V0IEVuYWJsZWQsIGFuZCBUZXJtaW5hdGlvbgorCQkgICBJbmZvcm1hdGlvbiBpbiB0aGUgSG9zdCBBZGFwdGVyIHN0cnVjdHVyZS4KKwkJICovCisJCUhvc3RBZGFwdGVyLT5QYXJpdHlDaGVja2luZ0VuYWJsZWQgPSBBdXRvU0NTSURhdGEuUGFyaXR5Q2hlY2tpbmdFbmFibGVkOworCQlIb3N0QWRhcHRlci0+QnVzUmVzZXRFbmFibGVkID0gQXV0b1NDU0lEYXRhLkJ1c1Jlc2V0RW5hYmxlZDsKKwkJaWYgKEhvc3RBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb25bMF0gPT0gJzQnKSB7CisJCQlIb3N0QWRhcHRlci0+VGVybWluYXRpb25JbmZvVmFsaWQgPSB0cnVlOworCQkJSG9zdEFkYXB0ZXItPkxvd0J5dGVUZXJtaW5hdGVkID0gQXV0b1NDU0lEYXRhLkxvd0J5dGVUZXJtaW5hdGVkOworCQkJSG9zdEFkYXB0ZXItPkhpZ2hCeXRlVGVybWluYXRlZCA9IEF1dG9TQ1NJRGF0YS5IaWdoQnl0ZVRlcm1pbmF0ZWQ7CisJCX0KKwkJLyoKKwkJICAgU2F2ZSB0aGUgV2lkZSBQZXJtaXR0ZWQsIEZhc3QgUGVybWl0dGVkLCBTeW5jaHJvbm91cyBQZXJtaXR0ZWQsCisJCSAgIERpc2Nvbm5lY3QgUGVybWl0dGVkLCBVbHRyYSBQZXJtaXR0ZWQsIGFuZCBTQ0FNIEluZm9ybWF0aW9uIGluIHRoZQorCQkgICBIb3N0IEFkYXB0ZXIgc3RydWN0dXJlLgorCQkgKi8KKwkJSG9zdEFkYXB0ZXItPldpZGVQZXJtaXR0ZWQgPSBBdXRvU0NTSURhdGEuV2lkZVBlcm1pdHRlZDsKKwkJSG9zdEFkYXB0ZXItPkZhc3RQZXJtaXR0ZWQgPSBBdXRvU0NTSURhdGEuRmFzdFBlcm1pdHRlZDsKKwkJSG9zdEFkYXB0ZXItPlN5bmNocm9ub3VzUGVybWl0dGVkID0gQXV0b1NDU0lEYXRhLlN5bmNocm9ub3VzUGVybWl0dGVkOworCQlIb3N0QWRhcHRlci0+RGlzY29ubmVjdFBlcm1pdHRlZCA9IEF1dG9TQ1NJRGF0YS5EaXNjb25uZWN0UGVybWl0dGVkOworCQlpZiAoSG9zdEFkYXB0ZXItPkhvc3RVbHRyYVNDU0kpCisJCQlIb3N0QWRhcHRlci0+VWx0cmFQZXJtaXR0ZWQgPSBBdXRvU0NTSURhdGEuVWx0cmFQZXJtaXR0ZWQ7CisJCWlmIChIb3N0QWRhcHRlci0+SG9zdFN1cHBvcnRzU0NBTSkgeworCQkJSG9zdEFkYXB0ZXItPlNDQU1fRW5hYmxlZCA9IEF1dG9TQ1NJRGF0YS5TQ0FNX0VuYWJsZWQ7CisJCQlIb3N0QWRhcHRlci0+U0NBTV9MZXZlbDIgPSBBdXRvU0NTSURhdGEuU0NBTV9MZXZlbDI7CisJCX0KKwl9CisJLyoKKwkgICBJbml0aWFsaXplIGZpZWxkcyBpbiB0aGUgSG9zdCBBZGFwdGVyIHN0cnVjdHVyZSBmb3IgIlMiIGFuZCAiQSIgc2VyaWVzCisJICAgTXVsdGlNYXN0ZXIgSG9zdCBBZGFwdGVycy4KKwkgKi8KKwlpZiAoSG9zdEFkYXB0ZXItPkZpcm13YXJlVmVyc2lvblswXSA8ICc0JykgeworCQlpZiAoU2V0dXBJbmZvcm1hdGlvbi5TeW5jaHJvbm91c0luaXRpYXRpb25FbmFibGVkKSB7CisJCQlIb3N0QWRhcHRlci0+U3luY2hyb25vdXNQZXJtaXR0ZWQgPSAweEZGOworCQkJaWYgKEhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckJ1c1R5cGUgPT0gQnVzTG9naWNfRUlTQV9CdXMpIHsKKwkJCQlpZiAoRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uLk1pc2MuRmFzdE9uRUlTQSkKKwkJCQkJSG9zdEFkYXB0ZXItPkZhc3RQZXJtaXR0ZWQgPSAweEZGOworCQkJCWlmIChzdHJjbXAoSG9zdEFkYXB0ZXItPk1vZGVsTmFtZSwgIkJULTc1NyIpID09IDApCisJCQkJCUhvc3RBZGFwdGVyLT5XaWRlUGVybWl0dGVkID0gMHhGRjsKKwkJCX0KKwkJfQorCQlIb3N0QWRhcHRlci0+RGlzY29ubmVjdFBlcm1pdHRlZCA9IDB4RkY7CisJCUhvc3RBZGFwdGVyLT5QYXJpdHlDaGVja2luZ0VuYWJsZWQgPSBTZXR1cEluZm9ybWF0aW9uLlBhcml0eUNoZWNraW5nRW5hYmxlZDsKKwkJSG9zdEFkYXB0ZXItPkJ1c1Jlc2V0RW5hYmxlZCA9IHRydWU7CisJfQorCS8qCisJICAgRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIG51bWJlciBvZiBUYXJnZXQgSURzIGFuZCBMb2dpY2FsIFVuaXRzIHN1cHBvcnRlZCBieQorCSAgIHRoaXMgZHJpdmVyIGZvciBXaWRlIGFuZCBOYXJyb3cgSG9zdCBBZGFwdGVycy4KKwkgKi8KKwlIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlcyA9IChIb3N0QWRhcHRlci0+SG9zdFdpZGVTQ1NJID8gMTYgOiA4KTsKKwlIb3N0QWRhcHRlci0+TWF4TG9naWNhbFVuaXRzID0gKEhvc3RBZGFwdGVyLT5FeHRlbmRlZExVTlN1cHBvcnQgPyAzMiA6IDgpOworCS8qCisJICAgU2VsZWN0IGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgdGhlIE1haWxib3ggQ291bnQsIERyaXZlciBRdWV1ZSBEZXB0aCwKKwkgICBJbml0aWFsIENDQnMsIGFuZCBJbmNyZW1lbnRhbCBDQ0JzIHZhcmlhYmxlcyBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCBTdHJpY3QKKwkgICBSb3VuZCBSb2JpbiBNb2RlIGlzIHN1cHBvcnRlZC4gIElmIFN0cmljdCBSb3VuZCBSb2JpbiBNb2RlIGlzIHN1cHBvcnRlZCwKKwkgICB0aGVuIHRoZXJlIGlzIG5vIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGluIHVzaW5nIHRoZSBtYXhpbXVtIHBvc3NpYmxlCisJICAgbnVtYmVyIG9mIE91dGdvaW5nIGFuZCBJbmNvbWluZyBNYWlsYm94ZXMgYW5kIGFsbG93aW5nIHRoZSBUYWdnZWQgYW5kCisJICAgVW50YWdnZWQgUXVldWUgRGVwdGhzIHRvIGRldGVybWluZSB0aGUgYWN0dWFsIHV0aWxpemF0aW9uLiAgSWYgU3RyaWN0IFJvdW5kCisJICAgUm9iaW4gTW9kZSBpcyBub3Qgc3VwcG9ydGVkLCB0aGVuIHRoZSBIb3N0IEFkYXB0ZXIgbXVzdCBzY2FuIGFsbCB0aGUKKwkgICBPdXRnb2luZyBNYWlsYm94ZXMgd2hlbmV2ZXIgYW4gT3V0Z29pbmcgTWFpbGJveCBlbnRyeSBpcyBtYWRlLCB3aGljaCBjYW4KKwkgICBjYXVzZSBhIHN1YnN0YW50aWFsIHBlcmZvcm1hbmNlIHBlbmFsdHkuICBUaGUgaG9zdCBhZGFwdGVycyBhY3R1YWxseSBoYXZlCisJICAgcm9vbSB0byBzdG9yZSB0aGUgZm9sbG93aW5nIG51bWJlciBvZiBDQ0JzIGludGVybmFsbHk7IHRoYXQgaXMsIHRoZXkgY2FuCisJICAgaW50ZXJuYWxseSBxdWV1ZSBhbmQgbWFuYWdlIHRoaXMgbWFueSBhY3RpdmUgY29tbWFuZHMgb24gdGhlIFNDU0kgYnVzCisJICAgc2ltdWx0YW5lb3VzbHkuICBQZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMgZGVtb25zdHJhdGUgdGhhdCB0aGUgRHJpdmVyIFF1ZXVlCisJICAgRGVwdGggc2hvdWxkIGJlIHNldCB0byB0aGUgTWFpbGJveCBDb3VudCwgcmF0aGVyIHRoYW4gdGhlIEhvc3QgQWRhcHRlcgorCSAgIFF1ZXVlIERlcHRoIChpbnRlcm5hbCBDQ0IgY2FwYWNpdHkpLCBhcyBpdCBpcyBtb3JlIGVmZmljaWVudCB0byBoYXZlIHRoZQorCSAgIHF1ZXVlZCBjb21tYW5kcyB3YWl0aW5nIGluIE91dGdvaW5nIE1haWxib3hlcyBpZiBuZWNlc3NhcnkgdGhhbiB0byBibG9jaworCSAgIHRoZSBwcm9jZXNzIGluIHRoZSBoaWdoZXIgbGV2ZWxzIG9mIHRoZSBTQ1NJIFN1YnN5c3RlbS4KKworCSAgIDE5MiAgICAgICAgICBCVC05NDgvOTU4Lzk1OEQKKwkgICAxMDAgICAgICAgICAgQlQtOTQ2Qy85NTZDLzk1NkNELzc0N0MvNzU3Qy83NTdDRC80NDVDCisJICAgNTAgICBCVC01NDVDLzU0MENGCisJICAgMzAgICBCVC03NDdTLzc0N0QvNzU3Uy83NTdELzQ0NVMvNTQ1Uy81NDJELzU0MkIvNzQyQQorCSAqLworCWlmIChIb3N0QWRhcHRlci0+RmlybXdhcmVWZXJzaW9uWzBdID09ICc1JykKKwkJSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyUXVldWVEZXB0aCA9IDE5MjsKKwllbHNlIGlmIChIb3N0QWRhcHRlci0+RmlybXdhcmVWZXJzaW9uWzBdID09ICc0JykKKwkJSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyUXVldWVEZXB0aCA9IChIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJCdXNUeXBlICE9IEJ1c0xvZ2ljX0lTQV9CdXMgPyAxMDAgOiA1MCk7CisJZWxzZQorCQlIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJRdWV1ZURlcHRoID0gMzA7CisJaWYgKHN0cmNtcChIb3N0QWRhcHRlci0+RmlybXdhcmVWZXJzaW9uLCAiMy4zMSIpID49IDApIHsKKwkJSG9zdEFkYXB0ZXItPlN0cmljdFJvdW5kUm9iaW5Nb2RlU3VwcG9ydCA9IHRydWU7CisJCUhvc3RBZGFwdGVyLT5NYWlsYm94Q291bnQgPSBCdXNMb2dpY19NYXhNYWlsYm94ZXM7CisJfSBlbHNlIHsKKwkJSG9zdEFkYXB0ZXItPlN0cmljdFJvdW5kUm9iaW5Nb2RlU3VwcG9ydCA9IGZhbHNlOworCQlIb3N0QWRhcHRlci0+TWFpbGJveENvdW50ID0gMzI7CisJfQorCUhvc3RBZGFwdGVyLT5Ecml2ZXJRdWV1ZURlcHRoID0gSG9zdEFkYXB0ZXItPk1haWxib3hDb3VudDsKKwlIb3N0QWRhcHRlci0+SW5pdGlhbENDQnMgPSA0ICogQnVzTG9naWNfQ0NCX0FsbG9jYXRpb25Hcm91cFNpemU7CisJSG9zdEFkYXB0ZXItPkluY3JlbWVudGFsQ0NCcyA9IEJ1c0xvZ2ljX0NDQl9BbGxvY2F0aW9uR3JvdXBTaXplOworCS8qCisJICAgVGFnZ2VkIFF1ZXVpbmcgc3VwcG9ydCBpcyBhdmFpbGFibGUgYW5kIG9wZXJhdGVzIHByb3Blcmx5IG9uIGFsbCAiVyIgc2VyaWVzCisJICAgTXVsdGlNYXN0ZXIgSG9zdCBBZGFwdGVycywgb24gIkMiIHNlcmllcyBNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXJzIHdpdGgKKwkgICBmaXJtd2FyZSB2ZXJzaW9uIDQuMjIgYW5kIGFib3ZlLCBhbmQgb24gIlMiIHNlcmllcyBNdWx0aU1hc3RlciBIb3N0CisJICAgQWRhcHRlcnMgd2l0aCBmaXJtd2FyZSB2ZXJzaW9uIDMuMzUgYW5kIGFib3ZlLgorCSAqLworCUhvc3RBZGFwdGVyLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkID0gMDsKKwlzd2l0Y2ggKEhvc3RBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb25bMF0pIHsKKwljYXNlICc1JzoKKwkJSG9zdEFkYXB0ZXItPlRhZ2dlZFF1ZXVpbmdQZXJtaXR0ZWQgPSAweEZGRkY7CisJCWJyZWFrOworCWNhc2UgJzQnOgorCQlpZiAoc3RyY21wKEhvc3RBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb24sICI0LjIyIikgPj0gMCkKKwkJCUhvc3RBZGFwdGVyLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkID0gMHhGRkZGOworCQlicmVhazsKKwljYXNlICczJzoKKwkJaWYgKHN0cmNtcChIb3N0QWRhcHRlci0+RmlybXdhcmVWZXJzaW9uLCAiMy4zNSIpID49IDApCisJCQlIb3N0QWRhcHRlci0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZCA9IDB4RkZGRjsKKwkJYnJlYWs7CisJfQorCS8qCisJICAgRGV0ZXJtaW5lIHRoZSBIb3N0IEFkYXB0ZXIgQklPUyBBZGRyZXNzIGlmIHRoZSBCSU9TIGlzIGVuYWJsZWQgYW5kCisJICAgc2F2ZSBpdCBpbiB0aGUgSG9zdCBBZGFwdGVyIHN0cnVjdHVyZS4gIFRoZSBCSU9TIGlzIGRpc2FibGVkIGlmIHRoZQorCSAgIEJJT1NfQWRkcmVzcyBpcyAwLgorCSAqLworCUhvc3RBZGFwdGVyLT5CSU9TX0FkZHJlc3MgPSBFeHRlbmRlZFNldHVwSW5mb3JtYXRpb24uQklPU19BZGRyZXNzIDw8IDEyOworCS8qCisJICAgSVNBIEhvc3QgQWRhcHRlcnMgcmVxdWlyZSBCb3VuY2UgQnVmZmVycyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gMTZNQiBtZW1vcnkuCisJICovCisJaWYgKEhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckJ1c1R5cGUgPT0gQnVzTG9naWNfSVNBX0J1cyAmJiAodm9pZCAqKSBoaWdoX21lbW9yeSA+ICh2b2lkICopIE1BWF9ETUFfQUREUkVTUykKKwkJSG9zdEFkYXB0ZXItPkJvdW5jZUJ1ZmZlcnNSZXF1aXJlZCA9IHRydWU7CisJLyoKKwkgICBCdXNMb2dpYyBCVC00NDVTIEhvc3QgQWRhcHRlcnMgcHJpb3IgdG8gYm9hcmQgcmV2aXNpb24gRSBoYXZlIGEgaGFyZHdhcmUKKwkgICBidWcgd2hlcmVieSB3aGVuIHRoZSBCSU9TIGlzIGVuYWJsZWQsIHRyYW5zZmVycyB0by9mcm9tIHRoZSBzYW1lIGFkZHJlc3MKKwkgICByYW5nZSB0aGUgQklPUyBvY2N1cGllcyBtb2R1bG8gMTZNQiBhcmUgaGFuZGxlZCBpbmNvcnJlY3RseS4gIE9ubHkgcHJvcGVybHkKKwkgICBmdW5jdGlvbmluZyBCVC00NDVTIEhvc3QgQWRhcHRlcnMgaGF2ZSBmaXJtd2FyZSB2ZXJzaW9uIDMuMzcsIHNvIHJlcXVpcmUKKwkgICB0aGF0IElTQSBCb3VuY2UgQnVmZmVycyBiZSB1c2VkIGZvciB0aGUgYnVnZ3kgQlQtNDQ1UyBtb2RlbHMgaWYgdGhlcmUgaXMKKwkgICBtb3JlIHRoYW4gMTZNQiBtZW1vcnkuCisJICovCisJaWYgKEhvc3RBZGFwdGVyLT5CSU9TX0FkZHJlc3MgPiAwICYmIHN0cmNtcChIb3N0QWRhcHRlci0+TW9kZWxOYW1lLCAiQlQtNDQ1UyIpID09IDAgJiYgc3RyY21wKEhvc3RBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb24sICIzLjM3IikgPCAwICYmICh2b2lkICopIGhpZ2hfbWVtb3J5ID4gKHZvaWQgKikgTUFYX0RNQV9BRERSRVNTKQorCQlIb3N0QWRhcHRlci0+Qm91bmNlQnVmZmVyc1JlcXVpcmVkID0gdHJ1ZTsKKwkvKgorCSAgIEluaXRpYWxpemUgcGFyYW1ldGVycyBjb21tb24gdG8gTXVsdGlNYXN0ZXIgYW5kIEZsYXNoUG9pbnQgSG9zdCBBZGFwdGVycy4KKwkgKi8KKyAgICAgIENvbW1vbjoKKwkvKgorCSAgIEluaXRpYWxpemUgdGhlIEhvc3QgQWRhcHRlciBGdWxsIE1vZGVsIE5hbWUgZnJvbSB0aGUgTW9kZWwgTmFtZS4KKwkgKi8KKwlzdHJjcHkoSG9zdEFkYXB0ZXItPkZ1bGxNb2RlbE5hbWUsICJCdXNMb2dpYyAiKTsKKwlzdHJjYXQoSG9zdEFkYXB0ZXItPkZ1bGxNb2RlbE5hbWUsIEhvc3RBZGFwdGVyLT5Nb2RlbE5hbWUpOworCS8qCisJICAgU2VsZWN0IGFuIGFwcHJvcHJpYXRlIHZhbHVlIGZvciB0aGUgVGFnZ2VkIFF1ZXVlIERlcHRoIGVpdGhlciBmcm9tIGEKKwkgICBCdXNMb2dpYyBEcml2ZXIgT3B0aW9ucyBzcGVjaWZpY2F0aW9uLCBvciBiYXNlZCBvbiB3aGV0aGVyIHRoaXMgSG9zdAorCSAgIEFkYXB0ZXIgcmVxdWlyZXMgdGhhdCBJU0EgQm91bmNlIEJ1ZmZlcnMgYmUgdXNlZC4gIFRoZSBUYWdnZWQgUXVldWUgRGVwdGgKKwkgICBpcyBsZWZ0IGF0IDAgZm9yIGF1dG9tYXRpYyBkZXRlcm1pbmF0aW9uIGluIEJ1c0xvZ2ljX1NlbGVjdFF1ZXVlRGVwdGhzLgorCSAgIEluaXRpYWxpemUgdGhlIFVudGFnZ2VkIFF1ZXVlIERlcHRoLgorCSAqLworCWZvciAoVGFyZ2V0SUQgPSAwOyBUYXJnZXRJRCA8IEJ1c0xvZ2ljX01heFRhcmdldERldmljZXM7IFRhcmdldElEKyspIHsKKwkJdW5zaWduZWQgY2hhciBRdWV1ZURlcHRoID0gMDsKKwkJaWYgKEhvc3RBZGFwdGVyLT5Ecml2ZXJPcHRpb25zICE9IE5VTEwgJiYgSG9zdEFkYXB0ZXItPkRyaXZlck9wdGlvbnMtPlF1ZXVlRGVwdGhbVGFyZ2V0SURdID4gMCkKKwkJCVF1ZXVlRGVwdGggPSBIb3N0QWRhcHRlci0+RHJpdmVyT3B0aW9ucy0+UXVldWVEZXB0aFtUYXJnZXRJRF07CisJCWVsc2UgaWYgKEhvc3RBZGFwdGVyLT5Cb3VuY2VCdWZmZXJzUmVxdWlyZWQpCisJCQlRdWV1ZURlcHRoID0gQnVzTG9naWNfVGFnZ2VkUXVldWVEZXB0aEJCOworCQlIb3N0QWRhcHRlci0+UXVldWVEZXB0aFtUYXJnZXRJRF0gPSBRdWV1ZURlcHRoOworCX0KKwlpZiAoSG9zdEFkYXB0ZXItPkJvdW5jZUJ1ZmZlcnNSZXF1aXJlZCkKKwkJSG9zdEFkYXB0ZXItPlVudGFnZ2VkUXVldWVEZXB0aCA9IEJ1c0xvZ2ljX1VudGFnZ2VkUXVldWVEZXB0aEJCOworCWVsc2UKKwkJSG9zdEFkYXB0ZXItPlVudGFnZ2VkUXVldWVEZXB0aCA9IEJ1c0xvZ2ljX1VudGFnZ2VkUXVldWVEZXB0aDsKKwlpZiAoSG9zdEFkYXB0ZXItPkRyaXZlck9wdGlvbnMgIT0gTlVMTCkKKwkJSG9zdEFkYXB0ZXItPkNvbW1vblF1ZXVlRGVwdGggPSBIb3N0QWRhcHRlci0+RHJpdmVyT3B0aW9ucy0+Q29tbW9uUXVldWVEZXB0aDsKKwlpZiAoSG9zdEFkYXB0ZXItPkNvbW1vblF1ZXVlRGVwdGggPiAwICYmIEhvc3RBZGFwdGVyLT5Db21tb25RdWV1ZURlcHRoIDwgSG9zdEFkYXB0ZXItPlVudGFnZ2VkUXVldWVEZXB0aCkKKwkJSG9zdEFkYXB0ZXItPlVudGFnZ2VkUXVldWVEZXB0aCA9IEhvc3RBZGFwdGVyLT5Db21tb25RdWV1ZURlcHRoOworCS8qCisJICAgVGFnZ2VkIFF1ZXVpbmcgaXMgb25seSBhbGxvd2VkIGlmIERpc2Nvbm5lY3QvUmVjb25uZWN0IGlzIHBlcm1pdHRlZC4KKwkgICBUaGVyZWZvcmUsIG1hc2sgdGhlIFRhZ2dlZCBRdWV1aW5nIFBlcm1pdHRlZCBEZWZhdWx0IGJpdHMgd2l0aCB0aGUKKwkgICBEaXNjb25uZWN0L1JlY29ubmVjdCBQZXJtaXR0ZWQgYml0cy4KKwkgKi8KKwlIb3N0QWRhcHRlci0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZCAmPSBIb3N0QWRhcHRlci0+RGlzY29ubmVjdFBlcm1pdHRlZDsKKwkvKgorCSAgIENvbWJpbmUgdGhlIGRlZmF1bHQgVGFnZ2VkIFF1ZXVpbmcgUGVybWl0dGVkIGJpdHMgd2l0aCBhbnkgQnVzTG9naWMgRHJpdmVyCisJICAgT3B0aW9ucyBUYWdnZWQgUXVldWluZyBzcGVjaWZpY2F0aW9uLgorCSAqLworCWlmIChIb3N0QWRhcHRlci0+RHJpdmVyT3B0aW9ucyAhPSBOVUxMKQorCQlIb3N0QWRhcHRlci0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZCA9CisJCSAgICAoSG9zdEFkYXB0ZXItPkRyaXZlck9wdGlvbnMtPlRhZ2dlZFF1ZXVpbmdQZXJtaXR0ZWQgJiBIb3N0QWRhcHRlci0+RHJpdmVyT3B0aW9ucy0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZE1hc2spIHwgKEhvc3RBZGFwdGVyLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkICYgfkhvc3RBZGFwdGVyLT5Ecml2ZXJPcHRpb25zLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkTWFzayk7CisKKwkvKgorCSAgIFNlbGVjdCBhbiBhcHByb3ByaWF0ZSB2YWx1ZSBmb3IgQnVzIFNldHRsZSBUaW1lIGVpdGhlciBmcm9tIGEgQnVzTG9naWMKKwkgICBEcml2ZXIgT3B0aW9ucyBzcGVjaWZpY2F0aW9uLCBvciBmcm9tIEJ1c0xvZ2ljX0RlZmF1bHRCdXNTZXR0bGVUaW1lLgorCSAqLworCWlmIChIb3N0QWRhcHRlci0+RHJpdmVyT3B0aW9ucyAhPSBOVUxMICYmIEhvc3RBZGFwdGVyLT5Ecml2ZXJPcHRpb25zLT5CdXNTZXR0bGVUaW1lID4gMCkKKwkJSG9zdEFkYXB0ZXItPkJ1c1NldHRsZVRpbWUgPSBIb3N0QWRhcHRlci0+RHJpdmVyT3B0aW9ucy0+QnVzU2V0dGxlVGltZTsKKwllbHNlCisJCUhvc3RBZGFwdGVyLT5CdXNTZXR0bGVUaW1lID0gQnVzTG9naWNfRGVmYXVsdEJ1c1NldHRsZVRpbWU7CisJLyoKKwkgICBJbmRpY2F0ZSByZWFkaW5nIHRoZSBIb3N0IEFkYXB0ZXIgQ29uZmlndXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorCSAqLworCXJldHVybiB0cnVlOworfQorCisKKy8qCisgIEJ1c0xvZ2ljX1JlcG9ydEhvc3RBZGFwdGVyQ29uZmlndXJhdGlvbiByZXBvcnRzIHRoZSBjb25maWd1cmF0aW9uIG9mCisgIEhvc3QgQWRhcHRlci4KKyovCisKK3N0YXRpYyBib29sZWFuIF9faW5pdCBCdXNMb2dpY19SZXBvcnRIb3N0QWRhcHRlckNvbmZpZ3VyYXRpb24oc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyCisJCQkJCQkJICAgICAgKkhvc3RBZGFwdGVyKQoreworCXVuc2lnbmVkIHNob3J0IEFsbFRhcmdldHNNYXNrID0gKDEgPDwgSG9zdEFkYXB0ZXItPk1heFRhcmdldERldmljZXMpIC0gMTsKKwl1bnNpZ25lZCBzaG9ydCBTeW5jaHJvbm91c1Blcm1pdHRlZCwgRmFzdFBlcm1pdHRlZDsKKwl1bnNpZ25lZCBzaG9ydCBVbHRyYVBlcm1pdHRlZCwgV2lkZVBlcm1pdHRlZDsKKwl1bnNpZ25lZCBzaG9ydCBEaXNjb25uZWN0UGVybWl0dGVkLCBUYWdnZWRRdWV1aW5nUGVybWl0dGVkOworCWJvb2xlYW4gQ29tbW9uU3luY2hyb25vdXNOZWdvdGlhdGlvbiwgQ29tbW9uVGFnZ2VkUXVldWVEZXB0aDsKKwljaGFyIFN5bmNocm9ub3VzU3RyaW5nW0J1c0xvZ2ljX01heFRhcmdldERldmljZXMgKyAxXTsKKwljaGFyIFdpZGVTdHJpbmdbQnVzTG9naWNfTWF4VGFyZ2V0RGV2aWNlcyArIDFdOworCWNoYXIgRGlzY29ubmVjdFN0cmluZ1tCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzICsgMV07CisJY2hhciBUYWdnZWRRdWV1aW5nU3RyaW5nW0J1c0xvZ2ljX01heFRhcmdldERldmljZXMgKyAxXTsKKwljaGFyICpTeW5jaHJvbm91c01lc3NhZ2UgPSBTeW5jaHJvbm91c1N0cmluZzsKKwljaGFyICpXaWRlTWVzc2FnZSA9IFdpZGVTdHJpbmc7CisJY2hhciAqRGlzY29ubmVjdE1lc3NhZ2UgPSBEaXNjb25uZWN0U3RyaW5nOworCWNoYXIgKlRhZ2dlZFF1ZXVpbmdNZXNzYWdlID0gVGFnZ2VkUXVldWluZ1N0cmluZzsKKwlpbnQgVGFyZ2V0SUQ7CisJQnVzTG9naWNfSW5mbygiQ29uZmlndXJpbmcgQnVzTG9naWMgTW9kZWwgJXMgJXMlcyVzJXMgU0NTSSBIb3N0IEFkYXB0ZXJcbiIsCisJCSAgICAgIEhvc3RBZGFwdGVyLCBIb3N0QWRhcHRlci0+TW9kZWxOYW1lLAorCQkgICAgICBCdXNMb2dpY19Ib3N0QWRhcHRlckJ1c05hbWVzW0hvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckJ1c1R5cGVdLCAoSG9zdEFkYXB0ZXItPkhvc3RXaWRlU0NTSSA/ICIgV2lkZSIgOiAiIiksIChIb3N0QWRhcHRlci0+SG9zdERpZmZlcmVudGlhbFNDU0kgPyAiIERpZmZlcmVudGlhbCIgOiAiIiksIChIb3N0QWRhcHRlci0+SG9zdFVsdHJhU0NTSSA/ICIgVWx0cmEiIDogIiIpKTsKKwlCdXNMb2dpY19JbmZvKCIgIEZpcm13YXJlIFZlcnNpb246ICVzLCBJL08gQWRkcmVzczogMHglWCwgIiAiSVJRIENoYW5uZWw6ICVkLyVzXG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPkZpcm13YXJlVmVyc2lvbiwgSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MsIEhvc3RBZGFwdGVyLT5JUlFfQ2hhbm5lbCwgKEhvc3RBZGFwdGVyLT5MZXZlbFNlbnNpdGl2ZUludGVycnVwdCA/ICJMZXZlbCIgOiAiRWRnZSIpKTsKKwlpZiAoSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyQnVzVHlwZSAhPSBCdXNMb2dpY19QQ0lfQnVzKSB7CisJCUJ1c0xvZ2ljX0luZm8oIiAgRE1BIENoYW5uZWw6ICIsIEhvc3RBZGFwdGVyKTsKKwkJaWYgKEhvc3RBZGFwdGVyLT5ETUFfQ2hhbm5lbCA+IDApCisJCQlCdXNMb2dpY19JbmZvKCIlZCwgIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5ETUFfQ2hhbm5lbCk7CisJCWVsc2UKKwkJCUJ1c0xvZ2ljX0luZm8oIk5vbmUsICIsIEhvc3RBZGFwdGVyKTsKKwkJaWYgKEhvc3RBZGFwdGVyLT5CSU9TX0FkZHJlc3MgPiAwKQorCQkJQnVzTG9naWNfSW5mbygiQklPUyBBZGRyZXNzOiAweCVYLCAiLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPkJJT1NfQWRkcmVzcyk7CisJCWVsc2UKKwkJCUJ1c0xvZ2ljX0luZm8oIkJJT1MgQWRkcmVzczogTm9uZSwgIiwgSG9zdEFkYXB0ZXIpOworCX0gZWxzZSB7CisJCUJ1c0xvZ2ljX0luZm8oIiAgUENJIEJ1czogJWQsIERldmljZTogJWQsIEFkZHJlc3M6ICIsIEhvc3RBZGFwdGVyLCBIb3N0QWRhcHRlci0+QnVzLCBIb3N0QWRhcHRlci0+RGV2aWNlKTsKKwkJaWYgKEhvc3RBZGFwdGVyLT5QQ0lfQWRkcmVzcyA+IDApCisJCQlCdXNMb2dpY19JbmZvKCIweCVYLCAiLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPlBDSV9BZGRyZXNzKTsKKwkJZWxzZQorCQkJQnVzTG9naWNfSW5mbygiVW5hc3NpZ25lZCwgIiwgSG9zdEFkYXB0ZXIpOworCX0KKwlCdXNMb2dpY19JbmZvKCJIb3N0IEFkYXB0ZXIgU0NTSSBJRDogJWRcbiIsIEhvc3RBZGFwdGVyLCBIb3N0QWRhcHRlci0+U0NTSV9JRCk7CisJQnVzTG9naWNfSW5mbygiICBQYXJpdHkgQ2hlY2tpbmc6ICVzLCBFeHRlbmRlZCBUcmFuc2xhdGlvbjogJXNcbiIsIEhvc3RBZGFwdGVyLCAoSG9zdEFkYXB0ZXItPlBhcml0eUNoZWNraW5nRW5hYmxlZCA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpLCAoSG9zdEFkYXB0ZXItPkV4dGVuZGVkVHJhbnNsYXRpb25FbmFibGVkID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIikpOworCUFsbFRhcmdldHNNYXNrICY9IH4oMSA8PCBIb3N0QWRhcHRlci0+U0NTSV9JRCk7CisJU3luY2hyb25vdXNQZXJtaXR0ZWQgPSBIb3N0QWRhcHRlci0+U3luY2hyb25vdXNQZXJtaXR0ZWQgJiBBbGxUYXJnZXRzTWFzazsKKwlGYXN0UGVybWl0dGVkID0gSG9zdEFkYXB0ZXItPkZhc3RQZXJtaXR0ZWQgJiBBbGxUYXJnZXRzTWFzazsKKwlVbHRyYVBlcm1pdHRlZCA9IEhvc3RBZGFwdGVyLT5VbHRyYVBlcm1pdHRlZCAmIEFsbFRhcmdldHNNYXNrOworCWlmICgoQnVzTG9naWNfTXVsdGlNYXN0ZXJIb3N0QWRhcHRlclAoSG9zdEFkYXB0ZXIpICYmIChIb3N0QWRhcHRlci0+RmlybXdhcmVWZXJzaW9uWzBdID49ICc0JyB8fCBIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJCdXNUeXBlID09IEJ1c0xvZ2ljX0VJU0FfQnVzKSkgfHwgQnVzTG9naWNfRmxhc2hQb2ludEhvc3RBZGFwdGVyUChIb3N0QWRhcHRlcikpIHsKKwkJQ29tbW9uU3luY2hyb25vdXNOZWdvdGlhdGlvbiA9IGZhbHNlOworCQlpZiAoU3luY2hyb25vdXNQZXJtaXR0ZWQgPT0gMCkgeworCQkJU3luY2hyb25vdXNNZXNzYWdlID0gIkRpc2FibGVkIjsKKwkJCUNvbW1vblN5bmNocm9ub3VzTmVnb3RpYXRpb24gPSB0cnVlOworCQl9IGVsc2UgaWYgKFN5bmNocm9ub3VzUGVybWl0dGVkID09IEFsbFRhcmdldHNNYXNrKSB7CisJCQlpZiAoRmFzdFBlcm1pdHRlZCA9PSAwKSB7CisJCQkJU3luY2hyb25vdXNNZXNzYWdlID0gIlNsb3ciOworCQkJCUNvbW1vblN5bmNocm9ub3VzTmVnb3RpYXRpb24gPSB0cnVlOworCQkJfSBlbHNlIGlmIChGYXN0UGVybWl0dGVkID09IEFsbFRhcmdldHNNYXNrKSB7CisJCQkJaWYgKFVsdHJhUGVybWl0dGVkID09IDApIHsKKwkJCQkJU3luY2hyb25vdXNNZXNzYWdlID0gIkZhc3QiOworCQkJCQlDb21tb25TeW5jaHJvbm91c05lZ290aWF0aW9uID0gdHJ1ZTsKKwkJCQl9IGVsc2UgaWYgKFVsdHJhUGVybWl0dGVkID09IEFsbFRhcmdldHNNYXNrKSB7CisJCQkJCVN5bmNocm9ub3VzTWVzc2FnZSA9ICJVbHRyYSI7CisJCQkJCUNvbW1vblN5bmNocm9ub3VzTmVnb3RpYXRpb24gPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoIUNvbW1vblN5bmNocm9ub3VzTmVnb3RpYXRpb24pIHsKKwkJCWZvciAoVGFyZ2V0SUQgPSAwOyBUYXJnZXRJRCA8IEhvc3RBZGFwdGVyLT5NYXhUYXJnZXREZXZpY2VzOyBUYXJnZXRJRCsrKQorCQkJCVN5bmNocm9ub3VzU3RyaW5nW1RhcmdldElEXSA9ICgoIShTeW5jaHJvbm91c1Blcm1pdHRlZCAmICgxIDw8IFRhcmdldElEKSkpID8gJ04nIDogKCEoRmFzdFBlcm1pdHRlZCAmICgxIDw8IFRhcmdldElEKSkgPyAnUycgOiAoIShVbHRyYVBlcm1pdHRlZCAmICgxIDw8IFRhcmdldElEKSkgPyAnRicgOiAnVScpKSk7CisJCQlTeW5jaHJvbm91c1N0cmluZ1tIb3N0QWRhcHRlci0+U0NTSV9JRF0gPSAnIyc7CisJCQlTeW5jaHJvbm91c1N0cmluZ1tIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlc10gPSAnXDAnOworCQl9CisJfSBlbHNlCisJCVN5bmNocm9ub3VzTWVzc2FnZSA9IChTeW5jaHJvbm91c1Blcm1pdHRlZCA9PSAwID8gIkRpc2FibGVkIiA6ICJFbmFibGVkIik7CisJV2lkZVBlcm1pdHRlZCA9IEhvc3RBZGFwdGVyLT5XaWRlUGVybWl0dGVkICYgQWxsVGFyZ2V0c01hc2s7CisJaWYgKFdpZGVQZXJtaXR0ZWQgPT0gMCkKKwkJV2lkZU1lc3NhZ2UgPSAiRGlzYWJsZWQiOworCWVsc2UgaWYgKFdpZGVQZXJtaXR0ZWQgPT0gQWxsVGFyZ2V0c01hc2spCisJCVdpZGVNZXNzYWdlID0gIkVuYWJsZWQiOworCWVsc2UgeworCQlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykKKwkJCVdpZGVTdHJpbmdbVGFyZ2V0SURdID0gKChXaWRlUGVybWl0dGVkICYgKDEgPDwgVGFyZ2V0SUQpKSA/ICdZJyA6ICdOJyk7CisJCVdpZGVTdHJpbmdbSG9zdEFkYXB0ZXItPlNDU0lfSURdID0gJyMnOworCQlXaWRlU3RyaW5nW0hvc3RBZGFwdGVyLT5NYXhUYXJnZXREZXZpY2VzXSA9ICdcMCc7CisJfQorCURpc2Nvbm5lY3RQZXJtaXR0ZWQgPSBIb3N0QWRhcHRlci0+RGlzY29ubmVjdFBlcm1pdHRlZCAmIEFsbFRhcmdldHNNYXNrOworCWlmIChEaXNjb25uZWN0UGVybWl0dGVkID09IDApCisJCURpc2Nvbm5lY3RNZXNzYWdlID0gIkRpc2FibGVkIjsKKwllbHNlIGlmIChEaXNjb25uZWN0UGVybWl0dGVkID09IEFsbFRhcmdldHNNYXNrKQorCQlEaXNjb25uZWN0TWVzc2FnZSA9ICJFbmFibGVkIjsKKwllbHNlIHsKKwkJZm9yIChUYXJnZXRJRCA9IDA7IFRhcmdldElEIDwgSG9zdEFkYXB0ZXItPk1heFRhcmdldERldmljZXM7IFRhcmdldElEKyspCisJCQlEaXNjb25uZWN0U3RyaW5nW1RhcmdldElEXSA9ICgoRGlzY29ubmVjdFBlcm1pdHRlZCAmICgxIDw8IFRhcmdldElEKSkgPyAnWScgOiAnTicpOworCQlEaXNjb25uZWN0U3RyaW5nW0hvc3RBZGFwdGVyLT5TQ1NJX0lEXSA9ICcjJzsKKwkJRGlzY29ubmVjdFN0cmluZ1tIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlc10gPSAnXDAnOworCX0KKwlUYWdnZWRRdWV1aW5nUGVybWl0dGVkID0gSG9zdEFkYXB0ZXItPlRhZ2dlZFF1ZXVpbmdQZXJtaXR0ZWQgJiBBbGxUYXJnZXRzTWFzazsKKwlpZiAoVGFnZ2VkUXVldWluZ1Blcm1pdHRlZCA9PSAwKQorCQlUYWdnZWRRdWV1aW5nTWVzc2FnZSA9ICJEaXNhYmxlZCI7CisJZWxzZSBpZiAoVGFnZ2VkUXVldWluZ1Blcm1pdHRlZCA9PSBBbGxUYXJnZXRzTWFzaykKKwkJVGFnZ2VkUXVldWluZ01lc3NhZ2UgPSAiRW5hYmxlZCI7CisJZWxzZSB7CisJCWZvciAoVGFyZ2V0SUQgPSAwOyBUYXJnZXRJRCA8IEhvc3RBZGFwdGVyLT5NYXhUYXJnZXREZXZpY2VzOyBUYXJnZXRJRCsrKQorCQkJVGFnZ2VkUXVldWluZ1N0cmluZ1tUYXJnZXRJRF0gPSAoKFRhZ2dlZFF1ZXVpbmdQZXJtaXR0ZWQgJiAoMSA8PCBUYXJnZXRJRCkpID8gJ1knIDogJ04nKTsKKwkJVGFnZ2VkUXVldWluZ1N0cmluZ1tIb3N0QWRhcHRlci0+U0NTSV9JRF0gPSAnIyc7CisJCVRhZ2dlZFF1ZXVpbmdTdHJpbmdbSG9zdEFkYXB0ZXItPk1heFRhcmdldERldmljZXNdID0gJ1wwJzsKKwl9CisJQnVzTG9naWNfSW5mbygiICBTeW5jaHJvbm91cyBOZWdvdGlhdGlvbjogJXMsIFdpZGUgTmVnb3RpYXRpb246ICVzXG4iLCBIb3N0QWRhcHRlciwgU3luY2hyb25vdXNNZXNzYWdlLCBXaWRlTWVzc2FnZSk7CisJQnVzTG9naWNfSW5mbygiICBEaXNjb25uZWN0L1JlY29ubmVjdDogJXMsIFRhZ2dlZCBRdWV1aW5nOiAlc1xuIiwgSG9zdEFkYXB0ZXIsIERpc2Nvbm5lY3RNZXNzYWdlLCBUYWdnZWRRdWV1aW5nTWVzc2FnZSk7CisJaWYgKEJ1c0xvZ2ljX011bHRpTWFzdGVySG9zdEFkYXB0ZXJQKEhvc3RBZGFwdGVyKSkgeworCQlCdXNMb2dpY19JbmZvKCIgIFNjYXR0ZXIvR2F0aGVyIExpbWl0OiAlZCBvZiAlZCBzZWdtZW50cywgIiAiTWFpbGJveGVzOiAlZFxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5Ecml2ZXJTY2F0dGVyR2F0aGVyTGltaXQsIEhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlclNjYXR0ZXJHYXRoZXJMaW1pdCwgSG9zdEFkYXB0ZXItPk1haWxib3hDb3VudCk7CisJCUJ1c0xvZ2ljX0luZm8oIiAgRHJpdmVyIFF1ZXVlIERlcHRoOiAlZCwgIiAiSG9zdCBBZGFwdGVyIFF1ZXVlIERlcHRoOiAlZFxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5Ecml2ZXJRdWV1ZURlcHRoLCBIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJRdWV1ZURlcHRoKTsKKwl9IGVsc2UKKwkJQnVzTG9naWNfSW5mbygiICBEcml2ZXIgUXVldWUgRGVwdGg6ICVkLCAiICJTY2F0dGVyL0dhdGhlciBMaW1pdDogJWQgc2VnbWVudHNcbiIsIEhvc3RBZGFwdGVyLCBIb3N0QWRhcHRlci0+RHJpdmVyUXVldWVEZXB0aCwgSG9zdEFkYXB0ZXItPkRyaXZlclNjYXR0ZXJHYXRoZXJMaW1pdCk7CisJQnVzTG9naWNfSW5mbygiICBUYWdnZWQgUXVldWUgRGVwdGg6ICIsIEhvc3RBZGFwdGVyKTsKKwlDb21tb25UYWdnZWRRdWV1ZURlcHRoID0gdHJ1ZTsKKwlmb3IgKFRhcmdldElEID0gMTsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykKKwkJaWYgKEhvc3RBZGFwdGVyLT5RdWV1ZURlcHRoW1RhcmdldElEXSAhPSBIb3N0QWRhcHRlci0+UXVldWVEZXB0aFswXSkgeworCQkJQ29tbW9uVGFnZ2VkUXVldWVEZXB0aCA9IGZhbHNlOworCQkJYnJlYWs7CisJCX0KKwlpZiAoQ29tbW9uVGFnZ2VkUXVldWVEZXB0aCkgeworCQlpZiAoSG9zdEFkYXB0ZXItPlF1ZXVlRGVwdGhbMF0gPiAwKQorCQkJQnVzTG9naWNfSW5mbygiJWQiLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPlF1ZXVlRGVwdGhbMF0pOworCQllbHNlCisJCQlCdXNMb2dpY19JbmZvKCJBdXRvbWF0aWMiLCBIb3N0QWRhcHRlcik7CisJfSBlbHNlCisJCUJ1c0xvZ2ljX0luZm8oIkluZGl2aWR1YWwiLCBIb3N0QWRhcHRlcik7CisJQnVzTG9naWNfSW5mbygiLCBVbnRhZ2dlZCBRdWV1ZSBEZXB0aDogJWRcbiIsIEhvc3RBZGFwdGVyLCBIb3N0QWRhcHRlci0+VW50YWdnZWRRdWV1ZURlcHRoKTsKKwlpZiAoSG9zdEFkYXB0ZXItPlRlcm1pbmF0aW9uSW5mb1ZhbGlkKSB7CisJCWlmIChIb3N0QWRhcHRlci0+SG9zdFdpZGVTQ1NJKQorCQkJQnVzTG9naWNfSW5mbygiICBTQ1NJIEJ1cyBUZXJtaW5hdGlvbjogJXMiLCBIb3N0QWRhcHRlciwgKEhvc3RBZGFwdGVyLT5Mb3dCeXRlVGVybWluYXRlZCA/IChIb3N0QWRhcHRlci0+SGlnaEJ5dGVUZXJtaW5hdGVkID8gIkJvdGggRW5hYmxlZCIgOiAiTG93IEVuYWJsZWQiKQorCQkJCQkJCQkJCSAgOiAoSG9zdEFkYXB0ZXItPkhpZ2hCeXRlVGVybWluYXRlZCA/ICJIaWdoIEVuYWJsZWQiIDogIkJvdGggRGlzYWJsZWQiKSkpOworCQllbHNlCisJCQlCdXNMb2dpY19JbmZvKCIgIFNDU0kgQnVzIFRlcm1pbmF0aW9uOiAlcyIsIEhvc3RBZGFwdGVyLCAoSG9zdEFkYXB0ZXItPkxvd0J5dGVUZXJtaW5hdGVkID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIikpOworCQlpZiAoSG9zdEFkYXB0ZXItPkhvc3RTdXBwb3J0c1NDQU0pCisJCQlCdXNMb2dpY19JbmZvKCIsIFNDQU06ICVzIiwgSG9zdEFkYXB0ZXIsIChIb3N0QWRhcHRlci0+U0NBTV9FbmFibGVkID8gKEhvc3RBZGFwdGVyLT5TQ0FNX0xldmVsMiA/ICJFbmFibGVkLCBMZXZlbCAyIiA6ICJFbmFibGVkLCBMZXZlbCAxIikKKwkJCQkJCQkJICA6ICJEaXNhYmxlZCIpKTsKKwkJQnVzTG9naWNfSW5mbygiXG4iLCBIb3N0QWRhcHRlcik7CisJfQorCS8qCisJICAgSW5kaWNhdGUgcmVwb3J0aW5nIHRoZSBIb3N0IEFkYXB0ZXIgY29uZmlndXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorCSAqLworCXJldHVybiB0cnVlOworfQorCisKKy8qCisgIEJ1c0xvZ2ljX0FjcXVpcmVSZXNvdXJjZXMgYWNxdWlyZXMgdGhlIHN5c3RlbSByZXNvdXJjZXMgbmVjZXNzYXJ5IHRvIHVzZQorICBIb3N0IEFkYXB0ZXIuCisqLworCitzdGF0aWMgYm9vbGVhbiBfX2luaXQgQnVzTG9naWNfQWNxdWlyZVJlc291cmNlcyhzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyKQoreworCWlmIChIb3N0QWRhcHRlci0+SVJRX0NoYW5uZWwgPT0gMCkgeworCQlCdXNMb2dpY19FcnJvcigiTk8gTEVHQUwgSU5URVJSVVBUIENIQU5ORUwgQVNTSUdORUQgLSBERVRBQ0hJTkdcbiIsIEhvc3RBZGFwdGVyKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkvKgorCSAgIEFjcXVpcmUgc2hhcmVkIGFjY2VzcyB0byB0aGUgSVJRIENoYW5uZWwuCisJICovCisJaWYgKHJlcXVlc3RfaXJxKEhvc3RBZGFwdGVyLT5JUlFfQ2hhbm5lbCwgQnVzTG9naWNfSW50ZXJydXB0SGFuZGxlciwgU0FfU0hJUlEsIEhvc3RBZGFwdGVyLT5GdWxsTW9kZWxOYW1lLCBIb3N0QWRhcHRlcikgPCAwKSB7CisJCUJ1c0xvZ2ljX0Vycm9yKCJVTkFCTEUgVE8gQUNRVUlSRSBJUlEgQ0hBTk5FTCAlZCAtIERFVEFDSElOR1xuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5JUlFfQ2hhbm5lbCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJSG9zdEFkYXB0ZXItPklSUV9DaGFubmVsQWNxdWlyZWQgPSB0cnVlOworCS8qCisJICAgQWNxdWlyZSBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBETUEgQ2hhbm5lbC4KKwkgKi8KKwlpZiAoSG9zdEFkYXB0ZXItPkRNQV9DaGFubmVsID4gMCkgeworCQlpZiAocmVxdWVzdF9kbWEoSG9zdEFkYXB0ZXItPkRNQV9DaGFubmVsLCBIb3N0QWRhcHRlci0+RnVsbE1vZGVsTmFtZSkgPCAwKSB7CisJCQlCdXNMb2dpY19FcnJvcigiVU5BQkxFIFRPIEFDUVVJUkUgRE1BIENIQU5ORUwgJWQgLSBERVRBQ0hJTkdcbiIsIEhvc3RBZGFwdGVyLCBIb3N0QWRhcHRlci0+RE1BX0NoYW5uZWwpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXNldF9kbWFfbW9kZShIb3N0QWRhcHRlci0+RE1BX0NoYW5uZWwsIERNQV9NT0RFX0NBU0NBREUpOworCQllbmFibGVfZG1hKEhvc3RBZGFwdGVyLT5ETUFfQ2hhbm5lbCk7CisJCUhvc3RBZGFwdGVyLT5ETUFfQ2hhbm5lbEFjcXVpcmVkID0gdHJ1ZTsKKwl9CisJLyoKKwkgICBJbmRpY2F0ZSB0aGUgU3lzdGVtIFJlc291cmNlIEFjcXVpc2l0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksCisJICovCisJcmV0dXJuIHRydWU7Cit9CisKKworLyoKKyAgQnVzTG9naWNfUmVsZWFzZVJlc291cmNlcyByZWxlYXNlcyBhbnkgc3lzdGVtIHJlc291cmNlcyBwcmV2aW91c2x5IGFjcXVpcmVkCisgIGJ5IEJ1c0xvZ2ljX0FjcXVpcmVSZXNvdXJjZXMuCisqLworCitzdGF0aWMgdm9pZCBCdXNMb2dpY19SZWxlYXNlUmVzb3VyY2VzKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIpCit7CisJLyoKKwkgICBSZWxlYXNlIHNoYXJlZCBhY2Nlc3MgdG8gdGhlIElSUSBDaGFubmVsLgorCSAqLworCWlmIChIb3N0QWRhcHRlci0+SVJRX0NoYW5uZWxBY3F1aXJlZCkKKwkJZnJlZV9pcnEoSG9zdEFkYXB0ZXItPklSUV9DaGFubmVsLCBIb3N0QWRhcHRlcik7CisJLyoKKwkgICBSZWxlYXNlIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIERNQSBDaGFubmVsLgorCSAqLworCWlmIChIb3N0QWRhcHRlci0+RE1BX0NoYW5uZWxBY3F1aXJlZCkKKwkJZnJlZV9kbWEoSG9zdEFkYXB0ZXItPkRNQV9DaGFubmVsKTsKKwkvKgorCSAgIFJlbGVhc2UgYW55IGFsbG9jYXRlZCBtZW1vcnkgc3RydWN0cyBub3QgcmVsZWFzZWQgZWxzZXdoZXJlCisJICovCisJaWYgKEhvc3RBZGFwdGVyLT5NYWlsYm94U3BhY2UpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoSG9zdEFkYXB0ZXItPlBDSV9EZXZpY2UsIEhvc3RBZGFwdGVyLT5NYWlsYm94U2l6ZSwgSG9zdEFkYXB0ZXItPk1haWxib3hTcGFjZSwgSG9zdEFkYXB0ZXItPk1haWxib3hTcGFjZUhhbmRsZSk7CisJSG9zdEFkYXB0ZXItPk1haWxib3hTcGFjZSA9IE5VTEw7CisJSG9zdEFkYXB0ZXItPk1haWxib3hTcGFjZUhhbmRsZSA9IDA7CisJSG9zdEFkYXB0ZXItPk1haWxib3hTaXplID0gMDsKK30KKworCisvKgorICBCdXNMb2dpY19Jbml0aWFsaXplSG9zdEFkYXB0ZXIgaW5pdGlhbGl6ZXMgSG9zdCBBZGFwdGVyLiAgVGhpcyBpcyB0aGUgb25seQorICBmdW5jdGlvbiBjYWxsZWQgZHVyaW5nIFNDU0kgSG9zdCBBZGFwdGVyIGRldGVjdGlvbiB3aGljaCBtb2RpZmllcyB0aGUgc3RhdGUKKyAgb2YgdGhlIEhvc3QgQWRhcHRlciBmcm9tIGl0cyBpbml0aWFsIHBvd2VyIG9uIG9yIGhhcmQgcmVzZXQgc3RhdGUuCisqLworCitzdGF0aWMgYm9vbGVhbiBCdXNMb2dpY19Jbml0aWFsaXplSG9zdEFkYXB0ZXIoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyCisJCQkJCSAgICAgICpIb3N0QWRhcHRlcikKK3sKKwlzdHJ1Y3QgQnVzTG9naWNfRXh0ZW5kZWRNYWlsYm94UmVxdWVzdCBFeHRlbmRlZE1haWxib3hSZXF1ZXN0OworCWVudW0gQnVzTG9naWNfUm91bmRSb2Jpbk1vZGVSZXF1ZXN0IFJvdW5kUm9iaW5Nb2RlUmVxdWVzdDsKKwllbnVtIEJ1c0xvZ2ljX1NldENDQkZvcm1hdFJlcXVlc3QgU2V0Q0NCRm9ybWF0UmVxdWVzdDsKKwlpbnQgVGFyZ2V0SUQ7CisJLyoKKwkgICBJbml0aWFsaXplIHRoZSBwb2ludGVycyB0byB0aGUgZmlyc3QgYW5kIGxhc3QgQ0NCcyB0aGF0IGFyZSBxdWV1ZWQgZm9yCisJICAgY29tcGxldGlvbiBwcm9jZXNzaW5nLgorCSAqLworCUhvc3RBZGFwdGVyLT5GaXJzdENvbXBsZXRlZENDQiA9IE5VTEw7CisJSG9zdEFkYXB0ZXItPkxhc3RDb21wbGV0ZWRDQ0IgPSBOVUxMOworCS8qCisJICAgSW5pdGlhbGl6ZSB0aGUgQnVzIERldmljZSBSZXNldCBQZW5kaW5nIENDQiwgVGFnZ2VkIFF1ZXVpbmcgQWN0aXZlLAorCSAgIENvbW1hbmQgU3VjY2Vzc2Z1bCBGbGFnLCBBY3RpdmUgQ29tbWFuZHMsIGFuZCBDb21tYW5kcyBTaW5jZSBSZXNldAorCSAgIGZvciBlYWNoIFRhcmdldCBEZXZpY2UuCisJICovCisJZm9yIChUYXJnZXRJRCA9IDA7IFRhcmdldElEIDwgSG9zdEFkYXB0ZXItPk1heFRhcmdldERldmljZXM7IFRhcmdldElEKyspIHsKKwkJSG9zdEFkYXB0ZXItPkJ1c0RldmljZVJlc2V0UGVuZGluZ0NDQltUYXJnZXRJRF0gPSBOVUxMOworCQlIb3N0QWRhcHRlci0+VGFyZ2V0RmxhZ3NbVGFyZ2V0SURdLlRhZ2dlZFF1ZXVpbmdBY3RpdmUgPSBmYWxzZTsKKwkJSG9zdEFkYXB0ZXItPlRhcmdldEZsYWdzW1RhcmdldElEXS5Db21tYW5kU3VjY2Vzc2Z1bEZsYWcgPSBmYWxzZTsKKwkJSG9zdEFkYXB0ZXItPkFjdGl2ZUNvbW1hbmRzW1RhcmdldElEXSA9IDA7CisJCUhvc3RBZGFwdGVyLT5Db21tYW5kc1NpbmNlUmVzZXRbVGFyZ2V0SURdID0gMDsKKwl9CisJLyoKKwkgICBGbGFzaFBvaW50IEhvc3QgQWRhcHRlcnMgZG8gbm90IHVzZSBPdXRnb2luZyBhbmQgSW5jb21pbmcgTWFpbGJveGVzLgorCSAqLworCWlmIChCdXNMb2dpY19GbGFzaFBvaW50SG9zdEFkYXB0ZXJQKEhvc3RBZGFwdGVyKSkKKwkJZ290byBEb25lOworCS8qCisJICAgSW5pdGlhbGl6ZSB0aGUgT3V0Z29pbmcgYW5kIEluY29taW5nIE1haWxib3ggcG9pbnRlcnMuCisJICovCisJSG9zdEFkYXB0ZXItPk1haWxib3hTaXplID0gSG9zdEFkYXB0ZXItPk1haWxib3hDb3VudCAqIChzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX091dGdvaW5nTWFpbGJveCkgKyBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX0luY29taW5nTWFpbGJveCkpOworCUhvc3RBZGFwdGVyLT5NYWlsYm94U3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChIb3N0QWRhcHRlci0+UENJX0RldmljZSwgSG9zdEFkYXB0ZXItPk1haWxib3hTaXplLCAmSG9zdEFkYXB0ZXItPk1haWxib3hTcGFjZUhhbmRsZSk7CisJaWYgKEhvc3RBZGFwdGVyLT5NYWlsYm94U3BhY2UgPT0gTlVMTCkKKwkJcmV0dXJuIEJ1c0xvZ2ljX0ZhaWx1cmUoSG9zdEFkYXB0ZXIsICJNQUlMQk9YIEFMTE9DQVRJT04iKTsKKwlIb3N0QWRhcHRlci0+Rmlyc3RPdXRnb2luZ01haWxib3ggPSAoc3RydWN0IEJ1c0xvZ2ljX091dGdvaW5nTWFpbGJveCAqKSBIb3N0QWRhcHRlci0+TWFpbGJveFNwYWNlOworCUhvc3RBZGFwdGVyLT5MYXN0T3V0Z29pbmdNYWlsYm94ID0gSG9zdEFkYXB0ZXItPkZpcnN0T3V0Z29pbmdNYWlsYm94ICsgSG9zdEFkYXB0ZXItPk1haWxib3hDb3VudCAtIDE7CisJSG9zdEFkYXB0ZXItPk5leHRPdXRnb2luZ01haWxib3ggPSBIb3N0QWRhcHRlci0+Rmlyc3RPdXRnb2luZ01haWxib3g7CisJSG9zdEFkYXB0ZXItPkZpcnN0SW5jb21pbmdNYWlsYm94ID0gKHN0cnVjdCBCdXNMb2dpY19JbmNvbWluZ01haWxib3ggKikgKEhvc3RBZGFwdGVyLT5MYXN0T3V0Z29pbmdNYWlsYm94ICsgMSk7CisJSG9zdEFkYXB0ZXItPkxhc3RJbmNvbWluZ01haWxib3ggPSBIb3N0QWRhcHRlci0+Rmlyc3RJbmNvbWluZ01haWxib3ggKyBIb3N0QWRhcHRlci0+TWFpbGJveENvdW50IC0gMTsKKwlIb3N0QWRhcHRlci0+TmV4dEluY29taW5nTWFpbGJveCA9IEhvc3RBZGFwdGVyLT5GaXJzdEluY29taW5nTWFpbGJveDsKKworCS8qCisJICAgSW5pdGlhbGl6ZSB0aGUgT3V0Z29pbmcgYW5kIEluY29taW5nIE1haWxib3ggc3RydWN0dXJlcy4KKwkgKi8KKwltZW1zZXQoSG9zdEFkYXB0ZXItPkZpcnN0T3V0Z29pbmdNYWlsYm94LCAwLCBIb3N0QWRhcHRlci0+TWFpbGJveENvdW50ICogc2l6ZW9mKHN0cnVjdCBCdXNMb2dpY19PdXRnb2luZ01haWxib3gpKTsKKwltZW1zZXQoSG9zdEFkYXB0ZXItPkZpcnN0SW5jb21pbmdNYWlsYm94LCAwLCBIb3N0QWRhcHRlci0+TWFpbGJveENvdW50ICogc2l6ZW9mKHN0cnVjdCBCdXNMb2dpY19JbmNvbWluZ01haWxib3gpKTsKKwkvKgorCSAgIEluaXRpYWxpemUgdGhlIEhvc3QgQWRhcHRlcidzIFBvaW50ZXIgdG8gdGhlIE91dGdvaW5nL0luY29taW5nIE1haWxib3hlcy4KKwkgKi8KKwlFeHRlbmRlZE1haWxib3hSZXF1ZXN0Lk1haWxib3hDb3VudCA9IEhvc3RBZGFwdGVyLT5NYWlsYm94Q291bnQ7CisJRXh0ZW5kZWRNYWlsYm94UmVxdWVzdC5CYXNlTWFpbGJveEFkZHJlc3MgPSAodTMyKSBIb3N0QWRhcHRlci0+TWFpbGJveFNwYWNlSGFuZGxlOworCWlmIChCdXNMb2dpY19Db21tYW5kKEhvc3RBZGFwdGVyLCBCdXNMb2dpY19Jbml0aWFsaXplRXh0ZW5kZWRNYWlsYm94LCAmRXh0ZW5kZWRNYWlsYm94UmVxdWVzdCwgc2l6ZW9mKEV4dGVuZGVkTWFpbGJveFJlcXVlc3QpLCBOVUxMLCAwKSA8IDApCisJCXJldHVybiBCdXNMb2dpY19GYWlsdXJlKEhvc3RBZGFwdGVyLCAiTUFJTEJPWCBJTklUSUFMSVpBVElPTiIpOworCS8qCisJICAgRW5hYmxlIFN0cmljdCBSb3VuZCBSb2JpbiBNb2RlIGlmIHN1cHBvcnRlZCBieSB0aGUgSG9zdCBBZGFwdGVyLiAgSW4KKwkgICBTdHJpY3QgUm91bmQgUm9iaW4gTW9kZSwgdGhlIEhvc3QgQWRhcHRlciBvbmx5IGxvb2tzIGF0IHRoZSBuZXh0IE91dGdvaW5nCisJICAgTWFpbGJveCBmb3IgZWFjaCBuZXcgY29tbWFuZCwgcmF0aGVyIHRoYW4gc2Nhbm5pbmcgdGhyb3VnaCBhbGwgdGhlCisJICAgT3V0Z29pbmcgTWFpbGJveGVzIHRvIGZpbmQgYW55IHRoYXQgaGF2ZSBuZXcgY29tbWFuZHMgaW4gdGhlbS4gIFN0cmljdAorCSAgIFJvdW5kIFJvYmluIE1vZGUgaXMgc2lnbmlmaWNhbnRseSBtb3JlIGVmZmljaWVudC4KKwkgKi8KKwlpZiAoSG9zdEFkYXB0ZXItPlN0cmljdFJvdW5kUm9iaW5Nb2RlU3VwcG9ydCkgeworCQlSb3VuZFJvYmluTW9kZVJlcXVlc3QgPSBCdXNMb2dpY19TdHJpY3RSb3VuZFJvYmluTW9kZTsKKwkJaWYgKEJ1c0xvZ2ljX0NvbW1hbmQoSG9zdEFkYXB0ZXIsIEJ1c0xvZ2ljX0VuYWJsZVN0cmljdFJvdW5kUm9iaW5Nb2RlLCAmUm91bmRSb2Jpbk1vZGVSZXF1ZXN0LCBzaXplb2YoUm91bmRSb2Jpbk1vZGVSZXF1ZXN0KSwgTlVMTCwgMCkgPCAwKQorCQkJcmV0dXJuIEJ1c0xvZ2ljX0ZhaWx1cmUoSG9zdEFkYXB0ZXIsICJFTkFCTEUgU1RSSUNUIFJPVU5EIFJPQklOIE1PREUiKTsKKwl9CisJLyoKKwkgICBGb3IgSG9zdCBBZGFwdGVycyB0aGF0IHN1cHBvcnQgRXh0ZW5kZWQgTFVOIEZvcm1hdCBDQ0JzLCBpc3N1ZSB0aGUgU2V0IENDQgorCSAgIEZvcm1hdCBjb21tYW5kIHRvIGFsbG93IDMyIExvZ2ljYWwgVW5pdHMgcGVyIFRhcmdldCBEZXZpY2UuCisJICovCisJaWYgKEhvc3RBZGFwdGVyLT5FeHRlbmRlZExVTlN1cHBvcnQpIHsKKwkJU2V0Q0NCRm9ybWF0UmVxdWVzdCA9IEJ1c0xvZ2ljX0V4dGVuZGVkTFVORm9ybWF0Q0NCOworCQlpZiAoQnVzTG9naWNfQ29tbWFuZChIb3N0QWRhcHRlciwgQnVzTG9naWNfU2V0Q0NCRm9ybWF0LCAmU2V0Q0NCRm9ybWF0UmVxdWVzdCwgc2l6ZW9mKFNldENDQkZvcm1hdFJlcXVlc3QpLCBOVUxMLCAwKSA8IDApCisJCQlyZXR1cm4gQnVzTG9naWNfRmFpbHVyZShIb3N0QWRhcHRlciwgIlNFVCBDQ0IgRk9STUFUIik7CisJfQorCS8qCisJICAgQW5ub3VuY2UgU3VjY2Vzc2Z1bCBJbml0aWFsaXphdGlvbi4KKwkgKi8KKyAgICAgIERvbmU6CisJaWYgKCFIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJJbml0aWFsaXplZCkgeworCQlCdXNMb2dpY19JbmZvKCIqKiogJXMgSW5pdGlhbGl6ZWQgU3VjY2Vzc2Z1bGx5ICoqKlxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5GdWxsTW9kZWxOYW1lKTsKKwkJQnVzTG9naWNfSW5mbygiXG4iLCBIb3N0QWRhcHRlcik7CisJfSBlbHNlCisJCUJ1c0xvZ2ljX1dhcm5pbmcoIioqKiAlcyBJbml0aWFsaXplZCBTdWNjZXNzZnVsbHkgKioqXG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPkZ1bGxNb2RlbE5hbWUpOworCUhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckluaXRpYWxpemVkID0gdHJ1ZTsKKwkvKgorCSAgIEluZGljYXRlIHRoZSBIb3N0IEFkYXB0ZXIgSW5pdGlhbGl6YXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKwkgKi8KKwlyZXR1cm4gdHJ1ZTsKK30KKworCisvKgorICBCdXNMb2dpY19UYXJnZXREZXZpY2VJbnF1aXJ5IGlucXVpcmVzIGFib3V0IHRoZSBUYXJnZXQgRGV2aWNlcyBhY2Nlc3NpYmxlCisgIHRocm91Z2ggSG9zdCBBZGFwdGVyLgorKi8KKworc3RhdGljIGJvb2xlYW4gX19pbml0IEJ1c0xvZ2ljX1RhcmdldERldmljZUlucXVpcnkoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyCisJCQkJCQkgICAqSG9zdEFkYXB0ZXIpCit7CisJdTE2IEluc3RhbGxlZERldmljZXM7CisJdTggSW5zdGFsbGVkRGV2aWNlc0lEMHRvN1s4XTsKKwlzdHJ1Y3QgQnVzTG9naWNfU2V0dXBJbmZvcm1hdGlvbiBTZXR1cEluZm9ybWF0aW9uOworCXU4IFN5bmNocm9ub3VzUGVyaW9kW0J1c0xvZ2ljX01heFRhcmdldERldmljZXNdOworCXVuc2lnbmVkIGNoYXIgUmVxdWVzdGVkUmVwbHlMZW5ndGg7CisJaW50IFRhcmdldElEOworCS8qCisJICAgV2FpdCBhIGZldyBzZWNvbmRzIGJldHdlZW4gdGhlIEhvc3QgQWRhcHRlciBIYXJkIFJlc2V0IHdoaWNoIGluaXRpYXRlcworCSAgIGEgU0NTSSBCdXMgUmVzZXQgYW5kIGlzc3VpbmcgYW55IFNDU0kgQ29tbWFuZHMuICBTb21lIFNDU0kgZGV2aWNlcyBnZXQKKwkgICBjb25mdXNlZCBpZiB0aGV5IHJlY2VpdmUgU0NTSSBDb21tYW5kcyB0b28gc29vbiBhZnRlciBhIFNDU0kgQnVzIFJlc2V0LgorCSAqLworCUJ1c0xvZ2ljX0RlbGF5KEhvc3RBZGFwdGVyLT5CdXNTZXR0bGVUaW1lKTsKKwkvKgorCSAgIEZsYXNoUG9pbnQgSG9zdCBBZGFwdGVycyBkbyBub3QgcHJvdmlkZSBmb3IgVGFyZ2V0IERldmljZSBJbnF1aXJ5LgorCSAqLworCWlmIChCdXNMb2dpY19GbGFzaFBvaW50SG9zdEFkYXB0ZXJQKEhvc3RBZGFwdGVyKSkKKwkJcmV0dXJuIHRydWU7CisJLyoKKwkgICBJbmhpYml0IHRoZSBUYXJnZXQgRGV2aWNlIElucXVpcnkgaWYgcmVxdWVzdGVkLgorCSAqLworCWlmIChIb3N0QWRhcHRlci0+RHJpdmVyT3B0aW9ucyAhPSBOVUxMICYmIEhvc3RBZGFwdGVyLT5Ecml2ZXJPcHRpb25zLT5Mb2NhbE9wdGlvbnMuSW5oaWJpdFRhcmdldElucXVpcnkpCisJCXJldHVybiB0cnVlOworCS8qCisJICAgSXNzdWUgdGhlIElucXVpcmUgVGFyZ2V0IERldmljZXMgY29tbWFuZCBmb3IgaG9zdCBhZGFwdGVycyB3aXRoIGZpcm13YXJlCisJICAgdmVyc2lvbiA0LjI1IG9yIGxhdGVyLCBvciB0aGUgSW5xdWlyZSBJbnN0YWxsZWQgRGV2aWNlcyBJRCAwIHRvIDcgY29tbWFuZAorCSAgIGZvciBvbGRlciBob3N0IGFkYXB0ZXJzLiAgVGhpcyBpcyBuZWNlc3NhcnkgdG8gZm9yY2UgU3luY2hyb25vdXMgVHJhbnNmZXIKKwkgICBOZWdvdGlhdGlvbiBzbyB0aGF0IHRoZSBJbnF1aXJlIFNldHVwIEluZm9ybWF0aW9uIGFuZCBJbnF1aXJlIFN5bmNocm9ub3VzCisJICAgUGVyaW9kIGNvbW1hbmRzIHdpbGwgcmV0dXJuIHZhbGlkIGRhdGEuICBUaGUgSW5xdWlyZSBUYXJnZXQgRGV2aWNlcyBjb21tYW5kCisJICAgaXMgcHJlZmVyYWJsZSB0byBJbnF1aXJlIEluc3RhbGxlZCBEZXZpY2VzIElEIDAgdG8gNyBzaW5jZSBpdCBvbmx5IHByb2JlcworCSAgIExvZ2ljYWwgVW5pdCAwIG9mIGVhY2ggVGFyZ2V0IERldmljZS4KKwkgKi8KKwlpZiAoc3RyY21wKEhvc3RBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb24sICI0LjI1IikgPj0gMCkgeworCisJCS8qCisJCSAqIElzc3VlIGEgSW5xdWlyZSBUYXJnZXQgRGV2aWNlcyBjb21tYW5kLiAgSW5xdWlyZSBUYXJnZXQgRGV2aWNlcyBvbmx5CisJCSAqIHRlc3RzIExvZ2ljYWwgVW5pdCAwIG9mIGVhY2ggVGFyZ2V0IERldmljZSB1bmxpa2UgdGhlIElucXVpcmUgSW5zdGFsbGVkCisJCSAqIERldmljZXMgY29tbWFuZHMgd2hpY2ggdGVzdCBMb2dpY2FsIFVuaXRzIDAgLSA3LiAgVHdvIGJ5dGVzIGFyZQorCQkgKiByZXR1cm5lZCwgd2hlcmUgYnl0ZSAwIGJpdCAwIHNldCBpbmRpY2F0ZXMgdGhhdCBUYXJnZXQgRGV2aWNlIDAgZXhpc3RzLAorCQkgKiBhbmQgc28gb24uCisJCSAqLworCisJCWlmIChCdXNMb2dpY19Db21tYW5kKEhvc3RBZGFwdGVyLCBCdXNMb2dpY19JbnF1aXJlVGFyZ2V0RGV2aWNlcywgTlVMTCwgMCwgJkluc3RhbGxlZERldmljZXMsIHNpemVvZihJbnN0YWxsZWREZXZpY2VzKSkKKwkJICAgICE9IHNpemVvZihJbnN0YWxsZWREZXZpY2VzKSkKKwkJCXJldHVybiBCdXNMb2dpY19GYWlsdXJlKEhvc3RBZGFwdGVyLCAiSU5RVUlSRSBUQVJHRVQgREVWSUNFUyIpOworCQlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykKKwkJCUhvc3RBZGFwdGVyLT5UYXJnZXRGbGFnc1tUYXJnZXRJRF0uVGFyZ2V0RXhpc3RzID0gKEluc3RhbGxlZERldmljZXMgJiAoMSA8PCBUYXJnZXRJRCkgPyB0cnVlIDogZmFsc2UpOworCX0gZWxzZSB7CisKKwkJLyoKKwkJICogSXNzdWUgYW4gSW5xdWlyZSBJbnN0YWxsZWQgRGV2aWNlcyBjb21tYW5kLiAgRm9yIGVhY2ggVGFyZ2V0IERldmljZSwKKwkJICogYSBieXRlIGlzIHJldHVybmVkIHdoZXJlIGJpdCAwIHNldCBpbmRpY2F0ZXMgdGhhdCBMb2dpY2FsIFVuaXQgMAorCQkgKiBleGlzdHMsIGJpdCAxIHNldCBpbmRpY2F0ZXMgdGhhdCBMb2dpY2FsIFVuaXQgMSBleGlzdHMsIGFuZCBzbyBvbi4KKwkJICovCisKKwkJaWYgKEJ1c0xvZ2ljX0NvbW1hbmQoSG9zdEFkYXB0ZXIsIEJ1c0xvZ2ljX0lucXVpcmVJbnN0YWxsZWREZXZpY2VzSUQwdG83LCBOVUxMLCAwLCAmSW5zdGFsbGVkRGV2aWNlc0lEMHRvNywgc2l6ZW9mKEluc3RhbGxlZERldmljZXNJRDB0bzcpKQorCQkgICAgIT0gc2l6ZW9mKEluc3RhbGxlZERldmljZXNJRDB0bzcpKQorCQkJcmV0dXJuIEJ1c0xvZ2ljX0ZhaWx1cmUoSG9zdEFkYXB0ZXIsICJJTlFVSVJFIElOU1RBTExFRCBERVZJQ0VTIElEIDAgVE8gNyIpOworCQlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCA4OyBUYXJnZXRJRCsrKQorCQkJSG9zdEFkYXB0ZXItPlRhcmdldEZsYWdzW1RhcmdldElEXS5UYXJnZXRFeGlzdHMgPSAoSW5zdGFsbGVkRGV2aWNlc0lEMHRvN1tUYXJnZXRJRF0gIT0gMCA/IHRydWUgOiBmYWxzZSk7CisJfQorCS8qCisJICAgSXNzdWUgdGhlIElucXVpcmUgU2V0dXAgSW5mb3JtYXRpb24gY29tbWFuZC4KKwkgKi8KKwlSZXF1ZXN0ZWRSZXBseUxlbmd0aCA9IHNpemVvZihTZXR1cEluZm9ybWF0aW9uKTsKKwlpZiAoQnVzTG9naWNfQ29tbWFuZChIb3N0QWRhcHRlciwgQnVzTG9naWNfSW5xdWlyZVNldHVwSW5mb3JtYXRpb24sICZSZXF1ZXN0ZWRSZXBseUxlbmd0aCwgc2l6ZW9mKFJlcXVlc3RlZFJlcGx5TGVuZ3RoKSwgJlNldHVwSW5mb3JtYXRpb24sIHNpemVvZihTZXR1cEluZm9ybWF0aW9uKSkKKwkgICAgIT0gc2l6ZW9mKFNldHVwSW5mb3JtYXRpb24pKQorCQlyZXR1cm4gQnVzTG9naWNfRmFpbHVyZShIb3N0QWRhcHRlciwgIklOUVVJUkUgU0VUVVAgSU5GT1JNQVRJT04iKTsKKwlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykKKwkJSG9zdEFkYXB0ZXItPlN5bmNocm9ub3VzT2Zmc2V0W1RhcmdldElEXSA9IChUYXJnZXRJRCA8IDggPyBTZXR1cEluZm9ybWF0aW9uLlN5bmNocm9ub3VzVmFsdWVzSUQwdG83W1RhcmdldElEXS5PZmZzZXQgOiBTZXR1cEluZm9ybWF0aW9uLlN5bmNocm9ub3VzVmFsdWVzSUQ4dG8xNVtUYXJnZXRJRCAtIDhdLk9mZnNldCk7CisJaWYgKHN0cmNtcChIb3N0QWRhcHRlci0+RmlybXdhcmVWZXJzaW9uLCAiNS4wNkwiKSA+PSAwKQorCQlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykKKwkJCUhvc3RBZGFwdGVyLT5UYXJnZXRGbGFnc1tUYXJnZXRJRF0uV2lkZVRyYW5zZmVyc0FjdGl2ZSA9IChUYXJnZXRJRCA8IDggPyAoU2V0dXBJbmZvcm1hdGlvbi5XaWRlVHJhbnNmZXJzQWN0aXZlSUQwdG83ICYgKDEgPDwgVGFyZ2V0SUQpCisJCQkJCQkJCQkJCQkgID8gdHJ1ZSA6IGZhbHNlKQorCQkJCQkJCQkJCSAgOiAoU2V0dXBJbmZvcm1hdGlvbi5XaWRlVHJhbnNmZXJzQWN0aXZlSUQ4dG8xNSAmICgxIDw8IChUYXJnZXRJRCAtIDgpKQorCQkJCQkJCQkJCSAgICAgPyB0cnVlIDogZmFsc2UpKTsKKwkvKgorCSAgIElzc3VlIHRoZSBJbnF1aXJlIFN5bmNocm9ub3VzIFBlcmlvZCBjb21tYW5kLgorCSAqLworCWlmIChIb3N0QWRhcHRlci0+RmlybXdhcmVWZXJzaW9uWzBdID49ICczJykgeworCisJCS8qIElzc3VlIGEgSW5xdWlyZSBTeW5jaHJvbm91cyBQZXJpb2QgY29tbWFuZC4gIEZvciBlYWNoIFRhcmdldCBEZXZpY2UsCisJCSAqIGEgYnl0ZSBpcyByZXR1cm5lZCB3aGljaCByZXByZXNlbnRzIHRoZSBTeW5jaHJvbm91cyBUcmFuc2ZlciBQZXJpb2QKKwkJICogaW4gdW5pdHMgb2YgMTAgbmFub3NlY29uZHMuCisJCSAqLworCisJCVJlcXVlc3RlZFJlcGx5TGVuZ3RoID0gc2l6ZW9mKFN5bmNocm9ub3VzUGVyaW9kKTsKKwkJaWYgKEJ1c0xvZ2ljX0NvbW1hbmQoSG9zdEFkYXB0ZXIsIEJ1c0xvZ2ljX0lucXVpcmVTeW5jaHJvbm91c1BlcmlvZCwgJlJlcXVlc3RlZFJlcGx5TGVuZ3RoLCBzaXplb2YoUmVxdWVzdGVkUmVwbHlMZW5ndGgpLCAmU3luY2hyb25vdXNQZXJpb2QsIHNpemVvZihTeW5jaHJvbm91c1BlcmlvZCkpCisJCSAgICAhPSBzaXplb2YoU3luY2hyb25vdXNQZXJpb2QpKQorCQkJcmV0dXJuIEJ1c0xvZ2ljX0ZhaWx1cmUoSG9zdEFkYXB0ZXIsICJJTlFVSVJFIFNZTkNIUk9OT1VTIFBFUklPRCIpOworCQlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykKKwkJCUhvc3RBZGFwdGVyLT5TeW5jaHJvbm91c1BlcmlvZFtUYXJnZXRJRF0gPSBTeW5jaHJvbm91c1BlcmlvZFtUYXJnZXRJRF07CisJfSBlbHNlCisJCWZvciAoVGFyZ2V0SUQgPSAwOyBUYXJnZXRJRCA8IEhvc3RBZGFwdGVyLT5NYXhUYXJnZXREZXZpY2VzOyBUYXJnZXRJRCsrKQorCQkJaWYgKFNldHVwSW5mb3JtYXRpb24uU3luY2hyb25vdXNWYWx1ZXNJRDB0bzdbVGFyZ2V0SURdLk9mZnNldCA+IDApCisJCQkJSG9zdEFkYXB0ZXItPlN5bmNocm9ub3VzUGVyaW9kW1RhcmdldElEXSA9IDIwICsgNSAqIFNldHVwSW5mb3JtYXRpb24uU3luY2hyb25vdXNWYWx1ZXNJRDB0bzdbVGFyZ2V0SURdCisJCQkJICAgIC5UcmFuc2ZlclBlcmlvZDsKKwkvKgorCSAgIEluZGljYXRlIHRoZSBUYXJnZXQgRGV2aWNlIElucXVpcnkgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKwkgKi8KKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAgQnVzTG9naWNfSW5pdGlhbGl6ZUhvc3RTdHJ1Y3R1cmUgaW5pdGlhbGl6ZXMgdGhlIGZpZWxkcyBpbiB0aGUgU0NTSSBIb3N0CisgIHN0cnVjdHVyZS4gIFRoZSBiYXNlLCBpb19wb3J0LCBuX2lvX3BvcnRzLCBpcnEsIGFuZCBkbWFfY2hhbm5lbCBmaWVsZHMgaW4gdGhlCisgIFNDU0kgSG9zdCBzdHJ1Y3R1cmUgYXJlIGludGVudGlvbmFsbHkgbGVmdCB1bmluaXRpYWxpemVkLCBhcyB0aGlzIGRyaXZlcgorICBoYW5kbGVzIGFjcXVpc2l0aW9uIGFuZCByZWxlYXNlIG9mIHRoZXNlIHJlc291cmNlcyBleHBsaWNpdGx5LCBhcyB3ZWxsIGFzCisgIGVuc3VyaW5nIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIEhvc3QgQWRhcHRlciBoYXJkd2FyZSBhbmQgZGF0YSBzdHJ1Y3R1cmVzCisgIHRocm91Z2ggZXhwbGljaXQgYWNxdWlzaXRpb24gYW5kIHJlbGVhc2Ugb2YgdGhlIEhvc3QgQWRhcHRlcidzIExvY2suCisqLworCitzdGF0aWMgdm9pZCBfX2luaXQgQnVzTG9naWNfSW5pdGlhbGl6ZUhvc3RTdHJ1Y3R1cmUoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyCisJCQkJCQkgICAgKkhvc3RBZGFwdGVyLCBzdHJ1Y3QgU2NzaV9Ib3N0ICpIb3N0KQoreworCUhvc3QtPm1heF9pZCA9IEhvc3RBZGFwdGVyLT5NYXhUYXJnZXREZXZpY2VzOworCUhvc3QtPm1heF9sdW4gPSBIb3N0QWRhcHRlci0+TWF4TG9naWNhbFVuaXRzOworCUhvc3QtPm1heF9jaGFubmVsID0gMDsKKwlIb3N0LT51bmlxdWVfaWQgPSBIb3N0QWRhcHRlci0+SU9fQWRkcmVzczsKKwlIb3N0LT50aGlzX2lkID0gSG9zdEFkYXB0ZXItPlNDU0lfSUQ7CisJSG9zdC0+Y2FuX3F1ZXVlID0gSG9zdEFkYXB0ZXItPkRyaXZlclF1ZXVlRGVwdGg7CisJSG9zdC0+c2dfdGFibGVzaXplID0gSG9zdEFkYXB0ZXItPkRyaXZlclNjYXR0ZXJHYXRoZXJMaW1pdDsKKwlIb3N0LT51bmNoZWNrZWRfaXNhX2RtYSA9IEhvc3RBZGFwdGVyLT5Cb3VuY2VCdWZmZXJzUmVxdWlyZWQ7CisJSG9zdC0+Y21kX3Blcl9sdW4gPSBIb3N0QWRhcHRlci0+VW50YWdnZWRRdWV1ZURlcHRoOworfQorCisvKgorICBCdXNMb2dpY19TbGF2ZUNvbmZpZ3VyZSB3aWxsIGFjdHVhbGx5IHNldCB0aGUgcXVldWUgZGVwdGggb24gaW5kaXZpZHVhbAorICBzY3NpIGRldmljZXMgYXMgdGhleSBhcmUgcGVybWFuZW50bHkgYWRkZWQgdG8gdGhlIGRldmljZSBjaGFpbi4gIFdlCisgIHNoYW1lbGVzc2x5IHJpcCBvZmYgdGhlIFNlbGVjdFF1ZXVlRGVwdGhzIGNvZGUgdG8gbWFrZSB0aGlzIHdvcmsgbW9zdGx5CisgIGxpa2UgaXQgdXNlZCB0by4gIFNpbmNlIHdlIGRvbid0IGdldCBjYWxsZWQgb25jZSBhdCB0aGUgZW5kIG9mIHRoZSBzY2FuCisgIGJ1dCBpbnN0ZWFkIGdldCBjYWxsZWQgZm9yIGVhY2ggZGV2aWNlLCB3ZSBoYXZlIHRvIGRvIHRoaW5ncyBhIGJpdAorICBkaWZmZXJlbnRseS4KKyovCitzdGF0aWMgaW50IEJ1c0xvZ2ljX1NsYXZlQ29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqRGV2aWNlKQoreworCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSAoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICopIERldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJaW50IFRhcmdldElEID0gRGV2aWNlLT5pZDsKKwlpbnQgUXVldWVEZXB0aCA9IEhvc3RBZGFwdGVyLT5RdWV1ZURlcHRoW1RhcmdldElEXTsKKworCWlmIChIb3N0QWRhcHRlci0+VGFyZ2V0RmxhZ3NbVGFyZ2V0SURdLlRhZ2dlZFF1ZXVpbmdTdXBwb3J0ZWQgJiYgKEhvc3RBZGFwdGVyLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkICYgKDEgPDwgVGFyZ2V0SUQpKSkgeworCQlpZiAoUXVldWVEZXB0aCA9PSAwKQorCQkJUXVldWVEZXB0aCA9IEJ1c0xvZ2ljX01heEF1dG9tYXRpY1RhZ2dlZFF1ZXVlRGVwdGg7CisJCUhvc3RBZGFwdGVyLT5RdWV1ZURlcHRoW1RhcmdldElEXSA9IFF1ZXVlRGVwdGg7CisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKERldmljZSwgTVNHX1NJTVBMRV9UQUcsIFF1ZXVlRGVwdGgpOworCX0gZWxzZSB7CisJCUhvc3RBZGFwdGVyLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkICY9IH4oMSA8PCBUYXJnZXRJRCk7CisJCVF1ZXVlRGVwdGggPSBIb3N0QWRhcHRlci0+VW50YWdnZWRRdWV1ZURlcHRoOworCQlIb3N0QWRhcHRlci0+UXVldWVEZXB0aFtUYXJnZXRJRF0gPSBRdWV1ZURlcHRoOworCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChEZXZpY2UsIDAsIFF1ZXVlRGVwdGgpOworCX0KKwlRdWV1ZURlcHRoID0gMDsKKwlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykKKwkJaWYgKEhvc3RBZGFwdGVyLT5UYXJnZXRGbGFnc1tUYXJnZXRJRF0uVGFyZ2V0RXhpc3RzKSB7CisJCQlRdWV1ZURlcHRoICs9IEhvc3RBZGFwdGVyLT5RdWV1ZURlcHRoW1RhcmdldElEXTsKKwkJfQorCWlmIChRdWV1ZURlcHRoID4gSG9zdEFkYXB0ZXItPkFsbG9jYXRlZENDQnMpCisJCUJ1c0xvZ2ljX0NyZWF0ZUFkZGl0aW9uYWxDQ0JzKEhvc3RBZGFwdGVyLCBRdWV1ZURlcHRoIC0gSG9zdEFkYXB0ZXItPkFsbG9jYXRlZENDQnMsIGZhbHNlKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAgQnVzTG9naWNfRGV0ZWN0SG9zdEFkYXB0ZXIgcHJvYmVzIGZvciBCdXNMb2dpYyBIb3N0IEFkYXB0ZXJzIGF0IHRoZSBzdGFuZGFyZAorICBJL08gQWRkcmVzc2VzIHdoZXJlIHRoZXkgbWF5IGJlIGxvY2F0ZWQsIGluaXRpYWxpemluZywgcmVnaXN0ZXJpbmcsIGFuZAorICByZXBvcnRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBCdXNMb2dpYyBIb3N0IEFkYXB0ZXIgaXQgZmluZHMuICBJdAorICByZXR1cm5zIHRoZSBudW1iZXIgb2YgQnVzTG9naWMgSG9zdCBBZGFwdGVycyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgYW5kCisgIHJlZ2lzdGVyZWQuCisqLworCitzdGF0aWMgaW50IF9faW5pdCBCdXNMb2dpY19pbml0KHZvaWQpCit7CisJaW50IEJ1c0xvZ2ljSG9zdEFkYXB0ZXJDb3VudCA9IDAsIERyaXZlck9wdGlvbnNJbmRleCA9IDAsIFByb2JlSW5kZXg7CisJc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpQcm90b3R5cGVIb3N0QWRhcHRlcjsKKworI2lmZGVmIE1PRFVMRQorCWlmIChCdXNMb2dpYykKKwkJQnVzTG9naWNfU2V0dXAoQnVzTG9naWMpOworI2VuZGlmCisKKwlpZiAoQnVzTG9naWNfUHJvYmVPcHRpb25zLk5vUHJvYmUpCisJCXJldHVybiAtRU5PREVWOworCUJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3QgPSAoc3RydWN0IEJ1c0xvZ2ljX1Byb2JlSW5mbyAqKQorCSAgICBrbWFsbG9jKEJ1c0xvZ2ljX01heEhvc3RBZGFwdGVycyAqIHNpemVvZihzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvKSwgR0ZQX0FUT01JQyk7CisJaWYgKEJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3QgPT0gTlVMTCkgeworCQlCdXNMb2dpY19FcnJvcigiQnVzTG9naWM6IFVuYWJsZSB0byBhbGxvY2F0ZSBQcm9iZSBJbmZvIExpc3RcbiIsIE5VTEwpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KEJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3QsIDAsIEJ1c0xvZ2ljX01heEhvc3RBZGFwdGVycyAqIHNpemVvZihzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvKSk7CisJUHJvdG90eXBlSG9zdEFkYXB0ZXIgPSAoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICopCisJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciksIEdGUF9BVE9NSUMpOworCWlmIChQcm90b3R5cGVIb3N0QWRhcHRlciA9PSBOVUxMKSB7CisJCWtmcmVlKEJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3QpOworCQlCdXNMb2dpY19FcnJvcigiQnVzTG9naWM6IFVuYWJsZSB0byBhbGxvY2F0ZSBQcm90b3R5cGUgIiAiSG9zdCBBZGFwdGVyXG4iLCBOVUxMKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChQcm90b3R5cGVIb3N0QWRhcHRlciwgMCwgc2l6ZW9mKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlcikpOworI2lmZGVmIE1PRFVMRQorCWlmIChCdXNMb2dpYyAhPSBOVUxMKQorCQlCdXNMb2dpY19TZXR1cChCdXNMb2dpYyk7CisjZW5kaWYKKwlCdXNMb2dpY19Jbml0aWFsaXplUHJvYmVJbmZvTGlzdChQcm90b3R5cGVIb3N0QWRhcHRlcik7CisJZm9yIChQcm9iZUluZGV4ID0gMDsgUHJvYmVJbmRleCA8IEJ1c0xvZ2ljX1Byb2JlSW5mb0NvdW50OyBQcm9iZUluZGV4KyspIHsKKwkJc3RydWN0IEJ1c0xvZ2ljX1Byb2JlSW5mbyAqUHJvYmVJbmZvID0gJkJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3RbUHJvYmVJbmRleF07CisJCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSBQcm90b3R5cGVIb3N0QWRhcHRlcjsKKwkJc3RydWN0IFNjc2lfSG9zdCAqSG9zdDsKKwkJaWYgKFByb2JlSW5mby0+SU9fQWRkcmVzcyA9PSAwKQorCQkJY29udGludWU7CisJCW1lbXNldChIb3N0QWRhcHRlciwgMCwgc2l6ZW9mKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlcikpOworCQlIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJUeXBlID0gUHJvYmVJbmZvLT5Ib3N0QWRhcHRlclR5cGU7CisJCUhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckJ1c1R5cGUgPSBQcm9iZUluZm8tPkhvc3RBZGFwdGVyQnVzVHlwZTsKKwkJSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MgPSBQcm9iZUluZm8tPklPX0FkZHJlc3M7CisJCUhvc3RBZGFwdGVyLT5QQ0lfQWRkcmVzcyA9IFByb2JlSW5mby0+UENJX0FkZHJlc3M7CisJCUhvc3RBZGFwdGVyLT5CdXMgPSBQcm9iZUluZm8tPkJ1czsKKwkJSG9zdEFkYXB0ZXItPkRldmljZSA9IFByb2JlSW5mby0+RGV2aWNlOworCQlIb3N0QWRhcHRlci0+SVJRX0NoYW5uZWwgPSBQcm9iZUluZm8tPklSUV9DaGFubmVsOworCQlIb3N0QWRhcHRlci0+QWRkcmVzc0NvdW50ID0gQnVzTG9naWNfSG9zdEFkYXB0ZXJBZGRyZXNzQ291bnRbSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyVHlwZV07CisJCS8qCisJCSAgIFByb2JlIHRoZSBIb3N0IEFkYXB0ZXIuICBJZiB1bnN1Y2Nlc3NmdWwsIGFib3J0IGZ1cnRoZXIgaW5pdGlhbGl6YXRpb24uCisJCSAqLworCQlpZiAoIUJ1c0xvZ2ljX1Byb2JlSG9zdEFkYXB0ZXIoSG9zdEFkYXB0ZXIpKQorCQkJY29udGludWU7CisJCS8qCisJCSAgIEhhcmQgUmVzZXQgdGhlIEhvc3QgQWRhcHRlci4gIElmIHVuc3VjY2Vzc2Z1bCwgYWJvcnQgZnVydGhlcgorCQkgICBpbml0aWFsaXphdGlvbi4KKwkJICovCisJCWlmICghQnVzTG9naWNfSGFyZHdhcmVSZXNldEhvc3RBZGFwdGVyKEhvc3RBZGFwdGVyLCB0cnVlKSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgICBDaGVjayB0aGUgSG9zdCBBZGFwdGVyLiAgSWYgdW5zdWNjZXNzZnVsLCBhYm9ydCBmdXJ0aGVyIGluaXRpYWxpemF0aW9uLgorCQkgKi8KKwkJaWYgKCFCdXNMb2dpY19DaGVja0hvc3RBZGFwdGVyKEhvc3RBZGFwdGVyKSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgICBJbml0aWFsaXplIHRoZSBEcml2ZXIgT3B0aW9ucyBmaWVsZCBpZiBwcm92aWRlZC4KKwkJICovCisJCWlmIChEcml2ZXJPcHRpb25zSW5kZXggPCBCdXNMb2dpY19Ecml2ZXJPcHRpb25zQ291bnQpCisJCQlIb3N0QWRhcHRlci0+RHJpdmVyT3B0aW9ucyA9ICZCdXNMb2dpY19Ecml2ZXJPcHRpb25zW0RyaXZlck9wdGlvbnNJbmRleCsrXTsKKwkJLyoKKwkJICAgQW5ub3VuY2UgdGhlIERyaXZlciBWZXJzaW9uIGFuZCBEYXRlLCBBdXRob3IncyBOYW1lLCBDb3B5cmlnaHQgTm90aWNlLAorCQkgICBhbmQgRWxlY3Ryb25pYyBNYWlsIEFkZHJlc3MuCisJCSAqLworCQlCdXNMb2dpY19Bbm5vdW5jZURyaXZlcihIb3N0QWRhcHRlcik7CisJCS8qCisJCSAgIFJlZ2lzdGVyIHVzYWdlIG9mIHRoZSBJL08gQWRkcmVzcyByYW5nZS4gIEZyb20gdGhpcyBwb2ludCBvbndhcmQsIGFueQorCQkgICBmYWlsdXJlIHdpbGwgYmUgYXNzdW1lZCB0byBiZSBkdWUgdG8gYSBwcm9ibGVtIHdpdGggdGhlIEhvc3QgQWRhcHRlciwKKwkJICAgcmF0aGVyIHRoYW4gZHVlIHRvIGhhdmluZyBtaXN0YWtlbmx5IGlkZW50aWZpZWQgdGhpcyBwb3J0IGFzIGJlbG9uZ2luZworCQkgICB0byBhIEJ1c0xvZ2ljIEhvc3QgQWRhcHRlci4gIFRoZSBJL08gQWRkcmVzcyByYW5nZSB3aWxsIG5vdCBiZQorCQkgICByZWxlYXNlZCwgdGhlcmVieSBwcmV2ZW50aW5nIGl0IGZyb20gYmVpbmcgaW5jb3JyZWN0bHkgaWRlbnRpZmllZCBhcworCQkgICBhbnkgb3RoZXIgdHlwZSBvZiBIb3N0IEFkYXB0ZXIuCisJCSAqLworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKEhvc3RBZGFwdGVyLT5JT19BZGRyZXNzLCBIb3N0QWRhcHRlci0+QWRkcmVzc0NvdW50LCAiQnVzTG9naWMiKSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgICBSZWdpc3RlciB0aGUgU0NTSSBIb3N0IHN0cnVjdHVyZS4KKwkJICovCisKKwkJSG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmQnVzX0xvZ2ljX3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyKSk7CisJCWlmIChIb3N0ID09IE5VTEwpIHsKKwkJCXJlbGVhc2VfcmVnaW9uKEhvc3RBZGFwdGVyLT5JT19BZGRyZXNzLCBIb3N0QWRhcHRlci0+QWRkcmVzc0NvdW50KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCUhvc3RBZGFwdGVyID0gKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqKSBIb3N0LT5ob3N0ZGF0YTsKKwkJbWVtY3B5KEhvc3RBZGFwdGVyLCBQcm90b3R5cGVIb3N0QWRhcHRlciwgc2l6ZW9mKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlcikpOworCQlIb3N0QWRhcHRlci0+U0NTSV9Ib3N0ID0gSG9zdDsKKwkJSG9zdEFkYXB0ZXItPkhvc3ROdW1iZXIgPSBIb3N0LT5ob3N0X25vOworCQkvKgorCQkgICBBZGQgSG9zdCBBZGFwdGVyIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBCdXNMb2dpYworCQkgICBIb3N0IEFkYXB0ZXJzLgorCQkgKi8KKwkJbGlzdF9hZGRfdGFpbCgmSG9zdEFkYXB0ZXItPmhvc3RfbGlzdCwgJkJ1c0xvZ2ljX2hvc3RfbGlzdCk7CisKKwkJLyoKKwkJICAgUmVhZCB0aGUgSG9zdCBBZGFwdGVyIENvbmZpZ3VyYXRpb24sIENvbmZpZ3VyZSB0aGUgSG9zdCBBZGFwdGVyLAorCQkgICBBY3F1aXJlIHRoZSBTeXN0ZW0gUmVzb3VyY2VzIG5lY2Vzc2FyeSB0byB1c2UgdGhlIEhvc3QgQWRhcHRlciwgdGhlbgorCQkgICBDcmVhdGUgdGhlIEluaXRpYWwgQ0NCcywgSW5pdGlhbGl6ZSB0aGUgSG9zdCBBZGFwdGVyLCBhbmQgZmluYWxseQorCQkgICBwZXJmb3JtIFRhcmdldCBEZXZpY2UgSW5xdWlyeS4KKwkJICovCisJCWlmIChCdXNMb2dpY19SZWFkSG9zdEFkYXB0ZXJDb25maWd1cmF0aW9uKEhvc3RBZGFwdGVyKSAmJgorCQkgICAgQnVzTG9naWNfUmVwb3J0SG9zdEFkYXB0ZXJDb25maWd1cmF0aW9uKEhvc3RBZGFwdGVyKSAmJiBCdXNMb2dpY19BY3F1aXJlUmVzb3VyY2VzKEhvc3RBZGFwdGVyKSAmJiBCdXNMb2dpY19DcmVhdGVJbml0aWFsQ0NCcyhIb3N0QWRhcHRlcikgJiYgQnVzTG9naWNfSW5pdGlhbGl6ZUhvc3RBZGFwdGVyKEhvc3RBZGFwdGVyKSAmJiBCdXNMb2dpY19UYXJnZXREZXZpY2VJbnF1aXJ5KEhvc3RBZGFwdGVyKSkgeworCQkJLyoKKwkJCSAgIEluaXRpYWxpemF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuICBSZWxlYXNlIGFuZAorCQkJICAgcmUtcmVnaXN0ZXIgdXNhZ2Ugb2YgdGhlIEkvTyBBZGRyZXNzIHJhbmdlIHNvIHRoYXQgdGhlIE1vZGVsCisJCQkgICBOYW1lIG9mIHRoZSBIb3N0IEFkYXB0ZXIgd2lsbCBhcHBlYXIsIGFuZCBpbml0aWFsaXplIHRoZSBTQ1NJCisJCQkgICBIb3N0IHN0cnVjdHVyZS4KKwkJCSAqLworCQkJcmVsZWFzZV9yZWdpb24oSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MsIEhvc3RBZGFwdGVyLT5BZGRyZXNzQ291bnQpOworCQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihIb3N0QWRhcHRlci0+SU9fQWRkcmVzcywgSG9zdEFkYXB0ZXItPkFkZHJlc3NDb3VudCwgSG9zdEFkYXB0ZXItPkZ1bGxNb2RlbE5hbWUpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQnVzTG9naWM6IFJlbGVhc2UgYW5kIHJlLXJlZ2lzdGVyIG9mICIgInBvcnQgMHglMDRseCBmYWlsZWQgXG4iLCAodW5zaWduZWQgbG9uZykgSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MpOworCQkJCUJ1c0xvZ2ljX0Rlc3Ryb3lDQ0JzKEhvc3RBZGFwdGVyKTsKKwkJCQlCdXNMb2dpY19SZWxlYXNlUmVzb3VyY2VzKEhvc3RBZGFwdGVyKTsKKwkJCQlsaXN0X2RlbCgmSG9zdEFkYXB0ZXItPmhvc3RfbGlzdCk7CisJCQkJc2NzaV9ob3N0X3B1dChIb3N0KTsKKwkJCX0gZWxzZSB7CisJCQkJQnVzTG9naWNfSW5pdGlhbGl6ZUhvc3RTdHJ1Y3R1cmUoSG9zdEFkYXB0ZXIsIEhvc3QpOworCQkJCXNjc2lfYWRkX2hvc3QoSG9zdCwgTlVMTCk7CisJCQkJc2NzaV9zY2FuX2hvc3QoSG9zdCk7CisJCQkJQnVzTG9naWNIb3N0QWRhcHRlckNvdW50Kys7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICAgQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIEhvc3QgQWRhcHRlciBDb25maWd1cmF0aW9uIFF1ZXJ5aW5nLCBIb3N0CisJCQkgICBBZGFwdGVyIENvbmZpZ3VyYXRpb24sIFJlc291cmNlIEFjcXVpc2l0aW9uLCBDQ0IgQ3JlYXRpb24sIEhvc3QKKwkJCSAgIEFkYXB0ZXIgSW5pdGlhbGl6YXRpb24sIG9yIFRhcmdldCBEZXZpY2UgSW5xdWlyeSwgc28gcmVtb3ZlIEhvc3QKKwkJCSAgIEFkYXB0ZXIgZnJvbSB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIEJ1c0xvZ2ljIEhvc3QgQWRhcHRlcnMsIGRlc3Ryb3kKKwkJCSAgIHRoZSBDQ0JzLCBSZWxlYXNlIHRoZSBTeXN0ZW0gUmVzb3VyY2VzLCBhbmQgVW5yZWdpc3RlciB0aGUgU0NTSQorCQkJICAgSG9zdC4KKwkJCSAqLworCQkJQnVzTG9naWNfRGVzdHJveUNDQnMoSG9zdEFkYXB0ZXIpOworCQkJQnVzTG9naWNfUmVsZWFzZVJlc291cmNlcyhIb3N0QWRhcHRlcik7CisJCQlsaXN0X2RlbCgmSG9zdEFkYXB0ZXItPmhvc3RfbGlzdCk7CisJCQlzY3NpX2hvc3RfcHV0KEhvc3QpOworCQl9CisJfQorCWtmcmVlKFByb3RvdHlwZUhvc3RBZGFwdGVyKTsKKwlrZnJlZShCdXNMb2dpY19Qcm9iZUluZm9MaXN0KTsKKwlCdXNMb2dpY19Qcm9iZUluZm9MaXN0ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICBCdXNMb2dpY19SZWxlYXNlSG9zdEFkYXB0ZXIgcmVsZWFzZXMgYWxsIHJlc291cmNlcyBwcmV2aW91c2x5IGFjcXVpcmVkIHRvCisgIHN1cHBvcnQgYSBzcGVjaWZpYyBIb3N0IEFkYXB0ZXIsIGluY2x1ZGluZyB0aGUgSS9PIEFkZHJlc3MgcmFuZ2UsIGFuZAorICB1bnJlZ2lzdGVycyB0aGUgQnVzTG9naWMgSG9zdCBBZGFwdGVyLgorKi8KKworc3RhdGljIGludCBfX2V4aXQgQnVzTG9naWNfUmVsZWFzZUhvc3RBZGFwdGVyKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqSG9zdCA9IEhvc3RBZGFwdGVyLT5TQ1NJX0hvc3Q7CisKKwlzY3NpX3JlbW92ZV9ob3N0KEhvc3QpOworCisJLyoKKwkgICBGbGFzaFBvaW50IEhvc3QgQWRhcHRlcnMgbXVzdCBmaXJzdCBiZSByZWxlYXNlZCBieSB0aGUgRmxhc2hQb2ludAorCSAgIFNDQ0IgTWFuYWdlci4KKwkgKi8KKwlpZiAoQnVzTG9naWNfRmxhc2hQb2ludEhvc3RBZGFwdGVyUChIb3N0QWRhcHRlcikpCisJCUZsYXNoUG9pbnRfUmVsZWFzZUhvc3RBZGFwdGVyKEhvc3RBZGFwdGVyLT5DYXJkSGFuZGxlKTsKKwkvKgorCSAgIERlc3Ryb3kgdGhlIENDQnMgYW5kIHJlbGVhc2UgYW55IHN5c3RlbSByZXNvdXJjZXMgYWNxdWlyZWQgdG8KKwkgICBzdXBwb3J0IEhvc3QgQWRhcHRlci4KKwkgKi8KKwlCdXNMb2dpY19EZXN0cm95Q0NCcyhIb3N0QWRhcHRlcik7CisJQnVzTG9naWNfUmVsZWFzZVJlc291cmNlcyhIb3N0QWRhcHRlcik7CisJLyoKKwkgICBSZWxlYXNlIHVzYWdlIG9mIHRoZSBJL08gQWRkcmVzcyByYW5nZS4KKwkgKi8KKwlyZWxlYXNlX3JlZ2lvbihIb3N0QWRhcHRlci0+SU9fQWRkcmVzcywgSG9zdEFkYXB0ZXItPkFkZHJlc3NDb3VudCk7CisJLyoKKwkgICBSZW1vdmUgSG9zdCBBZGFwdGVyIGZyb20gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBCdXNMb2dpYyBIb3N0IEFkYXB0ZXJzLgorCSAqLworCWxpc3RfZGVsKCZIb3N0QWRhcHRlci0+aG9zdF9saXN0KTsKKworCXNjc2lfaG9zdF9wdXQoSG9zdCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAgQnVzTG9naWNfUXVldWVDb21wbGV0ZWRDQ0IgcXVldWVzIENDQiBmb3IgY29tcGxldGlvbiBwcm9jZXNzaW5nLgorKi8KKworc3RhdGljIHZvaWQgQnVzTG9naWNfUXVldWVDb21wbGV0ZWRDQ0Ioc3RydWN0IEJ1c0xvZ2ljX0NDQiAqQ0NCKQoreworCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSBDQ0ItPkhvc3RBZGFwdGVyOworCUNDQi0+U3RhdHVzID0gQnVzTG9naWNfQ0NCX0NvbXBsZXRlZDsKKwlDQ0ItPk5leHQgPSBOVUxMOworCWlmIChIb3N0QWRhcHRlci0+Rmlyc3RDb21wbGV0ZWRDQ0IgPT0gTlVMTCkgeworCQlIb3N0QWRhcHRlci0+Rmlyc3RDb21wbGV0ZWRDQ0IgPSBDQ0I7CisJCUhvc3RBZGFwdGVyLT5MYXN0Q29tcGxldGVkQ0NCID0gQ0NCOworCX0gZWxzZSB7CisJCUhvc3RBZGFwdGVyLT5MYXN0Q29tcGxldGVkQ0NCLT5OZXh0ID0gQ0NCOworCQlIb3N0QWRhcHRlci0+TGFzdENvbXBsZXRlZENDQiA9IENDQjsKKwl9CisJSG9zdEFkYXB0ZXItPkFjdGl2ZUNvbW1hbmRzW0NDQi0+VGFyZ2V0SURdLS07Cit9CisKKworLyoKKyAgQnVzTG9naWNfQ29tcHV0ZVJlc3VsdENvZGUgY29tcHV0ZXMgYSBTQ1NJIFN1YnN5c3RlbSBSZXN1bHQgQ29kZSBmcm9tCisgIHRoZSBIb3N0IEFkYXB0ZXIgU3RhdHVzIGFuZCBUYXJnZXQgRGV2aWNlIFN0YXR1cy4KKyovCisKK3N0YXRpYyBpbnQgQnVzTG9naWNfQ29tcHV0ZVJlc3VsdENvZGUoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlciwgZW51bSBCdXNMb2dpY19Ib3N0QWRhcHRlclN0YXR1cyBIb3N0QWRhcHRlclN0YXR1cywgZW51bSBCdXNMb2dpY19UYXJnZXREZXZpY2VTdGF0dXMgVGFyZ2V0RGV2aWNlU3RhdHVzKQoreworCWludCBIb3N0U3RhdHVzOworCXN3aXRjaCAoSG9zdEFkYXB0ZXJTdGF0dXMpIHsKKwljYXNlIEJ1c0xvZ2ljX0NvbW1hbmRDb21wbGV0ZWROb3JtYWxseToKKwljYXNlIEJ1c0xvZ2ljX0xpbmtlZENvbW1hbmRDb21wbGV0ZWQ6CisJY2FzZSBCdXNMb2dpY19MaW5rZWRDb21tYW5kQ29tcGxldGVkV2l0aEZsYWc6CisJCUhvc3RTdGF0dXMgPSBESURfT0s7CisJCWJyZWFrOworCWNhc2UgQnVzTG9naWNfU0NTSVNlbGVjdGlvblRpbWVvdXQ6CisJCUhvc3RTdGF0dXMgPSBESURfVElNRV9PVVQ7CisJCWJyZWFrOworCWNhc2UgQnVzTG9naWNfSW52YWxpZE91dGdvaW5nTWFpbGJveEFjdGlvbkNvZGU6CisJY2FzZSBCdXNMb2dpY19JbnZhbGlkQ29tbWFuZE9wZXJhdGlvbkNvZGU6CisJY2FzZSBCdXNMb2dpY19JbnZhbGlkQ29tbWFuZFBhcmFtZXRlcjoKKwkJQnVzTG9naWNfV2FybmluZygiQnVzTG9naWMgRHJpdmVyIFByb3RvY29sIEVycm9yIDB4JTAyWFxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyU3RhdHVzKTsKKwljYXNlIEJ1c0xvZ2ljX0RhdGFVbmRlclJ1bjoKKwljYXNlIEJ1c0xvZ2ljX0RhdGFPdmVyUnVuOgorCWNhc2UgQnVzTG9naWNfVW5leHBlY3RlZEJ1c0ZyZWU6CisJY2FzZSBCdXNMb2dpY19MaW5rZWRDQ0JoYXNJbnZhbGlkTFVOOgorCWNhc2UgQnVzTG9naWNfQXV0b1JlcXVlc3RTZW5zZUZhaWxlZDoKKwljYXNlIEJ1c0xvZ2ljX1RhZ2dlZFF1ZXVpbmdNZXNzYWdlUmVqZWN0ZWQ6CisJY2FzZSBCdXNMb2dpY19VbnN1cHBvcnRlZE1lc3NhZ2VSZWNlaXZlZDoKKwljYXNlIEJ1c0xvZ2ljX0hvc3RBZGFwdGVySGFyZHdhcmVGYWlsZWQ6CisJY2FzZSBCdXNMb2dpY19UYXJnZXREZXZpY2VSZWNvbm5lY3RlZEltcHJvcGVybHk6CisJY2FzZSBCdXNMb2dpY19BYm9ydFF1ZXVlR2VuZXJhdGVkOgorCWNhc2UgQnVzTG9naWNfSG9zdEFkYXB0ZXJTb2Z0d2FyZUVycm9yOgorCWNhc2UgQnVzTG9naWNfSG9zdEFkYXB0ZXJIYXJkd2FyZVRpbWVvdXRFcnJvcjoKKwljYXNlIEJ1c0xvZ2ljX1NDU0lQYXJpdHlFcnJvckRldGVjdGVkOgorCQlIb3N0U3RhdHVzID0gRElEX0VSUk9SOworCQlicmVhazsKKwljYXNlIEJ1c0xvZ2ljX0ludmFsaWRCdXNQaGFzZVJlcXVlc3RlZDoKKwljYXNlIEJ1c0xvZ2ljX1RhcmdldEZhaWxlZFJlc3BvbnNlVG9BVE46CisJY2FzZSBCdXNMb2dpY19Ib3N0QWRhcHRlckFzc2VydGVkUlNUOgorCWNhc2UgQnVzTG9naWNfT3RoZXJEZXZpY2VBc3NlcnRlZFJTVDoKKwljYXNlIEJ1c0xvZ2ljX0hvc3RBZGFwdGVyQXNzZXJ0ZWRCdXNEZXZpY2VSZXNldDoKKwkJSG9zdFN0YXR1cyA9IERJRF9SRVNFVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQnVzTG9naWNfV2FybmluZygiVW5rbm93biBIb3N0IEFkYXB0ZXIgU3RhdHVzIDB4JTAyWFxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyU3RhdHVzKTsKKwkJSG9zdFN0YXR1cyA9IERJRF9FUlJPUjsKKwkJYnJlYWs7CisJfQorCXJldHVybiAoSG9zdFN0YXR1cyA8PCAxNikgfCBUYXJnZXREZXZpY2VTdGF0dXM7Cit9CisKKworLyoKKyAgQnVzTG9naWNfU2NhbkluY29taW5nTWFpbGJveGVzIHNjYW5zIHRoZSBJbmNvbWluZyBNYWlsYm94ZXMgc2F2aW5nIGFueQorICBJbmNvbWluZyBNYWlsYm94IGVudHJpZXMgZm9yIGNvbXBsZXRpb24gcHJvY2Vzc2luZy4KKyovCisKK3N0YXRpYyB2b2lkIEJ1c0xvZ2ljX1NjYW5JbmNvbWluZ01haWxib3hlcyhzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyKQoreworCS8qCisJICAgU2NhbiB0aHJvdWdoIHRoZSBJbmNvbWluZyBNYWlsYm94ZXMgaW4gU3RyaWN0IFJvdW5kIFJvYmluIGZhc2hpb24sIHNhdmluZworCSAgIGFueSBjb21wbGV0ZWQgQ0NCcyBmb3IgZnVydGhlciBwcm9jZXNzaW5nLiAgSXQgaXMgZXNzZW50aWFsIHRoYXQgZm9yIGVhY2gKKwkgICBDQ0IgYW5kIFNDU0kgQ29tbWFuZCBpc3N1ZWQsIGNvbW1hbmQgY29tcGxldGlvbiBwcm9jZXNzaW5nIGlzIHBlcmZvcm1lZAorCSAgIGV4YWN0bHkgb25jZS4gIFRoZXJlZm9yZSwgb25seSBJbmNvbWluZyBNYWlsYm94ZXMgd2l0aCBjb21wbGV0aW9uIGNvZGUKKwkgICBDb21tYW5kIENvbXBsZXRlZCBXaXRob3V0IEVycm9yLCBDb21tYW5kIENvbXBsZXRlZCBXaXRoIEVycm9yLCBvciBDb21tYW5kCisJICAgQWJvcnRlZCBBdCBIb3N0IFJlcXVlc3QgYXJlIHNhdmVkIGZvciBjb21wbGV0aW9uIHByb2Nlc3NpbmcuICBXaGVuIGFuCisJICAgSW5jb21pbmcgTWFpbGJveCBoYXMgYSBjb21wbGV0aW9uIGNvZGUgb2YgQWJvcnRlZCBDb21tYW5kIE5vdCBGb3VuZCwgdGhlCisJICAgQ0NCIGhhZCBhbHJlYWR5IGNvbXBsZXRlZCBvciBiZWVuIGFib3J0ZWQgYmVmb3JlIHRoZSBjdXJyZW50IEFib3J0IHJlcXVlc3QKKwkgICB3YXMgcHJvY2Vzc2VkLCBhbmQgc28gY29tcGxldGlvbiBwcm9jZXNzaW5nIGhhcyBhbHJlYWR5IG9jY3VycmVkIGFuZCBubworCSAgIGZ1cnRoZXIgYWN0aW9uIHNob3VsZCBiZSB0YWtlbi4KKwkgKi8KKwlzdHJ1Y3QgQnVzTG9naWNfSW5jb21pbmdNYWlsYm94ICpOZXh0SW5jb21pbmdNYWlsYm94ID0gSG9zdEFkYXB0ZXItPk5leHRJbmNvbWluZ01haWxib3g7CisJZW51bSBCdXNMb2dpY19Db21wbGV0aW9uQ29kZSBDb21wbGV0aW9uQ29kZTsKKwl3aGlsZSAoKENvbXBsZXRpb25Db2RlID0gTmV4dEluY29taW5nTWFpbGJveC0+Q29tcGxldGlvbkNvZGUpICE9IEJ1c0xvZ2ljX0luY29taW5nTWFpbGJveEZyZWUpIHsKKwkJLyoKKwkJICAgV2UgYXJlIG9ubHkgYWxsb3dlZCB0byBkbyB0aGlzIGJlY2F1c2Ugd2UgbGltaXQgb3VyIGFyY2hpdGVjdHVyZXMgd2UKKwkJICAgcnVuIG9uIHRvIG1hY2hpbmVzIHdoZXJlIGJ1c190b192aXJ0KCkgYWN0dWFsbHkgd29ya3MuICBUaGVyZSAqbmVlZHMqCisJCSAgIHRvIGJlIGEgZG1hX2FkZHJfdG9fdmlydCgpIGluIHRoZSBuZXcgUENJIERNQSBtYXBwaW5nIGludGVyZmFjZSB0bworCQkgICByZXBsYWNlIGJ1c190b192aXJ0KCkgb3IgZWxzZSB0aGlzIGNvZGUgaXMgZ29pbmcgdG8gYmVjb21lIHZlcnkKKwkJICAgaW5uZWZmaWNpZW50LgorCQkgKi8KKwkJc3RydWN0IEJ1c0xvZ2ljX0NDQiAqQ0NCID0gKHN0cnVjdCBCdXNMb2dpY19DQ0IgKikgQnVzX3RvX1ZpcnR1YWwoTmV4dEluY29taW5nTWFpbGJveC0+Q0NCKTsKKwkJaWYgKENvbXBsZXRpb25Db2RlICE9IEJ1c0xvZ2ljX0Fib3J0ZWRDb21tYW5kTm90Rm91bmQpIHsKKwkJCWlmIChDQ0ItPlN0YXR1cyA9PSBCdXNMb2dpY19DQ0JfQWN0aXZlIHx8IENDQi0+U3RhdHVzID09IEJ1c0xvZ2ljX0NDQl9SZXNldCkgeworCQkJCS8qCisJCQkJICAgU2F2ZSB0aGUgQ29tcGxldGlvbiBDb2RlIGZvciB0aGlzIENDQiBhbmQgcXVldWUgdGhlIENDQgorCQkJCSAgIGZvciBjb21wbGV0aW9uIHByb2Nlc3NpbmcuCisJCQkJICovCisJCQkJQ0NCLT5Db21wbGV0aW9uQ29kZSA9IENvbXBsZXRpb25Db2RlOworCQkJCUJ1c0xvZ2ljX1F1ZXVlQ29tcGxldGVkQ0NCKENDQik7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICAgSWYgYSBDQ0IgZXZlciBhcHBlYXJzIGluIGFuIEluY29taW5nIE1haWxib3ggYW5kIGlzIG5vdCBtYXJrZWQKKwkJCQkgICBhcyBzdGF0dXMgQWN0aXZlIG9yIFJlc2V0LCB0aGVuIHRoZXJlIGlzIG1vc3QgbGlrZWx5IGEgYnVnIGluCisJCQkJICAgdGhlIEhvc3QgQWRhcHRlciBmaXJtd2FyZS4KKwkJCQkgKi8KKwkJCQlCdXNMb2dpY19XYXJuaW5nKCJJbGxlZ2FsIENDQiAjJWxkIHN0YXR1cyAlZCBpbiAiICJJbmNvbWluZyBNYWlsYm94XG4iLCBIb3N0QWRhcHRlciwgQ0NCLT5TZXJpYWxOdW1iZXIsIENDQi0+U3RhdHVzKTsKKwkJCX0KKwkJfQorCQlOZXh0SW5jb21pbmdNYWlsYm94LT5Db21wbGV0aW9uQ29kZSA9IEJ1c0xvZ2ljX0luY29taW5nTWFpbGJveEZyZWU7CisJCWlmICgrK05leHRJbmNvbWluZ01haWxib3ggPiBIb3N0QWRhcHRlci0+TGFzdEluY29taW5nTWFpbGJveCkKKwkJCU5leHRJbmNvbWluZ01haWxib3ggPSBIb3N0QWRhcHRlci0+Rmlyc3RJbmNvbWluZ01haWxib3g7CisJfQorCUhvc3RBZGFwdGVyLT5OZXh0SW5jb21pbmdNYWlsYm94ID0gTmV4dEluY29taW5nTWFpbGJveDsKK30KKworCisvKgorICBCdXNMb2dpY19Qcm9jZXNzQ29tcGxldGVkQ0NCcyBpdGVyYXRlcyBvdmVyIHRoZSBjb21wbGV0ZWQgQ0NCcyBmb3IgSG9zdAorICBBZGFwdGVyIHNldHRpbmcgdGhlIFNDU0kgQ29tbWFuZCBSZXN1bHQgQ29kZXMsIGRlYWxsb2NhdGluZyB0aGUgQ0NCcywgYW5kCisgIGNhbGxpbmcgdGhlIFNDU0kgU3Vic3lzdGVtIENvbXBsZXRpb24gUm91dGluZXMuICBUaGUgSG9zdCBBZGFwdGVyJ3MgTG9jaworICBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gYWNxdWlyZWQgYnkgdGhlIGNhbGxlci4KKyovCisKK3N0YXRpYyB2b2lkIEJ1c0xvZ2ljX1Byb2Nlc3NDb21wbGV0ZWRDQ0JzKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIpCit7CisJaWYgKEhvc3RBZGFwdGVyLT5Qcm9jZXNzQ29tcGxldGVkQ0NCc0FjdGl2ZSkKKwkJcmV0dXJuOworCUhvc3RBZGFwdGVyLT5Qcm9jZXNzQ29tcGxldGVkQ0NCc0FjdGl2ZSA9IHRydWU7CisJd2hpbGUgKEhvc3RBZGFwdGVyLT5GaXJzdENvbXBsZXRlZENDQiAhPSBOVUxMKSB7CisJCXN0cnVjdCBCdXNMb2dpY19DQ0IgKkNDQiA9IEhvc3RBZGFwdGVyLT5GaXJzdENvbXBsZXRlZENDQjsKKwkJc3RydWN0IHNjc2lfY21uZCAqQ29tbWFuZCA9IENDQi0+Q29tbWFuZDsKKwkJSG9zdEFkYXB0ZXItPkZpcnN0Q29tcGxldGVkQ0NCID0gQ0NCLT5OZXh0OworCQlpZiAoSG9zdEFkYXB0ZXItPkZpcnN0Q29tcGxldGVkQ0NCID09IE5VTEwpCisJCQlIb3N0QWRhcHRlci0+TGFzdENvbXBsZXRlZENDQiA9IE5VTEw7CisJCS8qCisJCSAgIFByb2Nlc3MgdGhlIENvbXBsZXRlZCBDQ0IuCisJCSAqLworCQlpZiAoQ0NCLT5PcGNvZGUgPT0gQnVzTG9naWNfQnVzRGV2aWNlUmVzZXQpIHsKKwkJCWludCBUYXJnZXRJRCA9IENDQi0+VGFyZ2V0SUQ7CisJCQlCdXNMb2dpY19XYXJuaW5nKCJCdXMgRGV2aWNlIFJlc2V0IENDQiAjJWxkIHRvIFRhcmdldCAiICIlZCBDb21wbGV0ZWRcbiIsIEhvc3RBZGFwdGVyLCBDQ0ItPlNlcmlhbE51bWJlciwgVGFyZ2V0SUQpOworCQkJQnVzTG9naWNfSW5jcmVtZW50RXJyb3JDb3VudGVyKCZIb3N0QWRhcHRlci0+VGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uQnVzRGV2aWNlUmVzZXRzQ29tcGxldGVkKTsKKwkJCUhvc3RBZGFwdGVyLT5UYXJnZXRGbGFnc1tUYXJnZXRJRF0uVGFnZ2VkUXVldWluZ0FjdGl2ZSA9IGZhbHNlOworCQkJSG9zdEFkYXB0ZXItPkNvbW1hbmRzU2luY2VSZXNldFtUYXJnZXRJRF0gPSAwOworCQkJSG9zdEFkYXB0ZXItPkxhc3RSZXNldENvbXBsZXRlZFtUYXJnZXRJRF0gPSBqaWZmaWVzOworCQkJLyoKKwkJCSAgIFBsYWNlIENDQiBiYWNrIG9uIHRoZSBIb3N0IEFkYXB0ZXIncyBmcmVlIGxpc3QuCisJCQkgKi8KKwkJCUJ1c0xvZ2ljX0RlYWxsb2NhdGVDQ0IoQ0NCKTsKKyNpZiAwCQkJCS8qIHRoaXMgbmVlZHMgdG8gYmUgcmVkb25lIGRpZmZlcmVudCBmb3IgbmV3IEVIICovCisJCQkvKgorCQkJICAgQnVzIERldmljZSBSZXNldCBDQ0JzIGhhdmUgdGhlIENvbW1hbmQgZmllbGQgbm9uLU5VTEwgb25seSB3aGVuIGEKKwkJCSAgIEJ1cyBEZXZpY2UgUmVzZXQgd2FzIHJlcXVlc3RlZCBmb3IgYSBDb21tYW5kIHRoYXQgZGlkIG5vdCBoYXZlIGEKKwkJCSAgIGN1cnJlbnRseSBhY3RpdmUgQ0NCIGluIHRoZSBIb3N0IEFkYXB0ZXIgKGkuZS4sIGEgU3luY2hyb25vdXMKKwkJCSAgIEJ1cyBEZXZpY2UgUmVzZXQpLCBhbmQgaGVuY2Ugd291bGQgbm90IGhhdmUgaXRzIENvbXBsZXRpb24gUm91dGluZQorCQkJICAgY2FsbGVkIG90aGVyd2lzZS4KKwkJCSAqLworCQkJd2hpbGUgKENvbW1hbmQgIT0gTlVMTCkgeworCQkJCXN0cnVjdCBzY3NpX2NtbmQgKk5leHRDb21tYW5kID0gQ29tbWFuZC0+cmVzZXRfY2hhaW47CisJCQkJQ29tbWFuZC0+cmVzZXRfY2hhaW4gPSBOVUxMOworCQkJCUNvbW1hbmQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwkJCQlDb21tYW5kLT5zY3NpX2RvbmUoQ29tbWFuZCk7CisJCQkJQ29tbWFuZCA9IE5leHRDb21tYW5kOworCQkJfQorI2VuZGlmCisJCQkvKgorCQkJICAgSXRlcmF0ZSBvdmVyIHRoZSBDQ0JzIGZvciB0aGlzIEhvc3QgQWRhcHRlciBwZXJmb3JtaW5nIGNvbXBsZXRpb24KKwkJCSAgIHByb2Nlc3NpbmcgZm9yIGFueSBDQ0JzIG1hcmtlZCBhcyBSZXNldCBmb3IgdGhpcyBUYXJnZXQuCisJCQkgKi8KKwkJCWZvciAoQ0NCID0gSG9zdEFkYXB0ZXItPkFsbF9DQ0JzOyBDQ0IgIT0gTlVMTDsgQ0NCID0gQ0NCLT5OZXh0QWxsKQorCQkJCWlmIChDQ0ItPlN0YXR1cyA9PSBCdXNMb2dpY19DQ0JfUmVzZXQgJiYgQ0NCLT5UYXJnZXRJRCA9PSBUYXJnZXRJRCkgeworCQkJCQlDb21tYW5kID0gQ0NCLT5Db21tYW5kOworCQkJCQlCdXNMb2dpY19EZWFsbG9jYXRlQ0NCKENDQik7CisJCQkJCUhvc3RBZGFwdGVyLT5BY3RpdmVDb21tYW5kc1tUYXJnZXRJRF0tLTsKKwkJCQkJQ29tbWFuZC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQkJCQlDb21tYW5kLT5zY3NpX2RvbmUoQ29tbWFuZCk7CisJCQkJfQorCQkJSG9zdEFkYXB0ZXItPkJ1c0RldmljZVJlc2V0UGVuZGluZ0NDQltUYXJnZXRJRF0gPSBOVUxMOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAgIFRyYW5zbGF0ZSB0aGUgQ29tcGxldGlvbiBDb2RlLCBIb3N0IEFkYXB0ZXIgU3RhdHVzLCBhbmQgVGFyZ2V0CisJCQkgICBEZXZpY2UgU3RhdHVzIGludG8gYSBTQ1NJIFN1YnN5c3RlbSBSZXN1bHQgQ29kZS4KKwkJCSAqLworCQkJc3dpdGNoIChDQ0ItPkNvbXBsZXRpb25Db2RlKSB7CisJCQljYXNlIEJ1c0xvZ2ljX0luY29taW5nTWFpbGJveEZyZWU6CisJCQljYXNlIEJ1c0xvZ2ljX0Fib3J0ZWRDb21tYW5kTm90Rm91bmQ6CisJCQljYXNlIEJ1c0xvZ2ljX0ludmFsaWRDQ0I6CisJCQkJQnVzTG9naWNfV2FybmluZygiQ0NCICMlbGQgdG8gVGFyZ2V0ICVkIEltcG9zc2libGUgU3RhdGVcbiIsIEhvc3RBZGFwdGVyLCBDQ0ItPlNlcmlhbE51bWJlciwgQ0NCLT5UYXJnZXRJRCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEJ1c0xvZ2ljX0NvbW1hbmRDb21wbGV0ZWRXaXRob3V0RXJyb3I6CisJCQkJSG9zdEFkYXB0ZXItPlRhcmdldFN0YXRpc3RpY3NbQ0NCLT5UYXJnZXRJRF0KKwkJCQkgICAgLkNvbW1hbmRzQ29tcGxldGVkKys7CisJCQkJSG9zdEFkYXB0ZXItPlRhcmdldEZsYWdzW0NDQi0+VGFyZ2V0SURdCisJCQkJICAgIC5Db21tYW5kU3VjY2Vzc2Z1bEZsYWcgPSB0cnVlOworCQkJCUNvbW1hbmQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkJCQlicmVhazsKKwkJCWNhc2UgQnVzTG9naWNfQ29tbWFuZEFib3J0ZWRBdEhvc3RSZXF1ZXN0OgorCQkJCUJ1c0xvZ2ljX1dhcm5pbmcoIkNDQiAjJWxkIHRvIFRhcmdldCAlZCBBYm9ydGVkXG4iLCBIb3N0QWRhcHRlciwgQ0NCLT5TZXJpYWxOdW1iZXIsIENDQi0+VGFyZ2V0SUQpOworCQkJCUJ1c0xvZ2ljX0luY3JlbWVudEVycm9yQ291bnRlcigmSG9zdEFkYXB0ZXItPlRhcmdldFN0YXRpc3RpY3NbQ0NCLT5UYXJnZXRJRF0KKwkJCQkJCQkgICAgICAgLkNvbW1hbmRBYm9ydHNDb21wbGV0ZWQpOworCQkJCUNvbW1hbmQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKwkJCQlicmVhazsKKwkJCWNhc2UgQnVzTG9naWNfQ29tbWFuZENvbXBsZXRlZFdpdGhFcnJvcjoKKwkJCQlDb21tYW5kLT5yZXN1bHQgPSBCdXNMb2dpY19Db21wdXRlUmVzdWx0Q29kZShIb3N0QWRhcHRlciwgQ0NCLT5Ib3N0QWRhcHRlclN0YXR1cywgQ0NCLT5UYXJnZXREZXZpY2VTdGF0dXMpOworCQkJCWlmIChDQ0ItPkhvc3RBZGFwdGVyU3RhdHVzICE9IEJ1c0xvZ2ljX1NDU0lTZWxlY3Rpb25UaW1lb3V0KSB7CisJCQkJCUhvc3RBZGFwdGVyLT5UYXJnZXRTdGF0aXN0aWNzW0NDQi0+VGFyZ2V0SURdCisJCQkJCSAgICAuQ29tbWFuZHNDb21wbGV0ZWQrKzsKKwkJCQkJaWYgKEJ1c0xvZ2ljX0dsb2JhbE9wdGlvbnMuVHJhY2VFcnJvcnMpIHsKKwkJCQkJCWludCBpOworCQkJCQkJQnVzTG9naWNfTm90aWNlKCJDQ0IgIyVsZCBUYXJnZXQgJWQ6IFJlc3VsdCAlWCBIb3N0ICIKKwkJCQkJCQkJIkFkYXB0ZXIgU3RhdHVzICUwMlggIiAiVGFyZ2V0IFN0YXR1cyAlMDJYXG4iLCBIb3N0QWRhcHRlciwgQ0NCLT5TZXJpYWxOdW1iZXIsIENDQi0+VGFyZ2V0SUQsIENvbW1hbmQtPnJlc3VsdCwgQ0NCLT5Ib3N0QWRhcHRlclN0YXR1cywgQ0NCLT5UYXJnZXREZXZpY2VTdGF0dXMpOworCQkJCQkJQnVzTG9naWNfTm90aWNlKCJDREIgICAiLCBIb3N0QWRhcHRlcik7CisJCQkJCQlmb3IgKGkgPSAwOyBpIDwgQ0NCLT5DREJfTGVuZ3RoOyBpKyspCisJCQkJCQkJQnVzTG9naWNfTm90aWNlKCIgJTAyWCIsIEhvc3RBZGFwdGVyLCBDQ0ItPkNEQltpXSk7CisJCQkJCQlCdXNMb2dpY19Ob3RpY2UoIlxuIiwgSG9zdEFkYXB0ZXIpOworCQkJCQkJQnVzTG9naWNfTm90aWNlKCJTZW5zZSAiLCBIb3N0QWRhcHRlcik7CisJCQkJCQlmb3IgKGkgPSAwOyBpIDwgQ0NCLT5TZW5zZURhdGFMZW5ndGg7IGkrKykKKwkJCQkJCQlCdXNMb2dpY19Ob3RpY2UoIiAlMDJYIiwgSG9zdEFkYXB0ZXIsIENvbW1hbmQtPnNlbnNlX2J1ZmZlcltpXSk7CisJCQkJCQlCdXNMb2dpY19Ob3RpY2UoIlxuIiwgSG9zdEFkYXB0ZXIpOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJLyoKKwkJCSAgIFdoZW4gYW4gSU5RVUlSWSBjb21tYW5kIGNvbXBsZXRlcyBub3JtYWxseSwgc2F2ZSB0aGUKKwkJCSAgIENtZFF1ZSAoVGFnZ2VkIFF1ZXVpbmcgU3VwcG9ydGVkKSBhbmQgV0J1czE2ICgxNiBCaXQKKwkJCSAgIFdpZGUgRGF0YSBUcmFuc2ZlcnMgU3VwcG9ydGVkKSBiaXRzLgorCQkJICovCisJCQlpZiAoQ0NCLT5DREJbMF0gPT0gSU5RVUlSWSAmJiBDQ0ItPkNEQlsxXSA9PSAwICYmIENDQi0+SG9zdEFkYXB0ZXJTdGF0dXMgPT0gQnVzTG9naWNfQ29tbWFuZENvbXBsZXRlZE5vcm1hbGx5KSB7CisJCQkJc3RydWN0IEJ1c0xvZ2ljX1RhcmdldEZsYWdzICpUYXJnZXRGbGFncyA9ICZIb3N0QWRhcHRlci0+VGFyZ2V0RmxhZ3NbQ0NCLT5UYXJnZXRJRF07CisJCQkJc3RydWN0IFNDU0lfSW5xdWlyeSAqSW5xdWlyeVJlc3VsdCA9IChzdHJ1Y3QgU0NTSV9JbnF1aXJ5ICopIENvbW1hbmQtPnJlcXVlc3RfYnVmZmVyOworCQkJCVRhcmdldEZsYWdzLT5UYXJnZXRFeGlzdHMgPSB0cnVlOworCQkJCVRhcmdldEZsYWdzLT5UYWdnZWRRdWV1aW5nU3VwcG9ydGVkID0gSW5xdWlyeVJlc3VsdC0+Q21kUXVlOworCQkJCVRhcmdldEZsYWdzLT5XaWRlVHJhbnNmZXJzU3VwcG9ydGVkID0gSW5xdWlyeVJlc3VsdC0+V0J1czE2OworCQkJfQorCQkJLyoKKwkJCSAgIFBsYWNlIENDQiBiYWNrIG9uIHRoZSBIb3N0IEFkYXB0ZXIncyBmcmVlIGxpc3QuCisJCQkgKi8KKwkJCUJ1c0xvZ2ljX0RlYWxsb2NhdGVDQ0IoQ0NCKTsKKwkJCS8qCisJCQkgICBDYWxsIHRoZSBTQ1NJIENvbW1hbmQgQ29tcGxldGlvbiBSb3V0aW5lLgorCQkJICovCisJCQlDb21tYW5kLT5zY3NpX2RvbmUoQ29tbWFuZCk7CisJCX0KKwl9CisJSG9zdEFkYXB0ZXItPlByb2Nlc3NDb21wbGV0ZWRDQ0JzQWN0aXZlID0gZmFsc2U7Cit9CisKKworLyoKKyAgQnVzTG9naWNfSW50ZXJydXB0SGFuZGxlciBoYW5kbGVzIGhhcmR3YXJlIGludGVycnVwdHMgZnJvbSBCdXNMb2dpYyBIb3N0CisgIEFkYXB0ZXJzLgorKi8KKworc3RhdGljIGlycXJldHVybl90IEJ1c0xvZ2ljX0ludGVycnVwdEhhbmRsZXIoaW50IElSUV9DaGFubmVsLCB2b2lkICpEZXZpY2VJZGVudGlmaWVyLCBzdHJ1Y3QgcHRfcmVncyAqSW50ZXJydXB0UmVnaXN0ZXJzKQoreworCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSAoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICopIERldmljZUlkZW50aWZpZXI7CisJdW5zaWduZWQgbG9uZyBQcm9jZXNzb3JGbGFnczsKKwkvKgorCSAgIEFjcXVpcmUgZXhjbHVzaXZlIGFjY2VzcyB0byBIb3N0IEFkYXB0ZXIuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoSG9zdEFkYXB0ZXItPlNDU0lfSG9zdC0+aG9zdF9sb2NrLCBQcm9jZXNzb3JGbGFncyk7CisJLyoKKwkgICBIYW5kbGUgSW50ZXJydXB0cyBhcHByb3ByaWF0ZWx5IGZvciBlYWNoIEhvc3QgQWRhcHRlciB0eXBlLgorCSAqLworCWlmIChCdXNMb2dpY19NdWx0aU1hc3Rlckhvc3RBZGFwdGVyUChIb3N0QWRhcHRlcikpIHsKKwkJdW5pb24gQnVzTG9naWNfSW50ZXJydXB0UmVnaXN0ZXIgSW50ZXJydXB0UmVnaXN0ZXI7CisJCS8qCisJCSAgIFJlYWQgdGhlIEhvc3QgQWRhcHRlciBJbnRlcnJ1cHQgUmVnaXN0ZXIuCisJCSAqLworCQlJbnRlcnJ1cHRSZWdpc3Rlci5BbGwgPSBCdXNMb2dpY19SZWFkSW50ZXJydXB0UmVnaXN0ZXIoSG9zdEFkYXB0ZXIpOworCQlpZiAoSW50ZXJydXB0UmVnaXN0ZXIuaXIuSW50ZXJydXB0VmFsaWQpIHsKKwkJCS8qCisJCQkgICBBY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0IGFuZCByZXNldCB0aGUgSG9zdCBBZGFwdGVyCisJCQkgICBJbnRlcnJ1cHQgUmVnaXN0ZXIuCisJCQkgKi8KKwkJCUJ1c0xvZ2ljX0ludGVycnVwdFJlc2V0KEhvc3RBZGFwdGVyKTsKKwkJCS8qCisJCQkgICBQcm9jZXNzIHZhbGlkIEV4dGVybmFsIFNDU0kgQnVzIFJlc2V0IGFuZCBJbmNvbWluZyBNYWlsYm94CisJCQkgICBMb2FkZWQgSW50ZXJydXB0cy4gIENvbW1hbmQgQ29tcGxldGUgSW50ZXJydXB0cyBhcmUgbm90ZWQsCisJCQkgICBhbmQgT3V0Z29pbmcgTWFpbGJveCBBdmFpbGFibGUgSW50ZXJydXB0cyBhcmUgaWdub3JlZCwgYXMKKwkJCSAgIHRoZXkgYXJlIG5ldmVyIGVuYWJsZWQuCisJCQkgKi8KKwkJCWlmIChJbnRlcnJ1cHRSZWdpc3Rlci5pci5FeHRlcm5hbEJ1c1Jlc2V0KQorCQkJCUhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckV4dGVybmFsUmVzZXQgPSB0cnVlOworCQkJZWxzZSBpZiAoSW50ZXJydXB0UmVnaXN0ZXIuaXIuSW5jb21pbmdNYWlsYm94TG9hZGVkKQorCQkJCUJ1c0xvZ2ljX1NjYW5JbmNvbWluZ01haWxib3hlcyhIb3N0QWRhcHRlcik7CisJCQllbHNlIGlmIChJbnRlcnJ1cHRSZWdpc3Rlci5pci5Db21tYW5kQ29tcGxldGUpCisJCQkJSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyQ29tbWFuZENvbXBsZXRlZCA9IHRydWU7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgICBDaGVjayBpZiB0aGVyZSBpcyBhIHBlbmRpbmcgaW50ZXJydXB0IGZvciB0aGlzIEhvc3QgQWRhcHRlci4KKwkJICovCisJCWlmIChGbGFzaFBvaW50X0ludGVycnVwdFBlbmRpbmcoSG9zdEFkYXB0ZXItPkNhcmRIYW5kbGUpKQorCQkJc3dpdGNoIChGbGFzaFBvaW50X0hhbmRsZUludGVycnVwdChIb3N0QWRhcHRlci0+Q2FyZEhhbmRsZSkpIHsKKwkJCWNhc2UgRmxhc2hQb2ludF9Ob3JtYWxJbnRlcnJ1cHQ6CisJCQkJYnJlYWs7CisJCQljYXNlIEZsYXNoUG9pbnRfRXh0ZXJuYWxCdXNSZXNldDoKKwkJCQlIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJFeHRlcm5hbFJlc2V0ID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRmxhc2hQb2ludF9JbnRlcm5hbEVycm9yOgorCQkJCUJ1c0xvZ2ljX1dhcm5pbmcoIkludGVybmFsIEZsYXNoUG9pbnQgRXJyb3IgZGV0ZWN0ZWQiICIgLSBSZXNldHRpbmcgSG9zdCBBZGFwdGVyXG4iLCBIb3N0QWRhcHRlcik7CisJCQkJSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVySW50ZXJuYWxFcnJvciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJfQorCS8qCisJICAgUHJvY2VzcyBhbnkgY29tcGxldGVkIENDQnMuCisJICovCisJaWYgKEhvc3RBZGFwdGVyLT5GaXJzdENvbXBsZXRlZENDQiAhPSBOVUxMKQorCQlCdXNMb2dpY19Qcm9jZXNzQ29tcGxldGVkQ0NCcyhIb3N0QWRhcHRlcik7CisJLyoKKwkgICBSZXNldCB0aGUgSG9zdCBBZGFwdGVyIGlmIHJlcXVlc3RlZC4KKwkgKi8KKwlpZiAoSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyRXh0ZXJuYWxSZXNldCkgeworCQlCdXNMb2dpY19XYXJuaW5nKCJSZXNldHRpbmcgJXMgZHVlIHRvIEV4dGVybmFsIFNDU0kgQnVzIFJlc2V0XG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPkZ1bGxNb2RlbE5hbWUpOworCQlCdXNMb2dpY19JbmNyZW1lbnRFcnJvckNvdW50ZXIoJkhvc3RBZGFwdGVyLT5FeHRlcm5hbEhvc3RBZGFwdGVyUmVzZXRzKTsKKwkJQnVzTG9naWNfUmVzZXRIb3N0QWRhcHRlcihIb3N0QWRhcHRlciwgZmFsc2UpOworCQlIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJFeHRlcm5hbFJlc2V0ID0gZmFsc2U7CisJfSBlbHNlIGlmIChIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJJbnRlcm5hbEVycm9yKSB7CisJCUJ1c0xvZ2ljX1dhcm5pbmcoIlJlc2V0dGluZyAlcyBkdWUgdG8gSG9zdCBBZGFwdGVyIEludGVybmFsIEVycm9yXG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPkZ1bGxNb2RlbE5hbWUpOworCQlCdXNMb2dpY19JbmNyZW1lbnRFcnJvckNvdW50ZXIoJkhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckludGVybmFsRXJyb3JzKTsKKwkJQnVzTG9naWNfUmVzZXRIb3N0QWRhcHRlcihIb3N0QWRhcHRlciwgdHJ1ZSk7CisJCUhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckludGVybmFsRXJyb3IgPSBmYWxzZTsKKwl9CisJLyoKKwkgICBSZWxlYXNlIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gSG9zdCBBZGFwdGVyLgorCSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoSG9zdEFkYXB0ZXItPlNDU0lfSG9zdC0+aG9zdF9sb2NrLCBQcm9jZXNzb3JGbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKy8qCisgIEJ1c0xvZ2ljX1dyaXRlT3V0Z29pbmdNYWlsYm94IHBsYWNlcyBDQ0IgYW5kIEFjdGlvbiBDb2RlIGludG8gYW4gT3V0Z29pbmcKKyAgTWFpbGJveCBmb3IgZXhlY3V0aW9uIGJ5IEhvc3QgQWRhcHRlci4gIFRoZSBIb3N0IEFkYXB0ZXIncyBMb2NrIHNob3VsZAorICBhbHJlYWR5IGhhdmUgYmVlbiBhY3F1aXJlZCBieSB0aGUgY2FsbGVyLgorKi8KKworc3RhdGljIGJvb2xlYW4gQnVzTG9naWNfV3JpdGVPdXRnb2luZ01haWxib3goc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyCisJCQkJCSAgICAgKkhvc3RBZGFwdGVyLCBlbnVtIEJ1c0xvZ2ljX0FjdGlvbkNvZGUgQWN0aW9uQ29kZSwgc3RydWN0IEJ1c0xvZ2ljX0NDQiAqQ0NCKQoreworCXN0cnVjdCBCdXNMb2dpY19PdXRnb2luZ01haWxib3ggKk5leHRPdXRnb2luZ01haWxib3g7CisJTmV4dE91dGdvaW5nTWFpbGJveCA9IEhvc3RBZGFwdGVyLT5OZXh0T3V0Z29pbmdNYWlsYm94OworCWlmIChOZXh0T3V0Z29pbmdNYWlsYm94LT5BY3Rpb25Db2RlID09IEJ1c0xvZ2ljX091dGdvaW5nTWFpbGJveEZyZWUpIHsKKwkJQ0NCLT5TdGF0dXMgPSBCdXNMb2dpY19DQ0JfQWN0aXZlOworCQkvKgorCQkgICBUaGUgQ0NCIGZpZWxkIG11c3QgYmUgd3JpdHRlbiBiZWZvcmUgdGhlIEFjdGlvbiBDb2RlIGZpZWxkIHNpbmNlCisJCSAgIHRoZSBIb3N0IEFkYXB0ZXIgaXMgb3BlcmF0aW5nIGFzeW5jaHJvbm91c2x5IGFuZCB0aGUgbG9ja2luZyBjb2RlCisJCSAgIGRvZXMgbm90IHByb3RlY3QgYWdhaW5zdCBzaW11bHRhbmVvdXMgYWNjZXNzIGJ5IHRoZSBIb3N0IEFkYXB0ZXIuCisJCSAqLworCQlOZXh0T3V0Z29pbmdNYWlsYm94LT5DQ0IgPSBDQ0ItPkRNQV9IYW5kbGU7CisJCU5leHRPdXRnb2luZ01haWxib3gtPkFjdGlvbkNvZGUgPSBBY3Rpb25Db2RlOworCQlCdXNMb2dpY19TdGFydE1haWxib3hDb21tYW5kKEhvc3RBZGFwdGVyKTsKKwkJaWYgKCsrTmV4dE91dGdvaW5nTWFpbGJveCA+IEhvc3RBZGFwdGVyLT5MYXN0T3V0Z29pbmdNYWlsYm94KQorCQkJTmV4dE91dGdvaW5nTWFpbGJveCA9IEhvc3RBZGFwdGVyLT5GaXJzdE91dGdvaW5nTWFpbGJveDsKKwkJSG9zdEFkYXB0ZXItPk5leHRPdXRnb2luZ01haWxib3ggPSBOZXh0T3V0Z29pbmdNYWlsYm94OworCQlpZiAoQWN0aW9uQ29kZSA9PSBCdXNMb2dpY19NYWlsYm94U3RhcnRDb21tYW5kKSB7CisJCQlIb3N0QWRhcHRlci0+QWN0aXZlQ29tbWFuZHNbQ0NCLT5UYXJnZXRJRF0rKzsKKwkJCWlmIChDQ0ItPk9wY29kZSAhPSBCdXNMb2dpY19CdXNEZXZpY2VSZXNldCkKKwkJCQlIb3N0QWRhcHRlci0+VGFyZ2V0U3RhdGlzdGljc1tDQ0ItPlRhcmdldElEXS5Db21tYW5kc0F0dGVtcHRlZCsrOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qIEVycm9yIEhhbmRsaW5nIChFSCkgc3VwcG9ydCAqLworCitzdGF0aWMgaW50IEJ1c0xvZ2ljX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KQoreworCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSAoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICopIFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJdW5zaWduZWQgaW50IGlkID0gU0NwbnQtPmRldmljZS0+aWQ7CisJc3RydWN0IEJ1c0xvZ2ljX1RhcmdldFN0YXRpc3RpY3MgKnN0YXRzID0gJkhvc3RBZGFwdGVyLT5UYXJnZXRTdGF0aXN0aWNzW2lkXTsKKwlCdXNMb2dpY19JbmNyZW1lbnRFcnJvckNvdW50ZXIoJnN0YXRzLT5Ib3N0QWRhcHRlclJlc2V0c1JlcXVlc3RlZCk7CisKKwlyZXR1cm4gQnVzTG9naWNfUmVzZXRIb3N0QWRhcHRlcihIb3N0QWRhcHRlciwgZmFsc2UpOworfQorCisvKgorICBCdXNMb2dpY19RdWV1ZUNvbW1hbmQgY3JlYXRlcyBhIENDQiBmb3IgQ29tbWFuZCBhbmQgcGxhY2VzIGl0IGludG8gYW4KKyAgT3V0Z29pbmcgTWFpbGJveCBmb3IgZXhlY3V0aW9uIGJ5IHRoZSBhc3NvY2lhdGVkIEhvc3QgQWRhcHRlci4KKyovCisKK3N0YXRpYyBpbnQgQnVzTG9naWNfUXVldWVDb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKkNvbW1hbmQsIHZvaWQgKCpDb21wbGV0aW9uUm91dGluZSkgKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlciA9IChzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKikgQ29tbWFuZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgQnVzTG9naWNfVGFyZ2V0RmxhZ3MgKlRhcmdldEZsYWdzID0gJkhvc3RBZGFwdGVyLT5UYXJnZXRGbGFnc1tDb21tYW5kLT5kZXZpY2UtPmlkXTsKKwlzdHJ1Y3QgQnVzTG9naWNfVGFyZ2V0U3RhdGlzdGljcyAqVGFyZ2V0U3RhdGlzdGljcyA9IEhvc3RBZGFwdGVyLT5UYXJnZXRTdGF0aXN0aWNzOworCXVuc2lnbmVkIGNoYXIgKkNEQiA9IENvbW1hbmQtPmNtbmQ7CisJaW50IENEQl9MZW5ndGggPSBDb21tYW5kLT5jbWRfbGVuOworCWludCBUYXJnZXRJRCA9IENvbW1hbmQtPmRldmljZS0+aWQ7CisJaW50IExvZ2ljYWxVbml0ID0gQ29tbWFuZC0+ZGV2aWNlLT5sdW47CisJdm9pZCAqQnVmZmVyUG9pbnRlciA9IENvbW1hbmQtPnJlcXVlc3RfYnVmZmVyOworCWludCBCdWZmZXJMZW5ndGggPSBDb21tYW5kLT5yZXF1ZXN0X2J1ZmZsZW47CisJaW50IFNlZ21lbnRDb3VudCA9IENvbW1hbmQtPnVzZV9zZzsKKwlzdHJ1Y3QgQnVzTG9naWNfQ0NCICpDQ0I7CisJLyoKKwkgICBTQ1NJIFJFUVVFU1RfU0VOU0UgY29tbWFuZHMgd2lsbCBiZSBleGVjdXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBIb3N0CisJICAgQWRhcHRlciBmb3IgYW55IGVycm9ycywgc28gdGhleSBzaG91bGQgbm90IGJlIGV4ZWN1dGVkIGV4cGxpY2l0bHkgdW5sZXNzCisJICAgdGhlIFNlbnNlIERhdGEgaXMgemVybyBpbmRpY2F0aW5nIHRoYXQgbm8gZXJyb3Igb2NjdXJyZWQuCisJICovCisJaWYgKENEQlswXSA9PSBSRVFVRVNUX1NFTlNFICYmIENvbW1hbmQtPnNlbnNlX2J1ZmZlclswXSAhPSAwKSB7CisJCUNvbW1hbmQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkJQ29tcGxldGlvblJvdXRpbmUoQ29tbWFuZCk7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAgIEFsbG9jYXRlIGEgQ0NCIGZyb20gdGhlIEhvc3QgQWRhcHRlcidzIGZyZWUgbGlzdC4gIEluIHRoZSB1bmxpa2VseSBldmVudAorCSAgIHRoYXQgdGhlcmUgYXJlIG5vbmUgYXZhaWxhYmxlIGFuZCBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscywgd2FpdCAxIHNlY29uZAorCSAgIGFuZCB0cnkgYWdhaW4uICBJZiB0aGF0IGZhaWxzLCB0aGUgSG9zdCBBZGFwdGVyIGlzIHByb2JhYmx5IGh1bmcgc28gc2lnbmFsCisJICAgYW4gZXJyb3IgYXMgYSBIb3N0IEFkYXB0ZXIgSGFyZCBSZXNldCBzaG91bGQgYmUgaW5pdGlhdGVkIHNvb24uCisJICovCisJQ0NCID0gQnVzTG9naWNfQWxsb2NhdGVDQ0IoSG9zdEFkYXB0ZXIpOworCWlmIChDQ0IgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnEoSG9zdEFkYXB0ZXItPlNDU0lfSG9zdC0+aG9zdF9sb2NrKTsKKwkJQnVzTG9naWNfRGVsYXkoMSk7CisJCXNwaW5fbG9ja19pcnEoSG9zdEFkYXB0ZXItPlNDU0lfSG9zdC0+aG9zdF9sb2NrKTsKKwkJQ0NCID0gQnVzTG9naWNfQWxsb2NhdGVDQ0IoSG9zdEFkYXB0ZXIpOworCQlpZiAoQ0NCID09IE5VTEwpIHsKKwkJCUNvbW1hbmQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJCUNvbXBsZXRpb25Sb3V0aW5lKENvbW1hbmQpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJLyoKKwkgICBJbml0aWFsaXplIHRoZSBmaWVsZHMgaW4gdGhlIEJ1c0xvZ2ljIENvbW1hbmQgQ29udHJvbCBCbG9jayAoQ0NCKS4KKwkgKi8KKwlpZiAoU2VnbWVudENvdW50ID09IDAgJiYgQnVmZmVyTGVuZ3RoICE9IDApIHsKKwkJQ0NCLT5PcGNvZGUgPSBCdXNMb2dpY19Jbml0aWF0b3JDQ0I7CisJCUNDQi0+RGF0YUxlbmd0aCA9IEJ1ZmZlckxlbmd0aDsKKwkJQ0NCLT5EYXRhUG9pbnRlciA9IHBjaV9tYXBfc2luZ2xlKEhvc3RBZGFwdGVyLT5QQ0lfRGV2aWNlLAorCQkJCUJ1ZmZlclBvaW50ZXIsIEJ1ZmZlckxlbmd0aCwKKwkJCQlDb21tYW5kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJfSBlbHNlIGlmIChTZWdtZW50Q291bnQgIT0gMCkgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKlNjYXR0ZXJMaXN0ID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBCdWZmZXJQb2ludGVyOworCQlpbnQgU2VnbWVudCwgQ291bnQ7CisKKwkJQ291bnQgPSBwY2lfbWFwX3NnKEhvc3RBZGFwdGVyLT5QQ0lfRGV2aWNlLCBTY2F0dGVyTGlzdCwgU2VnbWVudENvdW50LAorCQkJCUNvbW1hbmQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJQ0NCLT5PcGNvZGUgPSBCdXNMb2dpY19Jbml0aWF0b3JDQ0JfU2NhdHRlckdhdGhlcjsKKwkJQ0NCLT5EYXRhTGVuZ3RoID0gQ291bnQgKiBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX1NjYXR0ZXJHYXRoZXJTZWdtZW50KTsKKwkJaWYgKEJ1c0xvZ2ljX011bHRpTWFzdGVySG9zdEFkYXB0ZXJQKEhvc3RBZGFwdGVyKSkKKwkJCUNDQi0+RGF0YVBvaW50ZXIgPSAodW5zaWduZWQgaW50KSBDQ0ItPkRNQV9IYW5kbGUgKyAoKHVuc2lnbmVkIGxvbmcpICZDQ0ItPlNjYXR0ZXJHYXRoZXJMaXN0IC0gKHVuc2lnbmVkIGxvbmcpIENDQik7CisJCWVsc2UKKwkJCUNDQi0+RGF0YVBvaW50ZXIgPSBWaXJ0dWFsX3RvXzMyQml0X1ZpcnR1YWwoQ0NCLT5TY2F0dGVyR2F0aGVyTGlzdCk7CisJCWZvciAoU2VnbWVudCA9IDA7IFNlZ21lbnQgPCBDb3VudDsgU2VnbWVudCsrKSB7CisJCQlDQ0ItPlNjYXR0ZXJHYXRoZXJMaXN0W1NlZ21lbnRdLlNlZ21lbnRCeXRlQ291bnQgPSBzZ19kbWFfbGVuKFNjYXR0ZXJMaXN0ICsgU2VnbWVudCk7CisJCQlDQ0ItPlNjYXR0ZXJHYXRoZXJMaXN0W1NlZ21lbnRdLlNlZ21lbnREYXRhUG9pbnRlciA9IHNnX2RtYV9hZGRyZXNzKFNjYXR0ZXJMaXN0ICsgU2VnbWVudCk7CisJCX0KKwl9IGVsc2UgeworCQlDQ0ItPk9wY29kZSA9IEJ1c0xvZ2ljX0luaXRpYXRvckNDQjsKKwkJQ0NCLT5EYXRhTGVuZ3RoID0gQnVmZmVyTGVuZ3RoOworCQlDQ0ItPkRhdGFQb2ludGVyID0gMDsKKwl9CisJc3dpdGNoIChDREJbMF0pIHsKKwljYXNlIFJFQURfNjoKKwljYXNlIFJFQURfMTA6CisJCUNDQi0+RGF0YURpcmVjdGlvbiA9IEJ1c0xvZ2ljX0RhdGFJbkxlbmd0aENoZWNrZWQ7CisJCVRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlJlYWRDb21tYW5kcysrOworCQlCdXNMb2dpY19JbmNyZW1lbnRCeXRlQ291bnRlcigmVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uVG90YWxCeXRlc1JlYWQsIEJ1ZmZlckxlbmd0aCk7CisJCUJ1c0xvZ2ljX0luY3JlbWVudFNpemVCdWNrZXQoVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uUmVhZENvbW1hbmRTaXplQnVja2V0cywgQnVmZmVyTGVuZ3RoKTsKKwkJYnJlYWs7CisJY2FzZSBXUklURV82OgorCWNhc2UgV1JJVEVfMTA6CisJCUNDQi0+RGF0YURpcmVjdGlvbiA9IEJ1c0xvZ2ljX0RhdGFPdXRMZW5ndGhDaGVja2VkOworCQlUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Xcml0ZUNvbW1hbmRzKys7CisJCUJ1c0xvZ2ljX0luY3JlbWVudEJ5dGVDb3VudGVyKCZUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Ub3RhbEJ5dGVzV3JpdHRlbiwgQnVmZmVyTGVuZ3RoKTsKKwkJQnVzTG9naWNfSW5jcmVtZW50U2l6ZUJ1Y2tldChUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Xcml0ZUNvbW1hbmRTaXplQnVja2V0cywgQnVmZmVyTGVuZ3RoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQ0NCLT5EYXRhRGlyZWN0aW9uID0gQnVzTG9naWNfVW5jaGVja2VkRGF0YVRyYW5zZmVyOworCQlicmVhazsKKwl9CisJQ0NCLT5DREJfTGVuZ3RoID0gQ0RCX0xlbmd0aDsKKwlDQ0ItPkhvc3RBZGFwdGVyU3RhdHVzID0gMDsKKwlDQ0ItPlRhcmdldERldmljZVN0YXR1cyA9IDA7CisJQ0NCLT5UYXJnZXRJRCA9IFRhcmdldElEOworCUNDQi0+TG9naWNhbFVuaXQgPSBMb2dpY2FsVW5pdDsKKwlDQ0ItPlRhZ0VuYWJsZSA9IGZhbHNlOworCUNDQi0+TGVnYWN5VGFnRW5hYmxlID0gZmFsc2U7CisJLyoKKwkgICBCdXNMb2dpYyByZWNvbW1lbmRzIHRoYXQgYWZ0ZXIgYSBSZXNldCB0aGUgZmlyc3QgY291cGxlIG9mIGNvbW1hbmRzIHRoYXQKKwkgICBhcmUgc2VudCB0byBhIFRhcmdldCBEZXZpY2UgYmUgc2VudCBpbiBhIG5vbiBUYWdnZWQgUXVldWUgZmFzaGlvbiBzbyB0aGF0CisJICAgdGhlIEhvc3QgQWRhcHRlciBhbmQgVGFyZ2V0IERldmljZSBjYW4gZXN0YWJsaXNoIFN5bmNocm9ub3VzIGFuZCBXaWRlCisJICAgVHJhbnNmZXIgYmVmb3JlIFF1ZXVlIFRhZyBtZXNzYWdlcyBjYW4gaW50ZXJmZXJlIHdpdGggdGhlIFN5bmNocm9ub3VzIGFuZAorCSAgIFdpZGUgTmVnb3RpYXRpb24gbWVzc2FnZXMuICBCeSB3YWl0aW5nIHRvIGVuYWJsZSBUYWdnZWQgUXVldWluZyB1bnRpbCBhZnRlcgorCSAgIHRoZSBmaXJzdCBCdXNMb2dpY19NYXhUYWdnZWRRdWV1ZURlcHRoIGNvbW1hbmRzIGhhdmUgYmVlbiBxdWV1ZWQsIGl0IGlzCisJICAgYXNzdXJlZCB0aGF0IGFmdGVyIGEgUmVzZXQgYW55IHBlbmRpbmcgY29tbWFuZHMgYXJlIHJlcXVldWVkIGJlZm9yZSBUYWdnZWQKKwkgICBRdWV1aW5nIGlzIGVuYWJsZWQgYW5kIHRoYXQgdGhlIFRhZ2dlZCBRdWV1aW5nIG1lc3NhZ2Ugd2lsbCBub3Qgb2NjdXIgd2hpbGUKKwkgICB0aGUgcGFydGl0aW9uIHRhYmxlIGlzIGJlaW5nIHByaW50ZWQuICBJbiBhZGRpdGlvbiwgc29tZSBkZXZpY2VzIGRvIG5vdAorCSAgIHByb3Blcmx5IGhhbmRsZSB0aGUgdHJhbnNpdGlvbiBmcm9tIG5vbi10YWdnZWQgdG8gdGFnZ2VkIGNvbW1hbmRzLCBzbyBpdCBpcworCSAgIG5lY2Vzc2FyeSB0byB3YWl0IHVudGlsIHRoZXJlIGFyZSBubyBwZW5kaW5nIGNvbW1hbmRzIGZvciBhIHRhcmdldCBkZXZpY2UKKwkgICBiZWZvcmUgcXVldWluZyB0YWdnZWQgY29tbWFuZHMuCisJICovCisJaWYgKEhvc3RBZGFwdGVyLT5Db21tYW5kc1NpbmNlUmVzZXRbVGFyZ2V0SURdKysgPj0KKwkgICAgQnVzTG9naWNfTWF4VGFnZ2VkUXVldWVEZXB0aCAmJiAhVGFyZ2V0RmxhZ3MtPlRhZ2dlZFF1ZXVpbmdBY3RpdmUgJiYgSG9zdEFkYXB0ZXItPkFjdGl2ZUNvbW1hbmRzW1RhcmdldElEXSA9PSAwICYmIFRhcmdldEZsYWdzLT5UYWdnZWRRdWV1aW5nU3VwcG9ydGVkICYmIChIb3N0QWRhcHRlci0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZCAmICgxIDw8IFRhcmdldElEKSkpIHsKKwkJVGFyZ2V0RmxhZ3MtPlRhZ2dlZFF1ZXVpbmdBY3RpdmUgPSB0cnVlOworCQlCdXNMb2dpY19Ob3RpY2UoIlRhZ2dlZCBRdWV1aW5nIG5vdyBhY3RpdmUgZm9yIFRhcmdldCAlZFxuIiwgSG9zdEFkYXB0ZXIsIFRhcmdldElEKTsKKwl9CisJaWYgKFRhcmdldEZsYWdzLT5UYWdnZWRRdWV1aW5nQWN0aXZlKSB7CisJCWVudW0gQnVzTG9naWNfUXVldWVUYWcgUXVldWVUYWcgPSBCdXNMb2dpY19TaW1wbGVRdWV1ZVRhZzsKKwkJLyoKKwkJICAgV2hlbiB1c2luZyBUYWdnZWQgUXVldWluZyB3aXRoIFNpbXBsZSBRdWV1ZSBUYWdzLCBpdCBhcHBlYXJzIHRoYXQgZGlzaworCQkgICBkcml2ZSBjb250cm9sbGVycyBkbyBub3QgZ3VhcmFudGVlIHRoYXQgYSBxdWV1ZWQgY29tbWFuZCB3aWxsIG5vdAorCQkgICByZW1haW4gaW4gYSBkaXNjb25uZWN0ZWQgc3RhdGUgaW5kZWZpbml0ZWx5IGlmIGNvbW1hbmRzIHRoYXQgcmVhZCBvcgorCQkgICB3cml0ZSBuZWFyZXIgdGhlIGhlYWQgcG9zaXRpb24gY29udGludWUgdG8gYXJyaXZlIHdpdGhvdXQgaW50ZXJydXB0aW9uLgorCQkgICBUaGVyZWZvcmUsIGZvciBlYWNoIFRhcmdldCBEZXZpY2UgdGhpcyBkcml2ZXIga2VlcHMgdHJhY2sgb2YgdGhlIGxhc3QKKwkJICAgdGltZSBlaXRoZXIgdGhlIHF1ZXVlIHdhcyBlbXB0eSBvciBhbiBPcmRlcmVkIFF1ZXVlIFRhZyB3YXMgaXNzdWVkLiAgSWYKKwkJICAgbW9yZSB0aGFuIDQgc2Vjb25kcyAob25lIGZpZnRoIG9mIHRoZSAyMCBzZWNvbmQgZGlzayB0aW1lb3V0KSBoYXZlCisJCSAgIGVsYXBzZWQgc2luY2UgdGhpcyBsYXN0IHNlcXVlbmNlIHBvaW50LCB0aGlzIGNvbW1hbmQgd2lsbCBiZSBpc3N1ZWQKKwkJICAgd2l0aCBhbiBPcmRlcmVkIFF1ZXVlIFRhZyByYXRoZXIgdGhhbiBhIFNpbXBsZSBRdWV1ZSBUYWcsIHdoaWNoIGZvcmNlcworCQkgICB0aGUgVGFyZ2V0IERldmljZSB0byBjb21wbGV0ZSBhbGwgcHJldmlvdXNseSBxdWV1ZWQgY29tbWFuZHMgYmVmb3JlCisJCSAgIHRoaXMgY29tbWFuZCBtYXkgYmUgZXhlY3V0ZWQuCisJCSAqLworCQlpZiAoSG9zdEFkYXB0ZXItPkFjdGl2ZUNvbW1hbmRzW1RhcmdldElEXSA9PSAwKQorCQkJSG9zdEFkYXB0ZXItPkxhc3RTZXF1ZW5jZVBvaW50W1RhcmdldElEXSA9IGppZmZpZXM7CisJCWVsc2UgaWYgKGppZmZpZXMgLSBIb3N0QWRhcHRlci0+TGFzdFNlcXVlbmNlUG9pbnRbVGFyZ2V0SURdID4gNCAqIEhaKSB7CisJCQlIb3N0QWRhcHRlci0+TGFzdFNlcXVlbmNlUG9pbnRbVGFyZ2V0SURdID0gamlmZmllczsKKwkJCVF1ZXVlVGFnID0gQnVzTG9naWNfT3JkZXJlZFF1ZXVlVGFnOworCQl9CisJCWlmIChIb3N0QWRhcHRlci0+RXh0ZW5kZWRMVU5TdXBwb3J0KSB7CisJCQlDQ0ItPlRhZ0VuYWJsZSA9IHRydWU7CisJCQlDQ0ItPlF1ZXVlVGFnID0gUXVldWVUYWc7CisJCX0gZWxzZSB7CisJCQlDQ0ItPkxlZ2FjeVRhZ0VuYWJsZSA9IHRydWU7CisJCQlDQ0ItPkxlZ2FjeVF1ZXVlVGFnID0gUXVldWVUYWc7CisJCX0KKwl9CisJbWVtY3B5KENDQi0+Q0RCLCBDREIsIENEQl9MZW5ndGgpOworCUNDQi0+U2Vuc2VEYXRhTGVuZ3RoID0gc2l6ZW9mKENvbW1hbmQtPnNlbnNlX2J1ZmZlcik7CisJQ0NCLT5TZW5zZURhdGFQb2ludGVyID0gcGNpX21hcF9zaW5nbGUoSG9zdEFkYXB0ZXItPlBDSV9EZXZpY2UsIENvbW1hbmQtPnNlbnNlX2J1ZmZlciwgQ0NCLT5TZW5zZURhdGFMZW5ndGgsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJQ0NCLT5Db21tYW5kID0gQ29tbWFuZDsKKwlDb21tYW5kLT5zY3NpX2RvbmUgPSBDb21wbGV0aW9uUm91dGluZTsKKwlpZiAoQnVzTG9naWNfTXVsdGlNYXN0ZXJIb3N0QWRhcHRlclAoSG9zdEFkYXB0ZXIpKSB7CisJCS8qCisJCSAgIFBsYWNlIHRoZSBDQ0IgaW4gYW4gT3V0Z29pbmcgTWFpbGJveC4gIFRoZSBoaWdoZXIgbGV2ZWxzIG9mIHRoZSBTQ1NJCisJCSAgIFN1YnN5c3RlbSBzaG91bGQgbm90IGF0dGVtcHQgdG8gcXVldWUgbW9yZSBjb21tYW5kcyB0aGFuIGNhbiBiZSBwbGFjZWQKKwkJICAgaW4gT3V0Z29pbmcgTWFpbGJveGVzLCBzbyB0aGVyZSBzaG91bGQgYWx3YXlzIGJlIG9uZSBmcmVlLiAgSW4gdGhlCisJCSAgIHVubGlrZWx5IGV2ZW50IHRoYXQgdGhlcmUgYXJlIG5vbmUgYXZhaWxhYmxlLCB3YWl0IDEgc2Vjb25kIGFuZCB0cnkKKwkJICAgYWdhaW4uICBJZiB0aGF0IGZhaWxzLCB0aGUgSG9zdCBBZGFwdGVyIGlzIHByb2JhYmx5IGh1bmcgc28gc2lnbmFsIGFuCisJCSAgIGVycm9yIGFzIGEgSG9zdCBBZGFwdGVyIEhhcmQgUmVzZXQgc2hvdWxkIGJlIGluaXRpYXRlZCBzb29uLgorCQkgKi8KKwkJaWYgKCFCdXNMb2dpY19Xcml0ZU91dGdvaW5nTWFpbGJveChIb3N0QWRhcHRlciwgQnVzTG9naWNfTWFpbGJveFN0YXJ0Q29tbWFuZCwgQ0NCKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxKEhvc3RBZGFwdGVyLT5TQ1NJX0hvc3QtPmhvc3RfbG9jayk7CisJCQlCdXNMb2dpY19XYXJuaW5nKCJVbmFibGUgdG8gd3JpdGUgT3V0Z29pbmcgTWFpbGJveCAtICIgIlBhdXNpbmcgZm9yIDEgc2Vjb25kXG4iLCBIb3N0QWRhcHRlcik7CisJCQlCdXNMb2dpY19EZWxheSgxKTsKKwkJCXNwaW5fbG9ja19pcnEoSG9zdEFkYXB0ZXItPlNDU0lfSG9zdC0+aG9zdF9sb2NrKTsKKwkJCWlmICghQnVzTG9naWNfV3JpdGVPdXRnb2luZ01haWxib3goSG9zdEFkYXB0ZXIsIEJ1c0xvZ2ljX01haWxib3hTdGFydENvbW1hbmQsIENDQikpIHsKKwkJCQlCdXNMb2dpY19XYXJuaW5nKCJTdGlsbCB1bmFibGUgdG8gd3JpdGUgT3V0Z29pbmcgTWFpbGJveCAtICIgIkhvc3QgQWRhcHRlciBEZWFkP1xuIiwgSG9zdEFkYXB0ZXIpOworCQkJCUJ1c0xvZ2ljX0RlYWxsb2NhdGVDQ0IoQ0NCKTsKKwkJCQlDb21tYW5kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCQkJQ29tbWFuZC0+c2NzaV9kb25lKENvbW1hbmQpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICAgQ2FsbCB0aGUgRmxhc2hQb2ludCBTQ0NCIE1hbmFnZXIgdG8gc3RhcnQgZXhlY3V0aW9uIG9mIHRoZSBDQ0IuCisJCSAqLworCQlDQ0ItPlN0YXR1cyA9IEJ1c0xvZ2ljX0NDQl9BY3RpdmU7CisJCUhvc3RBZGFwdGVyLT5BY3RpdmVDb21tYW5kc1tUYXJnZXRJRF0rKzsKKwkJVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uQ29tbWFuZHNBdHRlbXB0ZWQrKzsKKwkJRmxhc2hQb2ludF9TdGFydENDQihIb3N0QWRhcHRlci0+Q2FyZEhhbmRsZSwgQ0NCKTsKKwkJLyoKKwkJICAgVGhlIENvbW1hbmQgbWF5IGhhdmUgYWxyZWFkeSBjb21wbGV0ZWQgYW5kIEJ1c0xvZ2ljX1F1ZXVlQ29tcGxldGVkQ0NCCisJCSAgIGJlZW4gY2FsbGVkLCBvciBpdCBtYXkgc3RpbGwgYmUgcGVuZGluZy4KKwkJICovCisJCWlmIChDQ0ItPlN0YXR1cyA9PSBCdXNMb2dpY19DQ0JfQ29tcGxldGVkKQorCQkJQnVzTG9naWNfUHJvY2Vzc0NvbXBsZXRlZENDQnMoSG9zdEFkYXB0ZXIpOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICBCdXNMb2dpY19BYm9ydENvbW1hbmQgYWJvcnRzIENvbW1hbmQgaWYgcG9zc2libGUuCisqLworCitzdGF0aWMgaW50IEJ1c0xvZ2ljX0Fib3J0Q29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpDb21tYW5kKQoreworCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSAoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICopIENvbW1hbmQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlpbnQgVGFyZ2V0SUQgPSBDb21tYW5kLT5kZXZpY2UtPmlkOworCXN0cnVjdCBCdXNMb2dpY19DQ0IgKkNDQjsKKwlCdXNMb2dpY19JbmNyZW1lbnRFcnJvckNvdW50ZXIoJkhvc3RBZGFwdGVyLT5UYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Db21tYW5kQWJvcnRzUmVxdWVzdGVkKTsKKwkvKgorCSAgIElmIHRoaXMgQ29tbWFuZCBoYXMgYWxyZWFkeSBjb21wbGV0ZWQsIHRoZW4gbm8gQWJvcnQgaXMgbmVjZXNzYXJ5LgorCSAqLworCWlmIChDb21tYW5kLT5zZXJpYWxfbnVtYmVyICE9IENvbW1hbmQtPnNlcmlhbF9udW1iZXJfYXRfdGltZW91dCkgeworCQlCdXNMb2dpY19XYXJuaW5nKCJVbmFibGUgdG8gQWJvcnQgQ29tbWFuZCB0byBUYXJnZXQgJWQgLSAiICJBbHJlYWR5IENvbXBsZXRlZFxuIiwgSG9zdEFkYXB0ZXIsIFRhcmdldElEKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCS8qCisJICAgQXR0ZW1wdCB0byBmaW5kIGFuIEFjdGl2ZSBDQ0IgZm9yIHRoaXMgQ29tbWFuZC4gIElmIG5vIEFjdGl2ZSBDQ0IgZm9yIHRoaXMKKwkgICBDb21tYW5kIGlzIGZvdW5kLCB0aGVuIG5vIEFib3J0IGlzIG5lY2Vzc2FyeS4KKwkgKi8KKwlmb3IgKENDQiA9IEhvc3RBZGFwdGVyLT5BbGxfQ0NCczsgQ0NCICE9IE5VTEw7IENDQiA9IENDQi0+TmV4dEFsbCkKKwkJaWYgKENDQi0+Q29tbWFuZCA9PSBDb21tYW5kKQorCQkJYnJlYWs7CisJaWYgKENDQiA9PSBOVUxMKSB7CisJCUJ1c0xvZ2ljX1dhcm5pbmcoIlVuYWJsZSB0byBBYm9ydCBDb21tYW5kIHRvIFRhcmdldCAlZCAtICIgIk5vIENDQiBGb3VuZFxuIiwgSG9zdEFkYXB0ZXIsIFRhcmdldElEKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfSBlbHNlIGlmIChDQ0ItPlN0YXR1cyA9PSBCdXNMb2dpY19DQ0JfQ29tcGxldGVkKSB7CisJCUJ1c0xvZ2ljX1dhcm5pbmcoIlVuYWJsZSB0byBBYm9ydCBDb21tYW5kIHRvIFRhcmdldCAlZCAtICIgIkNDQiBDb21wbGV0ZWRcbiIsIEhvc3RBZGFwdGVyLCBUYXJnZXRJRCk7CisJCXJldHVybiBTVUNDRVNTOworCX0gZWxzZSBpZiAoQ0NCLT5TdGF0dXMgPT0gQnVzTG9naWNfQ0NCX1Jlc2V0KSB7CisJCUJ1c0xvZ2ljX1dhcm5pbmcoIlVuYWJsZSB0byBBYm9ydCBDb21tYW5kIHRvIFRhcmdldCAlZCAtICIgIkNDQiBSZXNldFxuIiwgSG9zdEFkYXB0ZXIsIFRhcmdldElEKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCWlmIChCdXNMb2dpY19NdWx0aU1hc3Rlckhvc3RBZGFwdGVyUChIb3N0QWRhcHRlcikpIHsKKwkJLyoKKwkJICAgQXR0ZW1wdCB0byBBYm9ydCB0aGlzIENDQi4gIE11bHRpTWFzdGVyIEZpcm13YXJlIHZlcnNpb25zIHByaW9yIHRvIDUueHgKKwkJICAgZG8gbm90IGdlbmVyYXRlIEFib3J0IFRhZyBtZXNzYWdlcywgYnV0IG9ubHkgZ2VuZXJhdGUgdGhlIG5vbi10YWdnZWQKKwkJICAgQWJvcnQgbWVzc2FnZS4gIFNpbmNlIG5vbi10YWdnZWQgY29tbWFuZHMgYXJlIG5vdCBzZW50IGJ5IHRoZSBIb3N0CisJCSAgIEFkYXB0ZXIgdW50aWwgdGhlIHF1ZXVlIG9mIG91dHN0YW5kaW5nIHRhZ2dlZCBjb21tYW5kcyBoYXMgY29tcGxldGVkLAorCQkgICBhbmQgdGhlIEFib3J0IG1lc3NhZ2UgaXMgdHJlYXRlZCBhcyBhIG5vbi10YWdnZWQgY29tbWFuZCwgaXQgaXMKKwkJICAgZWZmZWN0aXZlbHkgaW1wb3NzaWJsZSB0byBhYm9ydCBjb21tYW5kcyB3aGVuIFRhZ2dlZCBRdWV1aW5nIGlzIGFjdGl2ZS4KKwkJICAgRmlybXdhcmUgdmVyc2lvbiA1Lnh4IGRvZXMgZ2VuZXJhdGUgQWJvcnQgVGFnIG1lc3NhZ2VzLCBzbyBpdCBpcworCQkgICBwb3NzaWJsZSB0byBhYm9ydCBjb21tYW5kcyB3aGVuIFRhZ2dlZCBRdWV1aW5nIGlzIGFjdGl2ZS4KKwkJICovCisJCWlmIChIb3N0QWRhcHRlci0+VGFyZ2V0RmxhZ3NbVGFyZ2V0SURdLlRhZ2dlZFF1ZXVpbmdBY3RpdmUgJiYgSG9zdEFkYXB0ZXItPkZpcm13YXJlVmVyc2lvblswXSA8ICc1JykgeworCQkJQnVzTG9naWNfV2FybmluZygiVW5hYmxlIHRvIEFib3J0IENDQiAjJWxkIHRvIFRhcmdldCAlZCAtICIgIkFib3J0IFRhZyBOb3QgU3VwcG9ydGVkXG4iLCBIb3N0QWRhcHRlciwgQ0NCLT5TZXJpYWxOdW1iZXIsIFRhcmdldElEKTsKKwkJCXJldHVybiBGQUlMVVJFOworCQl9IGVsc2UgaWYgKEJ1c0xvZ2ljX1dyaXRlT3V0Z29pbmdNYWlsYm94KEhvc3RBZGFwdGVyLCBCdXNMb2dpY19NYWlsYm94QWJvcnRDb21tYW5kLCBDQ0IpKSB7CisJCQlCdXNMb2dpY19XYXJuaW5nKCJBYm9ydGluZyBDQ0IgIyVsZCB0byBUYXJnZXQgJWRcbiIsIEhvc3RBZGFwdGVyLCBDQ0ItPlNlcmlhbE51bWJlciwgVGFyZ2V0SUQpOworCQkJQnVzTG9naWNfSW5jcmVtZW50RXJyb3JDb3VudGVyKCZIb3N0QWRhcHRlci0+VGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uQ29tbWFuZEFib3J0c0F0dGVtcHRlZCk7CisJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCUJ1c0xvZ2ljX1dhcm5pbmcoIlVuYWJsZSB0byBBYm9ydCBDQ0IgIyVsZCB0byBUYXJnZXQgJWQgLSAiICJObyBPdXRnb2luZyBNYWlsYm94ZXNcbiIsIEhvc3RBZGFwdGVyLCBDQ0ItPlNlcmlhbE51bWJlciwgVGFyZ2V0SUQpOworCQkJcmV0dXJuIEZBSUxVUkU7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgICBDYWxsIHRoZSBGbGFzaFBvaW50IFNDQ0IgTWFuYWdlciB0byBhYm9ydCBleGVjdXRpb24gb2YgdGhlIENDQi4KKwkJICovCisJCUJ1c0xvZ2ljX1dhcm5pbmcoIkFib3J0aW5nIENDQiAjJWxkIHRvIFRhcmdldCAlZFxuIiwgSG9zdEFkYXB0ZXIsIENDQi0+U2VyaWFsTnVtYmVyLCBUYXJnZXRJRCk7CisJCUJ1c0xvZ2ljX0luY3JlbWVudEVycm9yQ291bnRlcigmSG9zdEFkYXB0ZXItPlRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLkNvbW1hbmRBYm9ydHNBdHRlbXB0ZWQpOworCQlGbGFzaFBvaW50X0Fib3J0Q0NCKEhvc3RBZGFwdGVyLT5DYXJkSGFuZGxlLCBDQ0IpOworCQkvKgorCQkgICBUaGUgQWJvcnQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGNvbXBsZXRlZCBhbmQKKwkJICAgQnVzTG9naWNfUXVldWVDb21wbGV0ZWRDQ0IgYmVlbiBjYWxsZWQsIG9yIGl0CisJCSAgIG1heSBzdGlsbCBiZSBwZW5kaW5nLgorCQkgKi8KKwkJaWYgKENDQi0+U3RhdHVzID09IEJ1c0xvZ2ljX0NDQl9Db21wbGV0ZWQpIHsKKwkJCUJ1c0xvZ2ljX1Byb2Nlc3NDb21wbGV0ZWRDQ0JzKEhvc3RBZGFwdGVyKTsKKwkJfQorCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qCisgIEJ1c0xvZ2ljX1Jlc2V0SG9zdEFkYXB0ZXIgcmVzZXRzIEhvc3QgQWRhcHRlciBpZiBwb3NzaWJsZSwgbWFya2luZyBhbGwKKyAgY3VycmVudGx5IGV4ZWN1dGluZyBTQ1NJIENvbW1hbmRzIGFzIGhhdmluZyBiZWVuIFJlc2V0LgorKi8KKworc3RhdGljIGludCBCdXNMb2dpY19SZXNldEhvc3RBZGFwdGVyKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIsIGJvb2xlYW4gSGFyZFJlc2V0KQoreworCXN0cnVjdCBCdXNMb2dpY19DQ0IgKkNDQjsKKwlpbnQgVGFyZ2V0SUQ7CisKKwkvKgorCSAqIEF0dGVtcHQgdG8gUmVzZXQgYW5kIFJlaW5pdGlhbGl6ZSB0aGUgSG9zdCBBZGFwdGVyLgorCSAqLworCisJaWYgKCEoQnVzTG9naWNfSGFyZHdhcmVSZXNldEhvc3RBZGFwdGVyKEhvc3RBZGFwdGVyLCBIYXJkUmVzZXQpICYmIEJ1c0xvZ2ljX0luaXRpYWxpemVIb3N0QWRhcHRlcihIb3N0QWRhcHRlcikpKSB7CisJCUJ1c0xvZ2ljX0Vycm9yKCJSZXNldHRpbmcgJXMgRmFpbGVkXG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPkZ1bGxNb2RlbE5hbWUpOworCQlyZXR1cm4gRkFJTFVSRTsKKwl9CisKKwkvKgorCSAqIERlYWxsb2NhdGUgYWxsIGN1cnJlbnRseSBleGVjdXRpbmcgQ0NCcy4KKwkgKi8KKworCWZvciAoQ0NCID0gSG9zdEFkYXB0ZXItPkFsbF9DQ0JzOyBDQ0IgIT0gTlVMTDsgQ0NCID0gQ0NCLT5OZXh0QWxsKQorCQlpZiAoQ0NCLT5TdGF0dXMgPT0gQnVzTG9naWNfQ0NCX0FjdGl2ZSkKKwkJCUJ1c0xvZ2ljX0RlYWxsb2NhdGVDQ0IoQ0NCKTsKKwkvKgorCSAqIFdhaXQgYSBmZXcgc2Vjb25kcyBiZXR3ZWVuIHRoZSBIb3N0IEFkYXB0ZXIgSGFyZCBSZXNldCB3aGljaAorCSAqIGluaXRpYXRlcyBhIFNDU0kgQnVzIFJlc2V0IGFuZCBpc3N1aW5nIGFueSBTQ1NJIENvbW1hbmRzLiAgU29tZQorCSAqIFNDU0kgZGV2aWNlcyBnZXQgY29uZnVzZWQgaWYgdGhleSByZWNlaXZlIFNDU0kgQ29tbWFuZHMgdG9vIHNvb24KKwkgKiBhZnRlciBhIFNDU0kgQnVzIFJlc2V0LgorCSAqLworCisJaWYgKEhhcmRSZXNldCkgeworCQlzcGluX3VubG9ja19pcnEoSG9zdEFkYXB0ZXItPlNDU0lfSG9zdC0+aG9zdF9sb2NrKTsKKwkJQnVzTG9naWNfRGVsYXkoSG9zdEFkYXB0ZXItPkJ1c1NldHRsZVRpbWUpOworCQlzcGluX2xvY2tfaXJxKEhvc3RBZGFwdGVyLT5TQ1NJX0hvc3QtPmhvc3RfbG9jayk7CisJfQorCisJZm9yIChUYXJnZXRJRCA9IDA7IFRhcmdldElEIDwgSG9zdEFkYXB0ZXItPk1heFRhcmdldERldmljZXM7IFRhcmdldElEKyspIHsKKwkJSG9zdEFkYXB0ZXItPkxhc3RSZXNldEF0dGVtcHRlZFtUYXJnZXRJRF0gPSBqaWZmaWVzOworCQlIb3N0QWRhcHRlci0+TGFzdFJlc2V0Q29tcGxldGVkW1RhcmdldElEXSA9IGppZmZpZXM7CisJfQorCXJldHVybiBTVUNDRVNTOworfQorCisvKgorICBCdXNMb2dpY19CSU9TRGlza1BhcmFtZXRlcnMgcmV0dXJucyB0aGUgSGVhZHMvU2VjdG9ycy9DeWxpbmRlcnMgQklPUyBEaXNrCisgIFBhcmFtZXRlcnMgZm9yIERpc2suICBUaGUgZGVmYXVsdCBkaXNrIGdlb21ldHJ5IGlzIDY0IGhlYWRzLCAzMiBzZWN0b3JzLCBhbmQKKyAgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBjeWxpbmRlcnMgc28gYXMgbm90IHRvIGV4Y2VlZCBkcml2ZSBjYXBhY2l0eS4gIEluCisgIG9yZGVyIGZvciBkaXNrcyBlcXVhbCB0byBvciBsYXJnZXIgdGhhbiAxIEdCIHRvIGJlIGFkZHJlc3NhYmxlIGJ5IHRoZSBCSU9TCisgIHdpdGhvdXQgZXhjZWVkaW5nIHRoZSBCSU9TIGxpbWl0YXRpb24gb2YgMTAyNCBjeWxpbmRlcnMsIEV4dGVuZGVkIFRyYW5zbGF0aW9uCisgIG1heSBiZSBlbmFibGVkIGluIEF1dG9TQ1NJIG9uIEZsYXNoUG9pbnQgSG9zdCBBZGFwdGVycyBhbmQgb24gIlciIGFuZCAiQyIKKyAgc2VyaWVzIE11bHRpTWFzdGVyIEhvc3QgQWRhcHRlcnMsIG9yIGJ5IGEgZGlwIHN3aXRjaCBzZXR0aW5nIG9uICJTIiBhbmQgIkEiCisgIHNlcmllcyBNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXJzLiAgV2l0aCBFeHRlbmRlZCBUcmFuc2xhdGlvbiBlbmFibGVkLCBkcml2ZXMKKyAgYmV0d2VlbiAxIEdCIGluY2x1c2l2ZSBhbmQgMiBHQiBleGNsdXNpdmUgYXJlIGdpdmVuIGEgZGlzayBnZW9tZXRyeSBvZiAxMjgKKyAgaGVhZHMgYW5kIDMyIHNlY3RvcnMsIGFuZCBkcml2ZXMgYWJvdmUgMiBHQiBpbmNsdXNpdmUgYXJlIGdpdmVuIGEgZGlzaworICBnZW9tZXRyeSBvZiAyNTUgaGVhZHMgYW5kIDYzIHNlY3RvcnMuICBIb3dldmVyLCBpZiB0aGUgQklPUyBkZXRlY3RzIHRoYXQgdGhlCisgIEV4dGVuZGVkIFRyYW5zbGF0aW9uIHNldHRpbmcgZG9lcyBub3QgbWF0Y2ggdGhlIGdlb21ldHJ5IGluIHRoZSBwYXJ0aXRpb24KKyAgdGFibGUsIHRoZW4gdGhlIHRyYW5zbGF0aW9uIGluZmVycmVkIGZyb20gdGhlIHBhcnRpdGlvbiB0YWJsZSB3aWxsIGJlIHVzZWQgYnkKKyAgdGhlIEJJT1MsIGFuZCBhIHdhcm5pbmcgbWF5IGJlIGRpc3BsYXllZC4KKyovCisKK3N0YXRpYyBpbnQgQnVzTG9naWNfQklPU0Rpc2tQYXJhbWV0ZXJzKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqRGV2aWNlLCBzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICpQYXJhbWV0ZXJzKQoreworCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSAoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICopIHNkZXYtPmhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBCSU9TX0Rpc2tQYXJhbWV0ZXJzICpEaXNrUGFyYW1ldGVycyA9IChzdHJ1Y3QgQklPU19EaXNrUGFyYW1ldGVycyAqKSBQYXJhbWV0ZXJzOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpZiAoSG9zdEFkYXB0ZXItPkV4dGVuZGVkVHJhbnNsYXRpb25FbmFibGVkICYmIGNhcGFjaXR5ID49IDIgKiAxMDI0ICogMTAyNCAvKiAxIEdCIGluIDUxMiBieXRlIHNlY3RvcnMgKi8gKSB7CisJCWlmIChjYXBhY2l0eSA+PSA0ICogMTAyNCAqIDEwMjQgLyogMiBHQiBpbiA1MTIgYnl0ZSBzZWN0b3JzICovICkgeworCQkJRGlza1BhcmFtZXRlcnMtPkhlYWRzID0gMjU1OworCQkJRGlza1BhcmFtZXRlcnMtPlNlY3RvcnMgPSA2MzsKKwkJfSBlbHNlIHsKKwkJCURpc2tQYXJhbWV0ZXJzLT5IZWFkcyA9IDEyODsKKwkJCURpc2tQYXJhbWV0ZXJzLT5TZWN0b3JzID0gMzI7CisJCX0KKwl9IGVsc2UgeworCQlEaXNrUGFyYW1ldGVycy0+SGVhZHMgPSA2NDsKKwkJRGlza1BhcmFtZXRlcnMtPlNlY3RvcnMgPSAzMjsKKwl9CisJRGlza1BhcmFtZXRlcnMtPkN5bGluZGVycyA9ICh1bnNpZ25lZCBsb25nKSBjYXBhY2l0eSAvIChEaXNrUGFyYW1ldGVycy0+SGVhZHMgKiBEaXNrUGFyYW1ldGVycy0+U2VjdG9ycyk7CisJYnVmID0gc2NzaV9iaW9zX3B0YWJsZShEZXZpY2UpOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJLyoKKwkgICBJZiB0aGUgYm9vdCBzZWN0b3IgcGFydGl0aW9uIHRhYmxlIGZsYWcgaXMgdmFsaWQsIHNlYXJjaCBmb3IgYSBwYXJ0aXRpb24KKwkgICB0YWJsZSBlbnRyeSB3aG9zZSBlbmRfaGVhZCBtYXRjaGVzIG9uZSBvZiB0aGUgc3RhbmRhcmQgQnVzTG9naWMgZ2VvbWV0cnkKKwkgICB0cmFuc2xhdGlvbnMgKDY0LzMyLCAxMjgvMzIsIG9yIDI1NS82MykuCisJICovCisJaWYgKCoodW5zaWduZWQgc2hvcnQgKikgKGJ1ZiArIDY0KSA9PSAweEFBNTUpIHsKKwkJc3RydWN0IHBhcnRpdGlvbiAqRmlyc3RQYXJ0aXRpb25FbnRyeSA9IChzdHJ1Y3QgcGFydGl0aW9uICopIGJ1ZjsKKwkJc3RydWN0IHBhcnRpdGlvbiAqUGFydGl0aW9uRW50cnkgPSBGaXJzdFBhcnRpdGlvbkVudHJ5OworCQlpbnQgU2F2ZWRDeWxpbmRlcnMgPSBEaXNrUGFyYW1ldGVycy0+Q3lsaW5kZXJzLCBQYXJ0aXRpb25OdW1iZXI7CisJCXVuc2lnbmVkIGNoYXIgUGFydGl0aW9uRW50cnlFbmRIZWFkID0gMCwgUGFydGl0aW9uRW50cnlFbmRTZWN0b3IgPSAwOworCQlmb3IgKFBhcnRpdGlvbk51bWJlciA9IDA7IFBhcnRpdGlvbk51bWJlciA8IDQ7IFBhcnRpdGlvbk51bWJlcisrKSB7CisJCQlQYXJ0aXRpb25FbnRyeUVuZEhlYWQgPSBQYXJ0aXRpb25FbnRyeS0+ZW5kX2hlYWQ7CisJCQlQYXJ0aXRpb25FbnRyeUVuZFNlY3RvciA9IFBhcnRpdGlvbkVudHJ5LT5lbmRfc2VjdG9yICYgMHgzRjsKKwkJCWlmIChQYXJ0aXRpb25FbnRyeUVuZEhlYWQgPT0gNjQgLSAxKSB7CisJCQkJRGlza1BhcmFtZXRlcnMtPkhlYWRzID0gNjQ7CisJCQkJRGlza1BhcmFtZXRlcnMtPlNlY3RvcnMgPSAzMjsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoUGFydGl0aW9uRW50cnlFbmRIZWFkID09IDEyOCAtIDEpIHsKKwkJCQlEaXNrUGFyYW1ldGVycy0+SGVhZHMgPSAxMjg7CisJCQkJRGlza1BhcmFtZXRlcnMtPlNlY3RvcnMgPSAzMjsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoUGFydGl0aW9uRW50cnlFbmRIZWFkID09IDI1NSAtIDEpIHsKKwkJCQlEaXNrUGFyYW1ldGVycy0+SGVhZHMgPSAyNTU7CisJCQkJRGlza1BhcmFtZXRlcnMtPlNlY3RvcnMgPSA2MzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCVBhcnRpdGlvbkVudHJ5Kys7CisJCX0KKwkJaWYgKFBhcnRpdGlvbk51bWJlciA9PSA0KSB7CisJCQlQYXJ0aXRpb25FbnRyeUVuZEhlYWQgPSBGaXJzdFBhcnRpdGlvbkVudHJ5LT5lbmRfaGVhZDsKKwkJCVBhcnRpdGlvbkVudHJ5RW5kU2VjdG9yID0gRmlyc3RQYXJ0aXRpb25FbnRyeS0+ZW5kX3NlY3RvciAmIDB4M0Y7CisJCX0KKwkJRGlza1BhcmFtZXRlcnMtPkN5bGluZGVycyA9ICh1bnNpZ25lZCBsb25nKSBjYXBhY2l0eSAvIChEaXNrUGFyYW1ldGVycy0+SGVhZHMgKiBEaXNrUGFyYW1ldGVycy0+U2VjdG9ycyk7CisJCWlmIChQYXJ0aXRpb25OdW1iZXIgPCA0ICYmIFBhcnRpdGlvbkVudHJ5RW5kU2VjdG9yID09IERpc2tQYXJhbWV0ZXJzLT5TZWN0b3JzKSB7CisJCQlpZiAoRGlza1BhcmFtZXRlcnMtPkN5bGluZGVycyAhPSBTYXZlZEN5bGluZGVycykKKwkJCQlCdXNMb2dpY19XYXJuaW5nKCJBZG9wdGluZyBHZW9tZXRyeSAlZC8lZCBmcm9tIFBhcnRpdGlvbiBUYWJsZVxuIiwgSG9zdEFkYXB0ZXIsIERpc2tQYXJhbWV0ZXJzLT5IZWFkcywgRGlza1BhcmFtZXRlcnMtPlNlY3RvcnMpOworCQl9IGVsc2UgaWYgKFBhcnRpdGlvbkVudHJ5RW5kSGVhZCA+IDAgfHwgUGFydGl0aW9uRW50cnlFbmRTZWN0b3IgPiAwKSB7CisJCQlCdXNMb2dpY19XYXJuaW5nKCJXYXJuaW5nOiBQYXJ0aXRpb24gVGFibGUgYXBwZWFycyB0byAiICJoYXZlIEdlb21ldHJ5ICVkLyVkIHdoaWNoIGlzXG4iLCBIb3N0QWRhcHRlciwgUGFydGl0aW9uRW50cnlFbmRIZWFkICsgMSwgUGFydGl0aW9uRW50cnlFbmRTZWN0b3IpOworCQkJQnVzTG9naWNfV2FybmluZygibm90IGNvbXBhdGlibGUgd2l0aCBjdXJyZW50IEJ1c0xvZ2ljICIgIkhvc3QgQWRhcHRlciBHZW9tZXRyeSAlZC8lZFxuIiwgSG9zdEFkYXB0ZXIsIERpc2tQYXJhbWV0ZXJzLT5IZWFkcywgRGlza1BhcmFtZXRlcnMtPlNlY3RvcnMpOworCQl9CisJfQorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAgQnVnTG9naWNfUHJvY0RpcmVjdG9yeUluZm8gaW1wbGVtZW50cyAvcHJvYy9zY3NpL0J1c0xvZ2ljLzxOPi4KKyovCisKK3N0YXRpYyBpbnQgQnVzTG9naWNfUHJvY0RpcmVjdG9yeUluZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGNoYXIgKlByb2NCdWZmZXIsIGNoYXIgKipTdGFydFBvaW50ZXIsIG9mZl90IE9mZnNldCwgaW50IEJ5dGVzQXZhaWxhYmxlLCBpbnQgV3JpdGVGbGFnKQoreworCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSAoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICopIHNob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgQnVzTG9naWNfVGFyZ2V0U3RhdGlzdGljcyAqVGFyZ2V0U3RhdGlzdGljczsKKwlpbnQgVGFyZ2V0SUQsIExlbmd0aDsKKwljaGFyICpCdWZmZXI7CisKKwlUYXJnZXRTdGF0aXN0aWNzID0gSG9zdEFkYXB0ZXItPlRhcmdldFN0YXRpc3RpY3M7CisJaWYgKFdyaXRlRmxhZykgeworCQlIb3N0QWRhcHRlci0+RXh0ZXJuYWxIb3N0QWRhcHRlclJlc2V0cyA9IDA7CisJCUhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckludGVybmFsRXJyb3JzID0gMDsKKwkJbWVtc2V0KFRhcmdldFN0YXRpc3RpY3MsIDAsIEJ1c0xvZ2ljX01heFRhcmdldERldmljZXMgKiBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX1RhcmdldFN0YXRpc3RpY3MpKTsKKwkJcmV0dXJuIDA7CisJfQorCUJ1ZmZlciA9IEhvc3RBZGFwdGVyLT5NZXNzYWdlQnVmZmVyOworCUxlbmd0aCA9IEhvc3RBZGFwdGVyLT5NZXNzYWdlQnVmZmVyTGVuZ3RoOworCUxlbmd0aCArPSBzcHJpbnRmKCZCdWZmZXJbTGVuZ3RoXSwgIlxuXAorQ3VycmVudCBEcml2ZXIgUXVldWUgRGVwdGg6CSVkXG5cCitDdXJyZW50bHkgQWxsb2NhdGVkIENDQnM6CSVkXG4iLCBIb3N0QWRhcHRlci0+RHJpdmVyUXVldWVEZXB0aCwgSG9zdEFkYXB0ZXItPkFsbG9jYXRlZENDQnMpOworCUxlbmd0aCArPSBzcHJpbnRmKCZCdWZmZXJbTGVuZ3RoXSwgIlxuXG5cCisJCQkgICBEQVRBIFRSQU5TRkVSIFNUQVRJU1RJQ1NcblwKK1xuXAorVGFyZ2V0CVRhZ2dlZCBRdWV1aW5nCVF1ZXVlIERlcHRoICBBY3RpdmUgIEF0dGVtcHRlZAlDb21wbGV0ZWRcblwKKz09PT09PQk9PT09PT09PT09PT09PQk9PT09PT09PT09PSAgPT09PT09ICA9PT09PT09PT0JPT09PT09PT09XG4iKTsKKwlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykgeworCQlzdHJ1Y3QgQnVzTG9naWNfVGFyZ2V0RmxhZ3MgKlRhcmdldEZsYWdzID0gJkhvc3RBZGFwdGVyLT5UYXJnZXRGbGFnc1tUYXJnZXRJRF07CisJCWlmICghVGFyZ2V0RmxhZ3MtPlRhcmdldEV4aXN0cykKKwkJCWNvbnRpbnVlOworCQlMZW5ndGggKz0gc3ByaW50ZigmQnVmZmVyW0xlbmd0aF0sICIgICUyZAklcyIsIFRhcmdldElELCAoVGFyZ2V0RmxhZ3MtPlRhZ2dlZFF1ZXVpbmdTdXBwb3J0ZWQgPyAoVGFyZ2V0RmxhZ3MtPlRhZ2dlZFF1ZXVpbmdBY3RpdmUgPyAiICAgIEFjdGl2ZSIgOiAoSG9zdEFkYXB0ZXItPlRhZ2dlZFF1ZXVpbmdQZXJtaXR0ZWQgJiAoMSA8PCBUYXJnZXRJRCkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJICAgID8gIiAgUGVybWl0dGVkIiA6ICIgICBEaXNhYmxlZCIpKQorCQkJCQkJCQkJICA6ICJOb3QgU3VwcG9ydGVkIikpOworCQlMZW5ndGggKz0gc3ByaW50ZigmQnVmZmVyW0xlbmd0aF0sCisJCQkJICAiCSAgICAlM2QgICAgICAgJTN1ICAgICU5dQklOXVcbiIsIEhvc3RBZGFwdGVyLT5RdWV1ZURlcHRoW1RhcmdldElEXSwgSG9zdEFkYXB0ZXItPkFjdGl2ZUNvbW1hbmRzW1RhcmdldElEXSwgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uQ29tbWFuZHNBdHRlbXB0ZWQsIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLkNvbW1hbmRzQ29tcGxldGVkKTsKKwl9CisJTGVuZ3RoICs9IHNwcmludGYoJkJ1ZmZlcltMZW5ndGhdLCAiXG5cCitUYXJnZXQgIFJlYWQgQ29tbWFuZHMgIFdyaXRlIENvbW1hbmRzICAgVG90YWwgQnl0ZXMgUmVhZCAgICBUb3RhbCBCeXRlcyBXcml0dGVuXG5cCis9PT09PT0gID09PT09PT09PT09PT0gID09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09XG4iKTsKKwlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykgeworCQlzdHJ1Y3QgQnVzTG9naWNfVGFyZ2V0RmxhZ3MgKlRhcmdldEZsYWdzID0gJkhvc3RBZGFwdGVyLT5UYXJnZXRGbGFnc1tUYXJnZXRJRF07CisJCWlmICghVGFyZ2V0RmxhZ3MtPlRhcmdldEV4aXN0cykKKwkJCWNvbnRpbnVlOworCQlMZW5ndGggKz0gc3ByaW50ZigmQnVmZmVyW0xlbmd0aF0sICIgICUyZAkgICU5dQkgJTl1IiwgVGFyZ2V0SUQsIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlJlYWRDb21tYW5kcywgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uV3JpdGVDb21tYW5kcyk7CisJCWlmIChUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Ub3RhbEJ5dGVzUmVhZC5CaWxsaW9ucyA+IDApCisJCQlMZW5ndGggKz0gc3ByaW50ZigmQnVmZmVyW0xlbmd0aF0sICIgICAgICU5dSUwOXUiLCBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Ub3RhbEJ5dGVzUmVhZC5CaWxsaW9ucywgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uVG90YWxCeXRlc1JlYWQuVW5pdHMpOworCQllbHNlCisJCQlMZW5ndGggKz0gc3ByaW50ZigmQnVmZmVyW0xlbmd0aF0sICIJCSU5dSIsIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlRvdGFsQnl0ZXNSZWFkLlVuaXRzKTsKKwkJaWYgKFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlRvdGFsQnl0ZXNXcml0dGVuLkJpbGxpb25zID4gMCkKKwkJCUxlbmd0aCArPSBzcHJpbnRmKCZCdWZmZXJbTGVuZ3RoXSwgIiAgICU5dSUwOXVcbiIsIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlRvdGFsQnl0ZXNXcml0dGVuLkJpbGxpb25zLCBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Ub3RhbEJ5dGVzV3JpdHRlbi5Vbml0cyk7CisJCWVsc2UKKwkJCUxlbmd0aCArPSBzcHJpbnRmKCZCdWZmZXJbTGVuZ3RoXSwgIgkgICAgICU5dVxuIiwgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uVG90YWxCeXRlc1dyaXR0ZW4uVW5pdHMpOworCX0KKwlMZW5ndGggKz0gc3ByaW50ZigmQnVmZmVyW0xlbmd0aF0sICJcblwKK1RhcmdldCAgQ29tbWFuZCAgICAwLTFLQiAgICAgIDEtMktCICAgICAgMi00S0IgICAgICA0LThLQiAgICAgOC0xNktCXG5cCis9PT09PT0gID09PT09PT0gID09PT09PT09PSAgPT09PT09PT09ICA9PT09PT09PT0gID09PT09PT09PSAgPT09PT09PT09XG4iKTsKKwlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykgeworCQlzdHJ1Y3QgQnVzTG9naWNfVGFyZ2V0RmxhZ3MgKlRhcmdldEZsYWdzID0gJkhvc3RBZGFwdGVyLT5UYXJnZXRGbGFnc1tUYXJnZXRJRF07CisJCWlmICghVGFyZ2V0RmxhZ3MtPlRhcmdldEV4aXN0cykKKwkJCWNvbnRpbnVlOworCQlMZW5ndGggKz0KKwkJICAgIHNwcmludGYoJkJ1ZmZlcltMZW5ndGhdLAorCQkJICAgICIgICUyZAkgUmVhZAkgJTl1ICAlOXUgICU5dSAgJTl1ICAlOXVcbiIsIFRhcmdldElELAorCQkJICAgIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlJlYWRDb21tYW5kU2l6ZUJ1Y2tldHNbMF0sCisJCQkgICAgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uUmVhZENvbW1hbmRTaXplQnVja2V0c1sxXSwgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uUmVhZENvbW1hbmRTaXplQnVja2V0c1syXSwgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uUmVhZENvbW1hbmRTaXplQnVja2V0c1szXSwgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uUmVhZENvbW1hbmRTaXplQnVja2V0c1s0XSk7CisJCUxlbmd0aCArPQorCQkgICAgc3ByaW50ZigmQnVmZmVyW0xlbmd0aF0sCisJCQkgICAgIiAgJTJkCSBXcml0ZQkgJTl1ICAlOXUgICU5dSAgJTl1ICAlOXVcbiIsIFRhcmdldElELAorCQkJICAgIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLldyaXRlQ29tbWFuZFNpemVCdWNrZXRzWzBdLAorCQkJICAgIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLldyaXRlQ29tbWFuZFNpemVCdWNrZXRzWzFdLCBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Xcml0ZUNvbW1hbmRTaXplQnVja2V0c1syXSwgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uV3JpdGVDb21tYW5kU2l6ZUJ1Y2tldHNbM10sIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLldyaXRlQ29tbWFuZFNpemVCdWNrZXRzWzRdKTsKKwl9CisJTGVuZ3RoICs9IHNwcmludGYoJkJ1ZmZlcltMZW5ndGhdLCAiXG5cCitUYXJnZXQgIENvbW1hbmQgICAxNi0zMktCICAgIDMyLTY0S0IgICA2NC0xMjhLQiAgIDEyOC0yNTZLQiAgIDI1NktCK1xuXAorPT09PT09ICA9PT09PT09ICA9PT09PT09PT0gID09PT09PT09PSAgPT09PT09PT09ICA9PT09PT09PT0gID09PT09PT09PVxuIik7CisJZm9yIChUYXJnZXRJRCA9IDA7IFRhcmdldElEIDwgSG9zdEFkYXB0ZXItPk1heFRhcmdldERldmljZXM7IFRhcmdldElEKyspIHsKKwkJc3RydWN0IEJ1c0xvZ2ljX1RhcmdldEZsYWdzICpUYXJnZXRGbGFncyA9ICZIb3N0QWRhcHRlci0+VGFyZ2V0RmxhZ3NbVGFyZ2V0SURdOworCQlpZiAoIVRhcmdldEZsYWdzLT5UYXJnZXRFeGlzdHMpCisJCQljb250aW51ZTsKKwkJTGVuZ3RoICs9CisJCSAgICBzcHJpbnRmKCZCdWZmZXJbTGVuZ3RoXSwKKwkJCSAgICAiICAlMmQJIFJlYWQJICU5dSAgJTl1ICAlOXUgICU5dSAgJTl1XG4iLCBUYXJnZXRJRCwKKwkJCSAgICBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5SZWFkQ29tbWFuZFNpemVCdWNrZXRzWzVdLAorCQkJICAgIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlJlYWRDb21tYW5kU2l6ZUJ1Y2tldHNbNl0sIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlJlYWRDb21tYW5kU2l6ZUJ1Y2tldHNbN10sIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlJlYWRDb21tYW5kU2l6ZUJ1Y2tldHNbOF0sIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlJlYWRDb21tYW5kU2l6ZUJ1Y2tldHNbOV0pOworCQlMZW5ndGggKz0KKwkJICAgIHNwcmludGYoJkJ1ZmZlcltMZW5ndGhdLAorCQkJICAgICIgICUyZAkgV3JpdGUJICU5dSAgJTl1ICAlOXUgICU5dSAgJTl1XG4iLCBUYXJnZXRJRCwKKwkJCSAgICBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Xcml0ZUNvbW1hbmRTaXplQnVja2V0c1s1XSwKKwkJCSAgICBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Xcml0ZUNvbW1hbmRTaXplQnVja2V0c1s2XSwgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uV3JpdGVDb21tYW5kU2l6ZUJ1Y2tldHNbN10sIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLldyaXRlQ29tbWFuZFNpemVCdWNrZXRzWzhdLCBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Xcml0ZUNvbW1hbmRTaXplQnVja2V0c1s5XSk7CisJfQorCUxlbmd0aCArPSBzcHJpbnRmKCZCdWZmZXJbTGVuZ3RoXSwgIlxuXG5cCisJCQkgICBFUlJPUiBSRUNPVkVSWSBTVEFUSVNUSUNTXG5cCitcblwKKwkgIENvbW1hbmQgQWJvcnRzICAgICAgQnVzIERldmljZSBSZXNldHMJICBIb3N0IEFkYXB0ZXIgUmVzZXRzXG5cCitUYXJnZXQJUmVxdWVzdGVkIENvbXBsZXRlZCAgUmVxdWVzdGVkIENvbXBsZXRlZCAgUmVxdWVzdGVkIENvbXBsZXRlZFxuXAorICBJRAlcXFxcXFxcXCBBdHRlbXB0ZWQgLy8vLyAgXFxcXFxcXFwgQXR0ZW1wdGVkIC8vLy8gIFxcXFxcXFxcIEF0dGVtcHRlZCAvLy8vXG5cCis9PT09PT0JID09PT09ID09PT09ID09PT09ICAgID09PT09ID09PT09ID09PT09CSAgID09PT09ID09PT09ID09PT09XG4iKTsKKwlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykgeworCQlzdHJ1Y3QgQnVzTG9naWNfVGFyZ2V0RmxhZ3MgKlRhcmdldEZsYWdzID0gJkhvc3RBZGFwdGVyLT5UYXJnZXRGbGFnc1tUYXJnZXRJRF07CisJCWlmICghVGFyZ2V0RmxhZ3MtPlRhcmdldEV4aXN0cykKKwkJCWNvbnRpbnVlOworCQlMZW5ndGggKz0gc3ByaW50ZigmQnVmZmVyW0xlbmd0aF0sICJcCisgICUyZAkgJTVkICU1ZCAlNWQgICAgJTVkICU1ZCAlNWQJICAgJTVkICU1ZCAlNWRcbiIsIFRhcmdldElELCBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Db21tYW5kQWJvcnRzUmVxdWVzdGVkLCBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Db21tYW5kQWJvcnRzQXR0ZW1wdGVkLCBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Db21tYW5kQWJvcnRzQ29tcGxldGVkLCBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5CdXNEZXZpY2VSZXNldHNSZXF1ZXN0ZWQsIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLkJ1c0RldmljZVJlc2V0c0F0dGVtcHRlZCwgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uQnVzRGV2aWNlUmVzZXRzQ29tcGxldGVkLCBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Ib3N0QWRhcHRlclJlc2V0c1JlcXVlc3RlZCwgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uSG9zdEFkYXB0ZXJSZXNldHNBdHRlbXB0ZWQsIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLkhvc3RBZGFwdGVyUmVzZXRzQ29tcGxldGVkKTsKKwl9CisJTGVuZ3RoICs9IHNwcmludGYoJkJ1ZmZlcltMZW5ndGhdLCAiXG5FeHRlcm5hbCBIb3N0IEFkYXB0ZXIgUmVzZXRzOiAlZFxuIiwgSG9zdEFkYXB0ZXItPkV4dGVybmFsSG9zdEFkYXB0ZXJSZXNldHMpOworCUxlbmd0aCArPSBzcHJpbnRmKCZCdWZmZXJbTGVuZ3RoXSwgIkhvc3QgQWRhcHRlciBJbnRlcm5hbCBFcnJvcnM6ICVkXG4iLCBIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJJbnRlcm5hbEVycm9ycyk7CisJaWYgKExlbmd0aCA+PSBCdXNMb2dpY19NZXNzYWdlQnVmZmVyU2l6ZSkKKwkJQnVzTG9naWNfRXJyb3IoIk1lc3NhZ2UgQnVmZmVyIGxlbmd0aCAlZCBleGNlZWRzIHNpemUgJWRcbiIsIEhvc3RBZGFwdGVyLCBMZW5ndGgsIEJ1c0xvZ2ljX01lc3NhZ2VCdWZmZXJTaXplKTsKKwlpZiAoKExlbmd0aCAtPSBPZmZzZXQpIDw9IDApCisJCXJldHVybiAwOworCWlmIChMZW5ndGggPj0gQnl0ZXNBdmFpbGFibGUpCisJCUxlbmd0aCA9IEJ5dGVzQXZhaWxhYmxlOworCW1lbWNweShQcm9jQnVmZmVyLCBIb3N0QWRhcHRlci0+TWVzc2FnZUJ1ZmZlciArIE9mZnNldCwgTGVuZ3RoKTsKKwkqU3RhcnRQb2ludGVyID0gUHJvY0J1ZmZlcjsKKwlyZXR1cm4gTGVuZ3RoOworfQorCisKKy8qCisgIEJ1c0xvZ2ljX01lc3NhZ2UgcHJpbnRzIERyaXZlciBNZXNzYWdlcy4KKyovCisKK3N0YXRpYyB2b2lkIEJ1c0xvZ2ljX01lc3NhZ2UoZW51bSBCdXNMb2dpY19NZXNzYWdlTGV2ZWwgTWVzc2FnZUxldmVsLCBjaGFyICpGb3JtYXQsIHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIsIC4uLikKK3sKKwlzdGF0aWMgY2hhciBCdWZmZXJbQnVzTG9naWNfTGluZUJ1ZmZlclNpemVdOworCXN0YXRpYyBib29sZWFuIEJlZ2lubmluZ09mTGluZSA9IHRydWU7CisJdmFfbGlzdCBBcmd1bWVudHM7CisJaW50IExlbmd0aCA9IDA7CisJdmFfc3RhcnQoQXJndW1lbnRzLCBIb3N0QWRhcHRlcik7CisJTGVuZ3RoID0gdnNwcmludGYoQnVmZmVyLCBGb3JtYXQsIEFyZ3VtZW50cyk7CisJdmFfZW5kKEFyZ3VtZW50cyk7CisJaWYgKE1lc3NhZ2VMZXZlbCA9PSBCdXNMb2dpY19Bbm5vdW5jZUxldmVsKSB7CisJCXN0YXRpYyBpbnQgQW5ub3VuY2VtZW50TGluZXMgPSAwOworCQlzdHJjcHkoJkhvc3RBZGFwdGVyLT5NZXNzYWdlQnVmZmVyW0hvc3RBZGFwdGVyLT5NZXNzYWdlQnVmZmVyTGVuZ3RoXSwgQnVmZmVyKTsKKwkJSG9zdEFkYXB0ZXItPk1lc3NhZ2VCdWZmZXJMZW5ndGggKz0gTGVuZ3RoOworCQlpZiAoKytBbm5vdW5jZW1lbnRMaW5lcyA8PSAyKQorCQkJcHJpbnRrKCIlc3Njc2k6ICVzIiwgQnVzTG9naWNfTWVzc2FnZUxldmVsTWFwW01lc3NhZ2VMZXZlbF0sIEJ1ZmZlcik7CisJfSBlbHNlIGlmIChNZXNzYWdlTGV2ZWwgPT0gQnVzTG9naWNfSW5mb0xldmVsKSB7CisJCXN0cmNweSgmSG9zdEFkYXB0ZXItPk1lc3NhZ2VCdWZmZXJbSG9zdEFkYXB0ZXItPk1lc3NhZ2VCdWZmZXJMZW5ndGhdLCBCdWZmZXIpOworCQlIb3N0QWRhcHRlci0+TWVzc2FnZUJ1ZmZlckxlbmd0aCArPSBMZW5ndGg7CisJCWlmIChCZWdpbm5pbmdPZkxpbmUpIHsKKwkJCWlmIChCdWZmZXJbMF0gIT0gJ1xuJyB8fCBMZW5ndGggPiAxKQorCQkJCXByaW50aygiJXNzY3NpJWQ6ICVzIiwgQnVzTG9naWNfTWVzc2FnZUxldmVsTWFwW01lc3NhZ2VMZXZlbF0sIEhvc3RBZGFwdGVyLT5Ib3N0TnVtYmVyLCBCdWZmZXIpOworCQl9IGVsc2UKKwkJCXByaW50aygiJXMiLCBCdWZmZXIpOworCX0gZWxzZSB7CisJCWlmIChCZWdpbm5pbmdPZkxpbmUpIHsKKwkJCWlmIChIb3N0QWRhcHRlciAhPSBOVUxMICYmIEhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckluaXRpYWxpemVkKQorCQkJCXByaW50aygiJXNzY3NpJWQ6ICVzIiwgQnVzTG9naWNfTWVzc2FnZUxldmVsTWFwW01lc3NhZ2VMZXZlbF0sIEhvc3RBZGFwdGVyLT5Ib3N0TnVtYmVyLCBCdWZmZXIpOworCQkJZWxzZQorCQkJCXByaW50aygiJXMlcyIsIEJ1c0xvZ2ljX01lc3NhZ2VMZXZlbE1hcFtNZXNzYWdlTGV2ZWxdLCBCdWZmZXIpOworCQl9IGVsc2UKKwkJCXByaW50aygiJXMiLCBCdWZmZXIpOworCX0KKwlCZWdpbm5pbmdPZkxpbmUgPSAoQnVmZmVyW0xlbmd0aCAtIDFdID09ICdcbicpOworfQorCisKKy8qCisgIEJ1c0xvZ2ljX1BhcnNlS2V5d29yZCBwYXJzZXMgYW4gaW5kaXZpZHVhbCBvcHRpb24ga2V5d29yZC4gIEl0IHJldHVybnMgdHJ1ZQorICBhbmQgdXBkYXRlcyB0aGUgcG9pbnRlciBpZiB0aGUga2V5d29yZCBpcyByZWNvZ25pemVkIGFuZCBmYWxzZSBvdGhlcndpc2UuCisqLworCitzdGF0aWMgYm9vbGVhbiBfX2luaXQgQnVzTG9naWNfUGFyc2VLZXl3b3JkKGNoYXIgKipTdHJpbmdQb2ludGVyLCBjaGFyICpLZXl3b3JkKQoreworCWNoYXIgKlBvaW50ZXIgPSAqU3RyaW5nUG9pbnRlcjsKKwl3aGlsZSAoKktleXdvcmQgIT0gJ1wwJykgeworCQljaGFyIFN0cmluZ0NoYXIgPSAqUG9pbnRlcisrOworCQljaGFyIEtleXdvcmRDaGFyID0gKktleXdvcmQrKzsKKwkJaWYgKFN0cmluZ0NoYXIgPj0gJ0EnICYmIFN0cmluZ0NoYXIgPD0gJ1onKQorCQkJU3RyaW5nQ2hhciArPSAnYScgLSAnWic7CisJCWlmIChLZXl3b3JkQ2hhciA+PSAnQScgJiYgS2V5d29yZENoYXIgPD0gJ1onKQorCQkJS2V5d29yZENoYXIgKz0gJ2EnIC0gJ1onOworCQlpZiAoU3RyaW5nQ2hhciAhPSBLZXl3b3JkQ2hhcikKKwkJCXJldHVybiBmYWxzZTsKKwl9CisJKlN0cmluZ1BvaW50ZXIgPSBQb2ludGVyOworCXJldHVybiB0cnVlOworfQorCisKKy8qCisgIEJ1c0xvZ2ljX1BhcnNlRHJpdmVyT3B0aW9ucyBoYW5kbGVzIHByb2Nlc3Npbmcgb2YgQnVzTG9naWMgRHJpdmVyIE9wdGlvbnMKKyAgc3BlY2lmaWNhdGlvbnMuCisKKyAgQnVzTG9naWMgRHJpdmVyIE9wdGlvbnMgbWF5IGJlIHNwZWNpZmllZCBlaXRoZXIgdmlhIHRoZSBMaW51eCBLZXJuZWwgQ29tbWFuZAorICBMaW5lIG9yIHZpYSB0aGUgTG9hZGFibGUgS2VybmVsIE1vZHVsZSBJbnN0YWxsYXRpb24gRmFjaWxpdHkuICBEcml2ZXIgT3B0aW9ucworICBmb3IgbXVsdGlwbGUgaG9zdCBhZGFwdGVycyBtYXkgYmUgc3BlY2lmaWVkIGVpdGhlciBieSBzZXBhcmF0aW5nIHRoZSBvcHRpb24KKyAgc3RyaW5ncyBieSBhIHNlbWljb2xvbiwgb3IgYnkgc3BlY2lmeWluZyBtdWx0aXBsZSAiQnVzTG9naWM9IiBzdHJpbmdzIG9uIHRoZQorICBjb21tYW5kIGxpbmUuICBJbmRpdmlkdWFsIG9wdGlvbiBzcGVjaWZpY2F0aW9ucyBmb3IgYSBzaW5nbGUgaG9zdCBhZGFwdGVyIGFyZQorICBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgVGhlIFByb2JpbmcgYW5kIERlYnVnZ2luZyBPcHRpb25zIGFwcGx5IHRvIGFsbCBob3N0CisgIGFkYXB0ZXJzIHdoZXJlYXMgdGhlIHJlbWFpbmluZyBvcHRpb25zIGFwcGx5IGluZGl2aWR1YWxseSBvbmx5IHRvIHRoZQorICBzZWxlY3RlZCBob3N0IGFkYXB0ZXIuCisKKyAgVGhlIEJ1c0xvZ2ljIERyaXZlciBQcm9iaW5nIE9wdGlvbnMgYXJlIGRlc2NyaWJlZCBpbgorICA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvQnVzTG9naWMudHh0Pi4KKyovCisKK3N0YXRpYyBpbnQgX19pbml0IEJ1c0xvZ2ljX1BhcnNlRHJpdmVyT3B0aW9ucyhjaGFyICpPcHRpb25zU3RyaW5nKQoreworCXdoaWxlICh0cnVlKSB7CisJCXN0cnVjdCBCdXNMb2dpY19Ecml2ZXJPcHRpb25zICpEcml2ZXJPcHRpb25zID0gJkJ1c0xvZ2ljX0RyaXZlck9wdGlvbnNbQnVzTG9naWNfRHJpdmVyT3B0aW9uc0NvdW50KytdOworCQlpbnQgVGFyZ2V0SUQ7CisJCW1lbXNldChEcml2ZXJPcHRpb25zLCAwLCBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX0RyaXZlck9wdGlvbnMpKTsKKwkJd2hpbGUgKCpPcHRpb25zU3RyaW5nICE9ICdcMCcgJiYgKk9wdGlvbnNTdHJpbmcgIT0gJzsnKSB7CisJCQkvKiBQcm9iaW5nIE9wdGlvbnMuICovCisJCQlpZiAoQnVzTG9naWNfUGFyc2VLZXl3b3JkKCZPcHRpb25zU3RyaW5nLCAiSU86IikpIHsKKwkJCQl1bnNpZ25lZCBsb25nIElPX0FkZHJlc3MgPSBzaW1wbGVfc3RydG91bChPcHRpb25zU3RyaW5nLCAmT3B0aW9uc1N0cmluZywgMCk7CisJCQkJQnVzTG9naWNfUHJvYmVPcHRpb25zLkxpbWl0ZWRQcm9iZUlTQSA9IHRydWU7CisJCQkJc3dpdGNoIChJT19BZGRyZXNzKSB7CisJCQkJY2FzZSAweDMzMDoKKwkJCQkJQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMzMwID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDMzNDoKKwkJCQkJQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMzM0ID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDIzMDoKKwkJCQkJQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMjMwID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDIzNDoKKwkJCQkJQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMjM0ID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDEzMDoKKwkJCQkJQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMTMwID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDEzNDoKKwkJCQkJQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMTM0ID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBJbnZhbGlkIERyaXZlciBPcHRpb25zICIgIihpbnZhbGlkIEkvTyBBZGRyZXNzIDB4JVgpXG4iLCBOVUxMLCBJT19BZGRyZXNzKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfSBlbHNlIGlmIChCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJOb1Byb2JlSVNBIikpCisJCQkJQnVzTG9naWNfUHJvYmVPcHRpb25zLk5vUHJvYmVJU0EgPSB0cnVlOworCQkJZWxzZSBpZiAoQnVzTG9naWNfUGFyc2VLZXl3b3JkKCZPcHRpb25zU3RyaW5nLCAiTm9Qcm9iZVBDSSIpKQorCQkJCUJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5Ob1Byb2JlUENJID0gdHJ1ZTsKKwkJCWVsc2UgaWYgKEJ1c0xvZ2ljX1BhcnNlS2V5d29yZCgmT3B0aW9uc1N0cmluZywgIk5vUHJvYmUiKSkKKwkJCQlCdXNMb2dpY19Qcm9iZU9wdGlvbnMuTm9Qcm9iZSA9IHRydWU7CisJCQllbHNlIGlmIChCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJOb1NvcnRQQ0kiKSkKKwkJCQlCdXNMb2dpY19Qcm9iZU9wdGlvbnMuTm9Tb3J0UENJID0gdHJ1ZTsKKwkJCWVsc2UgaWYgKEJ1c0xvZ2ljX1BhcnNlS2V5d29yZCgmT3B0aW9uc1N0cmluZywgIk11bHRpTWFzdGVyRmlyc3QiKSkKKwkJCQlCdXNMb2dpY19Qcm9iZU9wdGlvbnMuTXVsdGlNYXN0ZXJGaXJzdCA9IHRydWU7CisJCQllbHNlIGlmIChCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJGbGFzaFBvaW50Rmlyc3QiKSkKKwkJCQlCdXNMb2dpY19Qcm9iZU9wdGlvbnMuRmxhc2hQb2ludEZpcnN0ID0gdHJ1ZTsKKwkJCS8qIFRhZ2dlZCBRdWV1aW5nIE9wdGlvbnMuICovCisJCQllbHNlIGlmIChCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJRdWV1ZURlcHRoOlsiKSB8fCBCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJRRDpbIikpIHsKKwkJCQlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzOyBUYXJnZXRJRCsrKSB7CisJCQkJCXVuc2lnbmVkIHNob3J0IFF1ZXVlRGVwdGggPSBzaW1wbGVfc3RydG91bChPcHRpb25zU3RyaW5nLCAmT3B0aW9uc1N0cmluZywgMCk7CisJCQkJCWlmIChRdWV1ZURlcHRoID4gQnVzTG9naWNfTWF4VGFnZ2VkUXVldWVEZXB0aCkgeworCQkJCQkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBJbnZhbGlkIERyaXZlciBPcHRpb25zICIgIihpbnZhbGlkIFF1ZXVlIERlcHRoICVkKVxuIiwgTlVMTCwgUXVldWVEZXB0aCk7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCQlEcml2ZXJPcHRpb25zLT5RdWV1ZURlcHRoW1RhcmdldElEXSA9IFF1ZXVlRGVwdGg7CisJCQkJCWlmICgqT3B0aW9uc1N0cmluZyA9PSAnLCcpCisJCQkJCQlPcHRpb25zU3RyaW5nKys7CisJCQkJCWVsc2UgaWYgKCpPcHRpb25zU3RyaW5nID09ICddJykKKwkJCQkJCWJyZWFrOworCQkJCQllbHNlIHsKKwkJCQkJCUJ1c0xvZ2ljX0Vycm9yKCJCdXNMb2dpYzogSW52YWxpZCBEcml2ZXIgT3B0aW9ucyAiICIoJywnIG9yICddJyBleHBlY3RlZCBhdCAnJXMnKVxuIiwgTlVMTCwgT3B0aW9uc1N0cmluZyk7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoKk9wdGlvbnNTdHJpbmcgIT0gJ10nKSB7CisJCQkJCUJ1c0xvZ2ljX0Vycm9yKCJCdXNMb2dpYzogSW52YWxpZCBEcml2ZXIgT3B0aW9ucyAiICIoJ10nIGV4cGVjdGVkIGF0ICclcycpXG4iLCBOVUxMLCBPcHRpb25zU3RyaW5nKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfSBlbHNlCisJCQkJCU9wdGlvbnNTdHJpbmcrKzsKKwkJCX0gZWxzZSBpZiAoQnVzTG9naWNfUGFyc2VLZXl3b3JkKCZPcHRpb25zU3RyaW5nLCAiUXVldWVEZXB0aDoiKSB8fCBCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJRRDoiKSkgeworCQkJCXVuc2lnbmVkIHNob3J0IFF1ZXVlRGVwdGggPSBzaW1wbGVfc3RydG91bChPcHRpb25zU3RyaW5nLCAmT3B0aW9uc1N0cmluZywgMCk7CisJCQkJaWYgKFF1ZXVlRGVwdGggPT0gMCB8fCBRdWV1ZURlcHRoID4gQnVzTG9naWNfTWF4VGFnZ2VkUXVldWVEZXB0aCkgeworCQkJCQlCdXNMb2dpY19FcnJvcigiQnVzTG9naWM6IEludmFsaWQgRHJpdmVyIE9wdGlvbnMgIiAiKGludmFsaWQgUXVldWUgRGVwdGggJWQpXG4iLCBOVUxMLCBRdWV1ZURlcHRoKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCURyaXZlck9wdGlvbnMtPkNvbW1vblF1ZXVlRGVwdGggPSBRdWV1ZURlcHRoOworCQkJCWZvciAoVGFyZ2V0SUQgPSAwOyBUYXJnZXRJRCA8IEJ1c0xvZ2ljX01heFRhcmdldERldmljZXM7IFRhcmdldElEKyspCisJCQkJCURyaXZlck9wdGlvbnMtPlF1ZXVlRGVwdGhbVGFyZ2V0SURdID0gUXVldWVEZXB0aDsKKwkJCX0gZWxzZSBpZiAoQnVzTG9naWNfUGFyc2VLZXl3b3JkKCZPcHRpb25zU3RyaW5nLCAiVGFnZ2VkUXVldWluZzoiKSB8fCBCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJUUToiKSkgeworCQkJCWlmIChCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJEZWZhdWx0IikpIHsKKwkJCQkJRHJpdmVyT3B0aW9ucy0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZCA9IDB4MDAwMDsKKwkJCQkJRHJpdmVyT3B0aW9ucy0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZE1hc2sgPSAweDAwMDA7CisJCQkJfSBlbHNlIGlmIChCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJFbmFibGUiKSkgeworCQkJCQlEcml2ZXJPcHRpb25zLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkID0gMHhGRkZGOworCQkJCQlEcml2ZXJPcHRpb25zLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkTWFzayA9IDB4RkZGRjsKKwkJCQl9IGVsc2UgaWYgKEJ1c0xvZ2ljX1BhcnNlS2V5d29yZCgmT3B0aW9uc1N0cmluZywgIkRpc2FibGUiKSkgeworCQkJCQlEcml2ZXJPcHRpb25zLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkID0gMHgwMDAwOworCQkJCQlEcml2ZXJPcHRpb25zLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkTWFzayA9IDB4RkZGRjsKKwkJCQl9IGVsc2UgeworCQkJCQl1bnNpZ25lZCBzaG9ydCBUYXJnZXRCaXQ7CisJCQkJCWZvciAoVGFyZ2V0SUQgPSAwLCBUYXJnZXRCaXQgPSAxOyBUYXJnZXRJRCA8IEJ1c0xvZ2ljX01heFRhcmdldERldmljZXM7IFRhcmdldElEKyssIFRhcmdldEJpdCA8PD0gMSkKKwkJCQkJCXN3aXRjaCAoKk9wdGlvbnNTdHJpbmcrKykgeworCQkJCQkJY2FzZSAnWSc6CisJCQkJCQkJRHJpdmVyT3B0aW9ucy0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZCB8PSBUYXJnZXRCaXQ7CisJCQkJCQkJRHJpdmVyT3B0aW9ucy0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZE1hc2sgfD0gVGFyZ2V0Qml0OworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAnTic6CisJCQkJCQkJRHJpdmVyT3B0aW9ucy0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZCAmPSB+VGFyZ2V0Qml0OworCQkJCQkJCURyaXZlck9wdGlvbnMtPlRhZ2dlZFF1ZXVpbmdQZXJtaXR0ZWRNYXNrIHw9IFRhcmdldEJpdDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgJ1gnOgorCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlPcHRpb25zU3RyaW5nLS07CisJCQkJCQkJVGFyZ2V0SUQgPSBCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8qIE1pc2NlbGxhbmVvdXMgT3B0aW9ucy4gKi8KKwkJCWVsc2UgaWYgKEJ1c0xvZ2ljX1BhcnNlS2V5d29yZCgmT3B0aW9uc1N0cmluZywgIkJ1c1NldHRsZVRpbWU6IikgfHwgQnVzTG9naWNfUGFyc2VLZXl3b3JkKCZPcHRpb25zU3RyaW5nLCAiQlNUOiIpKSB7CisJCQkJdW5zaWduZWQgc2hvcnQgQnVzU2V0dGxlVGltZSA9IHNpbXBsZV9zdHJ0b3VsKE9wdGlvbnNTdHJpbmcsICZPcHRpb25zU3RyaW5nLCAwKTsKKwkJCQlpZiAoQnVzU2V0dGxlVGltZSA+IDUgKiA2MCkgeworCQkJCQlCdXNMb2dpY19FcnJvcigiQnVzTG9naWM6IEludmFsaWQgRHJpdmVyIE9wdGlvbnMgIiAiKGludmFsaWQgQnVzIFNldHRsZSBUaW1lICVkKVxuIiwgTlVMTCwgQnVzU2V0dGxlVGltZSk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlEcml2ZXJPcHRpb25zLT5CdXNTZXR0bGVUaW1lID0gQnVzU2V0dGxlVGltZTsKKwkJCX0gZWxzZSBpZiAoQnVzTG9naWNfUGFyc2VLZXl3b3JkKCZPcHRpb25zU3RyaW5nLCAiSW5oaWJpdFRhcmdldElucXVpcnkiKSkKKwkJCQlEcml2ZXJPcHRpb25zLT5Mb2NhbE9wdGlvbnMuSW5oaWJpdFRhcmdldElucXVpcnkgPSB0cnVlOworCQkJLyogRGVidWdnaW5nIE9wdGlvbnMuICovCisJCQllbHNlIGlmIChCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJUcmFjZVByb2JlIikpCisJCQkJQnVzTG9naWNfR2xvYmFsT3B0aW9ucy5UcmFjZVByb2JlID0gdHJ1ZTsKKwkJCWVsc2UgaWYgKEJ1c0xvZ2ljX1BhcnNlS2V5d29yZCgmT3B0aW9uc1N0cmluZywgIlRyYWNlSGFyZHdhcmVSZXNldCIpKQorCQkJCUJ1c0xvZ2ljX0dsb2JhbE9wdGlvbnMuVHJhY2VIYXJkd2FyZVJlc2V0ID0gdHJ1ZTsKKwkJCWVsc2UgaWYgKEJ1c0xvZ2ljX1BhcnNlS2V5d29yZCgmT3B0aW9uc1N0cmluZywgIlRyYWNlQ29uZmlndXJhdGlvbiIpKQorCQkJCUJ1c0xvZ2ljX0dsb2JhbE9wdGlvbnMuVHJhY2VDb25maWd1cmF0aW9uID0gdHJ1ZTsKKwkJCWVsc2UgaWYgKEJ1c0xvZ2ljX1BhcnNlS2V5d29yZCgmT3B0aW9uc1N0cmluZywgIlRyYWNlRXJyb3JzIikpCisJCQkJQnVzTG9naWNfR2xvYmFsT3B0aW9ucy5UcmFjZUVycm9ycyA9IHRydWU7CisJCQllbHNlIGlmIChCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJEZWJ1ZyIpKSB7CisJCQkJQnVzTG9naWNfR2xvYmFsT3B0aW9ucy5UcmFjZVByb2JlID0gdHJ1ZTsKKwkJCQlCdXNMb2dpY19HbG9iYWxPcHRpb25zLlRyYWNlSGFyZHdhcmVSZXNldCA9IHRydWU7CisJCQkJQnVzTG9naWNfR2xvYmFsT3B0aW9ucy5UcmFjZUNvbmZpZ3VyYXRpb24gPSB0cnVlOworCQkJCUJ1c0xvZ2ljX0dsb2JhbE9wdGlvbnMuVHJhY2VFcnJvcnMgPSB0cnVlOworCQkJfQorCQkJaWYgKCpPcHRpb25zU3RyaW5nID09ICcsJykKKwkJCQlPcHRpb25zU3RyaW5nKys7CisJCQllbHNlIGlmICgqT3B0aW9uc1N0cmluZyAhPSAnOycgJiYgKk9wdGlvbnNTdHJpbmcgIT0gJ1wwJykgeworCQkJCUJ1c0xvZ2ljX0Vycm9yKCJCdXNMb2dpYzogVW5leHBlY3RlZCBEcml2ZXIgT3B0aW9uICclcycgIiAiaWdub3JlZFxuIiwgTlVMTCwgT3B0aW9uc1N0cmluZyk7CisJCQkJKk9wdGlvbnNTdHJpbmcgPSAnXDAnOworCQkJfQorCQl9CisJCWlmICghKEJ1c0xvZ2ljX0RyaXZlck9wdGlvbnNDb3VudCA9PSAwIHx8IEJ1c0xvZ2ljX1Byb2JlSW5mb0NvdW50ID09IDAgfHwgQnVzTG9naWNfRHJpdmVyT3B0aW9uc0NvdW50ID09IEJ1c0xvZ2ljX1Byb2JlSW5mb0NvdW50KSkgeworCQkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBJbnZhbGlkIERyaXZlciBPcHRpb25zICIgIihhbGwgb3Igbm8gSS9PIEFkZHJlc3NlcyBtdXN0IGJlIHNwZWNpZmllZClcbiIsIE5VTEwpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyoKKwkJICAgVGFnZ2VkIFF1ZXVpbmcgaXMgZGlzYWJsZWQgd2hlbiB0aGUgUXVldWUgRGVwdGggaXMgMSBzaW5jZSBxdWV1aW5nCisJCSAgIG11bHRpcGxlIGNvbW1hbmRzIGlzIG5vdCBwb3NzaWJsZS4KKwkJICovCisJCWZvciAoVGFyZ2V0SUQgPSAwOyBUYXJnZXRJRCA8IEJ1c0xvZ2ljX01heFRhcmdldERldmljZXM7IFRhcmdldElEKyspCisJCQlpZiAoRHJpdmVyT3B0aW9ucy0+UXVldWVEZXB0aFtUYXJnZXRJRF0gPT0gMSkgeworCQkJCXVuc2lnbmVkIHNob3J0IFRhcmdldEJpdCA9IDEgPDwgVGFyZ2V0SUQ7CisJCQkJRHJpdmVyT3B0aW9ucy0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZCAmPSB+VGFyZ2V0Qml0OworCQkJCURyaXZlck9wdGlvbnMtPlRhZ2dlZFF1ZXVpbmdQZXJtaXR0ZWRNYXNrIHw9IFRhcmdldEJpdDsKKwkJCX0KKwkJaWYgKCpPcHRpb25zU3RyaW5nID09ICc7JykKKwkJCU9wdGlvbnNTdHJpbmcrKzsKKwkJaWYgKCpPcHRpb25zU3RyaW5nID09ICdcMCcpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisgIEdldCBpdCBhbGwgc3RhcnRlZAorKi8KKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgQnVzX0xvZ2ljX3RlbXBsYXRlID0geworCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkucHJvY19uYW1lID0gIkJ1c0xvZ2ljIiwKKwkucHJvY19pbmZvID0gQnVzTG9naWNfUHJvY0RpcmVjdG9yeUluZm8sCisJLm5hbWUgPSAiQnVzTG9naWMiLAorCS5pbmZvID0gQnVzTG9naWNfRHJpdmVySW5mbywKKwkucXVldWVjb21tYW5kID0gQnVzTG9naWNfUXVldWVDb21tYW5kLAorCS5zbGF2ZV9jb25maWd1cmUgPSBCdXNMb2dpY19TbGF2ZUNvbmZpZ3VyZSwKKwkuYmlvc19wYXJhbSA9IEJ1c0xvZ2ljX0JJT1NEaXNrUGFyYW1ldGVycywKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyID0gQnVzTG9naWNfaG9zdF9yZXNldCwKKyNpZiAwCisJLmVoX2Fib3J0X2hhbmRsZXIgPSBCdXNMb2dpY19BYm9ydENvbW1hbmQsCisjZW5kaWYKKwkudW5jaGVja2VkX2lzYV9kbWEgPSAxLAorCS5tYXhfc2VjdG9ycyA9IDEyOCwKKwkudXNlX2NsdXN0ZXJpbmcgPSBFTkFCTEVfQ0xVU1RFUklORywKK307CisKKy8qCisgIEJ1c0xvZ2ljX1NldHVwIGhhbmRsZXMgcHJvY2Vzc2luZyBvZiBLZXJuZWwgQ29tbWFuZCBMaW5lIEFyZ3VtZW50cy4KKyovCisKK3N0YXRpYyBpbnQgX19pbml0IEJ1c0xvZ2ljX1NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgaW50c1szXTsKKworCSh2b2lkKSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCisJaWYgKGludHNbMF0gIT0gMCkgeworCQlCdXNMb2dpY19FcnJvcigiQnVzTG9naWM6IE9ic29sZXRlIENvbW1hbmQgTGluZSBFbnRyeSAiICJGb3JtYXQgSWdub3JlZFxuIiwgTlVMTCk7CisJCXJldHVybiAwOworCX0KKwlpZiAoc3RyID09IE5VTEwgfHwgKnN0ciA9PSAnXDAnKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gQnVzTG9naWNfUGFyc2VEcml2ZXJPcHRpb25zKHN0cik7Cit9CisKKy8qCisgKiBFeGl0IGZ1bmN0aW9uLiAgRGVsZXRlcyBhbGwgaG9zdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZHJpdmVyLgorICovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBCdXNMb2dpY19leGl0KHZvaWQpCit7CisJc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpoYSwgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaGEsIG5leHQsICZCdXNMb2dpY19ob3N0X2xpc3QsIGhvc3RfbGlzdCkKKwkJQnVzTG9naWNfUmVsZWFzZUhvc3RBZGFwdGVyKGhhKTsKK30KKworX19zZXR1cCgiQnVzTG9naWM9IiwgQnVzTG9naWNfU2V0dXApOworCittb2R1bGVfaW5pdChCdXNMb2dpY19pbml0KTsKK21vZHVsZV9leGl0KEJ1c0xvZ2ljX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL0J1c0xvZ2ljLmggYi9kcml2ZXJzL3Njc2kvQnVzTG9naWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWFhNjU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL0J1c0xvZ2ljLmgKQEAgLTAsMCArMSwxMzU5IEBACisvKgorCisgIExpbnV4IERyaXZlciBmb3IgQnVzTG9naWMgTXVsdGlNYXN0ZXIgYW5kIEZsYXNoUG9pbnQgU0NTSSBIb3N0IEFkYXB0ZXJzCisKKyAgQ29weXJpZ2h0IDE5OTUtMTk5OCBieSBMZW9uYXJkIE4uIFp1YmtvZmYgPGxuekBkYW5kZWxpb24uY29tPgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGZvciBjb21wbGV0ZSBkZXRhaWxzLgorCisgIFRoZSBhdXRob3IgcmVzcGVjdGZ1bGx5IHJlcXVlc3RzIHRoYXQgYW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBzb2Z0d2FyZSBiZQorICBzZW50IGRpcmVjdGx5IHRvIGhpbSBmb3IgZXZhbHVhdGlvbiBhbmQgdGVzdGluZy4KKworICBTcGVjaWFsIHRoYW5rcyB0byBXYXluZSBZZW4sIEppbi1Mb24gSG9uLCBhbmQgQWxleCBXaW4gb2YgQnVzTG9naWMsIHdob3NlCisgIGFkdmljZSBoYXMgYmVlbiBpbnZhbHVhYmxlLCB0byBEYXZpZCBHZW50emVsLCBmb3Igd3JpdGluZyB0aGUgb3JpZ2luYWwgTGludXgKKyAgQnVzTG9naWMgZHJpdmVyLCBhbmQgdG8gUGF1bCBHb3J0bWFrZXIsIGZvciBiZWluZyBzdWNoIGEgZGVkaWNhdGVkIHRlc3Qgc2l0ZS4KKworICBGaW5hbGx5LCBzcGVjaWFsIHRoYW5rcyB0byBNeWxleC9CdXNMb2dpYyBmb3IgbWFraW5nIHRoZSBGbGFzaFBvaW50IFNDQ0IKKyAgTWFuYWdlciBhdmFpbGFibGUgYXMgZnJlZWx5IHJlZGlzdHJpYnV0YWJsZSBzb3VyY2UgY29kZS4KKworKi8KKworI2lmbmRlZiBfQlVTTE9HSUNfSAorI2RlZmluZSBfQlVTTE9HSUNfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZm5kZWYgUEFDS0VECisjZGVmaW5lIFBBQ0tFRCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorI2VuZGlmCisKKy8qCisgIEZsYXNoUG9pbnQgc3VwcG9ydCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgdGhlIEludGVsIHg4NiBBcmNoaXRlY3R1cmUgd2l0aAorICBDT05GSUdfUENJIHNldC4KKyovCisKKyNpZm5kZWYgX19pMzg2X18KKyN1bmRlZiBDT05GSUdfU0NTSV9PTUlUX0ZMQVNIUE9JTlQKKyNkZWZpbmUgQ09ORklHX1NDU0lfT01JVF9GTEFTSFBPSU5UCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfUENJCisjdW5kZWYgQ09ORklHX1NDU0lfT01JVF9GTEFTSFBPSU5UCisjZGVmaW5lIENPTkZJR19TQ1NJX09NSVRfRkxBU0hQT0lOVAorI2RlZmluZSBCdXNMb2dpY19Jbml0aWFsaXplUHJvYmVJbmZvTGlzdElTQSBCdXNMb2dpY19Jbml0aWFsaXplUHJvYmVJbmZvTGlzdAorI2VuZGlmCisKKworLyoKKyAgRGVmaW5lIHRoZSBtYXhpbXVtIG51bWJlciBvZiBCdXNMb2dpYyBIb3N0IEFkYXB0ZXJzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KKyovCisKKyNkZWZpbmUgQnVzTG9naWNfTWF4SG9zdEFkYXB0ZXJzCQkxNgorCisKKy8qCisgIERlZmluZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgVGFyZ2V0IERldmljZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLgorKi8KKworI2RlZmluZSBCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzCQkxNgorCisKKy8qCisgIERlZmluZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgU2NhdHRlci9HYXRoZXIgU2VnbWVudHMgdXNlZCBieSB0aGlzIGRyaXZlci4KKyAgRm9yIG9wdGltYWwgcGVyZm9ybWFuY2UsIGl0IGlzIGltcG9ydGFudCB0aGF0IHRoaXMgbGltaXQgYmUgYXQgbGVhc3QgYXMKKyAgbGFyZ2UgYXMgdGhlIGxhcmdlc3Qgc2luZ2xlIHJlcXVlc3QgZ2VuZXJhdGVkIGJ5IHRoZSBJL08gU3Vic3lzdGVtLgorKi8KKworI2RlZmluZSBCdXNMb2dpY19TY2F0dGVyR2F0aGVyTGltaXQJCTEyOAorCisKKy8qCisgIERlZmluZSB0aGUgbWF4aW11bSwgbWF4aW11bSBhdXRvbWF0aWMsIG1pbmltdW0gYXV0b21hdGljLCBhbmQgZGVmYXVsdCBRdWV1ZQorICBEZXB0aCB0byBhbGxvdyBmb3IgVGFyZ2V0IERldmljZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IHRoZXkgc3VwcG9ydAorICBUYWdnZWQgUXVldWluZyBhbmQgd2hldGhlciBvciBub3QgSVNBIEJvdW5jZSBCdWZmZXJzIGFyZSByZXF1aXJlZC4KKyovCisKKyNkZWZpbmUgQnVzTG9naWNfTWF4VGFnZ2VkUXVldWVEZXB0aAkJNjQKKyNkZWZpbmUgQnVzTG9naWNfTWF4QXV0b21hdGljVGFnZ2VkUXVldWVEZXB0aAkyOAorI2RlZmluZSBCdXNMb2dpY19NaW5BdXRvbWF0aWNUYWdnZWRRdWV1ZURlcHRoCTcKKyNkZWZpbmUgQnVzTG9naWNfVGFnZ2VkUXVldWVEZXB0aEJCCQkzCisjZGVmaW5lIEJ1c0xvZ2ljX1VudGFnZ2VkUXVldWVEZXB0aAkJMworI2RlZmluZSBCdXNMb2dpY19VbnRhZ2dlZFF1ZXVlRGVwdGhCQgkJMgorCisKKy8qCisgIERlZmluZSB0aGUgZGVmYXVsdCBhbW91bnQgb2YgdGltZSBpbiBzZWNvbmRzIHRvIHdhaXQgYmV0d2VlbiBhIEhvc3QgQWRhcHRlcgorICBIYXJkIFJlc2V0IHdoaWNoIGluaXRpYXRlcyBhIFNDU0kgQnVzIFJlc2V0IGFuZCBpc3N1aW5nIGFueSBTQ1NJIGNvbW1hbmRzLgorICBTb21lIFNDU0kgZGV2aWNlcyBnZXQgY29uZnVzZWQgaWYgdGhleSByZWNlaXZlIFNDU0kgY29tbWFuZHMgdG9vIHNvb24gYWZ0ZXIKKyAgYSBTQ1NJIEJ1cyBSZXNldC4KKyovCisKKyNkZWZpbmUgQnVzTG9naWNfRGVmYXVsdEJ1c1NldHRsZVRpbWUJCTIKKworCisvKgorICBEZWZpbmUgdGhlIG1heGltdW0gbnVtYmVyIG9mIE1haWxib3hlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBNdWx0aU1hc3RlcgorICBIb3N0IEFkYXB0ZXJzLiAgVGhpcyBudW1iZXIgaXMgY2hvc2VuIHRvIGJlIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIEhvc3QKKyAgQWRhcHRlciBRdWV1ZSBEZXB0aCBhbmQgc21hbGwgZW5vdWdoIHNvIHRoYXQgdGhlIEhvc3QgQWRhcHRlciBzdHJ1Y3R1cmUKKyAgZG9lcyBub3QgY3Jvc3MgYW4gYWxsb2NhdGlvbiBibG9jayBzaXplIGJvdW5kYXJ5LgorKi8KKworI2RlZmluZSBCdXNMb2dpY19NYXhNYWlsYm94ZXMJCQkyMTEKKworCisvKgorICBEZWZpbmUgdGhlIG51bWJlciBvZiBDQ0JzIHRoYXQgc2hvdWxkIGJlIGFsbG9jYXRlZCBhcyBhIGdyb3VwIHRvIG9wdGltaXplCisgIEtlcm5lbCBtZW1vcnkgYWxsb2NhdGlvbi4KKyovCisKKyNkZWZpbmUgQnVzTG9naWNfQ0NCX0FsbG9jYXRpb25Hcm91cFNpemUJNworCisKKy8qCisgIERlZmluZSB0aGUgSG9zdCBBZGFwdGVyIExpbmUgYW5kIE1lc3NhZ2UgQnVmZmVyIFNpemVzLgorKi8KKworI2RlZmluZSBCdXNMb2dpY19MaW5lQnVmZmVyU2l6ZQkJCTEwMAorI2RlZmluZSBCdXNMb2dpY19NZXNzYWdlQnVmZmVyU2l6ZQkJOTcwMAorCisKKy8qCisgIERlZmluZSB0aGUgRHJpdmVyIE1lc3NhZ2UgTGV2ZWxzLgorKi8KKworZW51bSBCdXNMb2dpY19NZXNzYWdlTGV2ZWwgeworCUJ1c0xvZ2ljX0Fubm91bmNlTGV2ZWwgPSAwLAorCUJ1c0xvZ2ljX0luZm9MZXZlbCA9IDEsCisJQnVzTG9naWNfTm90aWNlTGV2ZWwgPSAyLAorCUJ1c0xvZ2ljX1dhcm5pbmdMZXZlbCA9IDMsCisJQnVzTG9naWNfRXJyb3JMZXZlbCA9IDQKK307CisKK3N0YXRpYyBjaGFyICpCdXNMb2dpY19NZXNzYWdlTGV2ZWxNYXBbXSA9IHsgS0VSTl9OT1RJQ0UsIEtFUk5fTk9USUNFLCBLRVJOX05PVElDRSwgS0VSTl9XQVJOSU5HLCBLRVJOX0VSUiB9OworCisKKy8qCisgIERlZmluZSBEcml2ZXIgTWVzc2FnZSBtYWNyb3MuCisqLworCisjZGVmaW5lIEJ1c0xvZ2ljX0Fubm91bmNlKEZvcm1hdCwgQXJndW1lbnRzLi4uKSBcCisgIEJ1c0xvZ2ljX01lc3NhZ2UoQnVzTG9naWNfQW5ub3VuY2VMZXZlbCwgRm9ybWF0LCAjI0FyZ3VtZW50cykKKworI2RlZmluZSBCdXNMb2dpY19JbmZvKEZvcm1hdCwgQXJndW1lbnRzLi4uKSBcCisgIEJ1c0xvZ2ljX01lc3NhZ2UoQnVzTG9naWNfSW5mb0xldmVsLCBGb3JtYXQsICMjQXJndW1lbnRzKQorCisjZGVmaW5lIEJ1c0xvZ2ljX05vdGljZShGb3JtYXQsIEFyZ3VtZW50cy4uLikgXAorICBCdXNMb2dpY19NZXNzYWdlKEJ1c0xvZ2ljX05vdGljZUxldmVsLCBGb3JtYXQsICMjQXJndW1lbnRzKQorCisjZGVmaW5lIEJ1c0xvZ2ljX1dhcm5pbmcoRm9ybWF0LCBBcmd1bWVudHMuLi4pIFwKKyAgQnVzTG9naWNfTWVzc2FnZShCdXNMb2dpY19XYXJuaW5nTGV2ZWwsIEZvcm1hdCwgIyNBcmd1bWVudHMpCisKKyNkZWZpbmUgQnVzTG9naWNfRXJyb3IoRm9ybWF0LCBBcmd1bWVudHMuLi4pIFwKKyAgQnVzTG9naWNfTWVzc2FnZShCdXNMb2dpY19FcnJvckxldmVsLCBGb3JtYXQsICMjQXJndW1lbnRzKQorCisKKy8qCisgIERlZmluZSB0aGUgdHlwZXMgb2YgQnVzTG9naWMgSG9zdCBBZGFwdGVycyB0aGF0IGFyZSBzdXBwb3J0ZWQgYW5kIHRoZSBudW1iZXIKKyAgb2YgSS9PIEFkZHJlc3NlcyByZXF1aXJlZCBieSBlYWNoIHR5cGUuCisqLworCitlbnVtIEJ1c0xvZ2ljX0hvc3RBZGFwdGVyVHlwZSB7CisJQnVzTG9naWNfTXVsdGlNYXN0ZXIgPSAxLAorCUJ1c0xvZ2ljX0ZsYXNoUG9pbnQgPSAyCit9IFBBQ0tFRDsKKworI2RlZmluZSBCdXNMb2dpY19NdWx0aU1hc3RlckFkZHJlc3NDb3VudAk0CisjZGVmaW5lIEJ1c0xvZ2ljX0ZsYXNoUG9pbnRBZGRyZXNzQ291bnQJCTI1NgorCitzdGF0aWMgaW50IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyQWRkcmVzc0NvdW50WzNdID0geyAwLCBCdXNMb2dpY19NdWx0aU1hc3RlckFkZHJlc3NDb3VudCwgQnVzTG9naWNfRmxhc2hQb2ludEFkZHJlc3NDb3VudCB9OworCisKKy8qCisgIERlZmluZSBtYWNyb3MgZm9yIHRlc3RpbmcgdGhlIEhvc3QgQWRhcHRlciBUeXBlLgorKi8KKworI2lmbmRlZiBDT05GSUdfU0NTSV9PTUlUX0ZMQVNIUE9JTlQKKworI2RlZmluZSBCdXNMb2dpY19NdWx0aU1hc3Rlckhvc3RBZGFwdGVyUChIb3N0QWRhcHRlcikgXAorICAoSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyVHlwZSA9PSBCdXNMb2dpY19NdWx0aU1hc3RlcikKKworI2RlZmluZSBCdXNMb2dpY19GbGFzaFBvaW50SG9zdEFkYXB0ZXJQKEhvc3RBZGFwdGVyKSBcCisgIChIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJUeXBlID09IEJ1c0xvZ2ljX0ZsYXNoUG9pbnQpCisKKyNlbHNlCisKKyNkZWZpbmUgQnVzTG9naWNfTXVsdGlNYXN0ZXJIb3N0QWRhcHRlclAoSG9zdEFkYXB0ZXIpIFwKKyAgKHRydWUpCisKKyNkZWZpbmUgQnVzTG9naWNfRmxhc2hQb2ludEhvc3RBZGFwdGVyUChIb3N0QWRhcHRlcikgXAorICAoZmFsc2UpCisKKyNlbmRpZgorCisKKy8qCisgIERlZmluZSB0aGUgcG9zc2libGUgSG9zdCBBZGFwdGVyIEJ1cyBUeXBlcy4KKyovCisKK2VudW0gQnVzTG9naWNfSG9zdEFkYXB0ZXJCdXNUeXBlIHsKKwlCdXNMb2dpY19Vbmtub3duX0J1cyA9IDAsCisJQnVzTG9naWNfSVNBX0J1cyA9IDEsCisJQnVzTG9naWNfRUlTQV9CdXMgPSAyLAorCUJ1c0xvZ2ljX1BDSV9CdXMgPSAzLAorCUJ1c0xvZ2ljX1ZFU0FfQnVzID0gNCwKKwlCdXNMb2dpY19NQ0FfQnVzID0gNQorfSBQQUNLRUQ7CisKK3N0YXRpYyBjaGFyICpCdXNMb2dpY19Ib3N0QWRhcHRlckJ1c05hbWVzW10gPSB7ICJVbmtub3duIiwgIklTQSIsICJFSVNBIiwgIlBDSSIsICJWRVNBIiwgIk1DQSIgfTsKKworc3RhdGljIGVudW0gQnVzTG9naWNfSG9zdEFkYXB0ZXJCdXNUeXBlIEJ1c0xvZ2ljX0hvc3RBZGFwdGVyQnVzVHlwZXNbXSA9IHsKKwlCdXNMb2dpY19WRVNBX0J1cywJLyogQlQtNHh4ICovCisJQnVzTG9naWNfSVNBX0J1cywJLyogQlQtNXh4ICovCisJQnVzTG9naWNfTUNBX0J1cywJLyogQlQtNnh4ICovCisJQnVzTG9naWNfRUlTQV9CdXMsCS8qIEJULTd4eCAqLworCUJ1c0xvZ2ljX1Vua25vd25fQnVzLAkvKiBCVC04eHggKi8KKwlCdXNMb2dpY19QQ0lfQnVzCS8qIEJULTl4eCAqLworfTsKKworLyoKKyAgRGVmaW5lIHRoZSBwb3NzaWJsZSBIb3N0IEFkYXB0ZXIgQklPUyBEaXNrIEdlb21ldHJ5IFRyYW5zbGF0aW9ucy4KKyovCisKK2VudW0gQnVzTG9naWNfQklPU19EaXNrR2VvbWV0cnlUcmFuc2xhdGlvbiB7CisJQnVzTG9naWNfQklPU19EaXNrX05vdF9JbnN0YWxsZWQgPSAwLAorCUJ1c0xvZ2ljX0JJT1NfRGlza19JbnN0YWxsZWRfNjR4MzIgPSAxLAorCUJ1c0xvZ2ljX0JJT1NfRGlza19JbnN0YWxsZWRfMTI4eDMyID0gMiwKKwlCdXNMb2dpY19CSU9TX0Rpc2tfSW5zdGFsbGVkXzI1NXg2MyA9IDMKK30gUEFDS0VEOworCisKKy8qCisgIERlZmluZSBhIEJvb2xlYW4gZGF0YSB0eXBlLgorKi8KKwordHlwZWRlZiBlbnVtIHsKKwlmYWxzZSwKKwl0cnVlCit9IFBBQ0tFRCBib29sZWFuOworCisvKgorICBEZWZpbmUgYSAxMF4xOCBTdGF0aXN0aWNzIEJ5dGUgQ291bnRlciBkYXRhIHR5cGUuCisqLworCitzdHJ1Y3QgQnVzTG9naWNfQnl0ZUNvdW50ZXIgeworCXVuc2lnbmVkIGludCBVbml0czsKKwl1bnNpZ25lZCBpbnQgQmlsbGlvbnM7Cit9OworCisKKy8qCisgIERlZmluZSB0aGUgc3RydWN0dXJlIGZvciBJL08gQWRkcmVzcyBhbmQgQnVzIFByb2JpbmcgSW5mb3JtYXRpb24uCisqLworCitzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvIHsKKwllbnVtIEJ1c0xvZ2ljX0hvc3RBZGFwdGVyVHlwZSBIb3N0QWRhcHRlclR5cGU7CisJZW51bSBCdXNMb2dpY19Ib3N0QWRhcHRlckJ1c1R5cGUgSG9zdEFkYXB0ZXJCdXNUeXBlOworCXVuc2lnbmVkIGxvbmcgSU9fQWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIFBDSV9BZGRyZXNzOworCXN0cnVjdCBwY2lfZGV2ICpQQ0lfRGV2aWNlOworCXVuc2lnbmVkIGNoYXIgQnVzOworCXVuc2lnbmVkIGNoYXIgRGV2aWNlOworCXVuc2lnbmVkIGNoYXIgSVJRX0NoYW5uZWw7Cit9OworCisvKgorICBEZWZpbmUgdGhlIFByb2JlIE9wdGlvbnMuCisqLworCitzdHJ1Y3QgQnVzTG9naWNfUHJvYmVPcHRpb25zIHsKKwlib29sZWFuIE5vUHJvYmU6MTsJLyogQml0IDAgKi8KKwlib29sZWFuIE5vUHJvYmVJU0E6MTsJLyogQml0IDEgKi8KKwlib29sZWFuIE5vUHJvYmVQQ0k6MTsJLyogQml0IDIgKi8KKwlib29sZWFuIE5vU29ydFBDSToxOwkvKiBCaXQgMyAqLworCWJvb2xlYW4gTXVsdGlNYXN0ZXJGaXJzdDoxOwkvKiBCaXQgNCAqLworCWJvb2xlYW4gRmxhc2hQb2ludEZpcnN0OjE7CS8qIEJpdCA1ICovCisJYm9vbGVhbiBMaW1pdGVkUHJvYmVJU0E6MTsJLyogQml0IDYgKi8KKwlib29sZWFuIFByb2JlMzMwOjE7CS8qIEJpdCA3ICovCisJYm9vbGVhbiBQcm9iZTMzNDoxOwkvKiBCaXQgOCAqLworCWJvb2xlYW4gUHJvYmUyMzA6MTsJLyogQml0IDkgKi8KKwlib29sZWFuIFByb2JlMjM0OjE7CS8qIEJpdCAxMCAqLworCWJvb2xlYW4gUHJvYmUxMzA6MTsJLyogQml0IDExICovCisJYm9vbGVhbiBQcm9iZTEzNDoxOwkvKiBCaXQgMTIgKi8KK307CisKKy8qCisgIERlZmluZSB0aGUgR2xvYmFsIE9wdGlvbnMuCisqLworCitzdHJ1Y3QgQnVzTG9naWNfR2xvYmFsT3B0aW9ucyB7CisJYm9vbGVhbiBUcmFjZVByb2JlOjE7CS8qIEJpdCAwICovCisJYm9vbGVhbiBUcmFjZUhhcmR3YXJlUmVzZXQ6MTsJLyogQml0IDEgKi8KKwlib29sZWFuIFRyYWNlQ29uZmlndXJhdGlvbjoxOwkvKiBCaXQgMiAqLworCWJvb2xlYW4gVHJhY2VFcnJvcnM6MTsJLyogQml0IDMgKi8KK307CisKKy8qCisgIERlZmluZSB0aGUgTG9jYWwgT3B0aW9ucy4KKyovCisKK3N0cnVjdCBCdXNMb2dpY19Mb2NhbE9wdGlvbnMgeworCWJvb2xlYW4gSW5oaWJpdFRhcmdldElucXVpcnk6MTsJLyogQml0IDAgKi8KK307CisKKy8qCisgIERlZmluZSB0aGUgQnVzTG9naWMgU0NTSSBIb3N0IEFkYXB0ZXIgSS9PIFJlZ2lzdGVyIE9mZnNldHMuCisqLworCisjZGVmaW5lIEJ1c0xvZ2ljX0NvbnRyb2xSZWdpc3Rlck9mZnNldAkJMAkvKiBXTyByZWdpc3RlciAqLworI2RlZmluZSBCdXNMb2dpY19TdGF0dXNSZWdpc3Rlck9mZnNldAkJMAkvKiBSTyByZWdpc3RlciAqLworI2RlZmluZSBCdXNMb2dpY19Db21tYW5kUGFyYW1ldGVyUmVnaXN0ZXJPZmZzZXQJMQkvKiBXTyByZWdpc3RlciAqLworI2RlZmluZSBCdXNMb2dpY19EYXRhSW5SZWdpc3Rlck9mZnNldAkJMQkvKiBSTyByZWdpc3RlciAqLworI2RlZmluZSBCdXNMb2dpY19JbnRlcnJ1cHRSZWdpc3Rlck9mZnNldAkyCS8qIFJPIHJlZ2lzdGVyICovCisjZGVmaW5lIEJ1c0xvZ2ljX0dlb21ldHJ5UmVnaXN0ZXJPZmZzZXQJCTMJLyogUk8gcmVnaXN0ZXIgKi8KKworLyoKKyAgRGVmaW5lIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHdyaXRlLW9ubHkgQ29udHJvbCBSZWdpc3Rlci4KKyovCisKK3VuaW9uIEJ1c0xvZ2ljX0NvbnRyb2xSZWdpc3RlciB7CisJdW5zaWduZWQgY2hhciBBbGw7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhcjo0OwkvKiBCaXRzIDAtMyAqLworCQlib29sZWFuIFNDU0lCdXNSZXNldDoxOwkvKiBCaXQgNCAqLworCQlib29sZWFuIEludGVycnVwdFJlc2V0OjE7CS8qIEJpdCA1ICovCisJCWJvb2xlYW4gU29mdFJlc2V0OjE7CS8qIEJpdCA2ICovCisJCWJvb2xlYW4gSGFyZFJlc2V0OjE7CS8qIEJpdCA3ICovCisJfSBjcjsKK307CisKKy8qCisgIERlZmluZSB0aGUgc3RydWN0dXJlIG9mIHRoZSByZWFkLW9ubHkgU3RhdHVzIFJlZ2lzdGVyLgorKi8KKwordW5pb24gQnVzTG9naWNfU3RhdHVzUmVnaXN0ZXIgeworCXVuc2lnbmVkIGNoYXIgQWxsOworCXN0cnVjdCB7CisJCWJvb2xlYW4gQ29tbWFuZEludmFsaWQ6MTsJLyogQml0IDAgKi8KKwkJYm9vbGVhbiBSZXNlcnZlZDoxOwkvKiBCaXQgMSAqLworCQlib29sZWFuIERhdGFJblJlZ2lzdGVyUmVhZHk6MTsJLyogQml0IDIgKi8KKwkJYm9vbGVhbiBDb21tYW5kUGFyYW1ldGVyUmVnaXN0ZXJCdXN5OjE7CS8qIEJpdCAzICovCisJCWJvb2xlYW4gSG9zdEFkYXB0ZXJSZWFkeToxOwkvKiBCaXQgNCAqLworCQlib29sZWFuIEluaXRpYWxpemF0aW9uUmVxdWlyZWQ6MTsJLyogQml0IDUgKi8KKwkJYm9vbGVhbiBEaWFnbm9zdGljRmFpbHVyZToxOwkvKiBCaXQgNiAqLworCQlib29sZWFuIERpYWdub3N0aWNBY3RpdmU6MTsJLyogQml0IDcgKi8KKwl9IHNyOworfTsKKworLyoKKyAgRGVmaW5lIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHJlYWQtb25seSBJbnRlcnJ1cHQgUmVnaXN0ZXIuCisqLworCit1bmlvbiBCdXNMb2dpY19JbnRlcnJ1cHRSZWdpc3RlciB7CisJdW5zaWduZWQgY2hhciBBbGw7CisJc3RydWN0IHsKKwkJYm9vbGVhbiBJbmNvbWluZ01haWxib3hMb2FkZWQ6MTsJLyogQml0IDAgKi8KKwkJYm9vbGVhbiBPdXRnb2luZ01haWxib3hBdmFpbGFibGU6MTsJLyogQml0IDEgKi8KKwkJYm9vbGVhbiBDb21tYW5kQ29tcGxldGU6MTsJLyogQml0IDIgKi8KKwkJYm9vbGVhbiBFeHRlcm5hbEJ1c1Jlc2V0OjE7CS8qIEJpdCAzICovCisJCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ6MzsJLyogQml0cyA0LTYgKi8KKwkJYm9vbGVhbiBJbnRlcnJ1cHRWYWxpZDoxOwkvKiBCaXQgNyAqLworCX0gaXI7Cit9OworCisvKgorICBEZWZpbmUgdGhlIHN0cnVjdHVyZSBvZiB0aGUgcmVhZC1vbmx5IEdlb21ldHJ5IFJlZ2lzdGVyLgorKi8KKwordW5pb24gQnVzTG9naWNfR2VvbWV0cnlSZWdpc3RlciB7CisJdW5zaWduZWQgY2hhciBBbGw7CisJc3RydWN0IHsKKwkJZW51bSBCdXNMb2dpY19CSU9TX0Rpc2tHZW9tZXRyeVRyYW5zbGF0aW9uIERyaXZlMEdlb21ldHJ5OjI7CS8qIEJpdHMgMC0xICovCisJCWVudW0gQnVzTG9naWNfQklPU19EaXNrR2VvbWV0cnlUcmFuc2xhdGlvbiBEcml2ZTFHZW9tZXRyeToyOwkvKiBCaXRzIDItMyAqLworCQl1bnNpZ25lZCBjaGFyOjM7CS8qIEJpdHMgNC02ICovCisJCWJvb2xlYW4gRXh0ZW5kZWRUcmFuc2xhdGlvbkVuYWJsZWQ6MTsJLyogQml0IDcgKi8KKwl9IGdyOworfTsKKworLyoKKyAgRGVmaW5lIHRoZSBCdXNMb2dpYyBTQ1NJIEhvc3QgQWRhcHRlciBDb21tYW5kIFJlZ2lzdGVyIE9wZXJhdGlvbiBDb2Rlcy4KKyovCisKK2VudW0gQnVzTG9naWNfT3BlcmF0aW9uQ29kZSB7CisJQnVzTG9naWNfVGVzdENvbW1hbmRDb21wbGV0ZUludGVycnVwdCA9IDB4MDAsCisJQnVzTG9naWNfSW5pdGlhbGl6ZU1haWxib3ggPSAweDAxLAorCUJ1c0xvZ2ljX0V4ZWN1dGVNYWlsYm94Q29tbWFuZCA9IDB4MDIsCisJQnVzTG9naWNfRXhlY3V0ZUJJT1NDb21tYW5kID0gMHgwMywKKwlCdXNMb2dpY19JbnF1aXJlQm9hcmRJRCA9IDB4MDQsCisJQnVzTG9naWNfRW5hYmxlT3V0Z29pbmdNYWlsYm94QXZhaWxhYmxlSW50ID0gMHgwNSwKKwlCdXNMb2dpY19TZXRTQ1NJU2VsZWN0aW9uVGltZW91dCA9IDB4MDYsCisJQnVzTG9naWNfU2V0UHJlZW1wdFRpbWVPbkJ1cyA9IDB4MDcsCisJQnVzTG9naWNfU2V0VGltZU9mZkJ1cyA9IDB4MDgsCisJQnVzTG9naWNfU2V0QnVzVHJhbnNmZXJSYXRlID0gMHgwOSwKKwlCdXNMb2dpY19JbnF1aXJlSW5zdGFsbGVkRGV2aWNlc0lEMHRvNyA9IDB4MEEsCisJQnVzTG9naWNfSW5xdWlyZUNvbmZpZ3VyYXRpb24gPSAweDBCLAorCUJ1c0xvZ2ljX0VuYWJsZVRhcmdldE1vZGUgPSAweDBDLAorCUJ1c0xvZ2ljX0lucXVpcmVTZXR1cEluZm9ybWF0aW9uID0gMHgwRCwKKwlCdXNMb2dpY19Xcml0ZUFkYXB0ZXJMb2NhbFJBTSA9IDB4MUEsCisJQnVzTG9naWNfUmVhZEFkYXB0ZXJMb2NhbFJBTSA9IDB4MUIsCisJQnVzTG9naWNfV3JpdGVCdXNNYXN0ZXJDaGlwRklGTyA9IDB4MUMsCisJQnVzTG9naWNfUmVhZEJ1c01hc3RlckNoaXBGSUZPID0gMHgxRCwKKwlCdXNMb2dpY19FY2hvQ29tbWFuZERhdGEgPSAweDFGLAorCUJ1c0xvZ2ljX0hvc3RBZGFwdGVyRGlhZ25vc3RpYyA9IDB4MjAsCisJQnVzTG9naWNfU2V0QWRhcHRlck9wdGlvbnMgPSAweDIxLAorCUJ1c0xvZ2ljX0lucXVpcmVJbnN0YWxsZWREZXZpY2VzSUQ4dG8xNSA9IDB4MjMsCisJQnVzTG9naWNfSW5xdWlyZVRhcmdldERldmljZXMgPSAweDI0LAorCUJ1c0xvZ2ljX0Rpc2FibGVIb3N0QWRhcHRlckludGVycnVwdCA9IDB4MjUsCisJQnVzTG9naWNfSW5pdGlhbGl6ZUV4dGVuZGVkTWFpbGJveCA9IDB4ODEsCisJQnVzTG9naWNfRXhlY3V0ZVNDU0lDb21tYW5kID0gMHg4MywKKwlCdXNMb2dpY19JbnF1aXJlRmlybXdhcmVWZXJzaW9uM3JkRGlnaXQgPSAweDg0LAorCUJ1c0xvZ2ljX0lucXVpcmVGaXJtd2FyZVZlcnNpb25MZXR0ZXIgPSAweDg1LAorCUJ1c0xvZ2ljX0lucXVpcmVQQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uID0gMHg4NiwKKwlCdXNMb2dpY19JbnF1aXJlSG9zdEFkYXB0ZXJNb2RlbE51bWJlciA9IDB4OEIsCisJQnVzTG9naWNfSW5xdWlyZVN5bmNocm9ub3VzUGVyaW9kID0gMHg4QywKKwlCdXNMb2dpY19JbnF1aXJlRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uID0gMHg4RCwKKwlCdXNMb2dpY19FbmFibGVTdHJpY3RSb3VuZFJvYmluTW9kZSA9IDB4OEYsCisJQnVzTG9naWNfU3RvcmVIb3N0QWRhcHRlckxvY2FsUkFNID0gMHg5MCwKKwlCdXNMb2dpY19GZXRjaEhvc3RBZGFwdGVyTG9jYWxSQU0gPSAweDkxLAorCUJ1c0xvZ2ljX1N0b3JlTG9jYWxEYXRhSW5FRVBST00gPSAweDkyLAorCUJ1c0xvZ2ljX1VwbG9hZEF1dG9TQ1NJQ29kZSA9IDB4OTQsCisJQnVzTG9naWNfTW9kaWZ5SU9BZGRyZXNzID0gMHg5NSwKKwlCdXNMb2dpY19TZXRDQ0JGb3JtYXQgPSAweDk2LAorCUJ1c0xvZ2ljX1dyaXRlSW5xdWlyeUJ1ZmZlciA9IDB4OUEsCisJQnVzTG9naWNfUmVhZElucXVpcnlCdWZmZXIgPSAweDlCLAorCUJ1c0xvZ2ljX0ZsYXNoUk9NVXBsb2FkRG93bmxvYWQgPSAweEE3LAorCUJ1c0xvZ2ljX1JlYWRTQ0FNRGF0YSA9IDB4QTgsCisJQnVzTG9naWNfV3JpdGVTQ0FNRGF0YSA9IDB4QTkKK307CisKKy8qCisgIERlZmluZSB0aGUgSW5xdWlyZSBCb2FyZCBJRCByZXBseSBzdHJ1Y3R1cmUuCisqLworCitzdHJ1Y3QgQnVzTG9naWNfQm9hcmRJRCB7CisJdW5zaWduZWQgY2hhciBCb2FyZFR5cGU7CS8qIEJ5dGUgMCAqLworCXVuc2lnbmVkIGNoYXIgQ3VzdG9tRmVhdHVyZXM7CS8qIEJ5dGUgMSAqLworCXVuc2lnbmVkIGNoYXIgRmlybXdhcmVWZXJzaW9uMXN0RGlnaXQ7CS8qIEJ5dGUgMiAqLworCXVuc2lnbmVkIGNoYXIgRmlybXdhcmVWZXJzaW9uMm5kRGlnaXQ7CS8qIEJ5dGUgMyAqLworfTsKKworLyoKKyAgRGVmaW5lIHRoZSBJbnF1aXJlIENvbmZpZ3VyYXRpb24gcmVwbHkgc3RydWN0dXJlLgorKi8KKworc3RydWN0IEJ1c0xvZ2ljX0NvbmZpZ3VyYXRpb24geworCXVuc2lnbmVkIGNoYXI6NTsJLyogQnl0ZSAwIEJpdHMgMC00ICovCisJYm9vbGVhbiBETUFfQ2hhbm5lbDU6MTsJLyogQnl0ZSAwIEJpdCA1ICovCisJYm9vbGVhbiBETUFfQ2hhbm5lbDY6MTsJLyogQnl0ZSAwIEJpdCA2ICovCisJYm9vbGVhbiBETUFfQ2hhbm5lbDc6MTsJLyogQnl0ZSAwIEJpdCA3ICovCisJYm9vbGVhbiBJUlFfQ2hhbm5lbDk6MTsJLyogQnl0ZSAxIEJpdCAwICovCisJYm9vbGVhbiBJUlFfQ2hhbm5lbDEwOjE7CS8qIEJ5dGUgMSBCaXQgMSAqLworCWJvb2xlYW4gSVJRX0NoYW5uZWwxMToxOwkvKiBCeXRlIDEgQml0IDIgKi8KKwlib29sZWFuIElSUV9DaGFubmVsMTI6MTsJLyogQnl0ZSAxIEJpdCAzICovCisJdW5zaWduZWQgY2hhcjoxOwkvKiBCeXRlIDEgQml0IDQgKi8KKwlib29sZWFuIElSUV9DaGFubmVsMTQ6MTsJLyogQnl0ZSAxIEJpdCA1ICovCisJYm9vbGVhbiBJUlFfQ2hhbm5lbDE1OjE7CS8qIEJ5dGUgMSBCaXQgNiAqLworCXVuc2lnbmVkIGNoYXI6MTsJLyogQnl0ZSAxIEJpdCA3ICovCisJdW5zaWduZWQgY2hhciBIb3N0QWRhcHRlcklEOjQ7CS8qIEJ5dGUgMiBCaXRzIDAtMyAqLworCXVuc2lnbmVkIGNoYXI6NDsJLyogQnl0ZSAyIEJpdHMgNC03ICovCit9OworCisvKgorICBEZWZpbmUgdGhlIElucXVpcmUgU2V0dXAgSW5mb3JtYXRpb24gcmVwbHkgc3RydWN0dXJlLgorKi8KKworc3RydWN0IEJ1c0xvZ2ljX1N5bmNocm9ub3VzVmFsdWUgeworCXVuc2lnbmVkIGNoYXIgT2Zmc2V0OjQ7CS8qIEJpdHMgMC0zICovCisJdW5zaWduZWQgY2hhciBUcmFuc2ZlclBlcmlvZDozOwkvKiBCaXRzIDQtNiAqLworCWJvb2xlYW4gU3luY2hyb25vdXM6MTsJLyogQml0IDcgKi8KK307CisKK3N0cnVjdCBCdXNMb2dpY19TZXR1cEluZm9ybWF0aW9uIHsKKwlib29sZWFuIFN5bmNocm9ub3VzSW5pdGlhdGlvbkVuYWJsZWQ6MTsJLyogQnl0ZSAwIEJpdCAwICovCisJYm9vbGVhbiBQYXJpdHlDaGVja2luZ0VuYWJsZWQ6MTsJLyogQnl0ZSAwIEJpdCAxICovCisJdW5zaWduZWQgY2hhcjo2OwkvKiBCeXRlIDAgQml0cyAyLTcgKi8KKwl1bnNpZ25lZCBjaGFyIEJ1c1RyYW5zZmVyUmF0ZTsJLyogQnl0ZSAxICovCisJdW5zaWduZWQgY2hhciBQcmVlbXB0VGltZU9uQnVzOwkvKiBCeXRlIDIgKi8KKwl1bnNpZ25lZCBjaGFyIFRpbWVPZmZCdXM7CS8qIEJ5dGUgMyAqLworCXVuc2lnbmVkIGNoYXIgTWFpbGJveENvdW50OwkvKiBCeXRlIDQgKi8KKwl1bnNpZ25lZCBjaGFyIE1haWxib3hBZGRyZXNzWzNdOwkvKiBCeXRlcyA1LTcgKi8KKwlzdHJ1Y3QgQnVzTG9naWNfU3luY2hyb25vdXNWYWx1ZSBTeW5jaHJvbm91c1ZhbHVlc0lEMHRvN1s4XTsJLyogQnl0ZXMgOC0xNSAqLworCXVuc2lnbmVkIGNoYXIgRGlzY29ubmVjdFBlcm1pdHRlZElEMHRvNzsJLyogQnl0ZSAxNiAqLworCXVuc2lnbmVkIGNoYXIgU2lnbmF0dXJlOwkvKiBCeXRlIDE3ICovCisJdW5zaWduZWQgY2hhciBDaGFyYWN0ZXJEOwkvKiBCeXRlIDE4ICovCisJdW5zaWduZWQgY2hhciBIb3N0QnVzVHlwZTsJLyogQnl0ZSAxOSAqLworCXVuc2lnbmVkIGNoYXIgV2lkZVRyYW5zZmVyc1Blcm1pdHRlZElEMHRvNzsJLyogQnl0ZSAyMCAqLworCXVuc2lnbmVkIGNoYXIgV2lkZVRyYW5zZmVyc0FjdGl2ZUlEMHRvNzsJLyogQnl0ZSAyMSAqLworCXN0cnVjdCBCdXNMb2dpY19TeW5jaHJvbm91c1ZhbHVlIFN5bmNocm9ub3VzVmFsdWVzSUQ4dG8xNVs4XTsJLyogQnl0ZXMgMjItMjkgKi8KKwl1bnNpZ25lZCBjaGFyIERpc2Nvbm5lY3RQZXJtaXR0ZWRJRDh0bzE1OwkvKiBCeXRlIDMwICovCisJdW5zaWduZWQgY2hhcjo4OwkvKiBCeXRlIDMxICovCisJdW5zaWduZWQgY2hhciBXaWRlVHJhbnNmZXJzUGVybWl0dGVkSUQ4dG8xNTsJLyogQnl0ZSAzMiAqLworCXVuc2lnbmVkIGNoYXIgV2lkZVRyYW5zZmVyc0FjdGl2ZUlEOHRvMTU7CS8qIEJ5dGUgMzMgKi8KK307CisKKy8qCisgIERlZmluZSB0aGUgSW5pdGlhbGl6ZSBFeHRlbmRlZCBNYWlsYm94IHJlcXVlc3Qgc3RydWN0dXJlLgorKi8KKworc3RydWN0IEJ1c0xvZ2ljX0V4dGVuZGVkTWFpbGJveFJlcXVlc3QgeworCXVuc2lnbmVkIGNoYXIgTWFpbGJveENvdW50OwkvKiBCeXRlIDAgKi8KKwl1MzIgQmFzZU1haWxib3hBZGRyZXNzOwkvKiBCeXRlcyAxLTQgKi8KK30gUEFDS0VEOworCisKKy8qCisgIERlZmluZSB0aGUgSW5xdWlyZSBQQ0kgSG9zdCBBZGFwdGVyIEluZm9ybWF0aW9uIHJlcGx5IHR5cGUuICBUaGUgSVNBCisgIENvbXBhdGlibGUgSS9PIFBvcnQgdmFsdWVzIGFyZSBkZWZpbmVkIGhlcmUgYW5kIGFyZSBhbHNvIHVzZWQgd2l0aAorICB0aGUgTW9kaWZ5IEkvTyBBZGRyZXNzIGNvbW1hbmQuCisqLworCitlbnVtIEJ1c0xvZ2ljX0lTQUNvbXBhdGlibGVJT1BvcnQgeworCUJ1c0xvZ2ljX0lPXzMzMCA9IDAsCisJQnVzTG9naWNfSU9fMzM0ID0gMSwKKwlCdXNMb2dpY19JT18yMzAgPSAyLAorCUJ1c0xvZ2ljX0lPXzIzNCA9IDMsCisJQnVzTG9naWNfSU9fMTMwID0gNCwKKwlCdXNMb2dpY19JT18xMzQgPSA1LAorCUJ1c0xvZ2ljX0lPX0Rpc2FibGUgPSA2LAorCUJ1c0xvZ2ljX0lPX0Rpc2FibGUyID0gNworfSBQQUNLRUQ7CisKK3N0cnVjdCBCdXNMb2dpY19QQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uIHsKKwllbnVtIEJ1c0xvZ2ljX0lTQUNvbXBhdGlibGVJT1BvcnQgSVNBQ29tcGF0aWJsZUlPUG9ydDsJLyogQnl0ZSAwICovCisJdW5zaWduZWQgY2hhciBQQ0lBc3NpZ25lZElSUUNoYW5uZWw7CS8qIEJ5dGUgMSAqLworCWJvb2xlYW4gTG93Qnl0ZVRlcm1pbmF0ZWQ6MTsJLyogQnl0ZSAyIEJpdCAwICovCisJYm9vbGVhbiBIaWdoQnl0ZVRlcm1pbmF0ZWQ6MTsJLyogQnl0ZSAyIEJpdCAxICovCisJdW5zaWduZWQgY2hhcjoyOwkvKiBCeXRlIDIgQml0cyAyLTMgKi8KKwlib29sZWFuIEpQMToxOwkJLyogQnl0ZSAyIEJpdCA0ICovCisJYm9vbGVhbiBKUDI6MTsJCS8qIEJ5dGUgMiBCaXQgNSAqLworCWJvb2xlYW4gSlAzOjE7CQkvKiBCeXRlIDIgQml0IDYgKi8KKwlib29sZWFuIEdlbmVyaWNJbmZvVmFsaWQ6MTsJLyogQnl0ZSAyIEJpdCA3ICovCisJdW5zaWduZWQgY2hhcjo4OwkvKiBCeXRlIDMgKi8KK307CisKKy8qCisgIERlZmluZSB0aGUgSW5xdWlyZSBFeHRlbmRlZCBTZXR1cCBJbmZvcm1hdGlvbiByZXBseSBzdHJ1Y3R1cmUuCisqLworCitzdHJ1Y3QgQnVzTG9naWNfRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uIHsKKwl1bnNpZ25lZCBjaGFyIEJ1c1R5cGU7CS8qIEJ5dGUgMCAqLworCXVuc2lnbmVkIGNoYXIgQklPU19BZGRyZXNzOwkvKiBCeXRlIDEgKi8KKwl1bnNpZ25lZCBzaG9ydCBTY2F0dGVyR2F0aGVyTGltaXQ7CS8qIEJ5dGVzIDItMyAqLworCXVuc2lnbmVkIGNoYXIgTWFpbGJveENvdW50OwkvKiBCeXRlIDQgKi8KKwl1MzIgQmFzZU1haWxib3hBZGRyZXNzOwkvKiBCeXRlcyA1LTggKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyOjI7CS8qIEJ5dGUgOSBCaXRzIDAtMSAqLworCQlib29sZWFuIEZhc3RPbkVJU0E6MTsJLyogQnl0ZSA5IEJpdCAyICovCisJCXVuc2lnbmVkIGNoYXI6MzsJLyogQnl0ZSA5IEJpdHMgMy01ICovCisJCWJvb2xlYW4gTGV2ZWxTZW5zaXRpdmVJbnRlcnJ1cHQ6MTsJLyogQnl0ZSA5IEJpdCA2ICovCisJCXVuc2lnbmVkIGNoYXI6MTsJLyogQnl0ZSA5IEJpdCA3ICovCisJfSBNaXNjOworCXVuc2lnbmVkIGNoYXIgRmlybXdhcmVSZXZpc2lvblszXTsJLyogQnl0ZXMgMTAtMTIgKi8KKwlib29sZWFuIEhvc3RXaWRlU0NTSToxOwkvKiBCeXRlIDEzIEJpdCAwICovCisJYm9vbGVhbiBIb3N0RGlmZmVyZW50aWFsU0NTSToxOwkvKiBCeXRlIDEzIEJpdCAxICovCisJYm9vbGVhbiBIb3N0U3VwcG9ydHNTQ0FNOjE7CS8qIEJ5dGUgMTMgQml0IDIgKi8KKwlib29sZWFuIEhvc3RVbHRyYVNDU0k6MTsJLyogQnl0ZSAxMyBCaXQgMyAqLworCWJvb2xlYW4gSG9zdFNtYXJ0VGVybWluYXRpb246MTsJLyogQnl0ZSAxMyBCaXQgNCAqLworCXVuc2lnbmVkIGNoYXI6MzsJLyogQnl0ZSAxMyBCaXRzIDUtNyAqLworfSBQQUNLRUQ7CisKKy8qCisgIERlZmluZSB0aGUgRW5hYmxlIFN0cmljdCBSb3VuZCBSb2JpbiBNb2RlIHJlcXVlc3QgdHlwZS4KKyovCisKK2VudW0gQnVzTG9naWNfUm91bmRSb2Jpbk1vZGVSZXF1ZXN0IHsKKwlCdXNMb2dpY19BZ2dyZXNzaXZlUm91bmRSb2Jpbk1vZGUgPSAwLAorCUJ1c0xvZ2ljX1N0cmljdFJvdW5kUm9iaW5Nb2RlID0gMQorfSBQQUNLRUQ7CisKKworLyoKKyAgRGVmaW5lIHRoZSBGZXRjaCBIb3N0IEFkYXB0ZXIgTG9jYWwgUkFNIHJlcXVlc3QgdHlwZS4KKyovCisKKyNkZWZpbmUgQnVzTG9naWNfQklPU19CYXNlT2Zmc2V0CQkwCisjZGVmaW5lIEJ1c0xvZ2ljX0F1dG9TQ1NJX0Jhc2VPZmZzZXQJCTY0CisKK3N0cnVjdCBCdXNMb2dpY19GZXRjaEhvc3RBZGFwdGVyTG9jYWxSQU1SZXF1ZXN0IHsKKwl1bnNpZ25lZCBjaGFyIEJ5dGVPZmZzZXQ7CS8qIEJ5dGUgMCAqLworCXVuc2lnbmVkIGNoYXIgQnl0ZUNvdW50OwkvKiBCeXRlIDEgKi8KK307CisKKy8qCisgIERlZmluZSB0aGUgSG9zdCBBZGFwdGVyIExvY2FsIFJBTSBBdXRvU0NTSSBzdHJ1Y3R1cmUuCisqLworCitzdHJ1Y3QgQnVzTG9naWNfQXV0b1NDU0lEYXRhIHsKKwl1bnNpZ25lZCBjaGFyIEludGVybmFsRmFjdG9yeVNpZ25hdHVyZVsyXTsJLyogQnl0ZXMgMC0xICovCisJdW5zaWduZWQgY2hhciBJbmZvcm1hdGlvbkJ5dGVDb3VudDsJLyogQnl0ZSAyICovCisJdW5zaWduZWQgY2hhciBIb3N0QWRhcHRlclR5cGVbNl07CS8qIEJ5dGVzIDMtOCAqLworCXVuc2lnbmVkIGNoYXI6ODsJLyogQnl0ZSA5ICovCisJYm9vbGVhbiBGbG9wcHlFbmFibGVkOjE7CS8qIEJ5dGUgMTAgQml0IDAgKi8KKwlib29sZWFuIEZsb3BweVNlY29uZGFyeToxOwkvKiBCeXRlIDEwIEJpdCAxICovCisJYm9vbGVhbiBMZXZlbFNlbnNpdGl2ZUludGVycnVwdDoxOwkvKiBCeXRlIDEwIEJpdCAyICovCisJdW5zaWduZWQgY2hhcjoyOwkvKiBCeXRlIDEwIEJpdHMgMy00ICovCisJdW5zaWduZWQgY2hhciBTeXN0ZW1SQU1BcmVhRm9yQklPUzozOwkvKiBCeXRlIDEwIEJpdHMgNS03ICovCisJdW5zaWduZWQgY2hhciBETUFfQ2hhbm5lbDo3OwkvKiBCeXRlIDExIEJpdHMgMC02ICovCisJYm9vbGVhbiBETUFfQXV0b0NvbmZpZ3VyYXRpb246MTsJLyogQnl0ZSAxMSBCaXQgNyAqLworCXVuc2lnbmVkIGNoYXIgSVJRX0NoYW5uZWw6NzsJLyogQnl0ZSAxMiBCaXRzIDAtNiAqLworCWJvb2xlYW4gSVJRX0F1dG9Db25maWd1cmF0aW9uOjE7CS8qIEJ5dGUgMTIgQml0IDcgKi8KKwl1bnNpZ25lZCBjaGFyIERNQV9UcmFuc2ZlclJhdGU7CS8qIEJ5dGUgMTMgKi8KKwl1bnNpZ25lZCBjaGFyIFNDU0lfSUQ7CS8qIEJ5dGUgMTQgKi8KKwlib29sZWFuIExvd0J5dGVUZXJtaW5hdGVkOjE7CS8qIEJ5dGUgMTUgQml0IDAgKi8KKwlib29sZWFuIFBhcml0eUNoZWNraW5nRW5hYmxlZDoxOwkvKiBCeXRlIDE1IEJpdCAxICovCisJYm9vbGVhbiBIaWdoQnl0ZVRlcm1pbmF0ZWQ6MTsJLyogQnl0ZSAxNSBCaXQgMiAqLworCWJvb2xlYW4gTm9pc3lDYWJsaW5nRW52aXJvbm1lbnQ6MTsJLyogQnl0ZSAxNSBCaXQgMyAqLworCWJvb2xlYW4gRmFzdFN5bmNocm9ub3VzTmVnb3RpYXRpb246MTsJLyogQnl0ZSAxNSBCaXQgNCAqLworCWJvb2xlYW4gQnVzUmVzZXRFbmFibGVkOjE7CS8qIEJ5dGUgMTUgQml0IDUgKi8KKwkgYm9vbGVhbjoxOwkJLyogQnl0ZSAxNSBCaXQgNiAqLworCWJvb2xlYW4gQWN0aXZlTmVnYXRpb25FbmFibGVkOjE7CS8qIEJ5dGUgMTUgQml0IDcgKi8KKwl1bnNpZ25lZCBjaGFyIEJ1c09uRGVsYXk7CS8qIEJ5dGUgMTYgKi8KKwl1bnNpZ25lZCBjaGFyIEJ1c09mZkRlbGF5OwkvKiBCeXRlIDE3ICovCisJYm9vbGVhbiBIb3N0QWRhcHRlckJJT1NFbmFibGVkOjE7CS8qIEJ5dGUgMTggQml0IDAgKi8KKwlib29sZWFuIEJJT1NSZWRpcmVjdGlvbk9mSU5UMTlFbmFibGVkOjE7CS8qIEJ5dGUgMTggQml0IDEgKi8KKwlib29sZWFuIEV4dGVuZGVkVHJhbnNsYXRpb25FbmFibGVkOjE7CS8qIEJ5dGUgMTggQml0IDIgKi8KKwlib29sZWFuIE1hcFJlbW92YWJsZUFzRml4ZWRFbmFibGVkOjE7CS8qIEJ5dGUgMTggQml0IDMgKi8KKwkgYm9vbGVhbjoxOwkJLyogQnl0ZSAxOCBCaXQgNCAqLworCWJvb2xlYW4gQklPU1N1cHBvcnRzTW9yZVRoYW4yRHJpdmVzRW5hYmxlZDoxOwkvKiBCeXRlIDE4IEJpdCA1ICovCisJYm9vbGVhbiBCSU9TSW50ZXJydXB0TW9kZUVuYWJsZWQ6MTsJLyogQnl0ZSAxOCBCaXQgNiAqLworCWJvb2xlYW4gRmxvcHRpY2FsU3VwcG9ydEVuYWJsZWQ6MTsJLyogQnl0ZSAxOSBCaXQgNyAqLworCXVuc2lnbmVkIHNob3J0IERldmljZUVuYWJsZWQ7CS8qIEJ5dGVzIDE5LTIwICovCisJdW5zaWduZWQgc2hvcnQgV2lkZVBlcm1pdHRlZDsJLyogQnl0ZXMgMjEtMjIgKi8KKwl1bnNpZ25lZCBzaG9ydCBGYXN0UGVybWl0dGVkOwkvKiBCeXRlcyAyMy0yNCAqLworCXVuc2lnbmVkIHNob3J0IFN5bmNocm9ub3VzUGVybWl0dGVkOwkvKiBCeXRlcyAyNS0yNiAqLworCXVuc2lnbmVkIHNob3J0IERpc2Nvbm5lY3RQZXJtaXR0ZWQ7CS8qIEJ5dGVzIDI3LTI4ICovCisJdW5zaWduZWQgc2hvcnQgU2VuZFN0YXJ0VW5pdENvbW1hbmQ7CS8qIEJ5dGVzIDI5LTMwICovCisJdW5zaWduZWQgc2hvcnQgSWdub3JlSW5CSU9TU2NhbjsJLyogQnl0ZXMgMzEtMzIgKi8KKwl1bnNpZ25lZCBjaGFyIFBDSUludGVycnVwdFBpbjoyOwkvKiBCeXRlIDMzIEJpdHMgMC0xICovCisJdW5zaWduZWQgY2hhciBIb3N0QWRhcHRlcklPUG9ydEFkZHJlc3M6MjsJLyogQnl0ZSAzMyBCaXRzIDItMyAqLworCWJvb2xlYW4gU3RyaWN0Um91bmRSb2Jpbk1vZGVFbmFibGVkOjE7CS8qIEJ5dGUgMzMgQml0IDQgKi8KKwlib29sZWFuIFZFU0FCdXNTcGVlZEdyZWF0ZXJUaGFuMzNNSHo6MTsJLyogQnl0ZSAzMyBCaXQgNSAqLworCWJvb2xlYW4gVkVTQUJ1cnN0V3JpdGVFbmFibGVkOjE7CS8qIEJ5dGUgMzMgQml0IDYgKi8KKwlib29sZWFuIFZFU0FCdXJzdFJlYWRFbmFibGVkOjE7CS8qIEJ5dGUgMzMgQml0IDcgKi8KKwl1bnNpZ25lZCBzaG9ydCBVbHRyYVBlcm1pdHRlZDsJLyogQnl0ZXMgMzQtMzUgKi8KKwl1bnNpZ25lZCBpbnQ6MzI7CS8qIEJ5dGVzIDM2LTM5ICovCisJdW5zaWduZWQgY2hhcjo4OwkvKiBCeXRlIDQwICovCisJdW5zaWduZWQgY2hhciBBdXRvU0NTSU1heGltdW1MVU47CS8qIEJ5dGUgNDEgKi8KKwkgYm9vbGVhbjoxOwkJLyogQnl0ZSA0MiBCaXQgMCAqLworCWJvb2xlYW4gU0NBTV9Eb21pbmFudDoxOwkvKiBCeXRlIDQyIEJpdCAxICovCisJYm9vbGVhbiBTQ0FNX0VuYWJsZWQ6MTsJLyogQnl0ZSA0MiBCaXQgMiAqLworCWJvb2xlYW4gU0NBTV9MZXZlbDI6MTsJLyogQnl0ZSA0MiBCaXQgMyAqLworCXVuc2lnbmVkIGNoYXI6NDsJLyogQnl0ZSA0MiBCaXRzIDQtNyAqLworCWJvb2xlYW4gSU5UMTNFeHRlbnNpb25FbmFibGVkOjE7CS8qIEJ5dGUgNDMgQml0IDAgKi8KKwkgYm9vbGVhbjoxOwkJLyogQnl0ZSA0MyBCaXQgMSAqLworCWJvb2xlYW4gQ0RST01Cb290RW5hYmxlZDoxOwkvKiBCeXRlIDQzIEJpdCAyICovCisJdW5zaWduZWQgY2hhcjo1OwkvKiBCeXRlIDQzIEJpdHMgMy03ICovCisJdW5zaWduZWQgY2hhciBCb290VGFyZ2V0SUQ6NDsJLyogQnl0ZSA0NCBCaXRzIDAtMyAqLworCXVuc2lnbmVkIGNoYXIgQm9vdENoYW5uZWw6NDsJLyogQnl0ZSA0NCBCaXRzIDQtNyAqLworCXVuc2lnbmVkIGNoYXIgRm9yY2VCdXNEZXZpY2VTY2FubmluZ09yZGVyOjE7CS8qIEJ5dGUgNDUgQml0IDAgKi8KKwl1bnNpZ25lZCBjaGFyOjc7CS8qIEJ5dGUgNDUgQml0cyAxLTcgKi8KKwl1bnNpZ25lZCBzaG9ydCBOb25UYWdnZWRUb0FsdGVybmF0ZUxVTlBlcm1pdHRlZDsJLyogQnl0ZXMgNDYtNDcgKi8KKwl1bnNpZ25lZCBzaG9ydCBSZW5lZ290aWF0ZVN5bmNBZnRlckNoZWNrQ29uZGl0aW9uOwkvKiBCeXRlcyA0OC00OSAqLworCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWRbMTBdOwkvKiBCeXRlcyA1MC01OSAqLworCXVuc2lnbmVkIGNoYXIgTWFudWZhY3R1cmluZ0RpYWdub3N0aWNbMl07CS8qIEJ5dGVzIDYwLTYxICovCisJdW5zaWduZWQgc2hvcnQgQ2hlY2tzdW07CS8qIEJ5dGVzIDYyLTYzICovCit9IFBBQ0tFRDsKKworLyoKKyAgRGVmaW5lIHRoZSBIb3N0IEFkYXB0ZXIgTG9jYWwgUkFNIEF1dG8gU0NTSSBCeXRlIDQ1IHN0cnVjdHVyZS4KKyovCisKK3N0cnVjdCBCdXNMb2dpY19BdXRvU0NTSUJ5dGU0NSB7CisJdW5zaWduZWQgY2hhciBGb3JjZUJ1c0RldmljZVNjYW5uaW5nT3JkZXI6MTsJLyogQml0IDAgKi8KKwl1bnNpZ25lZCBjaGFyOjc7CS8qIEJpdHMgMS03ICovCit9OworCisvKgorICBEZWZpbmUgdGhlIEhvc3QgQWRhcHRlciBMb2NhbCBSQU0gQklPUyBEcml2ZSBNYXAgQnl0ZSBzdHJ1Y3R1cmUuCisqLworCisjZGVmaW5lIEJ1c0xvZ2ljX0JJT1NfRHJpdmVNYXBPZmZzZXQJCTE3CisKK3N0cnVjdCBCdXNMb2dpY19CSU9TRHJpdmVNYXBCeXRlIHsKKwl1bnNpZ25lZCBjaGFyIFRhcmdldElEQml0MzoxOwkvKiBCaXQgMCAqLworCXVuc2lnbmVkIGNoYXI6MjsJLyogQml0cyAxLTIgKi8KKwllbnVtIEJ1c0xvZ2ljX0JJT1NfRGlza0dlb21ldHJ5VHJhbnNsYXRpb24gRGlza0dlb21ldHJ5OjI7CS8qIEJpdHMgMy00ICovCisJdW5zaWduZWQgY2hhciBUYXJnZXRJRDozOwkvKiBCaXRzIDUtNyAqLworfTsKKworLyoKKyAgRGVmaW5lIHRoZSBTZXQgQ0NCIEZvcm1hdCByZXF1ZXN0IHR5cGUuICBFeHRlbmRlZCBMVU4gRm9ybWF0IENDQnMgYXJlCisgIG5lY2Vzc2FyeSB0byBzdXBwb3J0IG1vcmUgdGhhbiA4IExvZ2ljYWwgVW5pdHMgcGVyIFRhcmdldCBEZXZpY2UuCisqLworCitlbnVtIEJ1c0xvZ2ljX1NldENDQkZvcm1hdFJlcXVlc3QgeworCUJ1c0xvZ2ljX0xlZ2FjeUxVTkZvcm1hdENDQiA9IDAsCisJQnVzTG9naWNfRXh0ZW5kZWRMVU5Gb3JtYXRDQ0IgPSAxCit9IFBBQ0tFRDsKKworLyoKKyAgRGVmaW5lIHRoZSBPdXRnb2luZyBNYWlsYm94IEFjdGlvbiBDb2Rlcy4KKyovCisKK2VudW0gQnVzTG9naWNfQWN0aW9uQ29kZSB7CisJQnVzTG9naWNfT3V0Z29pbmdNYWlsYm94RnJlZSA9IDB4MDAsCisJQnVzTG9naWNfTWFpbGJveFN0YXJ0Q29tbWFuZCA9IDB4MDEsCisJQnVzTG9naWNfTWFpbGJveEFib3J0Q29tbWFuZCA9IDB4MDIKK30gUEFDS0VEOworCisKKy8qCisgIERlZmluZSB0aGUgSW5jb21pbmcgTWFpbGJveCBDb21wbGV0aW9uIENvZGVzLiAgVGhlIE11bHRpTWFzdGVyIEZpcm13YXJlCisgIG9ubHkgdXNlcyBjb2RlcyAwIC0gNC4gIFRoZSBGbGFzaFBvaW50IFNDQ0IgTWFuYWdlciBoYXMgbm8gbWFpbGJveGVzLCBzbworICBjb21wbGV0aW9uIGNvZGVzIGFyZSBzdG9yZWQgaW4gdGhlIENDQjsgaXQgb25seSB1c2VzIGNvZGVzIDEsIDIsIDQsIGFuZCA1LgorKi8KKworZW51bSBCdXNMb2dpY19Db21wbGV0aW9uQ29kZSB7CisJQnVzTG9naWNfSW5jb21pbmdNYWlsYm94RnJlZSA9IDB4MDAsCisJQnVzTG9naWNfQ29tbWFuZENvbXBsZXRlZFdpdGhvdXRFcnJvciA9IDB4MDEsCisJQnVzTG9naWNfQ29tbWFuZEFib3J0ZWRBdEhvc3RSZXF1ZXN0ID0gMHgwMiwKKwlCdXNMb2dpY19BYm9ydGVkQ29tbWFuZE5vdEZvdW5kID0gMHgwMywKKwlCdXNMb2dpY19Db21tYW5kQ29tcGxldGVkV2l0aEVycm9yID0gMHgwNCwKKwlCdXNMb2dpY19JbnZhbGlkQ0NCID0gMHgwNQorfSBQQUNLRUQ7CisKKy8qCisgIERlZmluZSB0aGUgQ29tbWFuZCBDb250cm9sIEJsb2NrIChDQ0IpIE9wY29kZXMuCisqLworCitlbnVtIEJ1c0xvZ2ljX0NDQl9PcGNvZGUgeworCUJ1c0xvZ2ljX0luaXRpYXRvckNDQiA9IDB4MDAsCisJQnVzTG9naWNfVGFyZ2V0Q0NCID0gMHgwMSwKKwlCdXNMb2dpY19Jbml0aWF0b3JDQ0JfU2NhdHRlckdhdGhlciA9IDB4MDIsCisJQnVzTG9naWNfSW5pdGlhdG9yQ0NCX1Jlc2lkdWFsRGF0YUxlbmd0aCA9IDB4MDMsCisJQnVzTG9naWNfSW5pdGlhdG9yQ0NCX1NjYXR0ZXJHYXRoZXJSZXNpZHVhbCA9IDB4MDQsCisJQnVzTG9naWNfQnVzRGV2aWNlUmVzZXQgPSAweDgxCit9IFBBQ0tFRDsKKworCisvKgorICBEZWZpbmUgdGhlIENDQiBEYXRhIERpcmVjdGlvbiBDb2Rlcy4KKyovCisKK2VudW0gQnVzTG9naWNfRGF0YURpcmVjdGlvbiB7CisJQnVzTG9naWNfVW5jaGVja2VkRGF0YVRyYW5zZmVyID0gMCwKKwlCdXNMb2dpY19EYXRhSW5MZW5ndGhDaGVja2VkID0gMSwKKwlCdXNMb2dpY19EYXRhT3V0TGVuZ3RoQ2hlY2tlZCA9IDIsCisJQnVzTG9naWNfTm9EYXRhVHJhbnNmZXIgPSAzCit9OworCisKKy8qCisgIERlZmluZSB0aGUgSG9zdCBBZGFwdGVyIFN0YXR1cyBDb2Rlcy4gIFRoZSBNdWx0aU1hc3RlciBGaXJtd2FyZSBkb2VzIG5vdAorICByZXR1cm4gc3RhdHVzIGNvZGUgMHgwQzsgaXQgdXNlcyAweDEyIGZvciBib3RoIG92ZXJydW5zIGFuZCB1bmRlcnJ1bnMuCisqLworCitlbnVtIEJ1c0xvZ2ljX0hvc3RBZGFwdGVyU3RhdHVzIHsKKwlCdXNMb2dpY19Db21tYW5kQ29tcGxldGVkTm9ybWFsbHkgPSAweDAwLAorCUJ1c0xvZ2ljX0xpbmtlZENvbW1hbmRDb21wbGV0ZWQgPSAweDBBLAorCUJ1c0xvZ2ljX0xpbmtlZENvbW1hbmRDb21wbGV0ZWRXaXRoRmxhZyA9IDB4MEIsCisJQnVzTG9naWNfRGF0YVVuZGVyUnVuID0gMHgwQywKKwlCdXNMb2dpY19TQ1NJU2VsZWN0aW9uVGltZW91dCA9IDB4MTEsCisJQnVzTG9naWNfRGF0YU92ZXJSdW4gPSAweDEyLAorCUJ1c0xvZ2ljX1VuZXhwZWN0ZWRCdXNGcmVlID0gMHgxMywKKwlCdXNMb2dpY19JbnZhbGlkQnVzUGhhc2VSZXF1ZXN0ZWQgPSAweDE0LAorCUJ1c0xvZ2ljX0ludmFsaWRPdXRnb2luZ01haWxib3hBY3Rpb25Db2RlID0gMHgxNSwKKwlCdXNMb2dpY19JbnZhbGlkQ29tbWFuZE9wZXJhdGlvbkNvZGUgPSAweDE2LAorCUJ1c0xvZ2ljX0xpbmtlZENDQmhhc0ludmFsaWRMVU4gPSAweDE3LAorCUJ1c0xvZ2ljX0ludmFsaWRDb21tYW5kUGFyYW1ldGVyID0gMHgxQSwKKwlCdXNMb2dpY19BdXRvUmVxdWVzdFNlbnNlRmFpbGVkID0gMHgxQiwKKwlCdXNMb2dpY19UYWdnZWRRdWV1aW5nTWVzc2FnZVJlamVjdGVkID0gMHgxQywKKwlCdXNMb2dpY19VbnN1cHBvcnRlZE1lc3NhZ2VSZWNlaXZlZCA9IDB4MUQsCisJQnVzTG9naWNfSG9zdEFkYXB0ZXJIYXJkd2FyZUZhaWxlZCA9IDB4MjAsCisJQnVzTG9naWNfVGFyZ2V0RmFpbGVkUmVzcG9uc2VUb0FUTiA9IDB4MjEsCisJQnVzTG9naWNfSG9zdEFkYXB0ZXJBc3NlcnRlZFJTVCA9IDB4MjIsCisJQnVzTG9naWNfT3RoZXJEZXZpY2VBc3NlcnRlZFJTVCA9IDB4MjMsCisJQnVzTG9naWNfVGFyZ2V0RGV2aWNlUmVjb25uZWN0ZWRJbXByb3Blcmx5ID0gMHgyNCwKKwlCdXNMb2dpY19Ib3N0QWRhcHRlckFzc2VydGVkQnVzRGV2aWNlUmVzZXQgPSAweDI1LAorCUJ1c0xvZ2ljX0Fib3J0UXVldWVHZW5lcmF0ZWQgPSAweDI2LAorCUJ1c0xvZ2ljX0hvc3RBZGFwdGVyU29mdHdhcmVFcnJvciA9IDB4MjcsCisJQnVzTG9naWNfSG9zdEFkYXB0ZXJIYXJkd2FyZVRpbWVvdXRFcnJvciA9IDB4MzAsCisJQnVzTG9naWNfU0NTSVBhcml0eUVycm9yRGV0ZWN0ZWQgPSAweDM0Cit9IFBBQ0tFRDsKKworCisvKgorICBEZWZpbmUgdGhlIFNDU0kgVGFyZ2V0IERldmljZSBTdGF0dXMgQ29kZXMuCisqLworCitlbnVtIEJ1c0xvZ2ljX1RhcmdldERldmljZVN0YXR1cyB7CisJQnVzTG9naWNfT3BlcmF0aW9uR29vZCA9IDB4MDAsCisJQnVzTG9naWNfQ2hlY2tDb25kaXRpb24gPSAweDAyLAorCUJ1c0xvZ2ljX0RldmljZUJ1c3kgPSAweDA4Cit9IFBBQ0tFRDsKKworLyoKKyAgRGVmaW5lIHRoZSBRdWV1ZSBUYWcgQ29kZXMuCisqLworCitlbnVtIEJ1c0xvZ2ljX1F1ZXVlVGFnIHsKKwlCdXNMb2dpY19TaW1wbGVRdWV1ZVRhZyA9IDAsCisJQnVzTG9naWNfSGVhZE9mUXVldWVUYWcgPSAxLAorCUJ1c0xvZ2ljX09yZGVyZWRRdWV1ZVRhZyA9IDIsCisJQnVzTG9naWNfUmVzZXJ2ZWRRVCA9IDMKK307CisKKy8qCisgIERlZmluZSB0aGUgU0NTSSBDb21tYW5kIERlc2NyaXB0b3IgQmxvY2sgKENEQikuCisqLworCisjZGVmaW5lIEJ1c0xvZ2ljX0NEQl9NYXhMZW5ndGgJCQkxMgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgU0NTSV9DREJfVFtCdXNMb2dpY19DREJfTWF4TGVuZ3RoXTsKKworCisvKgorICBEZWZpbmUgdGhlIFNjYXR0ZXIvR2F0aGVyIFNlZ21lbnQgc3RydWN0dXJlIHJlcXVpcmVkIGJ5IHRoZSBNdWx0aU1hc3RlcgorICBGaXJtd2FyZSBJbnRlcmZhY2UgYW5kIHRoZSBGbGFzaFBvaW50IFNDQ0IgTWFuYWdlci4KKyovCisKK3N0cnVjdCBCdXNMb2dpY19TY2F0dGVyR2F0aGVyU2VnbWVudCB7CisJdTMyIFNlZ21lbnRCeXRlQ291bnQ7CS8qIEJ5dGVzIDAtMyAqLworCXUzMiBTZWdtZW50RGF0YVBvaW50ZXI7CS8qIEJ5dGVzIDQtNyAqLworfTsKKworLyoKKyAgRGVmaW5lIHRoZSBEcml2ZXIgQ0NCIFN0YXR1cyBDb2Rlcy4KKyovCisKK2VudW0gQnVzTG9naWNfQ0NCX1N0YXR1cyB7CisJQnVzTG9naWNfQ0NCX0ZyZWUgPSAwLAorCUJ1c0xvZ2ljX0NDQl9BY3RpdmUgPSAxLAorCUJ1c0xvZ2ljX0NDQl9Db21wbGV0ZWQgPSAyLAorCUJ1c0xvZ2ljX0NDQl9SZXNldCA9IDMKK30gUEFDS0VEOworCisKKy8qCisgIERlZmluZSB0aGUgMzIgQml0IE1vZGUgQ29tbWFuZCBDb250cm9sIEJsb2NrIChDQ0IpIHN0cnVjdHVyZS4gIFRoZSBmaXJzdCA0MAorICBieXRlcyBhcmUgZGVmaW5lZCBieSBhbmQgY29tbW9uIHRvIGJvdGggdGhlIE11bHRpTWFzdGVyIEZpcm13YXJlIGFuZCB0aGUKKyAgRmxhc2hQb2ludCBTQ0NCIE1hbmFnZXIuICBUaGUgbmV4dCA2MCBieXRlcyBhcmUgZGVmaW5lZCBieSB0aGUgRmxhc2hQb2ludAorICBTQ0NCIE1hbmFnZXIuICBUaGUgcmVtYWluaW5nIGNvbXBvbmVudHMgYXJlIGRlZmluZWQgYnkgdGhlIExpbnV4IEJ1c0xvZ2ljCisgIERyaXZlci4gIEV4dGVuZGVkIExVTiBGb3JtYXQgQ0NCcyBkaWZmZXIgZnJvbSBMZWdhY3kgTFVOIEZvcm1hdCAzMiBCaXQgTW9kZQorICBDQ0JzIG9ubHkgaW4gaGF2aW5nIHRoZSBUYWdFbmFibGUgYW5kIFF1ZXVlVGFnIGZpZWxkcyBtb3ZlZCBmcm9tIGJ5dGUgMTcgdG8KKyAgYnl0ZSAxLCBhbmQgdGhlIExvZ2ljYWwgVW5pdCBmaWVsZCBpbiBieXRlIDE3IGV4cGFuZGVkIHRvIDYgYml0cy4gIEluIHRoZW9yeSwKKyAgRXh0ZW5kZWQgTFVOIEZvcm1hdCBDQ0JzIGNhbiBzdXBwb3J0IHVwIHRvIDY0IExvZ2ljYWwgVW5pdHMsIGJ1dCBpbiBwcmFjdGljZQorICBtYW55IGRldmljZXMgd2lsbCByZXNwb25kIGltcHJvcGVybHkgdG8gTG9naWNhbCBVbml0cyBiZXR3ZWVuIDMyIGFuZCA2MywgYW5kCisgIHRoZSBTQ1NJLTIgc3BlY2lmaWNhdGlvbiBkZWZpbmVzIEJpdCA1IGFzIExVTlRBUi4gIEV4dGVuZGVkIExVTiBGb3JtYXQgQ0NCcworICBhcmUgdXNlZCBieSByZWNlbnQgdmVyc2lvbnMgb2YgdGhlIE11bHRpTWFzdGVyIEZpcm13YXJlLCBhcyB3ZWxsIGFzIGJ5IHRoZQorICBGbGFzaFBvaW50IFNDQ0IgTWFuYWdlcjsgdGhlIEZsYXNoUG9pbnQgU0NDQiBNYW5hZ2VyIG9ubHkgc3VwcG9ydHMgMzIgTG9naWNhbAorICBVbml0cy4gIFNpbmNlIDY0IExvZ2ljYWwgVW5pdHMgYXJlIHVubGlrZWx5IHRvIGJlIG5lZWRlZCBpbiBwcmFjdGljZSwgYW5kCisgIHNpbmNlIHRoZXkgYXJlIHByb2JsZW1hdGljIGZvciB0aGUgYWJvdmUgcmVhc29ucywgYW5kIHNpbmNlIGxpbWl0aW5nIHRoZW0gdG8KKyAgNSBiaXRzIHNpbXBsaWZpZXMgdGhlIENDQiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiwgdGhpcyBkcml2ZXIgb25seSBzdXBwb3J0cworICAzMiBMb2dpY2FsIFVuaXRzIHBlciBUYXJnZXQgRGV2aWNlLgorKi8KKworc3RydWN0IEJ1c0xvZ2ljX0NDQiB7CisJLyoKKwkgICBNdWx0aU1hc3RlciBGaXJtd2FyZSBhbmQgRmxhc2hQb2ludCBTQ0NCIE1hbmFnZXIgQ29tbW9uIFBvcnRpb24uCisJICovCisJZW51bSBCdXNMb2dpY19DQ0JfT3Bjb2RlIE9wY29kZTsJLyogQnl0ZSAwICovCisJdW5zaWduZWQgY2hhcjozOwkvKiBCeXRlIDEgQml0cyAwLTIgKi8KKwllbnVtIEJ1c0xvZ2ljX0RhdGFEaXJlY3Rpb24gRGF0YURpcmVjdGlvbjoyOwkvKiBCeXRlIDEgQml0cyAzLTQgKi8KKwlib29sZWFuIFRhZ0VuYWJsZToxOwkvKiBCeXRlIDEgQml0IDUgKi8KKwllbnVtIEJ1c0xvZ2ljX1F1ZXVlVGFnIFF1ZXVlVGFnOjI7CS8qIEJ5dGUgMSBCaXRzIDYtNyAqLworCXVuc2lnbmVkIGNoYXIgQ0RCX0xlbmd0aDsJLyogQnl0ZSAyICovCisJdW5zaWduZWQgY2hhciBTZW5zZURhdGFMZW5ndGg7CS8qIEJ5dGUgMyAqLworCXUzMiBEYXRhTGVuZ3RoOwkJLyogQnl0ZXMgNC03ICovCisJdTMyIERhdGFQb2ludGVyOwkvKiBCeXRlcyA4LTExICovCisJdW5zaWduZWQgY2hhcjo4OwkvKiBCeXRlIDEyICovCisJdW5zaWduZWQgY2hhcjo4OwkvKiBCeXRlIDEzICovCisJZW51bSBCdXNMb2dpY19Ib3N0QWRhcHRlclN0YXR1cyBIb3N0QWRhcHRlclN0YXR1czsJLyogQnl0ZSAxNCAqLworCWVudW0gQnVzTG9naWNfVGFyZ2V0RGV2aWNlU3RhdHVzIFRhcmdldERldmljZVN0YXR1czsJLyogQnl0ZSAxNSAqLworCXVuc2lnbmVkIGNoYXIgVGFyZ2V0SUQ7CS8qIEJ5dGUgMTYgKi8KKwl1bnNpZ25lZCBjaGFyIExvZ2ljYWxVbml0OjU7CS8qIEJ5dGUgMTcgQml0cyAwLTQgKi8KKwlib29sZWFuIExlZ2FjeVRhZ0VuYWJsZToxOwkvKiBCeXRlIDE3IEJpdCA1ICovCisJZW51bSBCdXNMb2dpY19RdWV1ZVRhZyBMZWdhY3lRdWV1ZVRhZzoyOwkvKiBCeXRlIDE3IEJpdHMgNi03ICovCisJU0NTSV9DREJfVCBDREI7CQkvKiBCeXRlcyAxOC0yOSAqLworCXVuc2lnbmVkIGNoYXI6ODsJLyogQnl0ZSAzMCAqLworCXVuc2lnbmVkIGNoYXI6ODsJLyogQnl0ZSAzMSAqLworCXVuc2lnbmVkIGludDozMjsJLyogQnl0ZXMgMzItMzUgKi8KKwl1MzIgU2Vuc2VEYXRhUG9pbnRlcjsJLyogQnl0ZXMgMzYtMzkgKi8KKwkvKgorCSAgIEZsYXNoUG9pbnQgU0NDQiBNYW5hZ2VyIERlZmluZWQgUG9ydGlvbi4KKwkgKi8KKwl2b2lkICgqQ2FsbGJhY2tGdW5jdGlvbikgKHN0cnVjdCBCdXNMb2dpY19DQ0IgKik7CS8qIEJ5dGVzIDQwLTQzICovCisJdTMyIEJhc2VBZGRyZXNzOwkvKiBCeXRlcyA0NC00NyAqLworCWVudW0gQnVzTG9naWNfQ29tcGxldGlvbkNvZGUgQ29tcGxldGlvbkNvZGU7CS8qIEJ5dGUgNDggKi8KKyNpZm5kZWYgQ09ORklHX1NDU0lfT01JVF9GTEFTSFBPSU5UCisJdW5zaWduZWQgY2hhcjo4OwkvKiBCeXRlIDQ5ICovCisJdW5zaWduZWQgc2hvcnQgT1NfRmxhZ3M7CS8qIEJ5dGVzIDUwLTUxICovCisJdW5zaWduZWQgY2hhciBQcml2YXRlWzQ4XTsJLyogQnl0ZXMgNTItOTkgKi8KKyNlbmRpZgorCS8qCisJICAgQnVzTG9naWMgTGludXggRHJpdmVyIERlZmluZWQgUG9ydGlvbi4KKwkgKi8KKwlkbWFfYWRkcl90IEFsbG9jYXRpb25Hcm91cEhlYWQ7CisJdW5zaWduZWQgaW50IEFsbG9jYXRpb25Hcm91cFNpemU7CisJdTMyIERNQV9IYW5kbGU7CisJZW51bSBCdXNMb2dpY19DQ0JfU3RhdHVzIFN0YXR1czsKKwl1bnNpZ25lZCBsb25nIFNlcmlhbE51bWJlcjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpDb21tYW5kOworCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXI7CisJc3RydWN0IEJ1c0xvZ2ljX0NDQiAqTmV4dDsKKwlzdHJ1Y3QgQnVzTG9naWNfQ0NCICpOZXh0QWxsOworCXN0cnVjdCBCdXNMb2dpY19TY2F0dGVyR2F0aGVyU2VnbWVudAorCSBTY2F0dGVyR2F0aGVyTGlzdFtCdXNMb2dpY19TY2F0dGVyR2F0aGVyTGltaXRdOworfTsKKworLyoKKyAgRGVmaW5lIHRoZSAzMiBCaXQgTW9kZSBPdXRnb2luZyBNYWlsYm94IHN0cnVjdHVyZS4KKyovCisKK3N0cnVjdCBCdXNMb2dpY19PdXRnb2luZ01haWxib3ggeworCXUzMiBDQ0I7CQkvKiBCeXRlcyAwLTMgKi8KKwl1bnNpZ25lZCBpbnQ6MjQ7CS8qIEJ5dGVzIDQtNiAqLworCWVudW0gQnVzTG9naWNfQWN0aW9uQ29kZSBBY3Rpb25Db2RlOwkvKiBCeXRlIDcgKi8KK307CisKKy8qCisgIERlZmluZSB0aGUgMzIgQml0IE1vZGUgSW5jb21pbmcgTWFpbGJveCBzdHJ1Y3R1cmUuCisqLworCitzdHJ1Y3QgQnVzTG9naWNfSW5jb21pbmdNYWlsYm94IHsKKwl1MzIgQ0NCOwkJLyogQnl0ZXMgMC0zICovCisJZW51bSBCdXNMb2dpY19Ib3N0QWRhcHRlclN0YXR1cyBIb3N0QWRhcHRlclN0YXR1czsJLyogQnl0ZSA0ICovCisJZW51bSBCdXNMb2dpY19UYXJnZXREZXZpY2VTdGF0dXMgVGFyZ2V0RGV2aWNlU3RhdHVzOwkvKiBCeXRlIDUgKi8KKwl1bnNpZ25lZCBjaGFyOjg7CS8qIEJ5dGUgNiAqLworCWVudW0gQnVzTG9naWNfQ29tcGxldGlvbkNvZGUgQ29tcGxldGlvbkNvZGU7CS8qIEJ5dGUgNyAqLworfTsKKworCisvKgorICBEZWZpbmUgdGhlIEJ1c0xvZ2ljIERyaXZlciBPcHRpb25zIHN0cnVjdHVyZS4KKyovCisKK3N0cnVjdCBCdXNMb2dpY19Ecml2ZXJPcHRpb25zIHsKKwl1bnNpZ25lZCBzaG9ydCBUYWdnZWRRdWV1aW5nUGVybWl0dGVkOworCXVuc2lnbmVkIHNob3J0IFRhZ2dlZFF1ZXVpbmdQZXJtaXR0ZWRNYXNrOworCXVuc2lnbmVkIHNob3J0IEJ1c1NldHRsZVRpbWU7CisJc3RydWN0IEJ1c0xvZ2ljX0xvY2FsT3B0aW9ucyBMb2NhbE9wdGlvbnM7CisJdW5zaWduZWQgY2hhciBDb21tb25RdWV1ZURlcHRoOworCXVuc2lnbmVkIGNoYXIgUXVldWVEZXB0aFtCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzXTsKK307CisKKy8qCisgIERlZmluZSB0aGUgSG9zdCBBZGFwdGVyIFRhcmdldCBGbGFncyBzdHJ1Y3R1cmUuCisqLworCitzdHJ1Y3QgQnVzTG9naWNfVGFyZ2V0RmxhZ3MgeworCWJvb2xlYW4gVGFyZ2V0RXhpc3RzOjE7CisJYm9vbGVhbiBUYWdnZWRRdWV1aW5nU3VwcG9ydGVkOjE7CisJYm9vbGVhbiBXaWRlVHJhbnNmZXJzU3VwcG9ydGVkOjE7CisJYm9vbGVhbiBUYWdnZWRRdWV1aW5nQWN0aXZlOjE7CisJYm9vbGVhbiBXaWRlVHJhbnNmZXJzQWN0aXZlOjE7CisJYm9vbGVhbiBDb21tYW5kU3VjY2Vzc2Z1bEZsYWc6MTsKKwlib29sZWFuIFRhcmdldEluZm9SZXBvcnRlZDoxOworfTsKKworLyoKKyAgRGVmaW5lIHRoZSBIb3N0IEFkYXB0ZXIgVGFyZ2V0IFN0YXRpc3RpY3Mgc3RydWN0dXJlLgorKi8KKworI2RlZmluZSBCdXNMb2dpY19TaXplQnVja2V0cwkJCTEwCisKK3R5cGVkZWYgdW5zaWduZWQgaW50IEJ1c0xvZ2ljX0NvbW1hbmRTaXplQnVja2V0c19UW0J1c0xvZ2ljX1NpemVCdWNrZXRzXTsKKworc3RydWN0IEJ1c0xvZ2ljX1RhcmdldFN0YXRpc3RpY3MgeworCXVuc2lnbmVkIGludCBDb21tYW5kc0F0dGVtcHRlZDsKKwl1bnNpZ25lZCBpbnQgQ29tbWFuZHNDb21wbGV0ZWQ7CisJdW5zaWduZWQgaW50IFJlYWRDb21tYW5kczsKKwl1bnNpZ25lZCBpbnQgV3JpdGVDb21tYW5kczsKKwlzdHJ1Y3QgQnVzTG9naWNfQnl0ZUNvdW50ZXIgVG90YWxCeXRlc1JlYWQ7CisJc3RydWN0IEJ1c0xvZ2ljX0J5dGVDb3VudGVyIFRvdGFsQnl0ZXNXcml0dGVuOworCUJ1c0xvZ2ljX0NvbW1hbmRTaXplQnVja2V0c19UIFJlYWRDb21tYW5kU2l6ZUJ1Y2tldHM7CisJQnVzTG9naWNfQ29tbWFuZFNpemVCdWNrZXRzX1QgV3JpdGVDb21tYW5kU2l6ZUJ1Y2tldHM7CisJdW5zaWduZWQgc2hvcnQgQ29tbWFuZEFib3J0c1JlcXVlc3RlZDsKKwl1bnNpZ25lZCBzaG9ydCBDb21tYW5kQWJvcnRzQXR0ZW1wdGVkOworCXVuc2lnbmVkIHNob3J0IENvbW1hbmRBYm9ydHNDb21wbGV0ZWQ7CisJdW5zaWduZWQgc2hvcnQgQnVzRGV2aWNlUmVzZXRzUmVxdWVzdGVkOworCXVuc2lnbmVkIHNob3J0IEJ1c0RldmljZVJlc2V0c0F0dGVtcHRlZDsKKwl1bnNpZ25lZCBzaG9ydCBCdXNEZXZpY2VSZXNldHNDb21wbGV0ZWQ7CisJdW5zaWduZWQgc2hvcnQgSG9zdEFkYXB0ZXJSZXNldHNSZXF1ZXN0ZWQ7CisJdW5zaWduZWQgc2hvcnQgSG9zdEFkYXB0ZXJSZXNldHNBdHRlbXB0ZWQ7CisJdW5zaWduZWQgc2hvcnQgSG9zdEFkYXB0ZXJSZXNldHNDb21wbGV0ZWQ7Cit9OworCisvKgorICBEZWZpbmUgdGhlIEZsYXNoUG9pbnQgQ2FyZCBIYW5kbGUgZGF0YSB0eXBlLgorKi8KKworI2RlZmluZSBGbGFzaFBvaW50X0JhZENhcmRIYW5kbGUJCTB4RkZGRkZGRkYKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgRmxhc2hQb2ludF9DYXJkSGFuZGxlX1Q7CisKKworLyoKKyAgRGVmaW5lIHRoZSBGbGFzaFBvaW50IEluZm9ybWF0aW9uIHN0cnVjdHVyZS4gIFRoaXMgc3RydWN0dXJlIGlzIGRlZmluZWQKKyAgYnkgdGhlIEZsYXNoUG9pbnQgU0NDQiBNYW5hZ2VyLgorKi8KKworc3RydWN0IEZsYXNoUG9pbnRfSW5mbyB7CisJdTMyIEJhc2VBZGRyZXNzOwkvKiBCeXRlcyAwLTMgKi8KKwlib29sZWFuIFByZXNlbnQ7CS8qIEJ5dGUgNCAqLworCXVuc2lnbmVkIGNoYXIgSVJRX0NoYW5uZWw7CS8qIEJ5dGUgNSAqLworCXVuc2lnbmVkIGNoYXIgU0NTSV9JRDsJLyogQnl0ZSA2ICovCisJdW5zaWduZWQgY2hhciBTQ1NJX0xVTjsJLyogQnl0ZSA3ICovCisJdW5zaWduZWQgc2hvcnQgRmlybXdhcmVSZXZpc2lvbjsJLyogQnl0ZXMgOC05ICovCisJdW5zaWduZWQgc2hvcnQgU3luY2hyb25vdXNQZXJtaXR0ZWQ7CS8qIEJ5dGVzIDEwLTExICovCisJdW5zaWduZWQgc2hvcnQgRmFzdFBlcm1pdHRlZDsJLyogQnl0ZXMgMTItMTMgKi8KKwl1bnNpZ25lZCBzaG9ydCBVbHRyYVBlcm1pdHRlZDsJLyogQnl0ZXMgMTQtMTUgKi8KKwl1bnNpZ25lZCBzaG9ydCBEaXNjb25uZWN0UGVybWl0dGVkOwkvKiBCeXRlcyAxNi0xNyAqLworCXVuc2lnbmVkIHNob3J0IFdpZGVQZXJtaXR0ZWQ7CS8qIEJ5dGVzIDE4LTE5ICovCisJYm9vbGVhbiBQYXJpdHlDaGVja2luZ0VuYWJsZWQ6MTsJLyogQnl0ZSAyMCBCaXQgMCAqLworCWJvb2xlYW4gSG9zdFdpZGVTQ1NJOjE7CS8qIEJ5dGUgMjAgQml0IDEgKi8KKwlib29sZWFuIEhvc3RTb2Z0UmVzZXQ6MTsJLyogQnl0ZSAyMCBCaXQgMiAqLworCWJvb2xlYW4gRXh0ZW5kZWRUcmFuc2xhdGlvbkVuYWJsZWQ6MTsJLyogQnl0ZSAyMCBCaXQgMyAqLworCWJvb2xlYW4gTG93Qnl0ZVRlcm1pbmF0ZWQ6MTsJLyogQnl0ZSAyMCBCaXQgNCAqLworCWJvb2xlYW4gSGlnaEJ5dGVUZXJtaW5hdGVkOjE7CS8qIEJ5dGUgMjAgQml0IDUgKi8KKwlib29sZWFuIFJlcG9ydERhdGFVbmRlcnJ1bjoxOwkvKiBCeXRlIDIwIEJpdCA2ICovCisJYm9vbGVhbiBTQ0FNX0VuYWJsZWQ6MTsJLyogQnl0ZSAyMCBCaXQgNyAqLworCWJvb2xlYW4gU0NBTV9MZXZlbDI6MTsJLyogQnl0ZSAyMSBCaXQgMCAqLworCXVuc2lnbmVkIGNoYXI6NzsJLyogQnl0ZSAyMSBCaXRzIDEtNyAqLworCXVuc2lnbmVkIGNoYXIgRmFtaWx5OwkvKiBCeXRlIDIyICovCisJdW5zaWduZWQgY2hhciBCdXNUeXBlOwkvKiBCeXRlIDIzICovCisJdW5zaWduZWQgY2hhciBNb2RlbE51bWJlclszXTsJLyogQnl0ZXMgMjQtMjYgKi8KKwl1bnNpZ25lZCBjaGFyIFJlbGF0aXZlQ2FyZE51bWJlcjsJLyogQnl0ZSAyNyAqLworCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWRbNF07CS8qIEJ5dGVzIDI4LTMxICovCisJdW5zaWduZWQgaW50IE9TX1Jlc2VydmVkOwkvKiBCeXRlcyAzMi0zNSAqLworCXVuc2lnbmVkIGNoYXIgVHJhbnNsYXRpb25JbmZvWzRdOwkvKiBCeXRlcyAzNi0zOSAqLworCXVuc2lnbmVkIGludCBSZXNlcnZlZDJbNV07CS8qIEJ5dGVzIDQwLTU5ICovCisJdW5zaWduZWQgaW50IFNlY29uZGFyeVJhbmdlOwkvKiBCeXRlcyA2MC02MyAqLworfTsKKworLyoKKyAgRGVmaW5lIHRoZSBCdXNMb2dpYyBEcml2ZXIgSG9zdCBBZGFwdGVyIHN0cnVjdHVyZS4KKyovCisKK3N0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciB7CisJc3RydWN0IFNjc2lfSG9zdCAqU0NTSV9Ib3N0OworCXN0cnVjdCBwY2lfZGV2ICpQQ0lfRGV2aWNlOworCWVudW0gQnVzTG9naWNfSG9zdEFkYXB0ZXJUeXBlIEhvc3RBZGFwdGVyVHlwZTsKKwllbnVtIEJ1c0xvZ2ljX0hvc3RBZGFwdGVyQnVzVHlwZSBIb3N0QWRhcHRlckJ1c1R5cGU7CisJdW5zaWduZWQgbG9uZyBJT19BZGRyZXNzOworCXVuc2lnbmVkIGxvbmcgUENJX0FkZHJlc3M7CisJdW5zaWduZWQgc2hvcnQgQWRkcmVzc0NvdW50OworCXVuc2lnbmVkIGNoYXIgSG9zdE51bWJlcjsKKwl1bnNpZ25lZCBjaGFyIE1vZGVsTmFtZVs5XTsKKwl1bnNpZ25lZCBjaGFyIEZpcm13YXJlVmVyc2lvbls2XTsKKwl1bnNpZ25lZCBjaGFyIEZ1bGxNb2RlbE5hbWVbMThdOworCXVuc2lnbmVkIGNoYXIgQnVzOworCXVuc2lnbmVkIGNoYXIgRGV2aWNlOworCXVuc2lnbmVkIGNoYXIgSVJRX0NoYW5uZWw7CisJdW5zaWduZWQgY2hhciBETUFfQ2hhbm5lbDsKKwl1bnNpZ25lZCBjaGFyIFNDU0lfSUQ7CisJYm9vbGVhbiBJUlFfQ2hhbm5lbEFjcXVpcmVkOjE7CisJYm9vbGVhbiBETUFfQ2hhbm5lbEFjcXVpcmVkOjE7CisJYm9vbGVhbiBFeHRlbmRlZFRyYW5zbGF0aW9uRW5hYmxlZDoxOworCWJvb2xlYW4gUGFyaXR5Q2hlY2tpbmdFbmFibGVkOjE7CisJYm9vbGVhbiBCdXNSZXNldEVuYWJsZWQ6MTsKKwlib29sZWFuIExldmVsU2Vuc2l0aXZlSW50ZXJydXB0OjE7CisJYm9vbGVhbiBIb3N0V2lkZVNDU0k6MTsKKwlib29sZWFuIEhvc3REaWZmZXJlbnRpYWxTQ1NJOjE7CisJYm9vbGVhbiBIb3N0U3VwcG9ydHNTQ0FNOjE7CisJYm9vbGVhbiBIb3N0VWx0cmFTQ1NJOjE7CisJYm9vbGVhbiBFeHRlbmRlZExVTlN1cHBvcnQ6MTsKKwlib29sZWFuIFRlcm1pbmF0aW9uSW5mb1ZhbGlkOjE7CisJYm9vbGVhbiBMb3dCeXRlVGVybWluYXRlZDoxOworCWJvb2xlYW4gSGlnaEJ5dGVUZXJtaW5hdGVkOjE7CisJYm9vbGVhbiBCb3VuY2VCdWZmZXJzUmVxdWlyZWQ6MTsKKwlib29sZWFuIFN0cmljdFJvdW5kUm9iaW5Nb2RlU3VwcG9ydDoxOworCWJvb2xlYW4gU0NBTV9FbmFibGVkOjE7CisJYm9vbGVhbiBTQ0FNX0xldmVsMjoxOworCWJvb2xlYW4gSG9zdEFkYXB0ZXJJbml0aWFsaXplZDoxOworCWJvb2xlYW4gSG9zdEFkYXB0ZXJFeHRlcm5hbFJlc2V0OjE7CisJYm9vbGVhbiBIb3N0QWRhcHRlckludGVybmFsRXJyb3I6MTsKKwlib29sZWFuIFByb2Nlc3NDb21wbGV0ZWRDQ0JzQWN0aXZlOworCXZvbGF0aWxlIGJvb2xlYW4gSG9zdEFkYXB0ZXJDb21tYW5kQ29tcGxldGVkOworCXVuc2lnbmVkIHNob3J0IEhvc3RBZGFwdGVyU2NhdHRlckdhdGhlckxpbWl0OworCXVuc2lnbmVkIHNob3J0IERyaXZlclNjYXR0ZXJHYXRoZXJMaW1pdDsKKwl1bnNpZ25lZCBzaG9ydCBNYXhUYXJnZXREZXZpY2VzOworCXVuc2lnbmVkIHNob3J0IE1heExvZ2ljYWxVbml0czsKKwl1bnNpZ25lZCBzaG9ydCBNYWlsYm94Q291bnQ7CisJdW5zaWduZWQgc2hvcnQgSW5pdGlhbENDQnM7CisJdW5zaWduZWQgc2hvcnQgSW5jcmVtZW50YWxDQ0JzOworCXVuc2lnbmVkIHNob3J0IEFsbG9jYXRlZENDQnM7CisJdW5zaWduZWQgc2hvcnQgRHJpdmVyUXVldWVEZXB0aDsKKwl1bnNpZ25lZCBzaG9ydCBIb3N0QWRhcHRlclF1ZXVlRGVwdGg7CisJdW5zaWduZWQgc2hvcnQgVW50YWdnZWRRdWV1ZURlcHRoOworCXVuc2lnbmVkIHNob3J0IENvbW1vblF1ZXVlRGVwdGg7CisJdW5zaWduZWQgc2hvcnQgQnVzU2V0dGxlVGltZTsKKwl1bnNpZ25lZCBzaG9ydCBTeW5jaHJvbm91c1Blcm1pdHRlZDsKKwl1bnNpZ25lZCBzaG9ydCBGYXN0UGVybWl0dGVkOworCXVuc2lnbmVkIHNob3J0IFVsdHJhUGVybWl0dGVkOworCXVuc2lnbmVkIHNob3J0IFdpZGVQZXJtaXR0ZWQ7CisJdW5zaWduZWQgc2hvcnQgRGlzY29ubmVjdFBlcm1pdHRlZDsKKwl1bnNpZ25lZCBzaG9ydCBUYWdnZWRRdWV1aW5nUGVybWl0dGVkOworCXVuc2lnbmVkIHNob3J0IEV4dGVybmFsSG9zdEFkYXB0ZXJSZXNldHM7CisJdW5zaWduZWQgc2hvcnQgSG9zdEFkYXB0ZXJJbnRlcm5hbEVycm9yczsKKwl1bnNpZ25lZCBzaG9ydCBUYXJnZXREZXZpY2VDb3VudDsKKwl1bnNpZ25lZCBzaG9ydCBNZXNzYWdlQnVmZmVyTGVuZ3RoOworCXUzMiBCSU9TX0FkZHJlc3M7CisJc3RydWN0IEJ1c0xvZ2ljX0RyaXZlck9wdGlvbnMgKkRyaXZlck9wdGlvbnM7CisJc3RydWN0IEZsYXNoUG9pbnRfSW5mbyBGbGFzaFBvaW50SW5mbzsKKwlGbGFzaFBvaW50X0NhcmRIYW5kbGVfVCBDYXJkSGFuZGxlOworCXN0cnVjdCBsaXN0X2hlYWQgaG9zdF9saXN0OworCXN0cnVjdCBCdXNMb2dpY19DQ0IgKkFsbF9DQ0JzOworCXN0cnVjdCBCdXNMb2dpY19DQ0IgKkZyZWVfQ0NCczsKKwlzdHJ1Y3QgQnVzTG9naWNfQ0NCICpGaXJzdENvbXBsZXRlZENDQjsKKwlzdHJ1Y3QgQnVzTG9naWNfQ0NCICpMYXN0Q29tcGxldGVkQ0NCOworCXN0cnVjdCBCdXNMb2dpY19DQ0IgKkJ1c0RldmljZVJlc2V0UGVuZGluZ0NDQltCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzXTsKKwlzdHJ1Y3QgQnVzTG9naWNfVGFyZ2V0RmxhZ3MgVGFyZ2V0RmxhZ3NbQnVzTG9naWNfTWF4VGFyZ2V0RGV2aWNlc107CisJdW5zaWduZWQgY2hhciBRdWV1ZURlcHRoW0J1c0xvZ2ljX01heFRhcmdldERldmljZXNdOworCXVuc2lnbmVkIGNoYXIgU3luY2hyb25vdXNQZXJpb2RbQnVzTG9naWNfTWF4VGFyZ2V0RGV2aWNlc107CisJdW5zaWduZWQgY2hhciBTeW5jaHJvbm91c09mZnNldFtCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzXTsKKwl1bnNpZ25lZCBjaGFyIEFjdGl2ZUNvbW1hbmRzW0J1c0xvZ2ljX01heFRhcmdldERldmljZXNdOworCXVuc2lnbmVkIGludCBDb21tYW5kc1NpbmNlUmVzZXRbQnVzTG9naWNfTWF4VGFyZ2V0RGV2aWNlc107CisJdW5zaWduZWQgbG9uZyBMYXN0U2VxdWVuY2VQb2ludFtCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzXTsKKwl1bnNpZ25lZCBsb25nIExhc3RSZXNldEF0dGVtcHRlZFtCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzXTsKKwl1bnNpZ25lZCBsb25nIExhc3RSZXNldENvbXBsZXRlZFtCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzXTsKKwlzdHJ1Y3QgQnVzTG9naWNfT3V0Z29pbmdNYWlsYm94ICpGaXJzdE91dGdvaW5nTWFpbGJveDsKKwlzdHJ1Y3QgQnVzTG9naWNfT3V0Z29pbmdNYWlsYm94ICpMYXN0T3V0Z29pbmdNYWlsYm94OworCXN0cnVjdCBCdXNMb2dpY19PdXRnb2luZ01haWxib3ggKk5leHRPdXRnb2luZ01haWxib3g7CisJc3RydWN0IEJ1c0xvZ2ljX0luY29taW5nTWFpbGJveCAqRmlyc3RJbmNvbWluZ01haWxib3g7CisJc3RydWN0IEJ1c0xvZ2ljX0luY29taW5nTWFpbGJveCAqTGFzdEluY29taW5nTWFpbGJveDsKKwlzdHJ1Y3QgQnVzTG9naWNfSW5jb21pbmdNYWlsYm94ICpOZXh0SW5jb21pbmdNYWlsYm94OworCXN0cnVjdCBCdXNMb2dpY19UYXJnZXRTdGF0aXN0aWNzIFRhcmdldFN0YXRpc3RpY3NbQnVzTG9naWNfTWF4VGFyZ2V0RGV2aWNlc107CisJdW5zaWduZWQgY2hhciAqTWFpbGJveFNwYWNlOworCWRtYV9hZGRyX3QgTWFpbGJveFNwYWNlSGFuZGxlOworCXVuc2lnbmVkIGludCBNYWlsYm94U2l6ZTsKKwl1bnNpZ25lZCBsb25nIENDQl9PZmZzZXQ7CisJY2hhciBNZXNzYWdlQnVmZmVyW0J1c0xvZ2ljX01lc3NhZ2VCdWZmZXJTaXplXTsKK307CisKKy8qCisgIERlZmluZSBhIHN0cnVjdHVyZSBmb3IgdGhlIEJJT1MgRGlzayBQYXJhbWV0ZXJzLgorKi8KKworc3RydWN0IEJJT1NfRGlza1BhcmFtZXRlcnMgeworCWludCBIZWFkczsKKwlpbnQgU2VjdG9yczsKKwlpbnQgQ3lsaW5kZXJzOworfTsKKworLyoKKyAgRGVmaW5lIGEgc3RydWN0dXJlIGZvciB0aGUgU0NTSSBJbnF1aXJ5IGNvbW1hbmQgcmVzdWx0cy4KKyovCisKK3N0cnVjdCBTQ1NJX0lucXVpcnkgeworCXVuc2lnbmVkIGNoYXIgUGVyaXBoZXJhbERldmljZVR5cGU6NTsJLyogQnl0ZSAwIEJpdHMgMC00ICovCisJdW5zaWduZWQgY2hhciBQZXJpcGhlcmFsUXVhbGlmaWVyOjM7CS8qIEJ5dGUgMCBCaXRzIDUtNyAqLworCXVuc2lnbmVkIGNoYXIgRGV2aWNlVHlwZU1vZGlmaWVyOjc7CS8qIEJ5dGUgMSBCaXRzIDAtNiAqLworCWJvb2xlYW4gUk1COjE7CQkvKiBCeXRlIDEgQml0IDcgKi8KKwl1bnNpZ25lZCBjaGFyIEFOU0lfQXBwcm92ZWRWZXJzaW9uOjM7CS8qIEJ5dGUgMiBCaXRzIDAtMiAqLworCXVuc2lnbmVkIGNoYXIgRUNNQV9WZXJzaW9uOjM7CS8qIEJ5dGUgMiBCaXRzIDMtNSAqLworCXVuc2lnbmVkIGNoYXIgSVNPX1ZlcnNpb246MjsJLyogQnl0ZSAyIEJpdHMgNi03ICovCisJdW5zaWduZWQgY2hhciBSZXNwb25zZURhdGFGb3JtYXQ6NDsJLyogQnl0ZSAzIEJpdHMgMC0zICovCisJdW5zaWduZWQgY2hhcjoyOwkvKiBCeXRlIDMgQml0cyA0LTUgKi8KKwlib29sZWFuIFRybUlPUDoxOwkvKiBCeXRlIDMgQml0IDYgKi8KKwlib29sZWFuIEFFTkM6MTsJCS8qIEJ5dGUgMyBCaXQgNyAqLworCXVuc2lnbmVkIGNoYXIgQWRkaXRpb25hbExlbmd0aDsJLyogQnl0ZSA0ICovCisJdW5zaWduZWQgY2hhcjo4OwkvKiBCeXRlIDUgKi8KKwl1bnNpZ25lZCBjaGFyOjg7CS8qIEJ5dGUgNiAqLworCWJvb2xlYW4gU2Z0UmU6MTsJLyogQnl0ZSA3IEJpdCAwICovCisJYm9vbGVhbiBDbWRRdWU6MTsJLyogQnl0ZSA3IEJpdCAxICovCisJIGJvb2xlYW46MTsJCS8qIEJ5dGUgNyBCaXQgMiAqLworCWJvb2xlYW4gTGlua2VkOjE7CS8qIEJ5dGUgNyBCaXQgMyAqLworCWJvb2xlYW4gU3luYzoxOwkJLyogQnl0ZSA3IEJpdCA0ICovCisJYm9vbGVhbiBXQnVzMTY6MTsJLyogQnl0ZSA3IEJpdCA1ICovCisJYm9vbGVhbiBXQnVzMzI6MTsJLyogQnl0ZSA3IEJpdCA2ICovCisJYm9vbGVhbiBSZWxBZHI6MTsJLyogQnl0ZSA3IEJpdCA3ICovCisJdW5zaWduZWQgY2hhciBWZW5kb3JJZGVudGlmaWNhdGlvbls4XTsJLyogQnl0ZXMgOC0xNSAqLworCXVuc2lnbmVkIGNoYXIgUHJvZHVjdElkZW50aWZpY2F0aW9uWzE2XTsJLyogQnl0ZXMgMTYtMzEgKi8KKwl1bnNpZ25lZCBjaGFyIFByb2R1Y3RSZXZpc2lvbkxldmVsWzRdOwkvKiBCeXRlcyAzMi0zNSAqLworfTsKKworCisvKgorICBEZWZpbmUgZnVuY3Rpb25zIHRvIHByb3ZpZGUgYW4gYWJzdHJhY3Rpb24gZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgdGhlCisgIEhvc3QgQWRhcHRlciBJL08gUmVnaXN0ZXJzLgorKi8KKworc3RhdGljIGlubGluZSB2b2lkIEJ1c0xvZ2ljX1NDU0lCdXNSZXNldChzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyKQoreworCXVuaW9uIEJ1c0xvZ2ljX0NvbnRyb2xSZWdpc3RlciBDb250cm9sUmVnaXN0ZXI7CisJQ29udHJvbFJlZ2lzdGVyLkFsbCA9IDA7CisJQ29udHJvbFJlZ2lzdGVyLmNyLlNDU0lCdXNSZXNldCA9IHRydWU7CisJb3V0YihDb250cm9sUmVnaXN0ZXIuQWxsLCBIb3N0QWRhcHRlci0+SU9fQWRkcmVzcyArIEJ1c0xvZ2ljX0NvbnRyb2xSZWdpc3Rlck9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBCdXNMb2dpY19JbnRlcnJ1cHRSZXNldChzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyKQoreworCXVuaW9uIEJ1c0xvZ2ljX0NvbnRyb2xSZWdpc3RlciBDb250cm9sUmVnaXN0ZXI7CisJQ29udHJvbFJlZ2lzdGVyLkFsbCA9IDA7CisJQ29udHJvbFJlZ2lzdGVyLmNyLkludGVycnVwdFJlc2V0ID0gdHJ1ZTsKKwlvdXRiKENvbnRyb2xSZWdpc3Rlci5BbGwsIEhvc3RBZGFwdGVyLT5JT19BZGRyZXNzICsgQnVzTG9naWNfQ29udHJvbFJlZ2lzdGVyT2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEJ1c0xvZ2ljX1NvZnRSZXNldChzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyKQoreworCXVuaW9uIEJ1c0xvZ2ljX0NvbnRyb2xSZWdpc3RlciBDb250cm9sUmVnaXN0ZXI7CisJQ29udHJvbFJlZ2lzdGVyLkFsbCA9IDA7CisJQ29udHJvbFJlZ2lzdGVyLmNyLlNvZnRSZXNldCA9IHRydWU7CisJb3V0YihDb250cm9sUmVnaXN0ZXIuQWxsLCBIb3N0QWRhcHRlci0+SU9fQWRkcmVzcyArIEJ1c0xvZ2ljX0NvbnRyb2xSZWdpc3Rlck9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBCdXNMb2dpY19IYXJkUmVzZXQoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlcikKK3sKKwl1bmlvbiBCdXNMb2dpY19Db250cm9sUmVnaXN0ZXIgQ29udHJvbFJlZ2lzdGVyOworCUNvbnRyb2xSZWdpc3Rlci5BbGwgPSAwOworCUNvbnRyb2xSZWdpc3Rlci5jci5IYXJkUmVzZXQgPSB0cnVlOworCW91dGIoQ29udHJvbFJlZ2lzdGVyLkFsbCwgSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MgKyBCdXNMb2dpY19Db250cm9sUmVnaXN0ZXJPZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgQnVzTG9naWNfUmVhZFN0YXR1c1JlZ2lzdGVyKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIpCit7CisJcmV0dXJuIGluYihIb3N0QWRhcHRlci0+SU9fQWRkcmVzcyArIEJ1c0xvZ2ljX1N0YXR1c1JlZ2lzdGVyT2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEJ1c0xvZ2ljX1dyaXRlQ29tbWFuZFBhcmFtZXRlclJlZ2lzdGVyKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlcgorCQkJCQkJCSAgKkhvc3RBZGFwdGVyLCB1bnNpZ25lZCBjaGFyIFZhbHVlKQoreworCW91dGIoVmFsdWUsIEhvc3RBZGFwdGVyLT5JT19BZGRyZXNzICsgQnVzTG9naWNfQ29tbWFuZFBhcmFtZXRlclJlZ2lzdGVyT2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIEJ1c0xvZ2ljX1JlYWREYXRhSW5SZWdpc3RlcihzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyKQoreworCXJldHVybiBpbmIoSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MgKyBCdXNMb2dpY19EYXRhSW5SZWdpc3Rlck9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBCdXNMb2dpY19SZWFkSW50ZXJydXB0UmVnaXN0ZXIoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlcikKK3sKKwlyZXR1cm4gaW5iKEhvc3RBZGFwdGVyLT5JT19BZGRyZXNzICsgQnVzTG9naWNfSW50ZXJydXB0UmVnaXN0ZXJPZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgQnVzTG9naWNfUmVhZEdlb21ldHJ5UmVnaXN0ZXIoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlcikKK3sKKwlyZXR1cm4gaW5iKEhvc3RBZGFwdGVyLT5JT19BZGRyZXNzICsgQnVzTG9naWNfR2VvbWV0cnlSZWdpc3Rlck9mZnNldCk7Cit9CisKKy8qCisgIEJ1c0xvZ2ljX1N0YXJ0TWFpbGJveENvbW1hbmQgaXNzdWVzIGFuIEV4ZWN1dGUgTWFpbGJveCBDb21tYW5kLCB3aGljaAorICBub3RpZmllcyB0aGUgSG9zdCBBZGFwdGVyIHRoYXQgYW4gZW50cnkgaGFzIGJlZW4gbWFkZSBpbiBhbiBPdXRnb2luZworICBNYWlsYm94LgorKi8KKworc3RhdGljIGlubGluZSB2b2lkIEJ1c0xvZ2ljX1N0YXJ0TWFpbGJveENvbW1hbmQoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlcikKK3sKKwlCdXNMb2dpY19Xcml0ZUNvbW1hbmRQYXJhbWV0ZXJSZWdpc3RlcihIb3N0QWRhcHRlciwgQnVzTG9naWNfRXhlY3V0ZU1haWxib3hDb21tYW5kKTsKK30KKworLyoKKyAgQnVzTG9naWNfRGVsYXkgd2FpdHMgZm9yIFNlY29uZHMgdG8gZWxhcHNlLgorKi8KKworc3RhdGljIGlubGluZSB2b2lkIEJ1c0xvZ2ljX0RlbGF5KGludCBTZWNvbmRzKQoreworCW1kZWxheSgxMDAwICogU2Vjb25kcyk7Cit9CisKKy8qCisgIFZpcnR1YWxfdG9fQnVzIGFuZCBCdXNfdG9fVmlydHVhbCBtYXAgYmV0d2VlbiBLZXJuZWwgVmlydHVhbCBBZGRyZXNzZXMKKyAgYW5kIFBDSS9WTEIvRUlTQS9JU0EgQnVzIEFkZHJlc3Nlcy4KKyovCisKK3N0YXRpYyBpbmxpbmUgdTMyIFZpcnR1YWxfdG9fQnVzKHZvaWQgKlZpcnR1YWxBZGRyZXNzKQoreworCXJldHVybiAodTMyKSB2aXJ0X3RvX2J1cyhWaXJ0dWFsQWRkcmVzcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqQnVzX3RvX1ZpcnR1YWwodTMyIEJ1c0FkZHJlc3MpCit7CisJcmV0dXJuICh2b2lkICopIGJ1c190b192aXJ0KEJ1c0FkZHJlc3MpOworfQorCisvKgorICBWaXJ0dWFsX3RvXzMyQml0X1ZpcnR1YWwgbWFwcyBiZXR3ZWVuIEtlcm5lbCBWaXJ0dWFsIEFkZHJlc3NlcyBhbmQKKyAgMzIgYml0IEtlcm5lbCBWaXJ0dWFsIEFkZHJlc3Nlcy4gIFRoaXMgYXZvaWRzIGNvbXBpbGF0aW9uIHdhcm5pbmdzCisgIG9uIDY0IGJpdCBhcmNoaXRlY3R1cmVzLgorKi8KKworc3RhdGljIGlubGluZSB1MzIgVmlydHVhbF90b18zMkJpdF9WaXJ0dWFsKHZvaWQgKlZpcnR1YWxBZGRyZXNzKQoreworCXJldHVybiAodTMyKSAodW5zaWduZWQgbG9uZykgVmlydHVhbEFkZHJlc3M7Cit9CisKKy8qCisgIEJ1c0xvZ2ljX0luY3JlbWVudEVycm9yQ291bnRlciBpbmNyZW1lbnRzIEVycm9yIENvdW50ZXIgYnkgMSwgc3RvcHBpbmcgYXQKKyAgNjU1MzUgcmF0aGVyIHRoYW4gd3JhcHBpbmcgYXJvdW5kIHRvIDAuCisqLworCitzdGF0aWMgaW5saW5lIHZvaWQgQnVzTG9naWNfSW5jcmVtZW50RXJyb3JDb3VudGVyKHVuc2lnbmVkIHNob3J0ICpFcnJvckNvdW50ZXIpCit7CisJaWYgKCpFcnJvckNvdW50ZXIgPCA2NTUzNSkKKwkJKCpFcnJvckNvdW50ZXIpKys7Cit9CisKKy8qCisgIEJ1c0xvZ2ljX0luY3JlbWVudEJ5dGVDb3VudGVyIGluY3JlbWVudHMgQnl0ZSBDb3VudGVyIGJ5IEFtb3VudC4KKyovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBCdXNMb2dpY19JbmNyZW1lbnRCeXRlQ291bnRlcihzdHJ1Y3QgQnVzTG9naWNfQnl0ZUNvdW50ZXIKKwkJCQkJCSAqQnl0ZUNvdW50ZXIsIHVuc2lnbmVkIGludCBBbW91bnQpCit7CisJQnl0ZUNvdW50ZXItPlVuaXRzICs9IEFtb3VudDsKKwlpZiAoQnl0ZUNvdW50ZXItPlVuaXRzID4gOTk5OTk5OTk5KSB7CisJCUJ5dGVDb3VudGVyLT5Vbml0cyAtPSAxMDAwMDAwMDAwOworCQlCeXRlQ291bnRlci0+QmlsbGlvbnMrKzsKKwl9Cit9CisKKy8qCisgIEJ1c0xvZ2ljX0luY3JlbWVudFNpemVCdWNrZXQgaW5jcmVtZW50cyB0aGUgQnVja2V0IGZvciBBbW91bnQuCisqLworCitzdGF0aWMgaW5saW5lIHZvaWQgQnVzTG9naWNfSW5jcmVtZW50U2l6ZUJ1Y2tldChCdXNMb2dpY19Db21tYW5kU2l6ZUJ1Y2tldHNfVCBDb21tYW5kU2l6ZUJ1Y2tldHMsIHVuc2lnbmVkIGludCBBbW91bnQpCit7CisJaW50IEluZGV4ID0gMDsKKwlpZiAoQW1vdW50IDwgOCAqIDEwMjQpIHsKKwkJaWYgKEFtb3VudCA8IDIgKiAxMDI0KQorCQkJSW5kZXggPSAoQW1vdW50IDwgMSAqIDEwMjQgPyAwIDogMSk7CisJCWVsc2UKKwkJCUluZGV4ID0gKEFtb3VudCA8IDQgKiAxMDI0ID8gMiA6IDMpOworCX0gZWxzZSBpZiAoQW1vdW50IDwgMTI4ICogMTAyNCkgeworCQlpZiAoQW1vdW50IDwgMzIgKiAxMDI0KQorCQkJSW5kZXggPSAoQW1vdW50IDwgMTYgKiAxMDI0ID8gNCA6IDUpOworCQllbHNlCisJCQlJbmRleCA9IChBbW91bnQgPCA2NCAqIDEwMjQgPyA2IDogNyk7CisJfSBlbHNlCisJCUluZGV4ID0gKEFtb3VudCA8IDI1NiAqIDEwMjQgPyA4IDogOSk7CisJQ29tbWFuZFNpemVCdWNrZXRzW0luZGV4XSsrOworfQorCisvKgorICBEZWZpbmUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBGbGFzaFBvaW50IEZpcm13YXJlIChTQ0NCIE1hbmFnZXIpLgorKi8KKworI2RlZmluZSBGbGFzaFBvaW50X0Zpcm13YXJlVmVyc2lvbgkJIjUuMDIiCisKKy8qCisgIERlZmluZSB0aGUgcG9zc2libGUgcmV0dXJuIHZhbHVlcyBmcm9tIEZsYXNoUG9pbnRfSGFuZGxlSW50ZXJydXB0LgorKi8KKworI2RlZmluZSBGbGFzaFBvaW50X05vcm1hbEludGVycnVwdAkJMHgwMAorI2RlZmluZSBGbGFzaFBvaW50X0ludGVybmFsRXJyb3IJCTB4RkUKKyNkZWZpbmUgRmxhc2hQb2ludF9FeHRlcm5hbEJ1c1Jlc2V0CQkweEZGCisKKy8qCisgIERlZmluZSBwcm90b3R5cGVzIGZvciB0aGUgZm9yd2FyZCByZWZlcmVuY2VkIEJ1c0xvZ2ljIERyaXZlcgorICBJbnRlcm5hbCBGdW5jdGlvbnMuCisqLworCitzdGF0aWMgY29uc3QgY2hhciAqQnVzTG9naWNfRHJpdmVySW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIGludCBCdXNMb2dpY19RdWV1ZUNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqLCB2b2lkICgqQ29tcGxldGlvblJvdXRpbmUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKK3N0YXRpYyBpbnQgQnVzTG9naWNfQklPU0Rpc2tQYXJhbWV0ZXJzKHN0cnVjdCBzY3NpX2RldmljZSAqLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHNlY3Rvcl90LCBpbnQgKik7CitzdGF0aWMgaW50IEJ1c0xvZ2ljX1Byb2NEaXJlY3RvcnlJbmZvKHN0cnVjdCBTY3NpX0hvc3QgKiwgY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQpOworc3RhdGljIGludCBCdXNMb2dpY19TbGF2ZUNvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CitzdGF0aWMgdm9pZCBCdXNMb2dpY19RdWV1ZUNvbXBsZXRlZENDQihzdHJ1Y3QgQnVzTG9naWNfQ0NCICopOworc3RhdGljIGlycXJldHVybl90IEJ1c0xvZ2ljX0ludGVycnVwdEhhbmRsZXIoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIGludCBCdXNMb2dpY19SZXNldEhvc3RBZGFwdGVyKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqLCBib29sZWFuIEhhcmRSZXNldCk7CitzdGF0aWMgdm9pZCBCdXNMb2dpY19NZXNzYWdlKGVudW0gQnVzTG9naWNfTWVzc2FnZUxldmVsLCBjaGFyICosIHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqLCAuLi4pOworc3RhdGljIGludCBfX2luaXQgQnVzTG9naWNfU2V0dXAoY2hhciAqKTsKKworI2VuZGlmCQkJCS8qIF9CVVNMT0dJQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvRmxhc2hQb2ludC5jIGIvZHJpdmVycy9zY3NpL0ZsYXNoUG9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmE2OTVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL0ZsYXNoUG9pbnQuYwpAQCAtMCwwICsxLDEyMTU5IEBACisvKgorCisgIEZsYXNoUG9pbnQuYyAtLSBGbGFzaFBvaW50IFNDQ0IgTWFuYWdlciBmb3IgTGludXgKKworICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEZsYXNoUG9pbnQgU0NDQiBNYW5hZ2VyIGZyb20gQnVzTG9naWMncyBGbGFzaFBvaW50CisgIERyaXZlciBEZXZlbG9wZXIncyBLaXQsIHdpdGggbWlub3IgbW9kaWZpY2F0aW9ucyBieSBMZW9uYXJkIE4uIFp1YmtvZmYgZm9yCisgIExpbnV4IGNvbXBhdGliaWxpdHkuICBJdCB3YXMgcHJvdmlkZWQgYnkgQnVzTG9naWMgaW4gdGhlIGZvcm0gb2YgMTYgc2VwYXJhdGUKKyAgc291cmNlIGZpbGVzLCB3aGljaCB3b3VsZCBoYXZlIHVubmVjZXNzYXJpbHkgY2x1dHRlcmVkIHRoZSBzY3NpIGRpcmVjdG9yeSwgc28KKyAgdGhlIGluZGl2aWR1YWwgZmlsZXMgaGF2ZSBiZWVuIGNvbWJpbmVkIGludG8gdGhpcyBzaW5nbGUgZmlsZS4KKworICBDb3B5cmlnaHQgMTk5NS0xOTk2IGJ5IE15bGV4IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYm90aCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYW5kIGEgQlNELXN0eWxlIGNvcHlyaWdodDsgc2VlIExJQ0VOU0UuRmxhc2hQb2ludCBmb3IgZGV0YWlscy4KKworKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKworI2lmbmRlZiBDT05GSUdfU0NTSV9PTUlUX0ZMQVNIUE9JTlQKKworCisjZGVmaW5lIFVOSVgKKyNkZWZpbmUgRldfVFlQRQkJX1NDQ0JfTUdSXworI2RlZmluZSBNQVhfQ0FSRFMJOAorI3VuZGVmIEJVU1RZUEVfUENJCisKKworI2RlZmluZSBPU19JblBvcnRCeXRlKHBvcnQpCQlpbmIocG9ydCkKKyNkZWZpbmUgT1NfSW5Qb3J0V29yZChwb3J0KQkJaW53KHBvcnQpCisjZGVmaW5lIE9TX0luUG9ydExvbmcocG9ydCkJCWlubChwb3J0KQorI2RlZmluZSBPU19PdXRQb3J0Qnl0ZShwb3J0LCB2YWx1ZSkJb3V0Yih2YWx1ZSwgcG9ydCkKKyNkZWZpbmUgT1NfT3V0UG9ydFdvcmQocG9ydCwgdmFsdWUpCW91dHcodmFsdWUsIHBvcnQpCisjZGVmaW5lIE9TX091dFBvcnRMb25nKHBvcnQsIHZhbHVlKQlvdXRsKHZhbHVlLCBwb3J0KQorI2RlZmluZSBPU19Mb2NrKHgpCisjZGVmaW5lIE9TX1VuTG9jayh4KQorCisKKy8qCisgIERlZmluZSBuYW1lIHJlcGxhY2VtZW50cyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBMaW51eCBCdXNMb2dpYyBEcml2ZXIuCisqLworCisjZGVmaW5lIFNjY2JNZ3Jfc2Vuc2VfYWRhcHRlcgkJRmxhc2hQb2ludF9Qcm9iZUhvc3RBZGFwdGVyCisjZGVmaW5lIFNjY2JNZ3JfY29uZmlnX2FkYXB0ZXIJCUZsYXNoUG9pbnRfSGFyZHdhcmVSZXNldEhvc3RBZGFwdGVyCisjZGVmaW5lIFNjY2JNZ3JfdW5sb2FkX2NhcmQJCUZsYXNoUG9pbnRfUmVsZWFzZUhvc3RBZGFwdGVyCisjZGVmaW5lIFNjY2JNZ3Jfc3RhcnRfc2NjYgkJRmxhc2hQb2ludF9TdGFydENDQgorI2RlZmluZSBTY2NiTWdyX2Fib3J0X3NjY2IJCUZsYXNoUG9pbnRfQWJvcnRDQ0IKKyNkZWZpbmUgU2NjYk1ncl9teV9pbnQJCQlGbGFzaFBvaW50X0ludGVycnVwdFBlbmRpbmcKKyNkZWZpbmUgU2NjYk1ncl9pc3IJCQlGbGFzaFBvaW50X0hhbmRsZUludGVycnVwdAorCisKKy8qCisgIERlZmluZSBuYW1lIHJlcGxhY2VtZW50cyB0byBhdm9pZCBrZXJuZWwgbmFtZXNwYWNlIHBvbGx1dGlvbi4KKyovCisKKyNkZWZpbmUgQkxfQ2FyZAkJCQlGUFRfQkxfQ2FyZAorI2RlZmluZSBCdXNNYXN0ZXJJbml0CQkJRlBUX0J1c01hc3RlckluaXQKKyNkZWZpbmUgQ2FsY0NyYzE2CQkJRlBUX0NhbGNDcmMxNgorI2RlZmluZSBDYWxjTHJjCQkJCUZQVF9DYWxjTHJjCisjZGVmaW5lIENoa0lmQ2hpcEluaXRpYWxpemVkCQlGUFRfQ2hrSWZDaGlwSW5pdGlhbGl6ZWQKKyNkZWZpbmUgRGlhZ0J1c01hc3RlcgkJCUZQVF9EaWFnQnVzTWFzdGVyCisjZGVmaW5lIERpYWdFRVBST00JCQlGUFRfRGlhZ0VFUFJPTQorI2RlZmluZSBEaWFnWGJvdwkJCUZQVF9EaWFnWGJvdworI2RlZmluZSBHZXRUYXJMdW4JCQlGUFRfR2V0VGFyTHVuCisjZGVmaW5lIFJOVlJhbURhdGEJCQlGUFRfUk5WUmFtRGF0YQorI2RlZmluZSBSZFN0YWNrCQkJCUZQVF9SZFN0YWNrCisjZGVmaW5lIFNjY2JNZ3JUYWJsZUluaXRBbGwJCUZQVF9TY2NiTWdyVGFibGVJbml0QWxsCisjZGVmaW5lIFNjY2JNZ3JUYWJsZUluaXRDYXJkCQlGUFRfU2NjYk1nclRhYmxlSW5pdENhcmQKKyNkZWZpbmUgU2NjYk1nclRhYmxlSW5pdFRhcmdldAkJRlBUX1NjY2JNZ3JUYWJsZUluaXRUYXJnZXQKKyNkZWZpbmUgU2NjYk1ncl9iYWRfaXNyCQkJRlBUX1NjY2JNZ3JfYmFkX2lzcgorI2RlZmluZSBTY2NiTWdyX3Njc2lfcmVzZXQJCUZQVF9TY2NiTWdyX3Njc2lfcmVzZXQKKyNkZWZpbmUgU2NjYk1ncl90aW1lcl9leHBpcmVkCQlGUFRfU2NjYk1ncl90aW1lcl9leHBpcmVkCisjZGVmaW5lIFNlbmRNc2cJCQkJRlBUX1NlbmRNc2cKKyNkZWZpbmUgV2FpdAkJCQlGUFRfV2FpdAorI2RlZmluZSBXYWl0MVNlY29uZAkJCUZQVF9XYWl0MVNlY29uZAorI2RlZmluZSBXclN0YWNrCQkJCUZQVF9XclN0YWNrCisjZGVmaW5lIFhib3dJbml0CQkJRlBUX1hib3dJbml0CisjZGVmaW5lIGF1dG9DbWRDbXBsdAkJCUZQVF9hdXRvQ21kQ21wbHQKKyNkZWZpbmUgYXV0b0xvYWREZWZhdWx0TWFwCQlGUFRfYXV0b0xvYWREZWZhdWx0TWFwCisjZGVmaW5lIGJ1c01zdHJEYXRhWGZlclN0YXJ0CQlGUFRfYnVzTXN0ckRhdGFYZmVyU3RhcnQKKyNkZWZpbmUgYnVzTXN0clNHRGF0YVhmZXJTdGFydAkJRlBUX2J1c01zdHJTR0RhdGFYZmVyU3RhcnQKKyNkZWZpbmUgYnVzTXN0clRpbWVPdXQJCQlGUFRfYnVzTXN0clRpbWVPdXQKKyNkZWZpbmUgZGF0YVhmZXJQcm9jZXNzb3IJCUZQVF9kYXRhWGZlclByb2Nlc3NvcgorI2RlZmluZSBkZWZhdWx0X2ludGVuYQkJCUZQVF9kZWZhdWx0X2ludGVuYQorI2RlZmluZSBob3N0RGF0YVhmZXJBYm9ydAkJRlBUX2hvc3REYXRhWGZlckFib3J0CisjZGVmaW5lIGhvc3REYXRhWGZlclJlc3RhcnQJCUZQVF9ob3N0RGF0YVhmZXJSZXN0YXJ0CisjZGVmaW5lIGluaXNjaQkJCQlGUFRfaW5pc2NpCisjZGVmaW5lIG1iQ2FyZHMJCQkJRlBUX21iQ2FyZHMKKyNkZWZpbmUgbnZSYW1JbmZvCQkJRlBUX252UmFtSW5mbworI2RlZmluZSBwaGFzZUJ1c0ZyZWUJCQlGUFRfcGhhc2VCdXNGcmVlCisjZGVmaW5lIHBoYXNlQ2hrRmlmbwkJCUZQVF9waGFzZUNoa0ZpZm8KKyNkZWZpbmUgcGhhc2VDb21tYW5kCQkJRlBUX3BoYXNlQ29tbWFuZAorI2RlZmluZSBwaGFzZURhdGFJbgkJCUZQVF9waGFzZURhdGFJbgorI2RlZmluZSBwaGFzZURhdGFPdXQJCQlGUFRfcGhhc2VEYXRhT3V0CisjZGVmaW5lIHBoYXNlRGVjb2RlCQkJRlBUX3BoYXNlRGVjb2RlCisjZGVmaW5lIHBoYXNlSWxsZWdhbAkJCUZQVF9waGFzZUlsbGVnYWwKKyNkZWZpbmUgcGhhc2VNc2dJbgkJCUZQVF9waGFzZU1zZ0luCisjZGVmaW5lIHBoYXNlTXNnT3V0CQkJRlBUX3BoYXNlTXNnT3V0CisjZGVmaW5lIHBoYXNlU3RhdHVzCQkJRlBUX3BoYXNlU3RhdHVzCisjZGVmaW5lIHF1ZXVlQWRkU2NjYgkJCUZQVF9xdWV1ZUFkZFNjY2IKKyNkZWZpbmUgcXVldWVDbWRDb21wbGV0ZQkJRlBUX3F1ZXVlQ21kQ29tcGxldGUKKyNkZWZpbmUgcXVldWVEaXNjb25uZWN0CQkJRlBUX3F1ZXVlRGlzY29ubmVjdAorI2RlZmluZSBxdWV1ZUZpbmRTY2NiCQkJRlBUX3F1ZXVlRmluZFNjY2IKKyNkZWZpbmUgcXVldWVGbHVzaFNjY2IJCQlGUFRfcXVldWVGbHVzaFNjY2IKKyNkZWZpbmUgcXVldWVGbHVzaFRhcmdTY2NiCQlGUFRfcXVldWVGbHVzaFRhcmdTY2NiCisjZGVmaW5lIHF1ZXVlU2VhcmNoU2VsZWN0CQlGUFRfcXVldWVTZWFyY2hTZWxlY3QKKyNkZWZpbmUgcXVldWVTZWxlY3RGYWlsCQkJRlBUX3F1ZXVlU2VsZWN0RmFpbAorI2RlZmluZSBzX1BoYXNlVGJsCQkJRlBUX3NfUGhhc2VUYmwKKyNkZWZpbmUgc2NhbUhBU3RyaW5nCQkJRlBUX3NjYW1IQVN0cmluZworI2RlZmluZSBzY2FtSW5mbwkJCUZQVF9zY2FtSW5mbworI2RlZmluZSBzY2FyYgkJCQlGUFRfc2NhcmIKKyNkZWZpbmUgc2Nhc2lkCQkJCUZQVF9zY2FzaWQKKyNkZWZpbmUgc2NidXNmCQkJCUZQVF9zY2J1c2YKKyNkZWZpbmUgc2NjYk1nclRibAkJCUZQVF9zY2NiTWdyVGJsCisjZGVmaW5lIHNjaGtkZAkJCQlGUFRfc2Noa2RkCisjZGVmaW5lIHNjaW5pCQkJCUZQVF9zY2luaQorI2RlZmluZSBzY2lzbwkJCQlGUFRfc2Npc28KKyNkZWZpbmUgc2NtYWNoaWQJCQlGUFRfc2NtYWNoaWQKKyNkZWZpbmUgc2NzYXZkaQkJCQlGUFRfc2NzYXZkaQorI2RlZmluZSBzY3NlbAkJCQlGUFRfc2NzZWwKKyNkZWZpbmUgc2NzZWxsCQkJCUZQVF9zY3NlbGwKKyNkZWZpbmUgc2NzZW5kaQkJCQlGUFRfc2NzZW5kaQorI2RlZmluZSBzY3ZhbHEJCQkJRlBUX3NjdmFscQorI2RlZmluZSBzY3dpcm9kCQkJCUZQVF9zY3dpcm9kCisjZGVmaW5lIHNjd2lyb3MJCQkJRlBUX3Njd2lyb3MKKyNkZWZpbmUgc2N3dHNlbAkJCQlGUFRfc2N3dHNlbAorI2RlZmluZSBzY3hmZXJjCQkJCUZQVF9zY3hmZXJjCisjZGVmaW5lIHNkZWNtCQkJCUZQVF9zZGVjbQorI2RlZmluZSBzZm0JCQkJRlBUX3NmbQorI2RlZmluZSBzaGFuZGVtCQkJCUZQVF9zaGFuZGVtCisjZGVmaW5lIHNpbml0cwkJCQlGUFRfc2luaXRzCisjZGVmaW5lIHNpc3luY24JCQkJRlBUX3Npc3luY24KKyNkZWZpbmUgc2lzeW5jcgkJCQlGUFRfc2lzeW5jcgorI2RlZmluZSBzaXdpZG4JCQkJRlBUX3Npd2lkbgorI2RlZmluZSBzaXdpZHIJCQkJRlBUX3Npd2lkcgorI2RlZmluZSBzcmVzCQkJCUZQVF9zcmVzCisjZGVmaW5lIHNyZXNiCQkJCUZQVF9zcmVzYgorI2RlZmluZSBzc2VsCQkJCUZQVF9zc2VsCisjZGVmaW5lIHNzZW5zcwkJCQlGUFRfc3NlbnNzCisjZGVmaW5lIHNzc3luY3YJCQkJRlBUX3Nzc3luY3YKKyNkZWZpbmUgc3RzeW5jbgkJCQlGUFRfc3RzeW5jbgorI2RlZmluZSBzdHdpZG4JCQkJRlBUX3N0d2lkbgorI2RlZmluZSBzeGZycAkJCQlGUFRfc3hmcnAKKyNkZWZpbmUgdXRpbEVFUmVhZAkJCUZQVF91dGlsRUVSZWFkCisjZGVmaW5lIHV0aWxFRVJlYWRPcmcJCQlGUFRfdXRpbEVFUmVhZE9yZworI2RlZmluZSB1dGlsRUVTZW5kQ21kQWRkcgkJRlBUX3V0aWxFRVNlbmRDbWRBZGRyCisjZGVmaW5lIHV0aWxFRVdyaXRlCQkJRlBUX3V0aWxFRVdyaXRlCisjZGVmaW5lIHV0aWxFRVdyaXRlT25PZmYJCUZQVF91dGlsRUVXcml0ZU9uT2ZmCisjZGVmaW5lIHV0aWxVcGRhdGVSZXNpZHVhbAkJRlBUX3V0aWxVcGRhdGVSZXNpZHVhbAorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCisgKiAgIENvcHlyaWdodCAxOTk1LTE5OTYgYnkgTXlsZXggQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGJvdGggdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFuZCBhIEJTRC1zdHlsZSBjb3B5cmlnaHQ7IHNlZSBMSUNFTlNFLkZsYXNoUG9pbnQgZm9yIGRldGFpbHMuCisgKgorICogICAkV29ya2ZpbGU6ICAgZ2xvYmFscy5oICAkCisgKgorICogICBEZXNjcmlwdGlvbjogIENvbW1vbiBzaGFyZWQgZ2xvYmFsIGRlZmluZXMuCisgKgorICogICAkRGF0ZTogMTk5Ni8wOS8wNCAwMToyNjoxMyAkCisgKgorICogICAkUmV2aXNpb246IDEuMTEgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fR0xPQkFMU19IX18KKyNkZWZpbmUgX19HTE9CQUxTX0hfXworCisjZGVmaW5lIF9VQ0JfTUdSXyAgMQorI2RlZmluZSBfU0NDQl9NR1JfIDIKKworLyojaW5jbHVkZSA8b3NmbGFncy5oPiovCisKKyNkZWZpbmUgTUFYX0NEQkxFTiAgMTIKKworI2RlZmluZSBTQ0FNX0xFVl8yCTEKKworI2RlZmluZSBDUkNNQVNLCTB4QTAwMQorCisvKiAgSW4geW91ciBvc2ZsYWdzLmggZmlsZSwgcGxlYXNlIEVOU1VSRSB0aGF0IG9ubHkgT05FIE9TIEZMQUcgCisgICAgaXMgb24gYXQgYSB0aW1lICEhISBBbHNvLCBwbGVhc2UgbWFrZSBzdXJlIHlvdSB0dXJuIHNldCB0aGUgCisgCSB2YXJpYWJsZSBGV19UWVBFIHRvIGVpdGhlciBfVUNCX01HUl8gb3IgX1NDQ0JfTUdSXyAgISEhICovCisKKyNpZiBkZWZpbmVkKERPUykgfHwgZGVmaW5lZChXSU45NV8xNikgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoT1RIRVJfMTYpCisgICAjZGVmaW5lICAgICAgIENPTVBJTEVSXzE2X0JJVCAxCisjZWxpZiBkZWZpbmVkKE5FVFdBUkUpIHx8IGRlZmluZWQoTlQpIHx8IGRlZmluZWQoV0lOOTVfMzIpIHx8IGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChPVEhFUl8zMikgfHwgZGVmaW5lZChTT0xBUklTX1JFQUxfTU9ERSkKKyAgICNkZWZpbmUgICAgICAgQ09NUElMRVJfMzJfQklUIDEKKyNlbmRpZgorCisKKyNkZWZpbmUgICAgIEJMX1ZFTkRPUl9JRCAgICAgIDB4MTA0QgorI2RlZmluZSAgICAgRlBfREVWSUNFX0lEICAgICAgMHg4MTMwCisjZGVmaW5lICAgICBNTV9ERVZJQ0VfSUQgICAgICAweDEwNDAKKworCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFICAgICAgICAgICAwCisjZW5kaWYKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFICAgICAgICAgICAgKCEoRkFMU0UpKQorI2VuZGlmCisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMICAgICAgICAgICAgMAorI2VuZGlmCisKKyNkZWZpbmUgRkFJTFVSRSAgICAgICAgIDB4RkZGRkZGRkZMCisKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgVUNIQVI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBVU0hPUlQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgICBVSU5UOwordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgVUxPTkc7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgKiBQVUNIQVI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0KiBQVVNIT1JUOwordHlwZWRlZiB1bnNpZ25lZCBsb25nICogUFVMT05HOwordHlwZWRlZiB2b2lkICogICAgICAgICAgUFZPSUQ7CisKKworI2lmIGRlZmluZWQoQ09NUElMRVJfMTZfQklUKQordHlwZWRlZiB1bnNpZ25lZCBjaGFyIGZhciAgICAgICAqIHVjaGFyX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgZmFyICAgICAgKiB1c2hvcnRfcHRyOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGZhciAgICAgICAqIHVsb25nX3B0cjsKKyNlbmRpZiAgLyogMTZfQklUX0NPTVBJTEVSICovCisKKyNpZiBkZWZpbmVkKENPTVBJTEVSXzMyX0JJVCkKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICAgICAgKiB1Y2hhcl9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICogdXNob3J0X3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgICAgKiB1bG9uZ19wdHI7CisjZW5kaWYgIC8qIDMyX0JJVF9DT01QSUxFUiAqLworCisKKy8qCSAJCQlORVcgVFlQRSBERUZJTklUSU9OUyAoc2hhcmVkIHdpdGggTXlsZXggTm9ydGgpCisKKyoqICBVc2UgZm9sbG93aW5nIHR5cGUgZGVmaW5lcyB0byBhdm9pZCBjb25mdXNpb24gaW4gMTYgYW5kIDMyLWJpdAorKiogIGVudmlyb25tZW50cy4gIEF2b2lkIHVzaW5nICdpbnQnIGFzIGl0IGRlbm90ZXMgMTYgYml0cyBpbiAxNi1iaXQKKyoqICBlbnZpcm9ubWVudCBhbmQgMzIgaW4gMzItYml0IGVudmlyb25tZW50cy4KKworKi8KKworI2RlZmluZSBzMDhiaXRzCWNoYXIKKyNkZWZpbmUgczE2Yml0cyAJc2hvcnQKKyNkZWZpbmUgczMyYml0cwlsb25nCisKKyNkZWZpbmUgdTA4Yml0cwl1bnNpZ25lZCBzMDhiaXRzCisjZGVmaW5lIHUxNmJpdHMJdW5zaWduZWQgczE2Yml0cworI2RlZmluZSB1MzJiaXRzCXVuc2lnbmVkIHMzMmJpdHMKKworI2lmIGRlZmluZWQoQ09NUElMRVJfMTZfQklUKQorCit0eXBlZGVmIHUwOGJpdHMgZmFyIAkqIHB1MDhiaXRzOwordHlwZWRlZiB1MTZiaXRzIGZhciAJKiBwdTE2Yml0czsKK3R5cGVkZWYgdTMyYml0cyBmYXIJKiBwdTMyYml0czsKKworI2VuZGlmCS8qIENPTVBJTEVSXzE2X0JJVCAqLworCisjaWYgZGVmaW5lZChDT01QSUxFUl8zMl9CSVQpCisKK3R5cGVkZWYgdTA4Yml0cyAJKiBwdTA4Yml0czsKK3R5cGVkZWYgdTE2Yml0cyAJKiBwdTE2Yml0czsKK3R5cGVkZWYgdTMyYml0cyAJKiBwdTMyYml0czsKKworI2VuZGlmCS8qIENPTVBJTEVSXzMyX0JJVCAqLworCisKKyNkZWZpbmUgQklUKHgpICAgICAgICAgICgoVUNIQVIpKDE8PCh4KSkpICAgIC8qIHNpbmdsZS1iaXQgbWFzayBpbiBiaXQgcG9zaXRpb24geCAqLworI2RlZmluZSBCSVRXKHgpICAgICAgICAgICgoVVNIT1JUKSgxPDwoeCkpKSAgLyogc2luZ2xlLWJpdCBtYXNrIGluIGJpdCBwb3NpdGlvbiB4ICovCisKKworCisjaWYgZGVmaW5lZChET1MpCisvKiNpbmNsdWRlIDxkb3MuaD4qLworCSN1bmRlZiBpbnBvcnRiICAgICAgICAgIC8qIHVuZGVmaW5lIGZvciBCb3JsYW5kIExpYiAqLworCSN1bmRlZiBpbnBvcnQgICAgICAgICAgIC8qIHRoZXkgbWF5IGhhdmUgZGVmaW5lIEkvTyBmdW5jdGlvbiBpbiBMSUIgKi8KKwkjdW5kZWYgb3V0cG9ydGIKKwkjdW5kZWYgb3V0cG9ydAorCisJI2RlZmluZSBPU19JblBvcnRCeXRlKGlvcG9ydCkgCQlpbnBvcnRiKGlvcG9ydCkKKwkjZGVmaW5lIE9TX0luUG9ydFdvcmQoaW9wb3J0KSAJCWlucG9ydChpb3BvcnQpCisJI2RlZmluZSBPU19JblBvcnRMb25nKGlvcG9ydCkJCQlpbnBvcnRxKGlvcG9ydCwgdmFsKQorCSNkZWZpbmUgT1NfT3V0UG9ydEJ5dGUoaW9wb3J0LCB2YWwpIG91dHBvcnRiKGlvcG9ydCwgdmFsKQorCSNkZWZpbmUgT1NfT3V0UG9ydFdvcmQoaW9wb3J0LCB2YWwpCW91dHBvcnQoaW9wb3J0LCB2YWwpCisJI2RlZmluZSBPU19PdXRQb3J0TG9uZyhpb3BvcnQpCQlvdXRwb3J0cShpb3BvcnQsIHZhbCkKKyNlbmRpZgkvKiBET1MgKi8KKworI2lmIGRlZmluZWQoTkVUV0FSRSkgfHwgZGVmaW5lZChPVEhFUl8zMikgfHwgIGRlZmluZWQoT1RIRVJfMTYpCisJZXh0ZXJuIHUwOGJpdHMJT1NfSW5Qb3J0Qnl0ZSh1MzJiaXRzIGlvcG9ydCk7CisJZXh0ZXJuIHUxNmJpdHMJT1NfSW5Qb3J0V29yZCh1MzJiaXRzIGlvcG9ydCk7CisJZXh0ZXJuIHUzMmJpdHMJT1NfSW5Qb3J0TG9uZyh1MzJiaXRzIGlvcG9ydCk7CisKKwlleHRlcm4gT1NfSW5Qb3J0Qnl0ZUJ1ZmZlcih1MzJiaXRzIGlvcG9ydCwgcHUwOGJpdHMgYnVmZmVyLCB1MzJiaXRzIGNvdW50KTsKKwlleHRlcm4gT1NfSW5Qb3J0V29yZEJ1ZmZlcih1MzJiaXRzIGlvcG9ydCwgcHUxNmJpdHMgYnVmZmVyLCB1MzJiaXRzIGNvdW50KTsKKwlleHRlcm4gT1NfT3V0UG9ydEJ5dGUodTMyYml0cyBpb3BvcnQsIHUwOGJpdHMgdmFsKTsKKwlleHRlcm4gT1NfT3V0UG9ydFdvcmQodTMyYml0cyBpb3BvcnQsIHUxNmJpdHMgdmFsKTsKKwlleHRlcm4gT1NfT3V0UG9ydExvbmcodTMyYml0cyBpb3BvcnQsIHUzMmJpdHMgdmFsKTsKKwlleHRlcm4gT1NfT3V0UG9ydEJ5dGVCdWZmZXIodTMyYml0cyBpb3BvcnQsIHB1MDhiaXRzIGJ1ZmZlciwgdTMyYml0cyBjb3VudCk7CisJZXh0ZXJuIE9TX091dFBvcnRXb3JkQnVmZmVyKHUzMmJpdHMgaW9wb3J0LCBwdTE2Yml0cyBidWZmZXIsIHUzMmJpdHMgY291bnQpOworI2VuZGlmCS8qIE5FVFdBUkUgfHwgT1RIRVJfMzIgfHwgT1RIRVJfMTYgKi8KKworI2lmIGRlZmluZWQgKE5UKSB8fCBkZWZpbmVkKFdJTjk1XzMyKSB8fCBkZWZpbmVkKFdJTjk1XzE2KQorCSNpZiBkZWZpbmVkKE5UKQorCisJCWV4dGVybiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgdTA4Yml0cyBTY3NpUG9ydFJlYWRQb3J0VWNoYXIocHUwOGJpdHMgaW9wb3J0KTsKKwkJZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB1MTZiaXRzIFNjc2lQb3J0UmVhZFBvcnRVc2hvcnQocHUxNmJpdHMgaW9wb3J0KTsKKwkJZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB1MzJiaXRzIFNjc2lQb3J0UmVhZFBvcnRVbG9uZyhwdTMyYml0cyBpb3BvcnQpOworCQlleHRlcm4gX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgU2NzaVBvcnRXcml0ZVBvcnRVY2hhcihwdTA4Yml0cyBpb3BvcnQsIHUwOGJpdHMgdmFsKTsKKwkJZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkIFNjc2lQb3J0V3JpdGVQb3J0VXNob3J0KHB1MTZiaXRzIHBvcnQsIHUxNmJpdHMgdmFsKTsKKwkJZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkIFNjc2lQb3J0V3JpdGVQb3J0VWxvbmcocHUzMmJpdHMgcG9ydCwgdTMyYml0cyB2YWwpOworCisJI2Vsc2UKKworCQlleHRlcm4gdTA4Yml0cyBTY3NpUG9ydFJlYWRQb3J0VWNoYXIocHUwOGJpdHMgaW9wb3J0KTsKKwkJZXh0ZXJuIHUxNmJpdHMgU2NzaVBvcnRSZWFkUG9ydFVzaG9ydChwdTE2Yml0cyBpb3BvcnQpOworCQlleHRlcm4gdTMyYml0cyBTY3NpUG9ydFJlYWRQb3J0VWxvbmcocHUzMmJpdHMgaW9wb3J0KTsKKwkJZXh0ZXJuIHZvaWQgU2NzaVBvcnRXcml0ZVBvcnRVY2hhcihwdTA4Yml0cyBpb3BvcnQsIHUwOGJpdHMgdmFsKTsKKwkJZXh0ZXJuIHZvaWQgU2NzaVBvcnRXcml0ZVBvcnRVc2hvcnQocHUxNmJpdHMgcG9ydCwgdTE2Yml0cyB2YWwpOworCQlleHRlcm4gdm9pZCBTY3NpUG9ydFdyaXRlUG9ydFVsb25nKHB1MzJiaXRzIHBvcnQsIHUzMmJpdHMgdmFsKTsKKwkjZW5kaWYKKworCisJI2RlZmluZSBPU19JblBvcnRCeXRlKGlvcG9ydCkgU2NzaVBvcnRSZWFkUG9ydFVjaGFyKChwdTA4Yml0cykgaW9wb3J0KQorCSNkZWZpbmUgT1NfSW5Qb3J0V29yZChpb3BvcnQpIFNjc2lQb3J0UmVhZFBvcnRVc2hvcnQoKHB1MTZiaXRzKSBpb3BvcnQpCisJI2RlZmluZSBPU19JblBvcnRMb25nKGlvcG9ydCkgU2NzaVBvcnRSZWFkUG9ydFVsb25nKChwdTMyYml0cykgaW9wb3J0KQorCisJI2RlZmluZSBPU19PdXRQb3J0Qnl0ZShpb3BvcnQsIHZhbCkgU2NzaVBvcnRXcml0ZVBvcnRVY2hhcigocHUwOGJpdHMpIGlvcG9ydCwgKHUwOGJpdHMpIHZhbCkKKwkjZGVmaW5lIE9TX091dFBvcnRXb3JkKGlvcG9ydCwgdmFsKSBTY3NpUG9ydFdyaXRlUG9ydFVzaG9ydCgocHUxNmJpdHMpIGlvcG9ydCwgKHUxNmJpdHMpIHZhbCkKKwkjZGVmaW5lIE9TX091dFBvcnRMb25nKGlvcG9ydCwgdmFsKSBTY3NpUG9ydFdyaXRlUG9ydFVsb25nKChwdTMyYml0cykgaW9wb3J0LCAodTMyYml0cykgdmFsKQorCSNkZWZpbmUgT1NfT3V0UG9ydEJ5dGVCdWZmZXIoaW9wb3J0LCBidWZmZXIsIGNvdW50KSBcCisJCVNjc2lQb3J0V3JpdGVQb3J0QnVmZmVyVWNoYXIoKHB1MDhiaXRzKSZwb3J0LCAocHUwOGJpdHMpIGJ1ZmZlciwgKHUzMmJpdHMpIGNvdW50KQorCSNkZWZpbmUgT1NfT3V0UG9ydFdvcmRCdWZmZXIoaW9wb3J0LCBidWZmZXIsIGNvdW50KSBcCisJCVNjc2lQb3J0V3JpdGVQb3J0QnVmZmVyVXNob3J0KChwdTE2Yml0cykmcG9ydCwgKHB1MTZiaXRzKSBidWZmZXIsICh1MzJiaXRzKSBjb3VudCkKKworCSNkZWZpbmUgT1NfTG9jayh4KQorCSNkZWZpbmUgT1NfVW5Mb2NrKHgpCisjZW5kaWYgLyogTlQgfHwgV0lOOTVfMzIgfHwgV0lOOTVfMTYgKi8KKworI2lmIGRlZmluZWQgKFVOSVgpICYmICFkZWZpbmVkKE9TX0luUG9ydEJ5dGUpCisJI2RlZmluZSBPU19JblBvcnRCeXRlKGlvcG9ydCkgICAgaW5iKCh1MTZiaXRzKWlvcG9ydCkKKwkjZGVmaW5lIE9TX0luUG9ydFdvcmQoaW9wb3J0KSAgICBpbncoKHUxNmJpdHMpaW9wb3J0KQorCSNkZWZpbmUgT1NfSW5Qb3J0TG9uZyhpb3BvcnQpICAgIGlubCgodTE2Yml0cylpb3BvcnQpCisJI2RlZmluZSBPU19PdXRQb3J0Qnl0ZShpb3BvcnQsdmFsKSAgb3V0YigodTE2Yml0cylpb3BvcnQsICh1MDhiaXRzKXZhbCkKKwkjZGVmaW5lIE9TX091dFBvcnRXb3JkKGlvcG9ydCx2YWwpICBvdXR3KCh1MTZiaXRzKWlvcG9ydCwgKHUxNmJpdHMpdmFsKQorCSNkZWZpbmUgT1NfT3V0UG9ydExvbmcoaW9wb3J0LHZhbCkgIG91dGwoKHUxNmJpdHMpaW9wb3J0LCAodTMyYml0cyl2YWwpCisKKwkjZGVmaW5lIE9TX0xvY2soeCkKKwkjZGVmaW5lIE9TX1VuTG9jayh4KQorI2VuZGlmIC8qIFVOSVggKi8KKworCisjaWYgZGVmaW5lZChPUzIpCisJZXh0ZXJuIHUwOGJpdHMJaW5iKHUzMmJpdHMgaW9wb3J0KTsKKwlleHRlcm4gdTE2Yml0cwlpbncodTMyYml0cyBpb3BvcnQpOworCWV4dGVybiB2b2lkCW91dGIodTMyYml0cyBpb3BvcnQsIHUwOGJpdHMgdmFsKTsKKwlleHRlcm4gdm9pZAlvdXR3KHUzMmJpdHMgaW9wb3J0LCB1MTZiaXRzIHZhbCk7CisKKwkjZGVmaW5lIE9TX0luUG9ydEJ5dGUoaW9wb3J0KQkJCWluYihpb3BvcnQpCisJI2RlZmluZSBPU19JblBvcnRXb3JkKGlvcG9ydCkJCQlpbncoaW9wb3J0KQorCSNkZWZpbmUgT1NfT3V0UG9ydEJ5dGUoaW9wb3J0LCB2YWwpCW91dGIoaW9wb3J0LCB2YWwpCisJI2RlZmluZSBPU19PdXRQb3J0V29yZChpb3BvcnQsIHZhbCkJb3V0dyhpb3BvcnQsIHZhbCkKKwlleHRlcm4gdTMyYml0cwlPU19JblBvcnRMb25nKHUzMmJpdHMgaW9wb3J0KTsKKwlleHRlcm4gdm9pZAlPU19PdXRQb3J0TG9uZyh1MzJiaXRzIGlvcG9ydCwgdTMyYml0cyB2YWwpOworCisJI2RlZmluZSBPU19Mb2NrKHgpCisJI2RlZmluZSBPU19VbkxvY2soeCkKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmIGRlZmluZWQoU09MQVJJU19SRUFMX01PREUpCisKK2V4dGVybiB1bnNpZ25lZCBjaGFyICAgIGluYih1bnNpZ25lZCBsb25nIGlvcG9ydCk7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgICBpbncodW5zaWduZWQgbG9uZyBpb3BvcnQpOworCisjZGVmaW5lIE9TX0luUG9ydEJ5dGUoaW9wb3J0KSAgICBpbmIoaW9wb3J0KQorI2RlZmluZSBPU19JblBvcnRXb3JkKGlvcG9ydCkgICAgaW53KGlvcG9ydCkKKworZXh0ZXJuIHZvaWQgT1NfT3V0UG9ydEJ5dGUodW5zaWduZWQgbG9uZyBpb3BvcnQsIHVuc2lnbmVkIGNoYXIgdmFsKTsKK2V4dGVybiB2b2lkIE9TX091dFBvcnRXb3JkKHVuc2lnbmVkIGxvbmcgaW9wb3J0LCB1bnNpZ25lZCBzaG9ydCB2YWwpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgIE9TX0luUG9ydExvbmcodW5zaWduZWQgbG9uZyBpb3BvcnQpOworZXh0ZXJuIHZvaWQgICAgIE9TX091dFBvcnRMb25nKHVuc2lnbmVkIGxvbmcgaW9wb3J0LCB1bnNpZ25lZCBsb25nIHZhbCk7CisKKyNkZWZpbmUgT1NfTG9jayh4KQorI2RlZmluZSBPU19VbkxvY2soeCkKKworI2VuZGlmICAvKiBTT0xBUklTX1JFQUxfTU9ERSAqLworCisjZW5kaWYgIC8qIF9fR0xPQkFMU19IX18gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoKKyAqICAgQ29weXJpZ2h0IDE5OTUtMTk5NiBieSBNeWxleCBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYm90aCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYW5kIGEgQlNELXN0eWxlIGNvcHlyaWdodDsgc2VlIExJQ0VOU0UuRmxhc2hQb2ludCBmb3IgZGV0YWlscy4KKyAqCisgKiAgICRXb3JrZmlsZTogICBzY2NibWdyLmggICQKKyAqCisgKiAgIERlc2NyaXB0aW9uOiAgQ29tbW9uIHNoYXJlZCBTQ0NCIEludGVyZmFjZSBkZWZpbmVzIGFuZCBTQ0NCIAorICoJCQkJCQkgTWFuYWdlciBzcGVjaWZpY3MgZGVmaW5lcy4KKyAqCisgKiAgICREYXRlOiAxOTk2LzEwLzI0IDIzOjA5OjMzICQKKyAqCisgKiAgICRSZXZpc2lvbjogMS4xNCAkCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX1NDQ0JfSF9fCisjZGVmaW5lIF9fU0NDQl9IX18KKworLyojaW5jbHVkZSA8b3NmbGFncy5oPiovCisvKiNpbmNsdWRlIDxnbG9iYWxzLmg+Ki8KKworI2lmIGRlZmluZWQoQlVHQlVHKQorI2RlZmluZSBkZWJ1Z19zaXplIDMyCisjZW5kaWYKKworI2lmIGRlZmluZWQoRE9TKQorCisgICB0eXBlZGVmIHN0cnVjdCBfU0NDQiBuZWFyICpQU0NDQjsKKwkjaWYgKEZXX1RZUEUgPT0gX1NDQ0JfTUdSXykKKyAgIAl0eXBlZGVmIHZvaWQgKCpDQUxMX0JLX0ZOKShQU0NDQik7CisJI2VuZGlmCisKKyNlbGlmIGRlZmluZWQoT1MyKQorCisgICB0eXBlZGVmIHN0cnVjdCBfU0NDQiBmYXIgKlBTQ0NCOworCSNpZiAoRldfVFlQRSA9PSBfU0NDQl9NR1JfKQorICAgCXR5cGVkZWYgdm9pZCAoZmFyICpDQUxMX0JLX0ZOKShQU0NDQik7CisJI2VuZGlmCisKKyNlbHNlCisKKyAgIHR5cGVkZWYgc3RydWN0IF9TQ0NCICpQU0NDQjsKKwkjaWYgKEZXX1RZUEUgPT0gX1NDQ0JfTUdSXykKKyAgIAl0eXBlZGVmIHZvaWQgKCpDQUxMX0JLX0ZOKShQU0NDQik7CisJI2VuZGlmCisKKyNlbmRpZgorCisKK3R5cGVkZWYgc3RydWN0IFNDQ0JNZ3JfaW5mbyB7CisgICBVTE9ORyAgICBzaV9iYXNlYWRkcjsKKyAgIFVDSEFSICAgIHNpX3ByZXNlbnQ7CisgICBVQ0hBUiAgICBzaV9pbnR2ZWN0OworICAgVUNIQVIgICAgc2lfaWQ7CisgICBVQ0hBUiAgICBzaV9sdW47CisgICBVU0hPUlQgICBzaV9md19yZXZpc2lvbjsKKyAgIFVTSE9SVCAgIHNpX3Blcl90YXJnX2luaXRfc3luYzsKKyAgIFVTSE9SVCAgIHNpX3Blcl90YXJnX2Zhc3RfbmVnbzsKKyAgIFVTSE9SVCAgIHNpX3Blcl90YXJnX3VsdHJhX25lZ287CisgICBVU0hPUlQgICBzaV9wZXJfdGFyZ19ub19kaXNjOworICAgVVNIT1JUICAgc2lfcGVyX3Rhcmdfd2lkZV9uZWdvOworICAgVVNIT1JUICAgc2lfZmxhZ3M7CisgICBVQ0hBUiAgICBzaV9jYXJkX2ZhbWlseTsKKyAgIFVDSEFSICAgIHNpX2J1c3R5cGU7CisgICBVQ0hBUiAgICBzaV9jYXJkX21vZGVsWzNdOworICAgVUNIQVIgICAgc2lfcmVsYXRpdmVfY2FyZG51bTsKKyAgIFVDSEFSICAgIHNpX3Jlc2VydmVkWzRdOworICAgVUxPTkcgICAgc2lfT1NfcmVzZXJ2ZWQ7CisgICBVQ0hBUiAgICBzaV9YbGF0SW5mb1s0XTsKKyAgIFVMT05HICAgIHNpX3Jlc2VydmVkMls1XTsKKyAgIFVMT05HICAgIHNpX3NlY29uZGFyeV9yYW5nZTsKK30gU0NDQk1HUl9JTkZPOworCisjaWYgZGVmaW5lZChET1MpCisgICB0eXBlZGVmIFNDQ0JNR1JfSU5GTyAqICAgICAgUFNDQ0JNR1JfSU5GTzsKKyNlbHNlCisgICAjaWYgZGVmaW5lZCAoQ09NUElMRVJfMTZfQklUKQorICAgdHlwZWRlZiBTQ0NCTUdSX0lORk8gZmFyICogIFBTQ0NCTUdSX0lORk87CisgICAjZWxzZQorICAgdHlwZWRlZiBTQ0NCTUdSX0lORk8gKiAgICAgIFBTQ0NCTUdSX0lORk87CisgICAjZW5kaWYKKyNlbmRpZiAvLyBkZWZpbmVkKERPUykKKworCisKKworI2lmIChGV19UWVBFPT1fU0NDQl9NR1JfKQorCSNkZWZpbmUgU0NTSV9QQVJJVFlfRU5BCQkgIDB4MDAwMQorCSNkZWZpbmUgTE9XX0JZVEVfVEVSTQkJICAweDAwMTAKKwkjZGVmaW5lIEhJR0hfQllURV9URVJNCQkgIDB4MDAyMAorCSNkZWZpbmUgQlVTVFlQRV9QQ0kJICAweDMKKyNlbmRpZgorCisjZGVmaW5lIFNVUFBPUlRfMTZUQVJfMzJMVU4JICAweDAwMDIKKyNkZWZpbmUgU09GVF9SRVNFVAkJICAweDAwMDQKKyNkZWZpbmUgRVhURU5ERURfVFJBTlNMQVRJT04JICAweDAwMDgKKyNkZWZpbmUgUE9TVF9BTExfVU5ERVJSUlVOUwkgIDB4MDA0MAorI2RlZmluZSBGTEFHX1NDQU1fRU5BQkxFRAkgIDB4MDA4MAorI2RlZmluZSBGTEFHX1NDQU1fTEVWRUwyCSAgMHgwMTAwCisKKworCisKKyNkZWZpbmUgSEFSUE9PTl9GQU1JTFkgICAgICAgIDB4MDIKKworCisjZGVmaW5lIElTQV9CVVNfQ0FSRCAgICAgICAgICAweDAxCisjZGVmaW5lIEVJU0FfQlVTX0NBUkQgICAgICAgICAweDAyCisjZGVmaW5lIFBDSV9CVVNfQ0FSRCAgICAgICAgICAweDAzCisjZGVmaW5lIFZFU0FfQlVTX0NBUkQgICAgICAgICAweDA0CisKKy8qIFNDQ0Igc3RydWMgdXNlZCBmb3IgYm90aCBTQ0NCIGFuZCBVQ0IgbWFuYWdlciBjb21waWxlcyEgCisgKiBUaGUgVUNCIE1hbmFnZXIgdHJlYXRzIHRoZSBTQ0NCIGFzIGl0J3MgJ25hdGl2ZSBoYXJkd2FyZSBzdHJ1Y3R1cmUnIAorICovCisKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCBfU0NDQiB7CisgICBVQ0hBUiBPcGVyYXRpb25Db2RlOworICAgVUNIQVIgQ29udHJvbEJ5dGU7CisgICBVQ0hBUiBDZGJMZW5ndGg7CisgICBVQ0hBUiBSZXF1ZXN0U2Vuc2VMZW5ndGg7CisgICBVTE9ORyBEYXRhTGVuZ3RoOworICAgVUxPTkcgRGF0YVBvaW50ZXI7CisgICBVQ0hBUiBDY2JSZXNbMl07CisgICBVQ0hBUiBIb3N0U3RhdHVzOworICAgVUNIQVIgVGFyZ2V0U3RhdHVzOworICAgVUNIQVIgVGFyZ0lEOworICAgVUNIQVIgTHVuOworICAgVUNIQVIgQ2RiWzEyXTsKKyAgIFVDSEFSIENjYlJlczE7CisgICBVQ0hBUiBSZXNlcnZlZDE7CisgICBVTE9ORyBSZXNlcnZlZDI7CisgICBVTE9ORyBTZW5zZVBvaW50ZXI7CisKKworICAgQ0FMTF9CS19GTiBTY2NiQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgLyogVk9JRCAoKlNjY2JDYWxsYmFjaykoKTsgKi8KKyAgIFVMT05HICBTY2NiSU9Qb3J0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElkZW50aWZpZXMgYm9hcmQgYmFzZSBwb3J0ICovCisgICBVQ0hBUiAgU2NjYlN0YXR1czsKKyAgIFVDSEFSICBTQ0NCUmVzMjsKKyAgIFVTSE9SVCBTY2NiT1NGbGFnczsKKworCisgICBVTE9ORyAgIFNjY2JfWGZlckNudDsgICAgICAgICAgICAvKiBhY3R1YWwgdHJhbnNmZXIgY291bnQgKi8KKyAgIFVMT05HICAgU2NjYl9BVEM7CisgICBVTE9ORyAgIFNjY2JWaXJ0RGF0YVB0cjsgICAgICAgICAvKiB2aXJ0dWFsIGFkZHIgZm9yIE9TLzIgKi8KKyAgIFVMT05HICAgU2NjYl9yZXMxOworICAgVVNIT1JUICBTY2NiX01HUkZsYWdzOworICAgVVNIT1JUICBTY2NiX3Nnc2VnOworICAgVUNIQVIgICBTY2NiX3Njc2ltc2c7ICAgICAgICAgICAgLyogaWRlbnRpZnkgbXNnIGZvciBzZWxlY3Rpb24gKi8KKyAgIFVDSEFSICAgU2NjYl90YWc7CisgICBVQ0hBUiAgIFNjY2Jfc2NzaXN0YXQ7CisgICBVQ0hBUiAgIFNjY2JfaWRtc2c7ICAgICAgICAgICAgICAvKiBpbWFnZSBvZiBsYXN0IG1zZyBpbiAqLworICAgUFNDQ0IgICBTY2NiX2ZvcndhcmRsaW5rOworICAgUFNDQ0IgICBTY2NiX2JhY2tsaW5rOworICAgVUxPTkcgICBTY2NiX3NhdmVkQVRDOworICAgVUNIQVIgICBTYXZlX0NkYls2XTsKKyAgIFVDSEFSICAgU2F2ZV9DZGJMZW47CisgICBVQ0hBUiAgIFNjY2JfWGZlclN0YXRlOworICAgVUxPTkcgICBTY2NiX1NHb2Zmc2V0OworI2lmIChGV19UWVBFID09IF9VQ0JfTUdSXykKKyAgIFBVQ0IgICAgU2NjYl91Y2JfcHRyOworI2VuZGlmCisgICB9IFNDQ0I7CisKKyNkZWZpbmUgU0NDQl9TSVpFIHNpemVvZihTQ0NCKQorCisjcHJhZ21hIHBhY2soKQorCisKKworI2RlZmluZSBTQ1NJX0lOSVRJQVRPUl9DT01NQU5EICAgIDB4MDAKKyNkZWZpbmUgVEFSR0VUX01PREVfQ09NTUFORCAgICAgICAweDAxCisjZGVmaW5lIFNDQVRURVJfR0FUSEVSX0NPTU1BTkQgICAgMHgwMgorI2RlZmluZSBSRVNJRFVBTF9DT01NQU5EICAgICAgICAgIDB4MDMKKyNkZWZpbmUgUkVTSURVQUxfU0dfQ09NTUFORCAgICAgICAweDA0CisjZGVmaW5lIFJFU0VUX0NPTU1BTkQgICAgICAgICAgICAgMHg4MQorCisKKyNkZWZpbmUgRl9VU0VfQ01EX1EgICAgICAgICAgICAgIDB4MjAgICAgIC8qSW5pZGNhdGVzIFRBR0dFRCBjb21tYW5kLiAqLworI2RlZmluZSBUQUdfVFlQRV9NQVNLICAgICAgICAgICAgMHhDMCAgICAgLypUeXBlIG9mIHRhZyBtc2cgdG8gc2VuZC4gKi8KKyNkZWZpbmUgVEFHX1FfTUFTSyAgICAgICAgICAgICAgIDB4RTAKKyNkZWZpbmUgU0NDQl9EQVRBX1hGRVJfT1VUICAgICAgIDB4MTAgICAgIC8qIFdyaXRlICovCisjZGVmaW5lIFNDQ0JfREFUQV9YRkVSX0lOICAgICAgICAweDA4ICAgICAvKiBSZWFkICovCisKKworI2RlZmluZSBGT1VSVEVFTl9CWVRFUyAgICAgICAgICAgMHgwMCAgICAgLyogUmVxdWVzdCBTZW5zZSBCdWZmZXIgc2l6ZSAqLworI2RlZmluZSBOT19BVVRPX1JFUVVFU1RfU0VOU0UgICAgMHgwMSAgICAgLyogTm8gUmVxdWVzdCBTZW5zZSBCdWZmZXIgKi8KKworCisjZGVmaW5lIEJVU19GUkVFX1NUICAgICAwICAgICAgIAorI2RlZmluZSBTRUxFQ1RfU1QgICAgICAgMQorI2RlZmluZSBTRUxFQ1RfQkRSX1NUICAgMiAgICAgLyogU2VsZWN0IHdcIEJ1cyBEZXZpY2UgUmVzZXQgKi8KKyNkZWZpbmUgU0VMRUNUX1NOX1NUICAgIDMgICAgIC8qIFNlbGVjdCB3XCBTeW5jIE5lZ28gKi8KKyNkZWZpbmUgU0VMRUNUX1dOX1NUICAgIDQgICAgIC8qIFNlbGVjdCB3XCBXaWRlIERhdGEgTmVnbyAqLworI2RlZmluZSBTRUxFQ1RfUV9TVCAgICAgNSAgICAgLyogU2VsZWN0IHdcIFRhZ2dlZCBRJ2luZyAqLworI2RlZmluZSBDT01NQU5EX1NUICAgICAgNgorI2RlZmluZSBEQVRBX09VVF9TVCAgICAgNworI2RlZmluZSBEQVRBX0lOX1NUICAgICAgOAorI2RlZmluZSBESVNDT05ORUNUX1NUICAgOQorI2RlZmluZSBTVEFUVVNfU1QgICAgICAgMTAKKyNkZWZpbmUgQUJPUlRfU1QgICAgICAgIDExCisjZGVmaW5lIE1FU1NBR0VfU1QgICAgICAxMgorCisKKyNkZWZpbmUgRl9IT1NUX1hGRVJfRElSICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRl9BTExfWEZFUlJFRCAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRl9TR19YRkVSICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRl9BVVRPX1NFTlNFICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgRl9PRERfQkFMTF9DTlQgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgRl9OT19EQVRBX1lFVCAgICAgICAgICAgICAgICAgIDB4ODAKKworCisjZGVmaW5lIEZfU1RBVFVTTE9BREVEICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEZfTVNHTE9BREVEICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEZfREVWX1NFTEVDVEVEICAgICAgICAgICAgICAgICAweDA0CisKKworI2RlZmluZSBTQ0NCX0NPTVBMRVRFICAgICAgICAgICAgICAgMHgwMCAgLyogU0NDQiBjb21wbGV0ZWQgd2l0aG91dCBlcnJvciAqLworI2RlZmluZSBTQ0NCX0RBVEFfVU5ERVJfUlVOICAgICAgICAgMHgwQworI2RlZmluZSBTQ0NCX1NFTEVDVElPTl9USU1FT1VUICAgICAgMHgxMSAgLyogU2V0IFNDU0kgc2VsZWN0aW9uIHRpbWVkIG91dCAqLworI2RlZmluZSBTQ0NCX0RBVEFfT1ZFUl9SVU4gICAgICAgICAgMHgxMgorI2RlZmluZSBTQ0NCX1VORVhQRUNURURfQlVTX0ZSRUUgICAgMHgxMyAgLyogVGFyZ2V0IGRyb3BwZWQgU0NTSSBCU1kgKi8KKyNkZWZpbmUgU0NDQl9QSEFTRV9TRVFVRU5DRV9GQUlMICAgIDB4MTQgIC8qIFRhcmdldCBidXMgcGhhc2Ugc2VxdWVuY2UgZmFpbHVyZSAqLworCisjZGVmaW5lIFNDQ0JfSU5WQUxJRF9PUF9DT0RFICAgICAgICAweDE2ICAvKiBTQ0NCIGludmFsaWQgb3BlcmF0aW9uIGNvZGUgKi8KKyNkZWZpbmUgU0NDQl9JTlZBTElEX1NDQ0IgICAgICAgICAgIDB4MUEgIC8qIEludmFsaWQgU0NDQiAtIGJhZCBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgU0NDQl9HUk9TU19GV19FUlIgICAgICAgICAgIDB4MjcgIC8qIE1ham9yIHByb2JsZW0hICovCisjZGVmaW5lIFNDQ0JfQk1fRVJSICAgICAgICAgICAgICAgICAweDMwICAvKiBCdXNNYXN0ZXIgZXJyb3IuICovCisjZGVmaW5lIFNDQ0JfUEFSSVRZX0VSUiAgICAgICAgICAgICAweDM0ICAvKiBTQ1NJIHBhcml0eSBlcnJvciAqLworCisKKworI2lmIChGV19UWVBFPT1fVUNCX01HUl8pICAKKyAgICNkZWZpbmUgIEhCQV9BVVRPX1NFTlNFX0ZBSUwgICAgICAgIDB4MUIgIAorICAgI2RlZmluZSAgSEJBX1RRX1JFSkVDVEVEICAgICAgICAgICAgMHgxQyAgCisgICAjZGVmaW5lICBIQkFfVU5TVVBQT1JURURfTVNHICAgICAgICAgMHgxRCAgCisgICAjZGVmaW5lICBIQkFfSFdfRVJST1IgICAgICAgICAgICAgICAweDIwICAKKyAgICNkZWZpbmUgIEhCQV9BVE5fTk9UX1JFU1BPTkRFRCAgICAgIDB4MjEgIAorICAgI2RlZmluZSAgSEJBX1NDU0lfUkVTRVRfQllfQURBUFRFUiAgMHgyMgorICAgI2RlZmluZSAgSEJBX1NDU0lfUkVTRVRfQllfVEFSR0VUICAgMHgyMworICAgI2RlZmluZSAgSEJBX1dST05HX0NPTk5FQ1RJT04gICAgICAgMHgyNAorICAgI2RlZmluZSAgSEJBX0JVU19ERVZJQ0VfUkVTRVQgICAgICAgMHgyNQorICAgI2RlZmluZSAgSEJBX0FCT1JUX1FVRVVFICAgICAgICAgICAgMHgyNgorCisjZWxzZSAvLyB0aGVzZSBhcmUgbm90IGRlZmluZWQgaW4gQlVESS9VQ0IKKworICAgI2RlZmluZSBTQ0NCX0lOVkFMSURfRElSRUNUSU9OICAgICAgMHgxOCAgLyogSW52YWxpZCB0YXJnZXQgZGlyZWN0aW9uICovCisgICAjZGVmaW5lIFNDQ0JfRFVQTElDQVRFX1NDQ0IgICAgICAgICAweDE5ICAvKiBEdXBsaWNhdGUgU0NDQiAqLworICAgI2RlZmluZSBTQ0NCX1NDU0lfUlNUICAgICAgICAgICAgICAgMHgzNSAgLyogU0NTSSBSRVNFVCBkZXRlY3RlZC4gKi8KKworI2VuZGlmIC8vIChGV19UWVBFPT1fVUNCX01HUl8pICAKKworCisjZGVmaW5lIFNDQ0JfSU5fUFJPQ0VTUyAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgU0NDQl9TVUNDRVNTICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBTQ0NCX0FCT1JUICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFNDQ0JfTk9UX0ZPVU5EICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgU0NDQl9FUlJPUiAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBTQ0NCX0lOVkFMSUQgICAgICAgICAgICAgICAweDA1CisKKyNkZWZpbmUgU0NDQl9TSVpFIHNpemVvZihTQ0NCKQorCisKKworCisjaWYgKEZXX1RZUEUgPT0gX1VDQl9NR1JfKQorCXZvaWQgU2NjYk1ncl9zdGFydF9zY2NiKENBUkRfSEFORExFIHBDdXJyQ2FyZCwgUFVDQiBwX3VjYik7CisJczMyYml0cyBTY2NiTWdyX2Fib3J0X3NjY2IoQ0FSRF9IQU5ETEUgcEN1cnJDYXJkLCBQVUNCIHBfdWNiKTsKKwl1MDhiaXRzIFNjY2JNZ3JfbXlfaW50KENBUkRfSEFORExFIHBDdXJyQ2FyZCk7CisJczMyYml0cyBTY2NiTWdyX2lzcihDQVJEX0hBTkRMRSBwQ3VyckNhcmQpOworCXZvaWQgU2NjYk1ncl9zY3NpX3Jlc2V0KENBUkRfSEFORExFIHBDdXJyQ2FyZCk7CisJdm9pZCBTY2NiTWdyX3RpbWVyX2V4cGlyZWQoQ0FSRF9IQU5ETEUgcEN1cnJDYXJkKTsKKwl2b2lkIFNjY2JNZ3JfdW5sb2FkX2NhcmQoQ0FSRF9IQU5ETEUgcEN1cnJDYXJkKTsKKwl2b2lkIFNjY2JNZ3JfcmVzdG9yZV9mb3JlaWduX3N0YXRlKENBUkRfSEFORExFIHBDdXJyQ2FyZCk7CisJdm9pZCBTY2NiTWdyX3Jlc3RvcmVfbmF0aXZlX3N0YXRlKENBUkRfSEFORExFIHBDdXJyQ2FyZCk7CisJdm9pZCBTY2NiTWdyX3NhdmVfZm9yZWlnbl9zdGF0ZShQQURBUFRFUl9JTkZPIHBBZGFwdGVySW5mbyk7CisKKyNlbmRpZgorCisKKyNpZiAoRldfVFlQRSA9PSBfU0NDQl9NR1JfKQorCisgI2lmIGRlZmluZWQgKERPUykKKwlpbnQgICAgU2NjYk1ncl9zZW5zZV9hZGFwdGVyKFBTQ0NCTUdSX0lORk8gcENhcmRJbmZvKTsKKwlVU0hPUlQgU2NjYk1ncl9jb25maWdfYWRhcHRlcihQU0NDQk1HUl9JTkZPIHBDYXJkSW5mbyk7CisJdm9pZCAgU2NjYk1ncl9zdGFydF9zY2NiKFVTSE9SVCBwQ3VyckNhcmQsIFBTQ0NCIHBfU0NDQik7CisJaW50ICAgU2NjYk1ncl9hYm9ydF9zY2NiKFVTSE9SVCBwQ3VyckNhcmQsIFBTQ0NCIHBfU0NDQik7CisJVUNIQVIgU2NjYk1ncl9teV9pbnQoVVNIT1JUIHBDdXJyQ2FyZCk7CisJaW50ICAgU2NjYk1ncl9pc3IoVVNIT1JUIHBDdXJyQ2FyZCk7CisJdm9pZCAgU2NjYk1ncl9zY3NpX3Jlc2V0KFVTSE9SVCBwQ3VyckNhcmQpOworCXZvaWQgIFNjY2JNZ3JfdGltZXJfZXhwaXJlZChVU0hPUlQgcEN1cnJDYXJkKTsKKwlVU0hPUlQgU2NjYk1ncl9zdGF0dXMoVVNIT1JUIHBDdXJyQ2FyZCk7CisJdm9pZCBTY2NiTWdyX3VubG9hZF9jYXJkKFVTSE9SVCBwQ3VyckNhcmQpOworCisgI2Vsc2UgICAgLy9ub24tRE9TCisKKwlpbnQgICBTY2NiTWdyX3NlbnNlX2FkYXB0ZXIoUFNDQ0JNR1JfSU5GTyBwQ2FyZEluZm8pOworCVVMT05HIFNjY2JNZ3JfY29uZmlnX2FkYXB0ZXIoUFNDQ0JNR1JfSU5GTyBwQ2FyZEluZm8pOworCXZvaWQgIFNjY2JNZ3Jfc3RhcnRfc2NjYihVTE9ORyBwQ3VyckNhcmQsIFBTQ0NCIHBfU0NDQik7CisJaW50ICAgU2NjYk1ncl9hYm9ydF9zY2NiKFVMT05HIHBDdXJyQ2FyZCwgUFNDQ0IgcF9TQ0NCKTsKKwlVQ0hBUiBTY2NiTWdyX215X2ludChVTE9ORyBwQ3VyckNhcmQpOworCWludCAgIFNjY2JNZ3JfaXNyKFVMT05HIHBDdXJyQ2FyZCk7CisJdm9pZCAgU2NjYk1ncl9zY3NpX3Jlc2V0KFVMT05HIHBDdXJyQ2FyZCk7CisJdm9pZCAgU2NjYk1ncl9lbmFibGVfaW50KFVMT05HIHBDdXJyQ2FyZCk7CisJdm9pZCAgU2NjYk1ncl9kaXNhYmxlX2ludChVTE9ORyBwQ3VyckNhcmQpOworCXZvaWQgIFNjY2JNZ3JfdGltZXJfZXhwaXJlZChVTE9ORyBwQ3VyckNhcmQpOworCXZvaWQgU2NjYk1ncl91bmxvYWRfY2FyZChVTE9ORyBwQ3VyckNhcmQpOworCisgICNlbmRpZgorI2VuZGlmICAvLyAoRldfVFlQRSA9PSBfU0NDQl9NR1JfKQorCisjZW5kaWYgIC8qIF9fU0NDQl9IX18gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoKKyAqICAgQ29weXJpZ2h0IDE5OTUtMTk5NiBieSBNeWxleCBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYm90aCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYW5kIGEgQlNELXN0eWxlIGNvcHlyaWdodDsgc2VlIExJQ0VOU0UuRmxhc2hQb2ludCBmb3IgZGV0YWlscy4KKyAqCisgKiAgICRXb3JrZmlsZTogICBibHgzMC5oICAkCisgKgorICogICBEZXNjcmlwdGlvbjogVGhpcyBtb2R1bGUgY29udGFpbnMgU0NDQi9VQ0IgTWFuYWdlciBpbXBsZW1lbnRhdGlvbgorICogICAgICAgICAgICAgICAgc3BlY2lmaWMgc3R1ZmYuCisgKgorICogICAkRGF0ZTogMTk5Ni8xMS8xMyAxODozNDoyMiAkCisgKgorICogICAkUmV2aXNpb246IDEuMTAgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworI2lmbmRlZiBfX2JseDMwX0hfXworI2RlZmluZSBfX2JseDMwX0hfXworCisvKiNpbmNsdWRlIDxnbG9iYWxzLmg+Ki8KKworI2RlZmluZSAgT1JJT05fRldfUkVWICAgICAgMzExMAorCisKKworCisjZGVmaW5lIEhBUlBfUkVWRCAgICAxCisKKworI2lmIGRlZmluZWQoRE9TKQorI2RlZmluZSBRVUVVRV9ERVBUSCAgICAgOCsxICAgICAgICAgICAgLyoxIGZvciBOb3JtYWwgZGlzY29ubmVjdCAwIGZvciBRJ2luZy4gKi8KKyNlbHNlCisjZGVmaW5lIFFVRVVFX0RFUFRIICAgICAyNTQrMSAgICAgICAgICAgIC8qMSBmb3IgTm9ybWFsIGRpc2Nvbm5lY3QgMzIgZm9yIFEnaW5nLiAqLworI2VuZGlmICAgLy8gZGVmaW5lZChET1MpCisKKyNkZWZpbmUJTUFYX01CX0NBUkRTCTQJCQkJCS8qIE1heC4gbm8gb2YgY2FyZHMgc3VwcG9lcnRlZCBvbiBNb3RoZXIgQm9hcmQgKi8KKworI2RlZmluZSBXSURFX1NDU0kgICAgICAgMQorCisjaWYgZGVmaW5lZChXSURFX1NDU0kpCisgICAjaWYgZGVmaW5lZChET1MpCisgICAgICAjZGVmaW5lIE1BWF9TQ1NJX1RBUiAgICAxNgorICAgICAgI2RlZmluZSBNQVhfTFVOICAgICAgICAgOAorCQkjZGVmaW5lIExVTl9NQVNLCQkJMHgwNworICAgI2Vsc2UKKyAgICAgICNkZWZpbmUgTUFYX1NDU0lfVEFSICAgIDE2CisgICAgICAjZGVmaW5lIE1BWF9MVU4gICAgICAgICAzMgorCQkjZGVmaW5lIExVTl9NQVNLCQkJMHgxZgorCQorICAgI2VuZGlmCisjZWxzZQorICAgI2RlZmluZSBNQVhfU0NTSV9UQVIgICAgOAorICAgI2RlZmluZSBNQVhfTFVOICAgICAgICAgOAorCSNkZWZpbmUgTFVOX01BU0sJCQkweDA3CisjZW5kaWYgCisKKyNpZiBkZWZpbmVkKEhBUlBfUkVWQSkKKyNkZWZpbmUgU0dfQlVGX0NOVCAgICAgIDE1ICAgICAgICAgICAgIC8qTnVtYmVyIG9mIHByZWZldGNoZWQgZWxlbWVudHMuICovCisjZWxzZQorI2RlZmluZSBTR19CVUZfQ05UICAgICAgMTYgICAgICAgICAgICAgLypOdW1iZXIgb2YgcHJlZmV0Y2hlZCBlbGVtZW50cy4gKi8KKyNlbmRpZgorCisjZGVmaW5lIFNHX0VMRU1FTlRfU0laRSA4ICAgICAgICAgICAgICAvKkVpZ2h0IGJ5dGUgcGVyIGVsZW1lbnQuICovCisjZGVmaW5lIFNHX0xPQ0FMX01BU0sgICAweDAwMDAwMDAwTAorI2RlZmluZSBTR19FTEVNRU5UX01BU0sgMHhGRkZGRkZGRkwKKworCisjaWYgKEZXX1RZUEUgPT0gX1VDQl9NR1JfKQorCSNkZWZpbmUgT1BDX0RFQ09ERV9OT1JNQUwgICAgICAgMHgwZjdmCisjZW5kaWYgICAvLyBfVUNCX01HUl8KKworCisKKyNpZiBkZWZpbmVkKERPUykKKworLyojaW5jbHVkZSA8ZG9zLmg+Ki8KKwkjZGVmaW5lIFJEX0hBUlBPT04oaW9wb3J0KSAgICAgICAgICAoT1NfSW5Qb3J0Qnl0ZShpb3BvcnQpKQorCSNkZWZpbmUgUkRXX0hBUlBPT04oaW9wb3J0KSAgICAgICAgIChPU19JblBvcnRXb3JkKGlvcG9ydCkpCisJI2RlZmluZSBXUl9IQVJQT09OKGlvcG9ydCx2YWwpICAgICAgKE9TX091dFBvcnRCeXRlKGlvcG9ydCx2YWwpKQorCSNkZWZpbmUgV1JXX0hBUlBPT04oaW9wb3J0LHZhbCkgICAgIChPU19PdXRQb3J0V29yZChpb3BvcnQsdmFsKSkKKworCSNkZWZpbmUgUkRfSEFSUDMyKHBvcnQsb2Zmc2V0LGRhdGEpICBhc217ZGIgNjZoOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggYXg7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdiBkeCxwb3J0OyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCBkeCwgb2Zmc2V0OyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiIDY2aDsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGF4LGR4OyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiIDY2aDsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdiB3b3JkIHB0ciBkYXRhLGF4O1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiIDY2aDsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcCBheH0KKworCSNkZWZpbmUgV1JfSEFSUDMyKHBvcnQsb2Zmc2V0LGRhdGEpIGFzbXtkYiA2Nmg7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggYXg7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdiBkeCxwb3J0OyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCBkeCwgb2Zmc2V0OyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiIDY2aDsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdiBheCx3b3JkIHB0ciBkYXRhO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiIDY2aDsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBkeCxheDsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiIDY2aDsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcCBheH0KKyNlbmRpZgkvKiBET1MgKi8KKworI2lmIGRlZmluZWQoTkVUV0FSRSkgfHwgZGVmaW5lZChPVEhFUl8zMikgfHwgIGRlZmluZWQoT1RIRVJfMTYpCisJI2RlZmluZSBSRF9IQVJQT09OKGlvcG9ydCkgICAgIE9TX0luUG9ydEJ5dGUoKHVuc2lnbmVkIGxvbmcpaW9wb3J0KQorCSNkZWZpbmUgUkRXX0hBUlBPT04oaW9wb3J0KSAgICBPU19JblBvcnRXb3JkKCh1bnNpZ25lZCBsb25nKWlvcG9ydCkKKwkjZGVmaW5lIFJEX0hBUlAzMihpb3BvcnQsb2Zmc2V0LGRhdGEpIChkYXRhID0gT1NfSW5Qb3J0TG9uZyhpb3BvcnQgKyBvZmZzZXQpKQorCSNkZWZpbmUgV1JfSEFSUE9PTihpb3BvcnQsdmFsKSBPU19PdXRQb3J0Qnl0ZSgoVUxPTkcpaW9wb3J0LChVQ0hBUikgdmFsKQorCSNkZWZpbmUgV1JXX0hBUlBPT04oaW9wb3J0LHZhbCkgIE9TX091dFBvcnRXb3JkKChVTE9ORylpb3BvcnQsKFVTSE9SVCl2YWwpCisJI2RlZmluZSBXUl9IQVJQMzIoaW9wb3J0LG9mZnNldCxkYXRhKSAgT1NfT3V0UG9ydExvbmcoKGlvcG9ydCArIG9mZnNldCksIGRhdGEpCisjZW5kaWYJLyogTkVUV0FSRSB8fCBPVEhFUl8zMiB8fCBPVEhFUl8xNiAqLworCisjaWYgZGVmaW5lZChOVCkgfHwgZGVmaW5lZChXSU45NV8zMikgfHwgZGVmaW5lZChXSU45NV8xNikKKwkjZGVmaW5lIFJEX0hBUlBPT04oaW9wb3J0KSAgICAgICAgICBPU19JblBvcnRCeXRlKChVTE9ORylpb3BvcnQpCisJI2RlZmluZSBSRFdfSEFSUE9PTihpb3BvcnQpICAgICAgICAgT1NfSW5Qb3J0V29yZCgoVUxPTkcpaW9wb3J0KQorCSNkZWZpbmUgUkRfSEFSUDMyKGlvcG9ydCxvZmZzZXQsZGF0YSkgKGRhdGEgPSBPU19JblBvcnRMb25nKChVTE9ORykoaW9wb3J0ICsgb2Zmc2V0KSkpCisJI2RlZmluZSBXUl9IQVJQT09OKGlvcG9ydCx2YWwpICAgICAgT1NfT3V0UG9ydEJ5dGUoKFVMT05HKWlvcG9ydCwoVUNIQVIpIHZhbCkKKwkjZGVmaW5lIFdSV19IQVJQT09OKGlvcG9ydCx2YWwpICAgICBPU19PdXRQb3J0V29yZCgoVUxPTkcpaW9wb3J0LChVU0hPUlQpdmFsKQorCSNkZWZpbmUgV1JfSEFSUDMyKGlvcG9ydCxvZmZzZXQsZGF0YSkgIE9TX091dFBvcnRMb25nKChVTE9ORykoaW9wb3J0ICsgb2Zmc2V0KSwgZGF0YSkKKyNlbmRpZiAvKiBOVCB8fCBXSU45NV8zMiB8fCBXSU45NV8xNiAqLworCisjaWYgZGVmaW5lZCAoVU5JWCkKKwkjZGVmaW5lIFJEX0hBUlBPT04oaW9wb3J0KSAgICAgICAgICBPU19JblBvcnRCeXRlKCh1MzJiaXRzKWlvcG9ydCkKKwkjZGVmaW5lIFJEV19IQVJQT09OKGlvcG9ydCkgICAgICAgICBPU19JblBvcnRXb3JkKCh1MzJiaXRzKWlvcG9ydCkKKwkjZGVmaW5lIFJEX0hBUlAzMihpb3BvcnQsb2Zmc2V0LGRhdGEpIChkYXRhID0gT1NfSW5Qb3J0TG9uZygodTMyYml0cykoaW9wb3J0ICsgb2Zmc2V0KSkpCisJI2RlZmluZSBXUl9IQVJQT09OKGlvcG9ydCx2YWwpICAgICAgT1NfT3V0UG9ydEJ5dGUoKHUzMmJpdHMpaW9wb3J0LCh1MDhiaXRzKSB2YWwpCisJI2RlZmluZSBXUldfSEFSUE9PTihpb3BvcnQsdmFsKSAgICAgICBPU19PdXRQb3J0V29yZCgodTMyYml0cylpb3BvcnQsKHUxNmJpdHMpdmFsKQorCSNkZWZpbmUgV1JfSEFSUDMyKGlvcG9ydCxvZmZzZXQsZGF0YSkgIE9TX091dFBvcnRMb25nKCh1MzJiaXRzKShpb3BvcnQgKyBvZmZzZXQpLCBkYXRhKQorI2VuZGlmIC8qIFVOSVggKi8KKworI2lmIGRlZmluZWQoT1MyKQorCSNkZWZpbmUgUkRfSEFSUE9PTihpb3BvcnQpICAgICAgICAgIE9TX0luUG9ydEJ5dGUoKHVuc2lnbmVkIGxvbmcpaW9wb3J0KQorCSNkZWZpbmUgUkRXX0hBUlBPT04oaW9wb3J0KSAgICAgICAgIE9TX0luUG9ydFdvcmQoKHVuc2lnbmVkIGxvbmcpaW9wb3J0KQorCSNkZWZpbmUgUkRfSEFSUDMyKGlvcG9ydCxvZmZzZXQsZGF0YSkgKGRhdGEgPSBPU19JblBvcnRMb25nKChVTE9ORykoaW9wb3J0ICsgb2Zmc2V0KSkpCisJI2RlZmluZSBXUl9IQVJQT09OKGlvcG9ydCx2YWwpICAgICAgT1NfT3V0UG9ydEJ5dGUoKFVMT05HKWlvcG9ydCwoVUNIQVIpIHZhbCkKKwkjZGVmaW5lIFdSV19IQVJQT09OKGlvcG9ydCx2YWwpICAgICAgIE9TX091dFBvcnRXb3JkKChVTE9ORylpb3BvcnQsKFVTSE9SVCl2YWwpCisJI2RlZmluZSBXUl9IQVJQMzIoaW9wb3J0LG9mZnNldCxkYXRhKSAgT1NfT3V0UG9ydExvbmcoKChVTE9ORykoaW9wb3J0ICsgb2Zmc2V0KSksIGRhdGEpCisjZW5kaWYgLyogT1MyICovCisKKyNpZiBkZWZpbmVkKFNPTEFSSVNfUkVBTF9NT0RFKQorCisJI2RlZmluZSBSRF9IQVJQT09OKGlvcG9ydCkgICAgICAgICAgT1NfSW5Qb3J0Qnl0ZSgodW5zaWduZWQgbG9uZylpb3BvcnQpCisJI2RlZmluZSBSRFdfSEFSUE9PTihpb3BvcnQpICAgICAgICAgT1NfSW5Qb3J0V29yZCgodW5zaWduZWQgbG9uZylpb3BvcnQpCisJI2RlZmluZSBSRF9IQVJQMzIoaW9wb3J0LG9mZnNldCxkYXRhKSAoZGF0YSA9IE9TX0luUG9ydExvbmcoKFVMT05HKShpb3BvcnQgKyBvZmZzZXQpKSkKKwkjZGVmaW5lIFdSX0hBUlBPT04oaW9wb3J0LHZhbCkgICAgICBPU19PdXRQb3J0Qnl0ZSgoVUxPTkcpaW9wb3J0LChVQ0hBUikgdmFsKQorCSNkZWZpbmUgV1JXX0hBUlBPT04oaW9wb3J0LHZhbCkgICAgICAgT1NfT3V0UG9ydFdvcmQoKFVMT05HKWlvcG9ydCwoVVNIT1JUKXZhbCkKKwkjZGVmaW5lIFdSX0hBUlAzMihpb3BvcnQsb2Zmc2V0LGRhdGEpICBPU19PdXRQb3J0TG9uZygoVUxPTkcpKGlvcG9ydCArIG9mZnNldCksIChVTE9ORylkYXRhKQorCisjZW5kaWYgIC8qIFNPTEFSSVNfUkVBTF9NT0RFICovCisKKyNlbmRpZiAgLyogX19CTFgzMF9IX18gKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIAorICoKKyAqICAgQ29weXJpZ2h0IDE5OTUtMTk5NiBieSBNeWxleCBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYm90aCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYW5kIGEgQlNELXN0eWxlIGNvcHlyaWdodDsgc2VlIExJQ0VOU0UuRmxhc2hQb2ludCBmb3IgZGV0YWlscy4KKyAqCisgKiAgICRXb3JrZmlsZTogICB0YXJnZXQuaCAgJAorICoKKyAqICAgRGVzY3JpcHRpb246ICBEZWZpbml0aW9ucyBmb3IgVGFyZ2V0IHJlbGF0ZWQgc3RydWN0dXJlcworICoKKyAqICAgJERhdGU6IDE5OTYvMTIvMTEgMjI6MDY6MjAgJAorICoKKyAqICAgJFJldmlzaW9uOiAxLjkgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19UQVJHRVRfXworI2RlZmluZSBfX1RBUkdFVF9fCisKKy8qI2luY2x1ZGUgPGdsb2JhbHMuaD4qLworLyojaW5jbHVkZSA8Ymx4MzAuaD4qLworCisKKyNkZWZpbmUgIFRBUl9TWU5DX01BU0sgICAgIChCSVQoNykrQklUKDYpKQorI2RlZmluZSAgU1lOQ19VTktOT1dOICAgICAgMHgwMAorI2RlZmluZSAgU1lOQ19UUllJTkcgICAgICAgICAgICAgICBCSVQoNikKKyNkZWZpbmUgIFNZTkNfU1VQUE9SVEVEICAgIChCSVQoNykrQklUKDYpKQorCisjZGVmaW5lICBUQVJfV0lERV9NQVNLICAgICAoQklUKDUpK0JJVCg0KSkKKyNkZWZpbmUgIFdJREVfRElTQUJMRUQgICAgIDB4MDAKKyNkZWZpbmUgIFdJREVfRU5BQkxFRCAgICAgICAgICAgICAgQklUKDQpCisjZGVmaW5lICBXSURFX05FR09DSUFURUQgICBCSVQoNSkKKworI2RlZmluZSAgVEFSX1RBR19RX01BU0sgICAgKEJJVCgzKStCSVQoMikpCisjZGVmaW5lICBUQUdfUV9VTktOT1dOICAgICAweDAwCisjZGVmaW5lICBUQUdfUV9UUllJTkcgICAgICAgICAgICAgIEJJVCgyKQorI2RlZmluZSAgVEFHX1FfUkVKRUNUICAgICAgQklUKDMpCisjZGVmaW5lICBUQUdfUV9TVVBQT1JURUQgICAoQklUKDMpK0JJVCgyKSkKKworI2RlZmluZSAgVEFSX0FMTE9XX0RJU0MgICAgQklUKDApCisKKworI2RlZmluZSAgRUVfU1lOQ19NQVNLICAgICAgKEJJVCgwKStCSVQoMSkpCisjZGVmaW5lICBFRV9TWU5DX0FTWU5DICAgICAweDAwCisjZGVmaW5lICBFRV9TWU5DXzVNQiAgICAgICBCSVQoMCkKKyNkZWZpbmUgIEVFX1NZTkNfMTBNQiAgICAgIEJJVCgxKQorI2RlZmluZSAgRUVfU1lOQ18yME1CICAgICAgKEJJVCgwKStCSVQoMSkpCisKKyNkZWZpbmUgIEVFX0FMTE9XX0RJU0MgICAgIEJJVCg2KQorI2RlZmluZSAgRUVfV0lERV9TQ1NJICAgICAgQklUKDcpCisKKworI2lmIGRlZmluZWQoRE9TKQorICAgdHlwZWRlZiBzdHJ1Y3QgU0NDQk1ncl90YXJfaW5mbyBuZWFyICpQU0NDQk1ncl90YXJfaW5mbzsKKworI2VsaWYgZGVmaW5lZChPUzIpCisgICB0eXBlZGVmIHN0cnVjdCBTQ0NCTWdyX3Rhcl9pbmZvIGZhciAqUFNDQ0JNZ3JfdGFyX2luZm87CisKKyNlbHNlCisgICB0eXBlZGVmIHN0cnVjdCBTQ0NCTWdyX3Rhcl9pbmZvICpQU0NDQk1ncl90YXJfaW5mbzsKKworI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgU0NDQk1ncl90YXJfaW5mbyB7CisKKyAgIFBTQ0NCICAgIFRhclNlbFFfSGVhZDsKKyAgIFBTQ0NCICAgIFRhclNlbFFfVGFpbDsKKyAgIFVDSEFSICAgIFRhckxVTl9DQTsgICAgICAgIC8qQ29udGluZ2VudCBBbGxnaWFuY2UgKi8KKyAgIFVDSEFSICAgIFRhclRhZ1FfQ250OworICAgVUNIQVIgICAgVGFyU2VsUV9DbnQ7CisgICBVQ0hBUiAgICBUYXJTdGF0dXM7CisgICBVQ0hBUiAgICBUYXJFRVZhbHVlOworICAgVUNIQVIgCVRhclN5bmNDdHJsOworICAgVUNIQVIgCVRhclJlc2VydmVkWzJdOwkJCS8qIGZvciBhbGlnbm1lbnQgKi8gCisgICBVQ0hBUiAJTHVuRGlzY1FfSWR4W01BWF9MVU5dOworICAgVUNIQVIgICAgVGFyTFVOQnVzeVtNQVhfTFVOXTsKK30gU0NDQk1HUl9UQVJfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgTlZSQU1JbmZvIHsKKwlVQ0hBUgkJbmlNb2RlbDsJCQkJCQkJCS8qIE1vZGVsIE5vLiBvZiBjYXJkICovCisJVUNIQVIJCW5pQ2FyZE5vOwkJCQkJCQkvKiBDYXJkIG5vLiAqLworI2lmIGRlZmluZWQoRE9TKQorCVVTSE9SVAluaUJhc2VBZGRyOwkJCQkJCQkvKiBQb3J0IEFkZHJlc3Mgb2YgY2FyZCAqLworI2Vsc2UKKwlVTE9ORwkJbmlCYXNlQWRkcjsJCQkJCQkJLyogUG9ydCBBZGRyZXNzIG9mIGNhcmQgKi8KKyNlbmRpZgorCVVDSEFSCQluaVN5c0NvbmY7CQkJCQkJCS8qIEFkYXB0ZXIgQ29uZmlndXJhdGlvbiBieXRlIC0gQnl0ZSAxNiBvZiBlZXByb20gbWFwICovCisJVUNIQVIJCW5pU2NzaUNvbmY7CQkJCQkJCS8qIFNDU0kgQ29uZmlndXJhdGlvbiBieXRlIC0gQnl0ZSAxNyBvZiBlZXByb20gbWFwICovCisJVUNIQVIJCW5pU2NhbUNvbmY7CQkJCQkJCS8qIFNDQU0gQ29uZmlndXJhdGlvbiBieXRlIC0gQnl0ZSAyMCBvZiBlZXByb20gbWFwICovCisJVUNIQVIJCW5pQWRhcElkOwkJCQkJCQkvKiBIb3N0IEFkYXB0ZXIgSUQgLSBCeXRlIDI0IG9mIGVlcnBvbSBtYXAgKi8KKwlVQ0hBUgkJbmlTeW5jVGJsW01BWF9TQ1NJX1RBUiAvIDJdOwkvKiBTeW5jL1dpZGUgYnl0ZSBvZiB0YXJnZXRzICovCisJVUNIQVIJCW5pU2NhbVRibFtNQVhfU0NTSV9UQVJdWzRdOwkvKiBDb21wcmVzc2VkIFNjYW0gbmFtZSBzdHJpbmcgb2YgVGFyZ2V0cyAqLworfU5WUkFNSU5GTzsKKworI2lmIGRlZmluZWQoRE9TKQordHlwZWRlZiBOVlJBTUlORk8gbmVhciAqUE5WUmFtSW5mbzsKKyNlbGlmIGRlZmluZWQgKE9TMikKK3R5cGVkZWYgTlZSQU1JTkZPIGZhciAqUE5WUmFtSW5mbzsKKyNlbHNlCit0eXBlZGVmIE5WUkFNSU5GTyAqUE5WUmFtSW5mbzsKKyNlbmRpZgorCisjZGVmaW5lCU1PREVMX0xUCQkxCisjZGVmaW5lCU1PREVMX0RMCQkyCisjZGVmaW5lCU1PREVMX0xXCQkzCisjZGVmaW5lCU1PREVMX0RXCQk0CisKKwordHlwZWRlZiBzdHJ1Y3QgU0NDQmNhcmQgeworICAgUFNDQ0IgY3VycmVudFNDQ0I7CisjaWYgKEZXX1RZUEU9PV9TQ0NCX01HUl8pCisgICBQU0NDQk1HUl9JTkZPIGNhcmRJbmZvOworI2Vsc2UKKyAgIFBBREFQVEVSX0lORk8gY2FyZEluZm87CisjZW5kaWYKKworI2lmIGRlZmluZWQoRE9TKQorICAgVVNIT1JUIGlvUG9ydDsKKyNlbHNlCisgICBVTE9ORyBpb1BvcnQ7CisjZW5kaWYKKworICAgVVNIT1JUIGNtZENvdW50ZXI7CisgICBVQ0hBUiAgZGlzY1FDb3VudDsKKyAgIFVDSEFSICB0YWdRX0xzdDsgCisgICBVQ0hBUiBjYXJkSW5kZXg7CisgICBVQ0hBUiBzY2FuSW5kZXg7CisgICBVQ0hBUiBnbG9iYWxGbGFnczsKKyAgIFVDSEFSIG91cklkOworICAgUE5WUmFtSW5mbyBwTnZSYW1JbmZvOworICAgUFNDQ0IgZGlzY1FfVGJsW1FVRVVFX0RFUFRIXTsgCisgICAgICAKK31TQ0NCQ0FSRDsKKworI2lmIGRlZmluZWQoRE9TKQordHlwZWRlZiBzdHJ1Y3QgU0NDQmNhcmQgbmVhciAqUFNDQ0JjYXJkOworI2VsaWYgZGVmaW5lZCAoT1MyKQordHlwZWRlZiBzdHJ1Y3QgU0NDQmNhcmQgZmFyICpQU0NDQmNhcmQ7CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QgU0NDQmNhcmQgKlBTQ0NCY2FyZDsKKyNlbmRpZgorCisKKyNkZWZpbmUgRl9UQUdfU1RBUlRFRAkJMHgwMQorI2RlZmluZSBGX0NPTkxVTl9JTwkJCTB4MDIKKyNkZWZpbmUgRl9ET19SRU5FR08JCQkweDA0CisjZGVmaW5lIEZfTk9fRklMVEVSCQkJMHgwOAorI2RlZmluZSBGX0dSRUVOX1BDCQkJMHgxMAorI2RlZmluZSBGX0hPU1RfWEZFUl9BQ1QJCTB4MjAKKyNkZWZpbmUgRl9ORVdfU0NDQl9DTUQJCTB4NDAKKyNkZWZpbmUgRl9VUERBVEVfRUVQUk9NCQkweDgwCisKKworI2RlZmluZSAgSURfU1RSSU5HX0xFTkdUSCAgMzIKKyNkZWZpbmUgIFRZUEVfQ09ERTAgICAgICAgIDB4NjMgICAgICAgICAgIC8qTGV2ZWwyIE1zdHIgKGJpdHMgNy02KSwgICovCisKKyNkZWZpbmUgIFRZUEVfQ09ERTEgICAgICAgIDAwICAgICAgICAgICAgIC8qTm8gSUQgeWV0ICovCisKKyNkZWZpbmUgIFNMVl9UWVBFX0NPREUwICAgIDB4QTMgICAgICAgICAgIC8qUHJpb3JpdHkgQml0IHNldCAoYml0cyA3LTYpLCAgKi8KKworI2RlZmluZSAgQVNTSUdOX0lEICAgMHgwMAorI2RlZmluZSAgU0VUX1BfRkxBRyAgMHgwMQorI2RlZmluZSAgQ0ZHX0NNUExUICAgMHgwMworI2RlZmluZSAgRE9NX01TVFIgICAgMHgwRgorI2RlZmluZSAgU1lOQ19QVFJOICAgMHgxRgorCisjZGVmaW5lICBJRF8wXzcgICAgICAweDE4CisjZGVmaW5lICBJRF84X0YgICAgICAweDExCisjZGVmaW5lICBJRF8xMF8xNyAgICAweDEyCisjZGVmaW5lICBJRF8xOF8xRiAgICAweDBCCisjZGVmaW5lICBNSVNDX0NPREUgICAweDE0CisjZGVmaW5lICBDTFJfUF9GTEFHICAweDE4CisjZGVmaW5lICBMT0NBVEVfT04gICAweDEyCisjZGVmaW5lICBMT0NBVEVfT0ZGICAweDBCCisKKyNkZWZpbmUgIExWTF8xX01TVCAgIDB4MDAKKyNkZWZpbmUgIExWTF8yX01TVCAgIDB4NDAKKyNkZWZpbmUgIERPTV9MVkxfMiAgIDB4QzAKKworCisjZGVmaW5lICBJTklUX1NFTFREICAweDAxCisjZGVmaW5lICBMRVZFTDJfVEFSICAweDAyCisKKworZW51bSBzY2FtX2lkX3N0IHsgSUQwLElEMSxJRDIsSUQzLElENCxJRDUsSUQ2LElENyxJRDgsSUQ5LElEMTAsSUQxMSxJRDEyLAorICAgICAgICAgICAgICAgICAgSUQxMyxJRDE0LElEMTUsSURfVU5VU0VELElEX1VOQVNTSUdORUQsSURfQVNTSUdORUQsTEVHQUNZLAorICAgICAgICAgICAgICAgICAgQ0xSX1BSSU9SSVRZLE5PX0lEX0FWQUlMIH07CisKK3R5cGVkZWYgc3RydWN0IFNDQ0JzY2FtX2luZm8geworCisgICBVQ0hBUiAgICBpZF9zdHJpbmdbSURfU1RSSU5HX0xFTkdUSF07CisgICBlbnVtIHNjYW1faWRfc3Qgc3RhdGU7CisgICAgCit9IFNDQ0JTQ0FNX0lORk8sICpQU0NDQlNDQU1fSU5GTzsKKworI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKgorICogICBDb3B5cmlnaHQgMTk5NS0xOTk2IGJ5IE15bGV4IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBib3RoIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbmQgYSBCU0Qtc3R5bGUgY29weXJpZ2h0OyBzZWUgTElDRU5TRS5GbGFzaFBvaW50IGZvciBkZXRhaWxzLgorICoKKyAqICAgJFdvcmtmaWxlOiAgIHNjc2kyLmggICQKKyAqCisgKiAgIERlc2NyaXB0aW9uOiAgUmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIEhBUlBPT04gQVNJQy4KKyAqCisgKiAgICREYXRlOiAxOTk2LzExLzEzIDE4OjMyOjU3ICQKKyAqCisgKiAgICRSZXZpc2lvbjogMS40ICQKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9fU0NTSV9IX18KKyNkZWZpbmUgX19TQ1NJX0hfXworCisKKworI2RlZmluZSAgU0NTSV9URVNUX1VOSVRfUkVBRFkgICAgMHgwMAorI2RlZmluZSAgU0NTSV9SRVpFUk9fVU5JVCAgICAgICAgMHgwMQorI2RlZmluZSAgU0NTSV9SRVFVRVNUX1NFTlNFICAgICAgMHgwMworI2RlZmluZSAgU0NTSV9GT1JNQVRfVU5JVCAgICAgICAgMHgwNAorI2RlZmluZSAgU0NTSV9SRUFTU0lHTiAgICAgICAgICAgMHgwNworI2RlZmluZSAgU0NTSV9SRUFEICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSAgU0NTSV9XUklURSAgICAgICAgICAgICAgMHgwQQorI2RlZmluZSAgU0NTSV9TRUVLICAgICAgICAgICAgICAgMHgwQgorI2RlZmluZSAgU0NTSV9JTlFVSVJZICAgICAgICAgICAgMHgxMgorI2RlZmluZSAgU0NTSV9NT0RFX1NFTEVDVCAgICAgICAgMHgxNQorI2RlZmluZSAgU0NTSV9SRVNFUlZFX1VOSVQgICAgICAgMHgxNgorI2RlZmluZSAgU0NTSV9SRUxFQVNFX1VOSVQgICAgICAgMHgxNworI2RlZmluZSAgU0NTSV9NT0RFX1NFTlNFICAgICAgICAgMHgxQQorI2RlZmluZSAgU0NTSV9TVEFSVF9TVE9QX1VOSVQgICAgMHgxQgorI2RlZmluZSAgU0NTSV9TRU5EX0RJQUdOT1NUSUMgICAgMHgxRAorI2RlZmluZSAgU0NTSV9SRUFEX0NBUEFDSVRZICAgICAgMHgyNQorI2RlZmluZSAgU0NTSV9SRUFEX0VYVEVOREVEICAgICAgMHgyOAorI2RlZmluZSAgU0NTSV9XUklURV9FWFRFTkRFRCAgICAgMHgyQQorI2RlZmluZSAgU0NTSV9TRUVLX0VYVEVOREVEICAgICAgMHgyQgorI2RlZmluZSAgU0NTSV9XUklURV9BTkRfVkVSSUZZICAgMHgyRQorI2RlZmluZSAgU0NTSV9WRVJJRlkgICAgICAgICAgICAgMHgyRgorI2RlZmluZSAgU0NTSV9SRUFEX0RFRkVDVF9EQVRBICAgMHgzNworI2RlZmluZSAgU0NTSV9XUklURV9CVUZGRVIgICAgICAgMHgzQgorI2RlZmluZSAgU0NTSV9SRUFEX0JVRkZFUiAgICAgICAgMHgzQworI2RlZmluZSAgU0NTSV9SRUNWX0RJQUdOT1NUSUMgICAgMHgxQworI2RlZmluZSAgU0NTSV9SRUFEX0xPTkcgICAgICAgICAgMHgzRQorI2RlZmluZSAgU0NTSV9XUklURV9MT05HICAgICAgICAgMHgzRgorI2RlZmluZSAgU0NTSV9MQVNUX1NDU0lfQ01ORCAgICAgU0NTSV9XUklURV9MT05HCisjZGVmaW5lICBTQ1NJX0lOVkFMSURfQ01ORCAgICAgICAweEZGCisKKworCisjZGVmaW5lICBTU0dPT0QgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lICBTU0NIRUNLICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lICBTU0NPTkRfTUVUICAgICAgICAgICAgICAweDA0CisjZGVmaW5lICBTU0JVU1kgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lICBTU1JFU0VSVkFUSU9OX0NPTkZMSUNUICAweDE4CisjZGVmaW5lICBTU0NNRF9URVJNICAgICAgICAgICAgICAweDIyCisjZGVmaW5lICBTU1FfRlVMTCAgICAgICAgICAgICAgICAweDI4CisKKworI2RlZmluZSAgU0tOT19TRU4gICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSAgU0tSRUNPVl9FUlIgICAgICAgICAgICAgMHgwMQorI2RlZmluZSAgU0tOT1RfUkRZICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSAgU0tNRURfRVJSICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSAgU0tIV19FUlIgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSAgU0tJTExfUkVRICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSAgU0tVTklUX0FUVE4gICAgICAgICAgICAgMHgwNgorI2RlZmluZSAgU0tEQVRBX1BST1RFQ1QgICAgICAgICAgMHgwNworI2RlZmluZSAgU0tCTE5LX0NISyAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSAgU0tDUFlfQUJPUlQgICAgICAgICAgICAgMHgwQQorI2RlZmluZSAgU0tBQk9SVF9DTUQgICAgICAgICAgICAgMHgwQgorI2RlZmluZSAgU0tFUVVBTCAgICAgICAgICAgICAgICAgMHgwQworI2RlZmluZSAgU0tWT0xfT1ZGICAgICAgICAgICAgICAgMHgwRAorI2RlZmluZSAgU0tNSVNfQ01QICAgICAgICAgICAgICAgMHgwRQorCisKKyNkZWZpbmUgIFNNQ01EX0NPTVAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgIFNNRVhUICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgIFNNU0FWRV9EQVRBX1BUUiAgICAgICAgIDB4MDIKKyNkZWZpbmUgIFNNUkVTVF9EQVRBX1BUUiAgICAgICAgIDB4MDMKKyNkZWZpbmUgIFNNRElTQyAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgIFNNSU5JVF9ERVRFQ19FUlIgICAgICAgIDB4MDUKKyNkZWZpbmUgIFNNQUJPUlQgICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgIFNNUkVKRUNUICAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgIFNNTk9fT1AgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgIFNNUEFSSVRZICAgICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgIFNNREVWX1JFU0VUICAgICAgICAgICAgIDB4MEMKKyNkZWZpbmUJU01BQk9SVF9UQUcJCQkJCTB4MEQKKyNkZWZpbmUJU01JTklUX1JFQ09WRVJZCQkJMHgwRgorI2RlZmluZQlTTVJFTF9SRUNPVkVSWQkJCQkweDEwCisKKyNkZWZpbmUgIFNNSURFTlQgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgIERJU0NfUFJJViAgICAgICAgICAgICAgIDB4NDAKKworCisjZGVmaW5lICBTTVNZTkMgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lICBTTTEwTUJTICAgICAgICAgICAgICAgICAweDE5ICAgICAvKiAxMDBucyAgICAgICAgICAgKi8KKyNkZWZpbmUgIFNNNU1CUyAgICAgICAgICAgICAgICAgIDB4MzIgICAgIC8qIDIwMG5zICAgICAgICAgICAqLworI2RlZmluZSAgU01PRkZTRVQgICAgICAgICAgICAgICAgMHgwRiAgICAgLyogTWF4b2Zmc2V0IHZhbHVlICovCisjZGVmaW5lICBTTVdEVFIgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lICBTTThCSVQgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lICBTTTE2QklUICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lICBTTTMyQklUICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lICBTTUlHTk9SV1IgICAgICAgICAgICAgICAweDIzICAgICAvKiBJZ25vcmUgV2lkZSBSZXNpZHVlICovCisKKworI2RlZmluZSAgQVJCSVRSQVRJT05fREVMQVkgICAgICAgMHgwMSAgICAgLyogMi40dXMgdXNpbmcgYSA0ME1oeiBjbG9jayAqLworI2RlZmluZSAgQlVTX1NFVFRMRV9ERUxBWSAgICAgICAgMHgwMSAgICAgLyogNDAwbnMgKi8KKyNkZWZpbmUgIEJVU19DTEVBUl9ERUxBWSAgICAgICAgIDB4MDEgICAgIC8qIDgwMG5zICovCisKKworCisjZGVmaW5lICBTUEhBU0VfVE8gICAgICAgICAgICAgICAweDBBICAvKiAxMCBzZWNvbmQgdGltZW91dCB3YWl0aW5nIGZvciAqLworI2RlZmluZSAgU0NNRF9UTyAgICAgICAgICAgICAgICAgMHgwRiAgLyogT3ZlcmFsbCBjb21tYW5kIHRpbWVvdXQgKi8KKworCisKKyNkZWZpbmUgIFNJWF9CWVRFX0NNRCAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgIFRFTl9CWVRFX0NNRCAgICAgICAgICAgIDB4MEEKKyNkZWZpbmUgIFRXRUxWRV9CWVRFX0NNRCAgICAgICAgIDB4MEMKKworI2RlZmluZSAgQVNZTkMgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSAgUEVSSTI1TlMgICAgICAgICAgICAgICAgMHgwNiAgLyogMjUvNG5zIHRvIG5leHQgY2xvY2sgZm9yIHhib3cuICovCisjZGVmaW5lICBTWU5DMTBNQlMgICAgICAgICAgICAgICAweDE5CisjZGVmaW5lICBTWU5DNU1CUyAgICAgICAgICAgICAgICAweDMyCisjZGVmaW5lICBNQVhfT0ZGU0VUICAgICAgICAgICAgICAweDBGICAvKiBNYXhieXRlb2Zmc2V0IGZvciBTeW5jIFhmZXJzICovCisKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgCisgKgorICogICBDb3B5cmlnaHQgMTk5NS0xOTk2IGJ5IE15bGV4IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBib3RoIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbmQgYSBCU0Qtc3R5bGUgY29weXJpZ2h0OyBzZWUgTElDRU5TRS5GbGFzaFBvaW50IGZvciBkZXRhaWxzLgorICoKKyAqICAgJFdvcmtmaWxlOiAgIGVlcHJvbS5oICAkCisgKgorICogICBEZXNjcmlwdGlvbjogIERlZmluaXRpb25zIGZvciBFRVBST00gcmVsYXRlZCBzdHJ1Y3R1cmVzCisgKgorICogICAkRGF0ZTogMTk5Ni8xMS8xMyAxODoyODozOSAkCisgKgorICogICAkUmV2aXNpb246IDEuNCAkCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX0VFUFJPTV9fCisjZGVmaW5lIF9fRUVQUk9NX18KKworLyojaW5jbHVkZSA8Z2xvYmFscy5oPiovCisKKyNkZWZpbmUgIEVFUFJPTV9XRF9DTlQgICAgIDI1NgorCisjZGVmaW5lICBFRVBST01fQ0hFQ0tfU1VNICAwCisjZGVmaW5lICBGV19TSUdOQVRVUkUgICAgICAyCisjZGVmaW5lICBNT0RFTF9OVU1CXzAgICAgICA0CisjZGVmaW5lICBNT0RFTF9OVU1CXzEgICAgICA1CisjZGVmaW5lICBNT0RFTF9OVU1CXzIgICAgICA2CisjZGVmaW5lICBNT0RFTF9OVU1CXzMgICAgICA3CisjZGVmaW5lICBNT0RFTF9OVU1CXzQgICAgICA4CisjZGVmaW5lICBNT0RFTF9OVU1CXzUgICAgICA5CisjZGVmaW5lICBJT19CQVNFX0FERFIgICAgICAxMAorI2RlZmluZSAgSVJRX05VTUJFUiAgICAgICAgMTIKKyNkZWZpbmUgIFBDSV9JTlRfUElOICAgICAgIDEzCisjZGVmaW5lICBCVVNfREVMQVkgICAgICAgICAxNCAgICAgICAvKk9uIHRpbWUgaW4gYnl0ZSAxNCBvZmYgZGVsYXkgaW4gMTUgKi8KKyNkZWZpbmUgIFNZU1RFTV9DT05GSUcgICAgIDE2CisjZGVmaW5lICBTQ1NJX0NPTkZJRyAgICAgICAxNworI2RlZmluZSAgQklPU19DT05GSUcgICAgICAgMTgKKyNkZWZpbmUgIFNQSU5fVVBfREVMQVkgICAgIDE5CisjZGVmaW5lICBTQ0FNX0NPTkZJRyAgICAgICAyMAorI2RlZmluZSAgQURBUFRFUl9TQ1NJX0lEICAgMjQKKworCisjZGVmaW5lICBJR05PUkVfQl9TQ0FOICAgICAzMgorI2RlZmluZSAgU0VORF9TVEFSVF9FTkEgICAgMzQKKyNkZWZpbmUgIERFVklDRV9FTkFCTEUgICAgIDM2CisKKyNkZWZpbmUgIFNZTkNfUkFURV9UQkwgICAgIDM4CisjZGVmaW5lICBTWU5DX1JBVEVfVEJMMDEgICAzOAorI2RlZmluZSAgU1lOQ19SQVRFX1RCTDIzICAgNDAKKyNkZWZpbmUgIFNZTkNfUkFURV9UQkw0NSAgIDQyCisjZGVmaW5lICBTWU5DX1JBVEVfVEJMNjcgICA0NAorI2RlZmluZSAgU1lOQ19SQVRFX1RCTDg5ICAgNDYKKyNkZWZpbmUgIFNZTkNfUkFURV9UQkxhYiAgIDQ4CisjZGVmaW5lICBTWU5DX1JBVEVfVEJMY2QgICA1MAorI2RlZmluZSAgU1lOQ19SQVRFX1RCTGVmICAgNTIKKworCisKKyNkZWZpbmUgIEVFX1NDQU1CQVNFICAgICAgMjU2IAorCisKKworICAgI2RlZmluZSAgRE9NX01BU1RFUiAgICAgKEJJVCgwKSArIEJJVCgxKSkKKyAgICNkZWZpbmUgIFNDQU1fRU5BQkxFRCAgIEJJVCgyKQorICAgI2RlZmluZSAgU0NBTV9MRVZFTDIgICAgQklUKDMpCisKKworCSNkZWZpbmUJUkVORUdPX0VOQQkJQklUVygxMCkKKwkjZGVmaW5lCUNPTk5JT19FTkEJCUJJVFcoMTEpCisgICAjZGVmaW5lICBHUkVFTl9QQ19FTkEgICBCSVRXKDEyKQorCisKKyAgICNkZWZpbmUgIEFVVE9fUkFURV8wMCAgIDAwCisgICAjZGVmaW5lICBBVVRPX1JBVEVfMDUgICAwMQorICAgI2RlZmluZSAgQVVUT19SQVRFXzEwICAgMDIKKyAgICNkZWZpbmUgIEFVVE9fUkFURV8yMCAgIDAzCisKKyAgICNkZWZpbmUgIFdJREVfTkVHT19CSVQgICAgIEJJVCg3KQorICAgI2RlZmluZSAgRElTQ19FTkFCTEVfQklUICAgQklUKDYpCisKKworI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKgorICogICBDb3B5cmlnaHQgMTk5NS0xOTk2IGJ5IE15bGV4IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBib3RoIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbmQgYSBCU0Qtc3R5bGUgY29weXJpZ2h0OyBzZWUgTElDRU5TRS5GbGFzaFBvaW50IGZvciBkZXRhaWxzLgorICoKKyAqICAgJFdvcmtmaWxlOiAgIGhhcnBvb24uaCAgJAorICoKKyAqICAgRGVzY3JpcHRpb246ICBSZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgSEFSUE9PTiBBU0lDLgorICoKKyAqICAgJERhdGU6IDE5OTcvMDcvMDkgMjE6NDQ6MzYgJAorICoKKyAqICAgJFJldmlzaW9uOiAxLjkgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyojaW5jbHVkZSA8Z2xvYmFscy5oPiovCisKKyNpZm5kZWYgX19IQVJQT09OX18KKyNkZWZpbmUgX19IQVJQT09OX18KKworCisgICAjZGVmaW5lICBocF92ZW5kb3JfaWRfMCAgICAgICAweDAwCQkvKiBMU0IgKi8KKyAgICAgICNkZWZpbmUgIE9SSU9OX1ZFTkRfMCAgIDB4NEIKKyAKKyAgICNkZWZpbmUgIGhwX3ZlbmRvcl9pZF8xICAgICAgIDB4MDEJCS8qIE1TQiAqLworICAgICAgI2RlZmluZSAgT1JJT05fVkVORF8xICAgMHgxMAorCisgICAjZGVmaW5lICBocF9kZXZpY2VfaWRfMCAgICAgICAweDAyCQkvKiBMU0IgKi8KKyAgICAgICNkZWZpbmUgIE9SSU9OX0RFVl8wICAgIDB4MzAgCisKKyAgICNkZWZpbmUgIGhwX2RldmljZV9pZF8xICAgICAgIDB4MDMJCS8qIE1TQiAqLworICAgICAgI2RlZmluZSAgT1JJT05fREVWXzEgICAgMHg4MSAKKworCS8qIFN1YiBWZW5kb3IgSUQgYW5kIFN1YiBEZXZpY2UgSUQgb25seSBhdmFpbGFibGUgaW4KKwkJSGFycG9vbiBWZXJzaW9uIDIgYW5kIGhpZ2hlciAqLworCisgICAjZGVmaW5lICBocF9zdWJfdmVuZG9yX2lkXzAgICAweDA0CQkvKiBMU0IgKi8KKyAgICNkZWZpbmUgIGhwX3N1Yl92ZW5kb3JfaWRfMSAgIDB4MDUJCS8qIE1TQiAqLworICAgI2RlZmluZSAgaHBfc3ViX2RldmljZV9pZF8wICAgMHgwNgkJLyogTFNCICovCisgICAjZGVmaW5lICBocF9zdWJfZGV2aWNlX2lkXzEgICAweDA3CQkvKiBNU0IgKi8KKworCisgICAjZGVmaW5lICBocF9kdWFsX2FkZHJfbG8gICAgICAweDA4CisgICAjZGVmaW5lICBocF9kdWFsX2FkZHJfbG1pICAgICAweDA5CisgICAjZGVmaW5lICBocF9kdWFsX2FkZHJfaG1pICAgICAweDBBCisgICAjZGVmaW5lICBocF9kdWFsX2FkZHJfaGkgICAgICAweDBCCisKKyAgICNkZWZpbmUgIGhwX3NlbWFwaG9yZSAgICAgICAgIDB4MEMKKyAgICAgICNkZWZpbmUgU0NDQl9NR1JfQUNUSVZFICAgIEJJVCgwKQorICAgICAgI2RlZmluZSBUSUNLTEVfTUUgICAgICAgICAgQklUKDEpCisgICAgICAjZGVmaW5lIFNDQ0JfTUdSX1BSRVNFTlQgICBCSVQoMykKKyAgICAgICNkZWZpbmUgQklPU19JTl9VU0UgICAgICAgIEJJVCg0KQorCisgICAjZGVmaW5lICBocF91c2VyX2RlZmluZWRfRCAgICAweDBECisKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkX0UgICAgICAgIDB4MEUKKworICAgI2RlZmluZSAgaHBfc3lzX2N0cmwgICAgICAgICAgMHgwRgorCisgICAgICAjZGVmaW5lICBTVE9QX0NMSyAgICAgICAgICBCSVQoMCkgICAgICAvKlR1cm4gb2ZmIEJ1c01hc3RlciBDbG9jayAqLworICAgICAgI2RlZmluZSAgRFJWUl9SU1QgICAgICAgICAgQklUKDEpICAgICAgLypGaXJtd2FyZSBSZXNldCB0byA4MEMxNSBjaGlwICovCisgICAgICAjZGVmaW5lICBIQUxUX01BQ0ggICAgICAgICBCSVQoMykgICAgICAvKkhhbHQgU3RhdGUgTWFjaGluZSAgICAgICovCisgICAgICAjZGVmaW5lICBIQVJEX0FCT1JUICAgICAgICBCSVQoNCkgICAgICAvKkhhcmQgQWJvcnQgICAgICAgICAgICAgICovCisgICAgICAjZGVmaW5lICBESUFHX01PREUgICAgICAgICBCSVQoNSkgICAgICAvKkRpYWdub3N0aWMgTW9kZSAgICAgICAgICovCisKKyAgICAgICNkZWZpbmUgIEJNX0FCT1JUX1RNT1VUICAgIDB4NTAgICAgICAgIC8qSGFsdCBTdGF0ZSBtYWNoaW5lIHRpbWUgb3V0ICovCisKKyAgICNkZWZpbmUgIGhwX3N5c19jZmcgICAgICAgICAgIDB4MTAKKworICAgICAgI2RlZmluZSAgRE9OVF9SU1RfRklGTyAgICAgQklUKDcpICAgICAgLypEb24ndCByZXNldCBGSUZPICAgICAgKi8KKworCisgICAjZGVmaW5lICBocF9ob3N0X2N0cmwwICAgICAgICAweDExCisKKyAgICAgICNkZWZpbmUgIERVQUxfQUREUl9NT0RFICAgIEJJVCgwKSAgIC8qRW5hYmxlIDY0LWJpdCBhZGRyZXNzZXMgKi8KKyAgICAgICNkZWZpbmUgIElPX01FTV9TUEFDRSAgICAgIEJJVCgxKSAgIC8qSS9PIE1lbW9yeSBTcGFjZSAgICAqLworICAgICAgI2RlZmluZSAgUkVTT1VSQ0VfTE9DSyAgICAgQklUKDIpICAgLypFbmFibGUgUmVzb3VyY2UgTG9jayAqLworICAgICAgI2RlZmluZSAgSUdOT1JfQUNDRVNTX0VSUiAgQklUKDMpICAgLypJZ25vcmUgQWNjZXNzIEVycm9yICovCisgICAgICAjZGVmaW5lICBIT1NUX0lOVF9FREdFICAgICBCSVQoNCkgICAvKkhvc3QgaW50ZXJydXB0IGxldmVsL2VkZ2UgbW9kZSBzZWwgKi8KKyAgICAgICNkZWZpbmUgIFNJWF9DTE9DS1MgICAgICAgIEJJVCg1KSAgIC8qNiBDbG9ja3MgYmV0d2VlbiBTdHJvYmUgICAqLworICAgICAgI2RlZmluZSAgRE1BX0VWRU5fUEFSSVRZICAgQklUKDYpICAgLypFbmFibGUgRE1BIEVuZW4gUGFyaXR5ICovCisKKy8qCisgICAgICAjZGVmaW5lICBCVVJTVF9NT0RFICAgICAgICBCSVQoMCkKKyovCisKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzEyICAgICAgIDB4MTIKKworICAgI2RlZmluZSAgaHBfaG9zdF9ibGtfY250ICAgICAgMHgxMworCisgICAgICAjZGVmaW5lICBYRkVSX0JMSzEgICAgICAgICAweDAwICAgICAvKiAgICAgMCAwIDAgIDEgYnl0ZSBwZXIgYmxvY2sqLworICAgICAgI2RlZmluZSAgWEZFUl9CTEsyICAgICAgICAgMHgwMSAgICAgLyogICAgIDAgMCAxICAyIGJ5dGUgcGVyIGJsb2NrKi8KKyAgICAgICNkZWZpbmUgIFhGRVJfQkxLNCAgICAgICAgIDB4MDIgICAgIC8qICAgICAwIDEgMCAgNCBieXRlIHBlciBibG9jayovCisgICAgICAjZGVmaW5lICBYRkVSX0JMSzggICAgICAgICAweDAzICAgICAvKiAgICAgMCAxIDEgIDggYnl0ZSBwZXIgYmxvY2sqLworICAgICAgI2RlZmluZSAgWEZFUl9CTEsxNiAgICAgICAgMHgwNCAgICAgLyogICAgIDEgMCAwIDE2IGJ5dGUgcGVyIGJsb2NrKi8KKyAgICAgICNkZWZpbmUgIFhGRVJfQkxLMzIgICAgICAgIDB4MDUgICAgIC8qICAgICAxIDAgMSAzMiBieXRlIHBlciBibG9jayovCisgICAgICAjZGVmaW5lICBYRkVSX0JMSzY0ICAgICAgICAweDA2ICAgICAvKiAgICAgMSAxIDAgNjQgYnl0ZSBwZXIgYmxvY2sqLworICAgCisgICAgICAjZGVmaW5lICBCTV9USFJFU0hPTEQgICAgICAweDQwICAgICAvKiBQQ0kgbW9kZSBjYW4gb25seSB4ZmVyIDE2IGJ5dGVzKi8KKworCisgICAjZGVmaW5lICBocF9yZXNlcnZlZF8xNCAgICAgICAweDE0CisgICAjZGVmaW5lICBocF9yZXNlcnZlZF8xNSAgICAgICAweDE1CisgICAjZGVmaW5lICBocF9yZXNlcnZlZF8xNiAgICAgICAweDE2CisKKyAgICNkZWZpbmUgIGhwX2ludF9tYXNrICAgICAgICAgIDB4MTcKKworICAgICAgI2RlZmluZSAgSU5UX0NNRF9DT01QTCAgICAgQklUKDApICAgLyogRE1BIGNvbW1hbmQgY29tcGxldGUgICAqLworICAgICAgI2RlZmluZSAgSU5UX0VYVF9TVEFUVVMgICAgQklUKDEpICAgLyogRXh0ZW5kZWQgU3RhdHVzIFNldCAgICAqLworICAgICAgI2RlZmluZSAgSU5UX1NDU0kgICAgICAgICAgQklUKDIpICAgLyogU2NzaSBibG9jayBpbnRlcnJ1cHQgICAqLworICAgICAgI2RlZmluZSAgSU5UX0ZJRk9fUkRZICAgICAgQklUKDQpICAgLyogRklGTyBkYXRhIHJlYWR5ICAgICAgICAqLworCisKKyAgICNkZWZpbmUgIGhwX3hmZXJfY250X2xvICAgICAgIDB4MTgKKyAgICNkZWZpbmUgIGhwX3hmZXJfY250X21pICAgICAgIDB4MTkKKyAgICNkZWZpbmUgIGhwX3hmZXJfY250X2hpICAgICAgIDB4MUEKKyAgICNkZWZpbmUgIGhwX3hmZXJfY21kICAgICAgICAgIDB4MUIKKworICAgICAgI2RlZmluZSAgWEZFUl9IT1NUX0RNQSAgICAgMHgwMCAgICAgLyogICAgIDAgMCAwIFRyYW5zZmVyIEhvc3QgLT4gRE1BICovCisgICAgICAjZGVmaW5lICBYRkVSX0RNQV9IT1NUICAgICAweDAxICAgICAvKiAgICAgMCAwIDEgVHJhbnNmZXIgRE1BICAtPiBIb3N0ICovCisgICAgICAjZGVmaW5lICBYRkVSX0hPU1RfTVBVICAgICAweDAyICAgICAvKiAgICAgMCAxIDAgVHJhbnNmZXIgSG9zdCAtPiBNUFUgICovCisgICAgICAjZGVmaW5lICBYRkVSX01QVV9IT1NUICAgICAweDAzICAgICAvKiAgICAgMCAxIDEgVHJhbnNmZXIgTVBVICAtPiBIb3N0ICovCisgICAgICAjZGVmaW5lICBYRkVSX0RNQV9NUFUgICAgICAweDA0ICAgICAvKiAgICAgMSAwIDAgVHJhbnNmZXIgRE1BICAtPiBNUFUgICovCisgICAgICAjZGVmaW5lICBYRkVSX01QVV9ETUEgICAgICAweDA1ICAgICAvKiAgICAgMSAwIDEgVHJhbnNmZXIgTVBVICAtPiBETUEgICovCisgICAgICAjZGVmaW5lICBTRVRfU0VNQVBIT1JFICAgICAweDA2ICAgICAvKiAgICAgMSAxIDAgU2V0IFNlbWFwaG9yZSAgICAgICAgICovCisgICAgICAjZGVmaW5lICBYRkVSX05PUCAgICAgICAgICAweDA3ICAgICAvKiAgICAgMSAxIDEgVHJhbnNmZXIgTk9QICAgICAgICAgICovCisgICAgICAjZGVmaW5lICBYRkVSX01CX01QVSAgICAgICAweDA2ICAgICAvKiAgICAgMSAxIDAgVHJhbnNmZXIgTUIgLT4gTVBVICovCisgICAgICAjZGVmaW5lICBYRkVSX01CX0RNQSAgICAgICAweDA3ICAgICAvKiAgICAgMSAxIDEgVHJhbnNmZXIgTUIgLT4gRE1BICovCisKKworICAgICAgI2RlZmluZSAgWEZFUl9IT1NUX0FVVE8gICAgMHgwMCAgICAgLyogICAgIDAgMCBBdXRvIFRyYW5zZmVyIFNpemUgICAqLworICAgICAgI2RlZmluZSAgWEZFUl9IT1NUXzhCSVQgICAgMHgwOCAgICAgLyogICAgIDAgMSA4IEJJVCBUcmFuc2ZlciBTaXplICAqLworICAgICAgI2RlZmluZSAgWEZFUl9IT1NUXzE2QklUICAgMHgxMCAgICAgLyogICAgIDEgMCAxNiBCSVQgVHJhbnNmZXIgU2l6ZSAqLworICAgICAgI2RlZmluZSAgWEZFUl9IT1NUXzMyQklUICAgMHgxOCAgICAgLyogICAgIDEgMSAzMiBCSVQgVHJhbnNmZXIgU2l6ZSAqLworCisgICAgICAjZGVmaW5lICBYRkVSX0RNQV84QklUICAgICAweDIwICAgICAvKiAgICAgMCAxIDggQklUICBUcmFuc2ZlciBTaXplICovCisgICAgICAjZGVmaW5lICBYRkVSX0RNQV8xNkJJVCAgICAweDQwICAgICAvKiAgICAgMSAwIDE2IEJJVCBUcmFuc2ZlciBTaXplICovCisKKyAgICAgICNkZWZpbmUgIERJU0FCTEVfSU5UICAgICAgIEJJVCg3KSAgIC8qRG8gbm90IGludGVycnVwdCBhdCBlbmQgb2YgY21kLiAqLworCisgICAgICAjZGVmaW5lICBIT1NUX1dSVF9DTUQgICAgICAoKERJU0FCTEVfSU5UICsgWEZFUl9IT1NUX0RNQSArIFhGRVJfSE9TVF9BVVRPICsgWEZFUl9ETUFfOEJJVCkpCisgICAgICAjZGVmaW5lICBIT1NUX1JEX0NNRCAgICAgICAoKERJU0FCTEVfSU5UICsgWEZFUl9ETUFfSE9TVCArIFhGRVJfSE9TVF9BVVRPICsgWEZFUl9ETUFfOEJJVCkpCisgICAgICAjZGVmaW5lICBXSURFX0hPU1RfV1JUX0NNRCAoKERJU0FCTEVfSU5UICsgWEZFUl9IT1NUX0RNQSArIFhGRVJfSE9TVF9BVVRPICsgWEZFUl9ETUFfMTZCSVQpKQorICAgICAgI2RlZmluZSAgV0lERV9IT1NUX1JEX0NNRCAgKChESVNBQkxFX0lOVCArIFhGRVJfRE1BX0hPU1QgKyBYRkVSX0hPU1RfQVVUTyArIFhGRVJfRE1BXzE2QklUKSkKKworICAgI2RlZmluZSAgaHBfaG9zdF9hZGRyX2xvICAgICAgMHgxQworICAgI2RlZmluZSAgaHBfaG9zdF9hZGRyX2xtaSAgICAgMHgxRAorICAgI2RlZmluZSAgaHBfaG9zdF9hZGRyX2htaSAgICAgMHgxRQorICAgI2RlZmluZSAgaHBfaG9zdF9hZGRyX2hpICAgICAgMHgxRgorCisgICAjZGVmaW5lICBocF9waW9fZGF0YSAgICAgICAgICAweDIwCisgICAjZGVmaW5lICBocF9yZXNlcnZlZF8yMSAgICAgICAweDIxCisgICAjZGVmaW5lICBocF9lZV9jdHJsICAgICAgICAgICAweDIyCisKKyAgICAgICNkZWZpbmUgIEVYVF9BUkJfQUNLICAgICAgIEJJVCg3KQorICAgICAgI2RlZmluZSAgU0NTSV9URVJNX0VOQV9IICAgQklUKDYpICAgLyogU0NTSSBoaWdoIGJ5dGUgdGVybWluYXRvciAqLworICAgICAgI2RlZmluZSAgU0VFX01TICAgICAgICAgICAgQklUKDUpCisgICAgICAjZGVmaW5lICBTRUVfQ1MgICAgICAgICAgICBCSVQoMykKKyAgICAgICNkZWZpbmUgIFNFRV9DTEsgICAgICAgICAgIEJJVCgyKQorICAgICAgI2RlZmluZSAgU0VFX0RPICAgICAgICAgICAgQklUKDEpCisgICAgICAjZGVmaW5lICBTRUVfREkgICAgICAgICAgICBCSVQoMCkKKworICAgICAgI2RlZmluZSAgRUVfUkVBRCAgICAgICAgICAgMHgwNgorICAgICAgI2RlZmluZSAgRUVfV1JJVEUgICAgICAgICAgMHgwNQorICAgICAgI2RlZmluZSAgRVdFTiAgICAgICAgICAgICAgMHgwNAorICAgICAgI2RlZmluZSAgRVdFTl9BRERSICAgICAgICAgMHgwM0MwCisgICAgICAjZGVmaW5lICBFV0RTICAgICAgICAgICAgICAweDA0CisgICAgICAjZGVmaW5lICBFV0RTX0FERFIgICAgICAgICAweDAwMDAKKworICAgI2RlZmluZSAgaHBfYnJkY3RsICAgICAgICAgICAgMHgyMworCisgICAgICAjZGVmaW5lICBEQVRfNyAgICAgICAgICAgICBCSVQoNykKKyAgICAgICNkZWZpbmUgIERBVF82ICAgICAgICAgICAgIEJJVCg2KQorICAgICAgI2RlZmluZSAgREFUXzUgICAgICAgICAgICAgQklUKDUpCisgICAgICAjZGVmaW5lICBCUkRfU1RCICAgICAgICAgICBCSVQoNCkKKyAgICAgICNkZWZpbmUgIEJSRF9DUyAgICAgICAgICAgIEJJVCgzKQorICAgICAgI2RlZmluZSAgQlJEX1dSICAgICAgICAgICAgQklUKDIpCisKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzI0ICAgICAgIDB4MjQKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzI1ICAgICAgIDB4MjUKKworCisKKworICAgI2RlZmluZSAgaHBfYm1fY3RybCAgICAgICAgICAgMHgyNgorCisgICAgICAjZGVmaW5lICBTQ1NJX1RFUk1fRU5BX0wgICBCSVQoMCkgICAvKkVuYWJsZS9EaXNhYmxlIGV4dGVybmFsIHRlcm1pbmF0b3JzICovCisgICAgICAjZGVmaW5lICBGTFVTSF9YRkVSX0NOVFIgICBCSVQoMSkgICAvKkZsdXNoIHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICAgICNkZWZpbmUgIEJNX1hGRVJfTUlOXzggICAgIEJJVCgyKSAgIC8qRW5hYmxlIGJ1cyBtYXN0ZXIgdHJhbnNmZXIgb2YgOSAqLworICAgICAgI2RlZmluZSAgQklPU19FTkEgICAgICAgICAgQklUKDMpICAgLypFbmFibGUgQklPUy9GTEFTSCBFbmFibGUgKi8KKyAgICAgICNkZWZpbmUgIEZPUkNFMV9YRkVSICAgICAgIEJJVCg1KSAgIC8qQWx3YXlzIHhmZXIgb25lIGJ5dGUgaW4gYnl0ZSBtb2RlICovCisgICAgICAjZGVmaW5lICBGQVNUX1NJTkdMRSAgICAgICBCSVQoNikgICAvKj8/ICovCisKKyAgICAgICNkZWZpbmUgIEJNQ1RSTF9ERUZBVUxUICAgIChGT1JDRTFfWEZFUnxGQVNUX1NJTkdMRXxTQ1NJX1RFUk1fRU5BX0wpCisKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzI3ICAgICAgIDB4MjcKKworICAgI2RlZmluZSAgaHBfc2dfYWRkciAgICAgICAgICAgMHgyOAorICAgI2RlZmluZSAgaHBfcGFnZV9jdHJsICAgICAgICAgMHgyOQorCisgICAgICAjZGVmaW5lICBTQ0FUVEVSX0VOICAgICAgICBCSVQoMCkgICAKKyAgICAgICNkZWZpbmUgIFNHUkFNX0FSQU0gICAgICAgIEJJVCgxKSAgIAorICAgICAgI2RlZmluZSAgQklPU19TSEFET1cgICAgICAgQklUKDIpICAgCisgICAgICAjZGVmaW5lICBHX0lOVF9ESVNBQkxFICAgICBCSVQoMykgICAvKiBFbmFibGUvRGlzYWJsZSBhbGwgSW50ZXJydXB0cyAqLworICAgICAgI2RlZmluZSAgTkFSUk9XX1NDU0lfQ0FSRCAgQklUKDQpICAgLyogTkFSUk9XL1dJREUgU0NTSSBjb25maWcgcGluICovCisKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzJBICAgICAgIDB4MkEKKyAgICNkZWZpbmUgIGhwX3BjaV9jbWRfY2ZnICAgICAgIDB4MkIKKworICAgICAgI2RlZmluZSAgSU9fU1BBQ0VfRU5BICAgICAgQklUKDApICAgLyplbmFibGUgSS9PIHNwYWNlICovCisgICAgICAjZGVmaW5lICBNRU1fU1BBQ0VfRU5BICAgICBCSVQoMSkgICAvKmVuYWJsZSBtZW1vcnkgc3BhY2UgKi8KKyAgICAgICNkZWZpbmUgIEJVU19NU1RSX0VOQSAgICAgIEJJVCgyKSAgIC8qZW5hYmxlIGJ1cyBtYXN0ZXIgb3BlcmF0aW9uICovCisgICAgICAjZGVmaW5lICBNRU1fV0lfRU5BICAgICAgICBCSVQoNCkgICAvKmVuYWJsZSBXcml0ZSBhbmQgSW52YWxpZGF0ZSAqLworICAgICAgI2RlZmluZSAgUEFSX0VSUl9SRVNQICAgICAgQklUKDYpICAgLyplbmFibGUgcGFyaXR5IGVycm9yIHJlc3BvbmNlLiAqLworCisgICAjZGVmaW5lICBocF9yZXNlcnZlZF8yQyAgICAgICAweDJDCisKKyAgICNkZWZpbmUgIGhwX3BjaV9zdGF0X2NmZyAgICAgIDB4MkQKKworICAgICAgI2RlZmluZSAgREFUQV9QQVJJVFlfRVJSICAgQklUKDApICAgCisgICAgICAjZGVmaW5lICBSRUNfVEFSR0VUX0FCT1JUICBCSVQoNCkgICAvKnJlY2VpdmVkIFRhcmdldCBhYm9ydCAqLworICAgICAgI2RlZmluZSAgUkVDX01BU1RFUl9BQk9SVCAgQklUKDUpICAgLypyZWNlaXZlZCBNYXN0ZXIgYWJvcnQgKi8KKyAgICAgICNkZWZpbmUgIFNJR19TWVNURU1fRVJSICAgIEJJVCg2KSAgIAorICAgICAgI2RlZmluZSAgREVURUNURURfUEFSX0VSUiAgQklUKDcpICAgCisKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzJFICAgICAgIDB4MkUKKworICAgI2RlZmluZSAgaHBfc3lzX3N0YXR1cyAgICAgICAgMHgyRgorCisgICAgICAjZGVmaW5lICBTTFZfREFUQV9SRFkgICAgICBCSVQoMCkgICAvKlNsYXZlIGRhdGEgcmVhZHkgKi8KKyAgICAgICNkZWZpbmUgIFhGRVJfQ05UX1pFUk8gICAgIEJJVCgxKSAgIC8qVHJhbnNmZXIgY291bnRlciA9IDAgKi8KKyAgICAgICNkZWZpbmUgIEJNX0ZJRk9fRU1QVFkgICAgIEJJVCgyKSAgIC8qRklGTyBlbXB0eSAqLworICAgICAgI2RlZmluZSAgQk1fRklGT19GVUxMICAgICAgQklUKDMpICAgLypGSUZPIGZ1bGwgKi8KKyAgICAgICNkZWZpbmUgIEhPU1RfT1BfRE9ORSAgICAgIEJJVCg0KSAgIC8qaG9zdCBvcGVyYXRpb24gZG9uZSAqLworICAgICAgI2RlZmluZSAgRE1BX09QX0RPTkUgICAgICAgQklUKDUpICAgLypETUEgb3BlcmF0aW9uIGRvbmUgKi8KKyAgICAgICNkZWZpbmUgIFNMVl9PUF9ET05FICAgICAgIEJJVCg2KSAgIC8qU2xhdmUgb3BlcmF0aW9uIGRvbmUgKi8KKyAgICAgICNkZWZpbmUgIFBXUl9PTl9GTEFHICAgICAgIEJJVCg3KSAgIC8qUG93ZXIgb24gZmxhZyAqLworCisgICAjZGVmaW5lICBocF9yZXNlcnZlZF8zMCAgICAgICAweDMwCisKKyAgICNkZWZpbmUgIGhwX2hvc3Rfc3RhdHVzMCAgICAgIDB4MzEKKworICAgICAgI2RlZmluZSAgSE9TVF9URVJNICAgICAgICAgQklUKDUpICAgLypIb3N0IFRlcm1pbmFsIENvdW50ICovCisgICAgICAjZGVmaW5lICBIT1NUX1RSU0hMRCAgICAgICBCSVQoNikgICAvKkhvc3QgVGhyZXNob2xkICAgICAgKi8KKyAgICAgICNkZWZpbmUgIENPTk5FQ1RFRF8yX0hPU1QgIEJJVCg3KSAgIC8qQ29ubmVjdGVkIHRvIEhvc3QgICAqLworCisgICAjZGVmaW5lICBocF9yZXNlcnZlZF8zMiAgICAgICAweDMyCisKKyAgICNkZWZpbmUgIGhwX3Jldl9udW0gICAgICAgICAgIDB4MzMKKworICAgICAgI2RlZmluZSAgUkVWX0FfQ09OU1QgICAgICAgMHgwRQorICAgICAgI2RlZmluZSAgUkVWX0JfQ09OU1QgICAgICAgMHgwRQorCisgICAjZGVmaW5lICBocF9zdGFja19kYXRhICAgICAgICAweDM0CisgICAjZGVmaW5lICBocF9zdGFja19hZGRyICAgICAgICAweDM1CisKKyAgICNkZWZpbmUgIGhwX2V4dF9zdGF0dXMgICAgICAgIDB4MzYKKworICAgICAgI2RlZmluZSAgQk1fRk9SQ0VfT0ZGICAgICAgQklUKDApICAgLypCdXMgTWFzdGVyIGlzIGZvcmNlZCB0byBnZXQgb2ZmICovCisgICAgICAjZGVmaW5lICBQQ0lfVEdUX0FCT1JUICAgICBCSVQoMCkgICAvKlBDSSBidXMgbWFzdGVyIHRyYW5zYWN0aW9uIGFib3J0ZWQgKi8KKyAgICAgICNkZWZpbmUgIFBDSV9ERVZfVE1PVVQgICAgIEJJVCgxKSAgIC8qUENJIERldmljZSBUaW1lIG91dCAqLworICAgICAgI2RlZmluZSAgRklGT19UQ19OT1RfWkVSTyAgQklUKDIpICAgLypGSUZPIG9yIHRyYW5zZmVyIGNvdW50ZXIgbm90IHplcm8gKi8KKyAgICAgICNkZWZpbmUgIENISVBfUlNUX09DQ1VSICAgIEJJVCgzKSAgIC8qQ2hpcCByZXNldCBvY2N1cnMgKi8KKyAgICAgICNkZWZpbmUgIENNRF9BQk9SVEVEICAgICAgIEJJVCg0KSAgIC8qQ29tbWFuZCBhYm9ydGVkICovCisgICAgICAjZGVmaW5lICBCTV9QQVJJVFlfRVJSICAgICBCSVQoNSkgICAvKnBhcml0eSBlcnJvciBvbiBkYXRhIHJlY2VpdmVkICAgKi8KKyAgICAgICNkZWZpbmUgIFBJT19PVkVSUlVOICAgICAgIEJJVCg2KSAgIC8qU2xhdmUgZGF0YSBvdmVycnVuICovCisgICAgICAjZGVmaW5lICBCTV9DTURfQlVTWSAgICAgICBCSVQoNykgICAvKkJ1cyBtYXN0ZXIgdHJhbnNmZXIgY29tbWFuZCBidXN5ICovCisgICAgICAjZGVmaW5lICBCQURfRVhUX1NUQVRVUyAgICAoQk1fRk9SQ0VfT0ZGIHwgUENJX0RFVl9UTU9VVCB8IENNRF9BQk9SVEVEIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJNX1BBUklUWV9FUlIgfCBQSU9fT1ZFUlJVTikKKworICAgI2RlZmluZSAgaHBfaW50X3N0YXR1cyAgICAgICAgMHgzNworICAgICAgCisgICAgICAjZGVmaW5lICBCTV9DTURfQ01QTCAgICAgICBCSVQoMCkgICAvKkJ1cyBNYXN0ZXIgY29tbWFuZCBjb21wbGV0ZSAqLworICAgICAgI2RlZmluZSAgRVhUX1NUQVRVU19PTiAgICAgQklUKDEpICAgLypFeHRlbmRlZCBzdGF0dXMgaXMgdmFsaWQgKi8KKyAgICAgICNkZWZpbmUgIFNDU0lfSU5URVJSVVBUICAgIEJJVCgyKSAgIC8qR2xvYmFsIGluZGljYXRpb24gb2YgYSBTQ1NJIGludC4gKi8KKyAgICAgICNkZWZpbmUgIEJNX0ZJRk9fUkRZICAgICAgIEJJVCg0KSAgIAorICAgICAgI2RlZmluZSAgSU5UX0FTU0VSVEVEICAgICAgQklUKDUpICAgLyogKi8KKyAgICAgICNkZWZpbmUgIFNSQU1fQlVTWSAgICAgICAgIEJJVCg2KSAgIC8qU2NhdHRlci9HYXRoZXIgUkFNIGJ1c3kgKi8KKyAgICAgICNkZWZpbmUgIENNRF9SRUdfQlVTWSAgICAgIEJJVCg3KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisKKyAgICNkZWZpbmUgIGhwX2ZpZm9fY250ICAgICAgICAgIDB4MzgKKyAgICNkZWZpbmUgIGhwX2N1cnJfaG9zdF9jbnQgICAgIDB4MzkKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzNBICAgICAgIDB4M0EKKyAgICNkZWZpbmUgIGhwX2ZpZm9faW5fYWRkciAgICAgIDB4M0IKKworICAgI2RlZmluZSAgaHBfZmlmb19vdXRfYWRkciAgICAgMHgzQworICAgI2RlZmluZSAgaHBfcmVzZXJ2ZWRfM0QgICAgICAgMHgzRAorICAgI2RlZmluZSAgaHBfcmVzZXJ2ZWRfM0UgICAgICAgMHgzRQorICAgI2RlZmluZSAgaHBfcmVzZXJ2ZWRfM0YgICAgICAgMHgzRgorCisKKworICAgZXh0ZXJuIFVTSE9SVCBkZWZhdWx0X2ludGVuYTsKKworICAgI2RlZmluZSAgaHBfaW50ZW5hCQkgMHg0MAorCisgICAgICAjZGVmaW5lICBSRVNFVAkJIEJJVFcoNykKKyAgICAgICNkZWZpbmUgIFBST0dfSExUCQkgQklUVyg2KSAgCisgICAgICAjZGVmaW5lICBQQVJJVFkJCSBCSVRXKDUpCisgICAgICAjZGVmaW5lICBGSUZPCQkgQklUVyg0KQorICAgICAgI2RlZmluZSAgU0VMCQkgQklUVygzKQorICAgICAgI2RlZmluZSAgU0NBTV9TRUwJCSBCSVRXKDIpIAorICAgICAgI2RlZmluZSAgUlNFTAkJIEJJVFcoMSkKKyAgICAgICNkZWZpbmUgIFRJTUVPVVQJCSBCSVRXKDApCisgICAgICAjZGVmaW5lICBCVVNfRlJFRQkJIEJJVFcoMTUpCisgICAgICAjZGVmaW5lICBYRkVSX0NOVF8wCSBCSVRXKDE0KQorICAgICAgI2RlZmluZSAgUEhBU0UJCSBCSVRXKDEzKQorICAgICAgI2RlZmluZSAgSVVOS1dOCQkgQklUVygxMikKKyAgICAgICNkZWZpbmUgIElDTURfQ09NUAkgQklUVygxMSkKKyAgICAgICNkZWZpbmUgIElUSUNLTEUJCSBCSVRXKDEwKQorICAgICAgI2RlZmluZSAgSURPX1NUUlQJCSBCSVRXKDkpCisgICAgICAjZGVmaW5lICBJVEFSX0RJU0MJIEJJVFcoOCkKKyAgICAgICNkZWZpbmUgIEFVVE9fSU5UCQkgKEJJVFcoMTIpK0JJVFcoMTEpK0JJVFcoMTApK0JJVFcoOSkrQklUVyg4KSkKKyAgICAgICNkZWZpbmUgIENMUl9BTExfSU5UCSAweEZGRkYKKyAgICAgICNkZWZpbmUgIENMUl9BTExfSU5UXzEJIDB4RkYwMAorCisgICAjZGVmaW5lICBocF9pbnRzdGF0CQkgMHg0MgorCisgICAjZGVmaW5lICBocF9zY3Npc2lnICAgICAgICAgICAweDQ0CisKKyAgICAgICNkZWZpbmUgIFNDU0lfU0VMICAgICAgICAgIEJJVCg3KQorICAgICAgI2RlZmluZSAgU0NTSV9CU1kgICAgICAgICAgQklUKDYpCisgICAgICAjZGVmaW5lICBTQ1NJX1JFUSAgICAgICAgICBCSVQoNSkKKyAgICAgICNkZWZpbmUgIFNDU0lfQUNLICAgICAgICAgIEJJVCg0KQorICAgICAgI2RlZmluZSAgU0NTSV9BVE4gICAgICAgICAgQklUKDMpCisgICAgICAjZGVmaW5lICBTQ1NJX0NEICAgICAgICAgICBCSVQoMikKKyAgICAgICNkZWZpbmUgIFNDU0lfTVNHICAgICAgICAgIEJJVCgxKQorICAgICAgI2RlZmluZSAgU0NTSV9JT0JJVCAgICAgICAgQklUKDApCisKKyAgICAgICNkZWZpbmUgIFNfU0NTSV9QSFogICAgICAgIChCSVQoMikrQklUKDEpK0JJVCgwKSkKKyAgICAgICNkZWZpbmUgIFNfQ01EX1BIICAgICAgICAgIChCSVQoMikgICAgICAgICAgICAgICkKKyAgICAgICNkZWZpbmUgIFNfTVNHT19QSCAgICAgICAgIChCSVQoMikrQklUKDEpICAgICAgICkKKyAgICAgICNkZWZpbmUgIFNfU1RBVF9QSCAgICAgICAgIChCSVQoMikgICAgICAgK0JJVCgwKSkKKyAgICAgICNkZWZpbmUgIFNfTVNHSV9QSCAgICAgICAgIChCSVQoMikrQklUKDEpK0JJVCgwKSkKKyAgICAgICNkZWZpbmUgIFNfREFUQUlfUEggICAgICAgICggICAgICAgICAgICAgIEJJVCgwKSkKKyAgICAgICNkZWZpbmUgIFNfREFUQU9fUEggICAgICAgIDB4MDAKKyAgICAgICNkZWZpbmUgIFNfSUxMX1BIICAgICAgICAgICggICAgICAgQklUKDEpICAgICAgICkKKworICAgI2RlZmluZSAgaHBfc2NzaWN0cmxfMCAgICAgICAgMHg0NQorCisgICAgICAjZGVmaW5lICBOT19BUkIgICAgICAgICAgICBCSVQoNykKKyAgICAgICNkZWZpbmUgIFNFTF9UQVIgICAgICAgICAgIEJJVCg2KQorICAgICAgI2RlZmluZSAgRU5BX0FUTiAgICAgICAgICAgQklUKDQpCisgICAgICAjZGVmaW5lICBFTkFfUkVTRUwgICAgICAgICBCSVQoMikKKyAgICAgICNkZWZpbmUgIFNDU0lfUlNUICAgICAgICAgIEJJVCgxKQorICAgICAgI2RlZmluZSAgRU5BX1NDQU1fU0VMICAgICAgQklUKDApCisKKworCisgICAjZGVmaW5lICBocF9wb3J0Y3RybF8wICAgICAgICAweDQ2CisKKyAgICAgICNkZWZpbmUgIFNDU0lfUE9SVCAgICAgICAgIEJJVCg3KQorICAgICAgI2RlZmluZSAgU0NTSV9JTkJJVCAgICAgICAgQklUKDYpCisgICAgICAjZGVmaW5lICBETUFfUE9SVCAgICAgICAgICBCSVQoNSkKKyAgICAgICNkZWZpbmUgIERNQV9SRCAgICAgICAgICAgIEJJVCg0KQorICAgICAgI2RlZmluZSAgSE9TVF9QT1JUICAgICAgICAgQklUKDMpCisgICAgICAjZGVmaW5lICBIT1NUX1dSVCAgICAgICAgICBCSVQoMikKKyAgICAgICNkZWZpbmUgIFNDU0lfQlVTX0VOICAgICAgIEJJVCgxKQorICAgICAgI2RlZmluZSAgU1RBUlRfVE8gICAgICAgICAgQklUKDApCisKKyAgICNkZWZpbmUgIGhwX3Njc2lyZXNldCAgICAgICAgIDB4NDcKKworICAgICAgI2RlZmluZSAgU0NTSV9UQVIgICAgICAgICAgQklUKDcpCisgICAgICAjZGVmaW5lICBTQ1NJX0lOSSAgICAgICAgICBCSVQoNikKKyAgICAgICNkZWZpbmUgIFNDQU1fRU4gICAgICAgICAgIEJJVCg1KQorICAgICAgI2RlZmluZSAgQUNLX0hPTEQgICAgICAgICAgQklUKDQpCisgICAgICAjZGVmaW5lICBETUFfUkVTRVQgICAgICAgICBCSVQoMykKKyAgICAgICNkZWZpbmUgIEhQU0NTSV9SRVNFVCAgICAgIEJJVCgyKQorICAgICAgI2RlZmluZSAgUFJPR19SRVNFVCAgICAgICAgQklUKDEpCisgICAgICAjZGVmaW5lICBGSUZPX0NMUiAgICAgICAgICBCSVQoMCkKKworICAgI2RlZmluZSAgaHBfeGZlcmNudF8wICAgICAgICAgMHg0OAorICAgI2RlZmluZSAgaHBfeGZlcmNudF8xICAgICAgICAgMHg0OQorICAgI2RlZmluZSAgaHBfeGZlcmNudF8yICAgICAgICAgMHg0QQorICAgI2RlZmluZSAgaHBfeGZlcmNudF8zICAgICAgICAgMHg0QgorCisgICAjZGVmaW5lICBocF9maWZvZGF0YV8wICAgICAgICAweDRDCisgICAjZGVmaW5lICBocF9maWZvZGF0YV8xICAgICAgICAweDRECisgICAjZGVmaW5lICBocF9hZGRzdGF0ICAgICAgICAgICAweDRFCisKKyAgICAgICNkZWZpbmUgIFNDQU1fVElNRVIgICAgICAgIEJJVCg3KQorICAgICAgI2RlZmluZSAgQVVUT19SVU5OSU5HICAgICAgQklUKDYpCisgICAgICAjZGVmaW5lICBGQVNUX1NZTkMgICAgICAgICBCSVQoNSkKKyAgICAgICNkZWZpbmUgIFNDU0lfTU9ERTggICAgICAgIEJJVCgzKQorICAgICAgI2RlZmluZSAgU0NTSV9QQVJfRVJSICAgICAgQklUKDApCisKKyAgICNkZWZpbmUgIGhwX3ByZ21jbnRfMCAgICAgICAgIDB4NEYKKworICAgICAgI2RlZmluZSAgQVVUT19QQ19NQVNLICAgICAgMHgzRgorCisgICAjZGVmaW5lICBocF9zZWxmaWRfMCAgICAgICAgICAweDUwCisgICAjZGVmaW5lICBocF9zZWxmaWRfMSAgICAgICAgICAweDUxCisgICAjZGVmaW5lICBocF9hcmJfaWQgICAgICAgICAgICAweDUyCisKKyAgICAgICNkZWZpbmUgIEFSQl9JRCAgICAgICAgICAgIChCSVQoMykgKyBCSVQoMikgKyBCSVQoMSkgKyBCSVQoMCkpCisKKyAgICNkZWZpbmUgIGhwX3NlbGVjdF9pZCAgICAgICAgIDB4NTMKKworICAgICAgI2RlZmluZSAgUkVTRUxfSUQgICAgICAgICAgKEJJVCg3KSArIEJJVCg2KSArIEJJVCg1KSArIEJJVCg0KSkKKyAgICAgICNkZWZpbmUgIFNFTEVDVF9JRCAgICAgICAgIChCSVQoMykgKyBCSVQoMikgKyBCSVQoMSkgKyBCSVQoMCkpCisKKyAgICNkZWZpbmUgIGhwX3N5bmN0YXJnX2Jhc2UgICAgIDB4NTQKKyAgICNkZWZpbmUgIGhwX3N5bmN0YXJnXzEyICAgICAgIDB4NTQKKyAgICNkZWZpbmUgIGhwX3N5bmN0YXJnXzEzICAgICAgIDB4NTUKKyAgICNkZWZpbmUgIGhwX3N5bmN0YXJnXzE0ICAgICAgIDB4NTYKKyAgICNkZWZpbmUgIGhwX3N5bmN0YXJnXzE1ICAgICAgIDB4NTcKKworICAgI2RlZmluZSAgaHBfc3luY3RhcmdfOCAgICAgICAgMHg1OAorICAgI2RlZmluZSAgaHBfc3luY3RhcmdfOSAgICAgICAgMHg1OQorICAgI2RlZmluZSAgaHBfc3luY3RhcmdfMTAgICAgICAgMHg1QQorICAgI2RlZmluZSAgaHBfc3luY3RhcmdfMTEgICAgICAgMHg1QgorCisgICAjZGVmaW5lICBocF9zeW5jdGFyZ180ICAgICAgICAweDVDCisgICAjZGVmaW5lICBocF9zeW5jdGFyZ181ICAgICAgICAweDVECisgICAjZGVmaW5lICBocF9zeW5jdGFyZ182ICAgICAgICAweDVFCisgICAjZGVmaW5lICBocF9zeW5jdGFyZ183ICAgICAgICAweDVGCisKKyAgICNkZWZpbmUgIGhwX3N5bmN0YXJnXzAgICAgICAgIDB4NjAKKyAgICNkZWZpbmUgIGhwX3N5bmN0YXJnXzEgICAgICAgIDB4NjEKKyAgICNkZWZpbmUgIGhwX3N5bmN0YXJnXzIgICAgICAgIDB4NjIKKyAgICNkZWZpbmUgIGhwX3N5bmN0YXJnXzMgICAgICAgIDB4NjMKKworICAgICAgI2RlZmluZSAgUkFURV8yME1CICAgICAgICAgMHgwMAorICAgICAgI2RlZmluZSAgUkFURV8xME1CICAgICAgICAgKCAgICAgICAgICAgICAgQklUKDUpKQorICAgICAgI2RlZmluZSAgUkFURV82XzZNQiAgICAgICAgKCAgICAgICBCSVQoNikgICAgICAgKSAgIAorICAgICAgI2RlZmluZSAgUkFURV81TUIgICAgICAgICAgKCAgICAgICBCSVQoNikrQklUKDUpKQorICAgICAgI2RlZmluZSAgUkFURV80TUIgICAgICAgICAgKEJJVCg3KSAgICAgICAgICAgICAgKQorICAgICAgI2RlZmluZSAgUkFURV8zXzMzTUIgICAgICAgKEJJVCg3KSAgICAgICArQklUKDUpKQorICAgICAgI2RlZmluZSAgUkFURV8yXzg1TUIgICAgICAgKEJJVCg3KStCSVQoNikgICAgICAgKQorICAgICAgI2RlZmluZSAgUkFURV8yXzVNQiAgICAgICAgKEJJVCg3KStCSVQoNSkrQklUKDYpKQorICAgICAgI2RlZmluZSAgTkVYVF9DTEsgICAgICAgICAgQklUKDUpCisgICAgICAjZGVmaW5lICBTTE9XRVNUX1NZTkMgICAgICAoQklUKDcpK0JJVCg2KStCSVQoNSkpCisgICAgICAjZGVmaW5lICBOQVJST1dfU0NTSSAgICAgICBCSVQoNCkKKyAgICAgICNkZWZpbmUgIFNZTkNfT0ZGU0VUICAgICAgIChCSVQoMykgKyBCSVQoMikgKyBCSVQoMSkgKyBCSVQoMCkpCisgICAgICAjZGVmaW5lICBERUZBVUxUX0FTWU5DICAgICAweDAwCisgICAgICAjZGVmaW5lICBERUZBVUxUX09GRlNFVCAgICAweDBGCisKKyAgICNkZWZpbmUgIGhwX2F1dG9zdGFydF8wICAgICAgIDB4NjQKKyAgICNkZWZpbmUgIGhwX2F1dG9zdGFydF8xICAgICAgIDB4NjUKKyAgICNkZWZpbmUgIGhwX2F1dG9zdGFydF8yICAgICAgIDB4NjYKKyAgICNkZWZpbmUgIGhwX2F1dG9zdGFydF8zICAgICAgIDB4NjcKKworCisKKyAgICAgICNkZWZpbmUgIERJU0FCTEUgIDB4MDAKKyAgICAgICNkZWZpbmUgIEFVVE9fSU1NRUQgICAgQklUKDUpCisgICAgICAjZGVmaW5lICBTRUxFQ1QgICBCSVQoNikKKyAgICAgICNkZWZpbmUgIFJFU0VMRUNUIChCSVQoNikrQklUKDUpKQorICAgICAgI2RlZmluZSAgQlVTRlJFRSAgQklUKDcpCisgICAgICAjZGVmaW5lICBYRkVSXzAgICAoQklUKDcpK0JJVCg1KSkKKyAgICAgICNkZWZpbmUgIEVORF9EQVRBIChCSVQoNykrQklUKDYpKQorICAgICAgI2RlZmluZSAgTVNHX1BIWiAgKEJJVCg3KStCSVQoNikrQklUKDUpKQorCisgICAjZGVmaW5lICBocF9ncF9yZWdfMCAgICAgICAgICAweDY4CisgICAjZGVmaW5lICBocF9ncF9yZWdfMSAgICAgICAgICAweDY5CisgICAjZGVmaW5lICBocF9ncF9yZWdfMiAgICAgICAgICAweDZBCisgICAjZGVmaW5lICBocF9ncF9yZWdfMyAgICAgICAgICAweDZCCisKKyAgICNkZWZpbmUgIGhwX3NlbHRpbWVvdXQgICAgICAgIDB4NkMKKworCisgICAgICAjZGVmaW5lICBUT18ybXMgICAgICAgICAgICAweDU0ICAgICAgLyogMi4wNTAzbXMgKi8KKyAgICAgICNkZWZpbmUgIFRPXzRtcyAgICAgICAgICAgIDB4NjcgICAgICAvKiAzLjk5NTltcyAqLworCisgICAgICAjZGVmaW5lICBUT181bXMgICAgICAgICAgICAweDAzICAgICAgLyogNC45MTUybXMgKi8KKyAgICAgICNkZWZpbmUgIFRPXzEwbXMgICAgICAgICAgIDB4MDcgICAgICAvKiAxMS54eHhtcyAqLworICAgICAgI2RlZmluZSAgVE9fMjUwbXMgICAgICAgICAgMHg5OSAgICAgIC8qIDI1MC42OG1zICovCisgICAgICAjZGVmaW5lICBUT18yOTBtcyAgICAgICAgICAweEIxICAgICAgLyogMjg5Ljk5bXMgKi8KKyAgICAgICNkZWZpbmUgIFRPXzM1MG1zICAgICAgICAgIDB4RDYgICAgICAvKiAzNTAuNjJtcyAqLworICAgICAgI2RlZmluZSAgVE9fNDE3bXMgICAgICAgICAgMHhGRiAgICAgIC8qIDQxNy43OW1zICovCisKKyAgICNkZWZpbmUgIGhwX2Nsa2N0cmxfMCAgICAgICAgIDB4NkQKKworICAgICAgI2RlZmluZSAgUFdSX0RXTiAgICAgICAgICAgQklUKDYpCisgICAgICAjZGVmaW5lICBBQ1RkZWFzc2VydCAgICAgICBCSVQoNCkKKyAgICAgICNkZWZpbmUgIEFUTm9uRXJyICAgICAgICAgIEJJVCgzKQorICAgICAgI2RlZmluZSAgQ0xLXzMwTUhaICAgICAgICAgQklUKDEpCisgICAgICAjZGVmaW5lICBDTEtfNDBNSFogICAgICAgICAoQklUKDEpICsgQklUKDApKQorICAgICAgI2RlZmluZSAgQ0xLXzUwTUhaICAgICAgICAgQklUKDIpCisKKyAgICAgICNkZWZpbmUgIENMS0NUUkxfREVGQVVMVCAgIChBQ1RkZWFzc2VydCB8IENMS180ME1IWikKKworICAgI2RlZmluZSAgaHBfZmlmb3JlYWQgICAgICAgICAgMHg2RQorICAgI2RlZmluZSAgaHBfZmlmb3dyaXRlICAgICAgICAgMHg2RgorCisgICAjZGVmaW5lICBocF9vZmZzZXRjdHIgICAgICAgICAweDcwCisgICAjZGVmaW5lICBocF94ZmVyc3RhdCAgICAgICAgICAweDcxCisKKyAgICAgICNkZWZpbmUgIEZJRk9fRlVMTCAgICAgICAgIEJJVCg3KQorICAgICAgI2RlZmluZSAgRklGT19FTVBUWSAgICAgICAgQklUKDYpCisgICAgICAjZGVmaW5lICBGSUZPX01BU0sgICAgICAgICAweDNGICAgLyogTWFzayBmb3IgdGhlIEZJRk8gY291bnQgdmFsdWUuICovCisgICAgICAjZGVmaW5lICBGSUZPX0xFTiAgICAgICAgICAweDIwCisKKyAgICNkZWZpbmUgIGhwX3BvcnRjdHJsXzEgICAgICAgIDB4NzIKKworICAgICAgI2RlZmluZSAgRVZFTl9IT1NUX1AgICAgICAgQklUKDUpCisgICAgICAjZGVmaW5lICBJTlZUX1NDU0kgICAgICAgICBCSVQoNCkKKyAgICAgICNkZWZpbmUgIENIS19TQ1NJX1AgICAgICAgIEJJVCgzKQorICAgICAgI2RlZmluZSAgSE9TVF9NT0RFOCAgICAgICAgQklUKDApCisgICAgICAjZGVmaW5lICBIT1NUX01PREUxNiAgICAgICAweDAwCisKKyAgICNkZWZpbmUgIGhwX3hmZXJfcGFkICAgICAgICAgIDB4NzMKKworICAgICAgI2RlZmluZSAgSURfVU5MT0NLICAgICAgICAgQklUKDMpCisgICAgICAjZGVmaW5lICBYRkVSX1BBRCAgICAgICAgICBCSVQoMikKKworICAgI2RlZmluZSAgaHBfc2NzaWRhdGFfMCAgICAgICAgMHg3NAorICAgI2RlZmluZSAgaHBfc2NzaWRhdGFfMSAgICAgICAgMHg3NQorICAgI2RlZmluZSAgaHBfdGltZXJfMCAgICAgICAgICAgMHg3NgorICAgI2RlZmluZSAgaHBfdGltZXJfMSAgICAgICAgICAgMHg3NworCisgICAjZGVmaW5lICBocF9yZXNlcnZlZF83OCAgICAgICAweDc4CisgICAjZGVmaW5lICBocF9yZXNlcnZlZF83OSAgICAgICAweDc5CisgICAjZGVmaW5lICBocF9yZXNlcnZlZF83QSAgICAgICAweDdBCisgICAjZGVmaW5lICBocF9yZXNlcnZlZF83QiAgICAgICAweDdCCisKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzdDICAgICAgIDB4N0MKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzdEICAgICAgIDB4N0QKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzdFICAgICAgIDB4N0UKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzdGICAgICAgIDB4N0YKKworICAgI2RlZmluZSAgaHBfYXJhbUJhc2UgICAgICAgICAgMHg4MAorICAgI2RlZmluZSAgQklPU19EQVRBX09GRlNFVCAgICAgMHg2MAorICAgI2RlZmluZSAgQklPU19SRUxBVElWRV9DQVJEICAgMHg2NAorCisKKworCisgICAgICAjZGVmaW5lICBBVVRPX0xFTiAweDgwCisgICAgICAjZGVmaW5lICBBUjAgICAgICAweDAwCisgICAgICAjZGVmaW5lICBBUjEgICAgICBCSVRXKDgpCisgICAgICAjZGVmaW5lICBBUjIgICAgICBCSVRXKDkpCisgICAgICAjZGVmaW5lICBBUjMgICAgICAoQklUVyg5KSArIEJJVFcoOCkpCisgICAgICAjZGVmaW5lICBTREFUQSAgICBCSVRXKDEwKQorCisgICAgICAjZGVmaW5lICBOT1BfT1AgICAweDAwICAgICAgICAvKiBOb3AgY29tbWFuZCAqLworCisgICAgICAjZGVmaW5lICBDUkRfT1AgICBCSVRXKDExKSAgICAgLyogQ21wIFJlZy4gdy8gRGF0YSAqLworCisgICAgICAjZGVmaW5lICBDUlJfT1AgICBCSVRXKDEyKSAgICAgLyogQ21wIFJlZy4gdy4gUmVnLiAqLworCisgICAgICAjZGVmaW5lICBDQkVfT1AgICAoQklUVygxNCkrQklUVygxMikrQklUVygxMSkpIC8qIENtcCBTQ1NJIGNtZCBjbGFzcyAmIEJyYW5jaCBFUSAqLworICAgICAgCisgICAgICAjZGVmaW5lICBDQk5fT1AgICAoQklUVygxNCkrQklUVygxMykpICAvKiBDbXAgU0NTSSBjbWQgY2xhc3MgJiBCcmFuY2ggTk9UIEVRICovCisgICAgICAKKyAgICAgICNkZWZpbmUgIENQRV9PUCAgIChCSVRXKDE0KStCSVRXKDExKSkgIC8qIENtcCBTQ1NJIHBocyAmIEJyYW5jaCBFUSAqLworCisgICAgICAjZGVmaW5lICBDUE5fT1AgICAoQklUVygxNCkrQklUVygxMikpICAvKiBDbXAgU0NTSSBwaHMgJiBCcmFuY2ggTk9UIEVRICovCisKKworICAgICAgI2RlZmluZSAgQURBVEFfT1VUICAgMHgwMCAgICAgCisgICAgICAjZGVmaW5lICBBREFUQV9JTiAgICBCSVRXKDgpCisgICAgICAjZGVmaW5lICBBQ09NTUFORCAgICBCSVRXKDEwKQorICAgICAgI2RlZmluZSAgQVNUQVRVUyAgICAgKEJJVFcoMTApK0JJVFcoOCkpCisgICAgICAjZGVmaW5lICBBTVNHX09VVCAgICAoQklUVygxMCkrQklUVyg5KSkKKyAgICAgICNkZWZpbmUgIEFNU0dfSU4gICAgIChCSVRXKDEwKStCSVRXKDkpK0JJVFcoOCkpCisgICAgICAjZGVmaW5lICBBSUxMRUdBTCAgICAoQklUVyg5KStCSVRXKDgpKQorCisKKyAgICAgICNkZWZpbmUgIEJSSF9PUCAgIEJJVFcoMTMpICAgLyogQnJhbmNoICovCisKKyAgICAgIAorICAgICAgI2RlZmluZSAgQUxXQVlTICAgMHgwMAorICAgICAgI2RlZmluZSAgRVFVQUwgICAgQklUVyg4KQorICAgICAgI2RlZmluZSAgTk9UX0VRICAgQklUVyg5KQorCisgICAgICAjZGVmaW5lICBUQ0JfT1AgICAoQklUVygxMykrQklUVygxMSkpICAgIC8qIFRlc3QgY29uZGl0aW9uICYgYnJhbmNoICovCisKKyAgICAgIAorICAgICAgI2RlZmluZSAgQVROX1NFVCAgICAgQklUVyg4KQorICAgICAgI2RlZmluZSAgQVROX1JFU0VUICAgQklUVyg5KQorICAgICAgI2RlZmluZSAgWEZFUl9DTlQgICAgKEJJVFcoOSkrQklUVyg4KSkKKyAgICAgICNkZWZpbmUgIEZJRk9fMCAgICAgIEJJVFcoMTApCisgICAgICAjZGVmaW5lICBGSUZPX05PVDAgICAoQklUVygxMCkrQklUVyg4KSkKKyAgICAgICNkZWZpbmUgIFRfVVNFX1NZTkMwIChCSVRXKDEwKStCSVRXKDkpKQorCisKKyAgICAgICNkZWZpbmUgIE1QTV9PUCAgIEJJVFcoMTUpICAgICAgICAvKiBNYXRjaCBwaGFzZSBhbmQgbW92ZSBkYXRhICovCisKKyAgICAgICNkZWZpbmUgIE1EUl9PUCAgIChCSVRXKDEyKStCSVRXKDExKSkgLyogTW92ZSBkYXRhIHRvIFJlZy4gKi8KKworICAgICAgI2RlZmluZSAgTVJSX09QICAgQklUVygxNCkgICAgICAgIC8qIE1vdmUgRFJlZy4gdG8gUmVnLiAqLworCisKKyAgICAgICNkZWZpbmUgIFNfSURSRUcgIChCSVQoMikrQklUKDEpK0JJVCgwKSkKKworCisgICAgICAjZGVmaW5lICBEX0FSMCAgICAweDAwCisgICAgICAjZGVmaW5lICBEX0FSMSAgICBCSVQoMCkKKyAgICAgICNkZWZpbmUgIERfQVIyICAgIEJJVCgxKQorICAgICAgI2RlZmluZSAgRF9BUjMgICAgKEJJVCgxKSArIEJJVCgwKSkKKyAgICAgICNkZWZpbmUgIERfU0RBVEEgIEJJVCgyKQorICAgICAgI2RlZmluZSAgRF9CVUNLRVQgKEJJVCgyKSArIEJJVCgxKSArIEJJVCgwKSkKKworCisgICAgICAjZGVmaW5lICBBRFJfT1AgICAoQklUVygxMykrQklUVygxMikpIC8qIExvZ2ljYWwgQU5EIFJlZy4gdy4gRGF0YSAqLworCisgICAgICAjZGVmaW5lICBBRFNfT1AgICAoQklUVygxNCkrQklUVygxMykrQklUVygxMikpIAorCisgICAgICAjZGVmaW5lICBPRFJfT1AgICAoQklUVygxMykrQklUVygxMikrQklUVygxMSkpICAKKworICAgICAgI2RlZmluZSAgT0RTX09QICAgKEJJVFcoMTQpK0JJVFcoMTMpK0JJVFcoMTIpK0JJVFcoMTEpKSAgCisKKyAgICAgICNkZWZpbmUgIFNUUl9PUCAgIChCSVRXKDE1KStCSVRXKDE0KSkgLyogU3RvcmUgdG8gQV9SZWcuICovCisKKyAgICAgICNkZWZpbmUgIEFJTlRfRU5BMSAgIDB4MDAKKyAgICAgICNkZWZpbmUgIEFJTlRfU1RBVDEgIEJJVFcoOCkKKyAgICAgICNkZWZpbmUgIEFTQ1NJX1NJRyAgIEJJVFcoOSkKKyAgICAgICNkZWZpbmUgIEFTQ1NJX0NOVEwgIChCSVRXKDkpK0JJVFcoOCkpCisgICAgICAjZGVmaW5lICBBUE9SVF9DTlRMICBCSVRXKDEwKQorICAgICAgI2RlZmluZSAgQVJTVF9DTlRMICAgKEJJVFcoMTApK0JJVFcoOCkpCisgICAgICAjZGVmaW5lICBBWEZFUkNOVDAgICAoQklUVygxMCkrQklUVyg5KSkKKyAgICAgICNkZWZpbmUgIEFYRkVSQ05UMSAgIChCSVRXKDEwKStCSVRXKDkpK0JJVFcoOCkpCisgICAgICAjZGVmaW5lICBBWEZFUkNOVDIgICBCSVRXKDExKQorICAgICAgI2RlZmluZSAgQUZJRk9fREFUQSAgKEJJVFcoMTEpK0JJVFcoOCkpCisgICAgICAjZGVmaW5lICBBU0NTSVNFTElEICAoQklUVygxMSkrQklUVyg5KSkKKyAgICAgICNkZWZpbmUgIEFTQ1NJU1lOQzAgIChCSVRXKDExKStCSVRXKDkpK0JJVFcoOCkpCisKKworICAgICAgI2RlZmluZSAgUkFUX09QICAgICAgKEJJVFcoMTQpK0JJVFcoMTMpK0JJVFcoMTEpKQorCisgICAgICAjZGVmaW5lICBTU0lfT1AgICAgICAoQklUVygxNSkrQklUVygxMSkpCisKKworICAgICAgI2RlZmluZSAgU1NJX0lUQVJfRElTQwkoSVRBUl9ESVNDID4+IDgpCisgICAgICAjZGVmaW5lICBTU0lfSURPX1NUUlQJKElET19TVFJUID4+IDgpCisgICAgICAjZGVmaW5lICBTU0lfSURJX1NUUlQJKElET19TVFJUID4+IDgpCisKKyAgICAgICNkZWZpbmUgIFNTSV9JQ01EX0NPTVAJKElDTURfQ09NUCA+PiA4KQorICAgICAgI2RlZmluZSAgU1NJX0lUSUNLTEUJKElUSUNLTEUgPj4gOCkKKworICAgICAgI2RlZmluZSAgU1NJX0lVTktXTgkoSVVOS1dOID4+IDgpCisgICAgICAjZGVmaW5lICBTU0lfSU5PX0NDCShJVU5LV04gPj4gOCkKKyAgICAgICNkZWZpbmUgIFNTSV9JUkZBSUwJKElVTktXTiA+PiA4KQorCisKKyAgICAgICNkZWZpbmUgIE5QICAgIDB4MTAgICAgIC8qTmV4dCBQaGFzZSAqLworICAgICAgI2RlZmluZSAgTlRDTUQgMHgwMiAgICAgLypOb24tIFRhZ2dlZCBDb21tYW5kIHN0YXJ0ICovCisgICAgICAjZGVmaW5lICBDTURQWiAweDA0ICAgICAvKkNvbW1hbmQgcGhhc2UgKi8KKyAgICAgICNkZWZpbmUgIERJTlQgIDB4MTIgICAgIC8qRGF0YSBPdXQvSW4gaW50ZXJydXB0ICovCisgICAgICAjZGVmaW5lICBESSAgICAweDEzICAgICAvKkRhdGEgT3V0ICovCisgICAgICAjZGVmaW5lICBNSSAgICAweDE0ICAgICAvKk1lc3NhZ2UgSW4gKi8KKyAgICAgICNkZWZpbmUgIERDICAgIDB4MTkgICAgIC8qRGlzY29ubmVjdCBNZXNzYWdlICovCisgICAgICAjZGVmaW5lICBTVCAgICAweDFEICAgICAvKlN0YXR1cyBQaGFzZSAqLworICAgICAgI2RlZmluZSAgVU5LTldOIDB4MjQgICAgLypVbmtub3duIGJ1cyBhY3Rpb24gKi8KKyAgICAgICNkZWZpbmUgIENDICAgIDB4MjUgICAgIC8qQ29tbWFuZCBDb21wbGV0aW9uIGZhaWx1cmUgKi8KKyAgICAgICNkZWZpbmUgIFRJQ0sgIDB4MjYgICAgIC8qTmV3IHRhcmdldCByZXNlbGVjdGVkIHVzLiAqLworICAgICAgI2RlZmluZSAgUkZBSUwgMHgyNyAgICAgLypSZXNlbGVjdGlvbiBmYWlsZWQgKi8KKyAgICAgICNkZWZpbmUgIFNFTENISyAweDI4ICAgICAvKlNlbGVjdCAmIENoZWNrIFNDU0kgSUQgbGF0Y2ggcmVnICovCisKKworICAgICAgI2RlZmluZSAgSURfTVNHX1NUUlQgICAgaHBfYXJhbUJhc2UgKyAweDAwCisgICAgICAjZGVmaW5lICBOT05fVEFHX0lEX01TRyBocF9hcmFtQmFzZSArIDB4MDYKKyAgICAgICNkZWZpbmUgIENNRF9TVFJUICAgICAgIGhwX2FyYW1CYXNlICsgMHgwOAorICAgICAgI2RlZmluZSAgU1lOQ19NU0dTICAgICAgaHBfYXJhbUJhc2UgKyAweDA4CisKKworCisKKworICAgICAgI2RlZmluZSAgVEFHX1NUUlQgICAgICAgICAgMHgwMAorICAgICAgI2RlZmluZSAgU0VMRUNUSU9OX1NUQVJUICAgMHgwMAorICAgICAgI2RlZmluZSAgRElTQ09OTkVDVF9TVEFSVCAgMHgxMC8yCisgICAgICAjZGVmaW5lICBFTkRfREFUQV9TVEFSVCAgICAweDE0LzIKKyAgICAgICNkZWZpbmUgIE5PTlRBR19TVFJUICAgICAgIDB4MDIvMgorICAgICAgI2RlZmluZSAgQ01EX09OTFlfU1RSVCAgICAgQ01EUFovMgorICAgICAgI2RlZmluZSAgVElDS0xFX1NUUlQgICAgIFRJQ0svMgorICAgICAgI2RlZmluZSAgU0VMQ0hLX1NUUlQgICAgIFNFTENISy8yCisKKworCisKKyNkZWZpbmUgbUVFUFJPTV9DTEtfREVMQVkocG9ydCkgKFJEX0hBUlBPT04ocG9ydCtocF9pbnRzdGF0XzEpKQorCisjZGVmaW5lIG1XQUlUXzEwTVMocG9ydCkgKFJEX0hBUlBPT04ocG9ydCtocF9pbnRzdGF0XzEpKQorCisKKyNkZWZpbmUgQ0xSX1hGRVJfQ05UKHBvcnQpIChXUl9IQVJQT09OKHBvcnQraHBfeGZlcmNudF8wLCAweDAwKSkKKworI2RlZmluZSBTRVRfWEZFUl9DTlQocG9ydCwgZGF0YSkgKFdSX0hBUlAzMihwb3J0LGhwX3hmZXJjbnRfMCxkYXRhKSkKKworI2RlZmluZSBHRVRfWEZFUl9DTlQocG9ydCwgeGZlcmNudCkge1JEX0hBUlAzMihwb3J0LGhwX3hmZXJjbnRfMCx4ZmVyY250KTsgeGZlcmNudCAmPSAweEZGRkZGRjt9CisvKiAjZGVmaW5lIEdFVF9YRkVSX0NOVChwb3J0LCB4ZmVyY250KSAoeGZlcmNudCA9IFJEX0hBUlBPT04ocG9ydCtocF94ZmVyY250XzIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZmVyY250IDw8PSAxNixcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZmVyY250IHw9IFJEV19IQVJQT09OKChVU0hPUlQpKHBvcnQraHBfeGZlcmNudF8wKSkpCisgKi8KKyNpZiBkZWZpbmVkKERPUykKKyNkZWZpbmUgSFBfU0VUVVBfQUREUl9DTlQocG9ydCxhZGRyLGNvdW50KSAoV1JXX0hBUlBPT04oKFVTSE9SVCkocG9ydCtocF9ob3N0X2FkZHJfbG8pLCAoVVNIT1JUKShhZGRyICYgMHgwMDAwRkZGRkwpKSxcCisgICAgICAgICBhZGRyID4+PSAxNixcCisgICAgICAgICBXUldfSEFSUE9PTigoVVNIT1JUKShwb3J0K2hwX2hvc3RfYWRkcl9obWkpLCAoVVNIT1JUKShhZGRyICYgMHgwMDAwRkZGRkwpKSxcCisgICAgICAgICBXUl9IQVJQMzIocG9ydCxocF94ZmVyY250XzAsY291bnQpLFwKKyAgICAgICAgIFdSV19IQVJQT09OKChVU0hPUlQpKHBvcnQraHBfeGZlcl9jbnRfbG8pLCAoVVNIT1JUKShjb3VudCAmIDB4MDAwMEZGRkZMKSksXAorICAgICAgICAgY291bnQgPj49IDE2LFwKKyAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF94ZmVyX2NudF9oaSwgKGNvdW50ICYgMHhGRikpKQorI2Vsc2UKKyNkZWZpbmUgSFBfU0VUVVBfQUREUl9DTlQocG9ydCxhZGRyLGNvdW50KSAoV1JXX0hBUlBPT04oKHBvcnQraHBfaG9zdF9hZGRyX2xvKSwgKFVTSE9SVCkoYWRkciAmIDB4MDAwMEZGRkZMKSksXAorICAgICAgICAgYWRkciA+Pj0gMTYsXAorICAgICAgICAgV1JXX0hBUlBPT04oKHBvcnQraHBfaG9zdF9hZGRyX2htaSksIChVU0hPUlQpKGFkZHIgJiAweDAwMDBGRkZGTCkpLFwKKyAgICAgICAgIFdSX0hBUlAzMihwb3J0LGhwX3hmZXJjbnRfMCxjb3VudCksXAorICAgICAgICAgV1JXX0hBUlBPT04oKHBvcnQraHBfeGZlcl9jbnRfbG8pLCAoVVNIT1JUKShjb3VudCAmIDB4MDAwMEZGRkZMKSksXAorICAgICAgICAgY291bnQgPj49IDE2LFwKKyAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF94ZmVyX2NudF9oaSwgKGNvdW50ICYgMHhGRikpKQorI2VuZGlmCisKKyNkZWZpbmUgQUNDRVBUX01TRyhwb3J0KSB7d2hpbGUoUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9SRVEpe31cCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnLCBTX0lMTF9QSCk7fQorCisKKyNkZWZpbmUgQUNDRVBUX01TR19BVE4ocG9ydCkge3doaWxlKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNDU0lfUkVRKXt9XAorICAgICAgICAgICAgICAgICAgICAgICAgICBXUl9IQVJQT09OKHBvcnQraHBfc2NzaXNpZywgKFNfSUxMX1BIfFNDU0lfQVROKSk7fQorCisjZGVmaW5lIEFDQ0VQVF9TVEFUKHBvcnQpIHt3aGlsZShSRF9IQVJQT09OKHBvcnQraHBfc2NzaXNpZykgJiBTQ1NJX1JFUSl7fVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcsIFNfSUxMX1BIKTt9CisKKyNkZWZpbmUgQUNDRVBUX1NUQVRfQVROKHBvcnQpIHt3aGlsZShSRF9IQVJQT09OKHBvcnQraHBfc2NzaXNpZykgJiBTQ1NJX1JFUSl7fVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcsIChTX0lMTF9QSHxTQ1NJX0FUTikpO30KKworI2RlZmluZSBESVNBQkxFX0FVVE8ocG9ydCkgKFdSX0hBUlBPT04ocG9ydCtocF9zY3NpcmVzZXQsIFBST0dfUkVTRVQpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9zY3NpcmVzZXQsIDB4MDApKQorCisjZGVmaW5lIEFSQU1fQUNDRVNTKHBfcG9ydCkgKFdSX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUkRfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsKSB8IFNHUkFNX0FSQU0pKSkKKworI2RlZmluZSBTR1JBTV9BQ0NFU1MocF9wb3J0KSAoV1JfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSRF9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwpICYgflNHUkFNX0FSQU0pKSkKKworI2RlZmluZSBNRElTQUJMRV9JTlQocF9wb3J0KSAoV1JfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSRF9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwpIHwgR19JTlRfRElTQUJMRSkpKQorCisjZGVmaW5lIE1FTkFCTEVfSU5UKHBfcG9ydCkgKFdSX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUkRfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsKSAmIH5HX0lOVF9ESVNBQkxFKSkpCisKKworCisjZW5kaWYKKworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKK3ZvaWQgUmVhZE5WUmFtKFBTQ0NCY2FyZCBwQ3VyckNhcmQsUFVDQiBwX3VjYik7Cit2b2lkIFdyaXRlTlZSYW0oUFNDQ0JjYXJkIHBDdXJyQ2FyZCxQVUNCIHBfdWNiKTsKK3ZvaWQgVXBkYXRlQ2hlY2tTdW0odTMyYml0cyBiYXNlcG9ydCk7CisjZW5kaWYgLy8gKEZXX1RZUEU9PV9VQ0JfTUdSXykKKworI2lmIGRlZmluZWQoRE9TKQorVUNIQVIgc2ZtKFVTSE9SVCBwb3J0LCBQU0NDQiBwY3VyclNDQ0IpOwordm9pZCAgc2NzaVN0YXJ0QXV0byhVU0hPUlQgcG9ydCk7CitVQ0hBUiBzaXN5bmNuKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQsIFVDSEFSIHN5bmNGbGFnKTsKK3ZvaWQgIHNzZWwoVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBzcmVzKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQsIFBTQ0NCY2FyZCBwQ3VyckNhcmQpOwordm9pZCAgc2RlY20oVUNIQVIgbWVzc2FnZSwgVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBzaGFuZGVtKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQsUFNDQ0IgcEN1cnJTQ0NCKTsKK3ZvaWQgIHN0c3luY24oVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBzaXN5bmNyKFVTSE9SVCBwb3J0LFVDSEFSIHN5bmNfcHVsc2UsIFVDSEFSIG9mZnNldCk7Cit2b2lkICBzc3N5bmN2KFVTSE9SVCBwX3BvcnQsIFVDSEFSIHBfaWQsIFVDSEFSIHBfc3luY192YWx1ZSwgUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvKTsKK3ZvaWQgIHNyZXNiKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQpOwordm9pZCAgc3hmcnAoVVNIT1JUIHBfcG9ydCwgVUNIQVIgcF9jYXJkKTsKK3ZvaWQgIHNjaGtkZChVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkKTsKK1VDSEFSIFJkU3RhY2soVVNIT1JUIHBvcnQsIFVDSEFSIGluZGV4KTsKK3ZvaWQgIFdyU3RhY2soVVNIT1JUIHBvcnRCYXNlLCBVQ0hBUiBpbmRleCwgVUNIQVIgZGF0YSk7CitVQ0hBUiBDaGtJZkNoaXBJbml0aWFsaXplZChVU0hPUlQgaW9Qb3J0KTsKKworI2lmIGRlZmluZWQoVjMwMikKK1VDSEFSIEdldFRhckx1bihVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkLCBVQ0hBUiBvdXJfdGFyZ2V0LCBQU0NDQmNhcmQgcEN1cnJDYXJkLCBQVUNIQVIgdGFnLCBQVUNIQVIgbHVuKTsKKyNlbmRpZgorCit2b2lkIFNlbmRNc2coVVNIT1JUIHBvcnQsIFVDSEFSIG1lc3NhZ2UpOwordm9pZCAgcXVldWVGbHVzaFRhcmdTY2NiKFVDSEFSIHBfY2FyZCwgVUNIQVIgdGhpc1RhcmcsIFVDSEFSIGVycm9yX2NvZGUpOworVUNIQVIgc2NzZWxsRE9TKFVTSE9SVCBwX3BvcnQsIFVDSEFSIHRhcmdfaWQpOworI2Vsc2UKK1VDSEFSIHNmbShVTE9ORyBwb3J0LCBQU0NDQiBwY3VyclNDQ0IpOwordm9pZCAgc2NzaVN0YXJ0QXV0byhVTE9ORyBwb3J0KTsKK1VDSEFSIHNpc3luY24oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkLCBVQ0hBUiBzeW5jRmxhZyk7Cit2b2lkICBzc2VsKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBzcmVzKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCwgUFNDQ0JjYXJkIHBDdXJyQ2FyZCk7Cit2b2lkICBzZGVjbShVQ0hBUiBtZXNzYWdlLCBVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpOwordm9pZCAgc2hhbmRlbShVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQsUFNDQ0IgcEN1cnJTQ0NCKTsKK3ZvaWQgIHN0c3luY24oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKTsKK3ZvaWQgIHNpc3luY3IoVUxPTkcgcG9ydCxVQ0hBUiBzeW5jX3B1bHNlLCBVQ0hBUiBvZmZzZXQpOwordm9pZCAgc3NzeW5jdihVTE9ORyBwX3BvcnQsIFVDSEFSIHBfaWQsIFVDSEFSIHBfc3luY192YWx1ZSwgUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvKTsKK3ZvaWQgIHNyZXNiKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBzeGZycChVTE9ORyBwX3BvcnQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBzY2hrZGQoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKTsKK1VDSEFSIFJkU3RhY2soVUxPTkcgcG9ydCwgVUNIQVIgaW5kZXgpOwordm9pZCAgV3JTdGFjayhVTE9ORyBwb3J0QmFzZSwgVUNIQVIgaW5kZXgsIFVDSEFSIGRhdGEpOworVUNIQVIgQ2hrSWZDaGlwSW5pdGlhbGl6ZWQoVUxPTkcgaW9Qb3J0KTsKKworI2lmIGRlZmluZWQoVjMwMikKK1VDSEFSIEdldFRhckx1bihVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQsIFVDSEFSIG91cl90YXJnZXQsIFBTQ0NCY2FyZCBwQ3VyckNhcmQsIFBVQ0hBUiB0YXIsIFBVQ0hBUiBsdW4pOworI2VuZGlmCisKK3ZvaWQgU2VuZE1zZyhVTE9ORyBwb3J0LCBVQ0hBUiBtZXNzYWdlKTsKK3ZvaWQgIHF1ZXVlRmx1c2hUYXJnU2NjYihVQ0hBUiBwX2NhcmQsIFVDSEFSIHRoaXNUYXJnLCBVQ0hBUiBlcnJvcl9jb2RlKTsKKyNlbmRpZgorCit2b2lkICBzc2Vuc3MoUFNDQ0JjYXJkIHBDdXJyQ2FyZCk7Cit2b2lkICBzaW5pdHMoUFNDQ0IgcF9zY2NiLCBVQ0hBUiBwX2NhcmQpOwordm9pZCAgUk5WUmFtRGF0YShQTlZSYW1JbmZvIHBOdlJhbUluZm8pOworCisjaWYgZGVmaW5lZChXSURFX1NDU0kpCisgICAjaWYgZGVmaW5lZChET1MpCisgICBVQ0hBUiBzaXdpZG4oVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisgICB2b2lkICBzdHdpZG4oVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisgICB2b2lkICBzaXdpZHIoVVNIT1JUIHBvcnQsIFVDSEFSIHdpZHRoKTsKKyAgICNlbHNlCisgICBVQ0hBUiBzaXdpZG4oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKTsKKyAgIHZvaWQgIHN0d2lkbihVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpOworICAgdm9pZCAgc2l3aWRyKFVMT05HIHBvcnQsIFVDSEFSIHdpZHRoKTsKKyAgICNlbmRpZgorI2VuZGlmCisKKwordm9pZCAgcXVldWVTZWxlY3RGYWlsKFBTQ0NCY2FyZCBwQ3VyckNhcmQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBxdWV1ZURpc2Nvbm5lY3QoUFNDQ0IgcF9TQ0NCLCBVQ0hBUiBwX2NhcmQpOwordm9pZCAgcXVldWVDbWRDb21wbGV0ZShQU0NDQmNhcmQgcEN1cnJDYXJkLCBQU0NDQiBwX1NDQ0IsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBxdWV1ZVNlYXJjaFNlbGVjdChQU0NDQmNhcmQgcEN1cnJDYXJkLCBVQ0hBUiBwX2NhcmQpOwordm9pZCAgcXVldWVGbHVzaFNjY2IoVUNIQVIgcF9jYXJkLCBVQ0hBUiBlcnJvcl9jb2RlKTsKK3ZvaWQgIHF1ZXVlQWRkU2NjYihQU0NDQiBwX1NDQ0IsIFVDSEFSIGNhcmQpOworVUNIQVIgcXVldWVGaW5kU2NjYihQU0NDQiBwX1NDQ0IsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICB1dGlsVXBkYXRlUmVzaWR1YWwoUFNDQ0IgcF9TQ0NCKTsKK1VTSE9SVCBDYWxjQ3JjMTYoVUNIQVIgYnVmZmVyW10pOworVUNIQVIgIENhbGNMcmMoVUNIQVIgYnVmZmVyW10pOworCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgIFdhaXQxU2Vjb25kKFVTSE9SVCBwX3BvcnQpOwordm9pZCAgV2FpdChVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2RlbGF5KTsKK3ZvaWQgIHV0aWxFRVdyaXRlT25PZmYoVVNIT1JUIHBfcG9ydCxVQ0hBUiBwX21vZGUpOwordm9pZCAgdXRpbEVFV3JpdGUoVVNIT1JUIHBfcG9ydCwgVVNIT1JUIGVlX2RhdGEsIFVTSE9SVCBlZV9hZGRyKTsKK1VTSE9SVCB1dGlsRUVSZWFkKFVTSE9SVCBwX3BvcnQsIFVTSE9SVCBlZV9hZGRyKTsKK1VTSE9SVCB1dGlsRUVSZWFkT3JnKFVTSE9SVCBwX3BvcnQsIFVTSE9SVCBlZV9hZGRyKTsKK3ZvaWQgIHV0aWxFRVNlbmRDbWRBZGRyKFVTSE9SVCBwX3BvcnQsIFVDSEFSIGVlX2NtZCwgVVNIT1JUIGVlX2FkZHIpOworI2Vsc2UKK3ZvaWQgIFdhaXQxU2Vjb25kKFVMT05HIHBfcG9ydCk7Cit2b2lkICBXYWl0KFVMT05HIHBfcG9ydCwgVUNIQVIgcF9kZWxheSk7Cit2b2lkICB1dGlsRUVXcml0ZU9uT2ZmKFVMT05HIHBfcG9ydCxVQ0hBUiBwX21vZGUpOwordm9pZCAgdXRpbEVFV3JpdGUoVUxPTkcgcF9wb3J0LCBVU0hPUlQgZWVfZGF0YSwgVVNIT1JUIGVlX2FkZHIpOworVVNIT1JUIHV0aWxFRVJlYWQoVUxPTkcgcF9wb3J0LCBVU0hPUlQgZWVfYWRkcik7CitVU0hPUlQgdXRpbEVFUmVhZE9yZyhVTE9ORyBwX3BvcnQsIFVTSE9SVCBlZV9hZGRyKTsKK3ZvaWQgIHV0aWxFRVNlbmRDbWRBZGRyKFVMT05HIHBfcG9ydCwgVUNIQVIgZWVfY21kLCBVU0hPUlQgZWVfYWRkcik7CisjZW5kaWYKKworCisKKyNpZiBkZWZpbmVkKE9TMikKKyAgIHZvaWQgIGZhciBwaGFzZURhdGFPdXQoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKTsKKyAgIHZvaWQgIGZhciBwaGFzZURhdGFJbihVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpOworICAgdm9pZCAgZmFyIHBoYXNlQ29tbWFuZChVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpOworICAgdm9pZCAgZmFyIHBoYXNlU3RhdHVzKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisgICB2b2lkICBmYXIgcGhhc2VNc2dPdXQoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKTsKKyAgIHZvaWQgIGZhciBwaGFzZU1zZ0luKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisgICB2b2lkICBmYXIgcGhhc2VJbGxlZ2FsKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisjZWxzZQorICAgI2lmIGRlZmluZWQoRE9TKQorICAgICAgdm9pZCAgcGhhc2VEYXRhT3V0KFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQpOworICAgICAgdm9pZCAgcGhhc2VEYXRhSW4oVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisgICAgICB2b2lkICBwaGFzZUNvbW1hbmQoVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisgICAgICB2b2lkICBwaGFzZVN0YXR1cyhVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkKTsKKyAgICAgIHZvaWQgIHBoYXNlTXNnT3V0KFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQpOworICAgICAgdm9pZCAgcGhhc2VNc2dJbihVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkKTsKKyAgICAgIHZvaWQgIHBoYXNlSWxsZWdhbChVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkKTsKKyAgICNlbHNlCisgICAgICB2b2lkICBwaGFzZURhdGFPdXQoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKTsKKyAgICAgIHZvaWQgIHBoYXNlRGF0YUluKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisgICAgICB2b2lkICBwaGFzZUNvbW1hbmQoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKTsKKyAgICAgIHZvaWQgIHBoYXNlU3RhdHVzKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisgICAgICB2b2lkICBwaGFzZU1zZ091dChVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpOworICAgICAgdm9pZCAgcGhhc2VNc2dJbihVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpOworICAgICAgdm9pZCAgcGhhc2VJbGxlZ2FsKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisgICAjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChET1MpCit2b2lkICBwaGFzZURlY29kZShVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkKTsKK3ZvaWQgIHBoYXNlQ2hrRmlmbyhVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkKTsKK3ZvaWQgIHBoYXNlQnVzRnJlZShVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2NhcmQpOworI2Vsc2UKK3ZvaWQgIHBoYXNlRGVjb2RlKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBwaGFzZUNoa0ZpZm8oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKTsKK3ZvaWQgIHBoYXNlQnVzRnJlZShVTE9ORyBwX3BvcnQsIFVDSEFSIHBfY2FyZCk7CisjZW5kaWYKKworCisKKworI2lmIGRlZmluZWQoRE9TKQordm9pZCAgWGJvd0luaXQoVVNIT1JUIHBvcnQsIFVDSEFSIHNjYW1GbGcpOwordm9pZCAgQnVzTWFzdGVySW5pdChVU0hPUlQgcF9wb3J0KTsKK2ludCAgIERpYWdYYm93KFVTSE9SVCBwb3J0KTsKK2ludCAgIERpYWdCdXNNYXN0ZXIoVVNIT1JUIHBvcnQpOwordm9pZCAgRGlhZ0VFUFJPTShVU0hPUlQgcF9wb3J0KTsKKyNlbHNlCit2b2lkICBYYm93SW5pdChVTE9ORyBwb3J0LCBVQ0hBUiBzY2FtRmxnKTsKK3ZvaWQgIEJ1c01hc3RlckluaXQoVUxPTkcgcF9wb3J0KTsKK2ludCAgIERpYWdYYm93KFVMT05HIHBvcnQpOworaW50ICAgRGlhZ0J1c01hc3RlcihVTE9ORyBwb3J0KTsKK3ZvaWQgIERpYWdFRVBST00oVUxPTkcgcF9wb3J0KTsKKyNlbmRpZgorCisKKworCisjaWYgZGVmaW5lZChET1MpCit2b2lkICBidXNNc3RyQWJvcnQoVVNIT1JUIHBvcnQpOworVUNIQVIgYnVzTXN0clRpbWVPdXQoVVNIT1JUIHBvcnQpOwordm9pZCAgZGF0YVhmZXJQcm9jZXNzb3IoVVNIT1JUIHBvcnQsIFBTQ0NCY2FyZCBwQ3VyckNhcmQpOwordm9pZCAgYnVzTXN0clNHRGF0YVhmZXJTdGFydChVU0hPUlQgcG9ydCwgUFNDQ0IgcEN1cnJTQ0NCKTsKK3ZvaWQgIGJ1c01zdHJEYXRhWGZlclN0YXJ0KFVTSE9SVCBwb3J0LCBQU0NDQiBwQ3VyclNDQ0IpOwordm9pZCAgaG9zdERhdGFYZmVyQWJvcnQoVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCwgUFNDQ0IgcEN1cnJTQ0NCKTsKKyNlbHNlCit2b2lkICBidXNNc3RyQWJvcnQoVUxPTkcgcG9ydCk7CitVQ0hBUiBidXNNc3RyVGltZU91dChVTE9ORyBwb3J0KTsKK3ZvaWQgIGRhdGFYZmVyUHJvY2Vzc29yKFVMT05HIHBvcnQsIFBTQ0NCY2FyZCBwQ3VyckNhcmQpOwordm9pZCAgYnVzTXN0clNHRGF0YVhmZXJTdGFydChVTE9ORyBwb3J0LCBQU0NDQiBwQ3VyclNDQ0IpOwordm9pZCAgYnVzTXN0ckRhdGFYZmVyU3RhcnQoVUxPTkcgcG9ydCwgUFNDQ0IgcEN1cnJTQ0NCKTsKK3ZvaWQgIGhvc3REYXRhWGZlckFib3J0KFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCwgUFNDQ0IgcEN1cnJTQ0NCKTsKKyNlbmRpZgordm9pZCAgaG9zdERhdGFYZmVyUmVzdGFydChQU0NDQiBjdXJyU0NDQik7CisKKworI2lmIGRlZmluZWQgKERPUykKK1VDSEFSIFNjY2JNZ3JfYmFkX2lzcihVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2NhcmQsIFBTQ0NCY2FyZCBwQ3VyckNhcmQsIFVTSE9SVCBwX2ludCk7CisjZWxzZQorVUNIQVIgU2NjYk1ncl9iYWRfaXNyKFVMT05HIHBfcG9ydCwgVUNIQVIgcF9jYXJkLCBQU0NDQmNhcmQgcEN1cnJDYXJkLCBVU0hPUlQgcF9pbnQpOworCisjZW5kaWYKKwordm9pZCAgU2NjYk1nclRhYmxlSW5pdEFsbCh2b2lkKTsKK3ZvaWQgIFNjY2JNZ3JUYWJsZUluaXRDYXJkKFBTQ0NCY2FyZCBwQ3VyckNhcmQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBTY2NiTWdyVGFibGVJbml0VGFyZ2V0KFVDSEFSIHBfY2FyZCwgVUNIQVIgdGFyZ2V0KTsKKworCisKK3ZvaWQgIHNjaW5pKFVDSEFSIHBfY2FyZCwgVUNIQVIgcF9vdXJfaWQsIFVDSEFSIHBfcG93ZXJfdXApOworCisjaWYgZGVmaW5lZChET1MpCitpbnQgICBzY2FyYihVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX3NlbF90eXBlKTsKK3ZvaWQgIHNjYnVzZihVU0hPUlQgcF9wb3J0KTsKK3ZvaWQgIHNjc2VsKFVTSE9SVCBwX3BvcnQpOwordm9pZCAgc2Nhc2lkKFVDSEFSIHBfY2FyZCwgVVNIT1JUIHBfcG9ydCk7CitVQ0hBUiBzY3hmZXJjKFVTSE9SVCBwX3BvcnQsIFVDSEFSIHBfZGF0YSk7CitVQ0hBUiBzY3NlbmRpKFVTSE9SVCBwX3BvcnQsIFVDSEFSIHBfaWRfc3RyaW5nW10pOworVUNIQVIgc2Npc28oVVNIT1JUIHBfcG9ydCwgVUNIQVIgcF9pZF9zdHJpbmdbXSk7Cit2b2lkICBzY3dpcm9kKFVTSE9SVCBwX3BvcnQsIFVDSEFSIHBfZGF0YV9iaXQpOwordm9pZCAgc2N3aXJvcyhVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2RhdGFfYml0KTsKK1VDSEFSIHNjdmFscShVQ0hBUiBwX3F1aW50ZXQpOworVUNIQVIgc2NzZWxsKFVTSE9SVCBwX3BvcnQsIFVDSEFSIHRhcmdfaWQpOwordm9pZCAgc2N3dHNlbChVU0hPUlQgcF9wb3J0KTsKK3ZvaWQgIGluaXNjaShVQ0hBUiBwX2NhcmQsIFVTSE9SVCBwX3BvcnQsIFVDSEFSIHBfb3VyX2lkKTsKK3ZvaWQgIHNjc2F2ZGkoVUNIQVIgcF9jYXJkLCBVU0hPUlQgcF9wb3J0KTsKKyNlbHNlCitpbnQgICBzY2FyYihVTE9ORyBwX3BvcnQsIFVDSEFSIHBfc2VsX3R5cGUpOwordm9pZCAgc2NidXNmKFVMT05HIHBfcG9ydCk7Cit2b2lkICBzY3NlbChVTE9ORyBwX3BvcnQpOwordm9pZCAgc2Nhc2lkKFVDSEFSIHBfY2FyZCwgVUxPTkcgcF9wb3J0KTsKK1VDSEFSIHNjeGZlcmMoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2RhdGEpOworVUNIQVIgc2NzZW5kaShVTE9ORyBwX3BvcnQsIFVDSEFSIHBfaWRfc3RyaW5nW10pOworVUNIQVIgc2Npc28oVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2lkX3N0cmluZ1tdKTsKK3ZvaWQgIHNjd2lyb2QoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2RhdGFfYml0KTsKK3ZvaWQgIHNjd2lyb3MoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2RhdGFfYml0KTsKK1VDSEFSIHNjdmFscShVQ0hBUiBwX3F1aW50ZXQpOworVUNIQVIgc2NzZWxsKFVMT05HIHBfcG9ydCwgVUNIQVIgdGFyZ19pZCk7Cit2b2lkICBzY3d0c2VsKFVMT05HIHBfcG9ydCk7Cit2b2lkICBpbmlzY2koVUNIQVIgcF9jYXJkLCBVTE9ORyBwX3BvcnQsIFVDSEFSIHBfb3VyX2lkKTsKK3ZvaWQgIHNjc2F2ZGkoVUNIQVIgcF9jYXJkLCBVTE9ORyBwX3BvcnQpOworI2VuZGlmCitVQ0hBUiBzY21hY2hpZChVQ0hBUiBwX2NhcmQsIFVDSEFSIHBfaWRfc3RyaW5nW10pOworCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgIGF1dG9DbWRDbXBsdChVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2NhcmQpOwordm9pZCAgYXV0b0xvYWREZWZhdWx0TWFwKFVTSE9SVCBwX3BvcnQpOworI2Vsc2UKK3ZvaWQgIGF1dG9DbWRDbXBsdChVTE9ORyBwX3BvcnQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBhdXRvTG9hZERlZmF1bHRNYXAoVUxPTkcgcF9wb3J0KTsKKyNlbmRpZgorCisKKworI2lmIChGV19UWVBFPT1fU0NDQl9NR1JfKQorCXZvaWQgIE9TX3N0YXJ0X3RpbWVyKHVuc2lnbmVkIGxvbmcgaW9wb3J0LCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpOworCXZvaWQgIE9TX3N0b3BfdGltZXIodW5zaWduZWQgbG9uZyBpb3BvcnQsIHVuc2lnbmVkIGxvbmcgdGltZW91dCk7CisJdm9pZCAgT1NfZGlzYWJsZV9pbnQodW5zaWduZWQgY2hhciBpbnR2ZWMpOworCXZvaWQgIE9TX2VuYWJsZV9pbnQodW5zaWduZWQgY2hhciBpbnR2ZWMpOworCXZvaWQgIE9TX2RlbGF5KHVuc2lnbmVkIGxvbmcgY291bnQpOworCWludCAgIE9TX1ZpcnRUb1BoeXModTMyYml0cyBDYXJkSGFuZGxlLCB1MzJiaXRzICpwaHlzYWRkciwgdTMyYml0cyAqdmlydGFkZHIpOworCSNpZiAhKGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoU09MQVJJU19SRUFMX01PREUpKSAKKwl2b2lkICBPU19Mb2NrKFBTQ0NCTUdSX0lORk8gcENhcmRJbmZvKTsKKwl2b2lkICBPU19VbkxvY2soUFNDQ0JNR1JfSU5GTyBwQ2FyZEluZm8pOworI2VuZGlmIC8vIGlmIEZXX1RZUEUgPT0gLi4uCisKKyNlbmRpZgorCitleHRlcm4gU0NDQkNBUkQgQkxfQ2FyZFtNQVhfQ0FSRFNdOworZXh0ZXJuIFNDQ0JNR1JfVEFSX0lORk8gc2NjYk1nclRibFtNQVhfQ0FSRFNdW01BWF9TQ1NJX1RBUl07CisKKworI2lmIGRlZmluZWQoT1MyKQorICAgZXh0ZXJuIHZvaWQgKGZhciAqc19QaGFzZVRibFs4XSkgKFVMT05HLCBVQ0hBUik7CisjZWxzZQorICAgI2lmIGRlZmluZWQoRE9TKQorICAgICAgZXh0ZXJuIHZvaWQgKCpzX1BoYXNlVGJsWzhdKSAoVVNIT1JULCBVQ0hBUik7CisgICAjZWxzZQorICAgICAgZXh0ZXJuIHZvaWQgKCpzX1BoYXNlVGJsWzhdKSAoVUxPTkcsIFVDSEFSKTsKKyAgICNlbmRpZgorI2VuZGlmCisKK2V4dGVybiBTQ0NCU0NBTV9JTkZPIHNjYW1JbmZvW01BWF9TQ1NJX1RBUl07CitleHRlcm4gTlZSQU1JTkZPIG52UmFtSW5mb1tNQVhfTUJfQ0FSRFNdOworI2lmIGRlZmluZWQoRE9TKSB8fCBkZWZpbmVkKE9TMikKK2V4dGVybiBVQ0hBUiB0ZW1wX2lkX3N0cmluZ1tJRF9TVFJJTkdfTEVOR1RIXTsKKyNlbmRpZgorZXh0ZXJuIFVDSEFSIHNjYW1IQVN0cmluZ1tdOworCisKK2V4dGVybiBVQ0hBUiBtYkNhcmRzOworI2lmIGRlZmluZWQoQlVHQlVHKQorZXh0ZXJuIFVDSEFSIGRlYnVnX2ludFtNQVhfQ0FSRFNdW2RlYnVnX3NpemVdOworZXh0ZXJuIFVDSEFSIGRlYnVnX2luZGV4W01BWF9DQVJEU107Cit2b2lkIERlYnVnX0xvYWQoVUNIQVIgcF9jYXJkLCBVQ0hBUiBwX2J1Z19kYXRhKTsKKyNlbmRpZgorCisjaWYgKEZXX1RZUEU9PV9TQ0NCX01HUl8pCisjaWYgZGVmaW5lZChET1MpCisgICBleHRlcm4gVUNIQVIgZmlyc3RfdGltZTsKKyNlbmRpZgorI2VuZGlmIC8qIChGV19UWVBFPT1fU0NDQl9NR1JfKSAqLworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKyNpZiBkZWZpbmVkKERPUykKKyAgIGV4dGVybiB1MDhiaXRzIGZpcnN0X3RpbWU7CisjZW5kaWYKKyNlbmRpZiAvKiAoRldfVFlQRT09X1VDQl9NR1JfKSAqLworCisjaWYgZGVmaW5lZChCVUdCVUcpCit2b2lkIERlYnVnX0xvYWQoVUNIQVIgcF9jYXJkLCBVQ0hBUiBwX2J1Z19kYXRhKTsKKyNlbmRpZgorCitleHRlcm4gdW5zaWduZWQgaW50IFNjY2JHbG9iYWxGbGFnczsKKworCisjaWRlbnQgIiRJZDogc2NjYi5jIDEuMTggMTk5Ny8wNi8xMCAxNjo0NzowNCBtb2hhbiBFeHAgJCIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCisgKiAgIENvcHlyaWdodCAxOTk1LTE5OTYgYnkgTXlsZXggQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGJvdGggdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFuZCBhIEJTRC1zdHlsZSBjb3B5cmlnaHQ7IHNlZSBMSUNFTlNFLkZsYXNoUG9pbnQgZm9yIGRldGFpbHMuCisgKgorICogICAkV29ya2ZpbGU6ICAgc2NjYi5jICAkCisgKgorICogICBEZXNjcmlwdGlvbjogIEZ1bmN0aW9ucyByZWxhdGluZyB0byBoYW5kbGluZyBvZiB0aGUgU0NDQiBpbnRlcmZhY2UKKyAqICAgICAgICAgICAgICAgICBiZXR3ZWVuIHRoZSBkZXZpY2UgZHJpdmVyIGFuZCB0aGUgSEFSUE9PTi4KKyAqCisgKiAgICREYXRlOiAxOTk3LzA2LzEwIDE2OjQ3OjA0ICQKKyAqCisgKiAgICRSZXZpc2lvbjogMS4xOCAkCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyojaW5jbHVkZSA8Z2xvYmFscy5oPiovCisKKyNpZiAoRldfVFlQRT09X1VDQl9NR1JfKQorCS8qI2luY2x1ZGUgPGJ1ZGkuaD4qLworCS8qI2luY2x1ZGUgPGJ1ZGlvY3RsLmg+Ki8KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzY2NibWdyLmg+Ki8KKy8qI2luY2x1ZGUgPGJseDMwLmg+Ki8KKy8qI2luY2x1ZGUgPHRhcmdldC5oPiovCisvKiNpbmNsdWRlIDxlZXByb20uaD4qLworLyojaW5jbHVkZSA8c2NzaTIuaD4qLworLyojaW5jbHVkZSA8aGFycG9vbi5oPiovCisKKworCisjaWYgKEZXX1RZUEU9PV9TQ0NCX01HUl8pCisjZGVmaW5lIG1PU19Mb2NrKGNhcmQpICAgIE9TX0xvY2soKFBTQ0NCTUdSX0lORk8pKCgoUFNDQ0JjYXJkKWNhcmQpLT5jYXJkSW5mbykpCisjZGVmaW5lIG1PU19VbkxvY2soY2FyZCkgIE9TX1VuTG9jaygoUFNDQ0JNR1JfSU5GTykoKChQU0NDQmNhcmQpY2FyZCktPmNhcmRJbmZvKSkKKyNlbHNlIC8qIEZXX1RZUEU9PV9VQ0JfTUdSXyAqLworI2RlZmluZSBtT1NfTG9jayhjYXJkKSAgICBPU19Mb2NrKCh1MzJiaXRzKSgoKFBTQ0NCY2FyZCljYXJkKS0+aW9Qb3J0KSkKKyNkZWZpbmUgbU9TX1VuTG9jayhjYXJkKSAgT1NfVW5Mb2NrKCh1MzJiaXRzKSgoKFBTQ0NCY2FyZCljYXJkKS0+aW9Qb3J0KSkKKyNlbmRpZgorCisKKy8qCitleHRlcm4gU0NDQk1HUl9UQVJfSU5GTyBzY2NiTWdyVGJsW01BWF9DQVJEU11bTUFYX1NDU0lfVEFSXTsKK2V4dGVybiBTQ0NCQ0FSRCBCTF9DYXJkW01BWF9DQVJEU107CisKK2V4dGVybiBOVlJBTUlORk8gbnZSYW1JbmZvW01BWF9NQl9DQVJEU107CitleHRlcm4gVUNIQVIgbWJDYXJkczsKKworI2lmIGRlZmluZWQgKE9TMikKKyAgIGV4dGVybiB2b2lkIChmYXIgKnNfUGhhc2VUYmxbOF0pIChVTE9ORywgVUNIQVIpOworI2Vsc2UKKyAgICNpZiBkZWZpbmVkKERPUykKKyAgICAgIGV4dGVybiB2b2lkICgqc19QaGFzZVRibFs4XSkgKFVTSE9SVCwgVUNIQVIpOworICAgI2Vsc2UKKyAgICAgIGV4dGVybiB2b2lkICgqc19QaGFzZVRibFs4XSkgKFVMT05HLCBVQ0hBUik7CisgICAjZW5kaWYKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKEJVR0JVRykKK2V4dGVybiBVQ0hBUiBkZWJ1Z19pbnRbTUFYX0NBUkRTXVtkZWJ1Z19zaXplXTsKK2V4dGVybiBVQ0hBUiBkZWJ1Z19pbmRleFtNQVhfQ0FSRFNdOwordm9pZCBEZWJ1Z19Mb2FkKFVDSEFSIHBfY2FyZCwgVUNIQVIgcF9idWdfZGF0YSk7CisjZW5kaWYKKyovCisKKyNpZiAoRldfVFlQRT09X1NDQ0JfTUdSXykKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogU2NjYk1ncl9zZW5zZV9hZGFwdGVyCisgKgorICogRGVzY3JpcHRpb246IFNldHVwIGFuZC9vciBTZWFyY2ggZm9yIGNhcmRzIGFuZCByZXR1cm4gaW5mbyB0byBjYWxsZXIuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgU2NjYk1ncl9zZW5zZV9hZGFwdGVyKFBTQ0NCTUdSX0lORk8gcENhcmRJbmZvKQoreworI2lmIGRlZmluZWQoRE9TKQorI2Vsc2UKKyAgIHN0YXRpYyBVQ0hBUiBmaXJzdF90aW1lID0gMTsKKyNlbmRpZgorCisgICBVQ0hBUiBpLGosaWQsU2NhbUZsZzsKKyAgIFVTSE9SVCB0ZW1wLHRlbXAyLHRlbXAzLHRlbXA0LHRlbXA1LHRlbXA2OworI2lmIGRlZmluZWQoRE9TKQorICAgVVNIT1JUIGlvcG9ydDsKKyNlbHNlCisgICBVTE9ORyBpb3BvcnQ7CisjZW5kaWYKKwlQTlZSYW1JbmZvIHBDdXJyTnZSYW07CisKKyNpZiBkZWZpbmVkKERPUykKKyAgIGlvcG9ydCA9IChVU0hPUlQpcENhcmRJbmZvLT5zaV9iYXNlYWRkcjsKKyNlbHNlCisgICBpb3BvcnQgPSBwQ2FyZEluZm8tPnNpX2Jhc2VhZGRyOworI2VuZGlmCisKKworICAgaWYgKFJEX0hBUlBPT04oaW9wb3J0K2hwX3ZlbmRvcl9pZF8wKSAhPSBPUklPTl9WRU5EXzApCisgICAgICByZXR1cm4oKGludClGQUlMVVJFKTsKKworICAgaWYgKChSRF9IQVJQT09OKGlvcG9ydCtocF92ZW5kb3JfaWRfMSkgIT0gT1JJT05fVkVORF8xKSkKKyAgICAgIHJldHVybigoaW50KUZBSUxVUkUpOworCisgICBpZiAoKFJEX0hBUlBPT04oaW9wb3J0K2hwX2RldmljZV9pZF8wKSAhPSBPUklPTl9ERVZfMCkpCisgICAgICByZXR1cm4oKGludClGQUlMVVJFKTsKKworICAgaWYgKChSRF9IQVJQT09OKGlvcG9ydCtocF9kZXZpY2VfaWRfMSkgIT0gT1JJT05fREVWXzEpKQorICAgICAgcmV0dXJuKChpbnQpRkFJTFVSRSk7CisKKworICAgaWYgKFJEX0hBUlBPT04oaW9wb3J0K2hwX3Jldl9udW0pICE9IDB4MGYpeworCisvKiBGb3IgbmV3IEhhcnBvb24gdGhlbiBjaGVjayBmb3Igc3ViX2RldmljZSBJRCBMU0IKKyAgIHRoZSBiaXRzKDAtMykgbXVzdCBiZSBhbGwgWkVSTyBmb3IgY29tcGF0aWJsZSB3aXRoCisgICBjdXJyZW50IHZlcnNpb24gb2YgU0NDQk1nciwgZWxzZSBza2lwIHRoaXMgSGFycG9vbgorCWRldmljZS4gKi8KKworCSAgIGlmIChSRF9IQVJQT09OKGlvcG9ydCtocF9zdWJfZGV2aWNlX2lkXzApICYgMHgwZikKKwkgICAgICByZXR1cm4oKGludClGQUlMVVJFKTsKKwl9CisKKyAgIGlmIChmaXJzdF90aW1lKQorICAgICAgeworICAgICAgU2NjYk1nclRhYmxlSW5pdEFsbCgpOworICAgICAgZmlyc3RfdGltZSA9IDA7CisJCW1iQ2FyZHMgPSAwOworICAgICAgfQorCisJaWYoUmRTdGFjayhpb3BvcnQsIDApICE9IDB4MDApIHsKKwkJaWYoQ2hrSWZDaGlwSW5pdGlhbGl6ZWQoaW9wb3J0KSA9PSBGQUxTRSkKKwkJeworCQkJcEN1cnJOdlJhbSA9IE5VTEw7CisJCSAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX3NlbWFwaG9yZSwgMHgwMCk7CisJCQlYYm93SW5pdChpb3BvcnQsIDApOyAgICAgICAgICAgICAvKk11c3QgSW5pdCB0aGUgU0NTSSBiZWZvcmUgYXR0ZW1wdGluZyAqLworCQkJRGlhZ0VFUFJPTShpb3BvcnQpOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYobWJDYXJkcyA8IE1BWF9NQl9DQVJEUykgeworCQkJCXBDdXJyTnZSYW0gPSAmbnZSYW1JbmZvW21iQ2FyZHNdOworCQkJCW1iQ2FyZHMrKzsKKwkJCQlwQ3Vyck52UmFtLT5uaUJhc2VBZGRyID0gaW9wb3J0OworCQkJCVJOVlJhbURhdGEocEN1cnJOdlJhbSk7CisJCQl9ZWxzZQorCQkJCXJldHVybigoaW50KSBGQUlMVVJFKTsKKwkJfQorCX1lbHNlCisJCXBDdXJyTnZSYW0gPSBOVUxMOworI2lmIGRlZmluZWQgKE5PX0JJT1NfT1BUSU9OKQorCXBDdXJyTnZSYW0gPSBOVUxMOworICAgWGJvd0luaXQoaW9wb3J0LCAwKTsgICAgICAgICAgICAgICAgLypNdXN0IEluaXQgdGhlIFNDU0kgYmVmb3JlIGF0dGVtcHRpbmcgKi8KKyAgIERpYWdFRVBST00oaW9wb3J0KTsKKyNlbmRpZiAgLyogTm8gQklPUyBPcHRpb24gKi8KKworICAgV1JfSEFSUE9PTihpb3BvcnQraHBfY2xrY3RybF8wLCBDTEtDVFJMX0RFRkFVTFQpOworICAgV1JfSEFSUE9PTihpb3BvcnQraHBfc3lzX2N0cmwsIDB4MDApOworCisJaWYocEN1cnJOdlJhbSkKKwkJcENhcmRJbmZvLT5zaV9pZCA9IHBDdXJyTnZSYW0tPm5pQWRhcElkOworCWVsc2UKKwkgICBwQ2FyZEluZm8tPnNpX2lkID0gKFVDSEFSKSh1dGlsRUVSZWFkKGlvcG9ydCwgKEFEQVBURVJfU0NTSV9JRC8yKSkgJgorICAgCSAgIChVQ0hBUikweDBGRik7CisKKyAgIHBDYXJkSW5mby0+c2lfbHVuID0gMHgwMDsKKyAgIHBDYXJkSW5mby0+c2lfZndfcmV2aXNpb24gPSBPUklPTl9GV19SRVY7CisgICB0ZW1wMiA9IDB4MDAwMDsKKyAgIHRlbXAzID0gMHgwMDAwOworICAgdGVtcDQgPSAweDAwMDA7CisgICB0ZW1wNSA9IDB4MDAwMDsKKyAgIHRlbXA2ID0gMHgwMDAwOworCisgICBmb3IgKGlkID0gMDsgaWQgPCAoMTYvMik7IGlkKyspIHsKKworCQlpZihwQ3Vyck52UmFtKXsKKwkJCXRlbXAgPSAoVVNIT1JUKSBwQ3Vyck52UmFtLT5uaVN5bmNUYmxbaWRdOworCQkJdGVtcCA9ICgodGVtcCAmIDB4MDMpICsgKCh0ZW1wIDw8IDQpICYgMHhjMCkpICsKKwkJCQkJICgoKHRlbXAgPDwgNCkgJiAweDAzMDApICsgKCh0ZW1wIDw8IDgpICYgMHhjMDAwKSk7CisJCX1lbHNlCisJICAgICAgdGVtcCA9IHV0aWxFRVJlYWQoaW9wb3J0LCAoVVNIT1JUKSgoU1lOQ19SQVRFX1RCTC8yKStpZCkpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgdGVtcCA+Pj04LGkrKykgeworCisgICAgICAgICB0ZW1wMiA+Pj0gMTsKKyAgICAgICAgIHRlbXAzID4+PSAxOworICAgICAgICAgdGVtcDQgPj49IDE7CisgICAgICAgICB0ZW1wNSA+Pj0gMTsKKyAgICAgICAgIHRlbXA2ID4+PSAxOworCSBzd2l0Y2ggKHRlbXAgJiAweDMpCisJICAgeworCSAgIGNhc2UgQVVUT19SQVRFXzIwOgkvKiBTeW5jaHJvbm91cywgMjAgbWVnYS10cmFuc2ZlcnMvc2Vjb25kICovCisJICAgICB0ZW1wNiB8PSAweDgwMDA7CS8qIEZhbGwgdGhyb3VnaCAqLworCSAgIGNhc2UgQVVUT19SQVRFXzEwOgkvKiBTeW5jaHJvbm91cywgMTAgbWVnYS10cmFuc2ZlcnMvc2Vjb25kICovCisJICAgICB0ZW1wNSB8PSAweDgwMDA7CS8qIEZhbGwgdGhyb3VnaCAqLworCSAgIGNhc2UgQVVUT19SQVRFXzA1OgkvKiBTeW5jaHJvbm91cywgNSBtZWdhLXRyYW5zZmVycy9zZWNvbmQgKi8KKwkgICAgIHRlbXAyIHw9IDB4ODAwMDsJLyogRmFsbCB0aHJvdWdoICovCisJICAgY2FzZSBBVVRPX1JBVEVfMDA6CS8qIEFzeW5jaHJvbm91cyAqLworCSAgICAgYnJlYWs7CisJICAgfQorCisgICAgICAgICBpZiAodGVtcCAmIERJU0NfRU5BQkxFX0JJVCkKKwkgICB0ZW1wMyB8PSAweDgwMDA7CisKKyAgICAgICAgIGlmICh0ZW1wICYgV0lERV9ORUdPX0JJVCkKKwkgICB0ZW1wNCB8PSAweDgwMDA7CisKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgcENhcmRJbmZvLT5zaV9wZXJfdGFyZ19pbml0X3N5bmMgPSB0ZW1wMjsKKyAgIHBDYXJkSW5mby0+c2lfcGVyX3Rhcmdfbm9fZGlzYyA9IHRlbXAzOworICAgcENhcmRJbmZvLT5zaV9wZXJfdGFyZ193aWRlX25lZ28gPSB0ZW1wNDsKKyAgIHBDYXJkSW5mby0+c2lfcGVyX3RhcmdfZmFzdF9uZWdvID0gdGVtcDU7CisgICBwQ2FyZEluZm8tPnNpX3Blcl90YXJnX3VsdHJhX25lZ28gPSB0ZW1wNjsKKworCWlmKHBDdXJyTnZSYW0pCisJCWkgPSBwQ3Vyck52UmFtLT5uaVN5c0NvbmY7CisJZWxzZQorCSAgIGkgPSAoVUNIQVIpKHV0aWxFRVJlYWQoaW9wb3J0LCAoU1lTVEVNX0NPTkZJRy8yKSkpOworCisJaWYocEN1cnJOdlJhbSkKKwkJU2NhbUZsZyA9IHBDdXJyTnZSYW0tPm5pU2NhbUNvbmY7CisJZWxzZQorCSAgIFNjYW1GbGcgPSAoVUNIQVIpIHV0aWxFRVJlYWQoaW9wb3J0LCBTQ0FNX0NPTkZJRy8yKTsKKworICAgcENhcmRJbmZvLT5zaV9mbGFncyA9IDB4MDAwMDsKKworICAgaWYgKGkgJiAweDAxKQorICAgICAgcENhcmRJbmZvLT5zaV9mbGFncyB8PSBTQ1NJX1BBUklUWV9FTkE7CisKKyAgIGlmICghKGkgJiAweDAyKSkKKyAgICAgIHBDYXJkSW5mby0+c2lfZmxhZ3MgfD0gU09GVF9SRVNFVDsKKworICAgaWYgKGkgJiAweDEwKQorICAgICAgcENhcmRJbmZvLT5zaV9mbGFncyB8PSBFWFRFTkRFRF9UUkFOU0xBVElPTjsKKworICAgaWYgKFNjYW1GbGcgJiBTQ0FNX0VOQUJMRUQpCisgICAgIHBDYXJkSW5mby0+c2lfZmxhZ3MgfD0gRkxBR19TQ0FNX0VOQUJMRUQ7CisKKyAgIGlmIChTY2FtRmxnICYgU0NBTV9MRVZFTDIpCisgICAgIHBDYXJkSW5mby0+c2lfZmxhZ3MgfD0gRkxBR19TQ0FNX0xFVkVMMjsKKworICAgaiA9IChSRF9IQVJQT09OKGlvcG9ydCtocF9ibV9jdHJsKSAmIH5TQ1NJX1RFUk1fRU5BX0wpOworICAgaWYgKGkgJiAweDA0KSB7CisgICAgICBqIHw9IFNDU0lfVEVSTV9FTkFfTDsKKyAgICAgIH0KKyAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX2JtX2N0cmwsIGogKTsKKworICAgaiA9IChSRF9IQVJQT09OKGlvcG9ydCtocF9lZV9jdHJsKSAmIH5TQ1NJX1RFUk1fRU5BX0gpOworICAgaWYgKGkgJiAweDA4KSB7CisgICAgICBqIHw9IFNDU0lfVEVSTV9FTkFfSDsKKyAgICAgIH0KKyAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX2VlX2N0cmwsIGogKTsKKworICAgaWYgKCEoUkRfSEFSUE9PTihpb3BvcnQraHBfcGFnZV9jdHJsKSAmIE5BUlJPV19TQ1NJX0NBUkQpKQorCisgICAgICBwQ2FyZEluZm8tPnNpX2ZsYWdzIHw9IFNVUFBPUlRfMTZUQVJfMzJMVU47CisKKyAgIHBDYXJkSW5mby0+c2lfY2FyZF9mYW1pbHkgPSBIQVJQT09OX0ZBTUlMWTsKKyAgIHBDYXJkSW5mby0+c2lfYnVzdHlwZSA9IEJVU1RZUEVfUENJOworCisJaWYocEN1cnJOdlJhbSl7CisgICAJcENhcmRJbmZvLT5zaV9jYXJkX21vZGVsWzBdID0gJzknOworCQlzd2l0Y2gocEN1cnJOdlJhbS0+bmlNb2RlbCAmIDB4MGYpeworCQkJY2FzZSBNT0RFTF9MVDoKKwkJICAgCXBDYXJkSW5mby0+c2lfY2FyZF9tb2RlbFsxXSA9ICczJzsKKwkJICAgCXBDYXJkSW5mby0+c2lfY2FyZF9tb2RlbFsyXSA9ICcwJzsKKwkJCQlicmVhazsKKwkJCWNhc2UgTU9ERUxfTFc6CisJCSAgIAlwQ2FyZEluZm8tPnNpX2NhcmRfbW9kZWxbMV0gPSAnNSc7CisJCSAgIAlwQ2FyZEluZm8tPnNpX2NhcmRfbW9kZWxbMl0gPSAnMCc7CisJCQkJYnJlYWs7CisJCQljYXNlIE1PREVMX0RMOgorCQkgICAJcENhcmRJbmZvLT5zaV9jYXJkX21vZGVsWzFdID0gJzMnOworCQkgICAJcENhcmRJbmZvLT5zaV9jYXJkX21vZGVsWzJdID0gJzInOworCQkJCWJyZWFrOworCQkJY2FzZSBNT0RFTF9EVzoKKwkJICAgCXBDYXJkSW5mby0+c2lfY2FyZF9tb2RlbFsxXSA9ICc1JzsKKwkJICAgCXBDYXJkSW5mby0+c2lfY2FyZF9tb2RlbFsyXSA9ICcyJzsKKwkJCQlicmVhazsKKwkJfQorCX1lbHNleworCSAgIHRlbXAgPSB1dGlsRUVSZWFkKGlvcG9ydCwgKE1PREVMX05VTUJfMC8yKSk7CisgICAJcENhcmRJbmZvLT5zaV9jYXJkX21vZGVsWzBdID0gKFVDSEFSKSh0ZW1wID4+IDgpOworCSAgIHRlbXAgPSB1dGlsRUVSZWFkKGlvcG9ydCwgKE1PREVMX05VTUJfMi8yKSk7CisKKyAgIAlwQ2FyZEluZm8tPnNpX2NhcmRfbW9kZWxbMV0gPSAoVUNIQVIpKHRlbXAgJiAweDAwRkYpOworCSAgIHBDYXJkSW5mby0+c2lfY2FyZF9tb2RlbFsyXSA9IChVQ0hBUikodGVtcCA+PiA4KTsKKwl9CisKKyAgIGlmIChwQ2FyZEluZm8tPnNpX2NhcmRfbW9kZWxbMV0gPT0gJzMnKQorICAgICB7CisgICAgICAgaWYgKFJEX0hBUlBPT04oaW9wb3J0K2hwX2VlX2N0cmwpICYgQklUKDcpKQorCSBwQ2FyZEluZm8tPnNpX2ZsYWdzIHw9IExPV19CWVRFX1RFUk07CisgICAgIH0KKyAgIGVsc2UgaWYgKHBDYXJkSW5mby0+c2lfY2FyZF9tb2RlbFsyXSA9PSAnMCcpCisgICAgIHsKKyAgICAgICB0ZW1wID0gUkRfSEFSUE9PTihpb3BvcnQraHBfeGZlcl9wYWQpOworICAgICAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX3hmZXJfcGFkLCAodGVtcCAmIH5CSVQoNCkpKTsKKyAgICAgICBpZiAoUkRfSEFSUE9PTihpb3BvcnQraHBfZWVfY3RybCkgJiBCSVQoNykpCisJIHBDYXJkSW5mby0+c2lfZmxhZ3MgfD0gTE9XX0JZVEVfVEVSTTsKKyAgICAgICBXUl9IQVJQT09OKGlvcG9ydCtocF94ZmVyX3BhZCwgKHRlbXAgfCBCSVQoNCkpKTsKKyAgICAgICBpZiAoUkRfSEFSUE9PTihpb3BvcnQraHBfZWVfY3RybCkgJiBCSVQoNykpCisJIHBDYXJkSW5mby0+c2lfZmxhZ3MgfD0gSElHSF9CWVRFX1RFUk07CisgICAgICAgV1JfSEFSUE9PTihpb3BvcnQraHBfeGZlcl9wYWQsIHRlbXApOworICAgICB9CisgICBlbHNlCisgICAgIHsKKyAgICAgICB0ZW1wID0gUkRfSEFSUE9PTihpb3BvcnQraHBfZWVfY3RybCk7CisgICAgICAgdGVtcDIgPSBSRF9IQVJQT09OKGlvcG9ydCtocF94ZmVyX3BhZCk7CisgICAgICAgV1JfSEFSUE9PTihpb3BvcnQraHBfZWVfY3RybCwgKHRlbXAgfCBTRUVfQ1MpKTsKKyAgICAgICBXUl9IQVJQT09OKGlvcG9ydCtocF94ZmVyX3BhZCwgKHRlbXAyIHwgQklUKDQpKSk7CisgICAgICAgdGVtcDMgPSAwOworICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJIHsKKwkgICB0ZW1wMyA8PD0gMTsKKwkgICBpZiAoIShSRF9IQVJQT09OKGlvcG9ydCtocF9lZV9jdHJsKSAmIEJJVCg3KSkpCisJICAgICB0ZW1wMyB8PSAxOworCSAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX3hmZXJfcGFkLCAodGVtcDIgJiB+QklUKDQpKSk7CisJICAgV1JfSEFSUE9PTihpb3BvcnQraHBfeGZlcl9wYWQsICh0ZW1wMiB8IEJJVCg0KSkpOworCSB9CisgICAgICAgV1JfSEFSUE9PTihpb3BvcnQraHBfZWVfY3RybCwgdGVtcCk7CisgICAgICAgV1JfSEFSUE9PTihpb3BvcnQraHBfeGZlcl9wYWQsIHRlbXAyKTsKKyAgICAgICBpZiAoISh0ZW1wMyAmIEJJVCg3KSkpCisJIHBDYXJkSW5mby0+c2lfZmxhZ3MgfD0gTE9XX0JZVEVfVEVSTTsKKyAgICAgICBpZiAoISh0ZW1wMyAmIEJJVCg2KSkpCisJIHBDYXJkSW5mby0+c2lfZmxhZ3MgfD0gSElHSF9CWVRFX1RFUk07CisgICAgIH0KKworCisgICBBUkFNX0FDQ0VTUyhpb3BvcnQpOworCisgICBmb3IgKCBpID0gMDsgaSA8IDQ7IGkrKyApIHsKKworICAgICAgcENhcmRJbmZvLT5zaV9YbGF0SW5mb1tpXSA9CisgICAgICAgICBSRF9IQVJQT09OKGlvcG9ydCtocF9hcmFtQmFzZStCSU9TX0RBVEFfT0ZGU0VUK2kpOworICAgICAgfQorCisJLyogcmV0dXJuIHdpdGggLTEgaWYgbm8gc29ydCwgZWxzZSByZXR1cm4gd2l0aAorCSAgIGxvZ2ljYWwgY2FyZCBudW1iZXIgc29ydGVkIGJ5IEJJT1MgKHplcm8tYmFzZWQpICovCisKKwlwQ2FyZEluZm8tPnNpX3JlbGF0aXZlX2NhcmRudW0gPQorCShVQ0hBUikoUkRfSEFSUE9PTihpb3BvcnQraHBfYXJhbUJhc2UrQklPU19SRUxBVElWRV9DQVJEKS0xKTsKKworICAgU0dSQU1fQUNDRVNTKGlvcG9ydCk7CisKKyAgIHNfUGhhc2VUYmxbMF0gPSBwaGFzZURhdGFPdXQ7CisgICBzX1BoYXNlVGJsWzFdID0gcGhhc2VEYXRhSW47CisgICBzX1BoYXNlVGJsWzJdID0gcGhhc2VJbGxlZ2FsOworICAgc19QaGFzZVRibFszXSA9IHBoYXNlSWxsZWdhbDsKKyAgIHNfUGhhc2VUYmxbNF0gPSBwaGFzZUNvbW1hbmQ7CisgICBzX1BoYXNlVGJsWzVdID0gcGhhc2VTdGF0dXM7CisgICBzX1BoYXNlVGJsWzZdID0gcGhhc2VNc2dPdXQ7CisgICBzX1BoYXNlVGJsWzddID0gcGhhc2VNc2dJbjsKKworICAgcENhcmRJbmZvLT5zaV9wcmVzZW50ID0gMHgwMTsKKworI2lmIGRlZmluZWQoQlVHQlVHKQorCisKKyAgIGZvciAoaSA9IDA7IGkgPCBNQVhfQ0FSRFM7IGkrKykgeworCisgICAgICBmb3IgKGlkPTA7IGlkPGRlYnVnX3NpemU7IGlkKyspCisgICAgICAgICBkZWJ1Z19pbnRbaV1baWRdID0gIChVQ0hBUikweDAwOworICAgICAgZGVidWdfaW5kZXhbaV0gPSAwOworICAgICAgfQorCisjZW5kaWYKKworICAgcmV0dXJuKDApOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFNjY2JNZ3JfY29uZmlnX2FkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgYWRhcHRlciBmb3Igbm9ybWFsIG9wZXJhdGlvbiAoaGFyZCByZXNldCkuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCitVU0hPUlQgU2NjYk1ncl9jb25maWdfYWRhcHRlcihQU0NDQk1HUl9JTkZPIHBDYXJkSW5mbykKKyNlbHNlCitVTE9ORyBTY2NiTWdyX2NvbmZpZ19hZGFwdGVyKFBTQ0NCTUdSX0lORk8gcENhcmRJbmZvKQorI2VuZGlmCit7CisgICBQU0NDQmNhcmQgQ3VyckNhcmQgPSBOVUxMOworCVBOVlJhbUluZm8gcEN1cnJOdlJhbTsKKyAgIFVDSEFSIGksaix0aGlzQ2FyZCwgU2NhbUZsZzsKKyAgIFVTSE9SVCB0ZW1wLHN5bmNfYml0X21hcCxpZDsKKyNpZiBkZWZpbmVkKERPUykKKyAgIFVTSE9SVCBpb3BvcnQ7CisjZWxzZQorICAgVUxPTkcgaW9wb3J0OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKERPUykKKyAgIGlvcG9ydCA9IChVU0hPUlQpcENhcmRJbmZvLT5zaV9iYXNlYWRkcjsKKyNlbHNlCisgICBpb3BvcnQgPSBwQ2FyZEluZm8tPnNpX2Jhc2VhZGRyOworI2VuZGlmCisKKyAgIGZvcih0aGlzQ2FyZCA9MDsgdGhpc0NhcmQgPD0gTUFYX0NBUkRTOyB0aGlzQ2FyZCsrKSB7CisKKyAgICAgIGlmICh0aGlzQ2FyZCA9PSBNQVhfQ0FSRFMpIHsKKworCSByZXR1cm4oRkFJTFVSRSk7CisgICAgICAgICB9CisKKyAgICAgIGlmIChCTF9DYXJkW3RoaXNDYXJkXS5pb1BvcnQgPT0gaW9wb3J0KSB7CisKKyAgICAgICAgIEN1cnJDYXJkID0gJkJMX0NhcmRbdGhpc0NhcmRdOworICAgICAgICAgU2NjYk1nclRhYmxlSW5pdENhcmQoQ3VyckNhcmQsdGhpc0NhcmQpOworICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKEJMX0NhcmRbdGhpc0NhcmRdLmlvUG9ydCA9PSAweDAwKSB7CisKKyAgICAgICAgIEJMX0NhcmRbdGhpc0NhcmRdLmlvUG9ydCA9IGlvcG9ydDsKKyAgICAgICAgIEN1cnJDYXJkID0gJkJMX0NhcmRbdGhpc0NhcmRdOworCisJCQlpZihtYkNhcmRzKQorCQkJCWZvcihpID0gMDsgaSA8IG1iQ2FyZHM7IGkrKyl7CisJCQkJCWlmKEN1cnJDYXJkLT5pb1BvcnQgPT0gbnZSYW1JbmZvW2ldLm5pQmFzZUFkZHIpCisJCQkJCQlDdXJyQ2FyZC0+cE52UmFtSW5mbyA9ICZudlJhbUluZm9baV07CisJCQkJfQorICAgICAgICAgU2NjYk1nclRhYmxlSW5pdENhcmQoQ3VyckNhcmQsdGhpc0NhcmQpOworICAgICAgICAgQ3VyckNhcmQtPmNhcmRJbmRleCA9IHRoaXNDYXJkOworICAgICAgICAgQ3VyckNhcmQtPmNhcmRJbmZvID0gcENhcmRJbmZvOworCisJIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorCisJcEN1cnJOdlJhbSA9IEN1cnJDYXJkLT5wTnZSYW1JbmZvOworCisJaWYocEN1cnJOdlJhbSl7CisJCVNjYW1GbGcgPSBwQ3Vyck52UmFtLT5uaVNjYW1Db25mOworCX0KKwllbHNleworCSAgIFNjYW1GbGcgPSAoVUNIQVIpIHV0aWxFRVJlYWQoaW9wb3J0LCBTQ0FNX0NPTkZJRy8yKTsKKwl9CisKKworICAgQnVzTWFzdGVySW5pdChpb3BvcnQpOworICAgWGJvd0luaXQoaW9wb3J0LCBTY2FtRmxnKTsKKworI2lmIGRlZmluZWQgKE5PX0JJT1NfT1BUSU9OKQorCisKKyAgIGlmIChEaWFnWGJvdyhpb3BvcnQpKSByZXR1cm4oRkFJTFVSRSk7CisgICBpZiAoRGlhZ0J1c01hc3Rlcihpb3BvcnQpKSByZXR1cm4oRkFJTFVSRSk7CisKKyNlbmRpZiAgLyogTm8gQklPUyBPcHRpb24gKi8KKworICAgYXV0b0xvYWREZWZhdWx0TWFwKGlvcG9ydCk7CisKKworICAgZm9yIChpID0gMCxpZCA9IDB4MDE7IGkgIT0gcENhcmRJbmZvLT5zaV9pZDsgaSsrLGlkIDw8PSAxKXt9CisKKyAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX3NlbGZpZF8wLCBpZCk7CisgICBXUl9IQVJQT09OKGlvcG9ydCtocF9zZWxmaWRfMSwgMHgwMCk7CisgICBXUl9IQVJQT09OKGlvcG9ydCtocF9hcmJfaWQsIHBDYXJkSW5mby0+c2lfaWQpOworICAgQ3VyckNhcmQtPm91cklkID0gcENhcmRJbmZvLT5zaV9pZDsKKworICAgaSA9IChVQ0hBUikgcENhcmRJbmZvLT5zaV9mbGFnczsKKyAgIGlmIChpICYgU0NTSV9QQVJJVFlfRU5BKQorICAgICAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX3BvcnRjdHJsXzEsKEhPU1RfTU9ERTggfCBDSEtfU0NTSV9QKSk7CisKKyAgIGogPSAoUkRfSEFSUE9PTihpb3BvcnQraHBfYm1fY3RybCkgJiB+U0NTSV9URVJNX0VOQV9MKTsKKyAgIGlmIChpICYgTE9XX0JZVEVfVEVSTSkKKyAgICAgIGogfD0gU0NTSV9URVJNX0VOQV9MOworICAgV1JfSEFSUE9PTihpb3BvcnQraHBfYm1fY3RybCwgaik7CisKKyAgIGogPSAoUkRfSEFSUE9PTihpb3BvcnQraHBfZWVfY3RybCkgJiB+U0NTSV9URVJNX0VOQV9IKTsKKyAgIGlmIChpICYgSElHSF9CWVRFX1RFUk0pCisgICAgICBqIHw9IFNDU0lfVEVSTV9FTkFfSDsKKyAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX2VlX2N0cmwsIGogKTsKKworCisgICBpZiAoIShwQ2FyZEluZm8tPnNpX2ZsYWdzICYgU09GVF9SRVNFVCkpIHsKKworICAgICAgc3Jlc2IoaW9wb3J0LHRoaXNDYXJkKTsKKworICAgICAgICAgc2NpbmkodGhpc0NhcmQsIHBDYXJkSW5mby0+c2lfaWQsIDApOworICAgICAgfQorCisKKworICAgaWYgKHBDYXJkSW5mby0+c2lfZmxhZ3MgJiBQT1NUX0FMTF9VTkRFUlJSVU5TKQorICAgICAgQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfTk9fRklMVEVSOworCisJaWYocEN1cnJOdlJhbSl7CisJCWlmKHBDdXJyTnZSYW0tPm5pU3lzQ29uZiAmIDB4MTApCisJCQlDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgfD0gRl9HUkVFTl9QQzsKKwl9CisJZWxzZXsKKwkgICBpZiAodXRpbEVFUmVhZChpb3BvcnQsIChTWVNURU1fQ09ORklHLzIpKSAmIEdSRUVOX1BDX0VOQSkKKyAgIAkgICBDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgfD0gRl9HUkVFTl9QQzsKKwl9CisKKwkvKiBTZXQgZ2xvYmFsIGZsYWcgdG8gaW5kaWNhdGUgUmUtTmVnb3RpYXRpb24gdG8gYmUgZG9uZSBvbiBhbGwKKwkJY2tlY2sgY29uZGl0aW9uICovCisJaWYocEN1cnJOdlJhbSl7CisJCWlmKHBDdXJyTnZSYW0tPm5pU2NzaUNvbmYgJiAweDA0KQorCQkJQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfRE9fUkVORUdPOworCX0KKwllbHNleworCSAgIGlmICh1dGlsRUVSZWFkKGlvcG9ydCwgKFNDU0lfQ09ORklHLzIpKSAmIFJFTkVHT19FTkEpCisgICAJICAgQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfRE9fUkVORUdPOworCX0KKworCWlmKHBDdXJyTnZSYW0peworCQlpZihwQ3Vyck52UmFtLT5uaVNjc2lDb25mICYgMHgwOCkKKwkJCUN1cnJDYXJkLT5nbG9iYWxGbGFncyB8PSBGX0NPTkxVTl9JTzsKKwl9CisJZWxzZXsKKwkgICBpZiAodXRpbEVFUmVhZChpb3BvcnQsIChTQ1NJX0NPTkZJRy8yKSkgJiBDT05OSU9fRU5BKQorICAgCSAgIEN1cnJDYXJkLT5nbG9iYWxGbGFncyB8PSBGX0NPTkxVTl9JTzsKKwl9CisKKworICAgdGVtcCA9IHBDYXJkSW5mby0+c2lfcGVyX3Rhcmdfbm9fZGlzYzsKKworICAgZm9yIChpID0gMCxpZCA9IDE7IGkgPCBNQVhfU0NTSV9UQVI7IGkrKywgaWQgPDw9IDEpIHsKKworICAgICAgaWYgKHRlbXAgJiBpZCkKKwkgc2NjYk1nclRibFt0aGlzQ2FyZF1baV0uVGFyU3RhdHVzIHw9IFRBUl9BTExPV19ESVNDOworICAgICAgfQorCisgICBzeW5jX2JpdF9tYXAgPSAweDAwMDE7CisKKyAgIGZvciAoaWQgPSAwOyBpZCA8IChNQVhfU0NTSV9UQVIvMik7IGlkKyspIHsKKworCQlpZihwQ3Vyck52UmFtKXsKKwkJCXRlbXAgPSAoVVNIT1JUKSBwQ3Vyck52UmFtLT5uaVN5bmNUYmxbaWRdOworCQkJdGVtcCA9ICgodGVtcCAmIDB4MDMpICsgKCh0ZW1wIDw8IDQpICYgMHhjMCkpICsKKwkJCQkJICgoKHRlbXAgPDwgNCkgJiAweDAzMDApICsgKCh0ZW1wIDw8IDgpICYgMHhjMDAwKSk7CisJCX1lbHNlCisJICAgICAgdGVtcCA9IHV0aWxFRVJlYWQoaW9wb3J0LCAoVVNIT1JUKSgoU1lOQ19SQVRFX1RCTC8yKStpZCkpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgdGVtcCA+Pj04LGkrKykgeworCisgICAgICAgICBpZiAocENhcmRJbmZvLT5zaV9wZXJfdGFyZ19pbml0X3N5bmMgJiBzeW5jX2JpdF9tYXApIHsKKworICAgICAgICAgICAgc2NjYk1nclRibFt0aGlzQ2FyZF1baWQqMitpXS5UYXJFRVZhbHVlID0gKFVDSEFSKXRlbXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgeworCSAgICBzY2NiTWdyVGJsW3RoaXNDYXJkXVtpZCoyK2ldLlRhclN0YXR1cyB8PSBTWU5DX1NVUFBPUlRFRDsKKyAgICAgICAgICAgIHNjY2JNZ3JUYmxbdGhpc0NhcmRdW2lkKjIraV0uVGFyRUVWYWx1ZSA9CisgICAgICAgICAgICAgICAoVUNIQVIpKHRlbXAgJiB+RUVfU1lOQ19NQVNLKTsKKyAgICAgICAgICAgIH0KKworI2lmIGRlZmluZWQoV0lERV9TQ1NJKQorLyogICAgICAgICBpZiAoKHBDYXJkSW5mby0+c2lfcGVyX3Rhcmdfd2lkZV9uZWdvICYgc3luY19iaXRfbWFwKSB8fAorICAgICAgICAgICAgKGlkKjIraSA+PSA4KSl7CisqLworICAgICAgICAgaWYgKHBDYXJkSW5mby0+c2lfcGVyX3Rhcmdfd2lkZV9uZWdvICYgc3luY19iaXRfbWFwKXsKKworICAgICAgICAgICAgc2NjYk1nclRibFt0aGlzQ2FyZF1baWQqMitpXS5UYXJFRVZhbHVlIHw9IEVFX1dJREVfU0NTSTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICBlbHNlIHsgLyogTkFSUk9XIFNDU0kgKi8KKyAgICAgICAgICAgIHNjY2JNZ3JUYmxbdGhpc0NhcmRdW2lkKjIraV0uVGFyU3RhdHVzIHw9IFdJREVfTkVHT0NJQVRFRDsKKyAgICAgICAgICAgIH0KKworI2Vsc2UKKyAgICAgICAgIHNjY2JNZ3JUYmxbdGhpc0NhcmRdW2lkKjIraV0uVGFyU3RhdHVzIHw9IFdJREVfTkVHT0NJQVRFRDsKKyNlbmRpZgorCisKKwkgc3luY19iaXRfbWFwIDw8PSAxOworCisKKworICAgICAgICAgfQorICAgICAgfQorCisgICBXUl9IQVJQT09OKChpb3BvcnQraHBfc2VtYXBob3JlKSwKKyAgICAgIChVQ0hBUikoUkRfSEFSUE9PTigoaW9wb3J0K2hwX3NlbWFwaG9yZSkpIHwgU0NDQl9NR1JfUFJFU0VOVCkpOworCisjaWYgZGVmaW5lZChET1MpCisgICByZXR1cm4oKFVTSE9SVClDdXJyQ2FyZCk7CisjZWxzZQorICAgcmV0dXJuKChVTE9ORylDdXJyQ2FyZCk7CisjZW5kaWYKK30KKworI2Vsc2UgIAkJCS8qIGVuZCAoRldfVFlQRT09X1NDQ0JfTUdSXykgICovCisKKworCitTVEFUSUMgczE2Yml0cyBGUF9QcmVzZW5jZUNoZWNrKFBNR1JfSU5GTyBwTWdySW5mbykKK3sKKwlQTUdSX0VOVFJZUE5UUwlwTWdyX0VudHJ5UG50cyA9ICZwTWdySW5mby0+bWlfRnVuY3Rpb25zOworCisgICAgICBwTWdyX0VudHJ5UG50cy0+VUNCTWdyX3Byb2JlX2FkYXB0ZXIgPSBwcm9iZV9hZGFwdGVyOworICAgICAgcE1ncl9FbnRyeVBudHMtPlVDQk1ncl9pbml0X2FkYXB0ZXIgPSBpbml0X2FkYXB0ZXI7CisgICAgICBwTWdyX0VudHJ5UG50cy0+VUNCTWdyX3N0YXJ0X1VDQiA9IFNjY2JNZ3Jfc3RhcnRfc2NjYjsKKyAgICAgIHBNZ3JfRW50cnlQbnRzLT5VQ0JNZ3JfYnVpbGRfVUNCID0gYnVpbGRfVUNCOworICAgICAgcE1ncl9FbnRyeVBudHMtPlVDQk1ncl9hYm9ydF9VQ0IgPSBTY2NiTWdyX2Fib3J0X3NjY2I7CisgICAgICBwTWdyX0VudHJ5UG50cy0+VUNCTWdyX215X2ludCA9IFNjY2JNZ3JfbXlfaW50OworICAgICAgcE1ncl9FbnRyeVBudHMtPlVDQk1ncl9pc3IgPSBTY2NiTWdyX2lzcjsKKyAgICAgIHBNZ3JfRW50cnlQbnRzLT5VQ0JNZ3Jfc2NzaV9yZXNldCA9IFNjY2JNZ3Jfc2NzaV9yZXNldDsKKyAgICAgIHBNZ3JfRW50cnlQbnRzLT5VQ0JNZ3JfdGltZXJfZXhwaXJlZCA9IFNjY2JNZ3JfdGltZXJfZXhwaXJlZDsKKyNpZm5kZWYgTk9fSU9DVExTCisJICBwTWdyX0VudHJ5UG50cy0+VUNCTWdyX3VubG9hZF9jYXJkID0gU2NjYk1ncl91bmxvYWRfY2FyZDsKKwkgIHBNZ3JfRW50cnlQbnRzLT5VQ0JNZ3Jfc2F2ZV9mb3JlaWduX3N0YXRlID0KKwkgIAkJCQkJCQkJCVNjY2JNZ3Jfc2F2ZV9mb3JlaWduX3N0YXRlOworCSAgcE1ncl9FbnRyeVBudHMtPlVDQk1ncl9yZXN0b3JlX2ZvcmVpZ25fc3RhdGUgPQorCSAgCQkJCQkJCQkJU2NjYk1ncl9yZXN0b3JlX2ZvcmVpZ25fc3RhdGU7CisJICBwTWdyX0VudHJ5UG50cy0+VUNCTWdyX3Jlc3RvcmVfbmF0aXZlX3N0YXRlID0KKwkgIAkJCQkJCQkJCVNjY2JNZ3JfcmVzdG9yZV9uYXRpdmVfc3RhdGU7CisjZW5kaWYgLypOT19JT0NUTFMqLworCisgICAgICBwTWdySW5mby0+bWlfU0dMaXN0Rm9ybWF0PTB4MDE7CisgICAgICBwTWdySW5mby0+bWlfRGF0YVB0ckZvcm1hdD0weDAxOworICAgICAgcE1nckluZm8tPm1pX01heFNHRWxlbWVudHM9ICh1MTZiaXRzKSAweGZmZmZmZmZmOworICAgICAgcE1nckluZm8tPm1pX01nclByaXZhdGVMZW49c2l6ZW9mKFNDQ0IpOworICAgICAgcE1nckluZm8tPm1pX1BDSVZlbmRvcklEPUJMX1ZFTkRPUl9JRDsKKyAgICAgIHBNZ3JJbmZvLT5taV9QQ0lEZXZpY2VJRD1GUF9ERVZJQ0VfSUQ7CisgICAgICBwTWdySW5mby0+bWlfTWdyQXR0cmlidXRlcz0gQVRUUl9JT19NQVBQRUQgKworCQkJCQkJCQkJCQkgQVRUUl9QSFlTSUNBTF9BRERSRVNTICsKKwkJCQkJCQkJCQkJIEFUVFJfVklSVFVBTF9BRERSRVNTICsKKwkJCQkJCQkJCQkJIEFUVFJfT1ZFUkxBUFBFRF9JT19JT0NUTFNfT0s7CisgICAgICBwTWdySW5mby0+bWlfSW9SYW5nZUxlbiA9IDI1NjsKKyAgICAgIHJldHVybigwKTsKK30KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHByb2JlX2FkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgYW5kL29yIFNlYXJjaCBmb3IgY2FyZHMgYW5kIHJldHVybiBpbmZvIHRvIGNhbGxlci4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitTVEFUSUMgczMyYml0cyBwcm9iZV9hZGFwdGVyKFBBREFQVEVSX0lORk8gcEFkYXB0ZXJJbmZvKQoreworICAgdTE2Yml0cyB0ZW1wLHRlbXAyLHRlbXAzLHRlbXA0OworICAgdTA4Yml0cyBpLGosaWQ7CisKKyNpZiBkZWZpbmVkKERPUykKKyNlbHNlCisgICBzdGF0aWMgdTA4Yml0cyBmaXJzdF90aW1lID0gMTsKKyNlbmRpZgorICAgQkFTRV9QT1JUIGlvcG9ydDsKKwlQTlZSYW1JbmZvIHBDdXJyTnZSYW07CisKKyAgIGlvcG9ydCA9IChCQVNFX1BPUlQpcEFkYXB0ZXJJbmZvLT5haV9iYXNlYWRkcjsKKworCisKKyAgIGlmIChSRF9IQVJQT09OKGlvcG9ydCtocF92ZW5kb3JfaWRfMCkgIT0gT1JJT05fVkVORF8wKQorICAgICAgcmV0dXJuKDEpOworCisgICBpZiAoKFJEX0hBUlBPT04oaW9wb3J0K2hwX3ZlbmRvcl9pZF8xKSAhPSBPUklPTl9WRU5EXzEpKQorICAgICAgcmV0dXJuKDIpOworCisgICBpZiAoKFJEX0hBUlBPT04oaW9wb3J0K2hwX2RldmljZV9pZF8wKSAhPSBPUklPTl9ERVZfMCkpCisgICAgICByZXR1cm4oMyk7CisKKyAgIGlmICgoUkRfSEFSUE9PTihpb3BvcnQraHBfZGV2aWNlX2lkXzEpICE9IE9SSU9OX0RFVl8xKSkKKyAgICAgIHJldHVybig0KTsKKworCisgICBpZiAoUkRfSEFSUE9PTihpb3BvcnQraHBfcmV2X251bSkgIT0gMHgwZil7CisKKworLyogRm9yIG5ldyBIYXJwb29uIHRoZW4gY2hlY2sgZm9yIHN1Yl9kZXZpY2UgSUQgTFNCCisgICB0aGUgYml0cygwLTMpIG11c3QgYmUgYWxsIFpFUk8gZm9yIGNvbXBhdGlibGUgd2l0aAorICAgY3VycmVudCB2ZXJzaW9uIG9mIFNDQ0JNZ3IsIGVsc2Ugc2tpcCB0aGlzIEhhcnBvb24KKwlkZXZpY2UuICovCisKKwkgICBpZiAoUkRfSEFSUE9PTihpb3BvcnQraHBfc3ViX2RldmljZV9pZF8wKSAmIDB4MGYpCisJICAgICAgcmV0dXJuKDUpOworCX0KKworICAgaWYgKGZpcnN0X3RpbWUpIHsKKworICAgICAgU2NjYk1nclRhYmxlSW5pdEFsbCgpOworICAgICAgZmlyc3RfdGltZSA9IDA7CisJCW1iQ2FyZHMgPSAwOworICAgICAgfQorCisJaWYoUmRTdGFjayhpb3BvcnQsIDApICE9IDB4MDApIHsKKwkJaWYoQ2hrSWZDaGlwSW5pdGlhbGl6ZWQoaW9wb3J0KSA9PSBGQUxTRSkKKwkJeworCQkJcEN1cnJOdlJhbSA9IE5VTEw7CisJCSAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX3NlbWFwaG9yZSwgMHgwMCk7CisJCQlYYm93SW5pdChpb3BvcnQsIDApOyAgICAgICAgICAgICAgICAvKk11c3QgSW5pdCB0aGUgU0NTSSBiZWZvcmUgYXR0ZW1wdGluZyAqLworCQkJRGlhZ0VFUFJPTShpb3BvcnQpOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYobWJDYXJkcyA8IE1BWF9NQl9DQVJEUykgeworCQkJCXBDdXJyTnZSYW0gPSAmbnZSYW1JbmZvW21iQ2FyZHNdOworCQkJCW1iQ2FyZHMrKzsKKwkJCQlwQ3Vyck52UmFtLT5uaUJhc2VBZGRyID0gaW9wb3J0OworCQkJCVJOVlJhbURhdGEocEN1cnJOdlJhbSk7CisJCQl9ZWxzZQorCQkJCXJldHVybigoaW50KSBGQUlMVVJFKTsKKwkJfQorCX1lbHNlCisJCXBDdXJyTnZSYW0gPSBOVUxMOworCisjaWYgZGVmaW5lZCAoTk9fQklPU19PUFRJT04pCisJcEN1cnJOdlJhbSA9IE5VTEw7CisgICBYYm93SW5pdChpb3BvcnQsIDApOyAgICAgICAgICAgICAgICAvKk11c3QgSW5pdCB0aGUgU0NTSSBiZWZvcmUgYXR0ZW1wdGluZyAqLworICAgRGlhZ0VFUFJPTShpb3BvcnQpOworI2VuZGlmICAvKiBObyBCSU9TIE9wdGlvbiAqLworCisgICBXUl9IQVJQT09OKGlvcG9ydCtocF9jbGtjdHJsXzAsIENMS0NUUkxfREVGQVVMVCk7CisgICBXUl9IQVJQT09OKGlvcG9ydCtocF9zeXNfY3RybCwgMHgwMCk7CisKKwlpZihwQ3Vyck52UmFtKQorCQlwQWRhcHRlckluZm8tPmFpX2lkID0gcEN1cnJOdlJhbS0+bmlBZGFwSWQ7CisJZWxzZQorICAgCXBBZGFwdGVySW5mby0+YWlfaWQgPSAodTA4Yml0cykodXRpbEVFUmVhZChpb3BvcnQsIChBREFQVEVSX1NDU0lfSUQvMikpICYKKyAgICAgIAkodTA4Yml0cykweDBGRik7CisKKyAgIHBBZGFwdGVySW5mby0+YWlfbHVuID0gMHgwMDsKKyAgIHBBZGFwdGVySW5mby0+YWlfZndfcmV2aXNpb25bMF0gPSAnMyc7CisgICBwQWRhcHRlckluZm8tPmFpX2Z3X3JldmlzaW9uWzFdID0gJzEnOworICAgcEFkYXB0ZXJJbmZvLT5haV9md19yZXZpc2lvblsyXSA9ICcxJzsKKyAgIHBBZGFwdGVySW5mby0+YWlfZndfcmV2aXNpb25bM10gPSAnICc7CisgICBwQWRhcHRlckluZm8tPmFpX051bUNoYW5uZWxzID0gMTsKKworICAgdGVtcDIgPSAweDAwMDA7CisgICB0ZW1wMyA9IDB4MDAwMDsKKyAgIHRlbXA0ID0gMHgwMDAwOworCisgICBmb3IgKGlkID0gMDsgaWQgPCAoMTYvMik7IGlkKyspIHsKKworCQlpZihwQ3Vyck52UmFtKXsKKwkJCXRlbXAgPSAoVVNIT1JUKSBwQ3Vyck52UmFtLT5uaVN5bmNUYmxbaWRdOworCQkJdGVtcCA9ICgodGVtcCAmIDB4MDMpICsgKCh0ZW1wIDw8IDQpICYgMHhjMCkpICsKKwkJCQkJICgoKHRlbXAgPDwgNCkgJiAweDAzMDApICsgKCh0ZW1wIDw8IDgpICYgMHhjMDAwKSk7CisJCX1lbHNlCisJICAgICAgdGVtcCA9IHV0aWxFRVJlYWQoaW9wb3J0LCAodTE2Yml0cykoKFNZTkNfUkFURV9UQkwvMikraWQpKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IDI7IHRlbXAgPj49OCxpKyspIHsKKworICAgICAgICAgaWYgKCh0ZW1wICYgMHgwMykgIT0gQVVUT19SQVRFXzAwKSB7CisKKyAgICAgICAgICAgIHRlbXAyID4+PSAweDAxOworICAgICAgICAgICAgdGVtcDIgfD0gMHg4MDAwOworICAgICAgICAgICAgfQorCisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRlbXAyID4+PSAweDAxOworICAgICAgICAgICAgfQorCisgICAgICAgICBpZiAodGVtcCAmIERJU0NfRU5BQkxFX0JJVCkgeworCisgICAgICAgICAgICB0ZW1wMyA+Pj0gMHgwMTsKKyAgICAgICAgICAgIHRlbXAzIHw9IDB4ODAwMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0ZW1wMyA+Pj0gMHgwMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgaWYgKHRlbXAgJiBXSURFX05FR09fQklUKSB7CisKKyAgICAgICAgICAgIHRlbXA0ID4+PSAweDAxOworICAgICAgICAgICAgdGVtcDQgfD0gMHg4MDAwOworICAgICAgICAgICAgfQorCisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRlbXA0ID4+PSAweDAxOworICAgICAgICAgICAgfQorCisgICAgICAgICB9CisgICAgICB9CisKKyAgIHBBZGFwdGVySW5mby0+YWlfcGVyX3RhcmdfaW5pdF9zeW5jID0gdGVtcDI7CisgICBwQWRhcHRlckluZm8tPmFpX3Blcl90YXJnX25vX2Rpc2MgPSB0ZW1wMzsKKyAgIHBBZGFwdGVySW5mby0+YWlfcGVyX3Rhcmdfd2lkZV9uZWdvID0gdGVtcDQ7CisJaWYocEN1cnJOdlJhbSkKKwkJaSA9IHBDdXJyTnZSYW0tPm5pU3lzQ29uZjsKKwllbHNlCisgICAJaSA9ICh1MDhiaXRzKSh1dGlsRUVSZWFkKGlvcG9ydCwgKFNZU1RFTV9DT05GSUcvMikpKTsKKworICAgLyoKKyAgICoqIGludGVycnVwdHMgYWx3YXlzIGxldmVsLXRyaWdnZXJlZCBmb3IgRmxhc2hQb2ludAorICAgKi8KKyAgIHBBZGFwdGVySW5mby0+YWlfc3RhdGVpbmZvIHw9IExFVkVMX1RSSUc7CisKKyAgIGlmIChpICYgMHgwMSkKKyAgICAgIHBBZGFwdGVySW5mby0+YWlfc3RhdGVpbmZvIHw9IFNDU0lfUEFSSVRZX0VOQTsKKworCWlmIChpICYgMHgwMikJLyogU0NTSSBCdXMgcmVzZXQgaW4gQXV0b1NDU0kgU2V0ID8gKi8KKwl7CisJCWlmKHBDdXJyTnZSYW0pCisJCXsKKwkJCWogPSBwQ3Vyck52UmFtLT5uaVNjYW1Db25mOworCQl9CisJCWVsc2UKKwkJeworCQlqID0gKHUwOGJpdHMpIHV0aWxFRVJlYWQoaW9wb3J0LCBTQ0FNX0NPTkZJRy8yKTsKKwkJfQorCQlpZihqICYgU0NBTV9FTkFCTEVEKQorCQl7CisJCQlpZihqICYgU0NBTV9MRVZFTDIpCisJCQl7CisJCQkJcEFkYXB0ZXJJbmZvLT5haV9zdGF0ZWluZm8gfD0gU0NBTTJfRU5BOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBBZGFwdGVySW5mby0+YWlfc3RhdGVpbmZvIHw9IFNDQU0xX0VOQTsKKwkJCX0KKwkJfQorCX0KKyAgIGogPSAoUkRfSEFSUE9PTihpb3BvcnQraHBfYm1fY3RybCkgJiB+U0NTSV9URVJNX0VOQV9MKTsKKyAgIGlmIChpICYgMHgwNCkgeworICAgICAgaiB8PSBTQ1NJX1RFUk1fRU5BX0w7CisgICAgICBwQWRhcHRlckluZm8tPmFpX3N0YXRlaW5mbyB8PSBMT1dfQllURV9URVJNX0VOQTsKKyAgICAgIH0KKyAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX2JtX2N0cmwsIGogKTsKKworICAgaiA9IChSRF9IQVJQT09OKGlvcG9ydCtocF9lZV9jdHJsKSAmIH5TQ1NJX1RFUk1fRU5BX0gpOworICAgaWYgKGkgJiAweDA4KSB7CisgICAgICBqIHw9IFNDU0lfVEVSTV9FTkFfSDsKKyAgICAgIHBBZGFwdGVySW5mby0+YWlfc3RhdGVpbmZvIHw9IEhJR0hfQllURV9URVJNX0VOQTsKKyAgICAgIH0KKyAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX2VlX2N0cmwsIGogKTsKKworCWlmKFJEX0hBUlBPT04oaW9wb3J0ICsgaHBfcGFnZV9jdHJsKSAmIEJJT1NfU0hBRE9XKQorCXsKKwkJcEFkYXB0ZXJJbmZvLT5haV9GbGFzaFJvbVNpemUgPSA2NCAqIDEwMjQ7CS8qIDY0ayBST00gKi8KKwl9CisJZWxzZQorCXsKKwkJcEFkYXB0ZXJJbmZvLT5haV9GbGFzaFJvbVNpemUgPSAzMiAqIDEwMjQ7CS8qIDMyayBST00gKi8KKwl9CisKKyAgIHBBZGFwdGVySW5mby0+YWlfc3RhdGVpbmZvIHw9IChGQVNUMjBfRU5BIHwgVEFHX1FVRVVFX0VOQSk7CisgICBpZiAoIShSRF9IQVJQT09OKGlvcG9ydCtocF9wYWdlX2N0cmwpICYgTkFSUk9XX1NDU0lfQ0FSRCkpCisJeworICAgICAgcEFkYXB0ZXJJbmZvLT5haV9hdHRyaWJ1dGVzIHw9IChXSURFX0NBUEFCTEUgfCBGQVNUMjBfQ0FQQUJMRQorCQkJCQkJCQkJCQkJCXwgU0NBTTJfQ0FQQUJMRQorCQkJCQkJCQkJCQkJCXwgVEFHX1FVRVVFX0NBUEFCTEUKKwkJCQkJCQkJCQkJCQl8IFNVUFJFU1NfVU5ERVJSUlVOU19DQVBBQkxFCisJCQkJCQkJCQkJCQkJfCBTQ1NJX1BBUklUWV9DQVBBQkxFKTsKKwkJcEFkYXB0ZXJJbmZvLT5haV9NYXhUYXJnID0gMTY7CisJCXBBZGFwdGVySW5mby0+YWlfTWF4THVuICA9IDMyOworCX0KKwllbHNlCisJeworICAgICAgcEFkYXB0ZXJJbmZvLT5haV9hdHRyaWJ1dGVzIHw9IChGQVNUMjBfQ0FQQUJMRSB8IFNDQU0yX0NBUEFCTEUKKwkJCQkJCQkJCQkJCQl8IFRBR19RVUVVRV9DQVBBQkxFCisJCQkJCQkJCQkJCQkJfCBTVVBSRVNTX1VOREVSUlJVTlNfQ0FQQUJMRQorCQkJCQkJCQkJCQkJCXwgU0NTSV9QQVJJVFlfQ0FQQUJMRSk7CisJCXBBZGFwdGVySW5mby0+YWlfTWF4VGFyZyA9IDg7CisJCXBBZGFwdGVySW5mby0+YWlfTWF4THVuICA9IDg7CisJfQorCisgICBwQWRhcHRlckluZm8tPmFpX3Byb2R1Y3RfZmFtaWx5ID0gSEFSUE9PTl9GQU1JTFk7CisgICBwQWRhcHRlckluZm8tPmFpX0hCQWJ1c3R5cGUgPSBCVVNUWVBFX1BDSTsKKworICAgZm9yIChpPTA7aTxDQVJEX01PREVMX05BTUVMRU47aSsrKQorICAgeworICAgICAgcEFkYXB0ZXJJbmZvLT5haV9jYXJkX21vZGVsW2ldPScgJzsgLyogaW5pdGlhbGl6ZSB0aGUgYWlfY2FyZF9tb2RlbCAqLworICAgfQorCisJaWYocEN1cnJOdlJhbSl7CisJcEFkYXB0ZXJJbmZvLT5haV9jYXJkX21vZGVsWzBdID0gJzknOworCQlzd2l0Y2gocEN1cnJOdlJhbS0+bmlNb2RlbCAmIDB4MGYpeworCQkJY2FzZSBNT0RFTF9MVDoKKwkJCXBBZGFwdGVySW5mby0+YWlfY2FyZF9tb2RlbFsxXSA9ICczJzsKKwkJCXBBZGFwdGVySW5mby0+YWlfY2FyZF9tb2RlbFsyXSA9ICcwJzsKKwkJCQlicmVhazsKKwkJCWNhc2UgTU9ERUxfTFc6CisJCQlwQWRhcHRlckluZm8tPmFpX2NhcmRfbW9kZWxbMV0gPSAnNSc7CisJCQlwQWRhcHRlckluZm8tPmFpX2NhcmRfbW9kZWxbMl0gPSAnMCc7CisJCQkJYnJlYWs7CisJCQljYXNlIE1PREVMX0RMOgorCQkJcEFkYXB0ZXJJbmZvLT5haV9jYXJkX21vZGVsWzFdID0gJzMnOworCQkJcEFkYXB0ZXJJbmZvLT5haV9jYXJkX21vZGVsWzJdID0gJzInOworCQkJCWJyZWFrOworCQkJY2FzZSBNT0RFTF9EVzoKKwkJCXBBZGFwdGVySW5mby0+YWlfY2FyZF9tb2RlbFsxXSA9ICc1JzsKKwkJCXBBZGFwdGVySW5mby0+YWlfY2FyZF9tb2RlbFsyXSA9ICcyJzsKKwkJCQlicmVhazsKKwkJfQorCX1lbHNleworCSAgIHRlbXAgPSB1dGlsRUVSZWFkKGlvcG9ydCwgKE1PREVMX05VTUJfMC8yKSk7CisJCXBBZGFwdGVySW5mby0+YWlfY2FyZF9tb2RlbFswXSA9ICh1MDhiaXRzKSh0ZW1wID4+IDgpOworCSAgIHRlbXAgPSB1dGlsRUVSZWFkKGlvcG9ydCwgKE1PREVMX05VTUJfMi8yKSk7CisKKwkJcEFkYXB0ZXJJbmZvLT5haV9jYXJkX21vZGVsWzFdID0gKHUwOGJpdHMpKHRlbXAgJiAweDAwRkYpOworCSAgIHBBZGFwdGVySW5mby0+YWlfY2FyZF9tb2RlbFsyXSA9ICh1MDhiaXRzKSh0ZW1wID4+IDgpOworCX0KKworCisKKyAgIHBBZGFwdGVySW5mby0+YWlfRmliZXJQcm9kdWN0VHlwZSA9IDA7CisKKyAgIHBBZGFwdGVySW5mby0+YWlfc2Vjb25kYXJ5X3JhbmdlID0gMDsKKworICAgZm9yIChpPTA7aTxXT1JMRF9XSURFX05BTUVMRU47aSsrKQorICAgeworICAgICAgcEFkYXB0ZXJJbmZvLT5haV93b3JsZHdpZGVuYW1lW2ldPSdcMCc7CisgICB9CisKKyAgIGZvciAoaT0wO2k8VkVORE9SX05BTUVMRU47aSsrKQorICAgeworICAgICAgcEFkYXB0ZXJJbmZvLT5haV92ZW5kb3JzdHJpbmdbaV09J1wwJzsKKyAgIH0KKyAgIAlwQWRhcHRlckluZm8tPmFpX3ZlbmRvcnN0cmluZ1swXT0nQic7CisgICAJcEFkYXB0ZXJJbmZvLT5haV92ZW5kb3JzdHJpbmdbMV09J1UnOworICAgCXBBZGFwdGVySW5mby0+YWlfdmVuZG9yc3RyaW5nWzJdPSdTJzsKKyAgIAlwQWRhcHRlckluZm8tPmFpX3ZlbmRvcnN0cmluZ1szXT0nTCc7CisgICAJcEFkYXB0ZXJJbmZvLT5haV92ZW5kb3JzdHJpbmdbNF09J08nOworICAgCXBBZGFwdGVySW5mby0+YWlfdmVuZG9yc3RyaW5nWzVdPSdHJzsKKyAgIAlwQWRhcHRlckluZm8tPmFpX3ZlbmRvcnN0cmluZ1s2XT0nSSc7CisgICAJcEFkYXB0ZXJJbmZvLT5haV92ZW5kb3JzdHJpbmdbN109J0MnOworCisJZm9yIChpPTA7aTxGQU1JTFlfTkFNRUxFTjtpKyspCisJeworCSAgIHBBZGFwdGVySW5mby0+YWlfQWRhcHRlckZhbWlseVN0cmluZ1tpXT0nXDAnOworCX0KKyAgIAlwQWRhcHRlckluZm8tPmFpX0FkYXB0ZXJGYW1pbHlTdHJpbmdbMF09J0YnOworICAgCXBBZGFwdGVySW5mby0+YWlfQWRhcHRlckZhbWlseVN0cmluZ1sxXT0nTCc7CisgICAJcEFkYXB0ZXJJbmZvLT5haV9BZGFwdGVyRmFtaWx5U3RyaW5nWzJdPSdBJzsKKyAgIAlwQWRhcHRlckluZm8tPmFpX0FkYXB0ZXJGYW1pbHlTdHJpbmdbM109J1MnOworICAgCXBBZGFwdGVySW5mby0+YWlfQWRhcHRlckZhbWlseVN0cmluZ1s0XT0nSCc7CisgICAJcEFkYXB0ZXJJbmZvLT5haV9BZGFwdGVyRmFtaWx5U3RyaW5nWzVdPSdQJzsKKyAgIAlwQWRhcHRlckluZm8tPmFpX0FkYXB0ZXJGYW1pbHlTdHJpbmdbNl09J08nOworICAgCXBBZGFwdGVySW5mby0+YWlfQWRhcHRlckZhbWlseVN0cmluZ1s3XT0nSSc7CisgICAJcEFkYXB0ZXJJbmZvLT5haV9BZGFwdGVyRmFtaWx5U3RyaW5nWzhdPSdOJzsKKyAgIAlwQWRhcHRlckluZm8tPmFpX0FkYXB0ZXJGYW1pbHlTdHJpbmdbOV09J1QnOworCisgICBBUkFNX0FDQ0VTUyhpb3BvcnQpOworCisgICBmb3IgKCBpID0gMDsgaSA8IDQ7IGkrKyApIHsKKworICAgICAgcEFkYXB0ZXJJbmZvLT5haV9YbGF0SW5mb1tpXSA9CisgICAgICAgICBSRF9IQVJQT09OKGlvcG9ydCtocF9hcmFtQmFzZStCSU9TX0RBVEFfT0ZGU0VUK2kpOworICAgICAgfQorCisJLyogcmV0dXJuIHdpdGggLTEgaWYgbm8gc29ydCwgZWxzZSByZXR1cm4gd2l0aAorCSAgIGxvZ2ljYWwgY2FyZCBudW1iZXIgc29ydGVkIGJ5IEJJT1MgKHplcm8tYmFzZWQpICovCisKKworCXBBZGFwdGVySW5mby0+YWlfcmVsYXRpdmVfY2FyZG51bSA9IAorICAgICAgKHUwOGJpdHMpKFJEX0hBUlBPT04oaW9wb3J0K2hwX2FyYW1CYXNlK0JJT1NfUkVMQVRJVkVfQ0FSRCktMSk7IAorCisgICBTR1JBTV9BQ0NFU1MoaW9wb3J0KTsKKworICAgc19QaGFzZVRibFswXSA9IHBoYXNlRGF0YU91dDsKKyAgIHNfUGhhc2VUYmxbMV0gPSBwaGFzZURhdGFJbjsKKyAgIHNfUGhhc2VUYmxbMl0gPSBwaGFzZUlsbGVnYWw7CisgICBzX1BoYXNlVGJsWzNdID0gcGhhc2VJbGxlZ2FsOworICAgc19QaGFzZVRibFs0XSA9IHBoYXNlQ29tbWFuZDsKKyAgIHNfUGhhc2VUYmxbNV0gPSBwaGFzZVN0YXR1czsKKyAgIHNfUGhhc2VUYmxbNl0gPSBwaGFzZU1zZ091dDsKKyAgIHNfUGhhc2VUYmxbN10gPSBwaGFzZU1zZ0luOworCisgICBwQWRhcHRlckluZm8tPmFpX3ByZXNlbnQgPSAweDAxOworCisjaWYgZGVmaW5lZChCVUdCVUcpCisKKworICAgZm9yIChpID0gMDsgaSA8IE1BWF9DQVJEUzsgaSsrKSB7CisKKyAgICAgIGZvciAoaWQ9MDsgaWQ8ZGVidWdfc2l6ZTsgaWQrKykKKyAgICAgICAgIGRlYnVnX2ludFtpXVtpZF0gPSAgKHUwOGJpdHMpMHgwMDsKKyAgICAgIGRlYnVnX2luZGV4W2ldID0gMDsKKyAgICAgIH0KKworI2VuZGlmCisKKyAgIHJldHVybigwKTsKK30KKworCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBpbml0X2FkYXB0ZXIsIGV4cG9ydGVkIHRvIEJVREkgdmlhIFVDQk1ncl9pbml0X2FkYXB0ZXIgZW50cnkKKyAqCisgKgorICogRGVzY3JpcHRpb246IFNldHVwIGFkYXB0ZXIgZm9yIG5vcm1hbCBvcGVyYXRpb24gKGhhcmQgcmVzZXQpLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1NUQVRJQyBDQVJEX0hBTkRMRSBpbml0X2FkYXB0ZXIoUEFEQVBURVJfSU5GTyBwQ2FyZEluZm8pCit7CisgICBQU0NDQmNhcmQgQ3VyckNhcmQ7CisJUE5WUmFtSW5mbyBwQ3Vyck52UmFtOworICAgdTA4Yml0cyBpLGosdGhpc0NhcmQsIFNjYW1GbGc7CisgICB1MTZiaXRzIHRlbXAsc3luY19iaXRfbWFwLGlkOworICAgQkFTRV9QT1JUIGlvcG9ydDsKKworICAgaW9wb3J0ID0gKEJBU0VfUE9SVClwQ2FyZEluZm8tPmFpX2Jhc2VhZGRyOworCisgICBmb3IodGhpc0NhcmQgPTA7IHRoaXNDYXJkIDw9IE1BWF9DQVJEUzsgdGhpc0NhcmQrKykgeworCisgICAgICBpZiAodGhpc0NhcmQgPT0gTUFYX0NBUkRTKSB7CisKKyAgICAgICAgIHJldHVybihGQUlMVVJFKTsKKyAgICAgICAgIH0KKworICAgICAgaWYgKEJMX0NhcmRbdGhpc0NhcmRdLmlvUG9ydCA9PSBpb3BvcnQpIHsKKworICAgICAgICAgQ3VyckNhcmQgPSAmQkxfQ2FyZFt0aGlzQ2FyZF07CisgICAgICAgICBTY2NiTWdyVGFibGVJbml0Q2FyZChDdXJyQ2FyZCx0aGlzQ2FyZCk7CisgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgZWxzZSBpZiAoQkxfQ2FyZFt0aGlzQ2FyZF0uaW9Qb3J0ID09IDB4MDApIHsKKworICAgICAgICAgQkxfQ2FyZFt0aGlzQ2FyZF0uaW9Qb3J0ID0gaW9wb3J0OworICAgICAgICAgQ3VyckNhcmQgPSAmQkxfQ2FyZFt0aGlzQ2FyZF07CisKKwkJCWlmKG1iQ2FyZHMpCisJCQkJZm9yKGkgPSAwOyBpIDwgbWJDYXJkczsgaSsrKXsKKwkJCQkJaWYoQ3VyckNhcmQtPmlvUG9ydCA9PSBudlJhbUluZm9baV0ubmlCYXNlQWRkcikKKwkJCQkJCUN1cnJDYXJkLT5wTnZSYW1JbmZvID0gJm52UmFtSW5mb1tpXTsKKwkJCQl9CisgICAgICAgICBTY2NiTWdyVGFibGVJbml0Q2FyZChDdXJyQ2FyZCx0aGlzQ2FyZCk7CisgICAgICAgICBDdXJyQ2FyZC0+Y2FyZEluZGV4ID0gdGhpc0NhcmQ7CisgICAgICAgICBDdXJyQ2FyZC0+Y2FyZEluZm8gPSBwQ2FyZEluZm87CisKKyAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorCisJcEN1cnJOdlJhbSA9IEN1cnJDYXJkLT5wTnZSYW1JbmZvOworCisgICAKKwlpZihwQ3Vyck52UmFtKXsKKwkJU2NhbUZsZyA9IHBDdXJyTnZSYW0tPm5pU2NhbUNvbmY7CisJfQorCWVsc2V7CisJICAgU2NhbUZsZyA9IChVQ0hBUikgdXRpbEVFUmVhZChpb3BvcnQsIFNDQU1fQ09ORklHLzIpOworCX0KKwkKKworICAgQnVzTWFzdGVySW5pdChpb3BvcnQpOworICAgWGJvd0luaXQoaW9wb3J0LCBTY2FtRmxnKTsKKworI2lmIGRlZmluZWQgKE5PX0JJT1NfT1BUSU9OKQorCisKKyAgIGlmIChEaWFnWGJvdyhpb3BvcnQpKSByZXR1cm4oRkFJTFVSRSk7CisgICBpZiAoRGlhZ0J1c01hc3Rlcihpb3BvcnQpKSByZXR1cm4oRkFJTFVSRSk7CisKKyNlbmRpZiAgLyogTm8gQklPUyBPcHRpb24gKi8KKworICAgYXV0b0xvYWREZWZhdWx0TWFwKGlvcG9ydCk7CisKKworICAgZm9yIChpID0gMCxpZCA9IDB4MDE7IGkgIT0gcENhcmRJbmZvLT5haV9pZDsgaSsrLGlkIDw8PSAxKXt9CisKKyAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX3NlbGZpZF8wLCBpZCk7CisgICBXUl9IQVJQT09OKGlvcG9ydCtocF9zZWxmaWRfMSwgMHgwMCk7CisgICBXUl9IQVJQT09OKGlvcG9ydCtocF9hcmJfaWQsIHBDYXJkSW5mby0+YWlfaWQpOworICAgQ3VyckNhcmQtPm91cklkID0gKHVuc2lnbmVkIGNoYXIpIHBDYXJkSW5mby0+YWlfaWQ7CisKKyAgIGkgPSAodTA4Yml0cykgcENhcmRJbmZvLT5haV9zdGF0ZWluZm87CisgICBpZiAoaSAmIFNDU0lfUEFSSVRZX0VOQSkKKyAgICAgICBXUl9IQVJQT09OKGlvcG9ydCtocF9wb3J0Y3RybF8xLChIT1NUX01PREU4IHwgQ0hLX1NDU0lfUCkpOworCisgICBqID0gKFJEX0hBUlBPT04oaW9wb3J0K2hwX2JtX2N0cmwpICYgflNDU0lfVEVSTV9FTkFfTCk7CisgICBpZiAoaSAmIExPV19CWVRFX1RFUk1fRU5BKQorICAgICAgaiB8PSBTQ1NJX1RFUk1fRU5BX0w7CisgICBXUl9IQVJQT09OKGlvcG9ydCtocF9ibV9jdHJsLCBqKTsKKworICAgaiA9IChSRF9IQVJQT09OKGlvcG9ydCtocF9lZV9jdHJsKSAmIH5TQ1NJX1RFUk1fRU5BX0gpOworICAgaWYgKGkgJiBISUdIX0JZVEVfVEVSTV9FTkEpCisgICAgICBqIHw9IFNDU0lfVEVSTV9FTkFfSDsKKyAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX2VlX2N0cmwsIGogKTsKKworCisgICBpZiAoIShwQ2FyZEluZm8tPmFpX3N0YXRlaW5mbyAmIE5PX1JFU0VUX0lOX0lOSVQpKSB7CisKKyAgICAgIHNyZXNiKGlvcG9ydCx0aGlzQ2FyZCk7CisKKyAgICAgICAgIHNjaW5pKHRoaXNDYXJkLCAodTA4Yml0cykgcENhcmRJbmZvLT5haV9pZCwgMCk7CisgICAgICB9CisKKworCisgICBpZiAocENhcmRJbmZvLT5haV9zdGF0ZWluZm8gJiBTVVBSRVNTX1VOREVSUlJVTlNfRU5BKQorICAgICAgQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfTk9fRklMVEVSOworCisJaWYocEN1cnJOdlJhbSl7CisJCWlmKHBDdXJyTnZSYW0tPm5pU3lzQ29uZiAmIDB4MTApCisJCQlDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgfD0gRl9HUkVFTl9QQzsKKwl9CisJZWxzZXsKKwkgICBpZiAodXRpbEVFUmVhZChpb3BvcnQsIChTWVNURU1fQ09ORklHLzIpKSAmIEdSRUVOX1BDX0VOQSkKKyAgIAkgICBDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgfD0gRl9HUkVFTl9QQzsKKwl9CisKKwkvKiBTZXQgZ2xvYmFsIGZsYWcgdG8gaW5kaWNhdGUgUmUtTmVnb3RpYXRpb24gdG8gYmUgZG9uZSBvbiBhbGwKKwkJY2tlY2sgY29uZGl0aW9uICovCisJaWYocEN1cnJOdlJhbSl7CisJCWlmKHBDdXJyTnZSYW0tPm5pU2NzaUNvbmYgJiAweDA0KQorCQkJQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfRE9fUkVORUdPOworCX0KKwllbHNleworCSAgIGlmICh1dGlsRUVSZWFkKGlvcG9ydCwgKFNDU0lfQ09ORklHLzIpKSAmIFJFTkVHT19FTkEpCisgICAJICAgQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfRE9fUkVORUdPOworCX0KKworCWlmKHBDdXJyTnZSYW0peworCQlpZihwQ3Vyck52UmFtLT5uaVNjc2lDb25mICYgMHgwOCkKKwkJCUN1cnJDYXJkLT5nbG9iYWxGbGFncyB8PSBGX0NPTkxVTl9JTzsKKwl9CisJZWxzZXsKKwkgICBpZiAodXRpbEVFUmVhZChpb3BvcnQsIChTQ1NJX0NPTkZJRy8yKSkgJiBDT05OSU9fRU5BKQorICAgCSAgIEN1cnJDYXJkLT5nbG9iYWxGbGFncyB8PSBGX0NPTkxVTl9JTzsKKwl9CisKKyAgIHRlbXAgPSBwQ2FyZEluZm8tPmFpX3Blcl90YXJnX25vX2Rpc2M7CisKKyAgIGZvciAoaSA9IDAsaWQgPSAxOyBpIDwgTUFYX1NDU0lfVEFSOyBpKyssIGlkIDw8PSAxKSB7CisKKyAgICAgIGlmICh0ZW1wICYgaWQpCisgICAgICAgICBzY2NiTWdyVGJsW3RoaXNDYXJkXVtpXS5UYXJTdGF0dXMgfD0gVEFSX0FMTE9XX0RJU0M7CisgICAgICB9CisKKyAgIHN5bmNfYml0X21hcCA9IDB4MDAwMTsKKworICAgZm9yIChpZCA9IDA7IGlkIDwgKE1BWF9TQ1NJX1RBUi8yKTsgaWQrKyl7CisKKwkJaWYocEN1cnJOdlJhbSl7CisJCQl0ZW1wID0gKFVTSE9SVCkgcEN1cnJOdlJhbS0+bmlTeW5jVGJsW2lkXTsKKwkJCXRlbXAgPSAoKHRlbXAgJiAweDAzKSArICgodGVtcCA8PCA0KSAmIDB4YzApKSArCisJCQkJCSAoKCh0ZW1wIDw8IDQpICYgMHgwMzAwKSArICgodGVtcCA8PCA4KSAmIDB4YzAwMCkpOworCQl9ZWxzZQorCSAgICAgIHRlbXAgPSB1dGlsRUVSZWFkKGlvcG9ydCwgKHUxNmJpdHMpKChTWU5DX1JBVEVfVEJMLzIpK2lkKSk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyB0ZW1wID4+PTgsaSsrKXsKKworICAgICAgICAgaWYgKHBDYXJkSW5mby0+YWlfcGVyX3RhcmdfaW5pdF9zeW5jICYgc3luY19iaXRfbWFwKXsKKworICAgICAgICAgICAgc2NjYk1nclRibFt0aGlzQ2FyZF1baWQqMitpXS5UYXJFRVZhbHVlID0gKHUwOGJpdHMpdGVtcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzY2NiTWdyVGJsW3RoaXNDYXJkXVtpZCoyK2ldLlRhclN0YXR1cyB8PSBTWU5DX1NVUFBPUlRFRDsKKyAgICAgICAgICAgIHNjY2JNZ3JUYmxbdGhpc0NhcmRdW2lkKjIraV0uVGFyRUVWYWx1ZSA9CisgICAgICAgICAgICAgICAodTA4Yml0cykodGVtcCAmIH5FRV9TWU5DX01BU0spOworICAgICAgICAgICAgfQorCisjaWYgZGVmaW5lZChXSURFX1NDU0kpCisvKiAgICAgICAgIGlmICgocENhcmRJbmZvLT5haV9wZXJfdGFyZ193aWRlX25lZ28gJiBzeW5jX2JpdF9tYXApIHx8CisgICAgICAgICAgICAoaWQqMitpID49IDgpKXsKKyovCisgICAgICAgICBpZiAocENhcmRJbmZvLT5haV9wZXJfdGFyZ193aWRlX25lZ28gJiBzeW5jX2JpdF9tYXApeworCisgICAgICAgICAgICBzY2NiTWdyVGJsW3RoaXNDYXJkXVtpZCoyK2ldLlRhckVFVmFsdWUgfD0gRUVfV0lERV9TQ1NJOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgeyAvKiBOQVJST1cgU0NTSSAqLworICAgICAgICAgICAgc2NjYk1nclRibFt0aGlzQ2FyZF1baWQqMitpXS5UYXJTdGF0dXMgfD0gV0lERV9ORUdPQ0lBVEVEOworICAgICAgICAgICAgfQorCisjZWxzZQorICAgICAgICAgc2NjYk1nclRibFt0aGlzQ2FyZF1baWQqMitpXS5UYXJTdGF0dXMgfD0gV0lERV9ORUdPQ0lBVEVEOworI2VuZGlmCisKKworICAgICAgICAgc3luY19iaXRfbWFwIDw8PSAxOworICAgICAgICAgfQorICAgICAgfQorCisKKyAgIHBDYXJkSW5mby0+YWlfU0dMaXN0Rm9ybWF0PTB4MDE7CisgICBwQ2FyZEluZm8tPmFpX0RhdGFQdHJGb3JtYXQ9MHgwMTsKKyAgIHBDYXJkSW5mby0+YWlfQUVOX21hc2sgJj0gU0NTSV9SRVNFVF9DT01QTEVURTsKKworICAgV1JfSEFSUE9PTigoaW9wb3J0K2hwX3NlbWFwaG9yZSksCisgICAgICAodTA4Yml0cykoUkRfSEFSUE9PTigoaW9wb3J0K2hwX3NlbWFwaG9yZSkpIHwgU0NDQl9NR1JfUFJFU0VOVCkpOworCisgICByZXR1cm4oKHUzMmJpdHMpQ3VyckNhcmQpOworCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogYnVpbGRfdWNiLCBleHBvcnRlZCB0byBCVURJIHZpYSBVQ0JNZ3JfYnVpbGRfdWNiIGVudHJ5CisgKgorICogRGVzY3JpcHRpb246IHByZXBhcmUgZncgcG9ydGlvbiBvZiB1Y2IuIGRvIG5vdCBzdGFydCwgcmVzb3VyY2Ugbm90IGd1YXJhbnRlZWQKKyAqICAgICAgICAgICAgIHNvIGRvbid0IG1hbmlwdWxhdGUgYW55dGhpbmcgdGhhdCdzIGRlcml2ZWQgZnJvbSBzdGF0ZXMgd2hpY2gKKyAqICAgICAgICAgICAgIG1heSBjaGFuZ2UKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGJ1aWxkX1VDQihDQVJEX0hBTkRMRSBwQ3VyckNhcmQsIFBVQ0IgcF91Y2IpCit7CisKKyAgIHUwOGJpdHMgdGhpc0NhcmQ7CisgICB1MDhiaXRzIGksajsKKworICAgUFNDQ0IgcF9zY2NiOworCisKKyAgIHRoaXNDYXJkID0gKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmNhcmRJbmRleDsKKworCisgICBwX3NjY2I9KFBTQ0NCKXBfdWNiLT5VQ0JfTWdyUHJpdmF0ZVB0cjsKKworCisgICBwX3NjY2ItPlNjY2JfdWNiX3B0cj1wX3VjYjsKKworICAgc3dpdGNoIChwX3VjYi0+VUNCX29wY29kZSAmIChPUENfREVWSUNFX1JFU0VUK09QQ19YRkVSX1NHK09QQ19DSEtfUkVTSURVQUwpKQorICAgeworICAgICAgY2FzZSBPUENfREVWSUNFX1JFU0VUOgorICAgICAgICAgcF9zY2NiLT5PcGVyYXRpb25Db2RlPVJFU0VUX0NPTU1BTkQ7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDX1hGRVJfU0c6CisgICAgICAgICBwX3NjY2ItPk9wZXJhdGlvbkNvZGU9U0NBVFRFUl9HQVRIRVJfQ09NTUFORDsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENfWEZFUl9TRytPUENfQ0hLX1JFU0lEVUFMOgorICAgICAgICAgcF9zY2NiLT5PcGVyYXRpb25Db2RlPVJFU0lEVUFMX1NHX0NPTU1BTkQ7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDX0NIS19SRVNJRFVBTDoKKworCSAgICAgIHBfc2NjYi0+T3BlcmF0aW9uQ29kZT1SRVNJRFVBTF9DT01NQU5EOworCSAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKwkgICAgICBwX3NjY2ItPk9wZXJhdGlvbkNvZGU9U0NTSV9JTklUSUFUT1JfQ09NTUFORDsKKwkgICAgICBicmVhazsKKyAgIH0KKworICAgaWYgKHBfdWNiLT5VQ0Jfb3Bjb2RlICYgT1BDX1RRX0VOQUJMRSkKKyAgIHsKKyAgICAgIHBfc2NjYi0+Q29udHJvbEJ5dGUgPSAodTA4Yml0cykoKHBfdWNiLT5VQ0Jfb3Bjb2RlICYgT1BDX1RRX01BU0spPj4yKSB8IEZfVVNFX0NNRF9ROworICAgfQorICAgZWxzZQorICAgeworICAgICAgcF9zY2NiLT5Db250cm9sQnl0ZSA9IDA7CisgICB9CisKKworICAgcF9zY2NiLT5DZGJMZW5ndGggPSAodTA4Yml0cylwX3VjYi0+VUNCX2NkYmxlbjsKKworICAgaWYgKHBfdWNiLT5VQ0Jfb3Bjb2RlICYgT1BDX05PX0FVVE9fU0VOU0UpCisgICB7CisgICAgICBwX3NjY2ItPlJlcXVlc3RTZW5zZUxlbmd0aCA9IDA7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBwX3NjY2ItPlJlcXVlc3RTZW5zZUxlbmd0aCA9ICh1bnNpZ25lZCBjaGFyKSBwX3VjYi0+VUNCX3NlbnNlbGVuOworICAgfQorCisKKyAgIGlmIChwX3VjYi0+VUNCX29wY29kZSAmIE9QQ19YRkVSX1NHKQorICAgeworICAgICAgcF9zY2NiLT5EYXRhUG9pbnRlcj1wX3VjYi0+VUNCX3ZpcnRfZGF0YXB0cjsKKyAgICAgIHBfc2NjYi0+RGF0YUxlbmd0aCA9ICgoKHUzMmJpdHMpcF91Y2ItPlVDQl9OdW1TZ0VsZW1lbnRzKTw8Myk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBwX3NjY2ItPkRhdGFQb2ludGVyPXBfdWNiLT5VQ0JfcGh5c19kYXRhcHRyOworICAgICAgcF9zY2NiLT5EYXRhTGVuZ3RoPXBfdWNiLT5VQ0JfZGF0YWxlbjsKKyAgIH07CisKKyAgIHBfc2NjYi0+SG9zdFN0YXR1cz0wOworICAgcF9zY2NiLT5UYXJnZXRTdGF0dXM9MDsKKyAgIHBfc2NjYi0+VGFyZ0lEPSh1bnNpZ25lZCBjaGFyKXBfdWNiLT5VQ0JfdGFyZ2lkOworICAgcF9zY2NiLT5MdW49KHVuc2lnbmVkIGNoYXIpIHBfdWNiLT5VQ0JfbHVuOworICAgcF9zY2NiLT5TY2NiSU9Qb3J0PSgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmlvUG9ydDsKKworICAgaj1wX3VjYi0+VUNCX2NkYmxlbjsKKyAgIGZvciAoaT0wO2k8ajtpKyspCisgICB7CisgICAgICBwX3NjY2ItPkNkYltpXSA9IHBfdWNiLT5VQ0JfY2RiW2ldOworICAgfQorCisgICBwX3NjY2ItPlNlbnNlUG9pbnRlcj1wX3VjYi0+VUNCX3BoeXNfc2Vuc2VwdHI7CisKKyAgIHNpbml0cyhwX3NjY2IsdGhpc0NhcmQpOworCit9CisjaWZuZGVmIE5PX0lPQ1RMUworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBHZXREZXZTeW5jUmF0ZQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1NUQVRJQyAgaW50IEdldERldlN5bmNSYXRlKFBTQ0NCY2FyZCBwQ3VyckNhcmQsUFVDQiBwX3VjYikKK3sKKwlzdHJ1Y3QgX1NZTkNfUkFURV9JTkZPICogcFN5bmNTdHI7CisgICBQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CisJQkFTRV9QT1JUIGlvcG9ydDsKKwl1MDhiaXRzIHNjc2lJRCwgajsKKworI2lmIChGV19UWVBFICE9IF9TQ0NCX01HUl8pCisJaWYoIHBfdWNiLT5VQ0JfdGFyZ2lkID49IHBDdXJyQ2FyZC0+Y2FyZEluZm8tPmFpX01heFRhcmcgKQorCXsKKwkJcmV0dXJuKDEpOworCX0KKyNlbmRpZgorCisJaW9wb3J0ICA9IHBDdXJyQ2FyZC0+aW9Qb3J0OworCXBTeW5jU3RyCT0gKHN0cnVjdCBfU1lOQ19SQVRFX0lORk8gKikgcF91Y2ItPlVDQl92aXJ0X2RhdGFwdHI7CisJc2NzaUlEID0gKHUwOGJpdHMpIHBfdWNiLT5VQ0JfdGFyZ2lkOworICAgY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcEN1cnJDYXJkLT5jYXJkSW5kZXhdW3Njc2lJRF07CisJaiA9IGN1cnJUYXJfSW5mby0+VGFyU3luY0N0cmw7CisKKwlzd2l0Y2ggKGN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSAmIEVFX1NZTkNfTUFTSykKKwl7CisJCWNhc2UgRUVfU1lOQ19BU1lOQzoKKwkJCXBTeW5jU3RyLT5SZXF1ZXN0TWVnYVhmZXJSYXRlID0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIEVFX1NZTkNfNU1COgorCQkJcFN5bmNTdHItPlJlcXVlc3RNZWdhWGZlclJhdGUgPSAoaiAmIE5BUlJPV19TQ1NJKSA/IDUwIDogMTAwOworCQkJYnJlYWs7CisJCWNhc2UgRUVfU1lOQ18xME1COgorCQkJcFN5bmNTdHItPlJlcXVlc3RNZWdhWGZlclJhdGUgPSAoaiAmIE5BUlJPV19TQ1NJKSA/IDEwMCA6IDIwMDsKKwkJCWJyZWFrOworCQljYXNlIEVFX1NZTkNfMjBNQjoKKwkJCXBTeW5jU3RyLT5SZXF1ZXN0TWVnYVhmZXJSYXRlID0gKGogJiBOQVJST1dfU0NTSSkgPyAyMDAgOiA0MDA7CisJCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKChqID4+IDUpICYgMHgwNykKKwl7CisJCWNhc2UgMHgwMDoKKwkJCWlmKChqICYgMHgwNykgPT0gMHgwMCkKKwkJCXsKKwkJCQlwU3luY1N0ci0+QWN0dWFsTWVnYVhmZXJSYXRlID0gMHgwMDsJLyogQXN5bmMgTW9kZSAqLworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBTeW5jU3RyLT5BY3R1YWxNZWdhWGZlclJhdGUgPSAoaiAmIE5BUlJPV19TQ1NJKSA/IDIwMCA6IDQwMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDB4MDE6CisJCQlwU3luY1N0ci0+QWN0dWFsTWVnYVhmZXJSYXRlID0gKGogJiBOQVJST1dfU0NTSSkgPyAxMDAgOiAyMDA7CisJCQlicmVhazsKKwkJY2FzZSAweDAyOgorCQkJcFN5bmNTdHItPkFjdHVhbE1lZ2FYZmVyUmF0ZSA9IChqICYgTkFSUk9XX1NDU0kpID8gNjYgOiAxMjI7CisJCQlicmVhazsKKwkJY2FzZSAweDAzOgorCQkJcFN5bmNTdHItPkFjdHVhbE1lZ2FYZmVyUmF0ZSA9IChqICYgTkFSUk9XX1NDU0kpID8gNTAgOiAxMDA7CisJCQlicmVhazsKKwkJY2FzZSAweDA0OgorCQkJcFN5bmNTdHItPkFjdHVhbE1lZ2FYZmVyUmF0ZSA9IChqICYgTkFSUk9XX1NDU0kpID8gNDAgOiA4MDsKKwkJCWJyZWFrOworCQljYXNlIDB4MDU6CisJCQlwU3luY1N0ci0+QWN0dWFsTWVnYVhmZXJSYXRlID0gKGogJiBOQVJST1dfU0NTSSkgPyAzMyA6IDY2OworCQkJYnJlYWs7CisJCWNhc2UgMHgwNjoKKwkJCXBTeW5jU3RyLT5BY3R1YWxNZWdhWGZlclJhdGUgPSAoaiAmIE5BUlJPV19TQ1NJKSA/IDI4IDogNTY7CisJCQlicmVhazsKKwkJY2FzZSAweDA3OgorCQkJcFN5bmNTdHItPkFjdHVhbE1lZ2FYZmVyUmF0ZSA9IChqICYgTkFSUk9XX1NDU0kpID8gMjUgOiA1MDsKKwkJCWJyZWFrOworCX0KKwlwU3luY1N0ci0+TmVnb3RpYXRlZE9mZnNldCA9IGogJiAweDBmOworCisJcmV0dXJuKDApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBTZXREZXZTeW5jUmF0ZQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1NUQVRJQyBpbnQgU2V0RGV2U3luY1JhdGUoUFNDQ0JjYXJkIHBDdXJyQ2FyZCwgUFVDQiBwX3VjYikKK3sKKwlzdHJ1Y3QgX1NZTkNfUkFURV9JTkZPICogcFN5bmNTdHI7CisgICBQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CisJQkFTRV9QT1JUIGlvUG9ydDsKKwl1MDhiaXRzIHNjc2lJRCwgaSwgaiwgc3luY1ZhbDsKKwl1MTZiaXRzIHN5bmNPZmZzZXQsIGFjdHVhbFhmZXJSYXRlOworCXVuaW9uIHsKKwkJdTA4Yml0cyB0ZW1wYlsyXTsKKwkJdTE2Yml0cyB0ZW1wdzsKKwl9dGVtcDI7CisKKyNpZiAoRldfVFlQRSAhPSBfU0NDQl9NR1JfKQorCWlmKCBwX3VjYi0+VUNCX3RhcmdpZCA+PSBwQ3VyckNhcmQtPmNhcmRJbmZvLT5haV9NYXhUYXJnICkKKwl7CisJCXJldHVybigxKTsKKwl9CisjZW5kaWYKKworCWlvUG9ydCAgPSBwQ3VyckNhcmQtPmlvUG9ydDsKKwlwU3luY1N0cgk9IChzdHJ1Y3QgX1NZTkNfUkFURV9JTkZPICopIHBfdWNiLT5VQ0JfdmlydF9kYXRhcHRyOworCXNjc2lJRCA9ICh1MDhiaXRzKSBwX3VjYi0+VUNCX3RhcmdpZDsKKyAgIGN1cnJUYXJfSW5mbyA9ICZzY2NiTWdyVGJsW3BDdXJyQ2FyZC0+Y2FyZEluZGV4XVtzY3NpSURdOworCWkgPSBSRF9IQVJQT09OKGlvUG9ydCtocF94ZmVyX3BhZCk7CQkvKiBTYXZlIGN1cnJlbnQgdmFsdWUgKi8KKwlXUl9IQVJQT09OKGlvUG9ydCtocF94ZmVyX3BhZCwgKGkgfCBJRF9VTkxPQ0spKTsKKwlXUl9IQVJQT09OKGlvUG9ydCtocF9zZWxlY3RfaWQsICgoc2NzaUlEIDw8IDQpIHwgc2NzaUlEKSk7CisJaiA9IFJEX0hBUlBPT04oaW9Qb3J0K2hwX3N5bmN0YXJnXzApOworCVdSX0hBUlBPT04oaW9Qb3J0K2hwX3hmZXJfcGFkLCBpKTsJCS8qIHJlc3RvcmUgdmFsdWUgKi8KKworCWFjdHVhbFhmZXJSYXRlID0gcFN5bmNTdHItPkFjdHVhbE1lZ2FYZmVyUmF0ZTsKKwlpZighKGogJiBOQVJST1dfU0NTSSkpCisJeworCQlhY3R1YWxYZmVyUmF0ZSA8PD0gMTsKKwl9CisJaWYoYWN0dWFsWGZlclJhdGUgPT0gMHgwMCkKKwl7CisJCXN5bmNWYWwgPSBFRV9TWU5DX0FTWU5DOwkJCS8qIEFzeW5jIE1vZGUgKi8KKwl9CisJaWYoYWN0dWFsWGZlclJhdGUgPT0gMHgwMjAwKQorCXsKKwkJc3luY1ZhbCA9IEVFX1NZTkNfMjBNQjsJCQkJLyogMjAvNDAgTUIgTW9kZSAqLworCX0KKwlpZihhY3R1YWxYZmVyUmF0ZSA+IDB4MDA1MCAmJiBhY3R1YWxYZmVyUmF0ZSA8IDB4MDIwMCApCisJeworCQlzeW5jVmFsID0gRUVfU1lOQ18xME1COwkJCQkvKiAxMC8yMCBNQiBNb2RlICovCisJfQorCWVsc2UKKwl7CisJCXN5bmNWYWwgPSBFRV9TWU5DXzVNQjsJCQkJLyogNS8xMCBNQiBNb2RlICovCisJfQorCWlmKGN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSAmJiBFRV9TWU5DX01BU0sgPT0gc3luY1ZhbCkKKwkJcmV0dXJuKDApOworCWN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSA9IChjdXJyVGFyX0luZm8tPlRhckVFVmFsdWUgJiAhRUVfU1lOQ19NQVNLKQorCQkJCQkJCQkJCQl8IHN5bmNWYWw7CisJc3luY09mZnNldCA9IChTWU5DX1JBVEVfVEJMICsgc2NzaUlEKSAvIDI7CisJdGVtcDIudGVtcHcgPSB1dGlsRUVSZWFkKGlvUG9ydCwgc3luY09mZnNldCk7CisJaWYoc2NzaUlEICYgMHgwMSkKKwl7CisJCXRlbXAyLnRlbXBiWzBdID0gKHRlbXAyLnRlbXBiWzBdICYgIUVFX1NZTkNfTUFTSykgfCBzeW5jVmFsOworCX0KKwllbHNlCisJeworCQl0ZW1wMi50ZW1wYlsxXSA9ICh0ZW1wMi50ZW1wYlsxXSAmICFFRV9TWU5DX01BU0spIHwgc3luY1ZhbDsKKwl9CisJdXRpbEVFV3JpdGVPbk9mZihpb1BvcnQsIDEpOworCXV0aWxFRVdyaXRlKGlvUG9ydCwgdGVtcDIudGVtcHcsIHN5bmNPZmZzZXQpOworCXV0aWxFRVdyaXRlT25PZmYoaW9Qb3J0LCAwKTsKKwlVcGRhdGVDaGVja1N1bShpb1BvcnQpOworCisJcmV0dXJuKDApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogR2V0RGV2V2lkZU1vZGUKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgR2V0RGV2V2lkZU1vZGUoUFNDQ0JjYXJkIHBDdXJyQ2FyZCxQVUNCIHBfdWNiKQoreworCXUwOGJpdHMgKnBEYXRhOworCisJcERhdGEgPSAodTA4Yml0cyAqKXBfdWNiLT5VQ0JfdmlydF9kYXRhcHRyOworCWlmKHNjY2JNZ3JUYmxbcEN1cnJDYXJkLT5jYXJkSW5kZXhdW3BfdWNiLT5VQ0JfdGFyZ2lkXS5UYXJFRVZhbHVlCisJCQkJJiBFRV9XSURFX1NDU0kpCisJeworCQkqcERhdGEgPSAxOworCX0KKwllbHNlCisJeworCQkqcERhdGEgPSAwOworCX0KKworCXJldHVybigwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogU2V0RGV2V2lkZU1vZGUKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgU2V0RGV2V2lkZU1vZGUoUFNDQ0JjYXJkIHBDdXJyQ2FyZCxQVUNCIHBfdWNiKQoreworCXUwOGJpdHMgKnBEYXRhOworICAgUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworCUJBU0VfUE9SVCBpb1BvcnQ7CisJdTA4Yml0cyBzY3NpSUQsIHNjc2lXaWRlTW9kZTsKKwl1MTZiaXRzIHN5bmNPZmZzZXQ7CisJdW5pb24geworCQl1MDhiaXRzIHRlbXBiWzJdOworCQl1MTZiaXRzIHRlbXB3OworCX10ZW1wMjsKKworI2lmIChGV19UWVBFICE9IF9TQ0NCX01HUl8pCisJaWYoICEocEN1cnJDYXJkLT5jYXJkSW5mby0+YWlfYXR0cmlidXRlcyAmIFdJREVfQ0FQQUJMRSkgKQorCXsKKwkJcmV0dXJuKDEpOworCX0KKworCWlmKCBwX3VjYi0+VUNCX3RhcmdpZCA+PSBwQ3VyckNhcmQtPmNhcmRJbmZvLT5haV9NYXhUYXJnICkKKwl7CisJCXJldHVybigxKTsKKwl9CisjZW5kaWYKKworCWlvUG9ydCAgPSBwQ3VyckNhcmQtPmlvUG9ydDsKKwlwRGF0YSA9ICh1MDhiaXRzICopcF91Y2ItPlVDQl92aXJ0X2RhdGFwdHI7CisJc2NzaUlEID0gKHUwOGJpdHMpIHBfdWNiLT5VQ0JfdGFyZ2lkOworCWN1cnJUYXJfSW5mbyA9ICZzY2NiTWdyVGJsW3BDdXJyQ2FyZC0+Y2FyZEluZGV4XVtzY3NpSURdOworCisJaWYoKnBEYXRhKQorCXsKKwkJaWYoY3VyclRhcl9JbmZvLT5UYXJFRVZhbHVlICYgRUVfV0lERV9TQ1NJKQorCQl7CisJCQlyZXR1cm4oMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzY3NpV2lkZU1vZGUgPSBFRV9XSURFX1NDU0k7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYoIShjdXJyVGFyX0luZm8tPlRhckVFVmFsdWUgJiBFRV9XSURFX1NDU0kpKQorCQl7CisJCQlyZXR1cm4oMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzY3NpV2lkZU1vZGUgPSAwOworCQl9CisJfQorCWN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSA9IChjdXJyVGFyX0luZm8tPlRhckVFVmFsdWUgJiAhRUVfV0lERV9TQ1NJKQorCQkJCQkJCQkJCQl8IHNjc2lXaWRlTW9kZTsKKworCXN5bmNPZmZzZXQgPSAoU1lOQ19SQVRFX1RCTCArIHNjc2lJRCkgLyAyOworCXRlbXAyLnRlbXB3ID0gdXRpbEVFUmVhZChpb1BvcnQsIHN5bmNPZmZzZXQpOworCWlmKHNjc2lJRCAmIDB4MDEpCisJeworCQl0ZW1wMi50ZW1wYlswXSA9ICh0ZW1wMi50ZW1wYlswXSAmICFFRV9XSURFX1NDU0kpIHwgc2NzaVdpZGVNb2RlOworCX0KKwllbHNlCisJeworCQl0ZW1wMi50ZW1wYlsxXSA9ICh0ZW1wMi50ZW1wYlsxXSAmICFFRV9XSURFX1NDU0kpIHwgc2NzaVdpZGVNb2RlOworCX0KKwl1dGlsRUVXcml0ZU9uT2ZmKGlvUG9ydCwgMSk7CisJdXRpbEVFV3JpdGUoaW9Qb3J0LCB0ZW1wMi50ZW1wdywgc3luY09mZnNldCk7CisJdXRpbEVFV3JpdGVPbk9mZihpb1BvcnQsIDApOworCVVwZGF0ZUNoZWNrU3VtKGlvUG9ydCk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFJlYWROVlJhbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgUmVhZE5WUmFtKFBTQ0NCY2FyZCBwQ3VyckNhcmQsUFVDQiBwX3VjYikKK3sKKwl1MDhiaXRzICpwZGF0YTsKKwl1MTZiaXRzIGksbnVtd3JkcyxudW1ieXRlcyxvZmZzZXQsdGVtcDsKKwl1MDhiaXRzIE9uZU1vcmUgPSBGQUxTRTsKKyNpZiBkZWZpbmVkKERPUykKKwl1MTZiaXRzIGlvcG9ydDsKKyNlbHNlCisJdTMyYml0cyBpb3BvcnQ7CisjZW5kaWYKKworCW51bWJ5dGVzID0gKHUxNmJpdHMpIHBfdWNiLT5VQ0JfZGF0YWxlbjsKKwlpb3BvcnQgID0gcEN1cnJDYXJkLT5pb1BvcnQ7CisgICBwZGF0YSAgID0gKHUwOGJpdHMgKikgcF91Y2ItPlVDQl92aXJ0X2RhdGFwdHI7CisJb2Zmc2V0ICA9ICh1MTZiaXRzKSAocF91Y2ItPlVDQl9JT0NUTFBhcmFtc1swXSk7CisKKworCisgICBpZiAob2Zmc2V0ICYgMHgxKQorCXsKKwkgICAgKigodTE2Yml0cyopIHBkYXRhKSA9IHV0aWxFRVJlYWQoaW9wb3J0LCh1MTZiaXRzKSgob2Zmc2V0IC0gMSkgLyAyKSk7IC8qIDE2IGJpdCByZWFkICovCisJCSAqcGRhdGEgPSAqKHBkYXRhICsgMSk7CisJCSArK29mZnNldDsKKyAgIAkgKytwZGF0YTsKKwkJIC0tbnVtYnl0ZXM7CisJfQorCisJbnVtd3JkcyA9IG51bWJ5dGVzIC8gMjsKKwlpZiAobnVtYnl0ZXMgJiAxKQorCSAJT25lTW9yZSA9IFRSVUU7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtd3JkczsgaSsrKQorCXsKKyAgIAkqKCh1MTZiaXRzKikgcGRhdGEpID0gdXRpbEVFUmVhZChpb3BvcnQsKHUxNmJpdHMpKG9mZnNldCAvIDIpKTsKKwkJcGRhdGEgKz0gMjsKKwkJb2Zmc2V0ICs9IDI7CisgICB9CisJaWYgKE9uZU1vcmUpCisJeworCQktLXBkYXRhOworCQktLSBvZmZzZXQ7CisgICAJdGVtcCA9IHV0aWxFRVJlYWQoaW9wb3J0LCh1MTZiaXRzKShvZmZzZXQgLyAyKSk7CisJCSpwZGF0YSA9ICh1MDhiaXRzKSAodGVtcCk7CisJfQorCit9IC8qIGVuZCBwcm9jIFJlYWROVlJhbSAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFdyaXRlTlZSYW0KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIFdyaXRlTlZSYW0oUFNDQ0JjYXJkIHBDdXJyQ2FyZCxQVUNCIHBfdWNiKQoreworCXUwOGJpdHMgKnBkYXRhOworCXUxNmJpdHMgaSxudW13cmRzLG51bWJ5dGVzLG9mZnNldCwgZWVwcm9tX2VuZDsKKwl1MDhiaXRzIE9uZU1vcmUgPSBGQUxTRTsKKwl1bmlvbiB7CisJCXUwOGJpdHMgIHRlbXBiWzJdOworCQl1MTZiaXRzICB0ZW1wdzsKKwl9IHRlbXAyOworCisjaWYgZGVmaW5lZChET1MpCisJdTE2Yml0cyBpb3BvcnQ7CisjZWxzZQorCXUzMmJpdHMgaW9wb3J0OworI2VuZGlmCisKKwludW1ieXRlcyA9ICh1MTZiaXRzKSBwX3VjYi0+VUNCX2RhdGFsZW47CisJaW9wb3J0ICA9IHBDdXJyQ2FyZC0+aW9Qb3J0OworICAgcGRhdGEgICA9ICh1MDhiaXRzICopIHBfdWNiLT5VQ0JfdmlydF9kYXRhcHRyOworCW9mZnNldCAgPSAodTE2Yml0cykgKHBfdWNiLT5VQ0JfSU9DVExQYXJhbXNbMF0pOworCisgICBpZiAoUkRfSEFSUE9PTihpb3BvcnQraHBfcGFnZV9jdHJsKSAmIE5BUlJPV19TQ1NJX0NBUkQpCisgICAgICBlZXByb21fZW5kID0gNTEyOworICAgZWxzZQorICAgICAgZWVwcm9tX2VuZCA9IDc2ODsKKwkKKwlpZihvZmZzZXQgPiBlZXByb21fZW5kKQorCQlyZXR1cm47CisKKwlpZigob2Zmc2V0ICsgbnVtYnl0ZXMpID4gZWVwcm9tX2VuZCkKKwkJbnVtYnl0ZXMgPSBlZXByb21fZW5kIC0gb2Zmc2V0OworCisgICAgdXRpbEVFV3JpdGVPbk9mZihpb3BvcnQsMSk7ICAgLyogRW5hYmxlIHdyaXRlIGFjY2VzcyB0byB0aGUgRUVQUk9NICovCisKKworCisgICBpZiAob2Zmc2V0ICYgMHgxKQorCXsKKwkgICAgdGVtcDIudGVtcHcgPSB1dGlsRUVSZWFkKGlvcG9ydCwodTE2Yml0cykoKG9mZnNldCAtIDEpIC8gMikpOyAvKiAxNiBiaXQgcmVhZCAqLworCQkgdGVtcDIudGVtcGJbMV0gPSAqcGRhdGE7CisJICAgIHV0aWxFRVdyaXRlKGlvcG9ydCwgdGVtcDIudGVtcHcsICh1MTZiaXRzKSgob2Zmc2V0IC0xKSAvIDIpKTsKKwkJICpwZGF0YSA9ICoocGRhdGEgKyAxKTsKKwkJICsrb2Zmc2V0OworICAgCSArK3BkYXRhOworCQkgLS1udW1ieXRlczsKKwl9CisKKwludW13cmRzID0gbnVtYnl0ZXMgLyAyOworCWlmIChudW1ieXRlcyAmIDEpCisJIAlPbmVNb3JlID0gVFJVRTsKKworCWZvciAoaSA9IDA7IGkgPCBudW13cmRzOyBpKyspCisJeworICAgCXV0aWxFRVdyaXRlKGlvcG9ydCwgKigocHUxNmJpdHMpcGRhdGEpLCh1MTZiaXRzKShvZmZzZXQgLyAyKSk7CisJCXBkYXRhICs9IDI7CisJCW9mZnNldCArPSAyOworICAgfQorCWlmIChPbmVNb3JlKQorCXsKKworICAgCXRlbXAyLnRlbXB3ID0gdXRpbEVFUmVhZChpb3BvcnQsKHUxNmJpdHMpKG9mZnNldCAvIDIpKTsKKwkJdGVtcDIudGVtcGJbMF0gPSAqcGRhdGE7CisgICAJdXRpbEVFV3JpdGUoaW9wb3J0LCB0ZW1wMi50ZW1wdywgKHUxNmJpdHMpKG9mZnNldCAvIDIpKTsKKwl9CisgICB1dGlsRUVXcml0ZU9uT2ZmKGlvcG9ydCwwKTsgICAvKiBUdXJuIG9mZiB3cml0ZSBhY2Nlc3MgKi8KKyAgIFVwZGF0ZUNoZWNrU3VtKCh1MzJiaXRzKWlvcG9ydCk7CisKK30gLyogZW5kIHByb2MgV3JpdGVOVlJhbSAqLworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogVXBkYXRlQ2hlY2tTdW0KKyAqCisgKiBEZXNjcmlwdGlvbjogVXBkYXRlIENoZWNrIFN1bSBpbiBFRVBST00KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwordm9pZCBVcGRhdGVDaGVja1N1bSh1MzJiaXRzIGJhc2Vwb3J0KQoreworCVVTSE9SVCBpLHN1bV9kYXRhLCBlZXByb21fZW5kOworCisJc3VtX2RhdGEgPSAweDAwMDA7CisKKworICAgaWYgKFJEX0hBUlBPT04oYmFzZXBvcnQraHBfcGFnZV9jdHJsKSAmIE5BUlJPV19TQ1NJX0NBUkQpCisgICAgICBlZXByb21fZW5kID0gNTEyOworICAgZWxzZQorICAgICAgZWVwcm9tX2VuZCA9IDc2ODsKKworCWZvciAoaSA9IDE7IGkgPCBlZXByb21fZW5kLzI7IGkrKykKKwl7CisJCXN1bV9kYXRhICs9IHV0aWxFRVJlYWQoYmFzZXBvcnQsIGkpOworCX0KKworICAgdXRpbEVFV3JpdGVPbk9mZihiYXNlcG9ydCwxKTsgICAvKiBFbmFibGUgd3JpdGUgYWNjZXNzIHRvIHRoZSBFRVBST00gKi8KKworICAgdXRpbEVFV3JpdGUoYmFzZXBvcnQsIHN1bV9kYXRhLCBFRVBST01fQ0hFQ0tfU1VNLzIpOworICAgdXRpbEVFV3JpdGVPbk9mZihiYXNlcG9ydCwwKTsgICAvKiBUdXJuIG9mZiB3cml0ZSBhY2Nlc3MgKi8KK30KKwordm9pZCBTY2NiTWdyX3NhdmVfZm9yZWlnbl9zdGF0ZShQQURBUFRFUl9JTkZPIHBBZGFwdGVySW5mbykKK3sKK30KKworCit2b2lkIFNjY2JNZ3JfcmVzdG9yZV9mb3JlaWduX3N0YXRlKENBUkRfSEFORExFIHBDdXJyQ2FyZCkKK3sKK30KKwordm9pZCBTY2NiTWdyX3Jlc3RvcmVfbmF0aXZlX3N0YXRlKENBUkRfSEFORExFIHBDdXJyQ2FyZCkKK3sKK30KKworI2VuZGlmIC8qIE5PX0lPQ1RMUyAqLworCisjZW5kaWYgLyogKEZXX1RZUEU9PV9VQ0JfTUdSXykgICAqLworCisjaWZuZGVmIE5PX0lPQ1RMUworI2lmIChGV19UWVBFPT1fVUNCX01HUl8pCit2b2lkIFNjY2JNZ3JfdW5sb2FkX2NhcmQoQ0FSRF9IQU5ETEUgcEN1cnJDYXJkKQorI2Vsc2UKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgU2NjYk1ncl91bmxvYWRfY2FyZChVU0hPUlQgcEN1cnJDYXJkKQorI2Vsc2UKK3ZvaWQgU2NjYk1ncl91bmxvYWRfY2FyZChVTE9ORyBwQ3VyckNhcmQpCisjZW5kaWYKKyNlbmRpZgoreworCVVDSEFSIGk7CisjaWYgZGVmaW5lZChET1MpCisJVVNIT1JUIHBvcnRCYXNlOworCVVTSE9SVCByZWdPZmZzZXQ7CisjZWxzZQorCVVMT05HIHBvcnRCYXNlOworCVVMT05HIHJlZ09mZnNldDsKKyNlbmRpZgorCVVMT05HIHNjYW1EYXRhOworI2lmIGRlZmluZWQoT1MyKQorCVVMT05HIGZhciAqcFNjYW1UYmw7CisjZWxzZQorCVVMT05HICpwU2NhbVRibDsKKyNlbmRpZgorCVBOVlJhbUluZm8gcEN1cnJOdlJhbTsKKworCXBDdXJyTnZSYW0gPSAoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLT5wTnZSYW1JbmZvOworCisJaWYocEN1cnJOdlJhbSl7CisJCVdyU3RhY2socEN1cnJOdlJhbS0+bmlCYXNlQWRkciwgMCwgcEN1cnJOdlJhbS0+bmlNb2RlbCk7CisJCVdyU3RhY2socEN1cnJOdlJhbS0+bmlCYXNlQWRkciwgMSwgcEN1cnJOdlJhbS0+bmlTeXNDb25mKTsKKwkJV3JTdGFjayhwQ3Vyck52UmFtLT5uaUJhc2VBZGRyLCAyLCBwQ3Vyck52UmFtLT5uaVNjc2lDb25mKTsKKwkJV3JTdGFjayhwQ3Vyck52UmFtLT5uaUJhc2VBZGRyLCAzLCBwQ3Vyck52UmFtLT5uaVNjYW1Db25mKTsKKwkJV3JTdGFjayhwQ3Vyck52UmFtLT5uaUJhc2VBZGRyLCA0LCBwQ3Vyck52UmFtLT5uaUFkYXBJZCk7CisKKwkJZm9yKGkgPSAwOyBpIDwgTUFYX1NDU0lfVEFSIC8gMjsgaSsrKQorCQkJV3JTdGFjayhwQ3Vyck52UmFtLT5uaUJhc2VBZGRyLCAoVUNIQVIpKGkrNSksIHBDdXJyTnZSYW0tPm5pU3luY1RibFtpXSk7CisKKwkJcG9ydEJhc2UgPSBwQ3Vyck52UmFtLT5uaUJhc2VBZGRyOworCisJCWZvcihpID0gMDsgaSA8IE1BWF9TQ1NJX1RBUjsgaSsrKXsKKwkJCXJlZ09mZnNldCA9IGhwX2FyYW1CYXNlICsgNjQgKyBpKjQ7CisjaWYgZGVmaW5lZChPUzIpCisJCQlwU2NhbVRibCA9IChVTE9ORyBmYXIgKikgJnBDdXJyTnZSYW0tPm5pU2NhbVRibFtpXTsKKyNlbHNlCisJCQlwU2NhbVRibCA9IChVTE9ORyAqKSAmcEN1cnJOdlJhbS0+bmlTY2FtVGJsW2ldOworI2VuZGlmCisJCQlzY2FtRGF0YSA9ICpwU2NhbVRibDsKKwkJCVdSX0hBUlAzMihwb3J0QmFzZSwgcmVnT2Zmc2V0LCBzY2FtRGF0YSk7CisJCX0KKworCX1lbHNleworCQlXclN0YWNrKCgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmlvUG9ydCwgMCwgMCk7CisJfQorfQorI2VuZGlmIC8qIE5PX0lPQ1RMUyAqLworCisKK3ZvaWQgUk5WUmFtRGF0YShQTlZSYW1JbmZvIHBOdlJhbUluZm8pCit7CisJVUNIQVIgaTsKKyNpZiBkZWZpbmVkKERPUykKKwlVU0hPUlQgcG9ydEJhc2U7CisJVVNIT1JUIHJlZ09mZnNldDsKKyNlbHNlCisJVUxPTkcgcG9ydEJhc2U7CisJVUxPTkcgcmVnT2Zmc2V0OworI2VuZGlmCisJVUxPTkcgc2NhbURhdGE7CisjaWYgZGVmaW5lZCAoT1MyKQorCVVMT05HIGZhciAqcFNjYW1UYmw7CisjZWxzZQorCVVMT05HICpwU2NhbVRibDsKKyNlbmRpZgorCisJcE52UmFtSW5mby0+bmlNb2RlbCAgICA9IFJkU3RhY2socE52UmFtSW5mby0+bmlCYXNlQWRkciwgMCk7CisJcE52UmFtSW5mby0+bmlTeXNDb25mICA9IFJkU3RhY2socE52UmFtSW5mby0+bmlCYXNlQWRkciwgMSk7CisJcE52UmFtSW5mby0+bmlTY3NpQ29uZiA9IFJkU3RhY2socE52UmFtSW5mby0+bmlCYXNlQWRkciwgMik7CisJcE52UmFtSW5mby0+bmlTY2FtQ29uZiA9IFJkU3RhY2socE52UmFtSW5mby0+bmlCYXNlQWRkciwgMyk7CisJcE52UmFtSW5mby0+bmlBZGFwSWQgICA9IFJkU3RhY2socE52UmFtSW5mby0+bmlCYXNlQWRkciwgNCk7CisKKwlmb3IoaSA9IDA7IGkgPCBNQVhfU0NTSV9UQVIgLyAyOyBpKyspCisJCXBOdlJhbUluZm8tPm5pU3luY1RibFtpXSA9IFJkU3RhY2socE52UmFtSW5mby0+bmlCYXNlQWRkciwgKFVDSEFSKShpKzUpKTsKKworCXBvcnRCYXNlID0gcE52UmFtSW5mby0+bmlCYXNlQWRkcjsKKworCWZvcihpID0gMDsgaSA8IE1BWF9TQ1NJX1RBUjsgaSsrKXsKKwkJcmVnT2Zmc2V0ID0gaHBfYXJhbUJhc2UgKyA2NCArIGkqNDsKKwkJUkRfSEFSUDMyKHBvcnRCYXNlLCByZWdPZmZzZXQsIHNjYW1EYXRhKTsKKyNpZiBkZWZpbmVkKE9TMikKKwkJcFNjYW1UYmwgPSAoVUxPTkcgZmFyICopICZwTnZSYW1JbmZvLT5uaVNjYW1UYmxbaV07CisjZWxzZQorCQlwU2NhbVRibCA9IChVTE9ORyAqKSAmcE52UmFtSW5mby0+bmlTY2FtVGJsW2ldOworI2VuZGlmCisJCSpwU2NhbVRibCA9IHNjYW1EYXRhOworCX0KKworfQorCisjaWYgZGVmaW5lZChET1MpCitVQ0hBUiBSZFN0YWNrKFVTSE9SVCBwb3J0QmFzZSwgVUNIQVIgaW5kZXgpCisjZWxzZQorVUNIQVIgUmRTdGFjayhVTE9ORyBwb3J0QmFzZSwgVUNIQVIgaW5kZXgpCisjZW5kaWYKK3sKKwlXUl9IQVJQT09OKHBvcnRCYXNlICsgaHBfc3RhY2tfYWRkciwgaW5kZXgpOworCXJldHVybihSRF9IQVJQT09OKHBvcnRCYXNlICsgaHBfc3RhY2tfZGF0YSkpOworfQorCisjaWYgZGVmaW5lZChET1MpCit2b2lkIFdyU3RhY2soVVNIT1JUIHBvcnRCYXNlLCBVQ0hBUiBpbmRleCwgVUNIQVIgZGF0YSkKKyNlbHNlCit2b2lkIFdyU3RhY2soVUxPTkcgcG9ydEJhc2UsIFVDSEFSIGluZGV4LCBVQ0hBUiBkYXRhKQorI2VuZGlmCit7CisJV1JfSEFSUE9PTihwb3J0QmFzZSArIGhwX3N0YWNrX2FkZHIsIGluZGV4KTsKKwlXUl9IQVJQT09OKHBvcnRCYXNlICsgaHBfc3RhY2tfZGF0YSwgZGF0YSk7Cit9CisKKworI2lmIChGV19UWVBFPT1fVUNCX01HUl8pCit1MDhiaXRzIENoa0lmQ2hpcEluaXRpYWxpemVkKEJBU0VfUE9SVCBpb1BvcnQpCisjZWxzZQorI2lmIGRlZmluZWQoRE9TKQorVUNIQVIgQ2hrSWZDaGlwSW5pdGlhbGl6ZWQoVVNIT1JUIGlvUG9ydCkKKyNlbHNlCitVQ0hBUiBDaGtJZkNoaXBJbml0aWFsaXplZChVTE9ORyBpb1BvcnQpCisjZW5kaWYKKyNlbmRpZgoreworCWlmKChSRF9IQVJQT09OKGlvUG9ydCArIGhwX2FyYl9pZCkgJiAweDBmKSAhPSBSZFN0YWNrKGlvUG9ydCwgNCkpCisJCXJldHVybihGQUxTRSk7CisJaWYoKFJEX0hBUlBPT04oaW9Qb3J0ICsgaHBfY2xrY3RybF8wKSAmIENMS0NUUkxfREVGQVVMVCkKKwkJCQkJCQkJIT0gQ0xLQ1RSTF9ERUZBVUxUKQorCQlyZXR1cm4oRkFMU0UpOworCWlmKChSRF9IQVJQT09OKGlvUG9ydCArIGhwX3NlbHRpbWVvdXQpID09IFRPXzI1MG1zKSB8fAorCQkoUkRfSEFSUE9PTihpb1BvcnQgKyBocF9zZWx0aW1lb3V0KSA9PSBUT18yOTBtcykpCisJCXJldHVybihUUlVFKTsKKwlyZXR1cm4oRkFMU0UpOworCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBTY2NiTWdyX3N0YXJ0X3NjY2IKKyAqCisgKiBEZXNjcmlwdGlvbjogU3RhcnQgYSBjb21tYW5kIHBvaW50ZWQgdG8gYnkgcF9TY2NiLiBXaGVuIHRoZQorICogICAgICAgICAgICAgIGNvbW1hbmQgaXMgY29tcGxldGVkIGl0IHdpbGwgYmUgcmV0dXJuZWQgdmlhIHRoZQorICogICAgICAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAoRldfVFlQRT09X1VDQl9NR1JfKQordm9pZCBTY2NiTWdyX3N0YXJ0X3NjY2IoQ0FSRF9IQU5ETEUgcEN1cnJDYXJkLCBQVUNCIHBfdWNiKQorI2Vsc2UKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgU2NjYk1ncl9zdGFydF9zY2NiKFVTSE9SVCBwQ3VyckNhcmQsIFBTQ0NCIHBfU2NjYikKKyNlbHNlCit2b2lkIFNjY2JNZ3Jfc3RhcnRfc2NjYihVTE9ORyBwQ3VyckNhcmQsIFBTQ0NCIHBfU2NjYikKKyNlbmRpZgorI2VuZGlmCit7CisjaWYgZGVmaW5lZChET1MpCisgICBVU0hPUlQgaW9wb3J0OworI2Vsc2UKKyAgIFVMT05HIGlvcG9ydDsKKyNlbmRpZgorICAgVUNIQVIgdGhpc0NhcmQsIGx1bjsKKwlQU0NDQiBwU2F2ZVNjY2I7CisgICBDQUxMX0JLX0ZOIGNhbGxiYWNrOworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKyAgIFBTQ0NCIHBfU2NjYjsKKyNlbmRpZgorCisgICBtT1NfTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7CisgICB0aGlzQ2FyZCA9ICgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQpLT5jYXJkSW5kZXg7CisgICBpb3BvcnQgPSAoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+aW9Qb3J0OworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKyAgIHBfU2NjYiA9IChQU0NDQilwX3VjYi0+VUNCX01nclByaXZhdGVQdHI7CisjZW5kaWYKKworCWlmKChwX1NjY2ItPlRhcmdJRCA+IE1BWF9TQ1NJX1RBUikgfHwgKHBfU2NjYi0+THVuID4gTUFYX0xVTikpCisJeworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKwkJcF91Y2ItPlVDQl9oYmFzdGF0ID0gU0NDQl9DT01QTEVURTsKKwkJcF91Y2ItPlVDQl9zdGF0dXM9U0NDQl9FUlJPUjsKKwkJY2FsbGJhY2sgPSAoQ0FMTF9CS19GTilwX3VjYi0+VUNCX2NhbGxiYWNrOworCQlpZiAoY2FsbGJhY2spCisJCQljYWxsYmFjayhwX3VjYik7CisjZW5kaWYKKworI2lmIChGV19UWVBFPT1fU0NDQl9NR1JfKQorCQlwX1NjY2ItPkhvc3RTdGF0dXMgPSBTQ0NCX0NPTVBMRVRFOworCQlwX1NjY2ItPlNjY2JTdGF0dXMgPSBTQ0NCX0VSUk9SOworCQljYWxsYmFjayA9IChDQUxMX0JLX0ZOKXBfU2NjYi0+U2NjYkNhbGxiYWNrOworCQlpZiAoY2FsbGJhY2spCisJCQljYWxsYmFjayhwX1NjY2IpOworI2VuZGlmCisKKwkJbU9TX1VuTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7CisJCXJldHVybjsKKwl9CisKKyNpZiAoRldfVFlQRT09X1NDQ0JfTUdSXykKKyAgIHNpbml0cyhwX1NjY2IsdGhpc0NhcmQpOworI2VuZGlmCisKKworI2lmIChGV19UWVBFPT1fVUNCX01HUl8pCisjaWZuZGVmIE5PX0lPQ1RMUworCisgICBpZiAocF91Y2ItPlVDQl9vcGNvZGUgJiBPUENfSU9DVEwpCisJeworCisJCXN3aXRjaCAocF91Y2ItPlVDQl9JT0NUTENvbW1hbmQpIAorCQl7CisJCQljYXNlIFJFQURfTlZSQU06CisJCQkJUmVhZE5WUmFtKChQU0NDQmNhcmQpcEN1cnJDYXJkLHBfdWNiKTsKKwkJCQlwX3VjYi0+VUNCX3N0YXR1cz1VQ0JfU1VDQ0VTUzsKKwkJCQljYWxsYmFjayA9IChDQUxMX0JLX0ZOKXBfdWNiLT5VQ0JfY2FsbGJhY2s7CisJCQkJaWYgKGNhbGxiYWNrKQorCQkJCQljYWxsYmFjayhwX3VjYik7CisJCQkJbU9TX1VuTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7CisJCQkJcmV0dXJuOworCisJCQljYXNlIFdSSVRFX05WUkFNOgorCQkJCVdyaXRlTlZSYW0oKFBTQ0NCY2FyZClwQ3VyckNhcmQscF91Y2IpOworCQkJCXBfdWNiLT5VQ0Jfc3RhdHVzPVVDQl9TVUNDRVNTOworCQkJCWNhbGxiYWNrID0gKENBTExfQktfRk4pcF91Y2ItPlVDQl9jYWxsYmFjazsKKwkJCQlpZiAoY2FsbGJhY2spCisJCQkJCWNhbGxiYWNrKHBfdWNiKTsKKwkJCQltT1NfVW5Mb2NrKChQU0NDQmNhcmQpcEN1cnJDYXJkKTsKKwkJCQlyZXR1cm47CisKKwkJCWNhc2UgU0VORF9TQ1NJX1BBU1NUSFJVOgorI2lmIChGV19UWVBFICE9IF9TQ0NCX01HUl8pCisJCQkJaWYoIHBfdWNiLT5VQ0JfdGFyZ2lkID49CisJCQkJICAgICgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmNhcmRJbmZvLT5haV9NYXhUYXJnICkKKwkJCQl7CisJCQkJCXBfdWNiLT5VQ0Jfc3RhdHVzID0gVUNCX0VSUk9SOworCQkJCQlwX3VjYi0+VUNCX2hiYXN0YXQgPSBIQVNUQVRfSFdfRVJST1I7CisJCQkJCWNhbGxiYWNrID0gKENBTExfQktfRk4pcF91Y2ItPlVDQl9jYWxsYmFjazsKKwkJCQkJaWYgKGNhbGxiYWNrKQorCQkJCQkJY2FsbGJhY2socF91Y2IpOworCQkJCQltT1NfVW5Mb2NrKChQU0NDQmNhcmQpcEN1cnJDYXJkKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKyNlbmRpZgorCQkJCWJyZWFrOworCisJCQljYXNlIEhBUkRfUkVTRVQ6CisJCQkJcF91Y2ItPlVDQl9zdGF0dXMgPSBVQ0JfSU5WQUxJRDsKKwkJCQljYWxsYmFjayA9IChDQUxMX0JLX0ZOKXBfdWNiLT5VQ0JfY2FsbGJhY2s7CisJCQkJaWYgKGNhbGxiYWNrKQorCQkJCQljYWxsYmFjayhwX3VjYik7CisJCQkJbU9TX1VuTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHRVRfREVWSUNFX1NZTkNSQVRFOgorCQkJCWlmKCAhR2V0RGV2U3luY1JhdGUoKFBTQ0NCY2FyZClwQ3VyckNhcmQscF91Y2IpICkKKwkJCQl7CisJCQkJCXBfdWNiLT5VQ0Jfc3RhdHVzID0gVUNCX1NVQ0NFU1M7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBfdWNiLT5VQ0Jfc3RhdHVzID0gVUNCX0VSUk9SOworCQkJCQlwX3VjYi0+VUNCX2hiYXN0YXQgPSBIQVNUQVRfSFdfRVJST1I7CisJCQkJfQorCQkJCWNhbGxiYWNrID0gKENBTExfQktfRk4pcF91Y2ItPlVDQl9jYWxsYmFjazsKKwkJCQlpZiAoY2FsbGJhY2spCisJCQkJCWNhbGxiYWNrKHBfdWNiKTsKKwkJCQltT1NfVW5Mb2NrKChQU0NDQmNhcmQpcEN1cnJDYXJkKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFNFVF9ERVZJQ0VfU1lOQ1JBVEU6CisJCQkJaWYoICFTZXREZXZTeW5jUmF0ZSgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCxwX3VjYikgKQorCQkJCXsKKwkJCQkJcF91Y2ItPlVDQl9zdGF0dXMgPSBVQ0JfU1VDQ0VTUzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcF91Y2ItPlVDQl9zdGF0dXMgPSBVQ0JfRVJST1I7CisJCQkJCXBfdWNiLT5VQ0JfaGJhc3RhdCA9IEhBU1RBVF9IV19FUlJPUjsKKwkJCQl9CisJCQkJY2FsbGJhY2sgPSAoQ0FMTF9CS19GTilwX3VjYi0+VUNCX2NhbGxiYWNrOworCQkJCWlmIChjYWxsYmFjaykKKwkJCQkJY2FsbGJhY2socF91Y2IpOworCQkJCW1PU19VbkxvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR0VUX1dJREVfTU9ERToKKwkJCQlpZiggIUdldERldldpZGVNb2RlKChQU0NDQmNhcmQpcEN1cnJDYXJkLHBfdWNiKSApCisJCQkJeworCQkJCQlwX3VjYi0+VUNCX3N0YXR1cyA9IFVDQl9TVUNDRVNTOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwX3VjYi0+VUNCX3N0YXR1cyA9IFVDQl9FUlJPUjsKKwkJCQkJcF91Y2ItPlVDQl9oYmFzdGF0ID0gSEFTVEFUX0hXX0VSUk9SOworCQkJCX0KKwkJCQljYWxsYmFjayA9IChDQUxMX0JLX0ZOKXBfdWNiLT5VQ0JfY2FsbGJhY2s7CisJCQkJaWYgKGNhbGxiYWNrKQorCQkJCQljYWxsYmFjayhwX3VjYik7CisJCQkJbU9TX1VuTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTRVRfV0lERV9NT0RFOgorCQkJCWlmKCAhU2V0RGV2V2lkZU1vZGUoKFBTQ0NCY2FyZClwQ3VyckNhcmQscF91Y2IpICkKKwkJCQl7CisJCQkJCXBfdWNiLT5VQ0Jfc3RhdHVzID0gVUNCX1NVQ0NFU1M7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBfdWNiLT5VQ0Jfc3RhdHVzID0gVUNCX0VSUk9SOworCQkJCQlwX3VjYi0+VUNCX2hiYXN0YXQgPSBIQVNUQVRfSFdfRVJST1I7CisJCQkJfQorCQkJCWNhbGxiYWNrID0gKENBTExfQktfRk4pcF91Y2ItPlVDQl9jYWxsYmFjazsKKwkJCQlpZiAoY2FsbGJhY2spCisJCQkJCWNhbGxiYWNrKHBfdWNiKTsKKwkJCQltT1NfVW5Mb2NrKChQU0NDQmNhcmQpcEN1cnJDYXJkKTsKKwkJCQlyZXR1cm47CisJCQlkZWZhdWx0OgorCQkJCXBfdWNiLT5VQ0Jfc3RhdHVzPVVDQl9JTlZBTElEOworCQkJCWNhbGxiYWNrID0gKENBTExfQktfRk4pcF91Y2ItPlVDQl9jYWxsYmFjazsKKwkJCQlpZiAoY2FsbGJhY2spCisJCQkJCWNhbGxiYWNrKHBfdWNiKTsKKwkJCQltT1NfVW5Mb2NrKChQU0NDQmNhcmQpcEN1cnJDYXJkKTsKKwkJCQlyZXR1cm47CisJCX0KKwl9CisjZW5kaWYgLyogTk9fSU9DVExTICovCisjZW5kaWYgLyogKEZXX1RZUEU9PV9VQ0JfTUdSXykgKi8KKworCisgICBpZiAoISgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQpLT5jbWRDb3VudGVyKQorICAgICAgeworICAgICAgV1JfSEFSUE9PTihpb3BvcnQraHBfc2VtYXBob3JlLCAoUkRfSEFSUE9PTihpb3BvcnQraHBfc2VtYXBob3JlKQorICAgICAgICAgfCBTQ0NCX01HUl9BQ1RJVkUpKTsKKworICAgICAgaWYgKCgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQpLT5nbG9iYWxGbGFncyAmIEZfR1JFRU5fUEMpCisgICAgICAgICB7CisJCSBXUl9IQVJQT09OKGlvcG9ydCtocF9jbGtjdHJsXzAsIENMS0NUUkxfREVGQVVMVCk7CisJCSBXUl9IQVJQT09OKGlvcG9ydCtocF9zeXNfY3RybCwgMHgwMCk7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmNtZENvdW50ZXIrKzsKKworICAgaWYgKFJEX0hBUlBPT04oaW9wb3J0K2hwX3NlbWFwaG9yZSkgJiBCSU9TX0lOX1VTRSkgeworCisgICAgICBXUl9IQVJQT09OKGlvcG9ydCtocF9zZW1hcGhvcmUsIChSRF9IQVJQT09OKGlvcG9ydCtocF9zZW1hcGhvcmUpCisgICAgICAgICB8IFRJQ0tMRV9NRSkpOworCQlpZihwX1NjY2ItPk9wZXJhdGlvbkNvZGUgPT0gUkVTRVRfQ09NTUFORCkKKwkJCXsKKwkJCQlwU2F2ZVNjY2IgPSAoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+Y3VycmVudFNDQ0I7CisJCQkJKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmN1cnJlbnRTQ0NCID0gcF9TY2NiOworCQkJCXF1ZXVlU2VsZWN0RmFpbCgmQkxfQ2FyZFt0aGlzQ2FyZF0sIHRoaXNDYXJkKTsKKwkJCQkoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+Y3VycmVudFNDQ0IgPSBwU2F2ZVNjY2I7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkgICAgICBxdWV1ZUFkZFNjY2IocF9TY2NiLHRoaXNDYXJkKTsKKwkJCX0KKyAgICAgIH0KKworICAgZWxzZSBpZiAoKFJEX0hBUlBPT04oaW9wb3J0K2hwX3BhZ2VfY3RybCkgJiBHX0lOVF9ESVNBQkxFKSkgeworCisJCQlpZihwX1NjY2ItPk9wZXJhdGlvbkNvZGUgPT0gUkVTRVRfQ09NTUFORCkKKwkJCQl7CisJCQkJCXBTYXZlU2NjYiA9ICgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQpLT5jdXJyZW50U0NDQjsKKwkJCQkJKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmN1cnJlbnRTQ0NCID0gcF9TY2NiOworCQkJCQlxdWV1ZVNlbGVjdEZhaWwoJkJMX0NhcmRbdGhpc0NhcmRdLCB0aGlzQ2FyZCk7CisJCQkJCSgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQpLT5jdXJyZW50U0NDQiA9IHBTYXZlU2NjYjsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkgICAgICBxdWV1ZUFkZFNjY2IocF9TY2NiLHRoaXNDYXJkKTsKKwkJCQl9CisgICAgICB9CisKKyAgIGVsc2UgeworCisgICAgICBNRElTQUJMRV9JTlQoaW9wb3J0KTsKKworCQlpZigoKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmdsb2JhbEZsYWdzICYgRl9DT05MVU5fSU8pICYmIAorCQkJKChzY2NiTWdyVGJsW3RoaXNDYXJkXVtwX1NjY2ItPlRhcmdJRF0uVGFyU3RhdHVzICYgVEFSX1RBR19RX01BU0spICE9IFRBR19RX1RSWUlORykpCisJCQlsdW4gPSBwX1NjY2ItPkx1bjsKKwkJZWxzZQorCQkJbHVuID0gMDsKKyAgICAgIGlmICgoKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmN1cnJlbnRTQ0NCID09IE5VTEwpICYmCisgICAgICAgICAoc2NjYk1nclRibFt0aGlzQ2FyZF1bcF9TY2NiLT5UYXJnSURdLlRhclNlbFFfQ250ID09IDApICYmCisgICAgICAgICAoc2NjYk1nclRibFt0aGlzQ2FyZF1bcF9TY2NiLT5UYXJnSURdLlRhckxVTkJ1c3lbbHVuXQorICAgICAgICAgPT0gRkFMU0UpKSB7CisKKyAgICAgICAgICAgICgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQpLT5jdXJyZW50U0NDQiA9IHBfU2NjYjsKKwkJCSAgIG1PU19VbkxvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworI2lmIGRlZmluZWQoRE9TKQorICAgICAgICAgICAgc3NlbCgoVVNIT1JUKXBfU2NjYi0+U2NjYklPUG9ydCx0aGlzQ2FyZCk7CisjZWxzZQorCSAgICBzc2VsKHBfU2NjYi0+U2NjYklPUG9ydCx0aGlzQ2FyZCk7CisjZW5kaWYKKwkJCSAgIG1PU19Mb2NrKChQU0NDQmNhcmQpcEN1cnJDYXJkKTsKKyAgICAgICAgIH0KKworICAgICAgZWxzZSB7CisKKwkJCWlmKHBfU2NjYi0+T3BlcmF0aW9uQ29kZSA9PSBSRVNFVF9DT01NQU5EKQorCQkJCXsKKwkJCQkJcFNhdmVTY2NiID0gKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmN1cnJlbnRTQ0NCOworCQkJCQkoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+Y3VycmVudFNDQ0IgPSBwX1NjY2I7CisJCQkJCXF1ZXVlU2VsZWN0RmFpbCgmQkxfQ2FyZFt0aGlzQ2FyZF0sIHRoaXNDYXJkKTsKKwkJCQkJKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmN1cnJlbnRTQ0NCID0gcFNhdmVTY2NiOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJICAgICAgICAgCXF1ZXVlQWRkU2NjYihwX1NjY2IsdGhpc0NhcmQpOworCQkJCX0KKyAgICAgICAgIH0KKworCisgICAgICBNRU5BQkxFX0lOVChpb3BvcnQpOworICAgICAgfQorCisgICBtT1NfVW5Mb2NrKChQU0NDQmNhcmQpcEN1cnJDYXJkKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBTY2NiTWdyX2Fib3J0X3NjY2IKKyAqCisgKiBEZXNjcmlwdGlvbjogQWJvcnQgdGhlIGNvbW1hbmQgcG9pbnRlZCB0byBieSBwX1NjY2IuICBXaGVuIHRoZQorICogICAgICAgICAgICAgIGNvbW1hbmQgaXMgY29tcGxldGVkIGl0IHdpbGwgYmUgcmV0dXJuZWQgdmlhIHRoZQorICogICAgICAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAoRldfVFlQRT09X1VDQl9NR1JfKQorczMyYml0cyBTY2NiTWdyX2Fib3J0X3NjY2IoQ0FSRF9IQU5ETEUgcEN1cnJDYXJkLCBQVUNCIHBfdWNiKQorI2Vsc2UKKyNpZiBkZWZpbmVkKERPUykKK2ludCBTY2NiTWdyX2Fib3J0X3NjY2IoVVNIT1JUIHBDdXJyQ2FyZCwgUFNDQ0IgcF9TY2NiKQorI2Vsc2UKK2ludCBTY2NiTWdyX2Fib3J0X3NjY2IoVUxPTkcgcEN1cnJDYXJkLCBQU0NDQiBwX1NjY2IpCisjZW5kaWYKKyNlbmRpZgorCit7CisjaWYgZGVmaW5lZChET1MpCisJVVNIT1JUIGlvcG9ydDsKKyNlbHNlCisJVUxPTkcgaW9wb3J0OworI2VuZGlmCisKKwlVQ0hBUiB0aGlzQ2FyZDsKKwlDQUxMX0JLX0ZOIGNhbGxiYWNrOworCVVDSEFSIFRJRDsKKwlQU0NDQiBwU2F2ZVNDQ0I7CisJUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworCisKKyNpZiAoRldfVFlQRT09X1VDQl9NR1JfKQorCVBTQ0NCICAgIHBfU2NjYjsKKwlwX1NjY2I9KFBTQ0NCKXBfdWNiLT5VQ0JfTWdyUHJpdmF0ZVB0cjsKKyNlbmRpZgorCisJaW9wb3J0ID0gKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmlvUG9ydDsKKworCXRoaXNDYXJkID0gKChQU0NDQmNhcmQpcEN1cnJDYXJkKS0+Y2FyZEluZGV4OworCisJbU9TX0xvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworCisJaWYgKFJEX0hBUlBPT04oaW9wb3J0K2hwX3BhZ2VfY3RybCkgJiBHX0lOVF9ESVNBQkxFKQorCXsKKwkJbU9TX1VuTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7CisJfQorCisJZWxzZQorCXsKKworCQlpZiAocXVldWVGaW5kU2NjYihwX1NjY2IsdGhpc0NhcmQpKQorCQl7CisKKwkJCW1PU19VbkxvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworCisJCQkoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLT5jbWRDb3VudGVyLS07CisKKwkJCWlmICghKChQU0NDQmNhcmQpcEN1cnJDYXJkKS0+Y21kQ291bnRlcikKKwkJCQlXUl9IQVJQT09OKGlvcG9ydCtocF9zZW1hcGhvcmUsKFJEX0hBUlBPT04oaW9wb3J0K2hwX3NlbWFwaG9yZSkKKwkJCQkJJiAoVUNIQVIpKH4oU0NDQl9NR1JfQUNUSVZFIHwgVElDS0xFX01FKSkgKSk7CisKKyNpZiAoRldfVFlQRT09X1NDQ0JfTUdSXykKKwkJCXBfU2NjYi0+U2NjYlN0YXR1cyA9IFNDQ0JfQUJPUlQ7CisJCQljYWxsYmFjayA9IHBfU2NjYi0+U2NjYkNhbGxiYWNrOworCQkJY2FsbGJhY2socF9TY2NiKTsKKyNlbHNlCisJCQlwX3VjYi0+VUNCX3N0YXR1cz1TQ0NCX0FCT1JUOworCQkJY2FsbGJhY2sgPSAoQ0FMTF9CS19GTilwX3VjYi0+VUNCX2NhbGxiYWNrOworCQkJY2FsbGJhY2socF91Y2IpOworI2VuZGlmCisKKwkJCXJldHVybigwKTsKKwkJfQorCisJCWVsc2UKKwkJeworCQkJbU9TX1VuTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7CisKKwkJCWlmICgoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLT5jdXJyZW50U0NDQiA9PSBwX1NjY2IpCisJCQl7CisJCQkJcF9TY2NiLT5TY2NiU3RhdHVzID0gU0NDQl9BQk9SVDsKKwkJCQlyZXR1cm4oMCk7CisKKwkJCX0KKworCQkJZWxzZQorCQkJeworCisJCQkJVElEID0gcF9TY2NiLT5UYXJnSUQ7CisKKworCQkJCWlmKHBfU2NjYi0+U2NjYl90YWcpCisJCQkJeworCQkJCQlNRElTQUJMRV9JTlQoaW9wb3J0KTsKKwkJCQkJaWYgKCgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQpLT5kaXNjUV9UYmxbcF9TY2NiLT5TY2NiX3RhZ109PXBfU2NjYikKKwkJCQkJeworCQkJCQkJcF9TY2NiLT5TY2NiU3RhdHVzID0gU0NDQl9BQk9SVDsKKwkJCQkJCXBfU2NjYi0+U2NjYl9zY3Npc3RhdCA9IEFCT1JUX1NUOworI2lmIChGV19UWVBFPT1fVUNCX01HUl8pCisJCQkJCQlwX3VjYi0+VUNCX3N0YXR1cz1TQ0NCX0FCT1JUOworI2VuZGlmCisJCQkJCQlwX1NjY2ItPlNjY2Jfc2NzaW1zZyA9IFNNQUJPUlRfVEFHOworCisJCQkJCQlpZigoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+Y3VycmVudFNDQ0IgPT0gTlVMTCkKKwkJCQkJCXsKKwkJCQkJCQkoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+Y3VycmVudFNDQ0IgPSBwX1NjY2I7CisJCQkJCQkJc3NlbChpb3BvcnQsIHRoaXNDYXJkKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwU2F2ZVNDQ0IgPSAoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+Y3VycmVudFNDQ0I7CisJCQkJCQkJKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmN1cnJlbnRTQ0NCID0gcF9TY2NiOworCQkJCQkJCXF1ZXVlU2VsZWN0RmFpbCgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQsIHRoaXNDYXJkKTsKKwkJCQkJCQkoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+Y3VycmVudFNDQ0IgPSBwU2F2ZVNDQ0I7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJTUVOQUJMRV9JTlQoaW9wb3J0KTsKKwkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQljdXJyVGFyX0luZm8gPSAmc2NjYk1nclRibFt0aGlzQ2FyZF1bcF9TY2NiLT5UYXJnSURdOworCisJCQkJCWlmKEJMX0NhcmRbdGhpc0NhcmRdLmRpc2NRX1RibFtjdXJyVGFyX0luZm8tPkx1bkRpc2NRX0lkeFtwX1NjY2ItPkx1bl1dIAorCQkJCQkJCT09IHBfU2NjYikKKwkJCQkJeworCQkJCQkJcF9TY2NiLT5TY2NiU3RhdHVzID0gU0NDQl9BQk9SVDsKKwkJCQkJCXJldHVybigwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4oLTEpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFNjY2JNZ3JfbXlfaW50CisgKgorICogRGVzY3JpcHRpb246IERvIGEgcXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgcGVuZGluZworICogICAgICAgICAgICAgIGludGVycnVwdCBmb3IgdGhpcyBjYXJkIGFuZCBkaXNhYmxlIHRoZSBJUlEgUGluIGlmIHNvLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAoRldfVFlQRT09X1VDQl9NR1JfKQordTA4Yml0cyBTY2NiTWdyX215X2ludChDQVJEX0hBTkRMRSBwQ3VyckNhcmQpCisjZWxzZQorI2lmIGRlZmluZWQoRE9TKQorVUNIQVIgU2NjYk1ncl9teV9pbnQoVVNIT1JUIHBDdXJyQ2FyZCkKKyNlbHNlCitVQ0hBUiBTY2NiTWdyX215X2ludChVTE9ORyBwQ3VyckNhcmQpCisjZW5kaWYKKyNlbmRpZgoreworI2lmIGRlZmluZWQoRE9TKQorICAgVVNIT1JUIGlvcG9ydDsKKyNlbHNlCisgICBVTE9ORyBpb3BvcnQ7CisjZW5kaWYKKworICAgaW9wb3J0ID0gKChQU0NDQmNhcmQpcEN1cnJDYXJkKS0+aW9Qb3J0OworCisgICBpZiAoUkRfSEFSUE9PTihpb3BvcnQraHBfaW50X3N0YXR1cykgJiBJTlRfQVNTRVJURUQpCisgICB7CisKKyNpZiBkZWZpbmVkKERPUykKKyAgICAgIE1ESVNBQkxFX0lOVChpb3BvcnQpOworI2VuZGlmCisKKyAgICAgIHJldHVybihUUlVFKTsKKyAgIH0KKworICAgZWxzZQorCisgICAgICByZXR1cm4oRkFMU0UpOworfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogU2NjYk1ncl9pc3IKKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpcyBpcyBvdXIgZW50cnkgcG9pbnQgd2hlbiBhbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkCisgKiAgICAgICAgICAgICAgYnkgdGhlIGNhcmQgYW5kIHRoZSB1cHBlciBsZXZlbCBkcml2ZXIgcGFzc2VzIGl0IG9uIHRvCisgKiAgICAgICAgICAgICAgdXMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIChGV19UWVBFPT1fVUNCX01HUl8pCitzMzJiaXRzIFNjY2JNZ3JfaXNyKENBUkRfSEFORExFIHBDdXJyQ2FyZCkKKyNlbHNlCisjaWYgZGVmaW5lZChET1MpCitpbnQgU2NjYk1ncl9pc3IoVVNIT1JUIHBDdXJyQ2FyZCkKKyNlbHNlCitpbnQgU2NjYk1ncl9pc3IoVUxPTkcgcEN1cnJDYXJkKQorI2VuZGlmCisjZW5kaWYKK3sKKyAgIFBTQ0NCIGN1cnJTQ0NCOworICAgVUNIQVIgdGhpc0NhcmQscmVzdWx0LGJtX3N0YXR1cywgYm1faW50X3N0OworICAgVVNIT1JUIGhwX2ludDsKKyAgIFVDSEFSIGksIHRhcmdldDsKKyNpZiBkZWZpbmVkKERPUykKKyAgIFVTSE9SVCBpb3BvcnQ7CisjZWxzZQorICAgVUxPTkcgaW9wb3J0OworI2VuZGlmCisKKyAgIG1PU19Mb2NrKChQU0NDQmNhcmQpcEN1cnJDYXJkKTsKKworICAgdGhpc0NhcmQgPSAoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLT5jYXJkSW5kZXg7CisgICBpb3BvcnQgPSAoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLT5pb1BvcnQ7CisKKyAgIE1ESVNBQkxFX0lOVChpb3BvcnQpOworCisjaWYgZGVmaW5lZChCVUdCVUcpCisgICBXUl9IQVJQT09OKGlvcG9ydCtocF91c2VyX2RlZmluZWRfRCwgUkRfSEFSUE9PTihpb3BvcnQraHBfaW50X3N0YXR1cykpOworI2VuZGlmCisKKyAgIGlmICgoYm1faW50X3N0PVJEX0hBUlBPT04oaW9wb3J0K2hwX2ludF9zdGF0dXMpKSAmIEVYVF9TVEFUVVNfT04pCisJCWJtX3N0YXR1cyA9IFJEX0hBUlBPT04oaW9wb3J0K2hwX2V4dF9zdGF0dXMpICYgKFVDSEFSKUJBRF9FWFRfU1RBVFVTOworICAgZWxzZQorICAgICAgYm1fc3RhdHVzID0gMDsKKworICAgV1JfSEFSUE9PTihpb3BvcnQraHBfaW50X21hc2ssIChJTlRfQ01EX0NPTVBMIHwgU0NTSV9JTlRFUlJVUFQpKTsKKworICAgbU9TX1VuTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7CisKKyAgIHdoaWxlICgoaHBfaW50ID0gUkRXX0hBUlBPT04oKGlvcG9ydCtocF9pbnRzdGF0KSkgJiBkZWZhdWx0X2ludGVuYSkgfAorCSAgYm1fc3RhdHVzKQorICAgICB7CisKKyAgICAgICBjdXJyU0NDQiA9ICgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmN1cnJlbnRTQ0NCOworCisjaWYgZGVmaW5lZChCVUdCVUcpCisgICBEZWJ1Z19Mb2FkKHRoaXNDYXJkLChVQ0hBUikgMFhGRik7CisgICBEZWJ1Z19Mb2FkKHRoaXNDYXJkLGJtX2ludF9zdCk7CisKKyAgIERlYnVnX0xvYWQodGhpc0NhcmQsaHBfaW50XzApOworICAgRGVidWdfTG9hZCh0aGlzQ2FyZCxocF9pbnRfMSk7CisjZW5kaWYKKworCisgICAgICBpZiAoaHBfaW50ICYgKEZJRk8gfCBUSU1FT1VUIHwgUkVTRVQgfCBTQ0FNX1NFTCkgfHwgYm1fc3RhdHVzKSB7CisgICAgICAgICByZXN1bHQgPSBTY2NiTWdyX2JhZF9pc3IoaW9wb3J0LHRoaXNDYXJkLCgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCksaHBfaW50KTsKKyAgICAgICAgIFdSV19IQVJQT09OKChpb3BvcnQraHBfaW50c3RhdCksIChGSUZPIHwgVElNRU9VVCB8IFJFU0VUIHwgU0NBTV9TRUwpKTsKKyAgICAgICAgIGJtX3N0YXR1cyA9IDA7CisKKyAgICAgICAgIGlmIChyZXN1bHQpIHsKKworCQkJICAgbU9TX0xvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworICAgICAgICAgICAgTUVOQUJMRV9JTlQoaW9wb3J0KTsKKwkJCSAgIG1PU19VbkxvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworICAgICAgICAgICAgcmV0dXJuKHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKworICAgICAgZWxzZSBpZiAoaHBfaW50ICYgSUNNRF9DT01QKSB7CisKKyAgICAgICAgIGlmICggIShocF9pbnQgJiBCVVNfRlJFRSkgKSB7CisgICAgICAgICAgICAvKiBXYWl0IGZvciB0aGUgQnVzRnJlZSBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgY29tbWFuZC4gIFdlCisgICAgICAgICAgICAgICBtdXN0IGFsc28gY2hlY2sgZm9yIGJlaW5nIHJlc2VsZWN0ZWQgc2luY2UgdGhlIEJ1c0ZyZWUKKyAgICAgICAgICAgICAgIG1heSBub3Qgc2hvdyB1cCBpZiBhbm90aGVyIGRldmljZSByZXNlbGVjdHMgdXMgaW4gMS41dXMgb3IKKyAgICAgICAgICAgICAgIGxlc3MuICBTUlIgV2VkbmVzZGF5LCAzLzgvMTk5NS4KKwkgICAgICAgICAqLworCSAgIHdoaWxlICghKFJEV19IQVJQT09OKChpb3BvcnQraHBfaW50c3RhdCkpICYgKEJVU19GUkVFIHwgUlNFTCkpKSA7CisJIH0KKworICAgICAgICAgaWYgKCgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmdsb2JhbEZsYWdzICYgRl9IT1NUX1hGRVJfQUNUKQorCisgICAgICAgICAgICBwaGFzZUNoa0ZpZm8oaW9wb3J0LCB0aGlzQ2FyZCk7CisKKy8qICAgICAgICAgV1JXX0hBUlBPT04oKGlvcG9ydCtocF9pbnRzdGF0KSwKKyAgICAgICAgICAgIChCVVNfRlJFRSB8IElDTURfQ09NUCB8IElUQVJfRElTQyB8IFhGRVJfQ05UXzApKTsKKyAgICAgICAgICovCisKKwkJIFdSV19IQVJQT09OKChpb3BvcnQraHBfaW50c3RhdCksIENMUl9BTExfSU5UXzEpOworCisgICAgICAgICBhdXRvQ21kQ21wbHQoaW9wb3J0LHRoaXNDYXJkKTsKKworICAgICAgICAgfQorCisKKyAgICAgIGVsc2UgaWYgKGhwX2ludCAmIElUQVJfRElTQykKKyAgICAgICAgIHsKKworICAgICAgICAgaWYgKCgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmdsb2JhbEZsYWdzICYgRl9IT1NUX1hGRVJfQUNUKSB7CisKKyAgICAgICAgICAgIHBoYXNlQ2hrRmlmbyhpb3BvcnQsIHRoaXNDYXJkKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICBpZiAoUkRfSEFSUE9PTihpb3BvcnQraHBfZ3BfcmVnXzEpID09IFNNU0FWRV9EQVRBX1BUUikgeworCisgICAgICAgICAgICBXUl9IQVJQT09OKGlvcG9ydCtocF9ncF9yZWdfMSwgMHgwMCk7CisgICAgICAgICAgICBjdXJyU0NDQi0+U2NjYl9YZmVyU3RhdGUgfD0gRl9OT19EQVRBX1lFVDsKKworICAgICAgICAgICAgY3VyclNDQ0ItPlNjY2Jfc2F2ZWRBVEMgPSBjdXJyU0NDQi0+U2NjYl9BVEM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgIGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID0gRElTQ09OTkVDVF9TVDsKKyAgICAgICAgIHF1ZXVlRGlzY29ubmVjdChjdXJyU0NDQix0aGlzQ2FyZCk7CisKKyAgICAgICAgICAgIC8qIFdhaXQgZm9yIHRoZSBCdXNGcmVlIGJlZm9yZSBzdGFydGluZyBhIG5ldyBjb21tYW5kLiAgV2UKKyAgICAgICAgICAgICAgIG11c3QgYWxzbyBjaGVjayBmb3IgYmVpbmcgcmVzZWxlY3RlZCBzaW5jZSB0aGUgQnVzRnJlZQorICAgICAgICAgICAgICAgbWF5IG5vdCBzaG93IHVwIGlmIGFub3RoZXIgZGV2aWNlIHJlc2VsZWN0cyB1cyBpbiAxLjV1cyBvcgorICAgICAgICAgICAgICAgbGVzcy4gIFNSUiBXZWRuZXNkYXksIDMvOC8xOTk1LgorICAgICAgICAgICAgICovCisJICAgd2hpbGUgKCEoUkRXX0hBUlBPT04oKGlvcG9ydCtocF9pbnRzdGF0KSkgJiAoQlVTX0ZSRUUgfCBSU0VMKSkgJiYKKwkJICAhKChSRFdfSEFSUE9PTigoaW9wb3J0K2hwX2ludHN0YXQpKSAmIFBIQVNFKSAmJgorCQkgICAgUkRfSEFSUE9PTigoaW9wb3J0K2hwX3Njc2lzaWcpKSA9PQorCQkgICAgKFNDU0lfQlNZIHwgU0NTSV9SRVEgfCBTQ1NJX0NEIHwgU0NTSV9NU0cgfCBTQ1NJX0lPQklUKSkpIDsKKworCSAgIC8qCisJICAgICBUaGUgYWRkaXRpb25hbCBsb29wIGV4aXQgY29uZGl0aW9uIGFib3ZlIGRldGVjdHMgYSB0aW1pbmcgcHJvYmxlbQorCSAgICAgd2l0aCB0aGUgcmV2aXNpb24gRC9FIGhhcnBvb24gY2hpcHMuICBUaGUgY2FsbGVyIHNob3VsZCByZXNldCB0aGUKKwkgICAgIGhvc3QgYWRhcHRlciB0byByZWNvdmVyIHdoZW4gMHhGRSBpcyByZXR1cm5lZC4KKwkgICAqLworCSAgIGlmICghKFJEV19IQVJQT09OKChpb3BvcnQraHBfaW50c3RhdCkpICYgKEJVU19GUkVFIHwgUlNFTCkpKQorCSAgICAgeworCSAgICAgICBtT1NfTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7CisJICAgICAgIE1FTkFCTEVfSU5UKGlvcG9ydCk7CisJICAgICAgIG1PU19VbkxvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworCSAgICAgICByZXR1cm4gMHhGRTsKKwkgICAgIH0KKworICAgICAgICAgV1JXX0hBUlBPT04oKGlvcG9ydCtocF9pbnRzdGF0KSwgKEJVU19GUkVFIHwgSVRBUl9ESVNDKSk7CisKKworICAgICAgICAgKChQU0NDQmNhcmQpcEN1cnJDYXJkKS0+Z2xvYmFsRmxhZ3MgfD0gRl9ORVdfU0NDQl9DTUQ7CisKKyAgICAgIAl9CisKKworICAgICAgZWxzZSBpZiAoaHBfaW50ICYgUlNFTCkgeworCisgICAgICAgICBXUldfSEFSUE9PTigoaW9wb3J0K2hwX2ludHN0YXQpLCAoUFJPR19ITFQgfCBSU0VMIHwgUEhBU0UgfCBCVVNfRlJFRSkpOworCisgICAgICAgICBpZiAoUkRXX0hBUlBPT04oKGlvcG9ydCtocF9pbnRzdGF0KSkgJiBJVEFSX0RJU0MpCisJCSAgICAgIHsKKyAgICAgICAgICAgIGlmICgoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLT5nbG9iYWxGbGFncyAmIEZfSE9TVF9YRkVSX0FDVCkKKwkJCSAgICAgIHsKKyAgICAgICAgICAgICAgIHBoYXNlQ2hrRmlmbyhpb3BvcnQsIHRoaXNDYXJkKTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKFJEX0hBUlBPT04oaW9wb3J0K2hwX2dwX3JlZ18xKSA9PSBTTVNBVkVfREFUQV9QVFIpCisJCQkgICAgICB7CisgICAgICAgICAgICAgICBXUl9IQVJQT09OKGlvcG9ydCtocF9ncF9yZWdfMSwgMHgwMCk7CisgICAgICAgICAgICAgICBjdXJyU0NDQi0+U2NjYl9YZmVyU3RhdGUgfD0gRl9OT19EQVRBX1lFVDsKKyAgICAgICAgICAgICAgIGN1cnJTQ0NCLT5TY2NiX3NhdmVkQVRDID0gY3VyclNDQ0ItPlNjY2JfQVRDOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBXUldfSEFSUE9PTigoaW9wb3J0K2hwX2ludHN0YXQpLCAoQlVTX0ZSRUUgfCBJVEFSX0RJU0MpKTsKKyAgICAgICAgICAgIGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID0gRElTQ09OTkVDVF9TVDsKKyAgICAgICAgICAgIHF1ZXVlRGlzY29ubmVjdChjdXJyU0NDQix0aGlzQ2FyZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgIHNyZXMoaW9wb3J0LHRoaXNDYXJkLCgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCkpOworICAgICAgICAgcGhhc2VEZWNvZGUoaW9wb3J0LHRoaXNDYXJkKTsKKworICAgICAgICAgfQorCisKKyAgICAgIGVsc2UgaWYgKChocF9pbnQgJiBJRE9fU1RSVCkgJiYgKCEoaHBfaW50ICYgQlVTX0ZSRUUpKSkKKyAgICAgICAgIHsKKworICAgICAgICAgICAgV1JXX0hBUlBPT04oKGlvcG9ydCtocF9pbnRzdGF0KSwgKElET19TVFJUIHwgWEZFUl9DTlRfMCkpOworICAgICAgICAgICAgcGhhc2VEZWNvZGUoaW9wb3J0LHRoaXNDYXJkKTsKKworICAgICAgICAgfQorCisKKyAgICAgIGVsc2UgaWYgKCAoaHBfaW50ICYgSVVOS1dOKSB8fCAoaHBfaW50ICYgUFJPR19ITFQpICkKKwkJICAgeworCSAJICAgV1JXX0hBUlBPT04oKGlvcG9ydCtocF9pbnRzdGF0KSwgKFBIQVNFIHwgSVVOS1dOIHwgUFJPR19ITFQpKTsKKwkgCSAgIGlmICgoUkRfSEFSUE9PTihpb3BvcnQraHBfcHJnbWNudF8wKSAmIChVQ0hBUikweDNmKTwgKFVDSEFSKVNFTENISykKKwkgICAgCQl7CisJICAgIAkJcGhhc2VEZWNvZGUoaW9wb3J0LHRoaXNDYXJkKTsKKwkgICAgCQl9CisJIAkgICBlbHNlCisJICAgIAkJeworICAgLyogSGFycG9vbiBwcm9ibGVtIHNvbWUgU0NTSSB0YXJnZXQgZGV2aWNlIHJlc3BvbmQgdG8gc2VsZWN0aW9uCisgICB3aXRoIHNob3J0IEJVU1kgcHVsc2UgKDw0MDBucykgdGhpcyB3aWxsIG1ha2UgdGhlIEhhcnBvb24gaXMgbm90IGFibGUKKyAgIHRvIGxhdGNoIHRoZSBjb3JyZWN0IFRhcmdldCBJRCBpbnRvIHJlZy4geDUzLgorICAgVGhlIHdvcmsgYXJvdW5kIHJlcXVpcmUgdG8gY29ycmVjdCB0aGlzIHJlZy4gQnV0IHdoZW4gd3JpdGUgdG8gdGhpcworICAgcmVnLiAoMHg1MykgYWxzbyBpbmNyZW1lbnQgdGhlIEZJRk8gd3JpdGUgYWRkciByZWcgKDB4NmYpLCB0aHVzIHdlCisgICBuZWVkIHRvIHJlYWQgdGhpcyByZWcgZmlyc3QgdGhlbiByZXN0b3JlIGl0IGxhdGVyLiBBZnRlciB1cGRhdGUgdG8gMHg1MyAqLworCisJICAgIAkJaSA9IChVQ0hBUikoUkRfSEFSUE9PTihpb3BvcnQraHBfZmlmb3dyaXRlKSk7CisJICAgIAkJdGFyZ2V0ID0gKFVDSEFSKShSRF9IQVJQT09OKGlvcG9ydCtocF9ncF9yZWdfMykpOworCSAgICAJCVdSX0hBUlBPT04oaW9wb3J0K2hwX3hmZXJfcGFkLCAoVUNIQVIpIElEX1VOTE9DSyk7CisJICAgIAkJV1JfSEFSUE9PTihpb3BvcnQraHBfc2VsZWN0X2lkLCAoVUNIQVIpKHRhcmdldCB8IHRhcmdldDw8NCkpOworCSAgICAJCVdSX0hBUlBPT04oaW9wb3J0K2hwX3hmZXJfcGFkLCAoVUNIQVIpIDB4MDApOworCSAgICAJCVdSX0hBUlBPT04oaW9wb3J0K2hwX2ZpZm93cml0ZSwgaSk7CisJICAgIAkJV1JfSEFSUE9PTihpb3BvcnQraHBfYXV0b3N0YXJ0XzMsIChBVVRPX0lNTUVEK1RBR19TVFJUKSk7CisJICAgIAkJfQorCSAJICAgfQorCisgICAgICBlbHNlIGlmIChocF9pbnQgJiBYRkVSX0NOVF8wKSB7CisKKyAgICAgICAgIFdSV19IQVJQT09OKChpb3BvcnQraHBfaW50c3RhdCksIFhGRVJfQ05UXzApOworCisgICAgICAgICBzY2hrZGQoaW9wb3J0LHRoaXNDYXJkKTsKKworICAgICAgICAgfQorCisKKyAgICAgIGVsc2UgaWYgKGhwX2ludCAmIEJVU19GUkVFKSB7CisKKyAgICAgICAgIFdSV19IQVJQT09OKChpb3BvcnQraHBfaW50c3RhdCksIEJVU19GUkVFKTsKKworICAgICAgICAJaWYgKCgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmdsb2JhbEZsYWdzICYgRl9IT1NUX1hGRVJfQUNUKSB7CisKKyAgICAgICAgICAgCWhvc3REYXRhWGZlckFib3J0KGlvcG9ydCx0aGlzQ2FyZCxjdXJyU0NDQik7CisJCQkJfQorCisgICAgICAgICBwaGFzZUJ1c0ZyZWUoaW9wb3J0LHRoaXNDYXJkKTsKKwkJCX0KKworCisgICAgICBlbHNlIGlmIChocF9pbnQgJiBJVElDS0xFKSB7CisKKyAgICAgICAgIFdSV19IQVJQT09OKChpb3BvcnQraHBfaW50c3RhdCksIElUSUNLTEUpOworICAgICAgICAgKChQU0NDQmNhcmQpcEN1cnJDYXJkKS0+Z2xvYmFsRmxhZ3MgfD0gRl9ORVdfU0NDQl9DTUQ7CisgICAgICAgICB9CisKKworCisgICAgICBpZiAoKChQU0NDQmNhcmQpcEN1cnJDYXJkKS0+Z2xvYmFsRmxhZ3MgJiBGX05FV19TQ0NCX0NNRCkgeworCisKKyAgICAgICAgICgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmdsb2JhbEZsYWdzICY9IH5GX05FV19TQ0NCX0NNRDsKKworCisgICAgICAgICBpZiAoKChQU0NDQmNhcmQpcEN1cnJDYXJkKS0+Y3VycmVudFNDQ0IgPT0gTlVMTCkgeworCisgICAgICAgICAgICBxdWV1ZVNlYXJjaFNlbGVjdCgoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLHRoaXNDYXJkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgaWYgKCgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmN1cnJlbnRTQ0NCICE9IE5VTEwpIHsKKyAgICAgICAgICAgICgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmdsb2JhbEZsYWdzICY9IH5GX05FV19TQ0NCX0NNRDsKKyAgICAgICAgICAgIHNzZWwoaW9wb3J0LHRoaXNDYXJkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIH0KKworICAgICAgfSAgLyplbmQgd2hpbGUgKi8KKworICAgbU9TX0xvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworICAgTUVOQUJMRV9JTlQoaW9wb3J0KTsKKyAgIG1PU19VbkxvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworCisgICByZXR1cm4oMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFNjY2JfYmFkX2lzcgorICoKKyAqIERlc2NyaXB0aW9uOiBTb21lIHR5cGUgb2YgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCB3aGljaCBpcyBzbGlnaHRseQorICogICAgICAgICAgICAgIG91dCBvZiB0aGUgb3JkaW5hcnkuICBXZSB3aWxsIG5vdyBkZWNvZGUgaXQgZnVsbHksIGluCisgKiAgICAgICAgICAgICAgdGhpcyByb3V0aW5lLiAgVGhpcyBpcyBicm9rZW4gdXAgaW4gYW4gYXR0ZW1wdCB0byBzYXZlCisgKiAgICAgICAgICAgICAgcHJvY2Vzc2luZyB0aW1lLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKERPUykKK1VDSEFSIFNjY2JNZ3JfYmFkX2lzcihVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2NhcmQsIFBTQ0NCY2FyZCBwQ3VyckNhcmQsIFVTSE9SVCBwX2ludCkKKyNlbHNlCitVQ0hBUiBTY2NiTWdyX2JhZF9pc3IoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2NhcmQsIFBTQ0NCY2FyZCBwQ3VyckNhcmQsIFVTSE9SVCBwX2ludCkKKyNlbmRpZgoreworI2lmIGRlZmluZWQoSEFSUF9SRVZYKQorICAgVUxPTkcgdGltZXI7CisjZW5kaWYKK1VDSEFSIHRlbXAsIFNjYW1GbGc7CitQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CitQTlZSYW1JbmZvIHBDdXJyTnZSYW07CisKKworICAgaWYgKFJEX0hBUlBPT04ocF9wb3J0K2hwX2V4dF9zdGF0dXMpICYKKyAgICAgICAgIChCTV9GT1JDRV9PRkYgfCBQQ0lfREVWX1RNT1VUIHwgQk1fUEFSSVRZX0VSUiB8IFBJT19PVkVSUlVOKSApCisgICAgICB7CisKKyAgICAgIGlmIChwQ3VyckNhcmQtPmdsb2JhbEZsYWdzICYgRl9IT1NUX1hGRVJfQUNUKQorICAgICAgICAgeworCisgICAgICAgICBob3N0RGF0YVhmZXJBYm9ydChwX3BvcnQscF9jYXJkLCBwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCKTsKKyAgICAgICAgIH0KKworICAgICAgaWYgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3BjaV9zdGF0X2NmZykgJiBSRUNfTUFTVEVSX0FCT1JUKQorCisgICAgICAgICB7CisgICAgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9wY2lfc3RhdF9jZmcsCisgICAgICAgICAgICAoUkRfSEFSUE9PTihwX3BvcnQraHBfcGNpX3N0YXRfY2ZnKSAmIH5SRUNfTUFTVEVSX0FCT1JUKSk7CisKKyAgICAgICAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2hvc3RfYmxrX2NudCwgMHgwMCk7CisKKyAgICAgICAgIH0KKworICAgICAgaWYgKHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgIT0gTlVMTCkKKyAgICAgICAgIHsKKworICAgICAgICAgaWYgKCFwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCLT5Ib3N0U3RhdHVzKQorICAgICAgICAgICAgcEN1cnJDYXJkLT5jdXJyZW50U0NDQi0+SG9zdFN0YXR1cyA9IFNDQ0JfQk1fRVJSOworCisgICAgICAgICBzeGZycChwX3BvcnQscF9jYXJkKTsKKworCSAgICAgdGVtcCA9IChVQ0hBUikoUkRfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCkgJgorCQkJCQkJCShFWFRfQVJCX0FDSyB8IFNDU0lfVEVSTV9FTkFfSCkpOworICAgICAgCVdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsICgoVUNIQVIpdGVtcCB8IFNFRV9NUyB8IFNFRV9DUykpOworICAgICAgICAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgdGVtcCk7CisKKyAgICAgICAgIGlmICghKFJEV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCkpICYgKEJVU19GUkVFIHwgUkVTRVQpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHBoYXNlRGVjb2RlKHBfcG9ydCxwX2NhcmQpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorCisKKyAgIGVsc2UgaWYgKHBfaW50ICYgUkVTRVQpCisgICAgICAgICB7CisKKwkJCQlXUl9IQVJQT09OKHBfcG9ydCtocF9jbGtjdHJsXzAsIENMS0NUUkxfREVGQVVMVCk7CisJCQkJV1JfSEFSUE9PTihwX3BvcnQraHBfc3lzX2N0cmwsIDB4MDApOworICAgICAgICAgICBpZiAocEN1cnJDYXJkLT5jdXJyZW50U0NDQiAhPSBOVUxMKSB7CisKKyAgICAgICAgICAgICAgIGlmIChwQ3VyckNhcmQtPmdsb2JhbEZsYWdzICYgRl9IT1NUX1hGRVJfQUNUKQorCisgICAgICAgICAgICAgICBob3N0RGF0YVhmZXJBYm9ydChwX3BvcnQscF9jYXJkLCBwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCKTsKKyAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgIERJU0FCTEVfQVVUTyhwX3BvcnQpOworCisgICAgICAgICAgIHNyZXNiKHBfcG9ydCxwX2NhcmQpOworCisgICAgICAgICAgIHdoaWxlKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2ljdHJsXzApICYgU0NTSV9SU1QpIHt9CisKKwkJCQlwQ3Vyck52UmFtID0gcEN1cnJDYXJkLT5wTnZSYW1JbmZvOworCQkJCWlmKHBDdXJyTnZSYW0peworCQkJCQlTY2FtRmxnID0gcEN1cnJOdlJhbS0+bmlTY2FtQ29uZjsKKwkJCQl9CisJCQkJZWxzZXsKKwkJCQkgICBTY2FtRmxnID0gKFVDSEFSKSB1dGlsRUVSZWFkKHBfcG9ydCwgU0NBTV9DT05GSUcvMik7CisJCQkJfQorCisgICAgICAgICAgIFhib3dJbml0KHBfcG9ydCwgU2NhbUZsZyk7CisKKyAgICAgICAgICAgICAgIHNjaW5pKHBfY2FyZCwgcEN1cnJDYXJkLT5vdXJJZCwgMCk7CisKKyAgICAgICAgICAgcmV0dXJuKDB4RkYpOworICAgICAgICAgfQorCisKKyAgIGVsc2UgaWYgKHBfaW50ICYgRklGTykgeworCisgICAgICBXUldfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpLCBGSUZPKTsKKworI2lmIGRlZmluZWQoSEFSUF9SRVZYKQorCisgICAgICBmb3IgKHRpbWVyPTB4MDBGRkZGRkZMOyB0aW1lciAhPSAweDAwMDAwMDAwTDsgdGltZXItLSkgeworCisgICAgICAgICBpZiAoUkRfSEFSUE9PTihwX3BvcnQraHBfeGZlcnN0YXQpICYgRklGT19FTVBUWSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBpZiAoUkRXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSkgJiBCVVNfRlJFRSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisKKyAgICAgIGlmICggKFJEX0hBUlBPT04ocF9wb3J0K2hwX3hmZXJzdGF0KSAmIEZJRk9fRU1QVFkpICYmCisgICAgICAgICAgIChSRF9IQVJQT09OKHBfcG9ydCtocF9maWZvcmVhZCkgIT0KKyAgICAgICAgICAgIFJEX0hBUlBPT04ocF9wb3J0K2hwX2ZpZm93cml0ZSkpICYmCisgICAgICAgICAgIChSRF9IQVJQT09OKHBfcG9ydCtocF94ZmVyY250XzApKQorICAgICAgICAgKQorCisgICAgICAgICAgICBXUl9IQVJQT09OKChwX3BvcnQraHBfeGZlcnN0YXQpLCAweDAxKTsKKworLyogICAgICBlbHNlCisgKi8KKy8qICAgICAgICAgc3hmcnAocF9wb3J0LHBfY2FyZCk7CisgKi8KKyNlbHNlCisgICAgICBpZiAocEN1cnJDYXJkLT5jdXJyZW50U0NDQiAhPSBOVUxMKQorICAgICAgICAgc3hmcnAocF9wb3J0LHBfY2FyZCk7CisjZW5kaWYKKyAgICAgIH0KKworICAgZWxzZSBpZiAocF9pbnQgJiBUSU1FT1VUKQorICAgICAgeworCisgICAgICBESVNBQkxFX0FVVE8ocF9wb3J0KTsKKworICAgICAgV1JXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSwKKwkJICAoUFJPR19ITFQgfCBUSU1FT1VUIHwgU0VMIHxCVVNfRlJFRSB8IFBIQVNFIHwgSVVOS1dOKSk7CisKKyAgICAgIHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0ItPkhvc3RTdGF0dXMgPSBTQ0NCX1NFTEVDVElPTl9USU1FT1VUOworCisKKwkJY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVtwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCLT5UYXJnSURdOworCQlpZigocEN1cnJDYXJkLT5nbG9iYWxGbGFncyAmIEZfQ09OTFVOX0lPKSAmJgorCQkJKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSAhPSBUQUdfUV9UUllJTkcpKQorCSAgICAgIGN1cnJUYXJfSW5mby0+VGFyTFVOQnVzeVtwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCLT5MdW5dID0gRkFMU0U7CisJCWVsc2UKKwkgICAgICBjdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbMF0gPSBGQUxTRTsKKworCisgICAgICBpZiAoY3VyclRhcl9JbmZvLT5UYXJFRVZhbHVlICYgRUVfU1lOQ19NQVNLKQorICAgICAgICAgeworCSAgICAgICBjdXJyVGFyX0luZm8tPlRhclN5bmNDdHJsID0gMDsKKyAgICAgICAgIGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICY9IH5UQVJfU1lOQ19NQVNLOworICAgICAgICAgfQorCisgICAgICBpZiAoY3VyclRhcl9JbmZvLT5UYXJFRVZhbHVlICYgRUVfV0lERV9TQ1NJKQorICAgICAgICAgeworICAgICAgICAgY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJj0gflRBUl9XSURFX01BU0s7CisgICAgICAgICB9CisKKyAgICAgIHNzc3luY3YocF9wb3J0LCBwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCLT5UYXJnSUQsIE5BUlJPV19TQ1NJLGN1cnJUYXJfSW5mbyk7CisKKyAgICAgIHF1ZXVlQ21kQ29tcGxldGUocEN1cnJDYXJkLCBwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCLCBwX2NhcmQpOworCisgICAgICB9CisKKyNpZiBkZWZpbmVkKFNDQU1fTEVWXzIpCisKKyAgIGVsc2UgaWYgKHBfaW50ICYgU0NBTV9TRUwpCisgICAgICB7CisKKyAgICAgIHNjYXJiKHBfcG9ydCxMRVZFTDJfVEFSKTsKKyAgICAgIHNjc2VsKHBfcG9ydCk7CisgICAgICBzY2FzaWQocF9jYXJkLCBwX3BvcnQpOworCisgICAgICBzY2J1c2YocF9wb3J0KTsKKworICAgICAgV1JXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSwgU0NBTV9TRUwpOworICAgICAgfQorI2VuZGlmCisKKyAgIHJldHVybigweDAwKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBTY2NiTWdyX3Njc2lfcmVzZXQKKyAqCisgKiBEZXNjcmlwdGlvbjogQSBTQ1NJIGJ1cyByZXNldCB3aWxsIGJlIGdlbmVyYXRlZCBhbmQgYWxsIG91dHN0YW5kaW5nCisgKiAgICAgICAgICAgICAgU2NjYnMgd2lsbCBiZSByZXR1cm5lZCB2aWEgdGhlIGNhbGxiYWNrLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAoRldfVFlQRT09X1VDQl9NR1JfKQordm9pZCBTY2NiTWdyX3Njc2lfcmVzZXQoQ0FSRF9IQU5ETEUgcEN1cnJDYXJkKQorI2Vsc2UKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgU2NjYk1ncl9zY3NpX3Jlc2V0KFVTSE9SVCBwQ3VyckNhcmQpCisjZWxzZQordm9pZCBTY2NiTWdyX3Njc2lfcmVzZXQoVUxPTkcgcEN1cnJDYXJkKQorI2VuZGlmCisjZW5kaWYKK3sKKyAgIFVDSEFSIHRoaXNDYXJkOworCisgICB0aGlzQ2FyZCA9ICgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmNhcmRJbmRleDsKKworICAgbU9TX0xvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworCisgICBpZiAoKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmdsb2JhbEZsYWdzICYgRl9HUkVFTl9QQykKKyAgICAgIHsKKyAgICAgIFdSX0hBUlBPT04oKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmlvUG9ydCtocF9jbGtjdHJsXzAsIENMS0NUUkxfREVGQVVMVCk7CisgICAgICBXUl9IQVJQT09OKCgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQpLT5pb1BvcnQraHBfc3lzX2N0cmwsIDB4MDApOworICAgICAgfQorCisgICBzcmVzYigoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLT5pb1BvcnQsdGhpc0NhcmQpOworCisgICBpZiAoUkRfSEFSUE9PTigoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLT5pb1BvcnQraHBfZXh0X3N0YXR1cykgJiBCTV9DTURfQlVTWSkKKyAgICAgIHsKKyAgICAgIFdSX0hBUlBPT04oKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmlvUG9ydCtocF9wYWdlX2N0cmwsCisgICAgICAgICAoUkRfSEFSUE9PTigoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+aW9Qb3J0K2hwX3BhZ2VfY3RybCkKKyAgICAgICAgICYgflNDQVRURVJfRU4pKTsKKworICAgICAgV1JfSEFSUE9PTigoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+aW9Qb3J0K2hwX3NnX2FkZHIsMHgwMCk7CisKKyAgICAgICgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQpLT5nbG9iYWxGbGFncyAmPSB+Rl9IT1NUX1hGRVJfQUNUOworICAgICAgYnVzTXN0clRpbWVPdXQoKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmlvUG9ydCk7CisKKyAgICAgIFdSX0hBUlBPT04oKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmlvUG9ydCtocF9pbnRfbWFzaywKKyAgICAgICAgIChJTlRfQ01EX0NPTVBMIHwgU0NTSV9JTlRFUlJVUFQpKTsKKyAgICAgIH0KKworLyoKKyAgICAgIGlmICh1dGlsRUVSZWFkKCgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmlvUG9ydCwgKFNDQU1fQ09ORklHLzIpKQorICAgICAgICAgICAgJiBTQ0FNX0VOQUJMRUQpCisqLworICAgICAgICAgc2NpbmkodGhpc0NhcmQsICgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPm91cklkLCAwKTsKKworI2lmIChGV19UWVBFPT1fVUNCX01HUl8pCisgICAoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLT5jYXJkSW5mby0+YWlfQUVOX3JvdXRpbmUoMHgwMSxwQ3VyckNhcmQsMCwwLDAsMCk7CisjZW5kaWYKKworICAgbU9TX1VuTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogU2NjYk1ncl90aW1lcl9leHBpcmVkCisgKgorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gYWxsb3cgbWUgdG8ga2lsbCBteSBvd24gam9iIHRoYXQgaGFzIG5vdAorICogICAgICAgICAgICAgIHlldCBjb21wbGV0ZWQsIGFuZCBoYXMgY2F1c2UgYSB0aW1lb3V0IHRvIG9jY3VyLiAgVGhpcworICogICAgICAgICAgICAgIHRpbWVvdXQgaGFzIGNhdXNlZCB0aGUgdXBwZXIgbGV2ZWwgZHJpdmVyIHRvIGNhbGwgdGhpcworICogICAgICAgICAgICAgIGZ1bmN0aW9uLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIChGV19UWVBFPT1fVUNCX01HUl8pCit2b2lkIFNjY2JNZ3JfdGltZXJfZXhwaXJlZChDQVJEX0hBTkRMRSBwQ3VyckNhcmQpCisjZWxzZQorI2lmIGRlZmluZWQoRE9TKQordm9pZCBTY2NiTWdyX3RpbWVyX2V4cGlyZWQoVVNIT1JUIHBDdXJyQ2FyZCkKKyNlbHNlCit2b2lkIFNjY2JNZ3JfdGltZXJfZXhwaXJlZChVTE9ORyBwQ3VyckNhcmQpCisjZW5kaWYKKyNlbmRpZgoreworfQorCisjaWYgZGVmaW5lZChET1MpCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBTY2NiTWdyX3N0YXR1cworICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBvdXRzdGFuZGluZyBTQ0NCJ3MuCisgKiAgICAgICAgICAgICAgVGhpcyBpcyBzcGVjaWZpYyB0byB0aGUgRE9TIGVudmlyb21lbnQsIHdoaWNoIG5lZWRzIHRoaXMKKyAqICAgICAgICAgICAgICB0byBoZWxwIHRoZW0ga2VlcCBwcm90ZWN0ZWQgYW5kIHJlYWwgbW9kZSBjb21tYW5kcyBzdGFpZ2h0LgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVVNIT1JUIFNjY2JNZ3Jfc3RhdHVzKFVTSE9SVCBwQ3VyckNhcmQpCit7CisgICByZXR1cm4oQkxfQ2FyZFtwQ3VyckNhcmRdLmNtZENvdW50ZXIpOworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFNjY2JNZ3JUYWJsZUluaXQKKyAqCisgKiBEZXNjcmlwdGlvbjogSW5pdGlhbGl6ZSBhbGwgU2NjYiBtYW5hZ2VyIGRhdGEgc3RydWN0dXJlcy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgU2NjYk1nclRhYmxlSW5pdEFsbCgpCit7CisgICBVQ0hBUiB0aGlzQ2FyZDsKKworICAgZm9yICh0aGlzQ2FyZCA9IDA7IHRoaXNDYXJkIDwgTUFYX0NBUkRTOyB0aGlzQ2FyZCsrKQorICAgICAgeworICAgICAgU2NjYk1nclRhYmxlSW5pdENhcmQoJkJMX0NhcmRbdGhpc0NhcmRdLHRoaXNDYXJkKTsKKworICAgICAgQkxfQ2FyZFt0aGlzQ2FyZF0uaW9Qb3J0ICAgICAgPSAweDAwOworICAgICAgQkxfQ2FyZFt0aGlzQ2FyZF0uY2FyZEluZm8gICAgPSBOVUxMOworICAgICAgQkxfQ2FyZFt0aGlzQ2FyZF0uY2FyZEluZGV4ICAgPSAweEZGOworICAgICAgQkxfQ2FyZFt0aGlzQ2FyZF0ub3VySWQgICAgICAgPSAweDAwOworCQlCTF9DYXJkW3RoaXNDYXJkXS5wTnZSYW1JbmZvCT0gTlVMTDsKKyAgICAgIH0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBTY2NiTWdyVGFibGVJbml0CisgKgorICogRGVzY3JpcHRpb246IEluaXRpYWxpemUgYWxsIFNjY2IgbWFuYWdlciBkYXRhIHN0cnVjdHVyZXMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIFNjY2JNZ3JUYWJsZUluaXRDYXJkKFBTQ0NCY2FyZCBwQ3VyckNhcmQsIFVDSEFSIHBfY2FyZCkKK3sKKyAgIFVDSEFSIHNjc2lJRCwgcXRhZzsKKworCWZvciAocXRhZyA9IDA7IHF0YWcgPCBRVUVVRV9ERVBUSDsgcXRhZysrKQorCXsKKwkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtxdGFnXSA9IE5VTEw7CisJfQorCisgICBmb3IgKHNjc2lJRCA9IDA7IHNjc2lJRCA8IE1BWF9TQ1NJX1RBUjsgc2NzaUlEKyspCisgICAgICB7CisgICAgICBzY2NiTWdyVGJsW3BfY2FyZF1bc2NzaUlEXS5UYXJTdGF0dXMgPSAwOworICAgICAgc2NjYk1nclRibFtwX2NhcmRdW3Njc2lJRF0uVGFyRUVWYWx1ZSA9IDA7CisgICAgICBTY2NiTWdyVGFibGVJbml0VGFyZ2V0KHBfY2FyZCwgc2NzaUlEKTsKKyAgICAgIH0KKworICAgcEN1cnJDYXJkLT5zY2FuSW5kZXggPSAweDAwOworICAgcEN1cnJDYXJkLT5jdXJyZW50U0NDQiA9IE5VTEw7CisgICBwQ3VyckNhcmQtPmdsb2JhbEZsYWdzID0gMHgwMDsKKyAgIHBDdXJyQ2FyZC0+Y21kQ291bnRlciAgPSAweDAwOworCXBDdXJyQ2FyZC0+dGFnUV9Mc3QgPSAweDAxOworCXBDdXJyQ2FyZC0+ZGlzY1FDb3VudCA9IDA7IAorCisKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBTY2NiTWdyVGFibGVJbml0CisgKgorICogRGVzY3JpcHRpb246IEluaXRpYWxpemUgYWxsIFNjY2IgbWFuYWdlciBkYXRhIHN0cnVjdHVyZXMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIFNjY2JNZ3JUYWJsZUluaXRUYXJnZXQoVUNIQVIgcF9jYXJkLCBVQ0hBUiB0YXJnZXQpCit7CisKKwlVQ0hBUiBsdW4sIHF0YWc7CisJUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworCisJY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVt0YXJnZXRdOworCisJY3VyclRhcl9JbmZvLT5UYXJTZWxRX0NudCA9IDA7CisJY3VyclRhcl9JbmZvLT5UYXJTeW5jQ3RybCA9IDA7CisKKwljdXJyVGFyX0luZm8tPlRhclNlbFFfSGVhZCA9IE5VTEw7CisJY3VyclRhcl9JbmZvLT5UYXJTZWxRX1RhaWwgPSBOVUxMOworCWN1cnJUYXJfSW5mby0+VGFyVGFnUV9DbnQgPSAwOworCWN1cnJUYXJfSW5mby0+VGFyTFVOX0NBID0gRkFMU0U7CisKKworCWZvciAobHVuID0gMDsgbHVuIDwgTUFYX0xVTjsgbHVuKyspCisJeworCQljdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbbHVuXSA9IEZBTFNFOworCQljdXJyVGFyX0luZm8tPkx1bkRpc2NRX0lkeFtsdW5dID0gMDsKKwl9CisKKwlmb3IgKHF0YWcgPSAwOyBxdGFnIDwgUVVFVUVfREVQVEg7IHF0YWcrKykKKwl7CisJCWlmKEJMX0NhcmRbcF9jYXJkXS5kaXNjUV9UYmxbcXRhZ10gIT0gTlVMTCkKKwkJeworCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtxdGFnXS0+VGFyZ0lEID09IHRhcmdldCkKKwkJCXsKKwkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW3F0YWddID0gTlVMTDsKKwkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudC0tOworCQkJfQorCQl9CisJfQorfQorCisjaWYgZGVmaW5lZChCVUdCVUcpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2F2ZSB0aGUgY3VycmVudCBieXRlIGluIHRoZSBkZWJ1ZyBhcnJheQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3ZvaWQgRGVidWdfTG9hZChVQ0hBUiBwX2NhcmQsIFVDSEFSIHBfYnVnX2RhdGEpCit7CisgICBkZWJ1Z19pbnRbcF9jYXJkXVtkZWJ1Z19pbmRleFtwX2NhcmRdXSA9IHBfYnVnX2RhdGE7CisgICBkZWJ1Z19pbmRleFtwX2NhcmRdKys7CisKKyAgIGlmIChkZWJ1Z19pbmRleFtwX2NhcmRdID09IGRlYnVnX3NpemUpCisKKyAgICAgIGRlYnVnX2luZGV4W3BfY2FyZF0gPSAwOworfQorCisjZW5kaWYKKyNpZGVudCAiJElkOiBzY2NiX2RhdC5jIDEuMTAgMTk5Ny8wMi8yMiAwMzoxNjowMiBhd2luIEV4cCAkIgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoKKyAqICAgQ29weXJpZ2h0IDE5OTUtMTk5NiBieSBNeWxleCBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYm90aCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYW5kIGEgQlNELXN0eWxlIGNvcHlyaWdodDsgc2VlIExJQ0VOU0UuRmxhc2hQb2ludCBmb3IgZGV0YWlscy4KKyAqCisgKiAgICRXb3JrZmlsZTogICBzY2NiX2RhdC5jICAkCisgKgorICogICBEZXNjcmlwdGlvbjogIEZ1bmN0aW9ucyByZWxhdGluZyB0byBoYW5kbGluZyBvZiB0aGUgU0NDQiBpbnRlcmZhY2UgCisgKiAgICAgICAgICAgICAgICAgYmV0d2VlbiB0aGUgZGV2aWNlIGRyaXZlciBhbmQgdGhlIEhBUlBPT04uCisgKgorICogICAkRGF0ZTogMTk5Ny8wMi8yMiAwMzoxNjowMiAkCisgKgorICogICAkUmV2aXNpb246IDEuMTAgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qI2luY2x1ZGUgPGdsb2JhbHMuaD4qLworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKwkvKiNpbmNsdWRlIDxidWRpLmg+Ki8KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzY2NibWdyLmg+Ki8KKy8qI2luY2x1ZGUgPGJseDMwLmg+Ki8KKy8qI2luY2x1ZGUgPHRhcmdldC5oPiovCisvKiNpbmNsdWRlIDxoYXJwb29uLmg+Ki8KKworLyoKKyoqICBJTVBPUlRBTlQgTk9URSEhIQorKioKKyoqICBZb3UgTVVTVCBwcmVhc3NpZ24gYWxsIGRhdGEgdG8gYSB2YWxpZCB2YWx1ZSBvciB6ZXJvLiAgVGhpcyBpcworKiogIHJlcXVpcmVkIGR1ZSB0byB0aGUgTVMgY29tcGlsZXIgYnVnIHVuZGVyIE9TLzIgYW5kIFNvbGFyaXMgUmVhbC1Nb2RlCisqKiAgZHJpdmVyIGVudmlyb25tZW50LgorKi8KKworCitTQ0NCTUdSX1RBUl9JTkZPIHNjY2JNZ3JUYmxbTUFYX0NBUkRTXVtNQVhfU0NTSV9UQVJdID0geyB7IHsgMCB9IH0gfTsKK1NDQ0JDQVJEIEJMX0NhcmRbTUFYX0NBUkRTXSA9IHsgeyAwIH0gfTsKK1NDQ0JTQ0FNX0lORk8gc2NhbUluZm9bTUFYX1NDU0lfVEFSXSA9IHsgeyB7IDAgfSB9IH07CitOVlJBTUlORk8gbnZSYW1JbmZvW01BWF9NQl9DQVJEU10gPSB7IHsgMCB9IH07CisKKworI2lmIGRlZmluZWQoT1MyKQordm9pZCAoZmFyICpzX1BoYXNlVGJsWzhdKSAoVUxPTkcsIFVDSEFSKSA9IHsgMCB9OworVUNIQVIgdGVtcF9pZF9zdHJpbmdbSURfU1RSSU5HX0xFTkdUSF0gPSB7IDAgfTsKKyNlbGlmIGRlZmluZWQoU09MQVJJU19SRUFMX01PREUpIHx8IGRlZmluZWQoX19TVERDX18pCit2b2lkICgqc19QaGFzZVRibFs4XSkgKFVMT05HLCBVQ0hBUikgPSB7IDAgfTsKKyNlbHNlCit2b2lkICgqc19QaGFzZVRibFs4XSkgKCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoRE9TKQorVUNIQVIgZmlyc3RfdGltZSA9IDA7CisjZW5kaWYKKworVUNIQVIgbWJDYXJkcyA9IDA7CitVQ0hBUiBzY2FtSEFTdHJpbmdbXSA9IHsweDYzLCAweDA3LCAnQicsICdVJywgJ1MnLCAnTCcsICdPJywgJ0cnLCAnSScsICdDJywgXAorCQkJCQkJCQknICcsICdCJywgJ1QnLCAnLScsICc5JywgJzMnLCAnMCcsIFwKKwkJCQkJCQkJMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgXAorCQkJCQkJCQkweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwfTsKKworVVNIT1JUIGRlZmF1bHRfaW50ZW5hID0gMDsKKworI2lmIGRlZmluZWQoQlVHQlVHKQorVUNIQVIgICAgZGVidWdfaW50W01BWF9DQVJEU11bZGVidWdfc2l6ZV0gPSB7IDAgfTsKK1VDSEFSICAgIGRlYnVnX2luZGV4W01BWF9DQVJEU10gPSB7IDAgfTsKK1VDSEFSICAgIHJlc2VydmVkXzFbM10gPSB7IDAgfTsKKyNlbmRpZgorI2lkZW50ICIkSWQ6IHNjc2kuYyAxLjIzIDE5OTcvMDcvMDkgMjE6NDI6NTQgbW9oYW4gRXhwICQiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKgorICogICBDb3B5cmlnaHQgMTk5NS0xOTk2IGJ5IE15bGV4IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBib3RoIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbmQgYSBCU0Qtc3R5bGUgY29weXJpZ2h0OyBzZWUgTElDRU5TRS5GbGFzaFBvaW50IGZvciBkZXRhaWxzLgorICoKKyAqICAgJFdvcmtmaWxlOiAgIHNjc2kuYyAgJAorICoKKyAqICAgRGVzY3JpcHRpb246ICBGdW5jdGlvbnMgZm9yIGhhbmRsaW5nIFNDU0kgYnVzIGZ1bmN0aW9ucyBzdWNoIGFzCisgKiAgICAgICAgICAgICAgICAgc2VsZWN0aW9uL3Jlc2VsZWN0aW9uLCBzeW5jIG5lZ290aWF0aW9uLCBtZXNzYWdlLWluCisgKiAgICAgICAgICAgICAgICAgZGVjb2RpbmcuCisgKgorICogICAkRGF0ZTogMTk5Ny8wNy8wOSAyMTo0Mjo1NCAkCisgKgorICogICAkUmV2aXNpb246IDEuMjMgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qI2luY2x1ZGUgPGdsb2JhbHMuaD4qLworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKwkvKiNpbmNsdWRlIDxidWRpLmg+Ki8KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzY2NibWdyLmg+Ki8KKy8qI2luY2x1ZGUgPGJseDMwLmg+Ki8KKy8qI2luY2x1ZGUgPHRhcmdldC5oPiovCisvKiNpbmNsdWRlIDxzY3NpMi5oPiovCisvKiNpbmNsdWRlIDxlZXByb20uaD4qLworLyojaW5jbHVkZSA8aGFycG9vbi5oPiovCisKKworLyoKK2V4dGVybiBTQ0NCQ0FSRCBCTF9DYXJkW01BWF9DQVJEU107CitleHRlcm4gU0NDQk1HUl9UQVJfSU5GTyBzY2NiTWdyVGJsW01BWF9DQVJEU11bTUFYX1NDU0lfVEFSXTsKKyNpZiBkZWZpbmVkKEJVR0JVRykKK3ZvaWQgRGVidWdfTG9hZChVQ0hBUiBwX2NhcmQsIFVDSEFSIHBfYnVnX2RhdGEpOworI2VuZGlmCisqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzZmV0bQorICoKKyAqIERlc2NyaXB0aW9uOiBSZWFkIGluIGEgbWVzc2FnZSBieXRlIGZyb20gdGhlIFNDU0kgYnVzLCBhbmQgY2hlY2sKKyAqICAgICAgICAgICAgICBmb3IgYSBwYXJpdHkgZXJyb3IuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCitVQ0hBUiBzZm0oVVNIT1JUIHBvcnQsIFBTQ0NCIHBDdXJyU0NDQikKKyNlbHNlCitVQ0hBUiBzZm0oVUxPTkcgcG9ydCwgUFNDQ0IgcEN1cnJTQ0NCKQorI2VuZGlmCit7CisJVUNIQVIgbWVzc2FnZTsKKwlVU0hPUlQgVGltZU91dExvb3A7CisKKwlUaW1lT3V0TG9vcCA9IDA7CisJd2hpbGUoICghKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNDU0lfUkVRKSkgJiYKKwkJCShUaW1lT3V0TG9vcCsrIDwgMjAwMDApICl7fQorCisKKwlXUl9IQVJQT09OKHBvcnQraHBfcG9ydGN0cmxfMCwgU0NTSV9QT1JUKTsKKworCW1lc3NhZ2UgPSBSRF9IQVJQT09OKHBvcnQraHBfc2NzaWRhdGFfMCk7CisKKwlXUl9IQVJQT09OKHBvcnQraHBfc2NzaXNpZywgU0NTSV9BQ0sgKyBTX01TR0lfUEgpOworCisKKwlpZiAoVGltZU91dExvb3AgPiAyMDAwMCkKKwkJbWVzc2FnZSA9IDB4MDA7ICAgLyogZm9yY2UgbWVzc2FnZSBieXRlID0gMCBpZiBUaW1lIE91dCBvbiBSZXEgKi8KKworCWlmICgoUkRXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCkpICYgUEFSSVRZKSAmJgorCQkoUkRfSEFSUE9PTihwb3J0K2hwX2FkZHN0YXQpICYgU0NTSV9QQVJfRVJSKSkKKwl7CisJCVdSX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnLCAoU0NTSV9BQ0sgKyBTX0lMTF9QSCkpOworCQlXUl9IQVJQT09OKHBvcnQraHBfeGZlcnN0YXQsIDApOworCQlXUl9IQVJQT09OKHBvcnQraHBfZmlmb3JlYWQsIDApOworCQlXUl9IQVJQT09OKHBvcnQraHBfZmlmb3dyaXRlLCAwKTsKKwkJaWYgKHBDdXJyU0NDQiAhPSBOVUxMKQorCQl7CisJCQlwQ3VyclNDQ0ItPlNjY2Jfc2NzaW1zZyA9IFNNUEFSSVRZOworCQl9CisJCW1lc3NhZ2UgPSAweDAwOworCQlkbworCQl7CisJCQlBQ0NFUFRfTVNHX0FUTihwb3J0KTsKKwkJCVRpbWVPdXRMb29wID0gMDsKKwkJCXdoaWxlKCAoIShSRF9IQVJQT09OKHBvcnQraHBfc2NzaXNpZykgJiBTQ1NJX1JFUSkpICYmCisJCQkJKFRpbWVPdXRMb29wKysgPCAyMDAwMCkgKXt9CisJCQlpZiAoVGltZU91dExvb3AgPiAyMDAwMCkKKwkJCXsKKwkJCQlXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgUEFSSVRZKTsKKwkJCQlyZXR1cm4obWVzc2FnZSk7CisJCQl9CisJCQlpZiAoKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNfU0NTSV9QSFopICE9IFNfTVNHSV9QSCkKKwkJCXsKKwkJCQlXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgUEFSSVRZKTsKKwkJCQlyZXR1cm4obWVzc2FnZSk7CisJCQl9CisJCQlXUl9IQVJQT09OKHBvcnQraHBfcG9ydGN0cmxfMCwgU0NTSV9QT1JUKTsKKworCQkJUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lkYXRhXzApOworCisJCQlXUl9IQVJQT09OKHBvcnQraHBfc2NzaXNpZywgKFNDU0lfQUNLICsgU19JTExfUEgpKTsKKworCQl9d2hpbGUoMSk7CisKKwl9CisJV1JfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcsIChTQ1NJX0FDSyArIFNfSUxMX1BIKSk7CisJV1JfSEFSUE9PTihwb3J0K2hwX3hmZXJzdGF0LCAwKTsKKwlXUl9IQVJQT09OKHBvcnQraHBfZmlmb3JlYWQsIDApOworCVdSX0hBUlBPT04ocG9ydCtocF9maWZvd3JpdGUsIDApOworCXJldHVybihtZXNzYWdlKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzc2VsCisgKgorICogRGVzY3JpcHRpb246IExvYWQgdXAgYXV0b21hdGlvbiBhbmQgc2VsZWN0IHRhcmdldCBkZXZpY2UuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCit2b2lkIHNzZWwoVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbHNlCit2b2lkIHNzZWwoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2VuZGlmCit7CisKKyNpZiBkZWZpbmVkKERPUykKKyAgIFVDSEFSIGF1dG9fbG9hZGVkLCBpLCB0YXJnZXQsICp0aGVDQ0I7CisjZWxpZiBkZWZpbmVkKE9TMikKKyAgIFVDSEFSIGF1dG9fbG9hZGVkLCBpLCB0YXJnZXQ7CisgICBVQ0hBUiBmYXIgKnRoZUNDQjsKKyNlbHNlCisgICBVQ0hBUiBhdXRvX2xvYWRlZCwgaSwgdGFyZ2V0LCAqdGhlQ0NCOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKERPUykKKyAgIFVTSE9SVCBjZGJfcmVnOworI2Vsc2UKKyAgIFVMT05HIGNkYl9yZWc7CisjZW5kaWYKKyAgIFBTQ0NCY2FyZCBDdXJyQ2FyZDsKKyAgIFBTQ0NCIGN1cnJTQ0NCOworICAgUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworICAgVUNIQVIgbGFzdFRhZywgbHVuOworCisgICBDdXJyQ2FyZCA9ICZCTF9DYXJkW3BfY2FyZF07CisgICBjdXJyU0NDQiA9IEN1cnJDYXJkLT5jdXJyZW50U0NDQjsKKyAgIHRhcmdldCA9IGN1cnJTQ0NCLT5UYXJnSUQ7CisgICBjdXJyVGFyX0luZm8gPSAmc2NjYk1nclRibFtwX2NhcmRdW3RhcmdldF07CisgICBsYXN0VGFnID0gQ3VyckNhcmQtPnRhZ1FfTHN0OworCisgICBBUkFNX0FDQ0VTUyhwb3J0KTsKKworCisJaWYgKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSA9PSBUQUdfUV9SRUpFQ1QpCisJCWN1cnJTQ0NCLT5Db250cm9sQnl0ZSAmPSB+Rl9VU0VfQ01EX1E7CisKKwlpZigoKEN1cnJDYXJkLT5nbG9iYWxGbGFncyAmIEZfQ09OTFVOX0lPKSAmJiAKKwkJKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSAhPSBUQUdfUV9UUllJTkcpKSkKKworCSAgIGx1biA9IGN1cnJTQ0NCLT5MdW47CisJZWxzZQorCQlsdW4gPSAwOworCisKKyNpZiBkZWZpbmVkKERPUykKKyAgIGN1cnJUYXJfSW5mby0+VGFyTFVOQnVzeVtsdW5dID0gVFJVRTsKKworI2Vsc2UKKworICAgaWYgKEN1cnJDYXJkLT5nbG9iYWxGbGFncyAmIEZfVEFHX1NUQVJURUQpCisgICAgICB7CisgICAgICBpZiAoIShjdXJyU0NDQi0+Q29udHJvbEJ5dGUgJiBGX1VTRV9DTURfUSkpCisgICAgICAgICB7CisgICAgICAJaWYgKChjdXJyVGFyX0luZm8tPlRhckxVTl9DQSA9PSBGQUxTRSkKKyAgICAgIAkgICAgJiYgKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKQorICAgICAgCSAgICA9PSBUQUdfUV9UUllJTkcpKQorICAgICAgICAgICAgeworCisJICAgICAgICAgaWYgKGN1cnJUYXJfSW5mby0+VGFyVGFnUV9DbnQgIT0wKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgCQkgICBjdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbbHVuXSA9IFRSVUU7CisgICAgICAgICAgICAJCXF1ZXVlU2VsZWN0RmFpbChDdXJyQ2FyZCxwX2NhcmQpOworCQkJCQkgICBTR1JBTV9BQ0NFU1MocG9ydCk7CisgICAgICAgICAJCSAgIHJldHVybjsKKyAgICAgICAgIAkJICAgfQorCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgIAkJICBjdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbbHVuXSA9IFRSVUU7CisgICAgICAgICAJCSAgfQorCisgICAJICAgICAgfSAgLypFbmQgbm9uLXRhZ2dlZCAqLworCisJICAgICAgZWxzZSB7CisJICAgICAgICAgY3VyclRhcl9JbmZvLT5UYXJMVU5CdXN5W2x1bl0gPSBUUlVFOworCSAgICAgICAgIH0KKworCSAgICAgIH0gIC8qIVVzZSBjbWQgUSBUYWdnZWQgKi8KKworCSAgIGVsc2UgeworICAgCSAgICAgaWYgKGN1cnJUYXJfSW5mby0+VGFyTFVOX0NBID09IFRSVUUpCisgICAgICAgICAgICAgICB7CisgICAgICAJICAgICAgcXVldWVTZWxlY3RGYWlsKEN1cnJDYXJkLHBfY2FyZCk7CisJCQkJICAgU0dSQU1fQUNDRVNTKHBvcnQpOworICAgICAgCSAgICAgIHJldHVybjsKKwkgICAgICAgICAgICB9CisKKwkgICAgICAgIGN1cnJUYXJfSW5mby0+VGFyTFVOQnVzeVtsdW5dID0gVFJVRTsKKworICAgCSAgICAgfSAgLyplbHNlIHVzZSBjbWQgUSB0YWdnZWQgKi8KKworICAgICAgfSAgLyppZiBnbG9iIHRhZ2dlZCBzdGFydGVkICovCisKKyAgIGVsc2UgeworICAgICAgICBjdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbbHVuXSA9IFRSVUU7CisgICAgICAgIH0KKworI2VuZGlmIC8qIERPUyAqLworCisKKworCWlmKCgoKEN1cnJDYXJkLT5nbG9iYWxGbGFncyAmIEZfQ09OTFVOX0lPKSAmJiAKKwkJKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSAhPSBUQUdfUV9UUllJTkcpKSAKKwkJfHwgKCEoY3VyclNDQ0ItPkNvbnRyb2xCeXRlICYgRl9VU0VfQ01EX1EpKSkpCisJeworCQlpZihDdXJyQ2FyZC0+ZGlzY1FDb3VudCA+PSBRVUVVRV9ERVBUSCkKKwkJeworCQkJY3VyclRhcl9JbmZvLT5UYXJMVU5CdXN5W2x1bl0gPSBUUlVFOworCQkJcXVldWVTZWxlY3RGYWlsKEN1cnJDYXJkLHBfY2FyZCk7CisJCQlTR1JBTV9BQ0NFU1MocG9ydCk7CisJCQlyZXR1cm47CisJCX0KKwkJZm9yIChpID0gMTsgaSA8IFFVRVVFX0RFUFRIOyBpKyspCisJCXsKKwkJCWlmICgrK2xhc3RUYWcgPj0gUVVFVUVfREVQVEgpIGxhc3RUYWcgPSAxOworCQkJaWYgKEN1cnJDYXJkLT5kaXNjUV9UYmxbbGFzdFRhZ10gPT0gTlVMTCkKKwkJCXsKKwkJCQlDdXJyQ2FyZC0+dGFnUV9Mc3QgPSBsYXN0VGFnOworCQkJCWN1cnJUYXJfSW5mby0+THVuRGlzY1FfSWR4W2x1bl0gPSBsYXN0VGFnOworCQkJCUN1cnJDYXJkLT5kaXNjUV9UYmxbbGFzdFRhZ10gPSBjdXJyU0NDQjsKKwkJCQlDdXJyQ2FyZC0+ZGlzY1FDb3VudCsrOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmKGkgPT0gUVVFVUVfREVQVEgpCisJCXsKKwkJCWN1cnJUYXJfSW5mby0+VGFyTFVOQnVzeVtsdW5dID0gVFJVRTsKKwkJCXF1ZXVlU2VsZWN0RmFpbChDdXJyQ2FyZCxwX2NhcmQpOworCQkJU0dSQU1fQUNDRVNTKHBvcnQpOworCQkJcmV0dXJuOworCQl9CisJfQorCisKKworICAgYXV0b19sb2FkZWQgPSBGQUxTRTsKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX3NlbGVjdF9pZCwgdGFyZ2V0KTsKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9ncF9yZWdfMywgdGFyZ2V0KTsgIC8qIFVzZSBieSBuZXcgYXV0b21hdGlvbiBsb2dpYyAqLworCisgICBpZiAoY3VyclNDQ0ItPk9wZXJhdGlvbkNvZGUgPT0gUkVTRVRfQ09NTUFORCkgeworICAgICAgV1JXX0hBUlBPT04oKHBvcnQrSURfTVNHX1NUUlQpLCAoTVBNX09QK0FNU0dfT1VUKworICAgICAgICAgICAgICAgCSAoY3VyclNDQ0ItPlNjY2JfaWRtc2cgJiB+RElTQ19QUklWKSkpOworCisgICAgICBXUldfSEFSUE9PTigocG9ydCtJRF9NU0dfU1RSVCsyKSxCUkhfT1ArQUxXQVlTK05QKTsKKworICAgICAgY3VyclNDQ0ItPlNjY2Jfc2NzaW1zZyA9IFNNREVWX1JFU0VUOworCisgICAgICBXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzMsIChTRUxFQ1QrU0VMQ0hLX1NUUlQpKTsKKyAgICAgIGF1dG9fbG9hZGVkID0gVFJVRTsKKyAgICAgIGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID0gU0VMRUNUX0JEUl9TVDsKKworICAgICAgaWYgKGN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSAmIEVFX1NZTkNfTUFTSykKKyAgICAgICAgIHsKKwkgICAgICAgY3VyclRhcl9JbmZvLT5UYXJTeW5jQ3RybCA9IDA7CisJICAgICAgY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJj0gflRBUl9TWU5DX01BU0s7CisJICAgICAgfQorCisjaWYgZGVmaW5lZChXSURFX1NDU0kpCisKKyAgICAgIGlmIChjdXJyVGFyX0luZm8tPlRhckVFVmFsdWUgJiBFRV9XSURFX1NDU0kpCisgICAgICAgICB7CisgICAgICAJY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJj0gflRBUl9XSURFX01BU0s7CisgICAgICAJfQorI2VuZGlmCisKKyAgICAgIHNzc3luY3YocG9ydCwgdGFyZ2V0LCBOQVJST1dfU0NTSSxjdXJyVGFyX0luZm8pOworICAgICAgU2NjYk1nclRhYmxlSW5pdFRhcmdldChwX2NhcmQsIHRhcmdldCk7CisKKyAgICAgIH0KKworCQllbHNlIGlmKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IEFCT1JUX1NUKQorCQl7CisJCQlXUldfSEFSUE9PTigocG9ydCtJRF9NU0dfU1RSVCksIChNUE1fT1ArQU1TR19PVVQrCisJCQkJCQkJCShjdXJyU0NDQi0+U2NjYl9pZG1zZyAmIH5ESVNDX1BSSVYpKSk7CisKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K0lEX01TR19TVFJUKzIpLEJSSF9PUCtBTFdBWVMrQ01EUFopOworCisJCQlXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrMCksIChNUE1fT1ArQU1TR19PVVQrCisJCQkJCQkJCSgoKFVDSEFSKShjdXJyU0NDQi0+Q29udHJvbEJ5dGUgJiBUQUdfVFlQRV9NQVNLKQorCQkJCQkJCQk+PiA2KSB8IChVQ0hBUikweDIwKSkpOworCQkJV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzIpLAorCQkJCQkJCShNUE1fT1ArQU1TR19PVVQrY3VyclNDQ0ItPlNjY2JfdGFnKSk7CisJCQlXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrNCksIChCUkhfT1ArQUxXQVlTK05QICkpOworCisJCQlXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzMsIChTRUxFQ1QrU0VMQ0hLX1NUUlQpKTsKKwkJCWF1dG9fbG9hZGVkID0gVFJVRTsKKwkJCisJCX0KKworI2lmIGRlZmluZWQoV0lERV9TQ1NJKQorCisKKyAgIGVsc2UgaWYgKCEoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBXSURFX05FR09DSUFURUQpKSAgeworICAgICAgYXV0b19sb2FkZWQgPSBzaXdpZG4ocG9ydCxwX2NhcmQpOworICAgICAgY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPSBTRUxFQ1RfV05fU1Q7CisgICAgICB9CisKKyNlbmRpZgorCisKKyAgIGVsc2UgaWYgKCEoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYgVEFSX1NZTkNfTUFTSykKKyAgICAgID09IFNZTkNfU1VQUE9SVEVEKSkgIHsKKyAgICAgIGF1dG9fbG9hZGVkID0gc2lzeW5jbihwb3J0LHBfY2FyZCwgRkFMU0UpOworICAgICAgY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPSBTRUxFQ1RfU05fU1Q7CisgICAgICB9CisKKworICAgaWYgKCFhdXRvX2xvYWRlZCkKKyAgICAgIHsKKworI2lmICFkZWZpbmVkKERPUykKKyAgICAgIGlmIChjdXJyU0NDQi0+Q29udHJvbEJ5dGUgJiBGX1VTRV9DTURfUSkKKyAgICAgICAgIHsKKworICAgICAgICAgQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfVEFHX1NUQVJURUQ7CisKKyAgICAgICAgIGlmICgoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBUQVJfVEFHX1FfTUFTSykKKyAgICAgICAgICAgID09IFRBR19RX1JFSkVDVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJTQ0NCLT5Db250cm9sQnl0ZSAmPSB+Rl9VU0VfQ01EX1E7CisKKyAgICAgICAgICAgIC8qIEZpeCB1cCB0aGUgc3RhcnQgaW5zdHJ1Y3Rpb24gd2l0aCBhIGp1bXAgdG8KKyAgICAgICAgICAgICAgIE5vbi1UYWctQ01EIGhhbmRsaW5nICovCisgICAgICAgICAgICBXUldfSEFSUE9PTigocG9ydCtJRF9NU0dfU1RSVCksQlJIX09QK0FMV0FZUytOVENNRCk7CisKKyAgICAgICAgICAgIFdSV19IQVJQT09OKChwb3J0K05PTl9UQUdfSURfTVNHKSwKKwkgICAgICAgICAgICAgICAgICAgICAoTVBNX09QK0FNU0dfT1VUK2N1cnJTQ0NCLT5TY2NiX2lkbXNnKSk7CisKKwkgICAgICAgICBXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzMsIChTRUxFQ1QrU0VMQ0hLX1NUUlQpKTsKKworCSAgICAgICAgIC8qIFNldHVwIG91ciBTVEFURSBzbyB3ZSBrbm93IHdoYXQgaGFwcGVuZCB3aGVuCisgICAgICAgICAgICAgICB0aGUgd2hlZWxzIGZhbGwgb2ZmLiAqLworICAgICAgICAgICAgY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPSBTRUxFQ1RfU1Q7CisKKwkgICAgICAgICBjdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbbHVuXSA9IFRSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFdSV19IQVJQT09OKChwb3J0K0lEX01TR19TVFJUKSwgKE1QTV9PUCtBTVNHX09VVCtjdXJyU0NDQi0+U2NjYl9pZG1zZykpOworCisgICAgICAgICAgICBXUldfSEFSUE9PTigocG9ydCtJRF9NU0dfU1RSVCsyKSwgKE1QTV9PUCtBTVNHX09VVCsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKFVDSEFSKShjdXJyU0NDQi0+Q29udHJvbEJ5dGUgJiBUQUdfVFlQRV9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgPj4gNikgfCAoVUNIQVIpMHgyMCkpKTsKKworCQkJCWZvciAoaSA9IDE7IGkgPCBRVUVVRV9ERVBUSDsgaSsrKQorCQkJCXsKKwkJCQkJaWYgKCsrbGFzdFRhZyA+PSBRVUVVRV9ERVBUSCkgbGFzdFRhZyA9IDE7CisJCQkJCWlmIChDdXJyQ2FyZC0+ZGlzY1FfVGJsW2xhc3RUYWddID09IE5VTEwpCisJCQkJCXsKKwkJCQkJCVdSV19IQVJQT09OKChwb3J0K0lEX01TR19TVFJUKzYpLAorCQkJCQkJCShNUE1fT1ArQU1TR19PVVQrbGFzdFRhZykpOworCQkJCQkJQ3VyckNhcmQtPnRhZ1FfTHN0ID0gbGFzdFRhZzsKKwkJCQkJCWN1cnJTQ0NCLT5TY2NiX3RhZyA9IGxhc3RUYWc7CisJCQkJCQlDdXJyQ2FyZC0+ZGlzY1FfVGJsW2xhc3RUYWddID0gY3VyclNDQ0I7CisJCQkJCQlDdXJyQ2FyZC0+ZGlzY1FDb3VudCsrOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKworICAgICAgICAgICAgaWYgKCBpID09IFFVRVVFX0RFUFRIICkKKyAgICAgICAgICAgICAgIHsKKyAgIAkgICAgICAgICBjdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbbHVuXSA9IFRSVUU7CisgICAgICAgICAgICAgICBxdWV1ZVNlbGVjdEZhaWwoQ3VyckNhcmQscF9jYXJkKTsKKwkJCQkgICBTR1JBTV9BQ0NFU1MocG9ydCk7CisgICAJICAgICAgICAgcmV0dXJuOworICAgCSAgICAgICAgIH0KKworICAgICAgICAgICAgY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPSBTRUxFQ1RfUV9TVDsKKworICAgCSAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9hdXRvc3RhcnRfMywgKFNFTEVDVCtTRUxDSEtfU1RSVCkpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICBlbHNlCisgICAgICAgICB7CisjZW5kaWYgICAvKiAhRE9TICovCisKKyAgICAgICAgIFdSV19IQVJQT09OKChwb3J0K0lEX01TR19TVFJUKSxCUkhfT1ArQUxXQVlTK05UQ01EKTsKKworICAgICAgCVdSV19IQVJQT09OKChwb3J0K05PTl9UQUdfSURfTVNHKSwKKyAgICAgICAgICAgIChNUE1fT1ArQU1TR19PVVQrY3VyclNDQ0ItPlNjY2JfaWRtc2cpKTsKKworICAgICAgICAgY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPSBTRUxFQ1RfU1Q7CisKKyAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9hdXRvc3RhcnRfMywgKFNFTEVDVCtTRUxDSEtfU1RSVCkpOworI2lmICFkZWZpbmVkKERPUykKKyAgICAgICAgIH0KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKE9TMikKKyAgICAgIHRoZUNDQiA9IChVQ0hBUiBmYXIgKikmY3VyclNDQ0ItPkNkYlswXTsKKyNlbHNlCisgICAgICB0aGVDQ0IgPSAoVUNIQVIgKikmY3VyclNDQ0ItPkNkYlswXTsKKyNlbmRpZgorCisgICAgICBjZGJfcmVnID0gcG9ydCArIENNRF9TVFJUOworCisgICAgICBmb3IgKGk9MDsgaSA8IGN1cnJTQ0NCLT5DZGJMZW5ndGg7IGkrKykKKyAgICAgICAgIHsKKyAgICAgICAgIFdSV19IQVJQT09OKGNkYl9yZWcsIChNUE1fT1AgKyBBQ09NTUFORCArICp0aGVDQ0IpKTsKKyAgICAgICAgIGNkYl9yZWcgKz0yOworICAgICAgICAgdGhlQ0NCKys7CisgICAgICAgICB9CisKKyAgICAgIGlmIChjdXJyU0NDQi0+Q2RiTGVuZ3RoICE9IFRXRUxWRV9CWVRFX0NNRCkKKyAgICAgICAgIFdSV19IQVJQT09OKGNkYl9yZWcsIChCUkhfT1ArQUxXQVlTKyAgICBOUCkpOworCisgICAgICB9ICAvKiBhdXRvX2xvYWRlZCAqLworCisjaWYgZGVmaW5lZChXSURFX1NDU0kpCisgICBXUldfSEFSUE9PTigocG9ydCtocF9maWZvcmVhZCksIChVU0hPUlQpIDB4MDApOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3hmZXJzdGF0LCAweDAwKTsKKyNlbmRpZgorCisgICBXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgKFBST0dfSExUIHwgVElNRU9VVCB8IFNFTCB8IEJVU19GUkVFKSk7CisKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9wb3J0Y3RybF8wLChTQ1NJX1BPUlQpKTsKKworCisgICBpZiAoIShjdXJyU0NDQi0+U2NjYl9NR1JGbGFncyAmIEZfREVWX1NFTEVDVEVEKSkKKyAgICAgIHsKKyAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9zY3NpY3RybF8wLCAoU0VMX1RBUiB8IEVOQV9BVE4gfCBFTkFfUkVTRUwgfCBFTkFfU0NBTV9TRUwpKTsKKyAgICAgIH0KKyAgIGVsc2UKKyAgICAgIHsKKworLyogICAgICBhdXRvX2xvYWRlZCA9ICAoUkRfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8zKSAmIChVQ0hBUikweDFGKTsKKyAgICAgIGF1dG9fbG9hZGVkIHw9IEFVVE9fSU1NRUQ7ICovCisgICAgICBhdXRvX2xvYWRlZCA9IEFVVE9fSU1NRUQ7CisKKyAgICAgIERJU0FCTEVfQVVUTyhwb3J0KTsKKworICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8zLCBhdXRvX2xvYWRlZCk7CisgICAgICB9CisKKyAgIFNHUkFNX0FDQ0VTUyhwb3J0KTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzcmVzCisgKgorICogRGVzY3JpcHRpb246IEhvb2t1cCB0aGUgY29ycmVjdCBDQ0IgYW5kIGhhbmRsZSB0aGUgaW5jb21pbmcgbWVzc2FnZXMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCit2b2lkIHNyZXMoVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCwgUFNDQ0JjYXJkIHBDdXJyQ2FyZCkKKyNlbHNlCit2b2lkIHNyZXMoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkLCBQU0NDQmNhcmQgcEN1cnJDYXJkKQorI2VuZGlmCit7CisKKyNpZiBkZWZpbmVkKFYzMDIpCisjaWZkZWYgRE9TCisgICBVQ0hBUiBvdXJfdGFyZ2V0LG1lc3NhZ2UsIG1zZ1JldHJ5Q291bnQ7CisgICBleHRlcm4gVUNIQVIgbHVuLCB0YWc7CisjZWxzZQorICAgVUNIQVIgb3VyX3RhcmdldCxtZXNzYWdlLGx1bix0YWcsIG1zZ1JldHJ5Q291bnQ7CisjZW5kaWYKKworI2Vsc2UgIC8qIFYzMDIgKi8KKyAgIFVDSEFSIG91cl90YXJnZXQsIG1lc3NhZ2UsIGx1biA9IDAsIHRhZywgbXNnUmV0cnlDb3VudDsKKyNlbmRpZiAvKiBWMzAyICovCisKKworICAgUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworCVBTQ0NCIGN1cnJTQ0NCOworCisKKworCisJaWYocEN1cnJDYXJkLT5jdXJyZW50U0NDQiAhPSBOVUxMKQorCXsKKwkJY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVtwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCLT5UYXJnSURdOworCQlESVNBQkxFX0FVVE8ocG9ydCk7CisKKworCQlXUl9IQVJQT09OKChwb3J0K2hwX3Njc2ljdHJsXzApLChFTkFfUkVTRUwgfCBFTkFfU0NBTV9TRUwpKTsKKworCisJCWN1cnJTQ0NCID0gcEN1cnJDYXJkLT5jdXJyZW50U0NDQjsKKwkJaWYoY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPT0gU0VMRUNUX1dOX1NUKQorCQl7CisJCQljdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmPSB+VEFSX1dJREVfTUFTSzsKKwkJCWN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID0gQlVTX0ZSRUVfU1Q7CisJCX0KKwkJaWYoY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPT0gU0VMRUNUX1NOX1NUKQorCQl7CisJCQljdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmPSB+VEFSX1NZTkNfTUFTSzsKKwkJCWN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID0gQlVTX0ZSRUVfU1Q7CisJCX0KKwkJaWYoKChwQ3VyckNhcmQtPmdsb2JhbEZsYWdzICYgRl9DT05MVU5fSU8pICYmCisJCQkoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYgVEFSX1RBR19RX01BU0spICE9IFRBR19RX1RSWUlORykpKQorCQl7CisgICAgICAJY3VyclRhcl9JbmZvLT5UYXJMVU5CdXN5W2N1cnJTQ0NCLT5MdW5dID0gRkFMU0U7CisJCQlpZihjdXJyU0NDQi0+U2NjYl9zY3Npc3RhdCAhPSBBQk9SVF9TVCkKKwkJCXsKKwkJCQlwQ3VyckNhcmQtPmRpc2NRQ291bnQtLTsKKwkJCQlwQ3VyckNhcmQtPmRpc2NRX1RibFtjdXJyVGFyX0luZm8tPkx1bkRpc2NRX0lkeFtjdXJyU0NDQi0+THVuXV0gCisJCQkJCQkJCQkJCQkJPSBOVUxMOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCSAgICAgIGN1cnJUYXJfSW5mby0+VGFyTFVOQnVzeVswXSA9IEZBTFNFOworCQkJaWYoY3VyclNDQ0ItPlNjY2JfdGFnKQorCQkJeworCQkJCWlmKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ICE9IEFCT1JUX1NUKQorCQkJCXsKKwkJCQkJcEN1cnJDYXJkLT5kaXNjUUNvdW50LS07CisJCQkJCXBDdXJyQ2FyZC0+ZGlzY1FfVGJsW2N1cnJTQ0NCLT5TY2NiX3RhZ10gPSBOVUxMOworCQkJCX0KKwkJCX1lbHNlCisJCQl7CisJCQkJaWYoY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgIT0gQUJPUlRfU1QpCisJCQkJeworCQkJCQlwQ3VyckNhcmQtPmRpc2NRQ291bnQtLTsKKwkJCQkJcEN1cnJDYXJkLT5kaXNjUV9UYmxbY3VyclRhcl9JbmZvLT5MdW5EaXNjUV9JZHhbMF1dID0gTlVMTDsKKwkJCQl9CisJCQl9CisJCX0KKworICAgICAgcXVldWVTZWxlY3RGYWlsKCZCTF9DYXJkW3BfY2FyZF0scF9jYXJkKTsKKwl9CisKKyNpZiBkZWZpbmVkKFdJREVfU0NTSSkKKwlXUldfSEFSUE9PTigocG9ydCtocF9maWZvcmVhZCksIChVU0hPUlQpIDB4MDApOworI2VuZGlmCisKKworCW91cl90YXJnZXQgPSAoVUNIQVIpKFJEX0hBUlBPT04ocG9ydCtocF9zZWxlY3RfaWQpID4+IDQpOworCWN1cnJUYXJfSW5mbyA9ICZzY2NiTWdyVGJsW3BfY2FyZF1bb3VyX3RhcmdldF07CisKKworCW1zZ1JldHJ5Q291bnQgPSAwOworCWRvCisJeworCisjaWYgZGVmaW5lZChWMzAyKQorCisJCW1lc3NhZ2UgPSBHZXRUYXJMdW4ocG9ydCwgcF9jYXJkLCBvdXJfdGFyZ2V0LCBwQ3VyckNhcmQsICZ0YWcsICZsdW4pOworCisjZWxzZSAvKiBWMzAyICovCisKKwkJY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVtvdXJfdGFyZ2V0XTsKKwkJdGFnID0gMDsKKworCisJCXdoaWxlKCEoUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9SRVEpKQorCQl7CisJCQlpZiAoISAoUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9CU1kpKQorCQkJeworCisJCQkJV1JXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCksIFBIQVNFKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgUEhBU0UpOworCQlpZiAoKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNfU0NTSV9QSFopID09IFNfTVNHSV9QSCkKKwkJeworCisJCQltZXNzYWdlID0gc2ZtKHBvcnQscEN1cnJDYXJkLT5jdXJyZW50U0NDQik7CisJCQlpZiAobWVzc2FnZSkKKwkJCXsKKworCQkJCWlmIChtZXNzYWdlIDw9ICgweDgwIHwgTFVOX01BU0spKQorCQkJCXsKKwkJCQkJbHVuID0gbWVzc2FnZSAmIChVQ0hBUilMVU5fTUFTSzsKKworI2lmICFkZWZpbmVkKERPUykKKwkJCQkJaWYgKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSA9PSBUQUdfUV9UUllJTkcpCisJCQkJCXsKKwkJCQkJCWlmIChjdXJyVGFyX0luZm8tPlRhclRhZ1FfQ250ICE9IDApCisJCQkJCQl7CisKKwkJCQkJCQlpZiAoIShjdXJyVGFyX0luZm8tPlRhckxVTl9DQSkpCisJCQkJCQkJeworCQkJCQkJCQlBQ0NFUFRfTVNHKHBvcnQpOyAgICAvKlJlbGVhc2UgdGhlIEFDSyBmb3IgSUQgbXNnLiAqLworCisKKwkJCQkJCQkJbWVzc2FnZSA9IHNmbShwb3J0LHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IpOworCQkJCQkJCQlpZiAobWVzc2FnZSkKKwkJCQkJCQkJeworCQkJCQkJCQkJQUNDRVBUX01TRyhwb3J0KTsKKwkJCQkJCQkJfQorCisJCQkJCQkJCWVsc2UKKyAgIAkJCQkJCQkJbWVzc2FnZSA9IEZBTFNFOworCisJCQkJCQkJCWlmKG1lc3NhZ2UgIT0gRkFMU0UpCisJCQkJCQkJCXsKKwkJCQkJCQkJCXRhZyA9IHNmbShwb3J0LHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IpOworCisJCQkJCQkJCQlpZiAoISh0YWcpKSAKKwkJCQkJCQkJCQltZXNzYWdlID0gRkFMU0U7CisJCQkJCQkJCX0KKworCQkJCQkJCX0gLypDLkEuIGV4aXN0cyEgKi8KKworCQkJCQkJfSAvKkVuZCBRIGNudCAhPSAwICovCisKKwkJCQkJfSAvKkVuZCBUYWcgY21kcyBzdXBwb3J0ZWQhICovCisjZW5kaWYgLyogIURPUyAqLworCisJCQkJfSAvKkVuZCB2YWxpZCBJRCBtZXNzYWdlLiAgKi8KKworCQkJCWVsc2UKKwkJCQl7CisKKwkJCQkJQUNDRVBUX01TR19BVE4ocG9ydCk7CisJCQkJfQorCisJCQl9IC8qIEVuZCBnb29kIGlkIG1lc3NhZ2UuICovCisKKwkJCWVsc2UKKwkJCXsKKworCQkJCW1lc3NhZ2UgPSBGQUxTRTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCUFDQ0VQVF9NU0dfQVROKHBvcnQpOworCisJCSAgIHdoaWxlICghKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIChQSEFTRSB8IFJFU0VUKSkgJiYKKwkJCSAgIShSRF9IQVJQT09OKHBvcnQraHBfc2NzaXNpZykgJiBTQ1NJX1JFUSkgJiYKKwkJCSAgKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNDU0lfQlNZKSkgOworCisJCQlyZXR1cm47CisJCX0KKwkKKyNlbmRpZiAvKiBWMzAyICovCisKKwkJaWYobWVzc2FnZSA9PSBGQUxTRSkKKwkJeworCQkJbXNnUmV0cnlDb3VudCsrOworCQkJaWYobXNnUmV0cnlDb3VudCA9PSAxKQorCQkJeworCQkJCVNlbmRNc2cocG9ydCwgU01QQVJJVFkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVNlbmRNc2cocG9ydCwgU01ERVZfUkVTRVQpOworCisJCQkJc3NzeW5jdihwb3J0LCBvdXJfdGFyZ2V0LCBOQVJST1dfU0NTSSxjdXJyVGFyX0luZm8pOworCisJCQkJaWYgKHNjY2JNZ3JUYmxbcF9jYXJkXVtvdXJfdGFyZ2V0XS5UYXJFRVZhbHVlICYgRUVfU1lOQ19NQVNLKSAKKwkJCQl7CisJCQkKKwkJCQkJc2NjYk1nclRibFtwX2NhcmRdW291cl90YXJnZXRdLlRhclN0YXR1cyAmPSB+VEFSX1NZTkNfTUFTSzsKKworCQkJCX0KKworCQkJCWlmIChzY2NiTWdyVGJsW3BfY2FyZF1bb3VyX3RhcmdldF0uVGFyRUVWYWx1ZSAmIEVFX1dJREVfU0NTSSkgCisJCQkJeworCisJCQkJCXNjY2JNZ3JUYmxbcF9jYXJkXVtvdXJfdGFyZ2V0XS5UYXJTdGF0dXMgJj0gflRBUl9XSURFX01BU0s7CisJCQkJfQorCisKKwkJCQlxdWV1ZUZsdXNoVGFyZ1NjY2IocF9jYXJkLCBvdXJfdGFyZ2V0LCBTQ0NCX0NPTVBMRVRFKTsKKwkJCQlTY2NiTWdyVGFibGVJbml0VGFyZ2V0KHBfY2FyZCxvdXJfdGFyZ2V0KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9d2hpbGUobWVzc2FnZSA9PSBGQUxTRSk7CisKKworCisJaWYoKChwQ3VyckNhcmQtPmdsb2JhbEZsYWdzICYgRl9DT05MVU5fSU8pICYmCisJCSgoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBUQVJfVEFHX1FfTUFTSykgIT0gVEFHX1FfVFJZSU5HKSkpCisJeworCQljdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbbHVuXSA9IFRSVUU7CisJCXBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgPSBwQ3VyckNhcmQtPmRpc2NRX1RibFtjdXJyVGFyX0luZm8tPkx1bkRpc2NRX0lkeFtsdW5dXTsKKwkJaWYocEN1cnJDYXJkLT5jdXJyZW50U0NDQiAhPSBOVUxMKQorCQl7CisJCQlBQ0NFUFRfTVNHKHBvcnQpOworCQl9CisJCWVsc2UgCisJCXsKKwkJCUFDQ0VQVF9NU0dfQVROKHBvcnQpOworCQl9CisJfQorCWVsc2UKKwl7CisJCWN1cnJUYXJfSW5mby0+VGFyTFVOQnVzeVswXSA9IFRSVUU7CisKKworCQlpZiAodGFnKQorCQl7CisJCQlpZiAocEN1cnJDYXJkLT5kaXNjUV9UYmxbdGFnXSAhPSBOVUxMKQorCQkJeworCQkJCXBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgPSBwQ3VyckNhcmQtPmRpc2NRX1RibFt0YWddOworCQkgCQljdXJyVGFyX0luZm8tPlRhclRhZ1FfQ250LS07CisJCQkJQUNDRVBUX01TRyhwb3J0KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCUFDQ0VQVF9NU0dfQVROKHBvcnQpOworCQkJfQorCQl9ZWxzZQorCQl7CisJCQlwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCID0gcEN1cnJDYXJkLT5kaXNjUV9UYmxbY3VyclRhcl9JbmZvLT5MdW5EaXNjUV9JZHhbMF1dOworCQkJaWYocEN1cnJDYXJkLT5jdXJyZW50U0NDQiAhPSBOVUxMKQorCQkJeworCQkJCUFDQ0VQVF9NU0cocG9ydCk7CisJCQl9CisJCQllbHNlIAorCQkJeworCQkJCUFDQ0VQVF9NU0dfQVROKHBvcnQpOworCQkJfQorCQl9CisJfQorCisJaWYocEN1cnJDYXJkLT5jdXJyZW50U0NDQiAhPSBOVUxMKQorCXsKKwkJaWYocEN1cnJDYXJkLT5jdXJyZW50U0NDQi0+U2NjYl9zY3Npc3RhdCA9PSBBQk9SVF9TVCkKKwkJeworCQkvKiBEdXJpbmcgQWJvcnQgVGFnIGNvbW1hbmQsIHRoZSB0YXJnZXQgY291bGQgaGF2ZSBnb3QgcmUtc2VsZWN0ZWQKKwkJCWFuZCBjb21wbGV0ZWQgdGhlIGNvbW1hbmQuIENoZWNrIHRoZSBzZWxlY3QgUSBhbmQgcmVtb3ZlIHRoZSBDQ0IKKwkJCWlmIGl0IGlzIGluIHRoZSBTZWxlY3QgUSAqLworCQkJcXVldWVGaW5kU2NjYihwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCLCBwX2NhcmQpOworCQl9CisJfQorCisKKyAgIHdoaWxlICghKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIChQSEFTRSB8IFJFU0VUKSkgJiYKKwkgICEoUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9SRVEpICYmCisJICAoUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9CU1kpKSA7Cit9CisKKyNpZiBkZWZpbmVkKFYzMDIpCisKKyNpZiBkZWZpbmVkKERPUykKK1VDSEFSIEdldFRhckx1bihVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkLCBVQ0hBUiBvdXJfdGFyZ2V0LCBQU0NDQmNhcmQgcEN1cnJDYXJkLCBQVUNIQVIgdGFnLCBQVUNIQVIgbHVuKQorI2Vsc2UKK1VDSEFSIEdldFRhckx1bihVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQsIFVDSEFSIG91cl90YXJnZXQsIFBTQ0NCY2FyZCBwQ3VyckNhcmQsIFBVQ0hBUiB0YWcsIFBVQ0hBUiBsdW4pCisjZW5kaWYKK3sKKyAgIFVDSEFSIG1lc3NhZ2U7CisgICBQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CisKKworCWN1cnJUYXJfSW5mbyA9ICZzY2NiTWdyVGJsW3BfY2FyZF1bb3VyX3RhcmdldF07CisJKnRhZyA9IDA7CisKKworCXdoaWxlKCEoUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9SRVEpKQorCXsKKwkJaWYgKCEgKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNDU0lfQlNZKSkKKwkJeworCisJCQlXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgUEhBU0UpOworCQkJcmV0dXJuKFRSVUUpOworCQl9CisJfQorCisJV1JXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCksIFBIQVNFKTsKKwlpZiAoKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNfU0NTSV9QSFopID09IFNfTVNHSV9QSCkKKwl7CisKKwkJbWVzc2FnZSA9IHNmbShwb3J0LHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IpOworCQlpZiAobWVzc2FnZSkKKwkJeworCisJCQlpZiAobWVzc2FnZSA8PSAoMHg4MCB8IExVTl9NQVNLKSkKKwkJCXsKKwkJCQkqbHVuID0gbWVzc2FnZSAmIChVQ0hBUilMVU5fTUFTSzsKKworI2lmICFkZWZpbmVkKERPUykKKwkJCQlpZiAoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYgVEFSX1RBR19RX01BU0spID09IFRBR19RX1RSWUlORykKKwkJCQl7CisJCQkJCWlmIChjdXJyVGFyX0luZm8tPlRhclRhZ1FfQ250ICE9IDApCisJCQkJCXsKKworCQkJCQkJaWYgKCEoY3VyclRhcl9JbmZvLT5UYXJMVU5fQ0EpKQorCQkJCQkJeworCQkJCQkJCUFDQ0VQVF9NU0cocG9ydCk7ICAgIC8qUmVsZWFzZSB0aGUgQUNLIGZvciBJRCBtc2cuICovCisKKworCQkJCQkJCW1lc3NhZ2UgPSBzZm0ocG9ydCxwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCKTsKKwkJCQkJCQlpZiAobWVzc2FnZSkKKwkJCQkJCQl7CisJCQkJCQkJCUFDQ0VQVF9NU0cocG9ydCk7CisJCQkJCQkJfQorCisJCQkJCQkJZWxzZQorICAgCQkJCQkJCXJldHVybihGQUxTRSk7CisKKwkJCQkJCQkqdGFnID0gc2ZtKHBvcnQscEN1cnJDYXJkLT5jdXJyZW50U0NDQik7CisKKwkJCQkJCQlpZiAoISgqdGFnKSkgcmV0dXJuKEZBTFNFKTsKKworCQkJCQkJfSAvKkMuQS4gZXhpc3RzISAqLworCisJCQkJCX0gLypFbmQgUSBjbnQgIT0gMCAqLworCisJCQkJfSAvKkVuZCBUYWcgY21kcyBzdXBwb3J0ZWQhICovCisjZW5kaWYgLyogIURPUyAqLworCisJCQl9IC8qRW5kIHZhbGlkIElEIG1lc3NhZ2UuICAqLworCisJCQllbHNlCisJCQl7CisKKwkJCQlBQ0NFUFRfTVNHX0FUTihwb3J0KTsKKwkJCX0KKworCQl9IC8qIEVuZCBnb29kIGlkIG1lc3NhZ2UuICovCisKKwkJZWxzZQorCQl7CisKKwkJCXJldHVybihGQUxTRSk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJQUNDRVBUX01TR19BVE4ocG9ydCk7CisJCXJldHVybihUUlVFKTsKKwl9CisJcmV0dXJuKFRSVUUpOworfQorCisjZW5kaWYgLyogVjMwMiAqLworCisjaWYgZGVmaW5lZChET1MpCit2b2lkIFNlbmRNc2coVVNIT1JUIHBvcnQsIFVDSEFSIG1lc3NhZ2UpCisjZWxzZQordm9pZCBTZW5kTXNnKFVMT05HIHBvcnQsIFVDSEFSIG1lc3NhZ2UpCisjZW5kaWYKK3sKKwl3aGlsZSghKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNDU0lfUkVRKSkKKwl7CisJCWlmICghIChSRF9IQVJQT09OKHBvcnQraHBfc2NzaXNpZykgJiBTQ1NJX0JTWSkpCisJCXsKKworCQkJV1JXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCksIFBIQVNFKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCVdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBQSEFTRSk7CisJaWYgKChSRF9IQVJQT09OKHBvcnQraHBfc2NzaXNpZykgJiBTX1NDU0lfUEhaKSA9PSBTX01TR09fUEgpCisJeworCQlXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgKEJVU19GUkVFIHwgUEhBU0UgfCBYRkVSX0NOVF8wKSk7CisKKworCQlXUl9IQVJQT09OKHBvcnQraHBfcG9ydGN0cmxfMCwgU0NTSV9CVVNfRU4pOworCisJCVdSX0hBUlBPT04ocG9ydCtocF9zY3NpZGF0YV8wLG1lc3NhZ2UpOworCisJCVdSX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnLCAoU0NTSV9BQ0sgKyBTX0lMTF9QSCkpOworCisJCUFDQ0VQVF9NU0cocG9ydCk7CisKKwkJV1JfSEFSUE9PTihwb3J0K2hwX3BvcnRjdHJsXzAsIDB4MDApOworCisJCWlmICgobWVzc2FnZSA9PSBTTUFCT1JUKSB8fCAobWVzc2FnZSA9PSBTTURFVl9SRVNFVCkgfHwKKwkJCQkobWVzc2FnZSA9PSBTTUFCT1JUX1RBRykgKQorCQl7CisJCQl3aGlsZSghKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIChCVVNfRlJFRSB8IFBIQVNFKSkpIHt9CisKKwkJCWlmIChSRFdfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSkgJiBCVVNfRlJFRSkKKwkJCXsKKwkJCVdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBCVVNfRlJFRSk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHNkZWNtCisgKgorICogRGVzY3JpcHRpb246IERldGVybWluZSB0aGUgcHJvcGVyIHJlc3BvbmNlIHRvIHRoZSBtZXNzYWdlIGZyb20gdGhlCisgKiAgICAgICAgICAgICAgdGFyZ2V0IGRldmljZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChET1MpCit2b2lkIHNkZWNtKFVDSEFSIG1lc3NhZ2UsIFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQordm9pZCBzZGVjbShVQ0hBUiBtZXNzYWdlLCBVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZW5kaWYKK3sKKwlQU0NDQiBjdXJyU0NDQjsKKwlQU0NDQmNhcmQgQ3VyckNhcmQ7CisJUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworCisJQ3VyckNhcmQgPSAmQkxfQ2FyZFtwX2NhcmRdOworCWN1cnJTQ0NCID0gQ3VyckNhcmQtPmN1cnJlbnRTQ0NCOworCisJY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXTsKKworCWlmIChtZXNzYWdlID09IFNNUkVTVF9EQVRBX1BUUikKKwl7CisJCWlmICghKGN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSAmIEZfTk9fREFUQV9ZRVQpKQorCQl7CisJCQljdXJyU0NDQi0+U2NjYl9BVEMgPSBjdXJyU0NDQi0+U2NjYl9zYXZlZEFUQzsKKworCQkJaG9zdERhdGFYZmVyUmVzdGFydChjdXJyU0NDQik7CisJCX0KKworCQlBQ0NFUFRfTVNHKHBvcnQpOworCQlXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzEsIChBVVRPX0lNTUVEK0RJU0NPTk5FQ1RfU1RBUlQpKTsKKwl9CisKKwllbHNlIGlmIChtZXNzYWdlID09IFNNQ01EX0NPTVApCisJeworCisKKwkJaWYgKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IFNFTEVDVF9RX1NUKQorCQl7CisJCQljdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmPSB+KFVDSEFSKVRBUl9UQUdfUV9NQVNLOworCQkJY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgfD0gKFVDSEFSKVRBR19RX1JFSkVDVDsKKwkJfQorCisJCUFDQ0VQVF9NU0cocG9ydCk7CisKKwl9CisKKwllbHNlIGlmICgobWVzc2FnZSA9PSBTTU5PX09QKSB8fCAobWVzc2FnZSA+PSBTTUlERU5UKSAKKwkJCXx8IChtZXNzYWdlID09IFNNSU5JVF9SRUNPVkVSWSkgfHwgKG1lc3NhZ2UgPT0gU01SRUxfUkVDT1ZFUlkpKQorCXsKKworCQlBQ0NFUFRfTVNHKHBvcnQpOworCQlXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzEsIChBVVRPX0lNTUVEK0RJU0NPTk5FQ1RfU1RBUlQpKTsKKwl9CisKKwllbHNlIGlmIChtZXNzYWdlID09IFNNUkVKRUNUKQorCXsKKworCQlpZiAoKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IFNFTEVDVF9TTl9TVCkgfHwKKwkJCQkoY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPT0gU0VMRUNUX1dOX1NUKSB8fAorCQkJCSgoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBUQVJfU1lOQ19NQVNLKSA9PSBTWU5DX1RSWUlORyApIHx8CisJCQkJKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSA9PSBUQUdfUV9UUllJTkcgKSApCisKKwkJeworCQkJV1JXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCksIEJVU19GUkVFKTsKKworCQkJQUNDRVBUX01TRyhwb3J0KTsKKworCisJCQl3aGlsZSAoKCEoUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9SRVEpKSAmJgorCQkJCSghKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIEJVU19GUkVFKSkpIHt9CisKKwkJCWlmKGN1cnJTQ0NCLT5MdW4gPT0gMHgwMCkKKwkJCXsKKwkJCQlpZiAoKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IFNFTEVDVF9TTl9TVCkpCisJCQkJeworCisJCQkJCWN1cnJUYXJfSW5mby0+VGFyU3RhdHVzIHw9IChVQ0hBUilTWU5DX1NVUFBPUlRFRDsKKworCQkJCQljdXJyVGFyX0luZm8tPlRhckVFVmFsdWUgJj0gfkVFX1NZTkNfTUFTSzsKKwkJCQl9CisKKyNpZiBkZWZpbmVkKFdJREVfU0NTSSkKKwkJCQllbHNlIGlmICgoY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPT0gU0VMRUNUX1dOX1NUKSkKKwkJCQl7CisKKworCQkJCQljdXJyVGFyX0luZm8tPlRhclN0YXR1cyA9IChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmCisJCQkJCQkJCQkJCQkJfldJREVfRU5BQkxFRCkgfCBXSURFX05FR09DSUFURUQ7CisKKwkJCQkJY3VyclRhcl9JbmZvLT5UYXJFRVZhbHVlICY9IH5FRV9XSURFX1NDU0k7CisKKwkJCQl9CisjZW5kaWYKKworCQkJCWVsc2UgaWYgKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSA9PSBUQUdfUV9UUllJTkcgKQorCQkJCXsKKwkJCQkJY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgPSAoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJgorCQkJCQkJCQkJCQkJCX4oVUNIQVIpVEFSX1RBR19RX01BU0spIHwgVEFHX1FfUkVKRUNUOworCisKKwkJCQkJY3VyclNDQ0ItPkNvbnRyb2xCeXRlICY9IH5GX1VTRV9DTURfUTsKKwkJCQkJQ3VyckNhcmQtPmRpc2NRQ291bnQtLTsKKwkJCQkJQ3VyckNhcmQtPmRpc2NRX1RibFtjdXJyU0NDQi0+U2NjYl90YWddID0gTlVMTDsKKwkJCQkJY3VyclNDQ0ItPlNjY2JfdGFnID0gMHgwMDsKKworCQkJCX0KKwkJCX0KKworCQkJaWYgKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIEJVU19GUkVFKQorCQkJeworCisKKwkJCQlpZihjdXJyU0NDQi0+THVuID09IDB4MDApCisJCQkJeworCQkJCQlXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgQlVTX0ZSRUUpOworCQkJCQlDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgfD0gRl9ORVdfU0NDQl9DTUQ7CisJCQkJfQorCQkJfQorCisJCQllbHNlIAorCQkJeworCisJCQkJaWYoKEN1cnJDYXJkLT5nbG9iYWxGbGFncyAmIEZfQ09OTFVOX0lPKSAmJgorCQkJCQkoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYgVEFSX1RBR19RX01BU0spICE9IFRBR19RX1RSWUlORykpCisJCQkJCWN1cnJUYXJfSW5mby0+VGFyTFVOQnVzeVtjdXJyU0NDQi0+THVuXSA9IFRSVUU7CisJCQkJZWxzZQorCQkJCQljdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbMF0gPSBUUlVFOworCisKKwkJCQljdXJyU0NDQi0+Q29udHJvbEJ5dGUgJj0gfihVQ0hBUilGX1VTRV9DTURfUTsKKworCQkJCVdSX0hBUlBPT04ocG9ydCtocF9hdXRvc3RhcnRfMSwgKEFVVE9fSU1NRUQrRElTQ09OTkVDVF9TVEFSVCkpOworCisJCQl9CisJCX0KKworCQllbHNlCisJCXsKKwkJCUFDQ0VQVF9NU0cocG9ydCk7CisKKwkJCXdoaWxlICgoIShSRF9IQVJQT09OKHBvcnQraHBfc2NzaXNpZykgJiBTQ1NJX1JFUSkpICYmCisJCQkJKCEoUkRXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCkpICYgQlVTX0ZSRUUpKSkge30KKwkKKwkJCWlmICghKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIEJVU19GUkVFKSkKKwkJCXsKKwkJCQlXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzEsIChBVVRPX0lNTUVEK0RJU0NPTk5FQ1RfU1RBUlQpKTsKKwkJCX0KKwkJfQorCX0KKworCWVsc2UgaWYgKG1lc3NhZ2UgPT0gU01FWFQpCisJeworCisJCUFDQ0VQVF9NU0cocG9ydCk7CisJCXNoYW5kZW0ocG9ydCxwX2NhcmQsY3VyclNDQ0IpOworCX0KKworCWVsc2UgaWYgKG1lc3NhZ2UgPT0gU01JR05PUldSKQorCXsKKworCQlBQ0NFUFRfTVNHKHBvcnQpOyAgICAgICAgICAvKiBBQ0sgdGhlIFJFU0lEVUUgTVNHICovCisKKwkJbWVzc2FnZSA9IHNmbShwb3J0LGN1cnJTQ0NCKTsKKworCQlpZihjdXJyU0NDQi0+U2NjYl9zY3NpbXNnICE9IFNNUEFSSVRZKQorCQkJQUNDRVBUX01TRyhwb3J0KTsKKwkJV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8xLCAoQVVUT19JTU1FRCtESVNDT05ORUNUX1NUQVJUKSk7CisJfQorCisKKwllbHNlCisJeworCisJCWN1cnJTQ0NCLT5Ib3N0U3RhdHVzID0gU0NDQl9QSEFTRV9TRVFVRU5DRV9GQUlMOworCQljdXJyU0NDQi0+U2NjYl9zY3NpbXNnID0gU01SRUpFQ1Q7CisKKwkJQUNDRVBUX01TR19BVE4ocG9ydCk7CisJCVdSX0hBUlBPT04ocG9ydCtocF9hdXRvc3RhcnRfMSwgKEFVVE9fSU1NRUQrRElTQ09OTkVDVF9TVEFSVCkpOworCX0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzaGFuZGVtCisgKgorICogRGVzY3JpcHRpb246IERlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlIGV4dGVuZGVkIG1lc3NhZ2UuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoRE9TKQordm9pZCBzaGFuZGVtKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQsIFBTQ0NCIHBDdXJyU0NDQikKKyNlbHNlCit2b2lkIHNoYW5kZW0oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkLCBQU0NDQiBwQ3VyclNDQ0IpCisjZW5kaWYKK3sKKwlVQ0hBUiBsZW5ndGgsbWVzc2FnZTsKKworCWxlbmd0aCA9IHNmbShwb3J0LHBDdXJyU0NDQik7CisJaWYgKGxlbmd0aCkgCisJeworCisJCUFDQ0VQVF9NU0cocG9ydCk7CisJCW1lc3NhZ2UgPSBzZm0ocG9ydCxwQ3VyclNDQ0IpOworCQlpZiAobWVzc2FnZSkgCisJCXsKKworCQkJaWYgKG1lc3NhZ2UgPT0gU01TWU5DKSAKKwkJCXsKKworCQkJCWlmIChsZW5ndGggPT0gMHgwMykKKwkJCQl7CisKKwkJCQkJQUNDRVBUX01TRyhwb3J0KTsKKwkJCQkJc3RzeW5jbihwb3J0LHBfY2FyZCk7CisJCQkJfQorCQkJCWVsc2UgCisJCQkJeworCisJCQkJCXBDdXJyU0NDQi0+U2NjYl9zY3NpbXNnID0gU01SRUpFQ1Q7CisJCQkJCUFDQ0VQVF9NU0dfQVROKHBvcnQpOworCQkJCX0KKwkJCX0KKyNpZiBkZWZpbmVkKFdJREVfU0NTSSkKKwkJCWVsc2UgaWYgKG1lc3NhZ2UgPT0gU01XRFRSKSAKKwkJCXsKKworCQkJCWlmIChsZW5ndGggPT0gMHgwMikKKwkJCQl7CisKKwkJCQkJQUNDRVBUX01TRyhwb3J0KTsKKwkJCQkJc3R3aWRuKHBvcnQscF9jYXJkKTsKKwkJCQl9CisJCQkJZWxzZSAKKwkJCQl7CisKKwkJCQkJcEN1cnJTQ0NCLT5TY2NiX3Njc2ltc2cgPSBTTVJFSkVDVDsKKwkJCQkJQUNDRVBUX01TR19BVE4ocG9ydCk7CisKKwkJCQkJV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8xLCAoQVVUT19JTU1FRCtESVNDT05ORUNUX1NUQVJUKSk7CisJCQkJfQorCQkJfQorI2VuZGlmCisJCQllbHNlIAorCQkJeworCisJCQkJcEN1cnJTQ0NCLT5TY2NiX3Njc2ltc2cgPSBTTVJFSkVDVDsKKwkJCQlBQ0NFUFRfTVNHX0FUTihwb3J0KTsKKworCQkJCVdSX0hBUlBPT04ocG9ydCtocF9hdXRvc3RhcnRfMSwgKEFVVE9fSU1NRUQrRElTQ09OTkVDVF9TVEFSVCkpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYocEN1cnJTQ0NCLT5TY2NiX3Njc2ltc2cgIT0gU01QQVJJVFkpCisJCQkJQUNDRVBUX01TRyhwb3J0KTsKKwkJCVdSX0hBUlBPT04ocG9ydCtocF9hdXRvc3RhcnRfMSwgKEFVVE9fSU1NRUQrRElTQ09OTkVDVF9TVEFSVCkpOworCQl9CisJfWVsc2UKKwl7CisJCQlpZihwQ3VyclNDQ0ItPlNjY2Jfc2NzaW1zZyA9PSBTTVBBUklUWSkKKwkJCQlXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzEsIChBVVRPX0lNTUVEK0RJU0NPTk5FQ1RfU1RBUlQpKTsKKwl9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc2lzeW5jbgorICoKKyAqIERlc2NyaXB0aW9uOiBSZWFkIGluIGEgbWVzc2FnZSBieXRlIGZyb20gdGhlIFNDU0kgYnVzLCBhbmQgY2hlY2sKKyAqICAgICAgICAgICAgICBmb3IgYSBwYXJpdHkgZXJyb3IuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCitVQ0hBUiBzaXN5bmNuKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQsIFVDSEFSIHN5bmNGbGFnKQorI2Vsc2UKK1VDSEFSIHNpc3luY24oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkLCBVQ0hBUiBzeW5jRmxhZykKKyNlbmRpZgoreworICAgUFNDQ0IgY3VyclNDQ0I7CisgICBQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CisKKyAgIGN1cnJTQ0NCID0gQkxfQ2FyZFtwX2NhcmRdLmN1cnJlbnRTQ0NCOworICAgY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXTsKKworICAgaWYgKCEoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYgVEFSX1NZTkNfTUFTSykgPT0gU1lOQ19UUllJTkcpKSB7CisKKworICAgICAgV1JXX0hBUlBPT04oKHBvcnQrSURfTVNHX1NUUlQpLAorICAgICAgICAgICAgICAgICAoTVBNX09QK0FNU0dfT1VUKyhjdXJyU0NDQi0+U2NjYl9pZG1zZyAmIH4oVUNIQVIpRElTQ19QUklWKSkpOworCisgICAgICBXUldfSEFSUE9PTigocG9ydCtJRF9NU0dfU1RSVCsyKSxCUkhfT1ArQUxXQVlTK0NNRFBaKTsKKworICAgICAgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzApLCAoTVBNX09QK0FNU0dfT1VUK1NNRVhUICkpOworICAgICAgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzIpLCAoTVBNX09QK0FNU0dfT1VUKzB4MDMgICkpOworICAgICAgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzQpLCAoTVBNX09QK0FNU0dfT1VUK1NNU1lOQykpOworCisKKyAgICAgIGlmICgoY3VyclRhcl9JbmZvLT5UYXJFRVZhbHVlICYgRUVfU1lOQ19NQVNLKSA9PSBFRV9TWU5DXzIwTUIpCisKKwkgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzYpLCAoTVBNX09QK0FNU0dfT1VUKyAxMikpOworCisgICAgICBlbHNlIGlmICgoY3VyclRhcl9JbmZvLT5UYXJFRVZhbHVlICYgRUVfU1lOQ19NQVNLKSA9PSBFRV9TWU5DXzEwTUIpCisKKwkgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzYpLCAoTVBNX09QK0FNU0dfT1VUKyAyNSkpOworCisgICAgICBlbHNlIGlmICgoY3VyclRhcl9JbmZvLT5UYXJFRVZhbHVlICYgRUVfU1lOQ19NQVNLKSA9PSBFRV9TWU5DXzVNQikKKworCSBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrNiksIChNUE1fT1ArQU1TR19PVVQrIDUwKSk7CisKKyAgICAgIGVsc2UKKwkgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzYpLCAoTVBNX09QK0FNU0dfT1VUKyAwMCkpOworCisKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K1NZTkNfTVNHUys4KSwgKFJBVF9PUCAgICAgICAgICAgICAgICApKTsKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K1NZTkNfTVNHUysxMCksKE1QTV9PUCtBTVNHX09VVCtERUZBVUxUX09GRlNFVCkpOworICAgICAgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzEyKSwoQlJIX09QK0FMV0FZUytOUCAgICAgICkpOworCisKKwkJaWYoc3luY0ZsYWcgPT0gRkFMU0UpCisJCXsKKwkJICAgV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8zLCAoU0VMRUNUK1NFTENIS19TVFJUKSk7CisJICAgICAgY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgPSAoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYKKyAgIAkgICAgICB+KFVDSEFSKVRBUl9TWU5DX01BU0spIHwgKFVDSEFSKVNZTkNfVFJZSU5HKTsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8zLCAoQVVUT19JTU1FRCArIENNRF9PTkxZX1NUUlQpKTsKKwkJfQorCisKKyAgICAgIHJldHVybihUUlVFKTsKKyAgICAgIH0KKworICAgZWxzZSB7CisKKyAgICAgIGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzIHw9CSAoVUNIQVIpU1lOQ19TVVBQT1JURUQ7CisgICAgICBjdXJyVGFyX0luZm8tPlRhckVFVmFsdWUgJj0gfkVFX1NZTkNfTUFTSzsKKyAgICAgIHJldHVybihGQUxTRSk7CisgICAgICB9Cit9CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzdHN5bmNuCisgKgorICogRGVzY3JpcHRpb246IFRoZSBoYXMgc2VudCB1cyBhIFN5bmMgTmVnbyBtZXNzYWdlIHNvIGhhbmRsZSBpdCBhcworICogICAgICAgICAgICAgIG5lY2Vzc2FyeS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChET1MpCit2b2lkIHN0c3luY24oVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbHNlCit2b2lkIHN0c3luY24oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2VuZGlmCit7CisgICBVQ0hBUiBzeW5jX21zZyxvZmZzZXQsc3luY19yZWcsb3VyX3N5bmNfbXNnOworICAgUFNDQ0IgY3VyclNDQ0I7CisgICBQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CisKKyAgIGN1cnJTQ0NCID0gQkxfQ2FyZFtwX2NhcmRdLmN1cnJlbnRTQ0NCOworICAgY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXTsKKworICAgc3luY19tc2cgPSBzZm0ocG9ydCxjdXJyU0NDQik7CisKKwlpZigoc3luY19tc2cgPT0gMHgwMCkgJiYgKGN1cnJTQ0NCLT5TY2NiX3Njc2ltc2cgPT0gU01QQVJJVFkpKQorCXsKKwkJV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8xLCAoQVVUT19JTU1FRCtESVNDT05ORUNUX1NUQVJUKSk7CisJCXJldHVybjsKKwl9CisKKyAgIEFDQ0VQVF9NU0cocG9ydCk7CisKKworICAgb2Zmc2V0ID0gc2ZtKHBvcnQsY3VyclNDQ0IpOworCisJaWYoKG9mZnNldCA9PSAweDAwKSAmJiAoY3VyclNDQ0ItPlNjY2Jfc2NzaW1zZyA9PSBTTVBBUklUWSkpCisJeworCQlXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzEsIChBVVRPX0lNTUVEK0RJU0NPTk5FQ1RfU1RBUlQpKTsKKwkJcmV0dXJuOworCX0KKworICAgaWYgKChjdXJyVGFyX0luZm8tPlRhckVFVmFsdWUgJiBFRV9TWU5DX01BU0spID09IEVFX1NZTkNfMjBNQikKKworICAgICAgb3VyX3N5bmNfbXNnID0gMTI7ICAgICAgICAgICAgICAvKiBTZXR1cCBvdXIgTWVzc2FnZSB0byAyMG1iL3MgKi8KKworICAgZWxzZSBpZiAoKGN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSAmIEVFX1NZTkNfTUFTSykgPT0gRUVfU1lOQ18xME1CKQorCisgICAgICBvdXJfc3luY19tc2cgPSAyNTsgICAgICAgICAgICAgIC8qIFNldHVwIG91ciBNZXNzYWdlIHRvIDEwbWIvcyAqLworCisgICBlbHNlIGlmICgoY3VyclRhcl9JbmZvLT5UYXJFRVZhbHVlICYgRUVfU1lOQ19NQVNLKSA9PSBFRV9TWU5DXzVNQikKKworICAgICAgb3VyX3N5bmNfbXNnID0gNTA7ICAgICAgICAgICAgICAvKiBTZXR1cCBvdXIgTWVzc2FnZSB0byA1bWIvcyAqLworICAgZWxzZQorCisgICAgICBvdXJfc3luY19tc2cgPSAwOyAgICAgICAgICAgICAgIC8qIE1lc3NhZ2UgPSBBc3luYyAqLworCisgICBpZiAoc3luY19tc2cgPCBvdXJfc3luY19tc2cpIHsKKyAgICAgIHN5bmNfbXNnID0gb3VyX3N5bmNfbXNnOyAgICAvKmlmIGZhc3RlciwgdGhlbiBzZXQgdG8gbWF4LiAqLworICAgICAgfQorCisgICBpZiAob2Zmc2V0ID09IEFTWU5DKQorICAgICAgc3luY19tc2cgPSBBU1lOQzsKKworICAgaWYgKG9mZnNldCA+IE1BWF9PRkZTRVQpCisgICAgICBvZmZzZXQgPSBNQVhfT0ZGU0VUOworCisgICBzeW5jX3JlZyA9IDB4MDA7CisKKyAgIGlmIChzeW5jX21zZyA+IDEyKQorCisgICAgICBzeW5jX3JlZyA9IDB4MjA7ICAgICAgICAvKiBVc2UgMTBNQi9zICovCisKKyAgIGlmIChzeW5jX21zZyA+IDI1KQorCisgICAgICBzeW5jX3JlZyA9IDB4NDA7ICAgICAgICAvKiBVc2UgNi42TUIvcyAqLworCisgICBpZiAoc3luY19tc2cgPiAzOCkKKworICAgICAgc3luY19yZWcgPSAweDYwOyAgICAgICAgLyogVXNlIDVNQi9zICovCisKKyAgIGlmIChzeW5jX21zZyA+IDUwKQorCisgICAgICBzeW5jX3JlZyA9IDB4ODA7ICAgICAgICAvKiBVc2UgNE1CL3MgKi8KKworICAgaWYgKHN5bmNfbXNnID4gNjIpCisKKyAgICAgIHN5bmNfcmVnID0gMHhBMDsgICAgICAgIC8qIFVzZSAzLjMzTUIvcyAqLworCisgICBpZiAoc3luY19tc2cgPiA3NSkKKworICAgICAgc3luY19yZWcgPSAweEMwOyAgICAgICAgLyogVXNlIDIuODVNQi9zICovCisKKyAgIGlmIChzeW5jX21zZyA+IDg3KQorCisgICAgICBzeW5jX3JlZyA9IDB4RTA7ICAgICAgICAvKiBVc2UgMi41TUIvcyAqLworCisgICBpZiAoc3luY19tc2cgPiAxMDApIHsKKworICAgICAgc3luY19yZWcgPSAweDAwOyAgICAgICAgLyogVXNlIEFTWU5DICovCisgICAgICBvZmZzZXQgPSAweDAwOworICAgICAgfQorCisKKyNpZiBkZWZpbmVkKFdJREVfU0NTSSkKKyAgIGlmIChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFdJREVfRU5BQkxFRCkKKworICAgICAgc3luY19yZWcgfD0gb2Zmc2V0OworCisgICBlbHNlCisKKyAgICAgIHN5bmNfcmVnIHw9IChvZmZzZXQgfCBOQVJST1dfU0NTSSk7CisKKyNlbHNlCisgICBzeW5jX3JlZyB8PSAob2Zmc2V0IHwgTkFSUk9XX1NDU0kpOworI2VuZGlmCisKKyAgIHNzc3luY3YocG9ydCxjdXJyU0NDQi0+VGFyZ0lELHN5bmNfcmVnLGN1cnJUYXJfSW5mbyk7CisKKworICAgaWYgKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IFNFTEVDVF9TTl9TVCkgeworCisKKyAgICAgIEFDQ0VQVF9NU0cocG9ydCk7CisKKyAgICAgIGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzID0gKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmCisgICAgICAgICB+KFVDSEFSKVRBUl9TWU5DX01BU0spIHwgKFVDSEFSKVNZTkNfU1VQUE9SVEVEKTsKKworICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8xLCAoQVVUT19JTU1FRCtESVNDT05ORUNUX1NUQVJUKSk7CisgICAgICB9CisKKyAgIGVsc2UgeworCisKKyAgICAgIEFDQ0VQVF9NU0dfQVROKHBvcnQpOworCisgICAgICBzaXN5bmNyKHBvcnQsc3luY19tc2csb2Zmc2V0KTsKKworICAgICAgY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgPSAoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYKKyAgICAgICAgIH4oVUNIQVIpVEFSX1NZTkNfTUFTSykgfCAoVUNIQVIpU1lOQ19TVVBQT1JURUQpOworICAgICAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHNpc3luY3IKKyAqCisgKiBEZXNjcmlwdGlvbjogQW5zd2VyIHRoZSB0YXJnZXRzIHN5bmMgbWVzc2FnZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChET1MpCit2b2lkIHNpc3luY3IoVVNIT1JUIHBvcnQsVUNIQVIgc3luY19wdWxzZSwgVUNIQVIgb2Zmc2V0KQorI2Vsc2UKK3ZvaWQgc2lzeW5jcihVTE9ORyBwb3J0LFVDSEFSIHN5bmNfcHVsc2UsIFVDSEFSIG9mZnNldCkKKyNlbmRpZgoreworICAgQVJBTV9BQ0NFU1MocG9ydCk7CisgICBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrMCksIChNUE1fT1ArQU1TR19PVVQrU01FWFQgKSk7CisgICBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrMiksIChNUE1fT1ArQU1TR19PVVQrMHgwMyAgKSk7CisgICBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrNCksIChNUE1fT1ArQU1TR19PVVQrU01TWU5DKSk7CisgICBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrNiksIChNUE1fT1ArQU1TR19PVVQrc3luY19wdWxzZSkpOworICAgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzgpLCAoUkFUX09QICAgICAgICAgICAgICAgICkpOworICAgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzEwKSwoTVBNX09QK0FNU0dfT1VUK29mZnNldCkpOworICAgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzEyKSwoQlJIX09QK0FMV0FZUytOUCAgICAgICkpOworICAgU0dSQU1fQUNDRVNTKHBvcnQpOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfcG9ydGN0cmxfMCwgU0NTSV9QT1JUKTsKKyAgIFdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBDTFJfQUxMX0lOVF8xKTsKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8zLCAoQVVUT19JTU1FRCtDTURfT05MWV9TVFJUKSk7CisKKyAgIHdoaWxlICghKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIChCVVNfRlJFRSB8IEFVVE9fSU5UKSkpIHt9Cit9CisKKworCisjaWYgZGVmaW5lZChXSURFX1NDU0kpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHNpd2lkbgorICoKKyAqIERlc2NyaXB0aW9uOiBSZWFkIGluIGEgbWVzc2FnZSBieXRlIGZyb20gdGhlIFNDU0kgYnVzLCBhbmQgY2hlY2sKKyAqICAgICAgICAgICAgICBmb3IgYSBwYXJpdHkgZXJyb3IuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCitVQ0hBUiBzaXdpZG4oVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbHNlCitVQ0hBUiBzaXdpZG4oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2VuZGlmCit7CisgICBQU0NDQiBjdXJyU0NDQjsKKyAgIFBTQ0NCTWdyX3Rhcl9pbmZvIGN1cnJUYXJfSW5mbzsKKworICAgY3VyclNDQ0IgPSBCTF9DYXJkW3BfY2FyZF0uY3VycmVudFNDQ0I7CisgICBjdXJyVGFyX0luZm8gPSAmc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdOworCisgICBpZiAoISgoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBUQVJfV0lERV9NQVNLKSA9PSBXSURFX05FR09DSUFURUQpKSB7CisKKworICAgICAgV1JXX0hBUlBPT04oKHBvcnQrSURfTVNHX1NUUlQpLAorCSAgICAgICAgICAgICAgKE1QTV9PUCtBTVNHX09VVCsoY3VyclNDQ0ItPlNjY2JfaWRtc2cgJiB+KFVDSEFSKURJU0NfUFJJVikpKTsKKworICAgICAgV1JXX0hBUlBPT04oKHBvcnQrSURfTVNHX1NUUlQrMiksQlJIX09QK0FMV0FZUytDTURQWik7CisKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K1NZTkNfTVNHUyswKSwgKE1QTV9PUCtBTVNHX09VVCtTTUVYVCApKTsKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K1NZTkNfTVNHUysyKSwgKE1QTV9PUCtBTVNHX09VVCsweDAyICApKTsKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K1NZTkNfTVNHUys0KSwgKE1QTV9PUCtBTVNHX09VVCtTTVdEVFIpKTsKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K1NZTkNfTVNHUys2KSwgKFJBVF9PUCAgICAgICAgICAgICAgICApKTsKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K1NZTkNfTVNHUys4KSwgKE1QTV9PUCtBTVNHX09VVCsgU00xNkJJVCkpOworICAgICAgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzEwKSwoQlJIX09QK0FMV0FZUytOUCAgICAgICkpOworCisgICAgICBXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzMsIChTRUxFQ1QrU0VMQ0hLX1NUUlQpKTsKKworCisgICAgICBjdXJyVGFyX0luZm8tPlRhclN0YXR1cyA9ICgoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJgorICAgICAgICAgfihVQ0hBUilUQVJfV0lERV9NQVNLKSB8IChVQ0hBUilXSURFX0VOQUJMRUQpOworCisgICAgICByZXR1cm4oVFJVRSk7CisgICAgICB9CisKKyAgIGVsc2UgeworCisgICAgICBjdXJyVGFyX0luZm8tPlRhclN0YXR1cyA9ICgoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJgorICAgICAgICAgICAgICAgfihVQ0hBUilUQVJfV0lERV9NQVNLKSB8IFdJREVfTkVHT0NJQVRFRCk7CisKKyAgICAgIGN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSAmPSB+RUVfV0lERV9TQ1NJOworICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgIH0KK30KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHN0d2lkbgorICoKKyAqIERlc2NyaXB0aW9uOiBUaGUgaGFzIHNlbnQgdXMgYSBXaWRlIE5lZ28gbWVzc2FnZSBzbyBoYW5kbGUgaXQgYXMKKyAqICAgICAgICAgICAgICBuZWNlc3NhcnkuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoRE9TKQordm9pZCBzdHdpZG4oVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbHNlCit2b2lkIHN0d2lkbihVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZW5kaWYKK3sKKyAgIFVDSEFSIHdpZHRoOworICAgUFNDQ0IgY3VyclNDQ0I7CisgICBQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CisKKyAgIGN1cnJTQ0NCID0gQkxfQ2FyZFtwX2NhcmRdLmN1cnJlbnRTQ0NCOworICAgY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXTsKKworICAgd2lkdGggPSBzZm0ocG9ydCxjdXJyU0NDQik7CisKKwlpZigod2lkdGggPT0gMHgwMCkgJiYgKGN1cnJTQ0NCLT5TY2NiX3Njc2ltc2cgPT0gU01QQVJJVFkpKQorCXsKKwkJV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8xLCAoQVVUT19JTU1FRCtESVNDT05ORUNUX1NUQVJUKSk7CisJCXJldHVybjsKKwl9CisKKworICAgaWYgKCEoY3VyclRhcl9JbmZvLT5UYXJFRVZhbHVlICYgRUVfV0lERV9TQ1NJKSkKKyAgICAgIHdpZHRoID0gMDsKKworICAgaWYgKHdpZHRoKSB7CisgICAgICBjdXJyVGFyX0luZm8tPlRhclN0YXR1cyB8PSBXSURFX0VOQUJMRUQ7CisgICAgICB3aWR0aCA9IDA7CisgICAgICB9CisgICBlbHNlIHsKKyAgICAgIHdpZHRoID0gTkFSUk9XX1NDU0k7CisgICAgICBjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmPSB+V0lERV9FTkFCTEVEOworICAgICAgfQorCisKKyAgIHNzc3luY3YocG9ydCxjdXJyU0NDQi0+VGFyZ0lELHdpZHRoLGN1cnJUYXJfSW5mbyk7CisKKworICAgaWYgKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IFNFTEVDVF9XTl9TVCkKKwl7CisKKworCisgICAgICBjdXJyVGFyX0luZm8tPlRhclN0YXR1cyB8PQkgV0lERV9ORUdPQ0lBVEVEOworCisJICAgaWYgKCEoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYgVEFSX1NZTkNfTUFTSykgPT0gU1lOQ19TVVBQT1JURUQpKQorCQl7CisJICAgICAgQUNDRVBUX01TR19BVE4ocG9ydCk7CisJCSAgIEFSQU1fQUNDRVNTKHBvcnQpOworCSAgICAgCXNpc3luY24ocG9ydCxwX2NhcmQsIFRSVUUpOworCSAgICAgIGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID0gU0VMRUNUX1NOX1NUOworCQkgICBTR1JBTV9BQ0NFU1MocG9ydCk7CisJCX0KKwkJZWxzZQorCQl7CisJICAgICAgQUNDRVBUX01TRyhwb3J0KTsKKyAgCQkgICBXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzEsIChBVVRPX0lNTUVEK0RJU0NPTk5FQ1RfU1RBUlQpKTsKKwkJfQorICAgfQorCisgICBlbHNlIHsKKworCisgICAgICBBQ0NFUFRfTVNHX0FUTihwb3J0KTsKKworICAgICAgaWYgKGN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSAmIEVFX1dJREVfU0NTSSkKKyAgICAgIAkgd2lkdGggPSBTTTE2QklUOworICAgICAgZWxzZQorICAgICAgCSB3aWR0aCA9IFNNOEJJVDsKKworICAgICAgc2l3aWRyKHBvcnQsd2lkdGgpOworCisgICAgICBjdXJyVGFyX0luZm8tPlRhclN0YXR1cyB8PSAoV0lERV9ORUdPQ0lBVEVEIHwgV0lERV9FTkFCTEVEKTsKKyAgICAgIH0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzaXdpZHIKKyAqCisgKiBEZXNjcmlwdGlvbjogQW5zd2VyIHRoZSB0YXJnZXRzIFdpZGUgbmVnbyBtZXNzYWdlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgc2l3aWRyKFVTSE9SVCBwb3J0LCBVQ0hBUiB3aWR0aCkKKyNlbHNlCit2b2lkIHNpd2lkcihVTE9ORyBwb3J0LCBVQ0hBUiB3aWR0aCkKKyNlbmRpZgoreworICAgQVJBTV9BQ0NFU1MocG9ydCk7CisgICBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrMCksIChNUE1fT1ArQU1TR19PVVQrU01FWFQgKSk7CisgICBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrMiksIChNUE1fT1ArQU1TR19PVVQrMHgwMiAgKSk7CisgICBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrNCksIChNUE1fT1ArQU1TR19PVVQrU01XRFRSKSk7CisgICBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrNiksIChSQVRfT1AgICAgICAgICAgICAgICAgKSk7CisgICBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrOCksKE1QTV9PUCtBTVNHX09VVCt3aWR0aCkpOworICAgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzEwKSwoQlJIX09QK0FMV0FZUytOUCAgICAgICkpOworICAgU0dSQU1fQUNDRVNTKHBvcnQpOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfcG9ydGN0cmxfMCwgU0NTSV9QT1JUKTsKKyAgIFdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBDTFJfQUxMX0lOVF8xKTsKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8zLCAoQVVUT19JTU1FRCtDTURfT05MWV9TVFJUKSk7CisKKyAgIHdoaWxlICghKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIChCVVNfRlJFRSB8IEFVVE9fSU5UKSkpIHt9Cit9CisKKyNlbmRpZgorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc3NzeW5jdgorICoKKyAqIERlc2NyaXB0aW9uOiBXcml0ZSB0aGUgZGVzaXJlZCB2YWx1ZSB0byB0aGUgU3luYyBSZWdpc3RlciBmb3IgdGhlCisgKiAgICAgICAgICAgICAgSUQgc3BlY2lmaWVkLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgc3NzeW5jdihVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2lkLCBVQ0hBUiBwX3N5bmNfdmFsdWUsUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvKQorI2Vsc2UKK3ZvaWQgc3NzeW5jdihVTE9ORyBwX3BvcnQsIFVDSEFSIHBfaWQsIFVDSEFSIHBfc3luY192YWx1ZSxQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm8pCisjZW5kaWYKK3sKKyAgIFVDSEFSIGluZGV4OworCisgICBpbmRleCA9IHBfaWQ7CisKKyAgIHN3aXRjaCAoaW5kZXgpIHsKKworICAgICAgY2FzZSAwOgorCSBpbmRleCA9IDEyOyAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ18wICovCisJIGJyZWFrOworICAgICAgY2FzZSAxOgorCSBpbmRleCA9IDEzOyAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ18xICovCisJIGJyZWFrOworICAgICAgY2FzZSAyOgorCSBpbmRleCA9IDE0OyAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ18yICovCisJIGJyZWFrOworICAgICAgY2FzZSAzOgorCSBpbmRleCA9IDE1OyAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ18zICovCisJIGJyZWFrOworICAgICAgY2FzZSA0OgorCSBpbmRleCA9IDg7ICAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ180ICovCisJIGJyZWFrOworICAgICAgY2FzZSA1OgorCSBpbmRleCA9IDk7ICAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ181ICovCisJIGJyZWFrOworICAgICAgY2FzZSA2OgorCSBpbmRleCA9IDEwOyAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ182ICovCisJIGJyZWFrOworICAgICAgY2FzZSA3OgorCSBpbmRleCA9IDExOyAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ183ICovCisJIGJyZWFrOworICAgICAgY2FzZSA4OgorCSBpbmRleCA9IDQ7ICAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ184ICovCisJIGJyZWFrOworICAgICAgY2FzZSA5OgorCSBpbmRleCA9IDU7ICAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ185ICovCisJIGJyZWFrOworICAgICAgY2FzZSAxMDoKKwkgaW5kZXggPSA2OyAgICAgICAgICAgICAgLyogaHBfc3luY3RhcmdfMTAgKi8KKwkgYnJlYWs7CisgICAgICBjYXNlIDExOgorCSBpbmRleCA9IDc7ICAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ18xMSAqLworCSBicmVhazsKKyAgICAgIGNhc2UgMTI6CisJIGluZGV4ID0gMDsgICAgICAgICAgICAgIC8qIGhwX3N5bmN0YXJnXzEyICovCisJIGJyZWFrOworICAgICAgY2FzZSAxMzoKKwkgaW5kZXggPSAxOyAgICAgICAgICAgICAgLyogaHBfc3luY3RhcmdfMTMgKi8KKwkgYnJlYWs7CisgICAgICBjYXNlIDE0OgorCSBpbmRleCA9IDI7ICAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ18xNCAqLworCSBicmVhazsKKyAgICAgIGNhc2UgMTU6CisJIGluZGV4ID0gMzsgICAgICAgICAgICAgIC8qIGhwX3N5bmN0YXJnXzE1ICovCisKKyAgICAgIH0KKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc3luY3RhcmdfYmFzZStpbmRleCwgcF9zeW5jX3ZhbHVlKTsKKworCWN1cnJUYXJfSW5mby0+VGFyU3luY0N0cmwgPSBwX3N5bmNfdmFsdWU7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc3Jlc2IKKyAqCisgKiBEZXNjcmlwdGlvbjogUmVzZXQgdGhlIGRlc2lyZWQgY2FyZCdzIFNDU0kgYnVzLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgc3Jlc2IoVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbHNlCit2b2lkIHNyZXNiKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbmRpZgoreworICAgVUNIQVIgc2NzaUlELCBpOworCisgICBQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CisKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9wYWdlX2N0cmwsCisgICAgICAoUkRfSEFSUE9PTihwb3J0K2hwX3BhZ2VfY3RybCkgfCBHX0lOVF9ESVNBQkxFKSk7CisgICBXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgQ0xSX0FMTF9JTlQpOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfc2NzaWN0cmxfMCwgU0NTSV9SU1QpOworCisgICBzY3NpSUQgPSBSRF9IQVJQT09OKHBvcnQraHBfc2VsdGltZW91dCk7CisgICBXUl9IQVJQT09OKHBvcnQraHBfc2VsdGltZW91dCxUT181bXMpOworICAgV1JXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCksIFRJTUVPVVQpOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfcG9ydGN0cmxfMCwoU0NTSV9QT1JUIHwgU1RBUlRfVE8pKTsKKworICAgd2hpbGUgKCEoUkRXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCkpICYgVElNRU9VVCkpIHt9CisKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9zZWx0aW1lb3V0LHNjc2lJRCk7CisKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9zY3NpY3RybF8wLCBFTkFfU0NBTV9TRUwpOworCisgICBXYWl0KHBvcnQsIFRPXzVtcyk7CisKKyAgIFdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBDTFJfQUxMX0lOVCk7CisKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9pbnRfbWFzaywgKFJEX0hBUlBPT04ocG9ydCtocF9pbnRfbWFzaykgfCAweDAwKSk7CisKKyAgIGZvciAoc2NzaUlEID0gMDsgc2NzaUlEIDwgTUFYX1NDU0lfVEFSOyBzY3NpSUQrKykKKyAgICAgIHsKKyAgICAgIGN1cnJUYXJfSW5mbyA9ICZzY2NiTWdyVGJsW3BfY2FyZF1bc2NzaUlEXTsKKworICAgICAgaWYgKGN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSAmIEVFX1NZTkNfTUFTSykKKyAgICAgICAgIHsKKwkgICAgICAJY3VyclRhcl9JbmZvLT5UYXJTeW5jQ3RybCA9IDA7CisJICAgICAgCWN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICY9IH5UQVJfU1lOQ19NQVNLOworCSAgICAgIH0KKworICAgICAgaWYgKGN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSAmIEVFX1dJREVfU0NTSSkKKyAgICAgICAgIHsKKyAgICAgIAljdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmPSB+VEFSX1dJREVfTUFTSzsKKyAgICAgIAl9CisKKyAgICAgIHNzc3luY3YocG9ydCwgc2NzaUlELCBOQVJST1dfU0NTSSxjdXJyVGFyX0luZm8pOworCisgICAgICBTY2NiTWdyVGFibGVJbml0VGFyZ2V0KHBfY2FyZCwgc2NzaUlEKTsKKyAgICAgIH0KKworICAgQkxfQ2FyZFtwX2NhcmRdLnNjYW5JbmRleCA9IDB4MDA7CisgICBCTF9DYXJkW3BfY2FyZF0uY3VycmVudFNDQ0IgPSBOVUxMOworICAgQkxfQ2FyZFtwX2NhcmRdLmdsb2JhbEZsYWdzICY9IH4oRl9UQUdfU1RBUlRFRCB8IEZfSE9TVF9YRkVSX0FDVCAKKwkJCQkJCQkJCQkJCQl8IEZfTkVXX1NDQ0JfQ01EKTsKKyAgIEJMX0NhcmRbcF9jYXJkXS5jbWRDb3VudGVyICA9IDB4MDA7CisJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQgPSAweDAwOworICAgQkxfQ2FyZFtwX2NhcmRdLnRhZ1FfTHN0ID0gMHgwMTsgCisKKwlmb3IoaSA9IDA7IGkgPCBRVUVVRV9ERVBUSDsgaSsrKQorCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW2ldID0gTlVMTDsKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX3BhZ2VfY3RybCwKKyAgICAgIChSRF9IQVJQT09OKHBvcnQraHBfcGFnZV9jdHJsKSAmIH5HX0lOVF9ESVNBQkxFKSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc3NlbnNzCisgKgorICogRGVzY3JpcHRpb246IFNldHVwIGZvciB0aGUgQXV0byBTZW5zZSBjb21tYW5kLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgc3NlbnNzKFBTQ0NCY2FyZCBwQ3VyckNhcmQpCit7CisgICBVQ0hBUiBpOworICAgUFNDQ0IgY3VyclNDQ0I7CisKKyAgIGN1cnJTQ0NCID0gcEN1cnJDYXJkLT5jdXJyZW50U0NDQjsKKworCisgICBjdXJyU0NDQi0+U2F2ZV9DZGJMZW4gPSBjdXJyU0NDQi0+Q2RiTGVuZ3RoOworCisgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisKKyAgICAgIGN1cnJTQ0NCLT5TYXZlX0NkYltpXSA9IGN1cnJTQ0NCLT5DZGJbaV07CisgICAgICB9CisKKyAgIGN1cnJTQ0NCLT5DZGJMZW5ndGggPSBTSVhfQllURV9DTUQ7CisgICBjdXJyU0NDQi0+Q2RiWzBdICAgID0gU0NTSV9SRVFVRVNUX1NFTlNFOworICAgY3VyclNDQ0ItPkNkYlsxXSAgICA9IGN1cnJTQ0NCLT5DZGJbMV0gJiAoVUNIQVIpMHhFMDsgLypLZWVwIExVTi4gKi8KKyAgIGN1cnJTQ0NCLT5DZGJbMl0gICAgPSAweDAwOworICAgY3VyclNDQ0ItPkNkYlszXSAgICA9IDB4MDA7CisgICBjdXJyU0NDQi0+Q2RiWzRdICAgID0gY3VyclNDQ0ItPlJlcXVlc3RTZW5zZUxlbmd0aDsKKyAgIGN1cnJTQ0NCLT5DZGJbNV0gICAgPSAweDAwOworCisgICBjdXJyU0NDQi0+U2NjYl9YZmVyQ250ID0gKHVuc2lnbmVkIGxvbmcpY3VyclNDQ0ItPlJlcXVlc3RTZW5zZUxlbmd0aDsKKworICAgY3VyclNDQ0ItPlNjY2JfQVRDID0gMHgwMDsKKworICAgY3VyclNDQ0ItPlNjY2JfWGZlclN0YXRlIHw9IEZfQVVUT19TRU5TRTsKKworICAgY3VyclNDQ0ItPlNjY2JfWGZlclN0YXRlICY9IH5GX1NHX1hGRVI7CisKKyAgIGN1cnJTQ0NCLT5TY2NiX2lkbXNnID0gY3VyclNDQ0ItPlNjY2JfaWRtc2cgJiB+KFVDSEFSKURJU0NfUFJJVjsKKworICAgY3VyclNDQ0ItPkNvbnRyb2xCeXRlID0gMHgwMDsKKworICAgY3VyclNDQ0ItPlNjY2JfTUdSRmxhZ3MgJj0gRl9TVEFUVVNMT0FERUQ7Cit9CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzeGZycAorICoKKyAqIERlc2NyaXB0aW9uOiBUcmFuc2ZlciBkYXRhIGludG8gdGhlIGJpdCBidWNrZXQgdW50aWwgdGhlIGRldmljZQorICogICAgICAgICAgICAgIGRlY2lkZXMgdG8gc3dpdGNoIHBoYXNlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoRE9TKQordm9pZCBzeGZycChVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQordm9pZCBzeGZycChVTE9ORyBwX3BvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbmRpZgoreworICAgVUNIQVIgY3Vycl9waHo7CisKKworICAgRElTQUJMRV9BVVRPKHBfcG9ydCk7CisKKyAgIGlmIChCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgJiBGX0hPU1RfWEZFUl9BQ1QpIHsKKworICAgICAgaG9zdERhdGFYZmVyQWJvcnQocF9wb3J0LHBfY2FyZCxCTF9DYXJkW3BfY2FyZF0uY3VycmVudFNDQ0IpOworCisgICAgICB9CisKKyAgIC8qIElmIHRoZSBBdXRvbWF0aW9uIGhhbmRsZWQgdGhlIGVuZCBvZiB0aGUgdHJhbnNmZXIgdGhlbiBkbyBub3QKKyAgICAgIG1hdGNoIHRoZSBwaGFzZSBvciB3ZSB3aWxsIGdldCBvdXQgb2Ygc3luYyB3aXRoIHRoZSBJU1IuICAgICAgICovCisKKyAgIGlmIChSRFdfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpKSAmIChCVVNfRlJFRSB8IFhGRVJfQ05UXzAgfCBBVVRPX0lOVCkpCisgICAgICByZXR1cm47CisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3hmZXJjbnRfMCwgMHgwMCk7CisKKyAgIGN1cnJfcGh6ID0gUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZykgJiAoVUNIQVIpU19TQ1NJX1BIWjsKKworICAgV1JXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSwgWEZFUl9DTlRfMCk7CisKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgY3Vycl9waHopOworCisgICB3aGlsZSAoICEoUkRXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSkgJiAoQlVTX0ZSRUUgfCBSRVNFVCkpICYmCisgICAgICAoY3Vycl9waHogPT0gKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lzaWcpICYgKFVDSEFSKVNfU0NTSV9QSFopKSApCisgICAgICB7CisgICAgICBpZiAoY3Vycl9waHogJiAoVUNIQVIpU0NTSV9JT0JJVCkKKyAgICAgICAgIHsKKyAgICAgIAlXUl9IQVJQT09OKHBfcG9ydCtocF9wb3J0Y3RybF8wLCAoU0NTSV9QT1JUIHwgSE9TVF9QT1JUIHwgU0NTSV9JTkJJVCkpOworCisJICAgICAgaWYgKCEoUkRfSEFSUE9PTihwX3BvcnQraHBfeGZlcnN0YXQpICYgRklGT19FTVBUWSkpCisgICAgICAgICAgICB7CisJICAgICAgICAgUkRfSEFSUE9PTihwX3BvcnQraHBfZmlmb2RhdGFfMCk7CisJICAgICAgICAgfQorCSAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgIAlXUl9IQVJQT09OKHBfcG9ydCtocF9wb3J0Y3RybF8wLCAoU0NTSV9QT1JUIHwgSE9TVF9QT1JUIHwgSE9TVF9XUlQpKTsKKyAgIAkgICBpZiAoUkRfSEFSUE9PTihwX3BvcnQraHBfeGZlcnN0YXQpICYgRklGT19FTVBUWSkKKyAgICAgICAgICAgIHsKKwkgICAgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9maWZvZGF0YV8wLDB4RkEpOworCSAgICAgICAgIH0KKwkgICAgICB9CisgICAgICB9IC8qIEVuZCBvZiBXaGlsZSBsb29wIGZvciBwYWRkaW5nIGRhdGEgSS9PIHBoYXNlICovCisKKyAgICAgIHdoaWxlICggIShSRFdfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpKSAmIChCVVNfRlJFRSB8IFJFU0VUKSkpCisgICAgICAgICB7CisgICAgICAgICBpZiAoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZykgJiBTQ1NJX1JFUSkKKyAgICAgIAkgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgV1JfSEFSUE9PTihwX3BvcnQraHBfcG9ydGN0cmxfMCwgKFNDU0lfUE9SVCB8IEhPU1RfUE9SVCB8IFNDU0lfSU5CSVQpKTsKKyAgICAgIHdoaWxlICghKFJEX0hBUlBPT04ocF9wb3J0K2hwX3hmZXJzdGF0KSAmIEZJRk9fRU1QVFkpKQorICAgICAgICAgeworICAgICAgICAgUkRfSEFSUE9PTihwX3BvcnQraHBfZmlmb2RhdGFfMCk7CisgICAgICAgICB9CisKKyAgICAgIGlmICggIShSRFdfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpKSAmIChCVVNfRlJFRSB8IFJFU0VUKSkpCisgICAgICAgICB7CisgICAgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9hdXRvc3RhcnRfMCwgKEFVVE9fSU1NRUQrRElTQ09OTkVDVF9TVEFSVCkpOworICAgICAgICAgd2hpbGUgKCEoUkRXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSkgJiBBVVRPX0lOVCkpIHt9CisKKyAgICAgICAgIGlmIChSRFdfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpKSAmIChJQ01EX0NPTVAgfCBJVEFSX0RJU0MpKQorICAgCSAgIHdoaWxlICghKFJEV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCkpICYgKEJVU19GUkVFIHwgUlNFTCkpKSA7CisgICAgICAgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc2Noa2RkCisgKgorICogRGVzY3JpcHRpb246IE1ha2Ugc3VyZSBkYXRhIGhhcyBiZWVuIGZsdXNoZWQgZnJvbSBib3RoIEZJRk9zIGFuZCBhYm9ydAorICogICAgICAgICAgICAgIHRoZSBvcGVyYXRpb25zIGlmIG5lY2Vzc2FyeS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgc2Noa2RkKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQordm9pZCBzY2hrZGQoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2VuZGlmCit7CisgICBVU0hPUlQgVGltZU91dExvb3A7CisJVUNIQVIgc1BoYXNlOworCisgICBQU0NDQiBjdXJyU0NDQjsKKworICAgY3VyclNDQ0IgPSBCTF9DYXJkW3BfY2FyZF0uY3VycmVudFNDQ0I7CisKKworICAgaWYgKChjdXJyU0NDQi0+U2NjYl9zY3Npc3RhdCAhPSBEQVRBX09VVF9TVCkgJiYKKyAgICAgICAoY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgIT0gREFUQV9JTl9TVCkpIHsKKyAgICAgIHJldHVybjsKKyAgICAgIH0KKworCisKKyAgIGlmIChjdXJyU0NDQi0+U2NjYl9YZmVyU3RhdGUgJiBGX09ERF9CQUxMX0NOVCkKKyAgICAgIHsKKworICAgICAgY3VyclNDQ0ItPlNjY2JfQVRDICs9IChjdXJyU0NDQi0+U2NjYl9YZmVyQ250LTEpOworCisgICAgICBjdXJyU0NDQi0+U2NjYl9YZmVyQ250ID0gMTsKKworICAgICAgY3VyclNDQ0ItPlNjY2JfWGZlclN0YXRlICY9IH5GX09ERF9CQUxMX0NOVDsKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K2hwX2ZpZm9yZWFkKSwgKFVTSE9SVCkgMHgwMCk7CisgICAgICBXUl9IQVJQT09OKHBvcnQraHBfeGZlcnN0YXQsIDB4MDApOworICAgICAgfQorCisgICBlbHNlCisgICAgICB7CisKKyAgICAgIGN1cnJTQ0NCLT5TY2NiX0FUQyArPSBjdXJyU0NDQi0+U2NjYl9YZmVyQ250OworCisgICAgICBjdXJyU0NDQi0+U2NjYl9YZmVyQ250ID0gMDsKKyAgICAgIH0KKworICAgaWYgKChSRFdfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSkgJiBQQVJJVFkpICYmCisgICAgICAoY3VyclNDQ0ItPkhvc3RTdGF0dXMgPT0gU0NDQl9DT01QTEVURSkpIHsKKworICAgICAgY3VyclNDQ0ItPkhvc3RTdGF0dXMgPSBTQ0NCX1BBUklUWV9FUlI7CisgICAgICBXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgUEFSSVRZKTsKKyAgICAgIH0KKworCisgICBob3N0RGF0YVhmZXJBYm9ydChwb3J0LHBfY2FyZCxjdXJyU0NDQik7CisKKworICAgd2hpbGUgKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNDU0lfQUNLKSB7fQorCisgICBUaW1lT3V0TG9vcCA9IDA7CisKKyAgIHdoaWxlKFJEX0hBUlBPT04ocG9ydCtocF94ZmVyc3RhdCkgJiBGSUZPX0VNUFRZKQorICAgICAgeworICAgICAgaWYgKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIEJVU19GUkVFKSB7CisJICAgICAgcmV0dXJuOworICAgCSAgIH0KKyAgICAgIGlmIChSRF9IQVJQT09OKHBvcnQraHBfb2Zmc2V0Y3RyKSAmIChVQ0hBUikweDFGKSB7CisJICAgICAgYnJlYWs7CisgICAJICAgfQorICAgICAgaWYgKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIFJFU0VUKSB7CisJICAgICAgcmV0dXJuOworICAgCSAgIH0KKyAgICAgIGlmICgoUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9SRVEpIHx8IChUaW1lT3V0TG9vcCsrPjB4MzAwMCkgKQorICAgCSAgIGJyZWFrOworICAgICAgfQorCisJc1BoYXNlID0gUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcpICYgKFNDU0lfQlNZIHwgU19TQ1NJX1BIWik7CisgICBpZiAoKCEoUkRfSEFSUE9PTihwb3J0K2hwX3hmZXJzdGF0KSAmIEZJRk9fRU1QVFkpKSAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAoUkRfSEFSUE9PTihwb3J0K2hwX29mZnNldGN0cikgJiAoVUNIQVIpMHgxRikgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAoc1BoYXNlID09IChTQ1NJX0JTWSB8IFNfREFUQU9fUEgpKSB8fAorICAgICAgKHNQaGFzZSA9PSAoU0NTSV9CU1kgfCBTX0RBVEFJX1BIKSkpCisgICAgICB7CisKKwkgICBXUl9IQVJQT09OKHBvcnQraHBfcG9ydGN0cmxfMCwgU0NTSV9QT1JUKTsKKworCSAgIGlmICghKGN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSAmIEZfQUxMX1hGRVJSRUQpKQorICAgICAgICAgeworCSAgICAgIGlmIChjdXJyU0NDQi0+U2NjYl9YZmVyU3RhdGUgJiBGX0hPU1RfWEZFUl9ESVIpIHsKKwkgICAgICAgICBwaGFzZURhdGFJbihwb3J0LHBfY2FyZCk7CisJICAgICAgCX0KKworCSAgIAllbHNlIHsKKwkgICAgICAgcGhhc2VEYXRhT3V0KHBvcnQscF9jYXJkKTsKKwkgICAgICAgCX0KKwkgICAJfQorCQllbHNlCisgICAgICAJeworCSAgIAlzeGZycChwb3J0LHBfY2FyZCk7CisJICAgCWlmICghKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmCisJCSAgICAgIChCVVNfRlJFRSB8IElDTURfQ09NUCB8IElUQVJfRElTQyB8IFJFU0VUKSkpCisgICAgICAgICB7CisgICAJCVdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBBVVRPX0lOVCk7CisJCSAgIHBoYXNlRGVjb2RlKHBvcnQscF9jYXJkKTsKKwkJICAgfQorCSAgIH0KKworICAgfQorCisgICBlbHNlIHsKKyAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9wb3J0Y3RybF8wLCAweDAwKTsKKyAgICAgIH0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzaW5pdHMKKyAqCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgU0NDQiBtYW5hZ2VyIGZpZWxkcyBpbiB0aGlzIFNDQ0IuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHNpbml0cyhQU0NDQiBwX3NjY2IsIFVDSEFSIHBfY2FyZCkKK3sKKyAgIFBTQ0NCTWdyX3Rhcl9pbmZvIGN1cnJUYXJfSW5mbzsKKworCWlmKChwX3NjY2ItPlRhcmdJRCA+IE1BWF9TQ1NJX1RBUikgfHwgKHBfc2NjYi0+THVuID4gTUFYX0xVTikpCisJeworCQlyZXR1cm47CisJfQorICAgY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVtwX3NjY2ItPlRhcmdJRF07CisKKyAgIHBfc2NjYi0+U2NjYl9YZmVyU3RhdGUgICAgID0gMHgwMDsKKyAgIHBfc2NjYi0+U2NjYl9YZmVyQ250ICAgICAgID0gcF9zY2NiLT5EYXRhTGVuZ3RoOworCisgICBpZiAoKHBfc2NjYi0+T3BlcmF0aW9uQ29kZSA9PSBTQ0FUVEVSX0dBVEhFUl9DT01NQU5EKSB8fAorICAgICAgKHBfc2NjYi0+T3BlcmF0aW9uQ29kZSA9PSBSRVNJRFVBTF9TR19DT01NQU5EKSkgeworCisgICAgICBwX3NjY2ItPlNjY2JfU0dvZmZzZXQgICA9IDA7CisgICAgICBwX3NjY2ItPlNjY2JfWGZlclN0YXRlICA9IEZfU0dfWEZFUjsKKyAgICAgIHBfc2NjYi0+U2NjYl9YZmVyQ250ICAgID0gMHgwMDsKKyAgICAgIH0KKworICAgaWYgKHBfc2NjYi0+RGF0YUxlbmd0aCA9PSAweDAwKQorCisgICAgICBwX3NjY2ItPlNjY2JfWGZlclN0YXRlIHw9IEZfQUxMX1hGRVJSRUQ7CisKKyAgIGlmIChwX3NjY2ItPkNvbnRyb2xCeXRlICYgRl9VU0VfQ01EX1EpCisgICAgICB7CisgICAgICBpZiAoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYgVEFSX1RBR19RX01BU0spID09IFRBR19RX1JFSkVDVCkKKyAgICAgICAgIHBfc2NjYi0+Q29udHJvbEJ5dGUgJj0gfkZfVVNFX0NNRF9ROworCisgICAgICBlbHNlCisJICAgICAgY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgfD0gVEFHX1FfVFJZSU5HOworICAgICAgfQorCisvKiAgICAgIEZvciAhc2luZ2xlIFNDU0kgZGV2aWNlIGluIHN5c3RlbSAgJiBkZXZpY2UgYWxsb3cgRGlzY29ubmVjdAorCW9yIGNvbW1hbmQgaXMgdGFnX3EgdHlwZSB0aGVuIHNlbmQgQ21kIHdpdGggRGlzY29ubmVjdCBFbmFibGUKKwllbHNlIHNlbmQgQ21kIHdpdGggRGlzY29ubmVjdCBEaXNhYmxlICovCisKKy8qCisgICBpZiAoKCghKEJMX0NhcmRbcF9jYXJkXS5nbG9iYWxGbGFncyAmIEZfU0lOR0xFX0RFVklDRSkpICYmCisgICAgICAoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBUQVJfQUxMT1dfRElTQykpIHx8CisgICAgICAoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBUQUdfUV9UUllJTkcpKSB7CisqLworICAgaWYgKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFRBUl9BTExPV19ESVNDKSB8fAorICAgICAgKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYgVEFHX1FfVFJZSU5HKSkgeworICAgICAgcF9zY2NiLT5TY2NiX2lkbXNnICAgICAgPSAoVUNIQVIpKFNNSURFTlQgfCBESVNDX1BSSVYpIHwgcF9zY2NiLT5MdW47CisgICAgICB9CisKKyAgIGVsc2UgeworCisgICAgICBwX3NjY2ItPlNjY2JfaWRtc2cgICAgICA9IChVQ0hBUilTTUlERU5UIHwgcF9zY2NiLT5MdW47CisgICAgICB9CisKKyAgIHBfc2NjYi0+SG9zdFN0YXR1cyAgICAgICAgID0gMHgwMDsKKyAgIHBfc2NjYi0+VGFyZ2V0U3RhdHVzICAgICAgID0gMHgwMDsKKyAgIHBfc2NjYi0+U2NjYl90YWcgICAgICAgICAgID0gMHgwMDsKKyAgIHBfc2NjYi0+U2NjYl9NR1JGbGFncyAgICAgID0gMHgwMDsKKyAgIHBfc2NjYi0+U2NjYl9zZ3NlZyAgICAgICAgID0gMHgwMDsKKyAgIHBfc2NjYi0+U2NjYl9BVEMgICAgICAgICAgID0gMHgwMDsKKyAgIHBfc2NjYi0+U2NjYl9zYXZlZEFUQyAgICAgID0gMHgwMDsKKy8qCisgICBwX3NjY2ItPlNjY2JWaXJ0RGF0YVB0ciAgICA9IDB4MDA7CisgICBwX3NjY2ItPlNjY2JfZm9yd2FyZGxpbmsgICA9IE5VTEw7CisgICBwX3NjY2ItPlNjY2JfYmFja2xpbmsgICAgICA9IE5VTEw7CisgKi8KKyAgIHBfc2NjYi0+U2NjYl9zY3Npc3RhdCAgICAgID0gQlVTX0ZSRUVfU1Q7CisgICBwX3NjY2ItPlNjY2JTdGF0dXMgICAgICAgICA9IFNDQ0JfSU5fUFJPQ0VTUzsKKyAgIHBfc2NjYi0+U2NjYl9zY3NpbXNnICAgICAgID0gU01OT19PUDsKKworfQorCisKKyNpZGVudCAiJElkOiBwaGFzZS5jIDEuMTEgMTk5Ny8wMS8zMSAwMjowODo0OSBtb2hhbiBFeHAgJCIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCisgKiAgIENvcHlyaWdodCAxOTk1LTE5OTYgYnkgTXlsZXggQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGJvdGggdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFuZCBhIEJTRC1zdHlsZSBjb3B5cmlnaHQ7IHNlZSBMSUNFTlNFLkZsYXNoUG9pbnQgZm9yIGRldGFpbHMuCisgKgorICogICAkV29ya2ZpbGU6ICAgcGhhc2UuYyAgJAorICoKKyAqICAgRGVzY3JpcHRpb246ICBGdW5jdGlvbnMgdG8gaW5pdGlhbGx5IGhhbmRsZSB0aGUgU0NTSSBidXMgcGhhc2Ugd2hlbgorICogICAgICAgICAgICAgICAgIHRoZSB0YXJnZXQgYXNzZXJ0cyByZXF1ZXN0IChhbmQgdGhlIGF1dG9tYXRpb24gaXMgbm90CisgKiAgICAgICAgICAgICAgICAgZW5hYmxlZCB0byBoYW5kbGUgdGhlIHNpdHVhdGlvbikuCisgKgorICogICAkRGF0ZTogMTk5Ny8wMS8zMSAwMjowODo0OSAkCisgKgorICogICAkUmV2aXNpb246IDEuMTEgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qI2luY2x1ZGUgPGdsb2JhbHMuaD4qLworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKwkvKiNpbmNsdWRlIDxidWRpLmg+Ki8KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzY2NibWdyLmg+Ki8KKy8qI2luY2x1ZGUgPGJseDMwLmg+Ki8KKy8qI2luY2x1ZGUgPHRhcmdldC5oPiovCisvKiNpbmNsdWRlIDxzY3NpMi5oPiovCisvKiNpbmNsdWRlIDxoYXJwb29uLmg+Ki8KKworCisvKgorZXh0ZXJuIFNDQ0JDQVJEIEJMX0NhcmRbTUFYX0NBUkRTXTsKK2V4dGVybiBTQ0NCTUdSX1RBUl9JTkZPIHNjY2JNZ3JUYmxbTUFYX0NBUkRTXVtNQVhfU0NTSV9UQVJdOworCisjaWYgZGVmaW5lZChPUzIpCisgICBleHRlcm4gdm9pZCAoZmFyICpzX1BoYXNlVGJsWzhdKSAoVUxPTkcsIFVDSEFSKTsKKyNlbHNlCisgICAjaWYgZGVmaW5lZChET1MpCisgICAgICBleHRlcm4gdm9pZCAoKnNfUGhhc2VUYmxbOF0pIChVU0hPUlQsIFVDSEFSKTsKKyAgICNlbHNlCisgICAgICBleHRlcm4gdm9pZCAoKnNfUGhhc2VUYmxbOF0pIChVTE9ORywgVUNIQVIpOworICAgI2VuZGlmCisjZW5kaWYKKyovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFBoYXNlIERlY29kZQorICoKKyAqIERlc2NyaXB0aW9uOiBEZXRlcm1pbmUgdGhlIHBoYXNlIGFuZCBjYWxsIHRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvbi4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgcGhhc2VEZWNvZGUoVVNIT1JUIHBfcG9ydCwgVUNIQVIgcF9jYXJkKQorI2Vsc2UKK3ZvaWQgcGhhc2VEZWNvZGUoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2NhcmQpCisjZW5kaWYKK3sKKyAgIHVuc2lnbmVkIGNoYXIgcGhhc2VfcmVmOworI2lmIGRlZmluZWQoT1MyKQorICAgdm9pZCAoZmFyICpwaGFzZSkgKFVMT05HLCBVQ0hBUik7CisjZWxzZQorICAgI2lmIGRlZmluZWQoRE9TKQorICAgICAgdm9pZCAoKnBoYXNlKSAoVVNIT1JULCBVQ0hBUik7CisgICAjZWxzZQorICAgICAgdm9pZCAoKnBoYXNlKSAoVUxPTkcsIFVDSEFSKTsKKyAgICNlbmRpZgorI2VuZGlmCisKKworICAgRElTQUJMRV9BVVRPKHBfcG9ydCk7CisKKyAgIHBoYXNlX3JlZiA9IChVQ0hBUikgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lzaWcpICYgU19TQ1NJX1BIWik7CisKKyAgIHBoYXNlID0gc19QaGFzZVRibFtwaGFzZV9yZWZdOworCisgICAoKnBoYXNlKShwX3BvcnQsIHBfY2FyZCk7ICAgICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZWN0IHBoYXNlIGZ1bmMgKi8KK30KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IERhdGEgT3V0IFBoYXNlCisgKgorICogRGVzY3JpcHRpb246IFN0YXJ0IHVwIGJvdGggdGhlIEJ1c01hc3RlciBhbmQgWGJvdy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKE9TMikKK3ZvaWQgZmFyIHBoYXNlRGF0YU91dChVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQorI2lmIGRlZmluZWQoRE9TKQordm9pZCBwaGFzZURhdGFPdXQoVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbHNlCit2b2lkIHBoYXNlRGF0YU91dChVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZW5kaWYKKyNlbmRpZgoreworCisgICBQU0NDQiBjdXJyU0NDQjsKKworICAgY3VyclNDQ0IgPSBCTF9DYXJkW3BfY2FyZF0uY3VycmVudFNDQ0I7CisgICBpZiAoY3VyclNDQ0IgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgIHJldHVybjsgIC8qIEV4aXQgaWYgTm8gU0NDQiByZWNvcmQgKi8KKyAgICAgIH0KKworICAgY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPSBEQVRBX09VVF9TVDsKKyAgIGN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSAmPSB+KEZfSE9TVF9YRkVSX0RJUiB8IEZfTk9fREFUQV9ZRVQpOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfcG9ydGN0cmxfMCwgU0NTSV9QT1JUKTsKKworICAgV1JXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCksIFhGRVJfQ05UXzApOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzAsIChFTkRfREFUQStFTkRfREFUQV9TVEFSVCkpOworCisgICBkYXRhWGZlclByb2Nlc3Nvcihwb3J0LCAmQkxfQ2FyZFtwX2NhcmRdKTsKKworI2lmIGRlZmluZWQoTk9CVUdCVUcpCisgICBpZiAoUkRXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCkpICYgWEZFUl9DTlRfMCkKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBYRkVSX0NOVF8wKTsKKworI2VuZGlmCisKKworICAgaWYgKGN1cnJTQ0NCLT5TY2NiX1hmZXJDbnQgPT0gMCkgeworCisKKyAgICAgIGlmICgoY3VyclNDQ0ItPkNvbnRyb2xCeXRlICYgU0NDQl9EQVRBX1hGRVJfT1VUKSAmJgorCSAoY3VyclNDQ0ItPkhvc3RTdGF0dXMgPT0gU0NDQl9DT01QTEVURSkpCisJIGN1cnJTQ0NCLT5Ib3N0U3RhdHVzID0gU0NDQl9EQVRBX09WRVJfUlVOOworCisgICAgICBzeGZycChwb3J0LHBfY2FyZCk7CisgICAgICBpZiAoIShSRFdfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSkgJiAoQlVTX0ZSRUUgfCBSRVNFVCkpKQorCSAgICBwaGFzZURlY29kZShwb3J0LHBfY2FyZCk7CisgICAgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogRGF0YSBJbiBQaGFzZQorICoKKyAqIERlc2NyaXB0aW9uOiBTdGFydHVwIHRoZSBCdXNNYXN0ZXIgYW5kIHRoZSBYQk9XLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoT1MyKQordm9pZCBmYXIgcGhhc2VEYXRhSW4oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2Vsc2UKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgcGhhc2VEYXRhSW4oVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbHNlCit2b2lkIHBoYXNlRGF0YUluKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbmRpZgorI2VuZGlmCit7CisKKyAgIFBTQ0NCIGN1cnJTQ0NCOworCisgICBjdXJyU0NDQiA9IEJMX0NhcmRbcF9jYXJkXS5jdXJyZW50U0NDQjsKKworICAgaWYgKGN1cnJTQ0NCID09IE5VTEwpCisgICAgICB7CisgICAgICByZXR1cm47ICAvKiBFeGl0IGlmIE5vIFNDQ0IgcmVjb3JkICovCisgICAgICB9CisKKworICAgY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPSBEQVRBX0lOX1NUOworICAgY3VyclNDQ0ItPlNjY2JfWGZlclN0YXRlIHw9IEZfSE9TVF9YRkVSX0RJUjsKKyAgIGN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSAmPSB+Rl9OT19EQVRBX1lFVDsKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX3BvcnRjdHJsXzAsIFNDU0lfUE9SVCk7CisKKyAgIFdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBYRkVSX0NOVF8wKTsKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8wLCAoRU5EX0RBVEErRU5EX0RBVEFfU1RBUlQpKTsKKworICAgZGF0YVhmZXJQcm9jZXNzb3IocG9ydCwgJkJMX0NhcmRbcF9jYXJkXSk7CisKKyAgIGlmIChjdXJyU0NDQi0+U2NjYl9YZmVyQ250ID09IDApIHsKKworCisgICAgICBpZiAoKGN1cnJTQ0NCLT5Db250cm9sQnl0ZSAmIFNDQ0JfREFUQV9YRkVSX0lOKSAmJgorCSAoY3VyclNDQ0ItPkhvc3RTdGF0dXMgPT0gU0NDQl9DT01QTEVURSkpCisJIGN1cnJTQ0NCLT5Ib3N0U3RhdHVzID0gU0NDQl9EQVRBX09WRVJfUlVOOworCisgICAgICBzeGZycChwb3J0LHBfY2FyZCk7CisgICAgICBpZiAoIShSRFdfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSkgJiAoQlVTX0ZSRUUgfCBSRVNFVCkpKQorCSAgICBwaGFzZURlY29kZShwb3J0LHBfY2FyZCk7CisKKyAgICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogQ29tbWFuZCBQaGFzZQorICoKKyAqIERlc2NyaXB0aW9uOiBMb2FkIHRoZSBDREIgaW50byB0aGUgYXV0b21hdGlvbiBhbmQgc3RhcnQgaXQgdXAuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChPUzIpCit2b2lkIGZhciBwaGFzZUNvbW1hbmQoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQorI2lmIGRlZmluZWQoRE9TKQordm9pZCBwaGFzZUNvbW1hbmQoVVNIT1JUIHBfcG9ydCwgVUNIQVIgcF9jYXJkKQorI2Vsc2UKK3ZvaWQgcGhhc2VDb21tYW5kKFVMT05HIHBfcG9ydCwgVUNIQVIgcF9jYXJkKQorI2VuZGlmCisjZW5kaWYKK3sKKyAgIFBTQ0NCIGN1cnJTQ0NCOworI2lmIGRlZmluZWQoRE9TKQorICAgVVNIT1JUIGNkYl9yZWc7CisjZWxzZQorICAgVUxPTkcgY2RiX3JlZzsKKyNlbmRpZgorICAgVUNIQVIgaTsKKworICAgY3VyclNDQ0IgPSBCTF9DYXJkW3BfY2FyZF0uY3VycmVudFNDQ0I7CisKKyAgIGlmIChjdXJyU0NDQi0+T3BlcmF0aW9uQ29kZSA9PSBSRVNFVF9DT01NQU5EKSB7CisKKyAgICAgIGN1cnJTQ0NCLT5Ib3N0U3RhdHVzID0gU0NDQl9QSEFTRV9TRVFVRU5DRV9GQUlMOworICAgICAgY3VyclNDQ0ItPkNkYkxlbmd0aCA9IFNJWF9CWVRFX0NNRDsKKyAgICAgIH0KKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgMHgwMCk7CisKKyAgIEFSQU1fQUNDRVNTKHBfcG9ydCk7CisKKworICAgY2RiX3JlZyA9IHBfcG9ydCArIENNRF9TVFJUOworCisgICBmb3IgKGk9MDsgaSA8IGN1cnJTQ0NCLT5DZGJMZW5ndGg7IGkrKykgeworCisgICAgICBpZiAoY3VyclNDQ0ItPk9wZXJhdGlvbkNvZGUgPT0gUkVTRVRfQ09NTUFORCkKKworCSBXUldfSEFSUE9PTihjZGJfcmVnLCAoTVBNX09QICsgQUNPTU1BTkQgKyAweDAwKSk7CisKKyAgICAgIGVsc2UKKwkgV1JXX0hBUlBPT04oY2RiX3JlZywgKE1QTV9PUCArIEFDT01NQU5EICsgY3VyclNDQ0ItPkNkYltpXSkpOworICAgICAgY2RiX3JlZyArPTI7CisgICAgICB9CisKKyAgIGlmIChjdXJyU0NDQi0+Q2RiTGVuZ3RoICE9IFRXRUxWRV9CWVRFX0NNRCkKKyAgICAgIFdSV19IQVJQT09OKGNkYl9yZWcsIChCUkhfT1ArQUxXQVlTKyAgICBOUCkpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9wb3J0Y3RybF8wLChTQ1NJX1BPUlQpKTsKKworICAgY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPSBDT01NQU5EX1NUOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9hdXRvc3RhcnRfMywgKEFVVE9fSU1NRUQgfCBDTURfT05MWV9TVFJUKSk7CisgICBTR1JBTV9BQ0NFU1MocF9wb3J0KTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBTdGF0dXMgcGhhc2UKKyAqCisgKiBEZXNjcmlwdGlvbjogQnJpbmcgaW4gdGhlIHN0YXR1cyBhbmQgY29tbWFuZCBjb21wbGV0ZSBtZXNzYWdlIGJ5dGVzCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChPUzIpCit2b2lkIGZhciBwaGFzZVN0YXR1cyhVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQorI2lmIGRlZmluZWQoRE9TKQordm9pZCBwaGFzZVN0YXR1cyhVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2Vsc2UKK3ZvaWQgcGhhc2VTdGF0dXMoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2VuZGlmCisjZW5kaWYKK3sKKyAgIC8qIFN0YXJ0LXVwIHRoZSBhdXRvbWF0aW9uIHRvIGZpbmlzaCBvZmYgdGhpcyBjb21tYW5kIGFuZCBsZXQgdGhlCisgICAgICBpc3IgaGFuZGxlIHRoZSBpbnRlcnJ1cHQgZm9yIGNvbW1hbmQgY29tcGxldGUgd2hlbiBpdCBjb21lcyBpbi4KKyAgICAgIFdlIGNvdWxkIHdhaXQgaGVyZSBmb3IgdGhlIGludGVycnVwdCB0byBiZSBnZW5lcmF0ZWQ/CisgICAgKi8KKworICAgV1JfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcsIDB4MDApOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzAsIChBVVRPX0lNTUVEK0VORF9EQVRBX1NUQVJUKSk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogUGhhc2UgTWVzc2FnZSBPdXQKKyAqCisgKiBEZXNjcmlwdGlvbjogU2VuZCBvdXQgb3VyIG1lc3NhZ2UgKGlmIHdlIGhhdmUgb25lKSBhbmQgaGFuZGxlIHdoYXRldmVyCisgKiAgICAgICAgICAgICAgZWxzZSBpcyBpbnZvbGVkLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoT1MyKQordm9pZCBmYXIgcGhhc2VNc2dPdXQoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2Vsc2UKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgcGhhc2VNc2dPdXQoVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbHNlCit2b2lkIHBoYXNlTXNnT3V0KFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbmRpZgorI2VuZGlmCit7CisJVUNIQVIgbWVzc2FnZSxzY3NpSUQ7CisJUFNDQ0IgY3VyclNDQ0I7CisJUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworCisJY3VyclNDQ0IgPSBCTF9DYXJkW3BfY2FyZF0uY3VycmVudFNDQ0I7CisKKwlpZiAoY3VyclNDQ0IgIT0gTlVMTCkgeworCisJCW1lc3NhZ2UgPSBjdXJyU0NDQi0+U2NjYl9zY3NpbXNnOworCQlzY3NpSUQgPSBjdXJyU0NDQi0+VGFyZ0lEOworCisJCWlmIChtZXNzYWdlID09IFNNREVWX1JFU0VUKSAKKwkJeworCisKKwkJCWN1cnJUYXJfSW5mbyA9ICZzY2NiTWdyVGJsW3BfY2FyZF1bc2NzaUlEXTsKKwkJCWN1cnJUYXJfSW5mby0+VGFyU3luY0N0cmwgPSAwOworCQkJc3NzeW5jdihwb3J0LCBzY3NpSUQsIE5BUlJPV19TQ1NJLGN1cnJUYXJfSW5mbyk7CisKKwkJCWlmIChzY2NiTWdyVGJsW3BfY2FyZF1bc2NzaUlEXS5UYXJFRVZhbHVlICYgRUVfU1lOQ19NQVNLKSAKKwkJCXsKKworCQkJCXNjY2JNZ3JUYmxbcF9jYXJkXVtzY3NpSURdLlRhclN0YXR1cyAmPSB+VEFSX1NZTkNfTUFTSzsKKworCQkJfQorCisJCQlpZiAoc2NjYk1nclRibFtwX2NhcmRdW3Njc2lJRF0uVGFyRUVWYWx1ZSAmIEVFX1dJREVfU0NTSSkgCisJCQl7CisKKwkJCQlzY2NiTWdyVGJsW3BfY2FyZF1bc2NzaUlEXS5UYXJTdGF0dXMgJj0gflRBUl9XSURFX01BU0s7CisJCQl9CisKKworCQkJcXVldWVGbHVzaFNjY2IocF9jYXJkLFNDQ0JfQ09NUExFVEUpOworCQkJU2NjYk1nclRhYmxlSW5pdFRhcmdldChwX2NhcmQsc2NzaUlEKTsKKwkJfQorCQllbHNlIGlmIChjdXJyU0NDQi0+U2NjYl9zY3Npc3RhdCA9PSBBQk9SVF9TVCkKKwkJeworCQkJY3VyclNDQ0ItPkhvc3RTdGF0dXMgPSBTQ0NCX0NPTVBMRVRFOworCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtjdXJyU0NDQi0+U2NjYl90YWddICE9IE5VTEwpCisJCQl7CisJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtjdXJyU0NDQi0+U2NjYl90YWddID0gTlVMTDsKKwkJCQlzY2NiTWdyVGJsW3BfY2FyZF1bc2NzaUlEXS5UYXJUYWdRX0NudC0tOworCQkJfQorCQkJCQkKKwkJfQorCisJCWVsc2UgaWYgKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0IDwgQ09NTUFORF9TVCkgCisJCXsKKworCisJCQlpZihtZXNzYWdlID09IFNNTk9fT1ApCisJCQl7CisJCQkJY3VyclNDQ0ItPlNjY2JfTUdSRmxhZ3MgfD0gRl9ERVZfU0VMRUNURUQ7CisJCQorCQkJCXNzZWwocG9ydCxwX2NhcmQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQllbHNlIAorCQl7CisKKworCQkJaWYgKG1lc3NhZ2UgPT0gU01BQk9SVCkKKworCQkJCXF1ZXVlRmx1c2hTY2NiKHBfY2FyZCxTQ0NCX0NPTVBMRVRFKTsKKwkJfQorCisJfQorCWVsc2UgCisJeworCQltZXNzYWdlID0gU01BQk9SVDsKKwl9CisKKwlXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgKEJVU19GUkVFIHwgUEhBU0UgfCBYRkVSX0NOVF8wKSk7CisKKworCVdSX0hBUlBPT04ocG9ydCtocF9wb3J0Y3RybF8wLCBTQ1NJX0JVU19FTik7CisKKwlXUl9IQVJQT09OKHBvcnQraHBfc2NzaWRhdGFfMCxtZXNzYWdlKTsKKworCVdSX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnLCAoU0NTSV9BQ0sgKyBTX0lMTF9QSCkpOworCisJQUNDRVBUX01TRyhwb3J0KTsKKworCVdSX0hBUlBPT04ocG9ydCtocF9wb3J0Y3RybF8wLCAweDAwKTsKKworCWlmICgobWVzc2FnZSA9PSBTTUFCT1JUKSB8fCAobWVzc2FnZSA9PSBTTURFVl9SRVNFVCkgfHwgCisJCQkJKG1lc3NhZ2UgPT0gU01BQk9SVF9UQUcpICkgCisJeworCisJCXdoaWxlKCEoUkRXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCkpICYgKEJVU19GUkVFIHwgUEhBU0UpKSkge30KKworCQlpZiAoUkRXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCkpICYgQlVTX0ZSRUUpIAorCQl7CisJCQlXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgQlVTX0ZSRUUpOworCisJCQlpZiAoY3VyclNDQ0IgIT0gTlVMTCkgCisJCQl7CisKKwkJCQlpZigoQkxfQ2FyZFtwX2NhcmRdLmdsb2JhbEZsYWdzICYgRl9DT05MVU5fSU8pICYmCisJCQkJCSgoc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSAhPSBUQUdfUV9UUllJTkcpKQorCQkJCQlzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyTFVOQnVzeVtjdXJyU0NDQi0+THVuXSA9IEZBTFNFOworCQkJCWVsc2UKKwkJCQkJc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckxVTkJ1c3lbMF0gPSBGQUxTRTsKKworCQkJCXF1ZXVlQ21kQ29tcGxldGUoJkJMX0NhcmRbcF9jYXJkXSxjdXJyU0NDQiwgcF9jYXJkKTsKKwkJCX0KKworCQkJZWxzZSAKKwkJCXsKKwkJCQlCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgfD0gRl9ORVdfU0NDQl9DTUQ7CisJCQl9CisJCX0KKworCQllbHNlIAorCQl7CisKKwkJCXN4ZnJwKHBvcnQscF9jYXJkKTsKKwkJfQorCX0KKworCWVsc2UgCisJeworCisJCWlmKG1lc3NhZ2UgPT0gU01QQVJJVFkpCisJCXsKKwkJCWN1cnJTQ0NCLT5TY2NiX3Njc2ltc2cgPSBTTU5PX09QOworCQkJV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8xLCAoQVVUT19JTU1FRCtESVNDT05ORUNUX1NUQVJUKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzeGZycChwb3J0LHBfY2FyZCk7CisJCX0KKwl9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogTWVzc2FnZSBJbiBwaGFzZQorICoKKyAqIERlc2NyaXB0aW9uOiBCcmluZyBpbiB0aGUgbWVzc2FnZSBhbmQgZGV0ZXJtaW5lIHdoYXQgdG8gZG8gd2l0aCBpdC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKE9TMikKK3ZvaWQgZmFyIHBoYXNlTXNnSW4oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2Vsc2UKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgcGhhc2VNc2dJbihVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2Vsc2UKK3ZvaWQgcGhhc2VNc2dJbihVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZW5kaWYKKyNlbmRpZgoreworCVVDSEFSIG1lc3NhZ2U7CisJUFNDQ0IgY3VyclNDQ0I7CisKKwljdXJyU0NDQiA9IEJMX0NhcmRbcF9jYXJkXS5jdXJyZW50U0NDQjsKKworCWlmIChCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgJiBGX0hPU1RfWEZFUl9BQ1QpIAorCXsKKworCQlwaGFzZUNoa0ZpZm8ocG9ydCwgcF9jYXJkKTsKKwl9CisKKwltZXNzYWdlID0gUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lkYXRhXzApOworCWlmICgobWVzc2FnZSA9PSBTTURJU0MpIHx8IChtZXNzYWdlID09IFNNU0FWRV9EQVRBX1BUUikpIAorCXsKKworCQlXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzEsIChBVVRPX0lNTUVEK0VORF9EQVRBX1NUQVJUKSk7CisKKwl9CisKKwllbHNlIAorCXsKKworCQltZXNzYWdlID0gc2ZtKHBvcnQsY3VyclNDQ0IpOworCQlpZiAobWVzc2FnZSkgCisJCXsKKworCisJCQlzZGVjbShtZXNzYWdlLHBvcnQscF9jYXJkKTsKKworCQl9CisJCWVsc2UKKwkJeworCQkJaWYoY3VyclNDQ0ItPlNjY2Jfc2NzaW1zZyAhPSBTTVBBUklUWSkKKwkJCQlBQ0NFUFRfTVNHKHBvcnQpOworCQkJV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8xLCAoQVVUT19JTU1FRCtESVNDT05ORUNUX1NUQVJUKSk7CisJCX0KKwl9CisKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBJbGxlZ2FsIHBoYXNlCisgKgorICogRGVzY3JpcHRpb246IFRhcmdldCBzd2l0Y2hlZCB0byBzb21lIGlsbGVnYWwgcGhhc2UsIHNvIGFsbCB3ZSBjYW4gZG8KKyAqICAgICAgICAgICAgICBpcyByZXBvcnQgYW4gZXJyb3IgYmFjayB0byB0aGUgaG9zdCAoaWYgdGhhdCBpcyBwb3NzaWJsZSkKKyAqICAgICAgICAgICAgICBhbmQgc2VuZCBhbiBBQk9SVCBtZXNzYWdlIHRvIHRoZSBtaXNiZWhhdmluZyB0YXJnZXQuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChPUzIpCit2b2lkIGZhciBwaGFzZUlsbGVnYWwoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2Vsc2UKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgcGhhc2VJbGxlZ2FsKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQordm9pZCBwaGFzZUlsbGVnYWwoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2VuZGlmCisjZW5kaWYKK3sKKyAgIFBTQ0NCIGN1cnJTQ0NCOworCisgICBjdXJyU0NDQiA9IEJMX0NhcmRbcF9jYXJkXS5jdXJyZW50U0NDQjsKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcsIFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSk7CisgICBpZiAoY3VyclNDQ0IgIT0gTlVMTCkgeworCisgICAgICBjdXJyU0NDQi0+SG9zdFN0YXR1cyA9IFNDQ0JfUEhBU0VfU0VRVUVOQ0VfRkFJTDsKKyAgICAgIGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID0gQUJPUlRfU1Q7CisgICAgICBjdXJyU0NDQi0+U2NjYl9zY3NpbXNnID0gU01BQk9SVDsKKyAgICAgIH0KKworICAgQUNDRVBUX01TR19BVE4ocG9ydCk7Cit9CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBQaGFzZSBDaGVjayBGSUZPCisgKgorICogRGVzY3JpcHRpb246IE1ha2Ugc3VyZSBkYXRhIGhhcyBiZWVuIGZsdXNoZWQgZnJvbSBib3RoIEZJRk9zIGFuZCBhYm9ydAorICogICAgICAgICAgICAgIHRoZSBvcGVyYXRpb25zIGlmIG5lY2Vzc2FyeS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgcGhhc2VDaGtGaWZvKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQordm9pZCBwaGFzZUNoa0ZpZm8oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2VuZGlmCit7CisgICBVTE9ORyB4ZmVyY250OworICAgUFNDQ0IgY3VyclNDQ0I7CisKKyAgIGN1cnJTQ0NCID0gQkxfQ2FyZFtwX2NhcmRdLmN1cnJlbnRTQ0NCOworCisgICBpZiAoY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPT0gREFUQV9JTl9TVCkKKyAgICAgIHsKKworICAgICAgd2hpbGUoKCEoUkRfSEFSUE9PTihwb3J0K2hwX3hmZXJzdGF0KSAmIEZJRk9fRU1QVFkpKSAmJgorCSAgICAgIChSRF9IQVJQT09OKHBvcnQraHBfZXh0X3N0YXR1cykgJiBCTV9DTURfQlVTWSkpIHt9CisKKworICAgICAgaWYgKCEoUkRfSEFSUE9PTihwb3J0K2hwX3hmZXJzdGF0KSAmIEZJRk9fRU1QVFkpKQorICAgICAgICAgeworCSAgICAgIGN1cnJTQ0NCLT5TY2NiX0FUQyArPSBjdXJyU0NDQi0+U2NjYl9YZmVyQ250OworCisJICAgICAgY3VyclNDQ0ItPlNjY2JfWGZlckNudCA9IDA7CisKKwkgICAgICBpZiAoKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIFBBUklUWSkgJiYKKwkgICAgICAgICAgICAoY3VyclNDQ0ItPkhvc3RTdGF0dXMgPT0gU0NDQl9DT01QTEVURSkpCisgICAgICAgICAgICB7CisJICAgICAgICAgY3VyclNDQ0ItPkhvc3RTdGF0dXMgPSBTQ0NCX1BBUklUWV9FUlI7CisJICAgICAgICAgV1JXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCksIFBBUklUWSk7CisJICAgICAgICAgfQorCisJICAgICAgaG9zdERhdGFYZmVyQWJvcnQocG9ydCxwX2NhcmQsY3VyclNDQ0IpOworCisJICAgICAgZGF0YVhmZXJQcm9jZXNzb3IocG9ydCwgJkJMX0NhcmRbcF9jYXJkXSk7CisKKwkgICAgICB3aGlsZSgoIShSRF9IQVJQT09OKHBvcnQraHBfeGZlcnN0YXQpICYgRklGT19FTVBUWSkpICYmCisJICAgICAgICAgKFJEX0hBUlBPT04ocG9ydCtocF9leHRfc3RhdHVzKSAmIEJNX0NNRF9CVVNZKSkge30KKworCSAgICAgIH0KKyAgICAgIH0gIC8qRW5kIERhdGEgSW4gc3BlY2lmaWMgY29kZS4gKi8KKworCisKKyNpZiBkZWZpbmVkKERPUykKKyAgIGFzbSB7IG1vdiBkeCxwb3J0OworICAgICAgYWRkIGR4LGhwX3hmZXJjbnRfMjsKKyAgICAgIGluICBhbCxkeDsKKyAgICAgIGRlYyBkeDsKKyAgICAgIHhvciBhaCxhaDsKKyAgICAgIG1vdiB3b3JkIHB0ciB4ZmVyY250KzIsYXg7CisgICAgICBpbiAgYWwsZHg7CisgICAgICBkZWMgZHg7CisgICAgICBtb3YgYWgsYWw7CisgICAgICBpbiAgYWwsZHg7CisgICAgICBtb3Ygd29yZCBwdHIgeGZlcmNudCxheDsKKyAgICAgIH0KKyNlbHNlCisgICBHRVRfWEZFUl9DTlQocG9ydCx4ZmVyY250KTsKKyNlbmRpZgorCisKKyAgIFdSX0hBUlBPT04ocG9ydCtocF94ZmVyY250XzAsIDB4MDApOworCisKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9wb3J0Y3RybF8wLCAweDAwKTsKKworICAgY3VyclNDQ0ItPlNjY2JfQVRDICs9IChjdXJyU0NDQi0+U2NjYl9YZmVyQ250IC0geGZlcmNudCk7CisKKyAgIGN1cnJTQ0NCLT5TY2NiX1hmZXJDbnQgPSB4ZmVyY250OworCisgICBpZiAoKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIFBBUklUWSkgJiYKKyAgICAgIChjdXJyU0NDQi0+SG9zdFN0YXR1cyA9PSBTQ0NCX0NPTVBMRVRFKSkgeworCisgICAgICBjdXJyU0NDQi0+SG9zdFN0YXR1cyA9IFNDQ0JfUEFSSVRZX0VSUjsKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBQQVJJVFkpOworICAgICAgfQorCisKKyAgIGhvc3REYXRhWGZlckFib3J0KHBvcnQscF9jYXJkLGN1cnJTQ0NCKTsKKworCisgICBXUl9IQVJQT09OKHBvcnQraHBfZmlmb3dyaXRlLCAweDAwKTsKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9maWZvcmVhZCwgMHgwMCk7CisgICBXUl9IQVJQT09OKHBvcnQraHBfeGZlcnN0YXQsIDB4MDApOworCisgICBXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgWEZFUl9DTlRfMCk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogUGhhc2UgQnVzIEZyZWUKKyAqCisgKiBEZXNjcmlwdGlvbjogV2UganVzdCB3ZW50IGJ1cyBmcmVlIHNvIGZpZ3VyZSBvdXQgaWYgaXQgd2FzCisgKiAgICAgICAgICAgICAgYmVjYXVzZSBvZiBjb21tYW5kIGNvbXBsZXRlIG9yIGZyb20gYSBkaXNjb25uZWN0LgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgcGhhc2VCdXNGcmVlKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQordm9pZCBwaGFzZUJ1c0ZyZWUoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2VuZGlmCit7CisgICBQU0NDQiBjdXJyU0NDQjsKKworICAgY3VyclNDQ0IgPSBCTF9DYXJkW3BfY2FyZF0uY3VycmVudFNDQ0I7CisKKyAgIGlmIChjdXJyU0NDQiAhPSBOVUxMKQorICAgICAgeworCisgICAgICBESVNBQkxFX0FVVE8ocG9ydCk7CisKKworICAgICAgaWYgKGN1cnJTQ0NCLT5PcGVyYXRpb25Db2RlID09IFJFU0VUX0NPTU1BTkQpCisgICAgICAgICB7CisKKwkJCWlmKChCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgJiBGX0NPTkxVTl9JTykgJiYKKwkJCQkoKHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJTdGF0dXMgJiBUQVJfVEFHX1FfTUFTSykgIT0gVEFHX1FfVFJZSU5HKSkKKwkgICAJCSBzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyTFVOQnVzeVtjdXJyU0NDQi0+THVuXSA9IEZBTFNFOworCQkJZWxzZQorCQkgICAJIHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJMVU5CdXN5WzBdID0gRkFMU0U7CisKKwkgICAgICBxdWV1ZUNtZENvbXBsZXRlKCZCTF9DYXJkW3BfY2FyZF0sIGN1cnJTQ0NCLCBwX2NhcmQpOworCisJICAgICAgcXVldWVTZWFyY2hTZWxlY3QoJkJMX0NhcmRbcF9jYXJkXSxwX2NhcmQpOworCisJICAgICAgfQorCisgICAgICBlbHNlIGlmKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IFNFTEVDVF9TTl9TVCkKKwkgICAgICB7CisJICAgICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhclN0YXR1cyB8PQorCQkJICAgICAgICAgKFVDSEFSKVNZTkNfU1VQUE9SVEVEOworCSAgICAgIHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJFRVZhbHVlICY9IH5FRV9TWU5DX01BU0s7CisJICAgICAgfQorCisgICAgICBlbHNlIGlmKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IFNFTEVDVF9XTl9TVCkKKwkgICAgICB7CisJICAgICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhclN0YXR1cyA9CisJCSAgICAgICAgICAgIChzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uCisJCSAgIFRhclN0YXR1cyAmIH5XSURFX0VOQUJMRUQpIHwgV0lERV9ORUdPQ0lBVEVEOworCisJICAgICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckVFVmFsdWUgJj0gfkVFX1dJREVfU0NTSTsKKwkgICAgICB9CisKKyNpZiAhZGVmaW5lZChET1MpCisgICAgICBlbHNlIGlmKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IFNFTEVDVF9RX1NUKQorCSAgICAgIHsKKwkgICAgICAvKiBNYWtlIHN1cmUgdGhpcyBpcyBub3QgYSBwaG9ueSBCVVNfRlJFRS4gIElmIHdlIHdlcmUKKwkgICAgICByZXNlbGVjdGVkIG9yIGlmIEJVU1kgaXMgTk9UIG9uIHRoZW4gdGhpcyBpcyBhCisJICAgICAgdmFsaWQgQlVTIEZSRUUuICBTUlIgV2VkbmVzZGF5LCA1LzEwLzE5OTUuICAgICAqLworCisJICAgICAgaWYgKCghKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNDU0lfQlNZKSkgfHwKKwkgICAgICAgICAoUkRXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCkpICYgUlNFTCkpCisJICAgICAgICAgeworCSAgICAgICAgIHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJTdGF0dXMgJj0gflRBUl9UQUdfUV9NQVNLOworCSAgICAgICAgIHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJTdGF0dXMgfD0gVEFHX1FfUkVKRUNUOworCSAgICAgICAgIH0KKworCSAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKwkgICAgICAgICByZXR1cm47CisJICAgICAgICAgfQorICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgIGVsc2UKKwkgICAgICB7CisKKwkgICAgICBjdXJyU0NDQi0+U2NjYl9zY3Npc3RhdCA9IEJVU19GUkVFX1NUOworCisgICAgICAgICBpZiAoIWN1cnJTQ0NCLT5Ib3N0U3RhdHVzKQorCSAgICAgICAgIHsKKwkgICAgICAgICBjdXJyU0NDQi0+SG9zdFN0YXR1cyA9IFNDQ0JfUEhBU0VfU0VRVUVOQ0VfRkFJTDsKKwkgICAgICAgICB9CisKKwkJCWlmKChCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgJiBGX0NPTkxVTl9JTykgJiYKKwkJCQkoKHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJTdGF0dXMgJiBUQVJfVEFHX1FfTUFTSykgIT0gVEFHX1FfVFJZSU5HKSkKKwkgICAJCSBzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyTFVOQnVzeVtjdXJyU0NDQi0+THVuXSA9IEZBTFNFOworCQkJZWxzZQorCQkgICAJIHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJMVU5CdXN5WzBdID0gRkFMU0U7CisKKwkgICAgICBxdWV1ZUNtZENvbXBsZXRlKCZCTF9DYXJkW3BfY2FyZF0sIGN1cnJTQ0NCLCBwX2NhcmQpOworCSAgICAgIHJldHVybjsKKwkgICAgICB9CisKKworICAgICAgQkxfQ2FyZFtwX2NhcmRdLmdsb2JhbEZsYWdzIHw9IEZfTkVXX1NDQ0JfQ01EOworCisgICAgICB9IC8qZW5kIGlmICE9bnVsbCAqLworfQorCisKKworCisjaWRlbnQgIiRJZDogYXV0b21hdGUuYyAxLjE0IDE5OTcvMDEvMzEgMDI6MTE6NDYgbW9oYW4gRXhwICQiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKgorICogICBDb3B5cmlnaHQgMTk5NS0xOTk2IGJ5IE15bGV4IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBib3RoIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbmQgYSBCU0Qtc3R5bGUgY29weXJpZ2h0OyBzZWUgTElDRU5TRS5GbGFzaFBvaW50IGZvciBkZXRhaWxzLgorICoKKyAqICAgJFdvcmtmaWxlOiAgIGF1dG9tYXRlLmMgICQKKyAqCisgKiAgIERlc2NyaXB0aW9uOiAgRnVuY3Rpb25zIHJlbGF0aW5nIHRvIHByb2dyYW1taW5nIHRoZSBhdXRvbWF0aW9uIG9mCisgKiAgICAgICAgICAgICAgICAgdGhlIEhBUlBPT04uCisgKgorICogICAkRGF0ZTogMTk5Ny8wMS8zMSAwMjoxMTo0NiAkCisgKgorICogICAkUmV2aXNpb246IDEuMTQgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qI2luY2x1ZGUgPGdsb2JhbHMuaD4qLworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKwkvKiNpbmNsdWRlIDxidWRpLmg+Ki8KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzY2NibWdyLmg+Ki8KKy8qI2luY2x1ZGUgPGJseDMwLmg+Ki8KKy8qI2luY2x1ZGUgPHRhcmdldC5oPiovCisvKiNpbmNsdWRlIDxzY3NpMi5oPiovCisvKiNpbmNsdWRlIDxoYXJwb29uLmg+Ki8KKworLyoKK2V4dGVybiBTQ0NCQ0FSRCBCTF9DYXJkW01BWF9DQVJEU107CitleHRlcm4gU0NDQk1HUl9UQVJfSU5GTyBzY2NiTWdyVGJsW01BWF9DQVJEU11bTUFYX1NDU0lfVEFSXTsKK2V4dGVybiBTQ0NCQ0FSRCBCTF9DYXJkW01BWF9DQVJEU107CisqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBBdXRvIExvYWQgRGVmYXVsdCBNYXAKKyAqCisgKiBEZXNjcmlwdGlvbjogTG9hZCB0aGUgQXV0b21hdGlvbiBSQU0gd2l0aCB0aGUgZGVmdWFsdCBtYXAgdmFsdWVzLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgYXV0b0xvYWREZWZhdWx0TWFwKFVTSE9SVCBwX3BvcnQpCisjZWxzZQordm9pZCBhdXRvTG9hZERlZmF1bHRNYXAoVUxPTkcgcF9wb3J0KQorI2VuZGlmCit7CisjaWYgZGVmaW5lZChET1MpCisgICBVU0hPUlQgbWFwX2FkZHI7CisjZWxzZQorICAgVUxPTkcgbWFwX2FkZHI7CisjZW5kaWYKKworICAgQVJBTV9BQ0NFU1MocF9wb3J0KTsKKyAgIG1hcF9hZGRyID0gcF9wb3J0ICsgaHBfYXJhbUJhc2U7CisKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FNU0dfT1VUKyAweEMwKSk7ICAvKklEIE1FU1NBR0UgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FNU0dfT1VUKyAweDIwKSk7ICAvKlNJTVBMRSBUQUcgUVVFVUVJTkcgTVNHICovCisgICBtYXBfYWRkciArPTI7CisgICBXUldfSEFSUE9PTihtYXBfYWRkciwgUkFUX09QKTsgICAgICAgICAgICAgICAgICAgLypSRVNFVCBBVFRFTlRJT04gKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FNU0dfT1VUKyAweDAwKSk7ICAvKlRBRyBJRCBNU0cgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDAgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDEgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDIgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDMgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDQgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDUgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDYgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDcgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDggKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDkgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDEwICovCisgICBtYXBfYWRkciArPTI7CisgICBXUldfSEFSUE9PTihtYXBfYWRkciwgKE1QTV9PUCtBQ09NTUFORCsgMHgwMCkpOyAgLypDREIgQllURSAxMSAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChDUEVfT1ArQURBVEFfT1VUKyBESU5UKSk7IC8qSlVNUCBJRiBEQVRBIE9VVCAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChUQ0JfT1ArRklGT18wKyBESSkpOyAgICAgLypKVU1QIElGIE5PIERBVEEgSU4gRklGTyAqLworICAgbWFwX2FkZHIgKz0yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGlzIG1lYW5zIEFZTkMgREFUQSBJTiAqLworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChTU0lfT1ArICAgU1NJX0lET19TVFJUKSk7IC8qU1RPUCBBTkQgSU5URVJSVVBUICovCisgICBtYXBfYWRkciArPTI7CisgICBXUldfSEFSUE9PTihtYXBfYWRkciwgKENQRV9PUCtBREFUQV9JTitESU5UKSk7ICAgLypKVU1QIElGIE5PVCBEQVRBIElOIFBIWiAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChDUE5fT1ArQU1TR19JTisgIFNUKSk7ICAgIC8qSUYgTk9UIE1TRyBJTiBDSEVDSyA0IERBVEEgSU4gKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoQ1JEX09QK1NEQVRBKyAgICAweDAyKSk7ICAvKlNBVkUgREFUQSBQVFIgTVNHPyAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChCUkhfT1ArTk9UX0VRKyAgIERDKSk7ICAgIC8qR08gQ0hFQ0sgRk9SIERJU0NPTk5FQ1QgTVNHICovCisgICBtYXBfYWRkciArPTI7CisgICBXUldfSEFSUE9PTihtYXBfYWRkciwgKE1SUl9PUCtTREFUQSsgICAgRF9BUjEpKTsgLypTQVZFIERBVEEgUFRSUyBNU0cgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoQ1BOX09QK0FNU0dfSU4rICBTVCkpOyAgICAvKklGIE5PVCBNU0cgSU4gQ0hFQ0sgREFUQSBJTiAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChDUkRfT1ArU0RBVEErICAgIDB4MDQpKTsgIC8qRElTQ09OTkVDVCBNU0c/ICovCisgICBtYXBfYWRkciArPTI7CisgICBXUldfSEFSUE9PTihtYXBfYWRkciwgKEJSSF9PUCtOT1RfRVErICAgVU5LTldOKSk7LypVS05LTk9XTiBNU0cgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVJSX09QK1NEQVRBKyAgICBEX0JVQ0tFVCkpOy8qWEZFUiBESVNDT05ORUNUIE1TRyAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChTU0lfT1ArICAgICAgICAgIFNTSV9JVEFSX0RJU0MpKTsvKlNUT1AgQU5EIElOVEVSUlVQVCAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChDUE5fT1ArQVNUQVRVUysgIFVOS05XTikpOy8qSlVNUCBJRiBOT1QgU1RBVFVTIFBIWi4gKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVJSX09QK1NEQVRBKyAgRF9BUjApKTsgICAvKkdFVCBTVEFUVVMgQllURSAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChDUE5fT1ArQU1TR19JTisgIENDKSk7ICAgIC8qRVJST1IgSUYgTk9UIE1TRyBJTiBQSFogKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoQ1JEX09QK1NEQVRBKyAgICAweDAwKSk7ICAvKkNIRUNLIEZPUiBDTUQgQ09NUExFVEUgTVNHLiAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChCUkhfT1ArTk9UX0VRKyAgIENDKSk7ICAgIC8qRVJST1IgSUYgTk9UIENNRCBDT01QTEVURSBNU0cuICovCisgICBtYXBfYWRkciArPTI7CisgICBXUldfSEFSUE9PTihtYXBfYWRkciwgKE1SUl9PUCtTREFUQSsgIERfQlVDS0VUKSk7LypHRVQgQ01EIENPTVBMRVRFIE1TRyAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChTU0lfT1ArICAgICAgIFNTSV9JQ01EX0NPTVApKTsvKkVORCBPRiBDT01NQU5EICovCisgICBtYXBfYWRkciArPTI7CisKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoU1NJX09QKyBTU0lfSVVOS1dOKSk7ICAvKlJFQ0VJVkVEIFVOS05PV04gTVNHIEJZVEUgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoU1NJX09QKyBTU0lfSU5PX0NDKSk7ICAvKk5PIENPTU1BTkQgQ09NUExFVEUgQUZURVIgU1RBVFVTICovCisgICBtYXBfYWRkciArPTI7CisgICBXUldfSEFSUE9PTihtYXBfYWRkciwgKFNTSV9PUCsgU1NJX0lUSUNLTEUpKTsgLypCSU9TIFRpY2tsZWQgdGhlIE1nciAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChTU0lfT1ArIFNTSV9JUkZBSUwpKTsgIC8qRVhQRUNURUQgSUQvVEFHIE1FU1NBR0VTIEFORCAqLworICAgbWFwX2FkZHIgKz0yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRElETidUIEdFVCBPTkUgKi8KKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoQ1JSX09QK0FSMysgIFNfSURSRUcpKTsgLyogY29tcCBTQ1NJIFNFTCBJRCAmIEFSMyovCisgICBtYXBfYWRkciArPTI7CisgICBXUldfSEFSUE9PTihtYXBfYWRkciwgKEJSSF9PUCtFUVVBTCsgICAweDAwKSk7ICAgIC8qU0VMIElEIE9LIHRoZW4gQ29udGkuICovCisgICBtYXBfYWRkciArPTI7CisgICBXUldfSEFSUE9PTihtYXBfYWRkciwgKFNTSV9PUCsgU1NJX0lOT19DQykpOyAgLypOTyBDT01NQU5EIENPTVBMRVRFIEFGVEVSIFNUQVRVUyAqLworCisKKworICAgU0dSQU1fQUNDRVNTKHBfcG9ydCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IEF1dG8gQ29tbWFuZCBDb21wbGV0ZQorICoKKyAqIERlc2NyaXB0aW9uOiBQb3N0IGNvbW1hbmQgYmFjayB0byBob3N0IGFuZCBmaW5kIGFub3RoZXIgY29tbWFuZAorICogICAgICAgICAgICAgIHRvIGV4ZWN1dGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCit2b2lkIGF1dG9DbWRDbXBsdChVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQordm9pZCBhdXRvQ21kQ21wbHQoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2NhcmQpCisjZW5kaWYKK3sKKyAgIFBTQ0NCIGN1cnJTQ0NCOworICAgVUNIQVIgc3RhdHVzX2J5dGU7CisKKyAgIGN1cnJTQ0NCID0gQkxfQ2FyZFtwX2NhcmRdLmN1cnJlbnRTQ0NCOworCisgICBzdGF0dXNfYnl0ZSA9IFJEX0hBUlBPT04ocF9wb3J0K2hwX2dwX3JlZ18wKTsKKworICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckxVTl9DQSA9IEZBTFNFOworCisgICBpZiAoc3RhdHVzX2J5dGUgIT0gU1NHT09EKSB7CisKKyAgICAgIGlmIChzdGF0dXNfYnl0ZSA9PSBTU1FfRlVMTCkgeworCisKKwkJCWlmKCgoQkxfQ2FyZFtwX2NhcmRdLmdsb2JhbEZsYWdzICYgRl9DT05MVU5fSU8pICYmCisJCQkJKChzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyU3RhdHVzICYgVEFSX1RBR19RX01BU0spICE9IFRBR19RX1RSWUlORykpKQorCQkJeworCSAgICAgICAgIHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJMVU5CdXN5W2N1cnJTQ0NCLT5MdW5dID0gVFJVRTsKKwkJCQlpZihCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudCAhPSAwKQorCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudC0tOworCQkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUV9UYmxbc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLkx1bkRpc2NRX0lkeFtjdXJyU0NDQi0+THVuXV0gPSBOVUxMOworCQkJfQorCQkJZWxzZQorCQkJeworCSAgICAgICAgIHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJMVU5CdXN5WzBdID0gVFJVRTsKKwkJCQlpZihjdXJyU0NDQi0+U2NjYl90YWcpCisJCQkJeworCQkJCQlpZihCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudCAhPSAwKQorCQkJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQtLTsKKwkJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtjdXJyU0NDQi0+U2NjYl90YWddID0gTlVMTDsKKwkJCQl9ZWxzZQorCQkJCXsKKwkJCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQgIT0gMCkKKwkJCQkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUUNvdW50LS07CisJCQkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUV9UYmxbc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLkx1bkRpc2NRX0lkeFswXV0gPSBOVUxMOworCQkJCX0KKwkJCX0KKworICAgICAgICAgY3VyclNDQ0ItPlNjY2JfTUdSRmxhZ3MgfD0gRl9TVEFUVVNMT0FERUQ7CisKKyAgICAgICAgIHF1ZXVlU2VsZWN0RmFpbCgmQkxfQ2FyZFtwX2NhcmRdLHBfY2FyZCk7CisKKyAgICAgICAgIHJldHVybjsKKyAgICAgICAgIH0KKworICAgICAgaWYoY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPT0gU0VMRUNUX1NOX1NUKQorICAgICAgICAgeworICAgICAgICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhclN0YXR1cyB8PQorICAgICAgICAgICAgKFVDSEFSKVNZTkNfU1VQUE9SVEVEOworCisJICAgICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckVFVmFsdWUgJj0gfkVFX1NZTkNfTUFTSzsKKyAgICAgICAgIEJMX0NhcmRbcF9jYXJkXS5nbG9iYWxGbGFncyB8PSBGX05FV19TQ0NCX0NNRDsKKworCQkJaWYoKChCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgJiBGX0NPTkxVTl9JTykgJiYKKwkJCQkoKHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJTdGF0dXMgJiBUQVJfVEFHX1FfTUFTSykgIT0gVEFHX1FfVFJZSU5HKSkpCisJCQl7CisJICAgICAgICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckxVTkJ1c3lbY3VyclNDQ0ItPkx1bl0gPSBUUlVFOworCQkJCWlmKEJMX0NhcmRbcF9jYXJkXS5kaXNjUUNvdW50ICE9IDApCisJCQkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUUNvdW50LS07CisJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uTHVuRGlzY1FfSWR4W2N1cnJTQ0NCLT5MdW5dXSA9IE5VTEw7CisJCQl9CisJCQllbHNlCisJCQl7CisJICAgICAgICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckxVTkJ1c3lbMF0gPSBUUlVFOworCQkJCWlmKGN1cnJTQ0NCLT5TY2NiX3RhZykKKwkJCQl7CisJCQkJCWlmKEJMX0NhcmRbcF9jYXJkXS5kaXNjUUNvdW50ICE9IDApCisJCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudC0tOworCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW2N1cnJTQ0NCLT5TY2NiX3RhZ10gPSBOVUxMOworCQkJCX1lbHNlCisJCQkJeworCQkJCQlpZihCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudCAhPSAwKQorCQkJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQtLTsKKwkJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uTHVuRGlzY1FfSWR4WzBdXSA9IE5VTEw7CisJCQkJfQorCQkJfQorICAgICAgICAgcmV0dXJuOworCisgICAgICAgICB9CisKKyAgICAgIGlmKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IFNFTEVDVF9XTl9TVCkKKyAgICAgICAgIHsKKworCSAgICAgIHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJTdGF0dXMgPQorCSAgICAgICAgIChzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uCisJICAgICAgICAgVGFyU3RhdHVzICYgfldJREVfRU5BQkxFRCkgfCBXSURFX05FR09DSUFURUQ7CisKKwkgICAgICBzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyRUVWYWx1ZSAmPSB+RUVfV0lERV9TQ1NJOworICAgICAgICAgQkxfQ2FyZFtwX2NhcmRdLmdsb2JhbEZsYWdzIHw9IEZfTkVXX1NDQ0JfQ01EOworCisJCQlpZigoKEJMX0NhcmRbcF9jYXJkXS5nbG9iYWxGbGFncyAmIEZfQ09OTFVOX0lPKSAmJgorCQkJCSgoc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSAhPSBUQUdfUV9UUllJTkcpKSkKKwkJCXsKKwkgICAgICAgICBzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyTFVOQnVzeVtjdXJyU0NDQi0+THVuXSA9IFRSVUU7CisJCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQgIT0gMCkKKwkJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQtLTsKKwkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW3NjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5MdW5EaXNjUV9JZHhbY3VyclNDQ0ItPkx1bl1dID0gTlVMTDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkgICAgICAgICBzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyTFVOQnVzeVswXSA9IFRSVUU7CisJCQkJaWYoY3VyclNDQ0ItPlNjY2JfdGFnKQorCQkJCXsKKwkJCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQgIT0gMCkKKwkJCQkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUUNvdW50LS07CisJCQkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUV9UYmxbY3VyclNDQ0ItPlNjY2JfdGFnXSA9IE5VTEw7CisJCQkJfWVsc2UKKwkJCQl7CisJCQkJCWlmKEJMX0NhcmRbcF9jYXJkXS5kaXNjUUNvdW50ICE9IDApCisJCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudC0tOworCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW3NjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5MdW5EaXNjUV9JZHhbMF1dID0gTlVMTDsKKwkJCQl9CisJCQl9CisgICAgICAgICByZXR1cm47CisgICAgICAKKyAgICAgICAgIH0KKyAgICAgCisJICAgaWYgKHN0YXR1c19ieXRlID09IFNTQ0hFQ0spIAorCQl7CisJCQlpZihCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgJiBGX0RPX1JFTkVHTykKKwkJCXsKKwkJCQlpZiAoc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckVFVmFsdWUgJiBFRV9TWU5DX01BU0spCisJCQkJeworCQkJCQlzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyU3RhdHVzICY9IH5UQVJfU1lOQ19NQVNLOworCQkJCX0KKwkJCQlpZiAoc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckVFVmFsdWUgJiBFRV9XSURFX1NDU0kpCisJCQkJeworCQkJCQlzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyU3RhdHVzICY9IH5UQVJfV0lERV9NQVNLOworCQkJCX0KKwkJCX0KKwkJfQorCisgICAgICBpZiAoIShjdXJyU0NDQi0+U2NjYl9YZmVyU3RhdGUgJiBGX0FVVE9fU0VOU0UpKSB7CisKKyAgICAgICAgIGN1cnJTQ0NCLT5TY2NiU3RhdHVzID0gU0NDQl9FUlJPUjsKKyAgICAgICAgIGN1cnJTQ0NCLT5UYXJnZXRTdGF0dXMgPSBzdGF0dXNfYnl0ZTsKKworICAgICAgICAgaWYgKHN0YXR1c19ieXRlID09IFNTQ0hFQ0spIHsKKworICAgICAgICAgICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckxVTl9DQQorICAgICAgICAgICAgICAgPSBUUlVFOworICAgICAKKworI2lmIChGV19UWVBFPT1fU0NDQl9NR1JfKQorICAgICAgICAgICAgaWYgKGN1cnJTQ0NCLT5SZXF1ZXN0U2Vuc2VMZW5ndGggIT0gTk9fQVVUT19SRVFVRVNUX1NFTlNFKSB7CisKKyAgICAgICAgICAgICAgIGlmIChjdXJyU0NDQi0+UmVxdWVzdFNlbnNlTGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgICBjdXJyU0NDQi0+UmVxdWVzdFNlbnNlTGVuZ3RoID0gMTQ7CisKKyAgICAgICAgICAgICAgIHNzZW5zcygmQkxfQ2FyZFtwX2NhcmRdKTsKKyAgICAgICAgICAgICAgIEJMX0NhcmRbcF9jYXJkXS5nbG9iYWxGbGFncyB8PSBGX05FV19TQ0NCX0NNRDsKKworIAkJCQkJaWYoKChCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgJiBGX0NPTkxVTl9JTykgJiYKKwkJCQkJCSgoc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSAhPSBUQUdfUV9UUllJTkcpKSkKKwkJCQkJeworCQkJICAgICAgICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckxVTkJ1c3lbY3VyclNDQ0ItPkx1bl0gPSBUUlVFOworCQkJCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQgIT0gMCkKKwkJCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudC0tOworCQkJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uTHVuRGlzY1FfSWR4W2N1cnJTQ0NCLT5MdW5dXSA9IE5VTEw7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJICAgCQkgICAgICBzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyTFVOQnVzeVswXSA9IFRSVUU7CisJCQkJCQlpZihjdXJyU0NDQi0+U2NjYl90YWcpCisJCQkJCQl7CisJCQkJCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQgIT0gMCkKKwkJCQkJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQtLTsKKwkJCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW2N1cnJTQ0NCLT5TY2NiX3RhZ10gPSBOVUxMOworCQkJCQkJfWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlpZihCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudCAhPSAwKQorCQkJCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudC0tOworCQkJCQkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUV9UYmxbc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLkx1bkRpc2NRX0lkeFswXV0gPSBOVUxMOworCQkJCQkJfQorCQkJCQl9CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICB9CisjZWxzZQorCQkJCSAgIGlmICgoIShjdXJyU0NDQi0+U2NjYl91Y2JfcHRyLT5VQ0Jfb3Bjb2RlICYgT1BDX05PX0FVVE9fU0VOU0UpKSAmJgorCQkJICAgCQkoY3VyclNDQ0ItPlJlcXVlc3RTZW5zZUxlbmd0aCkpCisJCQkJICAgeworCQkJCSAgIAlzc2Vuc3MoJkJMX0NhcmRbcF9jYXJkXSk7CisJCQkJICAgICAgQkxfQ2FyZFtwX2NhcmRdLmdsb2JhbEZsYWdzIHw9IEZfTkVXX1NDQ0JfQ01EOworCisJCQkJCQlpZigoKEJMX0NhcmRbcF9jYXJkXS5nbG9iYWxGbGFncyAmIEZfQ09OTFVOX0lPKSAmJgorCQkJCQkJCSgoc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSAhPSBUQUdfUV9UUllJTkcpKSkKKwkJCQkJCXsKKwkgICAgICAJCQkgICBzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyTFVOQnVzeVtjdXJyU0NDQi0+THVuXSA9IFRSVUU7CisJCQkJCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQgIT0gMCkKKwkJCQkJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQtLTsKKwkJCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW3NjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5MdW5EaXNjUV9JZHhbY3VyclNDQ0ItPkx1bl1dID0gTlVMTDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkgICAgICAJCQkgICBzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyTFVOQnVzeVswXSA9IFRSVUU7CisJCQkJCQkJaWYoY3VyclNDQ0ItPlNjY2JfdGFnKQorCQkJCQkJCXsKKwkJCQkJCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQgIT0gMCkKKwkJCQkJCQkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUUNvdW50LS07CisJCQkJCQkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUV9UYmxbY3VyclNDQ0ItPlNjY2JfdGFnXSA9IE5VTEw7CisJCQkJCQkJfWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWlmKEJMX0NhcmRbcF9jYXJkXS5kaXNjUUNvdW50ICE9IDApCisJCQkJCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudC0tOworCQkJCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW3NjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5MdW5EaXNjUV9JZHhbMF1dID0gTlVMTDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJICAgICAgcmV0dXJuOworCQkJCSAgIH0KKworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKworCWlmKChCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgJiBGX0NPTkxVTl9JTykgJiYKKwkJKChzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyU3RhdHVzICYgVEFSX1RBR19RX01BU0spICE9IFRBR19RX1RSWUlORykpCisJICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckxVTkJ1c3lbY3VyclNDQ0ItPkx1bl0gPSBGQUxTRTsKKwllbHNlCisJICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckxVTkJ1c3lbMF0gPSBGQUxTRTsKKworCisgICBxdWV1ZUNtZENvbXBsZXRlKCZCTF9DYXJkW3BfY2FyZF0sIGN1cnJTQ0NCLCBwX2NhcmQpOworfQorI2lkZW50ICIkSWQ6IGJ1c21zdHIuYyAxLjggMTk5Ny8wMS8zMSAwMjoxMDoyNyBtb2hhbiBFeHAgJCIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCisgKiAgIENvcHlyaWdodCAxOTk1LTE5OTYgYnkgTXlsZXggQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGJvdGggdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFuZCBhIEJTRC1zdHlsZSBjb3B5cmlnaHQ7IHNlZSBMSUNFTlNFLkZsYXNoUG9pbnQgZm9yIGRldGFpbHMuCisgKgorICogICAkV29ya2ZpbGU6ICAgYnVzbXN0ci5jICAkCisgKgorICogICBEZXNjcmlwdGlvbjogIEZ1bmN0aW9ucyB0byBzdGFydCwgc3RvcCwgYW5kIGFib3J0IEJ1c01hc3RlciBvcGVyYXRpb25zLgorICoKKyAqICAgJERhdGU6IDE5OTcvMDEvMzEgMDI6MTA6MjcgJAorICoKKyAqICAgJFJldmlzaW9uOiAxLjggJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qI2luY2x1ZGUgPGdsb2JhbHMuaD4qLworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKwkvKiNpbmNsdWRlIDxidWRpLmg+Ki8KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzY2NibWdyLmg+Ki8KKy8qI2luY2x1ZGUgPGJseDMwLmg+Ki8KKy8qI2luY2x1ZGUgPHRhcmdldC5oPiovCisvKiNpbmNsdWRlIDxzY3NpMi5oPiovCisvKiNpbmNsdWRlIDxoYXJwb29uLmg+Ki8KKworCisvKgorZXh0ZXJuIFNDQ0JDQVJEIEJMX0NhcmRbTUFYX0NBUkRTXTsKK2V4dGVybiBTQ0NCTUdSX1RBUl9JTkZPIHNjY2JNZ3JUYmxbTUFYX0NBUkRTXVtNQVhfU0NTSV9UQVJdOworKi8KKworI2RlZmluZSBTSE9SVF9XQUlUICAgMHgwMDAwMDAwRgorI2RlZmluZSBMT05HX1dBSVQgICAgMHgwMDAwRkZGRkwKKworI2lmIGRlZmluZWQoQlVHQlVHKQordm9pZCBEZWJ1Z19Mb2FkKFVDSEFSIHBfY2FyZCwgVUNIQVIgcF9idWdfZGF0YSk7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogRGF0YSBUcmFuc2ZlciBQcm9jZXNzb3IKKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIHBlcmZvcm1zIHR3byB0YXNrcy4KKyAqICAgICAgICAgICAgICAoMSkgU3RhcnQgZGF0YSB0cmFuc2ZlciBieSBjYWxsaW5nIEhPU1RfREFUQV9YRkVSX1NUQVJUCisgKiAgICAgICAgICAgICAgZnVuY3Rpb24uICBPbmNlIGRhdGEgdHJhbnNmZXIgaXMgc3RhcnRlZCwgKDIpIERlcGVuZHMKKyAqICAgICAgICAgICAgICBvbiB0aGUgdHlwZSBvZiBkYXRhIHRyYW5zZmVyIG1vZGUgU2NhdHRlci9HYXRoZXIgbW9kZQorICogICAgICAgICAgICAgIG9yIE5PTiBTY2F0dGVyL0dhdGhlciBtb2RlLiAgSW4gTk9OIFNjYXR0ZXIvR2F0aGVyIG1vZGUsCisgKiAgICAgICAgICAgICAgdGhpcyByb3V0aW5lIGNoZWNrcyBTY2NiX01HUkZsYWcgKEZfSE9TVF9YRkVSX0FDVCBiaXQpIGZvcgorICogICAgICAgICAgICAgIGRhdGEgdHJhbnNmZXIgZG9uZS4gIEluIFNjYXR0ZXIvR2F0aGVyIG1vZGUsIHRoaXMgcm91dGluZQorICogICAgICAgICAgICAgIGNoZWNrcyBidXMgbWFzdGVyIGNvbW1hbmQgY29tcGxldGUgYW5kIGR1YWwgcmFuayBidXN5CisgKiAgICAgICAgICAgICAgYml0IHRvIGtlZXAgY2hhaW5pbmcgU0MgdHJhbnNmZXIgY29tbWFuZC4gIFNpbWlsYXJseSwKKyAqICAgICAgICAgICAgICBpbiBTY2F0dGVyL0dhdGhlciBtb2RlLCBpdCBjaGVja3MgU2NjYl9NR1JGbGFnCisgKiAgICAgICAgICAgICAgKEZfSE9TVF9YRkVSX0FDVCBiaXQpIGZvciBkYXRhIHRyYW5zZmVyIGRvbmUuCisgKiAgICAgICAgICAgICAgCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgZGF0YVhmZXJQcm9jZXNzb3IoVVNIT1JUIHBvcnQsIFBTQ0NCY2FyZCBwQ3VyckNhcmQpCisjZWxzZQordm9pZCBkYXRhWGZlclByb2Nlc3NvcihVTE9ORyBwb3J0LCBQU0NDQmNhcmQgcEN1cnJDYXJkKQorI2VuZGlmCit7CisgICBQU0NDQiBjdXJyU0NDQjsKKworICAgY3VyclNDQ0IgPSBwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCOworCisgICAgICBpZiAoY3VyclNDQ0ItPlNjY2JfWGZlclN0YXRlICYgRl9TR19YRkVSKQorCQkJeworCQkJaWYgKHBDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgJiBGX0hPU1RfWEZFUl9BQ1QpCisKKwkJCQl7CisJCSAgIAljdXJyU0NDQi0+U2NjYl9zZ3NlZyArPSAoVUNIQVIpU0dfQlVGX0NOVDsKKyAgICAgICAgIAljdXJyU0NDQi0+U2NjYl9TR29mZnNldCA9IDB4MDA7IAorIAkJCQl9CisJCQlwQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfSE9TVF9YRkVSX0FDVDsKKyAgICAgICAgIAorICAgICAgICAgYnVzTXN0clNHRGF0YVhmZXJTdGFydChwb3J0LCBjdXJyU0NDQik7CisJCQl9CisKKyAgICAgIGVsc2UKKwkJCXsKKwkJCWlmICghKHBDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgJiBGX0hPU1RfWEZFUl9BQ1QpKQorCQkJCXsKKwkJCQlwQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfSE9TVF9YRkVSX0FDVDsKKyAgICAgICAgIAorICAgICAgICAgCWJ1c01zdHJEYXRhWGZlclN0YXJ0KHBvcnQsIGN1cnJTQ0NCKTsKKyAgICAgICAgIAl9CisJCQl9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogQnVzTWFzdGVyIFNjYXR0ZXIgR2F0aGVyIERhdGEgVHJhbnNmZXIgU3RhcnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChET1MpCit2b2lkIGJ1c01zdHJTR0RhdGFYZmVyU3RhcnQoVVNIT1JUIHBfcG9ydCwgUFNDQ0IgcGN1cnJTQ0NCKQorI2Vsc2UKK3ZvaWQgYnVzTXN0clNHRGF0YVhmZXJTdGFydChVTE9ORyBwX3BvcnQsIFBTQ0NCIHBjdXJyU0NDQikKKyNlbmRpZgoreworICAgVUxPTkcgY291bnQsYWRkcix0bXBTR0NudDsKKyAgIFVJTlQgc2dfaW5kZXg7CisgICBVQ0hBUiBzZ19jb3VudCwgaTsKKyNpZiBkZWZpbmVkKERPUykKKyAgIFVTSE9SVCByZWdfb2Zmc2V0OworI2Vsc2UKKyAgIFVMT05HIHJlZ19vZmZzZXQ7CisjZW5kaWYKKworCisgICBpZiAocGN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSAmIEZfSE9TVF9YRkVSX0RJUikgeworCisgICAgICBjb3VudCA9ICAoKFVMT05HKSBIT1NUX1JEX0NNRCk8PDI0OworICAgICAgfQorCisgICBlbHNlIHsKKyAgICAgIGNvdW50ID0gICgoVUxPTkcpIEhPU1RfV1JUX0NNRCk8PDI0OworICAgICAgfQorCisgICBzZ19jb3VudCA9IDA7CisgICB0bXBTR0NudCA9IDA7CisgICBzZ19pbmRleCA9IHBjdXJyU0NDQi0+U2NjYl9zZ3NlZzsKKyAgIHJlZ19vZmZzZXQgPSBocF9hcmFtQmFzZTsKKworCisJaSA9IChVQ0hBUikgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCkgJiB+KFNHUkFNX0FSQU18U0NBVFRFUl9FTikpOworCisKKwlXUl9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwsIGkpOworCisgICB3aGlsZSAoKHNnX2NvdW50IDwgKFVDSEFSKVNHX0JVRl9DTlQpICYmCisgICAgICAoKFVMT05HKShzZ19pbmRleCAqIChVSU5UKVNHX0VMRU1FTlRfU0laRSkgPCBwY3VyclNDQ0ItPkRhdGFMZW5ndGgpICkgeworCisjaWYgZGVmaW5lZChDT01QSUxFUl8xNl9CSVQpICYmICFkZWZpbmVkKERPUykKKyAgICAgIHRtcFNHQ250ICs9ICooKChVTE9ORyBmYXIgKilwY3VyclNDQ0ItPkRhdGFQb2ludGVyKSsKKyAgICAgICAgIChzZ19pbmRleCAqIDIpKTsKKworICAgICAgY291bnQgfD0gKigoKFVMT05HIGZhciAqKXBjdXJyU0NDQi0+RGF0YVBvaW50ZXIpKworICAgICAgICAgKHNnX2luZGV4ICogMikpOworCisgICAgICBhZGRyID0gKigoKFVMT05HIGZhciAqKXBjdXJyU0NDQi0+RGF0YVBvaW50ZXIpKworICAgICAgICAgKChzZ19pbmRleCAqIDIpICsgMSkpOworCisjZWxzZQorICAgICAgdG1wU0dDbnQgKz0gKigoKFVMT05HICopcGN1cnJTQ0NCLT5EYXRhUG9pbnRlcikrCisgICAgICAgICAoc2dfaW5kZXggKiAyKSk7CisKKyAgICAgIGNvdW50IHw9ICooKChVTE9ORyAqKXBjdXJyU0NDQi0+RGF0YVBvaW50ZXIpKworICAgICAgICAgKHNnX2luZGV4ICogMikpOworCisgICAgICBhZGRyID0gKigoKFVMT05HICopcGN1cnJTQ0NCLT5EYXRhUG9pbnRlcikrCisgICAgICAgICAoKHNnX2luZGV4ICogMikgKyAxKSk7CisjZW5kaWYKKworCisgICAgICBpZiAoKCFzZ19jb3VudCkgJiYgKHBjdXJyU0NDQi0+U2NjYl9TR29mZnNldCkpIHsKKworICAgICAgICAgYWRkciArPSAoKGNvdW50ICYgMHgwMEZGRkZGRkwpIC0gcGN1cnJTQ0NCLT5TY2NiX1NHb2Zmc2V0KTsKKyAgICAgICAgIGNvdW50ID0gKGNvdW50ICYgMHhGRjAwMDAwMEwpIHwgcGN1cnJTQ0NCLT5TY2NiX1NHb2Zmc2V0OworCisgICAgICAgICB0bXBTR0NudCA9IGNvdW50ICYgMHgwMEZGRkZGRkw7CisgICAgICAgICB9CisKKyAgICAgIFdSX0hBUlAzMihwX3BvcnQscmVnX29mZnNldCxhZGRyKTsKKyAgICAgIHJlZ19vZmZzZXQgKz00OworCisgICAgICBXUl9IQVJQMzIocF9wb3J0LHJlZ19vZmZzZXQsY291bnQpOworICAgICAgcmVnX29mZnNldCArPTQ7CisKKyAgICAgIGNvdW50ICY9IDB4RkYwMDAwMDBMOworICAgICAgc2dfaW5kZXgrKzsKKyAgICAgIHNnX2NvdW50Kys7CisKKyAgICAgIH0gLypFbmQgV2hpbGUgKi8KKworICAgcGN1cnJTQ0NCLT5TY2NiX1hmZXJDbnQgPSB0bXBTR0NudDsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2dfYWRkciwoc2dfY291bnQ8PDQpKTsKKworICAgaWYgKHBjdXJyU0NDQi0+U2NjYl9YZmVyU3RhdGUgJiBGX0hPU1RfWEZFUl9ESVIpIHsKKworICAgICAgV1JfSEFSUDMyKHBfcG9ydCxocF94ZmVyY250XzAsdG1wU0dDbnQpOworCisKKyAgICAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3BvcnRjdHJsXzAsKERNQV9QT1JUIHwgU0NTSV9QT1JUIHwgU0NTSV9JTkJJVCkpOworICAgICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgU19EQVRBSV9QSCk7CisgICAgICB9CisKKyAgIGVsc2UgeworCisKKyAgICAgIGlmICgoIShSRF9IQVJQT09OKHBfcG9ydCtocF9zeW5jdGFyZ18wKSAmIE5BUlJPV19TQ1NJKSkgJiYKKyAgICAgICAgICh0bXBTR0NudCAmIDB4MDAwMDAwMDAxKSkKKyAgICAgICAgIHsKKworICAgICAgICAgcGN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSB8PSBGX09ERF9CQUxMX0NOVDsKKyAgICAgICAgIHRtcFNHQ250LS07CisgICAgICAgICB9CisKKworICAgICAgV1JfSEFSUDMyKHBfcG9ydCxocF94ZmVyY250XzAsdG1wU0dDbnQpOworCisgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9wb3J0Y3RybF8wLChTQ1NJX1BPUlQgfCBETUFfUE9SVCB8IERNQV9SRCkpOworICAgICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgU19EQVRBT19QSCk7CisgICAgICB9CisKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsLCAoVUNIQVIpIChpIHwgU0NBVFRFUl9FTikpOworCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogQnVzTWFzdGVyIERhdGEgVHJhbnNmZXIgU3RhcnQKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoRE9TKQordm9pZCBidXNNc3RyRGF0YVhmZXJTdGFydChVU0hPUlQgcF9wb3J0LCBQU0NDQiBwY3VyclNDQ0IpCisjZWxzZQordm9pZCBidXNNc3RyRGF0YVhmZXJTdGFydChVTE9ORyBwX3BvcnQsIFBTQ0NCIHBjdXJyU0NDQikKKyNlbmRpZgoreworICAgVUxPTkcgYWRkcixjb3VudDsKKworICAgaWYgKCEocGN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSAmIEZfQVVUT19TRU5TRSkpIHsKKworICAgICAgY291bnQgPSBwY3VyclNDQ0ItPlNjY2JfWGZlckNudDsKKworICAgICAgYWRkciA9IChVTE9ORykgcGN1cnJTQ0NCLT5EYXRhUG9pbnRlciArIHBjdXJyU0NDQi0+U2NjYl9BVEM7CisgICAgICB9CisKKyAgIGVsc2UgeworICAgICAgYWRkciA9IHBjdXJyU0NDQi0+U2Vuc2VQb2ludGVyOworICAgICAgY291bnQgPSBwY3VyclNDQ0ItPlJlcXVlc3RTZW5zZUxlbmd0aDsKKworICAgICAgfQorCisjaWYgZGVmaW5lZChET1MpCisgICBhc20geyBtb3YgZHgscF9wb3J0OworICAgICAgICAgbW92IGF4LHdvcmQgcHRyIGNvdW50OworICAgICAgICAgYWRkIGR4LGhwX3hmZXJfY250X2xvOworICAgICAgICAgb3V0IGR4LGFsOworICAgICAgICAgaW5jIGR4OworICAgICAgICAgeGNoZyBhaCxhbAorICAgICAgICAgb3V0IGR4LGFsOworICAgICAgICAgaW5jIGR4OworICAgICAgICAgbW92IGF4LHdvcmQgcHRyIGNvdW50KzI7CisgICAgICAgICBvdXQgZHgsYWw7CisgICAgICAgICBpbmMgZHg7CisgICAgICAgICBpbmMgZHg7CisgICAgICAgICBtb3YgYXgsd29yZCBwdHIgYWRkcjsKKyAgICAgICAgIG91dCBkeCxhbDsKKyAgICAgICAgIGluYyBkeDsKKyAgICAgICAgIHhjaGcgYWgsYWwKKyAgICAgICAgIG91dCBkeCxhbDsKKyAgICAgICAgIGluYyBkeDsKKyAgICAgICAgIG1vdiBheCx3b3JkIHB0ciBhZGRyKzI7CisgICAgICAgICBvdXQgZHgsYWw7CisgICAgICAgICBpbmMgZHg7CisgICAgICAgICB4Y2hnIGFoLGFsCisgICAgICAgICBvdXQgZHgsYWw7CisgICAgICAgICB9CisKKyAgIFdSX0hBUlAzMihwX3BvcnQsaHBfeGZlcmNudF8wLGNvdW50KTsKKworI2Vsc2UKKyAgIEhQX1NFVFVQX0FERFJfQ05UKHBfcG9ydCxhZGRyLGNvdW50KTsKKyNlbmRpZgorCisKKyAgIGlmIChwY3VyclNDQ0ItPlNjY2JfWGZlclN0YXRlICYgRl9IT1NUX1hGRVJfRElSKSB7CisKKyAgICAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3BvcnRjdHJsXzAsKERNQV9QT1JUIHwgU0NTSV9QT1JUIHwgU0NTSV9JTkJJVCkpOworICAgICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgU19EQVRBSV9QSCk7CisKKyAgICAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3hmZXJfY21kLAorICAgICAgICAgKFhGRVJfRE1BX0hPU1QgfCBYRkVSX0hPU1RfQVVUTyB8IFhGRVJfRE1BXzhCSVQpKTsKKyAgICAgIH0KKworICAgZWxzZSB7CisKKyAgICAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3BvcnRjdHJsXzAsKFNDU0lfUE9SVCB8IERNQV9QT1JUIHwgRE1BX1JEKSk7CisgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3Npc2lnLCBTX0RBVEFPX1BIKTsKKworICAgICAgV1JfSEFSUE9PTihwX3BvcnQraHBfeGZlcl9jbWQsCisgICAgICAgICAoWEZFUl9IT1NUX0RNQSB8IFhGRVJfSE9TVF9BVVRPIHwgWEZFUl9ETUFfOEJJVCkpOworCisgICAgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogQnVzTWFzdGVyIFRpbWVvdXQgSGFuZGxlcgorICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBhIGJ1cyBtYXN0ZXIgY29tbWFuZCBidXN5IHRpbWUKKyAqICAgICAgICAgICAgICAgb3V0IGlzIGRldGVjdGVkLiAgVGhpcyByb3V0aW5lcyBpc3N1ZSBoYWx0IHN0YXRlIG1hY2hpbmUKKyAqICAgICAgICAgICAgICAgd2l0aCBhIHNvZnR3YXJlIHRpbWUgb3V0IGZvciBjb21tYW5kIGJ1c3kuICBJZiBjb21tYW5kIGJ1c3kKKyAqICAgICAgICAgICAgICAgaXMgc3RpbGwgYXNzZXJ0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgdGltZSBvdXQsIGl0IGlzc3VlcworICogICAgICAgICAgICAgICBoYXJkIGFib3J0IHdpdGggYW5vdGhlciBzb2Z0d2FyZSB0aW1lIG91dC4gIEl0IGhhcmQgYWJvcnQKKyAqICAgICAgICAgICAgICAgY29tbWFuZCBidXN5IGlzIGFsc28gdGltZSBvdXQsIGl0J2xsIGp1c3QgZ2l2ZSB1cC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChET1MpCitVQ0hBUiBidXNNc3RyVGltZU91dChVU0hPUlQgcF9wb3J0KQorI2Vsc2UKK1VDSEFSIGJ1c01zdHJUaW1lT3V0KFVMT05HIHBfcG9ydCkKKyNlbmRpZgoreworICAgVUxPTkcgdGltZW91dDsKKworICAgdGltZW91dCA9IExPTkdfV0FJVDsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc3lzX2N0cmwsIEhBTFRfTUFDSCk7CisKKyAgIHdoaWxlICgoIShSRF9IQVJQT09OKHBfcG9ydCtocF9leHRfc3RhdHVzKSAmIENNRF9BQk9SVEVEKSkgJiYgdGltZW91dC0tKSB7fQorCisgICAKKyAgIAorICAgaWYgKFJEX0hBUlBPT04ocF9wb3J0K2hwX2V4dF9zdGF0dXMpICYgQk1fQ01EX0JVU1kpIHsKKyAgICAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3N5c19jdHJsLCBIQVJEX0FCT1JUKTsKKworICAgICAgdGltZW91dCA9IExPTkdfV0FJVDsKKyAgICAgIHdoaWxlICgoUkRfSEFSUE9PTihwX3BvcnQraHBfZXh0X3N0YXR1cykgJiBCTV9DTURfQlVTWSkgJiYgdGltZW91dC0tKSB7fQorICAgICAgfQorCisgICBSRF9IQVJQT09OKHBfcG9ydCtocF9pbnRfc3RhdHVzKTsgICAgICAgICAgIC8qQ2xlYXIgY29tbWFuZCBjb21wbGV0ZSAqLworCisgICBpZiAoUkRfSEFSUE9PTihwX3BvcnQraHBfZXh0X3N0YXR1cykgJiBCTV9DTURfQlVTWSkgeworICAgICAgcmV0dXJuKFRSVUUpOworICAgICAgfQorCisgICBlbHNlIHsKKyAgICAgIHJldHVybihGQUxTRSk7CisgICAgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogSG9zdCBEYXRhIFRyYW5zZmVyIEFib3J0CisgKgorICogRGVzY3JpcHRpb246IEFib3J0IGFueSBpbiBwcm9ncmVzcyB0cmFuc2Zlci4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChET1MpCit2b2lkIGhvc3REYXRhWGZlckFib3J0KFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQsIFBTQ0NCIHBDdXJyU0NDQikKKyNlbHNlCit2b2lkIGhvc3REYXRhWGZlckFib3J0KFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCwgUFNDQ0IgcEN1cnJTQ0NCKQorI2VuZGlmCit7CisKKyAgIFVMT05HIHRpbWVvdXQ7CisgICBVTE9ORyByZW1haW5fY250OworICAgVUlOVCBzZ19wdHI7CisKKyAgIEJMX0NhcmRbcF9jYXJkXS5nbG9iYWxGbGFncyAmPSB+Rl9IT1NUX1hGRVJfQUNUOworCisgICBpZiAocEN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSAmIEZfQVVUT19TRU5TRSkgeworCisKKyAgICAgIGlmICghKFJEX0hBUlBPT04ocG9ydCtocF9pbnRfc3RhdHVzKSAmIElOVF9DTURfQ09NUEwpKSB7CisKKyAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9ibV9jdHJsLCAoUkRfSEFSUE9PTihwb3J0K2hwX2JtX2N0cmwpIHwgRkxVU0hfWEZFUl9DTlRSKSk7CisgICAgICAgICB0aW1lb3V0ID0gTE9OR19XQUlUOworCisgICAgICAgICB3aGlsZSAoKFJEX0hBUlBPT04ocG9ydCtocF9leHRfc3RhdHVzKSAmIEJNX0NNRF9CVVNZKSAmJiB0aW1lb3V0LS0pIHt9CisKKyAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9ibV9jdHJsLCAoUkRfSEFSUE9PTihwb3J0K2hwX2JtX2N0cmwpICYgfkZMVVNIX1hGRVJfQ05UUikpOworCisgICAgICAgICBpZiAoUkRfSEFSUE9PTihwb3J0K2hwX2V4dF9zdGF0dXMpICYgQk1fQ01EX0JVU1kpIHsKKworICAgICAgICAgICAgaWYgKGJ1c01zdHJUaW1lT3V0KHBvcnQpKSB7CisKKyAgICAgICAgICAgICAgIGlmIChwQ3VyclNDQ0ItPkhvc3RTdGF0dXMgPT0gMHgwMCkKKworICAgICAgICAgICAgICAgICAgcEN1cnJTQ0NCLT5Ib3N0U3RhdHVzID0gU0NDQl9CTV9FUlI7CisKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKFJEX0hBUlBPT04ocG9ydCtocF9pbnRfc3RhdHVzKSAmIElOVF9FWFRfU1RBVFVTKSAKKworICAgICAgICAgICAgICAgaWYgKFJEX0hBUlBPT04ocG9ydCtocF9leHRfc3RhdHVzKSAmIEJBRF9FWFRfU1RBVFVTKSAKKworICAgICAgICAgICAgICAgICAgaWYgKHBDdXJyU0NDQi0+SG9zdFN0YXR1cyA9PSAweDAwKQorCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBwQ3VyclNDQ0ItPkhvc3RTdGF0dXMgPSBTQ0NCX0JNX0VSUjsKKyNpZiBkZWZpbmVkKEJVR0JVRykKKyAgICAgICAgICAgICAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9kdWFsX2FkZHJfbG8sCisgICAgICAgICAgICAgICAgICAgICAgICBSRF9IQVJQT09OKHBvcnQraHBfZXh0X3N0YXR1cykpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKyAgIGVsc2UgaWYgKHBDdXJyU0NDQi0+U2NjYl9YZmVyQ250KSB7CisKKyAgICAgIGlmIChwQ3VyclNDQ0ItPlNjY2JfWGZlclN0YXRlICYgRl9TR19YRkVSKSB7CisKKworICAgICAgICAgICAgICBXUl9IQVJQT09OKHBvcnQraHBfcGFnZV9jdHJsLCAoUkRfSEFSUE9PTihwb3J0K2hwX3BhZ2VfY3RybCkgJgorICAgICAgICAgICAgflNDQVRURVJfRU4pKTsKKworICAgICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX3NnX2FkZHIsMHgwMCk7CisKKyAgICAgICAgIHNnX3B0ciA9IHBDdXJyU0NDQi0+U2NjYl9zZ3NlZyArIFNHX0JVRl9DTlQ7CisKKyAgICAgICAgIGlmIChzZ19wdHIgPiAoVUlOVCkocEN1cnJTQ0NCLT5EYXRhTGVuZ3RoIC8gU0dfRUxFTUVOVF9TSVpFKSkgeworCisgICAgICAgICAgICBzZ19wdHIgPSAoVUlOVCkocEN1cnJTQ0NCLT5EYXRhTGVuZ3RoIC8gU0dfRUxFTUVOVF9TSVpFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgcmVtYWluX2NudCA9IHBDdXJyU0NDQi0+U2NjYl9YZmVyQ250OworCisgICAgICAgICB3aGlsZSAocmVtYWluX2NudCA8IDB4MDEwMDAwMDBMKSB7CisKKyAgICAgICAgICAgIHNnX3B0ci0tOworCisjaWYgZGVmaW5lZChDT01QSUxFUl8xNl9CSVQpICYmICFkZWZpbmVkKERPUykKKyAgICAgICAgICAgIGlmIChyZW1haW5fY250ID4gKFVMT05HKSgqKCgoVUxPTkcgZmFyICopcEN1cnJTQ0NCLT4KKyAgICAgICAgICAgICAgIERhdGFQb2ludGVyKSArIChzZ19wdHIgKiAyKSkpKSB7CisKKyAgICAgICAgICAgICAgIHJlbWFpbl9jbnQgLT0gKFVMT05HKSgqKCgoVUxPTkcgZmFyICopcEN1cnJTQ0NCLT4KKyAgICAgICAgICAgICAgICAgIERhdGFQb2ludGVyKSArIChzZ19wdHIgKiAyKSkpOworICAgICAgICAgICAgICAgfQorCisjZWxzZQorICAgICAgICAgICAgaWYgKHJlbWFpbl9jbnQgPiAoVUxPTkcpKCooKChVTE9ORyAqKXBDdXJyU0NDQi0+CisgICAgICAgICAgICAgICBEYXRhUG9pbnRlcikgKyAoc2dfcHRyICogMikpKSkgeworCisgICAgICAgICAgICAgICByZW1haW5fY250IC09IChVTE9ORykoKigoKFVMT05HICopcEN1cnJTQ0NCLT4KKyAgICAgICAgICAgICAgICAgIERhdGFQb2ludGVyKSArIChzZ19wdHIgKiAyKSkpOworICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisKKyAgICAgICAgIGlmIChyZW1haW5fY250IDwgMHgwMTAwMDAwMEwpIHsKKworCisgICAgICAgICAgICBwQ3VyclNDQ0ItPlNjY2JfU0dvZmZzZXQgPSByZW1haW5fY250OworCisgICAgICAgICAgICBwQ3VyclNDQ0ItPlNjY2Jfc2dzZWcgPSAoVVNIT1JUKXNnX3B0cjsKKworCisgICAgICAgICAgICBpZiAoKFVMT05HKShzZ19wdHIgKiBTR19FTEVNRU5UX1NJWkUpID09IHBDdXJyU0NDQi0+RGF0YUxlbmd0aCAKKyAgICAgICAgICAgICAgICAmJiAocmVtYWluX2NudCA9PSAwKSkKKworICAgICAgICAgICAgICAgcEN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSB8PSBGX0FMTF9YRkVSUkVEOworICAgICAgICAgICAgfQorCisgICAgICAgICBlbHNlIHsKKworCisgICAgICAgICAgICBpZiAocEN1cnJTQ0NCLT5Ib3N0U3RhdHVzID09IDB4MDApIHsKKworICAgICAgICAgICAgICAgcEN1cnJTQ0NCLT5Ib3N0U3RhdHVzID0gU0NDQl9HUk9TU19GV19FUlI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKworICAgICAgaWYgKCEocEN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSAmIEZfSE9TVF9YRkVSX0RJUikpIHsKKworCisgICAgICAgICBpZiAoUkRfSEFSUE9PTihwb3J0K2hwX2V4dF9zdGF0dXMpICYgQk1fQ01EX0JVU1kpIHsKKworICAgICAgICAgICAgYnVzTXN0clRpbWVPdXQocG9ydCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICBpZiAoUkRfSEFSUE9PTihwb3J0K2hwX2ludF9zdGF0dXMpICYgSU5UX0VYVF9TVEFUVVMpIHsKKworICAgICAgICAgICAgICAgaWYgKFJEX0hBUlBPT04ocG9ydCtocF9leHRfc3RhdHVzKSAmIEJBRF9FWFRfU1RBVFVTKSB7CisKKyAgICAgICAgICAgICAgICAgIGlmIChwQ3VyclNDQ0ItPkhvc3RTdGF0dXMgPT0gMHgwMCkgeworCisgICAgICAgICAgICAgICAgICAgICBwQ3VyclNDQ0ItPkhvc3RTdGF0dXMgPSBTQ0NCX0JNX0VSUjsKKyNpZiBkZWZpbmVkKEJVR0JVRykKKyAgICAgICAgICAgICAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9kdWFsX2FkZHJfbG8sCisgICAgICAgICAgICAgICAgICAgICAgICBSRF9IQVJQT09OKHBvcnQraHBfZXh0X3N0YXR1cykpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgZWxzZSB7CisKKworICAgICAgICAgaWYgKChSRF9IQVJQT09OKHBvcnQraHBfZmlmb19jbnQpKSA+PSBCTV9USFJFU0hPTEQpIHsKKworICAgICAgICAgICAgdGltZW91dCA9IFNIT1JUX1dBSVQ7CisKKyAgICAgICAgICAgIHdoaWxlICgoUkRfSEFSUE9PTihwb3J0K2hwX2V4dF9zdGF0dXMpICYgQk1fQ01EX0JVU1kpICYmCisgICAgICAgICAgICAgICAoKFJEX0hBUlBPT04ocG9ydCtocF9maWZvX2NudCkpID49IEJNX1RIUkVTSE9MRCkgJiYKKyAgICAgICAgICAgICAgIHRpbWVvdXQtLSkge30KKyAgICAgICAgICAgIH0KKworICAgICAgICAgaWYgKFJEX0hBUlBPT04ocG9ydCtocF9leHRfc3RhdHVzKSAmIEJNX0NNRF9CVVNZKSB7CisKKyAgICAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9ibV9jdHJsLCAoUkRfSEFSUE9PTihwb3J0K2hwX2JtX2N0cmwpIHwKKyAgICAgICAgICAgICAgIEZMVVNIX1hGRVJfQ05UUikpOworCisgICAgICAgICAgICB0aW1lb3V0ID0gTE9OR19XQUlUOworCisgICAgICAgICAgICB3aGlsZSAoKFJEX0hBUlBPT04ocG9ydCtocF9leHRfc3RhdHVzKSAmIEJNX0NNRF9CVVNZKSAmJgorICAgICAgICAgICAgICAgdGltZW91dC0tKSB7fQorCisgICAgICAgICAgICBXUl9IQVJQT09OKHBvcnQraHBfYm1fY3RybCwgKFJEX0hBUlBPT04ocG9ydCtocF9ibV9jdHJsKSAmCisgICAgICAgICAgICAgICB+RkxVU0hfWEZFUl9DTlRSKSk7CisKKworICAgICAgICAgICAgaWYgKFJEX0hBUlBPT04ocG9ydCtocF9leHRfc3RhdHVzKSAmIEJNX0NNRF9CVVNZKSB7CisKKyAgICAgICAgICAgICAgIGlmIChwQ3VyclNDQ0ItPkhvc3RTdGF0dXMgPT0gMHgwMCkgeworCisgICAgICAgICAgICAgICAgICBwQ3VyclNDQ0ItPkhvc3RTdGF0dXMgPSBTQ0NCX0JNX0VSUjsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgYnVzTXN0clRpbWVPdXQocG9ydCk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgIGlmIChSRF9IQVJQT09OKHBvcnQraHBfaW50X3N0YXR1cykgJiBJTlRfRVhUX1NUQVRVUykgeworCisgICAgICAgICAgICBpZiAoUkRfSEFSUE9PTihwb3J0K2hwX2V4dF9zdGF0dXMpICYgQkFEX0VYVF9TVEFUVVMpIHsKKworICAgICAgICAgICAgICAgaWYgKHBDdXJyU0NDQi0+SG9zdFN0YXR1cyA9PSAweDAwKSB7CisKKyAgICAgICAgICAgICAgICAgIHBDdXJyU0NDQi0+SG9zdFN0YXR1cyA9IFNDQ0JfQk1fRVJSOworI2lmIGRlZmluZWQoQlVHQlVHKQorICAgICAgICAgICAgICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX2R1YWxfYWRkcl9sbywKKyAgICAgICAgICAgICAgICAgICAgIFJEX0hBUlBPT04ocG9ydCtocF9leHRfc3RhdHVzKSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgfQorCisgICBlbHNlIHsKKworCisgICAgICBpZiAoUkRfSEFSUE9PTihwb3J0K2hwX2V4dF9zdGF0dXMpICYgQk1fQ01EX0JVU1kpIHsKKworICAgICAgICAgdGltZW91dCA9IExPTkdfV0FJVDsKKworICAgICAgICAgd2hpbGUgKChSRF9IQVJQT09OKHBvcnQraHBfZXh0X3N0YXR1cykgJiBCTV9DTURfQlVTWSkgJiYgdGltZW91dC0tKSB7fQorCisgICAgICAgICBpZiAoUkRfSEFSUE9PTihwb3J0K2hwX2V4dF9zdGF0dXMpICYgQk1fQ01EX0JVU1kpIHsKKworICAgICAgICAgICAgaWYgKHBDdXJyU0NDQi0+SG9zdFN0YXR1cyA9PSAweDAwKSB7CisKKyAgICAgICAgICAgICAgIHBDdXJyU0NDQi0+SG9zdFN0YXR1cyA9IFNDQ0JfQk1fRVJSOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBidXNNc3RyVGltZU91dChwb3J0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworCisgICAgICBpZiAoUkRfSEFSUE9PTihwb3J0K2hwX2ludF9zdGF0dXMpICYgSU5UX0VYVF9TVEFUVVMpIHsKKworICAgICAgICAgaWYgKFJEX0hBUlBPT04ocG9ydCtocF9leHRfc3RhdHVzKSAmIEJBRF9FWFRfU1RBVFVTKSB7CisKKyAgICAgICAgICAgIGlmIChwQ3VyclNDQ0ItPkhvc3RTdGF0dXMgPT0gMHgwMCkgeworCisgICAgICAgICAgICAgICBwQ3VyclNDQ0ItPkhvc3RTdGF0dXMgPSBTQ0NCX0JNX0VSUjsKKyNpZiBkZWZpbmVkKEJVR0JVRykKKyAgICAgICAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9kdWFsX2FkZHJfbG8sCisgICAgICAgICAgICAgICAgICBSRF9IQVJQT09OKHBvcnQraHBfZXh0X3N0YXR1cykpOworI2VuZGlmCisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgIH0KKworICAgICAgaWYgKHBDdXJyU0NDQi0+U2NjYl9YZmVyU3RhdGUgJiBGX1NHX1hGRVIpIHsKKworICAgICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX3BhZ2VfY3RybCwgKFJEX0hBUlBPT04ocG9ydCtocF9wYWdlX2N0cmwpICYKKyAgICAgICAgICAgICAgICAgflNDQVRURVJfRU4pKTsKKworICAgICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX3NnX2FkZHIsMHgwMCk7CisKKyAgICAgICAgIHBDdXJyU0NDQi0+U2NjYl9zZ3NlZyArPSBTR19CVUZfQ05UOworCisgICAgICAgICBwQ3VyclNDQ0ItPlNjY2JfU0dvZmZzZXQgPSAweDAwOyAKKworCisgICAgICAgICBpZiAoKFVMT05HKShwQ3VyclNDQ0ItPlNjY2Jfc2dzZWcgKiBTR19FTEVNRU5UX1NJWkUpID49CisgICAgICAgICAgICBwQ3VyclNDQ0ItPkRhdGFMZW5ndGgpIHsKKworICAgICAgICAgICAgcEN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSB8PSBGX0FMTF9YRkVSUkVEOworCisgICAgICAgICAgICBwQ3VyclNDQ0ItPlNjY2Jfc2dzZWcgPSAoVVNIT1JUKShwQ3VyclNDQ0ItPkRhdGFMZW5ndGggLyBTR19FTEVNRU5UX1NJWkUpOworCisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgIGVsc2UgeworCisgICAgICAgICBpZiAoIShwQ3VyclNDQ0ItPlNjY2JfWGZlclN0YXRlICYgRl9BVVRPX1NFTlNFKSkKKworICAgICAgICAgICAgcEN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSB8PSBGX0FMTF9YRkVSUkVEOworICAgICAgICAgfQorICAgICAgfQorCisgICBXUl9IQVJQT09OKHBvcnQraHBfaW50X21hc2ssKElOVF9DTURfQ09NUEwgfCBTQ1NJX0lOVEVSUlVQVCkpOworfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogSG9zdCBEYXRhIFRyYW5zZmVyIFJlc3RhcnQKKyAqCisgKiBEZXNjcmlwdGlvbjogUmVzZXQgdGhlIGF2YWlsYWJsZSBjb3VudCBkdWUgdG8gYSByZXN0b3JlIGRhdGEKKyAqICAgICAgICAgICAgICBwb2ludGVycyBtZXNzYWdlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgaG9zdERhdGFYZmVyUmVzdGFydChQU0NDQiBjdXJyU0NDQikKK3sKKyAgIFVMT05HIGRhdGFfY291bnQ7CisgICBVSU5UICBzZ19pbmRleDsKKyNpZiBkZWZpbmVkKENPTVBJTEVSXzE2X0JJVCkgJiYgIWRlZmluZWQoRE9TKQorICAgVUxPTkcgZmFyICpzZ19wdHI7CisjZWxzZQorICAgVUxPTkcgKnNnX3B0cjsKKyNlbmRpZgorCisgICBpZiAoY3VyclNDQ0ItPlNjY2JfWGZlclN0YXRlICYgRl9TR19YRkVSKSB7CisKKyAgICAgIGN1cnJTQ0NCLT5TY2NiX1hmZXJDbnQgPSAwOworCisgICAgICBzZ19pbmRleCA9IDB4ZmZmZjsgICAgICAgICAvKkluZGV4IGJ5IGxvbmcgd29yZHMgaW50byBzZyBsaXN0LiAqLworICAgICAgZGF0YV9jb3VudCA9IDA7ICAgICAgICAgICAgLypSdW5uaW5nIGNvdW50IG9mIFNHIHhmZXIgY291bnRzLiAqLworCisjaWYgZGVmaW5lZChDT01QSUxFUl8xNl9CSVQpICYmICFkZWZpbmVkKERPUykKKyAgICAgIHNnX3B0ciA9IChVTE9ORyBmYXIgKiljdXJyU0NDQi0+RGF0YVBvaW50ZXI7CisjZWxzZQorICAgICAgc2dfcHRyID0gKFVMT05HICopY3VyclNDQ0ItPkRhdGFQb2ludGVyOworI2VuZGlmCisKKyAgICAgIHdoaWxlIChkYXRhX2NvdW50IDwgY3VyclNDQ0ItPlNjY2JfQVRDKSB7CisKKyAgICAgICAgIHNnX2luZGV4Kys7CisgICAgICAgICBkYXRhX2NvdW50ICs9ICooc2dfcHRyKyhzZ19pbmRleCAqIDIpKTsKKyAgICAgICAgIH0KKworICAgICAgaWYgKGRhdGFfY291bnQgPT0gY3VyclNDQ0ItPlNjY2JfQVRDKSB7CisKKyAgICAgICAgIGN1cnJTQ0NCLT5TY2NiX1NHb2Zmc2V0ID0gMDsKKyAgICAgICAgIHNnX2luZGV4Kys7CisgICAgICAgICB9CisKKyAgICAgIGVsc2UgeworICAgICAgICAgY3VyclNDQ0ItPlNjY2JfU0dvZmZzZXQgPSBkYXRhX2NvdW50IC0gY3VyclNDQ0ItPlNjY2JfQVRDOworICAgICAgICAgfQorCisgICAgICBjdXJyU0NDQi0+U2NjYl9zZ3NlZyA9IChVU0hPUlQpc2dfaW5kZXg7CisgICAgICB9CisKKyAgIGVsc2UgeworICAgICAgY3VyclNDQ0ItPlNjY2JfWGZlckNudCA9IGN1cnJTQ0NCLT5EYXRhTGVuZ3RoIC0gY3VyclNDQ0ItPlNjY2JfQVRDOworICAgICAgfQorfQorI2lkZW50ICIkSWQ6IHNjYW0uYyAxLjE3IDE5OTcvMDMvMjAgMjM6NDk6MzcgbW9oYW4gRXhwICQiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKgorICogICBDb3B5cmlnaHQgMTk5NS0xOTk2IGJ5IE15bGV4IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBib3RoIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbmQgYSBCU0Qtc3R5bGUgY29weXJpZ2h0OyBzZWUgTElDRU5TRS5GbGFzaFBvaW50IGZvciBkZXRhaWxzLgorICoKKyAqICAgJFdvcmtmaWxlOiAgIHNjYW0uYyAgJAorICoKKyAqICAgRGVzY3JpcHRpb246ICBGdW5jdGlvbnMgcmVsYXRpbmcgdG8gaGFuZGxpbmcgb2YgdGhlIFNDQU0gc2VsZWN0aW9uCisgKiAgICAgICAgICAgICAgICAgYW5kIHRoZSBkZXRlcm1pbmF0aW9uIG9mIHRoZSBTQ1NJIElEcyB0byBiZSBhc3NpZ25lZAorICogICAgICAgICAgICAgICAgIHRvIGFsbCBwZXJzcGVjdGl2ZSBTQ1NJIHRhcmdldHMuCisgKgorICogICAkRGF0ZTogMTk5Ny8wMy8yMCAyMzo0OTozNyAkCisgKgorICogICAkUmV2aXNpb246IDEuMTcgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qI2luY2x1ZGUgPGdsb2JhbHMuaD4qLworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKwkvKiNpbmNsdWRlIDxidWRpLmg+Ki8KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzY2NibWdyLmg+Ki8KKy8qI2luY2x1ZGUgPGJseDMwLmg+Ki8KKy8qI2luY2x1ZGUgPHRhcmdldC5oPiovCisvKiNpbmNsdWRlIDxzY3NpMi5oPiovCisvKiNpbmNsdWRlIDxlZXByb20uaD4qLworLyojaW5jbHVkZSA8aGFycG9vbi5oPiovCisKKworCisvKgorZXh0ZXJuIFNDQ0JNR1JfVEFSX0lORk8gc2NjYk1nclRibFtNQVhfQ0FSRFNdW01BWF9TQ1NJX1RBUl07CitleHRlcm4gU0NDQkNBUkQgQkxfQ2FyZFtNQVhfQ0FSRFNdOworZXh0ZXJuIFNDQ0JTQ0FNX0lORk8gc2NhbUluZm9bTUFYX1NDU0lfVEFSXTsKK2V4dGVybiBOVlJBTUlORk8gbnZSYW1JbmZvW01BWF9NQl9DQVJEU107CisjaWYgZGVmaW5lZChET1MpIHx8IGRlZmluZWQoT1MyKQorZXh0ZXJuIFVDSEFSIHRlbXBfaWRfc3RyaW5nW0lEX1NUUklOR19MRU5HVEhdOworI2VuZGlmCitleHRlcm4gVUNIQVIgc2NhbUhBU3RyaW5nW107CisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc2NpbmkKKyAqCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgYWxsIGRhdGEgc3RydWN0dXJlcyBuZWNlc3NhcnkgZm9yIFNDQU0gc2VsZWN0aW9uLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBzY2luaShVQ0hBUiBwX2NhcmQsIFVDSEFSIHBfb3VyX2lkLCBVQ0hBUiBwX3Bvd2VyX3VwKQoreworCisjaWYgZGVmaW5lZChTQ0FNX0xFVl8yKQorICAgVUNIQVIgbG9zZXIsYXNzaWduZWRfaWQ7CisjZW5kaWYKKyNpZiBkZWZpbmVkKERPUykKKworICAgVVNIT1JUIHBfcG9ydDsKKyNlbHNlCisgICBVTE9ORyBwX3BvcnQ7CisjZW5kaWYKKworICAgVUNIQVIgaSxrLFNjYW1GbGcgOworICAgUFNDQ0JjYXJkIGN1cnJDYXJkOworCVBOVlJhbUluZm8gcEN1cnJOdlJhbTsKKworICAgY3VyckNhcmQgPSAmQkxfQ2FyZFtwX2NhcmRdOworICAgcF9wb3J0ID0gY3VyckNhcmQtPmlvUG9ydDsKKwlwQ3Vyck52UmFtID0gY3VyckNhcmQtPnBOdlJhbUluZm87CisKKworCWlmKHBDdXJyTnZSYW0peworCQlTY2FtRmxnID0gcEN1cnJOdlJhbS0+bmlTY2FtQ29uZjsKKwkJaSA9IHBDdXJyTnZSYW0tPm5pU3lzQ29uZjsKKwl9CisJZWxzZXsKKwkgICBTY2FtRmxnID0gKFVDSEFSKSB1dGlsRUVSZWFkKHBfcG9ydCwgU0NBTV9DT05GSUcvMik7CisJICAgaSA9IChVQ0hBUikodXRpbEVFUmVhZChwX3BvcnQsIChTWVNURU1fQ09ORklHLzIpKSk7CisJfQorCWlmKCEoaSAmIDB4MDIpKQkvKiBjaGVjayBpZiByZXNldCBidXMgaW4gQXV0b1NDU0kgcGFyYW1ldGVyIHNldCAqLworCQlyZXR1cm47CisKKyAgIGluaXNjaShwX2NhcmQscF9wb3J0LCBwX291cl9pZCk7CisKKyAgIC8qIEZvcmNlIHRvIHdhaXQgMSBzZWMgYWZ0ZXIgU0NTSSBidXMgcmVzZXQuIFNvbWUgU0NBTSBkZXZpY2UgRlcKKyAgICAgIHRvbyBzbG93IHRvIHJldHVybiB0byBTQ0FNIHNlbGVjdGlvbiAqLworCisgICAvKiBpZiAocF9wb3dlcl91cCkKKyAgICAgICAgIFdhaXQxU2Vjb25kKHBfcG9ydCk7CisgICAgICBlbHNlCisgICAgICAgICBXYWl0KHBfcG9ydCwgVE9fMjUwbXMpOyAqLworCisgICBXYWl0MVNlY29uZChwX3BvcnQpOworCisjaWYgZGVmaW5lZChTQ0FNX0xFVl8yKQorCisgICBpZiAoKFNjYW1GbGcgJiBTQ0FNX0VOQUJMRUQpICYmIChTY2FtRmxnICYgU0NBTV9MRVZFTDIpKQorICAgICAgeworICAgICAgd2hpbGUgKCEoc2NhcmIocF9wb3J0LElOSVRfU0VMVEQpKSkge30KKworICAgICAgc2NzZWwocF9wb3J0KTsKKworICAgICAgZG8geworICAgICAgICAgc2N4ZmVyYyhwX3BvcnQsU1lOQ19QVFJOKTsKKyAgICAgICAgIHNjeGZlcmMocF9wb3J0LERPTV9NU1RSKTsKKyAgICAgICAgIGxvc2VyID0gc2NzZW5kaShwX3BvcnQsJnNjYW1JbmZvW3Bfb3VyX2lkXS5pZF9zdHJpbmdbMF0pOworICAgICAgICAgfSB3aGlsZSAoIGxvc2VyID09IDB4RkYgKTsKKworICAgICAgc2NidXNmKHBfcG9ydCk7CisKKyAgICAgIGlmICgocF9wb3dlcl91cCkgJiYgKCFsb3NlcikpCisgICAgICAgICB7CisgICAgICAgICBzcmVzYihwX3BvcnQscF9jYXJkKTsKKyAgICAgICAgIFdhaXQocF9wb3J0LCBUT18yNTBtcyk7CisKKyAgICAgICAgIHdoaWxlICghKHNjYXJiKHBfcG9ydCxJTklUX1NFTFREKSkpIHt9CisKKyAgICAgICAgIHNjc2VsKHBfcG9ydCk7CisKKyAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHNjeGZlcmMocF9wb3J0LCBTWU5DX1BUUk4pOworICAgICAgICAgICAgc2N4ZmVyYyhwX3BvcnQsIERPTV9NU1RSKTsKKyAgICAgICAgICAgIGxvc2VyID0gc2NzZW5kaShwX3BvcnQsJnNjYW1JbmZvW3Bfb3VyX2lkXS4KKyAgICAgICAgICAgICAgIGlkX3N0cmluZ1swXSk7CisgICAgICAgICAgICB9IHdoaWxlICggbG9zZXIgPT0gMHhGRiApOworCisgICAgICAgICBzY2J1c2YocF9wb3J0KTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgZWxzZQorICAgICAgeworICAgICAgbG9zZXIgPSBGQUxTRTsKKyAgICAgIH0KKworCisgICBpZiAoIWxvc2VyKQorICAgICAgeworCisjZW5kaWYgIC8qIFNDQU1fTEVWXzIgKi8KKworICAgICAgc2NhbUluZm9bcF9vdXJfaWRdLnN0YXRlID0gSURfQVNTSUdORUQ7CisKKworCQlpZiAoU2NhbUZsZyAmIFNDQU1fRU5BQkxFRCkKKwkJeworCisJICAgICAgZm9yIChpPTA7IGkgPCBNQVhfU0NTSV9UQVI7IGkrKykKKyAgCQkgICB7CisgICAgICAJICAgaWYgKChzY2FtSW5mb1tpXS5zdGF0ZSA9PSBJRF9VTkFTU0lHTkVEKSB8fAorICAJICAgICAgCSAgIChzY2FtSW5mb1tpXS5zdGF0ZSA9PSBJRF9VTlVTRUQpKQorCSAgCSAgICAgIHsKKyAgIAkgICAgIAkgICBpZiAoc2NzZWxsKHBfcG9ydCxpKSkKKyAgICAgIAkgIAkgICB7CisgICAgICAgICAgICAJICAgc2NhbUluZm9baV0uc3RhdGUgPSBMRUdBQ1k7CisgIAkgICAgICAgICAgICAJaWYgKChzY2FtSW5mb1tpXS5pZF9zdHJpbmdbMF0gIT0gMHhGRikgfHwKKyAgICAgCSAgICAgICAgICAgIAkoc2NhbUluZm9baV0uaWRfc3RyaW5nWzFdICE9IDB4RkEpKQorCSAgICAgCSAgICAgICAgIHsKKworICAgCSAgICAgICAgCSAgICAgIHNjYW1JbmZvW2ldLmlkX3N0cmluZ1swXSA9IDB4RkY7CisgICAgICAJICAgICAgICAJICAgc2NhbUluZm9baV0uaWRfc3RyaW5nWzFdID0gMHhGQTsKKwkJCQkJCQlpZihwQ3Vyck52UmFtID09IE5VTEwpCisJICAgICAgICAgCSAgICAgICAgIGN1cnJDYXJkLT5nbG9iYWxGbGFncyB8PSBGX1VQREFURV9FRVBST007CisgICAgICAgICAgICAgICAJfQorCSAgCSAgICAgICAgIH0KKyAgIAkgIAkgICB9CisgICAgICAJfQorCisJICAgICAgc3Jlc2IocF9wb3J0LHBfY2FyZCk7CisgICAgICAJV2FpdDFTZWNvbmQocF9wb3J0KTsKKyAgICAgICAgIHdoaWxlICghKHNjYXJiKHBfcG9ydCxJTklUX1NFTFREKSkpIHt9CisgICAgICAgICBzY3NlbChwX3BvcnQpOworICAgICAgICAgc2Nhc2lkKHBfY2FyZCwgcF9wb3J0KTsKKyAgICAgICAgIH0KKworI2lmIGRlZmluZWQoU0NBTV9MRVZfMikKKworICAgICAgfQorCisgICBlbHNlIGlmICgobG9zZXIpICYmIChTY2FtRmxnICYgU0NBTV9FTkFCTEVEKSkKKyAgICAgIHsKKyAgICAgIHNjYW1JbmZvW3Bfb3VyX2lkXS5pZF9zdHJpbmdbMF0gPSBTTFZfVFlQRV9DT0RFMDsKKyAgICAgIGFzc2lnbmVkX2lkID0gRkFMU0U7CisgICAgICBzY3d0c2VsKHBfcG9ydCk7CisKKyAgICAgIGRvIHsKKyAgICAgICAgIHdoaWxlIChzY3hmZXJjKHBfcG9ydCwweDAwKSAhPSBTWU5DX1BUUk4pIHt9CisKKyAgICAgICAgIGkgPSBzY3hmZXJjKHBfcG9ydCwweDAwKTsKKyAgICAgICAgIGlmIChpID09IEFTU0lHTl9JRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghKHNjc2VuZGkocF9wb3J0LCZzY2FtSW5mb1twX291cl9pZF0uaWRfc3RyaW5nWzBdKSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpID0gc2N4ZmVyYyhwX3BvcnQsMHgwMCk7CisgICAgICAgICAgICAgICAgICBpZiAoc2N2YWxxKGkpKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgayA9IHNjeGZlcmMocF9wb3J0LDB4MDApOworCisgICAgICAgICAgICAgICAgICAgICBpZiAoc2N2YWxxKGspKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VyckNhcmQtPm91cklkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVUNIQVIpKGk8PDMpKyhrICYgKFVDSEFSKTcpKSAmIChVQ0hBUikgMHgzRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXNjaShwX2NhcmQsIHBfcG9ydCwgcF9vdXJfaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2NhbUluZm9bY3VyckNhcmQtPm91cklkXS5zdGF0ZSA9IElEX0FTU0lHTkVEOworICAgICAgICAgICAgICAgICAgICAgICAgc2NhbUluZm9bY3VyckNhcmQtPm91cklkXS5pZF9zdHJpbmdbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gU0xWX1RZUEVfQ09ERTA7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZF9pZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgaWYgKGkgPT0gU0VUX1BfRkxBRykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmICghKHNjc2VuZGkocF9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgJnNjYW1JbmZvW3Bfb3VyX2lkXS5pZF9zdHJpbmdbMF0pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW1JbmZvW3Bfb3VyX2lkXS5pZF9zdHJpbmdbMF0gfD0gMHg4MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH13aGlsZSAoIWFzc2lnbmVkX2lkKTsKKworICAgICAgd2hpbGUgKHNjeGZlcmMocF9wb3J0LDB4MDApICE9IENGR19DTVBMVCkge30KKyAgICAgIH0KKworI2VuZGlmICAgLyogU0NBTV9MRVZfMiAqLworICAgaWYgKFNjYW1GbGcgJiBTQ0FNX0VOQUJMRUQpCisgICAgICB7CisgICAgICBzY2J1c2YocF9wb3J0KTsKKyAgICAgIGlmIChjdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgJiBGX1VQREFURV9FRVBST00pCisgICAgICAgICB7CisgICAgICAgICBzY3NhdmRpKHBfY2FyZCwgcF9wb3J0KTsKKyAgICAgICAgIGN1cnJDYXJkLT5nbG9iYWxGbGFncyAmPSB+Rl9VUERBVEVfRUVQUk9NOworICAgICAgICAgfQorICAgICAgfQorCisKKyNpZiBkZWZpbmVkKERPUykKKyAgIGZvciAoaT0wOyBpIDwgTUFYX1NDU0lfVEFSOyBpKyspCisgICB7CisgICAgIAlpZiAoKChTY2FtRmxnICYgU0NBTV9FTkFCTEVEKSAmJiAoc2NhbUluZm9baV0uc3RhdGUgPT0gTEVHQUNZKSkKKwkJCXx8IChpICE9IHBfb3VyX2lkKSkKKyAgICAgICAgCXsKKyAgICAgICAgIHNjc2VsbERPUyhwX3BvcnQsaSk7CisgIAkgICAgICB9CisgIAl9CisjZW5kaWYKKworLyoKKyAgIGZvciAoaT0wLGs9MDsgaSA8IE1BWF9TQ1NJX1RBUjsgaSsrKQorICAgICAgeworICAgICAgaWYgKChzY2FtSW5mb1tpXS5zdGF0ZSA9PSBJRF9BU1NJR05FRCkgfHwKKyAgICAgICAgIChzY2FtSW5mb1tpXS5zdGF0ZSA9PSBMRUdBQ1kpKQorICAgICAgICAgaysrOworICAgICAgfQorCisgICBpZiAoaz09MikKKyAgICAgIGN1cnJDYXJkLT5nbG9iYWxGbGFncyB8PSBGX1NJTkdMRV9ERVZJQ0U7CisgICBlbHNlCisgICAgICBjdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgJj0gfkZfU0lOR0xFX0RFVklDRTsKKyovCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc2NhcmIKKyAqCisgKiBEZXNjcmlwdGlvbjogR2FpbiBjb250cm9sIG9mIHRoZSBidXMgYW5kIHdhaXQgU0NBTSBzZWxlY3QgdGltZSAoMjUwbXMpCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCitpbnQgc2NhcmIoVVNIT1JUIHBfcG9ydCwgVUNIQVIgcF9zZWxfdHlwZSkKKyNlbHNlCitpbnQgc2NhcmIoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX3NlbF90eXBlKQorI2VuZGlmCit7CisgICBpZiAocF9zZWxfdHlwZSA9PSBJTklUX1NFTFREKQorICAgICAgeworCisgICAgICB3aGlsZSAoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZykgJiAoU0NTSV9TRUwgfCBTQ1NJX0JTWSkpIHt9CisKKworICAgICAgaWYgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9TRUwpCisgICAgICAgICByZXR1cm4oRkFMU0UpOworCisgICAgICBpZiAoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaWRhdGFfMCkgIT0gMDApCisgICAgICAgICByZXR1cm4oRkFMU0UpOworCisgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3Npc2lnLCAoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZykgfCBTQ1NJX0JTWSkpOworCisgICAgICBpZiAoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZykgJiBTQ1NJX1NFTCkgeworCisgICAgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3Npc2lnLCAoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZykgJgorICAgICAgICAgICAgflNDU0lfQlNZKSk7CisgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICAgfQorCisKKyAgICAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lzaWcsIChSRF9IQVJQT09OKHBfcG9ydCtocF9zY3Npc2lnKSB8IFNDU0lfU0VMKSk7CisKKyAgICAgIGlmIChSRF9IQVJQT09OKHBfcG9ydCtocF9zY3NpZGF0YV8wKSAhPSAwMCkgeworCisgICAgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3Npc2lnLCAoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZykgJgorICAgICAgICAgICAgfihTQ1NJX0JTWSB8IFNDU0lfU0VMKSkpOworICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9jbGtjdHJsXzAsIChSRF9IQVJQT09OKHBfcG9ydCtocF9jbGtjdHJsXzApCisgICAgICAmIH5BQ1RkZWFzc2VydCkpOworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXJlc2V0LCBTQ0FNX0VOKTsKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lkYXRhXzAsIDB4MDApOworI2lmIGRlZmluZWQoV0lERV9TQ1NJKQorICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaWRhdGFfMSwgMHgwMCk7CisjZW5kaWYKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3BvcnRjdHJsXzAsIFNDU0lfQlVTX0VOKTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lzaWcpIHwgU0NTSV9NU0cpKTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lzaWcpCisgICAgICAmIH5TQ1NJX0JTWSkpOworCisgICBXYWl0KHBfcG9ydCxUT18yNTBtcyk7CisKKyAgIHJldHVybihUUlVFKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzY2J1c2YKKyAqCisgKiBEZXNjcmlwdGlvbjogUmVsZWFzZSB0aGUgU0NTSSBidXMgYW5kIGRpc2FibGUgU0NBTSBzZWxlY3Rpb24uCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCit2b2lkIHNjYnVzZihVU0hPUlQgcF9wb3J0KQorI2Vsc2UKK3ZvaWQgc2NidXNmKFVMT05HIHBfcG9ydCkKKyNlbmRpZgoreworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsLAorICAgICAgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCkgfCBHX0lOVF9ESVNBQkxFKSk7CisKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaWRhdGFfMCwgMHgwMCk7CisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3BvcnRjdHJsXzAsIChSRF9IQVJQT09OKHBfcG9ydCtocF9wb3J0Y3RybF8wKQorICAgICAgJiB+U0NTSV9CVVNfRU4pKTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgMHgwMCk7CisKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXJlc2V0LCAgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lyZXNldCkKKyAgICAgICYgflNDQU1fRU4pKTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfY2xrY3RybF8wLCAoUkRfSEFSUE9PTihwX3BvcnQraHBfY2xrY3RybF8wKQorICAgICAgfCBBQ1RkZWFzc2VydCkpOworCisjaWYgZGVmaW5lZChTQ0FNX0xFVl8yKQorICAgV1JXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSwgKEJVU19GUkVFIHwgQVVUT19JTlQgfCBTQ0FNX1NFTCkpOworI2Vsc2UKKyAgIFdSV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCksIChCVVNfRlJFRSB8IEFVVE9fSU5UKSk7CisjZW5kaWYKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsLAorICAgICAgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCkgJiB+R19JTlRfRElTQUJMRSkpOworfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc2Nhc2lkCisgKgorICogRGVzY3JpcHRpb246IEFzc2lnbiBhbiBJRCB0byBhbGwgdGhlIFNDQU0gZGV2aWNlcy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgc2Nhc2lkKFVDSEFSIHBfY2FyZCwgVVNIT1JUIHBfcG9ydCkKKyNlbHNlCit2b2lkIHNjYXNpZChVQ0hBUiBwX2NhcmQsIFVMT05HIHBfcG9ydCkKKyNlbmRpZgoreworI2lmIGRlZmluZWQoRE9TKSB8fCBkZWZpbmVkKE9TMikKKyAgIC8qIFVzZSBleHRlcm5hbCBkZWZpbmVkIGluIGdsb2JhbCBzcGFjZSBhcmVhLCBpbnN0ZWFkIG9mIFN0YWNrCisgICAgICBzcGFjZS4gV0lOLzk1IERPUyBkb2Vzbm90IHdvcmsgVElOWSBtb2RlLiBUaGUgT1MgZG9lc25vdCBpbnRpYWxpemUKKyAgICAgIFNTIGVxdWFsIHRvIERTLiBUaHVzIHRoZSBhcnJheSBhbGxvY2F0ZWQgb24gc3RhY2sgZG9lc25vdCBnZXQKKyAgICAgIGFjY2VzcyBjb3JyZWN0bHkgKi8KKyNlbHNlCisgICBVQ0hBUiB0ZW1wX2lkX3N0cmluZ1tJRF9TVFJJTkdfTEVOR1RIXTsKKyNlbmRpZgorCisgICBVQ0hBUiBpLGssc2NhbV9pZDsKKwlVQ0hBUiBjcmNCeXRlc1szXTsKKwlQTlZSYW1JbmZvIHBDdXJyTnZSYW07CisJdXNob3J0X3B0ciBwQ3JjQnl0ZXM7CisKKwlwQ3Vyck52UmFtID0gQkxfQ2FyZFtwX2NhcmRdLnBOdlJhbUluZm87CisKKyAgIGk9RkFMU0U7CisKKyAgIHdoaWxlICghaSkKKyAgICAgIHsKKworICAgICAgZm9yIChrPTA7IGsgPCBJRF9TVFJJTkdfTEVOR1RIOyBrKyspCisgICAgICAgICB7CisgICAgICAgICB0ZW1wX2lkX3N0cmluZ1trXSA9IChVQ0hBUikgMHgwMDsKKyAgICAgICAgIH0KKworICAgICAgc2N4ZmVyYyhwX3BvcnQsU1lOQ19QVFJOKTsKKyAgICAgIHNjeGZlcmMocF9wb3J0LEFTU0lHTl9JRCk7CisKKyAgICAgIGlmICghKHNjaXNvKHBfcG9ydCwmdGVtcF9pZF9zdHJpbmdbMF0pKSkKKyAgICAgICAgIHsKKwkJCWlmKHBDdXJyTnZSYW0peworCQkJCXBDcmNCeXRlcyA9ICh1c2hvcnRfcHRyKSZjcmNCeXRlc1swXTsKKwkJCQkqcENyY0J5dGVzID0gQ2FsY0NyYzE2KCZ0ZW1wX2lkX3N0cmluZ1swXSk7CisJCQkJY3JjQnl0ZXNbMl0gPSBDYWxjTHJjKCZ0ZW1wX2lkX3N0cmluZ1swXSk7CisJCQkJdGVtcF9pZF9zdHJpbmdbMV0gPSBjcmNCeXRlc1syXTsKKwkJCQl0ZW1wX2lkX3N0cmluZ1syXSA9IGNyY0J5dGVzWzBdOworCQkJCXRlbXBfaWRfc3RyaW5nWzNdID0gY3JjQnl0ZXNbMV07CisJCQkJZm9yKGsgPSA0OyBrIDwgSURfU1RSSU5HX0xFTkdUSDsgaysrKQorCQkJCQl0ZW1wX2lkX3N0cmluZ1trXSA9IChVQ0hBUikgMHgwMDsKKwkJCX0KKyAgICAgICAgIGkgPSBzY21hY2hpZChwX2NhcmQsdGVtcF9pZF9zdHJpbmcpOworCisgICAgICAgICBpZiAoaSA9PSBDTFJfUFJJT1JJVFkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBzY3hmZXJjKHBfcG9ydCxNSVNDX0NPREUpOworICAgICAgICAgICAgc2N4ZmVyYyhwX3BvcnQsQ0xSX1BfRkxBRyk7CisgICAgICAgICAgICBpID0gRkFMU0U7ICAvKk5vdCB0aGUgbGFzdCBJRCB5ZXQuICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgaWYgKGkgIT0gTk9fSURfQVZBSUwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSA8IDggKQorICAgICAgICAgICAgICAgc2N4ZmVyYyhwX3BvcnQsSURfMF83KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHNjeGZlcmMocF9wb3J0LElEXzhfRik7CisKKyAgICAgICAgICAgIHNjYW1faWQgPSAoaSAmIChVQ0hBUikgMHgwNyk7CisKKworICAgICAgICAgICAgZm9yIChrPTE7IGsgPCAweDA4OyBrIDw8PSAxKQorICAgICAgICAgICAgICAgaWYgKCEoIGsgJiBpICkpCisgICAgICAgICAgICAgICAgICBzY2FtX2lkICs9IDB4MDg7ICAgICAgICAvKkNvdW50IG51bWJlciBvZiB6ZXJvcyBpbiBEQjAtMy4gKi8KKworICAgICAgICAgICAgc2N4ZmVyYyhwX3BvcnQsc2NhbV9pZCk7CisKKyAgICAgICAgICAgIGkgPSBGQUxTRTsgIC8qTm90IHRoZSBsYXN0IElEIHlldC4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgaSA9IFRSVUU7CisgICAgICAgICB9CisKKyAgICAgIH0gIC8qRW5kIHdoaWxlICovCisKKyAgIHNjeGZlcmMocF9wb3J0LFNZTkNfUFRSTik7CisgICBzY3hmZXJjKHBfcG9ydCxDRkdfQ01QTFQpOworfQorCisKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHNjc2VsCisgKgorICogRGVzY3JpcHRpb246IFNlbGVjdCBhbGwgdGhlIFNDQU0gZGV2aWNlcy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgc2NzZWwoVVNIT1JUIHBfcG9ydCkKKyNlbHNlCit2b2lkIHNjc2VsKFVMT05HIHBfcG9ydCkKKyNlbmRpZgoreworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3Npc2lnLCBTQ1NJX1NFTCk7CisgICBzY3dpcm9zKHBfcG9ydCwgU0NTSV9NU0cpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3Npc2lnLCAoU0NTSV9TRUwgfCBTQ1NJX0JTWSkpOworCisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lzaWcsIChTQ1NJX1NFTCB8IFNDU0lfQlNZIHwgU0NTSV9JT0JJVCB8IFNDU0lfQ0QpKTsKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lkYXRhXzAsIChVQ0hBUikoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaWRhdGFfMCkgfAorICAgICAgKFVDSEFSKShCSVQoNykrQklUKDYpKSkpOworCisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lzaWcsIChTQ1NJX0JTWSB8IFNDU0lfSU9CSVQgfCBTQ1NJX0NEKSk7CisgICBzY3dpcm9zKHBfcG9ydCwgU0NTSV9TRUwpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3NpZGF0YV8wLCAoVUNIQVIpKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lkYXRhXzApICYKKyAgICAgIH4oVUNIQVIpQklUKDYpKSk7CisgICBzY3dpcm9kKHBfcG9ydCwgQklUKDYpKTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgKFNDU0lfU0VMIHwgU0NTSV9CU1kgfCBTQ1NJX0lPQklUIHwgU0NTSV9DRCkpOworfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc2N4ZmVyYworICoKKyAqIERlc2NyaXB0aW9uOiBIYW5kc2hha2UgdGhlIHBfZGF0YSAoREI0LTApIGFjcm9zcyB0aGUgYnVzLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoRE9TKQorVUNIQVIgc2N4ZmVyYyhVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2RhdGEpCisjZWxzZQorVUNIQVIgc2N4ZmVyYyhVTE9ORyBwX3BvcnQsIFVDSEFSIHBfZGF0YSkKKyNlbmRpZgoreworICAgVUNIQVIgY3Vycl9kYXRhLCByZXRfZGF0YTsKKworICAgY3Vycl9kYXRhID0gcF9kYXRhIHwgQklUKDcpIHwgQklUKDUpOyAgIC8qU3RhcnQgd2l0aCBEQjcgJiBEQjUgYXNzZXJ0ZWQuICovCisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lkYXRhXzAsIGN1cnJfZGF0YSk7CisKKyAgIGN1cnJfZGF0YSAmPSB+QklUKDcpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3NpZGF0YV8wLCBjdXJyX2RhdGEpOworCisgICBzY3dpcm9kKHBfcG9ydCxCSVQoNykpOyAgICAgICAgICAgICAgLypXYWl0IGZvciBEQjcgdG8gYmUgcmVsZWFzZWQuICovCisJd2hpbGUgKCEoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaWRhdGFfMCkgJiBCSVQoNSkpKTsKKworICAgcmV0X2RhdGEgPSAoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaWRhdGFfMCkgJiAoVUNIQVIpIDB4MUYpOworCisgICBjdXJyX2RhdGEgfD0gQklUKDYpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3NpZGF0YV8wLCBjdXJyX2RhdGEpOworCisgICBjdXJyX2RhdGEgJj0gfkJJVCg1KTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaWRhdGFfMCwgY3Vycl9kYXRhKTsKKworICAgc2N3aXJvZChwX3BvcnQsQklUKDUpKTsgICAgICAgICAgICAgIC8qV2FpdCBmb3IgREI1IHRvIGJlIHJlbGVhc2VkLiAqLworCisgICBjdXJyX2RhdGEgJj0gfihCSVQoNCl8QklUKDMpfEJJVCgyKXxCSVQoMSl8QklUKDApKTsgLypSZWxlYXNlIGRhdGEgYml0cyAqLworICAgY3Vycl9kYXRhIHw9IEJJVCg3KTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaWRhdGFfMCwgY3Vycl9kYXRhKTsKKworICAgY3Vycl9kYXRhICY9IH5CSVQoNik7CisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lkYXRhXzAsIGN1cnJfZGF0YSk7CisKKyAgIHNjd2lyb2QocF9wb3J0LEJJVCg2KSk7ICAgICAgICAgICAgICAvKldhaXQgZm9yIERCNiB0byBiZSByZWxlYXNlZC4gKi8KKworICAgcmV0dXJuKHJldF9kYXRhKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzY3NlbmRpCisgKgorICogRGVzY3JpcHRpb246IFRyYW5zZmVyIG91ciBJZGVudGlmaWNhdGlvbiBzdHJpbmcgdG8gZGV0ZXJtaW5lIGlmIHdlCisgKiAgICAgICAgICAgICAgd2lsbCBiZSB0aGUgZG9taW5hbnQgbWFzdGVyLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoRE9TKQorVUNIQVIgc2NzZW5kaShVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2lkX3N0cmluZ1tdKQorI2Vsc2UKK1VDSEFSIHNjc2VuZGkoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2lkX3N0cmluZ1tdKQorI2VuZGlmCit7CisgICBVQ0hBUiByZXRfZGF0YSxieXRlX2NudCxiaXRfY250LGRlZmVyOworCisgICBkZWZlciA9IEZBTFNFOworCisgICBmb3IgKGJ5dGVfY250ID0gMDsgYnl0ZV9jbnQgPCBJRF9TVFJJTkdfTEVOR1RIOyBieXRlX2NudCsrKSB7CisKKyAgICAgIGZvciAoYml0X2NudCA9IDB4ODA7IGJpdF9jbnQgIT0gMCA7IGJpdF9jbnQgPj49IDEpIHsKKworICAgICAgICAgaWYgKGRlZmVyKQorICAgICAgICAgICAgcmV0X2RhdGEgPSBzY3hmZXJjKHBfcG9ydCwwMCk7CisKKyAgICAgICAgIGVsc2UgaWYgKHBfaWRfc3RyaW5nW2J5dGVfY250XSAmIGJpdF9jbnQpCisKKyAgICAgICAgICAgICAgIHJldF9kYXRhID0gc2N4ZmVyYyhwX3BvcnQsMDIpOworCisgICAgICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgICAgcmV0X2RhdGEgPSBzY3hmZXJjKHBfcG9ydCwwMSk7CisgICAgICAgICAgICAgICBpZiAocmV0X2RhdGEgJiAwMikKKyAgICAgICAgICAgICAgICAgIGRlZmVyID0gVFJVRTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgaWYgKChyZXRfZGF0YSAmIDB4MUMpID09IDB4MTApCisgICAgICAgICAgICByZXR1cm4oMHgwMCk7ICAvKkVuZCBvZiBpc29sYXRpb24gc3RhZ2UsIHdlIHdvbiEgKi8KKworICAgICAgICAgaWYgKHJldF9kYXRhICYgMHgxQykKKyAgICAgICAgICAgIHJldHVybigweEZGKTsKKworICAgICAgICAgaWYgKChkZWZlcikgJiYgKCEocmV0X2RhdGEgJiAweDFGKSkpCisgICAgICAgICAgICByZXR1cm4oMHgwMSk7ICAvKkVuZCBvZiBpc29sYXRpb24gc3RhZ2UsIHdlIGxvc3QuICovCisKKyAgICAgICAgIH0gLypiaXQgbG9vcCAqLworCisgICAgICB9IC8qYnl0ZSBsb29wICovCisKKyAgIGlmIChkZWZlcikKKyAgICAgIHJldHVybigweDAxKTsgIC8qV2UgbG9zdCAqLworICAgZWxzZQorICAgICAgcmV0dXJuKDApOyAgLypXZSBXT04hIFllZWVzc3NzISAqLworfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc2Npc28KKyAqCisgKiBEZXNjcmlwdGlvbjogVHJhbnNmZXIgdGhlIElkZW50aWZpY2F0aW9uIHN0cmluZy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK1VDSEFSIHNjaXNvKFVTSE9SVCBwX3BvcnQsIFVDSEFSIHBfaWRfc3RyaW5nW10pCisjZWxzZQorVUNIQVIgc2Npc28oVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2lkX3N0cmluZ1tdKQorI2VuZGlmCit7CisgICBVQ0hBUiByZXRfZGF0YSx0aGVfZGF0YSxieXRlX2NudCxiaXRfY250OworCisgICB0aGVfZGF0YSA9IDA7CisKKyAgIGZvciAoYnl0ZV9jbnQgPSAwOyBieXRlX2NudCA8IElEX1NUUklOR19MRU5HVEg7IGJ5dGVfY250KyspIHsKKworICAgICAgZm9yIChiaXRfY250ID0gMDsgYml0X2NudCA8IDg7IGJpdF9jbnQrKykgeworCisgICAgICAgICByZXRfZGF0YSA9IHNjeGZlcmMocF9wb3J0LDApOworCisgICAgICAgICBpZiAocmV0X2RhdGEgJiAweEZDKQorICAgICAgICAgICAgcmV0dXJuKDB4RkYpOworCisgICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgdGhlX2RhdGEgPDw9IDE7CisgICAgICAgICAgICBpZiAocmV0X2RhdGEgJiBCSVQoMSkpIHsKKyAgICAgICAgICAgICAgIHRoZV9kYXRhIHw9IDE7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgIGlmICgocmV0X2RhdGEgJiAweDFGKSA9PSAwKQorCSAgIHsKKy8qCisJCQkJaWYoYml0X2NudCAhPSAwIHx8IGJpdF9jbnQgIT0gOCkKKwkJCQl7CisJCQkJCWJ5dGVfY250ID0gMDsKKwkJCQkJYml0X2NudCA9IDA7CisJCQkJCXNjeGZlcmMocF9wb3J0LCBTWU5DX1BUUk4pOworCQkJCQlzY3hmZXJjKHBfcG9ydCwgQVNTSUdOX0lEKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorKi8KKyAgICAgICAgICAgIGlmIChieXRlX2NudCkKKyAgICAgICAgICAgICAgIHJldHVybigweDAwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHJldHVybigweEZGKTsKKwkgICB9CisKKyAgICAgICAgIH0gLypiaXQgbG9vcCAqLworCisgICAgICBwX2lkX3N0cmluZ1tieXRlX2NudF0gPSB0aGVfZGF0YTsKKworICAgICAgfSAvKmJ5dGUgbG9vcCAqLworCisgICByZXR1cm4oMCk7Cit9CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzY3dpcm9kCisgKgorICogRGVzY3JpcHRpb246IFNhbXBsZSB0aGUgU0NTSSBkYXRhIGJ1cyBtYWtpbmcgc3VyZSB0aGUgc2lnbmFsIGhhcyBiZWVuCisgKiAgICAgICAgICAgICAgZGVhc3NlcnRlZCBmb3IgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHNhbXBsZXMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCit2b2lkIHNjd2lyb2QoVVNIT1JUIHBfcG9ydCwgVUNIQVIgcF9kYXRhX2JpdCkKKyNlbHNlCit2b2lkIHNjd2lyb2QoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2RhdGFfYml0KQorI2VuZGlmCit7CisgICBVQ0hBUiBpOworCisgICBpID0gMDsKKyAgIHdoaWxlICggaSA8IE1BWF9TQ1NJX1RBUiApIHsKKworICAgICAgaWYgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lkYXRhXzApICYgcF9kYXRhX2JpdCkKKworICAgICAgICAgaSA9IDA7CisKKyAgICAgIGVsc2UKKworICAgICAgICAgaSsrOworCisgICAgICB9Cit9CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzY3dpcm9zCisgKgorICogRGVzY3JpcHRpb246IFNhbXBsZSB0aGUgU0NTSSBTaWduYWwgbGluZXMgbWFraW5nIHN1cmUgdGhlIHNpZ25hbCBoYXMgYmVlbgorICogICAgICAgICAgICAgIGRlYXNzZXJ0ZWQgZm9yIHRoZSBjb3JyZWN0IG51bWJlciBvZiBjb25zZWN1dGl2ZSBzYW1wbGVzLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoRE9TKQordm9pZCBzY3dpcm9zKFVTSE9SVCBwX3BvcnQsIFVDSEFSIHBfZGF0YV9iaXQpCisjZWxzZQordm9pZCBzY3dpcm9zKFVMT05HIHBfcG9ydCwgVUNIQVIgcF9kYXRhX2JpdCkKKyNlbmRpZgoreworICAgVUNIQVIgaTsKKworICAgaSA9IDA7CisgICB3aGlsZSAoIGkgPCBNQVhfU0NTSV9UQVIgKSB7CisKKyAgICAgIGlmIChSRF9IQVJQT09OKHBfcG9ydCtocF9zY3Npc2lnKSAmIHBfZGF0YV9iaXQpCisKKyAgICAgICAgIGkgPSAwOworCisgICAgICBlbHNlCisKKyAgICAgICAgIGkrKzsKKworICAgICAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHNjdmFscQorICoKKyAqIERlc2NyaXB0aW9uOiBNYWtlIHN1cmUgd2UgcmVjZWl2ZWQgYSB2YWxpZCBkYXRhIGJ5dGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitVQ0hBUiBzY3ZhbHEoVUNIQVIgcF9xdWludGV0KQoreworICAgVUNIQVIgY291bnQ7CisKKyAgIGZvciAoY291bnQ9MTsgY291bnQgPCAweDA4OyBjb3VudDw8PTEpIHsKKyAgICAgIGlmICghKHBfcXVpbnRldCAmIGNvdW50KSkKKyAgICAgICAgIHBfcXVpbnRldCAtPSAweDgwOworICAgICAgfQorCisgICBpZiAocF9xdWludGV0ICYgMHgxOCkKKyAgICAgIHJldHVybihGQUxTRSk7CisKKyAgIGVsc2UKKyAgICAgIHJldHVybihUUlVFKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzY3NlbGwKKyAqCisgKiBEZXNjcmlwdGlvbjogU2VsZWN0IHRoZSBzcGVjaWZpZWQgZGV2aWNlIElEIHVzaW5nIGEgc2VsZWN0aW9uIHRpbWVvdXQKKyAqICAgICAgICAgICAgICBsZXNzIHRoYW4gNG1zLiAgSWYgc29tZWJvZHkgcmVzcG9uZHMgdGhlbiBpdCBpcyBhIGxlZ2FjeQorICogICAgICAgICAgICAgIGRyaXZlIGFuZCB0aGlzIElEIG11c3QgYmUgbWFya2VkIGFzIHN1Y2guCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCitVQ0hBUiBzY3NlbGwoVVNIT1JUIHBfcG9ydCwgVUNIQVIgdGFyZ19pZCkKKyNlbHNlCitVQ0hBUiBzY3NlbGwoVUxPTkcgcF9wb3J0LCBVQ0hBUiB0YXJnX2lkKQorI2VuZGlmCit7CisjaWYgZGVmaW5lZChET1MpCisgICBVU0hPUlQgaTsKKyNlbHNlCisgICBVTE9ORyBpOworI2VuZGlmCisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCwKKyAgICAgIChSRF9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwpIHwgR19JTlRfRElTQUJMRSkpOworCisgICBBUkFNX0FDQ0VTUyhwX3BvcnQpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9hZGRzdGF0LChSRF9IQVJQT09OKHBfcG9ydCtocF9hZGRzdGF0KSB8IFNDQU1fVElNRVIpKTsKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3NlbHRpbWVvdXQsVE9fNG1zKTsKKworCisgICBmb3IgKGkgPSBwX3BvcnQrQ01EX1NUUlQ7IGkgPCBwX3BvcnQrQ01EX1NUUlQrMTI7IGkrPTIpIHsKKyAgICAgIFdSV19IQVJQT09OKGksIChNUE1fT1ArQUNPTU1BTkQpKTsKKyAgICAgIH0KKyAgIFdSV19IQVJQT09OKGksIChCUkhfT1ArQUxXQVlTKyAgICBOUCkpOworCisgICBXUldfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpLAorCSAgICAgICAoUkVTRVQgfCBUSU1FT1VUIHwgU0VMIHwgQlVTX0ZSRUUgfCBBVVRPX0lOVCkpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zZWxlY3RfaWQsIHRhcmdfaWQpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9wb3J0Y3RybF8wLCBTQ1NJX1BPUlQpOworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfYXV0b3N0YXJ0XzMsIChTRUxFQ1QgfCBDTURfT05MWV9TVFJUKSk7CisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3NpY3RybF8wLCAoU0VMX1RBUiB8IEVOQV9SRVNFTCkpOworCisKKyAgIHdoaWxlICghKFJEV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCkpICYKKwkgICAgKFJFU0VUIHwgUFJPR19ITFQgfCBUSU1FT1VUIHwgQVVUT19JTlQpKSkge30KKworICAgaWYgKFJEV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCkpICYgUkVTRVQpCisgICAgICAgICBXYWl0KHBfcG9ydCwgVE9fMjUwbXMpOworCisgICBESVNBQkxFX0FVVE8ocF9wb3J0KTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfYWRkc3RhdCwoUkRfSEFSUE9PTihwX3BvcnQraHBfYWRkc3RhdCkgJiB+U0NBTV9USU1FUikpOworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2VsdGltZW91dCxUT18yOTBtcyk7CisKKyAgIFNHUkFNX0FDQ0VTUyhwX3BvcnQpOworCisgICBpZiAoUkRXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSkgJiAoUkVTRVQgfCBUSU1FT1VUKSApIHsKKworICAgICAgV1JXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSwKKwkJICAoUkVTRVQgfCBUSU1FT1VUIHwgU0VMIHwgQlVTX0ZSRUUgfCBQSEFTRSkpOworCisgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwsCisgICAgICAgICAoUkRfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsKSAmIH5HX0lOVF9ESVNBQkxFKSk7CisKKyAgICAgIHJldHVybihGQUxTRSk7ICAvKk5vIGxlZ2FjeSBkZXZpY2UgKi8KKyAgICAgIH0KKworICAgZWxzZSB7CisKKyAgICAgIHdoaWxlKCEoUkRXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSkgJiBCVVNfRlJFRSkpIHsKKwkJCQlpZiAoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZykgJiBTQ1NJX1JFUSkKKwkJCQkJeworCQkJCQlXUl9IQVJQT09OKHBfcG9ydCtocF9zY3Npc2lnLCAoU0NTSV9BQ0sgKyBTX0lMTF9QSCkpOworICAgICAgCQkJQUNDRVBUX01TRyhwX3BvcnQpOworCQkJCQl9CisJCX0KKworICAgICAgV1JXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSwgQ0xSX0FMTF9JTlRfMSk7CisKKyAgICAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCwKKyAgICAgICAgIChSRF9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwpICYgfkdfSU5UX0RJU0FCTEUpKTsKKworICAgICAgcmV0dXJuKFRSVUUpOyAgLypGb3VuZCBvbmUgb2YgdGhlbSBvbGRpZXMhICovCisgICAgICB9Cit9CisKKyNpZiBkZWZpbmVkKERPUykKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHNjc2VsbCBmb3IgRE9TCisgKgorICogRGVzY3JpcHRpb246IFNlbGVjdCB0aGUgc3BlY2lmaWVkIGRldmljZSBJRCB1c2luZyBhIHNlbGVjdGlvbiB0aW1lb3V0CisgKiAgICAgICAgICAgICAgbGVzcyB0aGFuIDJtcy4gIFRoaXMgd2FzIHNwZWNpYWxseSByZXF1aXJlZCB0byBzb2x2ZQorICogICAgICAgICAgICAgIHRoZSBwcm9ibGVtIHdpdGggUGxleHRvciAxMlggQ0QtUk9NIGRyaXZlLiBUaGlzIGRyaXZlCisgKgkJCQkJIHdhcyByZXNwb25kaW5nIHRoZSBTZWxlY3Rpb24gYXQgdGhlIGVuZCBvZiA0bXMgYW5kIAorICoJCQkJCSBoYW5naW5nIHRoZSBzeXN0ZW0uCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitVQ0hBUiBzY3NlbGxET1MoVVNIT1JUIHBfcG9ydCwgVUNIQVIgdGFyZ19pZCkKK3sKKyAgIFVTSE9SVCBpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwsCisgICAgICAoUkRfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsKSB8IEdfSU5UX0RJU0FCTEUpKTsKKworICAgQVJBTV9BQ0NFU1MocF9wb3J0KTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfYWRkc3RhdCwoUkRfSEFSUE9PTihwX3BvcnQraHBfYWRkc3RhdCkgfCBTQ0FNX1RJTUVSKSk7CisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zZWx0aW1lb3V0LFRPXzJtcyk7CisKKworICAgZm9yIChpID0gcF9wb3J0K0NNRF9TVFJUOyBpIDwgcF9wb3J0K0NNRF9TVFJUKzEyOyBpKz0yKSB7CisgICAgICBXUldfSEFSUE9PTihpLCAoTVBNX09QK0FDT01NQU5EKSk7CisgICAgICB9CisgICBXUldfSEFSUE9PTihpLCAoQlJIX09QK0FMV0FZUysgICAgTlApKTsKKworICAgV1JXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSwKKwkgICAgICAgKFJFU0VUIHwgVElNRU9VVCB8IFNFTCB8IEJVU19GUkVFIHwgQVVUT19JTlQpKTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2VsZWN0X2lkLCB0YXJnX2lkKTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfcG9ydGN0cmxfMCwgU0NTSV9QT1JUKTsKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2F1dG9zdGFydF8zLCAoU0VMRUNUIHwgQ01EX09OTFlfU1RSVCkpOworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaWN0cmxfMCwgKFNFTF9UQVIgfCBFTkFfUkVTRUwpKTsKKworCisgICB3aGlsZSAoIShSRFdfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpKSAmCisJICAgIChSRVNFVCB8IFBST0dfSExUIHwgVElNRU9VVCB8IEFVVE9fSU5UKSkpIHt9CisKKyAgIGlmIChSRFdfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpKSAmIFJFU0VUKQorICAgICAgICAgV2FpdChwX3BvcnQsIFRPXzI1MG1zKTsKKworICAgRElTQUJMRV9BVVRPKHBfcG9ydCk7CisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2FkZHN0YXQsKFJEX0hBUlBPT04ocF9wb3J0K2hwX2FkZHN0YXQpICYgflNDQU1fVElNRVIpKTsKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3NlbHRpbWVvdXQsVE9fMjkwbXMpOworCisgICBTR1JBTV9BQ0NFU1MocF9wb3J0KTsKKworICAgaWYgKFJEV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCkpICYgKFJFU0VUIHwgVElNRU9VVCkgKSB7CisKKyAgICAgIFdSV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCksCisJCSAgKFJFU0VUIHwgVElNRU9VVCB8IFNFTCB8IEJVU19GUkVFIHwgUEhBU0UpKTsKKworICAgICAgV1JfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsLAorICAgICAgICAgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCkgJiB+R19JTlRfRElTQUJMRSkpOworCisgICAgICByZXR1cm4oRkFMU0UpOyAgLypObyBsZWdhY3kgZGV2aWNlICovCisgICAgICB9CisKKyAgIGVsc2UgeworCisgICAgICB3aGlsZSghKFJEV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCkpICYgQlVTX0ZSRUUpKSB7CisJCQkJaWYgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9SRVEpCisJCQkJCXsKKwkJCQkJV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgKFNDU0lfQUNLICsgU19JTExfUEgpKTsKKyAgICAgIAkJCUFDQ0VQVF9NU0cocF9wb3J0KTsKKwkJCQkJfQorCQl9CisKKyAgICAgIFdSV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCksIENMUl9BTExfSU5UXzEpOworCisgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwsCisgICAgICAgICAoUkRfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsKSAmIH5HX0lOVF9ESVNBQkxFKSk7CisKKyAgICAgIHJldHVybihUUlVFKTsgIC8qRm91bmQgb25lIG9mIHRoZW0gb2xkaWVzISAqLworICAgICAgfQorfQorI2VuZGlmICAvKiBET1MgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc2N3dHNlbAorICoKKyAqIERlc2NyaXB0aW9uOiBXYWl0IHRvIGJlIHNlbGVjdGVkIGJ5IGFub3RoZXIgU0NBTSBpbml0aWF0b3IuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCit2b2lkIHNjd3RzZWwoVVNIT1JUIHBfcG9ydCkKKyNlbHNlCit2b2lkIHNjd3RzZWwoVUxPTkcgcF9wb3J0KQorI2VuZGlmCit7CisgICB3aGlsZSghKFJEV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCkpICYgU0NBTV9TRUwpKSB7fQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IGluaXNjaQorICoKKyAqIERlc2NyaXB0aW9uOiBTZXR1cCB0aGUgZGF0YSBTdHJ1Y3R1cmUgd2l0aCB0aGUgaW5mbyBmcm9tIHRoZSBFRVBST00uCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCit2b2lkIGluaXNjaShVQ0hBUiBwX2NhcmQsIFVTSE9SVCBwX3BvcnQsIFVDSEFSIHBfb3VyX2lkKQorI2Vsc2UKK3ZvaWQgaW5pc2NpKFVDSEFSIHBfY2FyZCwgVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX291cl9pZCkKKyNlbmRpZgoreworICAgVUNIQVIgaSxrLG1heF9pZDsKKyAgIFVTSE9SVCBlZV9kYXRhOworCVBOVlJhbUluZm8gcEN1cnJOdlJhbTsKKworCXBDdXJyTnZSYW0gPSBCTF9DYXJkW3BfY2FyZF0ucE52UmFtSW5mbzsKKworICAgaWYgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCkgJiBOQVJST1dfU0NTSV9DQVJEKQorICAgICAgbWF4X2lkID0gMHgwODsKKworICAgZWxzZQorICAgICAgbWF4X2lkID0gMHgxMDsKKworCWlmKHBDdXJyTnZSYW0peworCQlmb3IoaSA9IDA7IGkgPCBtYXhfaWQ7IGkrKyl7CisKKwkJCWZvcihrID0gMDsgayA8IDQ7IGsrKykKKwkJCQlzY2FtSW5mb1tpXS5pZF9zdHJpbmdba10gPSBwQ3Vyck52UmFtLT5uaVNjYW1UYmxbaV1ba107CisJCQlmb3IoayA9IDQ7IGsgPCBJRF9TVFJJTkdfTEVOR1RIOyBrKyspCisJCQkJc2NhbUluZm9baV0uaWRfc3RyaW5nW2tdID0gKFVDSEFSKSAweDAwOworCisJICAgICAgaWYoc2NhbUluZm9baV0uaWRfc3RyaW5nWzBdID09IDB4MDApCisgICAgICAJICAgc2NhbUluZm9baV0uc3RhdGUgPSBJRF9VTlVTRUQ7ICAvKkRlZmF1bHQgdG8gdW51c2VkIElELiAqLworCSAgICAgIGVsc2UKKyAgIAkgICAgICBzY2FtSW5mb1tpXS5zdGF0ZSA9IElEX1VOQVNTSUdORUQ7ICAvKkRlZmF1bHQgdG8gdW5hc3NpZ25lZCBJRC4gKi8KKworCQl9CisJfWVsc2UgeworCSAgIGZvciAoaT0wOyBpIDwgbWF4X2lkOyBpKyspCisgICAJICAgeworICAgICAgCWZvciAoaz0wOyBrIDwgSURfU1RSSU5HX0xFTkdUSDsgays9MikKKwkgICAgICAgICB7CisgICAJICAgICAgZWVfZGF0YSA9IHV0aWxFRVJlYWQocF9wb3J0LCAoVVNIT1JUKSgoRUVfU0NBTUJBU0UvMikgKworICAgICAgCSAgICAgKFVTSE9SVCkgKGkqKChVU0hPUlQpSURfU1RSSU5HX0xFTkdUSC8yKSkgKyAoVVNIT1JUKShrLzIpKSk7CisgICAgICAgICAJc2NhbUluZm9baV0uaWRfc3RyaW5nW2tdID0gKFVDSEFSKSBlZV9kYXRhOworCSAgICAgICAgIGVlX2RhdGEgPj49IDg7CisgICAJICAgICAgc2NhbUluZm9baV0uaWRfc3RyaW5nW2srMV0gPSAoVUNIQVIpIGVlX2RhdGE7CisgICAgICAJICAgfQorCisJICAgICAgaWYgKChzY2FtSW5mb1tpXS5pZF9zdHJpbmdbMF0gPT0gMHgwMCkgfHwKKyAgIAkgICAgICAgKHNjYW1JbmZvW2ldLmlkX3N0cmluZ1swXSA9PSAweEZGKSkKKworICAgICAgCSAgIHNjYW1JbmZvW2ldLnN0YXRlID0gSURfVU5VU0VEOyAgLypEZWZhdWx0IHRvIHVudXNlZCBJRC4gKi8KKworCSAgICAgIGVsc2UKKyAgIAkgICAgICBzY2FtSW5mb1tpXS5zdGF0ZSA9IElEX1VOQVNTSUdORUQ7ICAvKkRlZmF1bHQgdG8gdW5hc3NpZ25lZCBJRC4gKi8KKworICAgICAgCX0KKwl9CisJZm9yKGsgPSAwOyBrIDwgSURfU1RSSU5HX0xFTkdUSDsgaysrKQorCQlzY2FtSW5mb1twX291cl9pZF0uaWRfc3RyaW5nW2tdID0gc2NhbUhBU3RyaW5nW2tdOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHNjbWFjaGlkCisgKgorICogRGVzY3JpcHRpb246IE1hdGNoIHRoZSBEZXZpY2UgSUQgc3RyaW5nIHdpdGggb3VyIHZhbHVlcyBzdG9yZWQgaW4KKyAqICAgICAgICAgICAgICB0aGUgRUVQUk9NLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVUNIQVIgc2NtYWNoaWQoVUNIQVIgcF9jYXJkLCBVQ0hBUiBwX2lkX3N0cmluZ1tdKQoreworCisgICBVQ0hBUiBpLGssbWF0Y2g7CisKKworICAgZm9yIChpPTA7IGkgPCBNQVhfU0NTSV9UQVI7IGkrKykgeworCisjaWYgIWRlZmluZWQoU0NBTV9MRVZfMikKKyAgICAgIGlmIChzY2FtSW5mb1tpXS5zdGF0ZSA9PSBJRF9VTkFTU0lHTkVEKQorICAgICAgICAgeworI2VuZGlmCisgICAgICAgICBtYXRjaCA9IFRSVUU7CisKKyAgICAgICAgIGZvciAoaz0wOyBrIDwgSURfU1RSSU5HX0xFTkdUSDsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKHBfaWRfc3RyaW5nW2tdICE9IHNjYW1JbmZvW2ldLmlkX3N0cmluZ1trXSkKKyAgICAgICAgICAgICAgIG1hdGNoID0gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgIGlmIChtYXRjaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHNjYW1JbmZvW2ldLnN0YXRlID0gSURfQVNTSUdORUQ7CisgICAgICAgICAgICByZXR1cm4oaSk7CisgICAgICAgICAgICB9CisKKyNpZiAhZGVmaW5lZChTQ0FNX0xFVl8yKQorICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgIH0KKworCisKKyAgIGlmIChwX2lkX3N0cmluZ1swXSAmIEJJVCg1KSkKKyAgICAgIGkgPSA4OworICAgZWxzZQorICAgICAgaSA9IE1BWF9TQ1NJX1RBUjsKKworICAgaWYgKCgocF9pZF9zdHJpbmdbMF0gJiAweDA2KSA9PSAweDAyKSB8fCAoKHBfaWRfc3RyaW5nWzBdICYgMHgwNikgPT0gMHgwNCkpCisgICAgICBtYXRjaCA9IHBfaWRfc3RyaW5nWzFdICYgKFVDSEFSKSAweDFGOworICAgZWxzZQorICAgICAgbWF0Y2ggPSA3OworCisgICB3aGlsZSAoaSA+IDApCisgICAgICB7CisgICAgICBpLS07CisKKyAgICAgIGlmIChzY2FtSW5mb1ttYXRjaF0uc3RhdGUgPT0gSURfVU5VU0VEKQorICAgICAgICAgeworICAgICAgICAgZm9yIChrPTA7IGsgPCBJRF9TVFJJTkdfTEVOR1RIOyBrKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICBzY2FtSW5mb1ttYXRjaF0uaWRfc3RyaW5nW2tdID0gcF9pZF9zdHJpbmdba107CisgICAgICAgICAgICB9CisKKyAgICAgICAgIHNjYW1JbmZvW21hdGNoXS5zdGF0ZSA9IElEX0FTU0lHTkVEOworCisJCQlpZihCTF9DYXJkW3BfY2FyZF0ucE52UmFtSW5mbyA9PSBOVUxMKQorCSAgICAgICAgIEJMX0NhcmRbcF9jYXJkXS5nbG9iYWxGbGFncyB8PSBGX1VQREFURV9FRVBST007CisgICAgICAgICByZXR1cm4obWF0Y2gpOworCisgICAgICAgICB9CisKKworICAgICAgbWF0Y2gtLTsKKworICAgICAgaWYgKG1hdGNoID09IDB4RkYpCisJeworICAgICAgICAgaWYgKHBfaWRfc3RyaW5nWzBdICYgQklUKDUpKQorICAgICAgICAgICAgbWF0Y2ggPSA3OworICAgICAgICAgZWxzZQorICAgICAgICAgICAgbWF0Y2ggPSBNQVhfU0NTSV9UQVItMTsKKwl9CisgICAgICB9CisKKworCisgICBpZiAocF9pZF9zdHJpbmdbMF0gJiBCSVQoNykpCisgICAgICB7CisgICAgICByZXR1cm4oQ0xSX1BSSU9SSVRZKTsKKyAgICAgIH0KKworCisgICBpZiAocF9pZF9zdHJpbmdbMF0gJiBCSVQoNSkpCisgICAgICBpID0gODsKKyAgIGVsc2UKKyAgICAgIGkgPSBNQVhfU0NTSV9UQVI7CisKKyAgIGlmICgoKHBfaWRfc3RyaW5nWzBdICYgMHgwNikgPT0gMHgwMikgfHwgKChwX2lkX3N0cmluZ1swXSAmIDB4MDYpID09IDB4MDQpKQorICAgICAgbWF0Y2ggPSBwX2lkX3N0cmluZ1sxXSAmIChVQ0hBUikgMHgxRjsKKyAgIGVsc2UKKyAgICAgIG1hdGNoID0gNzsKKworICAgd2hpbGUgKGkgPiAwKQorICAgICAgeworCisgICAgICBpLS07CisKKyAgICAgIGlmIChzY2FtSW5mb1ttYXRjaF0uc3RhdGUgPT0gSURfVU5BU1NJR05FRCkKKyAgICAgICAgIHsKKyAgICAgICAgIGZvciAoaz0wOyBrIDwgSURfU1RSSU5HX0xFTkdUSDsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgc2NhbUluZm9bbWF0Y2hdLmlkX3N0cmluZ1trXSA9IHBfaWRfc3RyaW5nW2tdOworICAgICAgICAgICAgfQorCisgICAgICAgICBzY2FtSW5mb1ttYXRjaF0uaWRfc3RyaW5nWzBdIHw9IEJJVCg3KTsKKyAgICAgICAgIHNjYW1JbmZvW21hdGNoXS5zdGF0ZSA9IElEX0FTU0lHTkVEOworCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLnBOdlJhbUluZm8gPT0gTlVMTCkKKwkgICAgICAgICBCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgfD0gRl9VUERBVEVfRUVQUk9NOworICAgICAgICAgcmV0dXJuKG1hdGNoKTsKKworICAgICAgICAgfQorCisKKyAgICAgIG1hdGNoLS07CisKKyAgICAgIGlmIChtYXRjaCA9PSAweEZGKQorCXsKKyAgICAgICAgIGlmIChwX2lkX3N0cmluZ1swXSAmIEJJVCg1KSkKKyAgICAgICAgICAgIG1hdGNoID0gNzsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1hdGNoID0gTUFYX1NDU0lfVEFSLTE7CisJfQorICAgICAgfQorCisgICByZXR1cm4oTk9fSURfQVZBSUwpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHNjc2F2ZGkKKyAqCisgKiBEZXNjcmlwdGlvbjogU2F2ZSBvZmYgdGhlIGRldmljZSBTQ0FNIElEIHN0cmluZ3MuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCit2b2lkIHNjc2F2ZGkoVUNIQVIgcF9jYXJkLCBVU0hPUlQgcF9wb3J0KQorI2Vsc2UKK3ZvaWQgc2NzYXZkaShVQ0hBUiBwX2NhcmQsIFVMT05HIHBfcG9ydCkKKyNlbmRpZgoreworICAgVUNIQVIgaSxrLG1heF9pZDsKKyAgIFVTSE9SVCBlZV9kYXRhLHN1bV9kYXRhOworCisKKyAgIHN1bV9kYXRhID0gMHgwMDAwOworCisgICBmb3IgKGkgPSAxOyBpIDwgRUVfU0NBTUJBU0UvMjsgaSsrKQorICAgICAgeworICAgICAgc3VtX2RhdGEgKz0gdXRpbEVFUmVhZChwX3BvcnQsIGkpOworICAgICAgfQorCisKKyAgIHV0aWxFRVdyaXRlT25PZmYocF9wb3J0LDEpOyAgIC8qIEVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gdGhlIEVFUFJPTSAqLworCisgICBpZiAoUkRfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsKSAmIE5BUlJPV19TQ1NJX0NBUkQpCisgICAgICBtYXhfaWQgPSAweDA4OworCisgICBlbHNlCisgICAgICBtYXhfaWQgPSAweDEwOworCisgICBmb3IgKGk9MDsgaSA8IG1heF9pZDsgaSsrKQorICAgICAgeworCisgICAgICBmb3IgKGs9MDsgayA8IElEX1NUUklOR19MRU5HVEg7IGsrPTIpCisgICAgICAgICB7CisgICAgICAgICBlZV9kYXRhID0gc2NhbUluZm9baV0uaWRfc3RyaW5nW2srMV07CisgICAgICAgICBlZV9kYXRhIDw8PSA4OworICAgICAgICAgZWVfZGF0YSB8PSBzY2FtSW5mb1tpXS5pZF9zdHJpbmdba107CisgICAgICAgICBzdW1fZGF0YSArPSBlZV9kYXRhOworICAgICAgICAgdXRpbEVFV3JpdGUocF9wb3J0LCBlZV9kYXRhLCAoVVNIT1JUKSgoRUVfU0NBTUJBU0UvMikgKworICAgICAgICAgICAgKFVTSE9SVCkoaSooKFVTSE9SVClJRF9TVFJJTkdfTEVOR1RILzIpKSArIChVU0hPUlQpKGsvMikpKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworCisgICB1dGlsRUVXcml0ZShwX3BvcnQsIHN1bV9kYXRhLCBFRVBST01fQ0hFQ0tfU1VNLzIpOworICAgdXRpbEVFV3JpdGVPbk9mZihwX3BvcnQsMCk7ICAgLyogVHVybiBvZmYgd3JpdGUgYWNjZXNzICovCit9CisjaWRlbnQgIiRJZDogZGlhZ25vc2UuYyAxLjEwIDE5OTcvMDYvMTAgMTY6NTE6NDcgbW9oYW4gRXhwICQiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKgorICogICBDb3B5cmlnaHQgMTk5NS0xOTk2IGJ5IE15bGV4IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBib3RoIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbmQgYSBCU0Qtc3R5bGUgY29weXJpZ2h0OyBzZWUgTElDRU5TRS5GbGFzaFBvaW50IGZvciBkZXRhaWxzLgorICoKKyAqICAgJFdvcmtmaWxlOiAgIGRpYWdub3NlLmMgICQKKyAqCisgKiAgIERlc2NyaXB0aW9uOiAgRGlhZ25vc3RpYyBmdW50aW9ucyBmb3IgdGVzdGluZyB0aGUgaW50ZWdyaXR5IG9mCisgKiAgICAgICAgICAgICAgICAgdGhlIEhBUlBPT04uCisgKgorICogICAkRGF0ZTogMTk5Ny8wNi8xMCAxNjo1MTo0NyAkCisgKgorICogICAkUmV2aXNpb246IDEuMTAgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qI2luY2x1ZGUgPGdsb2JhbHMuaD4qLworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKwkvKiNpbmNsdWRlIDxidWRpLmg+Ki8KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzY2NibWdyLmg+Ki8KKy8qI2luY2x1ZGUgPGJseDMwLmg+Ki8KKy8qI2luY2x1ZGUgPHRhcmdldC5oPiovCisvKiNpbmNsdWRlIDxlZXByb20uaD4qLworLyojaW5jbHVkZSA8aGFycG9vbi5oPiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFhib3dJbml0CisgKgorICogRGVzY3JpcHRpb246IFNldHVwIHRoZSBYYm93IGZvciBub3JtYWwgb3BlcmF0aW9uLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoRE9TKQordm9pZCBYYm93SW5pdChVU0hPUlQgcG9ydCwgVUNIQVIgU2NhbUZsZykKKyNlbHNlCit2b2lkIFhib3dJbml0KFVMT05HIHBvcnQsIFVDSEFSIFNjYW1GbGcpCisjZW5kaWYKK3sKK1VDSEFSIGk7CisKKwlpID0gUkRfSEFSUE9PTihwb3J0K2hwX3BhZ2VfY3RybCk7CisJV1JfSEFSUE9PTihwb3J0K2hwX3BhZ2VfY3RybCwgKFVDSEFSKSAoaSB8IEdfSU5UX0RJU0FCTEUpKTsKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX3Njc2lyZXNldCwweDAwKTsKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9wb3J0Y3RybF8xLEhPU1RfTU9ERTgpOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfc2NzaXJlc2V0LChETUFfUkVTRVQgfCBIUFNDU0lfUkVTRVQgfCBQUk9HX1JFU0VUIHwgXAorCQkJCSBGSUZPX0NMUikpOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfc2NzaXJlc2V0LFNDU0lfSU5JKTsKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX2Nsa2N0cmxfMCxDTEtDVFJMX0RFRkFVTFQpOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfc2NzaXNpZywweDAwKTsgICAgICAgICAvKiAgQ2xlYXIgYW55IHNpZ25hbHMgd2UgbWlnaHQgKi8KKyAgIFdSX0hBUlBPT04ocG9ydCtocF9zY3NpY3RybF8wLEVOQV9TQ0FNX1NFTCk7CisKKyAgIFdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBDTFJfQUxMX0lOVCk7CisKKyNpZiBkZWZpbmVkKFNDQU1fTEVWXzIpCisgICBkZWZhdWx0X2ludGVuYSA9IFJFU0VUIHwgUlNFTCB8IFBST0dfSExUIHwgVElNRU9VVCB8CisJCSAgICBCVVNfRlJFRSB8IFhGRVJfQ05UXzAgfCBBVVRPX0lOVDsKKworICAgaWYgKChTY2FtRmxnICYgU0NBTV9FTkFCTEVEKSAmJiAoU2NhbUZsZyAmIFNDQU1fTEVWRUwyKSkKKwkJZGVmYXVsdF9pbnRlbmEgfD0gU0NBTV9TRUw7CisKKyNlbHNlCisgICBkZWZhdWx0X2ludGVuYSA9IFJFU0VUIHwgUlNFTCB8IFBST0dfSExUIHwgVElNRU9VVCB8CisJCSAgICBCVVNfRlJFRSB8IFhGRVJfQ05UXzAgfCBBVVRPX0lOVDsKKyNlbmRpZgorICAgV1JXX0hBUlBPT04oKHBvcnQraHBfaW50ZW5hKSwgZGVmYXVsdF9pbnRlbmEpOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfc2VsdGltZW91dCxUT18yOTBtcyk7CisKKyAgIC8qIFR1cm4gb24gU0NTSV9NT0RFOCBmb3IgbmFycm93IGNhcmRzIHRvIGZpeCB0aGUKKyAgICAgIHN0cmFwcGluZyBpc3N1ZSB3aXRoIHRoZSBEVUFMIENIQU5ORUwgY2FyZCAqLworICAgaWYgKFJEX0hBUlBPT04ocG9ydCtocF9wYWdlX2N0cmwpICYgTkFSUk9XX1NDU0lfQ0FSRCkKKyAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9hZGRzdGF0LFNDU0lfTU9ERTgpOworCisjaWYgZGVmaW5lZChOT19CSU9TX09QVElPTikKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzAsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzEsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzIsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzMsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzQsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzUsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzYsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzcsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzgsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzksTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzEwLE5BUlJPV19TQ1NJKTsKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9zeW5jdGFyZ18xMSxOQVJST1dfU0NTSSk7CisgICBXUl9IQVJQT09OKHBvcnQraHBfc3luY3RhcmdfMTIsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzEzLE5BUlJPV19TQ1NJKTsKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9zeW5jdGFyZ18xNCxOQVJST1dfU0NTSSk7CisgICBXUl9IQVJQT09OKHBvcnQraHBfc3luY3RhcmdfMTUsTkFSUk9XX1NDU0kpOworCisjZW5kaWYKKwlXUl9IQVJQT09OKHBvcnQraHBfcGFnZV9jdHJsLCBpKTsKKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IEJ1c01hc3RlckluaXQKKyAqCisgKiBEZXNjcmlwdGlvbjogSW5pdGlhbGl6ZSB0aGUgQnVzTWFzdGVyIGZvciBub3JtYWwgb3BlcmF0aW9ucy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgQnVzTWFzdGVySW5pdChVU0hPUlQgcF9wb3J0KQorI2Vsc2UKK3ZvaWQgQnVzTWFzdGVySW5pdChVTE9ORyBwX3BvcnQpCisjZW5kaWYKK3sKKworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zeXNfY3RybCwgRFJWUl9SU1QpOworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc3lzX2N0cmwsIDB4MDApOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9ob3N0X2Jsa19jbnQsIFhGRVJfQkxLNjQpOworCisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2JtX2N0cmwsIChCTUNUUkxfREVGQVVMVCkpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCAoU0NTSV9URVJNX0VOQV9IKSk7CisKKworI2lmIGRlZmluZWQoTlQpCisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3BjaV9jbWRfY2ZnLCAoUkRfSEFSUE9PTihwX3BvcnQraHBfcGNpX2NtZF9jZmcpCisgICAgICAmIH5NRU1fU1BBQ0VfRU5BKSk7CisKKyNlbmRpZgorCisgICBSRF9IQVJQT09OKHBfcG9ydCtocF9pbnRfc3RhdHVzKTsgICAgICAgIC8qQ2xlYXIgaW50ZXJydXB0cy4gKi8KKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2ludF9tYXNrLCAoSU5UX0NNRF9DT01QTCB8IFNDU0lfSU5URVJSVVBUKSk7CisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwsIChSRF9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwpICYKKyAgICAgIH5TQ0FUVEVSX0VOKSk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogRGlhZ1hib3cKKyAqCisgKiBEZXNjcmlwdGlvbjogVGVzdCBYYm93IGludGVncml0eS4gIE5vbi16ZXJvIHJldHVybiBpbmRpY2F0ZXMgYW4gZXJyb3IuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCitpbnQgRGlhZ1hib3coVVNIT1JUIHBvcnQpCisjZWxzZQoraW50IERpYWdYYm93KFVMT05HIHBvcnQpCisjZW5kaWYKK3sKKyAgIHVuc2lnbmVkIGNoYXIgZmlmb19jbnQsbG9vcF9jbnQ7CisKKyAgIHVuc2lnbmVkIGNoYXIgZmlmb2RhdGFbNV07CisgICBmaWZvZGF0YVswXSA9IDB4MDA7CisgICBmaWZvZGF0YVsxXSA9IDB4RkY7CisgICBmaWZvZGF0YVsyXSA9IDB4NTU7CisgICBmaWZvZGF0YVszXSA9IDB4QUE7CisgICBmaWZvZGF0YVs0XSA9IDB4MDA7CisKKworICAgV1JXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCksIENMUl9BTExfSU5UKTsKKyAgIFdSV19IQVJQT09OKChwb3J0K2hwX2ludGVuYSksIDB4MDAwMCk7CisKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9zZWx0aW1lb3V0LFRPXzVtcyk7CisKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9wb3J0Y3RybF8wLFNUQVJUX1RPKTsKKworCisgICBmb3IoZmlmb2RhdGFbNF0gPSAweDAxOyBmaWZvZGF0YVs0XSAhPSAoVUNIQVIpIDA7IGZpZm9kYXRhWzRdID0gZmlmb2RhdGFbNF0gPDwgMSkgeworCisgICAgICBXUl9IQVJQT09OKHBvcnQraHBfc2VsZmlkXzAsZmlmb2RhdGFbNF0pOworICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX3NlbGZpZF8xLGZpZm9kYXRhWzRdKTsKKworICAgICAgaWYgKChSRF9IQVJQT09OKHBvcnQraHBfc2VsZmlkXzApICE9IGZpZm9kYXRhWzRdKSB8fAorICAgICAgICAgIChSRF9IQVJQT09OKHBvcnQraHBfc2VsZmlkXzEpICE9IGZpZm9kYXRhWzRdKSkKKyAgICAgICAgIHJldHVybigxKTsKKyAgICAgIH0KKworCisgICBmb3IobG9vcF9jbnQgPSAwOyBsb29wX2NudCA8IDQ7IGxvb3BfY250KyspIHsKKworICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX3BvcnRjdHJsXzAsKEhPU1RfUE9SVCB8IEhPU1RfV1JUIHwgU1RBUlRfVE8pKTsKKworCisgICAgICBmb3IgKGZpZm9fY250ID0gMDsgZmlmb19jbnQgPCBGSUZPX0xFTjsgZmlmb19jbnQrKykgeworCisgICAgICAgICBXUl9IQVJQT09OKHBvcnQraHBfZmlmb2RhdGFfMCwgZmlmb2RhdGFbbG9vcF9jbnRdKTsKKyAgICAgICAgIH0KKworCisgICAgICBpZiAoIShSRF9IQVJQT09OKHBvcnQraHBfeGZlcnN0YXQpICYgRklGT19GVUxMKSkKKyAgICAgICAgIHJldHVybigxKTsKKworCisgICAgICBXUl9IQVJQT09OKHBvcnQraHBfcG9ydGN0cmxfMCwoSE9TVF9QT1JUIHwgU1RBUlRfVE8pKTsKKworICAgICAgZm9yIChmaWZvX2NudCA9IDA7IGZpZm9fY250IDwgRklGT19MRU47IGZpZm9fY250KyspIHsKKworICAgICAgICAgaWYgKFJEX0hBUlBPT04ocG9ydCtocF9maWZvZGF0YV8wKSAhPSBmaWZvZGF0YVtsb29wX2NudF0pCisgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgICB9CisKKworICAgICAgaWYgKCEoUkRfSEFSUE9PTihwb3J0K2hwX3hmZXJzdGF0KSAmIEZJRk9fRU1QVFkpKQorICAgICAgICAgcmV0dXJuKDEpOworICAgICAgfQorCisKKyAgIHdoaWxlKCEoUkRXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCkpICYgVElNRU9VVCkpIHt9CisKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX3NlbHRpbWVvdXQsVE9fMjkwbXMpOworCisgICBXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgQ0xSX0FMTF9JTlQpOworCisgICBXUldfSEFSUE9PTigocG9ydCtocF9pbnRlbmEpLCBkZWZhdWx0X2ludGVuYSk7CisKKyAgIHJldHVybigwKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBEaWFnQnVzTWFzdGVyCisgKgorICogRGVzY3JpcHRpb246IFRlc3QgQnVzTWFzdGVyIGludGVncml0eS4gIE5vbi16ZXJvIHJldHVybiBpbmRpY2F0ZXMgYW4KKyAqICAgICAgICAgICAgICBlcnJvci4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK2ludCBEaWFnQnVzTWFzdGVyKFVTSE9SVCBwb3J0KQorI2Vsc2UKK2ludCBEaWFnQnVzTWFzdGVyKFVMT05HIHBvcnQpCisjZW5kaWYKK3sKKyAgIFVDSEFSIHRlc3RkYXRhOworCisgICBmb3IodGVzdGRhdGEgPSAoVUNIQVIpIDE7IHRlc3RkYXRhICE9IChVQ0hBUikwOyB0ZXN0ZGF0YSA9IHRlc3RkYXRhIDw8IDEpIHsKKworICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX3hmZXJfY250X2xvLHRlc3RkYXRhKTsKKyAgICAgIFdSX0hBUlBPT04ocG9ydCtocF94ZmVyX2NudF9taSx0ZXN0ZGF0YSk7CisgICAgICBXUl9IQVJQT09OKHBvcnQraHBfeGZlcl9jbnRfaGksdGVzdGRhdGEpOworICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX2hvc3RfYWRkcl9sbyx0ZXN0ZGF0YSk7CisgICAgICBXUl9IQVJQT09OKHBvcnQraHBfaG9zdF9hZGRyX2xtaSx0ZXN0ZGF0YSk7CisgICAgICBXUl9IQVJQT09OKHBvcnQraHBfaG9zdF9hZGRyX2htaSx0ZXN0ZGF0YSk7CisgICAgICBXUl9IQVJQT09OKHBvcnQraHBfaG9zdF9hZGRyX2hpLHRlc3RkYXRhKTsKKworICAgICAgaWYgKChSRF9IQVJQT09OKHBvcnQraHBfeGZlcl9jbnRfbG8pICE9IHRlc3RkYXRhKSAgIHx8CisgICAgICAgICAgKFJEX0hBUlBPT04ocG9ydCtocF94ZmVyX2NudF9taSkgIT0gdGVzdGRhdGEpICAgfHwKKyAgICAgICAgICAoUkRfSEFSUE9PTihwb3J0K2hwX3hmZXJfY250X2hpKSAhPSB0ZXN0ZGF0YSkgICB8fAorICAgICAgICAgIChSRF9IQVJQT09OKHBvcnQraHBfaG9zdF9hZGRyX2xvKSAhPSB0ZXN0ZGF0YSkgIHx8CisgICAgICAgICAgKFJEX0hBUlBPT04ocG9ydCtocF9ob3N0X2FkZHJfbG1pKSAhPSB0ZXN0ZGF0YSkgfHwKKyAgICAgICAgICAoUkRfSEFSUE9PTihwb3J0K2hwX2hvc3RfYWRkcl9obWkpICE9IHRlc3RkYXRhKSB8fAorICAgICAgICAgIChSRF9IQVJQT09OKHBvcnQraHBfaG9zdF9hZGRyX2hpKSAhPSB0ZXN0ZGF0YSkpCisKKyAgICAgICAgIHJldHVybigxKTsKKyAgICAgIH0KKyAgIFJEX0hBUlBPT04ocG9ydCtocF9pbnRfc3RhdHVzKTsgICAgICAgIC8qQ2xlYXIgaW50ZXJydXB0cy4gKi8KKyAgIHJldHVybigwKTsKK30KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IERpYWdFRVBST00KKyAqCisgKiBEZXNjcmlwdGlvbjogVmVyZml5IGNoZWNrc3VtIGFuZCAnS2V5JyBhbmQgaW5pdGlhbGl6ZSB0aGUgRUVQUk9NIGlmCisgKiAgICAgICAgICAgICAgbmVjZXNzYXJ5LgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoRE9TKQordm9pZCBEaWFnRUVQUk9NKFVTSE9SVCBwX3BvcnQpCisjZWxzZQordm9pZCBEaWFnRUVQUk9NKFVMT05HIHBfcG9ydCkKKyNlbmRpZgorCit7CisgICBVU0hPUlQgaW5kZXgsdGVtcCxtYXhfd2RfY250OworCisgICBpZiAoUkRfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsKSAmIE5BUlJPV19TQ1NJX0NBUkQpCisgICAgICBtYXhfd2RfY250ID0gRUVQUk9NX1dEX0NOVDsKKyAgIGVsc2UKKyAgICAgIG1heF93ZF9jbnQgPSBFRVBST01fV0RfQ05UICogMjsKKworICAgdGVtcCA9IHV0aWxFRVJlYWQocF9wb3J0LCBGV19TSUdOQVRVUkUvMik7CisKKyAgIGlmICh0ZW1wID09IDB4NDY0MSkgeworCisgICAgICBmb3IgKGluZGV4ID0gMjsgaW5kZXggPCBtYXhfd2RfY250OyBpbmRleCsrKSB7CisKKyAgICAgICAgIHRlbXAgKz0gdXRpbEVFUmVhZChwX3BvcnQsIGluZGV4KTsKKworICAgICAgICAgfQorCisgICAgICBpZiAodGVtcCA9PSB1dGlsRUVSZWFkKHBfcG9ydCwgRUVQUk9NX0NIRUNLX1NVTS8yKSkgeworCisgICAgICAgICByZXR1cm47ICAgICAgICAgIC8qRUVQUk9NIGlzIE9rYXkgc28gcmV0dXJuIG5vdyEgKi8KKyAgICAgICAgIH0KKyAgICAgIH0KKworCisgICB1dGlsRUVXcml0ZU9uT2ZmKHBfcG9ydCwoVUNIQVIpMSk7CisKKyAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1heF93ZF9jbnQ7IGluZGV4KyspIHsKKworICAgICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDAwMDAsIGluZGV4KTsKKyAgICAgIH0KKworICAgdGVtcCA9IDA7CisKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHg0NjQxLCBGV19TSUdOQVRVUkUvMik7CisgICB0ZW1wICs9IDB4NDY0MTsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHgzOTIwLCBNT0RFTF9OVU1CXzAvMik7CisgICB0ZW1wICs9IDB4MzkyMDsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHgzMDMzLCBNT0RFTF9OVU1CXzIvMik7CisgICB0ZW1wICs9IDB4MzAzMzsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHgyMDIwLCBNT0RFTF9OVU1CXzQvMik7CisgICB0ZW1wICs9IDB4MjAyMDsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHg3MEQzLCBTWVNURU1fQ09ORklHLzIpOworICAgdGVtcCArPSAweDcwRDM7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4MDAxMCwgQklPU19DT05GSUcvMik7CisgICB0ZW1wICs9IDB4MDAxMDsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHgwMDAzLCBTQ0FNX0NPTkZJRy8yKTsKKyAgIHRlbXAgKz0gMHgwMDAzOworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDAwMDcsIEFEQVBURVJfU0NTSV9JRC8yKTsKKyAgIHRlbXAgKz0gMHgwMDA3OworCisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4MDAwMCwgSUdOT1JFX0JfU0NBTi8yKTsKKyAgIHRlbXAgKz0gMHgwMDAwOworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDAwMDAsIFNFTkRfU1RBUlRfRU5BLzIpOworICAgdGVtcCArPSAweDAwMDA7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4MDAwMCwgREVWSUNFX0VOQUJMRS8yKTsKKyAgIHRlbXAgKz0gMHgwMDAwOworCisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NDI0MiwgU1lOQ19SQVRFX1RCTDAxLzIpOworICAgdGVtcCArPSAweDQyNDI7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NDI0MiwgU1lOQ19SQVRFX1RCTDIzLzIpOworICAgdGVtcCArPSAweDQyNDI7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NDI0MiwgU1lOQ19SQVRFX1RCTDQ1LzIpOworICAgdGVtcCArPSAweDQyNDI7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NDI0MiwgU1lOQ19SQVRFX1RCTDY3LzIpOworICAgdGVtcCArPSAweDQyNDI7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NDI0MiwgU1lOQ19SQVRFX1RCTDg5LzIpOworICAgdGVtcCArPSAweDQyNDI7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NDI0MiwgU1lOQ19SQVRFX1RCTGFiLzIpOworICAgdGVtcCArPSAweDQyNDI7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NDI0MiwgU1lOQ19SQVRFX1RCTGNkLzIpOworICAgdGVtcCArPSAweDQyNDI7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NDI0MiwgU1lOQ19SQVRFX1RCTGVmLzIpOworICAgdGVtcCArPSAweDQyNDI7CisKKworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDZDNDYsIDY0LzIpOyAgLypQUk9EVUNUIElEICovCisgICB0ZW1wICs9IDB4NkM0NjsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHg3MzYxLCA2Ni8yKTsgIC8qIEZsYXNoUG9pbnQgTFQgICAqLworICAgdGVtcCArPSAweDczNjE7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NTA2OCwgNjgvMik7CisgICB0ZW1wICs9IDB4NTA2ODsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHg2OTZGLCA3MC8yKTsKKyAgIHRlbXAgKz0gMHg2OTZGOworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDc0NkUsIDcyLzIpOworICAgdGVtcCArPSAweDc0NkU7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NEMyMCwgNzQvMik7CisgICB0ZW1wICs9IDB4NEMyMDsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHgyMDU0LCA3Ni8yKTsKKyAgIHRlbXAgKz0gMHgyMDU0OworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDIwMjAsIDc4LzIpOworICAgdGVtcCArPSAweDIwMjA7CisKKyAgIGluZGV4ID0gKChFRV9TQ0FNQkFTRS8yKSsoNyoxNikpOworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAoMHgwNzAwK1RZUEVfQ09ERTApLCBpbmRleCk7CisgICB0ZW1wICs9ICgweDA3MDArVFlQRV9DT0RFMCk7CisgICBpbmRleCsrOworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDU1NDIsIGluZGV4KTsgICAgICAgICAgICAvKlZlbmRvciBJRCBjb2RlICovCisgICB0ZW1wICs9IDB4NTU0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJVU0xPR0lDICAgICAgKi8KKyAgIGluZGV4Kys7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NEM1MywgaW5kZXgpOworICAgdGVtcCArPSAweDRDNTM7CisgICBpbmRleCsrOworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDQ3NEYsIGluZGV4KTsKKyAgIHRlbXAgKz0gMHg0NzRGOworICAgaW5kZXgrKzsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHg0MzQ5LCBpbmRleCk7CisgICB0ZW1wICs9IDB4NDM0OTsKKyAgIGluZGV4Kys7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NTQ0MiwgaW5kZXgpOyAgICAgICAgICAgIC8qVmVuZG9yIHVuaXF1ZSBjb2RlICovCisgICB0ZW1wICs9IDB4NTQ0MjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQlQtIDkzMCAgICAgICAgICAgKi8KKyAgIGluZGV4Kys7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4MjAyRCwgaW5kZXgpOworICAgdGVtcCArPSAweDIwMkQ7CisgICBpbmRleCsrOworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDMzMzksIGluZGV4KTsKKyAgIHRlbXAgKz0gMHgzMzM5OworICAgaW5kZXgrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlNlcmlhbCAjICAgICAgICAgICovCisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4MjAzMCwgaW5kZXgpOyAgICAgICAgICAgICAvKiAwMTIzNDU2NyAgICAgICAgICovCisgICB0ZW1wICs9IDB4MjAzMDsKKyAgIGluZGV4Kys7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NTQ1MywgaW5kZXgpOworICAgdGVtcCArPSAweDU0NTM7CisgICBpbmRleCsrOworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDU2NDUsIGluZGV4KTsKKyAgIHRlbXAgKz0gMHg1NjQ1OworICAgaW5kZXgrKzsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHgyMDQ1LCBpbmRleCk7CisgICB0ZW1wICs9IDB4MjA0NTsKKyAgIGluZGV4Kys7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4MjAyRiwgaW5kZXgpOworICAgdGVtcCArPSAweDIwMkY7CisgICBpbmRleCsrOworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDRGNEEsIGluZGV4KTsKKyAgIHRlbXAgKz0gMHg0RjRBOworICAgaW5kZXgrKzsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHgyMDRFLCBpbmRleCk7CisgICB0ZW1wICs9IDB4MjA0RTsKKyAgIGluZGV4Kys7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4MzUzOSwgaW5kZXgpOworICAgdGVtcCArPSAweDM1Mzk7CisKKworCisgICB1dGlsRUVXcml0ZShwX3BvcnQsIHRlbXAsIEVFUFJPTV9DSEVDS19TVU0vMik7CisKKyAgIHV0aWxFRVdyaXRlT25PZmYocF9wb3J0LChVQ0hBUikwKTsKKworfQorCisjaWRlbnQgIiRJZDogdXRpbGl0eS5jIDEuMjMgMTk5Ny8wNi8xMCAxNjo1NTowNiBtb2hhbiBFeHAgJCIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCisgKiAgIENvcHlyaWdodCAxOTk1LTE5OTYgYnkgTXlsZXggQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGJvdGggdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFuZCBhIEJTRC1zdHlsZSBjb3B5cmlnaHQ7IHNlZSBMSUNFTlNFLkZsYXNoUG9pbnQgZm9yIGRldGFpbHMuCisgKgorICogICAkV29ya2ZpbGU6ICAgdXRpbGl0eS5jICAkCisgKgorICogICBEZXNjcmlwdGlvbjogIFV0aWxpdHkgZnVuY3Rpb25zIHJlbGF0aW5nIHRvIHF1ZXVlaW5nIGFuZCBFRVBST00KKyAqICAgICAgICAgICAgICAgICBtYW5pcHVsYXRpb24gYW5kIGFueSBvdGhlciBnYXJiYWdlIGZ1bmN0aW9ucy4KKyAqCisgKiAgICREYXRlOiAxOTk3LzA2LzEwIDE2OjU1OjA2ICQKKyAqCisgKiAgICRSZXZpc2lvbjogMS4yMyAkCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qI2luY2x1ZGUgPGdsb2JhbHMuaD4qLworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKwkvKiNpbmNsdWRlIDxidWRpLmg+Ki8KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzY2NibWdyLmg+Ki8KKy8qI2luY2x1ZGUgPGJseDMwLmg+Ki8KKy8qI2luY2x1ZGUgPHRhcmdldC5oPiovCisvKiNpbmNsdWRlIDxzY3NpMi5oPiovCisvKiNpbmNsdWRlIDxoYXJwb29uLmg+Ki8KKworCisvKgorZXh0ZXJuIFNDQ0JDQVJEIEJMX0NhcmRbTUFYX0NBUkRTXTsKK2V4dGVybiBTQ0NCTUdSX1RBUl9JTkZPIHNjY2JNZ3JUYmxbTUFYX0NBUkRTXVtNQVhfU0NTSV9UQVJdOworZXh0ZXJuIHVuc2lnbmVkIGludCBTY2NiR2xvYmFsRmxhZ3M7CisqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBRdWV1ZSBTZWFyY2ggU2VsZWN0CisgKgorICogRGVzY3JpcHRpb246IFRyeSB0byBmaW5kIGEgbmV3IGNvbW1hbmQgdG8gZXhlY3V0ZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgcXVldWVTZWFyY2hTZWxlY3QoUFNDQ0JjYXJkIHBDdXJyQ2FyZCwgVUNIQVIgcF9jYXJkKQoreworICAgVUNIQVIgc2Nhbl9wdHIsIGx1bjsKKyAgIFBTQ0NCTWdyX3Rhcl9pbmZvIGN1cnJUYXJfSW5mbzsKKwlQU0NDQiBwT2xkU2NjYjsKKworICAgc2Nhbl9wdHIgPSBwQ3VyckNhcmQtPnNjYW5JbmRleDsKKwlkbyAKKwl7CisJCWN1cnJUYXJfSW5mbyA9ICZzY2NiTWdyVGJsW3BfY2FyZF1bc2Nhbl9wdHJdOworCQlpZigocEN1cnJDYXJkLT5nbG9iYWxGbGFncyAmIEZfQ09OTFVOX0lPKSAmJiAKKwkJCSgoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBUQVJfVEFHX1FfTUFTSykgIT0gVEFHX1FfVFJZSU5HKSkKKwkJeworCQkJaWYgKGN1cnJUYXJfSW5mby0+VGFyU2VsUV9DbnQgIT0gMCkKKwkJCXsKKworCQkJCXNjYW5fcHRyKys7CisJCQkJaWYgKHNjYW5fcHRyID09IE1BWF9TQ1NJX1RBUikKKwkJCQkJc2Nhbl9wdHIgPSAwOworCQkJCQorCQkJCWZvcihsdW49MDsgbHVuIDwgTUFYX0xVTjsgbHVuKyspCisJCQkJeworCQkJCQlpZihjdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbbHVuXSA9PSBGQUxTRSkKKwkJCQkJeworCisJCQkJCQlwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCID0gY3VyclRhcl9JbmZvLT5UYXJTZWxRX0hlYWQ7CisJCQkJCQlwT2xkU2NjYiA9IE5VTEw7CisKKwkJCQkJCXdoaWxlKChwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCICE9IE5VTEwpICYmCisJCQkJCQkJCSAobHVuICE9IHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0ItPkx1bikpCisJCQkJCQl7CisJCQkJCQkJcE9sZFNjY2IgPSBwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCOworCQkJCQkJCXBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgPSAoUFNDQ0IpKHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IpLT4KKwkJCQkJCQkJCQkJCQkJCQkJU2NjYl9mb3J3YXJkbGluazsKKwkJCQkJCX0KKwkJCQkJCWlmKHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgPT0gTlVMTCkKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCWlmKHBPbGRTY2NiICE9IE5VTEwpCisJCQkJCQl7CisJCQkJCQkJcE9sZFNjY2ItPlNjY2JfZm9yd2FyZGxpbmsgPSAoUFNDQ0IpKHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IpLT4KKwkJCQkJCQkJCQkJCQkJCQkJU2NjYl9mb3J3YXJkbGluazsKKwkJCQkJCQlwT2xkU2NjYi0+U2NjYl9iYWNrbGluayA9IChQU0NDQikocEN1cnJDYXJkLT5jdXJyZW50U0NDQiktPgorCQkJCQkJCQkJCQkJCQkJCQlTY2NiX2JhY2tsaW5rOworCQkJCQkJCWN1cnJUYXJfSW5mby0+VGFyU2VsUV9DbnQtLTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQljdXJyVGFyX0luZm8tPlRhclNlbFFfSGVhZCA9IChQU0NDQikocEN1cnJDYXJkLT5jdXJyZW50U0NDQiktPlNjY2JfZm9yd2FyZGxpbms7CisJCQkJCQorCQkJCQkJCWlmIChjdXJyVGFyX0luZm8tPlRhclNlbFFfSGVhZCA9PSBOVUxMKQorCQkJCQkJCXsKKwkJCQkJCQkJY3VyclRhcl9JbmZvLT5UYXJTZWxRX1RhaWwgPSBOVUxMOworCQkJCQkJCQljdXJyVGFyX0luZm8tPlRhclNlbFFfQ250ID0gMDsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJY3VyclRhcl9JbmZvLT5UYXJTZWxRX0NudC0tOworCQkJCQkJCQljdXJyVGFyX0luZm8tPlRhclNlbFFfSGVhZC0+U2NjYl9iYWNrbGluayA9IChQU0NDQilOVUxMOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJcEN1cnJDYXJkLT5zY2FuSW5kZXggPSBzY2FuX3B0cjsKKworCQkJCQlwQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfTkVXX1NDQ0JfQ01EOworCisJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQllbHNlIAorCQkJeworCQkJCXNjYW5fcHRyKys7CisJCQkJaWYgKHNjYW5fcHRyID09IE1BWF9TQ1NJX1RBUikgeworCQkJCQlzY2FuX3B0ciA9IDA7CisJCQkJfQorCQkJfQorCisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKGN1cnJUYXJfSW5mby0+VGFyU2VsUV9DbnQgIT0gMCkgJiYKKwkJCQkoY3VyclRhcl9JbmZvLT5UYXJMVU5CdXN5WzBdID09IEZBTFNFKSkKKwkJCXsKKworCQkJCXBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgPSBjdXJyVGFyX0luZm8tPlRhclNlbFFfSGVhZDsKKworCQkJCWN1cnJUYXJfSW5mby0+VGFyU2VsUV9IZWFkID0gKFBTQ0NCKShwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCKS0+U2NjYl9mb3J3YXJkbGluazsKKworCQkJCWlmIChjdXJyVGFyX0luZm8tPlRhclNlbFFfSGVhZCA9PSBOVUxMKQorCQkJCXsKKwkJCQkJY3VyclRhcl9JbmZvLT5UYXJTZWxRX1RhaWwgPSBOVUxMOworCQkJCQljdXJyVGFyX0luZm8tPlRhclNlbFFfQ250ID0gMDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJY3VyclRhcl9JbmZvLT5UYXJTZWxRX0NudC0tOworCQkJCQljdXJyVGFyX0luZm8tPlRhclNlbFFfSGVhZC0+U2NjYl9iYWNrbGluayA9IChQU0NDQilOVUxMOworCQkJCX0KKworCQkJCXNjYW5fcHRyKys7CisJCQkJaWYgKHNjYW5fcHRyID09IE1BWF9TQ1NJX1RBUikKKwkJCQkJc2Nhbl9wdHIgPSAwOworCisJCQkJcEN1cnJDYXJkLT5zY2FuSW5kZXggPSBzY2FuX3B0cjsKKworCQkJCXBDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgfD0gRl9ORVdfU0NDQl9DTUQ7CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZWxzZSAKKwkJCXsKKwkJCQlzY2FuX3B0cisrOworCQkJCWlmIChzY2FuX3B0ciA9PSBNQVhfU0NTSV9UQVIpIAorCQkJCXsKKwkJCQkJc2Nhbl9wdHIgPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCX0gd2hpbGUgKHNjYW5fcHRyICE9IHBDdXJyQ2FyZC0+c2NhbkluZGV4KTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBRdWV1ZSBTZWxlY3QgRmFpbAorICoKKyAqIERlc2NyaXB0aW9uOiBBZGQgdGhlIGN1cnJlbnQgU0NDQiB0byB0aGUgaGVhZCBvZiB0aGUgUXVldWUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHF1ZXVlU2VsZWN0RmFpbChQU0NDQmNhcmQgcEN1cnJDYXJkLCBVQ0hBUiBwX2NhcmQpCit7CisgICBVQ0hBUiB0aGlzVGFyZzsKKyAgIFBTQ0NCTWdyX3Rhcl9pbmZvIGN1cnJUYXJfSW5mbzsKKworICAgaWYgKHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgIT0gTlVMTCkKKwkgIHsKKwkgIHRoaXNUYXJnID0gKFVDSEFSKSgoKFBTQ0NCKShwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCKSktPlRhcmdJRCk7CisgICAgICBjdXJyVGFyX0luZm8gPSAmc2NjYk1nclRibFtwX2NhcmRdW3RoaXNUYXJnXTsKKworICAgICAgcEN1cnJDYXJkLT5jdXJyZW50U0NDQi0+U2NjYl9iYWNrbGluayA9IChQU0NDQilOVUxMOworCisgICAgICBwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCLT5TY2NiX2ZvcndhcmRsaW5rID0gY3VyclRhcl9JbmZvLT5UYXJTZWxRX0hlYWQ7CisKKwkgIGlmIChjdXJyVGFyX0luZm8tPlRhclNlbFFfQ250ID09IDApCisJCSB7CisJCSBjdXJyVGFyX0luZm8tPlRhclNlbFFfVGFpbCA9IHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0I7CisJCSB9CisKKwkgIGVsc2UKKwkJIHsKKwkJIGN1cnJUYXJfSW5mby0+VGFyU2VsUV9IZWFkLT5TY2NiX2JhY2tsaW5rID0gcEN1cnJDYXJkLT5jdXJyZW50U0NDQjsKKwkJIH0KKworCisJICBjdXJyVGFyX0luZm8tPlRhclNlbFFfSGVhZCA9IHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0I7CisKKwkgIHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgPSBOVUxMOworCSAgY3VyclRhcl9JbmZvLT5UYXJTZWxRX0NudCsrOworCSAgfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogUXVldWUgQ29tbWFuZCBDb21wbGV0ZQorICoKKyAqIERlc2NyaXB0aW9uOiBDYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIHRoZSBjdXJyZW50IFNDQ0IuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHF1ZXVlQ21kQ29tcGxldGUoUFNDQ0JjYXJkIHBDdXJyQ2FyZCwgUFNDQ0IgcF9zY2NiLCBVQ0hBUiBwX2NhcmQpCit7CisKKyNpZiAoRldfVFlQRT09X1VDQl9NR1JfKQorCisgICB1MDhiaXRzIFNDU0ljbWQ7CisgICBDQUxMX0JLX0ZOIGNhbGxiYWNrOworICAgUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworCisgICBQVUNCIHBfdWNiOworICAgcF91Y2I9cF9zY2NiLT5TY2NiX3VjYl9wdHI7CisKKyAgIFNDU0ljbWQgPSBwX3NjY2ItPkNkYlswXTsKKworCisgICBpZiAoIShwX3NjY2ItPlNjY2JfWGZlclN0YXRlICYgRl9BTExfWEZFUlJFRCkpCisgICB7CisKKyAgICAgIGlmICgocF91Y2ItPlVDQl9vcGNvZGUgJiBPUENfQ0hLX1VOREVSX09WRVJfUlVOKSAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAocF9zY2NiLT5Ib3N0U3RhdHVzID09IFNDQ0JfQ09NUExFVEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgKHBfc2NjYi0+VGFyZ2V0U3RhdHVzICE9IFNTQ0hFQ0spKQorCisgICAgICAgICBpZiAoKFNDU0ljbWQgPT0gU0NTSV9SRUFEKSAgICAgICAgICAgICB8fAorICAgICAgICAgICAgIChTQ1NJY21kID09IFNDU0lfV1JJVEUpICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAoU0NTSWNtZCA9PSBTQ1NJX1JFQURfRVhURU5ERUQpICAgIHx8CisgICAgICAgICAgICAgKFNDU0ljbWQgPT0gU0NTSV9XUklURV9FWFRFTkRFRCkgICB8fAorICAgICAgICAgICAgIChTQ1NJY21kID09IFNDU0lfV1JJVEVfQU5EX1ZFUklGWSkgfHwKKyAgICAgICAgICAgICAoU0NTSWNtZCA9PSBTQ1NJX1NUQVJUX1NUT1BfVU5JVCkgIHx8CisgICAgICAgICAgICAgKHBDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgJiBGX05PX0ZJTFRFUikKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgIHBfc2NjYi0+SG9zdFN0YXR1cyA9IFNDQ0JfREFUQV9VTkRFUl9SVU47CisgICB9CisKKyAgIHBfdWNiLT5VQ0Jfc3RhdHVzPVNDQ0JfU1VDQ0VTUzsKKworICAgaWYgKChwX3VjYi0+VUNCX2hiYXN0YXQ9cF9zY2NiLT5Ib3N0U3RhdHVzKSB8fCAocF91Y2ItPlVDQl9zY3Npc3RhdD1wX3NjY2ItPlRhcmdldFN0YXR1cykpCisgICB7CisgICAgICBwX3VjYi0+VUNCX3N0YXR1cz1TQ0NCX0VSUk9SOworICAgfQorCisgICBpZiAoKHBfc2NjYi0+T3BlcmF0aW9uQ29kZSA9PSBSRVNJRFVBTF9TR19DT01NQU5EKSB8fAorICAgICAgKHBfc2NjYi0+T3BlcmF0aW9uQ29kZSA9PSBSRVNJRFVBTF9DT01NQU5EKSkKKyAgIHsKKworICAgICAgICAgdXRpbFVwZGF0ZVJlc2lkdWFsKHBfc2NjYik7CisKKyAgICAgICAgIHBfdWNiLT5VQ0JfZGF0YWxlbj1wX3NjY2ItPkRhdGFMZW5ndGg7CisgICB9CisKKyAgIHBDdXJyQ2FyZC0+Y21kQ291bnRlci0tOworICAgaWYgKCFwQ3VyckNhcmQtPmNtZENvdW50ZXIpCisgICB7CisKKyAgICAgIGlmIChwQ3VyckNhcmQtPmdsb2JhbEZsYWdzICYgRl9HUkVFTl9QQykKKyAgICAgIHsKKyAgICAgICAgIFdSX0hBUlBPT04ocEN1cnJDYXJkLT5pb1BvcnQraHBfY2xrY3RybF8wLChQV1JfRFdOIHwgQ0xLQ1RSTF9ERUZBVUxUKSk7CisgICAgICAgICBXUl9IQVJQT09OKHBDdXJyQ2FyZC0+aW9Qb3J0K2hwX3N5c19jdHJsLCBTVE9QX0NMSyk7CisgICAgICB9CisKKyAgICAgIFdSX0hBUlBPT04ocEN1cnJDYXJkLT5pb1BvcnQraHBfc2VtYXBob3JlLAorICAgICAgKFJEX0hBUlBPT04ocEN1cnJDYXJkLT5pb1BvcnQraHBfc2VtYXBob3JlKSAmIH5TQ0NCX01HUl9BQ1RJVkUpKTsKKyAgIH0KKworCWlmKHBDdXJyQ2FyZC0+ZGlzY1FDb3VudCAhPSAwKQorCXsKKyAgICAgIGN1cnJUYXJfSW5mbyA9ICZzY2NiTWdyVGJsW3BfY2FyZF1bcF9zY2NiLT5UYXJnSURdOworCQlpZigoKHBDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgJiBGX0NPTkxVTl9JTykgJiYKKwkJCSgoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBUQVJfVEFHX1FfTUFTSykgIT0gVEFHX1FfVFJZSU5HKSkpCisJCXsKKwkJCXBDdXJyQ2FyZC0+ZGlzY1FDb3VudC0tOworCQkJcEN1cnJDYXJkLT5kaXNjUV9UYmxbY3VyclRhcl9JbmZvLT5MdW5EaXNjUV9JZHhbcF9zY2NiLT5MdW5dXSA9IE5VTEw7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZihwX3NjY2ItPlNjY2JfdGFnKQorCQkJeworCQkJCXBDdXJyQ2FyZC0+ZGlzY1FDb3VudC0tOworCQkJCXBDdXJyQ2FyZC0+ZGlzY1FfVGJsW3Bfc2NjYi0+U2NjYl90YWddID0gTlVMTDsKKwkJCX1lbHNlCisJCQl7CisJCQkJcEN1cnJDYXJkLT5kaXNjUUNvdW50LS07CisJCQkJcEN1cnJDYXJkLT5kaXNjUV9UYmxbY3VyclRhcl9JbmZvLT5MdW5EaXNjUV9JZHhbMF1dID0gTlVMTDsKKwkJCX0KKwkJfQorCisJfQorICAgY2FsbGJhY2sgPSAoQ0FMTF9CS19GTilwX3VjYi0+VUNCX2NhbGxiYWNrOworICAgY2FsbGJhY2socF91Y2IpOworICAgcEN1cnJDYXJkLT5nbG9iYWxGbGFncyB8PSBGX05FV19TQ0NCX0NNRDsKKyAgIHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgPSBOVUxMOworfQorCisKKworCisjZWxzZQorCisgICBVQ0hBUiBpLCBTQ1NJY21kOworICAgQ0FMTF9CS19GTiBjYWxsYmFjazsKKyAgIFBTQ0NCTWdyX3Rhcl9pbmZvIGN1cnJUYXJfSW5mbzsKKworICAgU0NTSWNtZCA9IHBfc2NjYi0+Q2RiWzBdOworCisKKyAgIGlmICghKHBfc2NjYi0+U2NjYl9YZmVyU3RhdGUgJiBGX0FMTF9YRkVSUkVEKSkgeworCisJICBpZiAoKHBfc2NjYi0+Q29udHJvbEJ5dGUgJiAoU0NDQl9EQVRBX1hGRVJfT1VUIHwgU0NDQl9EQVRBX1hGRVJfSU4pKSAmJgorCQkgKHBfc2NjYi0+SG9zdFN0YXR1cyA9PSBTQ0NCX0NPTVBMRVRFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKwkJIChwX3NjY2ItPlRhcmdldFN0YXR1cyAhPSBTU0NIRUNLKSkKKworCQkgaWYgKChTQ1NJY21kID09IFNDU0lfUkVBRCkgICAgICAgICAgICAgfHwKKwkJCSAoU0NTSWNtZCA9PSBTQ1NJX1dSSVRFKSAgICAgICAgICAgIHx8CisJCQkgKFNDU0ljbWQgPT0gU0NTSV9SRUFEX0VYVEVOREVEKSAgICB8fAorCQkJIChTQ1NJY21kID09IFNDU0lfV1JJVEVfRVhURU5ERUQpICAgfHwKKwkJCSAoU0NTSWNtZCA9PSBTQ1NJX1dSSVRFX0FORF9WRVJJRlkpIHx8CisJCQkgKFNDU0ljbWQgPT0gU0NTSV9TVEFSVF9TVE9QX1VOSVQpICB8fAorCQkJIChwQ3VyckNhcmQtPmdsb2JhbEZsYWdzICYgRl9OT19GSUxURVIpCisJCQkpCisJCQkgICBwX3NjY2ItPkhvc3RTdGF0dXMgPSBTQ0NCX0RBVEFfVU5ERVJfUlVOOworCSAgfQorCisKKwlpZihwX3NjY2ItPlNjY2JTdGF0dXMgPT0gU0NDQl9JTl9QUk9DRVNTKQorCXsKKwkgICBpZiAocF9zY2NiLT5Ib3N0U3RhdHVzIHx8IHBfc2NjYi0+VGFyZ2V0U3RhdHVzKQorCQkgIHBfc2NjYi0+U2NjYlN0YXR1cyA9IFNDQ0JfRVJST1I7CisJICAgZWxzZQorCQkgIHBfc2NjYi0+U2NjYlN0YXR1cyA9IFNDQ0JfU1VDQ0VTUzsKKwl9CisKKyAgIGlmIChwX3NjY2ItPlNjY2JfWGZlclN0YXRlICYgRl9BVVRPX1NFTlNFKSB7CisKKwkgIHBfc2NjYi0+Q2RiTGVuZ3RoID0gcF9zY2NiLT5TYXZlX0NkYkxlbjsKKwkgIGZvciAoaT0wOyBpIDwgNjsgaSsrKSB7CisJCSBwX3NjY2ItPkNkYltpXSA9IHBfc2NjYi0+U2F2ZV9DZGJbaV07CisJCSB9CisJICB9CisKKyAgIGlmICgocF9zY2NiLT5PcGVyYXRpb25Db2RlID09IFJFU0lEVUFMX1NHX0NPTU1BTkQpIHx8CisJICAocF9zY2NiLT5PcGVyYXRpb25Db2RlID09IFJFU0lEVUFMX0NPTU1BTkQpKSB7CisKKwkJIHV0aWxVcGRhdGVSZXNpZHVhbChwX3NjY2IpOworCQkgfQorCisgICBwQ3VyckNhcmQtPmNtZENvdW50ZXItLTsKKyAgIGlmICghcEN1cnJDYXJkLT5jbWRDb3VudGVyKSB7CisKKwkgIGlmIChwQ3VyckNhcmQtPmdsb2JhbEZsYWdzICYgRl9HUkVFTl9QQykgeworCQkgV1JfSEFSUE9PTihwQ3VyckNhcmQtPmlvUG9ydCtocF9jbGtjdHJsXzAsKFBXUl9EV04gfCBDTEtDVFJMX0RFRkFVTFQpKTsKKwkJIFdSX0hBUlBPT04ocEN1cnJDYXJkLT5pb1BvcnQraHBfc3lzX2N0cmwsIFNUT1BfQ0xLKTsKKwkJIH0KKworCSAgV1JfSEFSUE9PTihwQ3VyckNhcmQtPmlvUG9ydCtocF9zZW1hcGhvcmUsCisJICAoUkRfSEFSUE9PTihwQ3VyckNhcmQtPmlvUG9ydCtocF9zZW1hcGhvcmUpICYgflNDQ0JfTUdSX0FDVElWRSkpOworCisJICB9CisKKwlpZihwQ3VyckNhcmQtPmRpc2NRQ291bnQgIT0gMCkKKwl7CisgICAgICBjdXJyVGFyX0luZm8gPSAmc2NjYk1nclRibFtwX2NhcmRdW3Bfc2NjYi0+VGFyZ0lEXTsKKwkJaWYoKChwQ3VyckNhcmQtPmdsb2JhbEZsYWdzICYgRl9DT05MVU5fSU8pICYmCisJCQkoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYgVEFSX1RBR19RX01BU0spICE9IFRBR19RX1RSWUlORykpKQorCQl7CisJCQlwQ3VyckNhcmQtPmRpc2NRQ291bnQtLTsKKwkJCXBDdXJyQ2FyZC0+ZGlzY1FfVGJsW2N1cnJUYXJfSW5mby0+THVuRGlzY1FfSWR4W3Bfc2NjYi0+THVuXV0gPSBOVUxMOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYocF9zY2NiLT5TY2NiX3RhZykKKwkJCXsKKwkJCQlwQ3VyckNhcmQtPmRpc2NRQ291bnQtLTsKKwkJCQlwQ3VyckNhcmQtPmRpc2NRX1RibFtwX3NjY2ItPlNjY2JfdGFnXSA9IE5VTEw7CisJCQl9ZWxzZQorCQkJeworCQkJCXBDdXJyQ2FyZC0+ZGlzY1FDb3VudC0tOworCQkJCXBDdXJyQ2FyZC0+ZGlzY1FfVGJsW2N1cnJUYXJfSW5mby0+THVuRGlzY1FfSWR4WzBdXSA9IE5VTEw7CisJCQl9CisJCX0KKworCX0KKworCWNhbGxiYWNrID0gKENBTExfQktfRk4pcF9zY2NiLT5TY2NiQ2FsbGJhY2s7CisgICBjYWxsYmFjayhwX3NjY2IpOworICAgcEN1cnJDYXJkLT5nbG9iYWxGbGFncyB8PSBGX05FV19TQ0NCX0NNRDsKKyAgIHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgPSBOVUxMOworfQorI2VuZGlmIC8qICggaWYgRldfVFlQRT09Li4uKSAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFF1ZXVlIERpc2Nvbm5lY3QKKyAqCisgKiBEZXNjcmlwdGlvbjogQWRkIFNDQ0IgdG8gb3VyIGRpc2Nvbm5lY3QgYXJyYXkuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBxdWV1ZURpc2Nvbm5lY3QoUFNDQ0IgcF9zY2NiLCBVQ0hBUiBwX2NhcmQpCit7CisgICBQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CisKKwljdXJyVGFyX0luZm8gPSAmc2NjYk1nclRibFtwX2NhcmRdW3Bfc2NjYi0+VGFyZ0lEXTsKKworCWlmKCgoQkxfQ2FyZFtwX2NhcmRdLmdsb2JhbEZsYWdzICYgRl9DT05MVU5fSU8pICYmCisJCSgoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBUQVJfVEFHX1FfTUFTSykgIT0gVEFHX1FfVFJZSU5HKSkpCisJeworCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW2N1cnJUYXJfSW5mby0+THVuRGlzY1FfSWR4W3Bfc2NjYi0+THVuXV0gPSBwX3NjY2I7CisJfQorCWVsc2UKKwl7CisJCWlmIChwX3NjY2ItPlNjY2JfdGFnKQorCQl7CisJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW3Bfc2NjYi0+U2NjYl90YWddID0gcF9zY2NiOworCQkJc2NjYk1nclRibFtwX2NhcmRdW3Bfc2NjYi0+VGFyZ0lEXS5UYXJMVU5CdXN5WzBdID0gRkFMU0U7CisJCQlzY2NiTWdyVGJsW3BfY2FyZF1bcF9zY2NiLT5UYXJnSURdLlRhclRhZ1FfQ250Kys7CisJCX1lbHNlCisJCXsKKwkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUV9UYmxbY3VyclRhcl9JbmZvLT5MdW5EaXNjUV9JZHhbMF1dID0gcF9zY2NiOworCQl9CisJfQorCUJMX0NhcmRbcF9jYXJkXS5jdXJyZW50U0NDQiA9IE5VTEw7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogUXVldWUgRmx1c2ggU0NDQgorICoKKyAqIERlc2NyaXB0aW9uOiBGbHVzaCBhbGwgU0NDQidzIGJhY2sgdG8gdGhlIGhvc3QgZHJpdmVyIGZvciB0aGlzIHRhcmdldC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgIHF1ZXVlRmx1c2hTY2NiKFVDSEFSIHBfY2FyZCwgVUNIQVIgZXJyb3JfY29kZSkKK3sKKyAgIFVDSEFSIHF0YWcsdGhpc1Rhcmc7CisgICBQU0NDQiBjdXJyU0NDQjsKKyAgIFBTQ0NCTWdyX3Rhcl9pbmZvIGN1cnJUYXJfSW5mbzsKKworICAgY3VyclNDQ0IgPSBCTF9DYXJkW3BfY2FyZF0uY3VycmVudFNDQ0I7CisJaWYoY3VyclNDQ0IgIT0gTlVMTCkKKwl7CisJICAgdGhpc1RhcmcgPSAoVUNIQVIpY3VyclNDQ0ItPlRhcmdJRDsKKyAgIAljdXJyVGFyX0luZm8gPSAmc2NjYk1nclRibFtwX2NhcmRdW3RoaXNUYXJnXTsKKworCSAgIGZvciAocXRhZz0wOyBxdGFnPFFVRVVFX0RFUFRIOyBxdGFnKyspIHsKKworCQkgIGlmIChCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW3F0YWddICYmIAorCQkJCQkoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtxdGFnXS0+VGFyZ0lEID09IHRoaXNUYXJnKSkKKwkJCSB7CisKKwkJCSBCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW3F0YWddLT5Ib3N0U3RhdHVzID0gKFVDSEFSKWVycm9yX2NvZGU7CisJCQkKKwkJCSBxdWV1ZUNtZENvbXBsZXRlKCZCTF9DYXJkW3BfY2FyZF0sQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtxdGFnXSwgcF9jYXJkKTsKKworCQkJIEJMX0NhcmRbcF9jYXJkXS5kaXNjUV9UYmxbcXRhZ10gPSBOVUxMOworCQkJIGN1cnJUYXJfSW5mby0+VGFyVGFnUV9DbnQtLTsKKworCQkJIH0KKwkJICB9CisJfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFF1ZXVlIEZsdXNoIFRhcmdldCBTQ0NCCisgKgorICogRGVzY3JpcHRpb246IEZsdXNoIGFsbCBTQ0NCJ3MgYmFjayB0byB0aGUgaG9zdCBkcml2ZXIgZm9yIHRoaXMgdGFyZ2V0LgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCAgcXVldWVGbHVzaFRhcmdTY2NiKFVDSEFSIHBfY2FyZCwgVUNIQVIgdGhpc1RhcmcsIFVDSEFSIGVycm9yX2NvZGUpCit7CisgICBVQ0hBUiBxdGFnOworICAgUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworCisgICBjdXJyVGFyX0luZm8gPSAmc2NjYk1nclRibFtwX2NhcmRdW3RoaXNUYXJnXTsKKworICAgZm9yIChxdGFnPTA7IHF0YWc8UVVFVUVfREVQVEg7IHF0YWcrKykgeworCisJICBpZiAoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtxdGFnXSAmJiAKKwkJCQkoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtxdGFnXS0+VGFyZ0lEID09IHRoaXNUYXJnKSkKKwkJIHsKKworCQkgQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtxdGFnXS0+SG9zdFN0YXR1cyA9IChVQ0hBUillcnJvcl9jb2RlOworCisJCSBxdWV1ZUNtZENvbXBsZXRlKCZCTF9DYXJkW3BfY2FyZF0sQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtxdGFnXSwgcF9jYXJkKTsKKworCQkgQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtxdGFnXSA9IE5VTEw7CisJCSBjdXJyVGFyX0luZm8tPlRhclRhZ1FfQ250LS07CisKKwkJIH0KKwkgIH0KKworfQorCisKKworCisKK3ZvaWQgcXVldWVBZGRTY2NiKFBTQ0NCIHBfU0NDQiwgVUNIQVIgcF9jYXJkKQoreworICAgUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworICAgY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVtwX1NDQ0ItPlRhcmdJRF07CisKKyAgIHBfU0NDQi0+U2NjYl9mb3J3YXJkbGluayA9IE5VTEw7CisKKyAgIHBfU0NDQi0+U2NjYl9iYWNrbGluayA9IGN1cnJUYXJfSW5mby0+VGFyU2VsUV9UYWlsOworCisgICBpZiAoY3VyclRhcl9JbmZvLT5UYXJTZWxRX0NudCA9PSAwKSB7CisKKwkgIGN1cnJUYXJfSW5mby0+VGFyU2VsUV9IZWFkID0gcF9TQ0NCOworCSAgfQorCisgICBlbHNlIHsKKworCSAgY3VyclRhcl9JbmZvLT5UYXJTZWxRX1RhaWwtPlNjY2JfZm9yd2FyZGxpbmsgPSBwX1NDQ0I7CisJICB9CisKKworICAgY3VyclRhcl9JbmZvLT5UYXJTZWxRX1RhaWwgPSBwX1NDQ0I7CisgICBjdXJyVGFyX0luZm8tPlRhclNlbFFfQ250Kys7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogUXVldWUgRmluZCBTQ0NCCisgKgorICogRGVzY3JpcHRpb246IFNlYXJjaCB0aGUgdGFyZ2V0IHNlbGVjdCBRdWV1ZSBmb3IgdGhpcyBTQ0NCLCBhbmQKKyAqICAgICAgICAgICAgICByZW1vdmUgaXQgaWYgZm91bmQuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitVQ0hBUiBxdWV1ZUZpbmRTY2NiKFBTQ0NCIHBfU0NDQiwgVUNIQVIgcF9jYXJkKQoreworICAgUFNDQ0IgcV9wdHI7CisgICBQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CisKKyAgIGN1cnJUYXJfSW5mbyA9ICZzY2NiTWdyVGJsW3BfY2FyZF1bcF9TQ0NCLT5UYXJnSURdOworCisgICBxX3B0ciA9IGN1cnJUYXJfSW5mby0+VGFyU2VsUV9IZWFkOworCisgICB3aGlsZShxX3B0ciAhPSBOVUxMKSB7CisKKwkgIGlmIChxX3B0ciA9PSBwX1NDQ0IpIHsKKworCisJCSBpZiAoY3VyclRhcl9JbmZvLT5UYXJTZWxRX0hlYWQgPT0gcV9wdHIpIHsKKworCQkJY3VyclRhcl9JbmZvLT5UYXJTZWxRX0hlYWQgPSBxX3B0ci0+U2NjYl9mb3J3YXJkbGluazsKKwkJCX0KKworCQkgaWYgKGN1cnJUYXJfSW5mby0+VGFyU2VsUV9UYWlsID09IHFfcHRyKSB7CisKKwkJCWN1cnJUYXJfSW5mby0+VGFyU2VsUV9UYWlsID0gcV9wdHItPlNjY2JfYmFja2xpbms7CisJCQl9CisKKwkJIGlmIChxX3B0ci0+U2NjYl9mb3J3YXJkbGluayAhPSBOVUxMKSB7CisJCQlxX3B0ci0+U2NjYl9mb3J3YXJkbGluay0+U2NjYl9iYWNrbGluayA9IHFfcHRyLT5TY2NiX2JhY2tsaW5rOworCQkJfQorCisJCSBpZiAocV9wdHItPlNjY2JfYmFja2xpbmsgIT0gTlVMTCkgeworCQkJcV9wdHItPlNjY2JfYmFja2xpbmstPlNjY2JfZm9yd2FyZGxpbmsgPSBxX3B0ci0+U2NjYl9mb3J3YXJkbGluazsKKwkJCX0KKworCQkgY3VyclRhcl9JbmZvLT5UYXJTZWxRX0NudC0tOworCisJCSByZXR1cm4oVFJVRSk7CisJCSB9CisKKwkgIGVsc2UgeworCQkgcV9wdHIgPSBxX3B0ci0+U2NjYl9mb3J3YXJkbGluazsKKwkJIH0KKwkgIH0KKworCisgICByZXR1cm4oRkFMU0UpOworCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogVXRpbGl0eSBVcGRhdGUgUmVzaWR1YWwgQ291bnQKKyAqCisgKiBEZXNjcmlwdGlvbjogVXBkYXRlIHRoZSBYZmVyQ250IHRvIHRoZSByZW1haW5pbmcgYnl0ZSBjb3VudC4KKyAqICAgICAgICAgICAgICBJZiB3ZSB0cmFuc2ZlcnJlZCBhbGwgdGhlIGRhdGEgdGhlbiBqdXN0IHdyaXRlIHplcm8uCisgKiAgICAgICAgICAgICAgSWYgTm9uLVNHIHRyYW5zZmVyIHRoZW4gcmVwb3J0IFRvdGFsIENudCAtIEFjdHVhbCBUcmFuc2ZlcgorICogICAgICAgICAgICAgIENudC4gIEZvciBTRyB0cmFuc2ZlcnMgYWRkIHRoZSBjb3VudCBmaWVsZHMgb2YgYWxsCisgKiAgICAgICAgICAgICAgcmVtYWluaW5nIFNHIGVsZW1lbnRzLCBhcyB3ZWxsIGFzIGFueSBwYXJ0aWFsIHJlbWFpbmluZworICogICAgICAgICAgICAgIGVsZW1lbnQuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkICB1dGlsVXBkYXRlUmVzaWR1YWwoUFNDQ0IgcF9TQ0NCKQoreworICAgVUxPTkcgcGFydGlhbF9jbnQ7CisgICBVSU5UICBzZ19pbmRleDsKKyNpZiBkZWZpbmVkKENPTVBJTEVSXzE2X0JJVCkgJiYgIWRlZmluZWQoRE9TKQorICAgVUxPTkcgZmFyICpzZ19wdHI7CisjZWxzZQorICAgVUxPTkcgKnNnX3B0cjsKKyNlbmRpZgorCisgICBpZiAocF9TQ0NCLT5TY2NiX1hmZXJTdGF0ZSAmIEZfQUxMX1hGRVJSRUQpIHsKKworCSAgcF9TQ0NCLT5EYXRhTGVuZ3RoID0gMHgwMDAwOworCSAgfQorCisgICBlbHNlIGlmIChwX1NDQ0ItPlNjY2JfWGZlclN0YXRlICYgRl9TR19YRkVSKSB7CisKKwkJIHBhcnRpYWxfY250ID0gMHgwMDAwOworCisJCSBzZ19pbmRleCA9IHBfU0NDQi0+U2NjYl9zZ3NlZzsKKworI2lmIGRlZmluZWQoQ09NUElMRVJfMTZfQklUKSAmJiAhZGVmaW5lZChET1MpCisJCSBzZ19wdHIgPSAoVUxPTkcgZmFyICopcF9TQ0NCLT5EYXRhUG9pbnRlcjsKKyNlbHNlCisJCSBzZ19wdHIgPSAoVUxPTkcgKilwX1NDQ0ItPkRhdGFQb2ludGVyOworI2VuZGlmCisKKwkJIGlmIChwX1NDQ0ItPlNjY2JfU0dvZmZzZXQpIHsKKworCQkJcGFydGlhbF9jbnQgPSBwX1NDQ0ItPlNjY2JfU0dvZmZzZXQ7CisJCQlzZ19pbmRleCsrOworCQkJfQorCisJCSB3aGlsZSAoICgoVUxPTkcpc2dfaW5kZXggKiAoVUxPTkcpU0dfRUxFTUVOVF9TSVpFKSA8CisJCQlwX1NDQ0ItPkRhdGFMZW5ndGggKSB7CisKKwkJCXBhcnRpYWxfY250ICs9ICooc2dfcHRyKyhzZ19pbmRleCAqIDIpKTsKKwkJCXNnX2luZGV4Kys7CisJCQl9CisKKwkJIHBfU0NDQi0+RGF0YUxlbmd0aCA9IHBhcnRpYWxfY250OworCQkgfQorCisJICBlbHNlIHsKKworCQkgcF9TQ0NCLT5EYXRhTGVuZ3RoIC09IHBfU0NDQi0+U2NjYl9BVEM7CisJCSB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogV2FpdCAxIFNlY29uZAorICoKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciAxIHNlY29uZC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgV2FpdDFTZWNvbmQoVVNIT1JUIHBfcG9ydCkKKyNlbHNlCit2b2lkIFdhaXQxU2Vjb25kKFVMT05HIHBfcG9ydCkKKyNlbmRpZgoreworICAgVUNIQVIgaTsKKworICAgZm9yKGk9MDsgaSA8IDQ7IGkrKykgeworCisJICBXYWl0KHBfcG9ydCwgVE9fMjUwbXMpOworCisJICBpZiAoKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2ljdHJsXzApICYgU0NTSV9SU1QpKQorCQkgYnJlYWs7CisKKwkgIGlmKChSRFdfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpKSAmIFNDQU1fU0VMKSkKKwkJIGJyZWFrOworCSAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFdhaXQKKyAqCisgKiBEZXNjcmlwdGlvbjogV2FpdCB0aGUgZGVzaXJlZCBkZWxheS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgV2FpdChVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2RlbGF5KQorI2Vsc2UKK3ZvaWQgV2FpdChVTE9ORyBwX3BvcnQsIFVDSEFSIHBfZGVsYXkpCisjZW5kaWYKK3sKKyAgIFVDSEFSIG9sZF90aW1lcjsKKyAgIFVDSEFSIGdyZWVuX2ZsYWc7CisKKyAgIG9sZF90aW1lciA9IFJEX0hBUlBPT04ocF9wb3J0K2hwX3NlbHRpbWVvdXQpOworCisgICBncmVlbl9mbGFnPVJEX0hBUlBPT04ocF9wb3J0K2hwX2Nsa2N0cmxfMCk7CisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9jbGtjdHJsXzAsIENMS0NUUkxfREVGQVVMVCk7CisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3NlbHRpbWVvdXQscF9kZWxheSk7CisgICBXUldfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpLCBUSU1FT1VUKTsKKyAgIFdSV19IQVJQT09OKChwX3BvcnQraHBfaW50ZW5hKSwgKGRlZmF1bHRfaW50ZW5hICYgflRJTUVPVVQpKTsKKworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9wb3J0Y3RybF8wLAorCSAgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3BvcnRjdHJsXzApIHwgU1RBUlRfVE8pKTsKKworICAgd2hpbGUgKCEoUkRXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSkgJiBUSU1FT1VUKSkgeworCisJICBpZiAoKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2ljdHJsXzApICYgU0NTSV9SU1QpKQorCQkgYnJlYWs7CisKKwkgIGlmICgoUkRXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSkgJiBTQ0FNX1NFTCkpCisJCSBicmVhazsKKwkgIH0KKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfcG9ydGN0cmxfMCwKKwkgIChSRF9IQVJQT09OKHBfcG9ydCtocF9wb3J0Y3RybF8wKSAmIH5TVEFSVF9UTykpOworCisgICBXUldfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpLCBUSU1FT1VUKTsKKyAgIFdSV19IQVJQT09OKChwX3BvcnQraHBfaW50ZW5hKSwgZGVmYXVsdF9pbnRlbmEpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9jbGtjdHJsXzAsZ3JlZW5fZmxhZyk7CisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3NlbHRpbWVvdXQsb2xkX3RpbWVyKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBFbmFibGUvRGlzYWJsZSBXcml0ZSB0byBFRVBST00KKyAqCisgKiBEZXNjcmlwdGlvbjogVGhlIEVFUFJPTSBtdXN0IGZpcnN0IGJlIGVuYWJsZWQgZm9yIHdyaXRlcworICogICAgICAgICAgICAgIEEgdG90YWwgb2YgOSBjbG9ja3MgYXJlIG5lZWRlZC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgdXRpbEVFV3JpdGVPbk9mZihVU0hPUlQgcF9wb3J0LFVDSEFSIHBfbW9kZSkKKyNlbHNlCit2b2lkIHV0aWxFRVdyaXRlT25PZmYoVUxPTkcgcF9wb3J0LFVDSEFSIHBfbW9kZSkKKyNlbmRpZgoreworICAgVUNIQVIgZWVfdmFsdWU7CisKKyAgIGVlX3ZhbHVlID0gKFVDSEFSKShSRF9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsKSAmIChFWFRfQVJCX0FDSyB8IFNDU0lfVEVSTV9FTkFfSCkpOworCisgICBpZiAocF9tb2RlKQorCisJICB1dGlsRUVTZW5kQ21kQWRkcihwX3BvcnQsIEVXRU4sIEVXRU5fQUREUik7CisKKyAgIGVsc2UKKworCisJICB1dGlsRUVTZW5kQ21kQWRkcihwX3BvcnQsIEVXRFMsIEVXRFNfQUREUik7CisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIChlZV92YWx1ZSB8IFNFRV9NUykpOyAvKlR1cm4gb2ZmIENTICovCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCBlZV92YWx1ZSk7ICAgICAgIC8qVHVybiBvZmYgTWFzdGVyIFNlbGVjdCAqLworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFdyaXRlIEVFUFJPTQorICoKKyAqIERlc2NyaXB0aW9uOiBXcml0ZSBhIHdvcmQgdG8gdGhlIEVFUFJPTSBhdCB0aGUgc3BlY2lmaWVkCisgKiAgICAgICAgICAgICAgYWRkcmVzcy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgdXRpbEVFV3JpdGUoVVNIT1JUIHBfcG9ydCwgVVNIT1JUIGVlX2RhdGEsIFVTSE9SVCBlZV9hZGRyKQorI2Vsc2UKK3ZvaWQgdXRpbEVFV3JpdGUoVUxPTkcgcF9wb3J0LCBVU0hPUlQgZWVfZGF0YSwgVVNIT1JUIGVlX2FkZHIpCisjZW5kaWYKK3sKKworICAgVUNIQVIgZWVfdmFsdWU7CisgICBVU0hPUlQgaTsKKworICAgZWVfdmFsdWUgPSAoVUNIQVIpKChSRF9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsKSAmIChFWFRfQVJCX0FDSyB8IFNDU0lfVEVSTV9FTkFfSCkpfAorCQkgICAoU0VFX01TIHwgU0VFX0NTKSk7CisKKworCisgICB1dGlsRUVTZW5kQ21kQWRkcihwX3BvcnQsIEVFX1dSSVRFLCBlZV9hZGRyKTsKKworCisgICBlZV92YWx1ZSB8PSAoU0VFX01TICsgU0VFX0NTKTsKKworICAgZm9yKGkgPSAweDgwMDA7IGkgIT0gMDsgaT4+PTEpIHsKKworCSAgaWYgKGkgJiBlZV9kYXRhKQorCSBlZV92YWx1ZSB8PSBTRUVfRE87CisJICBlbHNlCisJIGVlX3ZhbHVlICY9IH5TRUVfRE87CisKKwkgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIGVlX3ZhbHVlKTsKKwkgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIGVlX3ZhbHVlKTsKKwkgIGVlX3ZhbHVlIHw9IFNFRV9DTEs7ICAgICAgICAgIC8qIENsb2NrICBkYXRhISAqLworCSAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgZWVfdmFsdWUpOworCSAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgZWVfdmFsdWUpOworCSAgZWVfdmFsdWUgJj0gflNFRV9DTEs7CisJICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCBlZV92YWx1ZSk7CisJICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCBlZV92YWx1ZSk7CisJICB9CisgICBlZV92YWx1ZSAmPSAoRVhUX0FSQl9BQ0sgfCBTQ1NJX1RFUk1fRU5BX0gpOworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgKGVlX3ZhbHVlIHwgU0VFX01TKSk7CisKKyAgIFdhaXQocF9wb3J0LCBUT18xMG1zKTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgKGVlX3ZhbHVlIHwgU0VFX01TIHwgU0VFX0NTKSk7IC8qIFNldCBDUyB0byBFRVBST00gKi8KKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIChlZV92YWx1ZSB8IFNFRV9NUykpOyAgICAgICAvKiBUdXJuIG9mZiBDUyAqLworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgZWVfdmFsdWUpOyAgICAgICAvKiBUdXJuIG9mZiBNYXN0ZXIgU2VsZWN0ICovCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFJlYWQgRUVQUk9NCisgKgorICogRGVzY3JpcHRpb246IFJlYWQgYSB3b3JkIGZyb20gdGhlIEVFUFJPTSBhdCB0aGUgZGVzaXJlZAorICogICAgICAgICAgICAgIGFkZHJlc3MuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCitVU0hPUlQgdXRpbEVFUmVhZChVU0hPUlQgcF9wb3J0LCBVU0hPUlQgZWVfYWRkcikKKyNlbHNlCitVU0hPUlQgdXRpbEVFUmVhZChVTE9ORyBwX3BvcnQsIFVTSE9SVCBlZV9hZGRyKQorI2VuZGlmCit7CisgICBVU0hPUlQgaSwgZWVfZGF0YTEsIGVlX2RhdGEyOworCisJaSA9IDA7CisJZWVfZGF0YTEgPSB1dGlsRUVSZWFkT3JnKHBfcG9ydCwgZWVfYWRkcik7CisJZG8KKwl7CisJCWVlX2RhdGEyID0gdXRpbEVFUmVhZE9yZyhwX3BvcnQsIGVlX2FkZHIpOworCisJCWlmKGVlX2RhdGExID09IGVlX2RhdGEyKQorCQkJcmV0dXJuKGVlX2RhdGExKTsKKworCQllZV9kYXRhMSA9IGVlX2RhdGEyOworCQlpKys7CisKKwl9d2hpbGUoaSA8IDQpOworCisJcmV0dXJuKGVlX2RhdGExKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogUmVhZCBFRVBST00gT3JpZ2luYWwgCisgKgorICogRGVzY3JpcHRpb246IFJlYWQgYSB3b3JkIGZyb20gdGhlIEVFUFJPTSBhdCB0aGUgZGVzaXJlZAorICogICAgICAgICAgICAgIGFkZHJlc3MuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCitVU0hPUlQgdXRpbEVFUmVhZE9yZyhVU0hPUlQgcF9wb3J0LCBVU0hPUlQgZWVfYWRkcikKKyNlbHNlCitVU0hPUlQgdXRpbEVFUmVhZE9yZyhVTE9ORyBwX3BvcnQsIFVTSE9SVCBlZV9hZGRyKQorI2VuZGlmCit7CisKKyAgIFVDSEFSIGVlX3ZhbHVlOworICAgVVNIT1JUIGksIGVlX2RhdGE7CisKKyAgIGVlX3ZhbHVlID0gKFVDSEFSKSgoUkRfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCkgJiAoRVhUX0FSQl9BQ0sgfCBTQ1NJX1RFUk1fRU5BX0gpKXwKKwkJICAgKFNFRV9NUyB8IFNFRV9DUykpOworCisKKyAgIHV0aWxFRVNlbmRDbWRBZGRyKHBfcG9ydCwgRUVfUkVBRCwgZWVfYWRkcik7CisKKworICAgZWVfdmFsdWUgfD0gKFNFRV9NUyArIFNFRV9DUyk7CisgICBlZV9kYXRhID0gMDsKKworICAgZm9yKGkgPSAxOyBpIDw9IDE2OyBpKyspIHsKKworCSAgZWVfdmFsdWUgfD0gU0VFX0NMSzsgICAgICAgICAgLyogQ2xvY2sgIGRhdGEhICovCisJICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCBlZV92YWx1ZSk7CisJICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCBlZV92YWx1ZSk7CisJICBlZV92YWx1ZSAmPSB+U0VFX0NMSzsKKwkgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIGVlX3ZhbHVlKTsKKwkgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIGVlX3ZhbHVlKTsKKworCSAgZWVfZGF0YSA8PD0gMTsKKworCSAgaWYgKFJEX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwpICYgU0VFX0RJKQorCQkgZWVfZGF0YSB8PSAxOworCSAgfQorCisgICBlZV92YWx1ZSAmPSB+KFNFRV9NUyArIFNFRV9DUyk7CisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCAoZWVfdmFsdWUgfCBTRUVfTVMpKTsgLypUdXJuIG9mZiBDUyAqLworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgZWVfdmFsdWUpOyAgIC8qVHVybiBvZmYgTWFzdGVyIFNlbGVjdCAqLworCisgICByZXR1cm4oZWVfZGF0YSk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogU2VuZCBFRSBjb21tYW5kIGFuZCBBZGRyZXNzIHRvIHRoZSBFRVBST00KKyAqCisgKiBEZXNjcmlwdGlvbjogVHJhbnNmZXJzIHRoZSBjb3JyZWN0IGNvbW1hbmQgYW5kIHNlbmRzIHRoZSBhZGRyZXNzCisgKiAgICAgICAgICAgICAgdG8gdGhlIGVlcHJvbS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgdXRpbEVFU2VuZENtZEFkZHIoVVNIT1JUIHBfcG9ydCwgVUNIQVIgZWVfY21kLCBVU0hPUlQgZWVfYWRkcikKKyNlbHNlCit2b2lkIHV0aWxFRVNlbmRDbWRBZGRyKFVMT05HIHBfcG9ydCwgVUNIQVIgZWVfY21kLCBVU0hPUlQgZWVfYWRkcikKKyNlbmRpZgoreworICAgVUNIQVIgZWVfdmFsdWU7CisgICBVQ0hBUiBuYXJyb3dfZmxnOworCisgICBVU0hPUlQgaTsKKworCisgICBuYXJyb3dfZmxnPSAoVUNIQVIpKFJEX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCkgJiBOQVJST1dfU0NTSV9DQVJEKTsKKworCisgICBlZV92YWx1ZSA9IFNFRV9NUzsKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIGVlX3ZhbHVlKTsKKworICAgZWVfdmFsdWUgfD0gU0VFX0NTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IENTIHRvIEVFUFJPTSAqLworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgZWVfdmFsdWUpOworCisKKyAgIGZvcihpID0gMHgwNDsgaSAhPSAwOyBpPj49MSkgeworCisJICBpZiAoaSAmIGVlX2NtZCkKKwkJIGVlX3ZhbHVlIHw9IFNFRV9ETzsKKwkgIGVsc2UKKwkJIGVlX3ZhbHVlICY9IH5TRUVfRE87CisKKwkgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIGVlX3ZhbHVlKTsKKwkgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIGVlX3ZhbHVlKTsKKwkgIGVlX3ZhbHVlIHw9IFNFRV9DTEs7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsb2NrICBkYXRhISAqLworCSAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgZWVfdmFsdWUpOworCSAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgZWVfdmFsdWUpOworCSAgZWVfdmFsdWUgJj0gflNFRV9DTEs7CisJICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCBlZV92YWx1ZSk7CisJICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCBlZV92YWx1ZSk7CisJICB9CisKKworICAgaWYgKG5hcnJvd19mbGcpCisJICBpID0gMHgwMDgwOworCisgICBlbHNlCisJICBpID0gMHgwMjAwOworCisKKyAgIHdoaWxlIChpICE9IDApIHsKKworCSAgaWYgKGkgJiBlZV9hZGRyKQorCQkgZWVfdmFsdWUgfD0gU0VFX0RPOworCSAgZWxzZQorCQkgZWVfdmFsdWUgJj0gflNFRV9ETzsKKworCSAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgZWVfdmFsdWUpOworCSAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgZWVfdmFsdWUpOworCSAgZWVfdmFsdWUgfD0gU0VFX0NMSzsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xvY2sgIGRhdGEhICovCisJICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCBlZV92YWx1ZSk7CisJICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCBlZV92YWx1ZSk7CisJICBlZV92YWx1ZSAmPSB+U0VFX0NMSzsKKwkgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIGVlX3ZhbHVlKTsKKwkgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIGVlX3ZhbHVlKTsKKworCSAgaSA+Pj0gMTsKKwkgIH0KK30KKworVVNIT1JUIENhbGNDcmMxNihVQ0hBUiBidWZmZXJbXSkKK3sKKyAgIFVTSE9SVCBjcmM9MDsKKwlpbnQgaSxqOworICAgVVNIT1JUIGNoOworICAgZm9yIChpPTA7IGkgPCBJRF9TVFJJTkdfTEVOR1RIOyBpKyspCisgICB7CisgICAgICBjaCA9IChVU0hPUlQpIGJ1ZmZlcltpXTsKKwkgICBmb3Ioaj0wOyBqIDwgODsgaisrKQorCSAgIHsKKwkJICAgaWYgKChjcmMgXiBjaCkgJiAxKQorICAgICAgICAgICAgY3JjID0gKGNyYyA+PiAxKSBeIENSQ01BU0s7CisJCSAgIGVsc2UKKyAgICAgICAgICAgIGNyYyA+Pj0gMTsKKwkJICAgY2ggPj49IDE7CisJICAgfQorICAgfQorCXJldHVybihjcmMpOworfQorCitVQ0hBUiBDYWxjTHJjKFVDSEFSIGJ1ZmZlcltdKQoreworCWludCBpOworCVVDSEFSIGxyYzsKKwlscmMgPSAwOworCWZvcihpID0gMDsgaSA8IElEX1NUUklOR19MRU5HVEg7IGkrKykKKwkJbHJjIF49IGJ1ZmZlcltpXTsKKwlyZXR1cm4obHJjKTsKK30KKworCisKKy8qCisgIFRoZSBmb2xsb3dpbmcgaW5saW5lIGRlZmluaXRpb25zIGF2b2lkIHR5cGUgY29uZmxpY3RzLgorKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyCitGbGFzaFBvaW50X19Qcm9iZUhvc3RBZGFwdGVyKHN0cnVjdCBGbGFzaFBvaW50X0luZm8gKkZsYXNoUG9pbnRJbmZvKQoreworICByZXR1cm4gRmxhc2hQb2ludF9Qcm9iZUhvc3RBZGFwdGVyKChQU0NDQk1HUl9JTkZPKSBGbGFzaFBvaW50SW5mbyk7Cit9CisKKworc3RhdGljIGlubGluZSBGbGFzaFBvaW50X0NhcmRIYW5kbGVfVAorRmxhc2hQb2ludF9fSGFyZHdhcmVSZXNldEhvc3RBZGFwdGVyKHN0cnVjdCBGbGFzaFBvaW50X0luZm8gKkZsYXNoUG9pbnRJbmZvKQoreworICByZXR1cm4gRmxhc2hQb2ludF9IYXJkd2FyZVJlc2V0SG9zdEFkYXB0ZXIoKFBTQ0NCTUdSX0lORk8pIEZsYXNoUG9pbnRJbmZvKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitGbGFzaFBvaW50X19SZWxlYXNlSG9zdEFkYXB0ZXIoRmxhc2hQb2ludF9DYXJkSGFuZGxlX1QgQ2FyZEhhbmRsZSkKK3sKKyAgRmxhc2hQb2ludF9SZWxlYXNlSG9zdEFkYXB0ZXIoQ2FyZEhhbmRsZSk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkCitGbGFzaFBvaW50X19TdGFydENDQihGbGFzaFBvaW50X0NhcmRIYW5kbGVfVCBDYXJkSGFuZGxlLCBzdHJ1Y3QgQnVzTG9naWNfQ0NCICpDQ0IpCit7CisgIEZsYXNoUG9pbnRfU3RhcnRDQ0IoQ2FyZEhhbmRsZSwgKFBTQ0NCKSBDQ0IpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorRmxhc2hQb2ludF9fQWJvcnRDQ0IoRmxhc2hQb2ludF9DYXJkSGFuZGxlX1QgQ2FyZEhhbmRsZSwgc3RydWN0IEJ1c0xvZ2ljX0NDQiAqQ0NCKQoreworICBGbGFzaFBvaW50X0Fib3J0Q0NCKENhcmRIYW5kbGUsIChQU0NDQikgQ0NCKTsKK30KKworCitzdGF0aWMgaW5saW5lIGJvb2xlYW4KK0ZsYXNoUG9pbnRfX0ludGVycnVwdFBlbmRpbmcoRmxhc2hQb2ludF9DYXJkSGFuZGxlX1QgQ2FyZEhhbmRsZSkKK3sKKyAgcmV0dXJuIEZsYXNoUG9pbnRfSW50ZXJydXB0UGVuZGluZyhDYXJkSGFuZGxlKTsKK30KKworCitzdGF0aWMgaW5saW5lIGludAorRmxhc2hQb2ludF9fSGFuZGxlSW50ZXJydXB0KEZsYXNoUG9pbnRfQ2FyZEhhbmRsZV9UIENhcmRIYW5kbGUpCit7CisgIHJldHVybiBGbGFzaFBvaW50X0hhbmRsZUludGVycnVwdChDYXJkSGFuZGxlKTsKK30KKworCisjZGVmaW5lIEZsYXNoUG9pbnRfUHJvYmVIb3N0QWRhcHRlcgkgICAgRmxhc2hQb2ludF9fUHJvYmVIb3N0QWRhcHRlcgorI2RlZmluZSBGbGFzaFBvaW50X0hhcmR3YXJlUmVzZXRIb3N0QWRhcHRlciBGbGFzaFBvaW50X19IYXJkd2FyZVJlc2V0SG9zdEFkYXB0ZXIKKyNkZWZpbmUgRmxhc2hQb2ludF9SZWxlYXNlSG9zdEFkYXB0ZXIJICAgIEZsYXNoUG9pbnRfX1JlbGVhc2VIb3N0QWRhcHRlcgorI2RlZmluZSBGbGFzaFBvaW50X1N0YXJ0Q0NCCQkgICAgRmxhc2hQb2ludF9fU3RhcnRDQ0IKKyNkZWZpbmUgRmxhc2hQb2ludF9BYm9ydENDQgkJICAgIEZsYXNoUG9pbnRfX0Fib3J0Q0NCCisjZGVmaW5lIEZsYXNoUG9pbnRfSW50ZXJydXB0UGVuZGluZwkgICAgRmxhc2hQb2ludF9fSW50ZXJydXB0UGVuZGluZworI2RlZmluZSBGbGFzaFBvaW50X0hhbmRsZUludGVycnVwdAkgICAgRmxhc2hQb2ludF9fSGFuZGxlSW50ZXJydXB0CisKKworLyoKKyAgRmxhc2hQb2ludF9JbnF1aXJlVGFyZ2V0SW5mbyByZXR1cm5zIHRoZSBTeW5jaHJvbm91cyBQZXJpb2QsIFN5bmNocm9ub3VzCisgIE9mZnNldCwgYW5kIFdpZGUgVHJhbnNmZXJzIEFjdGl2ZSBpbmZvcm1hdGlvbiBmb3IgVGFyZ2V0SUQgb24gQ2FyZEhhbmRsZS4KKyovCisKK3ZvaWQgRmxhc2hQb2ludF9JbnF1aXJlVGFyZ2V0SW5mbyhGbGFzaFBvaW50X0NhcmRIYW5kbGVfVCBDYXJkSGFuZGxlLAorCQkJCSAgaW50IFRhcmdldElELAorCQkJCSAgdW5zaWduZWQgY2hhciAqU3luY2hyb25vdXNQZXJpb2QsCisJCQkJICB1bnNpZ25lZCBjaGFyICpTeW5jaHJvbm91c09mZnNldCwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKldpZGVUcmFuc2ZlcnNBY3RpdmUpCit7CisgIFNDQ0JNR1JfVEFSX0lORk8gKlRhcmdldEluZm8gPQorICAgICZzY2NiTWdyVGJsWygoU0NDQkNBUkQgKilDYXJkSGFuZGxlKS0+Y2FyZEluZGV4XVtUYXJnZXRJRF07CisgIGlmICgoVGFyZ2V0SW5mby0+VGFyU3luY0N0cmwgJiBTWU5DX09GRlNFVCkgPiAwKQorICAgIHsKKyAgICAgICpTeW5jaHJvbm91c1BlcmlvZCA9IDUgKiAoKFRhcmdldEluZm8tPlRhclN5bmNDdHJsID4+IDUpICsgMSk7CisgICAgICAqU3luY2hyb25vdXNPZmZzZXQgPSBUYXJnZXRJbmZvLT5UYXJTeW5jQ3RybCAmIFNZTkNfT0ZGU0VUOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICpTeW5jaHJvbm91c1BlcmlvZCA9IDA7CisgICAgICAqU3luY2hyb25vdXNPZmZzZXQgPSAwOworICAgIH0KKyAgKldpZGVUcmFuc2ZlcnNBY3RpdmUgPSAoVGFyZ2V0SW5mby0+VGFyU3luY0N0cmwgJiBOQVJST1dfU0NTSSA/IDAgOiAxKTsKK30KKworCisjZWxzZSAgLyogQ09ORklHX1NDU0lfT01JVF9GTEFTSFBPSU5UICovCisKKworLyoKKyAgRGVmaW5lIHByb3RvdHlwZXMgZm9yIHRoZSBGbGFzaFBvaW50IFNDQ0IgTWFuYWdlciBGdW5jdGlvbnMuCisqLworCitleHRlcm4gdW5zaWduZWQgY2hhciBGbGFzaFBvaW50X1Byb2JlSG9zdEFkYXB0ZXIoc3RydWN0IEZsYXNoUG9pbnRfSW5mbyAqKTsKK2V4dGVybiBGbGFzaFBvaW50X0NhcmRIYW5kbGVfVAorICAgICAgIEZsYXNoUG9pbnRfSGFyZHdhcmVSZXNldEhvc3RBZGFwdGVyKHN0cnVjdCBGbGFzaFBvaW50X0luZm8gKik7CitleHRlcm4gdm9pZCBGbGFzaFBvaW50X1N0YXJ0Q0NCKEZsYXNoUG9pbnRfQ2FyZEhhbmRsZV9ULCBzdHJ1Y3QgQnVzTG9naWNfQ0NCICopOworZXh0ZXJuIGludCBGbGFzaFBvaW50X0Fib3J0Q0NCKEZsYXNoUG9pbnRfQ2FyZEhhbmRsZV9ULCBzdHJ1Y3QgQnVzTG9naWNfQ0NCICopOworZXh0ZXJuIGJvb2xlYW4gRmxhc2hQb2ludF9JbnRlcnJ1cHRQZW5kaW5nKEZsYXNoUG9pbnRfQ2FyZEhhbmRsZV9UKTsKK2V4dGVybiBpbnQgRmxhc2hQb2ludF9IYW5kbGVJbnRlcnJ1cHQoRmxhc2hQb2ludF9DYXJkSGFuZGxlX1QpOworZXh0ZXJuIHZvaWQgRmxhc2hQb2ludF9SZWxlYXNlSG9zdEFkYXB0ZXIoRmxhc2hQb2ludF9DYXJkSGFuZGxlX1QpOworZXh0ZXJuIHZvaWQgRmxhc2hQb2ludF9JbnF1aXJlVGFyZ2V0SW5mbyhGbGFzaFBvaW50X0NhcmRIYW5kbGVfVCwKKwkJCQkJIGludCwgdW5zaWduZWQgY2hhciAqLAorCQkJCQkgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICopOworCisKKyNlbmRpZiAvKiBDT05GSUdfU0NTSV9PTUlUX0ZMQVNIUE9JTlQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9LY29uZmlnIGIvZHJpdmVycy9zY3NpL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyYjMyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCkBAIC0wLDAgKzEsMTgwMiBAQAorbWVudSAiU0NTSSBkZXZpY2Ugc3VwcG9ydCIKKworY29uZmlnIFNDU0kKKwl0cmlzdGF0ZSAiU0NTSSBkZXZpY2Ugc3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugd2FudCB0byB1c2UgYSBTQ1NJIGhhcmQgZGlzaywgU0NTSSB0YXBlIGRyaXZlLCBTQ1NJIENELVJPTSBvcgorCSAgYW55IG90aGVyIFNDU0kgZGV2aWNlIHVuZGVyIExpbnV4LCBzYXkgWSBhbmQgbWFrZSBzdXJlIHRoYXQgeW91IGtub3cKKwkgIHRoZSBuYW1lIG9mIHlvdXIgU0NTSSBob3N0IGFkYXB0ZXIgKHRoZSBjYXJkIGluc2lkZSB5b3VyIGNvbXB1dGVyCisJICB0aGF0ICJzcGVha3MiIHRoZSBTQ1NJIHByb3RvY29sLCBhbHNvIGNhbGxlZCBTQ1NJIGNvbnRyb2xsZXIpLAorCSAgYmVjYXVzZSB5b3Ugd2lsbCBiZSBhc2tlZCBmb3IgaXQuCisKKwkgIFlvdSBhbHNvIG5lZWQgdG8gc2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIGRldmljZSB3aGljaCBzcGVha3MKKwkgIHRoZSBTQ1NJIHByb3RvY29sLiAgRXhhbXBsZXMgb2YgdGhpcyBpbmNsdWRlIHRoZSBwYXJhbGxlbCBwb3J0CisJICB2ZXJzaW9uIG9mIHRoZSBJT01FR0EgWklQIGRyaXZlLCBVU0Igc3RvcmFnZSBkZXZpY2VzLCBGaWJyZQorCSAgQ2hhbm5lbCwgRmlyZVdpcmUgc3RvcmFnZSBhbmQgdGhlIElERS1TQ1NJIGVtdWxhdGlvbiBkcml2ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc2NzaS9zY3NpLnR4dD4uCisJICBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNjc2lfbW9kLgorCisJICBIb3dldmVyLCBkbyBub3QgY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlIGlmIHlvdXIgcm9vdCBmaWxlIHN5c3RlbQorCSAgKHRoZSBvbmUgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IC8pIGlzIGxvY2F0ZWQgb24gYSBTQ1NJIGRldmljZS4KKworY29uZmlnIFNDU0lfUFJPQ19GUworCWJvb2wgImxlZ2FjeSAvcHJvYy9zY3NpLyBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0NTSSAmJiBQUk9DX0ZTCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgdmFyaW91cyBmaWxlcyBpbgorCSAgL3Byb2Mvc2NzaS4gIEluIExpbnV4IDIuNiB0aGlzIGhhcyBiZWVuIHN1cGVyY2VlZGVkIGJ5CisJICBmaWxlcyBpbiBzeXNmcyBidXQgbWFueSBsZWdhY3kgYXBwbGljYXRpb25zIHJlbHkgb24gdGhpcy4KKworCSAgSWYgdW51c3VyZSBzYXkgWS4KKworY29tbWVudCAiU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkiCisJZGVwZW5kcyBvbiBTQ1NJCisKK2NvbmZpZyBCTEtfREVWX1NECisJdHJpc3RhdGUgIlNDU0kgZGlzayBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0NTSQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSB3YW50IHRvIHVzZSBTQ1NJIGhhcmQgZGlza3MsIEZpYnJlIENoYW5uZWwgZGlza3MsCisJICBVU0Igc3RvcmFnZSBvciB0aGUgU0NTSSBvciBwYXJhbGxlbCBwb3J0IHZlcnNpb24gb2YKKwkgIHRoZSBJT01FR0EgWklQIGRyaXZlLCBzYXkgWSBhbmQgcmVhZCB0aGUgU0NTSS1IT1dUTywKKwkgIHRoZSBEaXNrLUhPV1RPIGFuZCB0aGUgTXVsdGktRGlzay1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uIFRoaXMgaXMgTk9UIGZvciBTQ1NJCisJICBDRC1ST01zLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvc2NzaS50eHQ+LgorCSAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzZF9tb2QuCisKKwkgIERvIG5vdCBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlIGlmIHlvdXIgcm9vdCBmaWxlIHN5c3RlbQorCSAgKHRoZSBvbmUgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IC8pIGlzIGxvY2F0ZWQgb24gYSBTQ1NJIGRpc2suCisJICBJbiB0aGlzIGNhc2UsIGRvIG5vdCBjb21waWxlIHRoZSBkcml2ZXIgZm9yIHlvdXIgU0NTSSBob3N0IGFkYXB0ZXIKKwkgIChiZWxvdykgYXMgYSBtb2R1bGUgZWl0aGVyLgorCitjb25maWcgQ0hSX0RFVl9TVAorCXRyaXN0YXRlICJTQ1NJIHRhcGUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0kKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugd2FudCB0byB1c2UgYSBTQ1NJIHRhcGUgZHJpdmUgdW5kZXIgTGludXgsIHNheSBZIGFuZCByZWFkIHRoZQorCSAgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4sIGFuZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zY3NpL3N0LnR4dD4gaW4gdGhlIGtlcm5lbCBzb3VyY2UuICBUaGlzIGlzIE5PVAorCSAgZm9yIFNDU0kgQ0QtUk9Ncy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zY3NpL3Njc2kudHh0Pi4gVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzdC4KKworY29uZmlnIENIUl9ERVZfT1NTVAorCXRyaXN0YXRlICJTQ1NJIE9uU3RyZWFtIFNDLXgwIHRhcGUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGUgT25TdHJlYW0gU0MteDAgU0NTSSB0YXBlIGRyaXZlcyBjYW4gbm90IGJlIGRyaXZlbiBieSB0aGUKKwkgIHN0YW5kYXJkIHN0IGRyaXZlciwgYnV0IGluc3RlYWQgbmVlZCB0aGlzIHNwZWNpYWwgb3NzdCBkcml2ZXIgYW5kCisJICB1c2UgdGhlICAvZGV2L29zc3RYIGNoYXIgZGV2aWNlIG5vZGVzIChtYWpvciAyMDYpLiAgVmlhIHVzYi1zdG9yYWdlCisJICBhbmQgaWRlLXNjc2ksIHlvdSBtYXkgYmUgYWJsZSB0byBkcml2ZSB0aGUgVVNCLXgwIGFuZCBESS14MCBkcml2ZXMKKwkgIGFzIHdlbGwuICBOb3RlIHRoYXQgdGhlcmUgaXMgYWxzbyBhIHNlY29uZCBnZW5lcmF0aW9uIG9mIE9uU3RyZWFtCisJICB0YXBlIGRyaXZlcyAoQURSLXgwKSB0aGF0IHN1cHBvcnRzIHRoZSBzdGFuZGFyZCBTQ1NJLTIgY29tbWFuZHMgZm9yCisJICB0YXBlcyAoUUlDLTE1NykgYW5kIGNhbiBiZSBkcml2ZW4gYnkgdGhlIHN0YW5kYXJkIGRyaXZlciBzdC4KKwkgIEZvciBtb3JlIGluZm9ybWF0aW9uLCB5b3UgbWF5IGhhdmUgYSBsb29rIGF0IHRoZSBTQ1NJLUhPV1RPCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+ICBhbmQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc2NzaS9vc3N0LnR4dD4gIGluIHRoZSBrZXJuZWwgc291cmNlLgorCSAgTW9yZSBpbmZvIG9uIHRoZSBPblN0cmVhbSBkcml2ZXIgbWF5IGJlIGZvdW5kIG9uCisJICA8aHR0cDovL2xpbnV4MS5vbnN0cmVhbS5ubC90ZXN0Lz4KKwkgIFBsZWFzZSBhbHNvIGhhdmUgYSBsb29rIGF0IHRoZSBzdGFuZGFyZCBzdCBkb2N1LCBhcyBtb3N0IG9mIGl0CisJICBhcHBsaWVzIHRvIG9zc3QgYXMgd2VsbC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zY3NpL3Njc2kudHh0Pi4gVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBvc3N0LgorCitjb25maWcgQkxLX0RFVl9TUgorCXRyaXN0YXRlICJTQ1NJIENEUk9NIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJCisJLS0taGVscC0tLQorCSAgSWYgeW91IHdhbnQgdG8gdXNlIGEgU0NTSSBvciBGaXJlV2lyZSBDRC1ST00gdW5kZXIgTGludXgsCisJICBzYXkgWSBhbmQgcmVhZCB0aGUgU0NTSS1IT1dUTyBhbmQgdGhlIENEUk9NLUhPV1RPIGF0CisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiBBbHNvIG1ha2Ugc3VyZSB0byBzYXkKKwkgIFkgb3IgTSB0byAiSVNPIDk2NjAgQ0QtUk9NIGZpbGUgc3lzdGVtIHN1cHBvcnQiIGxhdGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvc2NzaS50eHQ+LgorCSAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzcl9tb2QuCisKK2NvbmZpZyBCTEtfREVWX1NSX1ZFTkRPUgorCWJvb2wgIkVuYWJsZSB2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucyAoZm9yIFNDU0kgQ0RST00pIgorCWRlcGVuZHMgb24gQkxLX0RFVl9TUgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgdXNhZ2Ugb2YgdmVuZG9yIHNwZWNpZmljIFNDU0kgY29tbWFuZHMuIFRoaXMgaXMKKwkgIHJlcXVpcmVkIHRvIHN1cHBvcnQgbXVsdGlzZXNzaW9uIENEcyB3aXRoIG9sZCBORUMvVE9TSElCQSBjZHJvbQorCSAgZHJpdmVzIChhbmQgSFAgV3JpdGVycykuIElmIHlvdSBoYXZlIHN1Y2ggYSBkcml2ZSBhbmQgZ2V0IHRoZSBmaXJzdAorCSAgc2Vzc2lvbiBvbmx5LCB0cnkgc2F5aW5nIFkgaGVyZTsgZXZlcnlib2R5IGVsc2Ugc2F5cyBOLgorCitjb25maWcgQ0hSX0RFVl9TRworCXRyaXN0YXRlICJTQ1NJIGdlbmVyaWMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0kKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugd2FudCB0byB1c2UgU0NTSSBzY2FubmVycywgc3ludGhlc2l6ZXJzIG9yIENELXdyaXRlcnMgb3IganVzdAorCSAgYWJvdXQgYW55dGhpbmcgaGF2aW5nICJTQ1NJIiBpbiBpdHMgbmFtZSBvdGhlciB0aGFuIGhhcmQgZGlza3MsCisJICBDRC1ST01zIG9yIHRhcGVzLCBzYXkgWSBoZXJlLiBUaGVzZSB3b24ndCBiZSBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbAorCSAgZGlyZWN0bHksIHNvIHlvdSBuZWVkIHNvbWUgYWRkaXRpb25hbCBzb2Z0d2FyZSB3aGljaCBrbm93cyBob3cgdG8KKwkgIHRhbGsgdG8gdGhlc2UgZGV2aWNlcyB1c2luZyB0aGUgU0NTSSBwcm90b2NvbDoKKworCSAgRm9yIHNjYW5uZXJzLCBsb29rIGF0IFNBTkUgKDxodHRwOi8vd3d3Lm1vc3RhbmcuY29tL3NhbmUvPikuIEZvciBDRAorCSAgd3JpdGVyIHNvZnR3YXJlIGxvb2sgYXQgQ2RydG9vbHMKKwkgICg8aHR0cDovL3d3dy5mb2t1cy5nbWQuZGUvcmVzZWFyY2gvY2MvZ2xvbmUvZW1wbG95ZWVzL2pvZXJnLnNjaGlsbGluZy9wcml2YXRlL2NkcmVjb3JkLmh0bWw+KQorCSAgYW5kIGZvciBidXJuaW5nIGEgImRpc2sgYXQgb25jZSI6IENEUkRBTworCSAgKDxodHRwOi8vY2RyZGFvLnNvdXJjZWZvcmdlLm5ldC8+KS4gQ2RwYXJhbm9pYSBpcyBhIGhpZ2gKKwkgIHF1YWxpdHkgZGlnaXRhbCByZWFkZXIgb2YgYXVkaW8gQ0RzICg8aHR0cDovL3d3dy54aXBoLm9yZy9wYXJhbm9pYS8+KS4KKwkgIEZvciBvdGhlciBkZXZpY2VzLCBpdCdzIHBvc3NpYmxlIHRoYXQgeW91J2xsIGhhdmUgdG8gd3JpdGUgdGhlCisJICBkcml2ZXIgc29mdHdhcmUgeW91cnNlbGYuIFBsZWFzZSByZWFkIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvc2NzaS1nZW5lcmljLnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc2NzaS9zY3NpLnR4dD4uIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2cuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbW1lbnQgIlNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcyIKKwlkZXBlbmRzIG9uIFNDU0kKKworY29uZmlnIFNDU0lfTVVMVElfTFVOCisJYm9vbCAiUHJvYmUgYWxsIExVTnMgb24gZWFjaCBTQ1NJIGRldmljZSIKKwlkZXBlbmRzIG9uIFNDU0kKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIFNDU0kgZGV2aWNlIHRoYXQgc3VwcG9ydHMgbW9yZSB0aGFuIG9uZSBMVU4gKExvZ2ljYWwKKwkgIFVuaXQgTnVtYmVyKSwgZS5nLiBhIENEIGp1a2Vib3gsIGFuZCBvbmx5IG9uZSBMVU4gaXMgZGV0ZWN0ZWQsIHlvdQorCSAgY2FuIHNheSBZIGhlcmUgdG8gZm9yY2UgdGhlIFNDU0kgZHJpdmVyIHRvIHByb2JlIGZvciBtdWx0aXBsZSBMVU5zLgorCSAgQSBTQ1NJIGRldmljZSB3aXRoIG11bHRpcGxlIExVTnMgYWN0cyBsb2dpY2FsbHkgbGlrZSBtdWx0aXBsZSBTQ1NJCisJICBkZXZpY2VzLiBUaGUgdmFzdCBtYWpvcml0eSBvZiBTQ1NJIGRldmljZXMgaGF2ZSBvbmx5IG9uZSBMVU4sIGFuZAorCSAgc28gbW9zdCBwZW9wbGUgY2FuIHNheSBOIGhlcmUuIFRoZSBtYXhfbHVucyBib290L21vZHVsZSBwYXJhbWV0ZXIgCisJICBhbGxvd3MgdG8gb3ZlcnJpZGUgdGhpcyBzZXR0aW5nLgorCitjb25maWcgU0NTSV9DT05TVEFOVFMKKwlib29sICJWZXJib3NlIFNDU0kgZXJyb3IgcmVwb3J0aW5nIChrZXJuZWwgc2l6ZSArPTEySykiCisJZGVwZW5kcyBvbiBTQ1NJCisJaGVscAorCSAgVGhlIGVycm9yIG1lc3NhZ2VzIHJlZ2FyZGluZyB5b3VyIFNDU0kgaGFyZHdhcmUgd2lsbCBiZSBlYXNpZXIgdG8KKwkgIHVuZGVyc3RhbmQgaWYgeW91IHNheSBZIGhlcmU7IGl0IHdpbGwgZW5sYXJnZSB5b3VyIGtlcm5lbCBieSBhYm91dAorCSAgMTIgS0IuIElmIGluIGRvdWJ0LCBzYXkgWS4KKworY29uZmlnIFNDU0lfTE9HR0lORworCWJvb2wgIlNDU0kgbG9nZ2luZyBmYWNpbGl0eSIKKwlkZXBlbmRzIG9uIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGlzIHR1cm5zIG9uIGEgbG9nZ2luZyBmYWNpbGl0eSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlYnVnIGEgbnVtYmVyCisJICBvZiBTQ1NJIHJlbGF0ZWQgcHJvYmxlbXMuCisKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCBubyBsb2dnaW5nIG91dHB1dCB3aWxsIGFwcGVhciBieSBkZWZhdWx0LCBidXQgeW91CisJICBjYW4gZW5hYmxlIGxvZ2dpbmcgYnkgc2F5aW5nIFkgdG8gIi9wcm9jIGZpbGUgc3lzdGVtIHN1cHBvcnQiIGFuZAorCSAgIlN5c2N0bCBzdXBwb3J0IiBiZWxvdyBhbmQgZXhlY3V0aW5nIHRoZSBjb21tYW5kCisKKwkgIGVjaG8gInNjc2kgbG9nIHRva2VuIFtsZXZlbF0iID4gL3Byb2Mvc2NzaS9zY3NpCisKKwkgIGF0IGJvb3QgdGltZSBhZnRlciB0aGUgL3Byb2MgZmlsZSBzeXN0ZW0gaGFzIGJlZW4gbW91bnRlZC4KKworCSAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRoaW5ncyB0aGF0IGNhbiBiZSB1c2VkIGZvciAndG9rZW4nICh5b3UgY2FuCisJICBmaW5kIHRoZW0gaW4gdGhlIHNvdXJjZTogPGZpbGU6ZHJpdmVycy9zY3NpL3Njc2kuYz4pLCBhbmQgdGhpcworCSAgYWxsb3dzIHlvdSB0byBzZWxlY3QgdGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHlvdSB3YW50LCBhbmQgdGhlCisJICBsZXZlbCBhbGxvd3MgeW91IHRvIHNlbGVjdCB0aGUgbGV2ZWwgb2YgdmVyYm9zaXR5LgorCisJICBJZiB5b3Ugc2F5IE4gaGVyZSwgaXQgbWF5IGJlIGhhcmRlciB0byB0cmFjayBkb3duIHNvbWUgdHlwZXMgb2YgU0NTSQorCSAgcHJvYmxlbXMuIElmIHlvdSBzYXkgWSBoZXJlIHlvdXIga2VybmVsIHdpbGwgYmUgc29tZXdoYXQgbGFyZ2VyLCBidXQKKwkgIHRoZXJlIHNob3VsZCBiZSBubyBub3RpY2VhYmxlIHBlcmZvcm1hbmNlIGltcGFjdCBhcyBsb25nIGFzIHlvdSBoYXZlCisJICBsb2dnaW5nIHR1cm5lZCBvZmYuCisKK21lbnUgIlNDU0kgVHJhbnNwb3J0IEF0dHJpYnV0ZXMiCisJZGVwZW5kcyBvbiBTQ1NJCisKK2NvbmZpZyBTQ1NJX1NQSV9BVFRSUworCXRyaXN0YXRlICJQYXJhbGxlbCBTQ1NJIChTUEkpIFRyYW5zcG9ydCBBdHRyaWJ1dGVzIgorCWRlcGVuZHMgb24gU0NTSQorCWhlbHAKKwkgIElmIHlvdSB3aXNoIHRvIGV4cG9ydCB0cmFuc3BvcnQtc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQKKwkgIGVhY2ggYXR0YWNoZWQgU0NTSSBkZXZpY2UgdG8gc3lzZnMsIHNheSBZLiAgT3RoZXJ3aXNlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfRkNfQVRUUlMKKwl0cmlzdGF0ZSAiRmliZXJDaGFubmVsIFRyYW5zcG9ydCBBdHRyaWJ1dGVzIgorCWRlcGVuZHMgb24gU0NTSQorCWhlbHAKKwkgIElmIHlvdSB3aXNoIHRvIGV4cG9ydCB0cmFuc3BvcnQtc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQKKwkgIGVhY2ggYXR0YWNoZWQgRmliZXJDaGFubmVsIGRldmljZSB0byBzeXNmcywgc2F5IFkuCisJICBPdGhlcndpc2UsIHNheSBOLgorCitjb25maWcgU0NTSV9JU0NTSV9BVFRSUworCXRyaXN0YXRlICJpU0NTSSBUcmFuc3BvcnQgQXR0cmlidXRlcyIKKwlkZXBlbmRzIG9uIFNDU0kKKwloZWxwCisJICBJZiB5b3Ugd2lzaCB0byBleHBvcnQgdHJhbnNwb3J0LXNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0CisJICBlYWNoIGF0dGFjaGVkIGlTQ1NJIGRldmljZSB0byBzeXNmcywgc2F5IFkuCisJICBPdGhlcndpc2UsIHNheSBOLgorCitlbmRtZW51CisKK21lbnUgIlNDU0kgbG93LWxldmVsIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBTQ1NJIT1uCisKK2NvbmZpZyBTR0lXRDkzX1NDU0kKKwl0cmlzdGF0ZSAiU0dJIFdEOTNDOTMgU0NTSSBEcml2ZXIiCisJZGVwZW5kcyBvbiBTR0lfSVAyMiAmJiBTQ1NJCisgIAloZWxwCisJICBJZiB5b3UgaGF2ZSBhIFdlc3Rlcm4gRGlnaXRhbCBXRDkzIFNDU0kgY29udHJvbGxlciBvbgorCSAgYW4gU0dJIE1JUFMgc3lzdGVtLCBzYXkgWS4gIE90aGVyd2lzZSwgc2F5IE4uCisKK2NvbmZpZyBTQ1NJX0RFQ05DUgorCXRyaXN0YXRlICJERUMgTkNSNTNDOTQgU2NzaSBEcml2ZXIiCisJZGVwZW5kcyBvbiBNQUNIX0RFQ1NUQVRJT04gJiYgU0NTSSAmJiBUQworCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgTkNSNTNDOTQgU0NTSSBjb250cm9sbGVyIGNoaXBzIG9uIElPQVNJQworCSAgYmFzZWQgVFVSQk9jaGFubmVsIERFQ3N0YXRpb25zIGFuZCBUVVJCT2NoYW5uZWwgUE1BWi1BIGNhcmRzLgorCitjb25maWcgU0NTSV9ERUNTSUkKKwl0cmlzdGF0ZSAiREVDIFNJSSBTY3NpIERyaXZlciIKKwlkZXBlbmRzIG9uIE1BQ0hfREVDU1RBVElPTiAmJiBTQ1NJICYmIE1JUFMzMgorCitjb25maWcgQkxLX0RFVl8zV19YWFhYX1JBSUQKKwl0cmlzdGF0ZSAiM3dhcmUgNS82LzcvOHh4eCBBVEEtUkFJRCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kKKwloZWxwCisJICAzd2FyZSBpcyB0aGUgb25seSBoYXJkd2FyZSBBVEEtUmFpZCBwcm9kdWN0IGluIExpbnV4IHRvIGRhdGUuCisJICBUaGlzIGNhcmQgaXMgMiw0LCBvciA4IGNoYW5uZWwgbWFzdGVyIG1vZGUgc3VwcG9ydCBvbmx5LgorCSAgU0NTSSBzdXBwb3J0IHJlcXVpcmVkISEhCisKKwkgIDxodHRwOi8vd3d3LjN3YXJlLmNvbS8+CisKKwkgIFBsZWFzZSByZWFkIHRoZSBjb21tZW50cyBhdCB0aGUgdG9wIG9mCisJICA8ZmlsZTpkcml2ZXJzL3Njc2kvM3cteHh4eC5jPi4KKworY29uZmlnIFNDU0lfM1dfOVhYWAorCXRyaXN0YXRlICIzd2FyZSA5eHh4IFNBVEEtUkFJRCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgOTAwMCBzZXJpZXMgM3dhcmUgU0FUQS1SQUlEIGNhcmRzLgorCisJICA8aHR0cDovL3d3dy5hbWNjLmNvbT4KKworCSAgUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YKKwkgIDxmaWxlOmRyaXZlcnMvc2NzaS8zdy05eHh4LmM+LgorCitjb25maWcgU0NTSV83MDAwRkFTU1QKKwl0cmlzdGF0ZSAiNzAwMEZBU1NUIFNDU0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElTQSAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIFdlc3Rlcm4gRGlnaXRhbCA3MDAwIFNDU0kgaG9zdCBhZGFwdGVyCisJICBmYW1pbHkuICBTb21lIGluZm9ybWF0aW9uIGlzIGluIHRoZSBzb3VyY2U6CisJICA8ZmlsZTpkcml2ZXJzL3Njc2kvd2Q3MDAwLmM+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3ZDcwMDAuCisKK2NvbmZpZyBTQ1NJX0FDQVJECisJdHJpc3RhdGUgIkFDQVJEIFNDU0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIEFDQVJEIFNDU0kgaG9zdCBhZGFwdGVyLgorCSAgU3VwcG9ydCBDaGlwIDxBVFA4NzAgQVRQODc2IEFUUDg4MCBBVFA4ODU+CisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhdHA4NzB1LgorCitjb25maWcgU0NTSV9BSEExNTJYCisJdHJpc3RhdGUgIkFkYXB0ZWMgQUhBMTUyWC8yODI1IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJU0EgJiYgU0NTSSAmJiAhNjRCSVQKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgQUhBLTE1MTAsIEFIQS0xNTIwLCBBSEEtMTUyMiwgYW5kIEFIQS0yODI1CisJICBTQ1NJIGhvc3QgYWRhcHRlcnMuIEl0IGFsc28gd29ya3MgZm9yIHRoZSBBVkEtMTUwNSwgYnV0IHRoZSBJUlEgZXRjLgorCSAgbXVzdCBiZSBtYW51YWxseSBzcGVjaWZpZWQgaW4gdGhpcyBjYXNlLgorCisJICBJdCBpcyBleHBsYWluZWQgaW4gc2VjdGlvbiAzLjMgb2YgdGhlIFNDU0ktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiBZb3UgbWlnaHQgYWxzbyB3YW50IHRvCisJICByZWFkIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vc2NzaS9haGExNTJ4LnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFoYTE1MnguCisKK2NvbmZpZyBTQ1NJX0FIQTE1NDIKKwl0cmlzdGF0ZSAiQWRhcHRlYyBBSEExNTQyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJU0EgJiYgU0NTSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgYSBTQ1NJIGhvc3QgYWRhcHRlci4gIEl0IGlzIGV4cGxhaW5lZCBpbiBzZWN0aW9uCisJICAzLjQgb2YgdGhlIFNDU0ktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiAgTm90ZSB0aGF0IFRyYW50b3Igd2FzCisJICBwdXJjaGFzZWQgYnkgQWRhcHRlYywgYW5kIHNvbWUgZm9ybWVyIFRyYW50b3IgcHJvZHVjdHMgYXJlIGJlaW5nCisJICBzb2xkIHVuZGVyIHRoZSBBZGFwdGVjIG5hbWUuICBJZiBpdCBkb2Vzbid0IHdvcmsgb3V0IG9mIHRoZSBib3gsIHlvdQorCSAgbWF5IGhhdmUgdG8gY2hhbmdlIHNvbWUgc2V0dGluZ3MgaW4gPGZpbGU6ZHJpdmVycy9zY3NpL2FoYTE1NDIuaD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFoYTE1NDIuCisKK2NvbmZpZyBTQ1NJX0FIQTE3NDAKKwl0cmlzdGF0ZSAiQWRhcHRlYyBBSEExNzQwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBFSVNBICYmIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIGEgU0NTSSBob3N0IGFkYXB0ZXIuICBJdCBpcyBleHBsYWluZWQgaW4gc2VjdGlvbgorCSAgMy41IG9mIHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIElmIGl0IGRvZXNuJ3Qgd29yayBvdXQKKwkgIG9mIHRoZSBib3gsIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2Ugc29tZSBzZXR0aW5ncyBpbgorCSAgPGZpbGU6ZHJpdmVycy9zY3NpL2FoYTE3NDAuaD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFoYTE3NDAuCisKK2NvbmZpZyBTQ1NJX0FBQ1JBSUQKKwl0cmlzdGF0ZSAiQWRhcHRlYyBBQUNSQUlEIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJICYmIFBDSQorCitzb3VyY2UgImRyaXZlcnMvc2NzaS9haWM3eHh4L0tjb25maWcuYWljN3h4eCIKKworY29uZmlnIFNDU0lfQUlDN1hYWF9PTEQKKwl0cmlzdGF0ZSAiQWRhcHRlYyBBSUM3eHh4IHN1cHBvcnQgKG9sZCBkcml2ZXIpIgorCWRlcGVuZHMgb24gKElTQSB8fCBFSVNBIHx8IFBDSSApICYmIFNDU0kKKwloZWxwCisJICBXQVJOSU5HIFRoaXMgZHJpdmVyIGlzIGFuIG9sZGVyIGFpYzd4eHggZHJpdmVyIGFuZCBpcyBubyBsb25nZXIKKwkgIHVuZGVyIGFjdGl2ZSBkZXZlbG9wbWVudC4gIEFkYXB0ZWMsIEluYy4gaXMgd3JpdGluZyBhIG5ldyBkcml2ZXIgdG8KKwkgIHRha2UgdGhlIHBsYWNlIG9mIHRoaXMgb25lLCBhbmQgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB3aGVuZXZlcgorCSAgcG9zc2libGUsIHBlb3BsZSBzaG91bGQgdXNlIHRoZSBuZXcgQWRhcHRlYyB3cml0dGVuIGRyaXZlciBpbnN0ZWFkCisJICBvZiB0aGlzIG9uZS4gIFRoaXMgZHJpdmVyIHdpbGwgZXZlbnR1YWxseSBiZSBwaGFzZWQgb3V0IGVudGlyZWx5LgorCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSB2YXJpb3VzIGFpYzd4eHggYmFzZWQgQWRhcHRlYyBTQ1NJCisJICBjb250cm9sbGVycy4gVGhlc2UgaW5jbHVkZSB0aGUgMjc0eCBFSVNBIGNhcmRzOyAyODR4IFZMQiBjYXJkczsKKwkgIDI5MDIsIDI5MTAsIDI5M3gsIDI5NHgsIDM5NHgsIDM5ODUgYW5kIHNldmVyYWwgb3RoZXIgUENJIGFuZAorCSAgbW90aGVyYm9hcmQgYmFzZWQgU0NTSSBjb250cm9sbGVycyBmcm9tIEFkYXB0ZWMuIEl0IGRvZXMgbm90IHN1cHBvcnQKKwkgIHRoZSBBQUEtMTN4IFJBSUQgY29udHJvbGxlcnMgZnJvbSBBZGFwdGVjLCBub3Igd2lsbCBpdCBsaWtlbHkgZXZlcgorCSAgc3VwcG9ydCB0aGVtLiBJdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSAyOTIwIGNhcmRzIGZyb20gQWRhcHRlYyB0aGF0CisJICB1c2UgdGhlIEZ1dHVyZSBEb21haW4gU0NTSSBjb250cm9sbGVyIGNoaXAuIEZvciB0aG9zZSBjYXJkcywgeW91CisJICBuZWVkIHRoZSAiRnV0dXJlIERvbWFpbiAxNnh4IFNDU0kgc3VwcG9ydCIgZHJpdmVyLgorCisJICBJbiBnZW5lcmFsLCBpZiB0aGUgY29udHJvbGxlciBpcyBiYXNlZCBvbiBhbiBBZGFwdGVjIFNDU0kgY29udHJvbGxlcgorCSAgY2hpcCBmcm9tIHRoZSBhaWM3Nzd4IHNlcmllcyBvciB0aGUgYWljNzh4eCBzZXJpZXMsIHRoaXMgZHJpdmVyCisJICBzaG91bGQgd29yay4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIHRoZSA3ODEwIHdoaWNoIGlzIHNwZWNpZmljYWxseQorCSAgbm90IHN1cHBvcnRlZCAodGhhdCdzIHRoZSBSQUlEIGNvbnRyb2xsZXIgY2hpcCBvbiB0aGUgQUFBLTEzeAorCSAgY2FyZHMpLgorCisJICBOb3RlIHRoYXQgdGhlIEFIQTI5MjAgU0NTSSBob3N0IGFkYXB0ZXIgaXMgKm5vdCogc3VwcG9ydGVkIGJ5IHRoaXMKKwkgIGRyaXZlcjsgY2hvb3NlICJGdXR1cmUgRG9tYWluIDE2eHggU0NTSSBzdXBwb3J0IiBpbnN0ZWFkIGlmIHlvdSBoYXZlCisJICBvbmUgb2YgdGhvc2UuCisKKwkgIEluZm9ybWF0aW9uIG9uIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgY29udHJvbGxlciBjYW4gYmUKKwkgIGZvdW5kIGJ5IGNoZWNraW5nIHRoZSBoZWxwIGZpbGUgZm9yIGVhY2ggb2YgdGhlIGF2YWlsYWJsZQorCSAgY29uZmlndXJhdGlvbiBvcHRpb25zLiBZb3Ugc2hvdWxkIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc2NzaS9haWM3eHh4X29sZC50eHQ+IGF0IGEgbWluaW11bSBiZWZvcmUKKwkgIGNvbnRhY3RpbmcgdGhlIG1haW50YWluZXIgd2l0aCBhbnkgcXVlc3Rpb25zLiAgVGhlIFNDU0ktSE9XVE8sCisJICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LCBjYW4gYWxzbworCSAgYmUgb2YgZ3JlYXQgaGVscC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWljN3h4eF9vbGQuCisKK3NvdXJjZSAiZHJpdmVycy9zY3NpL2FpYzd4eHgvS2NvbmZpZy5haWM3OXh4IgorCisjIEFsbCB0aGUgSTJPIGNvZGUgYW5kIGRyaXZlcnMgZG8gbm90IHNlZW0gdG8gYmUgNjRiaXQgc2FmZS4KK2NvbmZpZyBTQ1NJX0RQVF9JMk8KKwl0cmlzdGF0ZSAiQWRhcHRlYyBJMk8gUkFJRCBzdXBwb3J0ICIKKwlkZXBlbmRzIG9uICE2NEJJVCAmJiBTQ1NJICYmIFBDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGFsbCBvZiBBZGFwdGVjJ3MgSTJPIGJhc2VkIFJBSUQgY29udHJvbGxlcnMgYXMgCisJICB3ZWxsIGFzIHRoZSBEUFQgU21hcnRSYWlkIFYgY2FyZHMuICBUaGlzIGlzIGFuIEFkYXB0ZWMgbWFpbnRhaW5lZAorCSAgZHJpdmVyIGJ5IERlYW5uYSBCb25kcy4gIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvZHB0aS50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBkcHRfaTJvLgorCitjb25maWcgU0NTSV9BRFZBTlNZUworCXRyaXN0YXRlICJBZHZhblN5cyBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiAoSVNBIHx8IEVJU0EgfHwgUENJKSAmJiBTQ1NJICYmIEJST0tFTgorCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIGFsbCBTQ1NJIGhvc3QgYWRhcHRlcnMgbWFudWZhY3R1cmVkIGJ5CisJICBBZHZhblN5cy4gSXQgaXMgZG9jdW1lbnRlZCBpbiB0aGUga2VybmVsIHNvdXJjZSBpbgorCSAgPGZpbGU6ZHJpdmVycy9zY3NpL2FkdmFuc3lzLmM+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZHZhbnN5cy4KKworY29uZmlnIFNDU0lfSU4yMDAwCisJdHJpc3RhdGUgIkFsd2F5cyBJTjIwMDAgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVNBICYmIFNDU0kKKwloZWxwCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIGFuIElTQSBidXMgU0NTSSBob3N0IGFkYXB0ZXIuICBZb3UnbGwgZmluZCBtb3JlCisJICBpbmZvcm1hdGlvbiBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvaW4yMDAwLnR4dD4uIElmIGl0IGRvZXNuJ3Qgd29yaworCSAgb3V0IG9mIHRoZSBib3gsIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2UgdGhlIGp1bXBlcnMgZm9yIElSUSBvcgorCSAgYWRkcmVzcyBzZWxlY3Rpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGluMjAwMC4KKworc291cmNlICJkcml2ZXJzL3Njc2kvbWVnYXJhaWQvS2NvbmZpZy5tZWdhcmFpZCIKKworY29uZmlnIFNDU0lfU0FUQQorCWJvb2wgIlNlcmlhbCBBVEEgKFNBVEEpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgZmFtaWx5IHN1cHBvcnRzIFNlcmlhbCBBVEEgaG9zdCBjb250cm9sbGVycworCSAgYW5kIGRldmljZXMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTQ1NJX1NBVEFfQUhDSQorCXRyaXN0YXRlICJBSENJIFNBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0lfU0FUQSAmJiBQQ0kKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIEFIQ0kgU2VyaWFsIEFUQS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfU0FUQV9TVlcKKwl0cmlzdGF0ZSAiU2VydmVyV29ya3MgRnJvZG8gLyBBcHBsZSBLMiBTQVRBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1NBVEEgJiYgUENJCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBCcm9hZGNvbS9TZXJ2ZXJ3b3Jrcy9BcHBsZSBLMgorCSAgU0FUQSBzdXBwb3J0LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU0NTSV9BVEFfUElJWAorCXRyaXN0YXRlICJJbnRlbCBQSUlYL0lDSCBTQVRBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1NBVEEgJiYgUENJCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBJQ0g1IFNlcmlhbCBBVEEuCisJICBJZiBQQVRBIHN1cHBvcnQgd2FzIGVuYWJsZWQgcHJldmlvdXNseSwgdGhpcyBlbmFibGVzCisJICBzdXBwb3J0IGZvciBzZWxlY3QgSW50ZWwgUElJWC9JQ0ggUEFUQSBob3N0IGNvbnRyb2xsZXJzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU0NTSV9TQVRBX05WCisJdHJpc3RhdGUgIk5WSURJQSBTQVRBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1NBVEEgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgTlZJRElBIFNlcmlhbCBBVEEuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTQ1NJX1NBVEFfUFJPTUlTRQorCXRyaXN0YXRlICJQcm9taXNlIFNBVEEgVFgyL1RYNCBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0NTSV9TQVRBICYmIFBDSQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgUHJvbWlzZSBTZXJpYWwgQVRBIFRYMi9UWDQuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTQ1NJX1NBVEFfUVNUT1IKKwl0cmlzdGF0ZSAiUGFjaWZpYyBEaWdpdGFsIFNBVEEgUVN0b3Igc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0lfU0FUQSAmJiBQQ0kKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIFBhY2lmaWMgRGlnaXRhbCBTZXJpYWwgQVRBIFFTdG9yLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU0NTSV9TQVRBX1NYNAorCXRyaXN0YXRlICJQcm9taXNlIFNBVEEgU1g0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1NBVEEgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgUHJvbWlzZSBTZXJpYWwgQVRBIFNYNC4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfU0FUQV9TSUwKKwl0cmlzdGF0ZSAiU2lsaWNvbiBJbWFnZSBTQVRBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1NBVEEgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgU2lsaWNvbiBJbWFnZSBTZXJpYWwgQVRBLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU0NTSV9TQVRBX1NJUworCXRyaXN0YXRlICJTaVMgOTY0LzE4MCBTQVRBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1NBVEEgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgU2lTIFNlcmlhbCBBVEEgOTY0LzE4MC4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfU0FUQV9VTEkKKwl0cmlzdGF0ZSAiVUxpIEVsZWN0cm9uaWNzIFNBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0lfU0FUQSAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBVTGkgRWxlY3Ryb25pY3MgU0FUQS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfU0FUQV9WSUEKKwl0cmlzdGF0ZSAiVklBIFNBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0lfU0FUQSAmJiBQQ0kKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIFZJQSBTZXJpYWwgQVRBLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU0NTSV9TQVRBX1ZJVEVTU0UKKwl0cmlzdGF0ZSAiVklURVNTRSBWU0MtNzE3NCBTQVRBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1NBVEEgJiYgUENJCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBWaXRlc3NlIFZTQzcxNzQgU2VyaWFsIEFUQS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfQlVTTE9HSUMKKwl0cmlzdGF0ZSAiQnVzTG9naWMgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gKFBDSSB8fCBJU0EgfHwgTUNBKSAmJiBTQ1NJICYmIChCUk9LRU4gfHwgIVNQQVJDNjQpCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciBCdXNMb2dpYyBNdWx0aU1hc3RlciBhbmQgRmxhc2hQb2ludCBTQ1NJIEhvc3QKKwkgIEFkYXB0ZXJzLiBDb25zdWx0IHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPiwgYW5kIHRoZSBmaWxlcworCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zY3NpL0J1c0xvZ2ljLnR4dD4gYW5kCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvRmxhc2hQb2ludC50eHQ+IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBCdXNMb2dpYy4KKworY29uZmlnIFNDU0lfT01JVF9GTEFTSFBPSU5UCisJYm9vbCAiT21pdCBGbGFzaFBvaW50IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX0JVU0xPR0lDCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBvbWl0IHRoZSBGbGFzaFBvaW50IHN1cHBvcnQgZnJvbSB0aGUKKwkgIEJ1c0xvZ2ljIFNDU0kgZHJpdmVyLiBUaGUgRmxhc2hQb2ludCBTQ0NCIE1hbmFnZXIgY29kZSBpcworCSAgc3Vic3RhbnRpYWwsIHNvIHVzZXJzIG9mIE11bHRpTWFzdGVyIEhvc3QgQWRhcHRlcnMgbWF5IHdpc2ggdG8gb21pdAorCSAgaXQuCisKKyMKKyMgVGhpcyBpcyBtYXJrZWQgYnJva2VuIGJlY2F1c2UgaXQgdXNlcyBvdmVyIDRrQiBvZiBzdGFjayBpbgorIyBqdXN0IHR3byByb3V0aW5lczoKKyMgICAgIDIwNzYgIENwcVRzUHJvY2Vzc0lNUUVudHJ5CisjICAgICAyMDUyICBQZWVrSU1RRW50cnkKKyMKK2NvbmZpZyBTQ1NJX0NQUUZDVFMKKwl0cmlzdGF0ZSAiQ29tcGFxIEZpYnJlIENoYW5uZWwgNjQtYml0LzY2TWh6IEhCQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kgJiYgQlJPS0VOCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIGluIHN1cHBvcnQgZm9yIHRoZSBDb21wYXEgU3RvcmFnZVdvcmtzIEZpYnJlCisJICBDaGFubmVsIDY0LWJpdC82Nk1oeiBIb3N0IEJ1cyBBZGFwdGVyLgorCitjb25maWcgU0NTSV9ETVgzMTkxRAorCXRyaXN0YXRlICJETVgzMTkxRCBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSQorCWhlbHAKKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgRG9tZXggRE1YMzE5MUQgU0NTSSBIb3N0IEFkYXB0ZXJzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBkbXgzMTkxZC4KKworY29uZmlnIFNDU0lfRFRDMzI4MAorCXRyaXN0YXRlICJEVEMzMTgwLzMyODAgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVNBICYmIFNDU0kKKwloZWxwCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIERUQyAzMTgwLzMyODAgU0NTSSBIb3N0IEFkYXB0ZXJzLiAgUGxlYXNlIHJlYWQKKwkgIHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPiwgYW5kIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvZHRjM3g4MC50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBkdGMuCisKK2NvbmZpZyBTQ1NJX0VBVEEKKwl0cmlzdGF0ZSAiRUFUQSBJU0EvRUlTQS9QQ0kgKERQVCBhbmQgZ2VuZXJpYyBFQVRBL0RNQS1jb21wbGlhbnQgYm9hcmRzKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gKElTQSB8fCBFSVNBIHx8IFBDSSkgJiYgU0NTSSAmJiAoQlJPS0VOIHx8ICFTUEFSQzY0KQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGFsbCBFQVRBL0RNQS1jb21wbGlhbnQgU0NTSSBob3N0IGFkYXB0ZXJzLiAgRFBUCisJICBJU0EgYW5kIGFsbCBFSVNBIEkvTyBhZGRyZXNzZXMgYXJlIHByb2JlZCBsb29raW5nIGZvciB0aGUgIkVBVEEiCisJICBzaWduYXR1cmUuIFRoZSBhZGRyZXNzZXMgb2YgYWxsIHRoZSBQQ0kgU0NTSSBjb250cm9sbGVycyByZXBvcnRlZAorICAgICAgICAgIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtIGFyZSBwcm9iZWQgYXMgd2VsbC4KKworCSAgWW91IHdhbnQgdG8gcmVhZCB0aGUgc3RhcnQgb2YgPGZpbGU6ZHJpdmVycy9zY3NpL2VhdGEuYz4gYW5kIHRoZQorCSAgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGVhdGEuCisKK2NvbmZpZyBTQ1NJX0VBVEFfVEFHR0VEX1FVRVVFCisJYm9vbCAiZW5hYmxlIHRhZ2dlZCBjb21tYW5kIHF1ZXVlaW5nIgorCWRlcGVuZHMgb24gU0NTSV9FQVRBCisJaGVscAorCSAgVGhpcyBpcyBhIGZlYXR1cmUgb2YgU0NTSS0yIHdoaWNoIGltcHJvdmVzIHBlcmZvcm1hbmNlOiB0aGUgaG9zdAorCSAgYWRhcHRlciBjYW4gc2VuZCBzZXZlcmFsIFNDU0kgY29tbWFuZHMgdG8gYSBkZXZpY2UncyBxdWV1ZSBldmVuIGlmCisJICBwcmV2aW91cyBjb21tYW5kcyBoYXZlbid0IGZpbmlzaGVkIHlldC4KKwkgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgImVhdGE9dGM6eSIgYm9vdCBvcHRpb24uCisKK2NvbmZpZyBTQ1NJX0VBVEFfTElOS0VEX0NPTU1BTkRTCisJYm9vbCAiZW5hYmxlIGVsZXZhdG9yIHNvcnRpbmciCisJZGVwZW5kcyBvbiBTQ1NJX0VBVEEKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGVsZXZhdG9yIHNvcnRpbmcgZm9yIGFsbCBwcm9iZWQgU0NTSSBkaXNrcyBhbmQKKwkgIENELVJPTXMuIEl0IGRlZmluaXRlbHkgcmVkdWNlcyB0aGUgYXZlcmFnZSBzZWVrIGRpc3RhbmNlIHdoZW4gZG9pbmcKKwkgIHJhbmRvbSBzZWVrcywgYnV0IHRoaXMgZG9lcyBub3QgbmVjZXNzYXJpbHkgcmVzdWx0IGluIGEgbm90aWNlYWJsZQorCSAgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQ6IHlvdXIgbWlsZWFnZSBtYXkgdmFyeS4uLgorCSAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSAiZWF0YT1sYzp5IiBib290IG9wdGlvbi4KKworY29uZmlnIFNDU0lfRUFUQV9NQVhfVEFHUworCWludCAibWF4aW11bSBudW1iZXIgb2YgcXVldWVkIGNvbW1hbmRzIgorCWRlcGVuZHMgb24gU0NTSV9FQVRBCisJZGVmYXVsdCAiMTYiCisJaGVscAorCSAgVGhpcyBzcGVjaWZpZXMgaG93IG1hbnkgU0NTSSBjb21tYW5kcyBjYW4gYmUgbWF4aW1hbGx5IHF1ZXVlZCBmb3IKKwkgIGVhY2ggcHJvYmVkIFNDU0kgZGV2aWNlLiBZb3Ugc2hvdWxkIHJlZHVjZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiAxNgorCSAgb25seSBpZiB5b3UgaGF2ZSBkaXNrcyB3aXRoIGJ1Z2d5IG9yIGxpbWl0ZWQgdGFnZ2VkIGNvbW1hbmQgc3VwcG9ydC4KKwkgIE1pbmltdW0gaXMgMiBhbmQgbWF4aW11bSBpcyA2Mi4gVGhpcyB2YWx1ZSBpcyBhbHNvIHRoZSB3aW5kb3cgc2l6ZQorCSAgdXNlZCBieSB0aGUgZWxldmF0b3Igc29ydGluZyBvcHRpb24gYWJvdmUuIFRoZSBlZmZlY3RpdmUgdmFsdWUgdXNlZAorCSAgYnkgdGhlIGRyaXZlciBmb3IgZWFjaCBwcm9iZWQgU0NTSSBkZXZpY2UgaXMgcmVwb3J0ZWQgYXQgYm9vdCB0aW1lLgorCSAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSAiZWF0YT1tcTo4IiBib290IG9wdGlvbi4KKworY29uZmlnIFNDU0lfRUFUQV9QSU8KKwl0cmlzdGF0ZSAiRUFUQS1QSU8gKG9sZCBEUFQgUE0yMDAxLCBQTTIwMTJBKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gKElTQSB8fCBFSVNBIHx8IFBDSSkgJiYgU0NTSSAmJiBCUk9LRU4KKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBhbGwgRUFUQS1QSU8gcHJvdG9jb2wgY29tcGxpYW50IFNDU0kgSG9zdAorCSAgQWRhcHRlcnMgbGlrZSB0aGUgRFBUIFBNMjAwMSBhbmQgdGhlIFBNMjAxMkEuICBFQVRBLURNQSBjb21wbGlhbnQKKwkgIGhvc3QgYWRhcHRlcnMgY291bGQgYWxzbyB1c2UgdGhpcyBkcml2ZXIgYnV0IGFyZSBkaXNjb3VyYWdlZCBmcm9tCisJICBkb2luZyBzbywgc2luY2UgdGhpcyBkcml2ZXIgb25seSBzdXBwb3J0cyBoYXJkIGRpc2tzIGFuZCBsYWNrcworCSAgbnVtZXJvdXMgZmVhdHVyZXMuICBZb3UgbWlnaHQgd2FudCB0byBoYXZlIGEgbG9vayBhdCB0aGUgU0NTSS1IT1dUTywKKwkgIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGVhdGFfcGlvLgorCitjb25maWcgU0NTSV9GVVRVUkVfRE9NQUlOCisJdHJpc3RhdGUgIkZ1dHVyZSBEb21haW4gMTZ4eCBTQ1NJL0FIQS0yOTIwQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gKElTQSB8fCBQQ0kpICYmIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIEZ1dHVyZSBEb21haW4ncyAxNi1iaXQgU0NTSSBob3N0IGFkYXB0ZXJzCisJICAoVE1DLTE2NjAvMTY4MCwgVE1DLTE2NTAvMTY3MCwgVE1DLTMyNjAsIFRNQy0xNjEwTS9NRVIvTUVYKSBhbmQKKwkgIG90aGVyIGFkYXB0ZXJzIGJhc2VkIG9uIHRoZSBGdXR1cmUgRG9tYWluIGNoaXBzZXRzIChRdWFudHVtCisJICBJU0EtMjAwUywgSVNBLTI1ME1HOyBBZGFwdGVjIEFIQS0yOTIwQTsgYW5kIGF0IGxlYXN0IG9uZSBJQk0gYm9hcmQpLgorCSAgSXQgaXMgZXhwbGFpbmVkIGluIHNlY3Rpb24gMy43IG9mIHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgTk9URTogTmV3ZXIgQWRhcHRlYyBBSEEtMjkyMEMgYm9hcmRzIHVzZSB0aGUgQWRhcHRlYyBBSUMtNzg1MCBjaGlwCisJICBhbmQgc2hvdWxkIHVzZSB0aGUgYWljN3h4eCBkcml2ZXIgKCJBZGFwdGVjIEFJQzd4eHggY2hpcHNldCBTQ1NJCisJICBjb250cm9sbGVyIHN1cHBvcnQiKS4gVGhpcyBGdXR1cmUgRG9tYWluIGRyaXZlciB3b3JrcyB3aXRoIHRoZSBvbGRlcgorCSAgQWRhcHRlYyBBSEEtMjkyMEEgYm9hcmRzIHdpdGggYSBGdXR1cmUgRG9tYWluIGNoaXAgb24gdGhlbS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZmRvbWFpbi4KKworY29uZmlnIFNDU0lfRkRfTUNTCisJdHJpc3RhdGUgIkZ1dHVyZSBEb21haW4gTUNTLTYwMC83MDAgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTUNBX0xFR0FDWSAmJiBTQ1NJCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciBGdXR1cmUgRG9tYWluIE1DUyA2MDAvNzAwIE1DQSBTQ1NJIGFkYXB0ZXJzLgorCSAgU29tZSBQUy8yIGNvbXB1dGVycyBhcmUgZXF1aXBwZWQgd2l0aCBJQk0gRmFzdCBTQ1NJIEFkYXB0ZXIvQSB3aGljaAorCSAgaXMgaWRlbnRpY2FsIHRvIHRoZSBNQ1MgNzAwIGFuZCBoZW5jZSBhbHNvIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KKwkgIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydHMgdGhlIFJlcGx5IFNCMTYvU0NTSSBjYXJkICh0aGUgU0NTSSBwYXJ0KS4KKwkgIEl0IHN1cHBvcnRzIG11bHRpcGxlIGFkYXB0ZXJzIGluIHRoZSBzYW1lIHN5c3RlbS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZmRfbWNzLgorCitjb25maWcgU0NTSV9HRFRICisJdHJpc3RhdGUgIkludGVsL0lDUCAoZm9ybWVyIEdEVCBTQ1NJIERpc2sgQXJyYXkpIFJBSUQgQ29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gKElTQSB8fCBFSVNBIHx8IFBDSSkgJiYgU0NTSSAmJiAoQlJPS0VOIHx8ICFTUEFSQzY0KQorCS0tLWhlbHAtLS0KKwkgIEZvcm1lcmx5IGNhbGxlZCBHRFQgU0NTSSBEaXNrIEFycmF5IENvbnRyb2xsZXIgU3VwcG9ydC4KKworCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgUkFJRC9TQ1NJIERpc2sgQXJyYXkgQ29udHJvbGxlcnMgKEVJU0EvSVNBL1BDSSkgCisJICBtYW51ZmFjdHVyZWQgYnkgSW50ZWwgQ29ycG9yYXRpb24vSUNQIHZvcnRleCBHbWJILiBJdCBpcyBkb2N1bWVudGVkCisJICBpbiB0aGUga2VybmVsIHNvdXJjZSBpbiA8ZmlsZTpkcml2ZXJzL3Njc2kvZ2R0aC5jPiBhbmQKKwkgIDxmaWxlOmRyaXZlcnMvc2NzaS9nZHRoLmguPgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnZHRoLgorCitjb25maWcgU0NTSV9HRU5FUklDX05DUjUzODAKKwl0cmlzdGF0ZSAiR2VuZXJpYyBOQ1I1MzgwLzUzYzQwMCBTQ1NJIFBJTyBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVNBICYmIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgb2xkIE5DUiA1M2M4MCBzZXJpZXMgb2YgU0NTSSBjb250cm9sbGVycworCSAgb24gYm9hcmRzIHVzaW5nIFBJTy4gTW9zdCBib2FyZHMgc3VjaCBhcyB0aGUgVHJhbnRvciBUMTMwIGZpdCB0aGlzCisJICBjYXRlZ29yeSwgYWxvbmcgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBJU0EgOGJpdCBjb250cm9sbGVycyBzaGlwcGVkCisJICBmb3IgZnJlZSB3aXRoIFNDU0kgc2Nhbm5lcnMuIElmIHlvdSBoYXZlIGEgUEFTMTYsIFQxMjggb3IgRE1YMzE5MQorCSAgeW91IHNob3VsZCBzZWxlY3QgdGhlIHNwZWNpZmljIGRyaXZlciBmb3IgdGhhdCBjYXJkIHJhdGhlciB0aGFuCisJICBnZW5lcmljIDUzODAgc3VwcG9ydC4KKworCSAgSXQgaXMgZXhwbGFpbmVkIGluIHNlY3Rpb24gMy44IG9mIHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIElmIGl0IGRvZXNuJ3Qgd29yayBvdXQKKwkgIG9mIHRoZSBib3gsIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2Ugc29tZSBzZXR0aW5ncyBpbgorCSAgPGZpbGU6ZHJpdmVycy9zY3NpL2dfTkNSNTM4MC5oPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ19OQ1I1MzgwLgorCitjb25maWcgU0NTSV9HRU5FUklDX05DUjUzODBfTU1JTworCXRyaXN0YXRlICJHZW5lcmljIE5DUjUzODAvNTNjNDAwIFNDU0kgTU1JTyBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVNBICYmIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgb2xkIE5DUiA1M2M4MCBzZXJpZXMgb2YgU0NTSSBjb250cm9sbGVycworCSAgb24gYm9hcmRzIHVzaW5nIG1lbW9yeSBtYXBwZWQgSS9PLiAKKwkgIEl0IGlzIGV4cGxhaW5lZCBpbiBzZWN0aW9uIDMuOCBvZiB0aGUgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uICBJZiBpdCBkb2Vzbid0IHdvcmsgb3V0CisJICBvZiB0aGUgYm94LCB5b3UgbWF5IGhhdmUgdG8gY2hhbmdlIHNvbWUgc2V0dGluZ3MgaW4KKwkgIDxmaWxlOmRyaXZlcnMvc2NzaS9nX05DUjUzODAuaD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdfTkNSNTM4MF9tbWlvLgorCitjb25maWcgU0NTSV9HRU5FUklDX05DUjUzQzQwMAorCWJvb2wgIkVuYWJsZSBOQ1I1M2M0MDAgZXh0ZW5zaW9ucyIKKwlkZXBlbmRzIG9uIFNDU0lfR0VORVJJQ19OQ1I1MzgwCisJaGVscAorCSAgVGhpcyBlbmFibGVzIGNlcnRhaW4gb3B0aW1pemF0aW9ucyBmb3IgdGhlIE5DUjUzYzQwMCBTQ1NJIGNhcmRzLgorCSAgWW91IG1pZ2h0IGFzIHdlbGwgdHJ5IGl0IG91dC4gIE5vdGUgdGhhdCB0aGlzIGRyaXZlciB3aWxsIG9ubHkgcHJvYmUKKwkgIGZvciB0aGUgVHJhbnRvciBUMTMwQiBpbiBpdHMgZGVmYXVsdCBjb25maWd1cmF0aW9uOyB5b3UgbWlnaHQgaGF2ZQorCSAgdG8gcGFzcyBhIGNvbW1hbmQgbGluZSBvcHRpb24gdG8gdGhlIGtlcm5lbCBhdCBib290IHRpbWUgaWYgaXQgZG9lcworCSAgbm90IGRldGVjdCB5b3VyIGNhcmQuICBTZWUgdGhlIGZpbGUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc2NzaS9nX05DUjUzODAudHh0PiBmb3IgZGV0YWlscy4KKworY29uZmlnIFNDU0lfSUJNTUNBCisJdHJpc3RhdGUgIklCTU1DQSBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNQ0FfTEVHQUNZICYmIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBJQk0gU0NTSSBhZGFwdGVyIGZvdW5kIGluIG1hbnkgb2YgdGhlIFBTLzIKKwkgIHNlcmllcyBjb21wdXRlcnMuICBUaGVzZSBtYWNoaW5lcyBoYXZlIGFuIE1DQSBidXMsIHNvIHlvdSBuZWVkIHRvCisJICBhbnN3ZXIgWSB0byAiTUNBIHN1cHBvcnQiIGFzIHdlbGwgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbWNhLnR4dD4uCisKKwkgIElmIHRoZSBhZGFwdGVyIGlzbid0IGZvdW5kIGR1cmluZyBib290IChhIGNvbW1vbiBwcm9ibGVtIGZvciBtb2RlbHMKKwkgIDU2LCA1NywgNzYsIGFuZCA3NykgeW91J2xsIG5lZWQgdG8gdXNlIHRoZSAnaWJtbWNhc2NzaT08cHVuPicga2VybmVsCisJICBvcHRpb24sIHdoZXJlIDxwdW4+IGlzIHRoZSBpZCBvZiB0aGUgU0NTSSBzdWJzeXN0ZW0gKHVzdWFsbHkgNywgYnV0CisJICBpZiB0aGF0IGRvZXNuJ3Qgd29yayBjaGVjayB5b3VyIHJlZmVyZW5jZSBkaXNrZXR0ZSkuICBPd25lcnMgb2YKKwkgIG1vZGVsIDk1IHdpdGggYSBMRUQtbWF0cml4LWRpc3BsYXkgY2FuIGluIGFkZGl0aW9uIGFjdGl2YXRlIHNvbWUKKwkgIGFjdGl2aXR5IGluZm8gbGlrZSB1bmRlciBPUy8yLCBidXQgbW9yZSBpbmZvcm1hdGl2ZSwgYnkgc2V0dGluZworCSAgJ2libW1jYXNjc2k9ZGlzcGxheScgYXMgYW4gYWRkaXRpb25hbCBrZXJuZWwgcGFyYW1ldGVyLiAgVHJ5ICJtYW4KKwkgIGJvb3RwYXJhbSIgb3Igc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgYm9vdCBsb2FkZXIgYWJvdXQgaG93IHRvCisJICBwYXNzIG9wdGlvbnMgdG8gdGhlIGtlcm5lbC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaWJtbWNhLgorCitjb25maWcgSUJNTUNBX1NDU0lfT1JERVJfU1RBTkRBUkQKKwlib29sICJTdGFuZGFyZCBTQ1NJLW9yZGVyIgorCWRlcGVuZHMgb24gU0NTSV9JQk1NQ0EKKwktLS1oZWxwLS0tCisJICBJbiB0aGUgUEMtd29ybGQgYW5kIGluIG1vc3QgbW9kZXJuIFNDU0ktQklPUy1zZXR1cHMsIFNDU0ktaGFyZCBkaXNrcworCSAgYXJlIGFzc2lnbmVkIHRvIHRoZSBkcml2ZSBsZXR0ZXJzLCBzdGFydGluZyB3aXRoIHRoZSBsb3dlc3QgU0NTSS1pZAorCSAgKHBoeXNpY2FsIG51bWJlciAtLSBwdW4pIHRvIGJlIGRyaXZlIEM6LCBhcyBzZWVuIGZyb20gRE9TIGFuZAorCSAgc2ltaWxhciBvcGVyYXRpbmcgc3lzdGVtcy4gV2hlbiBsb29raW5nIGludG8gcGFwZXJzIGRlc2NyaWJpbmcgdGhlCisJICBBTlNJLVNDU0ktc3RhbmRhcmQsIHRoaXMgYXNzaWdubWVudCBvZiBkcml2ZXMgYXBwZWFycyB0byBiZSB3cm9uZy4KKwkgIFRoZSBTQ1NJLXN0YW5kYXJkIGZvbGxvd3MgYSBoYXJkd2FyZS1oaWVyYXJjaHkgd2hpY2ggc2F5cyB0aGF0IGlkIDcKKwkgIGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSBhbmQgaWQgMCB0aGUgbG93ZXN0LiBUaGVyZWZvcmUsIHRoZSBob3N0CisJICBhZGFwdGVycyBhcmUgc3RpbGwgdG9kYXkgZXZlcnl3aGVyZSBwbGFjZWQgYXMgU0NTSS1pZCA3IGJ5IGRlZmF1bHQuCisJICBJbiB0aGUgU0NTSS1zdGFuZGFyZCwgdGhlIGRyaXZlIGxldHRlcnMgZXhwcmVzcyB0aGUgcHJpb3JpdHkgb2YgdGhlCisJICBkaXNrLiBDOiBzaG91bGQgYmUgdGhlIGhhcmQgZGlzaywgb3IgYSBwYXJ0aXRpb24gb24gaXQsIHdpdGggdGhlCisJICBoaWdoZXN0IHByaW9yaXR5LiBUaGlzIG11c3QgdGhlcmVmb3JlIGJlIHRoZSBkaXNrIHdpdGggdGhlIGhpZ2hlc3QKKwkgIFNDU0ktaWQgKGUuZy4gNikgYW5kIG5vdCB0aGUgb25lIHdpdGggdGhlIGxvd2VzdCEgSUJNLUJJT1Mga2VwdCB0aGUKKwkgIG9yaWdpbmFsIGRlZmluaXRpb24gb2YgdGhlIFNDU0ktc3RhbmRhcmQgYXMgYWxzbyBpbmR1c3RyaWFsLSBhbmQKKwkgIHByb2Nlc3MtY29udHJvbC1tYWNoaW5lcywgbGlrZSBWTUUtQ1BVcyBydW5uaW5nIHVuZGVyIHJlYWx0aW1lLU9TZXMKKwkgIChlLmcuIEx5bnhPUywgT1M5KSBkby4KKworCSAgSWYgeW91IGxpa2UgdG8gcnVuIExpbnV4IG9uIHlvdXIgTUNBLW1hY2hpbmUgd2l0aCB0aGUgc2FtZQorCSAgYXNzaWdubWVudCBvZiBoYXJkIGRpc2tzIGFzIHNlZW4gZnJvbSBlLmcuIERPUyBvciBPUy8yIG9uIHlvdXIKKwkgIG1hY2hpbmUsIHdoaWNoIGlzIGluIGFkZGl0aW9uIGNvbmZvcm1hbnQgdG8gdGhlIFNDU0ktc3RhbmRhcmQsIHlvdQorCSAgbXVzdCBzYXkgWSBoZXJlLiBUaGlzIGlzIGFsc28gbmVjZXNzYXJ5IGZvciBNQ0EtTGludXggdXNlcnMgd2hvIHdhbnQKKwkgIHRvIGtlZXAgZG93bndhcmQgY29tcGF0aWJpbGl0eSB0byBvbGRlciByZWxlYXNlcyBvZiB0aGUKKwkgIElCTS1NQ0EtU0NTSS1kcml2ZXIgKG9sZGVyIHRoYW4gZHJpdmVyLXJlbGVhc2UgMi4wMCBhbmQgb2xkZXIgdGhhbgorCSAgSnVuZSAxOTk3KS4KKworCSAgSWYgeW91IGxpa2UgdG8gaGF2ZSB0aGUgbG93ZXN0IFNDU0ktaWQgYXNzaWduZWQgYXMgZHJpdmUgQzosIGFzCisJICBtb2Rlcm4gU0NTSS1CSU9TZXMgZG8sIHdoaWNoIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIHN0YW5kYXJkLCBidXQKKwkgIGlzIHdpZGVzcHJlYWQgYW5kIGNvbW1vbiBpbiB0aGUgUEMtd29ybGQgb2YgdG9kYXksIHlvdSBtdXN0IHNheSBOCisJICBoZXJlLiBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgSUJNTUNBX1NDU0lfREVWX1JFU0VUCisJYm9vbCAiUmVzZXQgU0NTSS1kZXZpY2VzIGF0IGJvb3R0aW1lIgorCWRlcGVuZHMgb24gU0NTSV9JQk1NQ0EKKwktLS1oZWxwLS0tCisJICBCeSBkZWZhdWx0LCBTQ1NJLWRldmljZXMgYXJlIHJlc2V0IHdoZW4gdGhlIG1hY2hpbmUgaXMgcG93ZXJlZCBvbi4KKwkgIEhvd2V2ZXIsIHNvbWUgZGV2aWNlcyBleGlzdCwgbGlrZSBzcGVjaWFsLWNvbnRyb2wtZGV2aWNlcywKKwkgIFNDU0ktQ05DLW1hY2hpbmVzLCBTQ1NJLXByaW50ZXIgb3Igc2Nhbm5lcnMgb2Ygb2xkZXIgdHlwZSwgdGhhdCBkbworCSAgbm90IHJlc2V0IHdoZW4gc3dpdGNoZWQgb24uIElmIHlvdSBzYXkgWSBoZXJlLCBlYWNoIGRldmljZSBjb25uZWN0ZWQKKwkgIHRvIHlvdXIgU0NTSS1idXMgd2lsbCBiZSBpc3N1ZWQgYSByZXNldC1jb21tYW5kIGFmdGVyIGl0IGhhcyBiZWVuCisJICBwcm9iZWQsIHdoaWxlIHRoZSBrZXJuZWwgaXMgYm9vdGluZy4gVGhpcyBtYXkgY2F1c2UgcHJvYmxlbXMgd2l0aAorCSAgbW9yZSBtb2Rlcm4gZGV2aWNlcywgbGlrZSBoYXJkIGRpc2tzLCB3aGljaCBkbyBub3QgYXBwcmVjaWF0ZSB0aGVzZQorCSAgcmVzZXQgY29tbWFuZHMsIGFuZCBjYW4gY2F1c2UgeW91ciBzeXN0ZW0gdG8gaGFuZy4gU28gc2F5IFkgb25seSBpZgorCSAgeW91IGtub3cgdGhhdCBvbmUgb2YgeW91ciBvbGRlciBkZXZpY2VzIG5lZWRzIGl0OyBOIGlzIHRoZSBzYWZlCisJICBhbnN3ZXIuCisKK2NvbmZpZyBTQ1NJX0lQUworCXRyaXN0YXRlICJJQk0gU2VydmVSQUlEIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgdGhlIElCTSBTZXJ2ZVJBSUQgaGFyZHdhcmUgUkFJRCBjb250cm9sbGVycy4KKwkgIFNlZSA8aHR0cDovL3d3dy5kZXZlbG9wZXIuaWJtLmNvbS93ZWxjb21lL25ldGZpbml0eS9zZXJ2ZXJhaWQuaHRtbD4KKwkgIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgSWYgdGhpcyBkcml2ZXIgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkKKwkgIHdpdGhvdXQgbW9kaWZpY2F0aW9uIHBsZWFzZSBjb250YWN0IHRoZSBhdXRob3IgYnkgZW1haWwgYXQKKwkgIDxpcHNsaW51eEBhZGFwdGVjLmNvbT4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlwcy4KKworY29uZmlnIFNDU0lfSUJNVlNDU0kKKwl0cmlzdGF0ZSAiSUJNIFZpcnR1YWwgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUFBDX1BTRVJJRVMgfHwgUFBDX0lTRVJJRVMKKwloZWxwCisJICBUaGlzIGlzIHRoZSBJQk0gUE9XRVIgVmlydHVhbCBTQ1NJIENsaWVudAorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpYm12c2NzaWMuCisKK2NvbmZpZyBTQ1NJX0lOSVRJTworCXRyaXN0YXRlICJJbml0aW8gOTEwMFUoVykgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgSW5pdGlvIDkxWFhVKFcpIFNDU0kgaG9zdCBhZGFwdGVyLiAgUGxlYXNlCisJICByZWFkIHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaW5pdGlvLgorCitjb25maWcgU0NTSV9JTklBMTAwCisJdHJpc3RhdGUgIkluaXRpbyBJTkktQTEwMFUyVyBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kKKwloZWxwCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBJbml0aW8gSU5JLUExMDBVMlcgU0NTSSBob3N0IGFkYXB0ZXIuCisJICBQbGVhc2UgcmVhZCB0aGUgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGExMDB1MncuCisKK2NvbmZpZyBTQ1NJX1BQQQorCXRyaXN0YXRlICJJT01FR0EgcGFyYWxsZWwgcG9ydCAocHBhIC0gb2xkZXIgZHJpdmVzKSIKKwlkZXBlbmRzIG9uIFNDU0kgJiYgUEFSUE9SVAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIG9sZGVyIHZlcnNpb25zIG9mIElPTUVHQSdzIHBhcmFsbGVsIHBvcnQgWklQCisJICBkcml2ZSAoYSAxMDAgTUIgcmVtb3ZhYmxlIG1lZGlhIGRldmljZSkuCisKKwkgIE5vdGUgdGhhdCB5b3UgY2FuIHNheSBOIGhlcmUgaWYgeW91IGhhdmUgdGhlIFNDU0kgdmVyc2lvbiBvZiB0aGUgWklQCisJICBkcml2ZTogaXQgd2lsbCBiZSBzdXBwb3J0ZWQgYXV0b21hdGljYWxseSBpZiB5b3Ugc2FpZCBZIHRvIHRoZQorCSAgZ2VuZXJpYyAiU0NTSSBkaXNrIHN1cHBvcnQiLCBhYm92ZS4KKworCSAgSWYgeW91IGhhdmUgdGhlIFpJUCBQbHVzIGRyaXZlIG9yIGEgbW9yZSByZWNlbnQgcGFyYWxsZWwgcG9ydCBaSVAKKwkgIGRyaXZlIChpZiB0aGUgc3VwcGxpZWQgY2FibGUgd2l0aCB0aGUgZHJpdmUgaXMgbGFiZWxlZCAiQXV0b0RldGVjdCIpCisJICB0aGVuIHlvdSBzaG91bGQgc2F5IE4gaGVyZSBhbmQgWSB0byAiSU9NRUdBIHBhcmFsbGVsIHBvcnQgKGltbSAtCisJICBuZXdlciBkcml2ZXMpIiwgYmVsb3cuCisKKwkgIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZHJpdmVyIGFuZCBob3cgdG8gdXNlIGl0IHlvdSBzaG91bGQKKwkgIHJlYWQgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zY3NpL3BwYS50eHQ+LiAgWW91IHNob3VsZCBhbHNvIHJlYWQKKwkgIHRoZSBTQ1NJLUhPV1RPLCB3aGljaCBpcyBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIElmIHlvdSB1c2UgdGhpcyBkcml2ZXIsCisJICB5b3Ugd2lsbCBzdGlsbCBiZSBhYmxlIHRvIHVzZSB0aGUgcGFyYWxsZWwgcG9ydCBmb3Igb3RoZXIgdGFza3MsCisJICBzdWNoIGFzIGEgcHJpbnRlcjsgaXQgaXMgc2FmZSB0byBjb21waWxlIGJvdGggZHJpdmVycyBpbnRvIHRoZQorCSAga2VybmVsLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwcGEuCisKK2NvbmZpZyBTQ1NJX0lNTQorCXRyaXN0YXRlICJJT01FR0EgcGFyYWxsZWwgcG9ydCAoaW1tIC0gbmV3ZXIgZHJpdmVzKSIKKwlkZXBlbmRzIG9uIFNDU0kgJiYgUEFSUE9SVAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIG5ld2VyIHZlcnNpb25zIG9mIElPTUVHQSdzIHBhcmFsbGVsIHBvcnQgWklQCisJICBkcml2ZSAoYSAxMDAgTUIgcmVtb3ZhYmxlIG1lZGlhIGRldmljZSkuCisKKwkgIE5vdGUgdGhhdCB5b3UgY2FuIHNheSBOIGhlcmUgaWYgeW91IGhhdmUgdGhlIFNDU0kgdmVyc2lvbiBvZiB0aGUgWklQCisJICBkcml2ZTogaXQgd2lsbCBiZSBzdXBwb3J0ZWQgYXV0b21hdGljYWxseSBpZiB5b3Ugc2FpZCBZIHRvIHRoZQorCSAgZ2VuZXJpYyAiU0NTSSBkaXNrIHN1cHBvcnQiLCBhYm92ZS4KKworCSAgSWYgeW91IGhhdmUgdGhlIFpJUCBQbHVzIGRyaXZlIG9yIGEgbW9yZSByZWNlbnQgcGFyYWxsZWwgcG9ydCBaSVAKKwkgIGRyaXZlIChpZiB0aGUgc3VwcGxpZWQgY2FibGUgd2l0aCB0aGUgZHJpdmUgaXMgbGFiZWxlZCAiQXV0b0RldGVjdCIpCisJICB0aGVuIHlvdSBzaG91bGQgc2F5IFkgaGVyZTsgaWYgeW91IGhhdmUgYW4gb2xkZXIgWklQIGRyaXZlLCBzYXkgTgorCSAgaGVyZSBhbmQgWSB0byAiSU9NRUdBIFBhcmFsbGVsIFBvcnQgKHBwYSAtIG9sZGVyIGRyaXZlcykiLCBhYm92ZS4KKworCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkcml2ZXIgYW5kIGhvdyB0byB1c2UgaXQgeW91IHNob3VsZAorCSAgcmVhZCB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvcHBhLnR4dD4uICBZb3Ugc2hvdWxkIGFsc28gcmVhZAorCSAgdGhlIFNDU0ktSE9XVE8sIHdoaWNoIGlzIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiAgSWYgeW91IHVzZSB0aGlzIGRyaXZlciwKKwkgIHlvdSB3aWxsIHN0aWxsIGJlIGFibGUgdG8gdXNlIHRoZSBwYXJhbGxlbCBwb3J0IGZvciBvdGhlciB0YXNrcywKKwkgIHN1Y2ggYXMgYSBwcmludGVyOyBpdCBpcyBzYWZlIHRvIGNvbXBpbGUgYm90aCBkcml2ZXJzIGludG8gdGhlCisJICBrZXJuZWwuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGltbS4KKworY29uZmlnIFNDU0lfSVpJUF9FUFAxNgorCWJvb2wgInBwYS9pbW0gb3B0aW9uIC0gVXNlIHNsb3cgKGJ1dCBzYWZlKSBFUFAtMTYiCisJZGVwZW5kcyBvbiBQQVJQT1JUICYmIChTQ1NJX1BQQSB8fCBTQ1NJX0lNTSkKKwktLS1oZWxwLS0tCisJICBFUFAgKEVuaGFuY2VkIFBhcmFsbGVsIFBvcnQpIGlzIGEgc3RhbmRhcmQgZm9yIHBhcmFsbGVsIHBvcnRzIHdoaWNoCisJICBhbGxvd3MgdGhlbSB0byBhY3QgYXMgZXhwYW5zaW9uIGJ1c2VzIHRoYXQgY2FuIGhhbmRsZSB1cCB0byA2NAorCSAgcGVyaXBoZXJhbCBkZXZpY2VzLgorCisJICBTb21lIHBhcmFsbGVsIHBvcnQgY2hpcHNldHMgYXJlIHNsb3dlciB0aGFuIHRoZWlyIG1vdGhlcmJvYXJkLCBhbmQKKwkgIHNvIHdlIGhhdmUgdG8gY29udHJvbCB0aGUgc3RhdGUgb2YgdGhlIGNoaXBzZXQncyBGSUZPIHF1ZXVlIGV2ZXJ5CisJICBub3cgYW5kIHRoZW4gdG8gYXZvaWQgZGF0YSBsb3NzLiBUaGlzIHdpbGwgYmUgZG9uZSBpZiB5b3Ugc2F5IFkKKwkgIGhlcmUuCisKKwkgIEdlbmVyYWxseSwgc2F5aW5nIFkgaXMgdGhlIHNhZmUgb3B0aW9uIGFuZCBzbG93cyB0aGluZ3MgZG93biBhIGJpdC4KKworY29uZmlnIFNDU0lfSVpJUF9TTE9XX0NUUgorCWJvb2wgInBwYS9pbW0gb3B0aW9uIC0gQXNzdW1lIHNsb3cgcGFycG9ydCBjb250cm9sIHJlZ2lzdGVyIgorCWRlcGVuZHMgb24gUEFSUE9SVCAmJiAoU0NTSV9QUEEgfHwgU0NTSV9JTU0pCisJaGVscAorCSAgU29tZSBwYXJhbGxlbCBwb3J0cyBhcmUga25vd24gdG8gaGF2ZSBleGNlc3NpdmUgZGVsYXlzIGJldHdlZW4KKwkgIGNoYW5naW5nIHRoZSBwYXJhbGxlbCBwb3J0IGNvbnRyb2wgcmVnaXN0ZXIgYW5kIGdvb2QgZGF0YSBiZWluZworCSAgYXZhaWxhYmxlIG9uIHRoZSBwYXJhbGxlbCBwb3J0IGRhdGEvc3RhdHVzIHJlZ2lzdGVyLiBUaGlzIG9wdGlvbgorCSAgZm9yY2VzIGEgc21hbGwgZGVsYXkgKDEuMCB1c2VjIHRvIGJlIGV4YWN0KSBhZnRlciBjaGFuZ2luZyB0aGUKKwkgIGNvbnRyb2wgcmVnaXN0ZXIgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0LiBFbmFibGluZyB0aGlzIG9wdGlvbiBtYXkKKwkgIHJlc3VsdCBpbiBhIGJpZyBkcm9wIGluIHBlcmZvcm1hbmNlIGJ1dCBzb21lIHZlcnkgb2xkIHBhcmFsbGVsIHBvcnRzCisJICAoZm91bmQgaW4gMzg2IHZpbnRhZ2UgbWFjaGluZXMpIHdpbGwgbm90IHdvcmsgcHJvcGVybHkuCisKKwkgIEdlbmVyYWxseSwgc2F5aW5nIE4gaXMgZmluZS4KKworY29uZmlnIFNDU0lfTkNSNTNDNDA2QQorCXRyaXN0YXRlICJOQ1I1M2M0MDZhIFNDU0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElTQSAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgTkNSNTNjNDA2YSBTQ1NJIGhvc3QgYWRhcHRlci4gIEZvciB1c2VyCisJICBjb25maWd1cmFibGUgcGFyYW1ldGVycywgY2hlY2sgb3V0IDxmaWxlOmRyaXZlcnMvc2NzaS9OQ1I1M2M0MDZhLmM+CisJICBpbiB0aGUga2VybmVsIHNvdXJjZS4gIEFsc28gcmVhZCB0aGUgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIE5DUjUzYzQwNi4KKworY29uZmlnIFNDU0lfTkNSX0Q3MDAKKwl0cmlzdGF0ZSAiTkNSIER1YWwgNzAwIE1DQSBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNQ0EgJiYgU0NTSQorCXNlbGVjdCBTQ1NJX1NQSV9BVFRSUworCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBNaWNyb0NoYW5uZWwgRHVhbCA3MDAgY2FyZCBwcm9kdWNlZCBieQorCSAgTkNSIGFuZCBjb21tb25seSB1c2VkIGluIDM0NXgvMzV4eC80MTAwIGNsYXNzIG1hY2hpbmVzLiAgSXQgYWx3YXlzCisJICB0cmllcyB0byBuZWdvdGlhdGUgc3luYyBhbmQgdXNlcyB0YWcgY29tbWFuZCBxdWV1ZWluZy4KKworCSAgVW5sZXNzIHlvdSBoYXZlIGFuIE5DUiBtYW51ZmFjdHVyZWQgbWFjaGluZSwgdGhlIGNoYW5jZXMgYXJlIHRoYXQKKwkgIHlvdSBkbyBub3QgaGF2ZSB0aGlzIFNDU0kgY2FyZCwgc28gc2F5IE4uCisKK2NvbmZpZyA1M0M3MDBfSU9fTUFQUEVECisJYm9vbAorCWRlcGVuZHMgb24gU0NTSV9OQ1JfRDcwMAorCWRlZmF1bHQgeQorCitjb25maWcgU0NTSV9MQVNJNzAwCisJdHJpc3RhdGUgIkhQIExhc2kgU0NTSSBzdXBwb3J0IGZvciA1M2M3MDAvNzEwIgorCWRlcGVuZHMgb24gR1NDICYmIFNDU0kKKwlzZWxlY3QgU0NTSV9TUElfQVRUUlMKKwloZWxwCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgU0NTSSBjb250cm9sbGVyIGluIHRoZSBMYXNpIGNoaXAgZm91bmQgaW4KKwkgIG1hbnkgUEEtUklTQyB3b3Jrc3RhdGlvbnMgJiBzZXJ2ZXJzLiAgSWYgeW91IGRvIG5vdCBrbm93IHdoZXRoZXIgeW91CisJICBoYXZlIGEgTGFzaSBjaGlwLCBpdCBpcyBzYWZlIHRvIHNheSAiWSIgaGVyZS4KKworY29uZmlnIDUzQzcwMF9NRU1fTUFQUEVECisJYm9vbAorCWRlcGVuZHMgb24gU0NTSV9MQVNJNzAwCisJZGVmYXVsdCB5CisKK2NvbmZpZyA1M0M3MDBfTEVfT05fQkUKKwlib29sCisJZGVwZW5kcyBvbiBTQ1NJX0xBU0k3MDAKKwlkZWZhdWx0IHkKKworY29uZmlnIFNDU0lfU1lNNTNDOFhYXzIKKwl0cmlzdGF0ZSAiU1lNNTNDOFhYIFZlcnNpb24gMiBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSQorCXNlbGVjdCBTQ1NJX1NQSV9BVFRSUworCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSB3aG9sZSBOQ1I1M0M4WFgvU1lNNTNDOFhYIGZhbWlseSBvZgorCSAgUENJLVNDU0kgY29udHJvbGxlcnMuICBJdCBhbHNvIHN1cHBvcnRzIHRoZSBzdWJzZXQgb2YgTFNJNTNDMTBYWAorCSAgVWx0cmEtMTYwIGNvbnRyb2xsZXJzIHRoYXQgYXJlIGJhc2VkIG9uIHRoZSBTWU01M0M4WFggU0NSSVBUUworCSAgbGFuZ3VhZ2UuICBJdCBkb2VzIG5vdCBzdXBwb3J0IExTSTUzQzEwWFggVWx0cmEtMzIwIFBDSS1YIFNDU0kKKwkgIGNvbnRyb2xsZXJzOyB5b3UgbmVlZCB0byB1c2UgdGhlIEZ1c2lvbiBNUFQgZHJpdmVyIGZvciB0aGF0LgorCisJICBQbGVhc2UgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvc3ltNTNjOHh4XzIudHh0PiBmb3IgbW9yZQorCSAgaW5mb3JtYXRpb24uCisKK2NvbmZpZyBTQ1NJX1NZTTUzQzhYWF9ETUFfQUREUkVTU0lOR19NT0RFCisJaW50ICJETUEgYWRkcmVzc2luZyBtb2RlIgorCWRlcGVuZHMgb24gU0NTSV9TWU01M0M4WFhfMgorCWRlZmF1bHQgIjEiCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gb25seSBhcHBsaWVzIHRvIFBDSS1TQ1NJIGNoaXBzIHRoYXQgYXJlIFBDSSBEQUMKKwkgIGNhcGFibGUgKDg3NUEsIDg5NUEsIDg5NiwgMTAxMC0zMywgMTAxMC02NiwgMTAwMCkuCisKKwkgIFdoZW4gc2V0IHRvIDAsIHRoZSBkcml2ZXIgd2lsbCBwcm9ncmFtIHRoZSBjaGlwIHRvIG9ubHkgcGVyZm9ybQorCSAgMzItYml0IERNQS4gIFdoZW4gc2V0IHRvIDEsIHRoZSBjaGlwIHdpbGwgYmUgYWJsZSB0byBwZXJmb3JtIERNQQorCSAgdG8gYWRkcmVzc2VzIHVwIHRvIDFUQi4gIFdoZW4gc2V0IHRvIDIsIHRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlCisJICBmdWxsIDY0LWJpdCBETUEgYWRkcmVzcyByYW5nZSwgYnV0IGNhbiBvbmx5IGFkZHJlc3MgMTYgc2VnbWVudHMKKwkgIG9mIDQgR0IgZWFjaC4gIFRoaXMgbGltaXRzIHRoZSB0b3RhbCBhZGRyZXNzYWJsZSByYW5nZSB0byA2NCBHQi4KKworCSAgTW9zdCBtYWNoaW5lcyB3aXRoIGxlc3MgdGhhbiA0R0Igb2YgbWVtb3J5IHNob3VsZCB1c2UgYSBzZXR0aW5nCisJICBvZiAwIGZvciBiZXN0IHBlcmZvcm1hbmNlLiAgSWYgeW91ciBtYWNoaW5lIGhhcyA0R0Igb2YgbWVtb3J5CisJICBvciBtb3JlLCB5b3Ugc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byAxICh0aGUgZGVmYXVsdCkuCisKKwkgIFRoZSBzdGlsbCBleHBlcmltZW50YWwgdmFsdWUgMiAoNjQgYml0IERNQSBhZGRyZXNzaW5nIHdpdGggMTYKKwkgIHggNEdCIHNlZ21lbnRzIGxpbWl0YXRpb24pIGNhbiBiZSB1c2VkIG9uIHN5c3RlbXMgdGhhdCByZXF1aXJlCisJICBQQ0kgYWRkcmVzcyBiaXRzIHBhc3QgYml0IDM5IHRvIGJlIHNldCBmb3IgdGhlIGFkZHJlc3Npbmcgb2YKKwkgIG1lbW9yeSB1c2luZyBQQ0kgREFDIGN5Y2xlcy4KKworY29uZmlnIFNDU0lfU1lNNTNDOFhYX0RFRkFVTFRfVEFHUworCWludCAiZGVmYXVsdCB0YWdnZWQgY29tbWFuZCBxdWV1ZSBkZXB0aCIKKwlkZXBlbmRzIG9uIFNDU0lfU1lNNTNDOFhYXzIKKwlkZWZhdWx0ICIxNiIKKwloZWxwCisJICBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb21tYW5kIHF1ZXVlIGRlcHRoIHRoZQorCSAgZHJpdmVyIHdpbGwgYW5ub3VuY2UgdG8gdGhlIGdlbmVyaWMgU0NTSSBsYXllciBmb3IgZGV2aWNlcworCSAgdGhhdCBzdXBwb3J0IHRhZ2dlZCBjb21tYW5kIHF1ZXVlaW5nLiBUaGlzIHZhbHVlIGNhbiBiZSBjaGFuZ2VkCisJICBmcm9tIHRoZSBib290IGNvbW1hbmQgbGluZS4gIFRoaXMgaXMgYSBzb2Z0IGxpbWl0IHRoYXQgY2Fubm90CisJICBleGNlZWQgQ09ORklHX1NDU0lfU1lNNTNDOFhYX01BWF9UQUdTLgorCitjb25maWcgU0NTSV9TWU01M0M4WFhfTUFYX1RBR1MKKwlpbnQgIm1heGltdW0gbnVtYmVyIG9mIHF1ZXVlZCBjb21tYW5kcyIKKwlkZXBlbmRzIG9uIFNDU0lfU1lNNTNDOFhYXzIKKwlkZWZhdWx0ICI2NCIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbW1hbmRzCisJICB0aGF0IGNhbiBiZSBxdWV1ZWQgdG8gYW55IGRldmljZSwgd2hlbiB0YWdnZWQgY29tbWFuZCBxdWV1aW5nIGlzCisJICBwb3NzaWJsZS4gVGhlIGRyaXZlciBzdXBwb3J0cyB1cCB0byAyNTYgcXVldWVkIGNvbW1hbmRzIHBlciBkZXZpY2UuCisJICBUaGlzIHZhbHVlIGlzIHVzZWQgYXMgYSBjb21waWxlZC1pbiBoYXJkIGxpbWl0LgorCitjb25maWcgU0NTSV9TWU01M0M4WFhfSU9NQVBQRUQKKwlib29sICJ1c2UgcG9ydCBJTyIKKwlkZXBlbmRzIG9uIFNDU0lfU1lNNTNDOFhYXzIKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlIGRyaXZlciB3aWxsIHVzZSBwb3J0IElPIHRvIGFjY2VzcworCSAgdGhlIGNhcmQuICBUaGlzIGlzIHNpZ25pZmljYW50bHkgc2xvd2VyIHRoZW4gdXNpbmcgbWVtb3J5CisJICBtYXBwZWQgSU8uICBNb3N0IHBlb3BsZSBzaG91bGQgYW5zd2VyIE4uCisKK2NvbmZpZyBTQ1NJX0lQUgorCXRyaXN0YXRlICJJQk0gUG93ZXIgTGludXggUkFJRCBhZGFwdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSQorCXNlbGVjdCBGV19MT0FERVIKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgSUJNIFBvd2VyIExpbnV4IGZhbWlseSBSQUlEIGFkYXB0ZXJzLgorCSAgVGhpcyBpbmNsdWRlcyBJQk0gcFNlcmllcyA1NzEyLCA1NzAzLCA1NzA5LCBhbmQgNTcwQSwgYXMgd2VsbAorCSAgYXMgSUJNIGlTZXJpZXMgNTcwMiwgNTcwMywgNTcwOSwgYW5kIDU3MEEuCisKK2NvbmZpZyBTQ1NJX0lQUl9UUkFDRQorCWJvb2wgImVuYWJsZSBkcml2ZXIgaW50ZXJuYWwgdHJhY2UiCisJZGVwZW5kcyBvbiBTQ1NJX0lQUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUgZHJpdmVyIHdpbGwgdHJhY2UgYWxsIGNvbW1hbmRzIGlzc3VlZAorCSAgdG8gdGhlIGFkYXB0ZXIuIFBlcmZvcm1hbmNlIGltcGFjdCBpcyBtaW5pbWFsLiBUcmFjZSBjYW4gYmUKKwkgIGR1bXBlZCB1c2luZyAvc3lzL2J1cy9jbGFzcy9zY3NpX2hvc3QvaG9zdFhYL3RyYWNlLgorCitjb25maWcgU0NTSV9JUFJfRFVNUAorCWJvb2wgImVuYWJsZSBhZGFwdGVyIGR1bXAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0lfSVBSCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBkcml2ZXIgd2lsbCBzdXBwb3J0IGFkYXB0ZXIgY3Jhc2ggZHVtcC4KKwkgIElmIHlvdSBlbmFibGUgdGhpcyBzdXBwb3J0LCB0aGUgaXByZHVtcCBkYWVtb24gY2FuIGJlIHVzZWQKKwkgIHRvIGNhcHR1cmUgYWRhcHRlciBmYWlsdXJlIGFuYWx5c2lzIGluZm9ybWF0aW9uLgorCitjb25maWcgU0NTSV9aQUxPTgorCXRyaXN0YXRlICJaYWxvbiBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBHU0MgJiYgU0NTSQorCXNlbGVjdCBTQ1NJX1NQSV9BVFRSUworCWhlbHAKKwkgIFRoZSBaYWxvbiBpcyBhIEdTQy9IU0MgYnVzIGludGVyZmFjZSBjaGlwIHRoYXQgc2l0cyBiZXR3ZWVuIHRoZQorCSAgUEEtUklTQyBwcm9jZXNzb3IgYW5kIHRoZSBOQ1IgNTNjNzIwIFNDU0kgY29udHJvbGxlciBvbiBDMTAwLAorCSAgQzExMCwgSjIwMCwgSjIxMCBhbmQgc29tZSBELCBLICYgUi1jbGFzcyBtYWNoaW5lcy4gIEl0J3MgYWxzbworCSAgdXNlZCBvbiB0aGUgYWRkLWluIEJsdWVmaXNoLCBCYXJyYWN1ZGEgJiBTaHJpa2UgU0NTSSBjYXJkcy4KKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgb25lIG9mIHRoZXNlIG1hY2hpbmVzIG9yIGNhcmRzLgorCitjb25maWcgU0NTSV9OQ1JfUTcyMAorCXRyaXN0YXRlICJOQ1IgUXVhZCA3MjAgTUNBIFNDU0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE1DQSAmJiBTQ1NJCisJc2VsZWN0IFNDU0lfU1BJX0FUVFJTCisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIE1pY3JvQ2hhbm5lbCBRdWFkIDcyMCBjYXJkIHByb2R1Y2VkIGJ5CisJICBOQ1IgYW5kIGNvbW1vbmx5IHVzZWQgaW4gMzQ1eC8zNXh4LzQxMDAgY2xhc3MgbWFjaGluZXMuICBJdCBhbHdheXMKKwkgIHRyaWVzIHRvIG5lZ290aWF0ZSBzeW5jIGFuZCB1c2VzIHRhZyBjb21tYW5kIHF1ZXVlaW5nLgorCisJICBVbmxlc3MgeW91IGhhdmUgYW4gTkNSIG1hbnVmYWN0dXJlZCBtYWNoaW5lLCB0aGUgY2hhbmNlcyBhcmUgdGhhdAorCSAgeW91IGRvIG5vdCBoYXZlIHRoaXMgU0NTSSBjYXJkLCBzbyBzYXkgTi4KKworY29uZmlnIFNDU0lfTkNSNTNDOFhYX0RFRkFVTFRfVEFHUworCWludCAiICBkZWZhdWx0IHRhZ2dlZCBjb21tYW5kIHF1ZXVlIGRlcHRoIgorCWRlcGVuZHMgb24gU0NTSV9aQUxPTiB8fCBTQ1NJX05DUl9RNzIwCisJZGVmYXVsdCAiOCIKKwktLS1oZWxwLS0tCisJICAiVGFnZ2VkIGNvbW1hbmQgcXVldWluZyIgaXMgYSBmZWF0dXJlIG9mIFNDU0ktMiB3aGljaCBpbXByb3ZlcworCSAgcGVyZm9ybWFuY2U6IHRoZSBob3N0IGFkYXB0ZXIgY2FuIHNlbmQgc2V2ZXJhbCBTQ1NJIGNvbW1hbmRzIHRvIGEKKwkgIGRldmljZSdzIHF1ZXVlIGV2ZW4gaWYgcHJldmlvdXMgY29tbWFuZHMgaGF2ZW4ndCBmaW5pc2hlZCB5ZXQuCisJICBCZWNhdXNlIHRoZSBkZXZpY2UgaXMgaW50ZWxsaWdlbnQsIGl0IGNhbiBvcHRpbWl6ZSBpdHMgb3BlcmF0aW9ucworCSAgKGxpa2UgaGVhZCBwb3NpdGlvbmluZykgYmFzZWQgb24gaXRzIG93biByZXF1ZXN0IHF1ZXVlLiBTb21lIFNDU0kKKwkgIGRldmljZXMgZG9uJ3QgaW1wbGVtZW50IHRoaXMgcHJvcGVybHk7IGlmIHlvdSB3YW50IHRvIGRpc2FibGUgdGhpcworCSAgZmVhdHVyZSwgZW50ZXIgMCBvciAxIGhlcmUgKGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoKS4KKworCSAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgOCBhbmQgc2hvdWxkIGJlIHN1cHBvcnRlZCBieSBtb3N0IGhhcmQgZGlza3MuCisJICBUaGlzIHZhbHVlIGNhbiBiZSBvdmVycmlkZGVuIGZyb20gdGhlIGJvb3QgY29tbWFuZCBsaW5lIHVzaW5nIHRoZQorCSAgJ3RhZ3MnIG9wdGlvbiBhcyBmb2xsb3dzIChleGFtcGxlKToKKwkgICduY3I1M2M4eHg9dGFnczo0L3QydDNxMTYvdDB1MnExMCcgd2lsbCBzZXQgZGVmYXVsdCBxdWV1ZSBkZXB0aCB0bworCSAgNCwgc2V0IHF1ZXVlIGRlcHRoIHRvIDE2IGZvciB0YXJnZXQgMiBhbmQgdGFyZ2V0IDMgb24gY29udHJvbGxlciAwCisJICBhbmQgc2V0IHF1ZXVlIGRlcHRoIHRvIDEwIGZvciB0YXJnZXQgMCAvIGx1biAyIG9uIGNvbnRyb2xsZXIgMS4KKworCSAgVGhlIG5vcm1hbCBhbnN3ZXIgdGhlcmVmb3JlIGlzIHRvIGdvIHdpdGggdGhlIGRlZmF1bHQgOCBhbmQgdG8gdXNlCisJICBhIGJvb3QgY29tbWFuZCBsaW5lIG9wdGlvbiBmb3IgZGV2aWNlcyB0aGF0IG5lZWQgdG8gdXNlIGEgZGlmZmVyZW50CisJICBjb21tYW5kIHF1ZXVlIGRlcHRoLgorCisJICBUaGVyZSBpcyBubyBzYWZlIG9wdGlvbiBvdGhlciB0aGFuIHVzaW5nIGdvb2QgU0NTSSBkZXZpY2VzLgorCitjb25maWcgU0NTSV9OQ1I1M0M4WFhfTUFYX1RBR1MKKwlpbnQgIiAgbWF4aW11bSBudW1iZXIgb2YgcXVldWVkIGNvbW1hbmRzIgorCWRlcGVuZHMgb24gU0NTSV9aQUxPTiB8fCBTQ1NJX05DUl9RNzIwCisJZGVmYXVsdCAiMzIiCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21tYW5kcworCSAgdGhhdCBjYW4gYmUgcXVldWVkIHRvIGFueSBkZXZpY2UsIHdoZW4gdGFnZ2VkIGNvbW1hbmQgcXVldWluZyBpcworCSAgcG9zc2libGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDMyLiBNaW5pbXVtIGlzIDIsIG1heGltdW0gaXMgNjQuCisJICBNb2Rlcm4gaGFyZCBkaXNrcyBhcmUgYWJsZSB0byBzdXBwb3J0IDY0IHRhZ3MgYW5kIGV2ZW4gbW9yZSwgYnV0CisJICBkbyBub3Qgc2VlbSB0byBiZSBmYXN0ZXIgd2hlbiBtb3JlIHRoYW4gMzIgdGFncyBhcmUgYmVpbmcgdXNlZC4KKworCSAgU28sIHRoZSBub3JtYWwgYW5zd2VyIGhlcmUgaXMgdG8gZ28gd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZSAzMiB1bmxlc3MKKwkgIHlvdSBhcmUgdXNpbmcgdmVyeSBsYXJnZSBoYXJkIGRpc2tzIHdpdGggbGFyZ2UgY2FjaGUgKD49IDEgTUIpIHRoYXQKKwkgIGFyZSBhYmxlIHRvIHRha2UgYWR2YW50YWdlIG9mIG1vcmUgdGhhbiAzMiB0YWdnZWQgY29tbWFuZHMuCisKKwkgIFRoZXJlIGlzIG5vIHNhZmUgb3B0aW9uIGFuZCB0aGUgZGVmYXVsdCBhbnN3ZXIgaXMgcmVjb21tZW5kZWQuCisKK2NvbmZpZyBTQ1NJX05DUjUzQzhYWF9TWU5DCisJaW50ICIgIHN5bmNocm9ub3VzIHRyYW5zZmVycyBmcmVxdWVuY3kgaW4gTUh6IgorCWRlcGVuZHMgb24gU0NTSV9aQUxPTiB8fCBTQ1NJX05DUl9RNzIwCisJZGVmYXVsdCAiMjAiCisJLS0taGVscC0tLQorCSAgVGhlIFNDU0kgUGFyYWxsZWwgSW50ZXJmYWNlLTIgU3RhbmRhcmQgZGVmaW5lcyA1IGNsYXNzZXMgb2YgdHJhbnNmZXIKKwkgIHJhdGVzOiBGQVNULTUsIEZBU1QtMTAsIEZBU1QtMjAsIEZBU1QtNDAgYW5kIEZBU1QtODAuICBUaGUgbnVtYmVycworCSAgYXJlIHJlc3BlY3RpdmVseSB0aGUgbWF4aW11bSBkYXRhIHRyYW5zZmVyIHJhdGVzIGluIG1lZ2EtdHJhbnNmZXJzCisJICBwZXIgc2Vjb25kIGZvciBlYWNoIGNsYXNzLiAgRm9yIGV4YW1wbGUsIGEgRkFTVC0yMCBXaWRlIDE2IGRldmljZSBpcworCSAgYWJsZSB0byB0cmFuc2ZlciBkYXRhIGF0IDIwIG1pbGxpb24gMTYgYml0IHBhY2tldHMgcGVyIHNlY29uZCBmb3IgYQorCSAgdG90YWwgcmF0ZSBvZiA0MCBNQi9zLgorCisJICBZb3UgbWF5IHNwZWNpZnkgMCBpZiB5b3Ugd2FudCB0byBvbmx5IHVzZSBhc3luY2hyb25vdXMgZGF0YQorCSAgdHJhbnNmZXJzLiBUaGlzIGlzIHRoZSBzYWZlc3QgYW5kIHNsb3dlc3Qgb3B0aW9uLiBPdGhlcndpc2UsIHNwZWNpZnkKKwkgIGEgdmFsdWUgYmV0d2VlbiA1IGFuZCA4MCwgZGVwZW5kaW5nIG9uIHRoZSBjYXBhYmlsaXR5IG9mIHlvdXIgU0NTSQorCSAgY29udHJvbGxlci4gIFRoZSBoaWdoZXIgdGhlIG51bWJlciwgdGhlIGZhc3RlciB0aGUgZGF0YSB0cmFuc2Zlci4KKwkgIE5vdGUgdGhhdCA4MCBzaG91bGQgbm9ybWFsbHkgYmUgb2sgc2luY2UgdGhlIGRyaXZlciBkZWNyZWFzZXMgdGhlCisJICB2YWx1ZSBhdXRvbWF0aWNhbGx5IGFjY29yZGluZyB0byB0aGUgY29udHJvbGxlcidzIGNhcGFiaWxpdGllcy4KKworCSAgWW91ciBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiBpcyBpZ25vcmVkIGZvciBjb250cm9sbGVycyB3aXRoIE5WUkFNLAorCSAgc2luY2UgdGhlIGRyaXZlciB3aWxsIGdldCB0aGlzIGluZm9ybWF0aW9uIGZyb20gdGhlIHVzZXIgc2V0LXVwLiAgSXQKKwkgIGFsc28gY2FuIGJlIG92ZXJyaWRkZW4gdXNpbmcgYSBib290IHNldHVwIG9wdGlvbiwgYXMgZm9sbG93cworCSAgKGV4YW1wbGUpOiAnbmNyNTNjOHh4PXN5bmM6MTInIHdpbGwgYWxsb3cgdGhlIGRyaXZlciB0byBuZWdvdGlhdGUKKwkgIGZvciBGQVNULTIwIHN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXIgKDIwIG1lZ2EtdHJhbnNmZXJzIHBlcgorCSAgc2Vjb25kKS4KKworCSAgVGhlIG5vcm1hbCBhbnN3ZXIgdGhlcmVmb3JlIGlzIG5vdCB0byBnbyB3aXRoIHRoZSBkZWZhdWx0IGJ1dCB0bworCSAgc2VsZWN0IHRoZSBtYXhpbXVtIHZhbHVlIDgwIGFsbG93aW5nIHRoZSBkcml2ZXIgdG8gdXNlIHRoZSBtYXhpbXVtCisJICB2YWx1ZSBzdXBwb3J0ZWQgYnkgZWFjaCBjb250cm9sbGVyLiBJZiB0aGlzIGNhdXNlcyBwcm9ibGVtcyB3aXRoCisJICB5b3VyIFNDU0kgZGV2aWNlcywgeW91IHNob3VsZCBjb21lIGJhY2sgYW5kIGRlY3JlYXNlIHRoZSB2YWx1ZS4KKworCSAgVGhlcmUgaXMgbm8gc2FmZSBvcHRpb24gb3RoZXIgdGhhbiB1c2luZyBnb29kIGNhYmxpbmcsIHJpZ2h0CisJICB0ZXJtaW5hdGlvbnMgYW5kIFNDU0kgY29uZm9ybWFudCBkZXZpY2VzLgorCitjb25maWcgU0NTSV9OQ1I1M0M4WFhfUFJPRklMRQorCWJvb2wgIiAgZW5hYmxlIHByb2ZpbGluZyIKKwlkZXBlbmRzIG9uIFNDU0lfWkFMT04gfHwgU0NTSV9OQ1JfUTcyMAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gZW5hYmxlIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBnYXRoZXJpbmcuCisJICBUaGVzZSBzdGF0aXN0aWNzIGFyZSBub3QgdmVyeSBhY2N1cmF0ZSBkdWUgdG8gdGhlIGxvdyBmcmVxdWVuY3kKKwkgIG9mIHRoZSBrZXJuZWwgY2xvY2sgKDEwMCBIeiBvbiBpMzg2KSBhbmQgaGF2ZSBwZXJmb3JtYW5jZSBpbXBhY3QKKwkgIG9uIHN5c3RlbXMgdGhhdCB1c2UgdmVyeSBmYXN0IGRldmljZXMuCisKKwkgIFRoZSBub3JtYWwgYW5zd2VyIHRoZXJlZm9yZSBpcyBOLgorCitjb25maWcgU0NTSV9OQ1I1M0M4WFhfTk9fRElTQ09OTkVDVAorCWJvb2wgIiAgbm90IGFsbG93IHRhcmdldHMgdG8gZGlzY29ubmVjdCIKKwlkZXBlbmRzIG9uIChTQ1NJX1pBTE9OIHx8IFNDU0lfTkNSX1E3MjApICYmIFNDU0lfTkNSNTNDOFhYX0RFRkFVTFRfVEFHUz0wCisJaGVscAorCSAgVGhpcyBvcHRpb24gaXMgb25seSBwcm92aWRlZCBmb3Igc2FmZXR5IGlmIHlvdSBzdXNwZWN0IHNvbWUgU0NTSQorCSAgZGV2aWNlIG9mIHlvdXJzIHRvIG5vdCBzdXBwb3J0IHByb3Blcmx5IHRoZSB0YXJnZXQtZGlzY29ubmVjdAorCSAgZmVhdHVyZS4gSW4gdGhhdCBjYXNlLCB5b3Ugd291bGQgc2F5IFkgaGVyZS4gSW4gZ2VuZXJhbCBob3dldmVyLCB0bworCSAgbm90IGFsbG93IHRhcmdldHMgdG8gZGlzY29ubmVjdCBpcyBub3QgcmVhc29uYWJsZSBpZiB0aGVyZSBpcyBtb3JlCisJICB0aGFuIDEgZGV2aWNlIG9uIGEgU0NTSSBidXMuIFRoZSBub3JtYWwgYW5zd2VyIHRoZXJlZm9yZSBpcyBOLgorCitjb25maWcgU0NTSV9NQ0FfNTNDOVgKKwl0cmlzdGF0ZSAiTkNSIE1DQSA1M0M5eCBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNQ0FfTEVHQUNZICYmIFNDU0kgJiYgQlJPS0VOX09OX1NNUAorCWhlbHAKKwkgIFNvbWUgTWljcm9DaGFubmVsIG1hY2hpbmVzLCBub3RhYmx5IHRoZSBOQ1IgMzV4eCBsaW5lLCB1c2UgYSBTQ1NJCisJICBjb250cm9sbGVyIGJhc2VkIG9uIHRoZSBOQ1IgNTNDOTQuICBUaGlzIGRyaXZlciB3aWxsIGFsbG93IHVzZSBvZgorCSAgdGhlIGNvbnRyb2xsZXIgb24gdGhlIDM1NTAsIGFuZCB2ZXJ5IHBvc3NpYmx5IG90aGVycy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWNhXzUzYzl4LgorCitjb25maWcgU0NTSV9QQVMxNgorCXRyaXN0YXRlICJQQVMxNiBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJU0EgJiYgU0NTSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgYSBTQ1NJIGhvc3QgYWRhcHRlci4gIEl0IGlzIGV4cGxhaW5lZCBpbiBzZWN0aW9uCisJICAzLjEwIG9mIHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIElmIGl0IGRvZXNuJ3Qgd29yayBvdXQKKwkgIG9mIHRoZSBib3gsIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2Ugc29tZSBzZXR0aW5ncyBpbgorCSAgPGZpbGU6ZHJpdmVycy9zY3NpL3BhczE2Lmg+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwYXMxNi4KKworY29uZmlnIFNDU0lfUENJMjAwMAorCXRyaXN0YXRlICJQQ0kyMDAwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSSAmJiBCUk9LRU4KKwloZWxwCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBQQ0kyMDAwSSBFSURFIGludGVyZmFjZSBjYXJkIHdoaWNoIGFjdHMgYXMgYQorCSAgU0NTSSBob3N0IGFkYXB0ZXIuICBQbGVhc2UgcmVhZCB0aGUgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBjaTIwMDAuCisKK2NvbmZpZyBTQ1NJX1BDSTIyMjBJCisJdHJpc3RhdGUgIlBDSTIyMjBpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSSAmJiBCUk9LRU4KKwloZWxwCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBQQ0kyMjIwaSBFSURFIGludGVyZmFjZSBjYXJkIHdoaWNoIGFjdHMgYXMgYQorCSAgU0NTSSBob3N0IGFkYXB0ZXIuICBQbGVhc2UgcmVhZCB0aGUgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBjaTIyMjBpLgorCitjb25maWcgU0NTSV9QU0kyNDBJCisJdHJpc3RhdGUgIlBTSTI0MGkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElTQSAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgUFNJMjQwaSBFSURFIGludGVyZmFjZSBjYXJkIHdoaWNoIGFjdHMgYXMgYQorCSAgU0NTSSBob3N0IGFkYXB0ZXIuICBQbGVhc2UgcmVhZCB0aGUgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBzaTI0MGkuCisKK2NvbmZpZyBTQ1NJX1FMT0dJQ19GQVMKKwl0cmlzdGF0ZSAiUWxvZ2ljIEZBUyBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJU0EgJiYgU0NTSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBJU0EsIFZMQiwgYW5kIFBDTUNJQSB2ZXJzaW9ucyBvZiB0aGUgUWxvZ2ljCisJICBGYXN0U0NTSSEgY2FyZHMgYXMgd2VsbCBhcyBhbnkgb3RoZXIgY2FyZCBiYXNlZCBvbiB0aGUgRkFTWFggY2hpcAorCSAgKGluY2x1ZGluZyB0aGUgQ29udHJvbCBDb25jZXB0cyBTQ1NJL0lERS9TSU8vUElPL0ZEQyBjYXJkcykuCisKKwkgIFRoaXMgZHJpdmVyIGRvZXMgTk9UIHN1cHBvcnQgdGhlIFBDSSB2ZXJzaW9ucyBvZiB0aGVzZSBjYXJkcy4gVGhlCisJICBQQ0kgdmVyc2lvbnMgYXJlIHN1cHBvcnRlZCBieSB0aGUgUWxvZ2ljIElTUCBkcml2ZXIgKCJRbG9naWMgSVNQCisJICBTQ1NJIHN1cHBvcnQiKSwgYmVsb3cuCisKKwkgIEluZm9ybWF0aW9uIGFib3V0IHRoaXMgZHJpdmVyIGlzIGNvbnRhaW5lZCBpbgorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zY3NpL3Fsb2dpY2Zhcy50eHQ+LiAgWW91IHNob3VsZCBhbHNvIHJlYWQgdGhlCisJICBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcWxvZ2ljZmFzLgorCitjb25maWcgU0NTSV9RTE9HSUNfSVNQCisJdHJpc3RhdGUgIlFsb2dpYyBJU1AgU0NTSSBzdXBwb3J0IChvbGQgZHJpdmVyKSIKKwlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJICYmIEJST0tFTgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHdvcmtzIGZvciBhbGwgUUxvZ2ljIFBDSSBTQ1NJIGhvc3QgYWRhcHRlcnMgKElRLVBDSSwKKwkgIElRLVBDSS0xMCwgSVFfUENJLUQpIGV4Y2VwdCBmb3IgdGhlIFBDSS1iYXNpYyBjYXJkLiAgKFRoaXMgbGF0dGVyCisJICBjYXJkIGlzIHN1cHBvcnRlZCBieSB0aGUgIkFNNTMvNzlDOTc0IFBDSSBTQ1NJIiBkcml2ZXIuKQorCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgbWFrZSBzdXJlIHRvIGNob29zZSAiQklPUyIgYXQgdGhlIHF1ZXN0aW9uICJQQ0kKKwkgIGFjY2VzcyBtb2RlIi4KKworCSAgUGxlYXNlIHJlYWQgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zY3NpL3Fsb2dpY2lzcC50eHQ+LiAgWW91CisJICBzaG91bGQgYWxzbyByZWFkIHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcWxvZ2ljaXNwLgorCisJICBUaGVzZSBkYXlzIHRoZSBoYXJkd2FyZSBpcyBhbHNvIHN1cHBvcnRlZCBieSB0aGUgbW9yZSBtb2Rlcm4gcWxhMTI4MAorCSAgZHJpdmVyLiAgSW4gZG91YnQgdXNlIHRoYXQgb25lIGluc3RlYWQgb2YgcWxvZ2ljaXNwLgorCitjb25maWcgU0NTSV9RTE9HSUNfRkMKKwl0cmlzdGF0ZSAiUWxvZ2ljIElTUCBGQyBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSQorCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBRTG9naWMgSVNQMjEwMCBTQ1NJLUZDUCBob3N0IGFkYXB0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHFsb2dpY2ZjLgorCitjb25maWcgU0NTSV9RTE9HSUNfRkNfRklSTVdBUkUKKwlib29sICJJbmNsdWRlIGxvYWRhYmxlIGZpcm13YXJlIGluIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNDU0lfUUxPR0lDX0ZDCisgIAloZWxwCisJICBTYXkgWSB0byBpbmNsdWRlIElTUDJYMDAgRmFicmljIEluaXRpYXRvci9UYXJnZXQgRmlybXdhcmUsIHdpdGgKKwkgIGV4cGFuZGVkIExVTiBhZGRyZXNzaW5nIGFuZCBGY1RhcGUgKEZDUC0yKSBzdXBwb3J0LCBpbiB0aGUKKwkgIHFsb2dpY2ZjIGRyaXZlci4gVGhpcyBpcyByZXF1aXJlZCBvbiBzb21lIHBsYXRmb3Jtcy4KKworY29uZmlnIFNDU0lfUUxPR0lDXzEyODAKKwl0cmlzdGF0ZSAiUWxvZ2ljIFFMQSAxMjQwLzF4ODAvMXgxNjAgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kKKwloZWxwCisJICBTYXkgWSBpZiB5b3UgaGF2ZSBhIFFMb2dpYyBJU1AxMjQwLzF4ODAvMXgxNjAgU0NTSSBob3N0IGFkYXB0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHFsYTEyODAuCisKK2NvbmZpZyBTQ1NJX1FMT0dJQ18xMjgwXzEwNDAKKwlib29sICJRbG9naWMgUUxBIDEwMjAvMTA0MCBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1FMT0dJQ18xMjgwICYmIFNDU0lfUUxPR0lDX0lTUCE9eQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBRTG9naWMgSVNQMTAyMC8xMDQwIFNDU0kgaG9zdCBhZGFwdGVyIGFuZAorCSAgZG8gbm90IHdhbnQgdG8gdXNlIHRoZSBvbGQgZHJpdmVyLiAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGluCisJICB0aGUgcWxhMTI4MCBkcml2ZXIgZm9yIHRob3NlIGhvc3QgYWRhcHRlcnMuCisKK2NvbmZpZyBTQ1NJX1FMT0dJQ1BUSQorCXRyaXN0YXRlICJQVEkgUWxvZ2ljLCBJU1AgRHJpdmVyIgorCWRlcGVuZHMgb24gU0JVUyAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgU0JVUyBTQ1NJIGNvbnRyb2xsZXJzIGZyb20gUFRJIG9yIFFMb2dpYy4gVGhlc2UKKwkgIGNvbnRyb2xsZXJzIGFyZSBrbm93biB1bmRlciBTb2xhcmlzIGFzIHFwdGkgYW5kIGluIHRoZSBvcGVucHJvbSBhcworCSAgUFRJLHB0aXNwIG9yIFFMR0MsaXNwLiBOb3RlIHRoYXQgUENJIFFMb2dpYyBTQ1NJIGNvbnRyb2xsZXJzIGFyZQorCSAgZHJpdmVuIGJ5IGEgZGlmZmVyZW50IGRyaXZlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcWxvZ2ljcHRpLgorCitzb3VyY2UgImRyaXZlcnMvc2NzaS9xbGEyeHh4L0tjb25maWciCisKK2NvbmZpZyBTQ1NJX1NFQUdBVEUKKwl0cmlzdGF0ZSAiU2VhZ2F0ZSBTVC0wMiBhbmQgRnV0dXJlIERvbWFpbiBUTUMtOHh4IFNDU0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFg4NiAmJiBJU0EgJiYgU0NTSSAmJiBCUk9LRU4KKwktLS1oZWxwLS0tCisJICBUaGVzZSBhcmUgOC1iaXQgU0NTSSBjb250cm9sbGVyczsgdGhlIFNULTAxIGlzIGFsc28gc3VwcG9ydGVkIGJ5CisJICB0aGlzIGRyaXZlci4gIEl0IGlzIGV4cGxhaW5lZCBpbiBzZWN0aW9uIDMuOSBvZiB0aGUgU0NTSS1IT1dUTywKKwkgIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uICBJZiBpdAorCSAgZG9lc24ndCB3b3JrIG91dCBvZiB0aGUgYm94LCB5b3UgbWF5IGhhdmUgdG8gY2hhbmdlIHNvbWUgc2V0dGluZ3MgaW4KKwkgIDxmaWxlOmRyaXZlcnMvc2NzaS9zZWFnYXRlLmg+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzZWFnYXRlLgorCisjIGRlZmluaXRlbHkgbG9va3Mgbm90IDY0Yml0IHNhZmU6Citjb25maWcgU0NTSV9TSU03MTAKKwl0cmlzdGF0ZSAiU2ltcGxlIDUzYzcxMCBTQ1NJIHN1cHBvcnQgKENvbXBhcSwgTkNSIG1hY2hpbmVzKSIKKwlkZXBlbmRzIG9uIChFSVNBIHx8IE1DQSkgJiYgU0NTSQorCXNlbGVjdCBTQ1NJX1NQSV9BVFRSUworCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIGZvciBOQ1I1M2M3MTAgYmFzZWQgU0NTSSBob3N0IGFkYXB0ZXJzLgorCisJICBJdCBjdXJyZW50bHkgc3VwcG9ydHMgQ29tcGFxIEVJU0EgY2FyZHMgYW5kIE5DUiBNQ0EgY2FyZHMKKworY29uZmlnIDUzQzcwMF9JT19NQVBQRUQKKwlib29sCisJZGVwZW5kcyBvbiBTQ1NJX1NJTTcxMAorCWRlZmF1bHQgeQorCitjb25maWcgU0NTSV9TWU01M0M0MTYKKwl0cmlzdGF0ZSAiU3ltYmlvcyA1M2M0MTYgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVNBICYmIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBzeW01M2M0MTYgU0NTSSBob3N0IGFkYXB0ZXIsIHRoZSBTQ1NJCisJICBhZGFwdGVyIHRoYXQgY29tZXMgd2l0aCBzb21lIEhQIHNjYW5uZXJzLiBUaGlzIGRyaXZlciByZXF1aXJlcyB0aGF0CisJICB0aGUgc3ltNTNjNDE2IGlzIGNvbmZpZ3VyZWQgZmlyc3QgdXNpbmcgc29tZSBzb3J0IG9mIFBuUAorCSAgY29uZmlndXJhdGlvbiBwcm9ncmFtIChlLmcuIGlzYXBucCkgb3IgYnkgYSBQblAgYXdhcmUgQklPUy4gSWYgeW91CisJICBhcmUgdXNpbmcgaXNhcG5wIHRoZW4geW91IG5lZWQgdG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZQorCSAgYW5kIHRoZW4gbG9hZCBpdCB1c2luZyBpbnNtb2QgYWZ0ZXIgaXNhcG5wIGhhcyBydW4uIFRoZSBwYXJhbWV0ZXJzCisJICBvZiB0aGUgY29uZmlndXJlZCBjYXJkKHMpIHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIGRyaXZlci4gVGhlIGZvcm1hdAorCSAgaXM6CisKKwkgIGluc21vZCBzeW01M2M0MTYgc3ltNTNjNDE2PTxiYXNlPiw8aXJxPiBbc3ltNTNjNDE2XzE9PGJhc2U+LDxpcnE+XQorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzeW01M2M0MTYuCisKK2NvbmZpZyBTQ1NJX0RDMzk1eAorCXRyaXN0YXRlICJUZWtyYW0gREMzOTUoVS9VVy9GKSBhbmQgREMzMTUoVSkgU0NTSSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kgJiYgRVhQRVJJTUVOVEFMCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgUENJIFNDU0kgaG9zdCBhZGFwdGVycyBiYXNlZCBvbiB0aGUgQVNJQworCSAgVFJNLVMxMDQwIGNoaXAsIGUuZyBUZWtyYW0gREMzOTUoVS9VVy9GKSBhbmQgREMzMTUoVSkgdmFyaWFudHMuCisKKwkgIFRoaXMgZHJpdmVyIHdvcmtzLCBidXQgaXMgc3RpbGwgaW4gZXhwZXJpbWVudGFsIHN0YXR1cy4gU28gYmV0dGVyCisJICBoYXZlIGEgYm9vdGFibGUgZGlzayBhbmQgYSBiYWNrdXAgaW4gY2FzZSBvZiBlbWVyZ2VuY3kuCisKKwkgIERvY3VtZW50YXRpb24gY2FuIGJlIGZvdW5kIGluIDxmaWxlOkRvY3VtZW50YXRpb24vc2NzaS9kYzM5NXgudHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZGMzOTV4LgorCitjb25maWcgU0NTSV9EQzM5MFQKKwl0cmlzdGF0ZSAiVGVrcmFtIERDMzkwKFQpIGFuZCBBbTUzLzc5Qzk3NCBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFBDSSBTQ1NJIGhvc3QgYWRhcHRlcnMgYmFzZWQgb24gdGhlIEFtNTNDOTc0QQorCSAgY2hpcCwgZS5nLiBUZWtyYW0gREMzOTAoVCksIERhd2lDb250cm9sIDI5NzQgYW5kIHNvbWUgb25ib2FyZAorCSAgUENzY3NpL1BDbmV0IChBbTUzLzc5Qzk3NCkgc29sdXRpb25zLgorCisJICBEb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZCBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvdG1zY3NpbS50eHQ+LgorCisJICBOb3RlIHRoYXQgdGhpcyBkcml2ZXIgZG9lcyBOT1Qgc3VwcG9ydCBUZWtyYW0gREMzOTBXL1UvRiwgd2hpY2ggYXJlCisJICBiYXNlZCBvbiBOQ1IvU3ltYmlvcyBjaGlwcy4gVXNlICJOQ1I1M0M4WFggU0NTSSBzdXBwb3J0IiBmb3IgdGhvc2UuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHRtc2NzaW0uCisKK2NvbmZpZyBTQ1NJX1QxMjgKKwl0cmlzdGF0ZSAiVHJhbnRvciBUMTI4L1QxMjhGL1QyMjggU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVNBICYmIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIGEgU0NTSSBob3N0IGFkYXB0ZXIuIEl0IGlzIGV4cGxhaW5lZCBpbiBzZWN0aW9uCisJICAzLjExIG9mIHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIElmIGl0IGRvZXNuJ3Qgd29yayBvdXQKKwkgIG9mIHRoZSBib3gsIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2Ugc29tZSBzZXR0aW5ncyBpbgorCSAgPGZpbGU6ZHJpdmVycy9zY3NpL3QxMjguaD4uICBOb3RlIHRoYXQgVHJhbnRvciB3YXMgcHVyY2hhc2VkIGJ5CisJICBBZGFwdGVjLCBhbmQgc29tZSBmb3JtZXIgVHJhbnRvciBwcm9kdWN0cyBhcmUgYmVpbmcgc29sZCB1bmRlciB0aGUKKwkgIEFkYXB0ZWMgbmFtZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdDEyOC4KKworY29uZmlnIFNDU0lfVTE0XzM0RgorCXRyaXN0YXRlICJVbHRyYVN0b3IgMTRGLzM0RiBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVNBICYmIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBVbHRyYVN0b3IgMTRGIGFuZCAzNEYgU0NTSS0yIGhvc3QgYWRhcHRlcnMuCisJICBUaGUgc291cmNlIGF0IDxmaWxlOmRyaXZlcnMvc2NzaS91MTQtMzRmLmM+IGNvbnRhaW5zIHNvbWUKKwkgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaGFyZHdhcmUuICBJZiB0aGUgZHJpdmVyIGRvZXNuJ3Qgd29yayBvdXQgb2YKKwkgIHRoZSBib3gsIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2Ugc29tZSBzZXR0aW5ncyBpbgorCSAgPGZpbGU6IGRyaXZlcnMvc2NzaS91MTQtMzRmLmM+LiAgUmVhZCB0aGUgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uICBOb3RlIHRoYXQgdGhlcmUgaXMgYWxzbworCSAgYW5vdGhlciBkcml2ZXIgZm9yIHRoZSBzYW1lIGhhcmR3YXJlOiAiVWx0cmFTdG9yIFNDU0kgc3VwcG9ydCIsCisJICBiZWxvdy4gIFlvdSBzaG91bGQgc2F5IFkgdG8gYm90aCBvbmx5IGlmIHlvdSB3YW50IDI0RiBzdXBwb3J0IGFzCisJICB3ZWxsLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB1MTQtMzRmLgorCitjb25maWcgU0NTSV9VMTRfMzRGX1RBR0dFRF9RVUVVRQorCWJvb2wgImVuYWJsZSB0YWdnZWQgY29tbWFuZCBxdWV1ZWluZyIKKwlkZXBlbmRzIG9uIFNDU0lfVTE0XzM0RgorCWhlbHAKKwkgIFRoaXMgaXMgYSBmZWF0dXJlIG9mIFNDU0ktMiB3aGljaCBpbXByb3ZlcyBwZXJmb3JtYW5jZTogdGhlIGhvc3QKKwkgIGFkYXB0ZXIgY2FuIHNlbmQgc2V2ZXJhbCBTQ1NJIGNvbW1hbmRzIHRvIGEgZGV2aWNlJ3MgcXVldWUgZXZlbiBpZgorCSAgcHJldmlvdXMgY29tbWFuZHMgaGF2ZW4ndCBmaW5pc2hlZCB5ZXQuCisJICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlICJ1MTQtMzRmPXRjOnkiIGJvb3Qgb3B0aW9uLgorCitjb25maWcgU0NTSV9VMTRfMzRGX0xJTktFRF9DT01NQU5EUworCWJvb2wgImVuYWJsZSBlbGV2YXRvciBzb3J0aW5nIgorCWRlcGVuZHMgb24gU0NTSV9VMTRfMzRGCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBlbGV2YXRvciBzb3J0aW5nIGZvciBhbGwgcHJvYmVkIFNDU0kgZGlza3MgYW5kCisJICBDRC1ST01zLiBJdCBkZWZpbml0ZWx5IHJlZHVjZXMgdGhlIGF2ZXJhZ2Ugc2VlayBkaXN0YW5jZSB3aGVuIGRvaW5nCisJICByYW5kb20gc2Vla3MsIGJ1dCB0aGlzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IHJlc3VsdCBpbiBhIG5vdGljZWFibGUKKwkgIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50OiB5b3VyIG1pbGVhZ2UgbWF5IHZhcnkuLi4KKwkgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgInUxNC0zNGY9bGM6eSIgYm9vdCBvcHRpb24uCisKK2NvbmZpZyBTQ1NJX1UxNF8zNEZfTUFYX1RBR1MKKwlpbnQgIm1heGltdW0gbnVtYmVyIG9mIHF1ZXVlZCBjb21tYW5kcyIKKwlkZXBlbmRzIG9uIFNDU0lfVTE0XzM0RgorCWRlZmF1bHQgIjgiCisJaGVscAorCSAgVGhpcyBzcGVjaWZpZXMgaG93IG1hbnkgU0NTSSBjb21tYW5kcyBjYW4gYmUgbWF4aW1hbGx5IHF1ZXVlZCBmb3IKKwkgIGVhY2ggcHJvYmVkIFNDU0kgZGV2aWNlLiBZb3Ugc2hvdWxkIHJlZHVjZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiA4CisJICBvbmx5IGlmIHlvdSBoYXZlIGRpc2tzIHdpdGggYnVnZ3kgb3IgbGltaXRlZCB0YWdnZWQgY29tbWFuZCBzdXBwb3J0LgorCSAgTWluaW11bSBpcyAyIGFuZCBtYXhpbXVtIGlzIDE0LiBUaGlzIHZhbHVlIGlzIGFsc28gdGhlIHdpbmRvdyBzaXplCisJICB1c2VkIGJ5IHRoZSBlbGV2YXRvciBzb3J0aW5nIG9wdGlvbiBhYm92ZS4gVGhlIGVmZmVjdGl2ZSB2YWx1ZSB1c2VkCisJICBieSB0aGUgZHJpdmVyIGZvciBlYWNoIHByb2JlZCBTQ1NJIGRldmljZSBpcyByZXBvcnRlZCBhdCBib290IHRpbWUuCisJICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlICJ1MTQtMzRmPW1xOjgiIGJvb3Qgb3B0aW9uLgorCitjb25maWcgU0NTSV9VTFRSQVNUT1IKKwl0cmlzdGF0ZSAiVWx0cmFTdG9yIFNDU0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFg4NiAmJiBJU0EgJiYgU0NTSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgdGhlIFVsdHJhU3RvciAxNEYsIDI0RiBhbmQgMzRGIFNDU0ktMiBob3N0CisJICBhZGFwdGVyIGZhbWlseS4gIFRoaXMgZHJpdmVyIGlzIGV4cGxhaW5lZCBpbiBzZWN0aW9uIDMuMTIgb2YgdGhlCisJICBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIElmIGl0IGRvZXNuJ3Qgd29yayBvdXQKKwkgIG9mIHRoZSBib3gsIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2Ugc29tZSBzZXR0aW5ncyBpbgorCSAgPGZpbGU6ZHJpdmVycy9zY3NpL3VsdHJhc3Rvci5oPi4KKworCSAgTm90ZSB0aGF0IHRoZXJlIGlzIGFsc28gYW5vdGhlciBkcml2ZXIgZm9yIHRoZSBzYW1lIGhhcmR3YXJlOgorCSAgIlVsdHJhU3RvciAxNEYvMzRGIHN1cHBvcnQiLCBhYm92ZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdWx0cmFzdG9yLgorCitjb25maWcgU0NTSV9OU1AzMgorCXRyaXN0YXRlICJXb3JrYml0IE5pbmphU0NTSS0zMkJpL1VERSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kgJiYgITY0QklUCisJaGVscAorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgV29ya2JpdCBOaW5qYVNDU0ktMzJCaS9VREUgUENJL0NhcmRidXMKKwkgIFNDU0kgaG9zdCBhZGFwdGVyLiBQbGVhc2UgcmVhZCB0aGUgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG5zcDMyLgorCitjb25maWcgU0NTSV9ERUJVRworCXRyaXN0YXRlICJTQ1NJIGRlYnVnZ2luZyBob3N0IHNpbXVsYXRvciIKKwlkZXBlbmRzIG9uIFNDU0kKKwloZWxwCisJICBUaGlzIGlzIGEgaG9zdCBhZGFwdGVyIHNpbXVsYXRvciB0aGF0IGNhbiBzaW11bGF0ZSBtdWx0aXBsZSBob3N0cworCSAgZWFjaCB3aXRoIG11bHRpcGxlIGR1bW15IFNDU0kgZGV2aWNlcyAoZGlza3MpLiBJdCBkZWZhdWx0cyB0byBvbmUKKwkgIGhvc3QgYWRhcHRlciB3aXRoIG9uZSBkdW1teSBTQ1NJIGRpc2suIEVhY2ggZHVtbXkgZGlzayB1c2VzIGtlcm5lbAorCSAgUkFNIGFzIHN0b3JhZ2UgKGkuZS4gaXQgaXMgYSByYW1kaXNrKS4gVG8gc2F2ZSBzcGFjZSB3aGVuIG11bHRpcGxlCisJICBkdW1teSBkaXNrcyBhcmUgc2ltdWxhdGVkLCB0aGV5IHNoYXJlIHRoZSBzYW1lIGtlcm5lbCBSQU0gZm9yIAorCSAgdGhlaXIgc3RvcmFnZS4gU2VlIDxodHRwOi8vd3d3LnRvcnF1ZS5uZXQvc2cvc2RlYnVnLmh0bWw+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbi4gVGhpcyBkcml2ZXIgaXMgcHJpbWFyaWx5IG9mIHVzZSB0byB0aG9zZSB0ZXN0aW5nIHRoZQorCSAgU0NTSSBhbmQgYmxvY2sgc3Vic3lzdGVtcy4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfTUVTSAorCXRyaXN0YXRlICJNRVNIIChQb3dlciBNYWMgaW50ZXJuYWwgU0NTSSkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBQQzMyICYmIFBQQ19QTUFDICYmIFNDU0kKKwloZWxwCisJICBNYW55IFBvd2VyIE1hY2ludG9zaGVzIGFuZCBjbG9uZXMgaGF2ZSBhIE1FU0ggKE1hY2ludG9zaCBFbmhhbmNlZAorCSAgU0NTSSBIYXJkd2FyZSkgU0NTSSBidXMgYWRhcHRvciAodGhlIDcyMDAgZG9lc24ndCwgYnV0IGFsbCBvZiB0aGUKKwkgIG90aGVyIFBvd2VyIE1hY2ludG9zaGVzIGRvKS4gU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGlzIFNDU0kKKwkgIGFkYXB0b3IuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1lc2guCisKK2NvbmZpZyBTQ1NJX01FU0hfU1lOQ19SQVRFCisJaW50ICJtYXhpbXVtIHN5bmNocm9ub3VzIHRyYW5zZmVyIHJhdGUgKE1CL3MpICgwID0gYXN5bmMpIgorCWRlcGVuZHMgb24gU0NTSV9NRVNICisJZGVmYXVsdCAiNSIKKwloZWxwCisJICBPbiBQb3dlciBNYWNpbnRvc2hlcyAoYW5kIGNsb25lcykgd2hlcmUgdGhlIE1FU0ggU0NTSSBidXMgYWRhcHRvcgorCSAgZHJpdmVzIGEgYnVzIHdoaWNoIGlzIGVudGlyZWx5IGludGVybmFsIHRvIHRoZSBtYWNoaW5lIChzdWNoIGFzIHRoZQorCSAgNzUwMCwgNzYwMCwgODUwMCwgZXRjLiksIHRoZSBNRVNIIGlzIGNhcGFibGUgb2Ygc3luY2hyb25vdXMKKwkgIG9wZXJhdGlvbiBhdCB1cCB0byAxMCBNQi9zLiBPbiBtYWNoaW5lcyB3aGVyZSB0aGUgU0NTSSBidXMKKwkgIGNvbnRyb2xsZWQgYnkgdGhlIE1FU0ggY2FuIGhhdmUgZXh0ZXJuYWwgZGV2aWNlcyBjb25uZWN0ZWQsIGl0IGlzCisJICB1c3VhbGx5IHJhdGVkIGF0IDUgTUIvcy4gNSBpcyBhIHNhZmUgdmFsdWUgaGVyZSB1bmxlc3MgeW91IGtub3cgdGhlCisJICBNRVNIIFNDU0kgYnVzIGlzIGludGVybmFsIG9ubHk7IGluIHRoYXQgY2FzZSB5b3UgY2FuIHNheSAxMC4gU2F5IDAKKwkgIHRvIGRpc2FibGUgc3luY2hyb25vdXMgb3BlcmF0aW9uLgorCitjb25maWcgU0NTSV9NRVNIX1JFU0VUX0RFTEFZX01TCisJaW50ICJpbml0aWFsIGJ1cyByZXNldCBkZWxheSAobXMpICgwID0gbm8gcmVzZXQpIgorCWRlcGVuZHMgb24gU0NTSV9NRVNICisJZGVmYXVsdCAiNDAwMCIKKworY29uZmlnIFNDU0lfTUFDNTNDOTQKKwl0cmlzdGF0ZSAiNTNDOTQgKFBvd2VyIE1hYyBleHRlcm5hbCBTQ1NJKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUFBDMzIgJiYgUFBDX1BNQUMgJiYgU0NTSQorCWhlbHAKKwkgIE9uIFBvd2VyIE1hY2ludG9zaGVzIChhbmQgY2xvbmVzKSB3aXRoIHR3byBTQ1NJIGJ1c2VzLCB0aGUgZXh0ZXJuYWwKKwkgIFNDU0kgYnVzIGlzIHVzdWFsbHkgY29udHJvbGxlZCBieSBhIDUzQzk0IFNDU0kgYnVzIGFkYXB0b3IuIE9sZGVyCisJICBtYWNoaW5lcyB3aGljaCBvbmx5IGhhdmUgb25lIFNDU0kgYnVzLCBzdWNoIGFzIHRoZSA3MjAwLCBhbHNvIHVzZQorCSAgdGhlIDUzQzk0LiBTYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSA1M0M5NC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWFjNTNjOTQuCisKK3NvdXJjZSAiZHJpdmVycy9zY3NpL2FybS9LY29uZmlnIgorCitjb25maWcgSkFaWl9FU1AKKwlib29sICJNSVBTIEpBWlogRkFTMjE2IFNDU0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE1BQ0hfSkFaWiAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgb25ib2FyZCBTQ1NJIGhvc3QgYWRhcHRlciBvZiBNSVBTIE1hZ251bQorCSAgNDAwMCwgQWNlciBQSUNBLCBPbGl2ZXR0aSBNNzAwLTEwIGFuZCBhIGZldyBvdGhlciBpZGVudGljYWwgT0VNCisJICBzeXN0ZW1zLgorCitjb25maWcgQTMwMDBfU0NTSQorCXRyaXN0YXRlICJBMzAwMCBXRDMzQzkzQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQU1JR0EgJiYgU0NTSQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIEFtaWdhIDMwMDAgYW5kIGhhdmUgU0NTSSBkZXZpY2VzIGNvbm5lY3RlZCB0byB0aGUKKwkgIGJ1aWx0LWluIFNDU0kgY29udHJvbGxlciwgc2F5IFkuIE90aGVyd2lzZSwgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHdkMzNjOTMuCisKK2NvbmZpZyBBMjA5MV9TQ1NJCisJdHJpc3RhdGUgIkEyMDkxL0E1OTAgV0QzM0M5M0Egc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFpPUlJPICYmIFNDU0kKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIENvbW1vZG9yZSBBMjA5MSBTQ1NJIGNvbnRyb2xsZXIsIHNheSBZLiBPdGhlcndpc2UsCisJICBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgd2QzM2M5My4KKworY29uZmlnIEdWUDExX1NDU0kKKwl0cmlzdGF0ZSAiR1ZQIFNlcmllcyBJSSBXRDMzQzkzQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWk9SUk8gJiYgU0NTSQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGEgR3JlYXQgVmFsbGV5IFByb2R1Y3RzIFNlcmllcyBJSSBTQ1NJIGNvbnRyb2xsZXIsCisJICBhbnN3ZXIgWS4gQWxzbyBzYXkgWSBpZiB5b3UgaGF2ZSBhIGxhdGVyIG1vZGVsIG9mIEdWUCBTQ1NJCisJICBjb250cm9sbGVyIChzdWNoIGFzIHRoZSBHVlAgQTQwMDggb3IgYSBDb21ibyBib2FyZCkuIE90aGVyd2lzZSwKKwkgIGFuc3dlciBOLiBUaGlzIGRyaXZlciBkb2VzIE5PVCB3b3JrIGZvciB0aGUgVC1SZXggc2VyaWVzIG9mCisJICBhY2NlbGVyYXRvcnMgZnJvbSBUZWtNYWdpYyBhbmQgR1ZQLU0uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGd2cDExLgorCitjb25maWcgQ1lCRVJTVE9STV9TQ1NJCisJdHJpc3RhdGUgIkN5YmVyU3Rvcm0gU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWk9SUk8gJiYgU0NTSQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIEFtaWdhIHdpdGggYW4gb3JpZ2luYWwgKE1rSSkgUGhhc2U1IEN5YmVyc3Rvcm0KKwkgIGFjY2VsZXJhdG9yIGJvYXJkIGFuZCB0aGUgb3B0aW9uYWwgQ3liZXJzdG9ybSBTQ1NJIGNvbnRyb2xsZXIsCisJICBhbnN3ZXIgWS4gT3RoZXJ3aXNlLCBzYXkgTi4KKworY29uZmlnIENZQkVSU1RPUk1JSV9TQ1NJCisJdHJpc3RhdGUgIkN5YmVyU3Rvcm0gTWsgSUkgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWk9SUk8gJiYgU0NTSQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIEFtaWdhIHdpdGggYSBQaGFzZTUgQ3liZXJzdG9ybSBNa0lJIGFjY2VsZXJhdG9yIGJvYXJkCisJICBhbmQgdGhlIG9wdGlvbmFsIEN5YmVyc3Rvcm0gU0NTSSBjb250cm9sbGVyLCBzYXkgWS4gT3RoZXJ3aXNlLAorCSAgYW5zd2VyIE4uCisKK2NvbmZpZyBCTFoyMDYwX1NDU0kKKwl0cmlzdGF0ZSAiQmxpenphcmQgMjA2MCBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBaT1JSTyAmJiBTQ1NJCisJaGVscAorCSAgSWYgeW91IGhhdmUgYW4gQW1pZ2Egd2l0aCBhIFBoYXNlNSBCbGl6emFyZCAyMDYwIGFjY2VsZXJhdG9yIGJvYXJkCisJICBhbmQgd2FudCB0byB1c2UgdGhlIG9uYm9hcmQgU0NTSSBjb250cm9sbGVyLCBzYXkgWS4gT3RoZXJ3aXNlLAorCSAgYW5zd2VyIE4uCisKK2NvbmZpZyBCTFoxMjMwX1NDU0kKKwl0cmlzdGF0ZSAiQmxpenphcmQgMTIzMElWLzEyNjAgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWk9SUk8gJiYgU0NTSQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIEFtaWdhIDEyMDAgd2l0aCBhIFBoYXNlNSBCbGl6emFyZCAxMjMwSVYgb3IgQmxpenphcmQKKwkgIDEyNjAgYWNjZWxlcmF0b3IsIGFuZCB0aGUgb3B0aW9uYWwgU0NTSSBtb2R1bGUsIHNheSBZLiBPdGhlcndpc2UsCisJICBzYXkgTi4KKworY29uZmlnIEZBU1RMQU5FX1NDU0kKKwl0cmlzdGF0ZSAiRmFzdGxhbmUgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWk9SUk8gJiYgU0NTSQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIHRoZSBQaGFzZTUgRmFzdGxhbmUgWjMgU0NTSSBjb250cm9sbGVyLCBvciBwbGFuIHRvIHVzZQorCSAgb25lIGluIHRoZSBuZWFyIGZ1dHVyZSwgc2F5IFkgdG8gdGhpcyBxdWVzdGlvbi4gT3RoZXJ3aXNlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfQU1JR0E3WFgKKwlib29sICJBbWlnYSBOQ1I1M2M3MTAgU0NTSSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gQU1JR0EgJiYgU0NTSSAmJiBFWFBFUklNRU5UQUwgJiYgQlJPS0VOCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdmFyaW91cyBOQ1I1M2M3MTAtYmFzZWQgU0NTSSBjb250cm9sbGVycyBvbiB0aGUgQW1pZ2EuCisJICBUaGlzIGluY2x1ZGVzOgorCSAgICAtIHRoZSBidWlsdGluIFNDU0kgY29udHJvbGxlciBvbiB0aGUgQW1pZ2EgNDAwMFQsCisJICAgIC0gdGhlIEFtaWdhIDQwOTEgWm9ycm8gSUlJIFNDU0ktMiBjb250cm9sbGVyLAorCSAgICAtIHRoZSBNYWNyb1N5c3RlbSBEZXZlbG9wbWVudCdzIFdhcnBFbmdpbmUgQW1pZ2EgU0NTSS0yIGNvbnRyb2xsZXIKKwkgICAgICAoaW5mbyBhdAorCSAgICAgIDxodHRwOi8vd3d3Lmx5c2F0b3IubGl1LnNlL2FtaWdhL2FyL2d1aWRlL2FyMzEwLmd1aWRlP0ZFQVRVUkU1PiksCisJICAgIC0gdGhlIFNDU0kgY29udHJvbGxlciBvbiB0aGUgUGhhc2U1IEJsaXp6YXJkIFBvd2VyVVAgNjAzZSsKKwkgICAgICBhY2NlbGVyYXRvciBjYXJkIGZvciB0aGUgQW1pZ2EgMTIwMCwKKwkgICAgLSB0aGUgU0NTSSBjb250cm9sbGVyIG9uIHRoZSBHVlAgVHVyYm8gMDQwLzA2MCBhY2NlbGVyYXRvci4KKwkgIE5vdGUgdGhhdCBhbGwgb2YgdGhlIGFib3ZlIFNDU0kgY29udHJvbGxlcnMsIGV4Y2VwdCBmb3IgdGhlIGJ1aWx0aW4KKwkgIFNDU0kgY29udHJvbGxlciBvbiB0aGUgQW1pZ2EgNDAwMFQsIHJlc2lkZSBvbiB0aGUgWm9ycm8gZXhwYW5zaW9uCisJICBidXMsIHNvIHlvdSBhbHNvIGhhdmUgdG8gZW5hYmxlIFpvcnJvIGJ1cyBzdXBwb3J0IGlmIHlvdSB3YW50IHRvIHVzZQorCSAgdGhlbS4KKworY29uZmlnIE9LVEFHT05fU0NTSQorCXRyaXN0YXRlICJCU0MgT2t0YWdvbiBTQ1NJIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBaT1JSTyAmJiBTQ1NJICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIElmIHlvdSBoYXZlIHRoZSBCU0MgT2t0YWdvbiBTQ1NJIGRpc2sgY29udHJvbGxlciBmb3IgdGhlIEFtaWdhLCBzYXkKKwkgIFkgdG8gdGhpcyBxdWVzdGlvbi4gIElmIHlvdSdyZSBpbiBkb3VidCBhYm91dCB3aGV0aGVyIHlvdSBoYXZlIG9uZSwKKwkgIHNlZSB0aGUgcGljdHVyZSBhdAorCSAgPGh0dHA6Ly9hbWlnYS5yZXNvdXJjZS5jeC9leHAvc2VhcmNoLnBsP3Byb2R1Y3Q9b2t0YWdvbj4uCisKK2NvbmZpZyBBVEFSSV9TQ1NJCisJdHJpc3RhdGUgIkF0YXJpIG5hdGl2ZSBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBVEFSSSAmJiBTQ1NJICYmIEJST0tFTgorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGFuIEF0YXJpIHdpdGggYnVpbHQtaW4gTkNSNTM4MCBTQ1NJIGNvbnRyb2xsZXIgKFRULAorCSAgRmFsY29uLCAuLi4pIHNheSBZIHRvIGdldCBpdCBzdXBwb3J0ZWQuIE9mIGNvdXJzZSBhbHNvLCBpZiB5b3UgaGF2ZQorCSAgYSBjb21wYXRpYmxlIFNDU0kgY29udHJvbGxlciAoZS5nLiBmb3IgTWVkdXNhKS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYXRhcmlfc2NzaS4KKworCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgYm90aCBzdHlsZXMgb2YgTkNSIGludGVncmF0aW9uIGludG8gdGhlCisJICBzeXN0ZW06IHRoZSBUVCBzdHlsZSAoc2VwYXJhdGUgRE1BKSwgYW5kIHRoZSBGYWxjb24gc3R5bGUgKHZpYQorCSAgU1QtRE1BLCByZXBsYWNpbmcgQUNTSSkuICBJdCBkb2VzIE5PVCBzdXBwb3J0IG90aGVyIHNjaGVtZXMsIGxpa2UKKwkgIGluIHRoZSBIYWRlcyAod2l0aG91dCBETUEpLgorCitjb25maWcgQVRBUklfU0NTSV9UT1NISUJBX0RFTEFZCisJYm9vbCAiTG9uZyBkZWxheXMgZm9yIFRvc2hpYmEgQ0QtUk9NcyIKKwlkZXBlbmRzIG9uIEFUQVJJX1NDU0kKKwloZWxwCisJICBUaGlzIG9wdGlvbiBpbmNyZWFzZXMgdGhlIGRlbGF5IGFmdGVyIGEgU0NTSSBhcmJpdHJhdGlvbiB0bworCSAgYWNjb21tb2RhdGUgc29tZSBmbGFreSBUb3NoaWJhIENELVJPTSBkcml2ZXMuIFNheSBZIGlmIHlvdSBpbnRlbmQgdG8KKwkgIHVzZSBhIFRvc2hpYmEgQ0QtUk9NIGRyaXZlOyBvdGhlcndpc2UsIHRoZSBvcHRpb24gaXMgbm90IG5lZWRlZCBhbmQKKwkgIHdvdWxkIGltcGFjdCBwZXJmb3JtYW5jZSBhIGJpdCwgc28gc2F5IE4uCisKK2NvbmZpZyBBVEFSSV9TQ1NJX1JFU0VUX0JPT1QKKwlib29sICJSZXNldCBTQ1NJLWRldmljZXMgYXQgYm9vdHRpbWUiCisJZGVwZW5kcyBvbiBBVEFSSV9TQ1NJCisJaGVscAorCSAgUmVzZXQgdGhlIGRldmljZXMgb24geW91ciBBdGFyaSB3aGVuZXZlciBpdCBib290cy4gIFRoaXMgbWFrZXMgdGhlCisJICBib290IHByb2Nlc3MgZnJhY3Rpb25hbGx5IGxvbmdlciBidXQgbWF5IGFzc2lzdCByZWNvdmVyeSBmcm9tIGVycm9ycworCSAgdGhhdCBsZWF2ZSB0aGUgZGV2aWNlcyB3aXRoIFNDU0kgb3BlcmF0aW9ucyBwYXJ0d2F5IGNvbXBsZXRlZC4KKworY29uZmlnIFRUX0RNQV9FTVVMCisJYm9vbCAiSGFkZXMgU0NTSSBETUEgZW11bGF0b3IiCisJZGVwZW5kcyBvbiBBVEFSSV9TQ1NJICYmIEhBREVTCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBjb2RlIHdoaWNoIGVtdWxhdGVzIHRoZSBUVCBTQ1NJIERNQSBjaGlwIG9uIHRoZQorCSAgSGFkZXMuIFRoaXMgaW5jcmVhc2VzIHRoZSBTQ1NJIHRyYW5zZmVyIHJhdGVzIGF0IGxlYXN0IHRlbiB0aW1lcworCSAgY29tcGFyZWQgdG8gUElPIHRyYW5zZmVycy4KKworY29uZmlnIE1BQ19TQ1NJCisJYm9vbCAiTWFjaW50b3NoIE5DUjUzODAgU0NTSSIKKwlkZXBlbmRzIG9uIE1BQyAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBpcyB0aGUgTkNSIDUzODAgU0NTSSBjb250cm9sbGVyIGluY2x1ZGVkIG9uIG1vc3Qgb2YgdGhlIDY4MDMwCisJICBiYXNlZCBNYWNpbnRvc2hlcy4gIElmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBzYXkgWSBhbmQgcmVhZCB0aGUKKwkgIFNDU0ktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCitjb25maWcgU0NTSV9NQUNfRVNQCisJdHJpc3RhdGUgIk1hY2ludG9zaCBOQ1I1M2M5WzQ2XSBTQ1NJIgorCWRlcGVuZHMgb24gTUFDICYmIFNDU0kKKwloZWxwCisJICBUaGlzIGlzIHRoZSBOQ1IgNTNjOXggU0NTSSBjb250cm9sbGVyIGZvdW5kIG9uIG1vc3Qgb2YgdGhlIDY4MDQwCisJICBiYXNlZCBNYWNpbnRvc2hlcy4gIElmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBzYXkgWSBhbmQgcmVhZCB0aGUKKwkgIFNDU0ktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtYWNfZXNwLgorCitjb25maWcgTVZNRTE0N19TQ1NJCisJYm9vbCAiV0QzM0M5MyBTQ1NJIGRyaXZlciBmb3IgTVZNRTE0NyIKKwlkZXBlbmRzIG9uIE1WTUUxNDcgJiYgU0NTSQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHRoZSBvbi1ib2FyZCBTQ1NJIGNvbnRyb2xsZXIgb24gdGhlIE1vdG9yb2xhIE1WTUUxNDcKKwkgIHNpbmdsZS1ib2FyZCBjb21wdXRlci4KKworY29uZmlnIE1WTUUxNnhfU0NTSQorCWJvb2wgIk5DUjUzQzcxMCBTQ1NJIGRyaXZlciBmb3IgTVZNRTE2eCIKKwlkZXBlbmRzIG9uIE1WTUUxNnggJiYgU0NTSSAmJiBCUk9LRU4KKwloZWxwCisJICBUaGUgTW90b3JvbGEgTVZNRTE2MiwgMTY2LCAxNjcsIDE3MiBhbmQgMTc3IGJvYXJkcyB1c2UgdGhlIE5DUjUzQzcxMAorCSAgU0NTSSBjb250cm9sbGVyIGNoaXAuICBBbG1vc3QgZXZlcnlvbmUgdXNpbmcgb25lIG9mIHRoZXNlIGJvYXJkcworCSAgd2lsbCB3YW50IHRvIHNheSBZIHRvIHRoaXMgcXVlc3Rpb24uCisKK2NvbmZpZyBCVk1FNjAwMF9TQ1NJCisJYm9vbCAiTkNSNTNDNzEwIFNDU0kgZHJpdmVyIGZvciBCVk1FNjAwMCIKKwlkZXBlbmRzIG9uIEJWTUU2MDAwICYmIFNDU0kgJiYgQlJPS0VOCisJaGVscAorCSAgVGhlIEJWTUU0MDAwIGFuZCBCVk1FNjAwMCBib2FyZHMgZnJvbSBCVk0gTHRkIHVzZSB0aGUgTkNSNTNDNzEwCisJICBTQ1NJIGNvbnRyb2xsZXIgY2hpcC4gIEFsbW9zdCBldmVyeW9uZSB1c2luZyBvbmUgb2YgdGhlc2UgYm9hcmRzCisJICB3aWxsIHdhbnQgdG8gc2F5IFkgdG8gdGhpcyBxdWVzdGlvbi4KKworY29uZmlnIFNDU0lfTkNSNTNDN3h4X0ZBU1QKKwlib29sICJhbGxvdyBGQVNULVNDU0kgWzEwTUh6XSIKKwlkZXBlbmRzIG9uIFNDU0lfQU1JR0E3WFggfHwgTVZNRTE2eF9TQ1NJIHx8IEJWTUU2MDAwX1NDU0kKKwloZWxwCisJICBUaGlzIHdpbGwgZW5hYmxlIDEwTUh6IEZBU1QtU0NTSSB0cmFuc2ZlcnMgd2l0aCB5b3VyIGhvc3QKKwkgIGFkYXB0ZXIuIFNvbWUgc3lzdGVtcyBoYXZlIHByb2JsZW1zIHdpdGggdGhhdCBzcGVlZCwgc28gaXQncyBzYWZlc3QKKwkgIHRvIHNheSBOIGhlcmUuCisKK2NvbmZpZyBTVU4zX1NDU0kKKwl0cmlzdGF0ZSAiU3VuMyBOQ1I1MzgwIFNDU0kiCisJZGVwZW5kcyBvbiBTVU4zICYmIFNDU0kKKwloZWxwCisJICBUaGlzIG9wdGlvbiB3aWxsIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgT0JJTyAob25ib2FyZCBpbykgTkNSNTM4MAorCSAgU0NTSSBjb250cm9sbGVyIGZvdW5kIGluIHRoZSBTdW4gMy81MCBhbmQgMy82MCwgYXMgd2VsbCBhcyBmb3IKKwkgICJTdW4zIiB0eXBlIFZNRSBzY3NpIGNvbnRyb2xsZXJzIGFsc28gYmFzZWQgb24gdGhlIE5DUjUzODAuCisJICBHZW5lcmFsIExpbnV4IGluZm9ybWF0aW9uIG9uIHRoZSBTdW4gMyBzZXJpZXMgKG5vdyBkaXNjb250aW51ZWQpCisJICBpcyBhdCA8aHR0cDovL3d3dy5hbmdlbGZpcmUuY29tL2NhMi90ZWNoNjhrL3N1bjMuaHRtbD4uCisKK2NvbmZpZyBTVU4zWF9FU1AKKwlib29sICJTdW4zeCBFU1AgU0NTSSIKKwlkZXBlbmRzIG9uIFNVTjNYICYmIFNDU0kKKwloZWxwCisJICBUaGUgRVNQIHdhcyBhbiBvbi1ib2FyZCBTQ1NJIGNvbnRyb2xsZXIgdXNlZCBvbiBTdW4gMy84MAorCSAgbWFjaGluZXMuICBTYXkgWSBoZXJlIHRvIGNvbXBpbGUgaW4gc3VwcG9ydCBmb3IgaXQuCisKK2NvbmZpZyBTQ1NJX1NVTkVTUAorCXRyaXN0YXRlICJTcGFyYyBFU1AgU2NzaSBEcml2ZXIiCisJZGVwZW5kcyBvbiBTQlVTICYmIFNDU0kKKwloZWxwCisJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBTdW4gRVNQIFNDU0kgaG9zdCBhZGFwdGVyLiBUaGUgRVNQCisJICBjaGlwc2V0IGlzIHByZXNlbnQgaW4gbW9zdCBTUEFSQyBTQlVTLWJhc2VkIGNvbXB1dGVycy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZXNwLgorCisjICAgICAgYm9vbCAnQ3liZXJzdG9ybSBNayBJSUkgU0NTSSBzdXBwb3J0IChFWFBFUklNRU5UQUwpJyBDT05GSUdfQ1lCRVJTVE9STUlJSV9TQ1NJCisKK2NvbmZpZyBaRkNQCisJdHJpc3RhdGUgIkZDUCBob3N0IGJ1cyBhZGFwdGVyIGRyaXZlciBmb3IgSUJNIGVTZXJ2ZXIgelNlcmllcyIKKwlkZXBlbmRzIG9uIEFSQ0hfUzM5MCAmJiBRRElPICYmIFNDU0kKKwlzZWxlY3QgU0NTSV9GQ19BVFRSUworCWhlbHAKKyAgICAgICAgICBJZiB5b3Ugd2FudCB0byBhY2Nlc3MgU0NTSSBkZXZpY2VzIGF0dGFjaGVkIHRvIHlvdXIgSUJNIGVTZXJ2ZXIKKyAgICAgICAgICB6U2VyaWVzIGJ5IG1lYW5zIG9mIEZpYnJlIENoYW5uZWwgaW50ZXJmYWNlcyBzYXkgWS4KKyAgICAgICAgICBGb3IgZGV0YWlscyBwbGVhc2UgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgYnkgSUJNIGF0CisgICAgICAgICAgPGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpbnV4MzkwPgorCisgICAgICAgICAgVGhpcyBkcml2ZXIgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUuIFRoaXMgbW9kdWxlIHdpbGwgYmUKKyAgICAgICAgICBjYWxsZWQgemZjcC4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZQorICAgICAgICAgIGFuZCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LgorCitlbmRtZW51CisKK3NvdXJjZSAiZHJpdmVycy9zY3NpL3BjbWNpYS9LY29uZmlnIgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmY2VlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQpAQCAtMCwwICsxLDE4NCBAQAorIworIyBNYWtlZmlsZSBmb3IgbGludXgvZHJpdmVycy9zY3NpCisjCisjIDMwIE1heSAyMDAwLCBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGluZnJhZGVhZC5vcmc+CisjIFJld3JpdHRlbiB0byB1c2UgbGlzdHMgaW5zdGVhZCBvZiBpZi1zdGF0ZW1lbnRzLgorIworIyAyMCBTZXAgMjAwMCwgVG9yYmVuIE1hdGhpYXNlbiA8dG1tQGltYWdlLmRrPgorIyBDaGFuZ2VkIGxpbmsgb3JkZXIgdG8gcmVmbGVjdCBuZXcgc2NzaSBpbml0aWFsaXphdGlvbi4KKyMKKyMgKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqIQorIyBUaGUgbGluayBvcmRlciBtdXN0IGJlLCBTQ1NJIENvcmUsIFNDU0kgSEJBIGRyaXZlcnMsIGFuZAorIyBsYXN0bHkgU0NTSSBwZXJpcGhlcmFsIGRyaXZlcnMgKGRpc2svdGFwZS9jZHJvbS9ldGMuKSB0bworIyBzYXRpc2Z5IGNlcnRhaW4gaW5pdGlhbGl6YXRpb24gYXNzdW1wdGlvbnMgaW4gdGhlIFNDU0kgbGF5ZXIuCisjICohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEKKworCitDRkxBR1NfYWhhMTUyeC5vID0gICAtREFIQTE1MlhfU1RBVCAtREFVVE9DT05GCitDRkxBR1NfZ2R0aC5vICAgID0gIyAtRERFQlVHX0dEVEg9MiAtRF9fU0VSSUFMX18gLURfX0NPTTJfXyAtREdEVEhfU1RBVElTVElDUworQ0ZMQUdTX3NlYWdhdGUubyA9ICAgLURBUkJJVFJBVEUgLURQQVJJVFkgLURTRUFHQVRFX1VTRV9BU00KKworc3ViZGlyLSQoQ09ORklHX1BDTUNJQSkJCSs9IHBjbWNpYQorCitvYmotJChDT05GSUdfU0NTSSkJCSs9IHNjc2lfbW9kLm8KKworIyAtLS0gTk9URSBPUkRFUklORyBIRVJFIC0tLQorIyBGb3Iga2VybmVsIG5vbi1tb2R1bGFyIGxpbmssIHRyYW5zcG9ydCBhdHRyaWJ1dGVzIG5lZWQgdG8KKyMgYmUgaW5pdGlhbGlzZWQgYmVmb3JlIGRyaXZlcnMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK29iai0kKENPTkZJR19TQ1NJX1NQSV9BVFRSUykJKz0gc2NzaV90cmFuc3BvcnRfc3BpLm8KK29iai0kKENPTkZJR19TQ1NJX0ZDX0FUVFJTKSAJKz0gc2NzaV90cmFuc3BvcnRfZmMubworb2JqLSQoQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMpCSs9IHNjc2lfdHJhbnNwb3J0X2lzY3NpLm8KKworb2JqLSQoQ09ORklHX1NDU0lfQU1JR0E3WFgpCSs9IGFtaWdhN3h4Lm8JNTNjN3h4Lm8KK29iai0kKENPTkZJR19BMzAwMF9TQ1NJKQkrPSBhMzAwMC5vCXdkMzNjOTMubworb2JqLSQoQ09ORklHX0EyMDkxX1NDU0kpCSs9IGEyMDkxLm8Jd2QzM2M5My5vCitvYmotJChDT05GSUdfR1ZQMTFfU0NTSSkJKz0gZ3ZwMTEubwl3ZDMzYzkzLm8KK29iai0kKENPTkZJR19NVk1FMTQ3X1NDU0kpCSs9IG12bWUxNDcubwl3ZDMzYzkzLm8KK29iai0kKENPTkZJR19TR0lXRDkzX1NDU0kpCSs9IHNnaXdkOTMubwl3ZDMzYzkzLm8KK29iai0kKENPTkZJR19DWUJFUlNUT1JNX1NDU0kpCSs9IE5DUjUzQzl4Lm8JY3liZXJzdG9ybS5vCitvYmotJChDT05GSUdfQ1lCRVJTVE9STUlJX1NDU0kpCSs9IE5DUjUzQzl4Lm8JY3liZXJzdG9ybUlJLm8KK29iai0kKENPTkZJR19CTFoyMDYwX1NDU0kpCSs9IE5DUjUzQzl4Lm8JYmx6MjA2MC5vCitvYmotJChDT05GSUdfQkxaMTIzMF9TQ1NJKQkrPSBOQ1I1M0M5eC5vCWJsejEyMzAubworb2JqLSQoQ09ORklHX0ZBU1RMQU5FX1NDU0kpCSs9IE5DUjUzQzl4Lm8JZmFzdGxhbmUubworb2JqLSQoQ09ORklHX09LVEFHT05fU0NTSSkJKz0gTkNSNTNDOXgubwlva3RhZ29uX2VzcC5vCW9rdGFnb25faW8ubworb2JqLSQoQ09ORklHX0FUQVJJX1NDU0kpCSs9IGF0YXJpX3Njc2kubworb2JqLSQoQ09ORklHX01BQ19TQ1NJKQkJKz0gbWFjX3Njc2kubworb2JqLSQoQ09ORklHX1NDU0lfTUFDX0VTUCkJKz0gbWFjX2VzcC5vCU5DUjUzQzl4Lm8KK29iai0kKENPTkZJR19TVU4zX1NDU0kpCQkrPSBzdW4zX3Njc2kubyAgc3VuM19zY3NpX3ZtZS5vCitvYmotJChDT05GSUdfTVZNRTE2eF9TQ1NJKQkrPSBtdm1lMTZ4Lm8JNTNjN3h4Lm8KK29iai0kKENPTkZJR19CVk1FNjAwMF9TQ1NJKQkrPSBidm1lNjAwMC5vCTUzYzd4eC5vCitvYmotJChDT05GSUdfU0NTSV9TSU03MTApCSs9IDUzYzcwMC5vCXNpbTcxMC5vCitvYmotJChDT05GSUdfU0NTSV9BRFZBTlNZUykJKz0gYWR2YW5zeXMubworb2JqLSQoQ09ORklHX1NDU0lfUENJMjAwMCkJKz0gcGNpMjAwMC5vCitvYmotJChDT05GSUdfU0NTSV9QQ0kyMjIwSSkJKz0gcGNpMjIyMGkubworb2JqLSQoQ09ORklHX1NDU0lfUFNJMjQwSSkJKz0gcHNpMjQwaS5vCitvYmotJChDT05GSUdfU0NTSV9CVVNMT0dJQykJKz0gQnVzTG9naWMubworb2JqLSQoQ09ORklHX1NDU0lfRFBUX0kyTykJKz0gZHB0X2kyby5vCitvYmotJChDT05GSUdfU0NTSV9VMTRfMzRGKQkrPSB1MTQtMzRmLm8KK29iai0kKENPTkZJR19TQ1NJX1VMVFJBU1RPUikJKz0gdWx0cmFzdG9yLm8KK29iai0kKENPTkZJR19TQ1NJX0FIQTE1MlgpCSs9IGFoYTE1Mngubworb2JqLSQoQ09ORklHX1NDU0lfQUhBMTU0MikJKz0gYWhhMTU0Mi5vCitvYmotJChDT05GSUdfU0NTSV9BSEExNzQwKQkrPSBhaGExNzQwLm8KK29iai0kKENPTkZJR19TQ1NJX0FJQzdYWFgpCSs9IGFpYzd4eHgvCitvYmotJChDT05GSUdfU0NTSV9BSUM3OVhYKQkrPSBhaWM3eHh4Lworb2JqLSQoQ09ORklHX1NDU0lfQUFDUkFJRCkJKz0gYWFjcmFpZC8KK29iai0kKENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEKQkrPSBhaWM3eHh4X29sZC5vCitvYmotJChDT05GSUdfU0NTSV9JUFMpCQkrPSBpcHMubworb2JqLSQoQ09ORklHX1NDU0lfRkRfTUNTKQkrPSBmZF9tY3Mubworb2JqLSQoQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTikrPSBmZG9tYWluLm8KK29iai0kKENPTkZJR19TQ1NJX0lOMjAwMCkJKz0gaW4yMDAwLm8KK29iai0kKENPTkZJR19TQ1NJX0dFTkVSSUNfTkNSNTM4MCkgKz0gZ19OQ1I1MzgwLm8KK29iai0kKENPTkZJR19TQ1NJX0dFTkVSSUNfTkNSNTM4MF9NTUlPKSArPSBnX05DUjUzODBfbW1pby5vCitvYmotJChDT05GSUdfU0NTSV9OQ1I1M0M0MDZBKQkrPSBOQ1I1M2M0MDZhLm8KK29iai0kKENPTkZJR19TQ1NJX05DUl9ENzAwKQkrPSA1M2M3MDAubyBOQ1JfRDcwMC5vCitvYmotJChDT05GSUdfU0NTSV9OQ1JfUTcyMCkJKz0gTkNSX1E3MjBfbW9kLm8KK29iai0kKENPTkZJR19TQ1NJX1NZTTUzQzQxNikJKz0gc3ltNTNjNDE2Lm8KK29iai0kKENPTkZJR19TQ1NJX1FMT0dJQ19GQVMpCSs9IHFsb2dpY2ZhczQwOC5vCXFsb2dpY2Zhcy5vCitvYmotJChDT05GSUdfUENNQ0lBX1FMT0dJQykJKz0gcWxvZ2ljZmFzNDA4Lm8KK29iai0kKENPTkZJR19TQ1NJX1FMT0dJQ19JU1ApCSs9IHFsb2dpY2lzcC5vIAorb2JqLSQoQ09ORklHX1NDU0lfUUxPR0lDX0ZDKQkrPSBxbG9naWNmYy5vIAorb2JqLSQoQ09ORklHX1NDU0lfUUxPR0lDXzEyODApCSs9IHFsYTEyODAubyAKK29iai0kKENPTkZJR19TQ1NJX1FMQTJYWFgpCSs9IHFsYTJ4eHgvCitvYmotJChDT05GSUdfU0NTSV9QQVMxNikJKz0gcGFzMTYubworb2JqLSQoQ09ORklHX1NDU0lfU0VBR0FURSkJKz0gc2VhZ2F0ZS5vCitvYmotJChDT05GSUdfU0NTSV9GRF84eHgpCSs9IHNlYWdhdGUubworb2JqLSQoQ09ORklHX1NDU0lfVDEyOCkJCSs9IHQxMjgubworb2JqLSQoQ09ORklHX1NDU0lfRE1YMzE5MUQpCSs9IGRteDMxOTFkLm8KK29iai0kKENPTkZJR19TQ1NJX0RUQzMyODApCSs9IGR0Yy5vCitvYmotJChDT05GSUdfU0NTSV9TWU01M0M4WFhfMikJKz0gc3ltNTNjOHh4XzIvCitvYmotJChDT05GSUdfU0NTSV9aQUxPTikJKz0gemFsb243eHgubworb2JqLSQoQ09ORklHX1NDU0lfRUFUQV9QSU8pCSs9IGVhdGFfcGlvLm8KK29iai0kKENPTkZJR19TQ1NJXzcwMDBGQVNTVCkJKz0gd2Q3MDAwLm8KK29iai0kKENPTkZJR19TQ1NJX01DQV81M0M5WCkJKz0gTkNSNTNDOXgubwltY2FfNTNjOXgubworb2JqLSQoQ09ORklHX1NDU0lfSUJNTUNBKQkrPSBpYm1tY2Eubworb2JqLSQoQ09ORklHX1NDU0lfRUFUQSkJCSs9IGVhdGEubworb2JqLSQoQ09ORklHX1NDU0lfREMzOTV4KQkrPSBkYzM5NXgubworb2JqLSQoQ09ORklHX1NDU0lfREMzOTBUKQkrPSB0bXNjc2ltLm8KK29iai0kKENPTkZJR19NRUdBUkFJRF9MRUdBQ1kpCSs9IG1lZ2FyYWlkLm8KK29iai0kKENPTkZJR19NRUdBUkFJRF9ORVdHRU4pCSs9IG1lZ2FyYWlkLworb2JqLSQoQ09ORklHX1NDU0lfQUNBUkQpCSs9IGF0cDg3MHUubworb2JqLSQoQ09ORklHX1NDU0lfU1VORVNQKQkrPSBlc3Aubworb2JqLSQoQ09ORklHX1NDU0lfR0RUSCkJCSs9IGdkdGgubworb2JqLSQoQ09ORklHX1NDU0lfSU5JVElPKQkrPSBpbml0aW8ubworb2JqLSQoQ09ORklHX1NDU0lfSU5JQTEwMCkJKz0gYTEwMHUydy5vCitvYmotJChDT05GSUdfU0NTSV9RTE9HSUNQVEkpCSs9IHFsb2dpY3B0aS5vCitvYmotJChDT05GSUdfQkxLX0RFVl9JREVTQ1NJKQkrPSBpZGUtc2NzaS5vCitvYmotJChDT05GSUdfU0NTSV9NRVNIKQkJKz0gbWVzaC5vCitvYmotJChDT05GSUdfU0NTSV9NQUM1M0M5NCkJKz0gbWFjNTNjOTQubworb2JqLSQoQ09ORklHX1NDU0lfUExVVE8pCSs9IHBsdXRvLm8KK29iai0kKENPTkZJR19TQ1NJX0RFQ05DUikJKz0gTkNSNTNDOXgubwlkZWNfZXNwLm8KK29iai0kKENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCkgKz0gM3cteHh4eC5vCitvYmotJChDT05GSUdfU0NTSV8zV185WFhYKQkrPSAzdy05eHh4Lm8KK29iai0kKENPTkZJR19TQ1NJX1BQQSkJCSs9IHBwYS5vCitvYmotJChDT05GSUdfU0NTSV9JTU0pCQkrPSBpbW0ubworb2JqLSQoQ09ORklHX0pBWlpfRVNQKQkJKz0gTkNSNTNDOXgubwlqYXp6X2VzcC5vCitvYmotJChDT05GSUdfU1VOM1hfRVNQKQkJKz0gTkNSNTNDOXgubwlzdW4zeF9lc3Aubworb2JqLSQoQ09ORklHX1NDU0lfREVCVUcpCSs9IHNjc2lfZGVidWcubworb2JqLSQoQ09ORklHX1NDU0lfRkNBTCkJCSs9IGZjYWwubworb2JqLSQoQ09ORklHX1NDU0lfQ1BRRkNUUykJKz0gY3BxZmMubworb2JqLSQoQ09ORklHX1NDU0lfTEFTSTcwMCkJKz0gNTNjNzAwLm8gbGFzaTcwMC5vCitvYmotJChDT05GSUdfU0NTSV9OU1AzMikJKz0gbnNwMzIubworb2JqLSQoQ09ORklHX1NDU0lfSVBSKQkJKz0gaXByLm8KK29iai0kKENPTkZJR19TQ1NJX0lCTVZTQ1NJKQkrPSBpYm12c2NzaS8KK29iai0kKENPTkZJR19TQ1NJX1NBVEFfQUhDSSkJKz0gbGliYXRhLm8gYWhjaS5vCitvYmotJChDT05GSUdfU0NTSV9TQVRBX1NWVykJKz0gbGliYXRhLm8gc2F0YV9zdncubworb2JqLSQoQ09ORklHX1NDU0lfQVRBX1BJSVgpCSs9IGxpYmF0YS5vIGF0YV9waWl4Lm8KK29iai0kKENPTkZJR19TQ1NJX1NBVEFfUFJPTUlTRSkJKz0gbGliYXRhLm8gc2F0YV9wcm9taXNlLm8KK29iai0kKENPTkZJR19TQ1NJX1NBVEFfUVNUT1IpCSs9IGxpYmF0YS5vIHNhdGFfcXN0b3Iubworb2JqLSQoQ09ORklHX1NDU0lfU0FUQV9TSUwpCSs9IGxpYmF0YS5vIHNhdGFfc2lsLm8KK29iai0kKENPTkZJR19TQ1NJX1NBVEFfVklBKQkrPSBsaWJhdGEubyBzYXRhX3ZpYS5vCitvYmotJChDT05GSUdfU0NTSV9TQVRBX1ZJVEVTU0UpCSs9IGxpYmF0YS5vIHNhdGFfdnNjLm8KK29iai0kKENPTkZJR19TQ1NJX1NBVEFfU0lTKQkrPSBsaWJhdGEubyBzYXRhX3Npcy5vCitvYmotJChDT05GSUdfU0NTSV9TQVRBX1NYNCkJKz0gbGliYXRhLm8gc2F0YV9zeDQubworb2JqLSQoQ09ORklHX1NDU0lfU0FUQV9OVikJKz0gbGliYXRhLm8gc2F0YV9udi5vCitvYmotJChDT05GSUdfU0NTSV9TQVRBX1VMSSkJKz0gbGliYXRhLm8gc2F0YV91bGkubworCitvYmotJChDT05GSUdfQVJNKQkJKz0gYXJtLworCitvYmotJChDT05GSUdfQ0hSX0RFVl9TVCkJKz0gc3Qubworb2JqLSQoQ09ORklHX0NIUl9ERVZfT1NTVCkJKz0gb3NzdC5vCitvYmotJChDT05GSUdfQkxLX0RFVl9TRCkJKz0gc2RfbW9kLm8KK29iai0kKENPTkZJR19CTEtfREVWX1NSKQkrPSBzcl9tb2Qubworb2JqLSQoQ09ORklHX0NIUl9ERVZfU0cpCSs9IHNnLm8KKworc2NzaV9tb2QteQkJCSs9IHNjc2kubyBob3N0cy5vIHNjc2lfaW9jdGwubyBjb25zdGFudHMubyBcCisJCQkJICAgc2NzaWNhbS5vIHNjc2lfZXJyb3IubyBzY3NpX2xpYi5vIFwKKwkJCQkgICBzY3NpX3NjYW4ubyBzY3NpX3N5c2ZzLm8gXAorCQkJCSAgIHNjc2lfZGV2aW5mby5vCitzY3NpX21vZC0kKENPTkZJR19TWVNDVEwpCSs9IHNjc2lfc3lzY3RsLm8KK3Njc2lfbW9kLSQoQ09ORklHX1NDU0lfUFJPQ19GUykJKz0gc2NzaV9wcm9jLm8KKworc2RfbW9kLW9ianMJOj0gc2Qubworc3JfbW9kLW9ianMJOj0gc3IubyBzcl9pb2N0bC5vIHNyX3ZlbmRvci5vCituY3I1M2M4eHgtZmxhZ3MtJChDT05GSUdfU0NTSV9aQUxPTikgXAorCQk6PSAtRENPTkZJR19OQ1I1M0M4WFhfUFJFRkVUQ0ggLURTQ1NJX05DUl9CSUdfRU5ESUFOIFwKKwkJCS1EQ09ORklHX1NDU0lfTkNSNTNDOFhYX05PX1dPUkRfVFJBTlNGRVJTCitDRkxBR1NfbmNyNTNjOHh4Lm8JOj0gJChuY3I1M2M4eHgtZmxhZ3MteSkgJChuY3I1M2M4eHgtZmxhZ3MtbSkKK3phbG9uN3h4LW9ianMJOj0gemFsb24ubyBuY3I1M2M4eHgubworTkNSX1E3MjBfbW9kLW9ianMJOj0gTkNSX1E3MjAubyBuY3I1M2M4eHgubworY3BxZmMtb2Jqcwk6PSBjcHFmY1RTaW5pdC5vIGNwcWZjVFNjb250cm9sLm8gY3BxZmNUU2kyYy5vIFwKKwkJICAgY3BxZmNUU3dvcmtlci5vIGNwcWZjVFN0cmlnZ2VyLm8KK2xpYmF0YS1vYmpzCTo9IGxpYmF0YS1jb3JlLm8gbGliYXRhLXNjc2kubworCisjIEZpbGVzIGdlbmVyYXRlZCB0aGF0IHNoYWxsIGJlIHJlbW92ZWQgdXBvbiBtYWtlIGNsZWFuCitjbGVhbi1maWxlcyA6PQk1M2M3eHhfZC5oIDUzYzcwMF9kLmgJXAorCQk1M2M3eHhfdS5oIDUzYzcwMF91LmgKKworJChvYmopLzUzYzd4eC5vOiAgICQob2JqKS81M2M3eHhfZC5oICQob2JqKS81M2M3eHhfdS5oCiskKG9iaikvNTNjNzAwLm8gJChNT0RWRVJESVIpLyQob2JqKS81M2M3MDAudmVyOiAkKG9iaikvNTNjNzAwX2QuaAorCisjIElmIHlvdSB3YW50IHRvIHBsYXkgd2l0aCB0aGUgZmlybXdhcmUsIHVuY29tbWVudAorIyBHRU5FUkFURV9GSVJNV0FSRSA6PSAxCisKK2lmZGVmIEdFTkVSQVRFX0ZJUk1XQVJFCisKKyQob2JqKS81M2M3eHhfZC5oOiAkKHNyYykvNTNjN3h4LnNjciAkKHNyYykvc2NyaXB0X2FzbS5wbAorCSQoQ1BQKSAtdHJhZGl0aW9uYWwgLURDSElQPTcxMCAtIDwgJDwgfCBncmVwIC12ICdeIycgfCAkKFBFUkwpIC1zICQoc3JjKS9zY3JpcHRfYXNtLnBsIC1uY3I3eDBfZmFtaWx5ICRAICQoQDpfZC5oPV91LmgpCisKKyQob2JqKS81M2M3eHhfdS5oOiAkKG9iaikvNTNjN3h4X2QuaAorCiskKG9iaikvNTNjNzAwX2QuaDogJChzcmMpLzUzYzcwMC5zY3IgJChzcmMpL3NjcmlwdF9hc20ucGwKKwkkKFBFUkwpIC1zICQoc3JjKS9zY3JpcHRfYXNtLnBsIC1uY3I3eDBfZmFtaWx5ICRAICQoQDpfZC5oPV91LmgpIDwgJDwKKworZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9OQ1I1MzgwLmMgYi9kcml2ZXJzL3Njc2kvTkNSNTM4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNzFhMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvTkNSNTM4MC5jCkBAIC0wLDAgKzEsMjg2MiBAQAorLyogCisgKiBOQ1IgNTM4MCBnZW5lcmljIGRyaXZlciByb3V0aW5lcy4gIFRoZXNlIHNob3VsZCBtYWtlIGl0ICp0cml2aWFsKgorICogICAgICB0byBpbXBsZW1lbnQgNTM4MCBTQ1NJIGRyaXZlcnMgdW5kZXIgTGludXggd2l0aCBhIG5vbi10cmFudG9yCisgKiAgICAgIGFyY2hpdGVjdHVyZS4KKyAqCisgKiAgICAgIE5vdGUgdGhhdCB0aGVzZSByb3V0aW5lcyBhbHNvIHdvcmsgd2l0aCBOUjUzYzQwMCBmYW1pbHkgY2hpcHMuCisgKgorICogQ29weXJpZ2h0IDE5OTMsIERyZXcgRWNraGFyZHQKKyAqICAgICAgVmlzaW9uYXJ5IENvbXB1dGluZyAKKyAqICAgICAgKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyAqICAgICAgZHJld0Bjb2xvcmFkby5lZHUKKyAqICAgICAgKzEgKDMwMykgNjY2LTU4MzYKKyAqCisgKiBESVNUUklCVVRJT04gUkVMRUFTRSA2LiAKKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKgorICogTkNSIDUzODAgRmFtaWx5CisgKiBTQ1NJIFByb3RvY29sIENvbnRyb2xsZXIKKyAqIERhdGFib29rCisgKgorICogTkNSIE1pY3JvZWxlY3Ryb25pY3MKKyAqIDE2MzUgQWVyb3BsYXphIERyaXZlCisgKiBDb2xvcmFkbyBTcHJpbmdzLCBDTyA4MDkxNgorICogMSsgKDcxOSkgNTc4LTM0MDAKKyAqIDErICg4MDApIDMzNC01NDU0CisgKi8KKworLyoKKyAqICRMb2c6IE5DUjUzODAuYyx2ICQKKworICogUmV2aXNpb24gMS4xMCAxOTk4LzkvMglBbGFuIENveAorICoJCQkJKGFsYW5AcmVkaGF0LmNvbSkKKyAqIEZpeGVkIHVwIHRoZSB0aW1lciBsb2NrdXBzIHJlcG9ydGVkIHNvIGZhci4gVGhpbmdzIHN0aWxsIHN1Y2suIExvb2tpbmcgCisgKiBmb3J3YXJkIHRvIDIuMyBhbmQgcGVyIGRldmljZSByZXF1ZXN0IHF1ZXVlcy4gVGhlbiBpdCdsbCBiZSBwb3NzaWJsZSB0bworICogU01QIHRocmVhZCB0aGlzIGJlYXN0IGFuZCBpbXByb3ZlIGxpZmUgbm8gZW5kLgorIAorICogUmV2aXNpb24gMS45ICAxOTk3LzcvMjcJUm9uYWxkIHZhbiBDdWlqbGVuYm9yZworICoJCQkJKHJvbmFsZC52YW4uY3VpamxlbmJvcmdAdGlwLm5sIG9yIG51dHR5QGRkcy5ubCkKKyAqIChob3BlZnVsbHkpIGZpeGVkIGFuZCBlbmhhbmNlZCBVU0xFRVAKKyAqIGFkZGVkIHN1cHBvcnQgZm9yIERUQzMxODFFIGNhcmQgKGZvciBNdXN0ZWsgc2Nhbm5lcikKKyAqCisKKyAqIFJldmlzaW9uIDEuOAkJCUluZ21hciBCYXVtZ2FydAorICoJCQkJKGluZ21hckBnb256by5zY2h3YWJlbi5kZSkKKyAqIGFkZGVkIHN1cHBvcnQgZm9yIE5DUjUzQzQwMGEgY2FyZAorICoKKworICogUmV2aXNpb24gMS43ICAxOTk2LzMvMiAgICAgICBSYXkgVmFuIFRhc3NsZSAocmF5dnRAY29tbS5tb3QuY29tKQorICogYWRkZWQgcHJvY19pbmZvCisgKiBhZGRlZCBzdXBwb3J0IG5lZWRlZCBmb3IgRFRDIDMxODAvMzI4MAorICogZml4ZWQgYSBjb3VwbGUgb2YgYnVncworICoKKworICogUmV2aXNpb24gMS41ICAxOTk0LzAxLzE5ICAwOToxNDo1NyAgZHJldworICogRml4ZWQgdWRlbGF5KCkgaGFjayB0aGF0IHdhcyBiZWluZyB1c2VkIG9uIERBVEFPVVQgcGhhc2VzCisgKiBpbnN0ZWFkIG9mIGEgcHJvcGVyIHdhaXQgZm9yIHRoZSBmaW5hbCBoYW5kc2hha2UuCisgKgorICogUmV2aXNpb24gMS40ICAxOTk0LzAxLzE5ICAwNjo0NDoyNSAgZHJldworICogKioqIGVtcHR5IGxvZyBtZXNzYWdlICoqKgorICoKKyAqIFJldmlzaW9uIDEuMyAgMTk5NC8wMS8xOSAgMDU6MjQ6NDAgIGRyZXcKKyAqIEFkZGVkIHN1cHBvcnQgZm9yIFRDUiBMQVNUX0JZVEVfU0VOVCBiaXQuCisgKgorICogUmV2aXNpb24gMS4yICAxOTk0LzAxLzE1ICAwNjoxNDoxMSAgZHJldworICogUkVBTCBETUEgc3VwcG9ydCwgYnVnIGZpeGVzLgorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5NC8wMS8xNSAgMDY6MDA6NTQgIGRyZXcKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKi8KKworLyoKKyAqIEZ1cnRoZXIgZGV2ZWxvcG1lbnQgLyB0ZXN0aW5nIHRoYXQgc2hvdWxkIGJlIGRvbmUgOiAKKyAqIDEuICBDbGVhbnVwIHRoZSBOQ1I1MzgwX3RyYW5zZmVyX2RtYSBmdW5jdGlvbiBhbmQgRE1BIG9wZXJhdGlvbiBjb21wbGV0ZQorICogICAgIGNvZGUgc28gdGhhdCBldmVyeXRoaW5nIGRvZXMgdGhlIHNhbWUgdGhpbmcgdGhhdCdzIGRvbmUgYXQgdGhlIAorICogICAgIGVuZCBvZiBhIHBzZXVkby1ETUEgcmVhZCBvcGVyYXRpb24uCisgKgorICogMi4gIEZpeCBSRUFMX0RNQSAoaW50ZXJydXB0IGRyaXZlbiwgcG9sbGVkIHdvcmtzIGZpbmUpIC0KKyAqICAgICBiYXNpY2FsbHksIHRyYW5zZmVyIHNpemUgbmVlZHMgdG8gYmUgcmVkdWNlZCBieSBvbmUgCisgKiAgICAgYW5kIHRoZSBsYXN0IGJ5dGUgcmVhZCBhcyBpcyBkb25lIHdpdGggUFNFVURPX0RNQS4KKyAqIAorICogNC4gIFRlc3QgU0NTSS1JSSB0YWdnZWQgcXVldWVpbmcgKEkgaGF2ZSBubyBkZXZpY2VzIHdoaWNoIHN1cHBvcnQgCisgKiAgICAgIHRhZ2dlZCBxdWV1ZWluZykKKyAqCisgKiA1LiAgVGVzdCBsaW5rZWQgY29tbWFuZCBoYW5kbGluZyBjb2RlIGFmdGVyIEVyaWMgaXMgcmVhZHkgd2l0aCAKKyAqICAgICAgdGhlIGhpZ2ggbGV2ZWwgY29kZS4KKyAqLworCisjaWYgKE5ERUJVRyAmIE5ERUJVR19MSVNUUykKKyNkZWZpbmUgTElTVCh4LHkpIHtwcmludGsoIkxJTkU6JWQgICBBZGRpbmcgJXAgdG8gJXBcbiIsIF9fTElORV9fLCAodm9pZCopKHgpLCAodm9pZCopKHkpKTsgaWYgKCh4KT09KHkpKSB1ZGVsYXkoNSk7IH0KKyNkZWZpbmUgUkVNT1ZFKHcseCx5LHopIHtwcmludGsoIkxJTkU6JWQgICBSZW1vdmluZzogJXAtPiVwICAlcC0+JXAgXG4iLCBfX0xJTkVfXywgKHZvaWQqKSh3KSwgKHZvaWQqKSh4KSwgKHZvaWQqKSh5KSwgKHZvaWQqKSh6KSk7IGlmICgoeCk9PSh5KSkgdWRlbGF5KDUpOyB9CisjZWxzZQorI2RlZmluZSBMSVNUKHgseSkKKyNkZWZpbmUgUkVNT1ZFKHcseCx5LHopCisjZW5kaWYKKworI2lmbmRlZiBub3R5ZXQKKyN1bmRlZiBMSU5LRUQKKyN1bmRlZiBSRUFMX0RNQQorI2VuZGlmCisKKyNpZmRlZiBSRUFMX0RNQV9QT0xMCisjdW5kZWYgUkVBRF9PVkVSUlVOUworI2RlZmluZSBSRUFEX09WRVJSVU5TCisjZW5kaWYKKworI2lmZGVmIEJPQVJEX1JFUVVJUkVTX05PX0RFTEFZCisjZGVmaW5lIGlvX3JlY292ZXJ5X2RlbGF5KHgpCisjZWxzZQorI2RlZmluZSBpb19yZWNvdmVyeV9kZWxheSh4KQl1ZGVsYXkoeCkKKyNlbmRpZgorCisvKgorICogRGVzaWduCisgKgorICogVGhpcyBpcyBhIGdlbmVyaWMgNTM4MCBkcml2ZXIuICBUbyB1c2UgaXQgb24gYSBkaWZmZXJlbnQgcGxhdGZvcm0sIAorICogb25lIHNpbXBseSB3cml0ZXMgYXBwcm9wcmlhdGUgc3lzdGVtIHNwZWNpZmljIG1hY3JvcyAoaWUsIGRhdGEKKyAqIHRyYW5zZmVyIC0gc29tZSBQQydzIHdpbGwgdXNlIHRoZSBJL08gYnVzLCA2OEsncyBtdXN0IHVzZSAKKyAqIG1lbW9yeSBtYXBwZWQpIGFuZCBkcm9wcyB0aGlzIGZpbGUgaW4gdGhlaXIgJ0MnIHdyYXBwZXIuCisgKgorICogKE5vdGUgZnJvbSBoY2g6ICB1bmZvcnR1bmF0ZWx5IGl0IHdhcyBub3QgZW5vdWdoIGZvciB0aGUgZGlmZmVyZW50CisgKiBtNjhrIGZvbGtzIGFuZCBpbnN0ZWFkIG9mIGltcHJvdmluZyB0aGlzIGRyaXZlciB0aGV5IGNvcGllZCBpdAorICogYW5kIGhhY2tlZCBpdCB1cCBmb3IgdGhlaXIgbmVlZHMuICBBcyBhIGNvbnNlcXVlbmNlIHRoZXkgbG9zdAorICogbW9zdCB1cGRhdGVzIHRvIHRoaXMgZHJpdmVyLiAgTWF5YmUgc29tZW9uZSB3aWxsIGZpeCBhbGwgdGhlc2UKKyAqIGRyaXZlcnMgdG8gdXNlIGEgY29tbW9uIGNvcmUgb25lIGRheS4uKQorICoKKyAqIEFzIGZhciBhcyBjb21tYW5kIHF1ZXVlaW5nLCB0d28gcXVldWVzIGFyZSBtYWludGFpbmVkIGZvciAKKyAqIGVhY2ggNTM4MCBpbiB0aGUgc3lzdGVtIC0gY29tbWFuZHMgdGhhdCBoYXZlbid0IGJlZW4gaXNzdWVkIHlldCwKKyAqIGFuZCBjb21tYW5kcyB0aGF0IGFyZSBjdXJyZW50bHkgZXhlY3V0aW5nLiAgVGhpcyBtZWFucyB0aGF0IGFuIAorICogdW5saW1pdGVkIG51bWJlciBvZiBjb21tYW5kcyBtYXkgYmUgcXVldWVkLCBsZXR0aW5nIAorICogbW9yZSBjb21tYW5kcyBwcm9wYWdhdGUgZnJvbSB0aGUgaGlnaGVyIGRyaXZlciBsZXZlbHMgZ2l2aW5nIGhpZ2hlciAKKyAqIHRocm91Z2hwdXQuICBOb3RlIHRoYXQgYm90aCBJX1RfTCBhbmQgSV9UX0xfUSBuZXh1c2VzIGFyZSBzdXBwb3J0ZWQsIAorICogYWxsb3dpbmcgbXVsdGlwbGUgY29tbWFuZHMgdG8gcHJvcGFnYXRlIGFsbCB0aGUgd2F5IHRvIGEgU0NTSS1JSSBkZXZpY2UgCisgKiB3aGlsZSBhIGNvbW1hbmQgaXMgYWxyZWFkeSBleGVjdXRpbmcuCisgKgorICoKKyAqIElzc3VlcyBzcGVjaWZpYyB0byB0aGUgTkNSNTM4MCA6IAorICoKKyAqIFdoZW4gdXNlZCBpbiBhIFBJTyBvciBwc2V1ZG8tZG1hIG1vZGUsIHRoZSBOQ1I1MzgwIGlzIGEgYnJhaW5kZWFkIAorICogcGllY2Ugb2YgaGFyZHdhcmUgdGhhdCByZXF1aXJlcyB5b3UgdG8gc2l0IGluIGEgbG9vcCBwb2xsaW5nIGZvciAKKyAqIHRoZSBSRVEgc2lnbmFsIGFzIGxvbmcgYXMgeW91IGFyZSBjb25uZWN0ZWQuICBTb21lIGRldmljZXMgYXJlIAorICogYnJhaW4gZGVhZCAoaWUsIG1hbnkgVEVYRUwgQ0QgUk9NIGRyaXZlcykgYW5kIHdvbid0IGRpc2Nvbm5lY3QgCisgKiB3aGlsZSBkb2luZyBsb25nIHNlZWsgb3BlcmF0aW9ucy4KKyAqIAorICogVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgaXMgdG8ga2VlcCB0cmFjayBvZiBkZXZpY2VzIHRoYXQgaGF2ZQorICogZGlzY29ubmVjdGVkLiAgSWYgdGhlIGRldmljZSBoYXNuJ3QgZGlzY29ubmVjdGVkLCBmb3IgY29tbWFuZHMgdGhhdAorICogc2hvdWxkIGRpc2Nvbm5lY3QsIHdlIGRvIHNvbWV0aGluZyBsaWtlIAorICoKKyAqIHdoaWxlICghUkVRIGlzIGFzc2VydGVkKSB7IHNsZWVwIGZvciBOIHVzZWNzOyBwb2xsIGZvciBNIHVzZWNzIH0KKyAqIAorICogU29tZSB0d2Vha2luZyBvZiBOIGFuZCBNIG5lZWRzIHRvIGJlIGRvbmUuICBBbiBhbGdvcml0aG0gYmFzZWQgCisgKiBvbiAidGltZSB0byBkYXRhIiB3b3VsZCBnaXZlIHRoZSBiZXN0IHJlc3VsdHMgYXMgbG9uZyBhcyBzaG9ydCB0aW1lCisgKiB0byBkYXRhcyAoaWUsIG9uIHRoZSBzYW1lIHRyYWNrKSB3ZXJlIGNvbnNpZGVyZWQsIGhvd2V2ZXIgdGhlc2UgCisgKiBicm9rZW4gZGV2aWNlcyBhcmUgdGhlIGV4Y2VwdGlvbiByYXRoZXIgdGhhbiB0aGUgcnVsZSBhbmQgSSdkIHJhdGhlcgorICogc3BlbmQgbXkgdGltZSBvcHRpbWl6aW5nIGZvciB0aGUgbm9ybWFsIGNhc2UuCisgKgorICogQXJjaGl0ZWN0dXJlIDoKKyAqCisgKiBBdCB0aGUgaGVhcnQgb2YgdGhlIGRlc2lnbiBpcyBhIGNvcm91dGluZSwgTkNSNTM4MF9tYWluLAorICogd2hpY2ggaXMgc3RhcnRlZCBmcm9tIGEgd29ya3F1ZXVlIGZvciBlYWNoIE5DUjUzODAgaG9zdCBpbiB0aGUKKyAqIHN5c3RlbS4gIEl0IGF0dGVtcHRzIHRvIGVzdGFibGlzaCBJX1RfTCBvciBJX1RfTF9RIG5leHVzZXMgYnkKKyAqIHJlbW92aW5nIHRoZSBjb21tYW5kcyBmcm9tIHRoZSBpc3N1ZSBxdWV1ZSBhbmQgY2FsbGluZworICogTkNSNTM4MF9zZWxlY3QoKSBpZiBhIG5leHVzIGlzIG5vdCBlc3RhYmxpc2hlZC4gCisgKgorICogT25jZSBhIG5leHVzIGlzIGVzdGFibGlzaGVkLCB0aGUgTkNSNTM4MF9pbmZvcm1hdGlvbl90cmFuc2ZlcigpCisgKiBwaGFzZSBnb2VzIHRocm91Z2ggdGhlIHZhcmlvdXMgcGhhc2VzIGFzIGluc3RydWN0ZWQgYnkgdGhlIHRhcmdldC4KKyAqIGlmIHRoZSB0YXJnZXQgZ29lcyBpbnRvIE1TRyBJTiBhbmQgc2VuZHMgYSBESVNDT05ORUNUIG1lc3NhZ2UsCisgKiB0aGUgY29tbWFuZCBzdHJ1Y3R1cmUgaXMgcGxhY2VkIGludG8gdGhlIHBlciBpbnN0YW5jZSBkaXNjb25uZWN0ZWQKKyAqIHF1ZXVlLCBhbmQgTkNSNTM4MF9tYWluIHRyaWVzIHRvIGZpbmQgbW9yZSB3b3JrLiAgSWYgdGhlIHRhcmdldCBpcyAKKyAqIGlkbGUgZm9yIHRvbyBsb25nLCB0aGUgc3lzdGVtIHdpbGwgdHJ5IHRvIHNsZWVwLgorICoKKyAqIElmIGEgY29tbWFuZCBoYXMgZGlzY29ubmVjdGVkLCBldmVudHVhbGx5IGFuIGludGVycnVwdCB3aWxsIHRyaWdnZXIsCisgKiBjYWxsaW5nIE5DUjUzODBfaW50cigpICB3aGljaCB3aWxsIGluIHR1cm4gY2FsbCBOQ1I1MzgwX3Jlc2VsZWN0CisgKiB0byByZWVzdGFibGlzaCBhIG5leHVzLiAgVGhpcyB3aWxsIHJ1biBtYWluIGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBPbiBjb21tYW5kIHRlcm1pbmF0aW9uLCB0aGUgZG9uZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhcyAKKyAqIGFwcHJvcHJpYXRlLgorICoKKyAqIFNDU0kgcG9pbnRlcnMgYXJlIG1haW50YWluZWQgaW4gdGhlIFNDcCBmaWVsZCBvZiBTQ1NJIGNvbW1hbmQgCisgKiBzdHJ1Y3R1cmVzLCBiZWluZyBpbml0aWFsaXplZCBhZnRlciB0aGUgY29tbWFuZCBpcyBjb25uZWN0ZWQKKyAqIGluIE5DUjUzODBfc2VsZWN0LCBhbmQgc2V0IGFzIGFwcHJvcHJpYXRlIGluIE5DUjUzODBfaW5mb3JtYXRpb25fdHJhbnNmZXIuCisgKiBOb3RlIHRoYXQgaW4gdmlvbGF0aW9uIG9mIHRoZSBzdGFuZGFyZCwgYW4gaW1wbGljaXQgU0FWRSBQT0lOVEVSUyBvcGVyYXRpb24KKyAqIGlzIGRvbmUsIHNpbmNlIHNvbWUgQlJPS0VOIGRpc2tzIGZhaWwgdG8gaXNzdWUgYW4gZXhwbGljaXQgU0FWRSBQT0lOVEVSUy4KKyAqLworCisvKgorICogVXNpbmcgdGhpcyBmaWxlIDoKKyAqIFRoaXMgZmlsZSBhIHNrZWxldG9uIExpbnV4IFNDU0kgZHJpdmVyIGZvciB0aGUgTkNSIDUzODAgc2VyaWVzCisgKiBvZiBjaGlwcy4gIFRvIHVzZSBpdCwgeW91IHdyaXRlIGFuIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBmdW5jdGlvbnMgCisgKiBhbmQgbWFjcm9zIGFuZCBpbmNsdWRlIHRoaXMgZmlsZSBpbiB5b3VyIGRyaXZlci4KKyAqCisgKiBUaGVzZSBtYWNyb3MgY29udHJvbCBvcHRpb25zIDogCisgKiBBVVRPUFJPQkVfSVJRIC0gaWYgZGVmaW5lZCwgdGhlIE5DUjUzODBfcHJvYmVfaXJxKCkgZnVuY3Rpb24gd2lsbCBiZSAKKyAqICAgICAgZGVmaW5lZC4KKyAqIAorICogQVVUT1NFTlNFIC0gaWYgZGVmaW5lZCwgUkVRVUVTVCBTRU5TRSB3aWxsIGJlIHBlcmZvcm1lZCBhdXRvbWF0aWNhbGx5CisgKiAgICAgIGZvciBjb21tYW5kcyB0aGF0IHJldHVybiB3aXRoIGEgQ0hFQ0sgQ09ORElUSU9OIHN0YXR1cy4gCisgKgorICogRElGRkVSRU5USUFMIC0gaWYgZGVmaW5lZCwgTkNSNTNjODEgY2hpcHMgd2lsbCB1c2UgZXh0ZXJuYWwgZGlmZmVyZW50aWFsCisgKiAgICAgIHRyYW5zY2VpdmVycy4gCisgKgorICogRE9OVF9VU0VfSU5UUiAtIGlmIGRlZmluZWQsIG5ldmVyIHVzZSBpbnRlcnJ1cHRzLCBldmVuIGlmIHdlIHByb2JlIG9yCisgKiAgICAgIG92ZXJyaWRlLWNvbmZpZ3VyZSBhbiBJUlEuCisgKgorICogTElNSVRfVFJBTlNGRVJTSVpFIC0gaWYgZGVmaW5lZCwgbGltaXQgdGhlIHBzZXVkby1kbWEgdHJhbnNmZXJzIHRvIDUxMgorICogICAgICBieXRlcyBhdCBhIHRpbWUuICBTaW5jZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0IGR1cmluZworICogICAgICB0aGVzZSB0cmFuc2ZlcnMsIHdlIG1pZ2h0IG5lZWQgdGhpcyB0byBnaXZlIHJlYXNvbmFibGUgaW50ZXJydXB0CisgKiAgICAgIHNlcnZpY2UgdGltZSBpZiB0aGUgdHJhbnNmZXIgc2l6ZSBnZXRzIHRvbyBsYXJnZS4KKyAqCisgKiBMSU5LRUQgLSBpZiBkZWZpbmVkLCBsaW5rZWQgY29tbWFuZHMgYXJlIHN1cHBvcnRlZC4KKyAqCisgKiBQU0VVRE9fRE1BIC0gaWYgZGVmaW5lZCwgUFNFVURPIERNQSBpcyB1c2VkIGR1cmluZyB0aGUgZGF0YSB0cmFuc2ZlciBwaGFzZXMuCisgKgorICogUkVBTF9ETUEgLSBpZiBkZWZpbmVkLCBSRUFMIERNQSBpcyB1c2VkIGR1cmluZyB0aGUgZGF0YSB0cmFuc2ZlciBwaGFzZXMuCisgKgorICogUkVBTF9ETUFfUE9MTCAtIGlmIGRlZmluZWQsIFJFQUwgRE1BIGlzIHVzZWQgYnV0IHRoZSBkcml2ZXIgZG9lc24ndAorICogICAgICByZWx5IG9uIHBoYXNlIG1pc21hdGNoIGFuZCBFT1AgaW50ZXJydXB0cyB0byBkZXRlcm1pbmUgZW5kIAorICogICAgICBvZiBwaGFzZS4KKyAqCisgKiBVTlNBRkUgLSBsZWF2ZSBpbnRlcnJ1cHRzIGVuYWJsZWQgZHVyaW5nIHBzZXVkby1ETUEgdHJhbnNmZXJzLiAgWW91CisgKiAgICAgICAgICBvbmx5IHJlYWxseSB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSdyZSBoYXZpbmcgYSBwcm9ibGVtIHdpdGgKKyAqICAgICAgICAgIGRyb3BwZWQgY2hhcmFjdGVycyBkdXJpbmcgaGlnaCBzcGVlZCBjb21tdW5pY2F0aW9ucywgYW5kIGV2ZW4KKyAqICAgICAgICAgIHRoZW4sIHlvdSdyZSBnb2luZyB0byBiZSBiZXR0ZXIgb2ZmIHR3aWRkbGluZyB3aXRoIHRyYW5zZmVyc2l6ZQorICogICAgICAgICAgaW4gdGhlIGhpZ2ggbGV2ZWwgY29kZS4KKyAqCisgKiBEZWZhdWx0cyBmb3IgdGhlc2Ugd2lsbCBiZSBwcm92aWRlZCBhbHRob3VnaCB0aGUgdXNlciBtYXkgd2FudCB0byBhZGp1c3QgCisgKiB0aGVzZSB0byBhbGxvY2F0ZSBDUFUgcmVzb3VyY2VzIHRvIHRoZSBTQ1NJIGRyaXZlciBvciAicmVhbCIgY29kZS4KKyAqIAorICogVVNMRUVQX1NMRUVQIC0gYW1vdW50IG9mIHRpbWUsIGluIGppZmZpZXMsIHRvIHNsZWVwCisgKgorICogVVNMRUVQX1BPTEwgLSBhbW91bnQgb2YgdGltZSwgaW4gamlmZmllcywgdG8gcG9sbAorICoKKyAqIFRoZXNlIG1hY3JvcyBNVVNUIGJlIGRlZmluZWQgOgorICogTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCkgLSBkZWNsYXJlIGFueSBsb2NhbCB2YXJpYWJsZXMgbmVlZGVkIGZvciB5b3VyCisgKiAgICAgIHRyYW5zZmVyIHJvdXRpbmVzLgorICoKKyAqIE5DUjUzODBfc2V0dXAoaW5zdGFuY2UpIC0gaW5pdGlhbGl6ZSBhbnkgbG9jYWwgdmFyaWFibGVzIG5lZWRlZCBmcm9tIGEgZ2l2ZW4KKyAqICAgICAgaW5zdGFuY2Ugb2YgdGhlIGhvc3QgYWRhcHRlciBmb3IgTkNSNTM4MF97cmVhZCx3cml0ZSxwcmVhZCxwd3JpdGV9CisgKiAKKyAqIE5DUjUzODBfcmVhZChyZWdpc3RlcikgIC0gcmVhZCBmcm9tIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIKKyAqCisgKiBOQ1I1MzgwX3dyaXRlKHJlZ2lzdGVyLCB2YWx1ZSkgLSB3cml0ZSB0byB0aGUgc3BlY2lmaWMgcmVnaXN0ZXIgCisgKgorICogTkNSNTM4MF9pbXBsZW1lbnRhdGlvbl9maWVsZHMgIC0gYWRkaXRpb25hbCBmaWVsZHMgbmVlZGVkIGZvciB0aGlzIAorICogICAgICBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTkNSNTM4MAorICoKKyAqIEVpdGhlciByZWFsIERNQSAqb3IqIHBzZXVkbyBETUEgbWF5IGJlIGltcGxlbWVudGVkCisgKiBSRUFMIGZ1bmN0aW9ucyA6IAorICogTkNSNTM4MF9SRUFMX0RNQSBzaG91bGQgYmUgZGVmaW5lZCBpZiByZWFsIERNQSBpcyB0byBiZSB1c2VkLgorICogTm90ZSB0aGF0IHRoZSBETUEgc2V0dXAgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyAKKyAqICAgICAgdGhhdCB0aGV5IHdlcmUgYWJsZSB0byBwcm9ncmFtIHRoZSBjb250cm9sbGVyIGZvci4KKyAqCisgKiBBbHNvIG5vdGUgdGhhdCBnZW5lcmljIGkzODYvUEMgdmVyc2lvbnMgb2YgdGhlc2UgbWFjcm9zIGFyZSAKKyAqICAgICAgYXZhaWxhYmxlIGFzIE5DUjUzODBfaTM4Nl9kbWFfd3JpdGVfc2V0dXAsCisgKiAgICAgIE5DUjUzODBfaTM4Nl9kbWFfcmVhZF9zZXR1cCwgYW5kIE5DUjUzODBfaTM4Nl9kbWFfcmVzaWR1YWwuCisgKgorICogTkNSNTM4MF9kbWFfd3JpdGVfc2V0dXAoaW5zdGFuY2UsIHNyYywgY291bnQpIC0gaW5pdGlhbGl6ZQorICogTkNSNTM4MF9kbWFfcmVhZF9zZXR1cChpbnN0YW5jZSwgZHN0LCBjb3VudCkgLSBpbml0aWFsaXplCisgKiBOQ1I1MzgwX2RtYV9yZXNpZHVhbChpbnN0YW5jZSk7IC0gcmVzaWR1YWwgY291bnQKKyAqCisgKiBQU0VVRE8gZnVuY3Rpb25zIDoKKyAqIE5DUjUzODBfcHdyaXRlKGluc3RhbmNlLCBzcmMsIGNvdW50KQorICogTkNSNTM4MF9wcmVhZChpbnN0YW5jZSwgZHN0LCBjb3VudCk7CisgKgorICogVGhlIGdlbmVyaWMgZHJpdmVyIGlzIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgTkNSNTM4MF9pbml0KGluc3RhbmNlKSwKKyAqIGFmdGVyIHNldHRpbmcgdGhlIGFwcHJvcHJpYXRlIGhvc3Qgc3BlY2lmaWMgZmllbGRzIGFuZCBJRC4gIElmIHRoZSAKKyAqIGRyaXZlciB3aXNoZXMgdG8gYXV0b3Byb2JlIGZvciBhbiBJUlEgbGluZSwgdGhlIE5DUjUzODBfcHJvYmVfaXJxKGluc3RhbmNlLAorICogcG9zc2libGUpIGZ1bmN0aW9uIG1heSBiZSB1c2VkLgorICovCisKK3N0YXRpYyBpbnQgZG9fYWJvcnQoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CitzdGF0aWMgdm9pZCBkb19yZXNldChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKKworLyoKKyAqCWluaXRpYWxpemVfU0NwCQktCWluaXQgdGhlIHNjc2kgcG9pbnRlciBmaWVsZAorICoJQGNtZDogY29tbWFuZCBibG9jayB0byBzZXQgdXAKKyAqCisgKglTZXQgdXAgdGhlIGludGVybmFsIGZpZWxkcyBpbiB0aGUgU0NTSSBjb21tYW5kLgorICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgaW5pdGlhbGl6ZV9TQ3AoU2NzaV9DbW5kICogY21kKQoreworCS8qIAorCSAqIEluaXRpYWxpemUgdGhlIFNjc2kgUG9pbnRlciBmaWVsZCBzbyB0aGF0IGFsbCBvZiB0aGUgY29tbWFuZHMgaW4gdGhlIAorCSAqIHZhcmlvdXMgcXVldWVzIGFyZSB2YWxpZC4KKwkgKi8KKworCWlmIChjbWQtPnVzZV9zZykgeworCQljbWQtPlNDcC5idWZmZXIgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIGNtZC0+YnVmZmVyOworCQljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gY21kLT51c2Vfc2cgLSAxOworCQljbWQtPlNDcC5wdHIgPSBwYWdlX2FkZHJlc3MoY21kLT5TQ3AuYnVmZmVyLT5wYWdlKSsKKwkJCSAgICAgICBjbWQtPlNDcC5idWZmZXItPm9mZnNldDsKKwkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IGNtZC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCX0gZWxzZSB7CisJCWNtZC0+U0NwLmJ1ZmZlciA9IE5VTEw7CisJCWNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSAwOworCQljbWQtPlNDcC5wdHIgPSAoY2hhciAqKSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJfQorfQorCisvKioKKyAqCU5DUjUzODBfcG9sbF9wb2xpdGVseQktCXdhaXQgZm9yIE5DUjUzODAgc3RhdHVzIGJpdHMKKyAqCUBpbnN0YW5jZTogY29udHJvbGxlciB0byBwb2xsCisgKglAcmVnOiA1MzgwIHJlZ2lzdGVyIHRvIHBvbGwKKyAqCUBiaXQ6IEJpdG1hc2sgdG8gY2hlY2sKKyAqCUB2YWw6IFZhbHVlIHJlcXVpcmVkIHRvIGV4aXQKKyAqCisgKglQb2xscyB0aGUgTkNSNTM4MCBpbiBhIHJlYXNvbmFibHkgZWZmaWNpZW50IG1hbm5lciB3YWl0aW5nIGZvcgorICoJYW4gZXZlbnQgdG8gb2NjdXIsIGFmdGVyIGEgc2hvcnQgcXVpY2sgcG9sbCB3ZSBiZWdpbiBnaXZpbmcgdGhlCisgKglDUFUgYmFjayBpbiBub24gSVJRIGNvbnRleHRzCisgKgorICoJUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworIAorc3RhdGljIGludCBOQ1I1MzgwX3BvbGxfcG9saXRlbHkoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGludCByZWcsIGludCBiaXQsIGludCB2YWwsIGludCB0KQoreworCU5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworCWludCBuID0gNTAwOwkJLyogQXQgYWJvdXQgOHVTIGEgY3ljbGUgZm9yIHRoZSBjcHUgYWNjZXNzICovCisJdW5zaWduZWQgbG9uZyBlbmQgPSBqaWZmaWVzICsgdDsKKwlpbnQgcjsKKwkKKwlOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKKworCXdoaWxlKCBuLS0gPiAwKQorCXsKKwkJciA9IE5DUjUzODBfcmVhZChyZWcpOworCQlpZigociAmIGJpdCkgPT0gdmFsKQorCQkJcmV0dXJuIDA7CisJCWNwdV9yZWxheCgpOworCX0KKwkKKwkvKiB0IHRpbWUgeWV0ID8gKi8KKwl3aGlsZSh0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmQpKQorCXsKKwkJciA9IE5DUjUzODBfcmVhZChyZWcpOworCQlpZigociAmIGJpdCkgPT0gdmFsKQorCQkJcmV0dXJuIDA7CisJCWlmKCFpbl9pbnRlcnJ1cHQoKSkKKwkJCXlpZWxkKCk7CisJCWVsc2UKKwkJCWNwdV9yZWxheCgpOworCX0KKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciB2YWx1ZTsKKwljb25zdCBjaGFyICpuYW1lOworfSBwaGFzZXNbXSA9IHsKKwl7UEhBU0VfREFUQU9VVCwgIkRBVEFPVVQifSwgCisJe1BIQVNFX0RBVEFJTiwgIkRBVEFJTiJ9LCAKKwl7UEhBU0VfQ01ET1VULCAiQ01ET1VUIn0sIAorCXtQSEFTRV9TVEFUSU4sICJTVEFUSU4ifSwgCisJe1BIQVNFX01TR09VVCwgIk1TR09VVCJ9LCAKKwl7UEhBU0VfTVNHSU4sICJNU0dJTiJ9LCAKKwl7UEhBU0VfVU5LTk9XTiwgIlVOS05PV04ifQorfTsKKworI2lmZGVmIE5ERUJVRworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBtYXNrOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9IHNpZ25hbHNbXSA9IHsgCisJe1NSX0RCUCwgIlBBUklUWSJ9LCAKKwl7U1JfUlNULCAiUlNUIn0sIAorCXtTUl9CU1ksICJCU1kifSwgCisJe1NSX1JFUSwgIlJFUSJ9LCAKKwl7U1JfTVNHLCAiTVNHIn0sIAorCXtTUl9DRCwgIkNEIn0sIAorCXtTUl9JTywgIklPIn0sIAorCXtTUl9TRUwsICJTRUwifSwgCisJezAsIE5VTEx9Cit9LCAKK2Jhc3JzW10gPSB7CisJe0JBU1JfQVROLCAiQVROIn0sIAorCXtCQVNSX0FDSywgIkFDSyJ9LCAKKwl7MCwgTlVMTH0KK30sIAoraWNyc1tdID0geyAKKwl7SUNSX0FTU0VSVF9SU1QsICJBU1NFUlQgUlNUIn0sIAorCXtJQ1JfQVNTRVJUX0FDSywgIkFTU0VSVCBBQ0sifSwgCisJe0lDUl9BU1NFUlRfQlNZLCAiQVNTRVJUIEJTWSJ9LCAKKwl7SUNSX0FTU0VSVF9TRUwsICJBU1NFUlQgU0VMIn0sIAorCXtJQ1JfQVNTRVJUX0FUTiwgIkFTU0VSVCBBVE4ifSwgCisJe0lDUl9BU1NFUlRfREFUQSwgIkFTU0VSVCBEQVRBIn0sIAorCXswLCBOVUxMfQorfSwgCittcnNbXSA9IHsgCisJe01SX0JMT0NLX0RNQV9NT0RFLCAiTU9ERSBCTE9DSyBETUEifSwgCisJe01SX1RBUkdFVCwgIk1PREUgVEFSR0VUIn0sIAorCXtNUl9FTkFCTEVfUEFSX0NIRUNLLCAiTU9ERSBQQVJJVFkgQ0hFQ0sifSwgCisJe01SX0VOQUJMRV9QQVJfSU5UUiwgIk1PREUgUEFSSVRZIElOVFIifSwgCisJe01SX01PTklUT1JfQlNZLCAiTU9ERSBNT05JVE9SIEJTWSJ9LCAKKwl7TVJfRE1BX01PREUsICJNT0RFIERNQSJ9LCAKKwl7TVJfQVJCSVRSQVRFLCAiTU9ERSBBUkJJVFJBVElPTiJ9LCAKKwl7MCwgTlVMTH0KK307CisKKy8qKgorICoJTkNSNTM4MF9wcmludAktCXByaW50IHNjc2kgYnVzIHNpZ25hbHMKKyAqCUBpbnN0YW5jZToJYWRhcHRlciBzdGF0ZSB0byBkdW1wCisgKgorICoJUHJpbnQgdGhlIFNDU0kgYnVzIHNpZ25hbHMgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcworICoKKyAqCUxvY2tzOiBjYWxsZXIgaG9sZHMgaG9zdGRhdGEgbG9jayAobm90IGVzc2VudGlhbCkKKyAqLworCitzdGF0aWMgdm9pZCBOQ1I1MzgwX3ByaW50KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworCU5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzLCBkYXRhLCBiYXNyLCBtciwgaWNyLCBpOworCU5DUjUzODBfc2V0dXAoaW5zdGFuY2UpOworCisJZGF0YSA9IE5DUjUzODBfcmVhZChDVVJSRU5UX1NDU0lfREFUQV9SRUcpOworCXN0YXR1cyA9IE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKTsKKwltciA9IE5DUjUzODBfcmVhZChNT0RFX1JFRyk7CisJaWNyID0gTkNSNTM4MF9yZWFkKElOSVRJQVRPUl9DT01NQU5EX1JFRyk7CisJYmFzciA9IE5DUjUzODBfcmVhZChCVVNfQU5EX1NUQVRVU19SRUcpOworCisJcHJpbnRrKCJTVEFUVVNfUkVHOiAlMDJ4ICIsIHN0YXR1cyk7CisJZm9yIChpID0gMDsgc2lnbmFsc1tpXS5tYXNrOyArK2kpCisJCWlmIChzdGF0dXMgJiBzaWduYWxzW2ldLm1hc2spCisJCQlwcmludGsoIiwlcyIsIHNpZ25hbHNbaV0ubmFtZSk7CisJcHJpbnRrKCJcbkJBU1I6ICUwMnggIiwgYmFzcik7CisJZm9yIChpID0gMDsgYmFzcnNbaV0ubWFzazsgKytpKQorCQlpZiAoYmFzciAmIGJhc3JzW2ldLm1hc2spCisJCQlwcmludGsoIiwlcyIsIGJhc3JzW2ldLm5hbWUpOworCXByaW50aygiXG5JQ1I6ICUwMnggIiwgaWNyKTsKKwlmb3IgKGkgPSAwOyBpY3JzW2ldLm1hc2s7ICsraSkKKwkJaWYgKGljciAmIGljcnNbaV0ubWFzaykKKwkJCXByaW50aygiLCVzIiwgaWNyc1tpXS5uYW1lKTsKKwlwcmludGsoIlxuTU9ERTogJTAyeCAiLCBtcik7CisJZm9yIChpID0gMDsgbXJzW2ldLm1hc2s7ICsraSkKKwkJaWYgKG1yICYgbXJzW2ldLm1hc2spCisJCQlwcmludGsoIiwlcyIsIG1yc1tpXS5uYW1lKTsKKwlwcmludGsoIlxuIik7Cit9CisKKworLyogCisgKglOQ1I1MzgwX3ByaW50X3BoYXNlCS0Jc2hvdyBTQ1NJIHBoYXNlCisgKglAaW5zdGFuY2U6IGFkYXB0ZXIgdG8gZHVtcAorICoKKyAqIAlQcmludCB0aGUgY3VycmVudCBTQ1NJIHBoYXNlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKyAqCisgKglMb2Nrczogbm9uZQorICovCisKK3N0YXRpYyB2b2lkIE5DUjUzODBfcHJpbnRfcGhhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisJTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJaW50IGk7CisJTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisKKwlzdGF0dXMgPSBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRyk7CisJaWYgKCEoc3RhdHVzICYgU1JfUkVRKSkKKwkJcHJpbnRrKCJzY3NpJWQgOiBSRVEgbm90IGFzc2VydGVkLCBwaGFzZSB1bmtub3duLlxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCWVsc2UgeworCQlmb3IgKGkgPSAwOyAocGhhc2VzW2ldLnZhbHVlICE9IFBIQVNFX1VOS05PV04pICYmIChwaGFzZXNbaV0udmFsdWUgIT0gKHN0YXR1cyAmIFBIQVNFX01BU0spKTsgKytpKTsKKwkJcHJpbnRrKCJzY3NpJWQgOiBwaGFzZSAlc1xuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIHBoYXNlc1tpXS5uYW1lKTsKKwl9Cit9CisjZW5kaWYKKworLyoKKyAqIFRoZXNlIG5lZWQgdHdlYWtpbmcsIGFuZCB3b3VsZCBwcm9iYWJseSB3b3JrIGJlc3QgYXMgcGVyLWRldmljZSAKKyAqIGZsYWdzIGluaXRpYWxpemVkIGRpZmZlcmVudGx5IGZvciBkaXNrLCB0YXBlLCBjZCwgZXRjIGRldmljZXMuCisgKiBQZW9wbGUgd2l0aCBicm9rZW4gZGV2aWNlcyBhcmUgZnJlZSB0byBleHBlcmltZW50IGFzIHRvIHdoYXQgZ2l2ZXMKKyAqIHRoZSBiZXN0IHJlc3VsdHMgZm9yIHRoZW0uCisgKgorICogVVNMRUVQX1NMRUVQIHNob3VsZCBiZSBhIG1pbmltdW0gc2VlayB0aW1lLgorICoKKyAqIFVTTEVFUF9QT0xMIHNob3VsZCBiZSBhIG1heGltdW0gcm90YXRpb25hbCBsYXRlbmN5LgorICovCisjaWZuZGVmIFVTTEVFUF9TTEVFUAorLyogMjAgbXMgKHJlYXNvbmFibGUgaGFyZCBkaXNrIHNwZWVkKSAqLworI2RlZmluZSBVU0xFRVBfU0xFRVAgKDIwKkhaLzEwMDApCisjZW5kaWYKKy8qIDMwMCBSUE0gKGZsb3BweSBzcGVlZCkgKi8KKyNpZm5kZWYgVVNMRUVQX1BPTEwKKyNkZWZpbmUgVVNMRUVQX1BPTEwgKDIwMCpIWi8xMDAwKQorI2VuZGlmCisjaWZuZGVmIFVTTEVFUF9XQUlUTE9ORworLyogUnZDOiAocmVhc29uYWJsZSB0aW1lIHRvIHdhaXQgb24gc2VsZWN0IGVycm9yKSAqLworI2RlZmluZSBVU0xFRVBfV0FJVExPTkcgVVNMRUVQX1NMRUVQCisjZW5kaWYKKworLyogCisgKiBGdW5jdGlvbiA6IGludCBzaG91bGRfZGlzY29ubmVjdCAodW5zaWduZWQgY2hhciBjbWQpCisgKgorICogUHVycG9zZSA6IGRlY2lkZSB3ZWF0aGVyIGEgY29tbWFuZCB3b3VsZCBub3JtYWxseSBkaXNjb25uZWN0IG9yIAorICogICAgICBub3QsIHNpbmNlIGlmIGl0IHdvbid0IGRpc2Nvbm5lY3Qgd2Ugc2hvdWxkIGdvIHRvIHNsZWVwLgorICoKKyAqIElucHV0IDogY21kIC0gb3Bjb2RlIG9mIFNDU0kgY29tbWFuZAorICoKKyAqIFJldHVybnMgOiBESVNDT05ORUNUX0xPTkcgaWYgd2Ugc2hvdWxkIGRpc2Nvbm5lY3QgZm9yIGEgcmVhbGx5IGxvbmcgCisgKiAgICAgIHRpbWUgKGllIGFsd2F5cywgc2xlZXAsIGxvb2sgZm9yIFJFUSBhY3RpdmUsIHNsZWVwKSwgCisgKiAgICAgIERJU0NPTk5FQ1RfVElNRV9UT19EQVRBIGlmIHdlIHdvdWxkIG9ubHkgZGlzY29ubmVjdCBmb3IgYSBub3JtYWwKKyAqICAgICAgdGltZS10by1kYXRhIGRlbGF5LCBESVNDT05ORUNUX05PTkUgaWYgdGhpcyBjb21tYW5kIHdvdWxkIHJldHVybgorICogICAgICBpbW1lZGlhdGVseS4KKyAqCisgKiAgICAgIEZ1dHVyZSBzbGVlcCBhbGdvcml0aG1zIGJhc2VkIG9uIHRpbWUgdG8gZGF0YSBjYW4gZXhwbG9pdCAKKyAqICAgICAgc29tZXRoaW5nIGxpa2UgdGhpcyBzbyB0aGV5IGNhbiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gIm5vcm1hbCIgCisgKiAgICAgIChpZSwgcmVhZCwgd3JpdGUsIHNlZWspIGFuZCB1bnVzdWFsIGNvbW1hbmRzIChpZSwgKiBmb3JtYXQpLgorICoKKyAqIE5vdGUgOiBXZSBkb24ndCBkZWFsIHdpdGggY29tbWFuZHMgdGhhdCBoYW5kbGUgYW4gaW1tZWRpYXRlIGRpc2Nvbm5lY3QsCisgKiAgICAgICAgCisgKi8KKworc3RhdGljIGludCBzaG91bGRfZGlzY29ubmVjdCh1bnNpZ25lZCBjaGFyIGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUkVBRF82OgorCWNhc2UgV1JJVEVfNjoKKwljYXNlIFNFRUtfNjoKKwljYXNlIFJFQURfMTA6CisJY2FzZSBXUklURV8xMDoKKwljYXNlIFNFRUtfMTA6CisJCXJldHVybiBESVNDT05ORUNUX1RJTUVfVE9fREFUQTsKKwljYXNlIEZPUk1BVF9VTklUOgorCWNhc2UgU0VBUkNIX0hJR0g6CisJY2FzZSBTRUFSQ0hfTE9XOgorCWNhc2UgU0VBUkNIX0VRVUFMOgorCQlyZXR1cm4gRElTQ09OTkVDVF9MT05HOworCWRlZmF1bHQ6CisJCXJldHVybiBESVNDT05ORUNUX05PTkU7CisJfQorfQorCitzdGF0aWMgdm9pZCBOQ1I1MzgwX3NldF90aW1lcihzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlob3N0ZGF0YS0+dGltZV9leHBpcmVzID0gamlmZmllcyArIHRpbWVvdXQ7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZob3N0ZGF0YS0+Y29yb3V0aW5lLCB0aW1lb3V0KTsKK30KKworCitzdGF0aWMgaW50IHByb2JlX2lycSBfX2luaXRkYXRhID0gMDsKKworLyoqCisgKglwcm9iZV9pbnRyCS0JaGVscGVyIGZvciBJUlEgYXV0b3Byb2JlCisgKglAaXJxOiBpbnRlcnJ1cHQgbnVtYmVyCisgKglAZGV2X2lkOiB1bnVzZWQKKyAqCUByZWdzOiB1bnVzZWQKKyAqCisgKglTZXQgYSBmbGFnIHRvIGluZGljYXRlIHRoZSBJUlEgaW4gcXVlc3Rpb24gd2FzIHJlY2VpdmVkLiBUaGlzIGlzCisgKgl1c2VkIGJ5IHRoZSBJUlEgcHJvYmUgY29kZS4KKyAqLworIAorc3RhdGljIGlycXJldHVybl90IF9faW5pdCBwcm9iZV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcHJvYmVfaXJxID0gaXJxOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKglOQ1I1MzgwX3Byb2JlX2lycQktCWZpbmQgdGhlIElSUSBvZiBhbiBOQ1I1MzgwCisgKglAaW5zdGFuY2U6IE5DUjUzODAgY29udHJvbGxlcgorICoJQHBvc3NpYmxlOiBiaXRtYXNrIG9mIElTQSBJUlEgbGluZXMKKyAqCisgKglBdXRvcHJvYmUgZm9yIHRoZSBJUlEgbGluZSB1c2VkIGJ5IHRoZSBOQ1I1MzgwIGJ5IHRyaWdnZXJpbmcgYW4gSVJRCisgKglhbmQgdGhlbiBsb29raW5nIHRvIHNlZSB3aGF0IGludGVycnVwdCBhY3R1YWxseSB0dXJuZWQgdXAuCisgKgorICoJTG9ja3M6IG5vbmUsIGlycXMgbXVzdCBiZSBlbmFibGVkIG9uIGVudHJ5CisgKi8KKworc3RhdGljIGludCBfX2luaXQgTkNSNTM4MF9wcm9iZV9pcnEoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGludCBwb3NzaWJsZSkKK3sKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwlzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKikgaW5zdGFuY2UtPmhvc3RkYXRhOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgdHJ5aW5nX2lycXMsIGksIG1hc2s7CisJTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisKKwlmb3IgKHRyeWluZ19pcnFzID0gaSA9IDAsIG1hc2sgPSAxOyBpIDwgMTY7ICsraSwgbWFzayA8PD0gMSkKKwkJaWYgKChtYXNrICYgcG9zc2libGUpICYmIChyZXF1ZXN0X2lycShpLCAmcHJvYmVfaW50ciwgU0FfSU5URVJSVVBULCAiTkNSLXByb2JlIiwgTlVMTCkgPT0gMCkpCisJCQl0cnlpbmdfaXJxcyB8PSBtYXNrOworCisJdGltZW91dCA9IGppZmZpZXMgKyAoMjUwICogSFogLyAxMDAwKTsKKwlwcm9iZV9pcnEgPSBTQ1NJX0lSUV9OT05FOworCisJLyoKKwkgKiBBIGludGVycnVwdCBpcyB0cmlnZ2VyZWQgd2hlbmV2ZXIgQlNZID0gZmFsc2UsIFNFTCA9IHRydWUKKwkgKiBhbmQgYSBiaXQgc2V0IGluIHRoZSBTRUxFQ1RfRU5BQkxFX1JFRyBpcyBhc3NlcnRlZCBvbiB0aGUgCisJICogU0NTSSBidXMuCisJICoKKwkgKiBOb3RlIHRoYXQgdGhlIGJ1cyBpcyBvbmx5IGRyaXZlbiB3aGVuIHRoZSBwaGFzZSBjb250cm9sIHNpZ25hbHMKKwkgKiAoSS9PLCBDL0QsIGFuZCBNU0cpIG1hdGNoIHRob3NlIGluIHRoZSBUQ1IsIHNvIHdlIG11c3QgcmVzZXQgdGhhdAorCSAqIHRvIHplcm8uCisJICovCisKKwlOQ1I1MzgwX3dyaXRlKFRBUkdFVF9DT01NQU5EX1JFRywgMCk7CisJTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCU5DUjUzODBfd3JpdGUoT1VUUFVUX0RBVEFfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9EQVRBIHwgSUNSX0FTU0VSVF9TRUwpOworCisJd2hpbGUgKHByb2JlX2lycSA9PSBTQ1NJX0lSUV9OT05FICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQorCXsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKwkKKwlOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCAwKTsKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCisJZm9yIChpID0gMCwgbWFzayA9IDE7IGkgPCAxNjsgKytpLCBtYXNrIDw8PSAxKQorCQlpZiAodHJ5aW5nX2lycXMgJiBtYXNrKQorCQkJZnJlZV9pcnEoaSwgTlVMTCk7CisKKwlyZXR1cm4gcHJvYmVfaXJxOworfQorCisvKioKKyAqCU5DUjU4MzgwX3ByaW50X29wdGlvbnMJLQlzaG93IG9wdGlvbnMKKyAqCUBpbnN0YW5jZTogdW51c2VkIGZvciBub3cKKyAqCisgKglDYWxsZWQgYnkgcHJvYmUgY29kZSBpbmRpY2F0aW5nIHRoZSBOQ1I1MzgwIGRyaXZlciBvcHRpb25zIHRoYXQgCisgKgl3ZXJlIHNlbGVjdGVkLiBBdCBzb21lIHBvaW50IHRoaXMgd2lsbCBzd2l0Y2ggdG8gcnVudGltZSBvcHRpb25zCisgKglyZWFkIGZyb20gdGhlIGFkYXB0ZXIgaW4gcXVlc3Rpb24KKyAqCisgKglMb2Nrczogbm9uZQorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBOQ1I1MzgwX3ByaW50X29wdGlvbnMoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisJcHJpbnRrKCIgZ2VuZXJpYyBvcHRpb25zIgorI2lmZGVmIEFVVE9QUk9CRV9JUlEKKwkgICAgICAgIiBBVVRPUFJPQkVfSVJRIgorI2VuZGlmCisjaWZkZWYgQVVUT1NFTlNFCisJICAgICAgICIgQVVUT1NFTlNFIgorI2VuZGlmCisjaWZkZWYgRElGRkVSRU5USUFMCisJICAgICAgICIgRElGRkVSRU5USUFMIgorI2VuZGlmCisjaWZkZWYgUkVBTF9ETUEKKwkgICAgICAgIiBSRUFMIERNQSIKKyNlbmRpZgorI2lmZGVmIFJFQUxfRE1BX1BPTEwKKwkgICAgICAgIiBSRUFMIERNQSBQT0xMIgorI2VuZGlmCisjaWZkZWYgUEFSSVRZCisJICAgICAgICIgUEFSSVRZIgorI2VuZGlmCisjaWZkZWYgUFNFVURPX0RNQQorCSAgICAgICAiIFBTRVVETyBETUEiCisjZW5kaWYKKyNpZmRlZiBVTlNBRkUKKwkgICAgICAgIiBVTlNBRkUgIgorI2VuZGlmCisJICAgICk7CisJcHJpbnRrKCIgVVNMRUVQLCBVU0xFRVBfUE9MTD0lZCBVU0xFRVBfU0xFRVA9JWQiLCBVU0xFRVBfUE9MTCwgVVNMRUVQX1NMRUVQKTsKKwlwcmludGsoIiBnZW5lcmljIHJlbGVhc2U9JWQiLCBOQ1I1MzgwX1BVQkxJQ19SRUxFQVNFKTsKKwlpZiAoKChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGEpLT5mbGFncyAmIEZMQUdfTkNSNTNDNDAwKSB7CisJCXByaW50aygiIG5jcjUzYzQwMCByZWxlYXNlPSVkIiwgTkNSNTNDNDAwX1BVQkxJQ19SRUxFQVNFKTsKKwl9Cit9CisKKy8qKgorICoJTkNSNTM4MF9wcmludF9zdGF0dXMgCS0JZHVtcCBjb250cm9sbGVyIGluZm8KKyAqCUBpbnN0YW5jZTogY29udHJvbGxlciB0byBkdW1wCisgKgorICoJUHJpbnQgY29tbWFuZHMgaW4gdGhlIHZhcmlvdXMgcXVldWVzLCBjYWxsZWQgZnJvbSBOQ1I1MzgwX2Fib3J0IAorICoJYW5kIE5DUjUzODBfZGVidWcgdG8gYWlkIGRlYnVnZ2luZy4KKyAqCisgKglMb2NrczogY2FsbGVkIGZ1bmN0aW9ucyBkaXNhYmxlIGlycXMKKyAqLworCitzdGF0aWMgdm9pZCBOQ1I1MzgwX3ByaW50X3N0YXR1cyhzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKwlOQ1I1MzgwX2RwcmludChOREVCVUdfQU5ZLCBpbnN0YW5jZSk7CisJTkNSNTM4MF9kcHJpbnRfcGhhc2UoTkRFQlVHX0FOWSwgaW5zdGFuY2UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIC9wcm9jL3Njc2kvW2R0YyBwYXMxNiB0MTI4IGdlbmVyaWNdL1swLUFTQ19OVU1fQk9BUkRfU1VQUE9SVEVEXQorICoKKyAqICpidWZmZXI6IEkvTyBidWZmZXIKKyAqICoqc3RhcnQ6IGlmIGlub3V0ID09IEZBTFNFIHBvaW50ZXIgaW50byBidWZmZXIgd2hlcmUgdXNlciByZWFkIHNob3VsZCBzdGFydAorICogb2Zmc2V0OiBjdXJyZW50IG9mZnNldAorICogbGVuZ3RoOiBsZW5ndGggb2YgYnVmZmVyCisgKiBob3N0bm86IFNjc2lfSG9zdCBob3N0X25vCisgKiBpbm91dDogVFJVRSAtIHVzZXIgaXMgd3JpdGluZzsgRkFMU0UgLSB1c2VyIGlzIHJlYWRpbmcKKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gb3Igd3JpdHRlbgorICovCisKKyN1bmRlZiBTUFJJTlRGCisjZGVmaW5lIFNQUklOVEYoYXJncy4uLikgZG8geyBpZihwb3MgPCBidWZmZXIgKyBsZW5ndGgtODApIHBvcyArPSBzcHJpbnRmKHBvcywgIyMgYXJncyk7IH0gd2hpbGUoMCkKK3N0YXRpYworY2hhciAqbHByaW50X1Njc2lfQ21uZChTY3NpX0NtbmQgKiBjbWQsIGNoYXIgKnBvcywgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYworY2hhciAqbHByaW50X2NvbW1hbmQodW5zaWduZWQgY2hhciAqY21kLCBjaGFyICpwb3MsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbik7CitzdGF0aWMKK2NoYXIgKmxwcmludF9vcGNvZGUoaW50IG9wY29kZSwgY2hhciAqcG9zLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpOworCitzdGF0aWMKK2ludCBOQ1I1MzgwX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworCWNoYXIgKnBvcyA9IGJ1ZmZlcjsKKwlzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisJU2NzaV9DbW5kICpwdHI7CisKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisKKwlpZiAoaW5vdXQpIHsJCS8qIEhhcyBkYXRhIGJlZW4gd3JpdHRlbiB0byB0aGUgZmlsZSA/ICovCisjaWZkZWYgRFRDX1BVQkxJQ19SRUxFQVNFCisJCWR0Y193bWF4aSA9IGR0Y19tYXhpID0gMDsKKyNlbmRpZgorI2lmZGVmIFBBUzE2X1BVQkxJQ19SRUxFQVNFCisJCXBhc193bWF4aSA9IHBhc19tYXhpID0gMDsKKyNlbmRpZgorCQlyZXR1cm4gKC1FTk9TWVMpOwkvKiBDdXJyZW50bHkgdGhpcyBpcyBhIG5vLW9wICovCisJfQorCVNQUklOVEYoIk5DUjUzODAgY29yZSByZWxlYXNlPSVkLiAgICIsIE5DUjUzODBfUFVCTElDX1JFTEVBU0UpOworCWlmICgoKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YSktPmZsYWdzICYgRkxBR19OQ1I1M0M0MDApCisJCVNQUklOVEYoIm5jcjUzYzQwMCByZWxlYXNlPSVkLiAgIiwgTkNSNTNDNDAwX1BVQkxJQ19SRUxFQVNFKTsKKyNpZmRlZiBEVENfUFVCTElDX1JFTEVBU0UKKwlTUFJJTlRGKCJEVEMgMzE4MC8zMjgwIHJlbGVhc2UgJWQiLCBEVENfUFVCTElDX1JFTEVBU0UpOworI2VuZGlmCisjaWZkZWYgVDEyOF9QVUJMSUNfUkVMRUFTRQorCVNQUklOVEYoIlQxMjggcmVsZWFzZSAlZCIsIFQxMjhfUFVCTElDX1JFTEVBU0UpOworI2VuZGlmCisjaWZkZWYgR0VORVJJQ19OQ1I1MzgwX1BVQkxJQ19SRUxFQVNFCisJU1BSSU5URigiR2VuZXJpYzUzODAgcmVsZWFzZSAlZCIsIEdFTkVSSUNfTkNSNTM4MF9QVUJMSUNfUkVMRUFTRSk7CisjZW5kaWYKKyNpZmRlZiBQQVMxNl9QVUJMSUNfUkVMRUFTRQorCVNQUklOVEYoIlBBUzE2IHJlbGVhc2U9JWQiLCBQQVMxNl9QVUJMSUNfUkVMRUFTRSk7CisjZW5kaWYKKworCVNQUklOVEYoIlxuQmFzZSBBZGRyOiAweCUwNWxYICAgICIsIChsb25nKSBpbnN0YW5jZS0+YmFzZSk7CisJU1BSSU5URigiaW9fcG9ydDogJTA0eCAgICAgICIsIChpbnQpIGluc3RhbmNlLT5pb19wb3J0KTsKKwlpZiAoaW5zdGFuY2UtPmlycSA9PSBTQ1NJX0lSUV9OT05FKQorCQlTUFJJTlRGKCJJUlE6IE5vbmUuXG4iKTsKKwllbHNlCisJCVNQUklOVEYoIklSUTogJWQuXG4iLCBpbnN0YW5jZS0+aXJxKTsKKworI2lmZGVmIERUQ19QVUJMSUNfUkVMRUFTRQorCVNQUklOVEYoIkhpZ2h3YXRlciBJL08gYnVzeV9zcGluX2NvdW50cyAtLSB3cml0ZTogJWQgIHJlYWQ6ICVkXG4iLCBkdGNfd21heGksIGR0Y19tYXhpKTsKKyNlbmRpZgorI2lmZGVmIFBBUzE2X1BVQkxJQ19SRUxFQVNFCisJU1BSSU5URigiSGlnaHdhdGVyIEkvTyBidXN5X3NwaW5fY291bnRzIC0tIHdyaXRlOiAlZCAgcmVhZDogJWRcbiIsIHBhc193bWF4aSwgcGFzX21heGkpOworI2VuZGlmCisJc3Bpbl9sb2NrX2lycShpbnN0YW5jZS0+aG9zdF9sb2NrKTsKKwlpZiAoIWhvc3RkYXRhLT5jb25uZWN0ZWQpCisJCVNQUklOVEYoInNjc2klZDogbm8gY3VycmVudGx5IGNvbm5lY3RlZCBjb21tYW5kXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJZWxzZQorCQlwb3MgPSBscHJpbnRfU2NzaV9DbW5kKChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmNvbm5lY3RlZCwgcG9zLCBidWZmZXIsIGxlbmd0aCk7CisJU1BSSU5URigic2NzaSVkOiBpc3N1ZV9xdWV1ZVxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCWZvciAocHRyID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7IHB0cjsgcHRyID0gKFNjc2lfQ21uZCAqKSBwdHItPmhvc3Rfc2NyaWJibGUpCisJCXBvcyA9IGxwcmludF9TY3NpX0NtbmQocHRyLCBwb3MsIGJ1ZmZlciwgbGVuZ3RoKTsKKworCVNQUklOVEYoInNjc2klZDogZGlzY29ubmVjdGVkX3F1ZXVlXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJZm9yIChwdHIgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWU7IHB0cjsgcHRyID0gKFNjc2lfQ21uZCAqKSBwdHItPmhvc3Rfc2NyaWJibGUpCisJCXBvcyA9IGxwcmludF9TY3NpX0NtbmQocHRyLCBwb3MsIGJ1ZmZlciwgbGVuZ3RoKTsKKwlzcGluX3VubG9ja19pcnEoaW5zdGFuY2UtPmhvc3RfbG9jayk7CisJCisJKnN0YXJ0ID0gYnVmZmVyOworCWlmIChwb3MgLSBidWZmZXIgPCBvZmZzZXQpCisJCXJldHVybiAwOworCWVsc2UgaWYgKHBvcyAtIGJ1ZmZlciAtIG9mZnNldCA8IGxlbmd0aCkKKwkJcmV0dXJuIHBvcyAtIGJ1ZmZlciAtIG9mZnNldDsKKwlyZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgY2hhciAqbHByaW50X1Njc2lfQ21uZChTY3NpX0NtbmQgKiBjbWQsIGNoYXIgKnBvcywgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQoreworCVNQUklOVEYoInNjc2klZCA6IGRlc3RpbmF0aW9uIHRhcmdldCAlZCwgbHVuICVkXG4iLCBjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9ubywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKwlTUFJJTlRGKCIgICAgICAgIGNvbW1hbmQgPSAiKTsKKwlwb3MgPSBscHJpbnRfY29tbWFuZChjbWQtPmNtbmQsIHBvcywgYnVmZmVyLCBsZW5ndGgpOworCXJldHVybiAocG9zKTsKK30KKworc3RhdGljIGNoYXIgKmxwcmludF9jb21tYW5kKHVuc2lnbmVkIGNoYXIgKmNvbW1hbmQsIGNoYXIgKnBvcywgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQoreworCWludCBpLCBzOworCXBvcyA9IGxwcmludF9vcGNvZGUoY29tbWFuZFswXSwgcG9zLCBidWZmZXIsIGxlbmd0aCk7CisJZm9yIChpID0gMSwgcyA9IENPTU1BTkRfU0laRShjb21tYW5kWzBdKTsgaSA8IHM7ICsraSkKKwkJU1BSSU5URigiJTAyeCAiLCBjb21tYW5kW2ldKTsKKwlTUFJJTlRGKCJcbiIpOworCXJldHVybiAocG9zKTsKK30KKworc3RhdGljIGNoYXIgKmxwcmludF9vcGNvZGUoaW50IG9wY29kZSwgY2hhciAqcG9zLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCit7CisJU1BSSU5URigiJTJkICgweCUwMngpIiwgb3Bjb2RlLCBvcGNvZGUpOworCXJldHVybiAocG9zKTsKK30KKworCisvKioKKyAqCU5DUjUzODBfaW5pdAktCWluaXRpYWxpc2UgYW4gTkNSNTM4MAorICoJQGluc3RhbmNlOiBhZGFwdGVyIHRvIGNvbmZpZ3VyZQorICoJQGZsYWdzOiBjb250cm9sIGZsYWdzCisgKgorICoJSW5pdGlhbGl6ZXMgKmluc3RhbmNlIGFuZCBjb3JyZXNwb25kaW5nIDUzODAgY2hpcCwKKyAqICAgICAgd2l0aCBmbGFncyBPUidkIGludG8gdGhlIGluaXRpYWwgZmxhZ3MgdmFsdWUuCisgKgorICoJTm90ZXMgOiBJIGFzc3VtZSB0aGF0IHRoZSBob3N0LCBob3N0bm8sIGFuZCBpZCBiaXRzIGhhdmUgYmVlbgorICogICAgICBzZXQgY29ycmVjdGx5LiAgSSBkb24ndCBjYXJlIGFib3V0IHRoZSBpcnEgYW5kIG90aGVyIGZpZWxkcy4gCisgKgorICoJUmV0dXJucyAwIGZvciBzdWNjZXNzCisgKgorICoJTG9ja3M6IGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIHdoZW4gd2UgYXJlIGNhbGxlZCAKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBOQ1I1MzgwX2luaXQoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGludCBmbGFncykKK3sKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwlpbnQgaSwgcGFzczsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKmhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKKworCWlmKGluX2ludGVycnVwdCgpKQorCQlwcmludGsoS0VSTl9FUlIgIk5DUjUzODBfaW5pdCBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIG9mZiFcbiIpOworCS8qIAorCSAqIE9uIE5DUjUzQzQwMCBib2FyZHMsIE5DUjUzODAgcmVnaXN0ZXJzIGFyZSBtYXBwZWQgOCBwYXN0IAorCSAqIHRoZSBiYXNlIGFkZHJlc3MuCisJICovCisKKyNpZmRlZiBOQ1I1M0M0MDAKKwlpZiAoZmxhZ3MgJiBGTEFHX05DUjUzQzQwMCkKKwkJaW5zdGFuY2UtPk5DUjUzODBfaW5zdGFuY2VfbmFtZSArPSBOQ1I1M0M0MDBfYWRkcmVzc19hZGp1c3Q7CisjZW5kaWYKKworCU5DUjUzODBfc2V0dXAoaW5zdGFuY2UpOworCisJaG9zdGRhdGEtPmFib3J0ZWQgPSAwOworCWhvc3RkYXRhLT5pZF9tYXNrID0gMSA8PCBpbnN0YW5jZS0+dGhpc19pZDsKKwlmb3IgKGkgPSBob3N0ZGF0YS0+aWRfbWFzazsgaSA8PSAweDgwOyBpIDw8PSAxKQorCQlpZiAoaSA+IGhvc3RkYXRhLT5pZF9tYXNrKQorCQkJaG9zdGRhdGEtPmlkX2hpZ2hlcl9tYXNrIHw9IGk7CisJZm9yIChpID0gMDsgaSA8IDg7ICsraSkKKwkJaG9zdGRhdGEtPmJ1c3lbaV0gPSAwOworI2lmZGVmIFJFQUxfRE1BCisJaG9zdGRhdGEtPmRtYWxlbiA9IDA7CisjZW5kaWYKKwlob3N0ZGF0YS0+dGFyZ2V0c19wcmVzZW50ID0gMDsKKwlob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKwlob3N0ZGF0YS0+aXNzdWVfcXVldWUgPSBOVUxMOworCWhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUgPSBOVUxMOworCQorCUlOSVRfV09SSygmaG9zdGRhdGEtPmNvcm91dGluZSwgTkNSNTM4MF9tYWluLCBob3N0ZGF0YSk7CisJCisjaWZkZWYgTkNSNTM4MF9TVEFUUworCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKwkJaG9zdGRhdGEtPnRpbWVfcmVhZFtpXSA9IDA7CisJCWhvc3RkYXRhLT50aW1lX3dyaXRlW2ldID0gMDsKKwkJaG9zdGRhdGEtPmJ5dGVzX3JlYWRbaV0gPSAwOworCQlob3N0ZGF0YS0+Ynl0ZXNfd3JpdGVbaV0gPSAwOworCX0KKwlob3N0ZGF0YS0+dGltZWJhc2UgPSAwOworCWhvc3RkYXRhLT5wZW5kaW5ndyA9IDA7CisJaG9zdGRhdGEtPnBlbmRpbmdyID0gMDsKKyNlbmRpZgorCisJLyogVGhlIENIRUNLIGNvZGUgc2VlbXMgdG8gYnJlYWsgdGhlIDUzQzQwMC4gV2lsbCBjaGVjayBpdCBsYXRlciBtYXliZSAqLworCWlmIChmbGFncyAmIEZMQUdfTkNSNTNDNDAwKQorCQlob3N0ZGF0YS0+ZmxhZ3MgPSBGTEFHX0hBU19MQVNUX0JZVEVfU0VOVCB8IGZsYWdzOworCWVsc2UKKwkJaG9zdGRhdGEtPmZsYWdzID0gRkxBR19DSEVDS19MQVNUX0JZVEVfU0VOVCB8IGZsYWdzOworCisJaG9zdGRhdGEtPmhvc3QgPSBpbnN0YW5jZTsKKwlob3N0ZGF0YS0+dGltZV9leHBpcmVzID0gMDsKKworI2lmbmRlZiBBVVRPU0VOU0UKKwlpZiAoKGluc3RhbmNlLT5jbWRfcGVyX2x1biA+IDEpIHx8IGluc3RhbmNlLT5jYW5fcXVldWUgPiAxKQorCQkgICAgcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkIDogV0FSTklORyA6IHN1cHBvcnQgZm9yIG11bHRpcGxlIG91dHN0YW5kaW5nIGNvbW1hbmRzIGVuYWJsZWRcbiIgIiAgICAgICAgIHdpdGhvdXQgQVVUT1NFTlNFIG9wdGlvbiwgY29udGluZ2VudCBhbGxlZ2lhbmNlIGNvbmRpdGlvbnMgbWF5XG4iCisJCSAgICAJICAgIiAgICAgICAgIGJlIGluY29ycmVjdGx5IGNsZWFyZWQuXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisjZW5kaWYJCQkJLyogZGVmIEFVVE9TRU5TRSAqLworCisJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKwlOQ1I1MzgwX3dyaXRlKFRBUkdFVF9DT01NQU5EX1JFRywgMCk7CisJTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgMCk7CisKKyNpZmRlZiBOQ1I1M0M0MDAKKwlpZiAoaG9zdGRhdGEtPmZsYWdzICYgRkxBR19OQ1I1M0M0MDApIHsKKwkJTkNSNTM4MF93cml0ZShDNDAwX0NPTlRST0xfU1RBVFVTX1JFRywgQ1NSX0JBU0UpOworCX0KKyNlbmRpZgorCisJLyogCisJICogRGV0ZWN0IGFuZCBjb3JyZWN0IGJ1cyB3ZWRnZSBwcm9ibGVtcy4KKwkgKgorCSAqIElmIHRoZSBzeXN0ZW0gY3Jhc2hlZCwgaXQgbWF5IGhhdmUgY3Jhc2hlZCBpbiBhIHN0YXRlIAorCSAqIHdoZXJlIGEgU0NTSSBjb21tYW5kIHdhcyBzdGlsbCBleGVjdXRpbmcsIGFuZCB0aGUgCisJICogU0NTSSBidXMgaXMgbm90IGluIGEgQlVTIEZSRUUgU1RBVEUuCisJICoKKwkgKiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB3ZSdsbCB0cnkgdG8gYWJvcnQgdGhlIGN1cnJlbnRseQorCSAqIGVzdGFibGlzaGVkIG5leHVzIHdoaWNoIHdlIGtub3cgbm90aGluZyBhYm91dCwgYW5kIHRoYXQKKwkgKiBmYWlsaW5nLCBkbyBhIGhhcmQgcmVzZXQgb2YgdGhlIFNDU0kgYnVzIAorCSAqLworCisJZm9yIChwYXNzID0gMTsgKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIFNSX0JTWSkgJiYgcGFzcyA8PSA2OyArK3Bhc3MpIHsKKwkJc3dpdGNoIChwYXNzKSB7CisJCWNhc2UgMToKKwkJY2FzZSAzOgorCQljYXNlIDU6CisJCQlwcmludGsoS0VSTl9JTkZPICJzY3NpJWQ6IFNDU0kgYnVzIGJ1c3ksIHdhaXRpbmcgdXAgdG8gZml2ZSBzZWNvbmRzXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJCQl0aW1lb3V0ID0gamlmZmllcyArIDUgKiBIWjsKKwkJCU5DUjUzODBfcG9sbF9wb2xpdGVseShpbnN0YW5jZSwgU1RBVFVTX1JFRywgU1JfQlNZLCAwLCA1KkhaKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQ6IGJ1cyBidXN5LCBhdHRlbXB0aW5nIGFib3J0XG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJCQlkb19hYm9ydChpbnN0YW5jZSk7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkOiBidXMgYnVzeSwgYXR0ZW1wdGluZyByZXNldFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCQkJZG9fcmVzZXQoaW5zdGFuY2UpOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkOiBidXMgbG9ja2VkIHNvbGlkIG9yIGludmFsaWQgb3ZlcnJpZGVcbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJTkNSNTM4MF9leGl0CS0JcmVtb3ZlIGFuIE5DUjUzODAKKyAqCUBpbnN0YW5jZTogYWRhcHRlciB0byByZW1vdmUKKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgTkNSNTM4MF9leGl0KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworCXN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisKKwljYW5jZWxfZGVsYXllZF93b3JrKCZob3N0ZGF0YS0+Y29yb3V0aW5lKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworfQorCisvKioKKyAqCU5DUjUzODBfcXVldWVfY29tbWFuZCAJCS0JcXVldWUgYSBjb21tYW5kCisgKglAY21kOiBTQ1NJIGNvbW1hbmQKKyAqCUBkb25lOiBjb21wbGV0aW9uIGhhbmRsZXIKKyAqCisgKiAgICAgIGNtZCBpcyBhZGRlZCB0byB0aGUgcGVyIGluc3RhbmNlIGlzc3VlX3F1ZXVlLCB3aXRoIG1pbm9yIAorICogICAgICB0d2lkZGxpbmcgZG9uZSB0byB0aGUgaG9zdCBzcGVjaWZpYyBmaWVsZHMgb2YgY21kLiAgSWYgdGhlIAorICogICAgICBtYWluIGNvcm91dGluZSBpcyBub3QgcnVubmluZywgaXQgaXMgcmVzdGFydGVkLgorICoKKyAqCUxvY2tzOiBob3N0IGxvY2sgdGFrZW4gYnkgY2FsbGVyCisgKi8KKworc3RhdGljIGludCBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQoU2NzaV9DbW5kICogY21kLCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSkgCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UgPSBjbWQtPmRldmljZS0+aG9zdDsKKwlzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKikgaW5zdGFuY2UtPmhvc3RkYXRhOworCVNjc2lfQ21uZCAqdG1wOworCisjaWYgKE5ERUJVRyAmIE5ERUJVR19OT19XUklURSkKKwlzd2l0Y2ggKGNtZC0+Y21uZFswXSkgeworCWNhc2UgV1JJVEVfNjoKKwljYXNlIFdSSVRFXzEwOgorCQlwcmludGsoInNjc2klZCA6IFdSSVRFIGF0dGVtcHRlZCB3aXRoIE5PX1dSSVRFIGRlYnVnZ2luZyBmbGFnIHNldFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCQljbWQtPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOworCQlkb25lKGNtZCk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgkJCQkvKiAoTkRFQlVHICYgTkRFQlVHX05PX1dSSVRFKSAqLworCisjaWZkZWYgTkNSNTM4MF9TVEFUUworCXN3aXRjaCAoY21kLT5jbW5kWzBdKSB7CisJCWNhc2UgV1JJVEU6CisJCWNhc2UgV1JJVEVfNjoKKwkJY2FzZSBXUklURV8xMDoKKwkJCWhvc3RkYXRhLT50aW1lX3dyaXRlW2NtZC0+ZGV2aWNlLT5pZF0gLT0gKGppZmZpZXMgLSBob3N0ZGF0YS0+dGltZWJhc2UpOworCQkJaG9zdGRhdGEtPmJ5dGVzX3dyaXRlW2NtZC0+ZGV2aWNlLT5pZF0gKz0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCQlob3N0ZGF0YS0+cGVuZGluZ3crKzsKKwkJCWJyZWFrOworCQljYXNlIFJFQUQ6CisJCWNhc2UgUkVBRF82OgorCQljYXNlIFJFQURfMTA6CisJCQlob3N0ZGF0YS0+dGltZV9yZWFkW2NtZC0+ZGV2aWNlLT5pZF0gLT0gKGppZmZpZXMgLSBob3N0ZGF0YS0+dGltZWJhc2UpOworCQkJaG9zdGRhdGEtPmJ5dGVzX3JlYWRbY21kLT5kZXZpY2UtPmlkXSArPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJCWhvc3RkYXRhLT5wZW5kaW5ncisrOworCQkJYnJlYWs7CisJfQorI2VuZGlmCisKKwkvKiAKKwkgKiBXZSB1c2UgdGhlIGhvc3Rfc2NyaWJibGUgZmllbGQgYXMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGNvbW1hbmQgIAorCSAqIGluIGEgcXVldWUgCisJICovCisKKwljbWQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCWNtZC0+c2NzaV9kb25lID0gZG9uZTsKKwljbWQtPnJlc3VsdCA9IDA7CisKKwkvKiAKKwkgKiBJbnNlcnQgdGhlIGNtZCBpbnRvIHRoZSBpc3N1ZSBxdWV1ZS4gTm90ZSB0aGF0IFJFUVVFU1QgU0VOU0UgCisJICogY29tbWFuZHMgYXJlIGFkZGVkIHRvIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBzaW5jZSBhbnkgY29tbWFuZCB3aWxsCisJICogY2xlYXIgdGhlIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb24gdGhhdCBleGlzdHMgYW5kIHRoZSAKKwkgKiBzZW5zZSBkYXRhIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZSB2YWxpZCB3aGlsZSB0aGUgY29uZGl0aW9uIGV4aXN0cy4KKwkgKi8KKworCWlmICghKGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSkgfHwgKGNtZC0+Y21uZFswXSA9PSBSRVFVRVNUX1NFTlNFKSkgeworCQlMSVNUKGNtZCwgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKTsKKwkJY21kLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOworCQlob3N0ZGF0YS0+aXNzdWVfcXVldWUgPSBjbWQ7CisJfSBlbHNlIHsKKwkJZm9yICh0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsgdG1wLT5ob3N0X3NjcmliYmxlOyB0bXAgPSAoU2NzaV9DbW5kICopIHRtcC0+aG9zdF9zY3JpYmJsZSk7CisJCUxJU1QoY21kLCB0bXApOworCQl0bXAtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSBjbWQ7CisJfQorCWRwcmludGsoTkRFQlVHX1FVRVVFUywgKCJzY3NpJWQgOiBjb21tYW5kIGFkZGVkIHRvICVzIG9mIHF1ZXVlXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgKGNtZC0+Y21uZFswXSA9PSBSRVFVRVNUX1NFTlNFKSA/ICJoZWFkIiA6ICJ0YWlsIikpOworCisJLyogUnVuIHRoZSBjb3JvdXRpbmUgaWYgaXQgaXNuJ3QgYWxyZWFkeSBydW5uaW5nLiAqLworCS8qIEtpY2sgb2ZmIGNvbW1hbmQgcHJvY2Vzc2luZyAqLworCXNjaGVkdWxlX3dvcmsoJmhvc3RkYXRhLT5jb3JvdXRpbmUpOworCXJldHVybiAwOworfQorCisKKy8qKgorICoJTkNSNTM4MF9tYWluCS0JTkNSIHN0YXRlIG1hY2hpbmVzCisgKgorICoJTkNSNTM4MF9tYWluIGlzIGEgY29yb3V0aW5lIHRoYXQgcnVucyBhcyBsb25nIGFzIG1vcmUgd29yayBjYW4gCisgKiAgICAgIGJlIGRvbmUgb24gdGhlIE5DUjUzODAgaG9zdCBhZGFwdGVycyBpbiBhIHN5c3RlbS4gIEJvdGggCisgKiAgICAgIE5DUjUzODBfcXVldWVfY29tbWFuZCgpIGFuZCBOQ1I1MzgwX2ludHIoKSB3aWxsIHRyeSB0byBzdGFydCBpdCAKKyAqICAgICAgaW4gY2FzZSBpdCBpcyBub3QgcnVubmluZy4KKyAqIAorICoJTG9ja3M6IGNhbGxlZCBhcyBpdHMgb3duIHRocmVhZCB3aXRoIG5vIGxvY2tzIGhlbGQuIFRha2VzIHRoZQorICoJaG9zdCBsb2NrIGFuZCBjYWxsZWQgcm91dGluZXMgbWF5IHRha2UgdGhlIGlzYSBkbWEgbG9jay4KKyAqLworCitzdGF0aWMgdm9pZCBOQ1I1MzgwX21haW4odm9pZCAqcCkKK3sKKwlzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSBwOworCXN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlID0gaG9zdGRhdGEtPmhvc3Q7CisJU2NzaV9DbW5kICp0bXAsICpwcmV2OworCWludCBkb25lOworCQorCXNwaW5fbG9ja19pcnEoaW5zdGFuY2UtPmhvc3RfbG9jayk7CisJZG8geworCQkvKiBMb2NrIGhlbGQgaGVyZSAqLworCQlkb25lID0gMTsKKwkJaWYgKCFob3N0ZGF0YS0+Y29ubmVjdGVkICYmICFob3N0ZGF0YS0+c2VsZWN0aW5nKSB7CisJCQlkcHJpbnRrKE5ERUJVR19NQUlOLCAoInNjc2klZCA6IG5vdCBjb25uZWN0ZWRcbiIsIGluc3RhbmNlLT5ob3N0X25vKSk7CisJCQkvKgorCQkJICogU2VhcmNoIHRocm91Z2ggdGhlIGlzc3VlX3F1ZXVlIGZvciBhIGNvbW1hbmQgZGVzdGluZWQKKwkJCSAqIGZvciBhIHRhcmdldCB0aGF0J3Mgbm90IGJ1c3kuCisJCQkgKi8KKwkJCWZvciAodG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWUsIHByZXYgPSBOVUxMOyB0bXA7IHByZXYgPSB0bXAsIHRtcCA9IChTY3NpX0NtbmQgKikgdG1wLT5ob3N0X3NjcmliYmxlKSAKKwkJCXsKKwkJCQlpZiAocHJldiAhPSB0bXApCisJCQkJCWRwcmludGsoTkRFQlVHX0xJU1RTLCAoIk1BSU4gdG1wPSVwICAgdGFyZ2V0PSVkICAgYnVzeT0lZCBsdW49JWRcbiIsIHRtcCwgdG1wLT50YXJnZXQsIGhvc3RkYXRhLT5idXN5W3RtcC0+dGFyZ2V0XSwgdG1wLT5sdW4pKTsKKwkJCQkvKiAgV2hlbiB3ZSBmaW5kIG9uZSwgcmVtb3ZlIGl0IGZyb20gdGhlIGlzc3VlIHF1ZXVlLiAqLworCQkJCWlmICghKGhvc3RkYXRhLT5idXN5W3RtcC0+ZGV2aWNlLT5pZF0gJiAoMSA8PCB0bXAtPmRldmljZS0+bHVuKSkpIHsKKwkJCQkJaWYgKHByZXYpIHsKKwkJCQkJCVJFTU9WRShwcmV2LCBwcmV2LT5ob3N0X3NjcmliYmxlLCB0bXAsIHRtcC0+aG9zdF9zY3JpYmJsZSk7CisJCQkJCQlwcmV2LT5ob3N0X3NjcmliYmxlID0gdG1wLT5ob3N0X3NjcmliYmxlOworCQkJCQl9IGVsc2UgeworCQkJCQkJUkVNT1ZFKC0xLCBob3N0ZGF0YS0+aXNzdWVfcXVldWUsIHRtcCwgdG1wLT5ob3N0X3NjcmliYmxlKTsKKwkJCQkJCWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IChTY3NpX0NtbmQgKikgdG1wLT5ob3N0X3NjcmliYmxlOworCQkJCQl9CisJCQkJCXRtcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisKKwkJCQkJLyogCisJCQkJCSAqIEF0dGVtcHQgdG8gZXN0YWJsaXNoIGFuIElfVF9MIG5leHVzIGhlcmUuIAorCQkJCQkgKiBPbiBzdWNjZXNzLCBpbnN0YW5jZS0+aG9zdGRhdGEtPmNvbm5lY3RlZCBpcyBzZXQuCisJCQkJCSAqIE9uIGZhaWx1cmUsIHdlIG11c3QgYWRkIHRoZSBjb21tYW5kIGJhY2sgdG8gdGhlCisJCQkJCSAqICAgaXNzdWUgcXVldWUgc28gd2UgY2FuIGtlZXAgdHJ5aW5nLiAKKwkJCQkJICovCisJCQkJCWRwcmludGsoTkRFQlVHX01BSU58TkRFQlVHX1FVRVVFUywgKCJzY3NpJWQgOiBtYWluKCkgOiBjb21tYW5kIGZvciB0YXJnZXQgJWQgbHVuICVkIHJlbW92ZWQgZnJvbSBpc3N1ZV9xdWV1ZVxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIHRtcC0+dGFyZ2V0LCB0bXAtPmx1bikpOworCQorCQkJCQkvKgorCQkJCQkgKiBBIHN1Y2Nlc3NmdWwgc2VsZWN0aW9uIGlzIGRlZmluZWQgYXMgb25lIHRoYXQgCisJCQkJCSAqIGxlYXZlcyB1cyB3aXRoIHRoZSBjb21tYW5kIGNvbm5lY3RlZCBhbmQgCisJCQkJCSAqIGluIGhvc3RkYXRhLT5jb25uZWN0ZWQsIE9SIGhhcyB0ZXJtaW5hdGVkIHRoZQorCQkJCQkgKiBjb21tYW5kLgorCQkJCQkgKgorCQkJCQkgKiBXaXRoIHN1Y2Nlc3NmdWwgY29tbWFuZHMsIHdlIGZhbGwgdGhyb3VnaAorCQkJCQkgKiBhbmQgc2VlIGlmIHdlIGNhbiBkbyBhbiBpbmZvcm1hdGlvbiB0cmFuc2ZlciwKKwkJCQkJICogd2l0aCBmYWlsdXJlcyB3ZSB3aWxsIHJlc3RhcnQuCisJCQkJCSAqLworCQkJCQlob3N0ZGF0YS0+c2VsZWN0aW5nID0gTlVMTDsKKwkJCQkJLyogUnZDOiBoYXZlIHRvIHByZXNldCB0aGlzIHRvIGluZGljYXRlIGEgbmV3IGNvbW1hbmQgaXMgYmVpbmcgcGVyZm9ybWVkICovCisKKwkJCQkJaWYgKCFOQ1I1MzgwX3NlbGVjdChpbnN0YW5jZSwgdG1wLAorCQkJCQkJCSAgICAvKiAKKwkJCQkJCQkgICAgICogUkVRVUVTVCBTRU5TRSBjb21tYW5kcyBhcmUgaXNzdWVkIHdpdGhvdXQgdGFnZ2VkCisJCQkJCQkJICAgICAqIHF1ZXVlaW5nLCBldmVuIG9uIFNDU0ktSUkgZGV2aWNlcyBiZWNhdXNlIHRoZSAKKwkJCQkJCQkgICAgICogY29udGluZ2VudCBhbGxlZ2lhbmNlIGNvbmRpdGlvbiBleGlzdHMgZm9yIHRoZSAKKwkJCQkJCQkgICAgICogZW50aXJlIHVuaXQuCisJCQkJCQkJICAgICAqLworCQkJCQkJCSAgICAodG1wLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpID8gVEFHX05PTkUgOiBUQUdfTkVYVCkpIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9IGVsc2UgeworCQkJCQkJTElTVCh0bXAsIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSk7CisJCQkJCQl0bXAtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7CisJCQkJCQlob3N0ZGF0YS0+aXNzdWVfcXVldWUgPSB0bXA7CisJCQkJCQlkb25lID0gMDsKKwkJCQkJCWRwcmludGsoTkRFQlVHX01BSU58TkRFQlVHX1FVRVVFUywgKCJzY3NpJWQgOiBtYWluKCk6IHNlbGVjdCgpIGZhaWxlZCwgcmV0dXJuZWQgdG8gaXNzdWVfcXVldWVcbiIsIGluc3RhbmNlLT5ob3N0X25vKSk7CisJCQkJCX0KKwkJCQkJLyogbG9jayBoZWxkIGhlcmUgc3RpbGwgKi8KKwkJCQl9CS8qIGlmIHRhcmdldC9sdW4gaXMgbm90IGJ1c3kgKi8KKwkJCX0JLyogZm9yICovCisJCQkvKiBleGl0ZWQgbG9ja2VkICovCisJCX0JLyogaWYgKCFob3N0ZGF0YS0+Y29ubmVjdGVkKSAqLworCQlpZiAoaG9zdGRhdGEtPnNlbGVjdGluZykgeworCQkJdG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+c2VsZWN0aW5nOworCQkJLyogU2VsZWN0aW9uIHdpbGwgZHJvcCBhbmQgcmV0YWtlIHRoZSBsb2NrICovCisJCQlpZiAoIU5DUjUzODBfc2VsZWN0KGluc3RhbmNlLCB0bXAsICh0bXAtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkgPyBUQUdfTk9ORSA6IFRBR19ORVhUKSkgeworCQkJCS8qIE9rID8/ICovCisJCQl9IGVsc2UgeworCQkJCS8qIFJ2QzogZGV2aWNlIGZhaWxlZCwgc28gd2Ugd2FpdCBhIGxvbmcgdGltZQorCQkJCSAgIHRoaXMgaXMgbmVlZGVkIGZvciBNdXN0ZWsgc2Nhbm5lcnMsIHRoYXQKKwkJCQkgICBkbyBub3QgcmVzcG9uZCB0byBjb21tYW5kcyBpbW1lZGlhdGVseQorCQkJCSAgIGFmdGVyIGEgc2NhbiAqLworCQkJCXByaW50ayhLRVJOX0RFQlVHICJzY3NpJWQ6IGRldmljZSAlZCBkaWQgbm90IHJlc3BvbmQgaW4gdGltZVxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIHRtcC0+ZGV2aWNlLT5pZCk7CisJCQkJTElTVCh0bXAsIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSk7CisJCQkJdG1wLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOworCQkJCWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IHRtcDsKKwkJCQlOQ1I1MzgwX3NldF90aW1lcihob3N0ZGF0YSwgVVNMRUVQX1dBSVRMT05HKTsKKwkJCX0KKwkJfQkvKiBpZiBob3N0ZGF0YS0+c2VsZWN0aW5nICovCisJCWlmIChob3N0ZGF0YS0+Y29ubmVjdGVkCisjaWZkZWYgUkVBTF9ETUEKKwkJICAgICYmICFob3N0ZGF0YS0+ZG1hbGVuCisjZW5kaWYKKwkJICAgICYmICghaG9zdGRhdGEtPnRpbWVfZXhwaXJlcyB8fCB0aW1lX2JlZm9yZV9lcShob3N0ZGF0YS0+dGltZV9leHBpcmVzLCBqaWZmaWVzKSkKKwkJICAgICkgeworCQkJZHByaW50ayhOREVCVUdfTUFJTiwgKCJzY3NpJWQgOiBtYWluKCkgOiBwZXJmb3JtaW5nIGluZm9ybWF0aW9uIHRyYW5zZmVyXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCQkJTkNSNTM4MF9pbmZvcm1hdGlvbl90cmFuc2ZlcihpbnN0YW5jZSk7CisJCQlkcHJpbnRrKE5ERUJVR19NQUlOLCAoInNjc2klZCA6IG1haW4oKSA6IGRvbmUgc2V0IGZhbHNlXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCQkJZG9uZSA9IDA7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfSB3aGlsZSAoIWRvbmUpOworCQorCXNwaW5fdW5sb2NrX2lycShpbnN0YW5jZS0+aG9zdF9sb2NrKTsKK30KKworI2lmbmRlZiBET05UX1VTRV9JTlRSCisKKy8qKgorICogCU5DUjUzODBfaW50cgktCWdlbmVyaWMgTkNSNTM4MCBpcnEgaGFuZGxlcgorICoJQGlycTogaW50ZXJydXB0IG51bWJlcgorICoJQGRldl9pZDogZGV2aWNlIGluZm8KKyAqCUByZWdzOiByZWdpc3RlcnMgKHVudXNlZCkKKyAqCisgKglIYW5kbGUgaW50ZXJydXB0cywgcmVlc3RhYmxpc2hpbmcgSV9UX0wgb3IgSV9UX0xfUSBuZXh1c2VzCisgKiAgICAgIGZyb20gdGhlIGRpc2Nvbm5lY3RlZCBxdWV1ZSwgYW5kIHJlc3RhcnRpbmcgTkNSNTM4MF9tYWluKCkgCisgKiAgICAgIGFzIHJlcXVpcmVkLgorICoKKyAqCUxvY2tzOiB0YWtlcyB0aGUgbmVlZGVkIGluc3RhbmNlIGxvY2tzCisgKi8KKworc3RhdGljIGlycXJldHVybl90IE5DUjUzODBfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKSAKK3sKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSA9IChzdHJ1Y3QgU2NzaV9Ib3N0ICopZGV2X2lkOworCXN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisJaW50IGRvbmU7CisJdW5zaWduZWQgY2hhciBiYXNyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkcHJpbnRrKE5ERUJVR19JTlRSLCAoInNjc2kgOiBOQ1I1MzgwIGlycSAlZCB0cmlnZ2VyZWRcbiIsIGlycSkpOworCisJZG8geworCQlkb25lID0gMTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoaW5zdGFuY2UtPmhvc3RfbG9jaywgZmxhZ3MpOworCQkvKiBMb29rIGZvciBwZW5kaW5nIGludGVycnVwdHMgKi8KKwkJTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisJCWJhc3IgPSBOQ1I1MzgwX3JlYWQoQlVTX0FORF9TVEFUVVNfUkVHKTsKKwkJLyogWFhYIGRpc3BhdGNoIHRvIGFwcHJvcHJpYXRlIHJvdXRpbmUgaWYgZm91bmQgYW5kIGRvbmU9MCAqLworCQlpZiAoYmFzciAmIEJBU1JfSVJRKSB7CisJCQlOQ1I1MzgwX2RwcmludChOREVCVUdfSU5UUiwgaW5zdGFuY2UpOworCQkJaWYgKChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiAoU1JfU0VMIHwgU1JfSU8pKSA9PSAoU1JfU0VMIHwgU1JfSU8pKSB7CisJCQkJZG9uZSA9IDA7CisJCQkJZHByaW50ayhOREVCVUdfSU5UUiwgKCJzY3NpJWQgOiBTRUwgaW50ZXJydXB0XG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCQkJCU5DUjUzODBfcmVzZWxlY3QoaW5zdGFuY2UpOworCQkJCSh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworCQkJfSBlbHNlIGlmIChiYXNyICYgQkFTUl9QQVJJVFlfRVJST1IpIHsKKwkJCQlkcHJpbnRrKE5ERUJVR19JTlRSLCAoInNjc2klZCA6IFBBUklUWSBpbnRlcnJ1cHRcbiIsIGluc3RhbmNlLT5ob3N0X25vKSk7CisJCQkJKHZvaWQpIE5DUjUzODBfcmVhZChSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyk7CisJCQl9IGVsc2UgaWYgKChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9SU1QpID09IFNSX1JTVCkgeworCQkJCWRwcmludGsoTkRFQlVHX0lOVFIsICgic2NzaSVkIDogUkVTRVQgaW50ZXJydXB0XG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCQkJCSh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworCQkJfSBlbHNlIHsKKyNpZiBkZWZpbmVkKFJFQUxfRE1BKQorCQkJCS8qCisJCQkJICogV2Ugc2hvdWxkIG9ubHkgZ2V0IFBIQVNFIE1JU01BVENIIGFuZCBFT1AgaW50ZXJydXB0cworCQkJCSAqIGlmIHdlIGhhdmUgRE1BIGVuYWJsZWQsIHNvIGRvIGEgc2FuaXR5IGNoZWNrIGJhc2VkIG9uCisJCQkJICogdGhlIGN1cnJlbnQgc2V0dGluZyBvZiB0aGUgTU9ERSByZWdpc3Rlci4KKwkJCQkgKi8KKworCQkJCWlmICgoTkNSNTM4MF9yZWFkKE1PREVfUkVHKSAmIE1SX0RNQSkgJiYgKChiYXNyICYgQkFTUl9FTkRfRE1BX1RSQU5TRkVSKSB8fCAhKGJhc3IgJiBCQVNSX1BIQVNFX01BVENIKSkpIHsKKwkJCQkJaW50IHRyYW5zZmVyZWQ7CisKKwkJCQkJaWYgKCFob3N0ZGF0YS0+Y29ubmVjdGVkKQorCQkJCQkJcGFuaWMoInNjc2klZCA6IHJlY2VpdmVkIGVuZCBvZiBETUEgaW50ZXJydXB0IHdpdGggbm8gY29ubmVjdGVkIGNtZFxuIiwgaW5zdGFuY2UtPmhvc3Rubyk7CisKKwkJCQkJdHJhbnNmZXJlZCA9IChob3N0ZGF0YS0+ZG1hbGVuIC0gTkNSNTM4MF9kbWFfcmVzaWR1YWwoaW5zdGFuY2UpKTsKKwkJCQkJaG9zdGRhdGEtPmNvbm5lY3RlZC0+U0NwLnRoaXNfcmVzaWR1YWwgLT0gdHJhbnNmZXJyZWQ7CisJCQkJCWhvc3RkYXRhLT5jb25uZWN0ZWQtPlNDcC5wdHIgKz0gdHJhbnNmZXJyZWQ7CisJCQkJCWhvc3RkYXRhLT5kbWFsZW4gPSAwOworCisJCQkJCSh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworCQkJCQkJCQorCQkJCQkvKiBGSVhNRTogd2UgbmVlZCB0byBwb2xsIGJyaWVmbHkgdGhlbiBkZWZlciBhIHdvcmtxdWV1ZSB0YXNrICEgKi8KKwkJCQkJTkNSNTM4MF9wb2xsX3BvbGl0ZWx5KGhvc3RkYXRhLCBCVVNfQU5EX1NUQVRVU19SRUcsIEJBU1JfQUNLLCAwLCAyKkhaKTsKKworCQkJCQlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKwkJCQkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJCQl9CisjZWxzZQorCQkJCWRwcmludGsoTkRFQlVHX0lOVFIsICgic2NzaSA6IHVua25vd24gaW50ZXJydXB0LCBCQVNSIDB4JVgsIE1SIDB4JVgsIFNSIDB4JXhcbiIsIGJhc3IsIE5DUjUzODBfcmVhZChNT0RFX1JFRyksIE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSkpOworCQkJCSh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworI2VuZGlmCisJCQl9CisJCX0JLyogaWYgQkFTUl9JUlEgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWlmKCFkb25lKQorCQkJc2NoZWR1bGVfd29yaygmaG9zdGRhdGEtPmNvcm91dGluZSk7CisJfSB3aGlsZSAoIWRvbmUpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworI2VuZGlmIAorCisvKioKKyAqCWNvbGxlY3Rfc3RhdHMJCS0JY29sbGVjdCBzdGF0cyBvbiBhIHNjc2kgY29tbWFuZAorICoJQGhvc3RkYXRhOiBhZGFwdGVyIAorICoJQGNtZDogY29tbWFuZCBiZWluZyBpc3N1ZWQKKyAqCisgKglVcGRhdGUgdGhlIHN0YXRpc3RpY2FsIGRhdGEgYnkgcGFyc2luZyB0aGUgY29tbWFuZCBpbiBxdWVzdGlvbgorICovCisgCitzdGF0aWMgdm9pZCBjb2xsZWN0X3N0YXRzKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSwgU2NzaV9DbW5kICogY21kKSAKK3sKKyNpZmRlZiBOQ1I1MzgwX1NUQVRTCisJc3dpdGNoIChjbWQtPmNtbmRbMF0pIHsKKwljYXNlIFdSSVRFOgorCWNhc2UgV1JJVEVfNjoKKwljYXNlIFdSSVRFXzEwOgorCQlob3N0ZGF0YS0+dGltZV93cml0ZVtjbWQtPmRldmljZS0+aWRdICs9IChqaWZmaWVzIC0gaG9zdGRhdGEtPnRpbWViYXNlKTsKKwkJaG9zdGRhdGEtPnBlbmRpbmd3LS07CisJCWJyZWFrOworCWNhc2UgUkVBRDoKKwljYXNlIFJFQURfNjoKKwljYXNlIFJFQURfMTA6CisJCWhvc3RkYXRhLT50aW1lX3JlYWRbY21kLT5kZXZpY2UtPmlkXSArPSAoamlmZmllcyAtIGhvc3RkYXRhLT50aW1lYmFzZSk7CisJCWhvc3RkYXRhLT5wZW5kaW5nci0tOworCQlicmVhazsKKwl9CisjZW5kaWYKK30KKworCisvKiAKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfc2VsZWN0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgU2NzaV9DbW5kICpjbWQsIAorICogICAgICBpbnQgdGFnKTsKKyAqCisgKiBQdXJwb3NlIDogZXN0YWJsaXNoZXMgSV9UX0wgb3IgSV9UX0xfUSBuZXh1cyBmb3IgbmV3IG9yIGV4aXN0aW5nIGNvbW1hbmQsCisgKiAgICAgIGluY2x1ZGluZyBBUkJJVFJBVElPTiwgU0VMRUNUSU9OLCBhbmQgaW5pdGlhbCBtZXNzYWdlIG91dCBmb3IgCisgKiAgICAgIElERU5USUZZIGFuZCBxdWV1ZSBtZXNzYWdlcy4gCisgKgorICogSW5wdXRzIDogaW5zdGFuY2UgLSBpbnN0YW50aWF0aW9uIG9mIHRoZSA1MzgwIGRyaXZlciBvbiB3aGljaCB0aGlzIAorICogICAgICB0YXJnZXQgbGl2ZXMsIGNtZCAtIFNDU0kgY29tbWFuZCB0byBleGVjdXRlLCB0YWcgLSBzZXQgdG8gVEFHX05FWFQgZm9yIAorICogICAgICBuZXcgdGFnLCBUQUdfTk9ORSBmb3IgdW50YWdnZWQgcXVldWVpbmcsIG90aGVyd2lzZSBzZXQgdG8gdGhlIHRhZyBmb3IgCisgKiAgICAgIHRoZSBjb21tYW5kIHRoYXQgaXMgcHJlc2VudGx5IGNvbm5lY3RlZC4KKyAqIAorICogUmV0dXJucyA6IC0xIGlmIHNlbGVjdGlvbiBjb3VsZCBub3QgZXhlY3V0ZSBmb3Igc29tZSByZWFzb24sCisgKiAgICAgIDAgaWYgc2VsZWN0aW9uIHN1Y2NlZWRlZCBvciBmYWlsZWQgYmVjYXVzZSB0aGUgdGFyZ2V0IAorICogICAgICBkaWQgbm90IHJlc3BvbmQuCisgKgorICogU2lkZSBlZmZlY3RzIDogCisgKiAgICAgIElmIGJ1cyBidXN5LCBhcmJpdHJhdGlvbiBmYWlsZWQsIGV0YywgTkNSNTM4MF9zZWxlY3QoKSB3aWxsIGV4aXQgCisgKiAgICAgICAgICAgICAgd2l0aCByZWdpc3RlcnMgYXMgdGhleSBzaG91bGQgaGF2ZSBiZWVuIG9uIGVudHJ5IC0gaWUKKyAqICAgICAgICAgICAgICBTRUxFQ1RfRU5BQkxFIHdpbGwgYmUgc2V0IGFwcHJvcHJpYXRlbHksIHRoZSBOQ1I1MzgwCisgKiAgICAgICAgICAgICAgd2lsbCBjZWFzZSB0byBkcml2ZSBhbnkgU0NTSSBidXMgc2lnbmFscy4KKyAqCisgKiAgICAgIElmIHN1Y2Nlc3NmdWwgOiBJX1RfTCBvciBJX1RfTF9RIG5leHVzIHdpbGwgYmUgZXN0YWJsaXNoZWQsIAorICogICAgICAgICAgICAgIGluc3RhbmNlLT5jb25uZWN0ZWQgd2lsbCBiZSBzZXQgdG8gY21kLiAgCisgKiAgICAgICAgICAgICAgU0VMRUNUIGludGVycnVwdCB3aWxsIGJlIGRpc2FibGVkLgorICoKKyAqICAgICAgSWYgZmFpbGVkIChubyB0YXJnZXQpIDogY21kLT5zY3NpX2RvbmUoKSB3aWxsIGJlIGNhbGxlZCwgYW5kIHRoZSAKKyAqICAgICAgICAgICAgICBjbWQtPnJlc3VsdCBob3N0IGJ5dGUgc2V0IHRvIERJRF9CQURfVEFSR0VULgorICoKKyAqCUxvY2tzOiBjYWxsZXIgaG9sZHMgaG9zdGRhdGEgbG9jayBpbiBJUlEgbW9kZQorICovCisgCitzdGF0aWMgaW50IE5DUjUzODBfc2VsZWN0KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBTY3NpX0NtbmQgKiBjbWQsIGludCB0YWcpIAoreworCU5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworCXN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisJdW5zaWduZWQgY2hhciB0bXBbM10sIHBoYXNlOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJaW50IGxlbjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdW5zaWduZWQgY2hhciB2YWx1ZTsKKwlpbnQgZXJyOworCU5DUjUzODBfc2V0dXAoaW5zdGFuY2UpOworCisJaWYgKGhvc3RkYXRhLT5zZWxlY3RpbmcpCisJCWdvdG8gcGFydDI7CisKKwlob3N0ZGF0YS0+cmVzdGFydF9zZWxlY3QgPSAwOworCisJTkNSNTM4MF9kcHJpbnQoTkRFQlVHX0FSQklUUkFUSU9OLCBpbnN0YW5jZSk7CisJZHByaW50ayhOREVCVUdfQVJCSVRSQVRJT04sICgic2NzaSVkIDogc3RhcnRpbmcgYXJiaXRyYXRpb24sIGlkID0gJWRcbiIsIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+dGhpc19pZCkpOworCisJLyogCisJICogU2V0IHRoZSBwaGFzZSBiaXRzIHRvIDAsIG90aGVyd2lzZSB0aGUgTkNSNTM4MCB3b24ndCBkcml2ZSB0aGUgCisJICogZGF0YSBidXMgZHVyaW5nIFNFTEVDVElPTi4KKwkgKi8KKworCU5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCAwKTsKKworCS8qIAorCSAqIFN0YXJ0IGFyYml0cmF0aW9uLgorCSAqLworCisJTkNSNTM4MF93cml0ZShPVVRQVVRfREFUQV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9BUkJJVFJBVEUpOworCisKKwkvKiBXZSBjYW4gYmUgcmVsYXhlZCBoZXJlLCBpbnRlcnJ1cHRzIGFyZSBvbiwgd2UgYXJlCisJICAgaW4gd29ya3F1ZXVlIGNvbnRleHQsIHRoZSBiaXJkcyBhcmUgc2luZ2luZyBpbiB0aGUgdHJlZXMgKi8KKwlzcGluX3VubG9ja19pcnEoaW5zdGFuY2UtPmhvc3RfbG9jayk7CisJZXJyID0gTkNSNTM4MF9wb2xsX3BvbGl0ZWx5KGluc3RhbmNlLCBJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9BUkJJVFJBVElPTl9QUk9HUkVTUywgSUNSX0FSQklUUkFUSU9OX1BST0dSRVNTLCA1KkhaKTsKKwlzcGluX2xvY2tfaXJxKGluc3RhbmNlLT5ob3N0X2xvY2spOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJzY3NpOiBhcmJpdHJhdGlvbiB0aW1lb3V0IGF0ICVkXG4iLCBfX0xJTkVfXyk7CisJCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworCQlOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWRwcmludGsoTkRFQlVHX0FSQklUUkFUSU9OLCAoInNjc2klZCA6IGFyYml0cmF0aW9uIGNvbXBsZXRlXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCisJLyogCisJICogVGhlIGFyYml0cmF0aW9uIGRlbGF5IGlzIDIuMnVzLCBidXQgdGhpcyBpcyBhIG1pbmltdW0gYW5kIHRoZXJlIGlzIAorCSAqIG5vIG1heGltdW0gc28gd2UgY2FuIHNhZmVseSBzbGVlcCBmb3IgY2VpbCgyLjIpIHVzZWNzIHRvIGFjY29tbW9kYXRlCisJICogdGhlIGludGVncmFsIG5hdHVyZSBvZiB1ZGVsYXkoKS4KKwkgKgorCSAqLworCisJdWRlbGF5KDMpOworCisJLyogQ2hlY2sgZm9yIGxvc3QgYXJiaXRyYXRpb24gKi8KKwlpZiAoKE5DUjUzODBfcmVhZChJTklUSUFUT1JfQ09NTUFORF9SRUcpICYgSUNSX0FSQklUUkFUSU9OX0xPU1QpIHx8IChOQ1I1MzgwX3JlYWQoQ1VSUkVOVF9TQ1NJX0RBVEFfUkVHKSAmIGhvc3RkYXRhLT5pZF9oaWdoZXJfbWFzaykgfHwgKE5DUjUzODBfcmVhZChJTklUSUFUT1JfQ09NTUFORF9SRUcpICYgSUNSX0FSQklUUkFUSU9OX0xPU1QpKSB7CisJCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworCQlkcHJpbnRrKE5ERUJVR19BUkJJVFJBVElPTiwgKCJzY3NpJWQgOiBsb3N0IGFyYml0cmF0aW9uLCBkZWFzc2VydGluZyBNUl9BUkJJVFJBVEVcbiIsIGluc3RhbmNlLT5ob3N0X25vKSk7CisJCWdvdG8gZmFpbGVkOworCX0KKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX1NFTCk7CisKKwlpZiAoIShob3N0ZGF0YS0+ZmxhZ3MgJiBGTEFHX0RUQzMxODFFKSAmJgorCSAgICAvKiBSdkM6IERUQzMxODFFIGhhcyBzb21lIHRyb3VibGUgd2l0aCB0aGlzCisJICAgICAqICAgICAgc28gd2Ugc2ltcGx5IHJlbW92ZWQgaXQuIFNlZW1zIHRvIHdvcmsgd2l0aAorCSAgICAgKiAgICAgIG9ubHkgTXVzdGVrIHNjYW5uZXIgYXR0YWNoZWQKKwkgICAgICovCisJICAgIChOQ1I1MzgwX3JlYWQoSU5JVElBVE9SX0NPTU1BTkRfUkVHKSAmIElDUl9BUkJJVFJBVElPTl9MT1NUKSkgeworCQlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKwkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJZHByaW50ayhOREVCVUdfQVJCSVRSQVRJT04sICgic2NzaSVkIDogbG9zdCBhcmJpdHJhdGlvbiwgZGVhc3NlcnRpbmcgSUNSX0FTU0VSVF9TRUxcbiIsIGluc3RhbmNlLT5ob3N0X25vKSk7CisJCWdvdG8gZmFpbGVkOworCX0KKwkvKiAKKwkgKiBBZ2FpbiwgYnVzIGNsZWFyICsgYnVzIHNldHRsZSB0aW1lIGlzIDEuMnVzLCBob3dldmVyLCB0aGlzIGlzIAorCSAqIGEgbWluaW11bSBzbyB3ZSdsbCB1ZGVsYXkgY2VpbCgxLjIpCisJICovCisKKwl1ZGVsYXkoMik7CisKKwlkcHJpbnRrKE5ERUJVR19BUkJJVFJBVElPTiwgKCJzY3NpJWQgOiB3b24gYXJiaXRyYXRpb25cbiIsIGluc3RhbmNlLT5ob3N0X25vKSk7CisKKwkvKiAKKwkgKiBOb3cgdGhhdCB3ZSBoYXZlIHdvbiBhcmJpdHJhdGlvbiwgc3RhcnQgU2VsZWN0aW9uIHByb2Nlc3MsIGFzc2VydGluZyAKKwkgKiB0aGUgaG9zdCBhbmQgdGFyZ2V0IElEJ3Mgb24gdGhlIFNDU0kgYnVzLgorCSAqLworCisJTkNSNTM4MF93cml0ZShPVVRQVVRfREFUQV9SRUcsIChob3N0ZGF0YS0+aWRfbWFzayB8ICgxIDw8IGNtZC0+ZGV2aWNlLT5pZCkpKTsKKworCS8qIAorCSAqIFJhaXNlIEFUTiB3aGlsZSBTRUwgaXMgdHJ1ZSBiZWZvcmUgQlNZIGdvZXMgZmFsc2UgZnJvbSBhcmJpdHJhdGlvbiwKKwkgKiBzaW5jZSB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBndWFyYW50ZWUgdGhhdCB3ZSdsbCBnZXQgYSBNRVNTQUdFIE9VVAorCSAqIHBoYXNlIGltbWVkaWF0ZWx5IGFmdGVyIHNlbGVjdGlvbi4KKwkgKi8KKworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCAoSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0JTWSB8IElDUl9BU1NFUlRfREFUQSB8IElDUl9BU1NFUlRfQVROIHwgSUNSX0FTU0VSVF9TRUwpKTsKKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKworCS8qIAorCSAqIFJlc2VsZWN0IGludGVycnVwdHMgbXVzdCBiZSB0dXJuZWQgb2ZmIHByaW9yIHRvIHRoZSBkcm9wcGluZyBvZiBCU1ksCisJICogb3RoZXJ3aXNlIHdlIHdpbGwgdHJpZ2dlciBhbiBpbnRlcnJ1cHQuCisJICovCisJTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgMCk7CisKKwkvKgorCSAqIFRoZSBpbml0aWF0b3Igc2hhbGwgdGhlbiB3YWl0IGF0IGxlYXN0IHR3byBkZXNrZXcgZGVsYXlzIGFuZCByZWxlYXNlIAorCSAqIHRoZSBCU1kgc2lnbmFsLgorCSAqLworCXVkZWxheSgxKTsJCS8qIHdpbmdlbCAtLSB3YWl0IHR3byBidXMgZGVza2V3IGRlbGF5ID4yKjQ1bnMgKi8KKworCS8qIFJlc2V0IEJTWSAqLworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCAoSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0RBVEEgfCBJQ1JfQVNTRVJUX0FUTiB8IElDUl9BU1NFUlRfU0VMKSk7CisKKwkvKiAKKwkgKiBTb21ldGhpbmcgd2VpcmQgaGFwcGVucyB3aGVuIHdlIGNlYXNlIHRvIGRyaXZlIEJTWSAtIGxvb2tzCisJICogbGlrZSB0aGUgYm9hcmQvY2hpcCBpcyBsZXR0aW5nIHVzIGRvIGFub3RoZXIgcmVhZCBiZWZvcmUgdGhlIAorCSAqIGFwcHJvcHJpYXRlIHByb3BhZ2F0aW9uIGRlbGF5IGhhcyBleHBpcmVkLCBhbmQgd2UncmUgY29uZnVzaW5nCisJICogYSBCU1kgc2lnbmFsIGZyb20gb3Vyc2VsdmVzIGFzIHRoZSB0YXJnZXQncyByZXNwb25zZSB0byBTRUxFQ1RJT04uCisJICoKKwkgKiBBIHNtYWxsIGRlbGF5ICh0aGUgJ0MrKycgZnJvbnRlbmQgYnJlYWtzIHRoZSBwaXBlbGluZSB3aXRoIGFuCisJICogdW5uZWNlc3NhcnkganVtcCwgbWFraW5nIGl0IHdvcmsgb24gbXkgMzg2LTMzL1RyYW50b3IgVDEyOCwgdGhlCisJICogdGlnaHRlciAnQycgY29kZSBicmVha3MgYW5kIHJlcXVpcmVzIHRoaXMpIHNvbHZlcyB0aGUgcHJvYmxlbSAtIAorCSAqIHRoZSAxIHVzIGRlbGF5IGlzIGFyYml0cmFyeSwgYW5kIG9ubHkgdXNlZCBiZWNhdXNlIHRoaXMgZGVsYXkgd2lsbCAKKwkgKiBiZSB0aGUgc2FtZSBvbiBvdGhlciBwbGF0Zm9ybXMgYW5kIHNpbmNlIGl0IHdvcmtzIGhlcmUsIGl0IHNob3VsZCAKKwkgKiB3b3JrIHRoZXJlLgorCSAqCisJICogd2luZ2VsIHN1Z2dlc3RzIHRoYXQgdGhpcyBjb3VsZCBiZSBkdWUgdG8gZmFpbGluZyB0byB3YWl0CisJICogb25lIGRlc2tldyBkZWxheS4KKwkgKi8KKworCXVkZWxheSgxKTsKKworCWRwcmludGsoTkRFQlVHX1NFTEVDVElPTiwgKCJzY3NpJWQgOiBzZWxlY3RpbmcgdGFyZ2V0ICVkXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgY21kLT5kZXZpY2UtPmlkKSk7CisKKwkvKiAKKwkgKiBUaGUgU0NTSSBzcGVjaWZpY2F0aW9uIGNhbGxzIGZvciBhIDI1MCBtcyB0aW1lb3V0IGZvciB0aGUgYWN0dWFsIAorCSAqIHNlbGVjdGlvbi4KKwkgKi8KKworCXRpbWVvdXQgPSBqaWZmaWVzICsgKDI1MCAqIEhaIC8gMTAwMCk7CisKKwkvKiAKKwkgKiBYWFggdmVyeSBpbnRlcmVzdGluZyAtIHdlJ3JlIHNlZWluZyBhIGJvdW5jZSB3aGVyZSB0aGUgQlNZIHdlIAorCSAqIGFzc2VydGVkIGlzIGJlaW5nIHJlZmxlY3RlZCAvIHN0aWxsIGFzc2VydGVkIChwcm9wYWdhdGlvbiBkZWxheT8pCisJICogYW5kIGl0J3MgZGV0ZWN0aW5nIGFzIHRydWUuICBTaWdoLgorCSAqLworCisJaG9zdGRhdGEtPnNlbGVjdF90aW1lID0gMDsJLyogd2UgY291bnQgdGhlIGNsb2NrIHRpY2tzIGF0IHdoaWNoIHdlIHBvbGxlZCAqLworCWhvc3RkYXRhLT5zZWxlY3RpbmcgPSBjbWQ7CisKK3BhcnQyOgorCS8qIFJ2QzogaGVyZSB3ZSBlbnRlciBhZnRlciBhIHNsZWVwaW5nIHBlcmlvZCwgb3IgaW1tZWRpYXRlbHkgYWZ0ZXIKKwkgICBleGVjdXRpb24gb2YgcGFydCAxCisJICAgd2UgcG9sbCBvbmx5IG9uY2UgZWNoIGNsb2NrIHRpY2sgKi8KKwl2YWx1ZSA9IE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIChTUl9CU1kgfCBTUl9JTyk7CisKKwlpZiAoIXZhbHVlICYmIChob3N0ZGF0YS0+c2VsZWN0X3RpbWUgPCBIWi80KSkgeworCQkvKiBSdkM6IHdlIHN0aWxsIG11c3Qgd2FpdCBmb3IgYSBkZXZpY2UgcmVzcG9uc2UgKi8KKwkJaG9zdGRhdGEtPnNlbGVjdF90aW1lKys7CS8qIGFmdGVyIDI1IHRpY2tzIHRoZSBkZXZpY2UgaGFzIGZhaWxlZCAqLworCQlOQ1I1MzgwX3NldF90aW1lcihob3N0ZGF0YSwgMSk7CisJCXJldHVybiAwOwkvKiBSdkM6IHdlIHJldHVybiBoZXJlIHdpdGggaG9zdGRhdGEtPnNlbGVjdGluZyBzZXQsCisJCQkJICAgdG8gZ28gdG8gc2xlZXAgKi8KKwl9CisKKwlob3N0ZGF0YS0+c2VsZWN0aW5nID0gTlVMTDsvKiBjbGVhciB0aGlzIHBvaW50ZXIsIGJlY2F1c2Ugd2UgcGFzc2VkIHRoZQorCQkJCQkgICB3YWl0aW5nIHBlcmlvZCAqLworCWlmICgoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgKFNSX1NFTCB8IFNSX0lPKSkgPT0gKFNSX1NFTCB8IFNSX0lPKSkgeworCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCQlOQ1I1MzgwX3Jlc2VsZWN0KGluc3RhbmNlKTsKKwkJcHJpbnRrKCJzY3NpJWQgOiByZXNlbGVjdGlvbiBhZnRlciB3b24gYXJiaXRyYXRpb24/XG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJCU5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKiAKKwkgKiBObyBsZXNzIHRoYW4gdHdvIGRlc2tldyBkZWxheXMgYWZ0ZXIgdGhlIGluaXRpYXRvciBkZXRlY3RzIHRoZSAKKwkgKiBCU1kgc2lnbmFsIGlzIHRydWUsIGl0IHNoYWxsIHJlbGVhc2UgdGhlIFNFTCBzaWduYWwgYW5kIG1heSAKKwkgKiBjaGFuZ2UgdGhlIERBVEEgQlVTLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2luZ2VsCisJICovCisKKwl1ZGVsYXkoMSk7CisKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0FUTik7CisKKwlpZiAoIShOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9CU1kpKSB7CisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCWlmIChob3N0ZGF0YS0+dGFyZ2V0c19wcmVzZW50ICYgKDEgPDwgY21kLT5kZXZpY2UtPmlkKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInNjc2klZCA6IHdlaXJkbmVzc1xuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCQkJaWYgKGhvc3RkYXRhLT5yZXN0YXJ0X3NlbGVjdCkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiXHRyZXN0YXJ0IHNlbGVjdFxuIik7CisJCQlOQ1I1MzgwX2RwcmludChOREVCVUdfU0VMRUNUSU9OLCBpbnN0YW5jZSk7CisJCQlOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJY21kLT5yZXN1bHQgPSBESURfQkFEX1RBUkdFVCA8PCAxNjsKKwkJY29sbGVjdF9zdGF0cyhob3N0ZGF0YSwgY21kKTsKKwkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCQlkcHJpbnRrKE5ERUJVR19TRUxFQ1RJT04sICgic2NzaSVkIDogdGFyZ2V0IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gMjUwbXNcbiIsIGluc3RhbmNlLT5ob3N0X25vKSk7CisJCU5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkJcmV0dXJuIDA7CisJfQorCWhvc3RkYXRhLT50YXJnZXRzX3ByZXNlbnQgfD0gKDEgPDwgY21kLT5kZXZpY2UtPmlkKTsKKworCS8qCisJICogU2luY2Ugd2UgZm9sbG93ZWQgdGhlIFNDU0kgc3BlYywgYW5kIHJhaXNlZCBBVE4gd2hpbGUgU0VMIAorCSAqIHdhcyB0cnVlIGJ1dCBiZWZvcmUgQlNZIHdhcyBmYWxzZSBkdXJpbmcgc2VsZWN0aW9uLCB0aGUgaW5mb3JtYXRpb24KKwkgKiB0cmFuc2ZlciBwaGFzZSBzaG91bGQgYmUgYSBNRVNTQUdFIE9VVCBwaGFzZSBzbyB0aGF0IHdlIGNhbiBzZW5kIHRoZQorCSAqIElERU5USUZZIG1lc3NhZ2UuCisJICogCisJICogSWYgU0NTSS1JSSB0YWdnZWQgcXVldWluZyBpcyBlbmFibGVkLCB3ZSBhbHNvIHNlbmQgYSBTSU1QTEVfUVVFVUVfVEFHCisJICogbWVzc2FnZSAoMiBieXRlcykgd2l0aCBhIHRhZyBJRCB0aGF0IHdlIGluY3JlbWVudCB3aXRoIGV2ZXJ5IGNvbW1hbmQKKwkgKiB1bnRpbCBpdCB3cmFwcyBiYWNrIHRvIDAuCisJICoKKwkgKiBYWFggLSBpdCB0dXJucyBvdXQgdGhhdCB0aGVyZSBhcmUgc29tZSBicm9rZW4gU0NTSS1JSSBkZXZpY2VzLAorCSAqICAgICAgIHdoaWNoIGNsYWltIHRvIHN1cHBvcnQgdGFnZ2VkIHF1ZXVpbmcgYnV0IGZhaWwgd2hlbiBtb3JlIHRoYW4KKwkgKiAgICAgICBzb21lIG51bWJlciBvZiBjb21tYW5kcyBhcmUgaXNzdWVkIGF0IG9uY2UuCisJICovCisKKwkvKiBXYWl0IGZvciBzdGFydCBvZiBSRVEvQUNLIGhhbmRzaGFrZSAqLworCisJc3Bpbl91bmxvY2tfaXJxKGluc3RhbmNlLT5ob3N0X2xvY2spOworCWVyciA9IE5DUjUzODBfcG9sbF9wb2xpdGVseShpbnN0YW5jZSwgU1RBVFVTX1JFRywgU1JfUkVRLCBTUl9SRVEsIEhaKTsKKwlzcGluX2xvY2tfaXJxKGluc3RhbmNlLT5ob3N0X2xvY2spOworCQorCWlmKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgInNjc2klZDogdGltZW91dCBhdCBOQ1I1MzgwLmM6JWRcbiIsIGluc3RhbmNlLT5ob3N0X25vLCBfX0xJTkVfXyk7CisJCU5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJZHByaW50ayhOREVCVUdfU0VMRUNUSU9OLCAoInNjc2klZCA6IHRhcmdldCAlZCBzZWxlY3RlZCwgZ29pbmcgaW50byBNRVNTQUdFIE9VVCBwaGFzZS5cbiIsIGluc3RhbmNlLT5ob3N0X25vLCBjbWQtPmRldmljZS0+aWQpKTsKKwl0bXBbMF0gPSBJREVOVElGWSgoKGluc3RhbmNlLT5pcnEgPT0gU0NTSV9JUlFfTk9ORSkgPyAwIDogMSksIGNtZC0+ZGV2aWNlLT5sdW4pOworCisJbGVuID0gMTsKKwljbWQtPnRhZyA9IDA7CisKKwkvKiBTZW5kIG1lc3NhZ2UocykgKi8KKwlkYXRhID0gdG1wOworCXBoYXNlID0gUEhBU0VfTVNHT1VUOworCU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKTsKKwlkcHJpbnRrKE5ERUJVR19TRUxFQ1RJT04sICgic2NzaSVkIDogbmV4dXMgZXN0YWJsaXNoZWQuXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCS8qIFhYWCBuZWVkIHRvIGhhbmRsZSBlcnJvcnMgaGVyZSAqLworCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBjbWQ7CisJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSB8PSAoMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKworCWlmIChjbWQtPlNDcC5wdHIgIT0gKGNoYXIgKiljbWQtPnNlbnNlX2J1ZmZlcikgeworCQlpbml0aWFsaXplX1NDcChjbWQpOworCX0KKworCXJldHVybiAwOworCisJLyogU2VsZWN0aW9uIGZhaWxlZCAqLworZmFpbGVkOgorCXJldHVybiAtMTsKKworfQorCisvKiAKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfdHJhbnNmZXJfcGlvIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgCisgKiAgICAgIHVuc2lnbmVkIGNoYXIgKnBoYXNlLCBpbnQgKmNvdW50LCB1bnNpZ25lZCBjaGFyICoqZGF0YSkKKyAqCisgKiBQdXJwb3NlIDogdHJhbnNmZXJzIGRhdGEgaW4gZ2l2ZW4gcGhhc2UgdXNpbmcgcG9sbGVkIEkvTworICoKKyAqIElucHV0cyA6IGluc3RhbmNlIC0gaW5zdGFuY2Ugb2YgZHJpdmVyLCAqcGhhc2UgLSBwb2ludGVyIHRvIAorICogICAgICB3aGF0IHBoYXNlIGlzIGV4cGVjdGVkLCAqY291bnQgLSBwb2ludGVyIHRvIG51bWJlciBvZiAKKyAqICAgICAgYnl0ZXMgdG8gdHJhbnNmZXIsICoqZGF0YSAtIHBvaW50ZXIgdG8gZGF0YSBwb2ludGVyLgorICogCisgKiBSZXR1cm5zIDogLTEgd2hlbiBkaWZmZXJlbnQgcGhhc2UgaXMgZW50ZXJlZCB3aXRob3V0IHRyYW5zZmVycmluZworICogICAgICBtYXhpbXVtIG51bWJlciBvZiBieXRlcywgMCBpZiBhbGwgYnl0ZXMgb3IgdHJhbnNmZXJlZCBvciBleGl0CisgKiAgICAgIGlzIGluIHNhbWUgcGhhc2UuCisgKgorICogICAgICBBbHNvLCAqcGhhc2UsICpjb3VudCwgKmRhdGEgYXJlIG1vZGlmaWVkIGluIHBsYWNlLgorICoKKyAqIFhYWCBOb3RlIDogaGFuZGxpbmcgZm9yIGJ1cyBmcmVlIG1heSBiZSB1c2VmdWwuCisgKi8KKworLyoKKyAqIE5vdGUgOiB0aGlzIGNvZGUgaXMgbm90IGFzIHF1aWNrIGFzIGl0IGNvdWxkIGJlLCBob3dldmVyIGl0IAorICogSVMgMTAwJSByZWxpYWJsZSwgYW5kIGZvciB0aGUgYWN0dWFsIGRhdGEgdHJhbnNmZXIgd2hlcmUgc3BlZWQKKyAqIGNvdW50cywgd2Ugd2lsbCBhbHdheXMgZG8gYSBwc2V1ZG8gRE1BIG9yIERNQSB0cmFuc2Zlci4KKyAqLworCitzdGF0aWMgaW50IE5DUjUzODBfdHJhbnNmZXJfcGlvKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCB1bnNpZ25lZCBjaGFyICpwaGFzZSwgaW50ICpjb3VudCwgdW5zaWduZWQgY2hhciAqKmRhdGEpIHsKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwl1bnNpZ25lZCBjaGFyIHAgPSAqcGhhc2UsIHRtcDsKKwlpbnQgYyA9ICpjb3VudDsKKwl1bnNpZ25lZCBjaGFyICpkID0gKmRhdGE7CisJLyoKKwkgKiAgICAgIFJ2Qzogc29tZSBhZG1pbmlzdHJhdGl2ZSBkYXRhIHRvIHByb2Nlc3MgcG9sbGluZyB0aW1lCisJICovCisJaW50IGJyZWFrX2FsbG93ZWQgPSAwOworCXN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisJTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisKKwlpZiAoIShwICYgU1JfSU8pKQorCQlkcHJpbnRrKE5ERUJVR19QSU8sICgic2NzaSVkIDogcGlvIHdyaXRlICVkIGJ5dGVzXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgYykpOworCWVsc2UKKwkJZHByaW50ayhOREVCVUdfUElPLCAoInNjc2klZCA6IHBpbyByZWFkICVkIGJ5dGVzXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgYykpOworCisJLyogCisJICogVGhlIE5DUjUzODAgY2hpcCB3aWxsIG9ubHkgZHJpdmUgdGhlIFNDU0kgYnVzIHdoZW4gdGhlIAorCSAqIHBoYXNlIHNwZWNpZmllZCBpbiB0aGUgYXBwcm9wcmlhdGUgYml0cyBvZiB0aGUgVEFSR0VUIENPTU1BTkQKKwkgKiBSRUdJU1RFUiBtYXRjaCB0aGUgU1RBVFVTIFJFR0lTVEVSCisJICovCisKKwkgTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIFBIQVNFX1NSX1RPX1RDUihwKSk7CisKKwkvKiBSdkM6IGRvbid0IGtub3cgaWYgdGhpcyBpcyBuZWNlc3NhcnksIGJ1dCBvdGhlciBTQ1NJIEkvTyBpcyBzaG9ydAorCSAqICAgICAgc28gYnJlYWtzIGFyZSBub3QgbmVjZXNzYXJ5IHRoZXJlCisJICovCisJaWYgKChwID09IFBIQVNFX0RBVEFJTikgfHwgKHAgPT0gUEhBU0VfREFUQU9VVCkpIHsKKwkJYnJlYWtfYWxsb3dlZCA9IDE7CisJfQorCWRvIHsKKwkJLyogCisJCSAqIFdhaXQgZm9yIGFzc2VydGlvbiBvZiBSRVEsIGFmdGVyIHdoaWNoIHRoZSBwaGFzZSBiaXRzIHdpbGwgYmUgCisJCSAqIHZhbGlkIAorCQkgKi8KKworCQkvKiBSdkM6IHdlIHNpbXBseSBwb2xsIG9uY2UsIGFmdGVyIHRoYXQgd2Ugc3RvcCB0ZW1wb3JhcmlseQorCQkgKiAgICAgIGFuZCBsZXQgdGhlIGRldmljZSBidWZmZXIgZmlsbCB1cAorCQkgKiAgICAgIGlmIGJyZWFraW5nIGlzIG5vdCBhbGxvd2VkLCB3ZSBrZWVwIHBvbGxpbmcgYXMgbG9uZyBhcyBuZWVkZWQKKwkJICovCisKKwkJLyogRklYTUUgKi8KKwkJd2hpbGUgKCEoKHRtcCA9IE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSkgJiBTUl9SRVEpICYmICFicmVha19hbGxvd2VkKTsKKwkJaWYgKCEodG1wICYgU1JfUkVRKSkgeworCQkJLyogdGltZW91dCBjb25kaXRpb24gKi8KKwkJCU5DUjUzODBfc2V0X3RpbWVyKGhvc3RkYXRhLCBVU0xFRVBfU0xFRVApOworCQkJYnJlYWs7CisJCX0KKworCQlkcHJpbnRrKE5ERUJVR19IQU5EU0hBS0UsICgic2NzaSVkIDogUkVRIGRldGVjdGVkXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCisJCS8qIENoZWNrIGZvciBwaGFzZSBtaXNtYXRjaCAqLworCQlpZiAoKHRtcCAmIFBIQVNFX01BU0spICE9IHApIHsKKwkJCWRwcmludGsoTkRFQlVHX0hBTkRTSEFLRSwgKCJzY3NpJWQgOiBwaGFzZSBtaXNtYXRjaFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pKTsKKwkJCU5DUjUzODBfZHByaW50X3BoYXNlKE5ERUJVR19IQU5EU0hBS0UsIGluc3RhbmNlKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIERvIGFjdHVhbCB0cmFuc2ZlciBmcm9tIFNDU0kgYnVzIHRvIC8gZnJvbSBtZW1vcnkgKi8KKwkJaWYgKCEocCAmIFNSX0lPKSkKKwkJCU5DUjUzODBfd3JpdGUoT1VUUFVUX0RBVEFfUkVHLCAqZCk7CisJCWVsc2UKKwkJCSpkID0gTkNSNTM4MF9yZWFkKENVUlJFTlRfU0NTSV9EQVRBX1JFRyk7CisKKwkJKytkOworCisJCS8qIAorCQkgKiBUaGUgU0NTSSBzdGFuZGFyZCBzdWdnZXN0cyB0aGF0IGluIE1TR09VVCBwaGFzZSwgdGhlIGluaXRpYXRvcgorCQkgKiBzaG91bGQgZHJvcCBBVE4gb24gdGhlIGxhc3QgYnl0ZSBvZiB0aGUgbWVzc2FnZSBwaGFzZQorCQkgKiBhZnRlciBSRVEgaGFzIGJlZW4gYXNzZXJ0ZWQgZm9yIHRoZSBoYW5kc2hha2UgYnV0IGJlZm9yZQorCQkgKiB0aGUgaW5pdGlhdG9yIHJhaXNlcyBBQ0suCisJCSAqLworCisJCWlmICghKHAgJiBTUl9JTykpIHsKKwkJCWlmICghKChwICYgU1JfTVNHKSAmJiBjID4gMSkpIHsKKwkJCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0RBVEEpOworCQkJCU5DUjUzODBfZHByaW50KE5ERUJVR19QSU8sIGluc3RhbmNlKTsKKwkJCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0RBVEEgfCBJQ1JfQVNTRVJUX0FDSyk7CisJCQl9IGVsc2UgeworCQkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfREFUQSB8IElDUl9BU1NFUlRfQVROKTsKKwkJCQlOQ1I1MzgwX2RwcmludChOREVCVUdfUElPLCBpbnN0YW5jZSk7CisJCQkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9EQVRBIHwgSUNSX0FTU0VSVF9BVE4gfCBJQ1JfQVNTRVJUX0FDSyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlOQ1I1MzgwX2RwcmludChOREVCVUdfUElPLCBpbnN0YW5jZSk7CisJCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0FDSyk7CisJCX0KKworCQkvKiBGSVhNRSAtIGlmIHRoaXMgZmFpbHMgYnVzIHJlc2V0ID8/ICovCisJCU5DUjUzODBfcG9sbF9wb2xpdGVseShpbnN0YW5jZSwgU1RBVFVTX1JFRywgU1JfUkVRLCAwLCA1KkhaKTsKKwkJZHByaW50ayhOREVCVUdfSEFORFNIQUtFLCAoInNjc2klZCA6IHJlcSBmYWxzZSwgaGFuZHNoYWtlIGNvbXBsZXRlXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCisvKgorICogV2UgaGF2ZSBzZXZlcmFsIHNwZWNpYWwgY2FzZXMgdG8gY29uc2lkZXIgZHVyaW5nIFJFUS9BQ0sgaGFuZHNoYWtpbmcgOiAKKyAqIDEuICBXZSB3ZXJlIGluIE1TR09VVCBwaGFzZSwgYW5kIHdlIGFyZSBvbiB0aGUgbGFzdCBieXRlIG9mIHRoZSAKKyAqICAgICAgbWVzc2FnZS4gIEFUTiBtdXN0IGJlIGRyb3BwZWQgYXMgQUNLIGlzIGRyb3BwZWQuCisgKgorICogMi4gIFdlIGFyZSBpbiBhIE1TR0lOIHBoYXNlLCBhbmQgd2UgYXJlIG9uIHRoZSBsYXN0IGJ5dGUgb2YgdGhlICAKKyAqICAgICAgbWVzc2FnZS4gIFdlIG11c3QgZXhpdCB3aXRoIEFDSyBhc3NlcnRlZCwgc28gdGhhdCB0aGUgY2FsbGluZworICogICAgICBjb2RlIG1heSByYWlzZSBBVE4gYmVmb3JlIGRyb3BwaW5nIEFDSyB0byByZWplY3QgdGhlIG1lc3NhZ2UuCisgKgorICogMy4gIEFDSyBhbmQgQVROIGFyZSBjbGVhciBhbmQgdGhlIHRhcmdldCBtYXkgcHJvY2VlZCBhcyBub3JtYWwuCisgKi8KKwkJaWYgKCEocCA9PSBQSEFTRV9NU0dJTiAmJiBjID09IDEpKSB7CisJCQlpZiAocCA9PSBQSEFTRV9NU0dPVVQgJiYgYyA+IDEpCisJCQkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9BVE4pOworCQkJZWxzZQorCQkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCX0KKwl9IHdoaWxlICgtLWMpOworCisJZHByaW50ayhOREVCVUdfUElPLCAoInNjc2klZCA6IHJlc2lkdWFsICVkXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgYykpOworCisJKmNvdW50ID0gYzsKKwkqZGF0YSA9IGQ7CisJdG1wID0gTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpOworCWlmICh0bXAgJiBTUl9SRVEpCisJCSpwaGFzZSA9IHRtcCAmIFBIQVNFX01BU0s7CisJZWxzZQorCQkqcGhhc2UgPSBQSEFTRV9VTktOT1dOOworCisJaWYgKCFjIHx8ICgqcGhhc2UgPT0gcCkpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC0xOworfQorCisvKioKKyAqCWRvX3Jlc2V0CS0JaXNzdWUgYSByZXNldCBjb21tYW5kCisgKglAaG9zdDogYWRhcHRlciB0byByZXNldAorICoKKyAqCUlzc3VlIGEgcmVzZXQgc2VxdWVuY2UgdG8gdGhlIE5DUjUzODAgYW5kIHRyeSBhbmQgZ2V0IHRoZSBidXMKKyAqCWJhY2sgaW50byBzYW5lIHNoYXBlLgorICoKKyAqCUxvY2tzOiBjYWxsZXIgaG9sZHMgcXVldWUgbG9jaworICovCisgCitzdGF0aWMgdm9pZCBkb19yZXNldChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KSB7CisJTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisJTkNSNTM4MF9zZXR1cChob3N0KTsKKworCU5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCBQSEFTRV9TUl9UT19UQ1IoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgUEhBU0VfTUFTSykpOworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfUlNUKTsKKwl1ZGVsYXkoMjUpOworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IGRvX2Fib3J0IChTY3NpX0hvc3QgKmhvc3QpCisgKiAKKyAqIFB1cnBvc2UgOiBhYm9ydCB0aGUgY3VycmVudGx5IGVzdGFibGlzaGVkIG5leHVzLiAgU2hvdWxkIG9ubHkgYmUgCisgKiAgICAgIGNhbGxlZCBmcm9tIGEgcm91dGluZSB3aGljaCBjYW4gZHJvcCBpbnRvIGEgCisgKiAKKyAqIFJldHVybnMgOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisgKgorICogTG9ja3M6IHF1ZXVlIGxvY2sgaGVsZCBieSBjYWxsZXIKKyAqCUZJWE1FOiBzb3J0IHRoaXMgb3V0IGFuZCBnZXQgbmV3X2VoIHJ1bm5pbmcKKyAqLworCitzdGF0aWMgaW50IGRvX2Fib3J0KHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwl1bnNpZ25lZCBjaGFyICptc2dwdHIsIHBoYXNlLCB0bXA7CisJaW50IGxlbjsKKwlpbnQgcmM7CisJTkNSNTM4MF9zZXR1cChob3N0KTsKKworCisJLyogUmVxdWVzdCBtZXNzYWdlIG91dCBwaGFzZSAqLworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQVROKTsKKworCS8qIAorCSAqIFdhaXQgZm9yIHRoZSB0YXJnZXQgdG8gaW5kaWNhdGUgYSB2YWxpZCBwaGFzZSBieSBhc3NlcnRpbmcgCisJICogUkVRLiAgT25jZSB0aGlzIGhhcHBlbnMsIHdlJ2xsIGhhdmUgZWl0aGVyIGEgTVNHT1VUIHBoYXNlIAorCSAqIGFuZCBjYW4gaW1tZWRpYXRlbHkgc2VuZCB0aGUgQUJPUlQgbWVzc2FnZSwgb3Igd2UnbGwgaGF2ZSBzb21lIAorCSAqIG90aGVyIHBoYXNlIGFuZCB3aWxsIGhhdmUgdG8gc291cmNlL3NpbmsgZGF0YS4KKwkgKiAKKwkgKiBXZSByZWFsbHkgZG9uJ3QgY2FyZSB3aGF0IHZhbHVlIHdhcyBvbiB0aGUgYnVzIG9yIHdoYXQgdmFsdWUKKwkgKiB0aGUgdGFyZ2V0IHNlZXMsIHNvIHdlIGp1c3QgaGFuZHNoYWtlLgorCSAqLworCisJcmMgPSBOQ1I1MzgwX3BvbGxfcG9saXRlbHkoaG9zdCwgU1RBVFVTX1JFRywgU1JfUkVRLCBTUl9SRVEsIDYwICogSFopOworCQorCWlmKHJjIDwgMCkKKwkJcmV0dXJuIC0xOworCisJdG1wID0gKHVuc2lnbmVkIGNoYXIpcmM7CisJCisJTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIFBIQVNFX1NSX1RPX1RDUih0bXApKTsKKworCWlmICgodG1wICYgUEhBU0VfTUFTSykgIT0gUEhBU0VfTVNHT1VUKSB7CisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQVROIHwgSUNSX0FTU0VSVF9BQ0spOworCQlyYyA9IE5DUjUzODBfcG9sbF9wb2xpdGVseShob3N0LCBTVEFUVVNfUkVHLCBTUl9SRVEsIDAsIDMqSFopOworCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0FUTik7CisJCWlmKHJjID09IC0xKQorCQkJcmV0dXJuIC0xOworCX0KKwl0bXAgPSBBQk9SVDsKKwltc2dwdHIgPSAmdG1wOworCWxlbiA9IDE7CisJcGhhc2UgPSBQSEFTRV9NU0dPVVQ7CisJTkNSNTM4MF90cmFuc2Zlcl9waW8oaG9zdCwgJnBoYXNlLCAmbGVuLCAmbXNncHRyKTsKKworCS8qCisJICogSWYgd2UgZ290IGhlcmUsIGFuZCB0aGUgY29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LAorCSAqIHdlJ3JlIGFib3V0IHRvIGdvIGludG8gYnVzIGZyZWUgc3RhdGUuCisJICovCisKKwlyZXR1cm4gbGVuID8gLTEgOiAwOworfQorCisjaWYgZGVmaW5lZChSRUFMX0RNQSkgfHwgZGVmaW5lZChQU0VVRE9fRE1BKSB8fCBkZWZpbmVkIChSRUFMX0RNQV9QT0xMKQorLyogCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX3RyYW5zZmVyX2RtYSAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIAorICogICAgICB1bnNpZ25lZCBjaGFyICpwaGFzZSwgaW50ICpjb3VudCwgdW5zaWduZWQgY2hhciAqKmRhdGEpCisgKgorICogUHVycG9zZSA6IHRyYW5zZmVycyBkYXRhIGluIGdpdmVuIHBoYXNlIHVzaW5nIGVpdGhlciByZWFsCisgKiAgICAgIG9yIHBzZXVkbyBETUEuCisgKgorICogSW5wdXRzIDogaW5zdGFuY2UgLSBpbnN0YW5jZSBvZiBkcml2ZXIsICpwaGFzZSAtIHBvaW50ZXIgdG8gCisgKiAgICAgIHdoYXQgcGhhc2UgaXMgZXhwZWN0ZWQsICpjb3VudCAtIHBvaW50ZXIgdG8gbnVtYmVyIG9mIAorICogICAgICBieXRlcyB0byB0cmFuc2ZlciwgKipkYXRhIC0gcG9pbnRlciB0byBkYXRhIHBvaW50ZXIuCisgKiAKKyAqIFJldHVybnMgOiAtMSB3aGVuIGRpZmZlcmVudCBwaGFzZSBpcyBlbnRlcmVkIHdpdGhvdXQgdHJhbnNmZXJyaW5nCisgKiAgICAgIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzLCAwIGlmIGFsbCBieXRlcyBvciB0cmFuc2ZlcmVkIG9yIGV4aXQKKyAqICAgICAgaXMgaW4gc2FtZSBwaGFzZS4KKyAqCisgKiAgICAgIEFsc28sICpwaGFzZSwgKmNvdW50LCAqZGF0YSBhcmUgbW9kaWZpZWQgaW4gcGxhY2UuCisgKgorICoJTG9ja3M6IGlvX3JlcXVlc3QgbG9jayBoZWxkIGJ5IGNhbGxlcgorICovCisKKworc3RhdGljIGludCBOQ1I1MzgwX3RyYW5zZmVyX2RtYShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgdW5zaWduZWQgY2hhciAqcGhhc2UsIGludCAqY291bnQsIHVuc2lnbmVkIGNoYXIgKipkYXRhKSB7CisJTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisJcmVnaXN0ZXIgaW50IGMgPSAqY291bnQ7CisJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBwID0gKnBoYXNlOworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmQgPSAqZGF0YTsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwlpbnQgZm9vOworI2lmIGRlZmluZWQoUkVBTF9ETUFfUE9MTCkKKwlpbnQgY250LCB0b1BJTzsKKwl1bnNpZ25lZCBjaGFyIHNhdmVkX2RhdGEgPSAwLCBvdmVycnVuID0gMCwgcmVzaWR1ZTsKKyNlbmRpZgorCisJc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKmhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKKworCU5DUjUzODBfc2V0dXAoaW5zdGFuY2UpOworCisJaWYgKCh0bXAgPSAoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgUEhBU0VfTUFTSykpICE9IHApIHsKKwkJKnBoYXNlID0gdG1wOworCQlyZXR1cm4gLTE7CisJfQorI2lmIGRlZmluZWQoUkVBTF9ETUEpIHx8IGRlZmluZWQoUkVBTF9ETUFfUE9MTCkKKyNpZmRlZiBSRUFEX09WRVJSVU5TCisJaWYgKHAgJiBTUl9JTykgeworCQljIC09IDI7CisJfQorI2VuZGlmCisJZHByaW50ayhOREVCVUdfRE1BLCAoInNjc2klZCA6IGluaXRpYWxpemluZyBETUEgY2hhbm5lbCAlZCBmb3IgJXMsICVkIGJ5dGVzICVzICUweFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIGluc3RhbmNlLT5kbWFfY2hhbm5lbCwgKHAgJiBTUl9JTykgPyAicmVhZGluZyIgOiAid3JpdGluZyIsIGMsIChwICYgU1JfSU8pID8gInRvIiA6ICJmcm9tIiwgKHVuc2lnbmVkKSBkKSk7CisJaG9zdGRhdGEtPmRtYV9sZW4gPSAocCAmIFNSX0lPKSA/IE5DUjUzODBfZG1hX3JlYWRfc2V0dXAoaW5zdGFuY2UsIGQsIGMpIDogTkNSNTM4MF9kbWFfd3JpdGVfc2V0dXAoaW5zdGFuY2UsIGQsIGMpOworI2VuZGlmCisKKwlOQ1I1MzgwX3dyaXRlKFRBUkdFVF9DT01NQU5EX1JFRywgUEhBU0VfU1JfVE9fVENSKHApKTsKKworI2lmZGVmIFJFQUxfRE1BCisJTkNSNTM4MF93cml0ZShNT0RFX1JFRywgTVJfQkFTRSB8IE1SX0RNQV9NT0RFIHwgTVJfRU5BQkxFX0VPUF9JTlRSIHwgTVJfTU9OSVRPUl9CU1kpOworI2VsaWYgZGVmaW5lZChSRUFMX0RNQV9QT0xMKQorCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UgfCBNUl9ETUFfTU9ERSk7CisjZWxzZQorCS8qCisJICogTm90ZSA6IG9uIG15IHNhbXBsZSBib2FyZCwgd2F0Y2gtZG9nIHRpbWVvdXRzIG9jY3VycmVkIHdoZW4gaW50ZXJydXB0cworCSAqIHdlcmUgbm90IGRpc2FibGVkIGZvciB0aGUgZHVyYXRpb24gb2YgYSBzaW5nbGUgRE1BIHRyYW5zZmVyLCBmcm9tIAorCSAqIGJlZm9yZSB0aGUgc2V0dGluZyBvZiBETUEgbW9kZSB0byBhZnRlciB0cmFuc2ZlciBvZiB0aGUgbGFzdCBieXRlLgorCSAqLworCisjaWYgZGVmaW5lZChQU0VVRE9fRE1BKSAmJiBkZWZpbmVkKFVOU0FGRSkKKwlzcGluX3VubG9ja19pcnEoaW5zdGFuY2UtPmhvc3RfbG9jayk7CisjZW5kaWYKKwkvKiBLTEwgTWF5IG5lZWQgZW9wIGFuZCBwYXJpdHkgaW4gNTNjNDAwICovCisJaWYgKGhvc3RkYXRhLT5mbGFncyAmIEZMQUdfTkNSNTNDNDAwKQorCQlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFIHwgTVJfRE1BX01PREUgfCBNUl9FTkFCTEVfUEFSX0NIRUNLIHwgTVJfRU5BQkxFX1BBUl9JTlRSIHwgTVJfRU5BQkxFX0VPUF9JTlRSIHwgTVJfRE1BX01PREUgfCBNUl9NT05JVE9SX0JTWSk7CisJZWxzZQorCQlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFIHwgTVJfRE1BX01PREUpOworI2VuZGlmCQkJCS8qIGRlZiBSRUFMX0RNQSAqLworCisJZHByaW50ayhOREVCVUdfRE1BLCAoInNjc2klZCA6IG1vZGUgcmVnID0gMHglWFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIE5DUjUzODBfcmVhZChNT0RFX1JFRykpKTsKKworCS8qIAorCSAqCU9uIHRoZSBQQVMxNiBhdCBsZWFzdCBJL08gcmVjb3ZlcnkgZGVsYXlzIGFyZSBub3QgbmVlZGVkIGhlcmUuCisJICoJRXZlcnlvbmUgZWxzZSBzZWVtcyB0byB3YW50IHRoZW0uCisJICovCisKKwlpZiAocCAmIFNSX0lPKSB7CisJCWlvX3JlY292ZXJ5X2RlbGF5KDEpOworCQlOQ1I1MzgwX3dyaXRlKFNUQVJUX0RNQV9JTklUSUFUT1JfUkVDRUlWRV9SRUcsIDApOworCX0gZWxzZSB7CisJCWlvX3JlY292ZXJ5X2RlbGF5KDEpOworCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0RBVEEpOworCQlpb19yZWNvdmVyeV9kZWxheSgxKTsKKwkJTkNSNTM4MF93cml0ZShTVEFSVF9ETUFfU0VORF9SRUcsIDApOworCQlpb19yZWNvdmVyeV9kZWxheSgxKTsKKwl9CisKKyNpZiBkZWZpbmVkKFJFQUxfRE1BX1BPTEwpCisJZG8geworCQl0bXAgPSBOQ1I1MzgwX3JlYWQoQlVTX0FORF9TVEFUVVNfUkVHKTsKKwl9IHdoaWxlICgodG1wICYgQkFTUl9QSEFTRV9NQVRDSCkgJiYgISh0bXAgJiAoQkFTUl9CVVNZX0VSUk9SIHwgQkFTUl9FTkRfRE1BX1RSQU5TRkVSKSkpOworCisvKgorICAgQXQgdGhpcyBwb2ludCwgZWl0aGVyIHdlJ3ZlIGNvbXBsZXRlZCBETUEsIG9yIHdlIGhhdmUgYSBwaGFzZSBtaXNtYXRjaCwKKyAgIG9yIHdlJ3ZlIHVuZXhwZWN0ZWRseSBsb3N0IEJVU1kgKHdoaWNoIGlzIGEgcmVhbCBlcnJvcikuCisKKyAgIEZvciB3cml0ZSBETUFzLCB3ZSB3YW50IHRvIHdhaXQgdW50aWwgdGhlIGxhc3QgYnl0ZSBoYXMgYmVlbgorICAgdHJhbnNmZXJyZWQgb3V0IG92ZXIgdGhlIGJ1cyBiZWZvcmUgd2UgdHVybiBvZmYgRE1BIG1vZGUuICBBbGFzLCB0aGVyZQorICAgc2VlbXMgdG8gYmUgbm8gdGVycmlibHkgZ29vZCB3YXkgb2YgZG9pbmcgdGhpcyBvbiBhIDUzODAgdW5kZXIgYWxsCisgICBjb25kaXRpb25zLiAgRm9yIG5vbi1zY2F0dGVyLWdhdGhlciBvcGVyYXRpb25zLCB3ZSBjYW4gd2FpdCB1bnRpbCBSRVEKKyAgIGFuZCBBQ0sgYm90aCBnbyBmYWxzZSwgb3IgdW50aWwgYSBwaGFzZSBtaXNtYXRjaCBvY2N1cnMuICBHYXRoZXItd3JpdGVzCisgICBhcmUgbmFzdGllciwgc2luY2UgdGhlIGRldmljZSB3aWxsIGJlIGV4cGVjdGluZyBtb3JlIGRhdGEgdGhhbiB3ZQorICAgYXJlIHByZXBhcmVkIHRvIHNlbmQgaXQsIGFuZCBSRVEgd2lsbCByZW1haW4gYXNzZXJ0ZWQuICBPbiBhIDUzQzhbMDFdIHdlCisgICBjb3VsZCB0ZXN0IExBU1QgQklUIFNFTlQgdG8gYXNzdXJlIHRyYW5zZmVyIChJIGltYWdpbmUgdGhpcyBpcyBwcmVjaXNlbHkKKyAgIHdoeSB0aGlzIHNpZ25hbCB3YXMgYWRkZWQgdG8gdGhlIG5ld2VyIGNoaXBzKSBidXQgb24gdGhlIG9sZGVyIDUzOFswMV0KKyAgIHRoaXMgc2lnbmFsIGRvZXMgbm90IGV4aXN0LiAgVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgbGFjayBpcyBhIHdhdGNoZG9nOworICAgd2UgYmFpbCBvdXQgb2YgdGhlIHdhaXQtbG9vcCBhZnRlciBhIG1vZGVzdCBhbW91bnQgb2Ygd2FpdC10aW1lIGlmCisgICB0aGUgdXN1YWwgZXhpdCBjb25kaXRpb25zIGFyZSBub3QgbWV0LiAgTm90IGEgdGVycmlibHkgY2xlYW4gb3IKKyAgIGNvcnJlY3Qgc29sdXRpb24gOi0lCisKKyAgIFJlYWRzIGFyZSBlcXVhbGx5IHRyaWNreSBkdWUgdG8gYSBuYXN0eSBjaGFyYWN0ZXJpc3RpYyBvZiB0aGUgTkNSNTM4MC4KKyAgIElmIHRoZSBjaGlwIGlzIGluIERNQSBtb2RlIGZvciBhbiBSRUFELCBpdCB3aWxsIHJlc3BvbmQgdG8gYSB0YXJnZXQncworICAgUkVRIGJ5IGxhdGNoaW5nIHRoZSBTQ1NJIGRhdGEgaW50byB0aGUgSU5QVVQgREFUQSByZWdpc3RlciBhbmQgYXNzZXJ0aW5nCisgICBBQ0ssIGV2ZW4gaWYgaXQgaGFzIF9hbHJlYWR5XyBiZWVuIG5vdGlmaWVkIGJ5IHRoZSBETUEgY29udHJvbGxlciB0aGF0CisgICB0aGUgY3VycmVudCBETUEgdHJhbnNmZXIgaGFzIGNvbXBsZXRlZCEgIElmIHRoZSBOQ1I1MzgwIGlzIHRoZW4gdGFrZW4KKyAgIG91dCBvZiBETUEgbW9kZSwgdGhpcyBhbHJlYWR5LWFja25vd2xlZGdlZCBieXRlIGlzIGxvc3QuCisKKyAgIFRoaXMgaXMgbm90IGEgcHJvYmxlbSBmb3IgIm9uZSBETUEgdHJhbnNmZXIgcGVyIGNvbW1hbmQiIHJlYWRzLCBiZWNhdXNlCisgICB0aGUgc2l0dWF0aW9uIHdpbGwgbmV2ZXIgYXJpc2UuLi4gZWl0aGVyIGFsbCBvZiB0aGUgZGF0YSBpcyBETUEnZWQKKyAgIHByb3Blcmx5LCBvciB0aGUgdGFyZ2V0IHN3aXRjaGVzIHRvIE1FU1NBR0UgSU4gcGhhc2UgdG8gc2lnbmFsIGEKKyAgIGRpc2Nvbm5lY3Rpb24gKGVpdGhlciBvcGVyYXRpb24gYnJpbmdpbmcgdGhlIERNQSB0byBhIGNsZWFuIGhhbHQpLgorICAgSG93ZXZlciwgaW4gb3JkZXIgdG8gaGFuZGxlIHNjYXR0ZXItcmVhZHMsIHdlIG11c3Qgd29yayBhcm91bmQgdGhlCisgICBwcm9ibGVtLiAgVGhlIGNob3NlbiBmaXggaXMgdG8gRE1BIE4tMiBieXRlcywgdGhlbiBjaGVjayBmb3IgdGhlCisgICBjb25kaXRpb24gYmVmb3JlIHRha2luZyB0aGUgTkNSNTM4MCBvdXQgb2YgRE1BIG1vZGUuICBPbmUgb3IgdHdvIGV4dHJhCisgICBieXRlcyBhcmUgdHJhbnNmZXJyZWQgdmlhIFBJTyBhcyBuZWNlc3NhcnkgdG8gZmlsbCBvdXQgdGhlIG9yaWdpbmFsCisgICByZXF1ZXN0LgorICovCisKKwlpZiAocCAmIFNSX0lPKSB7CisjaWZkZWYgUkVBRF9PVkVSUlVOUworCQl1ZGVsYXkoMTApOworCQlpZiAoKChOQ1I1MzgwX3JlYWQoQlVTX0FORF9TVEFUVVNfUkVHKSAmIChCQVNSX1BIQVNFX01BVENIIHwgQkFTUl9BQ0spKSA9PSAoQkFTUl9QSEFTRV9NQVRDSCB8IEJBU1JfQUNLKSkpIHsKKwkJCXNhdmVkX2RhdGEgPSBOQ1I1MzgwX3JlYWQoSU5QVVRfREFUQV9SRUdJU1RFUik7CisJCQlvdmVycnVuID0gMTsKKwkJfQorI2VuZGlmCisJfSBlbHNlIHsKKwkJaW50IGxpbWl0ID0gMTAwOworCQl3aGlsZSAoKCh0bXAgPSBOQ1I1MzgwX3JlYWQoQlVTX0FORF9TVEFUVVNfUkVHKSkgJiBCQVNSX0FDSykgfHwgKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIFNSX1JFUSkpIHsKKwkJCWlmICghKHRtcCAmIEJBU1JfUEhBU0VfTUFUQ0gpKQorCQkJCWJyZWFrOworCQkJaWYgKC0tbGltaXQgPCAwKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJZHByaW50ayhOREVCVUdfRE1BLCAoInNjc2klZCA6IHBvbGxlZCBETUEgdHJhbnNmZXIgY29tcGxldGUsIGJhc3IgMHglWCwgc3IgMHglWFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIHRtcCwgTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpKSk7CisKKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCisJcmVzaWR1ZSA9IE5DUjUzODBfZG1hX3Jlc2lkdWFsKGluc3RhbmNlKTsKKwljIC09IHJlc2lkdWU7CisJKmNvdW50IC09IGM7CisJKmRhdGEgKz0gYzsKKwkqcGhhc2UgPSBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBQSEFTRV9NQVNLOworCisjaWZkZWYgUkVBRF9PVkVSUlVOUworCWlmICgqcGhhc2UgPT0gcCAmJiAocCAmIFNSX0lPKSAmJiByZXNpZHVlID09IDApIHsKKwkJaWYgKG92ZXJydW4pIHsKKwkJCWRwcmludGsoTkRFQlVHX0RNQSwgKCJHb3QgYW4gaW5wdXQgb3ZlcnJ1biwgdXNpbmcgc2F2ZWQgYnl0ZVxuIikpOworCQkJKipkYXRhID0gc2F2ZWRfZGF0YTsKKwkJCSpkYXRhICs9IDE7CisJCQkqY291bnQgLT0gMTsKKwkJCWNudCA9IHRvUElPID0gMTsKKwkJfSBlbHNlIHsKKwkJCXByaW50aygiTm8gb3ZlcnJ1bj8/XG4iKTsKKwkJCWNudCA9IHRvUElPID0gMjsKKwkJfQorCQlkcHJpbnRrKE5ERUJVR19ETUEsICgiRG9pbmcgJWQtYnl0ZSBQSU8gdG8gMHglWFxuIiwgY250LCAqZGF0YSkpOworCQlOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgcGhhc2UsICZjbnQsIGRhdGEpOworCQkqY291bnQgLT0gdG9QSU8gLSBjbnQ7CisJfQorI2VuZGlmCisKKwlkcHJpbnRrKE5ERUJVR19ETUEsICgiUmV0dXJuIHdpdGggZGF0YSBwdHIgPSAweCVYLCBjb3VudCAlZCwgbGFzdCAweCVYLCBuZXh0IDB4JVhcbiIsICpkYXRhLCAqY291bnQsICooKmRhdGEgKyAqY291bnQgLSAxKSwgKigqZGF0YSArICpjb3VudCkpKTsKKwlyZXR1cm4gMDsKKworI2VsaWYgZGVmaW5lZChSRUFMX0RNQSkKKwlyZXR1cm4gMDsKKyNlbHNlCQkJCS8qIGRlZmluZWQoUkVBTF9ETUFfUE9MTCkgKi8KKwlpZiAocCAmIFNSX0lPKSB7CisjaWZkZWYgRE1BX1dPUktTX1JJR0hUCisJCWZvbyA9IE5DUjUzODBfcHJlYWQoaW5zdGFuY2UsIGQsIGMpOworI2Vsc2UKKwkJaW50IGRpZmYgPSAxOworCQlpZiAoaG9zdGRhdGEtPmZsYWdzICYgRkxBR19OQ1I1M0M0MDApIHsKKwkJCWRpZmYgPSAwOworCQl9CisJCWlmICghKGZvbyA9IE5DUjUzODBfcHJlYWQoaW5zdGFuY2UsIGQsIGMgLSBkaWZmKSkpIHsKKwkJCS8qCisJCQkgKiBXZSBjYW4ndCBkaXNhYmxlIERNQSBtb2RlIGFmdGVyIHN1Y2Nlc3NmdWxseSB0cmFuc2ZlcnJpbmcgCisJCQkgKiB3aGF0IHdlIHBsYW4gdG8gYmUgdGhlIGxhc3QgYnl0ZSwgc2luY2UgdGhhdCB3b3VsZCBvcGVuIHVwCisJCQkgKiBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIGlmIHRoZSB0YXJnZXQgYXNzZXJ0ZWQgUkVRIGJlZm9yZSAKKwkJCSAqIHdlIGdvdCB0aGUgRE1BIG1vZGUgcmVzZXQsIHRoZSBOQ1I1MzgwIHdvdWxkIGhhdmUgbGF0Y2hlZAorCQkJICogYW4gYWRkaXRpb25hbCBieXRlIGludG8gdGhlIElOUFVUIERBVEEgcmVnaXN0ZXIgYW5kIHdlJ2QKKwkJCSAqIGhhdmUgZHJvcHBlZCBpdC4KKwkJCSAqIAorCQkJICogVGhlIHdvcmthcm91bmQgd2FzIHRvIHRyYW5zZmVyIG9uZSBmZXdlciBieXRlcyB0aGFuIHdlIAorCQkJICogaW50ZW5kZWQgdG8gd2l0aCB0aGUgcHNldWRvLURNQSByZWFkIGZ1bmN0aW9uLCB3YWl0IGZvciAKKwkJCSAqIHRoZSBjaGlwIHRvIGxhdGNoIHRoZSBsYXN0IGJ5dGUsIHJlYWQgaXQsIGFuZCB0aGVuIGRpc2FibGUKKwkJCSAqIHBzZXVkby1ETUEgbW9kZS4KKwkJCSAqIAorCQkJICogQWZ0ZXIgUkVRIGlzIGFzc2VydGVkLCB0aGUgTkNSNTM4MCBhc3NlcnRzIERSUSBhbmQgQUNLLgorCQkJICogUkVRIGlzIGRlYXNzZXJ0ZWQgd2hlbiBBQ0sgaXMgYXNzZXJ0ZWQsIGFuZCBub3QgcmVhc3NlcnRlZAorCQkJICogdW50aWwgQUNLIGdvZXMgZmFsc2UuICBTaW5jZSB0aGUgTkNSNTM4MCB3b24ndCBsb3dlciBBQ0sKKwkJCSAqIHVudGlsIERBQ0sgaXMgYXNzZXJ0ZWQsIHdoaWNoIHdvbid0IGhhcHBlbiB1bmxlc3Mgd2UgdHdpZGRsZQorCQkJICogdGhlIERNQSBwb3J0IG9yIHdlIHRha2UgdGhlIE5DUjUzODAgb3V0IG9mIERNQSBtb2RlLCB3ZSAKKwkJCSAqIGNhbiBndWFyYW50ZWUgdGhhdCB3ZSB3b24ndCBoYW5kc2hha2UgYW5vdGhlciBleHRyYSAKKwkJCSAqIGJ5dGUuCisJCQkgKi8KKworCQkJaWYgKCEoaG9zdGRhdGEtPmZsYWdzICYgRkxBR19OQ1I1M0M0MDApKSB7CisJCQkJd2hpbGUgKCEoTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRykgJiBCQVNSX0RSUSkpOworCQkJCS8qIFdhaXQgZm9yIGNsZWFuIGhhbmRzaGFrZSAqLworCQkJCXdoaWxlIChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9SRVEpOworCQkJCWRbYyAtIDFdID0gTkNSNTM4MF9yZWFkKElOUFVUX0RBVEFfUkVHKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJfSBlbHNlIHsKKyNpZmRlZiBETUFfV09SS1NfUklHSFQKKwkJZm9vID0gTkNSNTM4MF9wd3JpdGUoaW5zdGFuY2UsIGQsIGMpOworI2Vsc2UKKwkJaW50IHRpbWVvdXQ7CisJCWRwcmludGsoTkRFQlVHX0M0MDBfUFdSSVRFLCAoIkFib3V0IHRvIHB3cml0ZSAlZCBieXRlc1xuIiwgYykpOworCQlpZiAoIShmb28gPSBOQ1I1MzgwX3B3cml0ZShpbnN0YW5jZSwgZCwgYykpKSB7CisJCQkvKgorCQkJICogV2FpdCBmb3IgdGhlIGxhc3QgYnl0ZSB0byBiZSBzZW50LiAgSWYgUkVRIGlzIGJlaW5nIGFzc2VydGVkIGZvciAKKwkJCSAqIHRoZSBieXRlIHdlJ3JlIGludGVyZXN0ZWQsIHdlJ2xsIEFDSyBpdCBhbmQgaXQgd2lsbCBnbyBmYWxzZS4gIAorCQkJICovCisJCQlpZiAoIShob3N0ZGF0YS0+ZmxhZ3MgJiBGTEFHX0hBU19MQVNUX0JZVEVfU0VOVCkpIHsKKwkJCQl0aW1lb3V0ID0gMjAwMDA7CisJCQkJd2hpbGUgKCEoTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRykgJiBCQVNSX0RSUSkgJiYgKE5DUjUzODBfcmVhZChCVVNfQU5EX1NUQVRVU19SRUcpICYgQkFTUl9QSEFTRV9NQVRDSCkpOworCisJCQkJaWYgKCF0aW1lb3V0KQorCQkJCQlkcHJpbnRrKE5ERUJVR19MQVNUX0JZVEVfU0VOVCwgKCJzY3NpJWQgOiB0aW1lZCBvdXQgb24gbGFzdCBieXRlXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCisJCQkJaWYgKGhvc3RkYXRhLT5mbGFncyAmIEZMQUdfQ0hFQ0tfTEFTVF9CWVRFX1NFTlQpIHsKKwkJCQkJaG9zdGRhdGEtPmZsYWdzICY9IH5GTEFHX0NIRUNLX0xBU1RfQllURV9TRU5UOworCQkJCQlpZiAoTkNSNTM4MF9yZWFkKFRBUkdFVF9DT01NQU5EX1JFRykgJiBUQ1JfTEFTVF9CWVRFX1NFTlQpIHsKKwkJCQkJCWhvc3RkYXRhLT5mbGFncyB8PSBGTEFHX0hBU19MQVNUX0JZVEVfU0VOVDsKKwkJCQkJCWRwcmludGsoTkRFQlVHX0xBU1RfV1JJVEVfU0VOVCwgKCJzY3NpJWQgOiBsYXN0IGJpdCBzZW50IHdvcmtzXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlkcHJpbnRrKE5ERUJVR19DNDAwX1BXUklURSwgKCJXYWl0aW5nIGZvciBMQVNUQllURVxuIikpOworCQkJCXdoaWxlICghKE5DUjUzODBfcmVhZChUQVJHRVRfQ09NTUFORF9SRUcpICYgVENSX0xBU1RfQllURV9TRU5UKSk7CisJCQkJZHByaW50ayhOREVCVUdfQzQwMF9QV1JJVEUsICgiR290IExBU1RCWVRFXG4iKSk7CisJCQl9CisJCX0KKyNlbmRpZgorCX0KKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCisJaWYgKCghKHAgJiBTUl9JTykpICYmIChob3N0ZGF0YS0+ZmxhZ3MgJiBGTEFHX05DUjUzQzQwMCkpIHsKKwkJZHByaW50ayhOREVCVUdfQzQwMF9QV1JJVEUsICgiNTNDNDAwdzogQ2hlY2tpbmcgZm9yIElSUVxuIikpOworCQlpZiAoTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRykgJiBCQVNSX0lSUSkgeworCQkJZHByaW50ayhOREVCVUdfQzQwMF9QV1JJVEUsICgiNTNDNDAwdzogICAgZ290IGl0LCByZWFkaW5nIHJlc2V0IGludGVycnVwdCByZWdcbiIpKTsKKwkJCU5DUjUzODBfcmVhZChSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoIjUzQzQwMHc6ICAgIElSUSBOT1QgVEhFUkUhXG4iKTsKKwkJfQorCX0KKwkqZGF0YSA9IGQgKyBjOworCSpjb3VudCA9IDA7CisJKnBoYXNlID0gTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgUEhBU0VfTUFTSzsKKyNpZiBkZWZpbmVkKFBTRVVET19ETUEpICYmIGRlZmluZWQoVU5TQUZFKQorCXNwaW5fbG9ja19pcnEoaW5zdGFuY2UtPmhvc3RfbG9jayk7CisjZW5kaWYJCQkJLyogZGVmaW5lZChSRUFMX0RNQV9QT0xMKSAqLworCXJldHVybiBmb287CisjZW5kaWYJCQkJLyogZGVmIFJFQUxfRE1BICovCit9CisjZW5kaWYJCQkJLyogZGVmaW5lZChSRUFMX0RNQSkgfCBkZWZpbmVkKFBTRVVET19ETUEpICovCisKKy8qCisgKiBGdW5jdGlvbiA6IE5DUjUzODBfaW5mb3JtYXRpb25fdHJhbnNmZXIgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQorICoKKyAqIFB1cnBvc2UgOiBydW4gdGhyb3VnaCB0aGUgdmFyaW91cyBTQ1NJIHBoYXNlcyBhbmQgZG8gYXMgdGhlIHRhcmdldCAKKyAqICAgICAgZGlyZWN0cyB1cyB0by4gIE9wZXJhdGVzIG9uIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIGNvbW1hbmQsIAorICogICAgICBpbnN0YW5jZS0+Y29ubmVjdGVkLgorICoKKyAqIElucHV0cyA6IGluc3RhbmNlLCBpbnN0YW5jZSBmb3Igd2hpY2ggd2UgYXJlIGRvaW5nIGNvbW1hbmRzCisgKgorICogU2lkZSBlZmZlY3RzIDogU0NTSSB0aGluZ3MgaGFwcGVuLCB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlIHdpbGwgYmUgCisgKiAgICAgIG1vZGlmaWVkIGlmIGEgY29tbWFuZCBkaXNjb25uZWN0cywgKmluc3RhbmNlLT5jb25uZWN0ZWQgd2lsbAorICogICAgICBjaGFuZ2UuCisgKgorICogWFhYIE5vdGUgOiB3ZSBuZWVkIHRvIHdhdGNoIGZvciBidXMgZnJlZSBvciBhIHJlc2V0IGNvbmRpdGlvbiBoZXJlIAorICogICAgICB0byByZWNvdmVyIGZyb20gYW4gdW5leHBlY3RlZCBidXMgZnJlZSBjb25kaXRpb24uCisgKgorICogTG9ja3M6IGlvX3JlcXVlc3RfbG9jayBoZWxkIGJ5IGNhbGxlciBpbiBJUlEgbW9kZQorICovCisKK3N0YXRpYyB2b2lkIE5DUjUzODBfaW5mb3JtYXRpb25fdHJhbnNmZXIoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpIHsKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwlzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKilpbnN0YW5jZS0+aG9zdGRhdGE7CisJdW5zaWduZWQgY2hhciBtc2dvdXQgPSBOT1A7CisJaW50IHNpbmsgPSAwOworCWludCBsZW47CisjaWYgZGVmaW5lZChQU0VVRE9fRE1BKSB8fCBkZWZpbmVkKFJFQUxfRE1BX1BPTEwpCisJaW50IHRyYW5zZmVyc2l6ZTsKKyNlbmRpZgorCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJdW5zaWduZWQgY2hhciBwaGFzZSwgdG1wLCBleHRlbmRlZF9tc2dbMTBdLCBvbGRfcGhhc2UgPSAweGZmOworCVNjc2lfQ21uZCAqY21kID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+Y29ubmVjdGVkOworCS8qIFJ2Qzogd2UgbmVlZCB0byBzZXQgdGhlIGVuZCBvZiB0aGUgcG9sbGluZyB0aW1lICovCisJdW5zaWduZWQgbG9uZyBwb2xsX3RpbWUgPSBqaWZmaWVzICsgVVNMRUVQX1BPTEw7CisKKwlOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKKworCXdoaWxlICgxKSB7CisJCXRtcCA9IE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKTsKKwkJLyogV2Ugb25seSBoYXZlIGEgdmFsaWQgU0NTSSBwaGFzZSB3aGVuIFJFUSBpcyBhc3NlcnRlZCAqLworCQlpZiAodG1wICYgU1JfUkVRKSB7CisJCQlwaGFzZSA9ICh0bXAgJiBQSEFTRV9NQVNLKTsKKwkJCWlmIChwaGFzZSAhPSBvbGRfcGhhc2UpIHsKKwkJCQlvbGRfcGhhc2UgPSBwaGFzZTsKKwkJCQlOQ1I1MzgwX2RwcmludF9waGFzZShOREVCVUdfSU5GT1JNQVRJT04sIGluc3RhbmNlKTsKKwkJCX0KKwkJCWlmIChzaW5rICYmIChwaGFzZSAhPSBQSEFTRV9NU0dPVVQpKSB7CisJCQkJTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIFBIQVNFX1NSX1RPX1RDUih0bXApKTsKKworCQkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQVROIHwgSUNSX0FTU0VSVF9BQ0spOworCQkJCXdoaWxlIChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9SRVEpOworCQkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQVROKTsKKwkJCQlzaW5rID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXN3aXRjaCAocGhhc2UpIHsKKwkJCWNhc2UgUEhBU0VfREFUQUlOOgorCQkJY2FzZSBQSEFTRV9EQVRBT1VUOgorI2lmIChOREVCVUcgJiBOREVCVUdfTk9fREFUQU9VVCkKKwkJCQlwcmludGsoInNjc2klZCA6IE5ERUJVR19OT19EQVRBT1VUIHNldCwgYXR0ZW1wdGVkIERBVEFPVVQgYWJvcnRlZFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCQkJCXNpbmsgPSAxOworCQkJCWRvX2Fib3J0KGluc3RhbmNlKTsKKwkJCQljbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJCQljbWQtPmRvbmUoY21kKTsKKwkJCQlyZXR1cm47CisjZW5kaWYKKwkJCQkvKiAKKwkJCQkgKiBJZiB0aGVyZSBpcyBubyByb29tIGxlZnQgaW4gdGhlIGN1cnJlbnQgYnVmZmVyIGluIHRoZQorCQkJCSAqIHNjYXR0ZXItZ2F0aGVyIGxpc3QsIG1vdmUgb250byB0aGUgbmV4dCBvbmUuCisJCQkJICovCisKKwkJCQlpZiAoIWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgJiYgY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCkgeworCQkJCQkrK2NtZC0+U0NwLmJ1ZmZlcjsKKwkJCQkJLS1jbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsOworCQkJCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gY21kLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJCQkJCWNtZC0+U0NwLnB0ciA9IHBhZ2VfYWRkcmVzcyhjbWQtPlNDcC5idWZmZXItPnBhZ2UpKworCQkJCQkJICAgICAgIGNtZC0+U0NwLmJ1ZmZlci0+b2Zmc2V0OworCQkJCQlkcHJpbnRrKE5ERUJVR19JTkZPUk1BVElPTiwgKCJzY3NpJWQgOiAlZCBieXRlcyBhbmQgJWQgYnVmZmVycyBsZWZ0XG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgY21kLT5TQ3AudGhpc19yZXNpZHVhbCwgY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCkpOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIFRoZSBwcmVmZXJyZWQgdHJhbnNmZXIgbWV0aG9kIGlzIGdvaW5nIHRvIGJlIAorCQkJCSAqIFBTRVVETy1ETUEgZm9yIHN5c3RlbXMgdGhhdCBhcmUgc3RyaWN0bHkgUElPLAorCQkJCSAqIHNpbmNlIHdlIGNhbiBsZXQgdGhlIGhhcmR3YXJlIGRvIHRoZSBoYW5kc2hha2luZy4KKwkJCQkgKgorCQkJCSAqIEZvciB0aGlzIHRvIHdvcmssIHdlIG5lZWQgdG8ga25vdyB0aGUgdHJhbnNmZXJzaXplCisJCQkJICogYWhlYWQgb2YgdGltZSwgc2luY2UgdGhlIHBzZXVkby1ETUEgY29kZSB3aWxsIHNpdAorCQkJCSAqIGluIGFuIHVuY29uZGl0aW9uYWwgbG9vcC4KKwkJCQkgKi8KKworI2lmIGRlZmluZWQoUFNFVURPX0RNQSkgfHwgZGVmaW5lZChSRUFMX0RNQV9QT0xMKQorCQkJCS8qIEtMTAorCQkJCSAqIFBTRVVET19ETUEgaXMgZGVmaW5lZCBoZXJlLiBJZiB0aGlzIGlzIHRoZSBnX05DUjUzODAKKwkJCQkgKiBkcml2ZXIgdGhlbiBpdCB3aWxsIGFsd2F5cyBiZSBkZWZpbmVkLCBzbyB0aGUKKwkJCQkgKiBGTEFHX05PX1BTRVVET19ETUEgaXMgdXNlZCB0byBpbmhpYml0IFBETUEgaW4gdGhlIGJhc2UKKwkJCQkgKiBOQ1I1MzgwIGNhc2UuICBJIHRoaW5rIHRoaXMgaXMgYSBmYWlybHkgY2xlYW4gc29sdXRpb24uCisJCQkJICogV2Ugc3VwcGxlbWVudCB0aGVzZSAyIGlmJ3Mgd2l0aCB0aGUgZmxhZy4KKwkJCQkgKi8KKyNpZmRlZiBOQ1I1MzgwX2RtYV94ZmVyX2xlbgorCQkJCWlmICghY21kLT5kZXZpY2UtPmJvcmtlbiAmJiAhKGhvc3RkYXRhLT5mbGFncyAmIEZMQUdfTk9fUFNFVURPX0RNQSkgJiYgKHRyYW5zZmVyc2l6ZSA9IE5DUjUzODBfZG1hX3hmZXJfbGVuKGluc3RhbmNlLCBjbWQpKSAhPSAwKSB7CisjZWxzZQorCQkJCXRyYW5zZmVyc2l6ZSA9IGNtZC0+dHJhbnNmZXJzaXplOworCisjaWZkZWYgTElNSVRfVFJBTlNGRVJTSVpFCS8qIElmIHdlIGhhdmUgcHJvYmxlbXMgd2l0aCBpbnRlcnJ1cHQgc2VydmljZSAqLworCQkJCWlmICh0cmFuc2ZlcnNpemUgPiA1MTIpCisJCQkJCXRyYW5zZmVyc2l6ZSA9IDUxMjsKKyNlbmRpZgkJCQkvKiBMSU1JVF9UUkFOU0ZFUlNJWkUgKi8KKworCQkJCWlmICghY21kLT5kZXZpY2UtPmJvcmtlbiAmJiB0cmFuc2ZlcnNpemUgJiYgIShob3N0ZGF0YS0+ZmxhZ3MgJiBGTEFHX05PX1BTRVVET19ETUEpICYmIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgJiYgIShjbWQtPlNDcC50aGlzX3Jlc2lkdWFsICUgdHJhbnNmZXJzaXplKSkgeworCQkJCQkvKiBMaW1pdCB0cmFuc2ZlcnMgdG8gMzJLLCBmb3IgeHg0MDAgJiB4eDQwNgorCQkJCQkgKiBwc2V1ZG9ETUEgdGhhdCB0cmFuc2ZlcnMgaW4gMTI4IGJ5dGVzIGJsb2Nrcy4gKi8KKwkJCQkJaWYgKHRyYW5zZmVyc2l6ZSA+IDMyICogMTAyNCkKKwkJCQkJCXRyYW5zZmVyc2l6ZSA9IDMyICogMTAyNDsKKyNlbmRpZgorCQkJCQlsZW4gPSB0cmFuc2ZlcnNpemU7CisJCQkJCWlmIChOQ1I1MzgwX3RyYW5zZmVyX2RtYShpbnN0YW5jZSwgJnBoYXNlLCAmbGVuLCAodW5zaWduZWQgY2hhciAqKikgJmNtZC0+U0NwLnB0cikpIHsKKwkJCQkJCS8qCisJCQkJCQkgKiBJZiB0aGUgd2F0Y2hkb2cgdGltZXIgZmlyZXMsIGFsbCBmdXR1cmUgYWNjZXNzZXMgdG8gdGhpcworCQkJCQkJICogZGV2aWNlIHdpbGwgdXNlIHRoZSBwb2xsZWQtSU8uCisJCQkJCQkgKi8KKwkJCQkJCXByaW50aygic2NzaSVkIDogc3dpdGNoaW5nIHRhcmdldCAlZCBsdW4gJWQgdG8gc2xvdyBoYW5kc2hha2VcbiIsIGluc3RhbmNlLT5ob3N0X25vLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCQkJCQkJY21kLT5kZXZpY2UtPmJvcmtlbiA9IDE7CisJCQkJCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0FUTik7CisJCQkJCQlzaW5rID0gMTsKKwkJCQkJCWRvX2Fib3J0KGluc3RhbmNlKTsKKwkJCQkJCWNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQkJCQkJY21kLT5kb25lKGNtZCk7CisJCQkJCQkvKiBYWFggLSBuZWVkIHRvIHNvdXJjZSBvciBzaW5rIGRhdGEgaGVyZSwgYXMgYXBwcm9wcmlhdGUgKi8KKwkJCQkJfSBlbHNlCisJCQkJCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsIC09IHRyYW5zZmVyc2l6ZSAtIGxlbjsKKwkJCQl9IGVsc2UKKyNlbmRpZgkJCQkvKiBkZWZpbmVkKFBTRVVET19ETUEpIHx8IGRlZmluZWQoUkVBTF9ETUFfUE9MTCkgKi8KKwkJCQkJTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgKGludCAqKSAmY21kLT5TQ3AudGhpc19yZXNpZHVhbCwgKHVuc2lnbmVkIGNoYXIgKiopCisJCQkJCQkJICAgICAmY21kLT5TQ3AucHRyKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUEhBU0VfTVNHSU46CisJCQkJbGVuID0gMTsKKwkJCQlkYXRhID0gJnRtcDsKKwkJCQlOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgJnBoYXNlLCAmbGVuLCAmZGF0YSk7CisJCQkJY21kLT5TQ3AuTWVzc2FnZSA9IHRtcDsKKworCQkJCXN3aXRjaCAodG1wKSB7CisJCQkJCS8qCisJCQkJCSAqIExpbmtpbmcgbGV0cyB1cyByZWR1Y2UgdGhlIHRpbWUgcmVxdWlyZWQgdG8gZ2V0IHRoZSAKKwkJCQkJICogbmV4dCBjb21tYW5kIG91dCB0byB0aGUgZGV2aWNlLCBob3BlZnVsbHkgdGhpcyB3aWxsCisJCQkJCSAqIG1lYW4gd2UgZG9uJ3Qgd2FzdGUgYW5vdGhlciByZXZvbHV0aW9uIGR1ZSB0byB0aGUgZGVsYXlzCisJCQkJCSAqIHJlcXVpcmVkIGJ5IEFSQklUUkFUSU9OIGFuZCBhbm90aGVyIFNFTEVDVElPTi4KKwkJCQkJICoKKwkJCQkJICogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gcHJvcG9zYWwsIGxvdyBsZXZlbCBkcml2ZXJzCisJCQkJCSAqIG1lcmVseSBoYXZlIHRvIHN0YXJ0IHRoZSBuZXh0IGNvbW1hbmQsIHBvaW50ZWQgdG8gYnkgCisJCQkJCSAqIG5leHRfbGluaywgZG9uZSgpIGlzIGNhbGxlZCBhcyB3aXRoIHVubGlua2VkIGNvbW1hbmRzLgorCQkJCQkgKi8KKyNpZmRlZiBMSU5LRUQKKwkJCQljYXNlIExJTktFRF9DTURfQ09NUExFVEU6CisJCQkJY2FzZSBMSU5LRURfRkxHX0NNRF9DT01QTEVURToKKwkJCQkJLyogQWNjZXB0IG1lc3NhZ2UgYnkgY2xlYXJpbmcgQUNLICovCisJCQkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCQkJCWRwcmludGsoTkRFQlVHX0xJTktFRCwgKCJzY3NpJWQgOiB0YXJnZXQgJWQgbHVuICVkIGxpbmtlZCBjb21tYW5kIGNvbXBsZXRlLlxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bikpOworCQkJCQkvKiAKKwkJCQkJICogU2FuaXR5IGNoZWNrIDogQSBsaW5rZWQgY29tbWFuZCBzaG91bGQgb25seSB0ZXJtaW5hdGUgd2l0aAorCQkJCQkgKiBvbmUgb2YgdGhlc2UgbWVzc2FnZXMgaWYgdGhlcmUgYXJlIG1vcmUgbGlua2VkIGNvbW1hbmRzCisJCQkJCSAqIGF2YWlsYWJsZS4KKwkJCQkJICovCisJCQkJCWlmICghY21kLT5uZXh0X2xpbmspIHsKKwkJCQkJCXByaW50aygic2NzaSVkIDogdGFyZ2V0ICVkIGx1biAlZCBsaW5rZWQgY29tbWFuZCBjb21wbGV0ZSwgbm8gbmV4dF9saW5rXG4iIGluc3RhbmNlLT5ob3N0X25vLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCQkJCQkJc2luayA9IDE7CisJCQkJCQlkb19hYm9ydChpbnN0YW5jZSk7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJaW5pdGlhbGl6ZV9TQ3AoY21kLT5uZXh0X2xpbmspOworCQkJCQkvKiBUaGUgbmV4dCBjb21tYW5kIGlzIHN0aWxsIHBhcnQgb2YgdGhpcyBwcm9jZXNzICovCisJCQkJCWNtZC0+bmV4dF9saW5rLT50YWcgPSBjbWQtPnRhZzsKKwkJCQkJY21kLT5yZXN1bHQgPSBjbWQtPlNDcC5TdGF0dXMgfCAoY21kLT5TQ3AuTWVzc2FnZSA8PCA4KTsKKwkJCQkJZHByaW50ayhOREVCVUdfTElOS0VELCAoInNjc2klZCA6IHRhcmdldCAlZCBsdW4gJWQgbGlua2VkIHJlcXVlc3QgZG9uZSwgY2FsbGluZyBzY3NpX2RvbmUoKS5cbiIsIGluc3RhbmNlLT5ob3N0X25vLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pKTsKKwkJCQkJY29sbGVjdF9zdGF0cyhob3N0ZGF0YSwgY21kKTsKKwkJCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJCQkJY21kID0gaG9zdGRhdGEtPmNvbm5lY3RlZDsKKwkJCQkJYnJlYWs7CisjZW5kaWYJCQkJLyogZGVmIExJTktFRCAqLworCQkJCWNhc2UgQUJPUlQ6CisJCQkJY2FzZSBDT01NQU5EX0NPTVBMRVRFOgorCQkJCQkvKiBBY2NlcHQgbWVzc2FnZSBieSBjbGVhcmluZyBBQ0sgKi8KKwkJCQkJc2luayA9IDE7CisJCQkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCQkJCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQkJCQlkcHJpbnRrKE5ERUJVR19RVUVVRVMsICgic2NzaSVkIDogY29tbWFuZCBmb3IgdGFyZ2V0ICVkLCBsdW4gJWQgY29tcGxldGVkXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKSk7CisJCQkJCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCisJCQkJCS8qIAorCQkJCQkgKiBJJ20gbm90IHN1cmUgd2hhdCB0aGUgY29ycmVjdCB0aGluZyB0byBkbyBoZXJlIGlzIDogCisJCQkJCSAqIAorCQkJCQkgKiBJZiB0aGUgY29tbWFuZCB0aGF0IGp1c3QgZXhlY3V0ZWQgaXMgTk9UIGEgcmVxdWVzdCAKKwkJCQkJICogc2Vuc2UsIHRoZSBvYnZpb3VzIHRoaW5nIHRvIGRvIGlzIHRvIHNldCB0aGUgcmVzdWx0CisJCQkJCSAqIGNvZGUgdG8gdGhlIHZhbHVlcyBvZiB0aGUgc3RvcmVkIHBhcmFtZXRlcnMuCisJCQkJCSAqIAorCQkJCQkgKiBJZiBpdCB3YXMgYSBSRVFVRVNUIFNFTlNFIGNvbW1hbmQsIHdlIG5lZWQgc29tZSB3YXkgCisJCQkJCSAqIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgZmFpbHVyZSBjb2RlIG9mIHRoZSBvcmlnaW5hbAorCQkJCQkgKiBhbmQgdGhlIGZhaWx1cmUgY29kZSBvZiB0aGUgUkVRVUVTVCBzZW5zZSAtIHRoZSBvYnZpb3VzCisJCQkJCSAqIGNhc2UgaXMgc3VjY2Vzcywgd2hlcmUgd2UgZmFsbCB0aHJvdWdoIGFuZCBsZWF2ZSB0aGUgcmVzdWx0CisJCQkJCSAqIGNvZGUgdW5jaGFuZ2VkLgorCQkJCQkgKiAKKwkJCQkJICogVGhlIG5vbi1vYnZpb3VzIHBsYWNlIGlzIHdoZXJlIHRoZSBSRVFVRVNUIFNFTlNFIGZhaWxlZCAKKwkJCQkJICovCisKKwkJCQkJaWYgKGNtZC0+Y21uZFswXSAhPSBSRVFVRVNUX1NFTlNFKQorCQkJCQkJY21kLT5yZXN1bHQgPSBjbWQtPlNDcC5TdGF0dXMgfCAoY21kLT5TQ3AuTWVzc2FnZSA8PCA4KTsKKwkJCQkJZWxzZSBpZiAoc3RhdHVzX2J5dGUoY21kLT5TQ3AuU3RhdHVzKSAhPSBHT09EKQorCQkJCQkJY21kLT5yZXN1bHQgPSAoY21kLT5yZXN1bHQgJiAweDAwZmZmZikgfCAoRElEX0VSUk9SIDw8IDE2KTsKKworI2lmZGVmIEFVVE9TRU5TRQorCQkJCQlpZiAoKGNtZC0+Y21uZFswXSAhPSBSRVFVRVNUX1NFTlNFKSAmJiAoc3RhdHVzX2J5dGUoY21kLT5TQ3AuU3RhdHVzKSA9PSBDSEVDS19DT05ESVRJT04pKSB7CisJCQkJCQlkcHJpbnRrKE5ERUJVR19BVVRPU0VOU0UsICgic2NzaSVkIDogcGVyZm9ybWluZyByZXF1ZXN0IHNlbnNlXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCQkJCQkJY21kLT5jbW5kWzBdID0gUkVRVUVTVF9TRU5TRTsKKwkJCQkJCWNtZC0+Y21uZFsxXSAmPSAweGUwOworCQkJCQkJY21kLT5jbW5kWzJdID0gMDsKKwkJCQkJCWNtZC0+Y21uZFszXSA9IDA7CisJCQkJCQljbWQtPmNtbmRbNF0gPSBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpOworCQkJCQkJY21kLT5jbW5kWzVdID0gMDsKKworCQkJCQkJY21kLT5TQ3AuYnVmZmVyID0gTlVMTDsKKwkJCQkJCWNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSAwOworCQkJCQkJY21kLT5TQ3AucHRyID0gKGNoYXIgKikgY21kLT5zZW5zZV9idWZmZXI7CisJCQkJCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKTsKKworCQkJCQkJTElTVChjbWQsIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSk7CisJCQkJCQljbWQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKQorCQkJCQkJICAgIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsKKwkJCQkJCWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IChTY3NpX0NtbmQgKikgY21kOworCQkJCQkJZHByaW50ayhOREVCVUdfUVVFVUVTLCAoInNjc2klZCA6IFJFUVVFU1QgU0VOU0UgYWRkZWQgdG8gaGVhZCBvZiBpc3N1ZSBxdWV1ZVxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pKTsKKwkJCQkJfSBlbHNlCisjZW5kaWYJCQkJLyogZGVmIEFVVE9TRU5TRSAqLworCQkJCQl7CisJCQkJCQljb2xsZWN0X3N0YXRzKGhvc3RkYXRhLCBjbWQpOworCQkJCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJCQkJfQorCisJCQkJCU5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkJCQkJLyogCisJCQkJCSAqIFJlc3RvcmUgcGhhc2UgYml0cyB0byAwIHNvIGFuIGludGVycnVwdGVkIHNlbGVjdGlvbiwgCisJCQkJCSAqIGFyYml0cmF0aW9uIGNhbiByZXN1bWUuCisJCQkJCSAqLworCQkJCQlOQ1I1MzgwX3dyaXRlKFRBUkdFVF9DT01NQU5EX1JFRywgMCk7CisKKwkJCQkJd2hpbGUgKChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9CU1kpICYmICFob3N0ZGF0YS0+Y29ubmVjdGVkKQorCQkJCQkJYmFycmllcigpOworCQkJCQlyZXR1cm47CisJCQkJY2FzZSBNRVNTQUdFX1JFSkVDVDoKKwkJCQkJLyogQWNjZXB0IG1lc3NhZ2UgYnkgY2xlYXJpbmcgQUNLICovCisJCQkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCQkJCXN3aXRjaCAoaG9zdGRhdGEtPmxhc3RfbWVzc2FnZSkgeworCQkJCQljYXNlIEhFQURfT0ZfUVVFVUVfVEFHOgorCQkJCQljYXNlIE9SREVSRURfUVVFVUVfVEFHOgorCQkJCQljYXNlIFNJTVBMRV9RVUVVRV9UQUc6CisJCQkJCQljbWQtPmRldmljZS0+c2ltcGxlX3RhZ3MgPSAwOworCQkJCQkJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSB8PSAoMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQljYXNlIERJU0NPTk5FQ1Q6eworCQkJCQkJLyogQWNjZXB0IG1lc3NhZ2UgYnkgY2xlYXJpbmcgQUNLICovCisJCQkJCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCQkJCQkJY21kLT5kZXZpY2UtPmRpc2Nvbm5lY3QgPSAxOworCQkJCQkJTElTVChjbWQsIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUpOworCQkJCQkJY21kLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikKKwkJCQkJCSAgICBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOworCQkJCQkJaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisJCQkJCQlob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlID0gY21kOworCQkJCQkJZHByaW50ayhOREVCVUdfUVVFVUVTLCAoInNjc2klZCA6IGNvbW1hbmQgZm9yIHRhcmdldCAlZCBsdW4gJWQgd2FzIG1vdmVkIGZyb20gY29ubmVjdGVkIHRvIiAiICB0aGUgZGlzY29ubmVjdGVkX3F1ZXVlXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKSk7CisJCQkJCQkvKiAKKwkJCQkJCSAqIFJlc3RvcmUgcGhhc2UgYml0cyB0byAwIHNvIGFuIGludGVycnVwdGVkIHNlbGVjdGlvbiwgCisJCQkJCQkgKiBhcmJpdHJhdGlvbiBjYW4gcmVzdW1lLgorCQkJCQkJICovCisJCQkJCQlOQ1I1MzgwX3dyaXRlKFRBUkdFVF9DT01NQU5EX1JFRywgMCk7CisKKwkJCQkJCS8qIEVuYWJsZSByZXNlbGVjdCBpbnRlcnJ1cHRzICovCisJCQkJCQlOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJCQkJCQkvKiBXYWl0IGZvciBidXMgZnJlZSB0byBhdm9pZCBuYXN0eSB0aW1lb3V0cyAtIEZJWE1FIHRpbWVvdXQgISovCisJCQkJCQkvKiBOQ1I1MzhfcG9sbF9wb2xpdGVseShpbnN0YW5jZSwgU1RBVFVTX1JFRywgU1JfQlNZLCAwLCAzMCAqIEhaKTsgKi8KKwkJCQkJCXdoaWxlICgoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfQlNZKSAmJiAhaG9zdGRhdGEtPmNvbm5lY3RlZCkKKwkJCQkJCQliYXJyaWVyKCk7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJLyogCisJCQkJCSAqIFRoZSBTQ1NJIGRhdGEgcG9pbnRlciBpcyAqSU1QTElDSVRMWSogc2F2ZWQgb24gYSBkaXNjb25uZWN0CisJCQkJCSAqIG9wZXJhdGlvbiwgaW4gdmlvbGF0aW9uIG9mIHRoZSBTQ1NJIHNwZWMgc28gd2UgY2FuIHNhZmVseSAKKwkJCQkJICogaWdub3JlIFNBVkUvUkVTVE9SRSBwb2ludGVycyBjYWxscy4KKwkJCQkJICoKKwkJCQkJICogVW5mb3J0dW5hdGVseSwgc29tZSBkaXNrcyB2aW9sYXRlIHRoZSBTQ1NJIHNwZWMgYW5kIAorCQkJCQkgKiBkb24ndCBpc3N1ZSB0aGUgcmVxdWlyZWQgU0FWRV9QT0lOVEVSUyBtZXNzYWdlIGJlZm9yZQorCQkJCQkgKiBkaXNjb25uZWN0aW5nLCBhbmQgd2UgaGF2ZSB0byBicmVhayBzcGVjIHRvIHJlbWFpbiAKKwkJCQkJICogY29tcGF0aWJsZS4KKwkJCQkJICovCisJCQkJY2FzZSBTQVZFX1BPSU5URVJTOgorCQkJCWNhc2UgUkVTVE9SRV9QT0lOVEVSUzoKKwkJCQkJLyogQWNjZXB0IG1lc3NhZ2UgYnkgY2xlYXJpbmcgQUNLICovCisJCQkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRVhURU5ERURfTUVTU0FHRToKKy8qIAorICogRXh0ZW5kZWQgbWVzc2FnZXMgYXJlIHNlbnQgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQgOgorICogQnl0ZSAgICAgICAgIAorICogMCAgICAgICAgICAgIEVYVEVOREVEX01FU1NBR0UgPT0gMQorICogMSAgICAgICAgICAgIGxlbmd0aCAoaW5jbHVkZXMgb25lIGJ5dGUgZm9yIGNvZGUsIGRvZXNuJ3QgCisgKiAgICAgICAgICAgICAgaW5jbHVkZSBmaXJzdCB0d28gYnl0ZXMpCisgKiAyICAgICAgICAgICAgY29kZQorICogMy4ubGVuZ3RoKzEgIGFyZ3VtZW50cworICoKKyAqIFN0YXJ0IHRoZSBleHRlbmRlZCBtZXNzYWdlIGJ1ZmZlciB3aXRoIHRoZSBFWFRFTkRFRF9NRVNTQUdFCisgKiBieXRlLCBzaW5jZSBwcmludF9tc2coKSB3YW50cyB0aGUgd2hvbGUgdGhpbmcuICAKKyAqLworCQkJCQlleHRlbmRlZF9tc2dbMF0gPSBFWFRFTkRFRF9NRVNTQUdFOworCQkJCQkvKiBBY2NlcHQgZmlyc3QgYnl0ZSBieSBjbGVhcmluZyBBQ0sgKi8KKwkJCQkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJCQkJZHByaW50ayhOREVCVUdfRVhURU5ERUQsICgic2NzaSVkIDogcmVjZWl2aW5nIGV4dGVuZGVkIG1lc3NhZ2VcbiIsIGluc3RhbmNlLT5ob3N0X25vKSk7CisKKwkJCQkJbGVuID0gMjsKKwkJCQkJZGF0YSA9IGV4dGVuZGVkX21zZyArIDE7CisJCQkJCXBoYXNlID0gUEhBU0VfTVNHSU47CisJCQkJCU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKTsKKworCQkJCQlkcHJpbnRrKE5ERUJVR19FWFRFTkRFRCwgKCJzY3NpJWQgOiBsZW5ndGg9JWQsIGNvZGU9MHglMDJ4XG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgKGludCkgZXh0ZW5kZWRfbXNnWzFdLCAoaW50KSBleHRlbmRlZF9tc2dbMl0pKTsKKworCQkJCQlpZiAoIWxlbiAmJiBleHRlbmRlZF9tc2dbMV0gPD0gKHNpemVvZihleHRlbmRlZF9tc2cpIC0gMSkpIHsKKwkJCQkJCS8qIEFjY2VwdCB0aGlyZCBieXRlIGJ5IGNsZWFyaW5nIEFDSyAqLworCQkJCQkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJCQkJCWxlbiA9IGV4dGVuZGVkX21zZ1sxXSAtIDE7CisJCQkJCQlkYXRhID0gZXh0ZW5kZWRfbXNnICsgMzsKKwkJCQkJCXBoYXNlID0gUEhBU0VfTVNHSU47CisKKwkJCQkJCU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKTsKKwkJCQkJCWRwcmludGsoTkRFQlVHX0VYVEVOREVELCAoInNjc2klZCA6IG1lc3NhZ2UgcmVjZWl2ZWQsIHJlc2lkdWFsICVkXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgbGVuKSk7CisKKwkJCQkJCXN3aXRjaCAoZXh0ZW5kZWRfbXNnWzJdKSB7CisJCQkJCQljYXNlIEVYVEVOREVEX1NEVFI6CisJCQkJCQljYXNlIEVYVEVOREVEX1dEVFI6CisJCQkJCQljYXNlIEVYVEVOREVEX01PRElGWV9EQVRBX1BPSU5URVI6CisJCQkJCQljYXNlIEVYVEVOREVEX0VYVEVOREVEX0lERU5USUZZOgorCQkJCQkJCXRtcCA9IDA7CisJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAobGVuKSB7CisJCQkJCQlwcmludGsoInNjc2klZDogZXJyb3IgcmVjZWl2aW5nIGV4dGVuZGVkIG1lc3NhZ2VcbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwkJCQkJCXRtcCA9IDA7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludGsoInNjc2klZDogZXh0ZW5kZWQgbWVzc2FnZSBjb2RlICUwMnggbGVuZ3RoICVkIGlzIHRvbyBsb25nXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgZXh0ZW5kZWRfbXNnWzJdLCBleHRlbmRlZF9tc2dbMV0pOworCQkJCQkJdG1wID0gMDsKKwkJCQkJfQorCQkJCQkvKiBGYWxsIHRocm91Z2ggdG8gcmVqZWN0IG1lc3NhZ2UgKi8KKworCQkJCQkvKiAKKwkJCQkJICogSWYgd2UgZ2V0IHNvbWV0aGluZyB3ZWlyZCB0aGF0IHdlIGFyZW4ndCBleHBlY3RpbmcsIAorCQkJCQkgKiByZWplY3QgaXQuCisJCQkJCSAqLworCQkJCWRlZmF1bHQ6CisJCQkJCWlmICghdG1wKSB7CisJCQkJCQlwcmludGsoInNjc2klZDogcmVqZWN0aW5nIG1lc3NhZ2UgIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCQkJCQkJcHJpbnRfbXNnKGV4dGVuZGVkX21zZyk7CisJCQkJCQlwcmludGsoIlxuIik7CisJCQkJCX0gZWxzZSBpZiAodG1wICE9IEVYVEVOREVEX01FU1NBR0UpCisJCQkJCQlwcmludGsoInNjc2klZDogcmVqZWN0aW5nIHVua25vd24gbWVzc2FnZSAlMDJ4IGZyb20gdGFyZ2V0ICVkLCBsdW4gJWRcbiIsIGluc3RhbmNlLT5ob3N0X25vLCB0bXAsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisJCQkJCWVsc2UKKwkJCQkJCXByaW50aygic2NzaSVkOiByZWplY3RpbmcgdW5rbm93biBleHRlbmRlZCBtZXNzYWdlIGNvZGUgJTAyeCwgbGVuZ3RoICVkIGZyb20gdGFyZ2V0ICVkLCBsdW4gJWRcbiIsIGluc3RhbmNlLT5ob3N0X25vLCBleHRlbmRlZF9tc2dbMV0sIGV4dGVuZGVkX21zZ1swXSwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKworCQkJCQltc2dvdXQgPSBNRVNTQUdFX1JFSkVDVDsKKwkJCQkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9BVE4pOworCQkJCQlicmVhazsKKwkJCQl9CS8qIHN3aXRjaCAodG1wKSAqLworCQkJCWJyZWFrOworCQkJY2FzZSBQSEFTRV9NU0dPVVQ6CisJCQkJbGVuID0gMTsKKwkJCQlkYXRhID0gJm1zZ291dDsKKwkJCQlob3N0ZGF0YS0+bGFzdF9tZXNzYWdlID0gbXNnb3V0OworCQkJCU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKTsKKwkJCQlpZiAobXNnb3V0ID09IEFCT1JUKSB7CisJCQkJCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCQkJCQlob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKwkJCQkJY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCQkJCWNvbGxlY3Rfc3RhdHMoaG9zdGRhdGEsIGNtZCk7CisJCQkJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCQkJCU5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQltc2dvdXQgPSBOT1A7CisJCQkJYnJlYWs7CisJCQljYXNlIFBIQVNFX0NNRE9VVDoKKwkJCQlsZW4gPSBjbWQtPmNtZF9sZW47CisJCQkJZGF0YSA9IGNtZC0+Y21uZDsKKwkJCQkvKiAKKwkJCQkgKiBYWFggZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIG9uIG1hY2hpbmVzIHdpdGggYSAKKwkJCQkgKiBQU0VVRE8tRE1BIGFyY2hpdGVjdHVyZSB3ZSBzaG91bGQgcHJvYmFibHkgCisJCQkJICogdXNlIHRoZSBkbWEgdHJhbnNmZXIgZnVuY3Rpb24uICAKKwkJCQkgKi8KKwkJCQlOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgJnBoYXNlLCAmbGVuLCAmZGF0YSk7CisJCQkJaWYgKCFjbWQtPmRldmljZS0+ZGlzY29ubmVjdCAmJiBzaG91bGRfZGlzY29ubmVjdChjbWQtPmNtbmRbMF0pKSB7CisJCQkJCU5DUjUzODBfc2V0X3RpbWVyKGhvc3RkYXRhLCBVU0xFRVBfU0xFRVApOworCQkJCQlkcHJpbnRrKE5ERUJVR19VU0xFRVAsICgic2NzaSVkIDogaXNzdWVkIGNvbW1hbmQsIHNsZWVwaW5nIHVudGlsICV1bFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIGhvc3RkYXRhLT50aW1lX2V4cGlyZXMpKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUEhBU0VfU1RBVElOOgorCQkJCWxlbiA9IDE7CisJCQkJZGF0YSA9ICZ0bXA7CisJCQkJTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgJmxlbiwgJmRhdGEpOworCQkJCWNtZC0+U0NwLlN0YXR1cyA9IHRtcDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKCJzY3NpJWQgOiB1bmtub3duIHBoYXNlXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJCQkJTkNSNTM4MF9kcHJpbnQoTkRFQlVHX0FMTCwgaW5zdGFuY2UpOworCQkJfQkvKiBzd2l0Y2gocGhhc2UpICovCisJCX0JCS8qIGlmICh0bXAgKiBTUl9SRVEpICovCisJCWVsc2UgeworCQkJLyogUnZDOiBnbyB0byBzbGVlcCBpZiBwb2xsaW5nIHRpbWUgZXhwaXJlZAorCQkJICovCisJCQlpZiAoIWNtZC0+ZGV2aWNlLT5kaXNjb25uZWN0ICYmIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcG9sbF90aW1lKSkgeworCQkJCU5DUjUzODBfc2V0X3RpbWVyKGhvc3RkYXRhLCBVU0xFRVBfU0xFRVApOworCQkJCWRwcmludGsoTkRFQlVHX1VTTEVFUCwgKCJzY3NpJWQgOiBwb2xsIHRpbWVkIG91dCwgc2xlZXBpbmcgdW50aWwgJXVsXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgaG9zdGRhdGEtPnRpbWVfZXhwaXJlcykpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0JCQkvKiB3aGlsZSAoMSkgKi8KK30KKworLyoKKyAqIEZ1bmN0aW9uIDogdm9pZCBOQ1I1MzgwX3Jlc2VsZWN0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKKyAqCisgKiBQdXJwb3NlIDogZG9lcyByZXNlbGVjdGlvbiwgaW5pdGlhbGl6aW5nIHRoZSBpbnN0YW5jZS0+Y29ubmVjdGVkIAorICogICAgICBmaWVsZCB0byBwb2ludCB0byB0aGUgU2NzaV9DbW5kIGZvciB3aGljaCB0aGUgSV9UX0wgb3IgSV9UX0xfUSAKKyAqICAgICAgbmV4dXMgaGFzIGJlZW4gcmVlc3RhYmxpc2hlZCwKKyAqICAgICAgCisgKiBJbnB1dHMgOiBpbnN0YW5jZSAtIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIE5DUjUzODAuCisgKgorICogTG9ja3M6IGlvX3JlcXVlc3RfbG9jayBoZWxkIGJ5IGNhbGxlciBpZiBJUlEgZHJpdmVuCisgKi8KKworc3RhdGljIHZvaWQgTkNSNTM4MF9yZXNlbGVjdChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkgeworCU5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworCXN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKQorCSBpbnN0YW5jZS0+aG9zdGRhdGE7CisJdW5zaWduZWQgY2hhciB0YXJnZXRfbWFzazsKKwl1bnNpZ25lZCBjaGFyIGx1biwgcGhhc2U7CisJaW50IGxlbjsKKwl1bnNpZ25lZCBjaGFyIG1zZ1szXTsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCVNjc2lfQ21uZCAqdG1wID0gTlVMTCwgKnByZXY7CisJaW50IGFib3J0ID0gMDsKKwlOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKKworCS8qCisJICogRGlzYWJsZSBhcmJpdHJhdGlvbiwgZXRjLiBzaW5jZSB0aGUgaG9zdCBhZGFwdGVyIG9idmlvdXNseQorCSAqIGxvc3QsIGFuZCB0ZWxsIGFuIGludGVycnVwdGVkIE5DUjUzODBfc2VsZWN0KCkgdG8gcmVzdGFydC4KKwkgKi8KKworCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworCWhvc3RkYXRhLT5yZXN0YXJ0X3NlbGVjdCA9IDE7CisKKwl0YXJnZXRfbWFzayA9IE5DUjUzODBfcmVhZChDVVJSRU5UX1NDU0lfREFUQV9SRUcpICYgfihob3N0ZGF0YS0+aWRfbWFzayk7CisJZHByaW50ayhOREVCVUdfU0VMRUNUSU9OLCAoInNjc2klZCA6IHJlc2VsZWN0XG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCisJLyogCisJICogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBkZXRlY3RlZCB0aGF0IG91ciBTQ1NJIElEIGlzIG9uIHRoZSBidXMsCisJICogU0VMIGlzIHRydWUgYW5kIEJTWSB3YXMgZmFsc2UgZm9yIGF0IGxlYXN0IG9uZSBidXMgc2V0dGxlIGRlbGF5CisJICogKDQwMCBucykuCisJICoKKwkgKiBXZSBtdXN0IGFzc2VydCBCU1kgb3Vyc2VsdmVzLCB1bnRpbCB0aGUgdGFyZ2V0IGRyb3BzIHRoZSBTRUwKKwkgKiBzaWduYWwuCisJICovCisKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0JTWSk7CisKKwkvKiBGSVhNRTogdGltZW91dCB0b28gbG9uZywgbXVzdCBmYWlsIHRvIHdvcmtxdWV1ZSAqLwkKKwlpZihOQ1I1MzgwX3BvbGxfcG9saXRlbHkoaW5zdGFuY2UsIFNUQVRVU19SRUcsIFNSX1NFTCwgMCwgMipIWik8MCkKKwkJYWJvcnQgPSAxOworCQkKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCisJLyoKKwkgKiBXYWl0IGZvciB0YXJnZXQgdG8gZ28gaW50byBNU0dJTi4KKwkgKiBGSVhNRTogdGltZW91dCBuZWVkZWQgYW5kIGZhaWwgdG8gd29yayBxdWVldQorCSAqLworCisJaWYoTkNSNTM4MF9wb2xsX3BvbGl0ZWx5KGluc3RhbmNlLCBTVEFUVVNfUkVHLCBTUl9SRVEsIFNSX1JFUSwgMipIWikpCisJCWFib3J0ID0gMTsKKworCWxlbiA9IDE7CisJZGF0YSA9IG1zZzsKKwlwaGFzZSA9IFBIQVNFX01TR0lOOworCU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKTsKKworCWlmICghKG1zZ1swXSAmIDB4ODApKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkIDogZXhwZWN0aW5nIElERU5USUZZIG1lc3NhZ2UsIGdvdCAiLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJCXByaW50X21zZyhtc2cpOworCQlhYm9ydCA9IDE7CisJfSBlbHNlIHsKKwkJLyogQWNjZXB0IG1lc3NhZ2UgYnkgY2xlYXJpbmcgQUNLICovCisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCWx1biA9IChtc2dbMF0gJiAweDA3KTsKKworCQkvKiAKKwkJICogV2UgbmVlZCB0byBhZGQgY29kZSBmb3IgU0NTSS1JSSB0byB0cmFjayB3aGljaCBkZXZpY2VzIGhhdmUKKwkJICogSV9UX0xfUSBuZXh1c2VzIGVzdGFibGlzaGVkLCBhbmQgd2hpY2ggaGF2ZSBzaW1wbGUgSV9UX0wKKwkJICogbmV4dXNlcyBzbyB3ZSBjYW4gY2hvc2UgdG8gZG8gYWRkaXRpb25hbCBkYXRhIHRyYW5zZmVyLgorCQkgKi8KKworCQkvKiAKKwkJICogRmluZCB0aGUgY29tbWFuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBJX1RfTCBvciBJX1RfTF9RICBuZXh1cyB3ZSAKKwkJICoganVzdCByZWVzdGFibGlzaGVkLCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGRpc2Nvbm5lY3RlZCBxdWV1ZS4KKwkJICovCisKKworCQlmb3IgKHRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSwgcHJldiA9IE5VTEw7IHRtcDsgcHJldiA9IHRtcCwgdG1wID0gKFNjc2lfQ21uZCAqKSB0bXAtPmhvc3Rfc2NyaWJibGUpCisJCQlpZiAoKHRhcmdldF9tYXNrID09ICgxIDw8IHRtcC0+ZGV2aWNlLT5pZCkpICYmIChsdW4gPT0gdG1wLT5kZXZpY2UtPmx1bikKKwkJCSAgICApIHsKKwkJCQlpZiAocHJldikgeworCQkJCQlSRU1PVkUocHJldiwgcHJldi0+aG9zdF9zY3JpYmJsZSwgdG1wLCB0bXAtPmhvc3Rfc2NyaWJibGUpOworCQkJCQlwcmV2LT5ob3N0X3NjcmliYmxlID0gdG1wLT5ob3N0X3NjcmliYmxlOworCQkJCX0gZWxzZSB7CisJCQkJCVJFTU9WRSgtMSwgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSwgdG1wLCB0bXAtPmhvc3Rfc2NyaWJibGUpOworCQkJCQlob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlID0gKFNjc2lfQ21uZCAqKSB0bXAtPmhvc3Rfc2NyaWJibGU7CisJCQkJfQorCQkJCXRtcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJCQkJYnJlYWs7CisJCQl9CisJCWlmICghdG1wKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNjc2klZCA6IHdhcm5pbmcgOiB0YXJnZXQgYml0bWFzayAlMDJ4IGx1biAlZCBub3QgaW4gZGlzY29ubmVjdF9xdWV1ZS5cbiIsIGluc3RhbmNlLT5ob3N0X25vLCB0YXJnZXRfbWFzaywgbHVuKTsKKwkJCS8qIAorCQkJICogU2luY2Ugd2UgaGF2ZSBhbiBlc3RhYmxpc2hlZCBuZXh1cyB0aGF0IHdlIGNhbid0IGRvIGFueXRoaW5nIHdpdGgsCisJCQkgKiB3ZSBtdXN0IGFib3J0IGl0LiAgCisJCQkgKi8KKwkJCWFib3J0ID0gMTsKKwkJfQorCX0KKworCWlmIChhYm9ydCkgeworCQlkb19hYm9ydChpbnN0YW5jZSk7CisJfSBlbHNlIHsKKwkJaG9zdGRhdGEtPmNvbm5lY3RlZCA9IHRtcDsKKwkJZHByaW50ayhOREVCVUdfUkVTRUxFQ1RJT04sICgic2NzaSVkIDogbmV4dXMgZXN0YWJsaXNoZWQsIHRhcmdldCA9ICVkLCBsdW4gPSAlZCwgdGFnID0gJWRcbiIsIGluc3RhbmNlLT5ob3N0X25vLCB0bXAtPnRhcmdldCwgdG1wLT5sdW4sIHRtcC0+dGFnKSk7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gOiB2b2lkIE5DUjUzODBfZG1hX2NvbXBsZXRlIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKKyAqCisgKiBQdXJwb3NlIDogY2FsbGVkIGJ5IGludGVycnVwdCBoYW5kbGVyIHdoZW4gRE1BIGZpbmlzaGVzIG9yIGEgcGhhc2UKKyAqICAgICAgbWlzbWF0Y2ggb2NjdXJzICh3aGljaCB3b3VsZCBmaW5pc2ggdGhlIERNQSB0cmFuc2ZlcikuICAKKyAqCisgKiBJbnB1dHMgOiBpbnN0YW5jZSAtIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIE5DUjUzODAuCisgKgorICogUmV0dXJucyA6IHBvaW50ZXIgdG8gdGhlIFNjc2lfQ21uZCBzdHJ1Y3R1cmUgZm9yIHdoaWNoIHRoZSBJX1RfTAorICogICAgICBuZXh1cyBoYXMgYmVlbiByZWVzdGFibGlzaGVkLCBvbiBmYWlsdXJlIE5VTEwgaXMgcmV0dXJuZWQuCisgKi8KKworI2lmZGVmIFJFQUxfRE1BCitzdGF0aWMgdm9pZCBOQ1I1MzgwX2RtYV9jb21wbGV0ZShOQ1I1MzgwX2luc3RhbmNlICogaW5zdGFuY2UpIHsKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwlzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKiBpbnN0YW5jZS0+aG9zdGRhdGEpOworCWludCB0cmFuc2ZlcnJlZDsKKwlOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKKworCS8qCisJICogWFhYIHRoaXMgbWlnaHQgbm90IGJlIHJpZ2h0LgorCSAqCisJICogV2FpdCBmb3IgZmluYWwgYnl0ZSB0byB0cmFuc2ZlciwgaWUgd2FpdCBmb3IgQUNLIHRvIGdvIGZhbHNlLgorCSAqCisJICogV2Ugc2hvdWxkIHVzZSB0aGUgTGFzdCBCeXRlIFNlbnQgYml0LCB1bmZvcnR1bmF0ZWx5IHRoaXMgaXMgCisJICogbm90IGF2YWlsYWJsZSBvbiB0aGUgNTM4MC81MzgxIChvbmx5IHRoZSB2YXJpb3VzIENNT1MgY2hpcHMpCisJICoKKwkgKiBGSVhNRTogdGltZW91dCwgYW5kIG5lZWQgdG8gaGFuZGxlIGxvbmcgdGltZW91dC9pcnEgY2FzZQorCSAqLworCisJTkNSNTM4MF9wb2xsX3BvbGl0ZWx5KGluc3RhbmNlLCBCVVNfQU5EX1NUQVRVU19SRUcsIEJBU1JfQUNLLCAwLCA1KkhaKTsKKworCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisKKwkvKgorCSAqIFRoZSBvbmx5IHBsYWNlcyB3ZSBzaG91bGQgc2VlIGEgcGhhc2UgbWlzbWF0Y2ggYW5kIGhhdmUgdG8gc2VuZAorCSAqIGRhdGEgZnJvbSB0aGUgc2FtZSBzZXQgb2YgcG9pbnRlcnMgd2lsbCBiZSB0aGUgZGF0YSB0cmFuc2ZlcgorCSAqIHBoYXNlcy4gIFNvLCByZXNpZHVhbCwgcmVxdWVzdGVkIGxlbmd0aCBhcmUgb25seSBpbXBvcnRhbnQgaGVyZS4KKwkgKi8KKworCWlmICghKGhvc3RkYXRhLT5jb25uZWN0ZWQtPlNDcC5waGFzZSAmIFNSX0NEKSkgeworCQl0cmFuc2ZlcnJlZCA9IGluc3RhbmNlLT5kbWFsZW4gLSBOQ1I1MzgwX2RtYV9yZXNpZHVhbCgpOworCQlob3N0ZGF0YS0+Y29ubmVjdGVkLT5TQ3AudGhpc19yZXNpZHVhbCAtPSB0cmFuc2ZlcnJlZDsKKwkJaG9zdGRhdGEtPmNvbm5lY3RlZC0+U0NwLnB0ciArPSB0cmFuc2ZlcnJlZDsKKwl9Cit9CisjZW5kaWYJCQkJLyogZGVmIFJFQUxfRE1BICovCisKKy8qCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX2Fib3J0IChTY3NpX0NtbmQgKmNtZCkKKyAqCisgKiBQdXJwb3NlIDogYWJvcnQgYSBjb21tYW5kCisgKgorICogSW5wdXRzIDogY21kIC0gdGhlIFNjc2lfQ21uZCB0byBhYm9ydCwgY29kZSAtIGNvZGUgdG8gc2V0IHRoZSAKKyAqICAgICAgaG9zdCBieXRlIG9mIHRoZSByZXN1bHQgZmllbGQgdG8sIGlmIHplcm8gRElEX0FCT1JURUQgaXMgCisgKiAgICAgIHVzZWQuCisgKgorICogUmV0dXJucyA6IDAgLSBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorICoKKyAqCVhYWCAtIHRoZXJlIGlzIG5vIHdheSB0byBhYm9ydCB0aGUgY29tbWFuZCB0aGF0IGlzIGN1cnJlbnRseSAKKyAqCWNvbm5lY3RlZCwgeW91IGhhdmUgdG8gd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuICBJZiB0aGlzIGlzIAorICoJYSBwcm9ibGVtLCB3ZSBjb3VsZCBpbXBsZW1lbnQgbG9uZ2ptcCgpIC8gc2V0am1wKCksIHNldGptcCgpCisgKgljYWxsZWQgd2hlcmUgdGhlIGxvb3Agc3RhcnRlZCBpbiBOQ1I1MzgwX21haW4oKS4KKyAqCisgKiBMb2NrczogaG9zdCBsb2NrIHRha2VuIGJ5IGNhbGxlcgorICovCisKK3N0YXRpYyBpbnQgTkNSNTM4MF9hYm9ydChTY3NpX0NtbmQgKiBjbWQpIHsKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCXN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisJU2NzaV9DbW5kICp0bXAsICoqcHJldjsKKwkKKwlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQgOiBhYm9ydGluZyBjb21tYW5kXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJcHJpbnRfU2NzaV9DbW5kKGNtZCk7CisKKwlOQ1I1MzgwX3ByaW50X3N0YXR1cyhpbnN0YW5jZSk7CisKKwlOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKKworCWRwcmludGsoTkRFQlVHX0FCT1JULCAoInNjc2klZCA6IGFib3J0IGNhbGxlZFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pKTsKKwlkcHJpbnRrKE5ERUJVR19BQk9SVCwgKCIgICAgICAgIGJhc3IgMHglWCwgc3IgMHglWFxuIiwgTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRyksIE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSkpOworCisjaWYgMAorLyoKKyAqIENhc2UgMSA6IElmIHRoZSBjb21tYW5kIGlzIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbW1hbmQsIAorICogd2UnbGwgc2V0IHRoZSBhYm9ydGVkIGZsYWcgYW5kIHJldHVybiBjb250cm9sIHNvIHRoYXQgCisgKiBpbmZvcm1hdGlvbiB0cmFuc2ZlciByb3V0aW5lIGNhbiBleGl0IGNsZWFubHkuCisgKi8KKworCWlmIChob3N0ZGF0YS0+Y29ubmVjdGVkID09IGNtZCkgeworCQlkcHJpbnRrKE5ERUJVR19BQk9SVCwgKCJzY3NpJWQgOiBhYm9ydGluZyBjb25uZWN0ZWQgY29tbWFuZFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pKTsKKwkJaG9zdGRhdGEtPmFib3J0ZWQgPSAxOworLyoKKyAqIFdlIHNob3VsZCBwZXJmb3JtIEJTWSBjaGVja2luZywgYW5kIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IHNsaXBwZWQKKyAqIGludG8gQlVTIEZSRUUuCisgKi8KKworCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0FTU0VSVF9BVE4pOworLyogCisgKiBTaW5jZSB3ZSBjYW4ndCBjaGFuZ2UgcGhhc2VzIHVudGlsIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgY3VycmVudCAKKyAqIGhhbmRzaGFrZSwgd2UgaGF2ZSB0byBzb3VyY2Ugb3Igc2luayBhIGJ5dGUgb2YgZGF0YSBpZiB0aGUgY3VycmVudAorICogcGhhc2UgaXMgbm90IE1TR09VVC4KKyAqLworCisvKiAKKyAqIFJldHVybiBjb250cm9sIHRvIHRoZSBleGVjdXRpbmcgTkNSIGRyaXZlIHNvIHdlIGNhbiBjbGVhciB0aGUKKyAqIGFib3J0ZWQgZmxhZyBhbmQgZ2V0IGJhY2sgaW50byBvdXIgbWFpbiBsb29wLgorICovCisKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKKy8qIAorICogQ2FzZSAyIDogSWYgdGhlIGNvbW1hbmQgaGFzbid0IGJlZW4gaXNzdWVkIHlldCwgd2Ugc2ltcGx5IHJlbW92ZSBpdCAKKyAqICAgICAgICAgIGZyb20gdGhlIGlzc3VlIHF1ZXVlLgorICovCisgCisJZHByaW50ayhOREVCVUdfQUJPUlQsICgic2NzaSVkIDogYWJvcnQgZ29pbmcgaW50byBsb29wLlxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pKTsKKwlmb3IgKHByZXYgPSAoU2NzaV9DbW5kICoqKSAmIChob3N0ZGF0YS0+aXNzdWVfcXVldWUpLCB0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsgdG1wOyBwcmV2ID0gKFNjc2lfQ21uZCAqKikgJiAodG1wLT5ob3N0X3NjcmliYmxlKSwgdG1wID0gKFNjc2lfQ21uZCAqKSB0bXAtPmhvc3Rfc2NyaWJibGUpCisJCWlmIChjbWQgPT0gdG1wKSB7CisJCQlSRU1PVkUoNSwgKnByZXYsIHRtcCwgdG1wLT5ob3N0X3NjcmliYmxlKTsKKwkJCSgqcHJldikgPSAoU2NzaV9DbW5kICopIHRtcC0+aG9zdF9zY3JpYmJsZTsKKwkJCXRtcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJCQl0bXAtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKwkJCWRwcmludGsoTkRFQlVHX0FCT1JULCAoInNjc2klZCA6IGFib3J0IHJlbW92ZWQgY29tbWFuZCBmcm9tIGlzc3VlIHF1ZXVlLlxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pKTsKKwkJCXRtcC0+ZG9uZSh0bXApOworCQkJcmV0dXJuIFNVQ0NFU1M7CisJCX0KKyNpZiAoTkRFQlVHICAmIE5ERUJVR19BQk9SVCkKKwkvKiBLTEwgKi8KKwkJZWxzZSBpZiAocHJldiA9PSB0bXApCisJCQlwcmludGsoS0VSTl9FUlIgInNjc2klZCA6IExPT1BcbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKKyNlbmRpZgorCisvKiAKKyAqIENhc2UgMyA6IElmIGFueSBjb21tYW5kcyBhcmUgY29ubmVjdGVkLCB3ZSdyZSBnb2luZyB0byBmYWlsIHRoZSBhYm9ydAorICogICAgICAgICAgYW5kIGxldCB0aGUgaGlnaCBsZXZlbCBTQ1NJIGRyaXZlciByZXRyeSBhdCBhIGxhdGVyIHRpbWUgb3IgCisgKiAgICAgICAgICBpc3N1ZSBhIHJlc2V0LgorICoKKyAqICAgICAgICAgIFRpbWVvdXRzLCBhbmQgdGhlcmVmb3JlIGFib3J0ZWQgY29tbWFuZHMsIHdpbGwgYmUgaGlnaGx5IHVubGlrZWx5CisgKiAgICAgICAgICBhbmQgaGFuZGxpbmcgdGhlbSBjbGVhbmx5IGluIHRoaXMgc2l0dWF0aW9uIHdvdWxkIG1ha2UgdGhlIGNvbW1vbgorICogICAgICAgICAgY2FzZSBvZiBub3Jlc2V0cyBsZXNzIGVmZmljaWVudCwgYW5kIHdvdWxkIHBvbGx1dGUgb3VyIGNvZGUuICBTbywKKyAqICAgICAgICAgIHdlIGZhaWwuCisgKi8KKworCWlmIChob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJCWRwcmludGsoTkRFQlVHX0FCT1JULCAoInNjc2klZCA6IGFib3J0IGZhaWxlZCwgY29tbWFuZCBjb25uZWN0ZWQuXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKy8qCisgKiBDYXNlIDQ6IElmIHRoZSBjb21tYW5kIGlzIGN1cnJlbnRseSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgYnVzLCBhbmQgCisgKiAgICAgIHRoZXJlIGFyZSBubyBjb25uZWN0ZWQgY29tbWFuZHMsIHdlIHJlY29ubmVjdCB0aGUgSV9UX0wgb3IgCisgKiAgICAgIElfVF9MX1EgbmV4dXMgYXNzb2NpYXRlZCB3aXRoIGl0LCBnbyBpbnRvIG1lc3NhZ2Ugb3V0LCBhbmQgc2VuZCAKKyAqICAgICAgYW4gYWJvcnQgbWVzc2FnZS4KKyAqCisgKiBUaGlzIGNhc2UgaXMgZXNwZWNpYWxseSB1Z2x5LiBJbiBvcmRlciB0byByZWVzdGFibGlzaCB0aGUgbmV4dXMsIHdlCisgKiBuZWVkIHRvIGNhbGwgTkNSNTM4MF9zZWxlY3QoKS4gIFRoZSBlYXNpZXN0IHdheSB0byBpbXBsZW1lbnQgdGhpcyAKKyAqIGZ1bmN0aW9uIHdhcyB0byBhYm9ydCBpZiB0aGUgYnVzIHdhcyBidXN5LCBhbmQgbGV0IHRoZSBpbnRlcnJ1cHQKKyAqIGhhbmRsZXIgdHJpZ2dlcmVkIG9uIHRoZSBTRUwgZm9yIHJlc2VsZWN0IHRha2UgY2FyZSBvZiBsb3N0IGFyYml0cmF0aW9ucworICogd2hlcmUgbmVjZXNzYXJ5LCBtZWFuaW5nIGludGVycnVwdHMgbmVlZCB0byBiZSBlbmFibGVkLgorICoKKyAqIFdoZW4gaW50ZXJydXB0cyBhcmUgZW5hYmxlZCwgdGhlIHF1ZXVlcyBtYXkgY2hhbmdlIC0gc28gd2UgCisgKiBjYW4ndCByZW1vdmUgaXQgZnJvbSB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlIGJlZm9yZSBzZWxlY3RpbmcgaXQKKyAqIGJlY2F1c2UgdGhhdCBjb3VsZCBjYXVzZSBhIGZhaWx1cmUgaW4gaGFzaGluZyB0aGUgbmV4dXMgaWYgdGhhdCAKKyAqIGRldmljZSByZXNlbGVjdGVkLgorICogCisgKiBTaW5jZSB0aGUgcXVldWVzIG1heSBjaGFuZ2UsIHdlIGNhbid0IHVzZSB0aGUgcG9pbnRlcnMgZnJvbSB3aGVuIHdlCisgKiBmaXJzdCBsb2NhdGUgaXQuCisgKgorICogU28sIHdlIG11c3QgZmlyc3QgbG9jYXRlIHRoZSBjb21tYW5kLCBhbmQgaWYgTkNSNTM4MF9zZWxlY3QoKQorICogc3VjY2VlZHMsIHRoZW4gaXNzdWUgdGhlIGFib3J0LCByZWxvY2F0ZSB0aGUgY29tbWFuZCBhbmQgcmVtb3ZlCisgKiBpdCBmcm9tIHRoZSBkaXNjb25uZWN0ZWQgcXVldWUuCisgKi8KKworCWZvciAodG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOyB0bXA7IHRtcCA9IChTY3NpX0NtbmQgKikgdG1wLT5ob3N0X3NjcmliYmxlKQorCQlpZiAoY21kID09IHRtcCkgeworCQkJZHByaW50ayhOREVCVUdfQUJPUlQsICgic2NzaSVkIDogYWJvcnRpbmcgZGlzY29ubmVjdGVkIGNvbW1hbmQuXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCisJCQlpZiAoTkNSNTM4MF9zZWxlY3QoaW5zdGFuY2UsIGNtZCwgKGludCkgY21kLT50YWcpKQorCQkJCXJldHVybiBGQUlMRUQ7CisJCQlkcHJpbnRrKE5ERUJVR19BQk9SVCwgKCJzY3NpJWQgOiBuZXh1cyByZWVzdGFibGlzaGVkLlxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pKTsKKworCQkJZG9fYWJvcnQoaW5zdGFuY2UpOworCisJCQlmb3IgKHByZXYgPSAoU2NzaV9DbW5kICoqKSAmIChob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlKSwgdG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOyB0bXA7IHByZXYgPSAoU2NzaV9DbW5kICoqKSAmICh0bXAtPmhvc3Rfc2NyaWJibGUpLCB0bXAgPSAoU2NzaV9DbW5kICopIHRtcC0+aG9zdF9zY3JpYmJsZSkKKwkJCQlpZiAoY21kID09IHRtcCkgeworCQkJCQlSRU1PVkUoNSwgKnByZXYsIHRtcCwgdG1wLT5ob3N0X3NjcmliYmxlKTsKKwkJCQkJKnByZXYgPSAoU2NzaV9DbW5kICopIHRtcC0+aG9zdF9zY3JpYmJsZTsKKwkJCQkJdG1wLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwkJCQkJdG1wLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCQkJCXRtcC0+ZG9uZSh0bXApOworCQkJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJCQl9CisJCX0KKy8qCisgKiBDYXNlIDUgOiBJZiB3ZSByZWFjaGVkIHRoaXMgcG9pbnQsIHRoZSBjb21tYW5kIHdhcyBub3QgZm91bmQgaW4gYW55IG9mIAorICogICAgICAgICAgdGhlIHF1ZXVlcy4KKyAqCisgKiBXZSBwcm9iYWJseSByZWFjaGVkIHRoaXMgcG9pbnQgYmVjYXVzZSBvZiBhbiB1bmxpa2VseSByYWNlIGNvbmRpdGlvbgorICogYmV0d2VlbiB0aGUgY29tbWFuZCBjb21wbGV0aW5nIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIGFib3J0aW9uIGNvZGUsCisgKiBzbyB3ZSB3b24ndCBwYW5pYywgYnV0IHdlIHdpbGwgbm90aWZ5IHRoZSB1c2VyIGluIGNhc2Ugc29tZXRoaW5nIHJlYWxseQorICogYnJva2UuCisgKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQgOiB3YXJuaW5nIDogU0NTSSBjb21tYW5kIHByb2JhYmx5IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiIKKwkJCSIgICAgICAgICBiZWZvcmUgYWJvcnRpb25cbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwlyZXR1cm4gRkFJTEVEOworfQorCisKKy8qIAorICogRnVuY3Rpb24gOiBpbnQgTkNSNTM4MF9idXNfcmVzZXQgKFNjc2lfQ21uZCAqY21kKQorICogCisgKiBQdXJwb3NlIDogcmVzZXQgdGhlIFNDU0kgYnVzLgorICoKKyAqIFJldHVybnMgOiBTVUNDRVNTCisgKgorICogTG9ja3M6IGhvc3QgbG9jayB0YWtlbiBieSBjYWxsZXIKKyAqLworCitzdGF0aWMgaW50IE5DUjUzODBfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqIGNtZCkgeworCU5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworCU5DUjUzODBfc2V0dXAoY21kLT5kZXZpY2UtPmhvc3QpOworCisJTkNSNTM4MF9wcmludF9zdGF0dXMoY21kLT5kZXZpY2UtPmhvc3QpOworCWRvX3Jlc2V0KGNtZC0+ZGV2aWNlLT5ob3N0KTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyogCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX2RldmljZV9yZXNldCAoU2NzaV9DbW5kICpjbWQpCisgKiAKKyAqIFB1cnBvc2UgOiByZXNldCBhIFNDU0kgZGV2aWNlCisgKgorICogUmV0dXJucyA6IEZBSUxFRAorICoKKyAqIExvY2tzOiBpb19yZXF1ZXN0X2xvY2sgaGVsZCBieSBjYWxsZXIKKyAqLworCitzdGF0aWMgaW50IE5DUjUzODBfZGV2aWNlX3Jlc2V0KFNjc2lfQ21uZCAqIGNtZCkgeworCXJldHVybiBGQUlMRUQ7Cit9CisKKy8qIAorICogRnVuY3Rpb24gOiBpbnQgTkNSNTM4MF9ob3N0X3Jlc2V0IChTY3NpX0NtbmQgKmNtZCkKKyAqIAorICogUHVycG9zZSA6IHJlc2V0IGEgU0NTSSBkZXZpY2UKKyAqCisgKiBSZXR1cm5zIDogRkFJTEVECisgKgorICogTG9ja3M6IGlvX3JlcXVlc3RfbG9jayBoZWxkIGJ5IGNhbGxlcgorICovCisKK3N0YXRpYyBpbnQgTkNSNTM4MF9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqIGNtZCkgeworCXJldHVybiBGQUlMRUQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTkNSNTM4MC5oIGIvZHJpdmVycy9zY3NpL05DUjUzODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTEwM2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL05DUjUzODAuaApAQCAtMCwwICsxLDQzMiBAQAorLyogCisgKiBOQ1IgNTM4MCBkZWZpbmVzCisgKgorICogQ29weXJpZ2h0IDE5OTMsIERyZXcgRWNraGFyZHQKKyAqCVZpc2lvbmFyeSBDb21wdXRpbmcKKyAqCShVbml4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyAqIAlkcmV3QGNvbG9yYWRvLmVkdQorICogICAgICArMSAoMzAzKSA2NjYtNTgzNgorICoKKyAqIERJU1RSSUJVVElPTiBSRUxFQVNFIDcKKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKgorICogTkNSIDUzODAgRmFtaWx5CisgKiBTQ1NJIFByb3RvY29sIENvbnRyb2xsZXIKKyAqIERhdGFib29rCisgKiBOQ1IgTWljcm9lbGVjdHJvbmljcworICogMTYzNSBBZXJvcGxhemEgRHJpdmUKKyAqIENvbG9yYWRvIFNwcmluZ3MsIENPIDgwOTE2CisgKiAxKyAoNzE5KSA1NzgtMzQwMAorICogMSsgKDgwMCkgMzM0LTU0NTQKKyAqLworCisvKgorICogJExvZzogTkNSNTM4MC5oLHYgJAorICovCisKKyNpZm5kZWYgTkNSNTM4MF9ICisjZGVmaW5lIE5DUjUzODBfSAorCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNkZWZpbmUgTkNSNTM4MF9QVUJMSUNfUkVMRUFTRSA3CisjZGVmaW5lIE5DUjUzQzQwMF9QVUJMSUNfUkVMRUFTRSAyCisKKyNkZWZpbmUgTkRFQlVHX0FSQklUUkFUSU9OCTB4MQorI2RlZmluZSBOREVCVUdfQVVUT1NFTlNFCTB4MgorI2RlZmluZSBOREVCVUdfRE1BCQkweDQKKyNkZWZpbmUgTkRFQlVHX0hBTkRTSEFLRQkweDgKKyNkZWZpbmUgTkRFQlVHX0lORk9STUFUSU9OCTB4MTAKKyNkZWZpbmUgTkRFQlVHX0lOSVQJCTB4MjAKKyNkZWZpbmUgTkRFQlVHX0lOVFIJCTB4NDAKKyNkZWZpbmUgTkRFQlVHX0xJTktFRAkJMHg4MAorI2RlZmluZSBOREVCVUdfTUFJTgkJMHgxMDAKKyNkZWZpbmUgTkRFQlVHX05PX0RBVEFPVVQJMHgyMDAKKyNkZWZpbmUgTkRFQlVHX05PX1dSSVRFCQkweDQwMAorI2RlZmluZSBOREVCVUdfUElPCQkweDgwMAorI2RlZmluZSBOREVCVUdfUFNFVURPX0RNQQkweDEwMDAKKyNkZWZpbmUgTkRFQlVHX1FVRVVFUwkJMHgyMDAwCisjZGVmaW5lIE5ERUJVR19SRVNFTEVDVElPTgkweDQwMDAKKyNkZWZpbmUgTkRFQlVHX1NFTEVDVElPTgkweDgwMDAKKyNkZWZpbmUgTkRFQlVHX1VTTEVFUAkJMHgxMDAwMAorI2RlZmluZSBOREVCVUdfTEFTVF9CWVRFX1NFTlQJMHgyMDAwMAorI2RlZmluZSBOREVCVUdfUkVTVEFSVF9TRUxFQ1QJMHg0MDAwMAorI2RlZmluZSBOREVCVUdfRVhURU5ERUQJCTB4ODAwMDAKKyNkZWZpbmUgTkRFQlVHX0M0MDBfUFJFQUQJMHgxMDAwMDAKKyNkZWZpbmUgTkRFQlVHX0M0MDBfUFdSSVRFCTB4MjAwMDAwCisjZGVmaW5lIE5ERUJVR19MSVNUUwkJMHg0MDAwMDAKKworI2RlZmluZSBOREVCVUdfQU5ZCQkweEZGRkZGRkZGVUwKKworLyogCisgKiBUaGUgY29udGVudHMgb2YgdGhlIE9VVFBVVCBEQVRBIHJlZ2lzdGVyIGFyZSBhc3NlcnRlZCBvbiB0aGUgYnVzIHdoZW4KKyAqIGVpdGhlciBhcmJpdHJhdGlvbiBpcyBvY2N1cnJpbmcgb3IgdGhlIHBoYXNlLWluZGljYXRpbmcgc2lnbmFscyAoCisgKiBJTywgQ0QsIE1TRykgaW4gdGhlIFRBUkdFVCBDT01NQU5EIHJlZ2lzdGVyIGFuZCB0aGUgQVNTRVJUIERBVEEKKyAqIGJpdCBpbiB0aGUgSU5JVElBVE9SIENPTU1BTkQgcmVnaXN0ZXIgaXMgc2V0LgorICovCisKKyNkZWZpbmUgT1VUUFVUX0RBVEFfUkVHICAgICAgICAgMAkvKiB3byBEQVRBIGxpbmVzIG9uIFNDU0kgYnVzICovCisjZGVmaW5lIENVUlJFTlRfU0NTSV9EQVRBX1JFRyAgIDAJLyogcm8gc2FtZSAqLworCisjZGVmaW5lIElOSVRJQVRPUl9DT01NQU5EX1JFRwkxCS8qIHJ3ICovCisjZGVmaW5lIElDUl9BU1NFUlRfUlNUCQkweDgwCS8qIHJ3IFNldCB0byBhc3NlcnQgUlNUICAqLworI2RlZmluZSBJQ1JfQVJCSVRSQVRJT05fUFJPR1JFU1MgMHg0MAkvKiBybyBJbmRpY2F0ZXMgYXJiaXRyYXRpb24gY29tcGxldGUgKi8KKyNkZWZpbmUgSUNSX1RSSV9TVEFURQkJMHg0MAkvKiB3byBTZXQgdG8gdHJpLXN0YXRlIGRyaXZlcnMgKi8KKyNkZWZpbmUgSUNSX0FSQklUUkFUSU9OX0xPU1QJMHgyMAkvKiBybyBJbmRpY2F0ZXMgYXJiaXRyYXRpb24gbG9zdCAqLworI2RlZmluZSBJQ1JfRElGRl9FTkFCTEUJCTB4MjAJLyogd28gU2V0IHRvIGVuYWJsZSBkaWZmLiBkcml2ZXJzICovCisjZGVmaW5lIElDUl9BU1NFUlRfQUNLCQkweDEwCS8qIHJ3IGluaSBTZXQgdG8gYXNzZXJ0IEFDSyAqLworI2RlZmluZSBJQ1JfQVNTRVJUX0JTWQkJMHgwOAkvKiBydyBTZXQgdG8gYXNzZXJ0IEJTWSAqLworI2RlZmluZSBJQ1JfQVNTRVJUX1NFTCAJCTB4MDQJLyogcncgU2V0IHRvIGFzc2VydCBTRUwgKi8KKyNkZWZpbmUgSUNSX0FTU0VSVF9BVE4JCTB4MDIJLyogcncgU2V0IHRvIGFzc2VydCBBVE4gKi8KKyNkZWZpbmUgSUNSX0FTU0VSVF9EQVRBCQkweDAxCS8qIHJ3IFNDU0lfREFUQV9SRUcgaXMgYXNzZXJ0ZWQgKi8KKworI2lmZGVmIERJRkZFUkVOVElBTAorI2RlZmluZSBJQ1JfQkFTRQkJSUNSX0RJRkZfRU5BQkxFCisjZWxzZQorI2RlZmluZSBJQ1JfQkFTRQkJMAorI2VuZGlmCisKKyNkZWZpbmUgTU9ERV9SRUcJCTIKKy8qCisgKiBOb3RlIDogQkxPQ0tfRE1BIGNvZGUgd2lsbCBrZWVwIERSUSBhc3NlcnRlZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSAKKyAqIHRyYW5zZmVyLCBjYXVzaW5nIHRoZSBjaGlwIHRvIGhvZyB0aGUgYnVzLiAgWW91IHByb2JhYmx5IGRvbid0IHdhbnQgCisgKiB0aGlzLgorICovCisjZGVmaW5lIE1SX0JMT0NLX0RNQV9NT0RFCTB4ODAJLyogcncgYmxvY2sgbW9kZSBETUEgKi8KKyNkZWZpbmUgTVJfVEFSR0VUCQkweDQwCS8qIHJ3IHRhcmdldCBtb2RlICovCisjZGVmaW5lIE1SX0VOQUJMRV9QQVJfQ0hFQ0sJMHgyMAkvKiBydyBlbmFibGUgcGFyaXR5IGNoZWNraW5nICovCisjZGVmaW5lIE1SX0VOQUJMRV9QQVJfSU5UUgkweDEwCS8qIHJ3IGVuYWJsZSBiYWQgcGFyaXR5IGludGVycnVwdCAqLworI2RlZmluZSBNUl9FTkFCTEVfRU9QX0lOVFIJMHgwOAkvKiBydyBlbmFibGUgZW9wIGludGVycnVwdCAqLworI2RlZmluZSBNUl9NT05JVE9SX0JTWQkJMHgwNAkvKiBydyBlbmFibGUgaW50IG9uIHVuZXhwZWN0ZWQgYnN5IGZhaWwgKi8KKyNkZWZpbmUgTVJfRE1BX01PREUJCTB4MDIJLyogcncgRE1BIC8gcHNldWRvIERNQSBtb2RlICovCisjZGVmaW5lIE1SX0FSQklUUkFURQkJMHgwMQkvKiBydyBzdGFydCBhcmJpdHJhdGlvbiAqLworCisjaWZkZWYgUEFSSVRZCisjZGVmaW5lIE1SX0JBU0UJCQlNUl9FTkFCTEVfUEFSX0NIRUNLCisjZWxzZQorI2RlZmluZSBNUl9CQVNFCQkJMAorI2VuZGlmCisKKyNkZWZpbmUgVEFSR0VUX0NPTU1BTkRfUkVHCTMKKyNkZWZpbmUgVENSX0xBU1RfQllURV9TRU5UCTB4ODAJLyogcm8gRE1BIGRvbmUgKi8KKyNkZWZpbmUgVENSX0FTU0VSVF9SRVEJCTB4MDgJLyogdGd0IHJ3IGFzc2VydCBSRVEgKi8KKyNkZWZpbmUgVENSX0FTU0VSVF9NU0cJCTB4MDQJLyogdGd0IHJ3IGFzc2VydCBNU0cgKi8KKyNkZWZpbmUgVENSX0FTU0VSVF9DRAkJMHgwMgkvKiB0Z3QgcncgYXNzZXJ0IENEICovCisjZGVmaW5lIFRDUl9BU1NFUlRfSU8JCTB4MDEJLyogdGd0IHJ3IGFzc2VydCBJTyAqLworCisjZGVmaW5lIFNUQVRVU19SRUcJCTQJLyogcm8gKi8KKy8qCisgKiBOb3RlIDogYSBzZXQgYml0IGluZGljYXRlcyBhbiBhY3RpdmUgc2lnbmFsLCBkcml2ZW4gYnkgdXMgb3IgYW5vdGhlciAKKyAqIGRldmljZS4KKyAqLworI2RlZmluZSBTUl9SU1QJCQkweDgwCisjZGVmaW5lIFNSX0JTWQkJCTB4NDAKKyNkZWZpbmUgU1JfUkVRCQkJMHgyMAorI2RlZmluZSBTUl9NU0cJCQkweDEwCisjZGVmaW5lIFNSX0NECQkJMHgwOAorI2RlZmluZSBTUl9JTwkJCTB4MDQKKyNkZWZpbmUgU1JfU0VMCQkJMHgwMgorI2RlZmluZSBTUl9EQlAJCQkweDAxCisKKy8qCisgKiBTZXR0aW5nIGEgYml0IGluIHRoaXMgcmVnaXN0ZXIgd2lsbCBjYXVzZSBhbiBpbnRlcnJ1cHQgdG8gYmUgZ2VuZXJhdGVkIHdoZW4gCisgKiBCU1kgaXMgZmFsc2UgYW5kIFNFTCB0cnVlIGFuZCB0aGlzIGJpdCBpcyBhc3NlcnRlZCAgb24gdGhlIGJ1cy4KKyAqLworI2RlZmluZSBTRUxFQ1RfRU5BQkxFX1JFRwk0CS8qIHdvICovCisKKyNkZWZpbmUgQlVTX0FORF9TVEFUVVNfUkVHCTUJLyogcm8gKi8KKyNkZWZpbmUgQkFTUl9FTkRfRE1BX1RSQU5TRkVSCTB4ODAJLyogcm8gc2V0IG9uIGVuZCBvZiB0cmFuc2ZlciAqLworI2RlZmluZSBCQVNSX0RSUQkJMHg0MAkvKiBybyBtaXJyb3Igb2YgRFJRIHBpbiAqLworI2RlZmluZSBCQVNSX1BBUklUWV9FUlJPUgkweDIwCS8qIHJvIHBhcml0eSBlcnJvciBkZXRlY3RlZCAqLworI2RlZmluZSBCQVNSX0lSUQkJMHgxMAkvKiBybyBtaXJyb3Igb2YgSVJRIHBpbiAqLworI2RlZmluZSBCQVNSX1BIQVNFX01BVENICTB4MDgJLyogcm8gU2V0IHdoZW4gTVNHIENEIElPIG1hdGNoIFRDUiAqLworI2RlZmluZSBCQVNSX0JVU1lfRVJST1IJCTB4MDQJLyogcm8gVW5leHBlY3RlZCBjaGFuZ2UgdG8gaW5hY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgQkFTUl9BVE4gCQkweDAyCS8qIHJvIEJVUyBzdGF0dXMgKi8KKyNkZWZpbmUgQkFTUl9BQ0sJCTB4MDEJLyogcm8gQlVTIHN0YXR1cyAqLworCisvKiBXcml0ZSBhbnkgdmFsdWUgdG8gdGhpcyByZWdpc3RlciB0byBzdGFydCBhIERNQSBzZW5kICovCisjZGVmaW5lIFNUQVJUX0RNQV9TRU5EX1JFRwk1CS8qIHdvICovCisKKy8qIAorICogVXNlZCBpbiBETUEgdHJhbnNmZXIgbW9kZSwgZGF0YSBpcyBsYXRjaGVkIGZyb20gdGhlIFNDU0kgYnVzIG9uCisgKiB0aGUgZmFsbGluZyBlZGdlIG9mIFJFUSAoaW5pKSBvciBBQ0sgKHRndCkKKyAqLworI2RlZmluZSBJTlBVVF9EQVRBX1JFRwkJCTYJLyogcm8gKi8KKworLyogV3JpdGUgYW55IHZhbHVlIHRvIHRoaXMgcmVnaXN0ZXIgdG8gc3RhcnQgYSBETUEgcmVjZWl2ZSAqLworI2RlZmluZSBTVEFSVF9ETUFfVEFSR0VUX1JFQ0VJVkVfUkVHCTYJLyogd28gKi8KKworLyogUmVhZCB0aGlzIHJlZ2lzdGVyIHRvIGNsZWFyIGludGVycnVwdCBjb25kaXRpb25zICovCisjZGVmaW5lIFJFU0VUX1BBUklUWV9JTlRFUlJVUFRfUkVHCTcJLyogcm8gKi8KKworLyogV3JpdGUgYW55IHZhbHVlIHRvIHRoaXMgcmVnaXN0ZXIgdG8gc3RhcnQgYW4gaW5pIG1vZGUgRE1BIHJlY2VpdmUgKi8KKyNkZWZpbmUgU1RBUlRfRE1BX0lOSVRJQVRPUl9SRUNFSVZFX1JFRyA3CS8qIHdvICovCisKKyNkZWZpbmUgQzQwMF9DT05UUk9MX1NUQVRVU19SRUcgTkNSNTNDNDAwX3JlZ2lzdGVyX29mZnNldC04CS8qIHJ3ICovCisKKyNkZWZpbmUgQ1NSX1JFU0VUICAgICAgICAgICAgICAweDgwCS8qIHdvICBSZXNldHMgNTNjNDAwICovCisjZGVmaW5lIENTUl81M0M4MF9SRUcgICAgICAgICAgMHg4MAkvKiBybyAgNTM4MCByZWdpc3RlcnMgYnVzeSAqLworI2RlZmluZSBDU1JfVFJBTlNfRElSICAgICAgICAgIDB4NDAJLyogcncgIERhdGEgdHJhbnNmZXIgZGlyZWN0aW9uICovCisjZGVmaW5lIENTUl9TQ1NJX0JVRkZfSU5UUiAgICAgMHgyMAkvKiBydyAgRW5hYmxlIGludCBvbiB0cmFuc2ZlciByZWFkeSAqLworI2RlZmluZSBDU1JfNTNDODBfSU5UUiAgICAgICAgIDB4MTAJLyogcncgIEVuYWJsZSA1M2M4MCBpbnRlcnJ1cHRzICovCisjZGVmaW5lIENTUl9TSEFSRURfSU5UUiAgICAgICAgMHgwOAkvKiBydyAgSW50ZXJydXB0IHNoYXJpbmcgKi8KKyNkZWZpbmUgQ1NSX0hPU1RfQlVGX05PVF9SRFkgICAweDA0CS8qIHJvICBJcyBIb3N0IGJ1ZmZlciByZWFkeSAqLworI2RlZmluZSBDU1JfU0NTSV9CVUZfUkRZICAgICAgIDB4MDIJLyogcm8gIFNDU0kgYnVmZmVyIHJlYWQgKi8KKyNkZWZpbmUgQ1NSX0dBVEVEXzUzQzgwX0lSUSAgICAweDAxCS8qIHJvICBMYXN0IGJsb2NrIHhmZXJyZWQgKi8KKworI2lmIDAKKyNkZWZpbmUgQ1NSX0JBU0UgQ1NSX1NDU0lfQlVGRl9JTlRSIHwgQ1NSXzUzQzgwX0lOVFIKKyNlbHNlCisjZGVmaW5lIENTUl9CQVNFIENTUl81M0M4MF9JTlRSCisjZW5kaWYKKworLyogTnVtYmVyIG9mIDEyOC1ieXRlIGJsb2NrcyB0byBiZSB0cmFuc2ZlcnJlZCAqLworI2RlZmluZSBDNDAwX0JMT0NLX0NPVU5URVJfUkVHICAgTkNSNTNDNDAwX3JlZ2lzdGVyX29mZnNldC03CS8qIHJ3ICovCisKKy8qIFJlc3VtZSB0cmFuc2ZlciBhZnRlciBkaXNjb25uZWN0ICovCisjZGVmaW5lIEM0MDBfUkVTVU1FX1RSQU5TRkVSX1JFRyBOQ1I1M0M0MDBfcmVnaXN0ZXJfb2Zmc2V0LTYJLyogd28gKi8KKworLyogQWNjZXNzIHRvIGhvc3QgYnVmZmVyIHN0YWNrICovCisjZGVmaW5lIEM0MDBfSE9TVF9CVUZGRVIgICAgICAgICBOQ1I1M0M0MDBfcmVnaXN0ZXJfb2Zmc2V0LTQJLyogcncgKi8KKworCisvKiBOb3RlIDogUEhBU0VfKiBtYWNyb3MgYXJlIGJhc2VkIG9uIHRoZSB2YWx1ZXMgb2YgdGhlIFNUQVRVUyByZWdpc3RlciAqLworI2RlZmluZSBQSEFTRV9NQVNLIAkoU1JfTVNHIHwgU1JfQ0QgfCBTUl9JTykKKworI2RlZmluZSBQSEFTRV9EQVRBT1VUCQkwCisjZGVmaW5lIFBIQVNFX0RBVEFJTgkJU1JfSU8KKyNkZWZpbmUgUEhBU0VfQ01ET1VUCQlTUl9DRAorI2RlZmluZSBQSEFTRV9TVEFUSU4JCShTUl9DRCB8IFNSX0lPKQorI2RlZmluZSBQSEFTRV9NU0dPVVQJCShTUl9NU0cgfCBTUl9DRCkKKyNkZWZpbmUgUEhBU0VfTVNHSU4JCShTUl9NU0cgfCBTUl9DRCB8IFNSX0lPKQorI2RlZmluZSBQSEFTRV9VTktOT1dOCQkweGZmCisKKy8qIAorICogQ29udmVydCBzdGF0dXMgcmVnaXN0ZXIgcGhhc2UgdG8gc29tZXRoaW5nIHdlIGNhbiB1c2UgdG8gc2V0IHBoYXNlIGluIAorICogdGhlIHRhcmdldCByZWdpc3RlciBzbyB3ZSBjYW4gZ2V0IHBoYXNlIG1pc21hdGNoIGludGVycnVwdHMgb24gRE1BIAorICogdHJhbnNmZXJzLgorICovCisKKyNkZWZpbmUgUEhBU0VfU1JfVE9fVENSKHBoYXNlKSAoKHBoYXNlKSA+PiAyKQorCisvKgorICogVGhlIGludGVybmFsIHNob3VsZF9kaXNjb25uZWN0KCkgZnVuY3Rpb24gcmV0dXJucyB0aGVzZSBiYXNlZCBvbiB0aGUgCisgKiBleHBlY3RlZCBsZW5ndGggb2YgYSBkaXNjb25uZWN0IGlmIGEgZGV2aWNlIHN1cHBvcnRzIGRpc2Nvbm5lY3QvCisgKiByZWNvbm5lY3QuCisgKi8KKworI2RlZmluZSBESVNDT05ORUNUX05PTkUJCTAKKyNkZWZpbmUgRElTQ09OTkVDVF9USU1FX1RPX0RBVEEJMQorI2RlZmluZSBESVNDT05ORUNUX0xPTkcJCTIKKworLyogCisgKiBUaGVzZSBhcmUgInNwZWNpYWwiIHZhbHVlcyBmb3IgdGhlIHRhZyBwYXJhbWV0ZXIgcGFzc2VkIHRvIE5DUjUzODBfc2VsZWN0LgorICovCisKKyNkZWZpbmUgVEFHX05FWFQJLTEJLyogVXNlIG5leHQgZnJlZSB0YWcgKi8KKyNkZWZpbmUgVEFHX05PTkUJLTIJLyogCisJCQkJICogRXN0YWJsaXNoIElfVF9MIG5leHVzIGluc3RlYWQgb2YgSV9UX0xfUQorCQkJCSAqIGV2ZW4gb24gU0NTSS1JSSBkZXZpY2VzLgorCQkJCSAqLworCisvKgorICogVGhlc2UgYXJlICJzcGVjaWFsIiB2YWx1ZXMgZm9yIHRoZSBpcnEgYW5kIGRtYV9jaGFubmVsIGZpZWxkcyBvZiB0aGUgCisgKiBTY3NpX0hvc3Qgc3RydWN0dXJlCisgKi8KKworI2RlZmluZSBTQ1NJX0lSUV9OT05FCTI1NQorI2RlZmluZSBETUFfTk9ORQkyNTUKKyNkZWZpbmUgSVJRX0FVVE8JMjU0CisjZGVmaW5lIERNQV9BVVRPCTI1NAorI2RlZmluZSBQT1JUX0FVVE8JMHhmZmZmCS8qIGF1dG9wcm9iZSBpbyBwb3J0IGZvciA1M2M0MDBhICovCisKKyNkZWZpbmUgRkxBR19IQVNfTEFTVF9CWVRFX1NFTlQJCTEJLyogTkNSNTNjODEgb3IgYmV0dGVyICovCisjZGVmaW5lIEZMQUdfQ0hFQ0tfTEFTVF9CWVRFX1NFTlQJMgkvKiBPbmx5IHRlc3Qgb25jZSAqLworI2RlZmluZSBGTEFHX05DUjUzQzQwMAkJCTQJLyogTkNSNTNjNDAwICovCisjZGVmaW5lIEZMQUdfTk9fUFNFVURPX0RNQQkJOAkvKiBJbmhpYml0IERNQSAqLworI2RlZmluZSBGTEFHX0RUQzMxODFFCQkJMTYJLyogRFRDMzE4MUUgKi8KKworI2lmbmRlZiBBU00KK3N0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhIHsKKwlOQ1I1MzgwX2ltcGxlbWVudGF0aW9uX2ZpZWxkczsJCS8qIGltcGxlbWVudGF0aW9uIHNwZWNpZmljICovCisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsJCQkvKiBIb3N0IGJhY2twb2ludGVyICovCisJdW5zaWduZWQgY2hhciBpZF9tYXNrLCBpZF9oaWdoZXJfbWFzazsJLyogMSA8PCBpZCwgYWxsIGJpdHMgZ3JlYXRlciAqLworCXVuc2lnbmVkIGNoYXIgdGFyZ2V0c19wcmVzZW50OwkJLyogdGFyZ2V0cyB3ZSBoYXZlIGNvbm5lY3RlZAorCQkJCQkJICAgdG8sIHNvIHdlIGNhbiBjYWxsIGEgc2VsZWN0CisJCQkJCQkgICBmYWlsdXJlIGEgcmV0cnlhYmxlIGNvbmRpdGlvbiAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgYnVzeVs4XTsJCS8qIGluZGV4ID0gdGFyZ2V0LCBiaXQgPSBsdW4gKi8KKyNpZiBkZWZpbmVkKFJFQUxfRE1BKSB8fCBkZWZpbmVkKFJFQUxfRE1BX1BPTEwpCisJdm9sYXRpbGUgaW50IGRtYV9sZW47CQkJLyogcmVxdWVzdGVkIGxlbmd0aCBvZiBETUEgKi8KKyNlbmRpZgorCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgbGFzdF9tZXNzYWdlOwkvKiBsYXN0IG1lc3NhZ2UgT1VUICovCisJdm9sYXRpbGUgU2NzaV9DbW5kICpjb25uZWN0ZWQ7CQkvKiBjdXJyZW50bHkgY29ubmVjdGVkIGNvbW1hbmQgKi8KKwl2b2xhdGlsZSBTY3NpX0NtbmQgKmlzc3VlX3F1ZXVlOwkvKiB3YWl0aW5nIHRvIGJlIGlzc3VlZCAqLworCXZvbGF0aWxlIFNjc2lfQ21uZCAqZGlzY29ubmVjdGVkX3F1ZXVlOwkvKiB3YWl0aW5nIGZvciByZWNvbm5lY3QgKi8KKwl2b2xhdGlsZSBpbnQgcmVzdGFydF9zZWxlY3Q7CQkvKiB3ZSBoYXZlIGRpc2Nvbm5lY3RlZCwKKwkJCQkJCSAgIHVzZWQgdG8gcmVzdGFydCAKKwkJCQkJCSAgIE5DUjUzODBfc2VsZWN0KCkgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBhYm9ydGVkOjE7CQkvKiBmbGFnLCBzYXlzIGFib3J0ZWQgKi8KKwlpbnQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0aW1lX2V4cGlyZXM7CQkvKiBpbiBqaWZmaWVzLCBzZXQgcHJpb3IgdG8gc2xlZXBpbmcgKi8KKwlpbnQgc2VsZWN0X3RpbWU7CQkJLyogdGltZXIgaW4gc2VsZWN0IGZvciB0YXJnZXQgcmVzcG9uc2UgKi8KKwl2b2xhdGlsZSBTY3NpX0NtbmQgKnNlbGVjdGluZzsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY29yb3V0aW5lOwkJLyogb3VyIGNvLXJvdXRpbmUgKi8KKyNpZmRlZiBOQ1I1MzgwX1NUQVRTCisJdW5zaWduZWQgdGltZWJhc2U7CQkJLyogQmFzZSBmb3IgdGltZSBjYWxjcyAqLworCWxvbmcgdGltZV9yZWFkWzhdOwkJCS8qIHRpbWUgdG8gZG8gcmVhZHMgKi8KKwlsb25nIHRpbWVfd3JpdGVbOF07CQkJLyogdGltZSB0byBkbyB3cml0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIGJ5dGVzX3JlYWRbOF07CQkvKiBieXRlcyByZWFkICovCisJdW5zaWduZWQgbG9uZyBieXRlc193cml0ZVs4XTsJCS8qIGJ5dGVzIHdyaXR0ZW4gKi8KKwl1bnNpZ25lZCBwZW5kaW5ncjsKKwl1bnNpZ25lZCBwZW5kaW5ndzsKKyNlbmRpZgorfTsKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBkcHJpbnRrKGEsYikJCQlkbyB7fSB3aGlsZSgwKQorI2RlZmluZSBOQ1I1MzgwX2RwcmludChhLGIpCQlkbyB7fSB3aGlsZSgwKQorI2RlZmluZSBOQ1I1MzgwX2RwcmludF9waGFzZShhLGIpCWRvIHt9IHdoaWxlKDApCisKKyNpZiBkZWZpbmVkKEFVVE9QUk9CRV9JUlEpCitzdGF0aWMgaW50IE5DUjUzODBfcHJvYmVfaXJxKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBpbnQgcG9zc2libGUpOworI2VuZGlmCitzdGF0aWMgaW50IE5DUjUzODBfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgaW50IGZsYWdzKTsKK3N0YXRpYyB2b2lkIE5DUjUzODBfZXhpdChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSk7CitzdGF0aWMgdm9pZCBOQ1I1MzgwX2luZm9ybWF0aW9uX3RyYW5zZmVyKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKTsKKyNpZm5kZWYgRE9OVF9VU0VfSU5UUgorc3RhdGljIGlycXJldHVybl90IE5DUjUzODBfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgTkNSNTM4MF9tYWluKHZvaWQgKnB0cik7CitzdGF0aWMgdm9pZCBOQ1I1MzgwX3ByaW50X29wdGlvbnMoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpOworI2lmZGVmIE5ERUJVRworc3RhdGljIHZvaWQgTkNSNTM4MF9wcmludF9waGFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSk7CitzdGF0aWMgdm9pZCBOQ1I1MzgwX3ByaW50KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKTsKKyNlbmRpZgorc3RhdGljIGludCBOQ1I1MzgwX2Fib3J0KFNjc2lfQ21uZCAqIGNtZCk7CitzdGF0aWMgaW50IE5DUjUzODBfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqIGNtZCk7CitzdGF0aWMgaW50IE5DUjUzODBfaG9zdF9yZXNldChTY3NpX0NtbmQgKiBjbWQpOworc3RhdGljIGludCBOQ1I1MzgwX2RldmljZV9yZXNldChTY3NpX0NtbmQgKiBjbWQpOworc3RhdGljIGludCBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQoU2NzaV9DbW5kICogY21kLCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSk7CitzdGF0aWMgaW50IE5DUjUzODBfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwKK29mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KTsKKworc3RhdGljIHZvaWQgTkNSNTM4MF9yZXNlbGVjdChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSk7CitzdGF0aWMgaW50IE5DUjUzODBfc2VsZWN0KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBTY3NpX0NtbmQgKiBjbWQsIGludCB0YWcpOworI2lmIGRlZmluZWQoUFNFVURPX0RNQSkgfHwgZGVmaW5lZChSRUFMX0RNQSkgfHwgZGVmaW5lZChSRUFMX0RNQV9QT0xMKQorc3RhdGljIGludCBOQ1I1MzgwX3RyYW5zZmVyX2RtYShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgdW5zaWduZWQgY2hhciAqcGhhc2UsIGludCAqY291bnQsIHVuc2lnbmVkIGNoYXIgKipkYXRhKTsKKyNlbmRpZgorc3RhdGljIGludCBOQ1I1MzgwX3RyYW5zZmVyX3BpbyhzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgdW5zaWduZWQgY2hhciAqcGhhc2UsIGludCAqY291bnQsIHVuc2lnbmVkIGNoYXIgKipkYXRhKTsKKworI2lmIChkZWZpbmVkKFJFQUxfRE1BKSB8fCBkZWZpbmVkKFJFQUxfRE1BX1BPTEwpKQorCisjaWYgZGVmaW5lZChpMzg2KSB8fCBkZWZpbmVkKF9fYWxwaGFfXykKKworLyoqCisgKglOQ1I1MzgwX3BjX2RtYV9zZXR1cAkJLQlzZXR1cCBJU0EgRE1BCisgKglAaW5zdGFuY2U6IGFkYXB0ZXIgdG8gc2V0IHVwCisgKglAcHRyOiBibG9jayB0byB0cmFuc2ZlciAodmlydHVhbCBhZGRyZXNzKQorICoJQGNvdW50OiBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIKKyAqCUBtb2RlOiBETUEgY29udHJvbGxlciBtb2RlIHRvIHVzZQorICoKKyAqCVByb2dyYW0gdGhlIERNQSBjb250cm9sbGVyIHJlYWR5IHRvIHBlcmZvcm0gYW4gSVNBIERNQSB0cmFuc2ZlcgorICoJb24gdGhpcyBjaGlwLgorICoKKyAqCUxvY2tzOiB0YWtlcyBhbmQgcmVsZWFzZXMgdGhlIElTQSBETUEgbG9jay4KKyAqLworIAorc3RhdGljIF9faW5saW5lX18gaW50IE5DUjUzODBfcGNfZG1hX3NldHVwKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCB1bnNpZ25lZCBjaGFyICpwdHIsIHVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgY2hhciBtb2RlKQoreworCXVuc2lnbmVkIGxpbWl0OworCXVuc2lnbmVkIGxvbmcgYnVzX2FkZHIgPSB2aXJ0X3RvX2J1cyhwdHIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaW5zdGFuY2UtPmRtYV9jaGFubmVsIDw9IDMpIHsKKwkJaWYgKGNvdW50ID4gNjU1MzYpCisJCQljb3VudCA9IDY1NTM2OworCQlsaW1pdCA9IDY1NTM2IC0gKGJ1c19hZGRyICYgMHhGRkZGKTsKKwl9IGVsc2UgeworCQlpZiAoY291bnQgPiA2NTUzNiAqIDIpCisJCQljb3VudCA9IDY1NTM2ICogMjsKKwkJbGltaXQgPSA2NTUzNiAqIDIgLSAoYnVzX2FkZHIgJiAweDFGRkZGKTsKKwl9CisKKwlpZiAoY291bnQgPiBsaW1pdCkKKwkJY291bnQgPSBsaW1pdDsKKworCWlmICgoY291bnQgJiAxKSB8fCAoYnVzX2FkZHIgJiAxKSkKKwkJcGFuaWMoInNjc2klZCA6IGF0dGVtcHRlZCB1bmFsaWduZWQgRE1BIHRyYW5zZmVyXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJCisJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwlkaXNhYmxlX2RtYShpbnN0YW5jZS0+ZG1hX2NoYW5uZWwpOworCWNsZWFyX2RtYV9mZihpbnN0YW5jZS0+ZG1hX2NoYW5uZWwpOworCXNldF9kbWFfYWRkcihpbnN0YW5jZS0+ZG1hX2NoYW5uZWwsIGJ1c19hZGRyKTsKKwlzZXRfZG1hX2NvdW50KGluc3RhbmNlLT5kbWFfY2hhbm5lbCwgY291bnQpOworCXNldF9kbWFfbW9kZShpbnN0YW5jZS0+ZG1hX2NoYW5uZWwsIG1vZGUpOworCWVuYWJsZV9kbWEoaW5zdGFuY2UtPmRtYV9jaGFubmVsKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICoJTkNSNTM4MF9wY19kbWFfd3JpdGVfc2V0dXAJCS0Jc2V0dXAgSVNBIERNQSB3cml0ZQorICoJQGluc3RhbmNlOiBhZGFwdGVyIHRvIHNldCB1cAorICoJQHB0cjogYmxvY2sgdG8gdHJhbnNmZXIgKHZpcnR1YWwgYWRkcmVzcykKKyAqCUBjb3VudDogbnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyCisgKgorICoJUHJvZ3JhbSB0aGUgRE1BIGNvbnRyb2xsZXIgcmVhZHkgdG8gcGVyZm9ybSBhbiBJU0EgRE1BIHdyaXRlIHRvIHRoZQorICoJU0NTSSBjb250cm9sbGVyLgorICoKKyAqCUxvY2tzOiBjYWxsZWQgcm91dGluZXMgdGFrZSBhbmQgcmVsZWFzZSB0aGUgSVNBIERNQSBsb2NrLgorICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBOQ1I1MzgwX3BjX2RtYV93cml0ZV9zZXR1cChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJcmV0dXJuIE5DUjUzODBfcGNfZG1hX3NldHVwKGluc3RhbmNlLCBzcmMsIGNvdW50LCBETUFfTU9ERV9XUklURSk7Cit9CisKKy8qKgorICoJTkNSNTM4MF9wY19kbWFfcmVhZF9zZXR1cAkJLQlzZXR1cCBJU0EgRE1BIHJlYWQKKyAqCUBpbnN0YW5jZTogYWRhcHRlciB0byBzZXQgdXAKKyAqCUBwdHI6IGJsb2NrIHRvIHRyYW5zZmVyICh2aXJ0dWFsIGFkZHJlc3MpCisgKglAY291bnQ6IG51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlcgorICoKKyAqCVByb2dyYW0gdGhlIERNQSBjb250cm9sbGVyIHJlYWR5IHRvIHBlcmZvcm0gYW4gSVNBIERNQSByZWFkIGZyb20gdGhlCisgKglTQ1NJIGNvbnRyb2xsZXIuCisgKgorICoJTG9ja3M6IGNhbGxlZCByb3V0aW5lcyB0YWtlIGFuZCByZWxlYXNlIHRoZSBJU0EgRE1BIGxvY2suCisgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IE5DUjUzODBfcGNfZG1hX3JlYWRfc2V0dXAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgaW50IGNvdW50KQoreworCXJldHVybiBOQ1I1MzgwX3BjX2RtYV9zZXR1cChpbnN0YW5jZSwgc3JjLCBjb3VudCwgRE1BX01PREVfUkVBRCk7Cit9CisKKy8qKgorICoJTkNSNTM4MF9wY19kbWFfcmVzaWR1YWwJCS0JcmV0dXJuIGJ5dGVzIGxlZnQgCisgKglAaW5zdGFuY2U6IGFkYXB0ZXIKKyAqCisgKglSZXBvcnRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgbGVmdCBvdmVyIGFmdGVyIHRoZSBETUEgd2FzIHRlcm1pbmF0ZWQuCisgKgorICoJTG9ja3M6IHRha2VzIGFuZCByZWxlYXNlcyB0aGUgSVNBIERNQSBsb2NrLgorICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBOQ1I1MzgwX3BjX2RtYV9yZXNpZHVhbChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0bXA7CisKKwlmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisJY2xlYXJfZG1hX2ZmKGluc3RhbmNlLT5kbWFfY2hhbm5lbCk7CisJdG1wID0gZ2V0X2RtYV9yZXNpZHVlKGluc3RhbmNlLT5kbWFfY2hhbm5lbCk7CisJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCisJcmV0dXJuIHRtcDsKK30KKyNlbmRpZgkJCQkvKiBkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoX19hbHBoYV9fKSAqLworI2VuZGlmCQkJCS8qIGRlZmluZWQoUkVBTF9ETUEpICAqLworI2VuZGlmCQkJCS8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkJCQkvKiBuZGVmIEFTTSAqLworI2VuZGlmCQkJCS8qIE5DUjUzODBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL05DUjUzQzl4LmMgYi9kcml2ZXJzL3Njc2kvTkNSNTNDOXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzg2NjU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL05DUjUzQzl4LmMKQEAgLTAsMCArMSwzNjQ5IEBACisvKiBOQ1I1M0M5eC5jOiAgR2VuZXJpYyBTQ1NJIGRyaXZlciBjb2RlIGZvciBOQ1I1M0M5eCBjaGlwcy4KKyAqCisgKiBPcmlnaW5hbGx5IGVzcC5jIDogRW5oYW5jZWRTY3NpUHJvY2Vzc29yIFN1biBTQ1NJIGRyaXZlciBjb2RlLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5OCBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCisgKgorICogTW9zdCBETUEgZGVwZW5kZW5jaWVzIHB1dCBpbiBkcml2ZXIgc3BlY2lmaWMgZmlsZXMgYnkgCisgKiBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKQorICoKKyAqIFNldCB1cCB0byB1c2UgZXNwX3JlYWQvZXNwX3dyaXRlIChwcmVwcm9jZXNzb3IgbWFjcm9zIGluIE5DUjUzYzl4LmgpIGJ5CisgKiBUeW1tIFR3aWxsbWFuICh0eW1tQGNvZS5taXNzb3VyaS5lZHUpCisgKi8KKworLyogVE9ETzoKKyAqCisgKiAxKSBNYXliZSBkaXNhYmxlIHBhcml0eSBjaGVja2luZyBpbiBjb25maWcgcmVnaXN0ZXIgb25lIGZvciBTQ1NJMQorICogICAgdGFyZ2V0cy4gIChHaWxtb3JlIHNheXMgcGFyaXR5IGVycm9yIG9uIHRoZSBTQnVzIGNhbiBsb2NrIHVwCisgKiAgICBvbGQgc3VuNGMncykKKyAqIDIpIEFkZCBzdXBwb3J0IGZvciBETUEyIHBpcGVsaW5pbmcuCisgKiAzKSBBZGQgdGFnZ2VkIHF1ZXVlaW5nLgorICogNCkgTWF5YmUgY2hhbmdlIHVzZSBvZiAiZXNwIiB0byBzb21ldGhpbmcgbW9yZSAiTkNSIidpc2guCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgIk5DUjUzQzl4LmgiCisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisvKiBDb21tYW5kIHBoYXNlIGVudW1lcmF0aW9uLiAqLworZW51bSB7CisJbm90X2lzc3VlZCAgICA9IDB4MDAsICAvKiBTdGlsbCBpbiB0aGUgaXNzdWVfU0MgcXVldWUuICAgICAgICAgICovCisKKwkvKiBWYXJpb3VzIGZvcm1zIG9mIHNlbGVjdGluZyBhIHRhcmdldC4gKi8KKyNkZWZpbmUgaW5fc2xjdF9tYXNrICAgIDB4MTAKKwlpbl9zbGN0X25vcm0gID0gMHgxMCwgIC8qIEVTUCBpcyBhcmJpdHJhdGluZywgbm9ybWFsIHNlbGVjdGlvbiAgKi8KKwlpbl9zbGN0X3N0b3AgID0gMHgxMSwgIC8qIEVTUCB3aWxsIHNlbGVjdCwgdGhlbiBzdG9wIHdpdGggSVJRICAgKi8KKwlpbl9zbGN0X21zZyAgID0gMHgxMiwgIC8qIHNlbGVjdCwgdGhlbiBzZW5kIGEgbWVzc2FnZSAgICAgICAgICAgKi8KKwlpbl9zbGN0X3RhZyAgID0gMHgxMywgIC8qIHNlbGVjdCBhbmQgc2VuZCB0YWdnZWQgcXVldWUgbXNnICAgICAgKi8KKwlpbl9zbGN0X3NuZWcgID0gMHgxNCwgIC8qIHNlbGVjdCBhbmQgYWNxdWlyZSBzeW5jIGNhcGFiaWxpdGllcyAgKi8KKworCS8qIEFueSBwb3N0IHNlbGVjdGlvbiBhY3Rpdml0eS4gKi8KKyNkZWZpbmUgaW5fcGhhc2VzX21hc2sgIDB4MjAKKwlpbl9kYXRhaW4gICAgID0gMHgyMCwgIC8qIERhdGEgaXMgdHJhbnNmZXJyaW5nIGZyb20gdGhlIGJ1cyAgICAgKi8KKwlpbl9kYXRhb3V0ICAgID0gMHgyMSwgIC8qIERhdGEgaXMgdHJhbnNmZXJyaW5nIHRvIHRoZSBidXMgICAgICAgKi8KKwlpbl9kYXRhX2RvbmUgID0gMHgyMiwgIC8qIExhc3QgRE1BIGRhdGEgb3BlcmF0aW9uIGRvbmUgKG1heWJlKSAgKi8KKwlpbl9tc2dpbiAgICAgID0gMHgyMywgIC8qIEVhdGluZyBtZXNzYWdlIGZyb20gdGFyZ2V0ICAgICAgICAgICAgKi8KKwlpbl9tc2dpbmNvbnQgID0gMHgyNCwgIC8qIEVhdGluZyBtb3JlIG1zZyBieXRlcyBmcm9tIHRhcmdldCAgICAgKi8KKwlpbl9tc2dpbmRvbmUgID0gMHgyNSwgIC8qIERlY2lkZSB3aGF0IHRvIGRvIHdpdGggd2hhdCB3ZSBnb3QgICAgKi8KKwlpbl9tc2dvdXQgICAgID0gMHgyNiwgIC8qIFNlbmRpbmcgbWVzc2FnZSB0byB0YXJnZXQgICAgICAgICAgICAgKi8KKwlpbl9tc2dvdXRkb25lID0gMHgyNywgIC8qIERvbmUgc2VuZGluZyBtc2cgb3V0ICAgICAgICAgICAgICAgICAgKi8KKwlpbl9jbWRiZWdpbiAgID0gMHgyOCwgIC8qIFNlbmRpbmcgY21kIGFmdGVyIGFibm9ybWFsIHNlbGVjdGlvbiAgKi8KKwlpbl9jbWRlbmQgICAgID0gMHgyOSwgIC8qIERvbmUgc2VuZGluZyBzbG93IGNtZCAgICAgICAgICAgICAgICAgKi8KKwlpbl9zdGF0dXMgICAgID0gMHgyYSwgIC8qIFdhcyBpbiBzdGF0dXMgcGhhc2UsIGZpbmlzaGluZyBjbWQgICAgKi8KKwlpbl9mcmVlaW5nICAgID0gMHgyYiwgIC8qIGZyZWVpbmcgdGhlIGJ1cyBmb3IgY21kIGNtcGx0IG9yIGRpc2MgKi8KKwlpbl90aGVfZGFyayAgID0gMHgyYywgIC8qIERvbid0IGtub3cgd2hhdCBidXMgcGhhc2Ugd2UgYXJlIGluICAgKi8KKworCS8qIFNwZWNpYWwgc3RhdGVzLCBpZS4gbm90IG5vcm1hbCBidXMgdHJhbnNpdGlvbnMuLi4gKi8KKyNkZWZpbmUgaW5fc3BlY19tYXNrICAgIDB4ODAKKwlpbl9hYm9ydG9uZSAgID0gMHg4MCwgIC8qIEFib3J0aW5nIG9uZSBjb21tYW5kIGN1cnJlbnRseSAgICAgICAgKi8KKwlpbl9hYm9ydGFsbCAgID0gMHg4MSwgIC8qIEJsb3dpbmcgYXdheSBhbGwgY29tbWFuZHMgd2UgaGF2ZSAgICAgKi8KKwlpbl9yZXNldGRldiAgID0gMHg4MiwgIC8qIFNDU0kgdGFyZ2V0IHJlc2V0IGluIHByb2dyZXNzICAgICAgICAgKi8KKwlpbl9yZXNldGJ1cyAgID0gMHg4MywgIC8qIFNDU0kgYnVzIHJlc2V0IGluIHByb2dyZXNzICAgICAgICAgICAgKi8KKwlpbl90Z3RlcnJvciAgID0gMHg4NCwgIC8qIFRhcmdldCBkaWQgc29tZXRoaW5nIHN0dXBpZCAgICAgICAgICAgKi8KK307CisKK2VudW0geworCS8qIFplcm8gaGFzIHNwZWNpYWwgbWVhbmluZywgc2VlIHNraXBhaGVhZFsxMl0uICovCisvKjAqLwlkb19uZXZlciwKKworLyoxKi8JZG9fcGhhc2VfZGV0ZXJtaW5lLAorLyoyKi8JZG9fcmVzZXRfYnVzLAorLyozKi8JZG9fcmVzZXRfY29tcGxldGUsCisvKjQqLwlkb193b3JrX2J1cywKKy8qNSovCWRvX2ludHJfZW5kCit9OworCisvKiBUaGUgbWFzdGVyIHJpbmcgb2YgYWxsIGVzcCBob3N0cyB3ZSBhcmUgbWFuYWdpbmcgaW4gdGhpcyBkcml2ZXIuICovCitzdHJ1Y3QgTkNSX0VTUCAqZXNwY2hhaW47CitpbnQgbmVzcHMgPSAwLCBlc3BzX2luX3VzZSA9IDAsIGVzcHNfcnVubmluZyA9IDA7CisKK2lycXJldHVybl90IGVzcF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnByZWdzKTsKKworLyogRGVidWdnaW5nIHJvdXRpbmVzICovCitzdGF0aWMgc3RydWN0IGVzcF9jbWRzdHJpbmdzIHsKKwl1bmNoYXIgY21kY2hhcjsKKwljaGFyICp0ZXh0OworfSBlc3BfY21kX3N0cmluZ3NbXSA9IHsKKwkvKiBNaXNjZWxsYW5lb3VzICovCisJeyBFU1BfQ01EX05VTEwsICJFU1BfTk9QIiwgfSwKKwl7IEVTUF9DTURfRkxVU0gsICJGSUZPX0ZMVVNIIiwgfSwKKwl7IEVTUF9DTURfUkMsICJSU1RFU1AiLCB9LAorCXsgRVNQX0NNRF9SUywgIlJTVFNDU0kiLCB9LAorCS8qIERpc2Nvbm5lY3RlZCBTdGF0ZSBHcm91cCAqLworCXsgRVNQX0NNRF9SU0VMLCAiUkVTTENUU0VRIiwgfSwKKwl7IEVTUF9DTURfU0VMLCAiU0xDVE5BVE4iLCB9LAorCXsgRVNQX0NNRF9TRUxBLCAiU0xDVEFUTiIsIH0sCisJeyBFU1BfQ01EX1NFTEFTLCAiU0xDVEFUTlNUT1AiLCB9LAorCXsgRVNQX0NNRF9FU0VMLCAiRU5TTENUUkVTRUwiLCB9LAorCXsgRVNQX0NNRF9EU0VMLCAiRElTU0VMUkVTRUwiLCB9LAorCXsgRVNQX0NNRF9TQTMsICJTTENUQVROMyIsIH0sCisJeyBFU1BfQ01EX1JTRUwzLCAiUkVTTENUU0VRIiwgfSwKKwkvKiBUYXJnZXQgU3RhdGUgR3JvdXAgKi8KKwl7IEVTUF9DTURfU01TRywgIlNORE1TRyIsIH0sCisJeyBFU1BfQ01EX1NTVEFULCAiU05EU1RBVFVTIiwgfSwKKwl7IEVTUF9DTURfU0RBVEEsICJTTkREQVRBIiwgfSwKKwl7IEVTUF9DTURfRFNFUSwgIkRJU0NTRVEiLCB9LAorCXsgRVNQX0NNRF9UU0VRLCAiVEVSTVNFUSIsIH0sCisJeyBFU1BfQ01EX1RDQ1NFUSwgIlRSR1RDTURDT01QU0VRIiwgfSwKKwl7IEVTUF9DTURfRENOQ1QsICJESVNDIiwgfSwKKwl7IEVTUF9DTURfUk1TRywgIlJDVk1TRyIsIH0sCisJeyBFU1BfQ01EX1JDTUQsICJSQ1ZDTUQiLCB9LAorCXsgRVNQX0NNRF9SREFUQSwgIlJDVkRBVEEiLCB9LAorCXsgRVNQX0NNRF9SQ1NFUSwgIlJDVkNNRFNFUSIsIH0sCisJLyogSW5pdGlhdG9yIFN0YXRlIEdyb3VwICovCisJeyBFU1BfQ01EX1RJLCAiVFJBTlNJTkZPIiwgfSwKKwl7IEVTUF9DTURfSUNDU0VRLCAiSU5JQ01EU0VRQ09NUCIsIH0sCisJeyBFU1BfQ01EX01PSywgIk1TR0FDQ0VQVEVEIiwgfSwKKwl7IEVTUF9DTURfVFBBRCwgIlRQQUQiLCB9LAorCXsgRVNQX0NNRF9TQVROLCAiU0FUTiIsIH0sCisJeyBFU1BfQ01EX1JBVE4sICJSQVROIiwgfSwKK307CisjZGVmaW5lIE5VTV9FU1BfQ09NTUFORFMgICgoc2l6ZW9mKGVzcF9jbWRfc3RyaW5ncykpIC8gKHNpemVvZihzdHJ1Y3QgZXNwX2NtZHN0cmluZ3MpKSkKKworLyogUHJpbnQgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiBhbiBFU1AgY29tbWFuZCAqLworc3RhdGljIGlubGluZSB2b2lkIGVzcF9wcmludF9jbWQodW5jaGFyIGVzcGNtZCkKK3sKKwl1bmNoYXIgZG1hX2JpdCA9IGVzcGNtZCAmIEVTUF9DTURfRE1BOworCWludCBpOworCisJZXNwY21kICY9IH5kbWFfYml0OworCWZvcihpPTA7IGk8TlVNX0VTUF9DT01NQU5EUzsgaSsrKQorCQlpZihlc3BfY21kX3N0cmluZ3NbaV0uY21kY2hhciA9PSBlc3BjbWQpCisJCQlicmVhazsKKwlpZihpPT1OVU1fRVNQX0NPTU1BTkRTKQorCQlwcmludGsoIkVTUF9Vbmtub3duIik7CisJZWxzZQorCQlwcmludGsoIiVzJXMiLCBlc3BfY21kX3N0cmluZ3NbaV0udGV4dCwKKwkJICAgICAgICgoZG1hX2JpdCkgPyAiK0RNQSIgOiAiIikpOworfQorCisvKiBQcmludCB0aGUgc3RhdHVzIHJlZ2lzdGVyJ3MgdmFsdWUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlc3BfcHJpbnRfc3RhdHJlZyh1bmNoYXIgc3RhdHJlZykKK3sKKwl1bmNoYXIgcGhhc2U7CisKKwlwcmludGsoIlNUQVRVUzwiKTsKKwlwaGFzZSA9IHN0YXRyZWcgJiBFU1BfU1RBVF9QTUFTSzsKKwlwcmludGsoIiVzLCIsIChwaGFzZSA9PSBFU1BfRE9QID8gIkRBVEEtT1VUIiA6CisJCSAgICAgICAocGhhc2UgPT0gRVNQX0RJUCA/ICJEQVRBLUlOIiA6CisJCQkocGhhc2UgPT0gRVNQX0NNRFAgPyAiQ09NTUFORCIgOgorCQkJIChwaGFzZSA9PSBFU1BfU1RBVFAgPyAiU1RBVFVTIiA6CisJCQkgIChwaGFzZSA9PSBFU1BfTU9QID8gIk1TRy1PVVQiIDoKKwkJCSAgIChwaGFzZSA9PSBFU1BfTUlQID8gIk1TR19JTiIgOgorCQkJICAgICJ1bmtub3duIikpKSkpKSk7CisJaWYoc3RhdHJlZyAmIEVTUF9TVEFUX1RET05FKQorCQlwcmludGsoIlRSQU5TX0RPTkUsIik7CisJaWYoc3RhdHJlZyAmIEVTUF9TVEFUX1RDTlQpCisJCXByaW50aygiVENPVU5UX1pFUk8sIik7CisJaWYoc3RhdHJlZyAmIEVTUF9TVEFUX1BFUlIpCisJCXByaW50aygiUF9FUlJPUiwiKTsKKwlpZihzdGF0cmVnICYgRVNQX1NUQVRfU1BBTSkKKwkJcHJpbnRrKCJTUEFNLCIpOworCWlmKHN0YXRyZWcgJiBFU1BfU1RBVF9JTlRSKQorCQlwcmludGsoIklSUSwiKTsKKwlwcmludGsoIj4iKTsKK30KKworLyogUHJpbnQgdGhlIGludGVycnVwdCByZWdpc3RlcidzIHZhbHVlICovCitzdGF0aWMgaW5saW5lIHZvaWQgZXNwX3ByaW50X2lyZWcodW5jaGFyIGludHJlZykKK3sKKwlwcmludGsoIklOVFJFRzwgIik7CisJaWYoaW50cmVnICYgRVNQX0lOVFJfUykKKwkJcHJpbnRrKCJTTENUX05BVE4gIik7CisJaWYoaW50cmVnICYgRVNQX0lOVFJfU0FUTikKKwkJcHJpbnRrKCJTTENUX0FUTiAiKTsKKwlpZihpbnRyZWcgJiBFU1BfSU5UUl9SU0VMKQorCQlwcmludGsoIlJTTENUICIpOworCWlmKGludHJlZyAmIEVTUF9JTlRSX0ZET05FKQorCQlwcmludGsoIkZET05FICIpOworCWlmKGludHJlZyAmIEVTUF9JTlRSX0JTRVJWKQorCQlwcmludGsoIkJTRVJWICIpOworCWlmKGludHJlZyAmIEVTUF9JTlRSX0RDKQorCQlwcmludGsoIkRJU0NOQ1QgIik7CisJaWYoaW50cmVnICYgRVNQX0lOVFJfSUMpCisJCXByaW50aygiSUxMX0NNRCAiKTsKKwlpZihpbnRyZWcgJiBFU1BfSU5UUl9TUikKKwkJcHJpbnRrKCJTQ1NJX0JVU19SRVNFVCAiKTsKKwlwcmludGsoIj4iKTsKK30KKworLyogUHJpbnQgdGhlIHNlcXVlbmNlIHN0ZXAgcmVnaXN0ZXJzIGNvbnRlbnRzICovCitzdGF0aWMgaW5saW5lIHZvaWQgZXNwX3ByaW50X3NlcXJlZyh1bmNoYXIgc3RlcHJlZykKK3sKKwlzdGVwcmVnICY9IEVTUF9TVEVQX1ZCSVRTOworCXByaW50aygiU1RFUDwlcz4iLAorCSAgICAgICAoc3RlcHJlZyA9PSBFU1BfU1RFUF9BU0VMID8gIlNMQ1RfQVJCX0NNUExUIiA6CisJCShzdGVwcmVnID09IEVTUF9TVEVQX1NJRCA/ICIxQllURV9NU0dfU0VOVCIgOgorCQkgKHN0ZXByZWcgPT0gRVNQX1NURVBfTkNNRCA/ICJOT1RfSU5fQ01EX1BIQVNFIiA6CisJCSAgKHN0ZXByZWcgPT0gRVNQX1NURVBfUFBDID8gIkNNRF9CWVRFU19MT1NUIiA6CisJCSAgIChzdGVwcmVnID09IEVTUF9TVEVQX0ZJTkk0ID8gIkNNRF9TRU5UX09LIiA6CisJCSAgICAiVU5LTk9XTiIpKSkpKSk7Cit9CisKK3N0YXRpYyBjaGFyICpwaGFzZV9zdHJpbmcoaW50IHBoYXNlKQoreworCXN3aXRjaChwaGFzZSkgeworCWNhc2Ugbm90X2lzc3VlZDoKKwkJcmV0dXJuICJVTklTU1VFRCI7CisJY2FzZSBpbl9zbGN0X25vcm06CisJCXJldHVybiAiU0xDVE5PUk0iOworCWNhc2UgaW5fc2xjdF9zdG9wOgorCQlyZXR1cm4gIlNMQ1RTVE9QIjsKKwljYXNlIGluX3NsY3RfbXNnOgorCQlyZXR1cm4gIlNMQ1RNU0ciOworCWNhc2UgaW5fc2xjdF90YWc6CisJCXJldHVybiAiU0xDVFRBRyI7CisJY2FzZSBpbl9zbGN0X3NuZWc6CisJCXJldHVybiAiU0xDVFNORUciOworCWNhc2UgaW5fZGF0YWluOgorCQlyZXR1cm4gIkRBVEFJTiI7CisJY2FzZSBpbl9kYXRhb3V0OgorCQlyZXR1cm4gIkRBVEFPVVQiOworCWNhc2UgaW5fZGF0YV9kb25lOgorCQlyZXR1cm4gIkRBVEFET05FIjsKKwljYXNlIGluX21zZ2luOgorCQlyZXR1cm4gIk1TR0lOIjsKKwljYXNlIGluX21zZ2luY29udDoKKwkJcmV0dXJuICJNU0dJTkNPTlQiOworCWNhc2UgaW5fbXNnaW5kb25lOgorCQlyZXR1cm4gIk1TR0lORE9ORSI7CisJY2FzZSBpbl9tc2dvdXQ6CisJCXJldHVybiAiTVNHT1VUIjsKKwljYXNlIGluX21zZ291dGRvbmU6CisJCXJldHVybiAiTVNHT1VURE9ORSI7CisJY2FzZSBpbl9jbWRiZWdpbjoKKwkJcmV0dXJuICJDTURCRUdJTiI7CisJY2FzZSBpbl9jbWRlbmQ6CisJCXJldHVybiAiQ01ERU5EIjsKKwljYXNlIGluX3N0YXR1czoKKwkJcmV0dXJuICJTVEFUVVMiOworCWNhc2UgaW5fZnJlZWluZzoKKwkJcmV0dXJuICJGUkVFSU5HIjsKKwljYXNlIGluX3RoZV9kYXJrOgorCQlyZXR1cm4gIkNMVUVMRVNTIjsKKwljYXNlIGluX2Fib3J0b25lOgorCQlyZXR1cm4gIkFCT1JUT05FIjsKKwljYXNlIGluX2Fib3J0YWxsOgorCQlyZXR1cm4gIkFCT1JUQUxMIjsKKwljYXNlIGluX3Jlc2V0ZGV2OgorCQlyZXR1cm4gIlJFU0VUREVWIjsKKwljYXNlIGluX3Jlc2V0YnVzOgorCQlyZXR1cm4gIlJFU0VUQlVTIjsKKwljYXNlIGluX3RndGVycm9yOgorCQlyZXR1cm4gIlRHVEVSUk9SIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIlVOS05PV04iOworCX07Cit9CisKKyNpZmRlZiBERUJVR19TVEFURV9NQUNISU5FCitzdGF0aWMgaW5saW5lIHZvaWQgZXNwX2FkdmFuY2VfcGhhc2UoU2NzaV9DbW5kICpzLCBpbnQgbmV3cGhhc2UpCit7CisJRVNQTE9HKCgiPCVzPiIsIHBoYXNlX3N0cmluZyhuZXdwaGFzZSkpKTsKKwlzLT5TQ3Auc2VudF9jb21tYW5kID0gcy0+U0NwLnBoYXNlOworCXMtPlNDcC5waGFzZSA9IG5ld3BoYXNlOworfQorI2Vsc2UKKyNkZWZpbmUgZXNwX2FkdmFuY2VfcGhhc2UoX19zLCBfX25ld3BoYXNlKSBcCisJKF9fcyktPlNDcC5zZW50X2NvbW1hbmQgPSAoX19zKS0+U0NwLnBoYXNlOyBcCisJKF9fcyktPlNDcC5waGFzZSA9IChfX25ld3BoYXNlKTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfRVNQX0NNRFMKK3N0YXRpYyBpbmxpbmUgdm9pZCBlc3BfY21kKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MsCisJCQkgICB1bmNoYXIgY21kKQoreworCWVzcC0+ZXNwY21kbG9nW2VzcC0+ZXNwY21kZW50XSA9IGNtZDsKKwllc3AtPmVzcGNtZGVudCA9IChlc3AtPmVzcGNtZGVudCArIDEpICYgMzE7CisJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY21uZCwgY21kKTsKK30KKyNlbHNlCisjZGVmaW5lIGVzcF9jbWQoX19lc3AsIF9fZXJlZ3MsIF9fY21kKQllc3Bfd3JpdGUoKF9fZXJlZ3MpLT5lc3BfY21uZCwgKF9fY21kKSkKKyNlbmRpZgorCisvKiBIb3cgd2UgdXNlIHRoZSB2YXJpb3VzIExpbnV4IFNDU0kgZGF0YSBzdHJ1Y3R1cmVzIGZvciBvcGVyYXRpb24uCisgKgorICogc3RydWN0IHNjc2lfY21uZDoKKyAqCisgKiAgIFdlIGtlZXAgdHJhY2sgb2YgdGhlIHN5bmNyb25vdXMgY2FwYWJpbGl0aWVzIG9mIGEgdGFyZ2V0CisgKiAgIGluIHRoZSBkZXZpY2UgbWVtYmVyLCB1c2luZyBzeW5jX21pbl9wZXJpb2QgYW5kCisgKiAgIHN5bmNfbWF4X29mZnNldC4gIFRoZXNlIGFyZSB0aGUgdmFsdWVzIHdlIGRpcmVjdGx5IHdyaXRlCisgKiAgIGludG8gdGhlIEVTUCByZWdpc3RlcnMgd2hpbGUgcnVubmluZyBhIGNvbW1hbmQuICBJZiBvZmZzZXQKKyAqICAgaXMgemVybyB0aGUgRVNQIHdpbGwgdXNlIGFzeW5jaHJvbm91cyB0cmFuc2ZlcnMuCisgKiAgIElmIHRoZSBib3JrZW4gZmxhZyBpcyBzZXQgd2UgYXNzdW1lIHdlIHNob3VsZG4ndCBldmVuIGJvdGhlcgorICogICB0cnlpbmcgdG8gbmVnb3RpYXRlIGZvciBzeW5jaHJvbm91cyB0cmFuc2ZlciBhcyB0aGlzIHRhcmdldAorICogICBpcyByZWFsbHkgc3R1cGlkLiAgSWYgd2Ugbm90aWNlIHRoZSB0YXJnZXQgaXMgZHJvcHBpbmcgdGhlCisgKiAgIGJ1cywgYW5kIHdlIGhhdmUgYmVlbiBhbGxvd2luZyBpdCB0byBkaXNjb25uZWN0LCB3ZSBjbGVhcgorICogICB0aGUgZGlzY29ubmVjdCBmbGFnLgorICovCisKKy8qIE1hbmlwdWxhdGlvbiBvZiB0aGUgRVNQIGNvbW1hbmQgcXVldWVzLiAgVGhhbmtzIHRvIHRoZSBhaGExNTJ4IGRyaXZlcgorICogYW5kIGl0cyBhdXRob3IsIEp1ZXJnZW4gRS4gRmlzY2hlciwgZm9yIHRoZSBtZXRob2RzIHVzZWQgaGVyZS4KKyAqIE5vdGUgdGhhdCB0aGVzZSBhcmUgcGVyLUVTUCBxdWV1ZXMsIG5vdCBnbG9iYWwgcXVldWVzIGxpa2UKKyAqIHRoZSBhaGExNTJ4IGRyaXZlciB1c2VzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXBwZW5kX1NDKFNjc2lfQ21uZCAqKlNDLCBTY3NpX0NtbmQgKm5ld19TQykKK3sKKwlTY3NpX0NtbmQgKmVuZDsKKworCW5ld19TQy0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopIE5VTEw7CisJaWYoISpTQykKKwkJKlNDID0gbmV3X1NDOworCWVsc2UgeworCQlmb3IoZW5kPSpTQztlbmQtPmhvc3Rfc2NyaWJibGU7ZW5kPShTY3NpX0NtbmQgKillbmQtPmhvc3Rfc2NyaWJibGUpCisJCQk7CisJCWVuZC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopIG5ld19TQzsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVwZW5kX1NDKFNjc2lfQ21uZCAqKlNDLCBTY3NpX0NtbmQgKm5ld19TQykKK3sKKwluZXdfU0MtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSAqU0M7CisJKlNDID0gbmV3X1NDOworfQorCitzdGF0aWMgaW5saW5lIFNjc2lfQ21uZCAqcmVtb3ZlX2ZpcnN0X1NDKFNjc2lfQ21uZCAqKlNDKQoreworCVNjc2lfQ21uZCAqcHRyOworCisJcHRyID0gKlNDOworCWlmKHB0cikKKwkJKlNDID0gKFNjc2lfQ21uZCAqKSAoKlNDKS0+aG9zdF9zY3JpYmJsZTsKKwlyZXR1cm4gcHRyOworfQorCitzdGF0aWMgaW5saW5lIFNjc2lfQ21uZCAqcmVtb3ZlX1NDKFNjc2lfQ21uZCAqKlNDLCBpbnQgdGFyZ2V0LCBpbnQgbHVuKQoreworCVNjc2lfQ21uZCAqcHRyLCAqcHJldjsKKworCWZvcihwdHIgPSAqU0MsIHByZXYgPSBOVUxMOworCSAgICBwdHIgJiYgKChwdHItPmRldmljZS0+aWQgIT0gdGFyZ2V0KSB8fCAocHRyLT5kZXZpY2UtPmx1biAhPSBsdW4pKTsKKwkgICAgcHJldiA9IHB0ciwgcHRyID0gKFNjc2lfQ21uZCAqKSBwdHItPmhvc3Rfc2NyaWJibGUpCisJCTsKKwlpZihwdHIpIHsKKwkJaWYocHJldikKKwkJCXByZXYtPmhvc3Rfc2NyaWJibGU9cHRyLT5ob3N0X3NjcmliYmxlOworCQllbHNlCisJCQkqU0M9KFNjc2lfQ21uZCAqKXB0ci0+aG9zdF9zY3JpYmJsZTsKKwl9CisJcmV0dXJuIHB0cjsKK30KKworLyogUmVzZXR0aW5nIHZhcmlvdXMgcGllY2VzIG9mIHRoZSBFU1Agc2NzaSBkcml2ZXIgY2hpcHNldCAqLworCisvKiBSZXNldCB0aGUgRVNQIGNoaXAsIF9ub3RfIHRoZSBTQ1NJIGJ1cy4gKi8KK3N0YXRpYyB2b2lkIGVzcF9yZXNldF9lc3Aoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncykKK3sKKwlpbnQgZmFtaWx5X2NvZGUsIHZlcnNpb24sIGk7CisJdm9sYXRpbGUgaW50IHRyYXNoOworCisJLyogTm93IHJlc2V0IHRoZSBFU1AgY2hpcCAqLworCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9SQyk7CisJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX05VTEwgfCBFU1BfQ01EX0RNQSk7CisJaWYoZXNwLT5lcmV2ID09IGZhc3QpCisJCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzIsIEVTUF9DT05GSUcyX0ZFTkFCKTsKKwllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfTlVMTCB8IEVTUF9DTURfRE1BKTsKKworCS8qIFRoaXMgaXMgdGhlIG9ubHkgcG9pbnQgYXQgd2hpY2ggaXQgaXMgcmVsaWFibGUgdG8gcmVhZAorCSAqIHRoZSBJRC1jb2RlIGZvciBhIGZhc3QgRVNQIGNoaXAgdmFyaWFudC4KKwkgKi8KKwllc3AtPm1heF9wZXJpb2QgPSAoKDM1ICogZXNwLT5jY3ljbGUpIC8gMTAwMCk7CisJaWYoZXNwLT5lcmV2ID09IGZhc3QpIHsKKwkJY2hhciAqZXJldjJzdHJpbmdbXSA9IHsKKwkJCSJFbXVsZXggRkFTMjM2IiwKKwkJCSJFbXVsZXggRlBFU1AxMDBBIiwKKwkJCSJmYXN0IiwKKwkJCSJRTG9naWMgRkFTMzY2IiwKKwkJCSJFbXVsZXggRkFTMjE2IiwKKwkJCSJTeW1iaW9zIExvZ2ljIDUzQ0Y5eC0yIiwKKwkJCSJ1bmtub3duISIKKwkJfTsKKwkJCQorCQl2ZXJzaW9uID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF91aWQpOworCQlmYW1pbHlfY29kZSA9ICh2ZXJzaW9uICYgMHhmOCkgPj4gMzsKKwkJaWYoZmFtaWx5X2NvZGUgPT0gMHgwMikgeworCQkgICAgICAgIGlmICgodmVyc2lvbiAmIDcpID09IDIpCisJCQkgICAgICAgIGVzcC0+ZXJldiA9IGZhczIxNjsJCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisJCQkgICAgICAgIGVzcC0+ZXJldiA9IGZhczIzNjsKKwkJfSBlbHNlIGlmKGZhbWlseV9jb2RlID09IDB4MGEpCisJCQllc3AtPmVyZXYgPSBmYXMzNjY7IC8qIFZlcnNpb24gaXMgdXN1YWxseSAnNScuICovCisJCWVsc2UgaWYoZmFtaWx5X2NvZGUgPT0gMHgwMCkgeworCQkJaWYgKCh2ZXJzaW9uICYgNykgPT0gMikKKwkJCQllc3AtPmVyZXYgPSBmYXMxMDBhOyAvKiBOQ1I1M0M5WCAqLworCQkJZWxzZQorCQkJCWVzcC0+ZXJldiA9IGVzcHVua25vd247CisJCX0gZWxzZSBpZihmYW1pbHlfY29kZSA9PSAweDE0KSB7CisJCQlpZiAoKHZlcnNpb24gJiA3KSA9PSAyKQorCQkJCWVzcC0+ZXJldiA9IGZzYzsKKwkJICAgICAgICBlbHNlCisJCQkJZXNwLT5lcmV2ID0gZXNwdW5rbm93bjsKKwkJfSBlbHNlIGlmKGZhbWlseV9jb2RlID09IDB4MDApIHsKKwkJCWlmICgodmVyc2lvbiAmIDcpID09IDIpCisJCQkJZXNwLT5lcmV2ID0gZmFzMTAwYTsgLyogTkNSNTNDOVggKi8KKwkJCWVsc2UKKwkJCQllc3AtPmVyZXYgPSBlc3B1bmtub3duOworCQl9IGVsc2UKKwkJCWVzcC0+ZXJldiA9IGVzcHVua25vd247CisJCUVTUExPRygoImVzcCVkOiBGQVNUIGNoaXAgaXMgJXMgKGZhbWlseT0lZCwgdmVyc2lvbj0lZClcbiIsCisJCQllc3AtPmVzcF9pZCwgZXJldjJzdHJpbmdbZXNwLT5lcmV2IC0gZmFzMjM2XSwKKwkJCWZhbWlseV9jb2RlLCAodmVyc2lvbiAmIDcpKSk7CisKKwkJZXNwLT5taW5fcGVyaW9kID0gKCg0ICogZXNwLT5jY3ljbGUpIC8gMTAwMCk7CisJfSBlbHNlIHsKKwkJZXNwLT5taW5fcGVyaW9kID0gKCg1ICogZXNwLT5jY3ljbGUpIC8gMTAwMCk7CisJfQorCisJLyogUmVsb2FkIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmYWN0LCBlc3AtPmNmYWN0KTsKKwllc3AtPnByZXZfc3RwID0gMDsKKwllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9zdHAsIDApOworCWVzcC0+cHJldl9zb2ZmID0gMDsKKwllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9zb2ZmLCAwKTsKKwllc3Bfd3JpdGUoZXJlZ3MtPmVzcF90aW1lbywgZXNwLT5uZWdfZGVmcCk7CisJZXNwLT5tYXhfcGVyaW9kID0gKGVzcC0+bWF4X3BlcmlvZCArIDMpPj4yOworCWVzcC0+bWluX3BlcmlvZCA9IChlc3AtPm1pbl9wZXJpb2QgKyAzKT4+MjsKKworCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzEsIGVzcC0+Y29uZmlnMSk7CisJc3dpdGNoKGVzcC0+ZXJldikgeworCWNhc2UgZXNwMTAwOgorCQkvKiBub3RoaW5nIHRvIGRvICovCisJCWJyZWFrOworCWNhc2UgZXNwMTAwYToKKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMiwgZXNwLT5jb25maWcyKTsKKwkJYnJlYWs7CisJY2FzZSBlc3AyMzY6CisJCS8qIFNsb3cgMjM2ICovCisJCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzIsIGVzcC0+Y29uZmlnMik7CisJCWVzcC0+cHJldl9jZmczID0gZXNwLT5jb25maWczWzBdOworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmczLCBlc3AtPnByZXZfY2ZnMyk7CisJCWJyZWFrOworCWNhc2UgZmFzMzY2OgorCQlwYW5pYygiZXNwOiBGQVMzNjYgc3VwcG9ydCBub3QgcHJlc2VudCwgcGxlYXNlIG5vdGlmeSAiCisJCSAgICAgICJqb25na0Bjcy51dHdlbnRlLm5sIik7CisJCWJyZWFrOworCWNhc2UgZmFzMjE2OgorCWNhc2UgZmFzMjM2OgorCWNhc2UgZnNjOgorCQkvKiBGYXN0IEVTUCB2YXJpYW50cyAqLworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmcyLCBlc3AtPmNvbmZpZzIpOworCQlmb3IoaT0wOyBpPDg7IGkrKykKKwkJCWVzcC0+Y29uZmlnM1tpXSB8PSBFU1BfQ09ORklHM19GQ0xLOworCQllc3AtPnByZXZfY2ZnMyA9IGVzcC0+Y29uZmlnM1swXTsKKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMywgZXNwLT5wcmV2X2NmZzMpOworCQlpZihlc3AtPmRpZmYpCisJCQllc3AtPnJhZGVsYXkgPSAwOworCQllbHNlCisJCQllc3AtPnJhZGVsYXkgPSAxNjsKKwkJLyogRGlmZmVyZW50IHRpbWVvdXQgY29uc3RhbnQgZm9yIHRoZXNlIGNoaXBzICovCisJCWVzcC0+bmVnX2RlZnAgPQorCQkJRlNDX05FR19ERUZQKGVzcC0+Y2ZyZXEsCisJCQkJICAgICAoZXNwLT5jZmFjdCA9PSBFU1BfQ0NGX0YwID8KKwkJCQkgICAgICBFU1BfQ0NGX0Y3ICsgMSA6IGVzcC0+Y2ZhY3QpKTsKKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfdGltZW8sIGVzcC0+bmVnX2RlZnApOworCQkvKiBFbmFibGUgQWN0aXZlIE5lZ290aWF0aW9uIGlmIHBvc3NpYmxlICovCisJCWlmKChlc3AtPmVyZXYgPT0gZnNjKSAmJiAhZXNwLT5kaWZmKQorCQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnNCwgRVNQX0NPTkZJRzRfRUFOKTsKKwkJYnJlYWs7CisJY2FzZSBmYXMxMDBhOgorCQkvKiBGYXN0IDEwMGEgKi8KKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMiwgZXNwLT5jb25maWcyKTsKKwkJZm9yKGk9MDsgaTw4OyBpKyspCisJCQllc3AtPmNvbmZpZzNbaV0gfD0gRVNQX0NPTkZJRzNfRkNMT0NLOworCQllc3AtPnByZXZfY2ZnMyA9IGVzcC0+Y29uZmlnM1swXTsKKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMywgZXNwLT5wcmV2X2NmZzMpOworCQllc3AtPnJhZGVsYXkgPSAzMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGFuaWMoImVzcDogd2hhdCBjb3VsZCBpdCBiZS4uLiBJIHdvbmRlci4uLiIpOworCQlicmVhazsKKwl9OworCisJLyogRWF0IGFueSBiaXRyb3QgaW4gdGhlIGNoaXAgKi8KKwl0cmFzaCA9IGVzcF9yZWFkKGVyZWdzLT5lc3BfaW50cnB0KTsKKwl1ZGVsYXkoMTAwKTsKK30KKworLyogVGhpcyBwbGFjZXMgdGhlIEVTUCBpbnRvIGEga25vd24gc3RhdGUgYXQgYm9vdCB0aW1lLiAqLwordm9pZCBlc3BfYm9vdHVwX3Jlc2V0KHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJdm9sYXRpbGUgdW5jaGFyIHRyYXNoOworCisJLyogUmVzZXQgdGhlIERNQSAqLworCWlmKGVzcC0+ZG1hX3Jlc2V0KQorCQllc3AtPmRtYV9yZXNldChlc3ApOworCisJLyogUmVzZXQgdGhlIEVTUCAqLworCWVzcF9yZXNldF9lc3AoZXNwLCBlcmVncyk7CisKKwkvKiBSZXNldCB0aGUgU0NTSSBidXMsIGJ1dCB0ZWxsIEVTUCBub3QgdG8gZ2VuZXJhdGUgYW4gaXJxICovCisJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMSwgKGVzcF9yZWFkKGVyZWdzLT5lc3BfY2ZnMSkgfCBFU1BfQ09ORklHMV9TUlJESVNBQikpOworCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9SUyk7CisJdWRlbGF5KDQwMCk7CisJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMSwgZXNwLT5jb25maWcxKTsKKworCS8qIEVhdCBhbnkgYml0cm90IGluIHRoZSBjaGlwIGFuZCB3ZSBhcmUgZG9uZS4uLiAqLworCXRyYXNoID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9pbnRycHQpOworfQorCisvKiBBbGxvY2F0ZSBzdHJ1Y3R1cmUgYW5kIGluc2VydCBiYXNpYyBkYXRhIHN1Y2ggYXMgU0NTSSBjaGlwIGZyZXF1ZW5jeQorICogZGF0YSBhbmQgYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UKKyAqLworc3RydWN0IE5DUl9FU1AqIGVzcF9hbGxvY2F0ZShTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQsIHZvaWQgKmVzcF9kZXYpCit7CisJc3RydWN0IE5DUl9FU1AgKmVzcCwgKmVsaW5rOworCXN0cnVjdCBTY3NpX0hvc3QgKmVzcF9ob3N0OworCisJZXNwX2hvc3QgPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIHNpemVvZihzdHJ1Y3QgTkNSX0VTUCkpOworCWlmKCFlc3BfaG9zdCkKKwkJcGFuaWMoIkNhbm5vdCByZWdpc3RlciBFU1AgU0NTSSBob3N0Iik7CisJZXNwID0gKHN0cnVjdCBOQ1JfRVNQICopIGVzcF9ob3N0LT5ob3N0ZGF0YTsKKwlpZighZXNwKQorCQlwYW5pYygiTm8gZXNwIGluIGhvc3RkYXRhIik7CisJZXNwLT5laG9zdCA9IGVzcF9ob3N0OworCWVzcC0+ZWRldiA9IGVzcF9kZXY7CisJZXNwLT5lc3BfaWQgPSBuZXNwcysrOworCisJLyogU2V0IGJpdHNoaWZ0IHZhbHVlIChvbmx5IHVzZWQgb24gQW1pZ2Egd2l0aCBtdWx0aXBsZSBFU1BzKSAqLworCWVzcC0+c2hpZnQgPSAyOworCisJLyogUHV0IGludG8gdGhlIGNoYWluIG9mIGVzcCBjaGlwcyBkZXRlY3RlZCAqLworCWlmKGVzcGNoYWluKSB7CisJCWVsaW5rID0gZXNwY2hhaW47CisJCXdoaWxlKGVsaW5rLT5uZXh0KSBlbGluayA9IGVsaW5rLT5uZXh0OworCQllbGluay0+bmV4dCA9IGVzcDsKKwl9IGVsc2UgeworCQllc3BjaGFpbiA9IGVzcDsKKwl9CisJZXNwLT5uZXh0ID0gTlVMTDsKKworCXJldHVybiBlc3A7Cit9CisKK3ZvaWQgZXNwX2RlYWxsb2NhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlzdHJ1Y3QgTkNSX0VTUCAqZWxpbms7CisKKwlpZihlc3BjaGFpbiA9PSBlc3ApIHsKKwkJZXNwY2hhaW4gPSBOVUxMOworCX0gZWxzZSB7CisJCWZvcihlbGluayA9IGVzcGNoYWluOyBlbGluayAmJiAoZWxpbmstPm5leHQgIT0gZXNwKTsgZWxpbmsgPSBlbGluay0+bmV4dCk7CisJCWlmKGVsaW5rKSAKKwkJCWVsaW5rLT5uZXh0ID0gZXNwLT5uZXh0OworCX0KKwluZXNwcy0tOworfQorCisvKiBDb21wbGV0ZSBpbml0aWFsaXphdGlvbiBvZiBFU1Agc3RydWN0dXJlIGFuZCBkZXZpY2UKKyAqIENhbGxlciBtdXN0IGhhdmUgaW5pdGlhbGl6ZWQgYXBwcm9wcmlhdGUgcGFydHMgb2YgdGhlIEVTUCBzdHJ1Y3R1cmUKKyAqIGJldHdlZW4gdGhlIGNhbGwgdG8gZXNwX2FsbG9jYXRlIGFuZCB0aGlzIGZ1bmN0aW9uLgorICovCit2b2lkIGVzcF9pbml0aWFsaXplKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJc3RydWN0IEVTUF9yZWdzICplcmVncyA9IGVzcC0+ZXJlZ3M7CisJdW5zaWduZWQgaW50IGZtaHo7CisJdW5jaGFyIGNjZjsKKwlpbnQgaTsKKwkKKwkvKiBDaGVjayBvdXQgdGhlIGNsb2NrIHByb3BlcnRpZXMgb2YgdGhlIGNoaXAuICovCisKKwkvKiBUaGlzIGlzIGdldHRpbmcgbWVzc3kgYnV0IGl0IGhhcyB0byBiZSBkb25lCisJICogY29ycmVjdGx5IG9yIGVsc2UgeW91IGdldCB3ZWlyZCBiZWhhdmlvciBhbGwKKwkgKiBvdmVyIHRoZSBwbGFjZS4gIFdlIGFyZSB0cnlpbmcgdG8gYmFzaWNhbGx5CisJICogZmlndXJlIG91dCB0aHJlZSBwaWVjZXMgb2YgaW5mb3JtYXRpb24uCisJICoKKwkgKiBhKSBDbG9jayBDb252ZXJzaW9uIEZhY3RvcgorCSAqCisJICogICAgVGhpcyBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnB1dAorCSAqICAgIGNyeXN0YWwgY2xvY2sgZnJlcXVlbmN5IGdvaW5nIGludG8gdGhlCisJICogICAgRVNQIG9uIHRoaXMgbWFjaGluZS4gIEFueSBvcGVyYXRpb24gd2hvc2UKKwkgKiAgICB0aW1pbmcgaXMgbG9uZ2VyIHRoYW4gNDAwbnMgZGVwZW5kcyBvbiB0aGlzCisJICogICAgdmFsdWUgYmVpbmcgY29ycmVjdC4gIEZvciBleGFtcGxlLCB5b3UnbGwKKwkgKiAgICBnZXQgYmxpcHMgZm9yIGFyYml0cmF0aW9uL3NlbGVjdGlvbiBkdXJpbmcKKwkgKiAgICBoaWdoIGxvYWQgb3Igd2l0aCBtdWx0aXBsZSB0YXJnZXRzIGlmIHRoaXMKKwkgKiAgICBpcyBub3Qgc2V0IGNvcnJlY3RseS4KKwkgKgorCSAqIGIpIFNlbGVjdGlvbiBUaW1lLU91dAorCSAqCisJICogICAgVGhlIEVTUCBpc24ndCB2ZXJ5IGJyaWdodCBhbmQgd2lsbCBhcmJpdHJhdGUKKwkgKiAgICBmb3IgdGhlIGJ1cyBhbmQgdHJ5IHRvIHNlbGVjdCBhIHRhcmdldAorCSAqICAgIGZvcmV2ZXIgaWYgeW91IGxldCBpdC4gIFRoaXMgdmFsdWUgdGVsbHMKKwkgKiAgICB0aGUgRVNQIHdoZW4gaXQgaGFzIHRha2VuIHRvbyBsb25nIHRvCisJICogICAgbmVnb3RpYXRlIGFuZCB0aGF0IGl0IHNob3VsZCBpbnRlcnJ1cHQKKwkgKiAgICB0aGUgQ1BVIHNvIHdlIGNhbiBzZWUgd2hhdCBoYXBwZW5lZC4KKwkgKiAgICBUaGUgdmFsdWUgaXMgY29tcHV0ZWQgYXMgZm9sbG93cyAoZnJvbQorCSAqICAgIE5DUi9TeW1iaW9zIGNoaXAgZG9jcykuCisJICoKKwkgKiAgICAgICAgICAoVGltZSBPdXQgUGVyaW9kKSAqICAoSW5wdXQgQ2xvY2spCisJICogICAgU1RPID0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqICAgICAgICAgICg4MTkyKSAqIChDbG9jayBDb252ZXJzaW9uIEZhY3RvcikKKwkgKgorCSAqICAgIFlvdSB1c3VhbGx5IHdhbnQgdGhlIHRpbWUgb3V0IHBlcmlvZCB0byBiZQorCSAqICAgIGFyb3VuZCAyNTBtcywgSSB0aGluayB3ZSdsbCBzZXQgaXQgYSBsaXR0bGUKKwkgKiAgICBiaXQgaGlnaGVyIHRvIGFjY291bnQgZm9yIGZ1bGx5IGxvYWRlZCBTQ1NJCisJICogICAgYnVzJ3MgYW5kIHNsb3cgZGV2aWNlcyB0aGF0IGRvbid0IHJlc3BvbmQgc28KKwkgKiAgICBxdWlja2x5IHRvIHNlbGVjdGlvbiBhdHRlbXB0cy4gKHllYWgsIEkga25vdworCSAqICAgIHRoaXMgaXMgb3V0IG9mIHNwZWMuIGJ1dCB0aGVyZSBpcyBhIGxvdCBvZgorCSAqICAgIGJ1Z2d5IHBpZWNlcyBvZiBmaXJtd2FyZSBvdXQgdGhlcmUgc28gYml0ZSBtZSkKKwkgKgorCSAqIGMpIEltcGVyaWNhbCBjb25zdGFudHMgZm9yIHN5bmNocm9ub3VzIG9mZnNldAorCSAqICAgIGFuZCB0cmFuc2ZlciBwZXJpb2QgcmVnaXN0ZXIgdmFsdWVzCisJICoKKwkgKiAgICBUaGlzIGVudGFpbHMgdGhlIHNtYWxsZXN0IGFuZCBsYXJnZXN0IHN5bmMKKwkgKiAgICBwZXJpb2Qgd2UgY291bGQgZXZlciBoYW5kbGUgb24gdGhpcyBFU1AuCisJICovCisJCisJZm1oeiA9IGVzcC0+Y2ZyZXE7CisKKwlpZihmbWh6IDw9ICg1MDAwMDAwKSkKKwkJY2NmID0gMDsKKwllbHNlCisJCWNjZiA9ICgoKDUwMDAwMDAgLSAxKSArIChmbWh6KSkvKDUwMDAwMDApKTsKKwlpZighY2NmIHx8IGNjZiA+IDgpIHsKKwkJLyogSWYgd2UgY2FuJ3QgZmluZCBhbnl0aGluZyByZWFzb25hYmxlLAorCQkgKiBqdXN0IGFzc3VtZSAyME1IWi4gIFRoaXMgaXMgdGhlIGNsb2NrCisJCSAqIGZyZXF1ZW5jeSBvZiB0aGUgb2xkZXIgc3VuNGMncyB3aGVyZSBJJ3ZlCisJCSAqIGJlZW4gdW5hYmxlIHRvIGZpbmQgdGhlIGNsb2NrLWZyZXF1ZW5jeQorCQkgKiBQUk9NIHByb3BlcnR5LiAgQWxsIG90aGVyIG1hY2hpbmVzIHByb3ZpZGUKKwkJICogdXNlZnVsIHZhbHVlcyBpdCBzZWVtcy4KKwkJICovCisJCWNjZiA9IEVTUF9DQ0ZfRjQ7CisJCWZtaHogPSAoMjAwMDAwMDApOworCX0KKwlpZihjY2Y9PShFU1BfQ0NGX0Y3KzEpKQorCQllc3AtPmNmYWN0ID0gRVNQX0NDRl9GMDsKKwllbHNlIGlmKGNjZiA9PSBFU1BfQ0NGX05FVkVSKQorCQllc3AtPmNmYWN0ID0gRVNQX0NDRl9GMjsKKwllbHNlCisJCWVzcC0+Y2ZhY3QgPSBjY2Y7CisJZXNwLT5jZnJlcSA9IGZtaHo7CisJZXNwLT5jY3ljbGUgPSBFU1BfTUhaX1RPX0NZQ0xFKGZtaHopOworCWVzcC0+Y3RpY2sgPSBFU1BfVElDSyhjY2YsIGVzcC0+Y2N5Y2xlKTsKKwllc3AtPm5lZ19kZWZwID0gRVNQX05FR19ERUZQKGZtaHosIGNjZik7CisJZXNwLT5zeW5jX2RlZnAgPSBTWU5DX0RFRlBfU0xPVzsKKworCXByaW50aygiU0NTSSBJRCAlZCBDbGsgJWRNSHogQ0NGPSVkIFRPdXQgJWQgIiwKKwkgICAgICAgZXNwLT5zY3NpX2lkLCAoZXNwLT5jZnJlcSAvIDEwMDAwMDApLAorCSAgICAgICBjY2YsIChpbnQpIGVzcC0+bmVnX2RlZnApOworCisJLyogRmlsbCBpbiBlaG9zdCBkYXRhICovCisJZXNwLT5laG9zdC0+YmFzZSA9ICh1bnNpZ25lZCBsb25nKWVyZWdzOworCWVzcC0+ZWhvc3QtPnRoaXNfaWQgPSBlc3AtPnNjc2lfaWQ7CisJZXNwLT5laG9zdC0+aXJxID0gZXNwLT5pcnE7CisKKwkvKiBTQ1NJIGlkIG1hc2sgKi8KKwllc3AtPnNjc2lfaWRfbWFzayA9ICgxIDw8IGVzcC0+c2NzaV9pZCk7CisKKwkvKiBQcm9iZSB0aGUgcmV2aXNpb24gb2YgdGhpcyBlc3AgKi8KKwllc3AtPmNvbmZpZzEgPSAoRVNQX0NPTkZJRzFfUEVOQUJMRSB8IChlc3AtPnNjc2lfaWQgJiA3KSk7CisJZXNwLT5jb25maWcyID0gKEVTUF9DT05GSUcyX1NDU0kyRU5BQiB8IEVTUF9DT05GSUcyX1JFR1BBUklUWSk7CisJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMiwgZXNwLT5jb25maWcyKTsKKwlpZigoZXNwX3JlYWQoZXJlZ3MtPmVzcF9jZmcyKSAmIH4oRVNQX0NPTkZJRzJfTUFHSUMpKSAhPQorCSAgIChFU1BfQ09ORklHMl9TQ1NJMkVOQUIgfCBFU1BfQ09ORklHMl9SRUdQQVJJVFkpKSB7CisJCXByaW50aygiTkNSNTNDOTAoZXNwMTAwKVxuIik7CisJCWVzcC0+ZXJldiA9IGVzcDEwMDsKKwl9IGVsc2UgeworCQllc3AtPmNvbmZpZzIgPSAwOworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmcyLCAwKTsKKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMywgNSk7CisJCWlmKGVzcF9yZWFkKGVyZWdzLT5lc3BfY2ZnMykgIT0gNSkgeworCQkJcHJpbnRrKCJOQ1I1M0M5MEEoZXNwMTAwYSlcbiIpOworCQkJZXNwLT5lcmV2ID0gZXNwMTAwYTsKKwkJfSBlbHNlIHsKKwkJCWludCB0YXJnZXQ7CisKKwkJCWZvcih0YXJnZXQ9MDsgdGFyZ2V0PDg7IHRhcmdldCsrKQorCQkJCWVzcC0+Y29uZmlnM1t0YXJnZXRdID0gMDsKKwkJCWVzcC0+cHJldl9jZmczID0gMDsKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzMsIDApOworCQkJaWYoY2NmID4gRVNQX0NDRl9GNSkgeworCQkJCXByaW50aygiTkNSNTNDOVhGKGVzcGZhc3QpXG4iKTsKKwkJCQllc3AtPmVyZXYgPSBmYXN0OworCQkJCWVzcC0+c3luY19kZWZwID0gU1lOQ19ERUZQX0ZBU1Q7CisJCQl9IGVsc2UgeworCQkJCXByaW50aygiTkNSNTNDOXgoZXNwMjM2KVxuIik7CisJCQkJZXNwLT5lcmV2ID0gZXNwMjM2OworCQkJfQorCQl9CisJfQkJCQkKKworCS8qIEluaXRpYWxpemUgdGhlIGNvbW1hbmQgcXVldWVzICovCisJZXNwLT5jdXJyZW50X1NDID0gTlVMTDsKKwllc3AtPmRpc2Nvbm5lY3RlZF9TQyA9IE5VTEw7CisJZXNwLT5pc3N1ZV9TQyA9IE5VTEw7CisKKwkvKiBDbGVhciB0aGUgc3RhdGUgbWFjaGluZXMuICovCisJZXNwLT50YXJnZXRzX3ByZXNlbnQgPSAwOworCWVzcC0+cmVzZXR0aW5nX2J1cyA9IDA7CisJZXNwLT5zbmlwID0gMDsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVzcC0+cmVzZXRfcXVldWUpOworCisJZXNwLT5mYXNfcHJlbWF0dXJlX2ludHJfd29ya2Fyb3VuZCA9IDA7CisJZm9yKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJZXNwLT5lc3BjbWRsb2dbaV0gPSAwOworCWVzcC0+ZXNwY21kZW50ID0gMDsKKwlmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWVzcC0+Y3VyX21zZ291dFtpXSA9IDA7CisJCWVzcC0+Y3VyX21zZ2luW2ldID0gMDsKKwl9CisJZXNwLT5wcmV2bXNnb3V0ID0gZXNwLT5wcmV2bXNnaW4gPSAwOworCWVzcC0+bXNnb3V0X2xlbiA9IGVzcC0+bXNnaW5fbGVuID0gMDsKKworCS8qIENsZWFyIHRoZSBvbmUgYmVoaW5kIGNhY2hlcyB0byBob2xkIHVubWF0Y2hhYmxlIHZhbHVlcy4gKi8KKwllc3AtPnByZXZfc29mZiA9IGVzcC0+cHJldl9zdHAgPSBlc3AtPnByZXZfY2ZnMyA9IDB4ZmY7CisKKwkvKiBSZXNldCB0aGUgdGhpbmcgYmVmb3JlIHdlIHRyeSBhbnl0aGluZy4uLiAqLworCWVzcF9ib290dXBfcmVzZXQoZXNwLCBlcmVncyk7CisKKwllc3BzX2luX3VzZSsrOworfQorCisvKiBUaGUgaW5mbyBmdW5jdGlvbiB3aWxsIHJldHVybiB3aGF0ZXZlciB1c2VmdWwKKyAqIGluZm9ybWF0aW9uIHRoZSBkZXZlbG9wZXIgc2VlcyBmaXQuICBJZiBub3QgcHJvdmlkZWQsIHRoZW4KKyAqIHRoZSBuYW1lIGZpZWxkIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLgorICovCitjb25zdCBjaGFyICplc3BfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0cnVjdCBOQ1JfRVNQICplc3A7CisKKwllc3AgPSAoc3RydWN0IE5DUl9FU1AgKikgaG9zdC0+aG9zdGRhdGE7CisJc3dpdGNoKGVzcC0+ZXJldikgeworCWNhc2UgZXNwMTAwOgorCQlyZXR1cm4gIkVTUDEwMCAoTkNSNTNDOTApIjsKKwljYXNlIGVzcDEwMGE6CisJCXJldHVybiAiRVNQMTAwQSAoTkNSNTNDOTBBKSI7CisJY2FzZSBlc3AyMzY6CisJCXJldHVybiAiRVNQMjM2IChOQ1I1M0M5eCkiOworCWNhc2UgZmFzMjE2OgorCQlyZXR1cm4gIkVtdWxleCBGQVMyMTYiOworCWNhc2UgZmFzMjM2OgorCQlyZXR1cm4gIkVtdWxleCBGQVMyMzYiOworCWNhc2UgZmFzMzY2OgorCQlyZXR1cm4gIlFMb2dpYyBGQVMzNjYiOworCWNhc2UgZmFzMTAwYToKKwkJcmV0dXJuICJGUEVTUDEwMEEiOworCWNhc2UgZnNjOgorCQlyZXR1cm4gIlN5bWJpb3MgTG9naWMgNTNDRjl4LTIiOworCWRlZmF1bHQ6CisJCXBhbmljKCJCb2dvbiBFU1AgcmV2aXNpb24iKTsKKwl9OworfQorCisvKiBGcm9tIFdvbGZnYW5nIFN0YW5nbG1laWVyJ3MgTkNSIHNjc2kgZHJpdmVyLiAqLworc3RydWN0IGluZm9fc3RyCit7CisJY2hhciAqYnVmZmVyOworCWludCBsZW5ndGg7CisJaW50IG9mZnNldDsKKwlpbnQgcG9zOworfTsKKworc3RhdGljIHZvaWQgY29weV9tZW1faW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJaWYgKGluZm8tPnBvcyArIGxlbiA+IGluZm8tPmxlbmd0aCkKKwkJbGVuID0gaW5mby0+bGVuZ3RoIC0gaW5mby0+cG9zOworCisJaWYgKGluZm8tPnBvcyArIGxlbiA8IGluZm8tPm9mZnNldCkgeworCQlpbmZvLT5wb3MgKz0gbGVuOworCQlyZXR1cm47CisJfQorCWlmIChpbmZvLT5wb3MgPCBpbmZvLT5vZmZzZXQpIHsKKwkJZGF0YSArPSAoaW5mby0+b2Zmc2V0IC0gaW5mby0+cG9zKTsKKwkJbGVuICAtPSAoaW5mby0+b2Zmc2V0IC0gaW5mby0+cG9zKTsKKwl9CisKKwlpZiAobGVuID4gMCkgeworCQltZW1jcHkoaW5mby0+YnVmZmVyICsgaW5mby0+cG9zLCBkYXRhLCBsZW4pOworCQlpbmZvLT5wb3MgKz0gbGVuOworCX0KK30KKworc3RhdGljIGludCBjb3B5X2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY2hhciBidWZbODFdOworCWludCBsZW47CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWxlbiA9IHZzcHJpbnRmKGJ1ZiwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwljb3B5X21lbV9pbmZvKGluZm8sIGJ1ZiwgbGVuKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGVzcF9ob3N0X2luZm8oc3RydWN0IE5DUl9FU1AgKmVzcCwgY2hhciAqcHRyLCBvZmZfdCBvZmZzZXQsIGludCBsZW4pCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCXN0cnVjdCBpbmZvX3N0ciBpbmZvOworCWludCBpOworCisJaW5mby5idWZmZXIJPSBwdHI7CisJaW5mby5sZW5ndGgJPSBsZW47CisJaW5mby5vZmZzZXQJPSBvZmZzZXQ7CisJaW5mby5wb3MJPSAwOworCisJY29weV9pbmZvKCZpbmZvLCAiRVNQIEhvc3QgQWRhcHRlcjpcbiIpOworCWNvcHlfaW5mbygmaW5mbywgIlx0RVNQIE1vZGVsXHRcdCIpOworCXN3aXRjaChlc3AtPmVyZXYpIHsKKwljYXNlIGVzcDEwMDoKKwkJY29weV9pbmZvKCZpbmZvLCAiRVNQMTAwIChOQ1I1M0M5MClcbiIpOworCQlicmVhazsKKwljYXNlIGVzcDEwMGE6CisJCWNvcHlfaW5mbygmaW5mbywgIkVTUDEwMEEgKE5DUjUzQzkwQSlcbiIpOworCQlicmVhazsKKwljYXNlIGVzcDIzNjoKKwkJY29weV9pbmZvKCZpbmZvLCAiRVNQMjM2IChOQ1I1M0M5eClcbiIpOworCQlicmVhazsKKwljYXNlIGZhczIxNjoKKwkJY29weV9pbmZvKCZpbmZvLCAiRW11bGV4IEZBUzIxNlxuIik7CisJCWJyZWFrOworCWNhc2UgZmFzMjM2OgorCQljb3B5X2luZm8oJmluZm8sICJFbXVsZXggRkFTMjM2XG4iKTsKKwkJYnJlYWs7CisJY2FzZSBmYXMxMDBhOgorCQljb3B5X2luZm8oJmluZm8sICJGUEVTUDEwMEFcbiIpOworCQlicmVhazsKKwljYXNlIGZhc3Q6CisJCWNvcHlfaW5mbygmaW5mbywgIkdlbmVyaWMgRkFTVFxuIik7CisJCWJyZWFrOworCWNhc2UgZmFzMzY2OgorCQljb3B5X2luZm8oJmluZm8sICJRTG9naWMgRkFTMzY2XG4iKTsKKwkJYnJlYWs7CisJY2FzZSBmc2M6CisJCWNvcHlfaW5mbygmaW5mbywgIlN5bWJpb3MgTG9naWMgNTNDOXgtMlxuIik7CisJCWJyZWFrOworCWNhc2UgZXNwdW5rbm93bjoKKwlkZWZhdWx0OgorCQljb3B5X2luZm8oJmluZm8sICJVbmtub3duIVxuIik7CisJCWJyZWFrOworCX07CisJY29weV9pbmZvKCZpbmZvLCAiXHRMaXZlIFRhcmdldHNcdFx0WyAiKTsKKwlmb3IoaSA9IDA7IGkgPCAxNTsgaSsrKSB7CisJCWlmKGVzcC0+dGFyZ2V0c19wcmVzZW50ICYgKDEgPDwgaSkpCisJCQljb3B5X2luZm8oJmluZm8sICIlZCAiLCBpKTsKKwl9CisJY29weV9pbmZvKCZpbmZvLCAiXVxuXG4iKTsKKwkKKwkvKiBOb3cgZGVzY3JpYmUgdGhlIHN0YXRlIG9mIGVhY2ggZXhpc3RpbmcgdGFyZ2V0LiAqLworCWNvcHlfaW5mbygmaW5mbywgIlRhcmdldCAjXHRjb25maWczXHRcdFN5bmMgQ2FwYWJpbGl0aWVzXHREaXNjb25uZWN0XG4iKTsKKworCXNob3N0X2Zvcl9lYWNoX2RldmljZShzZGV2LCBlc3AtPmVob3N0KSB7CisJCXN0cnVjdCBlc3BfZGV2aWNlICplc3BfZGV2ID0gc2Rldi0+aG9zdGRhdGE7CisJCXVpbnQgaWQgPSBzZGV2LT5pZDsKKworCQlpZiAoIShlc3AtPnRhcmdldHNfcHJlc2VudCAmICgxIDw8IGlkKSkpCisJCQljb250aW51ZTsKKworCQljb3B5X2luZm8oJmluZm8sICIlZFx0XHQiLCBpZCk7CisJCWNvcHlfaW5mbygmaW5mbywgIiUwOGx4XHQiLCBlc3AtPmNvbmZpZzNbaWRdKTsKKwkJY29weV9pbmZvKCZpbmZvLCAiWyUwMmx4LCUwMmx4XVx0XHRcdCIsCisJCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQsCisJCQllc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QpOworCQljb3B5X2luZm8oJmluZm8sICIlc1xuIiwgZXNwX2Rldi0+ZGlzY29ubmVjdCA/ICJ5ZXMiIDogIm5vIik7CisJfQorCisJcmV0dXJuIGluZm8ucG9zID4gaW5mby5vZmZzZXQ/IGluZm8ucG9zIC0gaW5mby5vZmZzZXQgOiAwOworfQorCisvKiBFU1AgcHJvYyBmaWxlc3lzdGVtIGNvZGUuICovCitpbnQgZXNwX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwKKwkJICBpbnQgaW5vdXQpCit7CisJc3RydWN0IE5DUl9FU1AgKmVzcCA9IChzdHJ1Y3QgTkNSX0VTUCAqKXNob3N0LT5ob3N0ZGF0YTsKKworCWlmKGlub3V0KQorCQlyZXR1cm4gLUVJTlZBTDsgLyogbm90IHlldCAqLworCWlmKHN0YXJ0KQorCQkqc3RhcnQgPSBidWZmZXI7CisJcmV0dXJuIGVzcF9ob3N0X2luZm8oZXNwLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKK30KKworc3RhdGljIHZvaWQgZXNwX2dldF9kbWFidWZzKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisJaWYoc3AtPnVzZV9zZyA9PSAwKSB7CisJCXNwLT5TQ3AudGhpc19yZXNpZHVhbCA9IHNwLT5yZXF1ZXN0X2J1ZmZsZW47CisJCXNwLT5TQ3AuYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBzcC0+cmVxdWVzdF9idWZmZXI7CisJCXNwLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IDA7CisJCWlmIChlc3AtPmRtYV9tbXVfZ2V0X3Njc2lfb25lKQorCQkJZXNwLT5kbWFfbW11X2dldF9zY3NpX29uZShlc3AsIHNwKTsKKwkJZWxzZQorCQkJc3AtPlNDcC5wdHIgPQorCQkJCShjaGFyICopIHZpcnRfdG9fcGh5cyhzcC0+cmVxdWVzdF9idWZmZXIpOworCX0gZWxzZSB7CisJCXNwLT5TQ3AuYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBzcC0+YnVmZmVyOworCQlzcC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSBzcC0+dXNlX3NnIC0gMTsKKwkJc3AtPlNDcC50aGlzX3Jlc2lkdWFsID0gc3AtPlNDcC5idWZmZXItPmxlbmd0aDsKKwkJaWYgKGVzcC0+ZG1hX21tdV9nZXRfc2NzaV9zZ2wpCisJCQllc3AtPmRtYV9tbXVfZ2V0X3Njc2lfc2dsKGVzcCwgc3ApOworCQllbHNlCisJCQlzcC0+U0NwLnB0ciA9CisJCQkJKGNoYXIgKikgdmlydF90b19waHlzKChwYWdlX2FkZHJlc3Moc3AtPlNDcC5idWZmZXItPnBhZ2UpICsgc3AtPlNDcC5idWZmZXItPm9mZnNldCkpOworCX0KK30KKworc3RhdGljIHZvaWQgZXNwX3JlbGVhc2VfZG1hYnVmcyhzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKQoreworCWlmKHNwLT51c2Vfc2cgPT0gMCkgeworCQlpZiAoZXNwLT5kbWFfbW11X3JlbGVhc2Vfc2NzaV9vbmUpCisJCQllc3AtPmRtYV9tbXVfcmVsZWFzZV9zY3NpX29uZShlc3AsIHNwKTsKKwl9IGVsc2UgeworCQlpZiAoZXNwLT5kbWFfbW11X3JlbGVhc2Vfc2NzaV9zZ2wpCisJCQllc3AtPmRtYV9tbXVfcmVsZWFzZV9zY3NpX3NnbChlc3AsIHNwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9yZXN0b3JlX3BvaW50ZXJzKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisJc3RydWN0IGVzcF9wb2ludGVycyAqZXAgPSAmZXNwLT5kYXRhX3BvaW50ZXJzW3NwLT5kZXZpY2UtPmlkXTsKKworCXNwLT5TQ3AucHRyID0gZXAtPnNhdmVkX3B0cjsKKwlzcC0+U0NwLmJ1ZmZlciA9IGVwLT5zYXZlZF9idWZmZXI7CisJc3AtPlNDcC50aGlzX3Jlc2lkdWFsID0gZXAtPnNhdmVkX3RoaXNfcmVzaWR1YWw7CisJc3AtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gZXAtPnNhdmVkX2J1ZmZlcnNfcmVzaWR1YWw7Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9zYXZlX3BvaW50ZXJzKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisJc3RydWN0IGVzcF9wb2ludGVycyAqZXAgPSAmZXNwLT5kYXRhX3BvaW50ZXJzW3NwLT5kZXZpY2UtPmlkXTsKKworCWVwLT5zYXZlZF9wdHIgPSBzcC0+U0NwLnB0cjsKKwllcC0+c2F2ZWRfYnVmZmVyID0gc3AtPlNDcC5idWZmZXI7CisJZXAtPnNhdmVkX3RoaXNfcmVzaWR1YWwgPSBzcC0+U0NwLnRoaXNfcmVzaWR1YWw7CisJZXAtPnNhdmVkX2J1ZmZlcnNfcmVzaWR1YWwgPSBzcC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw7Cit9CisKKy8qIFNvbWUgcnVsZXM6CisgKgorICogICAxKSBOZXZlciBldmVyIHBhbmljIHdoaWxlIHNvbWV0aGluZyBpcyBsaXZlIG9uIHRoZSBidXMuCisgKiAgICAgIElmIHRoZXJlIGlzIHRvIGJlIGFueSBjaGFuY2Ugb2Ygc3luY2luZyB0aGUgZGlza3MgdGhpcworICogICAgICBydWxlIGlzIHRvIGJlIG9iZXllZC4KKyAqCisgKiAgIDIpIEFueSB0YXJnZXQgdGhhdCBjYXVzZXMgYSBmb3VsIGNvbmRpdGlvbiB3aWxsIG5vIGxvbmdlcgorICogICAgICBoYXZlIHN5bmNocm9ub3VzIHRyYW5zZmVycyBkb25lIHRvIGl0LCBubyBxdWVzdGlvbnMKKyAqICAgICAgYXNrZWQuCisgKgorICogICAzKSBLZWVwIHJlZ2lzdGVyIGFjY2Vzc2VzIHRvIGEgbWluaW11bS4gIFRoaW5rIGFib3V0IHNvbWUKKyAqICAgICAgZGF5IHdoZW4gd2UgaGF2ZSBYYnVzIG1hY2hpbmVzIHRoaXMgaXMgcnVubmluZyBvbiBhbmQKKyAqICAgICAgdGhlIEVTUCBjaGlwIGlzIG9uIHRoZSBvdGhlciBlbmQgb2YgdGhlIG1hY2hpbmUgb24gYQorICogICAgICBkaWZmZXJlbnQgYm9hcmQgZnJvbSB0aGUgY3B1IHdoZXJlIHRoaXMgaXMgcnVubmluZy4KKyAqLworCisvKiBGaXJlIG9mZiBhIGNvbW1hbmQuICBXZSBhc3N1bWUgdGhlIGJ1cyBpcyBmcmVlIGFuZCB0aGF0IHRoZSBvbmx5CisgKiBjYXNlIHdoZXJlIHdlIGNvdWxkIHNlZSBhbiBpbnRlcnJ1cHQgaXMgd2hlcmUgd2UgaGF2ZSBkaXNjb25uZWN0ZWQKKyAqIGNvbW1hbmRzIGFjdGl2ZSBhbmQgdGhleSBhcmUgdHJ5aW5nIHRvIHJlc2VsZWN0IHVzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZXNwX2NoZWNrX2NtZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKQoreworCXN3aXRjaChzcC0+Y21kX2xlbikgeworCWNhc2UgNjoKKwljYXNlIDEwOgorCWNhc2UgMTI6CisJCWVzcC0+ZXNwX3Nsb3djbWQgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVzcC0+ZXNwX3Nsb3djbWQgPSAxOworCQllc3AtPmVzcF9zY21kbGVmdCA9IHNwLT5jbWRfbGVuOworCQllc3AtPmVzcF9zY21kcCA9ICZzcC0+Y21uZFswXTsKKwkJYnJlYWs7CisJfTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ1aWxkX3N5bmNfbmVnb19tc2coc3RydWN0IE5DUl9FU1AgKmVzcCwgaW50IHBlcmlvZCwgaW50IG9mZnNldCkKK3sKKwllc3AtPmN1cl9tc2dvdXRbMF0gPSBFWFRFTkRFRF9NRVNTQUdFOworCWVzcC0+Y3VyX21zZ291dFsxXSA9IDM7CisJZXNwLT5jdXJfbXNnb3V0WzJdID0gRVhURU5ERURfU0RUUjsKKwllc3AtPmN1cl9tc2dvdXRbM10gPSBwZXJpb2Q7CisJZXNwLT5jdXJfbXNnb3V0WzRdID0gb2Zmc2V0OworCWVzcC0+bXNnb3V0X2xlbiA9IDU7Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9leGVjX2NtZChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCXN0cnVjdCBFU1BfcmVncyAqZXJlZ3MgPSBlc3AtPmVyZWdzOworCXN0cnVjdCBlc3BfZGV2aWNlICplc3BfZGV2OworCVNjc2lfQ21uZCAqU0NwdHI7CisJU2NzaV9EZXZpY2UgKlNEcHRyOworCXZvbGF0aWxlIHVuY2hhciAqY21kcCA9IGVzcC0+ZXNwX2NvbW1hbmQ7CisJdW5zaWduZWQgY2hhciB0aGVfZXNwX2NvbW1hbmQ7CisJaW50IGx1biwgdGFyZ2V0OworCWludCBpOworCisJLyogSG9sZCBvZmYgaWYgd2UgaGF2ZSBkaXNjb25uZWN0ZWQgY29tbWFuZHMgYW5kCisJICogYW4gSVJRIGlzIHNob3dpbmcuLi4KKwkgKi8KKwlpZihlc3AtPmRpc2Nvbm5lY3RlZF9TQyAmJiBlc3AtPmRtYV9pcnFfcChlc3ApKQorCQlyZXR1cm47CisKKwkvKiBHcmFiIGZpcnN0IG1lbWJlciBvZiB0aGUgaXNzdWUgcXVldWUuICovCisJU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0MgPSByZW1vdmVfZmlyc3RfU0MoJmVzcC0+aXNzdWVfU0MpOworCisJLyogU2FmZSB0byBwYW5pYyBoZXJlIGJlY2F1c2UgY3VycmVudF9TQyBpcyBudWxsLiAqLworCWlmKCFTQ3B0cikKKwkJcGFuaWMoImVzcDogZXNwX2V4ZWNfY21kIGFuZCBpc3N1ZSBxdWV1ZSBpcyBOVUxMIik7CisKKwlTRHB0ciA9IFNDcHRyLT5kZXZpY2U7CisJZXNwX2RldiA9IFNEcHRyLT5ob3N0ZGF0YTsKKwlsdW4gPSBTQ3B0ci0+ZGV2aWNlLT5sdW47CisJdGFyZ2V0ID0gU0NwdHItPmRldmljZS0+aWQ7CisKKwllc3AtPnNuaXAgPSAwOworCWVzcC0+bXNnb3V0X2xlbiA9IDA7CisKKwkvKiBTZW5kIGl0IG91dCB3aG9sZSwgb3IgcGllY2UgYnkgcGllY2U/ICAgVGhlIEVTUAorCSAqIG9ubHkga25vd3MgaG93IHRvIGF1dG9tYXRpY2FsbHkgc2VuZCBvdXQgNiwgMTAsCisJICogYW5kIDEyIGJ5dGUgY29tbWFuZHMuICBJIHVzZWQgdG8gdGhpbmsgdGhhdCB0aGUKKwkgKiBMaW51eCBTQ1NJIGNvZGUgd291bGQgbmV2ZXIgdGhyb3cgYW55dGhpbmcgb3RoZXIKKwkgKiB0aGFuIHRoYXQgdG8gdXMsIGJ1dCB0aGVuIGFnYWluIHRoZXJlIGlzIHRoZQorCSAqIFNDU0kgZ2VuZXJpYyBkcml2ZXIgd2hpY2ggY2FuIHNlbmQgdXMgYW55dGhpbmcuCisJICovCisJZXNwX2NoZWNrX2NtZChlc3AsIFNDcHRyKTsKKworCS8qIElmIGFyYml0cmF0aW9uL3NlbGVjdGlvbiBpcyBzdWNjZXNzZnVsLCB0aGUgRVNQIHdpbGwgbGVhdmUKKwkgKiBBVE4gYXNzZXJ0ZWQsIGNhdXNpbmcgdGhlIHRhcmdldCB0byBnbyBpbnRvIG1lc3NhZ2Ugb3V0CisJICogcGhhc2UuICBUaGUgRVNQIHdpbGwgZmVlZCB0aGUgdGFyZ2V0IHRoZSBpZGVudGlmeSBhbmQgdGhlbgorCSAqIHRoZSB0YXJnZXQgY2FuIG9ubHkgbGVnYWxseSBnbyB0byBvbmUgb2YgY29tbWFuZCwKKwkgKiBkYXRhaW4vb3V0LCBzdGF0dXMsIG9yIG1lc3NhZ2UgaW4gcGhhc2UsIG9yIHN0YXkgaW4gbWVzc2FnZQorCSAqIG91dCBwaGFzZSAoc2hvdWxkIHdlIGJlIHRyeWluZyB0byBzZW5kIGEgc3luYyBuZWdvdGlhdGlvbgorCSAqIG1lc3NhZ2UgYWZ0ZXIgdGhlIGlkZW50aWZ5KS4gIEl0IGlzIG5vdCBhbGxvd2VkIHRvIGRyb3AKKwkgKiBCU1ksIGJ1dCBzb21lIGJ1Z2d5IHRhcmdldHMgZG8gYW5kIHdlIGNoZWNrIGZvciB0aGlzCisJICogY29uZGl0aW9uIGluIHRoZSBzZWxlY3Rpb24gY29tcGxldGUgY29kZS4gIE1vc3Qgb2YgdGhlIHRpbWUKKwkgKiB3ZSdsbCBtYWtlIHRoZSBjb21tYW5kIGJ5dGVzIGF2YWlsYWJsZSB0byB0aGUgRVNQIGFuZCBpdAorCSAqIHdpbGwgbm90IGludGVycnVwdCB1cyB1bnRpbCBpdCBmaW5pc2hlcyBjb21tYW5kIHBoYXNlLCB3ZQorCSAqIGNhbm5vdCBkbyB0aGlzIGZvciBjb21tYW5kIHNpemVzIHRoZSBFU1AgZG9lcyBub3QKKwkgKiB1bmRlcnN0YW5kIGFuZCBpbiB0aGlzIGNhc2Ugd2UnbGwgZ2V0IGludGVycnVwdGVkIHJpZ2h0CisJICogd2hlbiB0aGUgdGFyZ2V0IGdvZXMgaW50byBjb21tYW5kIHBoYXNlLgorCSAqCisJICogSXQgaXMgYWJzb2x1dGVseSBfaWxsZWdhbF8gaW4gdGhlIHByZXNlbmNlIG9mIFNDU0ktMiBkZXZpY2VzCisJICogdG8gdXNlIHRoZSBFU1Agc2VsZWN0IHcvbyBBVE4gY29tbWFuZC4gIFdoZW4gU0NTSS0yIGRldmljZXMgYXJlCisJICogcHJlc2VudCBvbiB0aGUgYnVzIHdlIF9tdXN0XyBhbHdheXMgZ28gc3RyYWlnaHQgdG8gbWVzc2FnZSBvdXQKKwkgKiBwaGFzZSB3aXRoIGFuIGlkZW50aWZ5IG1lc3NhZ2UgZm9yIHRoZSB0YXJnZXQuICBCZWluZyB0aGF0CisJICogc2VsZWN0aW9uIGF0dGVtcHRzIGluIFNDU0ktMSB3L28gQVROIHdhcyBhbiBvcHRpb24sIGRvaW5nIFNDU0ktMgorCSAqIHNlbGVjdGlvbnMgc2hvdWxkIG5vdCBjb25mdXNlIFNDU0ktMSB3ZSBob3BlLgorCSAqLworCisJaWYoZXNwX2Rldi0+c3luYykgeworCQkvKiB0aGlzIHRhcmdldHMgc3luYyBpcyBrbm93biAqLworI2lmZGVmIENPTkZJR19TQ1NJX01BQ19FU1AKK2RvX3N5bmNfa25vd246CisjZW5kaWYKKwkJaWYoZXNwX2Rldi0+ZGlzY29ubmVjdCkKKwkJCSpjbWRwKysgPSBJREVOVElGWSgxLCBsdW4pOworCQllbHNlCisJCQkqY21kcCsrID0gSURFTlRJRlkoMCwgbHVuKTsKKworCQlpZihlc3AtPmVzcF9zbG93Y21kKSB7CisJCQl0aGVfZXNwX2NvbW1hbmQgPSAoRVNQX0NNRF9TRUxBUyB8IEVTUF9DTURfRE1BKTsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9zbGN0X3N0b3ApOworCQl9IGVsc2UgeworCQkJdGhlX2VzcF9jb21tYW5kID0gKEVTUF9DTURfU0VMQSB8IEVTUF9DTURfRE1BKTsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9zbGN0X25vcm0pOworCQl9CisJfSBlbHNlIGlmKCEoZXNwLT50YXJnZXRzX3ByZXNlbnQgJiAoMTw8dGFyZ2V0KSkgfHwgIShlc3BfZGV2LT5kaXNjb25uZWN0KSkgeworCQkvKiBBZnRlciB0aGUgYm9vdHVwIFNDU0kgY29kZSBzZW5kcyBib3RoIHRoZQorCQkgKiBURVNUX1VOSVRfUkVBRFkgYW5kIElOUVVJUlkgY29tbWFuZHMgd2Ugd2FudAorCQkgKiB0byBhdCBsZWFzdCBhdHRlbXB0IGFsbG93aW5nIHRoZSBkZXZpY2UgdG8KKwkJICogZGlzY29ubmVjdC4KKwkJICovCisJCUVTUE1JU0MoKCJlc3A6IFNlbGVjdGluZyBkZXZpY2UgZm9yIGZpcnN0IHRpbWUuIHRhcmdldD0lZCAiCisJCQkgImx1bj0lZFxuIiwgdGFyZ2V0LCBTQ3B0ci0+ZGV2aWNlLT5sdW4pKTsKKwkJaWYoIVNEcHRyLT5ib3JrZW4gJiYgIWVzcF9kZXYtPmRpc2Nvbm5lY3QpCisJCQllc3BfZGV2LT5kaXNjb25uZWN0ID0gMTsKKworCQkqY21kcCsrID0gSURFTlRJRlkoMCwgbHVuKTsKKwkJZXNwLT5wcmV2bXNnb3V0ID0gTk9QOworCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fc2xjdF9ub3JtKTsKKwkJdGhlX2VzcF9jb21tYW5kID0gKEVTUF9DTURfU0VMQSB8IEVTUF9DTURfRE1BKTsKKworCQkvKiBUYWtlIG5vIGNoYW5jZXMuLi4gKi8KKwkJZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0ID0gMDsKKwkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gMDsKKwl9IGVsc2UgeworCQlpbnQgdG9zaGliYV9jZHJvbV9od2J1Z193a2Fyb3VuZCA9IDA7CisKKyNpZmRlZiBDT05GSUdfU0NTSV9NQUNfRVNQCisJCS8qIE5ldmVyIGFsbG93IHN5bmNocm9ub3VzIHRyYW5zZmVycyAoZGlzY29ubmVjdCBPSykgb24KKwkJICogTWFjaW50b3NoLiBXZWxsLCBtYXliZSBsYXRlciB3aGVuIHdlIGZpZ3VyZWQgb3V0IGhvdyB0byAKKwkJICogZG8gRE1BIG9uIHRoZSBtYWNoaW5lcyB0aGF0IHN1cHBvcnQgaXQgLi4uCisJCSAqLworCQllc3BfZGV2LT5kaXNjb25uZWN0ID0gMTsKKwkJZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0ID0gMDsKKwkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gMDsKKwkJZXNwX2Rldi0+c3luYyA9IDE7CisJCWVzcC0+c25pcCA9IDA7CisJCWdvdG8gZG9fc3luY19rbm93bjsKKyNlbmRpZgorCQkvKiBXZSd2ZSB0YWxrZWQgdG8gdGhpcyBndXkgYmVmb3JlLAorCQkgKiBidXQgbmV2ZXIgbmVnb3RpYXRlZC4gIExldCdzIHRyeQorCQkgKiBzeW5jIG5lZ290aWF0aW9uLgorCQkgKi8KKwkJaWYoIVNEcHRyLT5ib3JrZW4pIHsKKwkJCWlmKChTRHB0ci0+dHlwZSA9PSBUWVBFX1JPTSkgJiYKKwkJCSAgICghc3RybmNtcChTRHB0ci0+dmVuZG9yLCAiVE9TSElCQSIsIDcpKSkgeworCQkJCS8qIE5pY2UgdHJ5IHN1Y2tlci4uLiAqLworCQkJCUVTUE1JU0MoKCJlc3AlZDogRGlzYWJsaW5nIHN5bmMgZm9yIGJ1Z2d5ICIKKwkJCQkJICJUb3NoaWJhIENEUk9NLlxuIiwgZXNwLT5lc3BfaWQpKTsKKwkJCQl0b3NoaWJhX2Nkcm9tX2h3YnVnX3drYXJvdW5kID0gMTsKKwkJCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgMCwgMCk7CisJCQl9IGVsc2UgeworCQkJCWJ1aWxkX3N5bmNfbmVnb19tc2coZXNwLCBlc3AtPnN5bmNfZGVmcCwgMTUpOworCQkJfQorCQl9IGVsc2UgeworCQkJYnVpbGRfc3luY19uZWdvX21zZyhlc3AsIDAsIDApOworCQl9CisJCWVzcF9kZXYtPnN5bmMgPSAxOworCQllc3AtPnNuaXAgPSAxOworCisJCS8qIEEgZml4IGZvciBicm9rZW4gU0NTSTEgdGFyZ2V0cywgd2hlbiB0aGV5IGRpc2Nvbm5lY3QKKwkJICogdGhleSBsb2NrIHVwIHRoZSBidXMgYW5kIGNvbmZ1c2UgRVNQLiAgU28gZGlzYWxsb3cKKwkJICogZGlzY29ubmVjdHMgZm9yIFNDU0kxIHRhcmdldHMgZm9yIG5vdyB1bnRpbCB3ZQorCQkgKiBmaW5kIGEgYmV0dGVyIGZpeC4KKwkJICoKKwkJICogQWRkZW5kdW06IFRoaXMgaXMgZnVubnksIEkgZmlndXJlZCBvdXQgd2hhdCB3YXMgZ29pbmcKKwkJICogICAgICAgICAgIG9uLiAgVGhlIGJsb3R6ZWQgU0NTSTEgdGFyZ2V0IHdvdWxkIGRpc2Nvbm5lY3QsCisJCSAqICAgICAgICAgICBvbmUgb2YgdGhlIG90aGVyIFNDU0kyIHRhcmdldHMgb3IgYm90aCB3b3VsZCBiZQorCQkgKiAgICAgICAgICAgZGlzY29ubmVjdGVkIGFzIHdlbGwuICBUaGUgU0NTSTEgdGFyZ2V0IHdvdWxkCisJCSAqICAgICAgICAgICBzdGF5IGRpc2Nvbm5lY3RlZCBsb25nIGVub3VnaCB0aGF0IHdlIHN0YXJ0CisJCSAqICAgICAgICAgICB1cCBhIGNvbW1hbmQgb24gb25lIG9mIHRoZSBTQ1NJMiB0YXJnZXRzLiAgQXMKKwkJICogICAgICAgICAgIHRoZSBFU1AgaXMgYXJiaXRyYXRpbmcgZm9yIHRoZSBidXMgdGhlIFNDU0kxCisJCSAqICAgICAgICAgICB0YXJnZXQgYmVnaW5zIHRvIGFyYml0cmF0ZSBhcyB3ZWxsIHRvIHJlc2VsZWN0CisJCSAqICAgICAgICAgICB0aGUgRVNQLiAgVGhlIFNDU0kxIHRhcmdldCByZWZ1c2VzIHRvIGRyb3AgaXQncworCQkgKiAgICAgICAgICAgSUQgYml0IG9uIHRoZSBkYXRhIGJ1cyBldmVuIHRob3VnaCB0aGUgRVNQIGlzCisJCSAqICAgICAgICAgICBhdCBJRCA3IGFuZCBpcyB0aGUgb2J2aW91cyB3aW5uZXIgZm9yIGFueQorCQkgKiAgICAgICAgICAgYXJiaXRyYXRpb24uICBUaGUgRVNQIGlzIGEgcG9vciBzcG9ydCBhbmQgcmVmdXNlcworCQkgKiAgICAgICAgICAgdG8gbG9zZSBhcmJpdHJhdGlvbiwgaXQgd2lsbCBjb250aW51ZSBpbmRlZmluaXRlbHkKKwkJICogICAgICAgICAgIHRyeWluZyB0byBhcmJpdHJhdGUgZm9yIHRoZSBidXMgYW5kIGNhbiBvbmx5IGJlCisJCSAqICAgICAgICAgICBzdG9wcGVkIHZpYSBhIGNoaXAgcmVzZXQgb3IgU0NTSSBidXMgcmVzZXQuCisJCSAqICAgICAgICAgICBUaGVyZWZvcmUgX25vXyBkaXNjb25uZWN0cyBmb3IgU0NTSTEgdGFyZ2V0cworCQkgKiAgICAgICAgICAgdGhhbmsgeW91IHZlcnkgbXVjaC4gOy0pCisJCSAqLworCQlpZigoKFNEcHRyLT5zY3NpX2xldmVsIDwgMykgJiYgKFNEcHRyLT50eXBlICE9IFRZUEVfVEFQRSkpIHx8CisJCSAgIHRvc2hpYmFfY2Ryb21faHdidWdfd2thcm91bmQgfHwgU0RwdHItPmJvcmtlbikgeworCQkJRVNQTUlTQygoS0VSTl9JTkZPICJlc3AlZDogRGlzYWJsaW5nIERJU0NPTk5FQ1QgZm9yIHRhcmdldCAlZCAiCisJCQkJICJsdW4gJWRcbiIsIGVzcC0+ZXNwX2lkLCBTQ3B0ci0+ZGV2aWNlLT5pZCwgU0NwdHItPmRldmljZS0+bHVuKSk7CisJCQllc3BfZGV2LT5kaXNjb25uZWN0ID0gMDsKKwkJCSpjbWRwKysgPSBJREVOVElGWSgwLCBsdW4pOworCQl9IGVsc2UgeworCQkJKmNtZHArKyA9IElERU5USUZZKDEsIGx1bik7CisJCX0KKworCQkvKiBFU1AgZmlmbyBpcyBvbmx5IHNvIGJpZy4uLgorCQkgKiBNYWtlIHRoaXMgbG9vayBsaWtlIGEgc2xvdyBjb21tYW5kLgorCQkgKi8KKwkJZXNwLT5lc3Bfc2xvd2NtZCA9IDE7CisJCWVzcC0+ZXNwX3NjbWRsZWZ0ID0gU0NwdHItPmNtZF9sZW47CisJCWVzcC0+ZXNwX3NjbWRwID0gJlNDcHRyLT5jbW5kWzBdOworCisJCXRoZV9lc3BfY29tbWFuZCA9IChFU1BfQ01EX1NFTEFTIHwgRVNQX0NNRF9ETUEpOworCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fc2xjdF9tc2cpOworCX0KKworCWlmKCFlc3AtPmVzcF9zbG93Y21kKQorCQlmb3IoaSA9IDA7IGkgPCBTQ3B0ci0+Y21kX2xlbjsgaSsrKQorCQkJKmNtZHArKyA9IFNDcHRyLT5jbW5kW2ldOworCisJZXNwX3dyaXRlKGVyZWdzLT5lc3BfYnVzaWQsICh0YXJnZXQgJiA3KSk7CisJaWYgKGVzcC0+cHJldl9zb2ZmICE9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCB8fAorCSAgICBlc3AtPnByZXZfc3RwICAhPSBlc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgfHwKKwkgICAgKGVzcC0+ZXJldiA+IGVzcDEwMGEgJiYKKwkgICAgIGVzcC0+cHJldl9jZmczICE9IGVzcC0+Y29uZmlnM1t0YXJnZXRdKSkgeworCQllc3AtPnByZXZfc29mZiA9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldDsKKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3Bfc29mZiwgZXNwLT5wcmV2X3NvZmYpOworCQllc3AtPnByZXZfc3RwID0gZXNwX2Rldi0+c3luY19taW5fcGVyaW9kOworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9zdHAsIGVzcC0+cHJldl9zdHApOyAKKwkJaWYoZXNwLT5lcmV2ID4gZXNwMTAwYSkgeworCQkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPmNvbmZpZzNbdGFyZ2V0XTsKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzMsIGVzcC0+cHJldl9jZmczKTsKKwkJfQorCX0KKwlpID0gKGNtZHAgLSBlc3AtPmVzcF9jb21tYW5kKTsKKworCS8qIFNldCB1cCB0aGUgRE1BIGFuZCBFU1AgY291bnRlcnMgKi8KKwlpZihlc3AtPmRvX3Bpb19jbWRzKXsKKwkJaW50IGogPSAwOworCisJCS8qIAorCQkgKiBYWFggTVNjaDoKKwkJICoKKwkJICogSXQgc2VlbXMgdGhpcyBpcyByZXF1aXJlZCwgYXQgbGVhc3QgdG8gY2xlYW4gdXAKKwkJICogYWZ0ZXIgZmFpbGVkIGNvbW1hbmRzIHdoZW4gdXNpbmcgUElPIG1vZGUgLi4uCisJCSAqLworCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRkxVU0gpOworCisJCWZvcig7ajxpO2orKykKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBlc3AtPmVzcF9jb21tYW5kW2pdKTsKKwkJdGhlX2VzcF9jb21tYW5kICY9IH5FU1BfQ01EX0RNQTsKKworCQkvKiBUZWxsIEVTUCB0byAiZ28iLiAqLworCQllc3BfY21kKGVzcCwgZXJlZ3MsIHRoZV9lc3BfY29tbWFuZCk7CisJfSBlbHNlIHsKKwkJLyogU2V0IHVwIHRoZSBFU1AgY291bnRlcnMgKi8KKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfdGNsb3csIGkpOworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF90Y21lZCwgMCk7CisJCWVzcC0+ZG1hX2luaXRfd3JpdGUoZXNwLCBlc3AtPmVzcF9jb21tYW5kX2R2bWEsIGkpOworCisJCS8qIFRlbGwgRVNQIHRvICJnbyIuICovCisJCWVzcF9jbWQoZXNwLCBlcmVncywgdGhlX2VzcF9jb21tYW5kKTsKKwl9Cit9CisKKy8qIFF1ZXVlIGEgU0NTSSBjb21tYW5kIGRlbGl2ZXJlZCBmcm9tIHRoZSBtaWQtbGV2ZWwgTGludXggU0NTSSBjb2RlLiAqLworaW50IGVzcF9xdWV1ZShTY3NpX0NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQoreworCXN0cnVjdCBOQ1JfRVNQICplc3A7CisKKwkvKiBTZXQgdXAgZnVuYyBwdHIgYW5kIGluaXRpYWwgZHJpdmVyIGNtZC1waGFzZS4gKi8KKwlTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKKwlTQ3BudC0+U0NwLnBoYXNlID0gbm90X2lzc3VlZDsKKworCWVzcCA9IChzdHJ1Y3QgTkNSX0VTUCAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCWlmKGVzcC0+ZG1hX2xlZF9vbikKKwkJZXNwLT5kbWFfbGVkX29uKGVzcCk7CisKKwkvKiBXZSB1c2UgdGhlIHNjcmF0Y2ggYXJlYS4gKi8KKwlFU1BRVUVVRSgoImVzcF9xdWV1ZTogdGFyZ2V0PSVkIGx1bj0lZCAiLCBTQ3BudC0+ZGV2aWNlLT5pZCwgU0NwbnQtPmx1bikpOworCUVTUERJU0MoKCJOPCUwMngsJTAyeD4iLCBTQ3BudC0+ZGV2aWNlLT5pZCwgU0NwbnQtPmx1bikpOworCisJZXNwX2dldF9kbWFidWZzKGVzcCwgU0NwbnQpOworCWVzcF9zYXZlX3BvaW50ZXJzKGVzcCwgU0NwbnQpOyAvKiBGSVhNRSBmb3IgdGFnIHF1ZXVlaW5nICovCisKKwlTQ3BudC0+U0NwLlN0YXR1cyAgICAgICAgICAgPSBDSEVDS19DT05ESVRJT047CisJU0NwbnQtPlNDcC5NZXNzYWdlICAgICAgICAgID0gMHhmZjsKKwlTQ3BudC0+U0NwLnNlbnRfY29tbWFuZCAgICAgPSAwOworCisJLyogUGxhY2UgaW50byBvdXIgcXVldWUuICovCisJaWYoU0NwbnQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkgeworCQlFU1BRVUVVRSgoIlJRU0VOU0VcbiIpKTsKKwkJcHJlcGVuZF9TQygmZXNwLT5pc3N1ZV9TQywgU0NwbnQpOworCX0gZWxzZSB7CisJCUVTUFFVRVVFKCgiXG4iKSk7CisJCWFwcGVuZF9TQygmZXNwLT5pc3N1ZV9TQywgU0NwbnQpOworCX0KKworCS8qIFJ1biBpdCBub3cgaWYgd2UgY2FuLiAqLworCWlmKCFlc3AtPmN1cnJlbnRfU0MgJiYgIWVzcC0+cmVzZXR0aW5nX2J1cykKKwkJZXNwX2V4ZWNfY21kKGVzcCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRHVtcCBkcml2ZXIgc3RhdGUuICovCitzdGF0aWMgdm9pZCBlc3BfZHVtcF9jbWQoU2NzaV9DbW5kICpTQ3B0cikKK3sKKwlFU1BMT0coKCJbdGd0PCUwMng+IGx1bjwlMDJ4PiAiCisJCSJwcGhhc2U8JXM+IGNwaGFzZTwlcz5dIiwKKwkJU0NwdHItPmRldmljZS0+aWQsIFNDcHRyLT5kZXZpY2UtPmx1biwKKwkJcGhhc2Vfc3RyaW5nKFNDcHRyLT5TQ3Auc2VudF9jb21tYW5kKSwKKwkJcGhhc2Vfc3RyaW5nKFNDcHRyLT5TQ3AucGhhc2UpKSk7Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIAorCQkJICAgc3RydWN0IEVTUF9yZWdzICplcmVncykKK3sKKwlTY3NpX0NtbmQgKlNDcHRyID0gZXNwLT5jdXJyZW50X1NDOworI2lmZGVmIERFQlVHX0VTUF9DTURTCisJaW50IGk7CisjZW5kaWYKKworCUVTUExPRygoImVzcCVkOiBkdW1waW5nIHN0YXRlXG4iLCBlc3AtPmVzcF9pZCkpOworCQorCS8qIFByaW50IERNQSBzdGF0dXMgKi8KKwllc3AtPmRtYV9kdW1wX3N0YXRlKGVzcCk7CisKKwlFU1BMT0coKCJlc3AlZDogU1cgW3NyZWc8JTAyeD4gc3N0ZXA8JTAyeD4gaXJlZzwlMDJ4Pl1cbiIsCisJCWVzcC0+ZXNwX2lkLCBlc3AtPnNyZWcsIGVzcC0+c2VxcmVnLCBlc3AtPmlyZWcpKTsKKwlFU1BMT0coKCJlc3AlZDogSFcgcmVyZWFkIFtzcmVnPCUwMng+IHNzdGVwPCUwMng+IGlyZWc8JTAyeD5dXG4iLAorCQllc3AtPmVzcF9pZCwgZXNwX3JlYWQoZXJlZ3MtPmVzcF9zdGF0dXMpLCBlc3BfcmVhZChlcmVncy0+ZXNwX3NzdGVwKSwKKwkJZXNwX3JlYWQoZXJlZ3MtPmVzcF9pbnRycHQpKSk7CisjaWZkZWYgREVCVUdfRVNQX0NNRFMKKwlwcmludGsoImVzcCVkOiBsYXN0IEVTUCBjbWRzIFsiLCBlc3AtPmVzcF9pZCk7CisJaSA9IChlc3AtPmVzcGNtZGVudCAtIDEpICYgMzE7CisJcHJpbnRrKCI8Iik7CisJZXNwX3ByaW50X2NtZChlc3AtPmVzcGNtZGxvZ1tpXSk7CisJcHJpbnRrKCI+Iik7CisJaSA9IChpIC0gMSkgJiAzMTsKKwlwcmludGsoIjwiKTsKKwllc3BfcHJpbnRfY21kKGVzcC0+ZXNwY21kbG9nW2ldKTsKKwlwcmludGsoIj4iKTsKKwlpID0gKGkgLSAxKSAmIDMxOworCXByaW50aygiPCIpOworCWVzcF9wcmludF9jbWQoZXNwLT5lc3BjbWRsb2dbaV0pOworCXByaW50aygiPiIpOworCWkgPSAoaSAtIDEpICYgMzE7CisJcHJpbnRrKCI8Iik7CisJZXNwX3ByaW50X2NtZChlc3AtPmVzcGNtZGxvZ1tpXSk7CisJcHJpbnRrKCI+Iik7CisJcHJpbnRrKCJdXG4iKTsKKyNlbmRpZiAvKiAoREVCVUdfRVNQX0NNRFMpICovCisKKwlpZihTQ3B0cikgeworCQlFU1BMT0coKCJlc3AlZDogY3VycmVudCBjb21tYW5kICIsIGVzcC0+ZXNwX2lkKSk7CisJCWVzcF9kdW1wX2NtZChTQ3B0cik7CisJfQorCUVTUExPRygoIlxuIikpOworCVNDcHRyID0gZXNwLT5kaXNjb25uZWN0ZWRfU0M7CisJRVNQTE9HKCgiZXNwJWQ6IGRpc2Nvbm5lY3RlZCAiLCBlc3AtPmVzcF9pZCkpOworCXdoaWxlKFNDcHRyKSB7CisJCWVzcF9kdW1wX2NtZChTQ3B0cik7CisJCVNDcHRyID0gKFNjc2lfQ21uZCAqKSBTQ3B0ci0+aG9zdF9zY3JpYmJsZTsKKwl9CisJRVNQTE9HKCgiXG4iKSk7Cit9CisKKy8qIEFib3J0IGEgY29tbWFuZC4gIFRoZSBob3N0X2xvY2sgaXMgYWNxdWlyZWQgYnkgY2FsbGVyLiAqLworaW50IGVzcF9hYm9ydChTY3NpX0NtbmQgKlNDcHRyKQoreworCXN0cnVjdCBOQ1JfRVNQICplc3AgPSAoc3RydWN0IE5DUl9FU1AgKikgU0NwdHItPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IEVTUF9yZWdzICplcmVncyA9IGVzcC0+ZXJlZ3M7CisJaW50IGRvbjsKKworCUVTUExPRygoImVzcCVkOiBBYm9ydGluZyBjb21tYW5kXG4iLCBlc3AtPmVzcF9pZCkpOworCWVzcF9kdW1wX3N0YXRlKGVzcCwgZXJlZ3MpOworCisJLyogV2hlZWUsIGlmIHRoaXMgaXMgdGhlIGN1cnJlbnQgY29tbWFuZCBvbiB0aGUgYnVzLCB0aGUKKwkgKiBiZXN0IHdlIGNhbiBkbyBpcyBhc3NlcnQgQVROIGFuZCB3YWl0IGZvciBtc2dvdXQgcGhhc2UuCisJICogVGhpcyBzaG91bGQgZXZlbiBmaXggYSBodW5nIFNDU0kgYnVzIHdoZW4gd2UgbG9zZSBzdGF0ZQorCSAqIGluIHRoZSBkcml2ZXIgYW5kIHRpbWVvdXQgYmVjYXVzZSB0aGUgZXZlbnR1YWwgcGhhc2UgY2hhbmdlCisJICogd2lsbCBjYXVzZSB0aGUgRVNQIHRvIChldmVudHVhbGx5KSBnaXZlIGFuIGludGVycnVwdC4KKwkgKi8KKwlpZihlc3AtPmN1cnJlbnRfU0MgPT0gU0NwdHIpIHsKKwkJZXNwLT5jdXJfbXNnb3V0WzBdID0gQUJPUlQ7CisJCWVzcC0+bXNnb3V0X2xlbiA9IDE7CisJCWVzcC0+bXNnb3V0X2N0ciA9IDA7CisJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9TQVROKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCisJLyogSWYgaXQgaXMgc3RpbGwgaW4gdGhlIGlzc3VlIHF1ZXVlIHRoZW4gd2UgY2FuIHNhZmVseQorCSAqIGNhbGwgdGhlIGNvbXBsZXRpb24gcm91dGluZSBhbmQgcmVwb3J0IGFib3J0IHN1Y2Nlc3MuCisJICovCisJZG9uID0gZXNwLT5kbWFfcG9ydHNfcChlc3ApOworCWlmKGRvbikgeworCQllc3AtPmRtYV9pbnRzX29mZihlc3ApOworCQlzeW5jaHJvbml6ZV9pcnEoZXNwLT5pcnEpOworCX0KKwlpZihlc3AtPmlzc3VlX1NDKSB7CisJCVNjc2lfQ21uZCAqKnByZXYsICp0aGlzOworCQlmb3IocHJldiA9ICgmZXNwLT5pc3N1ZV9TQyksIHRoaXMgPSBlc3AtPmlzc3VlX1NDOworCQkgICAgdGhpczsKKwkJICAgIHByZXYgPSAoU2NzaV9DbW5kICoqKSAmKHRoaXMtPmhvc3Rfc2NyaWJibGUpLAorCQkgICAgdGhpcyA9IChTY3NpX0NtbmQgKikgdGhpcy0+aG9zdF9zY3JpYmJsZSkgeworCQkJaWYodGhpcyA9PSBTQ3B0cikgeworCQkJCSpwcmV2ID0gKFNjc2lfQ21uZCAqKSB0aGlzLT5ob3N0X3NjcmliYmxlOworCQkJCXRoaXMtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCQkJCWVzcF9yZWxlYXNlX2RtYWJ1ZnMoZXNwLCB0aGlzKTsKKwkJCQl0aGlzLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCQkJdGhpcy0+ZG9uZSh0aGlzKTsKKwkJCQlpZihkb24pCisJCQkJCWVzcC0+ZG1hX2ludHNfb24oZXNwKTsKKwkJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJCX0KKwkJfQorCX0KKworCS8qIFl1Y2ssIHRoZSBjb21tYW5kIHRvIGFib3J0IGlzIGRpc2Nvbm5lY3RlZCwgaXQgaXMgbm90CisJICogd29ydGggdHJ5aW5nIHRvIGFib3J0IGl0IG5vdyBpZiBzb21ldGhpbmcgZWxzZSBpcyBsaXZlCisJICogb24gdGhlIGJ1cyBhdCB0aGlzIHRpbWUuICBTbywgd2UgbGV0IHRoZSBTQ1NJIGNvZGUgd2FpdAorCSAqIGEgbGl0dGxlIGJpdCBhbmQgdHJ5IGFnYWluIGxhdGVyLgorCSAqLworCWlmKGVzcC0+Y3VycmVudF9TQykgeworCQlpZihkb24pCisJCQllc3AtPmRtYV9pbnRzX29uKGVzcCk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJLyogSXQncyBkaXNjb25uZWN0ZWQsIHdlIGhhdmUgdG8gcmVjb25uZWN0IHRvIHJlLWVzdGFibGlzaAorCSAqIHRoZSBuZXh1cyBhbmQgdGVsbCB0aGUgZGV2aWNlIHRvIGFib3J0LiAgSG93ZXZlciwgd2UgcmVhbGx5CisJICogY2Fubm90ICdyZWNvbm5lY3QnIHBlciBzZS4gIERvbid0IHRyeSB0byBiZSBmYW5jeSwganVzdAorCSAqIGluZGljYXRlIGZhaWx1cmUsIHdoaWNoIGNhdXNlcyBvdXIgY2FsbGVyIHRvIHJlc2V0IHRoZSB3aG9sZQorCSAqIGJ1cy4KKwkgKi8KKworCWlmKGRvbikKKwkJZXNwLT5kbWFfaW50c19vbihlc3ApOworCXJldHVybiBGQUlMRUQ7Cit9CisKKy8qIFdlJ3ZlIHNlbnQgRVNQX0NNRF9SUyB0byB0aGUgRVNQLCB0aGUgaW50ZXJydXB0IGhhZCBqdXN0CisgKiBhcnJpdmVkIGluZGljYXRpbmcgdGhlIGVuZCBvZiB0aGUgU0NTSSBidXMgcmVzZXQuICBPdXIgam9iCisgKiBpcyB0byBjbGVhbiBvdXQgdGhlIGNvbW1hbmQgcXVldWVzIGFuZCBiZWdpbiByZS1leGVjdXRpb24KKyAqIG9mIFNDU0kgY29tbWFuZHMgb25jZSBtb3JlLgorICovCitzdGF0aWMgaW50IGVzcF9maW5pc2hfcmVzZXQoc3RydWN0IE5DUl9FU1AgKmVzcCwKKwkJCSAgICBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCVNjc2lfQ21uZCAqc3AgPSBlc3AtPmN1cnJlbnRfU0M7CisKKwkvKiBDbGVhbiB1cCBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbW1hbmQsIGlmIGFueS4gKi8KKwlpZiAoc3AgIT0gTlVMTCkgeworCQllc3BfcmVsZWFzZV9kbWFidWZzKGVzcCwgc3ApOworCQlzcC0+cmVzdWx0ID0gKERJRF9SRVNFVCA8PCAxNik7CisJCXNwLT5zY3NpX2RvbmUoc3ApOworCQllc3AtPmN1cnJlbnRfU0MgPSBOVUxMOworCX0KKworCS8qIENsZWFuIHVwIGRpc2Nvbm5lY3RlZCBxdWV1ZSwgdGhleSBoYXZlIGJlZW4gaW52YWxpZGF0ZWQKKwkgKiBieSB0aGUgYnVzIHJlc2V0LgorCSAqLworCWlmIChlc3AtPmRpc2Nvbm5lY3RlZF9TQykgeworCQl3aGlsZSgoc3AgPSByZW1vdmVfZmlyc3RfU0MoJmVzcC0+ZGlzY29ubmVjdGVkX1NDKSkgIT0gTlVMTCkgeworCQkJZXNwX3JlbGVhc2VfZG1hYnVmcyhlc3AsIHNwKTsKKwkJCXNwLT5yZXN1bHQgPSAoRElEX1JFU0VUIDw8IDE2KTsKKwkJCXNwLT5zY3NpX2RvbmUoc3ApOworCQl9CisJfQorCisJLyogU0NTSSBidXMgcmVzZXQgaXMgY29tcGxldGUuICovCisJZXNwLT5yZXNldHRpbmdfYnVzID0gMDsKKwl3YWtlX3VwKCZlc3AtPnJlc2V0X3F1ZXVlKTsKKworCS8qIE9rLCBub3cgaXQgaXMgc2FmZSB0byBnZXQgY29tbWFuZHMgZ29pbmcgb25jZSBtb3JlLiAqLworCWlmKGVzcC0+aXNzdWVfU0MpCisJCWVzcF9leGVjX2NtZChlc3ApOworCisJcmV0dXJuIGRvX2ludHJfZW5kOworfQorCitzdGF0aWMgaW50IGVzcF9kb19yZXNldGJ1cyhzdHJ1Y3QgTkNSX0VTUCAqZXNwLAorCQkJICAgc3RydWN0IEVTUF9yZWdzICplcmVncykKK3sKKwlFU1BMT0coKCJlc3AlZDogUmVzZXR0aW5nIHNjc2kgYnVzXG4iLCBlc3AtPmVzcF9pZCkpOworCWVzcC0+cmVzZXR0aW5nX2J1cyA9IDE7CisJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1JTKTsKKworCXJldHVybiBkb19pbnRyX2VuZDsKK30KKworLyogUmVzZXQgRVNQIGNoaXAsIHJlc2V0IGhhbmdpbmcgYnVzLCB0aGVuIGtpbGwgYWN0aXZlIGFuZAorICogZGlzY29ubmVjdGVkIGNvbW1hbmRzIGZvciB0YXJnZXRzIHdpdGhvdXQgc29mdCByZXNldC4KKyAqCisgKiBUaGUgaG9zdF9sb2NrIGlzIGFjcXVpcmVkIGJ5IGNhbGxlci4KKyAqLworaW50IGVzcF9yZXNldChTY3NpX0NtbmQgKlNDcHRyKQoreworCXN0cnVjdCBOQ1JfRVNQICplc3AgPSAoc3RydWN0IE5DUl9FU1AgKikgU0NwdHItPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwkodm9pZCkgZXNwX2RvX3Jlc2V0YnVzKGVzcCwgZXNwLT5lcmVncyk7CisKKwlzcGluX3VubG9ja19pcnEoZXNwLT5laG9zdC0+aG9zdF9sb2NrKTsKKworCXdhaXRfZXZlbnQoZXNwLT5yZXNldF9xdWV1ZSwgKGVzcC0+cmVzZXR0aW5nX2J1cyA9PSAwKSk7CisKKwlzcGluX2xvY2tfaXJxKGVzcC0+ZWhvc3QtPmhvc3RfbG9jayk7CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyogSW50ZXJuYWwgRVNQIGRvbmUgZnVuY3Rpb24uICovCitzdGF0aWMgdm9pZCBlc3BfZG9uZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZXJyb3IpCit7CisJU2NzaV9DbW5kICpkb25lX1NDOworCisJaWYoZXNwLT5jdXJyZW50X1NDKSB7CisJCWRvbmVfU0MgPSBlc3AtPmN1cnJlbnRfU0M7CisJCWVzcC0+Y3VycmVudF9TQyA9IE5VTEw7CisJCWVzcF9yZWxlYXNlX2RtYWJ1ZnMoZXNwLCBkb25lX1NDKTsKKwkJZG9uZV9TQy0+cmVzdWx0ID0gZXJyb3I7CisJCWRvbmVfU0MtPnNjc2lfZG9uZShkb25lX1NDKTsKKworCQkvKiBCdXMgaXMgZnJlZSwgaXNzdWUgYW55IGNvbW1hbmRzIGluIHRoZSBxdWV1ZS4gKi8KKwkJaWYoZXNwLT5pc3N1ZV9TQyAmJiAhZXNwLT5jdXJyZW50X1NDKQorCQkJZXNwX2V4ZWNfY21kKGVzcCk7CisJfSBlbHNlIHsKKwkJLyogUGFuaWMgaXMgc2FmZSBhcyBjdXJyZW50X1NDIGlzIG51bGwgc28gd2UgbWF5IHN0aWxsCisJCSAqIGJlIGFibGUgdG8gYWNjZXB0IG1vcmUgY29tbWFuZHMgdG8gc3luYyBkaXNrIGJ1ZmZlcnMuCisJCSAqLworCQlFU1BMT0coKCJwYW5pY2luZ1xuIikpOworCQlwYW5pYygiZXNwOiBkb25lKCkgY2FsbGVkIHdpdGggTlVMTCBlc3AtPmN1cnJlbnRfU0MiKTsKKwl9Cit9CisKKy8qIFdoZWVlLCBFU1AgaW50ZXJydXB0IGVuZ2luZS4gKi8gIAorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucy4gKi8KK3N0YXRpYyBpbnQgZXNwX2RvX3BoYXNlX2RldGVybWluZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCAKKwkJCQkgIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpOworc3RhdGljIGludCBlc3BfZG9fZGF0YV9maW5hbGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncyk7CitzdGF0aWMgaW50IGVzcF9zZWxlY3RfY29tcGxldGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncyk7CitzdGF0aWMgaW50IGVzcF9kb19zdGF0dXMoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncyk7CitzdGF0aWMgaW50IGVzcF9kb19tc2dpbihzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKTsKK3N0YXRpYyBpbnQgZXNwX2RvX21zZ2luZG9uZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKTsKK3N0YXRpYyBpbnQgZXNwX2RvX21zZ291dChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKTsKK3N0YXRpYyBpbnQgZXNwX2RvX2NtZGJlZ2luKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpOworCisjZGVmaW5lIHNyZWdfZGF0YWlucChfX3NyZWcpICAoKChfX3NyZWcpICYgRVNQX1NUQVRfUE1BU0spID09IEVTUF9ESVApCisjZGVmaW5lIHNyZWdfZGF0YW91dHAoX19zcmVnKSAoKChfX3NyZWcpICYgRVNQX1NUQVRfUE1BU0spID09IEVTUF9ET1ApCisKKy8qIFdlIHRyeSB0byBhdm9pZCBzb21lIGludGVycnVwdHMgYnkganVtcGluZyBhaGVhZCBhbmQgc2VlIGlmIHRoZSBFU1AKKyAqIGhhcyBnb3R0ZW4gZmFyIGVub3VnaCB5ZXQuICBIZW5jZSB0aGUgZm9sbG93aW5nLgorICovCitzdGF0aWMgaW5saW5lIGludCBza2lwYWhlYWQxKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MsCisJCQkgICAgIFNjc2lfQ21uZCAqc2NwLCBpbnQgcHJldl9waGFzZSwgaW50IG5ld19waGFzZSkKK3sKKwlpZihzY3AtPlNDcC5zZW50X2NvbW1hbmQgIT0gcHJldl9waGFzZSkKKwkJcmV0dXJuIDA7CisKKwlpZihlc3AtPmRtYV9pcnFfcChlc3ApKSB7CisJCS8qIFllcywgd2UgYXJlIGFibGUgdG8gc2F2ZSBhbiBpbnRlcnJ1cHQuICovCisJCWVzcC0+c3JlZyA9IChlc3BfcmVhZChlcmVncy0+ZXNwX3N0YXR1cykgJiB+KEVTUF9TVEFUX0lOVFIpKTsKKwkJZXNwLT5pcmVnID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9pbnRycHQpOworCQlpZighKGVzcC0+aXJlZyAmIEVTUF9JTlRSX1NSKSkKKwkJCXJldHVybiAwOworCQllbHNlCisJCQlyZXR1cm4gZG9fcmVzZXRfY29tcGxldGU7CisJfQorCS8qIEhvIGh1bSwgdGFyZ2V0IGlzIHRha2luZyBmb3JldmVyLi4uICovCisJc2NwLT5TQ3Auc2VudF9jb21tYW5kID0gbmV3X3BoYXNlOyAvKiBzbyB3ZSBkb24ndCByZWN1cnNlLi4uICovCisJcmV0dXJuIGRvX2ludHJfZW5kOworfQorCitzdGF0aWMgaW5saW5lIGludCBza2lwYWhlYWQyKHN0cnVjdCBOQ1JfRVNQICplc3AsCisJCQkgICAgIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MsCisJCQkgICAgIFNjc2lfQ21uZCAqc2NwLCBpbnQgcHJldl9waGFzZTEsIGludCBwcmV2X3BoYXNlMiwKKwkJCSAgICAgaW50IG5ld19waGFzZSkKK3sKKwlpZihzY3AtPlNDcC5zZW50X2NvbW1hbmQgIT0gcHJldl9waGFzZTEgJiYKKwkgICBzY3AtPlNDcC5zZW50X2NvbW1hbmQgIT0gcHJldl9waGFzZTIpCisJCXJldHVybiAwOworCWlmKGVzcC0+ZG1hX2lycV9wKGVzcCkpIHsKKwkJLyogWWVzLCB3ZSBhcmUgYWJsZSB0byBzYXZlIGFuIGludGVycnVwdC4gKi8KKwkJZXNwLT5zcmVnID0gKGVzcF9yZWFkKGVyZWdzLT5lc3Bfc3RhdHVzKSAmIH4oRVNQX1NUQVRfSU5UUikpOworCQllc3AtPmlyZWcgPSBlc3BfcmVhZChlcmVncy0+ZXNwX2ludHJwdCk7CisJCWlmKCEoZXNwLT5pcmVnICYgRVNQX0lOVFJfU1IpKQorCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXJldHVybiBkb19yZXNldF9jb21wbGV0ZTsKKwl9CisJLyogSG8gaHVtLCB0YXJnZXQgaXMgdGFraW5nIGZvcmV2ZXIuLi4gKi8KKwlzY3AtPlNDcC5zZW50X2NvbW1hbmQgPSBuZXdfcGhhc2U7IC8qIHNvIHdlIGRvbid0IHJlY3Vyc2UuLi4gKi8KKwlyZXR1cm4gZG9faW50cl9lbmQ7Cit9CisKKy8qIE1pc2MuIGVzcCBoZWxwZXIgbWFjcm9zLiAqLworI2RlZmluZSBlc3Bfc2V0Y291bnQoX19lcmVncywgX19jbnQpIFwKKwllc3Bfd3JpdGUoKF9fZXJlZ3MpLT5lc3BfdGNsb3csICgoX19jbnQpICYgMHhmZikpOyBcCisJZXNwX3dyaXRlKChfX2VyZWdzKS0+ZXNwX3RjbWVkLCAoKChfX2NudCkgPj4gOCkgJiAweGZmKSkKKworI2RlZmluZSBlc3BfZ2V0Y291bnQoX19lcmVncykgXAorCSgoZXNwX3JlYWQoKF9fZXJlZ3MpLT5lc3BfdGNsb3cpJjB4ZmYpIHwgXAorCSAoKGVzcF9yZWFkKChfX2VyZWdzKS0+ZXNwX3RjbWVkKSYweGZmKSA8PCA4KSkKKworI2RlZmluZSBmY291bnQoX19lc3AsIF9fZXJlZ3MpIFwKKwkoZXNwX3JlYWQoKF9fZXJlZ3MpLT5lc3BfZmZsYWdzKSAmIEVTUF9GRl9GQllURVMpCisKKyNkZWZpbmUgZm56ZXJvKF9fZXNwLCBfX2VyZWdzKSBcCisJKGVzcF9yZWFkKChfX2VyZWdzKS0+ZXNwX2ZmbGFncykgJiBFU1BfRkZfT05PVFpFUk8pCisKKy8qIFhYWCBzcGVjdWxhdGl2ZSBub3BzIHVubmVjZXNzYXJ5IHdoZW4gY29udGludWluZyBhbWlkc3QgYSBkYXRhIHBoYXNlCisgKiBYWFggZXZlbiBvbiBlc3AxMDAhISEgIGFub3RoZXIgY2FzZSBvZiBmbG9vZGluZyB0aGUgYnVzIHdpdGggSS9PIHJlZworICogWFhYIHdyaXRlcy4uLgorICovCisjZGVmaW5lIGVzcF9tYXliZV9ub3AoX19lc3AsIF9fZXJlZ3MpIFwKKwlpZigoX19lc3ApLT5lcmV2ID09IGVzcDEwMCkgXAorCQllc3BfY21kKChfX2VzcCksIChfX2VyZWdzKSwgRVNQX0NNRF9OVUxMKQorCisjZGVmaW5lIHNyZWdfdG9fZGF0YXBoYXNlKF9fc3JlZykgXAorCSgoKChfX3NyZWcpICYgRVNQX1NUQVRfUE1BU0spID09IEVTUF9ET1ApID8gaW5fZGF0YW91dCA6IGluX2RhdGFpbikKKworLyogVGhlIEVTUDEwMCB3aGVuIGluIHN5bmNocm9ub3VzIGRhdGEgcGhhc2UsIGNhbiBtaXN0YWtlIGEgbG9uZyBmaW5hbAorICogUkVRIHB1bHNlIGZyb20gdGhlIHRhcmdldCBhcyBhbiBleHRyYSBieXRlLCBpdCBwbGFjZXMgd2hhdGV2ZXIgaXMgb24KKyAqIHRoZSBkYXRhIGxpbmVzIGludG8gdGhlIGZpZm8uICBGb3Igbm93LCB3ZSB3aWxsIGFzc3VtZSB3aGVuIHRoaXMKKyAqIGhhcHBlbnMgdGhhdCB0aGUgdGFyZ2V0IGlzIGEgYml0IHF1aXJreSBhbmQgd2UgZG9uJ3Qgd2FudCB0bworICogYmUgdGFsa2luZyBzeW5jaHJvbm91c2x5IHRvIGl0IGFueXdheXMuICBSZWdhcmRsZXNzLCB3ZSBuZWVkIHRvCisgKiB0ZWxsIHRoZSBFU1AgdG8gZWF0IHRoZSBleHRyYW5lb3VzIGJ5dGUgc28gdGhhdCB3ZSBjYW4gcHJvY2VlZAorICogdG8gdGhlIG5leHQgcGhhc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGVzcDEwMF9zeW5jX2h3YnVnKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MsCisJCQkJICAgIFNjc2lfQ21uZCAqc3AsIGludCBmaWZvY250KQoreworCS8qIERvIG5vdCB0b3VjaCB0aGlzIHBpZWNlIG9mIGNvZGUuICovCisJaWYoKCEoZXNwLT5lcmV2ID09IGVzcDEwMCkpIHx8CisJICAgKCEoc3JlZ19kYXRhaW5wKChlc3AtPnNyZWcgPSBlc3BfcmVhZChlcmVncy0+ZXNwX3N0YXR1cykpKSAmJiAhZmlmb2NudCkgJiYKKwkgICAgIShzcmVnX2RhdGFvdXRwKGVzcC0+c3JlZykgJiYgIWZuemVybyhlc3AsIGVyZWdzKSkpKSB7CisJCWlmKHNwLT5TQ3AucGhhc2UgPT0gaW5fZGF0YW91dCkKKwkJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9GTFVTSCk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIEFzeW5jIG1vZGUgZm9yIHRoaXMgZ3V5LiAqLworCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgMCwgMCk7CisKKwkJLyogQWNrIHRoZSBib2d1cyBieXRlLCBidXQgc2V0IEFUTiBmaXJzdC4gKi8KKwkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1NBVE4pOworCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfTU9LKTsKKwkJcmV0dXJuIDE7CisJfQorfQorCisvKiBUaGlzIGNsb3NlcyB0aGUgd2luZG93IGR1cmluZyBhIHNlbGVjdGlvbiB3aXRoIGEgcmVzZWxlY3QgcGVuZGluZywgYmVjYXVzZQorICogd2UgdXNlIERNQSBmb3IgdGhlIHNlbGVjdGlvbiBwcm9jZXNzIHRoZSBGSUZPIHNob3VsZCBob2xkIHRoZSBjb3JyZWN0CisgKiBjb250ZW50cyBpZiB3ZSBnZXQgcmVzZWxlY3RlZCBkdXJpbmcgdGhpcyBwcm9jZXNzLiAgU28gd2UganVzdCBuZWVkIHRvCisgKiBhY2sgdGhlIHBvc3NpYmxlIGlsbGVnYWwgY21kIGludGVycnVwdCBwZW5kaW5nIG9uIHRoZSBlc3AxMDAuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGVzcDEwMF9yZWNvbm5lY3RfaHdidWcoc3RydWN0IE5DUl9FU1AgKmVzcCwKKwkJCQkJIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJdm9sYXRpbGUgdW5jaGFyIGp1bms7CisKKwlpZihlc3AtPmVyZXYgIT0gZXNwMTAwKQorCQlyZXR1cm4gMDsKKwlqdW5rID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9pbnRycHQpOworCisJaWYoanVuayAmIEVTUF9JTlRSX1NSKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyB2ZXJpZmllcyB0aGUgQlVTSUQgYml0cyBkdXJpbmcgYSByZXNlbGVjdGlvbiBzbyB0aGF0IHdlIGtub3cgd2hpY2gKKyAqIHRhcmdldCBpcyB0YWxraW5nIHRvIHVzLgorICovCitzdGF0aWMgaW5saW5lIGludCByZWNvbm5lY3RfdGFyZ2V0KHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJaW50IGl0LCBtZSA9IGVzcC0+c2NzaV9pZF9tYXNrLCB0YXJnID0gMDsKKworCWlmKDIgIT0gZmNvdW50KGVzcCwgZXJlZ3MpKQorCQlyZXR1cm4gLTE7CisJaXQgPSBlc3BfcmVhZChlcmVncy0+ZXNwX2ZkYXRhKTsKKwlpZighKGl0ICYgbWUpKQorCQlyZXR1cm4gLTE7CisJaXQgJj0gfm1lOworCWlmKGl0ICYgKGl0IC0gMSkpCisJCXJldHVybiAtMTsKKwl3aGlsZSghKGl0ICYgMSkpCisJCXRhcmcrKywgaXQgPj49IDE7CisJcmV0dXJuIHRhcmc7Cit9CisKKy8qIFRoaXMgdmVyaWZpZXMgdGhlIGlkZW50aWZ5IGZyb20gdGhlIHRhcmdldCBzbyB0aGF0IHdlIGtub3cgd2hpY2ggbHVuIGlzCisgKiBiZWluZyByZWNvbm5lY3RlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcmVjb25uZWN0X2x1bihzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCWludCBsdW47CisKKwlpZigoZXNwLT5zcmVnICYgRVNQX1NUQVRfUE1BU0spICE9IEVTUF9NSVApCisJCXJldHVybiAtMTsKKwlsdW4gPSBlc3BfcmVhZChlcmVncy0+ZXNwX2ZkYXRhKTsKKworCS8qIFllcywgeW91IHJlYWQgdGhpcyBjb3JyZWN0bHkuICBXZSByZXBvcnQgbHVuIG9mIHplcm8KKwkgKiBpZiB3ZSBzZWUgcGFyaXR5IGVycm9yLiAgRVNQIHJlcG9ydHMgcGFyaXR5IGVycm9yIGZvcgorCSAqIHRoZSBsdW4gYnl0ZSwgYW5kIHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIGhvcGUgdG8gcmVjb3ZlcgorCSAqIGJlY2F1c2UgdGhlIHRhcmdldCBpcyBjb25uZWN0ZWQuCisJICovCisJaWYoZXNwLT5zcmVnICYgRVNQX1NUQVRfUEVSUikKKwkJcmV0dXJuIDA7CisKKwkvKiBDaGVjayBmb3IgaWxsZWdhbCBiaXRzIGJlaW5nIHNldCBpbiB0aGUgbHVuLiAqLworCWlmKChsdW4gJiAweDQwKSB8fCAhKGx1biAmIDB4ODApKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gbHVuICYgNzsKK30KKworLyogVGhpcyBwdXRzIHRoZSBkcml2ZXIgaW4gYSBzdGF0ZSB3aGVyZSBpdCBjYW4gcmV2aXRhbGl6ZSBhIGNvbW1hbmQgdGhhdAorICogaXMgYmVpbmcgY29udGludWVkIGR1ZSB0byByZXNlbGVjdGlvbi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGVzcF9jb25uZWN0KHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MsCisJCQkgICAgICAgU2NzaV9DbW5kICpzcCkKK3sKKwlTY3NpX0RldmljZSAqZHAgPSBzcC0+ZGV2aWNlOworCXN0cnVjdCBlc3BfZGV2aWNlICplc3BfZGV2ID0gZHAtPmhvc3RkYXRhOworCisJaWYoZXNwLT5wcmV2X3NvZmYgICE9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCB8fAorCSAgIGVzcC0+cHJldl9zdHAgICAhPSBlc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgfHwKKwkgICAoZXNwLT5lcmV2ID4gZXNwMTAwYSAmJgorCSAgICBlc3AtPnByZXZfY2ZnMyAhPSBlc3AtPmNvbmZpZzNbc3AtPmRldmljZS0+aWRdKSkgeworCQllc3AtPnByZXZfc29mZiA9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldDsKKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3Bfc29mZiwgZXNwLT5wcmV2X3NvZmYpOworCQllc3AtPnByZXZfc3RwID0gZXNwX2Rldi0+c3luY19taW5fcGVyaW9kOworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9zdHAsIGVzcC0+cHJldl9zdHApOworCQlpZihlc3AtPmVyZXYgPiBlc3AxMDBhKSB7CisJCQllc3AtPnByZXZfY2ZnMyA9IGVzcC0+Y29uZmlnM1tzcC0+ZGV2aWNlLT5pZF07CisJCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmczLCBlc3AtPnByZXZfY2ZnMyk7CisJCX0gCisJfQorCWVzcC0+Y3VycmVudF9TQyA9IHNwOworfQorCisvKiBUaGlzIHdpbGwgcGxhY2UgdGhlIGN1cnJlbnQgd29ya2luZyBjb21tYW5kIGJhY2sgaW50byB0aGUgaXNzdWUgcXVldWUKKyAqIGlmIHdlIGFyZSB0byByZWNlaXZlIGEgcmVzZWxlY3Rpb24gYW1pZHN0IGEgc2VsZWN0aW9uIGF0dGVtcHQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlc3BfcmVjb25uZWN0KHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisJaWYoIWVzcC0+ZGlzY29ubmVjdGVkX1NDKQorCQlFU1BMT0coKCJlc3AlZDogV2VpcmQsIGJlaW5nIHJlc2VsZWN0ZWQgYnV0IGRpc2Nvbm5lY3RlZCAiCisJCQkiY29tbWFuZCBxdWV1ZSBpcyBlbXB0eS5cbiIsIGVzcC0+ZXNwX2lkKSk7CisJZXNwLT5zbmlwID0gMDsKKwllc3AtPmN1cnJlbnRfU0MgPSBOVUxMOworCXNwLT5TQ3AucGhhc2UgPSBub3RfaXNzdWVkOworCWFwcGVuZF9TQygmZXNwLT5pc3N1ZV9TQywgc3ApOworfQorCisvKiBCZWdpbiBtZXNzYWdlIGluIHBoYXNlLiAqLworc3RhdGljIGludCBlc3BfZG9fbXNnaW4oc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncykKK3sKKwllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRkxVU0gpOworCWVzcF9tYXliZV9ub3AoZXNwLCBlcmVncyk7CisJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1RJKTsKKwllc3AtPm1zZ2luX2xlbiA9IDE7CisJZXNwLT5tc2dpbl9jdHIgPSAwOworCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fbXNnaW5kb25lKTsKKwlyZXR1cm4gZG9fd29ya19idXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZHZhbmNlX3NnKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisJKytzcC0+U0NwLmJ1ZmZlcjsKKwktLXNwLT5TQ3AuYnVmZmVyc19yZXNpZHVhbDsKKwlzcC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBzcC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCWlmIChlc3AtPmRtYV9hZHZhbmNlX3NnKQorCQllc3AtPmRtYV9hZHZhbmNlX3NnIChzcCk7CisJZWxzZQorCQlzcC0+U0NwLnB0ciA9IChjaGFyICopIHZpcnRfdG9fcGh5cygocGFnZV9hZGRyZXNzKHNwLT5TQ3AuYnVmZmVyLT5wYWdlKSArIHNwLT5TQ3AuYnVmZmVyLT5vZmZzZXQpKTsKKworfQorCisvKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSB3YXkgSSd2ZSBjb2RlZCB0aGVzZSByb3V0aW5lcyBpcyB0aGF0IEkgX2Fsd2F5c18KKyAqIGNoZWNrIGZvciBhIGRpc2Nvbm5lY3QgZHVyaW5nIGFueSBhbmQgYWxsIGluZm9ybWF0aW9uIHRyYW5zZmVyCisgKiBwaGFzZXMuICBUaGUgU0NTSSBzdGFuZGFyZCBzdGF0ZXMgdGhhdCB0aGUgdGFyZ2V0IF9jYW5fIGNhdXNlIGEgQlVTCisgKiBGUkVFIGNvbmRpdGlvbiBieSBkcm9wcGluZyBhbGwgTVNHL0NEL0lPL0JTWSBzaWduYWxzLiAgQWxzbyBub3RlCisgKiB0aGF0IGR1cmluZyBpbmZvcm1hdGlvbiB0cmFuc2ZlciBwaGFzZXMgdGhlIHRhcmdldCBjb250cm9scyBldmVyeQorICogY2hhbmdlIGluIHBoYXNlLCB0aGUgb25seSB0aGluZyB0aGUgaW5pdGlhdG9yIGNhbiBkbyBpcyAiYXNrIiBmb3IKKyAqIGEgbWVzc2FnZSBvdXQgcGhhc2UgYnkgZHJpdmluZyBBVE4gdHJ1ZS4gIFRoZSB0YXJnZXQgY2FuLCBhbmQgc29tZXRpbWVzCisgKiB3aWxsLCBjb21wbGV0ZWx5IGlnbm9yZSB0aGlzIHJlcXVlc3Qgc28gd2UgY2Fubm90IGFzc3VtZSBhbnl0aGluZyB3aGVuCisgKiB3ZSB0cnkgdG8gZm9yY2UgYSBtZXNzYWdlIG91dCBwaGFzZSB0byBhYm9ydC9yZXNldCBhIHRhcmdldC4gIE1vc3Qgb2YKKyAqIHRoZSB0aW1lIHRoZSB0YXJnZXQgd2lsbCBldmVudHVhbGx5IGJlIG5pY2UgYW5kIGdvIHRvIG1lc3NhZ2Ugb3V0LCBzbworICogd2UgbWF5IGhhdmUgdG8gaG9sZCBvbiB0byBvdXIgc3RhdGUgYWJvdXQgd2hhdCB3ZSB3YW50IHRvIHRlbGwgdGhlIHRhcmdldAorICogZm9yIHNvbWUgcGVyaW9kIG9mIHRpbWUuCisgKi8KKworLyogSSB0aGluayBJIGhhdmUgdGhpbmdzIHdvcmtpbmcgaGVyZSBjb3JyZWN0bHkuICBFdmVuIHBhcnRpYWwgdHJhbnNmZXJzCisgKiB3aXRoaW4gYSBidWZmZXIgb3Igc3ViLWJ1ZmZlciBzaG91bGQgbm90IHVwc2V0IHVzIGF0IGFsbCBubyBtYXR0ZXIKKyAqIGhvdyBiYWQgdGhlIHRhcmdldCBhbmQvb3IgRVNQIGZ1Y2tzIHRoaW5ncyB1cC4KKyAqLworc3RhdGljIGludCBlc3BfZG9fZGF0YShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCVNjc2lfQ21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7CisJaW50IHRoaXNwaGFzZSwgaG11Y2g7CisKKwlFU1BEQVRBKCgiZXNwX2RvX2RhdGE6ICIpKTsKKwllc3BfbWF5YmVfbm9wKGVzcCwgZXJlZ3MpOworCXRoaXNwaGFzZSA9IHNyZWdfdG9fZGF0YXBoYXNlKGVzcC0+c3JlZyk7CisJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIHRoaXNwaGFzZSk7CisJRVNQREFUQSgoIm5ld3BoYXNlPCVzPiAiLCAodGhpc3BoYXNlID09IGluX2RhdGFpbikgPyAiREFUQUlOIiA6ICJEQVRBT1VUIikpOworCWhtdWNoID0gZXNwLT5kbWFfY2FuX3RyYW5zZmVyKGVzcCwgU0NwdHIpOworCisJLyoKKwkgKiBYWFggTVNjaDogY2F0ZXIgZm9yIFBJTyB0cmFuc2ZlciBoZXJlOyBQSU8gdXNlZCBpZiBobXVjaCA9PSAwCisJICovCisJaWYgKGhtdWNoKSB7CS8qIERNQSAqLworCQkvKgorCQkgKiBETUEKKwkJICovCisJCUVTUERBVEEoKCJobXVjaDwlZD4gIiwgaG11Y2gpKTsKKwkJZXNwLT5jdXJyZW50X3RyYW5zZmVyX3NpemUgPSBobXVjaDsKKwkJZXNwX3NldGNvdW50KGVyZWdzLCAoZXNwLT5mYXNfcHJlbWF0dXJlX2ludHJfd29ya2Fyb3VuZCA/CisJCQkJICAgICAoaG11Y2ggKyAweDQwKSA6IGhtdWNoKSk7CisJCWVzcC0+ZG1hX3NldHVwKGVzcCwgKF9fdTMyKSgodW5zaWduZWQgbG9uZylTQ3B0ci0+U0NwLnB0ciksIAorCQkJICAgICAgIGhtdWNoLCAodGhpc3BoYXNlID09IGluX2RhdGFpbikpOworCQlFU1BEQVRBKCgiRE1BfFRJIC0tPiBkb19pbnRyX2VuZFxuIikpOworCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRE1BIHwgRVNQX0NNRF9USSk7CisJCXJldHVybiBkb19pbnRyX2VuZDsKKwkJLyoKKwkJICogZW5kIERNQQorCQkgKi8KKwl9IGVsc2UgeworCQkvKgorCQkgKiBQSU8KKwkJICovCisJCWludCBvbGRwaGFzZSwgaSA9IDA7IC8qIG9yIHdoZXJlIHdlIGxlZnQgb2ZmIGxhc3QgdGltZSA/PyBlc3AtPmN1cnJlbnRfZGF0YSA/PyAqLworCQlpbnQgZmlmb2NudCA9IDA7CisKKwkJb2xkcGhhc2UgPSBlc3BfcmVhZChlcmVncy0+ZXNwX3N0YXR1cykgJiBFU1BfU1RBVF9QTUFTSzsKKworCQkvKgorCQkgKiBwb2xsZWQgdHJhbnNmZXI7IHVnbHksIGNhbiB3ZSBtYWtlIHRoaXMgaGFwcGVuIGluIGEgRFJRIAorCQkgKiBpbnRlcnJ1cHQgaGFuZGxlciA/PworCQkgKiByZXF1aXJlcyBrZWVwaW5nIHRyYWNrIG9mIHN0YXRlIGluZm9ybWF0aW9uIGluIGhvc3Qgb3IgCisJCSAqIGNvbW1hbmQgc3RydWN0IQorCQkgKiBQcm9ibGVtOiBJJ3ZlIG5ldmVyIHNlZW4gYSBEUlEgaGFwcGVuIG9uIE1hYywgbm90IGV2ZW4KKwkJICogd2l0aCBFU1BfQ01EX0RNQSAuLi4KKwkJICovCisKKwkJLyogZmlndXJlIG91dCBob3cgbXVjaCBuZWVkcyB0byBiZSB0cmFuc2ZlcnJlZCAqLworCQlobXVjaCA9IFNDcHRyLT5TQ3AudGhpc19yZXNpZHVhbDsKKwkJRVNQREFUQSgoImhtdWNoPCVkPiBwaW8gIiwgaG11Y2gpKTsKKwkJZXNwLT5jdXJyZW50X3RyYW5zZmVyX3NpemUgPSBobXVjaDsKKworCQkvKiB0ZWxsIHRoZSBFU1AgLi4uICovCisJCWVzcF9zZXRjb3VudChlcmVncywgaG11Y2gpOworCisJCS8qIGxvb3AgKi8KKwkJd2hpbGUgKGhtdWNoKSB7CisJCQlpbnQgaiwgZmlmb19zdHVjayA9IDAsIG5ld3BoYXNlOworCQkJdW5zaWduZWQgbG9uZyBmbGFncywgdGltZW91dDsKKyNpZiAwCisJCQlpZiAoIGkgJSAxMCApCisJCQkJRVNQREFUQSgoIlxyIikpOworCQkJZWxzZQorCQkJCUVTUERBVEEoKCAvKiJcbiIqLyAiXHIiKSk7CisjZW5kaWYKKyNpZiAwCisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisjZW5kaWYKKwkJCWlmKHRoaXNwaGFzZSA9PSBpbl9kYXRhaW4pIHsKKwkJCQkvKiAnZ28nIC4uLiAqLyAKKwkJCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfVEkpOworCisJCQkJLyogd2FpdCBmb3IgZGF0YSAqLworCQkJCXRpbWVvdXQgPSAxMDAwMDAwOworCQkJCXdoaWxlICghKChlc3AtPnNyZWc9ZXNwX3JlYWQoZXJlZ3MtPmVzcF9zdGF0dXMpKSAmIEVTUF9TVEFUX0lOVFIpICYmIC0tdGltZW91dCkKKwkJCQkJdWRlbGF5KDIpOworCQkJCWlmICh0aW1lb3V0ID09IDApCisJCQkJCXByaW50aygiRFJRIGRhdGFpbiB0aW1lb3V0ISBcbiIpOworCisJCQkJbmV3cGhhc2UgPSBlc3AtPnNyZWcgJiBFU1BfU1RBVF9QTUFTSzsKKworCQkJCS8qIHNlZSBob3cgbXVjaCB3ZSBnb3QgLi4uICovCisJCQkJZmlmb2NudCA9IChlc3BfcmVhZChlcmVncy0+ZXNwX2ZmbGFncykgJiBFU1BfRkZfRkJZVEVTKTsKKworCQkJCWlmICghZmlmb2NudCkKKwkJCQkJZmlmb19zdHVjaysrOworCQkJCWVsc2UKKwkJCQkJZmlmb19zdHVjayA9IDA7CisKKwkJCQlFU1BEQVRBKCgiXHJnb3QgJWQgc3QgJXggcGggJXgiLCBmaWZvY250LCBlc3AtPnNyZWcsIG5ld3BoYXNlKSk7CisKKwkJCQkvKiByZWFkIGZpZm8gKi8KKwkJCQlmb3Ioaj0wO2o8Zmlmb2NudDtqKyspCisJCQkJCVNDcHRyLT5TQ3AucHRyW2krK10gPSBlc3BfcmVhZChlcmVncy0+ZXNwX2ZkYXRhKTsKKworCQkJCUVTUERBVEEoKCIoJWQpICIsIGkpKTsKKworCQkJCS8qIGhvdyBtYW55IHRvIGdvID8/ICovCisJCQkJaG11Y2ggLT0gZmlmb2NudDsKKworCQkJCS8qIGJyZWFrIGlmIHN0YXR1cyBwaGFzZSAhISAqLworCQkJCWlmKG5ld3BoYXNlID09IEVTUF9TVEFUUCkgeworCQkJCQkvKiBjbGVhciBpbnQuICovCisJCQkJCWVzcC0+aXJlZyA9IGVzcF9yZWFkKGVyZWdzLT5lc3BfaW50cnB0KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKyNkZWZpbmUgTUFYX0ZJRk8gOAorCQkJCS8qIGhvdyBtdWNoIHdpbGwgZml0ID8gKi8KKwkJCQlpbnQgdGhpc19jb3VudCA9IE1BWF9GSUZPIC0gZmlmb2NudDsKKwkJCQlpZiAodGhpc19jb3VudCA+IGhtdWNoKQorCQkJCQl0aGlzX2NvdW50ID0gaG11Y2g7CisKKwkJCQkvKiBmaWxsIGZpZm8gKi8KKwkJCQlmb3Ioaj0wO2o8dGhpc19jb3VudDtqKyspCisJCQkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBTQ3B0ci0+U0NwLnB0cltpKytdKTsKKworCQkJCS8qIGhvdyBtYW55IGxlZnQgaWYgdGhpcyBnb2VzIG91dCA/PyAqLworCQkJCWhtdWNoIC09IHRoaXNfY291bnQ7CisKKwkJCQkvKiAnZ28nIC4uLiAqLyAKKwkJCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfVEkpOworCisJCQkJLyogd2FpdCBmb3IgJ2dvdCBpdCcgKi8KKwkJCQl0aW1lb3V0ID0gMTAwMDAwMDsKKwkJCQl3aGlsZSAoISgoZXNwLT5zcmVnPWVzcF9yZWFkKGVyZWdzLT5lc3Bfc3RhdHVzKSkgJiBFU1BfU1RBVF9JTlRSKSAmJiAtLXRpbWVvdXQpCisJCQkJCXVkZWxheSgyKTsKKwkJCQlpZiAodGltZW91dCA9PSAwKQorCQkJCQlwcmludGsoIkRSUSBkYXRhb3V0IHRpbWVvdXQhICBcbiIpOworCisJCQkJbmV3cGhhc2UgPSBlc3AtPnNyZWcgJiBFU1BfU1RBVF9QTUFTSzsKKworCQkJCS8qIG5lZWQgdG8gY2hlY2sgaG93IG11Y2ggd2FzIHNlbnQgPz8gKi8KKwkJCQlmaWZvY250ID0gKGVzcF9yZWFkKGVyZWdzLT5lc3BfZmZsYWdzKSAmIEVTUF9GRl9GQllURVMpOworCisJCQkJRVNQREFUQSgoIlxyc2VudCAlZCBzdCAleCBwaCAleCIsIHRoaXNfY291bnQgLSBmaWZvY250LCBlc3AtPnNyZWcsIG5ld3BoYXNlKSk7CisKKwkJCQlFU1BEQVRBKCgiKCVkKSAiLCBpKSk7CisKKwkJCQkvKiBicmVhayBpZiBzdGF0dXMgcGhhc2UgISEgKi8KKwkJCQlpZihuZXdwaGFzZSA9PSBFU1BfU1RBVFApIHsKKwkJCQkJLyogY2xlYXIgaW50LiAqLworCQkJCQllc3AtPmlyZWcgPSBlc3BfcmVhZChlcmVncy0+ZXNwX2ludHJwdCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfQorCisJCQkvKiBjbGVhciBpbnQuICovCisJCQllc3AtPmlyZWcgPSBlc3BfcmVhZChlcmVncy0+ZXNwX2ludHJwdCk7CisKKwkJCUVTUERBVEEoKCJpciAleCAuLi4gIiwgZXNwLT5pcmVnKSk7CisKKwkJCWlmIChobXVjaCA9PSAwKQorCQkJCUVTUERBVEEoKCJkb25lISBcbiIpKTsKKworI2lmIDAKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyNlbmRpZgorCisJCQkvKiBjaGVjayBuZXcgYnVzIHBoYXNlICovCisJCQlpZiAobmV3cGhhc2UgIT0gb2xkcGhhc2UgJiYgaSA8IGVzcC0+Y3VycmVudF90cmFuc2Zlcl9zaXplKSB7CisJCQkJLyogc29tZXRoaW5nIGhhcHBlbmVkOyBkaXNjb25uZWN0ID8/ICovCisJCQkJRVNQREFUQSgoInBoYXNlIGNoYW5nZSwgZHJvcHBlZCBvdXQgd2l0aCAlZCBkb25lIC4uLiAiLCBpKSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIGNoZWNrIGludC4gc3RhdHVzICovCisJCQlpZiAoZXNwLT5pcmVnICYgRVNQX0lOVFJfREMpIHsKKwkJCQkvKiBkaXNjb25uZWN0ICovCisJCQkJRVNQREFUQSgoImRpc2Nvbm5lY3Q7ICVkIHRyYW5zZmVycmVkIC4uLiAiLCBpKSk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGVzcC0+aXJlZyAmIEVTUF9JTlRSX0ZET05FKSB7CisJCQkJLyogZnVuY3Rpb24gZG9uZSAqLworCQkJCUVTUERBVEEoKCJmdW5jdGlvbiBkb25lOyAlZCB0cmFuc2ZlcnJlZCAuLi4gIiwgaSkpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBYWFggZml4bWU6IGJhaWwgb3V0IG9uIHN0YWxsICovCisJCQlpZiAoZmlmb19zdHVjayA+IDEwKSB7CisJCQkJLyogd2UncmUgc3R1Y2sgKi8KKwkJCQlFU1BEQVRBKCgiZmlmbyBzdGFsbDsgJWQgdHJhbnNmZXJyZWQgLi4uICIsIGkpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCUVTUERBVEEoKCJcbiIpKTsKKwkJLyogY2hlY2sgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uID8/ICovCisKKwkJaWYgKHRoaXNwaGFzZSA9PSBpbl9kYXRhb3V0KQorCQkJaG11Y2ggKz0gZmlmb2NudDsgLyogc3R1Y2s/PyBhZGp1c3QgZGF0YSBwb2ludGVyIC4uLiovCisKKwkJLyogdGVsbCBkb19kYXRhX2ZpbmFsZSBob3cgbXVjaCB3YXMgdHJhbnNmZXJyZWQgKi8KKwkJZXNwLT5jdXJyZW50X3RyYW5zZmVyX3NpemUgLT0gaG11Y2g7CisKKwkJLyogc3RpbGwgbm90IGNvbXBsZXRlbHkgc3VyZSBvbiB0aGlzIG9uZSAuLi4gKi8JCQorCQlyZXR1cm4gLypkb19pbnRyX2VuZCovIGRvX3dvcmtfYnVzIC8qZG9fcGhhc2VfZGV0ZXJtaW5lKi8gOworCisJCS8qCisJCSAqIGVuZCBQSU8KKwkJICovCisJfQorCXJldHVybiBkb19pbnRyX2VuZDsKK30KKworLyogU2VlIGhvdyBzdWNjZXNzZnVsIHRoZSBkYXRhIHRyYW5zZmVyIHdhcy4gKi8KK3N0YXRpYyBpbnQgZXNwX2RvX2RhdGFfZmluYWxlKHN0cnVjdCBOQ1JfRVNQICplc3AsCisJCQkgICAgICBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCVNjc2lfQ21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7CisJc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPSBTQ3B0ci0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwlpbnQgYm9ndXNfZGF0YSA9IDAsIGJ5dGVzX3NlbnQgPSAwLCBmaWZvY250LCBlY291bnQgPSAwOworCisJaWYoZXNwLT5kbWFfbGVkX29mZikKKwkJZXNwLT5kbWFfbGVkX29mZihlc3ApOworCisJRVNQREFUQSgoImVzcF9kb19kYXRhX2ZpbmFsZTogIikpOworCisJaWYoU0NwdHItPlNDcC5waGFzZSA9PSBpbl9kYXRhaW4pIHsKKwkJaWYoZXNwLT5zcmVnICYgRVNQX1NUQVRfUEVSUikgeworCQkJLyogWXVjaywgcGFyaXR5IGVycm9yLiAgVGhlIEVTUCBhc3NlcnRzIEFUTgorCQkJICogc28gdGhhdCB3ZSBjYW4gZ28gdG8gbWVzc2FnZSBvdXQgcGhhc2UKKwkJCSAqIGltbWVkaWF0ZWx5IGFuZCBpbmZvcm0gdGhlIHRhcmdldCB0aGF0CisJCQkgKiBzb21ldGhpbmcgYmFkIGhhcHBlbmVkLgorCQkJICovCisJCQlFU1BMT0coKCJlc3AlZDogZGF0YSBiYWQgcGFyaXR5IGRldGVjdGVkLlxuIiwKKwkJCQllc3AtPmVzcF9pZCkpOworCQkJZXNwLT5jdXJfbXNnb3V0WzBdID0gSU5JVElBVE9SX0VSUk9SOworCQkJZXNwLT5tc2dvdXRfbGVuID0gMTsKKwkJfQorCQlpZihlc3AtPmRtYV9kcmFpbikKKwkJCWVzcC0+ZG1hX2RyYWluKGVzcCk7CisJfQorCWlmKGVzcC0+ZG1hX2ludmFsaWRhdGUpCisJCWVzcC0+ZG1hX2ludmFsaWRhdGUoZXNwKTsKKworCS8qIFRoaXMgY291bGQgaGFwcGVuIGZvciB0aGUgYWJvdmUgcGFyaXR5IGVycm9yIGNhc2UuICovCisJaWYoIShlc3AtPmlyZWcgPT0gRVNQX0lOVFJfQlNFUlYpKSB7CisJCS8qIFBsZWFzZSBnbyB0byBtc2dvdXQgcGhhc2UsIHBsZWFzZSBwbGVhc2UgcGxlYXNlLi4uICovCisJCUVTUExPRygoImVzcCVkOiAhQlNFUlYgYWZ0ZXIgZGF0YSwgcHJvYmFibHkgdG8gbXNnb3V0XG4iLAorCQkJZXNwLT5lc3BfaWQpKTsKKwkJcmV0dXJuIGVzcF9kb19waGFzZV9kZXRlcm1pbmUoZXNwLCBlcmVncyk7CisJfQkKKworCS8qIENoZWNrIGZvciBwYXJ0aWFsIHRyYW5zZmVycyBhbmQgb3RoZXIgaG9ycmlibGUgZXZlbnRzLiAqLworCWZpZm9jbnQgPSAoZXNwX3JlYWQoZXJlZ3MtPmVzcF9mZmxhZ3MpICYgRVNQX0ZGX0ZCWVRFUyk7CisJZWNvdW50ID0gZXNwX2dldGNvdW50KGVyZWdzKTsKKwlpZihlc3AtPmZhc19wcmVtYXR1cmVfaW50cl93b3JrYXJvdW5kKQorCQllY291bnQgLT0gMHg0MDsKKwlieXRlc19zZW50ID0gZXNwLT5jdXJyZW50X3RyYW5zZmVyX3NpemU7CisKKwlFU1BEQVRBKCgidHJhbnNfc3o9JWQsICIsIGJ5dGVzX3NlbnQpKTsKKwlpZighKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1RDTlQpKQorCQlieXRlc19zZW50IC09IGVjb3VudDsKKwlpZihTQ3B0ci0+U0NwLnBoYXNlID09IGluX2RhdGFvdXQpCisJCWJ5dGVzX3NlbnQgLT0gZmlmb2NudDsKKworCUVTUERBVEEoKCJieXRlc19zZW50PSVkIChlY291bnQ9JWQsIGZpZm9jbnQ9JWQpLCAiLCBieXRlc19zZW50LAorCQkgZWNvdW50LCBmaWZvY250KSk7CisKKwkvKiBJZiB3ZSB3ZXJlIGluIHN5bmNocm9ub3VzIG1vZGUsIGNoZWNrIGZvciBwZWN1bGlhcml0aWVzLiAqLworCWlmKGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCkKKwkJYm9ndXNfZGF0YSA9IGVzcDEwMF9zeW5jX2h3YnVnKGVzcCwgZXJlZ3MsIFNDcHRyLCBmaWZvY250KTsKKwllbHNlCisJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9GTFVTSCk7CisKKwkvKiBVbnRpbCB3ZSBhcmUgc3VyZSBvZiB3aGF0IGhhcyBoYXBwZW5lZCwgd2UgYXJlIGNlcnRhaW5seQorCSAqIGluIHRoZSBkYXJrLgorCSAqLworCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisKKwkvKiBDaGVjayBmb3IgcHJlbWF0dXJlIGludGVycnVwdCBjb25kaXRpb24uIENhbiBoYXBwZW4gb24gRkFTMng2CisJICogY2hpcHMuIFFMb2dpYyByZWNvbW1lbmRzIGEgd29ya2Fyb3VuZCBieSBvdmVycHJvZ3JhbW1pbmcgdGhlCisJICogdHJhbnNmZXIgY291bnRlcnMsIGJ1dCB0aGlzIG1ha2VzIGRvaW5nIHNjYXR0ZXItZ2F0aGVyIGltcG9zc2libGUuCisJICogVW50aWwgdGhlcmUgaXMgYSB3YXkgdG8gZGlzYWJsZSBzY2F0dGVyLWdhdGhlciBmb3IgYSBzaW5nbGUgdGFyZ2V0LAorCSAqIGFuZCBub3Qgb25seSBmb3IgdGhlIGVudGlyZSBob3N0IGFkYXB0ZXIgYXMgaXQgaXMgbm93LCB0aGUgd29ya2Fyb3VuZAorCSAqIGlzIHdheSB0byBleHBlbnNpdmUgcGVyZm9ybWFuY2Ugd2lzZS4KKwkgKiBJbnN0ZWFkLCBpdCB0dXJucyBvdXQgdGhhdCB3aGVuIHRoaXMgaGFwcGVucyB0aGUgdGFyZ2V0IGhhcyBkaXNjb25uZWN0ZWQKKwkgKiBhbHJlYWR5IGJ1dCBpdCBkb2Vzbid0IHNob3cgaW4gdGhlIGludGVycnVwdCByZWdpc3Rlci4gQ29tcGVuc2F0ZSBmb3IKKwkgKiB0aGF0IGhlcmUgdG8gdHJ5IGFuZCBhdm9pZCBhIFNDU0kgYnVzIHJlc2V0LgorCSAqLworCWlmKCFlc3AtPmZhc19wcmVtYXR1cmVfaW50cl93b3JrYXJvdW5kICYmIChmaWZvY250ID09IDEpICYmCisJICAgc3JlZ19kYXRhb3V0cChlc3AtPnNyZWcpKSB7CisJCUVTUExPRygoImVzcCVkOiBQcmVtYXR1cmUgaW50ZXJydXB0LCBlbmFibGluZyB3b3JrYXJvdW5kXG4iLAorCQkJZXNwLT5lc3BfaWQpKTsKKyNpZiAwCisJCS8qIERpc2FibGUgc2NhdHRlci1nYXRoZXIgb3BlcmF0aW9ucywgdGhleSBhcmUgbm90IHBvc3NpYmxlCisJCSAqIHdoZW4gdXNpbmcgdGhpcyB3b3JrYXJvdW5kLgorCQkgKi8KKwkJZXNwLT5laG9zdC0+c2dfdGFibGVzaXplID0gMDsKKwkJZXNwLT5laG9zdC0+dXNlX2NsdXN0ZXJpbmcgPSBFTkFCTEVfQ0xVU1RFUklORzsKKwkJZXNwLT5mYXNfcHJlbWF0dXJlX2ludHJfd29ya2Fyb3VuZCA9IDE7CisJCWJ5dGVzX3NlbnQgPSAwOworCQlpZihTQ3B0ci0+dXNlX3NnKSB7CisJCQlFU1BMT0coKCJlc3AlZDogQWJvcnRpbmcgc2NhdHRlci1nYXRoZXIgb3BlcmF0aW9uXG4iLAorCQkJCWVzcC0+ZXNwX2lkKSk7CisJCQllc3AtPmN1cl9tc2dvdXRbMF0gPSBBQk9SVDsKKwkJCWVzcC0+bXNnb3V0X2xlbiA9IDE7CisJCQllc3AtPm1zZ291dF9jdHIgPSAwOworCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1NBVE4pOworCQkJZXNwX3NldGNvdW50KGVyZWdzLCAweGZmZmYpOworCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX05VTEwpOworCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1RQQUQgfCBFU1BfQ01EX0RNQSk7CisJCQlyZXR1cm4gZG9faW50cl9lbmQ7CisJCX0KKyNlbHNlCisJCS8qIEp1c3Qgc2V0IHRoZSBkaXNjb25uZWN0ZWQgYml0LiBUaGF0J3Mgd2hhdCBhcHBlYXJzIHRvCisJCSAqIGhhcHBlbiBhbnl3YXkuIFRoZSBzdGF0ZSBtYWNoaW5lIHdpbGwgcGljayBpdCB1cCB3aGVuCisJCSAqIHdlIHJldHVybi4KKwkJICovCisJCWVzcC0+aXJlZyB8PSBFU1BfSU5UUl9EQzsKKyNlbmRpZgorICAgICAgICB9CisKKwlpZihieXRlc19zZW50IDwgMCkgeworCQkvKiBJJ3ZlIHNlZW4gdGhpcyBoYXBwZW4gZHVlIHRvIGxvc3Qgc3RhdGUgaW4gdGhpcworCQkgKiBkcml2ZXIuICBObyBpZGVhIHdoeSBpdCBoYXBwZW5lZCwgYnV0IGFsbG93aW5nCisJCSAqIHRoaXMgdmFsdWUgdG8gYmUgbmVnYXRpdmUgY2F1c2VkIHRoaW5ncyB0bworCQkgKiBsb2NrIHVwLiAgVGhpcyBhbGxvd3MgZ3JlYXRlciBjaGFuY2Ugb2YgcmVjb3ZlcnkuCisJCSAqIEluIGZhY3QgZXZlcnkgdGltZSBJJ3ZlIHNlZW4gdGhpcywgaXQgaGFzIGJlZW4KKwkJICogYSBkcml2ZXIgYnVnIHdpdGhvdXQgcXVlc3Rpb24uCisJCSAqLworCQlFU1BMT0coKCJlc3AlZDogeWllZWUsIGJ5dGVzX3NlbnQgPCAwIVxuIiwgZXNwLT5lc3BfaWQpKTsKKwkJRVNQTE9HKCgiZXNwJWQ6IGNzej0lZCBmaWZvY291bnQ9JWQgZWNvdW50PSVkXG4iLAorCQkJZXNwLT5lc3BfaWQsCisJCQllc3AtPmN1cnJlbnRfdHJhbnNmZXJfc2l6ZSwgZmlmb2NudCwgZWNvdW50KSk7CisJCUVTUExPRygoImVzcCVkOiB1c2Vfc2c9JWQgcHRyPSVwIHRoaXNfcmVzaWR1YWw9JWRcbiIsCisJCQllc3AtPmVzcF9pZCwKKwkJCVNDcHRyLT51c2Vfc2csIFNDcHRyLT5TQ3AucHRyLCBTQ3B0ci0+U0NwLnRoaXNfcmVzaWR1YWwpKTsKKwkJRVNQTE9HKCgiZXNwJWQ6IEZvcmNpbmcgYXN5bmMgZm9yIHRhcmdldCAlZFxuIiwgZXNwLT5lc3BfaWQsIAorCQkJU0NwdHItPmRldmljZS0+aWQpKTsKKwkJU0NwdHItPmRldmljZS0+Ym9ya2VuID0gMTsKKwkJZXNwX2Rldi0+c3luYyA9IDA7CisJCWJ5dGVzX3NlbnQgPSAwOworCX0KKworCS8qIFVwZGF0ZSB0aGUgc3RhdGUgb2Ygb3VyIHRyYW5zZmVyLiAqLworCVNDcHRyLT5TQ3AucHRyICs9IGJ5dGVzX3NlbnQ7CisJU0NwdHItPlNDcC50aGlzX3Jlc2lkdWFsIC09IGJ5dGVzX3NlbnQ7CisJaWYoU0NwdHItPlNDcC50aGlzX3Jlc2lkdWFsIDwgMCkgeworCQkvKiBzaGl0ICovCisJCUVTUExPRygoImVzcCVkOiBEYXRhIHRyYW5zZmVyIG92ZXJydW4uXG4iLCBlc3AtPmVzcF9pZCkpOworCQlTQ3B0ci0+U0NwLnRoaXNfcmVzaWR1YWwgPSAwOworCX0KKworCS8qIE1heWJlIGNvbnRpbnVlLiAqLworCWlmKCFib2d1c19kYXRhKSB7CisJCUVTUERBVEEoKCIhYm9ndXNfZGF0YSwgIikpOworCQkvKiBOTyBNQVRURVIgV0hBVCwgd2UgYWR2YW5jZSB0aGUgc2NhdHRlcmxpc3QsCisJCSAqIGlmIHRoZSB0YXJnZXQgc2hvdWxkIGRlY2lkZSB0byBkaXNjb25uZWN0CisJCSAqIGluIGJldHdlZW4gc2NhdHRlciBjaHVua3MgKHdoaWNoIGlzIGNvbW1vbikKKwkJICogd2UgY291bGQgZGllIGhvcnJpYmx5ISAgSSB1c2VkIHRvIGhhdmUgdGhlIHNnCisJCSAqIGFkdmFuY2Ugb2NjdXIgb25seSBpZiB3ZSBhcmUgZ29pbmcgYmFjayBpbnRvCisJCSAqIChvciBhcmUgc3RheWluZyBpbikgYSBkYXRhIHBoYXNlLCB5b3UgY2FuCisJCSAqIGltYWdpbmUgdGhlIGhlbGwgSSB3ZW50IHRocm91Z2ggdHJ5aW5nIHRvCisJCSAqIGZpZ3VyZSB0aGlzIG91dC4KKwkJICovCisJCWlmKCFTQ3B0ci0+U0NwLnRoaXNfcmVzaWR1YWwgJiYgU0NwdHItPlNDcC5idWZmZXJzX3Jlc2lkdWFsKQorCQkJYWR2YW5jZV9zZyhlc3AsIFNDcHRyKTsKKyNpZmRlZiBERUJVR19FU1BfREFUQQorCQlpZihzcmVnX2RhdGFpbnAoZXNwLT5zcmVnKSB8fCBzcmVnX2RhdGFvdXRwKGVzcC0+c3JlZykpIHsKKwkJCUVTUERBVEEoKCJ0byBtb3JlIGRhdGFcbiIpKTsKKwkJfSBlbHNlIHsKKwkJCUVTUERBVEEoKCJ0byBuZXcgcGhhc2VcbiIpKTsKKwkJfQorI2VuZGlmCisJCXJldHVybiBlc3BfZG9fcGhhc2VfZGV0ZXJtaW5lKGVzcCwgZXJlZ3MpOworCX0KKwkvKiBCb2d1cyBkYXRhLCBqdXN0IHdhaXQgZm9yIG5leHQgaW50ZXJydXB0LiAqLworCUVTUExPRygoImVzcCVkOiBib2d1c19kYXRhIGR1cmluZyBlbmQgb2YgZGF0YSBwaGFzZVxuIiwKKwkJZXNwLT5lc3BfaWQpKTsKKwlyZXR1cm4gZG9faW50cl9lbmQ7Cit9CisKKy8qIFdlIHJlY2VpdmVkIGEgbm9uLWdvb2Qgc3RhdHVzIHJldHVybiBhdCB0aGUgZW5kIG9mCisgKiBydW5uaW5nIGEgU0NTSSBjb21tYW5kLiAgVGhpcyBpcyB1c2VkIHRvIGRlY2lkZSBpZgorICogd2Ugc2hvdWxkIGNsZWFyIG91ciBzeW5jaHJvbm91cyB0cmFuc2ZlciBzdGF0ZSBmb3IKKyAqIHN1Y2ggYSBkZXZpY2Ugd2hlbiB0aGF0IGhhcHBlbnMuCisgKgorICogVGhlIGlkZWEgaXMgdGhhdCB3aGVuIHNwaW5uaW5nIHVwIGEgZGlzayBvciByZXdpbmRpbmcKKyAqIGEgdGFwZSwgd2UgZG9uJ3Qgd2FudCB0byBnbyBpbnRvIGEgbG9vcCByZS1uZWdvdGlhdGluZworICogc3luY2hyb25vdXMgY2FwYWJpbGl0aWVzIG92ZXIgYW5kIG92ZXIuCisgKi8KK3N0YXRpYyBpbnQgZXNwX3Nob3VsZF9jbGVhcl9zeW5jKFNjc2lfQ21uZCAqc3ApCit7CisJdW5jaGFyIGNtZDEgPSBzcC0+Y21uZFswXTsKKwl1bmNoYXIgY21kMiA9IHNwLT5kYXRhX2NtbmRbMF07CisKKwkvKiBUaGVzZSBjYXNlcyBhcmUgZm9yIHNwaW5uaW5nIHVwIGEgZGlzayBhbmQKKwkgKiB3YWl0aW5nIGZvciB0aGF0IHNwaW51cCB0byBjb21wbGV0ZS4KKwkgKi8KKwlpZihjbWQxID09IFNUQVJUX1NUT1AgfHwKKwkgICBjbWQyID09IFNUQVJUX1NUT1ApCisJCXJldHVybiAwOworCisJaWYoY21kMSA9PSBURVNUX1VOSVRfUkVBRFkgfHwKKwkgICBjbWQyID09IFRFU1RfVU5JVF9SRUFEWSkKKwkJcmV0dXJuIDA7CisKKwkvKiBPbmUgbW9yZSBzcGVjaWFsIGNhc2UgZm9yIFNDU0kgdGFwZSBkcml2ZXMsCisJICogdGhpcyBpcyB3aGF0IGlzIHVzZWQgdG8gcHJvYmUgdGhlIGRldmljZSBmb3IKKwkgKiBjb21wbGV0aW9uIG9mIGEgcmV3aW5kIG9yIHRhcGUgbG9hZCBvcGVyYXRpb24uCisJICovCisJaWYoc3AtPmRldmljZS0+dHlwZSA9PSBUWVBFX1RBUEUpIHsKKwkJaWYoY21kMSA9PSBNT0RFX1NFTlNFIHx8CisJCSAgIGNtZDIgPT0gTU9ERV9TRU5TRSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKiBFaXRoZXIgYSBjb21tYW5kIGlzIGNvbXBsZXRpbmcgb3IgYSB0YXJnZXQgaXMgZHJvcHBpbmcgb2ZmIHRoZSBidXMKKyAqIHRvIGNvbnRpbnVlIHRoZSBjb21tYW5kIGluIHRoZSBiYWNrZ3JvdW5kIHNvIHdlIGNhbiBkbyBvdGhlciB3b3JrLgorICovCitzdGF0aWMgaW50IGVzcF9kb19mcmVlYnVzKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJU2NzaV9DbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKKwlpbnQgcnZhbDsKKworCXJ2YWwgPSBza2lwYWhlYWQyKGVzcCwgZXJlZ3MsIFNDcHRyLCBpbl9zdGF0dXMsIGluX21zZ2luZG9uZSwgaW5fZnJlZWluZyk7CisJaWYocnZhbCkKKwkJcmV0dXJuIHJ2YWw7CisKKwlpZihlc3AtPmlyZWcgIT0gRVNQX0lOVFJfREMpIHsKKwkJRVNQTE9HKCgiZXNwJWQ6IFRhcmdldCB3aWxsIG5vdCBkaXNjb25uZWN0XG4iLCBlc3AtPmVzcF9pZCkpOworCQlyZXR1cm4gZG9fcmVzZXRfYnVzOyAvKiB0YXJnZXQgd2lsbCBub3QgZHJvcCBCU1kuLi4gKi8KKwl9CisJZXNwLT5tc2dvdXRfbGVuID0gMDsKKwllc3AtPnByZXZtc2dvdXQgPSBOT1A7CisJaWYoZXNwLT5wcmV2bXNnaW4gPT0gQ09NTUFORF9DT01QTEVURSkgeworCQlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IFNDcHRyLT5kZXZpY2UtPmhvc3RkYXRhOworCQkvKiBOb3JtYWwgZW5kIG9mIG5leHVzLiAqLworCQlpZihlc3AtPmRpc2Nvbm5lY3RlZF9TQykKKwkJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9FU0VMKTsKKworCQlpZihTQ3B0ci0+U0NwLlN0YXR1cyAhPSBHT09EICYmCisJCSAgIFNDcHRyLT5TQ3AuU3RhdHVzICE9IENPTkRJVElPTl9HT09EICYmCisJCSAgICgoMTw8U0NwdHItPmRldmljZS0+aWQpICYgZXNwLT50YXJnZXRzX3ByZXNlbnQpICYmCisJCSAgIGVzcF9kZXYtPnN5bmMgJiYgZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0KSB7CisJCQkvKiBTQ1NJIHN0YW5kYXJkIHNheXMgdGhhdCB0aGUgc3luY2hyb25vdXMgY2FwYWJpbGl0aWVzCisJCQkgKiBzaG91bGQgYmUgcmVuZWdvdGlhdGVkIGF0IHRoaXMgcG9pbnQuICBNb3N0IGxpa2VseQorCQkJICogd2UgYXJlIGFib3V0IHRvIHJlcXVlc3Qgc2Vuc2UgZnJvbSB0aGlzIHRhcmdldAorCQkJICogaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGF2b2lkIHVzaW5nIHN5bmMKKwkJCSAqIHRyYW5zZmVycyB1bnRpbCB3ZSBhcmUgc3VyZSBvZiB0aGUgY3VycmVudCB0YXJnZXQKKwkJCSAqIHN0YXRlLgorCQkJICovCisJCQlFU1BNSVNDKCgiZXNwOiBTdGF0dXMgPCVkPiBmb3IgdGFyZ2V0ICVkIGx1biAlZFxuIiwKKwkJCQkgU0NwdHItPlNDcC5TdGF0dXMsIFNDcHRyLT5kZXZpY2UtPmlkLCBTQ3B0ci0+ZGV2aWNlLT5sdW4pKTsKKworCQkJLyogQnV0IGRvbid0IGRvIHRoaXMgd2hlbiBzcGlubmluZyB1cCBhIGRpc2sgYXQKKwkJCSAqIGJvb3QgdGltZSB3aGlsZSB3ZSBwb2xsIGZvciBjb21wbGV0aW9uIGFzIGl0CisJCQkgKiBmaWxscyB1cCB0aGUgY29uc29sZSB3aXRoIG1lc3NhZ2VzLiAgQWxzbywgdGFwZXMKKwkJCSAqIGNhbiByZXBvcnQgbm90IHJlYWR5IG1hbnkgdGltZXMgcmlnaHQgYWZ0ZXIKKwkJCSAqIGxvYWRpbmcgdXAgYSB0YXBlLgorCQkJICovCisJCQlpZihlc3Bfc2hvdWxkX2NsZWFyX3N5bmMoU0NwdHIpICE9IDApCisJCQkJZXNwX2Rldi0+c3luYyA9IDA7CisJCX0KKwkJRVNQRElTQygoIkY8JTAyeCwlMDJ4PiIsIFNDcHRyLT5kZXZpY2UtPmlkLCBTQ3B0ci0+ZGV2aWNlLT5sdW4pKTsKKwkJZXNwX2RvbmUoZXNwLCAoKFNDcHRyLT5TQ3AuU3RhdHVzICYgMHhmZikgfAorCQkJICAgICAgICgoU0NwdHItPlNDcC5NZXNzYWdlICYgMHhmZik8PDgpIHwKKwkJCSAgICAgICAoRElEX09LIDw8IDE2KSkpOworCX0gZWxzZSBpZihlc3AtPnByZXZtc2dpbiA9PSBESVNDT05ORUNUKSB7CisJCS8qIE5vcm1hbCBkaXNjb25uZWN0LiAqLworCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRVNFTCk7CisJCUVTUERJU0MoKCJEPCUwMngsJTAyeD4iLCBTQ3B0ci0+ZGV2aWNlLT5pZCwgU0NwdHItPmRldmljZS0+bHVuKSk7CisJCWFwcGVuZF9TQygmZXNwLT5kaXNjb25uZWN0ZWRfU0MsIFNDcHRyKTsKKwkJZXNwLT5jdXJyZW50X1NDID0gTlVMTDsKKwkJaWYoZXNwLT5pc3N1ZV9TQykKKwkJCWVzcF9leGVjX2NtZChlc3ApOworCX0gZWxzZSB7CisJCS8qIERyaXZlciBidWcsIHdlIGRvIG5vdCBleHBlY3QgYSBkaXNjb25uZWN0IGhlcmUKKwkJICogYW5kIHNob3VsZCBub3QgaGF2ZSBhZHZhbmNlZCB0aGUgc3RhdGUgZW5naW5lCisJCSAqIHRvIGluX2ZyZWVpbmcuCisJCSAqLworCQlFU1BMT0coKCJlc3AlZDogbGFzdCBtc2cgbm90IGRpc2MgYW5kIG5vdCBjbWQgY21wbHQuXG4iLAorCQkJZXNwLT5lc3BfaWQpKTsKKwkJcmV0dXJuIGRvX3Jlc2V0X2J1czsKKwl9CisJcmV0dXJuIGRvX2ludHJfZW5kOworfQorCisvKiBXaGVuIGEgcmVzZWxlY3Qgb2NjdXJzLCBhbmQgd2UgY2Fubm90IGZpbmQgdGhlIGNvbW1hbmQgdG8KKyAqIHJlY29ubmVjdCB0byBpbiBvdXIgcXVldWVzLCB3ZSBkbyB0aGlzLgorICovCitzdGF0aWMgaW50IGVzcF9iYWRfcmVjb25uZWN0KHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJU2NzaV9DbW5kICpzcDsKKworCUVTUExPRygoImVzcCVkOiBFaWVlZWUsIHJlY29ubmVjdGluZyB1bmtub3duIGNvbW1hbmQhXG4iLAorCQllc3AtPmVzcF9pZCkpOworCUVTUExPRygoIlFVRVVFIERVTVBcbiIpKTsKKwlzcCA9IGVzcC0+aXNzdWVfU0M7CisJRVNQTE9HKCgiZXNwJWQ6IGlzc3VlX1NDWyIsIGVzcC0+ZXNwX2lkKSk7CisJd2hpbGUoc3ApIHsKKwkJRVNQTE9HKCgiPCUwMngsJTAyeD4iLCBzcC0+ZGV2aWNlLT5pZCwgc3AtPmRldmljZS0+bHVuKSk7CisJCXNwID0gKFNjc2lfQ21uZCAqKSBzcC0+aG9zdF9zY3JpYmJsZTsKKwl9CisJRVNQTE9HKCgiXVxuIikpOworCXNwID0gZXNwLT5jdXJyZW50X1NDOworCUVTUExPRygoImVzcCVkOiBjdXJyZW50X1NDWyIsIGVzcC0+ZXNwX2lkKSk7CisJd2hpbGUoc3ApIHsKKwkJRVNQTE9HKCgiPCUwMngsJTAyeD4iLCBzcC0+ZGV2aWNlLT5pZCwgc3AtPmRldmljZS0+bHVuKSk7CisJCXNwID0gKFNjc2lfQ21uZCAqKSBzcC0+aG9zdF9zY3JpYmJsZTsKKwl9CisJRVNQTE9HKCgiXVxuIikpOworCXNwID0gZXNwLT5kaXNjb25uZWN0ZWRfU0M7CisJRVNQTE9HKCgiZXNwJWQ6IGRpc2Nvbm5lY3RlZF9TQ1siLCBlc3AtPmVzcF9pZCkpOworCXdoaWxlKHNwKSB7CisJCUVTUExPRygoIjwlMDJ4LCUwMng+Iiwgc3AtPmRldmljZS0+aWQsIHNwLT5kZXZpY2UtPmx1bikpOworCQlzcCA9IChTY3NpX0NtbmQgKikgc3AtPmhvc3Rfc2NyaWJibGU7CisJfQorCUVTUExPRygoIl1cbiIpKTsKKwlyZXR1cm4gZG9fcmVzZXRfYnVzOworfQorCisvKiBEbyB0aGUgbmVlZHkgd2hlbiBhIHRhcmdldCB0cmllcyB0byByZWNvbm5lY3QgdG8gdXMuICovCitzdGF0aWMgaW50IGVzcF9kb19yZWNvbm5lY3Qoc3RydWN0IE5DUl9FU1AgKmVzcCwgCisJCQkgICAgc3RydWN0IEVTUF9yZWdzICplcmVncykKK3sKKwlpbnQgbHVuLCB0YXJnZXQ7CisJU2NzaV9DbW5kICpTQ3B0cjsKKworCS8qIENoZWNrIGZvciBhbGwgYm9ndXMgY29uZGl0aW9ucyBmaXJzdC4gKi8KKwl0YXJnZXQgPSByZWNvbm5lY3RfdGFyZ2V0KGVzcCwgZXJlZ3MpOworCWlmKHRhcmdldCA8IDApIHsKKwkJRVNQRElTQygoImJhZCBidXMgYml0c1xuIikpOworCQlyZXR1cm4gZG9fcmVzZXRfYnVzOworCX0KKwlsdW4gPSByZWNvbm5lY3RfbHVuKGVzcCwgZXJlZ3MpOworCWlmKGx1biA8IDApIHsKKwkJRVNQRElTQygoInRhcmdldD0lMngsIGJhZCBpZGVudGlmeSBtc2dcbiIsIHRhcmdldCkpOworCQlyZXR1cm4gZG9fcmVzZXRfYnVzOworCX0KKworCS8qIFRoaW5ncyBsb29rIG9rLi4uICovCisJRVNQRElTQygoIlI8JTAyeCwlMDJ4PiIsIHRhcmdldCwgbHVuKSk7CisKKwllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRkxVU0gpOworCWlmKGVzcDEwMF9yZWNvbm5lY3RfaHdidWcoZXNwLCBlcmVncykpCisJCXJldHVybiBkb19yZXNldF9idXM7CisJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX05VTEwpOworCisJU0NwdHIgPSByZW1vdmVfU0MoJmVzcC0+ZGlzY29ubmVjdGVkX1NDLCAodW5jaGFyKSB0YXJnZXQsICh1bmNoYXIpIGx1bik7CisJaWYoIVNDcHRyKQorCQlyZXR1cm4gZXNwX2JhZF9yZWNvbm5lY3QoZXNwKTsKKworCWVzcF9jb25uZWN0KGVzcCwgZXJlZ3MsIFNDcHRyKTsKKwllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfTU9LKTsKKworCS8qIFJlY29ubmVjdCBpbXBsaWVzIGEgcmVzdG9yZSBwb2ludGVycyBvcGVyYXRpb24uICovCisJZXNwX3Jlc3RvcmVfcG9pbnRlcnMoZXNwLCBTQ3B0cik7CisKKwllc3AtPnNuaXAgPSAwOworCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJcmV0dXJuIGRvX2ludHJfZW5kOworfQorCisvKiBFbmQgb2YgTkVYVVMgKGhvcGVmdWxseSksIHBpY2sgdXAgc3RhdHVzICsgbWVzc2FnZSBieXRlIHRoZW4gbGVhdmUgaWYKKyAqIGFsbCBnb2VzIHdlbGwuCisgKi8KK3N0YXRpYyBpbnQgZXNwX2RvX3N0YXR1cyhzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCVNjc2lfQ21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7CisJaW50IGludHIsIHJ2YWw7CisKKwlydmFsID0gc2tpcGFoZWFkMShlc3AsIGVyZWdzLCBTQ3B0ciwgaW5fdGhlX2RhcmssIGluX3N0YXR1cyk7CisJaWYocnZhbCkKKwkJcmV0dXJuIHJ2YWw7CisKKwlpbnRyID0gZXNwLT5pcmVnOworCUVTUFNUQVQoKCJlc3BfZG9fc3RhdHVzOiAiKSk7CisJaWYoaW50ciAhPSBFU1BfSU5UUl9EQykgeworCQlpbnQgbWVzc2FnZV9vdXQgPSAwOyAvKiBmb3IgcGFyaXR5IHByb2JsZW1zICovCisKKwkJLyogQWNrIHRoZSBtZXNzYWdlLiAqLworCQlFU1BTVEFUKCgiYWNrIG1zZywgIikpOworCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfTU9LKTsKKworCQlpZihlc3AtPmRtYV9wb2xsKQorCQkJZXNwLT5kbWFfcG9sbChlc3AsICh1bnNpZ25lZCBjaGFyICopIGVzcC0+ZXNwX2NvbW1hbmQpOworCisJCUVTUFNUQVQoKCJnb3Qgc29tZXRoaW5nLCAiKSk7CisJCS8qIEVTUCBjaGltZXMgaW4gd2l0aCBvbmUgb2YKKwkJICoKKwkJICogMSkgZnVuY3Rpb24gZG9uZSBpbnRlcnJ1cHQ6CisJCSAqCWJvdGggc3RhdHVzIGFuZCBtZXNzYWdlIGluIGJ5dGVzCisJCSAqCWFyZSBhdmFpbGFibGUKKwkJICoKKwkJICogMikgYnVzIHNlcnZpY2UgaW50ZXJydXB0OgorCQkgKglvbmx5IHN0YXR1cyBieXRlIHdhcyBhY3F1aXJlZAorCQkgKgorCQkgKiAzKSBBbnl0aGluZyBlbHNlOgorCQkgKgljYW4ndCBoYXBwZW4sIGJ1dCB3ZSB0ZXN0IGZvciBpdAorCQkgKglhbnl3YXlzCisJCSAqCisJCSAqIEFMU086IElmIGJhZCBwYXJpdHkgd2FzIGRldGVjdGVkIG9uIGVpdGhlcgorCQkgKiAgICAgICB0aGUgc3RhdHVzIF9vcl8gdGhlIG1lc3NhZ2UgYnl0ZSB0aGVuCisJCSAqICAgICAgIHRoZSBFU1AgaGFzIGFzc2VydGVkIEFUTiBvbiB0aGUgYnVzCisJCSAqICAgICAgIGFuZCB3ZSBtdXN0IHRoZXJlZm9yZSB3YWl0IGZvciB0aGUKKwkJICogICAgICAgbmV4dCBwaGFzZSBjaGFuZ2UuCisJCSAqLworCQlpZihpbnRyICYgRVNQX0lOVFJfRkRPTkUpIHsKKwkJCS8qIFdlIGdvdCBpdCBhbGwsIGhhbGxlanVsaWEuICovCisJCQlFU1BTVEFUKCgiZ290IGJvdGgsICIpKTsKKwkJCVNDcHRyLT5TQ3AuU3RhdHVzID0gZXNwLT5lc3BfY29tbWFuZFswXTsKKwkJCVNDcHRyLT5TQ3AuTWVzc2FnZSA9IGVzcC0+ZXNwX2NvbW1hbmRbMV07CisJCQllc3AtPnByZXZtc2dpbiA9IFNDcHRyLT5TQ3AuTWVzc2FnZTsKKwkJCWVzcC0+Y3VyX21zZ2luWzBdID0gU0NwdHItPlNDcC5NZXNzYWdlOworCQkJaWYoZXNwLT5zcmVnICYgRVNQX1NUQVRfUEVSUikgeworCQkJCS8qIFRoZXJlIHdhcyBiYWQgcGFyaXR5IGZvciB0aGUKKwkJCQkgKiBtZXNzYWdlIGJ5dGUsIHRoZSBzdGF0dXMgYnl0ZQorCQkJCSAqIHdhcyBvay4KKwkJCQkgKi8KKwkJCQltZXNzYWdlX291dCA9IE1TR19QQVJJVFlfRVJST1I7CisJCQl9CisJCX0gZWxzZSBpZihpbnRyID09IEVTUF9JTlRSX0JTRVJWKSB7CisJCQkvKiBPbmx5IGdvdCBzdGF0dXMgYnl0ZS4gKi8KKwkJCUVTUExPRygoImVzcCVkOiBnb3Qgc3RhdHVzIG9ubHksICIsIGVzcC0+ZXNwX2lkKSk7CisJCQlpZighKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BFUlIpKSB7CisJCQkJU0NwdHItPlNDcC5TdGF0dXMgPSBlc3AtPmVzcF9jb21tYW5kWzBdOworCQkJCVNDcHRyLT5TQ3AuTWVzc2FnZSA9IDB4ZmY7CisJCQl9IGVsc2UgeworCQkJCS8qIFRoZSBzdGF0dXMgYnl0ZSBoYWQgYmFkIHBhcml0eS4KKwkJCQkgKiB3ZSBsZWF2ZSB0aGUgc2NzaV9wb2ludGVyIFN0YXR1cworCQkJCSAqIGZpZWxkIGFsb25lIGFzIHdlIHNldCBpdCB0byBhIGRlZmF1bHQKKwkJCQkgKiBvZiBDSEVDS19DT05ESVRJT04gaW4gZXNwX3F1ZXVlLgorCQkJCSAqLworCQkJCW1lc3NhZ2Vfb3V0ID0gSU5JVElBVE9SX0VSUk9SOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGV2ZXIuICovCisJCQlFU1BTVEFUKCgiZ290IGJvbGl4ZWRcbiIpKTsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJCQlyZXR1cm4gZXNwX2RvX3BoYXNlX2RldGVybWluZShlc3AsIGVyZWdzKTsKKwkJfQorCisJCWlmKCFtZXNzYWdlX291dCkgeworCQkJRVNQU1RBVCgoInN0YXR1cz0lMnggbXNnPSUyeCwgIiwgU0NwdHItPlNDcC5TdGF0dXMsCisJCQkJU0NwdHItPlNDcC5NZXNzYWdlKSk7CisJCQlpZihTQ3B0ci0+U0NwLk1lc3NhZ2UgPT0gQ09NTUFORF9DT01QTEVURSkgeworCQkJCUVTUFNUQVQoKCJhbmQgd2FzIENPTU1BTkRfQ09NUExFVEVcbiIpKTsKKwkJCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fZnJlZWluZyk7CisJCQkJcmV0dXJuIGVzcF9kb19mcmVlYnVzKGVzcCwgZXJlZ3MpOworCQkJfSBlbHNlIHsKKwkJCQlFU1BMT0coKCJlc3AlZDogYW5kIF9ub3RfIENPTU1BTkRfQ09NUExFVEVcbiIsCisJCQkJCWVzcC0+ZXNwX2lkKSk7CisJCQkJZXNwLT5tc2dpbl9sZW4gPSBlc3AtPm1zZ2luX2N0ciA9IDE7CisJCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX21zZ2luZG9uZSk7CisJCQkJcmV0dXJuIGVzcF9kb19tc2dpbmRvbmUoZXNwLCBlcmVncyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBXaXRoIGx1Y2sgd2UnbGwgYmUgYWJsZSB0byBsZXQgdGhlIHRhcmdldAorCQkJICoga25vdyB0aGF0IGJhZCBwYXJpdHkgaGFwcGVuZWQsIGl0IHdpbGwga25vdworCQkJICogd2hpY2ggYnl0ZSBjYXVzZWQgdGhlIHByb2JsZW1zIGFuZCBzZW5kIGl0CisJCQkgKiBhZ2Fpbi4gIEZvciB0aGUgY2FzZSB3aGVyZSB0aGUgc3RhdHVzIGJ5dGUKKwkJCSAqIHJlY2VpdmVzIGJhZCBwYXJpdHksIEkgZG8gbm90IGJlbGlldmUgbW9zdAorCQkJICogdGFyZ2V0cyByZWNvdmVyIHZlcnkgd2VsbC4gIFdlJ2xsIHNlZS4KKwkJCSAqLworCQkJRVNQTE9HKCgiZXNwJWQ6IGJhZCBwYXJpdHkgc29tZXdoZXJlIG1vdXQ9JTJ4XG4iLAorCQkJCWVzcC0+ZXNwX2lkLCBtZXNzYWdlX291dCkpOworCQkJZXNwLT5jdXJfbXNnb3V0WzBdID0gbWVzc2FnZV9vdXQ7CisJCQllc3AtPm1zZ291dF9sZW4gPSBlc3AtPm1zZ291dF9jdHIgPSAxOworCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKKwkJCXJldHVybiBlc3BfZG9fcGhhc2VfZGV0ZXJtaW5lKGVzcCwgZXJlZ3MpOworCQl9CisJfSBlbHNlIHsKKwkJLyogSWYgd2UgZGlzY29ubmVjdCBub3csIGFsbCBoZWxsIGJyZWFrcyBsb29zZS4gKi8KKwkJRVNQTE9HKCgiZXNwJWQ6IHdob29wcywgZGlzY29ubmVjdFxuIiwgZXNwLT5lc3BfaWQpKTsKKwkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKKwkJcmV0dXJuIGVzcF9kb19waGFzZV9kZXRlcm1pbmUoZXNwLCBlcmVncyk7CisJfQorfQorCitzdGF0aWMgaW50IGVzcF9lbnRlcl9zdGF0dXMoc3RydWN0IE5DUl9FU1AgKmVzcCwKKwkJCSAgICBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCXVuY2hhciB0aGVjbWQgPSBFU1BfQ01EX0lDQ1NFUTsKKworCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9GTFVTSCk7CisKKwlpZihlc3AtPmRvX3Bpb19jbWRzKSB7CisJCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fc3RhdHVzKTsKKwkJZXNwX2NtZChlc3AsIGVyZWdzLCB0aGVjbWQpOworCQl3aGlsZSghKGVzcF9yZWFkKGVzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpICYgRVNQX1NUQVRfSU5UUikpOworCQllc3AtPmVzcF9jb21tYW5kWzBdID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9mZGF0YSk7CisgICAgICAgICAgICAgICAgd2hpbGUoIShlc3BfcmVhZChlc3AtPmVyZWdzLT5lc3Bfc3RhdHVzKSAmIEVTUF9TVEFUX0lOVFIpKTsKKyAgICAgICAgICAgICAgICBlc3AtPmVzcF9jb21tYW5kWzFdID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9mZGF0YSk7CisJfSBlbHNlIHsKKwkJZXNwLT5lc3BfY29tbWFuZFswXSA9IGVzcC0+ZXNwX2NvbW1hbmRbMV0gPSAweGZmOworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF90Y2xvdywgMik7CisJCWVzcF93cml0ZShlcmVncy0+ZXNwX3RjbWVkLCAwKTsKKwkJZXNwLT5kbWFfaW5pdF9yZWFkKGVzcCwgZXNwLT5lc3BfY29tbWFuZF9kdm1hLCAyKTsKKwkJdGhlY21kIHw9IEVTUF9DTURfRE1BOworCQllc3BfY21kKGVzcCwgZXJlZ3MsIHRoZWNtZCk7CisJCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fc3RhdHVzKTsKKwl9CisKKwlyZXR1cm4gZXNwX2RvX3N0YXR1cyhlc3AsIGVyZWdzKTsKK30KKworc3RhdGljIGludCBlc3BfZGlzY29ubmVjdF9hbWlkc3RfcGhhc2VzKHN0cnVjdCBOQ1JfRVNQICplc3AsCisJCQkJCXN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJU2NzaV9DbW5kICpzcCA9IGVzcC0+Y3VycmVudF9TQzsKKwlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IHNwLT5kZXZpY2UtPmhvc3RkYXRhOworCisJLyogVGhpcyBtZWFucyByZWFsIHByb2JsZW1zIGlmIHdlIHNlZSB0aGlzCisJICogaGVyZS4gIFVubGVzcyB3ZSB3ZXJlIGFjdHVhbGx5IHRyeWluZworCSAqIHRvIGZvcmNlIHRoZSBkZXZpY2UgdG8gYWJvcnQvcmVzZXQuCisJICovCisJRVNQTE9HKCgiZXNwJWQ6IERpc2Nvbm5lY3QgYW1pZHN0IHBoYXNlcywgIiwgZXNwLT5lc3BfaWQpKTsKKwlFU1BMT0coKCJwcGhhc2U8JXM+IGNwaGFzZTwlcz4sICIsCisJCXBoYXNlX3N0cmluZyhzcC0+U0NwLnBoYXNlKSwKKwkJcGhhc2Vfc3RyaW5nKHNwLT5TQ3Auc2VudF9jb21tYW5kKSkpOworCisJaWYoZXNwLT5kaXNjb25uZWN0ZWRfU0MpCisJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9FU0VMKTsKKworCXN3aXRjaChlc3AtPmN1cl9tc2dvdXRbMF0pIHsKKwlkZWZhdWx0OgorCQkvKiBXZSBkaWRuJ3QgZXhwZWN0IHRoaXMgdG8gaGFwcGVuIGF0IGFsbC4gKi8KKwkJRVNQTE9HKCgiZGV2aWNlIGlzIGJvbGl4ZWRcbiIpKTsKKwkJZXNwX2FkdmFuY2VfcGhhc2Uoc3AsIGluX3RndGVycm9yKTsKKwkJZXNwX2RvbmUoZXNwLCAoRElEX0VSUk9SIDw8IDE2KSk7CisJCWJyZWFrOworCisJY2FzZSBCVVNfREVWSUNFX1JFU0VUOgorCQlFU1BMT0coKCJkZXZpY2UgcmVzZXQgc3VjY2Vzc2Z1bFxuIikpOworCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgPSAwOworCQllc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgPSAwOworCQllc3BfZGV2LT5zeW5jID0gMDsKKwkJZXNwX2FkdmFuY2VfcGhhc2Uoc3AsIGluX3Jlc2V0ZGV2KTsKKwkJZXNwX2RvbmUoZXNwLCAoRElEX1JFU0VUIDw8IDE2KSk7CisJCWJyZWFrOworCisJY2FzZSBBQk9SVDoKKwkJRVNQTE9HKCgiZGV2aWNlIGFib3J0IHN1Y2Nlc3NmdWxcbiIpKTsKKwkJZXNwX2FkdmFuY2VfcGhhc2Uoc3AsIGluX2Fib3J0b25lKTsKKwkJZXNwX2RvbmUoZXNwLCAoRElEX0FCT1JUIDw8IDE2KSk7CisJCWJyZWFrOworCisJfTsKKwlyZXR1cm4gZG9faW50cl9lbmQ7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2VudGVyX21zZ291dChzdHJ1Y3QgTkNSX0VTUCAqZXNwLAorCQkJICAgIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9tc2dvdXQpOworCXJldHVybiBlc3BfZG9fbXNnb3V0KGVzcCwgZXJlZ3MpOworfQorCitzdGF0aWMgaW50IGVzcF9lbnRlcl9tc2dpbihzdHJ1Y3QgTkNSX0VTUCAqZXNwLAorCQkJICAgc3RydWN0IEVTUF9yZWdzICplcmVncykKK3sKKwllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX21zZ2luKTsKKwlyZXR1cm4gZXNwX2RvX21zZ2luKGVzcCwgZXJlZ3MpOworfQorCitzdGF0aWMgaW50IGVzcF9lbnRlcl9jbWQoc3RydWN0IE5DUl9FU1AgKmVzcCwKKwkJCSBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fY21kYmVnaW4pOworCXJldHVybiBlc3BfZG9fY21kYmVnaW4oZXNwLCBlcmVncyk7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2VudGVyX2JhZHBoYXNlKHN0cnVjdCBOQ1JfRVNQICplc3AsCisJCQkgICAgICBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCUVTUExPRygoImVzcCVkOiBCaXphcnJlIGJ1cyBwaGFzZSAlMnguXG4iLCBlc3AtPmVzcF9pZCwKKwkJZXNwLT5zcmVnICYgRVNQX1NUQVRfUE1BU0spKTsKKwlyZXR1cm4gZG9fcmVzZXRfYnVzOworfQorCit0eXBlZGVmIGludCAoKmVzcGZ1bmNfdCkoc3RydWN0IE5DUl9FU1AgKiwKKwkJCSBzdHJ1Y3QgRVNQX3JlZ3MgKik7CisKK3N0YXRpYyBlc3BmdW5jX3QgcGhhc2VfdmVjdG9yW10gPSB7CisJZXNwX2RvX2RhdGEsCQkvKiBFU1BfRE9QICovCisJZXNwX2RvX2RhdGEsCQkvKiBFU1BfRElQICovCisJZXNwX2VudGVyX2NtZCwJCS8qIEVTUF9DTURQICovCisJZXNwX2VudGVyX3N0YXR1cywJLyogRVNQX1NUQVRQICovCisJZXNwX2VudGVyX2JhZHBoYXNlLAkvKiBFU1BfU1RBVF9QTVNHICovCisJZXNwX2VudGVyX2JhZHBoYXNlLAkvKiBFU1BfU1RBVF9QTVNHIHwgRVNQX1NUQVRfUElPICovCisJZXNwX2VudGVyX21zZ291dCwJLyogRVNQX01PUCAqLworCWVzcF9lbnRlcl9tc2dpbiwJLyogRVNQX01JUCAqLworfTsKKworLyogVGhlIHRhcmdldCBoYXMgY29udHJvbCBvZiB0aGUgYnVzIGFuZCB3ZSBoYXZlIHRvIHNlZSB3aGVyZSBpdCBoYXMKKyAqIHRha2VuIHVzLgorICovCitzdGF0aWMgaW50IGVzcF9kb19waGFzZV9kZXRlcm1pbmUoc3RydWN0IE5DUl9FU1AgKmVzcCwKKwkJCQkgIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJaWYgKChlc3AtPmlyZWcgJiBFU1BfSU5UUl9EQykgIT0gMCkKKwkJcmV0dXJuIGVzcF9kaXNjb25uZWN0X2FtaWRzdF9waGFzZXMoZXNwLCBlcmVncyk7CisJcmV0dXJuIHBoYXNlX3ZlY3Rvcltlc3AtPnNyZWcgJiBFU1BfU1RBVF9QTUFTS10oZXNwLCBlcmVncyk7Cit9CisKKy8qIEZpcnN0IGludGVycnVwdCBhZnRlciBleGVjJ2luZyBhIGNtZCBjb21lcyBoZXJlLiAqLworc3RhdGljIGludCBlc3Bfc2VsZWN0X2NvbXBsZXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJU2NzaV9DbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKKwlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IFNDcHRyLT5kZXZpY2UtPmhvc3RkYXRhOworCWludCBjbWRfYnl0ZXNfc2VudCwgZmNudDsKKworCWZjbnQgPSAoZXNwX3JlYWQoZXJlZ3MtPmVzcF9mZmxhZ3MpICYgRVNQX0ZGX0ZCWVRFUyk7CisJY21kX2J5dGVzX3NlbnQgPSBlc3AtPmRtYV9ieXRlc19zZW50KGVzcCwgZmNudCk7CisJaWYoZXNwLT5kbWFfaW52YWxpZGF0ZSkKKwkJZXNwLT5kbWFfaW52YWxpZGF0ZShlc3ApOworCisJLyogTGV0J3MgY2hlY2sgdG8gc2VlIGlmIGEgcmVzZWxlY3QgaGFwcGVuZWQKKwkgKiB3aGlsZSB3ZSB3ZSdyZSB0cnlpbmcgdG8gc2VsZWN0LiAgVGhpcyBtdXN0CisJICogYmUgY2hlY2tlZCBmaXJzdC4KKwkgKi8KKwlpZihlc3AtPmlyZWcgPT0gKEVTUF9JTlRSX1JTRUwgfCBFU1BfSU5UUl9GRE9ORSkpIHsKKwkJZXNwX3JlY29ubmVjdChlc3AsIFNDcHRyKTsKKwkJcmV0dXJuIGVzcF9kb19yZWNvbm5lY3QoZXNwLCBlcmVncyk7CisJfQorCisJLyogTG9va3MgbGlrZSB0aGluZ3Mgd29ya2VkLCB3ZSBzaG91bGQgc2VlIGEgYnVzIHNlcnZpY2UgJgorCSAqIGEgZnVuY3Rpb24gY29tcGxldGUgaW50ZXJydXB0IGF0IHRoaXMgcG9pbnQuICBOb3RlIHdlCisJICogYXJlIGRvaW5nIGEgZGlyZWN0IGNvbXBhcmlzb24gYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvCisJICogYmUgZm9vbGVkIGludG8gdGhpbmtpbmcgc2VsZWN0aW9uIHdhcyBzdWNjZXNzZnVsIGlmCisJICogRVNQX0lOVFJfREMgaXMgc2V0LCBzZWUgYmVsb3cuCisJICovCisJaWYoZXNwLT5pcmVnID09IChFU1BfSU5UUl9GRE9ORSB8IEVTUF9JTlRSX0JTRVJWKSkgeworCQkvKiB0YXJnZXQgc3BlYWtzLi4uICovCisJCWVzcC0+dGFyZ2V0c19wcmVzZW50IHw9ICgxPDxTQ3B0ci0+ZGV2aWNlLT5pZCk7CisKKwkJLyogV2hhdCBpZiB0aGUgdGFyZ2V0IGlnbm9yZXMgdGhlIHNkdHI/ICovCisJCWlmKGVzcC0+c25pcCkKKwkJCWVzcF9kZXYtPnN5bmMgPSAxOworCisJCS8qIFNlZSBob3cgZmFyLCBpZiBhdCBhbGwsIHdlIGdvdCBpbiBnZXR0aW5nCisJCSAqIHRoZSBpbmZvcm1hdGlvbiBvdXQgdG8gdGhlIHRhcmdldC4KKwkJICovCisJCXN3aXRjaChlc3AtPnNlcXJlZykgeworCQlkZWZhdWx0OgorCisJCWNhc2UgRVNQX1NURVBfQVNFTDoKKwkJCS8qIEFyYml0cmF0aW9uIHdvbiwgdGFyZ2V0IHNlbGVjdGVkLCBidXQKKwkJCSAqIHdlIGFyZSBpbiBzb21lIHBoYXNlIHdoaWNoIGlzIG5vdCBjb21tYW5kCisJCQkgKiBwaGFzZSBub3IgaXMgaXQgbWVzc2FnZSBvdXQgcGhhc2UuCisJCQkgKgorCQkJICogWFhYIFdlJ3ZlIGNvbmZ1c2VkIHRoZSB0YXJnZXQsIG9idmlvdXNseS4KKwkJCSAqIFhYWCBTbyBjbGVhciBpdCdzIHN0YXRlLCBidXQgd2UgYWxzbyBlbmQKKwkJCSAqIFhYWCB1cCBjbGVhcmluZyBldmVyeW9uZSBlbHNlcy4gIFRoYXQgaXNuJ3QKKwkJCSAqIFhYWCBzbyBuaWNlLiAgSSdkIGxpa2UgdG8ganVzdCByZXNldCB0aGlzCisJCQkgKiBYWFggdGFyZ2V0LCBidXQgaWYgSSBjYW5ub3QgZXZlbiBnZXQgaXQncworCQkJICogWFhYIGF0dGVudGlvbiBhbmQgZmluaXNoIHNlbGVjdGlvbiB0byB0YWxrCisJCQkgKiBYWFggdG8gaXQsIHRoZXJlIGlzIG5vdCBtdWNoIG1vcmUgSSBjYW4gZG8uCisJCQkgKiBYWFggSWYgd2UgaGF2ZSBhIGxvYWRlZCBidXMgd2UncmUgZ29pbmcgdG8KKwkJCSAqIFhYWCBzcGVuZCB0aGUgbmV4dCBzZWNvbmQgb3Igc28gcmVuZWdvdGlhdGluZworCQkJICogWFhYIGZvciBzeW5jaHJvbm91cyB0cmFuc2ZlcnMuCisJCQkgKi8KKwkJCUVTUExPRygoImVzcCVkOiBTVEVQX0FTRUwgZm9yIHRndCAlZFxuIiwKKwkJCQllc3AtPmVzcF9pZCwgU0NwdHItPmRldmljZS0+aWQpKTsKKworCQljYXNlIEVTUF9TVEVQX1NJRDoKKwkJCS8qIEFyYml0cmF0aW9uIHdvbiwgdGFyZ2V0IHNlbGVjdGVkLCB3ZW50CisJCQkgKiB0byBtZXNzYWdlIG91dCBwaGFzZSwgc2VudCBvbmUgbWVzc2FnZQorCQkJICogYnl0ZSwgdGhlbiB3ZSBzdG9wcGVkLiAgQVROIGlzIGFzc2VydGVkCisJCQkgKiBvbiB0aGUgU0NTSSBidXMgYW5kIHRoZSB0YXJnZXQgaXMgc3RpbGwKKwkJCSAqIHRoZXJlIGhhbmdpbmcgb24uICBUaGlzIGlzIGEgbGVnYWwKKwkJCSAqIHNlcXVlbmNlIHN0ZXAgaWYgd2UgZ2F2ZSB0aGUgRVNQIGEgc2VsZWN0CisJCQkgKiBhbmQgc3RvcCBjb21tYW5kLgorCQkJICoKKwkJCSAqIFhYWCBTZWUgYWJvdmUsIEkgY291bGQgc2V0IHRoZSBib3JrZW4gZmxhZworCQkJICogWFhYIGluIHRoZSBkZXZpY2Ugc3RydWN0IGFuZCByZXRyeSB0aGUKKwkJCSAqIFhYWCBjb21tYW5kLiAgQnV0IHdvdWxkIHRoYXQgaGVscCBmb3IKKwkJCSAqIFhYWCB0YWdnZWQgY2FwYWJsZSB0YXJnZXRzPworCQkJICovCisKKwkJY2FzZSBFU1BfU1RFUF9OQ01EOgorCQkJLyogQXJiaXRyYXRpb24gd29uLCB0YXJnZXQgc2VsZWN0ZWQsIG1heWJlCisJCQkgKiBzZW50IHRoZSBvbmUgbWVzc2FnZSBieXRlIGluIG1lc3NhZ2Ugb3V0CisJCQkgKiBwaGFzZSwgYnV0IHdlIGRpZCBub3QgZ28gdG8gY29tbWFuZCBwaGFzZQorCQkJICogaW4gdGhlIGVuZC4gIEFjdHVhbGx5LCB3ZSBjb3VsZCBoYXZlIHNlbnQKKwkJCSAqIG9ubHkgc29tZSBvZiB0aGUgbWVzc2FnZSBieXRlcyBpZiB3ZSB0cmllZAorCQkJICogdG8gc2VuZCBvdXQgdGhlIGVudGlyZSBpZGVudGlmeSBhbmQgdGFnCisJCQkgKiBtZXNzYWdlIHVzaW5nIEVTUF9DTURfU0EzLgorCQkJICovCisJCQljbWRfYnl0ZXNfc2VudCA9IDA7CisJCQlicmVhazsKKworCQljYXNlIEVTUF9TVEVQX1BQQzoKKwkJCS8qIE5vLCBub3QgdGhlIHBvd2VyUEMgcGluaGVhZC4gIEFyYml0cmF0aW9uCisJCQkgKiB3b24sIGFsbCBtZXNzYWdlIGJ5dGVzIHNlbnQgaWYgd2Ugd2VudCB0bworCQkJICogbWVzc2FnZSBvdXQgcGhhc2UsIHdlbnQgdG8gY29tbWFuZCBwaGFzZQorCQkJICogYnV0IG9ubHkgcGFydCBvZiB0aGUgY29tbWFuZCB3YXMgc2VudC4KKwkJCSAqCisJCQkgKiBYWFggSSd2ZSBzZWVuIHRoaXMsIGJ1dCB1c3VhbGx5IGluIGNvbmp1bmN0aW9uCisJCQkgKiBYWFggd2l0aCBhIGdyb3NzIGVycm9yIHdoaWNoIGFwcGVhcnMgdG8gaGF2ZQorCQkJICogWFhYIG9jY3VycmVkIGJldHdlZW4gdGhlIHRpbWUgSSB0b2xkIHRoZQorCQkJICogWFhYIEVTUCB0byBhcmJpdHJhdGUgYW5kIHdoZW4gSSBnb3QgdGhlCisJCQkgKiBYWFggaW50ZXJydXB0LiAgQ291bGQgSSBoYXZlIG1pc2xvYWRlZCB0aGUKKwkJCSAqIFhYWCBjb21tYW5kIGJ5dGVzIGludG8gdGhlIGZpZm8/ICBBY3R1YWxseSwKKwkJCSAqIFhYWCBJIG1vc3QgbGlrZWx5IG1pc3NlZCBhIHBoYXNlLCBhbmQgdGhlcmVmb3JlCisJCQkgKiBYWFggd2VudCBpbnRvIG5ldmVyIG5ldmVyIGxhbmQgYW5kIGRpZG4ndCBldmVuCisJCQkgKiBYWFgga25vdyBpdC4gIFRoYXQgd2FzIHRoZSBvbGQgZHJpdmVyIHRob3VnaC4KKwkJCSAqIFhYWCBXaGF0IGlzIGV2ZW4gbW9yZSBwZWN1bGlhciBpcyB0aGF0IHRoZSBFU1AKKwkJCSAqIFhYWCBzaG93ZWQgdGhlIHByb3BlciBmdW5jdGlvbiBjb21wbGV0ZSBhbmQKKwkJCSAqIFhYWCBidXMgc2VydmljZSBiaXRzIGluIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIuCisJCQkgKi8KKworCQljYXNlIEVTUF9TVEVQX0ZJTkk0OgorCQljYXNlIEVTUF9TVEVQX0ZJTkk1OgorCQljYXNlIEVTUF9TVEVQX0ZJTkk2OgorCQljYXNlIEVTUF9TVEVQX0ZJTkk3OgorCQkJLyogQWNjb3VudCBmb3IgdGhlIGlkZW50aWZ5IG1lc3NhZ2UgKi8KKwkJCWlmKFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fc2xjdF9ub3JtKQorCQkJCWNtZF9ieXRlc19zZW50IC09IDE7CisJCX07CisJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9OVUxMKTsKKworCQkvKiBCZSBjYXJlZnVsLCB3ZSBjb3VsZCByZWFsbHkgZ2V0IGZ1Y2tlZCBkdXJpbmcgc3luY2hyb25vdXMKKwkJICogZGF0YSB0cmFuc2ZlcnMgaWYgd2UgdHJ5IHRvIGZsdXNoIHRoZSBmaWZvIG5vdy4KKwkJICovCisJCWlmKCFmY250ICYmIC8qIEZpZm8gaXMgZW1wdHkgYW5kLi4uICovCisJCSAgIC8qIGVpdGhlciB3ZSBhcmUgbm90IGRvaW5nIHN5bmNocm9ub3VzIHRyYW5zZmVycyBvci4uLiAqLworCQkgICAoIWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCB8fAorCQkgICAgLyogV2UgYXJlIG5vdCBnb2luZyBpbnRvIGRhdGEgaW4gcGhhc2UuICovCisJCSAgICAoKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BNQVNLKSAhPSBFU1BfRElQKSkpCisJCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRkxVU0gpOyAvKiBmbHVzaCBpcyBzYWZlICovCisKKwkJLyogU2VlIGhvdyBmYXIgd2UgZ290IGlmIHRoaXMgaXMgbm90IGEgc2xvdyBjb21tYW5kLiAqLworCQlpZighZXNwLT5lc3Bfc2xvd2NtZCkgeworCQkJaWYoY21kX2J5dGVzX3NlbnQgPCAwKQorCQkJCWNtZF9ieXRlc19zZW50ID0gMDsKKwkJCWlmKGNtZF9ieXRlc19zZW50ICE9IFNDcHRyLT5jbWRfbGVuKSB7CisJCQkJLyogQ3JhcG9sYSwgbWFyayBpdCBhcyBhIHNsb3djbWQKKwkJCQkgKiBzbyB0aGF0IHdlIGhhdmUgc29tZSBjaGFuY2Ugb2YKKwkJCQkgKiBrZWVwaW5nIHRoZSBjb21tYW5kIGFsaXZlIHdpdGgKKwkJCQkgKiBnb29kIGx1Y2suCisJCQkJICoKKwkJCQkgKiBYWFggQWN0dWFsbHksIGlmIHdlIGRpZG4ndCBzZW5kIGl0IGFsbAorCQkJCSAqIFhYWCB0aGlzIG1lYW5zIGVpdGhlciB3ZSBkaWRuJ3Qgc2V0IHRoaW5ncworCQkJCSAqIFhYWCB1cCBwcm9wZXJseSAoZHJpdmVyIGJ1Zykgb3IgdGhlIHRhcmdldAorCQkJCSAqIFhYWCBvciB0aGUgRVNQIGRldGVjdGVkIHBhcml0eSBvbiBvbmUgb2YKKwkJCQkgKiBYWFggdGhlIGNvbW1hbmQgYnl0ZXMuICBUaGlzIG1ha2VzIG11Y2gKKwkJCQkgKiBYWFggbW9yZSBzZW5zZSwgYW5kIHRoZXJlZm9yZSB0aGlzIGNvZGUKKwkJCQkgKiBYWFggc2hvdWxkIGJlIGNoYW5nZWQgdG8gc2VuZCBvdXQgYQorCQkJCSAqIFhYWCBwYXJpdHkgZXJyb3IgbWVzc2FnZSBvciBpZiB0aGUgc3RhdHVzCisJCQkJICogWFhYIHJlZ2lzdGVyIHNob3dzIG5vIHBhcml0eSBlcnJvciB0aGVuCisJCQkJICogWFhYIGp1c3QgZXhwZWN0IHRoZSB0YXJnZXQgdG8gYnJpbmcgdGhlCisJCQkJICogWFhYIGJ1cyBpbnRvIG1lc3NhZ2UgaW4gcGhhc2Ugc28gdGhhdCBpdAorCQkJCSAqIFhYWCBjYW4gc2VuZCB1cyB0aGUgcGFyaXR5IGVycm9yIG1lc3NhZ2UuCisJCQkJICogWFhYIFNDU0kgc3Vja3MuLi4KKwkJCQkgKi8KKwkJCQllc3AtPmVzcF9zbG93Y21kID0gMTsKKwkJCQllc3AtPmVzcF9zY21kcCA9ICYoU0NwdHItPmNtbmRbY21kX2J5dGVzX3NlbnRdKTsKKwkJCQllc3AtPmVzcF9zY21kbGVmdCA9IChTQ3B0ci0+Y21kX2xlbiAtIGNtZF9ieXRlc19zZW50KTsKKwkJCX0KKwkJfQorCisJCS8qIE5vdyBmaWd1cmUgb3V0IHdoZXJlIHdlIHdlbnQuICovCisJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJCXJldHVybiBlc3BfZG9fcGhhc2VfZGV0ZXJtaW5lKGVzcCwgZXJlZ3MpOworCX0KKworCS8qIERpZCB0aGUgdGFyZ2V0IGV2ZW4gbWFrZSBpdD8gKi8KKwlpZihlc3AtPmlyZWcgPT0gRVNQX0lOVFJfREMpIHsKKwkJLyogd2hlZWUuLi4gbm9ib2R5IHRoZXJlIG9yIHRoZXkgZGlkbid0IGxpa2UKKwkJICogd2hhdCB3ZSB0b2xkIGl0IHRvIGRvLCBjbGVhbiB1cC4KKwkJICovCisKKwkJLyogSWYgYW55b25lIGlzIG9mZiB0aGUgYnVzLCBidXQgd29ya2luZyBvbgorCQkgKiBhIGNvbW1hbmQgaW4gdGhlIGJhY2tncm91bmQgZm9yIHVzLCB0ZWxsCisJCSAqIHRoZSBFU1AgdG8gbGlzdGVuIGZvciB0aGVtLgorCQkgKi8KKwkJaWYoZXNwLT5kaXNjb25uZWN0ZWRfU0MpCisJCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRVNFTCk7CisKKwkJaWYoKCgxPDxTQ3B0ci0+ZGV2aWNlLT5pZCkgJiBlc3AtPnRhcmdldHNfcHJlc2VudCkgJiYKKwkJICAgZXNwLT5zZXFyZWcgJiYgZXNwLT5jdXJfbXNnb3V0WzBdID09IEVYVEVOREVEX01FU1NBR0UgJiYKKwkJICAgKFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fc2xjdF9tc2cgfHwKKwkJICAgIFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fc2xjdF9zdG9wKSkgeworCQkJLyogc2hpdCAqLworCQkJZXNwLT5zbmlwID0gMDsKKwkJCUVTUExPRygoImVzcCVkOiBGYWlsZWQgc3luY2hyb25vdXMgbmVnb3RpYXRpb24gZm9yIHRhcmdldCAlZCAiCisJCQkJImx1biAlZFxuIiwgZXNwLT5lc3BfaWQsIFNDcHRyLT5kZXZpY2UtPmlkLCBTQ3B0ci0+ZGV2aWNlLT5sdW4pKTsKKwkJCWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCA9IDA7CisJCQllc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgPSAwOworCQkJZXNwX2Rldi0+c3luYyA9IDE7IC8qIHNvIHdlIGRvbid0IG5lZ290aWF0ZSBhZ2FpbiAqLworCisJCQkvKiBSdW4gdGhlIGNvbW1hbmQgYWdhaW4sIHRoaXMgdGltZSB0aG91Z2ggd2UKKwkJCSAqIHdvbid0IHRyeSB0byBuZWdvdGlhdGUgZm9yIHN5bmNocm9ub3VzIHRyYW5zZmVycy4KKwkJCSAqCisJCQkgKiBYWFggSSdkIGxpa2UgdG8gZG8gc29tZXRoaW5nIGxpa2Ugc2VuZCBhbgorCQkJICogWFhYIElOSVRJQVRPUl9FUlJPUiBvciBBQk9SVCBtZXNzYWdlIHRvIHRoZQorCQkJICogWFhYIHRhcmdldCB0byB0ZWxsIGl0LCAiU29ycnkgSSBjb25mdXNlZCB5b3UsCisJCQkgKiBYWFggcGxlYXNlIGNvbWUgYmFjayBhbmQgSSB3aWxsIGJlIG5pY2VyIG5leHQKKwkJCSAqIFhYWCB0aW1lIi4gIEJ1dCB0aGF0IHJlcXVpcmVzIGhhdmluZyB0aGUgdGFyZ2V0CisJCQkgKiBYWFggb24gdGhlIGJ1cywgYW5kIGl0IGhhcyBkcm9wcGVkIEJTWSBvbiB1cy4KKwkJCSAqLworCQkJZXNwLT5jdXJyZW50X1NDID0gTlVMTDsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBub3RfaXNzdWVkKTsKKwkJCXByZXBlbmRfU0MoJmVzcC0+aXNzdWVfU0MsIFNDcHRyKTsKKwkJCWVzcF9leGVjX2NtZChlc3ApOworCQkJcmV0dXJuIGRvX2ludHJfZW5kOworCQl9CisKKwkJLyogT2ssIHRoaXMgaXMgbm9ybWFsLCB0aGlzIGlzIHdoYXQgd2Ugc2VlIGR1cmluZyBib290CisJCSAqIG9yIHdoZW5ldmVyIHdoZW4gd2UgYXJlIHNjYW5uaW5nIHRoZSBidXMgZm9yIHRhcmdldHMuCisJCSAqIEJ1dCBmaXJzdCBtYWtlIHN1cmUgdGhhdCBpcyByZWFsbHkgd2hhdCBpcyBoYXBwZW5pbmcuCisJCSAqLworCQlpZigoKDE8PFNDcHRyLT5kZXZpY2UtPmlkKSAmIGVzcC0+dGFyZ2V0c19wcmVzZW50KSkgeworCQkJRVNQTE9HKCgiZXNwJWQ6IFdhcm5pbmcsIGxpdmUgdGFyZ2V0ICVkIG5vdCByZXNwb25kaW5nIHRvICIKKwkJCQkic2VsZWN0aW9uLlxuIiwgZXNwLT5lc3BfaWQsIFNDcHRyLT5kZXZpY2UtPmlkKSk7CisKKwkJCS8qIFRoaXMgX0NBTl8gaGFwcGVuLiAgVGhlIFNDU0kgc3RhbmRhcmQgc3RhdGVzIHRoYXQKKwkJCSAqIHRoZSB0YXJnZXQgaXMgdG8gX25vdF8gcmVzcG9uZCB0byBzZWxlY3Rpb24gaWYKKwkJCSAqIF9pdF8gZGV0ZWN0cyBiYWQgcGFyaXR5IG9uIHRoZSBidXMgZm9yIGFueSByZWFzb24uCisJCQkgKiBUaGVyZWZvcmUsIHdlIGFzc3VtZSB0aGF0IGlmIHdlJ3ZlIHRhbGtlZCBzdWNjZXNzZnVsbHkKKwkJCSAqIHRvIHRoaXMgdGFyZ2V0IGJlZm9yZSwgYmFkIHBhcml0eSBpcyB0aGUgcHJvYmxlbS4KKwkJCSAqLworCQkJZXNwX2RvbmUoZXNwLCAoRElEX1BBUklUWSA8PCAxNikpOworCQl9IGVsc2UgeworCQkJLyogRWxzZSwgdGhlcmUgcmVhbGx5IGlzbid0IGFueW9uZSB0aGVyZS4gKi8KKwkJCUVTUE1JU0MoKCJlc3A6IHNlbGVjdGlvbiBmYWlsdXJlLCBtYXliZSBub2JvZHkgdGhlcmU/XG4iKSk7CisJCQlFU1BNSVNDKCgiZXNwOiB0YXJnZXQgJWQgbHVuICVkXG4iLAorCQkJCSBTQ3B0ci0+ZGV2aWNlLT5pZCwgU0NwdHItPmRldmljZS0+bHVuKSk7CisJCQllc3BfZG9uZShlc3AsIChESURfQkFEX1RBUkdFVCA8PCAxNikpOworCQl9CisJCXJldHVybiBkb19pbnRyX2VuZDsKKwl9CisKKworCUVTUExPRygoImVzcCVkOiBTZWxlY3Rpb24gZmFpbHVyZS5cbiIsIGVzcC0+ZXNwX2lkKSk7CisJcHJpbnRrKCJlc3AlZDogQ3VycmVudGx5IC0tICIsIGVzcC0+ZXNwX2lkKTsKKwllc3BfcHJpbnRfaXJlZyhlc3AtPmlyZWcpOworCXByaW50aygiICIpOworCWVzcF9wcmludF9zdGF0cmVnKGVzcC0+c3JlZyk7CisJcHJpbnRrKCIgIik7CisJZXNwX3ByaW50X3NlcXJlZyhlc3AtPnNlcXJlZyk7CisJcHJpbnRrKCJcbiIpOworCXByaW50aygiZXNwJWQ6IE5ldyAtLSAiLCBlc3AtPmVzcF9pZCk7CisJZXNwLT5zcmVnID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9zdGF0dXMpOworCWVzcC0+c2VxcmVnID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9zc3RlcCk7CisJZXNwLT5pcmVnID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9pbnRycHQpOworCWVzcF9wcmludF9pcmVnKGVzcC0+aXJlZyk7CisJcHJpbnRrKCIgIik7CisJZXNwX3ByaW50X3N0YXRyZWcoZXNwLT5zcmVnKTsKKwlwcmludGsoIiAiKTsKKwllc3BfcHJpbnRfc2VxcmVnKGVzcC0+c2VxcmVnKTsKKwlwcmludGsoIlxuIik7CisJRVNQTE9HKCgiZXNwJWQ6IHJlc2V0dGluZyBidXNcbiIsIGVzcC0+ZXNwX2lkKSk7CisJcmV0dXJuIGRvX3Jlc2V0X2J1czsgLyogdWdoLi4uICovCit9CisKKy8qIENvbnRpbnVlIHJlYWRpbmcgYnl0ZXMgZm9yIG1zZ2luIHBoYXNlLiAqLworc3RhdGljIGludCBlc3BfZG9fbXNnaW5jb250KHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJaWYoZXNwLT5pcmVnICYgRVNQX0lOVFJfQlNFUlYpIHsKKwkJLyogaW4gdGhlIHJpZ2h0IHBoYXNlIHRvbz8gKi8KKwkJaWYoKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BNQVNLKSA9PSBFU1BfTUlQKSB7CisJCQkvKiBwaGV3Li4uICovCisJCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfVEkpOworCQkJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9tc2dpbmRvbmUpOworCQkJcmV0dXJuIGRvX2ludHJfZW5kOworCQl9CisKKwkJLyogV2UgY2hhbmdlZCBwaGFzZSBidXQgRVNQIHNob3dzIGJ1cyBzZXJ2aWNlLAorCQkgKiBpbiB0aGlzIGNhc2UgaXQgaXMgbW9zdCBsaWtlbHkgdGhhdCB3ZSwgdGhlCisJCSAqIGhhY2tlciB3aG8gaGFzIGJlZW4gdXAgZm9yIDIwaHJzIHN0cmFpZ2h0CisJCSAqIHN0YXJpbmcgYXQgdGhlIHNjcmVlbiwgZHJvd25lZCBpbiBjb2ZmZWUKKwkJICogc21lbGxpbmcgbGlrZSByZXRjaGVkIGNpZ2FyZXR0ZSBhc2hlcworCQkgKiBoYXZlIG1pc2NvZGVkIHNvbWV0aGluZy4uLi4uIHNvLCB0cnkgdG8KKwkJICogcmVjb3ZlciBhcyBiZXN0IHdlIGNhbi4KKwkJICovCisJCUVTUExPRygoImVzcCVkOiBtZXNzYWdlIGluIG1pcy1jYXJyaWFnZS5cbiIsIGVzcC0+ZXNwX2lkKSk7CisJfQorCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fdGhlX2RhcmspOworCXJldHVybiBkb19waGFzZV9kZXRlcm1pbmU7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfc2luZ2xlYnl0ZV9tc2coc3RydWN0IE5DUl9FU1AgKmVzcCwKKwkJCQlzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCWVzcC0+cHJldm1zZ2luID0gZXNwLT5jdXJfbXNnaW5bMF07CisJaWYoZXNwLT5jdXJfbXNnaW5bMF0gJiAweDgwKSB7CisJCS8qIHdoZWVlLi4uICovCisJCUVTUExPRygoImVzcCVkOiB0YXJnZXQgc2VuZHMgaWRlbnRpZnkgYW1pZHN0IHBoYXNlc1xuIiwKKwkJCWVzcC0+ZXNwX2lkKSk7CisJCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fdGhlX2RhcmspOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYoKChlc3AtPmN1cl9tc2dpblswXSAmIDB4ZjApID09IDB4MjApIHx8CisJCSAgKGVzcC0+Y3VyX21zZ2luWzBdID09IEVYVEVOREVEX01FU1NBR0UpKSB7CisJCWVzcC0+bXNnaW5fbGVuID0gMjsKKwkJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9tc2dpbmNvbnQpOworCQlyZXR1cm4gMDsKKwl9CisJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl90aGVfZGFyayk7CisJc3dpdGNoKGVzcC0+Y3VyX21zZ2luWzBdKSB7CisJZGVmYXVsdDoKKwkJLyogV2UgZG9uJ3Qgd2FudCB0byBoZWFyIGFib3V0IGl0LiAqLworCQlFU1BMT0coKCJlc3AlZDogbXNnICUwMnggd2hpY2ggd2UgZG9uJ3Qga25vdyBhYm91dFxuIiwgZXNwLT5lc3BfaWQsCisJCQllc3AtPmN1cl9tc2dpblswXSkpOworCQlyZXR1cm4gTUVTU0FHRV9SRUpFQ1Q7CisKKwljYXNlIE5PUDoKKwkJRVNQTE9HKCgiZXNwJWQ6IHRhcmdldCAlZCBzZW5kcyBhIG5vcFxuIiwgZXNwLT5lc3BfaWQsCisJCQllc3AtPmN1cnJlbnRfU0MtPmRldmljZS0+aWQpKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFJFU1RPUkVfUE9JTlRFUlM6CisJCS8qIEluIHRoaXMgY2FzZSB3ZSBtaWdodCBhbHNvIGhhdmUgdG8gYmFja3VwIHRoZQorCQkgKiAic2xvdyBjb21tYW5kIiBwb2ludGVyLiAgSXQgaXMgcmFyZSB0byBnZXQgc3VjaAorCQkgKiBhIHNhdmUvcmVzdG9yZSBwb2ludGVyIHNlcXVlbmNlIHNvIGVhcmx5IGluIHRoZQorCQkgKiBidXMgdHJhbnNpdGlvbiBzZXF1ZW5jZXMsIGJ1dCBjb3ZlciBpdC4KKwkJICovCisJCWlmKGVzcC0+ZXNwX3Nsb3djbWQpIHsKKwkJCWVzcC0+ZXNwX3NjbWRsZWZ0ID0gZXNwLT5jdXJyZW50X1NDLT5jbWRfbGVuOworCQkJZXNwLT5lc3Bfc2NtZHAgPSAmZXNwLT5jdXJyZW50X1NDLT5jbW5kWzBdOworCQl9CisJCWVzcF9yZXN0b3JlX3BvaW50ZXJzKGVzcCwgZXNwLT5jdXJyZW50X1NDKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNBVkVfUE9JTlRFUlM6CisJCWVzcF9zYXZlX3BvaW50ZXJzKGVzcCwgZXNwLT5jdXJyZW50X1NDKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIENPTU1BTkRfQ09NUExFVEU6CisJY2FzZSBESVNDT05ORUNUOgorCQkvKiBGcmVlaW5nIHRoZSBidXMsIGxldCBpdCBnby4gKi8KKwkJZXNwLT5jdXJyZW50X1NDLT5TQ3AucGhhc2UgPSBpbl9mcmVlaW5nOworCQlyZXR1cm4gMDsKKworCWNhc2UgTUVTU0FHRV9SRUpFQ1Q6CisJCUVTUE1JU0MoKCJtc2cgcmVqZWN0LCAiKSk7CisJCWlmKGVzcC0+cHJldm1zZ291dCA9PSBFWFRFTkRFRF9NRVNTQUdFKSB7CisJCQlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IGVzcC0+Y3VycmVudF9TQy0+ZGV2aWNlLT5ob3N0ZGF0YTsKKworCQkJLyogRG9lc24ndCBsb29rIGxpa2UgdGhpcyB0YXJnZXQgY2FuCisJCQkgKiBkbyBzeW5jaHJvbm91cyBvciBXSURFIHRyYW5zZmVycy4KKwkJCSAqLworCQkJRVNQU0RUUigoImdvdCByZWplY3QsIHdhcyB0cnlpbmcgbmVnbywgY2xlYXJpbmcgc3luYy9XSURFXG4iKSk7CisJCQllc3BfZGV2LT5zeW5jID0gMTsKKwkJCWVzcF9kZXYtPndpZGUgPSAxOworCQkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gMDsKKwkJCWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCA9IDA7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCUVTUE1JU0MoKCJub3Qgc3luYyBuZWdvLCBzZW5kaW5nIEFCT1JUXG4iKSk7CisJCQlyZXR1cm4gQUJPUlQ7CisJCX0KKwl9OworfQorCisvKiBUYXJnZXQgbmVnb3RpYXRlcyBmb3Igc3luY2hyb25vdXMgdHJhbnNmZXJzIGJlZm9yZSB3ZSBkbywgdGhpcworICogaXMgbGVnYWwgYWx0aG91Z2ggdmVyeSBzdHJhbmdlLiAgV2hhdCBpcyBldmVuIGZ1bm5pZXIgaXMgdGhhdAorICogdGhlIFNDU0kyIHN0YW5kYXJkIHNwZWNpZmljYWxseSByZWNvbW1lbmRzIGFnYWluc3QgdGFyZ2V0cyBkb2luZworICogdGhpcyBiZWNhdXNlIHNvIG1hbnkgaW5pdGlhdG9ycyBjYW5ub3QgY29wZSB3aXRoIHRoaXMgb2NjdXJyaW5nLgorICovCitzdGF0aWMgaW50IHRhcmdldF93aXRoX2FudHNfaW5fcGFudHMoc3RydWN0IE5DUl9FU1AgKmVzcCwKKwkJCQkgICAgIFNjc2lfQ21uZCAqU0NwdHIsCisJCQkJICAgICBzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldikKK3sKKwlpZihlc3BfZGV2LT5zeW5jIHx8IFNDcHRyLT5kZXZpY2UtPmJvcmtlbikgeworCQkvKiBzb3JyeSwgbm8gY2FuIGRvICovCisJCUVTUFNEVFIoKCJmb3JjaW5nIHRvIGFzeW5jLCAiKSk7CisJCWJ1aWxkX3N5bmNfbmVnb19tc2coZXNwLCAwLCAwKTsKKwkJZXNwX2Rldi0+c3luYyA9IDE7CisJCWVzcC0+c25pcCA9IDE7CisJCUVTUExPRygoImVzcCVkOiBob3BpbmcgZm9yIG1zZ291dFxuIiwgZXNwLT5lc3BfaWQpKTsKKwkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKKwkJcmV0dXJuIEVYVEVOREVEX01FU1NBR0U7CisJfQorCisJLyogT2ssIHdlJ2xsIGNoZWNrIHRoZW0gb3V0Li4uICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmNfcmVwb3J0KHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJaW50IG1zZzMsIG1zZzQ7CisJY2hhciAqdHlwZTsKKworCW1zZzMgPSBlc3AtPmN1cl9tc2dpblszXTsKKwltc2c0ID0gZXNwLT5jdXJfbXNnaW5bNF07CisJaWYobXNnNCkgeworCQlpbnQgaHogPSAxMDAwMDAwMDAwIC8gKG1zZzMgKiA0KTsKKwkJaW50IGludGVnZXIgPSBoeiAvIDEwMDAwMDA7CisJCWludCBmcmFjdGlvbiA9IChoeiAtIChpbnRlZ2VyICogMTAwMDAwMCkpIC8gMTAwMDA7CisJCWlmKChtc2czICogNCkgPCAyMDApIHsKKwkJCXR5cGUgPSAiRkFTVCI7CisJCX0gZWxzZSB7CisJCQl0eXBlID0gInN5bmNocm9ub3VzIjsKKwkJfQorCisJCS8qIERvIG5vdCB0cmFuc2Zvcm0gdGhpcyBiYWNrIGludG8gb25lIGJpZyBwcmludGsKKwkJICogYWdhaW4sIGl0IHRyaWdnZXJzIGEgYnVnIGluIG91ciBzcGFyYzY0LWdjYzI3MgorCQkgKiBzaWJsaW5nIGNhbGwgb3B0aW1pemF0aW9uLiAgLURhdmVNCisJCSAqLworCQlFU1BMT0coKEtFUk5fSU5GTyAiZXNwJWQ6IHRhcmdldCAlZCAiLAorCQkJZXNwLT5lc3BfaWQsIGVzcC0+Y3VycmVudF9TQy0+ZGV2aWNlLT5pZCkpOworCQlFU1BMT0coKCJbcGVyaW9kICVkbnMgb2Zmc2V0ICVkICVkLiUwMmRNSHogIiwKKwkJCShpbnQpIG1zZzMgKiA0LCAoaW50KSBtc2c0LAorCQkJaW50ZWdlciwgZnJhY3Rpb24pKTsKKwkJRVNQTE9HKCgiJXMgU0NTSSVzXVxuIiwgdHlwZSwKKwkJCSgoKG1zZzMgKiA0KSA8IDIwMCkgPyAiLUlJIiA6ICIiKSkpOworCX0gZWxzZSB7CisJCUVTUExPRygoS0VSTl9JTkZPICJlc3AlZDogdGFyZ2V0ICVkIGFzeW5jaHJvbm91c1xuIiwKKwkJCWVzcC0+ZXNwX2lkLCBlc3AtPmN1cnJlbnRfU0MtPmRldmljZS0+aWQpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfbXVsdGlieXRlX21zZyhzdHJ1Y3QgTkNSX0VTUCAqZXNwLAorCQkJICAgICAgIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJU2NzaV9DbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKKwlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IFNDcHRyLT5kZXZpY2UtPmhvc3RkYXRhOworCXVuY2hhciByZWd2YWwgPSAwOworCWludCBtZXNzYWdlX291dCA9IDA7CisKKwlFU1BTRFRSKCgiY2hrIG11bHRpYnl0ZSBtc2c6ICIpKTsKKwlpZihlc3AtPmN1cl9tc2dpblsyXSA9PSBFWFRFTkRFRF9TRFRSKSB7CisJCWludCBwZXJpb2QgPSBlc3AtPmN1cl9tc2dpblszXTsKKwkJaW50IG9mZnNldCA9IGVzcC0+Y3VyX21zZ2luWzRdOworCisJCUVTUFNEVFIoKCJpcyBzeW5jIG5lZ28gcmVzcG9uc2UsICIpKTsKKwkJaWYoIWVzcC0+c25pcCkgeworCQkJaW50IHJ2YWw7CisKKwkJCS8qIFRhcmdldCBuZWdvdGlhdGVzIGZpcnN0ISAqLworCQkJRVNQU0RUUigoInRhcmdldCBqdW1wcyB0aGUgZ3VuLCAiKSk7CisJCQltZXNzYWdlX291dCA9IEVYVEVOREVEX01FU1NBR0U7IC8qIHdlIG11c3QgcmVzcG9uZCAqLworCQkJcnZhbCA9IHRhcmdldF93aXRoX2FudHNfaW5fcGFudHMoZXNwLCBTQ3B0ciwgZXNwX2Rldik7CisJCQlpZihydmFsKQorCQkJCXJldHVybiBydmFsOworCQl9CisKKwkJRVNQU0RUUigoImV4YW1pbmluZyBzZHRyLCAiKSk7CisKKwkJLyogT2Zmc2V0IGNhbm5vdCBiZSBsYXJnZXIgdGhhbiBFU1AgZmlmbyBzaXplLiAqLworCQlpZihvZmZzZXQgPiAxNSkgeworCQkJRVNQU0RUUigoIm9mZnNldCB0b28gYmlnICUyeCwgIiwgb2Zmc2V0KSk7CisJCQlvZmZzZXQgPSAxNTsKKwkJCUVTUFNEVFIoKCJzZW5kaW5nIGJhY2sgbmV3IG9mZnNldFxuIikpOworCQkJYnVpbGRfc3luY19uZWdvX21zZyhlc3AsIHBlcmlvZCwgb2Zmc2V0KTsKKwkJCXJldHVybiBFWFRFTkRFRF9NRVNTQUdFOworCQl9CisKKwkJaWYob2Zmc2V0ICYmIHBlcmlvZCA+IGVzcC0+bWF4X3BlcmlvZCkgeworCQkJLyogWWVlZSwgYXN5bmMgZm9yIHRoaXMgc2xvdyBkZXZpY2UuICovCisJCQlFU1BTRFRSKCgicGVyaW9kIHRvbyBsb25nICUyeCwgIiwgcGVyaW9kKSk7CisJCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgMCwgMCk7CisJCQlFU1BTRFRSKCgiaG9waW5nIGZvciBtc2dvdXRcbiIpKTsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fdGhlX2RhcmspOworCQkJcmV0dXJuIEVYVEVOREVEX01FU1NBR0U7CisJCX0gZWxzZSBpZiAob2Zmc2V0ICYmIHBlcmlvZCA8IGVzcC0+bWluX3BlcmlvZCkgeworCQkJRVNQU0RUUigoInBlcmlvZCB0b28gc2hvcnQgJTJ4LCAiLCBwZXJpb2QpKTsKKwkJCXBlcmlvZCA9IGVzcC0+bWluX3BlcmlvZDsKKwkJCWlmKGVzcC0+ZXJldiA+IGVzcDIzNikKKwkJCQlyZWd2YWwgPSA0OworCQkJZWxzZQorCQkJCXJlZ3ZhbCA9IDU7CisJCX0gZWxzZSBpZihvZmZzZXQpIHsKKwkJCWludCB0bXA7CisKKwkJCUVTUFNEVFIoKCJwZXJpb2QgaXMgb2ssICIpKTsKKwkJCXRtcCA9IGVzcC0+Y2N5Y2xlIC8gMTAwMDsKKwkJCXJlZ3ZhbCA9ICgoKHBlcmlvZCA8PCAyKSArIHRtcCAtIDEpIC8gdG1wKTsKKwkJCWlmKHJlZ3ZhbCAmJiAoZXNwLT5lcmV2ID4gZXNwMjM2KSkgeworCQkJCWlmKHBlcmlvZCA+PSA1MCkKKwkJCQkJcmVndmFsLS07CisJCQl9CisJCX0KKworCQlpZihvZmZzZXQpIHsKKwkJCXVuY2hhciBiaXQ7CisKKwkJCWVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZCA9IChyZWd2YWwgJiAweDFmKTsKKwkJCWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCA9IChvZmZzZXQgfCBlc3AtPnJhZGVsYXkpOworCQkJaWYoZXNwLT5lcmV2ID4gZXNwMjM2KSB7CisJCQkJaWYoZXNwLT5lcmV2ID09IGZhczEwMGEpCisJCQkJCWJpdCA9IEVTUF9DT05GSUczX0ZBU1Q7CisJCQkJZWxzZQorCQkJCQliaXQgPSBFU1BfQ09ORklHM19GU0NTSTsKKwkJCQlpZihwZXJpb2QgPCA1MCkKKwkJCQkJZXNwLT5jb25maWczW1NDcHRyLT5kZXZpY2UtPmlkXSB8PSBiaXQ7CisJCQkJZWxzZQorCQkJCQllc3AtPmNvbmZpZzNbU0NwdHItPmRldmljZS0+aWRdICY9IH5iaXQ7CisJCQkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPmNvbmZpZzNbU0NwdHItPmRldmljZS0+aWRdOworCQkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzMsIGVzcC0+cHJldl9jZmczKTsKKwkJCX0KKwkJCWVzcC0+cHJldl9zb2ZmID0gZXNwX2Rldi0+c3luY19taW5fcGVyaW9kOworCQkJZXNwX3dyaXRlKGVyZWdzLT5lc3Bfc29mZiwgZXNwLT5wcmV2X3NvZmYpOworCQkJZXNwLT5wcmV2X3N0cCA9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldDsKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX3N0cCwgZXNwLT5wcmV2X3N0cCk7CisKKwkJCUVTUFNEVFIoKCJzb2ZmPSUyeCBzdHA9JTJ4IGNmZzM9JTJ4XG4iLAorCQkJCWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCwKKwkJCQllc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QsCisJCQkJZXNwLT5jb25maWczW1NDcHRyLT5kZXZpY2UtPmlkXSkpOworCisJCQllc3AtPnNuaXAgPSAwOworCQl9IGVsc2UgaWYoZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0KSB7CisJCQl1bmNoYXIgYml0OworCisJCQkvKiBiYWNrIHRvIGFzeW5jIG1vZGUgKi8KKwkJCUVTUFNEVFIoKCJ1bmFjY2FwdGFibGUgc3luYyBuZWdvLCBmb3JjaW5nIGFzeW5jXG4iKSk7CisJCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgPSAwOworCQkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gMDsKKwkJCWVzcC0+cHJldl9zb2ZmID0gMDsKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX3NvZmYsIDApOworCQkJZXNwLT5wcmV2X3N0cCA9IDA7CisJCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9zdHAsIDApOworCQkJaWYoZXNwLT5lcmV2ID4gZXNwMjM2KSB7CisJCQkJaWYoZXNwLT5lcmV2ID09IGZhczEwMGEpCisJCQkJCWJpdCA9IEVTUF9DT05GSUczX0ZBU1Q7CisJCQkJZWxzZQorCQkJCQliaXQgPSBFU1BfQ09ORklHM19GU0NTSTsKKwkJCQllc3AtPmNvbmZpZzNbU0NwdHItPmRldmljZS0+aWRdICY9IH5iaXQ7CisJCQkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPmNvbmZpZzNbU0NwdHItPmRldmljZS0+aWRdOworCQkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzMsIGVzcC0+cHJldl9jZmczKTsKKwkJCX0KKwkJfQorCisJCXN5bmNfcmVwb3J0KGVzcCk7CisKKwkJRVNQU0RUUigoImNoayBtdWx0aWJ5dGUgbXNnOiBzeW5jIGlzIGtub3duLCAiKSk7CisJCWVzcF9kZXYtPnN5bmMgPSAxOworCisJCWlmKG1lc3NhZ2Vfb3V0KSB7CisJCQlFU1BMT0coKCJlc3AlZDogc2VuZGluZyBzZHRyIGJhY2ssIGhvcGluZyBmb3IgbXNnb3V0XG4iLAorCQkJCWVzcC0+ZXNwX2lkKSk7CisJCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgcGVyaW9kLCBvZmZzZXQpOworCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKKwkJCXJldHVybiBFWFRFTkRFRF9NRVNTQUdFOworCQl9CisKKwkJRVNQU0RUUigoInJldHVybmluZyB6ZXJvXG4iKSk7CisJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7IC8qIC4uLm9yIGVsc2UhICovCisJCXJldHVybiAwOworCX0gZWxzZSBpZihlc3AtPmN1cl9tc2dpblsyXSA9PSBFWFRFTkRFRF9XRFRSKSB7CisJCUVTUExPRygoImVzcCVkOiBBSUVFRSB3aWRlIG1zZyByZWNlaXZlZFxuIiwgZXNwLT5lc3BfaWQpKTsKKwkJbWVzc2FnZV9vdXQgPSBNRVNTQUdFX1JFSkVDVDsKKwl9IGVsc2UgaWYoZXNwLT5jdXJfbXNnaW5bMl0gPT0gRVhURU5ERURfTU9ESUZZX0RBVEFfUE9JTlRFUikgeworCQlFU1BMT0coKCJlc3AlZDogcmVqZWN0aW5nIG1vZGlmeSBkYXRhIHB0ciBtc2dcbiIsIGVzcC0+ZXNwX2lkKSk7CisJCW1lc3NhZ2Vfb3V0ID0gTUVTU0FHRV9SRUpFQ1Q7CisJfQorCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJcmV0dXJuIG1lc3NhZ2Vfb3V0OworfQorCitzdGF0aWMgaW50IGVzcF9kb19tc2dpbmRvbmUoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncykKK3sKKwlTY3NpX0NtbmQgKlNDcHRyID0gZXNwLT5jdXJyZW50X1NDOworCWludCBtZXNzYWdlX291dCA9IDAsIGl0ID0gMCwgcnZhbDsKKworCXJ2YWwgPSBza2lwYWhlYWQxKGVzcCwgZXJlZ3MsIFNDcHRyLCBpbl9tc2dpbiwgaW5fbXNnaW5kb25lKTsKKwlpZihydmFsKQorCQlyZXR1cm4gcnZhbDsKKwlpZihTQ3B0ci0+U0NwLnNlbnRfY29tbWFuZCAhPSBpbl9zdGF0dXMpIHsKKwkJaWYoIShlc3AtPmlyZWcgJiBFU1BfSU5UUl9EQykpIHsKKwkJCWlmKGVzcC0+bXNnaW5fbGVuICYmIChlc3AtPnNyZWcgJiBFU1BfU1RBVF9QRVJSKSkgeworCQkJCW1lc3NhZ2Vfb3V0ID0gTVNHX1BBUklUWV9FUlJPUjsKKwkJCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRkxVU0gpOworCQkJfSBlbHNlIGlmKChpdCA9IChlc3BfcmVhZChlcmVncy0+ZXNwX2ZmbGFncykgJiBFU1BfRkZfRkJZVEVTKSkhPTEpIHsKKwkJCQkvKiBXZSBjZXJ0YWlubHkgZHJvcHBlZCB0aGUgYmFsbCBzb21ld2hlcmUuICovCisJCQkJbWVzc2FnZV9vdXQgPSBJTklUSUFUT1JfRVJST1I7CisJCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX0ZMVVNIKTsKKwkJCX0gZWxzZSBpZighZXNwLT5tc2dpbl9sZW4pIHsKKwkJCQlpdCA9IGVzcF9yZWFkKGVyZWdzLT5lc3BfZmRhdGEpOworCQkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9tc2dpbmNvbnQpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBpdCBpcyBvayBhbmQgd2Ugd2FudCBpdCAqLworCQkJCWl0ID0gZXNwLT5jdXJfbXNnaW5bZXNwLT5tc2dpbl9jdHJdID0KKwkJCQkJZXNwX3JlYWQoZXJlZ3MtPmVzcF9mZGF0YSk7CisJCQkJZXNwLT5tc2dpbl9jdHIrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJCQlyZXR1cm4gZG9fd29ya19idXM7CisJCX0KKwl9IGVsc2UgeworCQlpdCA9IGVzcC0+Y3VyX21zZ2luWzBdOworCX0KKwlpZighbWVzc2FnZV9vdXQgJiYgZXNwLT5tc2dpbl9sZW4pIHsKKwkJaWYoZXNwLT5tc2dpbl9jdHIgPCBlc3AtPm1zZ2luX2xlbikgeworCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX21zZ2luY29udCk7CisJCX0gZWxzZSBpZihlc3AtPm1zZ2luX2xlbiA9PSAxKSB7CisJCQltZXNzYWdlX291dCA9IGNoZWNrX3NpbmdsZWJ5dGVfbXNnKGVzcCwgZXJlZ3MpOworCQl9IGVsc2UgaWYoZXNwLT5tc2dpbl9sZW4gPT0gMikgeworCQkJaWYoZXNwLT5jdXJfbXNnaW5bMF0gPT0gRVhURU5ERURfTUVTU0FHRSkgeworCQkJCWlmKChpdCsyKSA+PSAxNSkgeworCQkJCQltZXNzYWdlX291dCA9IE1FU1NBR0VfUkVKRUNUOworCQkJCX0gZWxzZSB7CisJCQkJCWVzcC0+bXNnaW5fbGVuID0gKGl0ICsgMik7CisJCQkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9tc2dpbmNvbnQpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbWVzc2FnZV9vdXQgPSBNRVNTQUdFX1JFSkVDVDsgLyogZm9vIG9uIHlvdSAqLworCQkJfQorCQl9IGVsc2UgeworCQkJbWVzc2FnZV9vdXQgPSBjaGVja19tdWx0aWJ5dGVfbXNnKGVzcCwgZXJlZ3MpOworCQl9CisJfQorCWlmKG1lc3NhZ2Vfb3V0IDwgMCkgeworCQlyZXR1cm4gLW1lc3NhZ2Vfb3V0OworCX0gZWxzZSBpZihtZXNzYWdlX291dCkgeworCQlpZigoKG1lc3NhZ2Vfb3V0ICE9IDEpICYmCisJCSAgICAoKG1lc3NhZ2Vfb3V0IDwgMHgyMCkgfHwgKG1lc3NhZ2Vfb3V0ICYgMHg4MCkpKSkKKwkJCWVzcC0+bXNnb3V0X2xlbiA9IDE7CisJCWVzcC0+Y3VyX21zZ291dFswXSA9IG1lc3NhZ2Vfb3V0OworCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfU0FUTik7CisJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJCWVzcC0+bXNnaW5fbGVuID0gMDsKKwl9CisJZXNwLT5zcmVnID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9zdGF0dXMpOworCWVzcC0+c3JlZyAmPSB+KEVTUF9TVEFUX0lOVFIpOworCWlmKChlc3AtPnNyZWcgJiAoRVNQX1NUQVRfUE1TR3xFU1BfU1RBVF9QQ0QpKSA9PSAoRVNQX1NUQVRfUE1TR3xFU1BfU1RBVF9QQ0QpKQorCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfTU9LKTsKKwlpZigoU0NwdHItPlNDcC5zZW50X2NvbW1hbmQgPT0gaW5fbXNnaW5kb25lKSAmJgorCSAgICAoU0NwdHItPlNDcC5waGFzZSA9PSBpbl9mcmVlaW5nKSkKKwkJcmV0dXJuIGVzcF9kb19mcmVlYnVzKGVzcCwgZXJlZ3MpOworCXJldHVybiBkb19pbnRyX2VuZDsKK30KKworc3RhdGljIGludCBlc3BfZG9fY21kYmVnaW4oc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncykKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwlTY3NpX0NtbmQgKlNDcHRyID0gZXNwLT5jdXJyZW50X1NDOworCisJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX2NtZGVuZCk7CisJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX0ZMVVNIKTsKKwl0bXAgPSAqZXNwLT5lc3Bfc2NtZHArKzsKKwllc3AtPmVzcF9zY21kbGVmdC0tOworCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCB0bXApOworCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9USSk7CisJcmV0dXJuIGRvX2ludHJfZW5kOworfQorCitzdGF0aWMgaW50IGVzcF9kb19jbWRkb25lKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX05VTEwpOworCWlmKGVzcC0+aXJlZyAmIEVTUF9JTlRSX0JTRVJWKSB7CisJCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fdGhlX2RhcmspOworCQlyZXR1cm4gZXNwX2RvX3BoYXNlX2RldGVybWluZShlc3AsIGVyZWdzKTsKKwl9CisJRVNQTE9HKCgiZXNwJWQ6IGluIGRvX2NtZGRvbmUoKSBidXQgZGlkbid0IGdldCBCU0VSViBpbnRlcnJ1cHQuXG4iLAorCQllc3AtPmVzcF9pZCkpOworCXJldHVybiBkb19yZXNldF9idXM7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2RvX21zZ291dChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9GTFVTSCk7CisJc3dpdGNoKGVzcC0+bXNnb3V0X2xlbikgeworCWNhc2UgMToKKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfZmRhdGEsIGVzcC0+Y3VyX21zZ291dFswXSk7CisJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9USSk7CisJCWJyZWFrOworCisJY2FzZSAyOgorCQlpZihlc3AtPmRvX3Bpb19jbWRzKXsKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBlc3AtPmN1cl9tc2dvdXRbMF0pOworCQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfZmRhdGEsIGVzcC0+Y3VyX21zZ291dFsxXSk7CisJCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfVEkpOworCQl9IGVsc2UgeworCQkJZXNwLT5lc3BfY29tbWFuZFswXSA9IGVzcC0+Y3VyX21zZ291dFswXTsKKwkJCWVzcC0+ZXNwX2NvbW1hbmRbMV0gPSBlc3AtPmN1cl9tc2dvdXRbMV07CisJCQllc3AtPmRtYV9zZXR1cChlc3AsIGVzcC0+ZXNwX2NvbW1hbmRfZHZtYSwgMiwgMCk7CisJCQllc3Bfc2V0Y291bnQoZXJlZ3MsIDIpOworCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX0RNQSB8IEVTUF9DTURfVEkpOworCQl9CisJCWJyZWFrOworCisJY2FzZSA0OgorCQllc3AtPnNuaXAgPSAxOworCQlpZihlc3AtPmRvX3Bpb19jbWRzKXsKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBlc3AtPmN1cl9tc2dvdXRbMF0pOworCQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfZmRhdGEsIGVzcC0+Y3VyX21zZ291dFsxXSk7CisJCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9mZGF0YSwgZXNwLT5jdXJfbXNnb3V0WzJdKTsKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBlc3AtPmN1cl9tc2dvdXRbM10pOworCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1RJKTsKKwkJfSBlbHNlIHsKKwkJCWVzcC0+ZXNwX2NvbW1hbmRbMF0gPSBlc3AtPmN1cl9tc2dvdXRbMF07CisJCQllc3AtPmVzcF9jb21tYW5kWzFdID0gZXNwLT5jdXJfbXNnb3V0WzFdOworCQkJZXNwLT5lc3BfY29tbWFuZFsyXSA9IGVzcC0+Y3VyX21zZ291dFsyXTsKKwkJCWVzcC0+ZXNwX2NvbW1hbmRbM10gPSBlc3AtPmN1cl9tc2dvdXRbM107CisJCQllc3AtPmRtYV9zZXR1cChlc3AsIGVzcC0+ZXNwX2NvbW1hbmRfZHZtYSwgNCwgMCk7CisJCQllc3Bfc2V0Y291bnQoZXJlZ3MsIDQpOworCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX0RNQSB8IEVTUF9DTURfVEkpOworCQl9CisJCWJyZWFrOworCisJY2FzZSA1OgorCQllc3AtPnNuaXAgPSAxOworCQlpZihlc3AtPmRvX3Bpb19jbWRzKXsKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBlc3AtPmN1cl9tc2dvdXRbMF0pOworCQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfZmRhdGEsIGVzcC0+Y3VyX21zZ291dFsxXSk7CisJCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9mZGF0YSwgZXNwLT5jdXJfbXNnb3V0WzJdKTsKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBlc3AtPmN1cl9tc2dvdXRbM10pOworCQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfZmRhdGEsIGVzcC0+Y3VyX21zZ291dFs0XSk7CisJCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfVEkpOworCQl9IGVsc2UgeworCQkJZXNwLT5lc3BfY29tbWFuZFswXSA9IGVzcC0+Y3VyX21zZ291dFswXTsKKwkJCWVzcC0+ZXNwX2NvbW1hbmRbMV0gPSBlc3AtPmN1cl9tc2dvdXRbMV07CisJCQllc3AtPmVzcF9jb21tYW5kWzJdID0gZXNwLT5jdXJfbXNnb3V0WzJdOworCQkJZXNwLT5lc3BfY29tbWFuZFszXSA9IGVzcC0+Y3VyX21zZ291dFszXTsKKwkJCWVzcC0+ZXNwX2NvbW1hbmRbNF0gPSBlc3AtPmN1cl9tc2dvdXRbNF07CisJCQllc3AtPmRtYV9zZXR1cChlc3AsIGVzcC0+ZXNwX2NvbW1hbmRfZHZtYSwgNSwgMCk7CisJCQllc3Bfc2V0Y291bnQoZXJlZ3MsIDUpOworCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX0RNQSB8IEVTUF9DTURfVEkpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogd2hvb3BzICovCisJCUVTUE1JU0MoKCJib2d1cyBtc2dvdXQgc2VuZGluZyBOT1BcbiIpKTsKKwkJZXNwLT5jdXJfbXNnb3V0WzBdID0gTk9QOworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9mZGF0YSwgZXNwLT5jdXJfbXNnb3V0WzBdKTsKKwkJZXNwLT5tc2dvdXRfbGVuID0gMTsKKwkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1RJKTsKKwkJYnJlYWs7CisJfQorCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fbXNnb3V0ZG9uZSk7CisJcmV0dXJuIGRvX2ludHJfZW5kOworfQorCitzdGF0aWMgaW50IGVzcF9kb19tc2dvdXRkb25lKHN0cnVjdCBOQ1JfRVNQICplc3AsIAorCQkJICAgICBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCWlmKChlc3AtPm1zZ291dF9sZW4gPiAxKSAmJiBlc3AtPmRtYV9iYXJyaWVyKQorCQllc3AtPmRtYV9iYXJyaWVyKGVzcCk7CisKKwlpZighKGVzcC0+aXJlZyAmIEVTUF9JTlRSX0RDKSkgeworCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfTlVMTCk7CisJCXN3aXRjaChlc3AtPnNyZWcgJiBFU1BfU1RBVF9QTUFTSykgeworCQljYXNlIEVTUF9NT1A6CisJCQkvKiB3aG9vcHMsIHBhcml0eSBlcnJvciAqLworCQkJRVNQTE9HKCgiZXNwJWQ6IHN0aWxsIGluIG1zZ291dCwgcGFyaXR5IGVycm9yIGFzc3VtZWRcbiIsCisJCQkJZXNwLT5lc3BfaWQpKTsKKwkJCWlmKGVzcC0+bXNnb3V0X2xlbiA+IDEpCisJCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1NBVE4pOworCQkJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9tc2dvdXQpOworCQkJcmV0dXJuIGRvX3dvcmtfYnVzOworCisJCWNhc2UgRVNQX0RJUDoKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpZighZmNvdW50KGVzcCwgZXJlZ3MpICYmCisJCQkgICAhKCgoc3RydWN0IGVzcF9kZXZpY2UgKillc3AtPmN1cnJlbnRfU0MtPmRldmljZS0+aG9zdGRhdGEpLT5zeW5jX21heF9vZmZzZXQpKQorCQkJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9GTFVTSCk7CisJCQlicmVhazsKKworCQl9OworCX0KKworCS8qIElmIHdlIHNlbnQgb3V0IGEgc3luY2hyb25vdXMgbmVnb3RpYXRpb24gbWVzc2FnZSwgdXBkYXRlCisJICogb3VyIHN0YXRlLgorCSAqLworCWlmKGVzcC0+Y3VyX21zZ291dFsyXSA9PSBFWFRFTkRFRF9NRVNTQUdFICYmCisJICAgZXNwLT5jdXJfbXNnb3V0WzRdID09IEVYVEVOREVEX1NEVFIpIHsKKwkJZXNwLT5zbmlwID0gMTsgLyogYW5hbCByZXRlbnRpdmVuZXNzLi4uICovCisJfQorCisJZXNwLT5wcmV2bXNnb3V0ID0gZXNwLT5jdXJfbXNnb3V0WzBdOworCWVzcC0+bXNnb3V0X2xlbiA9IDA7CisJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl90aGVfZGFyayk7CisJcmV0dXJuIGVzcF9kb19waGFzZV9kZXRlcm1pbmUoZXNwLCBlcmVncyk7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2J1c191bmV4cGVjdGVkKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJRVNQTE9HKCgiZXNwJWQ6IGNvbW1hbmQgaW4gd2VpcmQgc3RhdGUgJTJ4XG4iLAorCQllc3AtPmVzcF9pZCwgZXNwLT5jdXJyZW50X1NDLT5TQ3AucGhhc2UpKTsKKwlyZXR1cm4gZG9fcmVzZXRfYnVzOworfQorCitzdGF0aWMgZXNwZnVuY190IGJ1c192ZWN0b3JbXSA9IHsKKwllc3BfZG9fZGF0YV9maW5hbGUsCisJZXNwX2RvX2RhdGFfZmluYWxlLAorCWVzcF9idXNfdW5leHBlY3RlZCwKKwllc3BfZG9fbXNnaW4sCisJZXNwX2RvX21zZ2luY29udCwKKwllc3BfZG9fbXNnaW5kb25lLAorCWVzcF9kb19tc2dvdXQsCisJZXNwX2RvX21zZ291dGRvbmUsCisJZXNwX2RvX2NtZGJlZ2luLAorCWVzcF9kb19jbWRkb25lLAorCWVzcF9kb19zdGF0dXMsCisJZXNwX2RvX2ZyZWVidXMsCisJZXNwX2RvX3BoYXNlX2RldGVybWluZSwKKwllc3BfYnVzX3VuZXhwZWN0ZWQsCisJZXNwX2J1c191bmV4cGVjdGVkLAorCWVzcF9idXNfdW5leHBlY3RlZCwKK307CisKKy8qIFRoaXMgaXMgdGhlIHNlY29uZCB0aWVyIGluIG91ciBkdWFsLWxldmVsIFNDU0kgc3RhdGUgbWFjaGluZS4gKi8KK3N0YXRpYyBpbnQgZXNwX3dvcmtfYnVzKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJU2NzaV9DbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKKwl1bnNpZ25lZCBpbnQgcGhhc2U7CisKKwlFU1BCVVMoKCJlc3Bfd29ya19idXM6ICIpKTsKKwlpZighU0NwdHIpIHsKKwkJRVNQQlVTKCgicmVjb25uZWN0XG4iKSk7CisJCXJldHVybiBlc3BfZG9fcmVjb25uZWN0KGVzcCwgZXJlZ3MpOworCX0KKwlwaGFzZSA9IFNDcHRyLT5TQ3AucGhhc2U7CisJaWYgKChwaGFzZSAmIDB4ZjApID09IGluX3BoYXNlc19tYXNrKQorCQlyZXR1cm4gYnVzX3ZlY3RvclsocGhhc2UgJiAweDBmKV0oZXNwLCBlcmVncyk7CisJZWxzZSBpZigocGhhc2UgJiAweGYwKSA9PSBpbl9zbGN0X21hc2spCisJCXJldHVybiBlc3Bfc2VsZWN0X2NvbXBsZXRlKGVzcCwgZXJlZ3MpOworCWVsc2UKKwkJcmV0dXJuIGVzcF9idXNfdW5leHBlY3RlZChlc3AsIGVyZWdzKTsKK30KKworc3RhdGljIGVzcGZ1bmNfdCBpc3ZjX3ZlY3RvcltdID0geworCU5VTEwsCisJZXNwX2RvX3BoYXNlX2RldGVybWluZSwKKwllc3BfZG9fcmVzZXRidXMsCisJZXNwX2ZpbmlzaF9yZXNldCwKKwllc3Bfd29ya19idXMKK307CisKKy8qIE1haW4gaW50ZXJydXB0IGhhbmRsZXIgZm9yIGFuIGVzcCBhZGFwdGVyLiAqLwordm9pZCBlc3BfaGFuZGxlKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJc3RydWN0IEVTUF9yZWdzICplcmVnczsKKwlTY3NpX0NtbmQgKlNDcHRyOworCWludCB3aGF0X25leHQgPSBkb19pbnRyX2VuZDsKKwllcmVncyA9IGVzcC0+ZXJlZ3M7CisJU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7CisKKwlpZihlc3AtPmRtYV9pcnFfZW50cnkpCisJCWVzcC0+ZG1hX2lycV9lbnRyeShlc3ApOworCisJLyogQ2hlY2sgZm9yIGVycm9ycy4gKi8KKwllc3AtPnNyZWcgPSBlc3BfcmVhZChlcmVncy0+ZXNwX3N0YXR1cyk7CisJZXNwLT5zcmVnICY9ICh+RVNQX1NUQVRfSU5UUik7CisJZXNwLT5zZXFyZWcgPSAoZXNwX3JlYWQoZXJlZ3MtPmVzcF9zc3RlcCkgJiBFU1BfU1RFUF9WQklUUyk7CisJZXNwLT5pcmVnID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9pbnRycHQpOyAgIC8qIFVubGF0Y2ggaW50ciBhbmQgc3RhdCByZWdzICovCisJRVNQSVJRKCgiaGFuZGxlX2lycTogW3NyZWc8JTAyeD4gc3N0ZXA8JTAyeD4gaXJlZzwlMDJ4Pl1cbiIsCisJCWVzcC0+c3JlZywgZXNwLT5zZXFyZWcsIGVzcC0+aXJlZykpOworCWlmKGVzcC0+c3JlZyAmIChFU1BfU1RBVF9TUEFNKSkgeworCQkvKiBHcm9zcyBlcnJvciwgY291bGQgYmUgZHVlIHRvIG9uZSBvZjoKKwkJICoKKwkJICogLSB0b3Agb2YgZmlmbyBvdmVyd3JpdHRlbiwgY291bGQgYmUgYmVjYXVzZQorCQkgKiAgIHdlIHRyaWVkIHRvIGRvIGEgc3luY2hyb25vdXMgdHJhbnNmZXIgd2l0aAorCQkgKiAgIGFuIG9mZnNldCBncmVhdGVyIHRoYW4gRVNQIGZpZm8gc2l6ZQorCQkgKgorCQkgKiAtIHRvcCBvZiBjb21tYW5kIHJlZ2lzdGVyIG92ZXJ3cml0dGVuCisJCSAqCisJCSAqIC0gRE1BIHNldHVwIHRvIGdvIGluIG9uZSBkaXJlY3Rpb24sIFNDU0kKKwkJICogICBidXMgcG9pbnRzIGluIHRoZSBvdGhlciwgd2hvb3BzCisJCSAqCisJCSAqIC0gd2VpcmQgcGhhc2UgY2hhbmdlIGR1cmluZyBhc3luY2hyb25vdXMKKwkJICogICBkYXRhIHBoYXNlIHdoaWxlIHdlIGFyZSBpbml0aWF0b3IKKwkJICovCisJCUVTUExPRygoImVzcCVkOiBHcm9zcyBlcnJvciBzcmVnPSUyeFxuIiwgZXNwLT5lc3BfaWQsIGVzcC0+c3JlZykpOworCisJCS8qIElmIGEgY29tbWFuZCBpcyBsaXZlIG9uIHRoZSBidXMgd2UgY2Fubm90IHNhZmVseQorCQkgKiByZXNldCB0aGUgYnVzLCBzbyB3ZSdsbCBqdXN0IGxldCB0aGUgcGllY2VzIGZhbGwKKwkJICogd2hlcmUgdGhleSBtYXkuICBIZXJlIHdlIGFyZSBob3BpbmcgdGhhdCB0aGUKKwkJICogdGFyZ2V0IHdpbGwgYmUgYWJsZSB0byBjbGVhbmx5IGdvIGF3YXkgc29vbgorCQkgKiBzbyB3ZSBjYW4gc2FmZWx5IHJlc2V0IHRoaW5ncy4KKwkJICovCisJCWlmKCFTQ3B0cikgeworCQkJRVNQTE9HKCgiZXNwJWQ6IE5vIGN1cnJlbnQgY21kIGR1cmluZyBncm9zcyBlcnJvciwgIgorCQkJCSJyZXNldHRpbmcgYnVzXG4iLCBlc3AtPmVzcF9pZCkpOworCQkJd2hhdF9uZXh0ID0gZG9fcmVzZXRfYnVzOworCQkJZ290byBzdGF0ZV9tYWNoaW5lOworCQl9CisJfQorCisJLyogTm8gY3VycmVudCBjbWQgaXMgb25seSB2YWxpZCBhdCB0aGlzIHBvaW50IHdoZW4gdGhlcmUgYXJlCisJICogY29tbWFuZHMgb2ZmIHRoZSBidXMgb3Igd2UgYXJlIHRyeWluZyBhIHJlc2V0LgorCSAqLworCWlmKCFTQ3B0ciAmJiAhZXNwLT5kaXNjb25uZWN0ZWRfU0MgJiYgIShlc3AtPmlyZWcgJiBFU1BfSU5UUl9TUikpIHsKKwkJLyogUGFuaWMgaXMgc2FmZSwgc2luY2UgY3VycmVudF9TQyBpcyBudWxsLiAqLworCQlFU1BMT0coKCJlc3AlZDogbm8gY29tbWFuZCBpbiBlc3BfaGFuZGxlKClcbiIsIGVzcC0+ZXNwX2lkKSk7CisJCXBhbmljKCJlc3BfaGFuZGxlOiBjdXJyZW50X1NDID09IHBlbmd1aW4gd2l0aGluIGludGVycnVwdCEiKTsKKwl9CisKKwlpZihlc3AtPmlyZWcgJiAoRVNQX0lOVFJfSUMpKSB7CisJCS8qIElsbGVnYWwgY29tbWFuZCBmZWQgdG8gRVNQLiAgT3V0c2lkZSBvZiBvYnZpb3VzCisJCSAqIHNvZnR3YXJlIGJ1Z3MgdGhhdCBjb3VsZCBjYXVzZSB0aGlzLCB0aGVyZSBpcworCQkgKiBhIGNvbmRpdGlvbiB3aXRoIEVTUDEwMCB3aGVyZSB3ZSBjYW4gY29uZnVzZSB0aGUKKwkJICogRVNQIGludG8gYW4gZXJyb25lb3VzIGlsbGVnYWwgY29tbWFuZCBpbnRlcnJ1cHQKKwkJICogYmVjYXVzZSBpdCBkb2VzIG5vdCBzY3JhcGUgdGhlIEZJRk8gcHJvcGVybHkKKwkJICogZm9yIHJlc2VsZWN0aW9uLiAgU2VlIGVzcDEwMF9yZWNvbm5lY3RfaHdidWcoKQorCQkgKiB0byBzZWUgaG93IHdlIHRyeSB2ZXJ5IGhhcmQgdG8gYXZvaWQgdGhpcy4KKwkJICovCisJCUVTUExPRygoImVzcCVkOiBpbnZhbGlkIGNvbW1hbmRcbiIsIGVzcC0+ZXNwX2lkKSk7CisKKwkJZXNwX2R1bXBfc3RhdGUoZXNwLCBlcmVncyk7CisKKwkJaWYoU0NwdHIpIHsKKwkJCS8qIERldmljZXMgd2l0aCB2ZXJ5IGJ1Z2d5IGZpcm13YXJlIGNhbiBkcm9wIEJTWQorCQkJICogZHVyaW5nIGEgc2NhdHRlciBsaXN0IGludGVycnVwdCB3aGVuIHVzaW5nIHN5bmMKKwkJCSAqIG1vZGUgdHJhbnNmZXJzLiAgV2UgY29udGludWUgdGhlIHRyYW5zZmVyIGFzCisJCQkgKiBleHBlY3RlZCwgdGhlIHRhcmdldCBkcm9wcyB0aGUgYnVzLCB0aGUgRVNQCisJCQkgKiBnZXRzIGNvbmZ1c2VkLCBhbmQgd2UgZ2V0IGEgaWxsZWdhbCBjb21tYW5kCisJCQkgKiBpbnRlcnJ1cHQgYmVjYXVzZSB0aGUgYnVzIGlzIGluIHRoZSBkaXNjb25uZWN0ZWQKKwkJCSAqIHN0YXRlIG5vdyBhbmQgRVNQX0NNRF9USSBpcyBvbmx5IGFsbG93ZWQgd2hlbgorCQkJICogYSBuZXh1cyBpcyBhbGl2ZSBvbiB0aGUgYnVzLgorCQkJICovCisJCQlFU1BMT0coKCJlc3AlZDogRm9yY2luZyBhc3luYyBhbmQgZGlzYWJsaW5nIGRpc2Nvbm5lY3QgZm9yICIKKwkJCQkidGFyZ2V0ICVkXG4iLCBlc3AtPmVzcF9pZCwgU0NwdHItPmRldmljZS0+aWQpKTsKKwkJCVNDcHRyLT5kZXZpY2UtPmJvcmtlbiA9IDE7IC8qIGZvbyBvbiB5b3UgKi8KKwkJfQorCisJCXdoYXRfbmV4dCA9IGRvX3Jlc2V0X2J1czsKKwl9IGVsc2UgaWYoIShlc3AtPmlyZWcgJiB+KEVTUF9JTlRSX0ZET05FIHwgRVNQX0lOVFJfQlNFUlYgfCBFU1BfSU5UUl9EQykpKSB7CisJCWludCBwaGFzZTsKKworCQlpZihTQ3B0cikgeworCQkJcGhhc2UgPSBTQ3B0ci0+U0NwLnBoYXNlOworCQkJaWYocGhhc2UgJiBpbl9waGFzZXNfbWFzaykgeworCQkJCXdoYXRfbmV4dCA9IGVzcF93b3JrX2J1cyhlc3AsIGVyZWdzKTsKKwkJCX0gZWxzZSBpZihwaGFzZSAmIGluX3NsY3RfbWFzaykgeworCQkJCXdoYXRfbmV4dCA9IGVzcF9zZWxlY3RfY29tcGxldGUoZXNwLCBlcmVncyk7CisJCQl9IGVsc2UgeworCQkJCUVTUExPRygoImVzcCVkOiBpbnRlcnJ1cHQgZm9yIG5vIGdvb2QgcmVhc29uLi4uXG4iLAorCQkJCQllc3AtPmVzcF9pZCkpOworCQkJCXdoYXRfbmV4dCA9IGRvX2ludHJfZW5kOworCQkJfQorCQl9IGVsc2UgeworCQkJRVNQTE9HKCgiZXNwJWQ6IEJTRVJWIG9yIEZET05FIG9yIERDIHdoaWxlIFNDcHRyPT1OVUxMXG4iLAorCQkJCWVzcC0+ZXNwX2lkKSk7CisJCQl3aGF0X25leHQgPSBkb19yZXNldF9idXM7CisJCX0KKwl9IGVsc2UgaWYoZXNwLT5pcmVnICYgRVNQX0lOVFJfU1IpIHsKKwkJRVNQTE9HKCgiZXNwJWQ6IFNDU0kgYnVzIHJlc2V0IGludGVycnVwdFxuIiwgZXNwLT5lc3BfaWQpKTsKKwkJd2hhdF9uZXh0ID0gZG9fcmVzZXRfY29tcGxldGU7CisJfSBlbHNlIGlmKGVzcC0+aXJlZyAmIChFU1BfSU5UUl9TIHwgRVNQX0lOVFJfU0FUTikpIHsKKwkJRVNQTE9HKCgiZXNwJWQ6IEFJRUVFIHdlIGhhdmUgYmVlbiBzZWxlY3RlZCBieSBhbm90aGVyIGluaXRpYXRvciFcbiIsCisJCQllc3AtPmVzcF9pZCkpOworCQl3aGF0X25leHQgPSBkb19yZXNldF9idXM7CisJfSBlbHNlIGlmKGVzcC0+aXJlZyAmIEVTUF9JTlRSX1JTRUwpIHsKKwkJaWYoIVNDcHRyKSB7CisJCQkvKiBUaGlzIGlzIG9rLiAqLworCQkJd2hhdF9uZXh0ID0gZXNwX2RvX3JlY29ubmVjdChlc3AsIGVyZWdzKTsKKwkJfSBlbHNlIGlmKFNDcHRyLT5TQ3AucGhhc2UgJiBpbl9zbGN0X21hc2spIHsKKwkJCS8qIE9ubHkgc2VsZWN0aW9uIGNvZGUga25vd3MgaG93IHRvIGNsZWFuCisJCQkgKiB1cCBwcm9wZXJseS4KKwkJCSAqLworCQkJRVNQRElTQygoIlJlc2VsZWN0ZWQgZHVyaW5nIHNlbGVjdGlvbiBhdHRlbXB0XG4iKSk7CisJCQl3aGF0X25leHQgPSBlc3Bfc2VsZWN0X2NvbXBsZXRlKGVzcCwgZXJlZ3MpOworCQl9IGVsc2UgeworCQkJRVNQTE9HKCgiZXNwJWQ6IFJlc2VsZWN0ZWQgd2hpbGUgYnVzIGlzIGJ1c3lcbiIsCisJCQkJZXNwLT5lc3BfaWQpKTsKKwkJCXdoYXRfbmV4dCA9IGRvX3Jlc2V0X2J1czsKKwkJfQorCX0KKworCS8qIFRoaXMgaXMgdGllci1vbmUgaW4gb3VyIGR1YWwgbGV2ZWwgU0NTSSBzdGF0ZSBtYWNoaW5lLiAqLworc3RhdGVfbWFjaGluZToKKwl3aGlsZSh3aGF0X25leHQgIT0gZG9faW50cl9lbmQpIHsKKwkJaWYgKHdoYXRfbmV4dCA+PSBkb19waGFzZV9kZXRlcm1pbmUgJiYKKwkJICAgIHdoYXRfbmV4dCA8IGRvX2ludHJfZW5kKQorCQkJd2hhdF9uZXh0ID0gaXN2Y192ZWN0b3Jbd2hhdF9uZXh0XShlc3AsIGVyZWdzKTsKKwkJZWxzZSB7CisJCQkvKiBzdGF0ZSBpcyBjb21wbGV0ZWx5IGxvc3QgOy0oICovCisJCQlFU1BMT0coKCJlc3AlZDogaW50ZXJydXB0IGVuZ2luZSBsb3NlcyBzdGF0ZSwgcmVzZXR0aW5nIGJ1c1xuIiwKKwkJCQllc3AtPmVzcF9pZCkpOworCQkJd2hhdF9uZXh0ID0gZG9fcmVzZXRfYnVzOworCQl9CisJfQorCWlmKGVzcC0+ZG1hX2lycV9leGl0KQorCQllc3AtPmRtYV9pcnFfZXhpdChlc3ApOworfQorCisjaWZuZGVmIENPTkZJR19TTVAKK2lycXJldHVybl90IGVzcF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnByZWdzKQoreworCXN0cnVjdCBOQ1JfRVNQICplc3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgYWdhaW47CisJc3RydWN0IFNjc2lfSG9zdCAqZGV2ID0gZGV2X2lkOworCisJLyogSGFuZGxlIGFsbCBFU1AgaW50ZXJydXB0cyBzaG93aW5nIGF0IHRoaXMgSVJRIGxldmVsLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CityZXBlYXQ6CisJYWdhaW4gPSAwOworCWZvcl9lYWNoX2VzcChlc3ApIHsKKyNpZm5kZWYgX19taXBzX18JICAgIAorCQlpZigoKGVzcCktPmlycSAmIDB4ZmYpID09IGlycSkgeworI2VuZGlmCQkgICAgCisJCQlpZihlc3AtPmRtYV9pcnFfcChlc3ApKSB7CisJCQkJYWdhaW4gPSAxOworCisJCQkJZXNwLT5kbWFfaW50c19vZmYoZXNwKTsKKworCQkJCUVTUElSUSgoIkklZCgiLCBlc3AtPmVzcF9pZCkpOworCQkJCWVzcF9oYW5kbGUoZXNwKTsKKwkJCQlFU1BJUlEoKCIpIikpOworCisJCQkJZXNwLT5kbWFfaW50c19vbihlc3ApOworCQkJfQorI2lmbmRlZiBfX21pcHNfXwkJICAgIAorCQl9CisjZW5kaWYJICAgIAorCX0KKwlpZihhZ2FpbikKKwkJZ290byByZXBlYXQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKyNlbHNlCisvKiBGb3IgU01QIHdlIG9ubHkgc2VydmljZSBvbmUgRVNQIG9uIHRoZSBsaXN0IGxpc3QgYXQgb3VyIElSUSBsZXZlbCEgKi8KK2lycXJldHVybl90IGVzcF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnByZWdzKQoreworCXN0cnVjdCBOQ1JfRVNQICplc3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpkZXYgPSBkZXZfaWQ7CisJCisJLyogSGFuZGxlIGFsbCBFU1AgaW50ZXJydXB0cyBzaG93aW5nIGF0IHRoaXMgSVJRIGxldmVsLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJZm9yX2VhY2hfZXNwKGVzcCkgeworCQlpZigoKGVzcCktPmlycSAmIDB4ZikgPT0gaXJxKSB7CisJCQlpZihlc3AtPmRtYV9pcnFfcChlc3ApKSB7CisJCQkJZXNwLT5kbWFfaW50c19vZmYoZXNwKTsKKworCQkJCUVTUElSUSgoIklbJWQ6JWRdKCIsCisJCQkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgZXNwLT5lc3BfaWQpKTsKKwkJCQllc3BfaGFuZGxlKGVzcCk7CisJCQkJRVNQSVJRKCgiKSIpKTsKKworCQkJCWVzcC0+ZG1hX2ludHNfb24oZXNwKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorI2VuZGlmCisKK2ludCBlc3Bfc2xhdmVfYWxsb2MoU2NzaV9EZXZpY2UgKlNEcHRyKQoreworCXN0cnVjdCBlc3BfZGV2aWNlICplc3BfZGV2ID0KKwkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGVzcF9kZXZpY2UpLCBHRlBfQVRPTUlDKTsKKworCWlmICghZXNwX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGVzcF9kZXYsIDAsIHNpemVvZihzdHJ1Y3QgZXNwX2RldmljZSkpOworCVNEcHRyLT5ob3N0ZGF0YSA9IGVzcF9kZXY7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZXNwX3NsYXZlX2Rlc3Ryb3koU2NzaV9EZXZpY2UgKlNEcHRyKQoreworCXN0cnVjdCBOQ1JfRVNQICplc3AgPSAoc3RydWN0IE5DUl9FU1AgKikgU0RwdHItPmhvc3QtPmhvc3RkYXRhOworCisJZXNwLT50YXJnZXRzX3ByZXNlbnQgJj0gfigxIDw8IFNEcHRyLT5pZCk7CisJa2ZyZWUoU0RwdHItPmhvc3RkYXRhKTsKKwlTRHB0ci0+aG9zdGRhdGEgPSBOVUxMOworfQorCisjaWZkZWYgTU9EVUxFCitpbnQgaW5pdF9tb2R1bGUodm9pZCkgeyByZXR1cm4gMDsgfQordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKSB7fQordm9pZCBlc3BfcmVsZWFzZSh2b2lkKQoreworCWVzcHNfaW5fdXNlLS07CisJZXNwc19ydW5uaW5nID0gZXNwc19pbl91c2U7Cit9CisjZW5kaWYKKworRVhQT1JUX1NZTUJPTChlc3BfYWJvcnQpOworRVhQT1JUX1NZTUJPTChlc3BfYWxsb2NhdGUpOworRVhQT1JUX1NZTUJPTChlc3BfZGVhbGxvY2F0ZSk7CitFWFBPUlRfU1lNQk9MKGVzcF9pbml0aWFsaXplKTsKK0VYUE9SVF9TWU1CT0woZXNwX2ludHIpOworRVhQT1JUX1NZTUJPTChlc3BfcXVldWUpOworRVhQT1JUX1NZTUJPTChlc3BfcmVzZXQpOworRVhQT1JUX1NZTUJPTChlc3Bfc2xhdmVfYWxsb2MpOworRVhQT1JUX1NZTUJPTChlc3Bfc2xhdmVfZGVzdHJveSk7CitFWFBPUlRfU1lNQk9MKGVzcHNfaW5fdXNlKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL05DUjUzQzl4LmggYi9kcml2ZXJzL3Njc2kvTkNSNTNDOXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmU3ZWRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL05DUjUzQzl4LmgKQEAgLTAsMCArMSw2NjkgQEAKKy8qIE5DUjUzQzl4LmM6ICBEZWZpbmVzIGFuZCBzdHJ1Y3R1cmVzIGZvciB0aGUgTkNSNTNDOXggZ2VuZXJpYyBkcml2ZXIuCisgKgorICogT3JpZ2luYWx5IGVzcC5oOiAgRGVmaW5lcyBhbmQgc3RydWN0dXJlcyBmb3IgdGhlIFNwYXJjIEVTUCAKKyAqICAgICAgICAgICAgICAgICAgIChFbmhhbmNlZCBTQ1NJIFByb2Nlc3NvcikgZHJpdmVyIHVuZGVyIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCisgKgorICogR2VuZXJhbGl6YXRpb24gYnkgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykKKyAqCisgKiBNb3JlIGdlbmVyYWxpemF0aW9uIChmb3IgaTM4NiBzdHVmZikgYnkgVHltbSBUd2lsbG1hbiAodHltbUBjb21wdXRlci5vcmcpCisgKi8KKworI2lmbmRlZiBOQ1I1M0M5WF9ICisjZGVmaW5lIE5DUjUzQzlYX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisvKiBkandlaXMgZm9yIG1hYyBkcml2ZXIgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19NQUMpCisjZGVmaW5lIFBBRF9TSVpFIDE1CisjZWxzZQorI2RlZmluZSBQQURfU0laRSAzCisjZW5kaWYKKworLyogSGFuZGxlIG11bHRpcGxlIGhvc3RhZGFwdGVycyBvbiBBbWlnYQorICogZ2VuZXJhbGx5IFBBRF9TSVpFID0gMworICogYnV0IHRoZXJlIGlzIG9uZSBleGNlcHRpb246IE9rdGFnb24gKFBBRF9TSVpFID0gMSkgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19PS1RBR09OX1NDU0kpIHx8IGRlZmluZWQoQ09ORklHX09LVEFHT05fU0NTSV9NT0RVTEUpCisjdW5kZWYgUEFEX1NJWkUKKyNpZiBkZWZpbmVkKENPTkZJR19CTFoxMjMwX1NDU0kpIHx8IGRlZmluZWQoQ09ORklHX0JMWjEyMzBfU0NTSV9NT0RVTEUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19CTFoyMDYwX1NDU0kpIHx8IGRlZmluZWQoQ09ORklHX0JMWjIwNjBfU0NTSV9NT0RVTEUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DWUJFUlNUT1JNX1NDU0kpIHx8IGRlZmluZWQoQ09ORklHX0NZQkVSU1RPUk1fU0NTSV9NT0RVTEUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DWUJFUlNUT1JNSUlfU0NTSSkgfHwgZGVmaW5lZChDT05GSUdfQ1lCRVJTVE9STUlJX1NDU0lfTU9EVUxFKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfRkFTVExBTkVfU0NTSSkgfHwgZGVmaW5lZChDT05GSUdfRkFTVExBTkVfU0NTSV9NT0RVTEUpCisjZGVmaW5lIE1VTFRJUExFX1BBRF9TSVpFUworI2Vsc2UKKyNkZWZpbmUgUEFEX1NJWkUgMQorI2VuZGlmCisjZW5kaWYKKworLyogTWFjcm9zIGZvciBkZWJ1Z2dpbmcgbWVzc2FnZXMgKi8KKworI2RlZmluZSBERUJVR19FU1AKKy8qICNkZWZpbmUgREVCVUdfRVNQX0RBVEEgKi8KKy8qICNkZWZpbmUgREVCVUdfRVNQX1FVRVVFICovCisvKiAjZGVmaW5lIERFQlVHX0VTUF9ESVNDT05ORUNUICovCisvKiAjZGVmaW5lIERFQlVHX0VTUF9TVEFUVVMgKi8KKy8qICNkZWZpbmUgREVCVUdfRVNQX1BIQVNFUyAqLworLyogI2RlZmluZSBERUJVR19FU1BfV09SS0JVUyAqLworLyogI2RlZmluZSBERUJVR19TVEFURV9NQUNISU5FICovCisvKiAjZGVmaW5lIERFQlVHX0VTUF9DTURTICovCisvKiAjZGVmaW5lIERFQlVHX0VTUF9JUlFTICovCisvKiAjZGVmaW5lIERFQlVHX1NEVFIgKi8KKy8qICNkZWZpbmUgREVCVUdfRVNQX1NHICovCisKKy8qIFVzZSB0aGUgZm9sbG93aW5nIHRvIHNwcmlua2xlIGRlYnVnZ2luZyBtZXNzYWdlcyBpbiBhIHdheSB3aGljaAorICogc3VpdHMgeW91IGlmIGNvbWJpbmF0aW9ucyBvZiB0aGUgYWJvdmUgYmVjb21lIHRvbyB2ZXJib3NlIHdoZW4KKyAqIHRyeWluZyB0byB0cmFjayBkb3duIGEgc3BlY2lmaWMgcHJvYmxlbS4KKyAqLworLyogI2RlZmluZSBERUJVR19FU1BfTUlTQyAqLworCisjaWYgZGVmaW5lZChERUJVR19FU1ApCisjZGVmaW5lIEVTUExPRyhmb28pICBwcmludGsgZm9vCisjZWxzZQorI2RlZmluZSBFU1BMT0coZm9vKQorI2VuZGlmIC8qIChERUJVR19FU1ApICovCisKKyNpZiBkZWZpbmVkKERFQlVHX0VTUF9EQVRBKQorI2RlZmluZSBFU1BEQVRBKGZvbykgIHByaW50ayBmb28KKyNlbHNlCisjZGVmaW5lIEVTUERBVEEoZm9vKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHX0VTUF9RVUVVRSkKKyNkZWZpbmUgRVNQUVVFVUUoZm9vKSAgcHJpbnRrIGZvbworI2Vsc2UKKyNkZWZpbmUgRVNQUVVFVUUoZm9vKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHX0VTUF9ESVNDT05ORUNUKQorI2RlZmluZSBFU1BESVNDKGZvbykgIHByaW50ayBmb28KKyNlbHNlCisjZGVmaW5lIEVTUERJU0MoZm9vKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHX0VTUF9TVEFUVVMpCisjZGVmaW5lIEVTUFNUQVQoZm9vKSAgcHJpbnRrIGZvbworI2Vsc2UKKyNkZWZpbmUgRVNQU1RBVChmb28pCisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUdfRVNQX1BIQVNFUykKKyNkZWZpbmUgRVNQUEhBU0UoZm9vKSAgcHJpbnRrIGZvbworI2Vsc2UKKyNkZWZpbmUgRVNQUEhBU0UoZm9vKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHX0VTUF9XT1JLQlVTKQorI2RlZmluZSBFU1BCVVMoZm9vKSAgcHJpbnRrIGZvbworI2Vsc2UKKyNkZWZpbmUgRVNQQlVTKGZvbykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChERUJVR19FU1BfSVJRUykKKyNkZWZpbmUgRVNQSVJRKGZvbykgIHByaW50ayBmb28KKyNlbHNlCisjZGVmaW5lIEVTUElSUShmb28pCisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUdfU0RUUikKKyNkZWZpbmUgRVNQU0RUUihmb28pICBwcmludGsgZm9vCisjZWxzZQorI2RlZmluZSBFU1BTRFRSKGZvbykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChERUJVR19FU1BfTUlTQykKKyNkZWZpbmUgRVNQTUlTQyhmb28pICBwcmludGsgZm9vCisjZWxzZQorI2RlZmluZSBFU1BNSVNDKGZvbykKKyNlbmRpZgorCisvKgorICogcGFkZGluZyBmb3IgcmVnaXN0ZXIgc3RydWN0dXJlCisgKi8KKyNpZmRlZiBDT05GSUdfSkFaWl9FU1AKKyNkZWZpbmUgRVJFR1NfUEFEKG4pCisjZWxzZQorI2lmbmRlZiBNVUxUSVBMRV9QQURfU0laRVMKKyNkZWZpbmUgRVJFR1NfUEFEKG4pICAgIHVuY2hhciBuW1BBRF9TSVpFXTsKKyNlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBFU1AgU0NTSSBjb250cm9sbGVycyBoYXZlIHRoZWlyIHJlZ2lzdGVyIHNldHMgaW4gdGhyZWUKKyAqICJjbGFzc2VzIjoKKyAqCisgKiAxKSBSZWdpc3RlcnMgd2hpY2ggYXJlIGJvdGggcmVhZCBhbmQgd3JpdGUuCisgKiAyKSBSZWdpc3RlcnMgd2hpY2ggYXJlIHJlYWQgb25seS4KKyAqIDMpIFJlZ2lzdGVycyB3aGljaCBhcmUgd3JpdGUgb25seS4KKyAqCisgKiBZZXQsIHRoZXkgYWxsIGxpdmUgd2l0aGluIHRoZSBzYW1lIElPIHNwYWNlLgorICovCisKKyNpZiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKKworI2lmbmRlZiBNVUxUSVBMRV9QQURfU0laRVMKKworI2lmZGVmIENPTkZJR19DUFVfSEFTX1dCCisjaW5jbHVkZSA8YXNtL3diZmx1c2guaD4KKyNkZWZpbmUgZXNwX3dyaXRlKF9fcmVnLCBfX3ZhbCkgZG97KF9fcmVnKSA9IChfX3ZhbCk7IHdiZmx1c2goKTt9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBlc3Bfd3JpdGUoX19yZWcsIF9fdmFsKSAoKF9fcmVnKSA9IChfX3ZhbCkpCisjZW5kaWYKKyNkZWZpbmUgZXNwX3JlYWQoX19yZWcpIChfX3JlZykKKworc3RydWN0IEVTUF9yZWdzIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWNjZXNzICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICBPZmZzZXQgKi8KKyAgICB2b2xhdGlsZSB1bmNoYXIgZXNwX3RjbG93OyAgLyogcncgIExvdyBiaXRzIG9mIHRoZSB0cmFuc2ZlciBjb3VudCAweDAwICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJFR1NfUEFEKHRscGFkMSk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF90Y21lZDsgIC8qIHJ3ICBNaWQgYml0cyBvZiB0aGUgdHJhbnNmZXIgY291bnQgMHgwNCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChmZHBhZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9mZGF0YTsgIC8qIHJ3ICBGSUZPIGRhdGEgYml0cyAgICAgICAgICAgICAgICAgMHgwOCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChjYnBhZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9jbW5kOyAgIC8qIHJ3ICBTQ1NJIGNvbW1hbmQgYml0cyAgICAgICAgICAgICAgMHgwYyAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChzdHBhZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9zdGF0dXM7IC8qIHJvICBFU1Agc3RhdHVzIHJlZ2lzdGVyICAgICAgICAgICAgMHgxMCAgICovCisjZGVmaW5lIGVzcF9idXNpZCAgIGVzcF9zdGF0dXMgIC8qIHdvICBCdXMgSUQgZm9yIHNlbGVjdC9yZXNlbGVjdCAgICAgMHgxMCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChpcnFwZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9pbnRycHQ7IC8qIHJvICBLaW5kIG9mIGludGVycnVwdCAgICAgICAgICAgICAgMHgxNCAgICovCisjZGVmaW5lIGVzcF90aW1lbyAgIGVzcF9pbnRycHQgIC8qIHdvICBUaW1lb3V0IHZhbHVlIGZvciBzZWxlY3QvcmVzZWwgMHgxNCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChzc3BhZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9zc3RlcDsgIC8qIHJvICBTZXF1ZW5jZSBzdGVwIHJlZ2lzdGVyICAgICAgICAgMHgxOCAgICovCisjZGVmaW5lIGVzcF9zdHAgICAgIGVzcF9zc3RlcCAgIC8qIHdvICBUcmFuc2ZlciBwZXJpb2QgcGVyIHN5bmMgICAgICAgMHgxOCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChmZnBhZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9mZmxhZ3M7IC8qIHJvICBCaXRzIG9mIGN1cnJlbnQgRklGTyBpbmZvICAgICAgMHgxYyAgICovCisjZGVmaW5lIGVzcF9zb2ZmICAgIGVzcF9mZmxhZ3MgIC8qIHdvICBTeW5jIG9mZnNldCAgICAgICAgICAgICAgICAgICAgMHgxYyAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChjZjFwZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9jZmcxOyAgIC8qIHJ3ICBGaXJzdCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICAgMHgyMCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChjZnBhZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9jZmFjdDsgIC8qIHdvICBDbG9jayBjb252ZXJzaW9uIGZhY3RvciAgICAgICAgMHgyNCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChjdHBhZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9jdGVzdDsgIC8qIHdvICBDaGlwIHRlc3QgcmVnaXN0ZXIgICAgICAgICAgICAgMHgyOCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChjZjJwZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9jZmcyOyAgIC8qIHJ3ICBTZWNvbmQgY29uZmlndXJhdGlvbiByZWdpc3RlciAgMHgyYyAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChjZjNwZCk7CisKKyAgICAvKiBUaGUgZm9sbG93aW5nIGlzIG9ubHkgZm91bmQgb24gdGhlIDUzQzlYIHNlcmllcyBTQ1NJIGNoaXBzICovCisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9jZmczOyAgIC8qIHJ3ICBUaGlyZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICAgMHgzMCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJFR1NfUEFEKGNmNHBkKTsKKyAgICB2b2xhdGlsZSB1bmNoYXIgZXNwX2NmZzQ7ICAgLyogcncgIEZvdXJ0aCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICAweDM0ICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUkVHU19QQUQodGhwZCk7CisgICAgLyogVGhlIGZvbGxvd2luZyBpcyBmb3VuZCBvbiBhbGwgY2hpcHMgZXhjZXB0IHRoZSBOQ1I1M0M5MCAoRVNQMTAwKSAqLworICAgIHZvbGF0aWxlIHVuY2hhciBlc3BfdGNoaTsgICAvKiBydyAgSGlnaCBiaXRzIG9mIHRyYW5zZmVyIGNvdW50ICAgIDB4MzggICovCisjZGVmaW5lIGVzcF91aWQgICAgIGVzcF90Y2hpICAgIC8qIHJvICBVbmlxdWUgSUQgY29kZSAgICAgICAgICAgICAgICAgMHgzOCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJFR1NfUEFEKGZncGFkKTsgICAgCisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9mZ3JuZDsgIC8qIHJ3ICBEYXRhIGJhc2UgZm9yIGZpZm8gICAgICAgICAgICAgMHgzYyAgKi8KK307CisKKyNlbHNlIC8qIE1VTFRJUExFX1BBRF9TSVpFUyAqLworCisjZGVmaW5lIGVzcF93cml0ZShfX3JlZywgX192YWwpICgqKF9fcmVnKSA9IChfX3ZhbCkpCisjZGVmaW5lIGVzcF9yZWFkKF9fcmVnKSAoKihfX3JlZykpCisKK3N0cnVjdCBFU1BfcmVncyB7CisgICAgdW5zaWduZWQgY2hhciBpb19hZGRyWzY0XTsgLyogZHVtbXkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBY2Nlc3MgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgIE9mZnNldCAqLworI2RlZmluZSBlc3BfdGNsb3cgICBpb19hZGRyICAgICAgICAgICAgICAgICAgICAgIC8qIHJ3ICBMb3cgYml0cyBvZiB0aGUgdHJhbnNmZXIgY291bnQgMHgwMCAgICovCisjZGVmaW5lIGVzcF90Y21lZCAgIGlvX2FkZHIgKyAoMTw8KGVzcC0+c2hpZnQpKSAgLyogcncgIE1pZCBiaXRzIG9mIHRoZSB0cmFuc2ZlciBjb3VudCAweDA0ICAgKi8KKyNkZWZpbmUgZXNwX2ZkYXRhICAgaW9fYWRkciArICgyPDwoZXNwLT5zaGlmdCkpICAvKiBydyAgRklGTyBkYXRhIGJpdHMgICAgICAgICAgICAgICAgIDB4MDggICAqLworI2RlZmluZSBlc3BfY21uZCAgICBpb19hZGRyICsgKDM8PChlc3AtPnNoaWZ0KSkgIC8qIHJ3ICBTQ1NJIGNvbW1hbmQgYml0cyAgICAgICAgICAgICAgMHgwYyAgICovCisjZGVmaW5lIGVzcF9zdGF0dXMgIGlvX2FkZHIgKyAoNDw8KGVzcC0+c2hpZnQpKSAgLyogcm8gIEVTUCBzdGF0dXMgcmVnaXN0ZXIgICAgICAgICAgICAweDEwICAgKi8KKyNkZWZpbmUgZXNwX2J1c2lkICAgZXNwX3N0YXR1cyAgICAgICAgICAgICAgICAgICAvKiB3byAgQnVzIElEIGZvciBzZWxlY3QvcmVzZWxlY3QgICAgIDB4MTAgICAqLworI2RlZmluZSBlc3BfaW50cnB0ICBpb19hZGRyICsgKDU8PChlc3AtPnNoaWZ0KSkgIC8qIHJvICBLaW5kIG9mIGludGVycnVwdCAgICAgICAgICAgICAgMHgxNCAgICovCisjZGVmaW5lIGVzcF90aW1lbyAgIGVzcF9pbnRycHQgICAgICAgICAgICAgICAgICAgLyogd28gIFRpbWVvdXQgdmFsdWUgZm9yIHNlbGVjdC9yZXNlbCAweDE0ICAgKi8KKyNkZWZpbmUgZXNwX3NzdGVwICAgaW9fYWRkciArICg2PDwoZXNwLT5zaGlmdCkpICAvKiBybyAgU2VxdWVuY2Ugc3RlcCByZWdpc3RlciAgICAgICAgIDB4MTggICAqLworI2RlZmluZSBlc3Bfc3RwICAgICBlc3Bfc3N0ZXAgICAgICAgICAgICAgICAgICAgIC8qIHdvICBUcmFuc2ZlciBwZXJpb2QgcGVyIHN5bmMgICAgICAgMHgxOCAgICovCisjZGVmaW5lIGVzcF9mZmxhZ3MgIGlvX2FkZHIgKyAoNzw8KGVzcC0+c2hpZnQpKSAgLyogcm8gIEJpdHMgb2YgY3VycmVudCBGSUZPIGluZm8gICAgICAweDFjICAgKi8KKyNkZWZpbmUgZXNwX3NvZmYgICAgZXNwX2ZmbGFncyAgICAgICAgICAgICAgICAgICAvKiB3byAgU3luYyBvZmZzZXQgICAgICAgICAgICAgICAgICAgIDB4MWMgICAqLworI2RlZmluZSBlc3BfY2ZnMSAgICBpb19hZGRyICsgKDg8PChlc3AtPnNoaWZ0KSkgIC8qIHJ3ICBGaXJzdCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICAgMHgyMCAgICovCisjZGVmaW5lIGVzcF9jZmFjdCAgIGlvX2FkZHIgKyAoOTw8KGVzcC0+c2hpZnQpKSAgLyogd28gIENsb2NrIGNvbnZlcnNpb24gZmFjdG9yICAgICAgICAweDI0ICAgKi8KKyNkZWZpbmUgZXNwX2N0ZXN0ICAgaW9fYWRkciArICgxMDw8KGVzcC0+c2hpZnQpKSAvKiB3byAgQ2hpcCB0ZXN0IHJlZ2lzdGVyICAgICAgICAgICAgIDB4MjggICAqLworI2RlZmluZSBlc3BfY2ZnMiAgICBpb19hZGRyICsgKDExPDwoZXNwLT5zaGlmdCkpIC8qIHJ3ICBTZWNvbmQgY29uZmlndXJhdGlvbiByZWdpc3RlciAgMHgyYyAgICovCisKKyAgICAvKiBUaGUgZm9sbG93aW5nIGlzIG9ubHkgZm91bmQgb24gdGhlIDUzQzlYIHNlcmllcyBTQ1NJIGNoaXBzICovCisjZGVmaW5lIGVzcF9jZmczICAgIGlvX2FkZHIgKyAoMTI8PChlc3AtPnNoaWZ0KSkgLyogcncgIFRoaXJkIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgICAweDMwICAqLworI2RlZmluZSBlc3BfY2ZnNCAgICBpb19hZGRyICsgKDEzPDwoZXNwLT5zaGlmdCkpIC8qIHJ3ICBGb3VydGggY29uZmlndXJhdGlvbiByZWdpc3RlciAgMHgzNCAgKi8KKworICAgIC8qIFRoZSBmb2xsb3dpbmcgaXMgZm91bmQgb24gYWxsIGNoaXBzIGV4Y2VwdCB0aGUgTkNSNTNDOTAgKEVTUDEwMCkgKi8KKyNkZWZpbmUgZXNwX3RjaGkgICAgaW9fYWRkciArICgxNDw8KGVzcC0+c2hpZnQpKSAvKiBydyAgSGlnaCBiaXRzIG9mIHRyYW5zZmVyIGNvdW50ICAgIDB4MzggICovCisjZGVmaW5lIGVzcF91aWQgICAgIGVzcF90Y2hpICAgICAgICAgICAgICAgICAgICAgLyogcm8gIFVuaXF1ZSBJRCBjb2RlICAgICAgICAgICAgICAgICAweDM4ICAqLworI2RlZmluZSBlc3BfZmdybmQgICBpb19hZGRyICsgKDE1PDwoZXNwLT5zaGlmdCkpIC8qIHJ3ICBEYXRhIGJhc2UgZm9yIGZpZm8gICAgICAgICAgICAgMHgzYyAgKi8KK307CisKKyNlbmRpZgorCisjZWxzZSAvKiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykgKi8KKworI2RlZmluZSBlc3Bfd3JpdGUoX19yZWcsIF9fdmFsKSBvdXRiKChfX3ZhbCksIChfX3JlZykpCisjZGVmaW5lIGVzcF9yZWFkKF9fcmVnKSBpbmIoKF9fcmVnKSkKKworc3RydWN0IEVTUF9yZWdzIHsKKyAgICB1bnNpZ25lZCBpbnQgaW9fYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjY2VzcyAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgT2Zmc2V0ICovCisjZGVmaW5lIGVzcF90Y2xvdyAgIGlvX2FkZHIgICAgICAvKiBydyAgTG93IGJpdHMgb2YgdGhlIHRyYW5zZmVyIGNvdW50IDB4MDAgICAqLworI2RlZmluZSBlc3BfdGNtZWQgICBpb19hZGRyICsgMSAgLyogcncgIE1pZCBiaXRzIG9mIHRoZSB0cmFuc2ZlciBjb3VudCAweDA0ICAgKi8KKyNkZWZpbmUgZXNwX2ZkYXRhICAgaW9fYWRkciArIDIgIC8qIHJ3ICBGSUZPIGRhdGEgYml0cyAgICAgICAgICAgICAgICAgMHgwOCAgICovCisjZGVmaW5lIGVzcF9jbW5kICAgIGlvX2FkZHIgKyAzICAvKiBydyAgU0NTSSBjb21tYW5kIGJpdHMgICAgICAgICAgICAgIDB4MGMgICAqLworI2RlZmluZSBlc3Bfc3RhdHVzICBpb19hZGRyICsgNCAgLyogcm8gIEVTUCBzdGF0dXMgcmVnaXN0ZXIgICAgICAgICAgICAweDEwICAgKi8KKyNkZWZpbmUgZXNwX2J1c2lkICAgZXNwX3N0YXR1cyAgIC8qIHdvICBCdXMgSUQgZm9yIHNlbGVjdC9yZXNlbGVjdCAgICAgMHgxMCAgICovCisjZGVmaW5lIGVzcF9pbnRycHQgIGlvX2FkZHIgKyA1ICAvKiBybyAgS2luZCBvZiBpbnRlcnJ1cHQgICAgICAgICAgICAgIDB4MTQgICAqLworI2RlZmluZSBlc3BfdGltZW8gICBlc3BfaW50cnB0ICAgLyogd28gIFRpbWVvdXQgdmFsdWUgZm9yIHNlbGVjdC9yZXNlbCAweDE0ICAgKi8KKyNkZWZpbmUgZXNwX3NzdGVwICAgaW9fYWRkciArIDYgIC8qIHJvICBTZXF1ZW5jZSBzdGVwIHJlZ2lzdGVyICAgICAgICAgMHgxOCAgICovCisjZGVmaW5lIGVzcF9zdHAgICAgIGVzcF9zc3RlcCAgICAvKiB3byAgVHJhbnNmZXIgcGVyaW9kIHBlciBzeW5jICAgICAgIDB4MTggICAqLworI2RlZmluZSBlc3BfZmZsYWdzICBpb19hZGRyICsgNyAgLyogcm8gIEJpdHMgb2YgY3VycmVudCBGSUZPIGluZm8gICAgICAweDFjICAgKi8KKyNkZWZpbmUgZXNwX3NvZmYgICAgZXNwX2ZmbGFncyAgIC8qIHdvICBTeW5jIG9mZnNldCAgICAgICAgICAgICAgICAgICAgMHgxYyAgICovCisjZGVmaW5lIGVzcF9jZmcxICAgIGlvX2FkZHIgKyA4ICAvKiBydyAgRmlyc3QgY29uZmlndXJhdGlvbiByZWdpc3RlciAgIDB4MjAgICAqLworI2RlZmluZSBlc3BfY2ZhY3QgICBpb19hZGRyICsgOSAgLyogd28gIENsb2NrIGNvbnZlcnNpb24gZmFjdG9yICAgICAgICAweDI0ICAgKi8KKyNkZWZpbmUgZXNwX2N0ZXN0ICAgaW9fYWRkciArIDEwIC8qIHdvICBDaGlwIHRlc3QgcmVnaXN0ZXIgICAgICAgICAgICAgMHgyOCAgICovCisjZGVmaW5lIGVzcF9jZmcyICAgIGlvX2FkZHIgKyAxMSAvKiBydyAgU2Vjb25kIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgIDB4MmMgICAqLworCisgICAgLyogVGhlIGZvbGxvd2luZyBpcyBvbmx5IGZvdW5kIG9uIHRoZSA1M0M5WCBzZXJpZXMgU0NTSSBjaGlwcyAqLworI2RlZmluZSBlc3BfY2ZnMyAgICBpb19hZGRyICsgMTIgLyogcncgIFRoaXJkIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgICAweDMwICAqLworI2RlZmluZSBlc3BfY2ZnNCAgICBpb19hZGRyICsgMTMgLyogcncgIEZvdXJ0aCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICAweDM0ICAqLworCisgICAgLyogVGhlIGZvbGxvd2luZyBpcyBmb3VuZCBvbiBhbGwgY2hpcHMgZXhjZXB0IHRoZSBOQ1I1M0M5MCAoRVNQMTAwKSAqLworI2RlZmluZSBlc3BfdGNoaSAgICBpb19hZGRyICsgMTQgLyogcncgIEhpZ2ggYml0cyBvZiB0cmFuc2ZlciBjb3VudCAgICAweDM4ICAqLworI2RlZmluZSBlc3BfdWlkICAgICBlc3BfdGNoaSAgICAgLyogcm8gIFVuaXF1ZSBJRCBjb2RlICAgICAgICAgICAgICAgICAweDM4ICAqLworI2RlZmluZSBlc3BfZmdybmQgICBpb19hZGRyICsgMTUgLyogcncgIERhdGEgYmFzZSBmb3IgZmlmbyAgICAgICAgICAgICAweDNjICAqLworfTsKKworI2VuZGlmIC8qICFkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX3g4Nl82NF9fKSAqLworCisvKiBWYXJpb3VzIHJldmlzaW9ucyBvZiB0aGUgRVNQIGJvYXJkLiAqLworZW51bSBlc3BfcmV2IHsKKyAgZXNwMTAwICAgICA9IDB4MDAsICAvKiBOQ1I1M0M5MCAtIHZlcnkgYnJva2VuICovCisgIGVzcDEwMGEgICAgPSAweDAxLCAgLyogTkNSNTNDOTBBICovCisgIGVzcDIzNiAgICAgPSAweDAyLAorICBmYXMyMzYgICAgID0gMHgwMywKKyAgZmFzMTAwYSAgICA9IDB4MDQsCisgIGZhc3QgICAgICAgPSAweDA1LAorICBmYXMzNjYgICAgID0gMHgwNiwKKyAgZmFzMjE2ICAgICA9IDB4MDcsCisgIGZzYyAgICAgICAgPSAweDA4LCAgLyogU1lNNTNDOTQtMiAqLworICBlc3B1bmtub3duID0gMHgwOQorfTsKKworLyogV2UgYWxsb2NhdGUgb25lIG9mIHRoZXNlIGZvciBlYWNoIHNjc2kgZGV2aWNlIGFuZCBhdHRhY2ggaXQgdG8KKyAqIFNEcHRyLT5ob3N0ZGF0YSBmb3IgdXNlIGluIHRoZSBkcml2ZXIKKyAqLworc3RydWN0IGVzcF9kZXZpY2UgeworICB1bnNpZ25lZCBjaGFyIHN5bmNfbWluX3BlcmlvZDsKKyAgdW5zaWduZWQgY2hhciBzeW5jX21heF9vZmZzZXQ7CisgIHVuc2lnbmVkIHN5bmM6MTsKKyAgdW5zaWduZWQgd2lkZToxOworICB1bnNpZ25lZCBkaXNjb25uZWN0OjE7Cit9OworCisvKiBXZSBnZXQgb25lIG9mIHRoZXNlIGZvciBlYWNoIEVTUCBwcm9iZWQuICovCitzdHJ1Y3QgTkNSX0VTUCB7CisgIHN0cnVjdCBOQ1JfRVNQICpuZXh0OyAgICAgICAgICAgICAgICAgICAvKiBOZXh0IEVTUCBvbiBwcm9iZWQgb3IgTlVMTCAqLworICBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzOwkgICAgICAgICAgLyogQWxsIGVzcCByZWdpc3RlcnMgKi8KKyAgaW50IGRtYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdobyBJIGRvIHRyYW5zZmVycyB3aXRoLiAqLworICB2b2lkICpkcmVnczsJCSAgCQkgIC8qIEFuZCBoaXMgcmVnaXN0ZXJzLiAqLworICBzdHJ1Y3QgU2NzaV9Ib3N0ICplaG9zdDsgICAgICAgICAgICAgICAgLyogQmFja3BvaW50ZXIgdG8gU0NTSSBIb3N0ICovCisKKyAgdm9pZCAqZWRldjsgICAgICAgIAkJICAgICAgICAgIC8qIFBvaW50ZXIgdG8gY29udHJvbGxlciBiYXNlL1NCdXMgKi8KKyAgaW50IGVzcF9pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVuaXF1ZSBwZXItRVNQIElEIG51bWJlciAqLworCisgIC8qIEVTUCBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyAqLworICB1bnNpZ25lZCBjaGFyIGNvbmZpZzE7ICAgICAgICAgICAgICAgICAgLyogQ29weSBvZiB0aGUgMXN0IGNvbmZpZyByZWdpc3RlciAqLworICB1bnNpZ25lZCBjaGFyIGNvbmZpZzI7ICAgICAgICAgICAgICAgICAgLyogQ29weSBvZiB0aGUgMm5kIGNvbmZpZyByZWdpc3RlciAqLworICB1bnNpZ25lZCBjaGFyIGNvbmZpZzNbMTZdOyAgICAgICAgICAgICAgLyogQ29weSBvZiB0aGUgM3JkIGNvbmZpZyByZWdpc3RlciAqLworCisgIC8qIFRoZSBjdXJyZW50IGNvbW1hbmQgd2UgYXJlIHNlbmRpbmcgdG8gdGhlIEVTUCBjaGlwLiAgVGhpcyBlc3BfY29tbWFuZAorICAgKiBwdHIgbmVlZHMgdG8gYmUgbWFwcGVkIGluIERWTUEgYXJlYSBzbyB3ZSBjYW4gc2VuZCBjb21tYW5kcyBhbmQgcmVhZAorICAgKiBmcm9tIHRoZSBFU1AgZmlmbyB3aXRob3V0IGJ1cm5pbmcgcHJlY2lvdXMgQ1BVIGN5Y2xlcy4gIFByb2dyYW1tZWQgSS9PCisgICAqIHN1Y2tzIHdoZW4gd2UgaGF2ZSB0aGUgRFZNQSB0byBkbyBpdCBmb3IgdXMuICBUaGUgRVNQIGlzIHN0dXBpZCBhbmQgd2lsbAorICAgKiBvbmx5IHNlbmQgb3V0IDYsIDEwLCBhbmQgMTIgYnl0ZSBTQ1NJIGNvbW1hbmRzLCBvdGhlcnMgd2UgbmVlZCB0byBzZW5kCisgICAqIG9uZSBieXRlIGF0IGEgdGltZS4gIGVzcF9zbG93Y21kIGJlaW5nIHNldCBzYXlzIHRoYXQgd2UgYXJlIGRvaW5nIG9uZQorICAgKiBvZiB0aGUgY29tbWFuZCB0eXBlcyBFU1AgZG9lc24ndCB1bmRlcnN0YW5kLCBlc3Bfc2NtZHAga2VlcHMgdHJhY2sgb2YKKyAgICogd2hpY2ggYnl0ZSB3ZSBhcmUgc2VuZGluZywgZXNwX3NjbWRsZWZ0IHNheXMgaG93IG1hbnkgYnl0ZXMgdG8gZ28uCisgICAqLworICB2b2xhdGlsZSB1bmNoYXIgKmVzcF9jb21tYW5kOyAgICAgICAgICAgLyogTG9jYXRpb24gb2YgY29tbWFuZCAoQ1BVIHZpZXcpICAqLworICBfX3UzMiAgICAgICAgICAgIGVzcF9jb21tYW5kX2R2bWE7ICAgICAgLyogTG9jYXRpb24gb2YgY29tbWFuZCAoRFZNQSB2aWV3KSAqLworICB1bnNpZ25lZCBjaGFyIGVzcF9jbGVuOyAgICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIHRoaXMgY29tbWFuZCAqLworICB1bnNpZ25lZCBjaGFyIGVzcF9zbG93Y21kOworICB1bnNpZ25lZCBjaGFyICplc3Bfc2NtZHA7CisgIHVuc2lnbmVkIGNoYXIgZXNwX3NjbWRsZWZ0OworCisgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjYXVzZSBvZiBhbiBJUlEuIFVwb24gZXZlcnkKKyAgICogSVJRIGVudHJ5IHdlIHN5bmNocm9uaXplIHRoZXNlIHdpdGggdGhlIGhhcmR3YXJlIHJlZ2lzdGVycy4KKyAgICovCisgIHVuY2hhciBpcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IG9mIEVTUCBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKyAgdW5jaGFyIHNyZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbWUgZm9yIEVTUCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyAgdW5jaGFyIHNlcXJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBFU1Agc2VxdWVuY2UgcmVnaXN0ZXIgKi8KKworICAvKiBUaGUgZm9sbG93aW5nIGlzIHNldCB3aGVuIGEgcHJlbWF0dXJlIGludGVycnVwdCBjb25kaXRpb24gaXMgZGV0ZWN0ZWQKKyAgICogaW4gc29tZSBGQVMgcmV2aXNpb25zLgorICAgKi8KKyAgdW5jaGFyIGZhc19wcmVtYXR1cmVfaW50cl93b3JrYXJvdW5kOworCisgIC8qIFRvIHNhdmUgcmVnaXN0ZXIgd3JpdGVzIHRvIHRoZSBFU1AsIHdoaWNoIGNhbiBiZSBleHBlbnNpdmUsIHdlCisgICAqIGtlZXAgdHJhY2sgb2YgdGhlIHByZXZpb3VzIHZhbHVlIHRoYXQgdmFyaW91cyByZWdpc3RlcnMgaGFkIGZvcgorICAgKiB0aGUgbGFzdCB0YXJnZXQgd2UgY29ubmVjdGVkIHRvLiAgSWYgdGhleSBhcmUgdGhlIHNhbWUgZm9yIHRoZQorICAgKiBjdXJyZW50IHRhcmdldCwgd2Ugc2tpcCB0aGUgcmVnaXN0ZXIgd3JpdGVzIGFzIHRoZXkgYXJlIG5vdCBuZWVkZWQuCisgICAqLworICB1bmNoYXIgcHJldl9zb2ZmLCBwcmV2X3N0cCwgcHJldl9jZmczOworCisgIC8qIEZvciBlYWNoIHRhcmdldCB3ZSBrZWVwIHRyYWNrIG9mIHNhdmUvcmVzdG9yZSBkYXRhCisgICAqIHBvaW50ZXIgaW5mb3JtYXRpb24uICBUaGlzIG5lZWRzIHRvIGJlIHVwZGF0ZWQgbWFqb3JseQorICAgKiB3aGVuIHdlIGFkZCBzdXBwb3J0IGZvciB0YWdnZWQgcXVldWVpbmcuICAtRGF2ZU0KKyAgICovCisgIHN0cnVjdCBlc3BfcG9pbnRlcnMgeworCSAgY2hhciAqc2F2ZWRfcHRyOworCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzYXZlZF9idWZmZXI7CisJICBpbnQgc2F2ZWRfdGhpc19yZXNpZHVhbDsKKwkgIGludCBzYXZlZF9idWZmZXJzX3Jlc2lkdWFsOworICB9IGRhdGFfcG9pbnRlcnNbMTZdIC8qWFhYIFtNQVhfVEFHU19QRVJfVEFSR0VUXSovOworCisgIC8qIENsb2NrIHBlcmlvZHMsIGZyZXF1ZW5jaWVzLCBzeW5jaHJvbml6YXRpb24sIGV0Yy4gKi8KKyAgdW5zaWduZWQgaW50IGNmcmVxOyAgICAgICAgICAgICAgICAgICAgLyogQ2xvY2sgZnJlcXVlbmN5IGluIEhaICovCisgIHVuc2lnbmVkIGludCBjZmFjdDsgICAgICAgICAgICAgICAgICAgIC8qIENsb2NrIGNvbnZlcnNpb24gZmFjdG9yICovCisgIHVuc2lnbmVkIGludCBjY3ljbGU7ICAgICAgICAgICAgICAgICAgIC8qIE9uZSBFU1AgY2xvY2sgY3ljbGUgKi8KKyAgdW5zaWduZWQgaW50IGN0aWNrOyAgICAgICAgICAgICAgICAgICAgLyogT25lIEVTUCBjbG9jayB0aW1lICovCisgIHVuc2lnbmVkIGludCByYWRlbGF5OyAgICAgICAgICAgICAgICAgIC8qIEZBU1QgY2hpcCByZXEvYWNrIGRlbGF5ICovCisgIHVuc2lnbmVkIGludCBuZWdfZGVmcDsgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgbmVnb3RpYXRpb24gcGVyaW9kICovCisgIHVuc2lnbmVkIGludCBzeW5jX2RlZnA7ICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgc3luYyB0cmFuc2ZlciBwZXJpb2QgKi8KKyAgdW5zaWduZWQgaW50IG1heF9wZXJpb2Q7ICAgICAgICAgICAgICAgLyogbG9uZ2VzdCBvdXIgcGVyaW9kIGNhbiBiZSAqLworICB1bnNpZ25lZCBpbnQgbWluX3BlcmlvZDsgICAgICAgICAgICAgICAvKiBzaG9ydGVzdCBwZXJpb2Qgd2UgY2FuIHdpdGhzdGFuZCAqLworICAvKiBGb3Igc2xvdyB0byBtZWRpdW0gc3BlZWQgaW5wdXQgY2xvY2sgcmF0ZXMgd2Ugc2hvb3QgZm9yIDVtYi9zLAorICAgKiBidXQgZm9yIGhpZ2ggaW5wdXQgY2xvY2sgcmF0ZXMgd2UgdHJ5IHRvIGRvIDEwbWIvcyBhbHRob3VnaCBJCisgICAqIGRvbid0IHRoaW5rIGEgdHJhbnNmZXIgY2FuIGV2ZW4gcnVuIHRoYXQgZmFzdCB3aXRoIGFuIEVTUCBldmVuCisgICAqIHdpdGggRE1BMiBzY2F0dGVyIGdhdGhlciBwaXBlbGluaW5nLgorICAgKi8KKyNkZWZpbmUgU1lOQ19ERUZQX1NMT1cgICAgICAgICAgICAweDMyICAgLyogNW1iL3MgICovCisjZGVmaW5lIFNZTkNfREVGUF9GQVNUICAgICAgICAgICAgMHgxOSAgIC8qIDEwbWIvcyAqLworCisgIHVuc2lnbmVkIGludCBzbmlwOyAgICAgICAgICAgICAgICAgICAgICAvKiBTeW5jLiBuZWdvdGlhdGlvbiBpbiBwcm9ncmVzcyAqLworICB1bnNpZ25lZCBpbnQgd25pcDsgICAgICAgICAgICAgICAgICAgICAgLyogV0lERSBuZWdvdGlhdGlvbiBpbiBwcm9ncmVzcyAqLworICB1bnNpZ25lZCBpbnQgdGFyZ2V0c19wcmVzZW50OyAgICAgICAgICAgLyogdGFyZ2V0cyBzcG9rZW4gdG8gYmVmb3JlICovCisKKyAgaW50IGN1cnJlbnRfdHJhbnNmZXJfc2l6ZTsgICAgICAgICAgICAgIC8qIFNldCBhdCBiZWdpbm5pbmcgb2YgZGF0YSBkbWEgKi8KKworICB1bmNoYXIgZXNwY21kbG9nWzMyXTsgICAgICAgICAgICAgICAgICAgLyogTG9nIG9mIGN1cnJlbnQgZXNwIGNtZHMgc2VudC4gKi8KKyAgdW5jaGFyIGVzcGNtZGVudDsgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgZW50cnkgaW4gZXNwIGNtZCBsb2cuICovCisKKyAgLyogTWlzYy4gaW5mbyBhYm91dCB0aGlzIEVTUCAqLworICBlbnVtIGVzcF9yZXYgZXJldjsgICAgICAgICAgICAgICAgICAgICAgLyogRVNQIHJldmlzaW9uICovCisgIGludCBpcnE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJUlEgZm9yIHRoaXMgRVNQICovCisgIGludCBzY3NpX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXaG8gYW0gSSBhcyBpbml0aWF0b3I/ICovCisgIGludCBzY3NpX2lkX21hc2s7ICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXRtYXNrIG9mICdtZScuICovCisgIGludCBkaWZmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaWZmZXJlbnRpYWwgU0NTSSBidXM/ICovCisgIGludCBzbG90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTbG90IHRoZSBhZGFwdGVyIG9jY3VwaWVzICovCisKKyAgLyogT3VyIGNvbW1hbmQgcXVldWVzLCBvbmx5IG9uZSBjbWQgbGl2ZXMgaW4gdGhlIGN1cnJlbnRfU0MgcXVldWUuICovCisgIFNjc2lfQ21uZCAqaXNzdWVfU0M7ICAgICAgICAgICAvKiBDb21tYW5kcyB0byBiZSBpc3N1ZWQgKi8KKyAgU2NzaV9DbW5kICpjdXJyZW50X1NDOyAgICAgICAgIC8qIFdobyBpcyBjdXJyZW50bHkgd29ya2luZyB0aGUgYnVzICovCisgIFNjc2lfQ21uZCAqZGlzY29ubmVjdGVkX1NDOyAgICAvKiBDb21tYW5kcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgYnVzICovCisKKyAgLyogTWVzc2FnZSBnb28gKi8KKyAgdW5jaGFyIGN1cl9tc2dvdXRbMTZdOworICB1bmNoYXIgY3VyX21zZ2luWzE2XTsKKyAgdW5jaGFyIHByZXZtc2dvdXQsIHByZXZtc2dpbjsKKyAgdW5jaGFyIG1zZ291dF9sZW4sIG1zZ2luX2xlbjsKKyAgdW5jaGFyIG1zZ291dF9jdHIsIG1zZ2luX2N0cjsKKworICAvKiBTdGF0ZXMgdGhhdCB3ZSBjYW5ub3Qga2VlcCBpbiB0aGUgcGVyIGNtZCBzdHJ1Y3R1cmUgYmVjYXVzZSB0aGV5CisgICAqIGNhbm5vdCBiZSBhc3Nvc2NpYXRlZCB3aXRoIGFueSBzcGVjaWZpYyBjb21tYW5kLgorICAgKi8KKyAgdW5jaGFyIHJlc2V0dGluZ19idXM7CisgIHdhaXRfcXVldWVfaGVhZF90IHJlc2V0X3F1ZXVlOworCisgIHVuY2hhciBkb19waW9fY21kczsJCS8qIERvIGNvbW1hbmQgdHJhbnNmZXIgd2l0aCBwaW8gKi8KKworICAvKiBIb3cgbXVjaCBiaXRzIGRvIHdlIGhhdmUgdG8gc2hpZnQgdGhlIHJlZ2lzdGVycyAqLworICB1bnNpZ25lZCBjaGFyIHNoaWZ0OworCisgIC8qIEZ1bmN0aW9ucyBoYW5kbGluZyBETUEKKyAgICovIAorICAvKiBSZXF1aXJlZCBmdW5jdGlvbnMgKi8KKyAgaW50ICAoKmRtYV9ieXRlc19zZW50KShzdHJ1Y3QgTkNSX0VTUCAqLCBpbnQpOworICBpbnQgICgqZG1hX2Nhbl90cmFuc2Zlcikoc3RydWN0IE5DUl9FU1AgKiwgU2NzaV9DbW5kICopOworICB2b2lkICgqZG1hX2R1bXBfc3RhdGUpKHN0cnVjdCBOQ1JfRVNQICopOworICB2b2lkICgqZG1hX2luaXRfcmVhZCkoc3RydWN0IE5DUl9FU1AgKiwgX191MzIsIGludCk7CisgIHZvaWQgKCpkbWFfaW5pdF93cml0ZSkoc3RydWN0IE5DUl9FU1AgKiwgX191MzIsIGludCk7CisgIHZvaWQgKCpkbWFfaW50c19vZmYpKHN0cnVjdCBOQ1JfRVNQICopOworICB2b2lkICgqZG1hX2ludHNfb24pKHN0cnVjdCBOQ1JfRVNQICopOworICBpbnQgICgqZG1hX2lycV9wKShzdHJ1Y3QgTkNSX0VTUCAqKTsKKyAgaW50ICAoKmRtYV9wb3J0c19wKShzdHJ1Y3QgTkNSX0VTUCAqKTsKKyAgdm9pZCAoKmRtYV9zZXR1cCkoc3RydWN0IE5DUl9FU1AgKiwgX191MzIsIGludCwgaW50KTsKKworICAvKiBPcHRpb25hbCBmdW5jdGlvbnMgKGkuZS4gbWF5IGJlIGluaXRpYWxpemVkIHRvIDApICovCisgIHZvaWQgKCpkbWFfYmFycmllcikoc3RydWN0IE5DUl9FU1AgKik7CisgIHZvaWQgKCpkbWFfZHJhaW4pKHN0cnVjdCBOQ1JfRVNQICopOworICB2b2lkICgqZG1hX2ludmFsaWRhdGUpKHN0cnVjdCBOQ1JfRVNQICopOworICB2b2lkICgqZG1hX2lycV9lbnRyeSkoc3RydWN0IE5DUl9FU1AgKik7CisgIHZvaWQgKCpkbWFfaXJxX2V4aXQpKHN0cnVjdCBOQ1JfRVNQICopOworICB2b2lkICgqZG1hX2xlZF9vZmYpKHN0cnVjdCBOQ1JfRVNQICopOworICB2b2lkICgqZG1hX2xlZF9vbikoc3RydWN0IE5DUl9FU1AgKik7CisgIHZvaWQgKCpkbWFfcG9sbCkoc3RydWN0IE5DUl9FU1AgKiwgdW5zaWduZWQgY2hhciAqKTsKKyAgdm9pZCAoKmRtYV9yZXNldCkoc3RydWN0IE5DUl9FU1AgKik7CisgICAgCisgIC8qIE9wdGlvbmFsIHZpcnR1YWwgRE1BIGZ1bmN0aW9ucyAqLworICB2b2lkICgqZG1hX21tdV9nZXRfc2NzaV9vbmUpKHN0cnVjdCBOQ1JfRVNQICosIFNjc2lfQ21uZCAqKTsKKyAgdm9pZCAoKmRtYV9tbXVfZ2V0X3Njc2lfc2dsKShzdHJ1Y3QgTkNSX0VTUCAqLCBTY3NpX0NtbmQgKik7CisgIHZvaWQgKCpkbWFfbW11X3JlbGVhc2Vfc2NzaV9vbmUpKHN0cnVjdCBOQ1JfRVNQICosIFNjc2lfQ21uZCAqKTsKKyAgdm9pZCAoKmRtYV9tbXVfcmVsZWFzZV9zY3NpX3NnbCkoc3RydWN0IE5DUl9FU1AgKiwgU2NzaV9DbW5kICopOworICB2b2lkICgqZG1hX2FkdmFuY2Vfc2cpKFNjc2lfQ21uZCAqKTsKK307CisKKy8qIEJpdGZpZWxkIG1lYW5pbmdzIGZvciB0aGUgYWJvdmUgcmVnaXN0ZXJzLiAqLworCisvKiBFU1AgY29uZmlnIHJlZyAxLCByZWFkLXdyaXRlLCBmb3VuZCBvbiBhbGwgRVNQIGNoaXBzICovCisjZGVmaW5lIEVTUF9DT05GSUcxX0lEICAgICAgICAweDA3ICAgICAgICAgICAgIC8qIE15IEJVUyBJRCBiaXRzICovCisjZGVmaW5lIEVTUF9DT05GSUcxX0NIVEVTVCAgICAweDA4ICAgICAgICAgICAgIC8qIEVuYWJsZSBFU1AgY2hpcCB0ZXN0cyAqLworI2RlZmluZSBFU1BfQ09ORklHMV9QRU5BQkxFICAgMHgxMCAgICAgICAgICAgICAvKiBFbmFibGUgcGFyaXR5IGNoZWNrcyAqLworI2RlZmluZSBFU1BfQ09ORklHMV9QQVJURVNUICAgMHgyMCAgICAgICAgICAgICAvKiBQYXJpdHkgdGVzdCBtb2RlIGVuYWJsZWQ/ICovCisjZGVmaW5lIEVTUF9DT05GSUcxX1NSUkRJU0FCICAweDQwICAgICAgICAgICAgIC8qIERpc2FibGUgU0NTSSByZXNldCByZXBvcnRzICovCisjZGVmaW5lIEVTUF9DT05GSUcxX1NMQ0FCTEUgICAweDgwICAgICAgICAgICAgIC8qIEVuYWJsZSBzbG93IGNhYmxlIG1vZGUgKi8KKworLyogRVNQIGNvbmZpZyByZWcgMiwgcmVhZC13cml0ZSwgZm91bmQgb25seSBvbiBlc3AxMDBhK2VzcDIwMCtlc3AyMzYrZnNjIGNoaXBzICovCisjZGVmaW5lIEVTUF9DT05GSUcyX0RNQVBBUklUWSAweDAxICAgICAgICAgICAgIC8qIGVuYWJsZSBETUEgUGFyaXR5ICgyMDAsMjM2LGZzYykgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfUkVHUEFSSVRZIDB4MDIgICAgICAgICAgICAgLyogZW5hYmxlIHJlZyBQYXJpdHkgKDIwMCwyMzYsZnNjKSAqLworI2RlZmluZSBFU1BfQ09ORklHMl9CQURQQVJJVFkgMHgwNCAgICAgICAgICAgICAvKiBCYWQgcGFyaXR5IHRhcmdldCBhYm9ydCAgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfU0NTSTJFTkFCIDB4MDggICAgICAgICAgICAgLyogRW5hYmxlIFNDU0ktMiBmZWF0dXJlcyAodG1vZGUgb25seSkgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfSEkgICAgICAgIDB4MTAgICAgICAgICAgICAgLyogSGlnaCBJbXBlZGFuY2UgRFJFUSA/Pz8gICovCisjZGVmaW5lIEVTUF9DT05GSUcyX0hNRUZFTkFCICAweDEwICAgICAgICAgICAgIC8qIEhNRSBmZWF0dXJlcyBlbmFibGUgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfQkNNICAgICAgIDB4MjAgICAgICAgICAgICAgLyogRW5hYmxlIGJ5dGUtY3RybCAoMjM2LGZzYykgICAqLworI2RlZmluZSBFU1BfQ09ORklHMl9GRU5BQiAgICAgMHg0MCAgICAgICAgICAgICAvKiBFbmFibGUgZmVhdHVyZXMgKGZhczEwMCxlc3AyMTYsZnNjKSAgICAgICovCisjZGVmaW5lIEVTUF9DT05GSUcyX1NQTCAgICAgICAweDQwICAgICAgICAgICAgIC8qIEVuYWJsZSBzdGF0dXMtcGhhc2UgbGF0Y2ggKGVzcDIzNikgICAqLworI2RlZmluZSBFU1BfQ09ORklHMl9SRkIgICAgICAgMHg4MCAgICAgICAgICAgICAvKiBSZXNlcnZlIEZJRk8gYnl0ZSAoZnNjKSAqLworI2RlZmluZSBFU1BfQ09ORklHMl9NQUdJQyAgICAgMHhlMCAgICAgICAgICAgICAvKiBJbnZhbGlkIGJpdHMuLi4gKi8KKworLyogRVNQIGNvbmZpZyByZWdpc3RlciAzIHJlYWQtd3JpdGUsIGZvdW5kIG9ubHkgZXNwMjM2K2ZhczIzNitmYXMxMDBhK2ZzYyBjaGlwcyAqLworI2RlZmluZSBFU1BfQ09ORklHM19GQ0xPQ0sgICAgMHgwMSAgICAgICAgICAgICAvKiBGQVNUIFNDU0kgY2xvY2sgcmF0ZSAoZXNwMTAwYS9mYXMzNjYpICovCisjZGVmaW5lIEVTUF9DT05GSUczX1RFTSAgICAgICAweDAxICAgICAgICAgICAgIC8qIEVuYWJsZSB0aHJlc2gtOCBtb2RlIChlc3AvZmFzMjM2L2ZzYykgICovCisjZGVmaW5lIEVTUF9DT05GSUczX0ZBU1QgICAgICAweDAyICAgICAgICAgICAgIC8qIEVuYWJsZSBGQVNUIFNDU0kgICAgIChlc3AxMDBhKSAqLworI2RlZmluZSBFU1BfQ09ORklHM19BRE1BICAgICAgMHgwMiAgICAgICAgICAgICAvKiBFbmFibGUgYWx0ZXJuYXRlLWRtYSAoZXNwL2ZhczIzNi9mc2MpICAqLworI2RlZmluZSBFU1BfQ09ORklHM19URU5CICAgICAgMHgwNCAgICAgICAgICAgICAvKiBncm91cDIgU0NTSTIgc3VwcG9ydCAoZXNwMTAwYSkgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzNfU1JCICAgICAgIDB4MDQgICAgICAgICAgICAgLyogU2F2ZSByZXNpZHVhbCBieXRlICAgKGVzcC9mYXMyMzYvZnNjKSAgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzNfVE1TICAgICAgIDB4MDggICAgICAgICAgICAgLyogVGhyZWUtYnl0ZSBtc2cncyBvayAgKGVzcDEwMGEpICovCisjZGVmaW5lIEVTUF9DT05GSUczX0ZDTEsgICAgICAweDA4ICAgICAgICAgICAgIC8qIEZhc3QgU0NTSSBjbG9jayByYXRlIChlc3AvZmFzMjM2L2ZzYykgICovCisjZGVmaW5lIEVTUF9DT05GSUczX0lETVNHICAgICAweDEwICAgICAgICAgICAgIC8qIElEIG1lc3NhZ2UgY2hlY2tpbmcgIChlc3AxMDBhKSAqLworI2RlZmluZSBFU1BfQ09ORklHM19GU0NTSSAgICAgMHgxMCAgICAgICAgICAgICAvKiBFbmFibGUgRkFTVCBTQ1NJICAgICAoZXNwL2ZhczIzNi9mc2MpICAqLworI2RlZmluZSBFU1BfQ09ORklHM19HVE0gICAgICAgMHgyMCAgICAgICAgICAgICAvKiBncm91cDIgU0NTSTIgc3VwcG9ydCAoZXNwL2ZhczIzNi9mc2MpICAqLworI2RlZmluZSBFU1BfQ09ORklHM19UQk1TICAgICAgMHg0MCAgICAgICAgICAgICAvKiBUaHJlZS1ieXRlIG1zZydzIG9rICAoZXNwL2ZhczIzNi9mc2MpICAqLworI2RlZmluZSBFU1BfQ09ORklHM19JTVMgICAgICAgMHg4MCAgICAgICAgICAgICAvKiBJRCBtc2cgY2hrJ25nICAgICAgICAoZXNwL2ZhczIzNi9mc2MpICAqLworCisvKiBFU1AgY29uZmlnIHJlZ2lzdGVyIDQgcmVhZC13cml0ZSwgZm91bmQgb25seSBvbiBmc2MgY2hpcHMgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzRfQkJURSAgICAgIDB4MDEgICAgICAgICAgICAgLyogQmFjay10by1CYWNrIHRyYW5zZmVyIGVuYWJsZSAqLworI2RlZmluZSBFU1BfQ09ORklHNF9URVNUICAgICAgMHgwMiAgICAgICAgICAgICAvKiBUcmFuc2ZlciBjb3VudGVyIHRlc3QgbW9kZSAqLworI2RlZmluZSBFU1BfQ09ORklHNF9FQU4gICAgICAgMHgwNCAgICAgICAgICAgICAvKiBFbmFibGUgQWN0aXZlIE5lZ290aWF0aW9uICovCisKKy8qIEVTUCBjb21tYW5kIHJlZ2lzdGVyIHJlYWQtd3JpdGUgKi8KKy8qIEdyb3VwIDEgY29tbWFuZHM6ICBUaGVzZSBtYXkgYmUgc2VudCBhdCBhbnkgcG9pbnQgaW4gdGltZSB0byB0aGUgRVNQCisgKiAgICAgICAgICAgICAgICAgICAgY2hpcC4gIE5vbmUgb2YgdGhlbSBjYW4gZ2VuZXJhdGUgaW50ZXJydXB0cyAnY2VwdAorICogICAgICAgICAgICAgICAgICAgIHRoZSAiU0NTSSBidXMgcmVzZXQiIGNvbW1hbmQgaWYgeW91IGhhdmUgbm90IGRpc2FibGVkCisgKiAgICAgICAgICAgICAgICAgICAgU0NTSSByZXNldCBpbnRlcnJ1cHRzIGluIHRoZSBjb25maWcxIEVTUCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBFU1BfQ01EX05VTEwgICAgICAgICAgMHgwMCAgICAgICAgICAgICAvKiBOdWxsIGNvbW1hbmQsIGllLiBhIG5vcCAqLworI2RlZmluZSBFU1BfQ01EX0ZMVVNIICAgICAgICAgMHgwMSAgICAgICAgICAgICAvKiBGSUZPIEZsdXNoICovCisjZGVmaW5lIEVTUF9DTURfUkMgICAgICAgICAgICAweDAyICAgICAgICAgICAgIC8qIENoaXAgcmVzZXQgKi8KKyNkZWZpbmUgRVNQX0NNRF9SUyAgICAgICAgICAgIDB4MDMgICAgICAgICAgICAgLyogU0NTSSBidXMgcmVzZXQgKi8KKworLyogR3JvdXAgMiBjb21tYW5kczogIEVTUCBtdXN0IGJlIGFuIGluaXRpYXRvciBhbmQgY29ubmVjdGVkIHRvIGEgdGFyZ2V0CisgKiAgICAgICAgICAgICAgICAgICAgZm9yIHRoZXNlIGNvbW1hbmRzIHRvIHdvcmsuCisgKi8KKyNkZWZpbmUgRVNQX0NNRF9USSAgICAgICAgICAgIDB4MTAgICAgICAgICAgICAgLyogVHJhbnNmZXIgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgRVNQX0NNRF9JQ0NTRVEgICAgICAgIDB4MTEgICAgICAgICAgICAgLyogSW5pdGlhdG9yIGNtZCBjb21wbGV0ZSBzZXF1ZW5jZSAqLworI2RlZmluZSBFU1BfQ01EX01PSyAgICAgICAgICAgMHgxMiAgICAgICAgICAgICAvKiBNZXNzYWdlIG9raWUtZG9raWUgKi8KKyNkZWZpbmUgRVNQX0NNRF9UUEFEICAgICAgICAgIDB4MTggICAgICAgICAgICAgLyogVHJhbnNmZXIgUGFkICovCisjZGVmaW5lIEVTUF9DTURfU0FUTiAgICAgICAgICAweDFhICAgICAgICAgICAgIC8qIFNldCBBVE4gKi8KKyNkZWZpbmUgRVNQX0NNRF9SQVROICAgICAgICAgIDB4MWIgICAgICAgICAgICAgLyogRGUtYXNzZXJ0IEFUTiAqLworCisvKiBHcm91cCAzIGNvbW1hbmRzOiAgRVNQIG11c3QgYmUgaW4gdGhlIE1TR09VVCBvciBNU0dJTiBzdGF0ZSBhbmQgYmUgY29ubmVjdGVkCisgKiAgICAgICAgICAgICAgICAgICAgdG8gYSB0YXJnZXQgYXMgdGhlIGluaXRpYXRvciBmb3IgdGhlc2UgY29tbWFuZHMgdG8gd29yay4KKyAqLworI2RlZmluZSBFU1BfQ01EX1NNU0cgICAgICAgICAgMHgyMCAgICAgICAgICAgICAvKiBTZW5kIG1lc3NhZ2UgKi8KKyNkZWZpbmUgRVNQX0NNRF9TU1RBVCAgICAgICAgIDB4MjEgICAgICAgICAgICAgLyogU2VuZCBzdGF0dXMgKi8KKyNkZWZpbmUgRVNQX0NNRF9TREFUQSAgICAgICAgIDB4MjIgICAgICAgICAgICAgLyogU2VuZCBkYXRhICovCisjZGVmaW5lIEVTUF9DTURfRFNFUSAgICAgICAgICAweDIzICAgICAgICAgICAgIC8qIERpc2NvbnRpbnVlIFNlcXVlbmNlICovCisjZGVmaW5lIEVTUF9DTURfVFNFUSAgICAgICAgICAweDI0ICAgICAgICAgICAgIC8qIFRlcm1pbmF0ZSBTZXF1ZW5jZSAqLworI2RlZmluZSBFU1BfQ01EX1RDQ1NFUSAgICAgICAgMHgyNSAgICAgICAgICAgICAvKiBUYXJnZXQgY21kIGNtcGx0IHNlcXVlbmNlICovCisjZGVmaW5lIEVTUF9DTURfRENOQ1QgICAgICAgICAweDI3ICAgICAgICAgICAgIC8qIERpc2Nvbm5lY3QgKi8KKyNkZWZpbmUgRVNQX0NNRF9STVNHICAgICAgICAgIDB4MjggICAgICAgICAgICAgLyogUmVjZWl2ZSBNZXNzYWdlICovCisjZGVmaW5lIEVTUF9DTURfUkNNRCAgICAgICAgICAweDI5ICAgICAgICAgICAgIC8qIFJlY2VpdmUgQ29tbWFuZCAqLworI2RlZmluZSBFU1BfQ01EX1JEQVRBICAgICAgICAgMHgyYSAgICAgICAgICAgICAvKiBSZWNlaXZlIERhdGEgKi8KKyNkZWZpbmUgRVNQX0NNRF9SQ1NFUSAgICAgICAgIDB4MmIgICAgICAgICAgICAgLyogUmVjZWl2ZSBjbWQgc2VxdWVuY2UgKi8KKworLyogR3JvdXAgNCBjb21tYW5kczogIFRoZSBFU1AgbXVzdCBiZSBpbiB0aGUgZGlzY29ubmVjdGVkIHN0YXRlIGFuZCBtdXN0CisgKiAgICAgICAgICAgICAgICAgICAgbm90IGJlIGNvbm5lY3RlZCB0byBhbnkgdGFyZ2V0cyBhcyBpbml0aWF0b3IgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgdGhlc2UgY29tbWFuZHMgdG8gd29yay4KKyAqLworI2RlZmluZSBFU1BfQ01EX1JTRUwgICAgICAgICAgMHg0MCAgICAgICAgICAgICAvKiBSZXNlbGVjdCAqLworI2RlZmluZSBFU1BfQ01EX1NFTCAgICAgICAgICAgMHg0MSAgICAgICAgICAgICAvKiBTZWxlY3Qgdy9vIEFUTiAqLworI2RlZmluZSBFU1BfQ01EX1NFTEEgICAgICAgICAgMHg0MiAgICAgICAgICAgICAvKiBTZWxlY3Qgdy9BVE4gKi8KKyNkZWZpbmUgRVNQX0NNRF9TRUxBUyAgICAgICAgIDB4NDMgICAgICAgICAgICAgLyogU2VsZWN0IHcvQVROICYgU1RPUCAqLworI2RlZmluZSBFU1BfQ01EX0VTRUwgICAgICAgICAgMHg0NCAgICAgICAgICAgICAvKiBFbmFibGUgc2VsZWN0aW9uICovCisjZGVmaW5lIEVTUF9DTURfRFNFTCAgICAgICAgICAweDQ1ICAgICAgICAgICAgIC8qIERpc2FibGUgc2VsZWN0aW9ucyAqLworI2RlZmluZSBFU1BfQ01EX1NBMyAgICAgICAgICAgMHg0NiAgICAgICAgICAgICAvKiBTZWxlY3Qgdy9BVE4zICovCisjZGVmaW5lIEVTUF9DTURfUlNFTDMgICAgICAgICAweDQ3ICAgICAgICAgICAgIC8qIFJlc2VsZWN0MyAqLworCisvKiBUaGlzIGJpdCBlbmFibGVzIHRoZSBFU1AncyBETUEgKi8KKyNkZWZpbmUgRVNQX0NNRF9ETUEgICAgICAgICAgIDB4ODAgICAgICAgICAgICAgLyogRG8gRE1BPyAqLworCisvKiBFU1Agc3RhdHVzIHJlZ2lzdGVyIHJlYWQtb25seSAqLworI2RlZmluZSBFU1BfU1RBVF9QSU8gICAgICAgICAgMHgwMSAgICAgICAgICAgICAvKiBJTyBwaGFzZSBiaXQgKi8KKyNkZWZpbmUgRVNQX1NUQVRfUENEICAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogQ0QgcGhhc2UgYml0ICovCisjZGVmaW5lIEVTUF9TVEFUX1BNU0cgICAgICAgICAweDA0ICAgICAgICAgICAgIC8qIE1TRyBwaGFzZSBiaXQgKi8KKyNkZWZpbmUgRVNQX1NUQVRfUE1BU0sgICAgICAgIDB4MDcgICAgICAgICAgICAgLyogTWFzayBvZiBwaGFzZSBiaXRzICovCisjZGVmaW5lIEVTUF9TVEFUX1RET05FICAgICAgICAweDA4ICAgICAgICAgICAgIC8qIFRyYW5zZmVyIENvbXBsZXRlZCAqLworI2RlZmluZSBFU1BfU1RBVF9UQ05UICAgICAgICAgMHgxMCAgICAgICAgICAgICAvKiBUcmFuc2ZlciBDb3VudGVyIElzIFplcm8gKi8KKyNkZWZpbmUgRVNQX1NUQVRfUEVSUiAgICAgICAgIDB4MjAgICAgICAgICAgICAgLyogUGFyaXR5IGVycm9yICovCisjZGVmaW5lIEVTUF9TVEFUX1NQQU0gICAgICAgICAweDQwICAgICAgICAgICAgIC8qIFJlYWwgYmFkIGVycm9yICovCisvKiBUaGlzIGluZGljYXRlcyB0aGUgJ2ludGVycnVwdCBwZW5kaW5nJyBjb25kaXRpb24sIGl0IGlzIGEgcmVzZXJ2ZWQKKyAqIGJpdCBvbiBvbGQgcmV2cyBvZiB0aGUgRVNQIChFU1AxMDAsIEVTUDEwMEEsIEZBUzEwMEEpLgorICovCisjZGVmaW5lIEVTUF9TVEFUX0lOVFIgICAgICAgICAweDgwICAgICAgICAgICAgIC8qIEludGVycnVwdCAqLworCisvKiBUaGUgc3RhdHVzIHJlZ2lzdGVyIGNhbiBiZSBtYXNrZWQgd2l0aCBFU1BfU1RBVF9QTUFTSyBhbmQgY29tcGFyZWQKKyAqIHdpdGggdGhlIGZvbGxvd2luZyB2YWx1ZXMgdG8gZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHBoYXNlIHRoZSBFU1AKKyAqIChhdCBsZWFzdCB0aGlua3MgaXQpIGlzIGluLiAgRm9yIG91ciBwdXJwb3NlcyB3ZSBhbHNvIGFkZCBvdXIgb3duCisgKiBzb2Z0d2FyZSAnZG9uZScgYml0IGZvciBvdXIgcGhhc2UgbWFuYWdlbWVudCBlbmdpbmUuCisgKi8KKyNkZWZpbmUgRVNQX0RPUCAgICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERhdGEgT3V0ICAqLworI2RlZmluZSBFU1BfRElQICAgKEVTUF9TVEFUX1BJTykgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGF0YSBJbiAgICovCisjZGVmaW5lIEVTUF9DTURQICAoRVNQX1NUQVRfUENEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kICAgKi8KKyNkZWZpbmUgRVNQX1NUQVRQIChFU1BfU1RBVF9QQ0R8RVNQX1NUQVRfUElPKSAgICAgICAgICAgICAgIC8qIFN0YXR1cyAgICAqLworI2RlZmluZSBFU1BfTU9QICAgKEVTUF9TVEFUX1BNU0d8RVNQX1NUQVRfUENEKSAgICAgICAgICAgICAgLyogTWVzc2FnZSBPdXQgKi8KKyNkZWZpbmUgRVNQX01JUCAgIChFU1BfU1RBVF9QTVNHfEVTUF9TVEFUX1BDRHxFU1BfU1RBVF9QSU8pIC8qIE1lc3NhZ2UgSW4gKi8KKworLyogRVNQIGludGVycnVwdCByZWdpc3RlciByZWFkLW9ubHkgKi8KKyNkZWZpbmUgRVNQX0lOVFJfUyAgICAgICAgICAgIDB4MDEgICAgICAgICAgICAgLyogU2VsZWN0IHcvbyBBVE4gKi8KKyNkZWZpbmUgRVNQX0lOVFJfU0FUTiAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogU2VsZWN0IHcvQVROICovCisjZGVmaW5lIEVTUF9JTlRSX1JTRUwgICAgICAgICAweDA0ICAgICAgICAgICAgIC8qIFJlc2VsZWN0ZWQgKi8KKyNkZWZpbmUgRVNQX0lOVFJfRkRPTkUgICAgICAgIDB4MDggICAgICAgICAgICAgLyogRnVuY3Rpb24gZG9uZSAqLworI2RlZmluZSBFU1BfSU5UUl9CU0VSViAgICAgICAgMHgxMCAgICAgICAgICAgICAvKiBCdXMgc2VydmljZSAqLworI2RlZmluZSBFU1BfSU5UUl9EQyAgICAgICAgICAgMHgyMCAgICAgICAgICAgICAvKiBEaXNjb25uZWN0ICovCisjZGVmaW5lIEVTUF9JTlRSX0lDICAgICAgICAgICAweDQwICAgICAgICAgICAgIC8qIElsbGVnYWwgY29tbWFuZCBnaXZlbiAqLworI2RlZmluZSBFU1BfSU5UUl9TUiAgICAgICAgICAgMHg4MCAgICAgICAgICAgICAvKiBTQ1NJIGJ1cyByZXNldCBkZXRlY3RlZCAqLworCisvKiBJbnRlcnJ1cHQgc3RhdHVzIG1hY3JvcyAqLworI2RlZmluZSBFU1BfU1JFU0VUX0lSUShlc3ApICAoKGVzcCktPmludHJlZyAmIChFU1BfSU5UUl9TUikpCisjZGVmaW5lIEVTUF9JTExDTURfSVJRKGVzcCkgICgoZXNwKS0+aW50cmVnICYgKEVTUF9JTlRSX0lDKSkKKyNkZWZpbmUgRVNQX1NFTEVDVF9XSVRIX0FUTl9JUlEoZXNwKSAgICAgKChlc3ApLT5pbnRyZWcgJiAoRVNQX0lOVFJfU0FUTikpCisjZGVmaW5lIEVTUF9TRUxFQ1RfV0lUSE9VVF9BVE5fSVJRKGVzcCkgICgoZXNwKS0+aW50cmVnICYgKEVTUF9JTlRSX1MpKQorI2RlZmluZSBFU1BfU0VMRUNUSU9OX0lSUShlc3ApICAoKEVTUF9TRUxFQ1RfV0lUSF9BVE5fSVJRKGVzcCkpIHx8ICAgICAgICAgXAorCQkJCSAoRVNQX1NFTEVDVF9XSVRIT1VUX0FUTl9JUlEoZXNwKSkpCisjZGVmaW5lIEVTUF9SRVNFTEVDVElPTl9JUlEoZXNwKSAgICAgICAgICgoZXNwKS0+aW50cmVnICYgKEVTUF9JTlRSX1JTRUwpKQorCisvKiBFU1Agc2VxdWVuY2Ugc3RlcCByZWdpc3RlciByZWFkLW9ubHkgKi8KKyNkZWZpbmUgRVNQX1NURVBfVkJJVFMgICAgICAgIDB4MDcgICAgICAgICAgICAgLyogVmFsaWQgYml0cyAqLworI2RlZmluZSBFU1BfU1RFUF9BU0VMICAgICAgICAgMHgwMCAgICAgICAgICAgICAvKiBTZWxlY3Rpb24mQXJiaXRyYXRlIGNtcGx0ICovCisjZGVmaW5lIEVTUF9TVEVQX1NJRCAgICAgICAgICAweDAxICAgICAgICAgICAgIC8qIE9uZSBtc2cgYnl0ZSBzZW50ICovCisjZGVmaW5lIEVTUF9TVEVQX05DTUQgICAgICAgICAweDAyICAgICAgICAgICAgIC8qIFdhcyBub3QgaW4gY29tbWFuZCBwaGFzZSAqLworI2RlZmluZSBFU1BfU1RFUF9QUEMgICAgICAgICAgMHgwMyAgICAgICAgICAgICAvKiBFYXJseSBwaGFzZSBjaGcgY2F1c2VkIGNtbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnl0ZXMgdG8gYmUgbG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVNQX1NURVBfRklOSTQgICAgICAgIDB4MDQgICAgICAgICAgICAgLyogQ29tbWFuZCB3YXMgc2VudCBvayAqLworCisvKiBIbyBodW0sIHNvbWUgRVNQJ3Mgc2V0IHRoZSBzdGVwIHJlZ2lzdGVyIHRvIHRoaXMgYXMgd2VsbC4uLiAqLworI2RlZmluZSBFU1BfU1RFUF9GSU5JNSAgICAgICAgMHgwNQorI2RlZmluZSBFU1BfU1RFUF9GSU5JNiAgICAgICAgMHgwNgorI2RlZmluZSBFU1BfU1RFUF9GSU5JNyAgICAgICAgMHgwNworI2RlZmluZSBFU1BfU1RFUF9TT00gICAgICAgICAgMHgwOCAgICAgICAgICAgICAvKiBTeW5jaHJvbm91cyBPZmZzZXQgTWF4ICovCisKKy8qIEVTUCBjaGlwLXRlc3QgcmVnaXN0ZXIgcmVhZC13cml0ZSAqLworI2RlZmluZSBFU1BfVEVTVF9UQVJHICAgICAgICAgMHgwMSAgICAgICAgICAgICAvKiBUYXJnZXQgdGVzdCBtb2RlICovCisjZGVmaW5lIEVTUF9URVNUX0lOSSAgICAgICAgICAweDAyICAgICAgICAgICAgIC8qIEluaXRpYXRvciB0ZXN0IG1vZGUgKi8KKyNkZWZpbmUgRVNQX1RFU1RfVFMgICAgICAgICAgIDB4MDQgICAgICAgICAgICAgLyogVHJpc3RhdGUgdGVzdCBtb2RlICovCisKKy8qIEVTUCB1bmlxdWUgSUQgcmVnaXN0ZXIgcmVhZC1vbmx5LCBmb3VuZCBvbiBmYXMyMzYrZmFzMTAwYStmc2Mgb25seSAqLworI2RlZmluZSBFU1BfVUlEX0YxMDBBICAgICAgICAgMHgwMCAgICAgICAgICAgICAvKiBGQVMxMDBBICAqLworI2RlZmluZSBFU1BfVUlEX0YyMzYgICAgICAgICAgMHgwMiAgICAgICAgICAgICAvKiBGQVMyMzYgICAqLworI2RlZmluZSBFU1BfVUlEX0ZTQyAgICAgICAgICAgMHhhMiAgICAgICAgICAgICAvKiBOQ1I1M0NGOXgtMiAgKi8KKyNkZWZpbmUgRVNQX1VJRF9SRVYgICAgICAgICAgIDB4MDcgICAgICAgICAgICAgLyogRVNQIHJldmlzaW9uICovCisjZGVmaW5lIEVTUF9VSURfRkFNICAgICAgICAgICAweGY4ICAgICAgICAgICAgIC8qIEVTUCBmYW1pbHkgICAqLworCisvKiBFU1AgZmlmbyBmbGFncyByZWdpc3RlciByZWFkLW9ubHkgKi8KKy8qIE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIGltcGxpZXMgYSAxNiBieXRlIEZJRk8gb24gdGhlIEVTUC4gKi8KKyNkZWZpbmUgRVNQX0ZGX0ZCWVRFUyAgICAgICAgIDB4MWYgICAgICAgICAgICAgLyogTnVtIGJ5dGVzIGluIEZJRk8gKi8KKyNkZWZpbmUgRVNQX0ZGX09OT1RaRVJPICAgICAgIDB4MjAgICAgICAgICAgICAgLyogb2Zmc2V0IGN0ciBub3QgemVybyAoZXNwMTAwLGZzYykgKi8KKyNkZWZpbmUgRVNQX0ZGX1NTVEVQICAgICAgICAgIDB4ZTAgICAgICAgICAgICAgLyogU2VxdWVuY2Ugc3RlcCAqLworCisvKiBFU1AgY2xvY2sgY29udmVyc2lvbiBmYWN0b3IgcmVnaXN0ZXIgd3JpdGUtb25seSAqLworI2RlZmluZSBFU1BfQ0NGX0YwICAgICAgICAgICAgMHgwMCAgICAgICAgICAgICAvKiAzNS4wMU1IeiAtIDQwTUh6ICovCisjZGVmaW5lIEVTUF9DQ0ZfTkVWRVIgICAgICAgICAweDAxICAgICAgICAgICAgIC8qIFNldCBpdCB0byB0aGlzIGFuZCBkaWUgKi8KKyNkZWZpbmUgRVNQX0NDRl9GMiAgICAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogMTBNSHogKi8KKyNkZWZpbmUgRVNQX0NDRl9GMyAgICAgICAgICAgIDB4MDMgICAgICAgICAgICAgLyogMTAuMDFNSHogLSAxNU1IeiAqLworI2RlZmluZSBFU1BfQ0NGX0Y0ICAgICAgICAgICAgMHgwNCAgICAgICAgICAgICAvKiAxNS4wMU1IeiAtIDIwTUh6ICovCisjZGVmaW5lIEVTUF9DQ0ZfRjUgICAgICAgICAgICAweDA1ICAgICAgICAgICAgIC8qIDIwLjAxTUh6IC0gMjVNSHogKi8KKyNkZWZpbmUgRVNQX0NDRl9GNiAgICAgICAgICAgIDB4MDYgICAgICAgICAgICAgLyogMjUuMDFNSHogLSAzME1IeiAqLworI2RlZmluZSBFU1BfQ0NGX0Y3ICAgICAgICAgICAgMHgwNyAgICAgICAgICAgICAvKiAzMC4wMU1IeiAtIDM1TUh6ICovCisKKyNkZWZpbmUgRVNQX0JVU19USU1FT1VUICAgICAgICAyNzUgICAgICAgICAgICAgLyogSW4gbWlsbGktc2Vjb25kcyAqLworI2RlZmluZSBFU1BfVElNRU9fQ09OU1QgICAgICAgODE5MgorI2RlZmluZSBGU0NfVElNRU9fQ09OU1QgICAgICAgNzY2OAorI2RlZmluZSBFU1BfTkVHX0RFRlAobWh6LCBjZmFjdCkgXAorICAgICAgICAoKEVTUF9CVVNfVElNRU9VVCAqICgobWh6KSAvIDEwMDApKSAvICg4MTkyICogKGNmYWN0KSkpCisjZGVmaW5lIEZTQ19ORUdfREVGUChtaHosIGNmYWN0KSBcCisgICAgICAgICgoRVNQX0JVU19USU1FT1VUICogKChtaHopIC8gMTAwMCkpIC8gKDc2NjggKiAoY2ZhY3QpKSkKKyNkZWZpbmUgRVNQX01IWl9UT19DWUNMRShtaGVydHopICAoKDEwMDAwMDAwMDApIC8gKChtaGVydHopIC8gMTAwMCkpCisjZGVmaW5lIEVTUF9USUNLKGNjZiwgY3ljbGUpICAoKDc2ODIgKiAoY2NmKSAqIChjeWNsZSkgLyAxMDAwKSkKKworCisvKiBVR0xZLCBVR0xZLCBVR0xZISAqLworZXh0ZXJuIGludCBuZXNwcywgZXNwc19pbl91c2UsIGVzcHNfcnVubmluZzsKKworLyogRm9yIG91ciBpbnRlcnJ1cHQgZW5naW5lLiAqLworI2RlZmluZSBmb3JfZWFjaF9lc3AoZXNwKSBcCisgICAgICAgIGZvcigoZXNwKSA9IGVzcGNoYWluOyAoZXNwKTsgKGVzcCkgPSAoZXNwKS0+bmV4dCkKKworCisvKiBFeHRlcm5hbCBmdW5jdGlvbnMgKi8KK2V4dGVybiB2b2lkIGVzcF9ib290dXBfcmVzZXQoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncyk7CitleHRlcm4gc3RydWN0IE5DUl9FU1AgKmVzcF9hbGxvY2F0ZShTY3NpX0hvc3RfVGVtcGxhdGUgKiwgdm9pZCAqKTsKK2V4dGVybiB2b2lkIGVzcF9kZWFsbG9jYXRlKHN0cnVjdCBOQ1JfRVNQICopOworZXh0ZXJuIHZvaWQgZXNwX3JlbGVhc2Uodm9pZCk7CitleHRlcm4gdm9pZCBlc3BfaW5pdGlhbGl6ZShzdHJ1Y3QgTkNSX0VTUCAqKTsKK2V4dGVybiBpcnFyZXR1cm5fdCBlc3BfaW50cihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitleHRlcm4gY29uc3QgY2hhciAqZXNwX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqKTsKK2V4dGVybiBpbnQgZXNwX3F1ZXVlKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKK2V4dGVybiBpbnQgZXNwX2Fib3J0KFNjc2lfQ21uZCAqKTsKK2V4dGVybiBpbnQgZXNwX3Jlc2V0KFNjc2lfQ21uZCAqKTsKK2V4dGVybiBpbnQgZXNwX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwKKwkJCSBpbnQgaW5vdXQpOworZXh0ZXJuIGludCBlc3Bfc2xhdmVfYWxsb2MoU2NzaV9EZXZpY2UgKik7CitleHRlcm4gdm9pZCBlc3Bfc2xhdmVfZGVzdHJveShTY3NpX0RldmljZSAqKTsKKyNlbmRpZiAvKiAhKE5DUjUzQzlYX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTkNSNTNjNDA2YS5jIGIvZHJpdmVycy9zY3NpL05DUjUzYzQwNmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjg1ZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL05DUjUzYzQwNmEuYwpAQCAtMCwwICsxLDExMTAgQEAKKy8qIAorICogIE5DUjUzYzQwNi5jCisgKiAgTG93LWxldmVsIFNDU0kgZHJpdmVyIGZvciBOQ1I1M2M0MDZhIGNoaXAuCisgKiAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2IE5vcm11bmRzIFNhdW1hbmlzIChub3JtdW5kc0BmaS5pYm0uY29tKQorICogCisgKiAgTElMTyBjb21tYW5kIGxpbmUgdXNhZ2U6IG5jcjUzYzQwNmE9PFBPUlRCQVNFPlssPElSUT5bLDxGQVNUUElPPl1dCisgKiAgU3BlY2lmeSBJUlEgPSAwIGZvciBub24taW50ZXJydXB0IGRyaXZlbiBtb2RlLgorICogIEZBU1RQSU8gPSAxIGZvciBmYXN0IHBpbyBtb2RlLCAwIGZvciBzbG93IG1vZGUuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogIGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNkZWZpbmUgTkNSNTNDNDA2QV9ERUJVRyAwCisjZGVmaW5lIFZFUkJPU0VfTkNSNTNDNDA2QV9ERUJVRyAwCisKKy8qIFNldCB0aGlzIHRvIDEgZm9yIFBJTyBtb2RlIChyZWNvbW1lbmRlZCkgb3IgdG8gMCBmb3IgRE1BIG1vZGUgKi8KKyNkZWZpbmUgVVNFX1BJTyAxCisKKyNkZWZpbmUgVVNFX0JJT1MgMAorCQkJCS8qICNkZWZpbmUgQklPU19BRERSIDB4RDgwMDAgKi8vKiBkZWZpbmUgdGhpcyBpZiBhdXRvcHJvYmUgZmFpbHMgKi8KKwkJCQkvKiAjZGVmaW5lIFBPUlRfQkFTRSAweDMzMCAqLy8qIGRlZmluZSB0aGlzIGlmIGF1dG9wcm9iZSBmYWlscyAqLworCQkJCS8qICNkZWZpbmUgSVJRX0xFViAgIDAJKi8vKiBkZWZpbmUgdGhpcyBpZiBhdXRvcHJvYmUgZmFpbHMgKi8KKyNkZWZpbmUgRE1BX0NIQU4gIDUJCS8qIHRoaXMgaXMgaWdub3JlZCBpZiBETUEgaXMgZGlzYWJsZWQgKi8KKworLyogU2V0IHRoaXMgdG8gMCBpZiB5b3UgZW5jb3VudGVyIGtlcm5lbCBsb2NrdXBzIHdoaWxlIHRyYW5zZmVycmluZyAKKyAqIGRhdGEgaW4gUElPIG1vZGUgKi8KKyNkZWZpbmUgVVNFX0ZBU1RfUElPIDEKKworLyogPT09PT09PT09PT09PSBFbmQgb2YgdXNlciBjb25maWd1cmFibGUgcGFyYW1ldGVycyA9PT09PT09PT09PT09ICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjZGVmaW5lIFdBVENIRE9HIDUwMDAwMDAKKworI2RlZmluZSBTWU5DX01PREUgMAkJLyogU3luY2hyb25vdXMgdHJhbnNmZXIgbW9kZSAqLworCisjaWYgREVCVUcKKyN1bmRlZiBOQ1I1M0M0MDZBX0RFQlVHCisjZGVmaW5lIE5DUjUzQzQwNkFfREVCVUcgMQorI2VuZGlmCisKKyNpZiBVU0VfUElPCisjZGVmaW5lIFVTRV9ETUEgMAorI2Vsc2UKKyNkZWZpbmUgVVNFX0RNQSAxCisjZW5kaWYKKworLyogRGVmYXVsdCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEMxX0lNRyAgIDB4MDcJCS8qIElEPTcgKi8KKyNkZWZpbmUgQzJfSU1HICAgMHg0OAkJLyogRkUgU0NTSTIgKi8KKyNpZiBVU0VfRE1BCisjZGVmaW5lIEMzX0lNRyAgIDB4MjEJCS8qIENEQiBURSAqLworI2Vsc2UKKyNkZWZpbmUgQzNfSU1HICAgMHgyMAkJLyogQ0RCICovCisjZW5kaWYKKyNkZWZpbmUgQzRfSU1HICAgMHgwNAkJLyogQU5FICovCisjZGVmaW5lIEM1X0lNRyAgIDB4YjYJCS8qIEFBIFBJIFNJRSBQT0wgKi8KKworI2RlZmluZSBSRUcwIChvdXRiKEM0X0lNRywgQ09ORklHNCkpCisjZGVmaW5lIFJFRzEgKG91dGIoQzVfSU1HLCBDT05GSUc1KSkKKworI2lmIE5DUjUzQzQwNkFfREVCVUcKKyNkZWZpbmUgREVCKHgpIHgKKyNlbHNlCisjZGVmaW5lIERFQih4KQorI2VuZGlmCisKKyNpZiBWRVJCT1NFX05DUjUzQzQwNkFfREVCVUcKKyNkZWZpbmUgVkRFQih4KSB4CisjZWxzZQorI2RlZmluZSBWREVCKHgpCisjZW5kaWYKKworI2RlZmluZSBMT0FEX0RNQV9DT1VOVChjb3VudCkgXAorICBvdXRiKGNvdW50ICYgMHhmZiwgVENfTFNCKTsgXAorICBvdXRiKChjb3VudCA+PiA4KSAmIDB4ZmYsIFRDX01TQik7IFwKKyAgb3V0YigoY291bnQgPj4gMTYpICYgMHhmZiwgVENfSElHSCk7CisKKy8qIENoaXAgY29tbWFuZHMgKi8KKyNkZWZpbmUgRE1BX09QICAgICAgICAgICAgICAgMHg4MAorCisjZGVmaW5lIFNDU0lfTk9QICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRkxVU0hfRklGTyAgICAgICAgICAgMHgwMQorI2RlZmluZSBDSElQX1JFU0VUICAgICAgICAgICAweDAyCisjZGVmaW5lIFNDU0lfUkVTRVQgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgUkVTRUxFQ1QgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBTRUxFQ1RfTk9fQVROICAgICAgICAweDQxCisjZGVmaW5lIFNFTEVDVF9BVE4gICAgICAgICAgIDB4NDIKKyNkZWZpbmUgU0VMRUNUX0FUTl9TVE9QICAgICAgMHg0MworI2RlZmluZSBFTkFCTEVfU0VMICAgICAgICAgICAweDQ0CisjZGVmaW5lIERJU0FCTEVfU0VMICAgICAgICAgIDB4NDUKKyNkZWZpbmUgU0VMRUNUX0FUTjMgICAgICAgICAgMHg0NgorI2RlZmluZSBSRVNFTEVDVDMgICAgICAgICAgICAweDQ3CisjZGVmaW5lIFRSQU5TRkVSX0lORk8gICAgICAgIDB4MTAKKyNkZWZpbmUgSU5JVF9DTURfQ09NUExFVEUgICAgMHgxMQorI2RlZmluZSBNU0dfQUNDRVBUICAgICAgICAgICAweDEyCisjZGVmaW5lIFRSQU5TRkVSX1BBRCAgICAgICAgIDB4MTgKKyNkZWZpbmUgU0VUX0FUTiAgICAgICAgICAgICAgMHgxYQorI2RlZmluZSBSRVNFVF9BVE4gICAgICAgICAgICAweDFiCisjZGVmaW5lIFNFTkRfTVNHICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgU0VORF9TVEFUVVMgICAgICAgICAgMHgyMQorI2RlZmluZSBTRU5EX0RBVEEgICAgICAgICAgICAweDIyCisjZGVmaW5lIERJU0NPTk5fU0VRICAgICAgICAgIDB4MjMKKyNkZWZpbmUgVEVSTUlOQVRFX1NFUSAgICAgICAgMHgyNAorI2RlZmluZSBUQVJHX0NNRF9DT01QTEVURSAgICAweDI1CisjZGVmaW5lIERJU0NPTk4gICAgICAgICAgICAgIDB4MjcKKyNkZWZpbmUgUkVDVl9NU0cgICAgICAgICAgICAgMHgyOAorI2RlZmluZSBSRUNWX0NNRCAgICAgICAgICAgICAweDI5CisjZGVmaW5lIFJFQ1ZfREFUQSAgICAgICAgICAgIDB4MmEKKyNkZWZpbmUgUkVDVl9DTURfU0VRICAgICAgICAgMHgyYgorI2RlZmluZSBUQVJHRVRfQUJPUlRfRE1BICAgICAweDA0CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiB0aGUgZm9sbG93aW5nIHdpbGwgc2V0IHRoZSBtb25pdG9yIGJvcmRlciBjb2xvciAodXNlZnVsIHRvIGZpbmQKKyAgIHdoZXJlIHNvbWV0aGluZyBjcmFzaGVkIG9yIGdldHMgc3R1Y2sgYXQgKi8KKy8qIDEgPSBibHVlCisgICAyID0gZ3JlZW4KKyAgIDMgPSBjeWFuCisgICA0ID0gcmVkCisgICA1ID0gbWFnZW50YQorICAgNiA9IHllbGxvdworICAgNyA9IHdoaXRlCisqLworCisjaWYgTkNSNTNDNDA2QV9ERUJVRworI2RlZmluZSBydHJjKGkpIHtpbmIoMHgzZGEpO291dGIoMHgzMSwweDNjMCk7b3V0YigoaSksMHgzYzApO30KKyNlbHNlCisjZGVmaW5lIHJ0cmMoaSkge30KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZW51bSBQaGFzZSB7CisJaWRsZSwKKwlkYXRhX291dCwKKwlkYXRhX2luLAorCWNvbW1hbmRfcGgsCisJc3RhdHVzX3BoLAorCW1lc3NhZ2Vfb3V0LAorCW1lc3NhZ2VfaW4KK307CisKKy8qIFN0YXRpYyBmdW5jdGlvbiBwcm90b3R5cGVzICovCitzdGF0aWMgdm9pZCBOQ1I1M2M0MDZhX2ludHIoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIGlycXJldHVybl90IGRvX05DUjUzYzQwNmFfaW50cihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgdm9pZCBjaGlwX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCBjYWxjX3BvcnRfYWRkcih2b2lkKTsKKyNpZm5kZWYgSVJRX0xFVgorc3RhdGljIGludCBpcnFfcHJvYmUodm9pZCk7CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmIFVTRV9CSU9TCitzdGF0aWMgdm9pZCAqYmlvc19iYXNlOworI2VuZGlmCisKKyNpZiBQT1JUX0JBU0UKK3N0YXRpYyBpbnQgcG9ydF9iYXNlID0gUE9SVF9CQVNFOworI2Vsc2UKK3N0YXRpYyBpbnQgcG9ydF9iYXNlOworI2VuZGlmCisKKyNpZiBJUlFfTEVWCitzdGF0aWMgaW50IGlycV9sZXZlbCA9IElSUV9MRVY7CisjZWxzZQorc3RhdGljIGludCBpcnFfbGV2ZWwgPSAtMTsJLyogMCBpcyAnbm8gaXJxJywgc28gdXNlIC0xIGZvciAndW5pbml0aWFsaXplZCcgKi8KKyNlbmRpZgorCisjaWYgVVNFX0RNQQorc3RhdGljIGludCBkbWFfY2hhbjsKKyNlbmRpZgorCisjaWYgVVNFX1BJTworc3RhdGljIGludCBmYXN0X3BpbyA9IFVTRV9GQVNUX1BJTzsKKyNlbmRpZgorCitzdGF0aWMgU2NzaV9DbW5kICpjdXJyZW50X1NDOworc3RhdGljIGNoYXIgaW5mb19tc2dbMjU2XTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogcG9zc2libGUgQklPUyBsb2NhdGlvbnMgKi8KKyNpZiBVU0VfQklPUworc3RhdGljIHZvaWQgKmFkZHJlc3Nlc1tdID0geworCSh2b2lkICopIDB4ZDgwMDAsCisJKHZvaWQgKikgMHhjODAwMAorfTsKKyNkZWZpbmUgQUREUkVTU19DT1VOVCAoc2l6ZW9mKCBhZGRyZXNzZXMgKSAvIHNpemVvZiggdW5zaWduZWQgKSkKKyNlbmRpZgkJCQkvKiBVU0VfQklPUyAqLworCisvKiBwb3NzaWJsZSBpL28gcG9ydCBhZGRyZXNzZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwb3J0c1tdID0geyAweDIzMCwgMHgzMzAsIDB4MjgwLCAweDI5MCwgMHgzMzAsIDB4MzQwLCAweDMwMCwgMHgzMTAsIDB4MzQ4LCAweDM1MCB9OworI2RlZmluZSBQT1JUX0NPVU5UIChzaXplb2YoIHBvcnRzICkgLyBzaXplb2YoIHVuc2lnbmVkIHNob3J0ICkpCisKKy8qIHBvc3NpYmxlIGludGVycnVwdCBjaGFubmVscyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGludHJzW10gPSB7IDEwLCAxMSwgMTIsIDE1IH07CisjZGVmaW5lIElOVFJfQ09VTlQgKHNpemVvZiggaW50cnMgKSAvIHNpemVvZiggdW5zaWduZWQgc2hvcnQgKSkKKworLyogc2lnbmF0dXJlcyBmb3IgTkNSIDUzYzQwNmEgYmFzZWQgY29udHJvbGxlcnMgKi8KKyNpZiBVU0VfQklPUworc3RydWN0IHNpZ25hdHVyZSB7CisJY2hhciAqc2lnbmF0dXJlOworCWludCBzaWdfb2Zmc2V0OworCWludCBzaWdfbGVuZ3RoOworfSBzaWduYXR1cmVzW10gX19pbml0ZGF0YSA9IHsKKwkvKiAgICAgICAgICAxICAgICAgICAgMiAgICAgICAgIDMgICAgICAgICA0ICAgICAgICAgNSAgICAgICAgIDYgKi8KKwkvKiAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAgKi8KKwl7CisiQ29weXJpZ2h0IChDKSBBY2N1bG9naWMsIEluYy5cclxuMi44TSBEaXNrZXR0ZSBFeHRlbnNpb24gQmlvcyB2ZXIgNC4wNC4wMyAwMy8wMS8xOTkzIiwgNjEsIDgyfSx9OworCisjZGVmaW5lIFNJR05BVFVSRV9DT1VOVCAoc2l6ZW9mKCBzaWduYXR1cmVzICkgLyBzaXplb2YoIHN0cnVjdCBzaWduYXR1cmUgKSkKKyNlbmRpZgkJCQkvKiBVU0VfQklPUyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogQ29udHJvbCBSZWdpc3RlciBTZXQgMCAqLworc3RhdGljIGludCBUQ19MU0I7CQkvKiB0cmFuc2ZlciBjb3VudGVyIGxzYiAgICAgICAgICovCitzdGF0aWMgaW50IFRDX01TQjsJCS8qIHRyYW5zZmVyIGNvdW50ZXIgbXNiICovCitzdGF0aWMgaW50IFNDU0lfRklGTzsJCS8qIHNjc2kgZmlmbyByZWdpc3RlciAgICovCitzdGF0aWMgaW50IENNRF9SRUc7CQkvKiBjb21tYW5kIHJlZ2lzdGVyICAgICAgICAgICAgICovCitzdGF0aWMgaW50IFNUQVRfUkVHOwkJLyogc3RhdHVzIHJlZ2lzdGVyICAgICAgICAgICAgICAqLworc3RhdGljIGludCBERVNUX0lEOwkJLyogc2VsZWN0aW9uL3Jlc2VsZWN0aW9uIGJ1cyBpZCAqLworc3RhdGljIGludCBJTlRfUkVHOwkJLyogaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAgICAqLworc3RhdGljIGludCBTUlRJTU9VVDsJCS8qIHNlbGVjdC9yZXNlbGVjdCB0aW1lb3V0IHJlZyAgKi8KK3N0YXRpYyBpbnQgU0VRX1JFRzsJCS8qIHNlcXVlbmNlIHN0ZXAgcmVnaXN0ZXIgICAgICAgKi8KK3N0YXRpYyBpbnQgU1lOQ1BSRDsJCS8qIHN5bmNocm9ub3VzIHRyYW5zZmVyIHBlcmlvZCAgKi8KK3N0YXRpYyBpbnQgRklGT19GTEFHUzsJCS8qIGluZGljYXRlcyAjIG9mIGJ5dGVzIGluIGZpZm8gKi8KK3N0YXRpYyBpbnQgU1lOQ09GRjsJCS8qIHN5bmNocm9ub3VzIG9mZnNldCByZWdpc3RlciAgKi8KK3N0YXRpYyBpbnQgQ09ORklHMTsJCS8qIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgICAgICAgKi8KK3N0YXRpYyBpbnQgQ0xLQ09OVjsJCS8qIGNsb2NrIGNvbnZlcnNpb24gcmVnICovCisJCQkJLypzdGF0aWMgaW50IFRFU1RSRUc7Ki8vKiB0ZXN0IG1vZGUgcmVnaXN0ZXIgICAgICAgICAgICovCitzdGF0aWMgaW50IENPTkZJRzI7CQkvKiBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgICAgICovCitzdGF0aWMgaW50IENPTkZJRzM7CQkvKiBDb25maWd1cmF0aW9uIDMgUmVnaXN0ZXIgICAgICovCitzdGF0aWMgaW50IENPTkZJRzQ7CQkvKiBDb25maWd1cmF0aW9uIDQgUmVnaXN0ZXIgICAgICovCitzdGF0aWMgaW50IFRDX0hJR0g7CQkvKiBUcmFuc2ZlciBDb3VudGVyIEhpZ2ggKi8KKwkJCQkvKnN0YXRpYyBpbnQgRklGT19CT1RUT007Ki8vKiBSZXNlcnZlIEZJRk8gYnl0ZSByZWdpc3RlciAgICovCisKKy8qIENvbnRyb2wgUmVnaXN0ZXIgU2V0IDEgKi8KKwkJCQkvKnN0YXRpYyBpbnQgSlVNUEVSX1NFTlNFOyovLyogSnVtcGVyIHNlbnNlIHBvcnQgcmVnIChyL3cpICovCisJCQkJLypzdGF0aWMgaW50IFNSQU1fUFRSOyovLyogU1JBTSBhZGRyZXNzIHBvaW50ZXIgcmVnIChyL3cpICovCisJCQkJLypzdGF0aWMgaW50IFNSQU1fREFUQTsqLy8qIFNSQU0gZGF0YSByZWdpc3RlciAoci93KSAqLworc3RhdGljIGludCBQSU9fRklGTzsJCS8qIFBJTyBGSUZPIHJlZ2lzdGVycyAoci93KSAqLworCQkJCS8qc3RhdGljIGludCBQSU9fRklGTzE7Ki8vKiAgKi8KKwkJCQkvKnN0YXRpYyBpbnQgUElPX0ZJRk8yOyovLyogICovCisJCQkJLypzdGF0aWMgaW50IFBJT19GSUZPMzsqLy8qICAqLworc3RhdGljIGludCBQSU9fU1RBVFVTOwkJLyogUElPIHN0YXR1cyAoci93KSAqLworCQkJCS8qc3RhdGljIGludCBBVEFfQ01EOyovLyogQVRBIGNvbW1hbmQvc3RhdHVzIHJlZyAoci93KSAqLworCQkJCS8qc3RhdGljIGludCBBVEFfRVJSOyovLyogQVRBIGZlYXR1cmVzL2Vycm9yIHJlZ2lzdGVyIChyL3cpICovCitzdGF0aWMgaW50IFBJT19GTEFHOwkJLyogUElPIGZsYWcgaW50ZXJydXB0IGVuYWJsZSAoci93KSAqLworc3RhdGljIGludCBDT05GSUc1OwkJLyogQ29uZmlndXJhdGlvbiA1IHJlZ2lzdGVyIChyL3cpICovCisJCQkJLypzdGF0aWMgaW50IFNJR05BVFVSRTsqLy8qIFNpZ25hdHVyZSBSZWdpc3RlciAocikgKi8KKwkJCQkvKnN0YXRpYyBpbnQgQ09ORklHNjsqLy8qIENvbmZpZ3VyYXRpb24gNiByZWdpc3RlciAocikgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmIFVTRV9ETUEKK3N0YXRpYyBfX2lubGluZV9fIGludCBOQ1I1M2M0MDZhX2RtYV9zZXR1cCh1bnNpZ25lZCBjaGFyICpwdHIsIHVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgY2hhciBtb2RlKQoreworCXVuc2lnbmVkIGxpbWl0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCisJVkRFQihwcmludGsoImRtYTogYmVmb3JlIGNvdW50PSVkICAgIiwgY291bnQpKTsKKwlpZiAoZG1hX2NoYW4gPD0gMykgeworCQlpZiAoY291bnQgPiA2NTUzNikKKwkJCWNvdW50ID0gNjU1MzY7CisJCWxpbWl0ID0gNjU1MzYgLSAoKCh1bnNpZ25lZCkgcHRyKSAmIDB4RkZGRik7CisJfSBlbHNlIHsKKwkJaWYgKGNvdW50ID4gKDY1NTM2IDw8IDEpKQorCQkJY291bnQgPSAoNjU1MzYgPDwgMSk7CisJCWxpbWl0ID0gKDY1NTM2IDw8IDEpIC0gKCgodW5zaWduZWQpIHB0cikgJiAweDFGRkZGKTsKKwl9CisKKwlpZiAoY291bnQgPiBsaW1pdCkKKwkJY291bnQgPSBsaW1pdDsKKworCVZERUIocHJpbnRrKCJhZnRlciBjb3VudD0lZFxuIiwgY291bnQpKTsKKwlpZiAoKGNvdW50ICYgMSkgfHwgKCgodW5zaWduZWQpIHB0cikgJiAxKSkKKwkJcGFuaWMoIk5DUjUzYzQwNmE6IGF0dGVtcHRlZCB1bmFsaWduZWQgRE1BIHRyYW5zZmVyXG4iKTsKKworCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKwlkaXNhYmxlX2RtYShkbWFfY2hhbik7CisJY2xlYXJfZG1hX2ZmKGRtYV9jaGFuKTsKKwlzZXRfZG1hX2FkZHIoZG1hX2NoYW4sIChsb25nKSBwdHIpOworCXNldF9kbWFfY291bnQoZG1hX2NoYW4sIGNvdW50KTsKKwlzZXRfZG1hX21vZGUoZG1hX2NoYW4sIG1vZGUpOworCWVuYWJsZV9kbWEoZG1hX2NoYW4pOworCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgTkNSNTNjNDA2YV9kbWFfd3JpdGUodW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJcmV0dXJuIE5DUjUzYzQwNmFfZG1hX3NldHVwKHNyYywgY291bnQsIERNQV9NT0RFX1dSSVRFKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IE5DUjUzYzQwNmFfZG1hX3JlYWQodW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJcmV0dXJuIE5DUjUzYzQwNmFfZG1hX3NldHVwKHNyYywgY291bnQsIERNQV9NT0RFX1JFQUQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgTkNSNTNjNDA2YV9kbWFfcmVzaWR1YWwodm9pZCkKK3sKKwlyZWdpc3RlciBpbnQgdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisJY2xlYXJfZG1hX2ZmKGRtYV9jaGFuKTsKKwl0bXAgPSBnZXRfZG1hX3Jlc2lkdWUoZG1hX2NoYW4pOworCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCisJcmV0dXJuIHRtcDsKK30KKyNlbmRpZgkJCQkvKiBVU0VfRE1BICovCisKKyNpZiBVU0VfUElPCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgTkNSNTNjNDA2YV9waW9fcmVhZCh1bnNpZ25lZCBjaGFyICpyZXF1ZXN0LCB1bnNpZ25lZCBpbnQgcmVxbGVuKQoreworCWludCBpOworCWludCBsZW47CQkvKiBjdXJyZW50IHNjc2kgZmlmbyBzaXplICovCisKKwlSRUcxOworCXdoaWxlIChyZXFsZW4pIHsKKwkJaSA9IGluYihQSU9fU1RBVFVTKTsKKwkJLyogICAgVkRFQihwcmludGsoInBpb19zdGF0dXM9JXhcbiIsIGkpKTsgKi8KKwkJaWYgKGkgJiAweDgwKQorCQkJcmV0dXJuIDA7CisKKwkJc3dpdGNoIChpICYgMHgxZSkgeworCQlkZWZhdWx0OgorCQljYXNlIDB4MTA6CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMHgwOgorCQkJbGVuID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDB4ODoKKwkJCWxlbiA9IDQyOworCQkJYnJlYWs7CisJCWNhc2UgMHhjOgorCQkJbGVuID0gODQ7CisJCQlicmVhazsKKwkJY2FzZSAweGU6CisJCQlsZW4gPSAxMjg7CisJCQlicmVhazsKKwkJfQorCisJCWlmICgoaSAmIDB4NDApICYmIGxlbiA9PSAwKSB7CS8qIGZpZm8gZW1wdHkgYW5kIGludGVycnVwdCBvY2N1cnJlZCAqLworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAobGVuKSB7CisJCQlpZiAobGVuID4gcmVxbGVuKQorCQkJCWxlbiA9IHJlcWxlbjsKKworCQkJaWYgKGZhc3RfcGlvICYmIGxlbiA+IDMpIHsKKwkJCQlpbnNsKFBJT19GSUZPLCByZXF1ZXN0LCBsZW4gPj4gMik7CisJCQkJcmVxdWVzdCArPSBsZW4gJiAweGZjOworCQkJCXJlcWxlbiAtPSBsZW4gJiAweGZjOworCQkJfSBlbHNlIHsKKwkJCQl3aGlsZSAobGVuLS0pIHsKKwkJCQkJKnJlcXVlc3QrKyA9IGluYihQSU9fRklGTyk7CisJCQkJCXJlcWxlbi0tOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IE5DUjUzYzQwNmFfcGlvX3dyaXRlKHVuc2lnbmVkIGNoYXIgKnJlcXVlc3QsIHVuc2lnbmVkIGludCByZXFsZW4pCit7CisJaW50IGkgPSAwOworCWludCBsZW47CQkvKiBjdXJyZW50IHNjc2kgZmlmbyBzaXplICovCisKKwlSRUcxOworCXdoaWxlIChyZXFsZW4gJiYgIShpICYgMHg0MCkpIHsKKwkJaSA9IGluYihQSU9fU1RBVFVTKTsKKwkJLyogICAgVkRFQihwcmludGsoInBpb19zdGF0dXM9JXhcbiIsIGkpKTsgKi8KKwkJaWYgKGkgJiAweDgwKQkvKiBlcnJvciAqLworCQkJcmV0dXJuIDA7CisKKwkJc3dpdGNoIChpICYgMHgxZSkgeworCQljYXNlIDB4MTA6CisJCQlsZW4gPSAxMjg7CisJCQlicmVhazsKKwkJY2FzZSAweDA6CisJCQlsZW4gPSA4NDsKKwkJCWJyZWFrOworCQljYXNlIDB4ODoKKwkJCWxlbiA9IDQyOworCQkJYnJlYWs7CisJCWNhc2UgMHhjOgorCQkJbGVuID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIDB4ZToKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChsZW4pIHsKKwkJCWlmIChsZW4gPiByZXFsZW4pCisJCQkJbGVuID0gcmVxbGVuOworCisJCQlpZiAoZmFzdF9waW8gJiYgbGVuID4gMykgeworCQkJCW91dHNsKFBJT19GSUZPLCByZXF1ZXN0LCBsZW4gPj4gMik7CisJCQkJcmVxdWVzdCArPSBsZW4gJiAweGZjOworCQkJCXJlcWxlbiAtPSBsZW4gJiAweGZjOworCQkJfSBlbHNlIHsKKwkJCQl3aGlsZSAobGVuLS0pIHsKKwkJCQkJb3V0YigqcmVxdWVzdCsrLCBQSU9fRklGTyk7CisJCQkJCXJlcWxlbi0tOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkJCQkvKiBVU0VfUElPICovCisKK3N0YXRpYyBpbnQgX19pbml0IE5DUjUzYzQwNmFfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqIHRwbnQpCit7CisJaW50IHByZXNlbnQgPSAwOworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gTlVMTDsKKyNpZm5kZWYgUE9SVF9CQVNFCisJaW50IGk7CisjZW5kaWYKKworI2lmIFVTRV9CSU9TCisJaW50IGlpLCBqajsKKwliaW9zX2Jhc2UgPSAwOworCS8qIGxvb2sgZm9yIGEgdmFsaWQgc2lnbmF0dXJlICovCisJZm9yIChpaSA9IDA7IGlpIDwgQUREUkVTU19DT1VOVCAmJiAhYmlvc19iYXNlOyBpaSsrKQorCQlmb3IgKGpqID0gMDsgKGpqIDwgU0lHTkFUVVJFX0NPVU5UKSAmJiAhYmlvc19iYXNlOyBqaisrKQorCQkJaWYgKCFtZW1jbXAoKHZvaWQgKikgYWRkcmVzc2VzW2lpXSArIHNpZ25hdHVyZXNbampdLnNpZ19vZmZzZXQsICh2b2lkICopIHNpZ25hdHVyZXNbampdLnNpZ25hdHVyZSwgKGludCkgc2lnbmF0dXJlc1tqal0uc2lnX2xlbmd0aCkpCisJCQkJYmlvc19iYXNlID0gYWRkcmVzc2VzW2lpXTsKKworCWlmICghYmlvc19iYXNlKSB7CisJCXByaW50aygiTkNSNTNjNDA2YTogQklPUyBzaWduYXR1cmUgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJREVCKHByaW50aygiTkNSNTNjNDA2YSBCSU9TIGZvdW5kIGF0IDB4JXhcbiIsICh1bnNpZ25lZCBpbnQpIGJpb3NfYmFzZSk7CisJICAgICk7CisjZW5kaWYJCQkJLyogVVNFX0JJT1MgKi8KKworI2lmZGVmIFBPUlRfQkFTRQorCWlmICghcmVxdWVzdF9yZWdpb24ocG9ydF9iYXNlLCAweDEwLCAiTkNSNTNjNDA2YSIpKQkvKiBwb3J0cyBhbHJlYWR5IHNuYXRjaGVkICovCisJCXBvcnRfYmFzZSA9IDA7CisKKyNlbHNlCQkJCS8qIGF1dG9kZXRlY3QgKi8KKwlpZiAocG9ydF9iYXNlKSB7CS8qIExJTE8gb3ZlcnJpZGUgKi8KKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwb3J0X2Jhc2UsIDB4MTAsICJOQ1I1M2M0MDZhIikpCisJCQlwb3J0X2Jhc2UgPSAwOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBQT1JUX0NPVU5UICYmICFwb3J0X2Jhc2U7IGkrKykgeworCQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwb3J0c1tpXSwgMHgxMCwgIk5DUjUzYzQwNmEiKSkgeworCQkJCURFQihwcmludGsoIk5DUjUzYzQwNmE6IHBvcnQgMHgleCBpbiB1c2VcbiIsIHBvcnRzW2ldKSk7CisJCQl9IGVsc2UgeworCQkJCVZERUIocHJpbnRrKCJOQ1I1M2M0MDZhOiBwb3J0IDB4JXggYXZhaWxhYmxlXG4iLCBwb3J0c1tpXSkpOworCQkJCW91dGIoQzVfSU1HLCBwb3J0c1tpXSArIDB4MGQpOwkvKiByZWcgc2V0IDEgKi8KKwkJCQlpZiAoKGluYihwb3J0c1tpXSArIDB4MGUpIF4gaW5iKHBvcnRzW2ldICsgMHgwZSkpID09IDcgJiYgKGluYihwb3J0c1tpXSArIDB4MGUpIF4gaW5iKHBvcnRzW2ldICsgMHgwZSkpID09IDcgJiYgKGluYihwb3J0c1tpXSArIDB4MGUpICYgMHhmOCkgPT0gMHg1OCkgeworCQkJCQlwb3J0X2Jhc2UgPSBwb3J0c1tpXTsKKwkJCQkJVkRFQihwcmludGsoIk5DUjUzYzQwNmE6IFNpZyByZWdpc3RlciB2YWxpZFxuIikpOworCQkJCQlWREVCKHByaW50aygicG9ydF9iYXNlPTB4JXhcbiIsIHBvcnRfYmFzZSkpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcmVsZWFzZV9yZWdpb24ocG9ydHNbaV0sIDB4MTApOworCQkJfQorCQl9CisJfQorI2VuZGlmCQkJCS8qIFBPUlRfQkFTRSAqLworCisJaWYgKCFwb3J0X2Jhc2UpIHsJLyogbm8gcG9ydHMgZm91bmQgKi8KKwkJcHJpbnRrKCJOQ1I1M2M0MDZhOiBubyBhdmFpbGFibGUgcG9ydHMgZm91bmRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlERUIocHJpbnRrKCJOQ1I1M2M0MDZhIGRldGVjdGVkXG4iKSk7CisKKwljYWxjX3BvcnRfYWRkcigpOworCWNoaXBfaW5pdCgpOworCisjaWZuZGVmIElSUV9MRVYKKwlpZiAoaXJxX2xldmVsIDwgMCkgewkvKiBMSUxPIG92ZXJyaWRlIGlmID49IDAgKi8KKwkJaXJxX2xldmVsID0gaXJxX3Byb2JlKCk7CisJCWlmIChpcnFfbGV2ZWwgPCAwKSB7CS8qIFRyb3VibGUgKi8KKwkJCXByaW50aygiTkNSNTNjNDA2YTogSVJRIHByb2JsZW0sIGlycV9sZXZlbD0lZCwgZ2l2aW5nIHVwXG4iLCBpcnFfbGV2ZWwpOworCQkJZ290byBlcnJfcmVsZWFzZTsKKwkJfQorCX0KKyNlbmRpZgorCisJREVCKHByaW50aygiTkNSNTNjNDA2YTogdXNpbmcgcG9ydF9iYXNlIDB4JXhcbiIsIHBvcnRfYmFzZSkpOworCisJcHJlc2VudCA9IDE7CisJdHBudC0+cHJvY19uYW1lID0gIk5DUjUzYzQwNmEiOworCisJc2hwbnQgPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIDApOworCWlmICghc2hwbnQpIHsKKwkJcHJpbnRrKCJOQ1I1M2M0MDZhOiBVbmFibGUgdG8gcmVnaXN0ZXIgaG9zdCwgZ2l2aW5nIHVwLlxuIik7CisJCWdvdG8gZXJyX3JlbGVhc2U7CisJfQorCisJaWYgKGlycV9sZXZlbCA+IDApIHsKKwkJaWYgKHJlcXVlc3RfaXJxKGlycV9sZXZlbCwgZG9fTkNSNTNjNDA2YV9pbnRyLCAwLCAiTkNSNTNjNDA2YSIsIHNocG50KSkgeworCQkJcHJpbnRrKCJOQ1I1M2M0MDZhOiB1bmFibGUgdG8gYWxsb2NhdGUgSVJRICVkXG4iLCBpcnFfbGV2ZWwpOworCQkJZ290byBlcnJfZnJlZV9zY3NpOworCQl9CisJCXRwbnQtPmNhbl9xdWV1ZSA9IDE7CisJCURFQihwcmludGsoIk5DUjUzYzQwNmE6IGFsbG9jYXRlZCBJUlEgJWRcbiIsIGlycV9sZXZlbCkpOworCX0gZWxzZSBpZiAoaXJxX2xldmVsID09IDApIHsKKwkJdHBudC0+Y2FuX3F1ZXVlID0gMDsKKwkJREVCKHByaW50aygiTkNSNTNjNDA2YTogTm8gaW50ZXJydXB0cyBkZXRlY3RlZFxuIikpOworCQlwcmludGsoIk5DUjUzYzQwNmEgZHJpdmVyIG5vIGxvbmdlciBzdXBwb3J0cyBwb2xsaW5nIGludGVyZmFjZVxuIik7CisJCXByaW50aygiUGxlYXNlIGVtYWlsIGxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorI2lmIFVTRV9ETUEKKwkJcHJpbnRrKCJOQ1I1M2M0MDZhOiBObyBpbnRlcnJ1cHRzIGZvdW5kIGFuZCBETUEgbW9kZSBkZWZpbmVkLiBHaXZpbmcgdXAuXG4iKTsKKyNlbmRpZgkJCQkvKiBVU0VfRE1BICovCisJCWdvdG8gZXJyX2ZyZWVfc2NzaTsKKwl9IGVsc2UgeworCQlERUIocHJpbnRrKCJOQ1I1M2M0MDZhOiBTaG91bGRuJ3QgZ2V0IGhlcmUhXG4iKSk7CisJCWdvdG8gZXJyX2ZyZWVfc2NzaTsKKwl9CisKKyNpZiBVU0VfRE1BCisJZG1hX2NoYW4gPSBETUFfQ0hBTjsKKwlpZiAocmVxdWVzdF9kbWEoZG1hX2NoYW4sICJOQ1I1M2M0MDZhIikgIT0gMCkgeworCQlwcmludGsoIk5DUjUzYzQwNmE6IHVuYWJsZSB0byBhbGxvY2F0ZSBETUEgY2hhbm5lbCAlZFxuIiwgZG1hX2NoYW4pOworCQlnb3RvIGVycl9mcmVlX2lycTsKKwl9CisKKwlERUIocHJpbnRrKCJBbGxvY2F0ZWQgRE1BIGNoYW5uZWwgJWRcbiIsIGRtYV9jaGFuKSk7CisjZW5kaWYJCQkJLyogVVNFX0RNQSAqLworCisJc2hwbnQtPmlycSA9IGlycV9sZXZlbDsKKwlzaHBudC0+aW9fcG9ydCA9IHBvcnRfYmFzZTsKKwlzaHBudC0+bl9pb19wb3J0ID0gMHgxMDsKKyNpZiBVU0VfRE1BCisJc2hwbnQtPmRtYSA9IGRtYV9jaGFuOworI2VuZGlmCisKKyNpZiBVU0VfRE1BCisJc3ByaW50ZihpbmZvX21zZywgIk5DUjUzYzQwNmEgYXQgMHgleCwgSVJRICVkLCBETUEgY2hhbm5lbCAlZC4iLCBwb3J0X2Jhc2UsIGlycV9sZXZlbCwgZG1hX2NoYW4pOworI2Vsc2UKKwlzcHJpbnRmKGluZm9fbXNnLCAiTkNSNTNjNDA2YSBhdCAweCV4LCBJUlEgJWQsICVzIFBJTyBtb2RlLiIsIHBvcnRfYmFzZSwgaXJxX2xldmVsLCBmYXN0X3BpbyA/ICJmYXN0IiA6ICJzbG93Iik7CisjZW5kaWYKKworCXJldHVybiAocHJlc2VudCk7CisKKyNpZiBVU0VfRE1BCisgICAgICBlcnJfZnJlZV9pcnE6CisJaWYgKGlycV9sZXZlbCkKKwkJZnJlZV9pcnEoaXJxX2xldmVsLCBzaHBudCk7CisjZW5kaWYKKyAgICAgIGVycl9mcmVlX3Njc2k6CisJc2NzaV91bnJlZ2lzdGVyKHNocG50KTsKKyAgICAgIGVycl9yZWxlYXNlOgorCXJlbGVhc2VfcmVnaW9uKHBvcnRfYmFzZSwgMHgxMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgTkNSNTNjNDA2YV9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCWlmIChzaG9zdC0+aXJxKQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBOVUxMKTsKKyNpZmRlZiBVU0VfRE1BCisJaWYgKHNob3N0LT5kbWFfY2hhbm5lbCAhPSAweGZmKQorCQlmcmVlX2RtYShzaG9zdC0+ZG1hX2NoYW5uZWwpOworI2VuZGlmCisJaWYgKHNob3N0LT5pb19wb3J0ICYmIHNob3N0LT5uX2lvX3BvcnQpCisJCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKKworCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxlZCBmcm9tIGluaXQvbWFpbi5jICovCitzdGF0aWMgaW50IF9faW5pdCBOQ1I1M2M0MDZhX3NldHVwKGNoYXIgKnN0cikKK3sKKwlzdGF0aWMgc2l6ZV90IHNldHVwX2lkeCA9IDA7CisJc2l6ZV90IGk7CisJaW50IGludHNbNF07CisKKwlERUIocHJpbnRrKCJOQ1I1M2M0MDZhOiBTZXR1cCBjYWxsZWRcbiIpOworCSAgICApOworCisJaWYgKHNldHVwX2lkeCA+PSBQT1JUX0NPVU5UIC0gMSkgeworCQlwcmludGsoIk5DUjUzYzQwNmE6IFNldHVwIGNhbGxlZCB0b28gbWFueSB0aW1lcy4gIEJhZCBMSUxPIHBhcmFtcz9cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJZ2V0X29wdGlvbnMoc3RyLCA0LCBpbnRzKTsKKwlpZiAoaW50c1swXSA8IDEgfHwgaW50c1swXSA+IDMpIHsKKwkJcHJpbnRrKCJOQ1I1M2M0MDZhOiBNYWxmb3JtZWQgY29tbWFuZCBsaW5lXG4iKTsKKwkJcHJpbnRrKCJOQ1I1M2M0MDZhOiBVc2FnZTogbmNyNTNjNDA2YT08UE9SVEJBU0U+Wyw8SVJRPlssPEZBU1RQSU8+XV1cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJZm9yIChpID0gMDsgaSA8IFBPUlRfQ09VTlQgJiYgIXBvcnRfYmFzZTsgaSsrKQorCQlpZiAocG9ydHNbaV0gPT0gaW50c1sxXSkgeworCQkJcG9ydF9iYXNlID0gaW50c1sxXTsKKwkJCURFQihwcmludGsoIk5DUjUzYzQwNmE6IFNwZWNpZmllZCBwb3J0X2Jhc2UgMHgleFxuIiwgcG9ydF9iYXNlKTsKKwkJCSAgICApCisJCX0KKwlpZiAoIXBvcnRfYmFzZSkgeworCQlwcmludGsoIk5DUjUzYzQwNmE6IEludmFsaWQgUE9SVEJBU0UgMHgleCBzcGVjaWZpZWRcbiIsIGludHNbMV0pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaW50c1swXSA+IDEpIHsKKwkJaWYgKGludHNbMl0gPT0gMCkgeworCQkJaXJxX2xldmVsID0gMDsKKwkJCURFQihwcmludGsoIk5DUjUzYzQwNmE6IFNwZWNpZmllZCBpcnEgJWRcbiIsIGlycV9sZXZlbCk7CisJCQkgICAgKQorCQl9IGVsc2UKKwkJCWZvciAoaSA9IDA7IGkgPCBJTlRSX0NPVU5UICYmIGlycV9sZXZlbCA8IDA7IGkrKykKKwkJCQlpZiAoaW50cnNbaV0gPT0gaW50c1syXSkgeworCQkJCQlpcnFfbGV2ZWwgPSBpbnRzWzJdOworCQkJCQlERUIocHJpbnRrKCJOQ1I1M2M0MDZhOiBTcGVjaWZpZWQgaXJxICVkXG4iLCBwb3J0X2Jhc2UpOworCQkJCQkgICAgKQorCQkJCX0KKwkJaWYgKGlycV9sZXZlbCA8IDApCisJCQlwcmludGsoIk5DUjUzYzQwNmE6IEludmFsaWQgSVJRICVkIHNwZWNpZmllZFxuIiwgaW50c1syXSk7CisJfQorCisJaWYgKGludHNbMF0gPiAyKQorCQlmYXN0X3BpbyA9IGludHNbM107CisKKwlERUIocHJpbnRrKCJOQ1I1M2M0MDZhOiBwb3J0X2Jhc2U9MHgleCwgaXJxPSVkLCBmYXN0X3Bpbz0lZFxuIiwgcG9ydF9iYXNlLCBpcnFfbGV2ZWwsIGZhc3RfcGlvKTspCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoIm5jcjUzYzQwNmE9IiwgTkNSNTNjNDA2YV9zZXR1cCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpOQ1I1M2M0MDZhX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqU0Nob3N0KQoreworCURFQihwcmludGsoIk5DUjUzYzQwNmFfaW5mbyBjYWxsZWRcbiIpKTsKKwlyZXR1cm4gKGluZm9fbXNnKTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIHdhaXRfaW50cih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaSA9IGppZmZpZXMgKyBXQVRDSERPRzsKKworCXdoaWxlICh0aW1lX2FmdGVyKGksIGppZmZpZXMpICYmICEoaW5iKFNUQVRfUkVHKSAmIDB4ZTApKSB7CS8qIHdhaXQgZm9yIGEgcHNldWRvLWludGVycnVwdCAqLworCQljcHVfcmVsYXgoKTsKKwkJYmFycmllcigpOworCX0KKworCWlmICh0aW1lX2JlZm9yZV9lcShpLCBqaWZmaWVzKSkgewkvKiBUaW1lZCBvdXQgKi8KKwkJcnRyYygwKTsKKwkJY3VycmVudF9TQy0+cmVzdWx0ID0gRElEX1RJTUVfT1VUIDw8IDE2OworCQljdXJyZW50X1NDLT5TQ3AucGhhc2UgPSBpZGxlOworCQljdXJyZW50X1NDLT5zY3NpX2RvbmUoY3VycmVudF9TQyk7CisJCXJldHVybjsKKwl9CisKKwlOQ1I1M2M0MDZhX2ludHIoMCwgTlVMTCwgTlVMTCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBOQ1I1M2M0MDZhX3F1ZXVlKFNjc2lfQ21uZCAqIFNDcG50LCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSkKK3sKKwlpbnQgaTsKKworCVZERUIocHJpbnRrKCJOQ1I1M2M0MDZhX3F1ZXVlIGNhbGxlZFxuIikpOworCURFQihwcmludGsoImNtZD0lMDJ4LCBjbWRfbGVuPSUwMngsIHRhcmdldD0lMDJ4LCBsdW49JTAyeCwgYnVmZmxlbj0lZFxuIiwgU0NwbnQtPmNtbmRbMF0sIFNDcG50LT5jbWRfbGVuLCBTQ3BudC0+dGFyZ2V0LCBTQ3BudC0+bHVuLCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuKSk7CisKKyNpZiAwCisJVkRFQihmb3IgKGkgPSAwOyBpIDwgU0NwbnQtPmNtZF9sZW47IGkrKykKKwkgICAgIHByaW50aygiY21kWyVkXT0lMDJ4ICAiLCBpLCBTQ3BudC0+Y21uZFtpXSkpOworCVZERUIocHJpbnRrKCJcbiIpKTsKKyNlbmRpZgorCisJY3VycmVudF9TQyA9IFNDcG50OworCWN1cnJlbnRfU0MtPnNjc2lfZG9uZSA9IGRvbmU7CisJY3VycmVudF9TQy0+U0NwLnBoYXNlID0gY29tbWFuZF9waDsKKwljdXJyZW50X1NDLT5TQ3AuU3RhdHVzID0gMDsKKwljdXJyZW50X1NDLT5TQ3AuTWVzc2FnZSA9IDA7CisKKwkvKiBXZSBhcmUgbG9ja2VkIGhlcmUgYWxyZWFkeSBieSB0aGUgbWlkIGxheWVyICovCisJUkVHMDsKKwlvdXRiKFNDcG50LT5kZXZpY2UtPmlkLCBERVNUX0lEKTsJLyogc2V0IGRlc3RpbmF0aW9uICovCisJb3V0YihGTFVTSF9GSUZPLCBDTURfUkVHKTsJLyogcmVzZXQgdGhlIGZpZm9zICovCisKKwlmb3IgKGkgPSAwOyBpIDwgU0NwbnQtPmNtZF9sZW47IGkrKykgeworCQlvdXRiKFNDcG50LT5jbW5kW2ldLCBTQ1NJX0ZJRk8pOworCX0KKwlvdXRiKFNFTEVDVF9OT19BVE4sIENNRF9SRUcpOworCisJcnRyYygxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBOQ1I1M2M0MDZhX2Fib3J0KFNjc2lfQ21uZCAqIFNDcG50KQoreworCURFQihwcmludGsoIk5DUjUzYzQwNmFfYWJvcnQgY2FsbGVkXG4iKSk7CisJcmV0dXJuIEZBSUxFRDsJCS8qIERvbid0IGtub3cgaG93IHRvIGFib3J0ICovCit9CisKK3N0YXRpYyBpbnQgTkNSNTNjNDA2YV9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50KQoreworCURFQihwcmludGsoIk5DUjUzYzQwNmFfcmVzZXQgY2FsbGVkXG4iKSk7CisJb3V0YihDNF9JTUcsIENPTkZJRzQpOwkvKiBTZWxlY3QgcmVnIHNldCAwICovCisJb3V0YihDSElQX1JFU0VULCBDTURfUkVHKTsKKwlvdXRiKFNDU0lfTk9QLCBDTURfUkVHKTsJLyogcmVxdWlyZWQgYWZ0ZXIgcmVzZXQgKi8KKwlvdXRiKFNDU0lfUkVTRVQsIENNRF9SRUcpOworCWNoaXBfaW5pdCgpOworCisJcnRyYygyKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBOQ1I1M2M0MDZhX2RldmljZV9yZXNldChTY3NpX0NtbmQgKiBTQ3BudCkKK3sKKwlyZXR1cm4gRkFJTEVEOworfQorCitzdGF0aWMgaW50IE5DUjUzYzQwNmFfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50KQoreworCXJldHVybiBGQUlMRUQ7Cit9CisKK3N0YXRpYyBpbnQgTkNSNTNjNDA2YV9iaW9zcGFybShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRpc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LAorCQkJICAgICAgIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKmluZm9fYXJyYXkpCit7CisJaW50IHNpemU7CisKKwlERUIocHJpbnRrKCJOQ1I1M2M0MDZhX2Jpb3NwYXJtIGNhbGxlZFxuIikpOworCisJc2l6ZSA9IGNhcGFjaXR5OworCWluZm9fYXJyYXlbMF0gPSA2NDsJLyogaGVhZHMgKi8KKwlpbmZvX2FycmF5WzFdID0gMzI7CS8qIHNlY3RvcnMgKi8KKwlpbmZvX2FycmF5WzJdID0gc2l6ZSA+PiAxMTsJLyogY3lsaW5kZXJzICovCisJaWYgKGluZm9fYXJyYXlbMl0gPiAxMDI0KSB7CS8qIGJpZyBkaXNrICovCisJCWluZm9fYXJyYXlbMF0gPSAyNTU7CisJCWluZm9fYXJyYXlbMV0gPSA2MzsKKwkJaW5mb19hcnJheVsyXSA9IHNpemUgLyAoMjU1ICogNjMpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IGRvX05DUjUzYzQwNmFfaW50cihpbnQgdW51c2VkLCB2b2lkICpkZXZfaWQsCisJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IFNjc2lfSG9zdCAqZGV2ID0gZGV2X2lkOworCisJc3Bpbl9sb2NrX2lycXNhdmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlOQ1I1M2M0MDZhX2ludHIoMCwgZGV2X2lkLCByZWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBOQ1I1M2M0MDZhX2ludHIoaW50IHVudXNlZCwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlERUIodW5zaWduZWQgY2hhciBmaWZvX3NpemU7CisJICAgICkKKwkgICAgREVCKHVuc2lnbmVkIGNoYXIgc2VxX3JlZzsKKwkgICAgKQorCXVuc2lnbmVkIGNoYXIgc3RhdHVzLCBpbnRfcmVnOworI2lmIFVTRV9QSU8KKwl1bnNpZ25lZCBjaGFyIHBpb19zdGF0dXM7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3Q7CisJdW5zaWduZWQgaW50IHNnY291bnQ7CisjZW5kaWYKKworCVZERUIocHJpbnRrKCJOQ1I1M2M0MDZhX2ludHIgY2FsbGVkXG4iKSk7CisKKyNpZiBVU0VfUElPCisJUkVHMTsKKwlwaW9fc3RhdHVzID0gaW5iKFBJT19TVEFUVVMpOworI2VuZGlmCisJUkVHMDsKKwlzdGF0dXMgPSBpbmIoU1RBVF9SRUcpOworCURFQihzZXFfcmVnID0gaW5iKFNFUV9SRUcpKTsKKwlpbnRfcmVnID0gaW5iKElOVF9SRUcpOworCURFQihmaWZvX3NpemUgPSBpbmIoRklGT19GTEFHUykgJiAweDFmKTsKKworI2lmIE5DUjUzQzQwNkFfREVCVUcKKwlwcmludGsoInN0YXR1cz0lMDJ4LCBzZXFfcmVnPSUwMngsIGludF9yZWc9JTAyeCwgZmlmb19zaXplPSUwMngiLCBzdGF0dXMsIHNlcV9yZWcsIGludF9yZWcsIGZpZm9fc2l6ZSk7CisjaWYgKFVTRV9ETUEpCisJcHJpbnRrKCJcbiIpOworI2Vsc2UKKwlwcmludGsoIiwgcGlvPSUwMnhcbiIsIHBpb19zdGF0dXMpOworI2VuZGlmCQkJCS8qIFVTRV9ETUEgKi8KKyNlbmRpZgkJCQkvKiBOQ1I1M0M0MDZBX0RFQlVHICovCisKKwlpZiAoaW50X3JlZyAmIDB4ODApIHsJLyogU0NTSSByZXNldCBpbnRyICovCisJCXJ0cmMoMyk7CisJCURFQihwcmludGsoIk5DUjUzYzQwNmE6IHJlc2V0IGludHIgcmVjZWl2ZWRcbiIpKTsKKwkJY3VycmVudF9TQy0+U0NwLnBoYXNlID0gaWRsZTsKKwkJY3VycmVudF9TQy0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQljdXJyZW50X1NDLT5zY3NpX2RvbmUoY3VycmVudF9TQyk7CisJCXJldHVybjsKKwl9CisjaWYgVVNFX1BJTworCWlmIChwaW9fc3RhdHVzICYgMHg4MCkgeworCQlwcmludGsoIk5DUjUzQzQwNkE6IFdhcm5pbmc6IFBJTyBlcnJvciFcbiIpOworCQljdXJyZW50X1NDLT5TQ3AucGhhc2UgPSBpZGxlOworCQljdXJyZW50X1NDLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCWN1cnJlbnRfU0MtPnNjc2lfZG9uZShjdXJyZW50X1NDKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgkJCQkvKiBVU0VfUElPICovCisKKwlpZiAoc3RhdHVzICYgMHgyMCkgewkvKiBQYXJpdHkgZXJyb3IgKi8KKwkJcHJpbnRrKCJOQ1I1M2M0MDZhOiBXYXJuaW5nOiBwYXJpdHkgZXJyb3IhXG4iKTsKKwkJY3VycmVudF9TQy0+U0NwLnBoYXNlID0gaWRsZTsKKwkJY3VycmVudF9TQy0+cmVzdWx0ID0gRElEX1BBUklUWSA8PCAxNjsKKwkJY3VycmVudF9TQy0+c2NzaV9kb25lKGN1cnJlbnRfU0MpOworCQlyZXR1cm47CisJfQorCisJaWYgKHN0YXR1cyAmIDB4NDApIHsJLyogR3Jvc3MgZXJyb3IgKi8KKwkJcHJpbnRrKCJOQ1I1M2M0MDZhOiBXYXJuaW5nOiBncm9zcyBlcnJvciFcbiIpOworCQljdXJyZW50X1NDLT5TQ3AucGhhc2UgPSBpZGxlOworCQljdXJyZW50X1NDLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCWN1cnJlbnRfU0MtPnNjc2lfZG9uZShjdXJyZW50X1NDKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpbnRfcmVnICYgMHgyMCkgewkvKiBEaXNjb25uZWN0ICovCisJCURFQihwcmludGsoIk5DUjUzYzQwNmE6IGRpc2Nvbm5lY3QgaW50ciByZWNlaXZlZFxuIikpOworCQlpZiAoY3VycmVudF9TQy0+U0NwLnBoYXNlICE9IG1lc3NhZ2VfaW4pIHsJLyogVW5leHBlY3RlZCBkaXNjb25uZWN0ICovCisJCQljdXJyZW50X1NDLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJfSBlbHNlIHsJLyogQ29tbWFuZCBjb21wbGV0ZSwgcmV0dXJuIHN0YXR1cyBhbmQgbWVzc2FnZSAqLworCQkJY3VycmVudF9TQy0+cmVzdWx0ID0gKGN1cnJlbnRfU0MtPlNDcC5TdGF0dXMgJiAweGZmKQorCQkJICAgIHwgKChjdXJyZW50X1NDLT5TQ3AuTWVzc2FnZSAmIDB4ZmYpIDw8IDgpIHwgKERJRF9PSyA8PCAxNik7CisJCX0KKworCQlydHJjKDApOworCQljdXJyZW50X1NDLT5TQ3AucGhhc2UgPSBpZGxlOworCQljdXJyZW50X1NDLT5zY3NpX2RvbmUoY3VycmVudF9TQyk7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKHN0YXR1cyAmIDB4MDcpIHsJLyogc2NzaSBwaGFzZSAqLworCWNhc2UgMHgwMDoJCS8qIERBVEEtT1VUICovCisJCWlmIChpbnRfcmVnICYgMHgxMCkgewkvKiBUYXJnZXQgcmVxdWVzdGluZyBpbmZvIHRyYW5zZmVyICovCisJCQlydHJjKDUpOworCQkJY3VycmVudF9TQy0+U0NwLnBoYXNlID0gZGF0YV9vdXQ7CisJCQlWREVCKHByaW50aygiTkNSNTNjNDA2YTogRGF0YS1PdXQgcGhhc2VcbiIpKTsKKwkJCW91dGIoRkxVU0hfRklGTywgQ01EX1JFRyk7CisJCQlMT0FEX0RNQV9DT1VOVChjdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZsZW4pOwkvKiBNYXggdHJhbnNmZXIgc2l6ZSAqLworI2lmIFVTRV9ETUEJCQkvKiBObyBzL2cgc3VwcG9ydCBmb3IgRE1BICovCisJCQlOQ1I1M2M0MDZhX2RtYV93cml0ZShjdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZlciwgY3VycmVudF9TQy0+cmVxdWVzdF9idWZmbGVuKTsKKyNlbmRpZgkJCQkvKiBVU0VfRE1BICovCisJCQlvdXRiKFRSQU5TRkVSX0lORk8gfCBETUFfT1AsIENNRF9SRUcpOworI2lmIFVTRV9QSU8KKwkJCWlmICghY3VycmVudF9TQy0+dXNlX3NnKQkvKiBEb24ndCB1c2Ugc2NhdHRlci1nYXRoZXIgKi8KKwkJCQlOQ1I1M2M0MDZhX3Bpb193cml0ZShjdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZlciwgY3VycmVudF9TQy0+cmVxdWVzdF9idWZmbGVuKTsKKwkJCWVsc2UgewkvKiB1c2Ugc2NhdHRlci1nYXRoZXIgKi8KKwkJCQlzZ2NvdW50ID0gY3VycmVudF9TQy0+dXNlX3NnOworCQkJCXNnbGlzdCA9IGN1cnJlbnRfU0MtPnJlcXVlc3RfYnVmZmVyOworCQkJCXdoaWxlIChzZ2NvdW50LS0pIHsKKwkJCQkJTkNSNTNjNDA2YV9waW9fd3JpdGUocGFnZV9hZGRyZXNzKHNnbGlzdC0+cGFnZSkgKyBzZ2xpc3QtPm9mZnNldCwgc2dsaXN0LT5sZW5ndGgpOworCQkJCQlzZ2xpc3QrKzsKKwkJCQl9CisJCQl9CisJCQlSRUcwOworI2VuZGlmCQkJCS8qIFVTRV9QSU8gKi8KKwkJfQorCQlicmVhazsKKworCWNhc2UgMHgwMToJCS8qIERBVEEtSU4gKi8KKwkJaWYgKGludF9yZWcgJiAweDEwKSB7CS8qIFRhcmdldCByZXF1ZXN0aW5nIGluZm8gdHJhbnNmZXIgKi8KKwkJCXJ0cmMoNik7CisJCQljdXJyZW50X1NDLT5TQ3AucGhhc2UgPSBkYXRhX2luOworCQkJVkRFQihwcmludGsoIk5DUjUzYzQwNmE6IERhdGEtSW4gcGhhc2VcbiIpKTsKKwkJCW91dGIoRkxVU0hfRklGTywgQ01EX1JFRyk7CisJCQlMT0FEX0RNQV9DT1VOVChjdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZsZW4pOwkvKiBNYXggdHJhbnNmZXIgc2l6ZSAqLworI2lmIFVTRV9ETUEJCQkvKiBObyBzL2cgc3VwcG9ydCBmb3IgRE1BICovCisJCQlOQ1I1M2M0MDZhX2RtYV9yZWFkKGN1cnJlbnRfU0MtPnJlcXVlc3RfYnVmZmVyLCBjdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZsZW4pOworI2VuZGlmCQkJCS8qIFVTRV9ETUEgKi8KKwkJCW91dGIoVFJBTlNGRVJfSU5GTyB8IERNQV9PUCwgQ01EX1JFRyk7CisjaWYgVVNFX1BJTworCQkJaWYgKCFjdXJyZW50X1NDLT51c2Vfc2cpCS8qIERvbid0IHVzZSBzY2F0dGVyLWdhdGhlciAqLworCQkJCU5DUjUzYzQwNmFfcGlvX3JlYWQoY3VycmVudF9TQy0+cmVxdWVzdF9idWZmZXIsIGN1cnJlbnRfU0MtPnJlcXVlc3RfYnVmZmxlbik7CisJCQllbHNlIHsJLyogVXNlIHNjYXR0ZXItZ2F0aGVyICovCisJCQkJc2djb3VudCA9IGN1cnJlbnRfU0MtPnVzZV9zZzsKKwkJCQlzZ2xpc3QgPSBjdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJCQl3aGlsZSAoc2djb3VudC0tKSB7CisJCQkJCU5DUjUzYzQwNmFfcGlvX3JlYWQocGFnZV9hZGRyZXNzKHNnbGlzdC0+cGFnZSkgKyBzZ2xpc3QtPm9mZnNldCwgc2dsaXN0LT5sZW5ndGgpOworCQkJCQlzZ2xpc3QrKzsKKwkJCQl9CisJCQl9CisJCQlSRUcwOworI2VuZGlmCQkJCS8qIFVTRV9QSU8gKi8KKwkJfQorCQlicmVhazsKKworCWNhc2UgMHgwMjoJCS8qIENPTU1BTkQgKi8KKwkJY3VycmVudF9TQy0+U0NwLnBoYXNlID0gY29tbWFuZF9waDsKKwkJcHJpbnRrKCJOQ1I1M2M0MDZhOiBXYXJuaW5nOiBVbmtub3duIGludGVycnVwdCBvY2N1cnJlZCBpbiBjb21tYW5kIHBoYXNlIVxuIik7CisJCWJyZWFrOworCisJY2FzZSAweDAzOgkJLyogU1RBVFVTICovCisJCXJ0cmMoNyk7CisJCWN1cnJlbnRfU0MtPlNDcC5waGFzZSA9IHN0YXR1c19waDsKKwkJVkRFQihwcmludGsoIk5DUjUzYzQwNmE6IFN0YXR1cyBwaGFzZVxuIikpOworCQlvdXRiKEZMVVNIX0ZJRk8sIENNRF9SRUcpOworCQlvdXRiKElOSVRfQ01EX0NPTVBMRVRFLCBDTURfUkVHKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDQ6CQkvKiBSZXNlcnZlZCAqLworCWNhc2UgMHgwNToJCS8qIFJlc2VydmVkICovCisJCXByaW50aygiTkNSNTNjNDA2YTogV0FSTklORzogUmVzZXJ2ZWQgcGhhc2UhISFcbiIpOworCQlicmVhazsKKworCWNhc2UgMHgwNjoJCS8qIE1FU1NBR0UtT1VUICovCisJCURFQihwcmludGsoIk5DUjUzYzQwNmE6IE1lc3NhZ2UtT3V0IHBoYXNlXG4iKSk7CisJCWN1cnJlbnRfU0MtPlNDcC5waGFzZSA9IG1lc3NhZ2Vfb3V0OworCQlvdXRiKFNFVF9BVE4sIENNRF9SRUcpOwkvKiBSZWplY3QgdGhlIG1lc3NhZ2UgKi8KKwkJb3V0YihNU0dfQUNDRVBULCBDTURfUkVHKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDc6CQkvKiBNRVNTQUdFLUlOICovCisJCXJ0cmMoNCk7CisJCVZERUIocHJpbnRrKCJOQ1I1M2M0MDZhOiBNZXNzYWdlLUluIHBoYXNlXG4iKSk7CisJCWN1cnJlbnRfU0MtPlNDcC5waGFzZSA9IG1lc3NhZ2VfaW47CisKKwkJY3VycmVudF9TQy0+U0NwLlN0YXR1cyA9IGluYihTQ1NJX0ZJRk8pOworCQljdXJyZW50X1NDLT5TQ3AuTWVzc2FnZSA9IGluYihTQ1NJX0ZJRk8pOworCisJCVZERUIocHJpbnRrKCJTQ1NJIEZJRk8gc2l6ZT0lZFxuIiwgaW5iKEZJRk9fRkxBR1MpICYgMHgxZikpOworCQlERUIocHJpbnRrKCJTdGF0dXMgPSAlMDJ4ICBNZXNzYWdlID0gJTAyeFxuIiwgY3VycmVudF9TQy0+U0NwLlN0YXR1cywgY3VycmVudF9TQy0+U0NwLk1lc3NhZ2UpKTsKKworCQlpZiAoY3VycmVudF9TQy0+U0NwLk1lc3NhZ2UgPT0gU0FWRV9QT0lOVEVSUyB8fCBjdXJyZW50X1NDLT5TQ3AuTWVzc2FnZSA9PSBESVNDT05ORUNUKSB7CisJCQlvdXRiKFNFVF9BVE4sIENNRF9SRUcpOwkvKiBSZWplY3QgbWVzc2FnZSAqLworCQkJREVCKHByaW50aygiRGlzY2FyZGluZyBTQVZFX1BPSU5URVJTIG1lc3NhZ2VcbiIpKTsKKwkJfQorCQlvdXRiKE1TR19BQ0NFUFQsIENNRF9SRUcpOworCQlicmVhazsKKwl9Cit9CisKKyNpZm5kZWYgSVJRX0xFVgorc3RhdGljIGludCBpcnFfcHJvYmUodm9pZCkKK3sKKwlpbnQgaXJxcywgaXJxOworCXVuc2lnbmVkIGxvbmcgaTsKKworCWluYihJTlRfUkVHKTsJCS8qIGNsZWFyIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKwlpcnFzID0gcHJvYmVfaXJxX29uKCk7CisKKwkvKiBJbnZhbGlkIGNvbW1hbmQgd2lsbCBjYXVzZSBhbiBpbnRlcnJ1cHQgKi8KKwlSRUcwOworCW91dGIoMHhmZiwgQ01EX1JFRyk7CisKKwkvKiBXYWl0IGZvciB0aGUgaW50ZXJydXB0IHRvIG9jY3VyICovCisJaSA9IGppZmZpZXMgKyBXQVRDSERPRzsKKwl3aGlsZSAodGltZV9hZnRlcihpLCBqaWZmaWVzKSAmJiAhKGluYihTVEFUX1JFRykgJiAweDgwKSkKKwkJYmFycmllcigpOworCWlmICh0aW1lX2JlZm9yZV9lcShpLCBqaWZmaWVzKSkgewkvKiBUaW1lZCBvdXQsIG11c3QgYmUgaGFyZHdhcmUgdHJvdWJsZSAqLworCQlwcm9iZV9pcnFfb2ZmKGlycXMpOworCQlyZXR1cm4gLTE7CisJfQorCisJaXJxID0gcHJvYmVfaXJxX29mZihpcnFzKTsKKworCS8qIEtpY2sgdGhlIGNoaXAgKi8KKwlvdXRiKENISVBfUkVTRVQsIENNRF9SRUcpOworCW91dGIoU0NTSV9OT1AsIENNRF9SRUcpOworCWNoaXBfaW5pdCgpOworCisJcmV0dXJuIGlycTsKK30KKyNlbmRpZgkJCQkvKiBJUlFfTEVWICovCisKK3N0YXRpYyB2b2lkIGNoaXBfaW5pdCh2b2lkKQoreworCVJFRzE7CisjaWYgVVNFX0RNQQorCW91dGIoMHgwMCwgUElPX1NUQVRVUyk7CisjZWxzZQkJCQkvKiBVU0VfUElPICovCisJb3V0YigweDAxLCBQSU9fU1RBVFVTKTsKKyNlbmRpZgorCW91dGIoMHgwMCwgUElPX0ZMQUcpOworCisJb3V0YihDNF9JTUcsIENPTkZJRzQpOwkvKiBSRUcwOyAqLworCW91dGIoQzNfSU1HLCBDT05GSUczKTsKKwlvdXRiKEMyX0lNRywgQ09ORklHMik7CisJb3V0YihDMV9JTUcsIENPTkZJRzEpOworCisJb3V0YigweDA1LCBDTEtDT05WKTsJLyogY2xvY2sgY29udmVyc2lvbiBmYWN0b3IgKi8KKwlvdXRiKDB4OUMsIFNSVElNT1VUKTsJLyogU2VsZWN0aW9uIHRpbWVvdXQgKi8KKwlvdXRiKDB4MDUsIFNZTkNQUkQpOwkvKiBTeW5jaHJvbm91cyB0cmFuc2ZlciBwZXJpb2QgKi8KKwlvdXRiKFNZTkNfTU9ERSwgU1lOQ09GRik7CS8qIHN5bmNocm9ub3VzIG1vZGUgKi8KK30KKworc3RhdGljIHZvaWQgX19pbml0IGNhbGNfcG9ydF9hZGRyKHZvaWQpCit7CisJLyogQ29udHJvbCBSZWdpc3RlciBTZXQgMCAqLworCVRDX0xTQiA9IChwb3J0X2Jhc2UgKyAweDAwKTsKKwlUQ19NU0IgPSAocG9ydF9iYXNlICsgMHgwMSk7CisJU0NTSV9GSUZPID0gKHBvcnRfYmFzZSArIDB4MDIpOworCUNNRF9SRUcgPSAocG9ydF9iYXNlICsgMHgwMyk7CisJU1RBVF9SRUcgPSAocG9ydF9iYXNlICsgMHgwNCk7CisJREVTVF9JRCA9IChwb3J0X2Jhc2UgKyAweDA0KTsKKwlJTlRfUkVHID0gKHBvcnRfYmFzZSArIDB4MDUpOworCVNSVElNT1VUID0gKHBvcnRfYmFzZSArIDB4MDUpOworCVNFUV9SRUcgPSAocG9ydF9iYXNlICsgMHgwNik7CisJU1lOQ1BSRCA9IChwb3J0X2Jhc2UgKyAweDA2KTsKKwlGSUZPX0ZMQUdTID0gKHBvcnRfYmFzZSArIDB4MDcpOworCVNZTkNPRkYgPSAocG9ydF9iYXNlICsgMHgwNyk7CisJQ09ORklHMSA9IChwb3J0X2Jhc2UgKyAweDA4KTsKKwlDTEtDT05WID0gKHBvcnRfYmFzZSArIDB4MDkpOworCS8qIFRFU1RSRUcgICAgICAgICAgPSAocG9ydF9iYXNlKzB4MEEpOyAqLworCUNPTkZJRzIgPSAocG9ydF9iYXNlICsgMHgwQik7CisJQ09ORklHMyA9IChwb3J0X2Jhc2UgKyAweDBDKTsKKwlDT05GSUc0ID0gKHBvcnRfYmFzZSArIDB4MEQpOworCVRDX0hJR0ggPSAocG9ydF9iYXNlICsgMHgwRSk7CisJLyogRklGT19CT1RUT00gICAgICA9IChwb3J0X2Jhc2UrMHgwRik7ICovCisKKwkvKiBDb250cm9sIFJlZ2lzdGVyIFNldCAxICovCisJLyogSlVNUEVSX1NFTlNFICAgICA9IChwb3J0X2Jhc2UrMHgwMCk7ICovCisJLyogU1JBTV9QVFIgICAgICAgICA9IChwb3J0X2Jhc2UrMHgwMSk7ICovCisJLyogU1JBTV9EQVRBICAgICAgICA9IChwb3J0X2Jhc2UrMHgwMik7ICovCisJUElPX0ZJRk8gPSAocG9ydF9iYXNlICsgMHgwNCk7CisJLyogUElPX0ZJRk8xICAgICAgICA9IChwb3J0X2Jhc2UrMHgwNSk7ICovCisJLyogUElPX0ZJRk8yICAgICAgICA9IChwb3J0X2Jhc2UrMHgwNik7ICovCisJLyogUElPX0ZJRk8zICAgICAgICA9IChwb3J0X2Jhc2UrMHgwNyk7ICovCisJUElPX1NUQVRVUyA9IChwb3J0X2Jhc2UgKyAweDA4KTsKKwkvKiBBVEFfQ01EICAgICAgICAgID0gKHBvcnRfYmFzZSsweDA5KTsgKi8KKwkvKiBBVEFfRVJSICAgICAgICAgID0gKHBvcnRfYmFzZSsweDBBKTsgKi8KKwlQSU9fRkxBRyA9IChwb3J0X2Jhc2UgKyAweDBCKTsKKwlDT05GSUc1ID0gKHBvcnRfYmFzZSArIDB4MEQpOworCS8qIFNJR05BVFVSRSAgICAgICAgPSAocG9ydF9iYXNlKzB4MEUpOyAqLworCS8qIENPTkZJRzYgICAgICAgICAgPSAocG9ydF9iYXNlKzB4MEYpOyAqLworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIE5PVEU6ICBzY2F0dGVyLWdhdGhlciBzdXBwb3J0IG9ubHkgd29ya3MgaW4gUElPIG1vZGUuCisgKiBVc2UgU0dfTk9ORSBpZiBETUEgbW9kZSBpcyBlbmFibGVkIQorICovCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0gCit7CisgICAgIC5wcm9jX25hbWUgICAgICAgICAJPSAiTkNSNTNjNDA2YSIJCS8qIHByb2NfbmFtZSAqLywgICAgICAgIAorICAgICAubmFtZSAgICAgICAgICAgICAgCT0gIk5DUjUzYzQwNmEiCQkvKiBuYW1lICovLCAgICAgICAgICAgICAKKyAgICAgLmRldGVjdCAgICAgICAgICAgIAk9IE5DUjUzYzQwNmFfZGV0ZWN0CS8qIGRldGVjdCAqLywgICAgICAgICAgIAorICAgICAucmVsZWFzZSAgICAgICAgICAgIAk9IE5DUjUzYzQwNmFfcmVsZWFzZSwKKyAgICAgLmluZm8gICAgICAgICAgICAgIAk9IE5DUjUzYzQwNmFfaW5mbwkJLyogaW5mbyAqLywgICAgICAgICAgICAgCisgICAgIC5xdWV1ZWNvbW1hbmQgICAgICAJPSBOQ1I1M2M0MDZhX3F1ZXVlCS8qIHF1ZXVlY29tbWFuZCAqLywgICAgIAorICAgICAuZWhfYWJvcnRfaGFuZGxlciAgCT0gTkNSNTNjNDA2YV9hYm9ydAkvKiBhYm9ydCAqLywgICAgICAgICAgICAKKyAgICAgLmVoX2J1c19yZXNldF9oYW5kbGVyICAgICAgPSBOQ1I1M2M0MDZhX2J1c19yZXNldAkvKiByZXNldCAqLywgICAgICAgICAgICAKKyAgICAgLmVoX2RldmljZV9yZXNldF9oYW5kbGVyICAgPSBOQ1I1M2M0MDZhX2RldmljZV9yZXNldAkvKiByZXNldCAqLywgICAgICAgICAgICAKKyAgICAgLmVoX2hvc3RfcmVzZXRfaGFuZGxlciAgICAgPSBOQ1I1M2M0MDZhX2hvc3RfcmVzZXQJLyogcmVzZXQgKi8sICAgICAgICAgICAgCisgICAgIC5iaW9zX3BhcmFtICAgICAgICAJPSBOQ1I1M2M0MDZhX2Jpb3NwYXJtCS8qIGJpb3NwYXJtICovLCAgICAgICAgIAorICAgICAuY2FuX3F1ZXVlICAgICAgICAgCT0gMQkJCS8qIGNhbl9xdWV1ZSAqLywgICAgICAgIAorICAgICAudGhpc19pZCAgICAgICAgICAgCT0gNwkJCS8qIFNDU0kgSUQgb2YgdGhlIGNoaXAgKi8sCisgICAgIC5zZ190YWJsZXNpemUgICAgICAJPSAzMgkJCS8qU0dfQUxMKi8gLypTR19OT05FKi8sIAorICAgICAuY21kX3Blcl9sdW4gICAgICAgCT0gMQkJCS8qIGNvbW1hbmRzIHBlciBsdW4gKi8sIAorICAgICAudW5jaGVja2VkX2lzYV9kbWEgCT0gMQkJCS8qIHVuY2hlY2tlZF9pc2FfZG1hICovLAorICAgICAudXNlX2NsdXN0ZXJpbmcgICAgCT0gRU5BQkxFX0NMVVNURVJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9OworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworLyoKKyAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBnZXQgYSB1bmlmb3JtIHRhYmJpbmcgc3R5bGUuCisgKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKKyAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBmaWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWluZGVudC1sZXZlbDogNAorICogYy1icmFjZS1pbWFnaW5hcnktb2Zmc2V0OiAwCisgKiBjLWJyYWNlLW9mZnNldDogLTQKKyAqIGMtYXJnZGVjbC1pbmRlbnQ6IDQKKyAqIGMtbGFiZWwtb2Zmc2V0OiAtNAorICogYy1jb250aW51ZWQtc3RhdGVtZW50LW9mZnNldDogNAorICogYy1jb250aW51ZWQtYnJhY2Utb2Zmc2V0OiAwCisgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKyAqIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTkNSX0Q3MDAuYyBiL2RyaXZlcnMvc2NzaS9OQ1JfRDcwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNzc1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvTkNSX0Q3MDAuYwpAQCAtMCwwICsxLDQwNiBAQAorLyogLSotIG1vZGU6IGM7IGMtYmFzaWMtb2Zmc2V0OiA4IC0qLSAqLworCisvKiBOQ1IgRHVhbCA3MDAgTUNBIFNDU0kgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEphbWVzLkJvdHRvbWxleUBIYW5zZW5QYXJ0bmVyc2hpcC5jb20KKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqICAKKyoqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyoqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKioKKyoqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKioKKyoqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIE5vdGVzOgorICoKKyAqIE1vc3Qgb2YgdGhlIHdvcmsgaXMgZG9uZSBpbiB0aGUgY2hpcCBzcGVjaWZpYyBtb2R1bGUsIDUzYzcwMC5vCisgKgorICogVE9ETyBMaXN0OgorICoKKyAqIDEuIEV4dHJhY3QgdGhlIFNDU0kgSUQgZnJvbSB0aGUgdm95YWdlciBDTU9TIHRhYmxlIChuZWNlc3NhcnkgdG8KKyAqICAgIHN1cHBvcnQgbXVsdGktaG9zdCBlbnZpcm9ubWVudHMuCisgKgorICogKi8KKworCisvKiBDSEFOR0VMT0cgCisgKgorICogVmVyc2lvbiAyLjIKKyAqCisgKiBBZGRlZCBtY2Ffc2V0X2FkYXB0ZXJfbmFtZSgpLgorICoKKyAqIFZlcnNpb24gMi4xCisgKgorICogTW9kdWxhcmlzZSB0aGUgZHJpdmVyIGludG8gYSBCb2FyZCBwaWVjZSAodGhpcyBmaWxlKSBhbmQgYSBjaGlwCisgKiBwaWVjZSA1M2M3MDAuW2NoXSBhbmQgNTNjNzAwLnNjciwgYWRkZWQgbW9kdWxlIG9wdGlvbnMuICBZb3UgY2FuCisgKiBub3cgc3BlY2lmeSB0aGUgc2NzaSBpZCBieSB0aGUgcGFyYW1ldGVycworICoKKyAqIE5DUl9ENzAwPXNsb3Q6PG4+IFtzaW9wOjxuPl0gaWQ6PG4+IC4uLi4KKyAqCisgKiBUaGV5IG5lZWQgdG8gYmUgY29tbWEgc2VwYXJhdGVkIGlmIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbAorICoKKyAqIFZlcnNpb24gMi4wCisgKgorICogSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBUQ1EgKFRhZyBDb21tYW5kIFF1ZXVlaW5nKS4gIFRDUSBpcyBmdWxsCisgKiBmZWF0dXJlZCBhbmQgdXNlcyB0aGUgY2xvY2sgYWxnb3JpdGhtIHRvIGtlZXAgdHJhY2sgb2Ygb3V0c3RhbmRpbmcKKyAqIHRhZ3MgYW5kIGd1YXJkIGFnYWluc3QgaW5kaXZpZHVhbCB0YWcgc3RhcnZhdGlvbi4gIEFsc28gZml4ZWQgYSBidWcKKyAqIGluIGFsbCBvZiB0aGUgMS54IHZlcnNpb25zIHdoZXJlIHRoZSBENzAwX2RhdGFfcmVzaWR1ZSgpIGZ1bmN0aW9uCisgKiB3YXMgcmV0dXJuaW5nIHJlc3VsdHMgb2ZmIGJ5IDMyIGJ5dGVzIChhbmQgdGh1cyBjYXVzaW5nIHRoZSBzYW1lIDMyCisgKiBieXRlcyB0byBiZSB3cml0dGVuIHR3aWNlIGNvcnJ1cHRpbmcgdGhlIGRhdGEgYmxvY2spLiAgSXQgdHVybnMgb3V0CisgKiB0aGUgNTNjNzAwIG9ubHkgaGFzIGEgNiBiaXQgREJDIGFuZCBERklGTyByZWdpc3RlcnMgbm90IDcgYml0IG9uZXMKKyAqIGxpa2UgdGhlIDUzYzcxMCAoVGhlIDcxMCBpcyB0aGUgb25seSBkYXRhIG1hbnVhbCBzdGlsbCBhdmFpbGFibGUsCisgKiB3aGljaCBJJ2QgYmVlbiB1c2luZyB0byBwcm9ncmFtIHRoZSA3MDApLgorICoKKyAqIFZlcnNpb24gMS4yCisgKgorICogTXVjaCBpbXByb3ZlZCBtZXNzYWdlIGhhbmRsaW5nIGVuZ2luZQorICoKKyAqIFZlcnNpb24gMS4xCisgKgorICogQWRkIGNvZGUgdG8gaGFuZGxlIHNlbGVjdGlvbiByZWFzb25hYmx5IGNvcnJlY3RseS4gIEJ5IHRoZSB0aW1lIHdlCisgKiBnZXQgdGhlIHNlbGVjdGlvbiBpbnRlcnJ1cHQsIHdlJ3ZlIGFscmVhZHkgcmVzcG9uZGVkLCBidXQgZHJvcCBvZmYgdGhlCisgKiBidXMgYW5kIGhvcGUgdGhlIHNlbGVjdG9yIHdpbGwgZ28gYXdheS4KKyAqCisgKiBWZXJzaW9uIDEuMDoKKyAqCisgKiAgIEluaXRpYWwgcmVsZWFzZS4gIEZ1bGx5IGZ1bmN0aW9uYWwgZXhjZXB0IGZvciBwcm9jZnMgYW5kIHRhZworICogY29tbWFuZCBxdWV1ZWluZy4gIEhhcyBvbmx5IGJlZW4gdGVzdGVkIG9uIGNhcmRzIHdpdGggNTNjNzAwLTY2CisgKiBjaGlwcyBhbmQgb25seSBzaW5nbGUgZW5kZWQuIEZlYXR1cmVzIGFyZQorICoKKyAqIDEuIFN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXJzIHRvIG9mZnNldCA4IChsaW1pdCBvZiA3MDAtNjYpIGFuZAorICogICAgMTAwbnMgKDEwTUh6KSBsaW1pdCBvZiBTQ1NJLTIKKyAqCisgKiAyLiBEaXNjb25uZWN0aW9uIGFuZCByZXNlbGVjdGlvbgorICoKKyAqIFRlc3Rpbmc6CisgKiAKKyAqICBJJ3ZlIG9ubHkgcmVhbGx5IHRlc3RlZCB0aGlzIHdpdGggdGhlIDcwMC02NiBjaGlwLCBidXQgaGF2ZSBkb25lCisgKiBzb2FrIHRlc3RzIGluIG11bHRpLWRldmljZSBlbnZpcm9ubWVudHMgdG8gdmVyaWZ5IHRoYXQKKyAqIGRpc2Nvbm5lY3Rpb25zIGFuZCByZXNlbGVjdGlvbnMgYXJlIGJlaW5nIHByb2Nlc3NlZCBjb3JyZWN0bHkuCisgKiAqLworCisjZGVmaW5lIE5DUl9ENzAwX1ZFUlNJT04gIjIuMiIKKworI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5oPgorCisjaW5jbHVkZSAiNTNjNzAwLmgiCisjaW5jbHVkZSAiTkNSX0Q3MDAuaCIKKworc3RhdGljIGNoYXIgKk5DUl9ENzAwOwkJLyogY29tbWFuZCBsaW5lIGZyb20gaW5zbW9kICovCisKK01PRFVMRV9BVVRIT1IoIkphbWVzIEJvdHRvbWxleSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOQ1IgRHVhbDcwMCBTQ1NJIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtKE5DUl9ENzAwLCBjaGFycCwgMCk7CisKK3N0YXRpYyBfX3U4IF9faW5pdGRhdGEgaWRfYXJyYXlbMiooTUNBX01BWF9TTE9UX05SICsgMSldID0KKwl7IFswIC4uLiAyKihNQ0FfTUFYX1NMT1RfTlIgKyAxKS0xXSA9IDcgfTsKKworI2lmZGVmIE1PRFVMRQorI2RlZmluZSBBUkdfU0VQICcgJworI2Vsc2UKKyNkZWZpbmUgQVJHX1NFUCAnLCcKKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdAorcGFyYW1fc2V0dXAoY2hhciAqc3RyaW5nKQoreworCWNoYXIgKnBvcyA9IHN0cmluZywgKm5leHQ7CisJaW50IHNsb3QgPSAtMSwgc2lvcCA9IC0xOworCisJd2hpbGUocG9zICE9IE5VTEwgJiYgKG5leHQgPSBzdHJjaHIocG9zLCAnOicpKSAhPSBOVUxMKSB7CisJCWludCB2YWwgPSAoaW50KXNpbXBsZV9zdHJ0b3VsKCsrbmV4dCwgTlVMTCwgMCk7CisKKwkJaWYoIXN0cm5jbXAocG9zLCAic2xvdDoiLCA1KSkKKwkJCXNsb3QgPSB2YWw7CisJCWVsc2UgaWYoIXN0cm5jbXAocG9zLCAic2lvcDoiLCA1KSkKKwkJCXNpb3AgPSB2YWw7CisJCWVsc2UgaWYoIXN0cm5jbXAocG9zLCAiaWQ6IiwgMykpIHsKKwkJCWlmKHNsb3QgPT0gLTEpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJOQ1IgRDcwMDogTXVzdCBzcGVjaWZ5IHNsb3QgZm9yIGlkIHBhcmFtZXRlclxuIik7CisJCQl9IGVsc2UgaWYoc2xvdCA+IE1DQV9NQVhfU0xPVF9OUikgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5DUiBENzAwOiBJbGxlZ2FsIHNsb3QgJWQgZm9yIGlkICVkXG4iLCBzbG90LCB2YWwpOworCQkJfSBlbHNlIHsKKwkJCQlpZihzaW9wICE9IDAgJiYgc2lvcCAhPSAxKSB7CisJCQkJCWlkX2FycmF5W3Nsb3QqMl0gPSB2YWw7CisJCQkJCWlkX2FycmF5W3Nsb3QqMiArIDFdID12YWw7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWRfYXJyYXlbc2xvdCoyICsgc2lvcF0gPSB2YWw7CisJCQkJfQorCQkJfQorCQl9CisJCWlmKChwb3MgPSBzdHJjaHIocG9zLCBBUkdfU0VQKSkgIT0gTlVMTCkKKwkJCXBvcysrOworCX0KKwlyZXR1cm4gMTsKK30KKworLyogSG9zdCB0ZW1wbGF0ZS4gIFRoZSA1M2M3MDAgcm91dGluZSBOQ1JfNzAwX2RldGVjdCB3aWxsCisgKiBmaWxsIGluIGFsbCBvZiB0aGUgbWlzc2luZyByb3V0aW5lcyAqLworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgTkNSX0Q3MDBfZHJpdmVyX3RlbXBsYXRlID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSAiTkNSIER1YWwgNzAwIE1DQSIsCisJLnByb2NfbmFtZQkJPSAiTkNSX0Q3MDAiLAorCS50aGlzX2lkCQk9IDcsCit9OworCisvKiBXZSBuZWVkcyB0aGlzIGhlbHBlciBiZWNhdXNlIHdlIGhhdmUgdHdvIGhvc3RzIHBlciBzdHJ1Y3QgZGV2aWNlICovCitzdHJ1Y3QgTkNSX0Q3MDBfcHJpdmF0ZSB7CisJc3RydWN0IGRldmljZQkJKmRldjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0CSpob3N0c1syXTsKKwljaGFyCQkJbmFtZVszMF07CisJY2hhcgkJCXBhZDsKK307CisKK3N0YXRpYyBpbnQgCitOQ1JfRDcwMF9wcm9iZV9vbmUoc3RydWN0IE5DUl9ENzAwX3ByaXZhdGUgKnAsIGludCBzaW9wLCBpbnQgaXJxLAorCQkgICBpbnQgc2xvdCwgdTMyIHJlZ2lvbiwgaW50IGRpZmZlcmVudGlhbCkKK3sKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJaW50IHJldDsKKworCWhvc3RkYXRhID0ga21hbGxvYyhzaXplb2YoKmhvc3RkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFob3N0ZGF0YSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5DUiBENzAwOiBTSU9QJWQ6IEZhaWxlZCB0byBhbGxvY2F0ZSBob3N0IgorCQkgICAgICAgImRhdGEsIGRldGF0Y2hpbmdcbiIsIHNpb3ApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGhvc3RkYXRhLCAwLCBzaXplb2YoKmhvc3RkYXRhKSk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHJlZ2lvbiwgNjQsICJOQ1JfRDcwMCIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTkNSIEQ3MDA6IEZhaWxlZCB0byByZXNlcnZlIElPIHJlZ2lvbiAweCV4XG4iLAorCQkJCXJlZ2lvbik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gcmVnaW9uX2ZhaWxlZDsKKwl9CisJCQorCS8qIEZpbGwgaW4gdGhlIHRocmVlIHJlcXVpcmVkIHBpZWNlcyBvZiBob3N0ZGF0YSAqLworCWhvc3RkYXRhLT5iYXNlID0gcmVnaW9uOworCWhvc3RkYXRhLT5kaWZmZXJlbnRpYWwgPSAoKCgxPDxzaW9wKSAmIGRpZmZlcmVudGlhbCkgIT0gMCk7CisJaG9zdGRhdGEtPmNsb2NrID0gTkNSX0Q3MDBfQ0xPQ0tfTUhaOworCisJTkNSXzcwMF9zZXRfaW9fbWFwcGVkKGhvc3RkYXRhKTsKKworCS8qIGFuZCByZWdpc3RlciB0aGUgc2lvcCAqLworCWhvc3QgPSBOQ1JfNzAwX2RldGVjdCgmTkNSX0Q3MDBfZHJpdmVyX3RlbXBsYXRlLCBob3N0ZGF0YSwgcC0+ZGV2KTsKKwlpZiAoIWhvc3QpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBkZXRlY3RfZmFpbGVkOworCX0KKworCXAtPmhvc3RzW3Npb3BdID0gaG9zdDsKKwkvKiBGSVhNRTogcmVhZCB0aGlzIGZyb20gU1VTICovCisJaG9zdC0+dGhpc19pZCA9IGlkX2FycmF5W3Nsb3QgKiAyICsgc2lvcF07CisJaG9zdC0+aXJxID0gaXJxOworCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCisJcmV0dXJuIDA7CisKKyBkZXRlY3RfZmFpbGVkOgorCXJlbGVhc2VfcmVnaW9uKGhvc3QtPmJhc2UsIDY0KTsKKyByZWdpb25fZmFpbGVkOgorCWtmcmVlKGhvc3RkYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK05DUl9ENzAwX2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IE5DUl9ENzAwX3ByaXZhdGUgKnAgPSAoc3RydWN0IE5DUl9ENzAwX3ByaXZhdGUgKilkYXRhOworCWludCBpLCBmb3VuZCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQlpZiAocC0+aG9zdHNbaV0gJiYKKwkJICAgIE5DUl83MDBfaW50cihpcnEsIHAtPmhvc3RzW2ldLCByZWdzKSA9PSBJUlFfSEFORExFRCkKKwkJCWZvdW5kKys7CisKKwlyZXR1cm4gZm91bmQgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOworfQorCisvKiBEZXRlY3QgYSBENzAwIGNhcmQuICBOb3RlLCBiZWNhdXNlIG9mIHRoZSBzZXR1cCAtLS0gdGhlIGNoaXBzIGFyZQorICogZXNzZW50aWFsbHkgY29ubmVjdGVjZCB0byB0aGUgTUNBIGJ1cyBpbmRlcGVuZGVudGx5LCBpdCBpcyBlYXNpZXIKKyAqIHRvIHNldCB0aGVtIHVwIGFzIHR3byBzZXBhcmF0ZSBob3N0IGFkYXB0ZXJzLCByYXRoZXIgdGhhbiBvbmUKKyAqIGFkYXB0ZXIgd2l0aCB0d28gY2hhbm5lbHMgKi8KK3N0YXRpYyBpbnQKK05DUl9ENzAwX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgTkNSX0Q3MDBfcHJpdmF0ZSAqcDsKKwlpbnQgZGlmZmVyZW50aWFsOworCXN0YXRpYyBpbnQgYmFubmVyID0gMTsKKwlzdHJ1Y3QgbWNhX2RldmljZSAqbWNhX2RldiA9IHRvX21jYV9kZXZpY2UoZGV2KTsKKwlpbnQgc2xvdCA9IG1jYV9kZXYtPnNsb3Q7CisJaW50IGZvdW5kID0gMDsKKwlpbnQgaXJxLCBpOworCWludCBwb3MzaiwgcG9zM2ssIHBvczNhLCBwb3MzYiwgcG9zNDsKKwlfX3UzMiBiYXNlX2FkZHIsIG9mZnNldF9hZGRyOworCisJLyogZW5hYmxlIGJvYXJkIGludGVycnVwdCAqLworCXBvczQgPSBtY2FfZGV2aWNlX3JlYWRfcG9zKG1jYV9kZXYsIDQpOworCXBvczQgfD0gMHg0OworCW1jYV9kZXZpY2Vfd3JpdGVfcG9zKG1jYV9kZXYsIDQsIHBvczQpOworCisJbWNhX2RldmljZV93cml0ZV9wb3MobWNhX2RldiwgNiwgOSk7CisJcG9zM2ogPSBtY2FfZGV2aWNlX3JlYWRfcG9zKG1jYV9kZXYsIDMpOworCW1jYV9kZXZpY2Vfd3JpdGVfcG9zKG1jYV9kZXYsIDYsIDEwKTsKKwlwb3MzayA9IG1jYV9kZXZpY2VfcmVhZF9wb3MobWNhX2RldiwgMyk7CisJbWNhX2RldmljZV93cml0ZV9wb3MobWNhX2RldiwgNiwgMCk7CisJcG9zM2EgPSBtY2FfZGV2aWNlX3JlYWRfcG9zKG1jYV9kZXYsIDMpOworCW1jYV9kZXZpY2Vfd3JpdGVfcG9zKG1jYV9kZXYsIDYsIDEpOworCXBvczNiID0gbWNhX2RldmljZV9yZWFkX3BvcyhtY2FfZGV2LCAzKTsKKworCWJhc2VfYWRkciA9ICgocG9zM2ogPDwgOCkgfCBwb3MzaykgJiAweGZmZmZmZmYwOworCW9mZnNldF9hZGRyID0gKChwb3MzYSA8PCA4KSB8IHBvczNiKSAmIDB4ZmZmZmZmNzA7CisKKwlpcnEgPSAocG9zNCAmIDB4MykgKyAxMTsKKwlpZihpcnEgPj0gMTMpCisJCWlycSsrOworCWlmKGJhbm5lcikgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5DUiBENzAwOiBEcml2ZXIgVmVyc2lvbiAiIE5DUl9ENzAwX1ZFUlNJT04gIlxuIgorCQkgICAgICAgIk5DUiBENzAwOiAgQ29weXJpZ2h0IChjKSAyMDAxIGJ5IEphbWVzLkJvdHRvbWxleUBIYW5zZW5QYXJ0bmVyc2hpcC5jb21cbiIKKwkJICAgICAgICJOQ1IgRDcwMDpcbiIpOworCQliYW5uZXIgPSAwOworCX0KKwkvKiBub3cgZG8gdGhlIGJ1cyByZWxhdGVkIHRyYW5zZm9ybXMgKi8KKwlpcnEgPSBtY2FfZGV2aWNlX3RyYW5zZm9ybV9pcnEobWNhX2RldiwgaXJxKTsKKwliYXNlX2FkZHIgPSBtY2FfZGV2aWNlX3RyYW5zZm9ybV9pb3BvcnQobWNhX2RldiwgYmFzZV9hZGRyKTsKKwlvZmZzZXRfYWRkciA9IG1jYV9kZXZpY2VfdHJhbnNmb3JtX2lvcG9ydChtY2FfZGV2LCBvZmZzZXRfYWRkcik7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIk5DUiBENzAwOiBmb3VuZCBpbiBzbG90ICVkICBpcnEgPSAlZCAgSS9PIGJhc2UgPSAweCV4XG4iLCBzbG90LCBpcnEsIG9mZnNldF9hZGRyKTsKKworCS8qb3V0YihCT0FSRF9SRVNFVCwgYmFzZV9hZGRyKTsqLworCisJLyogY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cyAqLworCSh2b2lkKWluYihiYXNlX2FkZHIgKyAweDA4KTsKKwkvKiBnZXQgbW9kY3RsLCB1c2VkIGxhdGVyIGZvciBzZXR0aW5nIGRpZmYgYml0cyAqLworCXN3aXRjaChkaWZmZXJlbnRpYWwgPSAoaW5iKGJhc2VfYWRkciArIDB4MDgpID4+IDYpKSB7CisJY2FzZSAweDAwOgorCQkvKiBvbmx5IFNJT1AxIGRpZmZlcmVudGlhbCAqLworCQlkaWZmZXJlbnRpYWwgPSAweDAyOworCQlicmVhazsKKwljYXNlIDB4MDE6CisJCS8qIEJvdGggU0lPUHMgZGlmZmVyZW50aWFsICovCisJCWRpZmZlcmVudGlhbCA9IDB4MDM7CisJCWJyZWFrOworCWNhc2UgMHgwMzoKKwkJLyogTm8gU0lPUHMgZGlmZmVyZW50aWFsICovCisJCWRpZmZlcmVudGlhbCA9IDB4MDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiRDcwMDogVU5FWFBFQ1RFRCBESUZGRVJFTlRJQUwgUkVTVUxUIDB4JTAyeFxuIiwKKwkJICAgICAgIGRpZmZlcmVudGlhbCk7CisJCWRpZmZlcmVudGlhbCA9IDB4MDA7CisJCWJyZWFrOworCX0KKworCXAgPSBrbWFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHAsICdcMCcsIHNpemVvZigqcCkpOworCXAtPmRldiA9IGRldjsKKwlzbnByaW50ZihwLT5uYW1lLCBzaXplb2YocC0+bmFtZSksICJENzAwKCVzKSIsIGRldi0+YnVzX2lkKTsKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBOQ1JfRDcwMF9pbnRyLCBTQV9TSElSUSwgcC0+bmFtZSwgcCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJENzAwOiByZXF1ZXN0X2lycSBmYWlsZWRcbiIpOworCQlrZnJlZShwKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJLyogcGx1bWIgaW4gYm90aCA3MDAgY2hpcHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWludCBlcnI7CisKKwkJaWYgKChlcnIgPSBOQ1JfRDcwMF9wcm9iZV9vbmUocCwgaSwgc2xvdCwgaXJxLAorCQkJCQkgICAgICBvZmZzZXRfYWRkciArICgweDgwICogaSksCisJCQkJCSAgICAgIGRpZmZlcmVudGlhbCkpICE9IDApCisJCQlwcmludGsoIkQ3MDA6IFNJT1AlZDogcHJvYmUgZmFpbGVkLCBlcnJvciA9ICVkXG4iLAorCQkJICAgICAgIGksIGVycik7CisJCWVsc2UKKwkJCWZvdW5kKys7CisJfQorCisJaWYgKCFmb3VuZCkgeworCQlrZnJlZShwKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbWNhX2RldmljZV9zZXRfY2xhaW0obWNhX2RldiwgMSk7CisJbWNhX2RldmljZV9zZXRfbmFtZShtY2FfZGV2LCAiTkNSX0Q3MDAiKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK05DUl9ENzAwX3JlbW92ZV9vbmUoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzY3NpX3JlbW92ZV9ob3N0KGhvc3QpOworCU5DUl83MDBfcmVsZWFzZShob3N0KTsKKwlrZnJlZSgoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICopaG9zdC0+aG9zdGRhdGFbMF0pOworCWZyZWVfaXJxKGhvc3QtPmlycSwgaG9zdCk7CisJcmVsZWFzZV9yZWdpb24oaG9zdC0+YmFzZSwgNjQpOworfQorCitzdGF0aWMgaW50CitOQ1JfRDcwMF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBOQ1JfRDcwMF9wcml2YXRlICpwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQlOQ1JfRDcwMF9yZW1vdmVfb25lKHAtPmhvc3RzW2ldKTsKKworCWtmcmVlKHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc2hvcnQgTkNSX0Q3MDBfaWRfdGFibGVbXSA9IHsgTkNSX0Q3MDBfTUNBX0lELCAwIH07CisKK3N0YXRpYyBzdHJ1Y3QgbWNhX2RyaXZlciBOQ1JfRDcwMF9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gTkNSX0Q3MDBfaWRfdGFibGUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJCT0gIk5DUl9ENzAwIiwKKwkJLmJ1cwkJPSAmbWNhX2J1c190eXBlLAorCQkucHJvYmUJCT0gTkNSX0Q3MDBfcHJvYmUsCisJCS5yZW1vdmUJCT0gTkNSX0Q3MDBfcmVtb3ZlLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBOQ1JfRDcwMF9pbml0KHZvaWQpCit7CisjaWZkZWYgTU9EVUxFCisJaWYgKE5DUl9ENzAwKQorCQlwYXJhbV9zZXR1cChOQ1JfRDcwMCk7CisjZW5kaWYKKworCXJldHVybiBtY2FfcmVnaXN0ZXJfZHJpdmVyKCZOQ1JfRDcwMF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgTkNSX0Q3MDBfZXhpdCh2b2lkKQoreworCW1jYV91bnJlZ2lzdGVyX2RyaXZlcigmTkNSX0Q3MDBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoTkNSX0Q3MDBfaW5pdCk7Cittb2R1bGVfZXhpdChOQ1JfRDcwMF9leGl0KTsKKworX19zZXR1cCgiTkNSX0Q3MDA9IiwgcGFyYW1fc2V0dXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL05DUl9ENzAwLmggYi9kcml2ZXJzL3Njc2kvTkNSX0Q3MDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTY3YWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL05DUl9ENzAwLmgKQEAgLTAsMCArMSwyOSBAQAorLyogLSotIG1vZGU6IGM7IGMtYmFzaWMtb2Zmc2V0OiA4IC0qLSAqLworCisvKiBOQ1IgRHVhbCA3MDAgTUNBIFNDU0kgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEphbWVzLkJvdHRvbWxleUBIYW5zZW5QYXJ0bmVyc2hpcC5jb20KKyAqLworCisjaWZuZGVmIF9OQ1JfRDcwMF9ICisjZGVmaW5lIF9OQ1JfRDcwMF9ICisKKy8qIERvbid0IHR1cm4gb24gZGVidWdnaW5nIG1lc3NhZ2VzICovCisjdW5kZWYgTkNSX0Q3MDBfREVCVUcKKworLyogVGhlIE1DQSBpZGVudGlmaWVyICovCisjZGVmaW5lIE5DUl9ENzAwX01DQV9JRAkJMHgwMDkyCisKKy8qIERlZmluZXMgZm9yIHRoZSBCb2FyZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUJQk9BUkRfUkVTRVQJCTB4ODAJLyogYm9hcmQgbGV2ZWwgcmVzZXQgKi8KKyNkZWZpbmUgQUREX1BBUkVOQgkJMHgwNAkvKiBBZGRyZXNzIFBhcml0eSBFbmFibGVkICovCisjZGVmaW5lIERBVF9QQVJFTkIJCTB4MDEJLyogRGF0YSBQYXJpdHkgRW5hYmxlZCAqLworI2RlZmluZSBTRkJLX0VOQgkJMHgxMAkvKiBTRkRCSyBJbnRlcnJ1cHQgRW5hYmxlZCAqLworI2RlZmluZSBMRUQwR1JFRU4JCTB4MjAJLyogTGVkIDAgKHJlZCAwOyBncmVlbiAxKSAqLworI2RlZmluZSBMRUQxR1JFRU4JCTB4NDAJLyogTGVkIDEgKHJlZCAwOyBncmVlbiAxKSAqLworI2RlZmluZSBMRUQwUkVECQkJMHhERgkvKiBMZWQgMCAocmVkIDA7IGdyZWVuIDEpICovCisjZGVmaW5lIExFRDFSRUQJCQkweEJGCS8qIExlZCAxIChyZWQgMDsgZ3JlZW4gMSkgKi8KKworI2RlZmluZSBOQ1JfRDcwMF9DTE9DS19NSFoJNTAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTkNSX1E3MjAuYyBiL2RyaXZlcnMvc2NzaS9OQ1JfUTcyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMThlYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvTkNSX1E3MjAuYwpAQCAtMCwwICsxLDM3NyBAQAorLyogLSotIG1vZGU6IGM7IGMtYmFzaWMtb2Zmc2V0OiA4IC0qLSAqLworCisvKiBOQ1IgUXVhZCA3MjAgTUNBIFNDU0kgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIGJ5IEphbWVzLkJvdHRvbWxleUBIYW5zZW5QYXJ0bmVyc2hpcC5jb20KKyAqLworCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWNhLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSAibmNyNTNjOHh4LmgiCisKKyNpbmNsdWRlICJOQ1JfUTcyMC5oIgorCitzdGF0aWMgc3RydWN0IG5jcl9jaGlwIHE3MjBfY2hpcCBfX2luaXRkYXRhID0geworCS5yZXZpc2lvbl9pZCA9CTB4MGYsCisJLmJ1cnN0X21heCA9CTMsCisJLm9mZnNldF9tYXggPQk4LAorCS5ucl9kaXZpc29yID0JNCwKKwkuZmVhdHVyZXMgPQlGRV9XSURFIHwgRkVfRElGRiB8IEZFX1ZBUkNMSywKK307CisKK01PRFVMRV9BVVRIT1IoIkphbWVzIEJvdHRvbWxleSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOQ1IgUXVhZCA3MjAgU0NTSSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBOQ1JfUTcyMF9WRVJTSU9OCQkiMC45IgorCisvKiBXZSBuZWVkcyB0aGlzIGhlbHBlciBiZWNhdXNlIHdlIGhhdmUgdXAgdG8gZm91ciBob3N0cyBwZXIgc3RydWN0IGRldmljZSAqLworc3RydWN0IE5DUl9RNzIwX3ByaXZhdGUgeworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJdm9pZCBfX2lvbWVtICoJCW1lbV9iYXNlOworCV9fdTMyCQkJcGh5c19tZW1fYmFzZTsKKwlfX3UzMgkJCW1lbV9zaXplOworCV9fdTgJCQlpcnE7CisJX191OAkJCXNpb3BzOworCV9fdTgJCQlpcnFfZW5hYmxlOworCXN0cnVjdCBTY3NpX0hvc3QJKmhvc3RzWzRdOworfTsKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgTkNSX1E3MjBfdHBudCA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkucHJvY19uYW1lCQk9ICJOQ1JfUTcyMCIsCit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QKK05DUl9RNzIwX2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBOQ1JfUTcyMF9wcml2YXRlICpwID0gKHN0cnVjdCBOQ1JfUTcyMF9wcml2YXRlICopZGF0YTsKKwlfX3U4IHNpciA9IChyZWFkYihwLT5tZW1fYmFzZSArIDB4MGQpICYgMHhmMCkgPj4gNDsKKwlfX3U4IHNpb3A7CisKKwlzaXIgfD0gfnAtPmlycV9lbmFibGU7CisKKwlpZihzaXIgPT0gMHhmZikKKwkJcmV0dXJuIElSUV9OT05FOworCisKKwl3aGlsZSgoc2lvcCA9IGZmeihzaXIpKSA8IHAtPnNpb3BzKSB7CisJCXNpciB8PSAxPDxzaW9wOworCQluY3I1M2M4eHhfaW50cihpcnEsIHAtPmhvc3RzW3Npb3BdLCByZWdzKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9faW5pdAorTkNSX1E3MjBfcHJvYmVfb25lKHN0cnVjdCBOQ1JfUTcyMF9wcml2YXRlICpwLCBpbnQgc2lvcCwKKwkJaW50IGlycSwgaW50IHNsb3QsIF9fdTMyIHBhZGRyLCB2b2lkIF9faW9tZW0gKnZhZGRyKQoreworCXN0cnVjdCBuY3JfZGV2aWNlIGRldmljZTsKKwlfX3U4IHNjc2lfaWQ7CisJc3RhdGljIGludCB1bml0ID0gMDsKKwlfX3U4IHNjc3IxID0gcmVhZGIodmFkZHIgKyBOQ1JfUTcyMF9TQ1NSX09GRlNFVCArIDEpOworCV9fdTggZGlmZmVyZW50aWFsID0gcmVhZGIodmFkZHIgKyBOQ1JfUTcyMF9TQ1NSX09GRlNFVCkgJiAweDIwOworCV9fdTggdmVyc2lvbjsKKwlpbnQgZXJyb3I7CisKKwlzY3NpX2lkID0gc2NzcjEgPj4gNDsKKwkvKiBlbmFibGUgYnVyc3QgbGVuZ3RoIDE2IChGSVhNRTogc2hvdWxkIGFsbG93IHRoaXMpICovCisJc2NzcjEgfD0gMHgwMjsKKwkvKiBmb3JjZSBhIHNpb3AgcmVzZXQgKi8KKwlzY3NyMSB8PSAweDA0OworCXdyaXRlYihzY3NyMSwgdmFkZHIgKyBOQ1JfUTcyMF9TQ1NSX09GRlNFVCArIDEpOworCXVkZWxheSgxMCk7CisJdmVyc2lvbiA9IHJlYWRiKHZhZGRyICsgMHgxOCkgPj4gNDsKKworCW1lbXNldCgmZGV2aWNlLCAwLCBzaXplb2Yoc3RydWN0IG5jcl9kZXZpY2UpKTsKKwkJLyogSW5pdGlhbGlzZSBuY3JfZGV2aWNlIHN0cnVjdHVyZSB3aXRoIGl0ZW1zIHJlcXVpcmVkIGJ5IG5jcl9hdHRhY2guICovCisJZGV2aWNlLmNoaXAJCT0gcTcyMF9jaGlwOworCWRldmljZS5jaGlwLnJldmlzaW9uX2lkCT0gdmVyc2lvbjsKKwlkZXZpY2UuaG9zdF9pZAkJPSBzY3NpX2lkOworCWRldmljZS5kZXYJCT0gcC0+ZGV2OworCWRldmljZS5zbG90LmJhc2UJPSBwYWRkcjsKKwlkZXZpY2Uuc2xvdC5iYXNlX2MJPSBwYWRkcjsKKwlkZXZpY2Uuc2xvdC5iYXNlX3YJPSB2YWRkcjsKKwlkZXZpY2Uuc2xvdC5pcnEJCT0gaXJxOworCWRldmljZS5kaWZmZXJlbnRpYWwJPSBkaWZmZXJlbnRpYWwgPyAyIDogMDsKKwlwcmludGsoIlE3MjAgcHJvYmUgdW5pdCAlZCAoc2lvcCVkKSBhdCAweCVseCwgZGlmZiA9ICVkLCB2ZXJzID0gJWRcbiIsIHVuaXQsIHNpb3AsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXBhZGRyLCBkaWZmZXJlbnRpYWwsIHZlcnNpb24pOworCisJcC0+aG9zdHNbc2lvcF0gPSBuY3JfYXR0YWNoKCZOQ1JfUTcyMF90cG50LCB1bml0KyssICZkZXZpY2UpOworCQorCWlmICghcC0+aG9zdHNbc2lvcF0pIAorCQlnb3RvIGZhaWw7CisKKwlwLT5pcnFfZW5hYmxlIHw9ICgxPDxzaW9wKTsKKwlzY3NyMSA9IHJlYWRiKHZhZGRyICsgTkNSX1E3MjBfU0NTUl9PRkZTRVQgKyAxKTsKKwkvKiBjbGVhciB0aGUgZGlzYWJsZSBpbnRlcnJ1cHQgYml0ICovCisJc2NzcjEgJj0gfjB4MDE7CisJd3JpdGViKHNjc3IxLCB2YWRkciArIE5DUl9RNzIwX1NDU1JfT0ZGU0VUICsgMSk7CisKKwllcnJvciA9IHNjc2lfYWRkX2hvc3QocC0+aG9zdHNbc2lvcF0sIHAtPmRldik7CisJaWYgKGVycm9yKQorCQluY3I1M2M4eHhfcmVsZWFzZShwLT5ob3N0c1tzaW9wXSk7CisJZWxzZQorCQlzY3NpX3NjYW5faG9zdChwLT5ob3N0c1tzaW9wXSk7CisJcmV0dXJuIGVycm9yOworCisgZmFpbDoKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyogRGV0ZWN0IGEgUTcyMCBjYXJkLiAgTm90ZSwgYmVjYXVzZSBvZiB0aGUgc2V0dXAgLS0tIHRoZSBjaGlwcyBhcmUKKyAqIGVzc2VudGlhbGx5IGNvbm5lY3RlY2QgdG8gdGhlIE1DQSBidXMgaW5kZXBlbmRlbnRseSwgaXQgaXMgZWFzaWVyCisgKiB0byBzZXQgdGhlbSB1cCBhcyB0d28gc2VwYXJhdGUgaG9zdCBhZGFwdGVycywgcmF0aGVyIHRoYW4gb25lCisgKiBhZGFwdGVyIHdpdGggdHdvIGNoYW5uZWxzICovCitzdGF0aWMgaW50IF9faW5pdAorTkNSX1E3MjBfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBOQ1JfUTcyMF9wcml2YXRlICpwOworCXN0YXRpYyBpbnQgYmFubmVyID0gMTsKKwlzdHJ1Y3QgbWNhX2RldmljZSAqbWNhX2RldiA9IHRvX21jYV9kZXZpY2UoZGV2KTsKKwlpbnQgc2xvdCA9IG1jYV9kZXYtPnNsb3Q7CisJaW50IGZvdW5kID0gMDsKKwlpbnQgaXJxLCBpLCBzaW9wczsKKwlfX3U4IHBvczIsIHBvczQsIGFzcjIsIGFzcjksIGFzcjEwOworCV9fdTE2IGlvX2Jhc2U7CisJX191MzIgYmFzZV9hZGRyLCBtZW1fc2l6ZTsKKwl2b2lkIF9faW9tZW0gKm1lbV9iYXNlOworCisJcCA9IGttYWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKwlwb3MyID0gbWNhX2RldmljZV9yZWFkX3BvcyhtY2FfZGV2LCAyKTsKKwkvKiBlbmFibGUgZGV2aWNlICovCisJcG9zMiB8PSAgTkNSX1E3MjBfUE9TMl9CT0FSRF9FTkFCTEUgfCBOQ1JfUTcyMF9QT1MyX0lOVEVSUlVQVF9FTkFCTEU7CisJbWNhX2RldmljZV93cml0ZV9wb3MobWNhX2RldiwgMiwgcG9zMik7CisKKwlpb19iYXNlID0gKHBvczIgJiBOQ1JfUTcyMF9QT1MyX0lPX01BU0spIDw8IE5DUl9RNzIwX1BPUzJfSU9fU0hJRlQ7CisKKworCWlmKGJhbm5lcikgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5DUiBRNzIwOiBEcml2ZXIgVmVyc2lvbiAiIE5DUl9RNzIwX1ZFUlNJT04gIlxuIgorCQkgICAgICAgIk5DUiBRNzIwOiAgQ29weXJpZ2h0IChjKSAyMDAzIGJ5IEphbWVzLkJvdHRvbWxleUBIYW5zZW5QYXJ0bmVyc2hpcC5jb21cbiIKKwkJICAgICAgICJOQ1IgUTcyMDpcbiIpOworCQliYW5uZXIgPSAwOworCX0KKwlpb19iYXNlID0gbWNhX2RldmljZV90cmFuc2Zvcm1faW9wb3J0KG1jYV9kZXYsIGlvX2Jhc2UpOworCisJLyogT0ssIHRoaXMgaXMgcGhhc2Ugb25lIG9mIHRoZSBib290c3RyYXAsIHdlIG5vdyBrbm93IHRoZQorCSAqIEkvTyBzcGFjZSBiYXNlIGFkZHJlc3MuICBBbGwgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisJICogYXJlIG1hcHBlZCBoZXJlIChpbmNsdWRpbmcgcG9zKSAqLworCisJLyogc2FuaXR5IGNoZWNrIEkvTyBtYXBwaW5nICovCisJaSA9IGluYihpb19iYXNlKSB8IChpbmIoaW9fYmFzZSsxKTw8OCk7CisJaWYoaSAhPSBOQ1JfUTcyMF9NQ0FfSUQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJOQ1JfUTcyMCwgYWRhcHRlciBmYWlsZWQgdG8gSS9PIG1hcCByZWdpc3RlcnMgY29ycmVjdGx5IGF0IDB4JXgoMHgleClcbiIsIGlvX2Jhc2UsIGkpOworCQlrZnJlZShwKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogUGhhc2UgSUksIGZpbmQgdGhlIHJhbSBiYXNlIGFuZCBtZW1vcnkgbWFwIHRoZSBib2FyZCByZWdpc3RlciAqLworCXBvczQgPSBpbmIoaW9fYmFzZSArIDQpOworCS8qIGVuYWJsZSBzdHJlYW1pbmcgZGF0YSAqLworCXBvczQgfD0gMHgwMTsKKwlvdXRiKHBvczQsIGlvX2Jhc2UgKyA0KTsKKwliYXNlX2FkZHIgPSAocG9zNCAmIDB4N2UpIDw8IDIwOworCWJhc2VfYWRkciArPSAocG9zNCAmIDB4ODApIDw8IDIzOworCWFzcjEwID0gaW5iKGlvX2Jhc2UgKyAweDEyKTsKKwliYXNlX2FkZHIgKz0gKGFzcjEwICYgMHg4MCkgPDwgMjQ7CisJYmFzZV9hZGRyICs9IChhc3IxMCAmIDB4NzApIDw8IDIzOworCisJLyogT0ssIGdvdCB0aGUgYmFzZSBhZGRyLCBub3cgd2UgbmVlZCB0byBmaW5kIHRoZSByYW0gc2l6ZSwKKwkgKiBlbmFibGUgYW5kIG1hcCBpdCAqLworCWFzcjkgPSBpbmIoaW9fYmFzZSArIDB4MTEpOworCWkgPSAoYXNyOSAmIDB4YzApID4+IDY7CisJaWYoaSA9PSAwKQorCQltZW1fc2l6ZSA9IDEwMjQ7CisJZWxzZQorCQltZW1fc2l6ZSA9IDEgPDwgKDE5ICsgaSk7CisKKwkvKiBlbmFibGUgdGhlIHNyYW0gbWFwcGluZyAqLworCWFzcjkgfD0gMHgyMDsKKworCS8qIGRpc2FibGUgdGhlIHJvbSBtYXBwaW5nICovCisJYXNyOSAmPSB+MHgxMDsKKworCW91dGIoYXNyOSwgaW9fYmFzZSArIDB4MTEpOworCisJaWYoIXJlcXVlc3RfbWVtX3JlZ2lvbihiYXNlX2FkZHIsIG1lbV9zaXplLCAiTkNSX1E3MjAiKSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5DUl9RNzIwOiBGYWlsZWQgdG8gY2xhaW0gbWVtb3J5IHJlZ2lvbiAweCVseFxuLTB4JWx4IiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKWJhc2VfYWRkciwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKShiYXNlX2FkZHIgKyBtZW1fc2l6ZSkpOworCQlnb3RvIG91dF9mcmVlOworCX0KKwkKKwlpZiAoZG1hX2RlY2xhcmVfY29oZXJlbnRfbWVtb3J5KGRldiwgYmFzZV9hZGRyLCBiYXNlX2FkZHIsCisJCQkJCW1lbV9zaXplLCBETUFfTUVNT1JZX01BUCkKKwkgICAgIT0gRE1BX01FTU9SWV9NQVApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJOQ1JfUTcyMDogRE1BIGRlY2xhcmUgbWVtb3J5IGZhaWxlZFxuIik7CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOworCX0KKworCS8qIFRoZSBmaXJzdCAxayBvZiB0aGUgbWVtb3J5IGJ1ZmZlciBpcyBhIG1lbW9yeSBtYXAgb2YgdGhlIHJlZ2lzdGVycworCSAqLworCW1lbV9iYXNlID0gZG1hX21hcmtfZGVjbGFyZWRfbWVtb3J5X29jY3VwaWVkKGRldiwgYmFzZV9hZGRyLAorCQkJCQkJCSAgICAxMDI0KTsKKwlpZiAoSVNfRVJSKG1lbV9iYXNlKSkgeworCQlwcmludGsoIk5DUl9RNzIwIGZhaWxlZCB0byByZXNlcnZlIG1lbW9yeSBtYXBwZWQgcmVnaW9uXG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisKKwkvKiBub3cgYWxzbyBlbmFibGUgYWNjZXNzZXMgaW4gYXNyIDIgKi8KKwlhc3IyID0gaW5iKGlvX2Jhc2UgKyAweDBhKTsKKworCWFzcjIgfD0gMHgwMTsKKworCW91dGIoYXNyMiwgaW9fYmFzZSArIDB4MGEpOworCisJLyogZ2V0IHRoZSBudW1iZXIgb2YgU0lPUHMgKHRoaXMgc2hvdWxkIGJlIDIgb3IgNCkgKi8KKwlzaW9wcyA9ICgoYXNyMiAmIDB4ZTApID4+IDUpICsgMTsKKworCS8qIHNhbml0eSBjaGVjayBtYXBwaW5nIChhZ2FpbikgKi8KKwlpID0gcmVhZHcobWVtX2Jhc2UpOworCWlmKGkgIT0gTkNSX1E3MjBfTUNBX0lEKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTkNSX1E3MjAsIGFkYXB0ZXIgZmFpbGVkIHRvIG1lbW9yeSBtYXAgcmVnaXN0ZXJzIGNvcnJlY3RseSBhdCAweCVseCgweCV4KVxuIiwgKHVuc2lnbmVkIGxvbmcpYmFzZV9hZGRyLCBpKTsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisKKwlpcnEgPSByZWFkYihtZW1fYmFzZSArIDUpICYgMHgwZjsKKwkKKwkKKwkvKiBub3cgZG8gdGhlIGJ1cyByZWxhdGVkIHRyYW5zZm9ybXMgKi8KKwlpcnEgPSBtY2FfZGV2aWNlX3RyYW5zZm9ybV9pcnEobWNhX2RldiwgaXJxKTsKKworCXByaW50ayhLRVJOX05PVElDRSAiTkNSIFE3MjA6IGZvdW5kIGluIHNsb3QgJWQgIGlycSA9ICVkICBtZW0gYmFzZSA9IDB4JWx4IHNpb3BzID0gJWRcbiIsIHNsb3QsIGlycSwgKHVuc2lnbmVkIGxvbmcpYmFzZV9hZGRyLCBzaW9wcyk7CisJcHJpbnRrKEtFUk5fTk9USUNFICJOQ1IgUTcyMDogT24gYm9hcmQgcmFtICVka1xuIiwgbWVtX3NpemUvMTAyNCk7CisKKwlwLT5kZXYgPSBkZXY7CisJcC0+bWVtX2Jhc2UgPSBtZW1fYmFzZTsKKwlwLT5waHlzX21lbV9iYXNlID0gYmFzZV9hZGRyOworCXAtPm1lbV9zaXplID0gbWVtX3NpemU7CisJcC0+aXJxID0gaXJxOworCXAtPnNpb3BzID0gc2lvcHM7CisKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBOQ1JfUTcyMF9pbnRyLCBTQV9TSElSUSwgIk5DUl9RNzIwIiwgcCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJOQ1JfUTcyMDogcmVxdWVzdCBpcnEgJWQgZmFpbGVkXG4iLCBpcnEpOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKwkvKiBkaXNhYmxlIGFsbCB0aGUgc2lvcCBpbnRlcnJ1cHRzICovCisJZm9yKGkgPSAwOyBpIDwgc2lvcHM7IGkrKykgeworCQl2b2lkIF9faW9tZW0gKnJlZ19zY3NyMSA9IG1lbV9iYXNlICsgTkNSX1E3MjBfQ0hJUF9SRUdJU1RFUl9PRkZTRVQKKwkJCSsgaSpOQ1JfUTcyMF9TSU9QX1NISUZUICsgTkNSX1E3MjBfU0NTUl9PRkZTRVQgKyAxOworCQlfX3U4IHNjc3IxID0gcmVhZGIocmVnX3Njc3IxKTsKKwkJc2NzcjEgfD0gMHgwMTsKKwkJd3JpdGViKHNjc3IxLCByZWdfc2NzcjEpOworCX0KKworCS8qIHBsdW1iIGluIGFsbCA3MjAgY2hpcHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2lvcHM7IGkrKykgeworCQl2b2lkIF9faW9tZW0gKnNpb3Bfdl9iYXNlID0gbWVtX2Jhc2UgKyBOQ1JfUTcyMF9DSElQX1JFR0lTVEVSX09GRlNFVAorCQkJKyBpKk5DUl9RNzIwX1NJT1BfU0hJRlQ7CisJCV9fdTMyIHNpb3BfcF9iYXNlID0gYmFzZV9hZGRyICsgTkNSX1E3MjBfQ0hJUF9SRUdJU1RFUl9PRkZTRVQKKwkJCSsgaSpOQ1JfUTcyMF9TSU9QX1NISUZUOworCQlfX3UxNiBwb3J0ID0gaW9fYmFzZSArIE5DUl9RNzIwX0NISVBfUkVHSVNURVJfT0ZGU0VUCisJCQkrIGkqTkNSX1E3MjBfU0lPUF9TSElGVDsKKwkJaW50IGVycjsKKworCQlvdXRiKDB4ZmYsIHBvcnQgKyAweDQwKTsKKwkJb3V0YigweDA3LCBwb3J0ICsgMHg0MSk7CisJCWlmICgoZXJyID0gTkNSX1E3MjBfcHJvYmVfb25lKHAsIGksIGlycSwgc2xvdCwKKwkJCQkJICAgICAgc2lvcF9wX2Jhc2UsIHNpb3Bfdl9iYXNlKSkgIT0gMCkKKwkJCXByaW50aygiUTcyMDogU0lPUCVkOiBwcm9iZSBmYWlsZWQsIGVycm9yID0gJWRcbiIsCisJCQkgICAgICAgaSwgZXJyKTsKKwkJZWxzZQorCQkJZm91bmQrKzsKKwl9CisKKwlpZiAoIWZvdW5kKSB7CisJCWtmcmVlKHApOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwltY2FfZGV2aWNlX3NldF9jbGFpbShtY2FfZGV2LCAxKTsKKwltY2FfZGV2aWNlX3NldF9uYW1lKG1jYV9kZXYsICJOQ1JfUTcyMCIpOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHApOworCisJcmV0dXJuIDA7CisKKyBvdXRfcmVsZWFzZToKKwlkbWFfcmVsZWFzZV9kZWNsYXJlZF9tZW1vcnkoZGV2KTsKKyBvdXRfcmVsZWFzZV9yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uKGJhc2VfYWRkciwgbWVtX3NpemUpOworIG91dF9mcmVlOgorCWtmcmVlKHApOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorTkNSX1E3MjBfcmVtb3ZlX29uZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CisJbmNyNTNjOHh4X3JlbGVhc2UoaG9zdCk7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0CitOQ1JfUTcyMF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBOQ1JfUTcyMF9wcml2YXRlICpwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcC0+c2lvcHM7IGkrKykKKwkJaWYocC0+aG9zdHNbaV0pCisJCQlOQ1JfUTcyMF9yZW1vdmVfb25lKHAtPmhvc3RzW2ldKTsKKworCWRtYV9yZWxlYXNlX2RlY2xhcmVkX21lbW9yeShkZXYpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihwLT5waHlzX21lbV9iYXNlLCBwLT5tZW1fc2l6ZSk7CisJZnJlZV9pcnEocC0+aXJxLCBwKTsKKwlrZnJlZShwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNob3J0IE5DUl9RNzIwX2lkX3RhYmxlW10gPSB7IE5DUl9RNzIwX01DQV9JRCwgMCB9OworCitzdGF0aWMgc3RydWN0IG1jYV9kcml2ZXIgTkNSX1E3MjBfZHJpdmVyID0geworCS5pZF90YWJsZSA9IE5DUl9RNzIwX2lkX3RhYmxlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCQk9ICJOQ1JfUTcyMCIsCisJCS5idXMJCT0gJm1jYV9idXNfdHlwZSwKKwkJLnByb2JlCQk9IE5DUl9RNzIwX3Byb2JlLAorCQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKE5DUl9RNzIwX3JlbW92ZSksCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitOQ1JfUTcyMF9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IG5jcjUzYzh4eF9pbml0KCk7CisJaWYgKCFyZXQpCisJCXJldCA9IG1jYV9yZWdpc3Rlcl9kcml2ZXIoJk5DUl9RNzIwX2RyaXZlcik7CisJaWYgKHJldCkKKwkJbmNyNTNjOHh4X2V4aXQoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK05DUl9RNzIwX2V4aXQodm9pZCkKK3sKKwltY2FfdW5yZWdpc3Rlcl9kcml2ZXIoJk5DUl9RNzIwX2RyaXZlcik7CisJbmNyNTNjOHh4X2V4aXQoKTsKK30KKworbW9kdWxlX2luaXQoTkNSX1E3MjBfaW5pdCk7Cittb2R1bGVfZXhpdChOQ1JfUTcyMF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9OQ1JfUTcyMC5oIGIvZHJpdmVycy9zY3NpL05DUl9RNzIwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5MjA5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9OQ1JfUTcyMC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogOCAtKi0gKi8KKworLyogTkNSIFF1YWQgNzIwIE1DQSBTQ1NJIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBieSBKYW1lcy5Cb3R0b21sZXlASGFuc2VuUGFydG5lcnNoaXAuY29tCisgKi8KKworI2lmbmRlZiBfTkNSX1E3MjBfSAorI2RlZmluZSBfTkNSX1E3MjBfSAorCisvKiBUaGUgTUNBIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgTkNSX1E3MjBfTUNBX0lECQkweDA3MjAKKworI2RlZmluZSBOQ1JfUTcyMF9DTE9DS19NSFoJMzAKKworI2RlZmluZSBOQ1JfUTcyMF9QT1MyX0JPQVJEX0VOQUJMRQkweDAxCisjZGVmaW5lIE5DUl9RNzIwX1BPUzJfSU5URVJSVVBUX0VOQUJMRQkweDAyCisjZGVmaW5lIE5DUl9RNzIwX1BPUzJfUEFSSVRZX0RJU0FCTEUJMHgwNAorI2RlZmluZSBOQ1JfUTcyMF9QT1MyX0lPX01BU0sJCTB4ZjgKKyNkZWZpbmUgTkNSX1E3MjBfUE9TMl9JT19TSElGVAkJOAorCisjZGVmaW5lIE5DUl9RNzIwX0NISVBfUkVHSVNURVJfT0ZGU0VUCTB4MjAwCisjZGVmaW5lIE5DUl9RNzIwX1NDU1JfT0ZGU0VUCQkweDA3MAorI2RlZmluZSBOQ1JfUTcyMF9TSU9QX1NISUZUCQkweDA4MAorCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYTEwMHUydy5jIGIvZHJpdmVycy9zY3NpL2ExMDB1MncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQ0MDNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2ExMDB1MncuYwpAQCAtMCwwICsxLDEyMDIgQEAKKy8qCisgKiBJbml0aW8gQTEwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5OCBJbml0aW8gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IENocmlzdG9waCBIZWxsd2lnCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGltbWVkaWF0ZWx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogV2hlcmUgdGhpcyBTb2Z0d2FyZSBpcyBjb21iaW5lZCB3aXRoIHNvZnR3YXJlIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiAKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFuZCB0aGUgdGVybXMgb2YgdGhlIEdQTCB3b3VsZCByZXF1aXJlIHRoZSAKKyAqIGNvbWJpbmVkIHdvcmsgdG8gYWxzbyBiZSByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCwgdGhlIHRlcm1zCisgKiBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2Ugd2lsbCBhcHBseSBpbiBhZGRpdGlvbiB0byB0aG9zZSBvZiB0aGUKKyAqIEdQTCB3aXRoIHRoZSBleGNlcHRpb24gb2YgYW55IHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlIHRoYXQKKyAqIGNvbmZsaWN0IHdpdGgsIG9yIGFyZSBleHByZXNzbHkgcHJvaGliaXRlZCBieSwgdGhlIEdQTC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBSZXZpc2lvbiBIaXN0b3J5OgorICogMDcvMDIvOTggaGwJLSB2LjkxbiBJbml0aWFsIGRyaXZlcnMuCisgKiAwOS8xNC85OCBobCAtIHYxLjAxIFN1cHBvcnQgbmV3IEtlcm5lbC4KKyAqIDA5LzIyLzk4IGhsIC0gdjEuMDFhIFN1cHBvcnQgcmVzZXQuCisgKiAwOS8yNC85OCBobCAtIHYxLjAxYiBGaXhlZCByZXNldC4KKyAqIDEwLzA1Lzk4IGhsIC0gdjEuMDIgc3BsaXQgdGhlIHNvdXJjZSBjb2RlIGFuZCByZWxlYXNlLgorICogMTIvMTkvOTggYnYgLSB2MS4wMmEgVXNlIHNwaW5sb2NrcyBmb3IgMi4xLjk1IGFuZCB1cAorICogMDEvMzEvOTkgYnYgLSB2MS4wMmIgVXNlIG1kZWxheSBpbnN0ZWFkIG9mIHdhaXRGb3JQYXVzZQorICogMDgvMDgvOTkgYnYgLSB2MS4wMmMgVXNlIHdhaXRGb3JQYXVzZSBhZ2Fpbi4KKyAqIDA2LzI1LzAyIERvdWcgTGVkZm9yZCA8ZGxlZGZvcmRAcmVkaGF0LmNvbT4gLSB2MS4wMmQKKyAqICAgICAgICAgIC0gUmVtb3ZlIGxpbWl0IG9uIG51bWJlciBvZiBjb250cm9sbGVycworICogICAgICAgICAgLSBQb3J0IHRvIERNQSBtYXBwaW5nIEFQSQorICogICAgICAgICAgLSBDbGVhbiB1cCBpbnRlcnJ1cHQgaGFuZGxlciByZWdpc3RyYXRpb24KKyAqICAgICAgICAgIC0gRml4IG1lbW9yeSBsZWFrcworICogICAgICAgICAgLSBGaXggYWxsb2NhdGlvbiBvZiBzY3NpIGhvc3Qgc3RydWN0cyBhbmQgcHJpdmF0ZSBkYXRhCisgKiAxMS8xOC8wMyBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGxzdC5kZT4KKyAqCSAgICAtIFBvcnQgdG8gbmV3IHByb2JpbmcgQVBJCisgKgkgICAgLSBGaXggc29tZSBtb3JlIGxlYWtzIGluIGluaXQgZmFpbHVyZSBjYXNlcworICogOS8yOC8wNCBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGxzdC5kZT4KKyAqCSAgICAtIG1lcmdlIHRoZSB0d28gc291cmNlIGZpbGVzCisgKgkgICAgLSByZW1vdmUgaW50ZXJuYWwgcXVldWVpbmcgY29kZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2luY2x1ZGUgImExMDB1MncuaCIKKworCisjZGVmaW5lIEpJRkZJRVNfVE9fTVModCkgKCh0KSAqIDEwMDAgLyBIWikKKyNkZWZpbmUgTVNfVE9fSklGRklFUyhqKSAoKGogKiBIWikgLyAxMDAwKQorCitzdGF0aWMgT1JDX1NDQiAqb3JjX2FsbG9jX3NjYihPUkNfSENTICogaGNzcCk7CitzdGF0aWMgdm9pZCBpbmlhMTAwU0NCUG9zdChCWVRFICogcEhjYiwgQllURSAqIHBTY2IpOworCitzdGF0aWMgTlZSQU0gbnZyYW0sICpudnJhbXAgPSAmbnZyYW07CitzdGF0aWMgVUNIQVIgZGZ0TnZSYW1bNjRdID0KK3sKKy8qLS0tLS0tLS0tLWhlYWRlciAtLS0tLS0tLS0tLS0tKi8KKwkweDAxLAkJCS8qIDB4MDA6IFN1YiBTeXN0ZW0gVmVuZG9yIElEIDAgKi8KKwkweDExLAkJCS8qIDB4MDE6IFN1YiBTeXN0ZW0gVmVuZG9yIElEIDEgKi8KKwkweDYwLAkJCS8qIDB4MDI6IFN1YiBTeXN0ZW0gSUQgMCAgICAgICAgKi8KKwkweDEwLAkJCS8qIDB4MDM6IFN1YiBTeXN0ZW0gSUQgMSAgICAgICAgKi8KKwkweDAwLAkJCS8qIDB4MDQ6IFN1YkNsYXNzICAgICAgICAgICAgICAgKi8KKwkweDAxLAkJCS8qIDB4MDU6IFZlbmRvciBJRCAwICAgICAgICAgICAgKi8KKwkweDExLAkJCS8qIDB4MDY6IFZlbmRvciBJRCAxICAgICAgICAgICAgKi8KKwkweDYwLAkJCS8qIDB4MDc6IERldmljZSBJRCAwICAgICAgICAgICAgKi8KKwkweDEwLAkJCS8qIDB4MDg6IERldmljZSBJRCAxICAgICAgICAgICAgKi8KKwkweDAwLAkJCS8qIDB4MDk6IFJlc2VydmVkICAgICAgICAgICAgICAgKi8KKwkweDAwLAkJCS8qIDB4MEE6IFJlc2VydmVkICAgICAgICAgICAgICAgKi8KKwkweDAxLAkJCS8qIDB4MEI6IFJldmlzaW9uIG9mIERhdGEgU3RydWN0dXJlICAgICAqLworCQkJCS8qIC0tIEhvc3QgQWRhcHRlciBTdHJ1Y3R1cmUgLS0tICovCisJMHgwMSwJCQkvKiAweDBDOiBOdW1iZXIgT2YgU0NTSSBDaGFubmVsICovCisJMHgwMSwJCQkvKiAweDBEOiBCSU9TIENvbmZpZ3VyYXRpb24gMSAgICovCisJMHgwMCwJCQkvKiAweDBFOiBCSU9TIENvbmZpZ3VyYXRpb24gMiAgICovCisJMHgwMCwJCQkvKiAweDBGOiBCSU9TIENvbmZpZ3VyYXRpb24gMyAgICovCisJCQkJLyogLS0tIFNDU0kgQ2hhbm5lbCAwIENvbmZpZ3VyYXRpb24gLS0tICovCisJMHgwNywJCQkvKiAweDEwOiBIL0EgSUQgICAgICAgICAgICAgICAgICovCisJMHg4MywJCQkvKiAweDExOiBDaGFubmVsIENvbmZpZ3VyYXRpb24gICovCisJMHgyMCwJCQkvKiAweDEyOiBNQVggVEFHIHBlciB0YXJnZXQgICAgICovCisJMHgwQSwJCQkvKiAweDEzOiBTQ1NJIFJlc2V0IFJlY292ZXJpbmcgdGltZSAgICAgKi8KKwkweDAwLAkJCS8qIDB4MTQ6IENoYW5uZWwgQ29uZmlndXJhdGlvbjQgKi8KKwkweDAwLAkJCS8qIDB4MTU6IENoYW5uZWwgQ29uZmlndXJhdGlvbjUgKi8KKwkJCQkvKiBTQ1NJIENoYW5uZWwgMCBUYXJnZXQgQ29uZmlndXJhdGlvbiAgKi8KKwkJCQkvKiAweDE2LTB4MjUgICAgICAgICAgICAgICAgICAgICovCisJMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwKKwkweEM4LCAweEM4LCAweEM4LCAweEM4LCAweEM4LCAweEM4LCAweEM4LCAweEM4LAorCQkJCS8qIC0tLSBTQ1NJIENoYW5uZWwgMSBDb25maWd1cmF0aW9uIC0tLSAqLworCTB4MDcsCQkJLyogMHgyNjogSC9BIElEICAgICAgICAgICAgICAgICAqLworCTB4ODMsCQkJLyogMHgyNzogQ2hhbm5lbCBDb25maWd1cmF0aW9uICAqLworCTB4MjAsCQkJLyogMHgyODogTUFYIFRBRyBwZXIgdGFyZ2V0ICAgICAqLworCTB4MEEsCQkJLyogMHgyOTogU0NTSSBSZXNldCBSZWNvdmVyaW5nIHRpbWUgICAgICovCisJMHgwMCwJCQkvKiAweDJBOiBDaGFubmVsIENvbmZpZ3VyYXRpb240ICovCisJMHgwMCwJCQkvKiAweDJCOiBDaGFubmVsIENvbmZpZ3VyYXRpb241ICovCisJCQkJLyogU0NTSSBDaGFubmVsIDEgVGFyZ2V0IENvbmZpZ3VyYXRpb24gICovCisJCQkJLyogMHgyQy0weDNCICAgICAgICAgICAgICAgICAgICAqLworCTB4QzgsIDB4QzgsIDB4QzgsIDB4QzgsIDB4QzgsIDB4QzgsIDB4QzgsIDB4QzgsCisJMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwKKwkweDAwLAkJCS8qIDB4M0M6IFJlc2VydmVkICAgICAgICAgICAgICAgKi8KKwkweDAwLAkJCS8qIDB4M0Q6IFJlc2VydmVkICAgICAgICAgICAgICAgKi8KKwkweDAwLAkJCS8qIDB4M0U6IFJlc2VydmVkICAgICAgICAgICAgICAgKi8KKwkweDAwCQkJLyogMHgzRjogQ2hlY2tzdW0gICAgICAgICAgICAgICAqLworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgd2FpdEZvclBhdXNlKHVuc2lnbmVkIGFtb3VudCkKK3sKKwlVTE9ORyB0aGVfdGltZSA9IGppZmZpZXMgKyBNU19UT19KSUZGSUVTKGFtb3VudCk7CisJd2hpbGUgKHRpbWVfYmVmb3JlX2VxKGppZmZpZXMsIHRoZV90aW1lKSkKKwkJY3B1X3JlbGF4KCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUNIQVIgd2FpdENoaXBSZWFkeShPUkNfSENTICogaGNzcCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CS8qIFdhaXQgMSBzZWNvbmQgZm9yIHJlcG9ydCB0aW1lb3V0ICAgICAqLworCQlpZiAoT1JDX1JEKGhjc3AtPkhDU19CYXNlLCBPUkNfSENUUkwpICYgSE9TVFNUT1ApCS8qIFdhaXQgSE9TVFNUT1Agc2V0ICovCisJCQlyZXR1cm4gMTsKKwkJd2FpdEZvclBhdXNlKDEwMCk7CS8qIHdhaXQgMTAwbXMgYmVmb3JlIHRyeSBhZ2FpbiAgKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUNIQVIgd2FpdEZXUmVhZHkoT1JDX0hDUyAqIGhjc3ApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewkvKiBXYWl0IDEgc2Vjb25kIGZvciByZXBvcnQgdGltZW91dCAgICAgKi8KKwkJaWYgKE9SQ19SRChoY3NwLT5IQ1NfQmFzZSwgT1JDX0hTVFVTKSAmIFJSRUFEWSkJCS8qIFdhaXQgUkVBRFkgc2V0ICovCisJCQlyZXR1cm4gMTsKKwkJd2FpdEZvclBhdXNlKDEwMCk7CS8qIHdhaXQgMTAwbXMgYmVmb3JlIHRyeSBhZ2FpbiAgKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUNIQVIgd2FpdFNDU0lSU1Rkb25lKE9SQ19IQ1MgKiBoY3NwKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsJLyogV2FpdCAxIHNlY29uZCBmb3IgcmVwb3J0IHRpbWVvdXQgICAgICovCisJCWlmICghKE9SQ19SRChoY3NwLT5IQ1NfQmFzZSwgT1JDX0hDVFJMKSAmIFNDU0lSU1QpKQkvKiBXYWl0IFNDU0lSU1QgZG9uZSAqLworCQkJcmV0dXJuIDE7CisJCXdhaXRGb3JQYXVzZSgxMDApOwkvKiB3YWl0IDEwMG1zIGJlZm9yZSB0cnkgYWdhaW4gICovCisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVDSEFSIHdhaXRIRE9vZmYoT1JDX0hDUyAqIGhjc3ApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewkvKiBXYWl0IDEgc2Vjb25kIGZvciByZXBvcnQgdGltZW91dCAgICAgKi8KKwkJaWYgKCEoT1JDX1JEKGhjc3AtPkhDU19CYXNlLCBPUkNfSENUUkwpICYgSERPKSkJCS8qIFdhaXQgSERPIG9mZiAqLworCQkJcmV0dXJuIDE7CisJCXdhaXRGb3JQYXVzZSgxMDApOwkvKiB3YWl0IDEwMG1zIGJlZm9yZSB0cnkgYWdhaW4gICovCisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVDSEFSIHdhaXRIRElzZXQoT1JDX0hDUyAqIGhjc3AsIFVDSEFSICogcERhdGEpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewkvKiBXYWl0IDEgc2Vjb25kIGZvciByZXBvcnQgdGltZW91dCAgICAgKi8KKwkJaWYgKCgqcERhdGEgPSBPUkNfUkQoaGNzcC0+SENTX0Jhc2UsIE9SQ19IU1RVUykpICYgSERJKQorCQkJcmV0dXJuIDE7CS8qIFdhaXQgSERJIHNldCAqLworCQl3YWl0Rm9yUGF1c2UoMTAwKTsJLyogd2FpdCAxMDBtcyBiZWZvcmUgdHJ5IGFnYWluICAqLworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBnZXRfRldfdmVyc2lvbihPUkNfSENTICogaGNzcCkKK3sKKwlVQ0hBUiBiRGF0YTsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIHNob3J0IHNWZXJzaW9uOworCQl1bnNpZ25lZCBjaGFyIGNWZXJzaW9uWzJdOworCX0gVmVyc2lvbjsKKworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19IREFUQSwgT1JDX0NNRF9WRVJTSU9OKTsKKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfSENUUkwsIEhETyk7CisJaWYgKHdhaXRIRE9vZmYoaGNzcCkgPT0gMCkJLyogV2FpdCBIRE8gb2ZmICAgKi8KKwkJcmV0dXJuIDA7CisKKwlpZiAod2FpdEhESXNldChoY3NwLCAmYkRhdGEpID09IDApCS8qIFdhaXQgSERJIHNldCAgICovCisJCXJldHVybiAwOworCVZlcnNpb24uY1ZlcnNpb25bMF0gPSBPUkNfUkQoaGNzcC0+SENTX0Jhc2UsIE9SQ19IREFUQSk7CisJT1JDX1dSKGhjc3AtPkhDU19CYXNlICsgT1JDX0hTVFVTLCBiRGF0YSk7CS8qIENsZWFyIEhESSAgICAgICAgICAgICovCisKKwlpZiAod2FpdEhESXNldChoY3NwLCAmYkRhdGEpID09IDApCS8qIFdhaXQgSERJIHNldCAgICovCisJCXJldHVybiAwOworCVZlcnNpb24uY1ZlcnNpb25bMV0gPSBPUkNfUkQoaGNzcC0+SENTX0Jhc2UsIE9SQ19IREFUQSk7CisJT1JDX1dSKGhjc3AtPkhDU19CYXNlICsgT1JDX0hTVFVTLCBiRGF0YSk7CS8qIENsZWFyIEhESSAgICAgICAgICAgICovCisKKwlyZXR1cm4gKFZlcnNpb24uc1ZlcnNpb24pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVDSEFSIHNldF9OVlJBTShPUkNfSENTICogaGNzcCwgdW5zaWduZWQgY2hhciBhZGRyZXNzLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19IREFUQSwgT1JDX0NNRF9TRVRfTlZNKTsJLyogV3JpdGUgY29tbWFuZCAqLworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19IQ1RSTCwgSERPKTsKKwlpZiAod2FpdEhET29mZihoY3NwKSA9PSAwKQkvKiBXYWl0IEhETyBvZmYgICAqLworCQlyZXR1cm4gMDsKKworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19IREFUQSwgYWRkcmVzcyk7CS8qIFdyaXRlIGFkZHJlc3MgKi8KKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfSENUUkwsIEhETyk7CisJaWYgKHdhaXRIRE9vZmYoaGNzcCkgPT0gMCkJLyogV2FpdCBIRE8gb2ZmICAgKi8KKwkJcmV0dXJuIDA7CisKKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfSERBVEEsIHZhbHVlKTsJLyogV3JpdGUgdmFsdWUgICovCisJT1JDX1dSKGhjc3AtPkhDU19CYXNlICsgT1JDX0hDVFJMLCBIRE8pOworCWlmICh3YWl0SERPb2ZmKGhjc3ApID09IDApCS8qIFdhaXQgSERPIG9mZiAgICovCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUNIQVIgZ2V0X05WUkFNKE9SQ19IQ1MgKiBoY3NwLCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsIHVuc2lnbmVkIGNoYXIgKnBEYXRhSW4pCit7CisJdW5zaWduZWQgY2hhciBiRGF0YTsKKworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19IREFUQSwgT1JDX0NNRF9HRVRfTlZNKTsJLyogV3JpdGUgY29tbWFuZCAqLworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19IQ1RSTCwgSERPKTsKKwlpZiAod2FpdEhET29mZihoY3NwKSA9PSAwKQkvKiBXYWl0IEhETyBvZmYgICAqLworCQlyZXR1cm4gMDsKKworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19IREFUQSwgYWRkcmVzcyk7CS8qIFdyaXRlIGFkZHJlc3MgKi8KKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfSENUUkwsIEhETyk7CisJaWYgKHdhaXRIRE9vZmYoaGNzcCkgPT0gMCkJLyogV2FpdCBIRE8gb2ZmICAgKi8KKwkJcmV0dXJuIDA7CisKKwlpZiAod2FpdEhESXNldChoY3NwLCAmYkRhdGEpID09IDApCS8qIFdhaXQgSERJIHNldCAgICovCisJCXJldHVybiAwOworCSpwRGF0YUluID0gT1JDX1JEKGhjc3AtPkhDU19CYXNlLCBPUkNfSERBVEEpOworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19IU1RVUywgYkRhdGEpOwkvKiBDbGVhciBIREkgICAgKi8KKworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgb3JjX2V4ZWNfc2NiKE9SQ19IQ1MgKiBoY3NwLCBPUkNfU0NCICogc2NicCkKK3sKKwlzY2JwLT5TQ0JfU3RhdHVzID0gT1JDU0NCX1BPU1Q7CisJT1JDX1dSKGhjc3AtPkhDU19CYXNlICsgT1JDX1BRVUVVRSwgc2NicC0+U0NCX1NjYklkeCk7CisJcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFJlYWQgU0NTSSBIL0EgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZyb20gc2VyaWFsIEVFUFJPTQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBzZTJfcmRfYWxsKE9SQ19IQ1MgKiBoY3NwKQoreworCWludCBpOworCVVDSEFSICpucCwgY2hrc3VtID0gMDsKKworCW5wID0gKFVDSEFSICopIG52cmFtcDsKKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKywgbnArKykgewkvKiA8MDE+ICovCisJCWlmIChnZXRfTlZSQU0oaGNzcCwgKHVuc2lnbmVkIGNoYXIpIGksIG5wKSA9PSAwKQorCQkJcmV0dXJuIC0xOworLy8gICAgICAqbnArKyA9IGdldF9OVlJBTShoY3NwLCAodW5zaWduZWQgY2hhciApIGkpOworCX0KKworLyotLS0tLS0gSXMgY2tlY2tzdW0gb2sgPyAtLS0tLS0qLworCW5wID0gKFVDSEFSICopIG52cmFtcDsKKwlmb3IgKGkgPSAwOyBpIDwgNjM7IGkrKykKKwkJY2hrc3VtICs9ICpucCsrOworCisJaWYgKG52cmFtcC0+Q2hlY2tTdW0gIT0gKFVDSEFSKSBjaGtzdW0pCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFVwZGF0ZSBTQ1NJIEgvQSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZnJvbSBzZXJpYWwgRUVQUk9NCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc2UyX3VwZGF0ZV9hbGwoT1JDX0hDUyAqIGhjc3ApCit7CQkJCS8qIHNldHVwIGRlZmF1bHQgcGF0dGVybiAgKi8KKwlpbnQgaTsKKwlVQ0hBUiAqbnAsICpucDEsIGNoa3N1bSA9IDA7CisKKwkvKiBDYWxjdWxhdGUgY2hlY2tzdW0gZmlyc3QgICAqLworCW5wID0gKFVDSEFSICopIGRmdE52UmFtOworCWZvciAoaSA9IDA7IGkgPCA2MzsgaSsrKQorCQljaGtzdW0gKz0gKm5wKys7CisJKm5wID0gY2hrc3VtOworCisJbnAgPSAoVUNIQVIgKikgZGZ0TnZSYW07CisJbnAxID0gKFVDSEFSICopIG52cmFtcDsKKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKywgbnArKywgbnAxKyspIHsKKwkJaWYgKCpucCAhPSAqbnAxKSB7CisJCQlzZXRfTlZSQU0oaGNzcCwgKHVuc2lnbmVkIGNoYXIpIGksICpucCk7CisJCX0KKwl9CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9uIG5hbWUgIDogcmVhZF9lZXByb20KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcmVhZF9lZXByb20oT1JDX0hDUyAqIGhjc3ApCit7CisJaWYgKHNlMl9yZF9hbGwoaGNzcCkgIT0gMSkgeworCQlzZTJfdXBkYXRlX2FsbChoY3NwKTsJLyogc2V0dXAgZGVmYXVsdCBwYXR0ZXJuICAgICAgICAqLworCQlzZTJfcmRfYWxsKGhjc3ApOwkvKiBsb2FkIGFnYWluICAgICAgICAgICAgICAgICAgICovCisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUNIQVIgbG9hZF9GVyhPUkNfSENTICogaGNzcCkKK3sKKwlVMzIgZERhdGE7CisJVVNIT1JUIHdCSU9TQWRkcmVzczsKKwlVU0hPUlQgaTsKKwlVQ0hBUiAqcERhdGEsIGJEYXRhOworCisKKwliRGF0YSA9IE9SQ19SRChoY3NwLT5IQ1NfQmFzZSwgT1JDX0dDRkcpOworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19HQ0ZHLCBiRGF0YSB8IEVFUFJHKTsJLyogRW5hYmxlIEVFUFJPTSBwcm9ncmFtbWluZyAqLworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19FQklPU0FEUjIsIDB4MDApOworCU9SQ19XUlNIT1JUKGhjc3AtPkhDU19CYXNlICsgT1JDX0VCSU9TQURSMCwgMHgwMCk7CisJaWYgKE9SQ19SRChoY3NwLT5IQ1NfQmFzZSwgT1JDX0VCSU9TREFUQSkgIT0gMHg1NSkgeworCQlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfR0NGRywgYkRhdGEpOwkvKiBEaXNhYmxlIEVFUFJPTSBwcm9ncmFtbWluZyAqLworCQlyZXR1cm4gMDsKKwl9CisJT1JDX1dSU0hPUlQoaGNzcC0+SENTX0Jhc2UgKyBPUkNfRUJJT1NBRFIwLCAweDAxKTsKKwlpZiAoT1JDX1JEKGhjc3AtPkhDU19CYXNlLCBPUkNfRUJJT1NEQVRBKSAhPSAweEFBKSB7CisJCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19HQ0ZHLCBiRGF0YSk7CS8qIERpc2FibGUgRUVQUk9NIHByb2dyYW1taW5nICovCisJCXJldHVybiAwOworCX0KKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfUklTQ0NUTCwgUFJHTVJTVCB8IERPV05MT0FEKTsJLyogRW5hYmxlIFNSQU0gcHJvZ3JhbW1pbmcgKi8KKwlwRGF0YSA9IChVQ0hBUiAqKSAmIGREYXRhOworCWREYXRhID0gMDsJCS8qIEluaXRpYWwgRlcgYWRkcmVzcyB0byAwICovCisJT1JDX1dSU0hPUlQoaGNzcC0+SENTX0Jhc2UgKyBPUkNfRUJJT1NBRFIwLCAweDEwKTsKKwkqcERhdGEgPSBPUkNfUkQoaGNzcC0+SENTX0Jhc2UsIE9SQ19FQklPU0RBVEEpOwkJLyogUmVhZCBmcm9tIEJJT1MgKi8KKwlPUkNfV1JTSE9SVChoY3NwLT5IQ1NfQmFzZSArIE9SQ19FQklPU0FEUjAsIDB4MTEpOworCSoocERhdGEgKyAxKSA9IE9SQ19SRChoY3NwLT5IQ1NfQmFzZSwgT1JDX0VCSU9TREFUQSk7CS8qIFJlYWQgZnJvbSBCSU9TICovCisJT1JDX1dSU0hPUlQoaGNzcC0+SENTX0Jhc2UgKyBPUkNfRUJJT1NBRFIwLCAweDEyKTsKKwkqKHBEYXRhICsgMikgPSBPUkNfUkQoaGNzcC0+SENTX0Jhc2UsIE9SQ19FQklPU0RBVEEpOwkvKiBSZWFkIGZyb20gQklPUyAqLworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19FQklPU0FEUjIsICoocERhdGEgKyAyKSk7CisJT1JDX1dSTE9ORyhoY3NwLT5IQ1NfQmFzZSArIE9SQ19GV0JBU0VBRFIsIGREYXRhKTsJLyogV3JpdGUgRlcgYWRkcmVzcyAqLworCisJd0JJT1NBZGRyZXNzID0gKFVTSE9SVCkgZERhdGE7CS8qIEZXIGNvZGUgbG9jYXRlIGF0IEJJT1MgYWRkcmVzcyArID8gKi8KKwlmb3IgKGkgPSAwLCBwRGF0YSA9IChVQ0hBUiAqKSAmIGREYXRhOwkvKiBEb3dubG9hZCB0aGUgY29kZSAgICAqLworCSAgICAgaSA8IDB4MTAwMDsJLyogRmlybXdhcmUgY29kZSBzaXplID0gNEsgICAgICAqLworCSAgICAgaSsrLCB3QklPU0FkZHJlc3MrKykgeworCQlPUkNfV1JTSE9SVChoY3NwLT5IQ1NfQmFzZSArIE9SQ19FQklPU0FEUjAsIHdCSU9TQWRkcmVzcyk7CisJCSpwRGF0YSsrID0gT1JDX1JEKGhjc3AtPkhDU19CYXNlLCBPUkNfRUJJT1NEQVRBKTsJLyogUmVhZCBmcm9tIEJJT1MgKi8KKwkJaWYgKChpICUgNCkgPT0gMykgeworCQkJT1JDX1dSTE9ORyhoY3NwLT5IQ1NfQmFzZSArIE9SQ19SSVNDUkFNLCBkRGF0YSk7CS8qIFdyaXRlIGV2ZXJ5IDQgYnl0ZXMgKi8KKwkJCXBEYXRhID0gKFVDSEFSICopICYgZERhdGE7CisJCX0KKwl9CisKKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfUklTQ0NUTCwgUFJHTVJTVCB8IERPV05MT0FEKTsJLyogUmVzZXQgcHJvZ3JhbSBjb3VudCAwICovCisJd0JJT1NBZGRyZXNzIC09IDB4MTAwMDsJLyogUmVzZXQgdGhlIEJJT1MgYWRkZHJlc3MgICAgICAqLworCWZvciAoaSA9IDAsIHBEYXRhID0gKFVDSEFSICopICYgZERhdGE7CS8qIENoZWNrIHRoZSBjb2RlICAgICAgICovCisJICAgICBpIDwgMHgxMDAwOwkvKiBGaXJtd2FyZSBjb2RlIHNpemUgPSA0SyAgICAgICovCisJICAgICBpKyssIHdCSU9TQWRkcmVzcysrKSB7CisJCU9SQ19XUlNIT1JUKGhjc3AtPkhDU19CYXNlICsgT1JDX0VCSU9TQURSMCwgd0JJT1NBZGRyZXNzKTsKKwkJKnBEYXRhKysgPSBPUkNfUkQoaGNzcC0+SENTX0Jhc2UsIE9SQ19FQklPU0RBVEEpOwkvKiBSZWFkIGZyb20gQklPUyAqLworCQlpZiAoKGkgJSA0KSA9PSAzKSB7CisJCQlpZiAoT1JDX1JETE9ORyhoY3NwLT5IQ1NfQmFzZSwgT1JDX1JJU0NSQU0pICE9IGREYXRhKSB7CisJCQkJT1JDX1dSKGhjc3AtPkhDU19CYXNlICsgT1JDX1JJU0NDVEwsIFBSR01SU1QpOwkvKiBSZXNldCBwcm9ncmFtIHRvIDAgKi8KKwkJCQlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfR0NGRywgYkRhdGEpOwkvKkRpc2FibGUgRUVQUk9NIHByb2dyYW1taW5nICovCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlwRGF0YSA9IChVQ0hBUiAqKSAmIGREYXRhOworCQl9CisJfQorCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19SSVNDQ1RMLCBQUkdNUlNUKTsJLyogUmVzZXQgcHJvZ3JhbSB0byAwICAgKi8KKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfR0NGRywgYkRhdGEpOwkvKiBEaXNhYmxlIEVFUFJPTSBwcm9ncmFtbWluZyAqLworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc2V0dXBfU0NCcyhPUkNfSENTICogaGNzcCkKK3sKKwlPUkNfU0NCICpwVmlyU2NiOworCWludCBpOworCUVTQ0IgKnBWaXJFc2NiOworCWRtYV9hZGRyX3QgcFBoeXNFc2NiOworCisJLyogU2V0dXAgU0NCIEhDU19CYXNlIGFuZCBTQ0IgU2l6ZSByZWdpc3RlcnMgKi8KKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfU0NCU0laRSwgT1JDX01BWFFVRVVFKTsJLyogVG90YWwgbnVtYmVyIG9mIFNDQnMgKi8KKwkvKiBTQ0IgSENTX0Jhc2UgYWRkcmVzcyAwICAgICAgKi8KKwlPUkNfV1JMT05HKGhjc3AtPkhDU19CYXNlICsgT1JDX1NDQkJBU0UwLCBoY3NwLT5IQ1NfcGh5c1NjYkFycmF5KTsKKwkvKiBTQ0IgSENTX0Jhc2UgYWRkcmVzcyAxICAgICAgKi8KKwlPUkNfV1JMT05HKGhjc3AtPkhDU19CYXNlICsgT1JDX1NDQkJBU0UxLCBoY3NwLT5IQ1NfcGh5c1NjYkFycmF5KTsKKworCS8qIHNldHVwIHNjYXR0ZXIgbGlzdCBhZGRyZXNzIHdpdGggb25lIGJ1ZmZlciAqLworCXBWaXJTY2IgPSBoY3NwLT5IQ1NfdmlyU2NiQXJyYXk7CisJcFZpckVzY2IgPSBoY3NwLT5IQ1NfdmlyRXNjYkFycmF5OworCisJZm9yIChpID0gMDsgaSA8IE9SQ19NQVhRVUVVRTsgaSsrKSB7CisJCXBQaHlzRXNjYiA9IChoY3NwLT5IQ1NfcGh5c0VzY2JBcnJheSArIChzaXplb2YoRVNDQikgKiBpKSk7CisJCXBWaXJTY2ItPlNDQl9TR1BBZGRyID0gKFUzMikgcFBoeXNFc2NiOworCQlwVmlyU2NiLT5TQ0JfU2Vuc2VQQWRkciA9IChVMzIpIHBQaHlzRXNjYjsKKwkJcFZpclNjYi0+U0NCX0VTY2IgPSBwVmlyRXNjYjsKKwkJcFZpclNjYi0+U0NCX1NjYklkeCA9IGk7CisJCXBWaXJTY2IrKzsKKwkJcFZpckVzY2IrKzsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBpbml0QUZsYWcoT1JDX0hDUyAqIGhjc3ApCit7CisJVUNIQVIgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0hBTk5FTFM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCQloY3NwLT5CaXRBbGxvY0ZsYWdbaV1bal0gPSAweGZmZmZmZmZmOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBpbml0X29yY2hpZChPUkNfSENTICogaGNzcCkKK3sKKwlVQllURSAqcmVhZEJ5dGVwOworCVVTSE9SVCByZXZpc2lvbjsKKwlVQ0hBUiBpOworCisJaW5pdEFGbGFnKGhjc3ApOworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19HSU1TSywgMHhGRik7CS8qIERpc2FibGUgYWxsIGludGVycnVwdCAgICAgICAgKi8KKwlpZiAoT1JDX1JEKGhjc3AtPkhDU19CYXNlLCBPUkNfSFNUVVMpICYgUlJFQURZKSB7CS8qIE9yY2hpZCBpcyByZWFkeSAgICAgICAgICAgICAgKi8KKwkJcmV2aXNpb24gPSBnZXRfRldfdmVyc2lvbihoY3NwKTsKKwkJaWYgKHJldmlzaW9uID09IDB4RkZGRikgeworCQkJT1JDX1dSKGhjc3AtPkhDU19CYXNlICsgT1JDX0hDVFJMLCBERVZSU1QpOwkvKiBSZXNldCBIb3N0IEFkYXB0ZXIgICAqLworCQkJaWYgKHdhaXRDaGlwUmVhZHkoaGNzcCkgPT0gMCkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWxvYWRfRlcoaGNzcCk7CS8qIERvd25sb2FkIEZXICAgICAgICAgICAgICAgICAgKi8KKwkJCXNldHVwX1NDQnMoaGNzcCk7CS8qIFNldHVwIFNDQiBIQ1NfQmFzZSBhbmQgU0NCIFNpemUgcmVnaXN0ZXJzICovCisJCQlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfSENUUkwsIDApOwkvKiBjbGVhciBIT1NUU1RPUCAgICAgICAqLworCQkJaWYgKHdhaXRGV1JlYWR5KGhjc3ApID09IDApCisJCQkJcmV0dXJuICgtMSk7CisJCQkvKiBXYWl0IGZvciBmaXJtd2FyZSByZWFkeSAgICAgKi8KKwkJfSBlbHNlIHsKKwkJCXNldHVwX1NDQnMoaGNzcCk7CS8qIFNldHVwIFNDQiBIQ1NfQmFzZSBhbmQgU0NCIFNpemUgcmVnaXN0ZXJzICovCisJCX0KKwl9IGVsc2UgewkJLyogT3JjaGlkIGlzIG5vdCBSZWFkeSAgICAgICAgICAqLworCQlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfSENUUkwsIERFVlJTVCk7CS8qIFJlc2V0IEhvc3QgQWRhcHRlciAgICovCisJCWlmICh3YWl0Q2hpcFJlYWR5KGhjc3ApID09IDApCisJCQlyZXR1cm4gKC0xKTsKKwkJbG9hZF9GVyhoY3NwKTsJLyogRG93bmxvYWQgRlcgICAgICAgICAgICAgICAgICAqLworCQlzZXR1cF9TQ0JzKGhjc3ApOwkvKiBTZXR1cCBTQ0IgSENTX0Jhc2UgYW5kIFNDQiBTaXplIHJlZ2lzdGVycyAqLworCQlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfSENUUkwsIEhETyk7CS8qIERvIEhhcmR3YXJlIFJlc2V0ICYgICovCisKKwkJLyogICAgIGNsZWFyIEhPU1RTVE9QICAqLworCQlpZiAod2FpdEZXUmVhZHkoaGNzcCkgPT0gMCkJCS8qIFdhaXQgZm9yIGZpcm13YXJlIHJlYWR5ICAgICAgKi8KKwkJCXJldHVybiAoLTEpOworCX0KKworLyotLS0tLS0tLS0tLS0tIGdldCBzZXJpYWwgRUVQcm9tIHNldHR0aW5nIC0tLS0tLS0qLworCisJcmVhZF9lZXByb20oaGNzcCk7CisKKwlpZiAobnZyYW1wLT5SZXZpc2lvbiAhPSAxKQorCQlyZXR1cm4gKC0xKTsKKworCWhjc3AtPkhDU19TQ1NJX0lEID0gbnZyYW1wLT5TQ1NJMElkOworCWhjc3AtPkhDU19CSU9TID0gbnZyYW1wLT5CSU9TQ29uZmlnMTsKKwloY3NwLT5IQ1NfTWF4VGFyID0gTUFYX1RBUkdFVFM7CisJcmVhZEJ5dGVwID0gKFVDSEFSICopICYgKG52cmFtcC0+VGFyZ2V0MDBDb25maWcpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgcmVhZEJ5dGVwKyssIGkrKykgeworCQloY3NwLT5UYXJnZXRGbGFnW2ldID0gKnJlYWRCeXRlcDsKKwkJaGNzcC0+TWF4aW11bVRhZ3NbaV0gPSBPUkNfTUFYVEFHUzsKKwl9CQkJLyogZm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJaWYgKG52cmFtcC0+U0NTSTBDb25maWcgJiBOQ0NfQlVTUkVTRVQpIHsJLyogUmVzZXQgU0NTSSBidXMgICAgICAgICAgICAgICAqLworCQloY3NwLT5IQ1NfRmxhZ3MgfD0gSENGX1NDU0lfUkVTRVQ7CisJfQorCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19HSU1TSywgMHhGQik7CS8qIGVuYWJsZSBSUCBGSUZPIGludGVycnVwdCAgICAgKi8KKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbiBuYW1lICA6IG9yY19yZXNldF9zY3NpX2J1cworIERlc2NyaXB0aW9uICAgIDogUmVzZXQgcmVnaXN0ZXJzLCByZXNldCBhIGhhbmdpbmcgYnVzIGFuZAorICAgICAgICAgICAgICAgICAga2lsbCBhY3RpdmUgYW5kIGRpc2Nvbm5lY3RlZCBjb21tYW5kcyBmb3IgdGFyZ2V0IHcvbyBzb2Z0IHJlc2V0CisgSW5wdXQgICAgICAgICAgOiBwSENCICAtICAgICAgIFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZQorIE91dHB1dCAgICAgICAgIDogTm9uZS4KKyBSZXR1cm4gICAgICAgICA6IHBTUkIgIC0gICAgICAgUG9pbnRlciB0byBTQ1NJIHJlcXVlc3QgYmxvY2suCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgb3JjX3Jlc2V0X3Njc2lfYnVzKE9SQ19IQ1MgKiBwSENCKQorewkJCQkvKiBJIG5lZWQgSG9zdCBDb250cm9sIEJsb2NrIEluZm9ybWF0aW9uICovCisJVUxPTkcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHBIQ0ItPkJpdEFsbG9jRmxhZ0xvY2spLCBmbGFncyk7CisKKwlpbml0QUZsYWcocEhDQik7CisJLyogcmVzZXQgc2NzaSBidXMgKi8KKwlPUkNfV1IocEhDQi0+SENTX0Jhc2UgKyBPUkNfSENUUkwsIFNDU0lSU1QpOworCWlmICh3YWl0U0NTSVJTVGRvbmUocEhDQikgPT0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEhDQi0+Qml0QWxsb2NGbGFnTG9jayksIGZsYWdzKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEhDQi0+Qml0QWxsb2NGbGFnTG9jayksIGZsYWdzKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbiBuYW1lICA6IG9yY19kZXZpY2VfcmVzZXQKKyBEZXNjcmlwdGlvbiAgICA6IFJlc2V0IHJlZ2lzdGVycywgcmVzZXQgYSBoYW5naW5nIGJ1cyBhbmQKKyAgICAgICAgICAgICAgICAgIGtpbGwgYWN0aXZlIGFuZCBkaXNjb25uZWN0ZWQgY29tbWFuZHMgZm9yIHRhcmdldCB3L28gc29mdCByZXNldAorIElucHV0ICAgICAgICAgIDogcEhDQiAgLSAgICAgICBQb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUKKyBPdXRwdXQgICAgICAgICA6IE5vbmUuCisgUmV0dXJuICAgICAgICAgOiBwU1JCICAtICAgICAgIFBvaW50ZXIgdG8gU0NTSSByZXF1ZXN0IGJsb2NrLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG9yY19kZXZpY2VfcmVzZXQoT1JDX0hDUyAqIHBIQ0IsIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCB1bnNpZ25lZCBpbnQgdGFyZ2V0KQorewkJCQkvKiBJIG5lZWQgSG9zdCBDb250cm9sIEJsb2NrIEluZm9ybWF0aW9uICovCisJT1JDX1NDQiAqcFNjYjsKKwlFU0NCICpwVmlyRXNjYjsKKwlPUkNfU0NCICpwVmlyU2NiOworCVVDSEFSIGk7CisJVUxPTkcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHBIQ0ItPkJpdEFsbG9jRmxhZ0xvY2spLCBmbGFncyk7CisJcFNjYiA9IChPUkNfU0NCICopIE5VTEw7CisJcFZpckVzY2IgPSAoRVNDQiAqKSBOVUxMOworCisJLyogc2V0dXAgc2NhdHRlciBsaXN0IGFkZHJlc3Mgd2l0aCBvbmUgYnVmZmVyICovCisJcFZpclNjYiA9IHBIQ0ItPkhDU192aXJTY2JBcnJheTsKKworCWluaXRBRmxhZyhwSENCKTsKKwkvKiBkZXZpY2UgcmVzZXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgT1JDX01BWFFVRVVFOyBpKyspIHsKKwkJcFZpckVzY2IgPSBwVmlyU2NiLT5TQ0JfRVNjYjsKKwkJaWYgKChwVmlyU2NiLT5TQ0JfU3RhdHVzKSAmJiAocFZpckVzY2ItPlNDQl9TcmIgPT0gU0NwbnQpKQorCQkJYnJlYWs7CisJCXBWaXJTY2IrKzsKKwl9CisKKwlpZiAoaSA9PSBPUkNfTUFYUVVFVUUpIHsKKwkJcHJpbnRrKCJVbmFibGUgdG8gUmVzZXQgLSBObyBTQ0IgRm91bmRcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEhDQi0+Qml0QWxsb2NGbGFnTG9jayksIGZsYWdzKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisJaWYgKChwU2NiID0gb3JjX2FsbG9jX3NjYihwSENCKSkgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEhDQi0+Qml0QWxsb2NGbGFnTG9jayksIGZsYWdzKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisJcFNjYi0+U0NCX09wY29kZSA9IE9SQ19CVVNERVZSU1Q7CisJcFNjYi0+U0NCX1RhcmdldCA9IHRhcmdldDsKKwlwU2NiLT5TQ0JfSGFTdGF0ID0gMDsKKwlwU2NiLT5TQ0JfVGFTdGF0ID0gMDsKKwlwU2NiLT5TQ0JfU3RhdHVzID0gMHgwOworCXBTY2ItPlNDQl9MaW5rID0gMHhGRjsKKwlwU2NiLT5TQ0JfUmVzZXJ2ZWQwID0gMDsKKwlwU2NiLT5TQ0JfUmVzZXJ2ZWQxID0gMDsKKwlwU2NiLT5TQ0JfWGZlckxlbiA9IDA7CisJcFNjYi0+U0NCX1NHTGVuID0gMDsKKworCXBWaXJFc2NiLT5TQ0JfU3JiID0gTlVMTDsKKwlwVmlyRXNjYi0+U0NCX1NyYiA9IFNDcG50OworCW9yY19leGVjX3NjYihwSENCLCBwU2NiKTsJLyogU3RhcnQgZXhlY3V0ZSBTQ0IgICAgICAgICAgICAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihwSENCLT5CaXRBbGxvY0ZsYWdMb2NrKSwgZmxhZ3MpOworCXJldHVybiBTVUNDRVNTOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgT1JDX1NDQiAqX19vcmNfYWxsb2Nfc2NiKE9SQ19IQ1MgKiBoY3NwKQoreworCU9SQ19TQ0IgKnBUbXBTY2I7CisJVUNIQVIgQ2g7CisJVUxPTkcgaWR4OworCVVDSEFSIGluZGV4OworCVVDSEFSIGk7CisKKwlDaCA9IGhjc3AtPkhDU19JbmRleDsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IDMyOyBpbmRleCsrKSB7CisJCQlpZiAoKGhjc3AtPkJpdEFsbG9jRmxhZ1tDaF1baV0gPj4gaW5kZXgpICYgMHgwMSkgeworCQkJCWhjc3AtPkJpdEFsbG9jRmxhZ1tDaF1baV0gJj0gfigxIDw8IGluZGV4KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZHggPSBpbmRleCArIDMyICogaTsKKwkJcFRtcFNjYiA9IChPUkNfU0NCICopICgoVUxPTkcpIGhjc3AtPkhDU192aXJTY2JBcnJheSArIChpZHggKiBzaXplb2YoT1JDX1NDQikpKTsKKwkJcmV0dXJuIChwVG1wU2NiKTsKKwl9CisJcmV0dXJuIChOVUxMKTsKK30KKworc3RhdGljIE9SQ19TQ0IgKm9yY19hbGxvY19zY2IoT1JDX0hDUyAqIGhjc3ApCit7CisJT1JDX1NDQiAqcFRtcFNjYjsKKwlVTE9ORyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCYoaGNzcC0+Qml0QWxsb2NGbGFnTG9jayksIGZsYWdzKTsKKwlwVG1wU2NiID0gX19vcmNfYWxsb2Nfc2NiKGhjc3ApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihoY3NwLT5CaXRBbGxvY0ZsYWdMb2NrKSwgZmxhZ3MpOworCXJldHVybiAocFRtcFNjYik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG9yY19yZWxlYXNlX3NjYihPUkNfSENTICogaGNzcCwgT1JDX1NDQiAqIHNjYnApCit7CisJVUxPTkcgZmxhZ3M7CisJVUNIQVIgSW5kZXg7CisJVUNIQVIgaTsKKwlVQ0hBUiBDaDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCYoaGNzcC0+Qml0QWxsb2NGbGFnTG9jayksIGZsYWdzKTsKKwlDaCA9IGhjc3AtPkhDU19JbmRleDsKKwlJbmRleCA9IHNjYnAtPlNDQl9TY2JJZHg7CisJaSA9IEluZGV4IC8gMzI7CisJSW5kZXggJT0gMzI7CisJaGNzcC0+Qml0QWxsb2NGbGFnW0NoXVtpXSB8PSAoMSA8PCBJbmRleCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGhjc3AtPkJpdEFsbG9jRmxhZ0xvY2spLCBmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9uIG5hbWUgIDogYWJvcnRfU0NCCisgRGVzY3JpcHRpb24gICAgOiBBYm9ydCBhIHF1ZXVlZCBjb21tYW5kLgorCSAgICAgICAgICAgICAgICAgKGNvbW1hbmRzIHRoYXQgYXJlIG9uIHRoZSBidXMgY2FuJ3QgYmUgYWJvcnRlZCBlYXNpbHkpCisgSW5wdXQgICAgICAgICAgOiBwSENCICAtICAgICAgIFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZQorIE91dHB1dCAgICAgICAgIDogTm9uZS4KKyBSZXR1cm4gICAgICAgICA6IHBTUkIgIC0gICAgICAgUG9pbnRlciB0byBTQ1NJIHJlcXVlc3QgYmxvY2suCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgYWJvcnRfU0NCKE9SQ19IQ1MgKiBoY3NwLCBPUkNfU0NCICogcFNjYikKK3sKKwl1bnNpZ25lZCBjaGFyIGJEYXRhLCBiU3RhdHVzOworCisJT1JDX1dSKGhjc3AtPkhDU19CYXNlICsgT1JDX0hEQVRBLCBPUkNfQ01EX0FCT1JUX1NDQik7CS8qIFdyaXRlIGNvbW1hbmQgKi8KKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfSENUUkwsIEhETyk7CisJaWYgKHdhaXRIRE9vZmYoaGNzcCkgPT0gMCkJLyogV2FpdCBIRE8gb2ZmICAgKi8KKwkJcmV0dXJuIDA7CisKKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfSERBVEEsIHBTY2ItPlNDQl9TY2JJZHgpOwkvKiBXcml0ZSBhZGRyZXNzICovCisJT1JDX1dSKGhjc3AtPkhDU19CYXNlICsgT1JDX0hDVFJMLCBIRE8pOworCWlmICh3YWl0SERPb2ZmKGhjc3ApID09IDApCS8qIFdhaXQgSERPIG9mZiAgICovCisJCXJldHVybiAwOworCisJaWYgKHdhaXRIRElzZXQoaGNzcCwgJmJEYXRhKSA9PSAwKQkvKiBXYWl0IEhESSBzZXQgICAqLworCQlyZXR1cm4gMDsKKwliU3RhdHVzID0gT1JDX1JEKGhjc3AtPkhDU19CYXNlLCBPUkNfSERBVEEpOworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19IU1RVUywgYkRhdGEpOwkvKiBDbGVhciBIREkgICAgKi8KKworCWlmIChiU3RhdHVzID09IDEpCS8qIDAgLSBTdWNjZXNzZnVsbHkgICAgICAgICAgICAgICAqLworCQlyZXR1cm4gMDsJLyogMSAtIEZhaWwgICAgICAgICAgICAgICAgICAgICAqLworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbiBuYW1lICA6IGluaWExMDBfYWJvcnQKKyBEZXNjcmlwdGlvbiAgICA6IEFib3J0IGEgcXVldWVkIGNvbW1hbmQuCisJICAgICAgICAgICAgICAgICAoY29tbWFuZHMgdGhhdCBhcmUgb24gdGhlIGJ1cyBjYW4ndCBiZSBhYm9ydGVkIGVhc2lseSkKKyBJbnB1dCAgICAgICAgICA6IHBIQ0IgIC0gICAgICAgUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlCisgT3V0cHV0ICAgICAgICAgOiBOb25lLgorIFJldHVybiAgICAgICAgIDogcFNSQiAgLSAgICAgICBQb2ludGVyIHRvIFNDU0kgcmVxdWVzdCBibG9jay4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBvcmNfYWJvcnRfc3JiKE9SQ19IQ1MgKiBoY3NwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKwlFU0NCICpwVmlyRXNjYjsKKwlPUkNfU0NCICpwVmlyU2NiOworCVVDSEFSIGk7CisJVUxPTkcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKGhjc3AtPkJpdEFsbG9jRmxhZ0xvY2spLCBmbGFncyk7CisKKwlwVmlyU2NiID0gaGNzcC0+SENTX3ZpclNjYkFycmF5OworCisJZm9yIChpID0gMDsgaSA8IE9SQ19NQVhRVUVVRTsgaSsrLCBwVmlyU2NiKyspIHsKKwkJcFZpckVzY2IgPSBwVmlyU2NiLT5TQ0JfRVNjYjsKKwkJaWYgKChwVmlyU2NiLT5TQ0JfU3RhdHVzKSAmJiAocFZpckVzY2ItPlNDQl9TcmIgPT0gU0NwbnQpKSB7CisJCQlpZiAocFZpclNjYi0+U0NCX1RhZ01zZyA9PSAwKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGhjc3AtPkJpdEFsbG9jRmxhZ0xvY2spLCBmbGFncyk7CisJCQkJcmV0dXJuIEZBSUxFRDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGFib3J0X1NDQihoY3NwLCBwVmlyU2NiKSkgeworCQkJCQlwVmlyRXNjYi0+U0NCX1NyYiA9IE5VTEw7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihoY3NwLT5CaXRBbGxvY0ZsYWdMb2NrKSwgZmxhZ3MpOworCQkJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJCQl9IGVsc2UgeworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaGNzcC0+Qml0QWxsb2NGbGFnTG9jayksIGZsYWdzKTsKKwkJCQkJcmV0dXJuIEZBSUxFRDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGhjc3AtPkJpdEFsbG9jRmxhZ0xvY2spLCBmbGFncyk7CisJcmV0dXJuIEZBSUxFRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgUm91dGluZSBEZXNjcmlwdGlvbjoKKwkgIFRoaXMgaXMgdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIHRoZSBPcmNoaWQgU0NTSSBhZGFwdGVyLgorCSAgSXQgcmVhZHMgdGhlIGludGVycnVwdCByZWdpc3RlciB0byBkZXRlcm1pbmUgaWYgdGhlIGFkYXB0ZXIgaXMgaW5kZWVkCisJICB0aGUgc291cmNlIG9mIHRoZSBpbnRlcnJ1cHQgYW5kIGNsZWFycyB0aGUgaW50ZXJydXB0IGF0IHRoZSBkZXZpY2UuCisgQXJndW1lbnRzOgorCSAgSHdEZXZpY2VFeHRlbnNpb24gLSBIQkEgbWluaXBvcnQgZHJpdmVyJ3MgYWRhcHRlciBkYXRhIHN0b3JhZ2UKKyBSZXR1cm4gVmFsdWU6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG9yY19pbnRlcnJ1cHQoCisJCQkgIE9SQ19IQ1MgKiBoY3NwCispCit7CisJQllURSBiU2NiSWR4OworCU9SQ19TQ0IgKnBTY2I7CisKKwlpZiAoT1JDX1JEKGhjc3AtPkhDU19CYXNlLCBPUkNfUlFVRVVFQ05UKSA9PSAwKSB7CisJCXJldHVybjsJCS8vIDA7CisKKwl9CisJZG8geworCQliU2NiSWR4ID0gT1JDX1JEKGhjc3AtPkhDU19CYXNlLCBPUkNfUlFVRVVFKTsKKworCQlwU2NiID0gKE9SQ19TQ0IgKikgKChVTE9ORykgaGNzcC0+SENTX3ZpclNjYkFycmF5ICsgKFVMT05HKSAoc2l6ZW9mKE9SQ19TQ0IpICogYlNjYklkeCkpOworCQlwU2NiLT5TQ0JfU3RhdHVzID0gMHgwOworCisJCWluaWExMDBTQ0JQb3N0KChCWVRFICopIGhjc3AsIChCWVRFICopIHBTY2IpOworCX0gd2hpbGUgKE9SQ19SRChoY3NwLT5IQ1NfQmFzZSwgT1JDX1JRVUVVRUNOVCkpOworCXJldHVybjsJCQkvLzE7CisKK30JCQkJLyogRW5kIG9mIEkxMDYwSW50ZXJydXB0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb24gbmFtZSAgOiBpbmlhMTAwQnVpbGRTQ0IKKyBEZXNjcmlwdGlvbiAgICA6IAorIElucHV0ICAgICAgICAgIDogcEhDQiAgLSAgICAgICBQb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUKKyBPdXRwdXQgICAgICAgICA6IE5vbmUuCisgUmV0dXJuICAgICAgICAgOiBwU1JCICAtICAgICAgIFBvaW50ZXIgdG8gU0NTSSByZXF1ZXN0IGJsb2NrLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBpbmlhMTAwQnVpbGRTQ0IoT1JDX0hDUyAqIHBIQ0IsIE9SQ19TQ0IgKiBwU0NCLCBzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpCit7CQkJCS8qIENyZWF0ZSBjb3JyZXNwb25kaW5nIFNDQiAgICAgKi8KKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnBTcmJTRzsKKwlPUkNfU0cgKnBTRzsJCS8qIFBvaW50ZXIgdG8gU0cgbGlzdCAgICAgICAgICAgKi8KKwlpbnQgaSwgY291bnRfc2c7CisJRVNDQiAqcEVTY2I7CisKKwlwRVNjYiA9IHBTQ0ItPlNDQl9FU2NiOworCXBFU2NiLT5TQ0JfU3JiID0gU0NwbnQ7CisJcFNHID0gTlVMTDsKKworCXBTQ0ItPlNDQl9PcGNvZGUgPSBPUkNfRVhFQ1NDU0k7CisJcFNDQi0+U0NCX0ZsYWdzID0gU0NGX05PX0RDSEs7CS8qIENsZWFyIGRvbmUgYml0ICAgICAgICAgICAgICAgKi8KKwlwU0NCLT5TQ0JfVGFyZ2V0ID0gU0NwbnQtPmRldmljZS0+aWQ7CisJcFNDQi0+U0NCX0x1biA9IFNDcG50LT5kZXZpY2UtPmx1bjsKKwlwU0NCLT5TQ0JfUmVzZXJ2ZWQwID0gMDsKKwlwU0NCLT5TQ0JfUmVzZXJ2ZWQxID0gMDsKKwlwU0NCLT5TQ0JfU0dMZW4gPSAwOworCisJaWYgKChwU0NCLT5TQ0JfWGZlckxlbiA9IChVMzIpIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4pKSB7CisJCXBTRyA9IChPUkNfU0cgKikgJiBwRVNjYi0+RVNDQl9TR0xpc3RbMF07CisJCWlmIChTQ3BudC0+dXNlX3NnKSB7CisJCQlwU3JiU0cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwkJCWNvdW50X3NnID0gcGNpX21hcF9zZyhwSENCLT5wZGV2LCBwU3JiU0csIFNDcG50LT51c2Vfc2csCisJCQkJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbik7CisJCQlwU0NCLT5TQ0JfU0dMZW4gPSAoVTMyKSAoY291bnRfc2cgKiA4KTsKKwkJCWZvciAoaSA9IDA7IGkgPCBjb3VudF9zZzsgaSsrLCBwU0crKywgcFNyYlNHKyspIHsKKwkJCQlwU0ctPlNHX1B0ciA9IChVMzIpIHNnX2RtYV9hZGRyZXNzKHBTcmJTRyk7CisJCQkJcFNHLT5TR19MZW4gPSAoVTMyKSBzZ19kbWFfbGVuKHBTcmJTRyk7CisJCQl9CisJCX0gZWxzZSBpZiAoU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiAhPSAwKSB7LyogTm9uIFNHICovCisJCQlwU0NCLT5TQ0JfU0dMZW4gPSAweDg7CisJCQlTQ3BudC0+U0NwLmRtYV9oYW5kbGUgPSBwY2lfbWFwX3NpbmdsZShwSENCLT5wZGV2LAorCQkJCQlTQ3BudC0+cmVxdWVzdF9idWZmZXIsCisJCQkJCVNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbik7CisJCQlwU0ctPlNHX1B0ciA9IChVMzIpIFNDcG50LT5TQ3AuZG1hX2hhbmRsZTsKKwkJCXBTRy0+U0dfTGVuID0gKFUzMikgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJfSBlbHNlIHsKKwkJCXBTQ0ItPlNDQl9TR0xlbiA9IDA7CisJCQlwU0ctPlNHX1B0ciA9IDA7CisJCQlwU0ctPlNHX0xlbiA9IDA7CisJCX0KKwl9CisJcFNDQi0+U0NCX1NHUEFkZHIgPSAoVTMyKSBwU0NCLT5TQ0JfU2Vuc2VQQWRkcjsKKwlwU0NCLT5TQ0JfSGFTdGF0ID0gMDsKKwlwU0NCLT5TQ0JfVGFTdGF0ID0gMDsKKwlwU0NCLT5TQ0JfTGluayA9IDB4RkY7CisJcFNDQi0+U0NCX1NlbnNlTGVuID0gU0VOU0VfU0laRTsKKwlwU0NCLT5TQ0JfQ0RCTGVuID0gU0NwbnQtPmNtZF9sZW47CisJaWYgKHBTQ0ItPlNDQl9DREJMZW4gPj0gSU1BWF9DREIpIHsKKwkJcHJpbnRrKCJtYXggY2RiIGxlbmd0aD0gJXhcYiIsIFNDcG50LT5jbWRfbGVuKTsKKwkJcFNDQi0+U0NCX0NEQkxlbiA9IElNQVhfQ0RCOworCX0KKwlwU0NCLT5TQ0JfSWRlbnQgPSBTQ3BudC0+ZGV2aWNlLT5sdW4gfCBESVNDX0FMTE9XOworCWlmIChTQ3BudC0+ZGV2aWNlLT50YWdnZWRfc3VwcG9ydGVkKSB7CS8qIFRhZyBTdXBwb3J0ICAgICAgICAgICAgICAgICAgKi8KKwkJcFNDQi0+U0NCX1RhZ01zZyA9IFNJTVBMRV9RVUVVRV9UQUc7CS8qIERvIHNpbXBsZSB0YWcgb25seSAgICovCisJfSBlbHNlIHsKKwkJcFNDQi0+U0NCX1RhZ01zZyA9IDA7CS8qIE5vIHRhZyBzdXBwb3J0ICAgICAgICAgICAgICAgKi8KKwl9CisJbWVtY3B5KCZwU0NCLT5TQ0JfQ0RCWzBdLCAmU0NwbnQtPmNtbmQsIHBTQ0ItPlNDQl9DREJMZW4pOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb24gbmFtZSAgOiBpbmlhMTAwX3F1ZXVlCisgRGVzY3JpcHRpb24gICAgOiBRdWV1ZSBhIGNvbW1hbmQgYW5kIHNldHVwIGludGVycnVwdHMgZm9yIGEgZnJlZSBidXMuCisgSW5wdXQgICAgICAgICAgOiBwSENCICAtICAgICAgIFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZQorIE91dHB1dCAgICAgICAgIDogTm9uZS4KKyBSZXR1cm4gICAgICAgICA6IHBTUkIgIC0gICAgICAgUG9pbnRlciB0byBTQ1NJIHJlcXVlc3QgYmxvY2suCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgaW5pYTEwMF9xdWV1ZShzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQsIHZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlyZWdpc3RlciBPUkNfU0NCICpwU0NCOworCU9SQ19IQ1MgKnBIQ0I7CQkvKiBQb2ludCB0byBIb3N0IGFkYXB0ZXIgY29udHJvbCBibG9jayAqLworCisJcEhDQiA9IChPUkNfSENTICopIFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCVNDcG50LT5zY3NpX2RvbmUgPSBkb25lOworCS8qIEdldCBmcmVlIFNDU0kgY29udHJvbCBibG9jayAgKi8KKwlpZiAoKHBTQ0IgPSBvcmNfYWxsb2Nfc2NiKHBIQ0IpKSA9PSBOVUxMKQorCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKworCWluaWExMDBCdWlsZFNDQihwSENCLCBwU0NCLCBTQ3BudCk7CisJb3JjX2V4ZWNfc2NiKHBIQ0IsIHBTQ0IpOwkvKiBTdGFydCBleGVjdXRlIFNDQiAgICAgICAgICAgICovCisKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbiBuYW1lICA6IGluaWExMDBfYWJvcnQKKyBEZXNjcmlwdGlvbiAgICA6IEFib3J0IGEgcXVldWVkIGNvbW1hbmQuCisJICAgICAgICAgICAgICAgICAoY29tbWFuZHMgdGhhdCBhcmUgb24gdGhlIGJ1cyBjYW4ndCBiZSBhYm9ydGVkIGVhc2lseSkKKyBJbnB1dCAgICAgICAgICA6IHBIQ0IgIC0gICAgICAgUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlCisgT3V0cHV0ICAgICAgICAgOiBOb25lLgorIFJldHVybiAgICAgICAgIDogcFNSQiAgLSAgICAgICBQb2ludGVyIHRvIFNDU0kgcmVxdWVzdCBibG9jay4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBpbmlhMTAwX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCkKK3sKKwlPUkNfSENTICpoY3NwOworCisJaGNzcCA9IChPUkNfSENTICopIFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXJldHVybiBvcmNfYWJvcnRfc3JiKGhjc3AsIFNDcG50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb24gbmFtZSAgOiBpbmlhMTAwX3Jlc2V0CisgRGVzY3JpcHRpb24gICAgOiBSZXNldCByZWdpc3RlcnMsIHJlc2V0IGEgaGFuZ2luZyBidXMgYW5kCisgICAgICAgICAgICAgICAgICBraWxsIGFjdGl2ZSBhbmQgZGlzY29ubmVjdGVkIGNvbW1hbmRzIGZvciB0YXJnZXQgdy9vIHNvZnQgcmVzZXQKKyBJbnB1dCAgICAgICAgICA6IHBIQ0IgIC0gICAgICAgUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlCisgT3V0cHV0ICAgICAgICAgOiBOb25lLgorIFJldHVybiAgICAgICAgIDogcFNSQiAgLSAgICAgICBQb2ludGVyIHRvIFNDU0kgcmVxdWVzdCBibG9jay4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBpbmlhMTAwX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpCit7CQkJCS8qIEkgbmVlZCBIb3N0IENvbnRyb2wgQmxvY2sgSW5mb3JtYXRpb24gKi8KKwlPUkNfSENTICpwSENCOworCXBIQ0IgPSAoT1JDX0hDUyAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlyZXR1cm4gb3JjX3Jlc2V0X3Njc2lfYnVzKHBIQ0IpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbiBuYW1lICA6IGluaWExMDBfZGV2aWNlX3Jlc2V0CisgRGVzY3JpcHRpb24gICAgOiBSZXNldCB0aGUgZGV2aWNlCisgSW5wdXQgICAgICAgICAgOiBwSENCICAtICAgICAgIFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZQorIE91dHB1dCAgICAgICAgIDogTm9uZS4KKyBSZXR1cm4gICAgICAgICA6IHBTUkIgIC0gICAgICAgUG9pbnRlciB0byBTQ1NJIHJlcXVlc3QgYmxvY2suCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgaW5pYTEwMF9kZXZpY2VfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KQorewkJCQkvKiBJIG5lZWQgSG9zdCBDb250cm9sIEJsb2NrIEluZm9ybWF0aW9uICovCisJT1JDX0hDUyAqcEhDQjsKKwlwSENCID0gKE9SQ19IQ1MgKikgU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJcmV0dXJuIG9yY19kZXZpY2VfcmVzZXQocEhDQiwgU0NwbnQsIFNDcG50LT5kZXZpY2UtPmlkKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbiBuYW1lICA6IGluaWExMDBTQ0JQb3N0CisgRGVzY3JpcHRpb24gICAgOiBUaGlzIGlzIGNhbGxiYWNrIHJvdXRpbmUgYmUgY2FsbGVkIHdoZW4gb3JjIGZpbmlzaCBvbmUKKwkJCVNDU0kgY29tbWFuZC4KKyBJbnB1dCAgICAgICAgICA6IHBIQ0IgIC0gICAgICAgUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgY29udHJvbCBibG9jay4KKwkJICBwU0NCICAtICAgICAgIFBvaW50ZXIgdG8gU0NTSSBjb250cm9sIGJsb2NrLgorIE91dHB1dCAgICAgICAgIDogTm9uZS4KKyBSZXR1cm4gICAgICAgICA6IE5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGluaWExMDBTQ0JQb3N0KEJZVEUgKiBwSGNiLCBCWVRFICogcFNjYikKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpwU1JCOwkvKiBQb2ludGVyIHRvIFNDU0kgcmVxdWVzdCBibG9jayAqLworCU9SQ19IQ1MgKnBIQ0I7CisJT1JDX1NDQiAqcFNDQjsKKwlFU0NCICpwRVNjYjsKKworCXBIQ0IgPSAoT1JDX0hDUyAqKSBwSGNiOworCXBTQ0IgPSAoT1JDX1NDQiAqKSBwU2NiOworCXBFU2NiID0gcFNDQi0+U0NCX0VTY2I7CisJaWYgKChwU1JCID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgcEVTY2ItPlNDQl9TcmIpID09IDApIHsKKwkJcHJpbnRrKCJpbmlhMTAwU0NCUG9zdDogU1JCIHBvaW50ZXIgaXMgZW1wdHlcbiIpOworCQlvcmNfcmVsZWFzZV9zY2IocEhDQiwgcFNDQik7CS8qIFJlbGVhc2UgU0NCIGZvciBjdXJyZW50IGNoYW5uZWwgKi8KKwkJcmV0dXJuOworCX0KKwlwRVNjYi0+U0NCX1NyYiA9IE5VTEw7CisKKwlzd2l0Y2ggKHBTQ0ItPlNDQl9IYVN0YXQpIHsKKwljYXNlIDB4MDoKKwljYXNlIDB4YToJCS8qIExpbmtlZCBjb21tYW5kIGNvbXBsZXRlIHdpdGhvdXQgZXJyb3IgYW5kIGxpbmtlZCBub3JtYWxseSAqLworCWNhc2UgMHhiOgkJLyogTGlua2VkIGNvbW1hbmQgY29tcGxldGUgd2l0aG91dCBlcnJvciBpbnRlcnJ1cHQgZ2VuZXJhdGVkICovCisJCXBTQ0ItPlNDQl9IYVN0YXQgPSAwOworCQlicmVhazsKKworCWNhc2UgMHgxMToJCS8qIFNlbGVjdGlvbiB0aW1lIG91dC1UaGUgaW5pdGlhdG9yIHNlbGVjdGlvbiBvciB0YXJnZXQKKwkJCQkgICByZXNlbGVjdGlvbiB3YXMgbm90IGNvbXBsZXRlIHdpdGhpbiB0aGUgU0NTSSBUaW1lIG91dCBwZXJpb2QgKi8KKwkJcFNDQi0+U0NCX0hhU3RhdCA9IERJRF9USU1FX09VVDsKKwkJYnJlYWs7CisKKwljYXNlIDB4MTQ6CQkvKiBUYXJnZXQgYnVzIHBoYXNlIHNlcXVlbmNlIGZhaWx1cmUtQW4gaW52YWxpZCBidXMgcGhhc2Ugb3IgYnVzCisJCQkJICAgcGhhc2Ugc2VxdWVuY2Ugd2FzIHJlcXVlc3RlZCBieSB0aGUgdGFyZ2V0LiBUaGUgaG9zdCBhZGFwdGVyCisJCQkJICAgd2lsbCBnZW5lcmF0ZSBhIFNDU0kgUmVzZXQgQ29uZGl0aW9uLCBub3RpZnlpbmcgdGhlIGhvc3Qgd2l0aAorCQkJCSAgIGEgU0NSRCBpbnRlcnJ1cHQgKi8KKwkJcFNDQi0+U0NCX0hhU3RhdCA9IERJRF9SRVNFVDsKKwkJYnJlYWs7CisKKwljYXNlIDB4MWE6CQkvKiBTQ0IgQWJvcnRlZC4gMDcvMjEvOTggKi8KKwkJcFNDQi0+U0NCX0hhU3RhdCA9IERJRF9BQk9SVDsKKwkJYnJlYWs7CisKKwljYXNlIDB4MTI6CQkvKiBEYXRhIG92ZXJydW4vdW5kZXJydW4tVGhlIHRhcmdldCBhdHRlbXB0ZWQgdG8gdHJhbnNmZXIgbW9yZSBkYXRhCisJCQkJICAgdGhhbiB3YXMgYWxsb2NhdGVkIGJ5IHRoZSBEYXRhIExlbmd0aCBmaWVsZCBvciB0aGUgc3VtIG9mIHRoZQorCQkJCSAgIFNjYXR0ZXIgLyBHYXRoZXIgRGF0YSBMZW5ndGggZmllbGRzLiAqLworCWNhc2UgMHgxMzoJCS8qIFVuZXhwZWN0ZWQgYnVzIGZyZWUtVGhlIHRhcmdldCBkcm9wcGVkIHRoZSBTQ1NJIEJTWSBhdCBhbiB1bmV4cGVjdGVkIHRpbWUuICovCisJY2FzZSAweDE2OgkJLyogSW52YWxpZCBDQ0IgT3BlcmF0aW9uIENvZGUtVGhlIGZpcnN0IGJ5dGUgb2YgdGhlIENDQiB3YXMgaW52YWxpZC4gKi8KKworCWRlZmF1bHQ6CisJCXByaW50aygiaW5pYTEwMDogJXggJXhcbiIsIHBTQ0ItPlNDQl9IYVN0YXQsIHBTQ0ItPlNDQl9UYVN0YXQpOworCQlwU0NCLT5TQ0JfSGFTdGF0ID0gRElEX0VSUk9SOwkvKiBDb3VsZG4ndCBmaW5kIGFueSBiZXR0ZXIgKi8KKwkJYnJlYWs7CisJfQorCisJaWYgKHBTQ0ItPlNDQl9UYVN0YXQgPT0gMikgewkvKiBDaGVjayBjb25kaXRpb24gICAgICAgICAgICAgICovCisJCW1lbWNweSgodW5zaWduZWQgY2hhciAqKSAmcFNSQi0+c2Vuc2VfYnVmZmVyWzBdLAorCQkgICAodW5zaWduZWQgY2hhciAqKSAmcEVTY2ItPkVTQ0JfU0dMaXN0WzBdLCBTRU5TRV9TSVpFKTsKKwl9CisJcFNSQi0+cmVzdWx0ID0gcFNDQi0+U0NCX1RhU3RhdCB8IChwU0NCLT5TQ0JfSGFTdGF0IDw8IDE2KTsKKworCWlmIChwU1JCLT51c2Vfc2cpIHsKKwkJcGNpX3VubWFwX3NnKHBIQ0ItPnBkZXYsCisJCQkgICAgIChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilwU1JCLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCSAgICAgcFNSQi0+dXNlX3NnLCBwU1JCLT5zY19kYXRhX2RpcmVjdGlvbik7CisJfSBlbHNlIGlmIChwU1JCLT5yZXF1ZXN0X2J1ZmZsZW4gIT0gMCkgeworCQlwY2lfdW5tYXBfc2luZ2xlKHBIQ0ItPnBkZXYsIHBTUkItPlNDcC5kbWFfaGFuZGxlLAorCQkJCSBwU1JCLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJIHBTUkItPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwl9CisKKwlwU1JCLT5zY3NpX2RvbmUocFNSQik7CS8qIE5vdGlmeSBzeXN0ZW0gRE9ORSAgICAgICAgICAgKi8KKworCW9yY19yZWxlYXNlX3NjYihwSENCLCBwU0NCKTsJLyogUmVsZWFzZSBTQ0IgZm9yIGN1cnJlbnQgY2hhbm5lbCAqLworfQorCisvKgorICogSW50ZXJydXB0IGhhbmRsZXIgKG1haW4gcm91dGluZSBvZiB0aGUgZHJpdmVyKQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaW5pYTEwMF9pbnRyKGludCBpcnFubywgdm9pZCAqZGV2aWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSAoc3RydWN0IFNjc2lfSG9zdCAqKWRldmlkOworCU9SQ19IQ1MgKnBIY2IgPSAoT1JDX0hDUyAqKWhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlvcmNfaW50ZXJydXB0KHBIY2IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGluaWExMDBfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQkJPSAiaW5pYTEwMCIsCisJLm5hbWUJCQk9IGluaWExMDBfUkVWSUQsCisJLnF1ZXVlY29tbWFuZAkJPSBpbmlhMTAwX3F1ZXVlLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gaW5pYTEwMF9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBpbmlhMTAwX2J1c19yZXNldCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBpbmlhMTAwX2RldmljZV9yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IDEsCisJLnRoaXNfaWQJCT0gMSwKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4gCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgaW5pYTEwMF9wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlPUkNfSENTICpwSENCOworCXVuc2lnbmVkIGxvbmcgcG9ydCwgYmlvczsKKwlpbnQgZXJyb3IgPSAtRU5PREVWOworCXUzMiBzejsKKwl1bnNpZ25lZCBsb25nIGRCaW9zQWRyOworCWNoYXIgKnBiQmlvc0FkcjsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJZ290byBvdXQ7CisJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMTCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIHNldCAzMmJpdCBETUEgIgorCQkJCSAgICAib24gaW5pYTEwMCBhZGFwdGVyLCBpZ25vcmluZy5cbiIpOworCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCXBvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwb3J0LCAyNTYsICJpbmlhMTAwIikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaW5pYTEwMDogaW8gcG9ydCAweCVseCwgaXMgYnVzeS5cbiIsIHBvcnQpOworCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKKwl9CisKKwkvKiA8MDI+IHJlYWQgZnJvbSBiYXNlIGFkZHJlc3MgKyAweDUwIG9mZnNldCB0byBnZXQgdGhlIGJpb3MgYmFsdWUuICovCisJYmlvcyA9IE9SQ19SRFdPUkQocG9ydCwgMHg1MCk7CisKKworCXNob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZpbmlhMTAwX3RlbXBsYXRlLCBzaXplb2YoT1JDX0hDUykpOworCWlmICghc2hvc3QpCisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOworCisJcEhDQiA9IChPUkNfSENTICopc2hvc3QtPmhvc3RkYXRhOworCXBIQ0ItPnBkZXYgPSBwZGV2OworCXBIQ0ItPkhDU19CYXNlID0gcG9ydDsKKwlwSENCLT5IQ1NfQklPUyA9IGJpb3M7CisJc3Bpbl9sb2NrX2luaXQoJnBIQ0ItPkJpdEFsbG9jRmxhZ0xvY2spOworCisJLyogR2V0IHRvdGFsIG1lbW9yeSBuZWVkZWQgZm9yIFNDQiAqLworCXN6ID0gT1JDX01BWFFVRVVFICogc2l6ZW9mKE9SQ19TQ0IpOworCXBIQ0ItPkhDU192aXJTY2JBcnJheSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHN6LAorCQkJJnBIQ0ItPkhDU19waHlzU2NiQXJyYXkpOworCWlmICghcEhDQi0+SENTX3ZpclNjYkFycmF5KSB7CisJCXByaW50aygiaW5pYTEwMDogU0NCIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkJZ290byBvdXRfaG9zdF9wdXQ7CisJfQorCW1lbXNldChwSENCLT5IQ1NfdmlyU2NiQXJyYXksIDAsIHN6KTsKKworCS8qIEdldCB0b3RhbCBtZW1vcnkgbmVlZGVkIGZvciBFU0NCICovCisJc3ogPSBPUkNfTUFYUVVFVUUgKiBzaXplb2YoRVNDQik7CisJcEhDQi0+SENTX3ZpckVzY2JBcnJheSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHN6LAorCQkJJnBIQ0ItPkhDU19waHlzRXNjYkFycmF5KTsKKwlpZiAoIXBIQ0ItPkhDU192aXJFc2NiQXJyYXkpIHsKKwkJcHJpbnRrKCJpbmlhMTAwOiBFU0NCIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkJZ290byBvdXRfZnJlZV9zY2JfYXJyYXk7CisJfQorCW1lbXNldChwSENCLT5IQ1NfdmlyRXNjYkFycmF5LCAwLCBzeik7CisKKwlkQmlvc0FkciA9IHBIQ0ItPkhDU19CSU9TOworCWRCaW9zQWRyID0gKGRCaW9zQWRyIDw8IDQpOworCXBiQmlvc0FkciA9IHBoeXNfdG9fdmlydChkQmlvc0Fkcik7CisJaWYgKGluaXRfb3JjaGlkKHBIQ0IpKSB7CS8qIEluaXRpYWxpemUgb3JjaGlkIGNoaXAgKi8KKwkJcHJpbnRrKCJpbmlhMTAwOiBpbml0aWFsIG9yY2hpZCBmYWlsISFcbiIpOworCQlnb3RvIG91dF9mcmVlX2VzY2JfYXJyYXk7CisJfQorCisJc2hvc3QtPmlvX3BvcnQgPSBwSENCLT5IQ1NfQmFzZTsKKwlzaG9zdC0+bl9pb19wb3J0ID0gMHhmZjsKKwlzaG9zdC0+Y2FuX3F1ZXVlID0gT1JDX01BWFFVRVVFOworCXNob3N0LT51bmlxdWVfaWQgPSBzaG9zdC0+aW9fcG9ydDsKKwlzaG9zdC0+bWF4X2lkID0gcEhDQi0+SENTX01heFRhcjsKKwlzaG9zdC0+bWF4X2x1biA9IDE2OworCXNob3N0LT5pcnEgPSBwSENCLT5IQ1NfSW50ciA9IHBkZXYtPmlycTsKKwlzaG9zdC0+dGhpc19pZCA9IHBIQ0ItPkhDU19TQ1NJX0lEOwkvKiBBc3NpZ24gSENTIGluZGV4ICovCisJc2hvc3QtPnNnX3RhYmxlc2l6ZSA9IFRPVEFMX1NHX0VOVFJZOworCisJLyogSW5pdGlhbCBvcmMgY2hpcCAgICAgICAgICAgKi8KKwllcnJvciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgaW5pYTEwMF9pbnRyLCBTQV9TSElSUSwKKwkJCSJpbmlhMTAwIiwgc2hvc3QpOworCWlmIChlcnJvciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaW5pYTEwMDogdW5hYmxlIHRvIGdldCBpcnEgJWRcbiIsCisJCQkJcGRldi0+aXJxKTsKKwkJZ290byBvdXRfZnJlZV9lc2NiX2FycmF5OworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBzaG9zdCk7CisKKwllcnJvciA9IHNjc2lfYWRkX2hvc3Qoc2hvc3QsICZwZGV2LT5kZXYpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfZnJlZV9pcnE7CisKKwlzY3NpX3NjYW5faG9zdChzaG9zdCk7CisJcmV0dXJuIDA7CisKKyBvdXRfZnJlZV9pcnE6CisgICAgICAgIGZyZWVfaXJxKHNob3N0LT5pcnEsIHNob3N0KTsKKyBvdXRfZnJlZV9lc2NiX2FycmF5OgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgT1JDX01BWFFVRVVFICogc2l6ZW9mKEVTQ0IpLAorCQkJcEhDQi0+SENTX3ZpckVzY2JBcnJheSwgcEhDQi0+SENTX3BoeXNFc2NiQXJyYXkpOworIG91dF9mcmVlX3NjYl9hcnJheToKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIE9SQ19NQVhRVUVVRSAqIHNpemVvZihPUkNfU0NCKSwKKwkJCXBIQ0ItPkhDU192aXJTY2JBcnJheSwgcEhDQi0+SENTX3BoeXNTY2JBcnJheSk7Cisgb3V0X2hvc3RfcHV0OgorCXNjc2lfaG9zdF9wdXQoc2hvc3QpOworIG91dF9yZWxlYXNlX3JlZ2lvbjoKKyAgICAgICAgcmVsZWFzZV9yZWdpb24ocG9ydCwgMjU2KTsKKyBvdXRfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworIG91dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpbmlhMTAwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJT1JDX0hDUyAqcEhDQiA9IChPUkNfSENTICopc2hvc3QtPmhvc3RkYXRhOworCisJc2NzaV9yZW1vdmVfaG9zdChzaG9zdCk7CisKKyAgICAgICAgZnJlZV9pcnEoc2hvc3QtPmlycSwgc2hvc3QpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgT1JDX01BWFFVRVVFICogc2l6ZW9mKEVTQ0IpLAorCQkJcEhDQi0+SENTX3ZpckVzY2JBcnJheSwgcEhDQi0+SENTX3BoeXNFc2NiQXJyYXkpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgT1JDX01BWFFVRVVFICogc2l6ZW9mKE9SQ19TQ0IpLAorCQkJcEhDQi0+SENTX3ZpclNjYkFycmF5LCBwSENCLT5IQ1NfcGh5c1NjYkFycmF5KTsKKyAgICAgICAgcmVsZWFzZV9yZWdpb24oc2hvc3QtPmlvX3BvcnQsIDI1Nik7CisKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKK30gCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpbmlhMTAwX3BjaV90YmxbXSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9JTklULCAweDEwNjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXswLH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaW5pYTEwMF9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGluaWExMDBfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiaW5pYTEwMCIsCisJLmlkX3RhYmxlCT0gaW5pYTEwMF9wY2lfdGJsLAorCS5wcm9iZQkJPSBpbmlhMTAwX3Byb2JlX29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGluaWExMDBfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbmlhMTAwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZpbmlhMTAwX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaW5pYTEwMF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpbmlhMTAwX3BjaV9kcml2ZXIpOworfQorCitNT0RVTEVfREVTQ1JJUFRJT04oIkluaXRpbyBBMTAwVTJXIFNDU0kgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJJbml0aW8gQ29ycG9yYXRpb24iKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKKworbW9kdWxlX2luaXQoaW5pYTEwMF9pbml0KTsKK21vZHVsZV9leGl0KGluaWExMDBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYTEwMHUydy5oIGIvZHJpdmVycy9zY3NpL2ExMDB1MncuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjU0MmQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2ExMDB1MncuaApAQCAtMCwwICsxLDQxNiBAQAorLyoKKyAqIEluaXRpbyBBMTAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NC0xOTk4IEluaXRpbyBDb3Jwb3JhdGlvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBpbW1lZGlhdGVseSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFdoZXJlIHRoaXMgU29mdHdhcmUgaXMgY29tYmluZWQgd2l0aCBzb2Z0d2FyZSByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhbmQgdGhlIHRlcm1zIG9mIHRoZSBHUEwgd291bGQgcmVxdWlyZSB0aGUgCisgKiBjb21iaW5lZCB3b3JrIHRvIGFsc28gYmUgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwsIHRoZSB0ZXJtcworICogYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlIHdpbGwgYXBwbHkgaW4gYWRkaXRpb24gdG8gdGhvc2Ugb2YgdGhlCisgKiBHUEwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFueSB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSB0aGF0CisgKiBjb25mbGljdCB3aXRoLCBvciBhcmUgZXhwcmVzc2x5IHByb2hpYml0ZWQgYnksIHRoZSBHUEwuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogUmV2aXNpb24gSGlzdG9yeToKKyAqIDA2LzE4Lzk4IEhMLCBJbml0aWFsIHByb2R1Y3Rpb24gVmVyc2lvbiAxLjAyCisgKiAxMi8xOS85OCBidiwgVXNlIHNwaW5sb2NrcyBmb3IgMi4xLjk1IGFuZCB1cAorICogMDYvMjUvMDIgRG91ZyBMZWRmb3JkIDxkbGVkZm9yZEByZWRoYXQuY29tPgorICoJIC0gVGhpcyBhbmQgdGhlIGk2MHVzY3NpLmggZmlsZSBhcmUgYWxtb3N0IGlkZW50aWNhbCwKKyAqCSAgIG1lcmdlZCB0aGVtIGludG8gYSBzaW5nbGUgaGVhZGVyIHVzZWQgYnkgYm90aCAuYyBmaWxlcy4KKyAqLworCisjZGVmaW5lIGluaWExMDBfUkVWSUQgIkluaXRpbyBJTkktQTEwMFUyVyBTQ1NJIGRldmljZSBkcml2ZXI7IFJldmlzaW9uOiAxLjAyZCIKKworI2RlZmluZSBVTE9ORyAgIHVuc2lnbmVkIGxvbmcKKyNkZWZpbmUgVVNIT1JUICB1bnNpZ25lZCBzaG9ydAorI2RlZmluZSBVQ0hBUiAgIHVuc2lnbmVkIGNoYXIKKyNkZWZpbmUgQllURSAgICB1bnNpZ25lZCBjaGFyCisjZGVmaW5lIFdPUkQgICAgdW5zaWduZWQgc2hvcnQKKyNkZWZpbmUgRFdPUkQgICB1bnNpZ25lZCBsb25nCisjZGVmaW5lIFVCWVRFICAgdW5zaWduZWQgY2hhcgorI2RlZmluZSBVV09SRCAgIHVuc2lnbmVkIHNob3J0CisjZGVmaW5lIFVEV09SRCAgdW5zaWduZWQgbG9uZworI2RlZmluZSBVMzIgICAgIHUzMgorCisjaWYgMQorI2RlZmluZSBPUkNfTUFYUVVFVUUJCTI0NQorI2RlZmluZSBPUkNfTUFYVEFHUwkJNjQKKyNlbHNlCisjZGVmaW5lIE9SQ19NQVhRVUVVRQkJMjUKKyNkZWZpbmUgT1JDX01BWFRBR1MJCTgKKyNlbmRpZgorCisjZGVmaW5lIFRPVEFMX1NHX0VOVFJZCQkzMgorI2RlZmluZSBNQVhfVEFSR0VUUwkJMTYKKyNkZWZpbmUgSU1BWF9DREIJCQkxNQorI2RlZmluZSBTRU5TRV9TSVpFCQkxNAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgIFNjYXR0ZXItR2F0aGVyIEVsZW1lbnQgU3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCBPUkNfU0dfU3RydWMgeworCVUzMiBTR19QdHI7CQkvKiBEYXRhIFBvaW50ZXIgKi8KKwlVMzIgU0dfTGVuOwkJLyogRGF0YSBMZW5ndGggKi8KK30gT1JDX1NHOworCisvKiBTQ1NJIHJlbGF0ZWQgZGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBESVNDX05PVF9BTExPVyAgICAgICAgICAweDgwCS8qIERpc2Nvbm5lY3QgaXMgbm90IGFsbG93ZWQgICAgKi8KKyNkZWZpbmUgRElTQ19BTExPVyAgICAgICAgICAgICAgMHhDMAkvKiBEaXNjb25uZWN0IGlzIGFsbG93ZWQgICAgICAgICovCisKKworI2RlZmluZSBPUkNfT0ZGU0VUX1NDQgkJCTE2CisjZGVmaW5lIE9SQ19NQVhfU0NCUwkJICAgIDI1MAorI2RlZmluZSBNQVhfQ0hBTk5FTFMgICAgICAgMgorI2RlZmluZSBNQVhfRVNDQl9FTEUJCQkJNjQKKyNkZWZpbmUgVENGX0RSVl8yNTVfNjMgICAgIDB4MDQwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgIE9yY2hpZCBIb3N0IENvbW1hbmQgU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE9SQ19DTURfTk9QCQkweDAwCS8qIEhvc3QgY29tbWFuZCAtIE5PUCAgICAgICAgICAgICAqLworI2RlZmluZSBPUkNfQ01EX1ZFUlNJT04JCTB4MDEJLyogSG9zdCBjb21tYW5kIC0gR2V0IEYvVyB2ZXJzaW9uICovCisjZGVmaW5lIE9SQ19DTURfRUNITwkJMHgwMgkvKiBIb3N0IGNvbW1hbmQgLSBFQ0hPICAgICAgICAgICAgKi8KKyNkZWZpbmUgT1JDX0NNRF9TRVRfTlZNCQkweDAzCS8qIEhvc3QgY29tbWFuZCAtIFNldCBOVlJBTSAgICAgICAqLworI2RlZmluZSBPUkNfQ01EX0dFVF9OVk0JCTB4MDQJLyogSG9zdCBjb21tYW5kIC0gR2V0IE5WUkFNICAgICAgICovCisjZGVmaW5lIE9SQ19DTURfR0VUX0JVU19TVEFUVVMJMHgwNQkvKiBIb3N0IGNvbW1hbmQgLSBHZXQgU0NTSSBidXMgc3RhdHVzICovCisjZGVmaW5lIE9SQ19DTURfQUJPUlRfU0NCCTB4MDYJLyogSG9zdCBjb21tYW5kIC0gQWJvcnQgU0NCICAgICAgICovCisjZGVmaW5lIE9SQ19DTURfSVNTVUVfU0NCCTB4MDcJLyogSG9zdCBjb21tYW5kIC0gSXNzdWUgU0NCICAgICAgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICBPcmNoaWQgUmVnaXN0ZXIgU2V0ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgT1JDX0dJTlRTCTB4QTAJLyogR2xvYmFsIEludGVycnVwdCBTdGF0dXMgICAgICAgICovCisjZGVmaW5lIFFJTlQJCTB4MDQJLyogUmVwbHkgUXVldWUgSW50ZXJydXB0ICAqLworI2RlZmluZSBPUkNfR0lNU0sJMHhBMQkvKiBHbG9iYWwgSW50ZXJydXB0IE1BU0sgICovCisjZGVmaW5lIE1RSU5UCQkweDA0CS8qIE1hc2sgUmVwbHkgUXVldWUgSW50ZXJydXB0ICAgICAqLworI2RlZmluZQlPUkNfR0NGRwkweEEyCS8qIEdsb2JhbCBDb25maWd1cmUgICAgICAgICAgICAgICAqLworI2RlZmluZSBFRVBSRwkJMHgwMQkvKiBFbmFibGUgRUVQUk9NIHByb2dyYW1taW5nICovCisjZGVmaW5lCU9SQ19HU1RBVAkweEEzCS8qIEdsb2JhbCBzdGF0dXMgICAgICAgICAgKi8KKyNkZWZpbmUgV0lERUJVUwkJMHgxMAkvKiBXaWRlIFNDU0kgRGV2aWNlcyBjb25uZWN0ZWQgICAgKi8KKyNkZWZpbmUgT1JDX0hEQVRBCTB4QTQJLyogSG9zdCBEYXRhICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9SQ19IQ1RSTAkweEE1CS8qIEhvc3QgQ29udHJvbCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTQ1NJUlNUCQkweDgwCS8qIFNDU0kgYnVzIHJlc2V0ICAgICAgICAgKi8KKyNkZWZpbmUgSERPCQkJMHg0MAkvKiBIb3N0IGRhdGEgb3V0ICAgICAgICAgICovCisjZGVmaW5lIEhPU1RTVE9QCQkweDAyCS8qIEhvc3Qgc3RvcCBSSVNDIGVuZ2luZSAgKi8KKyNkZWZpbmUgREVWUlNUCQkweDAxCS8qIERldmljZSByZXNldCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPUkNfSFNUVVMJMHhBNgkvKiBIb3N0IFN0YXR1cyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSERJCQkJMHgwMgkvKiBIb3N0IGRhdGEgaW4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUlJFQURZCQkweDAxCS8qIFJJU0MgZW5naW5lIGlzIHJlYWR5IHRvIHJlY2VpdmUgKi8KKyNkZWZpbmUJT1JDX05WUkFNCTB4QTcJLyogTnZyYW0gcG9ydCBhZGRyZXNzICAgICAgICAgICAgICovCisjZGVmaW5lIFNFMkNTCQkweDAwOAorI2RlZmluZSBTRTJDTEsJCTB4MDA0CisjZGVmaW5lIFNFMkRPCQkweDAwMgorI2RlZmluZSBTRTJESQkJMHgwMDEKKyNkZWZpbmUgT1JDX1BRVUVVRQkweEE4CS8qIFBvc3RpbmcgcXVldWUgRklGTyAgICAgICAgICAgICAqLworI2RlZmluZSBPUkNfUFFDTlQJMHhBOQkvKiBQb3N0aW5nIHF1ZXVlIEZJRk8gQ250ICovCisjZGVmaW5lIE9SQ19SUVVFVUUJMHhBQQkvKiBSZXBseSBxdWV1ZSBGSUZPICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT1JDX1JRVUVVRUNOVAkweEFCCS8qIFJlcGx5IHF1ZXVlIEZJRk8gQ250ICAgICAgICAgICAqLworI2RlZmluZQlPUkNfRldCQVNFQURSCTB4QUMJLyogRmlybXdhcmUgYmFzZSBhZGRyZXNzICAqLworCisjZGVmaW5lCU9SQ19FQklPU0FEUjAgMHhCMAkvKiBFeHRlcm5hbCBCaW9zIGFkZHJlc3MgKi8KKyNkZWZpbmUJT1JDX0VCSU9TQURSMSAweEIxCS8qIEV4dGVybmFsIEJpb3MgYWRkcmVzcyAqLworI2RlZmluZQlPUkNfRUJJT1NBRFIyIDB4QjIJLyogRXh0ZXJuYWwgQmlvcyBhZGRyZXNzICovCisjZGVmaW5lCU9SQ19FQklPU0RBVEEgMHhCMwkvKiBFeHRlcm5hbCBCaW9zIGFkZHJlc3MgKi8KKworI2RlZmluZQlPUkNfU0NCU0laRQkweEI3CS8qIFNDQiBzaXplIHJlZ2lzdGVyICAgICAgICAgICAgICAqLworI2RlZmluZQlPUkNfU0NCQkFTRTAJMHhCOAkvKiBTQ0IgYmFzZSBhZGRyZXNzIDAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJT1JDX1NDQkJBU0UxCTB4QkMJLyogU0NCIGJhc2UgYWRkcmVzcyAxICAgICAgICAgICAgICovCisKKyNkZWZpbmUJT1JDX1JJU0NDVEwJMHhFMAkvKiBSSVNDIENvbnRyb2wgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUFJHTVJTVAkJMHgwMDIKKyNkZWZpbmUgRE9XTkxPQUQJCTB4MDAxCisjZGVmaW5lCU9SQ19QUkdNQ1RSMAkweEUyCS8qIFJJU0MgcHJvZ3JhbSBjb3VudGVyICAgICAgICAgICAqLworI2RlZmluZQlPUkNfUFJHTUNUUjEJMHhFMwkvKiBSSVNDIHByb2dyYW0gY291bnRlciAgICAgICAgICAgKi8KKyNkZWZpbmUJT1JDX1JJU0NSQU0JMHhFQwkvKiBSSVNDIFJBTSBkYXRhIHBvcnQgNCBieXRlcyAgICAgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgb3JjX2V4dGVuZGVkX3NjYiB7CS8qIEV4dGVuZGVkIFNDQiAgICAgICAgICAgICAgICAgKi8KKwlPUkNfU0cgRVNDQl9TR0xpc3RbVE9UQUxfU0dfRU5UUlldOwkvKjAgU3RhcnQgb2YgU0cgbGlzdCAgICAgICAgICAgICAgKi8KKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ0JfU3JiOwkvKjUwIFNSQiBQb2ludGVyICovCit9IEVTQ0I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQlTQ1NJIENvbnRyb2wgQmxvY2sKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IG9yY19zY2IgewkvKiBTY3NpX0N0cmxfQmxrICAgICAgICAgICAgICAgICovCisJVUJZVEUgU0NCX09wY29kZTsJLyowMCBTQ0IgY29tbWFuZCBjb2RlJnJlc2lkdWFsICAqLworCVVCWVRFIFNDQl9GbGFnczsJLyowMSBTQ0IgRmxhZ3MgICAgICAgICAgICAgICAgICAqLworCVVCWVRFIFNDQl9UYXJnZXQ7CS8qMDIgVGFyZ2V0IElkICAgICAgICAgICAgICAgICAgKi8KKwlVQllURSBTQ0JfTHVuOwkJLyowMyBMdW4gICAgICAgICAgICAgICAgICAgICAgICAqLworCVUzMiBTQ0JfUmVzZXJ2ZWQwOwkvKjA0IFJlc2VydmVkIGZvciBPUkNISUQgbXVzdCAwICovCisJVTMyIFNDQl9YZmVyTGVuOwkvKjA4IERhdGEgVHJhbnNmZXIgTGVuZ3RoICAgICAgICovCisJVTMyIFNDQl9SZXNlcnZlZDE7CS8qMEMgUmVzZXJ2ZWQgZm9yIE9SQ0hJRCBtdXN0IDAgKi8KKwlVMzIgU0NCX1NHTGVuOwkJLyoxMCBTRyBsaXN0ICMgKiA4ICAgICAgICAgICAgICAqLworCVUzMiBTQ0JfU0dQQWRkcjsJLyoxNCBTRyBMaXN0IEJ1ZiBwaHlzaWNhbCBBZGRyICAqLworCVUzMiBTQ0JfU0dQQWRkckhpZ2g7CS8qMTggU0cgQnVmZmVyIGhpZ2ggcGh5c2ljYWwgQWRkciAqLworCVVCWVRFIFNDQl9IYVN0YXQ7CS8qMUMgSG9zdCBTdGF0dXMgICAgICAgICAgICAgICAgKi8KKwlVQllURSBTQ0JfVGFTdGF0OwkvKjFEIFRhcmdldCBTdGF0dXMgICAgICAgICAgICAgICovCisJVUJZVEUgU0NCX1N0YXR1czsJLyoxRSBTQ0Igc3RhdHVzICAgICAgICAgICAgICAgICAqLworCVVCWVRFIFNDQl9MaW5rOwkJLyoxRiBMaW5rIHBvaW50ZXIsIGRlZmF1bHQgMHhGRiAqLworCVVCWVRFIFNDQl9TZW5zZUxlbjsJLyoyMCBTZW5zZSBBbGxvY2F0aW9uIExlbmd0aCAgICAqLworCVVCWVRFIFNDQl9DREJMZW47CS8qMjEgQ0RCIExlbmd0aCAgICAgICAgICAgICAgICAgKi8KKwlVQllURSBTQ0JfSWRlbnQ7CS8qMjIgSWRlbnRpZnkgICAgICAgICAgICAgICAgICAgKi8KKwlVQllURSBTQ0JfVGFnTXNnOwkvKjIzIFRhZyBNZXNzYWdlICAgICAgICAgICAgICAgICovCisJVUJZVEUgU0NCX0NEQltJTUFYX0NEQl07CS8qMjQgU0NTSSBDREJzICAgICAgICAgICAgICAgICAgKi8KKwlVQllURSBTQ0JfU2NiSWR4OwkvKjNDIEluZGV4IGZvciB0aGlzIE9SQ1NDQiAgICAgICovCisJVTMyIFNDQl9TZW5zZVBBZGRyOwkvKjM0IFNlbnNlIEJ1ZmZlciBwaHlzaWNhbCBBZGRyICovCisKKwlFU0NCICpTQ0JfRVNjYjsJCS8qMzggRXh0ZW5kZWQgU0NCIFBvaW50ZXIgICAgICAgKi8KKyNpZm5kZWYgQUxQSEEKKwlVQllURSBTQ0JfUmVzZXJ2ZWQyWzRdOwkvKjNFIFJlc2VydmVkIGZvciBEcml2ZXIgdXNlICAgICovCisjZW5kaWYKK30gT1JDX1NDQjsKKworLyogT3Bjb2RlcyBvZiBPUkNTQ0JfT3Bjb2RlICovCisjZGVmaW5lIE9SQ19FWEVDU0NTSQkweDAwCS8qIFNDU0kgaW5pdGlhdG9yIGNvbW1hbmQgd2l0aCByZXNpZHVhbCAqLworI2RlZmluZSBPUkNfQlVTREVWUlNUCTB4MDEJLyogU0NTSSBCdXMgRGV2aWNlIFJlc2V0ICAqLworCisvKiBTdGF0dXMgb2YgT1JDU0NCX1N0YXR1cyAqLworI2RlZmluZSBPUkNTQ0JfQ09NUExFVEUJMHgwMAkvKiBTQ0IgcmVxdWVzdCBjb21wbGV0ZWQgICovCisjZGVmaW5lIE9SQ1NDQl9QT1NUCTB4MDEJLyogU0NCIGlzIHBvc3RlZCBieSB0aGUgSE9TVCAgICAgICovCisKKy8qIEJpdCBEZWZpbml0aW9uIGZvciBPUkNTQ0JfRmxhZ3MgKi8KKyNkZWZpbmUgU0NGX0RJU0lOVAkweDAxCS8qIERpc2FibGUgSE9TVCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0NGX0RJUgkJMHgxOAkvKiBEaXJlY3Rpb24gYml0cyAgICAgICAgICovCisjZGVmaW5lIFNDRl9OT19EQ0hLCTB4MDAJLyogRGlyZWN0aW9uIGRldGVybWluZWQgYnkgU0NTSSAgICovCisjZGVmaW5lIFNDRl9ESU4JCTB4MDgJLyogRnJvbSBUYXJnZXQgdG8gSW5pdGlhdG9yICAgICAgICovCisjZGVmaW5lIFNDRl9ET1VUCTB4MTAJLyogRnJvbSBJbml0aWF0b3IgdG8gVGFyZ2V0ICAgICAgICovCisjZGVmaW5lIFNDRl9OT19YRgkweDE4CS8qIE5vIGRhdGEgdHJhbnNmZXIgICAgICAgICAgICAgICAqLworI2RlZmluZSBTQ0ZfUE9MTCAgIDB4NDAKKworLyogRXJyb3IgQ29kZXMgZm9yIE9SQ1NDQl9IYVN0YXQgKi8KKyNkZWZpbmUgSE9TVF9TRUxfVE9VVAkweDExCisjZGVmaW5lIEhPU1RfRE9fRFUJMHgxMgorI2RlZmluZSBIT1NUX0JVU19GUkVFCTB4MTMKKyNkZWZpbmUgSE9TVF9CQURfUEhBUwkweDE0CisjZGVmaW5lIEhPU1RfSU5WX0NNRAkweDE2CisjZGVmaW5lIEhPU1RfU0NTSV9SU1QJMHgxQgorI2RlZmluZSBIT1NUX0RFVl9SU1QJMHgxQworCisKKy8qIEVycm9yIENvZGVzIGZvciBPUkNTQ0JfVGFTdGF0ICovCisjZGVmaW5lIFRBUkdFVF9DSEtfQ09ORAkweDAyCisjZGVmaW5lIFRBUkdFVF9CVVNZCTB4MDgKKyNkZWZpbmUgVEFSR0VUX1RBR19GVUxMCTB4MjgKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJVGFyZ2V0IERldmljZSBDb250cm9sIFN0cnVjdHVyZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgT1JDX1Rhcl9DdHJsX1N0cnVjIHsKKwlVQllURSBUQ1NfRHJ2REFTRDsJLyogNiAqLworCVVCWVRFIFRDU19EcnZTQ1NJOwkvKiA3ICovCisJVUJZVEUgVENTX0RydkhlYWQ7CS8qIDggKi8KKwlVV09SRCBUQ1NfRHJ2RmxhZ3M7CS8qIDQgKi8KKwlVQllURSBUQ1NfRHJ2U2VjdG9yOwkvKiA3ICovCit9IE9SQ19UQ1M7CisKKy8qIEJpdCBEZWZpbml0aW9uIGZvciBUQ0ZfRHJ2RmxhZ3MgKi8KKyNkZWZpbmUJVENTX0RGX05PREFTRF9TVVBUCTB4MjAJLyogU3VwcHJlc3MgT1MvMiBEQVNEIE1nciBzdXBwb3J0ICovCisjZGVmaW5lCVRDU19ERl9OT1NDU0lfU1VQVAkweDQwCS8qIFN1cHByZXNzIE9TLzIgU0NTSSBNZ3Igc3VwcG9ydCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICBIb3N0IEFkYXB0ZXIgQ29udHJvbCBTdHJ1Y3R1cmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IE9SQ19IYV9DdHJsX1N0cnVjIHsKKwlVU0hPUlQgSENTX0Jhc2U7CS8qIDAwICovCisJVUJZVEUgSENTX0luZGV4OwkvKiAwMiAqLworCVVCWVRFIEhDU19JbnRyOwkJLyogMDQgKi8KKwlVQllURSBIQ1NfU0NTSV9JRDsJLyogMDYgICAgSC9BIFNDU0kgSUQgKi8KKwlVQllURSBIQ1NfQklPUzsJCS8qIDA3ICAgIEJJT1MgY29uZmlndXJhdGlvbiAqLworCisJVUJZVEUgSENTX0ZsYWdzOwkvKiAwQiAqLworCVVCWVRFIEhDU19IQUNvbmZpZzE7CS8qIDFCICAgIFNDU0kwTUFYVGFncyAqLworCVVCWVRFIEhDU19NYXhUYXI7CS8qIDFCICAgIFNDU0kwTUFYVGFncyAqLworCisJVVNIT1JUIEhDU19Vbml0czsJLyogTnVtYmVyIG9mIHVuaXRzIHRoaXMgYWRhcHRlciAgKi8KKwlVU0hPUlQgSENTX0FGbGFnczsJLyogQWRhcHRlciBpbmZvLiBkZWZpbmVkIGZsYWdzICAgKi8KKwlVTE9ORyBIQ1NfVGltZW91dDsJLyogQWRhcHRlciB0aW1lb3V0IHZhbHVlICAgKi8KKwlPUkNfU0NCICpIQ1NfdmlyU2NiQXJyYXk7CS8qIDI4IFZpcnR1YWwgUG9pbnRlciB0byBTQ0IgYXJyYXkgKi8KKwlkbWFfYWRkcl90IEhDU19waHlzU2NiQXJyYXk7CS8qIFNjYiBQaHlzaWNhbCBhZGRyZXNzICovCisJRVNDQiAqSENTX3ZpckVzY2JBcnJheTsJLyogVmlydHVhbCBwb2ludGVyIHRvIEVTQ0IgU2NhdHRlciBsaXN0ICovCisJZG1hX2FkZHJfdCBIQ1NfcGh5c0VzY2JBcnJheTsJLyogc2NhdHRlciBsaXN0IFBoeXNpY2FsIGFkZHJlc3MgKi8KKwlVQllURSBUYXJnZXRGbGFnWzE2XTsJLyogMzAgIHRhcmdldCBjb25maWd1cmF0aW9uLCBUQ0ZfRU5fVEFHICovCisJVUJZVEUgTWF4aW11bVRhZ3NbMTZdOwkvKiA0MCAgT1JDX01BWF9TQ0JTICovCisJVUJZVEUgQWN0aXZlVGFnc1sxNl1bMTZdOwkvKiA1MCAqLworCU9SQ19UQ1MgSENTX1Rjc1sxNl07CS8qIDI4ICovCisJVTMyIEJpdEFsbG9jRmxhZ1tNQVhfQ0hBTk5FTFNdWzhdOwkvKiBNYXggU1RCIGlzIDI1NiwgU28gMjU2LzMyICovCisJc3BpbmxvY2tfdCBCaXRBbGxvY0ZsYWdMb2NrOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworfSBPUkNfSENTOworCisvKiBCaXQgRGVmaW5pdGlvbiBmb3IgSENTX0ZsYWdzICovCisKKyNkZWZpbmUgSENGX1NDU0lfUkVTRVQJMHgwMQkvKiBTQ1NJIEJVUyBSRVNFVCAgICAgICAgICovCisjZGVmaW5lIEhDRl9QQVJJVFkgICAgCTB4MDIJLyogcGFyaXR5IGNhcmQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhDRl9MVkRTICAgICAJMHgxMAkvKiBwYXJpdHkgY2FyZCAgICAgICAgICAgICAgICAgICAgKi8KKworLyogQml0IERlZmluaXRpb24gZm9yIFRhcmdldEZsYWcgKi8KKworI2RlZmluZSBUQ0ZfRU5fMjU1CSAgICAweDA4CisjZGVmaW5lIFRDRl9FTl9UQUcJICAgIDB4MTAKKyNkZWZpbmUgVENGX0JVU1kJICAgICAgMHgyMAorI2RlZmluZSBUQ0ZfRElTQ09OTkVDVAkweDQwCisjZGVmaW5lIFRDRl9TUElOX1VQCSAgMHg4MAorCisvKiBCaXQgRGVmaW5pdGlvbiBmb3IgSENTX0FGbGFncyAqLworI2RlZmluZQlIQ1NfQUZfSUdOT1JFCQkweDAxCS8qIEFkYXB0ZXIgaWdub3JlICAgICAgICAgKi8KKyNkZWZpbmUJSENTX0FGX0RJU0FCTEVfUkVTRVQJMHgxMAkvKiBBZGFwdGVyIGRpc2FibGUgcmVzZXQgICovCisjZGVmaW5lCUhDU19BRl9ESVNBQkxFX0FEUFQJMHg4MAkvKiBBZGFwdGVyIGRpc2FibGUgICAgICAgICAgICAgICAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX05WUkFNIHsKKy8qLS0tLS0tLS0tLWhlYWRlciAtLS0tLS0tLS0tLS0tLS0qLworICAgICAgICBVQ0hBUiBTdWJWZW5kb3JJRDA7ICAgICAvKiAwMCAtIFN1YiBWZW5kb3IgSUQgICAgICAgICAgICovCisgICAgICAgIFVDSEFSIFN1YlZlbmRvcklEMTsgICAgIC8qIDAwIC0gU3ViIFZlbmRvciBJRCAgICAgICAgICAgKi8KKyAgICAgICAgVUNIQVIgU3ViU3lzSUQwOyAgICAgICAgLyogMDIgLSBTdWIgU3lzdGVtIElEICAgICAgICAgICAqLworICAgICAgICBVQ0hBUiBTdWJTeXNJRDE7ICAgICAgICAvKiAwMiAtIFN1YiBTeXN0ZW0gSUQgICAgICAgICAgICovCisgICAgICAgIFVDSEFSIFN1YkNsYXNzOyAgICAgICAgIC8qIDA0IC0gU3ViIENsYXNzICAgICAgICAgICAgICAgKi8KKyAgICAgICAgVUNIQVIgVmVuZG9ySUQwOyAgICAgICAgLyogMDUgLSBWZW5kb3IgSUQgICAgICAgICAgICAgICAqLworICAgICAgICBVQ0hBUiBWZW5kb3JJRDE7ICAgICAgICAvKiAwNSAtIFZlbmRvciBJRCAgICAgICAgICAgICAgICovCisgICAgICAgIFVDSEFSIERldmljZUlEMDsgICAgICAgIC8qIDA3IC0gRGV2aWNlIElEICAgICAgICAgICAgICAgKi8KKyAgICAgICAgVUNIQVIgRGV2aWNlSUQxOyAgICAgICAgLyogMDcgLSBEZXZpY2UgSUQgICAgICAgICAgICAgICAqLworICAgICAgICBVQ0hBUiBSZXNlcnZlZDBbMl07ICAgICAvKiAwOSAtIFJlc2VydmVkICAgICAgICAgICAgICAgICovCisgICAgICAgIFVDSEFSIFJldmlzaW9uOyAgICAgICAgIC8qIDBCIC0gUmV2aXNpb24gb2YgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgLyogLS0tLUhvc3QgQWRhcHRlciBTdHJ1Y3R1cmUgLS0tLSAqLworICAgICAgICBVQ0hBUiBOdW1PZkNoOyAgICAgICAgICAvKiAwQyAtIE51bWJlciBvZiBTQ1NJIGNoYW5uZWwgICovCisgICAgICAgIFVDSEFSIEJJT1NDb25maWcxOyAgICAgIC8qIDBEIC0gQklPUyBjb25maWd1cmF0aW9uIDEgICAgKi8KKyAgICAgICAgVUNIQVIgQklPU0NvbmZpZzI7ICAgICAgLyogMEUgLSBCSU9TIGJvb3QgY2hhbm5lbCZ0YXJnZXQgSUQgKi8KKyAgICAgICAgVUNIQVIgQklPU0NvbmZpZzM7ICAgICAgLyogMEYgLSBCSU9TIGNvbmZpZ3VyYXRpb24gMyAgICAqLworICAgICAgICAvKiAtLS0tU0NTSSBjaGFubmVsIFN0cnVjdHVyZSAtLS0tICovCisgICAgICAgIC8qIGZyb20gIkNUUkwtSSBTQ1NJIEhvc3QgQWRhcHRlciBTZXRVcCBtZW51ICIgICovCisgICAgICAgIFVDSEFSIFNDU0kwSWQ7ICAgICAgICAgIC8qIDEwIC0gQ2hhbm5lbCAwIFNDU0kgSUQgICAgICAgKi8KKyAgICAgICAgVUNIQVIgU0NTSTBDb25maWc7ICAgICAgLyogMTEgLSBDaGFubmVsIDAgU0NTSSBjb25maWd1cmF0aW9uICovCisgICAgICAgIFVDSEFSIFNDU0kwTWF4VGFnczsgICAgIC8qIDEyIC0gQ2hhbm5lbCAwIE1heGltdW0gdGFncyAgKi8KKyAgICAgICAgVUNIQVIgU0NTSTBSZXNldFRpbWU7ICAgLyogMTMgLSBDaGFubmVsIDAgUmVzZXQgcmVjb3ZlcmluZyB0aW1lICovCisgICAgICAgIFVDSEFSIFJlc2VydmVkZm9yQ2hhbm5lbDBbMl07ICAgLyogMTQgLSBSZXNlcnZlZCAgICAgICAgICAgICAgICAqLworCisgICAgICAgIC8qIC0tLS1TQ1NJIHRhcmdldCBTdHJ1Y3R1cmUgLS0tLSAgKi8KKyAgICAgICAgLyogZnJvbSAiQ1RSTC1JIFNDU0kgZGV2aWNlIFNldFVwIG1lbnUgIiAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIFVDSEFSIFRhcmdldDAwQ29uZmlnOyAgIC8qIDE2IC0gQ2hhbm5lbCAwIFRhcmdldCAwIGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQwMUNvbmZpZzsgICAvKiAxNyAtIENoYW5uZWwgMCBUYXJnZXQgMSBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MDJDb25maWc7ICAgLyogMTggLSBDaGFubmVsIDAgVGFyZ2V0IDIgY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDAzQ29uZmlnOyAgIC8qIDE5IC0gQ2hhbm5lbCAwIFRhcmdldCAzIGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQwNENvbmZpZzsgICAvKiAxQSAtIENoYW5uZWwgMCBUYXJnZXQgNCBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MDVDb25maWc7ICAgLyogMUIgLSBDaGFubmVsIDAgVGFyZ2V0IDUgY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDA2Q29uZmlnOyAgIC8qIDFDIC0gQ2hhbm5lbCAwIFRhcmdldCA2IGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQwN0NvbmZpZzsgICAvKiAxRCAtIENoYW5uZWwgMCBUYXJnZXQgNyBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MDhDb25maWc7ICAgLyogMUUgLSBDaGFubmVsIDAgVGFyZ2V0IDggY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDA5Q29uZmlnOyAgIC8qIDFGIC0gQ2hhbm5lbCAwIFRhcmdldCA5IGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQwQUNvbmZpZzsgICAvKiAyMCAtIENoYW5uZWwgMCBUYXJnZXQgQSBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MEJDb25maWc7ICAgLyogMjEgLSBDaGFubmVsIDAgVGFyZ2V0IEIgY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDBDQ29uZmlnOyAgIC8qIDIyIC0gQ2hhbm5lbCAwIFRhcmdldCBDIGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQwRENvbmZpZzsgICAvKiAyMyAtIENoYW5uZWwgMCBUYXJnZXQgRCBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MEVDb25maWc7ICAgLyogMjQgLSBDaGFubmVsIDAgVGFyZ2V0IEUgY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDBGQ29uZmlnOyAgIC8qIDI1IC0gQ2hhbm5lbCAwIFRhcmdldCBGIGNvbmZpZyAqLworCisgICAgICAgIFVDSEFSIFNDU0kxSWQ7ICAgICAgICAgIC8qIDI2IC0gQ2hhbm5lbCAxIFNDU0kgSUQgICAgICAgKi8KKyAgICAgICAgVUNIQVIgU0NTSTFDb25maWc7ICAgICAgLyogMjcgLSBDaGFubmVsIDEgU0NTSSBjb25maWd1cmF0aW9uICovCisgICAgICAgIFVDSEFSIFNDU0kxTWF4VGFnczsgICAgIC8qIDI4IC0gQ2hhbm5lbCAxIE1heGltdW0gdGFncyAgKi8KKyAgICAgICAgVUNIQVIgU0NTSTFSZXNldFRpbWU7ICAgLyogMjkgLSBDaGFubmVsIDEgUmVzZXQgcmVjb3ZlcmluZyB0aW1lICovCisgICAgICAgIFVDSEFSIFJlc2VydmVkZm9yQ2hhbm5lbDFbMl07ICAgLyogMkEgLSBSZXNlcnZlZCAgICAgICAgICAgICAgICAqLworCisgICAgICAgIC8qIC0tLS1TQ1NJIHRhcmdldCBTdHJ1Y3R1cmUgLS0tLSAgKi8KKyAgICAgICAgLyogZnJvbSAiQ1RSTC1JIFNDU0kgZGV2aWNlIFNldFVwIG1lbnUgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIFVDSEFSIFRhcmdldDEwQ29uZmlnOyAgIC8qIDJDIC0gQ2hhbm5lbCAxIFRhcmdldCAwIGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQxMUNvbmZpZzsgICAvKiAyRCAtIENoYW5uZWwgMSBUYXJnZXQgMSBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MTJDb25maWc7ICAgLyogMkUgLSBDaGFubmVsIDEgVGFyZ2V0IDIgY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDEzQ29uZmlnOyAgIC8qIDJGIC0gQ2hhbm5lbCAxIFRhcmdldCAzIGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQxNENvbmZpZzsgICAvKiAzMCAtIENoYW5uZWwgMSBUYXJnZXQgNCBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MTVDb25maWc7ICAgLyogMzEgLSBDaGFubmVsIDEgVGFyZ2V0IDUgY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDE2Q29uZmlnOyAgIC8qIDMyIC0gQ2hhbm5lbCAxIFRhcmdldCA2IGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQxN0NvbmZpZzsgICAvKiAzMyAtIENoYW5uZWwgMSBUYXJnZXQgNyBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MThDb25maWc7ICAgLyogMzQgLSBDaGFubmVsIDEgVGFyZ2V0IDggY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDE5Q29uZmlnOyAgIC8qIDM1IC0gQ2hhbm5lbCAxIFRhcmdldCA5IGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQxQUNvbmZpZzsgICAvKiAzNiAtIENoYW5uZWwgMSBUYXJnZXQgQSBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MUJDb25maWc7ICAgLyogMzcgLSBDaGFubmVsIDEgVGFyZ2V0IEIgY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDFDQ29uZmlnOyAgIC8qIDM4IC0gQ2hhbm5lbCAxIFRhcmdldCBDIGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQxRENvbmZpZzsgICAvKiAzOSAtIENoYW5uZWwgMSBUYXJnZXQgRCBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MUVDb25maWc7ICAgLyogM0EgLSBDaGFubmVsIDEgVGFyZ2V0IEUgY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDFGQ29uZmlnOyAgIC8qIDNCIC0gQ2hhbm5lbCAxIFRhcmdldCBGIGNvbmZpZyAqLworICAgICAgICBVQ0hBUiByZXNlcnZlZFszXTsgICAgICAvKiAzQyAtIFJlc2VydmVkICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0gQ2hlY2tTdW0gLS0tLS0tLS0tLSAgICAgICAqLworICAgICAgICBVQ0hBUiBDaGVja1N1bTsgICAgICAgICAvKiAzRiAtIENoZWNrc3VtIG9mIE5WUmFtICAgICAgICovCit9IE5WUkFNLCAqUE5WUkFNOworCisvKiBCaW9zIENvbmZpZ3VyYXRpb24gZm9yIG52cmFtLT5CSU9TQ29uZmlnMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOQkNfQklPU0VOQUJMRSAgMHgwMSAgICAvKiBCSU9TIGVuYWJsZSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTkJDX0NEUk9NICAgICAgIDB4MDIgICAgLyogU3VwcG9ydCBib290YWJsZSBDRFJPTSAqLworI2RlZmluZSBOQkNfUkVNT1ZBQkxFICAgMHgwNCAgICAvKiBTdXBwb3J0IHJlbW92YWJsZSBkcml2ZSAgICAgICAgKi8KKworLyogQmlvcyBDb25maWd1cmF0aW9uIGZvciBudnJhbS0+QklPU0NvbmZpZzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTkJCX1RBUkdFVF9NQVNLIDB4MEYgICAgLyogQm9vdCBTQ1NJIHRhcmdldCBJRCBudW1iZXIgICAgICovCisjZGVmaW5lIE5CQl9DSEFOTF9NQVNLICAweEYwICAgIC8qIEJvb3QgU0NTSSBjaGFubmVsIG51bWJlciAgICAgICAqLworCisvKiBCaXQgZGVmaW5pdGlvbiBmb3IgbnZyYW0tPlNDU0lDb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOQ0NfQlVTUkVTRVQgICAgMHgwMSAgICAvKiBSZXNldCBTQ1NJIGJ1cyBhdCBwb3dlciB1cCAgICAgKi8KKyNkZWZpbmUgTkNDX1BBUklUWUNISyAgIDB4MDIgICAgLyogU0NTSSBwYXJpdHkgZW5hYmxlICAgICAgICAgICAgICovCisjZGVmaW5lIE5DQ19MVkRTICAgICAgICAweDEwICAgIC8qIEVuYWJsZSBMVkRTICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOQ0NfQUNUVEVSTTEgICAgMHgyMCAgICAvKiBFbmFibGUgYWN0aXZlIHRlcm1pbmF0b3IgMSAgICAgKi8KKyNkZWZpbmUgTkNDX0FDVFRFUk0yICAgIDB4NDAgICAgLyogRW5hYmxlIGFjdGl2ZSB0ZXJtaW5hdG9yIDIgICAgICovCisjZGVmaW5lIE5DQ19BVVRPVEVSTSAgICAweDgwICAgIC8qIEVuYWJsZSBhdXRvIHRlcm1pbmF0aW9uICAgICAgICAqLworCisvKiBCaXQgZGVmaW5pdGlvbiBmb3IgbnZyYW0tPlRhcmdldHhDb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOVENfUEVSSU9EICAgICAgMHgwNyAgICAvKiBNYXhpbXVtIFN5bmMuIFNwZWVkICAgICAgICAgICAgKi8KKyNkZWZpbmUgTlRDXzFHSUdBICAgICAgIDB4MDggICAgLyogMjU1IGhlYWQgLyA2MyBzZWN0b3JzICg2NC8zMikgKi8KKyNkZWZpbmUgTlRDX05PX1NZTkMgICAgIDB4MTAgICAgLyogTk8gU1lOQy4gTkVHTyAgICAgICAgICAqLworI2RlZmluZSBOVENfTk9fV0lERVNZTkMgMHgyMCAgICAvKiBOTyBXSURFIFNZTkMuIE5FR08gICAgICAgICAgICAgKi8KKyNkZWZpbmUgTlRDX0RJU0NfRU5BQkxFIDB4NDAgICAgLyogRW5hYmxlIFNDU0kgZGlzY29ubmVjdCAqLworI2RlZmluZSBOVENfU1BJTlVQICAgICAgMHg4MCAgICAvKiBTdGFydCBkaXNrIGRyaXZlICAgICAgICAgICAgICAgKi8KKworLyogRGVmYXVsdCBOVlJhbSB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTkJDX0RFRkFVTFQgICAgIChOQkNfRU5BQkxFKQorI2RlZmluZSBOQ0NfREVGQVVMVCAgICAgKE5DQ19CVVNSRVNFVCB8IE5DQ19BVVRPVEVSTSB8IE5DQ19QQVJJVFlDSEspCisjZGVmaW5lIE5DQ19NQVhfVEFHUyAgICAweDIwICAgIC8qIE1heGltdW0gdGFncyBwZXIgdGFyZ2V0ICAgICAgICAqLworI2RlZmluZSBOQ0NfUkVTRVRfVElNRSAgMHgwQSAgICAvKiBTQ1NJIFJFU0VUIHJlY292ZXJpbmcgdGltZSAgICAgKi8KKyNkZWZpbmUgTlRDX0RFRkFVTFQgICAgIChOVENfMUdJR0EgfCBOVENfTk9fV0lERVNZTkMgfCBOVENfRElTQ19FTkFCTEUpCisKKyNkZWZpbmUgT1JDX1JEKHgseSkgICAgICAgICAgICAgKFVDSEFSKShpbmIoICAoaW50KSgoVUxPTkcpKChVTE9ORyl4KyhVQ0hBUil5KSkgKSkKKyNkZWZpbmUgT1JDX1JEV09SRCh4LHkpICAgICAgICAgKHNob3J0KShpbmwoKGludCkoKFVMT05HKSgoVUxPTkcpeCsoVUNIQVIpeSkpICkpCisjZGVmaW5lIE9SQ19SRExPTkcoeCx5KSAgICAgICAgIChsb25nKShpbmwoKGludCkoKFVMT05HKSgoVUxPTkcpeCsoVUNIQVIpeSkpICkpCisKKyNkZWZpbmUgT1JDX1dSKCAgICAgYWRyLGRhdGEpICAgb3V0YiggKFVDSEFSKShkYXRhKSwgKGludCkoYWRyKSkKKyNkZWZpbmUgT1JDX1dSU0hPUlQoYWRyLGRhdGEpICAgb3V0dyggKFVXT1JEKShkYXRhKSwgKGludCkoYWRyKSkKKyNkZWZpbmUgT1JDX1dSTE9ORyggYWRyLGRhdGEpICAgb3V0bCggKFVMT05HKShkYXRhKSwgKGludCkoYWRyKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hMjA5MS5jIGIvZHJpdmVycy9zY3NpL2EyMDkxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyOGEyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hMjA5MS5jCkBAIC0wLDAgKzEsMjYwIEBACisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KKyNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAid2QzM2M5My5oIgorI2luY2x1ZGUgImEyMDkxLmgiCisKKyNpbmNsdWRlPGxpbnV4L3N0YXQuaD4KKworI2RlZmluZSBETUEocHRyKSAoKGEyMDkxX3Njc2lyZWdzICopKChwdHIpLT5iYXNlKSkKKyNkZWZpbmUgSERBVEEocHRyKSAoKHN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhICopKChwdHIpLT5ob3N0ZGF0YSkpCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhMjA5MV9pbnRyIChpbnQgaXJxLCB2b2lkICpfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHVuc2lnbmVkIGludCBzdGF0dXM7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UgPSAoc3RydWN0IFNjc2lfSG9zdCAqKV9pbnN0YW5jZTsKKworICAgIHN0YXR1cyA9IERNQShpbnN0YW5jZSktPklTVFI7CisgICAgaWYgKCEoc3RhdHVzICYgKElTVFJfSU5UX0Z8SVNUUl9JTlRfUCkpIHx8ICEoc3RhdHVzICYgSVNUUl9JTlRTKSkKKwlyZXR1cm4gSVJRX05PTkU7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+aG9zdF9sb2NrLCBmbGFncyk7CisgICAgd2QzM2M5M19pbnRyKGluc3RhbmNlKTsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5ob3N0X2xvY2ssIGZsYWdzKTsKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgZG1hX3NldHVwIChTY3NpX0NtbmQgKmNtZCwgaW50IGRpcl9pbikKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBjbnRyID0gQ05UUl9QRE1EIHwgQ05UUl9JTlRFTjsKKyAgICB1bnNpZ25lZCBsb25nIGFkZHIgPSB2aXJ0X3RvX2J1cyhjbWQtPlNDcC5wdHIpOworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlID0gY21kLT5kZXZpY2UtPmhvc3Q7CisKKyAgICAvKiBkb24ndCBhbGxvdyBETUEgaWYgdGhlIHBoeXNpY2FsIGFkZHJlc3MgaXMgYmFkICovCisgICAgaWYgKGFkZHIgJiBBMjA5MV9YRkVSX01BU0sgfHwKKwkoIWRpcl9pbiAmJiBtbV9lbmRfb2ZfY2h1bmsgKGFkZHIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpKSkKKyAgICB7CisJSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2xlbiA9IChjbWQtPlNDcC50aGlzX3Jlc2lkdWFsICsgNTExKQorCSAgICAmIH4weDFmZjsKKwlIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfYnVmZmVyID0KKwkgICAga21hbGxvYyAoSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2xlbiwgR0ZQX0tFUk5FTCk7CisJCisJLyogY2FuJ3QgYWxsb2NhdGUgbWVtb3J5OyB1c2UgUElPICovCisJaWYgKCFIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfYnVmZmVyKSB7CisJICAgIEhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9sZW4gPSAwOworCSAgICByZXR1cm4gMTsKKwl9CisKKwkvKiBnZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGJvdW5jZSBidWZmZXIgKi8KKwlhZGRyID0gdmlydF90b19idXMoSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2J1ZmZlcik7CisKKwkvKiB0aGUgYm91bmNlIGJ1ZmZlciBtYXkgbm90IGJlIGluIHRoZSBmaXJzdCAxNk0gb2YgcGh5c21lbSAqLworCWlmIChhZGRyICYgQTIwOTFfWEZFUl9NQVNLKSB7CisJICAgIC8qIHdlIGNvdWxkIHVzZSBjaGlwbWVtLi4uIG1heWJlIGxhdGVyICovCisJICAgIGtmcmVlIChIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfYnVmZmVyKTsKKwkgICAgSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2J1ZmZlciA9IE5VTEw7CisJICAgIEhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9sZW4gPSAwOworCSAgICByZXR1cm4gMTsKKwl9CisKKwlpZiAoIWRpcl9pbikgeworCSAgICAvKiBjb3B5IHRvIGJvdW5jZSBidWZmZXIgZm9yIGEgd3JpdGUgKi8KKwkgICAgaWYgKGNtZC0+dXNlX3NnKQorI2lmIDAKKwkJcGFuaWMgKCJzY3NpJWRkbWE6IGluY29tcGxldGUgcy9nIHN1cHBvcnQiLAorCQkgICAgICAgaW5zdGFuY2UtPmhvc3Rfbm8pOworI2Vsc2UKKwkJbWVtY3B5IChIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfYnVmZmVyLAorCQkJY21kLT5TQ3AucHRyLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsKTsKKyNlbmRpZgorCSAgICBlbHNlCisJCW1lbWNweSAoSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2J1ZmZlciwKKwkJCWNtZC0+cmVxdWVzdF9idWZmZXIsIGNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwl9CisgICAgfQorCisgICAgLyogc2V0dXAgZG1hIGRpcmVjdGlvbiAqLworICAgIGlmICghZGlyX2luKQorCWNudHIgfD0gQ05UUl9ERElSOworCisgICAgLyogcmVtZW1iZXIgZGlyZWN0aW9uICovCisgICAgSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfZGlyID0gZGlyX2luOworCisgICAgRE1BKGNtZC0+ZGV2aWNlLT5ob3N0KS0+Q05UUiA9IGNudHI7CisKKyAgICAvKiBzZXR1cCBETUEgKnBoeXNpY2FsKiBhZGRyZXNzICovCisgICAgRE1BKGNtZC0+ZGV2aWNlLT5ob3N0KS0+QUNSID0gYWRkcjsKKworICAgIGlmIChkaXJfaW4peworCS8qIGludmFsaWRhdGUgYW55IGNhY2hlICovCisJY2FjaGVfY2xlYXIgKGFkZHIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworICAgIH1lbHNleworCS8qIHB1c2ggYW55IGRpcnR5IGNhY2hlICovCisJY2FjaGVfcHVzaCAoYWRkciwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7CisgICAgICB9CisgICAgLyogc3RhcnQgRE1BICovCisgICAgRE1BKGNtZC0+ZGV2aWNlLT5ob3N0KS0+U1RfRE1BID0gMTsKKworICAgIC8qIHJldHVybiBzdWNjZXNzICovCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9zdG9wIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgU2NzaV9DbW5kICpTQ3BudCwgCisJCSAgICAgIGludCBzdGF0dXMpCit7CisgICAgLyogZGlzYWJsZSBTQ1NJIGludGVycnVwdHMgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBjbnRyID0gQ05UUl9QRE1EOworCisgICAgaWYgKCFIREFUQShpbnN0YW5jZSktPmRtYV9kaXIpCisJICAgIGNudHIgfD0gQ05UUl9ERElSOworCisgICAgLyogZGlzYWJsZSBTQ1NJIGludGVycnVwdHMgKi8KKyAgICBETUEoaW5zdGFuY2UpLT5DTlRSID0gY250cjsKKworICAgIC8qIGZsdXNoIGlmIHdlIHdlcmUgcmVhZGluZyAqLworICAgIGlmIChIREFUQShpbnN0YW5jZSktPmRtYV9kaXIpIHsKKwlETUEoaW5zdGFuY2UpLT5GTFVTSCA9IDE7CisJd2hpbGUgKCEoRE1BKGluc3RhbmNlKS0+SVNUUiAmIElTVFJfRkVfRkxHKSkKKwkgICAgOworICAgIH0KKworICAgIC8qIGNsZWFyIGEgcG9zc2libGUgaW50ZXJydXB0ICovCisgICAgRE1BKGluc3RhbmNlKS0+Q0lOVCA9IDE7CisKKyAgICAvKiBzdG9wIERNQSAqLworICAgIERNQShpbnN0YW5jZSktPlNQX0RNQSA9IDE7CisKKyAgICAvKiByZXN0b3JlIHRoZSBDT05UUk9MIGJpdHMgKG1pbnVzIHRoZSBkaXJlY3Rpb24gZmxhZykgKi8KKyAgICBETUEoaW5zdGFuY2UpLT5DTlRSID0gQ05UUl9QRE1EIHwgQ05UUl9JTlRFTjsKKworICAgIC8qIGNvcHkgZnJvbSBhIGJvdW5jZSBidWZmZXIsIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmIChzdGF0dXMgJiYgSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2J1ZmZlcikgeworCWlmIChTQ3BudCAmJiBTQ3BudC0+dXNlX3NnKSB7CisjaWYgMAorCSAgICBwYW5pYyAoInNjc2klZDogaW5jb21wbGV0ZSBzL2cgc3VwcG9ydCIsCisJCSAgIGluc3RhbmNlLT5ob3N0X25vKTsKKyNlbHNlCisJICAgIGlmKCBIREFUQShpbnN0YW5jZSktPmRtYV9kaXIgKQorCQltZW1jcHkgKFNDcG50LT5TQ3AucHRyLCAKKwkJCUhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9idWZmZXIsCisJCQlTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwpOworCSAgICBrZnJlZSAoSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2J1ZmZlcik7CisJICAgIEhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9idWZmZXIgPSBOVUxMOworCSAgICBIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfbGVuID0gMDsKKwkgICAgCisjZW5kaWYKKwl9IGVsc2UgeworCSAgICBpZiAoSERBVEEoaW5zdGFuY2UpLT5kbWFfZGlyICYmIFNDcG50KQorCQltZW1jcHkgKFNDcG50LT5yZXF1ZXN0X2J1ZmZlciwKKwkJCUhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9idWZmZXIsCisJCQlTQ3BudC0+cmVxdWVzdF9idWZmbGVuKTsKKworCSAgICBrZnJlZSAoSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2J1ZmZlcik7CisJICAgIEhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9idWZmZXIgPSBOVUxMOworCSAgICBIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfbGVuID0gMDsKKwl9CisgICAgfQorfQorCitpbnQgX19pbml0IGEyMDkxX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQpCit7CisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgY2FsbGVkID0gMDsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZTsKKyAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisgICAgc3RydWN0IHpvcnJvX2RldiAqeiA9IE5VTEw7CisgICAgd2QzM2M5M19yZWdzIHJlZ3M7CisgICAgaW50IG51bV9hMjA5MSA9IDA7CisKKyAgICBpZiAoIU1BQ0hfSVNfQU1JR0EgfHwgY2FsbGVkKQorCXJldHVybiAwOworICAgIGNhbGxlZCA9IDE7CisKKyAgICB0cG50LT5wcm9jX25hbWUgPSAiQTIwOTEiOworICAgIHRwbnQtPnByb2NfaW5mbyA9ICZ3ZDMzYzkzX3Byb2NfaW5mbzsKKworICAgIHdoaWxlICgoeiA9IHpvcnJvX2ZpbmRfZGV2aWNlKFpPUlJPX1dJTERDQVJELCB6KSkpIHsKKwlpZiAoei0+aWQgIT0gWk9SUk9fUFJPRF9DQk1fQTU5MF9BMjA5MV8xICYmCisJICAgIHotPmlkICE9IFpPUlJPX1BST0RfQ0JNX0E1OTBfQTIwOTFfMikKKwkgICAgY29udGludWU7CisJYWRkcmVzcyA9IHotPnJlc291cmNlLnN0YXJ0OworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGFkZHJlc3MsIDI1NiwgIndkMzNjOTMiKSkKKwkgICAgY29udGludWU7CisKKwlpbnN0YW5jZSA9IHNjc2lfcmVnaXN0ZXIgKHRwbnQsIHNpemVvZiAoc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEpKTsKKwlpZiAoaW5zdGFuY2UgPT0gTlVMTCkgeworCSAgICByZWxlYXNlX21lbV9yZWdpb24oYWRkcmVzcywgMjU2KTsKKwkgICAgY29udGludWU7CisJfQorCWluc3RhbmNlLT5iYXNlID0gWlRXT19WQUREUihhZGRyZXNzKTsKKwlpbnN0YW5jZS0+aXJxID0gSVJRX0FNSUdBX1BPUlRTOworCWluc3RhbmNlLT51bmlxdWVfaWQgPSB6LT5zbG90YWRkcjsKKwlETUEoaW5zdGFuY2UpLT5EQVdSID0gREFXUl9BMjA5MTsKKwlyZWdzLlNBU1IgPSAmKERNQShpbnN0YW5jZSktPlNBU1IpOworCXJlZ3MuU0NNRCA9ICYoRE1BKGluc3RhbmNlKS0+U0NNRCk7CisJd2QzM2M5M19pbml0KGluc3RhbmNlLCByZWdzLCBkbWFfc2V0dXAsIGRtYV9zdG9wLCBXRDMzQzkzX0ZTXzhfMTApOworCXJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgYTIwOTFfaW50ciwgU0FfU0hJUlEsICJBMjA5MSBTQ1NJIiwKKwkJICAgIGluc3RhbmNlKTsKKwlETUEoaW5zdGFuY2UpLT5DTlRSID0gQ05UUl9QRE1EIHwgQ05UUl9JTlRFTjsKKwludW1fYTIwOTErKzsKKyAgICB9CisKKyAgICByZXR1cm4gbnVtX2EyMDkxOworfQorCitzdGF0aWMgaW50IGEyMDkxX2J1c19yZXNldChTY3NpX0NtbmQgKmNtZCkKK3sKKwkvKiBGSVhNRSBwZXJmb3JtIGJ1cy1zcGVjaWZpYyByZXNldCAqLworCXdkMzNjOTNfaG9zdF9yZXNldChjbWQpOworCXJldHVybiBTVUNDRVNTOworfQorCisjZGVmaW5lIEhPU1RTX0MKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQkJPSAiQTI5MDEiLAorCS5uYW1lCQkJPSAiQ29tbW9kb3JlIEEyMDkxL0E1OTAgU0NTSSIsCisJLmRldGVjdAkJCT0gYTIwOTFfZGV0ZWN0LAorCS5yZWxlYXNlCQk9IGEyMDkxX3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSB3ZDMzYzkzX3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IHdkMzNjOTNfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gYTIwOTFfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSB3ZDMzYzkzX2hvc3RfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSBDQU5fUVVFVUUsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gQ01EX1BFUl9MVU4sCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORworfTsKKworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworaW50IGEyMDkxX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisjaWZkZWYgTU9EVUxFCisJRE1BKGluc3RhbmNlKS0+Q05UUiA9IDA7CisJcmVsZWFzZV9tZW1fcmVnaW9uKFpUV09fUEFERFIoaW5zdGFuY2UtPmJhc2UpLCAyNTYpOworCWZyZWVfaXJxKElSUV9BTUlHQV9QT1JUUywgaW5zdGFuY2UpOworCXdkMzNjOTNfcmVsZWFzZSgpOworI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hMjA5MS5oIGIvZHJpdmVycy9zY3NpL2EyMDkxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ5OTM5NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hMjA5MS5oCkBAIC0wLDAgKzEsNzYgQEAKKyNpZm5kZWYgQTIwOTFfSAorI2RlZmluZSBBMjA5MV9ICisKKy8qICRJZDogYTIwOTEuaCx2IDEuNCAxOTk3LzAxLzE5IDIzOjA3OjA5IGRhdmVtIEV4cCAkCisgKgorICogSGVhZGVyIGZpbGUgZm9yIHRoZSBDb21tb2RvcmUgQTIwOTEgWm9ycm8gSUkgU0NTSSBjb250cm9sbGVyIGZvciBMaW51eAorICoKKyAqIFdyaXR0ZW4gYW5kIChDKSAxOTkzLCBIYW1pc2ggTWFjZG9uYWxkLCBzZWUgYTIwOTEuYyBmb3IgbW9yZSBpbmZvCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitpbnQgYTIwOTFfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK2ludCBhMjA5MV9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKik7Citjb25zdCBjaGFyICp3ZDMzYzkzX2luZm8odm9pZCk7CitpbnQgd2QzM2M5M19xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICosIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpOworaW50IHdkMzNjOTNfYWJvcnQoU2NzaV9DbW5kICopOworaW50IHdkMzNjOTNfcmVzZXQoU2NzaV9DbW5kICosIHVuc2lnbmVkIGludCk7CisKKyNpZm5kZWYgQ01EX1BFUl9MVU4KKyNkZWZpbmUgQ01EX1BFUl9MVU4gMgorI2VuZGlmCisKKyNpZm5kZWYgQ0FOX1FVRVVFCisjZGVmaW5lIENBTl9RVUVVRSAxNgorI2VuZGlmCisKKy8qCisgKiBpZiB0aGUgdHJhbnNmZXIgYWRkcmVzcyBBTkRlZCB3aXRoIHRoaXMgcmVzdWx0cyBpbiBhIG5vbi16ZXJvCisgKiByZXN1bHQsIHRoZW4gd2UgY2FuJ3QgdXNlIERNQS4KKyAqLworI2RlZmluZSBBMjA5MV9YRkVSX01BU0sgICgweGZmMDAwMDAxKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDFbNjRdOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICAgICBJU1RSOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICAgICBDTlRSOworICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBwYWQyWzYwXTsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgICAgICAgV1RDOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgICAgICBBQ1I7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDNbNl07CisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgICAgIERBV1I7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDQ7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgICAgIFNBU1I7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDU7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgICAgIFNDTUQ7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDZbNzZdOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICAgICBTVF9ETUE7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgICAgIFNQX0RNQTsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgICAgQ0lOVDsKKyAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgcGFkN1syXTsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgICAgRkxVU0g7Cit9IGEyMDkxX3Njc2lyZWdzOworCisjZGVmaW5lIERBV1JfQTIwOTEJCSgzKQorCisvKiBDTlRSIGJpdHMuICovCisjZGVmaW5lIENOVFJfVENFTgkJKDE8PDcpCisjZGVmaW5lIENOVFJfUFJFU1QJCSgxPDw2KQorI2RlZmluZSBDTlRSX1BETUQJCSgxPDw1KQorI2RlZmluZSBDTlRSX0lOVEVOCQkoMTw8NCkKKyNkZWZpbmUgQ05UUl9ERElSCQkoMTw8MykKKworLyogSVNUUiBiaXRzLiAqLworI2RlZmluZSBJU1RSX0lOVFgJCSgxPDw4KQorI2RlZmluZSBJU1RSX0lOVF9GCQkoMTw8NykKKyNkZWZpbmUgSVNUUl9JTlRTCQkoMTw8NikKKyNkZWZpbmUgSVNUUl9FX0lOVAkJKDE8PDUpCisjZGVmaW5lIElTVFJfSU5UX1AJCSgxPDw0KQorI2RlZmluZSBJU1RSX1VFX0lOVAkJKDE8PDMpCisjZGVmaW5lIElTVFJfT0VfSU5UCQkoMTw8MikKKyNkZWZpbmUgSVNUUl9GRl9GTEcJCSgxPDwxKQorI2RlZmluZSBJU1RSX0ZFX0ZMRwkJKDE8PDApCisKKyNlbmRpZiAvKiBBMjA5MV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYTMwMDAuYyBiL2RyaXZlcnMvc2NzaS9hMzAwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YTg5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYTMwMDAuYwpAQCAtMCwwICsxLDI0NSBAQAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgIndkMzNjOTMuaCIKKyNpbmNsdWRlICJhMzAwMC5oIgorCisjaW5jbHVkZTxsaW51eC9zdGF0Lmg+CisKKyNkZWZpbmUgRE1BKHB0cikgKChhMzAwMF9zY3NpcmVncyAqKSgocHRyKS0+YmFzZSkpCisjZGVmaW5lIEhEQVRBKHB0cikgKChzdHJ1Y3QgV0QzM0M5M19ob3N0ZGF0YSAqKSgocHRyKS0+aG9zdGRhdGEpKQorCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqYTMwMDBfaG9zdCA9IE5VTEw7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhMzAwMF9pbnRyIChpbnQgaXJxLCB2b2lkICpkdW1teSwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHN0YXR1cyA9IERNQShhMzAwMF9ob3N0KS0+SVNUUjsKKworCWlmICghKHN0YXR1cyAmIElTVFJfSU5UX1ApKQorCQlyZXR1cm4gSVJRX05PTkU7CisJaWYgKHN0YXR1cyAmIElTVFJfSU5UUykKKwl7CisJCXNwaW5fbG9ja19pcnFzYXZlKGEzMDAwX2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQl3ZDMzYzkzX2ludHIgKGEzMDAwX2hvc3QpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGEzMDAwX2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCXByaW50aygiTm9uLXNlcnZpY2VkIEEzMDAwIFNDU0ktaW50ZXJydXB0PyBJU1RSID0gJTAyeFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBpbnQgZG1hX3NldHVwIChTY3NpX0NtbmQgKmNtZCwgaW50IGRpcl9pbikKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBjbnRyID0gQ05UUl9QRE1EIHwgQ05UUl9JTlRFTjsKKyAgICB1bnNpZ25lZCBsb25nIGFkZHIgPSB2aXJ0X3RvX2J1cyhjbWQtPlNDcC5wdHIpOworCisgICAgLyoKKyAgICAgKiBpZiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBoYXMgdGhlIHdyb25nIGFsaWdubWVudCwgb3IgaWYKKyAgICAgKiBwaHlzaWNhbCBhZGRyZXNzIGlzIGJhZCwgb3IgaWYgaXQgaXMgYSB3cml0ZSBhbmQgYXQgdGhlCisgICAgICogZW5kIG9mIGEgcGh5c2ljYWwgbWVtb3J5IGNodW5rLCB0aGVuIGFsbG9jYXRlIGEgYm91bmNlCisgICAgICogYnVmZmVyCisgICAgICovCisgICAgaWYgKGFkZHIgJiBBMzAwMF9YRkVSX01BU0sgfHwKKwkoIWRpcl9pbiAmJiBtbV9lbmRfb2ZfY2h1bmsgKGFkZHIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpKSkKKyAgICB7CisJSERBVEEoYTMwMDBfaG9zdCktPmRtYV9ib3VuY2VfbGVuID0gKGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgKyA1MTEpCisJICAgICYgfjB4MWZmOworCUhEQVRBKGEzMDAwX2hvc3QpLT5kbWFfYm91bmNlX2J1ZmZlciA9CisJICAgIGttYWxsb2MgKEhEQVRBKGEzMDAwX2hvc3QpLT5kbWFfYm91bmNlX2xlbiwgR0ZQX0tFUk5FTCk7CisJCisJLyogY2FuJ3QgYWxsb2NhdGUgbWVtb3J5OyB1c2UgUElPICovCisJaWYgKCFIREFUQShhMzAwMF9ob3N0KS0+ZG1hX2JvdW5jZV9idWZmZXIpIHsKKwkgICAgSERBVEEoYTMwMDBfaG9zdCktPmRtYV9ib3VuY2VfbGVuID0gMDsKKwkgICAgcmV0dXJuIDE7CisJfQorCisJaWYgKCFkaXJfaW4pIHsKKwkgICAgLyogY29weSB0byBib3VuY2UgYnVmZmVyIGZvciBhIHdyaXRlICovCisJICAgIGlmIChjbWQtPnVzZV9zZykgeworCQltZW1jcHkgKEhEQVRBKGEzMDAwX2hvc3QpLT5kbWFfYm91bmNlX2J1ZmZlciwKKwkJCWNtZC0+U0NwLnB0ciwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7CisJICAgIH0gZWxzZQorCQltZW1jcHkgKEhEQVRBKGEzMDAwX2hvc3QpLT5kbWFfYm91bmNlX2J1ZmZlciwKKwkJCWNtZC0+cmVxdWVzdF9idWZmZXIsIGNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwl9CisKKwlhZGRyID0gdmlydF90b19idXMoSERBVEEoYTMwMDBfaG9zdCktPmRtYV9ib3VuY2VfYnVmZmVyKTsKKyAgICB9CisKKyAgICAvKiBzZXR1cCBkbWEgZGlyZWN0aW9uICovCisgICAgaWYgKCFkaXJfaW4pCisJY250ciB8PSBDTlRSX0RESVI7CisKKyAgICAvKiByZW1lbWJlciBkaXJlY3Rpb24gKi8KKyAgICBIREFUQShhMzAwMF9ob3N0KS0+ZG1hX2RpciA9IGRpcl9pbjsKKworICAgIERNQShhMzAwMF9ob3N0KS0+Q05UUiA9IGNudHI7CisKKyAgICAvKiBzZXR1cCBETUEgKnBoeXNpY2FsKiBhZGRyZXNzICovCisgICAgRE1BKGEzMDAwX2hvc3QpLT5BQ1IgPSBhZGRyOworCisgICAgaWYgKGRpcl9pbikKKyAgCS8qIGludmFsaWRhdGUgYW55IGNhY2hlICovCisJY2FjaGVfY2xlYXIgKGFkZHIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworICAgIGVsc2UKKwkvKiBwdXNoIGFueSBkaXJ0eSBjYWNoZSAqLworCWNhY2hlX3B1c2ggKGFkZHIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworCisgICAgLyogc3RhcnQgRE1BICovCisgICAgbWIoKTsJCQkvKiBtYWtlIHN1cmUgc2V0dXAgaXMgY29tcGxldGVkICovCisgICAgRE1BKGEzMDAwX2hvc3QpLT5TVF9ETUEgPSAxOworICAgIG1iKCk7CQkJLyogbWFrZSBzdXJlIERNQSBoYXMgc3RhcnRlZCBiZWZvcmUgbmV4dCBJTyAqLworCisgICAgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZG1hX3N0b3AgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBTY3NpX0NtbmQgKlNDcG50LAorCQkgICAgICBpbnQgc3RhdHVzKQoreworICAgIC8qIGRpc2FibGUgU0NTSSBpbnRlcnJ1cHRzICovCisgICAgdW5zaWduZWQgc2hvcnQgY250ciA9IENOVFJfUERNRDsKKworICAgIGlmICghSERBVEEoaW5zdGFuY2UpLT5kbWFfZGlyKQorCWNudHIgfD0gQ05UUl9ERElSOworCisgICAgRE1BKGluc3RhbmNlKS0+Q05UUiA9IGNudHI7CisgICAgbWIoKTsJCQkvKiBtYWtlIHN1cmUgQ05UUiBpcyB1cGRhdGVkIGJlZm9yZSBuZXh0IElPICovCisKKyAgICAvKiBmbHVzaCBpZiB3ZSB3ZXJlIHJlYWRpbmcgKi8KKyAgICBpZiAoSERBVEEoaW5zdGFuY2UpLT5kbWFfZGlyKSB7CisJRE1BKGluc3RhbmNlKS0+RkxVU0ggPSAxOworCW1iKCk7CQkJLyogZG9uJ3QgYWxsb3cgcHJlZmV0Y2ggKi8KKwl3aGlsZSAoIShETUEoaW5zdGFuY2UpLT5JU1RSICYgSVNUUl9GRV9GTEcpKQorCSAgICBiYXJyaWVyKCk7CisJbWIoKTsJCQkvKiBubyBJTyB1bnRpbCBGTFVTSCBpcyBkb25lICovCisgICAgfQorCisgICAgLyogY2xlYXIgYSBwb3NzaWJsZSBpbnRlcnJ1cHQgKi8KKyAgICAvKiBJIHRoaW5rIHRoYXQgdGhpcyBDSU5UIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdSBhcmUKKyAgICAgKiB1c2luZyB0aGUgdGVybWluYWwgY291bnQgZmVhdHVyZXMuICAgSE0gNyBNYXIgMTk5NAorICAgICAqLworICAgIERNQShpbnN0YW5jZSktPkNJTlQgPSAxOworCisgICAgLyogc3RvcCBETUEgKi8KKyAgICBETUEoaW5zdGFuY2UpLT5TUF9ETUEgPSAxOworICAgIG1iKCk7CQkJLyogbWFrZSBzdXJlIERNQSBpcyBzdG9wcGVkIGJlZm9yZSBuZXh0IElPICovCisKKyAgICAvKiByZXN0b3JlIHRoZSBDT05UUk9MIGJpdHMgKG1pbnVzIHRoZSBkaXJlY3Rpb24gZmxhZykgKi8KKyAgICBETUEoaW5zdGFuY2UpLT5DTlRSID0gQ05UUl9QRE1EIHwgQ05UUl9JTlRFTjsKKyAgICBtYigpOwkJCS8qIG1ha2Ugc3VyZSBDTlRSIGlzIHVwZGF0ZWQgYmVmb3JlIG5leHQgSU8gKi8KKworICAgIC8qIGNvcHkgZnJvbSBhIGJvdW5jZSBidWZmZXIsIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmIChzdGF0dXMgJiYgSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2J1ZmZlcikgeworCWlmIChTQ3BudCAmJiBTQ3BudC0+dXNlX3NnKSB7CisJICAgIGlmIChIREFUQShpbnN0YW5jZSktPmRtYV9kaXIgJiYgU0NwbnQpCisJCW1lbWNweSAoU0NwbnQtPlNDcC5wdHIsCisJCQlIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfYnVmZmVyLAorCQkJU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsKTsKKwkgICAga2ZyZWUgKEhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9idWZmZXIpOworCSAgICBIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfYnVmZmVyID0gTlVMTDsKKwkgICAgSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2xlbiA9IDA7CisJfSBlbHNlIHsKKwkgICAgaWYgKEhEQVRBKGluc3RhbmNlKS0+ZG1hX2RpciAmJiBTQ3BudCkKKwkJbWVtY3B5IChTQ3BudC0+cmVxdWVzdF9idWZmZXIsCisJCQlIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfYnVmZmVyLAorCQkJU0NwbnQtPnJlcXVlc3RfYnVmZmxlbik7CisKKwkgICAga2ZyZWUgKEhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9idWZmZXIpOworCSAgICBIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfYnVmZmVyID0gTlVMTDsKKwkgICAgSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2xlbiA9IDA7CisJfQorICAgIH0KK30KKworaW50IF9faW5pdCBhMzAwMF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICp0cG50KQoreworICAgIHdkMzNjOTNfcmVncyByZWdzOworCisgICAgaWYgICghTUFDSF9JU19BTUlHQSB8fCAhQU1JR0FIV19QUkVTRU5UKEEzMDAwX1NDU0kpKQorCXJldHVybiAwOworICAgIGlmICghcmVxdWVzdF9tZW1fcmVnaW9uKDB4REQwMDAwLCAyNTYsICJ3ZDMzYzkzIikpCisJcmV0dXJuIDA7CisKKyAgICB0cG50LT5wcm9jX25hbWUgPSAiQTMwMDAiOworICAgIHRwbnQtPnByb2NfaW5mbyA9ICZ3ZDMzYzkzX3Byb2NfaW5mbzsKKworICAgIGEzMDAwX2hvc3QgPSBzY3NpX3JlZ2lzdGVyICh0cG50LCBzaXplb2Yoc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEpKTsKKyAgICBpZiAoYTMwMDBfaG9zdCA9PSBOVUxMKQorCWdvdG8gZmFpbF9yZWdpc3RlcjsKKworICAgIGEzMDAwX2hvc3QtPmJhc2UgPSBaVFdPX1ZBRERSKDB4REQwMDAwKTsKKyAgICBhMzAwMF9ob3N0LT5pcnEgPSBJUlFfQU1JR0FfUE9SVFM7CisgICAgRE1BKGEzMDAwX2hvc3QpLT5EQVdSID0gREFXUl9BMzAwMDsKKyAgICByZWdzLlNBU1IgPSAmKERNQShhMzAwMF9ob3N0KS0+U0FTUik7CisgICAgcmVncy5TQ01EID0gJihETUEoYTMwMDBfaG9zdCktPlNDTUQpOworICAgIHdkMzNjOTNfaW5pdChhMzAwMF9ob3N0LCByZWdzLCBkbWFfc2V0dXAsIGRtYV9zdG9wLCBXRDMzQzkzX0ZTXzEyXzE1KTsKKyAgICBpZiAocmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBhMzAwMF9pbnRyLCBTQV9TSElSUSwgIkEzMDAwIFNDU0kiLAorCQkgICAgYTMwMDBfaW50cikpCisgICAgICAgIGdvdG8gZmFpbF9pcnE7CisgICAgRE1BKGEzMDAwX2hvc3QpLT5DTlRSID0gQ05UUl9QRE1EIHwgQ05UUl9JTlRFTjsKKworICAgIHJldHVybiAxOworCitmYWlsX2lycToKKyAgICB3ZDMzYzkzX3JlbGVhc2UoKTsKKyAgICBzY3NpX3VucmVnaXN0ZXIoYTMwMDBfaG9zdCk7CitmYWlsX3JlZ2lzdGVyOgorICAgIHJlbGVhc2VfbWVtX3JlZ2lvbigweEREMDAwMCwgMjU2KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhMzAwMF9idXNfcmVzZXQoU2NzaV9DbW5kICpjbWQpCit7CisJLyogRklYTUUgcGVyZm9ybSBidXMtc3BlY2lmaWMgcmVzZXQgKi8KKwl3ZDMzYzkzX2hvc3RfcmVzZXQoY21kKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworI2RlZmluZSBIT1NUU19DCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gIkEzMDAwIiwKKwkubmFtZQkJCT0gIkFtaWdhIDMwMDAgYnVpbHQtaW4gU0NTSSIsCisJLmRldGVjdAkJCT0gYTMwMDBfZGV0ZWN0LAorCS5yZWxlYXNlCQk9IGEzMDAwX3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSB3ZDMzYzkzX3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IHdkMzNjOTNfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gYTMwMDBfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSB3ZDMzYzkzX2hvc3RfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSBDQU5fUVVFVUUsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gQ01EX1BFUl9MVU4sCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HCit9OworCisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCitpbnQgYTMwMDBfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKyAgICB3ZDMzYzkzX3JlbGVhc2UoKTsKKyAgICBETUEoaW5zdGFuY2UpLT5DTlRSID0gMDsKKyAgICByZWxlYXNlX21lbV9yZWdpb24oMHhERDAwMDAsIDI1Nik7CisgICAgZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBhMzAwMF9pbnRyKTsKKyAgICByZXR1cm4gMTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2EzMDAwLmggYi9kcml2ZXJzL3Njc2kvYTMwMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWVkYTczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2EzMDAwLmgKQEAgLTAsMCArMSw3OSBAQAorI2lmbmRlZiBBMzAwMF9ICisjZGVmaW5lIEEzMDAwX0gKKworLyogJElkOiBhMzAwMC5oLHYgMS40IDE5OTcvMDEvMTkgMjM6MDc6MTAgZGF2ZW0gRXhwICQKKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgdGhlIEFtaWdhIDMwMDAgYnVpbHQtaW4gU0NTSSBjb250cm9sbGVyIGZvciBMaW51eAorICoKKyAqIFdyaXR0ZW4gYW5kIChDKSAxOTkzLCBIYW1pc2ggTWFjZG9uYWxkLCBzZWUgYTMwMDAuYyBmb3IgbW9yZSBpbmZvCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitpbnQgYTMwMDBfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK2ludCBhMzAwMF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKik7Citjb25zdCBjaGFyICp3ZDMzYzkzX2luZm8odm9pZCk7CitpbnQgd2QzM2M5M19xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICosIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpOworaW50IHdkMzNjOTNfYWJvcnQoU2NzaV9DbW5kICopOworaW50IHdkMzNjOTNfcmVzZXQoU2NzaV9DbW5kICosIHVuc2lnbmVkIGludCk7CisKKyNpZm5kZWYgQ01EX1BFUl9MVU4KKyNkZWZpbmUgQ01EX1BFUl9MVU4gMgorI2VuZGlmCisKKyNpZm5kZWYgQ0FOX1FVRVVFCisjZGVmaW5lIENBTl9RVUVVRSAxNgorI2VuZGlmCisKKy8qCisgKiBpZiB0aGUgdHJhbnNmZXIgYWRkcmVzcyBBTkRlZCB3aXRoIHRoaXMgcmVzdWx0cyBpbiBhIG5vbi16ZXJvCisgKiByZXN1bHQsIHRoZW4gd2UgY2FuJ3QgdXNlIERNQS4KKyAqLworI2RlZmluZSBBMzAwMF9YRkVSX01BU0sgICgweDAwMDAwMDAzKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDFbMl07CisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgICAgIERBV1I7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgaW50ICAgICAgIFdUQzsKKyAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgcGFkMlsyXTsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgICAgQ05UUjsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICAgICAgQUNSOworICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBwYWQzWzJdOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICAgICBTVF9ETUE7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDRbMl07CisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgICAgIEZMVVNIOworICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBwYWQ1WzJdOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICAgICBDSU5UOworICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBwYWQ2WzJdOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICAgICBJU1RSOworCSAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDdbMzBdOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICAgICBTUF9ETUE7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDg7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgICAgIFNBU1I7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDk7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgICAgIFNDTUQ7Cit9IGEzMDAwX3Njc2lyZWdzOworCisjZGVmaW5lIERBV1JfQTMwMDAJCSgzKQorCisvKiBDTlRSIGJpdHMuICovCisjZGVmaW5lIENOVFJfVENFTgkJKDE8PDUpCisjZGVmaW5lIENOVFJfUFJFU1QJCSgxPDw0KQorI2RlZmluZSBDTlRSX1BETUQJCSgxPDwzKQorI2RlZmluZSBDTlRSX0lOVEVOCQkoMTw8MikKKyNkZWZpbmUgQ05UUl9ERElSCQkoMTw8MSkKKyNkZWZpbmUgQ05UUl9JT19EWAkJKDE8PDApCisKKy8qIElTVFIgYml0cy4gKi8KKyNkZWZpbmUgSVNUUl9JTlRYCQkoMTw8OCkKKyNkZWZpbmUgSVNUUl9JTlRfRgkJKDE8PDcpCisjZGVmaW5lIElTVFJfSU5UUwkJKDE8PDYpCisjZGVmaW5lIElTVFJfRV9JTlQJCSgxPDw1KQorI2RlZmluZSBJU1RSX0lOVF9QCQkoMTw8NCkKKyNkZWZpbmUgSVNUUl9VRV9JTlQJCSgxPDwzKQorI2RlZmluZSBJU1RSX09FX0lOVAkJKDE8PDIpCisjZGVmaW5lIElTVFJfRkZfRkxHCQkoMTw8MSkKKyNkZWZpbmUgSVNUUl9GRV9GTEcJCSgxPDwwKQorCisjZW5kaWYgLyogQTMwMDBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGQxMzNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACisjIEFkYXB0ZWMgYWFjcmFpZAorCitvYmotJChDT05GSUdfU0NTSV9BQUNSQUlEKSA6PSBhYWNyYWlkLm8KKworYWFjcmFpZC1vYmpzCTo9IGxpbml0Lm8gYWFjaGJhLm8gY29tbWN0cmwubyBjb21taW5pdC5vIGNvbW1zdXAubyBcCisJCSAgIGRwY3N1cC5vIHJ4Lm8gc2EubyBya3QubworCitFWFRSQV9DRkxBR1MJOj0gLUlkcml2ZXJzL3Njc2kKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL1JFQURNRSBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGIwZjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvUkVBRE1FCkBAIC0wLDAgKzEsNjYgQEAKK0FBQ1JBSUQgRHJpdmVyIGZvciBMaW51eCAodGFrZSB0d28pCisKK0ludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIGFhY3JhaWQgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgQWRhcHRlYyAoaHR0cDovL3d3dy5hZGFwdGVjLmNvbSkKK1JBSUQgY29udHJvbGxlcnMuIFRoaXMgaXMgYSBtYWpvciByZXdyaXRlIGZyb20gdGhlIG9yaWdpbmFsIAorQWRhcHRlYyBzdXBwbGllZCBkcml2ZXIuIEl0IGhhcyBzaWduZmljYW50bHkgY2xlYW5lZCB1cCBib3RoIHRoZSBjb2RlCithbmQgdGhlIHJ1bm5pbmcgYmluYXJ5IHNpemUgKHRoZSBtb2R1bGUgaXMgbGVzcyB0aGFuIGhhbGYgdGhlIHNpemUgb2YKK3RoZSBvcmlnaW5hbCkuCisKK1N1cHBvcnRlZCBDYXJkcy9DaGlwc2V0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUFkYXB0ZWMgMjAyMFMKKwlBZGFwdGVjIDIwMjVTCisJQWRhcHRlYyAyMTIwUworCUFkYXB0ZWMgMjIwMFMKKwlBZGFwdGVjIDIyMzBTCisJQWRhcHRlYyAyMjQwUworCUFkYXB0ZWMgMjQxMFNBCisJQWRhcHRlYyAyNjEwU0EKKwlBZGFwdGVjIDI4MTBTQQorCUFkYXB0ZWMgMjE2MTBTQQorCUFkYXB0ZWMgMzIzMFMKKwlBZGFwdGVjIDMyNDBTCisJQWRhcHRlYyA0MDAwU0FTCisJQWRhcHRlYyA0MDA1U0FTCisJQWRhcHRlYyA0ODAwU0FTCisJQWRhcHRlYyA0ODA1U0FTCisJQWRhcHRlYyA1NDAwUworCURlbGwgUEVSQyAyIFF1YWQgQ2hhbm5lbAorCURlbGwgUEVSQyAyL1NpCisJRGVsbCBQRVJDIDMvU2kKKwlEZWxsIFBFUkMgMy9EaQorCURlbGwgQ0VSQyAyCisJSFAgTmV0UkFJRC00TQorCUxlZ2VuZCBTMjIwCisJTGVnZW5kIFMyMzAKKworUGVvcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaEBpbmZyYWRlYWQub3JnPgkodXBkYXRlcyBmb3IgbmV3LXN0eWxlIFBDSSBwcm9iaW5nIGFuZCBTQ1NJIGhvc3QgcmVnaXN0cmF0aW9uLAorCQkJCQkgc21hbGwgY2xlYW51cHMvZml4ZXMpCitNYXR0IERvbXNjaCA8bWF0dF9kb21zY2hAZGVsbC5jb20+CShyZXZpc2lvbiBpb2N0bCwgYWRhcHRlciBtZXNzYWdlcykKK0RlYW5uYSBCb25kcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm9uLURBU0Qgc3VwcG9ydCwgUEFFIGZpYnMgYW5kIDY0IGJpdCwgYWRkZWQgbmV3IGFkYXB0ZWMgY29udHJvbGxlcnMKKwkJCQkJIGFkZGVkIG5ldyBpb2N0bHMsIGNoYW5nZWQgc2NzaSBpbnRlcmZhY2UgdG8gdXNlIG5ldyBlcnJvciBoYW5kbGVyLAorCQkJCQkgaW5jcmVhc2VkIHRoZSBudW1iZXIgb2YgZmlicyBhbmQgb3V0c3RhbmRpbmcgY29tbWFuZHMgdG8gYSBjb250YWluZXIpCisKKwkJCQkJKGZpeGVkIDY0Yml0IGFuZCA2NEcgbWVtb3J5IG1vZGVsLCBjaGFuZ2VkIGNvbmZ1c2luZyBuYW1pbmcgY29udmVudGlvbgorCQkJCQkgd2hlcmUgZmlicyB0aGF0IGdvIHRvIHRoZSBoYXJkd2FyZSBhcmUgY29uc2lzdGVudGx5IGNhbGxlZCBod19maWJzIGFuZAorCQkJCQkgbm90IGp1c3QgZmlicyBsaWtlIHRoZSBuYW1lIG9mIHRoZSBkcml2ZXIgdHJhY2tpbmcgc3RydWN0dXJlKQorTWFyayBTYWx5enluIDxNYXJrX1NhbHl6eW5AYWRhcHRlYy5jb20+IEZpeGVkIHBhbmljIGlzc3VlcyBhbmQgYWRkZWQgc29tZSBuZXcgcHJvZHVjdCBpZHMgZm9yIHVwY29taW5nIGhiYXMuCisKK09yaWdpbmFsIERyaXZlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQWRhcHRlYyBVbml4IE9FTSBQcm9kdWN0IEdyb3VwCisKK01haWxpbmcgTGlzdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcgKEludGVyZXN0ZWQgcGFydGllcyB0cm9sbCBoZXJlKQorQWxzbyBub3RlIHRoaXMgaXMgdmVyeSBkaWZmZXJlbnQgdG8gQnJpYW4ncyBvcmlnaW5hbCBkcml2ZXIKK3NvIGRvbid0IGV4cGVjdCBoaW0gdG8gc3VwcG9ydCBpdC4KK0FkYXB0ZWMgZG9lcyBzdXBwb3J0IHRoaXMgZHJpdmVyLiAgQ29udGFjdCBlaXRoZXIgdGVjaCBzdXBwb3J0IG9yIE1hcmsgU2FseXp5bi4KKworT3JpZ2luYWwgYnkgQnJpYW4gQm9lcm5lciBGZWJydWFyeSAyMDAxCitSZXdyaXR0ZW4gYnkgQWxhbiBDb3gsIE5vdmVtYmVyIDIwMDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL1RPRE8gYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ODU2YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9UT0RPCkBAIC0wLDAgKzEsNiBAQAorbwlUZXN0aW5nCitvCU1vcmUgdGVzdGluZworbwlGZWF0dXJlIHJlcXVlc3Q6IGRpc3BsYXkgdGhlIGZpcm13YXJlL2Jpb3MvZXRjIHJldmlzaW9ucyBpbiB0aGUKKwkvcHJvYyBpbmZvCitvCURyb3AgaXJxX21hc2ssIGJhc2ljYWxseSB1bnVzZWQKK28JSS9PIHNpemUgaW5jcmVhc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjaGJhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNmYzM1MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jCkBAIC0wLDAgKzEsMjAzNyBAQAorLyoKKyAqCUFkYXB0ZWMgQUFDIHNlcmllcyBSQUlEIGNvbnRyb2xsZXIgZHJpdmVyCisgKgkoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMuCTxhbGFuQHJlZGhhdC5jb20+CisgKgorICogYmFzZWQgb24gdGhlIG9sZCBhYWNyYWlkIGRyaXZlciB0aGF0IGlzLi4KKyAqIEFkYXB0ZWMgYWFjcmFpZCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgQWRhcHRlYywgSW5jLiAoYWFjcmFpZEBhZGFwdGVjLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSAiYWFjcmFpZC5oIgorCisvKiB2YWx1ZXMgZm9yIGlucWRfcGR0OiBQZXJpcGhlcmFsIGRldmljZSB0eXBlIGluIHBsYWluIEVuZ2xpc2ggKi8KKyNkZWZpbmUJSU5RRF9QRFRfREEJMHgwMAkvKiBEaXJlY3QtYWNjZXNzIChESVNLKSBkZXZpY2UgKi8KKyNkZWZpbmUJSU5RRF9QRFRfUFJPQwkweDAzCS8qIFByb2Nlc3NvciBkZXZpY2UgKi8KKyNkZWZpbmUJSU5RRF9QRFRfQ0hOR1IJMHgwOAkvKiBDaGFuZ2VyIChqdWtlYm94LCBzY3NpMikgKi8KKyNkZWZpbmUJSU5RRF9QRFRfQ09NTQkweDA5CS8qIENvbW11bmljYXRpb24gZGV2aWNlIChzY3NpMikgKi8KKyNkZWZpbmUJSU5RRF9QRFRfTk9MVU4yIDB4MWYJLyogVW5rbm93biBEZXZpY2UgKHNjc2kyKSAqLworI2RlZmluZQlJTlFEX1BEVF9OT0xVTgkweDdmCS8qIExvZ2ljYWwgVW5pdCBOb3QgUHJlc2VudCAqLworCisjZGVmaW5lCUlOUURfUERUX0RNQVNLCTB4MUYJLyogUGVyaXBoZXJhbCBEZXZpY2UgVHlwZSBNYXNrICovCisjZGVmaW5lCUlOUURfUERUX1FNQVNLCTB4RTAJLyogUGVyaXBoZXJhbCBEZXZpY2UgUXVhbGlmZXIgTWFzayAqLworCisjZGVmaW5lIE1BWF9GSUJfREFUQSAoc2l6ZW9mKHN0cnVjdCBod19maWIpIC0gc2l6ZW9mKEZJQl9IRUFERVIpKQorCisjZGVmaW5lIE1BWF9EUklWRVJfU0dfU0VHTUVOVF9DT1VOVCAxNworCisvKgorICoJU2Vuc2UgY29kZXMKKyAqLworIAorI2RlZmluZSBTRU5DT0RFX05PX1NFTlNFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBTRU5DT0RFX0VORF9PRl9EQVRBICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBTRU5DT0RFX0JFQ09NSU5HX1JFQURZICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBTRU5DT0RFX0lOSVRfQ01EX1JFUVVJUkVEICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBTRU5DT0RFX1BBUkFNX0xJU1RfTEVOR1RIX0VSUk9SICAgICAgICAgMHgxQQorI2RlZmluZSBTRU5DT0RFX0lOVkFMSURfQ09NTUFORCAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBTRU5DT0RFX0xCQV9PVVRfT0ZfUkFOR0UgICAgICAgICAgICAgICAgMHgyMQorI2RlZmluZSBTRU5DT0RFX0lOVkFMSURfQ0RCX0ZJRUxEICAgICAgICAgICAgICAgMHgyNAorI2RlZmluZSBTRU5DT0RFX0xVTl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgMHgyNQorI2RlZmluZSBTRU5DT0RFX0lOVkFMSURfUEFSQU1fRklFTEQgICAgICAgICAgICAgMHgyNgorI2RlZmluZSBTRU5DT0RFX1BBUkFNX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgMHgyNgorI2RlZmluZSBTRU5DT0RFX1BBUkFNX1ZBTFVFX0lOVkFMSUQgICAgICAgICAgICAgMHgyNgorI2RlZmluZSBTRU5DT0RFX1JFU0VUX09DQ1VSUkVEICAgICAgICAgICAgICAgICAgMHgyOQorI2RlZmluZSBTRU5DT0RFX0xVTl9OT1RfU0VMRl9DT05GSUdVUkVEX1lFVCAgICAgMHgzRQorI2RlZmluZSBTRU5DT0RFX0lOUVVJUllfREFUQV9DSEFOR0VEICAgICAgICAgICAgMHgzRgorI2RlZmluZSBTRU5DT0RFX1NBVklOR19QQVJBTVNfTk9UX1NVUFBPUlRFRCAgICAgMHgzOQorI2RlZmluZSBTRU5DT0RFX0RJQUdOT1NUSUNfRkFJTFVSRSAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBTRU5DT0RFX0lOVEVSTkFMX1RBUkdFVF9GQUlMVVJFICAgICAgICAgMHg0NAorI2RlZmluZSBTRU5DT0RFX0lOVkFMSURfTUVTU0FHRV9FUlJPUiAgICAgICAgICAgMHg0OQorI2RlZmluZSBTRU5DT0RFX0xVTl9GQUlMRURfU0VMRl9DT05GSUcgICAgICAgICAgMHg0YworI2RlZmluZSBTRU5DT0RFX09WRVJMQVBQRURfQ09NTUFORCAgICAgICAgICAgICAgMHg0RQorCisvKgorICoJQWRkaXRpb25hbCBzZW5zZSBjb2RlcworICovCisgCisjZGVmaW5lIEFTRU5DT0RFX05PX1NFTlNFICAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0VORF9PRl9EQVRBICAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIEFTRU5DT0RFX0JFQ09NSU5HX1JFQURZICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEFTRU5DT0RFX0lOSVRfQ01EX1JFUVVJUkVEICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEFTRU5DT0RFX1BBUkFNX0xJU1RfTEVOR1RIX0VSUk9SICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0lOVkFMSURfQ09NTUFORCAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0xCQV9PVVRfT0ZfUkFOR0UgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0lOVkFMSURfQ0RCX0ZJRUxEICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0xVTl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0lOVkFMSURfUEFSQU1fRklFTEQgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX1BBUkFNX05PVF9TVVBQT1JURUQgICAgICAgICAgICAweDAxCisjZGVmaW5lIEFTRU5DT0RFX1BBUkFNX1ZBTFVFX0lOVkFMSUQgICAgICAgICAgICAweDAyCisjZGVmaW5lIEFTRU5DT0RFX1JFU0VUX09DQ1VSUkVEICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0xVTl9OT1RfU0VMRl9DT05GSUdVUkVEX1lFVCAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0lOUVVJUllfREFUQV9DSEFOR0VEICAgICAgICAgICAweDAzCisjZGVmaW5lIEFTRU5DT0RFX1NBVklOR19QQVJBTVNfTk9UX1NVUFBPUlRFRCAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0RJQUdOT1NUSUNfRkFJTFVSRSAgICAgICAgICAgICAweDgwCisjZGVmaW5lIEFTRU5DT0RFX0lOVEVSTkFMX1RBUkdFVF9GQUlMVVJFICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0lOVkFMSURfTUVTU0FHRV9FUlJPUiAgICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0xVTl9GQUlMRURfU0VMRl9DT05GSUcgICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX09WRVJMQVBQRURfQ09NTUFORCAgICAgICAgICAgICAweDAwCisKKyNkZWZpbmUgQllURTAoeCkgKHVuc2lnbmVkIGNoYXIpKHgpCisjZGVmaW5lIEJZVEUxKHgpICh1bnNpZ25lZCBjaGFyKSgoeCkgPj4gOCkKKyNkZWZpbmUgQllURTIoeCkgKHVuc2lnbmVkIGNoYXIpKCh4KSA+PiAxNikKKyNkZWZpbmUgQllURTMoeCkgKHVuc2lnbmVkIGNoYXIpKCh4KSA+PiAyNCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgICBTIFQgUiBVIEMgVCBTIC8gVCBZIFAgRSBEIEUgRiBTCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogU0NTSSBpbnF1aXJ5IGRhdGEgKi8KK3N0cnVjdCBpbnF1aXJ5X2RhdGEgeworCXU4IGlucWRfcGR0OwkvKiBQZXJpcGhlcmFsIHF1YWxpZmllciB8IFBlcmlwaGVyYWwgRGV2aWNlIFR5cGUgICovCisJdTggaW5xZF9kdHE7CS8qIFJNQiB8IERldmljZSBUeXBlIFF1YWxpZmllciAgKi8KKwl1OCBpbnFkX3ZlcjsJLyogSVNPIHZlcnNpb24gfCBFQ01BIHZlcnNpb24gfCBBTlNJLWFwcHJvdmVkIHZlcnNpb24gKi8KKwl1OCBpbnFkX3JkZjsJLyogQUVOQyB8IFRybUlPUCB8IFJlc3BvbnNlIGRhdGEgZm9ybWF0ICovCisJdTggaW5xZF9sZW47CS8qIEFkZGl0aW9uYWwgbGVuZ3RoIChuLTQpICovCisJdTggaW5xZF9wYWQxWzJdOy8qIFJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCisJdTggaW5xZF9wYWQyOwkvKiBSZWxBZHIgfCBXQnVzMzIgfCBXQnVzMTYgfCAgU3luYyAgfCBMaW5rZWQgfFJlc2VydmVkfCBDbWRRdWUgfCBTZnRSZSAqLworCXU4IGlucWRfdmlkWzhdOwkvKiBWZW5kb3IgSUQgKi8KKwl1OCBpbnFkX3BpZFsxNl07LyogUHJvZHVjdCBJRCAqLworCXU4IGlucWRfcHJsWzRdOwkvKiBQcm9kdWN0IFJldmlzaW9uIExldmVsICovCit9OworCisvKgorICogICAgICAgICAgICAgIE0gTyBEIFUgTCBFICAgRyBMIE8gQiBBIEwgUworICovCisgCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhYWNfYnVpbGRfc2coc3RydWN0IHNjc2lfY21uZCogc2NzaWNtZCwgc3RydWN0IHNnbWFwKiBzZ21hcCk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBhYWNfYnVpbGRfc2c2NChzdHJ1Y3Qgc2NzaV9jbW5kKiBzY3NpY21kLCBzdHJ1Y3Qgc2dtYXA2NCogcHNnKTsKK3N0YXRpYyBpbnQgYWFjX3NlbmRfc3JiX2ZpYihzdHJ1Y3Qgc2NzaV9jbW5kKiBzY3NpY21kKTsKKyNpZmRlZiBBQUNfREVUQUlMRURfU1RBVFVTX0lORk8KK3N0YXRpYyBjaGFyICphYWNfZ2V0X3N0YXR1c19zdHJpbmcodTMyIHN0YXR1cyk7CisjZW5kaWYKKworLyoKKyAqCU5vbiBkYXNkIHNlbGVjdGlvbiBpcyBoYW5kbGVkIGVudGlyZWx5IGluIGFhY2hiYSBub3cKKyAqLwkKKyAKK3N0YXRpYyBpbnQgbm9uZGFzZCA9IC0xOworc3RhdGljIGludCBkYWNtb2RlID0gLTE7CisKK3N0YXRpYyBpbnQgY29tbWl0ID0gLTE7CisKK21vZHVsZV9wYXJhbShub25kYXNkLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub25kYXNkLCAiQ29udHJvbCBzY2FubmluZyBvZiBoYmEgZm9yIG5vbmRhc2QgZGV2aWNlcy4gMD1vZmYsIDE9b24iKTsKK21vZHVsZV9wYXJhbShkYWNtb2RlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkYWNtb2RlLCAiQ29udHJvbCB3aGV0aGVyIGRtYSBhZGRyZXNzaW5nIGlzIHVzaW5nIDY0IGJpdCBEQUMuIDA9b2ZmLCAxPW9uIik7Cittb2R1bGVfcGFyYW0oY29tbWl0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhjb21taXQsICJDb250cm9sIHdoZXRoZXIgYSBDT01NSVRfQ09ORklHIGlzIGlzc3VlZCB0byB0aGUgYWRhcHRlciBmb3IgZm9yZWlnbiBhcnJheXMuXG5UaGlzIGlzIHR5cGljYWxseSBuZWVkZWQgaW4gc3lzdGVtcyB0aGF0IGRvIG5vdCBoYXZlIGEgQklPUy4gMD1vZmYsIDE9b24iKTsKKworLyoqCisgKglhYWNfZ2V0X2NvbmZpZ19zdGF0dXMJLQljaGVjayB0aGUgYWRhcHRlciBjb25maWd1cmF0aW9uCisgKglAY29tbW9uOiBhZGFwdGVyIHRvIHF1ZXJ5CisgKgorICoJUXVlcnkgY29uZmlnIHN0YXR1cywgYW5kIGNvbW1pdCB0aGUgY29uZmlndXJhdGlvbiBpZiBuZWVkZWQuCisgKi8KK2ludCBhYWNfZ2V0X2NvbmZpZ19zdGF0dXMoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZmliICogZmlicHRyOworCisJaWYgKCEoZmlicHRyID0gZmliX2FsbG9jKGRldikpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZpYl9pbml0KGZpYnB0cik7CisJeworCQlzdHJ1Y3QgYWFjX2dldF9jb25maWdfc3RhdHVzICpkaW5mbzsKKwkJZGluZm8gPSAoc3RydWN0IGFhY19nZXRfY29uZmlnX3N0YXR1cyAqKSBmaWJfZGF0YShmaWJwdHIpOworCisJCWRpbmZvLT5jb21tYW5kID0gY3B1X3RvX2xlMzIoVk1fQ29udGFpbmVyQ29uZmlnKTsKKwkJZGluZm8tPnR5cGUgPSBjcHVfdG9fbGUzMihDVF9HRVRfQ09ORklHX1NUQVRVUyk7CisJCWRpbmZvLT5jb3VudCA9IGNwdV90b19sZTMyKHNpemVvZigoKHN0cnVjdCBhYWNfZ2V0X2NvbmZpZ19zdGF0dXNfcmVzcCAqKU5VTEwpLT5kYXRhKSk7CisJfQorCisJc3RhdHVzID0gZmliX3NlbmQoQ29udGFpbmVyQ29tbWFuZCwKKwkJCSAgICBmaWJwdHIsCisJCQkgICAgc2l6ZW9mIChzdHJ1Y3QgYWFjX2dldF9jb25maWdfc3RhdHVzKSwKKwkJCSAgICBGc2FOb3JtYWwsCisJCQkgICAgMSwgMSwKKwkJCSAgICBOVUxMLCBOVUxMKTsKKwlpZiAoc3RhdHVzIDwgMCApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjX2dldF9jb25maWdfc3RhdHVzOiBTZW5kRklCIGZhaWxlZC5cbiIpOworCX0gZWxzZSB7CisJCXN0cnVjdCBhYWNfZ2V0X2NvbmZpZ19zdGF0dXNfcmVzcCAqcmVwbHkKKwkJICA9IChzdHJ1Y3QgYWFjX2dldF9jb25maWdfc3RhdHVzX3Jlc3AgKikgZmliX2RhdGEoZmlicHRyKTsKKwkJZHByaW50aygoS0VSTl9XQVJOSU5HCisJCSAgImFhY19nZXRfY29uZmlnX3N0YXR1czogcmVzcG9uc2U9JWQgc3RhdHVzPSVkIGFjdGlvbj0lZFxuIiwKKwkJICBsZTMyX3RvX2NwdShyZXBseS0+cmVzcG9uc2UpLAorCQkgIGxlMzJfdG9fY3B1KHJlcGx5LT5zdGF0dXMpLAorCQkgIGxlMzJfdG9fY3B1KHJlcGx5LT5kYXRhLmFjdGlvbikpKTsKKwkJaWYgKChsZTMyX3RvX2NwdShyZXBseS0+cmVzcG9uc2UpICE9IFNUX09LKSB8fAorCQkgICAgIChsZTMyX3RvX2NwdShyZXBseS0+c3RhdHVzKSAhPSBDVF9PSykgfHwKKwkJICAgICAobGUzMl90b19jcHUocmVwbHktPmRhdGEuYWN0aW9uKSA+IENGQUNUX1BBVVNFKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjX2dldF9jb25maWdfc3RhdHVzOiBXaWxsIG5vdCBpc3N1ZSB0aGUgQ29tbWl0IENvbmZpZ3VyYXRpb25cbiIpOworCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJfQorCX0KKwlmaWJfY29tcGxldGUoZmlicHRyKTsKKwkvKiBTZW5kIGEgQ1RfQ09NTUlUX0NPTkZJRyB0byBlbmFibGUgZGlzY292ZXJ5IG9mIGRldmljZXMgKi8KKwlpZiAoc3RhdHVzID49IDApIHsKKwkJaWYgKGNvbW1pdCA9PSAxKSB7CisJCQlzdHJ1Y3QgYWFjX2NvbW1pdF9jb25maWcgKiBkaW5mbzsKKwkJCWZpYl9pbml0KGZpYnB0cik7CisJCQlkaW5mbyA9IChzdHJ1Y3QgYWFjX2NvbW1pdF9jb25maWcgKikgZmliX2RhdGEoZmlicHRyKTsKKwkKKwkJCWRpbmZvLT5jb21tYW5kID0gY3B1X3RvX2xlMzIoVk1fQ29udGFpbmVyQ29uZmlnKTsKKwkJCWRpbmZvLT50eXBlID0gY3B1X3RvX2xlMzIoQ1RfQ09NTUlUX0NPTkZJRyk7CisJCisJCQlzdGF0dXMgPSBmaWJfc2VuZChDb250YWluZXJDb21tYW5kLAorCQkJCSAgICBmaWJwdHIsCisJCQkJICAgIHNpemVvZiAoc3RydWN0IGFhY19jb21taXRfY29uZmlnKSwKKwkJCQkgICAgRnNhTm9ybWFsLAorCQkJCSAgICAxLCAxLAorCQkJCSAgICBOVUxMLCBOVUxMKTsKKwkJCWZpYl9jb21wbGV0ZShmaWJwdHIpOworCQl9IGVsc2UgaWYgKGNvbW1pdCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICJhYWNfZ2V0X2NvbmZpZ19zdGF0dXM6IEZvcmVpZ24gZGV2aWNlIGNvbmZpZ3VyYXRpb25zIGFyZSBiZWluZyBpZ25vcmVkXG4iKTsKKwkJfQorCX0KKwlmaWJfZnJlZShmaWJwdHIpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICoJYWFjX2dldF9jb250YWluZXJzCS0JbGlzdCBjb250YWluZXJzCisgKglAY29tbW9uOiBhZGFwdGVyIHRvIHByb2JlCisgKgorICoJTWFrZSBhIGxpc3Qgb2YgYWxsIGNvbnRhaW5lcnMgb24gdGhpcyBjb250cm9sbGVyCisgKi8KK2ludCBhYWNfZ2V0X2NvbnRhaW5lcnMoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwlzdHJ1Y3QgZnNhX2Rldl9pbmZvICpmc2FfZGV2X3B0cjsKKwl1MzIgaW5kZXg7IAorCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBmaWIgKiBmaWJwdHI7CisJdW5zaWduZWQgaW5zdGFuY2U7CisJc3RydWN0IGFhY19nZXRfY29udGFpbmVyX2NvdW50ICpkaW5mbzsKKwlzdHJ1Y3QgYWFjX2dldF9jb250YWluZXJfY291bnRfcmVzcCAqZHJlc3A7CisJaW50IG1heGltdW1fbnVtX2NvbnRhaW5lcnMgPSBNQVhJTVVNX05VTV9DT05UQUlORVJTOworCisJaW5zdGFuY2UgPSBkZXYtPnNjc2lfaG9zdF9wdHItPnVuaXF1ZV9pZDsKKworCWlmICghKGZpYnB0ciA9IGZpYl9hbGxvYyhkZXYpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmaWJfaW5pdChmaWJwdHIpOworCWRpbmZvID0gKHN0cnVjdCBhYWNfZ2V0X2NvbnRhaW5lcl9jb3VudCAqKSBmaWJfZGF0YShmaWJwdHIpOworCWRpbmZvLT5jb21tYW5kID0gY3B1X3RvX2xlMzIoVk1fQ29udGFpbmVyQ29uZmlnKTsKKwlkaW5mby0+dHlwZSA9IGNwdV90b19sZTMyKENUX0dFVF9DT05UQUlORVJfQ09VTlQpOworCisJc3RhdHVzID0gZmliX3NlbmQoQ29udGFpbmVyQ29tbWFuZCwKKwkJICAgIGZpYnB0ciwKKwkJICAgIHNpemVvZiAoc3RydWN0IGFhY19nZXRfY29udGFpbmVyX2NvdW50KSwKKwkJICAgIEZzYU5vcm1hbCwKKwkJICAgIDEsIDEsCisJCSAgICBOVUxMLCBOVUxMKTsKKwlpZiAoc3RhdHVzID49IDApIHsKKwkJZHJlc3AgPSAoc3RydWN0IGFhY19nZXRfY29udGFpbmVyX2NvdW50X3Jlc3AgKilmaWJfZGF0YShmaWJwdHIpOworCQltYXhpbXVtX251bV9jb250YWluZXJzID0gbGUzMl90b19jcHUoZHJlc3AtPkNvbnRhaW5lclN3aXRjaEVudHJpZXMpOworCQlmaWJfY29tcGxldGUoZmlicHRyKTsKKwl9CisKKwlpZiAobWF4aW11bV9udW1fY29udGFpbmVycyA8IE1BWElNVU1fTlVNX0NPTlRBSU5FUlMpCisJCW1heGltdW1fbnVtX2NvbnRhaW5lcnMgPSBNQVhJTVVNX05VTV9DT05UQUlORVJTOworCisJZnNhX2Rldl9wdHIgPSAoc3RydWN0IGZzYV9kZXZfaW5mbyAqKSBrbWFsbG9jKAorCSAgc2l6ZW9mKCpmc2FfZGV2X3B0cikgKiBtYXhpbXVtX251bV9jb250YWluZXJzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZzYV9kZXZfcHRyKSB7CisJCWZpYl9mcmVlKGZpYnB0cik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoZnNhX2Rldl9wdHIsIDAsIHNpemVvZigqZnNhX2Rldl9wdHIpICogbWF4aW11bV9udW1fY29udGFpbmVycyk7CisKKwlkZXYtPmZzYV9kZXYgPSBmc2FfZGV2X3B0cjsKKwlkZXYtPm1heGltdW1fbnVtX2NvbnRhaW5lcnMgPSBtYXhpbXVtX251bV9jb250YWluZXJzOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgZGV2LT5tYXhpbXVtX251bV9jb250YWluZXJzOyBpbmRleCsrKSB7CisJCXN0cnVjdCBhYWNfcXVlcnlfbW91bnQgKmRpbmZvOworCQlzdHJ1Y3QgYWFjX21vdW50ICpkcmVzcDsKKworCQlmc2FfZGV2X3B0cltpbmRleF0uZGV2bmFtZVswXSA9ICdcMCc7CisKKwkJZmliX2luaXQoZmlicHRyKTsKKwkJZGluZm8gPSAoc3RydWN0IGFhY19xdWVyeV9tb3VudCAqKSBmaWJfZGF0YShmaWJwdHIpOworCisJCWRpbmZvLT5jb21tYW5kID0gY3B1X3RvX2xlMzIoVk1fTmFtZVNlcnZlKTsKKwkJZGluZm8tPmNvdW50ID0gY3B1X3RvX2xlMzIoaW5kZXgpOworCQlkaW5mby0+dHlwZSA9IGNwdV90b19sZTMyKEZUX0ZJTEVTWVMpOworCisJCXN0YXR1cyA9IGZpYl9zZW5kKENvbnRhaW5lckNvbW1hbmQsCisJCQkJICAgIGZpYnB0ciwKKwkJCQkgICAgc2l6ZW9mIChzdHJ1Y3QgYWFjX3F1ZXJ5X21vdW50KSwKKwkJCQkgICAgRnNhTm9ybWFsLAorCQkJCSAgICAxLCAxLAorCQkJCSAgICBOVUxMLCBOVUxMKTsKKwkJaWYgKHN0YXR1cyA8IDAgKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhYWNfZ2V0X2NvbnRhaW5lcnM6IFNlbmRGSUIgZmFpbGVkLlxuIik7CisJCQlicmVhazsKKwkJfQorCQlkcmVzcCA9IChzdHJ1Y3QgYWFjX21vdW50ICopZmliX2RhdGEoZmlicHRyKTsKKworCQlkcHJpbnRrICgoS0VSTl9ERUJVRworCQkgICJWTV9OYW1lU2VydmUgY2lkPSVkIHN0YXR1cz0lZCB2b2w9JWQgc3RhdGU9JWQgY2FwPSV1XG4iLAorCQkgIChpbnQpaW5kZXgsIChpbnQpbGUzMl90b19jcHUoZHJlc3AtPnN0YXR1cyksCisJCSAgKGludClsZTMyX3RvX2NwdShkcmVzcC0+bW50WzBdLnZvbCksCisJCSAgKGludClsZTMyX3RvX2NwdShkcmVzcC0+bW50WzBdLnN0YXRlKSwKKwkJICAodW5zaWduZWQpbGUzMl90b19jcHUoZHJlc3AtPm1udFswXS5jYXBhY2l0eSkpKTsKKwkJaWYgKChsZTMyX3RvX2NwdShkcmVzcC0+c3RhdHVzKSA9PSBTVF9PSykgJiYKKwkJICAgIChsZTMyX3RvX2NwdShkcmVzcC0+bW50WzBdLnZvbCkgIT0gQ1RfTk9ORSkgJiYKKwkJICAgIChsZTMyX3RvX2NwdShkcmVzcC0+bW50WzBdLnN0YXRlKSAhPSBGU0NTX0hJRERFTikpIHsKKwkJCWZzYV9kZXZfcHRyW2luZGV4XS52YWxpZCA9IDE7CisJCQlmc2FfZGV2X3B0cltpbmRleF0udHlwZSA9IGxlMzJfdG9fY3B1KGRyZXNwLT5tbnRbMF0udm9sKTsKKwkJCWZzYV9kZXZfcHRyW2luZGV4XS5zaXplID0gbGUzMl90b19jcHUoZHJlc3AtPm1udFswXS5jYXBhY2l0eSk7CisJCQlpZiAobGUzMl90b19jcHUoZHJlc3AtPm1udFswXS5zdGF0ZSkgJiBGU0NTX1JFQURPTkxZKQorCQkJCSAgICBmc2FfZGV2X3B0cltpbmRleF0ucm8gPSAxOworCQl9CisJCWZpYl9jb21wbGV0ZShmaWJwdHIpOworCQkvKgorCQkgKglJZiB0aGVyZSBhcmUgbm8gbW9yZSBjb250YWluZXJzLCB0aGVuIHN0b3AgYXNraW5nLgorCQkgKi8KKwkJaWYgKChpbmRleCArIDEpID49IGxlMzJfdG9fY3B1KGRyZXNwLT5jb3VudCkpeworCQkJYnJlYWs7CisJCX0KKwl9CisJZmliX2ZyZWUoZmlicHRyKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBhYWNfaW9fZG9uZShzdHJ1Y3Qgc2NzaV9jbW5kICogc2NzaWNtZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gc2NzaWNtZC0+ZGV2aWNlLT5ob3N0OworCXNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgY3B1X2ZsYWdzKTsKKwlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGNwdV9mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9jb250YWluZXJfbmFtZV9jYWxsYmFjayh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZmliICogZmlicHRyKQoreworCXN0cnVjdCBhYWNfZ2V0X25hbWVfcmVzcCAqIGdldF9uYW1lX3JlcGx5OworCXN0cnVjdCBzY3NpX2NtbmQgKiBzY3NpY21kOworCisJc2NzaWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNvbnRleHQ7CisKKwlkcHJpbnRrKChLRVJOX0RFQlVHICJnZXRfY29udGFpbmVyX25hbWVfY2FsbGJhY2tbY3B1ICVkXTogdCA9ICVsZC5cbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgamlmZmllcykpOworCWlmIChmaWJwdHIgPT0gTlVMTCkKKwkJQlVHKCk7CisKKwlnZXRfbmFtZV9yZXBseSA9IChzdHJ1Y3QgYWFjX2dldF9uYW1lX3Jlc3AgKikgZmliX2RhdGEoZmlicHRyKTsKKwkvKiBGYWlsdXJlIGlzIGlycmVsZXZhbnQsIHVzaW5nIGRlZmF1bHQgdmFsdWUgaW5zdGVhZCAqLworCWlmICgobGUzMl90b19jcHUoZ2V0X25hbWVfcmVwbHktPnN0YXR1cykgPT0gQ1RfT0spCisJICYmIChnZXRfbmFtZV9yZXBseS0+ZGF0YVswXSAhPSAnXDAnKSkgeworCQlpbnQgICAgY291bnQ7CisJCWNoYXIgKiBkcDsKKwkJY2hhciAqIHNwID0gZ2V0X25hbWVfcmVwbHktPmRhdGE7CisJCXNwW3NpemVvZigoKHN0cnVjdCBhYWNfZ2V0X25hbWVfcmVzcCAqKU5VTEwpLT5kYXRhKS0xXSA9ICdcMCc7CisJCXdoaWxlICgqc3AgPT0gJyAnKQorCQkJKytzcDsKKwkJY291bnQgPSBzaXplb2YoKChzdHJ1Y3QgaW5xdWlyeV9kYXRhICopTlVMTCktPmlucWRfcGlkKTsKKwkJZHAgPSAoKHN0cnVjdCBpbnF1aXJ5X2RhdGEgKilzY3NpY21kLT5yZXF1ZXN0X2J1ZmZlciktPmlucWRfcGlkOworCQlpZiAoKnNwKSBkbyB7CisJCQkqZHArKyA9ICgqc3ApID8gKnNwKysgOiAnICc7CisJCX0gd2hpbGUgKC0tY291bnQgPiAwKTsKKwl9CisJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfR09PRDsKKworCWZpYl9jb21wbGV0ZShmaWJwdHIpOworCWZpYl9mcmVlKGZpYnB0cik7CisJYWFjX2lvX2RvbmUoc2NzaWNtZCk7Cit9CisKKy8qKgorICoJYWFjX2dldF9jb250YWluZXJfbmFtZQktCWdldCBjb250YWluZXIgbmFtZSwgbm9uZSBibG9ja2luZy4KKyAqLworc3RhdGljIGludCBhYWNfZ2V0X2NvbnRhaW5lcl9uYW1lKHN0cnVjdCBzY3NpX2NtbmQgKiBzY3NpY21kLCBpbnQgY2lkKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IGFhY19nZXRfbmFtZSAqZGluZm87CisJc3RydWN0IGZpYiAqIGNtZF9maWJjb250ZXh0OworCXN0cnVjdCBhYWNfZGV2ICogZGV2OworCisJZGV2ID0gKHN0cnVjdCBhYWNfZGV2ICopc2NzaWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCWlmICghKGNtZF9maWJjb250ZXh0ID0gZmliX2FsbG9jKGRldikpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZpYl9pbml0KGNtZF9maWJjb250ZXh0KTsKKwlkaW5mbyA9IChzdHJ1Y3QgYWFjX2dldF9uYW1lICopIGZpYl9kYXRhKGNtZF9maWJjb250ZXh0KTsKKworCWRpbmZvLT5jb21tYW5kID0gY3B1X3RvX2xlMzIoVk1fQ29udGFpbmVyQ29uZmlnKTsKKwlkaW5mby0+dHlwZSA9IGNwdV90b19sZTMyKENUX1JFQURfTkFNRSk7CisJZGluZm8tPmNpZCA9IGNwdV90b19sZTMyKGNpZCk7CisJZGluZm8tPmNvdW50ID0gY3B1X3RvX2xlMzIoc2l6ZW9mKCgoc3RydWN0IGFhY19nZXRfbmFtZV9yZXNwICopTlVMTCktPmRhdGEpKTsKKworCXN0YXR1cyA9IGZpYl9zZW5kKENvbnRhaW5lckNvbW1hbmQsIAorCQkgIGNtZF9maWJjb250ZXh0LCAKKwkJICBzaXplb2YgKHN0cnVjdCBhYWNfZ2V0X25hbWUpLAorCQkgIEZzYU5vcm1hbCwgCisJCSAgMCwgMSwgCisJCSAgKGZpYl9jYWxsYmFjaykgZ2V0X2NvbnRhaW5lcl9uYW1lX2NhbGxiYWNrLCAKKwkJICAodm9pZCAqKSBzY3NpY21kKTsKKwkKKwkvKgorCSAqCUNoZWNrIHRoYXQgdGhlIGNvbW1hbmQgcXVldWVkIHRvIHRoZSBjb250cm9sbGVyCisJICovCisJaWYgKHN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIAorCQlyZXR1cm4gMDsKKwkJCisJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjX2dldF9jb250YWluZXJfbmFtZTogZmliX3NlbmQgZmFpbGVkIHdpdGggc3RhdHVzOiAlZC5cbiIsIHN0YXR1cyk7CisJZmliX2NvbXBsZXRlKGNtZF9maWJjb250ZXh0KTsKKwlmaWJfZnJlZShjbWRfZmliY29udGV4dCk7CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqCXByb2JlX2NvbnRhaW5lcgkJLQlxdWVyeSBhIGxvZ2ljYWwgdm9sdW1lCisgKglAZGV2OiBkZXZpY2UgdG8gcXVlcnkKKyAqCUBjaWQ6IGNvbnRhaW5lciBpZGVudGlmaWVyCisgKgorICoJUXVlcmllcyB0aGUgY29udHJvbGxlciBhYm91dCB0aGUgZ2l2ZW4gdm9sdW1lLiBUaGUgdm9sdW1lIGluZm9ybWF0aW9uCisgKglpcyB1cGRhdGVkIGluIHRoZSBzdHJ1Y3QgZnNhX2Rldl9pbmZvIHN0cnVjdHVyZSByYXRoZXIgdGhhbiByZXR1cm5lZC4KKyAqLworIAorc3RhdGljIGludCBwcm9iZV9jb250YWluZXIoc3RydWN0IGFhY19kZXYgKmRldiwgaW50IGNpZCkKK3sKKwlzdHJ1Y3QgZnNhX2Rldl9pbmZvICpmc2FfZGV2X3B0cjsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBhYWNfcXVlcnlfbW91bnQgKmRpbmZvOworCXN0cnVjdCBhYWNfbW91bnQgKmRyZXNwOworCXN0cnVjdCBmaWIgKiBmaWJwdHI7CisJdW5zaWduZWQgaW5zdGFuY2U7CisKKwlmc2FfZGV2X3B0ciA9IGRldi0+ZnNhX2RldjsKKwlpbnN0YW5jZSA9IGRldi0+c2NzaV9ob3N0X3B0ci0+dW5pcXVlX2lkOworCisJaWYgKCEoZmlicHRyID0gZmliX2FsbG9jKGRldikpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZpYl9pbml0KGZpYnB0cik7CisKKwlkaW5mbyA9IChzdHJ1Y3QgYWFjX3F1ZXJ5X21vdW50ICopZmliX2RhdGEoZmlicHRyKTsKKworCWRpbmZvLT5jb21tYW5kID0gY3B1X3RvX2xlMzIoVk1fTmFtZVNlcnZlKTsKKwlkaW5mby0+Y291bnQgPSBjcHVfdG9fbGUzMihjaWQpOworCWRpbmZvLT50eXBlID0gY3B1X3RvX2xlMzIoRlRfRklMRVNZUyk7CisKKwlzdGF0dXMgPSBmaWJfc2VuZChDb250YWluZXJDb21tYW5kLAorCQkJICAgIGZpYnB0ciwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGFhY19xdWVyeV9tb3VudCksCisJCQkgICAgRnNhTm9ybWFsLAorCQkJICAgIDEsIDEsCisJCQkgICAgTlVMTCwgTlVMTCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjcmFpZDogcHJvYmVfY29udGFpbmVycyBxdWVyeSBmYWlsZWQuXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkcmVzcCA9IChzdHJ1Y3QgYWFjX21vdW50ICopIGZpYl9kYXRhKGZpYnB0cik7CisKKwlpZiAoKGxlMzJfdG9fY3B1KGRyZXNwLT5zdGF0dXMpID09IFNUX09LKSAmJgorCSAgICAobGUzMl90b19jcHUoZHJlc3AtPm1udFswXS52b2wpICE9IENUX05PTkUpICYmCisJICAgIChsZTMyX3RvX2NwdShkcmVzcC0+bW50WzBdLnN0YXRlKSAhPSBGU0NTX0hJRERFTikpIHsKKwkJZnNhX2Rldl9wdHJbY2lkXS52YWxpZCA9IDE7CisJCWZzYV9kZXZfcHRyW2NpZF0udHlwZSA9IGxlMzJfdG9fY3B1KGRyZXNwLT5tbnRbMF0udm9sKTsKKwkJZnNhX2Rldl9wdHJbY2lkXS5zaXplID0gbGUzMl90b19jcHUoZHJlc3AtPm1udFswXS5jYXBhY2l0eSk7CisJCWlmIChsZTMyX3RvX2NwdShkcmVzcC0+bW50WzBdLnN0YXRlKSAmIEZTQ1NfUkVBRE9OTFkpCisJCQlmc2FfZGV2X3B0cltjaWRdLnJvID0gMTsKKwl9CisKK2Vycm9yOgorCWZpYl9jb21wbGV0ZShmaWJwdHIpOworCWZpYl9mcmVlKGZpYnB0cik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBMb2NhbCBTdHJ1Y3R1cmUgdG8gc2V0IFNDU0kgaW5xdWlyeSBkYXRhIHN0cmluZ3MgKi8KK3N0cnVjdCBzY3NpX2lucSB7CisJY2hhciB2aWRbOF07ICAgICAgICAgLyogVmVuZG9yIElEICovCisJY2hhciBwaWRbMTZdOyAgICAgICAgLyogUHJvZHVjdCBJRCAqLworCWNoYXIgcHJsWzRdOyAgICAgICAgIC8qIFByb2R1Y3QgUmV2aXNpb24gTGV2ZWwgKi8KK307CisKKy8qKgorICoJSW5xU3RyQ29weQktCXN0cmluZyBtZXJnZQorICoJQGE6CXN0cmluZyB0byBjb3B5IGZyb20KKyAqCUBiOglzdHJpbmcgdG8gY29weSB0bworICoKKyAqIAlDb3B5IGEgU3RyaW5nIGZyb20gb25lIGxvY2F0aW9uIHRvIGFub3RoZXIKKyAqCXdpdGhvdXQgY29weWluZyBcMAorICovCisKK3N0YXRpYyB2b2lkIGlucXN0cmNweShjaGFyICphLCBjaGFyICpiKQoreworCisJd2hpbGUoKmEgIT0gKGNoYXIpMCkgCisJCSpiKysgPSAqYSsrOworfQorCitzdGF0aWMgY2hhciAqY29udGFpbmVyX3R5cGVzW10gPSB7CisgICAgICAgICJOb25lIiwKKyAgICAgICAgIlZvbHVtZSIsCisgICAgICAgICJNaXJyb3IiLAorICAgICAgICAiU3RyaXBlIiwKKyAgICAgICAgIlJBSUQ1IiwKKyAgICAgICAgIlNTUlciLAorICAgICAgICAiU1NSTyIsCisgICAgICAgICJNb3JwaCIsCisgICAgICAgICJMZWdhY3kiLAorICAgICAgICAiUkFJRDQiLAorICAgICAgICAiUkFJRDEwIiwgICAgICAgICAgICAgCisgICAgICAgICJSQUlEMDAiLCAgICAgICAgICAgICAKKyAgICAgICAgIlYtTUlSUk9SUyIsICAgICAgICAgIAorICAgICAgICAiUFNFVURPIFI0IiwgICAgICAgICAgCisJIlJBSUQ1MCIsCisgICAgICAgICJVbmtub3duIgorfTsKKworCisKKy8qIEZ1bmN0aW9uOiBzZXRpbnFzdHIKKyAqCisgKiBBcmd1bWVudHM6IFsxXSBwb2ludGVyIHRvIHZvaWQgWzFdIGludAorICoKKyAqIFB1cnBvc2U6IFNldHMgU0NTSSBpbnF1aXJ5IGRhdGEgc3RyaW5ncyBmb3IgdmVuZG9yLCBwcm9kdWN0CisgKiBhbmQgcmV2aXNpb24gbGV2ZWwuIEFsbG93cyBzdHJpbmdzIHRvIGJlIHNldCBpbiBwbGF0Zm9ybSBkZXBlbmRhbnQKKyAqIGZpbGVzIGluc3RlYWQgb2YgaW4gT1MgZGVwZW5kYW50IGRyaXZlciBzb3VyY2UuCisgKi8KKworc3RhdGljIHZvaWQgc2V0aW5xc3RyKGludCBkZXZ0eXBlLCB2b2lkICpkYXRhLCBpbnQgdGluZGV4KQoreworCXN0cnVjdCBzY3NpX2lucSAqc3RyOworCXN0cnVjdCBhYWNfZHJpdmVyX2lkZW50ICptcDsKKworCW1wID0gYWFjX2dldF9kcml2ZXJfaWRlbnQoZGV2dHlwZSk7CisgICAKKwlzdHIgPSAoc3RydWN0IHNjc2lfaW5xICopKGRhdGEpOyAvKiBjYXN0IGRhdGEgdG8gc2NzaSBpbnEgYmxvY2sgKi8KKworCWlucXN0cmNweSAobXAtPnZuYW1lLCBzdHItPnZpZCk7IAorCWlucXN0cmNweSAobXAtPm1vZGVsLCBzdHItPnBpZCk7IC8qIGxhc3Qgc2l4IGNoYXJzIHJlc2VydmVkIGZvciB2b2wgdHlwZSAqLworCisJaWYgKHRpbmRleCA8IChzaXplb2YoY29udGFpbmVyX3R5cGVzKS9zaXplb2YoY2hhciAqKSkpeworCQljaGFyICpmaW5kaXQgPSBzdHItPnBpZDsKKworCQlmb3IgKCA7ICpmaW5kaXQgIT0gJyAnOyBmaW5kaXQrKyk7IC8qIHdhbGsgdGlsbCB3ZSBmaW5kIGEgc3BhY2UgKi8KKwkJLyogUkFJRCBpcyBzdXBlcmZsdW91cyBpbiB0aGUgY29udGV4dCBvZiBhIFJBSUQgZGV2aWNlICovCisJCWlmIChtZW1jbXAoZmluZGl0LTQsICJSQUlEIiwgNCkgPT0gMCkKKwkJCSooZmluZGl0IC09IDQpID0gJyAnOworCQlpbnFzdHJjcHkgKGNvbnRhaW5lcl90eXBlc1t0aW5kZXhdLCBmaW5kaXQgKyAxKTsKKwl9CisJaW5xc3RyY3B5ICgiVjEuMCIsIHN0ci0+cHJsKTsKK30KKwordm9pZCBzZXRfc2Vuc2UodTggKnNlbnNlX2J1ZiwgdTggc2Vuc2Vfa2V5LCB1OCBzZW5zZV9jb2RlLAorCQkgICAgdTggYV9zZW5zZV9jb2RlLCB1OCBpbmNvcnJlY3RfbGVuZ3RoLAorCQkgICAgdTggYml0X3BvaW50ZXIsIHUxNiBmaWVsZF9wb2ludGVyLAorCQkgICAgdTMyIHJlc2lkdWUpCit7CisJc2Vuc2VfYnVmWzBdID0gMHhGMDsJLyogU2Vuc2UgZGF0YSB2YWxpZCwgZXJyIGNvZGUgNzBoIChjdXJyZW50IGVycm9yKSAqLworCXNlbnNlX2J1ZlsxXSA9IDA7CS8qIFNlZ21lbnQgbnVtYmVyLCBhbHdheXMgemVybyAqLworCisJaWYgKGluY29ycmVjdF9sZW5ndGgpIHsKKwkJc2Vuc2VfYnVmWzJdID0gc2Vuc2Vfa2V5IHwgMHgyMDsvKiBTZXQgSUxJIGJpdCB8IHNlbnNlIGtleSAqLworCQlzZW5zZV9idWZbM10gPSBCWVRFMyhyZXNpZHVlKTsKKwkJc2Vuc2VfYnVmWzRdID0gQllURTIocmVzaWR1ZSk7CisJCXNlbnNlX2J1Zls1XSA9IEJZVEUxKHJlc2lkdWUpOworCQlzZW5zZV9idWZbNl0gPSBCWVRFMChyZXNpZHVlKTsKKwl9IGVsc2UKKwkJc2Vuc2VfYnVmWzJdID0gc2Vuc2Vfa2V5OwkvKiBTZW5zZSBrZXkgKi8KKworCWlmIChzZW5zZV9rZXkgPT0gSUxMRUdBTF9SRVFVRVNUKQorCQlzZW5zZV9idWZbN10gPSAxMDsJLyogQWRkaXRpb25hbCBzZW5zZSBsZW5ndGggKi8KKwllbHNlCisJCXNlbnNlX2J1Zls3XSA9IDY7CS8qIEFkZGl0aW9uYWwgc2Vuc2UgbGVuZ3RoICovCisKKwlzZW5zZV9idWZbMTJdID0gc2Vuc2VfY29kZTsJLyogQWRkaXRpb25hbCBzZW5zZSBjb2RlICovCisJc2Vuc2VfYnVmWzEzXSA9IGFfc2Vuc2VfY29kZTsJLyogQWRkaXRpb25hbCBzZW5zZSBjb2RlIHF1YWxpZmllciAqLworCWlmIChzZW5zZV9rZXkgPT0gSUxMRUdBTF9SRVFVRVNUKSB7CisJCXNlbnNlX2J1ZlsxNV0gPSAwOworCisJCWlmIChzZW5zZV9jb2RlID09IFNFTkNPREVfSU5WQUxJRF9QQVJBTV9GSUVMRCkKKwkJCXNlbnNlX2J1ZlsxNV0gPSAweDgwOy8qIFN0ZCBzZW5zZSBrZXkgc3BlY2lmaWMgZmllbGQgKi8KKwkJLyogSWxsZWdhbCBwYXJhbWV0ZXIgaXMgaW4gdGhlIHBhcmFtZXRlciBibG9jayAqLworCisJCWlmIChzZW5zZV9jb2RlID09IFNFTkNPREVfSU5WQUxJRF9DREJfRklFTEQpCisJCQlzZW5zZV9idWZbMTVdID0gMHhjMDsvKiBTdGQgc2Vuc2Uga2V5IHNwZWNpZmljIGZpZWxkICovCisJCS8qIElsbGVnYWwgcGFyYW1ldGVyIGlzIGluIHRoZSBDREIgYmxvY2sgKi8KKwkJc2Vuc2VfYnVmWzE1XSB8PSBiaXRfcG9pbnRlcjsKKwkJc2Vuc2VfYnVmWzE2XSA9IGZpZWxkX3BvaW50ZXIgPj4gODsJLyogTVNCICovCisJCXNlbnNlX2J1ZlsxN10gPSBmaWVsZF9wb2ludGVyOwkJLyogTFNCICovCisJfQorfQorCitpbnQgYWFjX2dldF9hZGFwdGVyX2luZm8oc3RydWN0IGFhY19kZXYqIGRldikKK3sKKwlzdHJ1Y3QgZmliKiBmaWJwdHI7CisJc3RydWN0IGFhY19hZGFwdGVyX2luZm8qIGluZm87CisJaW50IHJjb2RlOworCXUzMiB0bXA7CisJaWYgKCEoZmlicHRyID0gZmliX2FsbG9jKGRldikpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZpYl9pbml0KGZpYnB0cik7CisJaW5mbyA9IChzdHJ1Y3QgYWFjX2FkYXB0ZXJfaW5mbyopIGZpYl9kYXRhKGZpYnB0cik7CisKKwltZW1zZXQoaW5mbywwLHNpemVvZihzdHJ1Y3QgYWFjX2FkYXB0ZXJfaW5mbykpOworCisJcmNvZGUgPSBmaWJfc2VuZChSZXF1ZXN0QWRhcHRlckluZm8sCisJCQlmaWJwdHIsIAorCQkJc2l6ZW9mKHN0cnVjdCBhYWNfYWRhcHRlcl9pbmZvKSwKKwkJCUZzYU5vcm1hbCwgCisJCQkxLCAxLCAKKwkJCU5VTEwsIAorCQkJTlVMTCk7CisKKwltZW1jcHkoJmRldi0+YWRhcHRlcl9pbmZvLCBpbmZvLCBzaXplb2Yoc3RydWN0IGFhY19hZGFwdGVyX2luZm8pKTsKKworCXRtcCA9IGxlMzJfdG9fY3B1KGRldi0+YWRhcHRlcl9pbmZvLmtlcm5lbHJldik7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMlZDoga2VybmVsICVkLiVkLSVkWyVkXVxuIiwgCisJCQlkZXYtPm5hbWUsIAorCQkJZGV2LT5pZCwKKwkJCXRtcD4+MjQsCisJCQkodG1wPj4xNikmMHhmZiwKKwkJCXRtcCYweGZmLAorCQkJbGUzMl90b19jcHUoZGV2LT5hZGFwdGVyX2luZm8ua2VybmVsYnVpbGQpKTsKKwl0bXAgPSBsZTMyX3RvX2NwdShkZXYtPmFkYXB0ZXJfaW5mby5tb25pdG9ycmV2KTsKKwlwcmludGsoS0VSTl9JTkZPICIlcyVkOiBtb25pdG9yICVkLiVkLSVkWyVkXVxuIiwgCisJCQlkZXYtPm5hbWUsIGRldi0+aWQsCisJCQl0bXA+PjI0LCh0bXA+PjE2KSYweGZmLHRtcCYweGZmLAorCQkJbGUzMl90b19jcHUoZGV2LT5hZGFwdGVyX2luZm8ubW9uaXRvcmJ1aWxkKSk7CisJdG1wID0gbGUzMl90b19jcHUoZGV2LT5hZGFwdGVyX2luZm8uYmlvc3Jldik7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMlZDogYmlvcyAlZC4lZC0lZFslZF1cbiIsIAorCQkJZGV2LT5uYW1lLCBkZXYtPmlkLAorCQkJdG1wPj4yNCwodG1wPj4xNikmMHhmZix0bXAmMHhmZiwKKwkJCWxlMzJfdG9fY3B1KGRldi0+YWRhcHRlcl9pbmZvLmJpb3NidWlsZCkpOworCWlmIChsZTMyX3RvX2NwdShkZXYtPmFkYXB0ZXJfaW5mby5zZXJpYWxbMF0pICE9IDB4QkFEMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMlZDogc2VyaWFsICV4XG4iLAorCQkJZGV2LT5uYW1lLCBkZXYtPmlkLAorCQkJbGUzMl90b19jcHUoZGV2LT5hZGFwdGVyX2luZm8uc2VyaWFsWzBdKSk7CisKKwlkZXYtPm5vbmRhc2Rfc3VwcG9ydCA9IDA7CisJZGV2LT5yYWlkX3Njc2lfbW9kZSA9IDA7CisJaWYoZGV2LT5hZGFwdGVyX2luZm8ub3B0aW9ucyAmIEFBQ19PUFRfTk9OREFTRCl7CisJCWRldi0+bm9uZGFzZF9zdXBwb3J0ID0gMTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBmaXJtd2FyZSBzdXBwb3J0cyBST01CIFJBSUQvU0NTSSBtb2RlIGFuZCB3ZSBhcmUgY3VycmVudGx5CisJICogaW4gUkFJRC9TQ1NJIG1vZGUsIHNldCB0aGUgZmxhZy4gRm9yIG5vdyBpZiBpbiB0aGlzIG1vZGUgd2Ugd2lsbAorCSAqIGZvcmNlIG5vbmRhc2Qgc3VwcG9ydCBvbi4gSWYgd2UgZGVjaWRlIHRvIGFsbG93IHRoZSBub24tZGFzZCBmbGFnCisJICogYWRkaXRpb25hbCBjaGFuZ2VzIGNoYW5nZXMgd2lsbCBoYXZlIHRvIGJlIG1hZGUgdG8gc3VwcG9ydAorCSAqIFJBSUQvU0NTSS4gIHRoZSBmdW5jdGlvbiBhYWNfc2NzaV9jbWQgaW4gdGhpcyBtb2R1bGUgd2lsbCBoYXZlIHRvIGJlCisJICogY2hhbmdlZCB0byBzdXBwb3J0IHRoZSBuZXcgZGV2LT5yYWlkX3Njc2lfbW9kZSBmbGFnIGluc3RlYWQgb2YKKwkgKiBsZWFjaGluZyBvZmYgb2YgdGhlIGRldi0+bm9uZGFzZF9zdXBwb3J0IGZsYWcuIEFsc28gaW4gbGluaXQuYyB0aGUKKwkgKiBmdW5jdGlvbiBhYWNfZGV0ZWN0IHdpbGwgaGF2ZSB0byBiZSBtb2RpZmllZCB3aGVyZSBpdCBzZXRzIHVwIHRoZQorCSAqIG1heCBudW1iZXIgb2YgY2hhbm5lbHMgYmFzZWQgb24gdGhlIGFhYy0+bm9uZGFzZF9zdXBwb3J0IGZsYWcgb25seS4KKwkgKi8KKwlpZiAoKGRldi0+YWRhcHRlcl9pbmZvLm9wdGlvbnMgJiBBQUNfT1BUX1NDU0lfTUFOQUdFRCkgJiYKKwkgICAgKGRldi0+YWRhcHRlcl9pbmZvLm9wdGlvbnMgJiBBQUNfT1BUX1JBSURfU0NTSV9NT0RFKSkgeworCQlkZXYtPm5vbmRhc2Rfc3VwcG9ydCA9IDE7CisJCWRldi0+cmFpZF9zY3NpX21vZGUgPSAxOworCX0KKwlpZiAoZGV2LT5yYWlkX3Njc2lfbW9kZSAhPSAwKQorCQlwcmludGsoS0VSTl9JTkZPICIlcyVkOiBST01CIFJBSUQvU0NTSSBtb2RlIGVuYWJsZWRcbiIsCisJCQkJZGV2LT5uYW1lLCBkZXYtPmlkKTsKKwkJCisJaWYobm9uZGFzZCAhPSAtMSkgeyAgCisJCWRldi0+bm9uZGFzZF9zdXBwb3J0ID0gKG5vbmRhc2QhPTApOworCX0KKwlpZihkZXYtPm5vbmRhc2Rfc3VwcG9ydCAhPSAwKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMlZDogTm9uLURBU0Qgc3VwcG9ydCBlbmFibGVkLlxuIixkZXYtPm5hbWUsIGRldi0+aWQpOworCX0KKworCWRldi0+ZGFjX3N1cHBvcnQgPSAwOworCWlmKCAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gNCkgJiYgKGRldi0+YWRhcHRlcl9pbmZvLm9wdGlvbnMgJiBBQUNfT1BUX1NHTUFQX0hPU1Q2NCkpeworCQlwcmludGsoS0VSTl9JTkZPICIlcyVkOiA2NGJpdCBzdXBwb3J0IGVuYWJsZWQuXG4iLCBkZXYtPm5hbWUsIGRldi0+aWQpOworCQlkZXYtPmRhY19zdXBwb3J0ID0gMTsKKwl9CisKKwlpZihkYWNtb2RlICE9IC0xKSB7CisJCWRldi0+ZGFjX3N1cHBvcnQgPSAoZGFjbW9kZSE9MCk7CisJfQorCWlmKGRldi0+ZGFjX3N1cHBvcnQgIT0gMCkgeworCQlpZiAoIXBjaV9zZXRfZG1hX21hc2soZGV2LT5wZGV2LCAweEZGRkZGRkZGRkZGRkZGRkZVTEwpICYmCisJCQkhcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKGRldi0+cGRldiwgMHhGRkZGRkZGRkZGRkZGRkZGVUxMKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyIlcyVkOiA2NCBCaXQgREFDIGVuYWJsZWRcbiIsCisJCQkJZGV2LT5uYW1lLCBkZXYtPmlkKTsKKwkJfSBlbHNlIGlmICghcGNpX3NldF9kbWFfbWFzayhkZXYtPnBkZXYsIDB4RkZGRkZGRkZVTEwpICYmCisJCQkhcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKGRldi0+cGRldiwgMHhGRkZGRkZGRlVMTCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8iJXMlZDogRE1BIG1hc2sgc2V0IGZhaWxlZCwgNjQgQml0IERBQyBkaXNhYmxlZFxuIiwKKwkJCQlkZXYtPm5hbWUsIGRldi0+aWQpOworCQkJZGV2LT5kYWNfc3VwcG9ydCA9IDA7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzJWQ6IE5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUuXG4iLAorCQkJCWRldi0+bmFtZSwgZGV2LT5pZCk7CisJCQlyY29kZSA9IC1FTk9NRU07CisJCX0KKwl9CisKKwlmaWJfY29tcGxldGUoZmlicHRyKTsKKwlmaWJfZnJlZShmaWJwdHIpOworCisJcmV0dXJuIHJjb2RlOworfQorCisKK3N0YXRpYyB2b2lkIHJlYWRfY2FsbGJhY2sodm9pZCAqY29udGV4dCwgc3RydWN0IGZpYiAqIGZpYnB0cikKK3sKKwlzdHJ1Y3QgYWFjX2RldiAqZGV2OworCXN0cnVjdCBhYWNfcmVhZF9yZXBseSAqcmVhZHJlcGx5OworCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQ7CisJdTMyIGxiYTsKKwl1MzIgY2lkOworCisJc2NzaWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNvbnRleHQ7CisKKwlkZXYgPSAoc3RydWN0IGFhY19kZXYgKilzY3NpY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWNpZCA9IElEX0xVTl9UT19DT05UQUlORVIoc2NzaWNtZC0+ZGV2aWNlLT5pZCwgc2NzaWNtZC0+ZGV2aWNlLT5sdW4pOworCisJbGJhID0gKChzY3NpY21kLT5jbW5kWzFdICYgMHgxRikgPDwgMTYpIHwgKHNjc2ljbWQtPmNtbmRbMl0gPDwgOCkgfCBzY3NpY21kLT5jbW5kWzNdOworCWRwcmludGsoKEtFUk5fREVCVUcgInJlYWRfY2FsbGJhY2tbY3B1ICVkXTogbGJhID0gJXUsIHQgPSAlbGQuXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksIGxiYSwgamlmZmllcykpOworCisJaWYgKGZpYnB0ciA9PSBOVUxMKQorCQlCVUcoKTsKKwkJCisJaWYoc2NzaWNtZC0+dXNlX3NnKQorCQlwY2lfdW5tYXBfc2coZGV2LT5wZGV2LCAKKwkJCShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3NpY21kLT5idWZmZXIsCisJCQlzY3NpY21kLT51c2Vfc2csCisJCQlzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJZWxzZSBpZihzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4pCisJCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wZGV2LCBzY3NpY21kLT5TQ3AuZG1hX2hhbmRsZSwKKwkJCQkgc2NzaWNtZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCSBzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJcmVhZHJlcGx5ID0gKHN0cnVjdCBhYWNfcmVhZF9yZXBseSAqKWZpYl9kYXRhKGZpYnB0cik7CisJaWYgKGxlMzJfdG9fY3B1KHJlYWRyZXBseS0+c3RhdHVzKSA9PSBTVF9PSykKKwkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfR09PRDsKKwllbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicmVhZF9jYWxsYmFjazogcmVhZCBmYWlsZWQsIHN0YXR1cyA9ICVkXG4iLAorCQkJCWxlMzJfdG9fY3B1KHJlYWRyZXBseS0+c3RhdHVzKSk7CisJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwkJc2V0X3NlbnNlKCh1OCAqKSAmZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSwKKwkJCQkgICAgSEFSRFdBUkVfRVJST1IsCisJCQkJICAgIFNFTkNPREVfSU5URVJOQUxfVEFSR0VUX0ZBSUxVUkUsCisJCQkJICAgIEFTRU5DT0RFX0lOVEVSTkFMX1RBUkdFVF9GQUlMVVJFLCAwLCAwLAorCQkJCSAgICAwLCAwKTsKKwkJbWVtY3B5KHNjc2ljbWQtPnNlbnNlX2J1ZmZlciwgJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCisJCSAgKHNpemVvZihkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhKSA+IHNpemVvZihzY3NpY21kLT5zZW5zZV9idWZmZXIpKQorCQkgICAgPyBzaXplb2Yoc2NzaWNtZC0+c2Vuc2VfYnVmZmVyKQorCQkgICAgOiBzaXplb2YoZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSkpOworCX0KKwlmaWJfY29tcGxldGUoZmlicHRyKTsKKwlmaWJfZnJlZShmaWJwdHIpOworCisJYWFjX2lvX2RvbmUoc2NzaWNtZCk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2NhbGxiYWNrKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBmaWIgKiBmaWJwdHIpCit7CisJc3RydWN0IGFhY19kZXYgKmRldjsKKwlzdHJ1Y3QgYWFjX3dyaXRlX3JlcGx5ICp3cml0ZXJlcGx5OworCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQ7CisJdTMyIGxiYTsKKwl1MzIgY2lkOworCisJc2NzaWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNvbnRleHQ7CisJZGV2ID0gKHN0cnVjdCBhYWNfZGV2ICopc2NzaWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwljaWQgPSBJRF9MVU5fVE9fQ09OVEFJTkVSKHNjc2ljbWQtPmRldmljZS0+aWQsIHNjc2ljbWQtPmRldmljZS0+bHVuKTsKKworCWxiYSA9ICgoc2NzaWNtZC0+Y21uZFsxXSAmIDB4MUYpIDw8IDE2KSB8IChzY3NpY21kLT5jbW5kWzJdIDw8IDgpIHwgc2NzaWNtZC0+Y21uZFszXTsKKwlkcHJpbnRrKChLRVJOX0RFQlVHICJ3cml0ZV9jYWxsYmFja1tjcHUgJWRdOiBsYmEgPSAldSwgdCA9ICVsZC5cbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgbGJhLCBqaWZmaWVzKSk7CisJaWYgKGZpYnB0ciA9PSBOVUxMKQorCQlCVUcoKTsKKworCWlmKHNjc2ljbWQtPnVzZV9zZykKKwkJcGNpX3VubWFwX3NnKGRldi0+cGRldiwgCisJCQkoc3RydWN0IHNjYXR0ZXJsaXN0ICopc2NzaWNtZC0+YnVmZmVyLAorCQkJc2NzaWNtZC0+dXNlX3NnLAorCQkJc2NzaWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCWVsc2UgaWYoc2NzaWNtZC0+cmVxdWVzdF9idWZmbGVuKQorCQlwY2lfdW5tYXBfc2luZ2xlKGRldi0+cGRldiwgc2NzaWNtZC0+U0NwLmRtYV9oYW5kbGUsCisJCQkJIHNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkgc2NzaWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCisJd3JpdGVyZXBseSA9IChzdHJ1Y3QgYWFjX3dyaXRlX3JlcGx5ICopIGZpYl9kYXRhKGZpYnB0cik7CisJaWYgKGxlMzJfdG9fY3B1KHdyaXRlcmVwbHktPnN0YXR1cykgPT0gU1RfT0spCisJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0dPT0Q7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIndyaXRlX2NhbGxiYWNrOiB3cml0ZSBmYWlsZWQsIHN0YXR1cyA9ICVkXG4iLCB3cml0ZXJlcGx5LT5zdGF0dXMpOworCQlzY3NpY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDggfCBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CisJCXNldF9zZW5zZSgodTggKikgJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCisJCQkJICAgIEhBUkRXQVJFX0VSUk9SLAorCQkJCSAgICBTRU5DT0RFX0lOVEVSTkFMX1RBUkdFVF9GQUlMVVJFLAorCQkJCSAgICBBU0VOQ09ERV9JTlRFUk5BTF9UQVJHRVRfRkFJTFVSRSwgMCwgMCwKKwkJCQkgICAgMCwgMCk7CisJCW1lbWNweShzY3NpY21kLT5zZW5zZV9idWZmZXIsICZkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhLCAKKwkJCQlzaXplb2Yoc3RydWN0IHNlbnNlX2RhdGEpKTsKKwl9CisKKwlmaWJfY29tcGxldGUoZmlicHRyKTsKKwlmaWJfZnJlZShmaWJwdHIpOworCWFhY19pb19kb25lKHNjc2ljbWQpOworfQorCitpbnQgYWFjX3JlYWQoc3RydWN0IHNjc2lfY21uZCAqIHNjc2ljbWQsIGludCBjaWQpCit7CisJdTMyIGxiYTsKKwl1MzIgY291bnQ7CisJaW50IHN0YXR1czsKKworCXUxNiBmaWJzaXplOworCXN0cnVjdCBhYWNfZGV2ICpkZXY7CisJc3RydWN0IGZpYiAqIGNtZF9maWJjb250ZXh0OworCisJZGV2ID0gKHN0cnVjdCBhYWNfZGV2ICopc2NzaWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwkvKgorCSAqCUdldCBibG9jayBhZGRyZXNzIGFuZCB0cmFuc2ZlciBsZW5ndGgKKwkgKi8KKwlpZiAoc2NzaWNtZC0+Y21uZFswXSA9PSBSRUFEXzYpCS8qIDYgYnl0ZSBjb21tYW5kICovCisJeworCQlkcHJpbnRrKChLRVJOX0RFQlVHICJhYWNoYmE6IHJlY2VpdmVkIGEgcmVhZCg2KSBjb21tYW5kIG9uIGlkICVkLlxuIiwgY2lkKSk7CisKKwkJbGJhID0gKChzY3NpY21kLT5jbW5kWzFdICYgMHgxRikgPDwgMTYpIHwgKHNjc2ljbWQtPmNtbmRbMl0gPDwgOCkgfCBzY3NpY21kLT5jbW5kWzNdOworCQljb3VudCA9IHNjc2ljbWQtPmNtbmRbNF07CisKKwkJaWYgKGNvdW50ID09IDApCisJCQljb3VudCA9IDI1NjsKKwl9IGVsc2UgeworCQlkcHJpbnRrKChLRVJOX0RFQlVHICJhYWNoYmE6IHJlY2VpdmVkIGEgcmVhZCgxMCkgY29tbWFuZCBvbiBpZCAlZC5cbiIsIGNpZCkpOworCisJCWxiYSA9IChzY3NpY21kLT5jbW5kWzJdIDw8IDI0KSB8IChzY3NpY21kLT5jbW5kWzNdIDw8IDE2KSB8IChzY3NpY21kLT5jbW5kWzRdIDw8IDgpIHwgc2NzaWNtZC0+Y21uZFs1XTsKKwkJY291bnQgPSAoc2NzaWNtZC0+Y21uZFs3XSA8PCA4KSB8IHNjc2ljbWQtPmNtbmRbOF07CisJfQorCWRwcmludGsoKEtFUk5fREVCVUcgImFhY19yZWFkW2NwdSAlZF06IGxiYSA9ICV1LCB0ID0gJWxkLlxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBsYmEsIGppZmZpZXMpKTsKKwkvKgorCSAqCUFsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBGaWIKKwkgKi8KKwlpZiAoIShjbWRfZmliY29udGV4dCA9IGZpYl9hbGxvYyhkZXYpKSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJZmliX2luaXQoY21kX2ZpYmNvbnRleHQpOworCisJaWYoZGV2LT5kYWNfc3VwcG9ydCA9PSAxKSB7CisJCXN0cnVjdCBhYWNfcmVhZDY0ICpyZWFkY21kOworCQlyZWFkY21kID0gKHN0cnVjdCBhYWNfcmVhZDY0ICopIGZpYl9kYXRhKGNtZF9maWJjb250ZXh0KTsKKwkJcmVhZGNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTMyKFZNX0N0SG9zdFJlYWQ2NCk7CisJCXJlYWRjbWQtPmNpZCA9IGNwdV90b19sZTE2KGNpZCk7CisJCXJlYWRjbWQtPnNlY3Rvcl9jb3VudCA9IGNwdV90b19sZTE2KGNvdW50KTsKKwkJcmVhZGNtZC0+YmxvY2sgPSBjcHVfdG9fbGUzMihsYmEpOworCQlyZWFkY21kLT5wYWQgICA9IDA7CisJCXJlYWRjbWQtPmZsYWdzID0gMDsgCisKKwkJYWFjX2J1aWxkX3NnNjQoc2NzaWNtZCwgJnJlYWRjbWQtPnNnKTsKKwkJZmlic2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWFjX3JlYWQ2NCkgKyAKKwkJCSgobGUzMl90b19jcHUocmVhZGNtZC0+c2cuY291bnQpIC0gMSkgKiAKKwkJCSBzaXplb2YgKHN0cnVjdCBzZ2VudHJ5NjQpKTsKKwkJQlVHX09OIChmaWJzaXplID4gKHNpemVvZihzdHJ1Y3QgaHdfZmliKSAtIAorCQkJCQlzaXplb2Yoc3RydWN0IGFhY19maWJoZHIpKSk7CisJCS8qCisJCSAqCU5vdyBzZW5kIHRoZSBGaWIgdG8gdGhlIGFkYXB0ZXIKKwkJICovCisJCXN0YXR1cyA9IGZpYl9zZW5kKENvbnRhaW5lckNvbW1hbmQ2NCwgCisJCQkgIGNtZF9maWJjb250ZXh0LCAKKwkJCSAgZmlic2l6ZSwgCisJCQkgIEZzYU5vcm1hbCwgCisJCQkgIDAsIDEsIAorCQkJICAoZmliX2NhbGxiYWNrKSByZWFkX2NhbGxiYWNrLCAKKwkJCSAgKHZvaWQgKikgc2NzaWNtZCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGFhY19yZWFkICpyZWFkY21kOworCQlyZWFkY21kID0gKHN0cnVjdCBhYWNfcmVhZCAqKSBmaWJfZGF0YShjbWRfZmliY29udGV4dCk7CisJCXJlYWRjbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUzMihWTV9DdEJsb2NrUmVhZCk7CisJCXJlYWRjbWQtPmNpZCA9IGNwdV90b19sZTMyKGNpZCk7CisJCXJlYWRjbWQtPmJsb2NrID0gY3B1X3RvX2xlMzIobGJhKTsKKwkJcmVhZGNtZC0+Y291bnQgPSBjcHVfdG9fbGUzMihjb3VudCAqIDUxMik7CisKKwkJaWYgKGNvdW50ICogNTEyID4gKDY0ICogMTAyNCkpCisJCQlCVUcoKTsKKworCQlhYWNfYnVpbGRfc2coc2NzaWNtZCwgJnJlYWRjbWQtPnNnKTsKKwkJZmlic2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWFjX3JlYWQpICsgCisJCQkoKGxlMzJfdG9fY3B1KHJlYWRjbWQtPnNnLmNvdW50KSAtIDEpICogCisJCQkgc2l6ZW9mIChzdHJ1Y3Qgc2dlbnRyeSkpOworCQlCVUdfT04gKGZpYnNpemUgPiAoc2l6ZW9mKHN0cnVjdCBod19maWIpIC0gCisJCQkJCXNpemVvZihzdHJ1Y3QgYWFjX2ZpYmhkcikpKTsKKwkJLyoKKwkJICoJTm93IHNlbmQgdGhlIEZpYiB0byB0aGUgYWRhcHRlcgorCQkgKi8KKwkJc3RhdHVzID0gZmliX3NlbmQoQ29udGFpbmVyQ29tbWFuZCwgCisJCQkgIGNtZF9maWJjb250ZXh0LCAKKwkJCSAgZmlic2l6ZSwgCisJCQkgIEZzYU5vcm1hbCwgCisJCQkgIDAsIDEsIAorCQkJICAoZmliX2NhbGxiYWNrKSByZWFkX2NhbGxiYWNrLCAKKwkJCSAgKHZvaWQgKikgc2NzaWNtZCk7CisJfQorCisJCisKKwkvKgorCSAqCUNoZWNrIHRoYXQgdGhlIGNvbW1hbmQgcXVldWVkIHRvIHRoZSBjb250cm9sbGVyCisJICovCisJaWYgKHN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIAorCQlyZXR1cm4gMDsKKwkJCisJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjX3JlYWQ6IGZpYl9zZW5kIGZhaWxlZCB3aXRoIHN0YXR1czogJWQuXG4iLCBzdGF0dXMpOworCS8qCisJICoJRm9yIHNvbWUgcmVhc29uLCB0aGUgRmliIGRpZG4ndCBxdWV1ZSwgcmV0dXJuIFFVRVVFX0ZVTEwKKwkgKi8KKwlzY3NpY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDggfCBTQU1fU1RBVF9UQVNLX1NFVF9GVUxMOworCWFhY19pb19kb25lKHNjc2ljbWQpOworCWZpYl9jb21wbGV0ZShjbWRfZmliY29udGV4dCk7CisJZmliX2ZyZWUoY21kX2ZpYmNvbnRleHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFhY193cml0ZShzdHJ1Y3Qgc2NzaV9jbW5kICogc2NzaWNtZCwgaW50IGNpZCkKK3sKKwl1MzIgbGJhOworCXUzMiBjb3VudDsKKwlpbnQgc3RhdHVzOworCXUxNiBmaWJzaXplOworCXN0cnVjdCBhYWNfZGV2ICpkZXY7CisJc3RydWN0IGZpYiAqIGNtZF9maWJjb250ZXh0OworCisJZGV2ID0gKHN0cnVjdCBhYWNfZGV2ICopc2NzaWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwkvKgorCSAqCUdldCBibG9jayBhZGRyZXNzIGFuZCB0cmFuc2ZlciBsZW5ndGgKKwkgKi8KKwlpZiAoc2NzaWNtZC0+Y21uZFswXSA9PSBXUklURV82KQkvKiA2IGJ5dGUgY29tbWFuZCAqLworCXsKKwkJbGJhID0gKChzY3NpY21kLT5jbW5kWzFdICYgMHgxRikgPDwgMTYpIHwgKHNjc2ljbWQtPmNtbmRbMl0gPDwgOCkgfCBzY3NpY21kLT5jbW5kWzNdOworCQljb3VudCA9IHNjc2ljbWQtPmNtbmRbNF07CisJCWlmIChjb3VudCA9PSAwKQorCQkJY291bnQgPSAyNTY7CisJfSBlbHNlIHsKKwkJZHByaW50aygoS0VSTl9ERUJVRyAiYWFjaGJhOiByZWNlaXZlZCBhIHdyaXRlKDEwKSBjb21tYW5kIG9uIGlkICVkLlxuIiwgY2lkKSk7CisJCWxiYSA9IChzY3NpY21kLT5jbW5kWzJdIDw8IDI0KSB8IChzY3NpY21kLT5jbW5kWzNdIDw8IDE2KSB8IChzY3NpY21kLT5jbW5kWzRdIDw8IDgpIHwgc2NzaWNtZC0+Y21uZFs1XTsKKwkJY291bnQgPSAoc2NzaWNtZC0+Y21uZFs3XSA8PCA4KSB8IHNjc2ljbWQtPmNtbmRbOF07CisJfQorCWRwcmludGsoKEtFUk5fREVCVUcgImFhY193cml0ZVtjcHUgJWRdOiBsYmEgPSAldSwgdCA9ICVsZC5cbiIsCisJICBzbXBfcHJvY2Vzc29yX2lkKCksICh1bnNpZ25lZCBsb25nIGxvbmcpbGJhLCBqaWZmaWVzKSk7CisJLyoKKwkgKglBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIEZpYiB0aGVuIHNldHVwIGEgQmxvY2tXcml0ZSBjb21tYW5kCisJICovCisJaWYgKCEoY21kX2ZpYmNvbnRleHQgPSBmaWJfYWxsb2MoZGV2KSkpIHsKKwkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlhYWNfaW9fZG9uZShzY3NpY21kKTsKKwkJcmV0dXJuIDA7CisJfQorCWZpYl9pbml0KGNtZF9maWJjb250ZXh0KTsKKworCWlmKGRldi0+ZGFjX3N1cHBvcnQgPT0gMSkgeworCQlzdHJ1Y3QgYWFjX3dyaXRlNjQgKndyaXRlY21kOworCQl3cml0ZWNtZCA9IChzdHJ1Y3QgYWFjX3dyaXRlNjQgKikgZmliX2RhdGEoY21kX2ZpYmNvbnRleHQpOworCQl3cml0ZWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTMyKFZNX0N0SG9zdFdyaXRlNjQpOworCQl3cml0ZWNtZC0+Y2lkID0gY3B1X3RvX2xlMTYoY2lkKTsKKwkJd3JpdGVjbWQtPnNlY3Rvcl9jb3VudCA9IGNwdV90b19sZTE2KGNvdW50KTsgCisJCXdyaXRlY21kLT5ibG9jayA9IGNwdV90b19sZTMyKGxiYSk7CisJCXdyaXRlY21kLT5wYWQJPSAwOworCQl3cml0ZWNtZC0+ZmxhZ3MJPSAwOworCisJCWFhY19idWlsZF9zZzY0KHNjc2ljbWQsICZ3cml0ZWNtZC0+c2cpOworCQlmaWJzaXplID0gc2l6ZW9mKHN0cnVjdCBhYWNfd3JpdGU2NCkgKyAKKwkJCSgobGUzMl90b19jcHUod3JpdGVjbWQtPnNnLmNvdW50KSAtIDEpICogCisJCQkgc2l6ZW9mIChzdHJ1Y3Qgc2dlbnRyeTY0KSk7CisJCUJVR19PTiAoZmlic2l6ZSA+IChzaXplb2Yoc3RydWN0IGh3X2ZpYikgLSAKKwkJCQkJc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKSkpOworCQkvKgorCQkgKglOb3cgc2VuZCB0aGUgRmliIHRvIHRoZSBhZGFwdGVyCisJCSAqLworCQlzdGF0dXMgPSBmaWJfc2VuZChDb250YWluZXJDb21tYW5kNjQsIAorCQkJICBjbWRfZmliY29udGV4dCwgCisJCQkgIGZpYnNpemUsIAorCQkJICBGc2FOb3JtYWwsIAorCQkJICAwLCAxLCAKKwkJCSAgKGZpYl9jYWxsYmFjaykgd3JpdGVfY2FsbGJhY2ssIAorCQkJICAodm9pZCAqKSBzY3NpY21kKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgYWFjX3dyaXRlICp3cml0ZWNtZDsKKwkJd3JpdGVjbWQgPSAoc3RydWN0IGFhY193cml0ZSAqKSBmaWJfZGF0YShjbWRfZmliY29udGV4dCk7CisJCXdyaXRlY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMzIoVk1fQ3RCbG9ja1dyaXRlKTsKKwkJd3JpdGVjbWQtPmNpZCA9IGNwdV90b19sZTMyKGNpZCk7CisJCXdyaXRlY21kLT5ibG9jayA9IGNwdV90b19sZTMyKGxiYSk7CisJCXdyaXRlY21kLT5jb3VudCA9IGNwdV90b19sZTMyKGNvdW50ICogNTEyKTsKKwkJd3JpdGVjbWQtPnNnLmNvdW50ID0gY3B1X3RvX2xlMzIoMSk7CisJCS8qIC0+c3RhYmxlIGlzIG5vdCB1c2VkIC0gaXQgZGlkIG1lYW4gd2hpY2ggdHlwZSBvZiB3cml0ZSAqLworCisJCWlmIChjb3VudCAqIDUxMiA+ICg2NCAqIDEwMjQpKSB7CisJCQlCVUcoKTsKKwkJfQorCisJCWFhY19idWlsZF9zZyhzY3NpY21kLCAmd3JpdGVjbWQtPnNnKTsKKwkJZmlic2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWFjX3dyaXRlKSArIAorCQkJKChsZTMyX3RvX2NwdSh3cml0ZWNtZC0+c2cuY291bnQpIC0gMSkgKiAKKwkJCSBzaXplb2YgKHN0cnVjdCBzZ2VudHJ5KSk7CisJCUJVR19PTiAoZmlic2l6ZSA+IChzaXplb2Yoc3RydWN0IGh3X2ZpYikgLSAKKwkJCQkJc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKSkpOworCQkvKgorCQkgKglOb3cgc2VuZCB0aGUgRmliIHRvIHRoZSBhZGFwdGVyCisJCSAqLworCQlzdGF0dXMgPSBmaWJfc2VuZChDb250YWluZXJDb21tYW5kLCAKKwkJCSAgY21kX2ZpYmNvbnRleHQsIAorCQkJICBmaWJzaXplLCAKKwkJCSAgRnNhTm9ybWFsLCAKKwkJCSAgMCwgMSwgCisJCQkgIChmaWJfY2FsbGJhY2spIHdyaXRlX2NhbGxiYWNrLCAKKwkJCSAgKHZvaWQgKikgc2NzaWNtZCk7CisJfQorCisJLyoKKwkgKglDaGVjayB0aGF0IHRoZSBjb21tYW5kIHF1ZXVlZCB0byB0aGUgY29udHJvbGxlcgorCSAqLworCWlmIChzdGF0dXMgPT0gLUVJTlBST0dSRVNTKQorCXsKKwkJZHByaW50aygid3JpdGUgcXVldWVkLlxuIik7CisJCXJldHVybiAwOworCX0KKworCXByaW50ayhLRVJOX1dBUk5JTkcgImFhY193cml0ZTogZmliX3NlbmQgZmFpbGVkIHdpdGggc3RhdHVzOiAlZFxuIiwgc3RhdHVzKTsKKwkvKgorCSAqCUZvciBzb21lIHJlYXNvbiwgdGhlIEZpYiBkaWRuJ3QgcXVldWUsIHJldHVybiBRVUVVRV9GVUxMCisJICovCisJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfVEFTS19TRVRfRlVMTDsKKwlhYWNfaW9fZG9uZShzY3NpY21kKTsKKworCWZpYl9jb21wbGV0ZShjbWRfZmliY29udGV4dCk7CisJZmliX2ZyZWUoY21kX2ZpYmNvbnRleHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzeW5jaHJvbml6ZV9jYWxsYmFjayh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZmliICpmaWJwdHIpCit7CisJc3RydWN0IGFhY19zeW5jaHJvbml6ZV9yZXBseSAqc3luY2hyb25pemVyZXBseTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisKKwljbWQgPSBjb250ZXh0OworCisJZHByaW50aygoS0VSTl9ERUJVRyAic3luY2hyb25pemVfY2FsbGJhY2tbY3B1ICVkXTogdCA9ICVsZC5cbiIsIAorCQkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgamlmZmllcykpOworCUJVR19PTihmaWJwdHIgPT0gTlVMTCk7CisKKworCXN5bmNocm9uaXplcmVwbHkgPSBmaWJfZGF0YShmaWJwdHIpOworCWlmIChsZTMyX3RvX2NwdShzeW5jaHJvbml6ZXJlcGx5LT5zdGF0dXMpID09IENUX09LKQorCQljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IAorCQkJQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfR09PRDsKKwllbHNlIHsKKwkJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gY21kLT5kZXZpY2U7CisJCXN0cnVjdCBhYWNfZGV2ICpkZXYgPSAoc3RydWN0IGFhY19kZXYgKilzZGV2LT5ob3N0LT5ob3N0ZGF0YTsKKwkJdTMyIGNpZCA9IElEX0xVTl9UT19DT05UQUlORVIoc2Rldi0+aWQsIHNkZXYtPmx1bik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCSAgICAgInN5bmNocm9uaXplX2NhbGxiYWNrOiBzeW5jaHJvbml6ZSBmYWlsZWQsIHN0YXR1cyA9ICVkXG4iLAorCQkgICAgIGxlMzJfdG9fY3B1KHN5bmNocm9uaXplcmVwbHktPnN0YXR1cykpOworCQljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IAorCQkJQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCQlzZXRfc2Vuc2UoKHU4ICopJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCisJCQkJICAgIEhBUkRXQVJFX0VSUk9SLAorCQkJCSAgICBTRU5DT0RFX0lOVEVSTkFMX1RBUkdFVF9GQUlMVVJFLAorCQkJCSAgICBBU0VOQ09ERV9JTlRFUk5BTF9UQVJHRVRfRkFJTFVSRSwgMCwgMCwKKwkJCQkgICAgMCwgMCk7CisJCW1lbWNweShjbWQtPnNlbnNlX2J1ZmZlciwgJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCisJCSAgbWluKHNpemVvZihkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhKSwgCisJCQkgIHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpKTsKKwl9CisKKwlmaWJfY29tcGxldGUoZmlicHRyKTsKKwlmaWJfZnJlZShmaWJwdHIpOworCWFhY19pb19kb25lKGNtZCk7Cit9CisKK3N0YXRpYyBpbnQgYWFjX3N5bmNocm9uaXplKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQsIGludCBjaWQpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgZmliICpjbWRfZmliY29udGV4dDsKKwlzdHJ1Y3QgYWFjX3N5bmNocm9uaXplICpzeW5jaHJvbml6ZWNtZDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gc2NzaWNtZC0+ZGV2aWNlOworCWludCBhY3RpdmUgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIFdhaXQgZm9yIGFsbCBjb21tYW5kcyB0byBjb21wbGV0ZSB0byB0aGlzIHNwZWNpZmljCisJICogdGFyZ2V0IChibG9jaykuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNkZXYtPmxpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY21kLCAmc2Rldi0+Y21kX2xpc3QsIGxpc3QpCisJCWlmIChjbWQgIT0gc2NzaWNtZCAmJiBjbWQtPnNlcmlhbF9udW1iZXIgIT0gMCkgeworCQkJKythY3RpdmU7CisJCQlicmVhazsKKwkJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Rldi0+bGlzdF9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqCVlpZWxkIHRoZSBwcm9jZXNzb3IgKHJlcXVldWUgZm9yIGxhdGVyKQorCSAqLworCWlmIChhY3RpdmUpCisJCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7CisKKwkvKgorCSAqCUFsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBGaWIKKwkgKi8KKwlpZiAoIShjbWRfZmliY29udGV4dCA9IAorCSAgICBmaWJfYWxsb2MoKHN0cnVjdCBhYWNfZGV2ICopc2NzaWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSkpKSAKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisKKwlmaWJfaW5pdChjbWRfZmliY29udGV4dCk7CisKKwlzeW5jaHJvbml6ZWNtZCA9IGZpYl9kYXRhKGNtZF9maWJjb250ZXh0KTsKKwlzeW5jaHJvbml6ZWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTMyKFZNX0NvbnRhaW5lckNvbmZpZyk7CisJc3luY2hyb25pemVjbWQtPnR5cGUgPSBjcHVfdG9fbGUzMihDVF9GTFVTSF9DQUNIRSk7CisJc3luY2hyb25pemVjbWQtPmNpZCA9IGNwdV90b19sZTMyKGNpZCk7CisJc3luY2hyb25pemVjbWQtPmNvdW50ID0gCisJICAgICBjcHVfdG9fbGUzMihzaXplb2YoKChzdHJ1Y3QgYWFjX3N5bmNocm9uaXplX3JlcGx5ICopTlVMTCktPmRhdGEpKTsKKworCS8qCisJICoJTm93IHNlbmQgdGhlIEZpYiB0byB0aGUgYWRhcHRlcgorCSAqLworCXN0YXR1cyA9IGZpYl9zZW5kKENvbnRhaW5lckNvbW1hbmQsCisJCSAgY21kX2ZpYmNvbnRleHQsCisJCSAgc2l6ZW9mKHN0cnVjdCBhYWNfc3luY2hyb25pemUpLAorCQkgIEZzYU5vcm1hbCwKKwkJICAwLCAxLAorCQkgIChmaWJfY2FsbGJhY2spc3luY2hyb25pemVfY2FsbGJhY2ssCisJCSAgKHZvaWQgKilzY3NpY21kKTsKKworCS8qCisJICoJQ2hlY2sgdGhhdCB0aGUgY29tbWFuZCBxdWV1ZWQgdG8gdGhlIGNvbnRyb2xsZXIKKwkgKi8KKwlpZiAoc3RhdHVzID09IC1FSU5QUk9HUkVTUykKKwkJcmV0dXJuIDA7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HIAorCQkiYWFjX3N5bmNocm9uaXplOiBmaWJfc2VuZCBmYWlsZWQgd2l0aCBzdGF0dXM6ICVkLlxuIiwgc3RhdHVzKTsKKwlmaWJfY29tcGxldGUoY21kX2ZpYmNvbnRleHQpOworCWZpYl9mcmVlKGNtZF9maWJjb250ZXh0KTsKKwlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKK30KKworLyoqCisgKglhYWNfc2NzaV9jbWQoKQkJLQlQcm9jZXNzIFNDU0kgY29tbWFuZAorICoJQHNjc2ljbWQ6CQlTQ1NJIGNvbW1hbmQgYmxvY2sKKyAqCisgKglFbXVsYXRlIGEgU0NTSSBjb21tYW5kIGFuZCBxdWV1ZSB0aGUgcmVxdWlyZWQgcmVxdWVzdCBmb3IgdGhlCisgKglhYWNyYWlkIGZpcm13YXJlLgorICovCisgCitpbnQgYWFjX3Njc2lfY21kKHN0cnVjdCBzY3NpX2NtbmQgKiBzY3NpY21kKQoreworCXUzMiBjaWQgPSAwOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBzY3NpY21kLT5kZXZpY2UtPmhvc3Q7CisJc3RydWN0IGFhY19kZXYgKmRldiA9IChzdHJ1Y3QgYWFjX2RldiAqKWhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBmc2FfZGV2X2luZm8gKmZzYV9kZXZfcHRyID0gZGV2LT5mc2FfZGV2OworCWludCBjYXJkdHlwZSA9IGRldi0+Y2FyZHR5cGU7CisJaW50IHJldDsKKwkKKwkvKgorCSAqCUlmIHRoZSBidXMsIGlkIG9yIGx1biBpcyBvdXQgb2YgcmFuZ2UsIHJldHVybiBmYWlsCisJICoJVGVzdCBkb2VzIG5vdCBhcHBseSB0byBJRCAxNiwgdGhlIHBzZXVkbyBpZCBmb3IgdGhlIGNvbnRyb2xsZXIKKwkgKglpdHNlbGYuCisJICovCisJaWYgKHNjc2ljbWQtPmRldmljZS0+aWQgIT0gaG9zdC0+dGhpc19pZCkgeworCQlpZiAoKHNjc2ljbWQtPmRldmljZS0+Y2hhbm5lbCA9PSAwKSApeworCQkJaWYoIChzY3NpY21kLT5kZXZpY2UtPmlkID49IGRldi0+bWF4aW11bV9udW1fY29udGFpbmVycykgfHwgKHNjc2ljbWQtPmRldmljZS0+bHVuICE9IDApKXsgCisJCQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCQkJc2NzaWNtZC0+c2NzaV9kb25lKHNjc2ljbWQpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJY2lkID0gSURfTFVOX1RPX0NPTlRBSU5FUihzY3NpY21kLT5kZXZpY2UtPmlkLCBzY3NpY21kLT5kZXZpY2UtPmx1bik7CisKKwkJCS8qCisJCQkgKglJZiB0aGUgdGFyZ2V0IGNvbnRhaW5lciBkb2Vzbid0IGV4aXN0LCBpdCBtYXkgaGF2ZQorCQkJICoJYmVlbiBuZXdseSBjcmVhdGVkCisJCQkgKi8KKwkJCWlmICgoZnNhX2Rldl9wdHJbY2lkXS52YWxpZCAmIDEpID09IDApIHsKKwkJCQlzd2l0Y2ggKHNjc2ljbWQtPmNtbmRbMF0pIHsKKwkJCQljYXNlIElOUVVJUlk6CisJCQkJY2FzZSBSRUFEX0NBUEFDSVRZOgorCQkJCWNhc2UgVEVTVF9VTklUX1JFQURZOgorCQkJCQlzcGluX3VubG9ja19pcnEoaG9zdC0+aG9zdF9sb2NrKTsKKwkJCQkJcHJvYmVfY29udGFpbmVyKGRldiwgY2lkKTsKKwkJCQkJc3Bpbl9sb2NrX2lycShob3N0LT5ob3N0X2xvY2spOworCQkJCQlpZiAoZnNhX2Rldl9wdHJbY2lkXS52YWxpZCA9PSAwKSB7CisJCQkJCQlzY3NpY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJCQkJCXNjc2ljbWQtPnNjc2lfZG9uZShzY3NpY21kKTsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCSAqCUlmIHRoZSB0YXJnZXQgY29udGFpbmVyIHN0aWxsIGRvZXNuJ3QgZXhpc3QsIAorCQkJICoJcmV0dXJuIGZhaWx1cmUKKwkJCSAqLworCQkJaWYgKGZzYV9kZXZfcHRyW2NpZF0udmFsaWQgPT0gMCkgeworCQkJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2OworCQkJCXNjc2ljbWQtPnNjc2lfZG9uZShzY3NpY21kKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSBlbHNlIHsgIC8qIGNoZWNrIGZvciBwaHlzaWNhbCBub24tZGFzZCBkZXZpY2VzICovCisJCQlpZihkZXYtPm5vbmRhc2Rfc3VwcG9ydCA9PSAxKXsKKwkJCQlyZXR1cm4gYWFjX3NlbmRfc3JiX2ZpYihzY3NpY21kKTsKKwkJCX0gZWxzZSB7CisJCQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCQkJc2NzaWNtZC0+c2NzaV9kb25lKHNjc2ljbWQpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCS8qCisJICogZWxzZSBDb21tYW5kIGZvciB0aGUgY29udHJvbGxlciBpdHNlbGYKKwkgKi8KKwllbHNlIGlmICgoc2NzaWNtZC0+Y21uZFswXSAhPSBJTlFVSVJZKSAmJgkvKiBvbmx5IElOUVVJUlkgJiBUVVIgY21uZCBzdXBwb3J0ZWQgZm9yIGNvbnRyb2xsZXIgKi8KKwkJKHNjc2ljbWQtPmNtbmRbMF0gIT0gVEVTVF9VTklUX1JFQURZKSkgCisJeworCQlkcHJpbnRrKChLRVJOX1dBUk5JTkcgIk9ubHkgSU5RVUlSWSAmIFRVUiBjb21tYW5kIHN1cHBvcnRlZCBmb3IgY29udHJvbGxlciwgcmN2ZCA9IDB4JXguXG4iLCBzY3NpY21kLT5jbW5kWzBdKSk7CisJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwkJc2V0X3NlbnNlKCh1OCAqKSAmZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSwKKwkJCSAgICBJTExFR0FMX1JFUVVFU1QsCisJCQkgICAgU0VOQ09ERV9JTlZBTElEX0NPTU1BTkQsCisJCQkgICAgQVNFTkNPREVfSU5WQUxJRF9DT01NQU5ELCAwLCAwLCAwLCAwKTsKKwkJbWVtY3B5KHNjc2ljbWQtPnNlbnNlX2J1ZmZlciwgJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCisJCSAgKHNpemVvZihkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhKSA+IHNpemVvZihzY3NpY21kLT5zZW5zZV9idWZmZXIpKQorCQkgICAgPyBzaXplb2Yoc2NzaWNtZC0+c2Vuc2VfYnVmZmVyKQorCQkgICAgOiBzaXplb2YoZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSkpOworCQlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7CisJCXJldHVybiAwOworCX0KKworCisJLyogSGFuZGxlIGNvbW1hbmRzIGhlcmUgdGhhdCBkb24ndCByZWFsbHkgcmVxdWlyZSBnb2luZyBvdXQgdG8gdGhlIGFkYXB0ZXIgKi8KKwlzd2l0Y2ggKHNjc2ljbWQtPmNtbmRbMF0pIHsKKwljYXNlIElOUVVJUlk6CisJeworCQlzdHJ1Y3QgaW5xdWlyeV9kYXRhICppbnFfZGF0YV9wdHI7CisKKwkJZHByaW50aygoS0VSTl9ERUJVRyAiSU5RVUlSWSBjb21tYW5kLCBJRDogJWQuXG4iLCBzY3NpY21kLT5kZXZpY2UtPmlkKSk7CisJCWlucV9kYXRhX3B0ciA9IChzdHJ1Y3QgaW5xdWlyeV9kYXRhICopc2NzaWNtZC0+cmVxdWVzdF9idWZmZXI7CisJCW1lbXNldChpbnFfZGF0YV9wdHIsIDAsIHNpemVvZiAoc3RydWN0IGlucXVpcnlfZGF0YSkpOworCisJCWlucV9kYXRhX3B0ci0+aW5xZF92ZXIgPSAyOwkvKiBjbGFpbSBjb21wbGlhbmNlIHRvIFNDU0ktMiAqLworCQlpbnFfZGF0YV9wdHItPmlucWRfZHRxID0gMHg4MDsJLyogc2V0IFJNQiBiaXQgdG8gb25lIGluZGljYXRpbmcgdGhhdCB0aGUgbWVkaXVtIGlzIHJlbW92YWJsZSAqLworCQlpbnFfZGF0YV9wdHItPmlucWRfcmRmID0gMjsJLyogQSByZXNwb25zZSBkYXRhIGZvcm1hdCB2YWx1ZSBvZiB0d28gaW5kaWNhdGVzIHRoYXQgdGhlIGRhdGEgc2hhbGwgYmUgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgaW4gU0NTSS0yICovCisJCWlucV9kYXRhX3B0ci0+aW5xZF9sZW4gPSAzMTsKKwkJLypGb3JtYXQgZm9yICJwYWQyIiBpcyAgUmVsQWRyIHwgV0J1czMyIHwgV0J1czE2IHwgIFN5bmMgIHwgTGlua2VkIHxSZXNlcnZlZHwgQ21kUXVlIHwgU2Z0UmUgKi8KKwkJaW5xX2RhdGFfcHRyLT5pbnFkX3BhZDI9IDB4MzIgOwkgLypXQnVzMTZ8U3luY3xDbWRRdWUgKi8KKwkJLyoKKwkJICoJU2V0IHRoZSBWZW5kb3IsIFByb2R1Y3QsIGFuZCBSZXZpc2lvbiBMZXZlbAorCQkgKglzZWU6IDx2ZW5kb3I+LmMgaS5lLiBhYWMuYworCQkgKi8KKwkJaWYgKHNjc2ljbWQtPmRldmljZS0+aWQgPT0gaG9zdC0+dGhpc19pZCkgeworCQkJc2V0aW5xc3RyKGNhcmR0eXBlLCAodm9pZCAqKSAoaW5xX2RhdGFfcHRyLT5pbnFkX3ZpZCksIChzaXplb2YoY29udGFpbmVyX3R5cGVzKS9zaXplb2YoY2hhciAqKSkpOworCQkJaW5xX2RhdGFfcHRyLT5pbnFkX3BkdCA9IElOUURfUERUX1BST0M7CS8qIFByb2Nlc3NvciBkZXZpY2UgKi8KKwkJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0dPT0Q7CisJCQlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlzZXRpbnFzdHIoY2FyZHR5cGUsICh2b2lkICopIChpbnFfZGF0YV9wdHItPmlucWRfdmlkKSwgZnNhX2Rldl9wdHJbY2lkXS50eXBlKTsKKwkJaW5xX2RhdGFfcHRyLT5pbnFkX3BkdCA9IElOUURfUERUX0RBOwkvKiBEaXJlY3QvcmFuZG9tIGFjY2VzcyBkZXZpY2UgKi8KKwkJcmV0dXJuIGFhY19nZXRfY29udGFpbmVyX25hbWUoc2NzaWNtZCwgY2lkKTsKKwl9CisJY2FzZSBSRUFEX0NBUEFDSVRZOgorCXsKKwkJdTMyIGNhcGFjaXR5OworCQljaGFyICpjcDsKKworCQlkcHJpbnRrKChLRVJOX0RFQlVHICJSRUFEIENBUEFDSVRZIGNvbW1hbmQuXG4iKSk7CisJCWlmIChmc2FfZGV2X3B0cltjaWRdLnNpemUgPD0gMHgxMDAwMDAwMDBMTCkKKwkJCWNhcGFjaXR5ID0gZnNhX2Rldl9wdHJbY2lkXS5zaXplIC0gMTsKKwkJZWxzZQorCQkJY2FwYWNpdHkgPSAodTMyKS0xOworCQljcCA9IHNjc2ljbWQtPnJlcXVlc3RfYnVmZmVyOworCQljcFswXSA9IChjYXBhY2l0eSA+PiAyNCkgJiAweGZmOworCQljcFsxXSA9IChjYXBhY2l0eSA+PiAxNikgJiAweGZmOworCQljcFsyXSA9IChjYXBhY2l0eSA+PiA4KSAmIDB4ZmY7CisJCWNwWzNdID0gKGNhcGFjaXR5ID4+IDApICYgMHhmZjsKKwkJY3BbNF0gPSAwOworCQljcFs1XSA9IDA7CisJCWNwWzZdID0gMjsKKwkJY3BbN10gPSAwOworCisJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0dPT0Q7CisJCXNjc2ljbWQtPnNjc2lfZG9uZShzY3NpY21kKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIE1PREVfU0VOU0U6CisJeworCQljaGFyICptb2RlX2J1ZjsKKworCQlkcHJpbnRrKChLRVJOX0RFQlVHICJNT0RFIFNFTlNFIGNvbW1hbmQuXG4iKSk7CisJCW1vZGVfYnVmID0gc2NzaWNtZC0+cmVxdWVzdF9idWZmZXI7CisJCW1vZGVfYnVmWzBdID0gMzsJLyogTW9kZSBkYXRhIGxlbmd0aCAqLworCQltb2RlX2J1ZlsxXSA9IDA7CS8qIE1lZGl1bSB0eXBlIC0gZGVmYXVsdCAqLworCQltb2RlX2J1ZlsyXSA9IDA7CS8qIERldmljZS1zcGVjaWZpYyBwYXJhbSwgYml0IDg6IDAvMSA9IHdyaXRlIGVuYWJsZWQvcHJvdGVjdGVkICovCisJCW1vZGVfYnVmWzNdID0gMDsJLyogQmxvY2sgZGVzY3JpcHRvciBsZW5ndGggKi8KKworCQlzY3NpY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDggfCBTQU1fU1RBVF9HT09EOworCQlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgTU9ERV9TRU5TRV8xMDoKKwl7CisJCWNoYXIgKm1vZGVfYnVmOworCisJCWRwcmludGsoKEtFUk5fREVCVUcgIk1PREUgU0VOU0UgMTAgYnl0ZSBjb21tYW5kLlxuIikpOworCQltb2RlX2J1ZiA9IHNjc2ljbWQtPnJlcXVlc3RfYnVmZmVyOworCQltb2RlX2J1ZlswXSA9IDA7CS8qIE1vZGUgZGF0YSBsZW5ndGggKE1TQikgKi8KKwkJbW9kZV9idWZbMV0gPSA2OwkvKiBNb2RlIGRhdGEgbGVuZ3RoIChMU0IpICovCisJCW1vZGVfYnVmWzJdID0gMDsJLyogTWVkaXVtIHR5cGUgLSBkZWZhdWx0ICovCisJCW1vZGVfYnVmWzNdID0gMDsJLyogRGV2aWNlLXNwZWNpZmljIHBhcmFtLCBiaXQgODogMC8xID0gd3JpdGUgZW5hYmxlZC9wcm90ZWN0ZWQgKi8KKwkJbW9kZV9idWZbNF0gPSAwOwkvKiByZXNlcnZlZCAqLworCQltb2RlX2J1Zls1XSA9IDA7CS8qIHJlc2VydmVkICovCisJCW1vZGVfYnVmWzZdID0gMDsJLyogQmxvY2sgZGVzY3JpcHRvciBsZW5ndGggKE1TQikgKi8KKwkJbW9kZV9idWZbN10gPSAwOwkvKiBCbG9jayBkZXNjcmlwdG9yIGxlbmd0aCAoTFNCKSAqLworCisJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0dPT0Q7CisJCXNjc2ljbWQtPnNjc2lfZG9uZShzY3NpY21kKTsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBSRVFVRVNUX1NFTlNFOgorCQlkcHJpbnRrKChLRVJOX0RFQlVHICJSRVFVRVNUIFNFTlNFIGNvbW1hbmQuXG4iKSk7CisJCW1lbWNweShzY3NpY21kLT5zZW5zZV9idWZmZXIsICZkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhLCBzaXplb2YgKHN0cnVjdCBzZW5zZV9kYXRhKSk7CisJCW1lbXNldCgmZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc2Vuc2VfZGF0YSkpOworCQlzY3NpY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDggfCBTQU1fU1RBVF9HT09EOworCQlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7CisJCXJldHVybiAwOworCisJY2FzZSBBTExPV19NRURJVU1fUkVNT1ZBTDoKKwkJZHByaW50aygoS0VSTl9ERUJVRyAiTE9DSyBjb21tYW5kLlxuIikpOworCQlpZiAoc2NzaWNtZC0+Y21uZFs0XSkKKwkJCWZzYV9kZXZfcHRyW2NpZF0ubG9ja2VkID0gMTsKKwkJZWxzZQorCQkJZnNhX2Rldl9wdHJbY2lkXS5sb2NrZWQgPSAwOworCisJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0dPT0Q7CisJCXNjc2ljbWQtPnNjc2lfZG9uZShzY3NpY21kKTsKKwkJcmV0dXJuIDA7CisJLyoKKwkgKglUaGVzZSBjb21tYW5kcyBhcmUgYWxsIE5vLU9wcworCSAqLworCWNhc2UgVEVTVF9VTklUX1JFQURZOgorCWNhc2UgUkVTRVJWRToKKwljYXNlIFJFTEVBU0U6CisJY2FzZSBSRVpFUk9fVU5JVDoKKwljYXNlIFJFQVNTSUdOX0JMT0NLUzoKKwljYXNlIFNFRUtfMTA6CisJY2FzZSBTVEFSVF9TVE9QOgorCQlzY3NpY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDggfCBTQU1fU1RBVF9HT09EOworCQlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoc2NzaWNtZC0+Y21uZFswXSkgCisJeworCQljYXNlIFJFQURfNjoKKwkJY2FzZSBSRUFEXzEwOgorCQkJLyoKKwkJCSAqCUhhY2sgdG8ga2VlcCB0cmFjayBvZiBvcmRpbmFsIG51bWJlciBvZiB0aGUgZGV2aWNlIHRoYXQKKwkJCSAqCWNvcnJlc3BvbmRzIHRvIGEgY29udGFpbmVyLiBOZWVkZWQgdG8gY29udmVydAorCQkJICoJY29udGFpbmVycyB0byAvZGV2L3NkIGRldmljZSBuYW1lcworCQkJICovCisJCQkgCisJCQlzcGluX3VubG9ja19pcnEoaG9zdC0+aG9zdF9sb2NrKTsKKwkJCWlmICAoc2NzaWNtZC0+cmVxdWVzdC0+cnFfZGlzaykKKwkJCQltZW1jcHkoZnNhX2Rldl9wdHJbY2lkXS5kZXZuYW1lLAorCQkJCQlzY3NpY21kLT5yZXF1ZXN0LT5ycV9kaXNrLT5kaXNrX25hbWUsCisJCQkJCTgpOworCisJCQlyZXQgPSBhYWNfcmVhZChzY3NpY21kLCBjaWQpOworCQkJc3Bpbl9sb2NrX2lycShob3N0LT5ob3N0X2xvY2spOworCQkJcmV0dXJuIHJldDsKKworCQljYXNlIFdSSVRFXzY6CisJCWNhc2UgV1JJVEVfMTA6CisJCQlzcGluX3VubG9ja19pcnEoaG9zdC0+aG9zdF9sb2NrKTsKKwkJCXJldCA9IGFhY193cml0ZShzY3NpY21kLCBjaWQpOworCQkJc3Bpbl9sb2NrX2lycShob3N0LT5ob3N0X2xvY2spOworCQkJcmV0dXJuIHJldDsKKworCQljYXNlIFNZTkNIUk9OSVpFX0NBQ0hFOgorCQkJLyogSXNzdWUgRklCIHRvIHRlbGwgRmlybXdhcmUgdG8gZmx1c2ggaXQncyBjYWNoZSAqLworCQkJcmV0dXJuIGFhY19zeW5jaHJvbml6ZShzY3NpY21kLCBjaWQpOworCQkJCisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICoJVW5oYW5kbGVkIGNvbW1hbmRzCisJCQkgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuaGFuZGxlZCBTQ1NJIENvbW1hbmQ6IDB4JXguXG4iLCBzY3NpY21kLT5jbW5kWzBdKTsKKwkJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwkJCXNldF9zZW5zZSgodTggKikgJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCisJCQkJSUxMRUdBTF9SRVFVRVNULCBTRU5DT0RFX0lOVkFMSURfQ09NTUFORCwKKwkJCQlBU0VOQ09ERV9JTlZBTElEX0NPTU1BTkQsIDAsIDAsIDAsIDApOworCQkJbWVtY3B5KHNjc2ljbWQtPnNlbnNlX2J1ZmZlciwgJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCisJCQkgIChzaXplb2YoZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSkgPiBzaXplb2Yoc2NzaWNtZC0+c2Vuc2VfYnVmZmVyKSkKKwkJCSAgICA/IHNpemVvZihzY3NpY21kLT5zZW5zZV9idWZmZXIpCisJCQkgICAgOiBzaXplb2YoZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSkpOworCQkJc2NzaWNtZC0+c2NzaV9kb25lKHNjc2ljbWQpOworCQkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Rpc2soc3RydWN0IGFhY19kZXYgKmRldiwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgYWFjX3F1ZXJ5X2Rpc2sgcWQ7CisJc3RydWN0IGZzYV9kZXZfaW5mbyAqZnNhX2Rldl9wdHI7CisKKwlmc2FfZGV2X3B0ciA9IGRldi0+ZnNhX2RldjsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnFkLCBhcmcsIHNpemVvZiAoc3RydWN0IGFhY19xdWVyeV9kaXNrKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChxZC5jbnVtID09IC0xKQorCQlxZC5jbnVtID0gSURfTFVOX1RPX0NPTlRBSU5FUihxZC5pZCwgcWQubHVuKTsKKwllbHNlIGlmICgocWQuYnVzID09IC0xKSAmJiAocWQuaWQgPT0gLTEpICYmIChxZC5sdW4gPT0gLTEpKSAKKwl7CisJCWlmIChxZC5jbnVtIDwgMCB8fCBxZC5jbnVtID49IGRldi0+bWF4aW11bV9udW1fY29udGFpbmVycykKKwkJCXJldHVybiAtRUlOVkFMOworCQlxZC5pbnN0YW5jZSA9IGRldi0+c2NzaV9ob3N0X3B0ci0+aG9zdF9ubzsKKwkJcWQuYnVzID0gMDsKKwkJcWQuaWQgPSBDT05UQUlORVJfVE9fSUQocWQuY251bSk7CisJCXFkLmx1biA9IENPTlRBSU5FUl9UT19MVU4ocWQuY251bSk7CisJfQorCWVsc2UgcmV0dXJuIC1FSU5WQUw7CisKKwlxZC52YWxpZCA9IGZzYV9kZXZfcHRyW3FkLmNudW1dLnZhbGlkOworCXFkLmxvY2tlZCA9IGZzYV9kZXZfcHRyW3FkLmNudW1dLmxvY2tlZDsKKwlxZC5kZWxldGVkID0gZnNhX2Rldl9wdHJbcWQuY251bV0uZGVsZXRlZDsKKworCWlmIChmc2FfZGV2X3B0cltxZC5jbnVtXS5kZXZuYW1lWzBdID09ICdcMCcpCisJCXFkLnVubWFwcGVkID0gMTsKKwllbHNlCisJCXFkLnVubWFwcGVkID0gMDsKKworCXN0cmxjcHkocWQubmFtZSwgZnNhX2Rldl9wdHJbcWQuY251bV0uZGV2bmFtZSwKKwkgIG1pbihzaXplb2YocWQubmFtZSksIHNpemVvZihmc2FfZGV2X3B0cltxZC5jbnVtXS5kZXZuYW1lKSArIDEpKTsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmcWQsIHNpemVvZiAoc3RydWN0IGFhY19xdWVyeV9kaXNrKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZvcmNlX2RlbGV0ZV9kaXNrKHN0cnVjdCBhYWNfZGV2ICpkZXYsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGFhY19kZWxldGVfZGlzayBkZDsKKwlzdHJ1Y3QgZnNhX2Rldl9pbmZvICpmc2FfZGV2X3B0cjsKKworCWZzYV9kZXZfcHRyID0gZGV2LT5mc2FfZGV2OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZkZCwgYXJnLCBzaXplb2YgKHN0cnVjdCBhYWNfZGVsZXRlX2Rpc2spKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZGQuY251bSA+PSBkZXYtPm1heGltdW1fbnVtX2NvbnRhaW5lcnMpCisJCXJldHVybiAtRUlOVkFMOworCS8qCisJICoJTWFyayB0aGlzIGNvbnRhaW5lciBhcyBiZWluZyBkZWxldGVkLgorCSAqLworCWZzYV9kZXZfcHRyW2RkLmNudW1dLmRlbGV0ZWQgPSAxOworCS8qCisJICoJTWFyayB0aGUgY29udGFpbmVyIGFzIG5vIGxvbmdlciB2YWxpZAorCSAqLworCWZzYV9kZXZfcHRyW2RkLmNudW1dLnZhbGlkID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWxldGVfZGlzayhzdHJ1Y3QgYWFjX2RldiAqZGV2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBhYWNfZGVsZXRlX2Rpc2sgZGQ7CisJc3RydWN0IGZzYV9kZXZfaW5mbyAqZnNhX2Rldl9wdHI7CisKKwlmc2FfZGV2X3B0ciA9IGRldi0+ZnNhX2RldjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZGQsIGFyZywgc2l6ZW9mIChzdHJ1Y3QgYWFjX2RlbGV0ZV9kaXNrKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGRkLmNudW0gPj0gZGV2LT5tYXhpbXVtX251bV9jb250YWluZXJzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKgorCSAqCUlmIHRoZSBjb250YWluZXIgaXMgbG9ja2VkLCBpdCBjYW4gbm90IGJlIGRlbGV0ZWQgYnkgdGhlIEFQSS4KKwkgKi8KKwlpZiAoZnNhX2Rldl9wdHJbZGQuY251bV0ubG9ja2VkKQorCQlyZXR1cm4gLUVCVVNZOworCWVsc2UgeworCQkvKgorCQkgKglNYXJrIHRoZSBjb250YWluZXIgYXMgbm8gbG9uZ2VyIGJlaW5nIHZhbGlkLgorCQkgKi8KKwkJZnNhX2Rldl9wdHJbZGQuY251bV0udmFsaWQgPSAwOworCQlmc2FfZGV2X3B0cltkZC5jbnVtXS5kZXZuYW1lWzBdID0gJ1wwJzsKKwkJcmV0dXJuIDA7CisJfQorfQorCitpbnQgYWFjX2Rldl9pb2N0bChzdHJ1Y3QgYWFjX2RldiAqZGV2LCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBGU0FDVExfUVVFUllfRElTSzoKKwkJcmV0dXJuIHF1ZXJ5X2Rpc2soZGV2LCBhcmcpOworCWNhc2UgRlNBQ1RMX0RFTEVURV9ESVNLOgorCQlyZXR1cm4gZGVsZXRlX2Rpc2soZGV2LCBhcmcpOworCWNhc2UgRlNBQ1RMX0ZPUkNFX0RFTEVURV9ESVNLOgorCQlyZXR1cm4gZm9yY2VfZGVsZXRlX2Rpc2soZGV2LCBhcmcpOworCWNhc2UgRlNBQ1RMX0dFVF9DT05UQUlORVJTOgorCQlyZXR1cm4gYWFjX2dldF9jb250YWluZXJzKGRldik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorfQorCisvKioKKyAqCisgKiBhYWNfc3JiX2NhbGxiYWNrCisgKiBAY29udGV4dDogdGhlIGNvbnRleHQgc2V0IGluIHRoZSBmaWIgLSBoZXJlIGl0IGlzIHNjc2kgY21kCisgKiBAZmlicHRyOiBwb2ludGVyIHRvIHRoZSBmaWIKKyAqCisgKiBIYW5kbGVzIHRoZSBjb21wbGV0aW9uIG9mIGEgc2NzaSBjb21tYW5kIHRvIGEgbm9uIGRhc2QgZGV2aWNlCisgKgorICovCisKK3N0YXRpYyB2b2lkIGFhY19zcmJfY2FsbGJhY2sodm9pZCAqY29udGV4dCwgc3RydWN0IGZpYiAqIGZpYnB0cikKK3sKKwlzdHJ1Y3QgYWFjX2RldiAqZGV2OworCXN0cnVjdCBhYWNfc3JiX3JlcGx5ICpzcmJyZXBseTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kOworCisJc2NzaWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNvbnRleHQ7CisJZGV2ID0gKHN0cnVjdCBhYWNfZGV2ICopc2NzaWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCWlmIChmaWJwdHIgPT0gTlVMTCkKKwkJQlVHKCk7CisKKwlzcmJyZXBseSA9IChzdHJ1Y3QgYWFjX3NyYl9yZXBseSAqKSBmaWJfZGF0YShmaWJwdHIpOworCisJc2NzaWNtZC0+c2Vuc2VfYnVmZmVyWzBdID0gJ1wwJzsgIC8qIEluaXRpYWxpemUgc2Vuc2UgdmFsaWQgZmxhZyB0byBmYWxzZSAqLworCS8qCisJICoJQ2FsY3VsYXRlIHJlc2lkIGZvciBzZyAKKwkgKi8KKwkgCisJc2NzaWNtZC0+cmVzaWQgPSBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4gLSAKKwkJbGUzMl90b19jcHUoc3JicmVwbHktPmRhdGFfeGZlcl9sZW5ndGgpOworCisJaWYoc2NzaWNtZC0+dXNlX3NnKQorCQlwY2lfdW5tYXBfc2coZGV2LT5wZGV2LCAKKwkJCShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3NpY21kLT5idWZmZXIsCisJCQlzY3NpY21kLT51c2Vfc2csCisJCQlzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJZWxzZSBpZihzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4pCisJCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wZGV2LCBzY3NpY21kLT5TQ3AuZG1hX2hhbmRsZSwgc2NzaWNtZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJc2NzaWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCisJLyoKKwkgKiBGaXJzdCBjaGVjayB0aGUgZmliIHN0YXR1cworCSAqLworCisJaWYgKGxlMzJfdG9fY3B1KHNyYnJlcGx5LT5zdGF0dXMpICE9IFNUX09LKXsKKwkJaW50IGxlbjsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjX3NyYl9jYWxsYmFjazogc3JiIGZhaWxlZCwgc3RhdHVzID0gJWRcbiIsIGxlMzJfdG9fY3B1KHNyYnJlcGx5LT5zdGF0dXMpKTsKKwkJbGVuID0gKGxlMzJfdG9fY3B1KHNyYnJlcGx5LT5zZW5zZV9kYXRhX3NpemUpID4gCisJCQkJc2l6ZW9mKHNjc2ljbWQtPnNlbnNlX2J1ZmZlcikpID8KKwkJCQlzaXplb2Yoc2NzaWNtZC0+c2Vuc2VfYnVmZmVyKSA6IAorCQkJCWxlMzJfdG9fY3B1KHNyYnJlcGx5LT5zZW5zZV9kYXRhX3NpemUpOworCQlzY3NpY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDggfCBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CisJCW1lbWNweShzY3NpY21kLT5zZW5zZV9idWZmZXIsIHNyYnJlcGx5LT5zZW5zZV9kYXRhLCBsZW4pOworCX0KKworCS8qCisJICogTmV4dCBjaGVjayB0aGUgc3JiIHN0YXR1cworCSAqLworCXN3aXRjaCggKGxlMzJfdG9fY3B1KHNyYnJlcGx5LT5zcmJfc3RhdHVzKSkmMHgzZil7CisJY2FzZSBTUkJfU1RBVFVTX0VSUk9SX1JFQ09WRVJZOgorCWNhc2UgU1JCX1NUQVRVU19QRU5ESU5HOgorCWNhc2UgU1JCX1NUQVRVU19TVUNDRVNTOgorCQlpZihzY3NpY21kLT5jbW5kWzBdID09IElOUVVJUlkgKXsKKwkJCXU4IGI7CisJCQl1OCBiMTsKKwkJCS8qIFdlIGNhbid0IGV4cG9zZSBkaXNrIGRldmljZXMgYmVjYXVzZSB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIgdGhleQorCQkJICogYXJlIHRoZSByYXcgY29udGFpbmVyIGRyaXZlcyBvciBzdGFuZCBhbG9uZSBkcml2ZXMuICBJZiB0aGV5IGhhdmUKKwkJCSAqIHRoZSByZW1vdmFibGUgYml0IHNldCB0aGVuIHdlIHNob3VsZCBleHBvc2UgdGhlbSB0aG91Z2guCisJCQkgKi8KKwkJCWIgPSAoKih1OCopc2NzaWNtZC0+YnVmZmVyKSYweDFmOworCQkJYjEgPSAoKHU4KilzY3NpY21kLT5idWZmZXIpWzFdOworCQkJaWYoIGI9PVRZUEVfVEFQRSB8fCBiPT1UWVBFX1dPUk0gfHwgYj09VFlQRV9ST00gfHwgYj09VFlQRV9NT0R8fCBiPT1UWVBFX01FRElVTV9DSEFOR0VSIAorCQkJCQl8fCAoYj09VFlQRV9ESVNLICYmIChiMSYweDgwKSkgKXsKKwkJCQlzY3NpY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDg7CisJCQkvKgorCQkJICogV2Ugd2lsbCBhbGxvdyBkaXNrIGRldmljZXMgaWYgaW4gUkFJRC9TQ1NJIG1vZGUgYW5kCisJCQkgKiB0aGUgY2hhbm5lbCBpcyAyCisJCQkgKi8KKwkJCX0gZWxzZSBpZiAoKGRldi0+cmFpZF9zY3NpX21vZGUpICYmCisJCQkJCShzY3NpY21kLT5kZXZpY2UtPmNoYW5uZWwgPT0gMikpIHsKKwkJCQlzY3NpY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCAKKwkJCQkJCUNPTU1BTkRfQ09NUExFVEUgPDwgODsKKwkJCX0gZWxzZSB7CisJCQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTYgfCAKKwkJCQkJCUNPTU1BTkRfQ09NUExFVEUgPDwgODsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgODsKKwkJfQorCQlicmVhazsKKwljYXNlIFNSQl9TVEFUVVNfREFUQV9PVkVSUlVOOgorCQlzd2l0Y2goc2NzaWNtZC0+Y21uZFswXSl7CisJCWNhc2UgIFJFQURfNjoKKwkJY2FzZSAgV1JJVEVfNjoKKwkJY2FzZSAgUkVBRF8xMDoKKwkJY2FzZSAgV1JJVEVfMTA6CisJCWNhc2UgIFJFQURfMTI6CisJCWNhc2UgIFdSSVRFXzEyOgorCQkJaWYobGUzMl90b19jcHUoc3JicmVwbHktPmRhdGFfeGZlcl9sZW5ndGgpIDwgc2NzaWNtZC0+dW5kZXJmbG93ICkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkciYWFjcmFpZDogU0NTSSBDTUQgdW5kZXJmbG93XG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyJhYWNyYWlkOiBTQ1NJIENNRCBEYXRhIE92ZXJydW5cbiIpOworCQkJfQorCQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4OworCQkJYnJlYWs7CisJCWNhc2UgSU5RVUlSWTogeworCQkJdTggYjsKKwkJCXU4IGIxOworCQkJLyogV2UgY2FuJ3QgZXhwb3NlIGRpc2sgZGV2aWNlcyBiZWNhdXNlIHdlIGNhbid0IHRlbGwgd2hldGhlciB0aGV5CisJCQkqIGFyZSB0aGUgcmF3IGNvbnRhaW5lciBkcml2ZXMgb3Igc3RhbmQgYWxvbmUgZHJpdmVzCisJCQkqLworCQkJYiA9ICgqKHU4KilzY3NpY21kLT5idWZmZXIpJjB4MGY7CisJCQliMSA9ICgodTgqKXNjc2ljbWQtPmJ1ZmZlcilbMV07CisJCQlpZiggYj09VFlQRV9UQVBFIHx8IGI9PVRZUEVfV09STSB8fCBiPT1UWVBFX1JPTSB8fCBiPT1UWVBFX01PRHx8IGI9PVRZUEVfTUVESVVNX0NIQU5HRVIKKwkJCQkJfHwgKGI9PVRZUEVfRElTSyAmJiAoYjEmMHg4MCkpICl7CisJCQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4OworCQkJLyoKKwkJCSAqIFdlIHdpbGwgYWxsb3cgZGlzayBkZXZpY2VzIGlmIGluIFJBSUQvU0NTSSBtb2RlIGFuZAorCQkJICogdGhlIGNoYW5uZWwgaXMgMgorCQkJICovCisJCQl9IGVsc2UgaWYgKChkZXYtPnJhaWRfc2NzaV9tb2RlKSAmJgorCQkJCQkoc2NzaWNtZC0+ZGV2aWNlLT5jaGFubmVsID09IDIpKSB7CisJCQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgCisJCQkJCQlDT01NQU5EX0NPTVBMRVRFIDw8IDg7CisJCQl9IGVsc2UgeworCQkJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2IHwgCisJCQkJCQlDT01NQU5EX0NPTVBMRVRFIDw8IDg7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4OworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTUkJfU1RBVFVTX0FCT1JURUQ6CisJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNiB8IEFCT1JUIDw8IDg7CisJCWJyZWFrOworCWNhc2UgU1JCX1NUQVRVU19BQk9SVF9GQUlMRUQ6CisJCS8vIE5vdCBzdXJlIGFib3V0IHRoaXMgb25lIC0gYnV0IGFzc3VtaW5nIHRoZSBoYmEgd2FzIHRyeWluZyB0byBhYm9ydCBmb3Igc29tZSByZWFzb24KKwkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2IHwgQUJPUlQgPDwgODsKKwkJYnJlYWs7CisJY2FzZSBTUkJfU1RBVFVTX1BBUklUWV9FUlJPUjoKKwkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX1BBUklUWSA8PCAxNiB8IE1TR19QQVJJVFlfRVJST1IgPDwgODsKKwkJYnJlYWs7CisJY2FzZSBTUkJfU1RBVFVTX05PX0RFVklDRToKKwljYXNlIFNSQl9TVEFUVVNfSU5WQUxJRF9QQVRIX0lEOgorCWNhc2UgU1JCX1NUQVRVU19JTlZBTElEX1RBUkdFVF9JRDoKKwljYXNlIFNSQl9TVEFUVVNfSU5WQUxJRF9MVU46CisJY2FzZSBTUkJfU1RBVFVTX1NFTEVDVElPTl9USU1FT1VUOgorCQlzY3NpY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgODsKKwkJYnJlYWs7CisKKwljYXNlIFNSQl9TVEFUVVNfQ09NTUFORF9USU1FT1VUOgorCWNhc2UgU1JCX1NUQVRVU19USU1FT1VUOgorCQlzY3NpY21kLT5yZXN1bHQgPSBESURfVElNRV9PVVQgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDg7CisJCWJyZWFrOworCisJY2FzZSBTUkJfU1RBVFVTX0JVU1k6CisJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4OworCQlicmVhazsKKworCWNhc2UgU1JCX1NUQVRVU19CVVNfUkVTRVQ6CisJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgODsKKwkJYnJlYWs7CisKKwljYXNlIFNSQl9TVEFUVVNfTUVTU0FHRV9SRUpFQ1RFRDoKKwkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2IHwgTUVTU0FHRV9SRUpFQ1QgPDwgODsKKwkJYnJlYWs7CisJY2FzZSBTUkJfU1RBVFVTX1JFUVVFU1RfRkxVU0hFRDoKKwljYXNlIFNSQl9TVEFUVVNfRVJST1I6CisJY2FzZSBTUkJfU1RBVFVTX0lOVkFMSURfUkVRVUVTVDoKKwljYXNlIFNSQl9TVEFUVVNfUkVRVUVTVF9TRU5TRV9GQUlMRUQ6CisJY2FzZSBTUkJfU1RBVFVTX05PX0hCQToKKwljYXNlIFNSQl9TVEFUVVNfVU5FWFBFQ1RFRF9CVVNfRlJFRToKKwljYXNlIFNSQl9TVEFUVVNfUEhBU0VfU0VRVUVOQ0VfRkFJTFVSRToKKwljYXNlIFNSQl9TVEFUVVNfQkFEX1NSQl9CTE9DS19MRU5HVEg6CisJY2FzZSBTUkJfU1RBVFVTX0RFTEFZRURfUkVUUlk6CisJY2FzZSBTUkJfU1RBVFVTX0JBRF9GVU5DVElPTjoKKwljYXNlIFNSQl9TVEFUVVNfTk9UX1NUQVJURUQ6CisJY2FzZSBTUkJfU1RBVFVTX05PVF9JTl9VU0U6CisJY2FzZSBTUkJfU1RBVFVTX0ZPUkNFX0FCT1JUOgorCWNhc2UgU1JCX1NUQVRVU19ET01BSU5fVkFMSURBVElPTl9GQUlMOgorCWRlZmF1bHQ6CisjaWZkZWYgQUFDX0RFVEFJTEVEX1NUQVRVU19JTkZPCisJCXByaW50aygiYWFjcmFpZDogU1JCIEVSUk9SKCV1KSAlcyBzY3NpIGNtZCAweCV4IC0gc2NzaSBzdGF0dXMgMHgleFxuIiwKKwkJCWxlMzJfdG9fY3B1KHNyYnJlcGx5LT5zcmJfc3RhdHVzKSAmIDB4M0YsCisJCQlhYWNfZ2V0X3N0YXR1c19zdHJpbmcoCisJCQkJbGUzMl90b19jcHUoc3JicmVwbHktPnNyYl9zdGF0dXMpICYgMHgzRiksIAorCQkJc2NzaWNtZC0+Y21uZFswXSwgCisJCQlsZTMyX3RvX2NwdShzcmJyZXBseS0+c2NzaV9zdGF0dXMpKTsKKyNlbmRpZgorCQlzY3NpY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDg7CisJCWJyZWFrOworCX0KKwlpZiAobGUzMl90b19jcHUoc3JicmVwbHktPnNjc2lfc3RhdHVzKSA9PSAweDAyICl7ICAvLyBDaGVjayBDb25kaXRpb24KKwkJaW50IGxlbjsKKwkJc2NzaWNtZC0+cmVzdWx0IHw9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwkJbGVuID0gKGxlMzJfdG9fY3B1KHNyYnJlcGx5LT5zZW5zZV9kYXRhX3NpemUpID4gCisJCQkJc2l6ZW9mKHNjc2ljbWQtPnNlbnNlX2J1ZmZlcikpID8KKwkJCQlzaXplb2Yoc2NzaWNtZC0+c2Vuc2VfYnVmZmVyKSA6CisJCQkJbGUzMl90b19jcHUoc3JicmVwbHktPnNlbnNlX2RhdGFfc2l6ZSk7CisjaWZkZWYgQUFDX0RFVEFJTEVEX1NUQVRVU19JTkZPCisJCWRwcmludGsoKEtFUk5fV0FSTklORyAiYWFjX3NyYl9jYWxsYmFjazogY2hlY2sgY29uZGl0aW9uLCBzdGF0dXMgPSAlZCBsZW49JWRcbiIsIAorCQkJCQlsZTMyX3RvX2NwdShzcmJyZXBseS0+c3RhdHVzKSwgbGVuKSk7CisjZW5kaWYKKwkJbWVtY3B5KHNjc2ljbWQtPnNlbnNlX2J1ZmZlciwgc3JicmVwbHktPnNlbnNlX2RhdGEsIGxlbik7CisJCQorCX0KKwkvKgorCSAqIE9SIGluIHRoZSBzY3NpIHN0YXR1cyAoYWxyZWFkeSBzaGlmdGVkIHVwIGEgYml0KQorCSAqLworCXNjc2ljbWQtPnJlc3VsdCB8PSBsZTMyX3RvX2NwdShzcmJyZXBseS0+c2NzaV9zdGF0dXMpOworCisJZmliX2NvbXBsZXRlKGZpYnB0cik7CisJZmliX2ZyZWUoZmlicHRyKTsKKwlhYWNfaW9fZG9uZShzY3NpY21kKTsKK30KKworLyoqCisgKgorICogYWFjX3NlbmRfc2NiX2ZpYgorICogQHNjc2ljbWQ6IHRoZSBzY3NpIGNvbW1hbmQgYmxvY2sKKyAqCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBmb3JtIGEgRklCIGFuZCBmaWxsIGluIHRoZSBhYWNfc3JiIGZyb20gdGhlIAorICogc2NzaWNtZCBwYXNzZWQgaW4uCisgKi8KKworc3RhdGljIGludCBhYWNfc2VuZF9zcmJfZmliKHN0cnVjdCBzY3NpX2NtbmQqIHNjc2ljbWQpCit7CisJc3RydWN0IGZpYiogY21kX2ZpYmNvbnRleHQ7CisJc3RydWN0IGFhY19kZXYqIGRldjsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBhYWNfc3JiICpzcmJjbWQ7CisJdTE2IGZpYnNpemU7CisJdTMyIGZsYWc7CisJdTMyIHRpbWVvdXQ7CisKKwlpZiggc2NzaWNtZC0+ZGV2aWNlLT5pZCA+IDE1IHx8IHNjc2ljbWQtPmRldmljZS0+bHVuID4gNykgeworCQlzY3NpY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJc2NzaWNtZC0+c2NzaV9kb25lKHNjc2ljbWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXYgPSAoc3RydWN0IGFhY19kZXYgKilzY3NpY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXN3aXRjaChzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbil7CisJY2FzZSBETUFfVE9fREVWSUNFOgorCQlmbGFnID0gU1JCX0RhdGFPdXQ7CisJCWJyZWFrOworCWNhc2UgRE1BX0JJRElSRUNUSU9OQUw6CisJCWZsYWcgPSBTUkJfRGF0YUluIHwgU1JCX0RhdGFPdXQ7CisJCWJyZWFrOworCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQlmbGFnID0gU1JCX0RhdGFJbjsKKwkJYnJlYWs7CisJY2FzZSBETUFfTk9ORToKKwlkZWZhdWx0OgkvKiBzaHV0cyB1cCBzb21lIHZlcnNpb25zIG9mIGdjYyAqLworCQlmbGFnID0gU1JCX05vRGF0YVhmZXI7CisJCWJyZWFrOworCX0KKworCisJLyoKKwkgKglBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIEZpYiB0aGVuIHNldHVwIGEgQmxvY2tXcml0ZSBjb21tYW5kCisJICovCisJaWYgKCEoY21kX2ZpYmNvbnRleHQgPSBmaWJfYWxsb2MoZGV2KSkpIHsKKwkJcmV0dXJuIC0xOworCX0KKwlmaWJfaW5pdChjbWRfZmliY29udGV4dCk7CisKKwlzcmJjbWQgPSAoc3RydWN0IGFhY19zcmIqKSBmaWJfZGF0YShjbWRfZmliY29udGV4dCk7CisJc3JiY21kLT5mdW5jdGlvbiA9IGNwdV90b19sZTMyKFNSQkZfRXhlY3V0ZVNjc2kpOworCXNyYmNtZC0+Y2hhbm5lbCAgPSBjcHVfdG9fbGUzMihhYWNfbG9naWNhbF90b19waHlzKHNjc2ljbWQtPmRldmljZS0+Y2hhbm5lbCkpOworCXNyYmNtZC0+aWQgICA9IGNwdV90b19sZTMyKHNjc2ljbWQtPmRldmljZS0+aWQpOworCXNyYmNtZC0+bHVuICAgICAgPSBjcHVfdG9fbGUzMihzY3NpY21kLT5kZXZpY2UtPmx1bik7CisJc3JiY21kLT5mbGFncyAgICA9IGNwdV90b19sZTMyKGZsYWcpOworCXRpbWVvdXQgPSAoc2NzaWNtZC0+dGltZW91dC1qaWZmaWVzKS9IWjsKKwlpZih0aW1lb3V0ID09IDApeworCQl0aW1lb3V0ID0gMTsKKwl9CisJc3JiY21kLT50aW1lb3V0ICA9IGNwdV90b19sZTMyKHRpbWVvdXQpOyAgLy8gdGltZW91dCBpbiBzZWNvbmRzCisJc3JiY21kLT5yZXRyeV9saW1pdCA9IDA7IC8qIE9ic29sZXRlIHBhcmFtZXRlciAqLworCXNyYmNtZC0+Y2RiX3NpemUgPSBjcHVfdG9fbGUzMihzY3NpY21kLT5jbWRfbGVuKTsKKwkKKwlpZiggZGV2LT5kYWNfc3VwcG9ydCA9PSAxICkgeworCQlhYWNfYnVpbGRfc2c2NChzY3NpY21kLCAoc3RydWN0IHNnbWFwNjQqKSAmc3JiY21kLT5zZyk7CisJCXNyYmNtZC0+Y291bnQgPSBjcHVfdG9fbGUzMihzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCisJCW1lbXNldChzcmJjbWQtPmNkYiwgMCwgc2l6ZW9mKHNyYmNtZC0+Y2RiKSk7CisJCW1lbWNweShzcmJjbWQtPmNkYiwgc2NzaWNtZC0+Y21uZCwgc2NzaWNtZC0+Y21kX2xlbik7CisJCS8qCisJCSAqCUJ1aWxkIFNjYXR0ZXIvR2F0aGVyIGxpc3QKKwkJICovCisJCWZpYnNpemUgPSBzaXplb2YgKHN0cnVjdCBhYWNfc3JiKSAtIHNpemVvZiAoc3RydWN0IHNnZW50cnkpICsKKwkJCSgobGUzMl90b19jcHUoc3JiY21kLT5zZy5jb3VudCkgJiAweGZmKSAqIAorCQkJIHNpemVvZiAoc3RydWN0IHNnZW50cnk2NCkpOworCQlCVUdfT04gKGZpYnNpemUgPiAoc2l6ZW9mKHN0cnVjdCBod19maWIpIC0gCisJCQkJCXNpemVvZihzdHJ1Y3QgYWFjX2ZpYmhkcikpKTsKKworCQkvKgorCQkgKglOb3cgc2VuZCB0aGUgRmliIHRvIHRoZSBhZGFwdGVyCisJCSAqLworCQlzdGF0dXMgPSBmaWJfc2VuZChTY3NpUG9ydENvbW1hbmQ2NCwgY21kX2ZpYmNvbnRleHQsIAorCQkJCWZpYnNpemUsIEZzYU5vcm1hbCwgMCwgMSwKKwkJCQkgIChmaWJfY2FsbGJhY2spIGFhY19zcmJfY2FsbGJhY2ssIAorCQkJCSAgKHZvaWQgKikgc2NzaWNtZCk7CisJfSBlbHNlIHsKKwkJYWFjX2J1aWxkX3NnKHNjc2ljbWQsIChzdHJ1Y3Qgc2dtYXAqKSZzcmJjbWQtPnNnKTsKKwkJc3JiY21kLT5jb3VudCA9IGNwdV90b19sZTMyKHNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbik7CisKKwkJbWVtc2V0KHNyYmNtZC0+Y2RiLCAwLCBzaXplb2Yoc3JiY21kLT5jZGIpKTsKKwkJbWVtY3B5KHNyYmNtZC0+Y2RiLCBzY3NpY21kLT5jbW5kLCBzY3NpY21kLT5jbWRfbGVuKTsKKwkJLyoKKwkJICoJQnVpbGQgU2NhdHRlci9HYXRoZXIgbGlzdAorCQkgKi8KKwkJZmlic2l6ZSA9IHNpemVvZiAoc3RydWN0IGFhY19zcmIpICsgCisJCQkoKChsZTMyX3RvX2NwdShzcmJjbWQtPnNnLmNvdW50KSAmIDB4ZmYpIC0gMSkgKiAKKwkJCSBzaXplb2YgKHN0cnVjdCBzZ2VudHJ5KSk7CisJCUJVR19PTiAoZmlic2l6ZSA+IChzaXplb2Yoc3RydWN0IGh3X2ZpYikgLSAKKwkJCQkJc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKSkpOworCisJCS8qCisJCSAqCU5vdyBzZW5kIHRoZSBGaWIgdG8gdGhlIGFkYXB0ZXIKKwkJICovCisJCXN0YXR1cyA9IGZpYl9zZW5kKFNjc2lQb3J0Q29tbWFuZCwgY21kX2ZpYmNvbnRleHQsIGZpYnNpemUsIEZzYU5vcm1hbCwgMCwgMSwKKwkJCQkgIChmaWJfY2FsbGJhY2spIGFhY19zcmJfY2FsbGJhY2ssICh2b2lkICopIHNjc2ljbWQpOworCX0KKwkvKgorCSAqCUNoZWNrIHRoYXQgdGhlIGNvbW1hbmQgcXVldWVkIHRvIHRoZSBjb250cm9sbGVyCisJICovCisJaWYgKHN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpeworCQlyZXR1cm4gMDsKKwl9CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJhYWNfc3JiOiBmaWJfc2VuZCBmYWlsZWQgd2l0aCBzdGF0dXM6ICVkXG4iLCBzdGF0dXMpOworCWZpYl9jb21wbGV0ZShjbWRfZmliY29udGV4dCk7CisJZmliX2ZyZWUoY21kX2ZpYmNvbnRleHQpOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhYWNfYnVpbGRfc2coc3RydWN0IHNjc2lfY21uZCogc2NzaWNtZCwgc3RydWN0IHNnbWFwKiBwc2cpCit7CisJc3RydWN0IGFhY19kZXYgKmRldjsKKwl1bnNpZ25lZCBsb25nIGJ5dGVfY291bnQgPSAwOworCisJZGV2ID0gKHN0cnVjdCBhYWNfZGV2ICopc2NzaWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwkvLyBHZXQgcmlkIG9mIG9sZCBkYXRhCisJcHNnLT5jb3VudCA9IDA7CisJcHNnLT5zZ1swXS5hZGRyID0gMDsKKwlwc2ctPnNnWzBdLmNvdW50ID0gMDsgIAorCWlmIChzY3NpY21kLT51c2Vfc2cpIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwkJaW50IGk7CisJCWludCBzZ19jb3VudDsKKwkJc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIHNjc2ljbWQtPnJlcXVlc3RfYnVmZmVyOworCisJCXNnX2NvdW50ID0gcGNpX21hcF9zZyhkZXYtPnBkZXYsIHNnLCBzY3NpY21kLT51c2Vfc2csCisJCQlzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCXBzZy0+Y291bnQgPSBjcHVfdG9fbGUzMihzZ19jb3VudCk7CisKKwkJYnl0ZV9jb3VudCA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IHNnX2NvdW50OyBpKyspIHsKKwkJCXBzZy0+c2dbaV0uYWRkciA9IGNwdV90b19sZTMyKHNnX2RtYV9hZGRyZXNzKHNnKSk7CisJCQlwc2ctPnNnW2ldLmNvdW50ID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzZykpOworCQkJYnl0ZV9jb3VudCArPSBzZ19kbWFfbGVuKHNnKTsKKwkJCXNnKys7CisJCX0KKwkJLyogaGJhIHdhbnRzIHRoZSBzaXplIHRvIGJlIGV4YWN0ICovCisJCWlmKGJ5dGVfY291bnQgPiBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4peworCQkJcHNnLT5zZ1tpLTFdLmNvdW50IC09IChieXRlX2NvdW50IC0gc2NzaWNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwkJCWJ5dGVfY291bnQgPSBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCX0KKwkJLyogQ2hlY2sgZm9yIGNvbW1hbmQgdW5kZXJmbG93ICovCisJCWlmKHNjc2ljbWQtPnVuZGVyZmxvdyAmJiAoYnl0ZV9jb3VudCA8IHNjc2ljbWQtPnVuZGVyZmxvdykpeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyJhYWNyYWlkOiBjbWQgbGVuICUwOGxYIGNtZCB1bmRlcmZsb3cgJTA4WFxuIiwKKwkJCQkJYnl0ZV9jb3VudCwgc2NzaWNtZC0+dW5kZXJmbG93KTsKKwkJfQorCX0KKwllbHNlIGlmKHNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbikgeworCQlkbWFfYWRkcl90IGFkZHI7IAorCQlhZGRyID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wZGV2LAorCQkJCXNjc2ljbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCXNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQlzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCXBzZy0+Y291bnQgPSBjcHVfdG9fbGUzMigxKTsKKwkJcHNnLT5zZ1swXS5hZGRyID0gY3B1X3RvX2xlMzIoYWRkcik7CisJCXBzZy0+c2dbMF0uY291bnQgPSBjcHVfdG9fbGUzMihzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOyAgCisJCXNjc2ljbWQtPlNDcC5kbWFfaGFuZGxlID0gYWRkcjsKKwkJYnl0ZV9jb3VudCA9IHNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwl9CisJcmV0dXJuIGJ5dGVfY291bnQ7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWFjX2J1aWxkX3NnNjQoc3RydWN0IHNjc2lfY21uZCogc2NzaWNtZCwgc3RydWN0IHNnbWFwNjQqIHBzZykKK3sKKwlzdHJ1Y3QgYWFjX2RldiAqZGV2OworCXVuc2lnbmVkIGxvbmcgYnl0ZV9jb3VudCA9IDA7CisJdTY0IGxlX2FkZHI7CisKKwlkZXYgPSAoc3RydWN0IGFhY19kZXYgKilzY3NpY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCS8vIEdldCByaWQgb2Ygb2xkIGRhdGEKKwlwc2ctPmNvdW50ID0gMDsKKwlwc2ctPnNnWzBdLmFkZHJbMF0gPSAwOworCXBzZy0+c2dbMF0uYWRkclsxXSA9IDA7CisJcHNnLT5zZ1swXS5jb3VudCA9IDA7CisJaWYgKHNjc2ljbWQtPnVzZV9zZykgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCQlpbnQgaTsKKwkJaW50IHNnX2NvdW50OworCQlzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgc2NzaWNtZC0+cmVxdWVzdF9idWZmZXI7CisKKwkJc2dfY291bnQgPSBwY2lfbWFwX3NnKGRldi0+cGRldiwgc2csIHNjc2ljbWQtPnVzZV9zZywKKwkJCXNjc2ljbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJcHNnLT5jb3VudCA9IGNwdV90b19sZTMyKHNnX2NvdW50KTsKKworCQlieXRlX2NvdW50ID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgc2dfY291bnQ7IGkrKykgeworCQkJbGVfYWRkciA9IGNwdV90b19sZTY0KHNnX2RtYV9hZGRyZXNzKHNnKSk7CisJCQlwc2ctPnNnW2ldLmFkZHJbMV0gPSAodTMyKShsZV9hZGRyPj4zMik7CisJCQlwc2ctPnNnW2ldLmFkZHJbMF0gPSAodTMyKShsZV9hZGRyICYgMHhmZmZmZmZmZik7CisJCQlwc2ctPnNnW2ldLmNvdW50ID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzZykpOworCQkJYnl0ZV9jb3VudCArPSBzZ19kbWFfbGVuKHNnKTsKKwkJCXNnKys7CisJCX0KKwkJLyogaGJhIHdhbnRzIHRoZSBzaXplIHRvIGJlIGV4YWN0ICovCisJCWlmKGJ5dGVfY291bnQgPiBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4peworCQkJcHNnLT5zZ1tpLTFdLmNvdW50IC09IChieXRlX2NvdW50IC0gc2NzaWNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwkJCWJ5dGVfY291bnQgPSBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCX0KKwkJLyogQ2hlY2sgZm9yIGNvbW1hbmQgdW5kZXJmbG93ICovCisJCWlmKHNjc2ljbWQtPnVuZGVyZmxvdyAmJiAoYnl0ZV9jb3VudCA8IHNjc2ljbWQtPnVuZGVyZmxvdykpeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyJhYWNyYWlkOiBjbWQgbGVuICUwOGxYIGNtZCB1bmRlcmZsb3cgJTA4WFxuIiwKKwkJCQkJYnl0ZV9jb3VudCwgc2NzaWNtZC0+dW5kZXJmbG93KTsKKwkJfQorCX0KKwllbHNlIGlmKHNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbikgeworCQlkbWFfYWRkcl90IGFkZHI7IAorCQlhZGRyID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wZGV2LAorCQkJCXNjc2ljbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCXNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQlzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCXBzZy0+Y291bnQgPSBjcHVfdG9fbGUzMigxKTsKKwkJbGVfYWRkciA9IGNwdV90b19sZTY0KGFkZHIpOworCQlwc2ctPnNnWzBdLmFkZHJbMV0gPSAodTMyKShsZV9hZGRyPj4zMik7CisJCXBzZy0+c2dbMF0uYWRkclswXSA9ICh1MzIpKGxlX2FkZHIgJiAweGZmZmZmZmZmKTsKKwkJcHNnLT5zZ1swXS5jb3VudCA9IGNwdV90b19sZTMyKHNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbik7ICAKKwkJc2NzaWNtZC0+U0NwLmRtYV9oYW5kbGUgPSBhZGRyOworCQlieXRlX2NvdW50ID0gc2NzaWNtZC0+cmVxdWVzdF9idWZmbGVuOworCX0KKwlyZXR1cm4gYnl0ZV9jb3VudDsKK30KKworI2lmZGVmIEFBQ19ERVRBSUxFRF9TVEFUVVNfSU5GTworCitzdHJ1Y3QgYWFjX3NyYl9zdGF0dXNfaW5mbyB7CisJdTMyCXN0YXR1czsKKwljaGFyCSpzdHI7Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgYWFjX3NyYl9zdGF0dXNfaW5mbyBzcmJfc3RhdHVzX2luZm9bXSA9IHsKKwl7IFNSQl9TVEFUVVNfUEVORElORywJCSJQZW5kaW5nIFN0YXR1cyJ9LAorCXsgU1JCX1NUQVRVU19TVUNDRVNTLAkJIlN1Y2Nlc3MifSwKKwl7IFNSQl9TVEFUVVNfQUJPUlRFRCwJCSJBYm9ydGVkIENvbW1hbmQifSwKKwl7IFNSQl9TVEFUVVNfQUJPUlRfRkFJTEVELAkiQWJvcnQgRmFpbGVkIn0sCisJeyBTUkJfU1RBVFVTX0VSUk9SLAkJIkVycm9yIEV2ZW50In0sIAorCXsgU1JCX1NUQVRVU19CVVNZLAkJIkRldmljZSBCdXN5In0sCisJeyBTUkJfU1RBVFVTX0lOVkFMSURfUkVRVUVTVCwJIkludmFsaWQgUmVxdWVzdCJ9LAorCXsgU1JCX1NUQVRVU19JTlZBTElEX1BBVEhfSUQsCSJJbnZhbGlkIFBhdGggSUQifSwKKwl7IFNSQl9TVEFUVVNfTk9fREVWSUNFLAkJIk5vIERldmljZSJ9LAorCXsgU1JCX1NUQVRVU19USU1FT1VULAkJIlRpbWVvdXQifSwKKwl7IFNSQl9TVEFUVVNfU0VMRUNUSU9OX1RJTUVPVVQsCSJTZWxlY3Rpb24gVGltZW91dCJ9LAorCXsgU1JCX1NUQVRVU19DT01NQU5EX1RJTUVPVVQsCSJDb21tYW5kIFRpbWVvdXQifSwKKwl7IFNSQl9TVEFUVVNfTUVTU0FHRV9SRUpFQ1RFRCwJIk1lc3NhZ2UgUmVqZWN0ZWQifSwKKwl7IFNSQl9TVEFUVVNfQlVTX1JFU0VULAkJIkJ1cyBSZXNldCJ9LAorCXsgU1JCX1NUQVRVU19QQVJJVFlfRVJST1IsCSJQYXJpdHkgRXJyb3IifSwKKwl7IFNSQl9TVEFUVVNfUkVRVUVTVF9TRU5TRV9GQUlMRUQsIlJlcXVlc3QgU2Vuc2UgRmFpbGVkIn0sCisJeyBTUkJfU1RBVFVTX05PX0hCQSwJCSJObyBIQkEifSwKKwl7IFNSQl9TVEFUVVNfREFUQV9PVkVSUlVOLAkiRGF0YSBPdmVycnVuL0RhdGEgVW5kZXJydW4ifSwKKwl7IFNSQl9TVEFUVVNfVU5FWFBFQ1RFRF9CVVNfRlJFRSwiVW5leHBlY3RlZCBCdXMgRnJlZSJ9LAorCXsgU1JCX1NUQVRVU19QSEFTRV9TRVFVRU5DRV9GQUlMVVJFLCJQaGFzZSBFcnJvciJ9LAorCXsgU1JCX1NUQVRVU19CQURfU1JCX0JMT0NLX0xFTkdUSCwiQmFkIFNyYiBCbG9jayBMZW5ndGgifSwKKwl7IFNSQl9TVEFUVVNfUkVRVUVTVF9GTFVTSEVELAkiUmVxdWVzdCBGbHVzaGVkIn0sCisJeyBTUkJfU1RBVFVTX0RFTEFZRURfUkVUUlksCSJEZWxheWVkIFJldHJ5In0sCisJeyBTUkJfU1RBVFVTX0lOVkFMSURfTFVOLAkiSW52YWxpZCBMVU4ifSwgCisJeyBTUkJfU1RBVFVTX0lOVkFMSURfVEFSR0VUX0lELAkiSW52YWxpZCBUQVJHRVQgSUQifSwKKwl7IFNSQl9TVEFUVVNfQkFEX0ZVTkNUSU9OLAkiQmFkIEZ1bmN0aW9uIn0sCisJeyBTUkJfU1RBVFVTX0VSUk9SX1JFQ09WRVJZLAkiRXJyb3IgUmVjb3ZlcnkifSwKKwl7IFNSQl9TVEFUVVNfTk9UX1NUQVJURUQsCSJOb3QgU3RhcnRlZCJ9LAorCXsgU1JCX1NUQVRVU19OT1RfSU5fVVNFLAkiTm90IEluIFVzZSJ9LAorICAgIAl7IFNSQl9TVEFUVVNfRk9SQ0VfQUJPUlQsCSJGb3JjZSBBYm9ydCJ9LAorCXsgU1JCX1NUQVRVU19ET01BSU5fVkFMSURBVElPTl9GQUlMLCJEb21haW4gVmFsaWRhdGlvbiBGYWlsdXJlIn0sCisJeyAweGZmLAkJCQkiVW5rbm93biBFcnJvciJ9Cit9OworCitjaGFyICphYWNfZ2V0X3N0YXR1c19zdHJpbmcodTMyIHN0YXR1cykKK3sKKwlpbnQgaTsKKworCWZvcihpPTA7IGkgPCAoc2l6ZW9mKHNyYl9zdGF0dXNfaW5mbykvc2l6ZW9mKHN0cnVjdCBhYWNfc3JiX3N0YXR1c19pbmZvKSk7IGkrKyApeworCQlpZihzcmJfc3RhdHVzX2luZm9baV0uc3RhdHVzID09IHN0YXR1cyl7CisJCQlyZXR1cm4gc3JiX3N0YXR1c19pbmZvW2ldLnN0cjsKKwkJfQorCX0KKworCXJldHVybiAiQmFkIFN0YXR1cyBDb2RlIjsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNyYWlkLmggYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNyYWlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwZDkwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY3JhaWQuaApAQCAtMCwwICsxLDE2MjMgQEAKKyNpZiAoIWRlZmluZWQoZHByaW50aykpCisjIGRlZmluZSBkcHJpbnRrKHgpCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgICBEIEUgRiBJIE4gRSBTCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIE1BWElNVU1fTlVNX0NPTlRBSU5FUlMJMzIKKworI2RlZmluZSBBQUNfTlVNX0ZJQgkJKDI1NiArIDY0KQorI2RlZmluZSBBQUNfTlVNX0lPX0ZJQgkJMTAwCisKKyNkZWZpbmUgQUFDX01BWF9MVU4JCSg4KQorCisjZGVmaW5lIEFBQ19NQVhfSE9TVFBIWVNNRU1QQUdFUyAoMHhmZmZmZikKKworLyoKKyAqIFRoZXNlIG1hY3JvcyBjb252ZXJ0IGZyb20gcGh5c2ljYWwgY2hhbm5lbHMgdG8gdmlydHVhbCBjaGFubmVscworICovCisjZGVmaW5lIENPTlRBSU5FUl9DSEFOTkVMCQkoMCkKKyNkZWZpbmUgSURfTFVOX1RPX0NPTlRBSU5FUihpZCwgbHVuKQkoaWQpCisjZGVmaW5lIENPTlRBSU5FUl9UT19DSEFOTkVMKGNvbnQpCShDT05UQUlORVJfQ0hBTk5FTCkKKyNkZWZpbmUgQ09OVEFJTkVSX1RPX0lEKGNvbnQpCQkoY29udCkKKyNkZWZpbmUgQ09OVEFJTkVSX1RPX0xVTihjb250KQkJKDApCisKKyNkZWZpbmUgYWFjX3BoeXNfdG9fbG9naWNhbCh4KSAgKHgrMSkKKyNkZWZpbmUgYWFjX2xvZ2ljYWxfdG9fcGh5cyh4KSAgKHg/eC0xOjApCisKKy8qICNkZWZpbmUgQUFDX0RFVEFJTEVEX1NUQVRVU19JTkZPICovCisKK3N0cnVjdCBkaXNrcGFybQoreworCWludCBoZWFkczsKKwlpbnQgc2VjdG9yczsKKwlpbnQgY3lsaW5kZXJzOworfTsKKworCisvKgorICoJRE9OJ1QgQ0hBTkdFIFRIRSBPUkRFUiwgdGhpcyBpcyBzZXQgYnkgdGhlIGZpcm13YXJlCisgKi8KKyAKKyNkZWZpbmUJCUNUX05PTkUJCQkwCisjZGVmaW5lCQlDVF9WT0xVTUUJCTEKKyNkZWZpbmUJCUNUX01JUlJPUgkJMgorI2RlZmluZQkJQ1RfU1RSSVBFCQkzCisjZGVmaW5lCQlDVF9SQUlENQkJNAorI2RlZmluZQkJQ1RfU1NSVwkJCTUKKyNkZWZpbmUJCUNUX1NTUk8JCQk2CisjZGVmaW5lCQlDVF9NT1JQSAkJNworI2RlZmluZQkJQ1RfUEFTU1RIUlUJCTgKKyNkZWZpbmUJCUNUX1JBSUQ0CQk5CisjZGVmaW5lCQlDVF9SQUlEMTAJCTEwCS8qIHN0cmlwZSBvZiBtaXJyb3IgKi8KKyNkZWZpbmUJCUNUX1JBSUQwMAkJMTEJLyogc3RyaXBlIG9mIHN0cmlwZSAqLworI2RlZmluZQkJQ1RfVk9MVU1FX09GX01JUlJPUlMJMTIJLyogdm9sdW1lIG9mIG1pcnJvciAqLworI2RlZmluZQkJQ1RfUFNFVURPX1JBSUQJCTEzCS8qIHJlYWxseSByYWlkNCAqLworI2RlZmluZQkJQ1RfTEFTVF9WT0xVTUVfVFlQRQkxNAorI2RlZmluZSAJQ1RfT0sgICAgICAgIAkJMjE4CisKKy8qCisgKglUeXBlcyBvZiBvYmplY3RzIGFkZHJlc3NhYmxlIGluIHNvbWUgZmFzaGlvbiBieSB0aGUgY2xpZW50LgorICoJVGhpcyBpcyBhIHN1cGVyc2V0IG9mIHRob3NlIG9iamVjdHMgaGFuZGxlZCBqdXN0IGJ5IHRoZSBmaWxlc3lzdGVtCisgKglhbmQgaW5jbHVkZXMgInJhdyIgb2JqZWN0cyB0aGF0IGFuIGFkbWluaXN0cmF0b3Igd291bGQgdXNlIHRvCisgKgljb25maWd1cmUgY29udGFpbmVycyBhbmQgZmlsZXN5c3RlbXMuCisgKi8KKworI2RlZmluZQkJRlRfUkVHCQkxCS8qIHJlZ3VsYXIgZmlsZSAqLworI2RlZmluZQkJRlRfRElSCQkyCS8qIGRpcmVjdG9yeSAqLworI2RlZmluZQkJRlRfQkxLCQkzCS8qICJibG9jayIgZGV2aWNlIC0gcmVzZXJ2ZWQgKi8KKyNkZWZpbmUJCUZUX0NIUgkJNAkvKiAiY2hhcmFjdGVyIHNwZWNpYWwiIGRldmljZSAtIHJlc2VydmVkICovCisjZGVmaW5lCQlGVF9MTksJCTUJLyogc3ltYm9saWMgbGluayAqLworI2RlZmluZQkJRlRfU09DSwkJNgkvKiBzb2NrZXQgKi8KKyNkZWZpbmUJCUZUX0ZJRk8JCTcJLyogZmlmbyAqLworI2RlZmluZQkJRlRfRklMRVNZUwk4CS8qIEFEQVBURUMncyAiRlNBIih0bSkgZmlsZXN5c3RlbSAqLworI2RlZmluZQkJRlRfRFJJVkUJOQkvKiBwaHlzaWNhbCBkaXNrIC0gYWRkcmVzc2FibGUgaW4gc2NzaSBieSBidXMvaWQvbHVuICovCisjZGVmaW5lCQlGVF9TTElDRQkxMAkvKiB2aXJ0dWFsIGRpc2sgLSByYXcgdm9sdW1lIC0gc2xpY2UgKi8KKyNkZWZpbmUJCUZUX1BBUlRJVElPTgkxMQkvKiBGU0EgcGFydGl0aW9uIC0gY2FydmVkIG91dCBvZiBhIHNsaWNlIC0gYnVpbGRpbmcgYmxvY2sgZm9yIGNvbnRhaW5lcnMgKi8KKyNkZWZpbmUJCUZUX1ZPTFVNRQkxMgkvKiBDb250YWluZXIgLSBWb2x1bWUgU2V0ICovCisjZGVmaW5lCQlGVF9TVFJJUEUJMTMJLyogQ29udGFpbmVyIC0gU3RyaXBlIFNldCAqLworI2RlZmluZQkJRlRfTUlSUk9SCTE0CS8qIENvbnRhaW5lciAtIE1pcnJvciBTZXQgKi8KKyNkZWZpbmUJCUZUX1JBSUQ1CTE1CS8qIENvbnRhaW5lciAtIFJhaWQgNSBTZXQgKi8KKyNkZWZpbmUJCUZUX0RBVEFCQVNFCTE2CS8qIFN0b3JhZ2Ugb2JqZWN0IHdpdGggImZvcmVpZ24iIGNvbnRlbnQgbWFuYWdlciAqLworCisvKgorICoJSG9zdCBzaWRlIG1lbW9yeSBzY2F0dGVyIGdhdGhlciBsaXN0CisgKglVc2VkIGJ5IHRoZSBhZGFwdGVyIGZvciByZWFkLCB3cml0ZSwgYW5kIHJlYWRkaXJwbHVzIG9wZXJhdGlvbnMKKyAqCVdlIGhhdmUgc2VwYXJhdGUgMzIgYW5kIDY0IGJpdCB2ZXJzaW9uIGJlY2F1c2UgZXZlbgorICoJb24gNjQgYml0IHN5c3RlbXMgbm90IGFsbCBjYXJkcyBzdXBwb3J0IHRoZSA2NCBiaXQgdmVyc2lvbgorICovCitzdHJ1Y3Qgc2dlbnRyeSB7CisJdTMyCWFkZHI7CS8qIDMyLWJpdCBhZGRyZXNzLiAqLworCXUzMgljb3VudDsJLyogTGVuZ3RoLiAqLworfTsKKworc3RydWN0IHNnZW50cnk2NCB7CisJdTMyCWFkZHJbMl07CS8qIDY0LWJpdCBhZGRyLiAyIHBpZWNlcyBmb3IgZGF0YSBhbGlnbm1lbnQgKi8KKwl1MzIJY291bnQ7CS8qIExlbmd0aC4gKi8KK307CisKKy8qCisgKglTR01BUAorICoKKyAqCVRoaXMgaXMgdGhlIFNHTUFQIHN0cnVjdHVyZSBmb3IgYWxsIGNvbW1hbmRzIHRoYXQgdXNlCisgKgkzMi1iaXQgYWRkcmVzc2luZy4KKyAqLworCitzdHJ1Y3Qgc2dtYXAgeworCXUzMgkJY291bnQ7CisJc3RydWN0IHNnZW50cnkJc2dbMV07IAorfTsKKworc3RydWN0IHNnbWFwNjQgeworCXUzMgkJY291bnQ7CisJc3RydWN0IHNnZW50cnk2NCBzZ1sxXTsKK307CisKK3N0cnVjdCBjcmVhdGlvbl9pbmZvCit7CisJdTggCQlidWlsZG51bTsJCS8qIGUuZy4sIDU4OCAqLworCXU4IAkJdXNlYzsJCQkvKiBlLmcuLCA1ODggKi8KKwl1OAkgCXZpYTsJCQkvKiBlLmcuLCAxID0gRlNVLAorCQkJCQkJICogCSAyID0gQVBJCisJCQkJCQkgKi8KKwl1OAkgCXllYXI7CQkgCS8qIGUuZy4sIDE5OTcgPSA5NyAqLworCXUzMgkJZGF0ZTsJCQkvKgorCQkJCQkJICogdW5zaWduZWQgCU1vbnRoCQk6NDsJLy8gMSAtIDEyCisJCQkJCQkgKiB1bnNpZ25lZCAJRGF5CQk6NjsJLy8gMSAtIDMyCisJCQkJCQkgKiB1bnNpZ25lZCAJSG91cgkJOjY7CS8vIDAgLSAyMworCQkJCQkJICogdW5zaWduZWQgCU1pbnV0ZQkJOjY7CS8vIDAgLSA2MAorCQkJCQkJICogdW5zaWduZWQgCVNlY29uZAkJOjY7CS8vIDAgLSA2MAorCQkJCQkJICovCisJdTMyCQlzZXJpYWxbMl07CQkJLyogZS5nLiwgMHgxREVBREIwQkZBRkFGMDAxICovCit9OworCisKKy8qCisgKglEZWZpbmUgYWxsIHRoZSBjb25zdGFudHMgbmVlZGVkIGZvciB0aGUgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2UKKyAqLworCisvKgorICoJRGVmaW5lIGhvdyBtYW55IHF1ZXVlIGVudHJpZXMgZWFjaCBxdWV1ZSB3aWxsIGhhdmUgYW5kIHRoZSB0b3RhbAorICoJbnVtYmVyIG9mIGVudHJpZXMgZm9yIHRoZSBlbnRpcmUgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2UuIEFsc28gZGVmaW5lCisgKglob3cgbWFueSBxdWV1ZXMgd2Ugc3VwcG9ydC4KKyAqCisgKglUaGlzIGhhcyB0byBtYXRjaCB0aGUgY29udHJvbGxlcgorICovCisKKyNkZWZpbmUgTlVNQkVSX09GX0NPTU1fUVVFVUVTICA4ICAgLy8gNCBjb21tYW5kOyA0IHJlc3BvbnNlCisjZGVmaW5lIEhPU1RfSElHSF9DTURfRU5UUklFUyAgNAorI2RlZmluZSBIT1NUX05PUk1fQ01EX0VOVFJJRVMgIDgKKyNkZWZpbmUgQURBUF9ISUdIX0NNRF9FTlRSSUVTICA0CisjZGVmaW5lIEFEQVBfTk9STV9DTURfRU5UUklFUyAgNTEyCisjZGVmaW5lIEhPU1RfSElHSF9SRVNQX0VOVFJJRVMgNAorI2RlZmluZSBIT1NUX05PUk1fUkVTUF9FTlRSSUVTIDUxMgorI2RlZmluZSBBREFQX0hJR0hfUkVTUF9FTlRSSUVTIDQKKyNkZWZpbmUgQURBUF9OT1JNX1JFU1BfRU5UUklFUyA4CisKKyNkZWZpbmUgVE9UQUxfUVVFVUVfRU5UUklFUyAgXAorICAgIChIT1NUX05PUk1fQ01EX0VOVFJJRVMgKyBIT1NUX0hJR0hfQ01EX0VOVFJJRVMgKyBBREFQX05PUk1fQ01EX0VOVFJJRVMgKyBBREFQX0hJR0hfQ01EX0VOVFJJRVMgKyBcCisJICAgIEhPU1RfTk9STV9SRVNQX0VOVFJJRVMgKyBIT1NUX0hJR0hfUkVTUF9FTlRSSUVTICsgQURBUF9OT1JNX1JFU1BfRU5UUklFUyArIEFEQVBfSElHSF9SRVNQX0VOVFJJRVMpCisKKworLyoKKyAqCVNldCB0aGUgcXVldWVzIG9uIGEgMTYgYnl0ZSBhbGlnbm1lbnQKKyAqLworIAorI2RlZmluZSBRVUVVRV9BTElHTk1FTlQJCTE2CisKKy8qCisgKglUaGUgcXVldWUgaGVhZGVycyBkZWZpbmUgdGhlIENvbW11bmljYXRpb24gUmVnaW9uIHF1ZXVlcy4gVGhlc2UKKyAqCWFyZSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgYW5kIGFjY2Vzc2libGUgYnkgYm90aCB0aGUgYWRhcHRlciBhbmQgdGhlCisgKglob3N0LiBFdmVuIHRob3VnaCBhbGwgcXVldWUgaGVhZGVycyBhcmUgaW4gdGhlIHNhbWUgY29udGlndW91cyBibG9jaworICoJdGhleSB3aWxsIGJlIHJlcHJlc2VudGVkIGFzIGluZGl2aWR1YWwgdW5pdHMgaW4gdGhlIGRhdGEgc3RydWN0dXJlcy4KKyAqLworCitzdHJ1Y3QgYWFjX2VudHJ5IHsKKwl1MzIgc2l6ZTsgICAgICAgICAgLyogU2l6ZSBpbiBieXRlcyBvZiBGaWIgd2hpY2ggdGhpcyBRRSBwb2ludHMgdG8gKi8KKwl1MzIgYWRkcjsgLyogUmVjZWl2ZXIgYWRkcmVzcyBvZiB0aGUgRklCICovCit9OworCisvKgorICoJVGhlIGFkYXB0ZXIgYXNzdW1lcyB0aGUgUHJvZHVjZXJJbmRleCBhbmQgQ29uc3VtZXJJbmRleCBhcmUgZ3JvdXBlZAorICoJYWRqYWNlbnRseSBhbmQgaW4gdGhhdCBvcmRlci4KKyAqLworIAorc3RydWN0IGFhY19xaGRyIHsKKwl1NjQgaGVhZGVyX2FkZHI7CQkvKiBBZGRyZXNzIHRvIGhhbmQgdGhlIGFkYXB0ZXIgdG8gYWNjZXNzIHRvIHRoaXMgcXVldWUgaGVhZCAqLworCXUzMiAqcHJvZHVjZXI7CQkJLyogVGhlIHByb2R1Y2VyIGluZGV4IGZvciB0aGlzIHF1ZXVlIChob3N0IGFkZHJlc3MpICovCisJdTMyICpjb25zdW1lcjsJCQkvKiBUaGUgY29uc3VtZXIgaW5kZXggZm9yIHRoaXMgcXVldWUgKGhvc3QgYWRkcmVzcykgKi8KK307CisKKy8qCisgKglEZWZpbmUgYWxsIHRoZSBldmVudHMgd2hpY2ggdGhlIGFkYXB0ZXIgd291bGQgbGlrZSB0byBub3RpZnkKKyAqCXRoZSBob3N0IG9mLgorICovCisgCisjZGVmaW5lCQlIb3N0Tm9ybUNtZFF1ZQkJMQkvKiBDaGFuZ2UgaW4gaG9zdCBub3JtYWwgcHJpb3JpdHkgY29tbWFuZCBxdWV1ZSAqLworI2RlZmluZQkJSG9zdEhpZ2hDbWRRdWUJCTIJLyogQ2hhbmdlIGluIGhvc3QgaGlnaCBwcmlvcml0eSBjb21tYW5kIHF1ZXVlICovCisjZGVmaW5lCQlIb3N0Tm9ybVJlc3BRdWUJCTMJLyogQ2hhbmdlIGluIGhvc3Qgbm9ybWFsIHByaW9yaXR5IHJlc3BvbnNlIHF1ZXVlICovCisjZGVmaW5lCQlIb3N0SGlnaFJlc3BRdWUJCTQJLyogQ2hhbmdlIGluIGhvc3QgaGlnaCBwcmlvcml0eSByZXNwb25zZSBxdWV1ZSAqLworI2RlZmluZQkJQWRhcE5vcm1SZXNwTm90RnVsbAk1CisjZGVmaW5lCQlBZGFwSGlnaFJlc3BOb3RGdWxsCTYKKyNkZWZpbmUJCUFkYXBOb3JtQ21kTm90RnVsbAk3CisjZGVmaW5lCQlBZGFwSGlnaENtZE5vdEZ1bGwJOAorI2RlZmluZQkJU3luY2hDb21tYW5kQ29tcGxldGUJOQorI2RlZmluZQkJQWRhcEludGVybmFsRXJyb3IJMHhmZSAgICAvKiBUaGUgYWRhcHRlciBkZXRlY3RlZCBhbiBpbnRlcm5hbCBlcnJvciBzaHV0dGluZyBkb3duICovCisKKy8qCisgKglEZWZpbmUgYWxsIHRoZSBldmVudHMgdGhlIGhvc3Qgd2lzaGVzIHRvIG5vdGlmeSB0aGUKKyAqCWFkYXB0ZXIgb2YuIFRoZSBmaXJzdCBmb3VyIHZhbHVlcyBtdWNoIG1hdGNoIHRoZSBRaWQgdGhlCisgKgljb3JyZXNwb25kaW5nIHF1ZXVlLgorICovCisKKyNkZWZpbmUJCUFkYXBOb3JtQ21kUXVlCQkyCisjZGVmaW5lCQlBZGFwSGlnaENtZFF1ZQkJMworI2RlZmluZQkJQWRhcE5vcm1SZXNwUXVlCQk2CisjZGVmaW5lCQlBZGFwSGlnaFJlc3BRdWUJCTcKKyNkZWZpbmUJCUhvc3RTaHV0ZG93bgkJOAorI2RlZmluZQkJSG9zdFBvd2VyRmFpbAkJOQorI2RlZmluZQkJRmF0YWxDb21tRXJyb3IJCTEwCisjZGVmaW5lCQlIb3N0Tm9ybVJlc3BOb3RGdWxsCTExCisjZGVmaW5lCQlIb3N0SGlnaFJlc3BOb3RGdWxsCTEyCisjZGVmaW5lCQlIb3N0Tm9ybUNtZE5vdEZ1bGwJMTMKKyNkZWZpbmUJCUhvc3RIaWdoQ21kTm90RnVsbAkxNAorI2RlZmluZQkJRmFzdElvCQkJMTUKKyNkZWZpbmUJCUFkYXBQcmludGZEb25lCQkxNgorCisvKgorICoJRGVmaW5lIGFsbCB0aGUgcXVldWVzIHRoYXQgdGhlIGFkYXB0ZXIgYW5kIGhvc3QgdXNlIHRvIGNvbW11bmljYXRlCisgKglOdW1iZXIgdGhlbSB0byBtYXRjaCB0aGUgcGh5c2ljYWwgcXVldWUgbGF5b3V0LgorICovCisKK2VudW0gYWFjX3F1ZXVlX3R5cGVzIHsKKyAgICAgICAgSG9zdE5vcm1DbWRRdWV1ZSA9IDAsCS8qIEFkYXB0ZXIgdG8gaG9zdCBub3JtYWwgcHJpb3JpdHkgY29tbWFuZCB0cmFmZmljICovCisgICAgICAgIEhvc3RIaWdoQ21kUXVldWUsCS8qIEFkYXB0ZXIgdG8gaG9zdCBoaWdoIHByaW9yaXR5IGNvbW1hbmQgdHJhZmZpYyAqLworICAgICAgICBBZGFwTm9ybUNtZFF1ZXVlLAkvKiBIb3N0IHRvIGFkYXB0ZXIgbm9ybWFsIHByaW9yaXR5IGNvbW1hbmQgdHJhZmZpYyAqLworICAgICAgICBBZGFwSGlnaENtZFF1ZXVlLAkvKiBIb3N0IHRvIGFkYXB0ZXIgaGlnaCBwcmlvcml0eSBjb21tYW5kIHRyYWZmaWMgKi8KKyAgICAgICAgSG9zdE5vcm1SZXNwUXVldWUsCS8qIEFkYXB0ZXIgdG8gaG9zdCBub3JtYWwgcHJpb3JpdHkgcmVzcG9uc2UgdHJhZmZpYyAqLworICAgICAgICBIb3N0SGlnaFJlc3BRdWV1ZSwJLyogQWRhcHRlciB0byBob3N0IGhpZ2ggcHJpb3JpdHkgcmVzcG9uc2UgdHJhZmZpYyAqLworICAgICAgICBBZGFwTm9ybVJlc3BRdWV1ZSwJLyogSG9zdCB0byBhZGFwdGVyIG5vcm1hbCBwcmlvcml0eSByZXNwb25zZSB0cmFmZmljICovCisgICAgICAgIEFkYXBIaWdoUmVzcFF1ZXVlCS8qIEhvc3QgdG8gYWRhcHRlciBoaWdoIHByaW9yaXR5IHJlc3BvbnNlIHRyYWZmaWMgKi8KK307CisKKy8qCisgKglBc3NpZ24gdHlwZSB2YWx1ZXMgdG8gdGhlIEZTQSBjb21tdW5pY2F0aW9uIGRhdGEgc3RydWN0dXJlcworICovCisKKyNkZWZpbmUJCUZJQl9NQUdJQwkweDAwMDEKKworLyoKKyAqCURlZmluZSB0aGUgcHJpb3JpdHkgbGV2ZWxzIHRoZSBGU0EgY29tbXVuaWNhdGlvbiByb3V0aW5lcyBzdXBwb3J0LgorICovCisKKyNkZWZpbmUJCUZzYU5vcm1hbAkxCisjZGVmaW5lCQlGc2FIaWdoCQkyCisKKy8qCisgKiBEZWZpbmUgdGhlIEZJQi4gVGhlIEZJQiBpcyB0aGUgd2hlcmUgYWxsIHRoZSByZXF1ZXN0ZWQgZGF0YSBhbmQKKyAqIGNvbW1hbmQgaW5mb3JtYXRpb24gYXJlIHB1dCB0byB0aGUgYXBwbGljYXRpb24gb24gdGhlIEZTQSBhZGFwdGVyLgorICovCisKK3N0cnVjdCBhYWNfZmliaGRyIHsKKwl1MzIgWGZlclN0YXRlOwkJCS8vIEN1cnJlbnQgdHJhbnNmZXIgc3RhdGUgZm9yIHRoaXMgQ0NCCisJdTE2IENvbW1hbmQ7CQkJLy8gUm91dGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGRlc3RpbmF0aW9uCisJdTggU3RydWN0VHlwZTsJCQkvLyBUeXBlIEZJQgorCXU4IEZsYWdzOwkJCS8vIEZsYWdzIGZvciBGSUIKKwl1MTYgU2l6ZTsJCQkvLyBTaXplIG9mIHRoaXMgRklCIGluIGJ5dGVzCisJdTE2IFNlbmRlclNpemU7CQkJLy8gU2l6ZSBvZiB0aGUgRklCIGluIHRoZSBzZW5kZXIgKGZvciByZXNwb25zZSBzaXppbmcpCisJdTMyIFNlbmRlckZpYkFkZHJlc3M7CQkvLyBIb3N0IGRlZmluZWQgZGF0YSBpbiB0aGUgRklCCisJdTMyIFJlY2VpdmVyRmliQWRkcmVzczsJCS8vIExvZ2ljYWwgYWRkcmVzcyBvZiB0aGlzIEZJQiBmb3IgdGhlIGFkYXB0ZXIKKwl1MzIgU2VuZGVyRGF0YTsJCQkvLyBQbGFjZSBob2xkZXIgZm9yIHRoZSBzZW5kZXIgdG8gc3RvcmUgZGF0YQorCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJICAgIHUzMiBfUmVjZWl2ZXJUaW1lU3RhcnQ7IAkvLyBUaW1lc3RhbXAgZm9yIHJlY2VpcHQgb2YgZmliCisJCSAgICB1MzIgX1JlY2VpdmVyVGltZURvbmU7CS8vIFRpbWVzdGFtcCBmb3IgY29tcGxldGlvbiBvZiBmaWIKKwkJfSBfczsKKwl9IF91OworfTsKKworI2RlZmluZSBGSUJfREFUQV9TSVpFX0lOX0JZVEVTICg1MTIgLSBzaXplb2Yoc3RydWN0IGFhY19maWJoZHIpKQorCisKK3N0cnVjdCBod19maWIgeworCXN0cnVjdCBhYWNfZmliaGRyIGhlYWRlcjsKKwl1OCBkYXRhW0ZJQl9EQVRBX1NJWkVfSU5fQllURVNdOwkJLy8gQ29tbWFuZCBzcGVjaWZpYyBkYXRhCit9OworCisvKgorICoJRklCIGNvbW1hbmRzCisgKi8KKworI2RlZmluZSAJVGVzdENvbW1hbmRSZXNwb25zZQkJMQorI2RlZmluZQkJVGVzdEFkYXB0ZXJDb21tYW5kCQkyCisvKgorICoJTG93bGV2ZWwgYW5kIGNvbW0gY29tbWFuZHMKKyAqLworI2RlZmluZQkJTGFzdFRlc3RDb21tYW5kCQkJMTAwCisjZGVmaW5lCQlSZWluaXRIb3N0Tm9ybUNvbW1hbmRRdWV1ZQkxMDEKKyNkZWZpbmUJCVJlaW5pdEhvc3RIaWdoQ29tbWFuZFF1ZXVlCTEwMgorI2RlZmluZQkJUmVpbml0SG9zdEhpZ2hSZXNwUXVldWUJCTEwMworI2RlZmluZQkJUmVpbml0SG9zdE5vcm1SZXNwUXVldWUJCTEwNAorI2RlZmluZQkJUmVpbml0QWRhcE5vcm1Db21tYW5kUXVldWUJMTA1CisjZGVmaW5lCQlSZWluaXRBZGFwSGlnaENvbW1hbmRRdWV1ZQkxMDcKKyNkZWZpbmUJCVJlaW5pdEFkYXBIaWdoUmVzcFF1ZXVlCQkxMDgKKyNkZWZpbmUJCVJlaW5pdEFkYXBOb3JtUmVzcFF1ZXVlCQkxMDkKKyNkZWZpbmUJCUludGVyZmFjZVNodXRkb3duCQkxMTAKKyNkZWZpbmUJCURtYUNvbW1hbmRGaWIJCQkxMjAKKyNkZWZpbmUJCVN0YXJ0UHJvZmlsZQkJCTEyMQorI2RlZmluZQkJVGVybVByb2ZpbGUJCQkxMjIKKyNkZWZpbmUJCVNwZWVkVGVzdAkJCTEyMworI2RlZmluZQkJVGFrZUFCcmVha1B0CQkJMTI0CisjZGVmaW5lCQlSZXF1ZXN0UGVyZkRhdGEJCQkxMjUKKyNkZWZpbmUJCVNldEludGVycnVwdERlZlRpbWVyCQkxMjYKKyNkZWZpbmUJCVNldEludGVycnVwdERlZkNvdW50CQkxMjcKKyNkZWZpbmUJCUdldEludGVycnVwdERlZlN0YXR1cwkJMTI4CisjZGVmaW5lCQlMYXN0Q29tbUNvbW1hbmQJCQkxMjkKKy8qCisgKglGaWxlc3lzdGVtIGNvbW1hbmRzCisgKi8KKyNkZWZpbmUJCU51RmlsZVN5c3RlbQkJCTMwMAorI2RlZmluZQkJVUZTCQkJCTMwMQorI2RlZmluZQkJSG9zdEZpbGVTeXN0ZW0JCQkzMDIKKyNkZWZpbmUJCUxhc3RGaWxlU3lzdGVtQ29tbWFuZAkJMzAzCisvKgorICoJQ29udGFpbmVyIENvbW1hbmRzCisgKi8KKyNkZWZpbmUJCUNvbnRhaW5lckNvbW1hbmQJCTUwMAorI2RlZmluZQkJQ29udGFpbmVyQ29tbWFuZDY0CQk1MDEKKy8qCisgKglDbHVzdGVyIENvbW1hbmRzCisgKi8KKyNkZWZpbmUJCUNsdXN0ZXJDb21tYW5kCSAJCTU1MAorLyoKKyAqCVNjc2kgUG9ydCBjb21tYW5kcyAoc2NzaSBwYXNzdGhyb3VnaCkKKyAqLworI2RlZmluZQkJU2NzaVBvcnRDb21tYW5kCQkJNjAwCisjZGVmaW5lCQlTY3NpUG9ydENvbW1hbmQ2NAkJNjAxCisvKgorICoJTWlzYyBob3VzZSBrZWVwaW5nIGFuZCBnZW5lcmljIGFkYXB0ZXIgaW5pdGlhdGVkIGNvbW1hbmRzCisgKi8KKyNkZWZpbmUJCUFpZlJlcXVlc3QJCQk3MDAKKyNkZWZpbmUJCUNoZWNrUmV2aXNpb24JCQk3MDEKKyNkZWZpbmUJCUZzYUhvc3RTaHV0ZG93bgkJCTcwMgorI2RlZmluZQkJUmVxdWVzdEFkYXB0ZXJJbmZvCQk3MDMKKyNkZWZpbmUJCUlzQWRhcHRlclBhdXNlZAkJCTcwNAorI2RlZmluZQkJU2VuZEhvc3RUaW1lCQkJNzA1CisjZGVmaW5lCQlMYXN0TWlzY0NvbW1hbmQJCQk3MDYKKworLy8KKy8vIENvbW1hbmRzIHRoYXQgd2lsbCB0YXJnZXQgdGhlIGZhaWxvdmVyIGxldmVsIG9uIHRoZSBGU0EgYWRhcHRlcgorLy8KKworZW51bSBmaWJfeGZlcl9zdGF0ZSB7CisJSG9zdE93bmVkIAkJCT0gKDE8PDApLAorCUFkYXB0ZXJPd25lZCAJCQk9ICgxPDwxKSwKKwlGaWJJbml0aWFsaXplZCAJCQk9ICgxPDwyKSwKKwlGaWJFbXB0eSAJCQk9ICgxPDwzKSwKKwlBbGxvY2F0ZWRGcm9tUG9vbCAJCT0gKDE8PDQpLAorCVNlbnRGcm9tSG9zdCAJCQk9ICgxPDw1KSwKKwlTZW50RnJvbUFkYXB0ZXIgCQk9ICgxPDw2KSwKKwlSZXNwb25zZUV4cGVjdGVkIAkJPSAoMTw8NyksCisJTm9SZXNwb25zZUV4cGVjdGVkIAkJPSAoMTw8OCksCisJQWRhcHRlclByb2Nlc3NlZCAJCT0gKDE8PDkpLAorCUhvc3RQcm9jZXNzZWQgCQkJPSAoMTw8MTApLAorCUhpZ2hQcmlvcml0eSAJCQk9ICgxPDwxMSksCisJTm9ybWFsUHJpb3JpdHkgCQkJPSAoMTw8MTIpLAorCUFzeW5jCQkJCT0gKDE8PDEzKSwKKwlBc3luY0lvCQkJCT0gKDE8PDEzKSwJLy8gcnBiZml4OiByZW1vdmUgd2l0aCBuZXcgcmVnaW1lCisJUGFnZUZpbGVJbwkJCT0gKDE8PDE0KSwJLy8gcnBiZml4OiByZW1vdmUgd2l0aCBuZXcgcmVnaW1lCisJU2h1dGRvd25SZXF1ZXN0CQkJPSAoMTw8MTUpLAorCUxhenlXcml0ZQkJCT0gKDE8PDE2KSwJLy8gcnBiZml4OiByZW1vdmUgd2l0aCBuZXcgcmVnaW1lCisJQWRhcHRlck1pY3JvRmliCQkJPSAoMTw8MTcpLAorCUJJT1NGaWJQYXRoCQkJPSAoMTw8MTgpLAorCUZhc3RSZXNwb25zZUNhcGFibGUJCT0gKDE8PDE5KSwKKwlBcGlGaWIJCQkJPSAoMTw8MjApCS8vIEl0cyBhbiBBUEkgRmliLgorfTsKKworLyoKKyAqCVRoZSBmb2xsb3dpbmcgZGVmaW5lcyBuZWVkcyB0byBiZSB1cGRhdGVkIGFueSB0aW1lIHRoZXJlIGlzIGFuCisgKglpbmNvbXBhdGlibGUgY2hhbmdlIG1hZGUgdG8gdGhlIGFhY19pbml0IHN0cnVjdHVyZS4KKyAqLworCisjZGVmaW5lIEFEQVBURVJfSU5JVF9TVFJVQ1RfUkVWSVNJT04JCTMKKworc3RydWN0IGFhY19pbml0Cit7CisJdTMyCUluaXRTdHJ1Y3RSZXZpc2lvbjsKKwl1MzIJTWluaVBvcnRSZXZpc2lvbjsKKwl1MzIJZnNyZXY7CisJdTMyCUNvbW1IZWFkZXJBZGRyZXNzOworCXUzMglGYXN0SW9Db21tQXJlYUFkZHJlc3M7CisJdTMyCUFkYXB0ZXJGaWJzUGh5c2ljYWxBZGRyZXNzOworCXUzMglBZGFwdGVyRmlic1ZpcnR1YWxBZGRyZXNzOworCXUzMglBZGFwdGVyRmlic1NpemU7CisJdTMyCUFkYXB0ZXJGaWJBbGlnbjsKKwl1MzIJcHJpbnRmYnVmOworCXUzMglwcmludGZidWZzaXo7CisJdTMyCUhvc3RQaHlzTWVtUGFnZXM7CQkvLyBudW1iZXIgb2YgNGsgcGFnZXMgb2YgaG9zdCBwaHlzaWNhbCBtZW1vcnkKKwl1MzIJSG9zdEVsYXBzZWRTZWNvbmRzOwkJLy8gbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgMTk3MC4KK307CisKK2VudW0gYWFjX2xvZ19sZXZlbCB7CisJTE9HX0FBQ19JTklUCQkJPSAxMCwKKwlMT0dfQUFDX0lORk9STUFUSU9OQUwJCT0gMjAsCisJTE9HX0FBQ19XQVJOSU5HCQkJPSAzMCwKKwlMT0dfQUFDX0xPV19FUlJPUgkJPSA0MCwKKwlMT0dfQUFDX01FRElVTV9FUlJPUgkJPSA1MCwKKwlMT0dfQUFDX0hJR0hfRVJST1IJCT0gNjAsCisJTE9HX0FBQ19QQU5JQwkJCT0gNzAsCisJTE9HX0FBQ19ERUJVRwkJCT0gODAsCisJTE9HX0FBQ19XSU5EQkdfUFJJTlQJCT0gOTAKK307CisKKyNkZWZpbmUgRlNBRlNfTlRDX0dFVF9BREFQVEVSX0ZJQl9DT05URVhUCTB4MDMwYgorI2RlZmluZSBGU0FGU19OVENfRklCX0NPTlRFWFQJCQkweDAzMGMKKworc3RydWN0IGFhY19kZXY7CisKK3N0cnVjdCBhZGFwdGVyX29wcworeworCXZvaWQgKCphZGFwdGVyX2ludGVycnVwdCkoc3RydWN0IGFhY19kZXYgKmRldik7CisJdm9pZCAoKmFkYXB0ZXJfbm90aWZ5KShzdHJ1Y3QgYWFjX2RldiAqZGV2LCB1MzIgZXZlbnQpOworCWludCAgKCphZGFwdGVyX3N5bmNfY21kKShzdHJ1Y3QgYWFjX2RldiAqZGV2LCB1MzIgY29tbWFuZCwgdTMyIHAxLCB1MzIgKnN0YXR1cyk7CisJaW50ICAoKmFkYXB0ZXJfY2hlY2tfaGVhbHRoKShzdHJ1Y3QgYWFjX2RldiAqZGV2KTsKK307CisKKy8qCisgKglEZWZpbmUgd2hpY2ggaW50ZXJydXB0IGhhbmRsZXIgbmVlZHMgdG8gYmUgaW5zdGFsbGVkCisgKi8KKworc3RydWN0IGFhY19kcml2ZXJfaWRlbnQKK3sKKwlpbnQgCSgqaW5pdCkoc3RydWN0IGFhY19kZXYgKmRldik7CisJY2hhciAqCW5hbWU7CisJY2hhciAqCXZuYW1lOworCWNoYXIgKgltb2RlbDsKKwl1MTYJY2hhbm5lbHM7CisJaW50CXF1aXJrczsKK307CisvKgorICogU29tZSBhZGFwdGVyIGZpcm13YXJlIG5lZWRzIGNvbW11bmljYXRpb24gbWVtb3J5IAorICogYmVsb3cgMmdpZy4gVGhpcyB0ZWxscyB0aGUgaW5pdCBmdW5jdGlvbiB0byBzZXQgdGhlCisgKiBkbWEgbWFzayBzdWNoIHRoYXQgZmliIG1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZCB3aGVyZSB0aGUKKyAqIGFkYXB0ZXIgZmlybXdhcmUgY2FuIGdldCB0byBpdC4KKyAqLworI2RlZmluZSBBQUNfUVVJUktfMzFCSVQJMHgwMDAxCisKKy8qCisgKiBTb21lIGFkYXB0ZXIgZmlybXdhcmUsIHdoZW4gdGhlIHJhaWQgY2FyZCdzIGNhY2hlIGlzIHR1cm5lZCBvZmYsIGNhbiBub3QKKyAqIHNwbGl0IHVwIHNjYXR0ZXIgZ2F0aGVycyBpbiBvcmRlciB0byBkZWFsIHdpdGggdGhlIGxpbWl0cyBvZiB0aGUKKyAqIHVuZGVybHlpbmcgQ0hJTS4gVGhpcyBsaW1pdCBpcyAzNCBzY2F0dGVyIGdhdGhlciBlbGVtZW50cy4KKyAqLworI2RlZmluZSBBQUNfUVVJUktfMzRTRwkweDAwMDIKKworLyoKKyAqIFRoaXMgYWRhcHRlciBpcyBhIHNsYXZlIChubyBGaXJtd2FyZSkKKyAqLworI2RlZmluZSBBQUNfUVVJUktfU0xBVkUgMHgwMDA0CisKKy8qCisgKiBUaGlzIGFkYXB0ZXIgaXMgYSBtYXN0ZXIuCisgKi8KKyNkZWZpbmUgQUFDX1FVSVJLX01BU1RFUiAweDAwMDgKKworLyoKKyAqCVRoZSBhZGFwdGVyIGludGVyZmFjZSBzcGVjcyBhbGwgcXVldWVzIHRvIGJlIGxvY2F0ZWQgaW4gdGhlIHNhbWUKKyAqCXBoeXNpY2FsbHkgY29udGlnb3VzIGJsb2NrLiBUaGUgaG9zdCBzdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIHRoZQorICoJY29tbXVpY2F0aW9uIHF1ZXVlcyB3aWxsIGFzc3VtZSB0aGV5IGFyZSBlYWNoIGEgc2VwYXJhdGUgcGh5c2ljYWxseQorICoJY29udGlnb3VzIG1lbW9yeSByZWdpb24gdGhhdCB3aWxsIHN1cHBvcnQgdGhlbSBhbGwgYmVpbmcgb25lIGJpZworICoJY29udGlnb3VzIGJsb2NrLiAKKyAqCVRoZXJlIGlzIGEgY29tbWFuZCBhbmQgcmVzcG9uc2UgcXVldWUgZm9yIGVhY2ggbGV2ZWwgYW5kIGRpcmVjdGlvbiBvZgorICoJY29tbXVpY2F0aW9uLiBUaGVzZSByZWdpb25zIGFyZSBhY2Nlc3NlZCBieSBib3RoIHRoZSBob3N0IGFuZCBhZGFwdGVyLgorICovCisgCitzdHJ1Y3QgYWFjX3F1ZXVlIHsKKwl1NjQJCSAJbG9naWNhbDsJLyphZGRyZXNzIHdlIGdpdmUgdGhlIGFkYXB0ZXIgKi8KKwlzdHJ1Y3QgYWFjX2VudHJ5CSpiYXNlOwkJLypzeXN0ZW0gdmlydHVhbCBhZGRyZXNzICovCisJc3RydWN0IGFhY19xaGRyIAloZWFkZXJzOyAgICAgICAJLypwcm9kdWNlcixjb25zdW1lciBxIGhlYWRlcnMqLworCXUzMgkgCQllbnRyaWVzOwkvKk51bWJlciBvZiBxdWV1ZSBlbnRyaWVzICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJcWZ1bGw7CQkvKkV2ZW50IHRvIHdhaXQgb24gaWYgcSBmdWxsICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJY21kcmVhZHk7CS8qQ21kIHJlYWR5IGZyb20gdGhlIGFkYXB0ZXIgKi8KKyAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgb25seSB2YWxpZCBmb3IgYWRhcHRlciB0byBob3N0IGNvbW1hbmQgcXVldWVzLiAqLyAKKwlzcGlubG9ja190CSAJKmxvY2s7CQkvKiBTcGlubG9jayBmb3IgdGhpcyBxdWV1ZSBtdXN0IHRha2UgdGhpcyBsb2NrIGJlZm9yZSBhY2Nlc3NpbmcgdGhlIGxvY2sgKi8KKwlzcGlubG9ja190CQlsb2NrZGF0YTsJLyogQWN0dWFsIGxvY2sgKHVzZWQgb25seSBvbiBvbmUgc2lkZSBvZiB0aGUgbG9jaykgKi8KKwl1bnNpZ25lZCBsb25nCQlTYXZlZElycWw7ICAgICAJLyogUHJldmlvdXMgSVJRTCB3aGVuIHRoZSBzcGluIGxvY2sgaXMgdGFrZW4gKi8KKwl1MzIJCQlwYWRkaW5nOwkvKiBQYWRkaW5nIC0gRklYTUUgLSBjYW4gcmVtb3ZlIEkgYmVsaWV2ZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgCWNtZHE7CSAgIAkvKiBBIHF1ZXVlIG9mIEZJQnMgd2hpY2ggbmVlZCB0byBiZSBwcmNlc3NlZCBieSB0aGUgRlMgdGhyZWFkLiBUaGlzIGlzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJLyogb25seSB2YWxpZCBmb3IgY29tbWFuZCBxdWV1ZXMgd2hpY2ggcmVjZWl2ZSBlbnRyaWVzIGZyb20gdGhlIGFkYXB0ZXIuICovCisJc3RydWN0IGxpc3RfaGVhZAlwZW5kaW5ncTsJLyogQSBxdWV1ZSBvZiBvdXRzdGFuZGluZyBmaWIncyB0byB0aGUgYWRhcHRlci4gKi8KKwl1MzIJCQludW1wZW5kaW5nOwkvKiBOdW1iZXIgb2YgZW50cmllcyBvbiBvdXRzdGFuZGluZyBxdWV1ZS4gKi8KKwlzdHJ1Y3QgYWFjX2RldiAqCWRldjsJCS8qIEJhY2sgcG9pbnRlciB0byBhZGFwdGVyIHN0cnVjdHVyZSAqLworfTsKKworLyoKKyAqCU1lc3NhZ2UgcXVldWVzLiBUaGUgb3JkZXIgaGVyZSBpcyBpbXBvcnRhbnQsIHNlZSBhbHNvIHRoZSAKKyAqCXF1ZXVlIHR5cGUgb3JkZXJpbmcKKyAqLworCitzdHJ1Y3QgYWFjX3F1ZXVlX2Jsb2NrCit7CisJc3RydWN0IGFhY19xdWV1ZSBxdWV1ZVs4XTsKK307CisKKy8qCisgKglTYVAxIE1lc3NhZ2UgVW5pdCBSZWdpc3RlcnMKKyAqLworIAorc3RydWN0IHNhX2RyYXdicmlkZ2VfQ1NSIHsKKwkJCQkvKglPZmZzZXQgCXwgIE5hbWUgKi8KKwlfX2xlMzIJcmVzZXJ2ZWRbMTBdOwkvKgkwMGgtMjdoIHwgIFJlc2VydmVkICovCisJdTgJTFVUX09mZnNldDsJLyoJMjhoCXwgIExvb2t1cCBUYWJsZSBPZmZzZXQgKi8KKwl1OAlyZXNlcnZlZDFbM107CS8qIAkyOWgtMmJoCXwgIFJlc2VydmVkICovCisJX19sZTMyCUxVVF9EYXRhOwkvKgkyY2gJfCAgTG9vdXAgVGFibGUgRGF0YSAqLworCV9fbGUzMglyZXNlcnZlZDJbMjZdOwkvKgkzMGgtOTdoCXwgIFJlc2VydmVkICovCisJX19sZTE2CVBSSUNMRUFSSVJROwkvKgk5OGgJfCAgUHJpbWFyeSBDbGVhciBJcnEgKi8KKwlfX2xlMTYJU0VDQ0xFQVJJUlE7CS8qCTlhaAl8ICBTZWNvbmRhcnkgQ2xlYXIgSXJxICovCisJX19sZTE2CVBSSVNFVElSUTsJLyoJOWNoCXwgIFByaW1hcnkgU2V0IElycSAqLworCV9fbGUxNglTRUNTRVRJUlE7CS8qCTllaAl8ICBTZWNvbmRhcnkgU2V0IElycSAqLworCV9fbGUxNglQUklDTEVBUklSUU1BU0s7LyoJYTBoCXwgIFByaW1hcnkgQ2xlYXIgSXJxIE1hc2sgKi8KKwlfX2xlMTYJU0VDQ0xFQVJJUlFNQVNLOy8qCWEyaAl8ICBTZWNvbmRhcnkgQ2xlYXIgSXJxIE1hc2sgKi8KKwlfX2xlMTYJUFJJU0VUSVJRTUFTSzsJLyoJYTRoCXwgIFByaW1hcnkgU2V0IElycSBNYXNrICovCisJX19sZTE2CVNFQ1NFVElSUU1BU0s7CS8qCWE2aAl8ICBTZWNvbmRhcnkgU2V0IElycSBNYXNrICovCisJX19sZTMyCU1BSUxCT1gwOwkvKglhOGgJfCAgU2NyYXRjaHBhZCAwICovCisJX19sZTMyCU1BSUxCT1gxOwkvKglhY2gJfCAgU2NyYXRjaHBhZCAxICovCisJX19sZTMyCU1BSUxCT1gyOwkvKgliMGgJfCAgU2NyYXRjaHBhZCAyICovCisJX19sZTMyCU1BSUxCT1gzOwkvKgliNGgJfCAgU2NyYXRjaHBhZCAzICovCisJX19sZTMyCU1BSUxCT1g0OwkvKgliOGgJfCAgU2NyYXRjaHBhZCA0ICovCisJX19sZTMyCU1BSUxCT1g1OwkvKgliY2gJfCAgU2NyYXRjaHBhZCA1ICovCisJX19sZTMyCU1BSUxCT1g2OwkvKgljMGgJfCAgU2NyYXRjaHBhZCA2ICovCisJX19sZTMyCU1BSUxCT1g3OwkvKgljNGgJfCAgU2NyYXRjaHBhZCA3ICovCisJX19sZTMyCVJPTV9TZXR1cF9EYXRhOwkvKgljOGggCXwgIFJvbSBTZXR1cCBhbmQgRGF0YSAqLworCV9fbGUzMglST01fQ29udHJvbF9BZGRyOy8qCWNjaCAJfCAgUm9tIENvbnRyb2wgYW5kIEFkZHJlc3MgKi8KKwlfX2xlMzIJcmVzZXJ2ZWQzWzEyXTsJLyoJZDBoLWZmaAl8ICByZXNlcnZlZCAqLworCV9fbGUzMglMVVRbNjRdOwkvKiAgICAxMDBoLTFmZmgJfCAgTG9va3VwIFRhYmxlIEVudHJpZXMgKi8KK307CisKKyNkZWZpbmUgTWFpbGJveDAJU2FEYkNTUi5NQUlMQk9YMAorI2RlZmluZSBNYWlsYm94MQlTYURiQ1NSLk1BSUxCT1gxCisjZGVmaW5lIE1haWxib3gyCVNhRGJDU1IuTUFJTEJPWDIKKyNkZWZpbmUgTWFpbGJveDMJU2FEYkNTUi5NQUlMQk9YMworI2RlZmluZSBNYWlsYm94NAlTYURiQ1NSLk1BSUxCT1g0CisjZGVmaW5lIE1haWxib3g1CVNhRGJDU1IuTUFJTEJPWDUKKyNkZWZpbmUgTWFpbGJveDcJU2FEYkNTUi5NQUlMQk9YNworCQorI2RlZmluZSBEb29yYmVsbFJlZ19wIFNhRGJDU1IuUFJJU0VUSVJRCisjZGVmaW5lIERvb3JiZWxsUmVnX3MgU2FEYkNTUi5TRUNTRVRJUlEKKyNkZWZpbmUgRG9vcmJlbGxDbHJSZWdfcCBTYURiQ1NSLlBSSUNMRUFSSVJRCisKKworI2RlZmluZQlET09SQkVMTF8wCTB4MDAwMQorI2RlZmluZSBET09SQkVMTF8xCTB4MDAwMgorI2RlZmluZSBET09SQkVMTF8yCTB4MDAwNAorI2RlZmluZSBET09SQkVMTF8zCTB4MDAwOAorI2RlZmluZSBET09SQkVMTF80CTB4MDAxMAorI2RlZmluZSBET09SQkVMTF81CTB4MDAyMAorI2RlZmluZSBET09SQkVMTF82CTB4MDA0MAorCisJCisjZGVmaW5lIFByaW50ZlJlYWR5CURPT1JCRUxMXzUKKyNkZWZpbmUgUHJpbnRmRG9uZQlET09SQkVMTF81CisJCitzdHJ1Y3Qgc2FfcmVnaXN0ZXJzIHsKKwlzdHJ1Y3Qgc2FfZHJhd2JyaWRnZV9DU1IJU2FEYkNTUjsJCQkvKiA5OGggLSBjNGggKi8KK307CisJCisKKyNkZWZpbmUgU2FfTUlOSVBPUlRfUkVWSVNJT04JCQkxCisKKyNkZWZpbmUgc2FfcmVhZHcoQUVQLCBDU1IpCQlyZWFkbCgmKChBRVApLT5yZWdzLnNhLT5DU1IpKQorI2RlZmluZSBzYV9yZWFkbChBRVAsICBDU1IpCQlyZWFkbCgmKChBRVApLT5yZWdzLnNhLT5DU1IpKQorI2RlZmluZSBzYV93cml0ZXcoQUVQLCBDU1IsIHZhbHVlKQl3cml0ZXcodmFsdWUsICYoKEFFUCktPnJlZ3Muc2EtPkNTUikpCisjZGVmaW5lIHNhX3dyaXRlbChBRVAsIENTUiwgdmFsdWUpCXdyaXRlbCh2YWx1ZSwgJigoQUVQKS0+cmVncy5zYS0+Q1NSKSkKKworLyoKKyAqCVJ4IE1lc3NhZ2UgVW5pdCBSZWdpc3RlcnMKKyAqLworCitzdHJ1Y3QgcnhfbXVfcmVnaXN0ZXJzIHsKKwkJCSAgICAvKglMb2NhbCAgfCBQQ0kqfCBOYW1lICovCisJX19sZTMyCUFSU1I7CSAgICAvKgkxMzAwaCAgfCAwMGggfCBBUElDIFJlZ2lzdGVyIFNlbGVjdCBSZWdpc3RlciAqLworCV9fbGUzMglyZXNlcnZlZDA7ICAvKgkxMzA0aCAgfCAwNGggfCBSZXNlcnZlZCAqLworCV9fbGUzMglBV1I7CSAgICAvKgkxMzA4aCAgfCAwOGggfCBBUElDIFdpbmRvdyBSZWdpc3RlciAqLworCV9fbGUzMglyZXNlcnZlZDE7ICAvKgkxMzBDaCAgfCAwQ2ggfCBSZXNlcnZlZCAqLworCV9fbGUzMglJTVJ4WzJdOyAgICAvKgkxMzEwaCAgfCAxMGggfCBJbmJvdW5kIE1lc3NhZ2UgUmVnaXN0ZXJzICovCisJX19sZTMyCU9NUnhbMl07ICAgIC8qCTEzMThoICB8IDE4aCB8IE91dGJvdW5kIE1lc3NhZ2UgUmVnaXN0ZXJzICovCisJX19sZTMyCUlEUjsJICAgIC8qCTEzMjBoICB8IDIwaCB8IEluYm91bmQgRG9vcmJlbGwgUmVnaXN0ZXIgKi8KKwlfX2xlMzIJSUlTUjsJICAgIC8qCTEzMjRoICB8IDI0aCB8IEluYm91bmQgSW50ZXJydXB0IAorCQkJCQkJU3RhdHVzIFJlZ2lzdGVyICovCisJX19sZTMyCUlJTVI7CSAgICAvKgkxMzI4aCAgfCAyOGggfCBJbmJvdW5kIEludGVycnVwdCAKKwkJCQkJIAlNYXNrIFJlZ2lzdGVyICovCisJX19sZTMyCU9EUjsJICAgIC8qCTEzMkNoICB8IDJDaCB8IE91dGJvdW5kIERvb3JiZWxsIFJlZ2lzdGVyICovCisJX19sZTMyCU9JU1I7CSAgICAvKgkxMzMwaCAgfCAzMGggfCBPdXRib3VuZCBJbnRlcnJ1cHQgCisJCQkJCQlTdGF0dXMgUmVnaXN0ZXIgKi8KKwlfX2xlMzIJT0lNUjsJICAgIC8qCTEzMzRoICB8IDM0aCB8IE91dGJvdW5kIEludGVycnVwdCAKKwkJCQkJCU1hc2sgUmVnaXN0ZXIgKi8KKwkJCSAgICAvKiAqIE11c3QgYWNjZXNzIHRocm91Z2ggQVRVIEluYm91bmQgCisJCQkgICAgIAkgVHJhbnNsYXRpb24gV2luZG93ICovCit9OworCitzdHJ1Y3QgcnhfaW5ib3VuZCB7CisJX19sZTMyCU1haWxib3hbOF07Cit9OworCisjZGVmaW5lCUluYm91bmRNYWlsYm94MAkJSW5kZXhSZWdzLk1haWxib3hbMF0KKyNkZWZpbmUJSW5ib3VuZE1haWxib3gxCQlJbmRleFJlZ3MuTWFpbGJveFsxXQorI2RlZmluZQlJbmJvdW5kTWFpbGJveDIJCUluZGV4UmVncy5NYWlsYm94WzJdCisjZGVmaW5lCUluYm91bmRNYWlsYm94MwkJSW5kZXhSZWdzLk1haWxib3hbM10KKyNkZWZpbmUJSW5ib3VuZE1haWxib3g0CQlJbmRleFJlZ3MuTWFpbGJveFs0XQorI2RlZmluZQlJbmJvdW5kTWFpbGJveDUJCUluZGV4UmVncy5NYWlsYm94WzVdCisjZGVmaW5lCUluYm91bmRNYWlsYm94NgkJSW5kZXhSZWdzLk1haWxib3hbNl0KKworI2RlZmluZQlJTkJPVU5ERE9PUkJFTExfMAkweDAwMDAwMDAxCisjZGVmaW5lIElOQk9VTkRET09SQkVMTF8xCTB4MDAwMDAwMDIKKyNkZWZpbmUgSU5CT1VORERPT1JCRUxMXzIJMHgwMDAwMDAwNAorI2RlZmluZSBJTkJPVU5ERE9PUkJFTExfMwkweDAwMDAwMDA4CisjZGVmaW5lIElOQk9VTkRET09SQkVMTF80CTB4MDAwMDAwMTAKKyNkZWZpbmUgSU5CT1VORERPT1JCRUxMXzUJMHgwMDAwMDAyMAorI2RlZmluZSBJTkJPVU5ERE9PUkJFTExfNgkweDAwMDAwMDQwCisKKyNkZWZpbmUJT1VUQk9VTkRET09SQkVMTF8wCTB4MDAwMDAwMDEKKyNkZWZpbmUgT1VUQk9VTkRET09SQkVMTF8xCTB4MDAwMDAwMDIKKyNkZWZpbmUgT1VUQk9VTkRET09SQkVMTF8yCTB4MDAwMDAwMDQKKyNkZWZpbmUgT1VUQk9VTkRET09SQkVMTF8zCTB4MDAwMDAwMDgKKyNkZWZpbmUgT1VUQk9VTkRET09SQkVMTF80CTB4MDAwMDAwMTAKKworI2RlZmluZSBJbmJvdW5kRG9vcmJlbGxSZWcJTVVuaXQuSURSCisjZGVmaW5lIE91dGJvdW5kRG9vcmJlbGxSZWcJTVVuaXQuT0RSCisKK3N0cnVjdCByeF9yZWdpc3RlcnMgeworCXN0cnVjdCByeF9tdV9yZWdpc3RlcnMJCU1Vbml0OwkJLyogMTMwMGggLSAxMzM0aCAqLworCV9fbGUzMgkJCQlyZXNlcnZlZDFbNl07CS8qIDEzMzhoIC0gMTM0Y2ggKi8KKwlzdHJ1Y3QgcnhfaW5ib3VuZAkJSW5kZXhSZWdzOworfTsKKworI2RlZmluZSByeF9yZWFkYihBRVAsIENTUikJCXJlYWRiKCYoKEFFUCktPnJlZ3MucngtPkNTUikpCisjZGVmaW5lIHJ4X3JlYWRsKEFFUCwgQ1NSKQkJcmVhZGwoJigoQUVQKS0+cmVncy5yeC0+Q1NSKSkKKyNkZWZpbmUgcnhfd3JpdGViKEFFUCwgQ1NSLCB2YWx1ZSkJd3JpdGViKHZhbHVlLCAmKChBRVApLT5yZWdzLnJ4LT5DU1IpKQorI2RlZmluZSByeF93cml0ZWwoQUVQLCBDU1IsIHZhbHVlKQl3cml0ZWwodmFsdWUsICYoKEFFUCktPnJlZ3MucngtPkNTUikpCisKKy8qCisgKglSa3QgTWVzc2FnZSBVbml0IFJlZ2lzdGVycyAoc2FtZSBhcyBSeCwgZXhjZXB0IGEgbGFyZ2VyIHJlc2VydmUgcmVnaW9uKQorICovCisKKyNkZWZpbmUgcmt0X211X3JlZ2lzdGVycyByeF9tdV9yZWdpc3RlcnMKKyNkZWZpbmUgcmt0X2luYm91bmQgcnhfaW5ib3VuZAorCitzdHJ1Y3Qgcmt0X3JlZ2lzdGVycyB7CisJc3RydWN0IHJrdF9tdV9yZWdpc3RlcnMJCU1Vbml0OwkJIC8qIDEzMDBoIC0gMTMzNGggKi8KKwlfX2xlMzIJCQkJcmVzZXJ2ZWQxWzEwMTBdOyAvKiAxMzM4aCAtIDIyZmNoICovCisJc3RydWN0IHJrdF9pbmJvdW5kCQlJbmRleFJlZ3M7CSAvKiAyMzAwaCAtICovCit9OworCisjZGVmaW5lIHJrdF9yZWFkYihBRVAsIENTUikJCXJlYWRiKCYoKEFFUCktPnJlZ3Mucmt0LT5DU1IpKQorI2RlZmluZSBya3RfcmVhZGwoQUVQLCBDU1IpCQlyZWFkbCgmKChBRVApLT5yZWdzLnJrdC0+Q1NSKSkKKyNkZWZpbmUgcmt0X3dyaXRlYihBRVAsIENTUiwgdmFsdWUpCXdyaXRlYih2YWx1ZSwgJigoQUVQKS0+cmVncy5ya3QtPkNTUikpCisjZGVmaW5lIHJrdF93cml0ZWwoQUVQLCBDU1IsIHZhbHVlKQl3cml0ZWwodmFsdWUsICYoKEFFUCktPnJlZ3Mucmt0LT5DU1IpKQorCitzdHJ1Y3QgZmliOworCit0eXBlZGVmIHZvaWQgKCpmaWJfY2FsbGJhY2spKHZvaWQgKmN0eHQsIHN0cnVjdCBmaWIgKmZpYmN0eCk7CisKK3N0cnVjdCBhYWNfZmliX2NvbnRleHQgeworCXMxNgkgCQl0eXBlOwkJLy8gdXNlZCBmb3IgdmVyaWZpY2F0aW9uIG9mIHN0cnVjdHVyZQkKKwlzMTYJIAkJc2l6ZTsKKwl1MzIJCQl1bmlxdWU7CQkvLyB1bmlxdWUgdmFsdWUgcmVwcmVzZW50aW5nIHRoaXMgY29udGV4dAorCXVsb25nCQkJamlmZmllczsJLy8gdXNlZCBmb3IgY2xlYW51cCAtIGRtYiBjaGFuZ2VkIHRvIHVsb25nCisJc3RydWN0IGxpc3RfaGVhZAluZXh0OwkJLy8gdXNlZCB0byBsaW5rIGNvbnRleHQncyBpbnRvIGEgbGlua2VkIGxpc3QKKwlzdHJ1Y3Qgc2VtYXBob3JlIAl3YWl0X3NlbTsJLy8gdGhpcyBpcyB1c2VkIHRvIHdhaXQgZm9yIHRoZSBuZXh0IGZpYiB0byBhcnJpdmUuCisJaW50CQkJd2FpdDsJCS8vIFNldCB0byB0cnVlIHdoZW4gdGhyZWFkIGlzIGluIFdhaXRGb3JTaW5nbGVPYmplY3QKKwl1bnNpZ25lZCBsb25nCQljb3VudDsJCS8vIHRvdGFsIG51bWJlciBvZiBGSUJzIG9uIEZpYkxpc3QKKwlzdHJ1Y3QgbGlzdF9oZWFkCWZpYl9saXN0OwkvLyB0aGlzIGhvbGRzIGZpYnMgYW5kIHRoZWlyIGF0dGFjaGQgaHdfZmlicworfTsKKworc3RydWN0IHNlbnNlX2RhdGEgeworCXU4IGVycm9yX2NvZGU7CQkvKiA3MGggKGN1cnJlbnQgZXJyb3JzKSwgNzFoKGRlZmVycmVkIGVycm9ycykgKi8KKwl1OCB2YWxpZDoxOwkJLyogQSB2YWxpZCBiaXQgb2Ygb25lIGluZGljYXRlcyB0aGF0IHRoZSBpbmZvcm1hdGlvbiAgKi8KKwkJCQkvKiBmaWVsZCBjb250YWlucyB2YWxpZCBpbmZvcm1hdGlvbiBhcyBkZWZpbmVkIGluIHRoZQorCQkJCSAqIFNDU0ktMiBTdGFuZGFyZC4KKwkJCQkgKi8KKwl1OCBzZWdtZW50X251bWJlcjsJLyogT25seSB1c2VkIGZvciBDT1BZLCBDT01QQVJFLCBvciBDT1BZIEFORCBWRVJJRlkgQ29tbWFuZHMgKi8KKwl1OCBzZW5zZV9rZXk6NDsJCS8qIFNlbnNlIEtleSAqLworCXU4IHJlc2VydmVkOjE7CisJdTggSUxJOjE7CQkvKiBJbmNvcnJlY3QgTGVuZ3RoIEluZGljYXRvciAqLworCXU4IEVPTToxOwkJLyogRW5kIE9mIE1lZGl1bSAtIHJlc2VydmVkIGZvciByYW5kb20gYWNjZXNzIGRldmljZXMgKi8KKwl1OCBmaWxlbWFyazoxOwkJLyogRmlsZW1hcmsgLSByZXNlcnZlZCBmb3IgcmFuZG9tIGFjY2VzcyBkZXZpY2VzICovCisKKwl1OCBpbmZvcm1hdGlvbls0XTsJLyogZm9yIGRpcmVjdC1hY2Nlc3MgZGV2aWNlcywgY29udGFpbnMgdGhlIHVuc2lnbmVkIAorCQkJCSAqIGxvZ2ljYWwgYmxvY2sgYWRkcmVzcyBvciByZXNpZHVlIGFzc29jaWF0ZWQgd2l0aCAKKwkJCQkgKiB0aGUgc2Vuc2Uga2V5IAorCQkJCSAqLworCXU4IGFkZF9zZW5zZV9sZW47CS8qIG51bWJlciBvZiBhZGRpdGlvbmFsIHNlbnNlIGJ5dGVzIHRvIGZvbGxvdyB0aGlzIGZpZWxkICovCisJdTggY21uZF9pbmZvWzRdOwkvKiBub3QgdXNlZCAqLworCXU4IEFTQzsJCQkvKiBBZGRpdGlvbmFsIFNlbnNlIENvZGUgKi8KKwl1OCBBU0NROwkJLyogQWRkaXRpb25hbCBTZW5zZSBDb2RlIFF1YWxpZmllciAqLworCXU4IEZSVUM7CQkvKiBGaWVsZCBSZXBsYWNlYWJsZSBVbml0IENvZGUgLSBub3QgdXNlZCAqLworCXU4IGJpdF9wdHI6MzsJCS8qIGluZGljYXRlcyB3aGljaCBieXRlIG9mIHRoZSBDREIgb3IgcGFyYW1ldGVyIGRhdGEKKwkJCQkgKiB3YXMgaW4gZXJyb3IKKwkJCQkgKi8KKwl1OCBCUFY6MTsJCS8qIGJpdCBwb2ludGVyIHZhbGlkIChCUFYpOiAxLSBpbmRpY2F0ZXMgdGhhdCAKKwkJCQkgKiB0aGUgYml0X3B0ciBmaWVsZCBoYXMgdmFsaWQgdmFsdWUKKwkJCQkgKi8KKwl1OCByZXNlcnZlZDI6MjsKKwl1OCBDRDoxOwkJLyogY29tbWFuZCBkYXRhIGJpdDogMS0gaWxsZWdhbCBwYXJhbWV0ZXIgaW4gQ0RCLgorCQkJCSAqIDAtIGlsbGVnYWwgcGFyYW1ldGVyIGluIGRhdGEuCisJCQkJICovCisJdTggU0tTVjoxOworCXU4IGZpZWxkX3B0clsyXTsJLyogYnl0ZSBvZiB0aGUgQ0RCIG9yIHBhcmFtZXRlciBkYXRhIGluIGVycm9yICovCit9OworCitzdHJ1Y3QgZnNhX2Rldl9pbmZvIHsKKwl1NjQJCWxhc3Q7CisJdTY0CQlzaXplOworCXUzMgkJdHlwZTsKKwl1MTYJCXF1ZXVlX2RlcHRoOworCXU4CQl2YWxpZDsKKwl1OAkJcm87CisJdTgJCWxvY2tlZDsKKwl1OAkJZGVsZXRlZDsKKwljaGFyCQlkZXZuYW1lWzhdOworCXN0cnVjdCBzZW5zZV9kYXRhIHNlbnNlX2RhdGE7Cit9OworCitzdHJ1Y3QgZmliIHsKKwl2b2lkCQkJKm5leHQ7CS8qIHRoaXMgaXMgdXNlZCBieSB0aGUgYWxsb2NhdG9yICovCisJczE2CQkJdHlwZTsKKwlzMTYJCQlzaXplOworCS8qCisJICoJVGhlIEFkYXB0ZXIgdGhhdCB0aGlzIEkvTyBpcyBkZXN0aW5lZCBmb3IuCisJICovCisJc3RydWN0IGFhY19kZXYgCQkqZGV2OworCS8qCisJICoJVGhpcyBpcyB0aGUgZXZlbnQgdGhlIHNlbmRmaWIgcm91dGluZSB3aWxsIHdhaXQgb24gaWYgdGhlCisJICoJY2FsbGVyIGRpZCBub3QgcGFzcyBvbmUgYW5kIHRoaXMgaXMgc3luY2ggaW8uCisJICovCisJc3RydWN0IHNlbWFwaG9yZSAJZXZlbnRfd2FpdDsKKwlzcGlubG9ja190CQlldmVudF9sb2NrOworCisJdTMyCQkJZG9uZTsJLyogZ2V0cyBzZXQgdG8gMSB3aGVuIGZpYiBpcyBjb21wbGV0ZSAqLworCWZpYl9jYWxsYmFjayAJCWNhbGxiYWNrOworCXZvaWQgCQkJKmNhbGxiYWNrX2RhdGE7CisJdTMyCQkJZmxhZ3M7IC8vIHUzMiBkbWIgd2FzIHVsb25nCisJLyoKKwkgKglUaGUgZm9sbG93aW5nIGlzIHVzZWQgdG8gcHV0IHRoaXMgZmliIGNvbnRleHQgb250byB0aGUgCisJICoJT3V0c3RhbmRpbmcgSS9PIHF1ZXVlLgorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQJcXVldWU7CisJLyoKKwkgKglBbmQgZm9yIHRoZSBpbnRlcm5hbCBpc3N1ZS9yZXBseSBxdWV1ZXMgKHdlIG1heSBiZSBhYmxlCisJICoJdG8gbWVyZ2UgdGhlc2UgdHdvKQorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQJZmlibGluazsKKwl2b2lkIAkJCSpkYXRhOworCXN0cnVjdCBod19maWIJCSpod19maWI7CQkvKiBBY3R1YWwgc2hhcmVkIG9iamVjdCAqLworCWRtYV9hZGRyX3QJCWh3X2ZpYl9wYTsJCS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgaHdfZmliKi8KK307CisKKy8qCisgKglBZGFwdGVyIEluZm9ybWF0aW9uIEJsb2NrCisgKgorICoJVGhpcyBpcyByZXR1cm5lZCBieSB0aGUgUmVxdWVzdEFkYXB0ZXJJbmZvIGJsb2NrCisgKi8KKyAKK3N0cnVjdCBhYWNfYWRhcHRlcl9pbmZvCit7CisJdTMyCXBsYXRmb3JtOworCXUzMgljcHU7CisJdTMyCXN1YmNwdTsKKwl1MzIJY2xvY2s7CisJdTMyCWV4ZWNtZW07CisJdTMyCWJ1ZmZlcm1lbTsKKwl1MzIJdG90YWxtZW07CisJdTMyCWtlcm5lbHJldjsKKwl1MzIJa2VybmVsYnVpbGQ7CisJdTMyCW1vbml0b3JyZXY7CisJdTMyCW1vbml0b3JidWlsZDsKKwl1MzIJaHdyZXY7CisJdTMyCWh3YnVpbGQ7CisJdTMyCWJpb3NyZXY7CisJdTMyCWJpb3NidWlsZDsKKwl1MzIJY2x1c3RlcjsKKwl1MzIJY2x1c3RlcmNoYW5uZWxtYXNrOyAKKwl1MzIJc2VyaWFsWzJdOworCXUzMgliYXR0ZXJ5OworCXUzMglvcHRpb25zOworCXUzMglPRU07Cit9OworCisvKgorICogQmF0dGVyeSBwbGF0Zm9ybXMKKyAqLworI2RlZmluZSBBQUNfQkFUX1JFUV9QUkVTRU5UCSgxKQorI2RlZmluZSBBQUNfQkFUX1JFUV9OT1RQUkVTRU5UCSgyKQorI2RlZmluZSBBQUNfQkFUX09QVF9QUkVTRU5UCSgzKQorI2RlZmluZSBBQUNfQkFUX09QVF9OT1RQUkVTRU5UCSg0KQorI2RlZmluZSBBQUNfQkFUX05PVF9TVVBQT1JURUQJKDUpCisvKgorICogY3B1IHR5cGVzCisgKi8KKyNkZWZpbmUgQUFDX0NQVV9TSU1VTEFUT1IJKDEpCisjZGVmaW5lIEFBQ19DUFVfSTk2MAkJKDIpCisjZGVmaW5lIEFBQ19DUFVfU1RST05HQVJNCSgzKQorCisvKgorICogU3VwcG9ydGVkIE9wdGlvbnMKKyAqLworI2RlZmluZSBBQUNfT1BUX1NOQVBTSE9UCQljcHVfdG9fbGUzMigxKQorI2RlZmluZSBBQUNfT1BUX0NMVVNURVJTCQljcHVfdG9fbGUzMigxPDwxKQorI2RlZmluZSBBQUNfT1BUX1dSSVRFX0NBQ0hFCQljcHVfdG9fbGUzMigxPDwyKQorI2RlZmluZSBBQUNfT1BUXzY0QklUX0RBVEEJCWNwdV90b19sZTMyKDE8PDMpCisjZGVmaW5lIEFBQ19PUFRfSE9TVF9USU1FX0ZJQgkJY3B1X3RvX2xlMzIoMTw8NCkKKyNkZWZpbmUgQUFDX09QVF9SQUlENTAJCQljcHVfdG9fbGUzMigxPDw1KQorI2RlZmluZSBBQUNfT1BUXzRHQl9XSU5ET1cJCWNwdV90b19sZTMyKDE8PDYpCisjZGVmaW5lIEFBQ19PUFRfU0NTSV9VUEdSQURFQUJMRSAJY3B1X3RvX2xlMzIoMTw8NykKKyNkZWZpbmUgQUFDX09QVF9TT0ZUX0VSUl9SRVBPUlQJCWNwdV90b19sZTMyKDE8PDgpCisjZGVmaW5lIEFBQ19PUFRfU1VQUE9SVEVEX1JFQ09ORElUSU9OIAljcHVfdG9fbGUzMigxPDw5KQorI2RlZmluZSBBQUNfT1BUX1NHTUFQX0hPU1Q2NAkJY3B1X3RvX2xlMzIoMTw8MTApCisjZGVmaW5lIEFBQ19PUFRfQUxBUk0JCQljcHVfdG9fbGUzMigxPDwxMSkKKyNkZWZpbmUgQUFDX09QVF9OT05EQVNECQkJY3B1X3RvX2xlMzIoMTw8MTIpCisjZGVmaW5lIEFBQ19PUFRfU0NTSV9NQU5BR0VEICAgIAljcHVfdG9fbGUzMigxPDwxMykKKyNkZWZpbmUgQUFDX09QVF9SQUlEX1NDU0lfTU9ERQkJY3B1X3RvX2xlMzIoMTw8MTQpCisjZGVmaW5lIEFBQ19PUFRfU1VQUExFTUVOVF9BREFQVEVSX0lORk8JY3B1X3RvX2xlMzIoMTw8MTYpCisjZGVmaW5lIEFBQ19PUFRfTkVXX0NPTU0JCWNwdV90b19sZTMyKDE8PDE3KQorI2RlZmluZSBBQUNfT1BUX05FV19DT01NXzY0CQljcHVfdG9fbGUzMigxPDwxOCkKKworc3RydWN0IGFhY19kZXYKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCWVudHJ5OworCWNvbnN0IGNoYXIJCSpuYW1lOworCWludAkJCWlkOworCisJdTE2CQkJaXJxX21hc2s7CisJLyoKKwkgKglNYXAgZm9yIDEyOCBmaWIgb2JqZWN0cyAoNjRrKQorCSAqLwkKKwlkbWFfYWRkcl90CQlod19maWJfcGE7CisJc3RydWN0IGh3X2ZpYgkJKmh3X2ZpYl92YTsKKwlzdHJ1Y3QgaHdfZmliCQkqYWlmX2Jhc2VfdmE7CisJLyoKKwkgKglGaWIgSGVhZGVycworCSAqLworCXN0cnVjdCBmaWIgICAgICAgICAgICAgICpmaWJzOworCisJc3RydWN0IGZpYgkJKmZyZWVfZmliOworCXN0cnVjdCBmaWIJCSp0aW1lb3V0X2ZpYjsKKwlzcGlubG9ja190CQlmaWJfbG9jazsKKwkKKwlzdHJ1Y3QgYWFjX3F1ZXVlX2Jsb2NrICpxdWV1ZXM7CisJLyoKKwkgKglUaGUgdXNlciBBUEkgd2lsbCB1c2UgYW4gSU9DVEwgdG8gcmVnaXN0ZXIgaXRzZWxmIHRvIHJlY2VpdmUKKwkgKglGSUJzIGZyb20gdGhlIGFkYXB0ZXIuICBUaGUgZm9sbG93aW5nIGxpc3QgaXMgdXNlZCB0byBrZWVwCisJICoJdHJhY2sgb2YgYWxsIHRoZSB0aHJlYWRzIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdGhlc2UgRklCcy4gIFRoZQorCSAqCW11dGV4IGlzIHVzZWQgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIGFsbCBkYXRhIGFzc29jaWF0ZWQgCisJICoJd2l0aCB0aGUgYWRhcHRlciBmaWJzLgorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQJZmliX2xpc3Q7CisKKwlzdHJ1Y3QgYWRhcHRlcl9vcHMJYV9vcHM7CisJdW5zaWduZWQgbG9uZwkJZnNyZXY7CQkvKiBNYWluIGRyaXZlcidzIHJldmlzaW9uIG51bWJlciAqLworCQorCXN0cnVjdCBhYWNfaW5pdAkJKmluaXQ7CQkvKiBIb2xkcyBpbml0aWFsaXphdGlvbiBpbmZvIHRvIGNvbW11bmljYXRlIHdpdGggYWRhcHRlciAqLworCWRtYV9hZGRyX3QJCWluaXRfcGE7IAkvKiBIb2xkcyBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBpbml0IHN0cnVjdCAqLworCQorCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsJCS8qIE91ciBQQ0kgaW50ZXJmYWNlICovCisJdm9pZCAqCQkJcHJpbnRmYnVmOwkvKiBwb2ludGVyIHRvIGJ1ZmZlciB1c2VkIGZvciBwcmludGYncyBmcm9tIHRoZSBhZGFwdGVyICovCisJdm9pZCAqCQkJY29tbV9hZGRyOwkvKiBCYXNlIGFkZHJlc3Mgb2YgQ29tbSBhcmVhICovCisJZG1hX2FkZHJfdAkJY29tbV9waHlzOwkvKiBQaHlzaWNhbCBBZGRyZXNzIG9mIENvbW0gYXJlYSAqLworCXNpemVfdAkJCWNvbW1fc2l6ZTsKKworCXN0cnVjdCBTY3NpX0hvc3QJKnNjc2lfaG9zdF9wdHI7CisJaW50CQkJbWF4aW11bV9udW1fY29udGFpbmVyczsKKwlzdHJ1Y3QgZnNhX2Rldl9pbmZvCSpmc2FfZGV2OworCXBpZF90CQkJdGhyZWFkX3BpZDsKKwlpbnQJCQljYXJkdHlwZTsKKwkKKwkvKgorCSAqCVRoZSBmb2xsb3dpbmcgaXMgdGhlIGRldmljZSBzcGVjaWZpYyBleHRlbnNpb24uCisJICovCisJdW5pb24KKwl7CisJCXN0cnVjdCBzYV9yZWdpc3RlcnMgX19pb21lbSAqc2E7CisJCXN0cnVjdCByeF9yZWdpc3RlcnMgX19pb21lbSAqcng7CisJCXN0cnVjdCBya3RfcmVnaXN0ZXJzIF9faW9tZW0gKnJrdDsKKwl9IHJlZ3M7CisJdTMyCQkJT0lNUjsgLyogTWFzayBSZWdpc3RlciBDYWNoZSAqLworCS8qCisJICoJQUlGIHRocmVhZCBzdGF0ZXMKKwkgKi8KKwl1MzIJCQlhaWZfdGhyZWFkOworCXN0cnVjdCBjb21wbGV0aW9uCWFpZl9jb21wbGV0aW9uOworCXN0cnVjdCBhYWNfYWRhcHRlcl9pbmZvIGFkYXB0ZXJfaW5mbzsKKwkvKiBUaGVzZSBhcmUgaW4gYWRhcHRlciBpbmZvIGJ1dCB0aGV5IGFyZSBpbiB0aGUgaW8gZmxvdyBzbworCSAqIGxldHMgYnJlYWsgdGhlbSBvdXQgc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbiBBTkQgdG8gY2hlY2sgdGhlbQorCSAqLworCXU4CQkJbm9uZGFzZF9zdXBwb3J0OyAKKwl1OAkJCWRhY19zdXBwb3J0OworCXU4CQkJcmFpZF9zY3NpX21vZGU7Cit9OworCisjZGVmaW5lIGFhY19hZGFwdGVyX2ludGVycnVwdChkZXYpIFwKKwkoZGV2KS0+YV9vcHMuYWRhcHRlcl9pbnRlcnJ1cHQoZGV2KQorCisjZGVmaW5lIGFhY19hZGFwdGVyX25vdGlmeShkZXYsIGV2ZW50KSBcCisJKGRldiktPmFfb3BzLmFkYXB0ZXJfbm90aWZ5KGRldiwgZXZlbnQpCisKKworI2RlZmluZSBhYWNfYWRhcHRlcl9jaGVja19oZWFsdGgoZGV2KSBcCisJKGRldiktPmFfb3BzLmFkYXB0ZXJfY2hlY2tfaGVhbHRoKGRldikKKworCisjZGVmaW5lIEZJQl9DT05URVhUX0ZMQUdfVElNRURfT1VUCQkoMHgwMDAwMDAwMSkKKworLyoKKyAqCURlZmluZSB0aGUgY29tbWFuZCB2YWx1ZXMKKyAqLworIAorI2RlZmluZQkJTnVsbAkJCTAKKyNkZWZpbmUgCUdldEF0dHJpYnV0ZXMJCTEKKyNkZWZpbmUgCVNldEF0dHJpYnV0ZXMJCTIKKyNkZWZpbmUgCUxvb2t1cAkJCTMKKyNkZWZpbmUgCVJlYWRMaW5rCQk0CisjZGVmaW5lIAlSZWFkCQkJNQorI2RlZmluZSAJV3JpdGUJCQk2CisjZGVmaW5lCQlDcmVhdGUJCQk3CisjZGVmaW5lCQlNYWtlRGlyZWN0b3J5CQk4CisjZGVmaW5lCQlTeW1ib2xpY0xpbmsJCTkKKyNkZWZpbmUJCU1ha2VOb2RlCQkxMAorI2RlZmluZQkJUmVtb3ZleAkJCTExCisjZGVmaW5lCQlSZW1vdmVEaXJlY3Rvcnl4CTEyCisjZGVmaW5lCQlSZW5hbWUJCQkxMworI2RlZmluZQkJTGluawkJCTE0CisjZGVmaW5lCQlSZWFkRGlyZWN0b3J5CQkxNQorI2RlZmluZQkJUmVhZERpcmVjdG9yeVBsdXMJMTYKKyNkZWZpbmUJCUZpbGVTeXN0ZW1TdGF0dXMJMTcKKyNkZWZpbmUJCUZpbGVTeXN0ZW1JbmZvCQkxOAorI2RlZmluZQkJUGF0aENvbmZpZ3VyZQkJMTkKKyNkZWZpbmUJCUNvbW1pdAkJCTIwCisjZGVmaW5lCQlNb3VudAkJCTIxCisjZGVmaW5lCQlVbk1vdW50CQkJMjIKKyNkZWZpbmUJCU5ld2ZzCQkJMjMKKyNkZWZpbmUJCUZzQ2hlY2sJCQkyNAorI2RlZmluZQkJRnNTeW5jCQkJMjUKKyNkZWZpbmUJCVNpbVJlYWRXcml0ZQkJMjYKKyNkZWZpbmUJCVNldEZpbGVTeXN0ZW1TdGF0dXMJMjcKKyNkZWZpbmUJCUJsb2NrUmVhZAkJMjgKKyNkZWZpbmUJCUJsb2NrV3JpdGUJCTI5CisjZGVmaW5lCQlOdnJhbUlvY3RsCQkzMAorI2RlZmluZQkJRnNTeW5jV2FpdAkJMzEKKyNkZWZpbmUJCUNsZWFyQXJjaGl2ZUJpdAkJMzIKKyNkZWZpbmUJCVNldEFjbAkJCTMzCisjZGVmaW5lCQlHZXRBY2wJCQkzNAorI2RlZmluZQkJQXNzaWduQWNsCQkzNQorI2RlZmluZQkJRmF1bHRJbnNlcnRpb24JCTM2CS8qIEZhdWx0IEluc2VydGlvbiBDb21tYW5kICovCisjZGVmaW5lCQlDcmF6eUNhY2hlCQkzNwkvKiBDcmF6eWNhY2hlICovCisKKyNkZWZpbmUJCU1BWF9GU0FDT01NQU5EX05VTQkzOAorCisKKy8qCisgKglEZWZpbmUgdGhlIHN0YXR1cyByZXR1cm5zLiBUaGVzZSBhcmUgdmVyeSB1bml4bGlrZSBhbHRob3VnaAorICoJbW9zdCBhcmUgbm90IGluIGZhY3QgdXNlZAorICovCisKKyNkZWZpbmUJCVNUX09LCQkwCisjZGVmaW5lCQlTVF9QRVJNCQkxCisjZGVmaW5lCQlTVF9OT0VOVAkyCisjZGVmaW5lCQlTVF9JTwkJNQorI2RlZmluZQkJU1RfTlhJTwkJNgorI2RlZmluZQkJU1RfRTJCSUcJNworI2RlZmluZQkJU1RfQUNDRVMJMTMKKyNkZWZpbmUJCVNUX0VYSVNUCTE3CisjZGVmaW5lCQlTVF9YREVWCQkxOAorI2RlZmluZQkJU1RfTk9ERVYJMTkKKyNkZWZpbmUJCVNUX05PVERJUgkyMAorI2RlZmluZQkJU1RfSVNESVIJMjEKKyNkZWZpbmUJCVNUX0lOVkFMCTIyCisjZGVmaW5lCQlTVF9GQklHCQkyNworI2RlZmluZQkJU1RfTk9TUEMJMjgKKyNkZWZpbmUJCVNUX1JPRlMJCTMwCisjZGVmaW5lCQlTVF9NTElOSwkzMQorI2RlZmluZQkJU1RfV09VTERCTE9DSwkzNQorI2RlZmluZQkJU1RfTkFNRVRPT0xPTkcJNjMKKyNkZWZpbmUJCVNUX05PVEVNUFRZCTY2CisjZGVmaW5lCQlTVF9EUVVPVAk2OQorI2RlZmluZQkJU1RfU1RBTEUJNzAKKyNkZWZpbmUJCVNUX1JFTU9URQk3MQorI2RlZmluZQkJU1RfQkFESEFORExFCTEwMDAxCisjZGVmaW5lCQlTVF9OT1RfU1lOQwkxMDAwMgorI2RlZmluZQkJU1RfQkFEX0NPT0tJRQkxMDAwMworI2RlZmluZQkJU1RfTk9UU1VQUAkxMDAwNAorI2RlZmluZQkJU1RfVE9PU01BTEwJMTAwMDUKKyNkZWZpbmUJCVNUX1NFUlZFUkZBVUxUCTEwMDA2CisjZGVmaW5lCQlTVF9CQURUWVBFCTEwMDA3CisjZGVmaW5lCQlTVF9KVUtFQk9YCTEwMDA4CisjZGVmaW5lCQlTVF9OT1RNT1VOVEVECTEwMDA5CisjZGVmaW5lCQlTVF9NQUlOVE1PREUJMTAwMTAKKyNkZWZpbmUJCVNUX1NUQUxFQUNMCTEwMDExCisKKy8qCisgKglPbiB3cml0ZXMgaG93IGRvZXMgdGhlIGNsaWVudCB3YW50IHRoZSBkYXRhIHdyaXR0ZW4uCisgKi8KKworI2RlZmluZQlDQUNIRV9DU1RBQkxFCQkxCisjZGVmaW5lIENBQ0hFX1VOU1RBQkxFCQkyCisKKy8qCisgKglMZXRzIHRoZSBjbGllbnQga25vdyBhdCB3aGljaCBsZXZlbCB0aGUgZGF0YSB3YXMgY29tbWl0ZWQgb24KKyAqCWEgd3JpdGUgcmVxdWVzdAorICovCisKKyNkZWZpbmUJQ01GSUxFX1NZTkNIX05WUkFNCTEKKyNkZWZpbmUJQ01EQVRBX1NZTkNIX05WUkFNCTIKKyNkZWZpbmUJQ01GSUxFX1NZTkNICQkzCisjZGVmaW5lIENNREFUQV9TWU5DSAkJNAorI2RlZmluZSBDTVVOU1RBQkxFCQk1CisKK3N0cnVjdCBhYWNfcmVhZAoreworCXUzMgkgCWNvbW1hbmQ7CisJdTMyIAkJY2lkOworCXUzMiAJCWJsb2NrOworCXUzMiAJCWNvdW50OworCXN0cnVjdCBzZ21hcAlzZzsJLy8gTXVzdCBiZSBsYXN0IGluIHN0cnVjdCBiZWNhdXNlIGl0IGlzIHZhcmlhYmxlCit9OworCitzdHJ1Y3QgYWFjX3JlYWQ2NAoreworCXUzMgkgCWNvbW1hbmQ7CisJdTE2IAkJY2lkOworCXUxNiAJCXNlY3Rvcl9jb3VudDsKKwl1MzIgCQlibG9jazsKKwl1MTYJCXBhZDsKKwl1MTYJCWZsYWdzOworCXN0cnVjdCBzZ21hcDY0CXNnOwkvLyBNdXN0IGJlIGxhc3QgaW4gc3RydWN0IGJlY2F1c2UgaXQgaXMgdmFyaWFibGUKK307CisKK3N0cnVjdCBhYWNfcmVhZF9yZXBseQoreworCXUzMgkgCXN0YXR1czsKKwl1MzIgCQljb3VudDsKK307CisKK3N0cnVjdCBhYWNfd3JpdGUKK3sKKwl1MzIJCWNvbW1hbmQ7CisJdTMyIAkJY2lkOworCXUzMiAJCWJsb2NrOworCXUzMiAJCWNvdW50OworCXUzMgkgCXN0YWJsZTsJLy8gTm90IHVzZWQKKwlzdHJ1Y3Qgc2dtYXAJc2c7CS8vIE11c3QgYmUgbGFzdCBpbiBzdHJ1Y3QgYmVjYXVzZSBpdCBpcyB2YXJpYWJsZQorfTsKKworc3RydWN0IGFhY193cml0ZTY0Cit7CisJdTMyCSAJY29tbWFuZDsKKwl1MTYgCQljaWQ7CisJdTE2IAkJc2VjdG9yX2NvdW50OworCXUzMiAJCWJsb2NrOworCXUxNgkJcGFkOworCXUxNgkJZmxhZ3M7CisJc3RydWN0IHNnbWFwNjQJc2c7CS8vIE11c3QgYmUgbGFzdCBpbiBzdHJ1Y3QgYmVjYXVzZSBpdCBpcyB2YXJpYWJsZQorfTsKK3N0cnVjdCBhYWNfd3JpdGVfcmVwbHkKK3sKKwl1MzIJCXN0YXR1czsKKwl1MzIgCQljb3VudDsKKwl1MzIJCWNvbW1pdHRlZDsKK307CisKKyNkZWZpbmUgQ1RfRkxVU0hfQ0FDSEUgMTI5CitzdHJ1Y3QgYWFjX3N5bmNocm9uaXplIHsKKwl1MzIJCWNvbW1hbmQ7CS8qIFZNX0NvbnRhaW5lckNvbmZpZyAqLworCXUzMgkJdHlwZTsJCS8qIENUX0ZMVVNIX0NBQ0hFICovCisJdTMyCQljaWQ7CisJdTMyCQlwYXJtMTsKKwl1MzIJCXBhcm0yOworCXUzMgkJcGFybTM7CisJdTMyCQlwYXJtNDsKKwl1MzIJCWNvdW50OwkvKiBzaXplb2YoKChzdHJ1Y3QgYWFjX3N5bmNocm9uaXplX3JlcGx5ICopTlVMTCktPmRhdGEpICovCit9OworCitzdHJ1Y3QgYWFjX3N5bmNocm9uaXplX3JlcGx5IHsKKwl1MzIJCWR1bW15MDsKKwl1MzIJCWR1bW15MTsKKwl1MzIJCXN0YXR1czsJLyogQ1RfT0sgKi8KKwl1MzIJCXBhcm0xOworCXUzMgkJcGFybTI7CisJdTMyCQlwYXJtMzsKKwl1MzIJCXBhcm00OworCXUzMgkJcGFybTU7CisJdTgJCWRhdGFbMTZdOworfTsKKworc3RydWN0IGFhY19zcmIKK3sKKwl1MzIJCWZ1bmN0aW9uOworCXUzMgkJY2hhbm5lbDsKKwl1MzIJCWlkOworCXUzMgkJbHVuOworCXUzMgkJdGltZW91dDsKKwl1MzIJCWZsYWdzOworCXUzMgkJY291bnQ7CQkvLyBEYXRhIHhmZXIgc2l6ZQorCXUzMgkJcmV0cnlfbGltaXQ7CisJdTMyCQljZGJfc2l6ZTsKKwl1OAkJY2RiWzE2XTsKKwlzdHJ1Y3QJc2dtYXAJc2c7Cit9OworCisKKworI2RlZmluZQkJQUFDX1NFTlNFX0JVRkZFUlNJWkUJIDMwCisKK3N0cnVjdCBhYWNfc3JiX3JlcGx5Cit7CisJdTMyCQlzdGF0dXM7CisJdTMyCQlzcmJfc3RhdHVzOworCXUzMgkJc2NzaV9zdGF0dXM7CisJdTMyCQlkYXRhX3hmZXJfbGVuZ3RoOworCXUzMgkJc2Vuc2VfZGF0YV9zaXplOworCXU4CQlzZW5zZV9kYXRhW0FBQ19TRU5TRV9CVUZGRVJTSVpFXTsgLy8gQ2FuIHRoaXMgYmUgU0NTSV9TRU5TRV9CVUZGRVJTSVpFCit9OworLyoKKyAqIFNSQiBGbGFncworICovCisjZGVmaW5lCQlTUkJfTm9EYXRhWGZlcgkJIDB4MDAwMAorI2RlZmluZQkJU1JCX0Rpc2FibGVEaXNjb25uZWN0CSAweDAwMDQKKyNkZWZpbmUJCVNSQl9EaXNhYmxlU3luY2hUcmFuc2ZlciAweDAwMDgKKyNkZWZpbmUgCVNSQl9CeXBhc3NGcm96ZW5RdWV1ZQkgMHgwMDEwCisjZGVmaW5lCQlTUkJfRGlzYWJsZUF1dG9zZW5zZQkgMHgwMDIwCisjZGVmaW5lCQlTUkJfRGF0YUluCQkgMHgwMDQwCisjZGVmaW5lIAlTUkJfRGF0YU91dAkJIDB4MDA4MAorCisvKgorICogU1JCIEZ1bmN0aW9ucyAtIHNldCBpbiBhYWNfc3JiLT5mdW5jdGlvbgorICovCisjZGVmaW5lCVNSQkZfRXhlY3V0ZVNjc2kJMHgwMDAwCisjZGVmaW5lCVNSQkZfQ2xhaW1EZXZpY2UJMHgwMDAxCisjZGVmaW5lCVNSQkZfSU9fQ29udHJvbAkJMHgwMDAyCisjZGVmaW5lCVNSQkZfUmVjZWl2ZUV2ZW50CTB4MDAwMworI2RlZmluZQlTUkJGX1JlbGVhc2VRdWV1ZQkweDAwMDQKKyNkZWZpbmUJU1JCRl9BdHRhY2hEZXZpY2UJMHgwMDA1CisjZGVmaW5lCVNSQkZfUmVsZWFzZURldmljZQkweDAwMDYKKyNkZWZpbmUJU1JCRl9TaHV0ZG93bgkJMHgwMDA3CisjZGVmaW5lCVNSQkZfRmx1c2gJCTB4MDAwOAorI2RlZmluZQlTUkJGX0Fib3J0Q29tbWFuZAkweDAwMTAKKyNkZWZpbmUJU1JCRl9SZWxlYXNlUmVjb3ZlcnkJMHgwMDExCisjZGVmaW5lCVNSQkZfUmVzZXRCdXMJCTB4MDAxMgorI2RlZmluZQlTUkJGX1Jlc2V0RGV2aWNlCTB4MDAxMworI2RlZmluZQlTUkJGX1Rlcm1pbmF0ZUlPCTB4MDAxNAorI2RlZmluZQlTUkJGX0ZsdXNoUXVldWUJCTB4MDAxNQorI2RlZmluZQlTUkJGX1JlbW92ZURldmljZQkweDAwMTYKKyNkZWZpbmUJU1JCRl9Eb21haW5WYWxpZGF0aW9uCTB4MDAxNworCisvKiAKKyAqIFNSQiBTQ1NJIFN0YXR1cyAtIHNldCBpbiBhYWNfc3JiLT5zY3NpX3N0YXR1cworICovCisjZGVmaW5lIFNSQl9TVEFUVVNfUEVORElORyAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgU1JCX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBTUkJfU1RBVFVTX0FCT1JURUQgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFNSQl9TVEFUVVNfQUJPUlRfRkFJTEVEICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgU1JCX1NUQVRVU19FUlJPUiAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBTUkJfU1RBVFVTX0JVU1kgICAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIFNSQl9TVEFUVVNfSU5WQUxJRF9SRVFVRVNUICAgICAgICAgIDB4MDYKKyNkZWZpbmUgU1JCX1NUQVRVU19JTlZBTElEX1BBVEhfSUQgICAgICAgICAgMHgwNworI2RlZmluZSBTUkJfU1RBVFVTX05PX0RFVklDRSAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIFNSQl9TVEFUVVNfVElNRU9VVCAgICAgICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgU1JCX1NUQVRVU19TRUxFQ1RJT05fVElNRU9VVCAgICAgICAgMHgwQQorI2RlZmluZSBTUkJfU1RBVFVTX0NPTU1BTkRfVElNRU9VVCAgICAgICAgICAweDBCCisjZGVmaW5lIFNSQl9TVEFUVVNfTUVTU0FHRV9SRUpFQ1RFRCAgICAgICAgIDB4MEQKKyNkZWZpbmUgU1JCX1NUQVRVU19CVVNfUkVTRVQgICAgICAgICAgICAgICAgMHgwRQorI2RlZmluZSBTUkJfU1RBVFVTX1BBUklUWV9FUlJPUiAgICAgICAgICAgICAweDBGCisjZGVmaW5lIFNSQl9TVEFUVVNfUkVRVUVTVF9TRU5TRV9GQUlMRUQgICAgIDB4MTAKKyNkZWZpbmUgU1JCX1NUQVRVU19OT19IQkEgICAgICAgICAgICAgICAgICAgMHgxMQorI2RlZmluZSBTUkJfU1RBVFVTX0RBVEFfT1ZFUlJVTiAgICAgICAgICAgICAweDEyCisjZGVmaW5lIFNSQl9TVEFUVVNfVU5FWFBFQ1RFRF9CVVNfRlJFRSAgICAgIDB4MTMKKyNkZWZpbmUgU1JCX1NUQVRVU19QSEFTRV9TRVFVRU5DRV9GQUlMVVJFICAgMHgxNAorI2RlZmluZSBTUkJfU1RBVFVTX0JBRF9TUkJfQkxPQ0tfTEVOR1RIICAgICAweDE1CisjZGVmaW5lIFNSQl9TVEFUVVNfUkVRVUVTVF9GTFVTSEVEICAgICAgICAgIDB4MTYKKyNkZWZpbmUgU1JCX1NUQVRVU19ERUxBWUVEX1JFVFJZCSAgICAweDE3CisjZGVmaW5lIFNSQl9TVEFUVVNfSU5WQUxJRF9MVU4gICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgU1JCX1NUQVRVU19JTlZBTElEX1RBUkdFVF9JRCAgICAgICAgMHgyMQorI2RlZmluZSBTUkJfU1RBVFVTX0JBRF9GVU5DVElPTiAgICAgICAgICAgICAweDIyCisjZGVmaW5lIFNSQl9TVEFUVVNfRVJST1JfUkVDT1ZFUlkgICAgICAgICAgIDB4MjMKKyNkZWZpbmUgU1JCX1NUQVRVU19OT1RfU1RBUlRFRAkJICAgIDB4MjQKKyNkZWZpbmUgU1JCX1NUQVRVU19OT1RfSU5fVVNFCQkgICAgMHgzMAorI2RlZmluZSBTUkJfU1RBVFVTX0ZPUkNFX0FCT1JUCQkgICAgMHgzMQorI2RlZmluZSBTUkJfU1RBVFVTX0RPTUFJTl9WQUxJREFUSU9OX0ZBSUwgICAweDMyCisKKy8qCisgKiBPYmplY3QtU2VydmVyIC8gVm9sdW1lLU1hbmFnZXIgRGlzcGF0Y2ggQ2xhc3NlcworICovCisKKyNkZWZpbmUJCVZNX051bGwJCQkwCisjZGVmaW5lCQlWTV9OYW1lU2VydmUJCTEKKyNkZWZpbmUJCVZNX0NvbnRhaW5lckNvbmZpZwkyCisjZGVmaW5lCQlWTV9Jb2N0bAkJMworI2RlZmluZQkJVk1fRmlsZXN5c3RlbUlvY3RsCTQKKyNkZWZpbmUJCVZNX0Nsb3NlQWxsCQk1CisjZGVmaW5lCQlWTV9DdEJsb2NrUmVhZAkJNgorI2RlZmluZQkJVk1fQ3RCbG9ja1dyaXRlCQk3CisjZGVmaW5lCQlWTV9TbGljZUJsb2NrUmVhZAk4CS8qIHJhdyBhY2Nlc3MgdG8gY29uZmlndXJlZCAic3RvcmFnZSBvYmplY3RzIiAqLworI2RlZmluZQkJVk1fU2xpY2VCbG9ja1dyaXRlCTkKKyNkZWZpbmUJCVZNX0RyaXZlQmxvY2tSZWFkCTEwCS8qIHJhdyBhY2Nlc3MgdG8gcGh5c2ljYWwgZGV2aWNlcyAqLworI2RlZmluZQkJVk1fRHJpdmVCbG9ja1dyaXRlCTExCisjZGVmaW5lCQlWTV9FbmNsb3N1cmVNZ3QJCTEyCS8qIGVuY2xvc3VyZSBtYW5hZ2VtZW50ICovCisjZGVmaW5lCQlWTV9VbnVzZWQJCTEzCS8qIHVzZWQgdG8gYmUgZGlza3NldCBtYW5hZ2VtZW50ICovCisjZGVmaW5lCQlWTV9DdEJsb2NrVmVyaWZ5CTE0CisjZGVmaW5lCQlWTV9DdFBlcmYJCTE1CS8qIHBlcmZvcm1hbmNlIHRlc3QgKi8KKyNkZWZpbmUJCVZNX0N0QmxvY2tSZWFkNjQJMTYKKyNkZWZpbmUJCVZNX0N0QmxvY2tXcml0ZTY0CTE3CisjZGVmaW5lCQlWTV9DdEJsb2NrVmVyaWZ5NjQJMTgKKyNkZWZpbmUJCVZNX0N0SG9zdFJlYWQ2NAkJMTkKKyNkZWZpbmUJCVZNX0N0SG9zdFdyaXRlNjQJMjAKKworI2RlZmluZQkJTUFYX1ZNQ09NTUFORF9OVU0JMjEJLyogdXNlZCBmb3Igc2l6aW5nIHN0YXRzIGFycmF5IC0gbGVhdmUgbGFzdCAqLworCisvKgorICoJRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gKGVnLCB2aXRhbCBzdGF0cykKKyAqCXRoYXQgYSBjb250ZW50IG1hbmFnZXIgbWlnaHQgcmVwb3J0LiAgVGhlCisgKglGaWxlQXJyYXkgZmlsZXN5c3RlbSBjb21wb25lbnQgaXMgb25lIGV4YW1wbGUKKyAqCW9mIGEgY29udGVudCBtYW5hZ2VyLiAgUmF3IG1vZGUgbWlnaHQgYmUKKyAqCWFub3RoZXIuCisgKi8KKworc3RydWN0IGFhY19mc2luZm8geworCXUzMiAgZnNUb3RhbFNpemU7CS8qIENvbnN1bWVkIGJ5IGZzLCBpbmNsLiBtZXRhZGF0YSAqLworCXUzMiAgZnNCbG9ja1NpemU7CisJdTMyICBmc0ZyYWdTaXplOworCXUzMiAgZnNNYXhFeHRlbmRTaXplOworCXUzMiAgZnNTcGFjZVVuaXRzOworCXUzMiAgZnNNYXhOdW1GaWxlczsKKwl1MzIgIGZzTnVtRnJlZUZpbGVzOworCXUzMiAgZnNJbm9kZURlbnNpdHk7Cit9OwkvKiB2YWxpZCBpZmYgT2JqVHlwZSA9PSBGVF9GSUxFU1lTICYmICEoQ29udGVudFN0YXRlICYgRlNDU19OT1RDTEVBTikgKi8KKwordW5pb24gYWFjX2NvbnRlbnRpbmZvIHsKKwlzdHJ1Y3QgYWFjX2ZzaW5mbyBmaWxlc3lzOwkvKiB2YWxpZCBpZmYgT2JqVHlwZSA9PSBGVF9GSUxFU1lTICYmICEoQ29udGVudFN0YXRlICYgRlNDU19OT1RDTEVBTikgKi8KK307CisKKy8qCisgKglRdWVyeSBmb3IgQ29udGFpbmVyIENvbmZpZ3VyYXRpb24gU3RhdHVzCisgKi8KKworI2RlZmluZSBDVF9HRVRfQ09ORklHX1NUQVRVUyAxNDcKK3N0cnVjdCBhYWNfZ2V0X2NvbmZpZ19zdGF0dXMgeworCXUzMgkJY29tbWFuZDsJLyogVk1fQ29udGFpbmVyQ29uZmlnICovCisJdTMyCQl0eXBlOwkJLyogQ1RfR0VUX0NPTkZJR19TVEFUVVMgKi8KKwl1MzIJCXBhcm0xOworCXUzMgkJcGFybTI7CisJdTMyCQlwYXJtMzsKKwl1MzIJCXBhcm00OworCXUzMgkJcGFybTU7CisJdTMyCQljb3VudDsJLyogc2l6ZW9mKCgoc3RydWN0IGFhY19nZXRfY29uZmlnX3N0YXR1c19yZXNwICopTlVMTCktPmRhdGEpICovCit9OworCisjZGVmaW5lIENGQUNUX0NPTlRJTlVFIDAKKyNkZWZpbmUgQ0ZBQ1RfUEFVU0UgICAgMQorI2RlZmluZSBDRkFDVF9BQk9SVCAgICAyCitzdHJ1Y3QgYWFjX2dldF9jb25maWdfc3RhdHVzX3Jlc3AgeworCXUzMgkJcmVzcG9uc2U7IC8qIFNUX09LICovCisJdTMyCQlkdW1teTA7CisJdTMyCQlzdGF0dXM7CS8qIENUX09LICovCisJdTMyCQlwYXJtMTsKKwl1MzIJCXBhcm0yOworCXUzMgkJcGFybTM7CisJdTMyCQlwYXJtNDsKKwl1MzIJCXBhcm01OworCXN0cnVjdCB7CisJCXUzMglhY3Rpb247IC8qIENGQUNUX0NPTlRJTlVFLCBDRkFDVF9QQVVTRSBvciBDRkFDVF9BQk9SVCAqLworCQl1MTYJZmxhZ3M7CisJCXMxNgljb3VudDsKKwl9CQlkYXRhOworfTsKKworLyoKKyAqCUFjY2VwdCB0aGUgY29uZmlndXJhdGlvbiBhcy1pcworICovCisKKyNkZWZpbmUgQ1RfQ09NTUlUX0NPTkZJRyAxNTIKKworc3RydWN0IGFhY19jb21taXRfY29uZmlnIHsKKwl1MzIJCWNvbW1hbmQ7CS8qIFZNX0NvbnRhaW5lckNvbmZpZyAqLworCXUzMgkJdHlwZTsJCS8qIENUX0NPTU1JVF9DT05GSUcgKi8KK307CisKKy8qCisgKglRdWVyeSBmb3IgQ29udGFpbmVyIENvbmZpZ3VyYXRpb24gQ291bnQKKyAqLworCisjZGVmaW5lIENUX0dFVF9DT05UQUlORVJfQ09VTlQgNAorc3RydWN0IGFhY19nZXRfY29udGFpbmVyX2NvdW50IHsKKwl1MzIJCWNvbW1hbmQ7CS8qIFZNX0NvbnRhaW5lckNvbmZpZyAqLworCXUzMgkJdHlwZTsJCS8qIENUX0dFVF9DT05UQUlORVJfQ09VTlQgKi8KK307CisKK3N0cnVjdCBhYWNfZ2V0X2NvbnRhaW5lcl9jb3VudF9yZXNwIHsKKwl1MzIJCXJlc3BvbnNlOyAvKiBTVF9PSyAqLworCXUzMgkJZHVtbXkwOworCXUzMgkJTWF4Q29udGFpbmVyczsKKwl1MzIJCUNvbnRhaW5lclN3aXRjaEVudHJpZXM7CisJdTMyCQlNYXhQYXJ0aXRpb25zOworfTsKKworCisvKgorICoJUXVlcnkgZm9yICJtb3VudGFibGUiIG9iamVjdHMsIGllLCBvYmplY3RzIHRoYXQgYXJlIHR5cGljYWxseQorICoJYXNzb2NpYXRlZCB3aXRoIGEgZHJpdmUgbGV0dGVyIG9uIHRoZSBjbGllbnQgKGhvc3QpIHNpZGUuCisgKi8KKworc3RydWN0IGFhY19tbnRlbnQgeworCXUzMiAgICAJCQlvaWQ7CisJdTgJCQluYW1lWzE2XTsJLy8gaWYgYXBwbGljYWJsZQorCXN0cnVjdCBjcmVhdGlvbl9pbmZvCWNyZWF0ZV9pbmZvOwkvLyBpZiBhcHBsaWNhYmxlCisJdTMyCQkJY2FwYWNpdHk7CisJdTMyCQkJdm9sOyAgICAJLy8gc3Vic3RyYXRlIHN0cnVjdHVyZQorCXUzMgkJCW9iajsJICAgICAgICAvLyBGVF9GSUxFU1lTLCBGVF9EQVRBQkFTRSwgZXRjLgorCXUzMgkJCXN0YXRlOwkJLy8gdW5yZWFkeSBmb3IgbW91bnRpbmcsIHJlYWRvbmx5LCBldGMuCisJdW5pb24gYWFjX2NvbnRlbnRpbmZvCWZpbGVpbmZvOwkvLyBJbmZvIHNwZWNpZmljIHRvIGNvbnRlbnQgbWFuYWdlciAoZWcsIGZpbGVzeXN0ZW0pCisJdTMyCQkJYWx0b2lkOwkJLy8gIT0gb2lkIDw9PT4gc25hcHNob3Qgb3IgYnJva2VuIG1pcnJvciBleGlzdHMKK307CisKKyNkZWZpbmUgRlNDU19OT1RDTEVBTgkweDAwMDEgIC8qIGZzY2sgaXMgbmVjY2Vzc2FyeSBiZWZvcmUgbW91bnRpbmcgKi8KKyNkZWZpbmUgRlNDU19SRUFET05MWQkweDAwMDIJLyogcG9zc2libGUgcmVzdWx0IG9mIGJyb2tlbiBtaXJyb3IgKi8KKyNkZWZpbmUgRlNDU19ISURERU4JMHgwMDA0CS8qIHNob3VsZCBiZSBpZ25vcmVkIC0gc2V0IGR1cmluZyBhIGNsZWFyICovCisKK3N0cnVjdCBhYWNfcXVlcnlfbW91bnQgeworCXUzMgkJY29tbWFuZDsKKwl1MzIJCXR5cGU7CisJdTMyCQljb3VudDsKK307CisKK3N0cnVjdCBhYWNfbW91bnQgeworCXUzMgkJc3RhdHVzOworCXUzMgkgICAJdHlwZTsgICAgICAgICAgIC8qIHNob3VsZCBiZSBzYW1lIGFzIHRoYXQgcmVxdWVzdGVkICovCisJdTMyCQljb3VudDsKKwlzdHJ1Y3QgYWFjX21udGVudCBtbnRbMV07Cit9OworCisjZGVmaW5lIENUX1JFQURfTkFNRSAxMzAKK3N0cnVjdCBhYWNfZ2V0X25hbWUgeworCXUzMgkJY29tbWFuZDsJLyogVk1fQ29udGFpbmVyQ29uZmlnICovCisJdTMyCQl0eXBlOwkJLyogQ1RfUkVBRF9OQU1FICovCisJdTMyCQljaWQ7CisJdTMyCQlwYXJtMTsKKwl1MzIJCXBhcm0yOworCXUzMgkJcGFybTM7CisJdTMyCQlwYXJtNDsKKwl1MzIJCWNvdW50OwkvKiBzaXplb2YoKChzdHJ1Y3QgYWFjX2dldF9uYW1lX3Jlc3AgKilOVUxMKS0+ZGF0YSkgKi8KK307CisKKyNkZWZpbmUgQ1RfT0sgICAgICAgIDIxOAorc3RydWN0IGFhY19nZXRfbmFtZV9yZXNwIHsKKwl1MzIJCWR1bW15MDsKKwl1MzIJCWR1bW15MTsKKwl1MzIJCXN0YXR1czsJLyogQ1RfT0sgKi8KKwl1MzIJCXBhcm0xOworCXUzMgkJcGFybTI7CisJdTMyCQlwYXJtMzsKKwl1MzIJCXBhcm00OworCXUzMgkJcGFybTU7CisJdTgJCWRhdGFbMTZdOworfTsKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgY29tbWFuZCBpcyBzZW50IHRvIHNodXQgZG93biBlYWNoIGNvbnRhaW5lci4KKyAqLworCitzdHJ1Y3QgYWFjX2Nsb3NlIHsKKwl1MzIJY29tbWFuZDsKKwl1MzIJY2lkOworfTsKKworc3RydWN0IGFhY19xdWVyeV9kaXNrCit7CisJczMyCWNudW07CisJczMyCWJ1czsKKwlzMzIJaWQ7CisJczMyCWx1bjsKKwl1MzIJdmFsaWQ7CisJdTMyCWxvY2tlZDsKKwl1MzIJZGVsZXRlZDsKKwlzMzIJaW5zdGFuY2U7CisJczgJbmFtZVsxMF07CisJdTMyCXVubWFwcGVkOworfTsKKworc3RydWN0IGFhY19kZWxldGVfZGlzayB7CisJdTMyCWRpc2tudW07CisJdTMyCWNudW07Cit9OworIAorc3RydWN0IGZpYl9pb2N0bAoreworCXUzMglmaWJjdHg7CisJczMyCXdhaXQ7CisJY2hhcglfX3VzZXIgKmZpYjsKK307CisKK3N0cnVjdCByZXZpc2lvbgoreworCXUzMiBjb21wYXQ7CisJdTMyIHZlcnNpb247CisJdTMyIGJ1aWxkOworfTsKKwkKKy8qCisgKiAJVWdseSAtIG5vbiBMaW51eCBsaWtlIGlvY3RsIGNvZGluZyBmb3IgYmFjayBjb21wYXQuCisgKi8KKworI2RlZmluZSBDVExfQ09ERShmdW5jdGlvbiwgbWV0aG9kKSAoICAgICAgICAgICAgICAgICBcCisgICAgKDQ8PCAxNikgfCAoKGZ1bmN0aW9uKSA8PCAyKSB8IChtZXRob2QpIFwKKykKKworLyoKKyAqCURlZmluZSB0aGUgbWV0aG9kIGNvZGVzIGZvciBob3cgYnVmZmVycyBhcmUgcGFzc2VkIGZvciBJL08gYW5kIEZTIAorICoJY29udHJvbHMKKyAqLworCisjZGVmaW5lIE1FVEhPRF9CVUZGRVJFRCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNRVRIT0RfTkVJVEhFUiAgICAgICAgICAgICAgICAgIDMKKworLyoKKyAqCUZpbGVzeXN0ZW0gaW9jdGxzCisgKi8KKworI2RlZmluZSBGU0FDVExfU0VOREZJQiAgICAgICAgICAgICAgICAgIAlDVExfQ09ERSgyMDUwLCBNRVRIT0RfQlVGRkVSRUQpCisjZGVmaW5lIEZTQUNUTF9TRU5EX1JBV19TUkIgICAgICAgICAgICAgICAJQ1RMX0NPREUoMjA2NywgTUVUSE9EX0JVRkZFUkVEKQorI2RlZmluZSBGU0FDVExfREVMRVRFX0RJU0sJCQkweDE2MworI2RlZmluZSBGU0FDVExfUVVFUllfRElTSwkJCTB4MTczCisjZGVmaW5lIEZTQUNUTF9PUEVOX0dFVF9BREFQVEVSX0ZJQgkJQ1RMX0NPREUoMjEwMCwgTUVUSE9EX0JVRkZFUkVEKQorI2RlZmluZSBGU0FDVExfR0VUX05FWFRfQURBUFRFUl9GSUIJCUNUTF9DT0RFKDIxMDEsIE1FVEhPRF9CVUZGRVJFRCkKKyNkZWZpbmUgRlNBQ1RMX0NMT1NFX0dFVF9BREFQVEVSX0ZJQgkJQ1RMX0NPREUoMjEwMiwgTUVUSE9EX0JVRkZFUkVEKQorI2RlZmluZSBGU0FDVExfTUlOSVBPUlRfUkVWX0NIRUNLICAgICAgICAgICAgICAgQ1RMX0NPREUoMjEwNywgTUVUSE9EX0JVRkZFUkVEKQorI2RlZmluZSBGU0FDVExfR0VUX1BDSV9JTkZPICAgICAgICAgICAgICAgCUNUTF9DT0RFKDIxMTksIE1FVEhPRF9CVUZGRVJFRCkKKyNkZWZpbmUgRlNBQ1RMX0ZPUkNFX0RFTEVURV9ESVNLCQlDVExfQ09ERSgyMTIwLCBNRVRIT0RfTkVJVEhFUikKKyNkZWZpbmUgRlNBQ1RMX0dFVF9DT05UQUlORVJTCQkJMjEzMQorCisKK3N0cnVjdCBhYWNfY29tbW9uCit7CisJLyoKKwkgKglJZiB0aGlzIHZhbHVlIGlzIHNldCB0byAxIHRoZW4gaW50ZXJydXB0IG1vZGVyYXRpb24gd2lsbCBvY2N1ciAKKwkgKglpbiB0aGUgYmFzZSBjb21tdWljYXRpb24gc3VwcG9ydC4KKwkgKi8KKwl1MzIgaXJxX21vZDsKKwl1MzIgcGVha19maWJzOworCXUzMiB6ZXJvX2ZpYnM7CisJdTMyIGZpYl90aW1lb3V0czsKKwkvKgorCSAqCVN0YXRpc3RpY2FsIGNvdW50ZXJzIGluIGRlYnVnIG1vZGUKKwkgKi8KKyNpZmRlZiBEQkcKKwl1MzIgRmlic1NlbnQ7CisJdTMyIEZpYlJlY3ZlZDsKKwl1MzIgTm9SZXNwb25zZVNlbnQ7CisJdTMyIE5vUmVzcG9uc2VSZWN2ZWQ7CisJdTMyIEFzeW5jU2VudDsKKwl1MzIgQXN5bmNSZWN2ZWQ7CisJdTMyIE5vcm1hbFNlbnQ7CisJdTMyIE5vcm1hbFJlY3ZlZDsKKyNlbmRpZgorfTsKKworZXh0ZXJuIHN0cnVjdCBhYWNfY29tbW9uIGFhY19jb25maWc7CisKKworLyoKKyAqCVRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgdXNlZCB3aGVuIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBGSUJzLiBJdCBpcworICoJb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcuCisgKi8KKyAKKyNpZmRlZiBEQkcKKyNkZWZpbmUJRklCX0NPVU5URVJfSU5DUkVNRU5UKGNvdW50ZXIpCQkoY291bnRlcikrKworI2Vsc2UKKyNkZWZpbmUJRklCX0NPVU5URVJfSU5DUkVNRU5UKGNvdW50ZXIpCQkKKyNlbmRpZgorCisvKgorICoJQWRhcHRlciBkaXJlY3QgY29tbWFuZHMKKyAqCU1vbml0b3IvS2VybmVsIEFQSQorICovCisKKyNkZWZpbmUJQlJFQUtQT0lOVF9SRVFVRVNUCQkweDAwMDAwMDA0CisjZGVmaW5lCUlOSVRfU1RSVUNUX0JBU0VfQUREUkVTUwkweDAwMDAwMDA1CisjZGVmaW5lIFJFQURfUEVSTUFORU5UX1BBUkFNRVRFUlMJMHgwMDAwMDAwYQorI2RlZmluZSBXUklURV9QRVJNQU5FTlRfUEFSQU1FVEVSUwkweDAwMDAwMDBiCisjZGVmaW5lIEhPU1RfQ1JBU0hJTkcJCQkweDAwMDAwMDBkCisjZGVmaW5lCVNFTkRfU1lOQ0hST05PVVNfRklCCQkweDAwMDAwMDBjCisjZGVmaW5lIENPTU1BTkRfUE9TVF9SRVNVTFRTCQkweDAwMDAwMDE0CisjZGVmaW5lIEdFVF9BREFQVEVSX1BST1BFUlRJRVMJCTB4MDAwMDAwMTkKKyNkZWZpbmUgR0VUX0RSSVZFUl9CVUZGRVJfUFJPUEVSVElFUwkweDAwMDAwMDIzCisjZGVmaW5lIFJDVl9URU1QX1JFQURJTkdTCQkweDAwMDAwMDI1CisjZGVmaW5lIEdFVF9DT01NX1BSRUZFUlJFRF9TRVRUSU5HUwkweDAwMDAwMDI2CisjZGVmaW5lIElPUF9SRVNFVAkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgUkVfSU5JVF9BREFQVEVSCQkJMHgwMDAwMDBlZQorCisvKgorICoJQWRhcHRlciBTdGF0dXMgUmVnaXN0ZXIKKyAqCisgKiAgUGhhc2UgU3RhdXMgbWFpbGJveCBpcyAzMmJpdHM6CisgKgk8MzE6MTY+ID0gUGhhc2UgU3RhdHVzCisgKgk8MTU6MD4gID0gUGhhc2UKKyAqCisgKglUaGUgYWRhcHRlciByZXBvcnRzIGlzIHByZXNlbnQgc3RhdGUgdGhyb3VnaCB0aGUgcGhhc2UuICBPbmx5CisgKglhIHNpbmdsZSBwaGFzZSBzaG91bGQgYmUgZXZlciBiZSBzZXQuICBFYWNoIHBoYXNlIGNhbiBoYXZlIG11bHRpcGxlCisgKglwaGFzZSBzdGF0dXMgYml0cyB0byBwcm92aWRlIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIAorICoJc3RhdGUgb2YgdGhlIGJvYXJkLiAgQ2FyZSBzaG91bGQgYmUgdGFrZW4gdG8gZW5zdXJlIHRoYXQgYW55IHBoYXNlIAorICoJc3RhdHVzIGJpdHMgdGhhdCBhcmUgc2V0IHdoZW4gY2hhbmdpbmcgdGhlIHBoYXNlIGFyZSBhbHNvIHZhbGlkCisgKglmb3IgdGhlIG5ldyBwaGFzZSBvciBiZSBjbGVhcmVkIG91dC4gIEFkYXB0ZXIgc29mdHdhcmUgKG1vbml0b3IsCisgKglpZmxhc2gsIGtlcm5lbCkgaXMgcmVzcG9uc2libGUgZm9yIHByb3Blcmx5IG1haW50aW5pbmcgdGhlIHBoYXNlIAorICoJc3RhdHVzIG1haWxib3ggd2hlbiBpdCBpcyBydW5uaW5nLgorICoJCQkJCQkJCQkJCQorICoJTU9OS0VSX0FQSSBQaGFzZXMJCQkJCQkJCisgKgorICoJUGhhc2VzIGFyZSBiaXQgb3JpZW50ZWQuICBJdCBpcyBOT1QgdmFsaWQgIHRvIGhhdmUgbXVsdGlwbGUgYml0cyBzZXQJCQkJCQkKKyAqLwkJCQkJCisKKyNkZWZpbmUJU0VMRl9URVNUX0ZBSUxFRAkJMHgwMDAwMDAwNAorI2RlZmluZQlNT05JVE9SX1BBTklDCQkJMHgwMDAwMDAyMAorI2RlZmluZQlLRVJORUxfVVBfQU5EX1JVTk5JTkcJCTB4MDAwMDAwODAKKyNkZWZpbmUJS0VSTkVMX1BBTklDCQkJMHgwMDAwMDEwMAorCisvKgorICoJRG9vcmJlbGwgYml0IGRlZmluZXMKKyAqLworCisjZGVmaW5lIERvb3JCZWxsU3luY0NtZEF2YWlsYWJsZQkoMTw8MCkJLyogSG9zdCAtPiBBZGFwdGVyICovCisjZGVmaW5lIERvb3JCZWxsUHJpbnRmRG9uZQkJKDE8PDUpCS8qIEhvc3QgLT4gQWRhcHRlciAqLworI2RlZmluZSBEb29yQmVsbEFkYXB0ZXJOb3JtQ21kUmVhZHkJKDE8PDEpCS8qIEFkYXB0ZXIgLT4gSG9zdCAqLworI2RlZmluZSBEb29yQmVsbEFkYXB0ZXJOb3JtUmVzcFJlYWR5CSgxPDwyKQkvKiBBZGFwdGVyIC0+IEhvc3QgKi8KKyNkZWZpbmUgRG9vckJlbGxBZGFwdGVyTm9ybUNtZE5vdEZ1bGwJKDE8PDMpCS8qIEFkYXB0ZXIgLT4gSG9zdCAqLworI2RlZmluZSBEb29yQmVsbEFkYXB0ZXJOb3JtUmVzcE5vdEZ1bGwJKDE8PDQpCS8qIEFkYXB0ZXIgLT4gSG9zdCAqLworI2RlZmluZSBEb29yQmVsbFByaW50ZlJlYWR5CQkoMTw8NSkJLyogQWRhcHRlciAtPiBIb3N0ICovCisKKy8qCisgKglGb3IgRklCIGNvbW11bmljYXRpb24sIHdlIG5lZWQgYWxsIG9mIHRoZSBmb2xsb3dpbmcgdGhpbmdzCisgKgl0byBzZW5kIGJhY2sgdG8gdGhlIHVzZXIuCisgKi8KKyAKKyNkZWZpbmUgCUFpZkNtZEV2ZW50Tm90aWZ5CTEJLyogTm90aWZ5IG9mIGV2ZW50ICovCisjZGVmaW5lCQkJQWlmRW5Db25maWdDaGFuZ2UJMwkvKiBBZGFwdGVyIGNvbmZpZ3VyYXRpb24gY2hhbmdlICovCisjZGVmaW5lCQkJQWlmRW5Db250YWluZXJDaGFuZ2UJNAkvKiBDb250YWluZXIgY29uZmlndXJhdGlvbiBjaGFuZ2UgKi8KKyNkZWZpbmUJCQlBaWZFbkRldmljZUZhaWx1cmUJNQkvKiBTQ1NJIGRldmljZSBmYWlsZWQgKi8KKyNkZWZpbmUJCQlBaWZFbkFkZENvbnRhaW5lcgkxNQkvKiBBIG5ldyBhcnJheSB3YXMgY3JlYXRlZCAqLworI2RlZmluZQkJCUFpZkVuRGVsZXRlQ29udGFpbmVyCTE2CS8qIEEgY29udGFpbmVyIHdhcyBkZWxldGVkICovCisjZGVmaW5lCQkJQWlmRW5FeHBFdmVudAkJMjMJLyogRmlybXdhcmUgRXZlbnQgTG9nICovCisjZGVmaW5lCQkJQWlmRXhlRmlybXdhcmVQYW5pYwkzCS8qIEZpcm13YXJlIEV2ZW50IFBhbmljICovCisjZGVmaW5lCQkJQWlmSGlnaFByaW9yaXR5CQkzCS8qIEhpZ2hlc3QgUHJpb3JpdHkgRXZlbnQgKi8KKworI2RlZmluZQkJQWlmQ21kSm9iUHJvZ3Jlc3MJMgkvKiBQcm9ncmVzcyByZXBvcnQgKi8KKyNkZWZpbmUJCQlBaWZKb2JDdHJaZXJvCTEwMQkvKiBBcnJheSBaZXJvIHByb2dyZXNzICovCisjZGVmaW5lCQkJQWlmSm9iU3RzU3VjY2VzcyAxCS8qIEpvYiBjb21wbGV0ZXMgKi8KKyNkZWZpbmUJCUFpZkNtZEFQSVJlcG9ydAkJMwkvKiBSZXBvcnQgZnJvbSBvdGhlciB1c2VyIG9mIEFQSSAqLworI2RlZmluZQkJQWlmQ21kRHJpdmVyTm90aWZ5CTQJLyogTm90aWZ5IGhvc3QgZHJpdmVyIG9mIGV2ZW50ICovCisjZGVmaW5lCQkJQWlmRGVuTW9ycGhDb21wbGV0ZSAyMDAJLyogQSBtb3JwaCBvcGVyYXRpb24gY29tcGxldGVkICovCisjZGVmaW5lCQkJQWlmRGVuVm9sdW1lRXh0ZW5kQ29tcGxldGUgMjAxIC8qIEEgdm9sdW1lIGV4dGVuZCBjb21wbGV0ZWQgKi8KKyNkZWZpbmUJCUFpZlJlcUpvYkxpc3QJCTEwMAkvKiBHZXRzIGJhY2sgY29tcGxldGUgam9iIGxpc3QgKi8KKyNkZWZpbmUJCUFpZlJlcUpvYnNGb3JDdHIJMTAxCS8qIEdldHMgYmFjayBqb2JzIGZvciBzcGVjaWZpYyBjb250YWluZXIgKi8KKyNkZWZpbmUJCUFpZlJlcUpvYnNGb3JTY3NpCTEwMgkvKiBHZXRzIGJhY2sgam9icyBmb3Igc3BlY2lmaWMgU0NTSSBkZXZpY2UgKi8gCisjZGVmaW5lCQlBaWZSZXFKb2JSZXBvcnQJCTEwMwkvKiBHZXRzIGJhY2sgYSBzcGVjaWZpYyBqb2IgcmVwb3J0IG9yIGxpc3Qgb2YgdGhlbSAqLyAKKyNkZWZpbmUJCUFpZlJlcVRlcm1pbmF0ZUpvYgkxMDQJLyogVGVybWluYXRlcyBqb2IgKi8KKyNkZWZpbmUJCUFpZlJlcVN1c3BlbmRKb2IJMTA1CS8qIFN1c3BlbmRzIGEgam9iICovCisjZGVmaW5lCQlBaWZSZXFSZXN1bWVKb2IJCTEwNgkvKiBSZXN1bWVzIGEgam9iICovIAorI2RlZmluZQkJQWlmUmVxU2VuZEFQSVJlcG9ydAkxMDcJLyogQVBJIGdlbmVyaWMgcmVwb3J0IHJlcXVlc3RzICovCisjZGVmaW5lCQlBaWZSZXFBUElKb2JTdGFydAkxMDgJLyogU3RhcnQgYSBqb2IgZnJvbSB0aGUgQVBJICovCisjZGVmaW5lCQlBaWZSZXFBUElKb2JVcGRhdGUJMTA5CS8qIFVwZGF0ZSBhIGpvYiByZXBvcnQgZnJvbSB0aGUgQVBJICovCisjZGVmaW5lCQlBaWZSZXFBUElKb2JGaW5pc2gJMTEwCS8qIEZpbmlzaCBhIGpvYiBmcm9tIHRoZSBBUEkgKi8KKworLyoKKyAqCUFkYXB0ZXIgSW5pdGlhdGVkIEZJQiBjb21tYW5kIHN0cnVjdHVyZXMuIFN0YXJ0IHdpdGggdGhlIGFkYXB0ZXIKKyAqCWluaXRpYXRlZCBGSUJzIHRoYXQgcmVhbGx5IGNvbWUgZnJvbSB0aGUgYWRhcHRlciwgYW5kIGdldCByZXNwb25kZWQKKyAqCXRvIGJ5IHRoZSBob3N0LgorICovCisKK3N0cnVjdCBhYWNfYWlmY21kIHsKKwl1MzIgY29tbWFuZDsJCS8qIFRlbGwgaG9zdCB3aGF0IHR5cGUgb2Ygbm90aWZ5IHRoaXMgaXMgKi8KKwl1MzIgc2VxbnVtOwkJLyogVG8gYWxsb3cgb3JkZXJpbmcgb2YgcmVwb3J0cyAoaWYgbmVjZXNzYXJ5KSAqLworCXU4IGRhdGFbMV07CQkvKiBVbmRlZmluZWQgbGVuZ3RoIChmcm9tIGtlcm5lbCB2aWV3cG9pbnQpICovCit9OworCisvKioKKyAqIAlDb252ZXJ0IGNhcGFjaXR5IHRvIGN5bGluZGVycworICogIAlhY2NvdW50aW5nIGZvciB0aGUgZmFjdCBjYXBhY2l0eSBjb3VsZCBiZSBhIDY0IGJpdCB2YWx1ZQorICoKKyAqLworc3RhdGljIGlubGluZSB1MzIgY2FwX3RvX2N5bHMoc2VjdG9yX3QgY2FwYWNpdHksIHUzMiBkaXZpc29yKQoreworCXNlY3Rvcl9kaXYoY2FwYWNpdHksIGRpdmlzb3IpOworCXJldHVybiAodTMyKWNhcGFjaXR5OworfQorCitzdHJ1Y3Qgc2NzaV9jbW5kOworCitjb25zdCBjaGFyICphYWNfZHJpdmVyaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RydWN0IGZpYiAqZmliX2FsbG9jKHN0cnVjdCBhYWNfZGV2ICpkZXYpOworaW50IGZpYl9zZXR1cChzdHJ1Y3QgYWFjX2RldiAqZGV2KTsKK3ZvaWQgZmliX21hcF9mcmVlKHN0cnVjdCBhYWNfZGV2ICpkZXYpOwordm9pZCBmaWJfZnJlZShzdHJ1Y3QgZmliICogY29udGV4dCk7Cit2b2lkIGZpYl9pbml0KHN0cnVjdCBmaWIgKiBjb250ZXh0KTsKK3ZvaWQgZmliX2RlYWxsb2Moc3RydWN0IGZpYiAqIGNvbnRleHQpOwordm9pZCBhYWNfcHJpbnRmKHN0cnVjdCBhYWNfZGV2ICpkZXYsIHUzMiB2YWwpOworaW50IGZpYl9zZW5kKHUxNiBjb21tYW5kLCBzdHJ1Y3QgZmliICogY29udGV4dCwgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgcHJpb3JpdHksIGludCB3YWl0LCBpbnQgcmVwbHksIGZpYl9jYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqY3R4dCk7CitpbnQgYWFjX2NvbnN1bWVyX2dldChzdHJ1Y3QgYWFjX2RldiAqIGRldiwgc3RydWN0IGFhY19xdWV1ZSAqIHEsIHN0cnVjdCBhYWNfZW50cnkgKiplbnRyeSk7Cit2b2lkIGFhY19jb25zdW1lcl9mcmVlKHN0cnVjdCBhYWNfZGV2ICogZGV2LCBzdHJ1Y3QgYWFjX3F1ZXVlICogcSwgdTMyIHFudW0pOworaW50IGZpYl9jb21wbGV0ZShzdHJ1Y3QgZmliICogY29udGV4dCk7CisjZGVmaW5lIGZpYl9kYXRhKGZpYmN0eCkgKCh2b2lkICopKGZpYmN0eCktPmh3X2ZpYi0+ZGF0YSkKK3N0cnVjdCBhYWNfZGV2ICphYWNfaW5pdF9hZGFwdGVyKHN0cnVjdCBhYWNfZGV2ICpkZXYpOworaW50IGFhY19nZXRfY29uZmlnX3N0YXR1cyhzdHJ1Y3QgYWFjX2RldiAqZGV2KTsKK2ludCBhYWNfZ2V0X2NvbnRhaW5lcnMoc3RydWN0IGFhY19kZXYgKmRldik7CitpbnQgYWFjX3Njc2lfY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CitpbnQgYWFjX2Rldl9pb2N0bChzdHJ1Y3QgYWFjX2RldiAqZGV2LCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKTsKK2ludCBhYWNfZG9faW9jdGwoc3RydWN0IGFhY19kZXYgKiBkZXYsIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpOworaW50IGFhY19yeF9pbml0KHN0cnVjdCBhYWNfZGV2ICpkZXYpOworaW50IGFhY19ya3RfaW5pdChzdHJ1Y3QgYWFjX2RldiAqZGV2KTsKK2ludCBhYWNfc2FfaW5pdChzdHJ1Y3QgYWFjX2RldiAqZGV2KTsKK3Vuc2lnbmVkIGludCBhYWNfcmVzcG9uc2Vfbm9ybWFsKHN0cnVjdCBhYWNfcXVldWUgKiBxKTsKK3Vuc2lnbmVkIGludCBhYWNfY29tbWFuZF9ub3JtYWwoc3RydWN0IGFhY19xdWV1ZSAqIHEpOworaW50IGFhY19jb21tYW5kX3RocmVhZChzdHJ1Y3QgYWFjX2RldiAqIGRldik7CitpbnQgYWFjX2Nsb3NlX2ZpYl9jb250ZXh0KHN0cnVjdCBhYWNfZGV2ICogZGV2LCBzdHJ1Y3QgYWFjX2ZpYl9jb250ZXh0ICpmaWJjdHgpOworaW50IGZpYl9hZGFwdGVyX2NvbXBsZXRlKHN0cnVjdCBmaWIgKiBmaWJwdHIsIHVuc2lnbmVkIHNob3J0IHNpemUpOworc3RydWN0IGFhY19kcml2ZXJfaWRlbnQqIGFhY19nZXRfZHJpdmVyX2lkZW50KGludCBkZXZ0eXBlKTsKK2ludCBhYWNfZ2V0X2FkYXB0ZXJfaW5mbyhzdHJ1Y3QgYWFjX2RldiogZGV2KTsKK2ludCBhYWNfc2VuZF9zaHV0ZG93bihzdHJ1Y3QgYWFjX2RldiAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1jdHJsLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZGQxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jCkBAIC0wLDAgKzEsNjgzIEBACisvKgorICoJQWRhcHRlYyBBQUMgc2VyaWVzIFJBSUQgY29udHJvbGxlciBkcml2ZXIKKyAqCShjKSBDb3B5cmlnaHQgMjAwMSBSZWQgSGF0IEluYy4JPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKiBiYXNlZCBvbiB0aGUgb2xkIGFhY3JhaWQgZHJpdmVyIHRoYXQgaXMuLgorICogQWRhcHRlYyBhYWNyYWlkIGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBBZGFwdGVjLCBJbmMuIChhYWNyYWlkQGFkYXB0ZWMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogTW9kdWxlIE5hbWU6CisgKiAgY29tbWN0cmwuYworICoKKyAqIEFic3RyYWN0OiBDb250YWlucyBhbGwgcm91dGluZXMgZm9yIGNvbnRyb2wgb2YgdGhlIEFGQSBjb21tIGxheWVyCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiYWFjcmFpZC5oIgorCisvKioKKyAqCWlvY3RsX3NlbmRfZmliCS0Jc2VuZCBhIEZJQiBmcm9tIHVzZXJzcGFjZQorICoJQGRldjoJYWRhcHRlciBpcyBiZWluZyBwcm9jZXNzZWQKKyAqCUBhcmc6CWFyZ3VtZW50cyB0byB0aGUgaW9jdGwgY2FsbAorICoJCisgKglUaGlzIHJvdXRpbmUgc2VuZHMgYSBmaWIgdG8gdGhlIGFkYXB0ZXIgb24gYmVoYWxmIG9mIGEgdXNlciBsZXZlbAorICoJcHJvZ3JhbS4KKyAqLworIAorc3RhdGljIGludCBpb2N0bF9zZW5kX2ZpYihzdHJ1Y3QgYWFjX2RldiAqIGRldiwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgaHdfZmliICoga2ZpYjsKKwlzdHJ1Y3QgZmliICpmaWJwdHI7CisKKwlmaWJwdHIgPSBmaWJfYWxsb2MoZGV2KTsKKwlpZihmaWJwdHIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJCQorCWtmaWIgPSBmaWJwdHItPmh3X2ZpYjsKKwkvKgorCSAqCUZpcnN0IGNvcHkgaW4gdGhlIGhlYWRlciBzbyB0aGF0IHdlIGNhbiBjaGVjayB0aGUgc2l6ZSBmaWVsZC4KKwkgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKilrZmliLCBhcmcsIHNpemVvZihzdHJ1Y3QgYWFjX2ZpYmhkcikpKSB7CisJCWZpYl9mcmVlKGZpYnB0cik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwkvKgorCSAqCVNpbmNlIHdlIGNvcHkgYmFzZWQgb24gdGhlIGZpYiBoZWFkZXIgc2l6ZSwgbWFrZSBzdXJlIHRoYXQgd2UKKwkgKgl3aWxsIG5vdCBvdmVycnVuIHRoZSBidWZmZXIgd2hlbiB3ZSBjb3B5IHRoZSBtZW1vcnkuIFJldHVybgorCSAqCWFuIGVycm9yIGlmIHdlIHdvdWxkLgorCSAqLworCWlmIChsZTE2X3RvX2NwdShrZmliLT5oZWFkZXIuU2l6ZSkgPiAKKwkJCXNpemVvZihzdHJ1Y3QgaHdfZmliKSAtIHNpemVvZihzdHJ1Y3QgYWFjX2ZpYmhkcikpIHsKKwkJZmliX2ZyZWUoZmlicHRyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKGtmaWIsIGFyZywgbGUxNl90b19jcHUoa2ZpYi0+aGVhZGVyLlNpemUpICsKKwkJCQlzaXplb2Yoc3RydWN0IGFhY19maWJoZHIpKSkgeworCQlmaWJfZnJlZShmaWJwdHIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoa2ZpYi0+aGVhZGVyLkNvbW1hbmQgPT0gY3B1X3RvX2xlMzIoVGFrZUFCcmVha1B0KSkgeworCQlhYWNfYWRhcHRlcl9pbnRlcnJ1cHQoZGV2KTsKKwkJLyoKKwkJICogU2luY2Ugd2UgZGlkbid0IHJlYWxseSBzZW5kIGEgZmliLCB6ZXJvIG91dCB0aGUgc3RhdGUgdG8gYWxsb3cgCisJCSAqIGNsZWFudXAgY29kZSBub3QgdG8gYXNzZXJ0LgorCQkgKi8KKwkJa2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSA9IDA7CisJfSBlbHNlIHsKKwkJaW50IHJldHZhbCA9IGZpYl9zZW5kKGtmaWItPmhlYWRlci5Db21tYW5kLCBmaWJwdHIsCisJCQkJbGUxNl90b19jcHUoa2ZpYi0+aGVhZGVyLlNpemUpICwgRnNhTm9ybWFsLAorCQkJCTEsIDEsIE5VTEwsIE5VTEwpOworCQlpZiAocmV0dmFsKSB7CisJCQlmaWJfZnJlZShmaWJwdHIpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlpZiAoZmliX2NvbXBsZXRlKGZpYnB0cikgIT0gMCkgeworCQkJZmliX2ZyZWUoZmlicHRyKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCS8qCisJICoJTWFrZSBzdXJlIHRoYXQgdGhlIHNpemUgcmV0dXJuZWQgYnkgdGhlIGFkYXB0ZXIgKHdoaWNoIGluY2x1ZGVzCisJICoJdGhlIGhlYWRlcikgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIGEgZmliLCBzbyB3ZQorCSAqCWRvbid0IGNvcnJ1cHQgYXBwbGljYXRpb24gZGF0YS4gVGhlbiBjb3B5IHRoYXQgc2l6ZSB0byB0aGUgdXNlcgorCSAqCWJ1ZmZlci4gKERvbid0IHRyeSB0byBhZGQgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBhZ2Fpbiwgc2luY2UgaXQKKwkgKgl3YXMgYWxyZWFkeSBpbmNsdWRlZCBieSB0aGUgYWRhcHRlci4pCisJICovCisKKwlpZiAoY29weV90b191c2VyKGFyZywgKHZvaWQgKilrZmliLCBrZmliLT5oZWFkZXIuU2l6ZSkpIHsKKwkJZmliX2ZyZWUoZmlicHRyKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWZpYl9mcmVlKGZpYnB0cik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJb3Blbl9nZXRhZGFwdGVyX2ZpYgktCUdldCB0aGUgbmV4dCBmaWIKKyAqCisgKglUaGlzIHJvdXRpbmUgd2lsbCBnZXQgdGhlIG5leHQgRmliLCBpZiBhdmFpbGFibGUsIGZyb20gdGhlIEFkYXB0ZXJGaWJDb250ZXh0CisgKglwYXNzZWQgaW4gZnJvbSB0aGUgdXNlci4KKyAqLworCitzdGF0aWMgaW50IG9wZW5fZ2V0YWRhcHRlcl9maWIoc3RydWN0IGFhY19kZXYgKiBkZXYsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGFhY19maWJfY29udGV4dCAqIGZpYmN0eDsKKwlpbnQgc3RhdHVzOworCisJZmliY3R4ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFhY19maWJfY29udGV4dCksIEdGUF9LRVJORUwpOworCWlmIChmaWJjdHggPT0gTlVMTCkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXN0cnVjdCBsaXN0X2hlYWQgKiBlbnRyeTsKKwkJc3RydWN0IGFhY19maWJfY29udGV4dCAqIGNvbnRleHQ7CisKKwkJZmliY3R4LT50eXBlID0gRlNBRlNfTlRDX0dFVF9BREFQVEVSX0ZJQl9DT05URVhUOworCQlmaWJjdHgtPnNpemUgPSBzaXplb2Yoc3RydWN0IGFhY19maWJfY29udGV4dCk7CisgCQkvKgorCQkgKglZZXMgeWVzLCBJIGtub3cgdGhpcyBjb3VsZCBiZSBhbiBpbmRleCwgYnV0IHdlIGhhdmUgYQorCQkgKiBiZXR0ZXIgZ3VhcmFudGVlIG9mIHVuaXF1ZW5lc3MgZm9yIHRoZSBsb2NrZWQgbG9vcCBiZWxvdy4KKwkJICogV2l0aG91dCB0aGUgYWlkIG9mIGEgcGVyc2lzdGVudCBoaXN0b3J5LCB0aGlzIGFsc28gaGVscHMKKwkJICogcmVkdWNlIHRoZSBjaGFuY2UgdGhhdCB0aGUgb3BhcXVlIGNvbnRleHQgd291bGQgYmUgcmV1c2VkLgorCQkgKi8KKwkJZmliY3R4LT51bmlxdWUgPSAodTMyKSgodWxvbmcpZmliY3R4ICYgMHhGRkZGRkZGRik7CisJCS8qCisJCSAqCUluaXRpYWxpemUgdGhlIG11dGV4IHVzZWQgdG8gd2FpdCBmb3IgdGhlIG5leHQgQUlGLgorCQkgKi8KKwkJaW5pdF9NVVRFWF9MT0NLRUQoJmZpYmN0eC0+d2FpdF9zZW0pOworCQlmaWJjdHgtPndhaXQgPSAwOworCQkvKgorCQkgKglJbml0aWFsaXplIHRoZSBmaWJzIGFuZCBzZXQgdGhlIGNvdW50IG9mIGZpYnMgb24KKwkJICoJdGhlIGxpc3QgdG8gMC4KKwkJICovCisJCWZpYmN0eC0+Y291bnQgPSAwOworCQlJTklUX0xJU1RfSEVBRCgmZmliY3R4LT5maWJfbGlzdCk7CisJCWZpYmN0eC0+amlmZmllcyA9IGppZmZpZXMvSFo7CisJCS8qCisJCSAqCU5vdyBhZGQgdGhpcyBjb250ZXh0IG9udG8gdGhlIGFkYXB0ZXIncyAKKwkJICoJQWRhcHRlckZpYkNvbnRleHQgbGlzdC4KKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmZpYl9sb2NrLCBmbGFncyk7CisJCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllciAqLworCQllbnRyeSA9IGRldi0+ZmliX2xpc3QubmV4dDsKKwkJd2hpbGUgKGVudHJ5ICE9ICZkZXYtPmZpYl9saXN0KSB7CisJCQljb250ZXh0ID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGFhY19maWJfY29udGV4dCwgbmV4dCk7CisJCQlpZiAoY29udGV4dC0+dW5pcXVlID09IGZpYmN0eC0+dW5pcXVlKSB7CisJCQkJLyogTm90IHVuaXF1ZSAoMzIgYml0cykgKi8KKwkJCQlmaWJjdHgtPnVuaXF1ZSsrOworCQkJCWVudHJ5ID0gZGV2LT5maWJfbGlzdC5uZXh0OworCQkJfSBlbHNlIHsKKwkJCQllbnRyeSA9IGVudHJ5LT5uZXh0OworCQkJfQorCQl9CisJCWxpc3RfYWRkX3RhaWwoJmZpYmN0eC0+bmV4dCwgJmRldi0+ZmliX2xpc3QpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmZpYl9sb2NrLCBmbGFncyk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAgJmZpYmN0eC0+dW5pcXVlLCAKKwkJCQkJCXNpemVvZihmaWJjdHgtPnVuaXF1ZSkpKSB7CisJCQlzdGF0dXMgPSAtRUZBVUxUOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gMDsKKwkJfQkKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKgluZXh0X2dldGFkYXB0ZXJfZmliCS0JZ2V0IHRoZSBuZXh0IGZpYgorICoJQGRldjogYWRhcHRlciB0byB1c2UKKyAqCUBhcmc6IGlvY3RsIGFyZ3VtZW50CisgKgkKKyAqIAlUaGlzIHJvdXRpbmUgd2lsbCBnZXQgdGhlIG5leHQgRmliLCBpZiBhdmFpbGFibGUsIGZyb20gdGhlIEFkYXB0ZXJGaWJDb250ZXh0CisgKglwYXNzZWQgaW4gZnJvbSB0aGUgdXNlci4KKyAqLworCitzdGF0aWMgaW50IG5leHRfZ2V0YWRhcHRlcl9maWIoc3RydWN0IGFhY19kZXYgKiBkZXYsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGZpYl9pb2N0bCBmOworCXN0cnVjdCBmaWIgKmZpYjsKKwlzdHJ1Y3QgYWFjX2ZpYl9jb250ZXh0ICpmaWJjdHg7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgbGlzdF9oZWFkICogZW50cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZihjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZmLCBhcmcsIHNpemVvZihzdHJ1Y3QgZmliX2lvY3RsKSkpCisJCXJldHVybiAtRUZBVUxUOworCS8qCisJICoJVmVyaWZ5IHRoYXQgdGhlIEhBTkRMRSBwYXNzZWQgaW4gd2FzIGEgdmFsaWQgQWRhcHRlckZpYkNvbnRleHQKKwkgKgorCSAqCVNlYXJjaCB0aGUgbGlzdCBvZiBBZGFwdGVyRmliQ29udGV4dCBhZGRyZXNzZXMgb24gdGhlIGFkYXB0ZXIKKwkgKgl0byBiZSBzdXJlIHRoaXMgaXMgYSB2YWxpZCBhZGRyZXNzCisJICovCisJZW50cnkgPSBkZXYtPmZpYl9saXN0Lm5leHQ7CisJZmliY3R4ID0gTlVMTDsKKworCXdoaWxlIChlbnRyeSAhPSAmZGV2LT5maWJfbGlzdCkgeworCQlmaWJjdHggPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgYWFjX2ZpYl9jb250ZXh0LCBuZXh0KTsKKwkJLyoKKwkJICoJRXh0cmFjdCB0aGUgQWRhcHRlckZpYkNvbnRleHQgZnJvbSB0aGUgSW5wdXQgcGFyYW1ldGVycy4KKwkJICovCisJCWlmIChmaWJjdHgtPnVuaXF1ZSA9PSBmLmZpYmN0eCkgeyAgIC8qIFdlIGZvdW5kIGEgd2lubmVyICovCisJCQlicmVhazsKKwkJfQorCQllbnRyeSA9IGVudHJ5LT5uZXh0OworCQlmaWJjdHggPSBOVUxMOworCX0KKwlpZiAoIWZpYmN0eCkgeworCQlkcHJpbnRrICgoS0VSTl9JTkZPICJGaWIgQ29udGV4dCBub3QgZm91bmRcbiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYoKGZpYmN0eC0+dHlwZSAhPSBGU0FGU19OVENfR0VUX0FEQVBURVJfRklCX0NPTlRFWFQpIHx8CisJCSAoZmliY3R4LT5zaXplICE9IHNpemVvZihzdHJ1Y3QgYWFjX2ZpYl9jb250ZXh0KSkpIHsKKwkJZHByaW50ayAoKEtFUk5fSU5GTyAiRmliIENvbnRleHQgY29ycnVwdD9cbiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXN0YXR1cyA9IDA7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZmliX2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqCUlmIHRoZXJlIGFyZSBubyBmaWJzIHRvIHNlbmQgYmFjaywgdGhlbiBlaXRoZXIgd2FpdCBvciByZXR1cm4KKwkgKgktRUFHQUlOCisJICovCityZXR1cm5fZmliOgorCWlmICghbGlzdF9lbXB0eSgmZmliY3R4LT5maWJfbGlzdCkpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqIGVudHJ5OworCQkvKgorCQkgKglQdWxsIHRoZSBuZXh0IGZpYiBmcm9tIHRoZSBmaWJzCisJCSAqLworCQllbnRyeSA9IGZpYmN0eC0+ZmliX2xpc3QubmV4dDsKKwkJbGlzdF9kZWwoZW50cnkpOworCQkKKwkJZmliID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGZpYiwgZmlibGluayk7CisJCWZpYmN0eC0+Y291bnQtLTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5maWJfbG9jaywgZmxhZ3MpOworCQlpZiAoY29weV90b191c2VyKGYuZmliLCBmaWItPmh3X2ZpYiwgc2l6ZW9mKHN0cnVjdCBod19maWIpKSkgeworCQkJa2ZyZWUoZmliLT5od19maWIpOworCQkJa2ZyZWUoZmliKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CQorCQkvKgorCQkgKglGcmVlIHRoZSBzcGFjZSBvY2N1cGllZCBieSB0aGlzIGNvcHkgb2YgdGhlIGZpYi4KKwkJICovCisJCWtmcmVlKGZpYi0+aHdfZmliKTsKKwkJa2ZyZWUoZmliKTsKKwkJc3RhdHVzID0gMDsKKwkJZmliY3R4LT5qaWZmaWVzID0gamlmZmllcy9IWjsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmZpYl9sb2NrLCBmbGFncyk7CisJCWlmIChmLndhaXQpIHsKKwkJCWlmKGRvd25faW50ZXJydXB0aWJsZSgmZmliY3R4LT53YWl0X3NlbSkgPCAwKSB7CisJCQkJc3RhdHVzID0gLUVJTlRSOworCQkJfSBlbHNlIHsKKwkJCQkvKiBMb2NrIGFnYWluIGFuZCByZXRyeSAqLworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmZpYl9sb2NrLCBmbGFncyk7CisJCQkJZ290byByZXR1cm5fZmliOworCQkJfQorCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVBR0FJTjsKKwkJfQkKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IGFhY19jbG9zZV9maWJfY29udGV4dChzdHJ1Y3QgYWFjX2RldiAqIGRldiwgc3RydWN0IGFhY19maWJfY29udGV4dCAqIGZpYmN0eCkKK3sKKwlzdHJ1Y3QgZmliICpmaWI7CisKKwkvKgorCSAqCUZpcnN0IGZyZWUgYW55IEZJQnMgdGhhdCBoYXZlIG5vdCBiZWVuIGNvbnN1bWVkLgorCSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmZmliY3R4LT5maWJfbGlzdCkpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqIGVudHJ5OworCQkvKgorCQkgKglQdWxsIHRoZSBuZXh0IGZpYiBmcm9tIHRoZSBmaWJzCisJCSAqLworCQllbnRyeSA9IGZpYmN0eC0+ZmliX2xpc3QubmV4dDsKKwkJbGlzdF9kZWwoZW50cnkpOworCQlmaWIgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZmliLCBmaWJsaW5rKTsKKwkJZmliY3R4LT5jb3VudC0tOworCQkvKgorCQkgKglGcmVlIHRoZSBzcGFjZSBvY2N1cGllZCBieSB0aGlzIGNvcHkgb2YgdGhlIGZpYi4KKwkJICovCisJCWtmcmVlKGZpYi0+aHdfZmliKTsKKwkJa2ZyZWUoZmliKTsKKwl9CisJLyoKKwkgKglSZW1vdmUgdGhlIENvbnRleHQgZnJvbSB0aGUgQWRhcHRlckZpYkNvbnRleHQgTGlzdAorCSAqLworCWxpc3RfZGVsKCZmaWJjdHgtPm5leHQpOworCS8qCisJICoJSW52YWxpZGF0ZSBjb250ZXh0CisJICovCisJZmliY3R4LT50eXBlID0gMDsKKwkvKgorCSAqCUZyZWUgdGhlIHNwYWNlIG9jY3VwaWVkIGJ5IHRoZSBDb250ZXh0CisJICovCisJa2ZyZWUoZmliY3R4KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgljbG9zZV9nZXRhZGFwdGVyX2ZpYgktCWNsb3NlIGRvd24gdXNlciBmaWIgY29udGV4dAorICoJQGRldjogYWRhcHRlcgorICoJQGFyZzogaW9jdGwgYXJndW1lbnRzCisgKgorICoJVGhpcyByb3V0aW5lIHdpbGwgY2xvc2UgZG93biB0aGUgZmliY3R4IHBhc3NlZCBpbiBmcm9tIHRoZSB1c2VyLgorICovCisgCitzdGF0aWMgaW50IGNsb3NlX2dldGFkYXB0ZXJfZmliKHN0cnVjdCBhYWNfZGV2ICogZGV2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBhYWNfZmliX2NvbnRleHQgKmZpYmN0eDsKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqIGVudHJ5OworCisJLyoKKwkgKglWZXJpZnkgdGhhdCB0aGUgSEFORExFIHBhc3NlZCBpbiB3YXMgYSB2YWxpZCBBZGFwdGVyRmliQ29udGV4dAorCSAqCisJICoJU2VhcmNoIHRoZSBsaXN0IG9mIEFkYXB0ZXJGaWJDb250ZXh0IGFkZHJlc3NlcyBvbiB0aGUgYWRhcHRlcgorCSAqCXRvIGJlIHN1cmUgdGhpcyBpcyBhIHZhbGlkIGFkZHJlc3MKKwkgKi8KKworCWVudHJ5ID0gZGV2LT5maWJfbGlzdC5uZXh0OworCWZpYmN0eCA9IE5VTEw7CisKKwl3aGlsZShlbnRyeSAhPSAmZGV2LT5maWJfbGlzdCkgeworCQlmaWJjdHggPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgYWFjX2ZpYl9jb250ZXh0LCBuZXh0KTsKKwkJLyoKKwkJICoJRXh0cmFjdCB0aGUgZmliY3R4IGZyb20gdGhlIGlucHV0IHBhcmFtZXRlcnMKKwkJICovCisJCWlmIChmaWJjdHgtPnVuaXF1ZSA9PSAodTMyKSh1bnNpZ25lZCBsb25nKWFyZykgeyAgIAorCQkJLyogV2UgZm91bmQgYSB3aW5uZXIgKi8KKwkJCWJyZWFrOworCQl9CisJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCWZpYmN0eCA9IE5VTEw7CisJfQorCisJaWYgKCFmaWJjdHgpCisJCXJldHVybiAwOyAvKiBBbHJlYWR5IGdvbmUgKi8KKworCWlmKChmaWJjdHgtPnR5cGUgIT0gRlNBRlNfTlRDX0dFVF9BREFQVEVSX0ZJQl9DT05URVhUKSB8fAorCQkgKGZpYmN0eC0+c2l6ZSAhPSBzaXplb2Yoc3RydWN0IGFhY19maWJfY29udGV4dCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5maWJfbG9jaywgZmxhZ3MpOworCXN0YXR1cyA9IGFhY19jbG9zZV9maWJfY29udGV4dChkZXYsIGZpYmN0eCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5maWJfbG9jaywgZmxhZ3MpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICoJY2hlY2tfcmV2aXNpb24JLQljbG9zZSBkb3duIHVzZXIgZmliIGNvbnRleHQKKyAqCUBkZXY6IGFkYXB0ZXIKKyAqCUBhcmc6IGlvY3RsIGFyZ3VtZW50cworICoKKyAqCVRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBkcml2ZXIgdmVyc2lvbi4KKyAqICAgICAgVW5kZXIgTGludXgsIHRoZXJlIGhhdmUgYmVlbiBubyB2ZXJzaW9uIGluY29tcGF0aWJpbGl0aWVzLCBzbyB0aGlzIGlzIAorICogICAgICBzaW1wbGUhCisgKi8KKworc3RhdGljIGludCBjaGVja19yZXZpc2lvbihzdHJ1Y3QgYWFjX2RldiAqZGV2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCByZXZpc2lvbiByZXNwb25zZTsKKworCXJlc3BvbnNlLmNvbXBhdCA9IDE7CisJcmVzcG9uc2UudmVyc2lvbiA9IGRldi0+YWRhcHRlcl9pbmZvLmtlcm5lbHJldjsKKwlyZXNwb25zZS5idWlsZCA9IGRldi0+YWRhcHRlcl9pbmZvLmtlcm5lbGJ1aWxkOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKioKKyAqCisgKiBhYWNfc2VuZF9yYXdfc2NiCisgKgorICovCisKK2ludCBhYWNfc2VuZF9yYXdfc3JiKHN0cnVjdCBhYWNfZGV2KiBkZXYsIHZvaWQgX191c2VyICogYXJnKQoreworCXN0cnVjdCBmaWIqIHNyYmZpYjsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBhYWNfc3JiICpzcmJjbWQ7CisJc3RydWN0IGFhY19zcmIgX191c2VyICp1c2VyX3NyYiA9IGFyZzsKKwlzdHJ1Y3QgYWFjX3NyYl9yZXBseSBfX3VzZXIgKnVzZXJfcmVwbHk7CisJc3RydWN0IGFhY19zcmJfcmVwbHkqIHJlcGx5OworCXUzMiBmaWJzaXplID0gMDsKKwl1MzIgZmxhZ3MgPSAwOworCXMzMiByY29kZSA9IDA7CisJdTMyIGRhdGFfZGlyOworCXZvaWQgX191c2VyICpzZ191c2VyWzMyXTsKKwl2b2lkICpzZ19saXN0WzMyXTsKKwl1MzIgICBzZ19pbmR4ID0gMDsKKwl1MzIgYnl0ZV9jb3VudCA9IDA7CisJdTMyIGFjdHVhbF9maWJzaXplID0gMDsKKwlpbnQgaTsKKworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKXsKKwkJcHJpbnRrKEtFUk5fREVCVUciYWFjcmFpZDogTm8gcGVybWlzc2lvbiB0byBzZW5kIHJhdyBzcmJcbiIpOyAKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJLyoKKwkgKglBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIEZpYiB0aGVuIHNldHVwIGEgQmxvY2tXcml0ZSBjb21tYW5kCisJICovCisJaWYgKCEoc3JiZmliID0gZmliX2FsbG9jKGRldikpKSB7CisJCXJldHVybiAtMTsKKwl9CisJZmliX2luaXQoc3JiZmliKTsKKworCXNyYmNtZCA9IChzdHJ1Y3QgYWFjX3NyYiopIGZpYl9kYXRhKHNyYmZpYik7CisKKwlpZihjb3B5X2Zyb21fdXNlcigmZmlic2l6ZSwgJnVzZXJfc3JiLT5jb3VudCxzaXplb2YodTMyKSkpeworCQlwcmludGsoS0VSTl9ERUJVRyJhYWNyYWlkOiBDb3VsZCBub3QgY29weSBkYXRhIHNpemUgZnJvbSB1c2VyXG4iKTsgCisJCXJjb2RlID0gLUVGQVVMVDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWlmIChmaWJzaXplID4gRklCX0RBVEFfU0laRV9JTl9CWVRFUykgeworCQlyY29kZSA9IC1FSU5WQUw7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlpZihjb3B5X2Zyb21fdXNlcihzcmJjbWQsIHVzZXJfc3JiLGZpYnNpemUpKXsKKwkJcHJpbnRrKEtFUk5fREVCVUciYWFjcmFpZDogQ291bGQgbm90IGNvcHkgc3JiIGZyb20gdXNlclxuIik7IAorCQlyY29kZSA9IC1FRkFVTFQ7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwl1c2VyX3JlcGx5ID0gYXJnK2ZpYnNpemU7CisKKwlmbGFncyA9IHNyYmNtZC0+ZmxhZ3M7CisJLy8gRml4IHVwIHNyYiBmb3IgZW5kaWFuIGFuZCBmb3JjZSBzb21lIHZhbHVlcworCXNyYmNtZC0+ZnVuY3Rpb24gPSBjcHVfdG9fbGUzMihTUkJGX0V4ZWN1dGVTY3NpKTsJLy8gRm9yY2UgdGhpcworCXNyYmNtZC0+Y2hhbm5lbCAgPSBjcHVfdG9fbGUzMihzcmJjbWQtPmNoYW5uZWwpOworCXNyYmNtZC0+aWQJID0gY3B1X3RvX2xlMzIoc3JiY21kLT5pZCk7CisJc3JiY21kLT5sdW4gICAgICA9IGNwdV90b19sZTMyKHNyYmNtZC0+bHVuKTsKKwlzcmJjbWQtPmZsYWdzICAgID0gY3B1X3RvX2xlMzIoc3JiY21kLT5mbGFncyk7CisJc3JiY21kLT50aW1lb3V0ICA9IGNwdV90b19sZTMyKHNyYmNtZC0+dGltZW91dCk7CisJc3JiY21kLT5yZXRyeV9saW1pdCA9Y3B1X3RvX2xlMzIoMCk7IC8vIE9ic29sZXRlIHBhcmFtZXRlcgorCXNyYmNtZC0+Y2RiX3NpemUgPSBjcHVfdG9fbGUzMihzcmJjbWQtPmNkYl9zaXplKTsKKwkKKwlzd2l0Y2ggKHNyYmNtZC0+ZmxhZ3MgJiAoU1JCX0RhdGFJbiB8IFNSQl9EYXRhT3V0KSkgeworCWNhc2UgU1JCX0RhdGFPdXQ6CisJCWRhdGFfZGlyID0gRE1BX1RPX0RFVklDRTsKKwkJYnJlYWs7CisJY2FzZSAoU1JCX0RhdGFJbiB8IFNSQl9EYXRhT3V0KToKKwkJZGF0YV9kaXIgPSBETUFfQklESVJFQ1RJT05BTDsKKwkJYnJlYWs7CisJY2FzZSBTUkJfRGF0YUluOgorCQlkYXRhX2RpciA9IERNQV9GUk9NX0RFVklDRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGF0YV9kaXIgPSBETUFfTk9ORTsKKwl9CisJaWYgKGRldi0+ZGFjX3N1cHBvcnQgPT0gMSkgeworCQlzdHJ1Y3Qgc2dtYXA2NCogcHNnID0gKHN0cnVjdCBzZ21hcDY0Kikmc3JiY21kLT5zZzsKKwkJYnl0ZV9jb3VudCA9IDA7CisKKwkJLyoKKwkJICogVGhpcyBzaG91bGQgYWxzbyBjYXRjaCBpZiB1c2VyIHVzZWQgdGhlIDMyIGJpdCBzZ21hcAorCQkgKi8KKwkJYWN0dWFsX2ZpYnNpemUgPSBzaXplb2Yoc3RydWN0IGFhY19zcmIpIC0gCisJCQlzaXplb2Yoc3RydWN0IHNnZW50cnkpICsgKChzcmJjbWQtPnNnLmNvdW50ICYgMHhmZikgKiAKKwkJCSAJc2l6ZW9mKHN0cnVjdCBzZ2VudHJ5NjQpKTsKKwkJaWYoYWN0dWFsX2ZpYnNpemUgIT0gZmlic2l6ZSl7IC8vIFVzZXIgbWFkZSBhIG1pc3Rha2UgLSBzaG91bGQgbm90IGNvbnRpbnVlCisJCQlwcmludGsoS0VSTl9ERUJVRyJhYWNyYWlkOiBCYWQgU2l6ZSBzcGVjaWZpZWQgaW4gUmF3IFNSQiBjb21tYW5kXG4iKTsKKwkJCXJjb2RlID0gLUVJTlZBTDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlpZiAoKGRhdGFfZGlyID09IERNQV9OT05FKSAmJiBwc2ctPmNvdW50KSB7IAorCQkJcHJpbnRrKEtFUk5fREVCVUciYWFjcmFpZDogU0cgd2l0aCBubyBkaXJlY3Rpb24gc3BlY2lmaWVkIGluIFJhdyBTUkIgY29tbWFuZFxuIik7CisJCQlyY29kZSA9IC1FSU5WQUw7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgcHNnLT5jb3VudDsgaSsrKSB7CisJCQlkbWFfYWRkcl90IGFkZHI7IAorCQkJdTY0IGxlX2FkZHI7CisJCQl2b2lkKiBwOworCQkJcCA9IGttYWxsb2MocHNnLT5zZ1tpXS5jb3VudCxHRlBfS0VSTkVMfF9fR0ZQX0RNQSk7CisJCQlpZihwID09IDApIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyJhYWNyYWlkOiBDb3VsZCBub3QgYWxsb2NhdGUgU0cgYnVmZmVyIC0gc2l6ZSA9ICVkIGJ1ZmZlciBudW1iZXIgJWQgb2YgJWRcbiIsCisJCQkJcHNnLT5zZ1tpXS5jb3VudCxpLHBzZy0+Y291bnQpOworCQkJCXJjb2RlID0gLUVOT01FTTsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJCQlzZ191c2VyW2ldID0gKHZvaWQgX191c2VyICopcHNnLT5zZ1tpXS5hZGRyOworCQkJc2dfbGlzdFtpXSA9IHA7IC8vIHNhdmUgc28gd2UgY2FuIGNsZWFuIHVwIGxhdGVyCisJCQlzZ19pbmR4ID0gaTsKKworCQkJaWYoIGZsYWdzICYgU1JCX0RhdGFPdXQgKXsKKwkJCQlpZihjb3B5X2Zyb21fdXNlcihwLHNnX3VzZXJbaV0scHNnLT5zZ1tpXS5jb3VudCkpeworCQkJCQlwcmludGsoS0VSTl9ERUJVRyJhYWNyYWlkOiBDb3VsZCBub3QgY29weSBzZyBkYXRhIGZyb20gdXNlclxuIik7IAorCQkJCQlyY29kZSA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gY2xlYW51cDsKKwkJCQl9CisJCQl9CisJCQlhZGRyID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wZGV2LCBwLCBwc2ctPnNnW2ldLmNvdW50LCBkYXRhX2Rpcik7CisKKwkJCWxlX2FkZHIgPSBjcHVfdG9fbGU2NChhZGRyKTsKKwkJCXBzZy0+c2dbaV0uYWRkclsxXSA9ICh1MzIpKGxlX2FkZHI+PjMyKTsKKwkJCXBzZy0+c2dbaV0uYWRkclswXSA9ICh1MzIpKGxlX2FkZHIgJiAweGZmZmZmZmZmKTsKKwkJCXBzZy0+c2dbaV0uY291bnQgPSBjcHVfdG9fbGUzMihwc2ctPnNnW2ldLmNvdW50KTsgIAorCQkJYnl0ZV9jb3VudCArPSBwc2ctPnNnW2ldLmNvdW50OworCQl9CisKKwkJc3JiY21kLT5jb3VudCA9IGNwdV90b19sZTMyKGJ5dGVfY291bnQpOworCQlzdGF0dXMgPSBmaWJfc2VuZChTY3NpUG9ydENvbW1hbmQ2NCwgc3JiZmliLCBhY3R1YWxfZmlic2l6ZSwgRnNhTm9ybWFsLCAxLCAxLE5VTEwsTlVMTCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IHNnbWFwKiBwc2cgPSAmc3JiY21kLT5zZzsKKwkJYnl0ZV9jb3VudCA9IDA7CisKKwkJYWN0dWFsX2ZpYnNpemUgPSBzaXplb2YgKHN0cnVjdCBhYWNfc3JiKSArIAorCQkJKCgobGUzMl90b19jcHUoc3JiY21kLT5zZy5jb3VudCkgJiAweGZmKSAtIDEpICogCisJCQkgc2l6ZW9mIChzdHJ1Y3Qgc2dlbnRyeSkpOworCQlpZihhY3R1YWxfZmlic2l6ZSAhPSBmaWJzaXplKXsgLy8gVXNlciBtYWRlIGEgbWlzdGFrZSAtIHNob3VsZCBub3QgY29udGludWUKKwkJCXByaW50ayhLRVJOX0RFQlVHImFhY3JhaWQ6IEJhZCBTaXplIHNwZWNpZmllZCBpbiBSYXcgU1JCIGNvbW1hbmRcbiIpOworCQkJcmNvZGUgPSAtRUlOVkFMOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCWlmICgoZGF0YV9kaXIgPT0gRE1BX05PTkUpICYmIHBzZy0+Y291bnQpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHImFhY3JhaWQ6IFNHIHdpdGggbm8gZGlyZWN0aW9uIHNwZWNpZmllZCBpbiBSYXcgU1JCIGNvbW1hbmRcbiIpOworCQkJcmNvZGUgPSAtRUlOVkFMOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBwc2ctPmNvdW50OyBpKyspIHsKKwkJCWRtYV9hZGRyX3QgYWRkcjsgCisJCQl2b2lkKiBwOworCQkJcCA9IGttYWxsb2MocHNnLT5zZ1tpXS5jb3VudCxHRlBfS0VSTkVMKTsKKwkJCWlmKHAgPT0gMCkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHImFhY3JhaWQ6IENvdWxkIG5vdCBhbGxvY2F0ZSBTRyBidWZmZXIgLSBzaXplID0gJWQgYnVmZmVyIG51bWJlciAlZCBvZiAlZFxuIiwKKwkJCQlwc2ctPnNnW2ldLmNvdW50LGkscHNnLT5jb3VudCk7CisJCQkJcmNvZGUgPSAtRU5PTUVNOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKwkJCXNnX3VzZXJbaV0gPSAodm9pZCBfX3VzZXIgKikocHNnLT5zZ1tpXS5hZGRyKTsKKwkJCXNnX2xpc3RbaV0gPSBwOyAvLyBzYXZlIHNvIHdlIGNhbiBjbGVhbiB1cCBsYXRlcgorCQkJc2dfaW5keCA9IGk7CisKKwkJCWlmKCBmbGFncyAmIFNSQl9EYXRhT3V0ICl7CisJCQkJaWYoY29weV9mcm9tX3VzZXIocCxzZ191c2VyW2ldLHBzZy0+c2dbaV0uY291bnQpKXsKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUciYWFjcmFpZDogQ291bGQgbm90IGNvcHkgc2cgZGF0YSBmcm9tIHVzZXJcbiIpOyAKKwkJCQkJcmNvZGUgPSAtRUZBVUxUOworCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJfQorCQkJfQorCQkJYWRkciA9IHBjaV9tYXBfc2luZ2xlKGRldi0+cGRldiwgcCwgcHNnLT5zZ1tpXS5jb3VudCwgZGF0YV9kaXIpOworCisJCQlwc2ctPnNnW2ldLmFkZHIgPSBjcHVfdG9fbGUzMihhZGRyKTsKKwkJCXBzZy0+c2dbaV0uY291bnQgPSBjcHVfdG9fbGUzMihwc2ctPnNnW2ldLmNvdW50KTsgIAorCQkJYnl0ZV9jb3VudCArPSBwc2ctPnNnW2ldLmNvdW50OworCQl9CisJCXNyYmNtZC0+Y291bnQgPSBjcHVfdG9fbGUzMihieXRlX2NvdW50KTsKKwkJc3RhdHVzID0gZmliX3NlbmQoU2NzaVBvcnRDb21tYW5kLCBzcmJmaWIsIGFjdHVhbF9maWJzaXplLCBGc2FOb3JtYWwsIDEsIDEsIE5VTEwsIE5VTEwpOworCX0KKworCWlmIChzdGF0dXMgIT0gMCl7CisJCXByaW50ayhLRVJOX0RFQlVHImFhY3JhaWQ6IENvdWxkIG5vdCBzZW5kIHJhdyBzcmIgZmliIHRvIGhiYVxuIik7IAorCQlyY29kZSA9IC0xOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJaWYoIGZsYWdzICYgU1JCX0RhdGFJbiApIHsKKwkJZm9yKGkgPSAwIDsgaSA8PSBzZ19pbmR4OyBpKyspeworCQkJaWYoY29weV90b191c2VyKHNnX3VzZXJbaV0sc2dfbGlzdFtpXSxsZTMyX3RvX2NwdShzcmJjbWQtPnNnLnNnW2ldLmNvdW50KSkpeworCQkJCXByaW50ayhLRVJOX0RFQlVHImFhY3JhaWQ6IENvdWxkIG5vdCBjb3B5IHNnIGRhdGEgdG8gdXNlclxuIik7IAorCQkJCXJjb2RlID0gLUVGQVVMVDsKKwkJCQlnb3RvIGNsZWFudXA7CisKKwkJCX0KKwkJfQorCX0KKworCXJlcGx5ID0gKHN0cnVjdCBhYWNfc3JiX3JlcGx5ICopIGZpYl9kYXRhKHNyYmZpYik7CisJaWYoY29weV90b191c2VyKHVzZXJfcmVwbHkscmVwbHksc2l6ZW9mKHN0cnVjdCBhYWNfc3JiX3JlcGx5KSkpeworCQlwcmludGsoS0VSTl9ERUJVRyJhYWNyYWlkOiBDb3VsZCBub3QgY29weSByZXBseSB0byB1c2VyXG4iKTsgCisJCXJjb2RlID0gLUVGQVVMVDsKKwkJZ290byBjbGVhbnVwOworCX0KKworY2xlYW51cDoKKwlmb3IoaT0wOyBpIDw9IHNnX2luZHg7IGkrKyl7CisJCWtmcmVlKHNnX2xpc3RbaV0pOworCX0KKwlmaWJfY29tcGxldGUoc3JiZmliKTsKKwlmaWJfZnJlZShzcmJmaWIpOworCisJcmV0dXJuIHJjb2RlOworfQorCisKK3N0cnVjdCBhYWNfcGNpX2luZm8geworICAgICAgICB1MzIgYnVzOworICAgICAgICB1MzIgc2xvdDsKK307CisKKworaW50IGFhY19nZXRfcGNpX2luZm8oc3RydWN0IGFhY19kZXYqIGRldiwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKyAgICAgICAgc3RydWN0IGFhY19wY2lfaW5mbyBwY2lfaW5mbzsKKworCXBjaV9pbmZvLmJ1cyA9IGRldi0+cGRldi0+YnVzLT5udW1iZXI7CisJcGNpX2luZm8uc2xvdCA9IFBDSV9TTE9UKGRldi0+cGRldi0+ZGV2Zm4pOworCisgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmcsICZwY2lfaW5mbywgc2l6ZW9mKHN0cnVjdCBhYWNfcGNpX2luZm8pKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiYWFjcmFpZDogQ291bGQgbm90IGNvcHkgcGNpIGluZm9cbiIpOworICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisJfQorICAgICAgICByZXR1cm4gMDsKKyB9CisgCisKK2ludCBhYWNfZG9faW9jdGwoc3RydWN0IGFhY19kZXYgKiBkZXYsIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IHN0YXR1czsKKwkKKwkvKgorCSAqCUhCQSBnZXRzIGZpcnN0IGNyYWNrCisJICovCisJIAorCXN0YXR1cyA9IGFhY19kZXZfaW9jdGwoZGV2LCBjbWQsIGFyZyk7CisJaWYoc3RhdHVzICE9IC1FTk9UVFkpCisJCXJldHVybiBzdGF0dXM7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRlNBQ1RMX01JTklQT1JUX1JFVl9DSEVDSzoKKwkJc3RhdHVzID0gY2hlY2tfcmV2aXNpb24oZGV2LCBhcmcpOworCQlicmVhazsKKwljYXNlIEZTQUNUTF9TRU5ERklCOgorCQlzdGF0dXMgPSBpb2N0bF9zZW5kX2ZpYihkZXYsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlNBQ1RMX09QRU5fR0VUX0FEQVBURVJfRklCOgorCQlzdGF0dXMgPSBvcGVuX2dldGFkYXB0ZXJfZmliKGRldiwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGU0FDVExfR0VUX05FWFRfQURBUFRFUl9GSUI6CisJCXN0YXR1cyA9IG5leHRfZ2V0YWRhcHRlcl9maWIoZGV2LCBhcmcpOworCQlicmVhazsKKwljYXNlIEZTQUNUTF9DTE9TRV9HRVRfQURBUFRFUl9GSUI6CisJCXN0YXR1cyA9IGNsb3NlX2dldGFkYXB0ZXJfZmliKGRldiwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGU0FDVExfU0VORF9SQVdfU1JCOgorCQlzdGF0dXMgPSBhYWNfc2VuZF9yYXdfc3JiKGRldixhcmcpOworCQlicmVhazsKKwljYXNlIEZTQUNUTF9HRVRfUENJX0lORk86CisJCXN0YXR1cyA9IGFhY19nZXRfcGNpX2luZm8oZGV2LGFyZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FTk9UVFk7CisJICAJYnJlYWs7CQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21taW5pdC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODMyYTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWluaXQuYwpAQCAtMCwwICsxLDMyNSBAQAorLyoKKyAqCUFkYXB0ZWMgQUFDIHNlcmllcyBSQUlEIGNvbnRyb2xsZXIgZHJpdmVyCisgKgkoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMuCTxhbGFuQHJlZGhhdC5jb20+CisgKgorICogYmFzZWQgb24gdGhlIG9sZCBhYWNyYWlkIGRyaXZlciB0aGF0IGlzLi4KKyAqIEFkYXB0ZWMgYWFjcmFpZCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgQWRhcHRlYywgSW5jLiAoYWFjcmFpZEBhZGFwdGVjLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIE1vZHVsZSBOYW1lOgorICogIGNvbW1pbml0LmMKKyAqCisgKiBBYnN0cmFjdDogVGhpcyBzdXBwb3J0cyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGhvc3QgYWRhcHRlciBjb21tdWljYXRpb24gaW50ZXJmYWNlLgorICogICAgVGhpcyBpcyBhIHBsYXRmb3JtIGRlcGVuZGVudCBtb2R1bGUgZm9yIHRoZSBwY2kgY3ljbG9uZSBib2FyZC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSAiYWFjcmFpZC5oIgorCitzdHJ1Y3QgYWFjX2NvbW1vbiBhYWNfY29uZmlnOworCitzdGF0aWMgaW50IGFhY19hbGxvY19jb21tKHN0cnVjdCBhYWNfZGV2ICpkZXYsIHZvaWQgKipjb21tYWRkciwgdW5zaWduZWQgbG9uZyBjb21tc2l6ZSwgdW5zaWduZWQgbG9uZyBjb21tYWxpZ24pCit7CisJdW5zaWduZWQgY2hhciAqYmFzZTsKKwl1bnNpZ25lZCBsb25nIHNpemUsIGFsaWduOworCXVuc2lnbmVkIGxvbmcgZmlic2l6ZSA9IDQwOTY7CisJdW5zaWduZWQgbG9uZyBwcmludGZidWZzaXogPSAyNTY7CisJc3RydWN0IGFhY19pbml0ICppbml0OworCWRtYV9hZGRyX3QgcGh5czsKKworCXNpemUgPSBmaWJzaXplICsgc2l6ZW9mKHN0cnVjdCBhYWNfaW5pdCkgKyBjb21tc2l6ZSArIGNvbW1hbGlnbiArIHByaW50ZmJ1ZnNpejsKKworIAorCWJhc2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsIHNpemUsICZwaHlzKTsKKworCWlmKGJhc2UgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiYWFjcmFpZDogdW5hYmxlIHRvIGNyZWF0ZSBtYXBwaW5nLlxuIik7CisJCXJldHVybiAwOworCX0KKwlkZXYtPmNvbW1fYWRkciA9ICh2b2lkICopYmFzZTsKKwlkZXYtPmNvbW1fcGh5cyA9IHBoeXM7CisJZGV2LT5jb21tX3NpemUgPSBzaXplOworCQorCWRldi0+aW5pdCA9IChzdHJ1Y3QgYWFjX2luaXQgKikoYmFzZSArIGZpYnNpemUpOworCWRldi0+aW5pdF9wYSA9IHBoeXMgKyBmaWJzaXplOworCisJaW5pdCA9IGRldi0+aW5pdDsKKworCWluaXQtPkluaXRTdHJ1Y3RSZXZpc2lvbiA9IGNwdV90b19sZTMyKEFEQVBURVJfSU5JVF9TVFJVQ1RfUkVWSVNJT04pOworCWluaXQtPk1pbmlQb3J0UmV2aXNpb24gPSBjcHVfdG9fbGUzMihTYV9NSU5JUE9SVF9SRVZJU0lPTik7CisJaW5pdC0+ZnNyZXYgPSBjcHVfdG9fbGUzMihkZXYtPmZzcmV2KTsKKworCS8qCisJICoJQWRhcHRlciBGaWJzIGFyZSB0aGUgZmlyc3QgdGhpbmcgYWxsb2NhdGVkIHNvIHRoYXQgdGhleQorCSAqCXN0YXJ0IHBhZ2UgYWxpZ25lZAorCSAqLworCWRldi0+YWlmX2Jhc2VfdmEgPSAoc3RydWN0IGh3X2ZpYiAqKWJhc2U7CisJCisJaW5pdC0+QWRhcHRlckZpYnNWaXJ0dWFsQWRkcmVzcyA9IDA7CisJaW5pdC0+QWRhcHRlckZpYnNQaHlzaWNhbEFkZHJlc3MgPSBjcHVfdG9fbGUzMigodTMyKXBoeXMpOworCWluaXQtPkFkYXB0ZXJGaWJzU2l6ZSA9IGNwdV90b19sZTMyKGZpYnNpemUpOworCWluaXQtPkFkYXB0ZXJGaWJBbGlnbiA9IGNwdV90b19sZTMyKHNpemVvZihzdHJ1Y3QgaHdfZmliKSk7CisJLyogCisJICogbnVtYmVyIG9mIDRrIHBhZ2VzIG9mIGhvc3QgcGh5c2ljYWwgbWVtb3J5LiBUaGUgYWFjcmFpZCBmdyBuZWVkcworCSAqIHRoaXMgbnVtYmVyIHRvIGJlIGxlc3MgdGhhbiA0Z2Igd29ydGggb2YgcGFnZXMuIG51bV9waHlzcGFnZXMgaXMgaW4KKwkgKiBzeXN0ZW0gcGFnZSB1bml0cy4gTmV3IGZpcm13YXJlIGRvZXNuJ3QgaGF2ZSBhbnkgaXNzdWVzIHdpdGggdGhlCisJICogbWFwcGluZyBzeXN0ZW0sIGJ1dCBvbGRlciBGaXJtd2FyZSBkaWQsIGFuZCBoYWQgKnRyb3VibGVzKiBkZWFsaW5nCisJICogd2l0aCB0aGUgbWF0aCBvdmVybG9hZGluZyBwYXN0IDMyIGJpdHMsIHRodXMgd2UgbXVzdCBsaW1pdCB0aGlzCisJICogZmllbGQuCisJICoKKwkgKiBUaGlzIGFzc3VtZXMgdGhlIG1lbW9yeSBpcyBtYXBwZWQgemVyby0+biwgd2hpY2ggaXNudAorCSAqIGFsd2F5cyB0cnVlIG9uIHJlYWwgY29tcHV0ZXJzLiBJdCBhbHNvIGhhcyBzb21lIHNsaWdodCBwcm9ibGVtcworCSAqIHdpdGggdGhlIEdBUlQgb24geDg2LTY0LiBJJ3ZlIGJ0dyBuZXZlciB0cmllZCBETUEgZnJvbSBQQ0kgc3BhY2UKKwkgKiBvbiB0aGlzIHBsYXRmb3JtIGJ1dCBkb24ndCBiZSBzdXByaXNlZCBpZiBpdHMgcHJvYmxlbWF0aWMuCisJICovCisjaWZuZGVmIENPTkZJR19HQVJUX0lPTU1VCisJaWYgKChudW1fcGh5c3BhZ2VzIDw8IChQQUdFX1NISUZUIC0gMTIpKSA8PSBBQUNfTUFYX0hPU1RQSFlTTUVNUEFHRVMpIHsKKwkJaW5pdC0+SG9zdFBoeXNNZW1QYWdlcyA9IAorCQkJY3B1X3RvX2xlMzIobnVtX3BoeXNwYWdlcyA8PCAoUEFHRV9TSElGVC0xMikpOworCX0gZWxzZSAKKyNlbmRpZgkKKwl7CisJCWluaXQtPkhvc3RQaHlzTWVtUGFnZXMgPSBjcHVfdG9fbGUzMihBQUNfTUFYX0hPU1RQSFlTTUVNUEFHRVMpOworCX0KKworCisJLyoKKwkgKiBJbmNyZW1lbnQgdGhlIGJhc2UgYWRkcmVzcyBieSB0aGUgYW1vdW50IGFscmVhZHkgdXNlZAorCSAqLworCWJhc2UgPSBiYXNlICsgZmlic2l6ZSArIHNpemVvZihzdHJ1Y3QgYWFjX2luaXQpOworCXBoeXMgPSAoZG1hX2FkZHJfdCkoKHVsb25nKXBoeXMgKyBmaWJzaXplICsgc2l6ZW9mKHN0cnVjdCBhYWNfaW5pdCkpOworCS8qCisJICoJQWxpZ24gdGhlIGJlZ2lubmluZyBvZiBIZWFkZXJzIHRvIGNvbW1hbGlnbgorCSAqLworCWFsaWduID0gKGNvbW1hbGlnbiAtICgodW5zaWduZWQgbG9uZykoYmFzZSkgJiAoY29tbWFsaWduIC0gMSkpKTsKKwliYXNlID0gYmFzZSArIGFsaWduOworCXBoeXMgPSBwaHlzICsgYWxpZ247CisJLyoKKwkgKglGaWxsIGluIGFkZHJlc3NlcyBvZiB0aGUgQ29tbSBBcmVhIEhlYWRlcnMgYW5kIFF1ZXVlcworCSAqLworCSpjb21tYWRkciA9IGJhc2U7CisJaW5pdC0+Q29tbUhlYWRlckFkZHJlc3MgPSBjcHVfdG9fbGUzMigodTMyKXBoeXMpOworCS8qCisJICoJSW5jcmVtZW50IHRoZSBiYXNlIGFkZHJlc3MgYnkgdGhlIHNpemUgb2YgdGhlIENvbW1BcmVhCisJICovCisJYmFzZSA9IGJhc2UgKyBjb21tc2l6ZTsKKwlwaHlzID0gcGh5cyArIGNvbW1zaXplOworCS8qCisJICoJIFBsYWNlIHRoZSBQcmludGYgYnVmZmVyIGFyZWEgYWZ0ZXIgdGhlIEZhc3QgSS9PIGNvbW0gYXJlYS4KKwkgKi8KKwlkZXYtPnByaW50ZmJ1ZiA9ICh2b2lkICopYmFzZTsKKwlpbml0LT5wcmludGZidWYgPSBjcHVfdG9fbGUzMihwaHlzKTsKKwlpbml0LT5wcmludGZidWZzaXogPSBjcHVfdG9fbGUzMihwcmludGZidWZzaXopOworCW1lbXNldChiYXNlLCAwLCBwcmludGZidWZzaXopOworCXJldHVybiAxOworfQorICAgIAorc3RhdGljIHZvaWQgYWFjX3F1ZXVlX2luaXQoc3RydWN0IGFhY19kZXYgKiBkZXYsIHN0cnVjdCBhYWNfcXVldWUgKiBxLCB1MzIgKm1lbSwgaW50IHFzaXplKQoreworCXEtPm51bXBlbmRpbmcgPSAwOworCXEtPmRldiA9IGRldjsKKwlJTklUX0xJU1RfSEVBRCgmcS0+cGVuZGluZ3EpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnEtPmNtZHJlYWR5KTsKKwlJTklUX0xJU1RfSEVBRCgmcS0+Y21kcSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcS0+cWZ1bGwpOworCXNwaW5fbG9ja19pbml0KCZxLT5sb2NrZGF0YSk7CisJcS0+bG9jayA9ICZxLT5sb2NrZGF0YTsKKwlxLT5oZWFkZXJzLnByb2R1Y2VyID0gbWVtOworCXEtPmhlYWRlcnMuY29uc3VtZXIgPSBtZW0rMTsKKwkqKHEtPmhlYWRlcnMucHJvZHVjZXIpID0gY3B1X3RvX2xlMzIocXNpemUpOworCSoocS0+aGVhZGVycy5jb25zdW1lcikgPSBjcHVfdG9fbGUzMihxc2l6ZSk7CisJcS0+ZW50cmllcyA9IHFzaXplOworfQorCisvKioKKyAqCWFhY19zZW5kX3NodXRkb3duCQktCXNodXRkb3duIGFuIGFkYXB0ZXIKKyAqCUBkZXY6IEFkYXB0ZXIgdG8gc2h1dGRvd24KKyAqCisgKglUaGlzIHJvdXRpbmUgd2lsbCBzZW5kIGEgVk1fQ2xvc2VBbGwgKHNodXRkb3duKSByZXF1ZXN0IHRvIHRoZSBhZGFwdGVyLgorICovCisKK2ludCBhYWNfc2VuZF9zaHV0ZG93bihzdHJ1Y3QgYWFjX2RldiAqIGRldikKK3sKKwlzdHJ1Y3QgZmliICogZmliY3R4OworCXN0cnVjdCBhYWNfY2xvc2UgKmNtZDsKKwlpbnQgc3RhdHVzOworCisJZmliY3R4ID0gZmliX2FsbG9jKGRldik7CisJZmliX2luaXQoZmliY3R4KTsKKworCWNtZCA9IChzdHJ1Y3QgYWFjX2Nsb3NlICopIGZpYl9kYXRhKGZpYmN0eCk7CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUzMihWTV9DbG9zZUFsbCk7CisJY21kLT5jaWQgPSBjcHVfdG9fbGUzMigweGZmZmZmZmZmKTsKKworCXN0YXR1cyA9IGZpYl9zZW5kKENvbnRhaW5lckNvbW1hbmQsCisJCQkgIGZpYmN0eCwKKwkJCSAgc2l6ZW9mKHN0cnVjdCBhYWNfY2xvc2UpLAorCQkJICBGc2FOb3JtYWwsCisJCQkgIDEsIDEsCisJCQkgIE5VTEwsIE5VTEwpOworCisJaWYgKHN0YXR1cyA9PSAwKQorCQlmaWJfY29tcGxldGUoZmliY3R4KTsKKwlmaWJfZnJlZShmaWJjdHgpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICoJYWFjX2NvbW1faW5pdAktCUluaXRpYWxpc2UgRlNBIGRhdGEgc3RydWN0dXJlcworICoJQGRldjoJQWRhcHRlciB0byBpbml0aWFsaXNlCisgKgorICoJSW5pdGlhbGl6ZXMgdGhlIGRhdGEgc3RydWN0dXJlcyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgdGhlIEZTQSBjb21tdWljYXRpb24KKyAqCWludGVyZmFjZSB0byBvcGVyYXRlLiAKKyAqCVJldHVybnMKKyAqCQkxIC0gaWYgd2Ugd2VyZSBhYmxlIHRvIGluaXQgdGhlIGNvbW11aWNhdGlvbiBpbnRlcmZhY2UuCisgKgkJMCAtIElmIHRoZXJlIHdlcmUgZXJyb3JzIGluaXRpbmcuIFRoaXMgaXMgYSBmYXRhbCBlcnJvci4KKyAqLworIAoraW50IGFhY19jb21tX2luaXQoc3RydWN0IGFhY19kZXYgKiBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBoZHJzaXplID0gKHNpemVvZih1MzIpICogTlVNQkVSX09GX0NPTU1fUVVFVUVTKSAqIDI7CisJdW5zaWduZWQgbG9uZyBxdWV1ZXNpemUgPSBzaXplb2Yoc3RydWN0IGFhY19lbnRyeSkgKiBUT1RBTF9RVUVVRV9FTlRSSUVTOworCXUzMiAqaGVhZGVyczsKKwlzdHJ1Y3QgYWFjX2VudHJ5ICogcXVldWVzOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlzdHJ1Y3QgYWFjX3F1ZXVlX2Jsb2NrICogY29tbSA9IGRldi0+cXVldWVzOworCS8qCisJICoJTm93IGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSB6b25lIHN0cnVjdHVyZXMgdXNlZCBhcyBvdXIgCisJICoJcG9vbCBvZiBGSUIgY29udGV4dCByZWNvcmRzLiAgVGhlIHNpemUgb2YgdGhlIHpvbmUgaXMgYmFzZWQKKwkgKglvbiB0aGUgc3lzdGVtIG1lbW9yeSBzaXplLiAgV2UgYWxzbyBpbml0aWFsaXplIHRoZSBtdXRleCB1c2VkCisJICoJdG8gcHJvdGVjdCB0aGUgem9uZS4KKwkgKi8KKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5maWJfbG9jayk7CisKKwkvKgorCSAqCUFsbG9jYXRlIHRoZSBwaHlzaWNhbGx5IGNvbnRpZ291cyBzcGFjZSBmb3IgdGhlIGNvbW11aWNhdGlvbgorCSAqCXF1ZXVlIGhlYWRlcnMuIAorCSAqLworCisJc2l6ZSA9IGhkcnNpemUgKyBxdWV1ZXNpemU7CisKKwlpZiAoIWFhY19hbGxvY19jb21tKGRldiwgKHZvaWQgKiAqKSZoZWFkZXJzLCBzaXplLCBRVUVVRV9BTElHTk1FTlQpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXF1ZXVlcyA9IChzdHJ1Y3QgYWFjX2VudHJ5ICopKCgodWxvbmcpaGVhZGVycykgKyBoZHJzaXplKTsKKworCS8qIEFkYXB0ZXIgdG8gSG9zdCBub3JtYWwgcHJpb3JpdHkgQ29tbWFuZCBxdWV1ZSAqLyAKKwljb21tLT5xdWV1ZVtIb3N0Tm9ybUNtZFF1ZXVlXS5iYXNlID0gcXVldWVzOworCWFhY19xdWV1ZV9pbml0KGRldiwgJmNvbW0tPnF1ZXVlW0hvc3ROb3JtQ21kUXVldWVdLCBoZWFkZXJzLCBIT1NUX05PUk1fQ01EX0VOVFJJRVMpOworCXF1ZXVlcyArPSBIT1NUX05PUk1fQ01EX0VOVFJJRVM7CisJaGVhZGVycyArPSAyOworCisJLyogQWRhcHRlciB0byBIb3N0IGhpZ2ggcHJpb3JpdHkgY29tbWFuZCBxdWV1ZSAqLworCWNvbW0tPnF1ZXVlW0hvc3RIaWdoQ21kUXVldWVdLmJhc2UgPSBxdWV1ZXM7CisJYWFjX3F1ZXVlX2luaXQoZGV2LCAmY29tbS0+cXVldWVbSG9zdEhpZ2hDbWRRdWV1ZV0sIGhlYWRlcnMsIEhPU1RfSElHSF9DTURfRU5UUklFUyk7CisgICAgCisJcXVldWVzICs9IEhPU1RfSElHSF9DTURfRU5UUklFUzsKKwloZWFkZXJzICs9MjsKKworCS8qIEhvc3QgdG8gYWRhcHRlciBub3JtYWwgcHJpb3JpdHkgY29tbWFuZCBxdWV1ZSAqLworCWNvbW0tPnF1ZXVlW0FkYXBOb3JtQ21kUXVldWVdLmJhc2UgPSBxdWV1ZXM7CisJYWFjX3F1ZXVlX2luaXQoZGV2LCAmY29tbS0+cXVldWVbQWRhcE5vcm1DbWRRdWV1ZV0sIGhlYWRlcnMsIEFEQVBfTk9STV9DTURfRU5UUklFUyk7CisgICAgCisJcXVldWVzICs9IEFEQVBfTk9STV9DTURfRU5UUklFUzsKKwloZWFkZXJzICs9IDI7CisKKwkvKiBob3N0IHRvIGFkYXB0ZXIgaGlnaCBwcmlvcml0eSBjb21tYW5kIHF1ZXVlICovCisJY29tbS0+cXVldWVbQWRhcEhpZ2hDbWRRdWV1ZV0uYmFzZSA9IHF1ZXVlczsKKwlhYWNfcXVldWVfaW5pdChkZXYsICZjb21tLT5xdWV1ZVtBZGFwSGlnaENtZFF1ZXVlXSwgaGVhZGVycywgQURBUF9ISUdIX0NNRF9FTlRSSUVTKTsKKyAgICAKKwlxdWV1ZXMgKz0gQURBUF9ISUdIX0NNRF9FTlRSSUVTOworCWhlYWRlcnMgKz0gMjsKKworCS8qIGFkYXB0ZXIgdG8gaG9zdCBub3JtYWwgcHJpb3JpdHkgcmVzcG9uc2UgcXVldWUgKi8KKwljb21tLT5xdWV1ZVtIb3N0Tm9ybVJlc3BRdWV1ZV0uYmFzZSA9IHF1ZXVlczsKKwlhYWNfcXVldWVfaW5pdChkZXYsICZjb21tLT5xdWV1ZVtIb3N0Tm9ybVJlc3BRdWV1ZV0sIGhlYWRlcnMsIEhPU1RfTk9STV9SRVNQX0VOVFJJRVMpOworCXF1ZXVlcyArPSBIT1NUX05PUk1fUkVTUF9FTlRSSUVTOworCWhlYWRlcnMgKz0gMjsKKworCS8qIGFkYXB0ZXIgdG8gaG9zdCBoaWdoIHByaW9yaXR5IHJlc3BvbnNlIHF1ZXVlICovCisJY29tbS0+cXVldWVbSG9zdEhpZ2hSZXNwUXVldWVdLmJhc2UgPSBxdWV1ZXM7CisJYWFjX3F1ZXVlX2luaXQoZGV2LCAmY29tbS0+cXVldWVbSG9zdEhpZ2hSZXNwUXVldWVdLCBoZWFkZXJzLCBIT1NUX0hJR0hfUkVTUF9FTlRSSUVTKTsKKyAgIAorCXF1ZXVlcyArPSBIT1NUX0hJR0hfUkVTUF9FTlRSSUVTOworCWhlYWRlcnMgKz0gMjsKKworCS8qIGhvc3QgdG8gYWRhcHRlciBub3JtYWwgcHJpb3JpdHkgcmVzcG9uc2UgcXVldWUgKi8KKwljb21tLT5xdWV1ZVtBZGFwTm9ybVJlc3BRdWV1ZV0uYmFzZSA9IHF1ZXVlczsKKwlhYWNfcXVldWVfaW5pdChkZXYsICZjb21tLT5xdWV1ZVtBZGFwTm9ybVJlc3BRdWV1ZV0sIGhlYWRlcnMsIEFEQVBfTk9STV9SRVNQX0VOVFJJRVMpOworCisJcXVldWVzICs9IEFEQVBfTk9STV9SRVNQX0VOVFJJRVM7CisJaGVhZGVycyArPSAyOworCQorCS8qIGhvc3QgdG8gYWRhcHRlciBoaWdoIHByaW9yaXR5IHJlc3BvbnNlIHF1ZXVlICovIAorCWNvbW0tPnF1ZXVlW0FkYXBIaWdoUmVzcFF1ZXVlXS5iYXNlID0gcXVldWVzOworCWFhY19xdWV1ZV9pbml0KGRldiwgJmNvbW0tPnF1ZXVlW0FkYXBIaWdoUmVzcFF1ZXVlXSwgaGVhZGVycywgQURBUF9ISUdIX1JFU1BfRU5UUklFUyk7CisKKwljb21tLT5xdWV1ZVtBZGFwTm9ybUNtZFF1ZXVlXS5sb2NrID0gY29tbS0+cXVldWVbSG9zdE5vcm1SZXNwUXVldWVdLmxvY2s7CisJY29tbS0+cXVldWVbQWRhcEhpZ2hDbWRRdWV1ZV0ubG9jayA9IGNvbW0tPnF1ZXVlW0hvc3RIaWdoUmVzcFF1ZXVlXS5sb2NrOworCWNvbW0tPnF1ZXVlW0FkYXBOb3JtUmVzcFF1ZXVlXS5sb2NrID0gY29tbS0+cXVldWVbSG9zdE5vcm1DbWRRdWV1ZV0ubG9jazsKKwljb21tLT5xdWV1ZVtBZGFwSGlnaFJlc3BRdWV1ZV0ubG9jayA9IGNvbW0tPnF1ZXVlW0hvc3RIaWdoQ21kUXVldWVdLmxvY2s7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGFhY19kZXYgKmFhY19pbml0X2FkYXB0ZXIoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwkvKgorCSAqCU9rIG5vdyBpbml0IHRoZSBjb21tdW5pY2F0aW9uIHN1YnN5c3RlbQorCSAqLworCisJZGV2LT5xdWV1ZXMgPSAoc3RydWN0IGFhY19xdWV1ZV9ibG9jayAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWFjX3F1ZXVlX2Jsb2NrKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRldi0+cXVldWVzID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBjb3VsZCBub3QgYWxsb2NhdGUgY29tbSByZWdpb24uXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChkZXYtPnF1ZXVlcywgMCwgc2l6ZW9mKHN0cnVjdCBhYWNfcXVldWVfYmxvY2spKTsKKworCWlmIChhYWNfY29tbV9pbml0KGRldik8MCl7CisJCWtmcmVlKGRldi0+cXVldWVzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qCisJICoJSW5pdGlhbGl6ZSB0aGUgbGlzdCBvZiBmaWJzCisJICovCisJaWYoZmliX3NldHVwKGRldik8MCl7CisJCWtmcmVlKGRldi0+cXVldWVzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQkKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5maWJfbGlzdCk7CisJaW5pdF9jb21wbGV0aW9uKCZkZXYtPmFpZl9jb21wbGV0aW9uKTsKKworCXJldHVybiBkZXY7Cit9CisKKyAgICAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1zdXAuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1zdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjM2ZGJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbXN1cC5jCkBAIC0wLDAgKzEsOTM5IEBACisvKgorICoJQWRhcHRlYyBBQUMgc2VyaWVzIFJBSUQgY29udHJvbGxlciBkcml2ZXIKKyAqCShjKSBDb3B5cmlnaHQgMjAwMSBSZWQgSGF0IEluYy4JPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKiBiYXNlZCBvbiB0aGUgb2xkIGFhY3JhaWQgZHJpdmVyIHRoYXQgaXMuLgorICogQWRhcHRlYyBhYWNyYWlkIGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBBZGFwdGVjLCBJbmMuIChhYWNyYWlkQGFkYXB0ZWMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogTW9kdWxlIE5hbWU6CisgKiAgY29tbXN1cC5jCisgKgorICogQWJzdHJhY3Q6IENvbnRhaW4gYWxsIHJvdXRpbmVzIHRoYXQgYXJlIHJlcXVpcmVkIGZvciBGU0EgaG9zdC9hZGFwdGVyCisgKiAgICBjb21tdWljYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlICJhYWNyYWlkLmgiCisKKy8qKgorICoJZmliX21hcF9hbGxvYwkJLQlhbGxvY2F0ZSB0aGUgZmliIG9iamVjdHMKKyAqCUBkZXY6IEFkYXB0ZXIgdG8gYWxsb2NhdGUgZm9yCisgKgorICoJQWxsb2NhdGUgYW5kIG1hcCB0aGUgc2hhcmVkIFBDSSBzcGFjZSBmb3IgdGhlIEZJQiBibG9ja3MgdXNlZCB0bworICoJdGFsayB0byB0aGUgQWRhcHRlYyBmaXJtd2FyZS4KKyAqLworIAorc3RhdGljIGludCBmaWJfbWFwX2FsbG9jKHN0cnVjdCBhYWNfZGV2ICpkZXYpCit7CisJaWYoKGRldi0+aHdfZmliX3ZhID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBzaXplb2Yoc3RydWN0IGh3X2ZpYikgKiBBQUNfTlVNX0ZJQiwgJmRldi0+aHdfZmliX3BhKSk9PU5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCisvKioKKyAqCWZpYl9tYXBfZnJlZQkJLQlmcmVlIHRoZSBmaWIgb2JqZWN0cworICoJQGRldjogQWRhcHRlciB0byBmcmVlCisgKgorICoJRnJlZSB0aGUgUENJIG1hcHBpbmdzIGFuZCB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgRklCIGJsb2NrcworICoJb24gdGhpcyBhZGFwdGVyLgorICovCisKK3ZvaWQgZmliX21hcF9mcmVlKHN0cnVjdCBhYWNfZGV2ICpkZXYpCit7CisJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIHNpemVvZihzdHJ1Y3QgaHdfZmliKSAqIEFBQ19OVU1fRklCLCBkZXYtPmh3X2ZpYl92YSwgZGV2LT5od19maWJfcGEpOworfQorCisvKioKKyAqCWZpYl9zZXR1cAktCXNldHVwIHRoZSBmaWJzCisgKglAZGV2OiBBZGFwdGVyIHRvIHNldCB1cAorICoKKyAqCUFsbG9jYXRlIHRoZSBQQ0kgc3BhY2UgZm9yIHRoZSBmaWJzLCBtYXAgaXQgYW5kIHRoZW4gaW50aWFsaXNlIHRoZQorICoJZmliIGFyZWEsIHRoZSB1bm1hcHBlZCBmaWIgZGF0YSBhbmQgYWxzbyB0aGUgZnJlZSBsaXN0CisgKi8KKworaW50IGZpYl9zZXR1cChzdHJ1Y3QgYWFjX2RldiAqIGRldikKK3sKKwlzdHJ1Y3QgZmliICpmaWJwdHI7CisJc3RydWN0IGh3X2ZpYiAqaHdfZmliX3ZhOworCWRtYV9hZGRyX3QgaHdfZmliX3BhOworCWludCBpOworCQorCWlmKGZpYl9tYXBfYWxsb2MoZGV2KTwwKQorCQlyZXR1cm4gLUVOT01FTTsKKwkJCisJaHdfZmliX3ZhID0gZGV2LT5od19maWJfdmE7CisJaHdfZmliX3BhID0gZGV2LT5od19maWJfcGE7CisJbWVtc2V0KGh3X2ZpYl92YSwgMCwgc2l6ZW9mKHN0cnVjdCBod19maWIpICogQUFDX05VTV9GSUIpOworCS8qCisJICoJSW5pdGlhbGlzZSB0aGUgZmlicworCSAqLworCWZvciAoaSA9IDAsIGZpYnB0ciA9ICZkZXYtPmZpYnNbaV07IGkgPCBBQUNfTlVNX0ZJQjsgaSsrLCBmaWJwdHIrKykgCisJeworCQlmaWJwdHItPmRldiA9IGRldjsKKwkJZmlicHRyLT5od19maWIgPSBod19maWJfdmE7CisJCWZpYnB0ci0+ZGF0YSA9ICh2b2lkICopIGZpYnB0ci0+aHdfZmliLT5kYXRhOworCQlmaWJwdHItPm5leHQgPSBmaWJwdHIrMTsJLyogRm9yd2FyZCBjaGFpbiB0aGUgZmlicyAqLworCQlpbml0X01VVEVYX0xPQ0tFRCgmZmlicHRyLT5ldmVudF93YWl0KTsKKwkJc3Bpbl9sb2NrX2luaXQoJmZpYnB0ci0+ZXZlbnRfbG9jayk7CisJCWh3X2ZpYl92YS0+aGVhZGVyLlhmZXJTdGF0ZSA9IDB4ZmZmZmZmZmY7CisJCWh3X2ZpYl92YS0+aGVhZGVyLlNlbmRlclNpemUgPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGh3X2ZpYikpOworCQlmaWJwdHItPmh3X2ZpYl9wYSA9IGh3X2ZpYl9wYTsKKwkJaHdfZmliX3ZhID0gKHN0cnVjdCBod19maWIgKikoKHVuc2lnbmVkIGNoYXIgKilod19maWJfdmEgKyBzaXplb2Yoc3RydWN0IGh3X2ZpYikpOworCQlod19maWJfcGEgPSBod19maWJfcGEgKyBzaXplb2Yoc3RydWN0IGh3X2ZpYik7IAorCX0KKwkvKgorCSAqCUFkZCB0aGUgZmliIGNoYWluIHRvIHRoZSBmcmVlIGxpc3QKKwkgKi8KKwlkZXYtPmZpYnNbQUFDX05VTV9GSUItMV0ubmV4dCA9IE5VTEw7CisJLyoKKwkgKglFbmFibGUgdGhpcyB0byBkZWJ1ZyBvdXQgb2YgcXVldWUgc3BhY2UKKwkgKi8KKwlkZXYtPmZyZWVfZmliID0gJmRldi0+Zmlic1swXTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglmaWJfYWxsb2MJLQlhbGxvY2F0ZSBhIGZpYgorICoJQGRldjogQWRhcHRlciB0byBhbGxvY2F0ZSB0aGUgZmliIGZvcgorICoKKyAqCUFsbG9jYXRlIGEgZmliIGZyb20gdGhlIGFkYXB0ZXIgZmliIHBvb2wuIElmIHRoZSBwb29sIGlzIGVtcHR5IHdlCisgKgl3YWl0IGZvciBmaWJzIHRvIGJlY29tZSBmcmVlLgorICovCisgCitzdHJ1Y3QgZmliICogZmliX2FsbG9jKHN0cnVjdCBhYWNfZGV2ICpkZXYpCit7CisJc3RydWN0IGZpYiAqIGZpYnB0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmZpYl9sb2NrLCBmbGFncyk7CisJZmlicHRyID0gZGV2LT5mcmVlX2ZpYjsJCisJLyogQ2Fubm90IHNsZWVwIGhlcmUgb3IgeW91IGdldCBoYW5ncy4gSW5zdGVhZCB3ZSBkaWQgdGhlCisJICAgbWF0aHMgYXQgY29tcGlsZSB0aW1lLiAqLworCWlmKCFmaWJwdHIpCisJCUJVRygpOworCWRldi0+ZnJlZV9maWIgPSBmaWJwdHItPm5leHQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5maWJfbG9jaywgZmxhZ3MpOworCS8qCisJICoJU2V0IHRoZSBwcm9wZXIgbm9kZSB0eXBlIGNvZGUgYW5kIG5vZGUgYnl0ZSBzaXplCisJICovCisJZmlicHRyLT50eXBlID0gRlNBRlNfTlRDX0ZJQl9DT05URVhUOworCWZpYnB0ci0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgZmliKTsKKwkvKgorCSAqCU51bGwgb3V0IGZpZWxkcyB0aGF0IGRlcGVuZCBvbiBiZWluZyB6ZXJvIGF0IHRoZSBzdGFydCBvZgorCSAqCWVhY2ggSS9PCisJICovCisJZmlicHRyLT5od19maWItPmhlYWRlci5YZmVyU3RhdGUgPSAwOworCWZpYnB0ci0+Y2FsbGJhY2sgPSBOVUxMOworCWZpYnB0ci0+Y2FsbGJhY2tfZGF0YSA9IE5VTEw7CisKKwlyZXR1cm4gZmlicHRyOworfQorCisvKioKKyAqCWZpYl9mcmVlCS0JZnJlZSBhIGZpYgorICoJQGZpYnB0cjogZmliIHRvIGZyZWUgdXAKKyAqCisgKglGcmVlcyB1cCBhIGZpYiBhbmQgcGxhY2VzIGl0IG9uIHRoZSBhcHByb3ByaWF0ZSBxdWV1ZQorICoJKGVpdGhlciBmcmVlIG9yIHRpbWVkIG91dCkKKyAqLworIAordm9pZCBmaWJfZnJlZShzdHJ1Y3QgZmliICogZmlicHRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmlicHRyLT5kZXYtPmZpYl9sb2NrLCBmbGFncyk7CisJaWYgKGZpYnB0ci0+ZmxhZ3MgJiBGSUJfQ09OVEVYVF9GTEFHX1RJTUVEX09VVCkgeworCQlhYWNfY29uZmlnLmZpYl90aW1lb3V0cysrOworCQlmaWJwdHItPm5leHQgPSBmaWJwdHItPmRldi0+dGltZW91dF9maWI7CisJCWZpYnB0ci0+ZGV2LT50aW1lb3V0X2ZpYiA9IGZpYnB0cjsKKwl9IGVsc2UgeworCQlpZiAoZmlicHRyLT5od19maWItPmhlYWRlci5YZmVyU3RhdGUgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZmliX2ZyZWUsIFhmZXJTdGF0ZSAhPSAwLCBmaWJwdHIgPSAweCVwLCBYZmVyU3RhdGUgPSAweCV4XG4iLCAKKwkJCQkgKHZvaWQqKWZpYnB0ciwgCisJCQkJIGxlMzJfdG9fY3B1KGZpYnB0ci0+aHdfZmliLT5oZWFkZXIuWGZlclN0YXRlKSk7CisJCX0KKwkJZmlicHRyLT5uZXh0ID0gZmlicHRyLT5kZXYtPmZyZWVfZmliOworCQlmaWJwdHItPmRldi0+ZnJlZV9maWIgPSBmaWJwdHI7CisJfQkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaWJwdHItPmRldi0+ZmliX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKglmaWJfaW5pdAktCWluaXRpYWxpc2UgYSBmaWIKKyAqCUBmaWJwdHI6IFRoZSBmaWIgdG8gaW5pdGlhbGl6ZQorICoJCisgKglTZXQgdXAgdGhlIGdlbmVyaWMgZmliIGZpZWxkcyByZWFkeSBmb3IgdXNlCisgKi8KKyAKK3ZvaWQgZmliX2luaXQoc3RydWN0IGZpYiAqZmlicHRyKQoreworCXN0cnVjdCBod19maWIgKmh3X2ZpYiA9IGZpYnB0ci0+aHdfZmliOworCisJaHdfZmliLT5oZWFkZXIuU3RydWN0VHlwZSA9IEZJQl9NQUdJQzsKKwlod19maWItPmhlYWRlci5TaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBod19maWIpKTsKKyAgICAgICAgaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlID0gY3B1X3RvX2xlMzIoSG9zdE93bmVkIHwgRmliSW5pdGlhbGl6ZWQgfCBGaWJFbXB0eSB8IEZhc3RSZXNwb25zZUNhcGFibGUpOworCWh3X2ZpYi0+aGVhZGVyLlNlbmRlckZpYkFkZHJlc3MgPSBjcHVfdG9fbGUzMihmaWJwdHItPmh3X2ZpYl9wYSk7CisJaHdfZmliLT5oZWFkZXIuUmVjZWl2ZXJGaWJBZGRyZXNzID0gY3B1X3RvX2xlMzIoZmlicHRyLT5od19maWJfcGEpOworCWh3X2ZpYi0+aGVhZGVyLlNlbmRlclNpemUgPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGh3X2ZpYikpOworfQorCisvKioKKyAqCWZpYl9kZWFsbG9jYXRlCQktCWRlYWxsb2NhdGUgYSBmaWIKKyAqCUBmaWJwdHI6IGZpYiB0byBkZWFsbG9jYXRlCisgKgorICoJV2lsbCBkZWFsbG9jYXRlIGFuZCByZXR1cm4gdG8gdGhlIGZyZWUgcG9vbCB0aGUgRklCIHBvaW50ZWQgdG8gYnkgdGhlCisgKgljYWxsZXIuCisgKi8KKyAKK3ZvaWQgZmliX2RlYWxsb2Moc3RydWN0IGZpYiAqIGZpYnB0cikKK3sKKwlzdHJ1Y3QgaHdfZmliICpod19maWIgPSBmaWJwdHItPmh3X2ZpYjsKKwlpZihod19maWItPmhlYWRlci5TdHJ1Y3RUeXBlICE9IEZJQl9NQUdJQykgCisJCUJVRygpOworCWh3X2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSA9IDA7ICAgICAgICAKK30KKworLyoKKyAqCUNvbW11aWNhdGlvbiBwcmltaXRpdmVzIGRlZmluZSBhbmQgc3VwcG9ydCB0aGUgcXVldWluZyBtZXRob2Qgd2UgdXNlIHRvCisgKglzdXBwb3J0IGhvc3QgdG8gYWRhcHRlciBjb21tdWljYXRpb24uIEFsbCBxdWV1ZSBhY2Nlc3NlcyBoYXBwZW4gdGhyb3VnaAorICoJdGhlc2Ugcm91dGluZXMgYW5kIGFyZSB0aGUgb25seSByb3V0aW5lcyB3aGljaCBoYXZlIGEga25vd2xlZGdlIG9mIHRoZQorICoJIGhvdyB0aGVzZSBxdWV1ZXMgYXJlIGltcGxlbWVudGVkLgorICovCisgCisvKioKKyAqCWFhY19nZXRfZW50cnkJCS0JZ2V0IGEgcXVldWUgZW50cnkKKyAqCUBkZXY6IEFkYXB0ZXIKKyAqCUBxaWQ6IFF1ZXVlIE51bWJlcgorICoJQGVudHJ5OiBFbnRyeSByZXR1cm4KKyAqCUBpbmRleDogSW5kZXggcmV0dXJuCisgKglAbm9ub3RpZnk6IG5vdGlmaWNhdGlvbiBjb250cm9sCisgKgorICoJV2l0aCBhIHByaW9yaXR5IHRoZSByb3V0aW5lIHJldHVybnMgYSBxdWV1ZSBlbnRyeSBpZiB0aGUgcXVldWUgaGFzIGZyZWUgZW50cmllcy4gSWYgdGhlIHF1ZXVlCisgKglpcyBmdWxsKG5vIGZyZWUgZW50cmllcykgdGhhbiBubyBlbnRyeSBpcyByZXR1cm5lZCBhbmQgdGhlIGZ1bmN0aW9uIHJldHVybnMgMCBvdGhlcndpc2UgMSBpcworICoJcmV0dXJuZWQuCisgKi8KKyAKK3N0YXRpYyBpbnQgYWFjX2dldF9lbnRyeSAoc3RydWN0IGFhY19kZXYgKiBkZXYsIHUzMiBxaWQsIHN0cnVjdCBhYWNfZW50cnkgKiplbnRyeSwgdTMyICogaW5kZXgsIHVuc2lnbmVkIGxvbmcgKm5vbm90aWZ5KQoreworCXN0cnVjdCBhYWNfcXVldWUgKiBxOworCisJLyoKKwkgKglBbGwgb2YgdGhlIHF1ZXVlcyB3cmFwIHdoZW4gdGhleSByZWFjaCB0aGUgZW5kLCBzbyB3ZSBjaGVjaworCSAqCXRvIHNlZSBpZiB0aGV5IGhhdmUgcmVhY2hlZCB0aGUgZW5kIGFuZCBpZiB0aGV5IGhhdmUgd2UganVzdAorCSAqCXNldCB0aGUgaW5kZXggYmFjayB0byB6ZXJvLiBUaGlzIGlzIGEgd3JhcC4gWW91IGNvdWxkIG9yIG9mZgorCSAqCXRoZSBoaWdoIGJpdHMgaW4gYWxsIHVwZGF0ZXMgYnV0IHRoaXMgaXMgYSBiaXQgZmFzdGVyIEkgdGhpbmsuCisJICovCisKKwlxID0gJmRldi0+cXVldWVzLT5xdWV1ZVtxaWRdOworCQorCSppbmRleCA9IGxlMzJfdG9fY3B1KCoocS0+aGVhZGVycy5wcm9kdWNlcikpOworCWlmICgoKmluZGV4IC0gMikgPT0gbGUzMl90b19jcHUoKihxLT5oZWFkZXJzLmNvbnN1bWVyKSkpCisJCQkqbm9ub3RpZnkgPSAxOyAKKworCWlmIChxaWQgPT0gQWRhcEhpZ2hDbWRRdWV1ZSkgeworCSAgICAgICAgaWYgKCppbmRleCA+PSBBREFQX0hJR0hfQ01EX0VOVFJJRVMpCisgICAgICAgIAkJKmluZGV4ID0gMDsKKwl9IGVsc2UgaWYgKHFpZCA9PSBBZGFwTm9ybUNtZFF1ZXVlKSB7CisJICAgICAgICBpZiAoKmluZGV4ID49IEFEQVBfTk9STV9DTURfRU5UUklFUykgCisJCQkqaW5kZXggPSAwOyAvKiBXcmFwIHRvIGZyb250IG9mIHRoZSBQcm9kdWNlciBRdWV1ZS4gKi8KKwl9CisJZWxzZSBpZiAocWlkID09IEFkYXBIaWdoUmVzcFF1ZXVlKSAKKwl7CisJICAgICAgICBpZiAoKmluZGV4ID49IEFEQVBfSElHSF9SRVNQX0VOVFJJRVMpCisJCQkqaW5kZXggPSAwOworCX0KKwllbHNlIGlmIChxaWQgPT0gQWRhcE5vcm1SZXNwUXVldWUpIAorCXsKKwkJaWYgKCppbmRleCA+PSBBREFQX05PUk1fUkVTUF9FTlRSSUVTKSAKKwkJCSppbmRleCA9IDA7IC8qIFdyYXAgdG8gZnJvbnQgb2YgdGhlIFByb2R1Y2VyIFF1ZXVlLiAqLworCX0KKwllbHNlIHsKKwkJcHJpbnRrKCJhYWNyYWlkOiBpbnZhbGlkIHFpZFxuIik7CisJCUJVRygpOworCX0KKworICAgICAgICBpZiAoKCppbmRleCArIDEpID09IGxlMzJfdG9fY3B1KCoocS0+aGVhZGVycy5jb25zdW1lcikpKSB7IC8qIFF1ZXVlIGlzIGZ1bGwgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUXVldWUgJWQgZnVsbCwgJWQgb3V0c3RhbmRpbmcuXG4iLAorCQkJCXFpZCwgcS0+bnVtcGVuZGluZyk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJICAgICAgICAqZW50cnkgPSBxLT5iYXNlICsgKmluZGV4OworCQlyZXR1cm4gMTsKKwl9Cit9ICAgCisKKy8qKgorICoJYWFjX3F1ZXVlX2dldAkJLQlnZXQgdGhlIG5leHQgZnJlZSBRRQorICoJQGRldjogQWRhcHRlcgorICoJQGluZGV4OiBSZXR1cm5lZCBpbmRleAorICoJQHByaW9yaXR5OiBQcmlvcml0eSBvZiBmaWIKKyAqCUBmaWI6IEZpYiB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcXVldWUgZW50cnkKKyAqCUB3YWl0OiBXYWl0IGlmIHF1ZXVlIGZ1bGwKKyAqCUBmaWJwdHI6IERyaXZlciBmaWIgb2JqZWN0IHRvIGdvIHdpdGggZmliCisgKglAbm9ub3RpZnk6IERvbid0IG5vdGlmeSB0aGUgYWRhcHRlcgorICoKKyAqCUdldHMgdGhlIG5leHQgZnJlZSBRRSBvZmYgdGhlIHJlcXVlc3RlZCBwcmlvcnR5IGFkYXB0ZXIgY29tbWFuZAorICoJcXVldWUgYW5kIGFzc29jaWF0ZXMgdGhlIEZpYiB3aXRoIHRoZSBRRS4gVGhlIFFFIHJlcHJlc2VudGVkIGJ5CisgKglpbmRleCBpcyByZWFkeSB0byBpbnNlcnQgb24gdGhlIHF1ZXVlIHdoZW4gdGhpcyByb3V0aW5lIHJldHVybnMKKyAqCXN1Y2Nlc3MuCisgKi8KKworc3RhdGljIGludCBhYWNfcXVldWVfZ2V0KHN0cnVjdCBhYWNfZGV2ICogZGV2LCB1MzIgKiBpbmRleCwgdTMyIHFpZCwgc3RydWN0IGh3X2ZpYiAqIGh3X2ZpYiwgaW50IHdhaXQsIHN0cnVjdCBmaWIgKiBmaWJwdHIsIHVuc2lnbmVkIGxvbmcgKm5vbm90aWZ5KQoreworCXN0cnVjdCBhYWNfZW50cnkgKiBlbnRyeSA9IE5VTEw7CisJaW50IG1hcCA9IDA7CisJc3RydWN0IGFhY19xdWV1ZSAqIHEgPSAmZGV2LT5xdWV1ZXMtPnF1ZXVlW3FpZF07CisJCQorCXNwaW5fbG9ja19pcnFzYXZlKHEtPmxvY2ssIHEtPlNhdmVkSXJxbCk7CisJICAgIAorCWlmIChxaWQgPT0gQWRhcEhpZ2hDbWRRdWV1ZSB8fCBxaWQgPT0gQWRhcE5vcm1DbWRRdWV1ZSkgCisJeworCQkvKiAgaWYgbm8gZW50cmllcyB3YWl0IGZvciBzb21lIGlmIGNhbGxlciB3YW50cyB0byAqLworICAgICAgICAJd2hpbGUgKCFhYWNfZ2V0X2VudHJ5KGRldiwgcWlkLCAmZW50cnksIGluZGV4LCBub25vdGlmeSkpIAorICAgICAgICAJeworCQkJcHJpbnRrKEtFUk5fRVJSICJHZXRFbnRyaWVzIGZhaWxlZFxuIik7CisJCX0KKwkgICAgICAgIC8qCisJICAgICAgICAgKglTZXR1cCBxdWV1ZSBlbnRyeSB3aXRoIGEgY29tbWFuZCwgc3RhdHVzIGFuZCBmaWIgbWFwcGVkCisJICAgICAgICAgKi8KKwkgICAgICAgIGVudHJ5LT5zaXplID0gY3B1X3RvX2xlMzIobGUxNl90b19jcHUoaHdfZmliLT5oZWFkZXIuU2l6ZSkpOworCSAgICAgICAgbWFwID0gMTsKKwl9CisJZWxzZSBpZiAocWlkID09IEFkYXBIaWdoUmVzcFF1ZXVlIHx8IHFpZCA9PSBBZGFwTm9ybVJlc3BRdWV1ZSkKKwl7CisJICAgICAgICB3aGlsZSghYWFjX2dldF9lbnRyeShkZXYsIHFpZCwgJmVudHJ5LCBpbmRleCwgbm9ub3RpZnkpKSAKKwkgICAgICAgIHsKKwkJCS8qIGlmIG5vIGVudHJpZXMgd2FpdCBmb3Igc29tZSBpZiBjYWxsZXIgd2FudHMgdG8gKi8KKwkJfQorICAgICAgICAJLyoKKyAgICAgICAgCSAqCVNldHVwIHF1ZXVlIGVudHJ5IHdpdGggY29tbWFuZCwgc3RhdHVzIGFuZCBmaWIgbWFwcGVkCisgICAgICAgIAkgKi8KKyAgICAgICAgCWVudHJ5LT5zaXplID0gY3B1X3RvX2xlMzIobGUxNl90b19jcHUoaHdfZmliLT5oZWFkZXIuU2l6ZSkpOworICAgICAgICAJZW50cnktPmFkZHIgPSBod19maWItPmhlYWRlci5TZW5kZXJGaWJBZGRyZXNzOworICAgICAJCQkvKiBSZXN0b3JlIGFkYXB0ZXJzIHBvaW50ZXIgdG8gdGhlIEZJQiAqLworCQlod19maWItPmhlYWRlci5SZWNlaXZlckZpYkFkZHJlc3MgPSBod19maWItPmhlYWRlci5TZW5kZXJGaWJBZGRyZXNzOwkvKiBMZXQgdGhlIGFkYXB0ZXIgbm93IHdoZXJlIHRvIGZpbmQgaXRzIGRhdGEgKi8KKyAgICAgICAgCW1hcCA9IDA7CisJfQorCS8qCisJICoJSWYgTWFwRmliIGlzIHRydWUgdGhhbiB3ZSBuZWVkIHRvIG1hcCB0aGUgRmliIGFuZCBwdXQgcG9pbnRlcnMKKwkgKglpbiB0aGUgcXVldWUgZW50cnkuCisJICovCisJaWYgKG1hcCkKKwkJZW50cnktPmFkZHIgPSBjcHVfdG9fbGUzMihmaWJwdHItPmh3X2ZpYl9wYSk7CisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKglhYWNfaW5zZXJ0X2VudHJ5CS0JaW5zZXJ0IGEgcXVldWUgZW50cnkKKyAqCUBkZXY6IEFkYXB0ZXIKKyAqCUBpbmRleDogSW5kZXggb2YgZW50cnkgdG8gaW5zZXJ0CisgKglAcWlkOiBRdWV1ZSBudW1iZXIKKyAqCUBub25vdGlmeTogU3VwcHJlc3MgYWRhcHRlciBub3RpZmljYXRpb24KKyAqCisgKglHZXRzIHRoZSBuZXh0IGZyZWUgUUUgb2ZmIHRoZSByZXF1ZXN0ZWQgcHJpb3J0eSBhZGFwdGVyIGNvbW1hbmQKKyAqCXF1ZXVlIGFuZCBhc3NvY2lhdGVzIHRoZSBGaWIgd2l0aCB0aGUgUUUuIFRoZSBRRSByZXByZXNlbnRlZCBieQorICoJaW5kZXggaXMgcmVhZHkgdG8gaW5zZXJ0IG9uIHRoZSBxdWV1ZSB3aGVuIHRoaXMgcm91dGluZSByZXR1cm5zCisgKglzdWNjZXNzLgorICovCisgCitzdGF0aWMgaW50IGFhY19pbnNlcnRfZW50cnkoc3RydWN0IGFhY19kZXYgKiBkZXYsIHUzMiBpbmRleCwgdTMyIHFpZCwgdW5zaWduZWQgbG9uZyBub25vdGlmeSkgCit7CisJc3RydWN0IGFhY19xdWV1ZSAqIHEgPSAmZGV2LT5xdWV1ZXMtPnF1ZXVlW3FpZF07CisKKwlpZihxID09IE5VTEwpCisJCUJVRygpOworCSoocS0+aGVhZGVycy5wcm9kdWNlcikgPSBjcHVfdG9fbGUzMihpbmRleCArIDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+bG9jaywgcS0+U2F2ZWRJcnFsKTsKKworCWlmIChxaWQgPT0gQWRhcEhpZ2hDbWRRdWV1ZSB8fAorCSAgICBxaWQgPT0gQWRhcE5vcm1DbWRRdWV1ZSB8fAorCSAgICBxaWQgPT0gQWRhcEhpZ2hSZXNwUXVldWUgfHwKKwkgICAgcWlkID09IEFkYXBOb3JtUmVzcFF1ZXVlKQorCXsKKwkJaWYgKCFub25vdGlmeSkKKwkJCWFhY19hZGFwdGVyX25vdGlmeShkZXYsIHFpZCk7CisJfQorCWVsc2UKKwkJcHJpbnRrKCJTdXByaXNlIGluc2VydCFcbiIpOworCXJldHVybiAwOworfQorCisvKgorICoJRGVmaW5lIHRoZSBoaWdoZXN0IGxldmVsIG9mIGhvc3QgdG8gYWRhcHRlciBjb21tdW5pY2F0aW9uIHJvdXRpbmVzLiAKKyAqCVRoZXNlIHJvdXRpbmVzIHdpbGwgc3VwcG9ydCBob3N0IHRvIGFkYXB0ZXIgRlMgY29tbXVpY2F0aW9uLiBUaGVzZSAKKyAqCXJvdXRpbmVzIGhhdmUgbm8ga25vd2xlZGdlIG9mIHRoZSBjb21tdWljYXRpb24gbWV0aG9kIHVzZWQuIFRoaXMgbGV2ZWwKKyAqCXNlbmRzIGFuZCByZWNlaXZlcyBGSUJzLiBUaGlzIGxldmVsIGhhcyBubyBrbm93bGVkZ2Ugb2YgaG93IHRoZXNlIEZJQnMKKyAqCWdldCBwYXNzZWQgYmFjayBhbmQgZm9ydGguCisgKi8KKworLyoqCisgKglmaWJfc2VuZAktCXNlbmQgYSBmaWIgdG8gdGhlIGFkYXB0ZXIKKyAqCUBjb21tYW5kOiBDb21tYW5kIHRvIHNlbmQKKyAqCUBmaWJwdHI6IFRoZSBmaWIKKyAqCUBzaXplOiBTaXplIG9mIGZpYiBkYXRhIGFyZWEKKyAqCUBwcmlvcml0eTogUHJpb3JpdHkgb2YgRmliCisgKglAd2FpdDogQXN5bmMvc3luYyBzZWxlY3QKKyAqCUByZXBseTogVHJ1ZSBpZiBhIHJlcGx5IGlzIHdhbnRlZAorICoJQGNhbGxiYWNrOiBDYWxsZWQgd2l0aCByZXBseQorICoJQGNhbGxiYWNrX2RhdGE6IFBhc3NlZCB0byBjYWxsYmFjaworICoKKyAqCVNlbmRzIHRoZSByZXF1ZXN0ZWQgRklCIHRvIHRoZSBhZGFwdGVyIGFuZCBvcHRpb25hbGx5IHdpbGwgd2FpdCBmb3IgYQorICoJcmVzcG9uc2UgRklCLiBJZiB0aGUgY2FsbGVyIGRvZXMgbm90IHdpc2ggdG8gd2FpdCBmb3IgYSByZXNwb25zZSB0aGFuCisgKglhbiBldmVudCB0byB3YWl0IG9uIG11c3QgYmUgc3VwcGxpZWQuIFRoaXMgZXZlbnQgd2lsbCBiZSBzZXQgd2hlbiBhCisgKglyZXNwb25zZSBGSUIgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgYWRhcHRlci4KKyAqLworIAoraW50IGZpYl9zZW5kKHUxNiBjb21tYW5kLCBzdHJ1Y3QgZmliICogZmlicHRyLCB1bnNpZ25lZCBsb25nIHNpemUsICBpbnQgcHJpb3JpdHksIGludCB3YWl0LCBpbnQgcmVwbHksIGZpYl9jYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqIGNhbGxiYWNrX2RhdGEpCit7CisJdTMyIGluZGV4OworCXUzMiBxaWQ7CisJc3RydWN0IGFhY19kZXYgKiBkZXYgPSBmaWJwdHItPmRldjsKKwl1bnNpZ25lZCBsb25nIG5vaW50ciA9IDA7CisJc3RydWN0IGh3X2ZpYiAqIGh3X2ZpYiA9IGZpYnB0ci0+aHdfZmliOworCXN0cnVjdCBhYWNfcXVldWUgKiBxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWlmICghKGh3X2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSAmIGNwdV90b19sZTMyKEhvc3RPd25lZCkpKQorCQlyZXR1cm4gLUVCVVNZOworCS8qCisJICoJVGhlcmUgYXJlIDUgY2FzZXMgd2l0aCB0aGUgd2FpdCBhbmQgcmVwb25zZSByZXF1ZXN0ZWQgZmxhZ3MuIAorCSAqCVRoZSBvbmx5IGludmFsaWQgY2FzZXMgYXJlIGlmIHRoZSBjYWxsZXIgcmVxdWVzdHMgdG8gd2FpdCBhbmQKKwkgKglkb2VzIG5vdCByZXF1ZXN0IGEgcmVzcG9uc2UgYW5kIGlmIHRoZSBjYWxsZXIgZG9lcyBub3Qgd2FudCBhCisJICoJcmVzcG9uc2UgYW5kIHRoZSBGaWIgaXMgbm90IGFsbG9jYXRlZCBmcm9tIHBvb2wuIElmIGEgcmVzcG9uc2UKKwkgKglpcyBub3QgcmVxdWVzZWQgdGhlIEZpYiB3aWxsIGp1c3QgYmUgZGVhbGxvY2FlZCBieSB0aGUgRFBDCisJICoJcm91dGluZSB3aGVuIHRoZSByZXNwb25zZSBjb21lcyBiYWNrIGZyb20gdGhlIGFkYXB0ZXIuIE5vCisJICoJZnVydGhlciBwcm9jZXNzaW5nIHdpbGwgYmUgZG9uZSBiZXNpZGVzIGRlbGV0aW5nIHRoZSBGaWIuIFdlIAorCSAqCXdpbGwgaGF2ZSBhIGRlYnVnIG1vZGUgd2hlcmUgdGhlIGFkYXB0ZXIgY2FuIG5vdGlmeSB0aGUgaG9zdAorCSAqCWl0IGhhZCBhIHByb2JsZW0gYW5kIHRoZSBob3N0IGNhbiBsb2cgdGhhdCBmYWN0LgorCSAqLworCWlmICh3YWl0ICYmICFyZXBseSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKCF3YWl0ICYmIHJlcGx5KSB7CisJCWh3X2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSB8PSBjcHVfdG9fbGUzMihBc3luYyB8IFJlc3BvbnNlRXhwZWN0ZWQpOworCQlGSUJfQ09VTlRFUl9JTkNSRU1FTlQoYWFjX2NvbmZpZy5Bc3luY1NlbnQpOworCX0gZWxzZSBpZiAoIXdhaXQgJiYgIXJlcGx5KSB7CisJCWh3X2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSB8PSBjcHVfdG9fbGUzMihOb1Jlc3BvbnNlRXhwZWN0ZWQpOworCQlGSUJfQ09VTlRFUl9JTkNSRU1FTlQoYWFjX2NvbmZpZy5Ob1Jlc3BvbnNlU2VudCk7CisJfSBlbHNlIGlmICh3YWl0ICYmIHJlcGx5KSB7CisJCWh3X2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSB8PSBjcHVfdG9fbGUzMihSZXNwb25zZUV4cGVjdGVkKTsKKwkJRklCX0NPVU5URVJfSU5DUkVNRU5UKGFhY19jb25maWcuTm9ybWFsU2VudCk7CisJfSAKKwkvKgorCSAqCU1hcCB0aGUgZmliIGludG8gMzJiaXRzIGJ5IHVzaW5nIHRoZSBmaWIgbnVtYmVyCisJICovCisKKwlod19maWItPmhlYWRlci5TZW5kZXJGaWJBZGRyZXNzID0gY3B1X3RvX2xlMzIoKCh1MzIpKGZpYnB0ci1kZXYtPmZpYnMpKSA8PCAxKTsKKwlod19maWItPmhlYWRlci5TZW5kZXJEYXRhID0gKHUzMikoZmlicHRyIC0gZGV2LT5maWJzKTsKKwkvKgorCSAqCVNldCBGSUIgc3RhdGUgdG8gaW5kaWNhdGUgd2hlcmUgaXQgY2FtZSBmcm9tIGFuZCBpZiB3ZSB3YW50IGEKKwkgKglyZXNwb25zZSBmcm9tIHRoZSBhZGFwdGVyLiBBbHNvIGxvYWQgdGhlIGNvbW1hbmQgZnJvbSB0aGUKKwkgKgljYWxsZXIuCisJICoKKwkgKglNYXAgdGhlIGh3IGZpYiBwb2ludGVyIGFzIGEgMzJiaXQgdmFsdWUKKwkgKi8KKwlod19maWItPmhlYWRlci5Db21tYW5kID0gY3B1X3RvX2xlMTYoY29tbWFuZCk7CisJaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlIHw9IGNwdV90b19sZTMyKFNlbnRGcm9tSG9zdCk7CisJZmlicHRyLT5od19maWItPmhlYWRlci5GbGFncyA9IDA7CS8qIDAgdGhlIGZsYWdzIGZpZWxkIC0gaW50ZXJuYWwgb25seSovCisJLyoKKwkgKglTZXQgdGhlIHNpemUgb2YgdGhlIEZpYiB3ZSB3YW50IHRvIHNlbmQgdG8gdGhlIGFkYXB0ZXIKKwkgKi8KKwlod19maWItPmhlYWRlci5TaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKSArIHNpemUpOworCWlmIChsZTE2X3RvX2NwdShod19maWItPmhlYWRlci5TaXplKSA+IGxlMTZfdG9fY3B1KGh3X2ZpYi0+aGVhZGVyLlNlbmRlclNpemUpKSB7CisJCXJldHVybiAtRU1TR1NJWkU7CisJfSAgICAgICAgICAgICAgICAKKwkvKgorCSAqCUdldCBhIHF1ZXVlIGVudHJ5IGNvbm5lY3QgdGhlIEZJQiB0byBpdCBhbmQgc2VuZCBhbiBub3RpZnkKKwkgKgl0aGUgYWRhcHRlciBhIGNvbW1hbmQgaXMgcmVhZHkuCisJICovCisJaWYgKHByaW9yaXR5ID09IEZzYUhpZ2gpIHsKKwkJaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlIHw9IGNwdV90b19sZTMyKEhpZ2hQcmlvcml0eSk7CisJCXFpZCA9IEFkYXBIaWdoQ21kUXVldWU7CisJfSBlbHNlIHsKKwkJaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlIHw9IGNwdV90b19sZTMyKE5vcm1hbFByaW9yaXR5KTsKKwkJcWlkID0gQWRhcE5vcm1DbWRRdWV1ZTsKKwl9CisJcSA9ICZkZXYtPnF1ZXVlcy0+cXVldWVbcWlkXTsKKworCWlmKHdhaXQpCisJCXNwaW5fbG9ja19pcnFzYXZlKCZmaWJwdHItPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwlpZihhYWNfcXVldWVfZ2V0KCBkZXYsICZpbmRleCwgcWlkLCBod19maWIsIDEsIGZpYnB0ciwgJm5vaW50cik8MCkKKwkJcmV0dXJuIC1FV09VTERCTE9DSzsKKwlkcHJpbnRrKChLRVJOX0RFQlVHICJmaWJfc2VuZDogaW5zZXJ0aW5nIGEgcXVldWUgZW50cnkgYXQgaW5kZXggJWQuXG4iLGluZGV4KSk7CisJZHByaW50aygoS0VSTl9ERUJVRyAiRmliIGNvbnRlbnRzOi5cbiIpKTsKKwlkcHJpbnRrKChLRVJOX0RFQlVHICIgIENvbW1hbmQgPSAgICAgICAgICAgICAgICVkLlxuIiwgaHdfZmliLT5oZWFkZXIuQ29tbWFuZCkpOworCWRwcmludGsoKEtFUk5fREVCVUcgIiAgWGZlclN0YXRlICA9ICAgICAgICAgICAgJXguXG4iLCBod19maWItPmhlYWRlci5YZmVyU3RhdGUpKTsKKwlkcHJpbnRrKChLRVJOX0RFQlVHICIgIGh3X2ZpYiB2YSBiZWluZyBzZW50PSVwXG4iLGZpYnB0ci0+aHdfZmliKSk7CisJZHByaW50aygoS0VSTl9ERUJVRyAiICBod19maWIgcGEgYmVpbmcgc2VudD0lbHhcbiIsKHVsb25nKWZpYnB0ci0+aHdfZmliX3BhKSk7CisJZHByaW50aygoS0VSTl9ERUJVRyAiICBmaWIgYmVpbmcgc2VudD0lcFxuIixmaWJwdHIpKTsKKwkvKgorCSAqCUZpbGwgaW4gdGhlIENhbGxiYWNrIGFuZCBDYWxsYmFja0NvbnRleHQgaWYgd2UgYXJlIG5vdAorCSAqCWdvaW5nIHRvIHdhaXQuCisJICovCisJaWYgKCF3YWl0KSB7CisJCWZpYnB0ci0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKKwkJZmlicHRyLT5jYWxsYmFja19kYXRhID0gY2FsbGJhY2tfZGF0YTsKKwl9CisJRklCX0NPVU5URVJfSU5DUkVNRU5UKGFhY19jb25maWcuRmlic1NlbnQpOworCWxpc3RfYWRkX3RhaWwoJmZpYnB0ci0+cXVldWUsICZxLT5wZW5kaW5ncSk7CisJcS0+bnVtcGVuZGluZysrOworCisJZmlicHRyLT5kb25lID0gMDsKKwlmaWJwdHItPmZsYWdzID0gMDsKKworCWlmKGFhY19pbnNlcnRfZW50cnkoZGV2LCBpbmRleCwgcWlkLCAobm9pbnRyICYgYWFjX2NvbmZpZy5pcnFfbW9kKSkgPCAwKQorCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCS8qCisJICoJSWYgdGhlIGNhbGxlciB3YW50ZWQgdXMgdG8gd2FpdCBmb3IgcmVzcG9uc2Ugd2FpdCBub3cuIAorCSAqLworICAgIAorCWlmICh3YWl0KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpYnB0ci0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCQlkb3duKCZmaWJwdHItPmV2ZW50X3dhaXQpOworCQlpZihmaWJwdHItPmRvbmUgPT0gMCkKKwkJCUJVRygpOworCQkJCisJCWlmKChmaWJwdHItPmZsYWdzICYgRklCX0NPTlRFWFRfRkxBR19USU1FRF9PVVQpKXsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJLyoKKwkgKglJZiB0aGUgdXNlciBkb2VzIG5vdCB3YW50IGEgcmVzcG9uc2UgdGhhbiByZXR1cm4gc3VjY2VzcyBvdGhlcndpc2UKKwkgKglyZXR1cm4gcGVuZGluZworCSAqLworCWlmIChyZXBseSkKKwkJcmV0dXJuIC1FSU5QUk9HUkVTUzsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKiogCisgKglhYWNfY29uc3VtZXJfZ2V0CS0JZ2V0IHRoZSB0b3Agb2YgdGhlIHF1ZXVlCisgKglAZGV2OiBBZGFwdGVyCisgKglAcTogUXVldWUKKyAqCUBlbnRyeTogUmV0dXJuIGVudHJ5CisgKgorICoJV2lsbCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbnRyeSBvbiB0aGUgdG9wIG9mIHRoZSBxdWV1ZSByZXF1ZXN0ZWQgdGhhdAorICogCXdlIGFyZSBhIGNvbnN1bWVyIG9mLCBhbmQgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBxdWV1ZSBlbnRyeS4gSXQgZG9lcworICoJbm90IGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIHF1ZXVlLiAKKyAqLworCitpbnQgYWFjX2NvbnN1bWVyX2dldChzdHJ1Y3QgYWFjX2RldiAqIGRldiwgc3RydWN0IGFhY19xdWV1ZSAqIHEsIHN0cnVjdCBhYWNfZW50cnkgKiplbnRyeSkKK3sKKwl1MzIgaW5kZXg7CisJaW50IHN0YXR1czsKKwlpZiAobGUzMl90b19jcHUoKnEtPmhlYWRlcnMucHJvZHVjZXIpID09IGxlMzJfdG9fY3B1KCpxLT5oZWFkZXJzLmNvbnN1bWVyKSkgeworCQlzdGF0dXMgPSAwOworCX0gZWxzZSB7CisJCS8qCisJCSAqCVRoZSBjb25zdW1lciBpbmRleCBtdXN0IGJlIHdyYXBwZWQgaWYgd2UgaGF2ZSByZWFjaGVkCisJCSAqCXRoZSBlbmQgb2YgdGhlIHF1ZXVlLCBlbHNlIHdlIGp1c3QgdXNlIHRoZSBlbnRyeQorCQkgKglwb2ludGVkIHRvIGJ5IHRoZSBoZWFkZXIgaW5kZXgKKwkJICovCisJCWlmIChsZTMyX3RvX2NwdSgqcS0+aGVhZGVycy5jb25zdW1lcikgPj0gcS0+ZW50cmllcykgCisJCQlpbmRleCA9IDA7CQkKKwkJZWxzZQorCQkgICAgICAgIGluZGV4ID0gbGUzMl90b19jcHUoKnEtPmhlYWRlcnMuY29uc3VtZXIpOworCQkqZW50cnkgPSBxLT5iYXNlICsgaW5kZXg7CisJCXN0YXR1cyA9IDE7CisJfQorCXJldHVybihzdGF0dXMpOworfQorCisvKioKKyAqCWFhY19jb25zdW1lcl9mcmVlCS0JZnJlZSBjb25zdW1lciBlbnRyeQorICoJQGRldjogQWRhcHRlcgorICoJQHE6IFF1ZXVlCisgKglAcWlkOiBRdWV1ZSBpZGVudAorICoKKyAqCUZyZWVzIHVwIHRoZSBjdXJyZW50IHRvcCBvZiB0aGUgcXVldWUgd2UgYXJlIGEgY29uc3VtZXIgb2YuIElmIHRoZQorICoJcXVldWUgd2FzIGZ1bGwgbm90aWZ5IHRoZSBwcm9kdWNlciB0aGF0IHRoZSBxdWV1ZSBpcyBubyBsb25nZXIgZnVsbC4KKyAqLworCit2b2lkIGFhY19jb25zdW1lcl9mcmVlKHN0cnVjdCBhYWNfZGV2ICogZGV2LCBzdHJ1Y3QgYWFjX3F1ZXVlICpxLCB1MzIgcWlkKQoreworCWludCB3YXNmdWxsID0gMDsKKwl1MzIgbm90aWZ5OworCisJaWYgKChsZTMyX3RvX2NwdSgqcS0+aGVhZGVycy5wcm9kdWNlcikrMSkgPT0gbGUzMl90b19jcHUoKnEtPmhlYWRlcnMuY29uc3VtZXIpKQorCQl3YXNmdWxsID0gMTsKKyAgICAgICAgCisJaWYgKGxlMzJfdG9fY3B1KCpxLT5oZWFkZXJzLmNvbnN1bWVyKSA+PSBxLT5lbnRyaWVzKQorCQkqcS0+aGVhZGVycy5jb25zdW1lciA9IGNwdV90b19sZTMyKDEpOworCWVsc2UKKwkJKnEtPmhlYWRlcnMuY29uc3VtZXIgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdSgqcS0+aGVhZGVycy5jb25zdW1lcikrMSk7CisgICAgICAgIAorCWlmICh3YXNmdWxsKSB7CisJCXN3aXRjaCAocWlkKSB7CisKKwkJY2FzZSBIb3N0Tm9ybUNtZFF1ZXVlOgorCQkJbm90aWZ5ID0gSG9zdE5vcm1DbWROb3RGdWxsOworCQkJYnJlYWs7CisJCWNhc2UgSG9zdEhpZ2hDbWRRdWV1ZToKKwkJCW5vdGlmeSA9IEhvc3RIaWdoQ21kTm90RnVsbDsKKwkJCWJyZWFrOworCQljYXNlIEhvc3ROb3JtUmVzcFF1ZXVlOgorCQkJbm90aWZ5ID0gSG9zdE5vcm1SZXNwTm90RnVsbDsKKwkJCWJyZWFrOworCQljYXNlIEhvc3RIaWdoUmVzcFF1ZXVlOgorCQkJbm90aWZ5ID0gSG9zdEhpZ2hSZXNwTm90RnVsbDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCQlyZXR1cm47CisJCX0KKwkJYWFjX2FkYXB0ZXJfbm90aWZ5KGRldiwgbm90aWZ5KTsKKwl9Cit9ICAgICAgICAKKworLyoqCisgKglmaWJfYWRhcHRlcl9jb21wbGV0ZQktCWNvbXBsZXRlIGFkYXB0ZXIgaXNzdWVkIGZpYgorICoJQGZpYnB0cjogZmliIHRvIGNvbXBsZXRlCisgKglAc2l6ZTogc2l6ZSBvZiBmaWIKKyAqCisgKglXaWxsIGRvIGFsbCBuZWNlc3Nhcnkgd29yayB0byBjb21wbGV0ZSBhIEZJQiB0aGF0IHdhcyBzZW50IGZyb20KKyAqCXRoZSBhZGFwdGVyLgorICovCisKK2ludCBmaWJfYWRhcHRlcl9jb21wbGV0ZShzdHJ1Y3QgZmliICogZmlicHRyLCB1bnNpZ25lZCBzaG9ydCBzaXplKQoreworCXN0cnVjdCBod19maWIgKiBod19maWIgPSBmaWJwdHItPmh3X2ZpYjsKKwlzdHJ1Y3QgYWFjX2RldiAqIGRldiA9IGZpYnB0ci0+ZGV2OworCXVuc2lnbmVkIGxvbmcgbm9pbnRyID0gMDsKKwlpZiAoaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlID09IDApCisgICAgICAgIAlyZXR1cm4gMDsKKwkvKgorCSAqCUlmIHdlIHBsYW4gdG8gZG8gYW55dGhpbmcgY2hlY2sgdGhlIHN0cnVjdHVyZSB0eXBlIGZpcnN0LgorCSAqLyAKKwlpZiAoIGh3X2ZpYi0+aGVhZGVyLlN0cnVjdFR5cGUgIT0gRklCX01BR0lDICkgeworICAgICAgICAJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qCisJICoJVGhpcyBibG9jayBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHRoZSBhZGFwdGVyIGhhZCBzZW50IHVzIGEKKwkgKgljb21tYW5kIGFuZCB3ZSBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcgdGhlIGNvbW1hbmQuIFdlCisJICoJY2FsbCBjb21wbGV0ZUZpYiB3aGVuIHdlIGFyZSBkb25lIHByb2Nlc3NpbmcgdGhlIGNvbW1hbmQgCisJICoJYW5kIHdhbnQgdG8gc2VuZCBhIHJlc3BvbnNlIGJhY2sgdG8gdGhlIGFkYXB0ZXIuIFRoaXMgd2lsbCAKKwkgKglzZW5kIHRoZSBjb21wbGV0ZWQgY2RiIHRvIHRoZSBhZGFwdGVyLgorCSAqLworCWlmIChod19maWItPmhlYWRlci5YZmVyU3RhdGUgJiBjcHVfdG9fbGUzMihTZW50RnJvbUFkYXB0ZXIpKSB7CisJICAgICAgICBod19maWItPmhlYWRlci5YZmVyU3RhdGUgfD0gY3B1X3RvX2xlMzIoSG9zdFByb2Nlc3NlZCk7CisJICAgICAgICBpZiAoaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlICYgY3B1X3RvX2xlMzIoSGlnaFByaW9yaXR5KSkgeworICAgICAgICAJCXUzMiBpbmRleDsKKyAgICAgICAJCQlpZiAoc2l6ZSkgCisJCQl7CisJCQkJc2l6ZSArPSBzaXplb2Yoc3RydWN0IGFhY19maWJoZHIpOworCQkJCWlmIChzaXplID4gbGUxNl90b19jcHUoaHdfZmliLT5oZWFkZXIuU2VuZGVyU2l6ZSkpCisJCQkJCXJldHVybiAtRU1TR1NJWkU7CisJCQkJaHdfZmliLT5oZWFkZXIuU2l6ZSA9IGNwdV90b19sZTE2KHNpemUpOworCQkJfQorCQkJaWYoYWFjX3F1ZXVlX2dldChkZXYsICZpbmRleCwgQWRhcEhpZ2hSZXNwUXVldWUsIGh3X2ZpYiwgMSwgTlVMTCwgJm5vaW50cikgPCAwKSB7CisJCQkJcmV0dXJuIC1FV09VTERCTE9DSzsKKwkJCX0KKwkJCWlmIChhYWNfaW5zZXJ0X2VudHJ5KGRldiwgaW5kZXgsIEFkYXBIaWdoUmVzcFF1ZXVlLCAgKG5vaW50ciAmIChpbnQpYWFjX2NvbmZpZy5pcnFfbW9kKSkgIT0gMCkgeworCQkJfQorCQl9CisJCWVsc2UgaWYgKGh3X2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSAmIE5vcm1hbFByaW9yaXR5KSAKKwkJeworCQkJdTMyIGluZGV4OworCisJCQlpZiAoc2l6ZSkgeworCQkJCXNpemUgKz0gc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKTsKKwkJCQlpZiAoc2l6ZSA+IGxlMTZfdG9fY3B1KGh3X2ZpYi0+aGVhZGVyLlNlbmRlclNpemUpKSAKKwkJCQkJcmV0dXJuIC1FTVNHU0laRTsKKwkJCQlod19maWItPmhlYWRlci5TaXplID0gY3B1X3RvX2xlMTYoc2l6ZSk7CisJCQl9CisJCQlpZiAoYWFjX3F1ZXVlX2dldChkZXYsICZpbmRleCwgQWRhcE5vcm1SZXNwUXVldWUsIGh3X2ZpYiwgMSwgTlVMTCwgJm5vaW50cikgPCAwKSAKKwkJCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCQkJaWYgKGFhY19pbnNlcnRfZW50cnkoZGV2LCBpbmRleCwgQWRhcE5vcm1SZXNwUXVldWUsIChub2ludHIgJiAoaW50KWFhY19jb25maWcuaXJxX21vZCkpICE9IDApIAorCQkJeworCQkJfQorCQl9CisJfQorCWVsc2UgCisJeworICAgICAgICAJcHJpbnRrKEtFUk5fV0FSTklORyAiZmliX2FkYXB0ZXJfY29tcGxldGU6IFVua25vd24geGZlcnN0YXRlIGRldGVjdGVkLlxuIik7CisgICAgICAgIAlCVUcoKTsKKwl9ICAgCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJZmliX2NvbXBsZXRlCS0JZmliIGNvbXBsZXRpb24gaGFuZGxlcgorICoJQGZpYjogRklCIHRvIGNvbXBsZXRlCisgKgorICoJV2lsbCBkbyBhbGwgbmVjZXNzYXJ5IHdvcmsgdG8gY29tcGxldGUgYSBGSUIuCisgKi8KKyAKK2ludCBmaWJfY29tcGxldGUoc3RydWN0IGZpYiAqIGZpYnB0cikKK3sKKwlzdHJ1Y3QgaHdfZmliICogaHdfZmliID0gZmlicHRyLT5od19maWI7CisKKwkvKgorCSAqCUNoZWNrIGZvciBhIGZpYiB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGNvbXBsZXRlZAorCSAqLworCisJaWYgKGh3X2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSA9PSAwKQorICAgICAgICAJcmV0dXJuIDA7CisJLyoKKwkgKglJZiB3ZSBwbGFuIHRvIGRvIGFueXRoaW5nIGNoZWNrIHRoZSBzdHJ1Y3R1cmUgdHlwZSBmaXJzdC4KKwkgKi8gCisKKwlpZiAoaHdfZmliLT5oZWFkZXIuU3RydWN0VHlwZSAhPSBGSUJfTUFHSUMpCisJICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkvKgorCSAqCVRoaXMgYmxvY2sgY29tcGxldGVzIGEgY2RiIHdoaWNoIG9yZ2luYXRlZCBvbiB0aGUgaG9zdCBhbmQgd2UgCisJICoJanVzdCBuZWVkIHRvIGRlYWxsb2NhdGUgdGhlIGNkYiBvciByZWluaXQgaXQuIEF0IHRoaXMgcG9pbnQgdGhlCisJICoJY29tbWFuZCBpcyBjb21wbGV0ZSB0aGF0IHdlIGhhZCBzZW50IHRvIHRoZSBhZGFwdGVyIGFuZCB0aGlzCisJICoJY2RiIGNvdWxkIGJlIHJldXNlZC4KKwkgKi8KKwlpZigoaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlICYgY3B1X3RvX2xlMzIoU2VudEZyb21Ib3N0KSkgJiYKKwkJKGh3X2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSAmIGNwdV90b19sZTMyKEFkYXB0ZXJQcm9jZXNzZWQpKSkKKwl7CisJCWZpYl9kZWFsbG9jKGZpYnB0cik7CisJfQorCWVsc2UgaWYoaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlICYgY3B1X3RvX2xlMzIoU2VudEZyb21Ib3N0KSkKKwl7CisJCS8qCisJCSAqCVRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVuIHRoZSBob3N0IGhhcyBhYm9ydGVkIHRoZSBJL08KKwkJICoJdG8gdGhlIGFkYXB0ZXIgYmVjYXVzZSB0aGUgYWRhcHRlciBpcyBub3QgcmVzcG9uZGluZworCQkgKi8KKwkJZmliX2RlYWxsb2MoZmlicHRyKTsKKwl9IGVsc2UgaWYoaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlICYgY3B1X3RvX2xlMzIoSG9zdE93bmVkKSkgeworCQlmaWJfZGVhbGxvYyhmaWJwdHIpOworCX0gZWxzZSB7CisJCUJVRygpOworCX0gICAKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhYWNfcHJpbnRmCS0JaGFuZGxlIHByaW50ZiBmcm9tIGZpcm13YXJlCisgKglAZGV2OiBBZGFwdGVyCisgKglAdmFsOiBNZXNzYWdlIGluZm8KKyAqCisgKglQcmludCBhIG1lc3NhZ2UgcGFzc2VkIHRvIHVzIGJ5IHRoZSBjb250cm9sbGVyIGZpcm13YXJlIG9uIHRoZQorICoJQWRhcHRlYyBib2FyZAorICovCisKK3ZvaWQgYWFjX3ByaW50ZihzdHJ1Y3QgYWFjX2RldiAqZGV2LCB1MzIgdmFsKQoreworCWludCBsZW5ndGggPSB2YWwgJiAweGZmZmY7CisJaW50IGxldmVsID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJY2hhciAqY3AgPSBkZXYtPnByaW50ZmJ1ZjsKKwkKKwkvKgorCSAqCVRoZSBzaXplIG9mIHRoZSBwcmludGZidWYgaXMgc2V0IGluIHBvcnQuYworCSAqCVRoZXJlIGlzIG5vIHZhcmlhYmxlIG9yIGRlZmluZSBmb3IgaXQKKwkgKi8KKwlpZiAobGVuZ3RoID4gMjU1KQorCQlsZW5ndGggPSAyNTU7CisJaWYgKGNwW2xlbmd0aF0gIT0gMCkKKwkJY3BbbGVuZ3RoXSA9IDA7CisJaWYgKGxldmVsID09IExPR19BQUNfSElHSF9FUlJPUikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjcmFpZDolcyIsIGNwKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gImFhY3JhaWQ6JXMiLCBjcCk7CisJbWVtc2V0KGNwLCAwLCAgMjU2KTsKK30KKworLyoqCisgKglhYWNfY29tbWFuZF90aHJlYWQJLQljb21tYW5kIHByb2Nlc3NpbmcgdGhyZWFkCisgKglAZGV2OiBBZGFwdGVyIHRvIG1vbml0b3IKKyAqCisgKglXYWl0cyBvbiB0aGUgY29tbWFuZHJlYWR5IGV2ZW50IGluIGl0J3MgcXVldWUuIFdoZW4gdGhlIGV2ZW50IGdldHMgc2V0CisgKglpdCB3aWxsIHB1bGwgRklCcyBvZmYgaXQncyBxdWV1ZS4gSXQgd2lsbCBjb250aW51ZSB0byBwdWxsIEZJQnMgb2ZmCisgKgl1bnRpbCB0aGUgcXVldWUgaXMgZW1wdHkuIFdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5IGl0IHdpbGwgd2FpdCBmb3IKKyAqCW1vcmUgRklCcy4KKyAqLworIAoraW50IGFhY19jb21tYW5kX3RocmVhZChzdHJ1Y3QgYWFjX2RldiAqIGRldikKK3sKKwlzdHJ1Y3QgaHdfZmliICpod19maWIsICpod19uZXdmaWI7CisJc3RydWN0IGZpYiAqZmliLCAqbmV3ZmliOworCXN0cnVjdCBhYWNfcXVldWVfYmxvY2sgKnF1ZXVlcyA9IGRldi0+cXVldWVzOworCXN0cnVjdCBhYWNfZmliX2NvbnRleHQgKmZpYmN0eDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJLyoKKwkgKglXZSBjYW4gb25seSBoYXZlIG9uZSB0aHJlYWQgcGVyIGFkYXB0ZXIgZm9yIEFJRidzLgorCSAqLworCWlmIChkZXYtPmFpZl90aHJlYWQpCisJCXJldHVybiAtRUlOVkFMOworCS8qCisJICoJU2V0IHVwIHRoZSBuYW1lIHRoYXQgd2lsbCBhcHBlYXIgaW4gJ3BzJworCSAqCXN0b3JlZCBpbiAgdGFza19zdHJ1Y3QuY29tbVsxNl0uCisJICovCisJZGFlbW9uaXplKCJhYWNyYWlkIik7CisJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOworCS8qCisJICoJTGV0IHRoZSBEUEMga25vdyBpdCBoYXMgYSBwbGFjZSB0byBzZW5kIHRoZSBBSUYncyB0by4KKwkgKi8KKwlkZXYtPmFpZl90aHJlYWQgPSAxOworCWFkZF93YWl0X3F1ZXVlKCZxdWV1ZXMtPnF1ZXVlW0hvc3ROb3JtQ21kUXVldWVdLmNtZHJlYWR5LCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwl3aGlsZSgxKSAKKwl7CisJCXNwaW5fbG9ja19pcnFzYXZlKHF1ZXVlcy0+cXVldWVbSG9zdE5vcm1DbWRRdWV1ZV0ubG9jaywgZmxhZ3MpOworCQl3aGlsZSghbGlzdF9lbXB0eSgmKHF1ZXVlcy0+cXVldWVbSG9zdE5vcm1DbWRRdWV1ZV0uY21kcSkpKSB7CisJCQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwkJCXN0cnVjdCBhYWNfYWlmY21kICogYWlmY21kOworCisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkKKwkJCWVudHJ5ID0gcXVldWVzLT5xdWV1ZVtIb3N0Tm9ybUNtZFF1ZXVlXS5jbWRxLm5leHQ7CisJCQlsaXN0X2RlbChlbnRyeSk7CisJCQkKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocXVldWVzLT5xdWV1ZVtIb3N0Tm9ybUNtZFF1ZXVlXS5sb2NrLCBmbGFncyk7CisJCQlmaWIgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZmliLCBmaWJsaW5rKTsKKwkJCS8qCisJCQkgKglXZSB3aWxsIHByb2Nlc3MgdGhlIEZJQiBoZXJlIG9yIHBhc3MgaXQgdG8gYSAKKwkJCSAqCXdvcmtlciB0aHJlYWQgdGhhdCBpcyBUQkQuIFdlIFJlYWxseSBjYW4ndCAKKwkJCSAqCWRvIGFueXRoaW5nIGF0IHRoaXMgcG9pbnQgc2luY2Ugd2UgZG9uJ3QgaGF2ZQorCQkJICoJYW55dGhpbmcgZGVmaW5lZCBmb3IgdGhpcyB0aHJlYWQgdG8gZG8uCisJCQkgKi8KKwkJCWh3X2ZpYiA9IGZpYi0+aHdfZmliOworCQkJbWVtc2V0KGZpYiwgMCwgc2l6ZW9mKHN0cnVjdCBmaWIpKTsKKwkJCWZpYi0+dHlwZSA9IEZTQUZTX05UQ19GSUJfQ09OVEVYVDsKKwkJCWZpYi0+c2l6ZSA9IHNpemVvZiggc3RydWN0IGZpYiApOworCQkJZmliLT5od19maWIgPSBod19maWI7CisJCQlmaWItPmRhdGEgPSBod19maWItPmRhdGE7CisJCQlmaWItPmRldiA9IGRldjsKKwkJCS8qCisJCQkgKglXZSBvbmx5IGhhbmRsZSBBaWZSZXF1ZXN0IGZpYnMgZnJvbSB0aGUgYWRhcHRlci4KKwkJCSAqLworCQkJYWlmY21kID0gKHN0cnVjdCBhYWNfYWlmY21kICopIGh3X2ZpYi0+ZGF0YTsKKwkJCWlmIChhaWZjbWQtPmNvbW1hbmQgPT0gY3B1X3RvX2xlMzIoQWlmQ21kRHJpdmVyTm90aWZ5KSkgeworCQkJCS8qIEhhbmRsZSBEcml2ZXIgTm90aWZ5IEV2ZW50cyAqLworCQkJCSoodTMyICopaHdfZmliLT5kYXRhID0gY3B1X3RvX2xlMzIoU1RfT0spOworCQkJCWZpYl9hZGFwdGVyX2NvbXBsZXRlKGZpYiwgc2l6ZW9mKHUzMikpOworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwkJCQkvKiBUaGUgdTMyIGhlcmUgaXMgaW1wb3J0YW50IGFuZCBpbnRlbmRlZC4gV2UgYXJlIHVzaW5nCisJCQkJICAgMzJiaXQgd3JhcHBpbmcgdGltZSB0byBmaXQgdGhlIGFkYXB0ZXIgZmllbGQgKi8KKwkJCQkgICAKKwkJCQl1MzIgdGltZV9ub3csIHRpbWVfbGFzdDsKKwkJCQl1bnNpZ25lZCBsb25nIGZsYWd2OworCQkJCQorCQkJCXRpbWVfbm93ID0gamlmZmllcy9IWjsKKworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmZpYl9sb2NrLCBmbGFndik7CisJCQkJZW50cnkgPSBkZXYtPmZpYl9saXN0Lm5leHQ7CisJCQkJLyoKKwkJCQkgKiBGb3IgZWFjaCBDb250ZXh0IHRoYXQgaXMgb24gdGhlIAorCQkJCSAqIGZpYmN0eExpc3QsIG1ha2UgYSBjb3B5IG9mIHRoZQorCQkJCSAqIGZpYiwgYW5kIHRoZW4gc2V0IHRoZSBldmVudCB0byB3YWtlIHVwIHRoZQorCQkJCSAqIHRocmVhZCB0aGF0IGlzIHdhaXRpbmcgZm9yIGl0LgorCQkJCSAqLworCQkJCXdoaWxlIChlbnRyeSAhPSAmZGV2LT5maWJfbGlzdCkgeworCQkJCQkvKgorCQkJCQkgKiBFeHRyYWN0IHRoZSBmaWJjdHgKKwkJCQkJICovCisJCQkJCWZpYmN0eCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBhYWNfZmliX2NvbnRleHQsIG5leHQpOworCQkJCQkvKgorCQkJCQkgKiBDaGVjayBpZiB0aGUgcXVldWUgaXMgZ2V0dGluZworCQkJCQkgKiBiYWNrbG9nZ2VkCisJCQkJCSAqLworCQkJCQlpZiAoZmliY3R4LT5jb3VudCA+IDIwKQorCQkJCQl7CisJCQkJCQkvKgorCQkJCQkJICogSXQncyAqbm90KiBqaWZmaWVzIGZvbGtzLAorCQkJCQkJICogYnV0IGppZmZpZXMgLyBIWiBzbyBkbyBub3QKKwkJCQkJCSAqIHBhbmljIC4uLgorCQkJCQkJICovCisJCQkJCQl0aW1lX2xhc3QgPSBmaWJjdHgtPmppZmZpZXM7CisJCQkJCQkvKgorCQkJCQkJICogSGFzIGl0IGJlZW4gPiAyIG1pbnV0ZXMgCisJCQkJCQkgKiBzaW5jZSB0aGUgbGFzdCByZWFkIG9mZgorCQkJCQkJICogdGhlIHF1ZXVlPworCQkJCQkJICovCisJCQkJCQlpZiAoKHRpbWVfbm93IC0gdGltZV9sYXN0KSA+IDEyMCkgeworCQkJCQkJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCQkJCQkJYWFjX2Nsb3NlX2ZpYl9jb250ZXh0KGRldiwgZmliY3R4KTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvKgorCQkJCQkgKiBXYXJuaW5nOiBubyBzbGVlcCBhbGxvd2VkIHdoaWxlCisJCQkJCSAqIGhvbGRpbmcgc3BpbmxvY2sKKwkJCQkJICovCisJCQkJCWh3X25ld2ZpYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBod19maWIpLCBHRlBfQVRPTUlDKTsKKwkJCQkJbmV3ZmliID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZpYiksIEdGUF9BVE9NSUMpOworCQkJCQlpZiAobmV3ZmliICYmIGh3X25ld2ZpYikgeworCQkJCQkJLyoKKwkJCQkJCSAqIE1ha2UgdGhlIGNvcHkgb2YgdGhlIEZJQgorCQkJCQkJICovCisJCQkJCQltZW1jcHkoaHdfbmV3ZmliLCBod19maWIsIHNpemVvZihzdHJ1Y3QgaHdfZmliKSk7CisJCQkJCQltZW1jcHkobmV3ZmliLCBmaWIsIHNpemVvZihzdHJ1Y3QgZmliKSk7CisJCQkJCQluZXdmaWItPmh3X2ZpYiA9IGh3X25ld2ZpYjsKKwkJCQkJCS8qCisJCQkJCQkgKiBQdXQgdGhlIEZJQiBvbnRvIHRoZQorCQkJCQkJICogZmliY3R4J3MgZmlicworCQkJCQkJICovCisJCQkJCQlsaXN0X2FkZF90YWlsKCZuZXdmaWItPmZpYmxpbmssICZmaWJjdHgtPmZpYl9saXN0KTsKKwkJCQkJCWZpYmN0eC0+Y291bnQrKzsKKwkJCQkJCS8qIAorCQkJCQkJICogU2V0IHRoZSBldmVudCB0byB3YWtlIHVwIHRoZQorCQkJCQkJICogdGhyZWFkIHRoYXQgd2lsbCB3YWl0aW5nLgorCQkJCQkJICovCisJCQkJCQl1cCgmZmliY3R4LT53YWl0X3NlbSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhaWZkOiBkaWRuJ3QgYWxsb2NhdGUgTmV3RmliLlxuIik7CisJCQkJCQlpZihuZXdmaWIpCisJCQkJCQkJa2ZyZWUobmV3ZmliKTsKKwkJCQkJCWlmKGh3X25ld2ZpYikKKwkJCQkJCQlrZnJlZShod19uZXdmaWIpOworCQkJCQl9CisJCQkJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCQkJfQorCQkJCS8qCisJCQkJICoJU2V0IHRoZSBzdGF0dXMgb2YgdGhpcyBGSUIKKwkJCQkgKi8KKwkJCQkqKHUzMiAqKWh3X2ZpYi0+ZGF0YSA9IGNwdV90b19sZTMyKFNUX09LKTsKKwkJCQlmaWJfYWRhcHRlcl9jb21wbGV0ZShmaWIsIHNpemVvZih1MzIpKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmZpYl9sb2NrLCBmbGFndik7CisJCQl9CisJCQlzcGluX2xvY2tfaXJxc2F2ZShxdWV1ZXMtPnF1ZXVlW0hvc3ROb3JtQ21kUXVldWVdLmxvY2ssIGZsYWdzKTsKKwkJCWtmcmVlKGZpYik7CisJCX0KKwkJLyoKKwkJICoJVGhlcmUgYXJlIG5vIG1vcmUgQUlGJ3MKKwkJICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocXVldWVzLT5xdWV1ZVtIb3N0Tm9ybUNtZFF1ZXVlXS5sb2NrLCBmbGFncyk7CisJCXNjaGVkdWxlKCk7CisKKwkJaWYoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJnF1ZXVlcy0+cXVldWVbSG9zdE5vcm1DbWRRdWV1ZV0uY21kcmVhZHksICZ3YWl0KTsKKwlkZXYtPmFpZl90aHJlYWQgPSAwOworCWNvbXBsZXRlX2FuZF9leGl0KCZkZXYtPmFpZl9jb21wbGV0aW9uLCAwKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2RwY3N1cC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvZHBjc3VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ4MGI0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2RwY3N1cC5jCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICoJQWRhcHRlYyBBQUMgc2VyaWVzIFJBSUQgY29udHJvbGxlciBkcml2ZXIKKyAqCShjKSBDb3B5cmlnaHQgMjAwMSBSZWQgSGF0IEluYy4JPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKiBiYXNlZCBvbiB0aGUgb2xkIGFhY3JhaWQgZHJpdmVyIHRoYXQgaXMuLgorICogQWRhcHRlYyBhYWNyYWlkIGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBBZGFwdGVjLCBJbmMuIChhYWNyYWlkQGFkYXB0ZWMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogTW9kdWxlIE5hbWU6CisgKiAgZHBjc3VwLmMKKyAqCisgKiBBYnN0cmFjdDogQWxsIERQQyBwcm9jZXNzaW5nIHJvdXRpbmVzIGZvciB0aGUgY3ljbG9uZSBib2FyZCBvY2N1ciBoZXJlLgorICoKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgImFhY3JhaWQuaCIKKworLyoqCisgKglhYWNfcmVzcG9uc2Vfbm9ybWFsCS0JSGFuZGxlIGNvbW1hbmQgcmVwbGllcworICoJQHE6IFF1ZXVlIHRvIHJlYWQgZnJvbQorICoKKyAqCVRoaXMgRFBDIHJvdXRpbmUgd2lsbCBiZSBydW4gd2hlbiB0aGUgYWRhcHRlciBpbnRlcnJ1cHRzIHVzIHRvIGxldCB1cworICoJa25vdyB0aGVyZSBpcyBhIHJlc3BvbnNlIG9uIG91ciBub3JtYWwgcHJpb3JpdHkgcXVldWUuIFdlIHdpbGwgcHVsbCBvZmYKKyAqCWFsbCBRRSB0aGVyZSBhcmUgYW5kIHdha2UgdXAgYWxsIHRoZSB3YWl0ZXJzIGJlZm9yZSBleGl0aW5nLiBXZSB3aWxsCisgKgl0YWtlIGEgc3BpbmxvY2sgb3V0IG9uIHRoZSBxdWV1ZSBiZWZvcmUgb3BlcmF0aW5nIG9uIGl0LgorICovCisKK3Vuc2lnbmVkIGludCBhYWNfcmVzcG9uc2Vfbm9ybWFsKHN0cnVjdCBhYWNfcXVldWUgKiBxKQoreworCXN0cnVjdCBhYWNfZGV2ICogZGV2ID0gcS0+ZGV2OworCXN0cnVjdCBhYWNfZW50cnkgKmVudHJ5OworCXN0cnVjdCBod19maWIgKiBod2ZpYjsKKwlzdHJ1Y3QgZmliICogZmliOworCWludCBjb25zdW1lZCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKHEtPmxvY2ssIGZsYWdzKTsJCisJLyoKKwkgKglLZWVwIHB1bGxpbmcgcmVzcG9uc2UgUUVzIG9mZiB0aGUgcmVzcG9uc2UgcXVldWUgYW5kIHdha2luZworCSAqCXVwIHRoZSB3YWl0ZXJzIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIFFFcy4gV2UgdGhlbiByZXR1cm4KKwkgKgliYWNrIHRvIHRoZSBzeXN0ZW0uIElmIG5vIHJlc3BvbnNlIHdhcyByZXF1ZXNlZCB3ZSBqdXN0CisJICoJZGVhbGxvY2F0ZSB0aGUgRmliIGhlcmUgYW5kIGNvbnRpbnVlLgorCSAqLworCXdoaWxlKGFhY19jb25zdW1lcl9nZXQoZGV2LCBxLCAmZW50cnkpKQorCXsKKwkJaW50IGZhc3Q7CisJCXUzMiBpbmRleCA9IGxlMzJfdG9fY3B1KGVudHJ5LT5hZGRyKTsKKwkJZmFzdCA9IGluZGV4ICYgMHgwMTsKKwkJZmliID0gJmRldi0+Zmlic1tpbmRleCA+PiAxXTsKKwkJaHdmaWIgPSBmaWItPmh3X2ZpYjsKKwkJCisJCWFhY19jb25zdW1lcl9mcmVlKGRldiwgcSwgSG9zdE5vcm1SZXNwUXVldWUpOworCQkvKgorCQkgKglSZW1vdmUgdGhpcyBmaWIgZnJvbSB0aGUgT3V0c3RhbmRpbmcgSS9PIHF1ZXVlLgorCQkgKglCdXQgb25seSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiB0aW1lZCBvdXQuCisJCSAqCisJCSAqCUlmIHRoZSBmaWIgaGFzIGJlZW4gdGltZWQgb3V0IGFscmVhZHksIHRoZW4ganVzdCAKKwkJICoJY29udGludWUuIFRoZSBjYWxsZXIgaGFzIGFscmVhZHkgYmVlbiBub3RpZmllZCB0aGF0CisJCSAqCXRoZSBmaWIgdGltZWQgb3V0LgorCQkgKi8KKwkJaWYgKCEoZmliLT5mbGFncyAmIEZJQl9DT05URVhUX0ZMQUdfVElNRURfT1VUKSkgeworCQkJbGlzdF9kZWwoJmZpYi0+cXVldWUpOworCQkJZGV2LT5xdWV1ZXMtPnF1ZXVlW0FkYXBOb3JtQ21kUXVldWVdLm51bXBlbmRpbmctLTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFhY3JhaWQ6IEZJQiB0aW1lb3V0ICgleCkuXG4iLCBmaWItPmZsYWdzKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHImFhY3JhaWQ6IGh3ZmliPSVwIGZpYiBpbmRleD0laSBmaWI9JXBcbiIsaHdmaWIsIGh3ZmliLT5oZWFkZXIuU2VuZGVyRGF0YSxmaWIpOworCQkJY29udGludWU7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKGZhc3QpIHsKKwkJCS8qCisJCQkgKglEb2N0b3IgdGhlIGZpYgorCQkJICovCisJCQkqKHUzMiAqKWh3ZmliLT5kYXRhID0gY3B1X3RvX2xlMzIoU1RfT0spOworCQkJaHdmaWItPmhlYWRlci5YZmVyU3RhdGUgfD0gY3B1X3RvX2xlMzIoQWRhcHRlclByb2Nlc3NlZCk7CisJCX0KKworCQlGSUJfQ09VTlRFUl9JTkNSRU1FTlQoYWFjX2NvbmZpZy5GaWJSZWN2ZWQpOworCisJCWlmIChod2ZpYi0+aGVhZGVyLkNvbW1hbmQgPT0gY3B1X3RvX2xlMTYoTnVGaWxlU3lzdGVtKSkKKwkJeworCQkJdTMyICpwc3RhdHVzID0gKHUzMiAqKWh3ZmliLT5kYXRhOworCQkJaWYgKCpwc3RhdHVzICYgY3B1X3RvX2xlMzIoMHhmZmZmMDAwMCkpCisJCQkJKnBzdGF0dXMgPSBjcHVfdG9fbGUzMihTVF9PSyk7CisJCX0KKwkJaWYgKGh3ZmliLT5oZWFkZXIuWGZlclN0YXRlICYgY3B1X3RvX2xlMzIoTm9SZXNwb25zZUV4cGVjdGVkIHwgQXN5bmMpKSAKKwkJeworCSAgICAgICAgCWlmIChod2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSAmIGNwdV90b19sZTMyKE5vUmVzcG9uc2VFeHBlY3RlZCkpCisJCQkJRklCX0NPVU5URVJfSU5DUkVNRU5UKGFhY19jb25maWcuTm9SZXNwb25zZVJlY3ZlZCk7CisJCQllbHNlIAorCQkJCUZJQl9DT1VOVEVSX0lOQ1JFTUVOVChhYWNfY29uZmlnLkFzeW5jUmVjdmVkKTsKKwkJCS8qCisJCQkgKglOT1RFOiAgd2UgY2Fubm90IHRvdWNoIHRoZSBmaWIgYWZ0ZXIgdGhpcworCQkJICoJICAgIGNhbGwsIGJlY2F1c2UgaXQgbWF5IGhhdmUgYmVlbiBkZWFsbG9jYXRlZC4KKwkJCSAqLworCQkJZmliLT5jYWxsYmFjayhmaWItPmNhbGxiYWNrX2RhdGEsIGZpYik7CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWd2OworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmZpYi0+ZXZlbnRfbG9jaywgZmxhZ3YpOworCQkJZmliLT5kb25lID0gMTsKKwkJCXVwKCZmaWItPmV2ZW50X3dhaXQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmliLT5ldmVudF9sb2NrLCBmbGFndik7CisJCQlGSUJfQ09VTlRFUl9JTkNSRU1FTlQoYWFjX2NvbmZpZy5Ob3JtYWxSZWN2ZWQpOworCQl9CisJCWNvbnN1bWVkKys7CisJCXNwaW5fbG9ja19pcnFzYXZlKHEtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoY29uc3VtZWQgPiBhYWNfY29uZmlnLnBlYWtfZmlicykKKwkJYWFjX2NvbmZpZy5wZWFrX2ZpYnMgPSBjb25zdW1lZDsKKwlpZiAoY29uc3VtZWQgPT0gMCkgCisJCWFhY19jb25maWcuemVyb19maWJzKys7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqCWFhY19jb21tYW5kX25vcm1hbAktCWhhbmRsZSBjb21tYW5kcworICoJQHE6IHF1ZXVlIHRvIHByb2Nlc3MKKyAqCisgKglUaGlzIERQQyByb3V0aW5lIHdpbGwgYmUgcXVldWVkIHdoZW4gdGhlIGFkYXB0ZXIgaW50ZXJydXB0cyB1cyB0byAKKyAqCWxldCB1cyBrbm93IHRoZXJlIGlzIGEgY29tbWFuZCBvbiBvdXIgbm9ybWFsIHByaW9yaXR5IHF1ZXVlLiBXZSB3aWxsIAorICoJcHVsbCBvZmYgYWxsIFFFIHRoZXJlIGFyZSBhbmQgd2FrZSB1cCBhbGwgdGhlIHdhaXRlcnMgYmVmb3JlIGV4aXRpbmcuCisgKglXZSB3aWxsIHRha2UgYSBzcGlubG9jayBvdXQgb24gdGhlIHF1ZXVlIGJlZm9yZSBvcGVyYXRpbmcgb24gaXQuCisgKi8KKyAKK3Vuc2lnbmVkIGludCBhYWNfY29tbWFuZF9ub3JtYWwoc3RydWN0IGFhY19xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgYWFjX2RldiAqIGRldiA9IHEtPmRldjsKKwlzdHJ1Y3QgYWFjX2VudHJ5ICplbnRyeTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUocS0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKglLZWVwIHB1bGxpbmcgcmVzcG9uc2UgUUVzIG9mZiB0aGUgcmVzcG9uc2UgcXVldWUgYW5kIHdha2luZworCSAqCXVwIHRoZSB3YWl0ZXJzIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIFFFcy4gV2UgdGhlbiByZXR1cm4KKwkgKgliYWNrIHRvIHRoZSBzeXN0ZW0uCisJICovCisJd2hpbGUoYWFjX2NvbnN1bWVyX2dldChkZXYsIHEsICZlbnRyeSkpCisJeworCQlzdHJ1Y3QgZmliIGZpYmN0eDsKKwkJc3RydWN0IGh3X2ZpYiAqIGh3X2ZpYjsKKwkJdTMyIGluZGV4OworCQlzdHJ1Y3QgZmliICpmaWIgPSAmZmliY3R4OworCQkKKwkJaW5kZXggPSBsZTMyX3RvX2NwdShlbnRyeS0+YWRkcikgLyBzaXplb2Yoc3RydWN0IGh3X2ZpYik7CisJCWh3X2ZpYiA9ICZkZXYtPmFpZl9iYXNlX3ZhW2luZGV4XTsKKwkJCisJCS8qCisJCSAqCUFsbG9jYXRlIGEgRklCIGF0IGFsbCBjb3N0cy4gRm9yIG5vbiBxdWV1ZWQgc3R1ZmYKKwkJICoJd2UgY2FuIGp1c3QgdXNlIHRoZSBzdGFjayBzbyB3ZSBhcmUgaGFwcHkuIFdlIG5lZWQKKwkJICoJYSBmaWIgb2JqZWN0IGluIG9yZGVyIHRvIG1hbmFnZSB0aGUgbGlua2VkIGxpc3RzCisJCSAqLworCQlpZiAoZGV2LT5haWZfdGhyZWFkKQorCQkJaWYoKGZpYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmaWIpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJCQlmaWIgPSAmZmliY3R4OworCQkKKwkJbWVtc2V0KGZpYiwgMCwgc2l6ZW9mKHN0cnVjdCBmaWIpKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmZpYi0+ZmlibGluayk7CisJCWZpYi0+dHlwZSA9IEZTQUZTX05UQ19GSUJfQ09OVEVYVDsKKwkJZmliLT5zaXplID0gc2l6ZW9mKHN0cnVjdCBmaWIpOworCQlmaWItPmh3X2ZpYiA9IGh3X2ZpYjsKKwkJZmliLT5kYXRhID0gaHdfZmliLT5kYXRhOworCQlmaWItPmRldiA9IGRldjsKKwkJCisJCQkJCisJCWlmIChkZXYtPmFpZl90aHJlYWQgJiYgZmliICE9ICZmaWJjdHgpIHsKKwkJICAgICAgICBsaXN0X2FkZF90YWlsKCZmaWItPmZpYmxpbmssICZxLT5jbWRxKTsKKwkgCSAgICAgICAgYWFjX2NvbnN1bWVyX2ZyZWUoZGV2LCBxLCBIb3N0Tm9ybUNtZFF1ZXVlKTsKKwkJICAgICAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJnEtPmNtZHJlYWR5KTsKKwkJfSBlbHNlIHsKKwkgCSAgICAgICAgYWFjX2NvbnN1bWVyX2ZyZWUoZGV2LCBxLCBIb3N0Tm9ybUNtZFF1ZXVlKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+bG9jaywgZmxhZ3MpOworCQkJLyoKKwkJCSAqCVNldCB0aGUgc3RhdHVzIG9mIHRoaXMgRklCCisJCQkgKi8KKwkJCSoodTMyICopaHdfZmliLT5kYXRhID0gY3B1X3RvX2xlMzIoU1RfT0spOworCQkJZmliX2FkYXB0ZXJfY29tcGxldGUoZmliLCBzaXplb2YodTMyKSk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZShxLT5sb2NrLCBmbGFncyk7CisJCX0JCQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2xpbml0LmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YjgyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jCkBAIC0wLDAgKzEsNzQ5IEBACisvKgorICoJQWRhcHRlYyBBQUMgc2VyaWVzIFJBSUQgY29udHJvbGxlciBkcml2ZXIKKyAqCShjKSBDb3B5cmlnaHQgMjAwMSBSZWQgSGF0IEluYy4JPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKiBiYXNlZCBvbiB0aGUgb2xkIGFhY3JhaWQgZHJpdmVyIHRoYXQgaXMuLgorICogQWRhcHRlYyBhYWNyYWlkIGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBBZGFwdGVjLCBJbmMuIChhYWNyYWlkQGFkYXB0ZWMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogTW9kdWxlIE5hbWU6CisgKiAgIGxpbml0LmMKKyAqCisgKiBBYnN0cmFjdDogTGludXggRHJpdmVyIGVudHJ5IG1vZHVsZSBmb3IgQWRhcHRlYyBSQUlEIEFycmF5IENvbnRyb2xsZXIKKyAqLworCisjZGVmaW5lIEFBQ19EUklWRVJfVkVSU0lPTgkJIjEuMS4yLWxrMiIKKyNkZWZpbmUgQUFDX0RSSVZFUl9CVUlMRF9EQVRFCQlfX0RBVEVfXworI2RlZmluZSBBQUNfRFJJVkVSTkFNRQkJCSJhYWNyYWlkIgorCisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KKworI2luY2x1ZGUgImFhY3JhaWQuaCIKKworCitNT0RVTEVfQVVUSE9SKCJSZWQgSGF0IEluYyBhbmQgQWRhcHRlYyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEZWxsIFBFUkMyLCAyL1NpLCAzL1NpLCAzL0RpLCAiCisJCSAgICJBZGFwdGVjIEFkdmFuY2VkIFJhaWQgUHJvZHVjdHMsICIKKwkJICAgImFuZCBIUCBOZXRSQUlELTRNIFNDU0kgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihBQUNfRFJJVkVSX1ZFUlNJT04pOworCitzdGF0aWMgTElTVF9IRUFEKGFhY19kZXZpY2VzKTsKK3N0YXRpYyBpbnQgYWFjX2NmZ19tYWpvciA9IC0xOworCisvKgorICogQmVjYXVzZSBvZiB0aGUgd2F5IExpbnV4IG5hbWVzIHNjc2kgZGV2aWNlcywgdGhlIG9yZGVyIGluIHRoaXMgdGFibGUgaGFzCisgKiBiZWNvbWUgaW1wb3J0YW50LiAgQ2hlY2sgZm9yIG9uLWJvYXJkIFJhaWQgZmlyc3QsIGFkZC1pbiBjYXJkcyBzZWNvbmQuCisgKgorICogTm90ZTogVGhlIGxhc3QgZmllbGQgaXMgdXNlZCB0byBpbmRleCBpbnRvIGFhY19kcml2ZXJzIGJlbG93LgorICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWFjX3BjaV90YmxbXSA9IHsKKwl7IDB4MTAyOCwgMHgwMDAxLCAweDEwMjgsIDB4MDAwMSwgMCwgMCwgMCB9LCAvKiBQRVJDIDIvU2kgKElndWFuYS9QRVJDMlNpKSAqLworCXsgMHgxMDI4LCAweDAwMDIsIDB4MTAyOCwgMHgwMDAyLCAwLCAwLCAxIH0sIC8qIFBFUkMgMy9EaSAoT3BhbC9QRVJDM0RpKSAqLworCXsgMHgxMDI4LCAweDAwMDMsIDB4MTAyOCwgMHgwMDAzLCAwLCAwLCAyIH0sIC8qIFBFUkMgMy9TaSAoU2xpbUZhc3QvUEVSQzNTaSAqLworCXsgMHgxMDI4LCAweDAwMDQsIDB4MTAyOCwgMHgwMGQwLCAwLCAwLCAzIH0sIC8qIFBFUkMgMy9EaSAoSWd1YW5hIEZsaXBDaGlwL1BFUkMzRGlGICovCisJeyAweDEwMjgsIDB4MDAwMiwgMHgxMDI4LCAweDAwZDEsIDAsIDAsIDQgfSwgLyogUEVSQyAzL0RpIChWaXBlci9QRVJDM0RpVikgKi8KKwl7IDB4MTAyOCwgMHgwMDAyLCAweDEwMjgsIDB4MDBkOSwgMCwgMCwgNSB9LCAvKiBQRVJDIDMvRGkgKExleHVzL1BFUkMzRGlMKSAqLworCXsgMHgxMDI4LCAweDAwMGEsIDB4MTAyOCwgMHgwMTA2LCAwLCAwLCA2IH0sIC8qIFBFUkMgMy9EaSAoSmFndWFyL1BFUkMzRGlKKSAqLworCXsgMHgxMDI4LCAweDAwMGEsIDB4MTAyOCwgMHgwMTFiLCAwLCAwLCA3IH0sIC8qIFBFUkMgMy9EaSAoRGFnZ2VyL1BFUkMzRGlEKSAqLworCXsgMHgxMDI4LCAweDAwMGEsIDB4MTAyOCwgMHgwMTIxLCAwLCAwLCA4IH0sIC8qIFBFUkMgMy9EaSAoQm94c3Rlci9QRVJDM0RpQikgKi8KKwl7IDB4OTAwNSwgMHgwMjgzLCAweDkwMDUsIDB4MDI4MywgMCwgMCwgOSB9LCAvKiBjYXRhcHVsdCAqLworCXsgMHg5MDA1LCAweDAyODQsIDB4OTAwNSwgMHgwMjg0LCAwLCAwLCAxMCB9LCAvKiB0b21jYXQgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI4NiwgMCwgMCwgMTEgfSwgLyogQWRhcHRlYyAyMTIwUyAoQ3J1c2FkZXIpICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyODUsIDAsIDAsIDEyIH0sIC8qIEFkYXB0ZWMgMjIwMFMgKFZ1bGNhbikgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI4NywgMCwgMCwgMTMgfSwgLyogQWRhcHRlYyAyMjAwUyAoVnVsY2FuLTJtKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4MTdhYSwgMHgwMjg2LCAwLCAwLCAxNCB9LCAvKiBMZWdlbmQgUzIyMCAoTGVnZW5kIENydXNhZGVyKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4MTdhYSwgMHgwMjg3LCAwLCAwLCAxNSB9LCAvKiBMZWdlbmQgUzIzMCAoTGVnZW5kIFZ1bGNhbikgKi8KKworCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjg4LCAwLCAwLCAxNiB9LCAvKiBBZGFwdGVjIDMyMzBTIChIYXJyaWVyKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjg5LCAwLCAwLCAxNyB9LCAvKiBBZGFwdGVjIDMyNDBTIChUb3JuYWRvKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjhhLCAwLCAwLCAxOCB9LCAvKiBBU1ItMjAyMFpDUiBTQ1NJIFBDSS1YIFpDUiAoU2t5aGF3aykgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI4YiwgMCwgMCwgMTkgfSwgLyogQVNSLTIwMjVaQ1IgU0NTSSBTTy1ESU1NIFBDSS1YIFpDUiAoVGVybWluYXRvcikgKi8KKwl7IDB4OTAwNSwgMHgwMjg2LCAweDkwMDUsIDB4MDI4YywgMCwgMCwgMjAgfSwgLyogQVNSLTIyMzBTICsgQVNSLTIyMzBTTFAgUENJLVggKExhbmNlcikgKi8KKwl7IDB4OTAwNSwgMHgwMjg2LCAweDkwMDUsIDB4MDI4ZCwgMCwgMCwgMjEgfSwgLyogQVNSLTIxMzBTIChMYW5jZXIpICovCisJeyAweDkwMDUsIDB4MDI4NiwgMHg5MDA1LCAweDAyOWIsIDAsIDAsIDIyIH0sIC8qIEFBUi0yODIwU0EgKEludHJ1ZGVyKSAqLworCXsgMHg5MDA1LCAweDAyODYsIDB4OTAwNSwgMHgwMjljLCAwLCAwLCAyMyB9LCAvKiBBQVItMjYyMFNBIChJbnRydWRlcikgKi8KKwl7IDB4OTAwNSwgMHgwMjg2LCAweDkwMDUsIDB4MDI5ZCwgMCwgMCwgMjQgfSwgLyogQUFSLTI0MjBTQSAoSW50cnVkZXIpICovCisJeyAweDkwMDUsIDB4MDI4NiwgMHg5MDA1LCAweDA4MDAsIDAsIDAsIDI1IH0sIC8qIENhbGxpc3RvIEp1cGl0ZXIgUGxhdGZvcm0gKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI4ZSwgMCwgMCwgMjYgfSwgLyogQVNSLTIwMjBTQSBTQVRBIFBDSS1YIFpDUiAoU2t5aGF3aykgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI4ZiwgMCwgMCwgMjcgfSwgLyogQVNSLTIwMjVTQSBTQVRBIFNPLURJTU0gUENJLVggWkNSIChUZXJtaW5hdG9yKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjkwLCAwLCAwLCAyOCB9LCAvKiBBQVItMjQxMFNBIFBDSSBTQVRBIDRjaCAoSmFndWFyIElJKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4MTAyOCwgMHgwMjkxLCAwLCAwLCAyOSB9LCAvKiBDRVJDIFNBVEEgUkFJRCAyIFBDSSBTQVRBIDZjaCAoRGVsbENvcnNhaXIpICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOTIsIDAsIDAsIDMwIH0sIC8qIEFBUi0yODEwU0EgUENJIFNBVEEgOGNoIChDb3JzYWlyLTgpICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOTMsIDAsIDAsIDMxIH0sIC8qIEFBUi0yMTYxMFNBIFBDSSBTQVRBIDE2Y2ggKENvcnNhaXItMTYpICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOTQsIDAsIDAsIDMyIH0sIC8qIEVTRCBTTy1ESU1NIFBDSS1YIFNBVEEgWkNSIChQcm93bGVyKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4MTAzQywgMHgzMjI3LCAwLCAwLCAzMyB9LCAvKiBBQVItMjYxMFNBIFBDSSBTQVRBIDZjaCAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjk2LCAwLCAwLCAzNCB9LCAvKiBBU1ItMjI0MFMgKFNhYnJlRXhwcmVzcykgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5NywgMCwgMCwgMzUgfSwgLyogQVNSLTQwMDVTQVMgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDEwMTQsIDB4MDJGMiwgMCwgMCwgMzYgfSwgLyogSUJNIDhpIChBdm9uUGFyaykgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5OCwgMCwgMCwgMzcgfSwgLyogQVNSLTQwMDBTQVMgKEJsYWNrQmlyZCkgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5OSwgMCwgMCwgMzggfSwgLyogQVNSLTQ4MDBTQVMgKE1hcmF1ZGVyLVgpICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOUEsIDAsIDAsIDM5IH0sIC8qIEFTUi00ODA1U0FTIChNYXJhdWRlci1FKSAqLworCisJeyAweDkwMDUsIDB4MDI4NSwgMHgxMDI4LCAweDAyODcsIDAsIDAsIDQwIH0sIC8qIFBlcmMgMzIwL0RDKi8KKwl7IDB4MTAxMSwgMHgwMDQ2LCAweDkwMDUsIDB4MDM2NSwgMCwgMCwgNDEgfSwgLyogQWRhcHRlYyA1NDAwUyAoTXVzdGFuZykqLworCXsgMHgxMDExLCAweDAwNDYsIDB4OTAwNSwgMHgwMzY0LCAwLCAwLCA0MiB9LCAvKiBBZGFwdGVjIDU0MDBTIChNdXN0YW5nKSovCisJeyAweDEwMTEsIDB4MDA0NiwgMHg5MDA1LCAweDEzNjQsIDAsIDAsIDQzIH0sIC8qIERlbGwgUEVSQzIvUUMgKi8KKwl7IDB4MTAxMSwgMHgwMDQ2LCAweDEwM2MsIDB4MTBjMiwgMCwgMCwgNDQgfSwgLyogSFAgTmV0UkFJRC00TSAqLworCisJeyAweDkwMDUsIDB4MDI4NSwgMHgxMDI4LCBQQ0lfQU5ZX0lELCAwLCAwLCA0NSB9LCAvKiBEZWxsIENhdGNoYWxsICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHgxN2FhLCBQQ0lfQU5ZX0lELCAwLCAwLCA0NiB9LCAvKiBMZWdlbmQgQ2F0Y2hhbGwgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA0NyB9LCAvKiBBZGFwdGVjIENhdGNoIEFsbCAqLworCXsgMHg5MDA1LCAweDAyODYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDQ4IH0sIC8qIEFkYXB0ZWMgUm9ja2V0IENhdGNoIEFsbCAqLworCXsgMCx9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFhY19wY2lfdGJsKTsKKworLyoKKyAqIGRtYiAtIEZvciBub3cgd2UgYWRkIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdG8gdGhpcyBzdHJ1Y3R1cmUuICAKKyAqIEluIHRoZSBmdXR1cmUgd2Ugc2hvdWxkIGFkZCBhIGZpYiB0aGF0IHJlcG9ydHMgdGhlIG51bWJlciBvZiBjaGFubmVscworICogZm9yIHRoZSBjYXJkLiAgQXQgdGhhdCB0aW1lIHdlIGNhbiByZW1vdmUgdGhlIGNoYW5uZWxzIGZyb20gaGVyZQorICovCitzdGF0aWMgc3RydWN0IGFhY19kcml2ZXJfaWRlbnQgYWFjX2RyaXZlcnNbXSA9IHsKKwl7IGFhY19yeF9pbml0LCAicGVyY3JhaWQiLCAiREVMTCAgICAiLCAiUEVSQ1JBSUQgICAgICAgICIsIDIsIEFBQ19RVUlSS18zMUJJVCB8IEFBQ19RVUlSS18zNFNHIH0sIC8qIFBFUkMgMi9TaSAoSWd1YW5hL1BFUkMyU2kpICovCisJeyBhYWNfcnhfaW5pdCwgInBlcmNyYWlkIiwgIkRFTEwgICAgIiwgIlBFUkNSQUlEICAgICAgICAiLCAyLCBBQUNfUVVJUktfMzFCSVQgfCBBQUNfUVVJUktfMzRTRyB9LCAvKiBQRVJDIDMvRGkgKE9wYWwvUEVSQzNEaSkgKi8KKwl7IGFhY19yeF9pbml0LCAicGVyY3JhaWQiLCAiREVMTCAgICAiLCAiUEVSQ1JBSUQgICAgICAgICIsIDIsIEFBQ19RVUlSS18zMUJJVCB8IEFBQ19RVUlSS18zNFNHIH0sIC8qIFBFUkMgMy9TaSAoU2xpbUZhc3QvUEVSQzNTaSAqLworCXsgYWFjX3J4X2luaXQsICJwZXJjcmFpZCIsICJERUxMICAgICIsICJQRVJDUkFJRCAgICAgICAgIiwgMiwgQUFDX1FVSVJLXzMxQklUIHwgQUFDX1FVSVJLXzM0U0cgfSwgLyogUEVSQyAzL0RpIChJZ3VhbmEgRmxpcENoaXAvUEVSQzNEaUYgKi8KKwl7IGFhY19yeF9pbml0LCAicGVyY3JhaWQiLCAiREVMTCAgICAiLCAiUEVSQ1JBSUQgICAgICAgICIsIDIsIEFBQ19RVUlSS18zMUJJVCB8IEFBQ19RVUlSS18zNFNHIH0sIC8qIFBFUkMgMy9EaSAoVmlwZXIvUEVSQzNEaVYpICovCisJeyBhYWNfcnhfaW5pdCwgInBlcmNyYWlkIiwgIkRFTEwgICAgIiwgIlBFUkNSQUlEICAgICAgICAiLCAyLCBBQUNfUVVJUktfMzFCSVQgfCBBQUNfUVVJUktfMzRTRyB9LCAvKiBQRVJDIDMvRGkgKExleHVzL1BFUkMzRGlMKSAqLworCXsgYWFjX3J4X2luaXQsICJwZXJjcmFpZCIsICJERUxMICAgICIsICJQRVJDUkFJRCAgICAgICAgIiwgMSwgQUFDX1FVSVJLXzMxQklUIHwgQUFDX1FVSVJLXzM0U0cgfSwgLyogUEVSQyAzL0RpIChKYWd1YXIvUEVSQzNEaUopICovCisJeyBhYWNfcnhfaW5pdCwgInBlcmNyYWlkIiwgIkRFTEwgICAgIiwgIlBFUkNSQUlEICAgICAgICAiLCAyLCBBQUNfUVVJUktfMzFCSVQgfCBBQUNfUVVJUktfMzRTRyB9LCAvKiBQRVJDIDMvRGkgKERhZ2dlci9QRVJDM0RpRCkgKi8KKwl7IGFhY19yeF9pbml0LCAicGVyY3JhaWQiLCAiREVMTCAgICAiLCAiUEVSQ1JBSUQgICAgICAgICIsIDIsIEFBQ19RVUlSS18zMUJJVCB8IEFBQ19RVUlSS18zNFNHIH0sIC8qIFBFUkMgMy9EaSAoQm94c3Rlci9QRVJDM0RpQikgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiY2F0YXB1bHQgICAgICAgICIsIDIsIEFBQ19RVUlSS18zMUJJVCB8IEFBQ19RVUlSS18zNFNHIH0sIC8qIGNhdGFwdWx0ICovCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgInRvbWNhdCAgICAgICAgICAiLCAyLCBBQUNfUVVJUktfMzFCSVQgfCBBQUNfUVVJUktfMzRTRyB9LCAvKiB0b21jYXQgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQWRhcHRlYyAyMTIwUyAgICIsIDEsIEFBQ19RVUlSS18zMUJJVCB8IEFBQ19RVUlSS18zNFNHIH0sIC8qIEFkYXB0ZWMgMjEyMFMgKENydXNhZGVyKSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBZGFwdGVjIDIyMDBTICAgIiwgMiwgQUFDX1FVSVJLXzMxQklUIHwgQUFDX1FVSVJLXzM0U0cgfSwgLyogQWRhcHRlYyAyMjAwUyAoVnVsY2FuKSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBZGFwdGVjIDIyMDBTICAgIiwgMiwgQUFDX1FVSVJLXzMxQklUIHwgQUFDX1FVSVJLXzM0U0cgfSwgLyogQWRhcHRlYyAyMjAwUyAoVnVsY2FuLTJtKSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJMZWdlbmQgICIsICJMZWdlbmQgUzIyMCAgICAgIiwgMSwgQUFDX1FVSVJLXzMxQklUIHwgQUFDX1FVSVJLXzM0U0cgfSwgLyogTGVnZW5kIFMyMjAgKExlZ2VuZCBDcnVzYWRlcikgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiTGVnZW5kICAiLCAiTGVnZW5kIFMyMzAgICAgICIsIDIsIEFBQ19RVUlSS18zMUJJVCB8IEFBQ19RVUlSS18zNFNHIH0sIC8qIExlZ2VuZCBTMjMwIChMZWdlbmQgVnVsY2FuKSAqLworCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFkYXB0ZWMgMzIzMFMgICAiLCAyIH0sIC8qIEFkYXB0ZWMgMzIzMFMgKEhhcnJpZXIpICovCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFkYXB0ZWMgMzI0MFMgICAiLCAyIH0sIC8qIEFkYXB0ZWMgMzI0MFMgKFRvcm5hZG8pICovCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFTUi0yMDIwWkNSICAgICAiLCAyIH0sIC8qIEFTUi0yMDIwWkNSIFNDU0kgUENJLVggWkNSIChTa3loYXdrKSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItMjAyNVpDUiAgICAgIiwgMiB9LCAvKiBBU1ItMjAyNVpDUiBTQ1NJIFNPLURJTU0gUENJLVggWkNSIChUZXJtaW5hdG9yKSAqLworCXsgYWFjX3JrdF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQVNSLTIyMzBTIFBDSS1YICIsIDIgfSwgLyogQVNSLTIyMzBTICsgQVNSLTIyMzBTTFAgUENJLVggKExhbmNlcikgKi8KKwl7IGFhY19ya3RfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFTUi0yMTMwUyBQQ0ktWCAiLCAxIH0sIC8qIEFTUi0yMTMwUyAoTGFuY2VyKSAqLworCXsgYWFjX3JrdF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQUFSLTI4MjBTQSAgICAgICIsIDEgfSwgLyogQUFSLTI4MjBTQSAoSW50cnVkZXIpICovCisJeyBhYWNfcmt0X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBQVItMjYyMFNBICAgICAgIiwgMSB9LCAvKiBBQVItMjYyMFNBIChJbnRydWRlcikgKi8KKwl7IGFhY19ya3RfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFBUi0yNDIwU0EgICAgICAiLCAxIH0sIC8qIEFBUi0yNDIwU0EgKEludHJ1ZGVyKSAqLworCXsgYWFjX3JrdF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQ2FsbGlzdG8gICAgICAgICIsIDIsIEFBQ19RVUlSS19NQVNURVIgfSwgLyogSnVwaXRlciBQbGF0Zm9ybSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItMjAyMFNBICAgICAgICIsIDEgfSwgLyogQVNSLTIwMjBTQSBTQVRBIFBDSS1YIFpDUiAoU2t5aGF3aykgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQVNSLTIwMjVTQSAgICAgICAiLCAxIH0sIC8qIEFTUi0yMDI1U0EgU0FUQSBTTy1ESU1NIFBDSS1YIFpDUiAoVGVybWluYXRvcikgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQUFSLTI0MTBTQSBTQVRBICIsIDEgfSwgLyogQUFSLTI0MTBTQSBQQ0kgU0FUQSA0Y2ggKEphZ3VhciBJSSkgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiREVMTCAgICAiLCAiQ0VSQyBTUjIgICAgICAgICIsIDEgfSwgLyogQ0VSQyBTQVRBIFJBSUQgMiBQQ0kgU0FUQSA2Y2ggKERlbGxDb3JzYWlyKSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBQVItMjgxMFNBIFNBVEEgIiwgMSB9LCAvKiBBQVItMjgxMFNBIFBDSSBTQVRBIDhjaCAoQ29yc2Fpci04KSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBQVItMjE2MTBTQSBTQVRBIiwgMSB9LCAvKiBBQVItMjE2MTBTQSBQQ0kgU0FUQSAxNmNoIChDb3JzYWlyLTE2KSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItMjAyNlpDUiAgICAgIiwgMSB9LCAvKiBFU0QgU08tRElNTSBQQ0ktWCBTQVRBIFpDUiAoUHJvd2xlcikgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQUFSLTI2MTBTQSAgICAgICIsIDEgfSwgLyogU0FUQSA2Q2ggKEJlYXJjYXQpICovCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFTUi0yMjQwUyAgICAgICAiLCAxIH0sIC8qIEFTUi0yMjQwUyAoU2FicmVFeHByZXNzKSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItNDAwNVNBUyAgICAgIiwgMSB9LCAvKiBBU1ItNDAwNVNBUyAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJJQk0gICAgICIsICJTZXJ2ZVJBSUQgOGkgICAgIiwgMSB9LCAvKiBJQk0gOGkgKEF2b25QYXJrKSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItNDAwMFNBUyAgICAgIiwgMSB9LCAvKiBBU1ItNDAwMFNBUyAoQmxhY2tCaXJkICYgQXZvblBhcmspICovCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFTUi00ODAwU0FTICAgICAiLCAxIH0sIC8qIEFTUi00ODAwU0FTIChNYXJhdWRlci1YKSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItNDgwNVNBUyAgICAgIiwgMSB9LCAvKiBBU1ItNDgwNVNBUyAoTWFyYXVkZXItRSkgKi8KKworCXsgYWFjX3J4X2luaXQsICJwZXJjcmFpZCIsICJERUxMICAgICIsICJQRVJDIDMyMC9EQyAgICAgIiwgMiwgQUFDX1FVSVJLXzMxQklUIHwgQUFDX1FVSVJLXzM0U0cgfSwgLyogUGVyYyAzMjAvREMqLworCXsgYWFjX3NhX2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBZGFwdGVjIDU0MDBTICAgIiwgNCwgQUFDX1FVSVJLXzM0U0cgfSwgLyogQWRhcHRlYyA1NDAwUyAoTXVzdGFuZykqLworCXsgYWFjX3NhX2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBQUMtMzY0ICAgICAgICAgIiwgNCwgQUFDX1FVSVJLXzM0U0cgfSwgLyogQWRhcHRlYyA1NDAwUyAoTXVzdGFuZykqLworCXsgYWFjX3NhX2luaXQsICJwZXJjcmFpZCIsICJERUxMICAgICIsICJQRVJDUkFJRCAgICAgICAgIiwgNCwgQUFDX1FVSVJLXzMxQklUIHwgQUFDX1FVSVJLXzM0U0cgfSwgLyogRGVsbCBQRVJDMi9RQyAqLworCXsgYWFjX3NhX2luaXQsICJocG5yYWlkIiwgICJIUCAgICAgICIsICJOZXRSQUlEICAgICAgICAgIiwgNCwgQUFDX1FVSVJLXzM0U0cgfSwgLyogSFAgTmV0UkFJRC00TSAqLworCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkRFTEwgICAgIiwgIlJBSUQgICAgICAgICAgICAiLCAyLCBBQUNfUVVJUktfMzFCSVQgfCBBQUNfUVVJUktfMzRTRyB9LCAvKiBEZWxsIENhdGNoYWxsICovCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkxlZ2VuZCAgIiwgIlJBSUQgICAgICAgICAgICAiLCAyLCBBQUNfUVVJUktfMzFCSVQgfCBBQUNfUVVJUktfMzRTRyB9LCAvKiBMZWdlbmQgQ2F0Y2hhbGwgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiUkFJRCAgICAgICAgICAgICIsIDIsIEFBQ19RVUlSS18zMUJJVCB8IEFBQ19RVUlSS18zNFNHIH0sIC8qIEFkYXB0ZWMgQ2F0Y2ggQWxsICovCisJeyBhYWNfcmt0X2luaXQsICJhYWNyYWlkIiwgIkFEQVBURUMgIiwgIlJBSUQgICAgICAgICAgICAiLCAyIH0gLyogQWRhcHRlYyBSb2NrZXQgQ2F0Y2ggQWxsICovCit9OworCisvKioKKyAqCWFhY19xdWV1ZWNvbW1hbmQJLQlxdWV1ZSBhIFNDU0kgY29tbWFuZAorICoJQGNtZDoJCVNDU0kgY29tbWFuZCB0byBxdWV1ZQorICoJQGRvbmU6CQlGdW5jdGlvbiB0byBjYWxsIG9uIGNvbW1hbmQgY29tcGxldGlvbgorICoKKyAqCVF1ZXVlcyBhIGNvbW1hbmQgZm9yIGV4ZWN1dGlvbiBieSB0aGUgYXNzb2NpYXRlZCBIb3N0IEFkYXB0ZXIuCisgKgorICoJVE9ETzogdW5pZnkgd2l0aCBhYWNfc2NzaV9jbWQoKS4KKyAqLyAKKworc3RhdGljIGludCBhYWNfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJY21kLT5zY3NpX2RvbmUgPSBkb25lOworCXJldHVybiAoYWFjX3Njc2lfY21kKGNtZCkgPyBGQUlMRUQgOiAwKTsKK30gCisKKy8qKgorICoJYWFjX2luZm8JCS0JUmV0dXJucyB0aGUgaG9zdCBhZGFwdGVyIG5hbWUKKyAqCUBzaG9zdDoJCVNjc2kgaG9zdCB0byByZXBvcnQgb24KKyAqCisgKglSZXR1cm5zIGEgc3RhdGljIHN0cmluZyBkZXNjcmliaW5nIHRoZSBkZXZpY2UgaW4gcXVlc3Rpb24KKyAqLworCitjb25zdCBjaGFyICphYWNfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3QgYWFjX2RldiAqZGV2ID0gKHN0cnVjdCBhYWNfZGV2ICopc2hvc3QtPmhvc3RkYXRhOworCXJldHVybiBhYWNfZHJpdmVyc1tkZXYtPmNhcmR0eXBlXS5uYW1lOworfQorCisvKioKKyAqCWFhY19nZXRfZHJpdmVyX2lkZW50CisgKiAJQGRldnR5cGU6IGluZGV4IGludG8gbG9va3VwIHRhYmxlCisgKgorICogCVJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbnRyeSBpbiB0aGUgZHJpdmVyIGxvb2t1cCB0YWJsZS4KKyAqLworCitzdHJ1Y3QgYWFjX2RyaXZlcl9pZGVudCogYWFjX2dldF9kcml2ZXJfaWRlbnQoaW50IGRldnR5cGUpCit7CisJcmV0dXJuICZhYWNfZHJpdmVyc1tkZXZ0eXBlXTsKK30KKworLyoqCisgKglhYWNfYmlvc3Bhcm0JLQlyZXR1cm4gQklPUyBwYXJhbWV0ZXJzIGZvciBkaXNrCisgKglAc2RldjogVGhlIHNjc2kgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRpc2sKKyAqCUBiZGV2OiB0aGUgYmxvY2sgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRpc2sKKyAqCUBjYXBhY2l0eTogdGhlIHNlY3RvciBjYXBhY2l0eSBvZiB0aGUgZGlzaworICoJQGdlb206IGdlb21ldHJ5IGJsb2NrIHRvIGZpbGwgaW4KKyAqCisgKglSZXR1cm4gdGhlIEhlYWRzL1NlY3RvcnMvQ3lsaW5kZXJzIEJJT1MgRGlzayBQYXJhbWV0ZXJzIGZvciBEaXNrLiAgCisgKglUaGUgZGVmYXVsdCBkaXNrIGdlb21ldHJ5IGlzIDY0IGhlYWRzLCAzMiBzZWN0b3JzLCBhbmQgdGhlIGFwcHJvcHJpYXRlIAorICoJbnVtYmVyIG9mIGN5bGluZGVycyBzbyBhcyBub3QgdG8gZXhjZWVkIGRyaXZlIGNhcGFjaXR5LiAgSW4gb3JkZXIgZm9yIAorICoJZGlza3MgZXF1YWwgdG8gb3IgbGFyZ2VyIHRoYW4gMSBHQiB0byBiZSBhZGRyZXNzYWJsZSBieSB0aGUgQklPUworICoJd2l0aG91dCBleGNlZWRpbmcgdGhlIEJJT1MgbGltaXRhdGlvbiBvZiAxMDI0IGN5bGluZGVycywgRXh0ZW5kZWQgCisgKglUcmFuc2xhdGlvbiBzaG91bGQgYmUgZW5hYmxlZC4gICBXaXRoIEV4dGVuZGVkIFRyYW5zbGF0aW9uIGVuYWJsZWQsIAorICoJZHJpdmVzIGJldHdlZW4gMSBHQiBpbmNsdXNpdmUgYW5kIDIgR0IgZXhjbHVzaXZlIGFyZSBnaXZlbiBhIGRpc2sgCisgKglnZW9tZXRyeSBvZiAxMjggaGVhZHMgYW5kIDMyIHNlY3RvcnMsIGFuZCBkcml2ZXMgYWJvdmUgMiBHQiBpbmNsdXNpdmUgCisgKglhcmUgZ2l2ZW4gYSBkaXNrIGdlb21ldHJ5IG9mIDI1NSBoZWFkcyBhbmQgNjMgc2VjdG9ycy4gIEhvd2V2ZXIsIGlmIAorICoJdGhlIEJJT1MgZGV0ZWN0cyB0aGF0IHRoZSBFeHRlbmRlZCBUcmFuc2xhdGlvbiBzZXR0aW5nIGRvZXMgbm90IG1hdGNoIAorICoJdGhlIGdlb21ldHJ5IGluIHRoZSBwYXJ0aXRpb24gdGFibGUsIHRoZW4gdGhlIHRyYW5zbGF0aW9uIGluZmVycmVkIAorICoJZnJvbSB0aGUgcGFydGl0aW9uIHRhYmxlIHdpbGwgYmUgdXNlZCBieSB0aGUgQklPUywgYW5kIGEgd2FybmluZyBtYXkgCisgKgliZSBkaXNwbGF5ZWQuCisgKi8KKyAKK3N0YXRpYyBpbnQgYWFjX2Jpb3NwYXJtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKmdlb20pCit7CisJc3RydWN0IGRpc2twYXJtICpwYXJhbSA9IChzdHJ1Y3QgZGlza3Bhcm0gKilnZW9tOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworCWRwcmludGsoKEtFUk5fREVCVUcgImFhY19iaW9zcGFybS5cbiIpKTsKKworCS8qCisJICoJQXNzdW1pbmcgZXh0ZW5kZWQgdHJhbnNsYXRpb24gaXMgZW5hYmxlZCAtICNSRVZJU0lUIworCSAqLworCWlmIChjYXBhY2l0eSA+PSAyICogMTAyNCAqIDEwMjQpIHsgLyogMSBHQiBpbiA1MTIgYnl0ZSBzZWN0b3JzICovCisJCWlmKGNhcGFjaXR5ID49IDQgKiAxMDI0ICogMTAyNCkgeyAvKiAyIEdCIGluIDUxMiBieXRlIHNlY3RvcnMgKi8KKwkJCXBhcmFtLT5oZWFkcyA9IDI1NTsKKwkJCXBhcmFtLT5zZWN0b3JzID0gNjM7CisJCX0gZWxzZSB7CisJCQlwYXJhbS0+aGVhZHMgPSAxMjg7CisJCQlwYXJhbS0+c2VjdG9ycyA9IDMyOworCQl9CisJfSBlbHNlIHsKKwkJcGFyYW0tPmhlYWRzID0gNjQ7CisJCXBhcmFtLT5zZWN0b3JzID0gMzI7CisJfQorCisJcGFyYW0tPmN5bGluZGVycyA9IGNhcF90b19jeWxzKGNhcGFjaXR5LCBwYXJhbS0+aGVhZHMgKiBwYXJhbS0+c2VjdG9ycyk7CisKKwkvKiAKKwkgKglSZWFkIHRoZSBmaXJzdCAxMDI0IGJ5dGVzIGZyb20gdGhlIGRpc2sgZGV2aWNlLCBpZiB0aGUgYm9vdAorCSAqCXNlY3RvciBwYXJ0aXRpb24gdGFibGUgaXMgdmFsaWQsIHNlYXJjaCBmb3IgYSBwYXJ0aXRpb24gdGFibGUKKwkgKgllbnRyeSB3aG9zZSBlbmRfaGVhZCBtYXRjaGVzIG9uZSBvZiB0aGUgc3RhbmRhcmQgZ2VvbWV0cnkgCisJICoJdHJhbnNsYXRpb25zICggNjQvMzIsIDEyOC8zMiwgMjU1LzYzICkuCisJICovCisJYnVmID0gc2NzaV9iaW9zX3B0YWJsZShiZGV2KTsKKwlpZigqKHVuc2lnbmVkIHNob3J0ICopKGJ1ZiArIDB4NDApID09IGNwdV90b19sZTE2KDB4YWE1NSkpIHsKKwkJc3RydWN0IHBhcnRpdGlvbiAqZmlyc3QgPSAoc3RydWN0IHBhcnRpdGlvbiAqIClidWY7CisJCXN0cnVjdCBwYXJ0aXRpb24gKmVudHJ5ID0gZmlyc3Q7CisJCWludCBzYXZlZF9jeWxpbmRlcnMgPSBwYXJhbS0+Y3lsaW5kZXJzOworCQlpbnQgbnVtOworCQl1bnNpZ25lZCBjaGFyIGVuZF9oZWFkLCBlbmRfc2VjOworCisJCWZvcihudW0gPSAwOyBudW0gPCA0OyBudW0rKykgeworCQkJZW5kX2hlYWQgPSBlbnRyeS0+ZW5kX2hlYWQ7CisJCQllbmRfc2VjID0gZW50cnktPmVuZF9zZWN0b3IgJiAweDNmOworCisJCQlpZihlbmRfaGVhZCA9PSA2MykgeworCQkJCXBhcmFtLT5oZWFkcyA9IDY0OworCQkJCXBhcmFtLT5zZWN0b3JzID0gMzI7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYoZW5kX2hlYWQgPT0gMTI3KSB7CisJCQkJcGFyYW0tPmhlYWRzID0gMTI4OworCQkJCXBhcmFtLT5zZWN0b3JzID0gMzI7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYoZW5kX2hlYWQgPT0gMjU0KSB7CisJCQkJcGFyYW0tPmhlYWRzID0gMjU1OworCQkJCXBhcmFtLT5zZWN0b3JzID0gNjM7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbnRyeSsrOworCQl9CisKKwkJaWYgKG51bSA9PSA0KSB7CisJCQllbmRfaGVhZCA9IGZpcnN0LT5lbmRfaGVhZDsKKwkJCWVuZF9zZWMgPSBmaXJzdC0+ZW5kX3NlY3RvciAmIDB4M2Y7CisJCX0KKworCQlwYXJhbS0+Y3lsaW5kZXJzID0gY2FwX3RvX2N5bHMoY2FwYWNpdHksIHBhcmFtLT5oZWFkcyAqIHBhcmFtLT5zZWN0b3JzKTsKKwkJaWYgKG51bSA8IDQgJiYgZW5kX3NlYyA9PSBwYXJhbS0+c2VjdG9ycykgeworCQkJaWYgKHBhcmFtLT5jeWxpbmRlcnMgIT0gc2F2ZWRfY3lsaW5kZXJzKQorCQkJCWRwcmludGsoKEtFUk5fREVCVUcgIkFkb3B0aW5nIGdlb21ldHJ5OiBoZWFkcz0lZCwgc2VjdG9ycz0lZCBmcm9tIHBhcnRpdGlvbiB0YWJsZSAlZC5cbiIsCisJCQkJCXBhcmFtLT5oZWFkcywgcGFyYW0tPnNlY3RvcnMsIG51bSkpOworCQl9IGVsc2UgaWYgKGVuZF9oZWFkID4gMCB8fCBlbmRfc2VjID4gMCkgeworCQkJZHByaW50aygoS0VSTl9ERUJVRyAiU3RyYW5nZSBnZW9tZXRyeTogaGVhZHM9JWQsIHNlY3RvcnM9JWQgaW4gcGFydGl0aW9uIHRhYmxlICVkLlxuIiwKKwkJCQllbmRfaGVhZCArIDEsIGVuZF9zZWMsIG51bSkpOworCQkJZHByaW50aygoS0VSTl9ERUJVRyAiVXNpbmcgZ2VvbWV0cnk6IGhlYWRzPSVkLCBzZWN0b3JzPSVkLlxuIiwKKwkJCQkJcGFyYW0tPmhlYWRzLCBwYXJhbS0+c2VjdG9ycykpOworCQl9CisJfQorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYWFjX3NsYXZlX2NvbmZpZ3VyZQkJLQljb21wdXRlIHF1ZXVlIGRlcHRocworICoJQHNkZXY6CVNDU0kgZGV2aWNlIHdlIGFyZSBjb25zaWRlcmluZworICoKKyAqCVNlbGVjdHMgcXVldWUgZGVwdGhzIGZvciBlYWNoIHRhcmdldCBkZXZpY2UgYmFzZWQgb24gdGhlIGhvc3QgYWRhcHRlcidzCisgKgl0b3RhbCBjYXBhY2l0eSBhbmQgdGhlIHF1ZXVlIGRlcHRoIHN1cHBvcnRlZCBieSB0aGUgdGFyZ2V0IGRldmljZS4KKyAqCUEgcXVldWUgZGVwdGggb2Ygb25lIGF1dG9tYXRpY2FsbHkgZGlzYWJsZXMgdGFnZ2VkIHF1ZXVlaW5nLgorICovCisKK3N0YXRpYyBpbnQgYWFjX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJaWYgKHNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQpCisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIE1TR19PUkRFUkVEX1RBRywgMTI4KTsKKwllbHNlCisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIDAsIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFhY19pb2N0bChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKQoreworCXN0cnVjdCBhYWNfZGV2ICpkZXYgPSAoc3RydWN0IGFhY19kZXYgKilzZGV2LT5ob3N0LT5ob3N0ZGF0YTsKKwlyZXR1cm4gYWFjX2RvX2lvY3RsKGRldiwgY21kLCBhcmcpOworfQorCisvKgorICogWFhYOiBkb2VzIGFhYyByZWFsbHkgbmVlZCBubyBlcnJvciBoYW5kbGluZz8/CisgKi8KK3N0YXRpYyBpbnQgYWFjX2VoX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlyZXR1cm4gRkFJTEVEOworfQorCisvKgorICoJYWFjX2VoX3Jlc2V0CS0gUmVzZXQgY29tbWFuZCBoYW5kbGluZworICoJQHNjc2lfY21kOglTQ1NJIGNvbW1hbmQgYmxvY2sgY2F1c2luZyB0aGUgcmVzZXQKKyAqCisgKi8KK3N0YXRpYyBpbnQgYWFjX2VoX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQqIGNtZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiBkZXYgPSBjbWQtPmRldmljZTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICogaG9zdCA9IGRldi0+aG9zdDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICogY29tbWFuZDsKKwlpbnQgY291bnQ7CisJc3RydWN0IGFhY19kZXYgKiBhYWM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IEhvc3QgYWRhcHRlciByZXNldCByZXF1ZXN0LiBTQ1NJIGhhbmcgP1xuIiwgCisJCQkJCUFBQ19EUklWRVJOQU1FKTsKKworCisJYWFjID0gKHN0cnVjdCBhYWNfZGV2ICopaG9zdC0+aG9zdGRhdGE7CisJaWYgKGFhY19hZGFwdGVyX2NoZWNrX2hlYWx0aChhYWMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEhvc3QgYWRhcHRlciBhcHBlYXJzIGRlYWRcbiIsIAorCQkJCUFBQ19EUklWRVJOQU1FKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qCisJICogV2FpdCBmb3IgYWxsIGNvbW1hbmRzIHRvIGNvbXBsZXRlIHRvIHRoaXMgc3BlY2lmaWMKKwkgKiB0YXJnZXQgKGJsb2NrIG1heGltdW0gNjAgc2Vjb25kcykuCisJICovCisJZm9yIChjb3VudCA9IDYwOyBjb3VudDsgLS1jb3VudCkgeworCQlpbnQgYWN0aXZlID0gMDsKKwkJX19zaG9zdF9mb3JfZWFjaF9kZXZpY2UoZGV2LCBob3N0KSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5saXN0X2xvY2ssIGZsYWdzKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoY29tbWFuZCwgJmRldi0+Y21kX2xpc3QsIGxpc3QpIHsKKwkJCQlpZiAoY29tbWFuZC0+c2VyaWFsX251bWJlcikgeworCQkJCQlhY3RpdmUrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5saXN0X2xvY2ssIGZsYWdzKTsKKwkJCWlmIChhY3RpdmUpCisJCQkJYnJlYWs7CisKKwkJfQorCQkvKgorCQkgKiBXZSBjYW4gZXhpdCBJZiBhbGwgdGhlIGNvbW1hbmRzIGFyZSBjb21wbGV0ZQorCQkgKi8KKwkJaWYgKGFjdGl2ZSA9PSAwKQorCQkJcmV0dXJuIFNVQ0NFU1M7CisJCXNwaW5fdW5sb2NrX2lycShob3N0LT5ob3N0X2xvY2spOworCQlzc2xlZXAoMSk7CisJCXNwaW5fbG9ja19pcnEoaG9zdC0+aG9zdF9sb2NrKTsKKwl9CisJcHJpbnRrKEtFUk5fRVJSICIlczogU0NTSSBidXMgYXBwZWFycyBodW5nXG4iLCBBQUNfRFJJVkVSTkFNRSk7CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKKy8qKgorICoJYWFjX2NmZ19vcGVuCQktCW9wZW4gYSBjb25maWd1cmF0aW9uIGZpbGUKKyAqCUBpbm9kZTogaW5vZGUgYmVpbmcgb3BlbmVkCisgKglAZmlsZTogZmlsZSBoYW5kbGUgYXR0YWNoZWQKKyAqCisgKglDYWxsZWQgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBkZXZpY2UgaXMgb3BlbmVkLiBEb2VzIHRoZSBuZWVkZWQKKyAqCXNldCB1cCBvbiB0aGUgaGFuZGxlIGFuZCB0aGVuIHJldHVybnMKKyAqCisgKglCdWdzOiBUaGlzIG5lZWRzIGV4dGVuZGluZyB0byBjaGVjayBhIGdpdmVuIGFkYXB0ZXIgaXMgcHJlc2VudAorICoJc28gd2UgY2FuIHN1cHBvcnQgaG90IHBsdWdnaW5nLCBhbmQgdG8gcmVmIGNvdW50IGFkYXB0ZXJzLgorICovCisKK3N0YXRpYyBpbnQgYWFjX2NmZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBhYWNfZGV2ICphYWM7CisJdW5zaWduZWQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCWludCBlcnIgPSAtRU5PREVWOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhYWMsICZhYWNfZGV2aWNlcywgZW50cnkpIHsKKwkJaWYgKGFhYy0+aWQgPT0gbWlub3IpIHsKKwkJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGFhYzsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqCWFhY19jZmdfaW9jdGwJCS0JQUFDIGNvbmZpZ3VyYXRpb24gcmVxdWVzdAorICoJQGlub2RlOiBpbm9kZSBvZiBkZXZpY2UKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZQorICoJQGNtZDogaW9jdGwgY29tbWFuZCBjb2RlCisgKglAYXJnOiBhcmd1bWVudAorICoKKyAqCUhhbmRsZXMgYSBjb25maWd1cmF0aW9uIGlvY3RsLiBDdXJyZW50bHkgdGhpcyBpbnZvbHZlcyB3cmFwcGluZyBpdAorICoJdXAgYW5kIGZlZWRpbmcgaXQgaW50byB0aGUgbmFzdHkgd2luZG93c2FsaWtlIGdsdWUgbGF5ZXIuCisgKgorICoJQnVnczogTmVlZHMgbG9ja2luZyBhZ2FpbnN0IHBhcmFsbGVsIGlvY3RscyBsb3dlciBkb3duCisgKglCdWdzOiBOZWVkcyB0byBoYW5kbGUgaG90IHBsdWdnaW5nCisgKi8KKyAKK3N0YXRpYyBpbnQgYWFjX2NmZ19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCAgc3RydWN0IGZpbGUgKmZpbGUsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBhYWNfZG9faW9jdGwoZmlsZS0+cHJpdmF0ZV9kYXRhLCBjbWQsICh2b2lkIF9fdXNlciAqKWFyZyk7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyBhYWNfY29tcGF0X2RvX2lvY3RsKHN0cnVjdCBhYWNfZGV2ICpkZXYsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJbG9uZyByZXQ7CisJbG9ja19rZXJuZWwoKTsKKwlzd2l0Y2ggKGNtZCkgeyAKKwljYXNlIEZTQUNUTF9NSU5JUE9SVF9SRVZfQ0hFQ0s6CisJY2FzZSBGU0FDVExfU0VOREZJQjoKKwljYXNlIEZTQUNUTF9PUEVOX0dFVF9BREFQVEVSX0ZJQjoKKwljYXNlIEZTQUNUTF9DTE9TRV9HRVRfQURBUFRFUl9GSUI6CisJY2FzZSBGU0FDVExfU0VORF9SQVdfU1JCOgorCWNhc2UgRlNBQ1RMX0dFVF9QQ0lfSU5GTzoKKwljYXNlIEZTQUNUTF9RVUVSWV9ESVNLOgorCWNhc2UgRlNBQ1RMX0RFTEVURV9ESVNLOgorCWNhc2UgRlNBQ1RMX0ZPUkNFX0RFTEVURV9ESVNLOgorCWNhc2UgRlNBQ1RMX0dFVF9DT05UQUlORVJTOiAKKwkJcmV0ID0gYWFjX2RvX2lvY3RsKGRldiwgY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgRlNBQ1RMX0dFVF9ORVhUX0FEQVBURVJfRklCOiB7CisJCXN0cnVjdCBmaWJfaW9jdGwgX191c2VyICpmOworCQkKKwkJZiA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqZikpOworCQlyZXQgPSAwOworCQlpZiAoY2xlYXJfdXNlcihmLCBzaXplb2YoKmYpICE9IHNpemVvZigqZikpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfaW5fdXNlcihmLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihzdHJ1Y3QgZmliX2lvY3RsKSAtIHNpemVvZih1MzIpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWlmICghcmV0KQorCQkJcmV0ID0gYWFjX2RvX2lvY3RsKGRldiwgY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PSU9DVExDTUQ7IAorCQlicmVhazsKKwl9IAorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFhY19jb21wYXRfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBhYWNfZGV2ICpkZXYgPSAoc3RydWN0IGFhY19kZXYgKilzZGV2LT5ob3N0LT5ob3N0ZGF0YTsKKwlyZXR1cm4gYWFjX2NvbXBhdF9kb19pb2N0bChkZXYsIGNtZCwgKHVuc2lnbmVkIGxvbmcpYXJnKTsKK30KKworc3RhdGljIGxvbmcgYWFjX2NvbXBhdF9jZmdfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIGFhY19jb21wYXRfZG9faW9jdGwoKHN0cnVjdCBhYWNfZGV2ICopZmlsZS0+cHJpdmF0ZV9kYXRhLCBjbWQsIGFyZyk7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWFjX2NmZ19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW9jdGwJCT0gYWFjX2NmZ19pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCAgID0gYWFjX2NvbXBhdF9jZmdfaW9jdGwsCisjZW5kaWYKKwkub3BlbgkJPSBhYWNfY2ZnX29wZW4sCit9OworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBhYWNfZHJpdmVyX3RlbXBsYXRlID0geworCS5tb2R1bGUJCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZSAgICAgICAgICAgCQk9ICJBQUMiLAorCS5wcm9jX25hbWUJCQk9ICJhYWNyYWlkIiwKKwkuaW5mbyAgICAgICAgICAgCQk9IGFhY19pbmZvLAorCS5pb2N0bCAgICAgICAgICAJCT0gYWFjX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsCQkJPSBhYWNfY29tcGF0X2lvY3RsLAorI2VuZGlmCisJLnF1ZXVlY29tbWFuZCAgIAkJPSBhYWNfcXVldWVjb21tYW5kLAorCS5iaW9zX3BhcmFtICAgICAJCT0gYWFjX2Jpb3NwYXJtLAkKKwkuc2xhdmVfY29uZmlndXJlCQk9IGFhY19zbGF2ZV9jb25maWd1cmUsCisJLmVoX2Fib3J0X2hhbmRsZXIJCT0gYWFjX2VoX2Fib3J0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJCT0gYWFjX2VoX3Jlc2V0LAorCS5jYW5fcXVldWUgICAgICAJCT0gQUFDX05VTV9JT19GSUIsCQorCS50aGlzX2lkICAgICAgICAJCT0gMTYsCisJLnNnX3RhYmxlc2l6ZSAgIAkJPSAxNiwKKwkubWF4X3NlY3RvcnMgICAgCQk9IDEyOCwKKyNpZiAoQUFDX05VTV9JT19GSUIgPiAyNTYpCisJLmNtZF9wZXJfbHVuCQkJPSAyNTYsCisjZWxzZQkJCisJLmNtZF9wZXJfbHVuICAgIAkJPSBBQUNfTlVNX0lPX0ZJQiwgCisjZW5kaWYJCisJLnVzZV9jbHVzdGVyaW5nCQkJPSBFTkFCTEVfQ0xVU1RFUklORywKK307CisKKworc3RhdGljIGludCBfX2RldmluaXQgYWFjX3Byb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXVuc2lnbmVkIGluZGV4ID0gaWQtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXN0cnVjdCBhYWNfZGV2ICphYWM7CisJc3RydWN0IGxpc3RfaGVhZCAqaW5zZXJ0ID0gJmFhY19kZXZpY2VzOworCWludCBlcnJvciA9IC1FTk9ERVY7CisJaW50IHVuaXF1ZV9pZCA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFhYywgJmFhY19kZXZpY2VzLCBlbnRyeSkgeworCQlpZiAoYWFjLT5pZCA+IHVuaXF1ZV9pZCkKKwkJCWJyZWFrOworCQlpbnNlcnQgPSAmYWFjLT5lbnRyeTsKKwkJdW5pcXVlX2lkKys7CisJfQorCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlnb3RvIG91dDsKKworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4RkZGRkZGRkZVTEwpIHx8IAorCQkJcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIDB4RkZGRkZGRkZVTEwpKQorCQlnb3RvIG91dDsKKwkvKgorCSAqIElmIHRoZSBxdWlyazMxIGJpdCBpcyBzZXQsIHRoZSBhZGFwdGVyIG5lZWRzIGFkYXB0ZXIKKwkgKiB0byBkcml2ZXIgY29tbXVuaWNhdGlvbiBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkIGJlbG93IDJnaWcKKwkgKi8KKwlpZiAoYWFjX2RyaXZlcnNbaW5kZXhdLnF1aXJrcyAmIEFBQ19RVUlSS18zMUJJVCkgCisJCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4N0ZGRkZGRkZVTEwpIHx8CisJCQkJcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIDB4N0ZGRkZGRkZVTEwpKQorCQkJZ290byBvdXQ7CisJCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlzaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmYWFjX2RyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBhYWNfZGV2KSk7CisJaWYgKCFzaG9zdCkKKwkJZ290byBvdXRfZGlzYWJsZV9wZGV2OworCisJc2hvc3QtPmlycSA9IHBkZXYtPmlycTsKKwlzaG9zdC0+YmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlzaG9zdC0+dW5pcXVlX2lkID0gdW5pcXVlX2lkOworCisJYWFjID0gKHN0cnVjdCBhYWNfZGV2ICopc2hvc3QtPmhvc3RkYXRhOworCWFhYy0+c2NzaV9ob3N0X3B0ciA9IHNob3N0OwkKKwlhYWMtPnBkZXYgPSBwZGV2OworCWFhYy0+bmFtZSA9IGFhY19kcml2ZXJfdGVtcGxhdGUubmFtZTsKKwlhYWMtPmlkID0gc2hvc3QtPnVuaXF1ZV9pZDsKKwlhYWMtPmNhcmR0eXBlID0gIGluZGV4OworCUlOSVRfTElTVF9IRUFEKCZhYWMtPmVudHJ5KTsKKworCWFhYy0+ZmlicyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmaWIpICogQUFDX05VTV9GSUIsIEdGUF9LRVJORUwpOworCWlmICghYWFjLT5maWJzKQorCQlnb3RvIG91dF9mcmVlX2hvc3Q7CisJc3Bpbl9sb2NrX2luaXQoJmFhYy0+ZmliX2xvY2spOworCisJaWYgKCgqYWFjX2RyaXZlcnNbaW5kZXhdLmluaXQpKGFhYykpCisJCWdvdG8gb3V0X2ZyZWVfZmliczsKKworCS8qCisJICogSWYgd2UgaGFkIHNldCBhIHNtYWxsZXIgRE1BIG1hc2sgZWFybGllciwgc2V0IGl0IHRvIDRnaWcKKwkgKiBub3cgc2luY2UgdGhlIGFkYXB0ZXIgY2FuIGRtYSBkYXRhIHRvIGF0IGxlYXN0IGEgNGdpZworCSAqIGFkZHJlc3Mgc3BhY2UuCisJICovCisJaWYgKGFhY19kcml2ZXJzW2luZGV4XS5xdWlya3MgJiBBQUNfUVVJUktfMzFCSVQpCisJCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4RkZGRkZGRkZVTEwpKQorCQkJZ290byBvdXRfZnJlZV9maWJzOworCisJYWFjX2dldF9hZGFwdGVyX2luZm8oYWFjKTsKKworCS8qCisJICogbWF4IGNoYW5uZWwgd2lsbCBiZSB0aGUgcGh5c2ljYWwgY2hhbm5lbHMgcGx1cyAxIHZpcnR1YWwgY2hhbm5lbAorCSAqIGFsbCBjb250YWluZXJzIGFyZSBvbiB0aGUgdmlydHVhbCBjaGFubmVsIDAKKwkgKiBwaHlzaWNhbCBjaGFubmVscyBhcmUgYWRkcmVzcyBieSB0aGVpciBhY3R1YWwgcGh5c2ljYWwgbnVtYmVyKzEKKwkgKi8KKwlpZiAoYWFjLT5ub25kYXNkX3N1cHBvcnQgPT0gMSkKKwkJc2hvc3QtPm1heF9jaGFubmVsID0gYWFjX2RyaXZlcnNbaW5kZXhdLmNoYW5uZWxzKzE7CisJZWxzZQorCQlzaG9zdC0+bWF4X2NoYW5uZWwgPSAxOworCisJYWFjX2dldF9jb25maWdfc3RhdHVzKGFhYyk7CisJYWFjX2dldF9jb250YWluZXJzKGFhYyk7CisJbGlzdF9hZGQoJmFhYy0+ZW50cnksIGluc2VydCk7CisKKwlzaG9zdC0+bWF4X2lkID0gYWFjLT5tYXhpbXVtX251bV9jb250YWluZXJzOworCWlmIChzaG9zdC0+bWF4X2lkIDwgTUFYSU1VTV9OVU1fQ09OVEFJTkVSUykKKwkJc2hvc3QtPm1heF9pZCA9IE1BWElNVU1fTlVNX0NPTlRBSU5FUlM7CisJZWxzZQorCQlzaG9zdC0+dGhpc19pZCA9IHNob3N0LT5tYXhfaWQ7CisKKwkvKgorCSAqIGRtYiAtIHdlIG1heSBuZWVkIHRvIG1vdmUgdGhlIHNldHRpbmcgb2YgdGhlc2UgcGFybXMgc29tZXdoZXJlIGVsc2Ugb25jZQorCSAqIHdlIGdldCBhIGZpYiB0aGF0IGNhbiByZXBvcnQgdGhlIGFjdHVhbCBudW1iZXJzCisJICovCisJc2hvc3QtPm1heF9sdW4gPSBBQUNfTUFYX0xVTjsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBzaG9zdCk7CisKKwllcnJvciA9IHNjc2lfYWRkX2hvc3Qoc2hvc3QsICZwZGV2LT5kZXYpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfZGVpbml0OworCXNjc2lfc2Nhbl9ob3N0KHNob3N0KTsKKworCXJldHVybiAwOworCitvdXRfZGVpbml0OgorCWtpbGxfcHJvYyhhYWMtPnRocmVhZF9waWQsIFNJR0tJTEwsIDApOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFhYy0+YWlmX2NvbXBsZXRpb24pOworCisJYWFjX3NlbmRfc2h1dGRvd24oYWFjKTsKKwlmaWJfbWFwX2ZyZWUoYWFjKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGFhYy0+cGRldiwgYWFjLT5jb21tX3NpemUsIGFhYy0+Y29tbV9hZGRyLCBhYWMtPmNvbW1fcGh5cyk7CisJa2ZyZWUoYWFjLT5xdWV1ZXMpOworCWZyZWVfaXJxKHBkZXYtPmlycSwgYWFjKTsKKwlpb3VubWFwKGFhYy0+cmVncy5zYSk7Cisgb3V0X2ZyZWVfZmliczoKKwlrZnJlZShhYWMtPmZpYnMpOworCWtmcmVlKGFhYy0+ZnNhX2Rldik7Cisgb3V0X2ZyZWVfaG9zdDoKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKKyBvdXRfZGlzYWJsZV9wZGV2OgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKyBvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWFjX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGFhY19kZXYgKmFhYyA9IChzdHJ1Y3QgYWFjX2RldiAqKXNob3N0LT5ob3N0ZGF0YTsKKworCXNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpOworCisJa2lsbF9wcm9jKGFhYy0+dGhyZWFkX3BpZCwgU0lHS0lMTCwgMCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmYWFjLT5haWZfY29tcGxldGlvbik7CisKKwlhYWNfc2VuZF9zaHV0ZG93bihhYWMpOworCWZpYl9tYXBfZnJlZShhYWMpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWFjLT5wZGV2LCBhYWMtPmNvbW1fc2l6ZSwgYWFjLT5jb21tX2FkZHIsCisJCQlhYWMtPmNvbW1fcGh5cyk7CisJa2ZyZWUoYWFjLT5xdWV1ZXMpOworCisJZnJlZV9pcnEocGRldi0+aXJxLCBhYWMpOworCWlvdW5tYXAoYWFjLT5yZWdzLnNhKTsKKwkKKwlrZnJlZShhYWMtPmZpYnMpOworCQorCWxpc3RfZGVsKCZhYWMtPmVudHJ5KTsKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhYWNfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBBQUNfRFJJVkVSTkFNRSwKKwkuaWRfdGFibGUJPSBhYWNfcGNpX3RibCwKKwkucHJvYmUJCT0gYWFjX3Byb2JlX29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFhY19yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFhY19pbml0KHZvaWQpCit7CisJaW50IGVycm9yOworCQorCXByaW50ayhLRVJOX0lORk8gIlJlZCBIYXQvQWRhcHRlYyBhYWNyYWlkIGRyaXZlciAoJXMgJXMpXG4iLAorCQkJQUFDX0RSSVZFUl9WRVJTSU9OLCBBQUNfRFJJVkVSX0JVSUxEX0RBVEUpOworCisJZXJyb3IgPSBwY2lfbW9kdWxlX2luaXQoJmFhY19wY2lfZHJpdmVyKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWFhY19jZmdfbWFqb3IgPSByZWdpc3Rlcl9jaHJkZXYoIDAsICJhYWMiLCAmYWFjX2NmZ19mb3BzKTsKKwlpZiAoYWFjX2NmZ19tYWpvciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgImFhY3JhaWQ6IHVuYWJsZSB0byByZWdpc3RlciBcImFhY1wiIGRldmljZS5cbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFhY19leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9jaHJkZXYoYWFjX2NmZ19tYWpvciwgImFhYyIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWFjX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhYWNfaW5pdCk7Cittb2R1bGVfZXhpdChhYWNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9ya3QuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3JrdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOGVkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9ya3QuYwpAQCAtMCwwICsxLDQ0MCBAQAorLyoKKyAqCUFkYXB0ZWMgQUFDIHNlcmllcyBSQUlEIGNvbnRyb2xsZXIgZHJpdmVyCisgKgkoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMuCTxhbGFuQHJlZGhhdC5jb20+CisgKgorICogYmFzZWQgb24gdGhlIG9sZCBhYWNyYWlkIGRyaXZlciB0aGF0IGlzLi4KKyAqIEFkYXB0ZWMgYWFjcmFpZCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgQWRhcHRlYywgSW5jLiAoYWFjcmFpZEBhZGFwdGVjLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIE1vZHVsZSBOYW1lOgorICogIHJrdC5jCisgKgorICogQWJzdHJhY3Q6IEhhcmR3YXJlIG1pbmlwb3J0IGZvciBEcmF3YnJpZGdlIHNwZWNpZmljIGhhcmR3YXJlIGZ1bmN0aW9ucy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNpbmNsdWRlICJhYWNyYWlkLmgiCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhYWNfcmt0X2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYWFjX2RldiAqZGV2ID0gZGV2X2lkOworCXVuc2lnbmVkIGxvbmcgYmVsbGJpdHM7CisJdTggaW50c3RhdCwgbWFzazsKKwlpbnRzdGF0ID0gcmt0X3JlYWRiKGRldiwgTVVuaXQuT0lTUik7CisJLyoKKwkgKglSZWFkIG1hc2sgYW5kIGludmVydCBiZWNhdXNlIGRyYXdicmlkZ2UgaXMgcmV2ZXJzZWQuCisJICoJVGhpcyBhbGxvd3MgdXMgdG8gb25seSBzZXJ2aWNlIGludGVycnVwdHMgdGhhdCBoYXZlIAorCSAqCWJlZW4gZW5hYmxlZC4KKwkgKi8KKwltYXNrID0gfihkZXYtPk9JTVIpOworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIG91ciBpbnRlcnJ1cHQuICBJZiBpdCBpc24ndCBqdXN0IHJldHVybiAqLworCWlmIChpbnRzdGF0ICYgbWFzaykgCisJeworCQliZWxsYml0cyA9IHJrdF9yZWFkbChkZXYsIE91dGJvdW5kRG9vcmJlbGxSZWcpOworCQlpZiAoYmVsbGJpdHMgJiBEb29yQmVsbFByaW50ZlJlYWR5KSB7CisJCQlhYWNfcHJpbnRmKGRldiwgcmt0X3JlYWRsKGRldiwgSW5kZXhSZWdzLk1haWxib3hbNV0pKTsKKwkJCXJrdF93cml0ZWwoZGV2LCBNVW5pdC5PRFIsRG9vckJlbGxQcmludGZSZWFkeSk7CisJCQlya3Rfd3JpdGVsKGRldiwgSW5ib3VuZERvb3JiZWxsUmVnLERvb3JCZWxsUHJpbnRmRG9uZSk7CisJCX0KKwkJZWxzZSBpZiAoYmVsbGJpdHMgJiBEb29yQmVsbEFkYXB0ZXJOb3JtQ21kUmVhZHkpIHsKKwkJCXJrdF93cml0ZWwoZGV2LCBNVW5pdC5PRFIsIERvb3JCZWxsQWRhcHRlck5vcm1DbWRSZWFkeSk7CisJCQlhYWNfY29tbWFuZF9ub3JtYWwoJmRldi0+cXVldWVzLT5xdWV1ZVtIb3N0Tm9ybUNtZFF1ZXVlXSk7CisJCX0KKwkJZWxzZSBpZiAoYmVsbGJpdHMgJiBEb29yQmVsbEFkYXB0ZXJOb3JtUmVzcFJlYWR5KSB7CisJCQlhYWNfcmVzcG9uc2Vfbm9ybWFsKCZkZXYtPnF1ZXVlcy0+cXVldWVbSG9zdE5vcm1SZXNwUXVldWVdKTsKKwkJCXJrdF93cml0ZWwoZGV2LCBNVW5pdC5PRFIsRG9vckJlbGxBZGFwdGVyTm9ybVJlc3BSZWFkeSk7CisJCX0KKwkJZWxzZSBpZiAoYmVsbGJpdHMgJiBEb29yQmVsbEFkYXB0ZXJOb3JtQ21kTm90RnVsbCkgeworCQkJcmt0X3dyaXRlbChkZXYsIE1Vbml0Lk9EUiwgRG9vckJlbGxBZGFwdGVyTm9ybUNtZE5vdEZ1bGwpOworCQl9CisJCWVsc2UgaWYgKGJlbGxiaXRzICYgRG9vckJlbGxBZGFwdGVyTm9ybVJlc3BOb3RGdWxsKSB7CisJCQlya3Rfd3JpdGVsKGRldiwgTVVuaXQuT0RSLCBEb29yQmVsbEFkYXB0ZXJOb3JtQ21kTm90RnVsbCk7CisJCQlya3Rfd3JpdGVsKGRldiwgTVVuaXQuT0RSLCBEb29yQmVsbEFkYXB0ZXJOb3JtUmVzcE5vdEZ1bGwpOworCQl9CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJcmV0dXJuIElSUV9OT05FOworfQorCisvKioKKyAqCXJrdF9zeW5jX2NtZAktCXNlbmQgYSBjb21tYW5kIGFuZCB3YWl0CisgKglAZGV2OiBBZGFwdGVyCisgKglAY29tbWFuZDogQ29tbWFuZCB0byBleGVjdXRlCisgKglAcDE6IGZpcnN0IHBhcmFtZXRlcgorICoJQHJldDogYWRhcHRlciBzdGF0dXMKKyAqCisgKglUaGlzIHJvdXRpbmUgd2lsbCBzZW5kIGEgc3luY2hyb25vdXMgY29tbWFuZCB0byB0aGUgYWRhcHRlciBhbmQgd2FpdCAKKyAqCWZvciBpdHMJY29tcGxldGlvbi4KKyAqLworCitzdGF0aWMgaW50IHJrdF9zeW5jX2NtZChzdHJ1Y3QgYWFjX2RldiAqZGV2LCB1MzIgY29tbWFuZCwgdTMyIHAxLCB1MzIgKnN0YXR1cykKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCWludCBvazsKKwkvKgorCSAqCVdyaXRlIHRoZSBjb21tYW5kIGludG8gTWFpbGJveCAwCisJICovCisJcmt0X3dyaXRlbChkZXYsIEluYm91bmRNYWlsYm94MCwgY29tbWFuZCk7CisJLyoKKwkgKglXcml0ZSB0aGUgcGFyYW1ldGVycyBpbnRvIE1haWxib3hlcyAxIC0gNAorCSAqLworCXJrdF93cml0ZWwoZGV2LCBJbmJvdW5kTWFpbGJveDEsIHAxKTsKKwlya3Rfd3JpdGVsKGRldiwgSW5ib3VuZE1haWxib3gyLCAwKTsKKwlya3Rfd3JpdGVsKGRldiwgSW5ib3VuZE1haWxib3gzLCAwKTsKKwlya3Rfd3JpdGVsKGRldiwgSW5ib3VuZE1haWxib3g0LCAwKTsKKwkvKgorCSAqCUNsZWFyIHRoZSBzeW5jaCBjb21tYW5kIGRvb3JiZWxsIHRvIHN0YXJ0IG9uIGEgY2xlYW4gc2xhdGUuCisJICovCisJcmt0X3dyaXRlbChkZXYsIE91dGJvdW5kRG9vcmJlbGxSZWcsIE9VVEJPVU5ERE9PUkJFTExfMCk7CisJLyoKKwkgKglEaXNhYmxlIGRvb3JiZWxsIGludGVycnVwdHMKKwkgKi8KKwlya3Rfd3JpdGViKGRldiwgTVVuaXQuT0lNUiwgZGV2LT5PSU1SID0gMHhmZik7CisJLyoKKwkgKglGb3JjZSB0aGUgY29tcGxldGlvbiBvZiB0aGUgbWFzayByZWdpc3RlciB3cml0ZSBiZWZvcmUgaXNzdWluZworCSAqCXRoZSBpbnRlcnJ1cHQuCisJICovCisJcmt0X3JlYWRiIChkZXYsIE1Vbml0Lk9JTVIpOworCS8qCisJICoJU2lnbmFsIHRoYXQgdGhlcmUgaXMgYSBuZXcgc3luY2ggY29tbWFuZAorCSAqLworCXJrdF93cml0ZWwoZGV2LCBJbmJvdW5kRG9vcmJlbGxSZWcsIElOQk9VTkRET09SQkVMTF8wKTsKKworCW9rID0gMDsKKwlzdGFydCA9IGppZmZpZXM7CisKKwkvKgorCSAqCVdhaXQgdXAgdG8gMzAgc2Vjb25kcworCSAqLworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBzdGFydCszMCpIWikpIAorCXsKKwkJdWRlbGF5KDUpOwkvKiBEZWxheSA1IG1pY3Jvc2Vjb25kcyB0byBsZXQgTW9uOTYwIGdldCBpbmZvLiAqLworCQkvKgorCQkgKglNb245NjAgd2lsbCBzZXQgZG9vcmJlbGwwIGJpdCB3aGVuIGl0IGhhcyBjb21wbGV0ZWQgdGhlIGNvbW1hbmQuCisJCSAqLworCQlpZiAocmt0X3JlYWRsKGRldiwgT3V0Ym91bmREb29yYmVsbFJlZykgJiBPVVRCT1VORERPT1JCRUxMXzApIHsKKwkJCS8qCisJCQkgKglDbGVhciB0aGUgZG9vcmJlbGwuCisJCQkgKi8KKwkJCXJrdF93cml0ZWwoZGV2LCBPdXRib3VuZERvb3JiZWxsUmVnLCBPVVRCT1VORERPT1JCRUxMXzApOworCQkJb2sgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJLyoKKwkJICoJWWllbGQgdGhlIHByb2Nlc3NvciBpbiBjYXNlIHdlIGFyZSBzbG93IAorCQkgKi8KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKwlpZiAob2sgIT0gMSkgeworCQkvKgorCQkgKglSZXN0b3JlIGludGVycnVwdCBtYXNrIGV2ZW4gdGhvdWdoIHdlIHRpbWVkIG91dAorCQkgKi8KKwkJcmt0X3dyaXRlYihkZXYsIE1Vbml0Lk9JTVIsIGRldi0+T0lNUiA9IDB4ZmIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisJLyoKKwkgKglQdWxsIHRoZSBzeW5jaCBzdGF0dXMgZnJvbSBNYWlsYm94IDAuCisJICovCisJaWYgKHN0YXR1cykKKwkJKnN0YXR1cyA9IHJrdF9yZWFkbChkZXYsIEluZGV4UmVncy5NYWlsYm94WzBdKTsKKwkvKgorCSAqCUNsZWFyIHRoZSBzeW5jaCBjb21tYW5kIGRvb3JiZWxsLgorCSAqLworCXJrdF93cml0ZWwoZGV2LCBPdXRib3VuZERvb3JiZWxsUmVnLCBPVVRCT1VORERPT1JCRUxMXzApOworCS8qCisJICoJUmVzdG9yZSBpbnRlcnJ1cHQgbWFzaworCSAqLworCXJrdF93cml0ZWIoZGV2LCBNVW5pdC5PSU1SLCBkZXYtPk9JTVIgPSAweGZiKTsKKwlyZXR1cm4gMDsKKworfQorCisvKioKKyAqCWFhY19ya3RfaW50ZXJydXB0X2FkYXB0ZXIJLQlpbnRlcnJ1cHQgYWRhcHRlcgorICoJQGRldjogQWRhcHRlcgorICoKKyAqCVNlbmQgYW4gaW50ZXJydXB0IHRvIHRoZSBpOTYwIGFuZCBicmVha3BvaW50IGl0LgorICovCisKK3N0YXRpYyB2b2lkIGFhY19ya3RfaW50ZXJydXB0X2FkYXB0ZXIoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwl1MzIgcmV0OworCXJrdF9zeW5jX2NtZChkZXYsIEJSRUFLUE9JTlRfUkVRVUVTVCwgMCwgJnJldCk7Cit9CisKKy8qKgorICoJYWFjX3JrdF9ub3RpZnlfYWRhcHRlcgkJLQlzZW5kIGFuIGV2ZW50IHRvIHRoZSBhZGFwdGVyCisgKglAZGV2OiBBZGFwdGVyCisgKglAZXZlbnQ6IEV2ZW50IHRvIHNlbmQKKyAqCisgKglOb3RpZnkgdGhlIGk5NjAgdGhhdCBzb21ldGhpbmcgaXQgcHJvYmFibHkgY2FyZXMgYWJvdXQgaGFzCisgKgloYXBwZW5lZC4KKyAqLworCitzdGF0aWMgdm9pZCBhYWNfcmt0X25vdGlmeV9hZGFwdGVyKHN0cnVjdCBhYWNfZGV2ICpkZXYsIHUzMiBldmVudCkKK3sKKwlzd2l0Y2ggKGV2ZW50KSB7CisKKwljYXNlIEFkYXBOb3JtQ21kUXVlOgorCQlya3Rfd3JpdGVsKGRldiwgTVVuaXQuSURSLElOQk9VTkRET09SQkVMTF8xKTsKKwkJYnJlYWs7CisJY2FzZSBIb3N0Tm9ybVJlc3BOb3RGdWxsOgorCQlya3Rfd3JpdGVsKGRldiwgTVVuaXQuSURSLElOQk9VTkRET09SQkVMTF80KTsKKwkJYnJlYWs7CisJY2FzZSBBZGFwTm9ybVJlc3BRdWU6CisJCXJrdF93cml0ZWwoZGV2LCBNVW5pdC5JRFIsSU5CT1VORERPT1JCRUxMXzIpOworCQlicmVhazsKKwljYXNlIEhvc3ROb3JtQ21kTm90RnVsbDoKKwkJcmt0X3dyaXRlbChkZXYsIE1Vbml0LklEUixJTkJPVU5ERE9PUkJFTExfMyk7CisJCWJyZWFrOworCWNhc2UgSG9zdFNodXRkb3duOgorLy8JCXJrdF9zeW5jX2NtZChkZXYsIEhPU1RfQ1JBU0hJTkcsIDAsIDAsIDAsIDAsICZyZXQpOworCQlicmVhazsKKwljYXNlIEZhc3RJbzoKKwkJcmt0X3dyaXRlbChkZXYsIE1Vbml0LklEUixJTkJPVU5ERE9PUkJFTExfNik7CisJCWJyZWFrOworCWNhc2UgQWRhcFByaW50ZkRvbmU6CisJCXJrdF93cml0ZWwoZGV2LCBNVW5pdC5JRFIsSU5CT1VORERPT1JCRUxMXzUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqCWFhY19ya3Rfc3RhcnRfYWRhcHRlcgkJLQlhY3RpdmF0ZSBhZGFwdGVyCisgKglAZGV2OglBZGFwdGVyCisgKgorICoJU3RhcnQgdXAgcHJvY2Vzc2luZyBvbiBhbiBpOTYwIGJhc2VkIEFBQyBhZGFwdGVyCisgKi8KKworc3RhdGljIHZvaWQgYWFjX3JrdF9zdGFydF9hZGFwdGVyKHN0cnVjdCBhYWNfZGV2ICpkZXYpCit7CisJdTMyIHN0YXR1czsKKwlzdHJ1Y3QgYWFjX2luaXQgKmluaXQ7CisKKwlpbml0ID0gZGV2LT5pbml0OworCWluaXQtPkhvc3RFbGFwc2VkU2Vjb25kcyA9IGNwdV90b19sZTMyKGdldF9zZWNvbmRzKCkpOworCS8qCisJICoJVGVsbCB0aGUgYWRhcHRlciB3ZSBhcmUgYmFjayBhbmQgdXAgYW5kIHJ1bm5pbmcgc28gaXQgd2lsbCBzY2FuCisJICoJaXRzIGNvbW1hbmQgcXVldWVzIGFuZCBlbmFibGUgb3VyIGludGVycnVwdHMKKwkgKi8KKwlkZXYtPmlycV9tYXNrID0gKERvb3JCZWxsUHJpbnRmUmVhZHkgfCBPVVRCT1VORERPT1JCRUxMXzEgfCBPVVRCT1VORERPT1JCRUxMXzIgfCBPVVRCT1VORERPT1JCRUxMXzMgfCBPVVRCT1VORERPT1JCRUxMXzQpOworCS8qCisJICoJRmlyc3QgY2xlYXIgb3V0IGFsbCBpbnRlcnJ1cHRzLiAgVGhlbiBlbmFibGUgdGhlIG9uZSdzIHRoYXQgd2UKKwkgKgljYW4gaGFuZGxlLgorCSAqLworCXJrdF93cml0ZWIoZGV2LCBNVW5pdC5PSU1SLCAweGZmKTsKKwlya3Rfd3JpdGVsKGRldiwgTVVuaXQuT0RSLCAweGZmZmZmZmZmKTsKKy8vCXJrdF93cml0ZWIoZGV2LCBNVW5pdC5PSU1SLCB+KHU4KU9VVEJPVU5EX0RPT1JCRUxMX0lOVEVSUlVQVF9NQVNLKTsKKwlya3Rfd3JpdGViKGRldiwgTVVuaXQuT0lNUiwgZGV2LT5PSU1SID0gMHhmYik7CisKKwkvLyBXZSBjYW4gb25seSB1c2UgYSAzMiBiaXQgYWRkcmVzcyBoZXJlCisJcmt0X3N5bmNfY21kKGRldiwgSU5JVF9TVFJVQ1RfQkFTRV9BRERSRVNTLCAodTMyKSh1bG9uZylkZXYtPmluaXRfcGEsICZzdGF0dXMpOworfQorCisvKioKKyAqCWFhY19ya3RfY2hlY2tfaGVhbHRoCisgKglAZGV2OiBkZXZpY2UgdG8gY2hlY2sgaWYgaGVhbHRoeQorICoKKyAqCVdpbGwgYXR0ZW1wdCB0byBkZXRlcm1pbmUgaWYgdGhlIHNwZWNpZmllZCBhZGFwdGVyIGlzIGFsaXZlIGFuZAorICoJY2FwYWJsZSBvZiBoYW5kbGluZyByZXF1ZXN0cywgcmV0dXJuaW5nIDAgaWYgYWxpdmUuCisgKi8KK3N0YXRpYyBpbnQgYWFjX3JrdF9jaGVja19oZWFsdGgoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwl1MzIgc3RhdHVzID0gcmt0X3JlYWRsKGRldiwgTVVuaXQuT01SeFswXSk7CisKKwkvKgorCSAqCUNoZWNrIHRvIHNlZSBpZiB0aGUgYm9hcmQgZmFpbGVkIGFueSBzZWxmIHRlc3RzLgorCSAqLworCWlmIChzdGF0dXMgJiBTRUxGX1RFU1RfRkFJTEVEKQorCQlyZXR1cm4gLTE7CisJLyoKKwkgKglDaGVjayB0byBzZWUgaWYgdGhlIGJvYXJkIHBhbmljJ2QuCisJICovCisJaWYgKHN0YXR1cyAmIEtFUk5FTF9QQU5JQykgeworCQljaGFyICogYnVmZmVyOworCQlzdHJ1Y3QgUE9TVFNUQVRVUyB7CisJCQl1MzIgUG9zdF9Db21tYW5kOworCQkJdTMyIFBvc3RfQWRkcmVzczsKKwkJfSAqIHBvc3Q7CisJCWRtYV9hZGRyX3QgcGFkZHIsIGJhZGRyOworCQlpbnQgcmV0OworCisJCWlmICgoc3RhdHVzICYgMHhGRjAwMDAwMEwpID09IDB4QkMwMDAwMDBMKQorCQkJcmV0dXJuIChzdGF0dXMgPj4gMTYpICYgMHhGRjsKKwkJYnVmZmVyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCA1MTIsICZiYWRkcik7CisJCXJldCA9IC0yOworCQlpZiAoYnVmZmVyID09IE5VTEwpCisJCQlyZXR1cm4gcmV0OworCQlwb3N0ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LAorCQkgIHNpemVvZihzdHJ1Y3QgUE9TVFNUQVRVUyksICZwYWRkcik7CisJCWlmIChwb3N0ID09IE5VTEwpIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCA1MTIsIGJ1ZmZlciwgYmFkZHIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorICAgICAgICAgICAgICAgIG1lbXNldChidWZmZXIsIDAsIDUxMik7CisJCXBvc3QtPlBvc3RfQ29tbWFuZCA9IGNwdV90b19sZTMyKENPTU1BTkRfUE9TVF9SRVNVTFRTKTsKKyAgICAgICAgICAgICAgICBwb3N0LT5Qb3N0X0FkZHJlc3MgPSBjcHVfdG9fbGUzMihiYWRkcik7CisgICAgICAgICAgICAgICAgcmt0X3dyaXRlbChkZXYsIE1Vbml0LklNUnhbMF0sIHBhZGRyKTsKKyAgICAgICAgICAgICAgICBya3Rfc3luY19jbWQoZGV2LCBDT01NQU5EX1BPU1RfUkVTVUxUUywgYmFkZHIsICZzdGF0dXMpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgc2l6ZW9mKHN0cnVjdCBQT1NUU1RBVFVTKSwKKwkJICBwb3N0LCBwYWRkcik7CisgICAgICAgICAgICAgICAgaWYgKChidWZmZXJbMF0gPT0gJzAnKSAmJiAoYnVmZmVyWzFdID09ICd4JykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IChidWZmZXJbMl0gPD0gJzknKSA/IChidWZmZXJbMl0gLSAnMCcpIDogKGJ1ZmZlclsyXSAtICdBJyArIDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA8PD0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCArPSAoYnVmZmVyWzNdIDw9ICc5JykgPyAoYnVmZmVyWzNdIC0gJzAnKSA6IChidWZmZXJbM10gLSAnQScgKyAxMCk7CisgICAgICAgICAgICAgICAgfQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgNTEyLCBidWZmZXIsIGJhZGRyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisJLyoKKwkgKglXYWl0IGZvciB0aGUgYWRhcHRlciB0byBiZSB1cCBhbmQgcnVubmluZy4KKwkgKi8KKwlpZiAoIShzdGF0dXMgJiBLRVJORUxfVVBfQU5EX1JVTk5JTkcpKQorCQlyZXR1cm4gLTM7CisJLyoKKwkgKglFdmVyeXRoaW5nIGlzIE9LCisJICovCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYWFjX3JrdF9pbml0CS0JaW5pdGlhbGl6ZSBhbiBpOTYwIGJhc2VkIEFBQyBjYXJkCisgKglAZGV2OiBkZXZpY2UgdG8gY29uZmlndXJlCisgKgorICoJQWxsb2NhdGUgYW5kIHNldCB1cCByZXNvdXJjZXMgZm9yIHRoZSBpOTYwIGJhc2VkIEFBQyB2YXJpYW50cy4gVGhlIAorICoJZGV2aWNlX2ludGVyZmFjZSBpbiB0aGUgY29tbXJlZ2lvbiB3aWxsIGJlIGFsbG9jYXRlZCBhbmQgbGlua2VkIAorICoJdG8gdGhlIGNvbW0gcmVnaW9uLgorICovCisKK2ludCBhYWNfcmt0X2luaXQoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCWludCBpbnN0YW5jZTsKKwljb25zdCBjaGFyICogbmFtZTsKKworCWluc3RhbmNlID0gZGV2LT5pZDsKKwluYW1lICAgICA9IGRldi0+bmFtZTsKKworCS8qCisJICoJTWFwIGluIHRoZSByZWdpc3RlcnMgZnJvbSB0aGUgYWRhcHRlci4KKwkgKi8KKwlpZigoZGV2LT5yZWdzLnJrdCA9IGlvcmVtYXAoKHVuc2lnbmVkIGxvbmcpZGV2LT5zY3NpX2hvc3RfcHRyLT5iYXNlLCA4MTkyKSk9PU5VTEwpCisJewkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjcmFpZDogdW5hYmxlIHRvIG1hcCBpOTYwLlxuIiApOworCQlnb3RvIGVycm9yX2lvdW5tYXA7CisJfQorCS8qCisJICoJQ2hlY2sgdG8gc2VlIGlmIHRoZSBib2FyZCBmYWlsZWQgYW55IHNlbGYgdGVzdHMuCisJICovCisJaWYgKHJrdF9yZWFkbChkZXYsIE1Vbml0Lk9NUnhbMF0pICYgU0VMRl9URVNUX0ZBSUxFRCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzJWQ6IGFkYXB0ZXIgc2VsZi10ZXN0IGZhaWxlZC5cbiIsIGRldi0+bmFtZSwgaW5zdGFuY2UpOworCQlnb3RvIGVycm9yX2lvdW5tYXA7CisJfQorCS8qCisJICoJQ2hlY2sgdG8gc2VlIGlmIHRoZSBtb25pdG9yIHBhbmljJ2Qgd2hpbGUgYm9vdGluZy4KKwkgKi8KKwlpZiAocmt0X3JlYWRsKGRldiwgTVVuaXQuT01SeFswXSkgJiBNT05JVE9SX1BBTklDKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMlZDogYWRhcHRlciBtb25pdG9yIHBhbmljLlxuIiwgZGV2LT5uYW1lLCBpbnN0YW5jZSk7CisJCWdvdG8gZXJyb3JfaW91bm1hcDsKKwl9CisJLyoKKwkgKglDaGVjayB0byBzZWUgaWYgdGhlIGJvYXJkIHBhbmljJ2Qgd2hpbGUgYm9vdGluZy4KKwkgKi8KKwlpZiAocmt0X3JlYWRsKGRldiwgTVVuaXQuT01SeFswXSkgJiBLRVJORUxfUEFOSUMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyVkOiBhZGFwdGVyIGtlcm5lbCBwYW5pYydkLlxuIiwgZGV2LT5uYW1lLCBpbnN0YW5jZSk7CisJCWdvdG8gZXJyb3JfaW91bm1hcDsKKwl9CisJc3RhcnQgPSBqaWZmaWVzOworCS8qCisJICoJV2FpdCBmb3IgdGhlIGFkYXB0ZXIgdG8gYmUgdXAgYW5kIHJ1bm5pbmcuIFdhaXQgdXAgdG8gMyBtaW51dGVzCisJICovCisJd2hpbGUgKCEocmt0X3JlYWRsKGRldiwgTVVuaXQuT01SeFswXSkgJiBLRVJORUxfVVBfQU5EX1JVTk5JTkcpKQorCXsKKwkJaWYodGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCsxODAqSFopKQorCQl7CisJCQlzdGF0dXMgPSBya3RfcmVhZGwoZGV2LCBNVW5pdC5PTVJ4WzBdKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXMlZDogYWRhcHRlciBrZXJuZWwgZmFpbGVkIHRvIHN0YXJ0LCBpbml0IHN0YXR1cyA9ICVseC5cbiIsIAorCQkJCQlkZXYtPm5hbWUsIGluc3RhbmNlLCBzdGF0dXMpOworCQkJZ290byBlcnJvcl9pb3VubWFwOworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisJaWYgKHJlcXVlc3RfaXJxKGRldi0+c2NzaV9ob3N0X3B0ci0+aXJxLCBhYWNfcmt0X2ludHIsIFNBX1NISVJRfFNBX0lOVEVSUlVQVCwgImFhY3JhaWQiLCAodm9pZCAqKWRldik8MCkgCisJeworCQlwcmludGsoS0VSTl9FUlIgIiVzJWQ6IEludGVycnVwdCB1bmF2YWlsYWJsZS5cbiIsIG5hbWUsIGluc3RhbmNlKTsKKwkJZ290byBlcnJvcl9pb3VubWFwOworCX0KKwkvKgorCSAqCUZpbGwgaW4gdGhlIGZ1bmN0aW9uIGRpc3BhdGNoIHRhYmxlLgorCSAqLworCWRldi0+YV9vcHMuYWRhcHRlcl9pbnRlcnJ1cHQgPSBhYWNfcmt0X2ludGVycnVwdF9hZGFwdGVyOworCWRldi0+YV9vcHMuYWRhcHRlcl9ub3RpZnkgPSBhYWNfcmt0X25vdGlmeV9hZGFwdGVyOworCWRldi0+YV9vcHMuYWRhcHRlcl9zeW5jX2NtZCA9IHJrdF9zeW5jX2NtZDsKKwlkZXYtPmFfb3BzLmFkYXB0ZXJfY2hlY2tfaGVhbHRoID0gYWFjX3JrdF9jaGVja19oZWFsdGg7CisKKwlpZiAoYWFjX2luaXRfYWRhcHRlcihkZXYpID09IE5VTEwpCisJCWdvdG8gZXJyb3JfaXJxOworCS8qCisJICoJU3RhcnQgYW55IGtlcm5lbCB0aHJlYWRzIG5lZWRlZAorCSAqLworCWRldi0+dGhyZWFkX3BpZCA9IGtlcm5lbF90aHJlYWQoKGludCAoKikodm9pZCAqKSlhYWNfY29tbWFuZF90aHJlYWQsIGRldiwgMCk7CisJaWYoZGV2LT50aHJlYWRfcGlkIDwgMCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiYWFjcmFpZDogVW5hYmxlIHRvIGNyZWF0ZSBya3QgdGhyZWFkLlxuIik7CisJCWdvdG8gZXJyb3Jfa2ZyZWU7CisJfQkKKwkvKgorCSAqCVRlbGwgdGhlIGFkYXB0ZXIgdGhhdCBhbGwgaXMgY29uZmlndXJlZCwgYW5kIGl0IGNhbiBzdGFydAorCSAqCWFjY2VwdGluZyByZXF1ZXN0cworCSAqLworCWFhY19ya3Rfc3RhcnRfYWRhcHRlcihkZXYpOworCXJldHVybiAwOworCitlcnJvcl9rZnJlZToKKwlrZnJlZShkZXYtPnF1ZXVlcyk7CisKK2Vycm9yX2lycToKKwlmcmVlX2lycShkZXYtPnNjc2lfaG9zdF9wdHItPmlycSwgKHZvaWQgKilkZXYpOworCitlcnJvcl9pb3VubWFwOgorCWlvdW5tYXAoZGV2LT5yZWdzLnJrdCk7CisKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9yeC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvcnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzBiOTllCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvcnguYwpAQCAtMCwwICsxLDQ0MSBAQAorLyoKKyAqCUFkYXB0ZWMgQUFDIHNlcmllcyBSQUlEIGNvbnRyb2xsZXIgZHJpdmVyCisgKgkoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMuCTxhbGFuQHJlZGhhdC5jb20+CisgKgorICogYmFzZWQgb24gdGhlIG9sZCBhYWNyYWlkIGRyaXZlciB0aGF0IGlzLi4KKyAqIEFkYXB0ZWMgYWFjcmFpZCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgQWRhcHRlYywgSW5jLiAoYWFjcmFpZEBhZGFwdGVjLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIE1vZHVsZSBOYW1lOgorICogIHJ4LmMKKyAqCisgKiBBYnN0cmFjdDogSGFyZHdhcmUgbWluaXBvcnQgZm9yIERyYXdicmlkZ2Ugc3BlY2lmaWMgaGFyZHdhcmUgZnVuY3Rpb25zLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2luY2x1ZGUgImFhY3JhaWQuaCIKKworc3RhdGljIGlycXJldHVybl90IGFhY19yeF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGFhY19kZXYgKmRldiA9IGRldl9pZDsKKwl1bnNpZ25lZCBsb25nIGJlbGxiaXRzOworCXU4IGludHN0YXQsIG1hc2s7CisJaW50c3RhdCA9IHJ4X3JlYWRiKGRldiwgTVVuaXQuT0lTUik7CisJLyoKKwkgKglSZWFkIG1hc2sgYW5kIGludmVydCBiZWNhdXNlIGRyYXdicmlkZ2UgaXMgcmV2ZXJzZWQuCisJICoJVGhpcyBhbGxvd3MgdXMgdG8gb25seSBzZXJ2aWNlIGludGVycnVwdHMgdGhhdCBoYXZlIAorCSAqCWJlZW4gZW5hYmxlZC4KKwkgKi8KKwltYXNrID0gfihkZXYtPk9JTVIpOworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIG91ciBpbnRlcnJ1cHQuICBJZiBpdCBpc24ndCBqdXN0IHJldHVybiAqLworCWlmIChpbnRzdGF0ICYgbWFzaykgCisJeworCQliZWxsYml0cyA9IHJ4X3JlYWRsKGRldiwgT3V0Ym91bmREb29yYmVsbFJlZyk7CisJCWlmIChiZWxsYml0cyAmIERvb3JCZWxsUHJpbnRmUmVhZHkpIHsKKwkJCWFhY19wcmludGYoZGV2LCBsZTMyX3RvX2NwdShyeF9yZWFkbCAoZGV2LCBJbmRleFJlZ3MuTWFpbGJveFs1XSkpKTsKKwkJCXJ4X3dyaXRlbChkZXYsIE1Vbml0Lk9EUixEb29yQmVsbFByaW50ZlJlYWR5KTsKKwkJCXJ4X3dyaXRlbChkZXYsIEluYm91bmREb29yYmVsbFJlZyxEb29yQmVsbFByaW50ZkRvbmUpOworCQl9CisJCWVsc2UgaWYgKGJlbGxiaXRzICYgRG9vckJlbGxBZGFwdGVyTm9ybUNtZFJlYWR5KSB7CisJCQlyeF93cml0ZWwoZGV2LCBNVW5pdC5PRFIsIERvb3JCZWxsQWRhcHRlck5vcm1DbWRSZWFkeSk7CisJCQlhYWNfY29tbWFuZF9ub3JtYWwoJmRldi0+cXVldWVzLT5xdWV1ZVtIb3N0Tm9ybUNtZFF1ZXVlXSk7CisJCX0KKwkJZWxzZSBpZiAoYmVsbGJpdHMgJiBEb29yQmVsbEFkYXB0ZXJOb3JtUmVzcFJlYWR5KSB7CisJCQlhYWNfcmVzcG9uc2Vfbm9ybWFsKCZkZXYtPnF1ZXVlcy0+cXVldWVbSG9zdE5vcm1SZXNwUXVldWVdKTsKKwkJCXJ4X3dyaXRlbChkZXYsIE1Vbml0Lk9EUixEb29yQmVsbEFkYXB0ZXJOb3JtUmVzcFJlYWR5KTsKKwkJfQorCQllbHNlIGlmIChiZWxsYml0cyAmIERvb3JCZWxsQWRhcHRlck5vcm1DbWROb3RGdWxsKSB7CisJCQlyeF93cml0ZWwoZGV2LCBNVW5pdC5PRFIsIERvb3JCZWxsQWRhcHRlck5vcm1DbWROb3RGdWxsKTsKKwkJfQorCQllbHNlIGlmIChiZWxsYml0cyAmIERvb3JCZWxsQWRhcHRlck5vcm1SZXNwTm90RnVsbCkgeworCQkJcnhfd3JpdGVsKGRldiwgTVVuaXQuT0RSLCBEb29yQmVsbEFkYXB0ZXJOb3JtQ21kTm90RnVsbCk7CisJCQlyeF93cml0ZWwoZGV2LCBNVW5pdC5PRFIsIERvb3JCZWxsQWRhcHRlck5vcm1SZXNwTm90RnVsbCk7CisJCX0KKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKKy8qKgorICoJcnhfc3luY19jbWQJLQlzZW5kIGEgY29tbWFuZCBhbmQgd2FpdAorICoJQGRldjogQWRhcHRlcgorICoJQGNvbW1hbmQ6IENvbW1hbmQgdG8gZXhlY3V0ZQorICoJQHAxOiBmaXJzdCBwYXJhbWV0ZXIKKyAqCUByZXQ6IGFkYXB0ZXIgc3RhdHVzCisgKgorICoJVGhpcyByb3V0aW5lIHdpbGwgc2VuZCBhIHN5bmNocm9ub3VzIGNvbW1hbmQgdG8gdGhlIGFkYXB0ZXIgYW5kIHdhaXQgCisgKglmb3IgaXRzCWNvbXBsZXRpb24uCisgKi8KKworc3RhdGljIGludCByeF9zeW5jX2NtZChzdHJ1Y3QgYWFjX2RldiAqZGV2LCB1MzIgY29tbWFuZCwgdTMyIHAxLCB1MzIgKnN0YXR1cykKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCWludCBvazsKKwkvKgorCSAqCVdyaXRlIHRoZSBjb21tYW5kIGludG8gTWFpbGJveCAwCisJICovCisJcnhfd3JpdGVsKGRldiwgSW5ib3VuZE1haWxib3gwLCBjb21tYW5kKTsKKwkvKgorCSAqCVdyaXRlIHRoZSBwYXJhbWV0ZXJzIGludG8gTWFpbGJveGVzIDEgLSA0CisJICovCisJcnhfd3JpdGVsKGRldiwgSW5ib3VuZE1haWxib3gxLCBwMSk7CisJcnhfd3JpdGVsKGRldiwgSW5ib3VuZE1haWxib3gyLCAwKTsKKwlyeF93cml0ZWwoZGV2LCBJbmJvdW5kTWFpbGJveDMsIDApOworCXJ4X3dyaXRlbChkZXYsIEluYm91bmRNYWlsYm94NCwgMCk7CisJLyoKKwkgKglDbGVhciB0aGUgc3luY2ggY29tbWFuZCBkb29yYmVsbCB0byBzdGFydCBvbiBhIGNsZWFuIHNsYXRlLgorCSAqLworCXJ4X3dyaXRlbChkZXYsIE91dGJvdW5kRG9vcmJlbGxSZWcsIE9VVEJPVU5ERE9PUkJFTExfMCk7CisJLyoKKwkgKglEaXNhYmxlIGRvb3JiZWxsIGludGVycnVwdHMKKwkgKi8KKwlyeF93cml0ZWIoZGV2LCBNVW5pdC5PSU1SLCBkZXYtPk9JTVIgfD0gMHgwNCk7CisJLyoKKwkgKglGb3JjZSB0aGUgY29tcGxldGlvbiBvZiB0aGUgbWFzayByZWdpc3RlciB3cml0ZSBiZWZvcmUgaXNzdWluZworCSAqCXRoZSBpbnRlcnJ1cHQuCisJICovCisJcnhfcmVhZGIgKGRldiwgTVVuaXQuT0lNUik7CisJLyoKKwkgKglTaWduYWwgdGhhdCB0aGVyZSBpcyBhIG5ldyBzeW5jaCBjb21tYW5kCisJICovCisJcnhfd3JpdGVsKGRldiwgSW5ib3VuZERvb3JiZWxsUmVnLCBJTkJPVU5ERE9PUkJFTExfMCk7CisKKwlvayA9IDA7CisJc3RhcnQgPSBqaWZmaWVzOworCisJLyoKKwkgKglXYWl0IHVwIHRvIDMwIHNlY29uZHMKKwkgKi8KKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgc3RhcnQrMzAqSFopKSAKKwl7CisJCXVkZWxheSg1KTsJLyogRGVsYXkgNSBtaWNyb3NlY29uZHMgdG8gbGV0IE1vbjk2MCBnZXQgaW5mby4gKi8KKwkJLyoKKwkJICoJTW9uOTYwIHdpbGwgc2V0IGRvb3JiZWxsMCBiaXQgd2hlbiBpdCBoYXMgY29tcGxldGVkIHRoZSBjb21tYW5kLgorCQkgKi8KKwkJaWYgKHJ4X3JlYWRsKGRldiwgT3V0Ym91bmREb29yYmVsbFJlZykgJiBPVVRCT1VORERPT1JCRUxMXzApIHsKKwkJCS8qCisJCQkgKglDbGVhciB0aGUgZG9vcmJlbGwuCisJCQkgKi8KKwkJCXJ4X3dyaXRlbChkZXYsIE91dGJvdW5kRG9vcmJlbGxSZWcsIE9VVEJPVU5ERE9PUkJFTExfMCk7CisJCQlvayA9IDE7CisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKglZaWVsZCB0aGUgcHJvY2Vzc29yIGluIGNhc2Ugd2UgYXJlIHNsb3cgCisJCSAqLworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfQorCWlmIChvayAhPSAxKSB7CisJCS8qCisJCSAqCVJlc3RvcmUgaW50ZXJydXB0IG1hc2sgZXZlbiB0aG91Z2ggd2UgdGltZWQgb3V0CisJCSAqLworCQlyeF93cml0ZWIoZGV2LCBNVW5pdC5PSU1SLCBkZXYtPk9JTVIgJj0gMHhmYik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKwkvKgorCSAqCVB1bGwgdGhlIHN5bmNoIHN0YXR1cyBmcm9tIE1haWxib3ggMC4KKwkgKi8KKwlpZiAoc3RhdHVzKQorCQkqc3RhdHVzID0gcnhfcmVhZGwoZGV2LCBJbmRleFJlZ3MuTWFpbGJveFswXSk7CisJLyoKKwkgKglDbGVhciB0aGUgc3luY2ggY29tbWFuZCBkb29yYmVsbC4KKwkgKi8KKwlyeF93cml0ZWwoZGV2LCBPdXRib3VuZERvb3JiZWxsUmVnLCBPVVRCT1VORERPT1JCRUxMXzApOworCS8qCisJICoJUmVzdG9yZSBpbnRlcnJ1cHQgbWFzaworCSAqLworCXJ4X3dyaXRlYihkZXYsIE1Vbml0Lk9JTVIsIGRldi0+T0lNUiAmPSAweGZiKTsKKwlyZXR1cm4gMDsKKworfQorCisvKioKKyAqCWFhY19yeF9pbnRlcnJ1cHRfYWRhcHRlcgktCWludGVycnVwdCBhZGFwdGVyCisgKglAZGV2OiBBZGFwdGVyCisgKgorICoJU2VuZCBhbiBpbnRlcnJ1cHQgdG8gdGhlIGk5NjAgYW5kIGJyZWFrcG9pbnQgaXQuCisgKi8KKworc3RhdGljIHZvaWQgYWFjX3J4X2ludGVycnVwdF9hZGFwdGVyKHN0cnVjdCBhYWNfZGV2ICpkZXYpCit7CisJdTMyIHJldDsKKwlyeF9zeW5jX2NtZChkZXYsIEJSRUFLUE9JTlRfUkVRVUVTVCwgMCwgJnJldCk7Cit9CisKKy8qKgorICoJYWFjX3J4X25vdGlmeV9hZGFwdGVyCQktCXNlbmQgYW4gZXZlbnQgdG8gdGhlIGFkYXB0ZXIKKyAqCUBkZXY6IEFkYXB0ZXIKKyAqCUBldmVudDogRXZlbnQgdG8gc2VuZAorICoKKyAqCU5vdGlmeSB0aGUgaTk2MCB0aGF0IHNvbWV0aGluZyBpdCBwcm9iYWJseSBjYXJlcyBhYm91dCBoYXMKKyAqCWhhcHBlbmVkLgorICovCisKK3N0YXRpYyB2b2lkIGFhY19yeF9ub3RpZnlfYWRhcHRlcihzdHJ1Y3QgYWFjX2RldiAqZGV2LCB1MzIgZXZlbnQpCit7CisJc3dpdGNoIChldmVudCkgeworCisJY2FzZSBBZGFwTm9ybUNtZFF1ZToKKwkJcnhfd3JpdGVsKGRldiwgTVVuaXQuSURSLElOQk9VTkRET09SQkVMTF8xKTsKKwkJYnJlYWs7CisJY2FzZSBIb3N0Tm9ybVJlc3BOb3RGdWxsOgorCQlyeF93cml0ZWwoZGV2LCBNVW5pdC5JRFIsSU5CT1VORERPT1JCRUxMXzQpOworCQlicmVhazsKKwljYXNlIEFkYXBOb3JtUmVzcFF1ZToKKwkJcnhfd3JpdGVsKGRldiwgTVVuaXQuSURSLElOQk9VTkRET09SQkVMTF8yKTsKKwkJYnJlYWs7CisJY2FzZSBIb3N0Tm9ybUNtZE5vdEZ1bGw6CisJCXJ4X3dyaXRlbChkZXYsIE1Vbml0LklEUixJTkJPVU5ERE9PUkJFTExfMyk7CisJCWJyZWFrOworCWNhc2UgSG9zdFNodXRkb3duOgorLy8JCXJ4X3N5bmNfY21kKGRldiwgSE9TVF9DUkFTSElORywgMCwgMCwgMCwgMCwgJnJldCk7CisJCWJyZWFrOworCWNhc2UgRmFzdElvOgorCQlyeF93cml0ZWwoZGV2LCBNVW5pdC5JRFIsSU5CT1VORERPT1JCRUxMXzYpOworCQlicmVhazsKKwljYXNlIEFkYXBQcmludGZEb25lOgorCQlyeF93cml0ZWwoZGV2LCBNVW5pdC5JRFIsSU5CT1VORERPT1JCRUxMXzUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqCWFhY19yeF9zdGFydF9hZGFwdGVyCQktCWFjdGl2YXRlIGFkYXB0ZXIKKyAqCUBkZXY6CUFkYXB0ZXIKKyAqCisgKglTdGFydCB1cCBwcm9jZXNzaW5nIG9uIGFuIGk5NjAgYmFzZWQgQUFDIGFkYXB0ZXIKKyAqLworCitzdGF0aWMgdm9pZCBhYWNfcnhfc3RhcnRfYWRhcHRlcihzdHJ1Y3QgYWFjX2RldiAqZGV2KQoreworCXUzMiBzdGF0dXM7CisJc3RydWN0IGFhY19pbml0ICppbml0OworCisJaW5pdCA9IGRldi0+aW5pdDsKKwlpbml0LT5Ib3N0RWxhcHNlZFNlY29uZHMgPSBjcHVfdG9fbGUzMihnZXRfc2Vjb25kcygpKTsKKwkvKgorCSAqCVRlbGwgdGhlIGFkYXB0ZXIgd2UgYXJlIGJhY2sgYW5kIHVwIGFuZCBydW5uaW5nIHNvIGl0IHdpbGwgc2NhbgorCSAqCWl0cyBjb21tYW5kIHF1ZXVlcyBhbmQgZW5hYmxlIG91ciBpbnRlcnJ1cHRzCisJICovCisJZGV2LT5pcnFfbWFzayA9IChEb29yQmVsbFByaW50ZlJlYWR5IHwgT1VUQk9VTkRET09SQkVMTF8xIHwgT1VUQk9VTkRET09SQkVMTF8yIHwgT1VUQk9VTkRET09SQkVMTF8zIHwgT1VUQk9VTkRET09SQkVMTF80KTsKKwkvKgorCSAqCUZpcnN0IGNsZWFyIG91dCBhbGwgaW50ZXJydXB0cy4gIFRoZW4gZW5hYmxlIHRoZSBvbmUncyB0aGF0IHdlCisJICoJY2FuIGhhbmRsZS4KKwkgKi8KKwlyeF93cml0ZWIoZGV2LCBNVW5pdC5PSU1SLCAweGZmKTsKKwlyeF93cml0ZWwoZGV2LCBNVW5pdC5PRFIsIDB4ZmZmZmZmZmYpOworLy8Jcnhfd3JpdGViKGRldiwgTVVuaXQuT0lNUiwgfih1OClPVVRCT1VORF9ET09SQkVMTF9JTlRFUlJVUFRfTUFTSyk7CisJcnhfd3JpdGViKGRldiwgTVVuaXQuT0lNUiwgZGV2LT5PSU1SID0gMHhmYik7CisKKwkvLyBXZSBjYW4gb25seSB1c2UgYSAzMiBiaXQgYWRkcmVzcyBoZXJlCisJcnhfc3luY19jbWQoZGV2LCBJTklUX1NUUlVDVF9CQVNFX0FERFJFU1MsICh1MzIpKHVsb25nKWRldi0+aW5pdF9wYSwgJnN0YXR1cyk7Cit9CisKKy8qKgorICoJYWFjX3J4X2NoZWNrX2hlYWx0aAorICoJQGRldjogZGV2aWNlIHRvIGNoZWNrIGlmIGhlYWx0aHkKKyAqCisgKglXaWxsIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZWQgYWRhcHRlciBpcyBhbGl2ZSBhbmQKKyAqCWNhcGFibGUgb2YgaGFuZGxpbmcgcmVxdWVzdHMsIHJldHVybmluZyAwIGlmIGFsaXZlLgorICovCitzdGF0aWMgaW50IGFhY19yeF9jaGVja19oZWFsdGgoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwl1MzIgc3RhdHVzID0gcnhfcmVhZGwoZGV2LCBNVW5pdC5PTVJ4WzBdKTsKKworCS8qCisJICoJQ2hlY2sgdG8gc2VlIGlmIHRoZSBib2FyZCBmYWlsZWQgYW55IHNlbGYgdGVzdHMuCisJICovCisJaWYgKHN0YXR1cyAmIFNFTEZfVEVTVF9GQUlMRUQpCisJCXJldHVybiAtMTsKKwkvKgorCSAqCUNoZWNrIHRvIHNlZSBpZiB0aGUgYm9hcmQgcGFuaWMnZC4KKwkgKi8KKwlpZiAoc3RhdHVzICYgS0VSTkVMX1BBTklDKSB7CisJCWNoYXIgKiBidWZmZXI7CisJCXN0cnVjdCBQT1NUU1RBVFVTIHsKKwkJCXUzMiBQb3N0X0NvbW1hbmQ7CisJCQl1MzIgUG9zdF9BZGRyZXNzOworCQl9ICogcG9zdDsKKwkJZG1hX2FkZHJfdCBwYWRkciwgYmFkZHI7CisJCWludCByZXQ7CisKKwkJaWYgKChzdGF0dXMgJiAweEZGMDAwMDAwTCkgPT0gMHhCQzAwMDAwMEwpCisJCQlyZXR1cm4gKHN0YXR1cyA+PiAxNikgJiAweEZGOworCQlidWZmZXIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsIDUxMiwgJmJhZGRyKTsKKwkJcmV0ID0gLTI7CisJCWlmIChidWZmZXIgPT0gTlVMTCkKKwkJCXJldHVybiByZXQ7CisJCXBvc3QgPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsCisJCSAgc2l6ZW9mKHN0cnVjdCBQT1NUU1RBVFVTKSwgJnBhZGRyKTsKKwkJaWYgKHBvc3QgPT0gTlVMTCkgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIDUxMiwgYnVmZmVyLCBiYWRkcik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCW1lbXNldChidWZmZXIsIDAsIDUxMik7CisJCXBvc3QtPlBvc3RfQ29tbWFuZCA9IGNwdV90b19sZTMyKENPTU1BTkRfUE9TVF9SRVNVTFRTKTsKKwkJcG9zdC0+UG9zdF9BZGRyZXNzID0gY3B1X3RvX2xlMzIoYmFkZHIpOworCQlyeF93cml0ZWwoZGV2LCBNVW5pdC5JTVJ4WzBdLCBwYWRkcik7CisJCXJ4X3N5bmNfY21kKGRldiwgQ09NTUFORF9QT1NUX1JFU1VMVFMsIGJhZGRyLCAmc3RhdHVzKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIHNpemVvZihzdHJ1Y3QgUE9TVFNUQVRVUyksCisJCSAgcG9zdCwgcGFkZHIpOworCQlpZiAoKGJ1ZmZlclswXSA9PSAnMCcpICYmIChidWZmZXJbMV0gPT0gJ3gnKSkgeworCQkJcmV0ID0gKGJ1ZmZlclsyXSA8PSAnOScpID8gKGJ1ZmZlclsyXSAtICcwJykgOiAoYnVmZmVyWzJdIC0gJ0EnICsgMTApOworCQkJcmV0IDw8PSA0OworCQkJcmV0ICs9IChidWZmZXJbM10gPD0gJzknKSA/IChidWZmZXJbM10gLSAnMCcpIDogKGJ1ZmZlclszXSAtICdBJyArIDEwKTsKKwkJfQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgNTEyLCBidWZmZXIsIGJhZGRyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLyoKKwkgKglXYWl0IGZvciB0aGUgYWRhcHRlciB0byBiZSB1cCBhbmQgcnVubmluZy4KKwkgKi8KKwlpZiAoIShzdGF0dXMgJiBLRVJORUxfVVBfQU5EX1JVTk5JTkcpKQorCQlyZXR1cm4gLTM7CisJLyoKKwkgKglFdmVyeXRoaW5nIGlzIE9LCisJICovCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYWFjX3J4X2luaXQJLQlpbml0aWFsaXplIGFuIGk5NjAgYmFzZWQgQUFDIGNhcmQKKyAqCUBkZXY6IGRldmljZSB0byBjb25maWd1cmUKKyAqCisgKglBbGxvY2F0ZSBhbmQgc2V0IHVwIHJlc291cmNlcyBmb3IgdGhlIGk5NjAgYmFzZWQgQUFDIHZhcmlhbnRzLiBUaGUgCisgKglkZXZpY2VfaW50ZXJmYWNlIGluIHRoZSBjb21tcmVnaW9uIHdpbGwgYmUgYWxsb2NhdGVkIGFuZCBsaW5rZWQgCisgKgl0byB0aGUgY29tbSByZWdpb24uCisgKi8KKworaW50IGFhY19yeF9pbml0KHN0cnVjdCBhYWNfZGV2ICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKwlpbnQgaW5zdGFuY2U7CisJY29uc3QgY2hhciAqIG5hbWU7CisKKwlpbnN0YW5jZSA9IGRldi0+aWQ7CisJbmFtZSAgICAgPSBkZXYtPm5hbWU7CisKKwkvKgorCSAqCU1hcCBpbiB0aGUgcmVnaXN0ZXJzIGZyb20gdGhlIGFkYXB0ZXIuCisJICovCisJaWYoKGRldi0+cmVncy5yeCA9IGlvcmVtYXAoKHVuc2lnbmVkIGxvbmcpZGV2LT5zY3NpX2hvc3RfcHRyLT5iYXNlLCA4MTkyKSk9PU5VTEwpCisJewkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjcmFpZDogdW5hYmxlIHRvIG1hcCBpOTYwLlxuIiApOworCQlyZXR1cm4gLTE7CisJfQorCS8qCisJICoJQ2hlY2sgdG8gc2VlIGlmIHRoZSBib2FyZCBmYWlsZWQgYW55IHNlbGYgdGVzdHMuCisJICovCisJaWYgKHJ4X3JlYWRsKGRldiwgTVVuaXQuT01SeFswXSkgJiBTRUxGX1RFU1RfRkFJTEVEKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMlZDogYWRhcHRlciBzZWxmLXRlc3QgZmFpbGVkLlxuIiwgZGV2LT5uYW1lLCBpbnN0YW5jZSk7CisJCWdvdG8gZXJyb3JfaW91bm1hcDsKKwl9CisJLyoKKwkgKglDaGVjayB0byBzZWUgaWYgdGhlIGJvYXJkIHBhbmljJ2Qgd2hpbGUgYm9vdGluZy4KKwkgKi8KKwlpZiAocnhfcmVhZGwoZGV2LCBNVW5pdC5PTVJ4WzBdKSAmIEtFUk5FTF9QQU5JQykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzJWQ6IGFkYXB0ZXIga2VybmVsIHBhbmljLlxuIiwgZGV2LT5uYW1lLCBpbnN0YW5jZSk7CisJCWdvdG8gZXJyb3JfaW91bm1hcDsKKwl9CisJLyoKKwkgKglDaGVjayB0byBzZWUgaWYgdGhlIG1vbml0b3IgcGFuaWMnZCB3aGlsZSBib290aW5nLgorCSAqLworCWlmIChyeF9yZWFkbChkZXYsIE1Vbml0Lk9NUnhbMF0pICYgTU9OSVRPUl9QQU5JQykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzJWQ6IGFkYXB0ZXIgbW9uaXRvciBwYW5pYy5cbiIsIGRldi0+bmFtZSwgaW5zdGFuY2UpOworCQlnb3RvIGVycm9yX2lvdW5tYXA7CisJfQorCXN0YXJ0ID0gamlmZmllczsKKwkvKgorCSAqCVdhaXQgZm9yIHRoZSBhZGFwdGVyIHRvIGJlIHVwIGFuZCBydW5uaW5nLiBXYWl0IHVwIHRvIDMgbWludXRlcworCSAqLworCXdoaWxlICgoIShyeF9yZWFkbChkZXYsIEluZGV4UmVncy5NYWlsYm94WzddKSAmIEtFUk5FTF9VUF9BTkRfUlVOTklORykpCisJCXx8ICghKHJ4X3JlYWRsKGRldiwgTVVuaXQuT01SeFswXSkgJiBLRVJORUxfVVBfQU5EX1JVTk5JTkcpKSkKKwl7CisJCWlmKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQrMTgwKkhaKSkKKwkJeworCQkJc3RhdHVzID0gcnhfcmVhZGwoZGV2LCBJbmRleFJlZ3MuTWFpbGJveFs3XSk7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzJWQ6IGFkYXB0ZXIga2VybmVsIGZhaWxlZCB0byBzdGFydCwgaW5pdCBzdGF0dXMgPSAlbHguXG4iLCAKKwkJCQkJZGV2LT5uYW1lLCBpbnN0YW5jZSwgc3RhdHVzKTsKKwkJCWdvdG8gZXJyb3JfaW91bm1hcDsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfQorCWlmIChyZXF1ZXN0X2lycShkZXYtPnNjc2lfaG9zdF9wdHItPmlycSwgYWFjX3J4X2ludHIsIFNBX1NISVJRfFNBX0lOVEVSUlVQVCwgImFhY3JhaWQiLCAodm9pZCAqKWRldik8MCkgCisJeworCQlwcmludGsoS0VSTl9FUlIgIiVzJWQ6IEludGVycnVwdCB1bmF2YWlsYWJsZS5cbiIsIG5hbWUsIGluc3RhbmNlKTsKKwkJZ290byBlcnJvcl9pb3VubWFwOworCX0KKwkvKgorCSAqCUZpbGwgaW4gdGhlIGZ1bmN0aW9uIGRpc3BhdGNoIHRhYmxlLgorCSAqLworCWRldi0+YV9vcHMuYWRhcHRlcl9pbnRlcnJ1cHQgPSBhYWNfcnhfaW50ZXJydXB0X2FkYXB0ZXI7CisJZGV2LT5hX29wcy5hZGFwdGVyX25vdGlmeSA9IGFhY19yeF9ub3RpZnlfYWRhcHRlcjsKKwlkZXYtPmFfb3BzLmFkYXB0ZXJfc3luY19jbWQgPSByeF9zeW5jX2NtZDsKKwlkZXYtPmFfb3BzLmFkYXB0ZXJfY2hlY2tfaGVhbHRoID0gYWFjX3J4X2NoZWNrX2hlYWx0aDsKKworCWlmIChhYWNfaW5pdF9hZGFwdGVyKGRldikgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9pcnE7CisJLyoKKwkgKglTdGFydCBhbnkga2VybmVsIHRocmVhZHMgbmVlZGVkCisJICovCisJZGV2LT50aHJlYWRfcGlkID0ga2VybmVsX3RocmVhZCgoaW50ICgqKSh2b2lkICopKWFhY19jb21tYW5kX3RocmVhZCwgZGV2LCAwKTsKKwlpZihkZXYtPnRocmVhZF9waWQgPCAwKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJhYWNyYWlkOiBVbmFibGUgdG8gY3JlYXRlIHJ4IHRocmVhZC5cbiIpOworCQlnb3RvIGVycm9yX2tmcmVlOworCX0KKwkvKgorCSAqCVRlbGwgdGhlIGFkYXB0ZXIgdGhhdCBhbGwgaXMgY29uZmlndXJlZCwgYW5kIGl0IGNhbiBzdGFydAorCSAqCWFjY2VwdGluZyByZXF1ZXN0cworCSAqLworCWFhY19yeF9zdGFydF9hZGFwdGVyKGRldik7CisJcmV0dXJuIDA7CisKK2Vycm9yX2tmcmVlOgorCWtmcmVlKGRldi0+cXVldWVzKTsKKworZXJyb3JfaXJxOgorCWZyZWVfaXJxKGRldi0+c2NzaV9ob3N0X3B0ci0+aXJxLCAodm9pZCAqKWRldik7CisKK2Vycm9yX2lvdW5tYXA6CisJaW91bm1hcChkZXYtPnJlZ3MucngpOworCisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvc2EuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3NhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ2YzMwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3NhLmMKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgKglBZGFwdGVjIEFBQyBzZXJpZXMgUkFJRCBjb250cm9sbGVyIGRyaXZlcgorICoJKGMpIENvcHlyaWdodCAyMDAxIFJlZCBIYXQgSW5jLgk8YWxhbkByZWRoYXQuY29tPgorICoKKyAqIGJhc2VkIG9uIHRoZSBvbGQgYWFjcmFpZCBkcml2ZXIgdGhhdCBpcy4uCisgKiBBZGFwdGVjIGFhY3JhaWQgZGV2aWNlIGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwIEFkYXB0ZWMsIEluYy4gKGFhY3JhaWRAYWRhcHRlYy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBNb2R1bGUgTmFtZToKKyAqICBzYS5jCisgKgorICogQWJzdHJhY3Q6IERyYXdicmlkZ2Ugc3BlY2lmaWMgc3VwcG9ydCBmdW5jdGlvbnMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNpbmNsdWRlICJhYWNyYWlkLmgiCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhYWNfc2FfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBhYWNfZGV2ICpkZXYgPSBkZXZfaWQ7CisJdW5zaWduZWQgc2hvcnQgaW50c3RhdCwgbWFzazsKKworCWludHN0YXQgPSBzYV9yZWFkdyhkZXYsIERvb3JiZWxsUmVnX3ApOworCS8qCisJICoJUmVhZCBtYXNrIGFuZCBpbnZlcnQgYmVjYXVzZSBkcmF3YnJpZGdlIGlzIHJldmVyc2VkLgorCSAqCVRoaXMgYWxsb3dzIHVzIHRvIG9ubHkgc2VydmljZSBpbnRlcnJ1cHRzIHRoYXQgaGF2ZSBiZWVuIGVuYWJsZWQuCisJICovCisJbWFzayA9IH4oc2FfcmVhZHcoZGV2LCBTYURiQ1NSLlBSSVNFVElSUU1BU0spKTsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIG91ciBpbnRlcnJ1cHQuICBJZiBpdCBpc24ndCBqdXN0IHJldHVybiAqLworCisJaWYgKGludHN0YXQgJiBtYXNrKSB7CisJCWlmIChpbnRzdGF0ICYgUHJpbnRmUmVhZHkpIHsKKwkJCWFhY19wcmludGYoZGV2LCBzYV9yZWFkbChkZXYsIE1haWxib3g1KSk7CisJCQlzYV93cml0ZXcoZGV2LCBEb29yYmVsbENsclJlZ19wLCBQcmludGZSZWFkeSk7IC8qIGNsZWFyIFByaW50ZlJlYWR5ICovCisJCQlzYV93cml0ZXcoZGV2LCBEb29yYmVsbFJlZ19zLCBQcmludGZEb25lKTsKKwkJfSBlbHNlIGlmIChpbnRzdGF0ICYgRE9PUkJFTExfMSkgewkvLyBkZXYgLT4gSG9zdCBOb3JtYWwgQ29tbWFuZCBSZWFkeQorCQkJYWFjX2NvbW1hbmRfbm9ybWFsKCZkZXYtPnF1ZXVlcy0+cXVldWVbSG9zdE5vcm1DbWRRdWV1ZV0pOworCQkJc2Ffd3JpdGV3KGRldiwgRG9vcmJlbGxDbHJSZWdfcCwgRE9PUkJFTExfMSk7CisJCX0gZWxzZSBpZiAoaW50c3RhdCAmIERPT1JCRUxMXzIpIHsJLy8gZGV2IC0+IEhvc3QgTm9ybWFsIFJlc3BvbnNlIFJlYWR5CisJCQlhYWNfcmVzcG9uc2Vfbm9ybWFsKCZkZXYtPnF1ZXVlcy0+cXVldWVbSG9zdE5vcm1SZXNwUXVldWVdKTsKKwkJCXNhX3dyaXRldyhkZXYsIERvb3JiZWxsQ2xyUmVnX3AsIERPT1JCRUxMXzIpOworCQl9IGVsc2UgaWYgKGludHN0YXQgJiBET09SQkVMTF8zKSB7CS8vIGRldiAtPiBIb3N0IE5vcm1hbCBDb21tYW5kIE5vdCBGdWxsCisJCQlzYV93cml0ZXcoZGV2LCBEb29yYmVsbENsclJlZ19wLCBET09SQkVMTF8zKTsKKwkJfSBlbHNlIGlmIChpbnRzdGF0ICYgRE9PUkJFTExfNCkgewkvLyBkZXYgLT4gSG9zdCBOb3JtYWwgUmVzcG9uc2UgTm90IEZ1bGwKKwkJCXNhX3dyaXRldyhkZXYsIERvb3JiZWxsQ2xyUmVnX3AsIERPT1JCRUxMXzQpOworCQl9CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJcmV0dXJuIElSUV9OT05FOworfQorCisvKioKKyAqCWFhY19zYV9ub3RpZnlfYWRhcHRlcgkJLQloYW5kbGUgYWRhcHRlciBub3RpZmljYXRpb24KKyAqCUBkZXY6CUFkYXB0ZXIgdGhhdCBub3RpZmljYXRpb24gaXMgZm9yCisgKglAZXZlbnQ6CUV2ZW50IHRvIG5vdGlkeQorICoKKyAqCU5vdGlmeSB0aGUgYWRhcHRlciBvZiBhbiBldmVudAorICovCisgCit2b2lkIGFhY19zYV9ub3RpZnlfYWRhcHRlcihzdHJ1Y3QgYWFjX2RldiAqZGV2LCB1MzIgZXZlbnQpCit7CisJc3dpdGNoIChldmVudCkgeworCisJY2FzZSBBZGFwTm9ybUNtZFF1ZToKKwkJc2Ffd3JpdGV3KGRldiwgRG9vcmJlbGxSZWdfcyxET09SQkVMTF8xKTsKKwkJYnJlYWs7CisJY2FzZSBIb3N0Tm9ybVJlc3BOb3RGdWxsOgorCQlzYV93cml0ZXcoZGV2LCBEb29yYmVsbFJlZ19zLERPT1JCRUxMXzQpOworCQlicmVhazsKKwljYXNlIEFkYXBOb3JtUmVzcFF1ZToKKwkJc2Ffd3JpdGV3KGRldiwgRG9vcmJlbGxSZWdfcyxET09SQkVMTF8yKTsKKwkJYnJlYWs7CisJY2FzZSBIb3N0Tm9ybUNtZE5vdEZ1bGw6CisJCXNhX3dyaXRldyhkZXYsIERvb3JiZWxsUmVnX3MsRE9PUkJFTExfMyk7CisJCWJyZWFrOworCWNhc2UgSG9zdFNodXRkb3duOgorCQkvL3NhX3N5bmNfY21kKGRldiwgSE9TVF9DUkFTSElORywgMCwgJnJldCk7CisJCWJyZWFrOworCWNhc2UgRmFzdElvOgorCQlzYV93cml0ZXcoZGV2LCBEb29yYmVsbFJlZ19zLERPT1JCRUxMXzYpOworCQlicmVhazsKKwljYXNlIEFkYXBQcmludGZEb25lOgorCQlzYV93cml0ZXcoZGV2LCBEb29yYmVsbFJlZ19zLERPT1JCRUxMXzUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJYnJlYWs7CisJfQorfQorCisKKy8qKgorICoJc2Ffc3luY19jbWQJLQlzZW5kIGEgY29tbWFuZCBhbmQgd2FpdAorICoJQGRldjogQWRhcHRlcgorICoJQGNvbW1hbmQ6IENvbW1hbmQgdG8gZXhlY3V0ZQorICoJQHAxOiBmaXJzdCBwYXJhbWV0ZXIKKyAqCUByZXQ6IGFkYXB0ZXIgc3RhdHVzCisgKgorICoJVGhpcyByb3V0aW5lIHdpbGwgc2VuZCBhIHN5bmNocm9ub3VzIGNvbW1hbmQgdG8gdGhlIGFkYXB0ZXIgYW5kIHdhaXQgCisgKglmb3IgaXRzCWNvbXBsZXRpb24uCisgKi8KKworc3RhdGljIGludCBzYV9zeW5jX2NtZChzdHJ1Y3QgYWFjX2RldiAqZGV2LCB1MzIgY29tbWFuZCwgdTMyIHAxLCB1MzIgKnJldCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworIAlpbnQgb2s7CisJLyoKKwkgKglXcml0ZSB0aGUgQ29tbWFuZCBpbnRvIE1haWxib3ggMAorCSAqLworCXNhX3dyaXRlbChkZXYsIE1haWxib3gwLCBjb21tYW5kKTsKKwkvKgorCSAqCVdyaXRlIHRoZSBwYXJhbWV0ZXJzIGludG8gTWFpbGJveGVzIDEgLSA0CisJICovCisJc2Ffd3JpdGVsKGRldiwgTWFpbGJveDEsIHAxKTsKKwlzYV93cml0ZWwoZGV2LCBNYWlsYm94MiwgMCk7CisJc2Ffd3JpdGVsKGRldiwgTWFpbGJveDMsIDApOworCXNhX3dyaXRlbChkZXYsIE1haWxib3g0LCAwKTsKKwkvKgorCSAqCUNsZWFyIHRoZSBzeW5jaCBjb21tYW5kIGRvb3JiZWxsIHRvIHN0YXJ0IG9uIGEgY2xlYW4gc2xhdGUuCisJICovCisJc2Ffd3JpdGV3KGRldiwgRG9vcmJlbGxDbHJSZWdfcCwgRE9PUkJFTExfMCk7CisJLyoKKwkgKglTaWduYWwgdGhhdCB0aGVyZSBpcyBhIG5ldyBzeW5jaCBjb21tYW5kCisJICovCisJc2Ffd3JpdGV3KGRldiwgRG9vcmJlbGxSZWdfcywgRE9PUkJFTExfMCk7CisKKwlvayA9IDA7CisJc3RhcnQgPSBqaWZmaWVzOworCisJd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgc3RhcnQrMzAqSFopKQorCXsKKwkJLyoKKwkJICoJRGVsYXkgNXVTIHNvIHRoYXQgdGhlIG1vbml0b3IgZ2V0cyBhY2Nlc3MKKwkJICovCisJCXVkZWxheSg1KTsKKwkJLyoKKwkJICoJTW9uMTEwIHdpbGwgc2V0IGRvb3JiZWxsMCBiaXQgd2hlbiBpdCBoYXMgCisJCSAqCWNvbXBsZXRlZCB0aGUgY29tbWFuZC4KKwkJICovCisJCWlmKHNhX3JlYWR3KGRldiwgRG9vcmJlbGxSZWdfcCkgJiBET09SQkVMTF8wKSAgeworCQkJb2sgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCWlmIChvayAhPSAxKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkvKgorCSAqCUNsZWFyIHRoZSBzeW5jaCBjb21tYW5kIGRvb3JiZWxsLgorCSAqLworCXNhX3dyaXRldyhkZXYsIERvb3JiZWxsQ2xyUmVnX3AsIERPT1JCRUxMXzApOworCS8qCisJICoJUHVsbCB0aGUgc3luY2ggc3RhdHVzIGZyb20gTWFpbGJveCAwLgorCSAqLworCWlmIChyZXQpCisJCSpyZXQgPSBzYV9yZWFkbChkZXYsIE1haWxib3gwKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhYWNfc2FfaW50ZXJydXB0X2FkYXB0ZXIJLQlpbnRlcnJ1cHQgYW4gYWRhcHRlcgorICoJQGRldjogV2hpY2ggYWRhcHRlciB0byBlbmFibGUuCisgKgorICoJQnJlYWtwb2ludCBhbiBhZGFwdGVyLgorICovCisgCitzdGF0aWMgdm9pZCBhYWNfc2FfaW50ZXJydXB0X2FkYXB0ZXIgKHN0cnVjdCBhYWNfZGV2ICpkZXYpCit7CisJdTMyIHJldDsKKwlzYV9zeW5jX2NtZChkZXYsIEJSRUFLUE9JTlRfUkVRVUVTVCwgMCwgJnJldCk7Cit9CisKKy8qKgorICoJYWFjX3NhX3N0YXJ0X2FkYXB0ZXIJCS0JYWN0aXZhdGUgYWRhcHRlcgorICoJQGRldjoJQWRhcHRlcgorICoKKyAqCVN0YXJ0IHVwIHByb2Nlc3Npbmcgb24gYW4gQVJNIGJhc2VkIEFBQyBhZGFwdGVyCisgKi8KKworc3RhdGljIHZvaWQgYWFjX3NhX3N0YXJ0X2FkYXB0ZXIoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwl1MzIgcmV0OworCXN0cnVjdCBhYWNfaW5pdCAqaW5pdDsKKwkvKgorCSAqIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBwaWVjZXMgb2YgdGhlIGluaXQuCisJICovCisJaW5pdCA9IGRldi0+aW5pdDsKKwlpbml0LT5Ib3N0RWxhcHNlZFNlY29uZHMgPSBjcHVfdG9fbGUzMihnZXRfc2Vjb25kcygpKTsKKworCS8qCisJICogVGVsbCB0aGUgYWRhcHRlciB3ZSBhcmUgYmFjayBhbmQgdXAgYW5kIHJ1bm5pbmcgc28gaXQgd2lsbCBzY2FuIGl0cyBjb21tYW5kCisJICogcXVldWVzIGFuZCBlbmFibGUgb3VyIGludGVycnVwdHMKKwkgKi8KKwlkZXYtPmlycV9tYXNrID0JKFByaW50ZlJlYWR5IHwgRE9PUkJFTExfMSB8IERPT1JCRUxMXzIgfCBET09SQkVMTF8zIHwgRE9PUkJFTExfNCk7CisJLyoKKwkgKglGaXJzdCBjbGVhciBvdXQgYWxsIGludGVycnVwdHMuICBUaGVuIGVuYWJsZSB0aGUgb25lJ3MgdGhhdCAKKwkgKgl3ZSBjYW4gaGFuZGxlLgorCSAqLworCXNhX3dyaXRldyhkZXYsIFNhRGJDU1IuUFJJU0VUSVJRTUFTSywgY3B1X3RvX2xlMTYoMHhmZmZmKSk7CisJc2Ffd3JpdGV3KGRldiwgU2FEYkNTUi5QUklDTEVBUklSUU1BU0ssIChQcmludGZSZWFkeSB8IERPT1JCRUxMXzEgfCBET09SQkVMTF8yIHwgRE9PUkJFTExfMyB8IERPT1JCRUxMXzQpKTsKKwkvKiBXZSBjYW4gb25seSB1c2UgYSAzMiBiaXQgYWRkcmVzcyBoZXJlICovCisJc2Ffc3luY19jbWQoZGV2LCBJTklUX1NUUlVDVF9CQVNFX0FERFJFU1MsICh1MzIpKHVsb25nKWRldi0+aW5pdF9wYSwgJnJldCk7Cit9CisKKy8qKgorICoJYWFjX3NhX2NoZWNrX2hlYWx0aAorICoJQGRldjogZGV2aWNlIHRvIGNoZWNrIGlmIGhlYWx0aHkKKyAqCisgKglXaWxsIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZWQgYWRhcHRlciBpcyBhbGl2ZSBhbmQKKyAqCWNhcGFibGUgb2YgaGFuZGxpbmcgcmVxdWVzdHMsIHJldHVybmluZyAwIGlmIGFsaXZlLgorICovCitzdGF0aWMgaW50IGFhY19zYV9jaGVja19oZWFsdGgoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwlsb25nIHN0YXR1cyA9IHNhX3JlYWRsKGRldiwgTWFpbGJveDcpOworCisJLyoKKwkgKglDaGVjayB0byBzZWUgaWYgdGhlIGJvYXJkIGZhaWxlZCBhbnkgc2VsZiB0ZXN0cy4KKwkgKi8KKwlpZiAoc3RhdHVzICYgU0VMRl9URVNUX0ZBSUxFRCkKKwkJcmV0dXJuIC0xOworCS8qCisJICoJQ2hlY2sgdG8gc2VlIGlmIHRoZSBib2FyZCBwYW5pYydkIHdoaWxlIGJvb3RpbmcuCisJICovCisJaWYgKHN0YXR1cyAmIEtFUk5FTF9QQU5JQykKKwkJcmV0dXJuIC0yOworCS8qCisJICoJV2FpdCBmb3IgdGhlIGFkYXB0ZXIgdG8gYmUgdXAgYW5kIHJ1bm5pbmcuIFdhaXQgdXAgdG8gMyBtaW51dGVzCisJICovCisJaWYgKCEoc3RhdHVzICYgS0VSTkVMX1VQX0FORF9SVU5OSU5HKSkKKwkJcmV0dXJuIC0zOworCS8qCisJICoJRXZlcnl0aGluZyBpcyBPSworCSAqLworCXJldHVybiAwOworfQorCisvKioKKyAqCWFhY19zYV9pbml0CS0JaW5pdGlhbGl6ZSBhbiBBUk0gYmFzZWQgQUFDIGNhcmQKKyAqCUBkZXY6IGRldmljZSB0byBjb25maWd1cmUKKyAqCisgKglBbGxvY2F0ZSBhbmQgc2V0IHVwIHJlc291cmNlcyBmb3IgdGhlIEFSTSBiYXNlZCBBQUMgdmFyaWFudHMuIFRoZSAKKyAqCWRldmljZV9pbnRlcmZhY2UgaW4gdGhlIGNvbW1yZWdpb24gd2lsbCBiZSBhbGxvY2F0ZWQgYW5kIGxpbmtlZCAKKyAqCXRvIHRoZSBjb21tIHJlZ2lvbi4KKyAqLworCitpbnQgYWFjX3NhX2luaXQoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCWludCBpbnN0YW5jZTsKKwljb25zdCBjaGFyICpuYW1lOworCisJaW5zdGFuY2UgPSBkZXYtPmlkOworCW5hbWUgICAgID0gZGV2LT5uYW1lOworCisJLyoKKwkgKglNYXAgaW4gdGhlIHJlZ2lzdGVycyBmcm9tIHRoZSBhZGFwdGVyLgorCSAqLworCisJaWYoKGRldi0+cmVncy5zYSA9IGlvcmVtYXAoKHVuc2lnbmVkIGxvbmcpZGV2LT5zY3NpX2hvc3RfcHRyLT5iYXNlLCA4MTkyKSk9PU5VTEwpCisJewkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjcmFpZDogdW5hYmxlIHRvIG1hcCBBUk0uXG4iICk7CisJCWdvdG8gZXJyb3JfaW91bm1hcDsKKwl9CisJLyoKKwkgKglDaGVjayB0byBzZWUgaWYgdGhlIGJvYXJkIGZhaWxlZCBhbnkgc2VsZiB0ZXN0cy4KKwkgKi8KKwlpZiAoc2FfcmVhZGwoZGV2LCBNYWlsYm94NykgJiBTRUxGX1RFU1RfRkFJTEVEKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzJWQ6IGFkYXB0ZXIgc2VsZi10ZXN0IGZhaWxlZC5cbiIsIG5hbWUsIGluc3RhbmNlKTsKKwkJZ290byBlcnJvcl9pb3VubWFwOworCX0KKwkvKgorCSAqCUNoZWNrIHRvIHNlZSBpZiB0aGUgYm9hcmQgcGFuaWMnZCB3aGlsZSBib290aW5nLgorCSAqLworCWlmIChzYV9yZWFkbChkZXYsIE1haWxib3g3KSAmIEtFUk5FTF9QQU5JQykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyVkOiBhZGFwdGVyIGtlcm5lbCBwYW5pYydkLlxuIiwgbmFtZSwgaW5zdGFuY2UpOworCQlnb3RvIGVycm9yX2lvdW5tYXA7CisJfQorCXN0YXJ0ID0gamlmZmllczsKKwkvKgorCSAqCVdhaXQgZm9yIHRoZSBhZGFwdGVyIHRvIGJlIHVwIGFuZCBydW5uaW5nLiBXYWl0IHVwIHRvIDMgbWludXRlcy4KKwkgKi8KKwl3aGlsZSAoIShzYV9yZWFkbChkZXYsIE1haWxib3g3KSAmIEtFUk5FTF9VUF9BTkRfUlVOTklORykpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQrMTgwKkhaKSkgeworCQkJc3RhdHVzID0gc2FfcmVhZGwoZGV2LCBNYWlsYm94Nyk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyVkOiBhZGFwdGVyIGtlcm5lbCBmYWlsZWQgdG8gc3RhcnQsIGluaXQgc3RhdHVzID0gJWx4LlxuIiwgCisJCQkJCW5hbWUsIGluc3RhbmNlLCBzdGF0dXMpOworCQkJZ290byBlcnJvcl9pb3VubWFwOworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5zY3NpX2hvc3RfcHRyLT5pcnEsIGFhY19zYV9pbnRyLCBTQV9TSElSUXxTQV9JTlRFUlJVUFQsICJhYWNyYWlkIiwgKHZvaWQgKilkZXYgKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMlZDogSW50ZXJydXB0IHVuYXZhaWxhYmxlLlxuIiwgbmFtZSwgaW5zdGFuY2UpOworCQlnb3RvIGVycm9yX2lvdW5tYXA7CisJfQorCisJLyoKKwkgKglGaWxsIGluIHRoZSBmdW5jdGlvbiBkaXNwYXRjaCB0YWJsZS4KKwkgKi8KKworCWRldi0+YV9vcHMuYWRhcHRlcl9pbnRlcnJ1cHQgPSBhYWNfc2FfaW50ZXJydXB0X2FkYXB0ZXI7CisJZGV2LT5hX29wcy5hZGFwdGVyX25vdGlmeSA9IGFhY19zYV9ub3RpZnlfYWRhcHRlcjsKKwlkZXYtPmFfb3BzLmFkYXB0ZXJfc3luY19jbWQgPSBzYV9zeW5jX2NtZDsKKwlkZXYtPmFfb3BzLmFkYXB0ZXJfY2hlY2tfaGVhbHRoID0gYWFjX3NhX2NoZWNrX2hlYWx0aDsKKworCisJaWYoYWFjX2luaXRfYWRhcHRlcihkZXYpID09IE5VTEwpCisJCWdvdG8gZXJyb3JfaXJxOworCisJLyoKKwkgKglTdGFydCBhbnkga2VybmVsIHRocmVhZHMgbmVlZGVkCisJICovCisJZGV2LT50aHJlYWRfcGlkID0ga2VybmVsX3RocmVhZCgoaW50ICgqKSh2b2lkICopKWFhY19jb21tYW5kX3RocmVhZCwgZGV2LCAwKTsKKwlpZiAoZGV2LT50aHJlYWRfcGlkIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImFhY3JhaWQ6IFVuYWJsZSB0byBjcmVhdGUgY29tbWFuZCB0aHJlYWQuXG4iKTsKKwkJZ290byBlcnJvcl9rZnJlZTsKKwl9CisKKwkvKgorCSAqCVRlbGwgdGhlIGFkYXB0ZXIgdGhhdCBhbGwgaXMgY29uZmlndXJlLCBhbmQgaXQgY2FuIHN0YXJ0IAorCSAqCWFjY2VwdGluZyByZXF1ZXN0cworCSAqLworCWFhY19zYV9zdGFydF9hZGFwdGVyKGRldik7CisJcmV0dXJuIDA7CisKKworZXJyb3Jfa2ZyZWU6CisJa2ZyZWUoZGV2LT5xdWV1ZXMpOworCitlcnJvcl9pcnE6CisJZnJlZV9pcnEoZGV2LT5zY3NpX2hvc3RfcHRyLT5pcnEsICh2b2lkICopZGV2KTsKKworZXJyb3JfaW91bm1hcDoKKwlpb3VubWFwKGRldi0+cmVncy5zYSk7CisKKwlyZXR1cm4gLTE7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hZHZhbnN5cy5jIGIvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2MmM1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hZHZhbnN5cy5jCkBAIC0wLDAgKzEsMTgyMzcgQEAKKyNkZWZpbmUgQVNDX1ZFUlNJT04gIjMuM0siICAgIC8qIEFkdmFuU3lzIERyaXZlciBWZXJzaW9uICovCisKKy8qCisgKiBhZHZhbnN5cy5jIC0gTGludXggSG9zdCBEcml2ZXIgZm9yIEFkdmFuU3lzIFNDU0kgQWRhcHRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUtMjAwMCBBZHZhbmNlZCBTeXN0ZW0gUHJvZHVjdHMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENvbm5lY3RDb20gU29sdXRpb25zLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZQorICogY29kZSByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgY29tbWVudCB3aXRob3V0CisgKiBtb2RpZmljYXRpb24uCisgKgorICogQXMgb2YgTWFyY2ggOCwgMjAwMCBBZHZhbmNlZCBTeXN0ZW0gUHJvZHVjdHMsIEluYy4gKEFkdmFuU3lzKQorICogY2hhbmdlZCBpdHMgbmFtZSB0byBDb25uZWN0Q29tIFNvbHV0aW9ucywgSW5jLgorICoKKyAqLworCisvKgorCisgIERvY3VtZW50YXRpb24gZm9yIHRoZSBBZHZhblN5cyBEcml2ZXIKKworICBBLiBMaW51eCBLZXJuZWxzIFN1cHBvcnRlZCBieSB0aGlzIERyaXZlcgorICBCLiBBZGFwdGVycyBTdXBwb3J0ZWQgYnkgdGhpcyBEcml2ZXIKKyAgQy4gTGludXggc291cmNlIGZpbGVzIG1vZGlmaWVkIGJ5IEFkdmFuU3lzIERyaXZlcgorICBELiBTb3VyY2UgQ29tbWVudHMKKyAgRS4gRHJpdmVyIENvbXBpbGUgVGltZSBPcHRpb25zIGFuZCBEZWJ1Z2dpbmcKKyAgRi4gRHJpdmVyIExJTE8gT3B0aW9uCisgIEcuIFRlc3RzIHRvIHJ1biBiZWZvcmUgcmVsZWFzaW5nIG5ldyBkcml2ZXIKKyAgSC4gUmVsZWFzZSBIaXN0b3J5CisgIEkuIEtub3duIFByb2JsZW1zL0ZpeCBMaXN0CisgIEouIENyZWRpdHMgKENocm9ub2xvZ2ljYWwgT3JkZXIpCisKKyAgQS4gTGludXggS2VybmVscyBTdXBwb3J0ZWQgYnkgdGhpcyBEcml2ZXIKKworICAgICBUaGlzIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgaW4gdGhlIGZvbGxvd2luZyBMaW51eCBrZXJuZWxzOiB2Mi4yLjE4CisgICAgIHYyLjQuMC4gVGhlIGRyaXZlciBpcyBzdXBwb3J0ZWQgb24gdjIuMiBhbmQgdjIuNCBrZXJuZWxzIGFuZCBvbiB4ODYsCisgICAgIGFscGhhLCBhbmQgUG93ZXJQQyBwbGF0Zm9ybXMuCisKKyAgQi4gQWRhcHRlcnMgU3VwcG9ydGVkIGJ5IHRoaXMgRHJpdmVyCisKKyAgICAgQWR2YW5TeXMgKEFkdmFuY2VkIFN5c3RlbSBQcm9kdWN0cywgSW5jLikgbWFudWZhY3R1cmVzIHRoZSBmb2xsb3dpbmcKKyAgICAgUklTQy1iYXNlZCwgQnVzLU1hc3RlcmluZywgRmFzdCAoMTAgTWh6KSBhbmQgVWx0cmEgKDIwIE1oeikgTmFycm93CisgICAgICg4LWJpdCB0cmFuc2ZlcikgU0NTSSBIb3N0IEFkYXB0ZXJzIGZvciB0aGUgSVNBLCBFSVNBLCBWTCwgYW5kIFBDSQorICAgICBidXNlcyBhbmQgUklTQy1iYXNlZCwgQnVzLU1hc3RlcmluZywgVWx0cmEgKDIwIE1oeikgV2lkZSAoMTYtYml0CisgICAgIHRyYW5zZmVyKSBTQ1NJIEhvc3QgQWRhcHRlcnMgZm9yIHRoZSBQQ0kgYnVzLgorCisgICAgIFRoZSBDREIgY291bnRzIGJlbG93IGluZGljYXRlIHRoZSBudW1iZXIgb2YgU0NTSSBDREIgKENvbW1hbmQKKyAgICAgRGVzY3JpcHRvciBCbG9jaykgcmVxdWVzdHMgdGhhdCBjYW4gYmUgc3RvcmVkIGluIHRoZSBSSVNDIGNoaXAKKyAgICAgY2FjaGUgYW5kIGJvYXJkIExSQU0uIEEgQ0RCIGlzIGEgc2luZ2xlIFNDU0kgY29tbWFuZC4gVGhlIGRyaXZlcgorICAgICBkZXRlY3Qgcm91dGluZSB3aWxsIGRpc3BsYXkgdGhlIG51bWJlciBvZiBDREJzIGF2YWlsYWJsZSBmb3IgZWFjaAorICAgICBhZGFwdGVyIGRldGVjdGVkLiBUaGUgbnVtYmVyIG9mIENEQnMgdXNlZCBieSB0aGUgZHJpdmVyIGNhbiBiZQorICAgICBsb3dlcmVkIGluIHRoZSBCSU9TIGJ5IGNoYW5naW5nIHRoZSAnSG9zdCBRdWV1ZSBTaXplJyBhZGFwdGVyIHNldHRpbmcuCisKKyAgICAgTGFwdG9wIFByb2R1Y3RzOgorICAgICAgICBBQlAtNDgwIC0gQnVzLU1hc3RlciBDYXJkQnVzICgxNiBDREIpICgyLjQga2VybmVsIGFuZCBncmVhdGVyKQorCisgICAgIENvbm5lY3Rpdml0eSBQcm9kdWN0czoKKyAgICAgICAgQUJQNTEwLzUxNTAgLSBCdXMtTWFzdGVyIElTQSAoMjQwIENEQikKKyAgICAgICAgQUJQNTE0MCAtIEJ1cy1NYXN0ZXIgSVNBIFBuUCAoMTYgQ0RCKQorICAgICAgICBBQlA1MTQyIC0gQnVzLU1hc3RlciBJU0EgUG5QIHdpdGggZmxvcHB5ICgxNiBDREIpCisgICAgICAgIEFCUDkwMi8zOTAyIC0gQnVzLU1hc3RlciBQQ0kgKDE2IENEQikKKyAgICAgICAgQUJQMzkwNSAtIEJ1cy1NYXN0ZXIgUENJICgxNiBDREIpCisgICAgICAgIEFCUDkxNSAtIEJ1cy1NYXN0ZXIgUENJICgxNiBDREIpCisgICAgICAgIEFCUDkyMCAtIEJ1cy1NYXN0ZXIgUENJICgxNiBDREIpCisgICAgICAgIEFCUDM5MjIgLSBCdXMtTWFzdGVyIFBDSSAoMTYgQ0RCKQorICAgICAgICBBQlAzOTI1IC0gQnVzLU1hc3RlciBQQ0kgKDE2IENEQikKKyAgICAgICAgQUJQOTMwIC0gQnVzLU1hc3RlciBQQ0kgKDE2IENEQikKKyAgICAgICAgQUJQOTMwVSAtIEJ1cy1NYXN0ZXIgUENJIFVsdHJhICgxNiBDREIpCisgICAgICAgIEFCUDkzMFVBIC0gQnVzLU1hc3RlciBQQ0kgVWx0cmEgKDE2IENEQikKKyAgICAgICAgQUJQOTYwIC0gQnVzLU1hc3RlciBQQ0kgTUFDL1BDICgxNiBDREIpCisgICAgICAgIEFCUDk2MFUgLSBCdXMtTWFzdGVyIFBDSSBNQUMvUEMgVWx0cmEgKDE2IENEQikKKworICAgICBTaW5nbGUgQ2hhbm5lbCBQcm9kdWN0czoKKyAgICAgICAgQUJQNTQyIC0gQnVzLU1hc3RlciBJU0Egd2l0aCBmbG9wcHkgKDI0MCBDREIpCisgICAgICAgIEFCUDc0MiAtIEJ1cy1NYXN0ZXIgRUlTQSAoMjQwIENEQikKKyAgICAgICAgQUJQODQyIC0gQnVzLU1hc3RlciBWTCAoMjQwIENEQikKKyAgICAgICAgQUJQOTQwIC0gQnVzLU1hc3RlciBQQ0kgKDI0MCBDREIpCisgICAgICAgIEFCUDk0MFUgLSBCdXMtTWFzdGVyIFBDSSBVbHRyYSAoMjQwIENEQikKKyAgICAgICAgQUJQOTQwVUEvMzk0MFVBIC0gQnVzLU1hc3RlciBQQ0kgVWx0cmEgKDI0MCBDREIpCisgICAgICAgIEFCUDk3MCAtIEJ1cy1NYXN0ZXIgUENJIE1BQy9QQyAoMjQwIENEQikKKyAgICAgICAgQUJQOTcwVSAtIEJ1cy1NYXN0ZXIgUENJIE1BQy9QQyBVbHRyYSAoMjQwIENEQikKKyAgICAgICAgQUJQMzk2MFVBIC0gQnVzLU1hc3RlciBQQ0kgTUFDL1BDIFVsdHJhICgyNDAgQ0RCKQorICAgICAgICBBQlA5NDBVVy8zOTQwVVcgLSBCdXMtTWFzdGVyIFBDSSBVbHRyYS1XaWRlICgyNTMgQ0RCKQorICAgICAgICBBQlA5NzBVVyAtIEJ1cy1NYXN0ZXIgUENJIE1BQy9QQyBVbHRyYS1XaWRlICgyNTMgQ0RCKQorICAgICAgICBBQlAzOTQwVTJXIC0gQnVzLU1hc3RlciBQQ0kgTFZEL1VsdHJhMi1XaWRlICgyNTMgQ0RCKQorCisgICAgIE11bHRpLUNoYW5uZWwgUHJvZHVjdHM6CisgICAgICAgIEFCUDc1MiAtIER1YWwgQ2hhbm5lbCBCdXMtTWFzdGVyIEVJU0EgKDI0MCBDREIgUGVyIENoYW5uZWwpCisgICAgICAgIEFCUDg1MiAtIER1YWwgQ2hhbm5lbCBCdXMtTWFzdGVyIFZMICgyNDAgQ0RCIFBlciBDaGFubmVsKQorICAgICAgICBBQlA5NTAgLSBEdWFsIENoYW5uZWwgQnVzLU1hc3RlciBQQ0kgKDI0MCBDREIgUGVyIENoYW5uZWwpCisgICAgICAgIEFCUDk1MFVXIC0gRHVhbCBDaGFubmVsIEJ1cy1NYXN0ZXIgUENJIFVsdHJhLVdpZGUgKDI1MyBDREIgUGVyIENoYW5uZWwpCisgICAgICAgIEFCUDk4MCAtIEZvdXIgQ2hhbm5lbCBCdXMtTWFzdGVyIFBDSSAoMjQwIENEQiBQZXIgQ2hhbm5lbCkKKyAgICAgICAgQUJQOTgwVSAtIEZvdXIgQ2hhbm5lbCBCdXMtTWFzdGVyIFBDSSBVbHRyYSAoMjQwIENEQiBQZXIgQ2hhbm5lbCkKKyAgICAgICAgQUJQOTgwVUEvMzk4MFVBIC0gRm91ciBDaGFubmVsIEJ1cy1NYXN0ZXIgUENJIFVsdHJhICgxNiBDREIgUGVyIENoYW4uKQorICAgICAgICBBQlAzOTUwVTJXIC0gQnVzLU1hc3RlciBQQ0kgTFZEL1VsdHJhMi1XaWRlIGFuZCBVbHRyYS1XaWRlICgyNTMgQ0RCKQorICAgICAgICBBQlAzOTUwVTNXIC0gQnVzLU1hc3RlciBQQ0kgRHVhbCBMVkQyL1VsdHJhMy1XaWRlICgyNTMgQ0RCKQorCisgIEMuIExpbnV4IHNvdXJjZSBmaWxlcyBtb2RpZmllZCBieSBBZHZhblN5cyBEcml2ZXIKKworICAgICBUaGlzIHNlY3Rpb24gZm9yIGhpc3RvcmljYWwgcHVycG9zZXMgZG9jdW1lbnRzIHRoZSBjaGFuZ2VzCisgICAgIG9yaWdpbmFsbHkgbWFkZSB0byB0aGUgTGludXgga2VybmVsIHNvdXJjZSB0byBhZGQgdGhlIGFkdmFuc3lzCisgICAgIGRyaXZlci4gQXMgTGludXggaGFzIGNoYW5nZWQgc29tZSBvZiB0aGVzZSBmaWxlcyBoYXZlIGFsc28KKyAgICAgYmVlbiBtb2RpZmllZC4KKworICAgICAxLiBsaW51eC9hcmNoL2kzODYvY29uZmlnLmluOgorCisgICAgICAgICAgYm9vbCAnQWR2YW5TeXMgU0NTSSBzdXBwb3J0JyBDT05GSUdfU0NTSV9BRFZBTlNZUyB5CisKKyAgICAgMi4gbGludXgvZHJpdmVycy9zY3NpL2hvc3RzLmM6CisKKyAgICAgICAgICAjaWZkZWYgQ09ORklHX1NDU0lfQURWQU5TWVMKKyAgICAgICAgICAjaW5jbHVkZSAiYWR2YW5zeXMuaCIKKyAgICAgICAgICAjZW5kaWYKKworICAgICAgICBhbmQgYWZ0ZXIgInN0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgYnVpbHRpbl9zY3NpX2hvc3RzW10gPSI6CisKKyAgICAgICAgICAjaWZkZWYgQ09ORklHX1NDU0lfQURWQU5TWVMKKyAgICAgICAgICBBRFZBTlNZUywKKyAgICAgICAgICAjZW5kaWYKKworICAgICAzLiBsaW51eC9kcml2ZXJzL3Njc2kvTWFrZWZpbGU6CisKKyAgICAgICAgICBpZmRlZiBDT05GSUdfU0NTSV9BRFZBTlNZUworICAgICAgICAgIFNDU0lfU1JDUyA6PSAkKFNDU0lfU1JDUykgYWR2YW5zeXMuYworICAgICAgICAgIFNDU0lfT0JKUyA6PSAkKFNDU0lfT0JKUykgYWR2YW5zeXMubworICAgICAgICAgIGVsc2UKKyAgICAgICAgICBTQ1NJX01PRFVMRV9PQkpTIDo9ICQoU0NTSV9NT0RVTEVfT0JKUykgYWR2YW5zeXMubworICAgICAgICAgIGVuZGlmCisKKyAgICAgNC4gbGludXgvaW5pdC9tYWluLmM6CisKKyAgICAgICAgICBleHRlcm4gdm9pZCBhZHZhbnN5c19zZXR1cChjaGFyICpzdHIsIGludCAqaW50cyk7CisKKyAgICAgICAgYW5kIGFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIHRvIHRoZSBib290c2V0dXBzW10gYXJyYXkuCisKKyAgICAgICAgICAjaWZkZWYgQ09ORklHX1NDU0lfQURWQU5TWVMKKyAgICAgICAgICAgICB7ICJhZHZhbnN5cz0iLCBhZHZhbnN5c19zZXR1cCB9LAorICAgICAgICAgICNlbmRpZgorCisgIEQuIFNvdXJjZSBDb21tZW50cworCisgICAgIDEuIFVzZSB0YWIgc3RvcHMgc2V0IHRvIDQgZm9yIHRoZSBzb3VyY2UgZmlsZXMuIEZvciB2aSB1c2UgJ3NlIHRhYnN0b3BzPTQnLgorCisgICAgIDIuIFRoaXMgZHJpdmVyIHNob3VsZCBiZSBtYWludGFpbmVkIGluIG11bHRpcGxlIGZpbGVzLiBCdXQgdG8gbWFrZQorICAgICAgICBpdCBlYXNpZXIgdG8gaW5jbHVkZSB3aXRoIExpbnV4IGFuZCB0byBmb2xsb3cgTGludXggY29udmVudGlvbnMsCisgICAgICAgIHRoZSB3aG9sZSBkcml2ZXIgaXMgbWFpbnRhaW5lZCBpbiB0aGUgc291cmNlIGZpbGVzIGFkdmFuc3lzLmggYW5kCisgICAgICAgIGFkdmFuc3lzLmMuIEluIHRoaXMgZmlsZSBsb2dpY2FsIHNlY3Rpb25zIG9mIHRoZSBkcml2ZXIgYmVnaW4gd2l0aAorICAgICAgICBhIGNvbW1lbnQgdGhhdCBjb250YWlucyAnLS0tJy4gVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxvZ2ljYWwgc2VjdGlvbnMKKyAgICAgICAgb2YgdGhlIGRyaXZlciBiZWxvdy4KKworICAgICAgICAgICAtLS0gTGludXggVmVyc2lvbgorICAgICAgICAgICAtLS0gTGludXggSW5jbHVkZSBGaWxlCisgICAgICAgICAgIC0tLSBEcml2ZXIgT3B0aW9ucworICAgICAgICAgICAtLS0gRGVidWdnaW5nIEhlYWRlcgorICAgICAgICAgICAtLS0gQXNjIExpYnJhcnkgQ29uc3RhbnRzIGFuZCBNYWNyb3MKKyAgICAgICAgICAgLS0tIEFkdiBMaWJyYXJ5IENvbnN0YW50cyBhbmQgTWFjcm9zCisgICAgICAgICAgIC0tLSBEcml2ZXIgQ29uc3RhbnRzIGFuZCBNYWNyb3MKKyAgICAgICAgICAgLS0tIERyaXZlciBTdHJ1Y3R1cmVzCisgICAgICAgICAgIC0tLSBEcml2ZXIgRGF0YQorICAgICAgICAgICAtLS0gRHJpdmVyIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyAgICAgICAgICAgLS0tIExpbnV4ICdTY3NpX0hvc3RfVGVtcGxhdGUnIGFuZCBhZHZhbnN5c19zZXR1cCgpIEZ1bmN0aW9ucworICAgICAgICAgICAtLS0gTG9hZGFibGUgRHJpdmVyIFN1cHBvcnQKKyAgICAgICAgICAgLS0tIE1pc2NlbGxhbmVvdXMgRHJpdmVyIEZ1bmN0aW9ucworICAgICAgICAgICAtLS0gRnVuY3Rpb25zIFJlcXVpcmVkIGJ5IHRoZSBBc2MgTGlicmFyeQorICAgICAgICAgICAtLS0gRnVuY3Rpb25zIFJlcXVpcmVkIGJ5IHRoZSBBZHYgTGlicmFyeQorICAgICAgICAgICAtLS0gVHJhY2luZyBhbmQgRGVidWdnaW5nIEZ1bmN0aW9ucworICAgICAgICAgICAtLS0gQXNjIExpYnJhcnkgRnVuY3Rpb25zCisgICAgICAgICAgIC0tLSBBZHYgTGlicmFyeSBGdW5jdGlvbnMKKworICAgICAzLiBUaGUgc3RyaW5nICdYWFgnIGlzIHVzZWQgdG8gZmxhZyBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgcmUtd3JpdHRlbgorICAgICAgICBvciB0aGF0IGNvbnRhaW5zIGEgcHJvYmxlbSB0aGF0IG5lZWRzIHRvIGJlIGFkZHJlc3NlZC4KKworICAgICA0LiBJIGhhdmUgc3RyaXBwZWQgY29tbWVudHMgZnJvbSBhbmQgcmVmb3JtYXR0ZWQgdGhlIHNvdXJjZSBmb3IgdGhlCisgICAgICAgIEFzYyBMaWJyYXJ5IGFuZCBBZHYgTGlicmFyeSB0byByZWR1Y2UgdGhlIHNpemUgb2YgdGhpcyBmaWxlLiBUaGlzCisgICAgICAgIHNvdXJjZSBjYW4gYmUgZm91bmQgdW5kZXIgdGhlIGZvbGxvd2luZyBoZWFkaW5ncy4gVGhlIEFzYyBMaWJyYXJ5CisgICAgICAgIGlzIHVzZWQgdG8gc3VwcG9ydCBOYXJyb3cgQm9hcmRzLiBUaGUgQWR2IExpYnJhcnkgaXMgdXNlZCB0bworICAgICAgICBzdXBwb3J0IFdpZGUgQm9hcmRzLgorCisgICAgICAgICAgIC0tLSBBc2MgTGlicmFyeSBDb25zdGFudHMgYW5kIE1hY3JvcworICAgICAgICAgICAtLS0gQWR2IExpYnJhcnkgQ29uc3RhbnRzIGFuZCBNYWNyb3MKKyAgICAgICAgICAgLS0tIEFzYyBMaWJyYXJ5IEZ1bmN0aW9ucworICAgICAgICAgICAtLS0gQWR2IExpYnJhcnkgRnVuY3Rpb25zCisKKyAgRS4gRHJpdmVyIENvbXBpbGUgVGltZSBPcHRpb25zIGFuZCBEZWJ1Z2dpbmcKKworICAgICBJbiB0aGlzIHNvdXJjZSBmaWxlIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGNhbiBiZSBkZWZpbmVkLiBUaGV5IGFyZQorICAgICBkZWZpbmVkIGluIHRoZSBzb3VyY2UgYmVsb3cuIEJvdGggb2YgdGhlc2Ugb3B0aW9ucyBhcmUgZW5hYmxlZCBieQorICAgICBkZWZhdWx0LgorCisgICAgIDEuIEFEVkFOU1lTX0FTU0VSVCAtIEVuYWJsZSBkcml2ZXIgYXNzZXJ0aW9ucyAoRGVmOiBFbmFibGVkKQorCisgICAgICAgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGFkZHMgYXNzZXJ0aW9uIGxvZ2ljIHN0YXRlbWVudHMgdG8gdGhlCisgICAgICAgIGRyaXZlci4gSWYgYW4gYXNzZXJ0aW9uIGZhaWxzIGEgbWVzc2FnZSB3aWxsIGJlIGRpc3BsYXllZCB0bworICAgICAgICB0aGUgY29uc29sZSwgYnV0IHRoZSBzeXN0ZW0gd2lsbCBjb250aW51ZSB0byBvcGVyYXRlLiBBbnkKKyAgICAgICAgYXNzZXJ0aW9ucyBlbmNvdW50ZXJlZCBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIHBlcnNvbgorICAgICAgICByZXNwb25zaWJsZSBmb3IgdGhlIGRyaXZlci4gQXNzZXJ0aW9uIHN0YXRlbWVudHMgbWF5IHByb2FjdGl2ZWx5CisgICAgICAgIGRldGVjdCBwcm9ibGVtcyB3aXRoIHRoZSBkcml2ZXIgYW5kIGZhY2lsaXRhdGUgZml4aW5nIHRoZXNlCisgICAgICAgIHByb2JsZW1zLiBFbmFibGluZyBhc3NlcnRpb25zIHdpbGwgYWRkIGEgc21hbGwgb3ZlcmhlYWQgdG8gdGhlCisgICAgICAgIGV4ZWN1dGlvbiBvZiB0aGUgZHJpdmVyLgorCisgICAgIDIuIEFEVkFOU1lTX0RFQlVHIC0gRW5hYmxlIGRyaXZlciBkZWJ1Z2dpbmcgKERlZjogRGlzYWJsZWQpCisKKyAgICAgICAgRW5hYmxpbmcgdGhpcyBvcHRpb24gYWRkcyB0cmFjaW5nIGZ1bmN0aW9ucyB0byB0aGUgZHJpdmVyIGFuZAorICAgICAgICB0aGUgYWJpbGl0eSB0byBzZXQgYSBkcml2ZXIgdHJhY2luZyBsZXZlbCBhdCBib290IHRpbWUuIFRoaXMKKyAgICAgICAgb3B0aW9uIHdpbGwgYWxzbyBleHBvcnQgc3ltYm9scyBub3QgcmVxdWlyZWQgb3V0c2lkZSB0aGUgZHJpdmVyIHRvCisgICAgICAgIHRoZSBrZXJuZWwgbmFtZSBzcGFjZS4gVGhpcyBvcHRpb24gaXMgdmVyeSB1c2VmdWwgZm9yIGRlYnVnZ2luZworICAgICAgICB0aGUgZHJpdmVyLCBidXQgaXQgd2lsbCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIGRyaXZlciBleGVjdXRpb24KKyAgICAgICAgaW1hZ2UgYW5kIGFkZCBvdmVyaGVhZCB0byB0aGUgZXhlY3V0aW9uIG9mIHRoZSBkcml2ZXIuCisKKyAgICAgICAgVGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcgb3V0cHV0IGNhbiBiZSBjb250cm9sbGVkIHdpdGggdGhlIGdsb2JhbAorICAgICAgICB2YXJpYWJsZSAnYXNjX2RiZ2x2bCcuIFRoZSBoaWdoZXIgdGhlIG51bWJlciB0aGUgbW9yZSBvdXRwdXQuIEJ5CisgICAgICAgIGRlZmF1bHQgdGhlIGRlYnVnIGxldmVsIGlzIDAuCisKKyAgICAgICAgSWYgdGhlIGRyaXZlciBpcyBsb2FkZWQgYXQgYm9vdCB0aW1lIGFuZCB0aGUgTElMTyBEcml2ZXIgT3B0aW9uCisgICAgICAgIGlzIGluY2x1ZGVkIGluIHRoZSBzeXN0ZW0sIHRoZSBkZWJ1ZyBsZXZlbCBjYW4gYmUgY2hhbmdlZCBieQorICAgICAgICBzcGVjaWZ5aW5nIGEgNXRoIChBU0NfTlVNX0lPUE9SVF9QUk9CRSArIDEpIEkvTyBQb3J0LiBUaGUKKyAgICAgICAgZmlyc3QgdGhyZWUgaGV4IGRpZ2l0cyBvZiB0aGUgcHNldWRvIEkvTyBQb3J0IG11c3QgYmUgc2V0IHRvCisgICAgICAgICdkZWInIGFuZCB0aGUgZm91cnRoIGhleCBkaWdpdCBzcGVjaWZpZXMgdGhlIGRlYnVnIGxldmVsOiAwIC0gRi4KKyAgICAgICAgVGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgd2lsbCBsb29rIGZvciBhbiBhZGFwdGVyIGF0IDB4MzMwCisgICAgICAgIGFuZCBzZXQgdGhlIGRlYnVnIGxldmVsIHRvIDIuCisKKyAgICAgICAgICAgbGludXggYWR2YW5zeXM9MHgzMzAsMCwwLDAsMHhkZWIyCisKKyAgICAgICAgSWYgdGhlIGRyaXZlciBpcyBidWlsdCBhcyBhIGxvYWRhYmxlIG1vZHVsZSB0aGlzIHZhcmlhYmxlIGNhbiBiZQorICAgICAgICBkZWZpbmVkIHdoZW4gdGhlIGRyaXZlciBpcyBsb2FkZWQuIFRoZSBmb2xsb3dpbmcgaW5zbW9kIGNvbW1hbmQKKyAgICAgICAgd2lsbCBzZXQgdGhlIGRlYnVnIGxldmVsIHRvIG9uZS4KKworICAgICAgICAgICBpbnNtb2QgYWR2YW5zeXMubyBhc2NfZGJnbHZsPTEKKworICAgICAgICBEZWJ1Z2dpbmcgTWVzc2FnZSBMZXZlbHM6CisgICAgICAgICAgIDA6IEVycm9ycyBPbmx5CisgICAgICAgICAgIDE6IEhpZ2gtTGV2ZWwgVHJhY2luZworICAgICAgICAgICAyLU46IFZlcmJvc2UgVHJhY2luZworCisgICAgICAgIFRvIGVuYWJsZSBkZWJ1ZyBvdXRwdXQgdG8gY29uc29sZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0OgorCisgICAgICAgIGEuIFN5c3RlbSBhbmQga2VybmVsIGxvZ2dpbmcgaXMgZW5hYmxlZCAoc3lzbG9nZCwga2xvZ2QgcnVubmluZykuCisgICAgICAgIGIuIEtlcm5lbCBtZXNzYWdlcyBhcmUgcm91dGVkIHRvIGNvbnNvbGUgb3V0cHV0LiBDaGVjaworICAgICAgICAgICAvZXRjL3N5c2xvZy5jb25mIGZvciBhbiBlbnRyeSBzaW1pbGFyIHRvIHRoaXM6CisKKyAgICAgICAgICAgICAgICBrZXJuLiogICAgICAgICAgICAgICAgICAvZGV2L2NvbnNvbGUKKworICAgICAgICBjLiBrbG9nZCBpcyBzdGFydGVkIHdpdGggdGhlIGFwcHJvcHJpYXRlIC1jIHBhcmFtZXRlcgorICAgICAgICAgICAoZS5nLiBrbG9nZCAtYyA4KQorCisgICAgICAgIFRoaXMgd2lsbCBjYXVzZSBwcmludGsoKSBtZXNzYWdlcyB0byBiZSBiZSBkaXNwbGF5ZWQgb24gdGhlCisgICAgICAgIGN1cnJlbnQgY29uc29sZS4gUmVmZXIgdG8gdGhlIGtsb2dkKDgpIGFuZCBzeXNsb2dkKDgpIG1hbiBwYWdlcworICAgICAgICBmb3IgZGV0YWlscy4KKworICAgICAgICBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gZW5hYmxlIHByaW50aygpIHRvIGNvbnNvbGUgd2l0aCB0aGlzCisgICAgICAgIHByb2dyYW0uIEhvd2V2ZXIsIHRoaXMgaXMgbm90IHRoZSAnb2ZmaWNpYWwnIHdheSB0byBkbyB0aGlzLgorICAgICAgICBEZWJ1ZyBvdXRwdXQgaXMgbG9nZ2VkIGluIC92YXIvbG9nL21lc3NhZ2VzLgorCisgICAgICAgICAgbWFpbigpCisgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3lzY2FsbCgxMDMsIDcsIDAsIDApOworICAgICAgICAgIH0KKworICAgICAgICBJbmNyZWFzaW5nIExPR19CVUZfTEVOIGluIGtlcm5lbC9wcmludGsuYyB0byBzb21ldGhpbmcgbGlrZQorICAgICAgICA0MDk2MCBhbGxvd3MgbW9yZSBkZWJ1ZyBtZXNzYWdlcyB0byBiZSBidWZmZXJlZCBpbiB0aGUga2VybmVsCisgICAgICAgIGFuZCB3cml0dGVuIHRvIHRoZSBjb25zb2xlIG9yIGxvZyBmaWxlLgorCisgICAgIDMuIEFEVkFOU1lTX1NUQVRTIC0gRW5hYmxlIHN0YXRpc3RpY3MgKERlZjogRW5hYmxlZCA+PSB2MS4zLjApCisKKyAgICAgICAgRW5hYmxpbmcgdGhpcyBvcHRpb24gYWRkcyBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gYW5kIGRpc3BsYXkKKyAgICAgICAgdGhyb3VnaCAvcHJvYyB0byB0aGUgZHJpdmVyLiBUaGUgaW5mb3JtYXRpb24gaXMgdXNlZnVsIGZvcgorICAgICAgICBtb25pdG9yaW5nIGRyaXZlciBhbmQgZGV2aWNlIHBlcmZvcm1hbmNlLiBJdCB3aWxsIGFkZCB0byB0aGUKKyAgICAgICAgc2l6ZSBvZiB0aGUgZHJpdmVyIGV4ZWN1dGlvbiBpbWFnZSBhbmQgYWRkIG1pbm9yIG92ZXJoZWFkIHRvCisgICAgICAgIHRoZSBleGVjdXRpb24gb2YgdGhlIGRyaXZlci4KKworICAgICAgICBTdGF0aXN0aWNzIGFyZSBtYWludGFpbmVkIG9uIGEgcGVyIGFkYXB0ZXIgYmFzaXMuIERyaXZlciBlbnRyeQorICAgICAgICBwb2ludCBjYWxsIGNvdW50cyBhbmQgdHJhbnNmZXIgc2l6ZSBjb3VudHMgYXJlIG1haW50YWluZWQuCisgICAgICAgIFN0YXRpc3RpY3MgYXJlIG9ubHkgYXZhaWxhYmxlIGZvciBrZXJuZWxzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbAorICAgICAgICB0byB2MS4zLjAgd2l0aCB0aGUgQ09ORklHX1BST0NfRlMgKC9wcm9jKSBmaWxlIHN5c3RlbSBjb25maWd1cmVkLgorCisgICAgICAgIEFkdmFuU3lzIFNDU0kgYWRhcHRlciBmaWxlcyBoYXZlIHRoZSBmb2xsb3dpbmcgcGF0aCBuYW1lIGZvcm1hdDoKKworICAgICAgICAgICAvcHJvYy9zY3NpL2FkdmFuc3lzL1swLShBU0NfTlVNX0JPQVJEX1NVUFBPUlRFRC0xKV0KKworICAgICAgICBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSBkaXNwbGF5ZWQgd2l0aCBjYXQuIEZvciBleGFtcGxlOgorCisgICAgICAgICAgIGNhdCAvcHJvYy9zY3NpL2FkdmFuc3lzLzAKKworICAgICAgICBXaGVuIEFEVkFOU1lTX1NUQVRTIGlzIG5vdCBkZWZpbmVkIHRoZSBBZHZhblN5cyAvcHJvYyBmaWxlcyBvbmx5CisgICAgICAgIGNvbnRhaW4gYWRhcHRlciBhbmQgZGV2aWNlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisKKyAgRi4gRHJpdmVyIExJTE8gT3B0aW9uCisKKyAgICAgSWYgaW5pdC9tYWluLmMgaXMgbW9kaWZpZWQgYXMgZGVzY3JpYmVkIGluIHRoZSAnRGlyZWN0aW9ucyBmb3IgQWRkaW5nCisgICAgIHRoZSBBZHZhblN5cyBEcml2ZXIgdG8gTGludXgnIHNlY3Rpb24gKEIuNC4pIGFib3ZlLCB0aGUgZHJpdmVyIHdpbGwKKyAgICAgcmVjb2duaXplIHRoZSAnYWR2YW5zeXMnIExJTE8gY29tbWFuZCBsaW5lIGFuZCAvZXRjL2xpbG8uY29uZiBvcHRpb24uCisgICAgIFRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIGVpdGhlciBkaXNhYmxlIEkvTyBwb3J0IHNjYW5uaW5nIG9yIHRvIGxpbWl0CisgICAgIHNjYW5uaW5nIHRvIDEgLSA0IEkvTyBwb3J0cy4gUmVnYXJkbGVzcyBvZiB0aGUgb3B0aW9uIHNldHRpbmcgRUlTQSBhbmQKKyAgICAgUENJIGJvYXJkcyB3aWxsIHN0aWxsIGJlIHNlYXJjaGVkIGZvciBhbmQgZGV0ZWN0ZWQuIFRoaXMgb3B0aW9uIG9ubHkKKyAgICAgYWZmZWN0cyBzZWFyY2hpbmcgZm9yIElTQSBhbmQgVkwgYm9hcmRzLgorCisgICAgIEV4YW1wbGVzOgorICAgICAgIDEuIEVsaW1pbmF0ZSBJL08gcG9ydCBzY2FubmluZzoKKyAgICAgICAgICAgIGJvb3Q6IGxpbnV4IGFkdmFuc3lzPQorICAgICAgICAgICAgICBvcgorICAgICAgICAgICAgYm9vdDogbGludXggYWR2YW5zeXM9MHgwCisgICAgICAgMi4gTGltaXQgSS9PIHBvcnQgc2Nhbm5pbmcgdG8gb25lIEkvTyBwb3J0OgorICAgICAgICAgICAgYm9vdDogbGludXggYWR2YW5zeXM9MHgxMTAKKyAgICAgICAzLiBMaW1pdCBJL08gcG9ydCBzY2FubmluZyB0byBmb3VyIEkvTyBwb3J0czoKKyAgICAgICAgICAgIGJvb3Q6IGxpbnV4IGFkdmFuc3lzPTB4MTEwLDB4MjEwLDB4MjMwLDB4MzMwCisKKyAgICAgRm9yIGEgbG9hZGFibGUgbW9kdWxlIHRoZSBzYW1lIGVmZmVjdCBjYW4gYmUgYWNoaWV2ZWQgYnkgc2V0dGluZworICAgICB0aGUgJ2FzY19pb3BmbGFnJyB2YXJpYWJsZSBhbmQgJ2FzY19pb3BvcnQnIGFycmF5IHdoZW4gbG9hZGluZworICAgICB0aGUgZHJpdmVyLCBlLmcuCisKKyAgICAgICAgICAgaW5zbW9kIGFkdmFuc3lzLm8gYXNjX2lvcGZsYWc9MSBhc2NfaW9wb3J0PTB4MTEwLDB4MzMwCisKKyAgICAgSWYgQURWQU5TWVNfREVCVUcgaXMgZGVmaW5lZCBhIDV0aCAoQVNDX05VTV9JT1BPUlRfUFJPQkUgKyAxKQorICAgICBJL08gUG9ydCBtYXkgYmUgYWRkZWQgdG8gc3BlY2lmeSB0aGUgZHJpdmVyIGRlYnVnIGxldmVsLiBSZWZlciB0bworICAgICB0aGUgJ0RyaXZlciBDb21waWxlIFRpbWUgT3B0aW9ucyBhbmQgRGVidWdnaW5nJyBzZWN0aW9uIGFib3ZlIGZvcgorICAgICBtb3JlIGluZm9ybWF0aW9uLgorCisgIEcuIFRlc3RzIHRvIHJ1biBiZWZvcmUgcmVsZWFzaW5nIG5ldyBkcml2ZXIKKworICAgICAxLiBJbiB0aGUgc3VwcG9ydGVkIGtlcm5lbHMgdmVyaWZ5IHRoZXJlIGFyZSBubyB3YXJuaW5nIG9yIGNvbXBpbGUKKyAgICAgICAgZXJyb3JzIHdoZW4gdGhlIGtlcm5lbCBpcyBidWlsdCBhcyBib3RoIGEgZHJpdmVyIGFuZCBhcyBhIG1vZHVsZQorICAgICAgICBhbmQgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKKyAgICAgICAgQURWQU5TWVNfREVCVUcgLSBlbmFibGVkIGFuZCBkaXNhYmxlZAorICAgICAgICBDT05GSUdfU01QIC0gZW5hYmxlZCBhbmQgZGlzYWJsZWQKKyAgICAgICAgQ09ORklHX1BST0NfRlMgLSBlbmFibGVkIGFuZCBkaXNhYmxlZAorCisgICAgIDIuIFJ1biB0ZXN0cyBvbiBhbiB4ODYsIGFscGhhLCBhbmQgUG93ZXJQQyB3aXRoIGF0IGxlYXN0IG9uZSBuYXJyb3cKKyAgICAgICAgY2FyZCBhbmQgb25lIHdpZGUgY2FyZCBhdHRhY2hlZCB0byBhIGhhcmQgZGlzayBhbmQgQ0QtUk9NIGRyaXZlOgorICAgICAgICBmZGlzaywgbWtmcywgZnNjaywgYm9ubmllLCBjb3B5L2NvbXBhcmUgdGVzdCBmcm9tIHRoZQorICAgICAgICBDRC1ST00gdG8gdGhlIGhhcmQgZHJpdmUuCisKKyAgSC4gUmVsZWFzZSBIaXN0b3J5CisKKyAgICAgQkVUQS0xLjAgKDEyLzIzLzk1KToKKyAgICAgICAgIEZpcnN0IFJlbGVhc2UKKworICAgICBCRVRBLTEuMSAoMTIvMjgvOTUpOgorICAgICAgICAgMS4gUHJldmVudCBhZHZhbnN5c19kZXRlY3QoKSBmcm9tIGJlaW5nIGNhbGxlZCB0d2ljZS4KKyAgICAgICAgIDIuIEFkZCBMSUxPIDB4ZGViWzAtZl0gb3B0aW9uIHRvIHNldCAnYXNjX2RiZ2x2bCcuCisKKyAgICAgMS4yICgxLzEyLzk2KToKKyAgICAgICAgIDEuIFByZXZlbnQgcmUtZW50cmFuY3kgaW4gdGhlIGludGVycnVwdCBoYW5kbGVyIHdoaWNoCisgICAgICAgICAgICByZXN1bHRlZCBpbiB0aGUgZHJpdmVyIGhhbmdpbmcgTGludXguCisgICAgICAgICAyLiBGaXggcHJvYmxlbSB0aGF0IHByZXZlbnRlZCBBQlAtOTQwIGNhcmRzIGZyb20gYmVpbmcKKyAgICAgICAgICAgIHJlY29nbml6ZWQgb24gc29tZSBQQ0kgbW90aGVyYm9hcmRzLgorICAgICAgICAgMy4gQWRkIHN1cHBvcnQgZm9yIHRoZSBBQlAtNTE0MCBQblAgSVNBIGNhcmQuCisgICAgICAgICA0LiBGaXggY2hlY2sgY29uZGl0aW9uIHJldHVybiBzdGF0dXMuCisgICAgICAgICA1LiBBZGQgY29uZGl0aW9uYWxseSBjb21waWxlZCBjb2RlIGZvciBMaW51eCB2MS4zLlguCisKKyAgICAgMS4zICgyLzIzLzk2KToKKyAgICAgICAgIDEuIEZpeCBwcm9ibGVtIGluIGFkdmFuc3lzX2Jpb3NwYXJhbSgpIHRoYXQgcmVzdWx0ZWQgaW4gdGhlCisgICAgICAgICAgICB3cm9uZyBkcml2ZSBnZW9tZXRyeSBiZWluZyByZXR1cm5lZCBmb3IgZHJpdmVzID4gMUdCIHdpdGgKKyAgICAgICAgICAgIGV4dGVuZGVkIHRyYW5zbGF0aW9uIGVuYWJsZWQuCisgICAgICAgICAyLiBBZGQgYWRkaXRpb25hbCB0cmFjaW5nIGR1cmluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24uCisgICAgICAgICAzLiBDaGFuZ2UgY29kZSB0aGF0IG9ubHkgYXBwbGllcyB0byBJU0EgUG5QIGFkYXB0ZXIuCisgICAgICAgICA0LiBFbGltaW5hdGUgJ21ha2UgZGVwJyB3YXJuaW5nLgorICAgICAgICAgNS4gVHJ5IHRvIGZpeCBwcm9ibGVtIHdpdGggaGFuZGxpbmcgcmVzZXRzIGJ5IGluY3JlYXNpbmcgdGhlaXIKKyAgICAgICAgICAgIHRpbWVvdXQgdmFsdWUuCisKKyAgICAgMS40ICg1LzgvOTYpOgorICAgICAgICAgMS4gQ2hhbmdlIGRlZmluaXRpb25zIHRvIGVsaW1pbmF0ZSBjb25mbGljdHMgd2l0aCBvdGhlciBzdWJzeXN0ZW1zLgorICAgICAgICAgMi4gQWRkIHZlcnNpb25pbmcgY29kZSBmb3IgdGhlIHNoYXJlZCBpbnRlcnJ1cHQgY2hhbmdlcy4KKyAgICAgICAgIDMuIEVsaW1pbmF0ZSBwcm9ibGVtIGluIGFzY19ybXF1ZXVlKCkgd2l0aCBpdGVyYXRpbmcgYWZ0ZXIgcmVtb3ZpbmcKKyAgICAgICAgICAgIGEgcmVxdWVzdC4KKyAgICAgICAgIDQuIFJlbW92ZSByZXNldCByZXF1ZXN0IGxvb3AgcHJvYmxlbSBmcm9tIHRoZSAiS25vd24gUHJvYmxlbXMgb3IKKyAgICAgICAgICAgIElzc3VlcyIgc2VjdGlvbi4gVGhpcyBwcm9ibGVtIHdhcyBpc29sYXRlZCBhbmQgZml4ZWQgaW4gdGhlCisgICAgICAgICAgICBtaWQtbGV2ZWwgU0NTSSBkcml2ZXIuCisKKyAgICAgMS41ICg4LzgvOTYpOgorICAgICAgICAgMS4gQWRkIHN1cHBvcnQgZm9yIEFCUC05NDBVIChQQ0kgVWx0cmEpIGFkYXB0ZXIuCisgICAgICAgICAyLiBBZGQgc3VwcG9ydCBmb3IgSVJRIHNoYXJpbmcgYnkgc2V0dGluZyB0aGUgU0FfU0hJUlEgZmxhZyBmb3IKKyAgICAgICAgICAgIHJlcXVlc3RfaXJxIGFuZCBzdXBwbHlpbmcgYSBkZXZfaWQgcG9pbnRlciB0byBib3RoIHJlcXVlc3RfaXJxKCkKKyAgICAgICAgICAgIGFuZCBmcmVlX2lycSgpLgorICAgICAgICAgMy4gSW4gQXNjU2VhcmNoSU9Qb3J0QWRkcjExKCkgcmVzdG9yZSBhIGNhbGwgdG8gY2hlY2tfcmVnaW9uKCkgd2hpY2gKKyAgICAgICAgICAgIHNob3VsZCBiZSB1c2VkIGJlZm9yZSBJL08gcG9ydCBwcm9iaW5nLgorICAgICAgICAgNC4gRml4IGJ1ZyBpbiBhc2NfcHJ0X2hleCgpIHdoaWNoIHJlc3VsdGVkIGluIHRoZSBkaXNwbGF5aW5nCisgICAgICAgICAgICB0aGUgd3JvbmcgZGF0YS4KKyAgICAgICAgIDUuIEluY29ycG9yYXRlIG1pc2NlbGxhbmVvdXMgQXNjIExpYnJhcnkgYnVnIGZpeGVzIGFuZCBuZXcgbWljcm9jb2RlLgorICAgICAgICAgNi4gQ2hhbmdlIGRyaXZlciB2ZXJzaW9uaW5nIHRvIGJlIHNwZWNpZmljIHRvIGVhY2ggTGludXggc3ViLWxldmVsLgorICAgICAgICAgNy4gQ2hhbmdlIHN0YXRpc3RpY3MgZ2F0aGVyaW5nIHRvIGJlIHBlciBhZGFwdGVyIGluc3RlYWQgb2YgZ2xvYmFsCisgICAgICAgICAgICB0byB0aGUgZHJpdmVyLgorICAgICAgICAgOC4gQWRkIG1vcmUgaW5mb3JtYXRpb24gYW5kIHN0YXRpc3RpY3MgdG8gdGhlIGFkYXB0ZXIgL3Byb2MgZmlsZToKKyAgICAgICAgICAgIC9wcm9jL3Njc2kvYWR2YW5zeXNbMC4uLl0uCisgICAgICAgICA5LiBSZW1vdmUgJ2NtZF9wZXJfbHVuJyBmcm9tIHRoZSAiS25vd24gUHJvYmxlbXMgb3IgSXNzdWVzIiBsaXN0LgorICAgICAgICAgICAgVGhpcyBwcm9ibGVtIGhhcyBiZWVuIGFkZHJlc3NlZCB3aXRoIHRoZSBTQ1NJIG1pZC1sZXZlbCBjaGFuZ2VzCisgICAgICAgICAgICBtYWRlIGluIHYxLjMuODkuIFRoZSBhZHZhbnN5c19zZWxlY3RfcXVldWVfZGVwdGhzKCkgZnVuY3Rpb24KKyAgICAgICAgICAgIHdhcyBhZGRlZCBmb3IgdGhlIHYxLjMuODkgY2hhbmdlcy4KKworICAgICAxLjYgKDkvMTAvOTYpOgorICAgICAgICAgMS4gSW5jb3Jwb3JhdGUgbWlzY2VsbGFuZW91cyBBc2MgTGlicmFyeSBidWcgZml4ZXMgYW5kIG5ldyBtaWNyb2NvZGUuCisKKyAgICAgMS43ICg5LzI1Lzk2KToKKyAgICAgICAgIDEuIEVuYWJsZSBjbHVzdGVyaW5nIGFuZCBvcHRpbWl6ZSB0aGUgc2V0dGluZyBvZiB0aGUgbWF4aW11bSBudW1iZXIKKyAgICAgICAgICAgIG9mIHNjYXR0ZXIgZ2F0aGVyIGVsZW1lbnRzIGZvciBhbnkgcGFydGljdWxhciBib2FyZC4gQ2x1c3RlcmluZworICAgICAgICAgICAgaW5jcmVhc2VzIENQVSB1dGlsaXphdGlvbiwgYnV0IHJlc3VsdHMgaW4gYSByZWxhdGl2ZWx5IGxhcmdlcgorICAgICAgICAgICAgaW5jcmVhc2UgaW4gSS9PIHRocm91Z2hwdXQuCisgICAgICAgICAyLiBJbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgcmVxdWVzdCBxdWV1aW5nIGZ1bmN0aW9ucyBieQorICAgICAgICAgICAgYWRkaW5nIGEgbGFzdCBwb2ludGVyIHRvIHRoZSBxdWV1ZSBzdHJ1Y3R1cmUuCisgICAgICAgICAzLiBDb3JyZWN0IHByb2JsZW1zIHdpdGggcmVzZXQgYW5kIGFib3J0IHJlcXVlc3QgaGFuZGxpbmcgdGhhdAorICAgICAgICAgICAgY291bGQgaGF2ZSBodW5nIG9yIGNyYXNoZWQgTGludXguCisgICAgICAgICA0LiBBZGQgbW9yZSBpbmZvcm1hdGlvbiB0byB0aGUgYWRhcHRlciAvcHJvYyBmaWxlOgorICAgICAgICAgICAgL3Byb2Mvc2NzaS9hZHZhbnN5c1swLi4uXS4KKyAgICAgICAgIDUuIFJlbW92ZSB0aGUgcmVxdWVzdCB0aW1lb3V0IGlzc3VlIGZvcm0gdGhlIGRyaXZlciBpc3N1ZXMgbGlzdC4KKyAgICAgICAgIDYuIE1pc2NlbGxhbmVvdXMgZG9jdW1lbnRhdGlvbiBhZGRpdGlvbnMgYW5kIGNoYW5nZXMuCisKKyAgICAgMS44ICgxMC80Lzk2KToKKyAgICAgICAgIDEuIE1ha2UgY2hhbmdlcyB0byBoYW5kbGUgdGhlIG5ldyB2Mi4xLjAga2VybmVsIG1lbW9yeSBtYXBwaW5nCisgICAgICAgICAgICBpbiB3aGljaCBhIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MgbWF5IG5vdCBiZSBlcXVpdmFsZW50IHRvIGl0cworICAgICAgICAgICAgYnVzIG9yIERNQSBtZW1vcnkgYWRkcmVzcy4KKyAgICAgICAgIDIuIENoYW5nZSBhYm9ydCBhbmQgcmVzZXQgcmVxdWVzdCBoYW5kbGluZyB0byBtYWtlIGl0IHlldCBldmVuCisgICAgICAgICAgICBtb3JlIHJvYnVzdC4KKyAgICAgICAgIDMuIFRyeSB0byBtaXRpZ2F0ZSByZXF1ZXN0IHN0YXJ2YXRpb24gYnkgc2VuZGluZyBvcmRlcmVkIHJlcXVlc3RzCisgICAgICAgICAgICB0byBoZWF2aWx5IGxvYWRlZCwgdGFnIHF1ZXVpbmcgZW5hYmxlZCBkZXZpY2VzLgorICAgICAgICAgNC4gTWFpbnRhaW4gc3RhdGlzdGljcyBvbiByZXF1ZXN0IHJlc3BvbnNlIHRpbWUuCisgICAgICAgICA1LiBBZGQgcmVxdWVzdCByZXNwb25zZSB0aW1lIHN0YXRpc3RpY3MgYW5kIG90aGVyIGluZm9ybWF0aW9uIHRvCisgICAgICAgICAgICB0aGUgYWRhcHRlciAvcHJvYyBmaWxlOiAvcHJvYy9zY3NpL2FkdmFuc3lzWzAuLi5dLgorCisgICAgIDEuOSAoMTAvMjEvOTYpOgorICAgICAgICAgMS4gQWRkIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgY29kZSAoQVNDX1FVRVVFX0ZMT1dfQ09OVFJPTCkgdG8KKyAgICAgICAgICAgIG1ha2UgdXNlIG9mIG1pZC1sZXZlbCBTQ1NJIGRyaXZlciBkZXZpY2UgcXVldWUgZGVwdGggZmxvdworICAgICAgICAgICAgY29udHJvbCBtZWNoYW5pc20uIFRoaXMgd2lsbCBlbGltaW5hdGUgYWJvcnRzIGNhdXNlZCBieSBhCisgICAgICAgICAgICBkZXZpY2UgYmVpbmcgdW5hYmxlIHRvIGtlZXAgdXAgd2l0aCByZXF1ZXN0cyBhbmQgZWxpbWluYXRlCisgICAgICAgICAgICByZXBlYXQgYnVzeSBvciBRVUVVRSBGVUxMIHN0YXR1cyByZXR1cm5lZCBieSBhIGRldmljZS4KKyAgICAgICAgIDIuIEluY29ycG9yYXRlIG1pc2NlbGxhbmVvdXMgQXNjIExpYnJhcnkgYnVnIGZpeGVzLgorICAgICAgICAgMy4gVG8gYWxsb3cgdGhlIGRyaXZlciB0byB3b3JrIGluIGtlcm5lbHMgd2l0aCBicm9rZW4gbW9kdWxlCisgICAgICAgICAgICBzdXBwb3J0IHNldCAnY21kX3Blcl9sdW4nIGlmIHRoZSBkcml2ZXIgaXMgY29tcGlsZWQgYXMgYQorICAgICAgICAgICAgbW9kdWxlLiBUaGlzIGNoYW5nZSBhZmZlY3RzIGtlcm5lbHMgdjEuMy44OSB0byBwcmVzZW50LgorICAgICAgICAgNC4gUmVtb3ZlIFBDSSBCSU9TIGFkZHJlc3MgZnJvbSB0aGUgZHJpdmVyIGJhbm5lci4gVGhlIFBDSSBCSU9TCisgICAgICAgICAgICBpcyByZWxvY2F0ZWQgYnkgdGhlIG1vdGhlcmJvYXJkIEJJT1MgYW5kIGl0cyBuZXcgYWRkcmVzcyBjYW4KKyAgICAgICAgICAgIG5vdCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBkcml2ZXIuCisgICAgICAgICA1LiBBZGQgbWlkLWxldmVsIFNDU0kgcXVldWUgZGVwdGggaW5mb3JtYXRpb24gdG8gdGhlIGFkYXB0ZXIKKyAgICAgICAgICAgIC9wcm9jIGZpbGU6IC9wcm9jL3Njc2kvYWR2YW5zeXNbMC4uLl0uCisKKyAgICAgMi4wICgxMS8xNC85Nik6CisgICAgICAgICAxLiBDaGFuZ2UgYWxsb2NhdGlvbiBvZiBnbG9iYWwgc3RydWN0dXJlcyB1c2VkIGZvciBkZXZpY2UKKyAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIHRvIGd1YXJhbnRlZSB0aGV5IGFyZSBpbiBETUEtYWJsZSBtZW1vcnkuCisgICAgICAgICAgICBQcmV2aW91c2x5IHdoZW4gdGhlIGRyaXZlciB3YXMgbG9hZGVkIGFzIGEgbW9kdWxlIHRoZXNlCisgICAgICAgICAgICBzdHJ1Y3R1cmVzIG1pZ2h0IG5vdCBoYXZlIGJlZW4gaW4gRE1BLWFibGUgbWVtb3J5LCBjYXVzaW5nCisgICAgICAgICAgICBkZXZpY2UgaW5pdGlhbGl6YXRpb24gdG8gZmFpbC4KKworICAgICAyLjEgKDEyLzMwLzk2KToKKyAgICAgICAgIDEuIEluIGFkdmFuc3lzX3Jlc2V0KCksIGlmIHRoZSByZXF1ZXN0IGlzIGEgc3luY2hyb25vdXMgcmVzZXQKKyAgICAgICAgICAgIHJlcXVlc3QsIGV2ZW4gaWYgdGhlIHJlcXVlc3Qgc2VyaWFsIG51bWJlciBoYXMgY2hhbmdlZCwgdGhlbgorICAgICAgICAgICAgY29tcGxldGUgdGhlIHJlcXVlc3QuCisgICAgICAgICAyLiBBZGQgQXNjIExpYnJhcnkgYnVnIGZpeGVzIGluY2x1ZGluZyBuZXcgbWljcm9jb2RlLgorICAgICAgICAgMy4gQ2xlYXIgaW5xdWlyeSBidWZmZXIgYmVmb3JlIHVzaW5nIGl0LgorICAgICAgICAgNC4gQ29ycmVjdCBpZmRlZiB0eXBvLgorCisgICAgIDIuMiAoMS8xNS85Nyk6CisgICAgICAgICAxLiBBZGQgQXNjIExpYnJhcnkgYnVnIGZpeGVzIGluY2x1ZGluZyBuZXcgbWljcm9jb2RlLgorICAgICAgICAgMi4gQWRkIHN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXIgcmF0ZSBpbmZvcm1hdGlvbiB0byB0aGUKKyAgICAgICAgICAgIGFkYXB0ZXIgL3Byb2MgZmlsZTogL3Byb2Mvc2NzaS9hZHZhbnN5c1swLi4uXS4KKyAgICAgICAgIDMuIENoYW5nZSBBRFZBTlNZU19ERUJVRyB0byBiZSBkaXNhYmxlZCBieSBkZWZhdWx0LiBUaGlzCisgICAgICAgICAgICB3aWxsIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgZHJpdmVyIGltYWdlLCBlbGltaW5hdGUgZXhlY3V0aW9uCisgICAgICAgICAgICBvdmVyaGVhZCwgYW5kIHJlbW92ZSB1bm5lZWRlZCBzeW1ib2xzIGZyb20gdGhlIGtlcm5lbCBzeW1ib2wKKyAgICAgICAgICAgIHNwYWNlIHRoYXQgd2VyZSBwcmV2aW91c2x5IGFkZGVkIGJ5IHRoZSBkcml2ZXIuCisgICAgICAgICA0LiBBZGQgbmV3IGNvbXBpbGUtdGltZSBvcHRpb24gQURWQU5TWVNfQVNTRVJUIGZvciBhc3NlcnRpb24KKyAgICAgICAgICAgIGNvZGUgdGhhdCB1c2VkIHRvIGJlIGRlZmluZWQgd2l0aGluIEFEVkFOU1lTX0RFQlVHLiBUaGlzCisgICAgICAgICAgICBvcHRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0LgorCisgICAgIDIuOCAoNS8yNi85Nyk6CisgICAgICAgICAxLiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi44IHRvIHN5bmNocm9uaXplIHRoZSBMaW51eCBkcml2ZXIKKyAgICAgICAgICAgIHZlcnNpb24gbnVtYmVyaW5nIHdpdGggb3RoZXIgQWR2YW5TeXMgZHJpdmVycy4KKyAgICAgICAgIDIuIFJlZm9ybWF0IHNvdXJjZSBmaWxlcyB3aXRob3V0IHRhYnMgdG8gcHJlc2VudCB0aGUgc2FtZSB2aWV3CisgICAgICAgICAgICBvZiB0aGUgZmlsZSB0byBldmVyeW9uZSByZWdhcmRsZXNzIG9mIHRoZSBlZGl0b3IgdGFiIHNldHRpbmcKKyAgICAgICAgICAgIGJlaW5nIHVzZWQuCisgICAgICAgICAzLiBBZGQgQXNjIExpYnJhcnkgYnVnIGZpeGVzLgorCisgICAgIDMuMUEgKDEvOC85OCk6CisgICAgICAgICAxLiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMy4xIHRvIGluZGljYXRlIHRoYXQgc3VwcG9ydCBmb3IKKyAgICAgICAgICAgIFVsdHJhLVdpZGUgYWRhcHRlcnMgKEFCUC05NDBVVykgaXMgaW5jbHVkZWQgaW4gdGhpcyByZWxlYXNlLgorICAgICAgICAgMi4gQWRkIEFzYyBMaWJyYXJ5IChOYXJyb3cgQm9hcmQpIGJ1ZyBmaXhlcy4KKyAgICAgICAgIDMuIFJlcG9ydCBhbiB1bmRlcnJ1biBjb25kaXRpb24gd2l0aCB0aGUgaG9zdCBzdGF0dXMgYnl0ZSBzZXQKKyAgICAgICAgICAgIHRvIERJRF9VTkRFUlJVTi4gQ3VycmVudGx5IERJRF9VTkRFUlJVTiBpcyBkZWZpbmVkIHRvIDAgd2hpY2gKKyAgICAgICAgICAgIGNhdXNlcyB0aGUgdW5kZXJydW4gY29uZGl0aW9uIHRvIGJlIGlnbm9yZWQuIFdoZW4gTGludXggZGVmaW5lcworICAgICAgICAgICAgaXRzIG93biBESURfVU5ERVJSVU4gdGhlIGNvbnN0YW50IGRlZmluZWQgaW4gdGhpcyBmaWxlIGNhbiBiZQorICAgICAgICAgICAgcmVtb3ZlZC4KKyAgICAgICAgIDQuIEFkZCBwYXRjaCB0byBBc2NXYWl0VGl4SVNSRG9uZSgpLgorICAgICAgICAgNS4gQWRkIHN1cHBvcnQgZm9yIHVwIHRvIDE2IGRpZmZlcmVudCBBZHZhblN5cyBob3N0IGFkYXB0ZXIgU0NTSQorICAgICAgICAgICAgY2hhbm5lbHMgaW4gb25lIHN5c3RlbS4gVGhpcyBhbGxvd3MgZm91ciBjYXJkcyB3aXRoIGZvdXIgY2hhbm5lbHMKKyAgICAgICAgICAgIHRvIGJlIHVzZWQgaW4gb25lIHN5c3RlbS4KKworICAgICAzLjFCICgxLzkvOTgpOgorICAgICAgICAgMS4gSGFuZGxlIHRoYXQgUENJIHJlZ2lzdGVyIGJhc2UgYWRkcmVzc2VzIGFyZSBub3QgYWx3YXlzIHBhZ2UKKyAgICAgICAgICAgIGFsaWduZWQgZXZlbiB0aG91Z2ggaW9yZW1hcCgpIHJlcXVpcmVzIHRoYXQgdGhlIGFkZHJlc3MgYXJndW1lbnQKKyAgICAgICAgICAgIGJlIHBhZ2UgYWxpZ25lZC4KKworICAgICAzLjFDICgxLzEwLzk4KToKKyAgICAgICAgIDEuIFVwZGF0ZSBsYXRlc3QgQklPUyB2ZXJzaW9uIGNoZWNrZWQgZm9yIGZyb20gdGhlIC9wcm9jIGZpbGUuCisgICAgICAgICAyLiBEb24ndCBzZXQgbWljcm9jb2RlIFNEVFIgdmFyaWFibGUgYXQgaW5pdGlhbGl6YXRpb24uIEluc3RlYWQKKyAgICAgICAgICAgIHdhaXQgdW50aWwgZGV2aWNlIGNhcGFiaWxpdGllcyBoYXZlIGJlZW4gZGV0ZWN0ZWQgZnJvbSBhbiBJbnF1aXJ5CisgICAgICAgICAgICBjb21tYW5kLgorCisgICAgIDMuMUQgKDEvMjEvOTgpOgorICAgICAgICAgMS4gSW1wcm92ZSBwZXJmb3JtYW5jZSB3aGVuIHRoZSBkcml2ZXIgaXMgY29tcGlsZWQgYXMgbW9kdWxlIGJ5CisgICAgICAgICAgICBhbGxvd2luZyB1cCB0byA2NCBzY2F0dGVyLWdhdGhlciBlbGVtZW50cyBpbnN0ZWFkIG9mIDguCisKKyAgICAgMy4xRSAoNS8xLzk4KToKKyAgICAgICAgIDEuIFNldCB0aW1lIGRlbGF5IGluIEFzY1dhaXRUaXhJU1JEb25lKCkgdG8gMTAwMCBtcy4KKyAgICAgICAgIDIuIEluY2x1ZGUgU01QIGxvY2tpbmcgY2hhbmdlcy4KKyAgICAgICAgIDMuIEZvciB2Mi4xLjkzIGFuZCBuZXdlciBrZXJuZWxzIHVzZSBDT05GSUdfUENJIGFuZCBuZXcgUENJIEJJT1MKKyAgICAgICAgICAgIGFjY2VzcyBmdW5jdGlvbnMuCisgICAgICAgICA0LiBVcGRhdGUgYm9hcmQgc2VyaWFsIG51bWJlciBwcmludGluZy4KKyAgICAgICAgIDUuIFRyeSBhbGxvY2F0aW5nIGFuIElSUSBib3RoIHdpdGggYW5kIHdpdGhvdXQgdGhlIFNBX0lOVEVSUlVQVAorICAgICAgICAgICAgZmxhZyBzZXQgdG8gYWxsb3cgSVJRIHNoYXJpbmcgd2l0aCBkcml2ZXJzIHRoYXQgZG8gbm90IHNldAorICAgICAgICAgICAgdGhlIFNBX0lOVEVSUlVQVCBmbGFnLiBBbHNvIGRpc3BsYXkgYSBtb3JlIGRlc2NyaXB0aXZlIGVycm9yCisgICAgICAgICAgICBtZXNzYWdlIGlmIHJlcXVlc3RfaXJxKCkgZmFpbHMuCisgICAgICAgICA2LiBVcGRhdGUgdG8gbGF0ZXN0IEFzYyBhbmQgQWR2IExpYnJhcmllcy4KKworICAgICAzLjJBICg3LzIyLzk5KToKKyAgICAgICAgIDEuIFVwZGF0ZSBBZHYgTGlicmFyeSB0byA0LjE2IHdoaWNoIGluY2x1ZGVzIHN1cHBvcnQgZm9yCisgICAgICAgICAgICB0aGUgQVNDMzhDMDgwMCAoVWx0cmEyL0xWRCkgSUMuCisKKyAgICAgMy4yQiAoOC8yMy85OSk6CisgICAgICAgICAxLiBDb3JyZWN0IFBDSSBjb21waWxlIHRpbWUgb3B0aW9uIGZvciB2Mi4xLjkzIGFuZCBncmVhdGVyCisgICAgICAgICAgICBrZXJuZWxzLCBhZHZhbnN5c19pbmZvKCkgc3RyaW5nLCBhbmQgZGVidWcgY29tcGlsZSB0aW1lCisgICAgICAgICAgICBvcHRpb24uCisgICAgICAgICAyLiBDb3JyZWN0IER2Y1NsZWVwTWlsbGlTZWNvbmQoKSBmb3IgdjIuMS4wIGFuZCBncmVhdGVyCisgICAgICAgICAgICBrZXJuZWxzLiBUaGlzIGNhdXNlZCBhbiBMVkQgZGV0ZWN0aW9uL0JJU1QgcHJvYmxlbSBwcm9ibGVtCisgICAgICAgICAgICBhbW9uZyBvdGhlciB0aGluZ3MuCisgICAgICAgICAzLiBTb3J0IFBDSSBjYXJkcyBieSBQQ0kgQnVzLCBTbG90LCBGdW5jdGlvbiBhc2NlbmRpbmcgb3JkZXIKKyAgICAgICAgICAgIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgQklPUy4KKyAgICAgICAgIDQuIFVwZGF0ZSB0byBBc2MgTGlicmFyeSBTMTIxIGFuZCBBZHYgTGlicmFyeSA1LjIuCisKKyAgICAgMy4yQyAoOC8yNC85OSk6CisgICAgICAgICAxLiBDb3JyZWN0IFBDSSBjYXJkIGRldGVjdGlvbiBidWcgaW50cm9kdWNlZCBpbiAzLjJCIHRoYXQKKyAgICAgICAgICAgIHByZXZlbnRlZCBQQ0kgY2FyZHMgZnJvbSBiZWluZyBkZXRlY3RlZCBpbiBrZXJuZWxzIG9sZGVyCisgICAgICAgICAgICB0aGFuIHYyLjEuOTMuCisKKyAgICAgMy4yRCAoOC8yNi85OSk6CisgICAgICAgICAxLiBDb3JyZWN0IC9wcm9jIGRldmljZSBzeW5jaHJvbm91cyBzcGVlZCBpbmZvcm1hdGlvbiBkaXNwbGF5LgorICAgICAgICAgICAgQWxzbyB3aGVuIHJlLW5lZ290aWF0aW9uIGlzIHBlbmRpbmcgZm9yIGEgdGFyZ2V0IGRldmljZQorICAgICAgICAgICAgbm90ZSB0aGlzIGNvbmRpdGlvbiB3aXRoIGFuICogYW5kIGZvb3Rub3RlLgorICAgICAgICAgMi4gQ29ycmVjdCBpbml0aWFsaXphdGlvbiBwcm9ibGVtIHdpdGggVWx0cmEtV2lkZSBjYXJkcyB0aGF0CisgICAgICAgICAgICBoYXZlIGEgcHJlLTMuMiBCSU9TLiBBIG1pY3JvY29kZSB2YXJpYWJsZSBjaGFuZ2VkIGxvY2F0aW9ucworICAgICAgICAgICAgaW4gMy4yIGFuZCBncmVhdGVyIEJJT1NlcyB3aGljaCBjYXVzZWQgV0RUUiB0byBiZSBhdHRlbXB0ZWQKKyAgICAgICAgICAgIGVycm9uZW91c2x5IHdpdGggZHJpdmVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBXRFRSLgorCisgICAgIDMuMkUgKDgvMzAvOTkpOgorICAgICAgICAgMS4gRml4IGNvbXBpbGUgZXJyb3IgY2F1c2VkIGJ5IHYyLjMuMTMgUENJIHN0cnVjdHVyZSBjaGFuZ2UuCisgICAgICAgICAyLiBSZW1vdmUgZmllbGQgZnJvbSBBU0NFRVBfQ09ORklHIHRoYXQgcmVzdWx0ZWQgaW4gYW4gRUVQUk9NCisgICAgICAgICAgICBjaGVja3N1bSBlcnJvciBmb3IgSVNBIGNhcmRzLgorICAgICAgICAgMy4gUmVtb3ZlIEFTQ19RVUVVRV9GTE9XX0NPTlRST0wgY29uZGl0aW9uYWwgY29kZS4gVGhlIG1pZC1sZXZlbAorICAgICAgICAgICAgU0NTSSBjaGFuZ2VzIHRoYXQgaXQgZGVwZW5kZWQgb24gd2VyZSBuZXZlciBpbmNsdWRlZCBpbiBMaW51eC4KKworICAgICAzLjJGICg5LzMvOTkpOgorICAgICAgICAgMS4gSGFuZGxlIG5ldyBpbml0aWFsIGZ1bmN0aW9uIGNvZGUgYWRkZWQgaW4gdjIuMy4xNiBmb3IgYWxsCisgICAgICAgICAgICBkcml2ZXIgdmVyc2lvbnMuCisKKyAgICAgMy4yRyAoOS84Lzk5KToKKyAgICAgICAgIDEuIEZpeCBQQ0kgYm9hcmQgZGV0ZWN0aW9uIGluIHYyLjMuMTMgYW5kIGdyZWF0ZXIga2VybmVscy4KKyAgICAgICAgIDIuIEZpeCBjb21pcGxlIGVycm9ycyBpbiB2Mi4zLlggd2l0aCBkZWJ1Z2dpbmcgZW5hYmxlZC4KKworICAgICAzLjJIICg5LzEzLzk5KToKKyAgICAgICAgIDEuIEFkZCA2NC1iaXQgYWRkcmVzcywgbG9uZyBzdXBwb3J0IGZvciBBbHBoYSBhbmQgVWx0cmFTUEFSQy4KKyAgICAgICAgICAgIFRoZSBkcml2ZXIgaGFzIGJlZW4gdmVyaWZpZWQgdG8gd29yayBvbiBhbiBBbHBoYSBzeXN0ZW0uCisgICAgICAgICAyLiBBZGQgcGFydGlhbCBieXRlIG9yZGVyIGhhbmRsaW5nIHN1cHBvcnQgZm9yIFBvd2VyIFBDIGFuZAorICAgICAgICAgICAgb3RoZXIgYmlnLWVuZGlhbiBwbGF0Zm9ybXMuIFRoaXMgc3VwcG9ydCBoYXMgbm90IHlldCBiZWVuCisgICAgICAgICAgICBjb21wbGV0ZWQgb3IgdmVyaWZpZWQuCisgICAgICAgICAzLiBGb3Igd2lkZSBib2FyZHMgcmVwbGFjZSBibG9jayB6ZXJvaW5nIG9mIHJlcXVlc3QgYW5kCisgICAgICAgICAgICBzY2F0dGVyLWdhdGhlciBzdHJ1Y3R1cmVzIHdpdGggaW5kaXZpZHVhbCBmaWVsZCBpbml0aWFsaXphdGlvbgorICAgICAgICAgICAgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KKyAgICAgICAgIDQuIENvcnJlY3QgYW5kIGNsYXJpZnkgUk9NIEJJT1MgdmVyc2lvbiBkZXRlY3Rpb24uCisKKyAgICAgMy4ySSAoMTAvOC85OSk6CisgICAgICAgICAxLiBVcGRhdGUgdG8gQWR2IExpYnJhcnkgNS40LgorICAgICAgICAgMi4gQWRkIHYyLjMuMTkgdW5kZXJydW4gcmVwb3J0aW5nIHRvIGFzY19pc3JfY2FsbGJhY2soKSBhbmQKKyAgICAgICAgICAgIGFkdl9pc3JfY2FsbGJhY2soKS4gIFJlbW92ZSBESURfVU5ERVJSVU4gY29uc3RhbnQgYW5kIG90aGVyCisgICAgICAgICAgICBubyBsb25nZXIgbmVlZGVkIGNvZGUgdGhhdCBwcmV2aW91c2x5IGRvY3VtZW50ZWQgdGhlIGxhY2sKKyAgICAgICAgICAgIG9mIHVuZGVycnVuIGhhbmRsaW5nLgorCisgICAgIDMuMkogKDEwLzE0Lzk5KToKKyAgICAgICAgIDEuIEVsaW1pbmF0ZSBjb21waWxlIGVycm9ycyBmb3IgdjIuMCBhbmQgZWFybGllciBrZXJuZWxzLgorCisgICAgIDMuMksgKDExLzE1Lzk5KToKKyAgICAgICAgIDEuIENvcnJlY3QgZGVidWcgY29tcGlsZSBlcnJvciBpbiBhc2NfcHJ0X2Fkdl9zY3NpX3JlcV9xKCkuCisgICAgICAgICAyLiBVcGRhdGUgQWR2IExpYnJhcnkgdG8gNS41LgorICAgICAgICAgMy4gQWRkIGlmZGVmIGhhbmRsaW5nIGZvciAvcHJvYyBjaGFuZ2VzIGFkZGVkIGluIHYyLjMuMjguCisgICAgICAgICA0LiBJbmNyZWFzZSBXaWRlIGJvYXJkIHNjYXR0ZXItZ2F0aGVyIGxpc3QgbWF4aW11bSBsZW5ndGggdG8KKyAgICAgICAgICAgIDI1NSB3aGVuIHRoZSBkcml2ZXIgaXMgY29tcGlsZWQgaW50byB0aGUga2VybmVsLgorCisgICAgIDMuMkwgKDExLzE4Lzk5KToKKyAgICAgICAgIDEuIEZpeCBidWcgaW4gYWR2X2dldF9zZ2xpc3QoKSB0aGF0IGNhdXNlZCBhbiBhc3NlcnRpb24gZmFpbHVyZQorICAgICAgICAgICAgYXQgbGluZSA3NDc1LiBUaGUgcmVxcC0+c2dibGtwIHBvaW50ZXIgbXVzdCBiZSBpbml0aWFsaXplZAorICAgICAgICAgICAgdG8gTlVMTCBpbiBhZHZfZ2V0X3NnbGlzdCgpLgorCisgICAgIDMuMk0gKDExLzI5Lzk5KToKKyAgICAgICAgIDEuIFJlYWxseSBmaXggYnVnIGluIGFkdl9nZXRfc2dsaXN0KCkuCisgICAgICAgICAyLiBJbmNvcnBvcmF0ZSB2Mi4zLjI5IGNoYW5nZXMgaW50byBkcml2ZXIuCisKKyAgICAgMy4yTiAoNC8xLzAwKToKKyAgICAgICAgIDEuIEFkZCBDT05GSUdfSVNBIGlmZGVmIGNvZGUuCisgICAgICAgICAyLiBJbmNsdWRlIGFkdmFuc3lzX2ludGVycnVwdHNfZW5hYmxlZCBuYW1lIGNoYW5nZSBwYXRjaC4KKyAgICAgICAgIDMuIEZvciA+PSB2Mi4zLjI4IHVzZSBuZXcgU0NTSSBlcnJvciBoYW5kbGluZyB3aXRoIG5ldyBmdW5jdGlvbgorICAgICAgICAgICAgYWR2YW5zeXNfZWhfYnVzX3Jlc2V0KCkuIERvbid0IGluY2x1ZGUgYW4gYWJvcnQgZnVuY3Rpb24KKyAgICAgICAgICAgIGJlY2F1c2Ugb2YgYmFzZSBsaWJyYXJ5IGxpbWl0YXRpb25zLgorICAgICAgICAgNC4gRm9yID49IHYyLjMuMjggdXNlIHBlciBib2FyZCBsb2NrIGluc3RlYWQgb2YgaW9fcmVxdWVzdF9sb2NrLgorICAgICAgICAgNS4gRm9yID49IHYyLjMuMjggZWxpbWluYXRlIGFkdmFuc3lzX2NvbW1hbmQoKSBhbmQKKyAgICAgICAgICAgIGFkdmFuc3lzX2NvbW1hbmRfZG9uZSgpLgorICAgICAgICAgNi4gQWRkIHNvbWUgY2hhbmdlcyBmb3IgUG93ZXJQQyAoQmlnIEVuZGlhbikgc3VwcG9ydCwgYnV0IGl0IGlzbid0CisgICAgICAgICAgICB3b3JraW5nIHlldC4KKyAgICAgICAgIDcuIEZpeCAibm9uZXhpc3RlbnQgcmVzb3VyY2UgZnJlZSIgcHJvYmxlbSB0aGF0IG9jY3VycmVkIG9uIGEgbW9kdWxlCisgICAgICAgICAgICB1bmxvYWQgZm9yIGJvYXJkcyB3aXRoIGFuIEkvTyBzcGFjZSA+PSAyNTUuIFRoZSAnbl9pb19wb3J0JyBmaWVsZAorICAgICAgICAgICAgaXMgb25seSBvbmUgYnl0ZSBhbmQgY2FuIG5vdCBiZSB1c2VkIHRvIGhvbGQgYW4gaW9wb3J0IGxlbmd0aCBtb3JlCisgICAgICAgICAgICB0aGFuIDI1NS4KKworICAgICAzLjNBICg0LzQvMDApOgorICAgICAgICAgMS4gVXBkYXRlIHRvIEFkdiBMaWJyYXJ5IDUuOC4KKyAgICAgICAgIDIuIEZvciB3aWRlIGNhcmRzIGFkZCBzdXBwb3J0IGZvciBDREJzIHVwIHRvIDE2IGJ5dGVzLgorICAgICAgICAgMy4gRWxpbWluYXRlIHdhcm5pbmdzIHdoZW4gQ09ORklHX1BST0NfRlMgaXMgbm90IGRlZmluZWQuCisKKyAgICAgMy4zQiAoNS8xLzAwKToKKyAgICAgICAgIDEuIFN1cHBvcnQgZm9yIFBvd2VyUEMgKEJpZyBFbmRpYW4pIHdpZGUgY2FyZHMuIE5hcnJvdyBjYXJkcworICAgICAgICAgICAgc3RpbGwgbmVlZCB3b3JrLgorICAgICAgICAgMi4gQ2hhbmdlIGJpdGZpZWxkcyB0byBzaGlmdCBhbmQgbWFzayBhY2Nlc3MgZm9yIGVuZGlhbgorICAgICAgICAgICAgcG9ydGFiaWxpdHkuCisKKyAgICAgMy4zQyAoMTAvMTMvMDApOgorICAgICAgICAgMS4gVXBkYXRlIGZvciBsYXRlc3QgMi40IGtlcm5lbC4KKyAgICAgICAgIDIuIFRlc3QgQUJQLTQ4MCBDYXJkQnVzIHN1cHBvcnQgaW4gMi40IGtlcm5lbCAtIHdvcmtzIQorICAgICAgICAgMy4gVXBkYXRlIHRvIEFzYyBMaWJyYXJ5IFMxMjMuCisgICAgICAgICA0LiBVcGRhdGUgdG8gQWR2IExpYnJhcnkgNS4xMi4KKworICAgICAzLjNEICgxMS8yMi8wMCk6CisgICAgICAgICAxLiBVcGRhdGUgZm9yIGxhdGVzdCAyLjQga2VybmVsLgorICAgICAgICAgMi4gQ3JlYXRlIHBhdGNoZXMgZm9yIDIuMiBhbmQgMi40IGtlcm5lbHMuCisKKyAgICAgMy4zRSAoMS85LzAxKToKKyAgICAgICAgIDEuIE5vdyB0aGF0IDIuNCBpcyByZWxlYXNlZCByZW1vdmUgaWZkZWYgY29kZSBmb3Iga2VybmVsIHZlcnNpb25zCisgICAgICAgICAgICBsZXNzIHRoYW4gMi4yLiBUaGUgZHJpdmVyIGlzIG5vdyBvbmx5IHN1cHBvcnRlZCBpbiBrZXJuZWxzIDIuMiwKKyAgICAgICAgICAgIDIuNCwgYW5kIGdyZWF0ZXIuCisgICAgICAgICAyLiBBZGQgY29kZSB0byByZWxlYXNlIGFuZCBhY3F1aXJlIHRoZSBpb19yZXF1ZXN0X2xvY2sgaW4KKyAgICAgICAgICAgIHRoZSBkcml2ZXIgZW50cnlwb2ludCBmdW5jdGlvbnM6IGFkdmFuc3lzX2RldGVjdCBhbmQKKyAgICAgICAgICAgIGFkdmFuc3lzX3F1ZXVlY29tbWFuZC4gSW4ga2VybmVsIDIuNCB0aGUgU0NTSSBtaWQtbGV2ZWwgZHJpdmVyCisgICAgICAgICAgICBzdGlsbCBob2xkcyB0aGUgaW9fcmVxdWVzdF9sb2NrIG9uIGVudHJ5IHRvIFNDU0kgbG93LWxldmVsIGRyaXZlcnMuCisgICAgICAgICAgICBUaGlzIHdhcyBzdXBwb3NlZCB0byBiZSByZW1vdmVkIGJlZm9yZSAyLjQgd2FzIHJlbGVhc2VkIGJ1dCBuZXZlcgorICAgICAgICAgICAgaGFwcGVuZWQuIFdoZW4gdGhlIG1pZC1sZXZlbCBTQ1NJIGRyaXZlciBpcyBjaGFuZ2VkIGFsbCByZWZlcmVuY2VzCisgICAgICAgICAgICB0byB0aGUgaW9fcmVxdWVzdF9sb2NrIHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIGRyaXZlci4KKyAgICAgICAgIDMuIFNpbXBsaWZ5IGVycm9yIGhhbmRsaW5nIGJ5IHJlbW92aW5nIGFkdmFuc3lzX2Fib3J0KCksCisgICAgICAgICAgICBBc2NBYm9ydFNSQigpLCBBc2NSZXNldERldmljZSgpLiBTQ1NJIGJ1cyByZXNldCByZXF1ZXN0cyBhcmUKKyAgICAgICAgICAgIG5vdyBoYW5kbGVkIGJ5IHJlc2V0dGluZyB0aGUgU0NTSSBidXMgYW5kIGZ1bGx5IHJlLWluaXRpYWxpemluZworICAgICAgICAgICAgdGhlIGNoaXAuIFRoaXMgc2ltcGxlIG1ldGhvZCBvZiBlcnJvciByZWNvdmVyeSBoYXMgcHJvdmVuIHRvIHdvcmsKKyAgICAgICAgICAgIG1vc3QgcmVsaWFibHkgYWZ0ZXIgYXR0ZW1wdHMgYXQgZGlmZmVyZW50IG1ldGhvZHMuIEFsc28gbm93IG9ubHkKKyAgICAgICAgICAgIHN1cHBvcnQgdGhlICJuZXciIGVycm9yIGhhbmRsaW5nIG1ldGhvZCBhbmQgcmVtb3ZlIHRoZSBvYnNvbGV0ZQorICAgICAgICAgICAgZXJyb3IgaGFuZGxpbmcgaW50ZXJmYWNlLgorICAgICAgICAgNC4gRml4IGRlYnVnIGJ1aWxkIGVycm9ycy4KKworICAgICAzLjNGICgxLzI0LzAxKToKKyAgICAgICAgIDEuIE1lcmdlIHdpdGggQ29ubmVjdENvbSB2ZXJzaW9uIGZyb20gQW5keSBLZWxsbmVyIHdoaWNoCisgICAgICAgICAgICB1cGRhdGVzIEFkdiBMaWJyYXJ5IHRvIDUuMTQuCisgICAgICAgICAyLiBNYWtlIFBvd2VyUEMgKEJpZyBFbmRpYW4pIHdvcmsgZm9yIG5hcnJvdyBjYXJkcyBhbmQKKyAgICAgICAgICAgIGZpeCBwcm9ibGVtcyB3cml0aW5nIEVFUFJPTSBmb3Igd2lkZSBjYXJkcy4KKyAgICAgICAgIDMuIFJlbW92ZSBpbnRlcnJ1cHRzX2VuYWJsZWQgYXNzZXJ0aW9uIGZ1bmN0aW9uLgorCisgICAgIDMuM0cgKDIvMTYvMDEpOgorICAgICAgICAgMS4gUmV0dXJuIGFuIGVycm9yIGZyb20gbmFycm93IGJvYXJkcyBpZiBwYXNzZWQgYSAxNiBieXRlCisgICAgICAgICAgICBDREIuIFRoZSB3aWRlIGJvYXJkIGNhbiBhbHJlYWR5IGhhbmRsZSAxNiBieXRlIENEQnMuCisKKyAgICAgMy4zR0ogKDQvMTUvMDIpOgorCSAxLiBoYWNrcyBmb3IgbGsgMi41IHNlcmllcyAoRC4gR2lsYmVydCkKKworICAgICAzLjNHSkQgKDEwLzE0LzAyKToKKyAgICAgICAgIDEuIGNoYW5nZSBzZWxlY3RfcXVldWVfZGVwdGhzIHRvIHNsYXZlX2NvbmZpZ3VyZQorCSAyLiBtYWtlIGNtZF9wZXJfbHVuIGJlIHNhbmUgYWdhaW4KKworICAgICAzLjNLIFsyMDA0LzA2LzI0XToKKyAgICAgICAgIDEuIGNvbnRpbnVpbmcgY2xlYW51cCBmb3IgbGsgMi42IHNlcmllcworICAgICAgICAgMi4gRml4IHByb2JsZW0gaW4gbGsgMi42LjctYmsyIHRoYXQgYnJva2UgUENJIHdpZGUgY2FyZHMKKyAgICAgICAgIDMuIEZpeCBwcm9ibGVtIHRoYXQgb29wc2VkIElTQSBjYXJkcworCisgIEkuIEtub3duIFByb2JsZW1zL0ZpeCBMaXN0IChYWFgpCisKKyAgICAgMS4gTmVlZCB0byBhZGQgbWVtb3J5IG1hcHBpbmcgd29ya2Fyb3VuZC4gVGVzdCB0aGUgbWVtb3J5IG1hcHBpbmcuCisgICAgICAgIElmIGl0IGRvZXNuJ3Qgd29yayByZXZlcnQgdG8gSS9PIHBvcnQgYWNjZXNzLiBDYW4gYSB0ZXN0IGJlIGRvbmUKKyAgICAgICAgc2FmZWx5PworICAgICAyLiBIYW5kbGUgYW4gaW50ZXJydXB0IG5vdCB3b3JraW5nLiBLZWVwIGFuIGludGVycnVwdCBjb3VudGVyIGluCisgICAgICAgIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4gSW4gdGhlIHRpbWVvdXQgZnVuY3Rpb24gaWYgdGhlIGludGVycnVwdAorICAgICAgICBoYXMgbm90IG9jY3VycmVkIHRoZW4gcHJpbnQgYSBtZXNzYWdlIGFuZCBydW4gaW4gcG9sbGVkIG1vZGUuCisgICAgIDMuIEFsbG93IGJ1cyB0eXBlIHNjYW5uaW5nIG9yZGVyIHRvIGJlIGNoYW5nZWQuCisgICAgIDQuIE5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yIHRhcmdldCBtb2RlIGNvbW1hbmRzLCBjZi4gQ0FNIFhQVC4KKworICBKLiBDcmVkaXRzIChDaHJvbm9sb2dpY2FsIE9yZGVyKQorCisgICAgIEJvYiBGcmV5IDxiZnJleUB0dXJib2xpbnV4LmNvbS5jbj4gd3JvdGUgdGhlIEFkdmFuU3lzIFNDU0kgZHJpdmVyCisgICAgIGFuZCBtYWludGFpbmVkIGl0IHVwIHRvIDMuM0YuIEhlIGNvbnRpbnVlcyB0byBhbnN3ZXIgcXVlc3Rpb25zCisgICAgIGFuZCBoZWxwIG1haW50YWluIHRoZSBkcml2ZXIuCisKKyAgICAgTmF0aGFuIEhhcnR3ZWxsIDxtYWdlQGNkYzMuY2RjLm5ldD4gcHJvdmlkZWQgdGhlIGRpcmVjdGlvbnMgYW5kCisgICAgIGJhc2lzIGZvciB0aGUgTGludXggdjEuMy5YIGNoYW5nZXMgd2hpY2ggd2VyZSBpbmNsdWRlZCBpbiB0aGUKKyAgICAgMS4yIHJlbGVhc2UuCisKKyAgICAgVGhvbWFzIEUgWmVydWNoYSA8emVydWNoYUBzaGVsbC5wb3J0YWwuY29tPiBwb2ludGVkIG91dCBhIGJ1ZworICAgICBpbiBhZHZhbnN5c19iaW9zcGFyYW0oKSB3aGljaCB3YXMgZml4ZWQgaW4gdGhlIDEuMyByZWxlYXNlLgorCisgICAgIEVyaWsgUmF0Y2xpZmZlIDxlcmlrQGNhbGRlcmEuY29tPiBoYXMgZG9uZSB0ZXN0aW5nIG9mIHRoZQorICAgICBBZHZhblN5cyBkcml2ZXIgaW4gdGhlIENhbGRlcmEgcmVsZWFzZXMuCisKKyAgICAgUmlrIHZhbiBSaWVsIDxILkgudmFuUmllbEBmeXMucnV1Lm5sPiBwcm92aWRlZCBhIHBhdGNoIHRvCisgICAgIEFzY1dhaXRUaXhJU1JEb25lKCkgd2hpY2ggaGUgZm91bmQgbmVjZXNzYXJ5IHRvIG1ha2UgdGhlCisgICAgIGRyaXZlciB3b3JrIHdpdGggYSBTQ1NJLTEgZGlzay4KKworICAgICBNYXJrIE1vcmFuIDxtbW9yYW5AbW1vcmFuLmNvbT4gaGFzIGhlbHBlZCB0ZXN0IFVsdHJhLVdpZGUKKyAgICAgc3VwcG9ydCBpbiB0aGUgMy4xQSBkcml2ZXIuCisKKyAgICAgRG91ZyBHaWxiZXJ0IDxkZ2lsYmVydEBpbnRlcmxvZy5jb20+IGhhcyBtYWRlIGNoYW5nZXMgYW5kCisgICAgIHN1Z2dlc3Rpb25zIHRvIGltcHJvdmUgdGhlIGRyaXZlciBhbmQgZG9uZSBhIGxvdCBvZiB0ZXN0aW5nLgorCisgICAgIEtlbiBNb3J0IDxrZW5AbW9ydC5uZXQ+IHJlcG9ydGVkIGEgREVCVUcgY29tcGlsZSBidWcgZml4ZWQKKyAgICAgaW4gMy4ySy4KKworICAgICBUb20gUmluaSA8dHJpbmlAa2VybmVsLmNyYXNoaW5nLm9yZz4gcHJvdmlkZWQgdGhlIENPTkZJR19JU0EKKyAgICAgcGF0Y2ggYW5kIGhlbHBlZCB3aXRoIFBvd2VyUEMgd2lkZSBhbmQgbmFycm93IGJvYXJkIHN1cHBvcnQuCisKKyAgICAgUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPiBwcm92aWRlZCBhbgorICAgICBhZHZhbnN5c19pbnRlcnJ1cHRzX2VuYWJsZWQgcGF0Y2guCisKKyAgICAgRGF2ZSBKb25lcyA8ZGF2ZUBkZW5pYWwuZm9yY2U5LmNvLnVrPiByZXBvcnRlZCB0aGUgY29tcGlsZXIKKyAgICAgd2FybmluZ3MgZ2VuZXJhdGVkIHdoZW4gQ09ORklHX1BST0NfRlMgd2FzIG5vdCBkZWZpbmVkIGluCisgICAgIHRoZSAzLjJNIGRyaXZlci4KKworICAgICBKZXJyeSBRdWlubiA8amxxdWlubkB1cy5pYm0uY29tPiBmaXhlZCBQb3dlclBDIHN1cHBvcnQgKGVuZGlhbgorICAgICBwcm9ibGVtcykgZm9yIHdpZGUgY2FyZHMuCisKKyAgICAgQnJ5YW4gSGVuZGVyc29uIDxicnlhbmhAZ2lyYWZmZS1kYXRhLmNvbT4gaGVscGVkIGRlYnVnIG5hcnJvdworICAgICBjYXJkIGVycm9yIGhhbmRsaW5nLgorCisgICAgIE1hbnVlbCBWZWxvc28gPHZlbG9zb0Bwb2JveC5jb20+IHdvcmtlZCBoYXJkIG9uIFBvd2VyUEMgbmFycm93CisgICAgIGJvYXJkIHN1cHBvcnQgYW5kIGZpeGVkIGEgYnVnIGluIEFzY0dldEVFUENvbmZpZygpLgorCisgICAgIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiBtYWRlCisgICAgIHNhdmVfZmxhZ3MvcmVzdG9yZV9mbGFncyBjaGFuZ2VzLgorCisgICAgIEFuZHkgS2VsbG5lciA8QUtlbGxuZXJAY29ubmVjdGNvbS5uZXQ+IGNvbnRpbnVlcyB0aGUgQWR2YW5zeXMgU0NTSQorICAgICBkcml2ZXIgZGV2ZWxvcG1lbnQgZm9yIENvbm5lY3RDb20gKFZlcnNpb24gPiAzLjNGKS4KKworICBLLiBDb25uZWN0Q29tIChBZHZhblN5cykgQ29udGFjdCBJbmZvcm1hdGlvbgorCisgICAgIE1haWw6ICAgICAgICAgICAgICAgICAgIENvbm5lY3RDb20gU29sdXRpb25zLCBJbmMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNTAgUmluZ3dvb2QgQ291cnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FuIEpvc2UsIENBIDk1MTMxCisgICAgIE9wZXJhdG9yL1NhbGVzOiAgICAgICAgIDEtNDA4LTM4My05NDAwCisgICAgIEZBWDogICAgICAgICAgICAgICAgICAgIDEtNDA4LTM4My05NjEyCisgICAgIFRlY2ggU3VwcG9ydDogICAgICAgICAgIDEtNDA4LTQ2Ny0yOTMwCisgICAgIFRlY2ggU3VwcG9ydCBFLU1haWw6ICAgIGxpbnV4QGNvbm5lY3Rjb20ubmV0CisgICAgIEZUUCBTaXRlOiAgICAgICAgICAgICAgIGZ0cC5jb25uZWN0Y29tLm5ldCAobG9naW46IGFub255bW91cykKKyAgICAgV2ViIFNpdGU6ICAgICAgICAgICAgICAgaHR0cDovL3d3dy5jb25uZWN0Y29tLm5ldAorCisqLworCisvKgorICogLS0tIExpbnV4IEluY2x1ZGUgRmlsZXMKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19YODYpICYmICFkZWZpbmVkKENPTkZJR19JU0EpCisjZGVmaW5lIENPTkZJR19JU0EKKyNlbmRpZiAvKiBDT05GSUdfWDg2ICYmICFDT05GSUdfSVNBICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworLyogRklYTUU6IChieSBqZWpiQHN0ZWVsZXllLmNvbSkgVGhpcyB3YXJuaW5nIGlzIHByZXNlbnQgZm9yIHR3bworICogcmVhc29uczoKKyAqCisgKiAxKSBUaGlzIGRyaXZlciBiYWRseSBuZWVkcyBjb252ZXJ0aW5nIHRvIHRoZSBjb3JyZWN0IGRyaXZlciBtb2RlbAorICogICAgcHJvYmluZyBBUEkKKyAqCisgKiAyKSBBbHRob3VnaCBhbGwgb2YgdGhlIG5lY2Vzc2FyeSBjb21tYW5kIG1hcHBpbmcgcGxhY2VzIGhhdmUgdGhlCisgKiBhcHByb3ByaWF0ZSBkbWFfbWFwLi4gQVBJcywgdGhlIGRyaXZlciBzdGlsbCBwcm9jZXNzZXMgaXRzIGludGVybmFsCisgKiBxdWV1ZSB1c2luZyBidXNfdG9fdmlydCgpIGFuZCB2aXJ0X3RvX2J1cygpIHdoaWNoIGFyZSBpbGxlZ2FsIHVuZGVyCisgKiB0aGUgQVBJLiAgVGhlIGVudGlyZSBxdWV1ZSBwcm9jZXNzaW5nIHN0cnVjdHVyZSB3aWxsIG5lZWQgdG8gYmUKKyAqIGFsdGVyZWQgdG8gZml4IHRoaXMuCisgKi8KKyN3YXJuaW5nIHRoaXMgZHJpdmVyIGlzIHN0aWxsIG5vdCBwcm9wZXJseSBjb252ZXJ0ZWQgdG8gdGhlIERNQSBBUEkKKworI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgImFkdmFuc3lzLmgiCisjaWZkZWYgQ09ORklHX1BDSQorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworCisvKgorICogLS0tIERyaXZlciBPcHRpb25zCisgKi8KKworLyogRW5hYmxlIGRyaXZlciBhc3NlcnRpb25zLiAqLworI2RlZmluZSBBRFZBTlNZU19BU1NFUlQKKworLyogRW5hYmxlIGRyaXZlciAvcHJvYyBzdGF0aXN0aWNzLiAqLworI2RlZmluZSBBRFZBTlNZU19TVEFUUworCisvKiBFbmFibGUgZHJpdmVyIHRyYWNpbmcuICovCisvKiAjZGVmaW5lIEFEVkFOU1lTX0RFQlVHICovCisKKworLyoKKyAqIC0tLSBEZWJ1Z2dpbmcgSGVhZGVyCisgKi8KKworI2lmZGVmIEFEVkFOU1lTX0RFQlVHCisjZGVmaW5lIFNUQVRJQworI2Vsc2UgLyogQURWQU5TWVNfREVCVUcgKi8KKyNkZWZpbmUgU1RBVElDIHN0YXRpYworI2VuZGlmIC8qIEFEVkFOU1lTX0RFQlVHICovCisKKworLyoKKyAqIC0tLSBBc2MgTGlicmFyeSBDb25zdGFudHMgYW5kIE1hY3JvcworICovCisKKyNkZWZpbmUgQVNDX0xJQl9WRVJTSU9OX01BSk9SICAxCisjZGVmaW5lIEFTQ19MSUJfVkVSU0lPTl9NSU5PUiAgMjQKKyNkZWZpbmUgQVNDX0xJQl9TRVJJQUxfTlVNQkVSICAxMjMKKworLyoKKyAqIFBvcnRhYmxlIERhdGEgVHlwZXMKKyAqCisgKiBBbnkgaW5zdGFuY2Ugd2hlcmUgYSAzMi1iaXQgbG9uZyBvciBwb2ludGVyIHR5cGUgaXMgYXNzdW1lZAorICogZm9yIHByZWNpc2lvbiBvciBIVyBkZWZpbmVkIHN0cnVjdHVyZXMsIHRoZSBmb2xsb3dpbmcgZGVmaW5lCisgKiB0eXBlcyBtdXN0IGJlIHVzZWQuIEluIExpbnV4IHRoZSBjaGFyLCBzaG9ydCwgYW5kIGludCB0eXBlcworICogYXJlIGFsbCBjb25zaXN0ZW50IGF0IDgsIDE2LCBhbmQgMzIgYml0cyByZXNwZWN0aXZlbHkuIFBvaW50ZXJzCisgKiBhbmQgbG9uZyB0eXBlcyBhcmUgNjQgYml0cyBvbiBBbHBoYSBhbmQgVWx0cmFTUEFSQy4KKyAqLworI2RlZmluZSBBU0NfUEFERFIgX191MzIgICAgICAgICAvKiBQaHlzaWNhbC9CdXMgYWRkcmVzcyBkYXRhIHR5cGUuICovCisjZGVmaW5lIEFTQ19WQUREUiBfX3UzMiAgICAgICAgIC8qIFZpcnR1YWwgYWRkcmVzcyBkYXRhIHR5cGUuICovCisjZGVmaW5lIEFTQ19EQ05UICBfX3UzMiAgICAgICAgIC8qIFVuc2lnbmVkIERhdGEgY291bnQgdHlwZS4gKi8KKyNkZWZpbmUgQVNDX1NEQ05UIF9fczMyICAgICAgICAgLyogU2lnbmVkIERhdGEgY291bnQgdHlwZS4gKi8KKworLyoKKyAqIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCB0byBjb252ZXJ0IGEgdmlydHVhbCBhZGRyZXNzIHRvIGEKKyAqIDMyLWJpdCB2YWx1ZS4gVGhpcyBjdXJyZW50bHkgY2FuIGJlIHVzZWQgb24gTGludXggQWxwaGEKKyAqIHdoaWNoIHVzZXMgNjQtYml0IHZpcnR1YWwgYWRkcmVzcyBidXQgYSAzMi1iaXQgYnVzIGFkZHJlc3MuCisgKiBUaGlzIGlzIGxpa2VseSB0byBicmVhayBpbiB0aGUgZnV0dXJlLCBidXQgZG9pbmcgdGhpcyBub3cKKyAqIHdpbGwgZ2l2ZSB1cyB0aW1lIHRvIGNoYW5nZSB0aGUgSFcgYW5kIEZXIHRvIGhhbmRsZSA2NC1iaXQKKyAqIGFkZHJlc3Nlcy4KKyAqLworI2RlZmluZSBBU0NfVkFERFJfVE9fVTMyICAgdmlydF90b19idXMKKyNkZWZpbmUgQVNDX1UzMl9UT19WQUREUiAgIGJ1c190b192aXJ0CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1Y2hhcjsKKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgICAgICgxKQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFICAgICgwKQorI2VuZGlmCisKKyNkZWZpbmUgRU9GICAgICAgKC0xKQorI2RlZmluZSBFUlIgICAgICAoLTEpCisjZGVmaW5lIFVXX0VSUiAgICh1aW50KSgweEZGRkYpCisjZGVmaW5lIGlzb2RkX3dvcmQodmFsKSAgICgoKCh1aW50KXZhbCkgJiAodWludCkweDAwMDEpICE9IDApCisjZGVmaW5lIEFzY1BDSUNvbmZpZ1ZlbmRvcklEUmVnaXN0ZXIgICAgICAweDAwMDAKKyNkZWZpbmUgQXNjUENJQ29uZmlnRGV2aWNlSURSZWdpc3RlciAgICAgIDB4MDAwMgorI2RlZmluZSBBc2NQQ0lDb25maWdDb21tYW5kUmVnaXN0ZXIgICAgICAgMHgwMDA0CisjZGVmaW5lIEFzY1BDSUNvbmZpZ1N0YXR1c1JlZ2lzdGVyICAgICAgICAweDAwMDYKKyNkZWZpbmUgQXNjUENJQ29uZmlnUmV2aXNpb25JRFJlZ2lzdGVyICAgIDB4MDAwOAorI2RlZmluZSBBc2NQQ0lDb25maWdDYWNoZVNpemUgICAgICAgICAgICAgMHgwMDBDCisjZGVmaW5lIEFzY1BDSUNvbmZpZ0xhdGVuY3lUaW1lciAgICAgICAgICAweDAwMEQKKyNkZWZpbmUgQXNjUENJSU9CYXNlUmVnaXN0ZXIgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBBc2NQQ0lDbWRSZWdCaXRzX0lPTWVtQnVzTWFzdGVyICAgMHgwMDA3CisjZGVmaW5lIEFTQ19QQ0lfSUQyQlVTKGlkKSAgICAoKGlkKSAmIDB4RkYpCisjZGVmaW5lIEFTQ19QQ0lfSUQyREVWKGlkKSAgICAoKChpZCkgPj4gMTEpICYgMHgxRikKKyNkZWZpbmUgQVNDX1BDSV9JRDJGVU5DKGlkKSAgICgoKGlkKSA+PiA4KSAmIDB4NykKKyNkZWZpbmUgQVNDX1BDSV9NS0lEKGJ1cywgZGV2LCBmdW5jKSAoKCgoZGV2KSAmIDB4MUYpIDw8IDExKSB8ICgoKGZ1bmMpICYgMHg3KSA8PCA4KSB8ICgoYnVzKSAmIDB4RkYpKQorI2RlZmluZSBBU0NfUENJX1ZFTkRPUklEICAgICAgICAgICAgICAgICAgMHgxMENECisjZGVmaW5lIEFTQ19QQ0lfREVWSUNFSURfMTIwMEEgICAgICAgICAgICAweDExMDAKKyNkZWZpbmUgQVNDX1BDSV9ERVZJQ0VJRF8xMjAwQiAgICAgICAgICAgIDB4MTIwMAorI2RlZmluZSBBU0NfUENJX0RFVklDRUlEX1VMVFJBICAgICAgICAgICAgMHgxMzAwCisjZGVmaW5lIEFTQ19QQ0lfUkVWSVNJT05fMzE1MCAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEFTQ19QQ0lfUkVWSVNJT05fMzA1MCAgICAgICAgICAgICAweDAzCisKKyNkZWZpbmUgIEFTQ19EVkNMSUJfQ0FMTF9ET05FICAgICAoMSkKKyNkZWZpbmUgIEFTQ19EVkNMSUJfQ0FMTF9GQUlMRUQgICAoMCkKKyNkZWZpbmUgIEFTQ19EVkNMSUJfQ0FMTF9FUlJPUiAgICAoLTEpCisKKy8qCisgKiBFbmFibGUgQ0NfVkVSWV9MT05HX1NHX0xJU1QgdG8gc3VwcG9ydCB1cCB0byA2NEsgZWxlbWVudCBTRyBsaXN0cy4KKyAqIFRoZSBTUkIgc3RydWN0dXJlIHdpbGwgaGF2ZSB0byBiZSBjaGFuZ2VkIGFuZCB0aGUgQVNDX1NSQjJTQ1NJUSgpCisgKiBtYWNybyByZS1kZWZpbmVkIHRvIGJlIGFibGUgdG8gb2J0YWluIGEgQVNDX1NDU0lfUSBwb2ludGVyIGZyb20gdGhlCisgKiBTUkIgc3RydWN0dXJlLgorICovCisjZGVmaW5lIENDX1ZFUllfTE9OR19TR19MSVNUIDAKKyNkZWZpbmUgQVNDX1NSQjJTQ1NJUShzcmJfcHRyKSAgKHNyYl9wdHIpCisKKyNkZWZpbmUgUG9ydEFkZHIgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICAgIC8qIHBvcnQgYWRkcmVzcyBzaXplICAqLworI2RlZmluZSBpbnAocG9ydCkgICAgICAgICAgICAgICAgaW5iKHBvcnQpCisjZGVmaW5lIG91dHAocG9ydCwgYnl0ZSkgICAgICAgICBvdXRiKChieXRlKSwgKHBvcnQpKQorCisjZGVmaW5lIGlucHcocG9ydCkgICAgICAgICAgICAgICBpbncocG9ydCkKKyNkZWZpbmUgb3V0cHcocG9ydCwgd29yZCkgICAgICAgIG91dHcoKHdvcmQpLCAocG9ydCkpCisKKyNkZWZpbmUgQVNDX01BWF9TR19RVUVVRSAgICA3CisjZGVmaW5lIEFTQ19NQVhfU0dfTElTVCAgICAgMjU1CisKKyNkZWZpbmUgQVNDX0NTX1RZUEUgIHVuc2lnbmVkIHNob3J0CisKKyNkZWZpbmUgQVNDX0lTX0lTQSAgICAgICAgICAoMHgwMDAxKQorI2RlZmluZSBBU0NfSVNfSVNBUE5QICAgICAgICgweDAwODEpCisjZGVmaW5lIEFTQ19JU19FSVNBICAgICAgICAgKDB4MDAwMikKKyNkZWZpbmUgQVNDX0lTX1BDSSAgICAgICAgICAoMHgwMDA0KQorI2RlZmluZSBBU0NfSVNfUENJX1VMVFJBICAgICgweDAxMDQpCisjZGVmaW5lIEFTQ19JU19QQ01DSUEgICAgICAgKDB4MDAwOCkKKyNkZWZpbmUgQVNDX0lTX01DQSAgICAgICAgICAoMHgwMDIwKQorI2RlZmluZSBBU0NfSVNfVkwgICAgICAgICAgICgweDAwNDApCisjZGVmaW5lIEFTQ19JU0FfUE5QX1BPUlRfQUREUiAgKDB4Mjc5KQorI2RlZmluZSBBU0NfSVNBX1BOUF9QT1JUX1dSSVRFIChBU0NfSVNBX1BOUF9QT1JUX0FERFIrMHg4MDApCisjZGVmaW5lIEFTQ19JU19XSURFU0NTSV8xNiAgKDB4MDEwMCkKKyNkZWZpbmUgQVNDX0lTX1dJREVTQ1NJXzMyICAoMHgwMjAwKQorI2RlZmluZSBBU0NfSVNfQklHX0VORElBTiAgICgweDgwMDApCisjZGVmaW5lIEFTQ19DSElQX01JTl9WRVJfVkwgICAgICAoMHgwMSkKKyNkZWZpbmUgQVNDX0NISVBfTUFYX1ZFUl9WTCAgICAgICgweDA3KQorI2RlZmluZSBBU0NfQ0hJUF9NSU5fVkVSX1BDSSAgICAgKDB4MDkpCisjZGVmaW5lIEFTQ19DSElQX01BWF9WRVJfUENJICAgICAoMHgwRikKKyNkZWZpbmUgQVNDX0NISVBfVkVSX1BDSV9CSVQgICAgICgweDA4KQorI2RlZmluZSBBU0NfQ0hJUF9NSU5fVkVSX0lTQSAgICAgKDB4MTEpCisjZGVmaW5lIEFTQ19DSElQX01JTl9WRVJfSVNBX1BOUCAoMHgyMSkKKyNkZWZpbmUgQVNDX0NISVBfTUFYX1ZFUl9JU0EgICAgICgweDI3KQorI2RlZmluZSBBU0NfQ0hJUF9WRVJfSVNBX0JJVCAgICAgKDB4MzApCisjZGVmaW5lIEFTQ19DSElQX1ZFUl9JU0FQTlBfQklUICAoMHgyMCkKKyNkZWZpbmUgQVNDX0NISVBfVkVSX0FTWU5fQlVHICAgICgweDIxKQorI2RlZmluZSBBU0NfQ0hJUF9WRVJfUENJICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQVNDX0NISVBfVkVSX1BDSV9VTFRSQV8zMTUwICAoQVNDX0NISVBfVkVSX1BDSSB8IDB4MDIpCisjZGVmaW5lIEFTQ19DSElQX1ZFUl9QQ0lfVUxUUkFfMzA1MCAgKEFTQ19DSElQX1ZFUl9QQ0kgfCAweDAzKQorI2RlZmluZSBBU0NfQ0hJUF9NSU5fVkVSX0VJU0EgKDB4NDEpCisjZGVmaW5lIEFTQ19DSElQX01BWF9WRVJfRUlTQSAoMHg0NykKKyNkZWZpbmUgQVNDX0NISVBfVkVSX0VJU0FfQklUICgweDQwKQorI2RlZmluZSBBU0NfQ0hJUF9MQVRFU1RfVkVSX0VJU0EgICAoKEFTQ19DSElQX01JTl9WRVJfRUlTQSAtIDEpICsgMykKKyNkZWZpbmUgQVNDX01BWF9MSUJfU1VQUE9SVEVEX0lTQV9DSElQX1ZFUiAgIDB4MjEKKyNkZWZpbmUgQVNDX01BWF9MSUJfU1VQUE9SVEVEX1BDSV9DSElQX1ZFUiAgIDB4MEEKKyNkZWZpbmUgQVNDX01BWF9WTF9ETUFfQUREUiAgICAgKDB4MDdGRkZGRkZMKQorI2RlZmluZSBBU0NfTUFYX1ZMX0RNQV9DT1VOVCAgICAoMHgwN0ZGRkZGRkwpCisjZGVmaW5lIEFTQ19NQVhfUENJX0RNQV9BRERSICAgICgweEZGRkZGRkZGTCkKKyNkZWZpbmUgQVNDX01BWF9QQ0lfRE1BX0NPVU5UICAgKDB4RkZGRkZGRkZMKQorI2RlZmluZSBBU0NfTUFYX0lTQV9ETUFfQUREUiAgICAoMHgwMEZGRkZGRkwpCisjZGVmaW5lIEFTQ19NQVhfSVNBX0RNQV9DT1VOVCAgICgweDAwRkZGRkZGTCkKKyNkZWZpbmUgQVNDX01BWF9FSVNBX0RNQV9BRERSICAgKDB4MDdGRkZGRkZMKQorI2RlZmluZSBBU0NfTUFYX0VJU0FfRE1BX0NPVU5UICAoMHgwN0ZGRkZGRkwpCisKKyNkZWZpbmUgQVNDX1NDU0lfSURfQklUUyAgMworI2RlZmluZSBBU0NfU0NTSV9USVhfVFlQRSAgICAgdWNoYXIKKyNkZWZpbmUgQVNDX0FMTF9ERVZJQ0VfQklUX1NFVCAgMHhGRgorI2RlZmluZSBBU0NfU0NTSV9CSVRfSURfVFlQRSAgdWNoYXIKKyNkZWZpbmUgQVNDX01BWF9USUQgICAgICAgNworI2RlZmluZSBBU0NfTUFYX0xVTiAgICAgICA3CisjZGVmaW5lIEFTQ19TQ1NJX1dJRFRIX0JJVF9TRVQgIDB4RkYKKyNkZWZpbmUgQVNDX01BWF9TRU5TRV9MRU4gICAzMgorI2RlZmluZSBBU0NfTUlOX1NFTlNFX0xFTiAgIDE0CisjZGVmaW5lIEFTQ19NQVhfQ0RCX0xFTiAgICAgMTIKKyNkZWZpbmUgQVNDX1NDU0lfUkVTRVRfSE9MRF9USU1FX1VTICA2MAorCisjZGVmaW5lIEFEVl9JTlFfQ0xPQ0tJTkdfU1RfT05MWSAgICAweDAKKyNkZWZpbmUgQURWX0lOUV9DTE9DS0lOR19EVF9PTkxZICAgIDB4MQorI2RlZmluZSBBRFZfSU5RX0NMT0NLSU5HX1NUX0FORF9EVCAgMHgzCisKKy8qCisgKiBJbnF1aXJ5IFNQQy0yIFNQSSBCeXRlIDEgRVZQRCAoRW5hYmxlIFZpdGFsIFByb2R1Y3QgRGF0YSkKKyAqIGFuZCBDbWREdCAoQ29tbWFuZCBTdXBwb3J0IERhdGEpIGZpZWxkIGJpdCBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBBRFZfSU5RX1JUTl9WUERfQU5EX0NNRERUICAgICAgICAgICAweDMKKyNkZWZpbmUgQURWX0lOUV9SVE5fQ01ERFRfRk9SX09QX0NPREUgICAgICAgMHgyCisjZGVmaW5lIEFEVl9JTlFfUlROX1ZQRF9GT1JfUEdfQ09ERSAgICAgICAgIDB4MQorI2RlZmluZSBBRFZfSU5RX1JUTl9TVERfSU5RVUlSWV9EQVRBICAgICAgICAweDAKKworI2RlZmluZSBBU0NfU0NTSURJUl9OT0NISyAgICAweDAwCisjZGVmaW5lIEFTQ19TQ1NJRElSX1QySCAgICAgIDB4MDgKKyNkZWZpbmUgQVNDX1NDU0lESVJfSDJUICAgICAgMHgxMAorI2RlZmluZSBBU0NfU0NTSURJUl9OT0RBVEEgICAweDE4CisjZGVmaW5lIFNDU0lfQVNDX05PTUVESUEgICAgICAgICAgMHgzQQorI2RlZmluZSBBU0NfU1JCX0hPU1QoeCkgICgodWNoYXIpKCh1Y2hhcikoeCkgPj4gNCkpCisjZGVmaW5lIEFTQ19TUkJfVElEKHgpICAgKCh1Y2hhcikoKHVjaGFyKSh4KSAmICh1Y2hhcikweDBGKSkKKyNkZWZpbmUgQVNDX1NSQl9MVU4oeCkgICAoKHVjaGFyKSgodWludCkoeCkgPj4gMTMpKQorI2RlZmluZSBQVVRfQ0RCMSh4KSAgICgodWNoYXIpKCh1aW50KSh4KSA+PiA4KSkKKyNkZWZpbmUgTVNfQ01EX0RPTkUgICAgMHgwMAorI2RlZmluZSBNU19FWFRFTkQgICAgICAweDAxCisjZGVmaW5lIE1TX1NEVFJfTEVOICAgIDB4MDMKKyNkZWZpbmUgTVNfU0RUUl9DT0RFICAgMHgwMQorI2RlZmluZSBNU19XRFRSX0xFTiAgICAweDAyCisjZGVmaW5lIE1TX1dEVFJfQ09ERSAgIDB4MDMKKyNkZWZpbmUgTVNfTURQX0xFTiAgICAweDA1CisjZGVmaW5lIE1TX01EUF9DT0RFICAgMHgwMAorCisvKgorICogSW5xdWlyeSBkYXRhIHN0cnVjdHVyZSBhbmQgYml0ZmllbGQgbWFjcm9zCisgKgorICogT25seSBxdWFudGl0aWVzIG9mIG1vcmUgdGhhbiAxIGJpdCBhcmUgc2hpZnRlZCwgc2luY2UgdGhlIG90aGVycyBhcmUKKyAqIGp1c3QgdGVzdGVkIGZvciB0cnVlIG9yIGZhbHNlLiBDIGJpdGZpZWxkcyBhcmVuJ3QgcG9ydGFibGUgYmV0d2VlbiBiaWcKKyAqIGFuZCBsaXR0bGUtZW5kaWFuIHBsYXRmb3JtcyBzbyB0aGV5IGFyZSBub3QgdXNlZC4KKyAqLworCisjZGVmaW5lIEFTQ19JTlFfRFZDX1RZUEUoaW5xKSAgICAgICAoKGlucSktPnBlcmlwaCAmIDB4MWYpCisjZGVmaW5lIEFTQ19JTlFfUVVBTElGSUVSKGlucSkgICAgICAoKChpbnEpLT5wZXJpcGggJiAweGUwKSA+PiA1KQorI2RlZmluZSBBU0NfSU5RX0RWQ19UWVBFX01PRChpbnEpICAgKChpbnEpLT5kZXZ0eXBlICYgMHg3ZikKKyNkZWZpbmUgQVNDX0lOUV9SRU1PVkFCTEUoaW5xKSAgICAgICgoaW5xKS0+ZGV2dHlwZSAmIDB4ODApCisjZGVmaW5lIEFTQ19JTlFfQU5TSV9WRVIoaW5xKSAgICAgICAoKGlucSktPnZlciAmIDB4MDcpCisjZGVmaW5lIEFTQ19JTlFfRUNNQV9WRVIoaW5xKSAgICAgICAoKChpbnEpLT52ZXIgJiAweDM4KSA+PiAzKQorI2RlZmluZSBBU0NfSU5RX0lTT19WRVIoaW5xKSAgICAgICAgKCgoaW5xKS0+dmVyICYgMHhjMCkgPj4gNikKKyNkZWZpbmUgQVNDX0lOUV9SRVNQT05TRV9GTVQoaW5xKSAgICgoaW5xKS0+Ynl0ZTMgJiAweDBmKQorI2RlZmluZSBBU0NfSU5RX1RFUk1fSU8oaW5xKSAgICAgICAgKChpbnEpLT5ieXRlMyAmIDB4NDApCisjZGVmaW5lIEFTQ19JTlFfQVNZTkNfTk9USUYoaW5xKSAgICAoKGlucSktPmJ5dGUzICYgMHg4MCkKKyNkZWZpbmUgQVNDX0lOUV9TT0ZUX1JFU0VUKGlucSkgICAgICgoaW5xKS0+ZmxhZ3MgJiAweDAxKQorI2RlZmluZSBBU0NfSU5RX0NNRF9RVUVVRShpbnEpICAgICAgKChpbnEpLT5mbGFncyAmIDB4MDIpCisjZGVmaW5lIEFTQ19JTlFfTElOS19DTUQoaW5xKSAgICAgICAoKGlucSktPmZsYWdzICYgMHgwOCkKKyNkZWZpbmUgQVNDX0lOUV9TWU5DKGlucSkgICAgICAgICAgICgoaW5xKS0+ZmxhZ3MgJiAweDEwKQorI2RlZmluZSBBU0NfSU5RX1dJREUxNihpbnEpICAgICAgICAgKChpbnEpLT5mbGFncyAmIDB4MjApCisjZGVmaW5lIEFTQ19JTlFfV0lERTMyKGlucSkgICAgICAgICAoKGlucSktPmZsYWdzICYgMHg0MCkKKyNkZWZpbmUgQVNDX0lOUV9SRUxfQUREUihpbnEpICAgICAgICgoaW5xKS0+ZmxhZ3MgJiAweDgwKQorI2RlZmluZSBBU0NfSU5RX0lORk9fVU5JVChpbnEpICAgICAgKChpbnEpLT5pbmZvICYgMHgwMSkKKyNkZWZpbmUgQVNDX0lOUV9RVUlDS19BUkIoaW5xKSAgICAgICgoaW5xKS0+aW5mbyAmIDB4MDIpCisjZGVmaW5lIEFTQ19JTlFfQ0xPQ0tJTkcoaW5xKSAgICAgICAoKChpbnEpLT5pbmZvICYgMHgwYykgPj4gMikKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVjaGFyICAgICAgICAgICAgICAgcGVyaXBoOworICAgIHVjaGFyICAgICAgICAgICAgICAgZGV2dHlwZTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHZlcjsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGJ5dGUzOworICAgIHVjaGFyICAgICAgICAgICAgICAgYWRkX2xlbjsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHJlczE7CisgICAgdWNoYXIgICAgICAgICAgICAgICByZXMyOworICAgIHVjaGFyICAgICAgICAgICAgICAgZmxhZ3M7CisgICAgdWNoYXIgICAgICAgICAgICAgICB2ZW5kb3JfaWRbOF07CisgICAgdWNoYXIgICAgICAgICAgICAgICBwcm9kdWN0X2lkWzE2XTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHByb2R1Y3RfcmV2X2xldmVsWzRdOworfSBBU0NfU0NTSV9JTlFVSVJZOworCisjZGVmaW5lIEFTQ19TR19MSVNUX1BFUl9RICAgNworI2RlZmluZSBRU19GUkVFICAgICAgICAweDAwCisjZGVmaW5lIFFTX1JFQURZICAgICAgIDB4MDEKKyNkZWZpbmUgUVNfRElTQzEgICAgICAgMHgwMgorI2RlZmluZSBRU19ESVNDMiAgICAgICAweDA0CisjZGVmaW5lIFFTX0JVU1kgICAgICAgIDB4MDgKKyNkZWZpbmUgUVNfQUJPUlRFRCAgICAgMHg0MAorI2RlZmluZSBRU19ET05FICAgICAgICAweDgwCisjZGVmaW5lIFFDX05PX0NBTExCQUNLICAgMHgwMQorI2RlZmluZSBRQ19TR19TV0FQX1FVRVVFIDB4MDIKKyNkZWZpbmUgUUNfU0dfSEVBRCAgICAgICAweDA0CisjZGVmaW5lIFFDX0RBVEFfSU4gICAgICAgMHgwOAorI2RlZmluZSBRQ19EQVRBX09VVCAgICAgIDB4MTAKKyNkZWZpbmUgUUNfVVJHRU5UICAgICAgICAweDIwCisjZGVmaW5lIFFDX01TR19PVVQgICAgICAgMHg0MAorI2RlZmluZSBRQ19SRVFfU0VOU0UgICAgIDB4ODAKKyNkZWZpbmUgUUNTR19TR19YRkVSX0xJU1QgIDB4MDIKKyNkZWZpbmUgUUNTR19TR19YRkVSX01PUkUgIDB4MDQKKyNkZWZpbmUgUUNTR19TR19YRkVSX0VORCAgIDB4MDgKKyNkZWZpbmUgUURfSU5fUFJPR1JFU1MgICAgICAgMHgwMAorI2RlZmluZSBRRF9OT19FUlJPUiAgICAgICAgICAweDAxCisjZGVmaW5lIFFEX0FCT1JURURfQllfSE9TVCAgIDB4MDIKKyNkZWZpbmUgUURfV0lUSF9FUlJPUiAgICAgICAgMHgwNAorI2RlZmluZSBRRF9JTlZBTElEX1JFUVVFU1QgICAweDgwCisjZGVmaW5lIFFEX0lOVkFMSURfSE9TVF9OVU0gIDB4ODEKKyNkZWZpbmUgUURfSU5WQUxJRF9ERVZJQ0UgICAgMHg4MgorI2RlZmluZSBRRF9FUlJfSU5URVJOQUwgICAgICAweEZGCisjZGVmaW5lIFFIU1RBX05PX0VSUk9SICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBRSFNUQV9NX1NFTF9USU1FT1VUICAgICAgICAgIDB4MTEKKyNkZWZpbmUgUUhTVEFfTV9EQVRBX09WRVJfUlVOICAgICAgICAweDEyCisjZGVmaW5lIFFIU1RBX01fREFUQV9VTkRFUl9SVU4gICAgICAgMHgxMgorI2RlZmluZSBRSFNUQV9NX1VORVhQRUNURURfQlVTX0ZSRUUgIDB4MTMKKyNkZWZpbmUgUUhTVEFfTV9CQURfQlVTX1BIQVNFX1NFUSAgICAweDE0CisjZGVmaW5lIFFIU1RBX0RfUURPTkVfU0dfTElTVF9DT1JSVVBURUQgMHgyMQorI2RlZmluZSBRSFNUQV9EX0FTQ19EVkNfRVJST1JfQ09ERV9TRVQgIDB4MjIKKyNkZWZpbmUgUUhTVEFfRF9IT1NUX0FCT1JUX0ZBSUxFRCAgICAgICAweDIzCisjZGVmaW5lIFFIU1RBX0RfRVhFX1NDU0lfUV9GQUlMRUQgICAgICAgMHgyNAorI2RlZmluZSBRSFNUQV9EX0VYRV9TQ1NJX1FfQlVTWV9USU1FT1VUIDB4MjUKKyNkZWZpbmUgUUhTVEFfRF9BU1BJX05PX0JVRl9QT09MICAgICAgICAweDI2CisjZGVmaW5lIFFIU1RBX01fV1RNX1RJTUVPVVQgICAgICAgICAweDQxCisjZGVmaW5lIFFIU1RBX01fQkFEX0NNUExfU1RBVFVTX0lOICAweDQyCisjZGVmaW5lIFFIU1RBX01fTk9fQVVUT19SRVFfU0VOU0UgICAweDQzCisjZGVmaW5lIFFIU1RBX01fQVVUT19SRVFfU0VOU0VfRkFJTCAweDQ0CisjZGVmaW5lIFFIU1RBX01fVEFSR0VUX1NUQVRVU19CVVNZICAweDQ1CisjZGVmaW5lIFFIU1RBX01fQkFEX1RBR19DT0RFICAgICAgICAweDQ2CisjZGVmaW5lIFFIU1RBX01fQkFEX1FVRVVFX0ZVTExfT1JfQlVTWSAgMHg0NworI2RlZmluZSBRSFNUQV9NX0hVTkdfUkVRX1NDU0lfQlVTX1JFU0VUIDB4NDgKKyNkZWZpbmUgUUhTVEFfRF9MUkFNX0NNUF9FUlJPUiAgICAgICAgMHg4MQorI2RlZmluZSBRSFNUQV9NX01JQ1JPX0NPREVfRVJST1JfSEFMVCAweEExCisjZGVmaW5lIEFTQ19GTEFHX1NDU0lRX1JFUSAgICAgICAgMHgwMQorI2RlZmluZSBBU0NfRkxBR19CSU9TX1NDU0lRX1JFUSAgIDB4MDIKKyNkZWZpbmUgQVNDX0ZMQUdfQklPU19BU1lOQ19JTyAgICAweDA0CisjZGVmaW5lIEFTQ19GTEFHX1NSQl9MSU5FQVJfQUREUiAgMHgwOAorI2RlZmluZSBBU0NfRkxBR19XSU4xNiAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQVNDX0ZMQUdfV0lOMzIgICAgICAgICAgICAweDIwCisjZGVmaW5lIEFTQ19GTEFHX0lTQV9PVkVSXzE2TUIgICAgMHg0MAorI2RlZmluZSBBU0NfRkxBR19ET1NfVk1fQ0FMTEJBQ0sgIDB4ODAKKyNkZWZpbmUgQVNDX1RBR19GTEFHX0VYVFJBX0JZVEVTICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBBU0NfVEFHX0ZMQUdfRElTQUJMRV9ESVNDT05ORUNUICAgICAgICAweDA0CisjZGVmaW5lIEFTQ19UQUdfRkxBR19ESVNBQkxFX0FTWU5fVVNFX1NZTl9GSVggIDB4MDgKKyNkZWZpbmUgQVNDX1RBR19GTEFHX0RJU0FCTEVfQ0hLX0NPTkRfSU5UX0hPU1QgMHg0MAorI2RlZmluZSBBU0NfU0NTSVFfQ1BZX0JFRyAgICAgICAgICAgICAgNAorI2RlZmluZSBBU0NfU0NTSVFfU0dIRF9DUFlfQkVHICAgICAgICAgMgorI2RlZmluZSBBU0NfU0NTSVFfQl9GV0QgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBU0NfU0NTSVFfQl9CV0QgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBU0NfU0NTSVFfQl9TVEFUVVMgICAgICAgICAgICAgMgorI2RlZmluZSBBU0NfU0NTSVFfQl9RTk8gICAgICAgICAgICAgICAgMworI2RlZmluZSBBU0NfU0NTSVFfQl9DTlRMICAgICAgICAgICAgICAgNAorI2RlZmluZSBBU0NfU0NTSVFfQl9TR19RVUVVRV9DTlQgICAgICAgNQorI2RlZmluZSBBU0NfU0NTSVFfRF9EQVRBX0FERFIgICAgICAgICAgOAorI2RlZmluZSBBU0NfU0NTSVFfRF9EQVRBX0NOVCAgICAgICAgICAxMgorI2RlZmluZSBBU0NfU0NTSVFfQl9TRU5TRV9MRU4gICAgICAgICAyMAorI2RlZmluZSBBU0NfU0NTSVFfRE9ORV9JTkZPX0JFRyAgICAgICAyMgorI2RlZmluZSBBU0NfU0NTSVFfRF9TUkJQVFIgICAgICAgICAgICAyMgorI2RlZmluZSBBU0NfU0NTSVFfQl9UQVJHRVRfSVggICAgICAgICAyNgorI2RlZmluZSBBU0NfU0NTSVFfQl9DREJfTEVOICAgICAgICAgICAyOAorI2RlZmluZSBBU0NfU0NTSVFfQl9UQUdfQ09ERSAgICAgICAgICAyOQorI2RlZmluZSBBU0NfU0NTSVFfV19WTV9JRCAgICAgICAgICAgICAzMAorI2RlZmluZSBBU0NfU0NTSVFfRE9ORV9TVEFUVVMgICAgICAgICAzMgorI2RlZmluZSBBU0NfU0NTSVFfSE9TVF9TVEFUVVMgICAgICAgICAzMworI2RlZmluZSBBU0NfU0NTSVFfU0NTSV9TVEFUVVMgICAgICAgICAzNAorI2RlZmluZSBBU0NfU0NTSVFfQ0RCX0JFRyAgICAgICAgICAgICAzNgorI2RlZmluZSBBU0NfU0NTSVFfRFdfUkVNQUlOX1hGRVJfQUREUiA1NgorI2RlZmluZSBBU0NfU0NTSVFfRFdfUkVNQUlOX1hGRVJfQ05UICA2MAorI2RlZmluZSBBU0NfU0NTSVFfQl9GSVJTVF9TR19XS19RUCAgICA0OAorI2RlZmluZSBBU0NfU0NTSVFfQl9TR19XS19RUCAgICAgICAgICA0OQorI2RlZmluZSBBU0NfU0NTSVFfQl9TR19XS19JWCAgICAgICAgICA1MAorI2RlZmluZSBBU0NfU0NTSVFfV19BTFRfREMxICAgICAgICAgICA1MgorI2RlZmluZSBBU0NfU0NTSVFfQl9MSVNUX0NOVCAgICAgICAgICA2CisjZGVmaW5lIEFTQ19TQ1NJUV9CX0NVUl9MSVNUX0NOVCAgICAgIDcKKyNkZWZpbmUgQVNDX1NHUV9CX1NHX0NOVEwgICAgICAgICAgICAgNAorI2RlZmluZSBBU0NfU0dRX0JfU0dfSEVBRF9RUCAgICAgICAgICA1CisjZGVmaW5lIEFTQ19TR1FfQl9TR19MSVNUX0NOVCAgICAgICAgIDYKKyNkZWZpbmUgQVNDX1NHUV9CX1NHX0NVUl9MSVNUX0NOVCAgICAgNworI2RlZmluZSBBU0NfU0dRX0xJU1RfQkVHICAgICAgICAgICAgICA4CisjZGVmaW5lIEFTQ19ERUZfU0NTSTFfUU5HICAgIDQKKyNkZWZpbmUgQVNDX01BWF9TQ1NJMV9RTkcgICAgNAorI2RlZmluZSBBU0NfREVGX1NDU0kyX1FORyAgICAxNgorI2RlZmluZSBBU0NfTUFYX1NDU0kyX1FORyAgICAzMgorI2RlZmluZSBBU0NfVEFHX0NPREVfTUFTSyAgICAweDIzCisjZGVmaW5lIEFTQ19TVE9QX1JFUV9SSVNDX1NUT1AgICAgICAweDAxCisjZGVmaW5lIEFTQ19TVE9QX0FDS19SSVNDX1NUT1AgICAgICAweDAzCisjZGVmaW5lIEFTQ19TVE9QX0NMRUFOX1VQX0JVU1lfUSAgICAweDEwCisjZGVmaW5lIEFTQ19TVE9QX0NMRUFOX1VQX0RJU0NfUSAgICAweDIwCisjZGVmaW5lIEFTQ19TVE9QX0hPU1RfUkVRX1JJU0NfSEFMVCAweDQwCisjZGVmaW5lIEFTQ19USURMVU5fVE9fSVgodGlkLCBsdW4pICAoQVNDX1NDU0lfVElYX1RZUEUpKCh0aWQpICsgKChsdW4pPDxBU0NfU0NTSV9JRF9CSVRTKSkKKyNkZWZpbmUgQVNDX1RJRF9UT19UQVJHRVRfSUQodGlkKSAgIChBU0NfU0NTSV9CSVRfSURfVFlQRSkoMHgwMSA8PCAodGlkKSkKKyNkZWZpbmUgQVNDX1RJWF9UT19UQVJHRVRfSUQodGl4KSAgICgweDAxIDw8ICgodGl4KSAmIEFTQ19NQVhfVElEKSkKKyNkZWZpbmUgQVNDX1RJWF9UT19USUQodGl4KSAgICAgICAgICgodGl4KSAmIEFTQ19NQVhfVElEKQorI2RlZmluZSBBU0NfVElEX1RPX1RJWCh0aWQpICAgICAgICAgKCh0aWQpICYgQVNDX01BWF9USUQpCisjZGVmaW5lIEFTQ19USVhfVE9fTFVOKHRpeCkgICAgICAgICAoKCh0aXgpID4+IEFTQ19TQ1NJX0lEX0JJVFMpICYgQVNDX01BWF9MVU4pCisjZGVmaW5lIEFTQ19RTk9fVE9fUUFERFIocV9ubykgICAgICAoKEFTQ19RQURSX0JFRykrKChpbnQpKHFfbm8pIDw8IDYpKQorCit0eXBlZGVmIHN0cnVjdCBhc2Nfc2NzaXFfMSB7CisgICAgdWNoYXIgICAgICAgICAgICAgICBzdGF0dXM7CisgICAgdWNoYXIgICAgICAgICAgICAgICBxX25vOworICAgIHVjaGFyICAgICAgICAgICAgICAgY250bDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHNnX3F1ZXVlX2NudDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHRhcmdldF9pZDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHRhcmdldF9sdW47CisgICAgQVNDX1BBRERSICAgICAgICAgICBkYXRhX2FkZHI7CisgICAgQVNDX0RDTlQgICAgICAgICAgICBkYXRhX2NudDsKKyAgICBBU0NfUEFERFIgICAgICAgICAgIHNlbnNlX2FkZHI7CisgICAgdWNoYXIgICAgICAgICAgICAgICBzZW5zZV9sZW47CisgICAgdWNoYXIgICAgICAgICAgICAgICBleHRyYV9ieXRlczsKK30gQVNDX1NDU0lRXzE7CisKK3R5cGVkZWYgc3RydWN0IGFzY19zY3NpcV8yIHsKKyAgICBBU0NfVkFERFIgICAgICAgICAgIHNyYl9wdHI7CisgICAgdWNoYXIgICAgICAgICAgICAgICB0YXJnZXRfaXg7CisgICAgdWNoYXIgICAgICAgICAgICAgICBmbGFnOworICAgIHVjaGFyICAgICAgICAgICAgICAgY2RiX2xlbjsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHRhZ19jb2RlOworICAgIHVzaG9ydCAgICAgICAgICAgICAgdm1faWQ7Cit9IEFTQ19TQ1NJUV8yOworCit0eXBlZGVmIHN0cnVjdCBhc2Nfc2NzaXFfMyB7CisgICAgdWNoYXIgICAgICAgICAgICAgICBkb25lX3N0YXQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBob3N0X3N0YXQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBzY3NpX3N0YXQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBzY3NpX21zZzsKK30gQVNDX1NDU0lRXzM7CisKK3R5cGVkZWYgc3RydWN0IGFzY19zY3NpcV80IHsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGNkYltBU0NfTUFYX0NEQl9MRU5dOworICAgIHVjaGFyICAgICAgICAgICAgICAgeV9maXJzdF9zZ19saXN0X3FwOworICAgIHVjaGFyICAgICAgICAgICAgICAgeV93b3JraW5nX3NnX3FwOworICAgIHVjaGFyICAgICAgICAgICAgICAgeV93b3JraW5nX3NnX2l4OworICAgIHVjaGFyICAgICAgICAgICAgICAgeV9yZXM7CisgICAgdXNob3J0ICAgICAgICAgICAgICB4X3JlcV9jb3VudDsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHhfcmVjb25uZWN0X3J0bjsKKyAgICBBU0NfUEFERFIgICAgICAgICAgIHhfc2F2ZWRfZGF0YV9hZGRyOworICAgIEFTQ19EQ05UICAgICAgICAgICAgeF9zYXZlZF9kYXRhX2NudDsKK30gQVNDX1NDU0lRXzQ7CisKK3R5cGVkZWYgc3RydWN0IGFzY19xX2RvbmVfaW5mbyB7CisgICAgQVNDX1NDU0lRXzIgICAgICAgICBkMjsKKyAgICBBU0NfU0NTSVFfMyAgICAgICAgIGQzOworICAgIHVjaGFyICAgICAgICAgICAgICAgcV9zdGF0dXM7CisgICAgdWNoYXIgICAgICAgICAgICAgICBxX25vOworICAgIHVjaGFyICAgICAgICAgICAgICAgY250bDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHNlbnNlX2xlbjsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGV4dHJhX2J5dGVzOworICAgIHVjaGFyICAgICAgICAgICAgICAgcmVzOworICAgIEFTQ19EQ05UICAgICAgICAgICAgcmVtYWluX2J5dGVzOworfSBBU0NfUURPTkVfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgYXNjX3NnX2xpc3QgeworICAgIEFTQ19QQUREUiAgICAgICAgICAgYWRkcjsKKyAgICBBU0NfRENOVCAgICAgICAgICAgIGJ5dGVzOworfSBBU0NfU0dfTElTVDsKKwordHlwZWRlZiBzdHJ1Y3QgYXNjX3NnX2hlYWQgeworICAgIHVzaG9ydCAgICAgICAgICAgICAgZW50cnlfY250OworICAgIHVzaG9ydCAgICAgICAgICAgICAgcXVldWVfY250OworICAgIHVzaG9ydCAgICAgICAgICAgICAgZW50cnlfdG9fY29weTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHJlczsKKyAgICBBU0NfU0dfTElTVCAgICAgICAgIHNnX2xpc3RbQVNDX01BWF9TR19MSVNUXTsKK30gQVNDX1NHX0hFQUQ7CisKKyNkZWZpbmUgQVNDX01JTl9TR19MSVNUICAgMgorCit0eXBlZGVmIHN0cnVjdCBhc2NfbWluX3NnX2hlYWQgeworICAgIHVzaG9ydCAgICAgICAgICAgICAgZW50cnlfY250OworICAgIHVzaG9ydCAgICAgICAgICAgICAgcXVldWVfY250OworICAgIHVzaG9ydCAgICAgICAgICAgICAgZW50cnlfdG9fY29weTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHJlczsKKyAgICBBU0NfU0dfTElTVCAgICAgICAgIHNnX2xpc3RbQVNDX01JTl9TR19MSVNUXTsKK30gQVNDX01JTl9TR19IRUFEOworCisjZGVmaW5lIFFDWF9TT1JUICAgICAgICAoMHgwMDAxKQorI2RlZmluZSBRQ1hfQ09BTEVBU0UgICAgKDB4MDAwMikKKwordHlwZWRlZiBzdHJ1Y3QgYXNjX3Njc2lfcSB7CisgICAgQVNDX1NDU0lRXzEgICAgICAgICBxMTsKKyAgICBBU0NfU0NTSVFfMiAgICAgICAgIHEyOworICAgIHVjaGFyICAgICAgICAgICAgICAgKmNkYnB0cjsKKyAgICBBU0NfU0dfSEVBRCAgICAgICAgICpzZ19oZWFkOworICAgIHVzaG9ydCAgICAgICAgICAgICAgcmVtYWluX3NnX2VudHJ5X2NudDsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIG5leHRfc2dfaW5kZXg7Cit9IEFTQ19TQ1NJX1E7CisKK3R5cGVkZWYgc3RydWN0IGFzY19zY3NpX3JlcV9xIHsKKyAgICBBU0NfU0NTSVFfMSAgICAgICAgIHIxOworICAgIEFTQ19TQ1NJUV8yICAgICAgICAgcjI7CisgICAgdWNoYXIgICAgICAgICAgICAgICAqY2RicHRyOworICAgIEFTQ19TR19IRUFEICAgICAgICAgKnNnX2hlYWQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICAqc2Vuc2VfcHRyOworICAgIEFTQ19TQ1NJUV8zICAgICAgICAgcjM7CisgICAgdWNoYXIgICAgICAgICAgICAgICBjZGJbQVNDX01BWF9DREJfTEVOXTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHNlbnNlW0FTQ19NSU5fU0VOU0VfTEVOXTsKK30gQVNDX1NDU0lfUkVRX1E7CisKK3R5cGVkZWYgc3RydWN0IGFzY19zY3NpX2Jpb3NfcmVxX3EgeworICAgIEFTQ19TQ1NJUV8xICAgICAgICAgcjE7CisgICAgQVNDX1NDU0lRXzIgICAgICAgICByMjsKKyAgICB1Y2hhciAgICAgICAgICAgICAgICpjZGJwdHI7CisgICAgQVNDX1NHX0hFQUQgICAgICAgICAqc2dfaGVhZDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgICpzZW5zZV9wdHI7CisgICAgQVNDX1NDU0lRXzMgICAgICAgICByMzsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGNkYltBU0NfTUFYX0NEQl9MRU5dOworICAgIHVjaGFyICAgICAgICAgICAgICAgc2Vuc2VbQVNDX01JTl9TRU5TRV9MRU5dOworfSBBU0NfU0NTSV9CSU9TX1JFUV9ROworCit0eXBlZGVmIHN0cnVjdCBhc2NfcmlzY19xIHsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGZ3ZDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGJ3ZDsKKyAgICBBU0NfU0NTSVFfMSAgICAgICAgIGkxOworICAgIEFTQ19TQ1NJUV8yICAgICAgICAgaTI7CisgICAgQVNDX1NDU0lRXzMgICAgICAgICBpMzsKKyAgICBBU0NfU0NTSVFfNCAgICAgICAgIGk0OworfSBBU0NfUklTQ19ROworCit0eXBlZGVmIHN0cnVjdCBhc2Nfc2dfbGlzdF9xIHsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHNlcV9ubzsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHFfbm87CisgICAgdWNoYXIgICAgICAgICAgICAgICBjbnRsOworICAgIHVjaGFyICAgICAgICAgICAgICAgc2dfaGVhZF9xcDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHNnX2xpc3RfY250OworICAgIHVjaGFyICAgICAgICAgICAgICAgc2dfY3VyX2xpc3RfY250OworfSBBU0NfU0dfTElTVF9ROworCit0eXBlZGVmIHN0cnVjdCBhc2NfcmlzY19zZ19saXN0X3EgeworICAgIHVjaGFyICAgICAgICAgICAgICAgZndkOworICAgIHVjaGFyICAgICAgICAgICAgICAgYndkOworICAgIEFTQ19TR19MSVNUX1EgICAgICAgc2c7CisgICAgQVNDX1NHX0xJU1QgICAgICAgICBzZ19saXN0WzddOworfSBBU0NfUklTQ19TR19MSVNUX1E7CisKKyNkZWZpbmUgQVNDX0VYRV9TQ1NJX0lPX01BWF9JRExFX0xPT1AgIDB4MTAwMDAwMFVMCisjZGVmaW5lIEFTQ19FWEVfU0NTSV9JT19NQVhfV0FJVF9MT09QICAxMDI0CisjZGVmaW5lIEFTQ1FfRVJSX05PX0VSUk9SICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVNDUV9FUlJfSU9fTk9UX0ZPVU5EICAgICAgICAgMQorI2RlZmluZSBBU0NRX0VSUl9MT0NBTF9NRU0gICAgICAgICAgICAyCisjZGVmaW5lIEFTQ1FfRVJSX0NIS1NVTSAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVNDUV9FUlJfU1RBUlRfQ0hJUCAgICAgICAgICAgNAorI2RlZmluZSBBU0NRX0VSUl9JTlRfVEFSR0VUX0lEICAgICAgICA1CisjZGVmaW5lIEFTQ1FfRVJSX0lOVF9MT0NBTF9NRU0gICAgICAgIDYKKyNkZWZpbmUgQVNDUV9FUlJfSEFMVF9SSVNDICAgICAgICAgICAgNworI2RlZmluZSBBU0NRX0VSUl9HRVRfQVNQSV9FTlRSWSAgICAgICA4CisjZGVmaW5lIEFTQ1FfRVJSX0NMT1NFX0FTUEkgICAgICAgICAgIDkKKyNkZWZpbmUgQVNDUV9FUlJfSE9TVF9JTlFVSVJZICAgICAgICAgMHgwQQorI2RlZmluZSBBU0NRX0VSUl9TQVZFRF9TUkJfQkFEICAgICAgICAweDBCCisjZGVmaW5lIEFTQ1FfRVJSX1FDTlRMX1NHX0xJU1QgICAgICAgIDB4MEMKKyNkZWZpbmUgQVNDUV9FUlJfUV9TVEFUVVMgICAgICAgICAgICAgMHgwRAorI2RlZmluZSBBU0NRX0VSUl9XUl9TQ1NJUSAgICAgICAgICAgICAweDBFCisjZGVmaW5lIEFTQ1FfRVJSX1BDX0FERFIgICAgICAgICAgICAgIDB4MEYKKyNkZWZpbmUgQVNDUV9FUlJfU1lOX09GRlNFVCAgICAgICAgICAgMHgxMAorI2RlZmluZSBBU0NRX0VSUl9TWU5fWEZFUl9USU1FICAgICAgICAweDExCisjZGVmaW5lIEFTQ1FfRVJSX0xPQ0tfRE1BICAgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgQVNDUV9FUlJfVU5MT0NLX0RNQSAgICAgICAgICAgMHgxMworI2RlZmluZSBBU0NRX0VSUl9WRFNfQ0hLX0lOU1RBTEwgICAgICAweDE0CisjZGVmaW5lIEFTQ1FfRVJSX01JQ1JPX0NPREVfSEFMVCAgICAgIDB4MTUKKyNkZWZpbmUgQVNDUV9FUlJfU0VUX0xSQU1fQUREUiAgICAgICAgMHgxNgorI2RlZmluZSBBU0NRX0VSUl9DVVJfUU5HICAgICAgICAgICAgICAweDE3CisjZGVmaW5lIEFTQ1FfRVJSX1NHX1FfTElOS1MgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgQVNDUV9FUlJfU0NTSVFfUFRSICAgICAgICAgICAgMHgxOQorI2RlZmluZSBBU0NRX0VSUl9JU1JfUkVfRU5UUlkgICAgICAgICAweDFBCisjZGVmaW5lIEFTQ1FfRVJSX0NSSVRJQ0FMX1JFX0VOVFJZICAgIDB4MUIKKyNkZWZpbmUgQVNDUV9FUlJfSVNSX09OX0NSSVRJQ0FMICAgICAgMHgxQworI2RlZmluZSBBU0NRX0VSUl9TR19MSVNUX09ERF9BRERSRVNTICAweDFECisjZGVmaW5lIEFTQ1FfRVJSX1hGRVJfQUREUkVTU19UT09fQklHIDB4MUUKKyNkZWZpbmUgQVNDUV9FUlJfU0NTSVFfTlVMTF9QVFIgICAgICAgMHgxRgorI2RlZmluZSBBU0NRX0VSUl9TQ1NJUV9CQURfTkVYVF9QVFIgICAweDIwCisjZGVmaW5lIEFTQ1FfRVJSX0dFVF9OVU1fT0ZfRlJFRV9RICAgIDB4MjEKKyNkZWZpbmUgQVNDUV9FUlJfU0VORF9TQ1NJX1EgICAgICAgICAgMHgyMgorI2RlZmluZSBBU0NRX0VSUl9IT1NUX1JFUV9SSVNDX0hBTFQgICAweDIzCisjZGVmaW5lIEFTQ1FfRVJSX1JFU0VUX1NEVFIgICAgICAgICAgIDB4MjQKKworLyoKKyAqIFdhcm5pbmcgY29kZSB2YWx1ZXMgYXJlIHNldCBpbiBBU0NfRFZDX1ZBUiAgJ3dhcm5fY29kZScuCisgKi8KKyNkZWZpbmUgQVNDX1dBUk5fTk9fRVJST1IgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEFTQ19XQVJOX0lPX1BPUlRfUk9UQVRFICAgICAgIDB4MDAwMQorI2RlZmluZSBBU0NfV0FSTl9FRVBST01fQ0hLU1VNICAgICAgICAweDAwMDIKKyNkZWZpbmUgQVNDX1dBUk5fSVJRX01PRElGSUVEICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEFTQ19XQVJOX0FVVE9fQ09ORklHICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBBU0NfV0FSTl9DTURfUU5HX0NPTkZMSUNUICAgICAweDAwMTAKKyNkZWZpbmUgQVNDX1dBUk5fRUVQUk9NX1JFQ09WRVIgICAgICAgMHgwMDIwCisjZGVmaW5lIEFTQ19XQVJOX0NGR19NU1dfUkVDT1ZFUiAgICAgIDB4MDA0MAorI2RlZmluZSBBU0NfV0FSTl9TRVRfUENJX0NPTkZJR19TUEFDRSAweDAwODAKKworLyoKKyAqIEVycm9yIGNvZGUgdmFsdWVzIGFyZSBzZXQgaW4gQVNDX0RWQ19WQVIgICdlcnJfY29kZScuCisgKi8KKyNkZWZpbmUgQVNDX0lFUlJfV1JJVEVfRUVQUk9NICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEFTQ19JRVJSX01DT0RFX0NIS1NVTSAgICAgICAgIDB4MDAwMgorI2RlZmluZSBBU0NfSUVSUl9TRVRfUENfQUREUiAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgQVNDX0lFUlJfU1RBUlRfU1RPUF9DSElQICAgICAgMHgwMDA4CisjZGVmaW5lIEFTQ19JRVJSX0lSUV9OTyAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBBU0NfSUVSUl9TRVRfSVJRX05PICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgQVNDX0lFUlJfQ0hJUF9WRVJTSU9OICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEFTQ19JRVJSX1NFVF9TQ1NJX0lEICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBBU0NfSUVSUl9HRVRfUEhZX0FERFIgICAgICAgICAweDAxMDAKKyNkZWZpbmUgQVNDX0lFUlJfQkFEX1NJR05BVFVSRSAgICAgICAgMHgwMjAwCisjZGVmaW5lIEFTQ19JRVJSX05PX0JVU19UWVBFICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBBU0NfSUVSUl9TQ0FNICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgQVNDX0lFUlJfU0VUX1NEVFIgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIEFTQ19JRVJSX1JXX0xSQU0gICAgICAgICAgICAgIDB4ODAwMAorCisjZGVmaW5lIEFTQ19ERUZfSVJRX05PICAxMAorI2RlZmluZSBBU0NfTUFYX0lSUV9OTyAgMTUKKyNkZWZpbmUgQVNDX01JTl9JUlFfTk8gIDEwCisjZGVmaW5lIEFTQ19NSU5fUkVNQUlOX1EgICAgICAgICgweDAyKQorI2RlZmluZSBBU0NfREVGX01BWF9UT1RBTF9RTkcgICAoMHhGMCkKKyNkZWZpbmUgQVNDX01JTl9UQUdfUV9QRVJfRFZDICAgKDB4MDQpCisjZGVmaW5lIEFTQ19ERUZfVEFHX1FfUEVSX0RWQyAgICgweDA0KQorI2RlZmluZSBBU0NfTUlOX0ZSRUVfUSAgICAgICAgQVNDX01JTl9SRU1BSU5fUQorI2RlZmluZSBBU0NfTUlOX1RPVEFMX1FORyAgICAgKChBU0NfTUFYX1NHX1FVRVVFKSsoQVNDX01JTl9GUkVFX1EpKQorI2RlZmluZSBBU0NfTUFYX1RPVEFMX1FORyAyNDAKKyNkZWZpbmUgQVNDX01BWF9QQ0lfVUxUUkFfSU5SQU1fVE9UQUxfUU5HIDE2CisjZGVmaW5lIEFTQ19NQVhfUENJX1VMVFJBX0lOUkFNX1RBR19RTkcgICA4CisjZGVmaW5lIEFTQ19NQVhfUENJX0lOUkFNX1RPVEFMX1FORyAgMjAKKyNkZWZpbmUgQVNDX01BWF9JTlJBTV9UQUdfUU5HICAgMTYKKyNkZWZpbmUgQVNDX0lPQURSX1RBQkxFX01BWF9JWCAgMTEKKyNkZWZpbmUgQVNDX0lPQURSX0dBUCAgIDB4MTAKKyNkZWZpbmUgQVNDX1NFQVJDSF9JT1BfR0FQIDB4MTAKKyNkZWZpbmUgQVNDX01JTl9JT1BfQUREUiAgIChQb3J0QWRkcikweDAxMDAKKyNkZWZpbmUgQVNDX01BWF9JT1BfQUREUiAgIChQb3J0QWRkcikweDNGMAorI2RlZmluZSBBU0NfSU9BRFJfMSAgICAgKFBvcnRBZGRyKTB4MDExMAorI2RlZmluZSBBU0NfSU9BRFJfMiAgICAgKFBvcnRBZGRyKTB4MDEzMAorI2RlZmluZSBBU0NfSU9BRFJfMyAgICAgKFBvcnRBZGRyKTB4MDE1MAorI2RlZmluZSBBU0NfSU9BRFJfNCAgICAgKFBvcnRBZGRyKTB4MDE5MAorI2RlZmluZSBBU0NfSU9BRFJfNSAgICAgKFBvcnRBZGRyKTB4MDIxMAorI2RlZmluZSBBU0NfSU9BRFJfNiAgICAgKFBvcnRBZGRyKTB4MDIzMAorI2RlZmluZSBBU0NfSU9BRFJfNyAgICAgKFBvcnRBZGRyKTB4MDI1MAorI2RlZmluZSBBU0NfSU9BRFJfOCAgICAgKFBvcnRBZGRyKTB4MDMzMAorI2RlZmluZSBBU0NfSU9BRFJfREVGICAgQVNDX0lPQURSXzgKKyNkZWZpbmUgQVNDX0xJQl9TQ1NJUV9XS19TUCAgICAgICAgMjU2CisjZGVmaW5lIEFTQ19NQVhfU1lOX1hGRVJfTk8gICAgICAgIDE2CisjZGVmaW5lIEFTQ19TWU5fTUFYX09GRlNFVCAgICAgICAgIDB4MEYKKyNkZWZpbmUgQVNDX0RFRl9TRFRSX09GRlNFVCAgICAgICAgMHgwRgorI2RlZmluZSBBU0NfREVGX1NEVFJfSU5ERVggICAgICAgICAweDAwCisjZGVmaW5lIEFTQ19TRFRSX1VMVFJBX1BDSV8xME1CX0lOREVYICAweDAyCisjZGVmaW5lIFNZTl9YRkVSX05TXzAgIDI1CisjZGVmaW5lIFNZTl9YRkVSX05TXzEgIDMwCisjZGVmaW5lIFNZTl9YRkVSX05TXzIgIDM1CisjZGVmaW5lIFNZTl9YRkVSX05TXzMgIDQwCisjZGVmaW5lIFNZTl9YRkVSX05TXzQgIDUwCisjZGVmaW5lIFNZTl9YRkVSX05TXzUgIDYwCisjZGVmaW5lIFNZTl9YRkVSX05TXzYgIDcwCisjZGVmaW5lIFNZTl9YRkVSX05TXzcgIDg1CisjZGVmaW5lIFNZTl9VTFRSQV9YRkVSX05TXzAgICAgMTIKKyNkZWZpbmUgU1lOX1VMVFJBX1hGRVJfTlNfMSAgICAxOQorI2RlZmluZSBTWU5fVUxUUkFfWEZFUl9OU18yICAgIDI1CisjZGVmaW5lIFNZTl9VTFRSQV9YRkVSX05TXzMgICAgMzIKKyNkZWZpbmUgU1lOX1VMVFJBX1hGRVJfTlNfNCAgICAzOAorI2RlZmluZSBTWU5fVUxUUkFfWEZFUl9OU181ICAgIDQ0CisjZGVmaW5lIFNZTl9VTFRSQV9YRkVSX05TXzYgICAgNTAKKyNkZWZpbmUgU1lOX1VMVFJBX1hGRVJfTlNfNyAgICA1NworI2RlZmluZSBTWU5fVUxUUkFfWEZFUl9OU184ICAgIDYzCisjZGVmaW5lIFNZTl9VTFRSQV9YRkVSX05TXzkgICAgNjkKKyNkZWZpbmUgU1lOX1VMVFJBX1hGRVJfTlNfMTAgICA3NQorI2RlZmluZSBTWU5fVUxUUkFfWEZFUl9OU18xMSAgIDgyCisjZGVmaW5lIFNZTl9VTFRSQV9YRkVSX05TXzEyICAgODgKKyNkZWZpbmUgU1lOX1VMVFJBX1hGRVJfTlNfMTMgICA5NAorI2RlZmluZSBTWU5fVUxUUkFfWEZFUl9OU18xNCAgMTAwCisjZGVmaW5lIFNZTl9VTFRSQV9YRkVSX05TXzE1ICAxMDcKKwordHlwZWRlZiBzdHJ1Y3QgZXh0X21zZyB7CisgICAgdWNoYXIgICAgICAgICAgICAgICBtc2dfdHlwZTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIG1zZ19sZW47CisgICAgdWNoYXIgICAgICAgICAgICAgICBtc2dfcmVxOworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVjaGFyICAgICAgICAgICAgICAgc2R0cl94ZmVyX3BlcmlvZDsKKyAgICAgICAgICAgIHVjaGFyICAgICAgICAgICAgICAgc2R0cl9yZXFfYWNrX29mZnNldDsKKyAgICAgICAgfSBzZHRyOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWNoYXIgICAgICAgICAgICAgICB3ZHRyX3dpZHRoOworICAgICAgICB9IHdkdHI7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1Y2hhciAgICAgICAgICAgICAgIG1kcF9iMzsKKyAgICAgICAgICAgIHVjaGFyICAgICAgICAgICAgICAgbWRwX2IyOworICAgICAgICAgICAgdWNoYXIgICAgICAgICAgICAgICBtZHBfYjE7CisgICAgICAgICAgICB1Y2hhciAgICAgICAgICAgICAgIG1kcF9iMDsKKyAgICAgICAgfSBtZHA7CisgICAgfSB1X2V4dF9tc2c7CisgICAgdWNoYXIgICAgICAgICAgICAgICByZXM7Cit9IEVYVF9NU0c7CisKKyNkZWZpbmUgeGZlcl9wZXJpb2QgICAgIHVfZXh0X21zZy5zZHRyLnNkdHJfeGZlcl9wZXJpb2QKKyNkZWZpbmUgcmVxX2Fja19vZmZzZXQgIHVfZXh0X21zZy5zZHRyLnNkdHJfcmVxX2Fja19vZmZzZXQKKyNkZWZpbmUgd2R0cl93aWR0aCAgICAgIHVfZXh0X21zZy53ZHRyLndkdHJfd2lkdGgKKyNkZWZpbmUgbWRwX2IzICAgICAgICAgIHVfZXh0X21zZy5tZHBfYjMKKyNkZWZpbmUgbWRwX2IyICAgICAgICAgIHVfZXh0X21zZy5tZHBfYjIKKyNkZWZpbmUgbWRwX2IxICAgICAgICAgIHVfZXh0X21zZy5tZHBfYjEKKyNkZWZpbmUgbWRwX2IwICAgICAgICAgIHVfZXh0X21zZy5tZHBfYjAKKwordHlwZWRlZiBzdHJ1Y3QgYXNjX2R2Y19jZmcgeworICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIGNhbl90YWdnZWRfcW5nOworICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIGNtZF9xbmdfZW5hYmxlZDsKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBkaXNjX2VuYWJsZTsKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBzZHRyX2VuYWJsZTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGNoaXBfc2NzaV9pZDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGlzYV9kbWFfc3BlZWQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBpc2FfZG1hX2NoYW5uZWw7CisgICAgdWNoYXIgICAgICAgICAgICAgICBjaGlwX3ZlcnNpb247CisgICAgdXNob3J0ICAgICAgICAgICAgICBsaWJfc2VyaWFsX25vOworICAgIHVzaG9ydCAgICAgICAgICAgICAgbGliX3ZlcnNpb247CisgICAgdXNob3J0ICAgICAgICAgICAgICBtY29kZV9kYXRlOworICAgIHVzaG9ydCAgICAgICAgICAgICAgbWNvZGVfdmVyc2lvbjsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIG1heF90YWdfcW5nW0FTQ19NQVhfVElEICsgMV07CisgICAgdWNoYXIgICAgICAgICAgICAgICAqb3ZlcnJ1bl9idWY7CisgICAgdWNoYXIgICAgICAgICAgICAgICBzZHRyX3BlcmlvZF9vZmZzZXRbQVNDX01BWF9USUQgKyAxXTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHBjaV9zbG90X2luZm87CisgICAgdWNoYXIgICAgICAgICAgICAgICBhZGFwdGVyX2luZm9bNl07CisgICAgc3RydWN0IGRldmljZQkqZGV2OworfSBBU0NfRFZDX0NGRzsKKworI2RlZmluZSBBU0NfREVGX0RWQ19DTlRMICAgICAgIDB4RkZGRgorI2RlZmluZSBBU0NfREVGX0NISVBfU0NTSV9JRCAgIDcKKyNkZWZpbmUgQVNDX0RFRl9JU0FfRE1BX1NQRUVEICA0CisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX05VTEwgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX0JFR19HRVRfQ0ZHICAgMHgwMDAxCisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX0VORF9HRVRfQ0ZHICAgMHgwMDAyCisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX0JFR19TRVRfQ0ZHICAgMHgwMDA0CisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX0VORF9TRVRfQ0ZHICAgMHgwMDA4CisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX0JFR19MT0FEX01DICAgMHgwMDEwCisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX0VORF9MT0FEX01DICAgMHgwMDIwCisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX0JFR19JTlFVSVJZICAgMHgwMDQwCisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX0VORF9JTlFVSVJZICAgMHgwMDgwCisjZGVmaW5lIEFTQ19JTklUX1JFU0VUX1NDU0lfRE9ORSAgICAgMHgwMTAwCisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX1dJVEhPVVRfRUVQICAgMHg4MDAwCisjZGVmaW5lIEFTQ19QQ0lfREVWSUNFX0lEX1JFVl9BICAgICAgMHgxMTAwCisjZGVmaW5lIEFTQ19QQ0lfREVWSUNFX0lEX1JFVl9CICAgICAgMHgxMjAwCisjZGVmaW5lIEFTQ19CVUdfRklYX0lGX05PVF9EV0IgICAgICAgMHgwMDAxCisjZGVmaW5lIEFTQ19CVUdfRklYX0FTWU5fVVNFX1NZTiAgICAgMHgwMDAyCisjZGVmaW5lIEFTWU5fU0RUUl9EQVRBX0ZJWF9QQ0lfUkVWX0FCIDB4NDEKKyNkZWZpbmUgQVNDX01JTl9UQUdHRURfQ01EICA3CisjZGVmaW5lIEFTQ19NQVhfU0NTSV9SRVNFVF9XQUlUICAgICAgMzAKKworc3RydWN0IGFzY19kdmNfdmFyOyAgICAgLyogRm9yd2FyZCBEZWNsYXJhdGlvbi4gKi8KKwordHlwZWRlZiB2b2lkICgqIEFTQ19JU1JfQ0FMTEJBQ0spKHN0cnVjdCBhc2NfZHZjX3ZhciAqLCBBU0NfUURPTkVfSU5GTyAqKTsKK3R5cGVkZWYgaW50ICgqIEFTQ19FWEVfQ0FMTEJBQ0spKHN0cnVjdCBhc2NfZHZjX3ZhciAqLCBBU0NfU0NTSV9RICopOworCit0eXBlZGVmIHN0cnVjdCBhc2NfZHZjX3ZhciB7CisgICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIGVycl9jb2RlOworICAgIHVzaG9ydCAgICAgICAgICAgICAgZHZjX2NudGw7CisgICAgdXNob3J0ICAgICAgICAgICAgICBidWdfZml4X2NudGw7CisgICAgdXNob3J0ICAgICAgICAgICAgICBidXNfdHlwZTsKKyAgICBBU0NfSVNSX0NBTExCQUNLICAgIGlzcl9jYWxsYmFjazsKKyAgICBBU0NfRVhFX0NBTExCQUNLICAgIGV4ZV9jYWxsYmFjazsKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBpbml0X3NkdHI7CisgICAgQVNDX1NDU0lfQklUX0lEX1RZUEUgc2R0cl9kb25lOworICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIHVzZV90YWdnZWRfcW5nOworICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIHVuaXRfbm90X3JlYWR5OworICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIHF1ZXVlX2Z1bGxfb3JfYnVzeTsKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBzdGFydF9tb3RvcjsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHNjc2lfcmVzZXRfd2FpdDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGNoaXBfbm87CisgICAgY2hhciAgICAgICAgICAgICAgICBpc19pbl9pbnQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBtYXhfdG90YWxfcW5nOworICAgIHVjaGFyICAgICAgICAgICAgICAgY3VyX3RvdGFsX3FuZzsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGluX2NyaXRpY2FsX2NudDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGlycV9ubzsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGxhc3RfcV9zaG9ydGFnZTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIGluaXRfc3RhdGU7CisgICAgdWNoYXIgICAgICAgICAgICAgICBjdXJfZHZjX3FuZ1tBU0NfTUFYX1RJRCArIDFdOworICAgIHVjaGFyICAgICAgICAgICAgICAgbWF4X2R2Y19xbmdbQVNDX01BWF9USUQgKyAxXTsKKyAgICBBU0NfU0NTSV9RICAqc2NzaXFfYnVzeV9oZWFkW0FTQ19NQVhfVElEICsgMV07CisgICAgQVNDX1NDU0lfUSAgKnNjc2lxX2J1c3lfdGFpbFtBU0NfTUFYX1RJRCArIDFdOworICAgIHVjaGFyICAgICAgICAgICAgICAgc2R0cl9wZXJpb2RfdGJsW0FTQ19NQVhfU1lOX1hGRVJfTk9dOworICAgIEFTQ19EVkNfQ0ZHICpjZmc7CisgICAgQVNDX1NDU0lfQklUX0lEX1RZUEUgcGNpX2ZpeF9hc3luX3hmZXJfYWx3YXlzOworICAgIGNoYXIgICAgICAgICAgICAgICAgcmVkb19zY2FtOworICAgIHVzaG9ydCAgICAgICAgICAgICAgcmVzMjsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGRvc19pbnQxM190YWJsZVtBU0NfTUFYX1RJRCArIDFdOworICAgIEFTQ19EQ05UICAgICAgICAgICAgbWF4X2RtYV9jb3VudDsKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBub19zY2FtOworICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIHBjaV9maXhfYXN5bl94ZmVyOworICAgIHVjaGFyICAgICAgICAgICAgICAgbWF4X3NkdHJfaW5kZXg7CisgICAgdWNoYXIgICAgICAgICAgICAgICBob3N0X2luaXRfc2R0cl9pbmRleDsKKyAgICBzdHJ1Y3QgYXNjX2JvYXJkICAgICpkcnZfcHRyOworICAgIEFTQ19EQ05UICAgICAgICAgICAgdWNfYnJlYWs7Cit9IEFTQ19EVkNfVkFSOworCit0eXBlZGVmIHN0cnVjdCBhc2NfZHZjX2lucV9pbmZvIHsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHR5cGVbQVNDX01BWF9USUQgKyAxXVtBU0NfTUFYX0xVTiArIDFdOworfSBBU0NfRFZDX0lOUV9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBhc2NfY2FwX2luZm8geworICAgIEFTQ19EQ05UICAgICAgICAgICAgbGJhOworICAgIEFTQ19EQ05UICAgICAgICAgICAgYmxrX3NpemU7Cit9IEFTQ19DQVBfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgYXNjX2NhcF9pbmZvX2FycmF5IHsKKyAgICBBU0NfQ0FQX0lORk8gICAgICAgIGNhcF9pbmZvW0FTQ19NQVhfVElEICsgMV1bQVNDX01BWF9MVU4gKyAxXTsKK30gQVNDX0NBUF9JTkZPX0FSUkFZOworCisjZGVmaW5lIEFTQ19NQ05UTF9OT19TRUxfVElNRU9VVCAgKHVzaG9ydCkweDAwMDEKKyNkZWZpbmUgQVNDX01DTlRMX05VTExfVEFSR0VUICAgICAodXNob3J0KTB4MDAwMgorI2RlZmluZSBBU0NfQ05UTF9JTklUSUFUT1IgICAgICAgICAodXNob3J0KTB4MDAwMQorI2RlZmluZSBBU0NfQ05UTF9CSU9TX0dUXzFHQiAgICAgICAodXNob3J0KTB4MDAwMgorI2RlZmluZSBBU0NfQ05UTF9CSU9TX0dUXzJfRElTSyAgICAodXNob3J0KTB4MDAwNAorI2RlZmluZSBBU0NfQ05UTF9CSU9TX1JFTU9WQUJMRSAgICAodXNob3J0KTB4MDAwOAorI2RlZmluZSBBU0NfQ05UTF9OT19TQ0FNICAgICAgICAgICAodXNob3J0KTB4MDAxMAorI2RlZmluZSBBU0NfQ05UTF9JTlRfTVVMVElfUSAgICAgICAodXNob3J0KTB4MDA4MAorI2RlZmluZSBBU0NfQ05UTF9OT19MVU5fU1VQUE9SVCAgICAodXNob3J0KTB4MDA0MAorI2RlZmluZSBBU0NfQ05UTF9OT19WRVJJRllfQ09QWSAgICAodXNob3J0KTB4MDEwMAorI2RlZmluZSBBU0NfQ05UTF9SRVNFVF9TQ1NJICAgICAgICAodXNob3J0KTB4MDIwMAorI2RlZmluZSBBU0NfQ05UTF9JTklUX0lOUVVJUlkgICAgICAodXNob3J0KTB4MDQwMAorI2RlZmluZSBBU0NfQ05UTF9JTklUX1ZFUkJPU0UgICAgICAodXNob3J0KTB4MDgwMAorI2RlZmluZSBBU0NfQ05UTF9TQ1NJX1BBUklUWSAgICAgICAodXNob3J0KTB4MTAwMAorI2RlZmluZSBBU0NfQ05UTF9CVVJTVF9NT0RFICAgICAgICAodXNob3J0KTB4MjAwMAorI2RlZmluZSBBU0NfQ05UTF9TRFRSX0VOQUJMRV9VTFRSQSAodXNob3J0KTB4NDAwMAorI2RlZmluZSBBU0NfRUVQX0RWQ19DRkdfQkVHX1ZMICAgIDIKKyNkZWZpbmUgQVNDX0VFUF9NQVhfRFZDX0FERFJfVkwgICAxNQorI2RlZmluZSBBU0NfRUVQX0RWQ19DRkdfQkVHICAgICAgMzIKKyNkZWZpbmUgQVNDX0VFUF9NQVhfRFZDX0FERFIgICAgIDQ1CisjZGVmaW5lIEFTQ19FRVBfREVGSU5FRF9XT1JEUyAgICAxMAorI2RlZmluZSBBU0NfRUVQX01BWF9BRERSICAgICAgICAgNjMKKyNkZWZpbmUgQVNDX0VFUF9SRVNfV09SRFMgICAgICAgICAwCisjZGVmaW5lIEFTQ19FRVBfTUFYX1JFVFJZICAgICAgICAyMAorI2RlZmluZSBBU0NfTUFYX0lOSVRfQlVTWV9SRVRSWSAgIDgKKyNkZWZpbmUgQVNDX0VFUF9JU0FfUE5QX1dTSVpFICAgIDE2CisKKy8qCisgKiBUaGVzZSBtYWNyb3Mga2VlcCB0aGUgY2hpcCBTQ1NJIGlkIGFuZCBJU0EgRE1BIHNwZWVkCisgKiBiaXRmaWVsZHMgaW4gYm9hcmQgb3JkZXIuIEMgYml0ZmllbGRzIGFyZW4ndCBwb3J0YWJsZQorICogYmV0d2VlbiBiaWcgYW5kIGxpdHRsZS1lbmRpYW4gcGxhdGZvcm1zIHNvIHRoZXkgYXJlCisgKiBub3QgdXNlZC4KKyAqLworCisjZGVmaW5lIEFTQ19FRVBfR0VUX0NISVBfSUQoY2ZnKSAgICAoKGNmZyktPmlkX3NwZWVkICYgMHgwZikKKyNkZWZpbmUgQVNDX0VFUF9HRVRfRE1BX1NQRChjZmcpICAgICgoKGNmZyktPmlkX3NwZWVkICYgMHhmMCkgPj4gNCkKKyNkZWZpbmUgQVNDX0VFUF9TRVRfQ0hJUF9JRChjZmcsIHNpZCkgXAorICAgKChjZmcpLT5pZF9zcGVlZCA9ICgoY2ZnKS0+aWRfc3BlZWQgJiAweGYwKSB8ICgoc2lkKSAmIEFTQ19NQVhfVElEKSkKKyNkZWZpbmUgQVNDX0VFUF9TRVRfRE1BX1NQRChjZmcsIHNwZCkgXAorICAgKChjZmcpLT5pZF9zcGVlZCA9ICgoY2ZnKS0+aWRfc3BlZWQgJiAweDBmKSB8ICgoc3BkKSAmIDB4MGYpIDw8IDQpCisKK3R5cGVkZWYgc3RydWN0IGFzY2VlcF9jb25maWcgeworICAgIHVzaG9ydCAgICAgICAgICAgICAgY2ZnX2xzdzsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIGNmZ19tc3c7CisgICAgdWNoYXIgICAgICAgICAgICAgICBpbml0X3NkdHI7CisgICAgdWNoYXIgICAgICAgICAgICAgICBkaXNjX2VuYWJsZTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHVzZV9jbWRfcW5nOworICAgIHVjaGFyICAgICAgICAgICAgICAgc3RhcnRfbW90b3I7CisgICAgdWNoYXIgICAgICAgICAgICAgICBtYXhfdG90YWxfcW5nOworICAgIHVjaGFyICAgICAgICAgICAgICAgbWF4X3RhZ19xbmc7CisgICAgdWNoYXIgICAgICAgICAgICAgICBiaW9zX3NjYW47CisgICAgdWNoYXIgICAgICAgICAgICAgICBwb3dlcl91cF93YWl0OworICAgIHVjaGFyICAgICAgICAgICAgICAgbm9fc2NhbTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGlkX3NwZWVkOyAvKiBsb3cgb3JkZXIgNCBiaXRzIGlzIGNoaXAgc2NzaSBpZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhpZ2ggb3JkZXIgNCBiaXRzIGlzIGlzYSBkbWEgc3BlZWQgKi8KKyAgICB1Y2hhciAgICAgICAgICAgICAgIGRvc19pbnQxM190YWJsZVtBU0NfTUFYX1RJRCArIDFdOworICAgIHVjaGFyICAgICAgICAgICAgICAgYWRhcHRlcl9pbmZvWzZdOworICAgIHVzaG9ydCAgICAgICAgICAgICAgY250bDsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIGNoa3N1bTsKK30gQVNDRUVQX0NPTkZJRzsKKworI2RlZmluZSBBU0NfUENJX0NGR19MU1dfU0NTSV9QQVJJVFkgIDB4MDgwMAorI2RlZmluZSBBU0NfUENJX0NGR19MU1dfQlVSU1RfTU9ERSAgIDB4MDA4MAorI2RlZmluZSBBU0NfUENJX0NGR19MU1dfSU5UUl9BQkxFICAgIDB4MDAyMAorCisjZGVmaW5lIEFTQ19FRVBfQ01EX1JFQUQgICAgICAgICAgMHg4MAorI2RlZmluZSBBU0NfRUVQX0NNRF9XUklURSAgICAgICAgIDB4NDAKKyNkZWZpbmUgQVNDX0VFUF9DTURfV1JJVEVfQUJMRSAgICAweDMwCisjZGVmaW5lIEFTQ19FRVBfQ01EX1dSSVRFX0RJU0FCTEUgMHgwMAorI2RlZmluZSBBU0NfT1ZFUlJVTl9CU0laRSAgMHgwMDAwMDA0OFVMCisjZGVmaW5lIEFTQ19DVFJMX0JSRUFLX09OQ0UgICAgICAgIDB4MDAwMQorI2RlZmluZSBBU0NfQ1RSTF9CUkVBS19TVEFZX0lETEUgICAweDAwMDIKKyNkZWZpbmUgQVNDVl9NU0dPVVRfQkVHICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEFTQ1ZfTVNHT1VUX1NEVFJfUEVSSU9EIChBU0NWX01TR09VVF9CRUcrMykKKyNkZWZpbmUgQVNDVl9NU0dPVVRfU0RUUl9PRkZTRVQgKEFTQ1ZfTVNHT1VUX0JFRys0KQorI2RlZmluZSBBU0NWX0JSRUFLX1NBVkVEX0NPREUgICAodXNob3J0KTB4MDAwNgorI2RlZmluZSBBU0NWX01TR0lOX0JFRyAgICAgICAgICAoQVNDVl9NU0dPVVRfQkVHKzgpCisjZGVmaW5lIEFTQ1ZfTVNHSU5fU0RUUl9QRVJJT0QgIChBU0NWX01TR0lOX0JFRyszKQorI2RlZmluZSBBU0NWX01TR0lOX1NEVFJfT0ZGU0VUICAoQVNDVl9NU0dJTl9CRUcrNCkKKyNkZWZpbmUgQVNDVl9TRFRSX0RBVEFfQkVHICAgICAgKEFTQ1ZfTVNHSU5fQkVHKzgpCisjZGVmaW5lIEFTQ1ZfU0RUUl9ET05FX0JFRyAgICAgIChBU0NWX1NEVFJfREFUQV9CRUcrOCkKKyNkZWZpbmUgQVNDVl9NQVhfRFZDX1FOR19CRUcgICAgKHVzaG9ydCkweDAwMjAKKyNkZWZpbmUgQVNDVl9CUkVBS19BRERSICAgICAgICAgICAodXNob3J0KTB4MDAyOAorI2RlZmluZSBBU0NWX0JSRUFLX05PVElGWV9DT1VOVCAgICh1c2hvcnQpMHgwMDJBCisjZGVmaW5lIEFTQ1ZfQlJFQUtfQ09OVFJPTCAgICAgICAgKHVzaG9ydCkweDAwMkMKKyNkZWZpbmUgQVNDVl9CUkVBS19ISVRfQ09VTlQgICAgICAodXNob3J0KTB4MDAyRQorCisjZGVmaW5lIEFTQ1ZfQVNDRFZDX0VSUl9DT0RFX1cgICh1c2hvcnQpMHgwMDMwCisjZGVmaW5lIEFTQ1ZfTUNPREVfQ0hLU1VNX1cgICAodXNob3J0KTB4MDAzMgorI2RlZmluZSBBU0NWX01DT0RFX1NJWkVfVyAgICAgKHVzaG9ydCkweDAwMzQKKyNkZWZpbmUgQVNDVl9TVE9QX0NPREVfQiAgICAgICh1c2hvcnQpMHgwMDM2CisjZGVmaW5lIEFTQ1ZfRFZDX0VSUl9DT0RFX0IgICAodXNob3J0KTB4MDAzNworI2RlZmluZSBBU0NWX09WRVJSVU5fUEFERFJfRCAgKHVzaG9ydCkweDAwMzgKKyNkZWZpbmUgQVNDVl9PVkVSUlVOX0JTSVpFX0QgICh1c2hvcnQpMHgwMDNDCisjZGVmaW5lIEFTQ1ZfSEFMVENPREVfVyAgICAgICAodXNob3J0KTB4MDA0MAorI2RlZmluZSBBU0NWX0NIS1NVTV9XICAgICAgICAgKHVzaG9ydCkweDAwNDIKKyNkZWZpbmUgQVNDVl9NQ19EQVRFX1cgICAgICAgICh1c2hvcnQpMHgwMDQ0CisjZGVmaW5lIEFTQ1ZfTUNfVkVSX1cgICAgICAgICAodXNob3J0KTB4MDA0NgorI2RlZmluZSBBU0NWX05FWFRSRFlfQiAgICAgICAgKHVzaG9ydCkweDAwNDgKKyNkZWZpbmUgQVNDVl9ET05FTkVYVF9CICAgICAgICh1c2hvcnQpMHgwMDQ5CisjZGVmaW5lIEFTQ1ZfVVNFX1RBR0dFRF9RTkdfQiAodXNob3J0KTB4MDA0QQorI2RlZmluZSBBU0NWX1NDU0lCVVNZX0IgICAgICAgKHVzaG9ydCkweDAwNEIKKyNkZWZpbmUgQVNDVl9RX0RPTkVfSU5fUFJPR1JFU1NfQiAgKHVzaG9ydCkweDAwNEMKKyNkZWZpbmUgQVNDVl9DVVJDREJfQiAgICAgICAgICh1c2hvcnQpMHgwMDRECisjZGVmaW5lIEFTQ1ZfUkNMVU5fQiAgICAgICAgICAodXNob3J0KTB4MDA0RQorI2RlZmluZSBBU0NWX0JVU1lfUUhFQURfQiAgICAgKHVzaG9ydCkweDAwNEYKKyNkZWZpbmUgQVNDVl9ESVNDMV9RSEVBRF9CICAgICh1c2hvcnQpMHgwMDUwCisjZGVmaW5lIEFTQ1ZfRElTQ19FTkFCTEVfQiAgICAodXNob3J0KTB4MDA1MgorI2RlZmluZSBBU0NWX0NBTl9UQUdHRURfUU5HX0IgKHVzaG9ydCkweDAwNTMKKyNkZWZpbmUgQVNDVl9IT1NUU0NTSV9JRF9CICAgICh1c2hvcnQpMHgwMDU1CisjZGVmaW5lIEFTQ1ZfTUNPREVfQ05UTF9CICAgICAodXNob3J0KTB4MDA1NgorI2RlZmluZSBBU0NWX05VTExfVEFSR0VUX0IgICAgKHVzaG9ydCkweDAwNTcKKyNkZWZpbmUgQVNDVl9GUkVFX1FfSEVBRF9XICAgICh1c2hvcnQpMHgwMDU4CisjZGVmaW5lIEFTQ1ZfRE9ORV9RX1RBSUxfVyAgICAodXNob3J0KTB4MDA1QQorI2RlZmluZSBBU0NWX0ZSRUVfUV9IRUFEX0IgICAgKHVzaG9ydCkoQVNDVl9GUkVFX1FfSEVBRF9XKzEpCisjZGVmaW5lIEFTQ1ZfRE9ORV9RX1RBSUxfQiAgICAodXNob3J0KShBU0NWX0RPTkVfUV9UQUlMX1crMSkKKyNkZWZpbmUgQVNDVl9IT1NUX0ZMQUdfQiAgICAgICh1c2hvcnQpMHgwMDVECisjZGVmaW5lIEFTQ1ZfVE9UQUxfUkVBRFlfUV9CICAodXNob3J0KTB4MDA2NAorI2RlZmluZSBBU0NWX1ZFUl9TRVJJQUxfQiAgICAgKHVzaG9ydCkweDAwNjUKKyNkZWZpbmUgQVNDVl9IQUxUQ09ERV9TQVZFRF9XICh1c2hvcnQpMHgwMDY2CisjZGVmaW5lIEFTQ1ZfV1RNX0ZMQUdfQiAgICAgICAodXNob3J0KTB4MDA2OAorI2RlZmluZSBBU0NWX1JJU0NfRkxBR19CICAgICAgKHVzaG9ydCkweDAwNkEKKyNkZWZpbmUgQVNDVl9SRVFfU0dfTElTVF9RUCAgICh1c2hvcnQpMHgwMDZCCisjZGVmaW5lIEFTQ19IT1NUX0ZMQUdfSU5fSVNSICAgICAgICAweDAxCisjZGVmaW5lIEFTQ19IT1NUX0ZMQUdfQUNLX0lOVCAgICAgICAweDAyCisjZGVmaW5lIEFTQ19SSVNDX0ZMQUdfR0VOX0lOVCAgICAgIDB4MDEKKyNkZWZpbmUgQVNDX1JJU0NfRkxBR19SRVFfU0dfTElTVCAgMHgwMgorI2RlZmluZSBJT1BfQ1RSTCAgICAgICAgICgweDBGKQorI2RlZmluZSBJT1BfU1RBVFVTICAgICAgICgweDBFKQorI2RlZmluZSBJT1BfSU5UX0FDSyAgICAgIElPUF9TVEFUVVMKKyNkZWZpbmUgSU9QX1JFR19JRkMgICAgICAoMHgwRCkKKyNkZWZpbmUgSU9QX1NZTl9PRkZTRVQgICAgKDB4MEIpCisjZGVmaW5lIElPUF9FWFRSQV9DT05UUk9MICgweDBEKQorI2RlZmluZSBJT1BfUkVHX1BDICAgICAgICAoMHgwQykKKyNkZWZpbmUgSU9QX1JBTV9BRERSICAgICAgKDB4MEEpCisjZGVmaW5lIElPUF9SQU1fREFUQSAgICAgICgweDA4KQorI2RlZmluZSBJT1BfRUVQX0RBVEEgICAgICAoMHgwNikKKyNkZWZpbmUgSU9QX0VFUF9DTUQgICAgICAgKDB4MDcpCisjZGVmaW5lIElPUF9WRVJTSU9OICAgICAgICgweDAzKQorI2RlZmluZSBJT1BfQ09ORklHX0hJR0ggICAoMHgwNCkKKyNkZWZpbmUgSU9QX0NPTkZJR19MT1cgICAgKDB4MDIpCisjZGVmaW5lIElPUF9TSUdfQllURSAgICAgICgweDAxKQorI2RlZmluZSBJT1BfU0lHX1dPUkQgICAgICAoMHgwMCkKKyNkZWZpbmUgSU9QX1JFR19EQzEgICAgICAoMHgwRSkKKyNkZWZpbmUgSU9QX1JFR19EQzAgICAgICAoMHgwQykKKyNkZWZpbmUgSU9QX1JFR19TQiAgICAgICAoMHgwQikKKyNkZWZpbmUgSU9QX1JFR19EQTEgICAgICAoMHgwQSkKKyNkZWZpbmUgSU9QX1JFR19EQTAgICAgICAoMHgwOCkKKyNkZWZpbmUgSU9QX1JFR19TQyAgICAgICAoMHgwOSkKKyNkZWZpbmUgSU9QX0RNQV9TUEVFRCAgICAoMHgwNykKKyNkZWZpbmUgSU9QX1JFR19GTEFHICAgICAoMHgwNykKKyNkZWZpbmUgSU9QX0ZJRk9fSCAgICAgICAoMHgwNikKKyNkZWZpbmUgSU9QX0ZJRk9fTCAgICAgICAoMHgwNCkKKyNkZWZpbmUgSU9QX1JFR19JRCAgICAgICAoMHgwNSkKKyNkZWZpbmUgSU9QX1JFR19RUCAgICAgICAoMHgwMykKKyNkZWZpbmUgSU9QX1JFR19JSCAgICAgICAoMHgwMikKKyNkZWZpbmUgSU9QX1JFR19JWCAgICAgICAoMHgwMSkKKyNkZWZpbmUgSU9QX1JFR19BWCAgICAgICAoMHgwMCkKKyNkZWZpbmUgSUZDX1JFR19MT0NLICAgICAgKDB4MDApCisjZGVmaW5lIElGQ19SRUdfVU5MT0NLICAgICgweDA5KQorI2RlZmluZSBJRkNfV1JfRU5fRklMVEVSICAoMHgxMCkKKyNkZWZpbmUgSUZDX1JEX05PX0VFUFJPTSAgKDB4MTApCisjZGVmaW5lIElGQ19TTEVXX1JBVEUgICAgICgweDIwKQorI2RlZmluZSBJRkNfQUNUX05FRyAgICAgICAoMHg0MCkKKyNkZWZpbmUgSUZDX0lOUF9GSUxURVIgICAgKDB4ODApCisjZGVmaW5lIElGQ19JTklUX0RFRkFVTFQgIChJRkNfQUNUX05FRyB8IElGQ19SRUdfVU5MT0NLKQorI2RlZmluZSBTQ19TRUwgICAodWNoYXIpKDB4ODApCisjZGVmaW5lIFNDX0JTWSAgICh1Y2hhcikoMHg0MCkKKyNkZWZpbmUgU0NfQUNLICAgKHVjaGFyKSgweDIwKQorI2RlZmluZSBTQ19SRVEgICAodWNoYXIpKDB4MTApCisjZGVmaW5lIFNDX0FUTiAgICh1Y2hhcikoMHgwOCkKKyNkZWZpbmUgU0NfSU8gICAgKHVjaGFyKSgweDA0KQorI2RlZmluZSBTQ19DRCAgICAodWNoYXIpKDB4MDIpCisjZGVmaW5lIFNDX01TRyAgICh1Y2hhcikoMHgwMSkKKyNkZWZpbmUgU0VDX1NDU0lfQ1RMICAgICAgICAgKHVjaGFyKSgweDgwKQorI2RlZmluZSBTRUNfQUNUSVZFX05FR0FURSAgICAodWNoYXIpKDB4NDApCisjZGVmaW5lIFNFQ19TTEVXX1JBVEUgICAgICAgICh1Y2hhcikoMHgyMCkKKyNkZWZpbmUgU0VDX0VOQUJMRV9GSUxURVIgICAgKHVjaGFyKSgweDEwKQorI2RlZmluZSBBU0NfSEFMVF9FWFRNU0dfSU4gICAgICh1c2hvcnQpMHg4MDAwCisjZGVmaW5lIEFTQ19IQUxUX0NIS19DT05ESVRJT04gKHVzaG9ydCkweDgxMDAKKyNkZWZpbmUgQVNDX0hBTFRfU1NfUVVFVUVfRlVMTCAodXNob3J0KTB4ODIwMAorI2RlZmluZSBBU0NfSEFMVF9ESVNBQkxFX0FTWU5fVVNFX1NZTl9GSVggICh1c2hvcnQpMHg4MzAwCisjZGVmaW5lIEFTQ19IQUxUX0VOQUJMRV9BU1lOX1VTRV9TWU5fRklYICAgKHVzaG9ydCkweDg0MDAKKyNkZWZpbmUgQVNDX0hBTFRfU0RUUl9SRUpFQ1RFRCAodXNob3J0KTB4NDAwMAorI2RlZmluZSBBU0NfSEFMVF9IT1NUX0NPUFlfU0dfTElTVF9UT19SSVNDICggdXNob3J0ICkweDIwMDAKKyNkZWZpbmUgQVNDX01BWF9RTk8gICAgICAgIDB4RjgKKyNkZWZpbmUgQVNDX0RBVEFfU0VDX0JFRyAgICh1c2hvcnQpMHgwMDgwCisjZGVmaW5lIEFTQ19EQVRBX1NFQ19FTkQgICAodXNob3J0KTB4MDA4MAorI2RlZmluZSBBU0NfQ09ERV9TRUNfQkVHICAgKHVzaG9ydCkweDAwODAKKyNkZWZpbmUgQVNDX0NPREVfU0VDX0VORCAgICh1c2hvcnQpMHgwMDgwCisjZGVmaW5lIEFTQ19RQURSX0JFRyAgICAgICAoMHg0MDAwKQorI2RlZmluZSBBU0NfUUFEUl9VU0VEICAgICAgKHVzaG9ydCkoQVNDX01BWF9RTk8gKiA2NCkKKyNkZWZpbmUgQVNDX1FBRFJfRU5EICAgICAgICh1c2hvcnQpMHg3RkZGCisjZGVmaW5lIEFTQ19RTEFTVF9BRFIgICAgICAodXNob3J0KTB4N0ZDMAorI2RlZmluZSBBU0NfUUJMS19TSVpFICAgICAgMHg0MAorI2RlZmluZSBBU0NfQklPU19EQVRBX1FCRUcgMHhGOAorI2RlZmluZSBBU0NfTUlOX0FDVElWRV9RTk8gMHgwMQorI2RlZmluZSBBU0NfUUxJTktfRU5EICAgICAgMHhGRgorI2RlZmluZSBBU0NfRUVQUk9NX1dPUkRTICAgMHgxMAorI2RlZmluZSBBU0NfTUFYX01HU19MRU4gICAgMHgxMAorI2RlZmluZSBBU0NfQklPU19BRERSX0RFRiAgMHhEQzAwCisjZGVmaW5lIEFTQ19CSU9TX1NJWkUgICAgICAweDM4MDAKKyNkZWZpbmUgQVNDX0JJT1NfUkFNX09GRiAgIDB4MzgwMAorI2RlZmluZSBBU0NfQklPU19SQU1fU0laRSAgMHg4MDAKKyNkZWZpbmUgQVNDX0JJT1NfTUlOX0FERFIgIDB4QzAwMAorI2RlZmluZSBBU0NfQklPU19NQVhfQUREUiAgMHhFQzAwCisjZGVmaW5lIEFTQ19CSU9TX0JBTktfU0laRSAweDA0MDAKKyNkZWZpbmUgQVNDX01DT0RFX1NUQVJUX0FERFIgIDB4MDA4MAorI2RlZmluZSBBU0NfQ0ZHMF9IT1NUX0lOVF9PTiAgICAweDAwMjAKKyNkZWZpbmUgQVNDX0NGRzBfQklPU19PTiAgICAgICAgMHgwMDQwCisjZGVmaW5lIEFTQ19DRkcwX1ZFUkFfQlVSU1RfT04gIDB4MDA4MAorI2RlZmluZSBBU0NfQ0ZHMF9TQ1NJX1BBUklUWV9PTiAweDA4MDAKKyNkZWZpbmUgQVNDX0NGRzFfU0NTSV9UQVJHRVRfT04gMHgwMDgwCisjZGVmaW5lIEFTQ19DRkcxX0xSQU1fOEJJVFNfT04gIDB4MDgwMAorI2RlZmluZSBBU0NfQ0ZHX01TV19DTFJfTUFTSyAgICAweDMwODAKKyNkZWZpbmUgQ1NXX1RFU1QxICAgICAgICAgICAgIChBU0NfQ1NfVFlQRSkweDgwMDAKKyNkZWZpbmUgQ1NXX0FVVE9fQ09ORklHICAgICAgIChBU0NfQ1NfVFlQRSkweDQwMDAKKyNkZWZpbmUgQ1NXX1JFU0VSVkVEMSAgICAgICAgIChBU0NfQ1NfVFlQRSkweDIwMDAKKyNkZWZpbmUgQ1NXX0lSUV9XUklUVEVOICAgICAgIChBU0NfQ1NfVFlQRSkweDEwMDAKKyNkZWZpbmUgQ1NXXzMzTUhaX1NFTEVDVEVEICAgIChBU0NfQ1NfVFlQRSkweDA4MDAKKyNkZWZpbmUgQ1NXX1RFU1QyICAgICAgICAgICAgIChBU0NfQ1NfVFlQRSkweDA0MDAKKyNkZWZpbmUgQ1NXX1RFU1QzICAgICAgICAgICAgIChBU0NfQ1NfVFlQRSkweDAyMDAKKyNkZWZpbmUgQ1NXX1JFU0VSVkVEMiAgICAgICAgIChBU0NfQ1NfVFlQRSkweDAxMDAKKyNkZWZpbmUgQ1NXX0RNQV9ET05FICAgICAgICAgIChBU0NfQ1NfVFlQRSkweDAwODAKKyNkZWZpbmUgQ1NXX0ZJRk9fUkRZICAgICAgICAgIChBU0NfQ1NfVFlQRSkweDAwNDAKKyNkZWZpbmUgQ1NXX0VFUF9SRUFEX0RPTkUgICAgIChBU0NfQ1NfVFlQRSkweDAwMjAKKyNkZWZpbmUgQ1NXX0hBTFRFRCAgICAgICAgICAgIChBU0NfQ1NfVFlQRSkweDAwMTAKKyNkZWZpbmUgQ1NXX1NDU0lfUkVTRVRfQUNUSVZFIChBU0NfQ1NfVFlQRSkweDAwMDgKKyNkZWZpbmUgQ1NXX1BBUklUWV9FUlIgICAgICAgIChBU0NfQ1NfVFlQRSkweDAwMDQKKyNkZWZpbmUgQ1NXX1NDU0lfUkVTRVRfTEFUQ0ggIChBU0NfQ1NfVFlQRSkweDAwMDIKKyNkZWZpbmUgQ1NXX0lOVF9QRU5ESU5HICAgICAgIChBU0NfQ1NfVFlQRSkweDAwMDEKKyNkZWZpbmUgQ0lXX0NMUl9TQ1NJX1JFU0VUX0lOVCAoQVNDX0NTX1RZUEUpMHgxMDAwCisjZGVmaW5lIENJV19JTlRfQUNLICAgICAgKEFTQ19DU19UWVBFKTB4MDEwMAorI2RlZmluZSBDSVdfVEVTVDEgICAgICAgIChBU0NfQ1NfVFlQRSkweDAyMDAKKyNkZWZpbmUgQ0lXX1RFU1QyICAgICAgICAoQVNDX0NTX1RZUEUpMHgwNDAwCisjZGVmaW5lIENJV19TRUxfMzNNSFogICAgKEFTQ19DU19UWVBFKTB4MDgwMAorI2RlZmluZSBDSVdfSVJRX0FDVCAgICAgIChBU0NfQ1NfVFlQRSkweDEwMDAKKyNkZWZpbmUgQ0NfQ0hJUF9SRVNFVCAgICh1Y2hhcikweDgwCisjZGVmaW5lIENDX1NDU0lfUkVTRVQgICAodWNoYXIpMHg0MAorI2RlZmluZSBDQ19IQUxUICAgICAgICAgKHVjaGFyKTB4MjAKKyNkZWZpbmUgQ0NfU0lOR0xFX1NURVAgICh1Y2hhcikweDEwCisjZGVmaW5lIENDX0RNQV9BQkxFICAgICAodWNoYXIpMHgwOAorI2RlZmluZSBDQ19URVNUICAgICAgICAgKHVjaGFyKTB4MDQKKyNkZWZpbmUgQ0NfQkFOS19PTkUgICAgICh1Y2hhcikweDAyCisjZGVmaW5lIENDX0RJQUcgICAgICAgICAodWNoYXIpMHgwMQorI2RlZmluZSBBU0NfMTAwMF9JRDBXICAgICAgMHgwNEMxCisjZGVmaW5lIEFTQ18xMDAwX0lEMFdfRklYICAweDAwQzEKKyNkZWZpbmUgQVNDXzEwMDBfSUQxQiAgICAgIDB4MjUKKyNkZWZpbmUgQVNDX0VJU0FfQklHX0lPUF9HQVAgICAoMHgxQzMwLTB4MEM1MCkKKyNkZWZpbmUgQVNDX0VJU0FfU01BTExfSU9QX0dBUCAoMHgwMDIwKQorI2RlZmluZSBBU0NfRUlTQV9NSU5fSU9QX0FERFIgICgweDBDMzApCisjZGVmaW5lIEFTQ19FSVNBX01BWF9JT1BfQUREUiAgKDB4RkM1MCkKKyNkZWZpbmUgQVNDX0VJU0FfUkVWX0lPUF9NQVNLICAoMHgwQzgzKQorI2RlZmluZSBBU0NfRUlTQV9QSURfSU9QX01BU0sgICgweDBDODApCisjZGVmaW5lIEFTQ19FSVNBX0NGR19JT1BfTUFTSyAgKDB4MEM4NikKKyNkZWZpbmUgQVNDX0dFVF9FSVNBX1NMT1QoaW9wKSAgKFBvcnRBZGRyKSgoaW9wKSAmIDB4RjAwMCkKKyNkZWZpbmUgQVNDX0VJU0FfSURfNzQwICAgIDB4MDE3NDUwMDRVTAorI2RlZmluZSBBU0NfRUlTQV9JRF83NTAgICAgMHgwMTc1NTAwNFVMCisjZGVmaW5lIElOU19IQUxUSU5UICAgICAgICAodXNob3J0KTB4NjI4MQorI2RlZmluZSBJTlNfSEFMVCAgICAgICAgICAgKHVzaG9ydCkweDYyODAKKyNkZWZpbmUgSU5TX1NJTlQgICAgICAgICAgICh1c2hvcnQpMHg2MjAwCisjZGVmaW5lIElOU19SRkxBR19XVE0gICAgICAodXNob3J0KTB4NzM4MAorI2RlZmluZSBBU0NfTUNfU0FWRV9DT0RFX1dTSVpFICAweDUwMAorI2RlZmluZSBBU0NfTUNfU0FWRV9EQVRBX1dTSVpFICAweDQwCisKK3R5cGVkZWYgc3RydWN0IGFzY19tY19zYXZlZCB7CisgICAgdXNob3J0ICAgICAgICAgICAgICBkYXRhW0FTQ19NQ19TQVZFX0RBVEFfV1NJWkVdOworICAgIHVzaG9ydCAgICAgICAgICAgICAgY29kZVtBU0NfTUNfU0FWRV9DT0RFX1dTSVpFXTsKK30gQVNDX01DX1NBVkVEOworCisjZGVmaW5lIEFzY0dldFFEb25lSW5Qcm9ncmVzcyhwb3J0KSAgICAgICAgIEFzY1JlYWRMcmFtQnl0ZSgocG9ydCksIEFTQ1ZfUV9ET05FX0lOX1BST0dSRVNTX0IpCisjZGVmaW5lIEFzY1B1dFFEb25lSW5Qcm9ncmVzcyhwb3J0LCB2YWwpICAgIEFzY1dyaXRlTHJhbUJ5dGUoKHBvcnQpLCBBU0NWX1FfRE9ORV9JTl9QUk9HUkVTU19CLCB2YWwpCisjZGVmaW5lIEFzY0dldFZhckZyZWVRSGVhZChwb3J0KSAgICAgICAgICAgIEFzY1JlYWRMcmFtV29yZCgocG9ydCksIEFTQ1ZfRlJFRV9RX0hFQURfVykKKyNkZWZpbmUgQXNjR2V0VmFyRG9uZVFUYWlsKHBvcnQpICAgICAgICAgICAgQXNjUmVhZExyYW1Xb3JkKChwb3J0KSwgQVNDVl9ET05FX1FfVEFJTF9XKQorI2RlZmluZSBBc2NQdXRWYXJGcmVlUUhlYWQocG9ydCwgdmFsKSAgICAgICBBc2NXcml0ZUxyYW1Xb3JkKChwb3J0KSwgQVNDVl9GUkVFX1FfSEVBRF9XLCB2YWwpCisjZGVmaW5lIEFzY1B1dFZhckRvbmVRVGFpbChwb3J0LCB2YWwpICAgICAgIEFzY1dyaXRlTHJhbVdvcmQoKHBvcnQpLCBBU0NWX0RPTkVfUV9UQUlMX1csIHZhbCkKKyNkZWZpbmUgQXNjR2V0UmlzY1ZhckZyZWVRSGVhZChwb3J0KSAgICAgICAgQXNjUmVhZExyYW1CeXRlKChwb3J0KSwgQVNDVl9ORVhUUkRZX0IpCisjZGVmaW5lIEFzY0dldFJpc2NWYXJEb25lUVRhaWwocG9ydCkgICAgICAgIEFzY1JlYWRMcmFtQnl0ZSgocG9ydCksIEFTQ1ZfRE9ORU5FWFRfQikKKyNkZWZpbmUgQXNjUHV0UmlzY1ZhckZyZWVRSGVhZChwb3J0LCB2YWwpICAgQXNjV3JpdGVMcmFtQnl0ZSgocG9ydCksIEFTQ1ZfTkVYVFJEWV9CLCB2YWwpCisjZGVmaW5lIEFzY1B1dFJpc2NWYXJEb25lUVRhaWwocG9ydCwgdmFsKSAgIEFzY1dyaXRlTHJhbUJ5dGUoKHBvcnQpLCBBU0NWX0RPTkVORVhUX0IsIHZhbCkKKyNkZWZpbmUgQXNjUHV0TUNvZGVTRFRSRG9uZUF0SUQocG9ydCwgaWQsIGRhdGEpICBBc2NXcml0ZUxyYW1CeXRlKChwb3J0KSwgKHVzaG9ydCkoKHVzaG9ydClBU0NWX1NEVFJfRE9ORV9CRUcrKHVzaG9ydClpZCksIChkYXRhKSk7CisjZGVmaW5lIEFzY0dldE1Db2RlU0RUUkRvbmVBdElEKHBvcnQsIGlkKSAgICAgICAgQXNjUmVhZExyYW1CeXRlKChwb3J0KSwgKHVzaG9ydCkoKHVzaG9ydClBU0NWX1NEVFJfRE9ORV9CRUcrKHVzaG9ydClpZCkpOworI2RlZmluZSBBc2NQdXRNQ29kZUluaXRTRFRSQXRJRChwb3J0LCBpZCwgZGF0YSkgIEFzY1dyaXRlTHJhbUJ5dGUoKHBvcnQpLCAodXNob3J0KSgodXNob3J0KUFTQ1ZfU0RUUl9EQVRBX0JFRysodXNob3J0KWlkKSwgZGF0YSk7CisjZGVmaW5lIEFzY0dldE1Db2RlSW5pdFNEVFJBdElEKHBvcnQsIGlkKSAgICAgICAgQXNjUmVhZExyYW1CeXRlKChwb3J0KSwgKHVzaG9ydCkoKHVzaG9ydClBU0NWX1NEVFJfREFUQV9CRUcrKHVzaG9ydClpZCkpOworI2RlZmluZSBBc2NTeW5JbmRleFRvUGVyaW9kKGluZGV4KSAgICAgICAgKHVjaGFyKShhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbIChpbmRleCkgXSkKKyNkZWZpbmUgQXNjR2V0Q2hpcFNpZ25hdHVyZUJ5dGUocG9ydCkgICAgICh1Y2hhcilpbnAoKHBvcnQpK0lPUF9TSUdfQllURSkKKyNkZWZpbmUgQXNjR2V0Q2hpcFNpZ25hdHVyZVdvcmQocG9ydCkgICAgICh1c2hvcnQpaW5wdygocG9ydCkrSU9QX1NJR19XT1JEKQorI2RlZmluZSBBc2NHZXRDaGlwVmVyTm8ocG9ydCkgICAgICAgICAgICAgKHVjaGFyKWlucCgocG9ydCkrSU9QX1ZFUlNJT04pCisjZGVmaW5lIEFzY0dldENoaXBDZmdMc3cocG9ydCkgICAgICAgICAgICAodXNob3J0KWlucHcoKHBvcnQpK0lPUF9DT05GSUdfTE9XKQorI2RlZmluZSBBc2NHZXRDaGlwQ2ZnTXN3KHBvcnQpICAgICAgICAgICAgKHVzaG9ydClpbnB3KChwb3J0KStJT1BfQ09ORklHX0hJR0gpCisjZGVmaW5lIEFzY1NldENoaXBDZmdMc3cocG9ydCwgZGF0YSkgICAgICBvdXRwdygocG9ydCkrSU9QX0NPTkZJR19MT1csIGRhdGEpCisjZGVmaW5lIEFzY1NldENoaXBDZmdNc3cocG9ydCwgZGF0YSkgICAgICBvdXRwdygocG9ydCkrSU9QX0NPTkZJR19ISUdILCBkYXRhKQorI2RlZmluZSBBc2NHZXRDaGlwRUVQQ21kKHBvcnQpICAgICAgICAgICAgKHVjaGFyKWlucCgocG9ydCkrSU9QX0VFUF9DTUQpCisjZGVmaW5lIEFzY1NldENoaXBFRVBDbWQocG9ydCwgZGF0YSkgICAgICBvdXRwKChwb3J0KStJT1BfRUVQX0NNRCwgZGF0YSkKKyNkZWZpbmUgQXNjR2V0Q2hpcEVFUERhdGEocG9ydCkgICAgICAgICAgICh1c2hvcnQpaW5wdygocG9ydCkrSU9QX0VFUF9EQVRBKQorI2RlZmluZSBBc2NTZXRDaGlwRUVQRGF0YShwb3J0LCBkYXRhKSAgICAgb3V0cHcoKHBvcnQpK0lPUF9FRVBfREFUQSwgZGF0YSkKKyNkZWZpbmUgQXNjR2V0Q2hpcExyYW1BZGRyKHBvcnQpICAgICAgICAgICh1c2hvcnQpaW5wdygoUG9ydEFkZHIpKChwb3J0KStJT1BfUkFNX0FERFIpKQorI2RlZmluZSBBc2NTZXRDaGlwTHJhbUFkZHIocG9ydCwgYWRkcikgICAgb3V0cHcoKFBvcnRBZGRyKSgocG9ydCkrSU9QX1JBTV9BRERSKSwgYWRkcikKKyNkZWZpbmUgQXNjR2V0Q2hpcExyYW1EYXRhKHBvcnQpICAgICAgICAgICh1c2hvcnQpaW5wdygocG9ydCkrSU9QX1JBTV9EQVRBKQorI2RlZmluZSBBc2NTZXRDaGlwTHJhbURhdGEocG9ydCwgZGF0YSkgICAgb3V0cHcoKHBvcnQpK0lPUF9SQU1fREFUQSwgZGF0YSkKKyNkZWZpbmUgQXNjR2V0Q2hpcElGQyhwb3J0KSAgICAgICAgICAgICAgICh1Y2hhcilpbnAoKHBvcnQpK0lPUF9SRUdfSUZDKQorI2RlZmluZSBBc2NTZXRDaGlwSUZDKHBvcnQsIGRhdGEpICAgICAgICAgIG91dHAoKHBvcnQpK0lPUF9SRUdfSUZDLCBkYXRhKQorI2RlZmluZSBBc2NHZXRDaGlwU3RhdHVzKHBvcnQpICAgICAgICAgICAgKEFTQ19DU19UWVBFKWlucHcoKHBvcnQpK0lPUF9TVEFUVVMpCisjZGVmaW5lIEFzY1NldENoaXBTdGF0dXMocG9ydCwgY3NfdmFsKSAgICBvdXRwdygocG9ydCkrSU9QX1NUQVRVUywgY3NfdmFsKQorI2RlZmluZSBBc2NHZXRDaGlwQ29udHJvbChwb3J0KSAgICAgICAgICAgKHVjaGFyKWlucCgocG9ydCkrSU9QX0NUUkwpCisjZGVmaW5lIEFzY1NldENoaXBDb250cm9sKHBvcnQsIGNjX3ZhbCkgICBvdXRwKChwb3J0KStJT1BfQ1RSTCwgY2NfdmFsKQorI2RlZmluZSBBc2NHZXRDaGlwU3luKHBvcnQpICAgICAgICAgICAgICAgKHVjaGFyKWlucCgocG9ydCkrSU9QX1NZTl9PRkZTRVQpCisjZGVmaW5lIEFzY1NldENoaXBTeW4ocG9ydCwgZGF0YSkgICAgICAgICBvdXRwKChwb3J0KStJT1BfU1lOX09GRlNFVCwgZGF0YSkKKyNkZWZpbmUgQXNjU2V0UENBZGRyKHBvcnQsIGRhdGEpICAgICAgICAgIG91dHB3KChwb3J0KStJT1BfUkVHX1BDLCBkYXRhKQorI2RlZmluZSBBc2NHZXRQQ0FkZHIocG9ydCkgICAgICAgICAgICAgICAgKHVzaG9ydClpbnB3KChwb3J0KStJT1BfUkVHX1BDKQorI2RlZmluZSBBc2NJc0ludFBlbmRpbmcocG9ydCkgICAgICAgICAgICAgKEFzY0dldENoaXBTdGF0dXMocG9ydCkgJiAoQ1NXX0lOVF9QRU5ESU5HIHwgQ1NXX1NDU0lfUkVTRVRfTEFUQ0gpKQorI2RlZmluZSBBc2NHZXRDaGlwU2NzaUlEKHBvcnQpICAgICAgICAgICAgKChBc2NHZXRDaGlwQ2ZnTHN3KHBvcnQpID4+IDgpICYgQVNDX01BWF9USUQpCisjZGVmaW5lIEFzY0dldEV4dHJhQ29udHJvbChwb3J0KSAgICAgICAgICAodWNoYXIpaW5wKChwb3J0KStJT1BfRVhUUkFfQ09OVFJPTCkKKyNkZWZpbmUgQXNjU2V0RXh0cmFDb250cm9sKHBvcnQsIGRhdGEpICAgIG91dHAoKHBvcnQpK0lPUF9FWFRSQV9DT05UUk9MLCBkYXRhKQorI2RlZmluZSBBc2NSZWFkQ2hpcEFYKHBvcnQpICAgICAgICAgICAgICAgKHVzaG9ydClpbnB3KChwb3J0KStJT1BfUkVHX0FYKQorI2RlZmluZSBBc2NXcml0ZUNoaXBBWChwb3J0LCBkYXRhKSAgICAgICAgb3V0cHcoKHBvcnQpK0lPUF9SRUdfQVgsIGRhdGEpCisjZGVmaW5lIEFzY1JlYWRDaGlwSVgocG9ydCkgICAgICAgICAgICAgICAodWNoYXIpaW5wKChwb3J0KStJT1BfUkVHX0lYKQorI2RlZmluZSBBc2NXcml0ZUNoaXBJWChwb3J0LCBkYXRhKSAgICAgICAgb3V0cCgocG9ydCkrSU9QX1JFR19JWCwgZGF0YSkKKyNkZWZpbmUgQXNjUmVhZENoaXBJSChwb3J0KSAgICAgICAgICAgICAgICh1c2hvcnQpaW5wdygocG9ydCkrSU9QX1JFR19JSCkKKyNkZWZpbmUgQXNjV3JpdGVDaGlwSUgocG9ydCwgZGF0YSkgICAgICAgIG91dHB3KChwb3J0KStJT1BfUkVHX0lILCBkYXRhKQorI2RlZmluZSBBc2NSZWFkQ2hpcFFQKHBvcnQpICAgICAgICAgICAgICAgKHVjaGFyKWlucCgocG9ydCkrSU9QX1JFR19RUCkKKyNkZWZpbmUgQXNjV3JpdGVDaGlwUVAocG9ydCwgZGF0YSkgICAgICAgIG91dHAoKHBvcnQpK0lPUF9SRUdfUVAsIGRhdGEpCisjZGVmaW5lIEFzY1JlYWRDaGlwRklGT19MKHBvcnQpICAgICAgICAgICAodXNob3J0KWlucHcoKHBvcnQpK0lPUF9SRUdfRklGT19MKQorI2RlZmluZSBBc2NXcml0ZUNoaXBGSUZPX0wocG9ydCwgZGF0YSkgICAgb3V0cHcoKHBvcnQpK0lPUF9SRUdfRklGT19MLCBkYXRhKQorI2RlZmluZSBBc2NSZWFkQ2hpcEZJRk9fSChwb3J0KSAgICAgICAgICAgKHVzaG9ydClpbnB3KChwb3J0KStJT1BfUkVHX0ZJRk9fSCkKKyNkZWZpbmUgQXNjV3JpdGVDaGlwRklGT19IKHBvcnQsIGRhdGEpICAgIG91dHB3KChwb3J0KStJT1BfUkVHX0ZJRk9fSCwgZGF0YSkKKyNkZWZpbmUgQXNjUmVhZENoaXBEbWFTcGVlZChwb3J0KSAgICAgICAgICh1Y2hhcilpbnAoKHBvcnQpK0lPUF9ETUFfU1BFRUQpCisjZGVmaW5lIEFzY1dyaXRlQ2hpcERtYVNwZWVkKHBvcnQsIGRhdGEpICBvdXRwKChwb3J0KStJT1BfRE1BX1NQRUVELCBkYXRhKQorI2RlZmluZSBBc2NSZWFkQ2hpcERBMChwb3J0KSAgICAgICAgICAgICAgKHVzaG9ydClpbnB3KChwb3J0KStJT1BfUkVHX0RBMCkKKyNkZWZpbmUgQXNjV3JpdGVDaGlwREEwKHBvcnQpICAgICAgICAgICAgIG91dHB3KChwb3J0KStJT1BfUkVHX0RBMCwgZGF0YSkKKyNkZWZpbmUgQXNjUmVhZENoaXBEQTEocG9ydCkgICAgICAgICAgICAgICh1c2hvcnQpaW5wdygocG9ydCkrSU9QX1JFR19EQTEpCisjZGVmaW5lIEFzY1dyaXRlQ2hpcERBMShwb3J0KSAgICAgICAgICAgICBvdXRwdygocG9ydCkrSU9QX1JFR19EQTEsIGRhdGEpCisjZGVmaW5lIEFzY1JlYWRDaGlwREMwKHBvcnQpICAgICAgICAgICAgICAodXNob3J0KWlucHcoKHBvcnQpK0lPUF9SRUdfREMwKQorI2RlZmluZSBBc2NXcml0ZUNoaXBEQzAocG9ydCkgICAgICAgICAgICAgb3V0cHcoKHBvcnQpK0lPUF9SRUdfREMwLCBkYXRhKQorI2RlZmluZSBBc2NSZWFkQ2hpcERDMShwb3J0KSAgICAgICAgICAgICAgKHVzaG9ydClpbnB3KChwb3J0KStJT1BfUkVHX0RDMSkKKyNkZWZpbmUgQXNjV3JpdGVDaGlwREMxKHBvcnQpICAgICAgICAgICAgIG91dHB3KChwb3J0KStJT1BfUkVHX0RDMSwgZGF0YSkKKyNkZWZpbmUgQXNjUmVhZENoaXBEdmNJRChwb3J0KSAgICAgICAgICAgICh1Y2hhcilpbnAoKHBvcnQpK0lPUF9SRUdfSUQpCisjZGVmaW5lIEFzY1dyaXRlQ2hpcER2Y0lEKHBvcnQsIGRhdGEpICAgICBvdXRwKChwb3J0KStJT1BfUkVHX0lELCBkYXRhKQorCitTVEFUSUMgaW50ICAgICAgIEFzY1dyaXRlRUVQQ21kUmVnKFBvcnRBZGRyIGlvcF9iYXNlLCB1Y2hhciBjbWRfcmVnKTsKK1NUQVRJQyBpbnQgICAgICAgQXNjV3JpdGVFRVBEYXRhUmVnKFBvcnRBZGRyIGlvcF9iYXNlLCB1c2hvcnQgZGF0YV9yZWcpOworU1RBVElDIHZvaWQgICAgICBBc2NXYWl0RUVQUmVhZCh2b2lkKTsKK1NUQVRJQyB2b2lkICAgICAgQXNjV2FpdEVFUFdyaXRlKHZvaWQpOworU1RBVElDIHVzaG9ydCAgICBBc2NSZWFkRUVQV29yZChQb3J0QWRkciwgdWNoYXIpOworU1RBVElDIHVzaG9ydCAgICBBc2NXcml0ZUVFUFdvcmQoUG9ydEFkZHIsIHVjaGFyLCB1c2hvcnQpOworU1RBVElDIHVzaG9ydCAgICBBc2NHZXRFRVBDb25maWcoUG9ydEFkZHIsIEFTQ0VFUF9DT05GSUcgKiwgdXNob3J0KTsKK1NUQVRJQyBpbnQgICAgICAgQXNjU2V0RUVQQ29uZmlnT25jZShQb3J0QWRkciwgQVNDRUVQX0NPTkZJRyAqLCB1c2hvcnQpOworU1RBVElDIGludCAgICAgICBBc2NTZXRFRVBDb25maWcoUG9ydEFkZHIsIEFTQ0VFUF9DT05GSUcgKiwgdXNob3J0KTsKK1NUQVRJQyBpbnQgICAgICAgQXNjU3RhcnRDaGlwKFBvcnRBZGRyKTsKK1NUQVRJQyBpbnQgICAgICAgQXNjU3RvcENoaXAoUG9ydEFkZHIpOworU1RBVElDIHZvaWQgICAgICBBc2NTZXRDaGlwSUgoUG9ydEFkZHIsIHVzaG9ydCk7CitTVEFUSUMgaW50ICAgICAgIEFzY0lzQ2hpcEhhbHRlZChQb3J0QWRkcik7CitTVEFUSUMgdm9pZCAgICAgIEFzY0Fja0ludGVycnVwdChQb3J0QWRkcik7CitTVEFUSUMgdm9pZCAgICAgIEFzY0Rpc2FibGVJbnRlcnJ1cHQoUG9ydEFkZHIpOworU1RBVElDIHZvaWQgICAgICBBc2NFbmFibGVJbnRlcnJ1cHQoUG9ydEFkZHIpOworU1RBVElDIHZvaWQgICAgICBBc2NTZXRCYW5rKFBvcnRBZGRyLCB1Y2hhcik7CitTVEFUSUMgaW50ICAgICAgIEFzY1Jlc2V0Q2hpcEFuZFNjc2lCdXMoQVNDX0RWQ19WQVIgKik7CisjaWZkZWYgQ09ORklHX0lTQQorU1RBVElDIHVzaG9ydCAgICBBc2NHZXRJc2FEbWFDaGFubmVsKFBvcnRBZGRyKTsKK1NUQVRJQyB1c2hvcnQgICAgQXNjU2V0SXNhRG1hQ2hhbm5lbChQb3J0QWRkciwgdXNob3J0KTsKK1NUQVRJQyB1Y2hhciAgICAgQXNjU2V0SXNhRG1hU3BlZWQoUG9ydEFkZHIsIHVjaGFyKTsKK1NUQVRJQyB1Y2hhciAgICAgQXNjR2V0SXNhRG1hU3BlZWQoUG9ydEFkZHIpOworI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KK1NUQVRJQyB1Y2hhciAgICAgQXNjUmVhZExyYW1CeXRlKFBvcnRBZGRyLCB1c2hvcnQpOworU1RBVElDIHVzaG9ydCAgICBBc2NSZWFkTHJhbVdvcmQoUG9ydEFkZHIsIHVzaG9ydCk7CisjaWYgQ0NfVkVSWV9MT05HX1NHX0xJU1QKK1NUQVRJQyBBU0NfRENOVCAgQXNjUmVhZExyYW1EV29yZChQb3J0QWRkciwgdXNob3J0KTsKKyNlbmRpZiAvKiBDQ19WRVJZX0xPTkdfU0dfTElTVCAqLworU1RBVElDIHZvaWQgICAgICBBc2NXcml0ZUxyYW1Xb3JkKFBvcnRBZGRyLCB1c2hvcnQsIHVzaG9ydCk7CitTVEFUSUMgdm9pZCAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoUG9ydEFkZHIsIHVzaG9ydCwgdWNoYXIpOworU1RBVElDIEFTQ19EQ05UICBBc2NNZW1TdW1McmFtV29yZChQb3J0QWRkciwgdXNob3J0LCBpbnQpOworU1RBVElDIHZvaWQgICAgICBBc2NNZW1Xb3JkU2V0THJhbShQb3J0QWRkciwgdXNob3J0LCB1c2hvcnQsIGludCk7CitTVEFUSUMgdm9pZCAgICAgIEFzY01lbVdvcmRDb3B5UHRyVG9McmFtKFBvcnRBZGRyLCB1c2hvcnQsIHVjaGFyICosIGludCk7CitTVEFUSUMgdm9pZCAgICAgIEFzY01lbURXb3JkQ29weVB0clRvTHJhbShQb3J0QWRkciwgdXNob3J0LCB1Y2hhciAqLCBpbnQpOworU1RBVElDIHZvaWQgICAgICBBc2NNZW1Xb3JkQ29weVB0ckZyb21McmFtKFBvcnRBZGRyLCB1c2hvcnQsIHVjaGFyICosIGludCk7CitTVEFUSUMgdXNob3J0ICAgIEFzY0luaXRBc2NEdmNWYXIoQVNDX0RWQ19WQVIgKik7CitTVEFUSUMgdXNob3J0ICAgIEFzY0luaXRGcm9tRUVQKEFTQ19EVkNfVkFSICopOworU1RBVElDIHVzaG9ydCAgICBBc2NJbml0RnJvbUFzY0R2Y1ZhcihBU0NfRFZDX1ZBUiAqKTsKK1NUQVRJQyB1c2hvcnQgICAgQXNjSW5pdE1pY3JvQ29kZVZhcihBU0NfRFZDX1ZBUiAqKTsKK1NUQVRJQyBpbnQgICAgICAgQXNjVGVzdEV4dGVybmFsTHJhbShBU0NfRFZDX1ZBUiAqKTsKK1NUQVRJQyB1Y2hhciAgICAgQXNjTXNnT3V0U0RUUihBU0NfRFZDX1ZBUiAqLCB1Y2hhciwgdWNoYXIpOworU1RBVElDIHVjaGFyICAgICBBc2NDYWxTRFRSRGF0YShBU0NfRFZDX1ZBUiAqLCB1Y2hhciwgdWNoYXIpOworU1RBVElDIHZvaWQgICAgICBBc2NTZXRDaGlwU0RUUihQb3J0QWRkciwgdWNoYXIsIHVjaGFyKTsKK1NUQVRJQyB1Y2hhciAgICAgQXNjR2V0U3luUGVyaW9kSW5kZXgoQVNDX0RWQ19WQVIgKiwgdWNoYXIpOworU1RBVElDIHVjaGFyICAgICBBc2NBbGxvY0ZyZWVRdWV1ZShQb3J0QWRkciwgdWNoYXIpOworU1RBVElDIHVjaGFyICAgICBBc2NBbGxvY011bHRpcGxlRnJlZVF1ZXVlKFBvcnRBZGRyLCB1Y2hhciwgdWNoYXIpOworU1RBVElDIGludCAgICAgICBBc2NIb3N0UmVxUmlzY0hhbHQoUG9ydEFkZHIpOworU1RBVElDIGludCAgICAgICBBc2NTdG9wUXVldWVFeGUoUG9ydEFkZHIpOworU1RBVElDIGludCAgICAgICBBc2NTZW5kU2NzaVF1ZXVlKEFTQ19EVkNfVkFSICosCisgICAgICAgICAgICAgICAgICAgIEFTQ19TQ1NJX1EgKiBzY3NpcSwKKyAgICAgICAgICAgICAgICAgICAgdWNoYXIgbl9xX3JlcXVpcmVkKTsKK1NUQVRJQyBpbnQgICAgICAgQXNjUHV0UmVhZHlRdWV1ZShBU0NfRFZDX1ZBUiAqLAorICAgICAgICAgICAgICAgICAgICBBU0NfU0NTSV9RICosIHVjaGFyKTsKK1NUQVRJQyBpbnQgICAgICAgQXNjUHV0UmVhZHlTZ0xpc3RRdWV1ZShBU0NfRFZDX1ZBUiAqLAorICAgICAgICAgICAgICAgICAgICBBU0NfU0NTSV9RICosIHVjaGFyKTsKK1NUQVRJQyBpbnQgICAgICAgQXNjU2V0Q2hpcFN5blJlZ0F0SUQoUG9ydEFkZHIsIHVjaGFyLCB1Y2hhcik7CitTVEFUSUMgaW50ICAgICAgIEFzY1NldFJ1bkNoaXBTeW5SZWdBdElEKFBvcnRBZGRyLCB1Y2hhciwgdWNoYXIpOworU1RBVElDIHVzaG9ydCAgICBBc2NJbml0THJhbShBU0NfRFZDX1ZBUiAqKTsKK1NUQVRJQyB1c2hvcnQgICAgQXNjSW5pdFFMaW5rVmFyKEFTQ19EVkNfVkFSICopOworU1RBVElDIGludCAgICAgICBBc2NTZXRMaWJFcnJvckNvZGUoQVNDX0RWQ19WQVIgKiwgdXNob3J0KTsKK1NUQVRJQyBpbnQgICAgICAgQXNjSXNyQ2hpcEhhbHRlZChBU0NfRFZDX1ZBUiAqKTsKK1NUQVRJQyB1Y2hhciAgICAgX0FzY0NvcHlMcmFtU2NzaURvbmVRKFBvcnRBZGRyLCB1c2hvcnQsCisgICAgICAgICAgICAgICAgICAgIEFTQ19RRE9ORV9JTkZPICosIEFTQ19EQ05UKTsKK1NUQVRJQyBpbnQgICAgICAgQXNjSXNyUURvbmUoQVNDX0RWQ19WQVIgKik7CitTVEFUSUMgaW50ICAgICAgIEFzY0NvbXBhcmVTdHJpbmcodWNoYXIgKiwgdWNoYXIgKiwgaW50KTsKKyNpZmRlZiBDT05GSUdfSVNBCitTVEFUSUMgdXNob3J0ICAgIEFzY0dldEVpc2FDaGlwQ2ZnKFBvcnRBZGRyKTsKK1NUQVRJQyBBU0NfRENOVCAgQXNjR2V0RWlzYVByb2R1Y3RJRChQb3J0QWRkcik7CitTVEFUSUMgUG9ydEFkZHIgIEFzY1NlYXJjaElPUG9ydEFkZHJFSVNBKFBvcnRBZGRyKTsKK1NUQVRJQyBQb3J0QWRkciAgQXNjU2VhcmNoSU9Qb3J0QWRkcjExKFBvcnRBZGRyKTsKK1NUQVRJQyBQb3J0QWRkciAgQXNjU2VhcmNoSU9Qb3J0QWRkcihQb3J0QWRkciwgdXNob3J0KTsKK1NUQVRJQyB2b2lkICAgICAgQXNjU2V0SVNBUE5QV2FpdEZvcktleSh2b2lkKTsKKyNlbmRpZiAvKiBDT05GSUdfSVNBICovCitTVEFUSUMgdWNoYXIgICAgIEFzY0dldENoaXBTY3NpQ3RybChQb3J0QWRkcik7CitTVEFUSUMgdWNoYXIgICAgIEFzY1NldENoaXBTY3NpSUQoUG9ydEFkZHIsIHVjaGFyKTsKK1NUQVRJQyB1Y2hhciAgICAgQXNjR2V0Q2hpcFZlcnNpb24oUG9ydEFkZHIsIHVzaG9ydCk7CitTVEFUSUMgdXNob3J0ICAgIEFzY0dldENoaXBCdXNUeXBlKFBvcnRBZGRyKTsKK1NUQVRJQyBBU0NfRENOVCAgQXNjTG9hZE1pY3JvQ29kZShQb3J0QWRkciwgdXNob3J0LCB1Y2hhciAqLCB1c2hvcnQpOworU1RBVElDIGludCAgICAgICBBc2NGaW5kU2lnbmF0dXJlKFBvcnRBZGRyKTsKK1NUQVRJQyB2b2lkICAgICAgQXNjVG9nZ2xlSVJRQWN0KFBvcnRBZGRyKTsKK1NUQVRJQyB1Y2hhciAgICAgQXNjR2V0Q2hpcElSUShQb3J0QWRkciwgdXNob3J0KTsKK1NUQVRJQyB1Y2hhciAgICAgQXNjU2V0Q2hpcElSUShQb3J0QWRkciwgdWNoYXIsIHVzaG9ydCk7CitTVEFUSUMgdXNob3J0ICAgIEFzY0dldENoaXBCaW9zQWRkcmVzcyhQb3J0QWRkciwgdXNob3J0KTsKK1NUQVRJQyBpbmxpbmUgdWxvbmcgRHZjRW50ZXJDcml0aWNhbCh2b2lkKTsKK1NUQVRJQyBpbmxpbmUgdm9pZCBEdmNMZWF2ZUNyaXRpY2FsKHVsb25nKTsKKyNpZmRlZiBDT05GSUdfUENJCitTVEFUSUMgdWNoYXIgICAgIER2Y1JlYWRQQ0lDb25maWdCeXRlKEFTQ19EVkNfVkFSICosIHVzaG9ydCk7CitTVEFUSUMgdm9pZCAgICAgIER2Y1dyaXRlUENJQ29uZmlnQnl0ZShBU0NfRFZDX1ZBUiAqLAorICAgICAgICAgICAgICAgICAgICB1c2hvcnQsIHVjaGFyKTsKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCitTVEFUSUMgdXNob3J0ICAgICAgQXNjR2V0Q2hpcEJpb3NBZGRyZXNzKFBvcnRBZGRyLCB1c2hvcnQpOworU1RBVElDIHZvaWQgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKEFTQ19EQ05UKTsKK1NUQVRJQyB2b2lkICAgICAgRHZjRGVsYXlOYW5vU2Vjb25kKEFTQ19EVkNfVkFSICosIEFTQ19EQ05UKTsKK1NUQVRJQyB2b2lkICAgICAgRHZjUHV0U2NzaVEoUG9ydEFkZHIsIHVzaG9ydCwgdWNoYXIgKiwgaW50KTsKK1NUQVRJQyB2b2lkICAgICAgRHZjR2V0UWluZm8oUG9ydEFkZHIsIHVzaG9ydCwgdWNoYXIgKiwgaW50KTsKK1NUQVRJQyB1c2hvcnQgICAgQXNjSW5pdEdldENvbmZpZyhBU0NfRFZDX1ZBUiAqKTsKK1NUQVRJQyB1c2hvcnQgICAgQXNjSW5pdFNldENvbmZpZyhBU0NfRFZDX1ZBUiAqKTsKK1NUQVRJQyB1c2hvcnQgICAgQXNjSW5pdEFzYzEwMDBEcml2ZXIoQVNDX0RWQ19WQVIgKik7CitTVEFUSUMgdm9pZCAgICAgIEFzY0FzeW5jRml4KEFTQ19EVkNfVkFSICosIHVjaGFyLAorICAgICAgICAgICAgICAgICAgICBBU0NfU0NTSV9JTlFVSVJZICopOworU1RBVElDIGludCAgICAgICBBc2NUYWdRdWV1aW5nU2FmZShBU0NfU0NTSV9JTlFVSVJZICopOworU1RBVElDIHZvaWQgICAgICBBc2NJbnF1aXJ5SGFuZGxpbmcoQVNDX0RWQ19WQVIgKiwKKyAgICAgICAgICAgICAgICAgICAgdWNoYXIsIEFTQ19TQ1NJX0lOUVVJUlkgKik7CitTVEFUSUMgaW50ICAgICAgIEFzY0V4ZVNjc2lRdWV1ZShBU0NfRFZDX1ZBUiAqLCBBU0NfU0NTSV9RICopOworU1RBVElDIGludCAgICAgICBBc2NJU1IoQVNDX0RWQ19WQVIgKik7CitTVEFUSUMgdWludCAgICAgIEFzY0dldE51bU9mRnJlZVF1ZXVlKEFTQ19EVkNfVkFSICosIHVjaGFyLAorICAgICAgICAgICAgICAgICAgICB1Y2hhcik7CitTVEFUSUMgaW50ICAgICAgIEFzY1NnTGlzdFRvUXVldWUoaW50KTsKKyNpZmRlZiBDT05GSUdfSVNBCitTVEFUSUMgdm9pZCAgICAgIEFzY0VuYWJsZUlzYURtYSh1Y2hhcik7CisjZW5kaWYgLyogQ09ORklHX0lTQSAqLworU1RBVElDIEFTQ19EQ05UICBBc2NHZXRNYXhEbWFDb3VudCh1c2hvcnQpOworCisKKy8qCisgKiAtLS0gQWR2IExpYnJhcnkgQ29uc3RhbnRzIGFuZCBNYWNyb3MKKyAqLworCisjZGVmaW5lIEFEVl9MSUJfVkVSU0lPTl9NQUpPUiAgNQorI2RlZmluZSBBRFZfTElCX1ZFUlNJT05fTUlOT1IgIDE0CisKKy8qCisgKiBEZWZpbmUgQWR2IExpYnJhcnkgcmVxdWlyZWQgc3BlY2lhbCB0eXBlcy4KKyAqLworCisvKgorICogUG9ydGFibGUgRGF0YSBUeXBlcworICoKKyAqIEFueSBpbnN0YW5jZSB3aGVyZSBhIDMyLWJpdCBsb25nIG9yIHBvaW50ZXIgdHlwZSBpcyBhc3N1bWVkCisgKiBmb3IgcHJlY2lzaW9uIG9yIEhXIGRlZmluZWQgc3RydWN0dXJlcywgdGhlIGZvbGxvd2luZyBkZWZpbmUKKyAqIHR5cGVzIG11c3QgYmUgdXNlZC4gSW4gTGludXggdGhlIGNoYXIsIHNob3J0LCBhbmQgaW50IHR5cGVzCisgKiBhcmUgYWxsIGNvbnNpc3RlbnQgYXQgOCwgMTYsIGFuZCAzMiBiaXRzIHJlc3BlY3RpdmVseS4gUG9pbnRlcnMKKyAqIGFuZCBsb25nIHR5cGVzIGFyZSA2NCBiaXRzIG9uIEFscGhhIGFuZCBVbHRyYVNQQVJDLgorICovCisjZGVmaW5lIEFEVl9QQUREUiBfX3UzMiAgICAgICAgIC8qIFBoeXNpY2FsIGFkZHJlc3MgZGF0YSB0eXBlLiAqLworI2RlZmluZSBBRFZfVkFERFIgX191MzIgICAgICAgICAvKiBWaXJ0dWFsIGFkZHJlc3MgZGF0YSB0eXBlLiAqLworI2RlZmluZSBBRFZfRENOVCAgX191MzIgICAgICAgICAvKiBVbnNpZ25lZCBEYXRhIGNvdW50IHR5cGUuICovCisjZGVmaW5lIEFEVl9TRENOVCBfX3MzMiAgICAgICAgIC8qIFNpZ25lZCBEYXRhIGNvdW50IHR5cGUuICovCisKKy8qCisgKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgdG8gY29udmVydCBhIHZpcnR1YWwgYWRkcmVzcyB0byBhCisgKiAzMi1iaXQgdmFsdWUuIFRoaXMgY3VycmVudGx5IGNhbiBiZSB1c2VkIG9uIExpbnV4IEFscGhhCisgKiB3aGljaCB1c2VzIDY0LWJpdCB2aXJ0dWFsIGFkZHJlc3MgYnV0IGEgMzItYml0IGJ1cyBhZGRyZXNzLgorICogVGhpcyBpcyBsaWtlbHkgdG8gYnJlYWsgaW4gdGhlIGZ1dHVyZSwgYnV0IGRvaW5nIHRoaXMgbm93CisgKiB3aWxsIGdpdmUgdXMgdGltZSB0byBjaGFuZ2UgdGhlIEhXIGFuZCBGVyB0byBoYW5kbGUgNjQtYml0CisgKiBhZGRyZXNzZXMuCisgKi8KKyNkZWZpbmUgQURWX1ZBRERSX1RPX1UzMiAgIHZpcnRfdG9fYnVzCisjZGVmaW5lIEFEVl9VMzJfVE9fVkFERFIgICBidXNfdG9fdmlydAorCisjZGVmaW5lIEFkdlBvcnRBZGRyICB1bG9uZyAgICAgICAgICAgICAgLyogVmlydHVhbCBtZW1vcnkgYWRkcmVzcyBzaXplICovCisKKy8qCisgKiBEZWZpbmUgQWR2IExpYnJhcnkgcmVxdWlyZWQgbWVtb3J5IGFjY2VzcyBtYWNyb3MuCisgKi8KKyNkZWZpbmUgQURWX01FTV9SRUFEQihhZGRyKSByZWFkYihhZGRyKQorI2RlZmluZSBBRFZfTUVNX1JFQURXKGFkZHIpIHJlYWR3KGFkZHIpCisjZGVmaW5lIEFEVl9NRU1fV1JJVEVCKGFkZHIsIGJ5dGUpIHdyaXRlYihieXRlLCBhZGRyKQorI2RlZmluZSBBRFZfTUVNX1dSSVRFVyhhZGRyLCB3b3JkKSB3cml0ZXcod29yZCwgYWRkcikKKyNkZWZpbmUgQURWX01FTV9XUklURURXKGFkZHIsIGR3b3JkKSB3cml0ZWwoZHdvcmQsIGFkZHIpCisKKyNkZWZpbmUgQURWX0NBUlJJRVJfQ09VTlQgKEFTQ19ERUZfTUFYX0hPU1RfUU5HICsgMTUpCisKKy8qCisgKiBGb3Igd2lkZSAgYm9hcmRzIGEgQ0RCIGxlbmd0aCBtYXhpbXVtIG9mIDE2IGJ5dGVzCisgKiBpcyBzdXBwb3J0ZWQuCisgKi8KKyNkZWZpbmUgQURWX01BWF9DREJfTEVOICAgICAxNgorCisvKgorICogRGVmaW5lIHRvdGFsIG51bWJlciBvZiBzaW11bHRhbmVvdXMgbWF4aW11bSBlbGVtZW50IHNjYXR0ZXItZ2F0aGVyCisgKiByZXF1ZXN0IGJsb2NrcyBwZXIgd2lkZSBhZGFwdGVyLiBBU0NfREVGX01BWF9IT1NUX1FORyAoMjUzKSBpcyB0aGUKKyAqIG1heGltdW0gbnVtYmVyIG9mIG91dHN0YW5kaW5nIGNvbW1hbmRzIHBlciB3aWRlIGhvc3QgYWRhcHRlci4gRWFjaAorICogY29tbWFuZCB1c2VzIG9uZSBvciBtb3JlIEFEVl9TR19CTE9DSyBlYWNoIHdpdGggMTUgc2NhdHRlci1nYXRoZXIKKyAqIGVsZW1lbnRzLiBBbGxvdyBlYWNoIGNvbW1hbmQgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgQURWX1NHX0JMT0NLIHN0cnVjdHVyZS4KKyAqIFRoaXMgYWxsb3dzIGFib3V0IDE1IGNvbW1hbmRzIHRvIGhhdmUgdGhlIG1heGltdW0gMTcgQURWX1NHX0JMT0NLCisgKiBzdHJ1Y3R1cmVzIG9yIDI1NSBzY2F0dGVyLWdhdGhlciBlbGVtZW50cy4KKyAqCisgKi8KKyNkZWZpbmUgQURWX1RPVF9TR19CTE9DSyAgICAgICAgQVNDX0RFRl9NQVhfSE9TVF9RTkcKKworLyoKKyAqIERlZmluZSBBZHYgTGlicmFyeSByZXF1aXJlZCBtYXhpbXVtIG51bWJlciBvZiBzY2F0dGVyLWdhdGhlcgorICogZWxlbWVudHMgcGVyIHJlcXVlc3QuCisgKi8KKyNkZWZpbmUgQURWX01BWF9TR19MSVNUICAgICAgICAgMjU1CisKKy8qIE51bWJlciBvZiBTRyBibG9ja3MgbmVlZGVkLiAqLworI2RlZmluZSBBRFZfTlVNX1NHX0JMT0NLIFwKKyAgICAoKEFEVl9NQVhfU0dfTElTVCArIChOT19PRl9TR19QRVJfQkxPQ0sgLSAxKSkvTk9fT0ZfU0dfUEVSX0JMT0NLKQorCisvKiBUb3RhbCBjb250aWd1b3VzIG1lbW9yeSBuZWVkZWQgZm9yIFNHIGJsb2Nrcy4gKi8KKyNkZWZpbmUgQURWX1NHX1RPVEFMX01FTV9TSVpFIFwKKyAgICAoc2l6ZW9mKEFEVl9TR19CTE9DSykgKiAgQURWX05VTV9TR19CTE9DSykKKworI2RlZmluZSBBRFZfUEFHRV9TSVpFIFBBR0VfU0laRQorCisjZGVmaW5lIEFEVl9OVU1fUEFHRV9DUk9TU0lORyBcCisgICAgKChBRFZfU0dfVE9UQUxfTUVNX1NJWkUgKyAoQURWX1BBR0VfU0laRSAtIDEpKS9BRFZfUEFHRV9TSVpFKQorCisvKiBhX2NvbmRvci5oICovCisjZGVmaW5lIEFEVl9QQ0lfVkVORE9SX0lEICAgICAgICAgICAgICAgMHgxMENECisjZGVmaW5lIEFEVl9QQ0lfREVWSUNFX0lEX1JFVl9BICAgICAgICAgMHgyMzAwCisjZGVmaW5lIEFEVl9QQ0lfREVWSURfMzhDMDgwMF9SRVYxICAgICAgMHgyNTAwCisjZGVmaW5lIEFEVl9QQ0lfREVWSURfMzhDMTYwMF9SRVYxICAgICAgMHgyNzAwCisKKyNkZWZpbmUgQURWX0VFUF9EVkNfQ0ZHX0JFR0lOICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgQURWX0VFUF9EVkNfQ0ZHX0VORCAgICAgICAgICAgICAoMHgxNSkKKyNkZWZpbmUgQURWX0VFUF9EVkNfQ1RMX0JFR0lOICAgICAgICAgICAoMHgxNikgIC8qIGxvY2F0aW9uIG9mIE9FTSBuYW1lICovCisjZGVmaW5lIEFEVl9FRVBfTUFYX1dPUkRfQUREUiAgICAgICAgICAgKDB4MUUpCisKKyNkZWZpbmUgQURWX0VFUF9ERUxBWV9NUyAgICAgICAgICAgICAgICAxMDAKKworI2RlZmluZSBBRFZfRUVQUk9NX0JJR19FTkRJQU4gICAgICAgICAgMHg4MDAwICAgLyogRUVQUk9NIEJpdCAxNSAqLworI2RlZmluZSBBRFZfRUVQUk9NX0JJT1NfRU5BQkxFICAgICAgICAgMHg0MDAwICAgLyogRUVQUk9NIEJpdCAxNCAqLworLyoKKyAqIEZvciB0aGUgQVNDMzU1MCBCaXQgMTMgaXMgVGVybWluYXRpb24gUG9sYXJpdHkgY29udHJvbCBiaXQuCisgKiBGb3IgbGF0ZXIgSUNzIEJpdCAxMyBjb250cm9scyB3aGV0aGVyIHRoZSBDSVMgKENhcmQgSW5mb3JtYXRpb24KKyAqIFNlcnZpY2UgU2VjdGlvbikgaXMgbG9hZGVkIGZyb20gRUVQUk9NLgorICovCisjZGVmaW5lIEFEVl9FRVBST01fVEVSTV9QT0wgICAgICAgICAgICAweDIwMDAgICAvKiBFRVBST00gQml0IDEzICovCisjZGVmaW5lIEFEVl9FRVBST01fQ0lTX0xEICAgICAgICAgICAgICAweDIwMDAgICAvKiBFRVBST00gQml0IDEzICovCisvKgorICogQVNDMzhDMTYwMCBCaXQgMTEKKyAqCisgKiBJZiBFRVBST00gQml0IDExIGlzIDAgZm9yIEZ1bmN0aW9uIDAsIHRoZW4gRnVuY3Rpb24gMCB3aWxsIHNwZWNpZnkKKyAqIElOVCBBIGluIHRoZSBQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZSBJbnQgUGluIGZpZWxkLiBJZiBpdCBpcyAxLCB0aGVuCisgKiBGdW5jdGlvbiAwIHdpbGwgc3BlY2lmeSBJTlQgQi4KKyAqCisgKiBJZiBFRVBST00gQml0IDExIGlzIDAgZm9yIEZ1bmN0aW9uIDEsIHRoZW4gRnVuY3Rpb24gMSB3aWxsIHNwZWNpZnkKKyAqIElOVCBCIGluIHRoZSBQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZSBJbnQgUGluIGZpZWxkLiBJZiBpdCBpcyAxLCB0aGVuCisgKiBGdW5jdGlvbiAxIHdpbGwgc3BlY2lmeSBJTlQgQS4KKyAqLworI2RlZmluZSBBRFZfRUVQUk9NX0lOVEFCICAgICAgICAgICAgICAgMHgwODAwICAgLyogRUVQUk9NIEJpdCAxMSAqLworCit0eXBlZGVmIHN0cnVjdCBhZHZlZXBfMzU1MF9jb25maWcKK3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV29yZCBPZmZzZXQsIERlc2NyaXB0aW9uICovCisKKyAgdXNob3J0IGNmZ19sc3c7ICAgICAgICAgICAgICAgLyogMDAgcG93ZXIgdXAgaW5pdGlhbGl6YXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxMyBzZXQgLSBUZXJtIFBvbGFyaXR5IENvbnRyb2wgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxNCBzZXQgLSBCSU9TIEVuYWJsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDE1IHNldCAtIEJpZyBFbmRpYW4gTW9kZSAqLworICB1c2hvcnQgY2ZnX21zdzsgICAgICAgICAgICAgICAvKiAwMSB1bnVzZWQgICAgICAqLworICB1c2hvcnQgZGlzY19lbmFibGU7ICAgICAgICAgICAvKiAwMiBkaXNjb25uZWN0IGVuYWJsZSAqLworICB1c2hvcnQgd2R0cl9hYmxlOyAgICAgICAgICAgICAvKiAwMyBXaWRlIERUUiBhYmxlICovCisgIHVzaG9ydCBzZHRyX2FibGU7ICAgICAgICAgICAgIC8qIDA0IFN5bmNocm9ub3VzIERUUiBhYmxlICovCisgIHVzaG9ydCBzdGFydF9tb3RvcjsgICAgICAgICAgIC8qIDA1IHNlbmQgc3RhcnQgdXAgbW90b3IgKi8KKyAgdXNob3J0IHRhZ3FuZ19hYmxlOyAgICAgICAgICAgLyogMDYgdGFnIHF1ZXVpbmcgYWJsZSAqLworICB1c2hvcnQgYmlvc19zY2FuOyAgICAgICAgICAgICAvKiAwNyBCSU9TIGRldmljZSBjb250cm9sICovCisgIHVzaG9ydCBzY2FtX3RvbGVyYW50OyAgICAgICAgIC8qIDA4IG5vIHNjYW0gKi8KKworICB1Y2hhciAgYWRhcHRlcl9zY3NpX2lkOyAgICAgICAvKiAwOSBIb3N0IEFkYXB0ZXIgSUQgKi8KKyAgdWNoYXIgIGJpb3NfYm9vdF9kZWxheTsgICAgICAgLyogICAgcG93ZXIgdXAgd2FpdCAqLworCisgIHVjaGFyICBzY3NpX3Jlc2V0X2RlbGF5OyAgICAgIC8qIDEwIHJlc2V0IGRlbGF5ICovCisgIHVjaGFyICBiaW9zX2lkX2x1bjsgICAgICAgICAgIC8qICAgIGZpcnN0IGJvb3QgZGV2aWNlIHNjc2kgaWQgJiBsdW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgaGlnaCBuaWJibGUgaXMgbHVuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGxvdyBuaWJibGUgaXMgc2NzaSBpZCAqLworCisgIHVjaGFyICB0ZXJtaW5hdGlvbjsgICAgICAgICAgIC8qIDExIDAgLSBhdXRvbWF0aWMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMSAtIGxvdyBvZmYgLyBoaWdoIG9mZiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAyIC0gbG93IG9mZiAvIGhpZ2ggb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMyAtIGxvdyBvbiAgLyBoaWdoIG9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIFRoZXJlIGlzIG5vIGxvdyBvbiAgLyBoaWdoIG9mZiAqLworCisgIHVjaGFyICByZXNlcnZlZDE7ICAgICAgICAgICAgIC8qICAgIHJlc2VydmVkIGJ5dGUgKG5vdCB1c2VkKSAqLworCisgIHVzaG9ydCBiaW9zX2N0cmw7ICAgICAgICAgICAgIC8qIDEyIEJJT1MgY29udHJvbCBiaXRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMCAgQklPUyBkb24ndCBhY3QgYXMgaW5pdGlhdG9yLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDEgIEJJT1MgPiAxIEdCIHN1cHBvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAyICBCSU9TID4gMiBEaXNrIFN1cHBvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAzICBCSU9TIGRvbid0IHN1cHBvcnQgcmVtb3ZhYmxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDQgIEJJT1Mgc3VwcG9ydCBib290YWJsZSBDRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDUgIEJJT1Mgc2NhbiBlbmFibGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgNiAgQklPUyBzdXBwb3J0IG11bHRpcGxlIExVTnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCA3ICBCSU9TIGRpc3BsYXkgb2YgbWVzc2FnZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDggIFNDQU0gZGlzYWJsZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCA5ICBSZXNldCBTQ1NJIGJ1cyBkdXJpbmcgaW5pdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDExIE5vIHZlcmJvc2UgaW5pdGlhbGl6YXRpb24uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTIgU0NTSSBwYXJpdHkgZW5hYmxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDEzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxNSAqLworICB1c2hvcnQgIHVsdHJhX2FibGU7ICAgICAgICAgICAvKiAxMyBVTFRSQSBzcGVlZCBhYmxlICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQyOyAgICAgICAgICAgIC8qIDE0IHJlc2VydmVkICovCisgIHVjaGFyICAgbWF4X2hvc3RfcW5nOyAgICAgICAgIC8qIDE1IG1heGltdW0gaG9zdCBxdWV1aW5nICovCisgIHVjaGFyICAgbWF4X2R2Y19xbmc7ICAgICAgICAgIC8qICAgIG1heGltdW0gcGVyIGRldmljZSBxdWV1aW5nICovCisgIHVzaG9ydCAgZHZjX2NudGw7ICAgICAgICAgICAgIC8qIDE2IGNvbnRyb2wgYml0IGZvciBkcml2ZXIgKi8KKyAgdXNob3J0ICBidWdfZml4OyAgICAgICAgICAgICAgLyogMTcgY29udHJvbCBiaXQgZm9yIGJ1ZyBmaXggKi8KKyAgdXNob3J0ICBzZXJpYWxfbnVtYmVyX3dvcmQxOyAgLyogMTggQm9hcmQgc2VyaWFsIG51bWJlciB3b3JkIDEgKi8KKyAgdXNob3J0ICBzZXJpYWxfbnVtYmVyX3dvcmQyOyAgLyogMTkgQm9hcmQgc2VyaWFsIG51bWJlciB3b3JkIDIgKi8KKyAgdXNob3J0ICBzZXJpYWxfbnVtYmVyX3dvcmQzOyAgLyogMjAgQm9hcmQgc2VyaWFsIG51bWJlciB3b3JkIDMgKi8KKyAgdXNob3J0ICBjaGVja19zdW07ICAgICAgICAgICAgLyogMjEgRUVQIGNoZWNrIHN1bSAqLworICB1Y2hhciAgIG9lbV9uYW1lWzE2XTsgICAgICAgICAvKiAyMiBPRU0gbmFtZSAqLworICB1c2hvcnQgIGR2Y19lcnJfY29kZTsgICAgICAgICAvKiAzMCBsYXN0IGRldmljZSBkcml2ZXIgZXJyb3IgY29kZSAqLworICB1c2hvcnQgIGFkdl9lcnJfY29kZTsgICAgICAgICAvKiAzMSBsYXN0IHVjIGFuZCBBZHYgTGliIGVycm9yIGNvZGUgKi8KKyAgdXNob3J0ICBhZHZfZXJyX2FkZHI7ICAgICAgICAgLyogMzIgbGFzdCB1YyBlcnJvciBhZGRyZXNzICovCisgIHVzaG9ydCAgc2F2ZWRfZHZjX2Vycl9jb2RlOyAgIC8qIDMzIHNhdmVkIGxhc3QgZGV2LiBkcml2ZXIgZXJyb3IgY29kZSAgICovCisgIHVzaG9ydCAgc2F2ZWRfYWR2X2Vycl9jb2RlOyAgIC8qIDM0IHNhdmVkIGxhc3QgdWMgYW5kIEFkdiBMaWIgZXJyb3IgY29kZSAqLworICB1c2hvcnQgIHNhdmVkX2Fkdl9lcnJfYWRkcjsgICAvKiAzNSBzYXZlZCBsYXN0IHVjIGVycm9yIGFkZHJlc3MgICAgICAgICAqLworICB1c2hvcnQgIG51bV9vZl9lcnI7ICAgICAgICAgICAvKiAzNiBudW1iZXIgb2YgZXJyb3IgKi8KK30gQURWRUVQXzM1NTBfQ09ORklHOworCit0eXBlZGVmIHN0cnVjdCBhZHZlZXBfMzhDMDgwMF9jb25maWcKK3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV29yZCBPZmZzZXQsIERlc2NyaXB0aW9uICovCisKKyAgdXNob3J0IGNmZ19sc3c7ICAgICAgICAgICAgICAgLyogMDAgcG93ZXIgdXAgaW5pdGlhbGl6YXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxMyBzZXQgLSBMb2FkIENJUyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDE0IHNldCAtIEJJT1MgRW5hYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTUgc2V0IC0gQmlnIEVuZGlhbiBNb2RlICovCisgIHVzaG9ydCBjZmdfbXN3OyAgICAgICAgICAgICAgIC8qIDAxIHVudXNlZCAgICAgICovCisgIHVzaG9ydCBkaXNjX2VuYWJsZTsgICAgICAgICAgIC8qIDAyIGRpc2Nvbm5lY3QgZW5hYmxlICovCisgIHVzaG9ydCB3ZHRyX2FibGU7ICAgICAgICAgICAgIC8qIDAzIFdpZGUgRFRSIGFibGUgKi8KKyAgdXNob3J0IHNkdHJfc3BlZWQxOyAgICAgICAgICAgLyogMDQgU0RUUiBTcGVlZCBUSUQgMC0zICovCisgIHVzaG9ydCBzdGFydF9tb3RvcjsgICAgICAgICAgIC8qIDA1IHNlbmQgc3RhcnQgdXAgbW90b3IgKi8KKyAgdXNob3J0IHRhZ3FuZ19hYmxlOyAgICAgICAgICAgLyogMDYgdGFnIHF1ZXVpbmcgYWJsZSAqLworICB1c2hvcnQgYmlvc19zY2FuOyAgICAgICAgICAgICAvKiAwNyBCSU9TIGRldmljZSBjb250cm9sICovCisgIHVzaG9ydCBzY2FtX3RvbGVyYW50OyAgICAgICAgIC8qIDA4IG5vIHNjYW0gKi8KKworICB1Y2hhciAgYWRhcHRlcl9zY3NpX2lkOyAgICAgICAvKiAwOSBIb3N0IEFkYXB0ZXIgSUQgKi8KKyAgdWNoYXIgIGJpb3NfYm9vdF9kZWxheTsgICAgICAgLyogICAgcG93ZXIgdXAgd2FpdCAqLworCisgIHVjaGFyICBzY3NpX3Jlc2V0X2RlbGF5OyAgICAgIC8qIDEwIHJlc2V0IGRlbGF5ICovCisgIHVjaGFyICBiaW9zX2lkX2x1bjsgICAgICAgICAgIC8qICAgIGZpcnN0IGJvb3QgZGV2aWNlIHNjc2kgaWQgJiBsdW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgaGlnaCBuaWJibGUgaXMgbHVuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGxvdyBuaWJibGUgaXMgc2NzaSBpZCAqLworCisgIHVjaGFyICB0ZXJtaW5hdGlvbl9zZTsgICAgICAgIC8qIDExIDAgLSBhdXRvbWF0aWMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMSAtIGxvdyBvZmYgLyBoaWdoIG9mZiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAyIC0gbG93IG9mZiAvIGhpZ2ggb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMyAtIGxvdyBvbiAgLyBoaWdoIG9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIFRoZXJlIGlzIG5vIGxvdyBvbiAgLyBoaWdoIG9mZiAqLworCisgIHVjaGFyICB0ZXJtaW5hdGlvbl9sdmQ7ICAgICAgIC8qIDExIDAgLSBhdXRvbWF0aWMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMSAtIGxvdyBvZmYgLyBoaWdoIG9mZiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAyIC0gbG93IG9mZiAvIGhpZ2ggb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMyAtIGxvdyBvbiAgLyBoaWdoIG9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIFRoZXJlIGlzIG5vIGxvdyBvbiAgLyBoaWdoIG9mZiAqLworCisgIHVzaG9ydCBiaW9zX2N0cmw7ICAgICAgICAgICAgIC8qIDEyIEJJT1MgY29udHJvbCBiaXRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMCAgQklPUyBkb24ndCBhY3QgYXMgaW5pdGlhdG9yLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDEgIEJJT1MgPiAxIEdCIHN1cHBvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAyICBCSU9TID4gMiBEaXNrIFN1cHBvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAzICBCSU9TIGRvbid0IHN1cHBvcnQgcmVtb3ZhYmxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDQgIEJJT1Mgc3VwcG9ydCBib290YWJsZSBDRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDUgIEJJT1Mgc2NhbiBlbmFibGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgNiAgQklPUyBzdXBwb3J0IG11bHRpcGxlIExVTnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCA3ICBCSU9TIGRpc3BsYXkgb2YgbWVzc2FnZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDggIFNDQU0gZGlzYWJsZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCA5ICBSZXNldCBTQ1NJIGJ1cyBkdXJpbmcgaW5pdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDExIE5vIHZlcmJvc2UgaW5pdGlhbGl6YXRpb24uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTIgU0NTSSBwYXJpdHkgZW5hYmxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDEzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxNSAqLworICB1c2hvcnQgIHNkdHJfc3BlZWQyOyAgICAgICAgICAvKiAxMyBTRFRSIHNwZWVkIFRJRCA0LTcgKi8KKyAgdXNob3J0ICBzZHRyX3NwZWVkMzsgICAgICAgICAgLyogMTQgU0RUUiBzcGVlZCBUSUQgOC0xMSAqLworICB1Y2hhciAgIG1heF9ob3N0X3FuZzsgICAgICAgICAvKiAxNSBtYXhpbXVtIGhvc3QgcXVldWVpbmcgKi8KKyAgdWNoYXIgICBtYXhfZHZjX3FuZzsgICAgICAgICAgLyogICAgbWF4aW11bSBwZXIgZGV2aWNlIHF1ZXVpbmcgKi8KKyAgdXNob3J0ICBkdmNfY250bDsgICAgICAgICAgICAgLyogMTYgY29udHJvbCBiaXQgZm9yIGRyaXZlciAqLworICB1c2hvcnQgIHNkdHJfc3BlZWQ0OyAgICAgICAgICAvKiAxNyBTRFRSIHNwZWVkIDQgVElEIDEyLTE1ICovCisgIHVzaG9ydCAgc2VyaWFsX251bWJlcl93b3JkMTsgIC8qIDE4IEJvYXJkIHNlcmlhbCBudW1iZXIgd29yZCAxICovCisgIHVzaG9ydCAgc2VyaWFsX251bWJlcl93b3JkMjsgIC8qIDE5IEJvYXJkIHNlcmlhbCBudW1iZXIgd29yZCAyICovCisgIHVzaG9ydCAgc2VyaWFsX251bWJlcl93b3JkMzsgIC8qIDIwIEJvYXJkIHNlcmlhbCBudW1iZXIgd29yZCAzICovCisgIHVzaG9ydCAgY2hlY2tfc3VtOyAgICAgICAgICAgIC8qIDIxIEVFUCBjaGVjayBzdW0gKi8KKyAgdWNoYXIgICBvZW1fbmFtZVsxNl07ICAgICAgICAgLyogMjIgT0VNIG5hbWUgKi8KKyAgdXNob3J0ICBkdmNfZXJyX2NvZGU7ICAgICAgICAgLyogMzAgbGFzdCBkZXZpY2UgZHJpdmVyIGVycm9yIGNvZGUgKi8KKyAgdXNob3J0ICBhZHZfZXJyX2NvZGU7ICAgICAgICAgLyogMzEgbGFzdCB1YyBhbmQgQWR2IExpYiBlcnJvciBjb2RlICovCisgIHVzaG9ydCAgYWR2X2Vycl9hZGRyOyAgICAgICAgIC8qIDMyIGxhc3QgdWMgZXJyb3IgYWRkcmVzcyAqLworICB1c2hvcnQgIHNhdmVkX2R2Y19lcnJfY29kZTsgICAvKiAzMyBzYXZlZCBsYXN0IGRldi4gZHJpdmVyIGVycm9yIGNvZGUgICAqLworICB1c2hvcnQgIHNhdmVkX2Fkdl9lcnJfY29kZTsgICAvKiAzNCBzYXZlZCBsYXN0IHVjIGFuZCBBZHYgTGliIGVycm9yIGNvZGUgKi8KKyAgdXNob3J0ICBzYXZlZF9hZHZfZXJyX2FkZHI7ICAgLyogMzUgc2F2ZWQgbGFzdCB1YyBlcnJvciBhZGRyZXNzICAgICAgICAgKi8KKyAgdXNob3J0ICByZXNlcnZlZDM2OyAgICAgICAgICAgLyogMzYgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDM3OyAgICAgICAgICAgLyogMzcgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDM4OyAgICAgICAgICAgLyogMzggcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDM5OyAgICAgICAgICAgLyogMzkgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQwOyAgICAgICAgICAgLyogNDAgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQxOyAgICAgICAgICAgLyogNDEgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQyOyAgICAgICAgICAgLyogNDIgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQzOyAgICAgICAgICAgLyogNDMgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQ0OyAgICAgICAgICAgLyogNDQgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQ1OyAgICAgICAgICAgLyogNDUgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQ2OyAgICAgICAgICAgLyogNDYgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQ3OyAgICAgICAgICAgLyogNDcgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQ4OyAgICAgICAgICAgLyogNDggcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQ5OyAgICAgICAgICAgLyogNDkgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDUwOyAgICAgICAgICAgLyogNTAgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDUxOyAgICAgICAgICAgLyogNTEgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDUyOyAgICAgICAgICAgLyogNTIgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDUzOyAgICAgICAgICAgLyogNTMgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDU0OyAgICAgICAgICAgLyogNTQgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDU1OyAgICAgICAgICAgLyogNTUgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICBjaXNwdHJfbHN3OyAgICAgICAgICAgLyogNTYgQ0lTIFBUUiBMU1cgKi8KKyAgdXNob3J0ICBjaXNwcnRfbXN3OyAgICAgICAgICAgLyogNTcgQ0lTIFBUUiBNU1cgKi8KKyAgdXNob3J0ICBzdWJzeXN2aWQ7ICAgICAgICAgICAgLyogNTggU3ViU3lzdGVtIFZlbmRvciBJRCAqLworICB1c2hvcnQgIHN1YnN5c2lkOyAgICAgICAgICAgICAvKiA1OSBTdWJTeXN0ZW0gSUQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDYwOyAgICAgICAgICAgLyogNjAgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDYxOyAgICAgICAgICAgLyogNjEgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDYyOyAgICAgICAgICAgLyogNjIgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDYzOyAgICAgICAgICAgLyogNjMgcmVzZXJ2ZWQgKi8KK30gQURWRUVQXzM4QzA4MDBfQ09ORklHOworCit0eXBlZGVmIHN0cnVjdCBhZHZlZXBfMzhDMTYwMF9jb25maWcKK3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV29yZCBPZmZzZXQsIERlc2NyaXB0aW9uICovCisKKyAgdXNob3J0IGNmZ19sc3c7ICAgICAgICAgICAgICAgLyogMDAgcG93ZXIgdXAgaW5pdGlhbGl6YXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxMSBzZXQgLSBGdW5jLiAwIElOVEIsIEZ1bmMuIDEgSU5UQSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICBjbGVhciAtIEZ1bmMuIDAgSU5UQSwgRnVuYy4gMSBJTlRCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTMgc2V0IC0gTG9hZCBDSVMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxNCBzZXQgLSBCSU9TIEVuYWJsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDE1IHNldCAtIEJpZyBFbmRpYW4gTW9kZSAqLworICB1c2hvcnQgY2ZnX21zdzsgICAgICAgICAgICAgICAvKiAwMSB1bnVzZWQgKi8KKyAgdXNob3J0IGRpc2NfZW5hYmxlOyAgICAgICAgICAgLyogMDIgZGlzY29ubmVjdCBlbmFibGUgKi8KKyAgdXNob3J0IHdkdHJfYWJsZTsgICAgICAgICAgICAgLyogMDMgV2lkZSBEVFIgYWJsZSAqLworICB1c2hvcnQgc2R0cl9zcGVlZDE7ICAgICAgICAgICAvKiAwNCBTRFRSIFNwZWVkIFRJRCAwLTMgKi8KKyAgdXNob3J0IHN0YXJ0X21vdG9yOyAgICAgICAgICAgLyogMDUgc2VuZCBzdGFydCB1cCBtb3RvciAqLworICB1c2hvcnQgdGFncW5nX2FibGU7ICAgICAgICAgICAvKiAwNiB0YWcgcXVldWluZyBhYmxlICovCisgIHVzaG9ydCBiaW9zX3NjYW47ICAgICAgICAgICAgIC8qIDA3IEJJT1MgZGV2aWNlIGNvbnRyb2wgKi8KKyAgdXNob3J0IHNjYW1fdG9sZXJhbnQ7ICAgICAgICAgLyogMDggbm8gc2NhbSAqLworCisgIHVjaGFyICBhZGFwdGVyX3Njc2lfaWQ7ICAgICAgIC8qIDA5IEhvc3QgQWRhcHRlciBJRCAqLworICB1Y2hhciAgYmlvc19ib290X2RlbGF5OyAgICAgICAvKiAgICBwb3dlciB1cCB3YWl0ICovCisKKyAgdWNoYXIgIHNjc2lfcmVzZXRfZGVsYXk7ICAgICAgLyogMTAgcmVzZXQgZGVsYXkgKi8KKyAgdWNoYXIgIGJpb3NfaWRfbHVuOyAgICAgICAgICAgLyogICAgZmlyc3QgYm9vdCBkZXZpY2Ugc2NzaSBpZCAmIGx1biAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBoaWdoIG5pYmJsZSBpcyBsdW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgbG93IG5pYmJsZSBpcyBzY3NpIGlkICovCisKKyAgdWNoYXIgIHRlcm1pbmF0aW9uX3NlOyAgICAgICAgLyogMTEgMCAtIGF1dG9tYXRpYyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAxIC0gbG93IG9mZiAvIGhpZ2ggb2ZmICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIDIgLSBsb3cgb2ZmIC8gaGlnaCBvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAzIC0gbG93IG9uICAvIGhpZ2ggb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgVGhlcmUgaXMgbm8gbG93IG9uICAvIGhpZ2ggb2ZmICovCisKKyAgdWNoYXIgIHRlcm1pbmF0aW9uX2x2ZDsgICAgICAgLyogMTEgMCAtIGF1dG9tYXRpYyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAxIC0gbG93IG9mZiAvIGhpZ2ggb2ZmICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIDIgLSBsb3cgb2ZmIC8gaGlnaCBvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAzIC0gbG93IG9uICAvIGhpZ2ggb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgVGhlcmUgaXMgbm8gbG93IG9uICAvIGhpZ2ggb2ZmICovCisKKyAgdXNob3J0IGJpb3NfY3RybDsgICAgICAgICAgICAgLyogMTIgQklPUyBjb250cm9sIGJpdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAwICBCSU9TIGRvbid0IGFjdCBhcyBpbml0aWF0b3IuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMSAgQklPUyA+IDEgR0Igc3VwcG9ydCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDIgIEJJT1MgPiAyIERpc2sgU3VwcG9ydCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDMgIEJJT1MgZG9uJ3Qgc3VwcG9ydCByZW1vdmFibGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgNCAgQklPUyBzdXBwb3J0IGJvb3RhYmxlIENEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgNSAgQklPUyBzY2FuIGVuYWJsZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCA2ICBCSU9TIHN1cHBvcnQgbXVsdGlwbGUgTFVOcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDcgIEJJT1MgZGlzcGxheSBvZiBtZXNzYWdlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgOCAgU0NBTSBkaXNhYmxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDkgIFJlc2V0IFNDU0kgYnVzIGR1cmluZyBpbml0LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDEwIEJhc2ljIEludGVncml0eSBDaGVja2luZyBkaXNhYmxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDExIE5vIHZlcmJvc2UgaW5pdGlhbGl6YXRpb24uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTIgU0NTSSBwYXJpdHkgZW5hYmxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDEzIEFJUFAgKEFzeW4uIEluZm8uIFBoLiBQcm90LikgZGlzLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDE0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTUgKi8KKyAgdXNob3J0ICBzZHRyX3NwZWVkMjsgICAgICAgICAgLyogMTMgU0RUUiBzcGVlZCBUSUQgNC03ICovCisgIHVzaG9ydCAgc2R0cl9zcGVlZDM7ICAgICAgICAgIC8qIDE0IFNEVFIgc3BlZWQgVElEIDgtMTEgKi8KKyAgdWNoYXIgICBtYXhfaG9zdF9xbmc7ICAgICAgICAgLyogMTUgbWF4aW11bSBob3N0IHF1ZXVlaW5nICovCisgIHVjaGFyICAgbWF4X2R2Y19xbmc7ICAgICAgICAgIC8qICAgIG1heGltdW0gcGVyIGRldmljZSBxdWV1aW5nICovCisgIHVzaG9ydCAgZHZjX2NudGw7ICAgICAgICAgICAgIC8qIDE2IGNvbnRyb2wgYml0IGZvciBkcml2ZXIgKi8KKyAgdXNob3J0ICBzZHRyX3NwZWVkNDsgICAgICAgICAgLyogMTcgU0RUUiBzcGVlZCA0IFRJRCAxMi0xNSAqLworICB1c2hvcnQgIHNlcmlhbF9udW1iZXJfd29yZDE7ICAvKiAxOCBCb2FyZCBzZXJpYWwgbnVtYmVyIHdvcmQgMSAqLworICB1c2hvcnQgIHNlcmlhbF9udW1iZXJfd29yZDI7ICAvKiAxOSBCb2FyZCBzZXJpYWwgbnVtYmVyIHdvcmQgMiAqLworICB1c2hvcnQgIHNlcmlhbF9udW1iZXJfd29yZDM7ICAvKiAyMCBCb2FyZCBzZXJpYWwgbnVtYmVyIHdvcmQgMyAqLworICB1c2hvcnQgIGNoZWNrX3N1bTsgICAgICAgICAgICAvKiAyMSBFRVAgY2hlY2sgc3VtICovCisgIHVjaGFyICAgb2VtX25hbWVbMTZdOyAgICAgICAgIC8qIDIyIE9FTSBuYW1lICovCisgIHVzaG9ydCAgZHZjX2Vycl9jb2RlOyAgICAgICAgIC8qIDMwIGxhc3QgZGV2aWNlIGRyaXZlciBlcnJvciBjb2RlICovCisgIHVzaG9ydCAgYWR2X2Vycl9jb2RlOyAgICAgICAgIC8qIDMxIGxhc3QgdWMgYW5kIEFkdiBMaWIgZXJyb3IgY29kZSAqLworICB1c2hvcnQgIGFkdl9lcnJfYWRkcjsgICAgICAgICAvKiAzMiBsYXN0IHVjIGVycm9yIGFkZHJlc3MgKi8KKyAgdXNob3J0ICBzYXZlZF9kdmNfZXJyX2NvZGU7ICAgLyogMzMgc2F2ZWQgbGFzdCBkZXYuIGRyaXZlciBlcnJvciBjb2RlICAgKi8KKyAgdXNob3J0ICBzYXZlZF9hZHZfZXJyX2NvZGU7ICAgLyogMzQgc2F2ZWQgbGFzdCB1YyBhbmQgQWR2IExpYiBlcnJvciBjb2RlICovCisgIHVzaG9ydCAgc2F2ZWRfYWR2X2Vycl9hZGRyOyAgIC8qIDM1IHNhdmVkIGxhc3QgdWMgZXJyb3IgYWRkcmVzcyAgICAgICAgICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQzNjsgICAgICAgICAgIC8qIDM2IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQzNzsgICAgICAgICAgIC8qIDM3IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQzODsgICAgICAgICAgIC8qIDM4IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQzOTsgICAgICAgICAgIC8qIDM5IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0MDsgICAgICAgICAgIC8qIDQwIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0MTsgICAgICAgICAgIC8qIDQxIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0MjsgICAgICAgICAgIC8qIDQyIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0MzsgICAgICAgICAgIC8qIDQzIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0NDsgICAgICAgICAgIC8qIDQ0IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0NTsgICAgICAgICAgIC8qIDQ1IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0NjsgICAgICAgICAgIC8qIDQ2IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0NzsgICAgICAgICAgIC8qIDQ3IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0ODsgICAgICAgICAgIC8qIDQ4IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0OTsgICAgICAgICAgIC8qIDQ5IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ1MDsgICAgICAgICAgIC8qIDUwIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ1MTsgICAgICAgICAgIC8qIDUxIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ1MjsgICAgICAgICAgIC8qIDUyIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ1MzsgICAgICAgICAgIC8qIDUzIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ1NDsgICAgICAgICAgIC8qIDU0IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ1NTsgICAgICAgICAgIC8qIDU1IHJlc2VydmVkICovCisgIHVzaG9ydCAgY2lzcHRyX2xzdzsgICAgICAgICAgIC8qIDU2IENJUyBQVFIgTFNXICovCisgIHVzaG9ydCAgY2lzcHJ0X21zdzsgICAgICAgICAgIC8qIDU3IENJUyBQVFIgTVNXICovCisgIHVzaG9ydCAgc3Vic3lzdmlkOyAgICAgICAgICAgIC8qIDU4IFN1YlN5c3RlbSBWZW5kb3IgSUQgKi8KKyAgdXNob3J0ICBzdWJzeXNpZDsgICAgICAgICAgICAgLyogNTkgU3ViU3lzdGVtIElEICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ2MDsgICAgICAgICAgIC8qIDYwIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ2MTsgICAgICAgICAgIC8qIDYxIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ2MjsgICAgICAgICAgIC8qIDYyIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ2MzsgICAgICAgICAgIC8qIDYzIHJlc2VydmVkICovCit9IEFEVkVFUF8zOEMxNjAwX0NPTkZJRzsKKworLyoKKyAqIEVFUFJPTSBDb21tYW5kcworICovCisjZGVmaW5lIEFTQ19FRVBfQ01EX0RPTkUgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIEFTQ19FRVBfQ01EX0RPTkVfRVJSICAgICAgICAgMHgwMDAxCisKKy8qIGNmZ193b3JkICovCisjZGVmaW5lIEVFUF9DRkdfV09SRF9CSUdfRU5ESUFOICAgICAgMHg4MDAwCisKKy8qIGJpb3NfY3RybCAqLworI2RlZmluZSBCSU9TX0NUUkxfQklPUyAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBCSU9TX0NUUkxfRVhURU5ERURfWExBVCAgICAgIDB4MDAwMgorI2RlZmluZSBCSU9TX0NUUkxfR1RfMl9ESVNLICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBCSU9TX0NUUkxfQklPU19SRU1PVkFCTEUgICAgIDB4MDAwOAorI2RlZmluZSBCSU9TX0NUUkxfQk9PVEFCTEVfQ0QgICAgICAgIDB4MDAxMAorI2RlZmluZSBCSU9TX0NUUkxfTVVMVElQTEVfTFVOICAgICAgIDB4MDA0MAorI2RlZmluZSBCSU9TX0NUUkxfRElTUExBWV9NU0cgICAgICAgIDB4MDA4MAorI2RlZmluZSBCSU9TX0NUUkxfTk9fU0NBTSAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBCSU9TX0NUUkxfUkVTRVRfU0NTSV9CVVMgICAgIDB4MDIwMAorI2RlZmluZSBCSU9TX0NUUkxfSU5JVF9WRVJCT1NFICAgICAgIDB4MDgwMAorI2RlZmluZSBCSU9TX0NUUkxfU0NTSV9QQVJJVFkgICAgICAgIDB4MTAwMAorI2RlZmluZSBCSU9TX0NUUkxfQUlQUF9ESVMgICAgICAgICAgIDB4MjAwMAorCisjZGVmaW5lIEFEVl8zNTUwX01FTVNJWkUgICAweDIwMDAgICAgICAgLyogOCBLQiBJbnRlcm5hbCBNZW1vcnkgKi8KKyNkZWZpbmUgQURWXzM1NTBfSU9MRU4gICAgIDB4NDAgICAgICAgICAvKiBJL08gUG9ydCBSYW5nZSBpbiBieXRlcyAqLworCisjZGVmaW5lIEFEVl8zOEMwODAwX01FTVNJWkUgIDB4NDAwMCAgICAgLyogMTYgS0IgSW50ZXJuYWwgTWVtb3J5ICovCisjZGVmaW5lIEFEVl8zOEMwODAwX0lPTEVOICAgIDB4MTAwICAgICAgLyogSS9PIFBvcnQgUmFuZ2UgaW4gYnl0ZXMgKi8KKworLyoKKyAqIFhYWCAtIFNpbmNlIEFTQzM4QzE2MDAgUmV2LjMgaGFzIGEgbG9jYWwgUkFNIGZhaWx1cmUgaXNzdWUsIHRoZXJlIGlzCisgKiBhIHNwZWNpYWwgMTZLIEFkdiBMaWJyYXJ5IGFuZCBNaWNyb2NvZGUgdmVyc2lvbi4gQWZ0ZXIgdGhlIGlzc3VlIGlzCisgKiByZXNvbHZlZCwgc2hvdWxkIHJlc3RvcmUgMzJLIHN1cHBvcnQuCisgKgorICogI2RlZmluZSBBRFZfMzhDMTYwMF9NRU1TSVpFICAweDgwMDBMICAgKiAzMiBLQiBJbnRlcm5hbCBNZW1vcnkgKgorICovCisjZGVmaW5lIEFEVl8zOEMxNjAwX01FTVNJWkUgIDB4NDAwMCAgIC8qIDE2IEtCIEludGVybmFsIE1lbW9yeSAqLworI2RlZmluZSBBRFZfMzhDMTYwMF9JT0xFTiAgICAweDEwMCAgICAgLyogSS9PIFBvcnQgUmFuZ2UgMjU2IGJ5dGVzICovCisjZGVmaW5lIEFEVl8zOEMxNjAwX01FTUxFTiAgIDB4MTAwMCAgICAvKiBNZW1vcnkgUmFuZ2UgNEtCIGJ5dGVzICovCisKKy8qCisgKiBCeXRlIEkvTyByZWdpc3RlciBhZGRyZXNzIGZyb20gYmFzZSBvZiAnaW9wX2Jhc2UnLgorICovCisjZGVmaW5lIElPUEJfSU5UUl9TVEFUVVNfUkVHICAgIDB4MDAKKyNkZWZpbmUgSU9QQl9DSElQX0lEXzEgICAgICAgICAgMHgwMQorI2RlZmluZSBJT1BCX0lOVFJfRU5BQkxFUyAgICAgICAweDAyCisjZGVmaW5lIElPUEJfQ0hJUF9UWVBFX1JFViAgICAgIDB4MDMKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl80ICAgICAgICAgMHgwNAorI2RlZmluZSBJT1BCX1JFU19BRERSXzUgICAgICAgICAweDA1CisjZGVmaW5lIElPUEJfUkFNX0RBVEEgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl83ICAgICAgICAgMHgwNworI2RlZmluZSBJT1BCX0ZMQUdfUkVHICAgICAgICAgICAweDA4CisjZGVmaW5lIElPUEJfUkVTX0FERFJfOSAgICAgICAgIDB4MDkKKyNkZWZpbmUgSU9QQl9SSVNDX0NTUiAgICAgICAgICAgMHgwQQorI2RlZmluZSBJT1BCX1JFU19BRERSX0IgICAgICAgICAweDBCCisjZGVmaW5lIElPUEJfUkVTX0FERFJfQyAgICAgICAgIDB4MEMKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl9EICAgICAgICAgMHgwRAorI2RlZmluZSBJT1BCX1NPRlRfT1ZFUl9XUiAgICAgICAweDBFCisjZGVmaW5lIElPUEJfUkVTX0FERFJfRiAgICAgICAgIDB4MEYKKyNkZWZpbmUgSU9QQl9NRU1fQ0ZHICAgICAgICAgICAgMHgxMAorI2RlZmluZSBJT1BCX1JFU19BRERSXzExICAgICAgICAweDExCisjZGVmaW5lIElPUEJfR1BJT19EQVRBICAgICAgICAgIDB4MTIKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl8xMyAgICAgICAgMHgxMworI2RlZmluZSBJT1BCX0ZMQVNIX1BBR0UgICAgICAgICAweDE0CisjZGVmaW5lIElPUEJfUkVTX0FERFJfMTUgICAgICAgIDB4MTUKKyNkZWZpbmUgSU9QQl9HUElPX0NOVEwgICAgICAgICAgMHgxNgorI2RlZmluZSBJT1BCX1JFU19BRERSXzE3ICAgICAgICAweDE3CisjZGVmaW5lIElPUEJfRkxBU0hfREFUQSAgICAgICAgIDB4MTgKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl8xOSAgICAgICAgMHgxOQorI2RlZmluZSBJT1BCX1JFU19BRERSXzFBICAgICAgICAweDFBCisjZGVmaW5lIElPUEJfUkVTX0FERFJfMUIgICAgICAgIDB4MUIKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl8xQyAgICAgICAgMHgxQworI2RlZmluZSBJT1BCX1JFU19BRERSXzFEICAgICAgICAweDFECisjZGVmaW5lIElPUEJfUkVTX0FERFJfMUUgICAgICAgIDB4MUUKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl8xRiAgICAgICAgMHgxRgorI2RlZmluZSBJT1BCX0RNQV9DRkcwICAgICAgICAgICAweDIwCisjZGVmaW5lIElPUEJfRE1BX0NGRzEgICAgICAgICAgIDB4MjEKKyNkZWZpbmUgSU9QQl9USUNLTEUgICAgICAgICAgICAgMHgyMgorI2RlZmluZSBJT1BCX0RNQV9SRUdfV1IgICAgICAgICAweDIzCisjZGVmaW5lIElPUEJfU0RNQV9TVEFUVVMgICAgICAgIDB4MjQKKyNkZWZpbmUgSU9QQl9TQ1NJX0JZVEVfQ05UICAgICAgMHgyNQorI2RlZmluZSBJT1BCX0hPU1RfQllURV9DTlQgICAgICAweDI2CisjZGVmaW5lIElPUEJfQllURV9MRUZUX1RPX1hGRVIgIDB4MjcKKyNkZWZpbmUgSU9QQl9CWVRFX1RPX1hGRVJfMCAgICAgMHgyOAorI2RlZmluZSBJT1BCX0JZVEVfVE9fWEZFUl8xICAgICAweDI5CisjZGVmaW5lIElPUEJfQllURV9UT19YRkVSXzIgICAgIDB4MkEKKyNkZWZpbmUgSU9QQl9CWVRFX1RPX1hGRVJfMyAgICAgMHgyQgorI2RlZmluZSBJT1BCX0FDQ19HUlAgICAgICAgICAgICAweDJDCisjZGVmaW5lIElPUEJfUkVTX0FERFJfMkQgICAgICAgIDB4MkQKKyNkZWZpbmUgSU9QQl9ERVZfSUQgICAgICAgICAgICAgMHgyRQorI2RlZmluZSBJT1BCX1JFU19BRERSXzJGICAgICAgICAweDJGCisjZGVmaW5lIElPUEJfU0NTSV9EQVRBICAgICAgICAgIDB4MzAKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl8zMSAgICAgICAgMHgzMQorI2RlZmluZSBJT1BCX1JFU19BRERSXzMyICAgICAgICAweDMyCisjZGVmaW5lIElPUEJfU0NTSV9EQVRBX0hTSEsgICAgIDB4MzMKKyNkZWZpbmUgSU9QQl9TQ1NJX0NUUkwgICAgICAgICAgMHgzNAorI2RlZmluZSBJT1BCX1JFU19BRERSXzM1ICAgICAgICAweDM1CisjZGVmaW5lIElPUEJfUkVTX0FERFJfMzYgICAgICAgIDB4MzYKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl8zNyAgICAgICAgMHgzNworI2RlZmluZSBJT1BCX1JBTV9CSVNUICAgICAgICAgICAweDM4CisjZGVmaW5lIElPUEJfUExMX1RFU1QgICAgICAgICAgIDB4MzkKKyNkZWZpbmUgSU9QQl9QQ0lfSU5UX0NGRyAgICAgICAgMHgzQQorI2RlZmluZSBJT1BCX1JFU19BRERSXzNCICAgICAgICAweDNCCisjZGVmaW5lIElPUEJfUkZJRk9fQ05UICAgICAgICAgIDB4M0MKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl8zRCAgICAgICAgMHgzRAorI2RlZmluZSBJT1BCX1JFU19BRERSXzNFICAgICAgICAweDNFCisjZGVmaW5lIElPUEJfUkVTX0FERFJfM0YgICAgICAgIDB4M0YKKworLyoKKyAqIFdvcmQgSS9PIHJlZ2lzdGVyIGFkZHJlc3MgZnJvbSBiYXNlIG9mICdpb3BfYmFzZScuCisgKi8KKyNkZWZpbmUgSU9QV19DSElQX0lEXzAgICAgICAgICAgMHgwMCAgLyogQ0lEMCAgKi8KKyNkZWZpbmUgSU9QV19DVFJMX1JFRyAgICAgICAgICAgMHgwMiAgLyogQ0MgICAgKi8KKyNkZWZpbmUgSU9QV19SQU1fQUREUiAgICAgICAgICAgMHgwNCAgLyogTEEgICAgKi8KKyNkZWZpbmUgSU9QV19SQU1fREFUQSAgICAgICAgICAgMHgwNiAgLyogTEQgICAgKi8KKyNkZWZpbmUgSU9QV19SRVNfQUREUl8wOCAgICAgICAgMHgwOAorI2RlZmluZSBJT1BXX1JJU0NfQ1NSICAgICAgICAgICAweDBBICAvKiBDU1IgICAqLworI2RlZmluZSBJT1BXX1NDU0lfQ0ZHMCAgICAgICAgICAweDBDICAvKiBDRkcwICAqLworI2RlZmluZSBJT1BXX1NDU0lfQ0ZHMSAgICAgICAgICAweDBFICAvKiBDRkcxICAqLworI2RlZmluZSBJT1BXX1JFU19BRERSXzEwICAgICAgICAweDEwCisjZGVmaW5lIElPUFdfU0VMX01BU0sgICAgICAgICAgIDB4MTIgIC8qIFNNICAgICovCisjZGVmaW5lIElPUFdfUkVTX0FERFJfMTQgICAgICAgIDB4MTQKKyNkZWZpbmUgSU9QV19GTEFTSF9BRERSICAgICAgICAgMHgxNiAgLyogRkEgICAgKi8KKyNkZWZpbmUgSU9QV19SRVNfQUREUl8xOCAgICAgICAgMHgxOAorI2RlZmluZSBJT1BXX0VFX0NNRCAgICAgICAgICAgICAweDFBICAvKiBFQyAgICAqLworI2RlZmluZSBJT1BXX0VFX0RBVEEgICAgICAgICAgICAweDFDICAvKiBFRCAgICAqLworI2RlZmluZSBJT1BXX1NGSUZPX0NOVCAgICAgICAgICAweDFFICAvKiBTRkMgICAqLworI2RlZmluZSBJT1BXX1JFU19BRERSXzIwICAgICAgICAweDIwCisjZGVmaW5lIElPUFdfUV9CQVNFICAgICAgICAgICAgIDB4MjIgIC8qIFFCICAgICovCisjZGVmaW5lIElPUFdfUVAgICAgICAgICAgICAgICAgIDB4MjQgIC8qIFFQICAgICovCisjZGVmaW5lIElPUFdfSVggICAgICAgICAgICAgICAgIDB4MjYgIC8qIElYICAgICovCisjZGVmaW5lIElPUFdfU1AgICAgICAgICAgICAgICAgIDB4MjggIC8qIFNQICAgICovCisjZGVmaW5lIElPUFdfUEMgICAgICAgICAgICAgICAgIDB4MkEgIC8qIFBDICAgICovCisjZGVmaW5lIElPUFdfUkVTX0FERFJfMkMgICAgICAgIDB4MkMKKyNkZWZpbmUgSU9QV19SRVNfQUREUl8yRSAgICAgICAgMHgyRQorI2RlZmluZSBJT1BXX1NDU0lfREFUQSAgICAgICAgICAweDMwICAvKiBTRCAgICAqLworI2RlZmluZSBJT1BXX1NDU0lfREFUQV9IU0hLICAgICAweDMyICAvKiBTREggICAqLworI2RlZmluZSBJT1BXX1NDU0lfQ1RSTCAgICAgICAgICAweDM0ICAvKiBTQyAgICAqLworI2RlZmluZSBJT1BXX0hTSEtfQ0ZHICAgICAgICAgICAweDM2ICAvKiBIQ0ZHICAqLworI2RlZmluZSBJT1BXX1NYRlJfU1RBVFVTICAgICAgICAweDM2ICAvKiBTWFMgICAqLworI2RlZmluZSBJT1BXX1NYRlJfQ05UTCAgICAgICAgICAweDM4ICAvKiBTWEwgICAqLworI2RlZmluZSBJT1BXX1NYRlJfQ05USCAgICAgICAgICAweDNBICAvKiBTWEggICAqLworI2RlZmluZSBJT1BXX1JFU19BRERSXzNDICAgICAgICAweDNDCisjZGVmaW5lIElPUFdfUkZJRk9fREFUQSAgICAgICAgIDB4M0UgIC8qIFJGRCAgICovCisKKy8qCisgKiBEb3VibGV3b3JkIEkvTyByZWdpc3RlciBhZGRyZXNzIGZyb20gYmFzZSBvZiAnaW9wX2Jhc2UnLgorICovCisjZGVmaW5lIElPUERXX1JFU19BRERSXzAgICAgICAgICAweDAwCisjZGVmaW5lIElPUERXX1JBTV9EQVRBICAgICAgICAgICAweDA0CisjZGVmaW5lIElPUERXX1JFU19BRERSXzggICAgICAgICAweDA4CisjZGVmaW5lIElPUERXX1JFU19BRERSX0MgICAgICAgICAweDBDCisjZGVmaW5lIElPUERXX1JFU19BRERSXzEwICAgICAgICAweDEwCisjZGVmaW5lIElPUERXX0NPTU1BICAgICAgICAgICAgICAweDE0CisjZGVmaW5lIElPUERXX0NPTU1CICAgICAgICAgICAgICAweDE4CisjZGVmaW5lIElPUERXX1JFU19BRERSXzFDICAgICAgICAweDFDCisjZGVmaW5lIElPUERXX1NETUFfQUREUjAgICAgICAgICAweDIwCisjZGVmaW5lIElPUERXX1NETUFfQUREUjEgICAgICAgICAweDI0CisjZGVmaW5lIElPUERXX1NETUFfQ09VTlQgICAgICAgICAweDI4CisjZGVmaW5lIElPUERXX1NETUFfRVJST1IgICAgICAgICAweDJDCisjZGVmaW5lIElPUERXX1JETUFfQUREUjAgICAgICAgICAweDMwCisjZGVmaW5lIElPUERXX1JETUFfQUREUjEgICAgICAgICAweDM0CisjZGVmaW5lIElPUERXX1JETUFfQ09VTlQgICAgICAgICAweDM4CisjZGVmaW5lIElPUERXX1JETUFfRVJST1IgICAgICAgICAweDNDCisKKyNkZWZpbmUgQURWX0NISVBfSURfQllURSAgICAgICAgIDB4MjUKKyNkZWZpbmUgQURWX0NISVBfSURfV09SRCAgICAgICAgIDB4MDRDMQorCisjZGVmaW5lIEFEVl9TQ19TQ1NJX0JVU19SRVNFVCAgICAweDIwMDAKKworI2RlZmluZSBBRFZfSU5UUl9FTkFCTEVfSE9TVF9JTlRSICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQURWX0lOVFJfRU5BQkxFX1NFTF9JTlRSICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEFEVl9JTlRSX0VOQUJMRV9EUFJfSU5UUiAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBBRFZfSU5UUl9FTkFCTEVfUlRBX0lOVFIgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQURWX0lOVFJfRU5BQkxFX1JNQV9JTlRSICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIEFEVl9JTlRSX0VOQUJMRV9SU1RfSU5UUiAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBBRFZfSU5UUl9FTkFCTEVfRFBFX0lOVFIgICAgICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQURWX0lOVFJfRU5BQkxFX0dMT0JBTF9JTlRSICAgICAgICAgICAgICAgICAweDgwCisKKyNkZWZpbmUgQURWX0lOVFJfU1RBVFVTX0lOVFJBICAgICAgICAgICAgMHgwMQorI2RlZmluZSBBRFZfSU5UUl9TVEFUVVNfSU5UUkIgICAgICAgICAgICAweDAyCisjZGVmaW5lIEFEVl9JTlRSX1NUQVRVU19JTlRSQyAgICAgICAgICAgIDB4MDQKKworI2RlZmluZSBBRFZfUklTQ19DU1JfU1RPUCAgICAgICAgICAgKDB4MDAwMCkKKyNkZWZpbmUgQURWX1JJU0NfVEVTVF9DT05EICAgICAgICAgICgweDIwMDApCisjZGVmaW5lIEFEVl9SSVNDX0NTUl9SVU4gICAgICAgICAgICAoMHg0MDAwKQorI2RlZmluZSBBRFZfUklTQ19DU1JfU0lOR0xFX1NURVAgICAgKDB4ODAwMCkKKworI2RlZmluZSBBRFZfQ1RSTF9SRUdfSE9TVF9JTlRSICAgICAgMHgwMTAwCisjZGVmaW5lIEFEVl9DVFJMX1JFR19TRUxfSU5UUiAgICAgICAweDAyMDAKKyNkZWZpbmUgQURWX0NUUkxfUkVHX0RQUl9JTlRSICAgICAgIDB4MDQwMAorI2RlZmluZSBBRFZfQ1RSTF9SRUdfUlRBX0lOVFIgICAgICAgMHgwODAwCisjZGVmaW5lIEFEVl9DVFJMX1JFR19STUFfSU5UUiAgICAgICAweDEwMDAKKyNkZWZpbmUgQURWX0NUUkxfUkVHX1JFU19CSVQxNCAgICAgIDB4MjAwMAorI2RlZmluZSBBRFZfQ1RSTF9SRUdfRFBFX0lOVFIgICAgICAgMHg0MDAwCisjZGVmaW5lIEFEVl9DVFJMX1JFR19QT1dFUl9ET05FICAgICAweDgwMDAKKyNkZWZpbmUgQURWX0NUUkxfUkVHX0FOWV9JTlRSICAgICAgIDB4RkYwMAorCisjZGVmaW5lIEFEVl9DVFJMX1JFR19DTURfUkVTRVQgICAgICAgICAgICAgMHgwMEM2CisjZGVmaW5lIEFEVl9DVFJMX1JFR19DTURfV1JfSU9fUkVHICAgICAgICAgMHgwMEM1CisjZGVmaW5lIEFEVl9DVFJMX1JFR19DTURfUkRfSU9fUkVHICAgICAgICAgMHgwMEM0CisjZGVmaW5lIEFEVl9DVFJMX1JFR19DTURfV1JfUENJX0NGR19TUEFDRSAgMHgwMEMzCisjZGVmaW5lIEFEVl9DVFJMX1JFR19DTURfUkRfUENJX0NGR19TUEFDRSAgMHgwMEMyCisKKyNkZWZpbmUgQURWX1RJQ0tMRV9OT1AgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBBRFZfVElDS0xFX0EgICAgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEFEVl9USUNLTEVfQiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQURWX1RJQ0tMRV9DICAgICAgICAgICAgICAgICAgICAgICAgMHgwMworCisjZGVmaW5lIEFEVl9TQ1NJX0NUUkxfUlNUT1VUICAgICAgICAweDIwMDAKKworI2RlZmluZSBBZHZJc0ludFBlbmRpbmcocG9ydCkgXAorICAgIChBZHZSZWFkV29yZFJlZ2lzdGVyKHBvcnQsIElPUFdfQ1RSTF9SRUcpICYgQURWX0NUUkxfUkVHX0hPU1RfSU5UUikKKworLyoKKyAqIFNDU0lfQ0ZHMCBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBUSU1FUl9NT0RFQUIgICAgMHhDMDAwICAvKiBXYXRjaGRvZywgU2Vjb25kLCBhbmQgU2VsZWN0LiBUaW1lciBDdHJsLiAqLworI2RlZmluZSBQQVJJVFlfRU4gICAgICAgMHgyMDAwICAvKiBFbmFibGUgU0NTSSBQYXJpdHkgRXJyb3IgZGV0ZWN0aW9uICovCisjZGVmaW5lIEVWRU5fUEFSSVRZICAgICAweDEwMDAgIC8qIFNlbGVjdCBFdmVuIFBhcml0eSAqLworI2RlZmluZSBXRF9MT05HICAgICAgICAgMHgwODAwICAvKiBXYXRjaGRvZyBJbnRlcnZhbCwgMTogNTcgbWluLCAwOiAxMyBzZWMgKi8KKyNkZWZpbmUgUVVFVUVfMTI4ICAgICAgIDB4MDQwMCAgLyogUXVldWUgU2l6ZSwgMTogMTI4IGJ5dGUsIDA6IDY0IGJ5dGUgKi8KKyNkZWZpbmUgUFJJTV9NT0RFICAgICAgIDB4MDEwMCAgLyogUHJpbWl0aXZlIFNDU0kgbW9kZSAqLworI2RlZmluZSBTQ0FNX0VOICAgICAgICAgMHgwMDgwICAvKiBFbmFibGUgU0NBTSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgU0VMX1RNT19MT05HICAgIDB4MDA0MCAgLyogU2VsL1Jlc2VsIFRpbWVvdXQsIDE6IDQwMCBtcywgMDogMS42IG1zICovCisjZGVmaW5lIENGUk1fSUQgICAgICAgICAweDAwMjAgIC8qIFNDQU0gaWQgc2VsLiBjb25maXJtLiwgMTogZmFzdCwgMDogNi40IG1zICovCisjZGVmaW5lIE9VUl9JRF9FTiAgICAgICAweDAwMTAgIC8qIEVuYWJsZSBPVVJfSUQgYml0cyAqLworI2RlZmluZSBPVVJfSUQgICAgICAgICAgMHgwMDBGICAvKiBTQ1NJIElEICovCisKKy8qCisgKiBTQ1NJX0NGRzEgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgQklHX0VORElBTiAgICAgIDB4ODAwMCAgLyogRW5hYmxlIEJpZyBFbmRpYW4gTW9kZSBNSU86MTUsIEVFUDoxNSAqLworI2RlZmluZSBURVJNX1BPTCAgICAgICAgMHgyMDAwICAvKiBUZXJtaW5hdG9yIFBvbGFyaXR5IEN0cmwuIE1JTzoxMywgRUVQOjEzICovCisjZGVmaW5lIFNMRVdfUkFURSAgICAgICAweDEwMDAgIC8qIFNDU0kgb3V0cHV0IGJ1ZmZlciBzbGV3IHJhdGUgKi8KKyNkZWZpbmUgRklMVEVSX1NFTCAgICAgIDB4MEMwMCAgLyogRmlsdGVyIFBlcmlvZCBTZWxlY3Rpb24gKi8KKyNkZWZpbmUgIEZMVFJfRElTQUJMRSAgICAweDAwMDAgIC8qIElucHV0IEZpbHRlcmluZyBEaXNhYmxlZCAqLworI2RlZmluZSAgRkxUUl8xMV9UT18yME5TIDB4MDgwMCAgLyogSW5wdXQgRmlsdGVyaW5nIDExbnMgdG8gMjBucyAqLworI2RlZmluZSAgRkxUUl8yMV9UT18zOU5TIDB4MEMwMCAgLyogSW5wdXQgRmlsdGVyaW5nIDIxbnMgdG8gMzlucyAqLworI2RlZmluZSBBQ1RJVkVfREJMICAgICAgMHgwMjAwICAvKiBEaXNhYmxlIEFjdGl2ZSBOZWdhdGlvbiAqLworI2RlZmluZSBESUZGX01PREUgICAgICAgMHgwMTAwICAvKiBTQ1NJIGRpZmZlcmVudGlhbCBNb2RlIChSZWFkLU9ubHkpICovCisjZGVmaW5lIERJRkZfU0VOU0UgICAgICAweDAwODAgIC8qIDE6IE5vIFNFIGNhYmxlcywgMDogU0UgY2FibGUgKFJlYWQtT25seSkgKi8KKyNkZWZpbmUgVEVSTV9DVExfU0VMICAgIDB4MDA0MCAgLyogRW5hYmxlIFRFUk1fQ1RMX0ggYW5kIFRFUk1fQ1RMX0wgKi8KKyNkZWZpbmUgVEVSTV9DVEwgICAgICAgIDB4MDAzMCAgLyogRXh0ZXJuYWwgU0NTSSBUZXJtaW5hdGlvbiBCaXRzICovCisjZGVmaW5lICBURVJNX0NUTF9IICAgICAgMHgwMDIwICAvKiBFbmFibGUgRXh0ZXJuYWwgU0NTSSBVcHBlciBUZXJtaW5hdGlvbiAqLworI2RlZmluZSAgVEVSTV9DVExfTCAgICAgIDB4MDAxMCAgLyogRW5hYmxlIEV4dGVybmFsIFNDU0kgTG93ZXIgVGVybWluYXRpb24gKi8KKyNkZWZpbmUgQ0FCTEVfREVURUNUICAgIDB4MDAwRiAgLyogRXh0ZXJuYWwgU0NTSSBDYWJsZSBDb25uZWN0aW9uIFN0YXR1cyAqLworCisvKgorICogQWRkZW5kdW0gZm9yIEFTQy0zOEMwODAwIENoaXAKKyAqCisgKiBUaGUgQVNDLTM4QzE2MDAgQ2hpcCB1c2VzIHRoZSBzYW1lIGRlZmluaXRpb25zIGV4Y2VwdCB0aGF0IHRoZQorICogYnVzIG1vZGUgb3ZlcnJpZGUgYml0cyBbMTI6MTBdIGhhdmUgYmVlbiBtb3ZlZCB0byBieXRlIHJlZ2lzdGVyCisgKiBvZmZzZXQgMHhFIChJT1BCX1NPRlRfT1ZFUl9XUikgYml0cyBbMTI6MTBdLiBUaGUgWzEyOjEwXSBiaXRzIGluCisgKiBTQ1NJX0NGRzEgYXJlIHJlYWQtb25seSBhbmQgYWx3YXlzIGF2YWlsYWJsZS4gQml0IDE0IChESVNfVEVSTV9EUlYpCisgKiBpcyBub3QgbmVlZGVkLiBUaGUgWzEyOjEwXSBiaXRzIGluIElPUEJfU09GVF9PVkVSX1dSIGFyZSB3cml0ZS1vbmx5LgorICogQWxzbyBlYWNoIEFTQy0zOEMxNjAwIGZ1bmN0aW9uIG9yIGNoYW5uZWwgdXNlcyBvbmx5IGNhYmxlIGJpdHMgWzU6NF0KKyAqIGFuZCBbMTowXS4gQml0cyBbMTRdLCBbNzo2XSwgWzM6Ml0gYXJlIHVudXNlZC4KKyAqLworI2RlZmluZSBESVNfVEVSTV9EUlYgICAgMHg0MDAwICAvKiAxOiBSZWFkIGNfZGV0WzM6MF0sIDA6IGNhbm5vdCByZWFkICovCisjZGVmaW5lIEhWRF9MVkRfU0UgICAgICAweDFDMDAgIC8qIERldmljZSBEZXRlY3QgQml0cyAqLworI2RlZmluZSAgSFZEICAgICAgICAgICAgIDB4MTAwMCAgLyogSFZEIERldmljZSBEZXRlY3QgKi8KKyNkZWZpbmUgIExWRCAgICAgICAgICAgICAweDA4MDAgIC8qIExWRCBEZXZpY2UgRGV0ZWN0ICovCisjZGVmaW5lICBTRSAgICAgICAgICAgICAgMHgwNDAwICAvKiBTRSBEZXZpY2UgRGV0ZWN0ICovCisjZGVmaW5lIFRFUk1fTFZEICAgICAgICAweDAwQzAgIC8qIExWRCBUZXJtaW5hdGlvbiBCaXRzICovCisjZGVmaW5lICBURVJNX0xWRF9ISSAgICAgMHgwMDgwICAvKiBFbmFibGUgTFZEIFVwcGVyIFRlcm1pbmF0aW9uICovCisjZGVmaW5lICBURVJNX0xWRF9MTyAgICAgMHgwMDQwICAvKiBFbmFibGUgTFZEIExvd2VyIFRlcm1pbmF0aW9uICovCisjZGVmaW5lIFRFUk1fU0UgICAgICAgICAweDAwMzAgIC8qIFNFIFRlcm1pbmF0aW9uIEJpdHMgKi8KKyNkZWZpbmUgIFRFUk1fU0VfSEkgICAgICAweDAwMjAgIC8qIEVuYWJsZSBTRSBVcHBlciBUZXJtaW5hdGlvbiAqLworI2RlZmluZSAgVEVSTV9TRV9MTyAgICAgIDB4MDAxMCAgLyogRW5hYmxlIFNFIExvd2VyIFRlcm1pbmF0aW9uICovCisjZGVmaW5lIENfREVUX0xWRCAgICAgICAweDAwMEMgIC8qIExWRCBDYWJsZSBEZXRlY3QgQml0cyAqLworI2RlZmluZSAgQ19ERVQzICAgICAgICAgIDB4MDAwOCAgLyogQ2FibGUgRGV0ZWN0IGZvciBMVkQgRXh0ZXJuYWwgV2lkZSAqLworI2RlZmluZSAgQ19ERVQyICAgICAgICAgIDB4MDAwNCAgLyogQ2FibGUgRGV0ZWN0IGZvciBMVkQgSW50ZXJuYWwgV2lkZSAqLworI2RlZmluZSBDX0RFVF9TRSAgICAgICAgMHgwMDAzICAvKiBTRSBDYWJsZSBEZXRlY3QgQml0cyAqLworI2RlZmluZSAgQ19ERVQxICAgICAgICAgIDB4MDAwMiAgLyogQ2FibGUgRGV0ZWN0IGZvciBTRSBJbnRlcm5hbCBXaWRlICovCisjZGVmaW5lICBDX0RFVDAgICAgICAgICAgMHgwMDAxICAvKiBDYWJsZSBEZXRlY3QgZm9yIFNFIEludGVybmFsIE5hcnJvdyAqLworCisKKyNkZWZpbmUgQ0FCTEVfSUxMRUdBTF9BIDB4NworICAgIC8qIHggMCAwIDAgIHwgb24gIG9uIHwgSWxsZWdhbCAoYWxsIDMgY29ubmVjdG9ycyBhcmUgdXNlZCkgKi8KKworI2RlZmluZSBDQUJMRV9JTExFR0FMX0IgMHhCCisgICAgLyogMCB4IDAgMCAgfCBvbiAgb24gfCBJbGxlZ2FsIChhbGwgMyBjb25uZWN0b3JzIGFyZSB1c2VkKSAqLworCisvKgorICogTUVNX0NGRyBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBCSU9TX0VOICAgICAgICAgMHg0MCAgICAvKiBCSU9TIEVuYWJsZSBNSU86MTQsRUVQOjE0ICovCisjZGVmaW5lIEZBU1RfRUVfQ0xLICAgICAweDIwICAgIC8qIERpYWdub3N0aWMgQml0ICovCisjZGVmaW5lIFJBTV9TWiAgICAgICAgICAweDFDICAgIC8qIFNwZWNpZnkgc2l6ZSBvZiBSQU0gdG8gUklTQyAqLworI2RlZmluZSAgUkFNX1NaXzJLQiAgICAgIDB4MDAgICAgLyogMiBLQiAqLworI2RlZmluZSAgUkFNX1NaXzRLQiAgICAgIDB4MDQgICAgLyogNCBLQiAqLworI2RlZmluZSAgUkFNX1NaXzhLQiAgICAgIDB4MDggICAgLyogOCBLQiAqLworI2RlZmluZSAgUkFNX1NaXzE2S0IgICAgIDB4MEMgICAgLyogMTYgS0IgKi8KKyNkZWZpbmUgIFJBTV9TWl8zMktCICAgICAweDEwICAgIC8qIDMyIEtCICovCisjZGVmaW5lICBSQU1fU1pfNjRLQiAgICAgMHgxNCAgICAvKiA2NCBLQiAqLworCisvKgorICogRE1BX0NGRzAgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zCisgKgorICogVGhpcyByZWdpc3RlciBpcyBvbmx5IGFjY2Vzc2libGUgdG8gdGhlIGhvc3QuCisgKi8KKyNkZWZpbmUgQkNfVEhSRVNIX0VOQiAgIDB4ODAgICAgLyogUENJIERNQSBTdGFydCBDb25kaXRpb25zICovCisjZGVmaW5lIEZJRk9fVEhSRVNIICAgICAweDcwICAgIC8qIFBDSSBETUEgRklGTyBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgIEZJRk9fVEhSRVNIXzE2QiAgMHgwMCAgIC8qIDE2IGJ5dGVzICovCisjZGVmaW5lICBGSUZPX1RIUkVTSF8zMkIgIDB4MjAgICAvKiAzMiBieXRlcyAqLworI2RlZmluZSAgRklGT19USFJFU0hfNDhCICAweDMwICAgLyogNDggYnl0ZXMgKi8KKyNkZWZpbmUgIEZJRk9fVEhSRVNIXzY0QiAgMHg0MCAgIC8qIDY0IGJ5dGVzICovCisjZGVmaW5lICBGSUZPX1RIUkVTSF84MEIgIDB4NTAgICAvKiA4MCBieXRlcyAoZGVmYXVsdCkgKi8KKyNkZWZpbmUgIEZJRk9fVEhSRVNIXzk2QiAgMHg2MCAgIC8qIDk2IGJ5dGVzICovCisjZGVmaW5lICBGSUZPX1RIUkVTSF8xMTJCIDB4NzAgICAvKiAxMTIgYnl0ZXMgKi8KKyNkZWZpbmUgU1RBUlRfQ1RMICAgICAgIDB4MEMgICAgLyogRE1BIHN0YXJ0IGNvbmRpdGlvbnMgKi8KKyNkZWZpbmUgIFNUQVJUX0NUTF9USCAgICAweDAwICAgIC8qIFdhaXQgdGhyZXNob2xkIGxldmVsIChkZWZhdWx0KSAqLworI2RlZmluZSAgU1RBUlRfQ1RMX0lEICAgIDB4MDQgICAgLyogV2FpdCBTRE1BL1NCVVMgaWRsZSAqLworI2RlZmluZSAgU1RBUlRfQ1RMX1RISUQgIDB4MDggICAgLyogV2FpdCB0aHJlc2hvbGQgYW5kIFNETUEvU0JVUyBpZGxlICovCisjZGVmaW5lICBTVEFSVF9DVExfRU1GVSAgMHgwQyAgICAvKiBXYWl0IFNETUEgRklGTyBlbXB0eS9mdWxsICovCisjZGVmaW5lIFJFQURfQ01EICAgICAgICAweDAzICAgIC8qIE1lbW9yeSBSZWFkIE1ldGhvZCAqLworI2RlZmluZSAgUkVBRF9DTURfTVIgICAgIDB4MDAgICAgLyogTWVtb3J5IFJlYWQgKi8KKyNkZWZpbmUgIFJFQURfQ01EX01STCAgICAweDAyICAgIC8qIE1lbW9yeSBSZWFkIExvbmcgKi8KKyNkZWZpbmUgIFJFQURfQ01EX01STSAgICAweDAzICAgIC8qIE1lbW9yeSBSZWFkIE11bHRpcGxlIChkZWZhdWx0KSAqLworCisvKgorICogQVNDLTM4QzA4MDAgUkFNIEJJU1QgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgUkFNX1RFU1RfTU9ERSAgICAgICAgIDB4ODAKKyNkZWZpbmUgUFJFX1RFU1RfTU9ERSAgICAgICAgIDB4NDAKKyNkZWZpbmUgTk9STUFMX01PREUgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUkFNX1RFU1RfRE9ORSAgICAgICAgIDB4MTAKKyNkZWZpbmUgUkFNX1RFU1RfU1RBVFVTICAgICAgIDB4MEYKKyNkZWZpbmUgIFJBTV9URVNUX0hPU1RfRVJST1IgICAweDA4CisjZGVmaW5lICBSQU1fVEVTVF9JTlRSQU1fRVJST1IgMHgwNAorI2RlZmluZSAgUkFNX1RFU1RfUklTQ19FUlJPUiAgIDB4MDIKKyNkZWZpbmUgIFJBTV9URVNUX1NDU0lfRVJST1IgICAweDAxCisjZGVmaW5lICBSQU1fVEVTVF9TVUNDRVNTICAgICAgMHgwMAorI2RlZmluZSBQUkVfVEVTVF9WQUxVRSAgICAgICAgMHgwNQorI2RlZmluZSBOT1JNQUxfVkFMVUUgICAgICAgICAgMHgwMAorCisvKgorICogQVNDMzhDMTYwMCBEZWZpbml0aW9ucworICoKKyAqIElPUEJfUENJX0lOVF9DRkcgQml0IEZpZWxkIERlZmluaXRpb25zCisgKi8KKworI2RlZmluZSBJTlRBQl9MRCAgICAgICAgMHg4MCAgICAvKiBWYWx1ZSBsb2FkZWQgZnJvbSBFRVBST00gQml0IDExLiAqLworCisvKgorICogQml0IDEgY2FuIGJlIHNldCB0byBjaGFuZ2UgdGhlIGludGVycnVwdCBmb3IgdGhlIEZ1bmN0aW9uIHRvIG9wZXJhdGUgaW4KKyAqIFRvdGVtIFBvbGUgbW9kZS4gQnkgZGVmYXVsdCBCaXQgMSBpcyAwIGFuZCB0aGUgaW50ZXJydXB0IG9wZXJhdGVzIGluCisgKiBPcGVuIERyYWluIG1vZGUuIEJvdGggZnVuY3Rpb25zIG9mIHRoZSBBU0MzOEMxNjAwIG11c3QgYmUgc2V0IHRvIHRoZSBzYW1lCisgKiBtb2RlLCBvdGhlcndpc2UgdGhlIG9wZXJhdGluZyBtb2RlIGlzIHVuZGVmaW5lZC4KKyAqLworI2RlZmluZSBUT1RFTVBPTEUgICAgICAgMHgwMgorCisvKgorICogQml0IDAgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBJbnQgUGluIGZvciB0aGUgRnVuY3Rpb24uIFRoZSB2YWx1ZSBpcworICogMCBieSBkZWZhdWx0IGZvciBib3RoIEZ1bmN0aW9ucyB3aXRoIEZ1bmN0aW9uIDAgdXNpbmcgSU5UIEEgYW5kIEZ1bmN0aW9uCisgKiBCIHVzaW5nIElOVCBCLiBGb3IgRnVuY3Rpb24gMCBpZiBzZXQsIElOVCBCIGlzIHVzZWQuIEZvciBGdW5jdGlvbiAxIGlmIHNldCwKKyAqIElOVCBBIGlzIHVzZWQuCisgKgorICogRUVQUk9NIFdvcmQgMCBCaXQgMTEgZm9yIGVhY2ggRnVuY3Rpb24gbWF5IGNoYW5nZSB0aGUgaW5pdGlhbCBJbnQgUGluCisgKiB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIFBDSSBDb25maWd1cmF0aW9uIFNwYWNlLgorICovCisjZGVmaW5lIElOVEFCICAgICAgICAgICAweDAxCisKKy8qIGFfYWR2bGliLmggKi8KKworLyoKKyAqIEFkdiBMaWJyYXJ5IFN0YXR1cyBEZWZpbml0aW9ucworICovCisjZGVmaW5lIEFEVl9UUlVFICAgICAgICAxCisjZGVmaW5lIEFEVl9GQUxTRSAgICAgICAwCisjZGVmaW5lIEFEVl9OT0VSUk9SICAgICAxCisjZGVmaW5lIEFEVl9TVUNDRVNTICAgICAxCisjZGVmaW5lIEFEVl9CVVNZICAgICAgICAwCisjZGVmaW5lIEFEVl9FUlJPUiAgICAgICAoLTEpCisKKworLyoKKyAqIEFEVl9EVkNfVkFSICd3YXJuX2NvZGUnIHZhbHVlcworICovCisjZGVmaW5lIEFTQ19XQVJOX0JVU1JFU0VUX0VSUk9SICAgICAgICAgMHgwMDAxIC8qIFNDU0kgQnVzIFJlc2V0IGVycm9yICovCisjZGVmaW5lIEFTQ19XQVJOX0VFUFJPTV9DSEtTVU0gICAgICAgICAgMHgwMDAyIC8qIEVFUCBjaGVjayBzdW0gZXJyb3IgKi8KKyNkZWZpbmUgQVNDX1dBUk5fRUVQUk9NX1RFUk1JTkFUSU9OICAgICAweDAwMDQgLyogRUVQIHRlcm1pbmF0aW9uIGJhZCBmaWVsZCAqLworI2RlZmluZSBBU0NfV0FSTl9TRVRfUENJX0NPTkZJR19TUEFDRSAgIDB4MDA4MCAvKiBQQ0kgY29uZmlnIHNwYWNlIHNldCBlcnJvciAqLworI2RlZmluZSBBU0NfV0FSTl9FUlJPUiAgICAgICAgICAgICAgICAgIDB4RkZGRiAvKiBBRFZfRVJST1IgcmV0dXJuICovCisKKyNkZWZpbmUgQURWX01BWF9USUQgICAgICAgICAgICAgICAgICAgICAxNSAvKiBtYXguIHRhcmdldCBpZGVudGlmaWVyICovCisjZGVmaW5lIEFEVl9NQVhfTFVOICAgICAgICAgICAgICAgICAgICAgNyAgLyogbWF4LiBsb2dpY2FsIHVuaXQgbnVtYmVyICovCisKKy8qCisgKiBFcnJvciBjb2RlIHZhbHVlcyBhcmUgc2V0IGluIEFEVl9EVkNfVkFSICdlcnJfY29kZScuCisgKi8KKyNkZWZpbmUgQVNDX0lFUlJfV1JJVEVfRUVQUk9NICAgICAgIDB4MDAwMSAvKiB3cml0ZSBFRVBST00gZXJyb3IgKi8KKyNkZWZpbmUgQVNDX0lFUlJfTUNPREVfQ0hLU1VNICAgICAgIDB4MDAwMiAvKiBtaWNybyBjb2RlIGNoZWNrIHN1bSBlcnJvciAqLworI2RlZmluZSBBU0NfSUVSUl9OT19DQVJSSUVSICAgICAgICAgMHgwMDA0IC8qIE5vIG1vcmUgY2FycmllciBtZW1vcnkuICovCisjZGVmaW5lIEFTQ19JRVJSX1NUQVJUX1NUT1BfQ0hJUCAgICAweDAwMDggLyogc3RhcnQvc3RvcCBjaGlwIGZhaWxlZCAqLworI2RlZmluZSBBU0NfSUVSUl9DSElQX1ZFUlNJT04gICAgICAgMHgwMDQwIC8qIHdyb25nIGNoaXAgdmVyc2lvbiAqLworI2RlZmluZSBBU0NfSUVSUl9TRVRfU0NTSV9JRCAgICAgICAgMHgwMDgwIC8qIHNldCBTQ1NJIElEIGZhaWxlZCAqLworI2RlZmluZSBBU0NfSUVSUl9IVkRfREVWSUNFICAgICAgICAgMHgwMTAwIC8qIEhWRCBhdHRhY2hlZCB0byBMVkQgY29ubmVjdG9yLiAqLworI2RlZmluZSBBU0NfSUVSUl9CQURfU0lHTkFUVVJFICAgICAgMHgwMjAwIC8qIHNpZ25hdHVyZSBub3QgZm91bmQgKi8KKyNkZWZpbmUgQVNDX0lFUlJfSUxMRUdBTF9DT05ORUNUSU9OIDB4MDQwMCAvKiBJbGxlZ2FsIGNhYmxlIGNvbm5lY3Rpb24gKi8KKyNkZWZpbmUgQVNDX0lFUlJfU0lOR0xFX0VORF9ERVZJQ0UgIDB4MDgwMCAvKiBTaW5nbGUtZW5kIHVzZWQgdy9kaWZmZXJlbnRpYWwgKi8KKyNkZWZpbmUgQVNDX0lFUlJfUkVWRVJTRURfQ0FCTEUgICAgIDB4MTAwMCAvKiBOYXJyb3cgZmxhdCBjYWJsZSByZXZlcnNlZCAqLworI2RlZmluZSBBU0NfSUVSUl9CSVNUX1BSRV9URVNUICAgICAgMHgyMDAwIC8qIEJJU1QgcHJlLXRlc3QgZXJyb3IgKi8KKyNkZWZpbmUgQVNDX0lFUlJfQklTVF9SQU1fVEVTVCAgICAgIDB4NDAwMCAvKiBCSVNUIFJBTSB0ZXN0IGVycm9yICovCisjZGVmaW5lIEFTQ19JRVJSX0JBRF9DSElQVFlQRSAgICAgICAweDgwMDAgLyogSW52YWxpZCAnY2hpcF90eXBlJyBzZXR0aW5nLiAqLworCisvKgorICogRml4ZWQgbG9jYXRpb25zIG9mIG1pY3JvY29kZSBvcGVyYXRpbmcgdmFyaWFibGVzLgorICovCisjZGVmaW5lIEFTQ19NQ19DT0RFX0JFR0lOX0FERFIgICAgICAgICAgMHgwMDI4IC8qIG1pY3JvY29kZSBzdGFydCBhZGRyZXNzICovCisjZGVmaW5lIEFTQ19NQ19DT0RFX0VORF9BRERSICAgICAgICAgICAgMHgwMDJBIC8qIG1pY3JvY29kZSBlbmQgYWRkcmVzcyAqLworI2RlZmluZSBBU0NfTUNfQ09ERV9DSEtfU1VNICAgICAgICAgICAgIDB4MDAyQyAvKiBtaWNyb2NvZGUgY29kZSBjaGVja3N1bSAqLworI2RlZmluZSBBU0NfTUNfVkVSU0lPTl9EQVRFICAgICAgICAgICAgIDB4MDAzOCAvKiBtaWNyb2NvZGUgdmVyc2lvbiAqLworI2RlZmluZSBBU0NfTUNfVkVSU0lPTl9OVU0gICAgICAgICAgICAgIDB4MDAzQSAvKiBtaWNyb2NvZGUgbnVtYmVyICovCisjZGVmaW5lIEFTQ19NQ19CSU9TTUVNICAgICAgICAgICAgICAgICAgMHgwMDQwIC8qIEJJT1MgUklTQyBNZW1vcnkgU3RhcnQgKi8KKyNkZWZpbmUgQVNDX01DX0JJT1NMRU4gICAgICAgICAgICAgICAgICAweDAwNTAgLyogQklPUyBSSVNDIE1lbW9yeSBMZW5ndGggKi8KKyNkZWZpbmUgQVNDX01DX0JJT1NfU0lHTkFUVVJFICAgICAgICAgICAweDAwNTggLyogQklPUyBTaWduYXR1cmUgMHg1NUFBICovCisjZGVmaW5lIEFTQ19NQ19CSU9TX1ZFUlNJT04gICAgICAgICAgICAgMHgwMDVBIC8qIEJJT1MgVmVyc2lvbiAoMiBieXRlcykgKi8KKyNkZWZpbmUgQVNDX01DX1NEVFJfU1BFRUQxICAgICAgICAgICAgICAweDAwOTAgLyogU0RUUiBTcGVlZCBmb3IgVElEIDAtMyAqLworI2RlZmluZSBBU0NfTUNfU0RUUl9TUEVFRDIgICAgICAgICAgICAgIDB4MDA5MiAvKiBTRFRSIFNwZWVkIGZvciBUSUQgNC03ICovCisjZGVmaW5lIEFTQ19NQ19TRFRSX1NQRUVEMyAgICAgICAgICAgICAgMHgwMDk0IC8qIFNEVFIgU3BlZWQgZm9yIFRJRCA4LTExICovCisjZGVmaW5lIEFTQ19NQ19TRFRSX1NQRUVENCAgICAgICAgICAgICAgMHgwMDk2IC8qIFNEVFIgU3BlZWQgZm9yIFRJRCAxMi0xNSAqLworI2RlZmluZSBBU0NfTUNfQ0hJUF9UWVBFICAgICAgICAgICAgICAgIDB4MDA5QQorI2RlZmluZSBBU0NfTUNfSU5UUkJfQ09ERSAgICAgICAgICAgICAgIDB4MDA5QgorI2RlZmluZSBBU0NfTUNfV0RUUl9BQkxFICAgICAgICAgICAgICAgIDB4MDA5QworI2RlZmluZSBBU0NfTUNfU0RUUl9BQkxFICAgICAgICAgICAgICAgIDB4MDA5RQorI2RlZmluZSBBU0NfTUNfVEFHUU5HX0FCTEUgICAgICAgICAgICAgIDB4MDBBMAorI2RlZmluZSBBU0NfTUNfRElTQ19FTkFCTEUgICAgICAgICAgICAgIDB4MDBBMgorI2RlZmluZSBBU0NfTUNfSURMRV9DTURfU1RBVFVTICAgICAgICAgIDB4MDBBNAorI2RlZmluZSBBU0NfTUNfSURMRV9DTUQgICAgICAgICAgICAgICAgIDB4MDBBNgorI2RlZmluZSBBU0NfTUNfSURMRV9DTURfUEFSQU1FVEVSICAgICAgIDB4MDBBOAorI2RlZmluZSBBU0NfTUNfREVGQVVMVF9TQ1NJX0NGRzAgICAgICAgIDB4MDBBQworI2RlZmluZSBBU0NfTUNfREVGQVVMVF9TQ1NJX0NGRzEgICAgICAgIDB4MDBBRQorI2RlZmluZSBBU0NfTUNfREVGQVVMVF9NRU1fQ0ZHICAgICAgICAgIDB4MDBCMAorI2RlZmluZSBBU0NfTUNfREVGQVVMVF9TRUxfTUFTSyAgICAgICAgIDB4MDBCMgorI2RlZmluZSBBU0NfTUNfU0RUUl9ET05FICAgICAgICAgICAgICAgIDB4MDBCNgorI2RlZmluZSBBU0NfTUNfTlVNQkVSX09GX1FVRVVFRF9DTUQgICAgIDB4MDBDMAorI2RlZmluZSBBU0NfTUNfTlVNQkVSX09GX01BWF9DTUQgICAgICAgIDB4MDBEMAorI2RlZmluZSBBU0NfTUNfREVWSUNFX0hTSEtfQ0ZHX1RBQkxFICAgIDB4MDEwMAorI2RlZmluZSBBU0NfTUNfQ09OVFJPTF9GTEFHICAgICAgICAgICAgIDB4MDEyMiAvKiBNaWNyb2NvZGUgY29udHJvbCBmbGFnLiAqLworI2RlZmluZSBBU0NfTUNfV0RUUl9ET05FICAgICAgICAgICAgICAgIDB4MDEyNAorI2RlZmluZSBBU0NfTUNfQ0FNX01PREVfTUFTSyAgICAgICAgICAgIDB4MDE1RSAvKiBDQU0gbW9kZSBUSUQgYml0bWFzay4gKi8KKyNkZWZpbmUgQVNDX01DX0lDUSAgICAgICAgICAgICAgICAgICAgICAweDAxNjAKKyNkZWZpbmUgQVNDX01DX0lSUSAgICAgICAgICAgICAgICAgICAgICAweDAxNjQKKyNkZWZpbmUgQVNDX01DX1BQUl9BQkxFICAgICAgICAgICAgICAgICAweDAxN0EKKworLyoKKyAqIEJJT1MgTFJBTSB2YXJpYWJsZSBhYnNvbHV0ZSBvZmZzZXRzLgorICovCisjZGVmaW5lIEJJT1NfQ09ERVNFRyAgICAweDU0CisjZGVmaW5lIEJJT1NfQ09ERUxFTiAgICAweDU2CisjZGVmaW5lIEJJT1NfU0lHTkFUVVJFICAweDU4CisjZGVmaW5lIEJJT1NfVkVSU0lPTiAgICAweDVBCisKKy8qCisgKiBNaWNyb2NvZGUgQ29udHJvbCBGbGFncworICoKKyAqIEZsYWdzIHNldCBieSB0aGUgQWR2IExpYnJhcnkgaW4gUklTQyB2YXJpYWJsZSAnY29udHJvbF9mbGFnJyAoMHgxMjIpCisgKiBhbmQgaGFuZGxlZCBieSB0aGUgbWljcm9jb2RlLgorICovCisjZGVmaW5lIENPTlRST0xfRkxBR19JR05PUkVfUEVSUiAgICAgICAgMHgwMDAxIC8qIElnbm9yZSBETUEgUGFyaXR5IEVycm9ycyAqLworI2RlZmluZSBDT05UUk9MX0ZMQUdfRU5BQkxFX0FJUFAgICAgICAgIDB4MDAwMiAvKiBFbmFibGVkIEFJUFAgY2hlY2tpbmcuICovCisKKy8qCisgKiBBU0NfTUNfREVWSUNFX0hTSEtfQ0ZHX1RBQkxFIG1pY3JvY29kZSB0YWJsZSBvciBIU0hLX0NGRyByZWdpc3RlciBmb3JtYXQKKyAqLworI2RlZmluZSBIU0hLX0NGR19XSURFX1hGUiAgICAgICAweDgwMDAKKyNkZWZpbmUgSFNIS19DRkdfUkFURSAgICAgICAgICAgMHgwRjAwCisjZGVmaW5lIEhTSEtfQ0ZHX09GRlNFVCAgICAgICAgIDB4MDAxRgorCisjZGVmaW5lIEFTQ19ERUZfTUFYX0hPU1RfUU5HICAgIDB4RkQgLyogTWF4LiBudW1iZXIgb2YgaG9zdCBjb21tYW5kcyAoMjUzKSAqLworI2RlZmluZSBBU0NfREVGX01JTl9IT1NUX1FORyAgICAweDEwIC8qIE1pbi4gbnVtYmVyIG9mIGhvc3QgY29tbWFuZHMgKDE2KSAqLworI2RlZmluZSBBU0NfREVGX01BWF9EVkNfUU5HICAgICAweDNGIC8qIE1heC4gbnVtYmVyIGNvbW1hbmRzIHBlciBkZXZpY2UgKDYzKSAqLworI2RlZmluZSBBU0NfREVGX01JTl9EVkNfUU5HICAgICAweDA0IC8qIE1pbi4gbnVtYmVyIGNvbW1hbmRzIHBlciBkZXZpY2UgKDQpICovCisKKyNkZWZpbmUgQVNDX1FDX0RBVEFfQ0hFQ0sgIDB4MDEgLyogUmVxdWlyZSBBU0NfUUNfREFUQV9PVVQgc2V0IG9yIGNsZWFyLiAqLworI2RlZmluZSBBU0NfUUNfREFUQV9PVVQgICAgMHgwMiAvKiBEYXRhIG91dCBETUEgdHJhbnNmZXIuICovCisjZGVmaW5lIEFTQ19RQ19TVEFSVF9NT1RPUiAweDA0IC8qIFNlbmQgYXV0by1zdGFydCBtb3RvciBiZWZvcmUgcmVxdWVzdC4gKi8KKyNkZWZpbmUgQVNDX1FDX05PX09WRVJSVU4gIDB4MDggLyogRG9uJ3QgcmVwb3J0IG92ZXJydW4uICovCisjZGVmaW5lIEFTQ19RQ19GUkVFWkVfVElEUSAweDEwIC8qIEZyZWV6ZSBUSUQgcXVldWUgYWZ0ZXIgcmVxdWVzdC4gWFhYIFRCRCAqLworCisjZGVmaW5lIEFTQ19RU0NfTk9fRElTQyAgICAgMHgwMSAvKiBEb24ndCBhbGxvdyBkaXNjb25uZWN0IGZvciByZXF1ZXN0LiAqLworI2RlZmluZSBBU0NfUVNDX05PX1RBR01TRyAgIDB4MDIgLyogRG9uJ3QgYWxsb3cgdGFnIHF1ZXVpbmcgZm9yIHJlcXVlc3QuICovCisjZGVmaW5lIEFTQ19RU0NfTk9fU1lOQyAgICAgMHgwNCAvKiBEb24ndCB1c2UgU3luY2guIHRyYW5zZmVyIG9uIHJlcXVlc3QuICovCisjZGVmaW5lIEFTQ19RU0NfTk9fV0lERSAgICAgMHgwOCAvKiBEb24ndCB1c2UgV2lkZSB0cmFuc2ZlciBvbiByZXF1ZXN0LiAqLworI2RlZmluZSBBU0NfUVNDX1JFRE9fRFRSICAgIDB4MTAgLyogUmVuZWdvdGlhdGUgV0RUUi9TRFRSIGJlZm9yZSByZXF1ZXN0LiAqLworLyoKKyAqIE5vdGU6IElmIGEgVGFnIE1lc3NhZ2UgaXMgdG8gYmUgc2VudCBhbmQgbmVpdGhlciBBU0NfUVNDX0hFQURfVEFHIG9yCisgKiBBU0NfUVNDX09SREVSRURfVEFHIGlzIHNldCwgdGhlbiBhIFNpbXBsZSBUYWcgTWVzc2FnZSAoMHgyMCkgaXMgdXNlZC4KKyAqLworI2RlZmluZSBBU0NfUVNDX0hFQURfVEFHICAgIDB4NDAgLyogVXNlIEhlYWQgVGFnIE1lc3NhZ2UgKDB4MjEpLiAqLworI2RlZmluZSBBU0NfUVNDX09SREVSRURfVEFHIDB4ODAgLyogVXNlIE9yZGVyZWQgVGFnIE1lc3NhZ2UgKDB4MjIpLiAqLworCisvKgorICogQWxsIGZpZWxkcyBoZXJlIGFyZSBhY2Nlc3NlZCBieSB0aGUgYm9hcmQgbWljcm9jb2RlIGFuZCBuZWVkIHRvIGJlCisgKiBsaXR0bGUtZW5kaWFuLgorICovCit0eXBlZGVmIHN0cnVjdCBhZHZfY2Fycl90Cit7CisgICAgQURWX1ZBRERSICAgY2Fycl92YTsgICAgICAgLyogQ2FycmllciBWaXJ0dWFsIEFkZHJlc3MgKi8KKyAgICBBRFZfUEFERFIgICBjYXJyX3BhOyAgICAgICAvKiBDYXJyaWVyIFBoeXNpY2FsIEFkZHJlc3MgKi8KKyAgICBBRFZfVkFERFIgICBhcmVxX3ZwYTsgICAgICAvKiBBU0NfU0NTSV9SRVFfUSBWaXJ0dWFsIG9yIFBoeXNpY2FsIEFkZHJlc3MgKi8KKyAgICAvKgorICAgICAqIG5leHRfdnBhIFszMTo0XSAgICAgICAgICAgIENhcnJpZXIgVmlydHVhbCBvciBQaHlzaWNhbCBOZXh0IFBvaW50ZXIKKyAgICAgKgorICAgICAqIG5leHRfdnBhIFszOjFdICAgICAgICAgICAgIFJlc2VydmVkIEJpdHMKKyAgICAgKiBuZXh0X3ZwYSBbMF0gICAgICAgICAgICAgICBEb25lIEZsYWcgc2V0IGluIFJlc3BvbnNlIFF1ZXVlLgorICAgICAqLworICAgIEFEVl9WQUREUiAgIG5leHRfdnBhOworfSBBRFZfQ0FSUl9UOworCisvKgorICogTWFzayB1c2VkIHRvIGVsaW1pbmF0ZSBsb3cgNCBiaXRzIG9mIGNhcnJpZXIgJ25leHRfdnBhJyBmaWVsZC4KKyAqLworI2RlZmluZSBBU0NfTkVYVF9WUEFfTUFTSyAgICAgICAweEZGRkZGRkYwCisKKyNkZWZpbmUgQVNDX1JRX0RPTkUgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBU0NfUlFfR09PRCAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEFTQ19DUV9TVE9QUEVSICAgICAgICAgIDB4MDAwMDAwMDAKKworI2RlZmluZSBBU0NfR0VUX0NBUlJQKGNhcnJwKSAoKGNhcnJwKSAmIEFTQ19ORVhUX1ZQQV9NQVNLKQorCisjZGVmaW5lIEFEVl9DQVJSSUVSX05VTV9QQUdFX0NST1NTSU5HIFwKKyAgICAoKChBRFZfQ0FSUklFUl9DT1VOVCAqIHNpemVvZihBRFZfQ0FSUl9UKSkgKyBcCisgICAgICAgIChBRFZfUEFHRV9TSVpFIC0gMSkpL0FEVl9QQUdFX1NJWkUpCisKKyNkZWZpbmUgQURWX0NBUlJJRVJfQlVGU0laRSBcCisgICAgKChBRFZfQ0FSUklFUl9DT1VOVCArIEFEVl9DQVJSSUVSX05VTV9QQUdFX0NST1NTSU5HKSAqIHNpemVvZihBRFZfQ0FSUl9UKSkKKworLyoKKyAqIEFTQ19TQ1NJX1JFUV9RICdhX2ZsYWcnIGRlZmluaXRpb25zCisgKgorICogVGhlIEFkdiBMaWJyYXJ5IHNob3VsZCBsaW1pdCB1c2UgdG8gdGhlIGxvd2VyIG5pYmJsZSAoNCBiaXRzKSBvZgorICogYV9mbGFnLiBEcml2ZXJzIGFyZSBmcmVlIHRvIHVzZSB0aGUgdXBwZXIgbmliYmxlICg0IGJpdHMpIG9mIGFfZmxhZy4KKyAqLworI2RlZmluZSBBRFZfUE9MTF9SRVFVRVNUICAgICAgICAgICAgICAgIDB4MDEgICAvKiBwb2xsIGZvciByZXF1ZXN0IGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgQURWX1NDU0lRX0RPTkUgICAgICAgICAgICAgICAgICAweDAyICAgLyogcmVxdWVzdCBkb25lICovCisjZGVmaW5lIEFEVl9ET05UX1JFVFJZICAgICAgICAgICAgICAgICAgMHgwOCAgIC8qIGRvbid0IGRvIHJldHJ5ICovCisKKyNkZWZpbmUgQURWX0NISVBfQVNDMzU1MCAgICAgICAgICAweDAxICAgLyogVWx0cmEtV2lkZSBJQyAqLworI2RlZmluZSBBRFZfQ0hJUF9BU0MzOEMwODAwICAgICAgIDB4MDIgICAvKiBVbHRyYTItV2lkZS9MVkQgSUMgKi8KKyNkZWZpbmUgQURWX0NISVBfQVNDMzhDMTYwMCAgICAgICAweDAzICAgLyogVWx0cmEzLVdpZGUvTFZEMiBJQyAqLworCisvKgorICogQWRhcHRlciB0ZW1wb3JhcnkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBjYW4gYmUgZGlzY2FyZGVkIGFmdGVyIGluaXRpYWxpemF0aW9uLiBEb24ndCBhZGQKKyAqIGZpZWxkcyBoZXJlIG5lZWRlZCBhZnRlciBpbml0aWFsaXphdGlvbi4KKyAqCisgKiBGaWVsZCBuYW1pbmcgY29udmVudGlvbjoKKyAqCisgKiAgKl9lbmFibGUgaW5kaWNhdGVzIHRoZSBmaWVsZCBlbmFibGVzIG9yIGRpc2FibGVzIGEgZmVhdHVyZS4gVGhlCisgKiAgdmFsdWUgb2YgdGhlIGZpZWxkIGlzIG5ldmVyIHJlc2V0LgorICovCit0eXBlZGVmIHN0cnVjdCBhZHZfZHZjX2NmZyB7CisgIHVzaG9ydCBkaXNjX2VuYWJsZTsgICAgICAgLyogZW5hYmxlIGRpc2Nvbm5lY3Rpb24gKi8KKyAgdWNoYXIgIGNoaXBfdmVyc2lvbjsgICAgICAvKiBjaGlwIHZlcnNpb24gKi8KKyAgdWNoYXIgIHRlcm1pbmF0aW9uOyAgICAgICAvKiBUZXJtLiBDdHJsLiBiaXRzIDYtNSBvZiBTQ1NJX0NGRzEgcmVnaXN0ZXIgKi8KKyAgdXNob3J0IGxpYl92ZXJzaW9uOyAgICAgICAvKiBBZHYgTGlicmFyeSB2ZXJzaW9uIG51bWJlciAqLworICB1c2hvcnQgY29udHJvbF9mbGFnOyAgICAgIC8qIE1pY3JvY29kZSBDb250cm9sIEZsYWcgKi8KKyAgdXNob3J0IG1jb2RlX2RhdGU7ICAgICAgICAvKiBNaWNyb2NvZGUgZGF0ZSAqLworICB1c2hvcnQgbWNvZGVfdmVyc2lvbjsgICAgIC8qIE1pY3JvY29kZSB2ZXJzaW9uICovCisgIHVzaG9ydCBwY2lfc2xvdF9pbmZvOyAgICAgLyogaGlnaCBieXRlIGRldmljZS9mdW5jdGlvbiBudW1iZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzIDctMyBkZXZpY2UgbnVtLiwgYml0cyAyLTAgZnVuY3Rpb24gbnVtLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvdyBieXRlIGJ1cyBudW0uICovCisgIHVzaG9ydCBzZXJpYWwxOyAgICAgICAgICAgLyogRUVQUk9NIHNlcmlhbCBudW1iZXIgd29yZCAxICovCisgIHVzaG9ydCBzZXJpYWwyOyAgICAgICAgICAgLyogRUVQUk9NIHNlcmlhbCBudW1iZXIgd29yZCAyICovCisgIHVzaG9ydCBzZXJpYWwzOyAgICAgICAgICAgLyogRUVQUk9NIHNlcmlhbCBudW1iZXIgd29yZCAzICovCisgIHN0cnVjdCBkZXZpY2UgKmRldjsgIC8qIHBvaW50ZXIgdG8gdGhlIHBjaSBkZXYgc3RydWN0dXJlIGZvciB0aGlzIGJvYXJkICovCit9IEFEVl9EVkNfQ0ZHOworCitzdHJ1Y3QgYWR2X2R2Y192YXI7CitzdHJ1Y3QgYWR2X3Njc2lfcmVxX3E7CisKK3R5cGVkZWYgdm9pZCAoKiBBRFZfSVNSX0NBTExCQUNLKQorICAgIChzdHJ1Y3QgYWR2X2R2Y192YXIgKiwgc3RydWN0IGFkdl9zY3NpX3JlcV9xICopOworCit0eXBlZGVmIHZvaWQgKCogQURWX0FTWU5DX0NBTExCQUNLKQorICAgIChzdHJ1Y3QgYWR2X2R2Y192YXIgKiwgdWNoYXIpOworCisvKgorICogQWRhcHRlciBvcGVyYXRpb24gdmFyaWFibGUgc3RydWN0dXJlLgorICoKKyAqIE9uZSBzdHJ1Y3R1cmUgaXMgcmVxdWlyZWQgcGVyIGhvc3QgYWRhcHRlci4KKyAqCisgKiBGaWVsZCBuYW1pbmcgY29udmVudGlvbjoKKyAqCisgKiAgKl9hYmxlIGluZGljYXRlcyBib3RoIHdoZXRoZXIgYSBmZWF0dXJlIHNob3VsZCBiZSBlbmFibGVkIG9yIGRpc2FibGVkCisgKiAgYW5kIHdoZXRoZXIgYSBkZXZpY2UgaXNpIGNhcGFibGUgb2YgdGhlIGZlYXR1cmUuIEF0IGluaXRpYWxpemF0aW9uCisgKiAgdGhpcyBmaWVsZCBtYXkgYmUgc2V0LCBidXQgbGF0ZXIgaWYgYSBkZXZpY2UgaXMgZm91bmQgdG8gYmUgaW5jYXBhYmxlCisgKiAgb2YgdGhlIGZlYXR1cmUsIHRoZSBmaWVsZCBpcyBjbGVhcmVkLgorICovCit0eXBlZGVmIHN0cnVjdCBhZHZfZHZjX3ZhciB7CisgIEFkdlBvcnRBZGRyIGlvcF9iYXNlOyAgIC8qIEkvTyBwb3J0IGFkZHJlc3MgKi8KKyAgdXNob3J0IGVycl9jb2RlOyAgICAgICAgLyogZmF0YWwgZXJyb3IgY29kZSAqLworICB1c2hvcnQgYmlvc19jdHJsOyAgICAgICAvKiBCSU9TIGNvbnRyb2wgd29yZCwgRUVQUk9NIHdvcmQgMTIgKi8KKyAgQURWX0lTUl9DQUxMQkFDSyBpc3JfY2FsbGJhY2s7CisgIEFEVl9BU1lOQ19DQUxMQkFDSyBhc3luY19jYWxsYmFjazsKKyAgdXNob3J0IHdkdHJfYWJsZTsgICAgICAgLyogdHJ5IFdEVFIgZm9yIGEgZGV2aWNlICovCisgIHVzaG9ydCBzZHRyX2FibGU7ICAgICAgIC8qIHRyeSBTRFRSIGZvciBhIGRldmljZSAqLworICB1c2hvcnQgdWx0cmFfYWJsZTsgICAgICAvKiB0cnkgU0RUUiBVbHRyYSBzcGVlZCBmb3IgYSBkZXZpY2UgKi8KKyAgdXNob3J0IHNkdHJfc3BlZWQxOyAgICAgLyogRUVQUk9NIFNEVFIgU3BlZWQgZm9yIFRJRCAwLTMgICAqLworICB1c2hvcnQgc2R0cl9zcGVlZDI7ICAgICAvKiBFRVBST00gU0RUUiBTcGVlZCBmb3IgVElEIDQtNyAgICovCisgIHVzaG9ydCBzZHRyX3NwZWVkMzsgICAgIC8qIEVFUFJPTSBTRFRSIFNwZWVkIGZvciBUSUQgOC0xMSAgKi8KKyAgdXNob3J0IHNkdHJfc3BlZWQ0OyAgICAgLyogRUVQUk9NIFNEVFIgU3BlZWQgZm9yIFRJRCAxMi0xNSAqLworICB1c2hvcnQgdGFncW5nX2FibGU7ICAgICAvKiB0cnkgdGFnZ2VkIHF1ZXVpbmcgd2l0aCBhIGRldmljZSAqLworICB1c2hvcnQgcHByX2FibGU7ICAgICAgICAvKiBQUFIgbWVzc2FnZSBjYXBhYmxlIHBlciBUSUQgYml0bWFzay4gKi8KKyAgdWNoYXIgIG1heF9kdmNfcW5nOyAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgdGFnZ2VkIGNvbW1hbmRzIHBlciBkZXZpY2UgKi8KKyAgdXNob3J0IHN0YXJ0X21vdG9yOyAgICAgLyogc3RhcnQgbW90b3IgY29tbWFuZCBhbGxvd2VkICovCisgIHVjaGFyICBzY3NpX3Jlc2V0X3dhaXQ7IC8qIGRlbGF5IGluIHNlY29uZHMgYWZ0ZXIgc2NzaSBidXMgcmVzZXQgKi8KKyAgdWNoYXIgIGNoaXBfbm87ICAgICAgICAgLyogc2hvdWxkIGJlIGFzc2lnbmVkIGJ5IGNhbGxlciAqLworICB1Y2hhciAgbWF4X2hvc3RfcW5nOyAgICAvKiBtYXhpbXVtIG51bWJlciBvZiBRJ2VkIGNvbW1hbmQgYWxsb3dlZCAqLworICB1Y2hhciAgaXJxX25vOyAgICAgICAgICAvKiBJUlEgbnVtYmVyICovCisgIHVzaG9ydCBub19zY2FtOyAgICAgICAgIC8qIHNjYW1fdG9sZXJhbnQgb2YgRUVQUk9NICovCisgIHN0cnVjdCBhc2NfYm9hcmQgKmRydl9wdHI7IC8qIGRyaXZlciBwb2ludGVyIHRvIHByaXZhdGUgc3RydWN0dXJlICovCisgIHVjaGFyICBjaGlwX3Njc2lfaWQ7ICAgIC8qIGNoaXAgU0NTSSB0YXJnZXQgSUQgKi8KKyAgdWNoYXIgIGNoaXBfdHlwZTsKKyAgdWNoYXIgIGJpc3RfZXJyX2NvZGU7CisgIEFEVl9DQVJSX1QgKmNhcnJpZXJfYnVmOworICBBRFZfQ0FSUl9UICpjYXJyX2ZyZWVsaXN0OyAvKiBDYXJyaWVyIGZyZWUgbGlzdC4gKi8KKyAgQURWX0NBUlJfVCAqaWNxX3NwOyAgLyogSW5pdGlhdG9yIGNvbW1hbmQgcXVldWUgc3RvcHBlciBwb2ludGVyLiAqLworICBBRFZfQ0FSUl9UICppcnFfc3A7ICAvKiBJbml0aWF0b3IgcmVzcG9uc2UgcXVldWUgc3RvcHBlciBwb2ludGVyLiAqLworICB1c2hvcnQgY2Fycl9wZW5kaW5nX2NudDsgICAgLyogQ291bnQgb2YgcGVuZGluZyBjYXJyaWVycy4gKi8KKyAvKgorICAqIE5vdGU6IFRoZSBmb2xsb3dpbmcgZmllbGRzIHdpbGwgbm90IGJlIHVzZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uIFRoZQorICAqIGRyaXZlciBtYXkgZGlzY2FyZCB0aGUgYnVmZmVyIGFmdGVyIGluaXRpYWxpemF0aW9uIGlzIGRvbmUuCisgICovCisgIEFEVl9EVkNfQ0ZHICpjZmc7IC8qIHRlbXBvcmFyeSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAgKi8KK30gQURWX0RWQ19WQVI7CisKKyNkZWZpbmUgTk9fT0ZfU0dfUEVSX0JMT0NLICAgICAgICAgICAgICAxNQorCit0eXBlZGVmIHN0cnVjdCBhc2Nfc2dfYmxvY2sgeworICAgIHVjaGFyIHJlc2VydmVkMTsKKyAgICB1Y2hhciByZXNlcnZlZDI7CisgICAgdWNoYXIgcmVzZXJ2ZWQzOworICAgIHVjaGFyIHNnX2NudDsgICAgICAgICAgICAgICAgICAgICAvKiBWYWxpZCBlbnRyaWVzIGluIGJsb2NrLiAqLworICAgIEFEVl9QQUREUiBzZ19wdHI7ICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIG5leHQgc2cgYmxvY2suICovCisgICAgc3RydWN0ICB7CisgICAgICAgIEFEVl9QQUREUiBzZ19hZGRyOyAgICAgICAgICAgICAgICAgIC8qIFNHIGVsZW1lbnQgYWRkcmVzcy4gKi8KKyAgICAgICAgQURWX0RDTlQgIHNnX2NvdW50OyAgICAgICAgICAgICAgICAgLyogU0cgZWxlbWVudCBjb3VudC4gKi8KKyAgICB9IHNnX2xpc3RbTk9fT0ZfU0dfUEVSX0JMT0NLXTsKK30gQURWX1NHX0JMT0NLOworCisvKgorICogQURWX1NDU0lfUkVRX1EgLSBtaWNyb2NvZGUgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqCisgKiBBbGwgZmllbGRzIGluIHRoaXMgc3RydWN0dXJlIHVwIHRvIGJ5dGUgNjAgYXJlIHVzZWQgYnkgdGhlIG1pY3JvY29kZS4KKyAqIFRoZSBtaWNyb2NvZGUgbWFrZXMgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHNpemUgYW5kIG9yZGVyaW5nIG9mIGZpZWxkcworICogaW4gdGhpcyBzdHJ1Y3R1cmUuIERvIG5vdCBjaGFuZ2UgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uIGhlcmUgd2l0aG91dAorICogY29vcmRpbmF0aW5nIHRoZSBjaGFuZ2Ugd2l0aCB0aGUgbWljcm9jb2RlLgorICoKKyAqIEFsbCBmaWVsZHMgYWNjZXNzZWQgYnkgbWljcm9jb2RlIG11c3QgYmUgbWFpbnRhaW5lZCBpbiBsaXR0bGVfZW5kaWFuCisgKiBvcmRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWR2X3Njc2lfcmVxX3EgeworICAgIHVjaGFyICAgICAgIGNudGw7ICAgICAgICAgICAvKiBVY29kZSBmbGFncyBhbmQgc3RhdGUgKEFTQ19NQ19RQ18qKS4gKi8KKyAgICB1Y2hhciAgICAgICB0YXJnZXRfY21kOworICAgIHVjaGFyICAgICAgIHRhcmdldF9pZDsgICAgICAvKiBEZXZpY2UgdGFyZ2V0IGlkZW50aWZpZXIuICovCisgICAgdWNoYXIgICAgICAgdGFyZ2V0X2x1bjsgICAgIC8qIERldmljZSB0YXJnZXQgbG9naWNhbCB1bml0IG51bWJlci4gKi8KKyAgICBBRFZfUEFERFIgICBkYXRhX2FkZHI7ICAgICAgLyogRGF0YSBidWZmZXIgcGh5c2ljYWwgYWRkcmVzcy4gKi8KKyAgICBBRFZfRENOVCAgICBkYXRhX2NudDsgICAgICAgLyogRGF0YSBjb3VudC4gVWNvZGUgc2V0cyB0byByZXNpZHVhbC4gKi8KKyAgICBBRFZfUEFERFIgICBzZW5zZV9hZGRyOworICAgIEFEVl9QQUREUiAgIGNhcnJfcGE7CisgICAgdWNoYXIgICAgICAgbWZsYWc7CisgICAgdWNoYXIgICAgICAgc2Vuc2VfbGVuOworICAgIHVjaGFyICAgICAgIGNkYl9sZW47ICAgICAgICAvKiBTQ1NJIENEQiBsZW5ndGguIE11c3QgPD0gMTYgYnl0ZXMuICovCisgICAgdWNoYXIgICAgICAgc2NzaV9jbnRsOworICAgIHVjaGFyICAgICAgIGRvbmVfc3RhdHVzOyAgICAvKiBDb21wbGV0aW9uIHN0YXR1cy4gKi8KKyAgICB1Y2hhciAgICAgICBzY3NpX3N0YXR1czsgICAgLyogU0NTSSBzdGF0dXMgYnl0ZS4gKi8KKyAgICB1Y2hhciAgICAgICBob3N0X3N0YXR1czsgICAgLyogVWNvZGUgaG9zdCBzdGF0dXMuICovCisgICAgdWNoYXIgICAgICAgc2dfd29ya2luZ19peDsKKyAgICB1Y2hhciAgICAgICBjZGJbMTJdOyAgICAgICAgLyogU0NTSSBDREIgYnl0ZXMgMC0xMS4gKi8KKyAgICBBRFZfUEFERFIgICBzZ19yZWFsX2FkZHI7ICAgLyogU0cgbGlzdCBwaHlzaWNhbCBhZGRyZXNzLiAqLworICAgIEFEVl9QQUREUiAgIHNjc2lxX3JwdHI7CisgICAgdWNoYXIgICAgICAgY2RiMTZbNF07ICAgICAgIC8qIFNDU0kgQ0RCIGJ5dGVzIDEyLTE1LiAqLworICAgIEFEVl9WQUREUiAgIHNjc2lxX3B0cjsKKyAgICBBRFZfVkFERFIgICBjYXJyX3ZhOworICAgIC8qCisgICAgICogRW5kIG9mIG1pY3JvY29kZSBzdHJ1Y3R1cmUgLSA2MCBieXRlcy4gVGhlIHJlc3Qgb2YgdGhlIHN0cnVjdHVyZQorICAgICAqIGlzIHVzZWQgYnkgdGhlIEFkdiBMaWJyYXJ5IGFuZCBpZ25vcmVkIGJ5IHRoZSBtaWNyb2NvZGUuCisgICAgICovCisgICAgQURWX1ZBRERSICAgc3JiX3B0cjsKKyAgICBBRFZfU0dfQkxPQ0sgKnNnX2xpc3RfcHRyOyAvKiBTRyBsaXN0IHZpcnR1YWwgYWRkcmVzcy4gKi8KKyAgICBjaGFyICAgICAgICAqdmRhdGFfYWRkcjsgICAvKiBEYXRhIGJ1ZmZlciB2aXJ0dWFsIGFkZHJlc3MuICovCisgICAgdWNoYXIgICAgICAgYV9mbGFnOworICAgIHVjaGFyICAgICAgIHBhZFsyXTsgICAgICAgIC8qIFBhZCBvdXQgdG8gYSB3b3JkIGJvdW5kYXJ5LiAqLworfSBBRFZfU0NTSV9SRVFfUTsKKworLyoKKyAqIE1pY3JvY29kZSBpZGxlIGxvb3AgY29tbWFuZHMKKyAqLworI2RlZmluZSBJRExFX0NNRF9DT01QTEVURUQgICAgICAgICAgIDAKKyNkZWZpbmUgSURMRV9DTURfU1RPUF9DSElQICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgSURMRV9DTURfU1RPUF9DSElQX1NFTkRfSU5UICAweDAwMDIKKyNkZWZpbmUgSURMRV9DTURfU0VORF9JTlQgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgSURMRV9DTURfQUJPUlQgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgSURMRV9DTURfREVWSUNFX1JFU0VUICAgICAgICAweDAwMTAKKyNkZWZpbmUgSURMRV9DTURfU0NTSV9SRVNFVF9TVEFSVCAgICAweDAwMjAgLyogQXNzZXJ0IFNDU0kgQnVzIFJlc2V0ICovCisjZGVmaW5lIElETEVfQ01EX1NDU0lfUkVTRVRfRU5EICAgICAgMHgwMDQwIC8qIERlYXNzZXJ0IFNDU0kgQnVzIFJlc2V0ICovCisjZGVmaW5lIElETEVfQ01EX1NDU0lSRVEgICAgICAgICAgICAgMHgwMDgwCisKKyNkZWZpbmUgSURMRV9DTURfU1RBVFVTX1NVQ0NFU1MgICAgICAweDAwMDEKKyNkZWZpbmUgSURMRV9DTURfU1RBVFVTX0ZBSUxVUkUgICAgICAweDAwMDIKKworLyoKKyAqIEFkdlNlbmRJZGxlQ21kKCkgZmxhZyBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBBRFZfTk9XQUlUICAgICAweDAxCisKKy8qCisgKiBXYWl0IGxvb3AgdGltZSBvdXQgdmFsdWVzLgorICovCisjZGVmaW5lIFNDU0lfV0FJVF8xMF9TRUMgICAgICAgICAgICAgMTBVTCAgICAvKiAxMCBzZWNvbmRzICovCisjZGVmaW5lIFNDU0lfV0FJVF8xMDBfTVNFQyAgICAgICAgICAgMTAwVUwgICAvKiAxMDAgbWlsbGlzZWNvbmRzICovCisjZGVmaW5lIFNDU0lfVVNfUEVSX01TRUMgICAgICAgICAgICAgMTAwMCAgICAvKiBtaWNyb3NlY29uZHMgcGVyIG1pbGxpc2Vjb25kICovCisjZGVmaW5lIFNDU0lfTVNfUEVSX1NFQyAgICAgICAgICAgICAgMTAwMFVMICAvKiBtaWxsaXNlY29uZHMgcGVyIHNlY29uZCAqLworI2RlZmluZSBTQ1NJX01BWF9SRVRSWSAgICAgICAgICAgICAgIDEwICAgICAgLyogcmV0cnkgY291bnQgKi8KKworI2RlZmluZSBBRFZfQVNZTkNfUkRNQV9GQUlMVVJFICAgICAgICAgIDB4MDEgLyogRmF0YWwgUkRNQSBmYWlsdXJlLiAqLworI2RlZmluZSBBRFZfQVNZTkNfU0NTSV9CVVNfUkVTRVRfREVUICAgIDB4MDIgLyogRGV0ZWN0ZWQgU0NTSSBCdXMgUmVzZXQuICovCisjZGVmaW5lIEFEVl9BU1lOQ19DQVJSSUVSX1JFQURZX0ZBSUxVUkUgMHgwMyAvKiBDYXJyaWVyIFJlYWR5IGZhaWx1cmUuICovCisjZGVmaW5lIEFEVl9SRE1BX0lOX0NBUlJfQU5EX1FfSU5WQUxJRCAgMHgwNCAvKiBSRE1BZWQtaW4gZGF0YSBpbnZhbGlkLiAqLworCisKKyNkZWZpbmUgQURWX0hPU1RfU0NTSV9CVVNfUkVTRVQgICAgICAweDgwIC8qIEhvc3QgSW5pdGlhdGVkIFNDU0kgQnVzIFJlc2V0LiAqLworCisvKgorICogRGV2aWNlIGRyaXZlcnMgbXVzdCBkZWZpbmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMuCisgKi8KK1NUQVRJQyBpbmxpbmUgdWxvbmcgRHZjRW50ZXJDcml0aWNhbCh2b2lkKTsKK1NUQVRJQyBpbmxpbmUgdm9pZCAgRHZjTGVhdmVDcml0aWNhbCh1bG9uZyk7CitTVEFUSUMgdm9pZCAgRHZjU2xlZXBNaWxsaVNlY29uZChBRFZfRENOVCk7CitTVEFUSUMgdWNoYXIgRHZjQWR2UmVhZFBDSUNvbmZpZ0J5dGUoQURWX0RWQ19WQVIgKiwgdXNob3J0KTsKK1NUQVRJQyB2b2lkICBEdmNBZHZXcml0ZVBDSUNvbmZpZ0J5dGUoQURWX0RWQ19WQVIgKiwgdXNob3J0LCB1Y2hhcik7CitTVEFUSUMgQURWX1BBRERSIER2Y0dldFBoeUFkZHIoQURWX0RWQ19WQVIgKiwgQURWX1NDU0lfUkVRX1EgKiwKKyAgICAgICAgICAgICAgICB1Y2hhciAqLCBBU0NfU0RDTlQgKiwgaW50KTsKK1NUQVRJQyB2b2lkICBEdmNEZWxheU1pY3JvU2Vjb25kKEFEVl9EVkNfVkFSICosIHVzaG9ydCk7CisKKy8qCisgKiBBZHYgTGlicmFyeSBmdW5jdGlvbnMgYXZhaWxhYmxlIHRvIGRyaXZlcnMuCisgKi8KK1NUQVRJQyBpbnQgICAgIEFkdkV4ZVNjc2lRdWV1ZShBRFZfRFZDX1ZBUiAqLCBBRFZfU0NTSV9SRVFfUSAqKTsKK1NUQVRJQyBpbnQgICAgIEFkdklTUihBRFZfRFZDX1ZBUiAqKTsKK1NUQVRJQyBpbnQgICAgIEFkdkluaXRHZXRDb25maWcoQURWX0RWQ19WQVIgKik7CitTVEFUSUMgaW50ICAgICBBZHZJbml0QXNjMzU1MERyaXZlcihBRFZfRFZDX1ZBUiAqKTsKK1NUQVRJQyBpbnQgICAgIEFkdkluaXRBc2MzOEMwODAwRHJpdmVyKEFEVl9EVkNfVkFSICopOworU1RBVElDIGludCAgICAgQWR2SW5pdEFzYzM4QzE2MDBEcml2ZXIoQURWX0RWQ19WQVIgKik7CitTVEFUSUMgaW50ICAgICBBZHZSZXNldENoaXBBbmRTQihBRFZfRFZDX1ZBUiAqKTsKK1NUQVRJQyBpbnQgICAgIEFkdlJlc2V0U0IoQURWX0RWQ19WQVIgKmFzY19kdmMpOworCisvKgorICogSW50ZXJuYWwgQWR2IExpYnJhcnkgZnVuY3Rpb25zLgorICovCitTVEFUSUMgaW50ICAgIEFkdlNlbmRJZGxlQ21kKEFEVl9EVkNfVkFSICosIHVzaG9ydCwgQURWX0RDTlQpOworU1RBVElDIHZvaWQgICBBZHZJbnF1aXJ5SGFuZGxpbmcoQURWX0RWQ19WQVIgKiwgQURWX1NDU0lfUkVRX1EgKik7CitTVEFUSUMgaW50ICAgIEFkdkluaXRGcm9tMzU1MEVFUChBRFZfRFZDX1ZBUiAqKTsKK1NUQVRJQyBpbnQgICAgQWR2SW5pdEZyb20zOEMwODAwRUVQKEFEVl9EVkNfVkFSICopOworU1RBVElDIGludCAgICBBZHZJbml0RnJvbTM4QzE2MDBFRVAoQURWX0RWQ19WQVIgKik7CitTVEFUSUMgdXNob3J0IEFkdkdldDM1NTBFRVBDb25maWcoQWR2UG9ydEFkZHIsIEFEVkVFUF8zNTUwX0NPTkZJRyAqKTsKK1NUQVRJQyB2b2lkICAgQWR2U2V0MzU1MEVFUENvbmZpZyhBZHZQb3J0QWRkciwgQURWRUVQXzM1NTBfQ09ORklHICopOworU1RBVElDIHVzaG9ydCBBZHZHZXQzOEMwODAwRUVQQ29uZmlnKEFkdlBvcnRBZGRyLCBBRFZFRVBfMzhDMDgwMF9DT05GSUcgKik7CitTVEFUSUMgdm9pZCAgIEFkdlNldDM4QzA4MDBFRVBDb25maWcoQWR2UG9ydEFkZHIsIEFEVkVFUF8zOEMwODAwX0NPTkZJRyAqKTsKK1NUQVRJQyB1c2hvcnQgQWR2R2V0MzhDMTYwMEVFUENvbmZpZyhBZHZQb3J0QWRkciwgQURWRUVQXzM4QzE2MDBfQ09ORklHICopOworU1RBVElDIHZvaWQgICBBZHZTZXQzOEMxNjAwRUVQQ29uZmlnKEFkdlBvcnRBZGRyLCBBRFZFRVBfMzhDMTYwMF9DT05GSUcgKik7CitTVEFUSUMgdm9pZCAgIEFkdldhaXRFRVBDbWQoQWR2UG9ydEFkZHIpOworU1RBVElDIHVzaG9ydCBBZHZSZWFkRUVQV29yZChBZHZQb3J0QWRkciwgaW50KTsKKworLyoKKyAqIFBDSSBCdXMgRGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBBc2NQQ0lDbWRSZWdCaXRzX0J1c01hc3RlcmluZyAgICAgMHgwMDA3CisjZGVmaW5lIEFzY1BDSUNtZFJlZ0JpdHNfUGFyRXJyUmVzcEN0cmwgICAweDAwNDAKKworLyogUmVhZCBieXRlIGZyb20gYSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQWR2UmVhZEJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgcmVnX29mZikgXAorICAgICAoQURWX01FTV9SRUFEQigoaW9wX2Jhc2UpICsgKHJlZ19vZmYpKSkKKworLyogV3JpdGUgYnl0ZSB0byBhIHJlZ2lzdGVyLiAqLworI2RlZmluZSBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgcmVnX29mZiwgYnl0ZSkgXAorICAgICAoQURWX01FTV9XUklURUIoKGlvcF9iYXNlKSArIChyZWdfb2ZmKSwgKGJ5dGUpKSkKKworLyogUmVhZCB3b3JkICgyIGJ5dGVzKSBmcm9tIGEgcmVnaXN0ZXIuICovCisjZGVmaW5lIEFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIHJlZ19vZmYpIFwKKyAgICAgKEFEVl9NRU1fUkVBRFcoKGlvcF9iYXNlKSArIChyZWdfb2ZmKSkpCisKKy8qIFdyaXRlIHdvcmQgKDIgYnl0ZXMpIHRvIGEgcmVnaXN0ZXIuICovCisjZGVmaW5lIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCByZWdfb2ZmLCB3b3JkKSBcCisgICAgIChBRFZfTUVNX1dSSVRFVygoaW9wX2Jhc2UpICsgKHJlZ19vZmYpLCAod29yZCkpKQorCisvKiBXcml0ZSBkd29yZCAoNCBieXRlcykgdG8gYSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQWR2V3JpdGVEV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCByZWdfb2ZmLCBkd29yZCkgXAorICAgICAoQURWX01FTV9XUklURURXKChpb3BfYmFzZSkgKyAocmVnX29mZiksIChkd29yZCkpKQorCisvKiBSZWFkIGJ5dGUgZnJvbSBMUkFNLiAqLworI2RlZmluZSBBZHZSZWFkQnl0ZUxyYW0oaW9wX2Jhc2UsIGFkZHIsIGJ5dGUpIFwKK2RvIHsgXAorICAgIEFEVl9NRU1fV1JJVEVXKChpb3BfYmFzZSkgKyBJT1BXX1JBTV9BRERSLCAoYWRkcikpOyBcCisgICAgKGJ5dGUpID0gQURWX01FTV9SRUFEQigoaW9wX2Jhc2UpICsgSU9QQl9SQU1fREFUQSk7IFwKK30gd2hpbGUgKDApCisKKy8qIFdyaXRlIGJ5dGUgdG8gTFJBTS4gKi8KKyNkZWZpbmUgQWR2V3JpdGVCeXRlTHJhbShpb3BfYmFzZSwgYWRkciwgYnl0ZSkgXAorICAgIChBRFZfTUVNX1dSSVRFVygoaW9wX2Jhc2UpICsgSU9QV19SQU1fQUREUiwgKGFkZHIpKSwgXAorICAgICBBRFZfTUVNX1dSSVRFQigoaW9wX2Jhc2UpICsgSU9QQl9SQU1fREFUQSwgKGJ5dGUpKSkKKworLyogUmVhZCB3b3JkICgyIGJ5dGVzKSBmcm9tIExSQU0uICovCisjZGVmaW5lIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgYWRkciwgd29yZCkgXAorZG8geyBcCisgICAgQURWX01FTV9XUklURVcoKGlvcF9iYXNlKSArIElPUFdfUkFNX0FERFIsIChhZGRyKSk7IFwKKyAgICAod29yZCkgPSAoQURWX01FTV9SRUFEVygoaW9wX2Jhc2UpICsgSU9QV19SQU1fREFUQSkpOyBcCit9IHdoaWxlICgwKQorCisvKiBXcml0ZSB3b3JkICgyIGJ5dGVzKSB0byBMUkFNLiAqLworI2RlZmluZSBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBhZGRyLCB3b3JkKSBcCisgICAgKEFEVl9NRU1fV1JJVEVXKChpb3BfYmFzZSkgKyBJT1BXX1JBTV9BRERSLCAoYWRkcikpLCBcCisgICAgIEFEVl9NRU1fV1JJVEVXKChpb3BfYmFzZSkgKyBJT1BXX1JBTV9EQVRBLCAod29yZCkpKQorCisvKiBXcml0ZSBsaXR0bGUtZW5kaWFuIGRvdWJsZSB3b3JkICg0IGJ5dGVzKSB0byBMUkFNICovCisvKiBCZWNhdXNlIG9mIHVuc3BlY2lmaWVkIEMgbGFuZ3VhZ2Ugb3JkZXJpbmcgZG9uJ3QgdXNlIGF1dG8taW5jcmVtZW50LiAqLworI2RlZmluZSBBZHZXcml0ZURXb3JkTHJhbU5vU3dhcChpb3BfYmFzZSwgYWRkciwgZHdvcmQpIFwKKyAgICAoKEFEVl9NRU1fV1JJVEVXKChpb3BfYmFzZSkgKyBJT1BXX1JBTV9BRERSLCAoYWRkcikpLCBcCisgICAgICBBRFZfTUVNX1dSSVRFVygoaW9wX2Jhc2UpICsgSU9QV19SQU1fREFUQSwgXAorICAgICAgICAgICAgICAgICAgICAgY3B1X3RvX2xlMTYoKHVzaG9ydCkgKChkd29yZCkgJiAweEZGRkYpKSkpLCBcCisgICAgIChBRFZfTUVNX1dSSVRFVygoaW9wX2Jhc2UpICsgSU9QV19SQU1fQUREUiwgKGFkZHIpICsgMiksIFwKKyAgICAgIEFEVl9NRU1fV1JJVEVXKChpb3BfYmFzZSkgKyBJT1BXX1JBTV9EQVRBLCBcCisgICAgICAgICAgICAgICAgICAgICBjcHVfdG9fbGUxNigodXNob3J0KSAoKGR3b3JkID4+IDE2KSAmIDB4RkZGRikpKSkpCisKKy8qIFJlYWQgd29yZCAoMiBieXRlcykgZnJvbSBMUkFNIGFzc3VtaW5nIHRoYXQgdGhlIGFkZHJlc3MgaXMgYWxyZWFkeSBzZXQuICovCisjZGVmaW5lIEFkdlJlYWRXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UpIFwKKyAgICAgKEFEVl9NRU1fUkVBRFcoKGlvcF9iYXNlKSArIElPUFdfUkFNX0RBVEEpKQorCisvKiBXcml0ZSB3b3JkICgyIGJ5dGVzKSB0byBMUkFNIGFzc3VtaW5nIHRoYXQgdGhlIGFkZHJlc3MgaXMgYWxyZWFkeSBzZXQuICovCisjZGVmaW5lIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCB3b3JkKSBcCisgICAgIChBRFZfTUVNX1dSSVRFVygoaW9wX2Jhc2UpICsgSU9QV19SQU1fREFUQSwgKHdvcmQpKSkKKworCisvKgorICogRGVmaW5lIG1hY3JvIHRvIGNoZWNrIGZvciBDb25kb3Igc2lnbmF0dXJlLgorICoKKyAqIEV2YWx1YXRlIHRvIEFEVl9UUlVFIGlmIGEgQ29uZG9yIGNoaXAgaXMgZm91bmQgdGhlIHNwZWNpZmllZCBwb3J0CisgKiBhZGRyZXNzICdpb3BfYmFzZScuIE90aGVyd2lzZSBldmFsdWUgdG8gQURWX0ZBTFNFLgorICovCisjZGVmaW5lIEFkdkZpbmRTaWduYXR1cmUoaW9wX2Jhc2UpIFwKKyAgICAoKChBZHZSZWFkQnl0ZVJlZ2lzdGVyKChpb3BfYmFzZSksIElPUEJfQ0hJUF9JRF8xKSA9PSBcCisgICAgQURWX0NISVBfSURfQllURSkgJiYgXAorICAgICAoQWR2UmVhZFdvcmRSZWdpc3RlcigoaW9wX2Jhc2UpLCBJT1BXX0NISVBfSURfMCkgPT0gXAorICAgIEFEVl9DSElQX0lEX1dPUkQpKSA/ICBBRFZfVFJVRSA6IEFEVl9GQUxTRSkKKworLyoKKyAqIERlZmluZSBtYWNybyB0byBSZXR1cm4gdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBjaGlwIGF0ICdpb3BfYmFzZScuCisgKgorICogVGhlIHNlY29uZCBwYXJhbWV0ZXIgJ2J1c190eXBlJyBpcyBjdXJyZW50bHkgdW51c2VkLgorICovCisjZGVmaW5lIEFkdkdldENoaXBWZXJzaW9uKGlvcF9iYXNlLCBidXNfdHlwZSkgXAorICAgIEFkdlJlYWRCeXRlUmVnaXN0ZXIoKGlvcF9iYXNlKSwgSU9QQl9DSElQX1RZUEVfUkVWKQorCisvKgorICogQWJvcnQgYW4gU1JCIGluIHRoZSBjaGlwJ3MgUklTQyBNZW1vcnkuIFRoZSAnc3JiX3B0cicgYXJndW1lbnQgbXVzdAorICogbWF0Y2ggdGhlIEFTQ19TQ1NJX1JFUV9RICdzcmJfcHRyJyBmaWVsZC4KKyAqCisgKiBJZiB0aGUgcmVxdWVzdCBoYXMgbm90IHlldCBiZWVuIHNlbnQgdG8gdGhlIGRldmljZSBpdCB3aWxsIHNpbXBseSBiZQorICogYWJvcnRlZCBmcm9tIFJJU0MgbWVtb3J5LiBJZiB0aGUgcmVxdWVzdCBpcyBkaXNjb25uZWN0ZWQgaXQgd2lsbCBiZQorICogYWJvcnRlZCBvbiByZXNlbGVjdGlvbiBieSBzZW5kaW5nIGFuIEFib3J0IE1lc3NhZ2UgdG8gdGhlIHRhcmdldCBJRC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAgICAgIEFEVl9UUlVFKDEpIC0gUXVldWUgd2FzIHN1Y2Nlc3NmdWxseSBhYm9ydGVkLgorICogICAgICBBRFZfRkFMU0UoMCkgLSBRdWV1ZSB3YXMgbm90IGZvdW5kIG9uIHRoZSBhY3RpdmUgcXVldWUgbGlzdC4KKyAqLworI2RlZmluZSBBZHZBYm9ydFF1ZXVlKGFzY19kdmMsIHNjc2lxKSBcCisgICAgICAgIEFkdlNlbmRJZGxlQ21kKChhc2NfZHZjKSwgKHVzaG9ydCkgSURMRV9DTURfQUJPUlQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgKEFEVl9EQ05UKSAoc2NzaXEpKQorCisvKgorICogU2VuZCBhIEJ1cyBEZXZpY2UgUmVzZXQgTWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIHRhcmdldCBJRC4KKyAqCisgKiBBbGwgb3V0c3RhbmRpbmcgY29tbWFuZHMgd2lsbCBiZSBwdXJnZWQgaWYgc2VuZGluZyB0aGUKKyAqIEJ1cyBEZXZpY2UgUmVzZXQgTWVzc2FnZSBpcyBzdWNjZXNzZnVsLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgICAgQURWX1RSVUUoMSkgLSBBbGwgcmVxdWVzdHMgb24gdGhlIHRhcmdldCBhcmUgcHVyZ2VkLgorICogICAgICBBRFZfRkFMU0UoMCkgLSBDb3VsZG4ndCBpc3N1ZSBCdXMgRGV2aWNlIFJlc2V0IE1lc3NhZ2U7IFJlcXVlc3RzCisgKiAgICAgICAgICAgICAgICAgICAgIGFyZSBub3QgcHVyZ2VkLgorICovCisjZGVmaW5lIEFkdlJlc2V0RGV2aWNlKGFzY19kdmMsIHRhcmdldF9pZCkgXAorICAgICAgICBBZHZTZW5kSWRsZUNtZCgoYXNjX2R2YyksICh1c2hvcnQpIElETEVfQ01EX0RFVklDRV9SRVNFVCwgXAorICAgICAgICAgICAgICAgICAgICAoQURWX0RDTlQpICh0YXJnZXRfaWQpKQorCisvKgorICogU0NTSSBXaWRlIFR5cGUgZGVmaW5pdGlvbi4KKyAqLworI2RlZmluZSBBRFZfU0NTSV9CSVRfSURfVFlQRSAgIHVzaG9ydAorCisvKgorICogQWR2SW5pdFNjc2lUYXJnZXQoKSAnY250bF9mbGFnJyBvcHRpb25zLgorICovCisjZGVmaW5lIEFEVl9TQ0FOX0xVTiAgICAgICAgICAgMHgwMQorI2RlZmluZSBBRFZfQ0FQSU5GT19OT0xVTiAgICAgIDB4MDIKKworLyoKKyAqIENvbnZlcnQgdGFyZ2V0IGlkIHRvIHRhcmdldCBpZCBiaXQgbWFzay4KKyAqLworI2RlZmluZSBBRFZfVElEX1RPX1RJRE1BU0sodGlkKSAgICgweDAxIDw8ICgodGlkKSAmIEFEVl9NQVhfVElEKSkKKworLyoKKyAqIEFTQ19TQ1NJX1JFUV9RICdkb25lX3N0YXR1cycgYW5kICdob3N0X3N0YXR1cycgcmV0dXJuIHZhbHVlcy4KKyAqLworCisjZGVmaW5lIFFEX05PX1NUQVRVUyAgICAgICAgIDB4MDAgICAgICAgLyogUmVxdWVzdCBub3QgY29tcGxldGVkIHlldC4gKi8KKyNkZWZpbmUgUURfTk9fRVJST1IgICAgICAgICAgMHgwMQorI2RlZmluZSBRRF9BQk9SVEVEX0JZX0hPU1QgICAweDAyCisjZGVmaW5lIFFEX1dJVEhfRVJST1IgICAgICAgIDB4MDQKKworI2RlZmluZSBRSFNUQV9OT19FUlJPUiAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBRSFNUQV9NX1NFTF9USU1FT1VUICAgICAgICAgMHgxMQorI2RlZmluZSBRSFNUQV9NX0RBVEFfT1ZFUl9SVU4gICAgICAgMHgxMgorI2RlZmluZSBRSFNUQV9NX1VORVhQRUNURURfQlVTX0ZSRUUgMHgxMworI2RlZmluZSBRSFNUQV9NX1FVRVVFX0FCT1JURUQgICAgICAgMHgxNQorI2RlZmluZSBRSFNUQV9NX1NYRlJfU0RNQV9FUlIgICAgICAgMHgxNiAvKiBTWEZSX1NUQVRVUyBTQ1NJIERNQSBFcnJvciAqLworI2RlZmluZSBRSFNUQV9NX1NYRlJfU1hGUl9QRVJSICAgICAgMHgxNyAvKiBTWEZSX1NUQVRVUyBTQ1NJIEJ1cyBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUgUUhTVEFfTV9SRE1BX1BFUlIgICAgICAgICAgIDB4MTggLyogUklTQyBQQ0kgRE1BIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBRSFNUQV9NX1NYRlJfT0ZGX1VGTFcgICAgICAgMHgxOSAvKiBTWEZSX1NUQVRVUyBPZmZzZXQgVW5kZXJmbG93ICovCisjZGVmaW5lIFFIU1RBX01fU1hGUl9PRkZfT0ZMVyAgICAgICAweDIwIC8qIFNYRlJfU1RBVFVTIE9mZnNldCBPdmVyZmxvdyAqLworI2RlZmluZSBRSFNUQV9NX1NYRlJfV0RfVE1PICAgICAgICAgMHgyMSAvKiBTWEZSX1NUQVRVUyBXYXRjaGRvZyBUaW1lb3V0ICovCisjZGVmaW5lIFFIU1RBX01fU1hGUl9ERVNFTEVDVEVEICAgICAweDIyIC8qIFNYRlJfU1RBVFVTIERlc2VsZWN0ZWQgKi8KKy8qIE5vdGU6IFFIU1RBX01fU1hGUl9YRlJfT0ZMVyBpcyBpZGVudGljYWwgdG8gUUhTVEFfTV9EQVRBX09WRVJfUlVOLiAqLworI2RlZmluZSBRSFNUQV9NX1NYRlJfWEZSX09GTFcgICAgICAgMHgxMiAvKiBTWEZSX1NUQVRVUyBUcmFuc2ZlciBPdmVyZmxvdyAqLworI2RlZmluZSBRSFNUQV9NX1NYRlJfWEZSX1BIX0VSUiAgICAgMHgyNCAvKiBTWEZSX1NUQVRVUyBUcmFuc2ZlciBQaGFzZSBFcnJvciAqLworI2RlZmluZSBRSFNUQV9NX1NYRlJfVU5LTk9XTl9FUlJPUiAgMHgyNSAvKiBTWEZSX1NUQVRVUyBVbmtub3duIEVycm9yICovCisjZGVmaW5lIFFIU1RBX01fU0NTSV9CVVNfUkVTRVQgICAgICAweDMwIC8qIFJlcXVlc3QgYWJvcnRlZCBmcm9tIFNCUiAqLworI2RlZmluZSBRSFNUQV9NX1NDU0lfQlVTX1JFU0VUX1VOU09MIDB4MzEgLyogUmVxdWVzdCBhYm9ydGVkIGZyb20gdW5zb2wuIFNCUiAqLworI2RlZmluZSBRSFNUQV9NX0JVU19ERVZJQ0VfUkVTRVQgICAgMHgzMiAvKiBSZXF1ZXN0IGFib3J0ZWQgZnJvbSBCRFIgKi8KKyNkZWZpbmUgUUhTVEFfTV9ESVJFQ1RJT05fRVJSICAgICAgIDB4MzUgLyogRGF0YSBQaGFzZSBtaXNtYXRjaCAqLworI2RlZmluZSBRSFNUQV9NX0RJUkVDVElPTl9FUlJfSFVORyAgMHgzNiAvKiBEYXRhIFBoYXNlIG1pc21hdGNoIGFuZCBidXMgaGFuZyAqLworI2RlZmluZSBRSFNUQV9NX1dUTV9USU1FT1VUICAgICAgICAgMHg0MQorI2RlZmluZSBRSFNUQV9NX0JBRF9DTVBMX1NUQVRVU19JTiAgMHg0MgorI2RlZmluZSBRSFNUQV9NX05PX0FVVE9fUkVRX1NFTlNFICAgMHg0MworI2RlZmluZSBRSFNUQV9NX0FVVE9fUkVRX1NFTlNFX0ZBSUwgMHg0NAorI2RlZmluZSBRSFNUQV9NX0lOVkFMSURfREVWSUNFICAgICAgMHg0NSAvKiBCYWQgdGFyZ2V0IElEICovCisjZGVmaW5lIFFIU1RBX01fRlJPWkVOX1RJRFEgICAgICAgICAweDQ2IC8qIFRJRCBRdWV1ZSBmcm96ZW4uICovCisjZGVmaW5lIFFIU1RBX01fU0dCQUNLVVBfRVJST1IgICAgICAweDQ3IC8qIFNjYXR0ZXItR2F0aGVyIGJhY2t1cCBlcnJvciAqLworCisKKy8qCisgKiBEZWZhdWx0IEVFUFJPTSBDb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbmVkIGluIGFfaW5pdC5jLgorICovCitzdGF0aWMgQURWRUVQXzM1NTBfQ09ORklHIERlZmF1bHRfMzU1MF9FRVBST01fQ29uZmlnOworc3RhdGljIEFEVkVFUF8zOEMwODAwX0NPTkZJRyBEZWZhdWx0XzM4QzA4MDBfRUVQUk9NX0NvbmZpZzsKK3N0YXRpYyBBRFZFRVBfMzhDMTYwMF9DT05GSUcgRGVmYXVsdF8zOEMxNjAwX0VFUFJPTV9Db25maWc7CisKKy8qCisgKiBEdmNHZXRQaHlBZGRyKCkgZmxhZyBhcmd1bWVudHMKKyAqLworI2RlZmluZSBBRFZfSVNfU0NTSVFfRkxBRyAgICAgICAweDAxIC8qICdhZGRyJyBpcyBBU0NfU0NTSV9SRVFfUSBwb2ludGVyICovCisjZGVmaW5lIEFEVl9BU0NHRVRTR0xJU1RfVkFERFIgIDB4MDIgLyogJ2FkZHInIGlzIEFzY0dldFNHTGlzdCgpIHZpcnR1YWwgYWRkciAqLworI2RlZmluZSBBRFZfSVNfU0VOU0VfRkxBRyAgICAgICAweDA0IC8qICdhZGRyJyBpcyBzZW5zZSB2aXJ0dWFsIHBvaW50ZXIgKi8KKyNkZWZpbmUgQURWX0lTX0RBVEFfRkxBRyAgICAgICAgMHgwOCAvKiAnYWRkcicgaXMgZGF0YSB2aXJ0dWFsIHBvaW50ZXIgKi8KKyNkZWZpbmUgQURWX0lTX1NHTElTVF9GTEFHICAgICAgMHgxMCAvKiAnYWRkcicgaXMgc2dsaXN0IHZpcnR1YWwgcG9pbnRlciAqLworI2RlZmluZSBBRFZfSVNfQ0FSUklFUl9GTEFHICAgICAweDIwIC8qICdhZGRyJyBpcyBBRFZfQ0FSUl9UIHBvaW50ZXIgKi8KKworLyogUmV0dXJuIHRoZSBhZGRyZXNzIHRoYXQgaXMgYWxpZ25lZCBhdCB0aGUgbmV4dCBkb3VibGV3b3JkID49IHRvICdhZGRyJy4gKi8KKyNkZWZpbmUgQURWXzhCQUxJR04oYWRkcikgICAgICAoKCh1bG9uZykgKGFkZHIpICsgMHg3KSAmIH4weDcpCisjZGVmaW5lIEFEVl8xNkJBTElHTihhZGRyKSAgICAgKCgodWxvbmcpIChhZGRyKSArIDB4RikgJiB+MHhGKQorI2RlZmluZSBBRFZfMzJCQUxJR04oYWRkcikgICAgICgoKHVsb25nKSAoYWRkcikgKyAweDFGKSAmIH4weDFGKQorCisvKgorICogVG90YWwgY29udGlndW91cyBtZW1vcnkgbmVlZGVkIGZvciBkcml2ZXIgU0cgYmxvY2tzLgorICoKKyAqIEFEVl9NQVhfU0dfTElTVCBtdXN0IGJlIGRlZmluZWQgYnkgYSBkcml2ZXIuIEl0IGlzIHRoZSBtYXhpbXVtCisgKiBudW1iZXIgb2Ygc2NhdHRlci1nYXRoZXIgZWxlbWVudHMgdGhlIGRyaXZlciBzdXBwb3J0cyBpbiBhCisgKiBzaW5nbGUgcmVxdWVzdC4KKyAqLworCisjZGVmaW5lIEFEVl9TR19MSVNUX01BWF9CWVRFX1NJWkUgXAorICAgICAgICAgKHNpemVvZihBRFZfU0dfQkxPQ0spICogXAorICAgICAgICAgICgoQURWX01BWF9TR19MSVNUICsgKE5PX09GX1NHX1BFUl9CTE9DSyAtIDEpKS9OT19PRl9TR19QRVJfQkxPQ0spKQorCisvKgorICogSW5xdWlyeSBkYXRhIHN0cnVjdHVyZSBhbmQgYml0ZmllbGQgbWFjcm9zCisgKgorICogVXNpbmcgYml0ZmllbGRzIHRvIGFjY2VzcyB0aGUgc3ViY2hhciBkYXRhIGlzbid0IHBvcnRhYmxlIGFjcm9zcworICogZW5kaWFubmVzcywgc28gaW5zdGVhZCBtYXNrIGFuZCBzaGlmdC4gT25seSBxdWFudGl0aWVzIG9mIG1vcmUKKyAqIHRoYW4gMSBiaXQgYXJlIHNoaWZ0ZWQsIHNpbmNlIHRoZSBvdGhlcnMgYXJlIGp1c3QgdGVzdGVkIGZvciB0cnVlCisgKiBvciBmYWxzZS4KKyAqLworCisjZGVmaW5lIEFEVl9JTlFfRFZDX1RZUEUoaW5xKSAgICAgICAoKGlucSktPnBlcmlwaCAmIDB4MWYpCisjZGVmaW5lIEFEVl9JTlFfUVVBTElGSUVSKGlucSkgICAgICAoKChpbnEpLT5wZXJpcGggJiAweGUwKSA+PiA1KQorI2RlZmluZSBBRFZfSU5RX0RWQ19UWVBFX01PRChpbnEpICAgKChpbnEpLT5kZXZ0eXBlICYgMHg3ZikKKyNkZWZpbmUgQURWX0lOUV9SRU1PVkFCTEUoaW5xKSAgICAgICgoaW5xKS0+ZGV2dHlwZSAmIDB4ODApCisjZGVmaW5lIEFEVl9JTlFfQU5TSV9WRVIoaW5xKSAgICAgICAoKGlucSktPnZlciAmIDB4MDcpCisjZGVmaW5lIEFEVl9JTlFfRUNNQV9WRVIoaW5xKSAgICAgICAoKChpbnEpLT52ZXIgJiAweDM4KSA+PiAzKQorI2RlZmluZSBBRFZfSU5RX0lTT19WRVIoaW5xKSAgICAgICAgKCgoaW5xKS0+dmVyICYgMHhjMCkgPj4gNikKKyNkZWZpbmUgQURWX0lOUV9SRVNQT05TRV9GTVQoaW5xKSAgICgoaW5xKS0+Ynl0ZTMgJiAweDBmKQorI2RlZmluZSBBRFZfSU5RX1RFUk1fSU8oaW5xKSAgICAgICAgKChpbnEpLT5ieXRlMyAmIDB4NDApCisjZGVmaW5lIEFEVl9JTlFfQVNZTkNfTk9USUYoaW5xKSAgICAoKGlucSktPmJ5dGUzICYgMHg4MCkKKyNkZWZpbmUgQURWX0lOUV9TT0ZUX1JFU0VUKGlucSkgICAgICgoaW5xKS0+ZmxhZ3MgJiAweDAxKQorI2RlZmluZSBBRFZfSU5RX0NNRF9RVUVVRShpbnEpICAgICAgKChpbnEpLT5mbGFncyAmIDB4MDIpCisjZGVmaW5lIEFEVl9JTlFfTElOS19DTUQoaW5xKSAgICAgICAoKGlucSktPmZsYWdzICYgMHgwOCkKKyNkZWZpbmUgQURWX0lOUV9TWU5DKGlucSkgICAgICAgICAgICgoaW5xKS0+ZmxhZ3MgJiAweDEwKQorI2RlZmluZSBBRFZfSU5RX1dJREUxNihpbnEpICAgICAgICAgKChpbnEpLT5mbGFncyAmIDB4MjApCisjZGVmaW5lIEFEVl9JTlFfV0lERTMyKGlucSkgICAgICAgICAoKGlucSktPmZsYWdzICYgMHg0MCkKKyNkZWZpbmUgQURWX0lOUV9SRUxfQUREUihpbnEpICAgICAgICgoaW5xKS0+ZmxhZ3MgJiAweDgwKQorI2RlZmluZSBBRFZfSU5RX0lORk9fVU5JVChpbnEpICAgICAgKChpbnEpLT5pbmZvICYgMHgwMSkKKyNkZWZpbmUgQURWX0lOUV9RVUlDS19BUkIoaW5xKSAgICAgICgoaW5xKS0+aW5mbyAmIDB4MDIpCisjZGVmaW5lIEFEVl9JTlFfQ0xPQ0tJTkcoaW5xKSAgICAgICAoKChpbnEpLT5pbmZvICYgMHgwYykgPj4gMikKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1Y2hhciBwZXJpcGg7ICAgICAgICAgICAgICAgICAvKiBwZXJpcGhlcmFsIGRldmljZSB0eXBlIFswOjRdICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmlwaGVyYWwgcXVhbGlmaWVyIFs1OjddICovCisgIHVjaGFyIGRldnR5cGU7ICAgICAgICAgICAgICAgIC8qIGRldmljZSB0eXBlIG1vZGlmaWVyIChmb3IgU0NTSSBJKSBbMDo2XSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSTUIgLSByZW1vdmFibGUgbWVkaXVtIGJpdCBbN10gKi8KKyAgdWNoYXIgdmVyOyAgICAgICAgICAgICAgICAgICAgLyogQU5TSSBhcHByb3ZlZCB2ZXJzaW9uIFswOjJdICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVDTUEgdmVyc2lvbiBbMzo1XSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJU08gdmVyc2lvbiBbNjo3XSAqLworICB1Y2hhciBieXRlMzsgICAgICAgICAgICAgICAgICAvKiByZXNwb25zZSBkYXRhIGZvcm1hdCBbMDozXSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwIFNDU0kgMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxIENDUyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyIFNDU0ktMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzLUYgcmVzZXJ2ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgWzQ6NV0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVybWluYXRlIEkvTyBwcm9jZXNzIGJpdCAoc2VlIDUuNi4yMikgWzZdICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFzeW5jaC4gZXZlbnQgbm90aWZpY2F0aW9uIChwcm9jZXNzb3IpIFs3XSAqLworICB1Y2hhciBhZGRfbGVuOyAgICAgICAgICAgICAgICAvKiBhZGRpdGlvbmFsIGxlbmd0aCAqLworICB1Y2hhciByZXMxOyAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCAqLworICB1Y2hhciByZXMyOyAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCAqLworICB1Y2hhciBmbGFnczsgICAgICAgICAgICAgICAgICAvKiBzb2Z0IHJlc2V0IGltcGxlbWVudGVkIFswXSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIHF1ZXVpbmcgWzFdICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkIFsyXSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaW5rZWQgY29tbWFuZCBmb3IgdGhpcyBsb2dpY2FsIHVuaXQgWzNdICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXIgWzRdICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdpZGUgYnVzIDE2IGJpdCBkYXRhIHRyYW5zZmVyIFs1XSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aWRlIGJ1cyAzMiBiaXQgZGF0YSB0cmFuc2ZlciBbNl0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlIFs3XSAqLworICB1Y2hhciB2ZW5kb3JfaWRbOF07ICAgICAgICAgICAvKiB2ZW5kb3IgaWRlbnRpZmljYXRpb24gKi8KKyAgdWNoYXIgcHJvZHVjdF9pZFsxNl07ICAgICAgICAgLyogcHJvZHVjdCBpZGVudGlmaWNhdGlvbiAqLworICB1Y2hhciBwcm9kdWN0X3Jldl9sZXZlbFs0XTsgICAvKiBwcm9kdWN0IHJldmlzaW9uIGxldmVsICovCisgIHVjaGFyIHZlbmRvcl9zcGVjaWZpY1syMF07ICAgIC8qIHZlbmRvciBzcGVjaWZpYyAqLworICB1Y2hhciBpbmZvOyAgICAgICAgICAgICAgICAgICAvKiBpbmZvcm1hdGlvbiB1bml0IHN1cHBvcnRlZCBbMF0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXVpY2sgYXJiaXRyYXRlIHN1cHBvcnRlZCBbMV0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xvY2tpbmcgZmllbGQgWzI6M10gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgWzQ6N10gKi8KKyAgdWNoYXIgcmVzMzsgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgKi8KK30gQURWX1NDU0lfSU5RVUlSWTsgLyogNTggYnl0ZXMgKi8KKworCisvKgorICogLS0tIERyaXZlciBDb25zdGFudHMgYW5kIE1hY3JvcworICovCisKKyNkZWZpbmUgQVNDX05VTV9CT0FSRF9TVVBQT1JURUQgMTYKKyNkZWZpbmUgQVNDX05VTV9JT1BPUlRfUFJPQkUgICAgNAorI2RlZmluZSBBU0NfTlVNX0JVUyAgICAgICAgICAgICA0CisKKy8qIFJlZmVyZW5jZSBTY3NpX0hvc3QgaG9zdGRhdGEgKi8KKyNkZWZpbmUgQVNDX0JPQVJEUChob3N0KSAoKGFzY19ib2FyZF90ICopICYoKGhvc3QpLT5ob3N0ZGF0YSkpCisKKy8qIGFzY19ib2FyZF90IGZsYWdzICovCisjZGVmaW5lIEFTQ19IT1NUX0lOX1JFU0VUICAgICAgIDB4MDEKKyNkZWZpbmUgQVNDX0lTX1dJREVfQk9BUkQgICAgICAgMHgwNCAgICAvKiBBZHZhblN5cyBXaWRlIEJvYXJkICovCisjZGVmaW5lIEFTQ19TRUxFQ1RfUVVFVUVfREVQVEhTIDB4MDgKKworI2RlZmluZSBBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkgKCgoYm9hcmRwKS0+ZmxhZ3MgJiBBU0NfSVNfV0lERV9CT0FSRCkgPT0gMCkKKyNkZWZpbmUgQVNDX1dJREVfQk9BUkQoYm9hcmRwKSAgICgoYm9hcmRwKS0+ZmxhZ3MgJiBBU0NfSVNfV0lERV9CT0FSRCkKKworI2RlZmluZSBOT19JU0FfRE1BICAgICAgICAgICAgICAweGZmICAgICAgICAvKiBObyBJU0EgRE1BIENoYW5uZWwgVXNlZCAqLworCisjZGVmaW5lIEFTQ19JTkZPX1NJWkUgICAgICAgICAgIDEyOCAgICAgICAgICAgIC8qIGFkdmFuc3lzX2luZm8oKSBsaW5lIHNpemUgKi8KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisvKiAvcHJvYy9zY3NpL2FkdmFuc3lzL1swLi4uXSByZWxhdGVkIGRlZmluaXRpb25zICovCisjZGVmaW5lIEFTQ19QUlRCVUZfU0laRSAgICAgICAgIDIwNDgKKyNkZWZpbmUgQVNDX1BSVExJTkVfU0laRSAgICAgICAgMTYwCisKKyNkZWZpbmUgQVNDX1BSVF9ORVhUKCkgXAorICAgIGlmIChjcCkgeyBcCisgICAgICAgIHRvdGxlbiArPSBsZW47IFwKKyAgICAgICAgbGVmdGxlbiAtPSBsZW47IFwKKyAgICAgICAgaWYgKGxlZnRsZW4gPT0gMCkgeyBcCisgICAgICAgICAgICByZXR1cm4gdG90bGVuOyBcCisgICAgICAgIH0gXAorICAgICAgICBjcCArPSBsZW47IFwKKyAgICB9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworLyogQXNjIExpYnJhcnkgcmV0dXJuIGNvZGVzICovCisjZGVmaW5lIEFTQ19UUlVFICAgICAgICAxCisjZGVmaW5lIEFTQ19GQUxTRSAgICAgICAwCisjZGVmaW5lIEFTQ19OT0VSUk9SICAgICAxCisjZGVmaW5lIEFTQ19CVVNZICAgICAgICAwCisjZGVmaW5lIEFTQ19FUlJPUiAgICAgICAoLTEpCisKKy8qIHN0cnVjdCBzY3NpX2NtbmQgZnVuY3Rpb24gcmV0dXJuIGNvZGVzICovCisjZGVmaW5lIFNUQVRVU19CWVRFKGJ5dGUpICAgKGJ5dGUpCisjZGVmaW5lIE1TR19CWVRFKGJ5dGUpICAgICAgKChieXRlKSA8PCA4KQorI2RlZmluZSBIT1NUX0JZVEUoYnl0ZSkgICAgICgoYnl0ZSkgPDwgMTYpCisjZGVmaW5lIERSSVZFUl9CWVRFKGJ5dGUpICAgKChieXRlKSA8PCAyNCkKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBhcmUgT1MgaW5kZXBlbmRlbnQgaW50ZXJmYWNlcyB0bworICogdGhlIHF1ZXVlIGZ1bmN0aW9uczoKKyAqICBSRVEgLSBTQ1NJIHJlcXVlc3Qgc3RydWN0dXJlCisgKiAgUkVRUCAtIHBvaW50ZXIgdG8gU0NTSSByZXF1ZXN0IHN0cnVjdHVyZQorICogIFJFUVBUSUQocmVxcCkgLSByZXFwJ3MgdGFyZ2V0IGlkCisgKiAgUkVRUE5FWFQocmVxcCkgLSByZXFwJ3MgbmV4dCBwb2ludGVyCisgKiAgUkVRUE5FWFRQKHJlcXApIC0gcG9pbnRlciB0byByZXFwJ3MgbmV4dCBwb2ludGVyCisgKiAgUkVRUFRJTUUocmVxcCkgLSByZXFwJ3MgdGltZSBzdGFtcCB2YWx1ZQorICogIFJFUVRJTUVTVEFNUCgpIC0gc3lzdGVtIHRpbWUgc3RhbXAgdmFsdWUKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc2NzaV9jbW5kICAgICBSRVEsICpSRVFQOworI2RlZmluZSBSRVFQTkVYVChyZXFwKSAgICAgICAoKFJFUVApICgocmVxcCktPmhvc3Rfc2NyaWJibGUpKQorI2RlZmluZSBSRVFQTkVYVFAocmVxcCkgICAgICAoKFJFUVAgKikgJigocmVxcCktPmhvc3Rfc2NyaWJibGUpKQorI2RlZmluZSBSRVFQVElEKHJlcXApICAgICAgICAoKHJlcXApLT5kZXZpY2UtPmlkKQorI2RlZmluZSBSRVFQVElNRShyZXFwKSAgICAgICAoKHJlcXApLT5TQ3AudGhpc19yZXNpZHVhbCkKKyNkZWZpbmUgUkVRVElNRVNUQU1QKCkgICAgICAgKGppZmZpZXMpCisKKyNkZWZpbmUgUkVRVElNRVNUQVQoZnVuY3Rpb24sIGFzY3EsIHJlcXAsIHRpZCkgXAoreyBcCisgICAgLyoKKyAgICAgKiBJZiB0aGUgcmVxdWVzdCB0aW1lIHN0YW1wIGlzIGxlc3MgdGhhbiB0aGUgc3lzdGVtIHRpbWUgc3RhbXAsIHRoZW4gXAorICAgICAqIG1heWJlIHRoZSBzeXN0ZW0gdGltZSBzdGFtcCB3cmFwcGVkLiBTZXQgdGhlIHJlcXVlc3QgdGltZSB0byB6ZXJvLlwKKyAgICAgKi8gXAorICAgIGlmIChSRVFQVElNRShyZXFwKSA8PSBSRVFUSU1FU1RBTVAoKSkgeyBcCisgICAgICAgIFJFUVBUSU1FKHJlcXApID0gUkVRVElNRVNUQU1QKCkgLSBSRVFQVElNRShyZXFwKTsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgLyogSW5kaWNhdGUgYW4gZXJyb3Igb2NjdXJyZWQgd2l0aCB0aGUgYXNzZXJ0aW9uLiAqLyBcCisgICAgICAgIEFTQ19BU1NFUlQoUkVRUFRJTUUocmVxcCkgPD0gUkVRVElNRVNUQU1QKCkpOyBcCisgICAgICAgIFJFUVBUSU1FKHJlcXApID0gMDsgXAorICAgIH0gXAorICAgIC8qIEhhbmRsZSBmaXJzdCBtaW5pbXVtIHRpbWUgY2FzZSB3aXRob3V0IGV4dGVybmFsIGluaXRpYWxpemF0aW9uLiAqLyBcCisgICAgaWYgKCgoYXNjcSktPnFfdG90X2NudFt0aWRdID09IDEpIHx8ICBcCisgICAgICAgIChSRVFQVElNRShyZXFwKSA8IChhc2NxKS0+cV9taW5fdGltW3RpZF0pKSB7IFwKKyAgICAgICAgICAgIChhc2NxKS0+cV9taW5fdGltW3RpZF0gPSBSRVFQVElNRShyZXFwKTsgXAorICAgICAgICAgICAgQVNDX0RCRzMoMSwgIiVzOiBuZXcgcV9taW5fdGltWyVkXSAldVxuIiwgXAorICAgICAgICAgICAgICAgIChmdW5jdGlvbiksICh0aWQpLCAoYXNjcSktPnFfbWluX3RpbVt0aWRdKTsgXAorICAgICAgICB9IFwKKyAgICBpZiAoUkVRUFRJTUUocmVxcCkgPiAoYXNjcSktPnFfbWF4X3RpbVt0aWRdKSB7IFwKKyAgICAgICAgKGFzY3EpLT5xX21heF90aW1bdGlkXSA9IFJFUVBUSU1FKHJlcXApOyBcCisgICAgICAgIEFTQ19EQkczKDEsICIlczogbmV3IHFfbWF4X3RpbVslZF0gJXVcbiIsIFwKKyAgICAgICAgICAgIChmdW5jdGlvbiksIHRpZCwgKGFzY3EpLT5xX21heF90aW1bdGlkXSk7IFwKKyAgICB9IFwKKyAgICAoYXNjcSktPnFfdG90X3RpbVt0aWRdICs9IFJFUVBUSU1FKHJlcXApOyBcCisgICAgLyogUmVzZXQgdGhlIHRpbWUgc3RhbXAgZmllbGQuICovIFwKKyAgICBSRVFQVElNRShyZXFwKSA9IDA7IFwKK30KKworLyogYXNjX2VucXVldWUoKSBmbGFncyAqLworI2RlZmluZSBBU0NfRlJPTlQgICAgICAgMQorI2RlZmluZSBBU0NfQkFDSyAgICAgICAgMgorCisvKiBhc2NfZGVxdWV1ZV9saXN0KCkgYXJndW1lbnQgKi8KKyNkZWZpbmUgQVNDX1RJRF9BTEwgICAgICAgICgtMSkKKworLyogUmV0dXJuIG5vbi16ZXJvLCBpZiB0aGUgcXVldWUgaXMgZW1wdHkuICovCisjZGVmaW5lIEFTQ19RVUVVRV9FTVBUWShhc2NxKSAgICAoKGFzY3EpLT5xX3RpZG1hc2sgPT0gMCkKKworI2RlZmluZSBQQ0lfTUFYX1NMT1QgICAgICAgICAgICAweDFGCisjZGVmaW5lIFBDSV9NQVhfQlVTICAgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgUENJX0lPQUREUkVTU19NQVNLICAgICAgMHhGRkZFCisjZGVmaW5lIEFTQ19QQ0lfVkVORE9SSUQgICAgICAgIDB4MTBDRAorI2RlZmluZSBBU0NfUENJX0RFVklDRV9JRF9DTlQgICA2ICAgICAgIC8qIFBDSSBEZXZpY2UgSUQgY291bnQuICovCisjZGVmaW5lIEFTQ19QQ0lfREVWSUNFX0lEXzExMDAgIDB4MTEwMAorI2RlZmluZSBBU0NfUENJX0RFVklDRV9JRF8xMjAwICAweDEyMDAKKyNkZWZpbmUgQVNDX1BDSV9ERVZJQ0VfSURfMTMwMCAgMHgxMzAwCisjZGVmaW5lIEFTQ19QQ0lfREVWSUNFX0lEXzIzMDAgIDB4MjMwMCAgLyogQVNDLTM1NTAgKi8KKyNkZWZpbmUgQVNDX1BDSV9ERVZJQ0VfSURfMjUwMCAgMHgyNTAwICAvKiBBU0MtMzhDMDgwMCAqLworI2RlZmluZSBBU0NfUENJX0RFVklDRV9JRF8yNzAwICAweDI3MDAgIC8qIEFTQy0zOEMxNjAwICovCisKKyNpZm5kZWYgQURWQU5TWVNfU1RBVFMKKyNkZWZpbmUgQVNDX1NUQVRTKHNocCwgY291bnRlcikKKyNkZWZpbmUgQVNDX1NUQVRTX0FERChzaHAsIGNvdW50ZXIsIGNvdW50KQorI2Vsc2UgLyogQURWQU5TWVNfU1RBVFMgKi8KKyNkZWZpbmUgQVNDX1NUQVRTKHNocCwgY291bnRlcikgXAorICAgIChBU0NfQk9BUkRQKHNocCktPmFzY19zdGF0cy5jb3VudGVyKyspCisKKyNkZWZpbmUgQVNDX1NUQVRTX0FERChzaHAsIGNvdW50ZXIsIGNvdW50KSBcCisgICAgKEFTQ19CT0FSRFAoc2hwKS0+YXNjX3N0YXRzLmNvdW50ZXIgKz0gKGNvdW50KSkKKyNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLworCisjZGVmaW5lIEFTQ19DRUlMSU5HKHZhbCwgdW5pdCkgKCgodmFsKSArICgodW5pdCkgLSAxKSkvKHVuaXQpKQorCisvKiBJZiB0aGUgcmVzdWx0IHdyYXBzIHdoZW4gY2FsY3VsYXRpbmcgdGVudGhzLCByZXR1cm4gMC4gKi8KKyNkZWZpbmUgQVNDX1RFTlRIUyhudW0sIGRlbikgXAorICAgICgoKDEwICogKChudW0pLyhkZW4pKSkgPiAoKChudW0pICogMTApLyhkZW4pKSkgPyBcCisgICAgMCA6ICgoKChudW0pICogMTApLyhkZW4pKSAtICgxMCAqICgobnVtKS8oZGVuKSkpKSkKKworLyoKKyAqIERpc3BsYXkgYSBtZXNzYWdlIHRvIHRoZSBjb25zb2xlLgorICovCisjZGVmaW5lIEFTQ19QUklOVChzKSBcCisgICAgeyBcCisgICAgICAgIHByaW50aygiYWR2YW5zeXM6ICIpOyBcCisgICAgICAgIHByaW50ayhzKTsgXAorICAgIH0KKworI2RlZmluZSBBU0NfUFJJTlQxKHMsIGExKSBcCisgICAgeyBcCisgICAgICAgIHByaW50aygiYWR2YW5zeXM6ICIpOyBcCisgICAgICAgIHByaW50aygocyksIChhMSkpOyBcCisgICAgfQorCisjZGVmaW5lIEFTQ19QUklOVDIocywgYTEsIGEyKSBcCisgICAgeyBcCisgICAgICAgIHByaW50aygiYWR2YW5zeXM6ICIpOyBcCisgICAgICAgIHByaW50aygocyksIChhMSksIChhMikpOyBcCisgICAgfQorCisjZGVmaW5lIEFTQ19QUklOVDMocywgYTEsIGEyLCBhMykgXAorICAgIHsgXAorICAgICAgICBwcmludGsoImFkdmFuc3lzOiAiKTsgXAorICAgICAgICBwcmludGsoKHMpLCAoYTEpLCAoYTIpLCAoYTMpKTsgXAorICAgIH0KKworI2RlZmluZSBBU0NfUFJJTlQ0KHMsIGExLCBhMiwgYTMsIGE0KSBcCisgICAgeyBcCisgICAgICAgIHByaW50aygiYWR2YW5zeXM6ICIpOyBcCisgICAgICAgIHByaW50aygocyksIChhMSksIChhMiksIChhMyksIChhNCkpOyBcCisgICAgfQorCisKKyNpZm5kZWYgQURWQU5TWVNfREVCVUcKKworI2RlZmluZSBBU0NfREJHKGx2bCwgcykKKyNkZWZpbmUgQVNDX0RCRzEobHZsLCBzLCBhMSkKKyNkZWZpbmUgQVNDX0RCRzIobHZsLCBzLCBhMSwgYTIpCisjZGVmaW5lIEFTQ19EQkczKGx2bCwgcywgYTEsIGEyLCBhMykKKyNkZWZpbmUgQVNDX0RCRzQobHZsLCBzLCBhMSwgYTIsIGEzLCBhNCkKKyNkZWZpbmUgQVNDX0RCR19QUlRfU0NTSV9IT1NUKGx2bCwgcykKKyNkZWZpbmUgQVNDX0RCR19QUlRfU0NTSV9DTU5EKGx2bCwgcykKKyNkZWZpbmUgQVNDX0RCR19QUlRfQVNDX1NDU0lfUShsdmwsIHNjc2lxcCkKKyNkZWZpbmUgQVNDX0RCR19QUlRfQURWX1NDU0lfUkVRX1EobHZsLCBzY3NpcXApCisjZGVmaW5lIEFTQ19EQkdfUFJUX0FTQ19RRE9ORV9JTkZPKGx2bCwgcWRvbmUpCisjZGVmaW5lIEFEVl9EQkdfUFJUX0FEVl9TQ1NJX1JFUV9RKGx2bCwgc2NzaXFwKQorI2RlZmluZSBBU0NfREJHX1BSVF9IRVgobHZsLCBuYW1lLCBzdGFydCwgbGVuZ3RoKQorI2RlZmluZSBBU0NfREJHX1BSVF9DREIobHZsLCBjZGIsIGxlbikKKyNkZWZpbmUgQVNDX0RCR19QUlRfU0VOU0UobHZsLCBzZW5zZSwgbGVuKQorI2RlZmluZSBBU0NfREJHX1BSVF9JTlFVSVJZKGx2bCwgaW5xLCBsZW4pCisKKyNlbHNlIC8qIEFEVkFOU1lTX0RFQlVHICovCisKKy8qCisgKiBEZWJ1Z2dpbmcgTWVzc2FnZSBMZXZlbHM6CisgKiAwOiBFcnJvcnMgT25seQorICogMTogSGlnaC1MZXZlbCBUcmFjaW5nCisgKiAyLU46IFZlcmJvc2UgVHJhY2luZworICovCisKKyNkZWZpbmUgQVNDX0RCRyhsdmwsIHMpIFwKKyAgICB7IFwKKyAgICAgICAgaWYgKGFzY19kYmdsdmwgPj0gKGx2bCkpIHsgXAorICAgICAgICAgICAgcHJpbnRrKHMpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBBU0NfREJHMShsdmwsIHMsIGExKSBcCisgICAgeyBcCisgICAgICAgIGlmIChhc2NfZGJnbHZsID49IChsdmwpKSB7IFwKKyAgICAgICAgICAgIHByaW50aygocyksIChhMSkpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBBU0NfREJHMihsdmwsIHMsIGExLCBhMikgXAorICAgIHsgXAorICAgICAgICBpZiAoYXNjX2RiZ2x2bCA+PSAobHZsKSkgeyBcCisgICAgICAgICAgICBwcmludGsoKHMpLCAoYTEpLCAoYTIpKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgQVNDX0RCRzMobHZsLCBzLCBhMSwgYTIsIGEzKSBcCisgICAgeyBcCisgICAgICAgIGlmIChhc2NfZGJnbHZsID49IChsdmwpKSB7IFwKKyAgICAgICAgICAgIHByaW50aygocyksIChhMSksIChhMiksIChhMykpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBBU0NfREJHNChsdmwsIHMsIGExLCBhMiwgYTMsIGE0KSBcCisgICAgeyBcCisgICAgICAgIGlmIChhc2NfZGJnbHZsID49IChsdmwpKSB7IFwKKyAgICAgICAgICAgIHByaW50aygocyksIChhMSksIChhMiksIChhMyksIChhNCkpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBBU0NfREJHX1BSVF9TQ1NJX0hPU1QobHZsLCBzKSBcCisgICAgeyBcCisgICAgICAgIGlmIChhc2NfZGJnbHZsID49IChsdmwpKSB7IFwKKyAgICAgICAgICAgIGFzY19wcnRfc2NzaV9ob3N0KHMpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBBU0NfREJHX1BSVF9TQ1NJX0NNTkQobHZsLCBzKSBcCisgICAgeyBcCisgICAgICAgIGlmIChhc2NfZGJnbHZsID49IChsdmwpKSB7IFwKKyAgICAgICAgICAgIGFzY19wcnRfc2NzaV9jbW5kKHMpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBBU0NfREJHX1BSVF9BU0NfU0NTSV9RKGx2bCwgc2NzaXFwKSBcCisgICAgeyBcCisgICAgICAgIGlmIChhc2NfZGJnbHZsID49IChsdmwpKSB7IFwKKyAgICAgICAgICAgIGFzY19wcnRfYXNjX3Njc2lfcShzY3NpcXApOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBBU0NfREJHX1BSVF9BU0NfUURPTkVfSU5GTyhsdmwsIHFkb25lKSBcCisgICAgeyBcCisgICAgICAgIGlmIChhc2NfZGJnbHZsID49IChsdmwpKSB7IFwKKyAgICAgICAgICAgIGFzY19wcnRfYXNjX3Fkb25lX2luZm8ocWRvbmUpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBBU0NfREJHX1BSVF9BRFZfU0NTSV9SRVFfUShsdmwsIHNjc2lxcCkgXAorICAgIHsgXAorICAgICAgICBpZiAoYXNjX2RiZ2x2bCA+PSAobHZsKSkgeyBcCisgICAgICAgICAgICBhc2NfcHJ0X2Fkdl9zY3NpX3JlcV9xKHNjc2lxcCk7IFwKKyAgICAgICAgfSBcCisgICAgfQorCisjZGVmaW5lIEFTQ19EQkdfUFJUX0hFWChsdmwsIG5hbWUsIHN0YXJ0LCBsZW5ndGgpIFwKKyAgICB7IFwKKyAgICAgICAgaWYgKGFzY19kYmdsdmwgPj0gKGx2bCkpIHsgXAorICAgICAgICAgICAgYXNjX3BydF9oZXgoKG5hbWUpLCAoc3RhcnQpLCAobGVuZ3RoKSk7IFwKKyAgICAgICAgfSBcCisgICAgfQorCisjZGVmaW5lIEFTQ19EQkdfUFJUX0NEQihsdmwsIGNkYiwgbGVuKSBcCisgICAgICAgIEFTQ19EQkdfUFJUX0hFWCgobHZsKSwgIkNEQiIsICh1Y2hhciAqKSAoY2RiKSwgKGxlbikpOworCisjZGVmaW5lIEFTQ19EQkdfUFJUX1NFTlNFKGx2bCwgc2Vuc2UsIGxlbikgXAorICAgICAgICBBU0NfREJHX1BSVF9IRVgoKGx2bCksICJTRU5TRSIsICh1Y2hhciAqKSAoc2Vuc2UpLCAobGVuKSk7CisKKyNkZWZpbmUgQVNDX0RCR19QUlRfSU5RVUlSWShsdmwsIGlucSwgbGVuKSBcCisgICAgICAgIEFTQ19EQkdfUFJUX0hFWCgobHZsKSwgIklOUVVJUlkiLCAodWNoYXIgKikgKGlucSksIChsZW4pKTsKKyNlbmRpZiAvKiBBRFZBTlNZU19ERUJVRyAqLworCisjaWZuZGVmIEFEVkFOU1lTX0FTU0VSVAorI2RlZmluZSBBU0NfQVNTRVJUKGEpCisjZWxzZSAvKiBBRFZBTlNZU19BU1NFUlQgKi8KKworI2RlZmluZSBBU0NfQVNTRVJUKGEpIFwKKyAgICB7IFwKKyAgICAgICAgaWYgKCEoYSkpIHsgXAorICAgICAgICAgICAgcHJpbnRrKCJBU0NfQVNTRVJUKCkgRmFpbHVyZTogZmlsZSAlcywgbGluZSAlZFxuIiwgXAorICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKyAgICAgICAgfSBcCisgICAgfQorCisjZW5kaWYgLyogQURWQU5TWVNfQVNTRVJUICovCisKKworLyoKKyAqIC0tLSBEcml2ZXIgU3RydWN0dXJlcworICovCisKKyNpZmRlZiBBRFZBTlNZU19TVEFUUworCisvKiBQZXIgYm9hcmQgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBhc2Nfc3RhdHMgeworICAgIC8qIERyaXZlciBFbnRyeXBvaW50IFN0YXRpc3RpY3MgKi8KKyAgICBBRFZfRENOVCBxdWV1ZWNvbW1hbmQ7ICAgIC8qICMgY2FsbHMgdG8gYWR2YW5zeXNfcXVldWVjb21tYW5kKCkgKi8KKyAgICBBRFZfRENOVCByZXNldDsgICAgICAgICAgIC8qICMgY2FsbHMgdG8gYWR2YW5zeXNfZWhfYnVzX3Jlc2V0KCkgKi8KKyAgICBBRFZfRENOVCBiaW9zcGFyYW07ICAgICAgIC8qICMgY2FsbHMgdG8gYWR2YW5zeXNfYmlvc3BhcmFtKCkgKi8KKyAgICBBRFZfRENOVCBpbnRlcnJ1cHQ7ICAgICAgIC8qICMgYWR2YW5zeXNfaW50ZXJydXB0KCkgY2FsbHMgKi8KKyAgICBBRFZfRENOVCBjYWxsYmFjazsgICAgICAgIC8qICMgY2FsbHMgdG8gYXNjL2Fkdl9pc3JfY2FsbGJhY2soKSAqLworICAgIEFEVl9EQ05UIGRvbmU7ICAgICAgICAgICAgLyogIyBjYWxscyB0byByZXF1ZXN0J3Mgc2NzaV9kb25lIGZ1bmN0aW9uICovCisgICAgQURWX0RDTlQgYnVpbGRfZXJyb3I7ICAgICAvKiAjIGFzYy9hZHZfYnVpbGRfcmVxKCkgQVNDX0VSUk9SIHJldHVybnMuICovCisgICAgQURWX0RDTlQgYWR2X2J1aWxkX25vcmVxOyAvKiAjIGFkdl9idWlsZF9yZXEoKSBhZHZfcmVxX3QgYWxsb2MuIGZhaWwuICovCisgICAgQURWX0RDTlQgYWR2X2J1aWxkX25vc2c7ICAvKiAjIGFkdl9idWlsZF9yZXEoKSBhZHZfc2dibGtfdCBhbGxvYy4gZmFpbC4gKi8KKyAgICAvKiBBc2NFeGVTY3NpUXVldWUoKS9BZHZFeGVTY3NpUXVldWUoKSBTdGF0aXN0aWNzICovCisgICAgQURWX0RDTlQgZXhlX25vZXJyb3I7ICAgICAvKiAjIEFTQ19OT0VSUk9SIHJldHVybnMuICovCisgICAgQURWX0RDTlQgZXhlX2J1c3k7ICAgICAgICAvKiAjIEFTQ19CVVNZIHJldHVybnMuICovCisgICAgQURWX0RDTlQgZXhlX2Vycm9yOyAgICAgICAvKiAjIEFTQ19FUlJPUiByZXR1cm5zLiAqLworICAgIEFEVl9EQ05UIGV4ZV91bmtub3duOyAgICAgLyogIyB1bmtub3duIHJldHVybnMuICovCisgICAgLyogRGF0YSBUcmFuc2ZlciBTdGF0aXN0aWNzICovCisgICAgQURWX0RDTlQgY29udF9jbnQ7ICAgICAgICAvKiAjIG5vbi1zY2F0dGVyLWdhdGhlciBJL08gcmVxdWVzdHMgcmVjZWl2ZWQgKi8KKyAgICBBRFZfRENOVCBjb250X3hmZXI7ICAgICAgIC8qICMgY29udGlndW91cyB0cmFuc2ZlciA1MTItYnl0ZXMgKi8KKyAgICBBRFZfRENOVCBzZ19jbnQ7ICAgICAgICAgIC8qICMgc2NhdHRlci1nYXRoZXIgSS9PIHJlcXVlc3RzIHJlY2VpdmVkICovCisgICAgQURWX0RDTlQgc2dfZWxlbTsgICAgICAgICAvKiAjIHNjYXR0ZXItZ2F0aGVyIGVsZW1lbnRzICovCisgICAgQURWX0RDTlQgc2dfeGZlcjsgICAgICAgICAvKiAjIHNjYXR0ZXItZ2F0aGVyIHRyYW5zZmVyIDUxMi1ieXRlcyAqLworfTsKKyNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLworCisvKgorICogUmVxdWVzdCBxdWV1aW5nIHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdCBhc2NfcXVldWUgeworICAgIEFEVl9TQ1NJX0JJVF9JRF9UWVBFICBxX3RpZG1hc2s7ICAgICAgICAgICAgICAgIC8qIHF1ZXVlIG1hc2sgKi8KKyAgICBSRVFQICAgICAgICAgICAgICAgICAgcV9maXJzdFtBRFZfTUFYX1RJRCsxXTsgICAvKiBmaXJzdCBxdWV1ZWQgcmVxdWVzdCAqLworICAgIFJFUVAgICAgICAgICAgICAgICAgICBxX2xhc3RbQURWX01BWF9USUQrMV07ICAgIC8qIGxhc3QgcXVldWVkIHJlcXVlc3QgKi8KKyNpZmRlZiBBRFZBTlNZU19TVEFUUworICAgIHNob3J0ICAgICAgICAgICAgICAgICBxX2N1cl9jbnRbQURWX01BWF9USUQrMV07IC8qIGN1cnJlbnQgcXVldWUgY291bnQgKi8KKyAgICBzaG9ydCAgICAgICAgICAgICAgICAgcV9tYXhfY250W0FEVl9NQVhfVElEKzFdOyAvKiBtYXhpbXVtIHF1ZXVlIGNvdW50ICovCisgICAgQURWX0RDTlQgICAgICAgICAgICAgIHFfdG90X2NudFtBRFZfTUFYX1RJRCsxXTsgLyogdG90YWwgZW5xdWV1ZSBjb3VudCAqLworICAgIEFEVl9EQ05UICAgICAgICAgICAgICBxX3RvdF90aW1bQURWX01BWF9USUQrMV07IC8qIHRvdGFsIHRpbWUgcXVldWVkICovCisgICAgdXNob3J0ICAgICAgICAgICAgICAgIHFfbWF4X3RpbVtBRFZfTUFYX1RJRCsxXTsgLyogbWF4aW11bSB0aW1lIHF1ZXVlZCAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgICBxX21pbl90aW1bQURWX01BWF9USUQrMV07IC8qIG1pbmltdW0gdGltZSBxdWV1ZWQgKi8KKyNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLworfSBhc2NfcXVldWVfdDsKKworLyoKKyAqIEFkdiBMaWJyYXJ5IFJlcXVlc3QgU3RydWN0dXJlcworICoKKyAqIFRoZSBmb2xsb3dpbmcgdHdvIHN0cnVjdHVyZXMgYXJlIHVzZWQgdG8gcHJvY2VzcyBXaWRlIEJvYXJkIHJlcXVlc3RzLgorICoKKyAqIFRoZSBBRFZfU0NTSV9SRVFfUSBzdHJ1Y3R1cmUgaW4gYWR2X3JlcV90IGlzIHBhc3NlZCB0byB0aGUgQWR2IExpYnJhcnkKKyAqIGFuZCBtaWNyb2NvZGUgd2l0aCB0aGUgQURWX1NDU0lfUkVRX1EgZmllbGQgJ3NyYl9wdHInIHBvaW50aW5nIHRvIHRoZQorICogYWR2X3JlcV90LiBUaGUgYWR2X3JlcV90IHN0cnVjdHVyZSAnY21uZHAnIGZpZWxkIGluIHR1cm4gcG9pbnRzIHRvIHRoZQorICogTWlkLUxldmVsIFNDU0kgcmVxdWVzdCBzdHJ1Y3R1cmUuCisgKgorICogWmVybyBvciBtb3JlIEFEVl9TR19CTE9DSyBhcmUgdXNlZCB3aXRoIGVhY2ggQURWX1NDU0lfUkVRX1EuIEVhY2gKKyAqIEFEVl9TR19CTE9DSyBzdHJ1Y3R1cmUgaG9sZHMgMTUgc2NhdHRlci1nYXRoZXIgZWxlbWVudHMuIFVuZGVyIExpbnV4CisgKiB1cCB0byAyNTUgc2NhdHRlci1nYXRoZXIgZWxlbWVudHMgbWF5IGJlIHVzZWQgcGVyIHJlcXVlc3Qgb3IKKyAqIEFEVl9TQ1NJX1JFUV9RLgorICoKKyAqIEJvdGggc3RydWN0dXJlcyBtdXN0IGJlIDMyIGJ5dGUgYWxpZ25lZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWR2X3NnYmxrIHsKKyAgICBBRFZfU0dfQkxPQ0sgICAgICAgIHNnX2Jsb2NrOyAgICAgLyogU2dibG9jayBzdHJ1Y3R1cmUuICovCisgICAgdWNoYXIgICAgICAgICAgICAgICBhbGlnblszMl07ICAgIC8qIFNnYmxvY2sgc3RydWN0dXJlIHBhZGRpbmcuICovCisgICAgc3RydWN0IGFkdl9zZ2JsayAgICAqbmV4dF9zZ2Jsa3A7IC8qIE5leHQgc2NhdHRlci1nYXRoZXIgc3RydWN0dXJlLiAqLworfSBhZHZfc2dibGtfdDsKKwordHlwZWRlZiBzdHJ1Y3QgYWR2X3JlcSB7CisgICAgQURWX1NDU0lfUkVRX1EgICAgICBzY3NpX3JlcV9xOyAgIC8qIEFkdiBMaWJyYXJ5IHJlcXVlc3Qgc3RydWN0dXJlLiAqLworICAgIHVjaGFyICAgICAgICAgICAgICAgYWxpZ25bMzJdOyAgICAvKiBSZXF1ZXN0IHN0cnVjdHVyZSBwYWRkaW5nLiAqLworICAgIHN0cnVjdCBzY3NpX2NtbmQJKmNtbmRwOyAgICAgICAvKiBNaWQtTGV2ZWwgU0NTSSBjb21tYW5kIHBvaW50ZXIuICovCisgICAgYWR2X3NnYmxrX3QgICAgICAgICAqc2dibGtwOyAgICAgIC8qIEFkdiBMaWJyYXJ5IHNjYXR0ZXItZ2F0aGVyIHBvaW50ZXIuICovCisgICAgc3RydWN0IGFkdl9yZXEgICAgICAqbmV4dF9yZXFwOyAgIC8qIE5leHQgUmVxdWVzdCBTdHJ1Y3R1cmUuICovCit9IGFkdl9yZXFfdDsKKworLyoKKyAqIFN0cnVjdHVyZSBhbGxvY2F0ZWQgZm9yIGVhY2ggYm9hcmQuCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGJ5IHNjc2lfcmVnaXN0ZXIoKSBhdCB0aGUgZW5kCisgKiBvZiB0aGUgJ1Njc2lfSG9zdCcgc3RydWN0dXJlIHN0YXJ0aW5nIGF0IHRoZSAnaG9zdGRhdGEnCisgKiBmaWVsZC4gSXQgaXMgZ3VhcmFudGVlZCB0byBiZSBhbGxvY2F0ZWQgZnJvbSBETUEtYWJsZSBtZW1vcnkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFzY19ib2FyZCB7CisgICAgaW50ICAgICAgICAgICAgICAgICAgaWQ7ICAgICAgICAgICAgICAgICAgICAvKiBCb2FyZCBJZCAqLworICAgIHVpbnQgICAgICAgICAgICAgICAgIGZsYWdzOyAgICAgICAgICAgICAgICAgLyogQm9hcmQgZmxhZ3MgKi8KKyAgICB1bmlvbiB7CisgICAgICAgIEFTQ19EVkNfVkFSICAgICAgYXNjX2R2Y192YXI7ICAgICAgICAgICAvKiBOYXJyb3cgYm9hcmQgKi8KKyAgICAgICAgQURWX0RWQ19WQVIgICAgICBhZHZfZHZjX3ZhcjsgICAgICAgICAgIC8qIFdpZGUgYm9hcmQgKi8KKyAgICB9IGR2Y192YXI7CisgICAgdW5pb24geworICAgICAgICBBU0NfRFZDX0NGRyAgICAgIGFzY19kdmNfY2ZnOyAgICAgICAgICAgLyogTmFycm93IGJvYXJkICovCisgICAgICAgIEFEVl9EVkNfQ0ZHICAgICAgYWR2X2R2Y19jZmc7ICAgICAgICAgICAvKiBXaWRlIGJvYXJkICovCisgICAgfSBkdmNfY2ZnOworICAgIHVzaG9ydCAgICAgICAgICAgICAgIGFzY19uX2lvX3BvcnQ7ICAgICAgICAgLyogTnVtYmVyIEkvTyBwb3J0cy4gKi8KKyAgICBhc2NfcXVldWVfdCAgICAgICAgICBhY3RpdmU7ICAgICAgICAgICAgICAgIC8qIEFjdGl2ZSBjb21tYW5kIHF1ZXVlICovCisgICAgYXNjX3F1ZXVlX3QgICAgICAgICAgd2FpdGluZzsgICAgICAgICAgICAgICAvKiBXYWl0aW5nIGNvbW1hbmQgcXVldWUgKi8KKyAgICBhc2NfcXVldWVfdCAgICAgICAgICBkb25lOyAgICAgICAgICAgICAgICAgIC8qIERvbmUgY29tbWFuZCBxdWV1ZSAqLworICAgIEFEVl9TQ1NJX0JJVF9JRF9UWVBFIGluaXRfdGlkbWFzazsgICAgICAgICAgLyogVGFyZ2V0IGluaXQuL3ZhbGlkIG1hc2sgKi8KKyAgICBzdHJ1Y3Qgc2NzaV9kZXZpY2UJKmRldmljZVtBRFZfTUFYX1RJRCsxXTsgLyogTWlkLUxldmVsIFNjc2kgRGV2aWNlICovCisgICAgdXNob3J0ICAgICAgICAgICAgICAgcmVxY250W0FEVl9NQVhfVElEKzFdOyAvKiBTdGFydmF0aW9uIHJlcXVlc3QgY291bnQgKi8KKyAgICBBRFZfU0NTSV9CSVRfSURfVFlQRSBxdWV1ZV9mdWxsOyAgICAgICAgICAgIC8qIFF1ZXVlIGZ1bGwgbWFzayAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgIHF1ZXVlX2Z1bGxfY250W0FEVl9NQVhfVElEKzFdOyAvKiBRdWV1ZSBmdWxsIGNvdW50ICovCisgICAgdW5pb24geworICAgICAgICBBU0NFRVBfQ09ORklHICAgICAgICAgYXNjX2VlcDsgICAgICAgICAgLyogTmFycm93IEVFUFJPTSBjb25maWcuICovCisgICAgICAgIEFEVkVFUF8zNTUwX0NPTkZJRyAgICBhZHZfMzU1MF9lZXA7ICAgICAvKiAzNTUwIEVFUFJPTSBjb25maWcuICovCisgICAgICAgIEFEVkVFUF8zOEMwODAwX0NPTkZJRyBhZHZfMzhDMDgwMF9lZXA7ICAvKiAzOEMwODAwIEVFUFJPTSBjb25maWcuICovCisgICAgICAgIEFEVkVFUF8zOEMxNjAwX0NPTkZJRyBhZHZfMzhDMTYwMF9lZXA7ICAvKiAzOEMxNjAwIEVFUFJPTSBjb25maWcuICovCisgICAgfSBlZXBfY29uZmlnOworICAgIHVsb25nICAgICAgICAgICAgICAgIGxhc3RfcmVzZXQ7ICAgICAgICAgICAgLyogU2F2ZWQgbGFzdCByZXNldCB0aW1lICovCisgICAgc3BpbmxvY2tfdCBsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb2FyZCBzcGlubG9jayAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisgICAgLyogL3Byb2Mvc2NzaS9hZHZhbnN5cy9bMC4uLl0gKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgICAqcHJ0YnVmOyAgICAgICAgICAgICAgIC8qIC9wcm9jIHByaW50IGJ1ZmZlciAqLworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisjaWZkZWYgQURWQU5TWVNfU1RBVFMKKyAgICBzdHJ1Y3QgYXNjX3N0YXRzICAgICBhc2Nfc3RhdHM7ICAgICAgICAgICAgIC8qIEJvYXJkIHN0YXRpc3RpY3MgKi8KKyNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLworICAgIC8qCisgICAgICogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHVzZWQgb25seSBmb3IgTmFycm93IEJvYXJkcy4KKyAgICAgKi8KKyAgICAvKiBUaGUgZm9sbG93aW5nIHRocmVlIHN0cnVjdHVyZXMgbXVzdCBiZSBpbiBETUEtYWJsZSBtZW1vcnkuICovCisgICAgQVNDX1NDU0lfUkVRX1EgICAgICAgc2NzaXJlcXE7CisgICAgQVNDX0NBUF9JTkZPICAgICAgICAgY2FwX2luZm87CisgICAgQVNDX1NDU0lfSU5RVUlSWSAgICAgaW5xdWlyeTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgICBzZHRyX2RhdGFbQVNDX01BWF9USUQrMV07IC8qIFNEVFIgaW5mb3JtYXRpb24gKi8KKyAgICAvKgorICAgICAqIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSB1c2VkIG9ubHkgZm9yIFdpZGUgQm9hcmRzLgorICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICppb3JlbWFwX2FkZHI7ICAgICAgICAgLyogSS9PIE1lbW9yeSByZW1hcCBhZGRyZXNzLiAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgIGlvcG9ydDsgICAgICAgICAgICAgICAgLyogSS9PIFBvcnQgYWRkcmVzcy4gKi8KKyAgICBBRFZfQ0FSUl9UICAgICAgICAgICAqb3JpZ19jYXJycDsgICAgICAgICAgIC8qIEFEVl9DQVJSX1QgbWVtb3J5IGJsb2NrLiAqLworICAgIGFkdl9yZXFfdCAgICAgICAgICAgICpvcmlnX3JlcXA7ICAgICAgICAgICAgLyogYWR2X3JlcV90IG1lbW9yeSBibG9jay4gKi8KKyAgICBhZHZfcmVxX3QgICAgICAgICAgICAqYWR2X3JlcXA7ICAgICAgICAgICAgIC8qIFJlcXVlc3Qgc3RydWN0dXJlcy4gKi8KKyAgICBhZHZfc2dibGtfdCAgICAgICAgICAqYWR2X3NnYmxrcDsgICAgICAgICAgIC8qIFNjYXR0ZXItZ2F0aGVyIHN0cnVjdHVyZXMuICovCisgICAgdXNob3J0ICAgICAgICAgICAgICAgYmlvc19zaWduYXR1cmU7ICAgICAgICAvKiBCSU9TIFNpZ25hdHVyZS4gKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgICBiaW9zX3ZlcnNpb247ICAgICAgICAgIC8qIEJJT1MgVmVyc2lvbi4gKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgICBiaW9zX2NvZGVzZWc7ICAgICAgICAgIC8qIEJJT1MgQ29kZSBTZWdtZW50LiAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgIGJpb3NfY29kZWxlbjsgICAgICAgICAgLyogQklPUyBDb2RlIFNlZ21lbnQgTGVuZ3RoLiAqLworfSBhc2NfYm9hcmRfdDsKKworLyoKKyAqIFBDSSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZXMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX1BDSV9EQVRBXworeworICAgIHVjaGFyICAgIHR5cGU7CisgICAgdWNoYXIgICAgYnVzOworICAgIHVjaGFyICAgIHNsb3Q7CisgICAgdWNoYXIgICAgZnVuYzsKKyAgICB1Y2hhciAgICBvZmZzZXQ7Cit9IFBDSV9EQVRBOworCit0eXBlZGVmIHN0cnVjdCBfUENJX0RFVklDRV8KK3sKKyAgICB1c2hvcnQgICB2ZW5kb3JJRDsKKyAgICB1c2hvcnQgICBkZXZpY2VJRDsKKyAgICB1c2hvcnQgICBzbG90TnVtYmVyOworICAgIHVzaG9ydCAgIHNsb3RGb3VuZDsKKyAgICB1Y2hhciAgICBidXNOdW1iZXI7CisgICAgdWNoYXIgICAgbWF4QnVzTnVtYmVyOworICAgIHVjaGFyICAgIGRldkZ1bmM7CisgICAgdXNob3J0ICAgc3RhcnRTbG90OworICAgIHVzaG9ydCAgIGVuZFNsb3Q7CisgICAgdWNoYXIgICAgYnJpZGdlOworICAgIHVjaGFyICAgIHR5cGU7Cit9IFBDSV9ERVZJQ0U7CisKK3R5cGVkZWYgc3RydWN0IF9QQ0lfQ09ORklHX1NQQUNFXworeworICAgIHVzaG9ydCAgIHZlbmRvcklEOworICAgIHVzaG9ydCAgIGRldmljZUlEOworICAgIHVzaG9ydCAgIGNvbW1hbmQ7CisgICAgdXNob3J0ICAgc3RhdHVzOworICAgIHVjaGFyICAgIHJldmlzaW9uOworICAgIHVjaGFyICAgIGNsYXNzQ29kZVszXTsKKyAgICB1Y2hhciAgICBjYWNoZVNpemU7CisgICAgdWNoYXIgICAgbGF0ZW5jeVRpbWVyOworICAgIHVjaGFyICAgIGhlYWRlclR5cGU7CisgICAgdWNoYXIgICAgYmlzdDsKKyAgICBBRFZfUEFERFIgYmFzZUFkZHJlc3NbNl07CisgICAgdXNob3J0ICAgcmVzZXJ2ZWRbNF07CisgICAgQURWX1BBRERSIG9wdGlvblJvbUFkZHI7CisgICAgdXNob3J0ICAgcmVzZXJ2ZWQyWzRdOworICAgIHVjaGFyICAgIGlycUxpbmU7CisgICAgdWNoYXIgICAgaXJxUGluOworICAgIHVjaGFyICAgIG1pbkdudDsKKyAgICB1Y2hhciAgICBtYXhMYXRlbmN5OworfSBQQ0lfQ09ORklHX1NQQUNFOworCisKKy8qCisgKiAtLS0gRHJpdmVyIERhdGEKKyAqLworCisvKiBOb3RlOiBBbGwgZHJpdmVyIGdsb2JhbCBkYXRhIHNob3VsZCBiZSBpbml0aWFsaXplZC4gKi8KKworLyogTnVtYmVyIG9mIGJvYXJkcyBkZXRlY3RlZCBpbiBzeXN0ZW0uICovCitTVEFUSUMgaW50IGFzY19ib2FyZF9jb3VudCA9IDA7CitTVEFUSUMgc3RydWN0IFNjc2lfSG9zdCAgICAqYXNjX2hvc3RbQVNDX05VTV9CT0FSRF9TVVBQT1JURURdID0geyAwIH07CisKKy8qIE92ZXJydW4gYnVmZmVyIHVzZWQgYnkgYWxsIG5hcnJvdyBib2FyZHMuICovCitTVEFUSUMgdWNoYXIgb3ZlcnJ1bl9idWZbQVNDX09WRVJSVU5fQlNJWkVdID0geyAwIH07CisKKy8qCisgKiBHbG9iYWwgc3RydWN0dXJlcyByZXF1aXJlZCB0byBpc3N1ZSBhIGNvbW1hbmQuCisgKi8KK1NUQVRJQyBBU0NfU0NTSV9RIGFzY19zY3NpX3EgPSB7IHsgMCB9IH07CitTVEFUSUMgQVNDX1NHX0hFQUQgYXNjX3NnX2hlYWQgPSB7IDAgfTsKKworLyogTGlzdCBvZiBzdXBwb3J0ZWQgYnVzIHR5cGVzLiAqLworU1RBVElDIHVzaG9ydCBhc2NfYnVzW0FTQ19OVU1fQlVTXSBfX2luaXRkYXRhID0geworICAgIEFTQ19JU19JU0EsCisgICAgQVNDX0lTX1ZMLAorICAgIEFTQ19JU19FSVNBLAorICAgIEFTQ19JU19QQ0ksCit9OworCisvKgorICogVXNlZCB3aXRoIHRoZSBMSUxPICdhZHZhbnN5cycgb3B0aW9uIHRvIGVsaW1pbmF0ZSBvcgorICogbGltaXQgSS9PIHBvcnQgcHJvYmluZyBhdCBib290IHRpbWUsIGNmLiBhZHZhbnN5c19zZXR1cCgpLgorICovCitTVEFUSUMgaW50IGFzY19pb3BmbGFnID0gQVNDX0ZBTFNFOworU1RBVElDIGludCBhc2NfaW9wb3J0W0FTQ19OVU1fSU9QT1JUX1BST0JFXSA9IHsgMCwgMCwgMCwgMCB9OworCisjaWZkZWYgQURWQU5TWVNfREVCVUcKK1NUQVRJQyBjaGFyICoKK2FzY19idXNfbmFtZVtBU0NfTlVNX0JVU10gPSB7CisgICAgIkFTQ19JU19JU0EiLAorICAgICJBU0NfSVNfVkwiLAorICAgICJBU0NfSVNfRUlTQSIsCisgICAgIkFTQ19JU19QQ0kiLAorfTsKKworU1RBVElDIGludCAgICAgICAgICBhc2NfZGJnbHZsID0gMzsKKyNlbmRpZiAvKiBBRFZBTlNZU19ERUJVRyAqLworCisvKiBEZWNsYXJhdGlvbiBmb3IgQXNjIExpYnJhcnkgaW50ZXJuYWwgZGF0YSByZWZlcmVuY2VkIGJ5IGRyaXZlci4gKi8KK1NUQVRJQyBQb3J0QWRkciAgICAgX2FzY19kZWZfaW9wX2Jhc2VbXTsKKworCisvKgorICogLS0tIERyaXZlciBGdW5jdGlvbiBQcm90b3R5cGVzCisgKgorICogYWR2YW5zeXMuaCBjb250YWlucyBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgZ2xvYmFsIHRvIExpbnV4LgorICovCisKK1NUQVRJQyBpcnFyZXR1cm5fdCBhZHZhbnN5c19pbnRlcnJ1cHQoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworU1RBVElDIGludAkgIGFkdmFuc3lzX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CitTVEFUSUMgdm9pZCAgICAgICBhc2Nfc2NzaV9kb25lX2xpc3Qoc3RydWN0IHNjc2lfY21uZCAqKTsKK1NUQVRJQyBpbnQgICAgICAgIGFzY19leGVjdXRlX3Njc2lfY21uZChzdHJ1Y3Qgc2NzaV9jbW5kICopOworU1RBVElDIGludCAgICAgICAgYXNjX2J1aWxkX3JlcShhc2NfYm9hcmRfdCAqLCBzdHJ1Y3Qgc2NzaV9jbW5kICopOworU1RBVElDIGludCAgICAgICAgYWR2X2J1aWxkX3JlcShhc2NfYm9hcmRfdCAqLCBzdHJ1Y3Qgc2NzaV9jbW5kICosIEFEVl9TQ1NJX1JFUV9RICoqKTsKK1NUQVRJQyBpbnQgICAgICAgIGFkdl9nZXRfc2dsaXN0KGFzY19ib2FyZF90ICosIGFkdl9yZXFfdCAqLCBzdHJ1Y3Qgc2NzaV9jbW5kICosIGludCk7CitTVEFUSUMgdm9pZCAgICAgICBhc2NfaXNyX2NhbGxiYWNrKEFTQ19EVkNfVkFSICosIEFTQ19RRE9ORV9JTkZPICopOworU1RBVElDIHZvaWQgICAgICAgYWR2X2lzcl9jYWxsYmFjayhBRFZfRFZDX1ZBUiAqLCBBRFZfU0NTSV9SRVFfUSAqKTsKK1NUQVRJQyB2b2lkICAgICAgIGFkdl9hc3luY19jYWxsYmFjayhBRFZfRFZDX1ZBUiAqLCB1Y2hhcik7CitTVEFUSUMgdm9pZCAgICAgICBhc2NfZW5xdWV1ZShhc2NfcXVldWVfdCAqLCBSRVFQLCBpbnQpOworU1RBVElDIFJFUVAgICAgICAgYXNjX2RlcXVldWUoYXNjX3F1ZXVlX3QgKiwgaW50KTsKK1NUQVRJQyBSRVFQICAgICAgIGFzY19kZXF1ZXVlX2xpc3QoYXNjX3F1ZXVlX3QgKiwgUkVRUCAqLCBpbnQpOworU1RBVElDIGludCAgICAgICAgYXNjX3JtcXVldWUoYXNjX3F1ZXVlX3QgKiwgUkVRUCk7CitTVEFUSUMgdm9pZCAgICAgICBhc2NfZXhlY3V0ZV9xdWV1ZShhc2NfcXVldWVfdCAqKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworU1RBVElDIGludCAgICAgICAgYXNjX3Byb2NfY29weShvZmZfdCwgb2ZmX3QsIGNoYXIgKiwgaW50ICwgY2hhciAqLCBpbnQpOworU1RBVElDIGludCAgICAgICAgYXNjX3BydF9ib2FyZF9kZXZpY2VzKHN0cnVjdCBTY3NpX0hvc3QgKiwgY2hhciAqLCBpbnQpOworU1RBVElDIGludCAgICAgICAgYXNjX3BydF9hZHZfYmlvcyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgaW50KTsKK1NUQVRJQyBpbnQgICAgICAgIGFzY19nZXRfZWVwcm9tX3N0cmluZyh1c2hvcnQgKnNlcmlhbG51bSwgdWNoYXIgKmNwKTsKK1NUQVRJQyBpbnQgICAgICAgIGFzY19wcnRfYXNjX2JvYXJkX2VlcHJvbShzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgaW50KTsKK1NUQVRJQyBpbnQgICAgICAgIGFzY19wcnRfYWR2X2JvYXJkX2VlcHJvbShzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgaW50KTsKK1NUQVRJQyBpbnQgICAgICAgIGFzY19wcnRfZHJpdmVyX2NvbmYoc3RydWN0IFNjc2lfSG9zdCAqLCBjaGFyICosIGludCk7CitTVEFUSUMgaW50ICAgICAgICBhc2NfcHJ0X2FzY19ib2FyZF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKiwgY2hhciAqLCBpbnQpOworU1RBVElDIGludCAgICAgICAgYXNjX3BydF9hZHZfYm9hcmRfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgaW50KTsKK1NUQVRJQyBpbnQgICAgICAgIGFzY19wcnRfbGluZShjaGFyICosIGludCwgY2hhciAqZm10LCAuLi4pOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKy8qIERlY2xhcmF0aW9uIGZvciBBc2MgTGlicmFyeSBpbnRlcm5hbCBmdW5jdGlvbnMgcmVmZXJlbmNlZCBieSBkcml2ZXIuICovCitTVEFUSUMgaW50ICAgICAgICAgIEFzY0ZpbmRTaWduYXR1cmUoUG9ydEFkZHIpOworU1RBVElDIHVzaG9ydCAgICAgICBBc2NHZXRFRVBDb25maWcoUG9ydEFkZHIsIEFTQ0VFUF9DT05GSUcgKiwgdXNob3J0KTsKKworLyogU3RhdGlzdGljcyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworI2lmZGVmIEFEVkFOU1lTX1NUQVRTCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK1NUQVRJQyBpbnQgICAgICAgICAgYXNjX3BydF9ib2FyZF9zdGF0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgaW50KTsKK1NUQVRJQyBpbnQgICAgICAgICAgYXNjX3BydF90YXJnZXRfc3RhdHMoc3RydWN0IFNjc2lfSG9zdCAqLCBpbnQsIGNoYXIgKiwgaW50KTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworI2VuZGlmIC8qIEFEVkFOU1lTX1NUQVRTICovCisKKy8qIERlYnVnIGZ1bmN0aW9uIHByb3RvdHlwZXMuICovCisjaWZkZWYgQURWQU5TWVNfREVCVUcKK1NUQVRJQyB2b2lkICAgICAgICAgYXNjX3BydF9zY3NpX2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqKTsKK1NUQVRJQyB2b2lkICAgICAgICAgYXNjX3BydF9zY3NpX2NtbmQoc3RydWN0IHNjc2lfY21uZCAqKTsKK1NUQVRJQyB2b2lkICAgICAgICAgYXNjX3BydF9hc2NfZHZjX2NmZyhBU0NfRFZDX0NGRyAqKTsKK1NUQVRJQyB2b2lkICAgICAgICAgYXNjX3BydF9hc2NfZHZjX3ZhcihBU0NfRFZDX1ZBUiAqKTsKK1NUQVRJQyB2b2lkICAgICAgICAgYXNjX3BydF9hc2Nfc2NzaV9xKEFTQ19TQ1NJX1EgKik7CitTVEFUSUMgdm9pZCAgICAgICAgIGFzY19wcnRfYXNjX3Fkb25lX2luZm8oQVNDX1FET05FX0lORk8gKik7CitTVEFUSUMgdm9pZCAgICAgICAgIGFzY19wcnRfYWR2X2R2Y19jZmcoQURWX0RWQ19DRkcgKik7CitTVEFUSUMgdm9pZCAgICAgICAgIGFzY19wcnRfYWR2X2R2Y192YXIoQURWX0RWQ19WQVIgKik7CitTVEFUSUMgdm9pZCAgICAgICAgIGFzY19wcnRfYWR2X3Njc2lfcmVxX3EoQURWX1NDU0lfUkVRX1EgKik7CitTVEFUSUMgdm9pZCAgICAgICAgIGFzY19wcnRfYWR2X3NnYmxvY2soaW50LCBBRFZfU0dfQkxPQ0sgKik7CitTVEFUSUMgdm9pZCAgICAgICAgIGFzY19wcnRfaGV4KGNoYXIgKmYsIHVjaGFyICosIGludCk7CisjZW5kaWYgLyogQURWQU5TWVNfREVCVUcgKi8KKworCisvKgorICogLS0tIExpbnV4ICdTY3NpX0hvc3RfVGVtcGxhdGUnIGFuZCBhZHZhbnN5c19zZXR1cCgpIEZ1bmN0aW9ucworICovCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworLyoKKyAqIGFkdmFuc3lzX3Byb2NfaW5mbygpIC0gL3Byb2Mvc2NzaS9hZHZhbnN5cy9bMC0oQVNDX05VTV9CT0FSRF9TVVBQT1JURUQtMSldCisgKgorICogKmJ1ZmZlcjogSS9PIGJ1ZmZlcgorICogKipzdGFydDogaWYgaW5vdXQgPT0gRkFMU0UgcG9pbnRlciBpbnRvIGJ1ZmZlciB3aGVyZSB1c2VyIHJlYWQgc2hvdWxkIHN0YXJ0CisgKiBvZmZzZXQ6IGN1cnJlbnQgb2Zmc2V0IGludG8gYSAvcHJvYy9zY3NpL2FkdmFuc3lzL1swLi4uXSBmaWxlCisgKiBsZW5ndGg6IGxlbmd0aCBvZiBidWZmZXIKKyAqIGhvc3RubzogU2NzaV9Ib3N0IGhvc3Rfbm8KKyAqIGlub3V0OiBUUlVFIC0gdXNlciBpcyB3cml0aW5nOyBGQUxTRSAtIHVzZXIgaXMgcmVhZGluZworICoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIGEKKyAqIC9wcm9jL3Njc2kvYWR2YW5zeXMvWzAuLi5dIGZpbGUuCisgKgorICogTm90ZTogVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBwZXIgYm9hcmQgYnVmZmVyICdwcnRidWYnIHdoaWNoIGlzCisgKiBhbGxvY2F0ZWQgd2hlbiB0aGUgYm9hcmQgaXMgaW5pdGlhbGl6ZWQgaW4gYWR2YW5zeXNfZGV0ZWN0KCkuIFRoZQorICogYnVmZmVyIGlzIEFTQ19QUlRCVUZfU0laRSBieXRlcy4gVGhlIGZ1bmN0aW9uIGFzY19wcm9jX2NvcHkoKSBpcworICogdXNlZCB0byB3cml0ZSB0byB0aGUgYnVmZmVyLiBUaGUgd2F5IGFzY19wcm9jX2NvcHkoKSBpcyB3cml0dGVuCisgKiBpZiAncHJ0YnVmJyBpcyB0b28gc21hbGwgaXQgd2lsbCBub3QgYmUgb3ZlcndyaXR0ZW4uIEluc3RlYWQgdGhlCisgKiB1c2VyIGp1c3Qgd29uJ3QgZ2V0IGFsbCB0aGUgYXZhaWxhYmxlIHN0YXRpc3RpY3MuCisgKi8KK2ludAorYWR2YW5zeXNfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwKKwkJb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCit7CisgICAgc3RydWN0IFNjc2lfSG9zdCAgICAqc2hwOworICAgIGFzY19ib2FyZF90ICAgICAgICAgKmJvYXJkcDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGk7CisgICAgY2hhciAgICAgICAgICAgICAgICAqY3A7CisgICAgaW50CQkJY3BsZW47CisgICAgaW50ICAgICAgICAgICAgICAgICBjbnQ7CisgICAgaW50ICAgICAgICAgICAgICAgICB0b3RjbnQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBsZWZ0bGVuOworICAgIGNoYXIgICAgICAgICAgICAgICAgKmN1cmJ1ZjsKKyAgICBvZmZfdCAgICAgICAgICAgICAgIGFkdm9mZnNldDsKKyNpZmRlZiBBRFZBTlNZU19TVEFUUworICAgIGludCAgICAgICAgICAgICAgICAgdGd0X2lkOworI2VuZGlmIC8qIEFEVkFOU1lTX1NUQVRTICovCisKKyAgICBBU0NfREJHKDEsICJhZHZhbnN5c19wcm9jX2luZm86IGJlZ2luXG4iKTsKKworICAgIC8qCisgICAgICogVXNlciB3cml0ZSBub3Qgc3VwcG9ydGVkLgorICAgICAqLworICAgIGlmIChpbm91dCA9PSBUUlVFKSB7CisgICAgICAgIHJldHVybigtRU5PU1lTKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFVzZXIgcmVhZCBvZiAvcHJvYy9zY3NpL2FkdmFuc3lzL1swLi4uXSBmaWxlLgorICAgICAqLworCisgICAgLyogRmluZCB0aGUgc3BlY2lmaWVkIGJvYXJkLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBhc2NfYm9hcmRfY291bnQ7IGkrKykgeworICAgICAgICBpZiAoYXNjX2hvc3RbaV0tPmhvc3Rfbm8gPT0gc2hvc3QtPmhvc3Rfbm8pIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpID09IGFzY19ib2FyZF9jb3VudCkgeworICAgICAgICByZXR1cm4oLUVOT0VOVCk7CisgICAgfQorCisgICAgc2hwID0gYXNjX2hvc3RbaV07CisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworCisgICAgLyogQ29weSByZWFkIGRhdGEgc3RhcnRpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLiAqLworICAgICpzdGFydCA9IGJ1ZmZlcjsKKyAgICBjdXJidWYgPSBidWZmZXI7CisgICAgYWR2b2Zmc2V0ID0gMDsKKyAgICB0b3RjbnQgPSAwOworICAgIGxlZnRsZW4gPSBsZW5ndGg7CisKKyAgICAvKgorICAgICAqIEdldCBib2FyZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogYWR2YW5zeXNfaW5mbygpIHJldHVybnMgdGhlIGJvYXJkIHN0cmluZyBmcm9tIGl0cyBvd24gc3RhdGljIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBjcCA9IChjaGFyICopIGFkdmFuc3lzX2luZm8oc2hwKTsKKyAgICBzdHJjYXQoY3AsICJcbiIpOworICAgIGNwbGVuID0gc3RybGVuKGNwKTsKKyAgICAvKiBDb3B5IGJvYXJkIGluZm9ybWF0aW9uLiAqLworICAgIGNudCA9IGFzY19wcm9jX2NvcHkoYWR2b2Zmc2V0LCBvZmZzZXQsIGN1cmJ1ZiwgbGVmdGxlbiwgY3AsIGNwbGVuKTsKKyAgICB0b3RjbnQgKz0gY250OworICAgIGxlZnRsZW4gLT0gY250OworICAgIGlmIChsZWZ0bGVuID09IDApIHsKKyAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Byb2NfaW5mbzogdG90Y250ICVkXG4iLCB0b3RjbnQpOworICAgICAgICByZXR1cm4gdG90Y250OworICAgIH0KKyAgICBhZHZvZmZzZXQgKz0gY3BsZW47CisgICAgY3VyYnVmICs9IGNudDsKKworICAgIC8qCisgICAgICogRGlzcGxheSBXaWRlIEJvYXJkIEJJT1MgSW5mb3JtYXRpb24uCisgICAgICovCisgICAgaWYgKEFTQ19XSURFX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgY3AgPSBib2FyZHAtPnBydGJ1ZjsKKyAgICAgICAgY3BsZW4gPSBhc2NfcHJ0X2Fkdl9iaW9zKHNocCwgY3AsIEFTQ19QUlRCVUZfU0laRSk7CisgICAgICAgIEFTQ19BU1NFUlQoY3BsZW4gPCBBU0NfUFJUQlVGX1NJWkUpOworICAgICAgICBjbnQgPSBhc2NfcHJvY19jb3B5KGFkdm9mZnNldCwgb2Zmc2V0LCBjdXJidWYsIGxlZnRsZW4sIGNwLCBjcGxlbik7CisgICAgICAgIHRvdGNudCArPSBjbnQ7CisgICAgICAgIGxlZnRsZW4gLT0gY250OworICAgICAgICBpZiAobGVmdGxlbiA9PSAwKSB7CisgICAgICAgICAgICBBU0NfREJHMSgxLCAiYWR2YW5zeXNfcHJvY19pbmZvOiB0b3RjbnQgJWRcbiIsIHRvdGNudCk7CisgICAgICAgICAgICByZXR1cm4gdG90Y250OworICAgICAgICB9CisgICAgICAgIGFkdm9mZnNldCArPSBjcGxlbjsKKyAgICAgICAgY3VyYnVmICs9IGNudDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIERpc3BsYXkgZHJpdmVyIGluZm9ybWF0aW9uIGZvciBlYWNoIGRldmljZSBhdHRhY2hlZCB0byB0aGUgYm9hcmQuCisgICAgICovCisgICAgY3AgPSBib2FyZHAtPnBydGJ1ZjsKKyAgICBjcGxlbiA9IGFzY19wcnRfYm9hcmRfZGV2aWNlcyhzaHAsIGNwLCBBU0NfUFJUQlVGX1NJWkUpOworICAgIEFTQ19BU1NFUlQoY3BsZW4gPCBBU0NfUFJUQlVGX1NJWkUpOworICAgIGNudCA9IGFzY19wcm9jX2NvcHkoYWR2b2Zmc2V0LCBvZmZzZXQsIGN1cmJ1ZiwgbGVmdGxlbiwgY3AsIGNwbGVuKTsKKyAgICB0b3RjbnQgKz0gY250OworICAgIGxlZnRsZW4gLT0gY250OworICAgIGlmIChsZWZ0bGVuID09IDApIHsKKyAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Byb2NfaW5mbzogdG90Y250ICVkXG4iLCB0b3RjbnQpOworICAgICAgICByZXR1cm4gdG90Y250OworICAgIH0KKyAgICBhZHZvZmZzZXQgKz0gY3BsZW47CisgICAgY3VyYnVmICs9IGNudDsKKworICAgIC8qCisgICAgICogRGlzcGxheSBFRVBST00gY29uZmlndXJhdGlvbiBmb3IgdGhlIGJvYXJkLgorICAgICAqLworICAgIGNwID0gYm9hcmRwLT5wcnRidWY7CisgICAgaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgeworICAgICAgICBjcGxlbiA9IGFzY19wcnRfYXNjX2JvYXJkX2VlcHJvbShzaHAsIGNwLCBBU0NfUFJUQlVGX1NJWkUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNwbGVuID0gYXNjX3BydF9hZHZfYm9hcmRfZWVwcm9tKHNocCwgY3AsIEFTQ19QUlRCVUZfU0laRSk7CisgICAgfQorICAgIEFTQ19BU1NFUlQoY3BsZW4gPCBBU0NfUFJUQlVGX1NJWkUpOworICAgIGNudCA9IGFzY19wcm9jX2NvcHkoYWR2b2Zmc2V0LCBvZmZzZXQsIGN1cmJ1ZiwgbGVmdGxlbiwgY3AsIGNwbGVuKTsKKyAgICB0b3RjbnQgKz0gY250OworICAgIGxlZnRsZW4gLT0gY250OworICAgIGlmIChsZWZ0bGVuID09IDApIHsKKyAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Byb2NfaW5mbzogdG90Y250ICVkXG4iLCB0b3RjbnQpOworICAgICAgICByZXR1cm4gdG90Y250OworICAgIH0KKyAgICBhZHZvZmZzZXQgKz0gY3BsZW47CisgICAgY3VyYnVmICs9IGNudDsKKworICAgIC8qCisgICAgICogRGlzcGxheSBkcml2ZXIgY29uZmlndXJhdGlvbiBhbmQgaW5mb3JtYXRpb24gZm9yIHRoZSBib2FyZC4KKyAgICAgKi8KKyAgICBjcCA9IGJvYXJkcC0+cHJ0YnVmOworICAgIGNwbGVuID0gYXNjX3BydF9kcml2ZXJfY29uZihzaHAsIGNwLCBBU0NfUFJUQlVGX1NJWkUpOworICAgIEFTQ19BU1NFUlQoY3BsZW4gPCBBU0NfUFJUQlVGX1NJWkUpOworICAgIGNudCA9IGFzY19wcm9jX2NvcHkoYWR2b2Zmc2V0LCBvZmZzZXQsIGN1cmJ1ZiwgbGVmdGxlbiwgY3AsIGNwbGVuKTsKKyAgICB0b3RjbnQgKz0gY250OworICAgIGxlZnRsZW4gLT0gY250OworICAgIGlmIChsZWZ0bGVuID09IDApIHsKKyAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Byb2NfaW5mbzogdG90Y250ICVkXG4iLCB0b3RjbnQpOworICAgICAgICByZXR1cm4gdG90Y250OworICAgIH0KKyAgICBhZHZvZmZzZXQgKz0gY3BsZW47CisgICAgY3VyYnVmICs9IGNudDsKKworI2lmZGVmIEFEVkFOU1lTX1NUQVRTCisgICAgLyoKKyAgICAgKiBEaXNwbGF5IGRyaXZlciBzdGF0aXN0aWNzIGZvciB0aGUgYm9hcmQuCisgICAgICovCisgICAgY3AgPSBib2FyZHAtPnBydGJ1ZjsKKyAgICBjcGxlbiA9IGFzY19wcnRfYm9hcmRfc3RhdHMoc2hwLCBjcCwgQVNDX1BSVEJVRl9TSVpFKTsKKyAgICBBU0NfQVNTRVJUKGNwbGVuIDw9IEFTQ19QUlRCVUZfU0laRSk7CisgICAgY250ID0gYXNjX3Byb2NfY29weShhZHZvZmZzZXQsIG9mZnNldCwgY3VyYnVmLCBsZWZ0bGVuLCBjcCwgY3BsZW4pOworICAgIHRvdGNudCArPSBjbnQ7CisgICAgbGVmdGxlbiAtPSBjbnQ7CisgICAgaWYgKGxlZnRsZW4gPT0gMCkgeworICAgICAgICBBU0NfREJHMSgxLCAiYWR2YW5zeXNfcHJvY19pbmZvOiB0b3RjbnQgJWRcbiIsIHRvdGNudCk7CisgICAgICAgIHJldHVybiB0b3RjbnQ7CisgICAgfQorICAgIGFkdm9mZnNldCArPSBjcGxlbjsKKyAgICBjdXJidWYgKz0gY250OworCisgICAgLyoKKyAgICAgKiBEaXNwbGF5IGRyaXZlciBzdGF0aXN0aWNzIGZvciBlYWNoIHRhcmdldC4KKyAgICAgKi8KKyAgICBmb3IgKHRndF9pZCA9IDA7IHRndF9pZCA8PSBBRFZfTUFYX1RJRDsgdGd0X2lkKyspIHsKKyAgICAgIGNwID0gYm9hcmRwLT5wcnRidWY7CisgICAgICBjcGxlbiA9IGFzY19wcnRfdGFyZ2V0X3N0YXRzKHNocCwgdGd0X2lkLCBjcCwgQVNDX1BSVEJVRl9TSVpFKTsKKyAgICAgIEFTQ19BU1NFUlQoY3BsZW4gPD0gQVNDX1BSVEJVRl9TSVpFKTsKKyAgICAgIGNudCA9IGFzY19wcm9jX2NvcHkoYWR2b2Zmc2V0LCBvZmZzZXQsIGN1cmJ1ZiwgbGVmdGxlbiwgY3AsIGNwbGVuKTsKKyAgICAgIHRvdGNudCArPSBjbnQ7CisgICAgICBsZWZ0bGVuIC09IGNudDsKKyAgICAgIGlmIChsZWZ0bGVuID09IDApIHsKKyAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Byb2NfaW5mbzogdG90Y250ICVkXG4iLCB0b3RjbnQpOworICAgICAgICByZXR1cm4gdG90Y250OworICAgICAgfQorICAgICAgYWR2b2Zmc2V0ICs9IGNwbGVuOworICAgICAgY3VyYnVmICs9IGNudDsKKyAgICB9CisjZW5kaWYgLyogQURWQU5TWVNfU1RBVFMgKi8KKworICAgIC8qCisgICAgICogRGlzcGxheSBBc2MgTGlicmFyeSBkeW5hbWljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKyAgICAgKiBmb3IgdGhlIGJvYXJkLgorICAgICAqLworICAgIGNwID0gYm9hcmRwLT5wcnRidWY7CisgICAgaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgeworICAgICAgICBjcGxlbiA9IGFzY19wcnRfYXNjX2JvYXJkX2luZm8oc2hwLCBjcCwgQVNDX1BSVEJVRl9TSVpFKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjcGxlbiA9IGFzY19wcnRfYWR2X2JvYXJkX2luZm8oc2hwLCBjcCwgQVNDX1BSVEJVRl9TSVpFKTsKKyAgICB9CisgICAgQVNDX0FTU0VSVChjcGxlbiA8IEFTQ19QUlRCVUZfU0laRSk7CisgICAgY250ID0gYXNjX3Byb2NfY29weShhZHZvZmZzZXQsIG9mZnNldCwgY3VyYnVmLCBsZWZ0bGVuLCBjcCwgY3BsZW4pOworICAgIHRvdGNudCArPSBjbnQ7CisgICAgbGVmdGxlbiAtPSBjbnQ7CisgICAgaWYgKGxlZnRsZW4gPT0gMCkgeworICAgICAgICBBU0NfREJHMSgxLCAiYWR2YW5zeXNfcHJvY19pbmZvOiB0b3RjbnQgJWRcbiIsIHRvdGNudCk7CisgICAgICAgIHJldHVybiB0b3RjbnQ7CisgICAgfQorICAgIGFkdm9mZnNldCArPSBjcGxlbjsKKyAgICBjdXJidWYgKz0gY250OworCisgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Byb2NfaW5mbzogdG90Y250ICVkXG4iLCB0b3RjbnQpOworCisgICAgcmV0dXJuIHRvdGNudDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCisvKgorICogYWR2YW5zeXNfZGV0ZWN0KCkKKyAqCisgKiBEZXRlY3QgZnVuY3Rpb24gZm9yIEFkdmFuU3lzIGFkYXB0ZXJzLgorICoKKyAqIEFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byB0aGUgaG9zdCBkcml2ZXIncyBzY3NpX2hvc3RzIGVudHJ5LgorICoKKyAqIFJldHVybiBudW1iZXIgb2YgYWRhcHRlcnMgZm91bmQuCisgKgorICogTm90ZTogQmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgc3lzdGVtIGluaXRpYWxpemF0aW9uCisgKiBpdCBtdXN0IG5vdCBjYWxsIFNDU0kgbWlkLWxldmVsIGZ1bmN0aW9ucyBpbmNsdWRpbmcgc2NzaV9tYWxsb2MoKQorICogYW5kIHNjc2lfZnJlZSgpLgorICovCitpbnQgX19pbml0CithZHZhbnN5c19kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCkKK3sKKyAgICBzdGF0aWMgaW50ICAgICAgICAgIGRldGVjdF9jYWxsZWQgPSBBU0NfRkFMU0U7CisgICAgaW50ICAgICAgICAgICAgICAgICBpb3A7CisgICAgaW50ICAgICAgICAgICAgICAgICBidXM7CisgICAgc3RydWN0IFNjc2lfSG9zdCAgICAqc2hwID0gTlVMTDsKKyAgICBhc2NfYm9hcmRfdCAgICAgICAgICpib2FyZHAgPSBOVUxMOworICAgIEFTQ19EVkNfVkFSICAgICAgICAgKmFzY19kdmNfdmFycCA9IE5VTEw7CisgICAgQURWX0RWQ19WQVIgICAgICAgICAqYWR2X2R2Y192YXJwID0gTlVMTDsKKyAgICBhZHZfc2dibGtfdCAgICAgICAgICpzZ3AgPSBOVUxMOworICAgIGludCAgICAgICAgICAgICAgICAgaW9wb3J0ID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHNoYXJlX2lycSA9IEZBTFNFOworICAgIGludCAgICAgICAgICAgICAgICAgaW9sZW4gPSAwOworICAgIHN0cnVjdCBkZXZpY2UJKmRldiA9IE5VTEw7CisjaWZkZWYgQ09ORklHX1BDSQorICAgIGludCAgICAgICAgICAgICAgICAgcGNpX2luaXRfc2VhcmNoID0gMDsKKyAgICBzdHJ1Y3QgcGNpX2RldiAgICAgICpwY2lfZGV2aWNlcFtBU0NfTlVNX0JPQVJEX1NVUFBPUlRFRF07CisgICAgaW50ICAgICAgICAgICAgICAgICBwY2lfY2FyZF9jbnRfbWF4ID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHBjaV9jYXJkX2NudCA9IDA7CisgICAgc3RydWN0IHBjaV9kZXYgICAgICAqcGNpX2RldnAgPSBOVUxMOworICAgIGludCAgICAgICAgICAgICAgICAgcGNpX2RldmljZV9pZF9jbnQgPSAwOworICAgIHVuc2lnbmVkIGludCAgICAgICAgcGNpX2RldmljZV9pZFtBU0NfUENJX0RFVklDRV9JRF9DTlRdID0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDX1BDSV9ERVZJQ0VfSURfMTEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ19QQ0lfREVWSUNFX0lEXzEyMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NfUENJX0RFVklDRV9JRF8xMzAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDX1BDSV9ERVZJQ0VfSURfMjMwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ19QQ0lfREVWSUNFX0lEXzI1MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NfUENJX0RFVklDRV9JRF8yNzAwCisgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgIEFEVl9QQUREUiAgICAgICAgICAgcGNpX21lbW9yeV9hZGRyZXNzOworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIHdhcm5fY29kZSwgZXJyX2NvZGU7CisgICAgaW50ICAgICAgICAgICAgICAgICByZXQ7CisKKyAgICBpZiAoZGV0ZWN0X2NhbGxlZCA9PSBBU0NfRkFMU0UpIHsKKyAgICAgICAgZGV0ZWN0X2NhbGxlZCA9IEFTQ19UUlVFOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50aygiQWR2YW5TeXMgU0NTSTogYWR2YW5zeXNfZGV0ZWN0KCkgbXVsdGlwbGUgY2FsbHMgaWdub3JlZFxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX2RldGVjdDogYmVnaW5cbiIpOworCisgICAgYXNjX2JvYXJkX2NvdW50ID0gMDsKKworICAgIC8qCisgICAgICogSWYgSS9PIHBvcnQgcHJvYmluZyBoYXMgYmVlbiBtb2RpZmllZCwgdGhlbiB2ZXJpZnkgYW5kCisgICAgICogY2xlYW4tdXAgdGhlICdhc2NfaW9wb3J0JyBsaXN0LgorICAgICAqLworICAgIGlmIChhc2NfaW9wZmxhZyA9PSBBU0NfVFJVRSkgeworICAgICAgICBmb3IgKGlvcG9ydCA9IDA7IGlvcG9ydCA8IEFTQ19OVU1fSU9QT1JUX1BST0JFOyBpb3BvcnQrKykgeworICAgICAgICAgICAgQVNDX0RCRzIoMSwgImFkdmFuc3lzX2RldGVjdDogYXNjX2lvcG9ydFslZF0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBpb3BvcnQsIGFzY19pb3BvcnRbaW9wb3J0XSk7CisgICAgICAgICAgICBpZiAoYXNjX2lvcG9ydFtpb3BvcnRdICE9IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGlvcCA9IDA7IGlvcCA8IEFTQ19JT0FEUl9UQUJMRV9NQVhfSVg7IGlvcCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfYXNjX2RlZl9pb3BfYmFzZVtpb3BdID09IGFzY19pb3BvcnRbaW9wb3J0XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlvcCA9PSBBU0NfSU9BRFJfVEFCTEVfTUFYX0lYKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50aygKKyJBZHZhblN5cyBTQ1NJOiBzcGVjaWZpZWQgSS9PIFBvcnQgMHglWCBpcyBpbnZhbGlkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2lvcG9ydFtpb3BvcnRdKTsKKyAgICAgICAgICAgICAgICAgICAgYXNjX2lvcG9ydFtpb3BvcnRdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW9wb3J0ID0gMDsKKyAgICB9CisKKyAgICBmb3IgKGJ1cyA9IDA7IGJ1cyA8IEFTQ19OVU1fQlVTOyBidXMrKykgeworCisgICAgICAgIEFTQ19EQkcyKDEsICJhZHZhbnN5c19kZXRlY3Q6IGJ1cyBzZWFyY2ggdHlwZSAlZCAoJXMpXG4iLAorICAgICAgICAgICAgYnVzLCBhc2NfYnVzX25hbWVbYnVzXSk7CisgICAgICAgIGlvcCA9IDA7CisKKyAgICAgICAgd2hpbGUgKGFzY19ib2FyZF9jb3VudCA8IEFTQ19OVU1fQk9BUkRfU1VQUE9SVEVEKSB7CisKKyAgICAgICAgICAgIEFTQ19EQkcxKDIsICJhZHZhbnN5c19kZXRlY3Q6IGFzY19ib2FyZF9jb3VudCAlZFxuIiwKKyAgICAgICAgICAgICAgICBhc2NfYm9hcmRfY291bnQpOworCisgICAgICAgICAgICBzd2l0Y2ggKGFzY19idXNbYnVzXSkgeworICAgICAgICAgICAgY2FzZSBBU0NfSVNfSVNBOgorICAgICAgICAgICAgY2FzZSBBU0NfSVNfVkw6CisjaWZkZWYgQ09ORklHX0lTQQorICAgICAgICAgICAgICAgIGlmIChhc2NfaW9wZmxhZyA9PSBBU0NfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgaW9wID0gQXNjU2VhcmNoSU9Qb3J0QWRkcihpb3AsIGFzY19idXNbYnVzXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogSVNBIGFuZCBWTCBJL08gcG9ydCBzY2FubmluZyBoYXMgZWl0aGVyIGJlZW4KKyAgICAgICAgICAgICAgICAgICAgICogZWxpbWluYXRlZCBvciBsaW1pdGVkIHRvIHNlbGVjdGVkIHBvcnRzIG9uCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSBMSUxPIGNvbW1hbmQgbGluZSwgL2V0Yy9saWxvLmNvbmYsIG9yCisgICAgICAgICAgICAgICAgICAgICAqIGJ5IHNldHRpbmcgdmFyaWFibGVzIHdoZW4gdGhlIG1vZHVsZSB3YXMgbG9hZGVkLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfZGV0ZWN0OiBJL08gcG9ydCBzY2FubmluZyBtb2RpZmllZFxuIik7CisgICAgICAgICAgICAgICAgaW9wb3J0X3RyeV9hZ2FpbjoKKyAgICAgICAgICAgICAgICAgICAgaW9wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7IGlvcG9ydCA8IEFTQ19OVU1fSU9QT1JUX1BST0JFOyBpb3BvcnQrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpb3AgPSBhc2NfaW9wb3J0W2lvcG9ydF0pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaW9wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBU0NfREJHMSgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR2YW5zeXNfZGV0ZWN0OiBwcm9iaW5nIEkvTyBwb3J0IDB4JXguLi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja19yZWdpb24oaW9wLCBBU0NfSU9BRFJfR0FQKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKAorIkFkdmFuU3lzIFNDU0k6IHNwZWNpZmllZCBJL08gUG9ydCAweCVYIGlzIGJ1c3lcbiIsIGlvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgdHJ5IHRoaXMgSS9PIHBvcnQgdHdpY2UuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2lvcG9ydFtpb3BvcnRdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlvcG9ydF90cnlfYWdhaW47CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFzY0ZpbmRTaWduYXR1cmUoaW9wKSA9PSBBU0NfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoCisiQWR2YW5TeXMgU0NTSTogc3BlY2lmaWVkIEkvTyBQb3J0IDB4JVggaGFzIG5vIGFkYXB0ZXJcbiIsIGlvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgdHJ5IHRoaXMgSS9PIHBvcnQgdHdpY2UuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2lvcG9ydFtpb3BvcnRdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlvcG9ydF90cnlfYWdhaW47CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSWYgdGhpcyBpc24ndCBhbiBJU0EgYm9hcmQsIHRoZW4gaXQgbXVzdCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGEgVkwgYm9hcmQuIElmIGN1cnJlbnRseSBsb29raW5nIGFuIElTQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJvYXJkIGlzIGJlaW5nIGxvb2tlZCBmb3IgdGhlbiB0cnkgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5vdGhlciBJU0EgYm9hcmQgaW4gJ2FzY19pb3BvcnQnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhc2NfYnVzW2J1c10gPT0gQVNDX0lTX0lTQSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXNjR2V0Q2hpcFZlcnNpb24oaW9wLCBBU0NfSVNfSVNBKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NfQ0hJUF9WRVJfSVNBX0JJVCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIERvbid0IGNsZWFyICdhc2NfaW9wb3J0W2lvcG9ydF0nLiBUcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMgYm9hcmQgYWdhaW4gZm9yIFZMLiBJbmNyZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICdpb3BvcnQnIHBhc3QgdGhpcyBib2FyZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9wb3J0Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlvcG9ydF90cnlfYWdhaW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgYm9hcmQgYXBwZWFycyBnb29kLCBkb24ndCB0cnkgdGhlIEkvTyBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBhZ2FpbiBieSBjbGVhcmluZyBpdHMgdmFsdWUuIEluY3JlbWVudCAnaW9wb3J0JworICAgICAgICAgICAgICAgICAgICAgICAgICogZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2lvcG9ydFtpb3BvcnQrK10gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBU0NfSVNfRUlTQToKKyNpZmRlZiBDT05GSUdfSVNBCisgICAgICAgICAgICAgICAgaW9wID0gQXNjU2VhcmNoSU9Qb3J0QWRkcihpb3AsIGFzY19idXNbYnVzXSk7CisjZW5kaWYgLyogQ09ORklHX0lTQSAqLworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFTQ19JU19QQ0k6CisjaWZkZWYgQ09ORklHX1BDSQorICAgICAgICAgICAgICAgIGlmIChwY2lfaW5pdF9zZWFyY2ggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgaSwgajsKKworICAgICAgICAgICAgICAgICAgICBwY2lfaW5pdF9zZWFyY2ggPSAxOworCisgICAgICAgICAgICAgICAgICAgIC8qIEZpbmQgYWxsIFBDSSBjYXJkcy4gKi8KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBjaV9kZXZpY2VfaWRfY250IDwgQVNDX1BDSV9ERVZJQ0VfSURfQ05UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBjaV9kZXZwID0gcGNpX2ZpbmRfZGV2aWNlKEFTQ19QQ0lfVkVORE9SSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX2RldmljZV9pZFtwY2lfZGV2aWNlX2lkX2NudF0sIHBjaV9kZXZwKSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX2RldmljZV9pZF9jbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXZwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9kZXZpY2VwW3BjaV9jYXJkX2NudF9tYXgrK10gPSBwY2lfZGV2cDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBTb3J0IFBDSSBjYXJkcyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgUENJIEJ1cywgU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICogYW5kIERldmljZSBOdW1iZXIuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGNpX2NhcmRfY250X21heCAtIDE7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBwY2lfY2FyZF9jbnRfbWF4OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBjaV9kZXZpY2VwW2pdLT5idXMtPm51bWJlciA8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZGV2aWNlcFtpXS0+YnVzLT5udW1iZXIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGNpX2RldmljZXBbal0tPmJ1cy0+bnVtYmVyID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX2RldmljZXBbaV0tPmJ1cy0+bnVtYmVyKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwY2lfZGV2aWNlcFtqXS0+ZGV2Zm4gPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZGV2aWNlcFtpXS0+ZGV2Zm4pKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZGV2cCA9IHBjaV9kZXZpY2VwW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZGV2aWNlcFtpXSA9IHBjaV9kZXZpY2VwW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZGV2aWNlcFtqXSA9IHBjaV9kZXZwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBjaV9jYXJkX2NudCA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGNpX2NhcmRfY250Kys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBjaV9jYXJkX2NudCA9PSBwY2lfY2FyZF9jbnRfbWF4KSB7CisgICAgICAgICAgICAgICAgICAgIGlvcCA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGNpX2RldnAgPSBwY2lfZGV2aWNlcFtwY2lfY2FyZF9jbnRdOworCisgICAgICAgICAgICAgICAgICAgIEFTQ19EQkcyKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAiYWR2YW5zeXNfZGV0ZWN0OiBkZXZmbiAlZCwgYnVzIG51bWJlciAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9kZXZwLT5kZXZmbiwgcGNpX2RldnAtPmJ1cy0+bnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaW9wID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXZwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgQVNDX0RCRzIoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhZHZhbnN5c19kZXRlY3Q6IHZlbmRvcklEICVYLCBkZXZpY2VJRCAlWFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9kZXZwLT52ZW5kb3IsIHBjaV9kZXZwLT5kZXZpY2UpOworICAgICAgICAgICAgICAgICAgICBBU0NfREJHMigyLCAiYWR2YW5zeXNfZGV0ZWN0OiBpb3AgJVgsIGlycUxpbmUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpb3AsIHBjaV9kZXZwLT5pcnEpOworICAgICAgICAgICAgICAgIH0KKwkJaWYocGNpX2RldnApCisJCSAgICBkZXYgPSAmcGNpX2RldnAtPmRldjsKKworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKCJhZHZhbnN5c19kZXRlY3Q6IHVua25vd24gYnVzIHR5cGU6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBhc2NfYnVzW2J1c10pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX2RldGVjdDogaW9wIDB4JXhcbiIsIGlvcCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBZGFwdGVyIG5vdCBmb3VuZCwgdHJ5IG5leHQgYnVzIHR5cGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChpb3AgPT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQWRhcHRlciBmb3VuZC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBSZWdpc3RlciB0aGUgYWRhcHRlciwgZ2V0IGl0cyBjb25maWd1cmF0aW9uLCBhbmQKKyAgICAgICAgICAgICAqIGluaXRpYWxpemUgaXQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFTQ19EQkcoMiwgImFkdmFuc3lzX2RldGVjdDogc2NzaV9yZWdpc3RlcigpXG4iKTsKKyAgICAgICAgICAgIHNocCA9IHNjc2lfcmVnaXN0ZXIodHBudCwgc2l6ZW9mKGFzY19ib2FyZF90KSk7CisKKyAgICAgICAgICAgIGlmIChzaHAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisJICAgIHNjc2lfc2V0X2RldmljZShzaHAsIGRldik7CisKKyAgICAgICAgICAgIC8qIFNhdmUgYSBwb2ludGVyIHRvIHRoZSBTY3NpX0hvc3Qgb2YgZWFjaCBib2FyZCBmb3VuZC4gKi8KKyAgICAgICAgICAgIGFzY19ob3N0W2FzY19ib2FyZF9jb3VudCsrXSA9IHNocDsKKworICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBwcml2YXRlIHBlciBib2FyZCBkYXRhICovCisgICAgICAgICAgICBib2FyZHAgPSBBU0NfQk9BUkRQKHNocCk7CisgICAgICAgICAgICBtZW1zZXQoYm9hcmRwLCAwLCBzaXplb2YoYXNjX2JvYXJkX3QpKTsKKyAgICAgICAgICAgIGJvYXJkcC0+aWQgPSBhc2NfYm9hcmRfY291bnQgLSAxOworCisgICAgICAgICAgICAvKiBJbml0aWFsaXplIHNwaW5sb2NrLiAqLworICAgICAgICAgICAgc3Bpbl9sb2NrX2luaXQoJmJvYXJkcC0+bG9jayk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBIYW5kbGUgYm90aCBuYXJyb3cgYW5kIHdpZGUgYm9hcmRzLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIElmIGEgV2lkZSBib2FyZCB3YXMgZGV0ZWN0ZWQsIHNldCB0aGUgYm9hcmQgc3RydWN0dXJlCisgICAgICAgICAgICAgKiB3aWRlIGJvYXJkIGZsYWcuIFNldC11cCB0aGUgYm9hcmQgc3RydWN0dXJlIGJhc2VkIG9uCisgICAgICAgICAgICAgKiB0aGUgYm9hcmQgdHlwZS4KKyAgICAgICAgICAgICAqLworI2lmZGVmIENPTkZJR19QQ0kKKyAgICAgICAgICAgIGlmIChhc2NfYnVzW2J1c10gPT0gQVNDX0lTX1BDSSAmJgorICAgICAgICAgICAgICAgIChwY2lfZGV2cC0+ZGV2aWNlID09IEFTQ19QQ0lfREVWSUNFX0lEXzIzMDAgfHwKKyAgICAgICAgICAgICAgICAgcGNpX2RldnAtPmRldmljZSA9PSBBU0NfUENJX0RFVklDRV9JRF8yNTAwIHx8CisgICAgICAgICAgICAgICAgIHBjaV9kZXZwLT5kZXZpY2UgPT0gQVNDX1BDSV9ERVZJQ0VfSURfMjcwMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9hcmRwLT5mbGFncyB8PSBBU0NfSVNfV0lERV9CT0FSRDsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKKyAgICAgICAgICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgICAgICAgICBBU0NfREJHKDEsICJhZHZhbnN5c19kZXRlY3Q6IG5hcnJvdyBib2FyZFxuIik7CisgICAgICAgICAgICAgICAgYXNjX2R2Y192YXJwID0gJmJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3ZhcjsKKyAgICAgICAgICAgICAgICBhc2NfZHZjX3ZhcnAtPmJ1c190eXBlID0gYXNjX2J1c1tidXNdOworICAgICAgICAgICAgICAgIGFzY19kdmNfdmFycC0+ZHJ2X3B0ciA9IGJvYXJkcDsKKyAgICAgICAgICAgICAgICBhc2NfZHZjX3ZhcnAtPmNmZyA9ICZib2FyZHAtPmR2Y19jZmcuYXNjX2R2Y19jZmc7CisgICAgICAgICAgICAgICAgYXNjX2R2Y192YXJwLT5jZmctPm92ZXJydW5fYnVmID0gJm92ZXJydW5fYnVmWzBdOworICAgICAgICAgICAgICAgIGFzY19kdmNfdmFycC0+aW9wX2Jhc2UgPSBpb3A7CisgICAgICAgICAgICAgICAgYXNjX2R2Y192YXJwLT5pc3JfY2FsbGJhY2sgPSBhc2NfaXNyX2NhbGxiYWNrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBU0NfREJHKDEsICJhZHZhbnN5c19kZXRlY3Q6IHdpZGUgYm9hcmRcbiIpOworICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycCA9ICZib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXI7CisgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5kcnZfcHRyID0gYm9hcmRwOworICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnID0gJmJvYXJkcC0+ZHZjX2NmZy5hZHZfZHZjX2NmZzsKKyAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmlzcl9jYWxsYmFjayA9IGFkdl9pc3JfY2FsbGJhY2s7CisgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5hc3luY19jYWxsYmFjayA9IGFkdl9hc3luY19jYWxsYmFjazsKKyNpZmRlZiBDT05GSUdfUENJCisgICAgICAgICAgICAgICAgaWYgKHBjaV9kZXZwLT5kZXZpY2UgPT0gQVNDX1BDSV9ERVZJQ0VfSURfMjMwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX2RldGVjdDogQVNDLTM1NTBcbiIpOworICAgICAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9IEFEVl9DSElQX0FTQzM1NTA7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwY2lfZGV2cC0+ZGV2aWNlID09IEFTQ19QQ0lfREVWSUNFX0lEXzI1MDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBU0NfREJHKDEsICJhZHZhbnN5c19kZXRlY3Q6IEFTQy0zOEMwODAwXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPSBBRFZfQ0hJUF9BU0MzOEMwODAwOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfZGV0ZWN0OiBBU0MtMzhDMTYwMFxuIik7CisgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID0gQURWX0NISVBfQVNDMzhDMTYwMDsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBNYXAgdGhlIGJvYXJkJ3MgcmVnaXN0ZXJzIGludG8gdmlydHVhbCBtZW1vcnkgZm9yCisgICAgICAgICAgICAgICAgICogUENJIHNsYXZlIGFjY2Vzcy4gT25seSBtZW1vcnkgYWNjZXNzZXMgYXJlIHVzZWQgdG8KKyAgICAgICAgICAgICAgICAgKiBhY2Nlc3MgdGhlIGJvYXJkJ3MgcmVnaXN0ZXJzLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogTm90ZTogVGhlIFBDSSByZWdpc3RlciBiYXNlIGFkZHJlc3MgaXMgbm90IGFsd2F5cworICAgICAgICAgICAgICAgICAqIHBhZ2UgYWxpZ25lZCwgYnV0IHRoZSBhZGRyZXNzIHBhc3NlZCB0byBpb3JlbWFwKCkKKyAgICAgICAgICAgICAgICAgKiBtdXN0IGJlIHBhZ2UgYWxpZ25lZC4gSXQgaXMgZ3VhcmFudGVlZCB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAqIFBDSSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgd2lsbCBub3QgY3Jvc3MgYSBwYWdlCisgICAgICAgICAgICAgICAgICogYm91bmRhcnkuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpb2xlbiA9IEFEVl8zNTUwX0lPTEVOOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlvbGVuID0gQURWXzM4QzA4MDBfSU9MRU47CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpb2xlbiA9IEFEVl8zOEMxNjAwX0lPTEVOOworICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBDT05GSUdfUENJCisgICAgICAgICAgICAgICAgcGNpX21lbW9yeV9hZGRyZXNzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXZwLCAxKTsKKyAgICAgICAgICAgICAgICBBU0NfREJHMSgxLCAiYWR2YW5zeXNfZGV0ZWN0OiBwY2lfbWVtb3J5X2FkZHJlc3M6IDB4JWx4XG4iLAorICAgICAgICAgICAgICAgICAgICAodWxvbmcpIHBjaV9tZW1vcnlfYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgaWYgKChib2FyZHAtPmlvcmVtYXBfYWRkciA9CisgICAgICAgICAgICAgICAgICAgIGlvcmVtYXAocGNpX21lbW9yeV9hZGRyZXNzICYgUEFHRV9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfU0laRSkpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQzKAorImFkdmFuc3lzX2RldGVjdDogYm9hcmQgJWQ6IGlvcmVtYXAoJXgsICVkKSByZXR1cm5lZCBOVUxMXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCBwY2lfbWVtb3J5X2FkZHJlc3MsIGlvbGVuKTsKKyAgICAgICAgICAgICAgICAgICBzY3NpX3VucmVnaXN0ZXIoc2hwKTsKKyAgICAgICAgICAgICAgICAgICBhc2NfYm9hcmRfY291bnQtLTsKKyAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX2RldGVjdDogaW9yZW1hcF9hZGRyOiAweCVseFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKHVsb25nKSBib2FyZHAtPmlvcmVtYXBfYWRkcik7CisgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5pb3BfYmFzZSA9IChBZHZQb3J0QWRkcikKKyAgICAgICAgICAgICAgICAgICAgKGJvYXJkcC0+aW9yZW1hcF9hZGRyICsKKyAgICAgICAgICAgICAgICAgICAgIChwY2lfbWVtb3J5X2FkZHJlc3MgLSAocGNpX21lbW9yeV9hZGRyZXNzICYgUEFHRV9NQVNLKSkpOworICAgICAgICAgICAgICAgIEFTQ19EQkcxKDEsICJhZHZhbnN5c19kZXRlY3Q6IGlvcF9iYXNlOiAweCVseFxuIiwKKyAgICAgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5pb3BfYmFzZSk7CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBFdmVuIHRob3VnaCBpdCBpc24ndCB1c2VkIHRvIGFjY2VzcyB3aWRlIGJvYXJkcywgb3RoZXIKKyAgICAgICAgICAgICAgICAgKiB0aGFuIGZvciB0aGUgZGVidWcgbGluZSBiZWxvdywgc2F2ZSBJL08gUG9ydCBhZGRyZXNzIHNvCisgICAgICAgICAgICAgICAgICogdGhhdCBpdCBjYW4gYmUgcmVwb3J0ZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYm9hcmRwLT5pb3BvcnQgPSBpb3A7CisKKyAgICAgICAgICAgICAgICBBU0NfREJHMigxLAorImFkdmFuc3lzX2RldGVjdDogaW9wYl9jaGlwX2lkXzEgMHgleCwgaW9wd19jaGlwX2lkXzAgMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgaW5wKGlvcCArIDEpLCAodXNob3J0KSBpbnB3KGlvcCkpOworICAgICAgICAgICAgfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHByaW50aW5nIGluZm9ybWF0aW9uIGZyb20KKyAgICAgICAgICAgICAqIC9wcm9jL3Njc2kvYWR2YW5zeXMvWzAuLi5dLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKGJvYXJkcC0+cHJ0YnVmID0KKyAgICAgICAgICAgICAgICBrbWFsbG9jKEFTQ19QUlRCVUZfU0laRSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBU0NfUFJJTlQzKAorImFkdmFuc3lzX2RldGVjdDogYm9hcmQgJWQ6IGttYWxsb2MoJWQsICVkKSByZXR1cm5lZCBOVUxMXG4iLAorICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCBBU0NfUFJUQlVGX1NJWkUsIEdGUF9BVE9NSUMpOworICAgICAgICAgICAgICAgIHNjc2lfdW5yZWdpc3RlcihzaHApOworICAgICAgICAgICAgICAgIGFzY19ib2FyZF9jb3VudC0tOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKyAgICAgICAgICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKwkJYXNjX2R2Y192YXJwLT5jZmctPmRldiA9IGRldjsKKwkJLyoKKyAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGJvYXJkIGJ1cyB0eXBlIGFuZCBQQ0kgSVJRIGJlZm9yZQorICAgICAgICAgICAgICAgICAqIGNhbGxpbmcgQXNjSW5pdEdldENvbmZpZygpLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHN3aXRjaCAoYXNjX2R2Y192YXJwLT5idXNfdHlwZSkgeworI2lmZGVmIENPTkZJR19JU0EKKyAgICAgICAgICAgICAgICBjYXNlIEFTQ19JU19JU0E6CisgICAgICAgICAgICAgICAgICAgIHNocC0+dW5jaGVja2VkX2lzYV9kbWEgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBzaGFyZV9pcnEgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBU0NfSVNfVkw6CisgICAgICAgICAgICAgICAgICAgIHNocC0+dW5jaGVja2VkX2lzYV9kbWEgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgc2hhcmVfaXJxID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVNDX0lTX0VJU0E6CisgICAgICAgICAgICAgICAgICAgIHNocC0+dW5jaGVja2VkX2lzYV9kbWEgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgc2hhcmVfaXJxID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX0lTQSAqLworI2lmZGVmIENPTkZJR19QQ0kKKyAgICAgICAgICAgICAgICBjYXNlIEFTQ19JU19QQ0k6CisgICAgICAgICAgICAgICAgICAgIHNocC0+aXJxID0gYXNjX2R2Y192YXJwLT5pcnFfbm8gPSBwY2lfZGV2cC0+aXJxOworICAgICAgICAgICAgICAgICAgICBhc2NfZHZjX3ZhcnAtPmNmZy0+cGNpX3Nsb3RfaW5mbyA9CisgICAgICAgICAgICAgICAgICAgICAgICBBU0NfUENJX01LSUQocGNpX2RldnAtPmJ1cy0+bnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9TTE9UKHBjaV9kZXZwLT5kZXZmbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0ZVTkMocGNpX2RldnAtPmRldmZuKSk7CisgICAgICAgICAgICAgICAgICAgIHNocC0+dW5jaGVja2VkX2lzYV9kbWEgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgc2hhcmVfaXJxID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDIoCisiYWR2YW5zeXNfZGV0ZWN0OiBib2FyZCAlZDogdW5rbm93biBhZGFwdGVyIHR5cGU6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgYXNjX2R2Y192YXJwLT5idXNfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHNocC0+dW5jaGVja2VkX2lzYV9kbWEgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBzaGFyZV9pcnEgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmNmZy0+ZGV2ID0gZGV2OworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRm9yIFdpZGUgYm9hcmRzIHNldCBQQ0kgaW5mb3JtYXRpb24gYmVmb3JlIGNhbGxpbmcKKyAgICAgICAgICAgICAgICAgKiBBZHZJbml0R2V0Q29uZmlnKCkuCisgICAgICAgICAgICAgICAgICovCisjaWZkZWYgQ09ORklHX1BDSQorICAgICAgICAgICAgICAgIHNocC0+aXJxID0gYWR2X2R2Y192YXJwLT5pcnFfbm8gPSBwY2lfZGV2cC0+aXJxOworICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5wY2lfc2xvdF9pbmZvID0KKyAgICAgICAgICAgICAgICAgICAgQVNDX1BDSV9NS0lEKHBjaV9kZXZwLT5idXMtPm51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9TTE9UKHBjaV9kZXZwLT5kZXZmbiksCisgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfRlVOQyhwY2lfZGV2cC0+ZGV2Zm4pKTsKKyAgICAgICAgICAgICAgICBzaHAtPnVuY2hlY2tlZF9pc2FfZG1hID0gRkFMU0U7CisgICAgICAgICAgICAgICAgc2hhcmVfaXJxID0gVFJVRTsKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZWFkIHRoZSBib2FyZCBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAqIE5PVEU6IEFzY0luaXRHZXRDb25maWcoKSBtYXkgY2hhbmdlIHRoZSBib2FyZCdzCisgICAgICAgICAgICAgICAgICAqIGJ1c190eXBlIHZhbHVlLiBUaGUgYXNjX2J1c1tidXNdIHZhbHVlIHNob3VsZCBubworICAgICAgICAgICAgICAgICAgKiBsb25nZXIgYmUgdXNlZC4gSWYgdGhlIGJ1c190eXBlIGZpZWxkIG11c3QgYmUKKyAgICAgICAgICAgICAgICAgICogcmVmZXJlbmNlZCBvbmx5IHVzZSB0aGUgYml0LXdpc2UgQU5EIG9wZXJhdG9yICImIi4KKyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQVNDX0RCRygyLCAiYWR2YW5zeXNfZGV0ZWN0OiBBc2NJbml0R2V0Q29uZmlnKClcbiIpOworICAgICAgICAgICAgICAgIHN3aXRjaChyZXQgPSBBc2NJbml0R2V0Q29uZmlnKGFzY19kdmNfdmFycCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6ICAgIC8qIE5vIGVycm9yICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVNDX1dBUk5fSU9fUE9SVF9ST1RBVEU6CisgICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDEoCisiQXNjSW5pdEdldENvbmZpZzogYm9hcmQgJWQ6IEkvTyBwb3J0IGFkZHJlc3MgbW9kaWZpZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBU0NfV0FSTl9BVVRPX0NPTkZJRzoKKyAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMSgKKyJBc2NJbml0R2V0Q29uZmlnOiBib2FyZCAlZDogSS9PIHBvcnQgaW5jcmVtZW50IHN3aXRjaCBlbmFibGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVNDX1dBUk5fRUVQUk9NX0NIS1NVTToKKyAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMSgKKyJBc2NJbml0R2V0Q29uZmlnOiBib2FyZCAlZDogRUVQUk9NIGNoZWNrc3VtIGVycm9yXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVNDX1dBUk5fSVJRX01PRElGSUVEOgorICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAorIkFzY0luaXRHZXRDb25maWc6IGJvYXJkICVkOiBJUlEgbW9kaWZpZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBU0NfV0FSTl9DTURfUU5HX0NPTkZMSUNUOgorICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAorIkFzY0luaXRHZXRDb25maWc6IGJvYXJkICVkOiB0YWcgcXVldWluZyBlbmFibGVkIHcvbyBkaXNjb25uZWN0c1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQyKAorIkFzY0luaXRHZXRDb25maWc6IGJvYXJkICVkOiB1bmtub3duIHdhcm5pbmc6IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCByZXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChlcnJfY29kZSA9IGFzY19kdmNfdmFycC0+ZXJyX2NvZGUpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMygKKyJBc2NJbml0R2V0Q29uZmlnOiBib2FyZCAlZCBlcnJvcjogaW5pdF9zdGF0ZSAweCV4LCBlcnJfY29kZSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgYXNjX2R2Y192YXJwLT5pbml0X3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2R2Y192YXJwLT5lcnJfY29kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBU0NfREJHKDIsICJhZHZhbnN5c19kZXRlY3Q6IEFkdkluaXRHZXRDb25maWcoKVxuIik7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBBZHZJbml0R2V0Q29uZmlnKGFkdl9kdmNfdmFycCkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMigiQWR2SW5pdEdldENvbmZpZzogYm9hcmQgJWQ6IHdhcm5pbmc6IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCByZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGVycl9jb2RlID0gYWR2X2R2Y192YXJwLT5lcnJfY29kZSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQyKAorIkFkdkluaXRHZXRDb25maWc6IGJvYXJkICVkIGVycm9yOiBlcnJfY29kZSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgYWR2X2R2Y192YXJwLT5lcnJfY29kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXJyX2NvZGUgIT0gMCkgeworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisgICAgICAgICAgICAgICAga2ZyZWUoYm9hcmRwLT5wcnRidWYpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisgICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgICAgICAgICAgICAgYXNjX2JvYXJkX2NvdW50LS07CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBTYXZlIHRoZSBFRVBST00gY29uZmlndXJhdGlvbiBzbyB0aGF0IGl0IGNhbiBiZSBkaXNwbGF5ZWQKKyAgICAgICAgICAgICAqIGZyb20gL3Byb2Mvc2NzaS9hZHZhbnN5cy9bMC4uLl0uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKworICAgICAgICAgICAgICAgIEFTQ0VFUF9DT05GSUcgKmVwOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGFkYXB0ZXIncyB0YXJnZXQgaWQgYml0IGluIHRoZSAnaW5pdF90aWRtYXNrJyBmaWVsZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBib2FyZHAtPmluaXRfdGlkbWFzayB8PQorICAgICAgICAgICAgICAgICAgICBBRFZfVElEX1RPX1RJRE1BU0soYXNjX2R2Y192YXJwLT5jZmctPmNoaXBfc2NzaV9pZCk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNhdmUgRUVQUk9NIHNldHRpbmdzIGZvciB0aGUgYm9hcmQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZXAgPSAmYm9hcmRwLT5lZXBfY29uZmlnLmFzY19lZXA7CisKKyAgICAgICAgICAgICAgICBlcC0+aW5pdF9zZHRyID0gYXNjX2R2Y192YXJwLT5jZmctPnNkdHJfZW5hYmxlOworICAgICAgICAgICAgICAgIGVwLT5kaXNjX2VuYWJsZSA9IGFzY19kdmNfdmFycC0+Y2ZnLT5kaXNjX2VuYWJsZTsKKyAgICAgICAgICAgICAgICBlcC0+dXNlX2NtZF9xbmcgPSBhc2NfZHZjX3ZhcnAtPmNmZy0+Y21kX3FuZ19lbmFibGVkOworICAgICAgICAgICAgICAgIEFTQ19FRVBfU0VUX0RNQV9TUEQoZXAsIGFzY19kdmNfdmFycC0+Y2ZnLT5pc2FfZG1hX3NwZWVkKTsKKyAgICAgICAgICAgICAgICBlcC0+c3RhcnRfbW90b3IgPSBhc2NfZHZjX3ZhcnAtPnN0YXJ0X21vdG9yOworICAgICAgICAgICAgICAgIGVwLT5jbnRsID0gYXNjX2R2Y192YXJwLT5kdmNfY250bDsKKyAgICAgICAgICAgICAgICBlcC0+bm9fc2NhbSA9IGFzY19kdmNfdmFycC0+bm9fc2NhbTsKKyAgICAgICAgICAgICAgICBlcC0+bWF4X3RvdGFsX3FuZyA9IGFzY19kdmNfdmFycC0+bWF4X3RvdGFsX3FuZzsKKyAgICAgICAgICAgICAgICBBU0NfRUVQX1NFVF9DSElQX0lEKGVwLCBhc2NfZHZjX3ZhcnAtPmNmZy0+Y2hpcF9zY3NpX2lkKTsKKyAgICAgICAgICAgICAgICAvKiAnbWF4X3RhZ19xbmcnIGlzIHNldCB0byB0aGUgc2FtZSB2YWx1ZSBmb3IgZXZlcnkgZGV2aWNlLiAqLworICAgICAgICAgICAgICAgIGVwLT5tYXhfdGFnX3FuZyA9IGFzY19kdmNfdmFycC0+Y2ZnLT5tYXhfdGFnX3FuZ1swXTsKKyAgICAgICAgICAgICAgICBlcC0+YWRhcHRlcl9pbmZvWzBdID0gYXNjX2R2Y192YXJwLT5jZmctPmFkYXB0ZXJfaW5mb1swXTsKKyAgICAgICAgICAgICAgICBlcC0+YWRhcHRlcl9pbmZvWzFdID0gYXNjX2R2Y192YXJwLT5jZmctPmFkYXB0ZXJfaW5mb1sxXTsKKyAgICAgICAgICAgICAgICBlcC0+YWRhcHRlcl9pbmZvWzJdID0gYXNjX2R2Y192YXJwLT5jZmctPmFkYXB0ZXJfaW5mb1syXTsKKyAgICAgICAgICAgICAgICBlcC0+YWRhcHRlcl9pbmZvWzNdID0gYXNjX2R2Y192YXJwLT5jZmctPmFkYXB0ZXJfaW5mb1szXTsKKyAgICAgICAgICAgICAgICBlcC0+YWRhcHRlcl9pbmZvWzRdID0gYXNjX2R2Y192YXJwLT5jZmctPmFkYXB0ZXJfaW5mb1s0XTsKKyAgICAgICAgICAgICAgICBlcC0+YWRhcHRlcl9pbmZvWzVdID0gYXNjX2R2Y192YXJwLT5jZmctPmFkYXB0ZXJfaW5mb1s1XTsKKworICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAqIE1vZGlmeSBib2FyZCBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQVNDX0RCRygyLCAiYWR2YW5zeXNfZGV0ZWN0OiBBc2NJbml0U2V0Q29uZmlnKClcbiIpOworICAgICAgICAgICAgICAgIHN3aXRjaCAocmV0ID0gQXNjSW5pdFNldENvbmZpZyhhc2NfZHZjX3ZhcnApKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiAgICAvKiBObyBlcnJvci4gKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBU0NfV0FSTl9JT19QT1JUX1JPVEFURToKKyAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMSgKKyJBc2NJbml0U2V0Q29uZmlnOiBib2FyZCAlZDogSS9PIHBvcnQgYWRkcmVzcyBtb2RpZmllZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFTQ19XQVJOX0FVVE9fQ09ORklHOgorICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAorIkFzY0luaXRTZXRDb25maWc6IGJvYXJkICVkOiBJL08gcG9ydCBpbmNyZW1lbnQgc3dpdGNoIGVuYWJsZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBU0NfV0FSTl9FRVBST01fQ0hLU1VNOgorICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAorIkFzY0luaXRTZXRDb25maWc6IGJvYXJkICVkOiBFRVBST00gY2hlY2tzdW0gZXJyb3JcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBU0NfV0FSTl9JUlFfTU9ESUZJRUQ6CisgICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDEoCisiQXNjSW5pdFNldENvbmZpZzogYm9hcmQgJWQ6IElSUSBtb2RpZmllZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFTQ19XQVJOX0NNRF9RTkdfQ09ORkxJQ1Q6CisgICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDEoCisiQXNjSW5pdFNldENvbmZpZzogYm9hcmQgJWQ6IHRhZyBxdWV1aW5nIHcvbyBkaXNjb25uZWN0c1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQyKAorIkFzY0luaXRTZXRDb25maWc6IGJvYXJkICVkOiB1bmtub3duIHdhcm5pbmc6IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCByZXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFzY19kdmNfdmFycC0+ZXJyX2NvZGUgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQzKAorIkFzY0luaXRTZXRDb25maWc6IGJvYXJkICVkIGVycm9yOiBpbml0X3N0YXRlIDB4JXgsIGVycl9jb2RlIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCBhc2NfZHZjX3ZhcnAtPmluaXRfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjX3ZhcnAtPmVycl9jb2RlKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworICAgICAgICAgICAgICAgICAgICBrZnJlZShib2FyZHAtPnBydGJ1Zik7CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKyAgICAgICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgICAgICAgICAgICAgICAgIGFzY19ib2FyZF9jb3VudC0tOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEZpbmlzaCBpbml0aWFsaXppbmcgdGhlICdTY3NpX0hvc3QnIHN0cnVjdHVyZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAvKiBBc2NJbml0U2V0Q29uZmlnKCkgd2lsbCBzZXQgdGhlIElSUSBmb3Igbm9uLVBDSSBib2FyZHMuICovCisgICAgICAgICAgICAgICAgaWYgKChhc2NfZHZjX3ZhcnAtPmJ1c190eXBlICYgQVNDX0lTX1BDSSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzaHAtPmlycSA9IGFzY19kdmNfdmFycC0+aXJxX25vOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQURWRUVQXzM1NTBfQ09ORklHICAgICAgKmVwXzM1NTA7CisgICAgICAgICAgICAgICAgQURWRUVQXzM4QzA4MDBfQ09ORklHICAgKmVwXzM4QzA4MDA7CisgICAgICAgICAgICAgICAgQURWRUVQXzM4QzE2MDBfQ09ORklHICAgKmVwXzM4QzE2MDA7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNhdmUgV2lkZSBFRVAgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVwXzM1NTAgPSAmYm9hcmRwLT5lZXBfY29uZmlnLmFkdl8zNTUwX2VlcDsKKworICAgICAgICAgICAgICAgICAgICBlcF8zNTUwLT5hZGFwdGVyX3Njc2lfaWQgPSBhZHZfZHZjX3ZhcnAtPmNoaXBfc2NzaV9pZDsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzU1MC0+bWF4X2hvc3RfcW5nID0gYWR2X2R2Y192YXJwLT5tYXhfaG9zdF9xbmc7CisgICAgICAgICAgICAgICAgICAgIGVwXzM1NTAtPm1heF9kdmNfcW5nID0gYWR2X2R2Y192YXJwLT5tYXhfZHZjX3FuZzsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzU1MC0+dGVybWluYXRpb24gPSBhZHZfZHZjX3ZhcnAtPmNmZy0+dGVybWluYXRpb247CisgICAgICAgICAgICAgICAgICAgIGVwXzM1NTAtPmRpc2NfZW5hYmxlID0gYWR2X2R2Y192YXJwLT5jZmctPmRpc2NfZW5hYmxlOworICAgICAgICAgICAgICAgICAgICBlcF8zNTUwLT5iaW9zX2N0cmwgPSBhZHZfZHZjX3ZhcnAtPmJpb3NfY3RybDsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzU1MC0+d2R0cl9hYmxlID0gYWR2X2R2Y192YXJwLT53ZHRyX2FibGU7CisgICAgICAgICAgICAgICAgICAgIGVwXzM1NTAtPnNkdHJfYWJsZSA9IGFkdl9kdmNfdmFycC0+c2R0cl9hYmxlOworICAgICAgICAgICAgICAgICAgICBlcF8zNTUwLT51bHRyYV9hYmxlID0gYWR2X2R2Y192YXJwLT51bHRyYV9hYmxlOworICAgICAgICAgICAgICAgICAgICBlcF8zNTUwLT50YWdxbmdfYWJsZSA9IGFkdl9kdmNfdmFycC0+dGFncW5nX2FibGU7CisgICAgICAgICAgICAgICAgICAgIGVwXzM1NTAtPnN0YXJ0X21vdG9yID0gYWR2X2R2Y192YXJwLT5zdGFydF9tb3RvcjsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzU1MC0+c2NzaV9yZXNldF9kZWxheSA9IGFkdl9kdmNfdmFycC0+c2NzaV9yZXNldF93YWl0OworICAgICAgICAgICAgICAgICAgICBlcF8zNTUwLT5zZXJpYWxfbnVtYmVyX3dvcmQxID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5zZXJpYWwxOworICAgICAgICAgICAgICAgICAgICBlcF8zNTUwLT5zZXJpYWxfbnVtYmVyX3dvcmQyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5zZXJpYWwyOworICAgICAgICAgICAgICAgICAgICBlcF8zNTUwLT5zZXJpYWxfbnVtYmVyX3dvcmQzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5zZXJpYWwzOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzA4MDAgPSAmYm9hcmRwLT5lZXBfY29uZmlnLmFkdl8zOEMwODAwX2VlcDsKKworICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT5hZGFwdGVyX3Njc2lfaWQgPSBhZHZfZHZjX3ZhcnAtPmNoaXBfc2NzaV9pZDsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+bWF4X2hvc3RfcW5nID0gYWR2X2R2Y192YXJwLT5tYXhfaG9zdF9xbmc7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzA4MDAtPm1heF9kdmNfcW5nID0gYWR2X2R2Y192YXJwLT5tYXhfZHZjX3FuZzsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+dGVybWluYXRpb25fbHZkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT50ZXJtaW5hdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+ZGlzY19lbmFibGUgPSBhZHZfZHZjX3ZhcnAtPmNmZy0+ZGlzY19lbmFibGU7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzA4MDAtPmJpb3NfY3RybCA9IGFkdl9kdmNfdmFycC0+Ymlvc19jdHJsOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT53ZHRyX2FibGUgPSBhZHZfZHZjX3ZhcnAtPndkdHJfYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+dGFncW5nX2FibGUgPSBhZHZfZHZjX3ZhcnAtPnRhZ3FuZ19hYmxlOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT5zZHRyX3NwZWVkMSA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDE7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzA4MDAtPnNkdHJfc3BlZWQyID0gYWR2X2R2Y192YXJwLT5zZHRyX3NwZWVkMjsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+c2R0cl9zcGVlZDMgPSBhZHZfZHZjX3ZhcnAtPnNkdHJfc3BlZWQzOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT5zZHRyX3NwZWVkNCA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDQ7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzA4MDAtPnRhZ3FuZ19hYmxlID0gYWR2X2R2Y192YXJwLT50YWdxbmdfYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+c3RhcnRfbW90b3IgPSBhZHZfZHZjX3ZhcnAtPnN0YXJ0X21vdG9yOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT5zY3NpX3Jlc2V0X2RlbGF5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+c2NzaV9yZXNldF93YWl0OworICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT5zZXJpYWxfbnVtYmVyX3dvcmQxID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5zZXJpYWwxOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT5zZXJpYWxfbnVtYmVyX3dvcmQyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5zZXJpYWwyOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT5zZXJpYWxfbnVtYmVyX3dvcmQzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5zZXJpYWwzOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMTYwMCA9ICZib2FyZHAtPmVlcF9jb25maWcuYWR2XzM4QzE2MDBfZWVwOworCisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPmFkYXB0ZXJfc2NzaV9pZCA9IGFkdl9kdmNfdmFycC0+Y2hpcF9zY3NpX2lkOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT5tYXhfaG9zdF9xbmcgPSBhZHZfZHZjX3ZhcnAtPm1heF9ob3N0X3FuZzsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMTYwMC0+bWF4X2R2Y19xbmcgPSBhZHZfZHZjX3ZhcnAtPm1heF9kdmNfcW5nOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT50ZXJtaW5hdGlvbl9sdmQgPQorICAgICAgICAgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5jZmctPnRlcm1pbmF0aW9uOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT5kaXNjX2VuYWJsZSA9IGFkdl9kdmNfdmFycC0+Y2ZnLT5kaXNjX2VuYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMTYwMC0+Ymlvc19jdHJsID0gYWR2X2R2Y192YXJwLT5iaW9zX2N0cmw7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPndkdHJfYWJsZSA9IGFkdl9kdmNfdmFycC0+d2R0cl9hYmxlOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT50YWdxbmdfYWJsZSA9IGFkdl9kdmNfdmFycC0+dGFncW5nX2FibGU7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPnNkdHJfc3BlZWQxID0gYWR2X2R2Y192YXJwLT5zZHRyX3NwZWVkMTsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMTYwMC0+c2R0cl9zcGVlZDIgPSBhZHZfZHZjX3ZhcnAtPnNkdHJfc3BlZWQyOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT5zZHRyX3NwZWVkMyA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDM7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPnNkdHJfc3BlZWQ0ID0gYWR2X2R2Y192YXJwLT5zZHRyX3NwZWVkNDsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMTYwMC0+dGFncW5nX2FibGUgPSBhZHZfZHZjX3ZhcnAtPnRhZ3FuZ19hYmxlOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT5zdGFydF9tb3RvciA9IGFkdl9kdmNfdmFycC0+c3RhcnRfbW90b3I7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPnNjc2lfcmVzZXRfZGVsYXkgPQorICAgICAgICAgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5zY3NpX3Jlc2V0X3dhaXQ7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPnNlcmlhbF9udW1iZXJfd29yZDEgPQorICAgICAgICAgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5jZmctPnNlcmlhbDE7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPnNlcmlhbF9udW1iZXJfd29yZDIgPQorICAgICAgICAgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5jZmctPnNlcmlhbDI7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPnNlcmlhbF9udW1iZXJfd29yZDMgPQorICAgICAgICAgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5jZmctPnNlcmlhbDM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGFkYXB0ZXIncyB0YXJnZXQgaWQgYml0IGluIHRoZSAnaW5pdF90aWRtYXNrJyBmaWVsZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBib2FyZHAtPmluaXRfdGlkbWFzayB8PQorICAgICAgICAgICAgICAgICAgICBBRFZfVElEX1RPX1RJRE1BU0soYWR2X2R2Y192YXJwLT5jaGlwX3Njc2lfaWQpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBGaW5pc2ggaW5pdGlhbGl6aW5nIHRoZSAnU2NzaV9Ib3N0JyBzdHJ1Y3R1cmUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgc2hwLT5pcnEgPSBhZHZfZHZjX3ZhcnAtPmlycV9ubzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENoYW5uZWxzIGFyZSBudW1iZXJlZCBiZWdpbm5pbmcgd2l0aCAwLiBGb3IgQWR2YW5TeXMgb25lIGhvc3QKKyAgICAgICAgICAgICAqIHN0cnVjdHVyZSBzdXBwb3J0cyBvbmUgY2hhbm5lbC4gTXVsdGktY2hhbm5lbCBib2FyZHMgaGF2ZSBhCisgICAgICAgICAgICAgKiBzZXBhcmF0ZSBob3N0IHN0cnVjdHVyZSBmb3IgZWFjaCBjaGFubmVsLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzaHAtPm1heF9jaGFubmVsID0gMDsKKyAgICAgICAgICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgICAgICAgICBzaHAtPm1heF9pZCA9IEFTQ19NQVhfVElEICsgMTsKKyAgICAgICAgICAgICAgICBzaHAtPm1heF9sdW4gPSBBU0NfTUFYX0xVTiArIDE7CisKKyAgICAgICAgICAgICAgICBzaHAtPmlvX3BvcnQgPSBhc2NfZHZjX3ZhcnAtPmlvcF9iYXNlOworICAgICAgICAgICAgICAgIGJvYXJkcC0+YXNjX25faW9fcG9ydCA9IEFTQ19JT0FEUl9HQVA7CisgICAgICAgICAgICAgICAgc2hwLT50aGlzX2lkID0gYXNjX2R2Y192YXJwLT5jZmctPmNoaXBfc2NzaV9pZDsKKworICAgICAgICAgICAgICAgIC8qIFNldCBtYXhpbXVtIG51bWJlciBvZiBxdWV1ZXMgdGhlIGFkYXB0ZXIgY2FuIGhhbmRsZS4gKi8KKyAgICAgICAgICAgICAgICBzaHAtPmNhbl9xdWV1ZSA9IGFzY19kdmNfdmFycC0+bWF4X3RvdGFsX3FuZzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2hwLT5tYXhfaWQgPSBBRFZfTUFYX1RJRCArIDE7CisgICAgICAgICAgICAgICAgc2hwLT5tYXhfbHVuID0gQURWX01BWF9MVU4gKyAxOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBTYXZlIHRoZSBJL08gUG9ydCBhZGRyZXNzIGFuZCBsZW5ndGggZXZlbiB0aG91Z2gKKyAgICAgICAgICAgICAgICAgKiBJL08gcG9ydHMgYXJlIG5vdCB1c2VkIHRvIGFjY2VzcyBXaWRlIGJvYXJkcy4KKyAgICAgICAgICAgICAgICAgKiBJbnN0ZWFkIHRoZSBXaWRlIGJvYXJkcyBhcmUgYWNjZXNzZWQgd2l0aAorICAgICAgICAgICAgICAgICAqIFBDSSBNZW1vcnkgTWFwcGVkIEkvTy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBzaHAtPmlvX3BvcnQgPSBpb3A7CisgICAgICAgICAgICAgICAgYm9hcmRwLT5hc2Nfbl9pb19wb3J0ID0gaW9sZW47CisKKyAgICAgICAgICAgICAgICBzaHAtPnRoaXNfaWQgPSBhZHZfZHZjX3ZhcnAtPmNoaXBfc2NzaV9pZDsKKworICAgICAgICAgICAgICAgIC8qIFNldCBtYXhpbXVtIG51bWJlciBvZiBxdWV1ZXMgdGhlIGFkYXB0ZXIgY2FuIGhhbmRsZS4gKi8KKyAgICAgICAgICAgICAgICBzaHAtPmNhbl9xdWV1ZSA9IGFkdl9kdmNfdmFycC0+bWF4X2hvc3RfcW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogJ25faW9fcG9ydCcgY3VycmVudGx5IGlzIG9uZSBieXRlLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFNldCBhIHZhbHVlIHRvICduX2lvX3BvcnQnLCBidXQgbmV2ZXIgcmVmZXJlbmNlZCBpdCBiZWNhdXNlCisgICAgICAgICAgICAgKiBpdCBtYXkgYmUgdHJ1bmNhdGVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzaHAtPm5faW9fcG9ydCA9IGJvYXJkcC0+YXNjX25faW9fcG9ydCA8PSAyNTUgPworICAgICAgICAgICAgICAgIGJvYXJkcC0+YXNjX25faW9fcG9ydCA6IDI1NTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEZvbGxvd2luZyB2MS4zLjg5LCAnY21kX3Blcl9sdW4nIGlzIG5vIGxvbmdlciBuZWVkZWQKKyAgICAgICAgICAgICAqIGFuZCBzaG91bGQgYmUgc2V0IHRvIHplcm8uCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQnV0IGJlY2F1c2Ugb2YgYSBidWcgaW50cm9kdWNlZCBpbiB2MS4zLjg5IGlmIHRoZSBkcml2ZXIgaXMKKyAgICAgICAgICAgICAqIGNvbXBpbGVkIGFzIGEgbW9kdWxlIGFuZCAnY21kX3Blcl9sdW4nIGlzIHplcm8sIHRoZSBNaWQtTGV2ZWwKKyAgICAgICAgICAgICAqIFNDU0kgZnVuY3Rpb24gJ2FsbG9jYXRlX2RldmljZScgd2lsbCBwYW5pYy4gVG8gYWxsb3cgdGhlIGRyaXZlcgorICAgICAgICAgICAgICogdG8gd29yayBhcyBhIG1vZHVsZSBpbiB0aGVzZSBrZXJuZWxzIHNldCAnY21kX3Blcl9sdW4nIHRvIDEuCisJICAgICAqCisJICAgICAqIE5vdGU6IFRoaXMgaXMgd3JvbmcuICBjbWRfcGVyX2x1biBzaG91bGQgYmUgc2V0IHRvIHRoZSBkZXB0aAorCSAgICAgKiB5b3Ugd2FudCBvbiB1bnRhZ2dlZCBkZXZpY2VzIGFsd2F5cy4KKyNpZmRlZiBNT0RVTEUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc2hwLT5jbWRfcGVyX2x1biA9IDE7CisvKiAjZWxzZQorICAgICAgICAgICAgc2hwLT5jbWRfcGVyX2x1biA9IDA7CisjZW5kaWYgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNldCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2NhdHRlci1nYXRoZXIgZWxlbWVudHMgdGhlCisgICAgICAgICAgICAgKiBhZGFwdGVyIGNhbiBoYW5kbGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEFsbG93IHR3byBjb21tYW5kcyB3aXRoICdzZ190YWJsZXNpemUnIHNjYXR0ZXItZ2F0aGVyCisgICAgICAgICAgICAgICAgICogZWxlbWVudHMgdG8gYmUgZXhlY3V0ZWQgc2ltdWx0YW5lb3VzbHkuIFRoaXMgdmFsdWUgaXMKKyAgICAgICAgICAgICAgICAgKiB0aGUgdGhlb3JldGljYWwgaGFyZHdhcmUgbGltaXQuIEl0IG1heSBiZSBkZWNyZWFzZWQKKyAgICAgICAgICAgICAgICAgKiBiZWxvdy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBzaHAtPnNnX3RhYmxlc2l6ZSA9CisgICAgICAgICAgICAgICAgICAgICgoKGFzY19kdmNfdmFycC0+bWF4X3RvdGFsX3FuZyAtIDIpIC8gMikgKgorICAgICAgICAgICAgICAgICAgICBBU0NfU0dfTElTVF9QRVJfUSkgKyAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaHAtPnNnX3RhYmxlc2l6ZSA9IEFEVl9NQVhfU0dfTElTVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSB2YWx1ZSBvZiAnc2dfdGFibGVzaXplJyBjYW4gbm90IGV4Y2VlZCB0aGUgU0NTSQorICAgICAgICAgICAgICogbWlkLWxldmVsIGRyaXZlciBkZWZpbml0aW9uIG9mIFNHX0FMTC4gU0dfQUxMIGFsc28KKyAgICAgICAgICAgICAqIG11c3Qgbm90IGJlIGV4Y2VlZGVkLCBiZWNhdXNlIGl0IGlzIHVzZWQgdG8gZGVmaW5lIHRoZQorICAgICAgICAgICAgICogc2l6ZSBvZiB0aGUgc2NhdHRlci1nYXRoZXIgdGFibGUgaW4gJ3N0cnVjdCBhc2Nfc2dfaGVhZCcuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChzaHAtPnNnX3RhYmxlc2l6ZSA+IFNHX0FMTCkgeworICAgICAgICAgICAgICAgIHNocC0+c2dfdGFibGVzaXplID0gU0dfQUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBU0NfREJHMSgxLCAiYWR2YW5zeXNfZGV0ZWN0OiBzZ190YWJsZXNpemU6ICVkXG4iLAorICAgICAgICAgICAgICAgIHNocC0+c2dfdGFibGVzaXplKTsKKworICAgICAgICAgICAgLyogQklPUyBzdGFydCBhZGRyZXNzLiAqLworICAgICAgICAgICAgaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgeworICAgICAgICAgICAgICAgIHNocC0+YmFzZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoKHVsb25nKSBBc2NHZXRDaGlwQmlvc0FkZHJlc3MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2R2Y192YXJwLT5pb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjX3ZhcnAtPmJ1c190eXBlKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRmlsbC1pbiBCSU9TIGJvYXJkIHZhcmlhYmxlcy4gVGhlIFdpZGUgQklPUyBzYXZlcworICAgICAgICAgICAgICAgICAqIGluZm9ybWF0aW9uIGluIExSQU0gdGhhdCBpcyB1c2VkIGJ5IHRoZSBkcml2ZXIuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGFkdl9kdmNfdmFycC0+aW9wX2Jhc2UsIEJJT1NfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmJpb3Nfc2lnbmF0dXJlKTsKKyAgICAgICAgICAgICAgICBBZHZSZWFkV29yZExyYW0oYWR2X2R2Y192YXJwLT5pb3BfYmFzZSwgQklPU19WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmJpb3NfdmVyc2lvbik7CisgICAgICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGFkdl9kdmNfdmFycC0+aW9wX2Jhc2UsIEJJT1NfQ09ERVNFRywKKyAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5iaW9zX2NvZGVzZWcpOworICAgICAgICAgICAgICAgIEFkdlJlYWRXb3JkTHJhbShhZHZfZHZjX3ZhcnAtPmlvcF9iYXNlLCBCSU9TX0NPREVMRU4sCisgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+Ymlvc19jb2RlbGVuKTsKKworICAgICAgICAgICAgICAgIEFTQ19EQkcyKDEsCisgICAgICAgICAgICAgICAgICAgICJhZHZhbnN5c19kZXRlY3Q6IGJpb3Nfc2lnbmF0dXJlIDB4JXgsIGJpb3NfdmVyc2lvbiAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmJpb3Nfc2lnbmF0dXJlLCBib2FyZHAtPmJpb3NfdmVyc2lvbik7CisKKyAgICAgICAgICAgICAgICBBU0NfREJHMigxLAorICAgICAgICAgICAgICAgICAgICAiYWR2YW5zeXNfZGV0ZWN0OiBiaW9zX2NvZGVzZWcgMHgleCwgYmlvc19jb2RlbGVuIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+Ymlvc19jb2Rlc2VnLCBib2FyZHAtPmJpb3NfY29kZWxlbik7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIElmIHRoZSBCSU9TIHNhdmVkIGEgdmFsaWQgc2lnbmF0dXJlLCB0aGVuIGZpbGwgaW4KKyAgICAgICAgICAgICAgICAgKiB0aGUgQklPUyBjb2RlIHNlZ21lbnQgYmFzZSBhZGRyZXNzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChib2FyZHAtPmJpb3Nfc2lnbmF0dXJlID09IDB4NTVBQSkgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBDb252ZXJ0IHg4NiByZWFsbW9kZSBjb2RlIHNlZ21lbnQgdG8gYSBsaW5lYXIKKyAgICAgICAgICAgICAgICAgICAgICogYWRkcmVzcyBieSBzaGlmdGluZyBsZWZ0IDQuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBzaHAtPmJhc2UgPSAoKHVsb25nKSBib2FyZHAtPmJpb3NfY29kZXNlZyA8PCA0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzaHAtPmJhc2UgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFJlZ2lzdGVyIEJvYXJkIFJlc291cmNlcyAtIEkvTyBQb3J0LCBETUEsIElSUQorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZWdpc3RlciBJL08gcG9ydCByYW5nZS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBGb3IgV2lkZSBib2FyZHMgdGhlIEkvTyBwb3J0cyBhcmUgbm90IHVzZWQgdG8gYWNjZXNzCisgICAgICAgICAgICAgKiB0aGUgYm9hcmQsIGJ1dCByZXF1ZXN0IHRoZSByZWdpb24gYW55d2F5LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqICdzaHAtPm5faW9fcG9ydCcgaXMgbm90IHJlZmVyZW5jZWQsIGJlY2F1c2UgaXQgbWF5IGJlIHRydW5jYXRlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQVNDX0RCRzIoMiwKKyAgICAgICAgICAgICAgICAiYWR2YW5zeXNfZGV0ZWN0OiByZXF1ZXN0X3JlZ2lvbiBwb3J0IDB4JWx4LCBsZW4gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAodWxvbmcpIHNocC0+aW9fcG9ydCwgYm9hcmRwLT5hc2Nfbl9pb19wb3J0KTsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0X3JlZ2lvbihzaHAtPmlvX3BvcnQsIGJvYXJkcC0+YXNjX25faW9fcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR2YW5zeXMiKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQVNDX1BSSU5UMygKKyJhZHZhbnN5c19kZXRlY3Q6IGJvYXJkICVkOiByZXF1ZXN0X3JlZ2lvbigpIGZhaWxlZCwgcG9ydCAweCVseCwgbGVuIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQsICh1bG9uZykgc2hwLT5pb19wb3J0LCBib2FyZHAtPmFzY19uX2lvX3BvcnQpOworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisgICAgICAgICAgICAgICAga2ZyZWUoYm9hcmRwLT5wcnRidWYpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisgICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgICAgICAgICAgICAgYXNjX2JvYXJkX2NvdW50LS07CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFJlZ2lzdGVyIERNQSBDaGFubmVsIGZvciBOYXJyb3cgYm9hcmRzLiAqLworICAgICAgICAgICAgc2hwLT5kbWFfY2hhbm5lbCA9IE5PX0lTQV9ETUE7IC8qIERlZmF1bHQgdG8gbm8gSVNBIERNQS4gKi8KKyNpZmRlZiBDT05GSUdfSVNBCisgICAgICAgICAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisgICAgICAgICAgICAgICAgLyogUmVnaXN0ZXIgRE1BIGNoYW5uZWwgZm9yIElTQSBidXMuICovCisgICAgICAgICAgICAgICAgaWYgKGFzY19kdmNfdmFycC0+YnVzX3R5cGUgJiBBU0NfSVNfSVNBKSB7CisgICAgICAgICAgICAgICAgICAgIHNocC0+ZG1hX2NoYW5uZWwgPSBhc2NfZHZjX3ZhcnAtPmNmZy0+aXNhX2RtYV9jaGFubmVsOworICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9kbWEoc2hwLT5kbWFfY2hhbm5lbCwgImFkdmFuc3lzIikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDMoCisiYWR2YW5zeXNfZGV0ZWN0OiBib2FyZCAlZDogcmVxdWVzdF9kbWEoKSAlZCBmYWlsZWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgc2hwLT5kbWFfY2hhbm5lbCwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VfcmVnaW9uKHNocC0+aW9fcG9ydCwgYm9hcmRwLT5hc2Nfbl9pb19wb3J0KTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUoYm9hcmRwLT5wcnRidWYpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisgICAgICAgICAgICAgICAgICAgICAgICBzY3NpX3VucmVnaXN0ZXIoc2hwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzY19ib2FyZF9jb3VudC0tOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQXNjRW5hYmxlSXNhRG1hKHNocC0+ZG1hX2NoYW5uZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfSVNBICovCisKKyAgICAgICAgICAgIC8qIFJlZ2lzdGVyIElSUSBOdW1iZXIuICovCisgICAgICAgICAgICBBU0NfREJHMSgyLCAiYWR2YW5zeXNfZGV0ZWN0OiByZXF1ZXN0X2lycSgpICVkXG4iLCBzaHAtPmlycSk7CisgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIElmIHJlcXVlc3RfaXJxKCkgZmFpbHMgd2l0aCB0aGUgU0FfSU5URVJSVVBUIGZsYWcgc2V0LAorICAgICAgICAgICAgKiB0aGVuIHRyeSBhZ2FpbiB3aXRob3V0IHRoZSBTQV9JTlRFUlJVUFQgZmxhZyBzZXQuIFRoaXMKKyAgICAgICAgICAgICogYWxsb3dzIElSUSBzaGFyaW5nIHRvIHdvcmsgZXZlbiB3aXRoIG90aGVyIGRyaXZlcnMgdGhhdAorICAgICAgICAgICAgKiBkbyBub3Qgc2V0IHRoZSBTQV9JTlRFUlJVUFQgZmxhZy4KKyAgICAgICAgICAgICoKKyAgICAgICAgICAgICogSWYgU0FfSU5URVJSVVBUIGlzIG5vdCBzZXQsIHRoZW4gaW50ZXJydXB0cyBhcmUgZW5hYmxlZAorICAgICAgICAgICAgKiBiZWZvcmUgdGhlIGRyaXZlciBpbnRlcnJ1cHQgZnVuY3Rpb24gaXMgY2FsbGVkLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgoKHJldCA9IHJlcXVlc3RfaXJxKHNocC0+aXJxLCBhZHZhbnN5c19pbnRlcnJ1cHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FfSU5URVJSVVBUIHwgKHNoYXJlX2lycSA9PSBUUlVFID8gU0FfU0hJUlEgOiAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR2YW5zeXMiLCBib2FyZHApKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICgocmV0ID0gcmVxdWVzdF9pcnEoc2hwLT5pcnEsIGFkdmFuc3lzX2ludGVycnVwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2hhcmVfaXJxID09IFRSVUUgPyBTQV9TSElSUSA6IDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZHZhbnN5cyIsIGJvYXJkcCkpICE9IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gLUVCVVNZKSB7CisgICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDIoCisiYWR2YW5zeXNfZGV0ZWN0OiBib2FyZCAlZDogcmVxdWVzdF9pcnEoKTogSVJRIDB4JXggYWxyZWFkeSBpbiB1c2UuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgc2hwLT5pcnEpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IC1FSU5WQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMigKKyJhZHZhbnN5c19kZXRlY3Q6IGJvYXJkICVkOiByZXF1ZXN0X2lycSgpOiBJUlEgMHgleCBub3QgdmFsaWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgc2hwLT5pcnEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDMoCisiYWR2YW5zeXNfZGV0ZWN0OiBib2FyZCAlZDogcmVxdWVzdF9pcnEoKTogSVJRIDB4JXggZmFpbGVkIHdpdGggJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCBzaHAtPmlycSwgcmV0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVsZWFzZV9yZWdpb24oc2hwLT5pb19wb3J0LCBib2FyZHAtPmFzY19uX2lvX3BvcnQpOworICAgICAgICAgICAgICAgIGlvdW5tYXAoYm9hcmRwLT5pb3JlbWFwX2FkZHIpOworICAgICAgICAgICAgICAgIGlmIChzaHAtPmRtYV9jaGFubmVsICE9IE5PX0lTQV9ETUEpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlZV9kbWEoc2hwLT5kbWFfY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIENPTkZJR19QUk9DX0ZTCisgICAgICAgICAgICAgICAga2ZyZWUoYm9hcmRwLT5wcnRidWYpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisgICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgICAgICAgICAgICAgYXNjX2JvYXJkX2NvdW50LS07CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBJbml0aWFsaXplIGJvYXJkIFJJU0MgY2hpcCBhbmQgZW5hYmxlIGludGVycnVwdHMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgICAgICAgICBBU0NfREJHKDIsICJhZHZhbnN5c19kZXRlY3Q6IEFzY0luaXRBc2MxMDAwRHJpdmVyKClcbiIpOworICAgICAgICAgICAgICAgIHdhcm5fY29kZSA9IEFzY0luaXRBc2MxMDAwRHJpdmVyKGFzY19kdmNfdmFycCk7CisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBhc2NfZHZjX3ZhcnAtPmVycl9jb2RlOworCisgICAgICAgICAgICAgICAgaWYgKHdhcm5fY29kZSB8fCBlcnJfY29kZSkgeworICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQ0KAorImFkdmFuc3lzX2RldGVjdDogYm9hcmQgJWQgZXJyb3I6IGluaXRfc3RhdGUgMHgleCwgd2FybiAweCV4LCBlcnJvciAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgYXNjX2R2Y192YXJwLT5pbml0X3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgd2Fybl9jb2RlLCBlcnJfY29kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBRFZfQ0FSUl9UICAgICAgKmNhcnJwOworICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICByZXFfY250ID0gMDsKKyAgICAgICAgICAgICAgICBhZHZfcmVxX3QgICAgICAgKnJlcXAgPSBOVUxMOworICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZ19jbnQgPSAwOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBidWZmZXIgY2FycmllciBzdHJ1Y3R1cmVzLiBUaGUgdG90YWwgc2l6ZQorICAgICAgICAgICAgICAgICAqIGlzIGFib3V0IDQgS0IsIHNvIGFsbG9jYXRlIGFsbCBhdCBvbmNlLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGNhcnJwID0KKyAgICAgICAgICAgICAgICAgICAgKEFEVl9DQVJSX1QgKikga21hbGxvYyhBRFZfQ0FSUklFUl9CVUZTSVpFLCBHRlBfQVRPTUlDKTsKKyAgICAgICAgICAgICAgICBBU0NfREJHMSgxLCAiYWR2YW5zeXNfZGV0ZWN0OiBjYXJycCAweCVseFxuIiwgKHVsb25nKSBjYXJycCk7CisKKyAgICAgICAgICAgICAgICBpZiAoY2FycnAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGttYWxsb2NfZXJyb3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSB1cCB0byAnbWF4X2hvc3RfcW5nJyByZXF1ZXN0IHN0cnVjdHVyZXMgZm9yCisgICAgICAgICAgICAgICAgICogdGhlIFdpZGUgYm9hcmQuIFRoZSB0b3RhbCBzaXplIGlzIGFib3V0IDE2IEtCLCBzbworICAgICAgICAgICAgICAgICAqIGFsbG9jYXRlIGFsbCBhdCBvbmNlLiBJZiB0aGUgYWxsb2NhdGlvbiBmYWlscyBkZWNyZW1lbnQKKyAgICAgICAgICAgICAgICAgKiBhbmQgdHJ5IGFnYWluLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGZvciAocmVxX2NudCA9IGFkdl9kdmNfdmFycC0+bWF4X2hvc3RfcW5nOworICAgICAgICAgICAgICAgICAgICByZXFfY250ID4gMDsgcmVxX2NudC0tKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcmVxcCA9IChhZHZfcmVxX3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgIGttYWxsb2Moc2l6ZW9mKGFkdl9yZXFfdCkgKiByZXFfY250LCBHRlBfQVRPTUlDKTsKKworICAgICAgICAgICAgICAgICAgICBBU0NfREJHMygxLAorICAgICAgICAgICAgICAgICAgICAgICAgImFkdmFuc3lzX2RldGVjdDogcmVxcCAweCVseCwgcmVxX2NudCAlZCwgYnl0ZXMgJWx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVsb25nKSByZXFwLCByZXFfY250LAorICAgICAgICAgICAgICAgICAgICAgICAgKHVsb25nKSBzaXplb2YoYWR2X3JlcV90KSAqIHJlcV9jbnQpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXFwICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZXFwID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGttYWxsb2NfZXJyb3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSB1cCB0byBBRFZfVE9UX1NHX0JMT0NLIHJlcXVlc3Qgc3RydWN0dXJlcyBmb3IKKyAgICAgICAgICAgICAgICAgKiB0aGUgV2lkZSBib2FyZC4gRWFjaCBzdHJ1Y3R1cmUgaXMgYWJvdXQgMTM2IGJ5dGVzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGJvYXJkcC0+YWR2X3NnYmxrcCA9IE5VTEw7CisgICAgICAgICAgICAgICAgZm9yIChzZ19jbnQgPSAwOyBzZ19jbnQgPCBBRFZfVE9UX1NHX0JMT0NLOyBzZ19jbnQrKykgeworCisgICAgICAgICAgICAgICAgICAgIHNncCA9IChhZHZfc2dibGtfdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAga21hbGxvYyhzaXplb2YoYWR2X3NnYmxrX3QpLCBHRlBfQVRPTUlDKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc2dwID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc2dwLT5uZXh0X3NnYmxrcCA9IGJvYXJkcC0+YWR2X3NnYmxrcDsKKyAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5hZHZfc2dibGtwID0gc2dwOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFTQ19EQkczKDEsCisgICAgICAgICAgICAgICAgICAgICJhZHZhbnN5c19kZXRlY3Q6IHNnX2NudCAlZCAqICV1ID0gJXUgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHNnX2NudCwgc2l6ZW9mKGFkdl9zZ2Jsa190KSwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSAoc2l6ZW9mKGFkdl9zZ2Jsa190KSAqIHNnX2NudCkpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBJZiBubyByZXF1ZXN0IHN0cnVjdHVyZXMgb3Igc2NhdHRlci1nYXRoZXIgc3RydWN0dXJlcyBjb3VsZAorICAgICAgICAgICAgICAgICAqIGJlIGFsbG9jYXRlZCwgdGhlbiByZXR1cm4gYW4gZXJyb3IuIE90aGVyd2lzZSBjb250aW51ZSB3aXRoCisgICAgICAgICAgICAgICAgICogaW5pdGlhbGl6YXRpb24uCisgICAgICAgICAgICAgICAgICovCisgICAga21hbGxvY19lcnJvcjoKKyAgICAgICAgICAgICAgICBpZiAoY2FycnAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDEoCisiYWR2YW5zeXNfZGV0ZWN0OiBib2FyZCAlZCBlcnJvcjogZmFpbGVkIHRvIGttYWxsb2MoKSBjYXJyaWVyIGJ1ZmZlci5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBBRFZfRVJST1I7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXFwID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAga2ZyZWUoY2FycnApOworICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAorImFkdmFuc3lzX2RldGVjdDogYm9hcmQgJWQgZXJyb3I6IGZhaWxlZCB0byBrbWFsbG9jKCkgYWR2X3JlcV90IGJ1ZmZlci5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBBRFZfRVJST1I7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChib2FyZHAtPmFkdl9zZ2Jsa3AgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBrZnJlZShjYXJycCk7CisgICAgICAgICAgICAgICAgICAgIGtmcmVlKHJlcXApOworICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAorImFkdmFuc3lzX2RldGVjdDogYm9hcmQgJWQgZXJyb3I6IGZhaWxlZCB0byBrbWFsbG9jKCkgYWR2X3NnYmxrX3QgYnVmZmVycy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBBRFZfRVJST1I7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIGNhcnJpZXIgYnVmZmVyIHBvaW50ZXIuICovCisgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+b3JpZ19jYXJycCA9IGNhcnJwOworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIFNhdmUgb3JpZ2luYWwgcG9pbnRlciBmb3Iga2ZyZWUoKSBpbiBjYXNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgKiBkcml2ZXIgaXMgYnVpbHQgYXMgYSBtb2R1bGUgYW5kIGNhbiBiZSB1bmxvYWRlZC4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+b3JpZ19yZXFwID0gcmVxcDsKKworICAgICAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmNhcnJpZXJfYnVmID0gY2FycnA7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogUG9pbnQgJ2Fkdl9yZXFwJyB0byB0aGUgcmVxdWVzdCBzdHJ1Y3R1cmVzIGFuZAorICAgICAgICAgICAgICAgICAgICAgKiBsaW5rIHRoZW0gdG9nZXRoZXIuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICByZXFfY250LS07CisgICAgICAgICAgICAgICAgICAgIHJlcXBbcmVxX2NudF0ubmV4dF9yZXFwID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7IHJlcV9jbnQgPiAwOyByZXFfY250LS0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXBbcmVxX2NudCAtIDFdLm5leHRfcmVxcCA9ICZyZXFwW3JlcV9jbnRdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+YWR2X3JlcXAgPSAmcmVxcFswXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RCRygyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZHZhbnN5c19kZXRlY3Q6IEFkdkluaXRBc2MzNTUwRHJpdmVyKClcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgd2Fybl9jb2RlID0gQWR2SW5pdEFzYzM1NTBEcml2ZXIoYWR2X2R2Y192YXJwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMwODAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBU0NfREJHKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkdmFuc3lzX2RldGVjdDogQWR2SW5pdEFzYzM4QzA4MDBEcml2ZXIoKVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB3YXJuX2NvZGUgPSBBZHZJbml0QXNjMzhDMDgwMERyaXZlcihhZHZfZHZjX3ZhcnApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RCRygyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZHZhbnN5c19kZXRlY3Q6IEFkdkluaXRBc2MzOEMxNjAwRHJpdmVyKClcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgd2Fybl9jb2RlID0gQWR2SW5pdEFzYzM4QzE2MDBEcml2ZXIoYWR2X2R2Y192YXJwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGFkdl9kdmNfdmFycC0+ZXJyX2NvZGU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdhcm5fY29kZSB8fCBlcnJfY29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMygKKyJhZHZhbnN5c19kZXRlY3Q6IGJvYXJkICVkIGVycm9yOiB3YXJuIDB4JXgsIGVycm9yIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgd2Fybl9jb2RlLCBlcnJfY29kZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlcnJfY29kZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZV9yZWdpb24oc2hwLT5pb19wb3J0LCBib2FyZHAtPmFzY19uX2lvX3BvcnQpOworICAgICAgICAgICAgICAgIGlmIChBU0NfV0lERV9CT0FSRChib2FyZHApKSB7CisgICAgICAgICAgICAgICAgICAgIGlvdW5tYXAoYm9hcmRwLT5pb3JlbWFwX2FkZHIpOworICAgICAgICAgICAgICAgICAgICBpZiAoYm9hcmRwLT5vcmlnX2NhcnJwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShib2FyZHAtPm9yaWdfY2FycnApOworICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5vcmlnX2NhcnJwID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoYm9hcmRwLT5vcmlnX3JlcXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKGJvYXJkcC0+b3JpZ19yZXFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+b3JpZ19yZXFwID0gYm9hcmRwLT5hZHZfcmVxcCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChzZ3AgPSBib2FyZHAtPmFkdl9zZ2Jsa3ApICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+YWR2X3NnYmxrcCA9IHNncC0+bmV4dF9zZ2Jsa3A7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShzZ3ApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzaHAtPmRtYV9jaGFubmVsICE9IE5PX0lTQV9ETUEpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlZV9kbWEoc2hwLT5kbWFfY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIENPTkZJR19QUk9DX0ZTCisgICAgICAgICAgICAgICAga2ZyZWUoYm9hcmRwLT5wcnRidWYpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisgICAgICAgICAgICAgICAgZnJlZV9pcnEoc2hwLT5pcnEsIGJvYXJkcCk7CisgICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgICAgICAgICAgICAgYXNjX2JvYXJkX2NvdW50LS07CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBU0NfREJHX1BSVF9TQ1NJX0hPU1QoMiwgc2hwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFTQ19EQkcxKDEsICJhZHZhbnN5c19kZXRlY3Q6IGRvbmU6IGFzY19ib2FyZF9jb3VudCAlZFxuIiwgYXNjX2JvYXJkX2NvdW50KTsKKyAgICByZXR1cm4gYXNjX2JvYXJkX2NvdW50OworfQorCisvKgorICogYWR2YW5zeXNfcmVsZWFzZSgpCisgKgorICogUmVsZWFzZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBhIHNpbmdsZSBBZHZhblN5cyBhZGFwdGVyLgorICovCitpbnQKK2FkdmFuc3lzX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hwKQoreworICAgIGFzY19ib2FyZF90ICAgICpib2FyZHA7CisKKyAgICBBU0NfREJHKDEsICJhZHZhbnN5c19yZWxlYXNlOiBiZWdpblxuIik7CisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworICAgIGZyZWVfaXJxKHNocC0+aXJxLCBib2FyZHApOworICAgIGlmIChzaHAtPmRtYV9jaGFubmVsICE9IE5PX0lTQV9ETUEpIHsKKyAgICAgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfcmVsZWFzZTogZnJlZV9kbWEoKVxuIik7CisgICAgICAgIGZyZWVfZG1hKHNocC0+ZG1hX2NoYW5uZWwpOworICAgIH0KKyAgICByZWxlYXNlX3JlZ2lvbihzaHAtPmlvX3BvcnQsIGJvYXJkcC0+YXNjX25faW9fcG9ydCk7CisgICAgaWYgKEFTQ19XSURFX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgYWR2X3NnYmxrX3QgICAgKnNncCA9IE5VTEw7CisKKyAgICAgICAgaW91bm1hcChib2FyZHAtPmlvcmVtYXBfYWRkcik7CisgICAgICAgIGlmIChib2FyZHAtPm9yaWdfY2FycnApIHsKKyAgICAgICAgICAgIGtmcmVlKGJvYXJkcC0+b3JpZ19jYXJycCk7CisgICAgICAgICAgICBib2FyZHAtPm9yaWdfY2FycnAgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChib2FyZHAtPm9yaWdfcmVxcCkgeworICAgICAgICAgICAga2ZyZWUoYm9hcmRwLT5vcmlnX3JlcXApOworICAgICAgICAgICAgYm9hcmRwLT5vcmlnX3JlcXAgPSBib2FyZHAtPmFkdl9yZXFwID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoKHNncCA9IGJvYXJkcC0+YWR2X3NnYmxrcCkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYm9hcmRwLT5hZHZfc2dibGtwID0gc2dwLT5uZXh0X3NnYmxrcDsKKyAgICAgICAgICAgIGtmcmVlKHNncCk7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKyAgICBBU0NfQVNTRVJUKGJvYXJkcC0+cHJ0YnVmICE9IE5VTEwpOworICAgIGtmcmVlKGJvYXJkcC0+cHJ0YnVmKTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworICAgIHNjc2lfdW5yZWdpc3RlcihzaHApOworICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX3JlbGVhc2U6IGVuZFxuIik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhZHZhbnN5c19pbmZvKCkKKyAqCisgKiBSZXR1cm4gc3VpdGFibGUgZm9yIHByaW50aW5nIG9uIHRoZSBjb25zb2xlIHdpdGggdGhlIGFyZ3VtZW50CisgKiBhZGFwdGVyJ3MgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAqCisgKiBOb3RlOiBUaGUgaW5mb3JtYXRpb24gbGluZSBzaG91bGQgbm90IGV4Y2VlZCBBU0NfSU5GT19TSVpFIGJ5dGVzLAorICogb3RoZXJ3aXNlIHRoZSBzdGF0aWMgJ2luZm8nIGFycmF5IHdpbGwgYmUgb3ZlcnJ1bi4KKyAqLworY29uc3QgY2hhciAqCithZHZhbnN5c19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNocCkKK3sKKyAgICBzdGF0aWMgY2hhciAgICAgaW5mb1tBU0NfSU5GT19TSVpFXTsKKyAgICBhc2NfYm9hcmRfdCAgICAgKmJvYXJkcDsKKyAgICBBU0NfRFZDX1ZBUiAgICAgKmFzY19kdmNfdmFycDsKKyAgICBBRFZfRFZDX1ZBUiAgICAgKmFkdl9kdmNfdmFycDsKKyAgICBjaGFyICAgICAgICAgICAgKmJ1c25hbWU7CisgICAgaW50ICAgICAgICAgICAgIGlvbGVuOworICAgIGNoYXIgICAgICAgICAgICAqd2lkZW5hbWUgPSBOVUxMOworCisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgYXNjX2R2Y192YXJwID0gJmJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3ZhcjsKKyAgICAgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfaW5mbzogYmVnaW5cbiIpOworICAgICAgICBpZiAoYXNjX2R2Y192YXJwLT5idXNfdHlwZSAmIEFTQ19JU19JU0EpIHsKKyAgICAgICAgICAgIGlmICgoYXNjX2R2Y192YXJwLT5idXNfdHlwZSAmIEFTQ19JU19JU0FQTlApID09IEFTQ19JU19JU0FQTlApIHsKKyAgICAgICAgICAgICAgICBidXNuYW1lID0gIklTQSBQblAiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidXNuYW1lID0gIklTQSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBEb24ndCByZWZlcmVuY2UgJ3NocC0+bl9pb19wb3J0JzsgSXQgbWF5IGJlIHRydW5jYXRlZC4gKi8KKyAgICAgICAgICAgIHNwcmludGYoaW5mbywKKyJBZHZhblN5cyBTQ1NJICVzOiAlczogSU8gMHglbFgtMHglbFgsIElSUSAweCVYLCBETUEgMHglWCIsCisgICAgICAgICAgICAgICAgQVNDX1ZFUlNJT04sIGJ1c25hbWUsCisgICAgICAgICAgICAgICAgKHVsb25nKSBzaHAtPmlvX3BvcnQsCisgICAgICAgICAgICAgICAgKHVsb25nKSBzaHAtPmlvX3BvcnQgKyBib2FyZHAtPmFzY19uX2lvX3BvcnQgLSAxLAorICAgICAgICAgICAgICAgIHNocC0+aXJxLCBzaHAtPmRtYV9jaGFubmVsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChhc2NfZHZjX3ZhcnAtPmJ1c190eXBlICYgQVNDX0lTX1ZMKSB7CisgICAgICAgICAgICAgICAgYnVzbmFtZSA9ICJWTCI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFzY19kdmNfdmFycC0+YnVzX3R5cGUgJiBBU0NfSVNfRUlTQSkgeworICAgICAgICAgICAgICAgIGJ1c25hbWUgPSAiRUlTQSI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFzY19kdmNfdmFycC0+YnVzX3R5cGUgJiBBU0NfSVNfUENJKSB7CisgICAgICAgICAgICAgICAgaWYgKChhc2NfZHZjX3ZhcnAtPmJ1c190eXBlICYgQVNDX0lTX1BDSV9VTFRSQSkKKyAgICAgICAgICAgICAgICAgICAgPT0gQVNDX0lTX1BDSV9VTFRSQSkgeworICAgICAgICAgICAgICAgICAgICBidXNuYW1lID0gIlBDSSBVbHRyYSI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVzbmFtZSA9ICJQQ0kiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVzbmFtZSA9ICI/IjsKKyAgICAgICAgICAgICAgICBBU0NfUFJJTlQyKCAiYWR2YW5zeXNfaW5mbzogYm9hcmQgJWQ6IHVua25vd24gYnVzIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQsIGFzY19kdmNfdmFycC0+YnVzX3R5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRG9uJ3QgcmVmZXJlbmNlICdzaHAtPm5faW9fcG9ydCc7IEl0IG1heSBiZSB0cnVuY2F0ZWQuICovCisgICAgICAgICAgICBzcHJpbnRmKGluZm8sCisgICAgICAgICAgICAgICAgIkFkdmFuU3lzIFNDU0kgJXM6ICVzOiBJTyAweCVsWC0weCVsWCwgSVJRIDB4JVgiLAorICAgICAgICAgICAgICAgIEFTQ19WRVJTSU9OLCBidXNuYW1lLAorICAgICAgICAgICAgICAgICh1bG9uZykgc2hwLT5pb19wb3J0LAorICAgICAgICAgICAgICAgICh1bG9uZykgc2hwLT5pb19wb3J0ICsgYm9hcmRwLT5hc2Nfbl9pb19wb3J0IC0gMSwKKyAgICAgICAgICAgICAgICBzaHAtPmlycSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKgorICAgICAgICAgKiBXaWRlIEFkYXB0ZXIgSW5mb3JtYXRpb24KKyAgICAgICAgICoKKyAgICAgICAgICogTWVtb3J5LW1hcHBlZCBJL08gaXMgdXNlZCBpbnN0ZWFkIG9mIEkvTyBzcGFjZSB0byBhY2Nlc3MKKyAgICAgICAgICogdGhlIGFkYXB0ZXIsIGJ1dCBkaXNwbGF5IHRoZSBJL08gUG9ydCByYW5nZS4gVGhlIE1lbW9yeQorICAgICAgICAgKiBJL08gYWRkcmVzcyBpcyBkaXNwbGF5ZWQgdGhyb3VnaCB0aGUgZHJpdmVyIC9wcm9jIGZpbGUuCisgICAgICAgICAqLworICAgICAgICBhZHZfZHZjX3ZhcnAgPSAmYm9hcmRwLT5kdmNfdmFyLmFkdl9kdmNfdmFyOworICAgICAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKKyAgICAgICAgeworICAgICAgICAgICAgaW9sZW4gPSBBRFZfMzU1MF9JT0xFTjsKKyAgICAgICAgICAgIHdpZGVuYW1lID0gIlVsdHJhLVdpZGUiOworICAgICAgICB9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlvbGVuID0gQURWXzM4QzA4MDBfSU9MRU47CisgICAgICAgICAgICB3aWRlbmFtZSA9ICJVbHRyYTItV2lkZSI7CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpb2xlbiA9IEFEVl8zOEMxNjAwX0lPTEVOOworICAgICAgICAgICAgd2lkZW5hbWUgPSAiVWx0cmEzLVdpZGUiOworICAgICAgICB9CisgICAgICAgIHNwcmludGYoaW5mbywgIkFkdmFuU3lzIFNDU0kgJXM6IFBDSSAlczogUENJTUVNIDB4JWxYLTB4JWxYLCBJUlEgMHglWCIsCisgICAgICAgICAgICBBU0NfVkVSU0lPTiwKKyAgICAgICAgICAgIHdpZGVuYW1lLAorICAgICAgICAgICAgKHVsb25nKSBhZHZfZHZjX3ZhcnAtPmlvcF9iYXNlLAorICAgICAgICAgICAgKHVsb25nKSBhZHZfZHZjX3ZhcnAtPmlvcF9iYXNlICsgaW9sZW4gLSAxLAorICAgICAgICAgICAgc2hwLT5pcnEpOworICAgIH0KKyAgICBBU0NfQVNTRVJUKHN0cmxlbihpbmZvKSA8IEFTQ19JTkZPX1NJWkUpOworICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX2luZm86IGVuZFxuIik7CisgICAgcmV0dXJuIGluZm87Cit9CisKKy8qCisgKiBhZHZhbnN5c19xdWV1ZWNvbW1hbmQoKSAtIGludGVycnVwdC1kcml2ZW4gSS9PIGVudHJ5cG9pbnQuCisgKgorICogVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyAwLiBDb21tYW5kIHJldHVybiBzdGF0dXMgaXMgc2F2ZWQKKyAqIGluIHRoZSAnc2NwJyByZXN1bHQgZmllbGQuCisgKi8KK2ludAorYWR2YW5zeXNfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKnNjcCwgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisgICAgc3RydWN0IFNjc2lfSG9zdCAgICAqc2hwOworICAgIGFzY19ib2FyZF90ICAgICAgICAgKmJvYXJkcDsKKyAgICB1bG9uZyAgICAgICAgICAgICAgIGZsYWdzOworICAgIHN0cnVjdCBzY3NpX2NtbmQgICAgICAgICAgICpkb25lX3NjcDsKKworICAgIHNocCA9IHNjcC0+ZGV2aWNlLT5ob3N0OworICAgIGJvYXJkcCA9IEFTQ19CT0FSRFAoc2hwKTsKKyAgICBBU0NfU1RBVFMoc2hwLCBxdWV1ZWNvbW1hbmQpOworCisgICAgLyogaG9zdF9sb2NrIHRha2VuIGJ5IG1pZC1sZXZlbCBwcmlvciB0byBjYWxsIGJ1dCBuZWVkIHRvIHByb3RlY3QgKi8KKyAgICAvKiBhZ2FpbnN0IG93biBJU1IgKi8KKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmYm9hcmRwLT5sb2NrLCBmbGFncyk7CisKKyAgICAvKgorICAgICAqIEJsb2NrIG5ldyBjb21tYW5kcyB3aGlsZSBoYW5kbGluZyBhIHJlc2V0IG9yIGFib3J0IHJlcXVlc3QuCisgICAgICovCisgICAgaWYgKGJvYXJkcC0+ZmxhZ3MgJiBBU0NfSE9TVF9JTl9SRVNFVCkgeworICAgICAgICBBU0NfREJHMSgxLAorICAgICAgICAgICAgImFkdmFuc3lzX3F1ZXVlY29tbWFuZDogc2NwIDB4JWx4IGJsb2NrZWQgZm9yIHJlc2V0IHJlcXVlc3RcbiIsCisgICAgICAgICAgICAodWxvbmcpIHNjcCk7CisgICAgICAgIHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9SRVNFVCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQWRkIGJsb2NrZWQgcmVxdWVzdHMgdG8gdGhlIGJvYXJkJ3MgJ2RvbmUnIHF1ZXVlLiBUaGUgcXVldWVkCisgICAgICAgICAqIHJlcXVlc3RzIHdpbGwgYmUgY29tcGxldGVkIGF0IHRoZSBlbmQgb2YgdGhlIGFib3J0IG9yIHJlc2V0CisgICAgICAgICAqIGhhbmRsaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm9hcmRwLT5sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qCisgICAgICogQXR0ZW1wdCB0byBleGVjdXRlIGFueSB3YWl0aW5nIGNvbW1hbmRzIGZvciB0aGUgYm9hcmQuCisgICAgICovCisgICAgaWYgKCFBU0NfUVVFVUVfRU1QVFkoJmJvYXJkcC0+d2FpdGluZykpIHsKKyAgICAgICAgQVNDX0RCRygxLAorICAgICAgICAgICAgImFkdmFuc3lzX3F1ZXVlY29tbWFuZDogYmVmb3JlIGFzY19leGVjdXRlX3F1ZXVlKCkgd2FpdGluZ1xuIik7CisgICAgICAgIGFzY19leGVjdXRlX3F1ZXVlKCZib2FyZHAtPndhaXRpbmcpOworICAgIH0KKworICAgIC8qCisgICAgICogU2F2ZSB0aGUgZnVuY3Rpb24gcG9pbnRlciB0byBMaW51eCBtaWQtbGV2ZWwgJ2RvbmUnIGZ1bmN0aW9uCisgICAgICogYW5kIGF0dGVtcHQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZC4KKyAgICAgKgorICAgICAqIElmIEFTQ19OT0VSUk9SIGlzIHJldHVybmVkIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGFkZGVkIHRvIHRoZQorICAgICAqIGJvYXJkJ3MgJ2FjdGl2ZScgcXVldWUgYW5kIHdpbGwgYmUgY29tcGxldGVkIGJ5IHRoZSBpbnRlcnJ1cHQKKyAgICAgKiBoYW5kbGVyLgorICAgICAqCisgICAgICogSWYgQVNDX0JVU1kgaXMgcmV0dXJuZWQgYWRkIHRoZSByZXF1ZXN0IHRvIHRoZSBib2FyZCdzIHBlcgorICAgICAqIHRhcmdldCB3YWl0aW5nIGxpc3QuIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIHJlcXVlc3QgaGFzCisgICAgICogYmVlbiB0cmllZC4gQWRkIGl0IHRvIHRoZSBiYWNrIG9mIHRoZSB3YWl0aW5nIGxpc3QuIEl0IHdpbGwgYmUKKyAgICAgKiByZXRyaWVkIGxhdGVyLgorICAgICAqCisgICAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQsIHRoZSByZXF1ZXN0IHdpbGwgaGF2ZSBiZWVuIHBsYWNlZCBvbiB0aGUKKyAgICAgKiBib2FyZCdzICdkb25lJyBxdWV1ZSBhbmQgbXVzdCBiZSBjb21wbGV0ZWQgYmVmb3JlIHJldHVybmluZy4KKyAgICAgKi8KKyAgICBzY3AtPnNjc2lfZG9uZSA9IGRvbmU7CisgICAgc3dpdGNoIChhc2NfZXhlY3V0ZV9zY3NpX2NtbmQoc2NwKSkgeworICAgIGNhc2UgQVNDX05PRVJST1I6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVNDX0JVU1k6CisgICAgICAgIGFzY19lbnF1ZXVlKCZib2FyZHAtPndhaXRpbmcsIHNjcCwgQVNDX0JBQ0spOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFTQ19FUlJPUjoKKyAgICBkZWZhdWx0OgorICAgICAgICBkb25lX3NjcCA9IGFzY19kZXF1ZXVlX2xpc3QoJmJvYXJkcC0+ZG9uZSwgTlVMTCwgQVNDX1RJRF9BTEwpOworICAgICAgICAvKiBJbnRlcnJ1cHRzIGNvdWxkIGJlIGVuYWJsZWQgaGVyZS4gKi8KKyAgICAgICAgYXNjX3Njc2lfZG9uZV9saXN0KGRvbmVfc2NwKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJvYXJkcC0+bG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhZHZhbnN5c19yZXNldCgpCisgKgorICogUmVzZXQgdGhlIGJ1cyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbW1hbmQgJ3NjcCcuCisgKgorICogVGhpcyBmdW5jdGlvbiBydW5zIGl0cyBvd24gdGhyZWFkLiBJbnRlcnJ1cHRzIG11c3QgYmUgYmxvY2tlZCBidXQKKyAqIHNsZWVwaW5nIGlzIGFsbG93ZWQgYW5kIG5vIGxvY2tpbmcgb3RoZXIgdGhhbiBmb3IgaG9zdCBzdHJ1Y3R1cmVzIGlzCisgKiByZXF1aXJlZC4gUmV0dXJucyBTVUNDRVNTIG9yIEZBSUxFRC4KKyAqLworaW50CithZHZhbnN5c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpzY3ApCit7CisgICAgc3RydWN0IFNjc2lfSG9zdCAgICAgKnNocDsKKyAgICBhc2NfYm9hcmRfdCAgICAgICAgICAqYm9hcmRwOworICAgIEFTQ19EVkNfVkFSICAgICAgICAgICphc2NfZHZjX3ZhcnA7CisgICAgQURWX0RWQ19WQVIgICAgICAgICAgKmFkdl9kdmNfdmFycDsKKyAgICB1bG9uZyAgICAgICAgICAgICAgICBmbGFnczsKKyAgICBzdHJ1Y3Qgc2NzaV9jbW5kICAgICAgICAgICAgKmRvbmVfc2NwID0gTlVMTCwgKmxhc3Rfc2NwID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc2NzaV9jbW5kICAgICAgICAgICAgKnRzY3AsICpuZXdfbGFzdF9zY3A7CisgICAgaW50ICAgICAgICAgICAgICAgICAgc3RhdHVzOworICAgIGludCAgICAgICAgICAgICAgICAgIHJldCA9IFNVQ0NFU1M7CisKKyAgICBBU0NfREJHMSgxLCAiYWR2YW5zeXNfcmVzZXQ6IDB4JWx4XG4iLCAodWxvbmcpIHNjcCk7CisKKyNpZmRlZiBBRFZBTlNZU19TVEFUUworICAgIGlmIChzY3AtPmRldmljZS0+aG9zdCAhPSBOVUxMKSB7CisgICAgICAgIEFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgcmVzZXQpOworICAgIH0KKyNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLworCisgICAgaWYgKChzaHAgPSBzY3AtPmRldmljZS0+aG9zdCkgPT0gTlVMTCkgeworICAgICAgICBzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpOworICAgICAgICByZXR1cm4gRkFJTEVEOworICAgIH0KKworICAgIGJvYXJkcCA9IEFTQ19CT0FSRFAoc2hwKTsKKworICAgIEFTQ19QUklOVDEoImFkdmFuc3lzX3Jlc2V0OiBib2FyZCAlZDogU0NTSSBidXMgcmVzZXQgc3RhcnRlZC4uLlxuIiwKKyAgICAgICAgYm9hcmRwLT5pZCk7CisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgcmUtZW50cmFuY3kuCisgICAgICovCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmJvYXJkcC0+bG9jaywgZmxhZ3MpOworICAgIGlmIChib2FyZHAtPmZsYWdzICYgQVNDX0hPU1RfSU5fUkVTRVQpIHsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZib2FyZHAtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIEZBSUxFRDsKKyAgICB9CisgICAgYm9hcmRwLT5mbGFncyB8PSBBU0NfSE9TVF9JTl9SRVNFVDsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZib2FyZHAtPmxvY2ssIGZsYWdzKTsKKworICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTmFycm93IEJvYXJkCisgICAgICAgICAqLworICAgICAgICBhc2NfZHZjX3ZhcnAgPSAmYm9hcmRwLT5kdmNfdmFyLmFzY19kdmNfdmFyOworCisgICAgICAgIC8qCisgICAgICAgICAqIFJlc2V0IHRoZSBjaGlwIGFuZCBTQ1NJIGJ1cy4KKyAgICAgICAgICovCisgICAgICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX3Jlc2V0OiBiZWZvcmUgQXNjSW5pdEFzYzEwMDBEcml2ZXIoKVxuIik7CisgICAgICAgIHN0YXR1cyA9IEFzY0luaXRBc2MxMDAwRHJpdmVyKGFzY19kdmNfdmFycCk7CisKKyAgICAgICAgLyogUmVmZXIgdG8gQVNDX0lFUlJfKiBkZWZpbnRpb25zIGZvciBtZWFuaW5nIG9mICdlcnJfY29kZScuICovCisgICAgICAgIGlmIChhc2NfZHZjX3ZhcnAtPmVycl9jb2RlKSB7CisgICAgICAgICAgICBBU0NfUFJJTlQyKAorICAgICAgICAgICAgICAgICJhZHZhbnN5c19yZXNldDogYm9hcmQgJWQ6IFNDU0kgYnVzIHJlc2V0IGVycm9yOiAweCV4XG4iLAorICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQsIGFzY19kdmNfdmFycC0+ZXJyX2NvZGUpOworICAgICAgICAgICAgcmV0ID0gRkFJTEVEOworICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgQVNDX1BSSU5UMigKKyAgICAgICAgICAgICAgICAiYWR2YW5zeXNfcmVzZXQ6IGJvYXJkICVkOiBTQ1NJIGJ1cyByZXNldCB3YXJuaW5nOiAweCV4XG4iLAorICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQsIHN0YXR1cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU0NfUFJJTlQxKAorICAgICAgICAgICAgICAgICJhZHZhbnN5c19yZXNldDogYm9hcmQgJWQ6IFNDU0kgYnVzIHJlc2V0IHN1Y2Nlc3NmdWwuXG4iLAorICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQpOworICAgICAgICB9CisKKyAgICAgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfcmVzZXQ6IGFmdGVyIEFzY0luaXRBc2MxMDAwRHJpdmVyKClcbiIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZib2FyZHAtPmxvY2ssIGZsYWdzKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFdpZGUgQm9hcmQKKyAgICAgICAgICoKKyAgICAgICAgICogSWYgdGhlIHN1Z2dlc3QgcmVzZXQgYnVzIGZsYWdzIGFyZSBzZXQsIHRoZW4gcmVzZXQgdGhlIGJ1cy4KKyAgICAgICAgICogT3RoZXJ3aXNlIG9ubHkgcmVzZXQgdGhlIGRldmljZS4KKyAgICAgICAgICovCisgICAgICAgIGFkdl9kdmNfdmFycCA9ICZib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXI7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVzZXQgdGhlIHRhcmdldCdzIFNDU0kgYnVzLgorICAgICAgICAgKi8KKyAgICAgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfcmVzZXQ6IGJlZm9yZSBBZHZSZXNldENoaXBBbmRTQigpXG4iKTsKKyAgICAgICAgc3dpdGNoIChBZHZSZXNldENoaXBBbmRTQihhZHZfZHZjX3ZhcnApKSB7CisgICAgICAgIGNhc2UgQVNDX1RSVUU6CisgICAgICAgICAgICBBU0NfUFJJTlQxKCJhZHZhbnN5c19yZXNldDogYm9hcmQgJWQ6IFNDU0kgYnVzIHJlc2V0IHN1Y2Nlc3NmdWwuXG4iLAorICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVNDX0ZBTFNFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNDX1BSSU5UMSgiYWR2YW5zeXNfcmVzZXQ6IGJvYXJkICVkOiBTQ1NJIGJ1cyByZXNldCBlcnJvci5cbiIsCisgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCk7CisgICAgICAgICAgICByZXQgPSBGQUlMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCXNwaW5fbG9ja19pcnFzYXZlKCZib2FyZHAtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgKHZvaWQpIEFkdklTUihhZHZfZHZjX3ZhcnApOworICAgIH0KKyAgICAvKiBCb2FyZCBsb2NrIGlzIGhlbGQuICovCisKKyAgICAvKgorICAgICAqIERlcXVldWUgYWxsIGJvYXJkICdkb25lJyByZXF1ZXN0cy4gQSBwb2ludGVyIHRvIHRoZSBsYXN0IHJlcXVlc3QKKyAgICAgKiBpcyByZXR1cm5lZCBpbiAnbGFzdF9zY3AnLgorICAgICAqLworICAgIGRvbmVfc2NwID0gYXNjX2RlcXVldWVfbGlzdCgmYm9hcmRwLT5kb25lLCAmbGFzdF9zY3AsIEFTQ19USURfQUxMKTsKKworICAgIC8qCisgICAgICogRGVxdWV1ZSBhbGwgYm9hcmQgJ2FjdGl2ZScgcmVxdWVzdHMgZm9yIGFsbCBkZXZpY2VzIGFuZCBzZXQKKyAgICAgKiB0aGUgcmVxdWVzdCBzdGF0dXMgdG8gRElEX1JFU0VULiBBIHBvaW50ZXIgdG8gdGhlIGxhc3QgcmVxdWVzdAorICAgICAqIGlzIHJldHVybmVkIGluICdsYXN0X3NjcCcuCisgICAgICovCisgICAgaWYgKGRvbmVfc2NwID09IE5VTEwpIHsKKyAgICAgICAgZG9uZV9zY3AgPSBhc2NfZGVxdWV1ZV9saXN0KCZib2FyZHAtPmFjdGl2ZSwgJmxhc3Rfc2NwLCBBU0NfVElEX0FMTCk7CisgICAgICAgIGZvciAodHNjcCA9IGRvbmVfc2NwOyB0c2NwOyB0c2NwID0gUkVRUE5FWFQodHNjcCkpIHsKKyAgICAgICAgICAgIHRzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfUkVTRVQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQXBwZW5kIHRvICdkb25lX3NjcCcgYXQgdGhlIGVuZCB3aXRoICdsYXN0X3NjcCcuICovCisgICAgICAgIEFTQ19BU1NFUlQobGFzdF9zY3AgIT0gTlVMTCk7CisgICAgICAgIGxhc3Rfc2NwLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKilhc2NfZGVxdWV1ZV9saXN0KAorCQkJJmJvYXJkcC0+YWN0aXZlLCAmbmV3X2xhc3Rfc2NwLCBBU0NfVElEX0FMTCk7CisgICAgICAgIGlmIChuZXdfbGFzdF9zY3AgIT0gTlVMTCkgeworICAgICAgICAgICAgQVNDX0FTU0VSVChSRVFQTkVYVChsYXN0X3NjcCkgIT0gTlVMTCk7CisgICAgICAgICAgICBmb3IgKHRzY3AgPSBSRVFQTkVYVChsYXN0X3NjcCk7IHRzY3A7IHRzY3AgPSBSRVFQTkVYVCh0c2NwKSkgeworICAgICAgICAgICAgICAgIHRzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfUkVTRVQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdF9zY3AgPSBuZXdfbGFzdF9zY3A7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIERlcXVldWUgYWxsICd3YWl0aW5nJyByZXF1ZXN0cyBhbmQgc2V0IHRoZSByZXF1ZXN0IHN0YXR1cworICAgICAqIHRvIERJRF9SRVNFVC4KKyAgICAgKi8KKyAgICBpZiAoZG9uZV9zY3AgPT0gTlVMTCkgeworICAgICAgICBkb25lX3NjcCA9IGFzY19kZXF1ZXVlX2xpc3QoJmJvYXJkcC0+d2FpdGluZywgJmxhc3Rfc2NwLCBBU0NfVElEX0FMTCk7CisgICAgICAgIGZvciAodHNjcCA9IGRvbmVfc2NwOyB0c2NwOyB0c2NwID0gUkVRUE5FWFQodHNjcCkpIHsKKyAgICAgICAgICAgIHRzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfUkVTRVQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQXBwZW5kIHRvICdkb25lX3NjcCcgYXQgdGhlIGVuZCB3aXRoICdsYXN0X3NjcCcuICovCisgICAgICAgIEFTQ19BU1NFUlQobGFzdF9zY3AgIT0gTlVMTCk7CisgICAgICAgIGxhc3Rfc2NwLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKilhc2NfZGVxdWV1ZV9saXN0KAorCQkJJmJvYXJkcC0+d2FpdGluZywgJm5ld19sYXN0X3NjcCwgQVNDX1RJRF9BTEwpOworICAgICAgICBpZiAobmV3X2xhc3Rfc2NwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEFTQ19BU1NFUlQoUkVRUE5FWFQobGFzdF9zY3ApICE9IE5VTEwpOworICAgICAgICAgICAgZm9yICh0c2NwID0gUkVRUE5FWFQobGFzdF9zY3ApOyB0c2NwOyB0c2NwID0gUkVRUE5FWFQodHNjcCkpIHsKKyAgICAgICAgICAgICAgICB0c2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX1JFU0VUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3Rfc2NwID0gbmV3X2xhc3Rfc2NwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU2F2ZSB0aGUgdGltZSBvZiB0aGUgbW9zdCByZWNlbnRseSBjb21wbGV0ZWQgcmVzZXQuICovCisgICAgYm9hcmRwLT5sYXN0X3Jlc2V0ID0gamlmZmllczsKKworICAgIC8qIENsZWFyIHJlc2V0IGZsYWcuICovCisgICAgYm9hcmRwLT5mbGFncyAmPSB+QVNDX0hPU1RfSU5fUkVTRVQ7CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm9hcmRwLT5sb2NrLCBmbGFncyk7CisKKyAgICAvKgorICAgICAqIENvbXBsZXRlIGFsbCB0aGUgJ2RvbmVfc2NwJyByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBpZiAoZG9uZV9zY3AgIT0gTlVMTCkgeworICAgICAgICBhc2Nfc2NzaV9kb25lX2xpc3QoZG9uZV9zY3ApOworICAgIH0KKworICAgIEFTQ19EQkcxKDEsICJhZHZhbnN5c19yZXNldDogcmV0ICVkXG4iLCByZXQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGFkdmFuc3lzX2Jpb3NwYXJhbSgpCisgKgorICogVHJhbnNsYXRlIGRpc2sgZHJpdmUgZ2VvbWV0cnkgaWYgdGhlICJCSU9TIGdyZWF0ZXIgdGhhbiAxIEdCIgorICogc3VwcG9ydCBpcyBlbmFibGVkIGZvciBhIGRyaXZlLgorICoKKyAqIGlwIChpbmZvcm1hdGlvbiBwb2ludGVyKSBpcyBhbiBpbnQgYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIGRlZmluaXRpb246CisgKiBpcFswXTogaGVhZHMKKyAqIGlwWzFdOiBzZWN0b3JzCisgKiBpcFsyXTogY3lsaW5kZXJzCisgKi8KK2ludAorYWR2YW5zeXNfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJc2VjdG9yX3QgY2FwYWNpdHksIGludCBpcFtdKQoreworICAgIGFzY19ib2FyZF90ICAgICAqYm9hcmRwOworCisgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfYmlvc3BhcmFtOiBiZWdpblxuIik7CisgICAgQVNDX1NUQVRTKHNkZXYtPmhvc3QsIGJpb3NwYXJhbSk7CisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzZGV2LT5ob3N0KTsKKyAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisgICAgICAgIGlmICgoYm9hcmRwLT5kdmNfdmFyLmFzY19kdmNfdmFyLmR2Y19jbnRsICYKKyAgICAgICAgICAgICBBU0NfQ05UTF9CSU9TX0dUXzFHQikgJiYgY2FwYWNpdHkgPiAweDIwMDAwMCkgeworICAgICAgICAgICAgICAgIGlwWzBdID0gMjU1OworICAgICAgICAgICAgICAgIGlwWzFdID0gNjM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXBbMF0gPSA2NDsKKyAgICAgICAgICAgICAgICBpcFsxXSA9IDMyOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXIuYmlvc19jdHJsICYKKyAgICAgICAgICAgICBCSU9TX0NUUkxfRVhURU5ERURfWExBVCkgJiYgY2FwYWNpdHkgPiAweDIwMDAwMCkgeworICAgICAgICAgICAgICAgIGlwWzBdID0gMjU1OworICAgICAgICAgICAgICAgIGlwWzFdID0gNjM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXBbMF0gPSA2NDsKKyAgICAgICAgICAgICAgICBpcFsxXSA9IDMyOworICAgICAgICB9CisgICAgfQorICAgIGlwWzJdID0gKHVuc2lnbmVkIGxvbmcpY2FwYWNpdHkgLyAoaXBbMF0gKiBpcFsxXSk7CisgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfYmlvc3BhcmFtOiBlbmRcbiIpOworICAgIHJldHVybiAwOworfQorCisvKgorICogYWR2YW5zeXNfc2V0dXAoKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gaW5pdC9tYWluLmMgYXQgYm9vdCB0aW1lLgorICogSXQgaXQgcGFzc2VkIExJTE8gcGFyYW1ldGVycyB0aGF0IGNhbiBiZSBzZXQgZnJvbSB0aGUKKyAqIExJTE8gY29tbWFuZCBsaW5lIG9yIGluIC9ldGMvbGlsby5jb25mLgorICoKKyAqIEl0IGlzIHVzZWQgYnkgdGhlIEFkdmFuU3lzIGRyaXZlciB0byBlaXRoZXIgZGlzYWJsZSBJL08KKyAqIHBvcnQgc2Nhbm5pbmcgb3IgdG8gbGltaXQgc2Nhbm5pbmcgdG8gMSAtIDQgSS9PIHBvcnRzLgorICogUmVnYXJkbGVzcyBvZiB0aGUgb3B0aW9uIHNldHRpbmcgRUlTQSBhbmQgUENJIGJvYXJkcworICogd2lsbCBzdGlsbCBiZSBzZWFyY2hlZCBmb3IgYW5kIGRldGVjdGVkLiBUaGlzIG9wdGlvbgorICogb25seSBhZmZlY3RzIHNlYXJjaGluZyBmb3IgSVNBIGFuZCBWTCBib2FyZHMuCisgKgorICogSWYgQURWQU5TWVNfREVCVUcgaXMgZGVmaW5lZCB0aGUgZHJpdmVyIGRlYnVnIGxldmVsIG1heQorICogYmUgc2V0IHVzaW5nIHRoZSA1dGggKEFTQ19OVU1fSU9QT1JUX1BST0JFICsgMSkgSS9PIFBvcnQuCisgKgorICogRXhhbXBsZXM6CisgKiAxLiBFbGltaW5hdGUgSS9PIHBvcnQgc2Nhbm5pbmc6CisgKiAgICAgICAgIGJvb3Q6IGxpbnV4IGFkdmFuc3lzPQorICogICAgICAgb3IKKyAqICAgICAgICAgYm9vdDogbGludXggYWR2YW5zeXM9MHgwCisgKiAyLiBMaW1pdCBJL08gcG9ydCBzY2FubmluZyB0byBvbmUgSS9PIHBvcnQ6CisgKiAgICAgICAgYm9vdDogbGludXggYWR2YW5zeXM9MHgxMTAKKyAqIDMuIExpbWl0IEkvTyBwb3J0IHNjYW5uaW5nIHRvIGZvdXIgSS9PIHBvcnRzOgorICogICAgICAgIGJvb3Q6IGxpbnV4IGFkdmFuc3lzPTB4MTEwLDB4MjEwLDB4MjMwLDB4MzMwCisgKiA0LiBJZiBBRFZBTlNZU19ERUJVRywgbGltaXQgSS9PIHBvcnQgc2Nhbm5pbmcgdG8gZm91ciBJL08gcG9ydHMgYW5kCisgKiAgICBzZXQgdGhlIGRyaXZlciBkZWJ1ZyBsZXZlbCB0byAyLgorICogICAgICAgIGJvb3Q6IGxpbnV4IGFkdmFuc3lzPTB4MTEwLDB4MjEwLDB4MjMwLDB4MzMwLDB4ZGViMgorICoKKyAqIGludHNbMF0gLSBudW1iZXIgb2YgYXJndW1lbnRzCisgKiBpbnRzWzFdIC0gZmlyc3QgYXJndW1lbnQKKyAqIGludHNbMl0gLSBzZWNvbmQgYXJndW1lbnQKKyAqIC4uLgorICovCit2b2lkIF9faW5pdAorYWR2YW5zeXNfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCit7CisgICAgaW50ICAgIGk7CisKKyAgICBpZiAoYXNjX2lvcGZsYWcgPT0gQVNDX1RSVUUpIHsKKyAgICAgICAgcHJpbnRrKCJBZHZhblN5cyBTQ1NJOiAnYWR2YW5zeXMnIExJTE8gb3B0aW9uIG1heSBhcHBlYXIgb25seSBvbmNlXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFzY19pb3BmbGFnID0gQVNDX1RSVUU7CisKKyAgICBpZiAoaW50c1swXSA+IEFTQ19OVU1fSU9QT1JUX1BST0JFKSB7CisjaWZkZWYgQURWQU5TWVNfREVCVUcKKyAgICAgICAgaWYgKChpbnRzWzBdID09IEFTQ19OVU1fSU9QT1JUX1BST0JFICsgMSkgJiYKKyAgICAgICAgICAgIChpbnRzW0FTQ19OVU1fSU9QT1JUX1BST0JFICsgMV0gPj4gNCA9PSAweGRlYikpIHsKKyAgICAgICAgICAgIGFzY19kYmdsdmwgPSBpbnRzW0FTQ19OVU1fSU9QT1JUX1BST0JFICsgMV0gJiAweGY7CisgICAgICAgIH0gZWxzZSB7CisjZW5kaWYgLyogQURWQU5TWVNfREVCVUcgKi8KKyAgICAgICAgICAgIHByaW50aygiQWR2YW5TeXMgU0NTSTogb25seSAlZCBJL08gcG9ydHMgYWNjZXB0ZWRcbiIsCisgICAgICAgICAgICAgICAgQVNDX05VTV9JT1BPUlRfUFJPQkUpOworI2lmZGVmIEFEVkFOU1lTX0RFQlVHCisgICAgICAgIH0KKyNlbmRpZiAvKiBBRFZBTlNZU19ERUJVRyAqLworICAgIH0KKworI2lmZGVmIEFEVkFOU1lTX0RFQlVHCisgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3NldHVwOiBpbnRzWzBdICVkXG4iLCBpbnRzWzBdKTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgaW50c1swXTsgaSsrKSB7CisgICAgICAgIEFTQ19EQkcyKDEsICIgaW50c1slZF0gMHgleCIsIGksIGludHNbaV0pOworICAgIH0KKyAgICBBU0NfREJHKDEsICJcbiIpOworI2VuZGlmIC8qIEFEVkFOU1lTX0RFQlVHICovCisKKyAgICBmb3IgKGkgPSAxOyBpIDw9IGludHNbMF0gJiYgaSA8PSBBU0NfTlVNX0lPUE9SVF9QUk9CRTsgaSsrKSB7CisgICAgICAgIGFzY19pb3BvcnRbaS0xXSA9IGludHNbaV07CisgICAgICAgIEFTQ19EQkcyKDEsICJhZHZhbnN5c19zZXR1cDogYXNjX2lvcG9ydFslZF0gMHgleFxuIiwKKyAgICAgICAgICAgIGkgLSAxLCBhc2NfaW9wb3J0W2ktMV0pOworICAgIH0KK30KKworCisvKgorICogLS0tIExvYWRhYmxlIERyaXZlciBTdXBwb3J0CisgKi8KKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworICAgIC5wcm9jX25hbWUgICAgICAgICAgICAgICAgICA9ICJhZHZhbnN5cyIsCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKyAgICAucHJvY19pbmZvICAgICAgICAgICAgICAgICAgPSBhZHZhbnN5c19wcm9jX2luZm8sCisjZW5kaWYKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgICAgICAgPSAiYWR2YW5zeXMiLAorICAgIC5kZXRlY3QgICAgICAgICAgICAgICAgICAgICA9IGFkdmFuc3lzX2RldGVjdCwgCisgICAgLnJlbGVhc2UgICAgICAgICAgICAgICAgICAgID0gYWR2YW5zeXNfcmVsZWFzZSwKKyAgICAuaW5mbyAgICAgICAgICAgICAgICAgICAgICAgPSBhZHZhbnN5c19pbmZvLAorICAgIC5xdWV1ZWNvbW1hbmQgICAgICAgICAgICAgICA9IGFkdmFuc3lzX3F1ZXVlY29tbWFuZCwKKyAgICAuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBhZHZhbnN5c19yZXNldCwKKyAgICAuYmlvc19wYXJhbSAgICAgICAgICAgICAgICAgPSBhZHZhbnN5c19iaW9zcGFyYW0sCisgICAgLnNsYXZlX2NvbmZpZ3VyZQkJPSBhZHZhbnN5c19zbGF2ZV9jb25maWd1cmUsCisgICAgLyoKKyAgICAgKiBCZWNhdXNlIHRoZSBkcml2ZXIgbWF5IGNvbnRyb2wgYW4gSVNBIGFkYXB0ZXIgJ3VuY2hlY2tlZF9pc2FfZG1hJworICAgICAqIG11c3QgYmUgc2V0LiBUaGUgZmxhZyB3aWxsIGJlIGNsZWFyZWQgaW4gYWR2YW5zeXNfZGV0ZWN0IGZvciBub24tSVNBCisgICAgICogYWRhcHRlcnMuIFJlZmVyIHRvIHRoZSBjb21tZW50IGluIHNjc2lfbW9kdWxlLmMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgLnVuY2hlY2tlZF9pc2FfZG1hICAgICAgICAgID0gMSwKKyAgICAvKgorICAgICAqIEFsbCBhZGFwdGVycyBjb250cm9sbGVkIGJ5IHRoaXMgZHJpdmVyIGFyZSBjYXBhYmxlIG9mIGxhcmdlCisgICAgICogc2NhdHRlci1nYXRoZXIgbGlzdHMuIEFjY29yZGluZyB0byB0aGUgbWlkLWxldmVsIFNDU0kgZG9jdW1lbnRhdGlvbgorICAgICAqIHRoaXMgb2J2aWF0ZXMgYW55IHBlcmZvcm1hbmNlIGdhaW4gcHJvdmlkZWQgYnkgc2V0dGluZworICAgICAqICd1c2VfY2x1c3RlcmluZycuIEJ1dCBlbXBpcmljYWxseSB3aGlsZSBDUFUgdXRpbGl6YXRpb24gaXMgaW5jcmVhc2VkCisgICAgICogYnkgZW5hYmxpbmcgY2x1c3RlcmluZywgSS9PIHRocm91Z2hwdXQgaW5jcmVhc2VzIGFzIHdlbGwuCisgICAgICovCisgICAgLnVzZV9jbHVzdGVyaW5nICAgICAgICAgICAgID0gRU5BQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKKworLyoKKyAqIC0tLSBNaXNjZWxsYW5lb3VzIERyaXZlciBGdW5jdGlvbnMKKyAqLworCisvKgorICogRmlyc3QtbGV2ZWwgaW50ZXJydXB0IGhhbmRsZXIuCisgKgorICogJ2Rldl9pZCcgaXMgYSBwb2ludGVyIHRvIHRoZSBpbnRlcnJ1cHRpbmcgYWRhcHRlcidzIGFzY19ib2FyZF90LiBCZWNhdXNlCisgKiBhbGwgYm9hcmRzIGFyZSBjdXJyZW50bHkgY2hlY2tlZCBmb3IgaW50ZXJydXB0cyBvbiBlYWNoIGludGVycnVwdCwgJ2Rldl9pZCcKKyAqIGlzIG5vdCByZWZlcmVuY2VkLiAnZGV2X2lkJyBjb3VsZCBiZSB1c2VkIHRvIGlkZW50aWZ5IGFuIGludGVycnVwdCBwYXNzZWQKKyAqIHRvIHRoZSBBZHZhblN5cyBkcml2ZXIgd2hpY2ggaXMgZm9yIGEgZGV2aWNlIHNoYXJpbmcgYW4gaW50ZXJydXB0IHdpdGgKKyAqIGFuIEFkdmFuU3lzIGFkYXB0ZXIuCisgKi8KK1NUQVRJQyBpcnFyZXR1cm5fdAorYWR2YW5zeXNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgdWxvbmcgICAgICAgICAgIGZsYWdzOworICAgIGludCAgICAgICAgICAgICBpOworICAgIGFzY19ib2FyZF90ICAgICAqYm9hcmRwOworICAgIHN0cnVjdCBzY3NpX2NtbmQgICAgICAgKmRvbmVfc2NwID0gTlVMTCwgKmxhc3Rfc2NwID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc2NzaV9jbW5kICAgICAgICpuZXdfbGFzdF9zY3A7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqc2hwOworCisgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfaW50ZXJydXB0OiBiZWdpblxuIik7CisKKyAgICAvKgorICAgICAqIENoZWNrIGZvciBpbnRlcnJ1cHRzIG9uIGFsbCBib2FyZHMuCisgICAgICogQXNjSVNSKCkgd2lsbCBjYWxsIGFzY19pc3JfY2FsbGJhY2soKS4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYXNjX2JvYXJkX2NvdW50OyBpKyspIHsKKwlzaHAgPSBhc2NfaG9zdFtpXTsKKyAgICAgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworICAgICAgICBBU0NfREJHMigyLCAiYWR2YW5zeXNfaW50ZXJydXB0OiBpICVkLCBib2FyZHAgMHglbHhcbiIsCisgICAgICAgICAgICBpLCAodWxvbmcpIGJvYXJkcCk7CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZib2FyZHAtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIE5hcnJvdyBCb2FyZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoQXNjSXNJbnRQZW5kaW5nKHNocC0+aW9fcG9ydCkpIHsKKyAgICAgICAgICAgICAgICBBU0NfU1RBVFMoc2hwLCBpbnRlcnJ1cHQpOworICAgICAgICAgICAgICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX2ludGVycnVwdDogYmVmb3JlIEFzY0lTUigpXG4iKTsKKyAgICAgICAgICAgICAgICBBc2NJU1IoJmJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3Zhcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogV2lkZSBCb2FyZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBBU0NfREJHKDEsICJhZHZhbnN5c19pbnRlcnJ1cHQ6IGJlZm9yZSBBZHZJU1IoKVxuIik7CisgICAgICAgICAgICBpZiAoQWR2SVNSKCZib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXIpKSB7CisgICAgICAgICAgICAgICAgQVNDX1NUQVRTKHNocCwgaW50ZXJydXB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFN0YXJ0IHdhaXRpbmcgcmVxdWVzdHMgYW5kIGNyZWF0ZSBhIGxpc3Qgb2YgY29tcGxldGVkIHJlcXVlc3RzLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhIHJlc2V0IHJlcXVlc3QgaXMgYmVpbmcgcGVyZm9ybWVkIGZvciB0aGUgYm9hcmQsIHRoZSByZXNldAorICAgICAgICAgKiBoYW5kbGVyIHdpbGwgY29tcGxldGUgcGVuZGluZyByZXF1ZXN0cyBhZnRlciBpdCBoYXMgY29tcGxldGVkLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChib2FyZHAtPmZsYWdzICYgQVNDX0hPU1RfSU5fUkVTRVQpID09IDApIHsKKyAgICAgICAgICAgIEFTQ19EQkcyKDEsICJhZHZhbnN5c19pbnRlcnJ1cHQ6IGRvbmVfc2NwIDB4JWx4LCBsYXN0X3NjcCAweCVseFxuIiwKKyAgICAgICAgICAgICAgICAodWxvbmcpIGRvbmVfc2NwLCAodWxvbmcpIGxhc3Rfc2NwKTsKKworICAgICAgICAgICAgLyogU3RhcnQgYW55IHdhaXRpbmcgY29tbWFuZHMgZm9yIHRoZSBib2FyZC4gKi8KKyAgICAgICAgICAgIGlmICghQVNDX1FVRVVFX0VNUFRZKCZib2FyZHAtPndhaXRpbmcpKSB7CisgICAgICAgICAgICAgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfaW50ZXJydXB0OiBiZWZvcmUgYXNjX2V4ZWN1dGVfcXVldWUoKVxuIik7CisgICAgICAgICAgICAgICAgYXNjX2V4ZWN1dGVfcXVldWUoJmJvYXJkcC0+d2FpdGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAqIEFkZCB0byB0aGUgbGlzdCBvZiByZXF1ZXN0cyB0aGF0IG11c3QgYmUgY29tcGxldGVkLgorICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICogJ2RvbmVfc2NwJyB3aWxsIGFsd2F5cyBiZSBOVUxMIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24KKyAgICAgICAgICAgICAgKiBvZiB0aGlzIGxvb3AuICdsYXN0X3NjcCcgaXMgc2V0IGF0IHRoZSBzYW1lIHRpbWUgYXMKKyAgICAgICAgICAgICAgKiAnZG9uZV9zY3AnLgorICAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGRvbmVfc2NwID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBkb25lX3NjcCA9IGFzY19kZXF1ZXVlX2xpc3QoJmJvYXJkcC0+ZG9uZSwgJmxhc3Rfc2NwLAorICAgICAgICAgICAgICAgICAgICBBU0NfVElEX0FMTCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFTQ19BU1NFUlQobGFzdF9zY3AgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgbGFzdF9zY3AtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKWFzY19kZXF1ZXVlX2xpc3QoCisJCQkmYm9hcmRwLT5kb25lLCAmbmV3X2xhc3Rfc2NwLCBBU0NfVElEX0FMTCk7CisgICAgICAgICAgICAgICAgaWYgKG5ld19sYXN0X3NjcCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEFTQ19BU1NFUlQoUkVRUE5FWFQobGFzdF9zY3ApICE9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICBsYXN0X3NjcCA9IG5ld19sYXN0X3NjcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm9hcmRwLT5sb2NrLCBmbGFncyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiBpbnRlcnJ1cHRzIHdlcmUgZW5hYmxlZCBvbiBlbnRyeSwgdGhlbiB0aGV5CisgICAgICogYXJlIG5vdyBlbmFibGVkIGhlcmUuCisgICAgICoKKyAgICAgKiBDb21wbGV0ZSBhbGwgcmVxdWVzdHMgb24gdGhlIGRvbmUgbGlzdC4KKyAgICAgKi8KKworICAgIGFzY19zY3NpX2RvbmVfbGlzdChkb25lX3NjcCk7CisKKyAgICBBU0NfREJHKDEsICJhZHZhbnN5c19pbnRlcnJ1cHQ6IGVuZFxuIik7CisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogU2V0IHRoZSBudW1iZXIgb2YgY29tbWFuZHMgdG8gcXVldWUgcGVyIGRldmljZSBmb3IgdGhlCisgKiBzcGVjaWZpZWQgaG9zdCBhZGFwdGVyLgorICovCitTVEFUSUMgaW50CithZHZhbnN5c19zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpkZXZpY2UpCit7CisgICAgYXNjX2JvYXJkX3QgICAgICAgICpib2FyZHA7CisKKyAgICBib2FyZHAgPSBBU0NfQk9BUkRQKGRldmljZS0+aG9zdCk7CisgICAgYm9hcmRwLT5mbGFncyB8PSBBU0NfU0VMRUNUX1FVRVVFX0RFUFRIUzsKKyAgICAvKgorICAgICAqIFNhdmUgYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UgYW5kIHNldCBpdHMgaW5pdGlhbC9tYXhpbXVtCisgICAgICogcXVldWUgZGVwdGguICBPbmx5IHNhdmUgdGhlIHBvaW50ZXIgZm9yIGEgbHVuMCBkZXYgdGhvdWdoLgorICAgICAqLworICAgIGlmKGRldmljZS0+bHVuID09IDApCisgICAgICAgIGJvYXJkcC0+ZGV2aWNlW2RldmljZS0+aWRdID0gZGV2aWNlOworICAgIGlmKGRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCkgeworICAgICAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisJICAgIHNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldmljZSwgTVNHX09SREVSRURfVEFHLAorICAgICAgICAgICAgICAgIGJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3Zhci5tYXhfZHZjX3FuZ1tkZXZpY2UtPmlkXSk7CisgICAgICAgIH0gZWxzZSB7CisJICAgIHNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldmljZSwgTVNHX09SREVSRURfVEFHLAorICAgICAgICAgICAgICAgIGJvYXJkcC0+ZHZjX3Zhci5hZHZfZHZjX3Zhci5tYXhfZHZjX3FuZyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldmljZSwgMCwgZGV2aWNlLT5ob3N0LT5jbWRfcGVyX2x1bik7CisgICAgfQorICAgIEFTQ19EQkc0KDEsICJhZHZhbnN5c19zbGF2ZV9jb25maWd1cmU6IGRldmljZSAweCVseCwgYm9hcmRwIDB4JWx4LCBpZCAlZCwgZGVwdGggJWRcbiIsCisgICAgICAgICAgICAodWxvbmcpIGRldmljZSwgKHVsb25nKSBib2FyZHAsIGRldmljZS0+aWQsIGRldmljZS0+cXVldWVfZGVwdGgpOworICAgIHJldHVybiAwOworfQorCisvKgorICogQ29tcGxldGUgYWxsIHJlcXVlc3RzIG9uIHRoZSBzaW5nbHkgbGlua2VkIGxpc3QgcG9pbnRlZAorICogdG8gYnkgJ3NjcCcuCisgKgorICogSW50ZXJydXB0cyBjYW4gYmUgZW5hYmxlZCBvbiBlbnRyeS4KKyAqLworU1RBVElDIHZvaWQKK2FzY19zY3NpX2RvbmVfbGlzdChzdHJ1Y3Qgc2NzaV9jbW5kICpzY3ApCit7CisgICAgc3RydWN0IHNjc2lfY21uZCAgICAqdHNjcDsKKworICAgIEFTQ19EQkcoMiwgImFzY19zY3NpX2RvbmVfbGlzdDogYmVnaW5cbiIpOworICAgIHdoaWxlIChzY3AgIT0gTlVMTCkgeworCWFzY19ib2FyZF90ICpib2FyZHA7CisJc3RydWN0IGRldmljZSAqZGV2OworCisgICAgICAgIEFTQ19EQkcxKDMsICJhc2Nfc2NzaV9kb25lX2xpc3Q6IHNjcCAweCVseFxuIiwgKHVsb25nKSBzY3ApOworICAgICAgICB0c2NwID0gUkVRUE5FWFQoc2NwKTsKKyAgICAgICAgc2NwLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworCWJvYXJkcCA9IEFTQ19CT0FSRFAoc2NwLT5kZXZpY2UtPmhvc3QpOworCisJaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkKKwkgICAgZGV2ID0gYm9hcmRwLT5kdmNfY2ZnLmFzY19kdmNfY2ZnLmRldjsKKwllbHNlCisJICAgIGRldiA9IGJvYXJkcC0+ZHZjX2NmZy5hZHZfZHZjX2NmZy5kZXY7CisKKwlpZiAoc2NwLT51c2Vfc2cpCisJICAgIGRtYV91bm1hcF9zZyhkZXYsIChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3AtPnJlcXVlc3RfYnVmZmVyLAorCQkJIHNjcC0+dXNlX3NnLCBzY3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwllbHNlIGlmIChzY3AtPnJlcXVlc3RfYnVmZmxlbikKKwkgICAgZG1hX3VubWFwX3NpbmdsZShkZXYsIHNjcC0+U0NwLmRtYV9oYW5kbGUsCisJCQkgICAgIHNjcC0+cmVxdWVzdF9idWZmbGVuLCBzY3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGRvbmUpOworICAgICAgICBBU0NfQVNTRVJUKHNjcC0+c2NzaV9kb25lICE9IE5VTEwpOworCisgICAgICAgIHNjcC0+c2NzaV9kb25lKHNjcCk7CisKKyAgICAgICAgc2NwID0gdHNjcDsKKyAgICB9CisgICAgQVNDX0RCRygyLCAiYXNjX3Njc2lfZG9uZV9saXN0OiBkb25lXG4iKTsKKyAgICByZXR1cm47Cit9CisKKy8qCisgKiBFeGVjdXRlIGEgc2luZ2xlICdTY3NpX0NtbmQnLgorICoKKyAqIFRoZSBmdW5jdGlvbiAnZG9uZScgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gY29tcGxldGVkLgorICoKKyAqIFNjc2lfQ21uZDoKKyAqCisgKiAgaG9zdCAtIGJvYXJkIGNvbnRyb2xsaW5nIGRldmljZQorICogIGRldmljZSAtIGRldmljZSB0byBzZW5kIGNvbW1hbmQKKyAqICB0YXJnZXQgLSB0YXJnZXQgb2YgZGV2aWNlCisgKiAgbHVuIC0gbHVuIG9mIGRldmljZQorICogIGNtZF9sZW4gLSBsZW5ndGggb2YgU0NTSSBDREIKKyAqICBjbW5kIC0gYnVmZmVyIGZvciBTQ1NJIDgsIDEwLCBvciAxMiBieXRlIENEQgorICogIHVzZV9zZyAtIGlmIG5vbi16ZXJvIGluZGljYXRlcyBzY2F0dGVyLWdhdGhlciByZXF1ZXN0IHdpdGggdXNlX3NnIGVsZW1lbnRzCisgKgorICogIGlmICh1c2Vfc2cgPT0gMCkgeworICogICAgcmVxdWVzdF9idWZmZXIgLSBidWZmZXIgYWRkcmVzcyBmb3IgcmVxdWVzdAorICogICAgcmVxdWVzdF9idWZmbGVuIC0gbGVuZ3RoIG9mIHJlcXVlc3QgYnVmZmVyCisgKiAgfSBlbHNlIHsKKyAqICAgIHJlcXVlc3RfYnVmZmVyIC0gcG9pbnRlciB0byBzY2F0dGVybGlzdCBzdHJ1Y3R1cmUKKyAqICB9CisgKgorICogIHNlbnNlX2J1ZmZlciAtIHNlbnNlIGNvbW1hbmQgYnVmZmVyCisgKgorICogIHJlc3VsdCAoNCBieXRlcyBvZiBhbiBpbnQpOgorICogICAgQnl0ZSBNZWFuaW5nCisgKiAgICAwIFNDU0kgU3RhdHVzIEJ5dGUgQ29kZQorICogICAgMSBTQ1NJIE9uZSBCeXRlIE1lc3NhZ2UgQ29kZQorICogICAgMiBIb3N0IEVycm9yIENvZGUKKyAqICAgIDMgTWlkLUxldmVsIEVycm9yIENvZGUKKyAqCisgKiAgaG9zdCBkcml2ZXIgZmllbGRzOgorICogICAgU0NwIC0gU2NzaV9Qb2ludGVyIHVzZWQgZm9yIGNvbW1hbmQgcHJvY2Vzc2luZyBzdGF0dXMKKyAqICAgIHNjc2lfZG9uZSAtIHVzZWQgdG8gc2F2ZSBjYWxsZXIncyBkb25lIGZ1bmN0aW9uCisgKiAgICBob3N0X3NjcmliYmxlIC0gdXNlZCBmb3IgcG9pbnRlciB0byBhbm90aGVyIHN0cnVjdCBzY3NpX2NtbmQKKyAqCisgKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgQVNDX05PRVJST1IgdGhlIHJlcXVlc3QgaGFzIGJlZW4gZW5xdWV1ZWQKKyAqIG9uIHRoZSBib2FyZCdzICdhY3RpdmUnIHF1ZXVlIGFuZCB3aWxsIGJlIGNvbXBsZXRlZCBmcm9tIHRoZQorICogaW50ZXJydXB0IGhhbmRsZXIuCisgKgorICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIEFTQ19OT0VSUk9SIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGVucXVldWVkCisgKiBvbiB0aGUgYm9hcmQncyAnZG9uZScgcXVldWUgYW5kIG11c3QgYmUgY29tcGxldGVkIGJ5IHRoZSBjYWxsZXIuCisgKgorICogSWYgQVNDX0JVU1kgaXMgcmV0dXJuZWQgdGhlIHJlcXVlc3Qgd2lsbCBiZSBlbnF1ZXVlZCBieSB0aGUKKyAqIGNhbGxlciBvbiB0aGUgdGFyZ2V0J3Mgd2FpdGluZyBxdWV1ZSBhbmQgcmUtdHJpZWQgbGF0ZXIuCisgKi8KK1NUQVRJQyBpbnQKK2FzY19leGVjdXRlX3Njc2lfY21uZChzdHJ1Y3Qgc2NzaV9jbW5kICpzY3ApCit7CisgICAgYXNjX2JvYXJkX3QgICAgICAgICpib2FyZHA7CisgICAgQVNDX0RWQ19WQVIgICAgICAgICphc2NfZHZjX3ZhcnA7CisgICAgQURWX0RWQ19WQVIgICAgICAgICphZHZfZHZjX3ZhcnA7CisgICAgQURWX1NDU0lfUkVRX1EgICAgICphZHZfc2NzaXFwOworICAgIHN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlOworICAgIGludCAgICAgICAgICAgICAgICByZXQ7CisKKyAgICBBU0NfREJHMigxLCAiYXNjX2V4ZWN1dGVfc2NzaV9jbW5kOiBzY3AgMHglbHgsIGRvbmUgMHglbHhcbiIsCisgICAgICAgICh1bG9uZykgc2NwLCAodWxvbmcpIHNjcC0+c2NzaV9kb25lKTsKKworICAgIGJvYXJkcCA9IEFTQ19CT0FSRFAoc2NwLT5kZXZpY2UtPmhvc3QpOworICAgIGRldmljZSA9IGJvYXJkcC0+ZGV2aWNlW3NjcC0+ZGV2aWNlLT5pZF07CisKKyAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIEJ1aWxkIGFuZCBleGVjdXRlIE5hcnJvdyBCb2FyZCByZXF1ZXN0LgorICAgICAgICAgKi8KKworICAgICAgICBhc2NfZHZjX3ZhcnAgPSAmYm9hcmRwLT5kdmNfdmFyLmFzY19kdmNfdmFyOworCisgICAgICAgIC8qCisgICAgICAgICAqIEJ1aWxkIEFzYyBMaWJyYXJ5IHJlcXVlc3Qgc3RydWN0dXJlIHVzaW5nIHRoZQorICAgICAgICAgKiBnbG9iYWwgc3RydWN0dXJlcyAnYXNjX3Njc2lfcmVxJyBhbmQgJ2FzY19zZ19oZWFkJy4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQsIHRoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KKyAgICAgICAgICogcXVldWVkIG9uIHRoZSBib2FyZCBkb25lIHF1ZXVlLiBJdCB3aWxsIGJlIGNvbXBsZXRlZAorICAgICAgICAgKiBieSB0aGUgY2FsbGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBhc2NfYnVpbGRfcmVxKCkgY2FuIG5vdCByZXR1cm4gQVNDX0JVU1kuCisgICAgICAgICAqLworICAgICAgICBpZiAoYXNjX2J1aWxkX3JlcShib2FyZHAsIHNjcCkgPT0gQVNDX0VSUk9SKSB7CisgICAgICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGJ1aWxkX2Vycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBBU0NfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBFeGVjdXRlIHRoZSBjb21tYW5kLiBJZiB0aGVyZSBpcyBubyBlcnJvciwgYWRkIHRoZSBjb21tYW5kCisgICAgICAgICAqIHRvIHRoZSBhY3RpdmUgcXVldWUuCisgICAgICAgICAqLworICAgICAgICBzd2l0Y2ggKHJldCA9IEFzY0V4ZVNjc2lRdWV1ZShhc2NfZHZjX3ZhcnAsICZhc2Nfc2NzaV9xKSkgeworICAgICAgICBjYXNlIEFTQ19OT0VSUk9SOgorICAgICAgICAgICAgQVNDX1NUQVRTKHNjcC0+ZGV2aWNlLT5ob3N0LCBleGVfbm9lcnJvcik7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSW5jcmVtZW50IG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBwZXIgZGV2aWNlIHN1Y2Nlc3NmdWwKKyAgICAgICAgICAgICAqIHJlcXVlc3QgY291bnRlci4gV3JhcHBpbmcgZG9lc24ndCBtYXR0ZXIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGJvYXJkcC0+cmVxY250W3NjcC0+ZGV2aWNlLT5pZF0rKzsKKyAgICAgICAgICAgIGFzY19lbnF1ZXVlKCZib2FyZHAtPmFjdGl2ZSwgc2NwLCBBU0NfQkFDSyk7CisgICAgICAgICAgICBBU0NfREJHKDEsCisgICAgICAgICAgICAgICAgImFzY19leGVjdXRlX3Njc2lfY21uZDogQXNjRXhlU2NzaVF1ZXVlKCksIEFTQ19OT0VSUk9SXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFTQ19CVVNZOgorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENhbGxlciB3aWxsIGVucXVldWUgcmVxdWVzdCBvbiB0aGUgdGFyZ2V0J3Mgd2FpdGluZyBxdWV1ZQorICAgICAgICAgICAgICogYW5kIHJldHJ5IGxhdGVyLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGV4ZV9idXN5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFTQ19FUlJPUjoKKyAgICAgICAgICAgIEFTQ19QUklOVDIoCisiYXNjX2V4ZWN1dGVfc2NzaV9jbW5kOiBib2FyZCAlZDogQXNjRXhlU2NzaVF1ZXVlKCkgQVNDX0VSUk9SLCBlcnJfY29kZSAweCV4XG4iLAorICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQsIGFzY19kdmNfdmFycC0+ZXJyX2NvZGUpOworICAgICAgICAgICAgQVNDX1NUQVRTKHNjcC0+ZGV2aWNlLT5ob3N0LCBleGVfZXJyb3IpOworICAgICAgICAgICAgc2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX0VSUk9SKTsKKyAgICAgICAgICAgIGFzY19lbnF1ZXVlKCZib2FyZHAtPmRvbmUsIHNjcCwgQVNDX0JBQ0spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU0NfUFJJTlQyKAorImFzY19leGVjdXRlX3Njc2lfY21uZDogYm9hcmQgJWQ6IEFzY0V4ZVNjc2lRdWV1ZSgpIHVua25vd24sIGVycl9jb2RlIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgYXNjX2R2Y192YXJwLT5lcnJfY29kZSk7CisgICAgICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGV4ZV91bmtub3duKTsKKyAgICAgICAgICAgIHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9FUlJPUik7CisgICAgICAgICAgICBhc2NfZW5xdWV1ZSgmYm9hcmRwLT5kb25lLCBzY3AsIEFTQ19CQUNLKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQnVpbGQgYW5kIGV4ZWN1dGUgV2lkZSBCb2FyZCByZXF1ZXN0LgorICAgICAgICAgKi8KKyAgICAgICAgYWR2X2R2Y192YXJwID0gJmJvYXJkcC0+ZHZjX3Zhci5hZHZfZHZjX3ZhcjsKKworICAgICAgICAvKgorICAgICAgICAgKiBCdWlsZCBhbmQgZ2V0IGEgcG9pbnRlciB0byBhbiBBZHYgTGlicmFyeSByZXF1ZXN0IHN0cnVjdHVyZS4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgdGhlIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bGx5IGJ1aWx0IHRoZW4gc2VuZCBpdCBiZWxvdywKKyAgICAgICAgICogb3RoZXJ3aXNlIHJldHVybiB3aXRoIGFuIGVycm9yLgorICAgICAgICAgKi8KKyAgICAgICAgc3dpdGNoIChhZHZfYnVpbGRfcmVxKGJvYXJkcCwgc2NwLCAmYWR2X3Njc2lxcCkpIHsKKyAgICAgICAgY2FzZSBBU0NfTk9FUlJPUjoKKyAgICAgICAgICAgIEFTQ19EQkcoMywgImFzY19leGVjdXRlX3Njc2lfY21uZDogYWR2X2J1aWxkX3JlcSBBU0NfTk9FUlJPUlxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBU0NfQlVTWToKKyAgICAgICAgICAgIEFTQ19EQkcoMSwgImFzY19leGVjdXRlX3Njc2lfY21uZDogYWR2X2J1aWxkX3JlcSBBU0NfQlVTWVxuIik7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWYgYnVzeSBpcyByZXR1cm5lZCB0aGUgcmVxdWVzdCBoYXMgbm90IGJlZW4gZW5xdWV1ZWQuCisgICAgICAgICAgICAgKiBJdCB3aWxsIGJlIGVucXVldWVkIGJ5IHRoZSBjYWxsZXIgb24gdGhlIHRhcmdldCdzIHdhaXRpbmcKKyAgICAgICAgICAgICAqIHF1ZXVlIGFuZCByZXRyaWVkIGxhdGVyLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRoZSBhc2Nfc3RhdHMgZmllbGRzICdhZHZfYnVpbGRfbm9yZXEnIGFuZCAnYWR2X2J1aWxkX25vc2cnCisgICAgICAgICAgICAgKiBjb3VudCB3aWRlIGJvYXJkIGJ1c3kgY29uZGl0aW9ucy4gVGhleSBhcmUgdXBkYXRlZCBpbgorICAgICAgICAgICAgICogYWR2X2J1aWxkX3JlcSBhbmQgYWR2X2dldF9zZ2xpc3QsIHJlc3BlY3RpdmVseS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuIEFTQ19CVVNZOworICAgICAgICBjYXNlIEFTQ19FUlJPUjoKKyAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgKiBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCwgdGhlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgorICAgICAgICAgICAgICAqIHF1ZXVlZCBvbiB0aGUgYm9hcmQgZG9uZSBxdWV1ZS4gSXQgd2lsbCBiZSBjb21wbGV0ZWQKKyAgICAgICAgICAgICAgKiBieSB0aGUgY2FsbGVyLgorICAgICAgICAgICAgICAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNDX0RCRygxLCAiYXNjX2V4ZWN1dGVfc2NzaV9jbW5kOiBhZHZfYnVpbGRfcmVxIEFTQ19FUlJPUlxuIik7CisgICAgICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGJ1aWxkX2Vycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBBU0NfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBFeGVjdXRlIHRoZSBjb21tYW5kLiBJZiB0aGVyZSBpcyBubyBlcnJvciwgYWRkIHRoZSBjb21tYW5kCisgICAgICAgICAqIHRvIHRoZSBhY3RpdmUgcXVldWUuCisgICAgICAgICAqLworICAgICAgICBzd2l0Y2ggKHJldCA9IEFkdkV4ZVNjc2lRdWV1ZShhZHZfZHZjX3ZhcnAsIGFkdl9zY3NpcXApKSB7CisgICAgICAgIGNhc2UgQVNDX05PRVJST1I6CisgICAgICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGV4ZV9ub2Vycm9yKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBJbmNyZW1lbnQgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHBlciBkZXZpY2Ugc3VjY2Vzc2Z1bAorICAgICAgICAgICAgICogcmVxdWVzdCBjb3VudGVyLiBXcmFwcGluZyBkb2Vzbid0IG1hdHRlci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYm9hcmRwLT5yZXFjbnRbc2NwLT5kZXZpY2UtPmlkXSsrOworICAgICAgICAgICAgYXNjX2VucXVldWUoJmJvYXJkcC0+YWN0aXZlLCBzY3AsIEFTQ19CQUNLKTsKKyAgICAgICAgICAgIEFTQ19EQkcoMSwKKyAgICAgICAgICAgICAgICAiYXNjX2V4ZWN1dGVfc2NzaV9jbW5kOiBBZHZFeGVTY3NpUXVldWUoKSwgQVNDX05PRVJST1JcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVNDX0JVU1k6CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ2FsbGVyIHdpbGwgZW5xdWV1ZSByZXF1ZXN0IG9uIHRoZSB0YXJnZXQncyB3YWl0aW5nIHF1ZXVlCisgICAgICAgICAgICAgKiBhbmQgcmV0cnkgbGF0ZXIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgZXhlX2J1c3kpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVNDX0VSUk9SOgorICAgICAgICAgICAgQVNDX1BSSU5UMigKKyJhc2NfZXhlY3V0ZV9zY3NpX2NtbmQ6IGJvYXJkICVkOiBBZHZFeGVTY3NpUXVldWUoKSBBU0NfRVJST1IsIGVycl9jb2RlIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgYWR2X2R2Y192YXJwLT5lcnJfY29kZSk7CisgICAgICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGV4ZV9lcnJvcik7CisgICAgICAgICAgICBzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpOworICAgICAgICAgICAgYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTQ19QUklOVDIoCisiYXNjX2V4ZWN1dGVfc2NzaV9jbW5kOiBib2FyZCAlZDogQWR2RXhlU2NzaVF1ZXVlKCkgdW5rbm93biwgZXJyX2NvZGUgMHgleFxuIiwKKyAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCBhZHZfZHZjX3ZhcnAtPmVycl9jb2RlKTsKKyAgICAgICAgICAgIEFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgZXhlX3Vua25vd24pOworICAgICAgICAgICAgc2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX0VSUk9SKTsKKyAgICAgICAgICAgIGFzY19lbnF1ZXVlKCZib2FyZHAtPmRvbmUsIHNjcCwgQVNDX0JBQ0spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBU0NfREJHKDEsICJhc2NfZXhlY3V0ZV9zY3NpX2NtbmQ6IGVuZFxuIik7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEJ1aWxkIGEgcmVxdWVzdCBzdHJ1Y3R1cmUgZm9yIHRoZSBBc2MgTGlicmFyeSAoTmFycm93IEJvYXJkKS4KKyAqCisgKiBUaGUgZ2xvYmFsIHN0cnVjdHVyZXMgJ2FzY19zY3NpX3EnIGFuZCAnYXNjX3NnX2hlYWQnIGFyZQorICogdXNlZCB0byBidWlsZCB0aGUgcmVxdWVzdC4KKyAqCisgKiBJZiBhbiBlcnJvciBvY2N1cnMsIHRoZW4gcXVldWUgdGhlIHJlcXVlc3Qgb24gdGhlIGJvYXJkIGRvbmUKKyAqIHF1ZXVlIGFuZCByZXR1cm4gQVNDX0VSUk9SLgorICovCitTVEFUSUMgaW50Cithc2NfYnVpbGRfcmVxKGFzY19ib2FyZF90ICpib2FyZHAsIHN0cnVjdCBzY3NpX2NtbmQgKnNjcCkKK3sKKyAgICBzdHJ1Y3QgZGV2aWNlICpkZXYgPSBib2FyZHAtPmR2Y19jZmcuYXNjX2R2Y19jZmcuZGV2OworCisgICAgLyoKKyAgICAgKiBNdXR1YWxseSBleGNsdXNpdmUgYWNjZXNzIGlzIHJlcXVpcmVkIHRvICdhc2Nfc2NzaV9xJyBhbmQKKyAgICAgKiAnYXNjX3NnX2hlYWQnIHVudGlsIGFmdGVyIHRoZSByZXF1ZXN0IGlzIHN0YXJ0ZWQuCisgICAgICovCisgICAgbWVtc2V0KCZhc2Nfc2NzaV9xLCAwLCBzaXplb2YoQVNDX1NDU0lfUSkpOworCisgICAgLyoKKyAgICAgKiBQb2ludCB0aGUgQVNDX1NDU0lfUSB0byB0aGUgJ3N0cnVjdCBzY3NpX2NtbmQnLgorICAgICAqLworICAgIGFzY19zY3NpX3EucTIuc3JiX3B0ciA9IEFTQ19WQUREUl9UT19VMzIoc2NwKTsKKworICAgIC8qCisgICAgICogQnVpbGQgdGhlIEFTQ19TQ1NJX1EgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEZvciBuYXJyb3cgYm9hcmRzIGEgQ0RCIGxlbmd0aCBtYXhpbXVtIG9mIDEyIGJ5dGVzCisgICAgICogaXMgc3VwcG9ydGVkLgorICAgICAqLworICAgIGlmIChzY3AtPmNtZF9sZW4gPiBBU0NfTUFYX0NEQl9MRU4pIHsKKyAgICAgICAgQVNDX1BSSU5UMygKKyJhc2NfYnVpbGRfcmVxOiBib2FyZCAlZDogY21kX2xlbiAlZCA+IEFTQ19NQVhfQ0RCX0xFTiAgJWRcbiIsCisgICAgICAgICAgICBib2FyZHAtPmlkLCBzY3AtPmNtZF9sZW4sIEFTQ19NQVhfQ0RCX0xFTik7CisgICAgICAgIHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9FUlJPUik7CisgICAgICAgIGFzY19lbnF1ZXVlKCZib2FyZHAtPmRvbmUsIHNjcCwgQVNDX0JBQ0spOworICAgICAgICByZXR1cm4gQVNDX0VSUk9SOworICAgIH0KKyAgICBhc2Nfc2NzaV9xLmNkYnB0ciA9ICZzY3AtPmNtbmRbMF07CisgICAgYXNjX3Njc2lfcS5xMi5jZGJfbGVuID0gc2NwLT5jbWRfbGVuOworICAgIGFzY19zY3NpX3EucTEudGFyZ2V0X2lkID0gQVNDX1RJRF9UT19UQVJHRVRfSUQoc2NwLT5kZXZpY2UtPmlkKTsKKyAgICBhc2Nfc2NzaV9xLnExLnRhcmdldF9sdW4gPSBzY3AtPmRldmljZS0+bHVuOworICAgIGFzY19zY3NpX3EucTIudGFyZ2V0X2l4ID0gQVNDX1RJRExVTl9UT19JWChzY3AtPmRldmljZS0+aWQsIHNjcC0+ZGV2aWNlLT5sdW4pOworICAgIGFzY19zY3NpX3EucTEuc2Vuc2VfYWRkciA9IGNwdV90b19sZTMyKHZpcnRfdG9fYnVzKCZzY3AtPnNlbnNlX2J1ZmZlclswXSkpOworICAgIGFzY19zY3NpX3EucTEuc2Vuc2VfbGVuID0gc2l6ZW9mKHNjcC0+c2Vuc2VfYnVmZmVyKTsKKworICAgIC8qCisgICAgICogSWYgdGhlcmUgYXJlIGFueSBvdXRzdGFuZGluZyByZXF1ZXN0cyBmb3IgdGhlIGN1cnJlbnQgdGFyZ2V0LAorICAgICAqIHRoZW4gZXZlcnkgMjU1dGggcmVxdWVzdCBzZW5kIGFuIE9SREVSRUQgcmVxdWVzdC4gVGhpcyBoZXVyaXN0aWMKKyAgICAgKiB0cmllcyB0byByZXRhaW4gdGhlIGJlbmVmaXQgb2YgcmVxdWVzdCBzb3J0aW5nIHdoaWxlIHByZXZlbnRpbmcKKyAgICAgKiByZXF1ZXN0IHN0YXJ2YXRpb24uIDI1NSBpcyB0aGUgbWF4IG51bWJlciBvZiB0YWdzIG9yIHBlbmRpbmcgY29tbWFuZHMKKyAgICAgKiBhIGRldmljZSBtYXkgaGF2ZSBvdXRzdGFuZGluZy4KKyAgICAgKgorICAgICAqIFRoZSByZXF1ZXN0IGNvdW50IGlzIGluY3JlbWVudGVkIGJlbG93IGZvciBldmVyeSBzdWNjZXNzZnVsbHkKKyAgICAgKiBzdGFydGVkIHJlcXVlc3QuCisgICAgICoKKyAgICAgKi8KKyAgICBpZiAoKGJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3Zhci5jdXJfZHZjX3FuZ1tzY3AtPmRldmljZS0+aWRdID4gMCkgJiYKKyAgICAgICAgKGJvYXJkcC0+cmVxY250W3NjcC0+ZGV2aWNlLT5pZF0gJSAyNTUpID09IDApIHsKKyAgICAgICAgYXNjX3Njc2lfcS5xMi50YWdfY29kZSA9IE1TR19PUkRFUkVEX1RBRzsKKyAgICB9IGVsc2UgeworICAgICAgICBhc2Nfc2NzaV9xLnEyLnRhZ19jb2RlID0gTVNHX1NJTVBMRV9UQUc7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBCdWlsZCBBU0NfU0NTSV9RIGZvciBhIGNvbnRpZ3VvdXMgYnVmZmVyIG9yIGEgc2NhdHRlci1nYXRoZXIKKyAgICAgKiBidWZmZXIgY29tbWFuZC4KKyAgICAgKi8KKyAgICBpZiAoc2NwLT51c2Vfc2cgPT0gMCkgeworICAgICAgICAvKgorICAgICAgICAgKiBDREIgcmVxdWVzdCBvZiBzaW5nbGUgY29udGlndW91cyBidWZmZXIuCisgICAgICAgICAqLworICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGNvbnRfY250KTsKKwlzY3AtPlNDcC5kbWFfaGFuZGxlID0gc2NwLT5yZXF1ZXN0X2J1ZmZsZW4gPworCSAgICBkbWFfbWFwX3NpbmdsZShkZXYsIHNjcC0+cmVxdWVzdF9idWZmZXIsCisJCQkgICBzY3AtPnJlcXVlc3RfYnVmZmxlbiwgc2NwLT5zY19kYXRhX2RpcmVjdGlvbikgOiAwOworCWFzY19zY3NpX3EucTEuZGF0YV9hZGRyID0gY3B1X3RvX2xlMzIoc2NwLT5TQ3AuZG1hX2hhbmRsZSk7CisgICAgICAgIGFzY19zY3NpX3EucTEuZGF0YV9jbnQgPSBjcHVfdG9fbGUzMihzY3AtPnJlcXVlc3RfYnVmZmxlbik7CisgICAgICAgIEFTQ19TVEFUU19BREQoc2NwLT5kZXZpY2UtPmhvc3QsIGNvbnRfeGZlciwKKyAgICAgICAgICAgICAgICAgICAgICBBU0NfQ0VJTElORyhzY3AtPnJlcXVlc3RfYnVmZmxlbiwgNTEyKSk7CisgICAgICAgIGFzY19zY3NpX3EucTEuc2dfcXVldWVfY250ID0gMDsKKyAgICAgICAgYXNjX3Njc2lfcS5zZ19oZWFkID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKgorICAgICAgICAgKiBDREIgc2NhdHRlci1nYXRoZXIgcmVxdWVzdCBsaXN0LgorICAgICAgICAgKi8KKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgc2djbnQ7CisJaW50CQkJdXNlX3NnOworICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgICAgICAqc2xwOworCisJc2xwID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNjcC0+cmVxdWVzdF9idWZmZXI7CisJdXNlX3NnID0gZG1hX21hcF9zZyhkZXYsIHNscCwgc2NwLT51c2Vfc2csIHNjcC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCisJaWYgKHVzZV9zZyA+IHNjcC0+ZGV2aWNlLT5ob3N0LT5zZ190YWJsZXNpemUpIHsKKyAgICAgICAgICAgIEFTQ19QUklOVDMoCisiYXNjX2J1aWxkX3JlcTogYm9hcmQgJWQ6IHVzZV9zZyAlZCA+IHNnX3RhYmxlc2l6ZSAlZFxuIiwKKwkJYm9hcmRwLT5pZCwgdXNlX3NnLCBzY3AtPmRldmljZS0+aG9zdC0+c2dfdGFibGVzaXplKTsKKwkgICAgZG1hX3VubWFwX3NnKGRldiwgc2xwLCBzY3AtPnVzZV9zZywgc2NwLT5zY19kYXRhX2RpcmVjdGlvbik7CisgICAgICAgICAgICBzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpOworICAgICAgICAgICAgYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7CisgICAgICAgICAgICByZXR1cm4gQVNDX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgQVNDX1NUQVRTKHNjcC0+ZGV2aWNlLT5ob3N0LCBzZ19jbnQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVzZSBnbG9iYWwgQVNDX1NHX0hFQUQgc3RydWN0dXJlIGFuZCBzZXQgdGhlIEFTQ19TQ1NJX1EKKyAgICAgICAgICogc3RydWN0dXJlIHRvIHBvaW50IHRvIGl0LgorICAgICAgICAgKi8KKyAgICAgICAgbWVtc2V0KCZhc2Nfc2dfaGVhZCwgMCwgc2l6ZW9mKEFTQ19TR19IRUFEKSk7CisKKyAgICAgICAgYXNjX3Njc2lfcS5xMS5jbnRsIHw9IFFDX1NHX0hFQUQ7CisgICAgICAgIGFzY19zY3NpX3Euc2dfaGVhZCA9ICZhc2Nfc2dfaGVhZDsKKyAgICAgICAgYXNjX3Njc2lfcS5xMS5kYXRhX2NudCA9IDA7CisgICAgICAgIGFzY19zY3NpX3EucTEuZGF0YV9hZGRyID0gMDsKKyAgICAgICAgLyogVGhpcyBpcyBhIGJ5dGUgdmFsdWUsIG90aGVyd2lzZSBpdCB3b3VsZCBuZWVkIHRvIGJlIHN3YXBwZWQuICovCisJYXNjX3NnX2hlYWQuZW50cnlfY250ID0gYXNjX3Njc2lfcS5xMS5zZ19xdWV1ZV9jbnQgPSB1c2Vfc2c7CisgICAgICAgIEFTQ19TVEFUU19BREQoc2NwLT5kZXZpY2UtPmhvc3QsIHNnX2VsZW0sIGFzY19zZ19oZWFkLmVudHJ5X2NudCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29udmVydCBzY2F0dGVyLWdhdGhlciBsaXN0IGludG8gQVNDX1NHX0hFQUQgbGlzdC4KKyAgICAgICAgICovCisJZm9yIChzZ2NudCA9IDA7IHNnY250IDwgdXNlX3NnOyBzZ2NudCsrLCBzbHArKykgeworCSAgICBhc2Nfc2dfaGVhZC5zZ19saXN0W3NnY250XS5hZGRyID0gY3B1X3RvX2xlMzIoc2dfZG1hX2FkZHJlc3Moc2xwKSk7CisJICAgIGFzY19zZ19oZWFkLnNnX2xpc3Rbc2djbnRdLmJ5dGVzID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzbHApKTsKKwkgICAgQVNDX1NUQVRTX0FERChzY3AtPmRldmljZS0+aG9zdCwgc2dfeGZlciwgQVNDX0NFSUxJTkcoc2dfZG1hX2xlbihzbHApLCA1MTIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFTQ19EQkdfUFJUX0FTQ19TQ1NJX1EoMiwgJmFzY19zY3NpX3EpOworICAgIEFTQ19EQkdfUFJUX0NEQigxLCBzY3AtPmNtbmQsIHNjcC0+Y21kX2xlbik7CisKKyAgICByZXR1cm4gQVNDX05PRVJST1I7Cit9CisKKy8qCisgKiBCdWlsZCBhIHJlcXVlc3Qgc3RydWN0dXJlIGZvciB0aGUgQWR2IExpYnJhcnkgKFdpZGUgQm9hcmQpLgorICoKKyAqIElmIGFuIGFkdl9yZXFfdCBjYW4gbm90IGJlIGFsbG9jYXRlZCB0byBpc3N1ZSB0aGUgcmVxdWVzdCwKKyAqIHRoZW4gcmV0dXJuIEFTQ19CVVNZLiBJZiBhbiBlcnJvciBvY2N1cnMsIHRoZW4gcmV0dXJuIEFTQ19FUlJPUi4KKyAqCisgKiBNdWx0aS1ieXRlIGZpZWxkcyBpbiB0aGUgQVNDX1NDU0lfUkVRX1EgdGhhdCBhcmUgdXNlZCBieSB0aGUKKyAqIG1pY3JvY29kZSBmb3IgRE1BIGFkZHJlc3NlcyBvciBtYXRoIG9wZXJhdGlvbnMgYXJlIGJ5dGUgc3dhcHBlZAorICogdG8gbGl0dGxlLWVuZGlhbiBvcmRlci4KKyAqLworU1RBVElDIGludAorYWR2X2J1aWxkX3JlcShhc2NfYm9hcmRfdCAqYm9hcmRwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3AsCisgICAgQURWX1NDU0lfUkVRX1EgKiphZHZfc2NzaXFwcCkKK3sKKyAgICBhZHZfcmVxX3QgICAgICAgICAgICpyZXFwOworICAgIEFEVl9TQ1NJX1JFUV9RICAgICAgKnNjc2lxcDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGk7CisgICAgaW50ICAgICAgICAgICAgICAgICByZXQ7CisgICAgc3RydWN0IGRldmljZQkqZGV2ID0gYm9hcmRwLT5kdmNfY2ZnLmFkdl9kdmNfY2ZnLmRldjsKKworICAgIC8qCisgICAgICogQWxsb2NhdGUgYW4gYWR2X3JlcV90IHN0cnVjdHVyZSBmcm9tIHRoZSBib2FyZCB0byBleGVjdXRlCisgICAgICogdGhlIGNvbW1hbmQuCisgICAgICovCisgICAgaWYgKGJvYXJkcC0+YWR2X3JlcXAgPT0gTlVMTCkgeworICAgICAgICBBU0NfREJHKDEsICJhZHZfYnVpbGRfcmVxOiBubyBmcmVlIGFkdl9yZXFfdFxuIik7CisgICAgICAgIEFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgYWR2X2J1aWxkX25vcmVxKTsKKyAgICAgICAgcmV0dXJuIEFTQ19CVVNZOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcXAgPSBib2FyZHAtPmFkdl9yZXFwOworICAgICAgICBib2FyZHAtPmFkdl9yZXFwID0gcmVxcC0+bmV4dF9yZXFwOworICAgICAgICByZXFwLT5uZXh0X3JlcXAgPSBOVUxMOworICAgIH0KKworICAgIC8qCisgICAgICogR2V0IDMyLWJ5dGUgYWxpZ25lZCBBRFZfU0NTSV9SRVFfUSBhbmQgQURWX1NHX0JMT0NLIHBvaW50ZXJzLgorICAgICAqLworICAgIHNjc2lxcCA9IChBRFZfU0NTSV9SRVFfUSAqKSBBRFZfMzJCQUxJR04oJnJlcXAtPnNjc2lfcmVxX3EpOworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgc2NzaXFwLT5jbnRsID0gc2NzaXFwLT5zY3NpX2NudGwgPSBzY3NpcXAtPmRvbmVfc3RhdHVzID0gMDsKKworICAgIC8qCisgICAgICogU2V0IHRoZSBBRFZfU0NTSV9SRVFfUSAnc3JiX3B0cicgdG8gcG9pbnQgdG8gdGhlIGFkdl9yZXFfdCBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgc2NzaXFwLT5zcmJfcHRyID0gQVNDX1ZBRERSX1RPX1UzMihyZXFwKTsKKworICAgIC8qCisgICAgICogU2V0IHRoZSBhZHZfcmVxX3QgJ2NtbmRwJyB0byBwb2ludCB0byB0aGUgc3RydWN0IHNjc2lfY21uZCBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgcmVxcC0+Y21uZHAgPSBzY3A7CisKKyAgICAvKgorICAgICAqIEJ1aWxkIHRoZSBBRFZfU0NTSV9SRVFfUSByZXF1ZXN0LgorICAgICAqLworCisgICAgLyoKKyAgICAgKiBTZXQgQ0RCIGxlbmd0aCBhbmQgY29weSBpdCB0byB0aGUgcmVxdWVzdCBzdHJ1Y3R1cmUuCisgICAgICogRm9yIHdpZGUgIGJvYXJkcyBhIENEQiBsZW5ndGggbWF4aW11bSBvZiAxNiBieXRlcworICAgICAqIGlzIHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBpZiAoc2NwLT5jbWRfbGVuID4gQURWX01BWF9DREJfTEVOKSB7CisgICAgICAgIEFTQ19QUklOVDMoCisiYWR2X2J1aWxkX3JlcTogYm9hcmQgJWQ6IGNtZF9sZW4gJWQgPiBBRFZfTUFYX0NEQl9MRU4gICVkXG4iLAorICAgICAgICAgICAgYm9hcmRwLT5pZCwgc2NwLT5jbWRfbGVuLCBBRFZfTUFYX0NEQl9MRU4pOworICAgICAgICBzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpOworICAgICAgICBhc2NfZW5xdWV1ZSgmYm9hcmRwLT5kb25lLCBzY3AsIEFTQ19CQUNLKTsKKyAgICAgICAgcmV0dXJuIEFTQ19FUlJPUjsKKyAgICB9CisgICAgc2NzaXFwLT5jZGJfbGVuID0gc2NwLT5jbWRfbGVuOworICAgIC8qIENvcHkgZmlyc3QgMTIgQ0RCIGJ5dGVzIHRvIGNkYltdLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzY3AtPmNtZF9sZW4gJiYgaSA8IDEyOyBpKyspIHsKKyAgICAgICAgc2NzaXFwLT5jZGJbaV0gPSBzY3AtPmNtbmRbaV07CisgICAgfQorICAgIC8qIENvcHkgbGFzdCA0IENEQiBieXRlcywgaWYgcHJlc2VudCwgdG8gY2RiMTZbXS4gKi8KKyAgICBmb3IgKDsgaSA8IHNjcC0+Y21kX2xlbjsgaSsrKSB7CisgICAgICAgIHNjc2lxcC0+Y2RiMTZbaSAtIDEyXSA9IHNjcC0+Y21uZFtpXTsKKyAgICB9CisKKyAgICBzY3NpcXAtPnRhcmdldF9pZCA9IHNjcC0+ZGV2aWNlLT5pZDsKKyAgICBzY3NpcXAtPnRhcmdldF9sdW4gPSBzY3AtPmRldmljZS0+bHVuOworCisgICAgc2NzaXFwLT5zZW5zZV9hZGRyID0gY3B1X3RvX2xlMzIodmlydF90b19idXMoJnNjcC0+c2Vuc2VfYnVmZmVyWzBdKSk7CisgICAgc2NzaXFwLT5zZW5zZV9sZW4gPSBzaXplb2Yoc2NwLT5zZW5zZV9idWZmZXIpOworCisgICAgLyoKKyAgICAgKiBCdWlsZCBBRFZfU0NTSV9SRVFfUSBmb3IgYSBjb250aWd1b3VzIGJ1ZmZlciBvciBhIHNjYXR0ZXItZ2F0aGVyCisgICAgICogYnVmZmVyIGNvbW1hbmQuCisgICAgICovCisKKyAgICBzY3NpcXAtPmRhdGFfY250ID0gY3B1X3RvX2xlMzIoc2NwLT5yZXF1ZXN0X2J1ZmZsZW4pOworICAgIHNjc2lxcC0+dmRhdGFfYWRkciA9IHNjcC0+cmVxdWVzdF9idWZmZXI7CisgICAgc2NzaXFwLT5kYXRhX2FkZHIgPSBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhzY3AtPnJlcXVlc3RfYnVmZmVyKSk7CisKKyAgICBpZiAoc2NwLT51c2Vfc2cgPT0gMCkgeworICAgICAgICAvKgorICAgICAgICAgKiBDREIgcmVxdWVzdCBvZiBzaW5nbGUgY29udGlndW91cyBidWZmZXIuCisgICAgICAgICAqLworICAgICAgICByZXFwLT5zZ2Jsa3AgPSBOVUxMOworCXNjc2lxcC0+ZGF0YV9jbnQgPSBjcHVfdG9fbGUzMihzY3AtPnJlcXVlc3RfYnVmZmxlbik7CisJaWYgKHNjcC0+cmVxdWVzdF9idWZmbGVuKSB7CisJICAgIHNjc2lxcC0+dmRhdGFfYWRkciA9IHNjcC0+cmVxdWVzdF9idWZmZXI7CisJICAgIHNjcC0+U0NwLmRtYV9oYW5kbGUgPQorCSAgICAgICAgZG1hX21hcF9zaW5nbGUoZGV2LCBzY3AtPnJlcXVlc3RfYnVmZmVyLAorCQkJICAgICAgIHNjcC0+cmVxdWVzdF9idWZmbGVuLCBzY3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwl9IGVsc2UgeworCSAgICBzY3NpcXAtPnZkYXRhX2FkZHIgPSAwOworCSAgICBzY3AtPlNDcC5kbWFfaGFuZGxlID0gMDsKKwl9CisJc2NzaXFwLT5kYXRhX2FkZHIgPSBjcHVfdG9fbGUzMihzY3AtPlNDcC5kbWFfaGFuZGxlKTsKKyAgICAgICAgc2NzaXFwLT5zZ19saXN0X3B0ciA9IE5VTEw7CisgICAgICAgIHNjc2lxcC0+c2dfcmVhbF9hZGRyID0gMDsKKyAgICAgICAgQVNDX1NUQVRTKHNjcC0+ZGV2aWNlLT5ob3N0LCBjb250X2NudCk7CisgICAgICAgIEFTQ19TVEFUU19BREQoc2NwLT5kZXZpY2UtPmhvc3QsIGNvbnRfeGZlciwKKyAgICAgICAgICAgICAgICAgICAgICBBU0NfQ0VJTElORyhzY3AtPnJlcXVlc3RfYnVmZmxlbiwgNTEyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ0RCIHNjYXR0ZXItZ2F0aGVyIHJlcXVlc3QgbGlzdC4KKyAgICAgICAgICovCisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzbHA7CisJaW50IHVzZV9zZzsKKworCXNscCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3AtPnJlcXVlc3RfYnVmZmVyOworCXVzZV9zZyA9IGRtYV9tYXBfc2coZGV2LCBzbHAsIHNjcC0+dXNlX3NnLCBzY3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworCWlmICh1c2Vfc2cgPiBBRFZfTUFYX1NHX0xJU1QpIHsKKyAgICAgICAgICAgIEFTQ19QUklOVDMoCisiYWR2X2J1aWxkX3JlcTogYm9hcmQgJWQ6IHVzZV9zZyAlZCA+IEFEVl9NQVhfU0dfTElTVCAlZFxuIiwKKwkJYm9hcmRwLT5pZCwgdXNlX3NnLCBzY3AtPmRldmljZS0+aG9zdC0+c2dfdGFibGVzaXplKTsKKwkgICAgZG1hX3VubWFwX3NnKGRldiwgc2xwLCBzY3AtPnVzZV9zZywgc2NwLT5zY19kYXRhX2RpcmVjdGlvbik7CisgICAgICAgICAgICBzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpOworICAgICAgICAgICAgYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBGcmVlIHRoZSAnYWR2X3JlcV90JyBzdHJ1Y3R1cmUgYnkgYWRkaW5nIGl0IGJhY2sgdG8gdGhlCisgICAgICAgICAgICAgKiBib2FyZCBmcmVlIGxpc3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJlcXAtPm5leHRfcmVxcCA9IGJvYXJkcC0+YWR2X3JlcXA7CisgICAgICAgICAgICBib2FyZHAtPmFkdl9yZXFwID0gcmVxcDsKKworICAgICAgICAgICAgcmV0dXJuIEFTQ19FUlJPUjsKKyAgICAgICAgfQorCisJaWYgKChyZXQgPSBhZHZfZ2V0X3NnbGlzdChib2FyZHAsIHJlcXAsIHNjcCwgdXNlX3NnKSkgIT0gQURWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBGcmVlIHRoZSBhZHZfcmVxX3Qgc3RydWN0dXJlIGJ5IGFkZGluZyBpdCBiYWNrIHRvIHRoZQorICAgICAgICAgICAgICogYm9hcmQgZnJlZSBsaXN0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXFwLT5uZXh0X3JlcXAgPSBib2FyZHAtPmFkdl9yZXFwOworICAgICAgICAgICAgYm9hcmRwLT5hZHZfcmVxcCA9IHJlcXA7CisKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIHNnX2NudCk7CisJQVNDX1NUQVRTX0FERChzY3AtPmRldmljZS0+aG9zdCwgc2dfZWxlbSwgdXNlX3NnKTsKKyAgICB9CisKKyAgICBBU0NfREJHX1BSVF9BRFZfU0NTSV9SRVFfUSgyLCBzY3NpcXApOworICAgIEFTQ19EQkdfUFJUX0NEQigxLCBzY3AtPmNtbmQsIHNjcC0+Y21kX2xlbik7CisKKyAgICAqYWR2X3Njc2lxcHAgPSBzY3NpcXA7CisKKyAgICByZXR1cm4gQVNDX05PRVJST1I7Cit9CisKKy8qCisgKiBCdWlsZCBzY2F0dGVyLWdhdGhlciBsaXN0IGZvciBBZHYgTGlicmFyeSAoV2lkZSBCb2FyZCkuCisgKgorICogQWRkaXRpb25hbCBBRFZfU0dfQkxPQ0sgc3RydWN0dXJlcyB3aWxsIG5lZWQgdG8gYmUgYWxsb2NhdGVkCisgKiBpZiB0aGUgdG90YWwgbnVtYmVyIG9mIHNjYXR0ZXItZ2F0aGVyIGVsZW1lbnRzIGV4Y2VlZHMKKyAqIE5PX09GX1NHX1BFUl9CTE9DSyAoMTUpLiBUaGUgQURWX1NHX0JMT0NLIHN0cnVjdHVyZXMgYXJlCisgKiBhc3N1bWVkIHRvIGJlIHBoeXNpY2FsbHkgY29udGlndW91cy4KKyAqCisgKiBSZXR1cm46CisgKiAgICAgIEFEVl9TVUNDRVNTKDEpIC0gU0cgTGlzdCBzdWNjZXNzZnVsbHkgY3JlYXRlZAorICogICAgICBBRFZfRVJST1IoLTEpIC0gU0cgTGlzdCBjcmVhdGlvbiBmYWlsZWQKKyAqLworU1RBVElDIGludAorYWR2X2dldF9zZ2xpc3QoYXNjX2JvYXJkX3QgKmJvYXJkcCwgYWR2X3JlcV90ICpyZXFwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3AsIGludCB1c2Vfc2cpCit7CisgICAgYWR2X3NnYmxrX3QgICAgICAgICAqc2dibGtwOworICAgIEFEVl9TQ1NJX1JFUV9RICAgICAgKnNjc2lxcDsKKyAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgICpzbHA7CisgICAgaW50ICAgICAgICAgICAgICAgICBzZ19lbGVtX2NudDsKKyAgICBBRFZfU0dfQkxPQ0sgICAgICAgICpzZ19ibG9jaywgKnByZXZfc2dfYmxvY2s7CisgICAgQURWX1BBRERSICAgICAgICAgICBzZ19ibG9ja19wYWRkcjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGk7CisKKyAgICBzY3NpcXAgPSAoQURWX1NDU0lfUkVRX1EgKikgQURWXzMyQkFMSUdOKCZyZXFwLT5zY3NpX3JlcV9xKTsKKyAgICBzbHAgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIHNjcC0+cmVxdWVzdF9idWZmZXI7CisgICAgc2dfZWxlbV9jbnQgPSB1c2Vfc2c7CisgICAgcHJldl9zZ19ibG9jayA9IE5VTEw7CisgICAgcmVxcC0+c2dibGtwID0gTlVMTDsKKworICAgIGRvCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBBbGxvY2F0ZSBhICdhZHZfc2dibGtfdCcgc3RydWN0dXJlIGZyb20gdGhlIGJvYXJkIGZyZWUKKyAgICAgICAgICogbGlzdC4gT25lICdhZHZfc2dibGtfdCcgc3RydWN0dXJlIGhvbGRzIE5PX09GX1NHX1BFUl9CTE9DSworICAgICAgICAgKiAoMTUpIHNjYXR0ZXItZ2F0aGVyIGVsZW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChzZ2Jsa3AgPSBib2FyZHAtPmFkdl9zZ2Jsa3ApID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFTQ19EQkcoMSwgImFkdl9nZXRfc2dsaXN0OiBubyBmcmVlIGFkdl9zZ2Jsa190XG4iKTsKKyAgICAgICAgICAgIEFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgYWR2X2J1aWxkX25vc2cpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQWxsb2NhdGlvbiBmYWlsZWQuIEZyZWUgJ2Fkdl9zZ2Jsa190JyBzdHJ1Y3R1cmVzIGFscmVhZHkKKyAgICAgICAgICAgICAqIGFsbG9jYXRlZCBmb3IgdGhlIHJlcXVlc3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHdoaWxlICgoc2dibGtwID0gcmVxcC0+c2dibGtwKSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFJlbW92ZSAnc2dibGtwJyBmcm9tIHRoZSByZXF1ZXN0IGxpc3QuICovCisgICAgICAgICAgICAgICAgcmVxcC0+c2dibGtwID0gc2dibGtwLT5uZXh0X3NnYmxrcDsKKworICAgICAgICAgICAgICAgIC8qIEFkZCAnc2dibGtwJyB0byB0aGUgYm9hcmQgZnJlZSBsaXN0LiAqLworICAgICAgICAgICAgICAgIHNnYmxrcC0+bmV4dF9zZ2Jsa3AgPSBib2FyZHAtPmFkdl9zZ2Jsa3A7CisgICAgICAgICAgICAgICAgYm9hcmRwLT5hZHZfc2dibGtwID0gc2dibGtwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFTQ19CVVNZOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogQ29tcGxldGUgJ2Fkdl9zZ2Jsa190JyBib2FyZCBhbGxvY2F0aW9uLiAqLworICAgICAgICAgICAgYm9hcmRwLT5hZHZfc2dibGtwID0gc2dibGtwLT5uZXh0X3NnYmxrcDsKKyAgICAgICAgICAgIHNnYmxrcC0+bmV4dF9zZ2Jsa3AgPSBOVUxMOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogR2V0IDggYnl0ZSBhbGlnbmVkIHZpcnR1YWwgYW5kIHBoeXNpY2FsIGFkZHJlc3NlcyBmb3IKKyAgICAgICAgICAgICAqIHRoZSBhbGxvY2F0ZWQgQURWX1NHX0JMT0NLIHN0cnVjdHVyZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc2dfYmxvY2sgPSAoQURWX1NHX0JMT0NLICopIEFEVl84QkFMSUdOKCZzZ2Jsa3AtPnNnX2Jsb2NrKTsKKyAgICAgICAgICAgIHNnX2Jsb2NrX3BhZGRyID0gdmlydF90b19idXMoc2dfYmxvY2spOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ2hlY2sgaWYgdGhpcyBpcyB0aGUgZmlyc3QgJ2Fkdl9zZ2Jsa190JyBmb3IgdGhlIHJlcXVlc3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChyZXFwLT5zZ2Jsa3AgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBSZXF1ZXN0J3MgZmlyc3Qgc2NhdHRlci1nYXRoZXIgYmxvY2suICovCisgICAgICAgICAgICAgICAgcmVxcC0+c2dibGtwID0gc2dibGtwOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBTZXQgQURWX1NDU0lfUkVRX1QgQURWX1NHX0JMT0NLIHZpcnR1YWwgYW5kIHBoeXNpY2FsCisgICAgICAgICAgICAgICAgICogYWRkcmVzcyBwb2ludGVycy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBzY3NpcXAtPnNnX2xpc3RfcHRyID0gc2dfYmxvY2s7CisgICAgICAgICAgICAgICAgc2NzaXFwLT5zZ19yZWFsX2FkZHIgPSBjcHVfdG9fbGUzMihzZ19ibG9ja19wYWRkcik7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBSZXF1ZXN0J3Mgc2Vjb25kIG9yIGxhdGVyIHNjYXR0ZXItZ2F0aGVyIGJsb2NrLiAqLworICAgICAgICAgICAgICAgIHNnYmxrcC0+bmV4dF9zZ2Jsa3AgPSByZXFwLT5zZ2Jsa3A7CisgICAgICAgICAgICAgICAgcmVxcC0+c2dibGtwID0gc2dibGtwOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBQb2ludCB0aGUgcHJldmlvdXMgQURWX1NHX0JMT0NLIHN0cnVjdHVyZSB0bworICAgICAgICAgICAgICAgICAqIHRoZSBuZXdseSBhbGxvY2F0ZWQgQURWX1NHX0JMT0NLIHN0cnVjdHVyZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBBU0NfQVNTRVJUKHByZXZfc2dfYmxvY2sgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgcHJldl9zZ19ibG9jay0+c2dfcHRyID0gY3B1X3RvX2xlMzIoc2dfYmxvY2tfcGFkZHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5PX09GX1NHX1BFUl9CTE9DSzsgaSsrKQorICAgICAgICB7CisJICAgIHNnX2Jsb2NrLT5zZ19saXN0W2ldLnNnX2FkZHIgPSBjcHVfdG9fbGUzMihzZ19kbWFfYWRkcmVzcyhzbHApKTsKKwkgICAgc2dfYmxvY2stPnNnX2xpc3RbaV0uc2dfY291bnQgPSBjcHVfdG9fbGUzMihzZ19kbWFfbGVuKHNscCkpOworCSAgICBBU0NfU1RBVFNfQUREKHNjcC0+ZGV2aWNlLT5ob3N0LCBzZ194ZmVyLCBBU0NfQ0VJTElORyhzZ19kbWFfbGVuKHNscCksIDUxMikpOworCisgICAgICAgICAgICBpZiAoLS1zZ19lbGVtX2NudCA9PSAwKQorICAgICAgICAgICAgeyAgIC8qIExhc3QgQURWX1NHX0JMT0NLIGFuZCBzY2F0dGVyLWdhdGhlciBlbnRyeS4gKi8KKyAgICAgICAgICAgICAgICBzZ19ibG9jay0+c2dfY250ID0gaSArIDE7CisgICAgICAgICAgICAgICAgc2dfYmxvY2stPnNnX3B0ciA9IDBMOyAgICAvKiBMYXN0IEFEVl9TR19CTE9DSyBpbiBsaXN0LiAqLworICAgICAgICAgICAgICAgIHJldHVybiBBRFZfU1VDQ0VTUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNscCsrOworICAgICAgICB9CisgICAgICAgIHNnX2Jsb2NrLT5zZ19jbnQgPSBOT19PRl9TR19QRVJfQkxPQ0s7CisgICAgICAgIHByZXZfc2dfYmxvY2sgPSBzZ19ibG9jazsKKyAgICB9CisgICAgd2hpbGUgKDEpOworICAgIC8qIE5PVFJFQUNIRUQgKi8KK30KKworLyoKKyAqIGFzY19pc3JfY2FsbGJhY2soKSAtIFNlY29uZCBMZXZlbCBJbnRlcnJ1cHQgSGFuZGxlciBjYWxsZWQgYnkgQXNjSVNSKCkuCisgKgorICogSW50ZXJydXB0IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgTmFycm93IFNDU0kgQXNjIExpYnJhcnkuCisgKi8KK1NUQVRJQyB2b2lkCithc2NfaXNyX2NhbGxiYWNrKEFTQ19EVkNfVkFSICphc2NfZHZjX3ZhcnAsIEFTQ19RRE9ORV9JTkZPICpxZG9uZXApCit7CisgICAgYXNjX2JvYXJkX3QgICAgICAgICAqYm9hcmRwOworICAgIHN0cnVjdCBzY3NpX2NtbmQgICAgICAgICAgICpzY3A7CisgICAgc3RydWN0IFNjc2lfSG9zdCAgICAqc2hwOworICAgIGludCAgICAgICAgICAgICAgICAgaTsKKworICAgIEFTQ19EQkcyKDEsICJhc2NfaXNyX2NhbGxiYWNrOiBhc2NfZHZjX3ZhcnAgMHglbHgsIHFkb25lcCAweCVseFxuIiwKKyAgICAgICAgKHVsb25nKSBhc2NfZHZjX3ZhcnAsICh1bG9uZykgcWRvbmVwKTsKKyAgICBBU0NfREJHX1BSVF9BU0NfUURPTkVfSU5GTygyLCBxZG9uZXApOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIHN0cnVjdCBzY3NpX2NtbmQgc3RydWN0dXJlIGFuZCBTY3NpX0hvc3Qgc3RydWN0dXJlIGZvciB0aGUKKyAgICAgKiBjb21tYW5kIHRoYXQgaGFzIGJlZW4gY29tcGxldGVkLgorICAgICAqLworICAgIHNjcCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIEFTQ19VMzJfVE9fVkFERFIocWRvbmVwLT5kMi5zcmJfcHRyKTsKKyAgICBBU0NfREJHMSgxLCAiYXNjX2lzcl9jYWxsYmFjazogc2NwIDB4JWx4XG4iLCAodWxvbmcpIHNjcCk7CisKKyAgICBpZiAoc2NwID09IE5VTEwpIHsKKyAgICAgICAgQVNDX1BSSU5UKCJhc2NfaXNyX2NhbGxiYWNrOiBzY3AgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNDX0RCR19QUlRfQ0RCKDIsIHNjcC0+Y21uZCwgc2NwLT5jbWRfbGVuKTsKKworICAgIC8qCisgICAgICogSWYgdGhlIHJlcXVlc3QncyBob3N0IHBvaW50ZXIgaXMgbm90IHZhbGlkLCBkaXNwbGF5IGEKKyAgICAgKiBtZXNzYWdlIGFuZCByZXR1cm4uCisgICAgICovCisgICAgc2hwID0gc2NwLT5kZXZpY2UtPmhvc3Q7CisgICAgZm9yIChpID0gMDsgaSA8IGFzY19ib2FyZF9jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChhc2NfaG9zdFtpXSA9PSBzaHApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpID09IGFzY19ib2FyZF9jb3VudCkgeworICAgICAgICBBU0NfUFJJTlQyKAorICAgICAgICAgICAgImFzY19pc3JfY2FsbGJhY2s6IHNjcCAweCVseCBoYXMgYmFkIGhvc3QgcG9pbnRlciwgaG9zdCAweCVseFxuIiwKKyAgICAgICAgICAgICh1bG9uZykgc2NwLCAodWxvbmcpIHNocCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU0NfU1RBVFMoc2hwLCBjYWxsYmFjayk7CisgICAgQVNDX0RCRzEoMSwgImFzY19pc3JfY2FsbGJhY2s6IHNocCAweCVseFxuIiwgKHVsb25nKSBzaHApOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgcmVxdWVzdCBpc24ndCBmb3VuZCBvbiB0aGUgYWN0aXZlIHF1ZXVlLCBpdCBtYXkKKyAgICAgKiBoYXZlIGJlZW4gcmVtb3ZlZCB0byBoYW5kbGUgYSByZXNldCByZXF1ZXN0LgorICAgICAqIERpc3BsYXkgYSBtZXNzYWdlIGFuZCByZXR1cm4uCisgICAgICovCisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworICAgIEFTQ19BU1NFUlQoYXNjX2R2Y192YXJwID09ICZib2FyZHAtPmR2Y192YXIuYXNjX2R2Y192YXIpOworICAgIGlmIChhc2Nfcm1xdWV1ZSgmYm9hcmRwLT5hY3RpdmUsIHNjcCkgPT0gQVNDX0ZBTFNFKSB7CisgICAgICAgIEFTQ19QUklOVDIoCisgICAgICAgICAgICAiYXNjX2lzcl9jYWxsYmFjazogYm9hcmQgJWQ6IHNjcCAweCVseCBub3Qgb24gYWN0aXZlIHF1ZXVlXG4iLAorICAgICAgICAgICAgYm9hcmRwLT5pZCwgKHVsb25nKSBzY3ApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiAncWRvbmVwJyBjb250YWlucyB0aGUgY29tbWFuZCdzIGVuZGluZyBzdGF0dXMuCisgICAgICovCisgICAgc3dpdGNoIChxZG9uZXAtPmQzLmRvbmVfc3RhdCkgeworICAgIGNhc2UgUURfTk9fRVJST1I6CisgICAgICAgIEFTQ19EQkcoMiwgImFzY19pc3JfY2FsbGJhY2s6IFFEX05PX0VSUk9SXG4iKTsKKyAgICAgICAgc2NwLT5yZXN1bHQgPSAwOworCisgICAgICAgIC8qCisgICAgICAgICAqIElmIGFuIElOUVVJUlkgY29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCB0aGVuIGNhbGwKKyAgICAgICAgICogdGhlIEFzY0lucXVpcnlIYW5kbGluZygpIGZ1bmN0aW9uIHRvIHNldC11cCB0aGUgZGV2aWNlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNjcC0+Y21uZFswXSA9PSBJTlFVSVJZICYmIHNjcC0+ZGV2aWNlLT5sdW4gPT0gMCAmJgorICAgICAgICAgICAgKHNjcC0+cmVxdWVzdF9idWZmbGVuIC0gcWRvbmVwLT5yZW1haW5fYnl0ZXMpID49IDgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzY0lucXVpcnlIYW5kbGluZyhhc2NfZHZjX3ZhcnAsIHNjcC0+ZGV2aWNlLT5pZCAmIDB4NywKKyAgICAgICAgICAgICAgICAoQVNDX1NDU0lfSU5RVUlSWSAqKSBzY3AtPnJlcXVlc3RfYnVmZmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIGZvciBhbiB1bmRlcnJ1biBjb25kaXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIElmIHRoZXJlIHdhcyBubyBlcnJvciBhbmQgYW4gdW5kZXJydW4gY29uZGl0aW9uLCB0aGVuCisgICAgICAgICAqIHRoZW4gcmV0dXJuIHRoZSBudW1iZXIgb2YgdW5kZXJydW4gYnl0ZXMuCisgICAgICAgICAqLworICAgICAgICBpZiAoc2NwLT5yZXF1ZXN0X2J1ZmZsZW4gIT0gMCAmJiBxZG9uZXAtPnJlbWFpbl9ieXRlcyAhPSAwICYmCisgICAgICAgICAgICBxZG9uZXAtPnJlbWFpbl9ieXRlcyA8PSBzY3AtPnJlcXVlc3RfYnVmZmxlbikgeworICAgICAgICAgICAgQVNDX0RCRzEoMSwgImFzY19pc3JfY2FsbGJhY2s6IHVuZGVycnVuIGNvbmRpdGlvbiAldSBieXRlc1xuIiwKKyAgICAgICAgICAgICh1bnNpZ25lZCkgcWRvbmVwLT5yZW1haW5fYnl0ZXMpOworICAgICAgICAgICAgc2NwLT5yZXNpZCA9IHFkb25lcC0+cmVtYWluX2J5dGVzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBRRF9XSVRIX0VSUk9SOgorICAgICAgICBBU0NfREJHKDIsICJhc2NfaXNyX2NhbGxiYWNrOiBRRF9XSVRIX0VSUk9SXG4iKTsKKyAgICAgICAgc3dpdGNoIChxZG9uZXAtPmQzLmhvc3Rfc3RhdCkgeworICAgICAgICBjYXNlIFFIU1RBX05PX0VSUk9SOgorICAgICAgICAgICAgaWYgKHFkb25lcC0+ZDMuc2NzaV9zdGF0ID09IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTikgeworICAgICAgICAgICAgICAgIEFTQ19EQkcoMiwgImFzY19pc3JfY2FsbGJhY2s6IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTlxuIik7CisgICAgICAgICAgICAgICAgQVNDX0RCR19QUlRfU0VOU0UoMiwgc2NwLT5zZW5zZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihzY3AtPnNlbnNlX2J1ZmZlcikpOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogTm90ZTogVGhlICdzdGF0dXNfYnl0ZSgpJyBtYWNybyB1c2VkIGJ5IHRhcmdldCBkcml2ZXJzCisgICAgICAgICAgICAgICAgICogZGVmaW5lZCBpbiBzY3NpLmggc2hpZnRzIHRoZSBzdGF0dXMgYnl0ZSByZXR1cm5lZCBieQorICAgICAgICAgICAgICAgICAqIGhvc3QgZHJpdmVycyByaWdodCBieSAxIGJpdC4gVGhpcyBpcyB3aHkgdGFyZ2V0IGRyaXZlcnMKKyAgICAgICAgICAgICAgICAgKiBhbHNvIHVzZSByaWdodCBzaGlmdGVkIHN0YXR1cyBieXRlIGRlZmluaXRpb25zLiBGb3IKKyAgICAgICAgICAgICAgICAgKiBpbnN0YW5jZSB0YXJnZXQgZHJpdmVycyB1c2UgQ0hFQ0tfQ09ORElUSU9OLCBkZWZpbmVkIHRvCisgICAgICAgICAgICAgICAgICogMHgxLCBpbnN0ZWFkIG9mIHRoZSBTQ1NJIGRlZmluZWQgY2hlY2sgY29uZGl0aW9uIHZhbHVlCisgICAgICAgICAgICAgICAgICogb2YgMHgyLiBIb3N0IGRyaXZlcnMgYXJlIHN1cHBvc2VkIHRvIHJldHVybiB0aGUgc3RhdHVzCisgICAgICAgICAgICAgICAgICogYnl0ZSBhcyBpdCBpcyBkZWZpbmVkIGJ5IFNDU0kuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgc2NwLT5yZXN1bHQgPSBEUklWRVJfQllURShEUklWRVJfU0VOU0UpIHwKKyAgICAgICAgICAgICAgICAgICAgU1RBVFVTX0JZVEUocWRvbmVwLT5kMy5zY3NpX3N0YXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzY3AtPnJlc3VsdCA9IFNUQVRVU19CWVRFKHFkb25lcC0+ZDMuc2NzaV9zdGF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBRSFNUQSBlcnJvciBvY2N1cnJlZCAqLworICAgICAgICAgICAgQVNDX0RCRzEoMSwgImFzY19pc3JfY2FsbGJhY2s6IGhvc3Rfc3RhdCAweCV4XG4iLAorICAgICAgICAgICAgICAgIHFkb25lcC0+ZDMuaG9zdF9zdGF0KTsKKyAgICAgICAgICAgIHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9CQURfVEFSR0VUKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBRRF9BQk9SVEVEX0JZX0hPU1Q6CisgICAgICAgIEFTQ19EQkcoMSwgImFzY19pc3JfY2FsbGJhY2s6IFFEX0FCT1JURURfQllfSE9TVFxuIik7CisgICAgICAgIHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9BQk9SVCkgfCBNU0dfQllURShxZG9uZXAtPmQzLnNjc2lfbXNnKSB8CisgICAgICAgICAgICAgICAgU1RBVFVTX0JZVEUocWRvbmVwLT5kMy5zY3NpX3N0YXQpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTQ19EQkcxKDEsICJhc2NfaXNyX2NhbGxiYWNrOiBkb25lX3N0YXQgMHgleFxuIiwgcWRvbmVwLT5kMy5kb25lX3N0YXQpOworICAgICAgICBzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpIHwgTVNHX0JZVEUocWRvbmVwLT5kMy5zY3NpX21zZykgfAorICAgICAgICAgICAgICAgIFNUQVRVU19CWVRFKHFkb25lcC0+ZDMuc2NzaV9zdGF0KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB0aGUgJ2luaXRfdGlkbWFzaycgYml0IGlzbid0IGFscmVhZHkgc2V0IGZvciB0aGUgdGFyZ2V0IGFuZCB0aGUKKyAgICAgKiBjdXJyZW50IHJlcXVlc3QgZmluaXNoZWQgbm9ybWFsbHksIHRoZW4gc2V0IHRoZSBiaXQgZm9yIHRoZSB0YXJnZXQKKyAgICAgKiB0byBpbmRpY2F0ZSB0aGF0IGEgZGV2aWNlIGlzIHByZXNlbnQuCisgICAgICovCisgICAgaWYgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhzY3AtPmRldmljZS0+aWQpKSA9PSAwICYmCisgICAgICAgIHFkb25lcC0+ZDMuZG9uZV9zdGF0ID09IFFEX05PX0VSUk9SICYmCisgICAgICAgIHFkb25lcC0+ZDMuaG9zdF9zdGF0ID09IFFIU1RBX05PX0VSUk9SKSB7CisgICAgICAgIGJvYXJkcC0+aW5pdF90aWRtYXNrIHw9IEFEVl9USURfVE9fVElETUFTSyhzY3AtPmRldmljZS0+aWQpOworICAgIH0KKworICAgIC8qCisgICAgICogQmVjYXVzZSBpbnRlcnJ1cHRzIG1heSBiZSBlbmFibGVkIGJ5IHRoZSAnc3RydWN0IHNjc2lfY21uZCcgZG9uZQorICAgICAqIGZ1bmN0aW9uLCBhZGQgdGhlIGNvbW1hbmQgdG8gdGhlIGVuZCBvZiB0aGUgYm9hcmQncyBkb25lIHF1ZXVlLgorICAgICAqIFRoZSBkb25lIGZ1bmN0aW9uIGZvciB0aGUgY29tbWFuZCB3aWxsIGJlIGNhbGxlZCBmcm9tCisgICAgICogYWR2YW5zeXNfaW50ZXJydXB0KCkuCisgICAgICovCisgICAgYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7CisKKyAgICByZXR1cm47Cit9CisKKy8qCisgKiBhZHZfaXNyX2NhbGxiYWNrKCkgLSBTZWNvbmQgTGV2ZWwgSW50ZXJydXB0IEhhbmRsZXIgY2FsbGVkIGJ5IEFkdklTUigpLgorICoKKyAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgV2lkZSBTQ1NJIEFkdiBMaWJyYXJ5LgorICovCitTVEFUSUMgdm9pZAorYWR2X2lzcl9jYWxsYmFjayhBRFZfRFZDX1ZBUiAqYWR2X2R2Y192YXJwLCBBRFZfU0NTSV9SRVFfUSAqc2NzaXFwKQoreworICAgIGFzY19ib2FyZF90ICAgICAgICAgKmJvYXJkcDsKKyAgICBhZHZfcmVxX3QgICAgICAgICAgICpyZXFwOworICAgIGFkdl9zZ2Jsa190ICAgICAgICAgKnNnYmxrcDsKKyAgICBzdHJ1Y3Qgc2NzaV9jbW5kICAgICAgICAgICAqc2NwOworICAgIHN0cnVjdCBTY3NpX0hvc3QgICAgKnNocDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGk7CisgICAgQURWX0RDTlQgICAgICAgICAgICByZXNpZF9jbnQ7CisKKworICAgIEFTQ19EQkcyKDEsICJhZHZfaXNyX2NhbGxiYWNrOiBhZHZfZHZjX3ZhcnAgMHglbHgsIHNjc2lxcCAweCVseFxuIiwKKyAgICAgICAgKHVsb25nKSBhZHZfZHZjX3ZhcnAsICh1bG9uZykgc2NzaXFwKTsKKyAgICBBU0NfREJHX1BSVF9BRFZfU0NTSV9SRVFfUSgyLCBzY3NpcXApOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGFkdl9yZXFfdCBzdHJ1Y3R1cmUgZm9yIHRoZSBjb21tYW5kIHRoYXQgaGFzIGJlZW4KKyAgICAgKiBjb21wbGV0ZWQuIFRoZSBhZHZfcmVxX3Qgc3RydWN0dXJlIGFjdHVhbGx5IGNvbnRhaW5zIHRoZQorICAgICAqIGNvbXBsZXRlZCBBRFZfU0NTSV9SRVFfUSBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgcmVxcCA9IChhZHZfcmVxX3QgKikgQURWX1UzMl9UT19WQUREUihzY3NpcXAtPnNyYl9wdHIpOworICAgIEFTQ19EQkcxKDEsICJhZHZfaXNyX2NhbGxiYWNrOiByZXFwIDB4JWx4XG4iLCAodWxvbmcpIHJlcXApOworICAgIGlmIChyZXFwID09IE5VTEwpIHsKKyAgICAgICAgQVNDX1BSSU5UKCJhZHZfaXNyX2NhbGxiYWNrOiByZXFwIGlzIE5VTExcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIHN0cnVjdCBzY3NpX2NtbmQgc3RydWN0dXJlIGFuZCBTY3NpX0hvc3Qgc3RydWN0dXJlIGZvciB0aGUKKyAgICAgKiBjb21tYW5kIHRoYXQgaGFzIGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogTm90ZTogVGhlIGFkdl9yZXFfdCByZXF1ZXN0IHN0cnVjdHVyZSBhbmQgYWR2X3NnYmxrX3Qgc3RydWN0dXJlLAorICAgICAqIGlmIGFueSwgYXJlIGRyb3BwZWQsIGJlY2F1c2UgYSBib2FyZCBzdHJ1Y3R1cmUgcG9pbnRlciBjYW4gbm90IGJlCisgICAgICogZGV0ZXJtaW5lZC4KKyAgICAgKi8KKyAgICBzY3AgPSByZXFwLT5jbW5kcDsKKyAgICBBU0NfREJHMSgxLCAiYWR2X2lzcl9jYWxsYmFjazogc2NwIDB4JWx4XG4iLCAodWxvbmcpIHNjcCk7CisgICAgaWYgKHNjcCA9PSBOVUxMKSB7CisgICAgICAgIEFTQ19QUklOVCgiYWR2X2lzcl9jYWxsYmFjazogc2NwIGlzIE5VTEw7IGFkdl9yZXFfdCBkcm9wcGVkLlxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNDX0RCR19QUlRfQ0RCKDIsIHNjcC0+Y21uZCwgc2NwLT5jbWRfbGVuKTsKKworICAgIC8qCisgICAgICogSWYgdGhlIHJlcXVlc3QncyBob3N0IHBvaW50ZXIgaXMgbm90IHZhbGlkLCBkaXNwbGF5IGEgbWVzc2FnZQorICAgICAqIGFuZCByZXR1cm4uCisgICAgICovCisgICAgc2hwID0gc2NwLT5kZXZpY2UtPmhvc3Q7CisgICAgZm9yIChpID0gMDsgaSA8IGFzY19ib2FyZF9jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChhc2NfaG9zdFtpXSA9PSBzaHApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIC8qCisgICAgICogTm90ZTogSWYgdGhlIGhvc3Qgc3RydWN0dXJlIGlzIG5vdCBmb3VuZCwgdGhlIGFkdl9yZXFfdCByZXF1ZXN0CisgICAgICogc3RydWN0dXJlIGFuZCBhZHZfc2dibGtfdCBzdHJ1Y3R1cmUsIGlmIGFueSwgaXMgZHJvcHBlZC4KKyAgICAgKi8KKyAgICBpZiAoaSA9PSBhc2NfYm9hcmRfY291bnQpIHsKKyAgICAgICAgQVNDX1BSSU5UMigKKyAgICAgICAgICAgICJhZHZfaXNyX2NhbGxiYWNrOiBzY3AgMHglbHggaGFzIGJhZCBob3N0IHBvaW50ZXIsIGhvc3QgMHglbHhcbiIsCisgICAgICAgICAgICAodWxvbmcpIHNjcCwgKHVsb25nKSBzaHApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNDX1NUQVRTKHNocCwgY2FsbGJhY2spOworICAgIEFTQ19EQkcxKDEsICJhZHZfaXNyX2NhbGxiYWNrOiBzaHAgMHglbHhcbiIsICh1bG9uZykgc2hwKTsKKworICAgIC8qCisgICAgICogSWYgdGhlIHJlcXVlc3QgaXNuJ3QgZm91bmQgb24gdGhlIGFjdGl2ZSBxdWV1ZSwgaXQgbWF5IGhhdmUgYmVlbgorICAgICAqIHJlbW92ZWQgdG8gaGFuZGxlIGEgcmVzZXQgcmVxdWVzdC4gRGlzcGxheSBhIG1lc3NhZ2UgYW5kIHJldHVybi4KKyAgICAgKgorICAgICAqIE5vdGU6IEJlY2F1c2UgdGhlIHN0cnVjdHVyZSBtYXkgc3RpbGwgYmUgaW4gdXNlIGRvbid0IGF0dGVtcHQKKyAgICAgKiB0byBmcmVlIHRoZSBhZHZfcmVxX3QgYW5kIGFkdl9zZ2Jsa190LCBpZiBhbnksIHN0cnVjdHVyZXMuCisgICAgICovCisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworICAgIEFTQ19BU1NFUlQoYWR2X2R2Y192YXJwID09ICZib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXIpOworICAgIGlmIChhc2Nfcm1xdWV1ZSgmYm9hcmRwLT5hY3RpdmUsIHNjcCkgPT0gQVNDX0ZBTFNFKSB7CisgICAgICAgIEFTQ19QUklOVDIoCisgICAgICAgICAgICAiYWR2X2lzcl9jYWxsYmFjazogYm9hcmQgJWQ6IHNjcCAweCVseCBub3Qgb24gYWN0aXZlIHF1ZXVlXG4iLAorICAgICAgICAgICAgYm9hcmRwLT5pZCwgKHVsb25nKSBzY3ApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiAnZG9uZV9zdGF0dXMnIGNvbnRhaW5zIHRoZSBjb21tYW5kJ3MgZW5kaW5nIHN0YXR1cy4KKyAgICAgKi8KKyAgICBzd2l0Y2ggKHNjc2lxcC0+ZG9uZV9zdGF0dXMpIHsKKyAgICBjYXNlIFFEX05PX0VSUk9SOgorICAgICAgICBBU0NfREJHKDIsICJhZHZfaXNyX2NhbGxiYWNrOiBRRF9OT19FUlJPUlxuIik7CisgICAgICAgIHNjcC0+cmVzdWx0ID0gMDsKKworICAgICAgICAvKgorICAgICAgICAgKiBDaGVjayBmb3IgYW4gdW5kZXJydW4gY29uZGl0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiB0aGVyZSB3YXMgbm8gZXJyb3IgYW5kIGFuIHVuZGVycnVuIGNvbmRpdGlvbiwgdGhlbgorICAgICAgICAgKiB0aGVuIHJldHVybiB0aGUgbnVtYmVyIG9mIHVuZGVycnVuIGJ5dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgcmVzaWRfY250ID0gbGUzMl90b19jcHUoc2NzaXFwLT5kYXRhX2NudCk7CisgICAgICAgIGlmIChzY3AtPnJlcXVlc3RfYnVmZmxlbiAhPSAwICYmIHJlc2lkX2NudCAhPSAwICYmCisgICAgICAgICAgICByZXNpZF9jbnQgPD0gc2NwLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKKyAgICAgICAgICAgIEFTQ19EQkcxKDEsICJhZHZfaXNyX2NhbGxiYWNrOiB1bmRlcnJ1biBjb25kaXRpb24gJWx1IGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICh1bG9uZykgcmVzaWRfY250KTsKKyAgICAgICAgICAgIHNjcC0+cmVzaWQgPSByZXNpZF9jbnQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFFEX1dJVEhfRVJST1I6CisgICAgICAgIEFTQ19EQkcoMiwgImFkdl9pc3JfY2FsbGJhY2s6IFFEX1dJVEhfRVJST1JcbiIpOworICAgICAgICBzd2l0Y2ggKHNjc2lxcC0+aG9zdF9zdGF0dXMpIHsKKyAgICAgICAgY2FzZSBRSFNUQV9OT19FUlJPUjoKKyAgICAgICAgICAgIGlmIChzY3NpcXAtPnNjc2lfc3RhdHVzID09IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTikgeworICAgICAgICAgICAgICAgIEFTQ19EQkcoMiwgImFkdl9pc3JfY2FsbGJhY2s6IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTlxuIik7CisgICAgICAgICAgICAgICAgQVNDX0RCR19QUlRfU0VOU0UoMiwgc2NwLT5zZW5zZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihzY3AtPnNlbnNlX2J1ZmZlcikpOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogTm90ZTogVGhlICdzdGF0dXNfYnl0ZSgpJyBtYWNybyB1c2VkIGJ5IHRhcmdldCBkcml2ZXJzCisgICAgICAgICAgICAgICAgICogZGVmaW5lZCBpbiBzY3NpLmggc2hpZnRzIHRoZSBzdGF0dXMgYnl0ZSByZXR1cm5lZCBieQorICAgICAgICAgICAgICAgICAqIGhvc3QgZHJpdmVycyByaWdodCBieSAxIGJpdC4gVGhpcyBpcyB3aHkgdGFyZ2V0IGRyaXZlcnMKKyAgICAgICAgICAgICAgICAgKiBhbHNvIHVzZSByaWdodCBzaGlmdGVkIHN0YXR1cyBieXRlIGRlZmluaXRpb25zLiBGb3IKKyAgICAgICAgICAgICAgICAgKiBpbnN0YW5jZSB0YXJnZXQgZHJpdmVycyB1c2UgQ0hFQ0tfQ09ORElUSU9OLCBkZWZpbmVkIHRvCisgICAgICAgICAgICAgICAgICogMHgxLCBpbnN0ZWFkIG9mIHRoZSBTQ1NJIGRlZmluZWQgY2hlY2sgY29uZGl0aW9uIHZhbHVlCisgICAgICAgICAgICAgICAgICogb2YgMHgyLiBIb3N0IGRyaXZlcnMgYXJlIHN1cHBvc2VkIHRvIHJldHVybiB0aGUgc3RhdHVzCisgICAgICAgICAgICAgICAgICogYnl0ZSBhcyBpdCBpcyBkZWZpbmVkIGJ5IFNDU0kuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgc2NwLT5yZXN1bHQgPSBEUklWRVJfQllURShEUklWRVJfU0VOU0UpIHwKKyAgICAgICAgICAgICAgICAgICAgU1RBVFVTX0JZVEUoc2NzaXFwLT5zY3NpX3N0YXR1cyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNjcC0+cmVzdWx0ID0gU1RBVFVTX0JZVEUoc2NzaXFwLT5zY3NpX3N0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogU29tZSBvdGhlciBRSFNUQSBlcnJvciBvY2N1cnJlZC4gKi8KKyAgICAgICAgICAgIEFTQ19EQkcxKDEsICJhZHZfaXNyX2NhbGxiYWNrOiBob3N0X3N0YXR1cyAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNjc2lxcC0+aG9zdF9zdGF0dXMpOworICAgICAgICAgICAgc2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX0JBRF9UQVJHRVQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFFEX0FCT1JURURfQllfSE9TVDoKKyAgICAgICAgQVNDX0RCRygxLCAiYWR2X2lzcl9jYWxsYmFjazogUURfQUJPUlRFRF9CWV9IT1NUXG4iKTsKKyAgICAgICAgc2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX0FCT1JUKSB8IFNUQVRVU19CWVRFKHNjc2lxcC0+c2NzaV9zdGF0dXMpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTQ19EQkcxKDEsICJhZHZfaXNyX2NhbGxiYWNrOiBkb25lX3N0YXR1cyAweCV4XG4iLCBzY3NpcXAtPmRvbmVfc3RhdHVzKTsKKyAgICAgICAgc2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX0VSUk9SKSB8IFNUQVRVU19CWVRFKHNjc2lxcC0+c2NzaV9zdGF0dXMpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoZSAnaW5pdF90aWRtYXNrJyBiaXQgaXNuJ3QgYWxyZWFkeSBzZXQgZm9yIHRoZSB0YXJnZXQgYW5kIHRoZQorICAgICAqIGN1cnJlbnQgcmVxdWVzdCBmaW5pc2hlZCBub3JtYWxseSwgdGhlbiBzZXQgdGhlIGJpdCBmb3IgdGhlIHRhcmdldAorICAgICAqIHRvIGluZGljYXRlIHRoYXQgYSBkZXZpY2UgaXMgcHJlc2VudC4KKyAgICAgKi8KKyAgICBpZiAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKHNjcC0+ZGV2aWNlLT5pZCkpID09IDAgJiYKKyAgICAgICAgc2NzaXFwLT5kb25lX3N0YXR1cyA9PSBRRF9OT19FUlJPUiAmJgorICAgICAgICBzY3NpcXAtPmhvc3Rfc3RhdHVzID09IFFIU1RBX05PX0VSUk9SKSB7CisgICAgICAgIGJvYXJkcC0+aW5pdF90aWRtYXNrIHw9IEFEVl9USURfVE9fVElETUFTSyhzY3AtPmRldmljZS0+aWQpOworICAgIH0KKworICAgIC8qCisgICAgICogQmVjYXVzZSBpbnRlcnJ1cHRzIG1heSBiZSBlbmFibGVkIGJ5IHRoZSAnc3RydWN0IHNjc2lfY21uZCcgZG9uZQorICAgICAqIGZ1bmN0aW9uLCBhZGQgdGhlIGNvbW1hbmQgdG8gdGhlIGVuZCBvZiB0aGUgYm9hcmQncyBkb25lIHF1ZXVlLgorICAgICAqIFRoZSBkb25lIGZ1bmN0aW9uIGZvciB0aGUgY29tbWFuZCB3aWxsIGJlIGNhbGxlZCBmcm9tCisgICAgICogYWR2YW5zeXNfaW50ZXJydXB0KCkuCisgICAgICovCisgICAgYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7CisKKyAgICAvKgorICAgICAqIEZyZWUgYWxsICdhZHZfc2dibGtfdCcgc3RydWN0dXJlcyBhbGxvY2F0ZWQgZm9yIHRoZSByZXF1ZXN0LgorICAgICAqLworICAgIHdoaWxlICgoc2dibGtwID0gcmVxcC0+c2dibGtwKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLyogUmVtb3ZlICdzZ2Jsa3AnIGZyb20gdGhlIHJlcXVlc3QgbGlzdC4gKi8KKyAgICAgICAgcmVxcC0+c2dibGtwID0gc2dibGtwLT5uZXh0X3NnYmxrcDsKKworICAgICAgICAvKiBBZGQgJ3NnYmxrcCcgdG8gdGhlIGJvYXJkIGZyZWUgbGlzdC4gKi8KKyAgICAgICAgc2dibGtwLT5uZXh0X3NnYmxrcCA9IGJvYXJkcC0+YWR2X3NnYmxrcDsKKyAgICAgICAgYm9hcmRwLT5hZHZfc2dibGtwID0gc2dibGtwOworICAgIH0KKworICAgIC8qCisgICAgICogRnJlZSB0aGUgYWR2X3JlcV90IHN0cnVjdHVyZSB1c2VkIHdpdGggdGhlIGNvbW1hbmQgYnkgYWRkaW5nCisgICAgICogaXQgYmFjayB0byB0aGUgYm9hcmQgZnJlZSBsaXN0LgorICAgICAqLworICAgIHJlcXAtPm5leHRfcmVxcCA9IGJvYXJkcC0+YWR2X3JlcXA7CisgICAgYm9hcmRwLT5hZHZfcmVxcCA9IHJlcXA7CisKKyAgICBBU0NfREJHKDEsICJhZHZfaXNyX2NhbGxiYWNrOiBkb25lXG4iKTsKKworICAgIHJldHVybjsKK30KKworLyoKKyAqIGFkdl9hc3luY19jYWxsYmFjaygpIC0gQWR2IExpYnJhcnkgYXN5bmNocm9ub3VzIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uLgorICovCitTVEFUSUMgdm9pZAorYWR2X2FzeW5jX2NhbGxiYWNrKEFEVl9EVkNfVkFSICphZHZfZHZjX3ZhcnAsIHVjaGFyIGNvZGUpCit7CisgICAgc3dpdGNoIChjb2RlKQorICAgIHsKKyAgICBjYXNlIEFEVl9BU1lOQ19TQ1NJX0JVU19SRVNFVF9ERVQ6CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBmaXJtd2FyZSBkZXRlY3RlZCBhIFNDU0kgQnVzIHJlc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgQVNDX0RCRygwLCAiYWR2X2FzeW5jX2NhbGxiYWNrOiBBRFZfQVNZTkNfU0NTSV9CVVNfUkVTRVRfREVUXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFEVl9BU1lOQ19SRE1BX0ZBSUxVUkU6CisgICAgICAgIC8qCisgICAgICAgICAqIEhhbmRsZSBSRE1BIGZhaWx1cmUgYnkgcmVzZXR0aW5nIHRoZSBTQ1NJIEJ1cyBhbmQKKyAgICAgICAgICogcG9zc2libHkgdGhlIGNoaXAgaWYgaXQgaXMgdW5yZXNwb25zaXZlLiBMb2cgdGhlIGVycm9yCisgICAgICAgICAqIHdpdGggYSB1bmlxdWUgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIEFTQ19EQkcoMCwgImFkdl9hc3luY19jYWxsYmFjazogQURWX0FTWU5DX1JETUFfRkFJTFVSRVxuIik7CisgICAgICAgIEFkdlJlc2V0Q2hpcEFuZFNCKGFkdl9kdmNfdmFycCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBRFZfSE9TVF9TQ1NJX0JVU19SRVNFVDoKKyAgICAgICAgLyoKKyAgICAgICAgICogSG9zdCBnZW5lcmF0ZWQgU0NTSSBidXMgcmVzZXQgb2NjdXJyZWQuCisgICAgICAgICAqLworICAgICAgICBBU0NfREJHKDAsICJhZHZfYXN5bmNfY2FsbGJhY2s6IEFEVl9IT1NUX1NDU0lfQlVTX1JFU0VUXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBBU0NfREJHMSgwLCAiRHZjQXN5bmNDYWxsQmFjazogdW5rbm93biBjb2RlIDB4JXhcbiIsIGNvZGUpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qCisgKiBBZGQgYSAnUkVRUCcgdG8gdGhlIGVuZCBvZiBzcGVjaWZpZWQgcXVldWUuIFNldCAndGlkbWFzaycKKyAqIHRvIGluZGljYXRlIGEgY29tbWFuZCBpcyBxdWV1ZWQgZm9yIHRoZSBkZXZpY2UuCisgKgorICogJ2ZsYWcnIG1heSBiZSBlaXRoZXIgQVNDX0ZST05UIG9yIEFTQ19CQUNLLgorICoKKyAqICdSRVFQTkVYVChyZXFwKScgcmV0dXJucyByZXFwJ3MgbmV4dCBwb2ludGVyLgorICovCitTVEFUSUMgdm9pZAorYXNjX2VucXVldWUoYXNjX3F1ZXVlX3QgKmFzY3EsIFJFUVAgcmVxcCwgaW50IGZsYWcpCit7CisgICAgaW50ICAgICAgICB0aWQ7CisKKyAgICBBU0NfREJHMygzLCAiYXNjX2VucXVldWU6IGFzY3EgMHglbHgsIHJlcXAgMHglbHgsIGZsYWcgJWRcbiIsCisgICAgICAgICh1bG9uZykgYXNjcSwgKHVsb25nKSByZXFwLCBmbGFnKTsKKyAgICBBU0NfQVNTRVJUKHJlcXAgIT0gTlVMTCk7CisgICAgQVNDX0FTU0VSVChmbGFnID09IEFTQ19GUk9OVCB8fCBmbGFnID09IEFTQ19CQUNLKTsKKyAgICB0aWQgPSBSRVFQVElEKHJlcXApOworICAgIEFTQ19BU1NFUlQodGlkID49IDAgJiYgdGlkIDw9IEFEVl9NQVhfVElEKTsKKyAgICBpZiAoZmxhZyA9PSBBU0NfRlJPTlQpIHsKKyAgICAgICAgcmVxcC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopYXNjcS0+cV9maXJzdFt0aWRdOworICAgICAgICBhc2NxLT5xX2ZpcnN0W3RpZF0gPSByZXFwOworICAgICAgICAvKiBJZiB0aGUgcXVldWUgd2FzIGVtcHR5LCBzZXQgdGhlIGxhc3QgcG9pbnRlci4gKi8KKyAgICAgICAgaWYgKGFzY3EtPnFfbGFzdFt0aWRdID09IE5VTEwpIHsKKyAgICAgICAgICAgIGFzY3EtPnFfbGFzdFt0aWRdID0gcmVxcDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8qIEFTQ19CQUNLICovCisgICAgICAgIGlmIChhc2NxLT5xX2xhc3RbdGlkXSAhPSBOVUxMKSB7CisgICAgICAgICAgICBhc2NxLT5xX2xhc3RbdGlkXS0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopcmVxcDsKKyAgICAgICAgfQorICAgICAgICBhc2NxLT5xX2xhc3RbdGlkXSA9IHJlcXA7CisgICAgICAgIHJlcXAtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworICAgICAgICAvKiBJZiB0aGUgcXVldWUgd2FzIGVtcHR5LCBzZXQgdGhlIGZpcnN0IHBvaW50ZXIuICovCisgICAgICAgIGlmIChhc2NxLT5xX2ZpcnN0W3RpZF0gPT0gTlVMTCkgeworICAgICAgICAgICAgYXNjcS0+cV9maXJzdFt0aWRdID0gcmVxcDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBUaGUgcXVldWUgaGFzIGF0IGxlYXN0IG9uZSBlbnRyeSwgc2V0IGl0cyBiaXQuICovCisgICAgYXNjcS0+cV90aWRtYXNrIHw9IEFEVl9USURfVE9fVElETUFTSyh0aWQpOworI2lmZGVmIEFEVkFOU1lTX1NUQVRTCisgICAgLyogTWFpbnRhaW4gcmVxdWVzdCBxdWV1ZSBzdGF0aXN0aWNzLiAqLworICAgIGFzY3EtPnFfdG90X2NudFt0aWRdKys7CisgICAgYXNjcS0+cV9jdXJfY250W3RpZF0rKzsKKyAgICBpZiAoYXNjcS0+cV9jdXJfY250W3RpZF0gPiBhc2NxLT5xX21heF9jbnRbdGlkXSkgeworICAgICAgICBhc2NxLT5xX21heF9jbnRbdGlkXSA9IGFzY3EtPnFfY3VyX2NudFt0aWRdOworICAgICAgICBBU0NfREJHMigyLCAiYXNjX2VucXVldWU6IG5ldyBxX21heF9jbnRbJWRdICVkXG4iLAorICAgICAgICAgICAgdGlkLCBhc2NxLT5xX21heF9jbnRbdGlkXSk7CisgICAgfQorICAgIFJFUVBUSU1FKHJlcXApID0gUkVRVElNRVNUQU1QKCk7CisjZW5kaWYgLyogQURWQU5TWVNfU1RBVFMgKi8KKyAgICBBU0NfREJHMSgzLCAiYXNjX2VucXVldWU6IHJlcXAgMHglbHhcbiIsICh1bG9uZykgcmVxcCk7CisgICAgcmV0dXJuOworfQorCisvKgorICogUmV0dXJuIGZpcnN0IHF1ZXVlZCAnUkVRUCcgb24gdGhlIHNwZWNpZmllZCBxdWV1ZSBmb3IKKyAqIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGRldmljZS4gQ2xlYXIgdGhlICd0aWRtYXNrJyBiaXQgZm9yCisgKiB0aGUgZGV2aWNlIGlmIG5vIG1vcmUgY29tbWFuZHMgYXJlIGxlZnQgcXVldWVkIGZvciBpdC4KKyAqCisgKiAnUkVRUE5FWFQocmVxcCknIHJldHVybnMgcmVxcCdzIG5leHQgcG9pbnRlci4KKyAqLworU1RBVElDIFJFUVAKK2FzY19kZXF1ZXVlKGFzY19xdWV1ZV90ICphc2NxLCBpbnQgdGlkKQoreworICAgIFJFUVAgICAgcmVxcDsKKworICAgIEFTQ19EQkcyKDMsICJhc2NfZGVxdWV1ZTogYXNjcSAweCVseCwgdGlkICVkXG4iLCAodWxvbmcpIGFzY3EsIHRpZCk7CisgICAgQVNDX0FTU0VSVCh0aWQgPj0gMCAmJiB0aWQgPD0gQURWX01BWF9USUQpOworICAgIGlmICgocmVxcCA9IGFzY3EtPnFfZmlyc3RbdGlkXSkgIT0gTlVMTCkgeworICAgICAgICBBU0NfQVNTRVJUKGFzY3EtPnFfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyh0aWQpKTsKKyAgICAgICAgYXNjcS0+cV9maXJzdFt0aWRdID0gUkVRUE5FWFQocmVxcCk7CisgICAgICAgIC8qIElmIHRoZSBxdWV1ZSBpcyBlbXB0eSwgY2xlYXIgaXRzIGJpdCBhbmQgdGhlIGxhc3QgcG9pbnRlci4gKi8KKyAgICAgICAgaWYgKGFzY3EtPnFfZmlyc3RbdGlkXSA9PSBOVUxMKSB7CisgICAgICAgICAgICBhc2NxLT5xX3RpZG1hc2sgJj0gfkFEVl9USURfVE9fVElETUFTSyh0aWQpOworICAgICAgICAgICAgQVNDX0FTU0VSVChhc2NxLT5xX2xhc3RbdGlkXSA9PSByZXFwKTsKKyAgICAgICAgICAgIGFzY3EtPnFfbGFzdFt0aWRdID0gTlVMTDsKKyAgICAgICAgfQorI2lmZGVmIEFEVkFOU1lTX1NUQVRTCisgICAgICAgIC8qIE1haW50YWluIHJlcXVlc3QgcXVldWUgc3RhdGlzdGljcy4gKi8KKyAgICAgICAgYXNjcS0+cV9jdXJfY250W3RpZF0tLTsKKyAgICAgICAgQVNDX0FTU0VSVChhc2NxLT5xX2N1cl9jbnRbdGlkXSA+PSAwKTsKKyAgICAgICAgUkVRVElNRVNUQVQoImFzY19kZXF1ZXVlIiwgYXNjcSwgcmVxcCwgdGlkKTsKKyNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLworICAgIH0KKyAgICBBU0NfREJHMSgzLCAiYXNjX2RlcXVldWU6IHJlcXAgMHglbHhcbiIsICh1bG9uZykgcmVxcCk7CisgICAgcmV0dXJuIHJlcXA7Cit9CisKKy8qCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgc2luZ2x5IGxpbmtlZCBsaXN0IG9mIGFsbCB0aGUgcmVxdWVzdHMgcXVldWVkCisgKiBmb3IgJ3RpZCcgb24gdGhlICdhc2NfcXVldWVfdCcgcG9pbnRlZCB0byBieSAnYXNjcScuCisgKgorICogSWYgJ2xhc3RwcCcgaXMgbm90IE5VTEwsICcqbGFzdHBwJyB3aWxsIGJlIHNldCB0byBwb2ludCB0byB0aGUKKyAqIHRoZSBsYXN0IHJlcXVlc3QgcmV0dXJuZWQgaW4gdGhlIHNpbmdseSBsaW5rZWQgbGlzdC4KKyAqCisgKiAndGlkJyBzaG91bGQgZWl0aGVyIGJlIGEgdmFsaWQgdGFyZ2V0IGlkIG9yIGlmIGl0IGlzIEFTQ19USURfQUxMLAorICogdGhlbiBhbGwgcXVldWVkIHJlcXVlc3RzIGFyZSBjb25jYXRlbmF0ZWQgaW50byBvbmUgbGlzdCBhbmQKKyAqIHJldHVybmVkLgorICoKKyAqIE5vdGU6IElmICdsYXN0cHAnIGlzIHVzZWQgdG8gYXBwZW5kIGEgbmV3IGxpc3QgdG8gdGhlIGVuZCBvZgorICogYW4gb2xkIGxpc3QsIG9ubHkgY2hhbmdlIHRoZSBvbGQgbGlzdCBsYXN0IHBvaW50ZXIgaWYgJypsYXN0cHAnCisgKiAob3IgdGhlIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSkgaXMgbm90IE5VTEwsIGkuZS4gdXNlIGEgdGVtcG9yYXJ5CisgKiB2YXJpYWJsZSBmb3IgJ2xhc3RwcCcgYW5kIGNoZWNrIGl0cyB2YWx1ZSBhZnRlciB0aGUgZnVuY3Rpb24gcmV0dXJuCisgKiBiZWZvcmUgYXNzaWduaW5nIGl0IHRvIHRoZSBsaXN0IGxhc3QgcG9pbnRlci4KKyAqCisgKiBVbmZvcnR1bmF0ZWx5IGNvbGxlY3RpbmcgcXVldWluZyB0aW1lIHN0YXRpc3RpY3MgYWRkcyBvdmVyaGVhZCB0bworICogdGhlIGZ1bmN0aW9uIHRoYXQgaXNuJ3QgaW5oZXJlbnQgdG8gdGhlIGZ1bmN0aW9uJ3MgYWxnb3JpdGhtLgorICovCitTVEFUSUMgUkVRUAorYXNjX2RlcXVldWVfbGlzdChhc2NfcXVldWVfdCAqYXNjcSwgUkVRUCAqbGFzdHBwLCBpbnQgdGlkKQoreworICAgIFJFUVAgICAgZmlyc3RwLCBsYXN0cDsKKyAgICBpbnQgICAgIGk7CisKKyAgICBBU0NfREJHMigzLCAiYXNjX2RlcXVldWVfbGlzdDogYXNjcSAweCVseCwgdGlkICVkXG4iLCAodWxvbmcpIGFzY3EsIHRpZCk7CisgICAgQVNDX0FTU0VSVCgodGlkID09IEFTQ19USURfQUxMKSB8fCAodGlkID49IDAgJiYgdGlkIDw9IEFEVl9NQVhfVElEKSk7CisKKyAgICAvKgorICAgICAqIElmICd0aWQnIGlzIG5vdCBBU0NfVElEX0FMTCwgcmV0dXJuIHJlcXVlc3RzIG9ubHkgZm9yCisgICAgICogdGhlIHNwZWNpZmllZCAndGlkJy4gSWYgJ3RpZCcgaXMgQVNDX1RJRF9BTEwsIHJldHVybiBhbGwKKyAgICAgKiByZXF1ZXN0cyBmb3IgYWxsIHRpZHMuCisgICAgICovCisgICAgaWYgKHRpZCAhPSBBU0NfVElEX0FMTCkgeworICAgICAgICAvKiBSZXR1cm4gYWxsIHJlcXVlc3RzIGZvciB0aGUgc3BlY2lmaWVkICd0aWQnLiAqLworICAgICAgICBpZiAoKGFzY3EtPnFfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyh0aWQpKSA9PSAwKSB7CisgICAgICAgICAgICAvKiBMaXN0IGlzIGVtcHR5OyBTZXQgZmlyc3QgYW5kIGxhc3QgcmV0dXJuIHBvaW50ZXJzIHRvIE5VTEwuICovCisgICAgICAgICAgICBmaXJzdHAgPSBsYXN0cCA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaXJzdHAgPSBhc2NxLT5xX2ZpcnN0W3RpZF07CisgICAgICAgICAgICBsYXN0cCA9IGFzY3EtPnFfbGFzdFt0aWRdOworICAgICAgICAgICAgYXNjcS0+cV9maXJzdFt0aWRdID0gYXNjcS0+cV9sYXN0W3RpZF0gPSBOVUxMOworICAgICAgICAgICAgYXNjcS0+cV90aWRtYXNrICY9IH5BRFZfVElEX1RPX1RJRE1BU0sodGlkKTsKKyNpZmRlZiBBRFZBTlNZU19TVEFUUworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJFUVAgcmVxcDsKKyAgICAgICAgICAgICAgICBhc2NxLT5xX2N1cl9jbnRbdGlkXSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChyZXFwID0gZmlyc3RwOyByZXFwOyByZXFwID0gUkVRUE5FWFQocmVxcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUkVRVElNRVNUQVQoImFzY19kZXF1ZXVlX2xpc3QiLCBhc2NxLCByZXFwLCB0aWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogUmV0dXJuIGFsbCByZXF1ZXN0cyBmb3IgYWxsIHRpZHMuICovCisgICAgICAgIGZpcnN0cCA9IGxhc3RwID0gTlVMTDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXNjcS0+cV90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0cCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0cCA9IGFzY3EtPnFfZmlyc3RbaV07CisgICAgICAgICAgICAgICAgICAgIGxhc3RwID0gYXNjcS0+cV9sYXN0W2ldOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFTQ19BU1NFUlQobGFzdHAgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGxhc3RwLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKilhc2NxLT5xX2ZpcnN0W2ldOworICAgICAgICAgICAgICAgICAgICBsYXN0cCA9IGFzY3EtPnFfbGFzdFtpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNjcS0+cV9maXJzdFtpXSA9IGFzY3EtPnFfbGFzdFtpXSA9IE5VTEw7CisgICAgICAgICAgICAgICAgYXNjcS0+cV90aWRtYXNrICY9IH5BRFZfVElEX1RPX1RJRE1BU0soaSk7CisjaWZkZWYgQURWQU5TWVNfU1RBVFMKKyAgICAgICAgICAgICAgICBhc2NxLT5xX2N1cl9jbnRbaV0gPSAwOworI2VuZGlmIC8qIEFEVkFOU1lTX1NUQVRTICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZmRlZiBBRFZBTlNZU19TVEFUUworICAgICAgICB7CisgICAgICAgICAgICBSRVFQIHJlcXA7CisgICAgICAgICAgICBmb3IgKHJlcXAgPSBmaXJzdHA7IHJlcXA7IHJlcXAgPSBSRVFQTkVYVChyZXFwKSkgeworICAgICAgICAgICAgICAgIFJFUVRJTUVTVEFUKCJhc2NfZGVxdWV1ZV9saXN0IiwgYXNjcSwgcmVxcCwgcmVxcC0+ZGV2aWNlLT5pZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLworICAgIH0KKyAgICBpZiAobGFzdHBwKSB7CisgICAgICAgICpsYXN0cHAgPSBsYXN0cDsKKyAgICB9CisgICAgQVNDX0RCRzEoMywgImFzY19kZXF1ZXVlX2xpc3Q6IGZpcnN0cCAweCVseFxuIiwgKHVsb25nKSBmaXJzdHApOworICAgIHJldHVybiBmaXJzdHA7Cit9CisKKy8qCisgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCAnUkVRUCcgZnJvbSB0aGUgc3BlY2lmaWVkIHF1ZXVlIGZvcgorICogdGhlIHNwZWNpZmllZCB0YXJnZXQgZGV2aWNlLiBDbGVhciB0aGUgJ3RpZG1hc2snIGJpdCBmb3IgdGhlCisgKiBkZXZpY2UgaWYgbm8gbW9yZSBjb21tYW5kcyBhcmUgbGVmdCBxdWV1ZWQgZm9yIGl0LgorICoKKyAqICdSRVFQTkVYVChyZXFwKScgcmV0dXJucyByZXFwJ3MgdGhlIG5leHQgcG9pbnRlci4KKyAqCisgKiBSZXR1cm4gQVNDX1RSVUUgaWYgdGhlIGNvbW1hbmQgd2FzIGZvdW5kIGFuZCByZW1vdmVkLAorICogb3RoZXJ3aXNlIHJldHVybiBBU0NfRkFMU0UuCisgKi8KK1NUQVRJQyBpbnQKK2FzY19ybXF1ZXVlKGFzY19xdWV1ZV90ICphc2NxLCBSRVFQIHJlcXApCit7CisgICAgUkVRUCAgICAgICAgY3VycnAsIHByZXZwOworICAgIGludCAgICAgICAgIHRpZDsKKyAgICBpbnQgICAgICAgICByZXQgPSBBU0NfRkFMU0U7CisKKyAgICBBU0NfREJHMigzLCAiYXNjX3JtcXVldWU6IGFzY3EgMHglbHgsIHJlcXAgMHglbHhcbiIsCisgICAgICAgICh1bG9uZykgYXNjcSwgKHVsb25nKSByZXFwKTsKKyAgICBBU0NfQVNTRVJUKHJlcXAgIT0gTlVMTCk7CisKKyAgICB0aWQgPSBSRVFQVElEKHJlcXApOworICAgIEFTQ19BU1NFUlQodGlkID49IDAgJiYgdGlkIDw9IEFEVl9NQVhfVElEKTsKKworICAgIC8qCisgICAgICogSGFuZGxlIHRoZSBjb21tb24gY2FzZSBvZiAncmVxcCcgYmVpbmcgdGhlIGZpcnN0CisgICAgICogZW50cnkgb24gdGhlIHF1ZXVlLgorICAgICAqLworICAgIGlmIChyZXFwID09IGFzY3EtPnFfZmlyc3RbdGlkXSkgeworICAgICAgICByZXQgPSBBU0NfVFJVRTsKKyAgICAgICAgYXNjcS0+cV9maXJzdFt0aWRdID0gUkVRUE5FWFQocmVxcCk7CisgICAgICAgIC8qIElmIHRoZSBxdWV1ZSBpcyBub3cgZW1wdHksIGNsZWFyIGl0cyBiaXQgYW5kIHRoZSBsYXN0IHBvaW50ZXIuICovCisgICAgICAgIGlmIChhc2NxLT5xX2ZpcnN0W3RpZF0gPT0gTlVMTCkgeworICAgICAgICAgICAgYXNjcS0+cV90aWRtYXNrICY9IH5BRFZfVElEX1RPX1RJRE1BU0sodGlkKTsKKyAgICAgICAgICAgIEFTQ19BU1NFUlQoYXNjcS0+cV9sYXN0W3RpZF0gPT0gcmVxcCk7CisgICAgICAgICAgICBhc2NxLT5xX2xhc3RbdGlkXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGFzY3EtPnFfZmlyc3RbdGlkXSAhPSBOVUxMKSB7CisgICAgICAgIEFTQ19BU1NFUlQoYXNjcS0+cV9sYXN0W3RpZF0gIT0gTlVMTCk7CisgICAgICAgIC8qCisgICAgICAgICAqIEJlY2F1c2UgdGhlIGNhc2Ugb2YgJ3JlcXAnIGJlaW5nIHRoZSBmaXJzdCBlbnRyeSBoYXMgYmVlbgorICAgICAgICAgKiBoYW5kbGVkIGFib3ZlIGFuZCBpdCBpcyBrbm93biB0aGUgcXVldWUgaXMgbm90IGVtcHR5LCBpZgorICAgICAgICAgKiAncmVxcCcgaXMgZm91bmQgb24gdGhlIHF1ZXVlIGl0IGlzIGd1YXJhbnRlZWQgdGhlIHF1ZXVlIHdpbGwKKyAgICAgICAgICogbm90IGJlY29tZSBlbXB0eSBhbmQgdGhhdCAncV9maXJzdFt0aWRdJyB3aWxsIG5vdCBiZSBjaGFuZ2VkLgorICAgICAgICAgKgorICAgICAgICAgKiBTZXQgJ3ByZXZwJyB0byB0aGUgZmlyc3QgZW50cnksICdjdXJycCcgdG8gdGhlIHNlY29uZCBlbnRyeSwKKyAgICAgICAgICogYW5kIHNlYXJjaCBmb3IgJ3JlcXAnLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChwcmV2cCA9IGFzY3EtPnFfZmlyc3RbdGlkXSwgY3VycnAgPSBSRVFQTkVYVChwcmV2cCk7CisgICAgICAgICAgICAgY3VycnA7IHByZXZwID0gY3VycnAsIGN1cnJwID0gUkVRUE5FWFQoY3VycnApKSB7CisgICAgICAgICAgICBpZiAoY3VycnAgPT0gcmVxcCkgeworICAgICAgICAgICAgICAgIHJldCA9IEFTQ19UUlVFOworICAgICAgICAgICAgICAgIHByZXZwLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKilSRVFQTkVYVChjdXJycCk7CisgICAgICAgICAgICAgICAgcmVxcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKGFzY3EtPnFfbGFzdFt0aWRdID09IHJlcXApIHsKKyAgICAgICAgICAgICAgICAgICAgYXNjcS0+cV9sYXN0W3RpZF0gPSBwcmV2cDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgQURWQU5TWVNfU1RBVFMKKyAgICAvKiBNYWludGFpbiByZXF1ZXN0IHF1ZXVlIHN0YXRpc3RpY3MuICovCisgICAgaWYgKHJldCA9PSBBU0NfVFJVRSkgeworICAgICAgICBhc2NxLT5xX2N1cl9jbnRbdGlkXS0tOworICAgICAgICBSRVFUSU1FU1RBVCgiYXNjX3JtcXVldWUiLCBhc2NxLCByZXFwLCB0aWQpOworICAgIH0KKyAgICBBU0NfQVNTRVJUKGFzY3EtPnFfY3VyX2NudFt0aWRdID49IDApOworI2VuZGlmIC8qIEFEVkFOU1lTX1NUQVRTICovCisgICAgQVNDX0RCRzIoMywgImFzY19ybXF1ZXVlOiByZXFwIDB4JWx4LCByZXQgJWRcbiIsICh1bG9uZykgcmVxcCwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICogRXhlY3V0ZSBhcyBtYW55IHF1ZXVlZCByZXF1ZXN0cyBhcyBwb3NzaWJsZSBmb3IgdGhlIHNwZWNpZmllZCBxdWV1ZS4KKyAqCisgKiBDYWxscyBhc2NfZXhlY3V0ZV9zY3NpX2NtbmQoKSB0byBleGVjdXRlIGEgUkVRUC9zdHJ1Y3Qgc2NzaV9jbW5kLgorICovCitTVEFUSUMgdm9pZAorYXNjX2V4ZWN1dGVfcXVldWUoYXNjX3F1ZXVlX3QgKmFzY3EpCit7CisgICAgQURWX1NDU0lfQklUX0lEX1RZUEUgICAgc2Nhbl90aWRtYXNrOworICAgIFJFUVAgICAgICAgICAgICAgICAgICAgIHJlcXA7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgaTsKKworICAgIEFTQ19EQkcxKDEsICJhc2NfZXhlY3V0ZV9xdWV1ZTogYXNjcSAweCVseFxuIiwgKHVsb25nKSBhc2NxKTsKKyAgICAvKgorICAgICAqIEV4ZWN1dGUgcXVldWVkIGNvbW1hbmRzIGZvciBkZXZpY2VzIGF0dGFjaGVkIHRvCisgICAgICogdGhlIGN1cnJlbnQgYm9hcmQgaW4gcm91bmQtcm9iaW4gZmFzaGlvbi4KKyAgICAgKi8KKyAgICBzY2FuX3RpZG1hc2sgPSBhc2NxLT5xX3RpZG1hc2s7CisgICAgZG8geworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzY2FuX3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJlcXAgPSBhc2NfZGVxdWV1ZShhc2NxLCBpKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBzY2FuX3RpZG1hc2sgJj0gfkFEVl9USURfVE9fVElETUFTSyhpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFzY19leGVjdXRlX3Njc2lfY21uZCgoc3RydWN0IHNjc2lfY21uZCAqKSByZXFwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IEFTQ19CVVNZKSB7CisgICAgICAgICAgICAgICAgICAgIHNjYW5fdGlkbWFzayAmPSB+QURWX1RJRF9UT19USURNQVNLKGkpOworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBUaGUgcmVxdWVzdCByZXR1cm5lZCBBU0NfQlVTWS4gRW5xdWV1ZSBhdCB0aGUgZnJvbnQgb2YKKyAgICAgICAgICAgICAgICAgICAgICogdGFyZ2V0J3Mgd2FpdGluZyBsaXN0IHRvIG1haW50YWluIGNvcnJlY3Qgb3JkZXJpbmcuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBhc2NfZW5xdWV1ZShhc2NxLCByZXFwLCBBU0NfRlJPTlQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHNjYW5fdGlkbWFzayk7CisgICAgcmV0dXJuOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKy8qCisgKiBhc2NfcHJ0X2JvYXJkX2RldmljZXMoKQorICoKKyAqIFByaW50IGRyaXZlciBpbmZvcm1hdGlvbiBmb3IgZGV2aWNlcyBhdHRhY2hlZCB0byB0aGUgYm9hcmQuCisgKgorICogTm90ZTogbm8gc2luZ2xlIGxpbmUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBBU0NfUFJUTElORV9TSVpFLAorICogY2YuIGFzY19wcnRfbGluZSgpLgorICoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkIGludG8gJ2NwJy4gTm8gbW9yZSB0aGFuCisgKiAnY3BsZW4nIGNoYXJhY3RlcnMgd2lsbCBiZSBjb3BpZWQgdG8gJ2NwJy4KKyAqLworU1RBVElDIGludAorYXNjX3BydF9ib2FyZF9kZXZpY2VzKHN0cnVjdCBTY3NpX0hvc3QgKnNocCwgY2hhciAqY3AsIGludCBjcGxlbikKK3sKKyAgICBhc2NfYm9hcmRfdCAgICAgICAgKmJvYXJkcDsKKyAgICBpbnQgICAgICAgICAgICAgICAgbGVmdGxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgdG90bGVuOworICAgIGludCAgICAgICAgICAgICAgICBsZW47CisgICAgaW50ICAgICAgICAgICAgICAgIGNoaXBfc2NzaV9pZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgaTsKKworICAgIGJvYXJkcCA9IEFTQ19CT0FSRFAoc2hwKTsKKyAgICBsZWZ0bGVuID0gY3BsZW47CisgICAgdG90bGVuID0gbGVuID0gMDsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyJcbkRldmljZSBJbmZvcm1hdGlvbiBmb3IgQWR2YW5TeXMgU0NTSSBIb3N0ICVkOlxuIiwgc2hwLT5ob3N0X25vKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgY2hpcF9zY3NpX2lkID0gYm9hcmRwLT5kdmNfY2ZnLmFzY19kdmNfY2ZnLmNoaXBfc2NzaV9pZDsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGlwX3Njc2lfaWQgPSBib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXIuY2hpcF9zY3NpX2lkOworICAgIH0KKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlRhcmdldCBJRHMgRGV0ZWN0ZWQ6Iik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGlmIChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgeworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYLCIsIGkpOworICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICglWD1Ib3N0IEFkYXB0ZXIpXG4iLCBjaGlwX3Njc2lfaWQpOworICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgcmV0dXJuIHRvdGxlbjsKK30KKworLyoKKyAqIERpc3BsYXkgV2lkZSBCb2FyZCBCSU9TIEluZm9ybWF0aW9uLgorICovCitTVEFUSUMgaW50Cithc2NfcHJ0X2Fkdl9iaW9zKHN0cnVjdCBTY3NpX0hvc3QgKnNocCwgY2hhciAqY3AsIGludCBjcGxlbikKK3sKKyAgICBhc2NfYm9hcmRfdCAgICAgICAgKmJvYXJkcDsKKyAgICBpbnQgICAgICAgICAgICAgICAgbGVmdGxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgdG90bGVuOworICAgIGludCAgICAgICAgICAgICAgICBsZW47CisgICAgdXNob3J0ICAgICAgICAgICAgIG1ham9yLCBtaW5vciwgbGV0dGVyOworCisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworICAgIGxlZnRsZW4gPSBjcGxlbjsKKyAgICB0b3RsZW4gPSBsZW4gPSAwOworCisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG5ST00gQklPUyBWZXJzaW9uOiAiKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIC8qCisgICAgICogSWYgdGhlIEJJT1Mgc2F2ZWQgYSB2YWxpZCBzaWduYXR1cmUsIHRoZW4gZmlsbCBpbgorICAgICAqIHRoZSBCSU9TIGNvZGUgc2VnbWVudCBiYXNlIGFkZHJlc3MuCisgICAgICovCisgICAgaWYgKGJvYXJkcC0+Ymlvc19zaWduYXR1cmUgIT0gMHg1NUFBKSB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIkRpc2FibGVkIG9yIFByZS0zLjFcbiIpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIkJJT1MgZWl0aGVyIGRpc2FibGVkIG9yIFByZS0zLjEuIElmIGl0IGlzIHByZS0zLjEsIHRoZW4gYSBuZXdlciB2ZXJzaW9uXG4iKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyJjYW4gYmUgZm91bmQgYXQgdGhlIENvbm5lY3RDb20gRlRQIHNpdGU6IGZ0cDovL2Z0cC5jb25uZWN0Y29tLm5ldC9wdWJcbiIpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtYWpvciA9IChib2FyZHAtPmJpb3NfdmVyc2lvbiA+PiAxMikgJiAweEY7CisgICAgICAgIG1pbm9yID0gKGJvYXJkcC0+Ymlvc192ZXJzaW9uID4+IDgpICYgMHhGOworICAgICAgICBsZXR0ZXIgPSAoYm9hcmRwLT5iaW9zX3ZlcnNpb24gJiAweEZGKTsKKworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIlZC4lZCVjXG4iLAorICAgICAgICAgICAgbWFqb3IsIG1pbm9yLCBsZXR0ZXIgPj0gMjYgPyAnPycgOiBsZXR0ZXIgKyAnQScpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDdXJyZW50IGF2YWlsYWJsZSBST00gQklPUyByZWxlYXNlIGlzIDMuMUkgZm9yIFVXCisgICAgICAgICAqIGFuZCAzLjJJIGZvciBVMlcuIFRoaXMgY29kZSBkb2Vzbid0IGRpZmZlcmVudGlhdGUKKyAgICAgICAgICogVVcgYW5kIFUyVyBib2FyZHMuCisgICAgICAgICAqLworICAgICAgICBpZiAobWFqb3IgPCAzIHx8IChtYWpvciA8PSAzICYmIG1pbm9yIDwgMSkgfHwKKyAgICAgICAgICAgIChtYWpvciA8PSAzICYmIG1pbm9yIDw9IDEgJiYgbGV0dGVyIDwgKCdJJy0gJ0EnKSkpIHsKKyAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyJOZXdlciB2ZXJzaW9uIG9mIFJPTSBCSU9TIGlzIGF2YWlsYWJsZSBhdCB0aGUgQ29ubmVjdENvbSBGVFAgc2l0ZTpcbiIpOworICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiZnRwOi8vZnRwLmNvbm5lY3Rjb20ubmV0L3B1YlxuIik7CisgICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0b3RsZW47Cit9CisKKy8qCisgKiBBZGQgc2VyaWFsIG51bWJlciB0byBpbmZvcm1hdGlvbiBiYXIgaWYgc2lnbmF0dXJlIEFBaAorICogaXMgZm91bmQgaW4gYXQgYml0IDE1LTkgKDcgYml0cykgb2Ygd29yZCAxLgorICoKKyAqIFNlcmlhbCBOdW1iZXIgY29uc2lzdHMgZm8gMTIgYWxwaGEtbnVtZXJpYyBkaWdpdHMuCisgKgorICogICAgICAgMSAtIFByb2R1Y3QgdHlwZSAoQSxCLEMsRC4uKSAgV29yZDA6IDE1LTEzICgzIGJpdHMpCisgKiAgICAgICAyIC0gTUZHIExvY2F0aW9uIChBLEIsQyxELi4pICBXb3JkMDogMTItMTAgKDMgYml0cykKKyAqICAgICAzLTQgLSBQcm9kdWN0IElEICgwLTk5KSAgICAgICAgIFdvcmQwOiA5LTAgKDEwIGJpdHMpCisgKiAgICAgICA1IC0gUHJvZHVjdCByZXZpc2lvbiAoQS1KKSAgICBXb3JkMDogICIgICAgICAgICAiCisgKgorICogICAgICAgICAgIFNpZ25hdHVyZSAgICAgICAgICAgICAgICAgV29yZDE6IDE1LTkgKDcgYml0cykKKyAqICAgICAgIDYgLSBZZWFyICgwLTkpICAgICAgICAgICAgICAgIFdvcmQxOiA4LTYgKDMgYml0cykgJiBXb3JkMjogMTUgKDEgYml0KQorICogICAgIDctOCAtIFdlZWsgb2YgdGhlIHllYXIgKDEtNTIpICAgV29yZDE6IDUtMCAoNiBiaXRzKQorICoKKyAqICAgIDktMTIgLSBTZXJpYWwgTnVtYmVyIChBMDAxLVo5OTkpIFdvcmQyOiAxNC0wICgxNSBiaXRzKQorICoKKyAqIE5vdGUgMTogT25seSBwcm9kdWN0aW9uIGNhcmRzIHdpbGwgaGF2ZSBhIHNlcmlhbCBudW1iZXIuCisgKgorICogTm90ZSAyOiBTaWduYXR1cmUgaXMgbW9zdCBzaWduaWZpY2FudCA3IGJpdHMgKDB4RkUpLgorICoKKyAqIFJldHVybnMgQVNDX1RSVUUgaWYgc2VyaWFsIG51bWJlciBmb3VuZCwgb3RoZXJ3aXNlIHJldHVybnMgQVNDX0ZBTFNFLgorICovCitTVEFUSUMgaW50Cithc2NfZ2V0X2VlcHJvbV9zdHJpbmcodXNob3J0ICpzZXJpYWxudW0sIHVjaGFyICpjcCkKK3sKKyAgICB1c2hvcnQgICAgICB3LCBudW07CisKKyAgICBpZiAoKHNlcmlhbG51bVsxXSAmIDB4RkUwMCkgIT0gKCh1c2hvcnQpIDB4QUEgPDwgOCkpIHsKKyAgICAgICAgcmV0dXJuIEFTQ19GQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKgorICAgICAgICAgKiBGaXJzdCB3b3JkIC0gNiBkaWdpdHMuCisgICAgICAgICAqLworICAgICAgICB3ID0gc2VyaWFsbnVtWzBdOworCisgICAgICAgIC8qIFByb2R1Y3QgdHlwZSAtIDFzdCBkaWdpdC4gKi8KKyAgICAgICAgaWYgKCgqY3AgPSAnQScgKyAoKHcgJiAweEUwMDApID4+IDEzKSkgPT0gJ0gnKSB7CisgICAgICAgICAgICAvKiBQcm9kdWN0IHR5cGUgaXMgUD1Qcm90b3R5cGUgKi8KKyAgICAgICAgICAgICpjcCArPSAweDg7CisgICAgICAgIH0KKyAgICAgICAgY3ArKzsKKworICAgICAgICAvKiBNYW51ZmFjdHVyaW5nIGxvY2F0aW9uIC0gMm5kIGRpZ2l0LiAqLworICAgICAgICAqY3ArKyA9ICdBJyArICgodyAmIDB4MUMwMCkgPj4gMTApOworCisgICAgICAgIC8qIFByb2R1Y3QgSUQgLSAzcmQsIDR0aCBkaWdpdHMuICovCisgICAgICAgIG51bSA9IHcgJiAweDNGRjsKKyAgICAgICAgKmNwKysgPSAnMCcgKyAobnVtIC8gMTAwKTsKKyAgICAgICAgbnVtICU9IDEwMDsKKyAgICAgICAgKmNwKysgPSAnMCcgKyAobnVtIC8gMTApOworCisgICAgICAgIC8qIFByb2R1Y3QgcmV2aXNpb24gLSA1dGggZGlnaXQuICovCisgICAgICAgICpjcCsrID0gJ0EnICsgKG51bSAlIDEwKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZWNvbmQgd29yZAorICAgICAgICAgKi8KKyAgICAgICAgdyA9IHNlcmlhbG51bVsxXTsKKworICAgICAgICAvKgorICAgICAgICAgKiBZZWFyIC0gNnRoIGRpZ2l0LgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBiaXQgMTUgb2YgdGhpcmQgd29yZCBpcyBzZXQsIHRoZW4gdGhlCisgICAgICAgICAqIGxhc3QgZGlnaXQgb2YgdGhlIHllYXIgaXMgZ3JlYXRlciB0aGFuIDcuCisgICAgICAgICAqLworICAgICAgICBpZiAoc2VyaWFsbnVtWzJdICYgMHg4MDAwKSB7CisgICAgICAgICAgICAqY3ArKyA9ICc4JyArICgodyAmIDB4MUMwKSA+PiA2KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpjcCsrID0gJzAnICsgKCh3ICYgMHgxQzApID4+IDYpOworICAgICAgICB9CisKKyAgICAgICAgLyogV2VlayBvZiB5ZWFyIC0gN3RoLCA4dGggZGlnaXRzLiAqLworICAgICAgICBudW0gPSB3ICYgMHgwMDNGOworICAgICAgICAqY3ArKyA9ICcwJyArIG51bSAvIDEwOworICAgICAgICBudW0gJT0gMTA7CisgICAgICAgICpjcCsrID0gJzAnICsgbnVtOworCisgICAgICAgIC8qCisgICAgICAgICAqIFRoaXJkIHdvcmQKKyAgICAgICAgICovCisgICAgICAgIHcgPSBzZXJpYWxudW1bMl0gJiAweDdGRkY7CisKKyAgICAgICAgLyogU2VyaWFsIG51bWJlciAtIDl0aCBkaWdpdC4gKi8KKyAgICAgICAgKmNwKysgPSAnQScgKyAodyAvIDEwMDApOworCisgICAgICAgIC8qIDEwdGgsIDExdGgsIDEydGggZGlnaXRzLiAqLworICAgICAgICBudW0gPSB3ICUgMTAwMDsKKyAgICAgICAgKmNwKysgPSAnMCcgKyBudW0gLyAxMDA7CisgICAgICAgIG51bSAlPSAxMDA7CisgICAgICAgICpjcCsrID0gJzAnICsgbnVtIC8gMTA7CisgICAgICAgIG51bSAlPSAxMDsKKyAgICAgICAgKmNwKysgPSAnMCcgKyBudW07CisKKyAgICAgICAgKmNwID0gJ1wwJzsgICAgIC8qIE51bGwgVGVybWluYXRlIHRoZSBzdHJpbmcuICovCisgICAgICAgIHJldHVybiBBU0NfVFJVRTsKKyAgICB9Cit9CisKKy8qCisgKiBhc2NfcHJ0X2FzY19ib2FyZF9lZXByb20oKQorICoKKyAqIFByaW50IGJvYXJkIEVFUFJPTSBjb25maWd1cmF0aW9uLgorICoKKyAqIE5vdGU6IG5vIHNpbmdsZSBsaW5lIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gQVNDX1BSVExJTkVfU0laRSwKKyAqIGNmLiBhc2NfcHJ0X2xpbmUoKS4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZCBpbnRvICdjcCcuIE5vIG1vcmUgdGhhbgorICogJ2NwbGVuJyBjaGFyYWN0ZXJzIHdpbGwgYmUgY29waWVkIHRvICdjcCcuCisgKi8KK1NUQVRJQyBpbnQKK2FzY19wcnRfYXNjX2JvYXJkX2VlcHJvbShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHAsIGNoYXIgKmNwLCBpbnQgY3BsZW4pCit7CisgICAgYXNjX2JvYXJkX3QgICAgICAgICpib2FyZHA7CisgICAgQVNDX0RWQ19WQVIgICAgICAgICphc2NfZHZjX3ZhcnA7CisgICAgaW50ICAgICAgICAgICAgICAgIGxlZnRsZW47CisgICAgaW50ICAgICAgICAgICAgICAgIHRvdGxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgbGVuOworICAgIEFTQ0VFUF9DT05GSUcgICAgICAqZXA7CisgICAgaW50ICAgICAgICAgICAgICAgIGk7CisjaWZkZWYgQ09ORklHX0lTQQorICAgIGludCAgICAgICAgICAgICAgICBpc2FfZG1hX3NwZWVkW10gPSB7IDEwLCA4LCA3LCA2LCA1LCA0LCAzLCAyIH07CisjZW5kaWYgLyogQ09ORklHX0lTQSAqLworICAgIHVjaGFyICAgICAgICAgICAgICBzZXJpYWxzdHJbMTNdOworCisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworICAgIGFzY19kdmNfdmFycCA9ICZib2FyZHAtPmR2Y192YXIuYXNjX2R2Y192YXI7CisgICAgZXAgPSAmYm9hcmRwLT5lZXBfY29uZmlnLmFzY19lZXA7CisKKyAgICBsZWZ0bGVuID0gY3BsZW47CisgICAgdG90bGVuID0gbGVuID0gMDsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyJcbkVFUFJPTSBTZXR0aW5ncyBmb3IgQWR2YW5TeXMgU0NTSSBIb3N0ICVkOlxuIiwgc2hwLT5ob3N0X25vKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGlmIChhc2NfZ2V0X2VlcHJvbV9zdHJpbmcoKHVzaG9ydCAqKSAmZXAtPmFkYXB0ZXJfaW5mb1swXSwgc2VyaWFsc3RyKSA9PQorICAgICAgICBBU0NfVFJVRSkgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgU2VyaWFsIE51bWJlcjogJXNcbiIsIHNlcmlhbHN0cik7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChlcC0+YWRhcHRlcl9pbmZvWzVdID09IDB4QkIpIHsKKyAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyAgICAgICAgICAgICAgICAiIERlZmF1bHQgU2V0dGluZ3MgVXNlZCBmb3IgRUVQUk9NLWxlc3MgQWRhcHRlci5cbiIpOworICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisgICAgICAgICAgICAgICAgIiBTZXJpYWwgTnVtYmVyIFNpZ25hdHVyZSBOb3QgUHJlc2VudC5cbiIpOworICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIEhvc3QgU0NTSSBJRDogJXUsIEhvc3QgUXVldWUgU2l6ZTogJXUsIERldmljZSBRdWV1ZSBTaXplOiAldVxuIiwKKyAgICAgICAgQVNDX0VFUF9HRVRfQ0hJUF9JRChlcCksIGVwLT5tYXhfdG90YWxfcW5nLCBlcC0+bWF4X3RhZ19xbmcpOworICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBjbnRsIDB4JXgsIG5vX3NjYW0gMHgleFxuIiwKKyAgICAgICAgZXAtPmNudGwsIGVwLT5ub19zY2FtKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgVGFyZ2V0IElEOiAgICAgICAgICAgIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlZCIsIGkpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgRGlzY29ubmVjdHM6ICAgICAgICAgIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlYyIsCisgICAgICAgICAgICAoZXAtPmRpc2NfZW5hYmxlICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA/ICdZJyA6ICdOJyk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgIH0KKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOworICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBDb21tYW5kIFF1ZXVpbmc6ICAgICAiKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IEFTQ19NQVhfVElEOyBpKyspIHsKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVjIiwKKyAgICAgICAgICAgIChlcC0+dXNlX2NtZF9xbmcgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIFN0YXJ0IE1vdG9yOiAgICAgICAgICIpOworICAgIEFTQ19QUlRfTkVYVCgpOworICAgIGZvciAoaSA9IDA7IGkgPD0gQVNDX01BWF9USUQ7IGkrKykgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJWMiLAorICAgICAgICAgICAgKGVwLT5zdGFydF9tb3RvciAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPyAnWScgOiAnTicpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgU3luY2hyb25vdXMgVHJhbnNmZXI6Iik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlYyIsCisgICAgICAgICAgICAoZXAtPmluaXRfc2R0ciAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPyAnWScgOiAnTicpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworI2lmZGVmIENPTkZJR19JU0EKKyAgICBpZiAoYXNjX2R2Y192YXJwLT5idXNfdHlwZSAmIEFTQ19JU19JU0EpIHsKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBIb3N0IElTQSBETUEgc3BlZWQ6ICAgJWQgTUIvU1xuIiwKKyAgICAgICAgICAgIGlzYV9kbWFfc3BlZWRbQVNDX0VFUF9HRVRfRE1BX1NQRChlcCldKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KKworICAgICByZXR1cm4gdG90bGVuOworfQorCisvKgorICogYXNjX3BydF9hZHZfYm9hcmRfZWVwcm9tKCkKKyAqCisgKiBQcmludCBib2FyZCBFRVBST00gY29uZmlndXJhdGlvbi4KKyAqCisgKiBOb3RlOiBubyBzaW5nbGUgbGluZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIEFTQ19QUlRMSU5FX1NJWkUsCisgKiBjZi4gYXNjX3BydF9saW5lKCkuCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb3BpZWQgaW50byAnY3AnLiBObyBtb3JlIHRoYW4KKyAqICdjcGxlbicgY2hhcmFjdGVycyB3aWxsIGJlIGNvcGllZCB0byAnY3AnLgorICovCitTVEFUSUMgaW50Cithc2NfcHJ0X2Fkdl9ib2FyZF9lZXByb20oc3RydWN0IFNjc2lfSG9zdCAqc2hwLCBjaGFyICpjcCwgaW50IGNwbGVuKQoreworICAgIGFzY19ib2FyZF90ICAgICAgICAgICAgICAgICAqYm9hcmRwOworICAgIEFEVl9EVkNfVkFSICAgICAgICAgICAgICAgICAqYWR2X2R2Y192YXJwOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0bGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICB0b3RsZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgKnRlcm1zdHI7CisgICAgdWNoYXIgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbHN0clsxM107CisgICAgQURWRUVQXzM1NTBfQ09ORklHICAgICAgICAgICplcF8zNTUwID0gTlVMTDsKKyAgICBBRFZFRVBfMzhDMDgwMF9DT05GSUcgICAgICAgKmVwXzM4QzA4MDAgPSBOVUxMOworICAgIEFEVkVFUF8zOEMxNjAwX0NPTkZJRyAgICAgICAqZXBfMzhDMTYwMCA9IE5VTEw7CisgICAgdXNob3J0ICAgICAgICAgICAgICAgICAgICAgIHdvcmQ7CisgICAgdXNob3J0ICAgICAgICAgICAgICAgICAgICAgICp3b3JkcDsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICAgICAgICAgc2R0cl9zcGVlZCA9IDA7CisKKyAgICBib2FyZHAgPSBBU0NfQk9BUkRQKHNocCk7CisgICAgYWR2X2R2Y192YXJwID0gJmJvYXJkcC0+ZHZjX3Zhci5hZHZfZHZjX3ZhcjsKKyAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKKyAgICB7CisgICAgICAgIGVwXzM1NTAgPSAmYm9hcmRwLT5lZXBfY29uZmlnLmFkdl8zNTUwX2VlcDsKKyAgICB9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApCisgICAgeworICAgICAgICBlcF8zOEMwODAwID0gJmJvYXJkcC0+ZWVwX2NvbmZpZy5hZHZfMzhDMDgwMF9lZXA7CisgICAgfSBlbHNlCisgICAgeworICAgICAgICBlcF8zOEMxNjAwID0gJmJvYXJkcC0+ZWVwX2NvbmZpZy5hZHZfMzhDMTYwMF9lZXA7CisgICAgfQorCisgICAgbGVmdGxlbiA9IGNwbGVuOworICAgIHRvdGxlbiA9IGxlbiA9IDA7CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiXG5FRVBST00gU2V0dGluZ3MgZm9yIEFkdmFuU3lzIFNDU0kgSG9zdCAlZDpcbiIsIHNocC0+aG9zdF9ubyk7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKKyAgICB7CisgICAgICAgIHdvcmRwID0gJmVwXzM1NTAtPnNlcmlhbF9udW1iZXJfd29yZDE7CisgICAgfSBlbHNlIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMwODAwKQorICAgIHsKKyAgICAgICAgd29yZHAgPSAmZXBfMzhDMDgwMC0+c2VyaWFsX251bWJlcl93b3JkMTsKKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIHdvcmRwID0gJmVwXzM4QzE2MDAtPnNlcmlhbF9udW1iZXJfd29yZDE7CisgICAgfQorCisgICAgaWYgKGFzY19nZXRfZWVwcm9tX3N0cmluZyh3b3JkcCwgc2VyaWFsc3RyKSA9PSBBU0NfVFJVRSkgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgU2VyaWFsIE51bWJlcjogJXNcbiIsIHNlcmlhbHN0cik7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyAgICAgICAgICAgICIgU2VyaWFsIE51bWJlciBTaWduYXR1cmUgTm90IFByZXNlbnQuXG4iKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorCisgICAgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApCisgICAgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIEhvc3QgU0NTSSBJRDogJXUsIEhvc3QgUXVldWUgU2l6ZTogJXUsIERldmljZSBRdWV1ZSBTaXplOiAldVxuIiwKKyAgICAgICAgICAgIGVwXzM1NTAtPmFkYXB0ZXJfc2NzaV9pZCwgZXBfMzU1MC0+bWF4X2hvc3RfcW5nLAorICAgICAgICAgICAgZXBfMzU1MC0+bWF4X2R2Y19xbmcpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApCisgICAgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIEhvc3QgU0NTSSBJRDogJXUsIEhvc3QgUXVldWUgU2l6ZTogJXUsIERldmljZSBRdWV1ZSBTaXplOiAldVxuIiwKKyAgICAgICAgICAgIGVwXzM4QzA4MDAtPmFkYXB0ZXJfc2NzaV9pZCwgZXBfMzhDMDgwMC0+bWF4X2hvc3RfcW5nLAorICAgICAgICAgICAgZXBfMzhDMDgwMC0+bWF4X2R2Y19xbmcpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgSG9zdCBTQ1NJIElEOiAldSwgSG9zdCBRdWV1ZSBTaXplOiAldSwgRGV2aWNlIFF1ZXVlIFNpemU6ICV1XG4iLAorICAgICAgICAgICAgZXBfMzhDMTYwMC0+YWRhcHRlcl9zY3NpX2lkLCBlcF8zOEMxNjAwLT5tYXhfaG9zdF9xbmcsCisgICAgICAgICAgICBlcF8zOEMxNjAwLT5tYXhfZHZjX3FuZyk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgIH0KKyAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKKyAgICB7CisgICAgICAgIHdvcmQgPSBlcF8zNTUwLT50ZXJtaW5hdGlvbjsKKyAgICB9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApCisgICAgeworICAgICAgICB3b3JkID0gZXBfMzhDMDgwMC0+dGVybWluYXRpb25fbHZkOworICAgIH0gZWxzZQorICAgIHsKKyAgICAgICAgd29yZCA9IGVwXzM4QzE2MDAtPnRlcm1pbmF0aW9uX2x2ZDsKKyAgICB9CisgICAgc3dpdGNoICh3b3JkKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHRlcm1zdHIgPSAiTG93IE9mZi9IaWdoIE9mZiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgdGVybXN0ciA9ICJMb3cgT2ZmL0hpZ2ggT24iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHRlcm1zdHIgPSAiTG93IE9uL0hpZ2ggT24iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHRlcm1zdHIgPSAiQXV0b21hdGljIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKQorICAgIHsKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiB0ZXJtaW5hdGlvbjogJXUgKCVzKSwgYmlvc19jdHJsOiAweCV4XG4iLAorICAgICAgICAgICAgZXBfMzU1MC0+dGVybWluYXRpb24sIHRlcm1zdHIsIGVwXzM1NTAtPmJpb3NfY3RybCk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgIH0gZWxzZSBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKKyAgICB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgdGVybWluYXRpb246ICV1ICglcyksIGJpb3NfY3RybDogMHgleFxuIiwKKyAgICAgICAgICAgIGVwXzM4QzA4MDAtPnRlcm1pbmF0aW9uX2x2ZCwgdGVybXN0ciwgZXBfMzhDMDgwMC0+Ymlvc19jdHJsKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfSBlbHNlCisgICAgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIHRlcm1pbmF0aW9uOiAldSAoJXMpLCBiaW9zX2N0cmw6IDB4JXhcbiIsCisgICAgICAgICAgICBlcF8zOEMxNjAwLT50ZXJtaW5hdGlvbl9sdmQsIHRlcm1zdHIsIGVwXzM4QzE2MDAtPmJpb3NfY3RybCk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgIH0KKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgVGFyZ2V0IElEOiAgICAgICAgICAgIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlWCIsIGkpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKQorICAgIHsKKyAgICAgICAgd29yZCA9IGVwXzM1NTAtPmRpc2NfZW5hYmxlOworICAgIH0gZWxzZSBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKKyAgICB7CisgICAgICAgIHdvcmQgPSBlcF8zOEMwODAwLT5kaXNjX2VuYWJsZTsKKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIHdvcmQgPSBlcF8zOEMxNjAwLT5kaXNjX2VuYWJsZTsKKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBEaXNjb25uZWN0czogICAgICAgICAiKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVjIiwKKyAgICAgICAgICAgICh3b3JkICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA/ICdZJyA6ICdOJyk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgIH0KKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOworICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApCisgICAgeworICAgICAgICB3b3JkID0gZXBfMzU1MC0+dGFncW5nX2FibGU7CisgICAgfSBlbHNlIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMwODAwKQorICAgIHsKKyAgICAgICAgd29yZCA9IGVwXzM4QzA4MDAtPnRhZ3FuZ19hYmxlOworICAgIH0gZWxzZQorICAgIHsKKyAgICAgICAgd29yZCA9IGVwXzM4QzE2MDAtPnRhZ3FuZ19hYmxlOworICAgIH0KKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIENvbW1hbmQgUXVldWluZzogICAgICIpOworICAgIEFTQ19QUlRfTkVYVCgpOworICAgIGZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJWMiLAorICAgICAgICAgICAgKHdvcmQgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKKyAgICB7CisgICAgICAgIHdvcmQgPSBlcF8zNTUwLT5zdGFydF9tb3RvcjsKKyAgICB9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApCisgICAgeworICAgICAgICB3b3JkID0gZXBfMzhDMDgwMC0+c3RhcnRfbW90b3I7CisgICAgfSBlbHNlCisgICAgeworICAgICAgICB3b3JkID0gZXBfMzhDMTYwMC0+c3RhcnRfbW90b3I7CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgU3RhcnQgTW90b3I6ICAgICAgICAgIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlYyIsCisgICAgICAgICAgICAod29yZCAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPyAnWScgOiAnTicpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKQorICAgIHsKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBTeW5jaHJvbm91cyBUcmFuc2ZlcjoiKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgeworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVjIiwKKyAgICAgICAgICAgICAgICAoZXBfMzU1MC0+c2R0cl9hYmxlICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA/ICdZJyA6ICdOJyk7CisgICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICAgICAgfQorICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisKKyAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKKyAgICB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgVWx0cmEgVHJhbnNmZXI6ICAgICAgIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgeworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVjIiwKKyAgICAgICAgICAgICAgICAoZXBfMzU1MC0+dWx0cmFfYWJsZSAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPyAnWScgOiAnTicpOworICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorCisgICAgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApCisgICAgeworICAgICAgICB3b3JkID0gZXBfMzU1MC0+d2R0cl9hYmxlOworICAgIH0gZWxzZSBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKKyAgICB7CisgICAgICAgIHdvcmQgPSBlcF8zOEMwODAwLT53ZHRyX2FibGU7CisgICAgfSBlbHNlCisgICAgeworICAgICAgICB3b3JkID0gZXBfMzhDMTYwMC0+d2R0cl9hYmxlOworICAgIH0KKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIFdpZGUgVHJhbnNmZXI6ICAgICAgICIpOworICAgIEFTQ19QUlRfTkVYVCgpOworICAgIGZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJWMiLAorICAgICAgICAgICAgKHdvcmQgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCB8fAorICAgICAgICBhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMxNjAwKQorICAgIHsKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBTeW5jaHJvbm91cyBUcmFuc2ZlciBTcGVlZCAoTWh6KTpcbiAgIik7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgKnNwZWVkX3N0cjsKKworICAgICAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZHRyX3NwZWVkID0gYWR2X2R2Y192YXJwLT5zZHRyX3NwZWVkMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNkdHJfc3BlZWQgPSBhZHZfZHZjX3ZhcnAtPnNkdHJfc3BlZWQyOworICAgICAgICAgICAgfSBlbHNlIGlmIChpID09IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2R0cl9zcGVlZCA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMTIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2R0cl9zcGVlZCA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKHNkdHJfc3BlZWQgJiBBRFZfTUFYX1RJRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6ICBzcGVlZF9zdHIgPSAiT2ZmIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAgc3BlZWRfc3RyID0gIiAgNSI7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogIHNwZWVkX3N0ciA9ICIgMTAiOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6ICBzcGVlZF9zdHIgPSAiIDIwIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0OiAgc3BlZWRfc3RyID0gIiA0MCI7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTogIHNwZWVkX3N0ciA9ICIgODAiOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBzcGVlZF9zdHIgPSAiVW5rIjsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIlWDolcyAiLCBpLCBzcGVlZF9zdHIpOworICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgICAgICAgICBpZiAoaSA9PSA3KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuICAiKTsKKyAgICAgICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNkdHJfc3BlZWQgPj49IDQ7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorCisgICAgcmV0dXJuIHRvdGxlbjsKK30KKworLyoKKyAqIGFzY19wcnRfZHJpdmVyX2NvbmYoKQorICoKKyAqIE5vdGU6IG5vIHNpbmdsZSBsaW5lIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gQVNDX1BSVExJTkVfU0laRSwKKyAqIGNmLiBhc2NfcHJ0X2xpbmUoKS4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZCBpbnRvICdjcCcuIE5vIG1vcmUgdGhhbgorICogJ2NwbGVuJyBjaGFyYWN0ZXJzIHdpbGwgYmUgY29waWVkIHRvICdjcCcuCisgKi8KK1NUQVRJQyBpbnQKK2FzY19wcnRfZHJpdmVyX2NvbmYoc3RydWN0IFNjc2lfSG9zdCAqc2hwLCBjaGFyICpjcCwgaW50IGNwbGVuKQoreworICAgIGFzY19ib2FyZF90ICAgICAgICAgICAgKmJvYXJkcDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIGxlZnRsZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICB0b3RsZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICBsZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICBjaGlwX3Njc2lfaWQ7CisKKyAgICBib2FyZHAgPSBBU0NfQk9BUkRQKHNocCk7CisKKyAgICBsZWZ0bGVuID0gY3BsZW47CisgICAgdG90bGVuID0gbGVuID0gMDsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyJcbkxpbnV4IERyaXZlciBDb25maWd1cmF0aW9uIGFuZCBJbmZvcm1hdGlvbiBmb3IgQWR2YW5TeXMgU0NTSSBIb3N0ICVkOlxuIiwKKyAgICAgICAgc2hwLT5ob3N0X25vKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgaG9zdF9idXN5ICV1LCBsYXN0X3Jlc2V0ICV1LCBtYXhfaWQgJXUsIG1heF9sdW4gJXUsIG1heF9jaGFubmVsICV1XG4iLAorICAgICAgICBzaHAtPmhvc3RfYnVzeSwgc2hwLT5sYXN0X3Jlc2V0LCBzaHAtPm1heF9pZCwgc2hwLT5tYXhfbHVuLAorICAgICAgICBzaHAtPm1heF9jaGFubmVsKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgdW5pcXVlX2lkICVkLCBjYW5fcXVldWUgJWQsIHRoaXNfaWQgJWQsIHNnX3RhYmxlc2l6ZSAldSwgY21kX3Blcl9sdW4gJXVcbiIsCisgICAgICAgIHNocC0+dW5pcXVlX2lkLCBzaHAtPmNhbl9xdWV1ZSwgc2hwLT50aGlzX2lkLCBzaHAtPnNnX3RhYmxlc2l6ZSwKKyAgICAgICAgc2hwLT5jbWRfcGVyX2x1bik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIHVuY2hlY2tlZF9pc2FfZG1hICVkLCB1c2VfY2x1c3RlcmluZyAlZFxuIiwKKyAgICAgICAgc2hwLT51bmNoZWNrZWRfaXNhX2RtYSwgc2hwLT51c2VfY2x1c3RlcmluZyk7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIGZsYWdzIDB4JXgsIGxhc3RfcmVzZXQgMHgleCwgamlmZmllcyAweCV4LCBhc2Nfbl9pb19wb3J0IDB4JXhcbiIsCisgICAgICAgIGJvYXJkcC0+ZmxhZ3MsIGJvYXJkcC0+bGFzdF9yZXNldCwgamlmZmllcywgYm9hcmRwLT5hc2Nfbl9pb19wb3J0KTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgICAvKiAnc2hwLT5uX2lvX3BvcnQnIG1heSBiZSB0cnVuY2F0ZWQgYmVjYXVzZSBpdCBpcyBvbmx5IG9uZSBieXRlLiAqLworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgaW9fcG9ydCAweCV4LCBuX2lvX3BvcnQgMHgleFxuIiwKKyAgICAgICAgc2hwLT5pb19wb3J0LCBzaHAtPm5faW9fcG9ydCk7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisgICAgICAgIGNoaXBfc2NzaV9pZCA9IGJvYXJkcC0+ZHZjX2NmZy5hc2NfZHZjX2NmZy5jaGlwX3Njc2lfaWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hpcF9zY3NpX2lkID0gYm9hcmRwLT5kdmNfdmFyLmFkdl9kdmNfdmFyLmNoaXBfc2NzaV9pZDsKKyAgICB9CisKKyAgICByZXR1cm4gdG90bGVuOworfQorCisvKgorICogYXNjX3BydF9hc2NfYm9hcmRfaW5mbygpCisgKgorICogUHJpbnQgZHluYW1pYyBib2FyZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICoKKyAqIE5vdGU6IG5vIHNpbmdsZSBsaW5lIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gQVNDX1BSVExJTkVfU0laRSwKKyAqIGNmLiBhc2NfcHJ0X2xpbmUoKS4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZCBpbnRvICdjcCcuIE5vIG1vcmUgdGhhbgorICogJ2NwbGVuJyBjaGFyYWN0ZXJzIHdpbGwgYmUgY29waWVkIHRvICdjcCcuCisgKi8KK1NUQVRJQyBpbnQKK2FzY19wcnRfYXNjX2JvYXJkX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hwLCBjaGFyICpjcCwgaW50IGNwbGVuKQoreworICAgIGFzY19ib2FyZF90ICAgICAgICAgICAgKmJvYXJkcDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIGNoaXBfc2NzaV9pZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIGxlZnRsZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICB0b3RsZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICBsZW47CisgICAgQVNDX0RWQ19WQVIgICAgICAgICAgICAqdjsKKyAgICBBU0NfRFZDX0NGRyAgICAgICAgICAgICpjOworICAgIGludCAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIHJlbmVnb3RpYXRlID0gMDsKKworICAgIGJvYXJkcCA9IEFTQ19CT0FSRFAoc2hwKTsKKyAgICB2ID0gJmJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3ZhcjsKKyAgICBjID0gJmJvYXJkcC0+ZHZjX2NmZy5hc2NfZHZjX2NmZzsKKyAgICBjaGlwX3Njc2lfaWQgPSBjLT5jaGlwX3Njc2lfaWQ7CisKKyAgICBsZWZ0bGVuID0gY3BsZW47CisgICAgdG90bGVuID0gbGVuID0gMDsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyJcbkFzYyBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gYW5kIFN0YXRpc3RpY3MgZm9yIEFkdmFuU3lzIFNDU0kgSG9zdCAlZDpcbiIsCisgICAgc2hwLT5ob3N0X25vKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgY2hpcF92ZXJzaW9uICV1LCBsaWJfdmVyc2lvbiAweCV4LCBsaWJfc2VyaWFsX25vICV1LCBtY29kZV9kYXRlIDB4JXhcbiIsCisgICAgICAgIGMtPmNoaXBfdmVyc2lvbiwgYy0+bGliX3ZlcnNpb24sIGMtPmxpYl9zZXJpYWxfbm8sIGMtPm1jb2RlX2RhdGUpOworICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBtY29kZV92ZXJzaW9uIDB4JXgsIGVycl9jb2RlICV1XG4iLAorICAgICAgICAgYy0+bWNvZGVfdmVyc2lvbiwgdi0+ZXJyX2NvZGUpOworICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgLyogQ3VycmVudCBudW1iZXIgb2YgY29tbWFuZHMgd2FpdGluZyBmb3IgdGhlIGhvc3QuICovCisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBUb3RhbCBDb21tYW5kIFBlbmRpbmc6ICVkXG4iLCB2LT5jdXJfdG90YWxfcW5nKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgQ29tbWFuZCBRdWV1aW5nOiIpOworICAgIEFTQ19QUlRfTkVYVCgpOworICAgIGZvciAoaSA9IDA7IGkgPD0gQVNDX01BWF9USUQ7IGkrKykgeworICAgICAgICBpZiAoKGNoaXBfc2NzaV9pZCA9PSBpKSB8fAorICAgICAgICAgICAgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlWDolYyIsCisgICAgICAgICAgICBpLCAodi0+dXNlX3RhZ2dlZF9xbmcgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICAvKiBDdXJyZW50IG51bWJlciBvZiBjb21tYW5kcyB3YWl0aW5nIGZvciBhIGRldmljZS4gKi8KKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIENvbW1hbmQgUXVldWUgUGVuZGluZzoiKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IEFTQ19NQVhfVElEOyBpKyspIHsKKyAgICAgICAgaWYgKChjaGlwX3Njc2lfaWQgPT0gaSkgfHwKKyAgICAgICAgICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJVg6JXUiLCBpLCB2LT5jdXJfZHZjX3FuZ1tpXSk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgIH0KKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOworICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgLyogQ3VycmVudCBsaW1pdCBvbiBudW1iZXIgb2YgY29tbWFuZHMgdGhhdCBjYW4gYmUgc2VudCB0byBhIGRldmljZS4gKi8KKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIENvbW1hbmQgUXVldWUgTGltaXQ6Iik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8CisgICAgICAgICAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOiV1IiwgaSwgdi0+bWF4X2R2Y19xbmdbaV0pOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIC8qIEluZGljYXRlIHdoZXRoZXIgdGhlIGRldmljZSBoYXMgcmV0dXJuZWQgcXVldWUgZnVsbCBzdGF0dXMuICovCisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBDb21tYW5kIFF1ZXVlIEZ1bGw6Iik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8CisgICAgICAgICAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJvYXJkcC0+cXVldWVfZnVsbCAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgeworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOlktJWQiLAorICAgICAgICAgICAgICAgIGksIGJvYXJkcC0+cXVldWVfZnVsbF9jbnRbaV0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOk4iLCBpKTsKKyAgICAgICAgfQorICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgU3luY2hyb25vdXMgVHJhbnNmZXI6Iik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8CisgICAgICAgICAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOiVjIiwKKyAgICAgICAgICAgIGksICh2LT5zZHRyX2RvbmUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IEFTQ19NQVhfVElEOyBpKyspIHsKKyAgICAgICAgdWNoYXIgc3luX3BlcmlvZF9peDsKKworICAgICAgICBpZiAoKGNoaXBfc2NzaV9pZCA9PSBpKSB8fAorICAgICAgICAgICAgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkgfHwKKyAgICAgICAgICAgICgodi0+aW5pdF9zZHRyICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgICVYOiIsIGkpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKworICAgICAgICBpZiAoKGJvYXJkcC0+c2R0cl9kYXRhW2ldICYgQVNDX1NZTl9NQVhfT0ZGU0VUKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgQXN5bmNocm9ub3VzIik7CisgICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN5bl9wZXJpb2RfaXggPQorICAgICAgICAgICAgICAgIChib2FyZHAtPnNkdHJfZGF0YVtpXSA+PiA0KSAmICh2LT5tYXhfc2R0cl9pbmRleCAtIDEpOworCisgICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisgICAgICAgICAgICAgICAgIiBUcmFuc2ZlciBQZXJpb2QgRmFjdG9yOiAlZCAoJWQuJWQgTWh6KSwiLAorICAgICAgICAgICAgICAgIHYtPnNkdHJfcGVyaW9kX3RibFtzeW5fcGVyaW9kX2l4XSwKKyAgICAgICAgICAgICAgICAyNTAgLyB2LT5zZHRyX3BlcmlvZF90Ymxbc3luX3BlcmlvZF9peF0sCisgICAgICAgICAgICAgICAgQVNDX1RFTlRIUygyNTAsIHYtPnNkdHJfcGVyaW9kX3RibFtzeW5fcGVyaW9kX2l4XSkpOworICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBSRVEvQUNLIE9mZnNldDogJWQiLAorICAgICAgICAgICAgICAgIGJvYXJkcC0+c2R0cl9kYXRhW2ldICYgQVNDX1NZTl9NQVhfT0ZGU0VUKTsKKyAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh2LT5zZHRyX2RvbmUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApIHsKKyAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIipcbiIpOworICAgICAgICAgICAgcmVuZWdvdGlhdGUgPSAxOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisKKyAgICBpZiAocmVuZWdvdGlhdGUpCisgICAgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisgICAgICAgICAgICAiICogPSBSZS1uZWdvdGlhdGlvbiBwZW5kaW5nIGJlZm9yZSBuZXh0IGNvbW1hbmQuXG4iKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorCisgICAgcmV0dXJuIHRvdGxlbjsKK30KKworLyoKKyAqIGFzY19wcnRfYWR2X2JvYXJkX2luZm8oKQorICoKKyAqIFByaW50IGR5bmFtaWMgYm9hcmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAqCisgKiBOb3RlOiBubyBzaW5nbGUgbGluZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIEFTQ19QUlRMSU5FX1NJWkUsCisgKiBjZi4gYXNjX3BydF9saW5lKCkuCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb3BpZWQgaW50byAnY3AnLiBObyBtb3JlIHRoYW4KKyAqICdjcGxlbicgY2hhcmFjdGVycyB3aWxsIGJlIGNvcGllZCB0byAnY3AnLgorICovCitTVEFUSUMgaW50Cithc2NfcHJ0X2Fkdl9ib2FyZF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNocCwgY2hhciAqY3AsIGludCBjcGxlbikKK3sKKyAgICBhc2NfYm9hcmRfdCAgICAgICAgICAgICpib2FyZHA7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICBsZWZ0bGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgdG90bGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgbGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBBRFZfRFZDX1ZBUiAgICAgICAgICAgICp2OworICAgIEFEVl9EVkNfQ0ZHICAgICAgICAgICAgKmM7CisgICAgQWR2UG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICAgIGNoaXBfc2NzaV9pZDsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICAgIGxyYW13b3JkOworICAgIHVjaGFyICAgICAgICAgICAgICAgICAgbHJhbWJ5dGU7CisgICAgdXNob3J0ICAgICAgICAgICAgICAgICB0YWdxbmdfYWJsZTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICAgIHNkdHJfYWJsZSwgd2R0cl9hYmxlOworICAgIHVzaG9ydCAgICAgICAgICAgICAgICAgd2R0cl9kb25lLCBzZHRyX2RvbmU7CisgICAgdXNob3J0ICAgICAgICAgICAgICAgICBwZXJpb2QgPSAwOworICAgIGludCAgICAgICAgICAgICAgICAgICAgcmVuZWdvdGlhdGUgPSAwOworCisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworICAgIHYgPSAmYm9hcmRwLT5kdmNfdmFyLmFkdl9kdmNfdmFyOworICAgIGMgPSAmYm9hcmRwLT5kdmNfY2ZnLmFkdl9kdmNfY2ZnOworICAgIGlvcF9iYXNlID0gdi0+aW9wX2Jhc2U7CisgICAgY2hpcF9zY3NpX2lkID0gdi0+Y2hpcF9zY3NpX2lkOworCisgICAgbGVmdGxlbiA9IGNwbGVuOworICAgIHRvdGxlbiA9IGxlbiA9IDA7CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiXG5BZHYgTGlicmFyeSBDb25maWd1cmF0aW9uIGFuZCBTdGF0aXN0aWNzIGZvciBBZHZhblN5cyBTQ1NJIEhvc3QgJWQ6XG4iLAorICAgIHNocC0+aG9zdF9ubyk7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIGlvcF9iYXNlIDB4JWx4LCBjYWJsZV9kZXRlY3Q6ICVYLCBlcnJfY29kZSAldVxuIiwKKyAgICAgICAgIHYtPmlvcF9iYXNlLAorICAgICAgICAgQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19TQ1NJX0NGRzEpICYgQ0FCTEVfREVURUNULAorICAgICAgICAgdi0+ZXJyX2NvZGUpOworICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBjaGlwX3ZlcnNpb24gJXUsIGxpYl92ZXJzaW9uIDB4JXgsIG1jb2RlX2RhdGUgMHgleCwgbWNvZGVfdmVyc2lvbiAweCV4XG4iLAorICAgICAgICBjLT5jaGlwX3ZlcnNpb24sIGMtPmxpYl92ZXJzaW9uLCBjLT5tY29kZV9kYXRlLCBjLT5tY29kZV92ZXJzaW9uKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBRdWV1aW5nIEVuYWJsZWQ6Iik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8CisgICAgICAgICAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJVg6JWMiLAorICAgICAgICAgICAgaSwgKHRhZ3FuZ19hYmxlICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA/ICdZJyA6ICdOJyk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgIH0KKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOworICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBRdWV1ZSBMaW1pdDoiKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKyAgICAgICAgaWYgKChjaGlwX3Njc2lfaWQgPT0gaSkgfHwKKyAgICAgICAgICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFkdlJlYWRCeXRlTHJhbShpb3BfYmFzZSwgQVNDX01DX05VTUJFUl9PRl9NQVhfQ01EICsgaSwgbHJhbWJ5dGUpOworCisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlWDolZCIsIGksIGxyYW1ieXRlKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIENvbW1hbmQgUGVuZGluZzoiKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKyAgICAgICAgaWYgKChjaGlwX3Njc2lfaWQgPT0gaSkgfHwKKyAgICAgICAgICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFkdlJlYWRCeXRlTHJhbShpb3BfYmFzZSwgQVNDX01DX05VTUJFUl9PRl9RVUVVRURfQ01EICsgaSwgbHJhbWJ5dGUpOworCisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlWDolZCIsIGksIGxyYW1ieXRlKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIHdkdHJfYWJsZSk7CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBXaWRlIEVuYWJsZWQ6Iik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8CisgICAgICAgICAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJVg6JWMiLAorICAgICAgICAgICAgaSwgKHdkdHJfYWJsZSAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPyAnWScgOiAnTicpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfRE9ORSwgd2R0cl9kb25lKTsKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIFRyYW5zZmVyIEJpdCBXaWR0aDoiKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKyAgICAgICAgaWYgKChjaGlwX3Njc2lfaWQgPT0gaSkgfHwKKyAgICAgICAgICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFVklDRV9IU0hLX0NGR19UQUJMRSArICgyICogaSksCisgICAgICAgICAgICBscmFtd29yZCk7CisKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOiVkIiwKKyAgICAgICAgICAgIGksIChscmFtd29yZCAmIDB4ODAwMCkgPyAxNiA6IDgpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKworICAgICAgICBpZiAoKHdkdHJfYWJsZSAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgJiYKKyAgICAgICAgICAgICh3ZHRyX2RvbmUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApIHsKKyAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIioiKTsKKyAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgICAgICAgICAgcmVuZWdvdGlhdGUgPSAxOworICAgICAgICB9CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIHNkdHJfYWJsZSk7CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBTeW5jaHJvbm91cyBFbmFibGVkOiIpOworICAgIEFTQ19QUlRfTkVYVCgpOworICAgIGZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgeworICAgICAgICBpZiAoKGNoaXBfc2NzaV9pZCA9PSBpKSB8fAorICAgICAgICAgICAgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOiVjIiwKKyAgICAgICAgICAgIGksIChzZHRyX2FibGUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0RPTkUsIHNkdHJfZG9uZSk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7CisKKyAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVWSUNFX0hTSEtfQ0ZHX1RBQkxFICsgKDIgKiBpKSwKKyAgICAgICAgICAgIGxyYW13b3JkKTsKKyAgICAgICAgbHJhbXdvcmQgJj0gfjB4ODAwMDsKKworICAgICAgICBpZiAoKGNoaXBfc2NzaV9pZCA9PSBpKSB8fAorICAgICAgICAgICAgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkgfHwKKyAgICAgICAgICAgICgoc2R0cl9hYmxlICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgICVYOiIsIGkpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKworICAgICAgICBpZiAoKGxyYW13b3JkICYgMHgxRikgPT0gMCkgLyogQ2hlY2sgZm9yIFJFUS9BQ0sgT2Zmc2V0IDAuICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBBc3luY2hyb25vdXMiKTsKKyAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIFRyYW5zZmVyIFBlcmlvZCBGYWN0b3I6ICIpOworICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICAgICAgICAgIGlmICgobHJhbXdvcmQgJiAweDFGMDApID09IDB4MTEwMCkgLyogODAgTWh6ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiOSAoODAuMCBNaHopLCIpOworICAgICAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgICAgICAgICAgfSBlbHNlIGlmICgobHJhbXdvcmQgJiAweDFGMDApID09IDB4MTAwMCkgLyogNDAgTWh6ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiMTAgKDQwLjAgTWh6KSwiKTsKKyAgICAgICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICAgICAgICAgIH0gZWxzZSAvKiAyMCBNaHogb3IgYmVsb3cuICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGVyaW9kID0gKCgobHJhbXdvcmQgPj4gOCkgKiAyNSkgKyA1MCkvNDsKKworICAgICAgICAgICAgICAgIGlmIChwZXJpb2QgPT0gMCkgLyogU2hvdWxkIG5ldmVyIGhhcHBlbi4gKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiVkICg/IE1oeiksICIpOworICAgICAgICAgICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlZCAoJWQuJWQgTWh6KSwiLAorICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kLCAyNTAvcGVyaW9kLCBBU0NfVEVOVEhTKDI1MCwgcGVyaW9kKSk7CisgICAgICAgICAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIFJFUS9BQ0sgT2Zmc2V0OiAlZCIsCisgICAgICAgICAgICAgICAgbHJhbXdvcmQgJiAweDFGKTsKKyAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChzZHRyX2RvbmUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApIHsKKyAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIipcbiIpOworICAgICAgICAgICAgcmVuZWdvdGlhdGUgPSAxOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisKKyAgICBpZiAocmVuZWdvdGlhdGUpCisgICAgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisgICAgICAgICAgICAiICogPSBSZS1uZWdvdGlhdGlvbiBwZW5kaW5nIGJlZm9yZSBuZXh0IGNvbW1hbmQuXG4iKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorCisgICAgcmV0dXJuIHRvdGxlbjsKK30KKworLyoKKyAqIGFzY19wcm9jX2NvcHkoKQorICoKKyAqIENvcHkgcHJvYyBpbmZvcm1hdGlvbiB0byBhIHJlYWQgYnVmZmVyIHRha2luZyBpbnRvIGFjY291bnQgdGhlIGN1cnJlbnQKKyAqIHJlYWQgb2Zmc2V0IGluIHRoZSBmaWxlIGFuZCB0aGUgcmVtYWluaW5nIHNwYWNlIGluIHRoZSByZWFkIGJ1ZmZlci4KKyAqLworU1RBVElDIGludAorYXNjX3Byb2NfY29weShvZmZfdCBhZHZvZmZzZXQsIG9mZl90IG9mZnNldCwgY2hhciAqY3VyYnVmLCBpbnQgbGVmdGxlbiwKKyAgICAgICAgICAgICAgY2hhciAqY3AsIGludCBjcGxlbikKK3sKKyAgICBpbnQgY250ID0gMDsKKworICAgIEFTQ19EQkczKDIsICJhc2NfcHJvY19jb3B5OiBvZmZzZXQgJWQsIGFkdm9mZnNldCAlZCwgY3BsZW4gJWRcbiIsCisgICAgICAgICAgICAodW5zaWduZWQpIG9mZnNldCwgKHVuc2lnbmVkKSBhZHZvZmZzZXQsIGNwbGVuKTsKKyAgICBpZiAob2Zmc2V0IDw9IGFkdm9mZnNldCkgeworICAgICAgICAvKiBSZWFkIG9mZnNldCBiZWxvdyBjdXJyZW50IG9mZnNldCwgY29weSBldmVyeXRoaW5nLiAqLworICAgICAgICBjbnQgPSBtaW4oY3BsZW4sIGxlZnRsZW4pOworICAgICAgICBBU0NfREJHMygyLCAiYXNjX3Byb2NfY29weTogY3VyYnVmIDB4JWx4LCBjcCAweCVseCwgY250ICVkXG4iLAorICAgICAgICAgICAgICAgICh1bG9uZykgY3VyYnVmLCAodWxvbmcpIGNwLCBjbnQpOworICAgICAgICBtZW1jcHkoY3VyYnVmLCBjcCwgY250KTsKKyAgICB9IGVsc2UgaWYgKG9mZnNldCA8IGFkdm9mZnNldCArIGNwbGVuKSB7CisgICAgICAgIC8qIFJlYWQgb2Zmc2V0IHdpdGhpbiBjdXJyZW50IHJhbmdlLCBwYXJ0aWFsIGNvcHkuICovCisgICAgICAgIGNudCA9IChhZHZvZmZzZXQgKyBjcGxlbikgLSBvZmZzZXQ7CisgICAgICAgIGNwID0gKGNwICsgY3BsZW4pIC0gY250OworICAgICAgICBjbnQgPSBtaW4oY250LCBsZWZ0bGVuKTsKKyAgICAgICAgQVNDX0RCRzMoMiwgImFzY19wcm9jX2NvcHk6IGN1cmJ1ZiAweCVseCwgY3AgMHglbHgsIGNudCAlZFxuIiwKKyAgICAgICAgICAgICAgICAodWxvbmcpIGN1cmJ1ZiwgKHVsb25nKSBjcCwgY250KTsKKyAgICAgICAgbWVtY3B5KGN1cmJ1ZiwgY3AsIGNudCk7CisgICAgfQorICAgIHJldHVybiBjbnQ7Cit9CisKKy8qCisgKiBhc2NfcHJ0X2xpbmUoKQorICoKKyAqIElmICdjcCcgaXMgTlVMTCBwcmludCB0byB0aGUgY29uc29sZSwgb3RoZXJ3aXNlIHByaW50IHRvIGEgYnVmZmVyLgorICoKKyAqIFJldHVybiAwIGlmIHByaW50aW5nIHRvIHRoZSBjb25zb2xlLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBudW1iZXIgb2YKKyAqIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlci4KKyAqCisgKiBOb3RlOiBJZiBhbnkgc2luZ2xlIGxpbmUgaXMgZ3JlYXRlciB0aGFuIEFTQ19QUlRMSU5FX1NJWkUgYnl0ZXMgdGhlIHN0YWNrCisgKiB3aWxsIGJlIGNvcnJ1cHRlZC4gJ3NbXScgaXMgZGVmaW5lZCB0byBiZSBBU0NfUFJUTElORV9TSVpFIGJ5dGVzLgorICovCitTVEFUSUMgaW50Cithc2NfcHJ0X2xpbmUoY2hhciAqYnVmLCBpbnQgYnVmbGVuLCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0ICAgICAgICBhcmdzOworICAgIGludCAgICAgICAgICAgIHJldDsKKyAgICBjaGFyICAgICAgICAgICBzW0FTQ19QUlRMSU5FX1NJWkVdOworCisgICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgICByZXQgPSB2c3ByaW50ZihzLCBmbXQsIGFyZ3MpOworICAgIEFTQ19BU1NFUlQocmV0IDwgQVNDX1BSVExJTkVfU0laRSk7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICh2b2lkKSBwcmludGsocyk7CisgICAgICAgIHJldCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gbWluKGJ1ZmxlbiwgcmV0KTsKKyAgICAgICAgbWVtY3B5KGJ1ZiwgcywgcmV0KTsKKyAgICB9CisgICAgdmFfZW5kKGFyZ3MpOworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworCisvKgorICogLS0tIEZ1bmN0aW9ucyBSZXF1aXJlZCBieSB0aGUgQXNjIExpYnJhcnkKKyAqLworCisvKgorICogRGVsYXkgZm9yICduJyBtaWxsaXNlY29uZHMuIERvbid0IHVzZSB0aGUgJ2ppZmZpZXMnCisgKiBnbG9iYWwgdmFyaWFibGUgd2hpY2ggaXMgaW5jcmVtZW50ZWQgb25jZSBldmVyeSA1IG1zCisgKiBmcm9tIGEgdGltZXIgaW50ZXJydXB0LCBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlCisgKiBjYWxsZWQgd2hlbiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4KKyAqLworU1RBVElDIHZvaWQKK0R2Y1NsZWVwTWlsbGlTZWNvbmQoQURWX0RDTlQgbikKK3sKKyAgICBBU0NfREJHMSg0LCAiRHZjU2xlZXBNaWxsaVNlY29uZDogJWx1XG4iLCAodWxvbmcpIG4pOworICAgIG1kZWxheShuKTsKK30KKworLyoKKyAqIEN1cnJlbnRseSBhbmQgaW5saW5lIG5vb3AgYnV0IGxlYXZlIGFzIGEgcGxhY2Vob2xkZXIuCisgKiBMZWF2ZSBEdmNFbnRlckNyaXRpY2FsKCkgYXMgYSBub29wIHBsYWNlaG9sZGVyLgorICovCitTVEFUSUMgaW5saW5lIHVsb25nCitEdmNFbnRlckNyaXRpY2FsKHZvaWQpCit7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDcml0aWNhbCBzZWN0aW9ucyBhcmUgYWxsIHByb3RlY3RlZCBieSB0aGUgYm9hcmQgc3BpbmxvY2suCisgKiBMZWF2ZSBEdmNMZWF2ZUNyaXRpY2FsKCkgYXMgYSBub29wIHBsYWNlaG9sZGVyLgorICovCitTVEFUSUMgaW5saW5lIHZvaWQKK0R2Y0xlYXZlQ3JpdGljYWwodWxvbmcgZmxhZ3MpCit7CisgICAgcmV0dXJuOworfQorCisvKgorICogdm9pZAorICogRHZjUHV0U2NzaVEoUG9ydEFkZHIgaW9wX2Jhc2UsIHVzaG9ydCBzX2FkZHIsIHVjaGFyICpvdXRidWYsIGludCB3b3JkcykKKyAqCisgKiBDYWxsaW5nL0V4aXQgU3RhdGU6CisgKiAgICBub25lCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgT3V0cHV0IGFuIEFTQ19TQ1NJX1Egc3RydWN0dXJlIHRvIHRoZSBjaGlwCisgKi8KK1NUQVRJQyB2b2lkCitEdmNQdXRTY3NpUShQb3J0QWRkciBpb3BfYmFzZSwgdXNob3J0IHNfYWRkciwgdWNoYXIgKm91dGJ1ZiwgaW50IHdvcmRzKQoreworICAgIGludCAgICBpOworCisgICAgQVNDX0RCR19QUlRfSEVYKDIsICJEdmNQdXRTY3NpUSIsIG91dGJ1ZiwgMiAqIHdvcmRzKTsKKyAgICBBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIHNfYWRkcik7CisgICAgZm9yIChpID0gMDsgaSA8IDIgKiB3b3JkczsgaSArPSAyKSB7CisgICAgICAgIGlmIChpID09IDQgfHwgaSA9PSAyMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHcoaW9wX2Jhc2UgKyBJT1BfUkFNX0RBVEEsCisgICAgICAgICAgICAoKHVzaG9ydCkgb3V0YnVmW2kgKyAxXSA8PCA4KSB8IG91dGJ1ZltpXSk7CisgICAgfQorfQorCisvKgorICogdm9pZAorICogRHZjR2V0UWluZm8oUG9ydEFkZHIgaW9wX2Jhc2UsIHVzaG9ydCBzX2FkZHIsIHVjaGFyICppbmJ1ZiwgaW50IHdvcmRzKQorICoKKyAqIENhbGxpbmcvRXhpdCBTdGF0ZToKKyAqICAgIG5vbmUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgICBJbnB1dCBhbiBBU0NfUURPTkVfSU5GTyBzdHJ1Y3R1cmUgZnJvbSB0aGUgY2hpcAorICovCitTVEFUSUMgdm9pZAorRHZjR2V0UWluZm8oUG9ydEFkZHIgaW9wX2Jhc2UsIHVzaG9ydCBzX2FkZHIsIHVjaGFyICppbmJ1ZiwgaW50IHdvcmRzKQoreworICAgIGludCAgICBpOworICAgIHVzaG9ydCB3b3JkOworCisgICAgQXNjU2V0Q2hpcExyYW1BZGRyKGlvcF9iYXNlLCBzX2FkZHIpOworICAgIGZvciAoaSA9IDA7IGkgPCAyICogd29yZHM7IGkgKz0gMikgeworICAgICAgICBpZiAoaSA9PSAxMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgd29yZCA9IGlucHcoaW9wX2Jhc2UgKyBJT1BfUkFNX0RBVEEpOworICAgICAgICBpbmJ1ZltpXSA9IHdvcmQgJiAweGZmOworICAgICAgICBpbmJ1ZltpICsgMV0gPSAod29yZCA+PiA4KSAmIDB4ZmY7CisgICAgfQorICAgIEFTQ19EQkdfUFJUX0hFWCgyLCAiRHZjR2V0UWluZm8iLCBpbmJ1ZiwgMiAqIHdvcmRzKTsKK30KKworLyoKKyAqIFJlYWQgYSBQQ0kgY29uZmlndXJhdGlvbiBieXRlLgorICovCitTVEFUSUMgdWNoYXIgX19pbml0CitEdmNSZWFkUENJQ29uZmlnQnl0ZSgKKyAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCisgICAgICAgIHVzaG9ydCBvZmZzZXQpCit7CisjaWZkZWYgQ09ORklHX1BDSQorICAgIHVjaGFyIGJ5dGVfZGF0YTsKKyAgICBwY2lfcmVhZF9jb25maWdfYnl0ZSh0b19wY2lfZGV2KGFzY19kdmMtPmNmZy0+ZGV2KSwgb2Zmc2V0LCAmYnl0ZV9kYXRhKTsKKyAgICByZXR1cm4gYnl0ZV9kYXRhOworI2Vsc2UgLyogIWRlZmluZWQoQ09ORklHX1BDSSkgKi8KKyAgICByZXR1cm4gMDsKKyNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfUENJKSAqLworfQorCisvKgorICogV3JpdGUgYSBQQ0kgY29uZmlndXJhdGlvbiBieXRlLgorICovCitTVEFUSUMgdm9pZCBfX2luaXQKK0R2Y1dyaXRlUENJQ29uZmlnQnl0ZSgKKyAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCisgICAgICAgIHVzaG9ydCBvZmZzZXQsCisgICAgICAgIHVjaGFyICBieXRlX2RhdGEpCit7CisjaWZkZWYgQ09ORklHX1BDSQorICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZSh0b19wY2lfZGV2KGFzY19kdmMtPmNmZy0+ZGV2KSwgb2Zmc2V0LCBieXRlX2RhdGEpOworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KK30KKworLyoKKyAqIFJldHVybiB0aGUgQklPUyBhZGRyZXNzIG9mIHRoZSBhZGFwdGVyIGF0IHRoZSBzcGVjaWZpZWQKKyAqIEkvTyBwb3J0IGFuZCB3aXRoIHRoZSBzcGVjaWZpZWQgYnVzIHR5cGUuCisgKi8KK1NUQVRJQyB1c2hvcnQgX19pbml0CitBc2NHZXRDaGlwQmlvc0FkZHJlc3MoCisgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICB1c2hvcnQgYnVzX3R5cGUpCit7CisgICAgdXNob3J0ICBjZmdfbHN3OworICAgIHVzaG9ydCAgYmlvc19hZGRyOworCisgICAgLyoKKyAgICAgKiBUaGUgUENJIEJJT1MgaXMgcmUtbG9jYXRlZCBieSB0aGUgbW90aGVyYm9hcmQgQklPUy4gQmVjYXVzZQorICAgICAqIG9mIHRoaXMgdGhlIGRyaXZlciBjYW4gbm90IGRldGVybWluZSB3aGVyZSBhIFBDSSBCSU9TIGlzCisgICAgICogbG9hZGVkIGFuZCBleGVjdXRlcy4KKyAgICAgKi8KKyAgICBpZiAoYnVzX3R5cGUgJiBBU0NfSVNfUENJKQorICAgIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKworI2lmZGVmIENPTkZJR19JU0EKKyAgICBpZigoYnVzX3R5cGUgJiBBU0NfSVNfRUlTQSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNmZ19sc3cgPSBBc2NHZXRFaXNhQ2hpcENmZyhpb3BfYmFzZSk7CisgICAgICAgIGNmZ19sc3cgJj0gMHgwMDBGOworICAgICAgICBiaW9zX2FkZHIgPSAodXNob3J0KShBU0NfQklPU19NSU5fQUREUiAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2ZnX2xzdyAqIEFTQ19CSU9TX0JBTktfU0laRSkpOworICAgICAgICByZXR1cm4oYmlvc19hZGRyKTsKKyAgICB9LyogaWYgKi8KKyNlbmRpZiAvKiBDT05GSUdfSVNBICovCisKKyAgICBjZmdfbHN3ID0gQXNjR2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSk7CisKKyAgICAvKgorICAgICogIElTQSBQblAgdXNlcyB0aGUgdG9wIGJpdCBhcyB0aGUgMzJLIEJJT1MgZmxhZworICAgICovCisgICAgaWYgKGJ1c190eXBlID09IEFTQ19JU19JU0FQTlApCisgICAgeworICAgICAgICBjZmdfbHN3ICY9IDB4N0ZGRjsKKyAgICB9LyogaWYgKi8KKworICAgIGJpb3NfYWRkciA9ICh1c2hvcnQpKCgoY2ZnX2xzdyA+PiAxMikgKiBBU0NfQklPU19CQU5LX1NJWkUpICsKKyAgICAgICAgICAgIEFTQ19CSU9TX01JTl9BRERSKTsKKyAgICByZXR1cm4oYmlvc19hZGRyKTsKK30KKworCisvKgorICogLS0tIEZ1bmN0aW9ucyBSZXF1aXJlZCBieSB0aGUgQWR2IExpYnJhcnkKKyAqLworCisvKgorICogRHZjR2V0UGh5QWRkcigpCisgKgorICogUmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mICd2YWRkcicgYW5kIHNldCAnKmxlbnAnIHRvIHRoZQorICogbnVtYmVyIG9mIHBoeXNpY2FsbHkgY29udGlndW91cyBieXRlcyB0aGF0IGZvbGxvdyAndmFkZHInLgorICogJ2ZsYWcnIGluZGljYXRlcyB0aGUgdHlwZSBvZiBzdHJ1Y3R1cmUgd2hvc2UgcGh5c2ljYWwgYWRkcmVzcworICogaXMgYmVpbmcgdHJhbnNsYXRlZC4KKyAqCisgKiBOb3RlOiBCZWNhdXNlIExpbnV4IGN1cnJlbnRseSBkb2Vzbid0IHBhZ2UgdGhlIGtlcm5lbCBhbmQgYWxsCisgKiBrZXJuZWwgYnVmZmVycyBhcmUgcGh5c2ljYWxseSBjb250aWd1b3VzLCBsZWF2ZSAnKmxlbnAnIHVuY2hhbmdlZC4KKyAqLworQURWX1BBRERSCitEdmNHZXRQaHlBZGRyKEFEVl9EVkNfVkFSICphc2NfZHZjLCBBRFZfU0NTSV9SRVFfUSAqc2NzaXEsCisgICAgICAgIHVjaGFyICp2YWRkciwgQURWX1NEQ05UICpsZW5wLCBpbnQgZmxhZykKK3sKKyAgICBBRFZfUEFERFIgICAgICAgICAgIHBhZGRyOworCisgICAgcGFkZHIgPSB2aXJ0X3RvX2J1cyh2YWRkcik7CisKKyAgICBBU0NfREJHNCg0LAorICAgICAgICAiRHZjR2V0UGh5QWRkcjogdmFkZHIgMHglbHgsIGxlbnAgMHglbHggKmxlbnAgJWx1LCBwYWRkciAweCVseFxuIiwKKyAgICAgICAgKHVsb25nKSB2YWRkciwgKHVsb25nKSBsZW5wLCAodWxvbmcpICooKHVsb25nICopIGxlbnApLCAodWxvbmcpIHBhZGRyKTsKKworICAgIHJldHVybiBwYWRkcjsKK30KKworLyoKKyAqIFJlYWQgYSBQQ0kgY29uZmlndXJhdGlvbiBieXRlLgorICovCitTVEFUSUMgdWNoYXIgX19pbml0CitEdmNBZHZSZWFkUENJQ29uZmlnQnl0ZSgKKyAgICAgICAgQURWX0RWQ19WQVIgKmFzY19kdmMsCisgICAgICAgIHVzaG9ydCBvZmZzZXQpCit7CisjaWZkZWYgQ09ORklHX1BDSQorICAgIHVjaGFyIGJ5dGVfZGF0YTsKKyAgICBwY2lfcmVhZF9jb25maWdfYnl0ZSh0b19wY2lfZGV2KGFzY19kdmMtPmNmZy0+ZGV2KSwgb2Zmc2V0LCAmYnl0ZV9kYXRhKTsKKyAgICByZXR1cm4gYnl0ZV9kYXRhOworI2Vsc2UgLyogQ09ORklHX1BDSSAqLworICAgIHJldHVybiAwOworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KK30KKworLyoKKyAqIFdyaXRlIGEgUENJIGNvbmZpZ3VyYXRpb24gYnl0ZS4KKyAqLworU1RBVElDIHZvaWQgX19pbml0CitEdmNBZHZXcml0ZVBDSUNvbmZpZ0J5dGUoCisgICAgICAgIEFEVl9EVkNfVkFSICphc2NfZHZjLAorICAgICAgICB1c2hvcnQgb2Zmc2V0LAorICAgICAgICB1Y2hhciAgYnl0ZV9kYXRhKQoreworI2lmZGVmIENPTkZJR19QQ0kKKyAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUodG9fcGNpX2Rldihhc2NfZHZjLT5jZmctPmRldiksIG9mZnNldCwgYnl0ZV9kYXRhKTsKKyNlbHNlIC8qIENPTkZJR19QQ0kgKi8KKyAgICByZXR1cm47CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworfQorCisvKgorICogLS0tIFRyYWNpbmcgYW5kIERlYnVnZ2luZyBGdW5jdGlvbnMKKyAqLworCisjaWZkZWYgQURWQU5TWVNfU1RBVFMKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworLyoKKyAqIGFzY19wcnRfYm9hcmRfc3RhdHMoKQorICoKKyAqIE5vdGU6IG5vIHNpbmdsZSBsaW5lIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gQVNDX1BSVExJTkVfU0laRSwKKyAqIGNmLiBhc2NfcHJ0X2xpbmUoKS4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZCBpbnRvICdjcCcuIE5vIG1vcmUgdGhhbgorICogJ2NwbGVuJyBjaGFyYWN0ZXJzIHdpbGwgYmUgY29waWVkIHRvICdjcCcuCisgKi8KK1NUQVRJQyBpbnQKK2FzY19wcnRfYm9hcmRfc3RhdHMoc3RydWN0IFNjc2lfSG9zdCAqc2hwLCBjaGFyICpjcCwgaW50IGNwbGVuKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgbGVmdGxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIHRvdGxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIGxlbjsKKyAgICBzdHJ1Y3QgYXNjX3N0YXRzICAgICAgICpzOworICAgIGFzY19ib2FyZF90ICAgICAgICAgICAgKmJvYXJkcDsKKworICAgIGxlZnRsZW4gPSBjcGxlbjsKKyAgICB0b3RsZW4gPSBsZW4gPSAwOworCisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworICAgIHMgPSAmYm9hcmRwLT5hc2Nfc3RhdHM7CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiXG5MaW51eCBEcml2ZXIgU3RhdGlzdGljcyBmb3IgQWR2YW5TeXMgU0NTSSBIb3N0ICVkOlxuIiwgc2hwLT5ob3N0X25vKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgcXVldWVjb21tYW5kICVsdSwgcmVzZXQgJWx1LCBiaW9zcGFyYW0gJWx1LCBpbnRlcnJ1cHQgJWx1XG4iLAorICAgICAgICBzLT5xdWV1ZWNvbW1hbmQsIHMtPnJlc2V0LCBzLT5iaW9zcGFyYW0sIHMtPmludGVycnVwdCk7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIGNhbGxiYWNrICVsdSwgZG9uZSAlbHUsIGJ1aWxkX2Vycm9yICVsdSwgYnVpbGRfbm9yZXEgJWx1LCBidWlsZF9ub3NnICVsdVxuIiwKKyAgICAgICAgcy0+Y2FsbGJhY2ssIHMtPmRvbmUsIHMtPmJ1aWxkX2Vycm9yLCBzLT5hZHZfYnVpbGRfbm9yZXEsCisgICAgICAgIHMtPmFkdl9idWlsZF9ub3NnKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgZXhlX25vZXJyb3IgJWx1LCBleGVfYnVzeSAlbHUsIGV4ZV9lcnJvciAlbHUsIGV4ZV91bmtub3duICVsdVxuIiwKKyAgICAgICAgcy0+ZXhlX25vZXJyb3IsIHMtPmV4ZV9idXN5LCBzLT5leGVfZXJyb3IsIHMtPmV4ZV91bmtub3duKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIC8qCisgICAgICogRGlzcGxheSBkYXRhIHRyYW5zZmVyIHN0YXRpc3RpY3MuCisgICAgICovCisgICAgaWYgKHMtPmNvbnRfY250ID4gMCkgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgY29udF9jbnQgJWx1LCAiLCBzLT5jb250X2NudCk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgImNvbnRfeGZlciAlbHUuJTAxbHUga2IgIiwKKyAgICAgICAgICAgICAgICAgICAgcy0+Y29udF94ZmVyLzIsCisgICAgICAgICAgICAgICAgICAgIEFTQ19URU5USFMocy0+Y29udF94ZmVyLCAyKSk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgICAgIC8qIENvbnRpZ3VvdXMgdHJhbnNmZXIgYXZlcmFnZSBzaXplICovCisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgImF2Z194ZmVyICVsdS4lMDFsdSBrYlxuIiwKKyAgICAgICAgICAgICAgICAgICAgKHMtPmNvbnRfeGZlci8yKS9zLT5jb250X2NudCwKKyAgICAgICAgICAgICAgICAgICAgQVNDX1RFTlRIUygocy0+Y29udF94ZmVyLzIpLCBzLT5jb250X2NudCkpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisKKyAgICBpZiAocy0+c2dfY250ID4gMCkgeworCisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBzZ19jbnQgJWx1LCBzZ19lbGVtICVsdSwgIiwKKyAgICAgICAgICAgICAgICAgICAgcy0+c2dfY250LCBzLT5zZ19lbGVtKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAic2dfeGZlciAlbHUuJTAxbHUga2JcbiIsCisgICAgICAgICAgICAgICAgICAgIHMtPnNnX3hmZXIvMiwKKyAgICAgICAgICAgICAgICAgICAgQVNDX1RFTlRIUyhzLT5zZ194ZmVyLCAyKSk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgICAgIC8qIFNjYXR0ZXIgZ2F0aGVyIHRyYW5zZmVyIHN0YXRpc3RpY3MgKi8KKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIGF2Z19udW1fZWxlbSAlbHUuJTAxbHUsICIsCisgICAgICAgICAgICAgICAgICAgIHMtPnNnX2VsZW0vcy0+c2dfY250LAorICAgICAgICAgICAgICAgICAgICBBU0NfVEVOVEhTKHMtPnNnX2VsZW0sIHMtPnNnX2NudCkpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJhdmdfZWxlbV9zaXplICVsdS4lMDFsdSBrYiwgIiwKKyAgICAgICAgICAgICAgICAgICAgKHMtPnNnX3hmZXIvMikvcy0+c2dfZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgQVNDX1RFTlRIUygocy0+c2dfeGZlci8yKSwgcy0+c2dfZWxlbSkpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJhdmdfeGZlcl9zaXplICVsdS4lMDFsdSBrYlxuIiwKKyAgICAgICAgICAgICAgICAgICAgKHMtPnNnX3hmZXIvMikvcy0+c2dfY250LAorICAgICAgICAgICAgICAgICAgICBBU0NfVEVOVEhTKChzLT5zZ194ZmVyLzIpLCBzLT5zZ19jbnQpKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEaXNwbGF5IHJlcXVlc3QgcXVldWluZyBzdGF0aXN0aWNzLgorICAgICAqLworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgQWN0aXZlIGFuZCBXYWl0aW5nIFJlcXVlc3QgUXVldWVzIChUaW1lIFVuaXQ6ICVkIEhaKTpcbiIsIEhaKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworCisgICAgIHJldHVybiB0b3RsZW47Cit9CisKKy8qCisgKiBhc2NfcHJ0X3RhcmdldF9zdGF0cygpCisgKgorICogTm90ZTogbm8gc2luZ2xlIGxpbmUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBBU0NfUFJUTElORV9TSVpFLAorICogY2YuIGFzY19wcnRfbGluZSgpLgorICoKKyAqIFRoaXMgaXMgc2VwYXJhdGVkIGZyb20gYXNjX3BydF9ib2FyZF9zdGF0cyBiZWNhdXNlIGEgZnVsbCBzZXQKKyAqIG9mIHRhcmdldHMgd2lsbCBvdmVyZmxvdyBBU0NfUFJUQlVGX1NJWkUuCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb3BpZWQgaW50byAnY3AnLiBObyBtb3JlIHRoYW4KKyAqICdjcGxlbicgY2hhcmFjdGVycyB3aWxsIGJlIGNvcGllZCB0byAnY3AnLgorICovCitTVEFUSUMgaW50Cithc2NfcHJ0X3RhcmdldF9zdGF0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHAsIGludCB0Z3RfaWQsIGNoYXIgKmNwLCBpbnQgY3BsZW4pCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICBsZWZ0bGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgdG90bGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgbGVuOworICAgIHN0cnVjdCBhc2Nfc3RhdHMgICAgICAgKnM7CisgICAgdXNob3J0ICAgICAgICAgICAgICAgICBjaGlwX3Njc2lfaWQ7CisgICAgYXNjX2JvYXJkX3QgICAgICAgICAgICAqYm9hcmRwOworICAgIGFzY19xdWV1ZV90ICAgICAgICAgICAgKmFjdGl2ZTsKKyAgICBhc2NfcXVldWVfdCAgICAgICAgICAgICp3YWl0aW5nOworCisgICAgbGVmdGxlbiA9IGNwbGVuOworICAgIHRvdGxlbiA9IGxlbiA9IDA7CisKKyAgICBib2FyZHAgPSBBU0NfQk9BUkRQKHNocCk7CisgICAgcyA9ICZib2FyZHAtPmFzY19zdGF0czsKKworICAgIGFjdGl2ZSA9ICZBU0NfQk9BUkRQKHNocCktPmFjdGl2ZTsKKyAgICB3YWl0aW5nID0gJkFTQ19CT0FSRFAoc2hwKS0+d2FpdGluZzsKKworICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgY2hpcF9zY3NpX2lkID0gYm9hcmRwLT5kdmNfY2ZnLmFzY19kdmNfY2ZnLmNoaXBfc2NzaV9pZDsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGlwX3Njc2lfaWQgPSBib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXIuY2hpcF9zY3NpX2lkOworICAgIH0KKworICAgIGlmICgoY2hpcF9zY3NpX2lkID09IHRndF9pZCkgfHwKKyAgICAgICAgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyh0Z3RfaWQpKSA9PSAwKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIGlmIChhY3RpdmUtPnFfdG90X2NudFt0Z3RfaWRdID4gMCB8fCB3YWl0aW5nLT5xX3RvdF9jbnRbdGd0X2lkXSA+IDApIHsKKyAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiB0YXJnZXQgJWRcbiIsIHRndF9pZCk7CisgICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKKworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiAgIGFjdGl2ZTogY250IFtjdXIgJWQsIG1heCAlZCwgdG90ICV1XSwgdGltZSBbbWluICVkLCBtYXggJWQsIGF2ZyAlbHUuJTAxbHVdXG4iLAorICAgICAgICAgICAgICAgIGFjdGl2ZS0+cV9jdXJfY250W3RndF9pZF0sIGFjdGl2ZS0+cV9tYXhfY250W3RndF9pZF0sCisgICAgICAgICAgICAgICAgYWN0aXZlLT5xX3RvdF9jbnRbdGd0X2lkXSwKKyAgICAgICAgICAgICAgICBhY3RpdmUtPnFfbWluX3RpbVt0Z3RfaWRdLCBhY3RpdmUtPnFfbWF4X3RpbVt0Z3RfaWRdLAorICAgICAgICAgICAgICAgIChhY3RpdmUtPnFfdG90X2NudFt0Z3RfaWRdID09IDApID8gMCA6CisgICAgICAgICAgICAgICAgKGFjdGl2ZS0+cV90b3RfdGltW3RndF9pZF0vYWN0aXZlLT5xX3RvdF9jbnRbdGd0X2lkXSksCisgICAgICAgICAgICAgICAgKGFjdGl2ZS0+cV90b3RfY250W3RndF9pZF0gPT0gMCkgPyAwIDoKKyAgICAgICAgICAgICAgICBBU0NfVEVOVEhTKGFjdGl2ZS0+cV90b3RfdGltW3RndF9pZF0sCisgICAgICAgICAgICAgICAgYWN0aXZlLT5xX3RvdF9jbnRbdGd0X2lkXSkpOworICAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiAgIHdhaXRpbmc6IGNudCBbY3VyICVkLCBtYXggJWQsIHRvdCAldV0sIHRpbWUgW21pbiAldSwgbWF4ICV1LCBhdmcgJWx1LiUwMWx1XVxuIiwKKyAgICAgICAgICAgICAgICB3YWl0aW5nLT5xX2N1cl9jbnRbdGd0X2lkXSwgd2FpdGluZy0+cV9tYXhfY250W3RndF9pZF0sCisgICAgICAgICAgICAgICAgd2FpdGluZy0+cV90b3RfY250W3RndF9pZF0sCisgICAgICAgICAgICAgICAgd2FpdGluZy0+cV9taW5fdGltW3RndF9pZF0sIHdhaXRpbmctPnFfbWF4X3RpbVt0Z3RfaWRdLAorICAgICAgICAgICAgICAgICh3YWl0aW5nLT5xX3RvdF9jbnRbdGd0X2lkXSA9PSAwKSA/IDAgOgorICAgICAgICAgICAgICAgICh3YWl0aW5nLT5xX3RvdF90aW1bdGd0X2lkXS93YWl0aW5nLT5xX3RvdF9jbnRbdGd0X2lkXSksCisgICAgICAgICAgICAgICAgKHdhaXRpbmctPnFfdG90X2NudFt0Z3RfaWRdID09IDApID8gMCA6CisgICAgICAgICAgICAgICAgQVNDX1RFTlRIUyh3YWl0aW5nLT5xX3RvdF90aW1bdGd0X2lkXSwKKyAgICAgICAgICAgICAgICB3YWl0aW5nLT5xX3RvdF9jbnRbdGd0X2lkXSkpOworICAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgICAgICB9CisgICAgfSB3aGlsZSAoMCk7CisKKyAgICAgcmV0dXJuIHRvdGxlbjsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworI2VuZGlmIC8qIEFEVkFOU1lTX1NUQVRTICovCisKKyNpZmRlZiBBRFZBTlNZU19ERUJVRworLyoKKyAqIGFzY19wcnRfc2NzaV9ob3N0KCkKKyAqLworU1RBVElDIHZvaWQKK2FzY19wcnRfc2NzaV9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKnMpCit7CisgICAgYXNjX2JvYXJkX3QgICAgICAgICAqYm9hcmRwOworCisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzKTsKKworICAgIHByaW50aygiU2NzaV9Ib3N0IGF0IGFkZHIgMHglbHhcbiIsICh1bG9uZykgcyk7CisgICAgcHJpbnRrKAorIiBob3N0X2J1c3kgJXUsIGhvc3Rfbm8gJWQsIGxhc3RfcmVzZXQgJWQsXG4iLAorICAgICAgICBzLT5ob3N0X2J1c3ksIHMtPmhvc3Rfbm8sCisgICAgICAgICh1bnNpZ25lZCkgcy0+bGFzdF9yZXNldCk7CisKKyAgICBwcmludGsoCisiIGJhc2UgMHglbHgsIGlvX3BvcnQgMHglbHgsIG5faW9fcG9ydCAldSwgaXJxIDB4JXgsXG4iLAorICAgICAgICAodWxvbmcpIHMtPmJhc2UsICh1bG9uZykgcy0+aW9fcG9ydCwgcy0+bl9pb19wb3J0LCBzLT5pcnEpOworCisgICAgcHJpbnRrKAorIiBkbWFfY2hhbm5lbCAlZCwgdGhpc19pZCAlZCwgY2FuX3F1ZXVlICVkLFxuIiwKKyAgICAgICAgcy0+ZG1hX2NoYW5uZWwsIHMtPnRoaXNfaWQsIHMtPmNhbl9xdWV1ZSk7CisKKyAgICBwcmludGsoCisiIGNtZF9wZXJfbHVuICVkLCBzZ190YWJsZXNpemUgJWQsIHVuY2hlY2tlZF9pc2FfZG1hICVkXG4iLAorICAgICAgICBzLT5jbWRfcGVyX2x1biwgcy0+c2dfdGFibGVzaXplLCBzLT51bmNoZWNrZWRfaXNhX2RtYSk7CisKKyAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisgICAgICAgIGFzY19wcnRfYXNjX2R2Y192YXIoJkFTQ19CT0FSRFAocyktPmR2Y192YXIuYXNjX2R2Y192YXIpOworICAgICAgICBhc2NfcHJ0X2FzY19kdmNfY2ZnKCZBU0NfQk9BUkRQKHMpLT5kdmNfY2ZnLmFzY19kdmNfY2ZnKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhc2NfcHJ0X2Fkdl9kdmNfdmFyKCZBU0NfQk9BUkRQKHMpLT5kdmNfdmFyLmFkdl9kdmNfdmFyKTsKKyAgICAgICAgYXNjX3BydF9hZHZfZHZjX2NmZygmQVNDX0JPQVJEUChzKS0+ZHZjX2NmZy5hZHZfZHZjX2NmZyk7CisgICAgfQorfQorCisvKgorICogYXNjX3BydF9zY3NpX2NtbmQoKQorICovCitTVEFUSUMgdm9pZAorYXNjX3BydF9zY3NpX2NtbmQoc3RydWN0IHNjc2lfY21uZCAqcykKK3sKKyAgICBwcmludGsoInN0cnVjdCBzY3NpX2NtbmQgYXQgYWRkciAweCVseFxuIiwgKHVsb25nKSBzKTsKKworICAgIHByaW50aygKKyIgaG9zdCAweCVseCwgZGV2aWNlIDB4JWx4LCB0YXJnZXQgJXUsIGx1biAldSwgY2hhbm5lbCAldSxcbiIsCisgICAgICAgICh1bG9uZykgcy0+ZGV2aWNlLT5ob3N0LCAodWxvbmcpIHMtPmRldmljZSwgcy0+ZGV2aWNlLT5pZCwgcy0+ZGV2aWNlLT5sdW4sCisgICAgICAgIHMtPmRldmljZS0+Y2hhbm5lbCk7CisKKyAgICBhc2NfcHJ0X2hleCgiIENEQiIsIHMtPmNtbmQsIHMtPmNtZF9sZW4pOworCisgICAgcHJpbnRrICgKKyJzY19kYXRhX2RpcmVjdGlvbiAldSwgcmVzaWQgJWRcbiIsCisgICAgICAgIHMtPnNjX2RhdGFfZGlyZWN0aW9uLCBzLT5yZXNpZCk7CisKKyAgICBwcmludGsoCisiIHVzZV9zZyAldSwgc2dsaXN0X2xlbiAldSwgYWJvcnRfcmVhc29uIDB4JXhcbiIsCisgICAgICAgIHMtPnVzZV9zZywgcy0+c2dsaXN0X2xlbiwgcy0+YWJvcnRfcmVhc29uKTsKKworICAgIHByaW50aygKKyIgc2VyaWFsX251bWJlciAweCV4LCBzZXJpYWxfbnVtYmVyX2F0X3RpbWVvdXQgMHgleCwgcmV0cmllcyAlZCwgYWxsb3dlZCAlZFxuIiwKKyAgICAgICAgKHVuc2lnbmVkKSBzLT5zZXJpYWxfbnVtYmVyLCAodW5zaWduZWQpIHMtPnNlcmlhbF9udW1iZXJfYXRfdGltZW91dCwKKyAgICAgICAgIHMtPnJldHJpZXMsIHMtPmFsbG93ZWQpOworCisgICAgcHJpbnRrKAorIiB0aW1lb3V0X3Blcl9jb21tYW5kICVkLCB0aW1lb3V0X3RvdGFsICVkLCB0aW1lb3V0ICVkXG4iLAorICAgICAgICBzLT50aW1lb3V0X3Blcl9jb21tYW5kLCBzLT50aW1lb3V0X3RvdGFsLCBzLT50aW1lb3V0KTsKKworICAgIHByaW50aygiIGludGVybmFsX3RpbWVvdXQgJXVcbiIsIHMtPmludGVybmFsX3RpbWVvdXQpOworCisgICAgcHJpbnRrKAorIiBzY3NpX2RvbmUgMHglbHgsIGRvbmUgMHglbHgsIGhvc3Rfc2NyaWJibGUgMHglbHgsIHJlc3VsdCAweCV4XG4iLAorICAgICAgICAodWxvbmcpIHMtPnNjc2lfZG9uZSwgKHVsb25nKSBzLT5kb25lLAorICAgICAgICAodWxvbmcpIHMtPmhvc3Rfc2NyaWJibGUsIHMtPnJlc3VsdCk7CisKKyAgICBwcmludGsoCisiIHRhZyAldSwgcGlkICV1XG4iLAorICAgICAgICAodW5zaWduZWQpIHMtPnRhZywgKHVuc2lnbmVkKSBzLT5waWQpOworfQorCisvKgorICogYXNjX3BydF9hc2NfZHZjX3ZhcigpCisgKi8KK1NUQVRJQyB2b2lkCithc2NfcHJ0X2FzY19kdmNfdmFyKEFTQ19EVkNfVkFSICpoKQoreworICAgIHByaW50aygiQVNDX0RWQ19WQVIgYXQgYWRkciAweCVseFxuIiwgKHVsb25nKSBoKTsKKworICAgIHByaW50aygKKyIgaW9wX2Jhc2UgMHgleCwgZXJyX2NvZGUgMHgleCwgZHZjX2NudGwgMHgleCwgYnVnX2ZpeF9jbnRsICVkLFxuIiwKKyAgICAgICAgaC0+aW9wX2Jhc2UsIGgtPmVycl9jb2RlLCBoLT5kdmNfY250bCwgaC0+YnVnX2ZpeF9jbnRsKTsKKworICAgIHByaW50aygKKyIgYnVzX3R5cGUgJWQsIGlzcl9jYWxsYmFjayAweCVseCwgZXhlX2NhbGxiYWNrIDB4JWx4LCBpbml0X3NkdHIgMHgleCxcbiIsCisgICAgICAgIGgtPmJ1c190eXBlLCAodWxvbmcpIGgtPmlzcl9jYWxsYmFjaywgKHVsb25nKSBoLT5leGVfY2FsbGJhY2ssCisgICAgICAgICh1bnNpZ25lZCkgaC0+aW5pdF9zZHRyKTsKKworICAgIHByaW50aygKKyIgc2R0cl9kb25lIDB4JXgsIHVzZV90YWdnZWRfcW5nIDB4JXgsIHVuaXRfbm90X3JlYWR5IDB4JXgsIGNoaXBfbm8gMHgleCxcbiIsCisgICAgICAgICh1bnNpZ25lZCkgaC0+c2R0cl9kb25lLCAodW5zaWduZWQpIGgtPnVzZV90YWdnZWRfcW5nLAorICAgICAgICAodW5zaWduZWQpIGgtPnVuaXRfbm90X3JlYWR5LCAodW5zaWduZWQpIGgtPmNoaXBfbm8pOworCisgICAgcHJpbnRrKAorIiBxdWV1ZV9mdWxsX29yX2J1c3kgMHgleCwgc3RhcnRfbW90b3IgMHgleCwgc2NzaV9yZXNldF93YWl0ICV1LFxuIiwKKyAgICAgICAgKHVuc2lnbmVkKSBoLT5xdWV1ZV9mdWxsX29yX2J1c3ksICh1bnNpZ25lZCkgaC0+c3RhcnRfbW90b3IsCisgICAgICAgICh1bnNpZ25lZCkgaC0+c2NzaV9yZXNldF93YWl0KTsKKworICAgIHByaW50aygKKyIgaXNfaW5faW50ICV1LCBtYXhfdG90YWxfcW5nICV1LCBjdXJfdG90YWxfcW5nICV1LCBpbl9jcml0aWNhbF9jbnQgJXUsXG4iLAorICAgICAgICAodW5zaWduZWQpIGgtPmlzX2luX2ludCwgKHVuc2lnbmVkKSBoLT5tYXhfdG90YWxfcW5nLAorICAgICAgICAodW5zaWduZWQpIGgtPmN1cl90b3RhbF9xbmcsICh1bnNpZ25lZCkgaC0+aW5fY3JpdGljYWxfY250KTsKKworICAgIHByaW50aygKKyIgbGFzdF9xX3Nob3J0YWdlICV1LCBpbml0X3N0YXRlIDB4JXgsIG5vX3NjYW0gMHgleCwgcGNpX2ZpeF9hc3luX3hmZXIgMHgleCxcbiIsCisgICAgICAgICh1bnNpZ25lZCkgaC0+bGFzdF9xX3Nob3J0YWdlLCAodW5zaWduZWQpIGgtPmluaXRfc3RhdGUsCisgICAgICAgICh1bnNpZ25lZCkgaC0+bm9fc2NhbSwgKHVuc2lnbmVkKSBoLT5wY2lfZml4X2FzeW5feGZlcik7CisKKyAgICBwcmludGsoCisiIGNmZyAweCVseCwgaXJxX25vIDB4JXhcbiIsCisgICAgICAgICh1bG9uZykgaC0+Y2ZnLCAodW5zaWduZWQpIGgtPmlycV9ubyk7Cit9CisKKy8qCisgKiBhc2NfcHJ0X2FzY19kdmNfY2ZnKCkKKyAqLworU1RBVElDIHZvaWQKK2FzY19wcnRfYXNjX2R2Y19jZmcoQVNDX0RWQ19DRkcgKmgpCit7CisgICAgcHJpbnRrKCJBU0NfRFZDX0NGRyBhdCBhZGRyIDB4JWx4XG4iLCAodWxvbmcpIGgpOworCisgICAgcHJpbnRrKAorIiBjYW5fdGFnZ2VkX3FuZyAweCV4LCBjbWRfcW5nX2VuYWJsZWQgMHgleCxcbiIsCisgICAgICAgICAgICBoLT5jYW5fdGFnZ2VkX3FuZywgaC0+Y21kX3FuZ19lbmFibGVkKTsKKyAgICBwcmludGsoCisiIGRpc2NfZW5hYmxlIDB4JXgsIHNkdHJfZW5hYmxlIDB4JXgsXG4iLAorICAgICAgICAgICAgaC0+ZGlzY19lbmFibGUsIGgtPnNkdHJfZW5hYmxlKTsKKworICAgIHByaW50aygKKyIgY2hpcF9zY3NpX2lkICVkLCBpc2FfZG1hX3NwZWVkICVkLCBpc2FfZG1hX2NoYW5uZWwgJWQsIGNoaXBfdmVyc2lvbiAlZCxcbiIsCisgICAgICAgICAgICAgaC0+Y2hpcF9zY3NpX2lkLCBoLT5pc2FfZG1hX3NwZWVkLCBoLT5pc2FfZG1hX2NoYW5uZWwsCisgICAgICAgICAgICAgaC0+Y2hpcF92ZXJzaW9uKTsKKworICAgIHByaW50aygKKyIgcGNpX2RldmljZV9pZCAlZCwgbGliX3NlcmlhbF9ubyAldSwgbGliX3ZlcnNpb24gJXUsIG1jb2RlX2RhdGUgMHgleCxcbiIsCisJICAgdG9fcGNpX2RldihoLT5kZXYpLT5kZXZpY2UsIGgtPmxpYl9zZXJpYWxfbm8sIGgtPmxpYl92ZXJzaW9uLAorCSAgIGgtPm1jb2RlX2RhdGUpOworCisgICAgcHJpbnRrKAorIiBtY29kZV92ZXJzaW9uICVkLCBvdmVycnVuX2J1ZiAweCVseFxuIiwKKyAgICAgICAgICAgIGgtPm1jb2RlX3ZlcnNpb24sICh1bG9uZykgaC0+b3ZlcnJ1bl9idWYpOworfQorCisvKgorICogYXNjX3BydF9hc2Nfc2NzaV9xKCkKKyAqLworU1RBVElDIHZvaWQKK2FzY19wcnRfYXNjX3Njc2lfcShBU0NfU0NTSV9RICpxKQoreworICAgIEFTQ19TR19IRUFEICAgICpzZ3A7CisgICAgaW50IGk7CisKKyAgICBwcmludGsoIkFTQ19TQ1NJX1EgYXQgYWRkciAweCVseFxuIiwgKHVsb25nKSBxKTsKKworICAgIHByaW50aygKKyIgdGFyZ2V0X2l4IDB4JXgsIHRhcmdldF9sdW4gJXUsIHNyYl9wdHIgMHglbHgsIHRhZ19jb2RlIDB4JXgsXG4iLAorICAgICAgICAgICAgcS0+cTIudGFyZ2V0X2l4LCBxLT5xMS50YXJnZXRfbHVuLAorICAgICAgICAgICAgKHVsb25nKSBxLT5xMi5zcmJfcHRyLCBxLT5xMi50YWdfY29kZSk7CisKKyAgICBwcmludGsoCisiIGRhdGFfYWRkciAweCVseCwgZGF0YV9jbnQgJWx1LCBzZW5zZV9hZGRyIDB4JWx4LCBzZW5zZV9sZW4gJXUsXG4iLAorICAgICAgICAgICAgKHVsb25nKSBsZTMyX3RvX2NwdShxLT5xMS5kYXRhX2FkZHIpLAorICAgICAgICAgICAgKHVsb25nKSBsZTMyX3RvX2NwdShxLT5xMS5kYXRhX2NudCksCisgICAgICAgICAgICAodWxvbmcpIGxlMzJfdG9fY3B1KHEtPnExLnNlbnNlX2FkZHIpLCBxLT5xMS5zZW5zZV9sZW4pOworCisgICAgcHJpbnRrKAorIiBjZGJwdHIgMHglbHgsIGNkYl9sZW4gJXUsIHNnX2hlYWQgMHglbHgsIHNnX3F1ZXVlX2NudCAldVxuIiwKKyAgICAgICAgICAgICh1bG9uZykgcS0+Y2RicHRyLCBxLT5xMi5jZGJfbGVuLAorICAgICAgICAgICAgKHVsb25nKSBxLT5zZ19oZWFkLCBxLT5xMS5zZ19xdWV1ZV9jbnQpOworCisgICAgaWYgKHEtPnNnX2hlYWQpIHsKKyAgICAgICAgc2dwID0gcS0+c2dfaGVhZDsKKyAgICAgICAgcHJpbnRrKCJBU0NfU0dfSEVBRCBhdCBhZGRyIDB4JWx4XG4iLCAodWxvbmcpIHNncCk7CisgICAgICAgIHByaW50aygiIGVudHJ5X2NudCAldSwgcXVldWVfY250ICV1XG4iLCBzZ3AtPmVudHJ5X2NudCwgc2dwLT5xdWV1ZV9jbnQpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2dwLT5lbnRyeV9jbnQ7IGkrKykgeworICAgICAgICAgICAgcHJpbnRrKCIgWyV1XTogYWRkciAweCVseCwgYnl0ZXMgJWx1XG4iLAorICAgICAgICAgICAgICAgIGksICh1bG9uZykgbGUzMl90b19jcHUoc2dwLT5zZ19saXN0W2ldLmFkZHIpLAorICAgICAgICAgICAgICAgICh1bG9uZykgbGUzMl90b19jcHUoc2dwLT5zZ19saXN0W2ldLmJ5dGVzKSk7CisgICAgICAgIH0KKworICAgIH0KK30KKworLyoKKyAqIGFzY19wcnRfYXNjX3Fkb25lX2luZm8oKQorICovCitTVEFUSUMgdm9pZAorYXNjX3BydF9hc2NfcWRvbmVfaW5mbyhBU0NfUURPTkVfSU5GTyAqcSkKK3sKKyAgICBwcmludGsoIkFTQ19RRE9ORV9JTkZPIGF0IGFkZHIgMHglbHhcbiIsICh1bG9uZykgcSk7CisgICAgcHJpbnRrKAorIiBzcmJfcHRyIDB4JWx4LCB0YXJnZXRfaXggJXUsIGNkYl9sZW4gJXUsIHRhZ19jb2RlICV1LFxuIiwKKyAgICAgICAgICAgICh1bG9uZykgcS0+ZDIuc3JiX3B0ciwgcS0+ZDIudGFyZ2V0X2l4LCBxLT5kMi5jZGJfbGVuLAorICAgICAgICAgICAgcS0+ZDIudGFnX2NvZGUpOworICAgIHByaW50aygKKyIgZG9uZV9zdGF0IDB4JXgsIGhvc3Rfc3RhdCAweCV4LCBzY3NpX3N0YXQgMHgleCwgc2NzaV9tc2cgMHgleFxuIiwKKyAgICAgICAgICAgIHEtPmQzLmRvbmVfc3RhdCwgcS0+ZDMuaG9zdF9zdGF0LCBxLT5kMy5zY3NpX3N0YXQsIHEtPmQzLnNjc2lfbXNnKTsKK30KKworLyoKKyAqIGFzY19wcnRfYWR2X2R2Y192YXIoKQorICoKKyAqIERpc3BsYXkgYW4gQURWX0RWQ19WQVIgc3RydWN0dXJlLgorICovCitTVEFUSUMgdm9pZAorYXNjX3BydF9hZHZfZHZjX3ZhcihBRFZfRFZDX1ZBUiAqaCkKK3sKKyAgICBwcmludGsoIiBBRFZfRFZDX1ZBUiBhdCBhZGRyIDB4JWx4XG4iLCAodWxvbmcpIGgpOworCisgICAgcHJpbnRrKAorIiAgaW9wX2Jhc2UgMHglbHgsIGVycl9jb2RlIDB4JXgsIHVsdHJhX2FibGUgMHgleFxuIiwKKyAgICAgICAgKHVsb25nKSBoLT5pb3BfYmFzZSwgaC0+ZXJyX2NvZGUsICh1bnNpZ25lZCkgaC0+dWx0cmFfYWJsZSk7CisKKyAgICBwcmludGsoCisiICBpc3JfY2FsbGJhY2sgMHglbHgsIHNkdHJfYWJsZSAweCV4LCB3ZHRyX2FibGUgMHgleFxuIiwKKyAgICAgICAgKHVsb25nKSBoLT5pc3JfY2FsbGJhY2ssICh1bnNpZ25lZCkgaC0+c2R0cl9hYmxlLAorICAgICAgICAodW5zaWduZWQpIGgtPndkdHJfYWJsZSk7CisKKyAgICBwcmludGsoCisiICBzdGFydF9tb3RvciAweCV4LCBzY3NpX3Jlc2V0X3dhaXQgMHgleCwgaXJxX25vIDB4JXgsXG4iLAorICAgICAgICAodW5zaWduZWQpIGgtPnN0YXJ0X21vdG9yLAorICAgICAgICAodW5zaWduZWQpIGgtPnNjc2lfcmVzZXRfd2FpdCwgKHVuc2lnbmVkKSBoLT5pcnFfbm8pOworCisgICAgcHJpbnRrKAorIiAgbWF4X2hvc3RfcW5nICV1LCBtYXhfZHZjX3FuZyAldSwgY2Fycl9mcmVlbGlzdCAweCVseG5cbiIsCisgICAgICAgICh1bnNpZ25lZCkgaC0+bWF4X2hvc3RfcW5nLCAodW5zaWduZWQpIGgtPm1heF9kdmNfcW5nLAorICAgICAgICAodWxvbmcpIGgtPmNhcnJfZnJlZWxpc3QpOworCisgICAgcHJpbnRrKAorIiAgaWNxX3NwIDB4JWx4LCBpcnFfc3AgMHglbHhcbiIsCisgICAgICAgICh1bG9uZykgaC0+aWNxX3NwLCAodWxvbmcpIGgtPmlycV9zcCk7CisKKyAgICBwcmludGsoCisiICBub19zY2FtIDB4JXgsIHRhZ3FuZ19hYmxlIDB4JXhcbiIsCisgICAgICAgICh1bnNpZ25lZCkgaC0+bm9fc2NhbSwgKHVuc2lnbmVkKSBoLT50YWdxbmdfYWJsZSk7CisKKyAgICBwcmludGsoCisiICBjaGlwX3Njc2lfaWQgMHgleCwgY2ZnIDB4JWx4XG4iLAorICAgICAgICAodW5zaWduZWQpIGgtPmNoaXBfc2NzaV9pZCwgKHVsb25nKSBoLT5jZmcpOworfQorCisvKgorICogYXNjX3BydF9hZHZfZHZjX2NmZygpCisgKgorICogRGlzcGxheSBhbiBBRFZfRFZDX0NGRyBzdHJ1Y3R1cmUuCisgKi8KK1NUQVRJQyB2b2lkCithc2NfcHJ0X2Fkdl9kdmNfY2ZnKEFEVl9EVkNfQ0ZHICpoKQoreworICAgIHByaW50aygiIEFEVl9EVkNfQ0ZHIGF0IGFkZHIgMHglbHhcbiIsICh1bG9uZykgaCk7CisKKyAgICBwcmludGsoCisiICBkaXNjX2VuYWJsZSAweCV4LCB0ZXJtaW5hdGlvbiAweCV4XG4iLAorICAgICAgICBoLT5kaXNjX2VuYWJsZSwgaC0+dGVybWluYXRpb24pOworCisgICAgcHJpbnRrKAorIiAgY2hpcF92ZXJzaW9uIDB4JXgsIG1jb2RlX2RhdGUgMHgleFxuIiwKKyAgICAgICAgaC0+Y2hpcF92ZXJzaW9uLCBoLT5tY29kZV9kYXRlKTsKKworICAgIHByaW50aygKKyIgIG1jb2RlX3ZlcnNpb24gMHgleCwgcGNpX2RldmljZV9pZCAweCV4LCBsaWJfdmVyc2lvbiAldVxuIiwKKyAgICAgICBoLT5tY29kZV92ZXJzaW9uLCB0b19wY2lfZGV2KGgtPmRldiktPmRldmljZSwgaC0+bGliX3ZlcnNpb24pOworCisgICAgcHJpbnRrKAorIiAgY29udHJvbF9mbGFnIDB4JXgsIHBjaV9zbG90X2luZm8gMHgleFxuIiwKKyAgICAgICBoLT5jb250cm9sX2ZsYWcsIGgtPnBjaV9zbG90X2luZm8pOworfQorCisvKgorICogYXNjX3BydF9hZHZfc2NzaV9yZXFfcSgpCisgKgorICogRGlzcGxheSBhbiBBRFZfU0NTSV9SRVFfUSBzdHJ1Y3R1cmUuCisgKi8KK1NUQVRJQyB2b2lkCithc2NfcHJ0X2Fkdl9zY3NpX3JlcV9xKEFEVl9TQ1NJX1JFUV9RICpxKQoreworICAgIGludCAgICAgICAgICAgICAgICAgc2dfYmxrX2NudDsKKyAgICBzdHJ1Y3QgYXNjX3NnX2Jsb2NrICpzZ19wdHI7CisKKyAgICBwcmludGsoIkFEVl9TQ1NJX1JFUV9RIGF0IGFkZHIgMHglbHhcbiIsICh1bG9uZykgcSk7CisKKyAgICBwcmludGsoCisiICB0YXJnZXRfaWQgJXUsIHRhcmdldF9sdW4gJXUsIHNyYl9wdHIgMHglbHgsIGFfZmxhZyAweCV4XG4iLAorICAgICAgICAgICAgcS0+dGFyZ2V0X2lkLCBxLT50YXJnZXRfbHVuLCAodWxvbmcpIHEtPnNyYl9wdHIsIHEtPmFfZmxhZyk7CisKKyAgICBwcmludGsoIiAgY250bCAweCV4LCBkYXRhX2FkZHIgMHglbHgsIHZkYXRhX2FkZHIgMHglbHhcbiIsCisgICAgICAgICAgICBxLT5jbnRsLCAodWxvbmcpIGxlMzJfdG9fY3B1KHEtPmRhdGFfYWRkciksICh1bG9uZykgcS0+dmRhdGFfYWRkcik7CisKKyAgICBwcmludGsoCisiICBkYXRhX2NudCAlbHUsIHNlbnNlX2FkZHIgMHglbHgsIHNlbnNlX2xlbiAldSxcbiIsCisgICAgICAgICAgICAodWxvbmcpIGxlMzJfdG9fY3B1KHEtPmRhdGFfY250KSwKKyAgICAgICAgICAgICh1bG9uZykgbGUzMl90b19jcHUocS0+c2Vuc2VfYWRkciksIHEtPnNlbnNlX2xlbik7CisKKyAgICBwcmludGsoCisiICBjZGJfbGVuICV1LCBkb25lX3N0YXR1cyAweCV4LCBob3N0X3N0YXR1cyAweCV4LCBzY3NpX3N0YXR1cyAweCV4XG4iLAorICAgICAgICAgICAgcS0+Y2RiX2xlbiwgcS0+ZG9uZV9zdGF0dXMsIHEtPmhvc3Rfc3RhdHVzLCBxLT5zY3NpX3N0YXR1cyk7CisKKyAgICBwcmludGsoCisiICBzZ193b3JraW5nX2l4IDB4JXgsIHRhcmdldF9jbWQgJXVcbiIsCisgICAgICAgICAgICBxLT5zZ193b3JraW5nX2l4LCBxLT50YXJnZXRfY21kKTsKKworICAgIHByaW50aygKKyIgIHNjc2lxX3JwdHIgMHglbHgsIHNnX3JlYWxfYWRkciAweCVseCwgc2dfbGlzdF9wdHIgMHglbHhcbiIsCisgICAgICAgICAgICAodWxvbmcpIGxlMzJfdG9fY3B1KHEtPnNjc2lxX3JwdHIpLAorICAgICAgICAgICAgKHVsb25nKSBsZTMyX3RvX2NwdShxLT5zZ19yZWFsX2FkZHIpLCAodWxvbmcpIHEtPnNnX2xpc3RfcHRyKTsKKworICAgIC8qIERpc3BsYXkgdGhlIHJlcXVlc3QncyBBRFZfU0dfQkxPQ0sgc3RydWN0dXJlcy4gKi8KKyAgICBpZiAocS0+c2dfbGlzdF9wdHIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNnX2Jsa19jbnQgPSAwOworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqICdzZ19wdHInIGlzIGEgcGh5c2ljYWwgYWRkcmVzcy4gQ29udmVydCBpdCB0byBhIHZpcnR1YWwKKyAgICAgICAgICAgICAqIGFkZHJlc3MgYnkgaW5kZXhpbmcgJ3NnX2Jsa19jbnQnIGludG8gdGhlIHZpcnR1YWwgYWRkcmVzcworICAgICAgICAgICAgICogYXJyYXkgJ3NnX2xpc3RfcHRyJy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBYWFggLSBBc3N1bWVzIGFsbCBTRyBwaHlzaWNhbCBibG9ja3MgYXJlIHZpcnR1YWxseSBjb250aWd1b3VzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzZ19wdHIgPSAmKCgoQURWX1NHX0JMT0NLICopIChxLT5zZ19saXN0X3B0cikpW3NnX2Jsa19jbnRdKTsKKyAgICAgICAgICAgIGFzY19wcnRfYWR2X3NnYmxvY2soc2dfYmxrX2NudCwgc2dfcHRyKTsKKyAgICAgICAgICAgIGlmIChzZ19wdHItPnNnX3B0ciA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2dfYmxrX2NudCsrOworICAgICAgICB9CisgICAgfQorfQorCisvKgorICogYXNjX3BydF9hZHZfc2dibG9jaygpCisgKgorICogRGlzcGxheSBhbiBBRFZfU0dfQkxPQ0sgc3RydWN0dXJlLgorICovCitTVEFUSUMgdm9pZAorYXNjX3BydF9hZHZfc2dibG9jayhpbnQgc2dibG9ja25vLCBBRFZfU0dfQkxPQ0sgKmIpCit7CisgICAgaW50IGk7CisKKyAgICBwcmludGsoIiBBU0NfU0dfQkxPQ0sgYXQgYWRkciAweCVseCAoc2dibG9ja25vICVkKVxuIiwKKyAgICAgICAgKHVsb25nKSBiLCBzZ2Jsb2Nrbm8pOworICAgIHByaW50aygiICBzZ19jbnQgJXUsIHNnX3B0ciAweCVseFxuIiwKKyAgICAgICAgYi0+c2dfY250LCAodWxvbmcpIGxlMzJfdG9fY3B1KGItPnNnX3B0cikpOworICAgIEFTQ19BU1NFUlQoYi0+c2dfY250IDw9IE5PX09GX1NHX1BFUl9CTE9DSyk7CisgICAgaWYgKGItPnNnX3B0ciAhPSAwKQorICAgIHsKKyAgICAgICAgQVNDX0FTU0VSVChiLT5zZ19jbnQgPT0gTk9fT0ZfU0dfUEVSX0JMT0NLKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGItPnNnX2NudDsgaSsrKSB7CisgICAgICAgIHByaW50aygiICBbJXVdOiBzZ19hZGRyIDB4JWx4LCBzZ19jb3VudCAweCVseFxuIiwKKyAgICAgICAgICAgIGksICh1bG9uZykgYi0+c2dfbGlzdFtpXS5zZ19hZGRyLCAodWxvbmcpIGItPnNnX2xpc3RbaV0uc2dfY291bnQpOworICAgIH0KK30KKworLyoKKyAqIGFzY19wcnRfaGV4KCkKKyAqCisgKiBQcmludCBoZXhhZGVjaW1hbCBvdXRwdXQgaW4gNCBieXRlIGdyb3VwaW5ncyAzMiBieXRlcworICogb3IgOCBkb3VibGUtd29yZHMgcGVyIGxpbmUuCisgKi8KK1NUQVRJQyB2b2lkCithc2NfcHJ0X2hleChjaGFyICpmLCB1Y2hhciAqcywgaW50IGwpCit7CisgICAgaW50ICAgICAgICAgICAgaTsKKyAgICBpbnQgICAgICAgICAgICBqOworICAgIGludCAgICAgICAgICAgIGs7CisgICAgaW50ICAgICAgICAgICAgbTsKKworICAgIHByaW50aygiJXM6ICglZCBieXRlcylcbiIsIGYsIGwpOworCisgICAgZm9yIChpID0gMDsgaSA8IGw7IGkgKz0gMzIpIHsKKworICAgICAgICAvKiBEaXNwbGF5IGEgbWF4aW11bSBvZiA4IGRvdWJsZS13b3JkcyBwZXIgbGluZS4gKi8KKyAgICAgICAgaWYgKChrID0gKGwgLSBpKSAvIDQpID49IDgpIHsKKyAgICAgICAgICAgIGsgPSA4OworICAgICAgICAgICAgbSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtID0gKGwgLSBpKSAlIDQ7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgazsgaisrKSB7CisgICAgICAgICAgICBwcmludGsoIiAlMi4yWCUyLjJYJTIuMlglMi4yWCIsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBzW2krKGoqNCldLCAodW5zaWduZWQpIHNbaSsoaio0KSsxXSwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQpIHNbaSsoaio0KSsyXSwgKHVuc2lnbmVkKSBzW2krKGoqNCkrM10pOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChtKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBwcmludGsoIiAlMi4yWCIsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBzW2krKGoqNCldKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBwcmludGsoIiAlMi4yWCUyLjJYIiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQpIHNbaSsoaio0KV0sCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBzW2krKGoqNCkrMV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHByaW50aygiICUyLjJYJTIuMlglMi4yWCIsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBzW2krKGoqNCkrMV0sCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBzW2krKGoqNCkrMl0sCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBzW2krKGoqNCkrM10pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwcmludGsoIlxuIik7CisgICAgfQorfQorI2VuZGlmIC8qIEFEVkFOU1lTX0RFQlVHICovCisKKy8qCisgKiAtLS0gQXNjIExpYnJhcnkgRnVuY3Rpb25zCisgKi8KKworU1RBVElDIHVzaG9ydCBfX2luaXQKK0FzY0dldEVpc2FDaGlwQ2ZnKAorICAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UpCit7CisgICAgUG9ydEFkZHIgICAgICAgICAgICBlaXNhX2NmZ19pb3A7CisKKyAgICBlaXNhX2NmZ19pb3AgPSAoUG9ydEFkZHIpIEFTQ19HRVRfRUlTQV9TTE9UKGlvcF9iYXNlKSB8CisgICAgICAoUG9ydEFkZHIpIChBU0NfRUlTQV9DRkdfSU9QX01BU0spOworICAgIHJldHVybiAoaW5wdyhlaXNhX2NmZ19pb3ApKTsKK30KKworU1RBVElDIHVjaGFyIF9faW5pdAorQXNjU2V0Q2hpcFNjc2lJRCgKKyAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgIHVjaGFyIG5ld19ob3N0X2lkCispCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICBjZmdfbHN3OworCisgICAgaWYgKEFzY0dldENoaXBTY3NpSUQoaW9wX2Jhc2UpID09IG5ld19ob3N0X2lkKSB7CisgICAgICAgIHJldHVybiAobmV3X2hvc3RfaWQpOworICAgIH0KKyAgICBjZmdfbHN3ID0gQXNjR2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSk7CisgICAgY2ZnX2xzdyAmPSAweEY4RkY7CisgICAgY2ZnX2xzdyB8PSAodXNob3J0KSAoKG5ld19ob3N0X2lkICYgQVNDX01BWF9USUQpIDw8IDgpOworICAgIEFzY1NldENoaXBDZmdMc3coaW9wX2Jhc2UsIGNmZ19sc3cpOworICAgIHJldHVybiAoQXNjR2V0Q2hpcFNjc2lJRChpb3BfYmFzZSkpOworfQorCitTVEFUSUMgdWNoYXIgX19pbml0CitBc2NHZXRDaGlwU2NzaUN0cmwoCisJCVBvcnRBZGRyIGlvcF9iYXNlKQoreworICAgIHVjaGFyICAgICAgICAgICAgICAgc2M7CisKKyAgICBBc2NTZXRCYW5rKGlvcF9iYXNlLCAxKTsKKyAgICBzYyA9IGlucChpb3BfYmFzZSArIElPUF9SRUdfU0MpOworICAgIEFzY1NldEJhbmsoaW9wX2Jhc2UsIDApOworICAgIHJldHVybiAoc2MpOworfQorCitTVEFUSUMgdWNoYXIgX19pbml0CitBc2NHZXRDaGlwVmVyc2lvbigKKyAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgdXNob3J0IGJ1c190eXBlCispCit7CisgICAgaWYgKChidXNfdHlwZSAmIEFTQ19JU19FSVNBKSAhPSAwKSB7CisgICAgICAgIFBvcnRBZGRyICAgICAgICAgICAgZWlzYV9pb3A7CisgICAgICAgIHVjaGFyICAgICAgICAgICAgICAgcmV2aXNpb247CisgICAgICAgIGVpc2FfaW9wID0gKFBvcnRBZGRyKSBBU0NfR0VUX0VJU0FfU0xPVChpb3BfYmFzZSkgfAorICAgICAgICAgIChQb3J0QWRkcikgQVNDX0VJU0FfUkVWX0lPUF9NQVNLOworICAgICAgICByZXZpc2lvbiA9IGlucChlaXNhX2lvcCk7CisgICAgICAgIHJldHVybiAoKHVjaGFyKSAoKEFTQ19DSElQX01JTl9WRVJfRUlTQSAtIDEpICsgcmV2aXNpb24pKTsKKyAgICB9CisgICAgcmV0dXJuIChBc2NHZXRDaGlwVmVyTm8oaW9wX2Jhc2UpKTsKK30KKworU1RBVElDIHVzaG9ydCBfX2luaXQKK0FzY0dldENoaXBCdXNUeXBlKAorICAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UpCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICBjaGlwX3ZlcjsKKworICAgIGNoaXBfdmVyID0gQXNjR2V0Q2hpcFZlck5vKGlvcF9iYXNlKTsKKyAgICBpZiAoCisgICAgICAgICAgIChjaGlwX3ZlciA+PSBBU0NfQ0hJUF9NSU5fVkVSX1ZMKQorICAgICAgICAgICAmJiAoY2hpcF92ZXIgPD0gQVNDX0NISVBfTUFYX1ZFUl9WTCkKKykgeworICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAoKGlvcF9iYXNlICYgMHgwQzMwKSA9PSAweDBDMzApCisgICAgICAgICAgICAgICB8fCAoKGlvcF9iYXNlICYgMHgwQzUwKSA9PSAweDBDNTApCispIHsKKyAgICAgICAgICAgIHJldHVybiAoQVNDX0lTX0VJU0EpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoQVNDX0lTX1ZMKTsKKyAgICB9CisgICAgaWYgKChjaGlwX3ZlciA+PSBBU0NfQ0hJUF9NSU5fVkVSX0lTQSkgJiYKKyAgICAgICAgKGNoaXBfdmVyIDw9IEFTQ19DSElQX01BWF9WRVJfSVNBKSkgeworICAgICAgICBpZiAoY2hpcF92ZXIgPj0gQVNDX0NISVBfTUlOX1ZFUl9JU0FfUE5QKSB7CisgICAgICAgICAgICByZXR1cm4gKEFTQ19JU19JU0FQTlApOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoQVNDX0lTX0lTQSk7CisgICAgfSBlbHNlIGlmICgoY2hpcF92ZXIgPj0gQVNDX0NISVBfTUlOX1ZFUl9QQ0kpICYmCisgICAgICAgICAgICAgICAoY2hpcF92ZXIgPD0gQVNDX0NISVBfTUFYX1ZFUl9QQ0kpKSB7CisgICAgICAgIHJldHVybiAoQVNDX0lTX1BDSSk7CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyBBU0NfRENOVAorQXNjTG9hZE1pY3JvQ29kZSgKKyAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBzX2FkZHIsCisgICAgICAgICAgICAgICAgICAgIHVjaGFyICptY29kZV9idWYsCisgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBtY29kZV9zaXplCispCit7CisgICAgQVNDX0RDTlQgICAgICAgICAgICBjaGtzdW07CisgICAgdXNob3J0ICAgICAgICAgICAgICBtY29kZV93b3JkX3NpemU7CisgICAgdXNob3J0ICAgICAgICAgICAgICBtY29kZV9jaGtzdW07CisKKyAgICAvKiBXcml0ZSB0aGUgbWljcm9jb2RlIGJ1ZmZlciBzdGFydGluZyBhdCBMUkFNIGFkZHJlc3MgMC4gKi8KKyAgICBtY29kZV93b3JkX3NpemUgPSAodXNob3J0KSAobWNvZGVfc2l6ZSA+PiAxKTsKKyAgICBBc2NNZW1Xb3JkU2V0THJhbShpb3BfYmFzZSwgc19hZGRyLCAwLCBtY29kZV93b3JkX3NpemUpOworICAgIEFzY01lbVdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLCBzX2FkZHIsIG1jb2RlX2J1ZiwgbWNvZGVfd29yZF9zaXplKTsKKworICAgIGNoa3N1bSA9IEFzY01lbVN1bUxyYW1Xb3JkKGlvcF9iYXNlLCBzX2FkZHIsIG1jb2RlX3dvcmRfc2l6ZSk7CisgICAgQVNDX0RCRzEoMSwgIkFzY0xvYWRNaWNyb0NvZGU6IGNoa3N1bSAweCVseFxuIiwgKHVsb25nKSBjaGtzdW0pOworICAgIG1jb2RlX2Noa3N1bSA9ICh1c2hvcnQpIEFzY01lbVN1bUxyYW1Xb3JkKGlvcF9iYXNlLAorICAgICAgICAgICh1c2hvcnQpIEFTQ19DT0RFX1NFQ19CRUcsCisgICAgICAgICAgKHVzaG9ydCkgKChtY29kZV9zaXplIC0gc19hZGRyIC0gKHVzaG9ydCkgQVNDX0NPREVfU0VDX0JFRykgLyAyKSk7CisgICAgQVNDX0RCRzEoMSwgIkFzY0xvYWRNaWNyb0NvZGU6IG1jb2RlX2Noa3N1bSAweCVseFxuIiwKKyAgICAgICAgKHVsb25nKSBtY29kZV9jaGtzdW0pOworICAgIEFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIEFTQ1ZfTUNPREVfQ0hLU1VNX1csIG1jb2RlX2Noa3N1bSk7CisgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9NQ09ERV9TSVpFX1csIG1jb2RlX3NpemUpOworICAgIHJldHVybiAoY2hrc3VtKTsKK30KKworU1RBVElDIGludAorQXNjRmluZFNpZ25hdHVyZSgKKyAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UKKykKK3sKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHNpZ193b3JkOworCisgICAgQVNDX0RCRzIoMSwgIkFzY0ZpbmRTaWduYXR1cmU6IEFzY0dldENoaXBTaWduYXR1cmVCeXRlKDB4JXgpIDB4JXhcbiIsCisgICAgICAgIGlvcF9iYXNlLCBBc2NHZXRDaGlwU2lnbmF0dXJlQnl0ZShpb3BfYmFzZSkpOworICAgIGlmIChBc2NHZXRDaGlwU2lnbmF0dXJlQnl0ZShpb3BfYmFzZSkgPT0gKHVjaGFyKSBBU0NfMTAwMF9JRDFCKSB7CisgICAgICAgIEFTQ19EQkcyKDEsICJBc2NGaW5kU2lnbmF0dXJlOiBBc2NHZXRDaGlwU2lnbmF0dXJlV29yZCgweCV4KSAweCV4XG4iLAorICAgICAgICAgICAgaW9wX2Jhc2UsIEFzY0dldENoaXBTaWduYXR1cmVXb3JkKGlvcF9iYXNlKSk7CisgICAgICAgIHNpZ193b3JkID0gQXNjR2V0Q2hpcFNpZ25hdHVyZVdvcmQoaW9wX2Jhc2UpOworICAgICAgICBpZiAoKHNpZ193b3JkID09ICh1c2hvcnQpIEFTQ18xMDAwX0lEMFcpIHx8CisgICAgICAgICAgICAoc2lnX3dvcmQgPT0gKHVzaG9ydCkgQVNDXzEwMDBfSUQwV19GSVgpKSB7CisgICAgICAgICAgICByZXR1cm4gKDEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyBQb3J0QWRkciBfYXNjX2RlZl9pb3BfYmFzZVtBU0NfSU9BRFJfVEFCTEVfTUFYX0lYXSBfX2luaXRkYXRhID0KK3sKKyAgICAweDEwMCwgQVNDX0lPQURSXzEsIDB4MTIwLCBBU0NfSU9BRFJfMiwgMHgxNDAsIEFTQ19JT0FEUl8zLCBBU0NfSU9BRFJfNCwKKyAgICBBU0NfSU9BRFJfNSwgQVNDX0lPQURSXzYsIEFTQ19JT0FEUl83LCBBU0NfSU9BRFJfOAorfTsKKworI2lmZGVmIENPTkZJR19JU0EKK1NUQVRJQyB1Y2hhciBfaXNhX3BucF9pbml0ZWQgX19pbml0ZGF0YSA9IDA7CisKK1NUQVRJQyBQb3J0QWRkciBfX2luaXQKK0FzY1NlYXJjaElPUG9ydEFkZHIoCisgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iZWcsCisgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBidXNfdHlwZSkKK3sKKyAgICBpZiAoYnVzX3R5cGUgJiBBU0NfSVNfVkwpIHsKKyAgICAgICAgd2hpbGUgKChpb3BfYmVnID0gQXNjU2VhcmNoSU9Qb3J0QWRkcjExKGlvcF9iZWcpKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoQXNjR2V0Q2hpcFZlcnNpb24oaW9wX2JlZywgYnVzX3R5cGUpIDw9IEFTQ19DSElQX01BWF9WRVJfVkwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGlvcF9iZWcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorICAgIGlmIChidXNfdHlwZSAmIEFTQ19JU19JU0EpIHsKKyAgICAgICAgaWYgKF9pc2FfcG5wX2luaXRlZCA9PSAwKSB7CisgICAgICAgICAgICBBc2NTZXRJU0FQTlBXYWl0Rm9yS2V5KCk7CisgICAgICAgICAgICBfaXNhX3BucF9pbml0ZWQrKzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoKGlvcF9iZWcgPSBBc2NTZWFyY2hJT1BvcnRBZGRyMTEoaW9wX2JlZykpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoQXNjR2V0Q2hpcFZlcnNpb24oaW9wX2JlZywgYnVzX3R5cGUpICYgQVNDX0NISVBfVkVSX0lTQV9CSVQpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGlvcF9iZWcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorICAgIGlmIChidXNfdHlwZSAmIEFTQ19JU19FSVNBKSB7CisgICAgICAgIGlmICgoaW9wX2JlZyA9IEFzY1NlYXJjaElPUG9ydEFkZHJFSVNBKGlvcF9iZWcpKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gKGlvcF9iZWcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyBQb3J0QWRkciBfX2luaXQKK0FzY1NlYXJjaElPUG9ydEFkZHIxMSgKKyAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBzX2FkZHIKKykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgIGk7CisgICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBBU0NfSU9BRFJfVEFCTEVfTUFYX0lYOyBpKyspIHsKKyAgICAgICAgaWYgKF9hc2NfZGVmX2lvcF9iYXNlW2ldID4gc19hZGRyKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKDsgaSA8IEFTQ19JT0FEUl9UQUJMRV9NQVhfSVg7IGkrKykgeworICAgICAgICBpb3BfYmFzZSA9IF9hc2NfZGVmX2lvcF9iYXNlW2ldOworICAgICAgICBpZiAoY2hlY2tfcmVnaW9uKGlvcF9iYXNlLCBBU0NfSU9BRFJfR0FQKSAhPSAwKSB7CisgICAgICAgICAgICBBU0NfREJHMSgxLAorICAgICAgICAgICAgICAgIkFzY1NlYXJjaElPUG9ydEFkZHIxMTogY2hlY2tfcmVnaW9uKCkgZmFpbGVkIEkvTyBwb3J0IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICBpb3BfYmFzZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBBU0NfREJHMSgxLCAiQXNjU2VhcmNoSU9Qb3J0QWRkcjExOiBwcm9iaW5nIEkvTyBwb3J0IDB4JXhcbiIsIGlvcF9iYXNlKTsKKyAgICAgICAgaWYgKEFzY0ZpbmRTaWduYXR1cmUoaW9wX2Jhc2UpKSB7CisgICAgICAgICAgICByZXR1cm4gKGlvcF9iYXNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKDApOworfQorCitTVEFUSUMgdm9pZCBfX2luaXQKK0FzY1NldElTQVBOUFdhaXRGb3JLZXkodm9pZCkKK3sKKyAgICBvdXRwKEFTQ19JU0FfUE5QX1BPUlRfQUREUiwgMHgwMik7CisgICAgb3V0cChBU0NfSVNBX1BOUF9QT1JUX1dSSVRFLCAweDAyKTsKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLyogQ09ORklHX0lTQSAqLworCitTVEFUSUMgdm9pZCBfX2luaXQKK0FzY1RvZ2dsZUlSUUFjdCgKKyAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZQorKQoreworICAgIEFzY1NldENoaXBTdGF0dXMoaW9wX2Jhc2UsIENJV19JUlFfQUNUKTsKKyAgICBBc2NTZXRDaGlwU3RhdHVzKGlvcF9iYXNlLCAwKTsKKyAgICByZXR1cm47Cit9CisKK1NUQVRJQyB1Y2hhciBfX2luaXQKK0FzY0dldENoaXBJUlEoCisgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICB1c2hvcnQgYnVzX3R5cGUpCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICBjZmdfbHN3OworICAgIHVjaGFyICAgICAgICAgICAgICAgY2hpcF9pcnE7CisKKyAgICBpZiAoKGJ1c190eXBlICYgQVNDX0lTX0VJU0EpICE9IDApIHsKKyAgICAgICAgY2ZnX2xzdyA9IEFzY0dldEVpc2FDaGlwQ2ZnKGlvcF9iYXNlKTsKKyAgICAgICAgY2hpcF9pcnEgPSAodWNoYXIpICgoKGNmZ19sc3cgPj4gOCkgJiAweDA3KSArIDEwKTsKKyAgICAgICAgaWYgKChjaGlwX2lycSA9PSAxMykgfHwgKGNoaXBfaXJxID4gMTUpKSB7CisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoY2hpcF9pcnEpOworICAgIH0KKyAgICBpZiAoKGJ1c190eXBlICYgQVNDX0lTX1ZMKSAhPSAwKSB7CisgICAgICAgIGNmZ19sc3cgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKTsKKyAgICAgICAgY2hpcF9pcnEgPSAodWNoYXIpICgoKGNmZ19sc3cgPj4gMikgJiAweDA3KSk7CisgICAgICAgIGlmICgoY2hpcF9pcnEgPT0gMCkgfHwKKyAgICAgICAgICAgIChjaGlwX2lycSA9PSA0KSB8fAorICAgICAgICAgICAgKGNoaXBfaXJxID09IDcpKSB7CisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKHVjaGFyKSAoY2hpcF9pcnEgKyAoQVNDX01JTl9JUlFfTk8gLSAxKSkpOworICAgIH0KKyAgICBjZmdfbHN3ID0gQXNjR2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSk7CisgICAgY2hpcF9pcnEgPSAodWNoYXIpICgoKGNmZ19sc3cgPj4gMikgJiAweDAzKSk7CisgICAgaWYgKGNoaXBfaXJxID09IDMpCisgICAgICAgIGNoaXBfaXJxICs9ICh1Y2hhcikgMjsKKyAgICByZXR1cm4gKCh1Y2hhcikgKGNoaXBfaXJxICsgQVNDX01JTl9JUlFfTk8pKTsKK30KKworU1RBVElDIHVjaGFyIF9faW5pdAorQXNjU2V0Q2hpcElSUSgKKyAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgIHVjaGFyIGlycV9ubywKKyAgICAgICAgICAgICAgICAgdXNob3J0IGJ1c190eXBlKQoreworICAgIHVzaG9ydCAgICAgICAgICAgICAgY2ZnX2xzdzsKKworICAgIGlmICgoYnVzX3R5cGUgJiBBU0NfSVNfVkwpICE9IDApIHsKKyAgICAgICAgaWYgKGlycV9ubyAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKGlycV9ubyA8IEFTQ19NSU5fSVJRX05PKSB8fCAoaXJxX25vID4gQVNDX01BWF9JUlFfTk8pKSB7CisgICAgICAgICAgICAgICAgaXJxX25vID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXJxX25vIC09ICh1Y2hhcikgKChBU0NfTUlOX0lSUV9OTyAtIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjZmdfbHN3ID0gKHVzaG9ydCkgKEFzY0dldENoaXBDZmdMc3coaW9wX2Jhc2UpICYgMHhGRkUzKTsKKyAgICAgICAgY2ZnX2xzdyB8PSAodXNob3J0KSAweDAwMTA7CisgICAgICAgIEFzY1NldENoaXBDZmdMc3coaW9wX2Jhc2UsIGNmZ19sc3cpOworICAgICAgICBBc2NUb2dnbGVJUlFBY3QoaW9wX2Jhc2UpOworICAgICAgICBjZmdfbHN3ID0gKHVzaG9ydCkgKEFzY0dldENoaXBDZmdMc3coaW9wX2Jhc2UpICYgMHhGRkUwKTsKKyAgICAgICAgY2ZnX2xzdyB8PSAodXNob3J0KSAoKGlycV9ubyAmIDB4MDcpIDw8IDIpOworICAgICAgICBBc2NTZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlLCBjZmdfbHN3KTsKKyAgICAgICAgQXNjVG9nZ2xlSVJRQWN0KGlvcF9iYXNlKTsKKyAgICAgICAgcmV0dXJuIChBc2NHZXRDaGlwSVJRKGlvcF9iYXNlLCBidXNfdHlwZSkpOworICAgIH0KKyAgICBpZiAoKGJ1c190eXBlICYgKEFTQ19JU19JU0EpKSAhPSAwKSB7CisgICAgICAgIGlmIChpcnFfbm8gPT0gMTUpCisgICAgICAgICAgICBpcnFfbm8gLT0gKHVjaGFyKSAyOworICAgICAgICBpcnFfbm8gLT0gKHVjaGFyKSBBU0NfTUlOX0lSUV9OTzsKKyAgICAgICAgY2ZnX2xzdyA9ICh1c2hvcnQpIChBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKSAmIDB4RkZGMyk7CisgICAgICAgIGNmZ19sc3cgfD0gKHVzaG9ydCkgKChpcnFfbm8gJiAweDAzKSA8PCAyKTsKKyAgICAgICAgQXNjU2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSwgY2ZnX2xzdyk7CisgICAgICAgIHJldHVybiAoQXNjR2V0Q2hpcElSUShpb3BfYmFzZSwgYnVzX3R5cGUpKTsKKyAgICB9CisgICAgcmV0dXJuICgwKTsKK30KKworI2lmZGVmIENPTkZJR19JU0EKK1NUQVRJQyB2b2lkIF9faW5pdAorQXNjRW5hYmxlSXNhRG1hKAorICAgICAgICAgICAgICAgICAgIHVjaGFyIGRtYV9jaGFubmVsKQoreworICAgIGlmIChkbWFfY2hhbm5lbCA8IDQpIHsKKyAgICAgICAgb3V0cCgweDAwMEIsICh1c2hvcnQpICgweEMwIHwgZG1hX2NoYW5uZWwpKTsKKyAgICAgICAgb3V0cCgweDAwMEEsIGRtYV9jaGFubmVsKTsKKyAgICB9IGVsc2UgaWYgKGRtYV9jaGFubmVsIDwgOCkgeworICAgICAgICBvdXRwKDB4MDBENiwgKHVzaG9ydCkgKDB4QzAgfCAoZG1hX2NoYW5uZWwgLSA0KSkpOworICAgICAgICBvdXRwKDB4MDBENCwgKHVzaG9ydCkgKGRtYV9jaGFubmVsIC0gNCkpOworICAgIH0KKyAgICByZXR1cm47Cit9CisjZW5kaWYgLyogQ09ORklHX0lTQSAqLworCitTVEFUSUMgaW50CitBc2NJc3JDaGlwSGFsdGVkKAorICAgICAgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YworKQoreworICAgIEVYVF9NU0cgICAgICAgICAgICAgZXh0X21zZzsKKyAgICBFWFRfTVNHICAgICAgICAgICAgIG91dF9tc2c7CisgICAgdXNob3J0ICAgICAgICAgICAgICBoYWx0X3FfYWRkcjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHNkdHJfYWNjZXB0OworICAgIHVzaG9ydCAgICAgICAgICAgICAgaW50X2hhbHRfY29kZTsKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBzY3NpX2J1c3k7CisgICAgQVNDX1NDU0lfQklUX0lEX1RZUEUgdGFyZ2V0X2lkOworICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7CisgICAgdWNoYXIgICAgICAgICAgICAgICB0YWdfY29kZTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHFfc3RhdHVzOworICAgIHVjaGFyICAgICAgICAgICAgICAgaGFsdF9xcDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHNkdHJfZGF0YTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHRhcmdldF9peDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHFfY250bCwgdGlkX25vOworICAgIHVjaGFyICAgICAgICAgICAgICAgY3VyX2R2Y19xbmc7CisgICAgdWNoYXIgICAgICAgICAgICAgICBhc3luX3NkdHI7CisgICAgdWNoYXIgICAgICAgICAgICAgICBzY3NpX3N0YXR1czsKKyAgICBhc2NfYm9hcmRfdCAgICAgICAgICpib2FyZHA7CisKKyAgICBBU0NfQVNTRVJUKGFzY19kdmMtPmRydl9wdHIgIT0gTlVMTCk7CisgICAgYm9hcmRwID0gYXNjX2R2Yy0+ZHJ2X3B0cjsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisgICAgaW50X2hhbHRfY29kZSA9IEFzY1JlYWRMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XKTsKKworICAgIGhhbHRfcXAgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfQ1VSQ0RCX0IpOworICAgIGhhbHRfcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihoYWx0X3FwKTsKKyAgICB0YXJnZXRfaXggPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKGhhbHRfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfVEFSR0VUX0lYKSk7CisgICAgcV9jbnRsID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKGhhbHRfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfQ05UTCkpOworICAgIHRpZF9ubyA9IEFTQ19USVhfVE9fVElEKHRhcmdldF9peCk7CisgICAgdGFyZ2V0X2lkID0gKHVjaGFyKSBBU0NfVElEX1RPX1RBUkdFVF9JRCh0aWRfbm8pOworICAgIGlmIChhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciAmIHRhcmdldF9pZCkgeworICAgICAgICBhc3luX3NkdHIgPSBBU1lOX1NEVFJfREFUQV9GSVhfUENJX1JFVl9BQjsKKyAgICB9IGVsc2UgeworICAgICAgICBhc3luX3NkdHIgPSAwOworICAgIH0KKyAgICBpZiAoaW50X2hhbHRfY29kZSA9PSBBU0NfSEFMVF9ESVNBQkxFX0FTWU5fVVNFX1NZTl9GSVgpIHsKKyAgICAgICAgaWYgKGFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyICYgdGFyZ2V0X2lkKSB7CisgICAgICAgICAgICBBc2NTZXRDaGlwU0RUUihpb3BfYmFzZSwgMCwgdGlkX25vKTsKKyAgICAgICAgICAgIGJvYXJkcC0+c2R0cl9kYXRhW3RpZF9ub10gPSAwOworICAgICAgICB9CisgICAgICAgIEFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIEFTQ1ZfSEFMVENPREVfVywgMCk7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfSBlbHNlIGlmIChpbnRfaGFsdF9jb2RlID09IEFTQ19IQUxUX0VOQUJMRV9BU1lOX1VTRV9TWU5fRklYKSB7CisgICAgICAgIGlmIChhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciAmIHRhcmdldF9pZCkgeworICAgICAgICAgICAgQXNjU2V0Q2hpcFNEVFIoaW9wX2Jhc2UsIGFzeW5fc2R0ciwgdGlkX25vKTsKKyAgICAgICAgICAgIGJvYXJkcC0+c2R0cl9kYXRhW3RpZF9ub10gPSBhc3luX3NkdHI7CisgICAgICAgIH0KKyAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9IGVsc2UgaWYgKGludF9oYWx0X2NvZGUgPT0gQVNDX0hBTFRfRVhUTVNHX0lOKSB7CisKKyAgICAgICAgQXNjTWVtV29yZENvcHlQdHJGcm9tTHJhbShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NWX01TR0lOX0JFRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWNoYXIgKikgJmV4dF9tc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEVYVF9NU0cpID4+IDEpOworCisgICAgICAgIGlmIChleHRfbXNnLm1zZ190eXBlID09IE1TX0VYVEVORCAmJgorICAgICAgICAgICAgZXh0X21zZy5tc2dfcmVxID09IE1TX1NEVFJfQ09ERSAmJgorICAgICAgICAgICAgZXh0X21zZy5tc2dfbGVuID09IE1TX1NEVFJfTEVOKSB7CisgICAgICAgICAgICBzZHRyX2FjY2VwdCA9IFRSVUU7CisgICAgICAgICAgICBpZiAoKGV4dF9tc2cucmVxX2Fja19vZmZzZXQgPiBBU0NfU1lOX01BWF9PRkZTRVQpKSB7CisKKyAgICAgICAgICAgICAgICBzZHRyX2FjY2VwdCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGV4dF9tc2cucmVxX2Fja19vZmZzZXQgPSBBU0NfU1lOX01BWF9PRkZTRVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGV4dF9tc2cueGZlcl9wZXJpb2QgPAorICAgICAgICAgICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbYXNjX2R2Yy0+aG9zdF9pbml0X3NkdHJfaW5kZXhdKSB8fAorICAgICAgICAgICAgICAgIChleHRfbXNnLnhmZXJfcGVyaW9kID4KKyAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsW2FzY19kdmMtPm1heF9zZHRyX2luZGV4XSkpIHsKKyAgICAgICAgICAgICAgICBzZHRyX2FjY2VwdCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGV4dF9tc2cueGZlcl9wZXJpb2QgPQorICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbYXNjX2R2Yy0+aG9zdF9pbml0X3NkdHJfaW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNkdHJfYWNjZXB0KSB7CisgICAgICAgICAgICAgICAgc2R0cl9kYXRhID0gQXNjQ2FsU0RUUkRhdGEoYXNjX2R2YywgZXh0X21zZy54ZmVyX3BlcmlvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRfbXNnLnJlcV9hY2tfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoKHNkdHJfZGF0YSA9PSAweEZGKSkgeworCisgICAgICAgICAgICAgICAgICAgIHFfY250bCB8PSBRQ19NU0dfT1VUOworICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5pbml0X3NkdHIgJj0gfnRhcmdldF9pZDsKKyAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+c2R0cl9kb25lICY9IH50YXJnZXRfaWQ7CisgICAgICAgICAgICAgICAgICAgIEFzY1NldENoaXBTRFRSKGlvcF9iYXNlLCBhc3luX3NkdHIsIHRpZF9ubyk7CisgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+c2R0cl9kYXRhW3RpZF9ub10gPSBhc3luX3NkdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV4dF9tc2cucmVxX2Fja19vZmZzZXQgPT0gMCkgeworCisgICAgICAgICAgICAgICAgcV9jbnRsICY9IH5RQ19NU0dfT1VUOworICAgICAgICAgICAgICAgIGFzY19kdmMtPmluaXRfc2R0ciAmPSB+dGFyZ2V0X2lkOworICAgICAgICAgICAgICAgIGFzY19kdmMtPnNkdHJfZG9uZSAmPSB+dGFyZ2V0X2lkOworICAgICAgICAgICAgICAgIEFzY1NldENoaXBTRFRSKGlvcF9iYXNlLCBhc3luX3NkdHIsIHRpZF9ubyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzZHRyX2FjY2VwdCAmJiAocV9jbnRsICYgUUNfTVNHX09VVCkpIHsKKworICAgICAgICAgICAgICAgICAgICBxX2NudGwgJj0gflFDX01TR19PVVQ7CisgICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPnNkdHJfZG9uZSB8PSB0YXJnZXRfaWQ7CisgICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPmluaXRfc2R0ciB8PSB0YXJnZXRfaWQ7CisgICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyICY9IH50YXJnZXRfaWQ7CisgICAgICAgICAgICAgICAgICAgIHNkdHJfZGF0YSA9IEFzY0NhbFNEVFJEYXRhKGFzY19kdmMsIGV4dF9tc2cueGZlcl9wZXJpb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dF9tc2cucmVxX2Fja19vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBBc2NTZXRDaGlwU0RUUihpb3BfYmFzZSwgc2R0cl9kYXRhLCB0aWRfbm8pOworICAgICAgICAgICAgICAgICAgICBib2FyZHAtPnNkdHJfZGF0YVt0aWRfbm9dID0gc2R0cl9kYXRhOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgcV9jbnRsIHw9IFFDX01TR19PVVQ7CisgICAgICAgICAgICAgICAgICAgIEFzY01zZ091dFNEVFIoYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRfbXNnLnhmZXJfcGVyaW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dF9tc2cucmVxX2Fja19vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciAmPSB+dGFyZ2V0X2lkOworICAgICAgICAgICAgICAgICAgICBzZHRyX2RhdGEgPSBBc2NDYWxTRFRSRGF0YShhc2NfZHZjLCBleHRfbXNnLnhmZXJfcGVyaW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRfbXNnLnJlcV9hY2tfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgQXNjU2V0Q2hpcFNEVFIoaW9wX2Jhc2UsIHNkdHJfZGF0YSwgdGlkX25vKTsKKyAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5zZHRyX2RhdGFbdGlkX25vXSA9IHNkdHJfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+c2R0cl9kb25lIHw9IHRhcmdldF9pZDsKKyAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+aW5pdF9zZHRyIHw9IHRhcmdldF9pZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKGhhbHRfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfQ05UTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFfY250bCk7CisgICAgICAgICAgICBBc2NXcml0ZUxyYW1Xb3JkKGlvcF9iYXNlLCBBU0NWX0hBTFRDT0RFX1csIDApOworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfSBlbHNlIGlmIChleHRfbXNnLm1zZ190eXBlID09IE1TX0VYVEVORCAmJgorICAgICAgICAgICAgICAgICAgIGV4dF9tc2cubXNnX3JlcSA9PSBNU19XRFRSX0NPREUgJiYKKyAgICAgICAgICAgICAgICAgICBleHRfbXNnLm1zZ19sZW4gPT0gTVNfV0RUUl9MRU4pIHsKKworICAgICAgICAgICAgZXh0X21zZy53ZHRyX3dpZHRoID0gMDsKKyAgICAgICAgICAgIEFzY01lbVdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDVl9NU0dPVVRfQkVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyICopICZleHRfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEVYVF9NU0cpID4+IDEpOworICAgICAgICAgICAgcV9jbnRsIHw9IFFDX01TR19PVVQ7CisgICAgICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChoYWx0X3FfYWRkciArICh1c2hvcnQpIEFTQ19TQ1NJUV9CX0NOVEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxX2NudGwpOworICAgICAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIGV4dF9tc2cubXNnX3R5cGUgPSBNRVNTQUdFX1JFSkVDVDsKKyAgICAgICAgICAgIEFzY01lbVdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDVl9NU0dPVVRfQkVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyICopICZleHRfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEVYVF9NU0cpID4+IDEpOworICAgICAgICAgICAgcV9jbnRsIHw9IFFDX01TR19PVVQ7CisgICAgICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChoYWx0X3FfYWRkciArICh1c2hvcnQpIEFTQ19TQ1NJUV9CX0NOVEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxX2NudGwpOworICAgICAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGludF9oYWx0X2NvZGUgPT0gQVNDX0hBTFRfQ0hLX0NPTkRJVElPTikgeworCisgICAgICAgIHFfY250bCB8PSBRQ19SRVFfU0VOU0U7CisKKyAgICAgICAgaWYgKChhc2NfZHZjLT5pbml0X3NkdHIgJiB0YXJnZXRfaWQpICE9IDApIHsKKworICAgICAgICAgICAgYXNjX2R2Yy0+c2R0cl9kb25lICY9IH50YXJnZXRfaWQ7CisKKyAgICAgICAgICAgIHNkdHJfZGF0YSA9IEFzY0dldE1Db2RlSW5pdFNEVFJBdElEKGlvcF9iYXNlLCB0aWRfbm8pOworICAgICAgICAgICAgcV9jbnRsIHw9IFFDX01TR19PVVQ7CisgICAgICAgICAgICBBc2NNc2dPdXRTRFRSKGFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFsoc2R0cl9kYXRhID4+IDQpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhcikgKGFzY19kdmMtPm1heF9zZHRyX2luZGV4IC0gMSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodWNoYXIpIChzZHRyX2RhdGEgJiAodWNoYXIpIEFTQ19TWU5fTUFYX09GRlNFVCkpOworICAgICAgICB9CisKKyAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoaGFsdF9xX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9DTlRMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBxX2NudGwpOworCisgICAgICAgIHRhZ19jb2RlID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoaGFsdF9xX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9UQUdfQ09ERSkpOworICAgICAgICB0YWdfY29kZSAmPSAweERDOworICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAoYXNjX2R2Yy0+cGNpX2ZpeF9hc3luX3hmZXIgJiB0YXJnZXRfaWQpCisgICAgICAgICAgICAgICAmJiAhKGFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyX2Fsd2F5cyAmIHRhcmdldF9pZCkKKykgeworCisgICAgICAgICAgICB0YWdfY29kZSB8PSAoQVNDX1RBR19GTEFHX0RJU0FCTEVfRElTQ09OTkVDVAorICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVNDX1RBR19GTEFHX0RJU0FCTEVfQVNZTl9VU0VfU1lOX0ZJWCk7CisKKyAgICAgICAgfQorICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKGhhbHRfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfVEFHX0NPREUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ19jb2RlKTsKKworICAgICAgICBxX3N0YXR1cyA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoaGFsdF9xX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9TVEFUVVMpKTsKKyAgICAgICAgcV9zdGF0dXMgfD0gKFFTX1JFQURZIHwgUVNfQlVTWSk7CisgICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChoYWx0X3FfYWRkciArICh1c2hvcnQpIEFTQ19TQ1NJUV9CX1NUQVRVUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgcV9zdGF0dXMpOworCisgICAgICAgIHNjc2lfYnVzeSA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIEFTQ1ZfU0NTSUJVU1lfQik7CisgICAgICAgIHNjc2lfYnVzeSAmPSB+dGFyZ2V0X2lkOworICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCAodXNob3J0KSBBU0NWX1NDU0lCVVNZX0IsIHNjc2lfYnVzeSk7CisKKyAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9IGVsc2UgaWYgKGludF9oYWx0X2NvZGUgPT0gQVNDX0hBTFRfU0RUUl9SRUpFQ1RFRCkgeworCisgICAgICAgIEFzY01lbVdvcmRDb3B5UHRyRnJvbUxyYW0oaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDVl9NU0dPVVRfQkVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhciAqKSAmb3V0X21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRVhUX01TRykgPj4gMSk7CisKKyAgICAgICAgaWYgKChvdXRfbXNnLm1zZ190eXBlID09IE1TX0VYVEVORCkgJiYKKyAgICAgICAgICAgIChvdXRfbXNnLm1zZ19sZW4gPT0gTVNfU0RUUl9MRU4pICYmCisgICAgICAgICAgICAob3V0X21zZy5tc2dfcmVxID09IE1TX1NEVFJfQ09ERSkpIHsKKworICAgICAgICAgICAgYXNjX2R2Yy0+aW5pdF9zZHRyICY9IH50YXJnZXRfaWQ7CisgICAgICAgICAgICBhc2NfZHZjLT5zZHRyX2RvbmUgJj0gfnRhcmdldF9pZDsKKyAgICAgICAgICAgIEFzY1NldENoaXBTRFRSKGlvcF9iYXNlLCBhc3luX3NkdHIsIHRpZF9ubyk7CisgICAgICAgICAgICBib2FyZHAtPnNkdHJfZGF0YVt0aWRfbm9dID0gYXN5bl9zZHRyOworICAgICAgICB9CisgICAgICAgIHFfY250bCAmPSB+UUNfTVNHX09VVDsKKyAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoaGFsdF9xX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9DTlRMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBxX2NudGwpOworICAgICAgICBBc2NXcml0ZUxyYW1Xb3JkKGlvcF9iYXNlLCBBU0NWX0hBTFRDT0RFX1csIDApOworICAgICAgICByZXR1cm4gKDApOworICAgIH0gZWxzZSBpZiAoaW50X2hhbHRfY29kZSA9PSBBU0NfSEFMVF9TU19RVUVVRV9GVUxMKSB7CisKKyAgICAgICAgc2NzaV9zdGF0dXMgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgKHVzaG9ydCkgKCh1c2hvcnQpIGhhbHRfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX1NDU0lfU1RBVFVTKSk7CisgICAgICAgIGN1cl9kdmNfcW5nID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKCh1c2hvcnQpIEFTQ19RQURSX0JFRyArICh1c2hvcnQpIHRhcmdldF9peCkpOworICAgICAgICBpZiAoKGN1cl9kdmNfcW5nID4gMCkgJiYKKyAgICAgICAgICAgIChhc2NfZHZjLT5jdXJfZHZjX3FuZ1t0aWRfbm9dID4gMCkpIHsKKworICAgICAgICAgICAgc2NzaV9idXN5ID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIEFTQ1ZfU0NTSUJVU1lfQik7CisgICAgICAgICAgICBzY3NpX2J1c3kgfD0gdGFyZ2V0X2lkOworICAgICAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgQVNDVl9TQ1NJQlVTWV9CLCBzY3NpX2J1c3kpOworICAgICAgICAgICAgYXNjX2R2Yy0+cXVldWVfZnVsbF9vcl9idXN5IHw9IHRhcmdldF9pZDsKKworICAgICAgICAgICAgaWYgKHNjc2lfc3RhdHVzID09IFNBTV9TVEFUX1RBU0tfU0VUX0ZVTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VyX2R2Y19xbmcgPiBBU0NfTUlOX1RBR0dFRF9DTUQpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyX2R2Y19xbmcgLT0gMTsKKyAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+bWF4X2R2Y19xbmdbdGlkX25vXSA9IGN1cl9kdmNfcW5nOworCisgICAgICAgICAgICAgICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpICgodXNob3J0KSBBU0NWX01BWF9EVkNfUU5HX0JFRyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSB0aWRfbm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfZHZjX3FuZyk7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogU2V0IHRoZSBkZXZpY2UgcXVldWUgZGVwdGggdG8gdGhlIG51bWJlciBvZgorICAgICAgICAgICAgICAgICAgICAgKiBhY3RpdmUgcmVxdWVzdHMgd2hlbiB0aGUgUVVFVUUgRlVMTCBjb25kaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICogd2FzIGVuY291bnRlcmVkLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5xdWV1ZV9mdWxsIHw9IHRhcmdldF9pZDsKKyAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5xdWV1ZV9mdWxsX2NudFt0aWRfbm9dID0gY3VyX2R2Y19xbmc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIEFTQ1ZfSEFMVENPREVfVywgMCk7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorI2lmIENDX1ZFUllfTE9OR19TR19MSVNUCisgICAgZWxzZSBpZiAoaW50X2hhbHRfY29kZSA9PSBBU0NfSEFMVF9IT1NUX0NPUFlfU0dfTElTVF9UT19SSVNDKQorICAgIHsKKyAgICAgICAgdWNoYXIgICAgICAgICAgICAgIHFfbm87CisgICAgICAgIHVzaG9ydCAgICAgICAgICAgICBxX2FkZHI7CisgICAgICAgIHVjaGFyICAgICAgICAgICAgICBzZ193a19xX25vOworICAgICAgICB1Y2hhciAgICAgICAgICAgICAgZmlyc3Rfc2dfd2tfcV9ubzsKKyAgICAgICAgQVNDX1NDU0lfUSAgICAgICAgICpzY3NpcTsgLyogUHRyIHRvIGRyaXZlciByZXF1ZXN0LiAqLworICAgICAgICBBU0NfU0dfSEVBRCAgICAgICAgKnNnX2hlYWQ7IC8qIFB0ciB0byBkcml2ZXIgU0cgcmVxdWVzdC4gKi8KKyAgICAgICAgQVNDX1NHX0xJU1RfUSAgICAgIHNjc2lfc2dfcTsgLyogU3RydWN0dXJlIHdyaXR0ZW4gdG8gcXVldWUuICovCisgICAgICAgIHVzaG9ydCAgICAgICAgICAgICBzZ19saXN0X2R3b3JkczsKKyAgICAgICAgdXNob3J0ICAgICAgICAgICAgIHNnX2VudHJ5X2NudDsKKyAgICAgICAgdWNoYXIgICAgICAgICAgICAgIG5leHRfcXA7CisgICAgICAgIGludCAgICAgICAgICAgICAgICBpOworCisgICAgICAgIHFfbm8gPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsICh1c2hvcnQpIEFTQ1ZfUkVRX1NHX0xJU1RfUVApOworICAgICAgICBpZiAocV9ubyA9PSBBU0NfUUxJTktfRU5EKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKworICAgICAgICBxX2FkZHIgPSBBU0NfUU5PX1RPX1FBRERSKHFfbm8pOworCisgICAgICAgIC8qCisgICAgICAgICAqIENvbnZlcnQgdGhlIHJlcXVlc3QncyBTUkIgcG9pbnRlciB0byBhIGhvc3QgQVNDX1NDU0lfUkVRCisgICAgICAgICAqIHN0cnVjdHVyZSBwb2ludGVyIHVzaW5nIGEgbWFjcm8gcHJvdmlkZWQgYnkgdGhlIGRyaXZlci4KKyAgICAgICAgICogVGhlIEFTQ19TQ1NJX1JFUSBwb2ludGVyIHByb3ZpZGVzIGEgcG9pbnRlciB0byB0aGUKKyAgICAgICAgICogaG9zdCBBU0NfU0dfSEVBRCBzdHJ1Y3R1cmUuCisgICAgICAgICAqLworICAgICAgICAvKiBSZWFkIHJlcXVlc3QncyBTUkIgcG9pbnRlci4gKi8KKyAgICAgICAgc2NzaXEgPSAoQVNDX1NDU0lfUSAqKQorICAgICAgICAgICBBU0NfU1JCMlNDU0lRKAorICAgICAgICAgICAgICAgQVNDX1UzMl9UT19WQUREUihBc2NSZWFkTHJhbURXb3JkKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgKHVzaG9ydCkgKHFfYWRkciArIEFTQ19TQ1NJUV9EX1NSQlBUUikpKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHJlcXVlc3QncyBmaXJzdCBhbmQgd29ya2luZyBTRyBxdWV1ZS4KKyAgICAgICAgICovCisgICAgICAgIHNnX3drX3Ffbm8gPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgICAodXNob3J0KSAocV9hZGRyICsgQVNDX1NDU0lRX0JfU0dfV0tfUVApKTsKKworICAgICAgICBmaXJzdF9zZ193a19xX25vID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgKHVzaG9ydCkgKHFfYWRkciArIEFTQ19TQ1NJUV9CX0ZJUlNUX1NHX1dLX1FQKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVzZXQgcmVxdWVzdCdzIHdvcmtpbmcgU0cgcXVldWUgYmFjayB0byB0aGUKKyAgICAgICAgICogZmlyc3QgU0cgcXVldWUuCisgICAgICAgICAqLworICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgKHVzaG9ydCkgKHFfYWRkciArICh1c2hvcnQpIEFTQ19TQ1NJUV9CX1NHX1dLX1FQKSwKKyAgICAgICAgICAgIGZpcnN0X3NnX3drX3Ffbm8pOworCisgICAgICAgIHNnX2hlYWQgPSBzY3NpcS0+c2dfaGVhZDsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgc2dfZW50cnlfY250IHRvIHRoZSBudW1iZXIgb2YgU0cgZWxlbWVudHMKKyAgICAgICAgICogdGhhdCB3aWxsIGJlIGNvbXBsZXRlZCBvbiB0aGlzIGludGVycnVwdC4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZTogVGhlIGFsbG9jYXRlZCBTRyBxdWV1ZXMgY29udGFpbiBBU0NfTUFYX1NHX0xJU1QgLSAxCisgICAgICAgICAqIFNHIGVsZW1lbnRzLiBUaGUgZGF0YV9jbnQgYW5kIGRhdGFfYWRkciBmaWVsZHMgd2hpY2gKKyAgICAgICAgICogYWRkIDEgdG8gdGhlIFNHIGVsZW1lbnQgY2FwYWNpdHkgYXJlIG5vdCB1c2VkIHdoZW4KKyAgICAgICAgICogcmVzdGFydGluZyBTRyBoYW5kbGluZyBhZnRlciBhIGhhbHQuCisgICAgICAgICAqLworICAgICAgICBpZiAoc2NzaXEtPnJlbWFpbl9zZ19lbnRyeV9jbnQgPiAoQVNDX01BWF9TR19MSVNUIC0gMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICBzZ19lbnRyeV9jbnQgPSBBU0NfTUFYX1NHX0xJU1QgLSAxOworCisgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgKiBLZWVwIHRyYWNrIG9mIHJlbWFpbmluZyBudW1iZXIgb2YgU0cgZWxlbWVudHMgdGhhdCB3aWxsCisgICAgICAgICAgICAgICogbmVlZCB0byBiZSBoYW5kbGVkIG9uIHRoZSBuZXh0IGludGVycnVwdC4KKyAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICBzY3NpcS0+cmVtYWluX3NnX2VudHJ5X2NudCAtPSAoQVNDX01BWF9TR19MSVNUIC0gMSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgc2dfZW50cnlfY250ID0gc2NzaXEtPnJlbWFpbl9zZ19lbnRyeV9jbnQ7CisgICAgICAgICAgICAgc2NzaXEtPnJlbWFpbl9zZ19lbnRyeV9jbnQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29weSBTRyBlbGVtZW50cyBpbnRvIHRoZSBsaXN0IG9mIGFsbG9jYXRlZCBTRyBxdWV1ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIExhc3QgaW5kZXggY29tcGxldGVkIGlzIHNhdmVkIGluIHNjc2lxLT5uZXh0X3NnX2luZGV4LgorICAgICAgICAgKi8KKyAgICAgICAgbmV4dF9xcCA9IGZpcnN0X3NnX3drX3Ffbm87CisgICAgICAgIHFfYWRkciA9IEFTQ19RTk9fVE9fUUFERFIobmV4dF9xcCk7CisgICAgICAgIHNjc2lfc2dfcS5zZ19oZWFkX3FwID0gcV9ubzsKKyAgICAgICAgc2NzaV9zZ19xLmNudGwgPSBRQ1NHX1NHX1hGRVJfTElTVDsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNnX2hlYWQtPnF1ZXVlX2NudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgc2NzaV9zZ19xLnNlcV9ubyA9IGkgKyAxOworICAgICAgICAgICAgIGlmIChzZ19lbnRyeV9jbnQgPiBBU0NfU0dfTElTVF9QRVJfUSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHNnX2xpc3RfZHdvcmRzID0gKHVjaGFyKSAoQVNDX1NHX0xJU1RfUEVSX1EgKiAyKTsKKyAgICAgICAgICAgICAgICAgc2dfZW50cnlfY250IC09IEFTQ19TR19MSVNUX1BFUl9ROworICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgKiBBZnRlciB2ZXJ5IGZpcnN0IFNHIHF1ZXVlIFJJU0MgRlcgdXNlcyBuZXh0CisgICAgICAgICAgICAgICAgICAqIFNHIHF1ZXVlIGZpcnN0IGVsZW1lbnQgdGhlbiBjaGVja3Mgc2dfbGlzdF9jbnQKKyAgICAgICAgICAgICAgICAgICogYWdhaW5zdCB6ZXJvIGFuZCB0aGVuIGRlY3JlbWVudHMsIHNvIHNldAorICAgICAgICAgICAgICAgICAgKiBzZ19saXN0X2NudCAxIGxlc3MgdGhhbiBudW1iZXIgb2YgU0cgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICogaW4gZWFjaCBTRyBxdWV1ZS4KKyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgIHNjc2lfc2dfcS5zZ19saXN0X2NudCA9IEFTQ19TR19MSVNUX1BFUl9RIC0gMTsKKyAgICAgICAgICAgICAgICAgc2NzaV9zZ19xLnNnX2N1cl9saXN0X2NudCA9IEFTQ19TR19MSVNUX1BFUl9RIC0gMTsKKyAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIHRoZSBsYXN0IFNHIHF1ZXVlIGluIHRoZSBsaXN0IG9mCisgICAgICAgICAgICAgICAgICAqIGFsbG9jYXRlZCBTRyBxdWV1ZXMuIElmIHRoZXJlIGFyZSBtb3JlCisgICAgICAgICAgICAgICAgICAqIFNHIGVsZW1lbnRzIHRoYW4gd2lsbCBmaXQgaW4gdGhlIGFsbG9jYXRlZAorICAgICAgICAgICAgICAgICAgKiBxdWV1ZXMsIHRoZW4gc2V0IHRoZSBRQ1NHX1NHX1hGRVJfTU9SRSBmbGFnLgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgaWYgKHNjc2lxLT5yZW1haW5fc2dfZW50cnlfY250ICE9IDApCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHNjc2lfc2dfcS5jbnRsIHw9IFFDU0dfU0dfWEZFUl9NT1JFOworICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgc2NzaV9zZ19xLmNudGwgfD0gUUNTR19TR19YRkVSX0VORDsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAvKiBlcXVhbHMgc2dfZW50cnlfY250ICogMiAqLworICAgICAgICAgICAgICAgICBzZ19saXN0X2R3b3JkcyA9IHNnX2VudHJ5X2NudCA8PCAxOworICAgICAgICAgICAgICAgICBzY3NpX3NnX3Euc2dfbGlzdF9jbnQgPSBzZ19lbnRyeV9jbnQgLSAxOworICAgICAgICAgICAgICAgICBzY3NpX3NnX3Euc2dfY3VyX2xpc3RfY250ID0gc2dfZW50cnlfY250IC0gMTsKKyAgICAgICAgICAgICAgICAgc2dfZW50cnlfY250ID0gMDsKKyAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBzY3NpX3NnX3EucV9ubyA9IG5leHRfcXA7CisgICAgICAgICAgICAgQXNjTWVtV29yZENvcHlQdHJUb0xyYW0oaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHFfYWRkciArIEFTQ19TQ1NJUV9TR0hEX0NQWV9CRUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhciAqKSAmc2NzaV9zZ19xLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQVNDX1NHX0xJU1RfUSkgPj4gMSk7CisKKyAgICAgICAgICAgICBBc2NNZW1EV29yZENvcHlQdHJUb0xyYW0oaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHFfYWRkciArIEFTQ19TR1FfTElTVF9CRUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhciAqKSAmc2dfaGVhZC0+c2dfbGlzdFtzY3NpcS0+bmV4dF9zZ19pbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNnX2xpc3RfZHdvcmRzKTsKKworICAgICAgICAgICAgIHNjc2lxLT5uZXh0X3NnX2luZGV4ICs9IEFTQ19TR19MSVNUX1BFUl9ROworCisgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgKiBJZiB0aGUganVzdCBjb21wbGV0ZWQgU0cgcXVldWUgY29udGFpbmVkIHRoZQorICAgICAgICAgICAgICAqIGxhc3QgU0cgZWxlbWVudCwgdGhlbiBubyBtb3JlIFNHIHF1ZXVlcyBuZWVkCisgICAgICAgICAgICAgICogdG8gYmUgd3JpdHRlbi4KKyAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICBpZiAoc2NzaV9zZ19xLmNudGwgJiBRQ1NHX1NHX1hGRVJfRU5EKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgbmV4dF9xcCA9IEFzY1JlYWRMcmFtQnl0ZSggaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICggdXNob3J0ICkoIHFfYWRkcitBU0NfU0NTSVFfQl9GV0QgKSApOworICAgICAgICAgICAgIHFfYWRkciA9IEFTQ19RTk9fVE9fUUFERFIoIG5leHRfcXAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENsZWFyIHRoZSBoYWx0IGNvbmRpdGlvbiBzbyB0aGUgUklTQyB3aWxsIGJlIHJlc3RhcnRlZAorICAgICAgICAgKiBhZnRlciB0aGUgcmV0dXJuLgorICAgICAgICAgKi8KKyAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDQ19WRVJZX0xPTkdfU0dfTElTVCAqLworICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyB1Y2hhcgorX0FzY0NvcHlMcmFtU2NzaURvbmVRKAorICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBxX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQVNDX1FET05FX0lORk8gKiBzY3NpcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBU0NfRENOVCBtYXhfZG1hX2NvdW50CispCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICBfdmFsOworICAgIHVjaGFyICAgICAgICAgICAgICAgc2dfcXVldWVfY250OworCisgICAgRHZjR2V0UWluZm8oaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgcV9hZGRyICsgQVNDX1NDU0lRX0RPTkVfSU5GT19CRUcsCisgICAgICAgICAgICAgICAgKHVjaGFyICopIHNjc2lxLAorICAgICAgICAgICAgICAgIChzaXplb2YgKEFTQ19TQ1NJUV8yKSArIHNpemVvZiAoQVNDX1NDU0lRXzMpKSAvIDIpOworCisgICAgX3ZhbCA9IEFzY1JlYWRMcmFtV29yZChpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9TVEFUVVMpKTsKKyAgICBzY3NpcS0+cV9zdGF0dXMgPSAodWNoYXIpIF92YWw7CisgICAgc2NzaXEtPnFfbm8gPSAodWNoYXIpIChfdmFsID4+IDgpOworICAgIF92YWwgPSBBc2NSZWFkTHJhbVdvcmQoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAocV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfQ05UTCkpOworICAgIHNjc2lxLT5jbnRsID0gKHVjaGFyKSBfdmFsOworICAgIHNnX3F1ZXVlX2NudCA9ICh1Y2hhcikgKF92YWwgPj4gOCk7CisgICAgX3ZhbCA9IEFzY1JlYWRMcmFtV29yZChpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9TRU5TRV9MRU4pKTsKKyAgICBzY3NpcS0+c2Vuc2VfbGVuID0gKHVjaGFyKSBfdmFsOworICAgIHNjc2lxLT5leHRyYV9ieXRlcyA9ICh1Y2hhcikgKF92YWwgPj4gOCk7CisKKyAgICAvKgorICAgICAqIFJlYWQgaGlnaCB3b3JkIG9mIHJlbWFpbiBieXRlcyBmcm9tIGFsdGVybmF0ZSBsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBzY3NpcS0+cmVtYWluX2J5dGVzID0gKCgoQURWX0RDTlQpIEFzY1JlYWRMcmFtV29yZCggaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKHFfYWRkcisgKHVzaG9ydCkgQVNDX1NDU0lRX1dfQUxUX0RDMSkpKSA8PCAxNik7CisgICAgLyoKKyAgICAgKiBSZWFkIGxvdyB3b3JkIG9mIHJlbWFpbiBieXRlcyBmcm9tIG9yaWdpbmFsIGxvY2F0aW9uLgorICAgICAqLworICAgIHNjc2lxLT5yZW1haW5fYnl0ZXMgKz0gQXNjUmVhZExyYW1Xb3JkKGlvcF9iYXNlLAorICAgICAgICAodXNob3J0KSAocV9hZGRyKyAodXNob3J0KSBBU0NfU0NTSVFfRFdfUkVNQUlOX1hGRVJfQ05UKSk7CisKKyAgICBzY3NpcS0+cmVtYWluX2J5dGVzICY9IG1heF9kbWFfY291bnQ7CisgICAgcmV0dXJuIChzZ19xdWV1ZV9jbnQpOworfQorCitTVEFUSUMgaW50CitBc2NJc3JRRG9uZSgKKyAgICAgICAgICAgICAgIEFTQ19EVkNfVkFSICphc2NfZHZjCispCit7CisgICAgdWNoYXIgICAgICAgICAgICAgICBuZXh0X3FwOworICAgIHVjaGFyICAgICAgICAgICAgICAgbl9xX3VzZWQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBzZ19saXN0X3FwOworICAgIHVjaGFyICAgICAgICAgICAgICAgc2dfcXVldWVfY250OworICAgIHVjaGFyICAgICAgICAgICAgICAgcV9jbnQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBkb25lX3FfdGFpbDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHRpZF9ubzsKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBzY3NpX2J1c3k7CisgICAgQVNDX1NDU0lfQklUX0lEX1RZUEUgdGFyZ2V0X2lkOworICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7CisgICAgdXNob3J0ICAgICAgICAgICAgICBxX2FkZHI7CisgICAgdXNob3J0ICAgICAgICAgICAgICBzZ19xX2FkZHI7CisgICAgdWNoYXIgICAgICAgICAgICAgICBjdXJfdGFyZ2V0X3FuZzsKKyAgICBBU0NfUURPTkVfSU5GTyAgICAgIHNjc2lxX2J1ZjsKKyAgICBBU0NfUURPTkVfSU5GTyAqc2NzaXE7CisgICAgaW50ICAgICAgICAgICAgICAgICBmYWxzZV9vdmVycnVuOworICAgIEFTQ19JU1JfQ0FMTEJBQ0sgICAgYXNjX2lzcl9jYWxsYmFjazsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisgICAgYXNjX2lzcl9jYWxsYmFjayA9IGFzY19kdmMtPmlzcl9jYWxsYmFjazsKKyAgICBuX3FfdXNlZCA9IDE7CisgICAgc2NzaXEgPSAoQVNDX1FET05FX0lORk8gKikgJiBzY3NpcV9idWY7CisgICAgZG9uZV9xX3RhaWwgPSAodWNoYXIpIEFzY0dldFZhckRvbmVRVGFpbChpb3BfYmFzZSk7CisgICAgcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihkb25lX3FfdGFpbCk7CisgICAgbmV4dF9xcCA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9GV0QpKTsKKyAgICBpZiAobmV4dF9xcCAhPSBBU0NfUUxJTktfRU5EKSB7CisgICAgICAgIEFzY1B1dFZhckRvbmVRVGFpbChpb3BfYmFzZSwgbmV4dF9xcCk7CisgICAgICAgIHFfYWRkciA9IEFTQ19RTk9fVE9fUUFERFIobmV4dF9xcCk7CisgICAgICAgIHNnX3F1ZXVlX2NudCA9IF9Bc2NDb3B5THJhbVNjc2lEb25lUShpb3BfYmFzZSwgcV9hZGRyLCBzY3NpcSwKKyAgICAgICAgICAgIGFzY19kdmMtPm1heF9kbWFfY291bnQpOworICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9TVEFUVVMpLAorICAgICAgICAgICAgICh1Y2hhcikgKHNjc2lxLT5xX3N0YXR1cyAmICh1Y2hhcikgfiAoUVNfUkVBRFkgfCBRU19BQk9SVEVEKSkpOworICAgICAgICB0aWRfbm8gPSBBU0NfVElYX1RPX1RJRChzY3NpcS0+ZDIudGFyZ2V0X2l4KTsKKyAgICAgICAgdGFyZ2V0X2lkID0gQVNDX1RJWF9UT19UQVJHRVRfSUQoc2NzaXEtPmQyLnRhcmdldF9peCk7CisgICAgICAgIGlmICgoc2NzaXEtPmNudGwgJiBRQ19TR19IRUFEKSAhPSAwKSB7CisgICAgICAgICAgICBzZ19xX2FkZHIgPSBxX2FkZHI7CisgICAgICAgICAgICBzZ19saXN0X3FwID0gbmV4dF9xcDsKKyAgICAgICAgICAgIGZvciAocV9jbnQgPSAwOyBxX2NudCA8IHNnX3F1ZXVlX2NudDsgcV9jbnQrKykgeworICAgICAgICAgICAgICAgIHNnX2xpc3RfcXAgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoc2dfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfRldEKSk7CisgICAgICAgICAgICAgICAgc2dfcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihzZ19saXN0X3FwKTsKKyAgICAgICAgICAgICAgICBpZiAoc2dfbGlzdF9xcCA9PSBBU0NfUUxJTktfRU5EKSB7CisgICAgICAgICAgICAgICAgICAgIEFzY1NldExpYkVycm9yQ29kZShhc2NfZHZjLCBBU0NRX0VSUl9TR19RX0xJTktTKTsKKyAgICAgICAgICAgICAgICAgICAgc2NzaXEtPmQzLmRvbmVfc3RhdCA9IFFEX1dJVEhfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIHNjc2lxLT5kMy5ob3N0X3N0YXQgPSBRSFNUQV9EX1FET05FX1NHX0xJU1RfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICBnb3RvIEZBVEFMX0VSUl9RRE9ORTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoc2dfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfU1RBVFVTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFTX0ZSRUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbl9xX3VzZWQgPSBzZ19xdWV1ZV9jbnQgKyAxOworICAgICAgICAgICAgQXNjUHV0VmFyRG9uZVFUYWlsKGlvcF9iYXNlLCBzZ19saXN0X3FwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXNjX2R2Yy0+cXVldWVfZnVsbF9vcl9idXN5ICYgdGFyZ2V0X2lkKSB7CisgICAgICAgICAgICBjdXJfdGFyZ2V0X3FuZyA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICh1c2hvcnQpICgodXNob3J0KSBBU0NfUUFEUl9CRUcgKyAodXNob3J0KSBzY3NpcS0+ZDIudGFyZ2V0X2l4KSk7CisgICAgICAgICAgICBpZiAoY3VyX3RhcmdldF9xbmcgPCBhc2NfZHZjLT5tYXhfZHZjX3FuZ1t0aWRfbm9dKSB7CisgICAgICAgICAgICAgICAgc2NzaV9idXN5ID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSBBU0NWX1NDU0lCVVNZX0IpOworICAgICAgICAgICAgICAgIHNjc2lfYnVzeSAmPSB+dGFyZ2V0X2lkOworICAgICAgICAgICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSBBU0NWX1NDU0lCVVNZX0IsIHNjc2lfYnVzeSk7CisgICAgICAgICAgICAgICAgYXNjX2R2Yy0+cXVldWVfZnVsbF9vcl9idXN5ICY9IH50YXJnZXRfaWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFzY19kdmMtPmN1cl90b3RhbF9xbmcgPj0gbl9xX3VzZWQpIHsKKyAgICAgICAgICAgIGFzY19kdmMtPmN1cl90b3RhbF9xbmcgLT0gbl9xX3VzZWQ7CisgICAgICAgICAgICBpZiAoYXNjX2R2Yy0+Y3VyX2R2Y19xbmdbdGlkX25vXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgYXNjX2R2Yy0+Y3VyX2R2Y19xbmdbdGlkX25vXS0tOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQXNjU2V0TGliRXJyb3JDb2RlKGFzY19kdmMsIEFTQ1FfRVJSX0NVUl9RTkcpOworICAgICAgICAgICAgc2NzaXEtPmQzLmRvbmVfc3RhdCA9IFFEX1dJVEhfRVJST1I7CisgICAgICAgICAgICBnb3RvIEZBVEFMX0VSUl9RRE9ORTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHNjc2lxLT5kMi5zcmJfcHRyID09IDBVTCkgfHwKKyAgICAgICAgICAgICgoc2NzaXEtPnFfc3RhdHVzICYgUVNfQUJPUlRFRCkgIT0gMCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoMHgxMSk7CisgICAgICAgIH0gZWxzZSBpZiAoc2NzaXEtPnFfc3RhdHVzID09IFFTX0RPTkUpIHsKKyAgICAgICAgICAgIGZhbHNlX292ZXJydW4gPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChzY3NpcS0+ZXh0cmFfYnl0ZXMgIT0gMCkgeworICAgICAgICAgICAgICAgIHNjc2lxLT5yZW1haW5fYnl0ZXMgKz0gKEFEVl9EQ05UKSBzY3NpcS0+ZXh0cmFfYnl0ZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2NzaXEtPmQzLmRvbmVfc3RhdCA9PSBRRF9XSVRIX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKHNjc2lxLT5kMy5ob3N0X3N0YXQgPT0gUUhTVEFfTV9EQVRBX09WRVJfUlVOKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoc2NzaXEtPmNudGwgJiAoUUNfREFUQV9JTiB8IFFDX0RBVEFfT1VUKSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2NzaXEtPmQzLmRvbmVfc3RhdCA9IFFEX05PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgc2NzaXEtPmQzLmhvc3Rfc3RhdCA9IFFIU1RBX05PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZhbHNlX292ZXJydW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjc2lxLT5kMy5kb25lX3N0YXQgPSBRRF9OT19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjc2lxLT5kMy5ob3N0X3N0YXQgPSBRSFNUQV9OT19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NzaXEtPmQzLmhvc3Rfc3RhdCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUUhTVEFfTV9IVU5HX1JFUV9TQ1NJX0JVU19SRVNFVCkgeworICAgICAgICAgICAgICAgICAgICBBc2NTdG9wQ2hpcChpb3BfYmFzZSk7CisgICAgICAgICAgICAgICAgICAgIEFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoQ0NfU0NTSV9SRVNFVCB8IENDX0hBTFQpKTsKKyAgICAgICAgICAgICAgICAgICAgRHZjRGVsYXlOYW5vU2Vjb25kKGFzY19kdmMsIDYwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgQXNjU2V0Q2hpcENvbnRyb2woaW9wX2Jhc2UsIENDX0hBTFQpOworICAgICAgICAgICAgICAgICAgICBBc2NTZXRDaGlwU3RhdHVzKGlvcF9iYXNlLCBDSVdfQ0xSX1NDU0lfUkVTRVRfSU5UKTsKKyAgICAgICAgICAgICAgICAgICAgQXNjU2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIEFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHNjc2lxLT5jbnRsICYgUUNfTk9fQ0FMTEJBQ0spID09IDApIHsKKyAgICAgICAgICAgICAgICAoKmFzY19pc3JfY2FsbGJhY2spIChhc2NfZHZjLCBzY3NpcSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgoQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAocV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0NEQl9CRUcpKSA9PQorICAgICAgICAgICAgICAgICAgICAgU1RBUlRfU1RPUCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+dW5pdF9ub3RfcmVhZHkgJj0gfnRhcmdldF9pZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjc2lxLT5kMy5kb25lX3N0YXQgIT0gUURfTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPnN0YXJ0X21vdG9yICY9IH50YXJnZXRfaWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQXNjU2V0TGliRXJyb3JDb2RlKGFzY19kdmMsIEFTQ1FfRVJSX1FfU1RBVFVTKTsKKyAgICAgICAgICBGQVRBTF9FUlJfUURPTkU6CisgICAgICAgICAgICBpZiAoKHNjc2lxLT5jbnRsICYgUUNfTk9fQ0FMTEJBQ0spID09IDApIHsKKyAgICAgICAgICAgICAgICAoKmFzY19pc3JfY2FsbGJhY2spIChhc2NfZHZjLCBzY3NpcSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKDB4ODApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyBpbnQKK0FzY0lTUigKKyAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YworKQoreworICAgIEFTQ19DU19UWVBFICAgICAgICAgY2hpcHN0YXQ7CisgICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHNhdmVkX3JhbV9hZGRyOworICAgIHVjaGFyICAgICAgICAgICAgICAgY3RybF9yZWc7CisgICAgdWNoYXIgICAgICAgICAgICAgICBzYXZlZF9jdHJsX3JlZzsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGludF9wZW5kaW5nOworICAgIGludCAgICAgICAgICAgICAgICAgc3RhdHVzOworICAgIHVjaGFyICAgICAgICAgICAgICAgaG9zdF9mbGFnOworCisgICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKyAgICBpbnRfcGVuZGluZyA9IEZBTFNFOworCisgICAgaWYgKEFzY0lzSW50UGVuZGluZyhpb3BfYmFzZSkgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbnRfcGVuZGluZzsKKyAgICB9CisKKyAgICBpZiAoKChhc2NfZHZjLT5pbml0X3N0YXRlICYgQVNDX0lOSVRfU1RBVEVfRU5EX0xPQURfTUMpID09IDApCisgICAgICAgIHx8IChhc2NfZHZjLT5pc3JfY2FsbGJhY2sgPT0gMCkKKykgeworICAgICAgICByZXR1cm4gKEVSUik7CisgICAgfQorICAgIGlmIChhc2NfZHZjLT5pbl9jcml0aWNhbF9jbnQgIT0gMCkgeworICAgICAgICBBc2NTZXRMaWJFcnJvckNvZGUoYXNjX2R2YywgQVNDUV9FUlJfSVNSX09OX0NSSVRJQ0FMKTsKKyAgICAgICAgcmV0dXJuIChFUlIpOworICAgIH0KKyAgICBpZiAoYXNjX2R2Yy0+aXNfaW5faW50KSB7CisgICAgICAgIEFzY1NldExpYkVycm9yQ29kZShhc2NfZHZjLCBBU0NRX0VSUl9JU1JfUkVfRU5UUlkpOworICAgICAgICByZXR1cm4gKEVSUik7CisgICAgfQorICAgIGFzY19kdmMtPmlzX2luX2ludCA9IFRSVUU7CisgICAgY3RybF9yZWcgPSBBc2NHZXRDaGlwQ29udHJvbChpb3BfYmFzZSk7CisgICAgc2F2ZWRfY3RybF9yZWcgPSBjdHJsX3JlZyAmICh+KENDX1NDU0lfUkVTRVQgfCBDQ19DSElQX1JFU0VUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NfU0lOR0xFX1NURVAgfCBDQ19ESUFHIHwgQ0NfVEVTVCkpOworICAgIGNoaXBzdGF0ID0gQXNjR2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSk7CisgICAgaWYgKGNoaXBzdGF0ICYgQ1NXX1NDU0lfUkVTRVRfTEFUQ0gpIHsKKyAgICAgICAgaWYgKCEoYXNjX2R2Yy0+YnVzX3R5cGUgJiAoQVNDX0lTX1ZMIHwgQVNDX0lTX0VJU0EpKSkgeworICAgICAgICAgICAgaW50IGkgPSAxMDsKKyAgICAgICAgICAgIGludF9wZW5kaW5nID0gVFJVRTsKKyAgICAgICAgICAgIGFzY19kdmMtPnNkdHJfZG9uZSA9IDA7CisgICAgICAgICAgICBzYXZlZF9jdHJsX3JlZyAmPSAodWNoYXIpICh+Q0NfSEFMVCk7CisgICAgICAgICAgICB3aGlsZSAoKEFzY0dldENoaXBTdGF0dXMoaW9wX2Jhc2UpICYgQ1NXX1NDU0lfUkVTRVRfQUNUSVZFKSAmJgorICAgICAgICAgICAgICAgICAgIChpLS0gPiAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMTAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLCAoQ0NfQ0hJUF9SRVNFVCB8IENDX0hBTFQpKTsKKyAgICAgICAgICAgIEFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLCBDQ19IQUxUKTsKKyAgICAgICAgICAgIEFzY1NldENoaXBTdGF0dXMoaW9wX2Jhc2UsIENJV19DTFJfU0NTSV9SRVNFVF9JTlQpOworICAgICAgICAgICAgQXNjU2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSwgMCk7CisgICAgICAgICAgICBjaGlwc3RhdCA9IEFzY0dldENoaXBTdGF0dXMoaW9wX2Jhc2UpOworICAgICAgICB9CisgICAgfQorICAgIHNhdmVkX3JhbV9hZGRyID0gQXNjR2V0Q2hpcExyYW1BZGRyKGlvcF9iYXNlKTsKKyAgICBob3N0X2ZsYWcgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgIEFTQ1ZfSE9TVF9GTEFHX0IpICYgKHVjaGFyKSAofkFTQ19IT1NUX0ZMQUdfSU5fSVNSKTsKKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX0hPU1RfRkxBR19CLAorICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoaG9zdF9mbGFnIHwgKHVjaGFyKSBBU0NfSE9TVF9GTEFHX0lOX0lTUikpOworICAgIGlmICgoY2hpcHN0YXQgJiBDU1dfSU5UX1BFTkRJTkcpCisgICAgICAgIHx8IChpbnRfcGVuZGluZykKKykgeworICAgICAgICBBc2NBY2tJbnRlcnJ1cHQoaW9wX2Jhc2UpOworICAgICAgICBpbnRfcGVuZGluZyA9IFRSVUU7CisgICAgICAgIGlmICgoY2hpcHN0YXQgJiBDU1dfSEFMVEVEKSAmJgorICAgICAgICAgICAgKGN0cmxfcmVnICYgQ0NfU0lOR0xFX1NURVApKSB7CisgICAgICAgICAgICBpZiAoQXNjSXNyQ2hpcEhhbHRlZChhc2NfZHZjKSA9PSBFUlIpIHsKKyAgICAgICAgICAgICAgICBnb3RvIElTUl9SRVBPUlRfUURPTkVfRkFUQUxfRVJST1I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNhdmVkX2N0cmxfcmVnICY9ICh1Y2hhcikgKH5DQ19IQUxUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBJU1JfUkVQT1JUX1FET05FX0ZBVEFMX0VSUk9SOgorICAgICAgICAgICAgaWYgKChhc2NfZHZjLT5kdmNfY250bCAmIEFTQ19DTlRMX0lOVF9NVUxUSV9RKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCgoc3RhdHVzID0gQXNjSXNyUURvbmUoYXNjX2R2YykpICYgMHgwMSkgIT0gMCkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBpZiAoKHN0YXR1cyA9IEFzY0lzclFEb25lKGFzY19kdmMpKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKHN0YXR1cyA9PSAweDExKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoc3RhdHVzICYgMHg4MCkgIT0gMCkKKyAgICAgICAgICAgICAgICBpbnRfcGVuZGluZyA9IEVSUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX0hPU1RfRkxBR19CLCBob3N0X2ZsYWcpOworICAgIEFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgc2F2ZWRfcmFtX2FkZHIpOworICAgIEFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLCBzYXZlZF9jdHJsX3JlZyk7CisgICAgYXNjX2R2Yy0+aXNfaW5faW50ID0gRkFMU0U7CisgICAgcmV0dXJuIChpbnRfcGVuZGluZyk7Cit9CisKKy8qIE1pY3JvY29kZSBidWZmZXIgaXMga2VwdCBhZnRlciBpbml0aWFsaXphdGlvbiBmb3IgZXJyb3IgcmVjb3ZlcnkuICovCitTVEFUSUMgdWNoYXIgX2FzY19tY29kZV9idWZbXSA9Cit7CisgIDB4MDEsICAweDAzLCAgMHgwMSwgIDB4MTksICAweDBGLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgIDB4MEYsICAweDBGLCAgMHgwRiwgIDB4MEYsICAweDBGLCAgMHgwRiwgIDB4MEYsICAweDBGLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweEMzLCAgMHgxMiwgIDB4MEQsICAweDA1LCAgMHgwMSwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweEZGLCAgMHgwMCwgIDB4MDAsCisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweEZGLCAgMHg4MCwgIDB4RkYsICAweEZGLCAgMHgwMSwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MjMsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDcsICAweDAwLCAgMHhGRiwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgIDB4RkYsICAweEZGLCAgMHhGRiwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweEU0LCAgMHg4OCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgIDB4ODAsICAweDczLCAgMHg0OCwgIDB4MDQsICAweDM2LCAgMHgwMCwgIDB4MDAsICAweEEyLCAgMHhDMiwgIDB4MDAsICAweDgwLCAgMHg3MywgIDB4MDMsICAweDIzLCAgMHgzNiwgIDB4NDAsCisgIDB4QjYsICAweDAwLCAgMHgzNiwgIDB4MDAsICAweDA1LCAgMHhENiwgIDB4MEMsICAweEQyLCAgMHgxMiwgIDB4REEsICAweDAwLCAgMHhBMiwgIDB4QzIsICAweDAwLCAgMHg5MiwgIDB4ODAsCisgIDB4MUUsICAweDk4LCAgMHg1MCwgIDB4MDAsICAweEY1LCAgMHgwMCwgIDB4NDgsICAweDk4LCAgMHhERiwgIDB4MjMsICAweDM2LCAgMHg2MCwgIDB4QjYsICAweDAwLCAgMHg5MiwgIDB4ODAsCisgIDB4NEYsICAweDAwLCAgMHhGNSwgIDB4MDAsICAweDQ4LCAgMHg5OCwgIDB4RUYsICAweDIzLCAgMHgzNiwgIDB4NjAsICAweEI2LCAgMHgwMCwgIDB4OTIsICAweDgwLCAgMHg4MCwgIDB4NjIsCisgIDB4OTIsICAweDgwLCAgMHgwMCwgIDB4NDYsICAweDE1LCAgMHhFRSwgIDB4MTMsICAweEVBLCAgMHgwMiwgIDB4MDEsICAweDA5LCAgMHhEOCwgIDB4Q0QsICAweDA0LCAgMHg0RCwgIDB4MDAsCisgIDB4MDAsICAweEEzLCAgMHhENiwgIDB4MDAsICAweEE2LCAgMHg5NywgIDB4N0YsICAweDIzLCAgMHgwNCwgIDB4NjEsICAweDg0LCAgMHgwMSwgIDB4RTYsICAweDg0LCAgMHhEMiwgIDB4QzEsCisgIDB4ODAsICAweDczLCAgMHhDRCwgIDB4MDQsICAweDRELCAgMHgwMCwgIDB4MDAsICAweEEzLCAgMHhEQSwgIDB4MDEsICAweEE2LCAgMHg5NywgIDB4QzYsICAweDgxLCAgMHhDMiwgIDB4ODgsCisgIDB4ODAsICAweDczLCAgMHg4MCwgIDB4NzcsICAweDAwLCAgMHgwMSwgIDB4MDEsICAweEExLCAgMHhGRSwgIDB4MDAsICAweDRGLCAgMHgwMCwgIDB4ODQsICAweDk3LCAgMHgwNywgIDB4QTYsCisgIDB4MDgsICAweDAxLCAgMHgwMCwgIDB4MzMsICAweDAzLCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHgwMywgIDB4MDMsICAweDAxLCAgMHhERSwgIDB4QzIsICAweDg4LCAgMHhDRSwgIDB4MDAsCisgIDB4NjksICAweDYwLCAgMHhDRSwgIDB4MDAsICAweDAyLCAgMHgwMywgIDB4NEEsICAweDYwLCAgMHgwMCwgIDB4QTIsICAweDc4LCAgMHgwMSwgIDB4ODAsICAweDYzLCAgMHgwNywgIDB4QTYsCisgIDB4MjQsICAweDAxLCAgMHg3OCwgIDB4ODEsICAweDAzLCAgMHgwMywgIDB4ODAsICAweDYzLCAgMHhFMiwgIDB4MDAsICAweDA3LCAgMHhBNiwgIDB4MzQsICAweDAxLCAgMHgwMCwgIDB4MzMsCisgIDB4MDQsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDAzLCAgMHgwNywgIDB4MDIsICAweDAxLCAgMHgwNCwgIDB4Q0EsICAweDBELCAgMHgyMywgIDB4NjgsICAweDk4LCAgMHg0RCwgIDB4MDQsCisgIDB4MDQsICAweDg1LCAgMHgwNSwgIDB4RDgsICAweDBELCAgMHgyMywgIDB4NjgsICAweDk4LCAgMHhDRCwgIDB4MDQsICAweDE1LCAgMHgyMywgIDB4RjgsICAweDg4LCAgMHhGQiwgIDB4MjMsCisgIDB4MDIsICAweDYxLCAgMHg4MiwgIDB4MDEsICAweDgwLCAgMHg2MywgIDB4MDIsICAweDAzLCAgMHgwNiwgIDB4QTMsICAweDYyLCAgMHgwMSwgIDB4MDAsICAweDMzLCAgMHgwQSwgIDB4MDAsCisgIDB4QzIsICAweDg4LCAgMHg0RSwgIDB4MDAsICAweDA3LCAgMHhBMywgIDB4NkUsICAweDAxLCAgMHgwMCwgIDB4MzMsICAweDBCLCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHhDRCwgIDB4MDQsCisgIDB4MzYsICAweDJELCAgMHgwMCwgIDB4MzMsICAweDFBLCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHg1MCwgIDB4MDQsICAweDg4LCAgMHg4MSwgIDB4MDYsICAweEFCLCAgMHg4MiwgIDB4MDEsCisgIDB4ODgsICAweDgxLCAgMHg0RSwgIDB4MDAsICAweDA3LCAgMHhBMywgIDB4OTIsICAweDAxLCAgMHg1MCwgIDB4MDAsICAweDAwLCAgMHhBMywgIDB4M0MsICAweDAxLCAgMHgwMCwgIDB4MDUsCisgIDB4N0MsICAweDgxLCAgMHg0NiwgIDB4OTcsICAweDAyLCAgMHgwMSwgIDB4MDUsICAweEM2LCAgMHgwNCwgIDB4MjMsICAweEEwLCAgMHgwMSwgIDB4MTUsICAweDIzLCAgMHhBMSwgIDB4MDEsCisgIDB4QkUsICAweDgxLCAgMHhGRCwgIDB4MjMsICAweDAyLCAgMHg2MSwgIDB4ODIsICAweDAxLCAgMHgwQSwgIDB4REEsICAweDRBLCAgMHgwMCwgIDB4MDYsICAweDYxLCAgMHgwMCwgIDB4QTAsCisgIDB4QjQsICAweDAxLCAgMHg4MCwgIDB4NjMsICAweENELCAgMHgwNCwgIDB4MzYsICAweDJELCAgMHgwMCwgIDB4MzMsICAweDFCLCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHgwNiwgIDB4MjMsCisgIDB4NjgsICAweDk4LCAgMHhDRCwgIDB4MDQsICAweEU2LCAgMHg4NCwgIDB4MDYsICAweDAxLCAgMHgwMCwgIDB4QTIsICAweEQ0LCAgMHgwMSwgIDB4NTcsICAweDYwLCAgMHgwMCwgIDB4QTAsCisgIDB4REEsICAweDAxLCAgMHhFNiwgIDB4ODQsICAweDgwLCAgMHgyMywgIDB4QTAsICAweDAxLCAgMHhFNiwgIDB4ODQsICAweDgwLCAgMHg3MywgIDB4NEIsICAweDAwLCAgMHgwNiwgIDB4NjEsCisgIDB4MDAsICAweEEyLCAgMHgwMCwgIDB4MDIsICAweDA0LCAgMHgwMSwgIDB4MEMsICAweERFLCAgMHgwMiwgIDB4MDEsICAweDAzLCAgMHhDQywgIDB4NEYsICAweDAwLCAgMHg4NCwgIDB4OTcsCisgIDB4RkMsICAweDgxLCAgMHgwOCwgIDB4MjMsICAweDAyLCAgMHg0MSwgIDB4ODIsICAweDAxLCAgMHg0RiwgIDB4MDAsICAweDYyLCAgMHg5NywgIDB4NDgsICAweDA0LCAgMHg4NCwgIDB4ODAsCisgIDB4RjAsICAweDk3LCAgMHgwMCwgIDB4NDYsICAweDU2LCAgMHgwMCwgIDB4MDMsICAweEMwLCAgMHgwMSwgIDB4MjMsICAweEU4LCAgMHgwMCwgIDB4ODEsICAweDczLCAgMHgwNiwgIDB4MjksCisgIDB4MDMsICAweDQyLCAgMHgwNiwgIDB4RTIsICAweDAzLCAgMHhFRSwgIDB4NkIsICAweEVCLCAgMHgxMSwgIDB4MjMsICAweEY4LCAgMHg4OCwgIDB4MDQsICAweDk4LCAgMHhGMCwgIDB4ODAsCisgIDB4ODAsICAweDczLCAgMHg4MCwgIDB4NzcsICAweDA3LCAgMHhBNCwgIDB4MkEsICAweDAyLCAgMHg3QywgIDB4OTUsICAweDA2LCAgMHhBNiwgIDB4MzQsICAweDAyLCAgMHgwMywgIDB4QTYsCisgIDB4NEMsICAweDA0LCAgMHg0NiwgIDB4ODIsICAweDA0LCAgMHgwMSwgIDB4MDMsICAweEQ4LCAgMHhCNCwgIDB4OTgsICAweDZBLCAgMHg5NiwgIDB4NDYsICAweDgyLCAgMHhGRSwgIDB4OTUsCisgIDB4ODAsICAweDY3LCAgMHg4MywgIDB4MDMsICAweDgwLCAgMHg2MywgIDB4QjYsICAweDJELCAgMHgwMiwgIDB4QTYsICAweDZDLCAgMHgwMiwgIDB4MDcsICAweEE2LCAgMHg1QSwgIDB4MDIsCisgIDB4MDYsICAweEE2LCAgMHg1RSwgIDB4MDIsICAweDAzLCAgMHhBNiwgIDB4NjIsICAweDAyLCAgMHhDMiwgIDB4ODgsICAweDdDLCAgMHg5NSwgIDB4NDgsICAweDgyLCAgMHg2MCwgIDB4OTYsCisgIDB4NDgsICAweDgyLCAgMHgwNCwgIDB4MjMsICAweEEwLCAgMHgwMSwgIDB4MTQsICAweDIzLCAgMHhBMSwgIDB4MDEsICAweDNDLCAgMHg4NCwgIDB4MDQsICAweDAxLCAgMHgwQywgIDB4REMsCisgIDB4RTAsICAweDIzLCAgMHgyNSwgIDB4NjEsICAweEVGLCAgMHgwMCwgIDB4MTQsICAweDAxLCAgMHg0RiwgIDB4MDQsICAweEE4LCAgMHgwMSwgIDB4NkYsICAweDAwLCAgMHhBNSwgIDB4MDEsCisgIDB4MDMsICAweDIzLCAgMHhBNCwgIDB4MDEsICAweDA2LCAgMHgyMywgIDB4OUMsICAweDAxLCAgMHgyNCwgIDB4MkIsICAweDFDLCAgMHgwMSwgIDB4MDIsICAweEE2LCAgMHhBQSwgIDB4MDIsCisgIDB4MDcsICAweEE2LCAgMHg1QSwgIDB4MDIsICAweDA2LCAgMHhBNiwgIDB4NUUsICAweDAyLCAgMHgwMywgIDB4QTYsICAweDIwLCAgMHgwNCwgIDB4MDEsICAweEE2LCAgMHhCNCwgIDB4MDIsCisgIDB4MDAsICAweEE2LCAgMHhCNCwgIDB4MDIsICAweDAwLCAgMHgzMywgIDB4MTIsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDAwLCAgMHgwRSwgIDB4ODAsICAweDYzLCAgMHgwMCwgIDB4NDMsCisgIDB4MDAsICAweEEwLCAgMHg4QywgIDB4MDIsICAweDRELCAgMHgwNCwgIDB4MDQsICAweDAxLCAgMHgwQiwgIDB4REMsICAweEU3LCAgMHgyMywgIDB4MDQsICAweDYxLCAgMHg4NCwgIDB4MDEsCisgIDB4MTAsICAweDMxLCAgMHgxMiwgIDB4MzUsICAweDE0LCAgMHgwMSwgIDB4RUMsICAweDAwLCAgMHg2QywgIDB4MzgsICAweDAwLCAgMHgzRiwgIDB4MDAsICAweDAwLCAgMHhFQSwgIDB4ODIsCisgIDB4MTgsICAweDIzLCAgMHgwNCwgIDB4NjEsICAweDE4LCAgMHhBMCwgIDB4RTIsICAweDAyLCAgMHgwNCwgIDB4MDEsICAweEEyLCAgMHhDOCwgIDB4MDAsICAweDMzLCAgMHgxRiwgIDB4MDAsCisgIDB4QzIsICAweDg4LCAgMHgwOCwgIDB4MzEsICAweDBBLCAgMHgzNSwgIDB4MEMsICAweDM5LCAgMHgwRSwgIDB4M0QsICAweDdFLCAgMHg5OCwgIDB4QjYsICAweDJELCAgMHgwMSwgIDB4QTYsCisgIDB4MTQsICAweDAzLCAgMHgwMCwgIDB4QTYsICAweDE0LCAgMHgwMywgIDB4MDcsICAweEE2LCAgMHgwQywgIDB4MDMsICAweDA2LCAgMHhBNiwgIDB4MTAsICAweDAzLCAgMHgwMywgIDB4QTYsCisgIDB4MjAsICAweDA0LCAgMHgwMiwgIDB4QTYsICAweDZDLCAgMHgwMiwgIDB4MDAsICAweDMzLCAgMHgzMywgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4N0MsICAweDk1LCAgMHhFRSwgIDB4ODIsCisgIDB4NjAsICAweDk2LCAgMHhFRSwgIDB4ODIsICAweDgyLCAgMHg5OCwgIDB4ODAsICAweDQyLCAgMHg3RSwgIDB4OTgsICAweDY0LCAgMHhFNCwgIDB4MDQsICAweDAxLCAgMHgyRCwgIDB4QzgsCisgIDB4MzEsICAweDA1LCAgMHgwNywgIDB4MDEsICAweDAwLCAgMHhBMiwgIDB4NTQsICAweDAzLCAgMHgwMCwgIDB4NDMsICAweDg3LCAgMHgwMSwgIDB4MDUsICAweDA1LCAgMHg4NiwgIDB4OTgsCisgIDB4N0UsICAweDk4LCAgMHgwMCwgIDB4QTYsICAweDE2LCAgMHgwMywgIDB4MDcsICAweEE2LCAgMHg0QywgIDB4MDMsICAweDAzLCAgMHhBNiwgIDB4M0MsICAweDA0LCAgMHgwNiwgIDB4QTYsCisgIDB4NTAsICAweDAzLCAgMHgwMSwgIDB4QTYsICAweDE2LCAgMHgwMywgIDB4MDAsICAweDMzLCAgMHgyNSwgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4N0MsICAweDk1LCAgMHgzMiwgIDB4ODMsCisgIDB4NjAsICAweDk2LCAgMHgzMiwgIDB4ODMsICAweDA0LCAgMHgwMSwgIDB4MTAsICAweENFLCAgMHgwNywgIDB4QzgsICAweDA1LCAgMHgwNSwgIDB4RUIsICAweDA0LCAgMHgwMCwgIDB4MzMsCisgIDB4MDAsICAweDIwLCAgMHhDMCwgIDB4MjAsICAweDgxLCAgMHg2MiwgIDB4NzIsICAweDgzLCAgMHgwMCwgIDB4MDEsICAweDA1LCAgMHgwNSwgIDB4RkYsICAweEEyLCAgMHg3QSwgIDB4MDMsCisgIDB4QjEsICAweDAxLCAgMHgwOCwgIDB4MjMsICAweEIyLCAgMHgwMSwgIDB4MkUsICAweDgzLCAgMHgwNSwgIDB4MDUsICAweDE1LCAgMHgwMSwgIDB4MDAsICAweEEyLCAgMHg5QSwgIDB4MDMsCisgIDB4RUMsICAweDAwLCAgMHg2RSwgIDB4MDAsICAweDk1LCAgMHgwMSwgIDB4NkMsICAweDM4LCAgMHgwMCwgIDB4M0YsICAweDAwLCAgMHgwMCwgIDB4MDEsICAweEE2LCAgMHg5NiwgIDB4MDMsCisgIDB4MDAsICAweEE2LCAgMHg5NiwgIDB4MDMsICAweDEwLCAgMHg4NCwgIDB4ODAsICAweDQyLCAgMHg3RSwgIDB4OTgsICAweDAxLCAgMHhBNiwgIDB4QTQsICAweDAzLCAgMHgwMCwgIDB4QTYsCisgIDB4QkMsICAweDAzLCAgMHgxMCwgIDB4ODQsICAweEE4LCAgMHg5OCwgIDB4ODAsICAweDQyLCAgMHgwMSwgIDB4QTYsICAweEE0LCAgMHgwMywgIDB4MDcsICAweEE2LCAgMHhCMiwgIDB4MDMsCisgIDB4RDQsICAweDgzLCAgMHg3QywgIDB4OTUsICAweEE4LCAgMHg4MywgIDB4MDAsICAweDMzLCAgMHgyRiwgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4QTgsICAweDk4LCAgMHg4MCwgIDB4NDIsCisgIDB4MDAsICAweEE2LCAgMHhCQywgIDB4MDMsICAweDA3LCAgMHhBNiwgIDB4Q0EsICAweDAzLCAgMHhENCwgIDB4ODMsICAweDdDLCAgMHg5NSwgIDB4QzAsICAweDgzLCAgMHgwMCwgIDB4MzMsCisgIDB4MjYsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDM4LCAgMHgyQiwgIDB4ODAsICAweDMyLCAgMHg4MCwgIDB4MzYsICAweDA0LCAgMHgyMywgIDB4QTAsICAweDAxLCAgMHgxMiwgIDB4MjMsCisgIDB4QTEsICAweDAxLCAgMHgxMCwgIDB4ODQsICAweDA3LCAgMHhGMCwgIDB4MDYsICAweEE0LCAgMHhGNCwgIDB4MDMsICAweDgwLCAgMHg2QiwgIDB4ODAsICAweDY3LCAgMHgwNSwgIDB4MjMsCisgIDB4ODMsICAweDAzLCAgMHg4MCwgIDB4NjMsICAweDAzLCAgMHhBNiwgIDB4MEUsICAweDA0LCAgMHgwNywgIDB4QTYsICAweDA2LCAgMHgwNCwgIDB4MDYsICAweEE2LCAgMHgwQSwgIDB4MDQsCisgIDB4MDAsICAweDMzLCAgMHgxNywgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4N0MsICAweDk1LCAgMHhGNCwgIDB4ODMsICAweDYwLCAgMHg5NiwgIDB4RjQsICAweDgzLCAgMHgyMCwgIDB4ODQsCisgIDB4MDcsICAweEYwLCAgMHgwNiwgIDB4QTQsICAweDIwLCAgMHgwNCwgIDB4ODAsICAweDZCLCAgMHg4MCwgIDB4NjcsICAweDA1LCAgMHgyMywgIDB4ODMsICAweDAzLCAgMHg4MCwgIDB4NjMsCisgIDB4QjYsICAweDJELCAgMHgwMywgIDB4QTYsICAweDNDLCAgMHgwNCwgIDB4MDcsICAweEE2LCAgMHgzNCwgIDB4MDQsICAweDA2LCAgMHhBNiwgIDB4MzgsICAweDA0LCAgMHgwMCwgIDB4MzMsCisgIDB4MzAsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDdDLCAgMHg5NSwgIDB4MjAsICAweDg0LCAgMHg2MCwgIDB4OTYsICAweDIwLCAgMHg4NCwgIDB4MUQsICAweDAxLCAgMHgwNiwgIDB4Q0MsCisgIDB4MDAsICAweDMzLCAgMHgwMCwgIDB4ODQsICAweEMwLCAgMHgyMCwgIDB4MDAsICAweDIzLCAgMHhFQSwgIDB4MDAsICAweDgxLCAgMHg2MiwgIDB4QTIsICAweDBELCAgMHg4MCwgIDB4NjMsCisgIDB4MDcsICAweEE2LCAgMHg1QSwgIDB4MDQsICAweDAwLCAgMHgzMywgIDB4MTgsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDAzLCAgMHgwMywgIDB4ODAsICAweDYzLCAgMHhBMywgIDB4MDEsCisgIDB4MDcsICAweEE0LCAgMHg2NCwgIDB4MDQsICAweDIzLCAgMHgwMSwgIDB4MDAsICAweEEyLCAgMHg4NiwgIDB4MDQsICAweDBBLCAgMHhBMCwgIDB4NzYsICAweDA0LCAgMHhFMCwgIDB4MDAsCisgIDB4MDAsICAweDMzLCAgMHgxRCwgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4MEIsICAweEEwLCAgMHg4MiwgIDB4MDQsICAweEUwLCAgMHgwMCwgIDB4MDAsICAweDMzLCAgMHgxRSwgIDB4MDAsCisgIDB4QzIsICAweDg4LCAgMHg0MiwgIDB4MjMsICAweEY4LCAgMHg4OCwgIDB4MDAsICAweDIzLCAgMHgyMiwgIDB4QTMsICAweEU2LCAgMHgwNCwgIDB4MDgsICAweDIzLCAgMHgyMiwgIDB4QTMsCisgIDB4QTIsICAweDA0LCAgMHgyOCwgIDB4MjMsICAweDIyLCAgMHhBMywgIDB4QUUsICAweDA0LCAgMHgwMiwgIDB4MjMsICAweDIyLCAgMHhBMywgIDB4QzQsICAweDA0LCAgMHg0MiwgIDB4MjMsCisgIDB4RjgsICAweDg4LCAgMHg0QSwgIDB4MDAsICAweDA2LCAgMHg2MSwgIDB4MDAsICAweEEwLCAgMHhBRSwgIDB4MDQsICAweDQ1LCAgMHgyMywgIDB4RjgsICAweDg4LCAgMHgwNCwgIDB4OTgsCisgIDB4MDAsICAweEEyLCAgMHhDMCwgIDB4MDQsICAweEI0LCAgMHg5OCwgIDB4MDAsICAweDMzLCAgMHgwMCwgIDB4ODIsICAweEMwLCAgMHgyMCwgIDB4ODEsICAweDYyLCAgMHhFOCwgIDB4ODEsCisgIDB4NDcsICAweDIzLCAgMHhGOCwgIDB4ODgsICAweDA0LCAgMHgwMSwgIDB4MEIsICAweERFLCAgMHgwNCwgIDB4OTgsICAweEI0LCAgMHg5OCwgIDB4MDAsICAweDMzLCAgMHgwMCwgIDB4ODEsCisgIDB4QzAsICAweDIwLCAgMHg4MSwgIDB4NjIsICAweDE0LCAgMHgwMSwgIDB4MDAsICAweEEwLCAgMHgwMCwgIDB4MDIsICAweDQzLCAgMHgyMywgIDB4RjgsICAweDg4LCAgMHgwNCwgIDB4MjMsCisgIDB4QTAsICAweDAxLCAgMHg0NCwgIDB4MjMsICAweEExLCAgMHgwMSwgIDB4ODAsICAweDczLCAgMHg0RCwgIDB4MDAsICAweDAzLCAgMHhBMywgIDB4RjQsICAweDA0LCAgMHgwMCwgIDB4MzMsCisgIDB4MjcsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDA0LCAgMHgwMSwgIDB4MDQsICAweERDLCAgMHgwMiwgIDB4MjMsICAweEEyLCAgMHgwMSwgIDB4MDQsICAweDIzLCAgMHhBMCwgIDB4MDEsCisgIDB4MDQsICAweDk4LCAgMHgyNiwgIDB4OTUsICAweDRCLCAgMHgwMCwgIDB4RjYsICAweDAwLCAgMHg0RiwgIDB4MDQsICAweDRGLCAgMHgwMCwgIDB4MDAsICAweEEzLCAgMHgyMiwgIDB4MDUsCisgIDB4MDAsICAweDA1LCAgMHg3NiwgIDB4MDAsICAweDA2LCAgMHg2MSwgIDB4MDAsICAweEEyLCAgMHgxQywgIDB4MDUsICAweDBBLCAgMHg4NSwgIDB4NDYsICAweDk3LCAgMHhDRCwgIDB4MDQsCisgIDB4MjQsICAweDg1LCAgMHg0OCwgIDB4MDQsICAweDg0LCAgMHg4MCwgIDB4MDIsICAweDAxLCAgMHgwMywgIDB4REEsICAweDgwLCAgMHgyMywgIDB4ODIsICAweDAxLCAgMHgzNCwgIDB4ODUsCisgIDB4MDIsICAweDIzLCAgMHhBMCwgIDB4MDEsICAweDRBLCAgMHgwMCwgIDB4MDYsICAweDYxLCAgMHgwMCwgIDB4QTIsICAweDQwLCAgMHgwNSwgIDB4MUQsICAweDAxLCAgMHgwNCwgIDB4RDYsCisgIDB4RkYsICAweDIzLCAgMHg4NiwgIDB4NDEsICAweDRCLCAgMHg2MCwgIDB4Q0IsICAweDAwLCAgMHhGRiwgIDB4MjMsICAweDgwLCAgMHgwMSwgIDB4NDksICAweDAwLCAgMHg4MSwgIDB4MDEsCisgIDB4MDQsICAweDAxLCAgMHgwMiwgIDB4QzgsICAweDMwLCAgMHgwMSwgIDB4ODAsICAweDAxLCAgMHhGNywgIDB4MDQsICAweDAzLCAgMHgwMSwgIDB4NDksICAweDA0LCAgMHg4MCwgIDB4MDEsCisgIDB4QzksICAweDAwLCAgMHgwMCwgIDB4MDUsICAweDAwLCAgMHgwMSwgIDB4RkYsICAweEEwLCAgMHg2MCwgIDB4MDUsICAweDc3LCAgMHgwNCwgIDB4MDEsICAweDIzLCAgMHhFQSwgIDB4MDAsCisgIDB4NUQsICAweDAwLCAgMHhGRSwgIDB4QzcsICAweDAwLCAgMHg2MiwgIDB4MDAsICAweDIzLCAgMHhFQSwgIDB4MDAsICAweDAwLCAgMHg2MywgIDB4MDcsICAweEE0LCAgMHhGOCwgIDB4MDUsCisgIDB4MDMsICAweDAzLCAgMHgwMiwgIDB4QTAsICAweDhFLCAgMHgwNSwgIDB4RjQsICAweDg1LCAgMHgwMCwgIDB4MzMsICAweDJELCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHgwNCwgIDB4QTAsCisgIDB4QjgsICAweDA1LCAgMHg4MCwgIDB4NjMsICAweDAwLCAgMHgyMywgIDB4REYsICAweDAwLCAgMHg0QSwgIDB4MDAsICAweDA2LCAgMHg2MSwgIDB4MDAsICAweEEyLCAgMHhBNCwgIDB4MDUsCisgIDB4MUQsICAweDAxLCAgMHgwNiwgIDB4RDYsICAweDAyLCAgMHgyMywgIDB4MDIsICAweDQxLCAgMHg4MiwgIDB4MDEsICAweDUwLCAgMHgwMCwgIDB4NjIsICAweDk3LCAgMHgwNCwgIDB4ODUsCisgIDB4MDQsICAweDIzLCAgMHgwMiwgIDB4NDEsICAweDgyLCAgMHgwMSwgIDB4MDQsICAweDg1LCAgMHgwOCwgIDB4QTAsICAweEJFLCAgMHgwNSwgIDB4RjQsICAweDg1LCAgMHgwMywgIDB4QTAsCisgIDB4QzQsICAweDA1LCAgMHhGNCwgIDB4ODUsICAweDAxLCAgMHhBMCwgIDB4Q0UsICAweDA1LCAgMHg4OCwgIDB4MDAsICAweDgwLCAgMHg2MywgIDB4Q0MsICAweDg2LCAgMHgwNywgIDB4QTAsCisgIDB4RUUsICAweDA1LCAgMHg1RiwgIDB4MDAsICAweDAwLCAgMHgyQiwgIDB4REYsICAweDA4LCAgMHgwMCwgIDB4QTIsICAweEU2LCAgMHgwNSwgIDB4ODAsICAweDY3LCAgMHg4MCwgIDB4NjMsCisgIDB4MDEsICAweEEyLCAgMHg3QSwgIDB4MDYsICAweDdDLCAgMHg4NSwgIDB4MDYsICAweDIzLCAgMHg2OCwgIDB4OTgsICAweDQ4LCAgMHgyMywgIDB4RjgsICAweDg4LCAgMHgwNywgIDB4MjMsCisgIDB4ODAsICAweDAwLCAgMHgwNiwgIDB4ODcsICAweDgwLCAgMHg2MywgIDB4N0MsICAweDg1LCAgMHgwMCwgIDB4MjMsICAweERGLCAgMHgwMCwgIDB4MDAsICAweDYzLCAgMHg0QSwgIDB4MDAsCisgIDB4MDYsICAweDYxLCAgMHgwMCwgIDB4QTIsICAweDM2LCAgMHgwNiwgIDB4MUQsICAweDAxLCAgMHgxNiwgIDB4RDQsICAweEMwLCAgMHgyMywgIDB4MDcsICAweDQxLCAgMHg4MywgIDB4MDMsCisgIDB4ODAsICAweDYzLCAgMHgwNiwgIDB4QTYsICAweDFDLCAgMHgwNiwgIDB4MDAsICAweDMzLCAgMHgzNywgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4MUQsICAweDAxLCAgMHgwMSwgIDB4RDYsCisgIDB4MjAsICAweDIzLCAgMHg2MywgIDB4NjAsICAweDgzLCAgMHgwMywgIDB4ODAsICAweDYzLCAgMHgwMiwgIDB4MjMsICAweERGLCAgMHgwMCwgIDB4MDcsICAweEE2LCAgMHg3QywgIDB4MDUsCisgIDB4RUYsICAweDA0LCAgMHg2RiwgIDB4MDAsICAweDAwLCAgMHg2MywgIDB4NEIsICAweDAwLCAgMHgwNiwgIDB4NDEsICAweENCLCAgMHgwMCwgIDB4NTIsICAweDAwLCAgMHgwNiwgIDB4NjEsCisgIDB4MDAsICAweEEyLCAgMHg0RSwgIDB4MDYsICAweDFELCAgMHgwMSwgIDB4MDMsICAweENBLCAgMHhDMCwgIDB4MjMsICAweDA3LCAgMHg0MSwgIDB4MDAsICAweDYzLCAgMHgxRCwgIDB4MDEsCisgIDB4MDQsICAweENDLCAgMHgwMCwgIDB4MzMsICAweDAwLCAgMHg4MywgIDB4QzAsICAweDIwLCAgMHg4MSwgIDB4NjIsICAweDgwLCAgMHgyMywgIDB4MDcsICAweDQxLCAgMHgwMCwgIDB4NjMsCisgIDB4ODAsICAweDY3LCAgMHgwOCwgIDB4MjMsICAweDgzLCAgMHgwMywgIDB4ODAsICAweDYzLCAgMHgwMCwgIDB4NjMsICAweDAxLCAgMHgyMywgIDB4REYsICAweDAwLCAgMHgwNiwgIDB4QTYsCisgIDB4ODQsICAweDA2LCAgMHgwNywgIDB4QTYsICAweDdDLCAgMHgwNSwgIDB4ODAsICAweDY3LCAgMHg4MCwgIDB4NjMsICAweDAwLCAgMHgzMywgIDB4MDAsICAweDQwLCAgMHhDMCwgIDB4MjAsCisgIDB4ODEsICAweDYyLCAgMHgwMCwgIDB4NjMsICAweDAwLCAgMHgwMCwgIDB4RkUsICAweDk1LCAgMHg4MywgIDB4MDMsICAweDgwLCAgMHg2MywgIDB4MDYsICAweEE2LCAgMHg5NCwgIDB4MDYsCisgIDB4MDcsICAweEE2LCAgMHg3QywgIDB4MDUsICAweDAwLCAgMHgwMCwgIDB4MDEsICAweEEwLCAgMHgxNCwgIDB4MDcsICAweDAwLCAgMHgyQiwgIDB4NDAsICAweDBFLCAgMHg4MCwgIDB4NjMsCisgIDB4MDEsICAweDAwLCAgMHgwNiwgIDB4QTYsICAweEFBLCAgMHgwNiwgIDB4MDcsICAweEE2LCAgMHg3QywgIDB4MDUsICAweDQwLCAgMHgwRSwgIDB4ODAsICAweDYzLCAgMHgwMCwgIDB4NDMsCisgIDB4MDAsICAweEEwLCAgMHhBMiwgIDB4MDYsICAweDA2LCAgMHhBNiwgIDB4QkMsICAweDA2LCAgMHgwNywgIDB4QTYsICAweDdDLCAgMHgwNSwgIDB4ODAsICAweDY3LCAgMHg0MCwgIDB4MEUsCisgIDB4ODAsICAweDYzLCAgMHgwNywgIDB4QTYsICAweDdDLCAgMHgwNSwgIDB4MDAsICAweDIzLCAgMHhERiwgIDB4MDAsICAweDAwLCAgMHg2MywgIDB4MDcsICAweEE2LCAgMHhENiwgIDB4MDYsCisgIDB4MDAsICAweDMzLCAgMHgyQSwgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4MDMsICAweDAzLCAgMHg4MCwgIDB4NjMsICAweDg5LCAgMHgwMCwgIDB4MEEsICAweDJCLCAgMHgwNywgIDB4QTYsCisgIDB4RTgsICAweDA2LCAgMHgwMCwgIDB4MzMsICAweDI5LCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHgwMCwgIDB4NDMsICAweDAwLCAgMHhBMiwgIDB4RjQsICAweDA2LCAgMHhDMCwgIDB4MEUsCisgIDB4ODAsICAweDYzLCAgMHhERSwgIDB4ODYsICAweEMwLCAgMHgwRSwgIDB4MDAsICAweDMzLCAgMHgwMCwgIDB4ODAsICAweEMwLCAgMHgyMCwgIDB4ODEsICAweDYyLCAgMHgwNCwgIDB4MDEsCisgIDB4MDIsICAweERBLCAgMHg4MCwgIDB4NjMsICAweDdDLCAgMHg4NSwgIDB4ODAsICAweDdCLCAgMHg4MCwgIDB4NjMsICAweDA2LCAgMHhBNiwgIDB4OEMsICAweDA2LCAgMHgwMCwgIDB4MzMsCisgIDB4MkMsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDBDLCAgMHhBMiwgIDB4MkUsICAweDA3LCAgMHhGRSwgIDB4OTUsICAweDgzLCAgMHgwMywgIDB4ODAsICAweDYzLCAgMHgwNiwgIDB4QTYsCisgIDB4MkMsICAweDA3LCAgMHgwNywgIDB4QTYsICAweDdDLCAgMHgwNSwgIDB4MDAsICAweDMzLCAgMHgzRCwgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4MDAsICAweDAwLCAgMHg4MCwgIDB4NjcsCisgIDB4ODMsICAweDAzLCAgMHg4MCwgIDB4NjMsICAweDBDLCAgMHhBMCwgIDB4NDQsICAweDA3LCAgMHgwNywgIDB4QTYsICAweDdDLCAgMHgwNSwgIDB4QkYsICAweDIzLCAgMHgwNCwgIDB4NjEsCisgIDB4ODQsICAweDAxLCAgMHhFNiwgIDB4ODQsICAweDAwLCAgMHg2MywgIDB4RjAsICAweDA0LCAgMHgwMSwgIDB4MDEsICAweEYxLCAgMHgwMCwgIDB4MDAsICAweDAxLCAgMHhGMiwgIDB4MDAsCisgIDB4MDEsICAweDA1LCAgMHg4MCwgIDB4MDEsICAweDcyLCAgMHgwNCwgIDB4NzEsICAweDAwLCAgMHg4MSwgIDB4MDEsICAweDcwLCAgMHgwNCwgIDB4ODAsICAweDA1LCAgMHg4MSwgIDB4MDUsCisgIDB4MDAsICAweDYzLCAgMHhGMCwgIDB4MDQsICAweEYyLCAgMHgwMCwgIDB4NzIsICAweDA0LCAgMHgwMSwgIDB4MDEsICAweEYxLCAgMHgwMCwgIDB4NzAsICAweDAwLCAgMHg4MSwgIDB4MDEsCisgIDB4NzAsICAweDA0LCAgMHg3MSwgIDB4MDAsICAweDgxLCAgMHgwMSwgIDB4NzIsICAweDAwLCAgMHg4MCwgIDB4MDEsICAweDcxLCAgMHgwNCwgIDB4NzAsICAweDAwLCAgMHg4MCwgIDB4MDEsCisgIDB4NzAsICAweDA0LCAgMHgwMCwgIDB4NjMsICAweEYwLCAgMHgwNCwgIDB4RjIsICAweDAwLCAgMHg3MiwgIDB4MDQsICAweDAwLCAgMHgwMSwgIDB4RjEsICAweDAwLCAgMHg3MCwgIDB4MDAsCisgIDB4ODAsICAweDAxLCAgMHg3MCwgIDB4MDQsICAweDcxLCAgMHgwMCwgIDB4ODAsICAweDAxLCAgMHg3MiwgIDB4MDAsICAweDgxLCAgMHgwMSwgIDB4NzEsICAweDA0LCAgMHg3MCwgIDB4MDAsCisgIDB4ODEsICAweDAxLCAgMHg3MCwgIDB4MDQsICAweDAwLCAgMHg2MywgIDB4MDAsICAweDIzLCAgMHhCMywgIDB4MDEsICAweDgzLCAgMHgwNSwgIDB4QTMsICAweDAxLCAgMHhBMiwgIDB4MDEsCisgIDB4QTEsICAweDAxLCAgMHgwMSwgIDB4MjMsICAweEEwLCAgMHgwMSwgIDB4MDAsICAweDAxLCAgMHhDOCwgIDB4MDAsICAweDAzLCAgMHhBMSwgIDB4QzQsICAweDA3LCAgMHgwMCwgIDB4MzMsCisgIDB4MDcsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDgwLCAgMHgwNSwgIDB4ODEsICAweDA1LCAgMHgwNCwgIDB4MDEsICAweDExLCAgMHhDOCwgIDB4NDgsICAweDAwLCAgMHhCMCwgIDB4MDEsCisgIDB4QjEsICAweDAxLCAgMHgwOCwgIDB4MjMsICAweEIyLCAgMHgwMSwgIDB4MDUsICAweDAxLCAgMHg0OCwgIDB4MDQsICAweDAwLCAgMHg0MywgIDB4MDAsICAweEEyLCAgMHhFNCwgIDB4MDcsCisgIDB4MDAsICAweDA1LCAgMHhEQSwgIDB4ODcsICAweDAwLCAgMHgwMSwgIDB4QzgsICAweDAwLCAgMHhGRiwgIDB4MjMsICAweDgwLCAgMHgwMSwgIDB4MDUsICAweDA1LCAgMHgwMCwgIDB4NjMsCisgIDB4RjcsICAweDA0LCAgMHgxQSwgIDB4MDksICAweEY2LCAgMHgwOCwgIDB4NkUsICAweDA0LCAgMHgwMCwgIDB4MDIsICAweDgwLCAgMHg0MywgIDB4NzYsICAweDA4LCAgMHg4MCwgIDB4MDIsCisgIDB4NzcsICAweDA0LCAgMHgwMCwgIDB4NjMsICAweEY3LCAgMHgwNCwgIDB4MUEsICAweDA5LCAgMHhGNiwgIDB4MDgsICAweDZFLCAgMHgwNCwgIDB4MDAsICAweDAyLCAgMHgwMCwgIDB4QTAsCisgIDB4MTQsICAweDA4LCAgMHgxNiwgIDB4ODgsICAweDAwLCAgMHg0MywgIDB4NzYsICAweDA4LCAgMHg4MCwgIDB4MDIsICAweDc3LCAgMHgwNCwgIDB4MDAsICAweDYzLCAgMHhGMywgIDB4MDQsCisgIDB4MDAsICAweDIzLCAgMHhGNCwgIDB4MDAsICAweDc0LCAgMHgwMCwgIDB4ODAsICAweDQzLCAgMHhGNCwgIDB4MDAsICAweENGLCAgMHg0MCwgIDB4MDAsICAweEEyLCAgMHg0NCwgIDB4MDgsCisgIDB4NzQsICAweDA0LCAgMHgwMiwgIDB4MDEsICAweEY3LCAgMHhDOSwgIDB4RjYsICAweEQ5LCAgMHgwMCwgIDB4MDEsICAweDAxLCAgMHhBMSwgIDB4MjQsICAweDA4LCAgMHgwNCwgIDB4OTgsCisgIDB4MjYsICAweDk1LCAgMHgyNCwgIDB4ODgsICAweDczLCAgMHgwNCwgIDB4MDAsICAweDYzLCAgMHhGMywgIDB4MDQsICAweDc1LCAgMHgwNCwgIDB4NUEsICAweDg4LCAgMHgwMiwgIDB4MDEsCisgIDB4MDQsICAweEQ4LCAgMHg0NiwgIDB4OTcsICAweDA0LCAgMHg5OCwgIDB4MjYsICAweDk1LCAgMHg0QSwgIDB4ODgsICAweDc1LCAgMHgwMCwgIDB4MDAsICAweEEzLCAgMHg2NCwgIDB4MDgsCisgIDB4MDAsICAweDA1LCAgMHg0RSwgIDB4ODgsICAweDczLCAgMHgwNCwgIDB4MDAsICAweDYzLCAgMHg4MCwgIDB4N0IsICAweDgwLCAgMHg2MywgIDB4MDYsICAweEE2LCAgMHg3NiwgIDB4MDgsCisgIDB4MDAsICAweDMzLCAgMHgzRSwgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4ODAsICAweDY3LCAgMHg4MywgIDB4MDMsICAweDgwLCAgMHg2MywgIDB4MDAsICAweDYzLCAgMHgzOCwgIDB4MkIsCisgIDB4OUMsICAweDg4LCAgMHgzOCwgIDB4MkIsICAweDkyLCAgMHg4OCwgIDB4MzIsICAweDA5LCAgMHgzMSwgIDB4MDUsICAweDkyLCAgMHg5OCwgIDB4MDUsICAweDA1LCAgMHhCMiwgIDB4MDksCisgIDB4MDAsICAweDYzLCAgMHgwMCwgIDB4MzIsICAweDAwLCAgMHgzNiwgIDB4MDAsICAweDNBLCAgMHgwMCwgIDB4M0UsICAweDAwLCAgMHg2MywgIDB4ODAsICAweDMyLCAgMHg4MCwgIDB4MzYsCisgIDB4ODAsICAweDNBLCAgMHg4MCwgIDB4M0UsICAweEI0LCAgMHgzRCwgIDB4MDAsICAweDYzLCAgMHgzOCwgIDB4MkIsICAweDQwLCAgMHgzMiwgIDB4NDAsICAweDM2LCAgMHg0MCwgIDB4M0EsCisgIDB4NDAsICAweDNFLCAgMHgwMCwgIDB4NjMsICAweDVBLCAgMHgyMCwgIDB4QzksICAweDQwLCAgMHgwMCwgIDB4QTAsICAweEI0LCAgMHgwOCwgIDB4NUQsICAweDAwLCAgMHhGRSwgIDB4QzMsCisgIDB4MDAsICAweDYzLCAgMHg4MCwgIDB4NzMsICAweEU2LCAgMHgyMCwgIDB4MDIsICAweDIzLCAgMHhFOCwgIDB4MDAsICAweDgyLCAgMHg3MywgIDB4RkYsICAweEZELCAgMHg4MCwgIDB4NzMsCisgIDB4MTMsICAweDIzLCAgMHhGOCwgIDB4ODgsICAweDY2LCAgMHgyMCwgIDB4QzAsICAweDIwLCAgMHgwNCwgIDB4MjMsICAweEEwLCAgMHgwMSwgIDB4QTEsICAweDIzLCAgMHhBMSwgIDB4MDEsCisgIDB4ODEsICAweDYyLCAgMHhFMiwgIDB4ODgsICAweDgwLCAgMHg3MywgIDB4ODAsICAweDc3LCAgMHg2OCwgIDB4MDAsICAweDAwLCAgMHhBMiwgIDB4ODAsICAweDAwLCAgMHgwMywgIDB4QzIsCisgIDB4RjEsICAweEM3LCAgMHg0MSwgIDB4MjMsICAweEY4LCAgMHg4OCwgIDB4MTEsICAweDIzLCAgMHhBMSwgIDB4MDEsICAweDA0LCAgMHgyMywgIDB4QTAsICAweDAxLCAgMHhFNiwgIDB4ODQsCit9OworCitTVEFUSUMgdXNob3J0IF9hc2NfbWNvZGVfc2l6ZSA9IHNpemVvZihfYXNjX21jb2RlX2J1Zik7CitTVEFUSUMgQURWX0RDTlQgX2FzY19tY29kZV9jaGtzdW0gPSAweDAxMkM0NTNGVUw7CisKKyNkZWZpbmUgQVNDX1NZTl9PRkZTRVRfT05FX0RJU0FCTEVfTElTVCAgMTYKK1NUQVRJQyB1Y2hhciBfc3luX29mZnNldF9vbmVfZGlzYWJsZV9jbWRbQVNDX1NZTl9PRkZTRVRfT05FX0RJU0FCTEVfTElTVF0gPQoreworICAgIElOUVVJUlksCisgICAgUkVRVUVTVF9TRU5TRSwKKyAgICBSRUFEX0NBUEFDSVRZLAorICAgIFJFQURfVE9DLAorICAgIE1PREVfU0VMRUNULAorICAgIE1PREVfU0VOU0UsCisgICAgTU9ERV9TRUxFQ1RfMTAsCisgICAgTU9ERV9TRU5TRV8xMCwKKyAgICAweEZGLAorICAgIDB4RkYsCisgICAgMHhGRiwKKyAgICAweEZGLAorICAgIDB4RkYsCisgICAgMHhGRiwKKyAgICAweEZGLAorICAgIDB4RkYKK307CisKK1NUQVRJQyBpbnQKK0FzY0V4ZVNjc2lRdWV1ZSgKKyAgICAgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgICBBU0NfU0NTSV9RICpzY3NpcQorKQoreworICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7CisgICAgdWxvbmcgICAgICAgICAgICAgICBsYXN0X2ludF9sZXZlbDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHN0YTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG5fcV9yZXF1aXJlZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRpc2FibGVfc3luX29mZnNldF9vbmVfZml4OworICAgIGludCAgICAgICAgICAgICAgICAgaTsKKyAgICBBU0NfUEFERFIgICAgICAgICAgIGFkZHI7CisgICAgQVNDX0VYRV9DQUxMQkFDSyAgICBhc2NfZXhlX2NhbGxiYWNrOworICAgIHVzaG9ydCAgICAgICAgICAgICAgc2dfZW50cnlfY250ID0gMDsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHNnX2VudHJ5X2NudF9taW51c19vbmUgPSAwOworICAgIHVjaGFyICAgICAgICAgICAgICAgdGFyZ2V0X2l4OworICAgIHVjaGFyICAgICAgICAgICAgICAgdGlkX25vOworICAgIHVjaGFyICAgICAgICAgICAgICAgc2R0cl9kYXRhOworICAgIHVjaGFyICAgICAgICAgICAgICAgZXh0cmFfYnl0ZXM7CisgICAgdWNoYXIgICAgICAgICAgICAgICBzY3NpX2NtZDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGRpc2FibGVfY21kOworICAgIEFTQ19TR19IRUFEICAgICAgICAgKnNnX2hlYWQ7CisgICAgQVNDX0RDTlQgICAgICAgICAgICBkYXRhX2NudDsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisgICAgc2dfaGVhZCA9IHNjc2lxLT5zZ19oZWFkOworICAgIGFzY19leGVfY2FsbGJhY2sgPSBhc2NfZHZjLT5leGVfY2FsbGJhY2s7CisgICAgaWYgKGFzY19kdmMtPmVycl9jb2RlICE9IDApCisgICAgICAgIHJldHVybiAoRVJSKTsKKyAgICBpZiAoc2NzaXEgPT0gKEFTQ19TQ1NJX1EgKikgMEwpIHsKKyAgICAgICAgQXNjU2V0TGliRXJyb3JDb2RlKGFzY19kdmMsIEFTQ1FfRVJSX1NDU0lRX05VTExfUFRSKTsKKyAgICAgICAgcmV0dXJuIChFUlIpOworICAgIH0KKyAgICBzY3NpcS0+cTEucV9ubyA9IDA7CisgICAgaWYgKChzY3NpcS0+cTIudGFnX2NvZGUgJiBBU0NfVEFHX0ZMQUdfRVhUUkFfQllURVMpID09IDApIHsKKyAgICAgICAgc2NzaXEtPnExLmV4dHJhX2J5dGVzID0gMDsKKyAgICB9CisgICAgc3RhID0gMDsKKyAgICB0YXJnZXRfaXggPSBzY3NpcS0+cTIudGFyZ2V0X2l4OworICAgIHRpZF9ubyA9IEFTQ19USVhfVE9fVElEKHRhcmdldF9peCk7CisgICAgbl9xX3JlcXVpcmVkID0gMTsKKyAgICBpZiAoc2NzaXEtPmNkYnB0clswXSA9PSBSRVFVRVNUX1NFTlNFKSB7CisgICAgICAgIGlmICgoYXNjX2R2Yy0+aW5pdF9zZHRyICYgc2NzaXEtPnExLnRhcmdldF9pZCkgIT0gMCkgeworICAgICAgICAgICAgYXNjX2R2Yy0+c2R0cl9kb25lICY9IH5zY3NpcS0+cTEudGFyZ2V0X2lkOworICAgICAgICAgICAgc2R0cl9kYXRhID0gQXNjR2V0TUNvZGVJbml0U0RUUkF0SUQoaW9wX2Jhc2UsIHRpZF9ubyk7CisgICAgICAgICAgICBBc2NNc2dPdXRTRFRSKGFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFsoc2R0cl9kYXRhID4+IDQpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoYXNjX2R2Yy0+bWF4X3NkdHJfaW5kZXggLSAxKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhcikgKHNkdHJfZGF0YSAmICh1Y2hhcikgQVNDX1NZTl9NQVhfT0ZGU0VUKSk7CisgICAgICAgICAgICBzY3NpcS0+cTEuY250bCB8PSAoUUNfTVNHX09VVCB8IFFDX1VSR0VOVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbGFzdF9pbnRfbGV2ZWwgPSBEdmNFbnRlckNyaXRpY2FsKCk7CisgICAgaWYgKGFzY19kdmMtPmluX2NyaXRpY2FsX2NudCAhPSAwKSB7CisgICAgICAgIER2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOworICAgICAgICBBc2NTZXRMaWJFcnJvckNvZGUoYXNjX2R2YywgQVNDUV9FUlJfQ1JJVElDQUxfUkVfRU5UUlkpOworICAgICAgICByZXR1cm4gKEVSUik7CisgICAgfQorICAgIGFzY19kdmMtPmluX2NyaXRpY2FsX2NudCsrOworICAgIGlmICgoc2NzaXEtPnExLmNudGwgJiBRQ19TR19IRUFEKSAhPSAwKSB7CisgICAgICAgIGlmICgoc2dfZW50cnlfY250ID0gc2dfaGVhZC0+ZW50cnlfY250KSA9PSAwKSB7CisgICAgICAgICAgICBhc2NfZHZjLT5pbl9jcml0aWNhbF9jbnQtLTsKKyAgICAgICAgICAgIER2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOworICAgICAgICAgICAgcmV0dXJuIChFUlIpOworICAgICAgICB9CisjaWYgIUNDX1ZFUllfTE9OR19TR19MSVNUCisgICAgICAgIGlmIChzZ19lbnRyeV9jbnQgPiBBU0NfTUFYX1NHX0xJU1QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzY19kdmMtPmluX2NyaXRpY2FsX2NudC0tOworICAgICAgICAgICAgRHZjTGVhdmVDcml0aWNhbChsYXN0X2ludF9sZXZlbCk7CisgICAgICAgICAgICByZXR1cm4oRVJSKTsKKyAgICAgICAgfQorI2VuZGlmIC8qICFDQ19WRVJZX0xPTkdfU0dfTElTVCAqLworICAgICAgICBpZiAoc2dfZW50cnlfY250ID09IDEpIHsKKyAgICAgICAgICAgIHNjc2lxLT5xMS5kYXRhX2FkZHIgPSAoQURWX1BBRERSKSBzZ19oZWFkLT5zZ19saXN0WzBdLmFkZHI7CisgICAgICAgICAgICBzY3NpcS0+cTEuZGF0YV9jbnQgPSAoQURWX0RDTlQpIHNnX2hlYWQtPnNnX2xpc3RbMF0uYnl0ZXM7CisgICAgICAgICAgICBzY3NpcS0+cTEuY250bCAmPSB+KFFDX1NHX0hFQUQgfCBRQ19TR19TV0FQX1FVRVVFKTsKKyAgICAgICAgfQorICAgICAgICBzZ19lbnRyeV9jbnRfbWludXNfb25lID0gc2dfZW50cnlfY250IC0gMTsKKyAgICB9CisgICAgc2NzaV9jbWQgPSBzY3NpcS0+Y2RicHRyWzBdOworICAgIGRpc2FibGVfc3luX29mZnNldF9vbmVfZml4ID0gRkFMU0U7CisgICAgaWYgKChhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciAmIHNjc2lxLT5xMS50YXJnZXRfaWQpICYmCisgICAgICAgICEoYXNjX2R2Yy0+cGNpX2ZpeF9hc3luX3hmZXJfYWx3YXlzICYgc2NzaXEtPnExLnRhcmdldF9pZCkpIHsKKyAgICAgICAgaWYgKHNjc2lxLT5xMS5jbnRsICYgUUNfU0dfSEVBRCkgeworICAgICAgICAgICAgZGF0YV9jbnQgPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNnX2VudHJ5X2NudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGF0YV9jbnQgKz0gKEFEVl9EQ05UKSBsZTMyX3RvX2NwdShzZ19oZWFkLT5zZ19saXN0W2ldLmJ5dGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGFfY250ID0gbGUzMl90b19jcHUoc2NzaXEtPnExLmRhdGFfY250KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGF0YV9jbnQgIT0gMFVMKSB7CisgICAgICAgICAgICBpZiAoZGF0YV9jbnQgPCA1MTJVTCkgeworICAgICAgICAgICAgICAgIGRpc2FibGVfc3luX29mZnNldF9vbmVfZml4ID0gVFJVRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEFTQ19TWU5fT0ZGU0VUX09ORV9ESVNBQkxFX0xJU1Q7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBkaXNhYmxlX2NtZCA9IF9zeW5fb2Zmc2V0X29uZV9kaXNhYmxlX2NtZFtpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpc2FibGVfY21kID09IDB4RkYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzY3NpX2NtZCA9PSBkaXNhYmxlX2NtZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZV9zeW5fb2Zmc2V0X29uZV9maXggPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRpc2FibGVfc3luX29mZnNldF9vbmVfZml4KSB7CisgICAgICAgIHNjc2lxLT5xMi50YWdfY29kZSAmPSB+TVNHX1NJTVBMRV9UQUc7CisgICAgICAgIHNjc2lxLT5xMi50YWdfY29kZSB8PSAoQVNDX1RBR19GTEFHX0RJU0FCTEVfQVNZTl9VU0VfU1lOX0ZJWCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDX1RBR19GTEFHX0RJU0FCTEVfRElTQ09OTkVDVCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2NzaXEtPnEyLnRhZ19jb2RlICY9IDB4Mjc7CisgICAgfQorICAgIGlmICgoc2NzaXEtPnExLmNudGwgJiBRQ19TR19IRUFEKSAhPSAwKSB7CisgICAgICAgIGlmIChhc2NfZHZjLT5idWdfZml4X2NudGwpIHsKKyAgICAgICAgICAgIGlmIChhc2NfZHZjLT5idWdfZml4X2NudGwgJiBBU0NfQlVHX0ZJWF9JRl9OT1RfRFdCKSB7CisgICAgICAgICAgICAgICAgaWYgKChzY3NpX2NtZCA9PSBSRUFEXzYpIHx8CisgICAgICAgICAgICAgICAgICAgIChzY3NpX2NtZCA9PSBSRUFEXzEwKSkgeworICAgICAgICAgICAgICAgICAgICBhZGRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChBRFZfUEFERFIpIGxlMzJfdG9fY3B1KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnX2hlYWQtPnNnX2xpc3Rbc2dfZW50cnlfY250X21pbnVzX29uZV0uYWRkcikgKworICAgICAgICAgICAgICAgICAgICAgICAgKEFEVl9EQ05UKSBsZTMyX3RvX2NwdSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ19oZWFkLT5zZ19saXN0W3NnX2VudHJ5X2NudF9taW51c19vbmVdLmJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFfYnl0ZXMgPSAodWNoYXIpICgodXNob3J0KSBhZGRyICYgMHgwMDAzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChleHRyYV9ieXRlcyAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChzY3NpcS0+cTIudGFnX2NvZGUgJiBBU0NfVEFHX0ZMQUdfRVhUUkFfQllURVMpCisgICAgICAgICAgICAgICAgICAgICAgICAgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjc2lxLT5xMi50YWdfY29kZSB8PSBBU0NfVEFHX0ZMQUdfRVhUUkFfQllURVM7CisgICAgICAgICAgICAgICAgICAgICAgICBzY3NpcS0+cTEuZXh0cmFfYnl0ZXMgPSBleHRyYV9ieXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfY250ID0gbGUzMl90b19jcHUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dfaGVhZC0+c2dfbGlzdFtzZ19lbnRyeV9jbnRfbWludXNfb25lXS5ieXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2NudCAtPSAoQVNDX0RDTlQpIGV4dHJhX2J5dGVzOworICAgICAgICAgICAgICAgICAgICAgICAgc2dfaGVhZC0+c2dfbGlzdFtzZ19lbnRyeV9jbnRfbWludXNfb25lXS5ieXRlcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1X3RvX2xlMzIoZGF0YV9jbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNnX2hlYWQtPmVudHJ5X3RvX2NvcHkgPSBzZ19oZWFkLT5lbnRyeV9jbnQ7CisjaWYgQ0NfVkVSWV9MT05HX1NHX0xJU1QKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRoZSBzZ19lbnRyeV9jbnQgdG8gdGhlIG1heGltdW0gcG9zc2libGUuIFRoZSByZXN0IG9mCisgICAgICAgICAqIHRoZSBTRyBlbGVtZW50cyB3aWxsIGJlIGNvcGllZCB3aGVuIHRoZSBSSVNDIGNvbXBsZXRlcyB0aGUKKyAgICAgICAgICogU0cgZWxlbWVudHMgdGhhdCBmaXQgYW5kIGhhbHRzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNnX2VudHJ5X2NudCA+IEFTQ19NQVhfU0dfTElTVCkKKyAgICAgICAgeworICAgICAgICAgICAgIHNnX2VudHJ5X2NudCA9IEFTQ19NQVhfU0dfTElTVDsKKyAgICAgICAgfQorI2VuZGlmIC8qIENDX1ZFUllfTE9OR19TR19MSVNUICovCisgICAgICAgIG5fcV9yZXF1aXJlZCA9IEFzY1NnTGlzdFRvUXVldWUoc2dfZW50cnlfY250KTsKKyAgICAgICAgaWYgKChBc2NHZXROdW1PZkZyZWVRdWV1ZShhc2NfZHZjLCB0YXJnZXRfaXgsIG5fcV9yZXF1aXJlZCkgPj0KKyAgICAgICAgICAgICh1aW50KSBuX3FfcmVxdWlyZWQpIHx8ICgoc2NzaXEtPnExLmNudGwgJiBRQ19VUkdFTlQpICE9IDApKSB7CisgICAgICAgICAgICBpZiAoKHN0YSA9IEFzY1NlbmRTY3NpUXVldWUoYXNjX2R2Yywgc2NzaXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9xX3JlcXVpcmVkKSkgPT0gMSkgeworICAgICAgICAgICAgICAgIGFzY19kdmMtPmluX2NyaXRpY2FsX2NudC0tOworICAgICAgICAgICAgICAgIGlmIChhc2NfZXhlX2NhbGxiYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgKCphc2NfZXhlX2NhbGxiYWNrKSAoYXNjX2R2Yywgc2NzaXEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEdmNMZWF2ZUNyaXRpY2FsKGxhc3RfaW50X2xldmVsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHN0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYXNjX2R2Yy0+YnVnX2ZpeF9jbnRsKSB7CisgICAgICAgICAgICBpZiAoYXNjX2R2Yy0+YnVnX2ZpeF9jbnRsICYgQVNDX0JVR19GSVhfSUZfTk9UX0RXQikgeworICAgICAgICAgICAgICAgIGlmICgoc2NzaV9jbWQgPT0gUkVBRF82KSB8fAorICAgICAgICAgICAgICAgICAgICAoc2NzaV9jbWQgPT0gUkVBRF8xMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkciA9IGxlMzJfdG9fY3B1KHNjc2lxLT5xMS5kYXRhX2FkZHIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1KHNjc2lxLT5xMS5kYXRhX2NudCk7CisgICAgICAgICAgICAgICAgICAgIGV4dHJhX2J5dGVzID0gKHVjaGFyKSAoKHVzaG9ydCkgYWRkciAmIDB4MDAwMyk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoZXh0cmFfYnl0ZXMgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgoc2NzaXEtPnEyLnRhZ19jb2RlICYgQVNDX1RBR19GTEFHX0VYVFJBX0JZVEVTKQorICAgICAgICAgICAgICAgICAgICAgICAgICA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9jbnQgPSBsZTMyX3RvX2NwdShzY3NpcS0+cTEuZGF0YV9jbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgodXNob3J0KSBkYXRhX2NudCAmIDB4MDFGRikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjc2lxLT5xMi50YWdfY29kZSB8PSBBU0NfVEFHX0ZMQUdfRVhUUkFfQllURVM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9jbnQgLT0gKEFTQ19EQ05UKSBleHRyYV9ieXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3NpcS0+cTEuZGF0YV9jbnQgPSBjcHVfdG9fbGUzMihkYXRhX2NudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NzaXEtPnExLmV4dHJhX2J5dGVzID0gZXh0cmFfYnl0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbl9xX3JlcXVpcmVkID0gMTsKKyAgICAgICAgaWYgKChBc2NHZXROdW1PZkZyZWVRdWV1ZShhc2NfZHZjLCB0YXJnZXRfaXgsIDEpID49IDEpIHx8CisgICAgICAgICAgICAoKHNjc2lxLT5xMS5jbnRsICYgUUNfVVJHRU5UKSAhPSAwKSkgeworICAgICAgICAgICAgaWYgKChzdGEgPSBBc2NTZW5kU2NzaVF1ZXVlKGFzY19kdmMsIHNjc2lxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fcV9yZXF1aXJlZCkpID09IDEpIHsKKyAgICAgICAgICAgICAgICBhc2NfZHZjLT5pbl9jcml0aWNhbF9jbnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYXNjX2V4ZV9jYWxsYmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICgqYXNjX2V4ZV9jYWxsYmFjaykgKGFzY19kdmMsIHNjc2lxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRHZjTGVhdmVDcml0aWNhbChsYXN0X2ludF9sZXZlbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGFzY19kdmMtPmluX2NyaXRpY2FsX2NudC0tOworICAgIER2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOworICAgIHJldHVybiAoc3RhKTsKK30KKworU1RBVElDIGludAorQXNjU2VuZFNjc2lRdWV1ZSgKKyAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgIEFTQ19TQ1NJX1EgKnNjc2lxLAorICAgICAgICAgICAgICAgICAgICB1Y2hhciBuX3FfcmVxdWlyZWQKKykKK3sKKyAgICBQb3J0QWRkciAgICAgICAgICAgIGlvcF9iYXNlOworICAgIHVjaGFyICAgICAgICAgICAgICAgZnJlZV9xX2hlYWQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBuZXh0X3FwOworICAgIHVjaGFyICAgICAgICAgICAgICAgdGlkX25vOworICAgIHVjaGFyICAgICAgICAgICAgICAgdGFyZ2V0X2l4OworICAgIGludCAgICAgICAgICAgICAgICAgc3RhOworCisgICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKyAgICB0YXJnZXRfaXggPSBzY3NpcS0+cTIudGFyZ2V0X2l4OworICAgIHRpZF9ubyA9IEFTQ19USVhfVE9fVElEKHRhcmdldF9peCk7CisgICAgc3RhID0gMDsKKyAgICBmcmVlX3FfaGVhZCA9ICh1Y2hhcikgQXNjR2V0VmFyRnJlZVFIZWFkKGlvcF9iYXNlKTsKKyAgICBpZiAobl9xX3JlcXVpcmVkID4gMSkgeworICAgICAgICBpZiAoKG5leHRfcXAgPSBBc2NBbGxvY011bHRpcGxlRnJlZVF1ZXVlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9xX2hlYWQsICh1Y2hhcikgKG5fcV9yZXF1aXJlZCkpKQorICAgICAgICAgICAgIT0gKHVjaGFyKSBBU0NfUUxJTktfRU5EKSB7CisgICAgICAgICAgICBhc2NfZHZjLT5sYXN0X3Ffc2hvcnRhZ2UgPSAwOworICAgICAgICAgICAgc2NzaXEtPnNnX2hlYWQtPnF1ZXVlX2NudCA9IG5fcV9yZXF1aXJlZCAtIDE7CisgICAgICAgICAgICBzY3NpcS0+cTEucV9ubyA9IGZyZWVfcV9oZWFkOworICAgICAgICAgICAgaWYgKChzdGEgPSBBc2NQdXRSZWFkeVNnTGlzdFF1ZXVlKGFzY19kdmMsIHNjc2lxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcV9oZWFkKSkgPT0gMSkgeworICAgICAgICAgICAgICAgIEFzY1B1dFZhckZyZWVRSGVhZChpb3BfYmFzZSwgbmV4dF9xcCk7CisgICAgICAgICAgICAgICAgYXNjX2R2Yy0+Y3VyX3RvdGFsX3FuZyArPSAodWNoYXIpIChuX3FfcmVxdWlyZWQpOworICAgICAgICAgICAgICAgIGFzY19kdmMtPmN1cl9kdmNfcW5nW3RpZF9ub10rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoc3RhKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobl9xX3JlcXVpcmVkID09IDEpIHsKKyAgICAgICAgaWYgKChuZXh0X3FwID0gQXNjQWxsb2NGcmVlUXVldWUoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcV9oZWFkKSkgIT0gQVNDX1FMSU5LX0VORCkgeworICAgICAgICAgICAgc2NzaXEtPnExLnFfbm8gPSBmcmVlX3FfaGVhZDsKKyAgICAgICAgICAgIGlmICgoc3RhID0gQXNjUHV0UmVhZHlRdWV1ZShhc2NfZHZjLCBzY3NpcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX3FfaGVhZCkpID09IDEpIHsKKyAgICAgICAgICAgICAgICBBc2NQdXRWYXJGcmVlUUhlYWQoaW9wX2Jhc2UsIG5leHRfcXApOworICAgICAgICAgICAgICAgIGFzY19kdmMtPmN1cl90b3RhbF9xbmcrKzsKKyAgICAgICAgICAgICAgICBhc2NfZHZjLT5jdXJfZHZjX3FuZ1t0aWRfbm9dKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKHN0YSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChzdGEpOworfQorCitTVEFUSUMgaW50CitBc2NTZ0xpc3RUb1F1ZXVlKAorICAgICAgICAgICAgICAgICAgICBpbnQgc2dfbGlzdAorKQoreworICAgIGludCAgICAgICAgICAgICAgICAgbl9zZ19saXN0X3FzOworCisgICAgbl9zZ19saXN0X3FzID0gKChzZ19saXN0IC0gMSkgLyBBU0NfU0dfTElTVF9QRVJfUSk7CisgICAgaWYgKCgoc2dfbGlzdCAtIDEpICUgQVNDX1NHX0xJU1RfUEVSX1EpICE9IDApCisgICAgICAgIG5fc2dfbGlzdF9xcysrOworICAgIHJldHVybiAobl9zZ19saXN0X3FzICsgMSk7Cit9CisKKworU1RBVElDIHVpbnQKK0FzY0dldE51bU9mRnJlZVF1ZXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciB0YXJnZXRfaXgsCisgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciBuX3FzCispCit7CisgICAgdWludCAgICAgICAgICAgICAgICBjdXJfdXNlZF9xczsKKyAgICB1aW50ICAgICAgICAgICAgICAgIGN1cl9mcmVlX3FzOworICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIHRhcmdldF9pZDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHRpZF9ubzsKKworICAgIHRhcmdldF9pZCA9IEFTQ19USVhfVE9fVEFSR0VUX0lEKHRhcmdldF9peCk7CisgICAgdGlkX25vID0gQVNDX1RJWF9UT19USUQodGFyZ2V0X2l4KTsKKyAgICBpZiAoKGFzY19kdmMtPnVuaXRfbm90X3JlYWR5ICYgdGFyZ2V0X2lkKSB8fAorICAgICAgICAoYXNjX2R2Yy0+cXVldWVfZnVsbF9vcl9idXN5ICYgdGFyZ2V0X2lkKSkgeworICAgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgICBpZiAobl9xcyA9PSAxKSB7CisgICAgICAgIGN1cl91c2VkX3FzID0gKHVpbnQpIGFzY19kdmMtPmN1cl90b3RhbF9xbmcgKworICAgICAgICAgICh1aW50KSBhc2NfZHZjLT5sYXN0X3Ffc2hvcnRhZ2UgKworICAgICAgICAgICh1aW50KSBBU0NfTUlOX0ZSRUVfUTsKKyAgICB9IGVsc2UgeworICAgICAgICBjdXJfdXNlZF9xcyA9ICh1aW50KSBhc2NfZHZjLT5jdXJfdG90YWxfcW5nICsKKyAgICAgICAgICAodWludCkgQVNDX01JTl9GUkVFX1E7CisgICAgfQorICAgIGlmICgodWludCkgKGN1cl91c2VkX3FzICsgbl9xcykgPD0gKHVpbnQpIGFzY19kdmMtPm1heF90b3RhbF9xbmcpIHsKKyAgICAgICAgY3VyX2ZyZWVfcXMgPSAodWludCkgYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyAtIGN1cl91c2VkX3FzOworICAgICAgICBpZiAoYXNjX2R2Yy0+Y3VyX2R2Y19xbmdbdGlkX25vXSA+PQorICAgICAgICAgICAgYXNjX2R2Yy0+bWF4X2R2Y19xbmdbdGlkX25vXSkgeworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGN1cl9mcmVlX3FzKTsKKyAgICB9CisgICAgaWYgKG5fcXMgPiAxKSB7CisgICAgICAgIGlmICgobl9xcyA+IGFzY19kdmMtPmxhc3RfcV9zaG9ydGFnZSkgJiYgKG5fcXMgPD0gKGFzY19kdmMtPm1heF90b3RhbF9xbmcgLSBBU0NfTUlOX0ZSRUVfUSkpKSB7CisgICAgICAgICAgICBhc2NfZHZjLT5sYXN0X3Ffc2hvcnRhZ2UgPSBuX3FzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyBpbnQKK0FzY1B1dFJlYWR5UXVldWUoCisgICAgICAgICAgICAgICAgICAgIEFTQ19EVkNfVkFSICphc2NfZHZjLAorICAgICAgICAgICAgICAgICAgICBBU0NfU0NTSV9RICpzY3NpcSwKKyAgICAgICAgICAgICAgICAgICAgdWNoYXIgcV9ubworKQoreworICAgIHVzaG9ydCAgICAgICAgICAgICAgcV9hZGRyOworICAgIHVjaGFyICAgICAgICAgICAgICAgdGlkX25vOworICAgIHVjaGFyICAgICAgICAgICAgICAgc2R0cl9kYXRhOworICAgIHVjaGFyICAgICAgICAgICAgICAgc3luX3BlcmlvZF9peDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHN5bl9vZmZzZXQ7CisgICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisgICAgaWYgKCgoYXNjX2R2Yy0+aW5pdF9zZHRyICYgc2NzaXEtPnExLnRhcmdldF9pZCkgIT0gMCkgJiYKKyAgICAgICAgKChhc2NfZHZjLT5zZHRyX2RvbmUgJiBzY3NpcS0+cTEudGFyZ2V0X2lkKSA9PSAwKSkgeworICAgICAgICB0aWRfbm8gPSBBU0NfVElYX1RPX1RJRChzY3NpcS0+cTIudGFyZ2V0X2l4KTsKKyAgICAgICAgc2R0cl9kYXRhID0gQXNjR2V0TUNvZGVJbml0U0RUUkF0SUQoaW9wX2Jhc2UsIHRpZF9ubyk7CisgICAgICAgIHN5bl9wZXJpb2RfaXggPSAoc2R0cl9kYXRhID4+IDQpICYgKGFzY19kdmMtPm1heF9zZHRyX2luZGV4IC0gMSk7CisgICAgICAgIHN5bl9vZmZzZXQgPSBzZHRyX2RhdGEgJiBBU0NfU1lOX01BWF9PRkZTRVQ7CisgICAgICAgIEFzY01zZ091dFNEVFIoYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90Ymxbc3luX3BlcmlvZF9peF0sCisgICAgICAgICAgICAgICAgICAgICAgc3luX29mZnNldCk7CisgICAgICAgIHNjc2lxLT5xMS5jbnRsIHw9IFFDX01TR19PVVQ7CisgICAgfQorICAgIHFfYWRkciA9IEFTQ19RTk9fVE9fUUFERFIocV9ubyk7CisgICAgaWYgKChzY3NpcS0+cTEudGFyZ2V0X2lkICYgYXNjX2R2Yy0+dXNlX3RhZ2dlZF9xbmcpID09IDApIHsKKyAgICAgICAgc2NzaXEtPnEyLnRhZ19jb2RlICY9IH5NU0dfU0lNUExFX1RBRyA7CisgICAgfQorICAgIHNjc2lxLT5xMS5zdGF0dXMgPSBRU19GUkVFOworICAgIEFzY01lbVdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHFfYWRkciArIEFTQ19TQ1NJUV9DREJfQkVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhciAqKSBzY3NpcS0+Y2RicHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNjc2lxLT5xMi5jZGJfbGVuID4+IDEpOworCisgICAgRHZjUHV0U2NzaVEoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgcV9hZGRyICsgQVNDX1NDU0lRX0NQWV9CRUcsCisgICAgICAgICAgICAgICAgKHVjaGFyICopICZzY3NpcS0+cTEuY250bCwKKyAgICAgICAgICAgICAgICAoKHNpemVvZihBU0NfU0NTSVFfMSkgKyBzaXplb2YoQVNDX1NDU0lRXzIpKSAvIDIpIC0gMSk7CisgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9TVEFUVVMpLAorICAgICAgICAgICAgICh1c2hvcnQpICgoKHVzaG9ydCkgc2NzaXEtPnExLnFfbm8gPDwgOCkgfCAodXNob3J0KSBRU19SRUFEWSkpOworICAgIHJldHVybiAoMSk7Cit9CisKK1NUQVRJQyBpbnQKK0FzY1B1dFJlYWR5U2dMaXN0UXVldWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ19EVkNfVkFSICphc2NfZHZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NfU0NTSV9RICpzY3NpcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgcV9ubworKQoreworICAgIGludCAgICAgICAgICAgICAgICAgc3RhOworICAgIGludCAgICAgICAgICAgICAgICAgaTsKKyAgICBBU0NfU0dfSEVBRCAqc2dfaGVhZDsKKyAgICBBU0NfU0dfTElTVF9RICAgICAgIHNjc2lfc2dfcTsKKyAgICBBU0NfRENOVCAgICAgICAgICAgIHNhdmVkX2RhdGFfYWRkcjsKKyAgICBBU0NfRENOVCAgICAgICAgICAgIHNhdmVkX2RhdGFfY250OworICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7CisgICAgdXNob3J0ICAgICAgICAgICAgICBzZ19saXN0X2R3b3JkczsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHNnX2luZGV4OworICAgIHVzaG9ydCAgICAgICAgICAgICAgc2dfZW50cnlfY250OworICAgIHVzaG9ydCAgICAgICAgICAgICAgcV9hZGRyOworICAgIHVjaGFyICAgICAgICAgICAgICAgbmV4dF9xcDsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisgICAgc2dfaGVhZCA9IHNjc2lxLT5zZ19oZWFkOworICAgIHNhdmVkX2RhdGFfYWRkciA9IHNjc2lxLT5xMS5kYXRhX2FkZHI7CisgICAgc2F2ZWRfZGF0YV9jbnQgPSBzY3NpcS0+cTEuZGF0YV9jbnQ7CisgICAgc2NzaXEtPnExLmRhdGFfYWRkciA9IChBU0NfUEFERFIpIHNnX2hlYWQtPnNnX2xpc3RbMF0uYWRkcjsKKyAgICBzY3NpcS0+cTEuZGF0YV9jbnQgPSAoQVNDX0RDTlQpIHNnX2hlYWQtPnNnX2xpc3RbMF0uYnl0ZXM7CisjaWYgQ0NfVkVSWV9MT05HX1NHX0xJU1QKKyAgICAvKgorICAgICAqIElmIHNnX2hlYWQtPmVudHJ5X2NudCBpcyBncmVhdGVyIHRoYW4gQVNDX01BWF9TR19MSVNUCisgICAgICogdGhlbiBub3QgYWxsIFNHIGVsZW1lbnRzIHdpbGwgZml0IGluIHRoZSBhbGxvY2F0ZWQgcXVldWVzLgorICAgICAqIFRoZSByZXN0IG9mIHRoZSBTRyBlbGVtZW50cyB3aWxsIGJlIGNvcGllZCB3aGVuIHRoZSBSSVNDCisgICAgICogY29tcGxldGVzIHRoZSBTRyBlbGVtZW50cyB0aGF0IGZpdCBhbmQgaGFsdHMuCisgICAgICovCisgICAgaWYgKHNnX2hlYWQtPmVudHJ5X2NudCA+IEFTQ19NQVhfU0dfTElTVCkKKyAgICB7CisgICAgICAgICAvKgorICAgICAgICAgICogU2V0IHNnX2VudHJ5X2NudCB0byBiZSB0aGUgbnVtYmVyIG9mIFNHIGVsZW1lbnRzIHRoYXQKKyAgICAgICAgICAqIHdpbGwgZml0IGluIHRoZSBhbGxvY2F0ZWQgU0cgcXVldWVzLiBJdCBpcyBtaW51cyAxLCBiZWNhdXNlCisgICAgICAgICAgKiB0aGUgZmlyc3QgU0cgZWxlbWVudCBpcyBoYW5kbGVkIGFib3ZlLiBBU0NfTUFYX1NHX0xJU1QgaXMKKyAgICAgICAgICAqIGFscmVhZHkgaW5mbGF0ZWQgYnkgMSB0byBhY2NvdW50IGZvciB0aGlzLiBGb3IgZXhhbXBsZSBpdAorICAgICAgICAgICogbWF5IGJlIDUwIHdoaWNoIGlzIDEgKyA3IHF1ZXVlcyAqIDcgU0cgZWxlbWVudHMuCisgICAgICAgICAgKi8KKyAgICAgICAgIHNnX2VudHJ5X2NudCA9IEFTQ19NQVhfU0dfTElTVCAtIDE7CisKKyAgICAgICAgIC8qCisgICAgICAgICAgKiBLZWVwIHRyYWNrIG9mIHJlbWFpbmluZyBudW1iZXIgb2YgU0cgZWxlbWVudHMgdGhhdCB3aWxsCisgICAgICAgICAgKiBuZWVkIHRvIGJlIGhhbmRsZWQgZnJvbSBhX2lzci5jLgorICAgICAgICAgICovCisgICAgICAgICBzY3NpcS0+cmVtYWluX3NnX2VudHJ5X2NudCA9IHNnX2hlYWQtPmVudHJ5X2NudCAtIEFTQ19NQVhfU0dfTElTVDsKKyAgICB9IGVsc2UKKyAgICB7CisjZW5kaWYgLyogQ0NfVkVSWV9MT05HX1NHX0xJU1QgKi8KKyAgICAgICAgIC8qCisgICAgICAgICAgKiBTZXQgc2dfZW50cnlfY250IHRvIGJlIHRoZSBudW1iZXIgb2YgU0cgZWxlbWVudHMgdGhhdAorICAgICAgICAgICogd2lsbCBmaXQgaW4gdGhlIGFsbG9jYXRlZCBTRyBxdWV1ZXMuIEl0IGlzIG1pbnVzIDEsIGJlY2F1c2UKKyAgICAgICAgICAqIHRoZSBmaXJzdCBTRyBlbGVtZW50IGlzIGhhbmRsZWQgYWJvdmUuCisgICAgICAgICAgKi8KKyAgICAgICAgIHNnX2VudHJ5X2NudCA9IHNnX2hlYWQtPmVudHJ5X2NudCAtIDE7CisjaWYgQ0NfVkVSWV9MT05HX1NHX0xJU1QKKyAgICB9CisjZW5kaWYgLyogQ0NfVkVSWV9MT05HX1NHX0xJU1QgKi8KKyAgICBpZiAoc2dfZW50cnlfY250ICE9IDApIHsKKyAgICAgICAgc2NzaXEtPnExLmNudGwgfD0gUUNfU0dfSEVBRDsKKyAgICAgICAgcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihxX25vKTsKKyAgICAgICAgc2dfaW5kZXggPSAxOworICAgICAgICBzY3NpcS0+cTEuc2dfcXVldWVfY250ID0gc2dfaGVhZC0+cXVldWVfY250OworICAgICAgICBzY3NpX3NnX3Euc2dfaGVhZF9xcCA9IHFfbm87CisgICAgICAgIHNjc2lfc2dfcS5jbnRsID0gUUNTR19TR19YRkVSX0xJU1Q7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZ19oZWFkLT5xdWV1ZV9jbnQ7IGkrKykgeworICAgICAgICAgICAgc2NzaV9zZ19xLnNlcV9ubyA9IGkgKyAxOworICAgICAgICAgICAgaWYgKHNnX2VudHJ5X2NudCA+IEFTQ19TR19MSVNUX1BFUl9RKSB7CisgICAgICAgICAgICAgICAgc2dfbGlzdF9kd29yZHMgPSAodWNoYXIpIChBU0NfU0dfTElTVF9QRVJfUSAqIDIpOworICAgICAgICAgICAgICAgIHNnX2VudHJ5X2NudCAtPSBBU0NfU0dfTElTVF9QRVJfUTsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNjc2lfc2dfcS5zZ19saXN0X2NudCA9IEFTQ19TR19MSVNUX1BFUl9ROworICAgICAgICAgICAgICAgICAgICBzY3NpX3NnX3Euc2dfY3VyX2xpc3RfY250ID0gQVNDX1NHX0xJU1RfUEVSX1E7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2NzaV9zZ19xLnNnX2xpc3RfY250ID0gQVNDX1NHX0xJU1RfUEVSX1EgLSAxOworICAgICAgICAgICAgICAgICAgICBzY3NpX3NnX3Euc2dfY3VyX2xpc3RfY250ID0gQVNDX1NHX0xJU1RfUEVSX1EgLSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisjaWYgQ0NfVkVSWV9MT05HX1NHX0xJU1QKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGxhc3QgU0cgcXVldWUgaW4gdGhlIGxpc3Qgb2YKKyAgICAgICAgICAgICAgICAgKiBhbGxvY2F0ZWQgU0cgcXVldWVzLiBJZiB0aGVyZSBhcmUgbW9yZQorICAgICAgICAgICAgICAgICAqIFNHIGVsZW1lbnRzIHRoYW4gd2lsbCBmaXQgaW4gdGhlIGFsbG9jYXRlZAorICAgICAgICAgICAgICAgICAqIHF1ZXVlcywgdGhlbiBzZXQgdGhlIFFDU0dfU0dfWEZFUl9NT1JFIGZsYWcuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHNnX2hlYWQtPmVudHJ5X2NudCA+IEFTQ19NQVhfU0dfTElTVCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNjc2lfc2dfcS5jbnRsIHw9IFFDU0dfU0dfWEZFUl9NT1JFOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHsKKyNlbmRpZiAvKiBDQ19WRVJZX0xPTkdfU0dfTElTVCAqLworICAgICAgICAgICAgICAgICAgICBzY3NpX3NnX3EuY250bCB8PSBRQ1NHX1NHX1hGRVJfRU5EOworI2lmIENDX1ZFUllfTE9OR19TR19MSVNUCisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENDX1ZFUllfTE9OR19TR19MSVNUICovCisgICAgICAgICAgICAgICAgc2dfbGlzdF9kd29yZHMgPSBzZ19lbnRyeV9jbnQgPDwgMTsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNjc2lfc2dfcS5zZ19saXN0X2NudCA9IHNnX2VudHJ5X2NudDsKKyAgICAgICAgICAgICAgICAgICAgc2NzaV9zZ19xLnNnX2N1cl9saXN0X2NudCA9IHNnX2VudHJ5X2NudDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzY3NpX3NnX3Euc2dfbGlzdF9jbnQgPSBzZ19lbnRyeV9jbnQgLSAxOworICAgICAgICAgICAgICAgICAgICBzY3NpX3NnX3Euc2dfY3VyX2xpc3RfY250ID0gc2dfZW50cnlfY250IC0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2dfZW50cnlfY250ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHRfcXAgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyBBU0NfU0NTSVFfQl9GV0QpKTsKKyAgICAgICAgICAgIHNjc2lfc2dfcS5xX25vID0gbmV4dF9xcDsKKyAgICAgICAgICAgIHFfYWRkciA9IEFTQ19RTk9fVE9fUUFERFIobmV4dF9xcCk7CisgICAgICAgICAgICBBc2NNZW1Xb3JkQ29weVB0clRvTHJhbShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcV9hZGRyICsgQVNDX1NDU0lRX1NHSERfQ1BZX0JFRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyICopICZzY3NpX3NnX3EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihBU0NfU0dfTElTVF9RKSA+PiAxKTsKKyAgICAgICAgICAgIEFzY01lbURXb3JkQ29weVB0clRvTHJhbShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcV9hZGRyICsgQVNDX1NHUV9MSVNUX0JFRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyICopICZzZ19oZWFkLT5zZ19saXN0W3NnX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dfbGlzdF9kd29yZHMpOworICAgICAgICAgICAgc2dfaW5kZXggKz0gQVNDX1NHX0xJU1RfUEVSX1E7CisgICAgICAgICAgICBzY3NpcS0+bmV4dF9zZ19pbmRleCA9IHNnX2luZGV4OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2NzaXEtPnExLmNudGwgJj0gflFDX1NHX0hFQUQ7CisgICAgfQorICAgIHN0YSA9IEFzY1B1dFJlYWR5UXVldWUoYXNjX2R2Yywgc2NzaXEsIHFfbm8pOworICAgIHNjc2lxLT5xMS5kYXRhX2FkZHIgPSBzYXZlZF9kYXRhX2FkZHI7CisgICAgc2NzaXEtPnExLmRhdGFfY250ID0gc2F2ZWRfZGF0YV9jbnQ7CisgICAgcmV0dXJuIChzdGEpOworfQorCitTVEFUSUMgaW50CitBc2NTZXRSdW5DaGlwU3luUmVnQXRJRCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgdGlkX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgc2R0cl9kYXRhCispCit7CisgICAgaW50ICAgICAgICAgICAgICAgICBzdGEgPSBGQUxTRTsKKworICAgIGlmIChBc2NIb3N0UmVxUmlzY0hhbHQoaW9wX2Jhc2UpKSB7CisgICAgICAgIHN0YSA9IEFzY1NldENoaXBTeW5SZWdBdElEKGlvcF9iYXNlLCB0aWRfbm8sIHNkdHJfZGF0YSk7CisgICAgICAgIEFzY1N0YXJ0Q2hpcChpb3BfYmFzZSk7CisgICAgICAgIHJldHVybiAoc3RhKTsKKyAgICB9CisgICAgcmV0dXJuIChzdGEpOworfQorCitTVEFUSUMgaW50CitBc2NTZXRDaGlwU3luUmVnQXRJRCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciBzZHRyX2RhdGEKKykKK3sKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBvcmdfaWQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBpOworICAgIGludCAgICAgICAgICAgICAgICAgc3RhID0gVFJVRTsKKworICAgIEFzY1NldEJhbmsoaW9wX2Jhc2UsIDEpOworICAgIG9yZ19pZCA9IEFzY1JlYWRDaGlwRHZjSUQoaW9wX2Jhc2UpOworICAgIGZvciAoaSA9IDA7IGkgPD0gQVNDX01BWF9USUQ7IGkrKykgeworICAgICAgICBpZiAob3JnX2lkID09ICgweDAxIDw8IGkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG9yZ19pZCA9IChBU0NfU0NTSV9CSVRfSURfVFlQRSkgaTsKKyAgICBBc2NXcml0ZUNoaXBEdmNJRChpb3BfYmFzZSwgaWQpOworICAgIGlmIChBc2NSZWFkQ2hpcER2Y0lEKGlvcF9iYXNlKSA9PSAoMHgwMSA8PCBpZCkpIHsKKyAgICAgICAgQXNjU2V0QmFuayhpb3BfYmFzZSwgMCk7CisgICAgICAgIEFzY1NldENoaXBTeW4oaW9wX2Jhc2UsIHNkdHJfZGF0YSk7CisgICAgICAgIGlmIChBc2NHZXRDaGlwU3luKGlvcF9iYXNlKSAhPSBzZHRyX2RhdGEpIHsKKyAgICAgICAgICAgIHN0YSA9IEZBTFNFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhID0gRkFMU0U7CisgICAgfQorICAgIEFzY1NldEJhbmsoaW9wX2Jhc2UsIDEpOworICAgIEFzY1dyaXRlQ2hpcER2Y0lEKGlvcF9iYXNlLCBvcmdfaWQpOworICAgIEFzY1NldEJhbmsoaW9wX2Jhc2UsIDApOworICAgIHJldHVybiAoc3RhKTsKK30KKworU1RBVElDIHVzaG9ydAorQXNjSW5pdExyYW0oCisgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YworKQoreworICAgIHVjaGFyICAgICAgICAgICAgICAgaTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHNfYWRkcjsKKyAgICBQb3J0QWRkciAgICAgICAgICAgIGlvcF9iYXNlOworICAgIHVzaG9ydCAgICAgICAgICAgICAgd2Fybl9jb2RlOworCisgICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKyAgICB3YXJuX2NvZGUgPSAwOworICAgIEFzY01lbVdvcmRTZXRMcmFtKGlvcF9iYXNlLCBBU0NfUUFEUl9CRUcsIDAsCisgICAgICAgICAgICAgICAodXNob3J0KSAoKChpbnQpIChhc2NfZHZjLT5tYXhfdG90YWxfcW5nICsgMiArIDEpICogNjQpID4+IDEpCispOworICAgIGkgPSBBU0NfTUlOX0FDVElWRV9RTk87CisgICAgc19hZGRyID0gQVNDX1FBRFJfQkVHICsgQVNDX1FCTEtfU0laRTsKKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCAodXNob3J0KSAoc19hZGRyICsgQVNDX1NDU0lRX0JfRldEKSwKKyAgICAgICAgICAgICAgICAgICAgICh1Y2hhcikgKGkgKyAxKSk7CisgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydCkgKHNfYWRkciArIEFTQ19TQ1NJUV9CX0JXRCksCisgICAgICAgICAgICAgICAgICAgICAodWNoYXIpIChhc2NfZHZjLT5tYXhfdG90YWxfcW5nKSk7CisgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydCkgKHNfYWRkciArIEFTQ19TQ1NJUV9CX1FOTyksCisgICAgICAgICAgICAgICAgICAgICAodWNoYXIpIGkpOworICAgIGkrKzsKKyAgICBzX2FkZHIgKz0gQVNDX1FCTEtfU0laRTsKKyAgICBmb3IgKDsgaSA8IGFzY19kdmMtPm1heF90b3RhbF9xbmc7IGkrKywgc19hZGRyICs9IEFTQ19RQkxLX1NJWkUpIHsKKyAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydCkgKHNfYWRkciArIEFTQ19TQ1NJUV9CX0ZXRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoaSArIDEpKTsKKyAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydCkgKHNfYWRkciArIEFTQ19TQ1NJUV9CX0JXRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoaSAtIDEpKTsKKyAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydCkgKHNfYWRkciArIEFTQ19TQ1NJUV9CX1FOTyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSBpKTsKKyAgICB9CisgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydCkgKHNfYWRkciArIEFTQ19TQ1NJUV9CX0ZXRCksCisgICAgICAgICAgICAgICAgICAgICAodWNoYXIpIEFTQ19RTElOS19FTkQpOworICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsICh1c2hvcnQpIChzX2FkZHIgKyBBU0NfU0NTSVFfQl9CV0QpLAorICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyAtIDEpKTsKKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCAodXNob3J0KSAoc19hZGRyICsgQVNDX1NDU0lRX0JfUU5PKSwKKyAgICAgICAgICAgICAgICAgICAgICh1Y2hhcikgYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyk7CisgICAgaSsrOworICAgIHNfYWRkciArPSBBU0NfUUJMS19TSVpFOworICAgIGZvciAoOyBpIDw9ICh1Y2hhcikgKGFzY19kdmMtPm1heF90b3RhbF9xbmcgKyAzKTsKKyAgICAgICAgIGkrKywgc19hZGRyICs9IEFTQ19RQkxLX1NJWkUpIHsKKyAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoc19hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfRldEKSwgaSk7CisgICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKHNfYWRkciArICh1c2hvcnQpIEFTQ19TQ1NJUV9CX0JXRCksIGkpOworICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChzX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9RTk8pLCBpKTsKKyAgICB9CisgICAgcmV0dXJuICh3YXJuX2NvZGUpOworfQorCitTVEFUSUMgdXNob3J0CitBc2NJbml0UUxpbmtWYXIoCisgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMKKykKK3sKKyAgICBQb3J0QWRkciAgICAgICAgICAgIGlvcF9iYXNlOworICAgIGludCAgICAgICAgICAgICAgICAgaTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIGxyYW1fYWRkcjsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisgICAgQXNjUHV0UmlzY1ZhckZyZWVRSGVhZChpb3BfYmFzZSwgMSk7CisgICAgQXNjUHV0UmlzY1ZhckRvbmVRVGFpbChpb3BfYmFzZSwgYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyk7CisgICAgQXNjUHV0VmFyRnJlZVFIZWFkKGlvcF9iYXNlLCAxKTsKKyAgICBBc2NQdXRWYXJEb25lUVRhaWwoaW9wX2Jhc2UsIGFzY19kdmMtPm1heF90b3RhbF9xbmcpOworICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfQlVTWV9RSEVBRF9CLAorICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoKGludCkgYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyArIDEpKTsKKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX0RJU0MxX1FIRUFEX0IsCisgICAgICAgICAgICAgICAgICAgICAodWNoYXIpICgoaW50KSBhc2NfZHZjLT5tYXhfdG90YWxfcW5nICsgMikpOworICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsICh1c2hvcnQpIEFTQ1ZfVE9UQUxfUkVBRFlfUV9CLAorICAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyk7CisgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9BU0NEVkNfRVJSX0NPREVfVywgMCk7CisgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX1NUT1BfQ09ERV9CLCAwKTsKKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX1NDU0lCVVNZX0IsIDApOworICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfV1RNX0ZMQUdfQiwgMCk7CisgICAgQXNjUHV0UURvbmVJblByb2dyZXNzKGlvcF9iYXNlLCAwKTsKKyAgICBscmFtX2FkZHIgPSBBU0NfUUFEUl9CRUc7CisgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyssIGxyYW1fYWRkciArPSAyKSB7CisgICAgICAgIEFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIGxyYW1fYWRkciwgMCk7CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyBpbnQKK0FzY1NldExpYkVycm9yQ29kZSgKKyAgICAgICAgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgZXJyX2NvZGUKKykKK3sKKyAgICBpZiAoYXNjX2R2Yy0+ZXJyX2NvZGUgPT0gMCkgeworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSA9IGVycl9jb2RlOworICAgICAgICBBc2NXcml0ZUxyYW1Xb3JkKGFzY19kdmMtPmlvcF9iYXNlLCBBU0NWX0FTQ0RWQ19FUlJfQ09ERV9XLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycl9jb2RlKTsKKyAgICB9CisgICAgcmV0dXJuIChlcnJfY29kZSk7Cit9CisKKworU1RBVElDIHVjaGFyCitBc2NNc2dPdXRTRFRSKAorICAgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgdWNoYXIgc2R0cl9wZXJpb2QsCisgICAgICAgICAgICAgICAgIHVjaGFyIHNkdHJfb2Zmc2V0CispCit7CisgICAgRVhUX01TRyAgICAgICAgICAgICBzZHRyX2J1ZjsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHNkdHJfcGVyaW9kX2luZGV4OworICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7CisKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworICAgIHNkdHJfYnVmLm1zZ190eXBlID0gTVNfRVhURU5EOworICAgIHNkdHJfYnVmLm1zZ19sZW4gPSBNU19TRFRSX0xFTjsKKyAgICBzZHRyX2J1Zi5tc2dfcmVxID0gTVNfU0RUUl9DT0RFOworICAgIHNkdHJfYnVmLnhmZXJfcGVyaW9kID0gc2R0cl9wZXJpb2Q7CisgICAgc2R0cl9vZmZzZXQgJj0gQVNDX1NZTl9NQVhfT0ZGU0VUOworICAgIHNkdHJfYnVmLnJlcV9hY2tfb2Zmc2V0ID0gc2R0cl9vZmZzZXQ7CisgICAgaWYgKChzZHRyX3BlcmlvZF9pbmRleCA9CisgICAgICAgICBBc2NHZXRTeW5QZXJpb2RJbmRleChhc2NfZHZjLCBzZHRyX3BlcmlvZCkpIDw9CisgICAgICAgIGFzY19kdmMtPm1heF9zZHRyX2luZGV4KSB7CisgICAgICAgIEFzY01lbVdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NWX01TR09VVF9CRUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhciAqKSAmc2R0cl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoRVhUX01TRykgPj4gMSk7CisgICAgICAgIHJldHVybiAoKHNkdHJfcGVyaW9kX2luZGV4IDw8IDQpIHwgc2R0cl9vZmZzZXQpOworICAgIH0gZWxzZSB7CisKKyAgICAgICAgc2R0cl9idWYucmVxX2Fja19vZmZzZXQgPSAwOworICAgICAgICBBc2NNZW1Xb3JkQ29weVB0clRvTHJhbShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDVl9NU0dPVVRfQkVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWNoYXIgKikgJnNkdHJfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKEVYVF9NU0cpID4+IDEpOworICAgICAgICByZXR1cm4gKDApOworICAgIH0KK30KKworU1RBVElDIHVjaGFyCitBc2NDYWxTRFRSRGF0YSgKKyAgICAgICAgICAgICAgICAgIEFTQ19EVkNfVkFSICphc2NfZHZjLAorICAgICAgICAgICAgICAgICAgdWNoYXIgc2R0cl9wZXJpb2QsCisgICAgICAgICAgICAgICAgICB1Y2hhciBzeW5fb2Zmc2V0CispCit7CisgICAgdWNoYXIgICAgICAgICAgICAgICBieXRlOworICAgIHVjaGFyICAgICAgICAgICAgICAgc2R0cl9wZXJpb2RfaXg7CisKKyAgICBzZHRyX3BlcmlvZF9peCA9IEFzY0dldFN5blBlcmlvZEluZGV4KGFzY19kdmMsIHNkdHJfcGVyaW9kKTsKKyAgICBpZiAoCisgICAgICAgICAgIChzZHRyX3BlcmlvZF9peCA+IGFzY19kdmMtPm1heF9zZHRyX2luZGV4KQorKSB7CisgICAgICAgIHJldHVybiAoMHhGRik7CisgICAgfQorICAgIGJ5dGUgPSAoc2R0cl9wZXJpb2RfaXggPDwgNCkgfCAoc3luX29mZnNldCAmIEFTQ19TWU5fTUFYX09GRlNFVCk7CisgICAgcmV0dXJuIChieXRlKTsKK30KKworU1RBVElDIHZvaWQKK0FzY1NldENoaXBTRFRSKAorICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICB1Y2hhciBzZHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICB1Y2hhciB0aWRfbm8KKykKK3sKKyAgICBBc2NTZXRDaGlwU3luUmVnQXRJRChpb3BfYmFzZSwgdGlkX25vLCBzZHRyX2RhdGEpOworICAgIEFzY1B1dE1Db2RlU0RUUkRvbmVBdElEKGlvcF9iYXNlLCB0aWRfbm8sIHNkdHJfZGF0YSk7CisgICAgcmV0dXJuOworfQorCitTVEFUSUMgdWNoYXIKK0FzY0dldFN5blBlcmlvZEluZGV4KAorICAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciBzeW5fdGltZQorKQoreworICAgIHVjaGFyICAgICAgICAgICAgICpwZXJpb2RfdGFibGU7CisgICAgaW50ICAgICAgICAgICAgICAgICBtYXhfaW5kZXg7CisgICAgaW50ICAgICAgICAgICAgICAgICBtaW5faW5kZXg7CisgICAgaW50ICAgICAgICAgICAgICAgICBpOworCisgICAgcGVyaW9kX3RhYmxlID0gYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsOworICAgIG1heF9pbmRleCA9IChpbnQpIGFzY19kdmMtPm1heF9zZHRyX2luZGV4OworICAgIG1pbl9pbmRleCA9IChpbnQpYXNjX2R2Yy0+aG9zdF9pbml0X3NkdHJfaW5kZXg7CisgICAgaWYgKChzeW5fdGltZSA8PSBwZXJpb2RfdGFibGVbbWF4X2luZGV4XSkpIHsKKyAgICAgICAgZm9yIChpID0gbWluX2luZGV4OyBpIDwgKG1heF9pbmRleCAtIDEpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzeW5fdGltZSA8PSBwZXJpb2RfdGFibGVbaV0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCh1Y2hhcikgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgodWNoYXIpIG1heF9pbmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICgodWNoYXIpIChtYXhfaW5kZXggKyAxKSk7CisgICAgfQorfQorCitTVEFUSUMgdWNoYXIKK0FzY0FsbG9jRnJlZVF1ZXVlKAorICAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICB1Y2hhciBmcmVlX3FfaGVhZAorKQoreworICAgIHVzaG9ydCAgICAgICAgICAgICAgcV9hZGRyOworICAgIHVjaGFyICAgICAgICAgICAgICAgbmV4dF9xcDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHFfc3RhdHVzOworCisgICAgcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihmcmVlX3FfaGVhZCk7CisgICAgcV9zdGF0dXMgPSAodWNoYXIpIEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyBBU0NfU0NTSVFfQl9TVEFUVVMpKTsKKyAgICBuZXh0X3FwID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKHFfYWRkciArIEFTQ19TQ1NJUV9CX0ZXRCkpOworICAgIGlmICgoKHFfc3RhdHVzICYgUVNfUkVBRFkpID09IDApICYmIChuZXh0X3FwICE9IEFTQ19RTElOS19FTkQpKSB7CisgICAgICAgIHJldHVybiAobmV4dF9xcCk7CisgICAgfQorICAgIHJldHVybiAoQVNDX1FMSU5LX0VORCk7Cit9CisKK1NUQVRJQyB1Y2hhcgorQXNjQWxsb2NNdWx0aXBsZUZyZWVRdWV1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyIGZyZWVfcV9oZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciBuX2ZyZWVfcQorKQoreworICAgIHVjaGFyICAgICAgICAgICAgICAgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuX2ZyZWVfcTsgaSsrKSB7CisgICAgICAgIGlmICgoZnJlZV9xX2hlYWQgPSBBc2NBbGxvY0ZyZWVRdWV1ZShpb3BfYmFzZSwgZnJlZV9xX2hlYWQpKQorICAgICAgICAgICAgPT0gQVNDX1FMSU5LX0VORCkgeworICAgICAgICAgICAgcmV0dXJuIChBU0NfUUxJTktfRU5EKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKGZyZWVfcV9oZWFkKTsKK30KKworU1RBVElDIGludAorQXNjSG9zdFJlcVJpc2NIYWx0KAorICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlCispCit7CisgICAgaW50ICAgICAgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgaW50ICAgICAgICAgICAgICAgICBzdGEgPSAwOworICAgIHVjaGFyICAgICAgICAgICAgICAgc2F2ZWRfc3RvcF9jb2RlOworCisgICAgaWYgKEFzY0lzQ2hpcEhhbHRlZChpb3BfYmFzZSkpCisgICAgICAgIHJldHVybiAoMSk7CisgICAgc2F2ZWRfc3RvcF9jb2RlID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX1NUT1BfQ09ERV9CKTsKKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX1NUT1BfQ09ERV9CLAorICAgICAgICAgICAgICAgICAgICAgQVNDX1NUT1BfSE9TVF9SRVFfUklTQ19IQUxUIHwgQVNDX1NUT1BfUkVRX1JJU0NfU1RPUAorKTsKKyAgICBkbyB7CisgICAgICAgIGlmIChBc2NJc0NoaXBIYWx0ZWQoaW9wX2Jhc2UpKSB7CisgICAgICAgICAgICBzdGEgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgRHZjU2xlZXBNaWxsaVNlY29uZCgxMDApOworICAgIH0gd2hpbGUgKGNvdW50KysgPCAyMCk7CisgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9TVE9QX0NPREVfQiwgc2F2ZWRfc3RvcF9jb2RlKTsKKyAgICByZXR1cm4gKHN0YSk7Cit9CisKK1NUQVRJQyBpbnQKK0FzY1N0b3BRdWV1ZUV4ZSgKKyAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZQorKQoreworICAgIGludCAgICAgICAgICAgICAgICAgY291bnQgPSAwOworCisgICAgaWYgKEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9TVE9QX0NPREVfQikgPT0gMCkgeworICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX1NUT1BfQ09ERV9CLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ19TVE9QX1JFUV9SSVNDX1NUT1ApOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX1NUT1BfQ09ERV9CKSAmCisgICAgICAgICAgICAgICAgICAgQVNDX1NUT1BfQUNLX1JJU0NfU1RPUCkgeworICAgICAgICAgICAgICAgIHJldHVybiAoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKDEwMCk7CisgICAgICAgIH0gd2hpbGUgKGNvdW50KysgPCAyMCk7CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyB2b2lkCitEdmNEZWxheU1pY3JvU2Vjb25kKEFEVl9EVkNfVkFSICphc2NfZHZjLCB1c2hvcnQgbWljcm9fc2VjKQoreworICAgIHVkZWxheShtaWNyb19zZWMpOworfQorCitTVEFUSUMgdm9pZAorRHZjRGVsYXlOYW5vU2Vjb25kKEFTQ19EVkNfVkFSICphc2NfZHZjLCBBU0NfRENOVCBuYW5vX3NlYykKK3sKKyAgICB1ZGVsYXkoKG5hbm9fc2VjICsgOTk5KS8xMDAwKTsKK30KKworI2lmZGVmIENPTkZJR19JU0EKK1NUQVRJQyBBU0NfRENOVCBfX2luaXQKK0FzY0dldEVpc2FQcm9kdWN0SUQoCisgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlKQoreworICAgIFBvcnRBZGRyICAgICAgICAgICAgZWlzYV9pb3A7CisgICAgdXNob3J0ICAgICAgICAgICAgICBwcm9kdWN0X2lkX2hpZ2gsIHByb2R1Y3RfaWRfbG93OworICAgIEFTQ19EQ05UICAgICAgICAgICAgcHJvZHVjdF9pZDsKKworICAgIGVpc2FfaW9wID0gQVNDX0dFVF9FSVNBX1NMT1QoaW9wX2Jhc2UpIHwgQVNDX0VJU0FfUElEX0lPUF9NQVNLOworICAgIHByb2R1Y3RfaWRfbG93ID0gaW5wdyhlaXNhX2lvcCk7CisgICAgcHJvZHVjdF9pZF9oaWdoID0gaW5wdyhlaXNhX2lvcCArIDIpOworICAgIHByb2R1Y3RfaWQgPSAoKEFTQ19EQ05UKSBwcm9kdWN0X2lkX2hpZ2ggPDwgMTYpIHwKKyAgICAgICAgKEFTQ19EQ05UKSBwcm9kdWN0X2lkX2xvdzsKKyAgICByZXR1cm4gKHByb2R1Y3RfaWQpOworfQorCitTVEFUSUMgUG9ydEFkZHIgX19pbml0CitBc2NTZWFyY2hJT1BvcnRBZGRyRUlTQSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlKQoreworICAgIEFTQ19EQ05UICAgICAgICAgICAgZWlzYV9wcm9kdWN0X2lkOworCisgICAgaWYgKGlvcF9iYXNlID09IDApIHsKKyAgICAgICAgaW9wX2Jhc2UgPSBBU0NfRUlTQV9NSU5fSU9QX0FERFI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlvcF9iYXNlID09IEFTQ19FSVNBX01BWF9JT1BfQUREUikKKyAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIGlmICgoaW9wX2Jhc2UgJiAweDAwNTApID09IDB4MDA1MCkgeworICAgICAgICAgICAgaW9wX2Jhc2UgKz0gQVNDX0VJU0FfQklHX0lPUF9HQVA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpb3BfYmFzZSArPSBBU0NfRUlTQV9TTUFMTF9JT1BfR0FQOworICAgICAgICB9CisgICAgfQorICAgIHdoaWxlIChpb3BfYmFzZSA8PSBBU0NfRUlTQV9NQVhfSU9QX0FERFIpIHsKKyAgICAgICAgZWlzYV9wcm9kdWN0X2lkID0gQXNjR2V0RWlzYVByb2R1Y3RJRChpb3BfYmFzZSk7CisgICAgICAgIGlmICgoZWlzYV9wcm9kdWN0X2lkID09IEFTQ19FSVNBX0lEXzc0MCkgfHwKKyAgICAgICAgICAgIChlaXNhX3Byb2R1Y3RfaWQgPT0gQVNDX0VJU0FfSURfNzUwKSkgeworICAgICAgICAgICAgaWYgKEFzY0ZpbmRTaWduYXR1cmUoaW9wX2Jhc2UpKSB7CisgICAgICAgICAgICAgICAgaW5wdyhpb3BfYmFzZSArIDQpOworICAgICAgICAgICAgICAgIHJldHVybiAoaW9wX2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpb3BfYmFzZSA9PSBBU0NfRUlTQV9NQVhfSU9QX0FERFIpCisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICBpZiAoKGlvcF9iYXNlICYgMHgwMDUwKSA9PSAweDAwNTApIHsKKyAgICAgICAgICAgIGlvcF9iYXNlICs9IEFTQ19FSVNBX0JJR19JT1BfR0FQOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW9wX2Jhc2UgKz0gQVNDX0VJU0FfU01BTExfSU9QX0dBUDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKDApOworfQorI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KKworU1RBVElDIGludAorQXNjU3RhcnRDaGlwKAorICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlCispCit7CisgICAgQXNjU2V0Q2hpcENvbnRyb2woaW9wX2Jhc2UsIDApOworICAgIGlmICgoQXNjR2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSkgJiBDU1dfSEFMVEVEKSAhPSAwKSB7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorICAgIHJldHVybiAoMSk7Cit9CisKK1NUQVRJQyBpbnQKK0FzY1N0b3BDaGlwKAorICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UKKykKK3sKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGNjX3ZhbDsKKworICAgIGNjX3ZhbCA9IEFzY0dldENoaXBDb250cm9sKGlvcF9iYXNlKSAmICh+KENDX1NJTkdMRV9TVEVQIHwgQ0NfVEVTVCB8IENDX0RJQUcpKTsKKyAgICBBc2NTZXRDaGlwQ29udHJvbChpb3BfYmFzZSwgKHVjaGFyKSAoY2NfdmFsIHwgQ0NfSEFMVCkpOworICAgIEFzY1NldENoaXBJSChpb3BfYmFzZSwgSU5TX0hBTFQpOworICAgIEFzY1NldENoaXBJSChpb3BfYmFzZSwgSU5TX1JGTEFHX1dUTSk7CisgICAgaWYgKChBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKSAmIENTV19IQUxURUQpID09IDApIHsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgICAgcmV0dXJuICgxKTsKK30KKworU1RBVElDIGludAorQXNjSXNDaGlwSGFsdGVkKAorICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlCispCit7CisgICAgaWYgKChBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKSAmIENTV19IQUxURUQpICE9IDApIHsKKyAgICAgICAgaWYgKChBc2NHZXRDaGlwQ29udHJvbChpb3BfYmFzZSkgJiBDQ19IQUxUKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gKDEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyB2b2lkCitBc2NTZXRDaGlwSUgoCisgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgdXNob3J0IGluc19jb2RlCispCit7CisgICAgQXNjU2V0QmFuayhpb3BfYmFzZSwgMSk7CisgICAgQXNjV3JpdGVDaGlwSUgoaW9wX2Jhc2UsIGluc19jb2RlKTsKKyAgICBBc2NTZXRCYW5rKGlvcF9iYXNlLCAwKTsKKyAgICByZXR1cm47Cit9CisKK1NUQVRJQyB2b2lkCitBc2NBY2tJbnRlcnJ1cHQoCisgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UKKykKK3sKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGhvc3RfZmxhZzsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHJpc2NfZmxhZzsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIGxvb3A7CisKKyAgICBsb29wID0gMDsKKyAgICBkbyB7CisgICAgICAgIHJpc2NfZmxhZyA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9SSVNDX0ZMQUdfQik7CisgICAgICAgIGlmIChsb29wKysgPiAweDdGRkYpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSB3aGlsZSAoKHJpc2NfZmxhZyAmIEFTQ19SSVNDX0ZMQUdfR0VOX0lOVCkgIT0gMCk7CisgICAgaG9zdF9mbGFnID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX0hPU1RfRkxBR19CKSAmICh+QVNDX0hPU1RfRkxBR19BQ0tfSU5UKTsKKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX0hPU1RfRkxBR19CLAorICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoaG9zdF9mbGFnIHwgQVNDX0hPU1RfRkxBR19BQ0tfSU5UKSk7CisgICAgQXNjU2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSwgQ0lXX0lOVF9BQ0spOworICAgIGxvb3AgPSAwOworICAgIHdoaWxlIChBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKSAmIENTV19JTlRfUEVORElORykgeworICAgICAgICBBc2NTZXRDaGlwU3RhdHVzKGlvcF9iYXNlLCBDSVdfSU5UX0FDSyk7CisgICAgICAgIGlmIChsb29wKysgPiAzKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX0hPU1RfRkxBR19CLCBob3N0X2ZsYWcpOworICAgIHJldHVybjsKK30KKworU1RBVElDIHZvaWQKK0FzY0Rpc2FibGVJbnRlcnJ1cHQoCisgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlCispCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICBjZmc7CisKKyAgICBjZmcgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKTsKKyAgICBBc2NTZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlLCBjZmcgJiAofkFTQ19DRkcwX0hPU1RfSU5UX09OKSk7CisgICAgcmV0dXJuOworfQorCitTVEFUSUMgdm9pZAorQXNjRW5hYmxlSW50ZXJydXB0KAorICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlCispCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICBjZmc7CisKKyAgICBjZmcgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKTsKKyAgICBBc2NTZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlLCBjZmcgfCBBU0NfQ0ZHMF9IT1NUX0lOVF9PTik7CisgICAgcmV0dXJuOworfQorCisKKworU1RBVElDIHZvaWQKK0FzY1NldEJhbmsoCisgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICB1Y2hhciBiYW5rCispCit7CisgICAgdWNoYXIgICAgICAgICAgICAgICB2YWw7CisKKyAgICB2YWwgPSBBc2NHZXRDaGlwQ29udHJvbChpb3BfYmFzZSkgJgorICAgICAgKH4oQ0NfU0lOR0xFX1NURVAgfCBDQ19URVNUIHwgQ0NfRElBRyB8IENDX1NDU0lfUkVTRVQgfCBDQ19DSElQX1JFU0VUKSk7CisgICAgaWYgKGJhbmsgPT0gMSkgeworICAgICAgICB2YWwgfD0gQ0NfQkFOS19PTkU7CisgICAgfSBlbHNlIGlmIChiYW5rID09IDIpIHsKKyAgICAgICAgdmFsIHw9IENDX0RJQUcgfCBDQ19CQU5LX09ORTsKKyAgICB9IGVsc2UgeworICAgICAgICB2YWwgJj0gfkNDX0JBTktfT05FOworICAgIH0KKyAgICBBc2NTZXRDaGlwQ29udHJvbChpb3BfYmFzZSwgdmFsKTsKKyAgICByZXR1cm47Cit9CisKK1NUQVRJQyBpbnQKK0FzY1Jlc2V0Q2hpcEFuZFNjc2lCdXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ19EVkNfVkFSICphc2NfZHZjCispCit7CisgICAgUG9ydEFkZHIgICAgaW9wX2Jhc2U7CisgICAgaW50ICAgICAgICAgaSA9IDEwOworCisgICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKyAgICB3aGlsZSAoKEFzY0dldENoaXBTdGF0dXMoaW9wX2Jhc2UpICYgQ1NXX1NDU0lfUkVTRVRfQUNUSVZFKSAmJiAoaS0tID4gMCkpCisgICAgeworICAgICAgICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMTAwKTsKKyAgICB9CisgICAgQXNjU3RvcENoaXAoaW9wX2Jhc2UpOworICAgIEFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLCBDQ19DSElQX1JFU0VUIHwgQ0NfU0NTSV9SRVNFVCB8IENDX0hBTFQpOworICAgIER2Y0RlbGF5TmFub1NlY29uZChhc2NfZHZjLCA2MDAwMCk7CisgICAgQXNjU2V0Q2hpcElIKGlvcF9iYXNlLCBJTlNfUkZMQUdfV1RNKTsKKyAgICBBc2NTZXRDaGlwSUgoaW9wX2Jhc2UsIElOU19IQUxUKTsKKyAgICBBc2NTZXRDaGlwQ29udHJvbChpb3BfYmFzZSwgQ0NfQ0hJUF9SRVNFVCB8IENDX0hBTFQpOworICAgIEFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLCBDQ19IQUxUKTsKKyAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKDIwMCk7CisgICAgQXNjU2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSwgQ0lXX0NMUl9TQ1NJX1JFU0VUX0lOVCk7CisgICAgQXNjU2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSwgMCk7CisgICAgcmV0dXJuIChBc2NJc0NoaXBIYWx0ZWQoaW9wX2Jhc2UpKTsKK30KKworU1RBVElDIEFTQ19EQ05UIF9faW5pdAorQXNjR2V0TWF4RG1hQ291bnQoCisgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgYnVzX3R5cGUpCit7CisgICAgaWYgKGJ1c190eXBlICYgQVNDX0lTX0lTQSkKKyAgICAgICAgcmV0dXJuIChBU0NfTUFYX0lTQV9ETUFfQ09VTlQpOworICAgIGVsc2UgaWYgKGJ1c190eXBlICYgKEFTQ19JU19FSVNBIHwgQVNDX0lTX1ZMKSkKKyAgICAgICAgcmV0dXJuIChBU0NfTUFYX1ZMX0RNQV9DT1VOVCk7CisgICAgcmV0dXJuIChBU0NfTUFYX1BDSV9ETUFfQ09VTlQpOworfQorCisjaWZkZWYgQ09ORklHX0lTQQorU1RBVElDIHVzaG9ydCBfX2luaXQKK0FzY0dldElzYURtYUNoYW5uZWwoCisgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlKQoreworICAgIHVzaG9ydCAgICAgICAgICAgICAgY2hhbm5lbDsKKworICAgIGNoYW5uZWwgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKSAmIDB4MDAwMzsKKyAgICBpZiAoY2hhbm5lbCA9PSAweDAzKQorICAgICAgICByZXR1cm4gKDApOworICAgIGVsc2UgaWYgKGNoYW5uZWwgPT0gMHgwMCkKKyAgICAgICAgcmV0dXJuICg3KTsKKyAgICByZXR1cm4gKGNoYW5uZWwgKyA0KTsKK30KKworU1RBVElDIHVzaG9ydCBfX2luaXQKK0FzY1NldElzYURtYUNoYW5uZWwoCisgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgZG1hX2NoYW5uZWwpCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICBjZmdfbHN3OworICAgIHVjaGFyICAgICAgICAgICAgICAgdmFsdWU7CisKKyAgICBpZiAoKGRtYV9jaGFubmVsID49IDUpICYmIChkbWFfY2hhbm5lbCA8PSA3KSkgeworICAgICAgICBpZiAoZG1hX2NoYW5uZWwgPT0gNykKKyAgICAgICAgICAgIHZhbHVlID0gMHgwMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFsdWUgPSBkbWFfY2hhbm5lbCAtIDQ7CisgICAgICAgIGNmZ19sc3cgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKSAmIDB4RkZGQzsKKyAgICAgICAgY2ZnX2xzdyB8PSB2YWx1ZTsKKyAgICAgICAgQXNjU2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSwgY2ZnX2xzdyk7CisgICAgICAgIHJldHVybiAoQXNjR2V0SXNhRG1hQ2hhbm5lbChpb3BfYmFzZSkpOworICAgIH0KKyAgICByZXR1cm4gKDApOworfQorCitTVEFUSUMgdWNoYXIgX19pbml0CitBc2NTZXRJc2FEbWFTcGVlZCgKKyAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgdWNoYXIgc3BlZWRfdmFsdWUpCit7CisgICAgc3BlZWRfdmFsdWUgJj0gMHgwNzsKKyAgICBBc2NTZXRCYW5rKGlvcF9iYXNlLCAxKTsKKyAgICBBc2NXcml0ZUNoaXBEbWFTcGVlZChpb3BfYmFzZSwgc3BlZWRfdmFsdWUpOworICAgIEFzY1NldEJhbmsoaW9wX2Jhc2UsIDApOworICAgIHJldHVybiAoQXNjR2V0SXNhRG1hU3BlZWQoaW9wX2Jhc2UpKTsKK30KKworU1RBVElDIHVjaGFyIF9faW5pdAorQXNjR2V0SXNhRG1hU3BlZWQoCisgICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZQorKQoreworICAgIHVjaGFyICAgICAgICAgICAgICAgc3BlZWRfdmFsdWU7CisKKyAgICBBc2NTZXRCYW5rKGlvcF9iYXNlLCAxKTsKKyAgICBzcGVlZF92YWx1ZSA9IEFzY1JlYWRDaGlwRG1hU3BlZWQoaW9wX2Jhc2UpOworICAgIHNwZWVkX3ZhbHVlICY9IDB4MDc7CisgICAgQXNjU2V0QmFuayhpb3BfYmFzZSwgMCk7CisgICAgcmV0dXJuIChzcGVlZF92YWx1ZSk7Cit9CisjZW5kaWYgLyogQ09ORklHX0lTQSAqLworCitTVEFUSUMgdXNob3J0IF9faW5pdAorQXNjUmVhZFBDSUNvbmZpZ1dvcmQoCisgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCisgICAgdXNob3J0IHBjaV9jb25maWdfb2Zmc2V0KQoreworICAgIHVjaGFyICAgICAgIGxzYiwgbXNiOworCisgICAgbHNiID0gRHZjUmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywgcGNpX2NvbmZpZ19vZmZzZXQpOworICAgIG1zYiA9IER2Y1JlYWRQQ0lDb25maWdCeXRlKGFzY19kdmMsIHBjaV9jb25maWdfb2Zmc2V0ICsgMSk7CisgICAgcmV0dXJuICgodXNob3J0KSAoKG1zYiA8PCA4KSB8IGxzYikpOworfQorCitTVEFUSUMgdXNob3J0IF9faW5pdAorQXNjSW5pdEdldENvbmZpZygKKyAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMKKykKK3sKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHdhcm5fY29kZTsKKyAgICBQb3J0QWRkciAgICAgICAgICAgIGlvcF9iYXNlOworICAgIHVzaG9ydCAgICAgICAgICAgICAgUENJRGV2aWNlSUQ7CisgICAgdXNob3J0ICAgICAgICAgICAgICBQQ0lWZW5kb3JJRDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIFBDSVJldmlzaW9uSUQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBwcmV2Q21kUmVnQml0czsKKworICAgIHdhcm5fY29kZSA9IDA7CisgICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKyAgICBhc2NfZHZjLT5pbml0X3N0YXRlID0gQVNDX0lOSVRfU1RBVEVfQkVHX0dFVF9DRkc7CisgICAgaWYgKGFzY19kdmMtPmVycl9jb2RlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIChVV19FUlIpOworICAgIH0KKyAgICBpZiAoYXNjX2R2Yy0+YnVzX3R5cGUgPT0gQVNDX0lTX1BDSSkgeworICAgICAgICBQQ0lWZW5kb3JJRCA9IEFzY1JlYWRQQ0lDb25maWdXb3JkKGFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2NQQ0lDb25maWdWZW5kb3JJRFJlZ2lzdGVyKTsKKworICAgICAgICBQQ0lEZXZpY2VJRCA9IEFzY1JlYWRQQ0lDb25maWdXb3JkKGFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2NQQ0lDb25maWdEZXZpY2VJRFJlZ2lzdGVyKTsKKworICAgICAgICBQQ0lSZXZpc2lvbklEID0gRHZjUmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzY1BDSUNvbmZpZ1JldmlzaW9uSURSZWdpc3Rlcik7CisKKyAgICAgICAgaWYgKFBDSVZlbmRvcklEICE9IEFTQ19QQ0lfVkVORE9SSUQpIHsKKyAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9TRVRfUENJX0NPTkZJR19TUEFDRTsKKyAgICAgICAgfQorICAgICAgICBwcmV2Q21kUmVnQml0cyA9IER2Y1JlYWRQQ0lDb25maWdCeXRlKGFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2NQQ0lDb25maWdDb21tYW5kUmVnaXN0ZXIpOworCisgICAgICAgIGlmICgocHJldkNtZFJlZ0JpdHMgJiBBc2NQQ0lDbWRSZWdCaXRzX0lPTWVtQnVzTWFzdGVyKSAhPQorICAgICAgICAgICAgQXNjUENJQ21kUmVnQml0c19JT01lbUJ1c01hc3RlcikgeworICAgICAgICAgICAgRHZjV3JpdGVQQ0lDb25maWdCeXRlKGFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNjUENJQ29uZmlnQ29tbWFuZFJlZ2lzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmV2Q21kUmVnQml0cyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzY1BDSUNtZFJlZ0JpdHNfSU9NZW1CdXNNYXN0ZXIpKTsKKworICAgICAgICAgICAgaWYgKChEdmNSZWFkUENJQ29uZmlnQnl0ZShhc2NfZHZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2NQQ0lDb25maWdDb21tYW5kUmVnaXN0ZXIpCisgICAgICAgICAgICAgICAgICYgQXNjUENJQ21kUmVnQml0c19JT01lbUJ1c01hc3RlcikKKyAgICAgICAgICAgICAgICAhPSBBc2NQQ0lDbWRSZWdCaXRzX0lPTWVtQnVzTWFzdGVyKSB7CisgICAgICAgICAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX1NFVF9QQ0lfQ09ORklHX1NQQUNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoUENJRGV2aWNlSUQgPT0gQVNDX1BDSV9ERVZJQ0VJRF8xMjAwQSkgfHwKKyAgICAgICAgICAgIChQQ0lEZXZpY2VJRCA9PSBBU0NfUENJX0RFVklDRUlEXzEyMDBCKSkgeworICAgICAgICAgICAgRHZjV3JpdGVQQ0lDb25maWdCeXRlKGFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNjUENJQ29uZmlnTGF0ZW5jeVRpbWVyLCAweDAwKTsKKyAgICAgICAgICAgIGlmIChEdmNSZWFkUENJQ29uZmlnQnl0ZShhc2NfZHZjLCBBc2NQQ0lDb25maWdMYXRlbmN5VGltZXIpCisgICAgICAgICAgICAgICAgIT0gMHgwMCkgeworICAgICAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9TRVRfUENJX0NPTkZJR19TUEFDRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChQQ0lEZXZpY2VJRCA9PSBBU0NfUENJX0RFVklDRUlEX1VMVFJBKSB7CisgICAgICAgICAgICBpZiAoRHZjUmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNjUENJQ29uZmlnTGF0ZW5jeVRpbWVyKSA8IDB4MjApIHsKKyAgICAgICAgICAgICAgICBEdmNXcml0ZVBDSUNvbmZpZ0J5dGUoYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzY1BDSUNvbmZpZ0xhdGVuY3lUaW1lciwgMHgyMCk7CisKKyAgICAgICAgICAgICAgICBpZiAoRHZjUmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzY1BDSUNvbmZpZ0xhdGVuY3lUaW1lcikgPCAweDIwKSB7CisgICAgICAgICAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9TRVRfUENJX0NPTkZJR19TUEFDRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoQXNjRmluZFNpZ25hdHVyZShpb3BfYmFzZSkpIHsKKyAgICAgICAgd2Fybl9jb2RlIHw9IEFzY0luaXRBc2NEdmNWYXIoYXNjX2R2Yyk7CisgICAgICAgIHdhcm5fY29kZSB8PSBBc2NJbml0RnJvbUVFUChhc2NfZHZjKTsKKyAgICAgICAgYXNjX2R2Yy0+aW5pdF9zdGF0ZSB8PSBBU0NfSU5JVF9TVEFURV9FTkRfR0VUX0NGRzsKKyAgICAgICAgaWYgKGFzY19kdmMtPnNjc2lfcmVzZXRfd2FpdCA+IEFTQ19NQVhfU0NTSV9SRVNFVF9XQUlUKSB7CisgICAgICAgICAgICBhc2NfZHZjLT5zY3NpX3Jlc2V0X3dhaXQgPSBBU0NfTUFYX1NDU0lfUkVTRVRfV0FJVDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlID0gQVNDX0lFUlJfQkFEX1NJR05BVFVSRTsKKyAgICB9CisgICAgcmV0dXJuKHdhcm5fY29kZSk7Cit9CisKK1NUQVRJQyB1c2hvcnQgX19pbml0CitBc2NJbml0U2V0Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YworKQoreworICAgIHVzaG9ydCAgICAgICAgICAgICAgd2Fybl9jb2RlID0gMDsKKworICAgIGFzY19kdmMtPmluaXRfc3RhdGUgfD0gQVNDX0lOSVRfU1RBVEVfQkVHX1NFVF9DRkc7CisgICAgaWYgKGFzY19kdmMtPmVycl9jb2RlICE9IDApCisgICAgICAgIHJldHVybiAoVVdfRVJSKTsKKyAgICBpZiAoQXNjRmluZFNpZ25hdHVyZShhc2NfZHZjLT5pb3BfYmFzZSkpIHsKKyAgICAgICAgd2Fybl9jb2RlIHw9IEFzY0luaXRGcm9tQXNjRHZjVmFyKGFzY19kdmMpOworICAgICAgICBhc2NfZHZjLT5pbml0X3N0YXRlIHw9IEFTQ19JTklUX1NUQVRFX0VORF9TRVRfQ0ZHOworICAgIH0gZWxzZSB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlID0gQVNDX0lFUlJfQkFEX1NJR05BVFVSRTsKKyAgICB9CisgICAgcmV0dXJuICh3YXJuX2NvZGUpOworfQorCitTVEFUSUMgdXNob3J0IF9faW5pdAorQXNjSW5pdEZyb21Bc2NEdmNWYXIoCisgICAgICAgICAgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YworKQoreworICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7CisgICAgdXNob3J0ICAgICAgICAgICAgICBjZmdfbXN3OworICAgIHVzaG9ydCAgICAgICAgICAgICAgd2Fybl9jb2RlOworICAgIHVzaG9ydCAgICAgICAgICAgICAgcGNpX2RldmljZV9pZCA9IDA7CisKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworI2lmZGVmIENPTkZJR19QQ0kKKyAgICBpZiAoYXNjX2R2Yy0+Y2ZnLT5kZXYpCisgICAgICAgIHBjaV9kZXZpY2VfaWQgPSB0b19wY2lfZGV2KGFzY19kdmMtPmNmZy0+ZGV2KS0+ZGV2aWNlOworI2VuZGlmCisgICAgd2Fybl9jb2RlID0gMDsKKyAgICBjZmdfbXN3ID0gQXNjR2V0Q2hpcENmZ01zdyhpb3BfYmFzZSk7CisgICAgaWYgKChjZmdfbXN3ICYgQVNDX0NGR19NU1dfQ0xSX01BU0spICE9IDApIHsKKyAgICAgICAgY2ZnX21zdyAmPSAofihBU0NfQ0ZHX01TV19DTFJfTUFTSykpOworICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fQ0ZHX01TV19SRUNPVkVSOworICAgICAgICBBc2NTZXRDaGlwQ2ZnTXN3KGlvcF9iYXNlLCBjZmdfbXN3KTsKKyAgICB9CisgICAgaWYgKChhc2NfZHZjLT5jZmctPmNtZF9xbmdfZW5hYmxlZCAmIGFzY19kdmMtPmNmZy0+ZGlzY19lbmFibGUpICE9CisgICAgICAgIGFzY19kdmMtPmNmZy0+Y21kX3FuZ19lbmFibGVkKSB7CisgICAgICAgIGFzY19kdmMtPmNmZy0+ZGlzY19lbmFibGUgPSBhc2NfZHZjLT5jZmctPmNtZF9xbmdfZW5hYmxlZDsKKyAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0NNRF9RTkdfQ09ORkxJQ1Q7CisgICAgfQorICAgIGlmIChBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKSAmIENTV19BVVRPX0NPTkZJRykgeworICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fQVVUT19DT05GSUc7CisgICAgfQorICAgIGlmICgoYXNjX2R2Yy0+YnVzX3R5cGUgJiAoQVNDX0lTX0lTQSB8IEFTQ19JU19WTCkpICE9IDApIHsKKyAgICAgICAgaWYgKEFzY1NldENoaXBJUlEoaW9wX2Jhc2UsIGFzY19kdmMtPmlycV9ubywgYXNjX2R2Yy0+YnVzX3R5cGUpCisgICAgICAgICAgICAhPSBhc2NfZHZjLT5pcnFfbm8pIHsKKyAgICAgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX1NFVF9JUlFfTk87CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFzY19kdmMtPmJ1c190eXBlICYgQVNDX0lTX1BDSSkgeworICAgICAgICBjZmdfbXN3ICY9IDB4RkZDMDsKKyAgICAgICAgQXNjU2V0Q2hpcENmZ01zdyhpb3BfYmFzZSwgY2ZnX21zdyk7CisgICAgICAgIGlmICgoYXNjX2R2Yy0+YnVzX3R5cGUgJiBBU0NfSVNfUENJX1VMVFJBKSA9PSBBU0NfSVNfUENJX1VMVFJBKSB7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKHBjaV9kZXZpY2VfaWQgPT0gQVNDX1BDSV9ERVZJQ0VfSURfUkVWX0EpIHx8CisgICAgICAgICAgICAgICAgKHBjaV9kZXZpY2VfaWQgPT0gQVNDX1BDSV9ERVZJQ0VfSURfUkVWX0IpKSB7CisgICAgICAgICAgICAgICAgYXNjX2R2Yy0+YnVnX2ZpeF9jbnRsIHw9IEFTQ19CVUdfRklYX0lGX05PVF9EV0I7CisgICAgICAgICAgICAgICAgYXNjX2R2Yy0+YnVnX2ZpeF9jbnRsIHw9IEFTQ19CVUdfRklYX0FTWU5fVVNFX1NZTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXNjX2R2Yy0+YnVzX3R5cGUgPT0gQVNDX0lTX0lTQVBOUCkgeworICAgICAgICBpZiAoQXNjR2V0Q2hpcFZlcnNpb24oaW9wX2Jhc2UsIGFzY19kdmMtPmJ1c190eXBlKQorICAgICAgICAgICAgPT0gQVNDX0NISVBfVkVSX0FTWU5fQlVHKSB7CisgICAgICAgICAgICBhc2NfZHZjLT5idWdfZml4X2NudGwgfD0gQVNDX0JVR19GSVhfQVNZTl9VU0VfU1lOOworICAgICAgICB9CisgICAgfQorICAgIGlmIChBc2NTZXRDaGlwU2NzaUlEKGlvcF9iYXNlLCBhc2NfZHZjLT5jZmctPmNoaXBfc2NzaV9pZCkgIT0KKyAgICAgICAgYXNjX2R2Yy0+Y2ZnLT5jaGlwX3Njc2lfaWQpIHsKKyAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfU0VUX1NDU0lfSUQ7CisgICAgfQorI2lmZGVmIENPTkZJR19JU0EKKyAgICBpZiAoYXNjX2R2Yy0+YnVzX3R5cGUgJiBBU0NfSVNfSVNBKSB7CisgICAgICAgIEFzY1NldElzYURtYUNoYW5uZWwoaW9wX2Jhc2UsIGFzY19kdmMtPmNmZy0+aXNhX2RtYV9jaGFubmVsKTsKKyAgICAgICAgQXNjU2V0SXNhRG1hU3BlZWQoaW9wX2Jhc2UsIGFzY19kdmMtPmNmZy0+aXNhX2RtYV9zcGVlZCk7CisgICAgfQorI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KKyAgICByZXR1cm4gKHdhcm5fY29kZSk7Cit9CisKK1NUQVRJQyB1c2hvcnQKK0FzY0luaXRBc2MxMDAwRHJpdmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMKKykKK3sKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHdhcm5fY29kZTsKKyAgICBQb3J0QWRkciAgICAgICAgICAgIGlvcF9iYXNlOworCisgICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKyAgICB3YXJuX2NvZGUgPSAwOworICAgIGlmICgoYXNjX2R2Yy0+ZHZjX2NudGwgJiBBU0NfQ05UTF9SRVNFVF9TQ1NJKSAmJgorICAgICAgICAhKGFzY19kdmMtPmluaXRfc3RhdGUgJiBBU0NfSU5JVF9SRVNFVF9TQ1NJX0RPTkUpKSB7CisgICAgICAgIEFzY1Jlc2V0Q2hpcEFuZFNjc2lCdXMoYXNjX2R2Yyk7CisgICAgICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoKEFTQ19EQ05UKQorICAgICAgICAgICAgKCh1c2hvcnQpIGFzY19kdmMtPnNjc2lfcmVzZXRfd2FpdCAqIDEwMDApKTsKKyAgICB9CisgICAgYXNjX2R2Yy0+aW5pdF9zdGF0ZSB8PSBBU0NfSU5JVF9TVEFURV9CRUdfTE9BRF9NQzsKKyAgICBpZiAoYXNjX2R2Yy0+ZXJyX2NvZGUgIT0gMCkKKyAgICAgICAgcmV0dXJuIChVV19FUlIpOworICAgIGlmICghQXNjRmluZFNpZ25hdHVyZShhc2NfZHZjLT5pb3BfYmFzZSkpIHsKKyAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgPSBBU0NfSUVSUl9CQURfU0lHTkFUVVJFOworICAgICAgICByZXR1cm4gKHdhcm5fY29kZSk7CisgICAgfQorICAgIEFzY0Rpc2FibGVJbnRlcnJ1cHQoaW9wX2Jhc2UpOworICAgIHdhcm5fY29kZSB8PSBBc2NJbml0THJhbShhc2NfZHZjKTsKKyAgICBpZiAoYXNjX2R2Yy0+ZXJyX2NvZGUgIT0gMCkKKyAgICAgICAgcmV0dXJuIChVV19FUlIpOworICAgIEFTQ19EQkcxKDEsICJBc2NJbml0QXNjMTAwMERyaXZlcjogX2FzY19tY29kZV9jaGtzdW0gMHglbHhcbiIsCisgICAgICAgICh1bG9uZykgX2FzY19tY29kZV9jaGtzdW0pOworICAgIGlmIChBc2NMb2FkTWljcm9Db2RlKGlvcF9iYXNlLCAwLCBfYXNjX21jb2RlX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfYXNjX21jb2RlX3NpemUpICE9IF9hc2NfbWNvZGVfY2hrc3VtKSB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX01DT0RFX0NIS1NVTTsKKyAgICAgICAgcmV0dXJuICh3YXJuX2NvZGUpOworICAgIH0KKyAgICB3YXJuX2NvZGUgfD0gQXNjSW5pdE1pY3JvQ29kZVZhcihhc2NfZHZjKTsKKyAgICBhc2NfZHZjLT5pbml0X3N0YXRlIHw9IEFTQ19JTklUX1NUQVRFX0VORF9MT0FEX01DOworICAgIEFzY0VuYWJsZUludGVycnVwdChpb3BfYmFzZSk7CisgICAgcmV0dXJuICh3YXJuX2NvZGUpOworfQorCitTVEFUSUMgdXNob3J0IF9faW5pdAorQXNjSW5pdEFzY0R2Y1ZhcigKKyAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICBpOworICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7CisgICAgdXNob3J0ICAgICAgICAgICAgICB3YXJuX2NvZGU7CisgICAgdWNoYXIgICAgICAgICAgICAgICBjaGlwX3ZlcnNpb247CisKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworICAgIHdhcm5fY29kZSA9IDA7CisgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgPSAwOworICAgIGlmICgoYXNjX2R2Yy0+YnVzX3R5cGUgJgorICAgICAgICAgKEFTQ19JU19JU0EgfCBBU0NfSVNfUENJIHwgQVNDX0lTX0VJU0EgfCBBU0NfSVNfVkwpKSA9PSAwKSB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX05PX0JVU19UWVBFOworICAgIH0KKyAgICBBc2NTZXRDaGlwQ29udHJvbChpb3BfYmFzZSwgQ0NfSEFMVCk7CisgICAgQXNjU2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSwgMCk7CisgICAgYXNjX2R2Yy0+YnVnX2ZpeF9jbnRsID0gMDsKKyAgICBhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciA9IDA7CisgICAgYXNjX2R2Yy0+cGNpX2ZpeF9hc3luX3hmZXJfYWx3YXlzID0gMDsKKyAgICAvKiBhc2NfZHZjLT5pbml0X3N0YXRlIGluaXRhbGl6ZWQgaW4gQXNjSW5pdEdldENvbmZpZygpLiAqLworICAgIGFzY19kdmMtPnNkdHJfZG9uZSA9IDA7CisgICAgYXNjX2R2Yy0+Y3VyX3RvdGFsX3FuZyA9IDA7CisgICAgYXNjX2R2Yy0+aXNfaW5faW50ID0gMDsKKyAgICBhc2NfZHZjLT5pbl9jcml0aWNhbF9jbnQgPSAwOworICAgIGFzY19kdmMtPmxhc3RfcV9zaG9ydGFnZSA9IDA7CisgICAgYXNjX2R2Yy0+dXNlX3RhZ2dlZF9xbmcgPSAwOworICAgIGFzY19kdmMtPm5vX3NjYW0gPSAwOworICAgIGFzY19kdmMtPnVuaXRfbm90X3JlYWR5ID0gMDsKKyAgICBhc2NfZHZjLT5xdWV1ZV9mdWxsX29yX2J1c3kgPSAwOworICAgIGFzY19kdmMtPnJlZG9fc2NhbSA9IDA7CisgICAgYXNjX2R2Yy0+cmVzMiA9IDA7CisgICAgYXNjX2R2Yy0+aG9zdF9pbml0X3NkdHJfaW5kZXggPSAwOworICAgIGFzY19kdmMtPmNmZy0+Y2FuX3RhZ2dlZF9xbmcgPSAwOworICAgIGFzY19kdmMtPmNmZy0+Y21kX3FuZ19lbmFibGVkID0gMDsKKyAgICBhc2NfZHZjLT5kdmNfY250bCA9IEFTQ19ERUZfRFZDX0NOVEw7CisgICAgYXNjX2R2Yy0+aW5pdF9zZHRyID0gMDsKKyAgICBhc2NfZHZjLT5tYXhfdG90YWxfcW5nID0gQVNDX0RFRl9NQVhfVE9UQUxfUU5HOworICAgIGFzY19kdmMtPnNjc2lfcmVzZXRfd2FpdCA9IDM7CisgICAgYXNjX2R2Yy0+c3RhcnRfbW90b3IgPSBBU0NfU0NTSV9XSURUSF9CSVRfU0VUOworICAgIGFzY19kdmMtPm1heF9kbWFfY291bnQgPSBBc2NHZXRNYXhEbWFDb3VudChhc2NfZHZjLT5idXNfdHlwZSk7CisgICAgYXNjX2R2Yy0+Y2ZnLT5zZHRyX2VuYWJsZSA9IEFTQ19TQ1NJX1dJRFRIX0JJVF9TRVQ7CisgICAgYXNjX2R2Yy0+Y2ZnLT5kaXNjX2VuYWJsZSA9IEFTQ19TQ1NJX1dJRFRIX0JJVF9TRVQ7CisgICAgYXNjX2R2Yy0+Y2ZnLT5jaGlwX3Njc2lfaWQgPSBBU0NfREVGX0NISVBfU0NTSV9JRDsKKyAgICBhc2NfZHZjLT5jZmctPmxpYl9zZXJpYWxfbm8gPSBBU0NfTElCX1NFUklBTF9OVU1CRVI7CisgICAgYXNjX2R2Yy0+Y2ZnLT5saWJfdmVyc2lvbiA9IChBU0NfTElCX1ZFUlNJT05fTUFKT1IgPDwgOCkgfAorICAgICAgQVNDX0xJQl9WRVJTSU9OX01JTk9SOworICAgIGNoaXBfdmVyc2lvbiA9IEFzY0dldENoaXBWZXJzaW9uKGlvcF9iYXNlLCBhc2NfZHZjLT5idXNfdHlwZSk7CisgICAgYXNjX2R2Yy0+Y2ZnLT5jaGlwX3ZlcnNpb24gPSBjaGlwX3ZlcnNpb247CisgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzBdID0gU1lOX1hGRVJfTlNfMDsKKyAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbMV0gPSBTWU5fWEZFUl9OU18xOworICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFsyXSA9IFNZTl9YRkVSX05TXzI7CisgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzNdID0gU1lOX1hGRVJfTlNfMzsKKyAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbNF0gPSBTWU5fWEZFUl9OU180OworICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFs1XSA9IFNZTl9YRkVSX05TXzU7CisgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzZdID0gU1lOX1hGRVJfTlNfNjsKKyAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbN10gPSBTWU5fWEZFUl9OU183OworICAgIGFzY19kdmMtPm1heF9zZHRyX2luZGV4ID0gNzsKKyAgICBpZiAoKGFzY19kdmMtPmJ1c190eXBlICYgQVNDX0lTX1BDSSkgJiYKKyAgICAgICAgKGNoaXBfdmVyc2lvbiA+PSBBU0NfQ0hJUF9WRVJfUENJX1VMVFJBXzMxNTApKSB7CisgICAgICAgIGFzY19kdmMtPmJ1c190eXBlID0gQVNDX0lTX1BDSV9VTFRSQTsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzBdID0gU1lOX1VMVFJBX1hGRVJfTlNfMDsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzFdID0gU1lOX1VMVFJBX1hGRVJfTlNfMTsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzJdID0gU1lOX1VMVFJBX1hGRVJfTlNfMjsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzNdID0gU1lOX1VMVFJBX1hGRVJfTlNfMzsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzRdID0gU1lOX1VMVFJBX1hGRVJfTlNfNDsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzVdID0gU1lOX1VMVFJBX1hGRVJfTlNfNTsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzZdID0gU1lOX1VMVFJBX1hGRVJfTlNfNjsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzddID0gU1lOX1VMVFJBX1hGRVJfTlNfNzsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzhdID0gU1lOX1VMVFJBX1hGRVJfTlNfODsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzldID0gU1lOX1VMVFJBX1hGRVJfTlNfOTsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzEwXSA9IFNZTl9VTFRSQV9YRkVSX05TXzEwOworICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbMTFdID0gU1lOX1VMVFJBX1hGRVJfTlNfMTE7CisgICAgICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFsxMl0gPSBTWU5fVUxUUkFfWEZFUl9OU18xMjsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzEzXSA9IFNZTl9VTFRSQV9YRkVSX05TXzEzOworICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbMTRdID0gU1lOX1VMVFJBX1hGRVJfTlNfMTQ7CisgICAgICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFsxNV0gPSBTWU5fVUxUUkFfWEZFUl9OU18xNTsKKyAgICAgICAgYXNjX2R2Yy0+bWF4X3NkdHJfaW5kZXggPSAxNTsKKyAgICAgICAgaWYgKGNoaXBfdmVyc2lvbiA9PSBBU0NfQ0hJUF9WRVJfUENJX1VMVFJBXzMxNTApCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzY1NldEV4dHJhQ29udHJvbChpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAoU0VDX0FDVElWRV9ORUdBVEUgfCBTRUNfU0xFV19SQVRFKSk7CisgICAgICAgIH0gZWxzZSBpZiAoY2hpcF92ZXJzaW9uID49IEFTQ19DSElQX1ZFUl9QQ0lfVUxUUkFfMzA1MCkgeworICAgICAgICAgICAgQXNjU2V0RXh0cmFDb250cm9sKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgIChTRUNfQUNUSVZFX05FR0FURSB8IFNFQ19FTkFCTEVfRklMVEVSKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFzY19kdmMtPmJ1c190eXBlID09IEFTQ19JU19QQ0kpIHsKKyAgICAgICAgICAgQXNjU2V0RXh0cmFDb250cm9sKGlvcF9iYXNlLCAoU0VDX0FDVElWRV9ORUdBVEUgfCBTRUNfU0xFV19SQVRFKSk7CisgICAgfQorCisgICAgYXNjX2R2Yy0+Y2ZnLT5pc2FfZG1hX3NwZWVkID0gQVNDX0RFRl9JU0FfRE1BX1NQRUVEOworICAgIGlmIChBc2NHZXRDaGlwQnVzVHlwZShpb3BfYmFzZSkgPT0gQVNDX0lTX0lTQVBOUCkgeworICAgICAgICBBc2NTZXRDaGlwSUZDKGlvcF9iYXNlLCBJRkNfSU5JVF9ERUZBVUxUKTsKKyAgICAgICAgYXNjX2R2Yy0+YnVzX3R5cGUgPSBBU0NfSVNfSVNBUE5QOworICAgIH0KKyNpZmRlZiBDT05GSUdfSVNBCisgICAgaWYgKChhc2NfZHZjLT5idXNfdHlwZSAmIEFTQ19JU19JU0EpICE9IDApIHsKKyAgICAgICAgYXNjX2R2Yy0+Y2ZnLT5pc2FfZG1hX2NoYW5uZWwgPSAodWNoYXIpIEFzY0dldElzYURtYUNoYW5uZWwoaW9wX2Jhc2UpOworICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfSVNBICovCisgICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGFzY19kdmMtPmN1cl9kdmNfcW5nW2ldID0gMDsKKyAgICAgICAgYXNjX2R2Yy0+bWF4X2R2Y19xbmdbaV0gPSBBU0NfTUFYX1NDU0kxX1FORzsKKyAgICAgICAgYXNjX2R2Yy0+c2NzaXFfYnVzeV9oZWFkW2ldID0gKEFTQ19TQ1NJX1EgKikgMEw7CisgICAgICAgIGFzY19kdmMtPnNjc2lxX2J1c3lfdGFpbFtpXSA9IChBU0NfU0NTSV9RICopIDBMOworICAgICAgICBhc2NfZHZjLT5jZmctPm1heF90YWdfcW5nW2ldID0gQVNDX01BWF9JTlJBTV9UQUdfUU5HOworICAgIH0KKyAgICByZXR1cm4gKHdhcm5fY29kZSk7Cit9CisKK1NUQVRJQyB1c2hvcnQgX19pbml0CitBc2NJbml0RnJvbUVFUChBU0NfRFZDX1ZBUiAqYXNjX2R2YykKK3sKKyAgICBBU0NFRVBfQ09ORklHICAgICAgIGVlcF9jb25maWdfYnVmOworICAgIEFTQ0VFUF9DT05GSUcgICAgICAgKmVlcF9jb25maWc7CisgICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIGNoa3N1bTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHdhcm5fY29kZTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIGNmZ19tc3csIGNmZ19sc3c7CisgICAgaW50ICAgICAgICAgICAgICAgICBpOworICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGVfZWVwID0gMDsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisgICAgd2Fybl9jb2RlID0gMDsKKyAgICBBc2NXcml0ZUxyYW1Xb3JkKGlvcF9iYXNlLCBBU0NWX0hBTFRDT0RFX1csIDB4MDBGRSk7CisgICAgQXNjU3RvcFF1ZXVlRXhlKGlvcF9iYXNlKTsKKyAgICBpZiAoKEFzY1N0b3BDaGlwKGlvcF9iYXNlKSA9PSBGQUxTRSkgfHwKKyAgICAgICAgKEFzY0dldENoaXBTY3NpQ3RybChpb3BfYmFzZSkgIT0gMCkpIHsKKyAgICAgICAgYXNjX2R2Yy0+aW5pdF9zdGF0ZSB8PSBBU0NfSU5JVF9SRVNFVF9TQ1NJX0RPTkU7CisgICAgICAgIEFzY1Jlc2V0Q2hpcEFuZFNjc2lCdXMoYXNjX2R2Yyk7CisgICAgICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoKEFTQ19EQ05UKQorICAgICAgICAgICAgKCh1c2hvcnQpIGFzY19kdmMtPnNjc2lfcmVzZXRfd2FpdCAqIDEwMDApKTsKKyAgICB9CisgICAgaWYgKEFzY0lzQ2hpcEhhbHRlZChpb3BfYmFzZSkgPT0gRkFMU0UpIHsKKyAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfU1RBUlRfU1RPUF9DSElQOworICAgICAgICByZXR1cm4gKHdhcm5fY29kZSk7CisgICAgfQorICAgIEFzY1NldFBDQWRkcihpb3BfYmFzZSwgQVNDX01DT0RFX1NUQVJUX0FERFIpOworICAgIGlmIChBc2NHZXRQQ0FkZHIoaW9wX2Jhc2UpICE9IEFTQ19NQ09ERV9TVEFSVF9BRERSKSB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX1NFVF9QQ19BRERSOworICAgICAgICByZXR1cm4gKHdhcm5fY29kZSk7CisgICAgfQorICAgIGVlcF9jb25maWcgPSAoQVNDRUVQX0NPTkZJRyAqKSAmZWVwX2NvbmZpZ19idWY7CisgICAgY2ZnX21zdyA9IEFzY0dldENoaXBDZmdNc3coaW9wX2Jhc2UpOworICAgIGNmZ19sc3cgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKTsKKyAgICBpZiAoKGNmZ19tc3cgJiBBU0NfQ0ZHX01TV19DTFJfTUFTSykgIT0gMCkgeworICAgICAgICBjZmdfbXN3ICY9ICh+KEFTQ19DRkdfTVNXX0NMUl9NQVNLKSk7CisgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9DRkdfTVNXX1JFQ09WRVI7CisgICAgICAgIEFzY1NldENoaXBDZmdNc3coaW9wX2Jhc2UsIGNmZ19tc3cpOworICAgIH0KKyAgICBjaGtzdW0gPSBBc2NHZXRFRVBDb25maWcoaW9wX2Jhc2UsIGVlcF9jb25maWcsIGFzY19kdmMtPmJ1c190eXBlKTsKKyAgICBBU0NfREJHMSgxLCAiQXNjSW5pdEZyb21FRVA6IGNoa3N1bSAweCV4XG4iLCBjaGtzdW0pOworICAgIGlmIChjaGtzdW0gPT0gMCkgeworICAgICAgICBjaGtzdW0gPSAweGFhNTU7CisgICAgfQorICAgIGlmIChBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKSAmIENTV19BVVRPX0NPTkZJRykgeworICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fQVVUT19DT05GSUc7CisgICAgICAgIGlmIChhc2NfZHZjLT5jZmctPmNoaXBfdmVyc2lvbiA9PSAzKSB7CisgICAgICAgICAgICBpZiAoZWVwX2NvbmZpZy0+Y2ZnX2xzdyAhPSBjZmdfbHN3KSB7CisgICAgICAgICAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0VFUFJPTV9SRUNPVkVSOworICAgICAgICAgICAgICAgIGVlcF9jb25maWctPmNmZ19sc3cgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlZXBfY29uZmlnLT5jZmdfbXN3ICE9IGNmZ19tc3cpIHsKKyAgICAgICAgICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fRUVQUk9NX1JFQ09WRVI7CisgICAgICAgICAgICAgICAgZWVwX2NvbmZpZy0+Y2ZnX21zdyA9IEFzY0dldENoaXBDZmdNc3coaW9wX2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVlcF9jb25maWctPmNmZ19tc3cgJj0gfkFTQ19DRkdfTVNXX0NMUl9NQVNLOworICAgIGVlcF9jb25maWctPmNmZ19sc3cgfD0gQVNDX0NGRzBfSE9TVF9JTlRfT047CisgICAgQVNDX0RCRzEoMSwgIkFzY0luaXRGcm9tRUVQOiBlZXBfY29uZmlnLT5jaGtzdW0gMHgleFxuIiwKKyAgICAgICAgZWVwX2NvbmZpZy0+Y2hrc3VtKTsKKyAgICBpZiAoY2hrc3VtICE9IGVlcF9jb25maWctPmNoa3N1bSkgeworICAgICAgICAgICAgaWYgKEFzY0dldENoaXBWZXJzaW9uKGlvcF9iYXNlLCBhc2NfZHZjLT5idXNfdHlwZSkgPT0KKyAgICAgICAgICAgICAgICAgICAgQVNDX0NISVBfVkVSX1BDSV9VTFRSQV8zMDUwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBU0NfREJHKDEsCisiQXNjSW5pdEZyb21FRVA6IGNoa3N1bSBlcnJvciBpZ25vcmVkOyBFRVBST00tbGVzcyBib2FyZFxuIik7CisgICAgICAgICAgICAgICAgZWVwX2NvbmZpZy0+aW5pdF9zZHRyID0gMHhGRjsKKyAgICAgICAgICAgICAgICBlZXBfY29uZmlnLT5kaXNjX2VuYWJsZSA9IDB4RkY7CisgICAgICAgICAgICAgICAgZWVwX2NvbmZpZy0+c3RhcnRfbW90b3IgPSAweEZGOworICAgICAgICAgICAgICAgIGVlcF9jb25maWctPnVzZV9jbWRfcW5nID0gMDsKKyAgICAgICAgICAgICAgICBlZXBfY29uZmlnLT5tYXhfdG90YWxfcW5nID0gMHhGMDsKKyAgICAgICAgICAgICAgICBlZXBfY29uZmlnLT5tYXhfdGFnX3FuZyA9IDB4MjA7CisgICAgICAgICAgICAgICAgZWVwX2NvbmZpZy0+Y250bCA9IDB4QkZGRjsKKyAgICAgICAgICAgICAgICBBU0NfRUVQX1NFVF9DSElQX0lEKGVlcF9jb25maWcsIDcpOworICAgICAgICAgICAgICAgIGVlcF9jb25maWctPm5vX3NjYW0gPSAwOworICAgICAgICAgICAgICAgIGVlcF9jb25maWctPmFkYXB0ZXJfaW5mb1swXSA9IDA7CisgICAgICAgICAgICAgICAgZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzFdID0gMDsKKyAgICAgICAgICAgICAgICBlZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bMl0gPSAwOworICAgICAgICAgICAgICAgIGVlcF9jb25maWctPmFkYXB0ZXJfaW5mb1szXSA9IDA7CisgICAgICAgICAgICAgICAgZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzRdID0gMDsKKyAgICAgICAgICAgICAgICAvKiBJbmRpY2F0ZSBFRVBST00tbGVzcyBib2FyZC4gKi8KKyAgICAgICAgICAgICAgICBlZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bNV0gPSAweEJCOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBU0NfUFJJTlQoCisiQXNjSW5pdEZyb21FRVA6IEVFUFJPTSBjaGVja3N1bSBlcnJvcjsgV2lsbCB0cnkgdG8gcmUtd3JpdGUgRUVQUk9NLlxuIik7CisgICAgICAgICAgICAgICAgd3JpdGVfZWVwID0gMTsKKyAgICAgICAgICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fRUVQUk9NX0NIS1NVTTsKKyAgICAgICAgICAgIH0KKyAgICB9CisgICAgYXNjX2R2Yy0+Y2ZnLT5zZHRyX2VuYWJsZSA9IGVlcF9jb25maWctPmluaXRfc2R0cjsKKyAgICBhc2NfZHZjLT5jZmctPmRpc2NfZW5hYmxlID0gZWVwX2NvbmZpZy0+ZGlzY19lbmFibGU7CisgICAgYXNjX2R2Yy0+Y2ZnLT5jbWRfcW5nX2VuYWJsZWQgPSBlZXBfY29uZmlnLT51c2VfY21kX3FuZzsKKyAgICBhc2NfZHZjLT5jZmctPmlzYV9kbWFfc3BlZWQgPSBBU0NfRUVQX0dFVF9ETUFfU1BEKGVlcF9jb25maWcpOworICAgIGFzY19kdmMtPnN0YXJ0X21vdG9yID0gZWVwX2NvbmZpZy0+c3RhcnRfbW90b3I7CisgICAgYXNjX2R2Yy0+ZHZjX2NudGwgPSBlZXBfY29uZmlnLT5jbnRsOworICAgIGFzY19kdmMtPm5vX3NjYW0gPSBlZXBfY29uZmlnLT5ub19zY2FtOworICAgIGFzY19kdmMtPmNmZy0+YWRhcHRlcl9pbmZvWzBdID0gZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzBdOworICAgIGFzY19kdmMtPmNmZy0+YWRhcHRlcl9pbmZvWzFdID0gZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzFdOworICAgIGFzY19kdmMtPmNmZy0+YWRhcHRlcl9pbmZvWzJdID0gZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzJdOworICAgIGFzY19kdmMtPmNmZy0+YWRhcHRlcl9pbmZvWzNdID0gZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzNdOworICAgIGFzY19kdmMtPmNmZy0+YWRhcHRlcl9pbmZvWzRdID0gZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzRdOworICAgIGFzY19kdmMtPmNmZy0+YWRhcHRlcl9pbmZvWzVdID0gZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzVdOworICAgIGlmICghQXNjVGVzdEV4dGVybmFsTHJhbShhc2NfZHZjKSkgeworICAgICAgICBpZiAoKChhc2NfZHZjLT5idXNfdHlwZSAmIEFTQ19JU19QQ0lfVUxUUkEpID09IEFTQ19JU19QQ0lfVUxUUkEpKSB7CisgICAgICAgICAgICBlZXBfY29uZmlnLT5tYXhfdG90YWxfcW5nID0gQVNDX01BWF9QQ0lfVUxUUkFfSU5SQU1fVE9UQUxfUU5HOworICAgICAgICAgICAgZWVwX2NvbmZpZy0+bWF4X3RhZ19xbmcgPSBBU0NfTUFYX1BDSV9VTFRSQV9JTlJBTV9UQUdfUU5HOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZWVwX2NvbmZpZy0+Y2ZnX21zdyB8PSAweDA4MDA7CisgICAgICAgICAgICBjZmdfbXN3IHw9IDB4MDgwMDsKKyAgICAgICAgICAgIEFzY1NldENoaXBDZmdNc3coaW9wX2Jhc2UsIGNmZ19tc3cpOworICAgICAgICAgICAgZWVwX2NvbmZpZy0+bWF4X3RvdGFsX3FuZyA9IEFTQ19NQVhfUENJX0lOUkFNX1RPVEFMX1FORzsKKyAgICAgICAgICAgIGVlcF9jb25maWctPm1heF90YWdfcW5nID0gQVNDX01BWF9JTlJBTV9UQUdfUU5HOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICB9CisgICAgaWYgKGVlcF9jb25maWctPm1heF90b3RhbF9xbmcgPCBBU0NfTUlOX1RPVEFMX1FORykgeworICAgICAgICBlZXBfY29uZmlnLT5tYXhfdG90YWxfcW5nID0gQVNDX01JTl9UT1RBTF9RTkc7CisgICAgfQorICAgIGlmIChlZXBfY29uZmlnLT5tYXhfdG90YWxfcW5nID4gQVNDX01BWF9UT1RBTF9RTkcpIHsKKyAgICAgICAgZWVwX2NvbmZpZy0+bWF4X3RvdGFsX3FuZyA9IEFTQ19NQVhfVE9UQUxfUU5HOworICAgIH0KKyAgICBpZiAoZWVwX2NvbmZpZy0+bWF4X3RhZ19xbmcgPiBlZXBfY29uZmlnLT5tYXhfdG90YWxfcW5nKSB7CisgICAgICAgIGVlcF9jb25maWctPm1heF90YWdfcW5nID0gZWVwX2NvbmZpZy0+bWF4X3RvdGFsX3FuZzsKKyAgICB9CisgICAgaWYgKGVlcF9jb25maWctPm1heF90YWdfcW5nIDwgQVNDX01JTl9UQUdfUV9QRVJfRFZDKSB7CisgICAgICAgIGVlcF9jb25maWctPm1heF90YWdfcW5nID0gQVNDX01JTl9UQUdfUV9QRVJfRFZDOworICAgIH0KKyAgICBhc2NfZHZjLT5tYXhfdG90YWxfcW5nID0gZWVwX2NvbmZpZy0+bWF4X3RvdGFsX3FuZzsKKyAgICBpZiAoKGVlcF9jb25maWctPnVzZV9jbWRfcW5nICYgZWVwX2NvbmZpZy0+ZGlzY19lbmFibGUpICE9CisgICAgICAgIGVlcF9jb25maWctPnVzZV9jbWRfcW5nKSB7CisgICAgICAgIGVlcF9jb25maWctPmRpc2NfZW5hYmxlID0gZWVwX2NvbmZpZy0+dXNlX2NtZF9xbmc7CisgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9DTURfUU5HX0NPTkZMSUNUOworICAgIH0KKyAgICBpZiAoYXNjX2R2Yy0+YnVzX3R5cGUgJiAoQVNDX0lTX0lTQSB8IEFTQ19JU19WTCB8IEFTQ19JU19FSVNBKSkgeworICAgICAgICBhc2NfZHZjLT5pcnFfbm8gPSBBc2NHZXRDaGlwSVJRKGlvcF9iYXNlLCBhc2NfZHZjLT5idXNfdHlwZSk7CisgICAgfQorICAgIEFTQ19FRVBfU0VUX0NISVBfSUQoZWVwX2NvbmZpZywgQVNDX0VFUF9HRVRfQ0hJUF9JRChlZXBfY29uZmlnKSAmIEFTQ19NQVhfVElEKTsKKyAgICBhc2NfZHZjLT5jZmctPmNoaXBfc2NzaV9pZCA9IEFTQ19FRVBfR0VUX0NISVBfSUQoZWVwX2NvbmZpZyk7CisgICAgaWYgKCgoYXNjX2R2Yy0+YnVzX3R5cGUgJiBBU0NfSVNfUENJX1VMVFJBKSA9PSBBU0NfSVNfUENJX1VMVFJBKSAmJgorICAgICAgICAhKGFzY19kdmMtPmR2Y19jbnRsICYgQVNDX0NOVExfU0RUUl9FTkFCTEVfVUxUUkEpKSB7CisgICAgICAgIGFzY19kdmMtPmhvc3RfaW5pdF9zZHRyX2luZGV4ID0gQVNDX1NEVFJfVUxUUkFfUENJXzEwTUJfSU5ERVg7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGFzY19kdmMtPmRvc19pbnQxM190YWJsZVtpXSA9IGVlcF9jb25maWctPmRvc19pbnQxM190YWJsZVtpXTsKKyAgICAgICAgYXNjX2R2Yy0+Y2ZnLT5tYXhfdGFnX3FuZ1tpXSA9IGVlcF9jb25maWctPm1heF90YWdfcW5nOworICAgICAgICBhc2NfZHZjLT5jZmctPnNkdHJfcGVyaW9kX29mZnNldFtpXSA9CisgICAgICAgICAgICAodWNoYXIpIChBU0NfREVGX1NEVFJfT0ZGU0VUIHwKKyAgICAgICAgICAgICAgICAgICAgIChhc2NfZHZjLT5ob3N0X2luaXRfc2R0cl9pbmRleCA8PCA0KSk7CisgICAgfQorICAgIGVlcF9jb25maWctPmNmZ19tc3cgPSBBc2NHZXRDaGlwQ2ZnTXN3KGlvcF9iYXNlKTsKKyAgICBpZiAod3JpdGVfZWVwKSB7CisgICAgICAgIGlmICgoaSA9IEFzY1NldEVFUENvbmZpZyhpb3BfYmFzZSwgZWVwX2NvbmZpZywgYXNjX2R2Yy0+YnVzX3R5cGUpKSAhPQorICAgICAgICAgICAgIDApIHsKKyAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAorIkFzY0luaXRGcm9tRUVQOiBGYWlsZWQgdG8gcmUtd3JpdGUgRUVQUk9NIHdpdGggJWQgZXJyb3JzLlxuIiwgaSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQVNDX1BSSU5UKCJBc2NJbml0RnJvbUVFUDogU3VjY2VzZnVsbHkgcmUtd3JvdGUgRUVQUk9NLiIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAod2Fybl9jb2RlKTsKK30KKworU1RBVElDIHVzaG9ydAorQXNjSW5pdE1pY3JvQ29kZVZhcigKKyAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMKKykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgIGk7CisgICAgdXNob3J0ICAgICAgICAgICAgICB3YXJuX2NvZGU7CisgICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKKyAgICBBU0NfUEFERFIgICAgICAgICAgIHBoeV9hZGRyOworICAgIEFTQ19EQ05UICAgICAgICAgICAgcGh5X3NpemU7CisKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworICAgIHdhcm5fY29kZSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIEFzY1B1dE1Db2RlSW5pdFNEVFJBdElEKGlvcF9iYXNlLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5jZmctPnNkdHJfcGVyaW9kX29mZnNldFtpXQorKTsKKyAgICB9CisKKyAgICBBc2NJbml0UUxpbmtWYXIoYXNjX2R2Yyk7CisgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9ESVNDX0VOQUJMRV9CLAorICAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+Y2ZnLT5kaXNjX2VuYWJsZSk7CisgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9IT1NUU0NTSV9JRF9CLAorICAgICAgICAgICAgICAgICAgICAgQVNDX1RJRF9UT19UQVJHRVRfSUQoYXNjX2R2Yy0+Y2ZnLT5jaGlwX3Njc2lfaWQpKTsKKworICAgIC8qIEFsaWduIG92ZXJydW4gYnVmZmVyIG9uIGFuIDggYnl0ZSBib3VuZGFyeS4gKi8KKyAgICBwaHlfYWRkciA9IHZpcnRfdG9fYnVzKGFzY19kdmMtPmNmZy0+b3ZlcnJ1bl9idWYpOworICAgIHBoeV9hZGRyID0gY3B1X3RvX2xlMzIoKHBoeV9hZGRyICsgNykgJiB+MHg3KTsKKyAgICBBc2NNZW1EV29yZENvcHlQdHJUb0xyYW0oaW9wX2Jhc2UsIEFTQ1ZfT1ZFUlJVTl9QQUREUl9ELAorICAgICAgICAodWNoYXIgKikgJnBoeV9hZGRyLCAxKTsKKyAgICBwaHlfc2l6ZSA9IGNwdV90b19sZTMyKEFTQ19PVkVSUlVOX0JTSVpFIC0gOCk7CisgICAgQXNjTWVtRFdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLCBBU0NWX09WRVJSVU5fQlNJWkVfRCwKKyAgICAgICAgKHVjaGFyICopICZwaHlfc2l6ZSwgMSk7CisKKyAgICBhc2NfZHZjLT5jZmctPm1jb2RlX2RhdGUgPQorICAgICAgICBBc2NSZWFkTHJhbVdvcmQoaW9wX2Jhc2UsICh1c2hvcnQpIEFTQ1ZfTUNfREFURV9XKTsKKyAgICBhc2NfZHZjLT5jZmctPm1jb2RlX3ZlcnNpb24gPQorICAgICAgICBBc2NSZWFkTHJhbVdvcmQoaW9wX2Jhc2UsICh1c2hvcnQpIEFTQ1ZfTUNfVkVSX1cpOworCisgICAgQXNjU2V0UENBZGRyKGlvcF9iYXNlLCBBU0NfTUNPREVfU1RBUlRfQUREUik7CisgICAgaWYgKEFzY0dldFBDQWRkcihpb3BfYmFzZSkgIT0gQVNDX01DT0RFX1NUQVJUX0FERFIpIHsKKyAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfU0VUX1BDX0FERFI7CisgICAgICAgIHJldHVybiAod2Fybl9jb2RlKTsKKyAgICB9CisgICAgaWYgKEFzY1N0YXJ0Q2hpcChpb3BfYmFzZSkgIT0gMSkgeworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9TVEFSVF9TVE9QX0NISVA7CisgICAgICAgIHJldHVybiAod2Fybl9jb2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHdhcm5fY29kZSk7Cit9CisKK1NUQVRJQyBpbnQgX19pbml0CitBc2NUZXN0RXh0ZXJuYWxMcmFtKAorICAgICAgICAgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YykKK3sKKyAgICBQb3J0QWRkciAgICAgICAgICAgIGlvcF9iYXNlOworICAgIHVzaG9ydCAgICAgICAgICAgICAgcV9hZGRyOworICAgIHVzaG9ydCAgICAgICAgICAgICAgc2F2ZWRfd29yZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHN0YTsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisgICAgc3RhID0gMDsKKyAgICBxX2FkZHIgPSBBU0NfUU5PX1RPX1FBRERSKDI0MSk7CisgICAgc2F2ZWRfd29yZCA9IEFzY1JlYWRMcmFtV29yZChpb3BfYmFzZSwgcV9hZGRyKTsKKyAgICBBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIHFfYWRkcik7CisgICAgQXNjU2V0Q2hpcExyYW1EYXRhKGlvcF9iYXNlLCAweDU1QUEpOworICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMTApOworICAgIEFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgcV9hZGRyKTsKKyAgICBpZiAoQXNjR2V0Q2hpcExyYW1EYXRhKGlvcF9iYXNlKSA9PSAweDU1QUEpIHsKKyAgICAgICAgc3RhID0gMTsKKyAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgcV9hZGRyLCBzYXZlZF93b3JkKTsKKyAgICB9CisgICAgcmV0dXJuIChzdGEpOworfQorCitTVEFUSUMgaW50IF9faW5pdAorQXNjV3JpdGVFRVBDbWRSZWcoCisgICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgIHVjaGFyIGNtZF9yZWcKKykKK3sKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHJlYWRfYmFjazsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJldHJ5OworCisgICAgcmV0cnkgPSAwOworICAgIHdoaWxlIChUUlVFKSB7CisgICAgICAgIEFzY1NldENoaXBFRVBDbWQoaW9wX2Jhc2UsIGNtZF9yZWcpOworICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKDEpOworICAgICAgICByZWFkX2JhY2sgPSBBc2NHZXRDaGlwRUVQQ21kKGlvcF9iYXNlKTsKKyAgICAgICAgaWYgKHJlYWRfYmFjayA9PSBjbWRfcmVnKSB7CisgICAgICAgICAgICByZXR1cm4gKDEpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXRyeSsrID4gQVNDX0VFUF9NQVhfUkVUUlkpIHsKKyAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1NUQVRJQyBpbnQgX19pbml0CitBc2NXcml0ZUVFUERhdGFSZWcoCisgICAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IGRhdGFfcmVnCispCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICByZWFkX2JhY2s7CisgICAgaW50ICAgICAgICAgICAgICAgICByZXRyeTsKKworICAgIHJldHJ5ID0gMDsKKyAgICB3aGlsZSAoVFJVRSkgeworICAgICAgICBBc2NTZXRDaGlwRUVQRGF0YShpb3BfYmFzZSwgZGF0YV9yZWcpOworICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKDEpOworICAgICAgICByZWFkX2JhY2sgPSBBc2NHZXRDaGlwRUVQRGF0YShpb3BfYmFzZSk7CisgICAgICAgIGlmIChyZWFkX2JhY2sgPT0gZGF0YV9yZWcpIHsKKyAgICAgICAgICAgIHJldHVybiAoMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldHJ5KysgPiBBU0NfRUVQX01BWF9SRVRSWSkgeworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorICAgIH0KK30KKworU1RBVElDIHZvaWQgX19pbml0CitBc2NXYWl0RUVQUmVhZCh2b2lkKQoreworICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMSk7CisgICAgcmV0dXJuOworfQorCitTVEFUSUMgdm9pZCBfX2luaXQKK0FzY1dhaXRFRVBXcml0ZSh2b2lkKQoreworICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMjApOworICAgIHJldHVybjsKK30KKworU1RBVElDIHVzaG9ydCBfX2luaXQKK0FzY1JlYWRFRVBXb3JkKAorICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICB1Y2hhciBhZGRyKQoreworICAgIHVzaG9ydCAgICAgICAgICAgICAgcmVhZF93dmFsOworICAgIHVjaGFyICAgICAgICAgICAgICAgY21kX3JlZzsKKworICAgIEFzY1dyaXRlRUVQQ21kUmVnKGlvcF9iYXNlLCBBU0NfRUVQX0NNRF9XUklURV9ESVNBQkxFKTsKKyAgICBBc2NXYWl0RUVQUmVhZCgpOworICAgIGNtZF9yZWcgPSBhZGRyIHwgQVNDX0VFUF9DTURfUkVBRDsKKyAgICBBc2NXcml0ZUVFUENtZFJlZyhpb3BfYmFzZSwgY21kX3JlZyk7CisgICAgQXNjV2FpdEVFUFJlYWQoKTsKKyAgICByZWFkX3d2YWwgPSBBc2NHZXRDaGlwRUVQRGF0YShpb3BfYmFzZSk7CisgICAgQXNjV2FpdEVFUFJlYWQoKTsKKyAgICByZXR1cm4gKHJlYWRfd3ZhbCk7Cit9CisKK1NUQVRJQyB1c2hvcnQgX19pbml0CitBc2NXcml0ZUVFUFdvcmQoCisgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgdWNoYXIgYWRkciwKKyAgICAgICAgICAgICAgICAgICB1c2hvcnQgd29yZF92YWwpCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICByZWFkX3d2YWw7CisKKyAgICByZWFkX3d2YWwgPSBBc2NSZWFkRUVQV29yZChpb3BfYmFzZSwgYWRkcik7CisgICAgaWYgKHJlYWRfd3ZhbCAhPSB3b3JkX3ZhbCkgeworICAgICAgICBBc2NXcml0ZUVFUENtZFJlZyhpb3BfYmFzZSwgQVNDX0VFUF9DTURfV1JJVEVfQUJMRSk7CisgICAgICAgIEFzY1dhaXRFRVBSZWFkKCk7CisgICAgICAgIEFzY1dyaXRlRUVQRGF0YVJlZyhpb3BfYmFzZSwgd29yZF92YWwpOworICAgICAgICBBc2NXYWl0RUVQUmVhZCgpOworICAgICAgICBBc2NXcml0ZUVFUENtZFJlZyhpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoKHVjaGFyKSBBU0NfRUVQX0NNRF9XUklURSB8IGFkZHIpKTsKKyAgICAgICAgQXNjV2FpdEVFUFdyaXRlKCk7CisgICAgICAgIEFzY1dyaXRlRUVQQ21kUmVnKGlvcF9iYXNlLCBBU0NfRUVQX0NNRF9XUklURV9ESVNBQkxFKTsKKyAgICAgICAgQXNjV2FpdEVFUFJlYWQoKTsKKyAgICAgICAgcmV0dXJuIChBc2NSZWFkRUVQV29yZChpb3BfYmFzZSwgYWRkcikpOworICAgIH0KKyAgICByZXR1cm4gKHJlYWRfd3ZhbCk7Cit9CisKK1NUQVRJQyB1c2hvcnQgX19pbml0CitBc2NHZXRFRVBDb25maWcoCisgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgQVNDRUVQX0NPTkZJRyAqIGNmZ19idWYsIHVzaG9ydCBidXNfdHlwZSkKK3sKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHd2YWw7CisgICAgdXNob3J0ICAgICAgICAgICAgICBzdW07CisgICAgdXNob3J0ICAgICAgICAgICAgICAqd2J1ZjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGNmZ19iZWc7CisgICAgaW50ICAgICAgICAgICAgICAgICBjZmdfZW5kOworICAgIGludCAgICAgICAgICAgICAgICAgdWNoYXJfZW5kX2luX2NvbmZpZyA9IEFTQ19FRVBfTUFYX0RWQ19BRERSIC0gMjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHNfYWRkcjsKKworICAgIHdidWYgPSAodXNob3J0ICopIGNmZ19idWY7CisgICAgc3VtID0gMDsKKyAgICAvKiBSZWFkIHR3byBjb25maWcgd29yZHM7IEJ5dGUtc3dhcHBpbmcgZG9uZSBieSBBc2NSZWFkRUVQV29yZCgpLiAqLworICAgIGZvciAoc19hZGRyID0gMDsgc19hZGRyIDwgMjsgc19hZGRyKyssIHdidWYrKykgeworICAgICAgICAqd2J1ZiA9IEFzY1JlYWRFRVBXb3JkKGlvcF9iYXNlLCAodWNoYXIpIHNfYWRkcik7CisgICAgICAgIHN1bSArPSAqd2J1ZjsKKyAgICB9CisgICAgaWYgKGJ1c190eXBlICYgQVNDX0lTX1ZMKSB7CisgICAgICAgIGNmZ19iZWcgPSBBU0NfRUVQX0RWQ19DRkdfQkVHX1ZMOworICAgICAgICBjZmdfZW5kID0gQVNDX0VFUF9NQVhfRFZDX0FERFJfVkw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2ZnX2JlZyA9IEFTQ19FRVBfRFZDX0NGR19CRUc7CisgICAgICAgIGNmZ19lbmQgPSBBU0NfRUVQX01BWF9EVkNfQUREUjsKKyAgICB9CisgICAgZm9yIChzX2FkZHIgPSBjZmdfYmVnOyBzX2FkZHIgPD0gKGNmZ19lbmQgLSAxKTsgc19hZGRyKyssIHdidWYrKykgeworICAgICAgICB3dmFsID0gQXNjUmVhZEVFUFdvcmQoIGlvcF9iYXNlLCAoIHVjaGFyIClzX2FkZHIgKSA7CisgICAgICAgIGlmIChzX2FkZHIgPD0gdWNoYXJfZW5kX2luX2NvbmZpZykgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFN3YXAgYWxsIGNoYXIgZmllbGRzIC0gbXVzdCB1bnN3YXAgYnl0ZXMgYWxyZWFkeSBzd2FwcGVkCisgICAgICAgICAgICAgKiBieSBBc2NSZWFkRUVQV29yZCgpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICAqd2J1ZiA9IGxlMTZfdG9fY3B1KHd2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogRG9uJ3Qgc3dhcCB3b3JkIGZpZWxkIGF0IHRoZSBlbmQgLSBjbnRsIGZpZWxkLiAqLworICAgICAgICAgICAgKndidWYgPSB3dmFsOworICAgICAgICB9CisgICAgICAgIHN1bSArPSB3dmFsOyAvKiBDaGVja3N1bSB0cmVhdHMgYWxsIEVFUFJPTSBkYXRhIGFzIHdvcmRzLiAqLworICAgIH0KKyAgICAvKgorICAgICAqIFJlYWQgdGhlIGNoZWNrc3VtIHdvcmQgd2hpY2ggd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0ICdzdW0nCisgICAgICogYnkgdGhlIGNhbGxlci4gV29yZCBmaWVsZCBhbHJlYWR5IHN3YXBwZWQuCisgICAgICovCisgICAgKndidWYgPSBBc2NSZWFkRUVQV29yZChpb3BfYmFzZSwgKHVjaGFyKSBzX2FkZHIpOworICAgIHJldHVybiAoc3VtKTsKK30KKworU1RBVElDIGludCBfX2luaXQKK0FzY1NldEVFUENvbmZpZ09uY2UoCisgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICBBU0NFRVBfQ09ORklHICogY2ZnX2J1ZiwgdXNob3J0IGJ1c190eXBlKQoreworICAgIGludCAgICAgICAgICAgICAgICAgbl9lcnJvcjsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICp3YnVmOworICAgIHVzaG9ydCAgICAgICAgICAgICAgd29yZDsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHN1bTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHNfYWRkcjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGNmZ19iZWc7CisgICAgaW50ICAgICAgICAgICAgICAgICBjZmdfZW5kOworICAgIGludCAgICAgICAgICAgICAgICAgdWNoYXJfZW5kX2luX2NvbmZpZyA9IEFTQ19FRVBfTUFYX0RWQ19BRERSIC0gMjsKKworCisgICAgd2J1ZiA9ICh1c2hvcnQgKikgY2ZnX2J1ZjsKKyAgICBuX2Vycm9yID0gMDsKKyAgICBzdW0gPSAwOworICAgIC8qIFdyaXRlIHR3byBjb25maWcgd29yZHM7IEFzY1dyaXRlRUVQV29yZCgpIHdpbGwgc3dhcCBieXRlcy4gKi8KKyAgICBmb3IgKHNfYWRkciA9IDA7IHNfYWRkciA8IDI7IHNfYWRkcisrLCB3YnVmKyspIHsKKyAgICAgICAgc3VtICs9ICp3YnVmOworICAgICAgICBpZiAoKndidWYgIT0gQXNjV3JpdGVFRVBXb3JkKGlvcF9iYXNlLCAodWNoYXIpIHNfYWRkciwgKndidWYpKSB7CisgICAgICAgICAgICBuX2Vycm9yKys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ1c190eXBlICYgQVNDX0lTX1ZMKSB7CisgICAgICAgIGNmZ19iZWcgPSBBU0NfRUVQX0RWQ19DRkdfQkVHX1ZMOworICAgICAgICBjZmdfZW5kID0gQVNDX0VFUF9NQVhfRFZDX0FERFJfVkw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2ZnX2JlZyA9IEFTQ19FRVBfRFZDX0NGR19CRUc7CisgICAgICAgIGNmZ19lbmQgPSBBU0NfRUVQX01BWF9EVkNfQUREUjsKKyAgICB9CisgICAgZm9yIChzX2FkZHIgPSBjZmdfYmVnOyBzX2FkZHIgPD0gKGNmZ19lbmQgLSAxKTsgc19hZGRyKyssIHdidWYrKykgeworICAgICAgICBpZiAoc19hZGRyIDw9IHVjaGFyX2VuZF9pbl9jb25maWcpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGlzIGlzIGEgY2hhciBmaWVsZC4gU3dhcCBjaGFyIGZpZWxkcyBiZWZvcmUgdGhleSBhcmUKKyAgICAgICAgICAgICAqIHN3YXBwZWQgYWdhaW4gYnkgQXNjV3JpdGVFRVBXb3JkKCkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHdvcmQgPSBjcHVfdG9fbGUxNigqd2J1Zik7CisgICAgICAgICAgICBpZiAod29yZCAhPSBBc2NXcml0ZUVFUFdvcmQoIGlvcF9iYXNlLCAodWNoYXIpIHNfYWRkciwgd29yZCkpIHsKKyAgICAgICAgICAgICAgICBuX2Vycm9yKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBEb24ndCBzd2FwIHdvcmQgZmllbGQgYXQgdGhlIGVuZCAtIGNudGwgZmllbGQuICovCisgICAgICAgICAgICBpZiAoKndidWYgIT0gQXNjV3JpdGVFRVBXb3JkKGlvcF9iYXNlLCAodWNoYXIpIHNfYWRkciwgKndidWYpKSB7CisgICAgICAgICAgICAgICAgbl9lcnJvcisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN1bSArPSAqd2J1ZjsgLyogQ2hlY2tzdW0gY2FsY3VsYXRlZCBmcm9tIHdvcmQgdmFsdWVzLiAqLworICAgIH0KKyAgICAvKiBXcml0ZSBjaGVja3N1bSB3b3JkLiBJdCB3aWxsIGJlIHN3YXBwZWQgYnkgQXNjV3JpdGVFRVBXb3JkKCkuICovCisgICAgKndidWYgPSBzdW07CisgICAgaWYgKHN1bSAhPSBBc2NXcml0ZUVFUFdvcmQoaW9wX2Jhc2UsICh1Y2hhcikgc19hZGRyLCBzdW0pKSB7CisgICAgICAgIG5fZXJyb3IrKzsKKyAgICB9CisKKyAgICAvKiBSZWFkIEVFUFJPTSBiYWNrIGFnYWluLiAqLworICAgIHdidWYgPSAodXNob3J0ICopIGNmZ19idWY7CisgICAgLyoKKyAgICAgKiBSZWFkIHR3byBjb25maWcgd29yZHM7IEJ5dGUtc3dhcHBpbmcgZG9uZSBieSBBc2NSZWFkRUVQV29yZCgpLgorICAgICAqLworICAgIGZvciAoc19hZGRyID0gMDsgc19hZGRyIDwgMjsgc19hZGRyKyssIHdidWYrKykgeworICAgICAgICBpZiAoKndidWYgIT0gQXNjUmVhZEVFUFdvcmQoaW9wX2Jhc2UsICh1Y2hhcikgc19hZGRyKSkgeworICAgICAgICAgICAgbl9lcnJvcisrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChidXNfdHlwZSAmIEFTQ19JU19WTCkgeworICAgICAgICBjZmdfYmVnID0gQVNDX0VFUF9EVkNfQ0ZHX0JFR19WTDsKKyAgICAgICAgY2ZnX2VuZCA9IEFTQ19FRVBfTUFYX0RWQ19BRERSX1ZMOworICAgIH0gZWxzZSB7CisgICAgICAgIGNmZ19iZWcgPSBBU0NfRUVQX0RWQ19DRkdfQkVHOworICAgICAgICBjZmdfZW5kID0gQVNDX0VFUF9NQVhfRFZDX0FERFI7CisgICAgfQorICAgIGZvciAoc19hZGRyID0gY2ZnX2JlZzsgc19hZGRyIDw9IChjZmdfZW5kIC0gMSk7IHNfYWRkcisrLCB3YnVmKyspIHsKKyAgICAgICAgaWYgKHNfYWRkciA8PSB1Y2hhcl9lbmRfaW5fY29uZmlnKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU3dhcCBhbGwgY2hhciBmaWVsZHMuIE11c3QgdW5zd2FwIGJ5dGVzIGFscmVhZHkgc3dhcHBlZAorICAgICAgICAgICAgICogYnkgQXNjUmVhZEVFUFdvcmQoKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgd29yZCA9IGxlMTZfdG9fY3B1KEFzY1JlYWRFRVBXb3JkKGlvcF9iYXNlLCAodWNoYXIpIHNfYWRkcikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogRG9uJ3Qgc3dhcCB3b3JkIGZpZWxkIGF0IHRoZSBlbmQgLSBjbnRsIGZpZWxkLiAqLworICAgICAgICAgICAgd29yZCA9IEFzY1JlYWRFRVBXb3JkKGlvcF9iYXNlLCAodWNoYXIpIHNfYWRkcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCp3YnVmICE9IHdvcmQpIHsKKyAgICAgICAgICAgIG5fZXJyb3IrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBSZWFkIGNoZWNrc3VtOyBCeXRlIHN3YXBwaW5nIG5vdCBuZWVkZWQuICovCisgICAgaWYgKEFzY1JlYWRFRVBXb3JkKGlvcF9iYXNlLCAodWNoYXIpIHNfYWRkcikgIT0gc3VtKSB7CisgICAgICAgIG5fZXJyb3IrKzsKKyAgICB9CisgICAgcmV0dXJuIChuX2Vycm9yKTsKK30KKworU1RBVElDIGludCBfX2luaXQKK0FzY1NldEVFUENvbmZpZygKKyAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICBBU0NFRVBfQ09ORklHICogY2ZnX2J1ZiwgdXNob3J0IGJ1c190eXBlCispCit7CisgICAgaW50ICAgICAgICAgICAgcmV0cnk7CisgICAgaW50ICAgICAgICAgICAgbl9lcnJvcjsKKworICAgIHJldHJ5ID0gMDsKKyAgICB3aGlsZSAoVFJVRSkgeworICAgICAgICBpZiAoKG5fZXJyb3IgPSBBc2NTZXRFRVBDb25maWdPbmNlKGlvcF9iYXNlLCBjZmdfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c190eXBlKSkgPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCsrcmV0cnkgPiBBU0NfRUVQX01BWF9SRVRSWSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChuX2Vycm9yKTsKK30KKworU1RBVElDIHZvaWQKK0FzY0FzeW5jRml4KAorICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCisgICAgICAgICAgICAgICB1Y2hhciB0aWRfbm8sCisgICAgICAgICAgICAgICBBU0NfU0NTSV9JTlFVSVJZICppbnEpCit7CisgICAgdWNoYXIgICAgICAgICAgICAgICAgICAgICAgIGR2Y190eXBlOworICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFICAgICAgICB0aWRfYml0czsKKworICAgIGR2Y190eXBlID0gQVNDX0lOUV9EVkNfVFlQRShpbnEpOworICAgIHRpZF9iaXRzID0gQVNDX1RJWF9UT19UQVJHRVRfSUQodGlkX25vKTsKKworICAgIGlmIChhc2NfZHZjLT5idWdfZml4X2NudGwgJiBBU0NfQlVHX0ZJWF9BU1lOX1VTRV9TWU4pCisgICAgeworICAgICAgICBpZiAoIShhc2NfZHZjLT5pbml0X3NkdHIgJiB0aWRfYml0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoZHZjX3R5cGUgPT0gVFlQRV9ST00pICYmCisgICAgICAgICAgICAgICAgKEFzY0NvbXBhcmVTdHJpbmcoKHVjaGFyICopIGlucS0+dmVuZG9yX2lkLAorICAgICAgICAgICAgICAgICAgICAodWNoYXIgKikgIkhQICIsIDMpID09IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyX2Fsd2F5cyB8PSB0aWRfYml0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyIHw9IHRpZF9iaXRzOworICAgICAgICAgICAgaWYgKChkdmNfdHlwZSA9PSBUWVBFX1BST0NFU1NPUikgfHwKKyAgICAgICAgICAgICAgICAoZHZjX3R5cGUgPT0gVFlQRV9TQ0FOTkVSKSB8fAorICAgICAgICAgICAgICAgIChkdmNfdHlwZSA9PSBUWVBFX1JPTSkgfHwKKyAgICAgICAgICAgICAgICAoZHZjX3R5cGUgPT0gVFlQRV9UQVBFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciAmPSB+dGlkX2JpdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciAmIHRpZF9iaXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzY1NldFJ1bkNoaXBTeW5SZWdBdElEKGFzY19kdmMtPmlvcF9iYXNlLCB0aWRfbm8sCisgICAgICAgICAgICAgICAgICAgIEFTWU5fU0RUUl9EQVRBX0ZJWF9QQ0lfUkVWX0FCKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisKK1NUQVRJQyBpbnQKK0FzY1RhZ1F1ZXVpbmdTYWZlKEFTQ19TQ1NJX0lOUVVJUlkgKmlucSkKK3sKKyAgICBpZiAoKGlucS0+YWRkX2xlbiA+PSAzMikgJiYKKyAgICAgICAgKEFzY0NvbXBhcmVTdHJpbmcoKHVjaGFyICopIGlucS0+dmVuZG9yX2lkLAorICAgICAgICAgICAgKHVjaGFyICopICJRVUFOVFVNIFhQMzQzMDEiLCAxNSkgPT0gMCkgJiYKKyAgICAgICAgKEFzY0NvbXBhcmVTdHJpbmcoKHVjaGFyICopIGlucS0+cHJvZHVjdF9yZXZfbGV2ZWwsCisgICAgICAgICAgICAodWNoYXIgKikgIjEwNzEiLCA0KSA9PSAwKSkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworU1RBVElDIHZvaWQKK0FzY0lucXVpcnlIYW5kbGluZyhBU0NfRFZDX1ZBUiAqYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgICB1Y2hhciB0aWRfbm8sIEFTQ19TQ1NJX0lOUVVJUlkgKmlucSkKK3sKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSB0aWRfYml0ID0gQVNDX1RJWF9UT19UQVJHRVRfSUQodGlkX25vKTsKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBvcmlnX2luaXRfc2R0ciwgb3JpZ191c2VfdGFnZ2VkX3FuZzsKKworICAgIG9yaWdfaW5pdF9zZHRyID0gYXNjX2R2Yy0+aW5pdF9zZHRyOworICAgIG9yaWdfdXNlX3RhZ2dlZF9xbmcgPSBhc2NfZHZjLT51c2VfdGFnZ2VkX3FuZzsKKworICAgIGFzY19kdmMtPmluaXRfc2R0ciAmPSB+dGlkX2JpdDsKKyAgICBhc2NfZHZjLT5jZmctPmNhbl90YWdnZWRfcW5nICY9IH50aWRfYml0OworICAgIGFzY19kdmMtPnVzZV90YWdnZWRfcW5nICY9IH50aWRfYml0OworCisgICAgaWYgKEFTQ19JTlFfUkVTUE9OU0VfRk1UKGlucSkgPj0gMiB8fCBBU0NfSU5RX0FOU0lfVkVSKGlucSkgPj0gMikgeworICAgICAgICBpZiAoKGFzY19kdmMtPmNmZy0+c2R0cl9lbmFibGUgJiB0aWRfYml0KSAmJiBBU0NfSU5RX1NZTkMoaW5xKSkgeworICAgICAgICAgICAgYXNjX2R2Yy0+aW5pdF9zZHRyIHw9IHRpZF9iaXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhc2NfZHZjLT5jZmctPmNtZF9xbmdfZW5hYmxlZCAmIHRpZF9iaXQpICYmCisgICAgICAgICAgICAgQVNDX0lOUV9DTURfUVVFVUUoaW5xKSkgeworICAgICAgICAgICAgaWYgKEFzY1RhZ1F1ZXVpbmdTYWZlKGlucSkpIHsKKyAgICAgICAgICAgICAgICBhc2NfZHZjLT51c2VfdGFnZ2VkX3FuZyB8PSB0aWRfYml0OworICAgICAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+Y2FuX3RhZ2dlZF9xbmcgfD0gdGlkX2JpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAob3JpZ191c2VfdGFnZ2VkX3FuZyAhPSBhc2NfZHZjLT51c2VfdGFnZ2VkX3FuZykgeworICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGFzY19kdmMtPmlvcF9iYXNlLCBBU0NWX0RJU0NfRU5BQkxFX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+Y2ZnLT5kaXNjX2VuYWJsZSk7CisgICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoYXNjX2R2Yy0+aW9wX2Jhc2UsIEFTQ1ZfVVNFX1RBR0dFRF9RTkdfQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT51c2VfdGFnZ2VkX3FuZyk7CisgICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoYXNjX2R2Yy0+aW9wX2Jhc2UsIEFTQ1ZfQ0FOX1RBR0dFRF9RTkdfQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5jZmctPmNhbl90YWdnZWRfcW5nKTsKKworICAgICAgICBhc2NfZHZjLT5tYXhfZHZjX3FuZ1t0aWRfbm9dID0KKyAgICAgICAgICBhc2NfZHZjLT5jZmctPm1heF90YWdfcW5nW3RpZF9ub107CisgICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoYXNjX2R2Yy0+aW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKEFTQ1ZfTUFYX0RWQ19RTkdfQkVHICsgdGlkX25vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5tYXhfZHZjX3FuZ1t0aWRfbm9dKTsKKyAgICB9CisgICAgaWYgKG9yaWdfaW5pdF9zZHRyICE9IGFzY19kdmMtPmluaXRfc2R0cikgeworICAgICAgICBBc2NBc3luY0ZpeChhc2NfZHZjLCB0aWRfbm8sIGlucSk7CisgICAgfQorICAgIHJldHVybjsKK30KKworU1RBVElDIGludAorQXNjQ29tcGFyZVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgdWNoYXIgKnN0cjEsCisgICAgICAgICAgICAgICAgICAgIHVjaGFyICpzdHIyLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGVuCispCit7CisgICAgaW50ICAgICAgICAgICAgICAgICBpOworICAgIGludCAgICAgICAgICAgICAgICAgZGlmZjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBkaWZmID0gKGludCkgKHN0cjFbaV0gLSBzdHIyW2ldKTsKKyAgICAgICAgaWYgKGRpZmYgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAoZGlmZik7CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyB1Y2hhcgorQXNjUmVhZExyYW1CeXRlKAorICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgIHVzaG9ydCBhZGRyCispCit7CisgICAgdWNoYXIgICAgICAgICAgICAgICBieXRlX2RhdGE7CisgICAgdXNob3J0ICAgICAgICAgICAgICB3b3JkX2RhdGE7CisKKyAgICBpZiAoaXNvZGRfd29yZChhZGRyKSkgeworICAgICAgICBBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIGFkZHIgLSAxKTsKKyAgICAgICAgd29yZF9kYXRhID0gQXNjR2V0Q2hpcExyYW1EYXRhKGlvcF9iYXNlKTsKKyAgICAgICAgYnl0ZV9kYXRhID0gKHVjaGFyKSAoKHdvcmRfZGF0YSA+PiA4KSAmIDB4RkYpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgYWRkcik7CisgICAgICAgIHdvcmRfZGF0YSA9IEFzY0dldENoaXBMcmFtRGF0YShpb3BfYmFzZSk7CisgICAgICAgIGJ5dGVfZGF0YSA9ICh1Y2hhcikgKHdvcmRfZGF0YSAmIDB4RkYpOworICAgIH0KKyAgICByZXR1cm4gKGJ5dGVfZGF0YSk7Cit9CitTVEFUSUMgdXNob3J0CitBc2NSZWFkTHJhbVdvcmQoCisgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgdXNob3J0IGFkZHIKKykKK3sKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHdvcmRfZGF0YTsKKworICAgIEFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgYWRkcik7CisgICAgd29yZF9kYXRhID0gQXNjR2V0Q2hpcExyYW1EYXRhKGlvcF9iYXNlKTsKKyAgICByZXR1cm4gKHdvcmRfZGF0YSk7Cit9CisKKyNpZiBDQ19WRVJZX0xPTkdfU0dfTElTVAorU1RBVElDIEFTQ19EQ05UCitBc2NSZWFkTHJhbURXb3JkKAorICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgdXNob3J0IGFkZHIKKykKK3sKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHZhbF9sb3csIHZhbF9oaWdoOworICAgIEFTQ19EQ05UICAgICAgICAgICAgZHdvcmRfZGF0YTsKKworICAgIEFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgYWRkcik7CisgICAgdmFsX2xvdyA9IEFzY0dldENoaXBMcmFtRGF0YShpb3BfYmFzZSk7CisgICAgdmFsX2hpZ2ggPSBBc2NHZXRDaGlwTHJhbURhdGEoaW9wX2Jhc2UpOworICAgIGR3b3JkX2RhdGEgPSAoKEFTQ19EQ05UKSB2YWxfaGlnaCA8PCAxNikgfCAoQVNDX0RDTlQpIHZhbF9sb3c7CisgICAgcmV0dXJuIChkd29yZF9kYXRhKTsKK30KKyNlbmRpZiAvKiBDQ19WRVJZX0xPTkdfU0dfTElTVCAqLworCitTVEFUSUMgdm9pZAorQXNjV3JpdGVMcmFtV29yZCgKKyAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBhZGRyLAorICAgICAgICAgICAgICAgICAgICB1c2hvcnQgd29yZF92YWwKKykKK3sKKyAgICBBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIGFkZHIpOworICAgIEFzY1NldENoaXBMcmFtRGF0YShpb3BfYmFzZSwgd29yZF92YWwpOworICAgIHJldHVybjsKK30KKworU1RBVElDIHZvaWQKK0FzY1dyaXRlTHJhbUJ5dGUoCisgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICB1c2hvcnQgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgdWNoYXIgYnl0ZV92YWwKKykKK3sKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHdvcmRfZGF0YTsKKworICAgIGlmIChpc29kZF93b3JkKGFkZHIpKSB7CisgICAgICAgIGFkZHItLTsKKyAgICAgICAgd29yZF9kYXRhID0gQXNjUmVhZExyYW1Xb3JkKGlvcF9iYXNlLCBhZGRyKTsKKyAgICAgICAgd29yZF9kYXRhICY9IDB4MDBGRjsKKyAgICAgICAgd29yZF9kYXRhIHw9ICgoKHVzaG9ydCkgYnl0ZV92YWwgPDwgOCkgJiAweEZGMDApOworICAgIH0gZWxzZSB7CisgICAgICAgIHdvcmRfZGF0YSA9IEFzY1JlYWRMcmFtV29yZChpb3BfYmFzZSwgYWRkcik7CisgICAgICAgIHdvcmRfZGF0YSAmPSAweEZGMDA7CisgICAgICAgIHdvcmRfZGF0YSB8PSAoKHVzaG9ydCkgYnl0ZV92YWwgJiAweDAwRkYpOworICAgIH0KKyAgICBBc2NXcml0ZUxyYW1Xb3JkKGlvcF9iYXNlLCBhZGRyLCB3b3JkX2RhdGEpOworICAgIHJldHVybjsKK30KKworLyoKKyAqIENvcHkgMiBieXRlcyB0byBMUkFNLgorICoKKyAqIFRoZSBzb3VyY2UgZGF0YSBpcyBhc3N1bWVkIHRvIGJlIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIgaW4gbWVtb3J5CisgKiBhbmQgaXMgbWFpbnRhaW5lZCBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyIHdoZW4gd3JpdHRlbiB0byBMUkFNLgorICovCitTVEFUSUMgdm9pZAorQXNjTWVtV29yZENvcHlQdHJUb0xyYW0oCisgICAgICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBzX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciAqc19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd29yZHMKKykKK3sKKyAgICBpbnQgICAgaTsKKworICAgIEFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgc19hZGRyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMiAqIHdvcmRzOyBpICs9IDIpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogT24gYSBsaXR0bGUtZW5kaWFuIHN5c3RlbSB0aGUgc2Vjb25kIGFyZ3VtZW50IGJlbG93CisgICAgICAgICAqIHByb2R1Y2VzIGEgbGl0dGxlLWVuZGlhbiB1c2hvcnQgd2hpY2ggaXMgd3JpdHRlbiB0bworICAgICAgICAgKiBMUkFNIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuIE9uIGEgYmlnLWVuZGlhbiBzeXN0ZW0KKyAgICAgICAgICogdGhlIHNlY29uZCBhcmd1bWVudCBwcm9kdWNlcyBhIGJpZy1lbmRpYW4gdXNob3J0IHdoaWNoCisgICAgICAgICAqIGlzICJ0cmFuc3BhcmVudGx5IiBieXRlLXN3YXBwZWQgYnkgb3V0cHcoKSBhbmQgd3JpdHRlbgorICAgICAgICAgKiBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyIHRvIExSQU0uCisgICAgICAgICAqLworICAgICAgICBvdXRwdyhpb3BfYmFzZSArIElPUF9SQU1fREFUQSwKKyAgICAgICAgICAgICgodXNob3J0KSBzX2J1ZmZlcltpICsgMV0gPDwgOCkgfCBzX2J1ZmZlcltpXSk7CisgICAgfQorICAgIHJldHVybjsKK30KKworLyoKKyAqIENvcHkgNCBieXRlcyB0byBMUkFNLgorICoKKyAqIFRoZSBzb3VyY2UgZGF0YSBpcyBhc3N1bWVkIHRvIGJlIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIgaW4gbWVtb3J5CisgKiBhbmQgaXMgbWFpbnRhaW5lZCBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyIHdoZW4gd3JpdGVuIHRvIExSQU0uCisgKi8KK1NUQVRJQyB2b2lkCitBc2NNZW1EV29yZENvcHlQdHJUb0xyYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciAqc19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGR3b3JkcworKQoreworICAgIGludCAgICAgICBpOworCisgICAgQXNjU2V0Q2hpcExyYW1BZGRyKGlvcF9iYXNlLCBzX2FkZHIpOworICAgIGZvciAoaSA9IDA7IGkgPCA0ICogZHdvcmRzOyBpICs9IDQpIHsKKyAgICAgICAgb3V0cHcoaW9wX2Jhc2UgKyBJT1BfUkFNX0RBVEEsCisgICAgICAgICAgICAoKHVzaG9ydCkgc19idWZmZXJbaSArIDFdIDw8IDgpIHwgc19idWZmZXJbaV0pOyAvKiBMU1cgKi8KKyAgICAgICAgb3V0cHcoaW9wX2Jhc2UgKyBJT1BfUkFNX0RBVEEsCisgICAgICAgICAgICAoKHVzaG9ydCkgc19idWZmZXJbaSArIDNdIDw8IDgpIHwgc19idWZmZXJbaSArIDJdKTsgLyogTVNXICovCisgICAgfQorICAgIHJldHVybjsKK30KKworLyoKKyAqIENvcHkgMiBieXRlcyBmcm9tIExSQU0uCisgKgorICogVGhlIHNvdXJjZSBkYXRhIGlzIGFzc3VtZWQgdG8gYmUgaW4gbGl0dGxlLWVuZGlhbiBvcmRlciBpbiBMUkFNCisgKiBhbmQgaXMgbWFpbnRhaW5lZCBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyIHdoZW4gd3JpdHRlbiB0byBtZW1vcnkuCisgKi8KK1NUQVRJQyB2b2lkCitBc2NNZW1Xb3JkQ29weVB0ckZyb21McmFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgKmRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd29yZHMKKykKK3sKKyAgICBpbnQgaTsKKyAgICB1c2hvcnQgd29yZDsKKworICAgIEFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgc19hZGRyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMiAqIHdvcmRzOyBpICs9IDIpIHsKKyAgICAgICAgd29yZCA9IGlucHcoaW9wX2Jhc2UgKyBJT1BfUkFNX0RBVEEpOworICAgICAgICBkX2J1ZmZlcltpXSA9IHdvcmQgJiAweGZmOworICAgICAgICBkX2J1ZmZlcltpICsgMV0gPSAod29yZCA+PiA4KSAmIDB4ZmY7CisgICAgfQorICAgIHJldHVybjsKK30KKworU1RBVElDIEFTQ19EQ05UCitBc2NNZW1TdW1McmFtV29yZCgKKyAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgIGludCB3b3JkcworKQoreworICAgIEFTQ19EQ05UICAgICAgICAgc3VtOworICAgIGludCAgICAgICAgICAgICAgaTsKKworICAgIHN1bSA9IDBMOworICAgIGZvciAoaSA9IDA7IGkgPCB3b3JkczsgaSsrLCBzX2FkZHIgKz0gMikgeworICAgICAgICBzdW0gKz0gQXNjUmVhZExyYW1Xb3JkKGlvcF9iYXNlLCBzX2FkZHIpOworICAgIH0KKyAgICByZXR1cm4gKHN1bSk7Cit9CisKK1NUQVRJQyB2b2lkCitBc2NNZW1Xb3JkU2V0THJhbSgKKyAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBzZXRfd3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgIGludCB3b3JkcworKQoreworICAgIGludCAgICAgICAgICAgICBpOworCisgICAgQXNjU2V0Q2hpcExyYW1BZGRyKGlvcF9iYXNlLCBzX2FkZHIpOworICAgIGZvciAoaSA9IDA7IGkgPCB3b3JkczsgaSsrKSB7CisgICAgICAgIEFzY1NldENoaXBMcmFtRGF0YShpb3BfYmFzZSwgc2V0X3d2YWwpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKworLyoKKyAqIC0tLSBBZHYgTGlicmFyeSBGdW5jdGlvbnMKKyAqLworCisvKiBhX21jb2RlLmggKi8KKworLyogTWljcm9jb2RlIGJ1ZmZlciBpcyBrZXB0IGFmdGVyIGluaXRpYWxpemF0aW9uIGZvciBlcnJvciByZWNvdmVyeS4gKi8KK1NUQVRJQyB1bnNpZ25lZCBjaGFyIF9hZHZfYXNjMzU1MF9idWZbXSA9IHsKKyAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHhmMiwgIDB4MDAsICAweGYwLCAgMHgwMCwgIDB4MTYsICAweDE4LCAgMHhlNCwgIDB4MDAsICAweGZjLCAgMHgwMSwgIDB4MDAsICAweDQ4LCAgMHhlNCwKKyAgMHhiZSwgIDB4MTgsICAweDE4LCAgMHg4MCwgIDB4MDMsICAweGY2LCAgMHgwMiwgIDB4MDAsICAweDAwLCAgMHhmYSwgIDB4ZmYsICAweGZmLCAgMHgyOCwgIDB4MGUsICAweDllLCAgMHhlNywKKyAgMHhmZiwgIDB4MDAsICAweDgyLCAgMHhlNywgIDB4MDAsICAweGVhLCAgMHgwMCwgIDB4ZjYsICAweDAxLCAgMHhlNiwgIDB4MDksICAweGU3LCAgMHg1NSwgIDB4ZjAsICAweDAxLCAgMHhmNiwKKyAgMHgwMSwgIDB4ZmEsICAweDA4LCAgMHgwMCwgIDB4MDMsICAweDAwLCAgMHgwNCwgIDB4MDAsICAweDE4LCAgMHhmNCwgIDB4MTAsICAweDAwLCAgMHgwMCwgIDB4ZWMsICAweDg1LCAgMHhmMCwKKyAgMHhiYywgIDB4MDAsICAweGQ1LCAgMHhmMCwgIDB4OGUsICAweDBjLCAgMHgzOCwgIDB4NTQsICAweDAwLCAgMHhlNiwgIDB4MWUsICAweGYwLCAgMHg4NiwgIDB4ZjAsICAweGI0LCAgMHgwMCwKKyAgMHg5OCwgIDB4NTcsICAweGQwLCAgMHgwMSwgIDB4MGMsICAweDFjLCAgMHgzZSwgIDB4MWMsICAweDBjLCAgMHgwMCwgIDB4YmIsICAweDAwLCAgMHhhYSwgIDB4MTgsICAweDAyLCAgMHg4MCwKKyAgMHgzMiwgIDB4ZjAsICAweDAxLCAgMHhmYywgIDB4ODgsICAweDBjLCAgMHhjNiwgIDB4MTIsICAweDAyLCAgMHgxMywgIDB4MTgsICAweDQwLCAgMHgwMCwgIDB4NTcsICAweDAxLCAgMHhlYSwKKyAgMHgzYywgIDB4MDAsICAweDZjLCAgMHgwMSwgIDB4NmUsICAweDAxLCAgMHgwNCwgIDB4MTIsICAweDNlLCAgMHg1NywgIDB4MDAsICAweDgwLCAgMHgwMywgIDB4ZTYsICAweGI2LCAgMHgwMCwKKyAgMHhjMCwgIDB4MDAsICAweDAxLCAgMHgwMSwgIDB4M2UsICAweDAxLCAgMHhkYSwgIDB4MGYsICAweDIyLCAgMHgxMCwgIDB4MDgsICAweDEyLCAgMHgwMiwgIDB4NGEsICAweGI5LCAgMHg1NCwKKyAgMHgwMywgIDB4NTgsICAweDFiLCAgMHg4MCwgIDB4MzAsICAweGU0LCAgMHg0YiwgIDB4ZTQsICAweDIwLCAgMHgwMCwgIDB4MzIsICAweDAwLCAgMHgzZSwgIDB4MDAsICAweDgwLCAgMHgwMCwKKyAgMHgyNCwgIDB4MDEsICAweDNjLCAgMHgwMSwgIDB4NjgsICAweDAxLCAgMHg2YSwgIDB4MDEsICAweDcwLCAgMHgwMSwgIDB4NzIsICAweDAxLCAgMHg3NCwgIDB4MDEsICAweDc2LCAgMHgwMSwKKyAgMHg3OCwgIDB4MDEsICAweDYyLCAgMHgwYSwgIDB4OTIsICAweDBjLCAgMHgyYywgIDB4MTAsICAweDJlLCAgMHgxMCwgIDB4MDYsICAweDEzLCAgMHg0YywgIDB4MWMsICAweGJiLCAgMHg1NSwKKyAgMHgzYywgIDB4NTYsICAweDA0LCAgMHg4MCwgIDB4NGEsICAweGU0LCAgMHgwMiwgIDB4ZWUsICAweDViLCAgMHhmMCwgIDB4YjEsICAweGYwLCAgMHgwMywgIDB4ZjcsICAweDA2LCAgMHhmNywKKyAgMHgwMywgIDB4ZmMsICAweDBmLCAgMHgwMCwgIDB4NDAsICAweDAwLCAgMHhiZSwgIDB4MDAsICAweDAwLCAgMHgwMSwgIDB4YjAsICAweDA4LCAgMHgzMCwgIDB4MTMsICAweDY0LCAgMHgxNSwKKyAgMHgzMiwgIDB4MWMsICAweDM4LCAgMHgxYywgIDB4NGUsICAweDFjLCAgMHgxMCwgIDB4NDQsICAweDAyLCAgMHg0OCwgIDB4MDAsICAweDRjLCAgMHgwNCwgIDB4ZWEsICAweDVkLCAgMHhmMCwKKyAgMHgwNCwgIDB4ZjYsICAweDAyLCAgMHhmYywgIDB4MDUsICAweDAwLCAgMHgzNCwgIDB4MDAsICAweDM2LCAgMHgwMCwgIDB4OTgsICAweDAwLCAgMHhjYywgIDB4MDAsICAweDIwLCAgMHgwMSwKKyAgMHg0ZSwgIDB4MDEsICAweDRlLCAgMHgwYiwgIDB4MWUsICAweDBlLCAgMHgwYywgIDB4MTAsICAweDBhLCAgMHgxMiwgIDB4MDQsICAweDEzLCAgMHg0MCwgIDB4MTMsICAweDMwLCAgMHgxYywKKyAgMHgwMCwgIDB4NGUsICAweGJkLCAgMHg1NiwgIDB4MDYsICAweDgzLCAgMHgwMCwgIDB4ZGMsICAweDA1LCAgMHhmMCwgIDB4MDksICAweGYwLCAgMHg1OSwgIDB4ZjAsICAweGE3LCAgMHhmMCwKKyAgMHhiOCwgIDB4ZjAsICAweDBlLCAgMHhmNywgIDB4MDYsICAweDAwLCAgMHgxOSwgIDB4MDAsICAweDMzLCAgMHgwMCwgIDB4OWIsICAweDAwLCAgMHhhNCwgIDB4MDAsICAweGI1LCAgMHgwMCwKKyAgMHhiYSwgIDB4MDAsICAweGQwLCAgMHgwMCwgIDB4ZTEsICAweDAwLCAgMHhlNywgIDB4MDAsICAweGRlLCAgMHgwMywgIDB4NTYsICAweDBhLCAgMHgxNCwgIDB4MGUsICAweDAyLCAgMHgxMCwKKyAgMHgwNCwgIDB4MTAsICAweDBhLCAgMHgxMCwgIDB4MzYsICAweDEwLCAgMHgwYSwgIDB4MTMsICAweDEyLCAgMHgxMywgIDB4NTIsICAweDEzLCAgMHgxMCwgIDB4MTUsICAweDE0LCAgMHgxNSwKKyAgMHhhYywgIDB4MTYsICAweDIwLCAgMHgxYywgIDB4MzQsICAweDFjLCAgMHgzNiwgIDB4MWMsICAweDA4LCAgMHg0NCwgIDB4MzgsICAweDQ0LCAgMHg5MSwgIDB4NDQsICAweDBhLCAgMHg0NSwKKyAgMHg0OCwgIDB4NDYsICAweDAxLCAgMHg0OCwgIDB4NjgsICAweDU0LCAgMHg4MywgIDB4NTUsICAweGIwLCAgMHg1NywgIDB4MDEsICAweDU4LCAgMHg4MywgIDB4NTksICAweDA1LCAgMHhlNiwKKyAgMHgwYiwgIDB4ZjAsICAweDBjLCAgMHhmMCwgIDB4NWMsICAweGYwLCAgMHg0YiwgIDB4ZjQsICAweDA0LCAgMHhmOCwgIDB4MDUsICAweGY4LCAgMHgwMiwgIDB4ZmEsICAweDAzLCAgMHhmYSwKKyAgMHgwNCwgIDB4ZmMsICAweDA1LCAgMHhmYywgIDB4MDcsICAweDAwLCAgMHgwYSwgIDB4MDAsICAweDBkLCAgMHgwMCwgIDB4MWMsICAweDAwLCAgMHg5ZSwgIDB4MDAsICAweGE4LCAgMHgwMCwKKyAgMHhhYSwgIDB4MDAsICAweGI5LCAgMHgwMCwgIDB4ZTAsICAweDAwLCAgMHgyMiwgIDB4MDEsICAweDI2LCAgMHgwMSwgIDB4NzksICAweDAxLCAgMHg3YSwgIDB4MDEsICAweGMwLCAgMHgwMSwKKyAgMHhjMiwgIDB4MDEsICAweDdjLCAgMHgwMiwgIDB4NWEsICAweDAzLCAgMHhlYSwgIDB4MDQsICAweGU4LCAgMHgwNywgIDB4NjgsICAweDA4LCAgMHg2OSwgIDB4MDgsICAweGJhLCAgMHgwOCwKKyAgMHhlOSwgIDB4MDksICAweDA2LCAgMHgwYiwgIDB4M2EsICAweDBlLCAgMHgwMCwgIDB4MTAsICAweDFhLCAgMHgxMCwgIDB4ZWQsICAweDEwLCAgMHhmMSwgIDB4MTAsICAweDA2LCAgMHgxMiwKKyAgMHgwYywgIDB4MTMsICAweDE2LCAgMHgxMywgIDB4MWUsICAweDEzLCAgMHg4MiwgIDB4MTMsICAweDQyLCAgMHgxNCwgIDB4ZDYsICAweDE0LCAgMHg4YSwgIDB4MTUsICAweGM2LCAgMHgxNywKKyAgMHhkMiwgIDB4MTcsICAweDZiLCAgMHgxOCwgIDB4MTIsICAweDFjLCAgMHg0NiwgIDB4MWMsICAweDljLCAgMHgzMiwgIDB4MDAsICAweDQwLCAgMHgwZSwgIDB4NDcsICAweDQ4LCAgMHg0NywKKyAgMHg0MSwgIDB4NDgsICAweDg5LCAgMHg0OCwgIDB4ODAsICAweDRjLCAgMHgwMCwgIDB4NTQsICAweDQ0LCAgMHg1NSwgIDB4ZTUsICAweDU1LCAgMHgxNCwgIDB4NTYsICAweDc3LCAgMHg1NywKKyAgMHhiZiwgIDB4NTcsICAweDQwLCAgMHg1YywgIDB4MDYsICAweDgwLCAgMHgwOCwgIDB4OTAsICAweDAzLCAgMHhhMSwgIDB4ZmUsICAweDljLCAgMHhmMCwgIDB4MjksICAweDAyLCAgMHhmZSwKKyAgMHhiOCwgIDB4MGMsICAweGZmLCAgMHgxMCwgIDB4MDAsICAweDAwLCAgMHhkMCwgIDB4ZmUsICAweGNjLCAgMHgxOCwgIDB4MDAsICAweGNmLCAgMHhmZSwgIDB4ODAsICAweDAxLCAgMHhmZiwKKyAgMHgwMywgIDB4MDAsICAweDAwLCAgMHhmZSwgIDB4OTMsICAweDE1LCAgMHhmZSwgIDB4MGYsICAweDA1LCAgMHhmZiwgIDB4MzgsICAweDAwLCAgMHgwMCwgIDB4ZmUsICAweDU3LCAgMHgyNCwKKyAgMHgwMCwgIDB4ZmUsICAweDQ4LCAgMHgwMCwgIDB4NGYsICAweGZmLCAgMHgwNCwgIDB4MDAsICAweDAwLCAgMHgxMCwgIDB4ZmYsICAweDA5LCAgMHgwMCwgIDB4MDAsICAweGZmLCAgMHgwOCwKKyAgMHgwMSwgIDB4MDEsICAweGZmLCAgMHgwOCwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4MjcsICAweDAwLCAgMHgwMCwgIDB4ZmYsICAweDEwLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHgwZiwKKyAgMHgwMCwgIDB4MDAsICAweGZlLCAgMHg3OCwgIDB4NTYsICAweGZlLCAgMHgzNCwgIDB4MTIsICAweGZmLCAgMHgyMSwgIDB4MDAsICAweDAwLCAgMHhmZSwgIDB4MDQsICAweGY3LCAgMHhjZiwKKyAgMHgyYSwgIDB4NjcsICAweDBiLCAgMHgwMSwgIDB4ZmUsICAweGNlLCAgMHgwZSwgIDB4ZmUsICAweDA0LCAgMHhmNywgIDB4Y2YsICAweDY3LCAgMHgwYiwgIDB4M2MsICAweDJhLCAgMHhmZSwKKyAgMHgzZCwgIDB4ZjAsICAweGZlLCAgMHgwMiwgIDB4MDIsICAweGZlLCAgMHgyMCwgIDB4ZjAsICAweDljLCAgMHhmZSwgIDB4OTEsICAweGYwLCAgMHhmZSwgIDB4ZjAsICAweDAxLCAgMHhmZSwKKyAgMHg5MCwgIDB4ZjAsICAweGZlLCAgMHhmMCwgIDB4MDEsICAweGZlLCAgMHg4ZiwgIDB4ZjAsICAweDljLCAgMHgwNSwgIDB4NTEsICAweDNiLCAgMHgwMiwgIDB4ZmUsICAweGQ0LCAgMHgwYywKKyAgMHgwMSwgIDB4ZmUsICAweDQ0LCAgMHgwZCwgIDB4ZmUsICAweGRkLCAgMHgxMiwgIDB4ZmUsICAweGZjLCAgMHgxMCwgIDB4ZmUsICAweDI4LCAgMHgxYywgIDB4MDUsICAweGZlLCAgMHhhNiwKKyAgMHgwMCwgIDB4ZmUsICAweGQzLCAgMHgxMiwgIDB4NDcsICAweDE4LCAgMHhmZSwgIDB4YTYsICAweDAwLCAgMHhiNSwgIDB4ZmUsICAweDQ4LCAgMHhmMCwgIDB4ZmUsICAweDg2LCAgMHgwMiwKKyAgMHhmZSwgIDB4NDksICAweGYwLCAgMHhmZSwgIDB4YTAsICAweDAyLCAgMHhmZSwgIDB4NGEsICAweGYwLCAgMHhmZSwgIDB4YmUsICAweDAyLCAgMHhmZSwgIDB4NDYsICAweGYwLCAgMHhmZSwKKyAgMHg1MCwgIDB4MDIsICAweGZlLCAgMHg0NywgIDB4ZjAsICAweGZlLCAgMHg1NiwgIDB4MDIsICAweGZlLCAgMHg0MywgIDB4ZjAsICAweGZlLCAgMHg0NCwgIDB4MDIsICAweGZlLCAgMHg0NCwKKyAgMHhmMCwgIDB4ZmUsICAweDQ4LCAgMHgwMiwgIDB4ZmUsICAweDQ1LCAgMHhmMCwgIDB4ZmUsICAweDRjLCAgMHgwMiwgIDB4MTcsICAweDBiLCAgMHhhMCwgIDB4MTcsICAweDA2LCAgMHgxOCwKKyAgMHg5NiwgIDB4MDIsICAweDI5LCAgMHhmZSwgIDB4MDAsICAweDFjLCAgMHhkZSwgIDB4ZmUsICAweDAyLCAgMHgxYywgIDB4ZGQsICAweGZlLCAgMHgxZSwgIDB4MWMsICAweGZlLCAgMHhlOSwKKyAgMHgxMCwgIDB4MDEsICAweGZlLCAgMHgyMCwgIDB4MTcsICAweGZlLCAgMHhlNywgIDB4MTAsICAweGZlLCAgMHgwNiwgIDB4ZmMsICAweGM3LCAgMHgwYSwgIDB4NmIsICAweDAxLCAgMHg5ZSwKKyAgMHgwMiwgIDB4MjksICAweDE0LCAgMHg0ZCwgIDB4MzcsICAweDk3LCAgMHgwMSwgIDB4ZmUsICAweDY0LCAgMHgwZiwgIDB4MGEsICAweDZiLCAgMHgwMSwgIDB4ODIsICAweGZlLCAgMHhiZCwKKyAgMHgxMCwgIDB4MGEsICAweDZiLCAgMHgwMSwgIDB4ODIsICAweGZlLCAgMHhhZCwgIDB4MTAsICAweGZlLCAgMHgxNiwgIDB4MWMsICAweGZlLCAgMHg1OCwgIDB4MWMsICAweDE3LCAgMHgwNiwKKyAgMHgxOCwgIDB4OTYsICAweDJhLCAgMHgyNSwgIDB4MjksICAweGZlLCAgMHgzZCwgIDB4ZjAsICAweGZlLCAgMHgwMiwgIDB4MDIsICAweDIxLCAgMHhmZSwgIDB4OTQsICAweDAyLCAgMHhmZSwKKyAgMHg1YSwgIDB4MWMsICAweGVhLCAgMHhmZSwgIDB4MTQsICAweDFjLCAgMHgxNCwgIDB4ZmUsICAweDMwLCAgMHgwMCwgIDB4MzcsICAweDk3LCAgMHgwMSwgIDB4ZmUsICAweDU0LCAgMHgwZiwKKyAgMHgxNywgIDB4MDYsICAweDE4LCAgMHg5NiwgIDB4MDIsICAweGQwLCAgMHgxZSwgIDB4MjAsICAweDA3LCAgMHgxMCwgIDB4MzQsICAweGZlLCAgMHg2OSwgIDB4MTAsICAweDE3LCAgMHgwNiwKKyAgMHgxOCwgIDB4OTYsICAweGZlLCAgMHgwNCwgIDB4ZWMsICAweDIwLCAgMHg0NiwgIDB4M2QsICAweDEyLCAgMHgyMCwgIDB4ZmUsICAweDA1LCAgMHhmNiwgIDB4YzcsICAweDAxLCAgMHhmZSwKKyAgMHg1MiwgIDB4MTYsICAweDA5LCAgMHg0YSwgIDB4NGMsICAweDM1LCAgMHgxMSwgIDB4MmQsICAweDNjLCAgMHg4YSwgIDB4MDEsICAweGU2LCAgMHgwMiwgIDB4MjksICAweDBhLCAgMHg0MCwKKyAgMHgwMSwgIDB4MGUsICAweDA3LCAgMHgwMCwgIDB4NWQsICAweDAxLCAgMHg2ZiwgIDB4ZmUsICAweDE4LCAgMHgxMCwgIDB4ZmUsICAweDQxLCAgMHg1OCwgIDB4MGEsICAweDk5LCAgMHgwMSwKKyAgMHgwZSwgIDB4ZmUsICAweGM4LCAgMHg1NCwgIDB4NjQsICAweGZlLCAgMHgwYywgIDB4MDMsICAweDAxLCAgMHhlNiwgIDB4MDIsICAweDI5LCAgMHgyYSwgIDB4NDYsICAweGZlLCAgMHgwMiwKKyAgMHhlOCwgIDB4MjcsICAweGY4LCAgMHhmZSwgIDB4OWUsICAweDQzLCAgMHhmNywgIDB4ZmUsICAweDI3LCAgMHhmMCwgIDB4ZmUsICAweGRjLCAgMHgwMSwgIDB4ZmUsICAweDA3LCAgMHg0YiwKKyAgMHhmZSwgIDB4MjAsICAweGYwLCAgMHg5YywgIDB4ZmUsICAweDQwLCAgMHgxYywgIDB4MjUsICAweGQyLCAgMHhmZSwgIDB4MjYsICAweGYwLCAgMHhmZSwgIDB4NTYsICAweDAzLCAgMHhmZSwKKyAgMHhhMCwgIDB4ZjAsICAweGZlLCAgMHg0NCwgIDB4MDMsICAweGZlLCAgMHgxMSwgIDB4ZjAsICAweDljLCAgMHhmZSwgIDB4ZWYsICAweDEwLCAgMHhmZSwgIDB4OWYsICAweGYwLCAgMHhmZSwKKyAgMHg2NCwgIDB4MDMsICAweGViLCAgMHgwZiwgIDB4ZmUsICAweDExLCAgMHgwMCwgIDB4MDIsICAweDVhLCAgMHgyYSwgIDB4ZmUsICAweDQ4LCAgMHgxYywgIDB4ZWIsICAweDA5LCAgMHgwNCwKKyAgMHgxZCwgIDB4ZmUsICAweDE4LCAgMHgxMywgIDB4MjMsICAweDFlLCAgMHg5OCwgIDB4YWMsICAweDEyLCAgMHg5OCwgIDB4MGEsICAweDQwLCAgMHgwMSwgIDB4MGUsICAweGFjLCAgMHg3NSwKKyAgMHgwMSwgIDB4ZmUsICAweGJjLCAgMHgxNSwgIDB4MTEsICAweGNhLCAgMHgyNSwgIDB4ZDIsICAweGZlLCAgMHgwMSwgIDB4ZjAsICAweGQyLCAgMHhmZSwgIDB4ODIsICAweGYwLCAgMHhmZSwKKyAgMHg5MiwgIDB4MDMsICAweGVjLCAgMHgxMSwgIDB4ZmUsICAweGU0LCAgMHgwMCwgIDB4NjUsICAweGZlLCAgMHhhNCwgIDB4MDMsICAweDI1LCAgMHgzMiwgIDB4MWYsICAweGZlLCAgMHhiNCwKKyAgMHgwMywgIDB4MDEsICAweDQzLCAgMHhmZSwgIDB4MDYsICAweGYwLCAgMHhmZSwgIDB4YzQsICAweDAzLCAgMHg4ZCwgIDB4ODEsICAweGZlLCAgMHgwYSwgIDB4ZjAsICAweGZlLCAgMHg3YSwKKyAgMHgwNiwgIDB4MDIsICAweDIyLCAgMHgwNSwgIDB4NmIsICAweDI4LCAgMHgxNiwgIDB4ZmUsICAweGY2LCAgMHgwNCwgIDB4MTQsICAweDJjLCAgMHgwMSwgIDB4MzMsICAweDhmLCAgMHhmZSwKKyAgMHg2NiwgIDB4MDIsICAweDAyLCAgMHhkMSwgIDB4ZWIsICAweDJhLCAgMHg2NywgIDB4MWEsICAweGZlLCAgMHg2NywgIDB4MWIsICAweGY4LCAgMHhmNywgIDB4ZmUsICAweDQ4LCAgMHgxYywKKyAgMHg3MCwgIDB4MDEsICAweDZlLCAgMHg4NywgIDB4MGEsICAweDQwLCAgMHgwMSwgIDB4MGUsICAweDA3LCAgMHgwMCwgIDB4MTYsICAweGQzLCAgMHgwYSwgIDB4Y2EsICAweDAxLCAgMHgwZSwKKyAgMHg3NCwgIDB4NjAsICAweDU5LCAgMHg3NiwgIDB4MjcsICAweDA1LCAgMHg2YiwgIDB4MjgsICAweGZlLCAgMHgxMCwgIDB4MTIsICAweDE0LCAgMHgyYywgIDB4MDEsICAweDMzLCAgMHg4ZiwKKyAgMHhmZSwgIDB4NjYsICAweDAyLCAgMHgwMiwgIDB4ZDEsICAweGJjLCAgMHg3ZCwgIDB4YmQsICAweDdmLCAgMHgyNSwgIDB4MjIsICAweDY1LCAgMHhmZSwgIDB4M2MsICAweDA0LCAgMHgxZiwKKyAgMHhmZSwgIDB4MzgsICAweDA0LCAgMHg2OCwgIDB4ZmUsICAweGEwLCAgMHgwMCwgIDB4ZmUsICAweDliLCAgMHg1NywgIDB4ZmUsICAweDRlLCAgMHgxMiwgIDB4MmIsICAweGZmLCAgMHgwMiwKKyAgMHgwMCwgIDB4MTAsICAweDAxLCAgMHgwOCwgIDB4MWYsICAweGZlLCAgMHhlMCwgIDB4MDQsICAweDJiLCAgMHgwMSwgIDB4MDgsICAweDFmLCAgMHgyMiwgIDB4MzAsICAweDJlLCAgMHhkNSwKKyAgMHhmZSwgIDB4NGMsICAweDQ0LCAgMHhmZSwgIDB4NGMsICAweDEyLCAgMHg2MCwgIDB4ZmUsICAweDQ0LCAgMHg0OCwgIDB4MTMsICAweDJjLCAgMHhmZSwgIDB4NGMsICAweDU0LCAgMHg2NCwKKyAgMHhkMywgIDB4NDYsICAweDc2LCAgMHgyNywgIDB4ZmEsICAweGVmLCAgMHhmZSwgIDB4NjIsICAweDEzLCAgMHgwOSwgIDB4MDQsICAweDFkLCAgMHhmZSwgIDB4MmEsICAweDEzLCAgMHgyZiwKKyAgMHgwNywgIDB4N2UsICAweGE1LCAgMHhmZSwgIDB4MjAsICAweDEwLCAgMHgxMywgIDB4MmMsICAweGZlLCAgMHg0YywgIDB4NTQsICAweDY0LCAgMHhkMywgIDB4ZmEsICAweGVmLCAgMHg4NiwKKyAgMHgwOSwgIDB4MDQsICAweDFkLCAgMHhmZSwgIDB4MDgsICAweDEzLCAgMHgyZiwgIDB4MDcsICAweDdlLCAgMHg2ZSwgIDB4MDksICAweDA0LCAgMHgxZCwgIDB4ZmUsICAweDFjLCAgMHgxMiwKKyAgMHgxNCwgIDB4OTIsICAweDA5LCAgMHgwNCwgIDB4MDYsICAweDNiLCAgMHgxNCwgIDB4YzQsICAweDAxLCAgMHgzMywgIDB4OGYsICAweGZlLCAgMHg3MCwgIDB4MGMsICAweDAyLCAgMHgyMiwKKyAgMHgyYiwgIDB4MTEsICAweGZlLCAgMHhlNiwgIDB4MDAsICAweGZlLCAgMHgxYywgIDB4OTAsICAweGY5LCAgMHgwMywgIDB4MTQsICAweDkyLCAgMHgwMSwgIDB4MzMsICAweDAyLCAgMHgyOSwKKyAgMHhmZSwgIDB4NDIsICAweDViLCAgMHg2NywgIDB4MWEsICAweGZlLCAgMHg0NiwgIDB4NTksICAweGY4LCAgMHhmNywgIDB4ZmUsICAweDg3LCAgMHg4MCwgIDB4ZmUsICAweDMxLCAgMHhlNCwKKyAgMHg0ZiwgIDB4MDksICAweDA0LCAgMHgwYiwgIDB4ZmUsICAweDc4LCAgMHgxMywgIDB4ZmUsICAweDIwLCAgMHg4MCwgIDB4MDcsICAweDFhLCAgMHhmZSwgIDB4NzAsICAweDEyLCAgMHg0OSwKKyAgMHgwNCwgIDB4MDYsICAweGZlLCAgMHg2MCwgIDB4MTMsICAweDA1LCAgMHhmZSwgIDB4YTIsICAweDAwLCAgMHgyOCwgIDB4MTYsICAweGZlLCAgMHg4MCwgIDB4MDUsICAweGZlLCAgMHgzMSwKKyAgMHhlNCwgIDB4NmEsICAweDQ5LCAgMHgwNCwgIDB4MGIsICAweGZlLCAgMHg0YSwgIDB4MTMsICAweDA1LCAgMHhmZSwgIDB4YTAsICAweDAwLCAgMHgyOCwgIDB4ZmUsICAweDQyLCAgMHgxMiwKKyAgMHg1ZSwgIDB4MDEsICAweDA4LCAgMHgyNSwgIDB4MzIsICAweGYxLCAgMHgwMSwgIDB4MDgsICAweDI2LCAgMHhmZSwgIDB4OTgsICAweDA1LCAgMHgxMSwgIDB4ZmUsICAweGUzLCAgMHgwMCwKKyAgMHgyMywgIDB4NDksICAweGZlLCAgMHg0YSwgIDB4ZjAsICAweGZlLCAgMHg2YSwgIDB4MDUsICAweGZlLCAgMHg0OSwgIDB4ZjAsICAweGZlLCAgMHg2NCwgIDB4MDUsICAweDgzLCAgMHgyNCwKKyAgMHhmZSwgIDB4MjEsICAweDAwLCAgMHhhMSwgIDB4MjQsICAweGZlLCAgMHgyMiwgIDB4MDAsICAweGEwLCAgMHgyNCwgIDB4NGMsICAweGZlLCAgMHgwOSwgIDB4NDgsICAweDAxLCAgMHgwOCwKKyAgMHgyNiwgIDB4ZmUsICAweDk4LCAgMHgwNSwgIDB4ZmUsICAweGUyLCAgMHgwOCwgIDB4NDksICAweDA0LCAgMHhjNSwgIDB4M2IsICAweDAxLCAgMHg4NiwgIDB4MjQsICAweDA2LCAgMHgxMiwKKyAgMHhjYywgIDB4MzcsICAweGZlLCAgMHgyNywgIDB4MDEsICAweDA5LCAgMHgwNCwgIDB4MWQsICAweGZlLCAgMHgyMiwgIDB4MTIsICAweDQ3LCAgMHgwMSwgIDB4YTcsICAweDE0LCAgMHg5MiwKKyAgMHgwOSwgIDB4MDQsICAweDA2LCAgMHgzYiwgIDB4MTQsICAweGM0LCAgMHgwMSwgIDB4MzMsICAweDhmLCAgMHhmZSwgIDB4NzAsICAweDBjLCAgMHgwMiwgIDB4MjIsICAweDA1LCAgMHhmZSwKKyAgMHg5YywgIDB4MDAsICAweDI4LCAgMHhmZSwgIDB4M2UsICAweDEyLCAgMHgwNSwgIDB4NTAsICAweDI4LCAgMHhmZSwgIDB4MzYsICAweDEzLCAgMHg0NywgIDB4MDEsICAweGE3LCAgMHgyNiwKKyAgMHhmZSwgIDB4MDgsICAweDA2LCAgMHgwYSwgIDB4MDYsICAweDQ5LCAgMHgwNCwgIDB4MTksICAweGZlLCAgMHgwMiwgIDB4MTIsICAweDVmLCAgMHgwMSwgIDB4ZmUsICAweGFhLCAgMHgxNCwKKyAgMHgxZiwgIDB4ZmUsICAweGZlLCAgMHgwNSwgIDB4MTEsICAweDlhLCAgMHgwMSwgIDB4NDMsICAweDExLCAgMHhmZSwgIDB4ZTUsICAweDAwLCAgMHgwNSwgIDB4NTAsICAweGI0LCAgMHgwYywKKyAgMHg1MCwgIDB4MDUsICAweGM2LCAgMHgyOCwgIDB4ZmUsICAweDYyLCAgMHgxMiwgIDB4MDUsICAweDNmLCAgMHgyOCwgIDB4ZmUsICAweDVhLCAgMHgxMywgIDB4MDEsICAweGZlLCAgMHgxNCwKKyAgMHgxOCwgIDB4MDEsICAweGZlLCAgMHg2NiwgIDB4MTgsICAweGZlLCAgMHg0MywgIDB4NDgsICAweGI3LCAgMHgxOSwgIDB4MTMsICAweDZjLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHg1NywKKyAgMHg0OCwgIDB4OGIsICAweDFjLCAgMHgzZCwgIDB4ODUsICAweGI3LCAgMHg2OSwgIDB4NDcsICAweDAxLCAgMHhhNywgIDB4MjYsICAweGZlLCAgMHg3MiwgIDB4MDYsICAweDQ5LCAgMHgwNCwKKyAgMHgxYiwgIDB4ZGYsICAweDg5LCAgMHgwYSwgIDB4NGQsICAweDAxLCAgMHhmZSwgIDB4ZDgsICAweDE0LCAgMHgxZiwgIDB4ZmUsICAweDY4LCAgMHgwNiwgIDB4MTEsICAweDlhLCAgMHgwMSwKKyAgMHg0MywgIDB4MTEsICAweGZlLCAgMHhlNSwgIDB4MDAsICAweDA1LCAgMHgzZiwgIDB4YjQsICAweDBjLCAgMHgzZiwgIDB4MTcsICAweDA2LCAgMHgwMSwgIDB4YTcsICAweGVjLCAgMHg3MiwKKyAgMHg3MCwgIDB4MDEsICAweDZlLCAgMHg4NywgIDB4MTEsICAweGZlLCAgMHhlMiwgIDB4MDAsICAweDAxLCAgMHgwOCwgIDB4MjUsICAweDMyLCAgMHhmZSwgIDB4MGEsICAweGYwLCAgMHhmZSwKKyAgMHhhNiwgIDB4MDYsICAweDhjLCAgMHhmZSwgIDB4NWMsICAweDA3LCAgMHhmZSwgIDB4MDYsICAweGYwLCAgMHhmZSwgIDB4NjQsICAweDA3LCAgMHg4ZCwgIDB4ODEsICAweDAyLCAgMHgyMiwKKyAgMHgwOSwgIDB4MDQsICAweDBiLCAgMHhmZSwgIDB4MmUsICAweDEyLCAgMHgxNSwgIDB4MWEsICAweDAxLCAgMHgwOCwgIDB4MTUsICAweDAwLCAgMHgwMSwgIDB4MDgsICAweDE1LCAgMHgwMCwKKyAgMHgwMSwgIDB4MDgsICAweDE1LCAgMHgwMCwgIDB4MDEsICAweDA4LCAgMHhmZSwgIDB4OTksICAweGE0LCAgMHgwMSwgIDB4MDgsICAweDE1LCAgMHgwMCwgIDB4MDIsICAweGZlLCAgMHgzMiwKKyAgMHgwOCwgIDB4NjEsICAweDA0LCAgMHgxYiwgIDB4ZmUsICAweDM4LCAgMHgxMiwgIDB4MDksICAweDA0LCAgMHgxYiwgIDB4NmUsICAweDE1LCAgMHhmZSwgIDB4MWIsICAweDAwLCAgMHgwMSwKKyAgMHgwOCwgIDB4MTUsICAweDAwLCAgMHgwMSwgIDB4MDgsICAweDE1LCAgMHgwMCwgIDB4MDEsICAweDA4LCAgMHgxNSwgIDB4MDAsICAweDAxLCAgMHgwOCwgIDB4MTUsICAweDA2LCAgMHgwMSwKKyAgMHgwOCwgIDB4MTUsICAweDAwLCAgMHgwMiwgIDB4ZDksICAweDY2LCAgMHg0YywgIDB4ZmUsICAweDNhLCAgMHg1NSwgIDB4NWYsICAweGZlLCAgMHg5YSwgIDB4ODEsICAweDRiLCAgMHgxZCwKKyAgMHhiYSwgIDB4ZmUsICAweDMyLCAgMHgwNywgIDB4MGEsICAweDFkLCAgMHhmZSwgIDB4MDksICAweDZmLCAgMHhhZiwgIDB4ZmUsICAweGNhLCAgMHg0NSwgIDB4ZmUsICAweDMyLCAgMHgxMiwKKyAgMHg2MiwgIDB4MmMsICAweDg1LCAgMHg2NiwgIDB4N2IsICAweDAxLCAgMHgwOCwgIDB4MjUsICAweDMyLCAgMHhmZSwgIDB4MGEsICAweGYwLCAgMHhmZSwgIDB4MzIsICAweDA3LCAgMHg4ZCwKKyAgMHg4MSwgIDB4OGMsICAweGZlLCAgMHg1YywgIDB4MDcsICAweDAyLCAgMHgyMiwgIDB4MDEsICAweDQzLCAgMHgwMiwgIDB4ZmUsICAweDhhLCAgMHgwNiwgIDB4MTUsICAweDE5LCAgMHgwMiwKKyAgMHhmZSwgIDB4OGEsICAweDA2LCAgMHhmZSwgIDB4OWMsICAweGY3LCAgMHhkNCwgIDB4ZmUsICAweDJjLCAgMHg5MCwgIDB4ZmUsICAweGFlLCAgMHg5MCwgIDB4NzcsICAweGZlLCAgMHhjYSwKKyAgMHgwNywgIDB4MGMsICAweDU0LCAgMHgxOCwgIDB4NTUsICAweDA5LCAgMHg0YSwgIDB4NmEsICAweDM1LCAgMHgxZSwgIDB4MjAsICAweDA3LCAgMHgxMCwgIDB4ZmUsICAweDBlLCAgMHgxMiwKKyAgMHg3NCwgIDB4ZmUsICAweDgwLCAgMHg4MCwgIDB4MzcsICAweDIwLCAgMHg2MywgIDB4MjcsICAweGZlLCAgMHgwNiwgIDB4MTAsICAweGZlLCAgMHg4MywgIDB4ZTcsICAweGM0LCAgMHhhMSwKKyAgMHhmZSwgIDB4MDMsICAweDQwLCAgMHgwOSwgIDB4NGEsICAweDRmLCAgMHgzNSwgIDB4MDEsICAweGE4LCAgMHhhZCwgIDB4ZmUsICAweDFmLCAgMHg0MCwgIDB4MTIsICAweDU4LCAgMHgwMSwKKyAgMHhhNSwgIDB4ZmUsICAweDA4LCAgMHg1MCwgIDB4ZmUsICAweDhhLCAgMHg1MCwgIDB4ZmUsICAweDQ0LCAgMHg1MSwgIDB4ZmUsICAweGM2LCAgMHg1MSwgIDB4ODMsICAweGZiLCAgMHhmZSwKKyAgMHg4YSwgIDB4OTAsICAweDBjLCAgMHg1MiwgIDB4MTgsICAweDUzLCAgMHhmZSwgIDB4MGMsICAweDkwLCAgMHhmZSwgIDB4OGUsICAweDkwLCAgMHhmZSwgIDB4NDAsICAweDUwLCAgMHhmZSwKKyAgMHhjMiwgIDB4NTAsICAweDBjLCAgMHgzOSwgIDB4MTgsICAweDNhLCAgMHhmZSwgIDB4NGEsICAweDEwLCAgMHgwOSwgIDB4MDQsICAweDZhLCAgMHhmZSwgIDB4MmEsICAweDEyLCAgMHhmZSwKKyAgMHgyYywgIDB4OTAsICAweGZlLCAgMHhhZSwgIDB4OTAsICAweDBjLCAgMHg1NCwgIDB4MTgsICAweDU1LCAgMHgwOSwgIDB4MDQsICAweDRmLCAgMHg4NSwgIDB4MDEsICAweGE4LCAgMHhmZSwKKyAgMHgxZiwgIDB4ODAsICAweDEyLCAgMHg1OCwgIDB4ZmUsICAweDQ0LCAgMHg5MCwgIDB4ZmUsICAweGM2LCAgMHg5MCwgIDB4MGMsICAweDU2LCAgMHgxOCwgIDB4NTcsICAweGZiLCAgMHhmZSwKKyAgMHg4YSwgIDB4OTAsICAweDBjLCAgMHg1MiwgIDB4MTgsICAweDUzLCAgMHhmZSwgIDB4NDAsICAweDkwLCAgMHhmZSwgIDB4YzIsICAweDkwLCAgMHgwYywgIDB4MzksICAweDE4LCAgMHgzYSwKKyAgMHgwYywgIDB4MzgsICAweDE4LCAgMHg0ZSwgIDB4MDksICAweDRhLCAgMHgxOSwgIDB4MzUsICAweDJhLCAgMHgxMywgIDB4ZmUsICAweDRlLCAgMHgxMSwgIDB4NjUsICAweGZlLCAgMHg0OCwKKyAgMHgwOCwgIDB4ZmUsICAweDllLCAgMHhmMCwgIDB4ZmUsICAweDVjLCAgMHgwOCwgIDB4YjEsICAweDE2LCAgMHgzMiwgIDB4MmEsICAweDczLCAgMHhkZCwgIDB4YjgsICAweGZlLCAgMHg4MCwKKyAgMHgwOCwgIDB4YjksICAweGZlLCAgMHg5ZSwgIDB4MDgsICAweDhjLCAgMHhmZSwgIDB4NzQsICAweDA4LCAgMHhmZSwgIDB4MDYsICAweGYwLCAgMHhmZSwgIDB4N2EsICAweDA4LCAgMHg4ZCwKKyAgMHg4MSwgIDB4MDIsICAweDIyLCAgMHgwMSwgIDB4NDMsICAweGZlLCAgMHhjOSwgIDB4MTAsICAweDE1LCAgMHgxOSwgIDB4ZmUsICAweGM5LCAgMHgxMCwgIDB4NjEsICAweDA0LCAgMHgwNiwKKyAgMHhmZSwgIDB4MTAsICAweDEyLCAgMHg2MSwgIDB4MDQsICAweDBiLCAgMHg0NSwgIDB4MDksICAweDA0LCAgMHgwYiwgIDB4ZmUsICAweDY4LCAgMHgxMiwgIDB4ZmUsICAweDJlLCAgMHgxYywKKyAgMHgwMiwgIDB4ZmUsICAweDI0LCAgMHgwYSwgIDB4NjEsICAweDA0LCAgMHgwNiwgIDB4NDUsICAweDYxLCAgMHgwNCwgIDB4MGIsICAweGZlLCAgMHg1MiwgIDB4MTIsICAweGZlLCAgMHgyYywKKyAgMHgxYywgIDB4ZmUsICAweGFhLCAgMHhmMCwgIDB4ZmUsICAweDFlLCAgMHgwOSwgIDB4ZmUsICAweGFjLCAgMHhmMCwgIDB4ZmUsICAweGJlLCAgMHgwOCwgIDB4ZmUsICAweDhhLCAgMHgxMCwKKyAgMHhhYSwgIDB4ZmUsICAweGYzLCAgMHgxMCwgIDB4ZmUsICAweGFkLCAgMHhmMCwgIDB4ZmUsICAweGNhLCAgMHgwOCwgIDB4MDIsICAweGZlLCAgMHgyNCwgIDB4MGEsICAweGFiLCAgMHhmZSwKKyAgMHhlNywgIDB4MTAsICAweGZlLCAgMHgyYiwgIDB4ZjAsICAweDlkLCAgMHhlOSwgIDB4MWMsICAweGZlLCAgMHgwMCwgIDB4ZmUsICAweGZlLCAgMHgxYywgIDB4MTIsICAweGI1LCAgMHhmZSwKKyAgMHhkMiwgIDB4ZjAsICAweDlkLCAgMHhmZSwgIDB4NzYsICAweDE4LCAgMHgxYywgIDB4MWEsICAweDE2LCAgMHg5ZCwgIDB4MDUsICAweGNiLCAgMHgxYywgIDB4MDYsICAweDE2LCAgMHg5ZCwKKyAgMHhiOCwgIDB4NmQsICAweGI5LCAgMHg2ZCwgIDB4YWEsICAweGFiLCAgMHhmZSwgIDB4YjEsICAweDEwLCAgMHg3MCwgIDB4NWUsICAweDJiLCAgMHgxNCwgIDB4OTIsICAweDAxLCAgMHgzMywKKyAgMHgwZiwgIDB4ZmUsICAweDM1LCAgMHgwMCwgIDB4ZmUsICAweDAxLCAgMHhmMCwgIDB4NWEsICAweDBmLCAgMHg3YywgIDB4MDIsICAweDVhLCAgMHhmZSwgIDB4NzQsICAweDE4LCAgMHgxYywKKyAgMHhmZSwgIDB4MDAsICAweGY4LCAgMHgxNiwgIDB4NmQsICAweDY3LCAgMHgxYiwgIDB4MDEsICAweGZlLCAgMHg0NCwgIDB4MGQsICAweDNiLCAgMHgwMSwgIDB4ZTYsICAweDFlLCAgMHgyNywKKyAgMHg3NCwgIDB4NjcsICAweDFhLCAgMHgwMiwgIDB4NmQsICAweDA5LCAgMHgwNCwgIDB4MGIsICAweDIxLCAgMHhmZSwgIDB4MDYsICAweDBhLCAgMHgwOSwgIDB4MDQsICAweDZhLCAgMHhmZSwKKyAgMHg4MiwgIDB4MTIsICAweDA5LCAgMHgwNCwgIDB4MTksICAweGZlLCAgMHg2NiwgIDB4MTMsICAweDFlLCAgMHg1OCwgIDB4YWMsICAweGZjLCAgMHhmZSwgIDB4ODMsICAweDgwLCAgMHhmZSwKKyAgMHhjOCwgIDB4NDQsICAweGZlLCAgMHgyZSwgIDB4MTMsICAweGZlLCAgMHgwNCwgIDB4OTEsICAweGZlLCAgMHg4NiwgIDB4OTEsICAweDYzLCAgMHgyNywgIDB4ZmUsICAweDQwLCAgMHg1OSwKKyAgMHhmZSwgIDB4YzEsICAweDU5LCAgMHg3NywgIDB4ZDcsICAweDA1LCAgMHg1NCwgIDB4MzEsICAweDU1LCAgMHgwYywgIDB4N2IsICAweDE4LCAgMHg3YywgIDB4YmUsICAweDU0LCAgMHhiZiwKKyAgMHg1NSwgIDB4MDEsICAweGE4LCAgMHhhZCwgIDB4NjMsICAweDI3LCAgMHgxMiwgIDB4NTgsICAweGMwLCAgMHgzOCwgIDB4YzEsICAweDRlLCAgMHg3OSwgIDB4NTYsICAweDY4LCAgMHg1NywKKyAgMHhmNCwgIDB4ZjUsICAweGZlLCAgMHgwNCwgIDB4ZmEsICAweDM4LCAgMHhmZSwgIDB4MDUsICAweGZhLCAgMHg0ZSwgIDB4MDEsICAweGE1LCAgMHhhMiwgIDB4MjMsICAweDBjLCAgMHg3YiwKKyAgMHgwYywgIDB4N2MsICAweDc5LCAgMHg1NiwgIDB4NjgsICAweDU3LCAgMHhmZSwgIDB4MTIsICAweDEwLCAgMHgwOSwgIDB4MDQsICAweDE5LCAgMHgxNiwgIDB4ZDcsICAweDc5LCAgMHgzOSwKKyAgMHg2OCwgIDB4M2EsICAweDA5LCAgMHgwNCwgIDB4ZmUsICAweGY3LCAgMHgwMCwgIDB4MzUsICAweDA1LCAgMHg1MiwgIDB4MzEsICAweDUzLCAgMHhmZSwgIDB4MTAsICAweDU4LCAgMHhmZSwKKyAgMHg5MSwgIDB4NTgsICAweGZlLCAgMHgxNCwgIDB4NTksICAweGZlLCAgMHg5NSwgIDB4NTksICAweDAyLCAgMHg2ZCwgIDB4MDksICAweDA0LCAgMHgxOSwgIDB4MTYsICAweGQ3LCAgMHgwOSwKKyAgMHgwNCwgIDB4ZmUsICAweGY3LCAgMHgwMCwgIDB4MzUsICAweGZlLCAgMHgzYSwgIDB4NTUsICAweGZlLCAgMHgxOSwgIDB4ODEsICAweDVmLCAgMHhmZSwgIDB4MTAsICAweDkwLCAgMHhmZSwKKyAgMHg5MiwgIDB4OTAsICAweGZlLCAgMHhkNywgIDB4MTAsICAweDJmLCAgMHgwNywgIDB4OWIsICAweDE2LCAgMHhmZSwgIDB4YzYsICAweDA4LCAgMHgxMSwgIDB4OWIsICAweDA5LCAgMHgwNCwKKyAgMHgwYiwgIDB4ZmUsICAweDE0LCAgMHgxMywgIDB4MDUsICAweDM5LCAgMHgzMSwgIDB4M2EsICAweDc3LCAgMHhmZSwgIDB4YzYsICAweDA4LCAgMHhmZSwgIDB4MGMsICAweDU4LCAgMHhmZSwKKyAgMHg4ZCwgIDB4NTgsICAweDAyLCAgMHg2ZCwgIDB4MjMsICAweDQ3LCAgMHhmZSwgIDB4MTksICAweDgwLCAgMHhkZSwgIDB4MDksICAweDA0LCAgMHgwYiwgIDB4ZmUsICAweDFhLCAgMHgxMiwKKyAgMHhmZSwgIDB4NmMsICAweDE5LCAgMHhmZSwgIDB4MTksICAweDQxLCAgMHhlOSwgIDB4YjUsICAweGZlLCAgMHhkMSwgIDB4ZjAsICAweGQ5LCAgMHgxNCwgIDB4N2EsICAweDAxLCAgMHgzMywKKyAgMHgwZiwgIDB4ZmUsICAweDQ0LCAgMHgwMCwgIDB4ZmUsICAweDhlLCAgMHgxMCwgIDB4ZmUsICAweDZjLCAgMHgxOSwgIDB4YmUsICAweDM5LCAgMHhmZSwgIDB4ZWQsICAweDE5LCAgMHhiZiwKKyAgMHgzYSwgIDB4ZmUsICAweDBjLCAgMHg1MSwgIDB4ZmUsICAweDhlLCAgMHg1MSwgIDB4ZTksICAweDFjLCAgMHhmZSwgIDB4MDAsICAweGZmLCAgMHgzNCwgIDB4ZmUsICAweDc0LCAgMHgxMCwKKyAgMHhiNSwgIDB4ZmUsICAweGQyLCAgMHhmMCwgIDB4ZmUsICAweGIyLCAgMHgwYSwgIDB4ZmUsICAweDc2LCAgMHgxOCwgIDB4MWMsICAweDFhLCAgMHg4NCwgIDB4MDUsICAweGNiLCAgMHgxYywKKyAgMHgwNiwgIDB4ZmUsICAweDA4LCAgMHgxMywgIDB4MGYsICAweGZlLCAgMHgxNiwgIDB4MDAsICAweDAyLCAgMHg1YSwgIDB4ZmUsICAweGQxLCAgMHhmMCwgIDB4ZmUsICAweGM0LCAgMHgwYSwKKyAgMHgxNCwgIDB4N2EsICAweDAxLCAgMHgzMywgIDB4MGYsICAweGZlLCAgMHgxNywgIDB4MDAsICAweGZlLCAgMHg0MiwgIDB4MTAsICAweGZlLCAgMHhjZSwgIDB4ZjAsICAweGZlLCAgMHhjYSwKKyAgMHgwYSwgIDB4ZmUsICAweDNjLCAgMHgxMCwgIDB4ZmUsICAweGNkLCAgMHhmMCwgIDB4ZmUsICAweGQ2LCAgMHgwYSwgIDB4MGYsICAweGZlLCAgMHgyMiwgIDB4MDAsICAweDAyLCAgMHg1YSwKKyAgMHhmZSwgIDB4Y2IsICAweGYwLCAgMHhmZSwgIDB4ZTIsICAweDBhLCAgMHgwZiwgIDB4ZmUsICAweDI0LCAgMHgwMCwgIDB4MDIsICAweDVhLCAgMHhmZSwgIDB4ZDAsICAweGYwLCAgMHhmZSwKKyAgMHhlYywgIDB4MGEsICAweDBmLCAgMHg5MywgIDB4ZGMsICAweGZlLCAgMHhjZiwgIDB4ZjAsICAweGZlLCAgMHhmNiwgIDB4MGEsICAweDBmLCAgMHg0YywgIDB4ZmUsICAweDEwLCAgMHgxMCwKKyAgMHhmZSwgIDB4Y2MsICAweGYwLCAgMHhkOSwgIDB4NjEsICAweDA0LCAgMHgxOSwgIDB4M2IsICAweDBmLCAgMHhmZSwgIDB4MTIsICAweDAwLCAgMHgyYSwgIDB4MTMsICAweGZlLCAgMHg0ZSwKKyAgMHgxMSwgIDB4NjUsICAweGZlLCAgMHgwYywgIDB4MGIsICAweGZlLCAgMHg5ZSwgIDB4ZjAsICAweGZlLCAgMHgyMCwgIDB4MGIsICAweGIxLCAgMHgxNiwgIDB4MzIsICAweDJhLCAgMHg3MywKKyAgMHhkZCwgIDB4YjgsICAweDIyLCAgMHhiOSwgIDB4MjIsICAweDJhLCAgMHhlYywgIDB4NjUsICAweGZlLCAgMHgyYywgIDB4MGIsICAweDI1LCAgMHgzMiwgIDB4OGMsICAweGZlLCAgMHg0OCwKKyAgMHgwYiwgIDB4OGQsICAweDgxLCAgMHhiOCwgIDB4ZDQsICAweGI5LCAgMHhkNCwgIDB4MDIsICAweDIyLCAgMHgwMSwgIDB4NDMsICAweGZlLCAgMHhkYiwgIDB4MTAsICAweDExLCAgMHhmZSwKKyAgMHhlOCwgIDB4MDAsICAweGFhLCAgMHhhYiwgIDB4NzAsICAweGJjLCAgMHg3ZCwgIDB4YmQsICAweDdmLCAgMHhmZSwgIDB4ODksICAweGYwLCAgMHgyMiwgIDB4MzAsICAweDJlLCAgMHhkOCwKKyAgMHhiYywgIDB4N2QsICAweGJkLCAgMHg3ZiwgIDB4MDEsICAweDA4LCAgMHgxZiwgIDB4MjIsICAweDMwLCAgMHgyZSwgIDB4ZDYsICAweGIxLCAgMHg0NSwgIDB4MGYsICAweGZlLCAgMHg0MiwKKyAgMHgwMCwgIDB4MDIsICAweDVhLCAgMHg3OCwgIDB4MDYsICAweGZlLCAgMHg4MSwgIDB4NDksICAweDE2LCAgMHhmZSwgIDB4MzgsICAweDBjLCAgMHgwOSwgIDB4MDQsICAweDBiLCAgMHhmZSwKKyAgMHg0NCwgIDB4MTMsICAweDBmLCAgMHgwMCwgIDB4NGIsICAweDBiLCAgMHhmZSwgIDB4NTQsICAweDEyLCAgMHg0YiwgIDB4ZmUsICAweDI4LCAgMHgwMCwgIDB4MjEsICAweGZlLCAgMHhhNiwKKyAgMHgwYywgIDB4MGEsICAweDQwLCAgMHgwMSwgIDB4MGUsICAweDA3LCAgMHgwMCwgIDB4NWQsICAweDNlLCAgMHhmZSwgIDB4MjgsICAweDAwLCAgMHhmZSwgIDB4ZTIsICAweDEwLCAgMHgwMSwKKyAgMHhlNywgIDB4MDEsICAweGU4LCAgMHgwYSwgIDB4OTksICAweDAxLCAgMHhmZSwgIDB4MzIsICAweDBlLCAgMHg1OSwgIDB4MTEsICAweDJkLCAgMHgwMSwgIDB4NmYsICAweDAyLCAgMHgyOSwKKyAgMHgwZiwgIDB4ZmUsICAweDQ0LCAgMHgwMCwgIDB4NGIsICAweDBiLCAgMHhkZiwgIDB4M2UsICAweDBiLCAgMHhmZSwgIDB4YjQsICAweDEwLCAgMHgwMSwgIDB4ODYsICAweDNlLCAgMHgwYiwKKyAgMHhmZSwgIDB4YWEsICAweDEwLCAgMHgwMSwgIDB4ODYsICAweGZlLCAgMHgxOSwgIDB4ODIsICAweGZlLCAgMHgzNCwgIDB4NDYsICAweGEzLCAgMHgzZSwgIDB4MGIsICAweDBmLCAgMHhmZSwKKyAgMHg0MywgIDB4MDAsICAweGZlLCAgMHg5NiwgIDB4MTAsICAweDA5LCAgMHg0YSwgIDB4MGIsICAweDM1LCAgMHgwMSwgIDB4ZTcsICAweDAxLCAgMHhlOCwgIDB4NTksICAweDExLCAgMHgyZCwKKyAgMHgwMSwgIDB4NmYsICAweDY3LCAgMHgwYiwgIDB4NTksICAweDNjLCAgMHg4YSwgIDB4MDIsICAweGZlLCAgMHgyYSwgIDB4MDMsICAweDA5LCAgMHgwNCwgIDB4MGIsICAweDg0LCAgMHgzZSwKKyAgMHgwYiwgIDB4MGYsICAweDAwLCAgMHhmZSwgIDB4NWMsICAweDEwLCAgMHg2MSwgIDB4MDQsICAweDFiLCAgMHhmZSwgIDB4NTgsICAweDEyLCAgMHgwOSwgIDB4MDQsICAweDFiLCAgMHhmZSwKKyAgMHg1MCwgIDB4MTMsICAweGZlLCAgMHgxYywgIDB4MWMsICAweGZlLCAgMHg5ZCwgIDB4ZjAsICAweGZlLCAgMHg1YywgIDB4MGMsICAweGZlLCAgMHgxYywgIDB4MWMsICAweGZlLCAgMHg5ZCwKKyAgMHhmMCwgIDB4ZmUsICAweDYyLCAgMHgwYywgIDB4MDksICAweDRhLCAgMHgxYiwgIDB4MzUsICAweGZlLCAgMHhhOSwgIDB4MTAsICAweDBmLCAgMHhmZSwgIDB4MTUsICAweDAwLCAgMHhmZSwKKyAgMHgwNCwgIDB4ZTYsICAweDBiLCAgMHg1ZiwgIDB4NWMsICAweDBmLCAgMHhmZSwgIDB4MTMsICAweDAwLCAgMHhmZSwgIDB4MTAsICAweDEwLCAgMHgwZiwgIDB4ZmUsICAweDQ3LCAgMHgwMCwKKyAgMHhhMSwgIDB4MGYsICAweGZlLCAgMHg0MSwgIDB4MDAsICAweGEwLCAgMHgwZiwgIDB4ZmUsICAweDI0LCAgMHgwMCwgIDB4ODcsICAweGFhLCAgMHhhYiwgIDB4NzAsICAweDA1LCAgMHg2YiwKKyAgMHgyOCwgIDB4MjEsICAweGQxLCAgMHg1ZiwgIDB4ZmUsICAweDA0LCAgMHhlNiwgIDB4MWIsICAweGZlLCAgMHg5ZCwgIDB4NDEsICAweGZlLCAgMHgxYywgIDB4NDIsICAweDU5LCAgMHgwMSwKKyAgMHhkYSwgIDB4MDIsICAweDI5LCAgMHhlYSwgIDB4MTQsICAweDBiLCAgMHgzNywgIDB4OTUsICAweGE5LCAgMHgxNCwgIDB4ZmUsICAweDMxLCAgMHgwMCwgIDB4MzcsICAweDk3LCAgMHgwMSwKKyAgMHhmZSwgIDB4NTQsICAweDBmLCAgMHgwMiwgIDB4ZDAsICAweDNjLCAgMHhmZSwgIDB4MDYsICAweGVjLCAgMHhjOSwgIDB4ZWUsICAweDNlLCAgMHgxZCwgIDB4ZmUsICAweGNlLCAgMHg0NSwKKyAgMHgzNCwgIDB4M2MsICAweGZlLCAgMHgwNiwgIDB4ZWEsICAweGM5LCAgMHhmZSwgIDB4NDcsICAweDRiLCAgMHg4OSwgIDB4ZmUsICAweDc1LCAgMHg1NywgIDB4MDUsICAweDUxLCAgMHhmZSwKKyAgMHg5OCwgIDB4NTYsICAweGZlLCAgMHgzOCwgIDB4MTIsICAweDBhLCAgMHg0MiwgIDB4MDEsICAweDBlLCAgMHhmZSwgIDB4NDQsICAweDQ4LCAgMHg0NiwgIDB4MDksICAweDA0LCAgMHgxZCwKKyAgMHhmZSwgIDB4MWEsICAweDEzLCAgMHgwYSwgIDB4NDAsICAweDAxLCAgMHgwZSwgIDB4NDcsICAweGZlLCAgMHg0MSwgIDB4NTgsICAweDBhLCAgMHg5OSwgIDB4MDEsICAweDBlLCAgMHhmZSwKKyAgMHg0OSwgIDB4NTQsICAweDhlLCAgMHhmZSwgIDB4MmEsICAweDBkLCAgMHgwMiwgIDB4ZmUsICAweDJhLCAgMHgwMywgIDB4MGEsICAweDUxLCAgMHhmZSwgIDB4ZWUsICAweDE0LCAgMHhlZSwKKyAgMHgzZSwgIDB4MWQsICAweGZlLCAgMHhjZSwgIDB4NDUsICAweDM0LCAgMHgzYywgIDB4ZmUsICAweGNlLCAgMHg0NywgIDB4ZmUsICAweGFkLCAgMHgxMywgIDB4MDIsICAweDI5LCAgMHgxZSwKKyAgMHgyMCwgIDB4MDcsICAweDEwLCAgMHhmZSwgIDB4OWUsICAweDEyLCAgMHgyMywgIDB4MTIsICAweDRkLCAgMHgxMiwgIDB4OTQsICAweDEyLCAgMHhjZSwgIDB4MWUsICAweDJkLCAgMHg0NywKKyAgMHgzNywgIDB4MmQsICAweGIxLCAgMHhlMCwgIDB4ZmUsICAweGJjLCAgMHhmMCwgIDB4ZmUsICAweGVjLCAgMHgwZCwgIDB4MTMsICAweDA2LCAgMHgxMiwgIDB4NGQsICAweDAxLCAgMHhmZSwKKyAgMHhlMiwgIDB4MTUsICAweDA1LCAgMHhmZSwgIDB4MzgsICAweDAxLCAgMHgzMSwgIDB4ZmUsICAweDNhLCAgMHgwMSwgIDB4NzcsICAweGZlLCAgMHhmMCwgIDB4MGQsICAweGZlLCAgMHgwMiwKKyAgMHhlYywgIDB4Y2UsICAweDYyLCAgMHgwMCwgIDB4NWQsICAweGZlLCAgMHgwNCwgIDB4ZWMsICAweDIwLCAgMHg0NiwgIDB4ZmUsICAweDA1LCAgMHhmNiwgIDB4ZmUsICAweDM0LCAgMHgwMSwKKyAgMHgwMSwgIDB4ZmUsICAweDUyLCAgMHgxNiwgIDB4ZmIsICAweGZlLCAgMHg0OCwgIDB4ZjQsICAweDBkLCAgMHhmZSwgIDB4MTgsICAweDEzLCAgMHhhZiwgIDB4ZmUsICAweDAyLCAgMHhlYSwKKyAgMHhjZSwgIDB4NjIsICAweDdhLCAgMHhmZSwgIDB4YzUsICAweDEzLCAgMHgxNCwgIDB4MWIsICAweDM3LCAgMHg5NSwgIDB4YTksICAweDVjLCAgMHgwNSwgIDB4ZmUsICAweDM4LCAgMHgwMSwKKyAgMHgxYywgIDB4ZmUsICAweGYwLCAgMHhmZiwgIDB4MGMsICAweGZlLCAgMHg2MCwgIDB4MDEsICAweDA1LCAgMHhmZSwgIDB4M2EsICAweDAxLCAgMHgwYywgIDB4ZmUsICAweDYyLCAgMHgwMSwKKyAgMHgzZCwgIDB4MTIsICAweDIwLCAgMHgyNCwgIDB4MDYsICAweDEyLCAgMHgyZCwgIDB4MTEsICAweDJkLCAgMHg4YSwgIDB4MTMsICAweDA2LCAgMHgwMywgIDB4MjMsICAweDAzLCAgMHgxZSwKKyAgMHg0ZCwgIDB4ZmUsICAweGY3LCAgMHgxMiwgIDB4MWUsICAweDk0LCAgMHhhYywgIDB4MTIsICAweDk0LCAgMHgwNywgIDB4N2EsICAweGZlLCAgMHg3MSwgIDB4MTMsICAweGZlLCAgMHgyNCwKKyAgMHgxYywgIDB4MTQsICAweDFhLCAgMHgzNywgIDB4OTUsICAweGE5LCAgMHhmZSwgIDB4ZDksICAweDEwLCAgMHhiNiwgIDB4ZmUsICAweDAzLCAgMHhkYywgIDB4ZmUsICAweDczLCAgMHg1NywKKyAgMHhmZSwgIDB4ODAsICAweDVkLCAgMHgwMywgIDB4YjYsICAweGZlLCAgMHgwMywgIDB4ZGMsICAweGZlLCAgMHg1YiwgIDB4NTcsICAweGZlLCAgMHg4MCwgIDB4NWQsICAweDAzLCAgMHhmZSwKKyAgMHgwMywgIDB4NTcsICAweGI2LCAgMHgyMywgIDB4ZmUsICAweDAwLCAgMHhjYywgIDB4MDMsICAweGZlLCAgMHgwMywgIDB4NTcsICAweGI2LCAgMHg3NSwgIDB4MDMsICAweDA5LCAgMHgwNCwKKyAgMHg0YywgIDB4ZmUsICAweDIyLCAgMHgxMywgIDB4ZmUsICAweDFjLCAgMHg4MCwgIDB4MDcsICAweDA2LCAgMHhmZSwgIDB4MWEsICAweDEzLCAgMHhmZSwgIDB4MWUsICAweDgwLCAgMHhlMSwKKyAgMHhmZSwgIDB4MWQsICAweDgwLCAgMHhhNCwgIDB4ZmUsICAweDBjLCAgMHg5MCwgIDB4ZmUsICAweDBlLCAgMHgxMywgIDB4ZmUsICAweDBlLCAgMHg5MCwgIDB4YTMsICAweGZlLCAgMHgzYywKKyAgMHg5MCwgIDB4ZmUsICAweDMwLCAgMHhmNCwgIDB4MGIsICAweGZlLCAgMHgzYywgIDB4NTAsICAweGEwLCAgMHgwMSwgIDB4ZmUsICAweDgyLCAgMHgxNiwgIDB4MmYsICAweDA3LCAgMHgyZCwKKyAgMHhlMCwgIDB4MDEsICAweGZlLCAgMHhiYywgIDB4MTUsICAweDA5LCAgMHgwNCwgIDB4MWQsICAweDQ1LCAgMHgwMSwgIDB4ZTcsICAweDAxLCAgMHhlOCwgIDB4MTEsICAweGZlLCAgMHhlOSwKKyAgMHgwMCwgIDB4MDksICAweDA0LCAgMHg0YywgIDB4ZmUsICAweDJjLCAgMHgxMywgIDB4MDEsICAweGZlLCAgMHgxNCwgIDB4MTYsICAweGZlLCAgMHgxZSwgIDB4MWMsICAweGZlLCAgMHgxNCwKKyAgMHg5MCwgIDB4ZmUsICAweDk2LCAgMHg5MCwgIDB4MGMsICAweGZlLCAgMHg2NCwgIDB4MDEsICAweDE4LCAgMHhmZSwgIDB4NjYsICAweDAxLCAgMHgwOSwgIDB4MDQsICAweDRmLCAgMHhmZSwKKyAgMHgxMiwgIDB4MTIsICAweGZlLCAgMHgwMywgIDB4ODAsICAweDc0LCAgMHhmZSwgIDB4MDEsICAweGVjLCAgMHgyMCwgIDB4ZmUsICAweDgwLCAgMHg0MCwgIDB4MTIsICAweDIwLCAgMHg2MywKKyAgMHgyNywgIDB4MTEsICAweGM4LCAgMHg1OSwgIDB4MWUsICAweDIwLCAgMHhlZCwgIDB4NzYsICAweDIwLCAgMHgwMywgIDB4ZmUsICAweDA4LCAgMHgxYywgIDB4MDUsICAweGZlLCAgMHhhYywKKyAgMHgwMCwgIDB4ZmUsICAweDA2LCAgMHg1OCwgIDB4MDUsICAweGZlLCAgMHhhZSwgIDB4MDAsICAweGZlLCAgMHgwNywgIDB4NTgsICAweDA1LCAgMHhmZSwgIDB4YjAsICAweDAwLCAgMHhmZSwKKyAgMHgwOCwgIDB4NTgsICAweDA1LCAgMHhmZSwgIDB4YjIsICAweDAwLCAgMHhmZSwgIDB4MDksICAweDU4LCAgMHhmZSwgIDB4MGEsICAweDFjLCAgMHgyNCwgIDB4NjksICAweDEyLCAgMHhjOSwKKyAgMHgyMywgIDB4MGMsICAweDUwLCAgMHgwYywgIDB4M2YsICAweDEzLCAgMHg0MCwgIDB4NDgsICAweDVmLCAgMHgxNywgIDB4MWQsICAweGZlLCAgMHg5MCwgIDB4NGQsICAweGZlLCAgMHg5MSwKKyAgMHg1NCwgIDB4MjEsICAweGZlLCAgMHgwOCwgIDB4MGYsICAweDNlLCAgMHgxMCwgIDB4MTMsICAweDQyLCAgMHg0OCwgIDB4MTcsICAweDRjLCAgMHhmZSwgIDB4OTAsICAweDRkLCAgMHhmZSwKKyAgMHg5MSwgIDB4NTQsICAweDIxLCAgMHhmZSwgIDB4MWUsICAweDBmLCAgMHgyNCwgIDB4MTAsICAweDEyLCAgMHgyMCwgIDB4NzgsICAweDJjLCAgMHg0NiwgIDB4MWUsICAweDIwLCAgMHhlZCwKKyAgMHg3NiwgIDB4MjAsICAweDExLCAgMHhjOCwgIDB4ZjYsICAweGZlLCAgMHhkNiwgIDB4ZjAsICAweGZlLCAgMHgzMiwgIDB4MGYsICAweGVhLCAgMHg3MCwgIDB4ZmUsICAweDE0LCAgMHgxYywKKyAgMHhmZSwgIDB4MTAsICAweDFjLCAgMHhmZSwgIDB4MTgsICAweDFjLCAgMHgwMywgIDB4M2MsICAweGZlLCAgMHgwYywgIDB4MTQsICAweGVlLCAgMHhmZSwgIDB4MDcsICAweGU2LCAgMHgxZCwKKyAgMHhmZSwgIDB4Y2UsICAweDQ3LCAgMHhmZSwgIDB4ZjUsICAweDEzLCAgMHgwMywgIDB4MDEsICAweDg2LCAgMHg3OCwgIDB4MmMsICAweDQ2LCAgMHhmYSwgIDB4ZWYsICAweGZlLCAgMHg0MiwKKyAgMHgxMywgIDB4MmYsICAweDA3LCAgMHgyZCwgIDB4ZmUsICAweDM0LCAgMHgxMywgIDB4MGEsICAweDQyLCAgMHgwMSwgIDB4MGUsICAweGIwLCAgMHhmZSwgIDB4MzYsICAweDEyLCAgMHhmMCwKKyAgMHhmZSwgIDB4NDUsICAweDQ4LCAgMHgwMSwgIDB4ZTMsICAweGZlLCAgMHgwMCwgIDB4Y2MsICAweGIwLCAgMHhmZSwgIDB4ZjMsICAweDEzLCAgMHgzZCwgIDB4NzUsICAweDA3LCAgMHgxMCwKKyAgMHhhMywgIDB4MGEsICAweDgwLCAgMHgwMSwgIDB4MGUsICAweGZlLCAgMHg4MCwgIDB4NWMsICAweDAxLCAgMHg2ZiwgIDB4ZmUsICAweDBlLCAgMHgxMCwgIDB4MDcsICAweDdlLCAgMHg0NSwKKyAgMHhmNiwgIDB4ZmUsICAweGQ2LCAgMHhmMCwgIDB4ZmUsICAweDZjLCAgMHgwZiwgIDB4MDMsICAweGZlLCAgMHg0NCwgIDB4NTgsICAweDc0LCAgMHhmZSwgIDB4MDEsICAweGVjLCAgMHg5NywKKyAgMHhmZSwgIDB4OWUsICAweDQwLCAgMHhmZSwgIDB4OWQsICAweGU3LCAgMHgwMCwgIDB4ZmUsICAweDljLCAgMHhlNywgIDB4MWIsICAweDc2LCAgMHgyNywgIDB4MDEsICAweGRhLCAgMHhmZSwKKyAgMHhkZCwgIDB4MTAsICAweDJhLCAgMHhiYywgIDB4N2QsICAweGJkLCAgMHg3ZiwgIDB4MzAsICAweDJlLCAgMHhkNSwgIDB4MDcsICAweDFiLCAgMHhmZSwgIDB4NDgsICAweDEyLCAgMHgwNywKKyAgMHgwYiwgIDB4ZmUsICAweDU2LCAgMHgxMiwgIDB4MDcsICAweDFhLCAgMHhmZSwgIDB4MzAsICAweDEyLCAgMHgwNywgIDB4YzIsICAweDE2LCAgMHhmZSwgIDB4M2UsICAweDExLCAgMHgwNywKKyAgMHhmZSwgIDB4MjMsICAweDAwLCAgMHgxNiwgIDB4ZmUsICAweDRhLCAgMHgxMSwgIDB4MDcsICAweDA2LCAgMHgxNiwgIDB4ZmUsICAweGE4LCAgMHgxMSwgIDB4MDcsICAweDE5LCAgMHhmZSwKKyAgMHgxMiwgIDB4MTIsICAweDA3LCAgMHgwMCwgIDB4MTYsICAweDIyLCAgMHgxNCwgIDB4YzIsICAweDAxLCAgMHgzMywgIDB4OWYsICAweDJiLCAgMHgwMSwgIDB4MDgsICAweDhjLCAgMHg0MywKKyAgMHgwMywgIDB4MmIsICAweGZlLCAgMHg2MiwgIDB4MDgsICAweDBhLCAgMHhjYSwgIDB4MDEsICAweGZlLCAgMHgzMiwgIDB4MGUsICAweDExLCAgMHg3ZSwgIDB4MDIsICAweDI5LCAgMHgyYiwKKyAgMHgyZiwgIDB4MDcsICAweDliLCAgMHhmZSwgIDB4ZDksICAweDEzLCAgMHg3OSwgIDB4MzksICAweDY4LCAgMHgzYSwgIDB4NzcsICAweGZlLCAgMHhmYywgIDB4MTAsICAweDA5LCAgMHgwNCwKKyAgMHg2YSwgIDB4ZmUsICAweDcyLCAgMHgxMiwgIDB4YzAsICAweDM4LCAgMHhjMSwgIDB4NGUsICAweGY0LCAgMHhmNSwgIDB4OGUsICAweGZlLCAgMHhjNiwgIDB4MTAsICAweDFlLCAgMHg1OCwKKyAgMHhmZSwgIDB4MjYsICAweDEzLCAgMHgwNSwgIDB4N2IsICAweDMxLCAgMHg3YywgIDB4NzcsICAweGZlLCAgMHg4MiwgIDB4MGMsICAweDBjLCAgMHg1NCwgIDB4MTgsICAweDU1LCAgMHgyMywKKyAgMHgwYywgIDB4N2IsICAweDBjLCAgMHg3YywgIDB4MDEsICAweGE4LCAgMHgyNCwgIDB4NjksICAweDczLCAgMHgxMiwgIDB4NTgsICAweDAxLCAgMHhhNSwgIDB4YzAsICAweDM4LCAgMHhjMSwKKyAgMHg0ZSwgIDB4ZmUsICAweDA0LCAgMHg1NSwgIDB4ZmUsICAweGE1LCAgMHg1NSwgIDB4ZmUsICAweDA0LCAgMHhmYSwgIDB4MzgsICAweGZlLCAgMHgwNSwgIDB4ZmEsICAweDRlLCAgMHhmZSwKKyAgMHg5MSwgIDB4MTAsICAweDA1LCAgMHg1NiwgIDB4MzEsICAweDU3LCAgMHhmZSwgIDB4NDAsICAweDU2LCAgMHhmZSwgIDB4ZTEsICAweDU2LCAgMHgwYywgIDB4NTYsICAweDE4LCAgMHg1NywKKyAgMHg4MywgIDB4YzAsICAweDM4LCAgMHhjMSwgIDB4NGUsICAweGY0LCAgMHhmNSwgIDB4MDUsICAweDUyLCAgMHgzMSwgIDB4NTMsICAweGZlLCAgMHgwMCwgIDB4NTYsICAweGZlLCAgMHhhMSwKKyAgMHg1NiwgIDB4MGMsICAweDUyLCAgMHgxOCwgIDB4NTMsICAweDA5LCAgMHgwNCwgIDB4NmEsICAweGZlLCAgMHgxZSwgIDB4MTIsICAweDFlLCAgMHg1OCwgIDB4ZmUsICAweDFmLCAgMHg0MCwKKyAgMHgwNSwgIDB4NTQsICAweDMxLCAgMHg1NSwgIDB4ZmUsICAweDJjLCAgMHg1MCwgIDB4ZmUsICAweGFlLCAgMHg1MCwgIDB4MDUsICAweDU2LCAgMHgzMSwgIDB4NTcsICAweGZlLCAgMHg0NCwKKyAgMHg1MCwgIDB4ZmUsICAweGM2LCAgMHg1MCwgIDB4MDUsICAweDUyLCAgMHgzMSwgIDB4NTMsICAweGZlLCAgMHgwOCwgIDB4NTAsICAweGZlLCAgMHg4YSwgIDB4NTAsICAweDA1LCAgMHgzOSwKKyAgMHgzMSwgIDB4M2EsICAweGZlLCAgMHg0MCwgIDB4NTAsICAweGZlLCAgMHhjMiwgIDB4NTAsICAweDAyLCAgMHg1YywgIDB4MjQsICAweDA2LCAgMHgxMiwgIDB4Y2QsICAweDAyLCAgMHg1YiwKKyAgMHgyYiwgIDB4MDEsICAweDA4LCAgMHgxZiwgIDB4NDQsICAweDMwLCAgMHgyZSwgIDB4ZDUsICAweDA3LCAgMHgwNiwgIDB4MjEsICAweDQ0LCAgMHgyZiwgIDB4MDcsICAweDliLCAgMHgyMSwKKyAgMHg1YiwgIDB4MDEsICAweDZlLCAgMHgxYywgIDB4M2QsICAweDE2LCAgMHg0NCwgIDB4MDksICAweDA0LCAgMHgwYiwgIDB4ZTIsICAweDc5LCAgMHgzOSwgIDB4NjgsICAweDNhLCAgMHhmZSwKKyAgMHgwYSwgIDB4NTUsICAweDM0LCAgMHhmZSwgIDB4OGIsICAweDU1LCAgMHhiZSwgIDB4MzksICAweGJmLCAgMHgzYSwgIDB4ZmUsICAweDBjLCAgMHg1MSwgIDB4ZmUsICAweDhlLCAgMHg1MSwKKyAgMHgwMiwgIDB4NWIsICAweGZlLCAgMHgxOSwgIDB4ODEsICAweGFmLCAgMHhmZSwgIDB4MTksICAweDQxLCAgMHgwMiwgIDB4NWIsICAweDJiLCAgMHgwMSwgIDB4MDgsICAweDI1LCAgMHgzMiwKKyAgMHgxZiwgIDB4YTIsICAweDMwLCAgMHgyZSwgIDB4ZDgsICAweDRiLCAgMHgxYSwgIDB4ZmUsICAweGE2LCAgMHgxMiwgIDB4NGIsICAweDBiLCAgMHgzYiwgIDB4MDIsICAweDQ0LCAgMHgwMSwKKyAgMHgwOCwgIDB4MjUsICAweDMyLCAgMHgxZiwgIDB4YTIsICAweDMwLCAgMHgyZSwgIDB4ZDYsICAweDA3LCAgMHgxYSwgIDB4MjEsICAweDQ0LCAgMHgwMSwgIDB4MDgsICAweDFmLCAgMHhhMiwKKyAgMHgzMCwgIDB4MmUsICAweGZlLCAgMHhlOCwgIDB4MDksICAweGZlLCAgMHhjMiwgIDB4NDksICAweDYwLCAgMHgwNSwgIDB4ZmUsICAweDljLCAgMHgwMCwgIDB4MjgsICAweDg0LCAgMHg0OSwKKyAgMHgwNCwgIDB4MTksICAweDM0LCAgMHg5ZiwgIDB4ZmUsICAweGJiLCAgMHg0NSwgIDB4NGIsICAweDAwLCAgMHg0NSwgIDB4M2UsICAweDA2LCAgMHg3OCwgIDB4M2QsICAweGZlLCAgMHhkYSwKKyAgMHgxNCwgIDB4MDEsICAweDZlLCAgMHg4NywgIDB4ZmUsICAweDRiLCAgMHg0NSwgIDB4ZTIsICAweDJmLCAgMHgwNywgIDB4OWEsICAweGUxLCAgMHgwNSwgIDB4YzYsICAweDI4LCAgMHg4NCwKKyAgMHgwNSwgIDB4M2YsICAweDI4LCAgMHgzNCwgIDB4NWUsICAweDAyLCAgMHg1YiwgIDB4ZmUsICAweGMwLCAgMHg1ZCwgIDB4ZmUsICAweGY4LCAgMHgxNCwgIDB4ZmUsICAweDAzLCAgMHgxNywKKyAgMHgwNSwgIDB4NTAsICAweGI0LCAgMHgwYywgIDB4NTAsICAweDVlLCAgMHgyYiwgIDB4MDEsICAweDA4LCAgMHgyNiwgIDB4NWMsICAweDAxLCAgMHhmZSwgIDB4YWEsICAweDE0LCAgMHgwMiwKKyAgMHg1YywgIDB4MDEsICAweDA4LCAgMHgyNSwgIDB4MzIsICAweDFmLCAgMHg0NCwgIDB4MzAsICAweDJlLCAgMHhkNiwgIDB4MDcsICAweDA2LCAgMHgyMSwgIDB4NDQsICAweDAxLCAgMHhmZSwKKyAgMHg4ZSwgIDB4MTMsICAweGZlLCAgMHg0MiwgIDB4NTgsICAweGZlLCAgMHg4MiwgIDB4MTQsICAweGZlLCAgMHhhNCwgIDB4MTQsICAweDg3LCAgMHhmZSwgIDB4NGEsICAweGY0LCAgMHgwYiwKKyAgMHgxNiwgIDB4NDQsICAweGZlLCAgMHg0YSwgIDB4ZjQsICAweDA2LCAgMHhmZSwgIDB4MGMsICAweDEyLCAgMHgyZiwgIDB4MDcsICAweDlhLCAgMHg4NSwgIDB4MDIsICAweDViLCAgMHgwNSwKKyAgMHgzZiwgIDB4YjQsICAweDBjLCAgMHgzZiwgIDB4NWUsICAweDJiLCAgMHgwMSwgIDB4MDgsICAweDI2LCAgMHg1YywgIDB4MDEsICAweGZlLCAgMHhkOCwgIDB4MTQsICAweDAyLCAgMHg1YywKKyAgMHgxMywgIDB4MDYsICAweDY1LCAgMHhmZSwgIDB4Y2EsICAweDEyLCAgMHgyNiwgIDB4ZmUsICAweGUwLCAgMHgxMiwgIDB4NzIsICAweGYxLCAgMHgwMSwgIDB4MDgsICAweDIzLCAgMHg3MiwKKyAgMHgwMywgIDB4OGYsICAweGZlLCAgMHhkYywgIDB4MTIsICAweDI1LCAgMHhmZSwgIDB4ZGMsICAweDEyLCAgMHgxZiwgIDB4ZmUsICAweGNhLCAgMHgxMiwgIDB4NWUsICAweDJiLCAgMHgwMSwKKyAgMHgwOCwgIDB4ZmUsICAweGQ1LCAgMHgxMCwgIDB4MTMsICAweDZjLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHg1NywgIDB4NDgsICAweDhiLCAgMHgxYywgIDB4ZmUsICAweGZmLCAgMHg3ZiwKKyAgMHhmZSwgIDB4MzAsICAweDU2LCAgMHhmZSwgIDB4MDAsICAweDVjLCAgMHgwMywgIDB4MTMsICAweDZjLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHg1NywgIDB4NDgsICAweDhiLCAgMHgxYywKKyAgMHgzZCwgIDB4ZmUsICAweDMwLCAgMHg1NiwgIDB4ZmUsICAweDAwLCAgMHg1YywgIDB4MDMsICAweDEzLCAgMHg2YywgIDB4ZmYsICAweDAyLCAgMHgwMCwgIDB4NTcsICAweDQ4LCAgMHg4YiwKKyAgMHgwMywgIDB4MTMsICAweDZjLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHg1NywgIDB4NDgsICAweDhiLCAgMHhmZSwgIDB4MGIsICAweDU4LCAgMHgwMywgIDB4MGEsICAweDUwLCAgMHgwMSwKKyAgMHg4MiwgIDB4MGEsICAweDNmLCAgMHgwMSwgIDB4ODIsICAweDAzLCAgMHhmYywgIDB4MWMsICAweDEwLCAgMHhmZiwgIDB4MDMsICAweDAwLCAgMHg1NCwgIDB4ZmUsICAweDAwLCAgMHhmNCwKKyAgMHgxOSwgIDB4NDgsICAweGZlLCAgMHgwMCwgIDB4N2QsICAweGZlLCAgMHgwMSwgIDB4N2QsICAweGZlLCAgMHgwMiwgIDB4N2QsICAweGZlLCAgMHgwMywgIDB4N2MsICAweDYzLCAgMHgyNywKKyAgMHgwYywgIDB4NTIsICAweDE4LCAgMHg1MywgIDB4YmUsICAweDU2LCAgMHhiZiwgIDB4NTcsICAweDAzLCAgMHhmZSwgIDB4NjIsICAweDA4LCAgMHhmZSwgIDB4ODIsICAweDRhLCAgMHhmZSwKKyAgMHhlMSwgIDB4MWEsICAweGZlLCAgMHg4MywgIDB4NWEsICAweDc0LCAgMHgwMywgIDB4MDEsICAweGZlLCAgMHgxNCwgIDB4MTgsICAweGZlLCAgMHg0MiwgIDB4NDgsICAweDVmLCAgMHg2MCwKKyAgMHg4OSwgIDB4MDEsICAweDA4LCAgMHgxZiwgIDB4ZmUsICAweGEyLCAgMHgxNCwgIDB4MzAsICAweDJlLCAgMHhkOCwgIDB4MDEsICAweDA4LCAgMHgxZiwgIDB4ZmUsICAweGEyLCAgMHgxNCwKKyAgMHgzMCwgIDB4MmUsICAweGZlLCAgMHhlOCwgIDB4MGEsICAweGZlLCAgMHhjMSwgIDB4NTksICAweDA1LCAgMHhjNiwgIDB4MjgsICAweGZlLCAgMHhjYywgIDB4MTIsICAweDQ5LCAgMHgwNCwKKyAgMHgxYiwgIDB4ZmUsICAweGM0LCAgMHgxMywgIDB4MjMsICAweDYyLCAgMHgxYiwgIDB4ZTIsICAweDRiLCAgMHhjMywgIDB4NjQsICAweGZlLCAgMHhlOCwgIDB4MTMsICAweDNiLCAgMHgxMywKKyAgMHgwNiwgIDB4MTcsICAweGMzLCAgMHg3OCwgIDB4ZGIsICAweGZlLCAgMHg3OCwgIDB4MTAsICAweGZmLCAgMHgwMiwgIDB4ODMsICAweDU1LCAgMHhhMSwgIDB4ZmYsICAweDAyLCAgMHg4MywKKyAgMHg1NSwgIDB4NjIsICAweDFhLCAgMHhhNCwgIDB4YmIsICAweGZlLCAgMHgzMCwgIDB4MDAsICAweDhlLCAgMHhlNCwgIDB4MTcsICAweDJjLCAgMHgxMywgIDB4MDYsICAweGZlLCAgMHg1NiwKKyAgMHgxMCwgIDB4NjIsICAweDBiLCAgMHhlMSwgIDB4YmIsICAweGZlLCAgMHg2NCwgIDB4MDAsICAweDhlLCAgMHhlNCwgIDB4MGEsICAweGZlLCAgMHg2NCwgIDB4MDAsICAweDE3LCAgMHg5MywKKyAgMHgxMywgIDB4MDYsICAweGZlLCAgMHgyOCwgIDB4MTAsICAweDYyLCAgMHgwNiwgIDB4ZmUsICAweDYwLCAgMHgxMywgIDB4YmIsICAweGZlLCAgMHhjOCwgIDB4MDAsICAweDhlLCAgMHhlNCwKKyAgMHgwYSwgIDB4ZmUsICAweGM4LCAgMHgwMCwgIDB4MTcsICAweDRkLCAgMHgxMywgIDB4MDYsICAweDgzLCAgMHhiYiwgIDB4ZmUsICAweDkwLCAgMHgwMSwgIDB4YmEsICAweGZlLCAgMHg0ZSwKKyAgMHgxNCwgIDB4ODksICAweGZlLCAgMHgxMiwgIDB4MTAsICAweGZlLCAgMHg0MywgIDB4ZjQsICAweDk0LCAgMHhmZSwgIDB4NTYsICAweGYwLCAgMHhmZSwgIDB4NjAsICAweDE0LCAgMHhmZSwKKyAgMHgwNCwgIDB4ZjQsICAweDZjLCAgMHhmZSwgIDB4NDMsICAweGY0LCAgMHg5MywgIDB4ZmUsICAweGYzLCAgMHgxMCwgIDB4ZjksICAweDAxLCAgMHhmZSwgIDB4MjIsICAweDEzLCAgMHgxYywKKyAgMHgzZCwgIDB4ZmUsICAweDEwLCAgMHgxMywgIDB4ZmUsICAweDAwLCAgMHgxNywgIDB4ZmUsICAweDRkLCAgMHhlNCwgIDB4NjksICAweGJhLCAgMHhmZSwgIDB4OWMsICAweDE0LCAgMHhiNywKKyAgMHg2OSwgIDB4ZmUsICAweDFjLCAgMHgxMCwgIDB4ZmUsICAweDAwLCAgMHgxNywgIDB4ZmUsICAweDRkLCAgMHhlNCwgIDB4MTksICAweGJhLCAgMHhmZSwgIDB4OWMsICAweDE0LCAgMHhiNywKKyAgMHgxOSwgIDB4ODMsICAweDYwLCAgMHgyMywgIDB4ZmUsICAweDRkLCAgMHhmNCwgIDB4MDAsICAweGRmLCAgMHg4OSwgIDB4MTMsICAweDA2LCAgMHhmZSwgIDB4YjQsICAweDU2LCAgMHhmZSwKKyAgMHhjMywgIDB4NTgsICAweDAzLCAgMHg2MCwgIDB4MTMsICAweDBiLCAgMHgwMywgIDB4MTUsICAweDA2LCAgMHgwMSwgIDB4MDgsICAweDI2LCAgMHhlNSwgIDB4MTUsICAweDBiLCAgMHgwMSwKKyAgMHgwOCwgIDB4MjYsICAweGU1LCAgMHgxNSwgIDB4MWEsICAweDAxLCAgMHgwOCwgIDB4MjYsICAweGU1LCAgMHg3MiwgIDB4ZmUsICAweDg5LCAgMHg0OSwgIDB4MDEsICAweDA4LCAgMHgwMywKKyAgMHgxNSwgIDB4MDYsICAweDAxLCAgMHgwOCwgIDB4MjYsICAweGE2LCAgMHgxNSwgIDB4MWEsICAweDAxLCAgMHgwOCwgIDB4MjYsICAweGE2LCAgMHgxNSwgIDB4MDYsICAweDAxLCAgMHgwOCwKKyAgMHgyNiwgIDB4YTYsICAweGZlLCAgMHg4OSwgIDB4NDksICAweDAxLCAgMHgwOCwgIDB4MjYsICAweGE2LCAgMHg3MiwgIDB4ZmUsICAweDg5LCAgMHg0YSwgIDB4MDEsICAweDA4LCAgMHgwMywKKyAgMHg2MCwgIDB4MDMsICAweDFlLCAgMHhjYywgIDB4MDcsICAweDA2LCAgMHhmZSwgIDB4NDQsICAweDEzLCAgMHhhZCwgIDB4MTIsICAweGNjLCAgMHhmZSwgIDB4NDksICAweGY0LCAgMHgwMCwKKyAgMHgzYiwgIDB4NzIsICAweDlmLCAgMHg1ZSwgIDB4ZmUsICAweDAxLCAgMHhlYywgIDB4ZmUsICAweDI3LCAgMHgwMSwgIDB4ZjEsICAweDAxLCAgMHgwOCwgIDB4MmYsICAweDA3LCAgMHhmZSwKKyAgMHhlMywgIDB4MDAsICAweGZlLCAgMHgyMCwgIDB4MTMsICAweDFmLCAgMHhmZSwgIDB4NWEsICAweDE1LCAgMHgyMywgIDB4MTIsICAweGNkLCAgMHgwMSwgIDB4NDMsICAweDFlLCAgMHhjZCwKKyAgMHgwNywgIDB4MDYsICAweDQ1LCAgMHgwOSwgIDB4NGEsICAweDA2LCAgMHgzNSwgIDB4MDMsICAweDBhLCAgMHg0MiwgIDB4MDEsICAweDBlLCAgMHhlZCwgIDB4ODgsICAweDA3LCAgMHgxMCwKKyAgMHhhNCwgIDB4MGEsICAweDgwLCAgMHgwMSwgIDB4MGUsICAweDg4LCAgMHgwYSwgIDB4NTEsICAweDAxLCAgMHg5ZSwgIDB4MDMsICAweDBhLCAgMHg4MCwgIDB4MDEsICAweDBlLCAgMHg4OCwKKyAgMHhmZSwgIDB4ODAsICAweGU3LCAgMHgxMCwgIDB4MDcsICAweDEwLCAgMHg4NCwgIDB4ZmUsICAweDQ1LCAgMHg1OCwgIDB4MDEsICAweGUzLCAgMHg4OCwgIDB4MDMsICAweDBhLCAgMHg0MiwKKyAgMHgwMSwgIDB4MGUsICAweDg4LCAgMHgwYSwgIDB4NTEsICAweDAxLCAgMHg5ZSwgIDB4MDMsICAweDBhLCAgMHg0MiwgIDB4MDEsICAweDBlLCAgMHhmZSwgIDB4ODAsICAweDgwLCAgMHhmMiwKKyAgMHhmZSwgIDB4NDksICAweGU0LCAgMHgxMCwgIDB4YTQsICAweDBhLCAgMHg4MCwgIDB4MDEsICAweDBlLCAgMHhmMiwgIDB4MGEsICAweDUxLCAgMHgwMSwgIDB4ODIsICAweDAzLCAgMHgxNywKKyAgMHgxMCwgIDB4NzEsICAweDY2LCAgMHhmZSwgIDB4NjAsICAweDAxLCAgMHhmZSwgIDB4MTgsICAweGRmLCAgMHhmZSwgIDB4MTksICAweGRlLCAgMHhmZSwgIDB4MjQsICAweDFjLCAgMHhmZSwKKyAgMHgxZCwgIDB4ZjcsICAweDFkLCAgMHg5MCwgIDB4ZmUsICAweGY2LCAgMHgxNSwgIDB4MDEsICAweGZlLCAgMHhmYywgIDB4MTYsICAweGUwLCAgMHg5MSwgIDB4MWQsICAweDY2LCAgMHhmZSwKKyAgMHgyYywgIDB4MDEsICAweGZlLCAgMHgyZiwgIDB4MTksICAweDAzLCAgMHhhZSwgIDB4MjEsICAweGZlLCAgMHhlNiwgIDB4MTUsICAweGZlLCAgMHhkYSwgIDB4MTAsICAweDE3LCAgMHgxMCwKKyAgMHg3MSwgIDB4MDUsICAweGZlLCAgMHg2NCwgIDB4MDEsICAweGZlLCAgMHgwMCwgIDB4ZjQsICAweDE5LCAgMHhmZSwgIDB4MTgsICAweDU4LCAgMHgwNSwgIDB4ZmUsICAweDY2LCAgMHgwMSwKKyAgMHhmZSwgIDB4MTksICAweDU4LCAgMHg5MSwgIDB4MTksICAweGZlLCAgMHgzYywgIDB4OTAsICAweGZlLCAgMHgzMCwgIDB4ZjQsICAweDA2LCAgMHhmZSwgIDB4M2MsICAweDUwLCAgMHg2NiwKKyAgMHhmZSwgIDB4MzgsICAweDAwLCAgMHhmZSwgIDB4MGYsICAweDc5LCAgMHhmZSwgIDB4MWMsICAweGY3LCAgMHgxOSwgIDB4OTAsICAweGZlLCAgMHg0MCwgIDB4MTYsICAweGZlLCAgMHhiNiwKKyAgMHgxNCwgIDB4MzQsICAweDAzLCAgMHhhZSwgIDB4MjEsICAweGZlLCAgMHgxOCwgIDB4MTYsICAweGZlLCAgMHg5YywgIDB4MTAsICAweDE3LCAgMHgxMCwgIDB4NzEsICAweGZlLCAgMHg4MywKKyAgMHg1YSwgIDB4ZmUsICAweDE4LCAgMHhkZiwgIDB4ZmUsICAweDE5LCAgMHhkZSwgIDB4ZmUsICAweDFkLCAgMHhmNywgIDB4MzgsICAweDkwLCAgMHhmZSwgIDB4NjIsICAweDE2LCAgMHhmZSwKKyAgMHg5NCwgIDB4MTQsICAweGZlLCAgMHgxMCwgIDB4MTMsICAweDkxLCAgMHgzOCwgIDB4NjYsICAweDFiLCAgMHhmZSwgIDB4YWYsICAweDE5LCAgMHhmZSwgIDB4OTgsICAweGU3LCAgMHgwMCwKKyAgMHgwMywgIDB4YWUsICAweDIxLCAgMHhmZSwgIDB4NTYsICAweDE2LCAgMHhmZSwgIDB4NmMsICAweDEwLCAgMHgxNywgIDB4MTAsICAweDcxLCAgMHhmZSwgIDB4MzAsICAweGJjLCAgMHhmZSwKKyAgMHhiMiwgIDB4YmMsICAweDkxLCAgMHhjNSwgIDB4NjYsICAweDFiLCAgMHhmZSwgIDB4MGYsICAweDc5LCAgMHhmZSwgIDB4MWMsICAweGY3LCAgMHhjNSwgIDB4OTAsICAweGZlLCAgMHg5YSwKKyAgMHgxNiwgIDB4ZmUsICAweDVjLCAgMHgxNCwgIDB4MzQsICAweDAzLCAgMHhhZSwgIDB4MjEsICAweGZlLCAgMHg4NiwgIDB4MTYsICAweGZlLCAgMHg0MiwgIDB4MTAsICAweGZlLCAgMHgwMiwKKyAgMHhmNiwgIDB4MTAsICAweDcxLCAgMHhmZSwgIDB4MTgsICAweGZlLCAgMHg1NCwgIDB4ZmUsICAweDE5LCAgMHhmZSwgIDB4NTUsICAweGZjLCAgMHhmZSwgIDB4MWQsICAweGY3LCAgMHg0ZiwKKyAgMHg5MCwgIDB4ZmUsICAweGMwLCAgMHgxNiwgIDB4ZmUsICAweDM2LCAgMHgxNCwgIDB4ZmUsICAweDFjLCAgMHgxMywgIDB4OTEsICAweDRmLCAgMHg0NywgIDB4ZmUsICAweDgzLCAgMHg1OCwKKyAgMHhmZSwgIDB4YWYsICAweDE5LCAgMHhmZSwgIDB4ODAsICAweGU3LCAgMHgxMCwgIDB4ZmUsICAweDgxLCAgMHhlNywgIDB4MTAsICAweDExLCAgMHhmZSwgIDB4ZGQsICAweDAwLCAgMHg2MywKKyAgMHgyNywgIDB4MDMsICAweDYzLCAgMHgyNywgIDB4ZmUsICAweDEyLCAgMHg0NSwgIDB4MjEsICAweGZlLCAgMHhiMCwgIDB4MTYsICAweDE0LCAgMHgwNiwgIDB4MzcsICAweDk1LCAgMHhhOSwKKyAgMHgwMiwgIDB4MjksICAweGZlLCAgMHgzOSwgIDB4ZjAsICAweGZlLCAgMHgwNCwgIDB4MTcsICAweDIzLCAgMHgwMywgIDB4ZmUsICAweDdlLCAgMHgxOCwgIDB4MWMsICAweDFhLCAgMHg1ZCwKKyAgMHgxMywgIDB4MGQsICAweDAzLCAgMHg3MSwgIDB4MDUsICAweGNiLCAgMHgxYywgIDB4MDYsICAweGZlLCAgMHhlZiwgIDB4MTIsICAweGZlLCAgMHhlMSwgIDB4MTAsICAweDc4LCAgMHgyYywKKyAgMHg0NiwgIDB4MmYsICAweDA3LCAgMHgyZCwgIDB4ZmUsICAweDNjLCAgMHgxMywgIDB4ZmUsICAweDgyLCAgMHgxNCwgIDB4ZmUsICAweDQyLCAgMHgxMywgIDB4M2MsICAweDhhLCAgMHgwYSwKKyAgMHg0MiwgIDB4MDEsICAweDBlLCAgMHhiMCwgIDB4ZmUsICAweDNlLCAgMHgxMiwgIDB4ZjAsICAweGZlLCAgMHg0NSwgIDB4NDgsICAweDAxLCAgMHhlMywgIDB4ZmUsICAweDAwLCAgMHhjYywKKyAgMHhiMCwgIDB4ZmUsICAweGYzLCAgMHgxMywgIDB4M2QsICAweDc1LCAgMHgwNywgIDB4MTAsICAweGEzLCAgMHgwYSwgIDB4ODAsICAweDAxLCAgMHgwZSwgIDB4ZjIsICAweDAxLCAgMHg2ZiwKKyAgMHhmZSwgIDB4MTYsICAweDEwLCAgMHgwNywgIDB4N2UsICAweDg1LCAgMHhmZSwgIDB4NDAsICAweDE0LCAgMHhmZSwgIDB4MjQsICAweDEyLCAgMHhmNiwgIDB4ZmUsICAweGQ2LCAgMHhmMCwKKyAgMHhmZSwgIDB4MjQsICAweDE3LCAgMHgxNywgIDB4MGIsICAweDAzLCAgMHhmZSwgIDB4OWMsICAweGU3LCAgMHgwYiwgIDB4MGYsICAweGZlLCAgMHgxNSwgIDB4MDAsICAweDU5LCAgMHg3NiwKKyAgMHgyNywgIDB4MDEsICAweGRhLCAgMHgxNywgIDB4MDYsICAweDAzLCAgMHgzYywgIDB4OGEsICAweDA5LCAgMHg0YSwgIDB4MWQsICAweDM1LCAgMHgxMSwgIDB4MmQsICAweDAxLCAgMHg2ZiwKKyAgMHgxNywgIDB4MDYsICAweDAzLCAgMHhmZSwgIDB4MzgsICAweDkwLCAgMHhmZSwgIDB4YmEsICAweDkwLCAgMHg3OSwgIDB4YzcsICAweDY4LCAgMHhjOCwgIDB4ZmUsICAweDQ4LCAgMHg1NSwKKyAgMHgzNCwgIDB4ZmUsICAweGM5LCAgMHg1NSwgIDB4MDMsICAweDFlLCAgMHg5OCwgIDB4NzMsICAweDEyLCAgMHg5OCwgIDB4MDMsICAweDBhLCAgMHg5OSwgIDB4MDEsICAweDBlLCAgMHhmMCwKKyAgMHgwYSwgIDB4NDAsICAweDAxLCAgMHgwZSwgIDB4ZmUsICAweDQ5LCAgMHg0NCwgIDB4MTYsICAweGZlLCAgMHhmMCwgIDB4MTcsICAweDczLCAgMHg3NSwgIDB4MDMsICAweDBhLCAgMHg0MiwKKyAgMHgwMSwgIDB4MGUsICAweDA3LCAgMHgxMCwgIDB4NDUsICAweDBhLCAgMHg1MSwgIDB4MDEsICAweDllLCAgMHgwYSwgIDB4NDAsICAweDAxLCAgMHgwZSwgIDB4NzMsICAweDc1LCAgMHgwMywKKyAgMHhmZSwgIDB4NGUsICAweGU0LCAgMHgxYSwgIDB4NjQsICAweGZlLCAgMHgyNCwgIDB4MTgsICAweDA1LCAgMHhmZSwgIDB4OTAsICAweDAwLCAgMHhmZSwgIDB4M2EsICAweDQ1LCAgMHg1YiwKKyAgMHhmZSwgIDB4NGUsICAweGU0LCAgMHhjMiwgIDB4NjQsICAweGZlLCAgMHgzNiwgIDB4MTgsICAweDA1LCAgMHhmZSwgIDB4OTIsICAweDAwLCAgMHhmZSwgIDB4MDIsICAweGU2LCAgMHgxYiwKKyAgMHhkYywgIDB4ZmUsICAweDRlLCAgMHhlNCwgIDB4ZmUsICAweDBiLCAgMHgwMCwgIDB4NjQsICAweGZlLCAgMHg0OCwgIDB4MTgsICAweDA1LCAgMHhmZSwgIDB4OTQsICAweDAwLCAgMHhmZSwKKyAgMHgwMiwgIDB4ZTYsICAweDE5LCAgMHhmZSwgIDB4MDgsICAweDEwLCAgMHgwNSwgIDB4ZmUsICAweDk2LCAgMHgwMCwgIDB4ZmUsICAweDAyLCAgMHhlNiwgIDB4MmMsICAweGZlLCAgMHg0ZSwKKyAgMHg0NSwgIDB4ZmUsICAweDBjLCAgMHgxMiwgIDB4YWYsICAweGZmLCAgMHgwNCwgIDB4NjgsICAweDU0LCAgMHhkZSwgIDB4MWMsICAweDY5LCAgMHgwMywgIDB4MDcsICAweDdhLCAgMHhmZSwKKyAgMHg1YSwgIDB4ZjAsICAweGZlLCAgMHg3NCwgIDB4MTgsICAweDI0LCAgMHhmZSwgIDB4MDksICAweDAwLCAgMHhmZSwgIDB4MzQsICAweDEwLCAgMHgwNywgIDB4MWIsICAweGZlLCAgMHg1YSwKKyAgMHhmMCwgIDB4ZmUsICAweDgyLCAgMHgxOCwgIDB4MjQsICAweGMzLCAgMHhmZSwgIDB4MjYsICAweDEwLCAgMHgwNywgIDB4MWEsICAweDVkLCAgMHgyNCwgIDB4MmMsICAweGRjLCAgMHgwNywKKyAgMHgwYiwgIDB4NWQsICAweDI0LCAgMHg5MywgIDB4ZmUsICAweDBlLCAgMHgxMCwgIDB4MDcsICAweDA2LCAgMHg1ZCwgIDB4MjQsICAweDRkLCAgMHg5ZiwgIDB4YWQsICAweDAzLCAgMHgxNCwKKyAgMHhmZSwgIDB4MDksICAweDAwLCAgMHgwMSwgIDB4MzMsICAweGZlLCAgMHgwNCwgIDB4ZmUsICAweDdkLCAgMHgwNSwgIDB4N2YsICAweGY5LCAgMHgwMywgIDB4MjUsICAweGZlLCAgMHhjYSwKKyAgMHgxOCwgIDB4ZmUsICAweDE0LCAgMHhmMCwgIDB4MDgsICAweDY1LCAgMHhmZSwgIDB4YzYsICAweDE4LCAgMHgwMywgIDB4ZmYsICAweDFhLCAgMHgwMCwgIDB4MDAsCit9OworCitTVEFUSUMgdW5zaWduZWQgc2hvcnQgX2Fkdl9hc2MzNTUwX3NpemUgPQorICAgICAgICBzaXplb2YoX2Fkdl9hc2MzNTUwX2J1Zik7IC8qIDB4MTNBRCAqLworU1RBVElDIEFEVl9EQ05UIF9hZHZfYXNjMzU1MF9jaGtzdW0gPQorICAgICAgICAweDA0RDUyREREVUw7IC8qIEV4cGFuZGVkIGxpdHRsZS1lbmRpYW4gY2hlY2tzdW0uICovCisKKy8qIE1pY3JvY29kZSBidWZmZXIgaXMga2VwdCBhZnRlciBpbml0aWFsaXphdGlvbiBmb3IgZXJyb3IgcmVjb3ZlcnkuICovCitTVEFUSUMgdW5zaWduZWQgY2hhciBfYWR2X2FzYzM4QzA4MDBfYnVmW10gPSB7CisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4ZjIsICAweDAwLCAgMHhmMCwgIDB4MDAsICAweGZjLCAgMHgwMCwgIDB4MTYsICAweDE4LCAgMHhlNCwgIDB4MDEsICAweDAwLCAgMHg0OCwgIDB4ZTQsCisgIDB4MTgsICAweDgwLCAgMHgwMywgIDB4ZjYsICAweDAyLCAgMHgwMCwgIDB4Y2UsICAweDE5LCAgMHgwMCwgIDB4ZmEsICAweGZmLCAgMHhmZiwgIDB4MWMsICAweDBmLCAgMHgwMCwgIDB4ZjYsCisgIDB4OWUsICAweGU3LCAgMHhmZiwgIDB4MDAsICAweDgyLCAgMHhlNywgIDB4MDAsICAweGVhLCAgMHgwMSwgIDB4ZmEsICAweDAxLCAgMHhlNiwgIDB4MDksICAweGU3LCAgMHg1NSwgIDB4ZjAsCisgIDB4MDEsICAweGY2LCAgMHgwMywgIDB4MDAsICAweDA0LCAgMHgwMCwgIDB4MTAsICAweDAwLCAgMHgxZSwgIDB4ZjAsICAweDg1LCAgMHhmMCwgIDB4MTgsICAweGY0LCAgMHgwOCwgIDB4MDAsCisgIDB4YmMsICAweDAwLCAgMHgzOCwgIDB4NTQsICAweDAwLCAgMHhlYywgIDB4ZDUsICAweGYwLCAgMHg4MiwgIDB4MGQsICAweDAwLCAgMHhlNiwgIDB4ODYsICAweGYwLCAgMHhiMSwgIDB4ZjAsCisgIDB4OTgsICAweDU3LCAgMHgwMSwgIDB4ZmMsICAweGI0LCAgMHgwMCwgIDB4ZDQsICAweDAxLCAgMHgwYywgIDB4MWMsICAweDNlLCAgMHgxYywgIDB4M2MsICAweDAwLCAgMHhiYiwgIDB4MDAsCisgIDB4MDAsICAweDEwLCAgMHhiYSwgIDB4MTksICAweDAyLCAgMHg4MCwgIDB4MzIsICAweGYwLCAgMHg3YywgIDB4MGQsICAweDAyLCAgMHgxMywgIDB4YmEsICAweDEzLCAgMHgxOCwgIDB4NDAsCisgIDB4MDAsICAweDU3LCAgMHgwMSwgIDB4ZWEsICAweDAyLCAgMHhmYywgIDB4MDMsICAweGZjLCAgMHgzZSwgIDB4MDAsICAweDZjLCAgMHgwMSwgIDB4NmUsICAweDAxLCAgMHg3NCwgIDB4MDEsCisgIDB4NzYsICAweDAxLCAgMHhiOSwgIDB4NTQsICAweDNlLCAgMHg1NywgIDB4MDAsICAweDgwLCAgMHgwMywgIDB4ZTYsICAweGI2LCAgMHgwMCwgIDB4YzAsICAweDAwLCAgMHgwMSwgIDB4MDEsCisgIDB4M2UsICAweDAxLCAgMHg3YSwgIDB4MDEsICAweGNhLCAgMHgwOCwgIDB4Y2UsICAweDEwLCAgMHgxNiwgIDB4MTEsICAweDA0LCAgMHgxMiwgIDB4MDgsICAweDEyLCAgMHgwMiwgIDB4NGEsCisgIDB4YmIsICAweDU1LCAgMHgzYywgIDB4NTYsICAweDAzLCAgMHg1OCwgIDB4MWIsICAweDgwLCAgMHgzMCwgIDB4ZTQsICAweDRiLCAgMHhlNCwgIDB4NWQsICAweGYwLCAgMHgwMiwgIDB4ZmEsCisgIDB4MjAsICAweDAwLCAgMHgzMiwgIDB4MDAsICAweDQwLCAgMHgwMCwgIDB4ODAsICAweDAwLCAgMHgyNCwgIDB4MDEsICAweDNjLCAgMHgwMSwgIDB4NjgsICAweDAxLCAgMHg2YSwgIDB4MDEsCisgIDB4NzAsICAweDAxLCAgMHg3MiwgIDB4MDEsICAweDc4LCAgMHgwMSwgIDB4N2MsICAweDAxLCAgMHg2MiwgIDB4MGEsICAweDg2LCAgMHgwZCwgIDB4MDYsICAweDEzLCAgMHg0YywgIDB4MWMsCisgIDB4MDQsICAweDgwLCAgMHg0YSwgIDB4ZTQsICAweDAyLCAgMHhlZSwgIDB4NWIsICAweGYwLCAgMHgwMywgIDB4ZjcsICAweDBjLCAgMHgwMCwgIDB4MGYsICAweDAwLCAgMHg0NywgIDB4MDAsCisgIDB4YmUsICAweDAwLCAgMHgwMCwgIDB4MDEsICAweDIwLCAgMHgxMSwgIDB4NWMsICAweDE2LCAgMHgzMiwgIDB4MWMsICAweDM4LCAgMHgxYywgIDB4NGUsICAweDFjLCAgMHgxMCwgIDB4NDQsCisgIDB4MDAsICAweDRjLCAgMHgwNCwgIDB4ZWEsICAweDVjLCAgMHhmMCwgIDB4YTcsICAweGYwLCAgMHgwNCwgIDB4ZjYsICAweDAzLCAgMHhmYSwgIDB4MDUsICAweDAwLCAgMHgzNCwgIDB4MDAsCisgIDB4MzYsICAweDAwLCAgMHg5OCwgIDB4MDAsICAweGNjLCAgMHgwMCwgIDB4MjAsICAweDAxLCAgMHg0ZSwgIDB4MDEsICAweDRhLCAgMHgwYiwgIDB4NDIsICAweDBjLCAgMHgxMiwgIDB4MGYsCisgIDB4MGMsICAweDEwLCAgMHgyMiwgIDB4MTEsICAweDBhLCAgMHgxMiwgIDB4MDQsICAweDEzLCAgMHgzMCwgIDB4MWMsICAweDAyLCAgMHg0OCwgIDB4MDAsICAweDRlLCAgMHg0MiwgIDB4NTQsCisgIDB4NDQsICAweDU1LCAgMHhiZCwgIDB4NTYsICAweDA2LCAgMHg4MywgIDB4MDAsICAweGRjLCAgMHgwNSwgIDB4ZjAsICAweDA5LCAgMHhmMCwgIDB4NTksICAweGYwLCAgMHhiOCwgIDB4ZjAsCisgIDB4NGIsICAweGY0LCAgMHgwNiwgIDB4ZjcsICAweDBlLCAgMHhmNywgIDB4MDQsICAweGZjLCAgMHgwNSwgIDB4ZmMsICAweDA2LCAgMHgwMCwgIDB4MTksICAweDAwLCAgMHgzMywgIDB4MDAsCisgIDB4OWIsICAweDAwLCAgMHhhNCwgIDB4MDAsICAweGI1LCAgMHgwMCwgIDB4YmEsICAweDAwLCAgMHhkMCwgIDB4MDAsICAweGUxLCAgMHgwMCwgIDB4ZTcsICAweDAwLCAgMHhlMiwgIDB4MDMsCisgIDB4MDgsICAweDBmLCAgMHgwMiwgIDB4MTAsICAweDA0LCAgMHgxMCwgIDB4MGEsICAweDEwLCAgMHgwYSwgIDB4MTMsICAweDBjLCAgMHgxMywgIDB4MTIsICAweDEzLCAgMHgyNCwgIDB4MTQsCisgIDB4MzQsICAweDE0LCAgMHgwNCwgIDB4MTYsICAweDA4LCAgMHgxNiwgIDB4YTQsICAweDE3LCAgMHgyMCwgIDB4MWMsICAweDM0LCAgMHgxYywgIDB4MzYsICAweDFjLCAgMHgwOCwgIDB4NDQsCisgIDB4MzgsICAweDQ0LCAgMHg5MSwgIDB4NDQsICAweDBhLCAgMHg0NSwgIDB4NDgsICAweDQ2LCAgMHgwMSwgIDB4NDgsICAweDY4LCAgMHg1NCwgIDB4M2EsICAweDU1LCAgMHg4MywgIDB4NTUsCisgIDB4ZTUsICAweDU1LCAgMHhiMCwgIDB4NTcsICAweDAxLCAgMHg1OCwgIDB4ODMsICAweDU5LCAgMHgwNSwgIDB4ZTYsICAweDBiLCAgMHhmMCwgIDB4MGMsICAweGYwLCAgMHgwNCwgIDB4ZjgsCisgIDB4MDUsICAweGY4LCAgMHgwNywgIDB4MDAsICAweDBhLCAgMHgwMCwgIDB4MWMsICAweDAwLCAgMHgxZSwgIDB4MDAsICAweDllLCAgMHgwMCwgIDB4YTgsICAweDAwLCAgMHhhYSwgIDB4MDAsCisgIDB4YjksICAweDAwLCAgMHhlMCwgIDB4MDAsICAweDIyLCAgMHgwMSwgIDB4MjYsICAweDAxLCAgMHg3OSwgIDB4MDEsICAweDdlLCAgMHgwMSwgIDB4YzQsICAweDAxLCAgMHhjNiwgIDB4MDEsCisgIDB4ODAsICAweDAyLCAgMHg1ZSwgIDB4MDMsICAweGVlLCAgMHgwNCwgIDB4OWEsICAweDA2LCAgMHhmOCwgIDB4MDcsICAweDYyLCAgMHgwOCwgIDB4NjgsICAweDA4LCAgMHg2OSwgIDB4MDgsCisgIDB4ZDYsICAweDA4LCAgMHhlOSwgIDB4MDksICAweGZhLCAgMHgwYiwgIDB4MmUsICAweDBmLCAgMHgxMiwgIDB4MTAsICAweDFhLCAgMHgxMCwgIDB4ZWQsICAweDEwLCAgMHhmMSwgIDB4MTAsCisgIDB4MmEsICAweDExLCAgMHgwNiwgIDB4MTIsICAweDBjLCAgMHgxMiwgIDB4M2UsICAweDEyLCAgMHgxMCwgIDB4MTMsICAweDE2LCAgMHgxMywgIDB4MWUsICAweDEzLCAgMHg0NiwgIDB4MTQsCisgIDB4NzYsICAweDE0LCAgMHg4MiwgIDB4MTQsICAweDM2LCAgMHgxNSwgIDB4Y2EsICAweDE1LCAgMHg2YiwgIDB4MTgsICAweGJlLCAgMHgxOCwgIDB4Y2EsICAweDE4LCAgMHhlNiwgIDB4MTksCisgIDB4MTIsICAweDFjLCAgMHg0NiwgIDB4MWMsICAweDljLCAgMHgzMiwgIDB4MDAsICAweDQwLCAgMHgwZSwgIDB4NDcsICAweGZlLCAgMHg5YywgIDB4ZjAsICAweDJiLCAgMHgwMiwgIDB4ZmUsCisgIDB4YWMsICAweDBkLCAgMHhmZiwgIDB4MTAsICAweDAwLCAgMHgwMCwgIDB4ZDcsICAweGZlLCAgMHhlOCwgIDB4MTksICAweDAwLCAgMHhkNiwgIDB4ZmUsICAweDg0LCAgMHgwMSwgIDB4ZmYsCisgIDB4MDMsICAweDAwLCAgMHgwMCwgIDB4ZmUsICAweDkzLCAgMHgxNSwgIDB4ZmUsICAweDBmLCAgMHgwNSwgIDB4ZmYsICAweDM4LCAgMHgwMCwgIDB4MDAsICAweGZlLCAgMHg1NywgIDB4MjQsCisgIDB4MDAsICAweGZlLCAgMHg0YywgIDB4MDAsICAweDViLCAgMHhmZiwgIDB4MDQsICAweDAwLCAgMHgwMCwgIDB4MTEsICAweGZmLCAgMHgwOSwgIDB4MDAsICAweDAwLCAgMHhmZiwgIDB4MDgsCisgIDB4MDEsICAweDAxLCAgMHhmZiwgIDB4MDgsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweDI3LCAgMHgwMCwgIDB4MDAsICAweGZmLCAgMHgxMCwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4MTEsCisgIDB4MDAsICAweDAwLCAgMHhmZSwgIDB4NzgsICAweDU2LCAgMHhmZSwgIDB4MzQsICAweDEyLCAgMHhmZiwgIDB4MjEsICAweDAwLCAgMHgwMCwgIDB4ZmUsICAweDA0LCAgMHhmNywgIDB4ZDYsCisgIDB4MmMsICAweDk5LCAgMHgwYSwgIDB4MDEsICAweGZlLCAgMHhjMiwgIDB4MGYsICAweGZlLCAgMHgwNCwgIDB4ZjcsICAweGQ2LCAgMHg5OSwgIDB4MGEsICAweDQyLCAgMHgyYywgIDB4ZmUsCisgIDB4M2QsICAweGYwLCAgMHhmZSwgIDB4MDYsICAweDAyLCAgMHhmZSwgIDB4MjAsICAweGYwLCAgMHhhNywgIDB4ZmUsICAweDkxLCAgMHhmMCwgIDB4ZmUsICAweGY0LCAgMHgwMSwgIDB4ZmUsCisgIDB4OTAsICAweGYwLCAgMHhmZSwgIDB4ZjQsICAweDAxLCAgMHhmZSwgIDB4OGYsICAweGYwLCAgMHhhNywgIDB4MDMsICAweDVkLCAgMHg0ZCwgIDB4MDIsICAweGZlLCAgMHhjOCwgIDB4MGQsCisgIDB4MDEsICAweGZlLCAgMHgzOCwgIDB4MGUsICAweGZlLCAgMHhkZCwgIDB4MTIsICAweGZlLCAgMHhmYywgIDB4MTAsICAweGZlLCAgMHgyOCwgIDB4MWMsICAweDAzLCAgMHhmZSwgIDB4YTYsCisgIDB4MDAsICAweGZlLCAgMHhkMywgIDB4MTIsICAweDQxLCAgMHgxNCwgIDB4ZmUsICAweGE2LCAgMHgwMCwgIDB4YzIsICAweGZlLCAgMHg0OCwgIDB4ZjAsICAweGZlLCAgMHg4YSwgIDB4MDIsCisgIDB4ZmUsICAweDQ5LCAgMHhmMCwgIDB4ZmUsICAweGE0LCAgMHgwMiwgIDB4ZmUsICAweDRhLCAgMHhmMCwgIDB4ZmUsICAweGMyLCAgMHgwMiwgIDB4ZmUsICAweDQ2LCAgMHhmMCwgIDB4ZmUsCisgIDB4NTQsICAweDAyLCAgMHhmZSwgIDB4NDcsICAweGYwLCAgMHhmZSwgIDB4NWEsICAweDAyLCAgMHhmZSwgIDB4NDMsICAweGYwLCAgMHhmZSwgIDB4NDgsICAweDAyLCAgMHhmZSwgIDB4NDQsCisgIDB4ZjAsICAweGZlLCAgMHg0YywgIDB4MDIsICAweGZlLCAgMHg0NSwgIDB4ZjAsICAweGZlLCAgMHg1MCwgIDB4MDIsICAweDE4LCAgMHgwYSwgIDB4YWEsICAweDE4LCAgMHgwNiwgIDB4MTQsCisgIDB4YTEsICAweDAyLCAgMHgyYiwgIDB4ZmUsICAweDAwLCAgMHgxYywgIDB4ZTcsICAweGZlLCAgMHgwMiwgIDB4MWMsICAweGU2LCAgMHhmZSwgIDB4MWUsICAweDFjLCAgMHhmZSwgIDB4ZTksCisgIDB4MTAsICAweDAxLCAgMHhmZSwgIDB4MTgsICAweDE4LCAgMHhmZSwgIDB4ZTcsICAweDEwLCAgMHhmZSwgIDB4MDYsICAweGZjLCAgMHhjZSwgIDB4MDksICAweDcwLCAgMHgwMSwgIDB4YTgsCisgIDB4MDIsICAweDJiLCAgMHgxNSwgIDB4NTksICAweDM5LCAgMHhhMiwgIDB4MDEsICAweGZlLCAgMHg1OCwgIDB4MTAsICAweDA5LCAgMHg3MCwgIDB4MDEsICAweDg3LCAgMHhmZSwgIDB4YmQsCisgIDB4MTAsICAweDA5LCAgMHg3MCwgIDB4MDEsICAweDg3LCAgMHhmZSwgIDB4YWQsICAweDEwLCAgMHhmZSwgIDB4MTYsICAweDFjLCAgMHhmZSwgIDB4NTgsICAweDFjLCAgMHgxOCwgIDB4MDYsCisgIDB4MTQsICAweGExLCAgMHgyYywgIDB4MWMsICAweDJiLCAgMHhmZSwgIDB4M2QsICAweGYwLCAgMHhmZSwgIDB4MDYsICAweDAyLCAgMHgyMywgIDB4ZmUsICAweDk4LCAgMHgwMiwgIDB4ZmUsCisgIDB4NWEsICAweDFjLCAgMHhmOCwgIDB4ZmUsICAweDE0LCAgMHgxYywgIDB4MTUsICAweGZlLCAgMHgzMCwgIDB4MDAsICAweDM5LCAgMHhhMiwgIDB4MDEsICAweGZlLCAgMHg0OCwgIDB4MTAsCisgIDB4MTgsICAweDA2LCAgMHgxNCwgIDB4YTEsICAweDAyLCAgMHhkNywgIDB4MjIsICAweDIwLCAgMHgwNywgIDB4MTEsICAweDM1LCAgMHhmZSwgIDB4NjksICAweDEwLCAgMHgxOCwgIDB4MDYsCisgIDB4MTQsICAweGExLCAgMHhmZSwgIDB4MDQsICAweGVjLCAgMHgyMCwgIDB4NGYsICAweDQzLCAgMHgxMywgIDB4MjAsICAweGZlLCAgMHgwNSwgIDB4ZjYsICAweGNlLCAgMHgwMSwgIDB4ZmUsCisgIDB4NGEsICAweDE3LCAgMHgwOCwgIDB4NTQsICAweDU4LCAgMHgzNywgIDB4MTIsICAweDJmLCAgMHg0MiwgIDB4OTIsICAweDAxLCAgMHhmZSwgIDB4ODIsICAweDE2LCAgMHgwMiwgIDB4MmIsCisgIDB4MDksICAweDQ2LCAgMHgwMSwgIDB4MGUsICAweDA3LCAgMHgwMCwgIDB4NjYsICAweDAxLCAgMHg3MywgIDB4ZmUsICAweDE4LCAgMHgxMCwgIDB4ZmUsICAweDQxLCAgMHg1OCwgIDB4MDksCisgIDB4YTQsICAweDAxLCAgMHgwZSwgIDB4ZmUsICAweGM4LCAgMHg1NCwgIDB4NmIsICAweGZlLCAgMHgxMCwgIDB4MDMsICAweDAxLCAgMHhmZSwgIDB4ODIsICAweDE2LCAgMHgwMiwgIDB4MmIsCisgIDB4MmMsICAweDRmLCAgMHhmZSwgIDB4MDIsICAweGU4LCAgMHgyYSwgIDB4ZmUsICAweGJmLCAgMHg1NywgIDB4ZmUsICAweDllLCAgMHg0MywgIDB4ZmUsICAweDc3LCAgMHg1NywgIDB4ZmUsCisgIDB4MjcsICAweGYwLCAgMHhmZSwgIDB4ZTAsICAweDAxLCAgMHhmZSwgIDB4MDcsICAweDRiLCAgMHhmZSwgIDB4MjAsICAweGYwLCAgMHhhNywgIDB4ZmUsICAweDQwLCAgMHgxYywgIDB4MWMsCisgIDB4ZDksICAweGZlLCAgMHgyNiwgIDB4ZjAsICAweGZlLCAgMHg1YSwgIDB4MDMsICAweGZlLCAgMHhhMCwgIDB4ZjAsICAweGZlLCAgMHg0OCwgIDB4MDMsICAweGZlLCAgMHgxMSwgIDB4ZjAsCisgIDB4YTcsICAweGZlLCAgMHhlZiwgIDB4MTAsICAweGZlLCAgMHg5ZiwgIDB4ZjAsICAweGZlLCAgMHg2OCwgIDB4MDMsICAweGY5LCAgMHgxMCwgIDB4ZmUsICAweDExLCAgMHgwMCwgIDB4MDIsCisgIDB4NjUsICAweDJjLCAgMHhmZSwgIDB4NDgsICAweDFjLCAgMHhmOSwgIDB4MDgsICAweDA1LCAgMHgxYiwgIDB4ZmUsICAweDE4LCAgMHgxMywgIDB4MjEsICAweDIyLCAgMHhhMywgIDB4YjcsCisgIDB4MTMsICAweGEzLCAgMHgwOSwgIDB4NDYsICAweDAxLCAgMHgwZSwgIDB4YjcsICAweDc4LCAgMHgwMSwgIDB4ZmUsICAweGI0LCAgMHgxNiwgIDB4MTIsICAweGQxLCAgMHgxYywgIDB4ZDksCisgIDB4ZmUsICAweDAxLCAgMHhmMCwgIDB4ZDksICAweGZlLCAgMHg4MiwgIDB4ZjAsICAweGZlLCAgMHg5NiwgIDB4MDMsICAweGZhLCAgMHgxMiwgIDB4ZmUsICAweGU0LCAgMHgwMCwgIDB4MjcsCisgIDB4ZmUsICAweGE4LCAgMHgwMywgIDB4MWMsICAweDM0LCAgMHgxZCwgIDB4ZmUsICAweGI4LCAgMHgwMywgIDB4MDEsICAweDRiLCAgMHhmZSwgIDB4MDYsICAweGYwLCAgMHhmZSwgIDB4YzgsCisgIDB4MDMsICAweDk1LCAgMHg4NiwgIDB4ZmUsICAweDBhLCAgMHhmMCwgIDB4ZmUsICAweDhhLCAgMHgwNiwgIDB4MDIsICAweDI0LCAgMHgwMywgIDB4NzAsICAweDI4LCAgMHgxNywgIDB4ZmUsCisgIDB4ZmEsICAweDA0LCAgMHgxNSwgIDB4NmQsICAweDAxLCAgMHgzNiwgIDB4N2IsICAweGZlLCAgMHg2YSwgIDB4MDIsICAweDAyLCAgMHhkOCwgIDB4ZjksICAweDJjLCAgMHg5OSwgIDB4MTksCisgIDB4ZmUsICAweDY3LCAgMHgxYiwgIDB4ZmUsICAweGJmLCAgMHg1NywgIDB4ZmUsICAweDc3LCAgMHg1NywgIDB4ZmUsICAweDQ4LCAgMHgxYywgIDB4NzQsICAweDAxLCAgMHhhZiwgIDB4OGMsCisgIDB4MDksICAweDQ2LCAgMHgwMSwgIDB4MGUsICAweDA3LCAgMHgwMCwgIDB4MTcsICAweGRhLCAgMHgwOSwgIDB4ZDEsICAweDAxLCAgMHgwZSwgIDB4OGQsICAweDUxLCAgMHg2NCwgIDB4NzksCisgIDB4MmEsICAweDAzLCAgMHg3MCwgIDB4MjgsICAweGZlLCAgMHgxMCwgIDB4MTIsICAweDE1LCAgMHg2ZCwgIDB4MDEsICAweDM2LCAgMHg3YiwgIDB4ZmUsICAweDZhLCAgMHgwMiwgIDB4MDIsCisgIDB4ZDgsICAweGM3LCAgMHg4MSwgIDB4YzgsICAweDgzLCAgMHgxYywgIDB4MjQsICAweDI3LCAgMHhmZSwgIDB4NDAsICAweDA0LCAgMHgxZCwgIDB4ZmUsICAweDNjLCAgMHgwNCwgIDB4M2IsCisgIDB4ZmUsICAweGEwLCAgMHgwMCwgIDB4ZmUsICAweDliLCAgMHg1NywgIDB4ZmUsICAweDRlLCAgMHgxMiwgIDB4MmQsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDEwLCAgMHgwMSwgIDB4MGIsCisgIDB4MWQsICAweGZlLCAgMHhlNCwgIDB4MDQsICAweDJkLCAgMHgwMSwgIDB4MGIsICAweDFkLCAgMHgyNCwgIDB4MzMsICAweDMxLCAgMHhkZSwgIDB4ZmUsICAweDRjLCAgMHg0NCwgIDB4ZmUsCisgIDB4NGMsICAweDEyLCAgMHg1MSwgIDB4ZmUsICAweDQ0LCAgMHg0OCwgIDB4MGYsICAweDZmLCAgMHhmZSwgIDB4NGMsICAweDU0LCAgMHg2YiwgIDB4ZGEsICAweDRmLCAgMHg3OSwgIDB4MmEsCisgIDB4ZmUsICAweDA2LCAgMHg4MCwgIDB4ZmUsICAweDQ4LCAgMHg0NywgIDB4ZmUsICAweDYyLCAgMHgxMywgIDB4MDgsICAweDA1LCAgMHgxYiwgIDB4ZmUsICAweDJhLCAgMHgxMywgIDB4MzIsCisgIDB4MDcsICAweDgyLCAgMHhmZSwgIDB4NTIsICAweDEzLCAgMHhmZSwgIDB4MjAsICAweDEwLCAgMHgwZiwgIDB4NmYsICAweGZlLCAgMHg0YywgIDB4NTQsICAweDZiLCAgMHhkYSwgIDB4ZmUsCisgIDB4MDYsICAweDgwLCAgMHhmZSwgIDB4NDgsICAweDQ3LCAgMHhmZSwgIDB4NDAsICAweDEzLCAgMHgwOCwgIDB4MDUsICAweDFiLCAgMHhmZSwgIDB4MDgsICAweDEzLCAgMHgzMiwgIDB4MDcsCisgIDB4ODIsICAweGZlLCAgMHgzMCwgIDB4MTMsICAweDA4LCAgMHgwNSwgIDB4MWIsICAweGZlLCAgMHgxYywgIDB4MTIsICAweDE1LCAgMHg5ZCwgIDB4MDgsICAweDA1LCAgMHgwNiwgIDB4NGQsCisgIDB4MTUsICAweGZlLCAgMHgwZCwgIDB4MDAsICAweDAxLCAgMHgzNiwgIDB4N2IsICAweGZlLCAgMHg2NCwgIDB4MGQsICAweDAyLCAgMHgyNCwgIDB4MmQsICAweDEyLCAgMHhmZSwgIDB4ZTYsCisgIDB4MDAsICAweGZlLCAgMHgxYywgIDB4OTAsICAweGZlLCAgMHg0MCwgIDB4NWMsICAweDA0LCAgMHgxNSwgIDB4OWQsICAweDAxLCAgMHgzNiwgIDB4MDIsICAweDJiLCAgMHhmZSwgIDB4NDIsCisgIDB4NWIsICAweDk5LCAgMHgxOSwgIDB4ZmUsICAweDQ2LCAgMHg1OSwgIDB4ZmUsICAweGJmLCAgMHg1NywgIDB4ZmUsICAweDc3LCAgMHg1NywgIDB4ZmUsICAweDg3LCAgMHg4MCwgIDB4ZmUsCisgIDB4MzEsICAweGU0LCAgMHg1YiwgIDB4MDgsICAweDA1LCAgMHgwYSwgIDB4ZmUsICAweDg0LCAgMHgxMywgIDB4ZmUsICAweDIwLCAgMHg4MCwgIDB4MDcsICAweDE5LCAgMHhmZSwgIDB4N2MsCisgIDB4MTIsICAweDUzLCAgMHgwNSwgIDB4MDYsICAweGZlLCAgMHg2YywgIDB4MTMsICAweDAzLCAgMHhmZSwgIDB4YTIsICAweDAwLCAgMHgyOCwgIDB4MTcsICAweGZlLCAgMHg5MCwgIDB4MDUsCisgIDB4ZmUsICAweDMxLCAgMHhlNCwgIDB4NWEsICAweDUzLCAgMHgwNSwgIDB4MGEsICAweGZlLCAgMHg1NiwgIDB4MTMsICAweDAzLCAgMHhmZSwgIDB4YTAsICAweDAwLCAgMHgyOCwgIDB4ZmUsCisgIDB4NGUsICAweDEyLCAgMHg2NywgIDB4ZmYsICAweDAyLCAgMHgwMCwgIDB4MTAsICAweDI3LCAgMHhmZSwgIDB4NDgsICAweDA1LCAgMHgxYywgIDB4MzQsICAweGZlLCAgMHg4OSwgIDB4NDgsCisgIDB4ZmYsICAweDAyLCAgMHgwMCwgIDB4MTAsICAweDI3LCAgMHhmZSwgIDB4NTYsICAweDA1LCAgMHgyNiwgIDB4ZmUsICAweGE4LCAgMHgwNSwgIDB4MTIsICAweGZlLCAgMHhlMywgIDB4MDAsCisgIDB4MjEsICAweDUzLCAgMHhmZSwgIDB4NGEsICAweGYwLCAgMHhmZSwgIDB4NzYsICAweDA1LCAgMHhmZSwgIDB4NDksICAweGYwLCAgMHhmZSwgIDB4NzAsICAweDA1LCAgMHg4OCwgIDB4MjUsCisgIDB4ZmUsICAweDIxLCAgMHgwMCwgIDB4YWIsICAweDI1LCAgMHhmZSwgIDB4MjIsICAweDAwLCAgMHhhYSwgIDB4MjUsICAweDU4LCAgMHhmZSwgIDB4MDksICAweDQ4LCAgMHhmZiwgIDB4MDIsCisgIDB4MDAsICAweDEwLCAgMHgyNywgIDB4ZmUsICAweDg2LCAgMHgwNSwgIDB4MjYsICAweGZlLCAgMHhhOCwgIDB4MDUsICAweGZlLCAgMHhlMiwgIDB4MDgsICAweDUzLCAgMHgwNSwgIDB4Y2IsCisgIDB4NGQsICAweDAxLCAgMHhiMCwgIDB4MjUsICAweDA2LCAgMHgxMywgIDB4ZDMsICAweDM5LCAgMHhmZSwgIDB4MjcsICAweDAxLCAgMHgwOCwgIDB4MDUsICAweDFiLCAgMHhmZSwgIDB4MjIsCisgIDB4MTIsICAweDQxLCAgMHgwMSwgIDB4YjIsICAweDE1LCAgMHg5ZCwgIDB4MDgsICAweDA1LCAgMHgwNiwgIDB4NGQsICAweDE1LCAgMHhmZSwgIDB4MGQsICAweDAwLCAgMHgwMSwgIDB4MzYsCisgIDB4N2IsICAweGZlLCAgMHg2NCwgIDB4MGQsICAweDAyLCAgMHgyNCwgIDB4MDMsICAweGZlLCAgMHg5YywgIDB4MDAsICAweDI4LCAgMHhlYiwgIDB4MDMsICAweDVjLCAgMHgyOCwgIDB4ZmUsCisgIDB4MzYsICAweDEzLCAgMHg0MSwgIDB4MDEsICAweGIyLCAgMHgyNiwgIDB4ZmUsICAweDE4LCAgMHgwNiwgIDB4MDksICAweDA2LCAgMHg1MywgIDB4MDUsICAweDFmLCAgMHhmZSwgIDB4MDIsCisgIDB4MTIsICAweDUwLCAgMHgwMSwgIDB4ZmUsICAweDllLCAgMHgxNSwgIDB4MWQsICAweGZlLCAgMHgwZSwgIDB4MDYsICAweDEyLCAgMHhhNSwgIDB4MDEsICAweDRiLCAgMHgxMiwgIDB4ZmUsCisgIDB4ZTUsICAweDAwLCAgMHgwMywgIDB4NWMsICAweGMxLCAgMHgwYywgIDB4NWMsICAweDAzLCAgMHhjZCwgIDB4MjgsICAweGZlLCAgMHg2MiwgIDB4MTIsICAweDAzLCAgMHg0NSwgIDB4MjgsCisgIDB4ZmUsICAweDVhLCAgMHgxMywgIDB4MDEsICAweGZlLCAgMHgwYywgIDB4MTksICAweDAxLCAgMHhmZSwgIDB4NzYsICAweDE5LCAgMHhmZSwgIDB4NDMsICAweDQ4LCAgMHhjNCwgIDB4Y2MsCisgIDB4MGYsICAweDcxLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHg1NywgIDB4NTIsICAweDkzLCAgMHgxZSwgIDB4NDMsICAweDhiLCAgMHhjNCwgIDB4NmUsICAweDQxLCAgMHgwMSwgIDB4YjIsCisgIDB4MjYsICAweGZlLCAgMHg4MiwgIDB4MDYsICAweDUzLCAgMHgwNSwgIDB4MWEsICAweGU5LCAgMHg5MSwgIDB4MDksICAweDU5LCAgMHgwMSwgIDB4ZmUsICAweGNjLCAgMHgxNSwgIDB4MWQsCisgIDB4ZmUsICAweDc4LCAgMHgwNiwgIDB4MTIsICAweGE1LCAgMHgwMSwgIDB4NGIsICAweDEyLCAgMHhmZSwgIDB4ZTUsICAweDAwLCAgMHgwMywgIDB4NDUsICAweGMxLCAgMHgwYywgIDB4NDUsCisgIDB4MTgsICAweDA2LCAgMHgwMSwgIDB4YjIsICAweGZhLCAgMHg3NiwgIDB4NzQsICAweDAxLCAgMHhhZiwgIDB4OGMsICAweDEyLCAgMHhmZSwgIDB4ZTIsICAweDAwLCAgMHgyNywgIDB4ZGIsCisgIDB4MWMsICAweDM0LCAgMHhmZSwgIDB4MGEsICAweGYwLCAgMHhmZSwgIDB4YjYsICAweDA2LCAgMHg5NCwgIDB4ZmUsICAweDZjLCAgMHgwNywgIDB4ZmUsICAweDA2LCAgMHhmMCwgIDB4ZmUsCisgIDB4NzQsICAweDA3LCAgMHg5NSwgIDB4ODYsICAweDAyLCAgMHgyNCwgIDB4MDgsICAweDA1LCAgMHgwYSwgIDB4ZmUsICAweDJlLCAgMHgxMiwgIDB4MTYsICAweDE5LCAgMHgwMSwgIDB4MGIsCisgIDB4MTYsICAweDAwLCAgMHgwMSwgIDB4MGIsICAweDE2LCAgMHgwMCwgIDB4MDEsICAweDBiLCAgMHgxNiwgIDB4MDAsICAweDAxLCAgMHgwYiwgIDB4ZmUsICAweDk5LCAgMHhhNCwgIDB4MDEsCisgIDB4MGIsICAweDE2LCAgMHgwMCwgIDB4MDIsICAweGZlLCAgMHg0MiwgIDB4MDgsICAweDY4LCAgMHgwNSwgIDB4MWEsICAweGZlLCAgMHgzOCwgIDB4MTIsICAweDA4LCAgMHgwNSwgIDB4MWEsCisgIDB4ZmUsICAweDMwLCAgMHgxMywgIDB4MTYsICAweGZlLCAgMHgxYiwgIDB4MDAsICAweDAxLCAgMHgwYiwgIDB4MTYsICAweDAwLCAgMHgwMSwgIDB4MGIsICAweDE2LCAgMHgwMCwgIDB4MDEsCisgIDB4MGIsICAweDE2LCAgMHgwMCwgIDB4MDEsICAweDBiLCAgMHgxNiwgIDB4MDYsICAweDAxLCAgMHgwYiwgIDB4MTYsICAweDAwLCAgMHgwMiwgIDB4ZTIsICAweDZjLCAgMHg1OCwgIDB4YmUsCisgIDB4NTAsICAweGZlLCAgMHg5YSwgIDB4ODEsICAweDU1LCAgMHgxYiwgIDB4N2EsICAweGZlLCAgMHg0MiwgIDB4MDcsICAweDA5LCAgMHgxYiwgIDB4ZmUsICAweDA5LCAgMHg2ZiwgIDB4YmEsCisgIDB4ZmUsICAweGNhLCAgMHg0NSwgIDB4ZmUsICAweDMyLCAgMHgxMiwgIDB4NjksICAweDZkLCAgMHg4YiwgIDB4NmMsICAweDdmLCAgMHgyNywgIDB4ZmUsICAweDU0LCAgMHgwNywgIDB4MWMsCisgIDB4MzQsICAweGZlLCAgMHgwYSwgIDB4ZjAsICAweGZlLCAgMHg0MiwgIDB4MDcsICAweDk1LCAgMHg4NiwgIDB4OTQsICAweGZlLCAgMHg2YywgIDB4MDcsICAweDAyLCAgMHgyNCwgIDB4MDEsCisgIDB4NGIsICAweDAyLCAgMHhkYiwgIDB4MTYsICAweDFmLCAgMHgwMiwgIDB4ZGIsICAweGZlLCAgMHg5YywgIDB4ZjcsICAweGRjLCAgMHhmZSwgIDB4MmMsICAweDkwLCAgMHhmZSwgIDB4YWUsCisgIDB4OTAsICAweDU2LCAgMHhmZSwgIDB4ZGEsICAweDA3LCAgMHgwYywgIDB4NjAsICAweDE0LCAgMHg2MSwgIDB4MDgsICAweDU0LCAgMHg1YSwgIDB4MzcsICAweDIyLCAgMHgyMCwgIDB4MDcsCisgIDB4MTEsICAweGZlLCAgMHgwZSwgIDB4MTIsICAweDhkLCAgMHhmZSwgIDB4ODAsICAweDgwLCAgMHgzOSwgIDB4MjAsICAweDZhLCAgMHgyYSwgIDB4ZmUsICAweDA2LCAgMHgxMCwgIDB4ZmUsCisgIDB4ODMsICAweGU3LCAgMHhmZSwgIDB4NDgsICAweDAwLCAgMHhhYiwgIDB4ZmUsICAweDAzLCAgMHg0MCwgIDB4MDgsICAweDU0LCAgMHg1YiwgIDB4MzcsICAweDAxLCAgMHhiMywgIDB4YjgsCisgIDB4ZmUsICAweDFmLCAgMHg0MCwgIDB4MTMsICAweDYyLCAgMHgwMSwgIDB4ZWYsICAweGZlLCAgMHgwOCwgIDB4NTAsICAweGZlLCAgMHg4YSwgIDB4NTAsICAweGZlLCAgMHg0NCwgIDB4NTEsCisgIDB4ZmUsICAweGM2LCAgMHg1MSwgIDB4ODgsICAweGZlLCAgMHgwOCwgIDB4OTAsICAweGZlLCAgMHg4YSwgIDB4OTAsICAweDBjLCAgMHg1ZSwgIDB4MTQsICAweDVmLCAgMHhmZSwgIDB4MGMsCisgIDB4OTAsICAweGZlLCAgMHg4ZSwgIDB4OTAsICAweGZlLCAgMHg0MCwgIDB4NTAsICAweGZlLCAgMHhjMiwgIDB4NTAsICAweDBjLCAgMHgzZCwgIDB4MTQsICAweDNlLCAgMHhmZSwgIDB4NGEsCisgIDB4MTAsICAweDA4LCAgMHgwNSwgIDB4NWEsICAweGZlLCAgMHgyYSwgIDB4MTIsICAweGZlLCAgMHgyYywgIDB4OTAsICAweGZlLCAgMHhhZSwgIDB4OTAsICAweDBjLCAgMHg2MCwgIDB4MTQsCisgIDB4NjEsICAweDA4LCAgMHgwNSwgIDB4NWIsICAweDhiLCAgMHgwMSwgIDB4YjMsICAweGZlLCAgMHgxZiwgIDB4ODAsICAweDEzLCAgMHg2MiwgIDB4ZmUsICAweDQ0LCAgMHg5MCwgIDB4ZmUsCisgIDB4YzYsICAweDkwLCAgMHgwYywgIDB4M2YsICAweDE0LCAgMHg0MCwgIDB4ZmUsICAweDA4LCAgMHg5MCwgIDB4ZmUsICAweDhhLCAgMHg5MCwgIDB4MGMsICAweDVlLCAgMHgxNCwgIDB4NWYsCisgIDB4ZmUsICAweDQwLCAgMHg5MCwgIDB4ZmUsICAweGMyLCAgMHg5MCwgIDB4MGMsICAweDNkLCAgMHgxNCwgIDB4M2UsICAweDBjLCAgMHgyZSwgIDB4MTQsICAweDNjLCAgMHgyMSwgIDB4MGMsCisgIDB4NDksICAweDBjLCAgMHg2MywgIDB4MDgsICAweDU0LCAgMHgxZiwgIDB4MzcsICAweDJjLCAgMHgwZiwgIDB4ZmUsICAweDRlLCAgMHgxMSwgIDB4MjcsICAweGRkLCAgMHhmZSwgIDB4OWUsCisgIDB4ZjAsICAweGZlLCAgMHg3NiwgIDB4MDgsICAweGJjLCAgMHgxNywgIDB4MzQsICAweDJjLCAgMHg3NywgIDB4ZTYsICAweGM1LCAgMHhmZSwgIDB4OWEsICAweDA4LCAgMHhjNiwgIDB4ZmUsCisgIDB4YjgsICAweDA4LCAgMHg5NCwgIDB4ZmUsICAweDhlLCAgMHgwOCwgIDB4ZmUsICAweDA2LCAgMHhmMCwgIDB4ZmUsICAweDk0LCAgMHgwOCwgIDB4OTUsICAweDg2LCAgMHgwMiwgIDB4MjQsCisgIDB4MDEsICAweDRiLCAgMHhmZSwgIDB4YzksICAweDEwLCAgMHgxNiwgIDB4MWYsICAweGZlLCAgMHhjOSwgIDB4MTAsICAweDY4LCAgMHgwNSwgIDB4MDYsICAweGZlLCAgMHgxMCwgIDB4MTIsCisgIDB4NjgsICAweDA1LCAgMHgwYSwgIDB4NGUsICAweDA4LCAgMHgwNSwgIDB4MGEsICAweGZlLCAgMHg5MCwgIDB4MTIsICAweGZlLCAgMHgyZSwgIDB4MWMsICAweDAyLCAgMHhmZSwgIDB4MTgsCisgIDB4MGIsICAweDY4LCAgMHgwNSwgIDB4MDYsICAweDRlLCAgMHg2OCwgIDB4MDUsICAweDBhLCAgMHhmZSwgIDB4N2EsICAweDEyLCAgMHhmZSwgIDB4MmMsICAweDFjLCAgMHhmZSwgIDB4YWEsCisgIDB4ZjAsICAweGZlLCAgMHhkMiwgIDB4MDksICAweGZlLCAgMHhhYywgIDB4ZjAsICAweGZlLCAgMHgwMCwgIDB4MDksICAweDAyLCAgMHhmZSwgIDB4ZGUsICAweDA5LCAgMHhmZSwgIDB4YjcsCisgIDB4ZjAsICAweGZlLCAgMHhmYywgIDB4MDgsICAweGZlLCAgMHgwMiwgIDB4ZjYsICAweDFhLCAgMHg1MCwgIDB4ZmUsICAweDcwLCAgMHgxOCwgIDB4ZmUsICAweGYxLCAgMHgxOCwgIDB4ZmUsCisgIDB4NDAsICAweDU1LCAgMHhmZSwgIDB4ZTEsICAweDU1LCAgMHhmZSwgIDB4MTAsICAweDU4LCAgMHhmZSwgIDB4OTEsICAweDU4LCAgMHhmZSwgIDB4MTQsICAweDU5LCAgMHhmZSwgIDB4OTUsCisgIDB4NTksICAweDFjLCAgMHg4NSwgIDB4ZmUsICAweDhjLCAgMHhmMCwgIDB4ZmUsICAweGZjLCAgMHgwOCwgIDB4ZmUsICAweGFjLCAgMHhmMCwgIDB4ZmUsICAweGYwLCAgMHgwOCwgIDB4YjUsCisgIDB4ZmUsICAweGNiLCAgMHgxMCwgIDB4ZmUsICAweGFkLCAgMHhmMCwgIDB4ZmUsICAweDBjLCAgMHgwOSwgIDB4MDIsICAweGZlLCAgMHgxOCwgIDB4MGIsICAweGI2LCAgMHhmZSwgIDB4YmYsCisgIDB4MTAsICAweGZlLCAgMHgyYiwgIDB4ZjAsICAweDg1LCAgMHhmNCwgIDB4MWUsICAweGZlLCAgMHgwMCwgIDB4ZmUsICAweGZlLCAgMHgxYywgIDB4MTIsICAweGMyLCAgMHhmZSwgIDB4ZDIsCisgIDB4ZjAsICAweDg1LCAgMHhmZSwgIDB4NzYsICAweDE4LCAgMHgxZSwgIDB4MTksICAweDE3LCAgMHg4NSwgIDB4MDMsICAweGQyLCAgMHgxZSwgIDB4MDYsICAweDE3LCAgMHg4NSwgIDB4YzUsCisgIDB4NGEsICAweGM2LCAgMHg0YSwgIDB4YjUsICAweGI2LCAgMHhmZSwgIDB4ODksICAweDEwLCAgMHg3NCwgIDB4NjcsICAweDJkLCAgMHgxNSwgIDB4OWQsICAweDAxLCAgMHgzNiwgIDB4MTAsCisgIDB4ZmUsICAweDM1LCAgMHgwMCwgIDB4ZmUsICAweDAxLCAgMHhmMCwgIDB4NjUsICAweDEwLCAgMHg4MCwgIDB4MDIsICAweDY1LCAgMHhmZSwgIDB4OTgsICAweDgwLCAgMHhmZSwgIDB4MTksCisgIDB4ZTQsICAweDBhLCAgMHhmZSwgIDB4MWEsICAweDEyLCAgMHg1MSwgIDB4ZmUsICAweDE5LCAgMHg4MiwgIDB4ZmUsICAweDZjLCAgMHgxOCwgIDB4ZmUsICAweDQ0LCAgMHg1NCwgIDB4YmUsCisgIDB4ZmUsICAweDE5LCAgMHg4MSwgIDB4ZmUsICAweDc0LCAgMHgxOCwgIDB4OGYsICAweDkwLCAgMHgxNywgIDB4ZmUsICAweGNlLCAgMHgwOCwgIDB4MDIsICAweDRhLCAgMHgwOCwgIDB4MDUsCisgIDB4NWEsICAweGVjLCAgMHgwMywgIDB4MmUsICAweDI5LCAgMHgzYywgIDB4MGMsICAweDNmLCAgMHgxNCwgIDB4NDAsICAweDliLCAgMHgyZSwgIDB4OWMsICAweDNjLCAgMHhmZSwgIDB4NmMsCisgIDB4MTgsICAweGZlLCAgMHhlZCwgIDB4MTgsICAweGZlLCAgMHg0NCwgIDB4NTQsICAweGZlLCAgMHhlNSwgIDB4NTQsICAweDNhLCAgMHgzZiwgIDB4M2IsICAweDQwLCAgMHgwMywgIDB4NDksCisgIDB4MjksICAweDYzLCAgMHg4ZiwgIDB4ZmUsICAweGUzLCAgMHg1NCwgIDB4ZmUsICAweDc0LCAgMHgxOCwgIDB4ZmUsICAweGY1LCAgMHgxOCwgIDB4OGYsICAweGZlLCAgMHhlMywgIDB4NTQsCisgIDB4OTAsICAweGMwLCAgMHg1NiwgIDB4ZmUsICAweGNlLCAgMHgwOCwgIDB4MDIsICAweDRhLCAgMHhmZSwgIDB4MzcsICAweGYwLCAgMHhmZSwgIDB4ZGEsICAweDA5LCAgMHhmZSwgIDB4OGIsCisgIDB4ZjAsICAweGZlLCAgMHg2MCwgIDB4MDksICAweDAyLCAgMHg0YSwgIDB4MDgsICAweDA1LCAgMHgwYSwgIDB4MjMsICAweGZlLCAgMHhmYSwgIDB4MGEsICAweDNhLCAgMHg0OSwgIDB4M2IsCisgIDB4NjMsICAweDU2LCAgMHhmZSwgIDB4M2UsICAweDBhLCAgMHgwZiwgIDB4ZmUsICAweGMwLCAgMHgwNywgIDB4NDEsICAweDk4LCAgMHgwMCwgIDB4YWQsICAweGZlLCAgMHgwMSwgIDB4NTksCisgIDB4ZmUsICAweDUyLCAgMHhmMCwgIDB4ZmUsICAweDBjLCAgMHgwYSwgIDB4OGYsICAweDdhLCAgMHhmZSwgIDB4MjQsICAweDBhLCAgMHgzYSwgIDB4NDksICAweDhmLCAgMHhmZSwgIDB4ZTMsCisgIDB4NTQsICAweDU3LCAgMHg0OSwgIDB4N2QsICAweDYzLCAgMHhmZSwgIDB4MTQsICAweDU4LCAgMHhmZSwgIDB4OTUsICAweDU4LCAgMHgwMiwgIDB4NGEsICAweDNhLCAgMHg0OSwgIDB4M2IsCisgIDB4NjMsICAweGZlLCAgMHgxNCwgIDB4NTksICAweGZlLCAgMHg5NSwgIDB4NTksICAweGJlLCAgMHg1NywgIDB4NDksICAweDU3LCAgMHg2MywgIDB4MDIsICAweDRhLCAgMHgwOCwgIDB4MDUsCisgIDB4NWEsICAweGZlLCAgMHg4MiwgIDB4MTIsICAweDA4LCAgMHgwNSwgIDB4MWYsICAweGZlLCAgMHg2NiwgIDB4MTMsICAweDIyLCAgMHg2MiwgIDB4YjcsICAweGZlLCAgMHgwMywgIDB4YTEsCisgIDB4ZmUsICAweDgzLCAgMHg4MCwgIDB4ZmUsICAweGM4LCAgMHg0NCwgIDB4ZmUsICAweDJlLCAgMHgxMywgIDB4ZmUsICAweDA0LCAgMHg5MSwgIDB4ZmUsICAweDg2LCAgMHg5MSwgIDB4NmEsCisgIDB4MmEsICAweGZlLCAgMHg0MCwgIDB4NTksICAweGZlLCAgMHhjMSwgIDB4NTksICAweDU2LCAgMHhlMCwgIDB4MDMsICAweDYwLCAgMHgyOSwgIDB4NjEsICAweDBjLCAgMHg3ZiwgIDB4MTQsCisgIDB4ODAsICAweDU3LCAgMHg2MCwgIDB4N2QsICAweDYxLCAgMHgwMSwgIDB4YjMsICAweGI4LCAgMHg2YSwgIDB4MmEsICAweDEzLCAgMHg2MiwgIDB4OWIsICAweDJlLCAgMHg5YywgIDB4M2MsCisgIDB4M2EsICAweDNmLCAgMHgzYiwgIDB4NDAsICAweDkwLCAgMHhjMCwgIDB4ZmUsICAweDA0LCAgMHhmYSwgIDB4MmUsICAweGZlLCAgMHgwNSwgIDB4ZmEsICAweDNjLCAgMHgwMSwgIDB4ZWYsCisgIDB4ZmUsICAweDM2LCAgMHgxMCwgIDB4MjEsICAweDBjLCAgMHg3ZiwgIDB4MGMsICAweDgwLCAgMHgzYSwgIDB4M2YsICAweDNiLCAgMHg0MCwgIDB4ZTQsICAweDA4LCAgMHgwNSwgIDB4MWYsCisgIDB4MTcsICAweGUwLCAgMHgzYSwgIDB4M2QsICAweDNiLCAgMHgzZSwgIDB4MDgsICAweDA1LCAgMHhmZSwgIDB4ZjcsICAweDAwLCAgMHgzNywgIDB4MDMsICAweDVlLCAgMHgyOSwgIDB4NWYsCisgIDB4ZmUsICAweDEwLCAgMHg1OCwgIDB4ZmUsICAweDkxLCAgMHg1OCwgIDB4NTcsICAweDQ5LCAgMHg3ZCwgIDB4NjMsICAweDAyLCAgMHhmZSwgIDB4ZjQsICAweDA5LCAgMHgwOCwgIDB4MDUsCisgIDB4MWYsICAweDE3LCAgMHhlMCwgIDB4MDgsICAweDA1LCAgMHhmZSwgIDB4ZjcsICAweDAwLCAgMHgzNywgIDB4YmUsICAweGZlLCAgMHgxOSwgIDB4ODEsICAweDUwLCAgMHhmZSwgIDB4MTAsCisgIDB4OTAsICAweGZlLCAgMHg5MiwgIDB4OTAsICAweGZlLCAgMHhkMywgIDB4MTAsICAweDMyLCAgMHgwNywgIDB4YTYsICAweDE3LCAgMHhmZSwgIDB4MDgsICAweDA5LCAgMHgxMiwgIDB4YTYsCisgIDB4MDgsICAweDA1LCAgMHgwYSwgIDB4ZmUsICAweDE0LCAgMHgxMywgIDB4MDMsICAweDNkLCAgMHgyOSwgIDB4M2UsICAweDU2LCAgMHhmZSwgIDB4MDgsICAweDA5LCAgMHhmZSwgIDB4MGMsCisgIDB4NTgsICAweGZlLCAgMHg4ZCwgIDB4NTgsICAweDAyLCAgMHg0YSwgIDB4MjEsICAweDQxLCAgMHhmZSwgIDB4MTksICAweDgwLCAgMHhlNywgIDB4MDgsICAweDA1LCAgMHgwYSwgIDB4ZmUsCisgIDB4MWEsICAweDEyLCAgMHhmZSwgIDB4NmMsICAweDE5LCAgMHhmZSwgIDB4MTksICAweDQxLCAgMHhmNCwgIDB4YzIsICAweGZlLCAgMHhkMSwgIDB4ZjAsICAweGUyLCAgMHgxNSwgIDB4N2UsCisgIDB4MDEsICAweDM2LCAgMHgxMCwgIDB4ZmUsICAweDQ0LCAgMHgwMCwgIDB4ZmUsICAweDhlLCAgMHgxMCwgIDB4ZmUsICAweDZjLCAgMHgxOSwgIDB4NTcsICAweDNkLCAgMHhmZSwgIDB4ZWQsCisgIDB4MTksICAweDdkLCAgMHgzZSwgIDB4ZmUsICAweDBjLCAgMHg1MSwgIDB4ZmUsICAweDhlLCAgMHg1MSwgIDB4ZjQsICAweDFlLCAgMHhmZSwgIDB4MDAsICAweGZmLCAgMHgzNSwgIDB4ZmUsCisgIDB4NzQsICAweDEwLCAgMHhjMiwgIDB4ZmUsICAweGQyLCAgMHhmMCwgIDB4ZmUsICAweGE2LCAgMHgwYiwgIDB4ZmUsICAweDc2LCAgMHgxOCwgIDB4MWUsICAweDE5LCAgMHg4YSwgIDB4MDMsCisgIDB4ZDIsICAweDFlLCAgMHgwNiwgIDB4ZmUsICAweDA4LCAgMHgxMywgIDB4MTAsICAweGZlLCAgMHgxNiwgIDB4MDAsICAweDAyLCAgMHg2NSwgIDB4ZmUsICAweGQxLCAgMHhmMCwgIDB4ZmUsCisgIDB4YjgsICAweDBiLCAgMHgxNSwgIDB4N2UsICAweDAxLCAgMHgzNiwgIDB4MTAsICAweGZlLCAgMHgxNywgIDB4MDAsICAweGZlLCAgMHg0MiwgIDB4MTAsICAweGZlLCAgMHhjZSwgIDB4ZjAsCisgIDB4ZmUsICAweGJlLCAgMHgwYiwgIDB4ZmUsICAweDNjLCAgMHgxMCwgIDB4ZmUsICAweGNkLCAgMHhmMCwgIDB4ZmUsICAweGNhLCAgMHgwYiwgIDB4MTAsICAweGZlLCAgMHgyMiwgIDB4MDAsCisgIDB4MDIsICAweDY1LCAgMHhmZSwgIDB4Y2IsICAweGYwLCAgMHhmZSwgIDB4ZDYsICAweDBiLCAgMHgxMCwgIDB4ZmUsICAweDI0LCAgMHgwMCwgIDB4MDIsICAweDY1LCAgMHhmZSwgIDB4ZDAsCisgIDB4ZjAsICAweGZlLCAgMHhlMCwgIDB4MGIsICAweDEwLCAgMHg5ZSwgIDB4ZTUsICAweGZlLCAgMHhjZiwgIDB4ZjAsICAweGZlLCAgMHhlYSwgIDB4MGIsICAweDEwLCAgMHg1OCwgIDB4ZmUsCisgIDB4MTAsICAweDEwLCAgMHhmZSwgIDB4Y2MsICAweGYwLCAgMHhlMiwgIDB4NjgsICAweDA1LCAgMHgxZiwgIDB4NGQsICAweDEwLCAgMHhmZSwgIDB4MTIsICAweDAwLCAgMHgyYywgIDB4MGYsCisgIDB4ZmUsICAweDRlLCAgMHgxMSwgIDB4MjcsICAweGZlLCAgMHgwMCwgIDB4MGMsICAweGZlLCAgMHg5ZSwgIDB4ZjAsICAweGZlLCAgMHgxNCwgIDB4MGMsICAweGJjLCAgMHgxNywgIDB4MzQsCisgIDB4MmMsICAweDc3LCAgMHhlNiwgIDB4YzUsICAweDI0LCAgMHhjNiwgIDB4MjQsICAweDJjLCAgMHhmYSwgIDB4MjcsICAweGZlLCAgMHgyMCwgIDB4MGMsICAweDFjLCAgMHgzNCwgIDB4OTQsCisgIDB4ZmUsICAweDNjLCAgMHgwYywgIDB4OTUsICAweDg2LCAgMHhjNSwgIDB4ZGMsICAweGM2LCAgMHhkYywgIDB4MDIsICAweDI0LCAgMHgwMSwgIDB4NGIsICAweGZlLCAgMHhkYiwgIDB4MTAsCisgIDB4MTIsICAweGZlLCAgMHhlOCwgIDB4MDAsICAweGI1LCAgMHhiNiwgIDB4NzQsICAweGM3LCAgMHg4MSwgIDB4YzgsICAweDgzLCAgMHhmZSwgIDB4ODksICAweGYwLCAgMHgyNCwgIDB4MzMsCisgIDB4MzEsICAweGUxLCAgMHhjNywgIDB4ODEsICAweGM4LCAgMHg4MywgIDB4MjcsICAweGZlLCAgMHg2NiwgIDB4MGMsICAweDFkLCAgMHgyNCwgIDB4MzMsICAweDMxLCAgMHhkZiwgIDB4YmMsCisgIDB4NGUsICAweDEwLCAgMHhmZSwgIDB4NDIsICAweDAwLCAgMHgwMiwgIDB4NjUsICAweDdjLCAgMHgwNiwgIDB4ZmUsICAweDgxLCAgMHg0OSwgIDB4MTcsICAweGZlLCAgMHgyYywgIDB4MGQsCisgIDB4MDgsICAweDA1LCAgMHgwYSwgIDB4ZmUsICAweDQ0LCAgMHgxMywgIDB4MTAsICAweDAwLCAgMHg1NSwgIDB4MGEsICAweGZlLCAgMHg1NCwgIDB4MTIsICAweDU1LCAgMHhmZSwgIDB4MjgsCisgIDB4MDAsICAweDIzLCAgMHhmZSwgIDB4OWEsICAweDBkLCAgMHgwOSwgIDB4NDYsICAweDAxLCAgMHgwZSwgIDB4MDcsICAweDAwLCAgMHg2NiwgIDB4NDQsICAweGZlLCAgMHgyOCwgIDB4MDAsCisgIDB4ZmUsICAweGUyLCAgMHgxMCwgIDB4MDEsICAweGY1LCAgMHgwMSwgIDB4ZjYsICAweDA5LCAgMHhhNCwgIDB4MDEsICAweGZlLCAgMHgyNiwgIDB4MGYsICAweDY0LCAgMHgxMiwgIDB4MmYsCisgIDB4MDEsICAweDczLCAgMHgwMiwgIDB4MmIsICAweDEwLCAgMHhmZSwgIDB4NDQsICAweDAwLCAgMHg1NSwgIDB4MGEsICAweGU5LCAgMHg0NCwgIDB4MGEsICAweGZlLCAgMHhiNCwgIDB4MTAsCisgIDB4MDEsICAweGIwLCAgMHg0NCwgIDB4MGEsICAweGZlLCAgMHhhYSwgIDB4MTAsICAweDAxLCAgMHhiMCwgIDB4ZmUsICAweDE5LCAgMHg4MiwgIDB4ZmUsICAweDM0LCAgMHg0NiwgIDB4YWMsCisgIDB4NDQsICAweDBhLCAgMHgxMCwgIDB4ZmUsICAweDQzLCAgMHgwMCwgIDB4ZmUsICAweDk2LCAgMHgxMCwgIDB4MDgsICAweDU0LCAgMHgwYSwgIDB4MzcsICAweDAxLCAgMHhmNSwgIDB4MDEsCisgIDB4ZjYsICAweDY0LCAgMHgxMiwgIDB4MmYsICAweDAxLCAgMHg3MywgIDB4OTksICAweDBhLCAgMHg2NCwgIDB4NDIsICAweDkyLCAgMHgwMiwgIDB4ZmUsICAweDJlLCAgMHgwMywgIDB4MDgsCisgIDB4MDUsICAweDBhLCAgMHg4YSwgIDB4NDQsICAweDBhLCAgMHgxMCwgIDB4MDAsICAweGZlLCAgMHg1YywgIDB4MTAsICAweDY4LCAgMHgwNSwgIDB4MWEsICAweGZlLCAgMHg1OCwgIDB4MTIsCisgIDB4MDgsICAweDA1LCAgMHgxYSwgIDB4ZmUsICAweDUwLCAgMHgxMywgIDB4ZmUsICAweDFjLCAgMHgxYywgIDB4ZmUsICAweDlkLCAgMHhmMCwgIDB4ZmUsICAweDUwLCAgMHgwZCwgIDB4ZmUsCisgIDB4MWMsICAweDFjLCAgMHhmZSwgIDB4OWQsICAweGYwLCAgMHhmZSwgIDB4NTYsICAweDBkLCAgMHgwOCwgIDB4NTQsICAweDFhLCAgMHgzNywgIDB4ZmUsICAweGE5LCAgMHgxMCwgIDB4MTAsCisgIDB4ZmUsICAweDE1LCAgMHgwMCwgIDB4ZmUsICAweDA0LCAgMHhlNiwgIDB4MGEsICAweDUwLCAgMHhmZSwgIDB4MmUsICAweDEwLCAgMHgxMCwgIDB4ZmUsICAweDEzLCAgMHgwMCwgIDB4ZmUsCisgIDB4MTAsICAweDEwLCAgMHgxMCwgIDB4NmYsICAweGFiLCAgMHgxMCwgIDB4ZmUsICAweDQxLCAgMHgwMCwgIDB4YWEsICAweDEwLCAgMHhmZSwgIDB4MjQsICAweDAwLCAgMHg4YywgIDB4YjUsCisgIDB4YjYsICAweDc0LCAgMHgwMywgIDB4NzAsICAweDI4LCAgMHgyMywgIDB4ZDgsICAweDUwLCAgMHhmZSwgIDB4MDQsICAweGU2LCAgMHgxYSwgIDB4ZmUsICAweDlkLCAgMHg0MSwgIDB4ZmUsCisgIDB4MWMsICAweDQyLCAgMHg2NCwgIDB4MDEsICAweGUzLCAgMHgwMiwgIDB4MmIsICAweGY4LCAgMHgxNSwgIDB4MGEsICAweDM5LCAgMHhhMCwgIDB4YjQsICAweDE1LCAgMHhmZSwgIDB4MzEsCisgIDB4MDAsICAweDM5LCAgMHhhMiwgIDB4MDEsICAweGZlLCAgMHg0OCwgIDB4MTAsICAweDAyLCAgMHhkNywgIDB4NDIsICAweGZlLCAgMHgwNiwgIDB4ZWMsICAweGQwLCAgMHhmYywgIDB4NDQsCisgIDB4MWIsICAweGZlLCAgMHhjZSwgIDB4NDUsICAweDM1LCAgMHg0MiwgIDB4ZmUsICAweDA2LCAgMHhlYSwgIDB4ZDAsICAweGZlLCAgMHg0NywgIDB4NGIsICAweDkxLCAgMHhmZSwgIDB4NzUsCisgIDB4NTcsICAweDAzLCAgMHg1ZCwgIDB4ZmUsICAweDk4LCAgMHg1NiwgIDB4ZmUsICAweDM4LCAgMHgxMiwgIDB4MDksICAweDQ4LCAgMHgwMSwgIDB4MGUsICAweGZlLCAgMHg0NCwgIDB4NDgsCisgIDB4NGYsICAweDA4LCAgMHgwNSwgIDB4MWIsICAweGZlLCAgMHgxYSwgIDB4MTMsICAweDA5LCAgMHg0NiwgIDB4MDEsICAweDBlLCAgMHg0MSwgIDB4ZmUsICAweDQxLCAgMHg1OCwgIDB4MDksCisgIDB4YTQsICAweDAxLCAgMHgwZSwgIDB4ZmUsICAweDQ5LCAgMHg1NCwgIDB4OTYsICAweGZlLCAgMHgxZSwgIDB4MGUsICAweDAyLCAgMHhmZSwgIDB4MmUsICAweDAzLCAgMHgwOSwgIDB4NWQsCisgIDB4ZmUsICAweGVlLCAgMHgxNCwgIDB4ZmMsICAweDQ0LCAgMHgxYiwgIDB4ZmUsICAweGNlLCAgMHg0NSwgIDB4MzUsICAweDQyLCAgMHhmZSwgIDB4Y2UsICAweDQ3LCAgMHhmZSwgIDB4YWQsCisgIDB4MTMsICAweDAyLCAgMHgyYiwgIDB4MjIsICAweDIwLCAgMHgwNywgIDB4MTEsICAweGZlLCAgMHg5ZSwgIDB4MTIsICAweDIxLCAgMHgxMywgIDB4NTksICAweDEzLCAgMHg5ZiwgIDB4MTMsCisgIDB4ZDUsICAweDIyLCAgMHgyZiwgIDB4NDEsICAweDM5LCAgMHgyZiwgIDB4YmMsICAweGFkLCAgMHhmZSwgIDB4YmMsICAweGYwLCAgMHhmZSwgIDB4ZTAsICAweDBlLCAgMHgwZiwgIDB4MDYsCisgIDB4MTMsICAweDU5LCAgMHgwMSwgIDB4ZmUsICAweGRhLCAgMHgxNiwgIDB4MDMsICAweGZlLCAgMHgzOCwgIDB4MDEsICAweDI5LCAgMHhmZSwgIDB4M2EsICAweDAxLCAgMHg1NiwgIDB4ZmUsCisgIDB4ZTQsICAweDBlLCAgMHhmZSwgIDB4MDIsICAweGVjLCAgMHhkNSwgIDB4NjksICAweDAwLCAgMHg2NiwgIDB4ZmUsICAweDA0LCAgMHhlYywgIDB4MjAsICAweDRmLCAgMHhmZSwgIDB4MDUsCisgIDB4ZjYsICAweGZlLCAgMHgzNCwgIDB4MDEsICAweDAxLCAgMHhmZSwgIDB4NGEsICAweDE3LCAgMHhmZSwgIDB4MDgsICAweDkwLCAgMHhmZSwgIDB4NDgsICAweGY0LCAgMHgwZCwgIDB4ZmUsCisgIDB4MTgsICAweDEzLCAgMHhiYSwgIDB4ZmUsICAweDAyLCAgMHhlYSwgIDB4ZDUsICAweDY5LCAgMHg3ZSwgIDB4ZmUsICAweGM1LCAgMHgxMywgIDB4MTUsICAweDFhLCAgMHgzOSwgIDB4YTAsCisgIDB4YjQsICAweGZlLCAgMHgyZSwgIDB4MTAsICAweDAzLCAgMHhmZSwgIDB4MzgsICAweDAxLCAgMHgxZSwgIDB4ZmUsICAweGYwLCAgMHhmZiwgIDB4MGMsICAweGZlLCAgMHg2MCwgIDB4MDEsCisgIDB4MDMsICAweGZlLCAgMHgzYSwgIDB4MDEsICAweDBjLCAgMHhmZSwgIDB4NjIsICAweDAxLCAgMHg0MywgIDB4MTMsICAweDIwLCAgMHgyNSwgIDB4MDYsICAweDEzLCAgMHgyZiwgIDB4MTIsCisgIDB4MmYsICAweDkyLCAgMHgwZiwgIDB4MDYsICAweDA0LCAgMHgyMSwgIDB4MDQsICAweDIyLCAgMHg1OSwgIDB4ZmUsICAweGY3LCAgMHgxMiwgIDB4MjIsICAweDlmLCAgMHhiNywgIDB4MTMsCisgIDB4OWYsICAweDA3LCAgMHg3ZSwgIDB4ZmUsICAweDcxLCAgMHgxMywgIDB4ZmUsICAweDI0LCAgMHgxYywgIDB4MTUsICAweDE5LCAgMHgzOSwgIDB4YTAsICAweGI0LCAgMHhmZSwgIDB4ZDksCisgIDB4MTAsICAweGMzLCAgMHhmZSwgIDB4MDMsICAweGRjLCAgMHhmZSwgIDB4NzMsICAweDU3LCAgMHhmZSwgIDB4ODAsICAweDVkLCAgMHgwNCwgIDB4YzMsICAweGZlLCAgMHgwMywgIDB4ZGMsCisgIDB4ZmUsICAweDViLCAgMHg1NywgIDB4ZmUsICAweDgwLCAgMHg1ZCwgIDB4MDQsICAweGZlLCAgMHgwMywgIDB4NTcsICAweGMzLCAgMHgyMSwgIDB4ZmUsICAweDAwLCAgMHhjYywgIDB4MDQsCisgIDB4ZmUsICAweDAzLCAgMHg1NywgIDB4YzMsICAweDc4LCAgMHgwNCwgIDB4MDgsICAweDA1LCAgMHg1OCwgIDB4ZmUsICAweDIyLCAgMHgxMywgIDB4ZmUsICAweDFjLCAgMHg4MCwgIDB4MDcsCisgIDB4MDYsICAweGZlLCAgMHgxYSwgIDB4MTMsICAweGZlLCAgMHgxZSwgIDB4ODAsICAweGVkLCAgMHhmZSwgIDB4MWQsICAweDgwLCAgMHhhZSwgIDB4ZmUsICAweDBjLCAgMHg5MCwgIDB4ZmUsCisgIDB4MGUsICAweDEzLCAgMHhmZSwgIDB4MGUsICAweDkwLCAgMHhhYywgIDB4ZmUsICAweDNjLCAgMHg5MCwgIDB4ZmUsICAweDMwLCAgMHhmNCwgIDB4MGEsICAweGZlLCAgMHgzYywgIDB4NTAsCisgIDB4YWEsICAweDAxLCAgMHhmZSwgIDB4N2EsICAweDE3LCAgMHgzMiwgIDB4MDcsICAweDJmLCAgMHhhZCwgIDB4MDEsICAweGZlLCAgMHhiNCwgIDB4MTYsICAweDA4LCAgMHgwNSwgIDB4MWIsCisgIDB4NGUsICAweDAxLCAgMHhmNSwgIDB4MDEsICAweGY2LCAgMHgxMiwgIDB4ZmUsICAweGU5LCAgMHgwMCwgIDB4MDgsICAweDA1LCAgMHg1OCwgIDB4ZmUsICAweDJjLCAgMHgxMywgIDB4MDEsCisgIDB4ZmUsICAweDBjLCAgMHgxNywgIDB4ZmUsICAweDFlLCAgMHgxYywgIDB4ZmUsICAweDE0LCAgMHg5MCwgIDB4ZmUsICAweDk2LCAgMHg5MCwgIDB4MGMsICAweGZlLCAgMHg2NCwgIDB4MDEsCisgIDB4MTQsICAweGZlLCAgMHg2NiwgIDB4MDEsICAweDA4LCAgMHgwNSwgIDB4NWIsICAweGZlLCAgMHgxMiwgIDB4MTIsICAweGZlLCAgMHgwMywgIDB4ODAsICAweDhkLCAgMHhmZSwgIDB4MDEsCisgIDB4ZWMsICAweDIwLCAgMHhmZSwgIDB4ODAsICAweDQwLCAgMHgxMywgIDB4MjAsICAweDZhLCAgMHgyYSwgIDB4MTIsICAweGNmLCAgMHg2NCwgIDB4MjIsICAweDIwLCAgMHhmYiwgIDB4NzksCisgIDB4MjAsICAweDA0LCAgMHhmZSwgIDB4MDgsICAweDFjLCAgMHgwMywgIDB4ZmUsICAweGFjLCAgMHgwMCwgIDB4ZmUsICAweDA2LCAgMHg1OCwgIDB4MDMsICAweGZlLCAgMHhhZSwgIDB4MDAsCisKKyAgMHhmZSwgIDB4MDcsICAweDU4LCAgMHgwMywgIDB4ZmUsICAweGIwLCAgMHgwMCwgIDB4ZmUsICAweDA4LCAgMHg1OCwgIDB4MDMsICAweGZlLCAgMHhiMiwgIDB4MDAsICAweGZlLCAgMHgwOSwKKyAgMHg1OCwgIDB4ZmUsICAweDBhLCAgMHgxYywgIDB4MjUsICAweDZlLCAgMHgxMywgIDB4ZDAsICAweDIxLCAgMHgwYywgIDB4NWMsICAweDBjLCAgMHg0NSwgIDB4MGYsICAweDQ2LCAgMHg1MiwKKyAgMHg1MCwgIDB4MTgsICAweDFiLCAgMHhmZSwgIDB4OTAsICAweDRkLCAgMHhmZSwgIDB4OTEsICAweDU0LCAgMHgyMywgIDB4ZmUsICAweGZjLCAgMHgwZiwgIDB4NDQsICAweDExLCAgMHgwZiwKKyAgMHg0OCwgIDB4NTIsICAweDE4LCAgMHg1OCwgIDB4ZmUsICAweDkwLCAgMHg0ZCwgIDB4ZmUsICAweDkxLCAgMHg1NCwgIDB4MjMsICAweGU0LCAgMHgyNSwgIDB4MTEsICAweDEzLCAgMHgyMCwKKyAgMHg3YywgIDB4NmYsICAweDRmLCAgMHgyMiwgIDB4MjAsICAweGZiLCAgMHg3OSwgIDB4MjAsICAweDEyLCAgMHhjZiwgIDB4ZmUsICAweDE0LCAgMHg1NiwgIDB4ZmUsICAweGQ2LCAgMHhmMCwKKyAgMHhmZSwgIDB4MjYsICAweDEwLCAgMHhmOCwgIDB4NzQsICAweGZlLCAgMHgxNCwgIDB4MWMsICAweGZlLCAgMHgxMCwgIDB4MWMsICAweGZlLCAgMHgxOCwgIDB4MWMsICAweDA0LCAgMHg0MiwKKyAgMHhmZSwgIDB4MGMsICAweDE0LCAgMHhmYywgIDB4ZmUsICAweDA3LCAgMHhlNiwgIDB4MWIsICAweGZlLCAgMHhjZSwgIDB4NDcsICAweGZlLCAgMHhmNSwgIDB4MTMsICAweDA0LCAgMHgwMSwKKyAgMHhiMCwgIDB4N2MsICAweDZmLCAgMHg0ZiwgIDB4ZmUsICAweDA2LCAgMHg4MCwgIDB4ZmUsICAweDQ4LCAgMHg0NywgIDB4ZmUsICAweDQyLCAgMHgxMywgIDB4MzIsICAweDA3LCAgMHgyZiwKKyAgMHhmZSwgIDB4MzQsICAweDEzLCAgMHgwOSwgIDB4NDgsICAweDAxLCAgMHgwZSwgIDB4YmIsICAweGZlLCAgMHgzNiwgIDB4MTIsICAweGZlLCAgMHg0MSwgIDB4NDgsICAweGZlLCAgMHg0NSwKKyAgMHg0OCwgIDB4MDEsICAweGYwLCAgMHhmZSwgIDB4MDAsICAweGNjLCAgMHhiYiwgIDB4ZmUsICAweGYzLCAgMHgxMywgIDB4NDMsICAweDc4LCAgMHgwNywgIDB4MTEsICAweGFjLCAgMHgwOSwKKyAgMHg4NCwgIDB4MDEsICAweDBlLCAgMHhmZSwgIDB4ODAsICAweDVjLCAgMHgwMSwgIDB4NzMsICAweGZlLCAgMHgwZSwgIDB4MTAsICAweDA3LCAgMHg4MiwgIDB4NGUsICAweGZlLCAgMHgxNCwKKyAgMHg1NiwgIDB4ZmUsICAweGQ2LCAgMHhmMCwgIDB4ZmUsICAweDYwLCAgMHgxMCwgIDB4MDQsICAweGZlLCAgMHg0NCwgIDB4NTgsICAweDhkLCAgMHhmZSwgIDB4MDEsICAweGVjLCAgMHhhMiwKKyAgMHhmZSwgIDB4OWUsICAweDQwLCAgMHhmZSwgIDB4OWQsICAweGU3LCAgMHgwMCwgIDB4ZmUsICAweDljLCAgMHhlNywgIDB4MWEsICAweDc5LCAgMHgyYSwgIDB4MDEsICAweGUzLCAgMHhmZSwKKyAgMHhkZCwgIDB4MTAsICAweDJjLCAgMHhjNywgIDB4ODEsICAweGM4LCAgMHg4MywgIDB4MzMsICAweDMxLCAgMHhkZSwgIDB4MDcsICAweDFhLCAgMHhmZSwgIDB4NDgsICAweDEyLCAgMHgwNywKKyAgMHgwYSwgIDB4ZmUsICAweDU2LCAgMHgxMiwgIDB4MDcsICAweDE5LCAgMHhmZSwgIDB4MzAsICAweDEyLCAgMHgwNywgIDB4YzksICAweDE3LCAgMHhmZSwgIDB4MzIsICAweDEyLCAgMHgwNywKKyAgMHhmZSwgIDB4MjMsICAweDAwLCAgMHgxNywgIDB4ZWIsICAweDA3LCAgMHgwNiwgIDB4MTcsICAweGZlLCAgMHg5YywgIDB4MTIsICAweDA3LCAgMHgxZiwgIDB4ZmUsICAweDEyLCAgMHgxMiwKKyAgMHgwNywgIDB4MDAsICAweDE3LCAgMHgyNCwgIDB4MTUsICAweGM5LCAgMHgwMSwgIDB4MzYsICAweGE5LCAgMHgyZCwgIDB4MDEsICAweDBiLCAgMHg5NCwgIDB4NGIsICAweDA0LCAgMHgyZCwKKyAgMHhkZCwgIDB4MDksICAweGQxLCAgMHgwMSwgIDB4ZmUsICAweDI2LCAgMHgwZiwgIDB4MTIsICAweDgyLCAgMHgwMiwgIDB4MmIsICAweDJkLCAgMHgzMiwgIDB4MDcsICAweGE2LCAgMHhmZSwKKyAgMHhkOSwgIDB4MTMsICAweDNhLCAgMHgzZCwgIDB4M2IsICAweDNlLCAgMHg1NiwgIDB4ZmUsICAweGYwLCAgMHgxMSwgIDB4MDgsICAweDA1LCAgMHg1YSwgIDB4ZmUsICAweDcyLCAgMHgxMiwKKyAgMHg5YiwgIDB4MmUsICAweDljLCAgMHgzYywgIDB4OTAsICAweGMwLCAgMHg5NiwgIDB4ZmUsICAweGJhLCAgMHgxMSwgIDB4MjIsICAweDYyLCAgMHhmZSwgIDB4MjYsICAweDEzLCAgMHgwMywKKyAgMHg3ZiwgIDB4MjksICAweDgwLCAgMHg1NiwgIDB4ZmUsICAweDc2LCAgMHgwZCwgIDB4MGMsICAweDYwLCAgMHgxNCwgIDB4NjEsICAweDIxLCAgMHgwYywgIDB4N2YsICAweDBjLCAgMHg4MCwKKyAgMHgwMSwgIDB4YjMsICAweDI1LCAgMHg2ZSwgIDB4NzcsICAweDEzLCAgMHg2MiwgIDB4MDEsICAweGVmLCAgMHg5YiwgIDB4MmUsICAweDljLCAgMHgzYywgIDB4ZmUsICAweDA0LCAgMHg1NSwKKyAgMHhmZSwgIDB4YTUsICAweDU1LCAgMHhmZSwgIDB4MDQsICAweGZhLCAgMHgyZSwgIDB4ZmUsICAweDA1LCAgMHhmYSwgIDB4M2MsICAweGZlLCAgMHg5MSwgIDB4MTAsICAweDAzLCAgMHgzZiwKKyAgMHgyOSwgIDB4NDAsICAweGZlLCAgMHg0MCwgIDB4NTYsICAweGZlLCAgMHhlMSwgIDB4NTYsICAweDBjLCAgMHgzZiwgIDB4MTQsICAweDQwLCAgMHg4OCwgIDB4OWIsICAweDJlLCAgMHg5YywKKyAgMHgzYywgIDB4OTAsICAweGMwLCAgMHgwMywgIDB4NWUsICAweDI5LCAgMHg1ZiwgIDB4ZmUsICAweDAwLCAgMHg1NiwgIDB4ZmUsICAweGExLCAgMHg1NiwgIDB4MGMsICAweDVlLCAgMHgxNCwKKyAgMHg1ZiwgIDB4MDgsICAweDA1LCAgMHg1YSwgIDB4ZmUsICAweDFlLCAgMHgxMiwgIDB4MjIsICAweDYyLCAgMHhmZSwgIDB4MWYsICAweDQwLCAgMHgwMywgIDB4NjAsICAweDI5LCAgMHg2MSwKKyAgMHhmZSwgIDB4MmMsICAweDUwLCAgMHhmZSwgIDB4YWUsICAweDUwLCAgMHgwMywgIDB4M2YsICAweDI5LCAgMHg0MCwgIDB4ZmUsICAweDQ0LCAgMHg1MCwgIDB4ZmUsICAweGM2LCAgMHg1MCwKKyAgMHgwMywgIDB4NWUsICAweDI5LCAgMHg1ZiwgIDB4ZmUsICAweDA4LCAgMHg1MCwgIDB4ZmUsICAweDhhLCAgMHg1MCwgIDB4MDMsICAweDNkLCAgMHgyOSwgIDB4M2UsICAweGZlLCAgMHg0MCwKKyAgMHg1MCwgIDB4ZmUsICAweGMyLCAgMHg1MCwgIDB4MDIsICAweDg5LCAgMHgyNSwgIDB4MDYsICAweDEzLCAgMHhkNCwgIDB4MDIsICAweDcyLCAgMHgyZCwgIDB4MDEsICAweDBiLCAgMHgxZCwKKyAgMHg0YywgIDB4MzMsICAweDMxLCAgMHhkZSwgIDB4MDcsICAweDA2LCAgMHgyMywgIDB4NGMsICAweDMyLCAgMHgwNywgIDB4YTYsICAweDIzLCAgMHg3MiwgIDB4MDEsICAweGFmLCAgMHgxZSwKKyAgMHg0MywgIDB4MTcsICAweDRjLCAgMHgwOCwgIDB4MDUsICAweDBhLCAgMHhlZSwgIDB4M2EsICAweDNkLCAgMHgzYiwgIDB4M2UsICAweGZlLCAgMHgwYSwgIDB4NTUsICAweDM1LCAgMHhmZSwKKyAgMHg4YiwgIDB4NTUsICAweDU3LCAgMHgzZCwgIDB4N2QsICAweDNlLCAgMHhmZSwgIDB4MGMsICAweDUxLCAgMHhmZSwgIDB4OGUsICAweDUxLCAgMHgwMiwgIDB4NzIsICAweGZlLCAgMHgxOSwKKyAgMHg4MSwgIDB4YmEsICAweGZlLCAgMHgxOSwgIDB4NDEsICAweDAyLCAgMHg3MiwgIDB4MmQsICAweDAxLCAgMHgwYiwgIDB4MWMsICAweDM0LCAgMHgxZCwgIDB4ZTgsICAweDMzLCAgMHgzMSwKKyAgMHhlMSwgIDB4NTUsICAweDE5LCAgMHhmZSwgIDB4YTYsICAweDEyLCAgMHg1NSwgIDB4MGEsICAweDRkLCAgMHgwMiwgIDB4NGMsICAweDAxLCAgMHgwYiwgIDB4MWMsICAweDM0LCAgMHgxZCwKKyAgMHhlOCwgIDB4MzMsICAweDMxLCAgMHhkZiwgIDB4MDcsICAweDE5LCAgMHgyMywgIDB4NGMsICAweDAxLCAgMHgwYiwgIDB4MWQsICAweGU4LCAgMHgzMywgIDB4MzEsICAweGZlLCAgMHhlOCwKKyAgMHgwOSwgIDB4ZmUsICAweGMyLCAgMHg0OSwgIDB4NTEsICAweDAzLCAgMHhmZSwgIDB4OWMsICAweDAwLCAgMHgyOCwgIDB4OGEsICAweDUzLCAgMHgwNSwgIDB4MWYsICAweDM1LCAgMHhhOSwKKyAgMHhmZSwgIDB4YmIsICAweDQ1LCAgMHg1NSwgIDB4MDAsICAweDRlLCAgMHg0NCwgIDB4MDYsICAweDdjLCAgMHg0MywgIDB4ZmUsICAweGRhLCAgMHgxNCwgIDB4MDEsICAweGFmLCAgMHg4YywKKyAgMHhmZSwgIDB4NGIsICAweDQ1LCAgMHhlZSwgIDB4MzIsICAweDA3LCAgMHhhNSwgIDB4ZWQsICAweDAzLCAgMHhjZCwgIDB4MjgsICAweDhhLCAgMHgwMywgIDB4NDUsICAweDI4LCAgMHgzNSwKKyAgMHg2NywgIDB4MDIsICAweDcyLCAgMHhmZSwgIDB4YzAsICAweDVkLCAgMHhmZSwgIDB4ZjgsICAweDE0LCAgMHhmZSwgIDB4MDMsICAweDE3LCAgMHgwMywgIDB4NWMsICAweGMxLCAgMHgwYywKKyAgMHg1YywgIDB4NjcsICAweDJkLCAgMHgwMSwgIDB4MGIsICAweDI2LCAgMHg4OSwgIDB4MDEsICAweGZlLCAgMHg5ZSwgIDB4MTUsICAweDAyLCAgMHg4OSwgIDB4MDEsICAweDBiLCAgMHgxYywKKyAgMHgzNCwgIDB4MWQsICAweDRjLCAgMHgzMywgIDB4MzEsICAweGRmLCAgMHgwNywgIDB4MDYsICAweDIzLCAgMHg0YywgIDB4MDEsICAweGYxLCAgMHhmZSwgIDB4NDIsICAweDU4LCAgMHhmMSwKKyAgMHhmZSwgIDB4YTQsICAweDE0LCAgMHg4YywgIDB4ZmUsICAweDRhLCAgMHhmNCwgIDB4MGEsICAweDE3LCAgMHg0YywgIDB4ZmUsICAweDRhLCAgMHhmNCwgIDB4MDYsICAweGVhLCAgMHgzMiwKKyAgMHgwNywgIDB4YTUsICAweDhiLCAgMHgwMiwgIDB4NzIsICAweDAzLCAgMHg0NSwgIDB4YzEsICAweDBjLCAgMHg0NSwgIDB4NjcsICAweDJkLCAgMHgwMSwgIDB4MGIsICAweDI2LCAgMHg4OSwKKyAgMHgwMSwgIDB4ZmUsICAweGNjLCAgMHgxNSwgIDB4MDIsICAweDg5LCAgMHgwZiwgIDB4MDYsICAweDI3LCAgMHhmZSwgIDB4YmUsICAweDEzLCAgMHgyNiwgIDB4ZmUsICAweGQ0LCAgMHgxMywKKyAgMHg3NiwgIDB4ZmUsICAweDg5LCAgMHg0OCwgIDB4MDEsICAweDBiLCAgMHgyMSwgIDB4NzYsICAweDA0LCAgMHg3YiwgIDB4ZmUsICAweGQwLCAgMHgxMywgIDB4MWMsICAweGZlLCAgMHhkMCwKKyAgMHgxMywgIDB4MWQsICAweGZlLCAgMHhiZSwgIDB4MTMsICAweDY3LCAgMHgyZCwgIDB4MDEsICAweDBiLCAgMHhmZSwgIDB4ZDUsICAweDEwLCAgMHgwZiwgIDB4NzEsICAweGZmLCAgMHgwMiwKKyAgMHgwMCwgIDB4NTcsICAweDUyLCAgMHg5MywgIDB4MWUsICAweGZlLCAgMHhmZiwgIDB4N2YsICAweGZlLCAgMHgzMCwgIDB4NTYsICAweGZlLCAgMHgwMCwgIDB4NWMsICAweDA0LCAgMHgwZiwKKyAgMHg3MSwgIDB4ZmYsICAweDAyLCAgMHgwMCwgIDB4NTcsICAweDUyLCAgMHg5MywgIDB4MWUsICAweDQzLCAgMHhmZSwgIDB4MzAsICAweDU2LCAgMHhmZSwgIDB4MDAsICAweDVjLCAgMHgwNCwKKyAgMHgwZiwgIDB4NzEsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU3LCAgMHg1MiwgIDB4OTMsICAweDA0LCAgMHgwZiwgIDB4NzEsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU3LCAgMHg1MiwKKyAgMHg5MywgIDB4ZmUsICAweDBiLCAgMHg1OCwgIDB4MDQsICAweDA5LCAgMHg1YywgIDB4MDEsICAweDg3LCAgMHgwOSwgIDB4NDUsICAweDAxLCAgMHg4NywgIDB4MDQsICAweGZlLCAgMHgwMywKKyAgMHhhMSwgIDB4MWUsICAweDExLCAgMHhmZiwgIDB4MDMsICAweDAwLCAgMHg1NCwgIDB4ZmUsICAweDAwLCAgMHhmNCwgIDB4MWYsICAweDUyLCAgMHhmZSwgIDB4MDAsICAweDdkLCAgMHhmZSwKKyAgMHgwMSwgIDB4N2QsICAweGZlLCAgMHgwMiwgIDB4N2QsICAweGZlLCAgMHgwMywgIDB4N2MsICAweDZhLCAgMHgyYSwgIDB4MGMsICAweDVlLCAgMHgxNCwgIDB4NWYsICAweDU3LCAgMHgzZiwKKyAgMHg3ZCwgIDB4NDAsICAweDA0LCAgMHhkZCwgIDB4ZmUsICAweDgyLCAgMHg0YSwgIDB4ZmUsICAweGUxLCAgMHgxYSwgIDB4ZmUsICAweDgzLCAgMHg1YSwgIDB4OGQsICAweDA0LCAgMHgwMSwKKyAgMHhmZSwgIDB4MGMsICAweDE5LCAgMHhmZSwgIDB4NDIsICAweDQ4LCAgMHg1MCwgIDB4NTEsICAweDkxLCAgMHgwMSwgIDB4MGIsICAweDFkLCAgMHhmZSwgIDB4OTYsICAweDE1LCAgMHgzMywKKyAgMHgzMSwgIDB4ZTEsICAweDAxLCAgMHgwYiwgIDB4MWQsICAweGZlLCAgMHg5NiwgIDB4MTUsICAweDMzLCAgMHgzMSwgIDB4ZmUsICAweGU4LCAgMHgwYSwgIDB4ZmUsICAweGMxLCAgMHg1OSwKKyAgMHgwMywgIDB4Y2QsICAweDI4LCAgMHhmZSwgIDB4Y2MsICAweDEyLCAgMHg1MywgIDB4MDUsICAweDFhLCAgMHhmZSwgIDB4YzQsICAweDEzLCAgMHgyMSwgIDB4NjksICAweDFhLCAgMHhlZSwKKyAgMHg1NSwgIDB4Y2EsICAweDZiLCAgMHhmZSwgIDB4ZGMsICAweDE0LCAgMHg0ZCwgIDB4MGYsICAweDA2LCAgMHgxOCwgIDB4Y2EsICAweDdjLCAgMHgzMCwgIDB4ZmUsICAweDc4LCAgMHgxMCwKKyAgMHhmZiwgIDB4MDIsICAweDgzLCAgMHg1NSwgIDB4YWIsICAweGZmLCAgMHgwMiwgIDB4ODMsICAweDU1LCAgMHg2OSwgIDB4MTksICAweGFlLCAgMHg5OCwgIDB4ZmUsICAweDMwLCAgMHgwMCwKKyAgMHg5NiwgIDB4ZjIsICAweDE4LCAgMHg2ZCwgIDB4MGYsICAweDA2LCAgMHhmZSwgIDB4NTYsICAweDEwLCAgMHg2OSwgIDB4MGEsICAweGVkLCAgMHg5OCwgIDB4ZmUsICAweDY0LCAgMHgwMCwKKyAgMHg5NiwgIDB4ZjIsICAweDA5LCAgMHhmZSwgIDB4NjQsICAweDAwLCAgMHgxOCwgIDB4OWUsICAweDBmLCAgMHgwNiwgIDB4ZmUsICAweDI4LCAgMHgxMCwgIDB4NjksICAweDA2LCAgMHhmZSwKKyAgMHg2MCwgIDB4MTMsICAweDk4LCAgMHhmZSwgIDB4YzgsICAweDAwLCAgMHg5NiwgIDB4ZjIsICAweDA5LCAgMHhmZSwgIDB4YzgsICAweDAwLCAgMHgxOCwgIDB4NTksICAweDBmLCAgMHgwNiwKKyAgMHg4OCwgIDB4OTgsICAweGZlLCAgMHg5MCwgIDB4MDEsICAweDdhLCAgMHhmZSwgIDB4NDIsICAweDE1LCAgMHg5MSwgIDB4ZTQsICAweGZlLCAgMHg0MywgIDB4ZjQsICAweDlmLCAgMHhmZSwKKyAgMHg1NiwgIDB4ZjAsICAweGZlLCAgMHg1NCwgIDB4MTUsICAweGZlLCAgMHgwNCwgIDB4ZjQsICAweDcxLCAgMHhmZSwgIDB4NDMsICAweGY0LCAgMHg5ZSwgIDB4ZmUsICAweGYzLCAgMHgxMCwKKyAgMHhmZSwgIDB4NDAsICAweDVjLCAgMHgwMSwgIDB4ZmUsICAweDE2LCAgMHgxNCwgIDB4MWUsICAweDQzLCAgMHhlYywgIDB4ZmUsICAweDAwLCAgMHgxNywgIDB4ZmUsICAweDRkLCAgMHhlNCwKKyAgMHg2ZSwgIDB4N2EsICAweGZlLCAgMHg5MCwgIDB4MTUsICAweGM0LCAgMHg2ZSwgIDB4ZmUsICAweDFjLCAgMHgxMCwgIDB4ZmUsICAweDAwLCAgMHgxNywgIDB4ZmUsICAweDRkLCAgMHhlNCwKKyAgMHhjYywgIDB4N2EsICAweGZlLCAgMHg5MCwgIDB4MTUsICAweGM0LCAgMHhjYywgIDB4ODgsICAweDUxLCAgMHgyMSwgIDB4ZmUsICAweDRkLCAgMHhmNCwgIDB4MDAsICAweGU5LCAgMHg5MSwKKyAgMHgwZiwgIDB4MDYsICAweGZlLCAgMHhiNCwgIDB4NTYsICAweGZlLCAgMHhjMywgIDB4NTgsICAweDA0LCAgMHg1MSwgIDB4MGYsICAweDBhLCAgMHgwNCwgIDB4MTYsICAweDA2LCAgMHgwMSwKKyAgMHgwYiwgIDB4MjYsICAweGYzLCAgMHgxNiwgIDB4MGEsICAweDAxLCAgMHgwYiwgIDB4MjYsICAweGYzLCAgMHgxNiwgIDB4MTksICAweDAxLCAgMHgwYiwgIDB4MjYsICAweGYzLCAgMHg3NiwKKyAgMHhmZSwgIDB4ODksICAweDQ5LCAgMHgwMSwgIDB4MGIsICAweDA0LCAgMHgxNiwgIDB4MDYsICAweDAxLCAgMHgwYiwgIDB4MjYsICAweGIxLCAgMHgxNiwgIDB4MTksICAweDAxLCAgMHgwYiwKKyAgMHgyNiwgIDB4YjEsICAweDE2LCAgMHgwNiwgIDB4MDEsICAweDBiLCAgMHgyNiwgIDB4YjEsICAweGZlLCAgMHg4OSwgIDB4NDksICAweDAxLCAgMHgwYiwgIDB4MjYsICAweGIxLCAgMHg3NiwKKyAgMHhmZSwgIDB4ODksICAweDRhLCAgMHgwMSwgIDB4MGIsICAweDA0LCAgMHg1MSwgIDB4MDQsICAweDIyLCAgMHhkMywgIDB4MDcsICAweDA2LCAgMHhmZSwgIDB4NDgsICAweDEzLCAgMHhiOCwKKyAgMHgxMywgIDB4ZDMsICAweGZlLCAgMHg0OSwgIDB4ZjQsICAweDAwLCAgMHg0ZCwgIDB4NzYsICAweGE5LCAgMHg2NywgIDB4ZmUsICAweDAxLCAgMHhlYywgIDB4ZmUsICAweDI3LCAgMHgwMSwKKyAgMHhmZSwgIDB4ODksICAweDQ4LCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHgxMCwgIDB4MjcsICAweGZlLCAgMHgyZSwgIDB4MTYsICAweDMyLCAgMHgwNywgIDB4ZmUsICAweGUzLCAgMHgwMCwKKyAgMHhmZSwgIDB4MjAsICAweDEzLCAgMHgxZCwgIDB4ZmUsICAweDUyLCAgMHgxNiwgIDB4MjEsICAweDEzLCAgMHhkNCwgIDB4MDEsICAweDRiLCAgMHgyMiwgIDB4ZDQsICAweDA3LCAgMHgwNiwKKyAgMHg0ZSwgIDB4MDgsICAweDU0LCAgMHgwNiwgIDB4MzcsICAweDA0LCAgMHgwOSwgIDB4NDgsICAweDAxLCAgMHgwZSwgIDB4ZmIsICAweDhlLCAgMHgwNywgIDB4MTEsICAweGFlLCAgMHgwOSwKKyAgMHg4NCwgIDB4MDEsICAweDBlLCAgMHg4ZSwgIDB4MDksICAweDVkLCAgMHgwMSwgIDB4YTgsICAweDA0LCAgMHgwOSwgIDB4ODQsICAweDAxLCAgMHgwZSwgIDB4OGUsICAweGZlLCAgMHg4MCwKKyAgMHhlNywgIDB4MTEsICAweDA3LCAgMHgxMSwgIDB4OGEsICAweGZlLCAgMHg0NSwgIDB4NTgsICAweDAxLCAgMHhmMCwgIDB4OGUsICAweDA0LCAgMHgwOSwgIDB4NDgsICAweDAxLCAgMHgwZSwKKyAgMHg4ZSwgIDB4MDksICAweDVkLCAgMHgwMSwgIDB4YTgsICAweDA0LCAgMHgwOSwgIDB4NDgsICAweDAxLCAgMHgwZSwgIDB4ZmUsICAweDgwLCAgMHg4MCwgIDB4ZmUsICAweDgwLCAgMHg0YywKKyAgMHhmZSwgIDB4NDksICAweGU0LCAgMHgxMSwgIDB4YWUsICAweDA5LCAgMHg4NCwgIDB4MDEsICAweDBlLCAgMHhmZSwgIDB4ODAsICAweDRjLCAgMHgwOSwgIDB4NWQsICAweDAxLCAgMHg4NywKKyAgMHgwNCwgIDB4MTgsICAweDExLCAgMHg3NSwgIDB4NmMsICAweGZlLCAgMHg2MCwgIDB4MDEsICAweGZlLCAgMHgxOCwgIDB4ZGYsICAweGZlLCAgMHgxOSwgIDB4ZGUsICAweGZlLCAgMHgyNCwKKyAgMHgxYywgIDB4ZmUsICAweDFkLCAgMHhmNywgIDB4MWIsICAweDk3LCAgMHhmZSwgIDB4ZWUsICAweDE2LCAgMHgwMSwgIDB4ZmUsICAweGY0LCAgMHgxNywgIDB4YWQsICAweDlhLCAgMHgxYiwKKyAgMHg2YywgIDB4ZmUsICAweDJjLCAgMHgwMSwgIDB4ZmUsICAweDJmLCAgMHgxOSwgIDB4MDQsICAweGI5LCAgMHgyMywgIDB4ZmUsICAweGRlLCAgMHgxNiwgIDB4ZmUsICAweGRhLCAgMHgxMCwKKyAgMHgxOCwgIDB4MTEsICAweDc1LCAgMHgwMywgIDB4ZmUsICAweDY0LCAgMHgwMSwgIDB4ZmUsICAweDAwLCAgMHhmNCwgIDB4MWYsICAweGZlLCAgMHgxOCwgIDB4NTgsICAweDAzLCAgMHhmZSwKKyAgMHg2NiwgIDB4MDEsICAweGZlLCAgMHgxOSwgIDB4NTgsICAweDlhLCAgMHgxZiwgIDB4ZmUsICAweDNjLCAgMHg5MCwgIDB4ZmUsICAweDMwLCAgMHhmNCwgIDB4MDYsICAweGZlLCAgMHgzYywKKyAgMHg1MCwgIDB4NmMsICAweGZlLCAgMHgzOCwgIDB4MDAsICAweGZlLCAgMHgwZiwgIDB4NzksICAweGZlLCAgMHgxYywgIDB4ZjcsICAweDFmLCAgMHg5NywgIDB4ZmUsICAweDM4LCAgMHgxNywKKyAgMHhmZSwgIDB4YjYsICAweDE0LCAgMHgzNSwgIDB4MDQsICAweGI5LCAgMHgyMywgIDB4ZmUsICAweDEwLCAgMHgxNywgIDB4ZmUsICAweDljLCAgMHgxMCwgIDB4MTgsICAweDExLCAgMHg3NSwKKyAgMHhmZSwgIDB4ODMsICAweDVhLCAgMHhmZSwgIDB4MTgsICAweGRmLCAgMHhmZSwgIDB4MTksICAweGRlLCAgMHhmZSwgIDB4MWQsICAweGY3LCAgMHgyZSwgIDB4OTcsICAweGZlLCAgMHg1YSwKKyAgMHgxNywgIDB4ZmUsICAweDk0LCAgMHgxNCwgIDB4ZWMsICAweDlhLCAgMHgyZSwgIDB4NmMsICAweDFhLCAgMHhmZSwgIDB4YWYsICAweDE5LCAgMHhmZSwgIDB4OTgsICAweGU3LCAgMHgwMCwKKyAgMHgwNCwgIDB4YjksICAweDIzLCAgMHhmZSwgIDB4NGUsICAweDE3LCAgMHhmZSwgIDB4NmMsICAweDEwLCAgMHgxOCwgIDB4MTEsICAweDc1LCAgMHhmZSwgIDB4MzAsICAweGJjLCAgMHhmZSwKKyAgMHhiMiwgIDB4YmMsICAweDlhLCAgMHhjYiwgIDB4NmMsICAweDFhLCAgMHhmZSwgIDB4MGYsICAweDc5LCAgMHhmZSwgIDB4MWMsICAweGY3LCAgMHhjYiwgIDB4OTcsICAweGZlLCAgMHg5MiwKKyAgMHgxNywgIDB4ZmUsICAweDVjLCAgMHgxNCwgIDB4MzUsICAweDA0LCAgMHhiOSwgIDB4MjMsICAweGZlLCAgMHg3ZSwgIDB4MTcsICAweGZlLCAgMHg0MiwgIDB4MTAsICAweGZlLCAgMHgwMiwKKyAgMHhmNiwgIDB4MTEsICAweDc1LCAgMHhmZSwgIDB4MTgsICAweGZlLCAgMHg2MCwgIDB4ZmUsICAweDE5LCAgMHhmZSwgIDB4NjEsICAweGZlLCAgMHgwMywgIDB4YTEsICAweGZlLCAgMHgxZCwKKyAgMHhmNywgIDB4NWIsICAweDk3LCAgMHhmZSwgIDB4YjgsICAweDE3LCAgMHhmZSwgIDB4MzYsICAweDE0LCAgMHhmZSwgIDB4MWMsICAweDEzLCAgMHg5YSwgIDB4NWIsICAweDQxLCAgMHhmZSwKKyAgMHg4MywgIDB4NTgsICAweGZlLCAgMHhhZiwgIDB4MTksICAweGZlLCAgMHg4MCwgIDB4ZTcsICAweDExLCAgMHhmZSwgIDB4ODEsICAweGU3LCAgMHgxMSwgIDB4MTIsICAweGZlLCAgMHhkZCwKKyAgMHgwMCwgIDB4NmEsICAweDJhLCAgMHgwNCwgIDB4NmEsICAweDJhLCAgMHhmZSwgIDB4MTIsICAweDQ1LCAgMHgyMywgIDB4ZmUsICAweGE4LCAgMHgxNywgIDB4MTUsICAweDA2LCAgMHgzOSwKKyAgMHhhMCwgIDB4YjQsICAweDAyLCAgMHgyYiwgIDB4ZmUsICAweDM5LCAgMHhmMCwgIDB4ZmUsICAweGZjLCAgMHgxNywgIDB4MjEsICAweDA0LCAgMHhmZSwgIDB4N2UsICAweDE4LCAgMHgxZSwKKyAgMHgxOSwgIDB4NjYsICAweDBmLCAgMHgwZCwgIDB4MDQsICAweDc1LCAgMHgwMywgIDB4ZDIsICAweDFlLCAgMHgwNiwgIDB4ZmUsICAweGVmLCAgMHgxMiwgIDB4ZmUsICAweGUxLCAgMHgxMCwKKyAgMHg3YywgIDB4NmYsICAweDRmLCAgMHgzMiwgIDB4MDcsICAweDJmLCAgMHhmZSwgIDB4M2MsICAweDEzLCAgMHhmMSwgIDB4ZmUsICAweDQyLCAgMHgxMywgIDB4NDIsICAweDkyLCAgMHgwOSwKKyAgMHg0OCwgIDB4MDEsICAweDBlLCAgMHhiYiwgIDB4ZWIsICAweGZlLCAgMHg0MSwgIDB4NDgsICAweGZlLCAgMHg0NSwgIDB4NDgsICAweDAxLCAgMHhmMCwgIDB4ZmUsICAweDAwLCAgMHhjYywKKyAgMHhiYiwgIDB4ZmUsICAweGYzLCAgMHgxMywgIDB4NDMsICAweDc4LCAgMHgwNywgIDB4MTEsICAweGFjLCAgMHgwOSwgIDB4ODQsICAweDAxLCAgMHgwZSwgIDB4ZmUsICAweDgwLCAgMHg0YywKKyAgMHgwMSwgIDB4NzMsICAweGZlLCAgMHgxNiwgIDB4MTAsICAweDA3LCAgMHg4MiwgIDB4OGIsICAweGZlLCAgMHg0MCwgIDB4MTQsICAweGZlLCAgMHgyNCwgIDB4MTIsICAweGZlLCAgMHgxNCwKKyAgMHg1NiwgIDB4ZmUsICAweGQ2LCAgMHhmMCwgIDB4ZmUsICAweDFjLCAgMHgxOCwgIDB4MTgsICAweDBhLCAgMHgwNCwgIDB4ZmUsICAweDljLCAgMHhlNywgIDB4MGEsICAweDEwLCAgMHhmZSwKKyAgMHgxNSwgIDB4MDAsICAweDY0LCAgMHg3OSwgIDB4MmEsICAweDAxLCAgMHhlMywgIDB4MTgsICAweDA2LCAgMHgwNCwgIDB4NDIsICAweDkyLCAgMHgwOCwgIDB4NTQsICAweDFiLCAgMHgzNywKKyAgMHgxMiwgIDB4MmYsICAweDAxLCAgMHg3MywgIDB4MTgsICAweDA2LCAgMHgwNCwgIDB4ZmUsICAweDM4LCAgMHg5MCwgIDB4ZmUsICAweGJhLCAgMHg5MCwgIDB4M2EsICAweGNlLCAgMHgzYiwKKyAgMHhjZiwgIDB4ZmUsICAweDQ4LCAgMHg1NSwgIDB4MzUsICAweGZlLCAgMHhjOSwgIDB4NTUsICAweDA0LCAgMHgyMiwgIDB4YTMsICAweDc3LCAgMHgxMywgIDB4YTMsICAweDA0LCAgMHgwOSwKKyAgMHhhNCwgIDB4MDEsICAweDBlLCAgMHhmZSwgIDB4NDEsICAweDQ4LCAgMHgwOSwgIDB4NDYsICAweDAxLCAgMHgwZSwgIDB4ZmUsICAweDQ5LCAgMHg0NCwgIDB4MTcsICAweGZlLCAgMHhlOCwKKyAgMHgxOCwgIDB4NzcsICAweDc4LCAgMHgwNCwgIDB4MDksICAweDQ4LCAgMHgwMSwgIDB4MGUsICAweDA3LCAgMHgxMSwgIDB4NGUsICAweDA5LCAgMHg1ZCwgIDB4MDEsICAweGE4LCAgMHgwOSwKKyAgMHg0NiwgIDB4MDEsICAweDBlLCAgMHg3NywgIDB4NzgsICAweDA0LCAgMHhmZSwgIDB4NGUsICAweGU0LCAgMHgxOSwgIDB4NmIsICAweGZlLCAgMHgxYywgIDB4MTksICAweDAzLCAgMHhmZSwKKyAgMHg5MCwgIDB4MDAsICAweGZlLCAgMHgzYSwgIDB4NDUsICAweGZlLCAgMHgyYywgIDB4MTAsICAweGZlLCAgMHg0ZSwgIDB4ZTQsICAweGM5LCAgMHg2YiwgIDB4ZmUsICAweDJlLCAgMHgxOSwKKyAgMHgwMywgIDB4ZmUsICAweDkyLCAgMHgwMCwgIDB4ZmUsICAweDAyLCAgMHhlNiwgIDB4MWEsICAweGU1LCAgMHhmZSwgIDB4NGUsICAweGU0LCAgMHhmZSwgIDB4MGIsICAweDAwLCAgMHg2YiwKKyAgMHhmZSwgIDB4NDAsICAweDE5LCAgMHgwMywgIDB4ZmUsICAweDk0LCAgMHgwMCwgIDB4ZmUsICAweDAyLCAgMHhlNiwgIDB4MWYsICAweGZlLCAgMHgwOCwgIDB4MTAsICAweDAzLCAgMHhmZSwKKyAgMHg5NiwgIDB4MDAsICAweGZlLCAgMHgwMiwgIDB4ZTYsICAweDZkLCAgMHhmZSwgIDB4NGUsICAweDQ1LCAgMHhlYSwgIDB4YmEsICAweGZmLCAgMHgwNCwgIDB4NjgsICAweDU0LCAgMHhlNywKKyAgMHgxZSwgIDB4NmUsICAweGZlLCAgMHgwOCwgIDB4MWMsICAweGZlLCAgMHg2NywgIDB4MTksICAweGZlLCAgMHgwYSwgIDB4MWMsICAweGZlLCAgMHgxYSwgIDB4ZjQsICAweGZlLCAgMHgwMCwKKyAgMHgwNCwgIDB4ZWEsICAweGZlLCAgMHg0OCwgIDB4ZjQsICAweDE5LCAgMHg3YSwgIDB4ZmUsICAweDc0LCAgMHgxOSwgIDB4MGYsICAweDE5LCAgMHgwNCwgIDB4MDcsICAweDdlLCAgMHhmZSwKKyAgMHg1YSwgIDB4ZjAsICAweGZlLCAgMHg4NCwgIDB4MTksICAweDI1LCAgMHhmZSwgIDB4MDksICAweDAwLCAgMHhmZSwgIDB4MzQsICAweDEwLCAgMHgwNywgIDB4MWEsICAweGZlLCAgMHg1YSwKKyAgMHhmMCwgIDB4ZmUsICAweDkyLCAgMHgxOSwgIDB4MjUsICAweGNhLCAgMHhmZSwgIDB4MjYsICAweDEwLCAgMHgwNywgIDB4MTksICAweDY2LCAgMHgyNSwgIDB4NmQsICAweGU1LCAgMHgwNywKKyAgMHgwYSwgIDB4NjYsICAweDI1LCAgMHg5ZSwgIDB4ZmUsICAweDBlLCAgMHgxMCwgIDB4MDcsICAweDA2LCAgMHg2NiwgIDB4MjUsICAweDU5LCAgMHhhOSwgIDB4YjgsICAweDA0LCAgMHgxNSwKKyAgMHhmZSwgIDB4MDksICAweDAwLCAgMHgwMSwgIDB4MzYsICAweGZlLCAgMHgwNCwgIDB4ZmUsICAweDgxLCAgMHgwMywgIDB4ODMsICAweGZlLCAgMHg0MCwgIDB4NWMsICAweDA0LCAgMHgxYywKKyAgMHhmNywgIDB4ZmUsICAweDE0LCAgMHhmMCwgIDB4MGIsICAweDI3LCAgMHhmZSwgIDB4ZDYsICAweDE5LCAgMHgxYywgIDB4ZjcsICAweDdiLCAgMHhmNywgIDB4ZmUsICAweDgyLCAgMHhmMCwKKyAgMHhmZSwgIDB4ZGEsICAweDE5LCAgMHgwNCwgIDB4ZmYsICAweGNjLCAgMHgwMCwgIDB4MDAsCit9OworCitTVEFUSUMgdW5zaWduZWQgc2hvcnQgX2Fkdl9hc2MzOEMwODAwX3NpemUgPQorICAgICAgICBzaXplb2YoX2Fkdl9hc2MzOEMwODAwX2J1Zik7IC8qIDB4MTRFMSAqLworU1RBVElDIEFEVl9EQ05UIF9hZHZfYXNjMzhDMDgwMF9jaGtzdW0gPQorICAgICAgICAweDA1MEQzRkQ4VUw7IC8qIEV4cGFuZGVkIGxpdHRsZS1lbmRpYW4gY2hlY2tzdW0uICovCisKKy8qIE1pY3JvY29kZSBidWZmZXIgaXMga2VwdCBhZnRlciBpbml0aWFsaXphdGlvbiBmb3IgZXJyb3IgcmVjb3ZlcnkuICovCitTVEFUSUMgdW5zaWduZWQgY2hhciBfYWR2X2FzYzM4QzE2MDBfYnVmW10gPSB7CisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4ZjIsICAweDAwLCAgMHgxNiwgIDB4MDAsICAweGZjLCAgMHgwMCwgIDB4MTAsICAweDAwLCAgMHhmMCwgIDB4MTgsICAweGU0LCAgMHgwMSwgIDB4MDAsCisgIDB4MDQsICAweDFlLCAgMHg0OCwgIDB4ZTQsICAweDAzLCAgMHhmNiwgIDB4ZjcsICAweDEzLCAgMHgyZSwgIDB4MWUsICAweDAyLCAgMHgwMCwgIDB4MDcsICAweDE3LCAgMHhjMCwgIDB4NWYsCisgIDB4MDAsICAweGZhLCAgMHhmZiwgIDB4ZmYsICAweDA0LCAgMHgwMCwgIDB4MDAsICAweGY2LCAgMHgwOSwgIDB4ZTcsICAweDgyLCAgMHhlNywgIDB4ODUsICAweGYwLCAgMHg4NiwgIDB4ZjAsCisgIDB4NGUsICAweDEwLCAgMHg5ZSwgIDB4ZTcsICAweGZmLCAgMHgwMCwgIDB4NTUsICAweGYwLCAgMHgwMSwgIDB4ZjYsICAweDAzLCAgMHgwMCwgIDB4OTgsICAweDU3LCAgMHgwMSwgIDB4ZTYsCisgIDB4MDAsICAweGVhLCAgMHgwMCwgIDB4ZWMsICAweDAxLCAgMHhmYSwgIDB4MTgsICAweGY0LCAgMHgwOCwgIDB4MDAsICAweGYwLCAgMHgxZCwgIDB4MzgsICAweDU0LCAgMHgzMiwgIDB4ZjAsCisgIDB4MTAsICAweDAwLCAgMHhjMiwgIDB4MGUsICAweDFlLCAgMHhmMCwgIDB4ZDUsICAweGYwLCAgMHhiYywgIDB4MDAsICAweDRiLCAgMHhlNCwgIDB4MDAsICAweGU2LCAgMHhiMSwgIDB4ZjAsCisgIDB4YjQsICAweDAwLCAgMHgwMiwgIDB4MTMsICAweDNlLCAgMHgxYywgIDB4YzgsICAweDQ3LCAgMHgzZSwgIDB4MDAsICAweGQ4LCAgMHgwMSwgIDB4MDYsICAweDEzLCAgMHgwYywgIDB4MWMsCisgIDB4NWUsICAweDFlLCAgMHgwMCwgIDB4NTcsICAweGM4LCAgMHg1NywgIDB4MDEsICAweGZjLCAgMHhiYywgIDB4MGUsICAweGEyLCAgMHgxMiwgIDB4YjksICAweDU0LCAgMHgwMCwgIDB4ODAsCisgIDB4NjIsICAweDBhLCAgMHg1YSwgIDB4MTIsICAweGM4LCAgMHgxNSwgIDB4M2UsICAweDFlLCAgMHgxOCwgIDB4NDAsICAweGJkLCAgMHg1NiwgIDB4MDMsICAweGU2LCAgMHgwMSwgIDB4ZWEsCisgIDB4NWMsICAweGYwLCAgMHgwZiwgIDB4MDAsICAweDIwLCAgMHgwMCwgIDB4NmMsICAweDAxLCAgMHg2ZSwgIDB4MDEsICAweDA0LCAgMHgxMiwgIDB4MDQsICAweDEzLCAgMHhiYiwgIDB4NTUsCisgIDB4M2MsICAweDU2LCAgMHgzZSwgIDB4NTcsICAweDAzLCAgMHg1OCwgIDB4NGEsICAweGU0LCAgMHg0MCwgIDB4MDAsICAweGI2LCAgMHgwMCwgIDB4YmIsICAweDAwLCAgMHhjMCwgIDB4MDAsCisgIDB4MDAsICAweDAxLCAgMHgwMSwgIDB4MDEsICAweDNlLCAgMHgwMSwgIDB4NTgsICAweDBhLCAgMHg0NCwgIDB4MTAsICAweDBhLCAgMHgxMiwgIDB4NGMsICAweDFjLCAgMHg0ZSwgIDB4MWMsCisgIDB4MDIsICAweDRhLCAgMHgzMCwgIDB4ZTQsICAweDA1LCAgMHhlNiwgIDB4MGMsICAweDAwLCAgMHgzYywgIDB4MDAsICAweDgwLCAgMHgwMCwgIDB4MjQsICAweDAxLCAgMHgzYywgIDB4MDEsCisgIDB4NjgsICAweDAxLCAgMHg2YSwgIDB4MDEsICAweDcwLCAgMHgwMSwgIDB4NzIsICAweDAxLCAgMHg3NCwgIDB4MDEsICAweDc2LCAgMHgwMSwgIDB4NzgsICAweDAxLCAgMHg3YywgIDB4MDEsCisgIDB4YzYsICAweDBlLCAgMHgwYywgIDB4MTAsICAweGFjLCAgMHgxMiwgIDB4YWUsICAweDEyLCAgMHgxNiwgIDB4MWEsICAweDMyLCAgMHgxYywgIDB4NmUsICAweDFlLCAgMHgwMiwgIDB4NDgsCisgIDB4M2EsICAweDU1LCAgMHhjOSwgIDB4NTcsICAweDAyLCAgMHhlZSwgIDB4NWIsICAweGYwLCAgMHgwMywgIDB4ZjcsICAweDA2LCAgMHhmNywgIDB4MDMsICAweGZjLCAgMHgwNiwgIDB4MDAsCisgIDB4MWUsICAweDAwLCAgMHhiZSwgIDB4MDAsICAweGUxLCAgMHgwMCwgIDB4MGMsICAweDEyLCAgMHgxOCwgIDB4MWEsICAweDcwLCAgMHgxYSwgIDB4MzAsICAweDFjLCAgMHgzOCwgIDB4MWMsCisgIDB4MTAsICAweDQ0LCAgMHgwMCwgIDB4NGMsICAweGIwLCAgMHg1NywgIDB4NDAsICAweDVjLCAgMHg0ZCwgIDB4ZTQsICAweDA0LCAgMHhlYSwgIDB4NWQsICAweGYwLCAgMHhhNywgIDB4ZjAsCisgIDB4MDQsICAweGY2LCAgMHgwMiwgIDB4ZmMsICAweDA1LCAgMHgwMCwgIDB4MDksICAweDAwLCAgMHgxOSwgIDB4MDAsICAweDMyLCAgMHgwMCwgIDB4MzMsICAweDAwLCAgMHgzNCwgIDB4MDAsCisgIDB4MzYsICAweDAwLCAgMHg5OCwgIDB4MDAsICAweDllLCAgMHgwMCwgIDB4Y2MsICAweDAwLCAgMHgyMCwgIDB4MDEsICAweDRlLCAgMHgwMSwgIDB4NzksICAweDAxLCAgMHgzYywgIDB4MDksCisgIDB4NjgsICAweDBkLCAgMHgwMiwgIDB4MTAsICAweDA0LCAgMHgxMCwgIDB4M2EsICAweDEwLCAgMHgwOCwgIDB4MTIsICAweDBhLCAgMHgxMywgIDB4NDAsICAweDE2LCAgMHg1MCwgIDB4MTYsCisgIDB4MDAsICAweDE3LCAgMHg0YSwgIDB4MTksICAweDAwLCAgMHg0ZSwgIDB4MDAsICAweDU0LCAgMHgwMSwgIDB4NTgsICAweDAwLCAgMHhkYywgIDB4MDUsICAweGYwLCAgMHgwOSwgIDB4ZjAsCisgIDB4NTksICAweGYwLCAgMHhiOCwgIDB4ZjAsICAweDQ4LCAgMHhmNCwgIDB4MGUsICAweGY3LCAgMHgwYSwgIDB4MDAsICAweDliLCAgMHgwMCwgIDB4OWMsICAweDAwLCAgMHhhNCwgIDB4MDAsCisgIDB4YjUsICAweDAwLCAgMHhiYSwgIDB4MDAsICAweGQwLCAgMHgwMCwgIDB4ZTcsICAweDAwLCAgMHhmMCwgIDB4MDMsICAweDY5LCAgMHgwOCwgIDB4ZTksICAweDA5LCAgMHg1YywgIDB4MGMsCisgIDB4YjYsICAweDEyLCAgMHhiYywgIDB4MTksICAweGQ4LCAgMHgxYiwgIDB4MjAsICAweDFjLCAgMHgzNCwgIDB4MWMsICAweDM2LCAgMHgxYywgIDB4NDIsICAweDFkLCAgMHgwOCwgIDB4NDQsCisgIDB4MzgsICAweDQ0LCAgMHg5MSwgIDB4NDQsICAweDBhLCAgMHg0NSwgIDB4NDgsICAweDQ2LCAgMHg4OSwgIDB4NDgsICAweDY4LCAgMHg1NCwgIDB4ODMsICAweDU1LCAgMHg4MywgIDB4NTksCisgIDB4MzEsICAweGU0LCAgMHgwMiwgIDB4ZTYsICAweDA3LCAgMHhmMCwgIDB4MDgsICAweGYwLCAgMHgwYiwgIDB4ZjAsICAweDBjLCAgMHhmMCwgIDB4NGIsICAweGY0LCAgMHgwNCwgIDB4ZjgsCisgIDB4MDUsICAweGY4LCAgMHgwMiwgIDB4ZmEsICAweDAzLCAgMHhmYSwgIDB4MDQsICAweGZjLCAgMHgwNSwgIDB4ZmMsICAweDA3LCAgMHgwMCwgIDB4YTgsICAweDAwLCAgMHhhYSwgIDB4MDAsCisgIDB4YjksICAweDAwLCAgMHhlMCwgIDB4MDAsICAweGU1LCAgMHgwMCwgIDB4MjIsICAweDAxLCAgMHgyNiwgIDB4MDEsICAweDYwLCAgMHgwMSwgIDB4N2EsICAweDAxLCAgMHg4MiwgIDB4MDEsCisgIDB4YzgsICAweDAxLCAgMHhjYSwgIDB4MDEsICAweDg2LCAgMHgwMiwgIDB4NmEsICAweDAzLCAgMHgxOCwgIDB4MDUsICAweGIyLCAgMHgwNywgIDB4NjgsICAweDA4LCAgMHgxMCwgIDB4MGQsCisgIDB4MDYsICAweDEwLCAgMHgwYSwgIDB4MTAsICAweDBlLCAgMHgxMCwgIDB4MTIsICAweDEwLCAgMHg2MCwgIDB4MTAsICAweGVkLCAgMHgxMCwgIDB4ZjMsICAweDEwLCAgMHgwNiwgIDB4MTIsCisgIDB4MTAsICAweDEyLCAgMHgxZSwgIDB4MTIsICAweDBjLCAgMHgxMywgIDB4MGUsICAweDEzLCAgMHgxMCwgIDB4MTMsICAweGZlLCAgMHg5YywgIDB4ZjAsICAweDM1LCAgMHgwNSwgIDB4ZmUsCisgIDB4ZWMsICAweDBlLCAgMHhmZiwgIDB4MTAsICAweDAwLCAgMHgwMCwgIDB4ZTksICAweGZlLCAgMHgzNCwgIDB4MWYsICAweDAwLCAgMHhlOCwgIDB4ZmUsICAweDg4LCAgMHgwMSwgIDB4ZmYsCisgIDB4MDMsICAweDAwLCAgMHgwMCwgIDB4ZmUsICAweDkzLCAgMHgxNSwgIDB4ZmUsICAweDBmLCAgMHgwNSwgIDB4ZmYsICAweDM4LCAgMHgwMCwgIDB4MDAsICAweGZlLCAgMHg1NywgIDB4MjQsCisgIDB4MDAsICAweGZlLCAgMHg0YywgIDB4MDAsICAweDY1LCAgMHhmZiwgIDB4MDQsICAweDAwLCAgMHgwMCwgIDB4MWEsICAweGZmLCAgMHgwOSwgIDB4MDAsICAweDAwLCAgMHhmZiwgIDB4MDgsCisgIDB4MDEsICAweDAxLCAgMHhmZiwgIDB4MDgsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweDI3LCAgMHgwMCwgIDB4MDAsICAweGZmLCAgMHgxMCwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4MTMsCisgIDB4MDAsICAweDAwLCAgMHhmZSwgIDB4NzgsICAweDU2LCAgMHhmZSwgIDB4MzQsICAweDEyLCAgMHhmZiwgIDB4MjEsICAweDAwLCAgMHgwMCwgIDB4ZmUsICAweDA0LCAgMHhmNywgIDB4ZTgsCisgIDB4MzcsICAweDdkLCAgMHgwZCwgIDB4MDEsICAweGZlLCAgMHg0YSwgIDB4MTEsICAweGZlLCAgMHgwNCwgIDB4ZjcsICAweGU4LCAgMHg3ZCwgIDB4MGQsICAweDUxLCAgMHgzNywgIDB4ZmUsCisgIDB4M2QsICAweGYwLCAgMHhmZSwgIDB4MGMsICAweDAyLCAgMHhmZSwgIDB4MjAsICAweGYwLCAgMHhiYywgIDB4ZmUsICAweDkxLCAgMHhmMCwgIDB4ZmUsICAweGY4LCAgMHgwMSwgIDB4ZmUsCisgIDB4OTAsICAweGYwLCAgMHhmZSwgIDB4ZjgsICAweDAxLCAgMHhmZSwgIDB4OGYsICAweGYwLCAgMHhiYywgIDB4MDMsICAweDY3LCAgMHg0ZCwgIDB4MDUsICAweGZlLCAgMHgwOCwgIDB4MGYsCisgIDB4MDEsICAweGZlLCAgMHg3OCwgIDB4MGYsICAweGZlLCAgMHhkZCwgIDB4MTIsICAweDA1LCAgMHhmZSwgIDB4MGUsICAweDAzLCAgMHhmZSwgIDB4MjgsICAweDFjLCAgMHgwMywgIDB4ZmUsCisgIDB4YTYsICAweDAwLCAgMHhmZSwgIDB4ZDEsICAweDEyLCAgMHgzZSwgIDB4MjIsICAweGZlLCAgMHhhNiwgIDB4MDAsICAweGFjLCAgMHhmZSwgIDB4NDgsICAweGYwLCAgMHhmZSwgIDB4OTAsCisgIDB4MDIsICAweGZlLCAgMHg0OSwgIDB4ZjAsICAweGZlLCAgMHhhYSwgIDB4MDIsICAweGZlLCAgMHg0YSwgIDB4ZjAsICAweGZlLCAgMHhjOCwgIDB4MDIsICAweGZlLCAgMHg0NiwgIDB4ZjAsCisgIDB4ZmUsICAweDVhLCAgMHgwMiwgIDB4ZmUsICAweDQ3LCAgMHhmMCwgIDB4ZmUsICAweDYwLCAgMHgwMiwgIDB4ZmUsICAweDQzLCAgMHhmMCwgIDB4ZmUsICAweDRlLCAgMHgwMiwgIDB4ZmUsCisgIDB4NDQsICAweGYwLCAgMHhmZSwgIDB4NTIsICAweDAyLCAgMHhmZSwgIDB4NDUsICAweGYwLCAgMHhmZSwgIDB4NTYsICAweDAyLCAgMHgxYywgIDB4MGQsICAweGEyLCAgMHgxYywgIDB4MDcsCisgIDB4MjIsICAweGI3LCAgMHgwNSwgIDB4MzUsICAweGZlLCAgMHgwMCwgIDB4MWMsICAweGZlLCAgMHhmMSwgIDB4MTAsICAweGZlLCAgMHgwMiwgIDB4MWMsICAweGY1LCAgMHhmZSwgIDB4MWUsCisgIDB4MWMsICAweGZlLCAgMHhlOSwgIDB4MTAsICAweDAxLCAgMHg1ZiwgIDB4ZmUsICAweGU3LCAgMHgxMCwgIDB4ZmUsICAweDA2LCAgMHhmYywgIDB4ZGUsICAweDBhLCAgMHg4MSwgIDB4MDEsCisgIDB4YTMsICAweDA1LCAgMHgzNSwgIDB4MWYsICAweDk1LCAgMHg0NywgIDB4YjgsICAweDAxLCAgMHhmZSwgIDB4ZTQsICAweDExLCAgMHgwYSwgIDB4ODEsICAweDAxLCAgMHg1YywgIDB4ZmUsCisgIDB4YmQsICAweDEwLCAgMHgwYSwgIDB4ODEsICAweDAxLCAgMHg1YywgIDB4ZmUsICAweGFkLCAgMHgxMCwgIDB4ZmUsICAweDE2LCAgMHgxYywgIDB4ZmUsICAweDU4LCAgMHgxYywgIDB4MWMsCisgIDB4MDcsICAweDIyLCAgMHhiNywgIDB4MzcsICAweDJhLCAgMHgzNSwgIDB4ZmUsICAweDNkLCAgMHhmMCwgIDB4ZmUsICAweDBjLCAgMHgwMiwgIDB4MmIsICAweGZlLCAgMHg5ZSwgIDB4MDIsCisgIDB4ZmUsICAweDVhLCAgMHgxYywgIDB4ZmUsICAweDEyLCAgMHgxYywgIDB4ZmUsICAweDE0LCAgMHgxYywgIDB4MWYsICAweGZlLCAgMHgzMCwgIDB4MDAsICAweDQ3LCAgMHhiOCwgIDB4MDEsCisgIDB4ZmUsICAweGQ0LCAgMHgxMSwgIDB4MWMsICAweDA3LCAgMHgyMiwgIDB4YjcsICAweDA1LCAgMHhlOSwgIDB4MjEsICAweDJjLCAgMHgwOSwgIDB4MWEsICAweDMxLCAgMHhmZSwgIDB4NjksCisgIDB4MTAsICAweDFjLCAgMHgwNywgIDB4MjIsICAweGI3LCAgMHhmZSwgIDB4MDQsICAweGVjLCAgMHgyYywgIDB4NjAsICAweDAxLCAgMHhmZSwgIDB4MWUsICAweDFlLCAgMHgyMCwgIDB4MmMsCisgIDB4ZmUsICAweDA1LCAgMHhmNiwgIDB4ZGUsICAweDAxLCAgMHhmZSwgIDB4NjIsICAweDFiLCAgMHgwMSwgIDB4MGMsICAweDYxLCAgMHg0YSwgIDB4NDQsICAweDE1LCAgMHg1NiwgIDB4NTEsCisgIDB4MDEsICAweGZlLCAgMHg5ZSwgIDB4MWUsICAweDAxLCAgMHhmZSwgIDB4OTYsICAweDFhLCAgMHgwNSwgIDB4MzUsICAweDBhLCAgMHg1NywgIDB4MDEsICAweDE4LCAgMHgwOSwgIDB4MDAsCisgIDB4MzYsICAweDAxLCAgMHg4NSwgIDB4ZmUsICAweDE4LCAgMHgxMCwgIDB4ZmUsICAweDQxLCAgMHg1OCwgIDB4MGEsICAweGJhLCAgMHgwMSwgIDB4MTgsICAweGZlLCAgMHhjOCwgIDB4NTQsCisgIDB4N2IsICAweGZlLCAgMHgxYywgIDB4MDMsICAweDAxLCAgMHhmZSwgIDB4OTYsICAweDFhLCAgMHgwNSwgIDB4MzUsICAweDM3LCAgMHg2MCwgIDB4ZmUsICAweDAyLCAgMHhlOCwgIDB4MzAsCisgIDB4ZmUsICAweGJmLCAgMHg1NywgIDB4ZmUsICAweDllLCAgMHg0MywgIDB4ZmUsICAweDc3LCAgMHg1NywgIDB4ZmUsICAweDI3LCAgMHhmMCwgIDB4ZmUsICAweGU0LCAgMHgwMSwgIDB4ZmUsCisgIDB4MDcsICAweDRiLCAgMHhmZSwgIDB4MjAsICAweGYwLCAgMHhiYywgIDB4ZmUsICAweDQwLCAgMHgxYywgIDB4MmEsICAweGViLCAgMHhmZSwgIDB4MjYsICAweGYwLCAgMHhmZSwgIDB4NjYsCisgIDB4MDMsICAweGZlLCAgMHhhMCwgIDB4ZjAsICAweGZlLCAgMHg1NCwgIDB4MDMsICAweGZlLCAgMHgxMSwgIDB4ZjAsICAweGJjLCAgMHhmZSwgIDB4ZWYsICAweDEwLCAgMHhmZSwgIDB4OWYsCisgIDB4ZjAsICAweGZlLCAgMHg3NCwgIDB4MDMsICAweGZlLCAgMHg0NiwgIDB4MWMsICAweDE5LCAgMHhmZSwgIDB4MTEsICAweDAwLCAgMHgwNSwgIDB4NzAsICAweDM3LCAgMHhmZSwgIDB4NDgsCisgIDB4MWMsICAweGZlLCAgMHg0NiwgIDB4MWMsICAweDAxLCAgMHgwYywgIDB4MDYsICAweDI4LCAgMHhmZSwgIDB4MTgsICAweDEzLCAgMHgyNiwgIDB4MjEsICAweGI5LCAgMHhjNywgIDB4MjAsCisgIDB4YjksICAweDBhLCAgMHg1NywgIDB4MDEsICAweDE4LCAgMHhjNywgIDB4ODksICAweDAxLCAgMHhmZSwgIDB4YzgsICAweDFhLCAgMHgxNSwgIDB4ZTEsICAweDJhLCAgMHhlYiwgIDB4ZmUsCisgIDB4MDEsICAweGYwLCAgMHhlYiwgIDB4ZmUsICAweDgyLCAgMHhmMCwgIDB4ZmUsICAweGE0LCAgMHgwMywgIDB4ZmUsICAweDljLCAgMHgzMiwgIDB4MTUsICAweGZlLCAgMHhlNCwgIDB4MDAsCisgIDB4MmYsICAweGZlLCAgMHhiNiwgIDB4MDMsICAweDJhLCAgMHgzYywgIDB4MTYsICAweGZlLCAgMHhjNiwgIDB4MDMsICAweDAxLCAgMHg0MSwgIDB4ZmUsICAweDA2LCAgMHhmMCwgIDB4ZmUsCisgIDB4ZDYsICAweDAzLCAgMHhhZiwgIDB4YTAsICAweGZlLCAgMHgwYSwgIDB4ZjAsICAweGZlLCAgMHhhMiwgIDB4MDcsICAweDA1LCAgMHgyOSwgIDB4MDMsICAweDgxLCAgMHgxZSwgIDB4MWIsCisgIDB4ZmUsICAweDI0LCAgMHgwNSwgIDB4MWYsICAweDYzLCAgMHgwMSwgIDB4NDIsICAweDhmLCAgMHhmZSwgIDB4NzAsICAweDAyLCAgMHgwNSwgIDB4ZWEsICAweGZlLCAgMHg0NiwgIDB4MWMsCisgIDB4MzcsICAweDdkLCAgMHgxZCwgIDB4ZmUsICAweDY3LCAgMHgxYiwgIDB4ZmUsICAweGJmLCAgMHg1NywgIDB4ZmUsICAweDc3LCAgMHg1NywgIDB4ZmUsICAweDQ4LCAgMHgxYywgIDB4NzUsCisgIDB4MDEsICAweGE2LCAgMHg4NiwgIDB4MGEsICAweDU3LCAgMHgwMSwgIDB4MTgsICAweDA5LCAgMHgwMCwgIDB4MWIsICAweGVjLCAgMHgwYSwgIDB4ZTEsICAweDAxLCAgMHgxOCwgIDB4NzcsCisgIDB4NTAsICAweDQwLCAgMHg4ZCwgIDB4MzAsICAweDAzLCAgMHg4MSwgIDB4MWUsICAweGY4LCAgMHgxZiwgIDB4NjMsICAweDAxLCAgMHg0MiwgIDB4OGYsICAweGZlLCAgMHg3MCwgIDB4MDIsCisgIDB4MDUsICAweGVhLCAgMHhkNywgIDB4OTksICAweGQ4LCAgMHg5YywgIDB4MmEsICAweDI5LCAgMHgyZiwgIDB4ZmUsICAweDRlLCAgMHgwNCwgIDB4MTYsICAweGZlLCAgMHg0YSwgIDB4MDQsCisgIDB4N2UsICAweGZlLCAgMHhhMCwgIDB4MDAsICAweGZlLCAgMHg5YiwgIDB4NTcsICAweGZlLCAgMHg1NCwgIDB4MTIsICAweDMyLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHgxMCwgIDB4MDEsCisgIDB4MDgsICAweDE2LCAgMHhmZSwgIDB4MDIsICAweDA1LCAgMHgzMiwgIDB4MDEsICAweDA4LCAgMHgxNiwgIDB4MjksICAweDI3LCAgMHgyNSwgIDB4ZWUsICAweGZlLCAgMHg0YywgIDB4NDQsCisgIDB4ZmUsICAweDU4LCAgMHgxMiwgIDB4NTAsICAweGZlLCAgMHg0NCwgIDB4NDgsICAweDEzLCAgMHgzNCwgIDB4ZmUsICAweDRjLCAgMHg1NCwgIDB4N2IsICAweGVjLCAgMHg2MCwgIDB4OGQsCisgIDB4MzAsICAweDAxLCAgMHhmZSwgIDB4NGUsICAweDFlLCAgMHhmZSwgIDB4NDgsICAweDQ3LCAgMHhmZSwgIDB4N2MsICAweDEzLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgyOCwgIDB4ZmUsCisgIDB4MzIsICAweDEzLCAgMHgwMSwgIDB4NDMsICAweDA5LCAgMHg5YiwgIDB4ZmUsICAweDY4LCAgMHgxMywgIDB4ZmUsICAweDI2LCAgMHgxMCwgIDB4MTMsICAweDM0LCAgMHhmZSwgIDB4NGMsCisgIDB4NTQsICAweDdiLCAgMHhlYywgIDB4MDEsICAweGZlLCAgMHg0ZSwgIDB4MWUsICAweGZlLCAgMHg0OCwgIDB4NDcsICAweGZlLCAgMHg1NCwgIDB4MTMsICAweDAxLCAgMHgwYywgIDB4MDYsCisgIDB4MjgsICAweGE1LCAgMHgwMSwgIDB4NDMsICAweDA5LCAgMHg5YiwgIDB4ZmUsICAweDQwLCAgMHgxMywgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MjgsICAweGY5LCAgMHgxZiwgIDB4N2YsCisgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MDcsICAweDRkLCAgMHgxZiwgIDB4ZmUsICAweDBkLCAgMHgwMCwgIDB4MDEsICAweDQyLCAgMHg4ZiwgIDB4ZmUsICAweGE0LCAgMHgwZSwgIDB4MDUsCisgIDB4MjksICAweDMyLCAgMHgxNSwgIDB4ZmUsICAweGU2LCAgMHgwMCwgIDB4MGYsICAweGZlLCAgMHgxYywgIDB4OTAsICAweDA0LCAgMHhmZSwgIDB4OWMsICAweDkzLCAgMHgzYSwgIDB4MGIsCisgIDB4MGUsICAweDhiLCAgMHgwMiwgIDB4MWYsICAweDdmLCAgMHgwMSwgIDB4NDIsICAweDA1LCAgMHgzNSwgIDB4ZmUsICAweDQyLCAgMHg1YiwgIDB4N2QsICAweDFkLCAgMHhmZSwgIDB4NDYsCisgIDB4NTksICAweGZlLCAgMHhiZiwgIDB4NTcsICAweGZlLCAgMHg3NywgIDB4NTcsICAweDBmLCAgMHhmZSwgIDB4ODcsICAweDgwLCAgMHgwNCwgIDB4ZmUsICAweDg3LCAgMHg4MywgIDB4ZmUsCisgIDB4YzksICAweDQ3LCAgMHgwYiwgIDB4MGUsICAweGQwLCAgMHg2NSwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MGQsICAweGZlLCAgMHg5OCwgIDB4MTMsICAweDBmLCAgMHhmZSwgIDB4MjAsCisgIDB4ODAsICAweDA0LCAgMHhmZSwgIDB4YTAsICAweDgzLCAgMHgzMywgIDB4MGIsICAweDBlLCAgMHgwOSwgIDB4MWQsICAweGZlLCAgMHg4NCwgIDB4MTIsICAweDAxLCAgMHgzOCwgIDB4MDYsCisgIDB4MDcsICAweGZlLCAgMHg3MCwgIDB4MTMsICAweDAzLCAgMHhmZSwgIDB4YTIsICAweDAwLCAgMHgxZSwgIDB4MWIsICAweGZlLCAgMHhkYSwgIDB4MDUsICAweGQwLCAgMHg1NCwgIDB4MDEsCisgIDB4MzgsICAweDA2LCAgMHgwZCwgIDB4ZmUsICAweDU4LCAgMHgxMywgIDB4MDMsICAweGZlLCAgMHhhMCwgIDB4MDAsICAweDFlLCAgMHhmZSwgIDB4NTAsICAweDEyLCAgMHg1ZSwgIDB4ZmYsCisgIDB4MDIsICAweDAwLCAgMHgxMCwgIDB4MmYsICAweGZlLCAgMHg5MCwgIDB4MDUsICAweDJhLCAgMHgzYywgIDB4Y2MsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDEwLCAgMHgyZiwgIDB4ZmUsCisgIDB4OWUsICAweDA1LCAgMHgxNywgIDB4ZmUsICAweGY0LCAgMHgwNSwgIDB4MTUsICAweGZlLCAgMHhlMywgIDB4MDAsICAweDI2LCAgMHgwMSwgIDB4MzgsICAweGZlLCAgMHg0YSwgIDB4ZjAsCisgIDB4ZmUsICAweGMwLCAgMHgwNSwgIDB4ZmUsICAweDQ5LCAgMHhmMCwgIDB4ZmUsICAweGJhLCAgMHgwNSwgIDB4NzEsICAweDJlLCAgMHhmZSwgIDB4MjEsICAweDAwLCAgMHhmMSwgIDB4MmUsCisgIDB4ZmUsICAweDIyLCAgMHgwMCwgIDB4YTIsICAweDJlLCAgMHg0YSwgIDB4ZmUsICAweDA5LCAgMHg0OCwgIDB4ZmYsICAweDAyLCAgMHgwMCwgIDB4MTAsICAweDJmLCAgMHhmZSwgIDB4ZDAsCisgIDB4MDUsICAweDE3LCAgMHhmZSwgIDB4ZjQsICAweDA1LCAgMHhmZSwgIDB4ZTIsICAweDA4LCAgMHgwMSwgIDB4MzgsICAweDA2LCAgMHhmZSwgIDB4MWMsICAweDAwLCAgMHg0ZCwgIDB4MDEsCisgIDB4YTcsICAweDJlLCAgMHgwNywgIDB4MjAsICAweGU0LCAgMHg0NywgIDB4ZmUsICAweDI3LCAgMHgwMSwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MjgsICAweGZlLCAgMHgyNCwgIDB4MTIsCisgIDB4M2UsICAweDAxLCAgMHg4NCwgIDB4MWYsICAweDdmLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgwNywgIDB4NGQsICAweDFmLCAgMHhmZSwgIDB4MGQsICAweDAwLCAgMHgwMSwgIDB4NDIsCisgIDB4OGYsICAweGZlLCAgMHhhNCwgIDB4MGUsICAweDA1LCAgMHgyOSwgIDB4MDMsICAweGU2LCAgMHgxZSwgIDB4ZmUsICAweGNhLCAgMHgxMywgIDB4MDMsICAweGI2LCAgMHgxZSwgIDB4ZmUsCisgIDB4NDAsICAweDEyLCAgMHgwMywgIDB4NjYsICAweDFlLCAgMHhmZSwgIDB4MzgsICAweDEzLCAgMHgzZSwgIDB4MDEsICAweDg0LCAgMHgxNywgIDB4ZmUsICAweDcyLCAgMHgwNiwgIDB4MGEsCisgIDB4MDcsICAweDAxLCAgMHgzOCwgIDB4MDYsICAweDI0LCAgMHhmZSwgIDB4MDIsICAweDEyLCAgMHg0ZiwgIDB4MDEsICAweGZlLCAgMHg1NiwgIDB4MTksICAweDE2LCAgMHhmZSwgIDB4NjgsCisgIDB4MDYsICAweDE1LCAgMHg4MiwgIDB4MDEsICAweDQxLCAgMHgxNSwgIDB4ZTIsICAweDAzLCAgMHg2NiwgIDB4OGEsICAweDEwLCAgMHg2NiwgIDB4MDMsICAweDlhLCAgMHgxZSwgIDB4ZmUsCisgIDB4NzAsICAweDEyLCAgMHgwMywgIDB4NTUsICAweDFlLCAgMHhmZSwgIDB4NjgsICAweDEzLCAgMHgwMSwgIDB4YzYsICAweDA5LCAgMHgxMiwgIDB4NDgsICAweGZlLCAgMHg5MiwgIDB4MDYsCisgIDB4MmUsICAweDEyLCAgMHgwMSwgIDB4ZmUsICAweGFjLCAgMHgxZCwgIDB4ZmUsICAweDQzLCAgMHg0OCwgIDB4NjIsICAweDgwLCAgMHgxMywgIDB4NTgsICAweGZmLCAgMHgwMiwgIDB4MDAsCisgIDB4NTcsICAweDUyLCAgMHhhZCwgIDB4MjMsICAweDNmLCAgMHg0ZSwgIDB4NjIsICAweDQ5LCAgMHgzZSwgIDB4MDEsICAweDg0LCAgMHgxNywgIDB4ZmUsICAweGVhLCAgMHgwNiwgIDB4MDEsCisgIDB4MzgsICAweDA2LCAgMHgxMiwgIDB4ZjcsICAweDQ1LCAgMHgwYSwgIDB4OTUsICAweDAxLCAgMHhmZSwgIDB4ODQsICAweDE5LCAgMHgxNiwgIDB4ZmUsICAweGUwLCAgMHgwNiwgIDB4MTUsCisgIDB4ODIsICAweDAxLCAgMHg0MSwgIDB4MTUsICAweGUyLCAgMHgwMywgIDB4NTUsICAweDhhLCAgMHgxMCwgIDB4NTUsICAweDFjLCAgMHgwNywgIDB4MDEsICAweDg0LCAgMHhmZSwgIDB4YWUsCisgIDB4MTAsICAweDAzLCAgMHg2ZiwgIDB4MWUsICAweGZlLCAgMHg5ZSwgIDB4MTMsICAweDNlLCAgMHgwMSwgIDB4ODQsICAweDAzLCAgMHg5YSwgIDB4MWUsICAweGZlLCAgMHgxYSwgIDB4MTIsCisgIDB4MDEsICAweDM4LCAgMHgwNiwgIDB4MTIsICAweGZjLCAgMHgwMSwgIDB4YzYsICAweDAxLCAgMHhmZSwgIDB4YWMsICAweDFkLCAgMHhmZSwgIDB4NDMsICAweDQ4LCAgMHg2MiwgIDB4ODAsCisgIDB4ZjAsICAweDQ1LCAgMHgwYSwgIDB4OTUsICAweDAzLCAgMHhiNiwgIDB4MWUsICAweGY4LCAgMHgwMSwgIDB4MzgsICAweDA2LCAgMHgyNCwgIDB4MzYsICAweGZlLCAgMHgwMiwgIDB4ZjYsCisgIDB4MDcsICAweDcxLCAgMHg3OCwgIDB4OGMsICAweDAwLCAgMHg0ZCwgIDB4NjIsICAweDQ5LCAgMHgzZSwgIDB4MmQsICAweDkzLCAgMHg0ZSwgIDB4ZDAsICAweDBkLCAgMHgxNywgIDB4ZmUsCisgIDB4OWEsICAweDA3LCAgMHgwMSwgIDB4ZmUsICAweGMwLCAgMHgxOSwgIDB4MTYsICAweGZlLCAgMHg5MCwgIDB4MDcsICAweDI2LCAgMHgyMCwgIDB4OWUsICAweDE1LCAgMHg4MiwgIDB4MDEsCisgIDB4NDEsICAweDE1LCAgMHhlMiwgIDB4MjEsICAweDllLCAgMHgwOSwgIDB4MDcsICAweGZiLCAgMHgwMywgIDB4ZTYsICAweGZlLCAgMHg1OCwgIDB4NTcsICAweDEwLCAgMHhlNiwgIDB4MDUsCisgIDB4ZmUsICAweDJhLCAgMHgwNiwgIDB4MDMsICAweDZmLCAgMHg4YSwgIDB4MTAsICAweDZmLCAgMHgxYywgIDB4MDcsICAweDAxLCAgMHg4NCwgIDB4ZmUsICAweDljLCAgMHgzMiwgIDB4NWYsCisgIDB4NzUsICAweDAxLCAgMHhhNiwgIDB4ODYsICAweDE1LCAgMHhmZSwgIDB4ZTIsICAweDAwLCAgMHgyZiwgIDB4ZWQsICAweDJhLCAgMHgzYywgIDB4ZmUsICAweDBhLCAgMHhmMCwgIDB4ZmUsCisgIDB4Y2UsICAweDA3LCAgMHhhZSwgIDB4ZmUsICAweDk2LCAgMHgwOCwgIDB4ZmUsICAweDA2LCAgMHhmMCwgIDB4ZmUsICAweDllLCAgMHgwOCwgIDB4YWYsICAweGEwLCAgMHgwNSwgIDB4MjksCisgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MGQsICAweGZlLCAgMHgyZSwgIDB4MTIsICAweDE0LCAgMHgxZCwgIDB4MDEsICAweDA4LCAgMHgxNCwgIDB4MDAsICAweDAxLCAgMHgwOCwgIDB4MTQsCisgIDB4MDAsICAweDAxLCAgMHgwOCwgIDB4MTQsICAweDAwLCAgMHgwMSwgIDB4MDgsICAweGZlLCAgMHg5OSwgIDB4YTQsICAweDAxLCAgMHgwOCwgIDB4MTQsICAweDAwLCAgMHgwNSwgIDB4ZmUsCisgIDB4YzYsICAweDA5LCAgMHgwMSwgIDB4NzYsICAweDA2LCAgMHgxMiwgIDB4ZmUsICAweDNhLCAgMHgxMiwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MTIsICAweGZlLCAgMHgzMCwgIDB4MTMsCisgIDB4MTQsICAweGZlLCAgMHgxYiwgIDB4MDAsICAweDAxLCAgMHgwOCwgIDB4MTQsICAweDAwLCAgMHgwMSwgIDB4MDgsICAweDE0LCAgMHgwMCwgIDB4MDEsICAweDA4LCAgMHgxNCwgIDB4MDAsCisgIDB4MDEsICAweDA4LCAgMHgxNCwgIDB4MDcsICAweDAxLCAgMHgwOCwgIDB4MTQsICAweDAwLCAgMHgwNSwgIDB4ZWYsICAweDdjLCAgMHg0YSwgIDB4NzgsICAweDRmLCAgMHgwZiwgIDB4ZmUsCisgIDB4OWEsICAweDgxLCAgMHgwNCwgIDB4ZmUsICAweDlhLCAgMHg4MywgIDB4ZmUsICAweGNiLCAgMHg0NywgIDB4MGIsICAweDBlLCAgMHgyZCwgIDB4MjgsICAweDQ4LCAgMHhmZSwgIDB4NmMsCisgIDB4MDgsICAweDBhLCAgMHgyOCwgIDB4ZmUsICAweDA5LCAgMHg2ZiwgIDB4Y2EsICAweGZlLCAgMHhjYSwgIDB4NDUsICAweGZlLCAgMHgzMiwgIDB4MTIsICAweDUzLCAgMHg2MywgIDB4NGUsCisgIDB4N2MsICAweDk3LCAgMHgyZiwgIDB4ZmUsICAweDdlLCAgMHgwOCwgIDB4MmEsICAweDNjLCAgMHhmZSwgIDB4MGEsICAweGYwLCAgMHhmZSwgIDB4NmMsICAweDA4LCAgMHhhZiwgIDB4YTAsCisgIDB4YWUsICAweGZlLCAgMHg5NiwgIDB4MDgsICAweDA1LCAgMHgyOSwgIDB4MDEsICAweDQxLCAgMHgwNSwgIDB4ZWQsICAweDE0LCAgMHgyNCwgIDB4MDUsICAweGVkLCAgMHhmZSwgIDB4OWMsCisgIDB4ZjcsICAweDlmLCAgMHgwMSwgIDB4ZmUsICAweGFlLCAgMHgxZSwgIDB4ZmUsICAweDE4LCAgMHg1OCwgIDB4MDEsICAweGZlLCAgMHhiZSwgIDB4MWUsICAweGZlLCAgMHg5OSwgIDB4NTgsCisgIDB4ZmUsICAweDc4LCAgMHgxOCwgIDB4ZmUsICAweGY5LCAgMHgxOCwgIDB4OGUsICAweGZlLCAgMHgxNiwgIDB4MDksICAweDEwLCAgMHg2YSwgIDB4MjIsICAweDZiLCAgMHgwMSwgIDB4MGMsCisgIDB4NjEsICAweDU0LCAgMHg0NCwgIDB4MjEsICAweDJjLCAgMHgwOSwgIDB4MWEsICAweGY4LCAgMHg3NywgIDB4MDEsICAweGZlLCAgMHg3ZSwgIDB4MWUsICAweDQ3LCAgMHgyYywgIDB4N2EsCisgIDB4MzAsICAweGYwLCAgMHhmZSwgIDB4ODMsICAweGU3LCAgMHhmZSwgIDB4M2YsICAweDAwLCAgMHg3MSwgIDB4ZmUsICAweDAzLCAgMHg0MCwgIDB4MDEsICAweDBjLCAgMHg2MSwgIDB4NjUsCisgIDB4NDQsICAweDAxLCAgMHhjMiwgIDB4YzgsICAweGZlLCAgMHgxZiwgIDB4NDAsICAweDIwLCAgMHg2ZSwgIDB4MDEsICAweGZlLCAgMHg2YSwgIDB4MTYsICAweGZlLCAgMHgwOCwgIDB4NTAsCisgIDB4ZmUsICAweDhhLCAgMHg1MCwgIDB4ZmUsICAweDQ0LCAgMHg1MSwgIDB4ZmUsICAweGM2LCAgMHg1MSwgIDB4ZmUsICAweDEwLCAgMHgxMCwgIDB4MDEsICAweGZlLCAgMHhjZSwgIDB4MWUsCisgIDB4MDEsICAweGZlLCAgMHhkZSwgIDB4MWUsICAweDEwLCAgMHg2OCwgIDB4MjIsICAweDY5LCAgMHgwMSwgIDB4ZmUsICAweGVlLCAgMHgxZSwgIDB4MDEsICAweGZlLCAgMHhmZSwgIDB4MWUsCisgIDB4ZmUsICAweDQwLCAgMHg1MCwgIDB4ZmUsICAweGMyLCAgMHg1MCwgIDB4MTAsICAweDRiLCAgMHgyMiwgIDB4NGMsICAweGZlLCAgMHg4YSwgIDB4MTAsICAweDAxLCAgMHgwYywgIDB4MDYsCisgIDB4NTQsICAweGZlLCAgMHg1MCwgIDB4MTIsICAweDAxLCAgMHhmZSwgIDB4YWUsICAweDFlLCAgMHgwMSwgIDB4ZmUsICAweGJlLCAgMHgxZSwgIDB4MTAsICAweDZhLCAgMHgyMiwgIDB4NmIsCisgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4NjUsICAweDRlLCAgMHgwMSwgIDB4YzIsICAweDBmLCAgMHhmZSwgIDB4MWYsICAweDgwLCAgMHgwNCwgIDB4ZmUsICAweDlmLCAgMHg4MywgIDB4MzMsCisgIDB4MGIsICAweDBlLCAgMHgyMCwgIDB4NmUsICAweDBmLCAgMHhmZSwgIDB4NDQsICAweDkwLCAgMHgwNCwgIDB4ZmUsICAweGM0LCAgMHg5MywgIDB4M2EsICAweDBiLCAgMHhmZSwgIDB4YzYsCisgIDB4OTAsICAweDA0LCAgMHhmZSwgIDB4YzYsICAweDkzLCAgMHg3OSwgIDB4MGIsICAweDBlLCAgMHgxMCwgIDB4NmMsICAweDIyLCAgMHg2ZCwgIDB4MDEsICAweGZlLCAgMHhjZSwgIDB4MWUsCisgIDB4MDEsICAweGZlLCAgMHhkZSwgIDB4MWUsICAweDEwLCAgMHg2OCwgIDB4MjIsICAweDY5LCAgMHgwZiwgIDB4ZmUsICAweDQwLCAgMHg5MCwgIDB4MDQsICAweGZlLCAgMHhjMCwgIDB4OTMsCisgIDB4M2EsICAweDBiLCAgMHhmZSwgIDB4YzIsICAweDkwLCAgMHgwNCwgIDB4ZmUsICAweGMyLCAgMHg5MywgIDB4NzksICAweDBiLCAgMHgwZSwgIDB4MTAsICAweDRiLCAgMHgyMiwgIDB4NGMsCisgIDB4MTAsICAweDY0LCAgMHgyMiwgIDB4MzQsICAweDAxLCAgMHgwYywgIDB4NjEsICAweDI0LCAgMHg0NCwgIDB4MzcsICAweDEzLCAgMHhmZSwgIDB4NGUsICAweDExLCAgMHgyZiwgIDB4ZmUsCisgIDB4ZGUsICAweDA5LCAgMHhmZSwgIDB4OWUsICAweGYwLCAgMHhmZSwgIDB4ZjIsICAweDA5LCAgMHhmZSwgIDB4MDEsICAweDQ4LCAgMHgxYiwgIDB4M2MsICAweDM3LCAgMHg4OCwgIDB4ZjUsCisgIDB4ZDQsICAweGZlLCAgMHgxZSwgIDB4MGEsICAweGQ1LCAgMHhmZSwgIDB4NDIsICAweDBhLCAgMHhkMiwgIDB4ZmUsICAweDFlLCAgMHgwYSwgIDB4ZDMsICAweGZlLCAgMHg0MiwgIDB4MGEsCisgIDB4YWUsICAweGZlLCAgMHgxMiwgIDB4MGEsICAweGZlLCAgMHgwNiwgIDB4ZjAsICAweGZlLCAgMHgxOCwgIDB4MGEsICAweGFmLCAgMHhhMCwgIDB4MDUsICAweDI5LCAgMHgwMSwgIDB4NDEsCisgIDB4ZmUsICAweGMxLCAgMHgxMCwgIDB4MTQsICAweDI0LCAgMHhmZSwgIDB4YzEsICAweDEwLCAgMHgwMSwgIDB4NzYsICAweDA2LCAgMHgwNywgIDB4ZmUsICAweDE0LCAgMHgxMiwgIDB4MDEsCisgIDB4NzYsICAweDA2LCAgMHgwZCwgIDB4NWQsICAweDAxLCAgMHgwYywgIDB4MDYsICAweDBkLCAgMHhmZSwgIDB4NzQsICAweDEyLCAgMHhmZSwgIDB4MmUsICAweDFjLCAgMHgwNSwgIDB4ZmUsCisgIDB4MWEsICAweDBjLCAgMHgwMSwgIDB4NzYsICAweDA2LCAgMHgwNywgIDB4NWQsICAweDAxLCAgMHg3NiwgIDB4MDYsICAweDBkLCAgMHg0MSwgIDB4ZmUsICAweDJjLCAgMHgxYywgIDB4ZmUsCisgIDB4YWEsICAweGYwLCAgMHhmZSwgIDB4Y2UsICAweDBhLCAgMHhmZSwgIDB4YWMsICAweGYwLCAgMHhmZSwgIDB4NjYsICAweDBhLCAgMHhmZSwgIDB4OTIsICAweDEwLCAgMHhjNCwgIDB4ZjYsCisgIDB4ZmUsICAweGFkLCAgMHhmMCwgIDB4ZmUsICAweDcyLCAgMHgwYSwgIDB4MDUsICAweGZlLCAgMHgxYSwgIDB4MGMsICAweGM1LCAgMHhmZSwgIDB4ZTcsICAweDEwLCAgMHhmZSwgIDB4MmIsCisgIDB4ZjAsICAweGJmLCAgMHhmZSwgIDB4NmIsICAweDE4LCAgMHgyMywgIDB4ZmUsICAweDAwLCAgMHhmZSwgIDB4ZmUsICAweDFjLCAgMHgxMiwgIDB4YWMsICAweGZlLCAgMHhkMiwgIDB4ZjAsCisgIDB4YmYsICAweGZlLCAgMHg3NiwgIDB4MTgsICAweDIzLCAgMHgxZCwgIDB4MWIsICAweGJmLCAgMHgwMywgIDB4ZTMsICAweDIzLCAgMHgwNywgIDB4MWIsICAweGJmLCAgMHhkNCwgIDB4NWIsCisgIDB4ZDUsICAweDViLCAgMHhkMiwgIDB4NWIsICAweGQzLCAgMHg1YiwgIDB4YzQsICAweGM1LCAgMHhmZSwgIDB4YTksICAweDEwLCAgMHg3NSwgIDB4NWUsICAweDMyLCAgMHgxZiwgIDB4N2YsCisgIDB4MDEsICAweDQyLCAgMHgxOSwgIDB4ZmUsICAweDM1LCAgMHgwMCwgIDB4ZmUsICAweDAxLCAgMHhmMCwgIDB4NzAsICAweDE5LCAgMHg5OCwgIDB4MDUsICAweDcwLCAgMHhmZSwgIDB4NzQsCisgIDB4MTgsICAweDIzLCAgMHhmZSwgIDB4MDAsICAweGY4LCAgMHgxYiwgIDB4NWIsICAweDdkLCAgMHgxMiwgIDB4MDEsICAweGZlLCAgMHg3OCwgIDB4MGYsICAweDRkLCAgMHgwMSwgIDB4ZmUsCisgIDB4OTYsICAweDFhLCAgMHgyMSwgIDB4MzAsICAweDc3LCAgMHg3ZCwgIDB4MWQsICAweDA1LCAgMHg1YiwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MGQsICAweDJiLCAgMHhmZSwgIDB4ZTIsCisgIDB4MGIsICAweDAxLCAgMHgwYywgIDB4MDYsICAweDU0LCAgMHhmZSwgIDB4YTYsICAweDEyLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgyNCwgIDB4ZmUsICAweDg4LCAgMHgxMywgIDB4MjEsCisgIDB4NmUsICAweGM3LCAgMHgwMSwgIDB4ZmUsICAweDFlLCAgMHgxZiwgIDB4MGYsICAweGZlLCAgMHg4MywgIDB4ODAsICAweDA0LCAgMHhmZSwgIDB4ODMsICAweDgzLCAgMHhmZSwgIDB4YzksCisgIDB4NDcsICAweDBiLCAgMHgwZSwgIDB4ZmUsICAweGM4LCAgMHg0NCwgIDB4ZmUsICAweDQyLCAgMHgxMywgIDB4MGYsICAweGZlLCAgMHgwNCwgIDB4OTEsICAweDA0LCAgMHhmZSwgIDB4ODQsCisgIDB4OTMsICAweGZlLCAgMHhjYSwgIDB4NTcsICAweDBiLCAgMHhmZSwgIDB4ODYsICAweDkxLCAgMHgwNCwgIDB4ZmUsICAweDg2LCAgMHg5MywgIDB4ZmUsICAweGNiLCAgMHg1NywgIDB4MGIsCisgIDB4MGUsICAweDdhLCAgMHgzMCwgIDB4ZmUsICAweDQwLCAgMHg1OSwgIDB4ZmUsICAweGMxLCAgMHg1OSwgIDB4OGUsICAweDQwLCAgMHgwMywgIDB4NmEsICAweDNiLCAgMHg2YiwgIDB4MTAsCisgIDB4OTcsICAweDIyLCAgMHg5OCwgIDB4ZDksICAweDZhLCAgMHhkYSwgIDB4NmIsICAweDAxLCAgMHhjMiwgIDB4YzgsICAweDdhLCAgMHgzMCwgIDB4MjAsICAweDZlLCAgMHhkYiwgIDB4NjQsCisgIDB4ZGMsICAweDM0LCAgMHg5MSwgIDB4NmMsICAweDdlLCAgMHg2ZCwgIDB4ZmUsICAweDQ0LCAgMHg1NSwgIDB4ZmUsICAweGU1LCAgMHg1NSwgIDB4ZmUsICAweDA0LCAgMHhmYSwgIDB4NjQsCisgIDB4ZmUsICAweDA1LCAgMHhmYSwgIDB4MzQsICAweDAxLCAgMHhmZSwgIDB4NmEsICAweDE2LCAgMHhhMywgIDB4MjYsICAweDEwLCAgMHg5NywgIDB4MTAsICAweDk4LCAgMHg5MSwgIDB4NmMsCisgIDB4N2UsICAweDZkLCAgMHhmZSwgIDB4MTQsICAweDEwLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgyNCwgIDB4MWIsICAweDQwLCAgMHg5MSwgIDB4NGIsICAweDdlLCAgMHg0YywgIDB4MDEsCisgIDB4MGMsICAweDA2LCAgMHhmZSwgIDB4ZjcsICAweDAwLCAgMHg0NCwgIDB4MDMsICAweDY4LCAgMHgzYiwgIDB4NjksICAweGZlLCAgMHgxMCwgIDB4NTgsICAweGZlLCAgMHg5MSwgIDB4NTgsCisgIDB4ZmUsICAweDE0LCAgMHg1OSwgIDB4ZmUsICAweDk1LCAgMHg1OSwgIDB4MDUsICAweDViLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgyNCwgIDB4MWIsICAweDQwLCAgMHgwMSwgIDB4MGMsCisgIDB4MDYsICAweGZlLCAgMHhmNywgIDB4MDAsICAweDQ0LCAgMHg3OCwgIDB4MDEsICAweGZlLCAgMHg4ZSwgIDB4MWUsICAweDRmLCAgMHgwZiwgIDB4ZmUsICAweDEwLCAgMHg5MCwgIDB4MDQsCisgIDB4ZmUsICAweDkwLCAgMHg5MywgIDB4M2EsICAweDBiLCAgMHhmZSwgIDB4OTIsICAweDkwLCAgMHgwNCwgIDB4ZmUsICAweDkyLCAgMHg5MywgIDB4NzksICAweDBiLCAgMHgwZSwgIDB4ZmUsCisgIDB4YmQsICAweDEwLCAgMHgwMSwgIDB4NDMsICAweDA5LCAgMHhiYiwgIDB4MWIsICAweGZlLCAgMHg2ZSwgIDB4MGEsICAweDE1LCAgMHhiYiwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MGQsCisgIDB4ZmUsICAweDE0LCAgMHgxMywgIDB4MDMsICAweDRiLCAgMHgzYiwgIDB4NGMsICAweDhlLCAgMHhmZSwgIDB4NmUsICAweDBhLCAgMHhmZSwgIDB4MGMsICAweDU4LCAgMHhmZSwgIDB4OGQsCisgIDB4NTgsICAweDA1LCAgMHg1YiwgIDB4MjYsICAweDNlLCAgMHgwZiwgIDB4ZmUsICAweDE5LCAgMHg4MCwgIDB4MDQsICAweGZlLCAgMHg5OSwgIDB4ODMsICAweDMzLCAgMHgwYiwgIDB4MGUsCisgIDB4ZmUsICAweGU1LCAgMHgxMCwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MGQsICAweGZlLCAgMHgxYSwgIDB4MTIsICAweGZlLCAgMHg2YywgIDB4MTksICAweGZlLCAgMHgxOSwgIDB4NDEsCisgIDB4ZmUsICAweDZiLCAgMHgxOCwgIDB4YWMsICAweGZlLCAgMHhkMSwgIDB4ZjAsICAweGVmLCAgMHgxZiwgIDB4OTIsICAweDAxLCAgMHg0MiwgIDB4MTksICAweGZlLCAgMHg0NCwgIDB4MDAsCisgIDB4ZmUsICAweDkwLCAgMHgxMCwgIDB4ZmUsICAweDZjLCAgMHgxOSwgIDB4ZDksICAweDRiLCAgMHhmZSwgIDB4ZWQsICAweDE5LCAgMHhkYSwgIDB4NGMsICAweGZlLCAgMHgwYywgIDB4NTEsCisgIDB4ZmUsICAweDhlLCAgMHg1MSwgIDB4ZmUsICAweDZiLCAgMHgxOCwgIDB4MjMsICAweGZlLCAgMHgwMCwgIDB4ZmYsICAweDMxLCAgMHhmZSwgIDB4NzYsICAweDEwLCAgMHhhYywgIDB4ZmUsCisgIDB4ZDIsICAweGYwLCAgMHhmZSwgIDB4YmEsICAweDBjLCAgMHhmZSwgIDB4NzYsICAweDE4LCAgMHgyMywgIDB4MWQsICAweDVkLCAgMHgwMywgIDB4ZTMsICAweDIzLCAgMHgwNywgIDB4ZmUsCisgIDB4MDgsICAweDEzLCAgMHgxOSwgIDB4ZmUsICAweDE2LCAgMHgwMCwgIDB4MDUsICAweDcwLCAgMHhmZSwgIDB4ZDEsICAweGYwLCAgMHhmZSwgIDB4Y2MsICAweDBjLCAgMHgxZiwgIDB4OTIsCisgIDB4MDEsICAweDQyLCAgMHgxOSwgIDB4ZmUsICAweDE3LCAgMHgwMCwgIDB4NWMsICAweGZlLCAgMHhjZSwgIDB4ZjAsICAweGZlLCAgMHhkMiwgIDB4MGMsICAweGZlLCAgMHgzZSwgIDB4MTAsCisgIDB4ZmUsICAweGNkLCAgMHhmMCwgIDB4ZmUsICAweGRlLCAgMHgwYywgIDB4MTksICAweGZlLCAgMHgyMiwgIDB4MDAsICAweDA1LCAgMHg3MCwgIDB4ZmUsICAweGNiLCAgMHhmMCwgIDB4ZmUsCisgIDB4ZWEsICAweDBjLCAgMHgxOSwgIDB4ZmUsICAweDI0LCAgMHgwMCwgIDB4MDUsICAweDcwLCAgMHhmZSwgIDB4ZDAsICAweGYwLCAgMHhmZSwgIDB4ZjQsICAweDBjLCAgMHgxOSwgIDB4OTQsCisgIDB4ZmUsICAweDFjLCAgMHgxMCwgIDB4ZmUsICAweGNmLCAgMHhmMCwgIDB4ZmUsICAweGZlLCAgMHgwYywgIDB4MTksICAweDRhLCAgMHhmMywgIDB4ZmUsICAweGNjLCAgMHhmMCwgIDB4ZWYsCisgIDB4MDEsICAweDc2LCAgMHgwNiwgIDB4MjQsICAweDRkLCAgMHgxOSwgIDB4ZmUsICAweDEyLCAgMHgwMCwgIDB4MzcsICAweDEzLCAgMHhmZSwgIDB4NGUsICAweDExLCAgMHgyZiwgIDB4ZmUsCisgIDB4MTYsICAweDBkLCAgMHhmZSwgIDB4OWUsICAweGYwLCAgMHhmZSwgIDB4MmEsICAweDBkLCAgMHhmZSwgIDB4MDEsICAweDQ4LCAgMHgxYiwgIDB4M2MsICAweDM3LCAgMHg4OCwgIDB4ZjUsCisgIDB4ZDQsICAweDI5LCAgMHhkNSwgIDB4MjksICAweGQyLCAgMHgyOSwgIDB4ZDMsICAweDI5LCAgMHgzNywgIDB4ZmUsICAweDljLCAgMHgzMiwgIDB4MmYsICAweGZlLCAgMHgzZSwgIDB4MGQsCisgIDB4MmEsICAweDNjLCAgMHhhZSwgIDB4ZmUsICAweDYyLCAgMHgwZCwgIDB4YWYsICAweGEwLCAgMHhkNCwgIDB4OWYsICAweGQ1LCAgMHg5ZiwgIDB4ZDIsICAweDlmLCAgMHhkMywgIDB4OWYsCisgIDB4MDUsICAweDI5LCAgMHgwMSwgIDB4NDEsICAweGZlLCAgMHhkMywgIDB4MTAsICAweDE1LCAgMHhmZSwgIDB4ZTgsICAweDAwLCAgMHhjNCwgIDB4YzUsICAweDc1LCAgMHhkNywgIDB4OTksCisgIDB4ZDgsICAweDljLCAgMHhmZSwgIDB4ODksICAweGYwLCAgMHgyOSwgIDB4MjcsICAweDI1LCAgMHhiZSwgIDB4ZDcsICAweDk5LCAgMHhkOCwgIDB4OWMsICAweDJmLCAgMHhmZSwgIDB4OGMsCisgIDB4MGQsICAweDE2LCAgMHgyOSwgIDB4MjcsICAweDI1LCAgMHhiZCwgIDB4ZmUsICAweDAxLCAgMHg0OCwgIDB4YTQsICAweDE5LCAgMHhmZSwgIDB4NDIsICAweDAwLCAgMHgwNSwgIDB4NzAsCisgIDB4OTAsICAweDA3LCAgMHhmZSwgIDB4ODEsICAweDQ5LCAgMHgxYiwgIDB4ZmUsICAweDY0LCAgMHgwZSwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MGQsICAweGZlLCAgMHg0NCwgIDB4MTMsCisgIDB4MTksICAweDAwLCAgMHgyZCwgIDB4MGQsICAweGZlLCAgMHg1NCwgIDB4MTIsICAweDJkLCAgMHhmZSwgIDB4MjgsICAweDAwLCAgMHgyYiwgIDB4ZmUsICAweGRhLCAgMHgwZSwgIDB4MGEsCisgIDB4NTcsICAweDAxLCAgMHgxOCwgIDB4MDksICAweDAwLCAgMHgzNiwgIDB4NDYsICAweGZlLCAgMHgyOCwgIDB4MDAsICAweGZlLCAgMHhmYSwgIDB4MTAsICAweDAxLCAgMHhmZSwgIDB4ZjQsCisgIDB4MWMsICAweDAxLCAgMHhmZSwgIDB4MDAsICAweDFkLCAgMHgwYSwgIDB4YmEsICAweDAxLCAgMHhmZSwgIDB4NTgsICAweDEwLCAgMHg0MCwgIDB4MTUsICAweDU2LCAgMHgwMSwgIDB4ODUsCisgIDB4MDUsICAweDM1LCAgMHgxOSwgIDB4ZmUsICAweDQ0LCAgMHgwMCwgIDB4MmQsICAweDBkLCAgMHhmNywgIDB4NDYsICAweDBkLCAgMHhmZSwgIDB4Y2MsICAweDEwLCAgMHgwMSwgIDB4YTcsCisgIDB4NDYsICAweDBkLCAgMHhmZSwgIDB4YzIsICAweDEwLCAgMHgwMSwgIDB4YTcsICAweDBmLCAgMHhmZSwgIDB4MTksICAweDgyLCAgMHgwNCwgIDB4ZmUsICAweDk5LCAgMHg4MywgIDB4ZmUsCisgIDB4Y2MsICAweDQ3LCAgMHgwYiwgIDB4MGUsICAweGZlLCAgMHgzNCwgIDB4NDYsICAweGE1LCAgMHg0NiwgIDB4MGQsICAweDE5LCAgMHhmZSwgIDB4NDMsICAweDAwLCAgMHhmZSwgIDB4YTIsCisgIDB4MTAsICAweDAxLCAgMHgwYywgIDB4NjEsICAweDBkLCAgMHg0NCwgIDB4MDEsICAweGZlLCAgMHhmNCwgIDB4MWMsICAweDAxLCAgMHhmZSwgIDB4MDAsICAweDFkLCAgMHg0MCwgIDB4MTUsCisgIDB4NTYsICAweDAxLCAgMHg4NSwgIDB4N2QsICAweDBkLCAgMHg0MCwgIDB4NTEsICAweDAxLCAgMHhmZSwgIDB4OWUsICAweDFlLCAgMHgwNSwgIDB4ZmUsICAweDNhLCAgMHgwMywgIDB4MDEsCisgIDB4MGMsICAweDA2LCAgMHgwZCwgIDB4NWQsICAweDQ2LCAgMHgwZCwgIDB4MTksICAweDAwLCAgMHhmZSwgIDB4NjIsICAweDEwLCAgMHgwMSwgIDB4NzYsICAweDA2LCAgMHgxMiwgIDB4ZmUsCisgIDB4NWMsICAweDEyLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgxMiwgIDB4ZmUsICAweDUyLCAgMHgxMywgIDB4ZmUsICAweDFjLCAgMHgxYywgIDB4ZmUsICAweDlkLCAgMHhmMCwgIDB4ZmUsCisgIDB4OGUsICAweDBlLCAgMHhmZSwgIDB4MWMsICAweDFjLCAgMHhmZSwgIDB4OWQsICAweGYwLCAgMHhmZSwgIDB4OTQsICAweDBlLCAgMHgwMSwgIDB4MGMsICAweDYxLCAgMHgxMiwgIDB4NDQsCisgIDB4ZmUsICAweDlmLCAgMHgxMCwgIDB4MTksICAweGZlLCAgMHgxNSwgIDB4MDAsICAweGZlLCAgMHgwNCwgIDB4ZTYsICAweDBkLCAgMHg0ZiwgIDB4ZmUsICAweDJlLCAgMHgxMCwgIDB4MTksCisgIDB4ZmUsICAweDEzLCAgMHgwMCwgIDB4ZmUsICAweDEwLCAgMHgxMCwgIDB4MTksICAweGZlLCAgMHg0NywgIDB4MDAsICAweGYxLCAgMHgxOSwgIDB4ZmUsICAweDQxLCAgMHgwMCwgIDB4YTIsCisgIDB4MTksICAweGZlLCAgMHgyNCwgIDB4MDAsICAweDg2LCAgMHhjNCwgIDB4YzUsICAweDc1LCAgMHgwMywgIDB4ODEsICAweDFlLCAgMHgyYiwgIDB4ZWEsICAweDRmLCAgMHhmZSwgIDB4MDQsCisgIDB4ZTYsICAweDEyLCAgMHhmZSwgIDB4OWQsICAweDQxLCAgMHhmZSwgIDB4MWMsICAweDQyLCAgMHg0MCwgIDB4MDEsICAweGY0LCAgMHgwNSwgIDB4MzUsICAweGZlLCAgMHgxMiwgIDB4MWMsCisgIDB4MWYsICAweDBkLCAgMHg0NywgIDB4YjUsICAweGMzLCAgMHgxZiwgIDB4ZmUsICAweDMxLCAgMHgwMCwgIDB4NDcsICAweGI4LCAgMHgwMSwgIDB4ZmUsICAweGQ0LCAgMHgxMSwgIDB4MDUsCisgIDB4ZTksICAweDUxLCAgMHhmZSwgIDB4MDYsICAweGVjLCAgMHhlMCwgIDB4ZmUsICAweDBlLCAgMHg0NywgIDB4NDYsICAweDI4LCAgMHhmZSwgIDB4Y2UsICAweDQ1LCAgMHgzMSwgIDB4NTEsCisgIDB4ZmUsICAweDA2LCAgMHhlYSwgIDB4ZTAsICAweGZlLCAgMHg0NywgIDB4NGIsICAweDQ1LCAgMHhmZSwgIDB4NzUsICAweDU3LCAgMHgwMywgIDB4NjcsICAweGZlLCAgMHg5OCwgIDB4NTYsCisgIDB4ZmUsICAweDM4LCAgMHgxMiwgIDB4MGEsICAweDVhLCAgMHgwMSwgIDB4MTgsICAweGZlLCAgMHg0NCwgIDB4NDgsICAweDYwLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgyOCwgIDB4ZmUsCisgIDB4MTgsICAweDEzLCAgMHgwYSwgIDB4NTcsICAweDAxLCAgMHgxOCwgIDB4M2UsICAweGZlLCAgMHg0MSwgIDB4NTgsICAweDBhLCAgMHhiYSwgIDB4ZmUsICAweGZhLCAgMHgxNCwgIDB4ZmUsCisgIDB4NDksICAweDU0LCAgMHhiMCwgIDB4ZmUsICAweDVlLCAgMHgwZiwgIDB4MDUsICAweGZlLCAgMHgzYSwgIDB4MDMsICAweDBhLCAgMHg2NywgIDB4ZmUsICAweGUwLCAgMHgxNCwgIDB4ZmUsCisgIDB4MGUsICAweDQ3LCAgMHg0NiwgIDB4MjgsICAweGZlLCAgMHhjZSwgIDB4NDUsICAweDMxLCAgMHg1MSwgIDB4ZmUsICAweGNlLCAgMHg0NywgIDB4ZmUsICAweGFkLCAgMHgxMywgIDB4MDUsCisgIDB4MzUsICAweDIxLCAgMHgyYywgIDB4MDksICAweDFhLCAgMHhmZSwgIDB4OTgsICAweDEyLCAgMHgyNiwgIDB4MjAsICAweDk2LCAgMHgyMCwgIDB4ZTcsICAweGZlLCAgMHgwOCwgIDB4MWMsCisgIDB4ZmUsICAweDdjLCAgMHgxOSwgIDB4ZmUsICAweGZkLCAgMHgxOSwgIDB4ZmUsICAweDBhLCAgMHgxYywgIDB4MDMsICAweGU1LCAgMHhmZSwgIDB4NDgsICAweDU1LCAgMHhhNSwgIDB4M2IsCisgIDB4ZmUsICAweDYyLCAgMHgwMSwgIDB4ZmUsICAweGM5LCAgMHg1NSwgIDB4MzEsICAweGZlLCAgMHg3NCwgIDB4MTAsICAweDAxLCAgMHhmZSwgIDB4ZjAsICAweDFhLCAgMHgwMywgIDB4ZmUsCisgIDB4MzgsICAweDAxLCAgMHgzYiwgIDB4ZmUsICAweDNhLCAgMHgwMSwgIDB4OGUsICAweGZlLCAgMHgxZSwgIDB4MTAsICAweGZlLCAgMHgwMiwgIDB4ZWMsICAweGU3LCAgMHg1MywgIDB4MDAsCisgIDB4MzYsICAweGZlLCAgMHgwNCwgIDB4ZWMsICAweDJjLCAgMHg2MCwgIDB4ZmUsICAweDA1LCAgMHhmNiwgIDB4ZmUsICAweDM0LCAgMHgwMSwgIDB4MDEsICAweGZlLCAgMHg2MiwgIDB4MWIsCisgIDB4MDEsICAweGZlLCAgMHhjZSwgIDB4MWUsICAweGIyLCAgMHgxMSwgIDB4ZmUsICAweDE4LCAgMHgxMywgIDB4Y2EsICAweGZlLCAgMHgwMiwgIDB4ZWEsICAweGU3LCAgMHg1MywgIDB4OTIsCisgIDB4ZmUsICAweGMzLCAgMHgxMywgIDB4MWYsICAweDEyLCAgMHg0NywgIDB4YjUsICAweGMzLCAgMHhmZSwgIDB4MmEsICAweDEwLCAgMHgwMywgIDB4ZmUsICAweDM4LCAgMHgwMSwgIDB4MjMsCisgIDB4ZmUsICAweGYwLCAgMHhmZiwgIDB4MTAsICAweGU1LCAgMHgwMywgIDB4ZmUsICAweDNhLCAgMHgwMSwgIDB4MTAsICAweGZlLCAgMHg2MiwgIDB4MDEsICAweDAxLCAgMHhmZSwgIDB4MWUsCisgIDB4MWUsICAweDIwLCAgMHgyYywgIDB4MTUsICAweDU2LCAgMHgwMSwgIDB4ZmUsICAweDllLCAgMHgxZSwgIDB4MTMsICAweDA3LCAgMHgwMiwgIDB4MjYsICAweDAyLCAgMHgyMSwgIDB4OTYsCisgIDB4YzcsICAweDIwLCAgMHg5NiwgIDB4MDksICAweDkyLCAgMHhmZSwgIDB4NzksICAweDEzLCAgMHgxZiwgIDB4MWQsICAweDQ3LCAgMHhiNSwgIDB4YzMsICAweGZlLCAgMHhlMSwgIDB4MTAsCisgIDB4Y2YsICAweGZlLCAgMHgwMywgIDB4ZGMsICAweGZlLCAgMHg3MywgIDB4NTcsICAweGZlLCAgMHg4MCwgIDB4NWQsICAweDAyLCAgMHhjZiwgIDB4ZmUsICAweDAzLCAgMHhkYywgIDB4ZmUsCisgIDB4NWIsICAweDU3LCAgMHhmZSwgIDB4ODAsICAweDVkLCAgMHgwMiwgIDB4ZmUsICAweDAzLCAgMHg1NywgIDB4Y2YsICAweDI2LCAgMHhmZSwgIDB4MDAsICAweGNjLCAgMHgwMiwgIDB4ZmUsCisgIDB4MDMsICAweDU3LCAgMHhjZiwgIDB4ODksICAweDAyLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHg0YSwgIDB4ZmUsICAweDRlLCAgMHgxMywgIDB4MGYsICAweGZlLCAgMHgxYywgIDB4ODAsCisgIDB4MDQsICAweGZlLCAgMHg5YywgIDB4ODMsICAweDMzLCAgMHgwYiwgIDB4MGUsICAweDA5LCAgMHgwNywgIDB4ZmUsICAweDNhLCAgMHgxMywgIDB4MGYsICAweGZlLCAgMHgxZSwgIDB4ODAsCisgIDB4MDQsICAweGZlLCAgMHg5ZSwgIDB4ODMsICAweDMzLCAgMHgwYiwgIDB4MGUsICAweGZlLCAgMHgyYSwgIDB4MTMsICAweDBmLCAgMHhmZSwgIDB4MWQsICAweDgwLCAgMHgwNCwgIDB4ZmUsCisgIDB4OWQsICAweDgzLCAgMHhmZSwgIDB4ZjksICAweDEzLCAgMHgwZSwgIDB4ZmUsICAweDFjLCAgMHgxMywgIDB4MDEsICAweGZlLCAgMHhlZSwgIDB4MWUsICAweGFjLCAgMHhmZSwgIDB4MTQsCisgIDB4MTMsICAweDAxLCAgMHhmZSwgIDB4ZmUsICAweDFlLCAgMHhmZSwgIDB4ODEsICAweDU4LCAgMHhmYSwgIDB4MDEsICAweGZlLCAgMHgwZSwgIDB4MWYsICAweGZlLCAgMHgzMCwgIDB4ZjQsCisgIDB4MGQsICAweGZlLCAgMHgzYywgIDB4NTAsICAweGEyLCAgMHgwMSwgIDB4ZmUsICAweDkyLCAgMHgxYiwgIDB4MDEsICAweDQzLCAgMHgwOSwgIDB4NTYsICAweGZiLCAgMHgwMSwgIDB4ZmUsCisgIDB4YzgsICAweDFhLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgyOCwgIDB4YTQsICAweDAxLCAgMHhmZSwgIDB4ZjQsICAweDFjLCAgMHgwMSwgIDB4ZmUsICAweDAwLCAgMHgxZCwgIDB4MTUsCisgIDB4ZmUsICAweGU5LCAgMHgwMCwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4NGEsICAweGZlLCAgMHg0ZSwgIDB4MTMsICAweDAxLCAgMHhmZSwgIDB4MjIsICAweDFiLCAgMHhmZSwgIDB4MWUsCisgIDB4MWMsICAweDBmLCAgMHhmZSwgIDB4MTQsICAweDkwLCAgMHgwNCwgIDB4ZmUsICAweDk0LCAgMHg5MywgIDB4M2EsICAweDBiLCAgMHhmZSwgIDB4OTYsICAweDkwLCAgMHgwNCwgIDB4ZmUsCisgIDB4OTYsICAweDkzLCAgMHg3OSwgIDB4MGIsICAweDBlLCAgMHgxMCwgIDB4ZmUsICAweDY0LCAgMHgwMSwgIDB4MjIsICAweGZlLCAgMHg2NiwgIDB4MDEsICAweDAxLCAgMHgwYywgIDB4MDYsCisgIDB4NjUsICAweGY5LCAgMHgwZiwgIDB4ZmUsICAweDAzLCAgMHg4MCwgIDB4MDQsICAweGZlLCAgMHg4MywgIDB4ODMsICAweDMzLCAgMHgwYiwgIDB4MGUsICAweDc3LCAgMHhmZSwgIDB4MDEsCisgIDB4ZWMsICAweDJjLCAgMHhmZSwgIDB4ODAsICAweDQwLCAgMHgyMCwgIDB4MmMsICAweDdhLCAgMHgzMCwgIDB4MTUsICAweGRmLCAgMHg0MCwgIDB4MjEsICAweDJjLCAgMHhmZSwgIDB4MDAsCisgIDB4NDAsICAweDhkLCAgMHgyYywgIDB4MDIsICAweGZlLCAgMHgwOCwgIDB4MWMsICAweDAzLCAgMHhmZSwgIDB4YWMsICAweDAwLCAgMHhmZSwgIDB4MDYsICAweDU4LCAgMHgwMywgIDB4ZmUsCisgIDB4YWUsICAweDAwLCAgMHhmZSwgIDB4MDcsICAweDU4LCAgMHgwMywgIDB4ZmUsICAweGIwLCAgMHgwMCwgIDB4ZmUsICAweDA4LCAgMHg1OCwgIDB4MDMsICAweGZlLCAgMHhiMiwgIDB4MDAsCisgIDB4ZmUsICAweDA5LCAgMHg1OCwgIDB4ZmUsICAweDBhLCAgMHgxYywgIDB4MmUsICAweDQ5LCAgMHgyMCwgIDB4ZTAsICAweDI2LCAgMHgxMCwgIDB4NjYsICAweDEwLCAgMHg1NSwgIDB4MTAsCisgIDB4NmYsICAweDEzLCAgMHg1NywgIDB4NTIsICAweDRmLCAgMHgxYywgIDB4MjgsICAweGZlLCAgMHg5MCwgIDB4NGQsICAweGZlLCAgMHg5MSwgIDB4NTQsICAweDJiLCAgMHhmZSwgIDB4ODgsCisgIDB4MTEsICAweDQ2LCAgMHgxYSwgIDB4MTMsICAweDVhLCAgMHg1MiwgIDB4MWMsICAweDRhLCAgMHhmZSwgIDB4OTAsICAweDRkLCAgMHhmZSwgIDB4OTEsICAweDU0LCAgMHgyYiwgIDB4ZmUsCisgIDB4OWUsICAweDExLCAgMHgyZSwgIDB4MWEsICAweDIwLCAgMHgyYywgIDB4OTAsICAweDM0LCAgMHg2MCwgIDB4MjEsICAweDJjLCAgMHhmZSwgIDB4MDAsICAweDQwLCAgMHg4ZCwgIDB4MmMsCisgIDB4MTUsICAweGRmLCAgMHhmZSwgIDB4MTQsICAweDU2LCAgMHhmZSwgIDB4ZDYsICAweGYwLCAgMHhmZSwgIDB4YjIsICAweDExLCAgMHhmZSwgIDB4MTIsICAweDFjLCAgMHg3NSwgIDB4ZmUsCisgIDB4MTQsICAweDFjLCAgMHhmZSwgIDB4MTAsICAweDFjLCAgMHhmZSwgIDB4MTgsICAweDFjLCAgMHgwMiwgIDB4NTEsICAweGZlLCAgMHgwYywgIDB4MTQsICAweGZlLCAgMHgwZSwgIDB4NDcsCisgIDB4ZmUsICAweDA3LCAgMHhlNiwgIDB4MjgsICAweGZlLCAgMHhjZSwgIDB4NDcsICAweGZlLCAgMHhmNSwgIDB4MTMsICAweDAyLCAgMHgwMSwgIDB4YTcsICAweDkwLCAgMHgzNCwgIDB4NjAsCisgIDB4ZmUsICAweDA2LCAgMHg4MCwgIDB4ZmUsICAweDQ4LCAgMHg0NywgIDB4ZmUsICAweDQyLCAgMHgxMywgIDB4ZmUsICAweDAyLCAgMHg4MCwgIDB4MDksICAweDU2LCAgMHhmZSwgIDB4MzQsCisgIDB4MTMsICAweDBhLCAgMHg1YSwgIDB4MDEsICAweDE4LCAgMHhjYiwgIDB4ZmUsICAweDM2LCAgMHgxMiwgIDB4ZmUsICAweDQxLCAgMHg0OCwgIDB4ZmUsICAweDQ1LCAgMHg0OCwgIDB4MDEsCisgIDB4ZmUsICAweGIyLCAgMHgxNiwgIDB4ZmUsICAweDAwLCAgMHhjYywgIDB4Y2IsICAweGZlLCAgMHhmMywgIDB4MTMsICAweDNmLCAgMHg4OSwgIDB4MDksICAweDFhLCAgMHhhNSwgIDB4MGEsCisgIDB4OWQsICAweDAxLCAgMHgxOCwgIDB4ZmUsICAweDgwLCAgMHg1YywgIDB4MDEsICAweDg1LCAgMHhmMiwgIDB4MDksICAweDliLCAgMHhhNCwgIDB4ZmUsICAweDE0LCAgMHg1NiwgIDB4ZmUsCisgIDB4ZDYsICAweGYwLCAgMHhmZSwgIDB4ZWMsICAweDExLCAgMHgwMiwgIDB4ZmUsICAweDQ0LCAgMHg1OCwgIDB4NzcsICAweGZlLCAgMHgwMSwgIDB4ZWMsICAweGI4LCAgMHhmZSwgIDB4OWUsCisgIDB4NDAsICAweGZlLCAgMHg5ZCwgIDB4ZTcsICAweDAwLCAgMHhmZSwgIDB4OWMsICAweGU3LCAgMHgxMiwgIDB4OGQsICAweDMwLCAgMHgwMSwgIDB4ZjQsICAweGZlLCAgMHhkZCwgIDB4MTAsCisgIDB4MzcsICAweGQ3LCAgMHg5OSwgIDB4ZDgsICAweDljLCAgMHgyNywgIDB4MjUsICAweGVlLCAgMHgwOSwgIDB4MTIsICAweGZlLCAgMHg0OCwgIDB4MTIsICAweDA5LCAgMHgwZCwgIDB4ZmUsCisgIDB4NTYsICAweDEyLCAgMHgwOSwgIDB4MWQsICAweGZlLCAgMHgzMCwgIDB4MTIsICAweDA5LCAgMHhkZCwgIDB4MWIsICAweGZlLCAgMHhjNCwgIDB4MTMsICAweDA5LCAgMHhmZSwgIDB4MjMsCisgIDB4MDAsICAweDFiLCAgMHhmZSwgIDB4ZDAsICAweDEzLCAgMHgwOSwgIDB4MDcsICAweDFiLCAgMHhmZSwgIDB4MzQsICAweDE0LCAgMHgwOSwgIDB4MjQsICAweGZlLCAgMHgxMiwgIDB4MTIsCisgIDB4MDksICAweDAwLCAgMHgxYiwgIDB4MjksICAweDFmLCAgMHhkZCwgIDB4MDEsICAweDQyLCAgMHhhMSwgIDB4MzIsICAweDAxLCAgMHgwOCwgIDB4YWUsICAweDQxLCAgMHgwMiwgIDB4MzIsCisgIDB4ZmUsICAweDYyLCAgMHgwOCwgIDB4MGEsICAweGUxLCAgMHgwMSwgIDB4ZmUsICAweDU4LCAgMHgxMCwgIDB4MTUsICAweDliLCAgMHgwNSwgIDB4MzUsICAweDMyLCAgMHgwMSwgIDB4NDMsCisgIDB4MDksICAweGJiLCAgMHhmZSwgIDB4ZDcsICAweDEzLCAgMHg5MSwgIDB4NGIsICAweDdlLCAgMHg0YywgIDB4OGUsICAweGZlLCAgMHg4MCwgIDB4MTMsICAweDAxLCAgMHgwYywgIDB4MDYsCisgIDB4NTQsICAweGZlLCAgMHg3MiwgIDB4MTIsICAweGRiLCAgMHg2NCwgIDB4ZGMsICAweDM0LCAgMHhmZSwgIDB4NDQsICAweDU1LCAgMHhmZSwgIDB4ZTUsICAweDU1LCAgMHhiMCwgIDB4ZmUsCisgIDB4NGEsICAweDEzLCAgMHgyMSwgIDB4NmUsICAweGZlLCAgMHgyNiwgIDB4MTMsICAweDAzLCAgMHg5NywgIDB4M2IsICAweDk4LCAgMHg4ZSwgIDB4ZmUsICAweGI2LCAgMHgwZSwgIDB4MTAsCisgIDB4NmEsICAweDIyLCAgMHg2YiwgIDB4MjYsICAweDEwLCAgMHg5NywgIDB4MTAsICAweDk4LCAgMHgwMSwgIDB4YzIsICAweDJlLCAgMHg0OSwgIDB4ODgsICAweDIwLCAgMHg2ZSwgIDB4MDEsCisgIDB4ZmUsICAweDZhLCAgMHgxNiwgIDB4ZGIsICAweDY0LCAgMHhkYywgIDB4MzQsICAweGZlLCAgMHgwNCwgIDB4NTUsICAweGZlLCAgMHhhNSwgIDB4NTUsICAweGZlLCAgMHgwNCwgIDB4ZmEsCisgIDB4NjQsICAweGZlLCAgMHgwNSwgIDB4ZmEsICAweDM0LCAgMHhmZSwgIDB4OGYsICAweDEwLCAgMHgwMywgIDB4NmMsICAweDNiLCAgMHg2ZCwgIDB4ZmUsICAweDQwLCAgMHg1NiwgIDB4ZmUsCisgIDB4ZTEsICAweDU2LCAgMHgxMCwgIDB4NmMsICAweDIyLCAgMHg2ZCwgIDB4NzEsICAweGRiLCAgMHg2NCwgIDB4ZGMsICAweDM0LCAgMHhmZSwgIDB4NDQsICAweDU1LCAgMHhmZSwgIDB4ZTUsCisgIDB4NTUsICAweDAzLCAgMHg2OCwgIDB4M2IsICAweDY5LCAgMHhmZSwgIDB4MDAsICAweDU2LCAgMHhmZSwgIDB4YTEsICAweDU2LCAgMHgxMCwgIDB4NjgsICAweDIyLCAgMHg2OSwgIDB4MDEsCisgIDB4MGMsICAweDA2LCAgMHg1NCwgIDB4ZjksICAweDIxLCAgMHg2ZSwgIDB4ZmUsICAweDFmLCAgMHg0MCwgIDB4MDMsICAweDZhLCAgMHgzYiwgIDB4NmIsICAweGZlLCAgMHgyYywgIDB4NTAsCisgIDB4ZmUsICAweGFlLCAgMHg1MCwgIDB4MDMsICAweDZjLCAgMHgzYiwgIDB4NmQsICAweGZlLCAgMHg0NCwgIDB4NTAsICAweGZlLCAgMHhjNiwgIDB4NTAsICAweDAzLCAgMHg2OCwgIDB4M2IsCisgIDB4NjksICAweGZlLCAgMHgwOCwgIDB4NTAsICAweGZlLCAgMHg4YSwgIDB4NTAsICAweDAzLCAgMHg0YiwgIDB4M2IsICAweDRjLCAgMHhmZSwgIDB4NDAsICAweDUwLCAgMHhmZSwgIDB4YzIsCisgIDB4NTAsICAweDA1LCAgMHg3MywgIDB4MmUsICAweDA3LCAgMHgyMCwgIDB4OWUsICAweDA1LCAgMHg3MiwgIDB4MzIsICAweDAxLCAgMHgwOCwgIDB4MTYsICAweDNkLCAgMHgyNywgIDB4MjUsCisgIDB4ZWUsICAweDA5LCAgMHgwNywgIDB4MmIsICAweDNkLCAgMHgwMSwgIDB4NDMsICAweDA5LCAgMHhiYiwgIDB4MmIsICAweDcyLCAgMHgwMSwgIDB4YTYsICAweDIzLCAgMHgzZiwgIDB4MWIsCisgIDB4M2QsICAweDAxLCAgMHgwYywgIDB4MDYsICAweDBkLCAgMHhmZSwgIDB4MWUsICAweDEzLCAgMHg5MSwgIDB4NGIsICAweDdlLCAgMHg0YywgIDB4ZmUsICAweDBhLCAgMHg1NSwgIDB4MzEsCisgIDB4ZmUsICAweDhiLCAgMHg1NSwgIDB4ZDksICAweDRiLCAgMHhkYSwgIDB4NGMsICAweGZlLCAgMHgwYywgIDB4NTEsICAweGZlLCAgMHg4ZSwgIDB4NTEsICAweDA1LCAgMHg3MiwgIDB4MDEsCisgIDB4ZmUsICAweDhlLCAgMHgxZSwgIDB4Y2EsICAweGZlLCAgMHgxOSwgIDB4NDEsICAweDA1LCAgMHg3MiwgIDB4MzIsICAweDAxLCAgMHgwOCwgIDB4MmEsICAweDNjLCAgMHgxNiwgIDB4YzAsCisgIDB4MjcsICAweDI1LCAgMHhiZSwgIDB4MmQsICAweDFkLCAgMHhjMCwgIDB4MmQsICAweDBkLCAgMHg4MywgIDB4MmQsICAweDdmLCAgMHgxYiwgIDB4ZmUsICAweDY2LCAgMHgxNSwgIDB4MDUsCisgIDB4M2QsICAweDAxLCAgMHgwOCwgIDB4MmEsICAweDNjLCAgMHgxNiwgIDB4YzAsICAweDI3LCAgMHgyNSwgIDB4YmQsICAweDA5LCAgMHgxZCwgIDB4MmIsICAweDNkLCAgMHgwMSwgIDB4MDgsCisgIDB4MTYsICAweGMwLCAgMHgyNywgIDB4MjUsICAweGZlLCAgMHhlOCwgIDB4MDksICAweGZlLCAgMHhjMiwgIDB4NDksICAweDUwLCAgMHgwMywgIDB4YjYsICAweDFlLCAgMHg4MywgIDB4MDEsCisgIDB4MzgsICAweDA2LCAgMHgyNCwgIDB4MzEsICAweGExLCAgMHhmZSwgIDB4YmIsICAweDQ1LCAgMHgyZCwgIDB4MDAsICAweGE0LCAgMHg0NiwgIDB4MDcsICAweDkwLCAgMHgzZiwgIDB4MDEsCisgIDB4ZmUsICAweGY4LCAgMHgxNSwgIDB4MDEsICAweGE2LCAgMHg4NiwgIDB4ZmUsICAweDRiLCAgMHg0NSwgIDB4ZmUsICAweDIwLCAgMHgxMywgIDB4MDEsICAweDQzLCAgMHgwOSwgIDB4ODIsCisgIDB4ZmUsICAweDE2LCAgMHgxMywgIDB4MDMsICAweDlhLCAgMHgxZSwgIDB4NWQsICAweDAzLCAgMHg1NSwgIDB4MWUsICAweDMxLCAgMHg1ZSwgIDB4MDUsICAweDcyLCAgMHhmZSwgIDB4YzAsCisgIDB4NWQsICAweDAxLCAgMHhhNywgIDB4ZmUsICAweDAzLCAgMHgxNywgIDB4MDMsICAweDY2LCAgMHg4YSwgIDB4MTAsICAweDY2LCAgMHg1ZSwgIDB4MzIsICAweDAxLCAgMHgwOCwgIDB4MTcsCisgIDB4NzMsICAweDAxLCAgMHhmZSwgIDB4NTYsICAweDE5LCAgMHgwNSwgIDB4NzMsICAweDAxLCAgMHgwOCwgIDB4MmEsICAweDNjLCAgMHgxNiwgIDB4M2QsICAweDI3LCAgMHgyNSwgIDB4YmQsCisgIDB4MDksICAweDA3LCAgMHgyYiwgIDB4M2QsICAweDAxLCAgMHhmZSwgIDB4YmUsICAweDE2LCAgMHhmZSwgIDB4NDIsICAweDU4LCAgMHhmZSwgIDB4ZTgsICAweDE0LCAgMHgwMSwgIDB4YTYsCisgIDB4ODYsICAweGZlLCAgMHg0YSwgIDB4ZjQsICAweDBkLCAgMHgxYiwgIDB4M2QsICAweGZlLCAgMHg0YSwgIDB4ZjQsICAweDA3LCAgMHhmZSwgIDB4MGUsICAweDEyLCAgMHgwMSwgIDB4NDMsCisgIDB4MDksICAweDgyLCAgMHg0ZSwgIDB4MDUsICAweDcyLCAgMHgwMywgIDB4NTUsICAweDhhLCAgMHgxMCwgIDB4NTUsICAweDVlLCAgMHgzMiwgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4NzMsCisgIDB4MDEsICAweGZlLCAgMHg4NCwgIDB4MTksICAweDA1LCAgMHg3MywgIDB4MDEsICAweDA4LCAgMHgyYSwgIDB4M2MsICAweDE2LCAgMHgzZCwgIDB4MjcsICAweDI1LCAgMHhiZCwgIDB4MDksCisgIDB4MTIsICAweDJiLCAgMHgzZCwgIDB4MDEsICAweGZlLCAgMHhlOCwgIDB4MTcsICAweDhiLCAgMHhmZSwgIDB4YWEsICAweDE0LCAgMHhmZSwgIDB4YjYsICAweDE0LCAgMHg4NiwgIDB4YTgsCisgIDB4YjIsICAweDBkLCAgMHgxYiwgIDB4M2QsICAweGIyLCAgMHgwNywgIDB4ZmUsICAweDBlLCAgMHgxMiwgIDB4MDEsICAweDQzLCAgMHgwOSwgIDB4ODIsICAweDRlLCAgMHgwNSwgIDB4NzIsCisgIDB4MDMsICAweDZmLCAgMHg4YSwgIDB4MTAsICAweDZmLCAgMHg1ZSwgIDB4MzIsICAweDAxLCAgMHgwOCwgIDB4MTcsICAweDczLCAgMHgwMSwgIDB4ZmUsICAweGMwLCAgMHgxOSwgIDB4MDUsCisgIDB4NzMsICAweDEzLCAgMHgwNywgIDB4MmYsICAweGZlLCAgMHhjYywgIDB4MTUsICAweDE3LCAgMHhmZSwgIDB4ZTIsICAweDE1LCAgMHg1ZiwgIDB4Y2MsICAweDAxLCAgMHgwOCwgIDB4MjYsCisgIDB4NWYsICAweDAyLCAgMHg4ZiwgIDB4ZmUsICAweGRlLCAgMHgxNSwgIDB4MmEsICAweGZlLCAgMHhkZSwgIDB4MTUsICAweDE2LCAgMHhmZSwgIDB4Y2MsICAweDE1LCAgMHg1ZSwgIDB4MzIsCisgIDB4MDEsICAweDA4LCAgMHhmZSwgIDB4ZDUsICAweDEwLCAgMHgxMywgIDB4NTgsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU3LCAgMHg1MiwgIDB4YWQsICAweDIzLCAgMHhmZSwgIDB4ZmYsCisgIDB4N2YsICAweGZlLCAgMHgzMCwgIDB4NTYsICAweGZlLCAgMHgwMCwgIDB4NWMsICAweDAyLCAgMHgxMywgIDB4NTgsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU3LCAgMHg1MiwgIDB4YWQsCisgIDB4MjMsICAweDNmLCAgMHhmZSwgIDB4MzAsICAweDU2LCAgMHhmZSwgIDB4MDAsICAweDVjLCAgMHgwMiwgIDB4MTMsICAweDU4LCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHg1NywgIDB4NTIsCisgIDB4YWQsICAweDAyLCAgMHgxMywgIDB4NTgsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU3LCAgMHg1MiwgIDB4ZmUsICAweDAwLCAgMHg1ZSwgIDB4MDIsICAweDEzLCAgMHg1OCwgIDB4ZmYsCisgIDB4MDIsICAweDAwLCAgMHg1NywgIDB4NTIsICAweGFkLCAgMHhmZSwgIDB4MGIsICAweDU4LCAgMHgwMiwgIDB4MGEsICAweDY2LCAgMHgwMSwgIDB4NWMsICAweDBhLCAgMHg1NSwgIDB4MDEsCisgIDB4NWMsICAweDBhLCAgMHg2ZiwgIDB4MDEsICAweDVjLCAgMHgwMiwgIDB4MDEsICAweGZlLCAgMHgxZSwgIDB4MWYsICAweDIzLCAgMHgxYSwgIDB4ZmYsICAweDAzLCAgMHgwMCwgIDB4NTQsCisgIDB4ZmUsICAweDAwLCAgMHhmNCwgIDB4MjQsICAweDUyLCAgMHgwZiwgIDB4ZmUsICAweDAwLCAgMHg3YywgIDB4MDQsICAweGZlLCAgMHgwNywgIDB4N2MsICAweDNhLCAgMHgwYiwgIDB4MGUsCisgIDB4ZmUsICAweDAwLCAgMHg3MSwgIDB4ZmUsICAweGY5LCAgMHgxOCwgIDB4ZmUsICAweDdhLCAgMHgxOSwgIDB4ZmUsICAweGZiLCAgMHgxOSwgIDB4ZmUsICAweDFhLCAgMHhmNywgIDB4MDAsCisgIDB4ZmUsICAweDFiLCAgMHhmNywgIDB4MDAsICAweDdhLCAgMHgzMCwgIDB4MTAsICAweDY4LCAgMHgyMiwgIDB4NjksICAweGQ5LCAgMHg2YywgIDB4ZGEsICAweDZkLCAgMHgwMiwgIDB4ZmUsCisgIDB4NjIsICAweDA4LCAgMHhmZSwgIDB4ODIsICAweDRhLCAgMHhmZSwgIDB4ZTEsICAweDFhLCAgMHhmZSwgIDB4ODMsICAweDVhLCAgMHg3NywgIDB4MDIsICAweDAxLCAgMHhjNiwgIDB4ZmUsCisgIDB4NDIsICAweDQ4LCAgMHg0ZiwgIDB4NTAsICAweDQ1LCAgMHgwMSwgIDB4MDgsICAweDE2LCAgMHhmZSwgIDB4ZTAsICAweDE3LCAgMHgyNywgIDB4MjUsICAweGJlLCAgMHgwMSwgIDB4MDgsCisgIDB4MTYsICAweGZlLCAgMHhlMCwgIDB4MTcsICAweDI3LCAgMHgyNSwgIDB4ZmUsICAweGU4LCAgMHgwYSwgIDB4ZmUsICAweGMxLCAgMHg1OSwgIDB4MDMsICAweDlhLCAgMHgxZSwgIDB4ZmUsCisgIDB4ZGEsICAweDEyLCAgMHgwMSwgIDB4MzgsICAweDA2LCAgMHgxMiwgIDB4ZmUsICAweGQwLCAgMHgxMywgIDB4MjYsICAweDUzLCAgMHgxMiwgIDB4NDgsICAweGZlLCAgMHgwOCwgIDB4MTcsCisgIDB4ZDEsICAweDEyLCAgMHg1MywgIDB4MTIsICAweGZlLCAgMHgxZSwgIDB4MTMsICAweDJkLCAgMHhiNCwgIDB4N2IsICAweGZlLCAgMHgyNiwgIDB4MTcsICAweDRkLCAgMHgxMywgIDB4MDcsCisgIDB4MWMsICAweGI0LCAgMHg5MCwgIDB4MDQsICAweGZlLCAgMHg3OCwgIDB4MTAsICAweGZmLCAgMHgwMiwgIDB4ODMsICAweDU1LCAgMHhmMSwgIDB4ZmYsICAweDAyLCAgMHg4MywgIDB4NTUsCisgIDB4NTMsICAweDFkLCAgMHhmZSwgIDB4MTIsICAweDEzLCAgMHhkNiwgIDB4ZmUsICAweDMwLCAgMHgwMCwgIDB4YjAsICAweGZlLCAgMHg4MCwgIDB4MTcsICAweDFjLCAgMHg2MywgIDB4MTMsCisgIDB4MDcsICAweGZlLCAgMHg1NiwgIDB4MTAsICAweDUzLCAgMHgwZCwgIDB4ZmUsICAweDE2LCAgMHgxMywgIDB4ZDYsICAweGZlLCAgMHg2NCwgIDB4MDAsICAweGIwLCAgMHhmZSwgIDB4ODAsCisgIDB4MTcsICAweDBhLCAgMHhmZSwgIDB4NjQsICAweDAwLCAgMHgxYywgIDB4OTQsICAweDEzLCAgMHgwNywgIDB4ZmUsICAweDI4LCAgMHgxMCwgIDB4NTMsICAweDA3LCAgMHhmZSwgIDB4NjAsCisgIDB4MTMsICAweGQ2LCAgMHhmZSwgIDB4YzgsICAweDAwLCAgMHhiMCwgIDB4ZmUsICAweDgwLCAgMHgxNywgIDB4MGEsICAweGZlLCAgMHhjOCwgIDB4MDAsICAweDFjLCAgMHg5NSwgIDB4MTMsCisgIDB4MDcsICAweDcxLCAgMHhkNiwgIDB4ZmUsICAweDkwLCAgMHgwMSwgIDB4NDgsICAweGZlLCAgMHg4YywgIDB4MTcsICAweDQ1LCAgMHhmMywgIDB4ZmUsICAweDQzLCAgMHhmNCwgIDB4OTYsCisgIDB4ZmUsICAweDU2LCAgMHhmMCwgIDB4ZmUsICAweDllLCAgMHgxNywgIDB4ZmUsICAweDA0LCAgMHhmNCwgIDB4NTgsICAweGZlLCAgMHg0MywgIDB4ZjQsICAweDk0LCAgMHhmNiwgIDB4OGIsCisgIDB4MDEsICAweGZlLCAgMHgyNCwgIDB4MTYsICAweDIzLCAgMHgzZiwgIDB4ZmMsICAweGE4LCAgMHg4YywgIDB4NDksICAweDQ4LCAgMHhmZSwgIDB4ZGEsICAweDE3LCAgMHg2MiwgIDB4NDksCisgIDB4ZmUsICAweDFjLCAgMHgxMCwgIDB4YTgsICAweDhjLCAgMHg4MCwgIDB4NDgsICAweGZlLCAgMHhkYSwgIDB4MTcsICAweDYyLCAgMHg4MCwgIDB4NzEsICAweDUwLCAgMHgyNiwgIDB4ZmUsCisgIDB4NGQsICAweGY0LCAgMHgwMCwgIDB4ZjcsICAweDQ1LCAgMHgxMywgIDB4MDcsICAweGZlLCAgMHhiNCwgIDB4NTYsICAweGZlLCAgMHhjMywgIDB4NTgsICAweDAyLCAgMHg1MCwgIDB4MTMsCisgIDB4MGQsICAweDAyLCAgMHg1MCwgIDB4M2UsICAweDc4LCAgMHg0ZiwgIDB4NDUsICAweDAxLCAgMHgwOCwgIDB4MTYsICAweGE5LCAgMHgyNywgIDB4MjUsICAweGJlLCAgMHhmZSwgIDB4MDMsCisgIDB4ZWEsICAweGZlLCAgMHg3ZSwgIDB4MDEsICAweDAxLCAgMHgwOCwgIDB4MTYsICAweGE5LCAgMHgyNywgIDB4MjUsICAweGZlLCAgMHhlOSwgIDB4MGEsICAweDAxLCAgMHgwOCwgIDB4MTYsCisgIDB4YTksICAweDI3LCAgMHgyNSwgIDB4ZmUsICAweGU5LCAgMHgwYSwgIDB4ZmUsICAweDA1LCAgMHhlYSwgIDB4ZmUsICAweDdmLCAgMHgwMSwgIDB4MDEsICAweDA4LCAgMHgxNiwgIDB4YTksCisgIDB4MjcsICAweDI1LCAgMHhmZSwgIDB4NjksICAweDA5LCAgMHhmZSwgIDB4MDIsICAweGVhLCAgMHhmZSwgIDB4ODAsICAweDAxLCAgMHgwMSwgIDB4MDgsICAweDE2LCAgMHhhOSwgIDB4MjcsCisgIDB4MjUsICAweGZlLCAgMHhlOCwgIDB4MDgsICAweDQ3LCAgMHhmZSwgIDB4ODEsICAweDAxLCAgMHgwMywgIDB4YjYsICAweDFlLCAgMHg4MywgIDB4MDEsICAweDM4LCAgMHgwNiwgIDB4MjQsCisgIDB4MzEsICAweGEyLCAgMHg3OCwgIDB4ZjIsICAweDUzLCAgMHgwNywgIDB4MzYsICAweGZlLCAgMHgzNCwgIDB4ZjQsICAweDNmLCAgMHhhMSwgIDB4NzgsICAweDAzLCAgMHg5YSwgIDB4MWUsCisgIDB4ODMsICAweDAxLCAgMHgzOCwgIDB4MDYsICAweDEyLCAgMHgzMSwgIDB4ZjAsICAweDRmLCAgMHg0NSwgIDB4ZmUsICAweDkwLCAgMHgxMCwgIDB4ZmUsICAweDQwLCAgMHg1YSwgIDB4MjMsCisgIDB4M2YsICAweGZiLCAgMHg4YywgIDB4NDksICAweDQ4LCAgMHhmZSwgIDB4YWEsICAweDE4LCAgMHg2MiwgIDB4NDksICAweDcxLCAgMHg4YywgIDB4ODAsICAweDQ4LCAgMHhmZSwgIDB4YWEsCisgIDB4MTgsICAweDYyLCAgMHg4MCwgIDB4ZmUsICAweGI0LCAgMHg1NiwgIDB4ZmUsICAweDQwLCAgMHg1ZCwgIDB4MDEsICAweGM2LCAgMHgwMSwgIDB4ZmUsICAweGFjLCAgMHgxZCwgIDB4ZmUsCisgIDB4MDIsICAweDE3LCAgMHhmZSwgIDB4YzgsICAweDQ1LCAgMHhmZSwgIDB4NWEsICAweGYwLCAgMHhmZSwgIDB4YzAsICAweDE4LCAgMHhmZSwgIDB4NDMsICAweDQ4LCAgMHgyZCwgIDB4OTMsCisgIDB4MzYsICAweGZlLCAgMHgzNCwgIDB4ZjQsICAweGZlLCAgMHgwMCwgIDB4MTEsICAweGZlLCAgMHg0MCwgIDB4MTAsICAweDJkLCAgMHhiNCwgIDB4MzYsICAweGZlLCAgMHgzNCwgIDB4ZjQsCisgIDB4MDQsICAweGZlLCAgMHgzNCwgIDB4MTAsICAweDJkLCAgMHhmZSwgIDB4MGIsICAweDAwLCAgMHgzNiwgIDB4NDYsICAweDYzLCAgMHhmZSwgIDB4MjgsICAweDEwLCAgMHhmZSwgIDB4YzAsCisgIDB4NDksICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU0LCAgMHhiMiwgIDB4ZmUsICAweDkwLCAgMHgwMSwgIDB4NDgsICAweGZlLCAgMHhmYSwgIDB4MTgsICAweDQ1LCAgMHhmZSwgIDB4MWMsCisgIDB4ZjQsICAweDNmLCAgMHhmMywgIDB4ZmUsICAweDQwLCAgMHhmNCwgIDB4OTYsICAweGZlLCAgMHg1NiwgIDB4ZjAsICAweGZlLCAgMHgwYywgIDB4MTksICAweGZlLCAgMHgwNCwgIDB4ZjQsCisgIDB4NTgsICAweGZlLCAgMHg0MCwgIDB4ZjQsICAweDk0LCAgMHhmNiwgIDB4M2UsICAweDJkLCAgMHg5MywgIDB4NGUsICAweGQwLCAgMHgwZCwgIDB4MjEsICAweGZlLCAgMHg3ZiwgIDB4MDEsCisgIDB4ZmUsICAweGM4LCAgMHg0NiwgIDB4ZmUsICAweDI0LCAgMHgxMywgIDB4OGMsICAweDAwLCAgMHg1ZCwgIDB4MjYsICAweDIxLCAgMHhmZSwgIDB4N2UsICAweDAxLCAgMHhmZSwgIDB4YzgsCisgIDB4NDUsICAweGZlLCAgMHgxNCwgIDB4MTMsICAweDIxLCAgMHhmZSwgIDB4ODAsICAweDAxLCAgMHhmZSwgIDB4NDgsICAweDQ1LCAgMHhmYSwgIDB4MjEsICAweGZlLCAgMHg4MSwgIDB4MDEsCisgIDB4ZmUsICAweGM4LCAgMHg0NCwgIDB4NGUsICAweDI2LCAgMHgwMiwgIDB4MTMsICAweDA3LCAgMHgwMiwgIDB4NzgsICAweDQ1LCAgMHg1MCwgIDB4MTMsICAweDBkLCAgMHgwMiwgIDB4MTQsCisgIDB4MDcsICAweDAxLCAgMHgwOCwgIDB4MTcsICAweGZlLCAgMHg4MiwgIDB4MTksICAweDE0LCAgMHgwZCwgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4ZmUsICAweDgyLCAgMHgxOSwgIDB4MTQsCisgIDB4MWQsICAweDAxLCAgMHgwOCwgIDB4MTcsICAweGZlLCAgMHg4MiwgIDB4MTksICAweDVmLCAgMHhmZSwgIDB4ODksICAweDQ5LCAgMHgwMSwgIDB4MDgsICAweDAyLCAgMHgxNCwgIDB4MDcsCisgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4YzEsICAweDE0LCAgMHgxZCwgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4YzEsICAweDE0LCAgMHgwNywgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4YzEsCisgIDB4ZmUsICAweDg5LCAgMHg0OSwgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4YzEsICAweDVmLCAgMHhmZSwgIDB4ODksICAweDRhLCAgMHgwMSwgIDB4MDgsICAweDAyLCAgMHg1MCwgIDB4MDIsCisgIDB4MTQsICAweDA3LCAgMHgwMSwgIDB4MDgsICAweDE3LCAgMHg3NCwgIDB4MTQsICAweDdmLCAgMHgwMSwgIDB4MDgsICAweDE3LCAgMHg3NCwgIDB4MTQsICAweDEyLCAgMHgwMSwgIDB4MDgsCisgIDB4MTcsICAweDc0LCAgMHhmZSwgIDB4ODksICAweDQ5LCAgMHgwMSwgIDB4MDgsICAweDE3LCAgMHg3NCwgIDB4MTQsICAweDAwLCAgMHgwMSwgIDB4MDgsICAweDE3LCAgMHg3NCwgIDB4ZmUsCisgIDB4ODksICAweDRhLCAgMHgwMSwgIDB4MDgsICAweDE3LCAgMHg3NCwgIDB4ZmUsICAweDA5LCAgMHg0OSwgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4NzQsICAweDVmLCAgMHhjYywgIDB4MDEsCisgIDB4MDgsICAweDAyLCAgMHgyMSwgIDB4ZTQsICAweDA5LCAgMHgwNywgIDB4ZmUsICAweDRjLCAgMHgxMywgIDB4YzgsICAweDIwLCAgMHhlNCwgIDB4ZmUsICAweDQ5LCAgMHhmNCwgIDB4MDAsCisgIDB4NGQsICAweDVmLCAgMHhhMSwgIDB4NWUsICAweGZlLCAgMHgwMSwgIDB4ZWMsICAweGZlLCAgMHgyNywgIDB4MDEsICAweGNjLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHgxMCwgIDB4MmYsCisgIDB4ZmUsICAweDNlLCAgMHgxYSwgIDB4MDEsICAweDQzLCAgMHgwOSwgIDB4ZmUsICAweGUzLCAgMHgwMCwgIDB4ZmUsICAweDIyLCAgMHgxMywgIDB4MTYsICAweGZlLCAgMHg2NCwgIDB4MWEsCisgIDB4MjYsICAweDIwLCAgMHg5ZSwgIDB4MDEsICAweDQxLCAgMHgyMSwgIDB4OWUsICAweDA5LCAgMHgwNywgIDB4NWQsICAweDAxLCAgMHgwYywgIDB4NjEsICAweDA3LCAgMHg0NCwgIDB4MDIsCisgIDB4MGEsICAweDVhLCAgMHgwMSwgIDB4MTgsICAweGZlLCAgMHgwMCwgIDB4NDAsICAweGFhLCAgMHgwOSwgIDB4MWEsICAweGZlLCAgMHgxMiwgIDB4MTMsICAweDBhLCAgMHg5ZCwgIDB4MDEsCisgIDB4MTgsICAweGFhLCAgMHgwYSwgIDB4NjcsICAweDAxLCAgMHhhMywgIDB4MDIsICAweDBhLCAgMHg5ZCwgIDB4MDEsICAweDE4LCAgMHhhYSwgIDB4ZmUsICAweDgwLCAgMHhlNywgIDB4MWEsCisgIDB4MDksICAweDFhLCAgMHg1ZCwgIDB4ZmUsICAweDQ1LCAgMHg1OCwgIDB4MDEsICAweGZlLCAgMHhiMiwgIDB4MTYsICAweGFhLCAgMHgwMiwgIDB4MGEsICAweDVhLCAgMHgwMSwgIDB4MTgsCisgIDB4YWEsICAweDBhLCAgMHg2NywgIDB4MDEsICAweGEzLCAgMHgwMiwgIDB4MGEsICAweDVhLCAgMHgwMSwgIDB4MTgsICAweDAxLCAgMHhmZSwgIDB4N2UsICAweDFlLCAgMHhmZSwgIDB4ODAsCisgIDB4NGMsICAweGZlLCAgMHg0OSwgIDB4ZTQsICAweDFhLCAgMHhmZSwgIDB4MTIsICAweDEzLCAgMHgwYSwgIDB4OWQsICAweDAxLCAgMHgxOCwgIDB4ZmUsICAweDgwLCAgMHg0YywgIDB4MGEsCisgIDB4NjcsICAweDAxLCAgMHg1YywgIDB4MDIsICAweDFjLCAgMHgxYSwgIDB4ODcsICAweDdjLCAgMHhlNSwgIDB4ZmUsICAweDE4LCAgMHhkZiwgIDB4ZmUsICAweDE5LCAgMHhkZSwgIDB4ZmUsCisgIDB4MjQsICAweDFjLCAgMHhmZSwgIDB4MWQsICAweGY3LCAgMHgyOCwgIDB4YjEsICAweGZlLCAgMHgwNCwgIDB4MWIsICAweDAxLCAgMHhmZSwgIDB4MmEsICAweDFjLCAgMHhmYSwgIDB4YjMsCisgIDB4MjgsICAweDdjLCAgMHhmZSwgIDB4MmMsICAweDAxLCAgMHhmZSwgIDB4MmYsICAweDE5LCAgMHgwMiwgIDB4YzksICAweDJiLCAgMHhmZSwgIDB4ZjQsICAweDFhLCAgMHhmZSwgIDB4ZmEsCisgIDB4MTAsICAweDFjLCAgMHgxYSwgIDB4ODcsICAweDAzLCAgMHhmZSwgIDB4NjQsICAweDAxLCAgMHhmZSwgIDB4MDAsICAweGY0LCAgMHgyNCwgIDB4ZmUsICAweDE4LCAgMHg1OCwgIDB4MDMsCisgIDB4ZmUsICAweDY2LCAgMHgwMSwgIDB4ZmUsICAweDE5LCAgMHg1OCwgIDB4YjMsICAweDI0LCAgMHgwMSwgIDB4ZmUsICAweDBlLCAgMHgxZiwgIDB4ZmUsICAweDMwLCAgMHhmNCwgIDB4MDcsCisgIDB4ZmUsICAweDNjLCAgMHg1MCwgIDB4N2MsICAweGZlLCAgMHgzOCwgIDB4MDAsICAweGZlLCAgMHgwZiwgIDB4NzksICAweGZlLCAgMHgxYywgIDB4ZjcsICAweDI0LCAgMHhiMSwgIDB4ZmUsCisgIDB4NTAsICAweDFiLCAgMHhmZSwgIDB4ZDQsICAweDE0LCAgMHgzMSwgIDB4MDIsICAweGM5LCAgMHgyYiwgIDB4ZmUsICAweDI2LCAgMHgxYiwgIDB4ZmUsICAweGJhLCAgMHgxMCwgIDB4MWMsCisgIDB4MWEsICAweDg3LCAgMHhmZSwgIDB4ODMsICAweDVhLCAgMHhmZSwgIDB4MTgsICAweGRmLCAgMHhmZSwgIDB4MTksICAweGRlLCAgMHhmZSwgIDB4MWQsICAweGY3LCAgMHg1NCwgIDB4YjEsCisgIDB4ZmUsICAweDcyLCAgMHgxYiwgIDB4ZmUsICAweGIyLCAgMHgxNCwgIDB4ZmMsICAweGIzLCAgMHg1NCwgIDB4N2MsICAweDEyLCAgMHhmZSwgIDB4YWYsICAweDE5LCAgMHhmZSwgIDB4OTgsCisgIDB4ZTcsICAweDAwLCAgMHgwMiwgIDB4YzksICAweDJiLCAgMHhmZSwgIDB4NjYsICAweDFiLCAgMHhmZSwgIDB4OGEsICAweDEwLCAgMHgxYywgIDB4MWEsICAweDg3LCAgMHg4YiwgIDB4MGYsCisgIDB4ZmUsICAweDMwLCAgMHg5MCwgIDB4MDQsICAweGZlLCAgMHhiMCwgIDB4OTMsICAweDNhLCAgMHgwYiwgIDB4ZmUsICAweDE4LCAgMHg1OCwgIDB4ZmUsICAweDMyLCAgMHg5MCwgIDB4MDQsCisgIDB4ZmUsICAweGIyLCAgMHg5MywgIDB4M2EsICAweDBiLCAgMHhmZSwgIDB4MTksICAweDU4LCAgMHgwZSwgIDB4YTgsICAweGIzLCAgMHg0YSwgIDB4N2MsICAweDEyLCAgMHhmZSwgIDB4MGYsCisgIDB4NzksICAweGZlLCAgMHgxYywgIDB4ZjcsICAweDRhLCAgMHhiMSwgIDB4ZmUsICAweGM2LCAgMHgxYiwgIDB4ZmUsICAweDVlLCAgMHgxNCwgIDB4MzEsICAweDAyLCAgMHhjOSwgIDB4MmIsCisgIDB4ZmUsICAweDk2LCAgMHgxYiwgIDB4NWMsICAweGZlLCAgMHgwMiwgIDB4ZjYsICAweDFhLCAgMHg4NywgIDB4ZmUsICAweDE4LCAgMHhmZSwgIDB4NmEsICAweGZlLCAgMHgxOSwgIDB4ZmUsCisgIDB4NmIsICAweDAxLCAgMHhmZSwgIDB4MWUsICAweDFmLCAgMHhmZSwgIDB4MWQsICAweGY3LCAgMHg2NSwgIDB4YjEsICAweGZlLCAgMHhlZSwgIDB4MWIsICAweGZlLCAgMHgzNiwgIDB4MTQsCisgIDB4ZmUsICAweDFjLCAgMHgxMywgIDB4YjMsICAweDY1LCAgMHgzZSwgIDB4ZmUsICAweDgzLCAgMHg1OCwgIDB4ZmUsICAweGFmLCAgMHgxOSwgIDB4ZmUsICAweDgwLCAgMHhlNywgIDB4MWEsCisgIDB4ZmUsICAweDgxLCAgMHhlNywgIDB4MWEsICAweDE1LCAgMHhmZSwgIDB4ZGQsICAweDAwLCAgMHg3YSwgIDB4MzAsICAweDAyLCAgMHg3YSwgIDB4MzAsICAweGZlLCAgMHgxMiwgIDB4NDUsCisgIDB4MmIsICAweGZlLCAgMHhkYywgIDB4MWIsICAweDFmLCAgMHgwNywgIDB4NDcsICAweGI1LCAgMHhjMywgIDB4MDUsICAweDM1LCAgMHhmZSwgIDB4MzksICAweGYwLCAgMHg3NSwgIDB4MjYsCisgIDB4MDIsICAweGZlLCAgMHg3ZSwgIDB4MTgsICAweDIzLCAgMHgxZCwgIDB4MzYsICAweDEzLCAgMHgxMSwgIDB4MDIsICAweDg3LCAgMHgwMywgIDB4ZTMsICAweDIzLCAgMHgwNywgIDB4ZmUsCisgIDB4ZWYsICAweDEyLCAgMHhmZSwgIDB4ZTEsICAweDEwLCAgMHg5MCwgIDB4MzQsICAweDYwLCAgMHhmZSwgIDB4MDIsICAweDgwLCAgMHgwOSwgIDB4NTYsICAweGZlLCAgMHgzYywgIDB4MTMsCisgIDB4ZmUsICAweDgyLCAgMHgxNCwgIDB4ZmUsICAweDQyLCAgMHgxMywgIDB4NTEsICAweGZlLCAgMHgwNiwgIDB4ODMsICAweDBhLCAgMHg1YSwgIDB4MDEsICAweDE4LCAgMHhjYiwgIDB4ZmUsCisgIDB4M2UsICAweDEyLCAgMHhmZSwgIDB4NDEsICAweDQ4LCAgMHhmZSwgIDB4NDUsICAweDQ4LCAgMHgwMSwgIDB4ZmUsICAweGIyLCAgMHgxNiwgIDB4ZmUsICAweDAwLCAgMHhjYywgIDB4Y2IsCisgIDB4ZmUsICAweGYzLCAgMHgxMywgIDB4M2YsICAweDg5LCAgMHgwOSwgIDB4MWEsICAweGE1LCAgMHgwYSwgIDB4OWQsICAweDAxLCAgMHgxOCwgIDB4ZmUsICAweDgwLCAgMHg0YywgIDB4MDEsCisgIDB4ODUsICAweGZlLCAgMHgxNiwgIDB4MTAsICAweDA5LCAgMHg5YiwgIDB4NGUsICAweGZlLCAgMHg0MCwgIDB4MTQsICAweGZlLCAgMHgyNCwgIDB4MTIsICAweGZlLCAgMHgxNCwgIDB4NTYsCisgIDB4ZmUsICAweGQ2LCAgMHhmMCwgIDB4ZmUsICAweDUyLCAgMHgxYywgIDB4MWMsICAweDBkLCAgMHgwMiwgIDB4ZmUsICAweDljLCAgMHhlNywgIDB4MGQsICAweDE5LCAgMHhmZSwgIDB4MTUsCisgIDB4MDAsICAweDQwLCAgMHg4ZCwgIDB4MzAsICAweDAxLCAgMHhmNCwgIDB4MWMsICAweDA3LCAgMHgwMiwgIDB4NTEsICAweGZlLCAgMHgwNiwgIDB4ODMsICAweGZlLCAgMHgxOCwgIDB4ODAsCisgIDB4NjEsICAweDI4LCAgMHg0NCwgIDB4MTUsICAweDU2LCAgMHgwMSwgIDB4ODUsICAweDFjLCAgMHgwNywgIDB4MDIsICAweGZlLCAgMHgzOCwgIDB4OTAsICAweGZlLCAgMHhiYSwgIDB4OTAsCisgIDB4OTEsICAweGRlLCAgMHg3ZSwgIDB4ZGYsICAweGZlLCAgMHg0OCwgIDB4NTUsICAweDMxLCAgMHhmZSwgIDB4YzksICAweDU1LCAgMHgwMiwgIDB4MjEsICAweGI5LCAgMHg4OCwgIDB4MjAsCisgIDB4YjksICAweDAyLCAgMHgwYSwgIDB4YmEsICAweDAxLCAgMHgxOCwgIDB4ZmUsICAweDQxLCAgMHg0OCwgIDB4MGEsICAweDU3LCAgMHgwMSwgIDB4MTgsICAweGZlLCAgMHg0OSwgIDB4NDQsCisgIDB4MWIsICAweGZlLCAgMHgxZSwgIDB4MWQsICAweDg4LCAgMHg4OSwgIDB4MDIsICAweDBhLCAgMHg1YSwgIDB4MDEsICAweDE4LCAgMHgwOSwgIDB4MWEsICAweGE0LCAgMHgwYSwgIDB4NjcsCisgIDB4MDEsICAweGEzLCAgMHgwYSwgIDB4NTcsICAweDAxLCAgMHgxOCwgIDB4ODgsICAweDg5LCAgMHgwMiwgIDB4ZmUsICAweDRlLCAgMHhlNCwgIDB4MWQsICAweDdiLCAgMHhmZSwgIDB4NTIsCisgIDB4MWQsICAweDAzLCAgMHhmZSwgIDB4OTAsICAweDAwLCAgMHhmZSwgIDB4M2EsICAweDQ1LCAgMHhmZSwgIDB4MmMsICAweDEwLCAgMHhmZSwgIDB4NGUsICAweGU0LCAgMHhkZCwgIDB4N2IsCisgIDB4ZmUsICAweDY0LCAgMHgxZCwgIDB4MDMsICAweGZlLCAgMHg5MiwgIDB4MDAsICAweGQxLCAgMHgxMiwgIDB4ZmUsICAweDFhLCAgMHgxMCwgIDB4ZmUsICAweDRlLCAgMHhlNCwgIDB4ZmUsCisgIDB4MGIsICAweDAwLCAgMHg3YiwgIDB4ZmUsICAweDc2LCAgMHgxZCwgIDB4MDMsICAweGZlLCAgMHg5NCwgIDB4MDAsICAweGQxLCAgMHgyNCwgIDB4ZmUsICAweDA4LCAgMHgxMCwgIDB4MDMsCisgIDB4ZmUsICAweDk2LCAgMHgwMCwgIDB4ZDEsICAweDYzLCAgMHhmZSwgIDB4NGUsICAweDQ1LCAgMHg4MywgIDB4Y2EsICAweGZmLCAgMHgwNCwgIDB4NjgsICAweDU0LCAgMHhmZSwgIDB4ZjEsCisgIDB4MTAsICAweDIzLCAgMHg0OSwgIDB4ZmUsICAweDA4LCAgMHgxYywgIDB4ZmUsICAweDY3LCAgMHgxOSwgIDB4ZmUsICAweDBhLCAgMHgxYywgIDB4ZmUsICAweDFhLCAgMHhmNCwgIDB4ZmUsCisgIDB4MDAsICAweDA0LCAgMHg4MywgIDB4YjIsICAweDFkLCAgMHg0OCwgIDB4ZmUsICAweGFhLCAgMHgxZCwgIDB4MTMsICAweDFkLCAgMHgwMiwgIDB4MDksICAweDkyLCAgMHhmZSwgIDB4NWEsCisgIDB4ZjAsICAweGZlLCAgMHhiYSwgIDB4MWQsICAweDJlLCAgMHg5MywgIDB4ZmUsICAweDM0LCAgMHgxMCwgIDB4MDksICAweDEyLCAgMHhmZSwgIDB4NWEsICAweGYwLCAgMHhmZSwgIDB4YzgsCisgIDB4MWQsICAweDJlLCAgMHhiNCwgIDB4ZmUsICAweDI2LCAgMHgxMCwgIDB4MDksICAweDFkLCAgMHgzNiwgIDB4MmUsICAweDYzLCAgMHhmZSwgIDB4MWEsICAweDEwLCAgMHgwOSwgIDB4MGQsCisgIDB4MzYsICAweDJlLCAgMHg5NCwgIDB4ZjIsICAweDA5LCAgMHgwNywgIDB4MzYsICAweDJlLCAgMHg5NSwgIDB4YTEsICAweGM4LCAgMHgwMiwgIDB4MWYsICAweDkzLCAgMHgwMSwgIDB4NDIsCisgIDB4ZmUsICAweDA0LCAgMHhmZSwgIDB4OTksICAweDAzLCAgMHg5YywgIDB4OGIsICAweDAyLCAgMHgyYSwgIDB4ZmUsICAweDFjLCAgMHgxZSwgIDB4ZmUsICAweDE0LCAgMHhmMCwgIDB4MDgsCisgIDB4MmYsICAweGZlLCAgMHgwYywgIDB4MWUsICAweDJhLCAgMHhmZSwgIDB4MWMsICAweDFlLCAgMHg4ZiwgIDB4ZmUsICAweDFjLCAgMHgxZSwgIDB4ZmUsICAweDgyLCAgMHhmMCwgIDB4ZmUsCisgIDB4MTAsICAweDFlLCAgMHgwMiwgIDB4MGYsICAweDNmLCAgMHgwNCwgIDB4ZmUsICAweDgwLCAgMHg4MywgIDB4MzMsICAweDBiLCAgMHgwZSwgIDB4MDIsICAweDBmLCAgMHhmZSwgIDB4MTgsCisgIDB4ODAsICAweDA0LCAgMHhmZSwgIDB4OTgsICAweDgzLCAgMHgzMywgIDB4MGIsICAweDBlLCAgMHgwMiwgIDB4MGYsICAweGZlLCAgMHgwMiwgIDB4ODAsICAweDA0LCAgMHhmZSwgIDB4ODIsCisgIDB4ODMsICAweDMzLCAgMHgwYiwgIDB4MGUsICAweDAyLCAgMHgwZiwgIDB4ZmUsICAweDA2LCAgMHg4MCwgIDB4MDQsICAweGZlLCAgMHg4NiwgIDB4ODMsICAweDMzLCAgMHgwYiwgIDB4MGUsCisgIDB4MDIsICAweDBmLCAgMHhmZSwgIDB4MWIsICAweDgwLCAgMHgwNCwgIDB4ZmUsICAweDliLCAgMHg4MywgIDB4MzMsICAweDBiLCAgMHgwZSwgIDB4MDIsICAweDBmLCAgMHhmZSwgIDB4MDQsCisgIDB4ODAsICAweDA0LCAgMHhmZSwgIDB4ODQsICAweDgzLCAgMHgzMywgIDB4MGIsICAweDBlLCAgMHgwMiwgIDB4MGYsICAweGZlLCAgMHg4MCwgIDB4ODAsICAweDA0LCAgMHhmZSwgIDB4ODAsCisgIDB4ODMsICAweGZlLCAgMHhjOSwgIDB4NDcsICAweDBiLCAgMHgwZSwgIDB4MDIsICAweDBmLCAgMHhmZSwgIDB4MTksICAweDgxLCAgMHgwNCwgIDB4ZmUsICAweDk5LCAgMHg4MywgIDB4ZmUsCisgIDB4Y2EsICAweDQ3LCAgMHgwYiwgIDB4MGUsICAweDAyLCAgMHgwZiwgIDB4ZmUsICAweDA2LCAgMHg4MywgIDB4MDQsICAweGZlLCAgMHg4NiwgIDB4ODMsICAweGZlLCAgMHhjZSwgIDB4NDcsCisgIDB4MGIsICAweDBlLCAgMHgwMiwgIDB4MGYsICAweGZlLCAgMHgyYywgIDB4OTAsICAweDA0LCAgMHhmZSwgIDB4YWMsICAweDkzLCAgMHgzYSwgIDB4MGIsICAweDBlLCAgMHgwMiwgIDB4MGYsCisgIDB4ZmUsICAweGFlLCAgMHg5MCwgIDB4MDQsICAweGZlLCAgMHhhZSwgIDB4OTMsICAweDc5LCAgMHgwYiwgIDB4MGUsICAweDAyLCAgMHgwZiwgIDB4ZmUsICAweDA4LCAgMHg5MCwgIDB4MDQsCisgIDB4ZmUsICAweDg4LCAgMHg5MywgIDB4M2EsICAweDBiLCAgMHgwZSwgIDB4MDIsICAweDBmLCAgMHhmZSwgIDB4OGEsICAweDkwLCAgMHgwNCwgIDB4ZmUsICAweDhhLCAgMHg5MywgIDB4NzksCisgIDB4MGIsICAweDBlLCAgMHgwMiwgIDB4MGYsICAweGZlLCAgMHgwYywgIDB4OTAsICAweDA0LCAgMHhmZSwgIDB4OGMsICAweDkzLCAgMHgzYSwgIDB4MGIsICAweDBlLCAgMHgwMiwgIDB4MGYsCisgIDB4ZmUsICAweDhlLCAgMHg5MCwgIDB4MDQsICAweGZlLCAgMHg4ZSwgIDB4OTMsICAweDc5LCAgMHgwYiwgIDB4MGUsICAweDAyLCAgMHgwZiwgIDB4ZmUsICAweDNjLCAgMHg5MCwgIDB4MDQsCisgIDB4ZmUsICAweGJjLCAgMHg5MywgIDB4M2EsICAweDBiLCAgMHgwZSwgIDB4MDIsICAweDhiLCAgMHgwZiwgIDB4ZmUsICAweDAzLCAgMHg4MCwgIDB4MDQsICAweGZlLCAgMHg4MywgIDB4ODMsCisgIDB4MzMsICAweDBiLCAgMHg3NywgIDB4MGUsICAweGE4LCAgMHgwMiwgIDB4ZmYsICAweDY2LCAgMHgwMCwgIDB4MDAsCit9OworCitTVEFUSUMgdW5zaWduZWQgc2hvcnQgX2Fkdl9hc2MzOEMxNjAwX3NpemUgPQorICAgICAgICBzaXplb2YoX2Fkdl9hc2MzOEMxNjAwX2J1Zik7IC8qIDB4MTY3MyAqLworU1RBVElDIEFEVl9EQ05UIF9hZHZfYXNjMzhDMTYwMF9jaGtzdW0gPQorICAgICAgICAweDA2MDRFRjc3VUw7IC8qIEV4cGFuZGVkIGxpdHRsZS1lbmRpYW4gY2hlY2tzdW0uICovCisKKy8qIGFfaW5pdC5jICovCisvKgorICogRUVQUk9NIENvbmZpZ3VyYXRpb24uCisgKgorICogQWxsIGRyaXZlcnMgc2hvdWxkIHVzZSB0aGlzIHN0cnVjdHVyZSB0byBzZXQgdGhlIGRlZmF1bHQgRUVQUk9NCisgKiBjb25maWd1cmF0aW9uLiBUaGUgQklPUyBub3cgdXNlcyB0aGlzIHN0cnVjdHVyZSB3aGVuIGl0IGlzIGJ1aWx0LgorICogQWRkaXRpb25hbCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIGFfY29uZG9yLmggd2hlcmUKKyAqIHRoZSBzdHJ1Y3R1cmUgaXMgZGVmaW5lZC4KKyAqCisgKiBUaGUgKl9GaWVsZF9Jc0NoYXIgc3RydWN0cyBhcmUgbmVlZGVkIHRvIGNvcnJlY3QgZm9yIGVuZGlhbm5lc3MuCisgKiBUaGVzZSB2YWx1ZXMgYXJlIHJlYWQgZnJvbSB0aGUgYm9hcmQgMTYgYml0cyBhdCBhIHRpbWUgZGlyZWN0bHkKKyAqIGludG8gdGhlIHN0cnVjdHMuIEJlY2F1c2Ugc29tZSBmaWVsZHMgYXJlIGNoYXIsIHRoZSB2YWx1ZXMgd2lsbCBiZQorICogaW4gdGhlIHdyb25nIG9yZGVyLiBUaGUgKl9GaWVsZF9Jc0NoYXIgdGVsbHMgd2hlbiB0byBmbGlwIHRoZQorICogYnl0ZXMuIERhdGEgcmVhZCBhbmQgd3JpdHRlbiB0byBQQ0kgbWVtb3J5IGlzIGF1dG9tYXRpY2FsbHkgc3dhcHBlZAorICogb24gYmlnLWVuZGlhbiBwbGF0Zm9ybXMgc28gY2hhciBmaWVsZHMgcmVhZCBhcyB3b3JkcyBhcmUgYWN0dWFsbHkgYmVpbmcKKyAqIHVuc3dhcHBlZCBvbiBiaWctZW5kaWFuIHBsYXRmb3Jtcy4KKyAqLworU1RBVElDIEFEVkVFUF8zNTUwX0NPTkZJRworRGVmYXVsdF8zNTUwX0VFUFJPTV9Db25maWcgX19pbml0ZGF0YSA9IHsKKyAgICBBRFZfRUVQUk9NX0JJT1NfRU5BQkxFLCAgICAgLyogY2ZnX2xzdyAqLworICAgIDB4MDAwMCwgICAgICAgICAgICAgICAgICAgICAvKiBjZmdfbXN3ICovCisgICAgMHhGRkZGLCAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2NfZW5hYmxlICovCisgICAgMHhGRkZGLCAgICAgICAgICAgICAgICAgICAgIC8qIHdkdHJfYWJsZSAqLworICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiBzZHRyX2FibGUgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnRfbW90b3IgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogdGFncW5nX2FibGUgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogYmlvc19zY2FuICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYW1fdG9sZXJhbnQgKi8KKyAgICA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRhcHRlcl9zY3NpX2lkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpb3NfYm9vdF9kZWxheSAqLworICAgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY3NpX3Jlc2V0X2RlbGF5ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpb3NfaWRfbHVuICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlcm1pbmF0aW9uICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkMSAqLworICAgIDB4RkZFNywgICAgICAgICAgICAgICAgICAgICAvKiBiaW9zX2N0cmwgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogdWx0cmFfYWJsZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZDIgKi8KKyAgICBBU0NfREVGX01BWF9IT1NUX1FORywgICAgICAgLyogbWF4X2hvc3RfcW5nICovCisgICAgQVNDX0RFRl9NQVhfRFZDX1FORywgICAgICAgIC8qIG1heF9kdmNfcW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR2Y19jbnRsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1Z19maXggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VyaWFsX251bWJlcl93b3JkMSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXJpYWxfbnVtYmVyX3dvcmQyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcmlhbF9udW1iZXJfd29yZDMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2tfc3VtICovCisgICAgeyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwIH0sIC8qIG9lbV9uYW1lWzE2XSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkdmNfZXJyX2NvZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWR2X2Vycl9jb2RlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkdl9lcnJfYWRkciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlZF9kdmNfZXJyX2NvZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZWRfYWR2X2Vycl9jb2RlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmVkX2Fkdl9lcnJfYWRkciAqLworICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1fb2ZfZXJyICovCit9OworCitTVEFUSUMgQURWRUVQXzM1NTBfQ09ORklHCitBRFZFRVBfMzU1MF9Db25maWdfRmllbGRfSXNDaGFyIF9faW5pdGRhdGEgPSB7CisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNmZ19sc3cgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2ZnX21zdyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtZGlzY19lbmFibGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2R0cl9hYmxlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNkdHJfYWJsZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydF9tb3RvciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YWdxbmdfYWJsZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaW9zX3NjYW4gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbV90b2xlcmFudCAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGFwdGVyX3Njc2lfaWQgKi8KKyAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmlvc19ib290X2RlbGF5ICovCisgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjc2lfcmVzZXRfZGVsYXkgKi8KKyAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmlvc19pZF9sdW4gKi8KKyAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVybWluYXRpb24gKi8KKyAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQxICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpb3NfY3RybCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bHRyYV9hYmxlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkMiAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXhfaG9zdF9xbmcgKi8KKyAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWF4X2R2Y19xbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHZjX2NudGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVnX2ZpeCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXJpYWxfbnVtYmVyX3dvcmQxICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcmlhbF9udW1iZXJfd29yZDIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VyaWFsX251bWJlcl93b3JkMyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVja19zdW0gKi8KKyAgICB7IDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEgfSwgLyogb2VtX25hbWVbMTZdICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR2Y19lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZHZfZXJyX2NvZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWR2X2Vycl9hZGRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmVkX2R2Y19lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlZF9hZHZfZXJyX2NvZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZWRfYWR2X2Vycl9hZGRyICovCisgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bV9vZl9lcnIgKi8KK307CisKK1NUQVRJQyBBRFZFRVBfMzhDMDgwMF9DT05GSUcKK0RlZmF1bHRfMzhDMDgwMF9FRVBST01fQ29uZmlnIF9faW5pdGRhdGEgPSB7CisgICAgQURWX0VFUFJPTV9CSU9TX0VOQUJMRSwgICAgIC8qIDAwIGNmZ19sc3cgKi8KKyAgICAweDAwMDAsICAgICAgICAgICAgICAgICAgICAgLyogMDEgY2ZnX21zdyAqLworICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiAwMiBkaXNjX2VuYWJsZSAqLworICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiAwMyB3ZHRyX2FibGUgKi8KKyAgICAweDQ0NDQsICAgICAgICAgICAgICAgICAgICAgLyogMDQgc2R0cl9zcGVlZDEgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogMDUgc3RhcnRfbW90b3IgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogMDYgdGFncW5nX2FibGUgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogMDcgYmlvc19zY2FuICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA4IHNjYW1fdG9sZXJhbnQgKi8KKyAgICA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDkgYWRhcHRlcl9zY3NpX2lkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGJpb3NfYm9vdF9kZWxheSAqLworICAgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMCBzY3NpX3Jlc2V0X2RlbGF5ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGJpb3NfaWRfbHVuICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDExIHRlcm1pbmF0aW9uX3NlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIHRlcm1pbmF0aW9uX2x2ZCAqLworICAgIDB4RkZFNywgICAgICAgICAgICAgICAgICAgICAvKiAxMiBiaW9zX2N0cmwgKi8KKyAgICAweDQ0NDQsICAgICAgICAgICAgICAgICAgICAgLyogMTMgc2R0cl9zcGVlZDIgKi8KKyAgICAweDQ0NDQsICAgICAgICAgICAgICAgICAgICAgLyogMTQgc2R0cl9zcGVlZDMgKi8KKyAgICBBU0NfREVGX01BWF9IT1NUX1FORywgICAgICAgLyogMTUgbWF4X2hvc3RfcW5nICovCisgICAgQVNDX0RFRl9NQVhfRFZDX1FORywgICAgICAgIC8qICAgIG1heF9kdmNfcW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE2IGR2Y19jbnRsICovCisgICAgMHg0NDQ0LCAgICAgICAgICAgICAgICAgICAgIC8qIDE3IHNkdHJfc3BlZWQ0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE4IHNlcmlhbF9udW1iZXJfd29yZDEgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTkgc2VyaWFsX251bWJlcl93b3JkMiAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMCBzZXJpYWxfbnVtYmVyX3dvcmQzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIxIGNoZWNrX3N1bSAqLworICAgIHsgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCB9LCAvKiAyMi0yOSBvZW1fbmFtZVsxNl0gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzAgZHZjX2Vycl9jb2RlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMxIGFkdl9lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMiBhZHZfZXJyX2FkZHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzMgc2F2ZWRfZHZjX2Vycl9jb2RlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM0IHNhdmVkX2Fkdl9lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNSBzYXZlZF9hZHZfZXJyX2FkZHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzYgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzcgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzggcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzkgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDAgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDEgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDIgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDMgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDQgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDUgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDYgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDcgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDggcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDkgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTAgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTEgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTIgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTMgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTQgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTUgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTYgY2lzcHRyX2xzdyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1NyBjaXNwcnRfbXN3ICovCisgICAgQURWX1BDSV9WRU5ET1JfSUQsICAgICAgICAgIC8qIDU4IHN1YnN5c3ZpZCAqLworICAgIEFEVl9QQ0lfREVWSURfMzhDMDgwMF9SRVYxLCAvKiA1OSBzdWJzeXNpZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MCByZXNlcnZlZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MSByZXNlcnZlZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MiByZXNlcnZlZCAqLworICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MyByZXNlcnZlZCAqLworfTsKKworU1RBVElDIEFEVkVFUF8zOEMwODAwX0NPTkZJRworQURWRUVQXzM4QzA4MDBfQ29uZmlnX0ZpZWxkX0lzQ2hhciBfX2luaXRkYXRhID0geworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMCBjZmdfbHN3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAxIGNmZ19tc3cgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDIgZGlzY19lbmFibGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDMgd2R0cl9hYmxlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA0IHNkdHJfc3BlZWQxICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA1IHN0YXJ0X21vdG9yICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA2IHRhZ3FuZ19hYmxlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA3IGJpb3Nfc2NhbiAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwOCBzY2FtX3RvbGVyYW50ICovCisgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA5IGFkYXB0ZXJfc2NzaV9pZCAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBiaW9zX2Jvb3RfZGVsYXkgKi8KKyAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAgc2NzaV9yZXNldF9kZWxheSAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBiaW9zX2lkX2x1biAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMSB0ZXJtaW5hdGlvbl9zZSAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICB0ZXJtaW5hdGlvbl9sdmQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTIgYmlvc19jdHJsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEzIHNkdHJfc3BlZWQyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE0IHNkdHJfc3BlZWQzICovCisgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE1IG1heF9ob3N0X3FuZyAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBtYXhfZHZjX3FuZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNiBkdmNfY250bCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNyBzZHRyX3NwZWVkNCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxOCBzZXJpYWxfbnVtYmVyX3dvcmQxICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE5IHNlcmlhbF9udW1iZXJfd29yZDIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjAgc2VyaWFsX251bWJlcl93b3JkMyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMSBjaGVja19zdW0gKi8KKyAgICB7IDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEgfSwgLyogMjItMjkgb2VtX25hbWVbMTZdICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMwIGR2Y19lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMSBhZHZfZXJyX2NvZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzIgYWR2X2Vycl9hZGRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMzIHNhdmVkX2R2Y19lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNCBzYXZlZF9hZHZfZXJyX2NvZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzUgc2F2ZWRfYWR2X2Vycl9hZGRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM2IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM3IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM4IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM5IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQwIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQxIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQyIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQzIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ0IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ1IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ2IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ3IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ5IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUwIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUxIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUyIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUzIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU0IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU1IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU2IGNpc3B0cl9sc3cgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTcgY2lzcHJ0X21zdyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1OCBzdWJzeXN2aWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTkgc3Vic3lzaWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjAgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjEgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjIgcmVzZXJ2ZWQgKi8KKyAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjMgcmVzZXJ2ZWQgKi8KK307CisKK1NUQVRJQyBBRFZFRVBfMzhDMTYwMF9DT05GSUcKK0RlZmF1bHRfMzhDMTYwMF9FRVBST01fQ29uZmlnIF9faW5pdGRhdGEgPSB7CisgICAgQURWX0VFUFJPTV9CSU9TX0VOQUJMRSwgICAgIC8qIDAwIGNmZ19sc3cgKi8KKyAgICAweDAwMDAsICAgICAgICAgICAgICAgICAgICAgLyogMDEgY2ZnX21zdyAqLworICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiAwMiBkaXNjX2VuYWJsZSAqLworICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiAwMyB3ZHRyX2FibGUgKi8KKyAgICAweDU1NTUsICAgICAgICAgICAgICAgICAgICAgLyogMDQgc2R0cl9zcGVlZDEgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogMDUgc3RhcnRfbW90b3IgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogMDYgdGFncW5nX2FibGUgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogMDcgYmlvc19zY2FuICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA4IHNjYW1fdG9sZXJhbnQgKi8KKyAgICA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDkgYWRhcHRlcl9zY3NpX2lkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGJpb3NfYm9vdF9kZWxheSAqLworICAgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMCBzY3NpX3Jlc2V0X2RlbGF5ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGJpb3NfaWRfbHVuICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDExIHRlcm1pbmF0aW9uX3NlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIHRlcm1pbmF0aW9uX2x2ZCAqLworICAgIDB4RkZFNywgICAgICAgICAgICAgICAgICAgICAvKiAxMiBiaW9zX2N0cmwgKi8KKyAgICAweDU1NTUsICAgICAgICAgICAgICAgICAgICAgLyogMTMgc2R0cl9zcGVlZDIgKi8KKyAgICAweDU1NTUsICAgICAgICAgICAgICAgICAgICAgLyogMTQgc2R0cl9zcGVlZDMgKi8KKyAgICBBU0NfREVGX01BWF9IT1NUX1FORywgICAgICAgLyogMTUgbWF4X2hvc3RfcW5nICovCisgICAgQVNDX0RFRl9NQVhfRFZDX1FORywgICAgICAgIC8qICAgIG1heF9kdmNfcW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE2IGR2Y19jbnRsICovCisgICAgMHg1NTU1LCAgICAgICAgICAgICAgICAgICAgIC8qIDE3IHNkdHJfc3BlZWQ0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE4IHNlcmlhbF9udW1iZXJfd29yZDEgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTkgc2VyaWFsX251bWJlcl93b3JkMiAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMCBzZXJpYWxfbnVtYmVyX3dvcmQzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIxIGNoZWNrX3N1bSAqLworICAgIHsgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCB9LCAvKiAyMi0yOSBvZW1fbmFtZVsxNl0gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzAgZHZjX2Vycl9jb2RlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMxIGFkdl9lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMiBhZHZfZXJyX2FkZHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzMgc2F2ZWRfZHZjX2Vycl9jb2RlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM0IHNhdmVkX2Fkdl9lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNSBzYXZlZF9hZHZfZXJyX2FkZHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzYgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzcgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzggcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzkgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDAgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDEgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDIgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDMgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDQgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDUgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDYgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDcgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDggcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDkgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTAgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTEgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTIgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTMgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTQgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTUgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTYgY2lzcHRyX2xzdyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1NyBjaXNwcnRfbXN3ICovCisgICAgQURWX1BDSV9WRU5ET1JfSUQsICAgICAgICAgIC8qIDU4IHN1YnN5c3ZpZCAqLworICAgIEFEVl9QQ0lfREVWSURfMzhDMTYwMF9SRVYxLCAvKiA1OSBzdWJzeXNpZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MCByZXNlcnZlZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MSByZXNlcnZlZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MiByZXNlcnZlZCAqLworICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MyByZXNlcnZlZCAqLworfTsKKworU1RBVElDIEFEVkVFUF8zOEMxNjAwX0NPTkZJRworQURWRUVQXzM4QzE2MDBfQ29uZmlnX0ZpZWxkX0lzQ2hhciBfX2luaXRkYXRhID0geworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMCBjZmdfbHN3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAxIGNmZ19tc3cgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDIgZGlzY19lbmFibGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDMgd2R0cl9hYmxlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA0IHNkdHJfc3BlZWQxICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA1IHN0YXJ0X21vdG9yICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA2IHRhZ3FuZ19hYmxlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA3IGJpb3Nfc2NhbiAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwOCBzY2FtX3RvbGVyYW50ICovCisgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA5IGFkYXB0ZXJfc2NzaV9pZCAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBiaW9zX2Jvb3RfZGVsYXkgKi8KKyAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAgc2NzaV9yZXNldF9kZWxheSAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBiaW9zX2lkX2x1biAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMSB0ZXJtaW5hdGlvbl9zZSAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICB0ZXJtaW5hdGlvbl9sdmQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTIgYmlvc19jdHJsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEzIHNkdHJfc3BlZWQyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE0IHNkdHJfc3BlZWQzICovCisgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE1IG1heF9ob3N0X3FuZyAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBtYXhfZHZjX3FuZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNiBkdmNfY250bCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNyBzZHRyX3NwZWVkNCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxOCBzZXJpYWxfbnVtYmVyX3dvcmQxICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE5IHNlcmlhbF9udW1iZXJfd29yZDIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjAgc2VyaWFsX251bWJlcl93b3JkMyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMSBjaGVja19zdW0gKi8KKyAgICB7IDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEgfSwgLyogMjItMjkgb2VtX25hbWVbMTZdICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMwIGR2Y19lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMSBhZHZfZXJyX2NvZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzIgYWR2X2Vycl9hZGRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMzIHNhdmVkX2R2Y19lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNCBzYXZlZF9hZHZfZXJyX2NvZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzUgc2F2ZWRfYWR2X2Vycl9hZGRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM2IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM3IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM4IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM5IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQwIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQxIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQyIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQzIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ0IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ1IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ2IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ3IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ5IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUwIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUxIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUyIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUzIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU0IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU1IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU2IGNpc3B0cl9sc3cgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTcgY2lzcHJ0X21zdyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1OCBzdWJzeXN2aWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTkgc3Vic3lzaWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjAgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjEgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjIgcmVzZXJ2ZWQgKi8KKyAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjMgcmVzZXJ2ZWQgKi8KK307CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBBRFZfRFZDX1ZBUiBzdHJ1Y3R1cmUuCisgKgorICogT24gZmFpbHVyZSBzZXQgdGhlIEFEVl9EVkNfVkFSIGZpZWxkICdlcnJfY29kZScgYW5kIHJldHVybiBBRFZfRVJST1IuCisgKgorICogRm9yIGEgbm9uLWZhdGFsIGVycm9yIHJldHVybiBhIHdhcm5pbmcgY29kZS4gSWYgdGhlcmUgYXJlIG5vIHdhcm5pbmdzCisgKiB0aGVuIDAgaXMgcmV0dXJuZWQuCisgKi8KK1NUQVRJQyBpbnQgX19pbml0CitBZHZJbml0R2V0Q29uZmlnKEFEVl9EVkNfVkFSICphc2NfZHZjKQoreworICAgIHVzaG9ydCAgICAgIHdhcm5fY29kZTsKKyAgICBBZHZQb3J0QWRkciBpb3BfYmFzZTsKKyAgICB1Y2hhciAgICAgICBwY2lfY21kX3JlZzsKKyAgICBpbnQgICAgICAgICBzdGF0dXM7CisKKyAgICB3YXJuX2NvZGUgPSAwOworICAgIGFzY19kdmMtPmVycl9jb2RlID0gMDsKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCisgICAgLyoKKyAgICAgKiBQQ0kgQ29tbWFuZCBSZWdpc3RlcgorICAgICAqCisgICAgICogTm90ZTogQXNjUENJQ21kUmVnQml0c19CdXNNYXN0ZXJpbmcgZGVmaW5pdGlvbiAoMHgwMDA3KSBpbmNsdWRlcworICAgICAqIEkvTyBTcGFjZSBDb250cm9sLCBNZW1vcnkgU3BhY2UgQ29udHJvbCBhbmQgQnVzIE1hc3RlciBDb250cm9sIGJpdHMuCisgICAgICovCisKKyAgICBpZiAoKChwY2lfY21kX3JlZyA9IER2Y0FkdlJlYWRQQ0lDb25maWdCeXRlKGFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNjUENJQ29uZmlnQ29tbWFuZFJlZ2lzdGVyKSkKKyAgICAgICAgICYgQXNjUENJQ21kUmVnQml0c19CdXNNYXN0ZXJpbmcpCisgICAgICAgICE9IEFzY1BDSUNtZFJlZ0JpdHNfQnVzTWFzdGVyaW5nKQorICAgIHsKKyAgICAgICAgcGNpX2NtZF9yZWcgfD0gQXNjUENJQ21kUmVnQml0c19CdXNNYXN0ZXJpbmc7CisKKyAgICAgICAgRHZjQWR2V3JpdGVQQ0lDb25maWdCeXRlKGFzY19kdmMsCisgICAgICAgICAgICAgICAgQXNjUENJQ29uZmlnQ29tbWFuZFJlZ2lzdGVyLCBwY2lfY21kX3JlZyk7CisKKyAgICAgICAgaWYgKCgoRHZjQWR2UmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywgQXNjUENJQ29uZmlnQ29tbWFuZFJlZ2lzdGVyKSkKKyAgICAgICAgICAgICAmIEFzY1BDSUNtZFJlZ0JpdHNfQnVzTWFzdGVyaW5nKQorICAgICAgICAgICAgIT0gQXNjUENJQ21kUmVnQml0c19CdXNNYXN0ZXJpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9TRVRfUENJX0NPTkZJR19TUEFDRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUENJIExhdGVuY3kgVGltZXIKKyAgICAgKgorICAgICAqIElmIHRoZSAibGF0ZW5jeSB0aW1lciIgcmVnaXN0ZXIgaXMgMHgyMCBvciBhYm92ZSwgdGhlbiB3ZSBkb24ndCBuZWVkCisgICAgICogdG8gY2hhbmdlIGl0LiAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gMHgyMCAoaS5lLiBzZXQgaXQgdG8gMHgyMCBpZiBpdAorICAgICAqIGNvbWVzIHVwIGxlc3MgdGhhbiAweDIwKS4KKyAgICAgKi8KKyAgICBpZiAoRHZjQWR2UmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywgQXNjUENJQ29uZmlnTGF0ZW5jeVRpbWVyKSA8IDB4MjApIHsKKyAgICAgICAgRHZjQWR2V3JpdGVQQ0lDb25maWdCeXRlKGFzY19kdmMsIEFzY1BDSUNvbmZpZ0xhdGVuY3lUaW1lciwgMHgyMCk7CisgICAgICAgIGlmIChEdmNBZHZSZWFkUENJQ29uZmlnQnl0ZShhc2NfZHZjLCBBc2NQQ0lDb25maWdMYXRlbmN5VGltZXIpIDwgMHgyMCkKKyAgICAgICAgeworICAgICAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX1NFVF9QQ0lfQ09ORklHX1NQQUNFOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTYXZlIHRoZSBzdGF0ZSBvZiB0aGUgUENJIENvbmZpZ3VyYXRpb24gQ29tbWFuZCBSZWdpc3RlcgorICAgICAqICJQYXJpdHkgRXJyb3IgUmVzcG9uc2UgQ29udHJvbCIgQml0LiBJZiB0aGUgYml0IGlzIGNsZWFyICgwKSwKKyAgICAgKiBpbiBBZHZJbml0QXNjMzU1MC8zOEMwODAwRHJpdmVyKCkgdGVsbCB0aGUgbWljcm9jb2RlIHRvIGlnbm9yZQorICAgICAqIERNQSBwYXJpdHkgZXJyb3JzLgorICAgICAqLworICAgIGFzY19kdmMtPmNmZy0+Y29udHJvbF9mbGFnID0gMDsKKyAgICBpZiAoKChEdmNBZHZSZWFkUENJQ29uZmlnQnl0ZShhc2NfZHZjLCBBc2NQQ0lDb25maWdDb21tYW5kUmVnaXN0ZXIpCisgICAgICAgICAmIEFzY1BDSUNtZFJlZ0JpdHNfUGFyRXJyUmVzcEN0cmwpKSA9PSAwKQorICAgIHsKKyAgICAgICAgYXNjX2R2Yy0+Y2ZnLT5jb250cm9sX2ZsYWcgfD0gQ09OVFJPTF9GTEFHX0lHTk9SRV9QRVJSOworICAgIH0KKworICAgIGFzY19kdmMtPmNmZy0+bGliX3ZlcnNpb24gPSAoQURWX0xJQl9WRVJTSU9OX01BSk9SIDw8IDgpIHwKKyAgICAgIEFEVl9MSUJfVkVSU0lPTl9NSU5PUjsKKyAgICBhc2NfZHZjLT5jZmctPmNoaXBfdmVyc2lvbiA9CisgICAgICBBZHZHZXRDaGlwVmVyc2lvbihpb3BfYmFzZSwgYXNjX2R2Yy0+YnVzX3R5cGUpOworCisgICAgQVNDX0RCRzIoMSwgIkFkdkluaXRHZXRDb25maWc6IGlvcGJfY2hpcF9pZF8xOiAweCV4IDB4JXhcbiIsCisgICAgICAgICh1c2hvcnQpIEFkdlJlYWRCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfQ0hJUF9JRF8xKSwKKyAgICAgICAgKHVzaG9ydCkgQURWX0NISVBfSURfQllURSk7CisKKyAgICBBU0NfREJHMigxLCAiQWR2SW5pdEdldENvbmZpZzogaW9wd19jaGlwX2lkXzA6IDB4JXggMHgleFxuIiwKKyAgICAgICAgKHVzaG9ydCkgQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19DSElQX0lEXzApLAorICAgICAgICAodXNob3J0KSBBRFZfQ0hJUF9JRF9XT1JEKTsKKworICAgIC8qCisgICAgICogUmVzZXQgdGhlIGNoaXAgdG8gc3RhcnQgYW5kIGFsbG93IHJlZ2lzdGVyIHdyaXRlcy4KKyAgICAgKi8KKyAgICBpZiAoQWR2RmluZFNpZ25hdHVyZShpb3BfYmFzZSkgPT0gMCkKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlID0gQVNDX0lFUlJfQkFEX1NJR05BVFVSRTsKKyAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBjYWxsZXIgbXVzdCBzZXQgJ2NoaXBfdHlwZScgdG8gYSB2YWxpZCBzZXR0aW5nLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSAhPSBBRFZfQ0hJUF9BU0MzNTUwICYmCisgICAgICAgICAgICBhc2NfZHZjLT5jaGlwX3R5cGUgIT0gQURWX0NISVBfQVNDMzhDMDgwMCAmJgorICAgICAgICAgICAgYXNjX2R2Yy0+Y2hpcF90eXBlICE9IEFEVl9DSElQX0FTQzM4QzE2MDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX0JBRF9DSElQVFlQRTsKKyAgICAgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBSZXNldCBDaGlwLgorICAgICAgICAgKi8KKyAgICAgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfQ1RSTF9SRUcsCisgICAgICAgICAgICBBRFZfQ1RSTF9SRUdfQ01EX1JFU0VUKTsKKyAgICAgICAgRHZjU2xlZXBNaWxsaVNlY29uZCgxMDApOworICAgICAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19DVFJMX1JFRywKKyAgICAgICAgICAgIEFEVl9DVFJMX1JFR19DTURfV1JfSU9fUkVHKTsKKworICAgICAgICBpZiAoYXNjX2R2Yy0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzE2MDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoc3RhdHVzID0gQWR2SW5pdEZyb20zOEMxNjAwRUVQKGFzY19kdmMpKSA9PSBBRFZfRVJST1IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBBZHZJbml0RnJvbTM4QzA4MDBFRVAoYXNjX2R2YykpID09IEFEVl9FUlJPUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBBZHZJbml0RnJvbTM1NTBFRVAoYXNjX2R2YykpID09IEFEVl9FUlJPUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdhcm5fY29kZSB8PSBzdGF0dXM7CisgICAgfQorCisgICAgcmV0dXJuIHdhcm5fY29kZTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIEFTQy0zNTUwLgorICoKKyAqIE9uIGZhaWx1cmUgc2V0IHRoZSBBRFZfRFZDX1ZBUiBmaWVsZCAnZXJyX2NvZGUnIGFuZCByZXR1cm4gQURWX0VSUk9SLgorICoKKyAqIEZvciBhIG5vbi1mYXRhbCBlcnJvciByZXR1cm4gYSB3YXJuaW5nIGNvZGUuIElmIHRoZXJlIGFyZSBubyB3YXJuaW5ncworICogdGhlbiAwIGlzIHJldHVybmVkLgorICoKKyAqIE5lZWRlZCBhZnRlciBpbml0aWFsaXphdGlvbiBmb3IgZXJyb3IgcmVjb3ZlcnkuCisgKi8KK1NUQVRJQyBpbnQKK0FkdkluaXRBc2MzNTUwRHJpdmVyKEFEVl9EVkNfVkFSICphc2NfZHZjKQoreworICAgIEFkdlBvcnRBZGRyIGlvcF9iYXNlOworICAgIHVzaG9ydCAgICAgIHdhcm5fY29kZTsKKyAgICBBRFZfRENOVCAgICBzdW07CisgICAgaW50ICAgICAgICAgYmVnaW5fYWRkcjsKKyAgICBpbnQgICAgICAgICBlbmRfYWRkcjsKKyAgICB1c2hvcnQgICAgICBjb2RlX3N1bTsKKyAgICBpbnQgICAgICAgICB3b3JkOworICAgIGludCAgICAgICAgIGo7CisgICAgaW50ICAgICAgICAgYWR2X2FzYzM1NTBfZXhwYW5kZWRfc2l6ZTsKKyAgICBBRFZfQ0FSUl9UICAqY2FycnA7CisgICAgQURWX0RDTlQgICAgY29udGlnX2xlbjsKKyAgICBBRFZfU0RDTlQgICBidWZfc2l6ZTsKKyAgICBBRFZfUEFERFIgICBjYXJyX3BhZGRyOworICAgIGludCAgICAgICAgIGk7CisgICAgdXNob3J0ICAgICAgc2NzaV9jZmcxOworICAgIHVjaGFyICAgICAgIHRpZDsKKyAgICB1c2hvcnQgICAgICBiaW9zX21lbVtBU0NfTUNfQklPU0xFTi8yXTsgLyogQklPUyBSSVNDIE1lbW9yeSAweDQwLTB4OEYuICovCisgICAgdXNob3J0ICAgICAgd2R0cl9hYmxlID0gMCwgc2R0cl9hYmxlLCB0YWdxbmdfYWJsZTsKKyAgICB1Y2hhciAgICAgICBtYXhfY21kW0FEVl9NQVhfVElEICsgMV07CisKKyAgICAvKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGVycm9yLCBkb24ndCBjb250aW51ZS4gKi8KKyAgICBpZiAoYXNjX2R2Yy0+ZXJyX2NvZGUgIT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGUgY2FsbGVyIG11c3Qgc2V0ICdjaGlwX3R5cGUnIHRvIEFEVl9DSElQX0FTQzM1NTAuCisgICAgICovCisgICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSAhPSBBRFZfQ0hJUF9BU0MzNTUwKQorICAgIHsKKyAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfQkFEX0NISVBUWVBFOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKworICAgIHdhcm5fY29kZSA9IDA7CisgICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKworICAgIC8qCisgICAgICogU2F2ZSB0aGUgUklTQyBtZW1vcnkgQklPUyByZWdpb24gYmVmb3JlIHdyaXRpbmcgdGhlIG1pY3JvY29kZS4KKyAgICAgKiBUaGUgQklPUyBtYXkgYWxyZWFkeSBiZSBsb2FkZWQgYW5kIHVzaW5nIGl0cyBSSVNDIExSQU0gcmVnaW9uCisgICAgICogc28gaXRzIHJlZ2lvbiBtdXN0IGJlIHNhdmVkIGFuZCByZXN0b3JlZC4KKyAgICAgKgorICAgICAqIE5vdGU6IFRoaXMgY29kZSBtYWtlcyB0aGUgYXNzdW1wdGlvbiwgd2hpY2ggaXMgY3VycmVudGx5IHRydWUsCisgICAgICogdGhhdCBhIGNoaXAgcmVzZXQgZG9lcyBub3QgY2xlYXIgUklTQyBMUkFNLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBBU0NfTUNfQklPU0xFTi8yOyBpKyspCisgICAgeworICAgICAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19CSU9TTUVNICsgKDIgKiBpKSwgYmlvc19tZW1baV0pOworICAgIH0KKworICAgIC8qCisgICAgICogU2F2ZSBjdXJyZW50IHBlciBUSUQgbmVnb3RpYXRlZCB2YWx1ZXMuCisgICAgICovCisgICAgaWYgKGJpb3NfbWVtWyhBU0NfTUNfQklPU19TSUdOQVRVUkUgLSBBU0NfTUNfQklPU01FTSkvMl0gPT0gMHg1NUFBKQorICAgIHsKKyAgICAgICAgdXNob3J0ICBiaW9zX3ZlcnNpb24sIG1ham9yLCBtaW5vcjsKKworICAgICAgICBiaW9zX3ZlcnNpb24gPSBiaW9zX21lbVsoQVNDX01DX0JJT1NfVkVSU0lPTiAtIEFTQ19NQ19CSU9TTUVNKS8yXTsKKyAgICAgICAgbWFqb3IgPSAoYmlvc192ZXJzaW9uICA+PiAxMikgJiAweEY7CisgICAgICAgIG1pbm9yID0gKGJpb3NfdmVyc2lvbiAgPj4gOCkgJiAweEY7CisgICAgICAgIGlmIChtYWpvciA8IDMgfHwgKG1ham9yID09IDMgJiYgbWlub3IgPT0gMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEJJT1MgMy4xIGFuZCBlYXJsaWVyIGxvY2F0aW9uIG9mICd3ZHRyX2FibGUnIHZhcmlhYmxlLiAqLworICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCAweDEyMCwgd2R0cl9hYmxlKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfQUJMRSwgd2R0cl9hYmxlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIHNkdHJfYWJsZSk7CisgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVEFHUU5HX0FCTEUsIHRhZ3FuZ19hYmxlKTsKKyAgICBmb3IgKHRpZCA9IDA7IHRpZCA8PSBBRFZfTUFYX1RJRDsgdGlkKyspCisgICAgeworICAgICAgICBBZHZSZWFkQnl0ZUxyYW0oaW9wX2Jhc2UsIEFTQ19NQ19OVU1CRVJfT0ZfTUFYX0NNRCArIHRpZCwKKyAgICAgICAgICAgIG1heF9jbWRbdGlkXSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBMb2FkIHRoZSBNaWNyb2NvZGUKKyAgICAgKgorICAgICAqIFdyaXRlIHRoZSBtaWNyb2NvZGUgaW1hZ2UgdG8gUklTQyBtZW1vcnkgc3RhcnRpbmcgYXQgYWRkcmVzcyAwLgorICAgICAqLworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1JBTV9BRERSLCAwKTsKKyAgICAvKiBBc3N1bWUgdGhlIGZvbGxvd2luZyBjb21wcmVzc2VkIGZvcm1hdCBvZiB0aGUgbWljcm9jb2RlIGJ1ZmZlcjoKKyAgICAgKgorICAgICAqICAyNTQgd29yZCAoNTA4IGJ5dGUpIHRhYmxlIGluZGV4ZWQgYnkgYnl0ZSBjb2RlIGZvbGxvd2VkCisgICAgICogIGJ5IHRoZSBmb2xsb3dpbmcgYnl0ZSBjb2RlczoKKyAgICAgKgorICAgICAqICAgIDEtQnl0ZSBDb2RlOgorICAgICAqICAgICAgMDA6IEVtaXQgd29yZCAwIGluIHRhYmxlLgorICAgICAqICAgICAgMDE6IEVtaXQgd29yZCAxIGluIHRhYmxlLgorICAgICAqICAgICAgLgorICAgICAqICAgICAgRkQ6IEVtaXQgd29yZCAyNTMgaW4gdGFibGUuCisgICAgICoKKyAgICAgKiAgICBNdWx0aS1CeXRlIENvZGU6CisgICAgICogICAgICBGRSBXVyBXVzogKDMgYnl0ZSBjb2RlKSBXb3JkIHRvIGVtaXQgaXMgdGhlIG5leHQgd29yZCBXVyBXVy4KKyAgICAgKiAgICAgIEZGIEJCIFdXIFdXOiAoNCBieXRlIGNvZGUpIEVtaXQgQkIgY291bnQgdGltZXMgbmV4dCB3b3JkIFdXIFdXLgorICAgICAqLworICAgIHdvcmQgPSAwOworICAgIGZvciAoaSA9IDI1MyAqIDI7IGkgPCBfYWR2X2FzYzM1NTBfc2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKF9hZHZfYXNjMzU1MF9idWZbaV0gPT0gMHhmZikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IF9hZHZfYXNjMzU1MF9idWZbaSArIDFdOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWR2V3JpdGVXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UsICgoKHVzaG9ydCkKKyAgICAgICAgICAgICAgICAgICAgX2Fkdl9hc2MzNTUwX2J1ZltpICsgM10gPDwgOCkgfAorICAgICAgICAgICAgICAgIF9hZHZfYXNjMzU1MF9idWZbaSArIDJdKSk7CisgICAgICAgICAgICAgICAgd29yZCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSArPSAzOworICAgICAgICB9IGVsc2UgaWYgKF9hZHZfYXNjMzU1MF9idWZbaV0gPT0gMHhmZSkKKyAgICAgICAgeworICAgICAgICAgICAgQWR2V3JpdGVXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UsICgoKHVzaG9ydCkKKyAgICAgICAgICAgICAgICBfYWR2X2FzYzM1NTBfYnVmW2kgKyAyXSA8PCA4KSB8CisgICAgICAgICAgICAgICAgX2Fkdl9hc2MzNTUwX2J1ZltpICsgMV0pKTsKKyAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgIHdvcmQrKzsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAoKCh1c2hvcnQpCisgICAgICAgICAgICAgICAgX2Fkdl9hc2MzNTUwX2J1ZlsoX2Fkdl9hc2MzNTUwX2J1ZltpXSAqIDIpICsgMV0gPDwgOCkgfAorICAgICAgICAgICAgICAgIF9hZHZfYXNjMzU1MF9idWZbX2Fkdl9hc2MzNTUwX2J1ZltpXSAqIDJdKSk7CisgICAgICAgICAgICB3b3JkKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCAnd29yZCcgZm9yIGxhdGVyIHVzZSB0byBjbGVhciB0aGUgcmVzdCBvZiBtZW1vcnkgYW5kIHNhdmUKKyAgICAgKiB0aGUgZXhwYW5kZWQgbWNvZGUgc2l6ZS4KKyAgICAgKi8KKyAgICB3b3JkICo9IDI7CisgICAgYWR2X2FzYzM1NTBfZXhwYW5kZWRfc2l6ZSA9IHdvcmQ7CisKKyAgICAvKgorICAgICAqIENsZWFyIHRoZSByZXN0IG9mIEFTQy0zNTUwIEludGVybmFsIFJBTSAoOEtCKS4KKyAgICAgKi8KKyAgICBmb3IgKDsgd29yZCA8IEFEVl8zNTUwX01FTVNJWkU7IHdvcmQgKz0gMikKKyAgICB7CisgICAgICAgIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAwKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFZlcmlmeSB0aGUgbWljcm9jb2RlIGNoZWNrc3VtLgorICAgICAqLworICAgIHN1bSA9IDA7CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIDApOworCisgICAgZm9yICh3b3JkID0gMDsgd29yZCA8IGFkdl9hc2MzNTUwX2V4cGFuZGVkX3NpemU7IHdvcmQgKz0gMikKKyAgICB7CisgICAgICAgIHN1bSArPSBBZHZSZWFkV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlKTsKKyAgICB9CisKKyAgICBpZiAoc3VtICE9IF9hZHZfYXNjMzU1MF9jaGtzdW0pCisgICAgeworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9NQ09ERV9DSEtTVU07CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXN0b3JlIHRoZSBSSVNDIG1lbW9yeSBCSU9TIHJlZ2lvbi4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQVNDX01DX0JJT1NMRU4vMjsgaSsrKQorICAgIHsKKyAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0JJT1NNRU0gKyAoMiAqIGkpLCBiaW9zX21lbVtpXSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgYW5kIHdyaXRlIHRoZSBtaWNyb2NvZGUgY29kZSBjaGVja3N1bSB0byB0aGUgbWljcm9jb2RlCisgICAgICogY29kZSBjaGVja3N1bSBsb2NhdGlvbiBBU0NfTUNfQ09ERV9DSEtfU1VNICgweDJDKS4KKyAgICAgKi8KKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT0RFX0JFR0lOX0FERFIsIGJlZ2luX2FkZHIpOworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfRU5EX0FERFIsIGVuZF9hZGRyKTsKKyAgICBjb2RlX3N1bSA9IDA7CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIGJlZ2luX2FkZHIpOworICAgIGZvciAod29yZCA9IGJlZ2luX2FkZHI7IHdvcmQgPCBlbmRfYWRkcjsgd29yZCArPSAyKQorICAgIHsKKyAgICAgICAgY29kZV9zdW0gKz0gQWR2UmVhZFdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSk7CisgICAgfQorICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT0RFX0NIS19TVU0sIGNvZGVfc3VtKTsKKworICAgIC8qCisgICAgICogUmVhZCBhbmQgc2F2ZSBtaWNyb2NvZGUgdmVyc2lvbiBhbmQgZGF0ZS4KKyAgICAgKi8KKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19WRVJTSU9OX0RBVEUsIGFzY19kdmMtPmNmZy0+bWNvZGVfZGF0ZSk7CisgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVkVSU0lPTl9OVU0sIGFzY19kdmMtPmNmZy0+bWNvZGVfdmVyc2lvbik7CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgY2hpcCB0eXBlIHRvIGluZGljYXRlIHRoZSBBU0MzNTUwLgorICAgICAqLworICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DSElQX1RZUEUsIEFEVl9DSElQX0FTQzM1NTApOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgUENJIENvbmZpZ3VyYXRpb24gQ29tbWFuZCBSZWdpc3RlciAiUGFyaXR5IEVycm9yIFJlc3BvbnNlCisgICAgICogQ29udHJvbCIgQml0IHdhcyBjbGVhciAoMCksIHRoZW4gc2V0IHRoZSBtaWNyb2NvZGUgdmFyaWFibGUKKyAgICAgKiAnY29udHJvbF9mbGFnJyBDT05UUk9MX0ZMQUdfSUdOT1JFX1BFUlIgZmxhZyB0byB0ZWxsIHRoZSBtaWNyb2NvZGUKKyAgICAgKiB0byBpZ25vcmUgRE1BIHBhcml0eSBlcnJvcnMuCisgICAgICovCisgICAgaWYgKGFzY19kdmMtPmNmZy0+Y29udHJvbF9mbGFnICYgQ09OVFJPTF9GTEFHX0lHTk9SRV9QRVJSKQorICAgIHsKKyAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09OVFJPTF9GTEFHLCB3b3JkKTsKKyAgICAgICAgd29yZCB8PSBDT05UUk9MX0ZMQUdfSUdOT1JFX1BFUlI7CisgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT05UUk9MX0ZMQUcsIHdvcmQpOworICAgIH0KKworICAgIC8qCisgICAgICogRm9yIEFTQy0zNTUwLCBzZXR0aW5nIHRoZSBTVEFSVF9DVExfRU1GVSBbMzoyXSBiaXRzIHNldHMgYSBGSUZPCisgICAgICogdGhyZXNob2xkIG9mIDEyOCBieXRlcy4gVGhpcyByZWdpc3RlciBpcyBvbmx5IGFjY2Vzc2libGUgdG8gdGhlIGhvc3QuCisgICAgICovCisgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfRE1BX0NGRzAsCisgICAgICAgIFNUQVJUX0NUTF9FTUZVIHwgUkVBRF9DTURfTVJNKTsKKworICAgIC8qCisgICAgICogTWljcm9jb2RlIG9wZXJhdGluZyB2YXJpYWJsZXMgZm9yIFdEVFIsIFNEVFIsIGFuZCBjb21tYW5kIHRhZworICAgICAqIHF1ZXVpbmcgd2lsbCBiZSBzZXQgaW4gQWR2SW5xdWlyeUhhbmRsaW5nKCkgYmFzZWQgb24gd2hhdCBhCisgICAgICogZGV2aWNlIHJlcG9ydHMgaXQgaXMgY2FwYWJsZSBvZiBpbiBJbnF1aXJ5IGJ5dGUgNy4KKyAgICAgKgorICAgICAqIElmIFNDU0kgQnVzIFJlc2V0cyBoYXZlIGJlZW4gZGlzYWJsZWQsIHRoZW4gZGlyZWN0bHkgc2V0CisgICAgICogU0RUUiBhbmQgV0RUUiBmcm9tIHRoZSBFRVBST00gY29uZmlndXJhdGlvbi4gVGhpcyB3aWxsIGFsbG93CisgICAgICogdGhlIEJJT1MgYW5kIHdhcm0gYm9vdCB0byB3b3JrIHdpdGhvdXQgYSBTQ1NJIGJ1cyBoYW5nIG9uCisgICAgICogdGhlIElucXVpcnkgY2F1c2VkIGJ5IGhvc3QgYW5kIHRhcmdldCBtaXNtYXRjaGVkIERUUiB2YWx1ZXMuCisgICAgICogV2l0aG91dCB0aGUgU0NTSSBCdXMgUmVzZXQsIGJlZm9yZSBhbiBJbnF1aXJ5IGEgZGV2aWNlIGNhbid0CisgICAgICogYmUgYXNzdW1lZCB0byBiZSBpbiBBc3luY2hyb25vdXMsIE5hcnJvdyBtb2RlLgorICAgICAqLworICAgIGlmICgoYXNjX2R2Yy0+Ymlvc19jdHJsICYgQklPU19DVFJMX1JFU0VUX1NDU0lfQlVTKSA9PSAwKQorICAgIHsKKyAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfQUJMRSwgYXNjX2R2Yy0+d2R0cl9hYmxlKTsKKyAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfQUJMRSwgYXNjX2R2Yy0+c2R0cl9hYmxlKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCBtaWNyb2NvZGUgb3BlcmF0aW5nIHZhcmlhYmxlcyBmb3IgU0RUUl9TUEVFRDEsIFNEVFJfU1BFRUQyLAorICAgICAqIFNEVFJfU1BFRUQzLCBhbmQgU0RUUl9TUEVFRDQgYmFzZWQgb24gdGhlIFVMVFJBIEVFUFJPTSBwZXIgVElECisgICAgICogYml0bWFzay4gVGhlc2UgdmFsdWVzIGRldGVybWluZSB0aGUgbWF4aW11bSBTRFRSIHNwZWVkIG5lZ290aWF0ZWQKKyAgICAgKiB3aXRoIGEgZGV2aWNlLgorICAgICAqCisgICAgICogVGhlIFNEVFIgcGVyIFRJRCBiaXRtYXNrIG92ZXJyaWRlcyB0aGUgU0RUUl9TUEVFRDEsIFNEVFJfU1BFRUQyLAorICAgICAqIFNEVFJfU1BFRUQzLCBhbmQgU0RUUl9TUEVFRDQgdmFsdWVzIHNvIGl0IGlzIHNhZmUgdG8gc2V0IHRoZW0KKyAgICAgKiB3aXRob3V0IGRldGVybWluaW5nIGhlcmUgd2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIFNEVFIuCisgICAgICoKKyAgICAgKiA0LWJpdCBzcGVlZCAgU0RUUiBzcGVlZCBuYW1lCisgICAgICogPT09PT09PT09PT0gID09PT09PT09PT09PT09PQorICAgICAqIDAwMDBiICgweDApICBTRFRSIGRpc2FibGVkCisgICAgICogMDAwMWIgKDB4MSkgIDUgTWh6CisgICAgICogMDAxMGIgKDB4MikgIDEwIE1oegorICAgICAqIDAwMTFiICgweDMpICAyMCBNaHogKFVsdHJhKQorICAgICAqIDAxMDBiICgweDQpICA0MCBNaHogKExWRC9VbHRyYTIpCisgICAgICogMDEwMWIgKDB4NSkgIDgwIE1oeiAoTFZEMi9VbHRyYTMpCisgICAgICogMDExMGIgKDB4NikgIFVuZGVmaW5lZAorICAgICAqIC4KKyAgICAgKiAxMTExYiAoMHhGKSAgVW5kZWZpbmVkCisgICAgICovCisgICAgd29yZCA9IDA7CisgICAgZm9yICh0aWQgPSAwOyB0aWQgPD0gQURWX01BWF9USUQ7IHRpZCsrKQorICAgIHsKKyAgICAgICAgaWYgKEFEVl9USURfVE9fVElETUFTSyh0aWQpICYgYXNjX2R2Yy0+dWx0cmFfYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2V0IFVsdHJhIHNwZWVkIGZvciBUSUQgJ3RpZCcuICovCisgICAgICAgICAgICB3b3JkIHw9ICgweDMgPDwgKDQgKiAodGlkICUgNCkpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCBGYXN0IHNwZWVkIGZvciBUSUQgJ3RpZCcuICovCisgICAgICAgICAgICB3b3JkIHw9ICgweDIgPDwgKDQgKiAodGlkICUgNCkpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGlkID09IDMpIC8qIENoZWNrIGlmIGRvbmUgd2l0aCBzZHRyX3NwZWVkMS4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQxLCB3b3JkKTsKKyAgICAgICAgICAgIHdvcmQgPSAwOworICAgICAgICB9IGVsc2UgaWYgKHRpZCA9PSA3KSAvKiBDaGVjayBpZiBkb25lIHdpdGggc2R0cl9zcGVlZDIuICovCisgICAgICAgIHsKKyAgICAgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX1NQRUVEMiwgd29yZCk7CisgICAgICAgICAgICB3b3JkID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICh0aWQgPT0gMTEpIC8qIENoZWNrIGlmIGRvbmUgd2l0aCBzZHRyX3NwZWVkMy4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQzLCB3b3JkKTsKKyAgICAgICAgICAgIHdvcmQgPSAwOworICAgICAgICB9IGVsc2UgaWYgKHRpZCA9PSAxNSkgLyogQ2hlY2sgaWYgZG9uZSB3aXRoIHNkdHJfc3BlZWQ0LiAqLworICAgICAgICB7CisgICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9TUEVFRDQsIHdvcmQpOworICAgICAgICAgICAgLyogRW5kIG9mIGxvb3AuICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCBtaWNyb2NvZGUgb3BlcmF0aW5nIHZhcmlhYmxlIGZvciB0aGUgZGlzY29ubmVjdCBwZXIgVElEIGJpdG1hc2suCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RJU0NfRU5BQkxFLCBhc2NfZHZjLT5jZmctPmRpc2NfZW5hYmxlKTsKKworICAgIC8qCisgICAgICogU2V0IFNDU0lfQ0ZHMCBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZS4KKyAgICAgKgorICAgICAqIFRoZSBtaWNyb2NvZGUgd2lsbCBzZXQgdGhlIFNDU0lfQ0ZHMCByZWdpc3RlciB1c2luZyB0aGlzIHZhbHVlCisgICAgICogYWZ0ZXIgaXQgaXMgc3RhcnRlZCBiZWxvdy4KKyAgICAgKi8KKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVGQVVMVF9TQ1NJX0NGRzAsCisgICAgICAgIFBBUklUWV9FTiB8IFFVRVVFXzEyOCB8IFNFTF9UTU9fTE9ORyB8IE9VUl9JRF9FTiB8CisgICAgICAgIGFzY19kdmMtPmNoaXBfc2NzaV9pZCk7CisKKyAgICAvKgorICAgICAqIERldGVybWluZSBTQ1NJX0NGRzEgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUuCisgICAgICoKKyAgICAgKiBUaGUgbWljcm9jb2RlIHdpbGwgc2V0IHRoZSBTQ1NJX0NGRzEgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisgICAgICovCisKKyAgICAvKiBSZWFkIGN1cnJlbnQgU0NTSV9DRkcxIFJlZ2lzdGVyIHZhbHVlLiAqLworICAgIHNjc2lfY2ZnMSA9IEFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfU0NTSV9DRkcxKTsKKworICAgIC8qCisgICAgICogSWYgYWxsIHRocmVlIGNvbm5lY3RvcnMgYXJlIGluIHVzZSwgcmV0dXJuIGFuIGVycm9yLgorICAgICAqLworICAgIGlmICgoc2NzaV9jZmcxICYgQ0FCTEVfSUxMRUdBTF9BKSA9PSAwIHx8CisgICAgICAgIChzY3NpX2NmZzEgJiBDQUJMRV9JTExFR0FMX0IpID09IDApCisgICAgeworICAgICAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfSUxMRUdBTF9DT05ORUNUSU9OOworICAgICAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoZSBpbnRlcm5hbCBuYXJyb3cgY2FibGUgaXMgcmV2ZXJzZWQgYWxsIG9mIHRoZSBTQ1NJX0NUUkwKKyAgICAgKiByZWdpc3RlciBzaWduYWxzIHdpbGwgYmUgc2V0LiBDaGVjayBmb3IgYW5kIHJldHVybiBhbiBlcnJvciBpZgorICAgICAqIHRoaXMgY29uZGl0aW9uIGlzIGZvdW5kLgorICAgICAqLworICAgIGlmICgoQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19TQ1NJX0NUUkwpICYgMHgzRjA3KSA9PSAweDNGMDcpCisgICAgeworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9SRVZFUlNFRF9DQUJMRTsKKyAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoaXMgaXMgYSBkaWZmZXJlbnRpYWwgYm9hcmQgYW5kIGEgc2luZ2xlLWVuZGVkIGRldmljZQorICAgICAqIGlzIGF0dGFjaGVkIHRvIG9uZSBvZiB0aGUgY29ubmVjdG9ycywgcmV0dXJuIGFuIGVycm9yLgorICAgICAqLworICAgIGlmICgoc2NzaV9jZmcxICYgRElGRl9NT0RFKSAmJiAoc2NzaV9jZmcxICYgRElGRl9TRU5TRSkgPT0gMCkKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX1NJTkdMRV9FTkRfREVWSUNFOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgYXV0b21hdGljIHRlcm1pbmF0aW9uIGNvbnRyb2wgaXMgZW5hYmxlZCwgdGhlbiBzZXQgdGhlCisgICAgICogdGVybWluYXRpb24gdmFsdWUgYmFzZWQgb24gYSB0YWJsZSBsaXN0ZWQgaW4gYV9jb25kb3IuaC4KKyAgICAgKgorICAgICAqIElmIG1hbnVhbCB0ZXJtaW5hdGlvbiB3YXMgc3BlY2lmaWVkIHdpdGggYW4gRUVQUk9NIHNldHRpbmcKKyAgICAgKiB0aGVuICd0ZXJtaW5hdGlvbicgd2FzIHNldC11cCBpbiBBZHZJbml0RnJvbTM1NTBFRVBST00oKSBhbmQKKyAgICAgKiBpcyByZWFkeSB0byBiZSAnb3JlZCcgaW50byBTQ1NJX0NGRzEuCisgICAgICovCisgICAgaWYgKGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPT0gMCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBzb2Z0d2FyZSBhbHdheXMgY29udHJvbHMgdGVybWluYXRpb24gYnkgc2V0dGluZyBURVJNX0NUTF9TRUwuCisgICAgICAgICAqIElmIFRFUk1fQ1RMX1NFTCB3ZXJlIHNldCB0byAwLCB0aGUgaGFyZHdhcmUgd291bGQgc2V0IHRlcm1pbmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiB8PSBURVJNX0NUTF9TRUw7CisKKyAgICAgICAgc3dpdGNoKHNjc2lfY2ZnMSAmIENBQkxFX0RFVEVDVCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVEVSTV9DVExfSDogb24sIFRFUk1fQ1RMX0w6IG9uICovCisgICAgICAgICAgICBjYXNlIDB4MzogY2FzZSAweDc6IGNhc2UgMHhCOiBjYXNlIDB4RDogY2FzZSAweEU6IGNhc2UgMHhGOgorICAgICAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gfD0gKFRFUk1fQ1RMX0ggfCBURVJNX0NUTF9MKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLyogVEVSTV9DVExfSDogb24sIFRFUk1fQ1RMX0w6IG9mZiAqLworICAgICAgICAgICAgY2FzZSAweDE6IGNhc2UgMHg1OiBjYXNlIDB4OTogY2FzZSAweEE6IGNhc2UgMHhDOgorICAgICAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gfD0gVEVSTV9DVExfSDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLyogVEVSTV9DVExfSDogb2ZmLCBURVJNX0NUTF9MOiBvZmYgKi8KKyAgICAgICAgICAgIGNhc2UgMHgyOiBjYXNlIDB4NjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogQ2xlYXIgYW55IHNldCBURVJNX0NUTF9IIGFuZCBURVJNX0NUTF9MIGJpdHMuCisgICAgICovCisgICAgc2NzaV9jZmcxICY9IH5URVJNX0NUTDsKKworICAgIC8qCisgICAgICogSW52ZXJ0IHRoZSBURVJNX0NUTF9IIGFuZCBURVJNX0NUTF9MIGJpdHMgYW5kIHRoZW4KKyAgICAgKiBzZXQgJ3Njc2lfY2ZnMScuIFRoZSBURVJNX1BPTCBiaXQgZG9lcyBub3QgbmVlZCB0byBiZQorICAgICAqIHJlZmVyZW5jZWQsIGJlY2F1c2UgdGhlIGhhcmR3YXJlIGludGVybmFsbHkgaW52ZXJ0cworICAgICAqIHRoZSBUZXJtaW5hdGlvbiBIaWdoIGFuZCBMb3cgYml0cyBpZiBURVJNX1BPTCBpcyBzZXQuCisgICAgICovCisgICAgc2NzaV9jZmcxIHw9IChURVJNX0NUTF9TRUwgfCAofmFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gJiBURVJNX0NUTCkpOworCisgICAgLyoKKyAgICAgKiBTZXQgU0NTSV9DRkcxIE1pY3JvY29kZSBEZWZhdWx0IFZhbHVlCisgICAgICoKKyAgICAgKiBTZXQgZmlsdGVyIHZhbHVlIGFuZCBwb3NzaWJseSBtb2RpZmllZCB0ZXJtaW5hdGlvbiBjb250cm9sCisgICAgICogYml0cyBpbiB0aGUgTWljcm9jb2RlIFNDU0lfQ0ZHMSBSZWdpc3RlciBWYWx1ZS4KKyAgICAgKgorICAgICAqIFRoZSBtaWNyb2NvZGUgd2lsbCBzZXQgdGhlIFNDU0lfQ0ZHMSByZWdpc3RlciB1c2luZyB0aGlzIHZhbHVlCisgICAgICogYWZ0ZXIgaXQgaXMgc3RhcnRlZCBiZWxvdy4KKyAgICAgKi8KKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVGQVVMVF9TQ1NJX0NGRzEsCisgICAgICAgIEZMVFJfRElTQUJMRSB8IHNjc2lfY2ZnMSk7CisKKyAgICAvKgorICAgICAqIFNldCBNRU1fQ0ZHIE1pY3JvY29kZSBEZWZhdWx0IFZhbHVlCisgICAgICoKKyAgICAgKiBUaGUgbWljcm9jb2RlIHdpbGwgc2V0IHRoZSBNRU1fQ0ZHIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKKyAgICAgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgorICAgICAqCisgICAgICogTUVNX0NGRyBtYXkgYmUgYWNjZXNzZWQgYXMgYSB3b3JkIG9yIGJ5dGUsIGJ1dCBvbmx5IGJpdHMgMC03CisgICAgICogYXJlIGRlZmluZWQuCisgICAgICoKKyAgICAgKiBBU0MtMzU1MCBoYXMgOEtCIGludGVybmFsIG1lbW9yeS4KKyAgICAgKi8KKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVGQVVMVF9NRU1fQ0ZHLAorICAgICAgICBCSU9TX0VOIHwgUkFNX1NaXzhLQik7CisKKyAgICAvKgorICAgICAqIFNldCBTRUxfTUFTSyBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZQorICAgICAqCisgICAgICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0VMX01BU0sgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFRkFVTFRfU0VMX01BU0ssCisgICAgICAgIEFEVl9USURfVE9fVElETUFTSyhhc2NfZHZjLT5jaGlwX3Njc2lfaWQpKTsKKworICAgIC8qCisgICAgICogQnVpbGQgY2FycmllciBmcmVlbGlzdC4KKyAgICAgKgorICAgICAqIERyaXZlciBtdXN0IGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBzZXQgJ2NhcnJpZXJfYnVmJy4KKyAgICAgKi8KKyAgICBBU0NfQVNTRVJUKGFzY19kdmMtPmNhcnJpZXJfYnVmICE9IE5VTEwpOworCisgICAgY2FycnAgPSAoQURWX0NBUlJfVCAqKSBBRFZfMTZCQUxJR04oYXNjX2R2Yy0+Y2Fycmllcl9idWYpOworICAgIGFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSBOVUxMOworICAgIGlmIChjYXJycCA9PSAoQURWX0NBUlJfVCAqKSBhc2NfZHZjLT5jYXJyaWVyX2J1ZikKKyAgICB7CisgICAgICAgIGJ1Zl9zaXplID0gQURWX0NBUlJJRVJfQlVGU0laRTsKKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIGJ1Zl9zaXplID0gQURWX0NBUlJJRVJfQlVGU0laRSAtIHNpemVvZihBRFZfQ0FSUl9UKTsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIC8qCisgICAgICAgICAqIEdldCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBjYXJyaWVyICdjYXJycCcuCisgICAgICAgICAqLworICAgICAgICBjb250aWdfbGVuID0gc2l6ZW9mKEFEVl9DQVJSX1QpOworICAgICAgICBjYXJyX3BhZGRyID0gY3B1X3RvX2xlMzIoRHZjR2V0UGh5QWRkcihhc2NfZHZjLCBOVUxMLCAodWNoYXIgKikgY2FycnAsCisgICAgICAgICAgICAoQURWX1NEQ05UICopICZjb250aWdfbGVuLCBBRFZfSVNfQ0FSUklFUl9GTEFHKSk7CisKKyAgICAgICAgYnVmX3NpemUgLT0gc2l6ZW9mKEFEVl9DQVJSX1QpOworCisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoZSBjdXJyZW50IGNhcnJpZXIgaXMgbm90IHBoeXNpY2FsbHkgY29udGlndW91cywgdGhlbgorICAgICAgICAgKiBtYXliZSB0aGVyZSB3YXMgYSBwYWdlIGNyb3NzaW5nLiBUcnkgdGhlIG5leHQgY2FycmllciBhbGlnbmVkCisgICAgICAgICAqIHN0YXJ0IGFkZHJlc3MuCisgICAgICAgICAqLworICAgICAgICBpZiAoY29udGlnX2xlbiA8IHNpemVvZihBRFZfQ0FSUl9UKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FycnArKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY2FycnAtPmNhcnJfcGEgPSBjYXJyX3BhZGRyOworICAgICAgICBjYXJycC0+Y2Fycl92YSA9IGNwdV90b19sZTMyKEFEVl9WQUREUl9UT19VMzIoY2FycnApKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJbnNlcnQgdGhlIGNhcnJpZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnJlZWxpc3QuCisgICAgICAgICAqLworICAgICAgICBjYXJycC0+bmV4dF92cGEgPSBjcHVfdG9fbGUzMihBRFZfVkFERFJfVE9fVTMyKGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpKTsKKyAgICAgICAgYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IGNhcnJwOworCisgICAgICAgIGNhcnJwKys7CisgICAgfQorICAgIHdoaWxlIChidWZfc2l6ZSA+IDApOworCisgICAgLyoKKyAgICAgKiBTZXQtdXAgdGhlIEhvc3QtPlJJU0MgSW5pdGlhdG9yIENvbW1hbmQgUXVldWUgKElDUSkuCisgICAgICovCisKKyAgICBpZiAoKGFzY19kdmMtPmljcV9zcCA9IGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpID09IE5VTEwpCisgICAgeworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9OT19DQVJSSUVSOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKyAgICBhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0ID0gKEFEVl9DQVJSX1QgKikKKyAgICAgICAgQURWX1UzMl9UT19WQUREUihsZTMyX3RvX2NwdShhc2NfZHZjLT5pY3Ffc3AtPm5leHRfdnBhKSk7CisKKyAgICAvKgorICAgICAqIFRoZSBmaXJzdCBjb21tYW5kIGlzc3VlZCB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgc3RvcHBlciBjYXJyaWVyLgorICAgICAqLworICAgIGFzY19kdmMtPmljcV9zcC0+bmV4dF92cGEgPSBjcHVfdG9fbGUzMihBU0NfQ1FfU1RPUFBFUik7CisKKyAgICAvKgorICAgICAqIFNldCBSSVNDIElDUSBwaHlzaWNhbCBhZGRyZXNzIHN0YXJ0IHZhbHVlLgorICAgICAqLworICAgIEFkdldyaXRlRFdvcmRMcmFtTm9Td2FwKGlvcF9iYXNlLCBBU0NfTUNfSUNRLCBhc2NfZHZjLT5pY3Ffc3AtPmNhcnJfcGEpOworCisgICAgLyoKKyAgICAgKiBTZXQtdXAgdGhlIFJJU0MtPkhvc3QgSW5pdGlhdG9yIFJlc3BvbnNlIFF1ZXVlIChJUlEpLgorICAgICAqLworICAgIGlmICgoYXNjX2R2Yy0+aXJxX3NwID0gYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX05PX0NBUlJJRVI7CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorICAgIGFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSAoQURWX0NBUlJfVCAqKQorICAgICAgICAgQURWX1UzMl9UT19WQUREUihsZTMyX3RvX2NwdShhc2NfZHZjLT5pcnFfc3AtPm5leHRfdnBhKSk7CisKKyAgICAvKgorICAgICAqIFRoZSBmaXJzdCBjb21tYW5kIGNvbXBsZXRlZCBieSB0aGUgUklTQyB3aWxsIGJlIHBsYWNlZCBpbgorICAgICAqIHRoZSBzdG9wcGVyLgorICAgICAqCisgICAgICogTm90ZTogU2V0ICduZXh0X3ZwYScgdG8gQVNDX0NRX1NUT1BQRVIuIFdoZW4gdGhlIHJlcXVlc3QgaXMKKyAgICAgKiBjb21wbGV0ZWQgdGhlIFJJU0Mgd2lsbCBzZXQgdGhlIEFTQ19SUV9TVE9QUEVSIGJpdC4KKyAgICAgKi8KKyAgICBhc2NfZHZjLT5pcnFfc3AtPm5leHRfdnBhID0gY3B1X3RvX2xlMzIoQVNDX0NRX1NUT1BQRVIpOworCisgICAgLyoKKyAgICAgKiBTZXQgUklTQyBJUlEgcGh5c2ljYWwgYWRkcmVzcyBzdGFydCB2YWx1ZS4KKyAgICAgKi8KKyAgICBBZHZXcml0ZURXb3JkTHJhbU5vU3dhcChpb3BfYmFzZSwgQVNDX01DX0lSUSwgYXNjX2R2Yy0+aXJxX3NwLT5jYXJyX3BhKTsKKyAgICBhc2NfZHZjLT5jYXJyX3BlbmRpbmdfY250ID0gMDsKKworICAgIEFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0lOVFJfRU5BQkxFUywKKyAgICAgICAgKEFEVl9JTlRSX0VOQUJMRV9IT1NUX0lOVFIgfCBBRFZfSU5UUl9FTkFCTEVfR0xPQkFMX0lOVFIpKTsKKworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfQkVHSU5fQUREUiwgd29yZCk7CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUEMsIHdvcmQpOworCisgICAgLyogZmluYWxseSwgZmluYWxseSwgZ2VudGxlbWVuLCBzdGFydCB5b3VyIGVuZ2luZSAqLworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1JJU0NfQ1NSLCBBRFZfUklTQ19DU1JfUlVOKTsKKworICAgIC8qCisgICAgICogUmVzZXQgdGhlIFNDU0kgQnVzIGlmIHRoZSBFRVBST00gaW5kaWNhdGVzIHRoYXQgU0NTSSBCdXMKKyAgICAgKiBSZXNldHMgc2hvdWxkIGJlIHBlcmZvcm1lZC4gVGhlIFJJU0MgaGFzIHRvIGJlIHJ1bm5pbmcKKyAgICAgKiB0byBpc3N1ZSBhIFNDU0kgQnVzIFJlc2V0LgorICAgICAqLworICAgIGlmIChhc2NfZHZjLT5iaW9zX2N0cmwgJiBCSU9TX0NUUkxfUkVTRVRfU0NTSV9CVVMpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgQklPUyBTaWduYXR1cmUgaXMgcHJlc2VudCBpbiBtZW1vcnksIHJlc3RvcmUgdGhlCisgICAgICAgICAqIEJJT1MgSGFuZHNoYWtlIENvbmZpZ3VyYXRpb24gVGFibGUgYW5kIGRvIG5vdCBwZXJmb3JtCisgICAgICAgICAqIGEgU0NTSSBCdXMgUmVzZXQuCisgICAgICAgICAqLworICAgICAgICBpZiAoYmlvc19tZW1bKEFTQ19NQ19CSU9TX1NJR05BVFVSRSAtIEFTQ19NQ19CSU9TTUVNKS8yXSA9PSAweDU1QUEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZXN0b3JlIHBlciBUSUQgbmVnb3RpYXRlZCB2YWx1ZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIHdkdHJfYWJsZSk7CisgICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLCBzZHRyX2FibGUpOworICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7CisgICAgICAgICAgICBmb3IgKHRpZCA9IDA7IHRpZCA8PSBBRFZfTUFYX1RJRDsgdGlkKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWR2V3JpdGVCeXRlTHJhbShpb3BfYmFzZSwgQVNDX01DX05VTUJFUl9PRl9NQVhfQ01EICsgdGlkLAorICAgICAgICAgICAgICAgICAgICBtYXhfY21kW3RpZF0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEFkdlJlc2V0U0IoYXNjX2R2YykgIT0gQURWX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2Fybl9jb2RlID0gQVNDX1dBUk5fQlVTUkVTRVRfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gd2Fybl9jb2RlOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgQVNDLTM4QzA4MDAuCisgKgorICogT24gZmFpbHVyZSBzZXQgdGhlIEFEVl9EVkNfVkFSIGZpZWxkICdlcnJfY29kZScgYW5kIHJldHVybiBBRFZfRVJST1IuCisgKgorICogRm9yIGEgbm9uLWZhdGFsIGVycm9yIHJldHVybiBhIHdhcm5pbmcgY29kZS4gSWYgdGhlcmUgYXJlIG5vIHdhcm5pbmdzCisgKiB0aGVuIDAgaXMgcmV0dXJuZWQuCisgKgorICogTmVlZGVkIGFmdGVyIGluaXRpYWxpemF0aW9uIGZvciBlcnJvciByZWNvdmVyeS4KKyAqLworU1RBVElDIGludAorQWR2SW5pdEFzYzM4QzA4MDBEcml2ZXIoQURWX0RWQ19WQVIgKmFzY19kdmMpCit7CisgICAgQWR2UG9ydEFkZHIgaW9wX2Jhc2U7CisgICAgdXNob3J0ICAgICAgd2Fybl9jb2RlOworICAgIEFEVl9EQ05UICAgIHN1bTsKKyAgICBpbnQgICAgICAgICBiZWdpbl9hZGRyOworICAgIGludCAgICAgICAgIGVuZF9hZGRyOworICAgIHVzaG9ydCAgICAgIGNvZGVfc3VtOworICAgIGludCAgICAgICAgIHdvcmQ7CisgICAgaW50ICAgICAgICAgajsKKyAgICBpbnQgICAgICAgICBhZHZfYXNjMzhDMDgwMF9leHBhbmRlZF9zaXplOworICAgIEFEVl9DQVJSX1QgICpjYXJycDsKKyAgICBBRFZfRENOVCAgICBjb250aWdfbGVuOworICAgIEFEVl9TRENOVCAgIGJ1Zl9zaXplOworICAgIEFEVl9QQUREUiAgIGNhcnJfcGFkZHI7CisgICAgaW50ICAgICAgICAgaTsKKyAgICB1c2hvcnQgICAgICBzY3NpX2NmZzE7CisgICAgdWNoYXIgICAgICAgYnl0ZTsKKyAgICB1Y2hhciAgICAgICB0aWQ7CisgICAgdXNob3J0ICAgICAgYmlvc19tZW1bQVNDX01DX0JJT1NMRU4vMl07IC8qIEJJT1MgUklTQyBNZW1vcnkgMHg0MC0weDhGLiAqLworICAgIHVzaG9ydCAgICAgIHdkdHJfYWJsZSwgc2R0cl9hYmxlLCB0YWdxbmdfYWJsZTsKKyAgICB1Y2hhciAgICAgICBtYXhfY21kW0FEVl9NQVhfVElEICsgMV07CisKKyAgICAvKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGVycm9yLCBkb24ndCBjb250aW51ZS4gKi8KKyAgICBpZiAoYXNjX2R2Yy0+ZXJyX2NvZGUgIT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGUgY2FsbGVyIG11c3Qgc2V0ICdjaGlwX3R5cGUnIHRvIEFEVl9DSElQX0FTQzM4QzA4MDAuCisgICAgICovCisgICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSAhPSBBRFZfQ0hJUF9BU0MzOEMwODAwKQorICAgIHsKKyAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgPSBBU0NfSUVSUl9CQURfQ0hJUFRZUEU7CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorCisgICAgd2Fybl9jb2RlID0gMDsKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCisgICAgLyoKKyAgICAgKiBTYXZlIHRoZSBSSVNDIG1lbW9yeSBCSU9TIHJlZ2lvbiBiZWZvcmUgd3JpdGluZyB0aGUgbWljcm9jb2RlLgorICAgICAqIFRoZSBCSU9TIG1heSBhbHJlYWR5IGJlIGxvYWRlZCBhbmQgdXNpbmcgaXRzIFJJU0MgTFJBTSByZWdpb24KKyAgICAgKiBzbyBpdHMgcmVnaW9uIG11c3QgYmUgc2F2ZWQgYW5kIHJlc3RvcmVkLgorICAgICAqCisgICAgICogTm90ZTogVGhpcyBjb2RlIG1ha2VzIHRoZSBhc3N1bXB0aW9uLCB3aGljaCBpcyBjdXJyZW50bHkgdHJ1ZSwKKyAgICAgKiB0aGF0IGEgY2hpcCByZXNldCBkb2VzIG5vdCBjbGVhciBSSVNDIExSQU0uCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IEFTQ19NQ19CSU9TTEVOLzI7IGkrKykKKyAgICB7CisgICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0JJT1NNRU0gKyAoMiAqIGkpLCBiaW9zX21lbVtpXSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTYXZlIGN1cnJlbnQgcGVyIFRJRCBuZWdvdGlhdGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIHdkdHJfYWJsZSk7CisgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLCBzZHRyX2FibGUpOworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7CisgICAgZm9yICh0aWQgPSAwOyB0aWQgPD0gQURWX01BWF9USUQ7IHRpZCsrKQorICAgIHsKKyAgICAgICAgQWR2UmVhZEJ5dGVMcmFtKGlvcF9iYXNlLCBBU0NfTUNfTlVNQkVSX09GX01BWF9DTUQgKyB0aWQsCisgICAgICAgICAgICBtYXhfY21kW3RpZF0pOworICAgIH0KKworICAgIC8qCisgICAgICogUkFNIEJJU1QgKFJBTSBCdWlsdC1JbiBTZWxmIFRlc3QpCisgICAgICoKKyAgICAgKiBBZGRyZXNzIDogSS9PIGJhc2UgKyBvZmZzZXQgMHgzOGggcmVnaXN0ZXIgKGJ5dGUpLgorICAgICAqIEZ1bmN0aW9uOiBCaXQgNy02KFJXKSA6IFJBTSBtb2RlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbCBNb2RlICAgOiAweDAwCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFByZS10ZXN0IE1vZGUgOiAweDQwCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFJBTSBUZXN0IE1vZGUgOiAweDgwCisgICAgICogICAgICAgICAgIEJpdCA1ICAgICAgIDogdW51c2VkCisgICAgICogICAgICAgICAgIEJpdCA0KFJPKSAgIDogRG9uZSBiaXQKKyAgICAgKiAgICAgICAgICAgQml0IDMtMChSTykgOiBTdGF0dXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgSG9zdCBFcnJvciAgICA6IDB4MDgKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgSW50X1JBTSBFcnJvciA6IDB4MDQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgUklTQyBFcnJvciAgICA6IDB4MDIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgU0NTSSBFcnJvciAgICA6IDB4MDEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gRXJyb3IgICAgICA6IDB4MDAKKyAgICAgKgorICAgICAqIE5vdGU6IFJBTSBCSVNUIGNvZGUgc2hvdWxkIGJlIHB1dCByaWdodCBoZXJlLCBiZWZvcmUgbG9hZGluZyB0aGUKKyAgICAgKiBtaWNyb2NvZGUgYW5kIGFmdGVyIHNhdmluZyB0aGUgUklTQyBtZW1vcnkgQklPUyByZWdpb24uCisgICAgICovCisKKyAgICAvKgorICAgICAqIExSQU0gUHJlLXRlc3QKKyAgICAgKgorICAgICAqIFdyaXRlIFBSRV9URVNUX01PREUgKDB4NDApIHRvIHJlZ2lzdGVyIGFuZCB3YWl0IGZvciAxMCBtaWxsaXNlY29uZHMuCisgICAgICogSWYgRG9uZSBiaXQgbm90IHNldCBvciBsb3cgbmliYmxlIG5vdCBQUkVfVEVTVF9WQUxVRSAoMHgwNSksIHJldHVybgorICAgICAqIGFuIGVycm9yLiBSZXNldCB0byBOT1JNQUxfTU9ERSAoMHgwMCkgYW5kIGRvIGFnYWluLiBJZiBjYW5ub3QgcmVzZXQKKyAgICAgKiB0byBOT1JNQUxfTU9ERSwgcmV0dXJuIGFuIGVycm9yIHRvby4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgIHsKKyAgICAgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QsIFBSRV9URVNUX01PREUpOworICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKDEwKTsgIC8qIFdhaXQgZm9yIDEwbXMgYmVmb3JlIHJlYWRpbmcgYmFjay4gKi8KKyAgICAgICAgYnl0ZSA9IEFkdlJlYWRCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QpOworICAgICAgICBpZiAoKGJ5dGUgJiBSQU1fVEVTVF9ET05FKSA9PSAwIHx8IChieXRlICYgMHgwRikgIT0gUFJFX1RFU1RfVkFMVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX0JJU1RfUFJFX1RFU1Q7CisgICAgICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QsIE5PUk1BTF9NT0RFKTsKKyAgICAgICAgRHZjU2xlZXBNaWxsaVNlY29uZCgxMCk7ICAvKiBXYWl0IGZvciAxMG1zIGJlZm9yZSByZWFkaW5nIGJhY2suICovCisgICAgICAgIGlmIChBZHZSZWFkQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX1JBTV9CSVNUKQorICAgICAgICAgICAgIT0gTk9STUFMX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9CSVNUX1BSRV9URVNUOworICAgICAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTFJBTSBUZXN0IC0gSXQgdGFrZXMgYWJvdXQgMS41IG1zIHRvIHJ1biB0aHJvdWdoIHRoZSB0ZXN0LgorICAgICAqCisgICAgICogV3JpdGUgUkFNX1RFU1RfTU9ERSAoMHg4MCkgdG8gcmVnaXN0ZXIgYW5kIHdhaXQgZm9yIDEwIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBJZiBEb25lIGJpdCBub3Qgc2V0IG9yIFN0YXR1cyBub3QgMCwgc2F2ZSByZWdpc3RlciBieXRlLCBzZXQgdGhlCisgICAgICogZXJyX2NvZGUsIGFuZCByZXR1cm4gYW4gZXJyb3IuCisgICAgICovCisgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QsIFJBTV9URVNUX01PREUpOworICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMTApOyAgLyogV2FpdCBmb3IgMTBtcyBiZWZvcmUgY2hlY2tpbmcgc3RhdHVzLiAqLworCisgICAgYnl0ZSA9IEFkdlJlYWRCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QpOworICAgIGlmICgoYnl0ZSAmIFJBTV9URVNUX0RPTkUpID09IDAgfHwgKGJ5dGUgJiBSQU1fVEVTVF9TVEFUVVMpICE9IDApCisgICAgeworICAgICAgICAvKiBHZXQgaGVyZSBpZiBEb25lIGJpdCBub3Qgc2V0IG9yIFN0YXR1cyBub3QgMC4gKi8KKyAgICAgICAgYXNjX2R2Yy0+YmlzdF9lcnJfY29kZSA9IGJ5dGU7ICAvKiBmb3IgQklPUyBkaXNwbGF5IG1lc3NhZ2UgKi8KKyAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfQklTVF9SQU1fVEVTVDsKKyAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBXZSBuZWVkIHRvIHJlc2V0IGJhY2sgdG8gbm9ybWFsIG1vZGUgYWZ0ZXIgTFJBTSB0ZXN0IHBhc3Nlcy4gKi8KKyAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCwgTk9STUFMX01PREUpOworCisgICAgLyoKKyAgICAgKiBMb2FkIHRoZSBNaWNyb2NvZGUKKyAgICAgKgorICAgICAqIFdyaXRlIHRoZSBtaWNyb2NvZGUgaW1hZ2UgdG8gUklTQyBtZW1vcnkgc3RhcnRpbmcgYXQgYWRkcmVzcyAwLgorICAgICAqCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIDApOworCisgICAgLyogQXNzdW1lIHRoZSBmb2xsb3dpbmcgY29tcHJlc3NlZCBmb3JtYXQgb2YgdGhlIG1pY3JvY29kZSBidWZmZXI6CisgICAgICoKKyAgICAgKiAgMjU0IHdvcmQgKDUwOCBieXRlKSB0YWJsZSBpbmRleGVkIGJ5IGJ5dGUgY29kZSBmb2xsb3dlZAorICAgICAqICBieSB0aGUgZm9sbG93aW5nIGJ5dGUgY29kZXM6CisgICAgICoKKyAgICAgKiAgICAxLUJ5dGUgQ29kZToKKyAgICAgKiAgICAgIDAwOiBFbWl0IHdvcmQgMCBpbiB0YWJsZS4KKyAgICAgKiAgICAgIDAxOiBFbWl0IHdvcmQgMSBpbiB0YWJsZS4KKyAgICAgKiAgICAgIC4KKyAgICAgKiAgICAgIEZEOiBFbWl0IHdvcmQgMjUzIGluIHRhYmxlLgorICAgICAqCisgICAgICogICAgTXVsdGktQnl0ZSBDb2RlOgorICAgICAqICAgICAgRkUgV1cgV1c6ICgzIGJ5dGUgY29kZSkgV29yZCB0byBlbWl0IGlzIHRoZSBuZXh0IHdvcmQgV1cgV1cuCisgICAgICogICAgICBGRiBCQiBXVyBXVzogKDQgYnl0ZSBjb2RlKSBFbWl0IEJCIGNvdW50IHRpbWVzIG5leHQgd29yZCBXVyBXVy4KKyAgICAgKi8KKyAgICB3b3JkID0gMDsKKyAgICBmb3IgKGkgPSAyNTMgKiAyOyBpIDwgX2Fkdl9hc2MzOEMwODAwX3NpemU7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChfYWR2X2FzYzM4QzA4MDBfYnVmW2ldID09IDB4ZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBfYWR2X2FzYzM4QzA4MDBfYnVmW2kgKyAxXTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAoKCh1c2hvcnQpCisgICAgICAgICAgICAgICAgICAgIF9hZHZfYXNjMzhDMDgwMF9idWZbaSArIDNdIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgX2Fkdl9hc2MzOEMwODAwX2J1ZltpICsgMl0pKTsKKyAgICAgICAgICAgICAgICB3b3JkKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpICs9IDM7CisgICAgICAgIH0gZWxzZSBpZiAoX2Fkdl9hc2MzOEMwODAwX2J1ZltpXSA9PSAweGZlKQorICAgICAgICB7CisgICAgICAgICAgICBBZHZXcml0ZVdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSwgKCgodXNob3J0KQorICAgICAgICAgICAgICAgIF9hZHZfYXNjMzhDMDgwMF9idWZbaSArIDJdIDw8IDgpIHwKKyAgICAgICAgICAgICAgICBfYWR2X2FzYzM4QzA4MDBfYnVmW2kgKyAxXSkpOworICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgd29yZCsrOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQWR2V3JpdGVXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UsICgoKHVzaG9ydCkKKyAgICAgICAgICAgICAgICBfYWR2X2FzYzM4QzA4MDBfYnVmWyhfYWR2X2FzYzM4QzA4MDBfYnVmW2ldICogMikgKyAxXSA8PCA4KSB8CisgICAgICAgICAgICAgICAgX2Fkdl9hc2MzOEMwODAwX2J1ZltfYWR2X2FzYzM4QzA4MDBfYnVmW2ldICogMl0pKTsKKyAgICAgICAgICAgIHdvcmQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogU2V0ICd3b3JkJyBmb3IgbGF0ZXIgdXNlIHRvIGNsZWFyIHRoZSByZXN0IG9mIG1lbW9yeSBhbmQgc2F2ZQorICAgICAqIHRoZSBleHBhbmRlZCBtY29kZSBzaXplLgorICAgICAqLworICAgIHdvcmQgKj0gMjsKKyAgICBhZHZfYXNjMzhDMDgwMF9leHBhbmRlZF9zaXplID0gd29yZDsKKworICAgIC8qCisgICAgICogQ2xlYXIgdGhlIHJlc3Qgb2YgQVNDLTM4QzA4MDAgSW50ZXJuYWwgUkFNICgxNktCKS4KKyAgICAgKi8KKyAgICBmb3IgKDsgd29yZCA8IEFEVl8zOEMwODAwX01FTVNJWkU7IHdvcmQgKz0gMikKKyAgICB7CisgICAgICAgIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAwKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFZlcmlmeSB0aGUgbWljcm9jb2RlIGNoZWNrc3VtLgorICAgICAqLworICAgIHN1bSA9IDA7CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIDApOworCisgICAgZm9yICh3b3JkID0gMDsgd29yZCA8IGFkdl9hc2MzOEMwODAwX2V4cGFuZGVkX3NpemU7IHdvcmQgKz0gMikKKyAgICB7CisgICAgICAgIHN1bSArPSBBZHZSZWFkV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlKTsKKyAgICB9CisgICAgQVNDX0RCRzIoMSwgIkFkdkluaXRBc2MzOEMwODAwRHJpdmVyOiB3b3JkICVkLCBpICVkXG4iLCB3b3JkLCBpKTsKKworICAgIEFTQ19EQkcyKDEsCisgICAgICAgICJBZHZJbml0QXNjMzhDMDgwMERyaXZlcjogc3VtIDB4JWx4LCBfYWR2X2FzYzM4QzA4MDBfY2hrc3VtIDB4JWx4XG4iLAorICAgICAgICAodWxvbmcpIHN1bSwgKHVsb25nKSBfYWR2X2FzYzM4QzA4MDBfY2hrc3VtKTsKKworICAgIGlmIChzdW0gIT0gX2Fkdl9hc2MzOEMwODAwX2Noa3N1bSkKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX01DT0RFX0NIS1NVTTsKKyAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlc3RvcmUgdGhlIFJJU0MgbWVtb3J5IEJJT1MgcmVnaW9uLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBBU0NfTUNfQklPU0xFTi8yOyBpKyspCisgICAgeworICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQklPU01FTSArICgyICogaSksIGJpb3NfbWVtW2ldKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSBhbmQgd3JpdGUgdGhlIG1pY3JvY29kZSBjb2RlIGNoZWNrc3VtIHRvIHRoZSBtaWNyb2NvZGUKKyAgICAgKiBjb2RlIGNoZWNrc3VtIGxvY2F0aW9uIEFTQ19NQ19DT0RFX0NIS19TVU0gKDB4MkMpLgorICAgICAqLworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfQkVHSU5fQUREUiwgYmVnaW5fYWRkcik7CisgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09ERV9FTkRfQUREUiwgZW5kX2FkZHIpOworICAgIGNvZGVfc3VtID0gMDsKKyAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19SQU1fQUREUiwgYmVnaW5fYWRkcik7CisgICAgZm9yICh3b3JkID0gYmVnaW5fYWRkcjsgd29yZCA8IGVuZF9hZGRyOyB3b3JkICs9IDIpCisgICAgeworICAgICAgICBjb2RlX3N1bSArPSBBZHZSZWFkV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlKTsKKyAgICB9CisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfQ0hLX1NVTSwgY29kZV9zdW0pOworCisgICAgLyoKKyAgICAgKiBSZWFkIG1pY3JvY29kZSB2ZXJzaW9uIGFuZCBkYXRlLgorICAgICAqLworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1ZFUlNJT05fREFURSwgYXNjX2R2Yy0+Y2ZnLT5tY29kZV9kYXRlKTsKKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19WRVJTSU9OX05VTSwgYXNjX2R2Yy0+Y2ZnLT5tY29kZV92ZXJzaW9uKTsKKworICAgIC8qCisgICAgICogU2V0IHRoZSBjaGlwIHR5cGUgdG8gaW5kaWNhdGUgdGhlIEFTQzM4QzA4MDAuCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NISVBfVFlQRSwgQURWX0NISVBfQVNDMzhDMDgwMCk7CisKKyAgICAvKgorICAgICAqIFdyaXRlIDEgdG8gYml0IDE0ICdESVNfVEVSTV9EUlYnIGluIHRoZSBTQ1NJX0NGRzEgcmVnaXN0ZXIuCisgICAgICogV2hlbiBESVNfVEVSTV9EUlYgc2V0IHRvIDEsIENfREVUWzM6MF0gd2lsbCByZWZsZWN0IGN1cnJlbnQKKyAgICAgKiBjYWJsZSBkZXRlY3Rpb24gYW5kIHRoZW4gd2UgYXJlIGFibGUgdG8gcmVhZCBDX0RFVFszOjBdLgorICAgICAqCisgICAgICogTm90ZTogV2Ugd2lsbCByZXNldCBESVNfVEVSTV9EUlYgdG8gMCBpbiB0aGUgJ1NldCBTQ1NJX0NGRzEKKyAgICAgKiBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZScgc2VjdGlvbiBiZWxvdy4KKyAgICAgKi8KKyAgICBzY3NpX2NmZzEgPSBBZHZSZWFkV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1NDU0lfQ0ZHMSk7CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfU0NTSV9DRkcxLCBzY3NpX2NmZzEgfCBESVNfVEVSTV9EUlYpOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgUENJIENvbmZpZ3VyYXRpb24gQ29tbWFuZCBSZWdpc3RlciAiUGFyaXR5IEVycm9yIFJlc3BvbnNlCisgICAgICogQ29udHJvbCIgQml0IHdhcyBjbGVhciAoMCksIHRoZW4gc2V0IHRoZSBtaWNyb2NvZGUgdmFyaWFibGUKKyAgICAgKiAnY29udHJvbF9mbGFnJyBDT05UUk9MX0ZMQUdfSUdOT1JFX1BFUlIgZmxhZyB0byB0ZWxsIHRoZSBtaWNyb2NvZGUKKyAgICAgKiB0byBpZ25vcmUgRE1BIHBhcml0eSBlcnJvcnMuCisgICAgICovCisgICAgaWYgKGFzY19kdmMtPmNmZy0+Y29udHJvbF9mbGFnICYgQ09OVFJPTF9GTEFHX0lHTk9SRV9QRVJSKQorICAgIHsKKyAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09OVFJPTF9GTEFHLCB3b3JkKTsKKyAgICAgICAgd29yZCB8PSBDT05UUk9MX0ZMQUdfSUdOT1JFX1BFUlI7CisgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT05UUk9MX0ZMQUcsIHdvcmQpOworICAgIH0KKworICAgIC8qCisgICAgICogRm9yIEFTQy0zOEMwODAwLCBzZXQgRklGT19USFJFU0hfODBCIFs2OjRdIGJpdHMgYW5kIFNUQVJUX0NUTF9USCBbMzoyXQorICAgICAqIGJpdHMgZm9yIHRoZSBkZWZhdWx0IEZJRk8gdGhyZXNob2xkLgorICAgICAqCisgICAgICogTm90ZTogQVNDLTM4QzA4MDAgRklGTyB0aHJlc2hvbGQgaGFzIGJlZW4gY2hhbmdlZCB0byAyNTYgYnl0ZXMuCisgICAgICoKKyAgICAgKiBGb3IgRE1BIEVycmF0YSAjNCBzZXQgdGhlIEJDX1RIUkVTSF9FTkIgYml0LgorICAgICAqLworICAgIEFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0RNQV9DRkcwLAorICAgICAgICBCQ19USFJFU0hfRU5CIHwgRklGT19USFJFU0hfODBCIHwgU1RBUlRfQ1RMX1RIIHwgUkVBRF9DTURfTVJNKTsKKworICAgIC8qCisgICAgICogTWljcm9jb2RlIG9wZXJhdGluZyB2YXJpYWJsZXMgZm9yIFdEVFIsIFNEVFIsIGFuZCBjb21tYW5kIHRhZworICAgICAqIHF1ZXVpbmcgd2lsbCBiZSBzZXQgaW4gQWR2SW5xdWlyeUhhbmRsaW5nKCkgYmFzZWQgb24gd2hhdCBhCisgICAgICogZGV2aWNlIHJlcG9ydHMgaXQgaXMgY2FwYWJsZSBvZiBpbiBJbnF1aXJ5IGJ5dGUgNy4KKyAgICAgKgorICAgICAqIElmIFNDU0kgQnVzIFJlc2V0cyBoYXZlIGJlZW4gZGlzYWJsZWQsIHRoZW4gZGlyZWN0bHkgc2V0CisgICAgICogU0RUUiBhbmQgV0RUUiBmcm9tIHRoZSBFRVBST00gY29uZmlndXJhdGlvbi4gVGhpcyB3aWxsIGFsbG93CisgICAgICogdGhlIEJJT1MgYW5kIHdhcm0gYm9vdCB0byB3b3JrIHdpdGhvdXQgYSBTQ1NJIGJ1cyBoYW5nIG9uCisgICAgICogdGhlIElucXVpcnkgY2F1c2VkIGJ5IGhvc3QgYW5kIHRhcmdldCBtaXNtYXRjaGVkIERUUiB2YWx1ZXMuCisgICAgICogV2l0aG91dCB0aGUgU0NTSSBCdXMgUmVzZXQsIGJlZm9yZSBhbiBJbnF1aXJ5IGEgZGV2aWNlIGNhbid0CisgICAgICogYmUgYXNzdW1lZCB0byBiZSBpbiBBc3luY2hyb25vdXMsIE5hcnJvdyBtb2RlLgorICAgICAqLworICAgIGlmICgoYXNjX2R2Yy0+Ymlvc19jdHJsICYgQklPU19DVFJMX1JFU0VUX1NDU0lfQlVTKSA9PSAwKQorICAgIHsKKyAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfQUJMRSwgYXNjX2R2Yy0+d2R0cl9hYmxlKTsKKyAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfQUJMRSwgYXNjX2R2Yy0+c2R0cl9hYmxlKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCBtaWNyb2NvZGUgb3BlcmF0aW5nIHZhcmlhYmxlcyBmb3IgRElTQyBhbmQgU0RUUl9TUEVFRDEsCisgICAgICogU0RUUl9TUEVFRDIsIFNEVFJfU1BFRUQzLCBhbmQgU0RUUl9TUEVFRDQgYmFzZWQgb24gdGhlIEVFUFJPTQorICAgICAqIGNvbmZpZ3VyYXRpb24gdmFsdWVzLgorICAgICAqCisgICAgICogVGhlIFNEVFIgcGVyIFRJRCBiaXRtYXNrIG92ZXJyaWRlcyB0aGUgU0RUUl9TUEVFRDEsIFNEVFJfU1BFRUQyLAorICAgICAqIFNEVFJfU1BFRUQzLCBhbmQgU0RUUl9TUEVFRDQgdmFsdWVzIHNvIGl0IGlzIHNhZmUgdG8gc2V0IHRoZW0KKyAgICAgKiB3aXRob3V0IGRldGVybWluaW5nIGhlcmUgd2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIFNEVFIuCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RJU0NfRU5BQkxFLCBhc2NfZHZjLT5jZmctPmRpc2NfZW5hYmxlKTsKKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9TUEVFRDEsIGFzY19kdmMtPnNkdHJfc3BlZWQxKTsKKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9TUEVFRDIsIGFzY19kdmMtPnNkdHJfc3BlZWQyKTsKKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9TUEVFRDMsIGFzY19kdmMtPnNkdHJfc3BlZWQzKTsKKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9TUEVFRDQsIGFzY19kdmMtPnNkdHJfc3BlZWQ0KTsKKworICAgIC8qCisgICAgICogU2V0IFNDU0lfQ0ZHMCBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZS4KKyAgICAgKgorICAgICAqIFRoZSBtaWNyb2NvZGUgd2lsbCBzZXQgdGhlIFNDU0lfQ0ZHMCByZWdpc3RlciB1c2luZyB0aGlzIHZhbHVlCisgICAgICogYWZ0ZXIgaXQgaXMgc3RhcnRlZCBiZWxvdy4KKyAgICAgKi8KKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVGQVVMVF9TQ1NJX0NGRzAsCisgICAgICAgIFBBUklUWV9FTiB8IFFVRVVFXzEyOCB8IFNFTF9UTU9fTE9ORyB8IE9VUl9JRF9FTiB8CisgICAgICAgIGFzY19kdmMtPmNoaXBfc2NzaV9pZCk7CisKKyAgICAvKgorICAgICAqIERldGVybWluZSBTQ1NJX0NGRzEgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUuCisgICAgICoKKyAgICAgKiBUaGUgbWljcm9jb2RlIHdpbGwgc2V0IHRoZSBTQ1NJX0NGRzEgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisgICAgICovCisKKyAgICAvKiBSZWFkIGN1cnJlbnQgU0NTSV9DRkcxIFJlZ2lzdGVyIHZhbHVlLiAqLworICAgIHNjc2lfY2ZnMSA9IEFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfU0NTSV9DRkcxKTsKKworICAgIC8qCisgICAgICogSWYgdGhlIGludGVybmFsIG5hcnJvdyBjYWJsZSBpcyByZXZlcnNlZCBhbGwgb2YgdGhlIFNDU0lfQ1RSTAorICAgICAqIHJlZ2lzdGVyIHNpZ25hbHMgd2lsbCBiZSBzZXQuIENoZWNrIGZvciBhbmQgcmV0dXJuIGFuIGVycm9yIGlmCisgICAgICogdGhpcyBjb25kaXRpb24gaXMgZm91bmQuCisgICAgICovCisgICAgaWYgKChBZHZSZWFkV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1NDU0lfQ1RSTCkgJiAweDNGMDcpID09IDB4M0YwNykKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX1JFVkVSU0VEX0NBQkxFOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKworICAgIC8qCisgICAgICogQWxsIGtpbmQgb2YgY29tYmluYXRpb25zIG9mIGRldmljZXMgYXR0YWNoZWQgdG8gb25lIG9mIGZvdXIgY29ubmVjdG9ycworICAgICAqIGFyZSBhY2NlcHRhYmxlIGV4Y2VwdCBIVkQgZGV2aWNlIGF0dGFjaGVkLiBGb3IgZXhhbXBsZSwgTFZEIGRldmljZSBjYW4KKyAgICAgKiBiZSBhdHRhY2hlZCB0byBTRSBjb25uZWN0b3Igd2hpbGUgU0UgZGV2aWNlIGF0dGFjaGVkIHRvIExWRCBjb25uZWN0b3IuCisgICAgICogSWYgTFZEIGRldmljZSBhdHRhY2hlZCB0byBTRSBjb25uZWN0b3IsIGl0IG9ubHkgcnVucyB1cCB0byBVbHRyYSBzcGVlZC4KKyAgICAgKgorICAgICAqIElmIGFuIEhWRCBkZXZpY2UgaXMgYXR0YWNoZWQgdG8gb25lIG9mIExWRCBjb25uZWN0b3JzLCByZXR1cm4gYW4gZXJyb3IuCisgICAgICogSG93ZXZlciwgdGhlcmUgaXMgbm8gd2F5IHRvIGRldGVjdCBIVkQgZGV2aWNlIGF0dGFjaGVkIHRvIFNFIGNvbm5lY3RvcnMuCisgICAgICovCisgICAgaWYgKHNjc2lfY2ZnMSAmIEhWRCkKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX0hWRF9ERVZJQ0U7CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiBlaXRoZXIgU0Ugb3IgTFZEIGF1dG9tYXRpYyB0ZXJtaW5hdGlvbiBjb250cm9sIGlzIGVuYWJsZWQsIHRoZW4KKyAgICAgKiBzZXQgdGhlIHRlcm1pbmF0aW9uIHZhbHVlIGJhc2VkIG9uIGEgdGFibGUgbGlzdGVkIGluIGFfY29uZG9yLmguCisgICAgICoKKyAgICAgKiBJZiBtYW51YWwgdGVybWluYXRpb24gd2FzIHNwZWNpZmllZCB3aXRoIGFuIEVFUFJPTSBzZXR0aW5nIHRoZW4KKyAgICAgKiAndGVybWluYXRpb24nIHdhcyBzZXQtdXAgaW4gQWR2SW5pdEZyb20zOEMwODAwRUVQUk9NKCkgYW5kIGlzIHJlYWR5IHRvCisgICAgICogYmUgJ29yZWQnIGludG8gU0NTSV9DRkcxLgorICAgICAqLworICAgIGlmICgoYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiAmIFRFUk1fU0UpID09IDApCisgICAgeworICAgICAgICAvKiBTRSBhdXRvbWF0aWMgdGVybWluYXRpb24gY29udHJvbCBpcyBlbmFibGVkLiAqLworICAgICAgICBzd2l0Y2goc2NzaV9jZmcxICYgQ19ERVRfU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRFUk1fU0VfSEk6IG9uLCBURVJNX1NFX0xPOiBvbiAqLworICAgICAgICAgICAgY2FzZSAweDE6IGNhc2UgMHgyOiBjYXNlIDB4MzoKKyAgICAgICAgICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uIHw9IFRFUk1fU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIFRFUk1fU0VfSEk6IG9uLCBURVJNX1NFX0xPOiBvZmYgKi8KKyAgICAgICAgICAgIGNhc2UgMHgwOgorICAgICAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gfD0gVEVSTV9TRV9ISTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiAmIFRFUk1fTFZEKSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogTFZEIGF1dG9tYXRpYyB0ZXJtaW5hdGlvbiBjb250cm9sIGlzIGVuYWJsZWQuICovCisgICAgICAgIHN3aXRjaChzY3NpX2NmZzEgJiBDX0RFVF9MVkQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRFUk1fTFZEX0hJOiBvbiwgVEVSTV9MVkRfTE86IG9uICovCisgICAgICAgICAgICBjYXNlIDB4NDogY2FzZSAweDg6IGNhc2UgMHhDOgorICAgICAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gfD0gVEVSTV9MVkQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIFRFUk1fTFZEX0hJOiBvZmYsIFRFUk1fTFZEX0xPOiBvZmYgKi8KKyAgICAgICAgICAgIGNhc2UgMHgwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDbGVhciBhbnkgc2V0IFRFUk1fU0UgYW5kIFRFUk1fTFZEIGJpdHMuCisgICAgICovCisgICAgc2NzaV9jZmcxICY9ICh+VEVSTV9TRSAmIH5URVJNX0xWRCk7CisKKyAgICAvKgorICAgICAqIEludmVydCB0aGUgVEVSTV9TRSBhbmQgVEVSTV9MVkQgYml0cyBhbmQgdGhlbiBzZXQgJ3Njc2lfY2ZnMScuCisgICAgICovCisgICAgc2NzaV9jZmcxIHw9ICh+YXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiAmIDB4RjApOworCisgICAgLyoKKyAgICAgKiBDbGVhciBCSUdfRU5ESUFOLCBESVNfVEVSTV9EUlYsIFRlcm1pbmF0b3IgUG9sYXJpdHkgYW5kIEhWRC9MVkQvU0UgYml0cworICAgICAqIGFuZCBzZXQgcG9zc2libHkgbW9kaWZpZWQgdGVybWluYXRpb24gY29udHJvbCBiaXRzIGluIHRoZSBNaWNyb2NvZGUKKyAgICAgKiBTQ1NJX0NGRzEgUmVnaXN0ZXIgVmFsdWUuCisgICAgICovCisgICAgc2NzaV9jZmcxICY9ICh+QklHX0VORElBTiAmIH5ESVNfVEVSTV9EUlYgJiB+VEVSTV9QT0wgJiB+SFZEX0xWRF9TRSk7CisKKyAgICAvKgorICAgICAqIFNldCBTQ1NJX0NGRzEgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUKKyAgICAgKgorICAgICAqIFNldCBwb3NzaWJseSBtb2RpZmllZCB0ZXJtaW5hdGlvbiBjb250cm9sIGFuZCByZXNldCBESVNfVEVSTV9EUlYKKyAgICAgKiBiaXRzIGluIHRoZSBNaWNyb2NvZGUgU0NTSV9DRkcxIFJlZ2lzdGVyIFZhbHVlLgorICAgICAqCisgICAgICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0NTSV9DRkcxIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKKyAgICAgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgorICAgICAqLworICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ERUZBVUxUX1NDU0lfQ0ZHMSwgc2NzaV9jZmcxKTsKKworICAgIC8qCisgICAgICogU2V0IE1FTV9DRkcgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUKKyAgICAgKgorICAgICAqIFRoZSBtaWNyb2NvZGUgd2lsbCBzZXQgdGhlIE1FTV9DRkcgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisgICAgICoKKyAgICAgKiBNRU1fQ0ZHIG1heSBiZSBhY2Nlc3NlZCBhcyBhIHdvcmQgb3IgYnl0ZSwgYnV0IG9ubHkgYml0cyAwLTcKKyAgICAgKiBhcmUgZGVmaW5lZC4KKyAgICAgKgorICAgICAqIEFTQy0zOEMwODAwIGhhcyAxNktCIGludGVybmFsIG1lbW9yeS4KKyAgICAgKi8KKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVGQVVMVF9NRU1fQ0ZHLAorICAgICAgICBCSU9TX0VOIHwgUkFNX1NaXzE2S0IpOworCisgICAgLyoKKyAgICAgKiBTZXQgU0VMX01BU0sgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUKKyAgICAgKgorICAgICAqIFRoZSBtaWNyb2NvZGUgd2lsbCBzZXQgdGhlIFNFTF9NQVNLIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKKyAgICAgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgorICAgICAqLworICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ERUZBVUxUX1NFTF9NQVNLLAorICAgICAgICBBRFZfVElEX1RPX1RJRE1BU0soYXNjX2R2Yy0+Y2hpcF9zY3NpX2lkKSk7CisKKyAgICAvKgorICAgICAqIEJ1aWxkIHRoZSBjYXJyaWVyIGZyZWVsaXN0LgorICAgICAqCisgICAgICogRHJpdmVyIG11c3QgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBtZW1vcnkgYW5kIHNldCAnY2Fycmllcl9idWYnLgorICAgICAqLworICAgIEFTQ19BU1NFUlQoYXNjX2R2Yy0+Y2Fycmllcl9idWYgIT0gTlVMTCk7CisKKyAgICBjYXJycCA9IChBRFZfQ0FSUl9UICopIEFEVl8xNkJBTElHTihhc2NfZHZjLT5jYXJyaWVyX2J1Zik7CisgICAgYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IE5VTEw7CisgICAgaWYgKGNhcnJwID09IChBRFZfQ0FSUl9UICopIGFzY19kdmMtPmNhcnJpZXJfYnVmKQorICAgIHsKKyAgICAgICAgYnVmX3NpemUgPSBBRFZfQ0FSUklFUl9CVUZTSVpFOworICAgIH0gZWxzZQorICAgIHsKKyAgICAgICAgYnVmX3NpemUgPSBBRFZfQ0FSUklFUl9CVUZTSVpFIC0gc2l6ZW9mKEFEVl9DQVJSX1QpOworICAgIH0KKworICAgIGRvIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHBoeXNpY2FsIGFkZHJlc3MgZm9yIHRoZSBjYXJyaWVyICdjYXJycCcuCisgICAgICAgICAqLworICAgICAgICBjb250aWdfbGVuID0gc2l6ZW9mKEFEVl9DQVJSX1QpOworICAgICAgICBjYXJyX3BhZGRyID0gY3B1X3RvX2xlMzIoRHZjR2V0UGh5QWRkcihhc2NfZHZjLCBOVUxMLCAodWNoYXIgKikgY2FycnAsCisgICAgICAgICAgICAoQURWX1NEQ05UICopICZjb250aWdfbGVuLCBBRFZfSVNfQ0FSUklFUl9GTEFHKSk7CisKKyAgICAgICAgYnVmX3NpemUgLT0gc2l6ZW9mKEFEVl9DQVJSX1QpOworCisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoZSBjdXJyZW50IGNhcnJpZXIgaXMgbm90IHBoeXNpY2FsbHkgY29udGlndW91cywgdGhlbgorICAgICAgICAgKiBtYXliZSB0aGVyZSB3YXMgYSBwYWdlIGNyb3NzaW5nLiBUcnkgdGhlIG5leHQgY2FycmllciBhbGlnbmVkCisgICAgICAgICAqIHN0YXJ0IGFkZHJlc3MuCisgICAgICAgICAqLworICAgICAgICBpZiAoY29udGlnX2xlbiA8IHNpemVvZihBRFZfQ0FSUl9UKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FycnArKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY2FycnAtPmNhcnJfcGEgPSBjYXJyX3BhZGRyOworICAgICAgICBjYXJycC0+Y2Fycl92YSA9IGNwdV90b19sZTMyKEFEVl9WQUREUl9UT19VMzIoY2FycnApKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJbnNlcnQgdGhlIGNhcnJpZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnJlZWxpc3QuCisgICAgICAgICAqLworICAgICAgICBjYXJycC0+bmV4dF92cGEgPSBjcHVfdG9fbGUzMihBRFZfVkFERFJfVE9fVTMyKGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpKTsKKyAgICAgICAgYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IGNhcnJwOworCisgICAgICAgIGNhcnJwKys7CisgICAgfQorICAgIHdoaWxlIChidWZfc2l6ZSA+IDApOworCisgICAgLyoKKyAgICAgKiBTZXQtdXAgdGhlIEhvc3QtPlJJU0MgSW5pdGlhdG9yIENvbW1hbmQgUXVldWUgKElDUSkuCisgICAgICovCisKKyAgICBpZiAoKGFzY19kdmMtPmljcV9zcCA9IGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpID09IE5VTEwpCisgICAgeworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9OT19DQVJSSUVSOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKyAgICBhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0ID0gKEFEVl9DQVJSX1QgKikKKyAgICAgICAgQURWX1UzMl9UT19WQUREUihsZTMyX3RvX2NwdShhc2NfZHZjLT5pY3Ffc3AtPm5leHRfdnBhKSk7CisKKyAgICAvKgorICAgICAqIFRoZSBmaXJzdCBjb21tYW5kIGlzc3VlZCB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgc3RvcHBlciBjYXJyaWVyLgorICAgICAqLworICAgIGFzY19kdmMtPmljcV9zcC0+bmV4dF92cGEgPSBjcHVfdG9fbGUzMihBU0NfQ1FfU1RPUFBFUik7CisKKyAgICAvKgorICAgICAqIFNldCBSSVNDIElDUSBwaHlzaWNhbCBhZGRyZXNzIHN0YXJ0IHZhbHVlLgorICAgICAqIGNhcnJfcGEgaXMgTEUsIG11c3QgYmUgbmF0aXZlIGJlZm9yZSB3cml0ZQorICAgICAqLworICAgIEFkdldyaXRlRFdvcmRMcmFtTm9Td2FwKGlvcF9iYXNlLCBBU0NfTUNfSUNRLCBhc2NfZHZjLT5pY3Ffc3AtPmNhcnJfcGEpOworCisgICAgLyoKKyAgICAgKiBTZXQtdXAgdGhlIFJJU0MtPkhvc3QgSW5pdGlhdG9yIFJlc3BvbnNlIFF1ZXVlIChJUlEpLgorICAgICAqLworICAgIGlmICgoYXNjX2R2Yy0+aXJxX3NwID0gYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX05PX0NBUlJJRVI7CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorICAgIGFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSAoQURWX0NBUlJfVCAqKQorICAgICAgICBBRFZfVTMyX1RPX1ZBRERSKGxlMzJfdG9fY3B1KGFzY19kdmMtPmlycV9zcC0+bmV4dF92cGEpKTsKKworICAgIC8qCisgICAgICogVGhlIGZpcnN0IGNvbW1hbmQgY29tcGxldGVkIGJ5IHRoZSBSSVNDIHdpbGwgYmUgcGxhY2VkIGluCisgICAgICogdGhlIHN0b3BwZXIuCisgICAgICoKKyAgICAgKiBOb3RlOiBTZXQgJ25leHRfdnBhJyB0byBBU0NfQ1FfU1RPUFBFUi4gV2hlbiB0aGUgcmVxdWVzdCBpcworICAgICAqIGNvbXBsZXRlZCB0aGUgUklTQyB3aWxsIHNldCB0aGUgQVNDX1JRX1NUT1BQRVIgYml0LgorICAgICAqLworICAgIGFzY19kdmMtPmlycV9zcC0+bmV4dF92cGEgPSBjcHVfdG9fbGUzMihBU0NfQ1FfU1RPUFBFUik7CisKKyAgICAvKgorICAgICAqIFNldCBSSVNDIElSUSBwaHlzaWNhbCBhZGRyZXNzIHN0YXJ0IHZhbHVlLgorICAgICAqCisgICAgICogY2Fycl9wYSBpcyBMRSwgbXVzdCBiZSBuYXRpdmUgYmVmb3JlIHdyaXRlICoKKyAgICAgKi8KKyAgICBBZHZXcml0ZURXb3JkTHJhbU5vU3dhcChpb3BfYmFzZSwgQVNDX01DX0lSUSwgYXNjX2R2Yy0+aXJxX3NwLT5jYXJyX3BhKTsKKyAgICBhc2NfZHZjLT5jYXJyX3BlbmRpbmdfY250ID0gMDsKKworICAgIEFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0lOVFJfRU5BQkxFUywKKyAgICAgICAgKEFEVl9JTlRSX0VOQUJMRV9IT1NUX0lOVFIgfCBBRFZfSU5UUl9FTkFCTEVfR0xPQkFMX0lOVFIpKTsKKworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfQkVHSU5fQUREUiwgd29yZCk7CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUEMsIHdvcmQpOworCisgICAgLyogZmluYWxseSwgZmluYWxseSwgZ2VudGxlbWVuLCBzdGFydCB5b3VyIGVuZ2luZSAqLworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1JJU0NfQ1NSLCBBRFZfUklTQ19DU1JfUlVOKTsKKworICAgIC8qCisgICAgICogUmVzZXQgdGhlIFNDU0kgQnVzIGlmIHRoZSBFRVBST00gaW5kaWNhdGVzIHRoYXQgU0NTSSBCdXMKKyAgICAgKiBSZXNldHMgc2hvdWxkIGJlIHBlcmZvcm1lZC4gVGhlIFJJU0MgaGFzIHRvIGJlIHJ1bm5pbmcKKyAgICAgKiB0byBpc3N1ZSBhIFNDU0kgQnVzIFJlc2V0LgorICAgICAqLworICAgIGlmIChhc2NfZHZjLT5iaW9zX2N0cmwgJiBCSU9TX0NUUkxfUkVTRVRfU0NTSV9CVVMpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgQklPUyBTaWduYXR1cmUgaXMgcHJlc2VudCBpbiBtZW1vcnksIHJlc3RvcmUgdGhlCisgICAgICAgICAqIEJJT1MgSGFuZHNoYWtlIENvbmZpZ3VyYXRpb24gVGFibGUgYW5kIGRvIG5vdCBwZXJmb3JtCisgICAgICAgICAqIGEgU0NTSSBCdXMgUmVzZXQuCisgICAgICAgICAqLworICAgICAgICBpZiAoYmlvc19tZW1bKEFTQ19NQ19CSU9TX1NJR05BVFVSRSAtIEFTQ19NQ19CSU9TTUVNKS8yXSA9PSAweDU1QUEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZXN0b3JlIHBlciBUSUQgbmVnb3RpYXRlZCB2YWx1ZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIHdkdHJfYWJsZSk7CisgICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLCBzZHRyX2FibGUpOworICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7CisgICAgICAgICAgICBmb3IgKHRpZCA9IDA7IHRpZCA8PSBBRFZfTUFYX1RJRDsgdGlkKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWR2V3JpdGVCeXRlTHJhbShpb3BfYmFzZSwgQVNDX01DX05VTUJFUl9PRl9NQVhfQ01EICsgdGlkLAorICAgICAgICAgICAgICAgICAgICBtYXhfY21kW3RpZF0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEFkdlJlc2V0U0IoYXNjX2R2YykgIT0gQURWX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2Fybl9jb2RlID0gQVNDX1dBUk5fQlVTUkVTRVRfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gd2Fybl9jb2RlOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgQVNDLTM4QzE2MDAuCisgKgorICogT24gZmFpbHVyZSBzZXQgdGhlIEFTQ19EVkNfVkFSIGZpZWxkICdlcnJfY29kZScgYW5kIHJldHVybiBBRFZfRVJST1IuCisgKgorICogRm9yIGEgbm9uLWZhdGFsIGVycm9yIHJldHVybiBhIHdhcm5pbmcgY29kZS4gSWYgdGhlcmUgYXJlIG5vIHdhcm5pbmdzCisgKiB0aGVuIDAgaXMgcmV0dXJuZWQuCisgKgorICogTmVlZGVkIGFmdGVyIGluaXRpYWxpemF0aW9uIGZvciBlcnJvciByZWNvdmVyeS4KKyAqLworU1RBVElDIGludAorQWR2SW5pdEFzYzM4QzE2MDBEcml2ZXIoQURWX0RWQ19WQVIgKmFzY19kdmMpCit7CisgICAgQWR2UG9ydEFkZHIgaW9wX2Jhc2U7CisgICAgdXNob3J0ICAgICAgd2Fybl9jb2RlOworICAgIEFEVl9EQ05UICAgIHN1bTsKKyAgICBpbnQgICAgICAgICBiZWdpbl9hZGRyOworICAgIGludCAgICAgICAgIGVuZF9hZGRyOworICAgIHVzaG9ydCAgICAgIGNvZGVfc3VtOworICAgIGxvbmcgICAgICAgIHdvcmQ7CisgICAgaW50ICAgICAgICAgajsKKyAgICBpbnQgICAgICAgICBhZHZfYXNjMzhDMTYwMF9leHBhbmRlZF9zaXplOworICAgIEFEVl9DQVJSX1QgICpjYXJycDsKKyAgICBBRFZfRENOVCAgICBjb250aWdfbGVuOworICAgIEFEVl9TRENOVCAgIGJ1Zl9zaXplOworICAgIEFEVl9QQUREUiAgIGNhcnJfcGFkZHI7CisgICAgaW50ICAgICAgICAgaTsKKyAgICB1c2hvcnQgICAgICBzY3NpX2NmZzE7CisgICAgdWNoYXIgICAgICAgYnl0ZTsKKyAgICB1Y2hhciAgICAgICB0aWQ7CisgICAgdXNob3J0ICAgICAgYmlvc19tZW1bQVNDX01DX0JJT1NMRU4vMl07IC8qIEJJT1MgUklTQyBNZW1vcnkgMHg0MC0weDhGLiAqLworICAgIHVzaG9ydCAgICAgIHdkdHJfYWJsZSwgc2R0cl9hYmxlLCBwcHJfYWJsZSwgdGFncW5nX2FibGU7CisgICAgdWNoYXIgICAgICAgbWF4X2NtZFtBU0NfTUFYX1RJRCArIDFdOworCisgICAgLyogSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBlcnJvciwgZG9uJ3QgY29udGludWUuICovCisgICAgaWYgKGFzY19kdmMtPmVycl9jb2RlICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKworICAgIC8qCisgICAgICogVGhlIGNhbGxlciBtdXN0IHNldCAnY2hpcF90eXBlJyB0byBBRFZfQ0hJUF9BU0MzOEMxNjAwLgorICAgICAqLworICAgIGlmIChhc2NfZHZjLT5jaGlwX3R5cGUgIT0gQURWX0NISVBfQVNDMzhDMTYwMCkKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlID0gQVNDX0lFUlJfQkFEX0NISVBUWVBFOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKworICAgIHdhcm5fY29kZSA9IDA7CisgICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKworICAgIC8qCisgICAgICogU2F2ZSB0aGUgUklTQyBtZW1vcnkgQklPUyByZWdpb24gYmVmb3JlIHdyaXRpbmcgdGhlIG1pY3JvY29kZS4KKyAgICAgKiBUaGUgQklPUyBtYXkgYWxyZWFkeSBiZSBsb2FkZWQgYW5kIHVzaW5nIGl0cyBSSVNDIExSQU0gcmVnaW9uCisgICAgICogc28gaXRzIHJlZ2lvbiBtdXN0IGJlIHNhdmVkIGFuZCByZXN0b3JlZC4KKyAgICAgKgorICAgICAqIE5vdGU6IFRoaXMgY29kZSBtYWtlcyB0aGUgYXNzdW1wdGlvbiwgd2hpY2ggaXMgY3VycmVudGx5IHRydWUsCisgICAgICogdGhhdCBhIGNoaXAgcmVzZXQgZG9lcyBub3QgY2xlYXIgUklTQyBMUkFNLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBBU0NfTUNfQklPU0xFTi8yOyBpKyspCisgICAgeworICAgICAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19CSU9TTUVNICsgKDIgKiBpKSwgYmlvc19tZW1baV0pOworICAgIH0KKworICAgIC8qCisgICAgICogU2F2ZSBjdXJyZW50IHBlciBUSUQgbmVnb3RpYXRlZCB2YWx1ZXMuCisgICAgICovCisgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfV0RUUl9BQkxFLCB3ZHRyX2FibGUpOworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfQUJMRSwgc2R0cl9hYmxlKTsKKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19QUFJfQUJMRSwgcHByX2FibGUpOworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7CisgICAgZm9yICh0aWQgPSAwOyB0aWQgPD0gQVNDX01BWF9USUQ7IHRpZCsrKQorICAgIHsKKyAgICAgICAgQWR2UmVhZEJ5dGVMcmFtKGlvcF9iYXNlLCBBU0NfTUNfTlVNQkVSX09GX01BWF9DTUQgKyB0aWQsCisgICAgICAgICAgICBtYXhfY21kW3RpZF0pOworICAgIH0KKworICAgIC8qCisgICAgICogUkFNIEJJU1QgKEJ1aWx0LUluIFNlbGYgVGVzdCkKKyAgICAgKgorICAgICAqIEFkZHJlc3MgOiBJL08gYmFzZSArIG9mZnNldCAweDM4aCByZWdpc3RlciAoYnl0ZSkuCisgICAgICogRnVuY3Rpb246IEJpdCA3LTYoUlcpIDogUkFNIG1vZGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ybWFsIE1vZGUgICA6IDB4MDAKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlLXRlc3QgTW9kZSA6IDB4NDAKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgUkFNIFRlc3QgTW9kZSA6IDB4ODAKKyAgICAgKiAgICAgICAgICAgQml0IDUgICAgICAgOiB1bnVzZWQKKyAgICAgKiAgICAgICAgICAgQml0IDQoUk8pICAgOiBEb25lIGJpdAorICAgICAqICAgICAgICAgICBCaXQgMy0wKFJPKSA6IFN0YXR1cworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBIb3N0IEVycm9yICAgIDogMHgwOAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRfUkFNIEVycm9yIDogMHgwNAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBSSVNDIEVycm9yICAgIDogMHgwMgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBTQ1NJIEVycm9yICAgIDogMHgwMQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBObyBFcnJvciAgICAgIDogMHgwMAorICAgICAqCisgICAgICogTm90ZTogUkFNIEJJU1QgY29kZSBzaG91bGQgYmUgcHV0IHJpZ2h0IGhlcmUsIGJlZm9yZSBsb2FkaW5nIHRoZQorICAgICAqIG1pY3JvY29kZSBhbmQgYWZ0ZXIgc2F2aW5nIHRoZSBSSVNDIG1lbW9yeSBCSU9TIHJlZ2lvbi4KKyAgICAgKi8KKworICAgIC8qCisgICAgICogTFJBTSBQcmUtdGVzdAorICAgICAqCisgICAgICogV3JpdGUgUFJFX1RFU1RfTU9ERSAoMHg0MCkgdG8gcmVnaXN0ZXIgYW5kIHdhaXQgZm9yIDEwIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBJZiBEb25lIGJpdCBub3Qgc2V0IG9yIGxvdyBuaWJibGUgbm90IFBSRV9URVNUX1ZBTFVFICgweDA1KSwgcmV0dXJuCisgICAgICogYW4gZXJyb3IuIFJlc2V0IHRvIE5PUk1BTF9NT0RFICgweDAwKSBhbmQgZG8gYWdhaW4uIElmIGNhbm5vdCByZXNldAorICAgICAqIHRvIE5PUk1BTF9NT0RFLCByZXR1cm4gYW4gZXJyb3IgdG9vLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgeworICAgICAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCwgUFJFX1RFU1RfTU9ERSk7CisgICAgICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMTApOyAgLyogV2FpdCBmb3IgMTBtcyBiZWZvcmUgcmVhZGluZyBiYWNrLiAqLworICAgICAgICBieXRlID0gQWR2UmVhZEJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCk7CisgICAgICAgIGlmICgoYnl0ZSAmIFJBTV9URVNUX0RPTkUpID09IDAgfHwgKGJ5dGUgJiAweDBGKSAhPSBQUkVfVEVTVF9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfQklTVF9QUkVfVEVTVDsKKyAgICAgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCwgTk9STUFMX01PREUpOworICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKDEwKTsgIC8qIFdhaXQgZm9yIDEwbXMgYmVmb3JlIHJlYWRpbmcgYmFjay4gKi8KKyAgICAgICAgaWYgKEFkdlJlYWRCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QpCisgICAgICAgICAgICAhPSBOT1JNQUxfVkFMVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX0JJU1RfUFJFX1RFU1Q7CisgICAgICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBMUkFNIFRlc3QgLSBJdCB0YWtlcyBhYm91dCAxLjUgbXMgdG8gcnVuIHRocm91Z2ggdGhlIHRlc3QuCisgICAgICoKKyAgICAgKiBXcml0ZSBSQU1fVEVTVF9NT0RFICgweDgwKSB0byByZWdpc3RlciBhbmQgd2FpdCBmb3IgMTAgbWlsbGlzZWNvbmRzLgorICAgICAqIElmIERvbmUgYml0IG5vdCBzZXQgb3IgU3RhdHVzIG5vdCAwLCBzYXZlIHJlZ2lzdGVyIGJ5dGUsIHNldCB0aGUKKyAgICAgKiBlcnJfY29kZSwgYW5kIHJldHVybiBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCwgUkFNX1RFU1RfTU9ERSk7CisgICAgRHZjU2xlZXBNaWxsaVNlY29uZCgxMCk7ICAvKiBXYWl0IGZvciAxMG1zIGJlZm9yZSBjaGVja2luZyBzdGF0dXMuICovCisKKyAgICBieXRlID0gQWR2UmVhZEJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCk7CisgICAgaWYgKChieXRlICYgUkFNX1RFU1RfRE9ORSkgPT0gMCB8fCAoYnl0ZSAmIFJBTV9URVNUX1NUQVRVUykgIT0gMCkKKyAgICB7CisgICAgICAgIC8qIEdldCBoZXJlIGlmIERvbmUgYml0IG5vdCBzZXQgb3IgU3RhdHVzIG5vdCAwLiAqLworICAgICAgICBhc2NfZHZjLT5iaXN0X2Vycl9jb2RlID0gYnl0ZTsgIC8qIGZvciBCSU9TIGRpc3BsYXkgbWVzc2FnZSAqLworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9CSVNUX1JBTV9URVNUOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKworICAgIC8qIFdlIG5lZWQgdG8gcmVzZXQgYmFjayB0byBub3JtYWwgbW9kZSBhZnRlciBMUkFNIHRlc3QgcGFzc2VzLiAqLworICAgIEFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX1JBTV9CSVNULCBOT1JNQUxfTU9ERSk7CisKKyAgICAvKgorICAgICAqIExvYWQgdGhlIE1pY3JvY29kZQorICAgICAqCisgICAgICogV3JpdGUgdGhlIG1pY3JvY29kZSBpbWFnZSB0byBSSVNDIG1lbW9yeSBzdGFydGluZyBhdCBhZGRyZXNzIDAuCisgICAgICoKKyAgICAgKi8KKyAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19SQU1fQUREUiwgMCk7CisKKyAgICAvKgorICAgICAqIEFzc3VtZSB0aGUgZm9sbG93aW5nIGNvbXByZXNzZWQgZm9ybWF0IG9mIHRoZSBtaWNyb2NvZGUgYnVmZmVyOgorICAgICAqCisgICAgICogIDI1NCB3b3JkICg1MDggYnl0ZSkgdGFibGUgaW5kZXhlZCBieSBieXRlIGNvZGUgZm9sbG93ZWQKKyAgICAgKiAgYnkgdGhlIGZvbGxvd2luZyBieXRlIGNvZGVzOgorICAgICAqCisgICAgICogICAgMS1CeXRlIENvZGU6CisgICAgICogICAgICAwMDogRW1pdCB3b3JkIDAgaW4gdGFibGUuCisgICAgICogICAgICAwMTogRW1pdCB3b3JkIDEgaW4gdGFibGUuCisgICAgICogICAgICAuCisgICAgICogICAgICBGRDogRW1pdCB3b3JkIDI1MyBpbiB0YWJsZS4KKyAgICAgKgorICAgICAqICAgIE11bHRpLUJ5dGUgQ29kZToKKyAgICAgKiAgICAgIEZFIFdXIFdXOiAoMyBieXRlIGNvZGUpIFdvcmQgdG8gZW1pdCBpcyB0aGUgbmV4dCB3b3JkIFdXIFdXLgorICAgICAqICAgICAgRkYgQkIgV1cgV1c6ICg0IGJ5dGUgY29kZSkgRW1pdCBCQiBjb3VudCB0aW1lcyBuZXh0IHdvcmQgV1cgV1cuCisgICAgICovCisgICAgd29yZCA9IDA7CisgICAgZm9yIChpID0gMjUzICogMjsgaSA8IF9hZHZfYXNjMzhDMTYwMF9zaXplOyBpKyspCisgICAgeworICAgICAgICBpZiAoX2Fkdl9hc2MzOEMxNjAwX2J1ZltpXSA9PSAweGZmKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgX2Fkdl9hc2MzOEMxNjAwX2J1ZltpICsgMV07IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZHZXcml0ZVdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSwgKCgodXNob3J0KQorICAgICAgICAgICAgICAgICAgICAgX2Fkdl9hc2MzOEMxNjAwX2J1ZltpICsgM10gPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgX2Fkdl9hc2MzOEMxNjAwX2J1ZltpICsgMl0pKTsKKyAgICAgICAgICAgICAgICB3b3JkKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgIGkgKz0gMzsKKyAgICAgICAgfSBlbHNlIGlmIChfYWR2X2FzYzM4QzE2MDBfYnVmW2ldID09IDB4ZmUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZHZXcml0ZVdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSwgKCgodXNob3J0KQorICAgICAgICAgICAgICAgICAgICAgX2Fkdl9hc2MzOEMxNjAwX2J1ZltpICsgMl0gPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgX2Fkdl9hc2MzOEMxNjAwX2J1ZltpICsgMV0pKTsKKyAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgIHdvcmQrKzsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAoKCh1c2hvcnQpCisgICAgICAgICAgICAgICAgIF9hZHZfYXNjMzhDMTYwMF9idWZbKF9hZHZfYXNjMzhDMTYwMF9idWZbaV0gKiAyKSArIDFdIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgX2Fkdl9hc2MzOEMxNjAwX2J1ZltfYWR2X2FzYzM4QzE2MDBfYnVmW2ldICogMl0pKTsKKyAgICAgICAgICAgIHdvcmQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogU2V0ICd3b3JkJyBmb3IgbGF0ZXIgdXNlIHRvIGNsZWFyIHRoZSByZXN0IG9mIG1lbW9yeSBhbmQgc2F2ZQorICAgICAqIHRoZSBleHBhbmRlZCBtY29kZSBzaXplLgorICAgICAqLworICAgIHdvcmQgKj0gMjsKKyAgICBhZHZfYXNjMzhDMTYwMF9leHBhbmRlZF9zaXplID0gd29yZDsKKworICAgIC8qCisgICAgICogQ2xlYXIgdGhlIHJlc3Qgb2YgQVNDLTM4QzE2MDAgSW50ZXJuYWwgUkFNICgzMktCKS4KKyAgICAgKi8KKyAgICBmb3IgKDsgd29yZCA8IEFEVl8zOEMxNjAwX01FTVNJWkU7IHdvcmQgKz0gMikKKyAgICB7CisgICAgICAgIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAwKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFZlcmlmeSB0aGUgbWljcm9jb2RlIGNoZWNrc3VtLgorICAgICAqLworICAgIHN1bSA9IDA7CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIDApOworCisgICAgZm9yICh3b3JkID0gMDsgd29yZCA8IGFkdl9hc2MzOEMxNjAwX2V4cGFuZGVkX3NpemU7IHdvcmQgKz0gMikKKyAgICB7CisgICAgICAgIHN1bSArPSBBZHZSZWFkV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlKTsKKyAgICB9CisKKyAgICBpZiAoc3VtICE9IF9hZHZfYXNjMzhDMTYwMF9jaGtzdW0pCisgICAgeworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9NQ09ERV9DSEtTVU07CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXN0b3JlIHRoZSBSSVNDIG1lbW9yeSBCSU9TIHJlZ2lvbi4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQVNDX01DX0JJT1NMRU4vMjsgaSsrKQorICAgIHsKKyAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0JJT1NNRU0gKyAoMiAqIGkpLCBiaW9zX21lbVtpXSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgYW5kIHdyaXRlIHRoZSBtaWNyb2NvZGUgY29kZSBjaGVja3N1bSB0byB0aGUgbWljcm9jb2RlCisgICAgICogY29kZSBjaGVja3N1bSBsb2NhdGlvbiBBU0NfTUNfQ09ERV9DSEtfU1VNICgweDJDKS4KKyAgICAgKi8KKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT0RFX0JFR0lOX0FERFIsIGJlZ2luX2FkZHIpOworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfRU5EX0FERFIsIGVuZF9hZGRyKTsKKyAgICBjb2RlX3N1bSA9IDA7CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIGJlZ2luX2FkZHIpOworICAgIGZvciAod29yZCA9IGJlZ2luX2FkZHI7IHdvcmQgPCBlbmRfYWRkcjsgd29yZCArPSAyKQorICAgIHsKKyAgICAgICAgY29kZV9zdW0gKz0gQWR2UmVhZFdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSk7CisgICAgfQorICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT0RFX0NIS19TVU0sIGNvZGVfc3VtKTsKKworICAgIC8qCisgICAgICogUmVhZCBtaWNyb2NvZGUgdmVyc2lvbiBhbmQgZGF0ZS4KKyAgICAgKi8KKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19WRVJTSU9OX0RBVEUsIGFzY19kdmMtPmNmZy0+bWNvZGVfZGF0ZSk7CisgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVkVSU0lPTl9OVU0sIGFzY19kdmMtPmNmZy0+bWNvZGVfdmVyc2lvbik7CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgY2hpcCB0eXBlIHRvIGluZGljYXRlIHRoZSBBU0MzOEMxNjAwLgorICAgICAqLworICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DSElQX1RZUEUsIEFEVl9DSElQX0FTQzM4QzE2MDApOworCisgICAgLyoKKyAgICAgKiBXcml0ZSAxIHRvIGJpdCAxNCAnRElTX1RFUk1fRFJWJyBpbiB0aGUgU0NTSV9DRkcxIHJlZ2lzdGVyLgorICAgICAqIFdoZW4gRElTX1RFUk1fRFJWIHNldCB0byAxLCBDX0RFVFszOjBdIHdpbGwgcmVmbGVjdCBjdXJyZW50CisgICAgICogY2FibGUgZGV0ZWN0aW9uIGFuZCB0aGVuIHdlIGFyZSBhYmxlIHRvIHJlYWQgQ19ERVRbMzowXS4KKyAgICAgKgorICAgICAqIE5vdGU6IFdlIHdpbGwgcmVzZXQgRElTX1RFUk1fRFJWIHRvIDAgaW4gdGhlICdTZXQgU0NTSV9DRkcxCisgICAgICogTWljcm9jb2RlIERlZmF1bHQgVmFsdWUnIHNlY3Rpb24gYmVsb3cuCisgICAgICovCisgICAgc2NzaV9jZmcxID0gQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19TQ1NJX0NGRzEpOworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1NDU0lfQ0ZHMSwgc2NzaV9jZmcxIHwgRElTX1RFUk1fRFJWKTsKKworICAgIC8qCisgICAgICogSWYgdGhlIFBDSSBDb25maWd1cmF0aW9uIENvbW1hbmQgUmVnaXN0ZXIgIlBhcml0eSBFcnJvciBSZXNwb25zZQorICAgICAqIENvbnRyb2wiIEJpdCB3YXMgY2xlYXIgKDApLCB0aGVuIHNldCB0aGUgbWljcm9jb2RlIHZhcmlhYmxlCisgICAgICogJ2NvbnRyb2xfZmxhZycgQ09OVFJPTF9GTEFHX0lHTk9SRV9QRVJSIGZsYWcgdG8gdGVsbCB0aGUgbWljcm9jb2RlCisgICAgICogdG8gaWdub3JlIERNQSBwYXJpdHkgZXJyb3JzLgorICAgICAqLworICAgIGlmIChhc2NfZHZjLT5jZmctPmNvbnRyb2xfZmxhZyAmIENPTlRST0xfRkxBR19JR05PUkVfUEVSUikKKyAgICB7CisgICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPTlRST0xfRkxBRywgd29yZCk7CisgICAgICAgIHdvcmQgfD0gQ09OVFJPTF9GTEFHX0lHTk9SRV9QRVJSOworICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09OVFJPTF9GTEFHLCB3b3JkKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoZSBCSU9TIGNvbnRyb2wgZmxhZyBBSVBQIChBc3luY2hyb25vdXMgSW5mb3JtYXRpb24KKyAgICAgKiBQaGFzZSBQcm90ZWN0aW9uKSBkaXNhYmxlIGJpdCBpcyBub3Qgc2V0LCB0aGVuIHNldCB0aGUgZmlybXdhcmUKKyAgICAgKiAnY29udHJvbF9mbGFnJyBDT05UUk9MX0ZMQUdfRU5BQkxFX0FJUFAgYml0IHRvIGVuYWJsZQorICAgICAqIEFJUFAgY2hlY2tpbmcgYW5kIGVuY29kaW5nLgorICAgICAqLworICAgIGlmICgoYXNjX2R2Yy0+Ymlvc19jdHJsICYgQklPU19DVFJMX0FJUFBfRElTKSA9PSAwKQorICAgIHsKKyAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09OVFJPTF9GTEFHLCB3b3JkKTsKKyAgICAgICAgd29yZCB8PSBDT05UUk9MX0ZMQUdfRU5BQkxFX0FJUFA7CisgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT05UUk9MX0ZMQUcsIHdvcmQpOworICAgIH0KKworICAgIC8qCisgICAgICogRm9yIEFTQy0zOEMxNjAwIHVzZSBETUFfQ0ZHMCBkZWZhdWx0IHZhbHVlczogRklGT19USFJFU0hfODBCIFs2OjRdLAorICAgICAqIGFuZCBTVEFSVF9DVExfVEggWzM6Ml0uCisgICAgICovCisgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfRE1BX0NGRzAsCisgICAgICAgIEZJRk9fVEhSRVNIXzgwQiB8IFNUQVJUX0NUTF9USCB8IFJFQURfQ01EX01STSk7CisKKyAgICAvKgorICAgICAqIE1pY3JvY29kZSBvcGVyYXRpbmcgdmFyaWFibGVzIGZvciBXRFRSLCBTRFRSLCBhbmQgY29tbWFuZCB0YWcKKyAgICAgKiBxdWV1aW5nIHdpbGwgYmUgc2V0IGluIEFkdklucXVpcnlIYW5kbGluZygpIGJhc2VkIG9uIHdoYXQgYQorICAgICAqIGRldmljZSByZXBvcnRzIGl0IGlzIGNhcGFibGUgb2YgaW4gSW5xdWlyeSBieXRlIDcuCisgICAgICoKKyAgICAgKiBJZiBTQ1NJIEJ1cyBSZXNldHMgaGF2ZSBiZWVuIGRpc2FibGVkLCB0aGVuIGRpcmVjdGx5IHNldAorICAgICAqIFNEVFIgYW5kIFdEVFIgZnJvbSB0aGUgRUVQUk9NIGNvbmZpZ3VyYXRpb24uIFRoaXMgd2lsbCBhbGxvdworICAgICAqIHRoZSBCSU9TIGFuZCB3YXJtIGJvb3QgdG8gd29yayB3aXRob3V0IGEgU0NTSSBidXMgaGFuZyBvbgorICAgICAqIHRoZSBJbnF1aXJ5IGNhdXNlZCBieSBob3N0IGFuZCB0YXJnZXQgbWlzbWF0Y2hlZCBEVFIgdmFsdWVzLgorICAgICAqIFdpdGhvdXQgdGhlIFNDU0kgQnVzIFJlc2V0LCBiZWZvcmUgYW4gSW5xdWlyeSBhIGRldmljZSBjYW4ndAorICAgICAqIGJlIGFzc3VtZWQgdG8gYmUgaW4gQXN5bmNocm9ub3VzLCBOYXJyb3cgbW9kZS4KKyAgICAgKi8KKyAgICBpZiAoKGFzY19kdmMtPmJpb3NfY3RybCAmIEJJT1NfQ1RSTF9SRVNFVF9TQ1NJX0JVUykgPT0gMCkKKyAgICB7CisgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIGFzY19kdmMtPndkdHJfYWJsZSk7CisgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIGFzY19kdmMtPnNkdHJfYWJsZSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXQgbWljcm9jb2RlIG9wZXJhdGluZyB2YXJpYWJsZXMgZm9yIERJU0MgYW5kIFNEVFJfU1BFRUQxLAorICAgICAqIFNEVFJfU1BFRUQyLCBTRFRSX1NQRUVEMywgYW5kIFNEVFJfU1BFRUQ0IGJhc2VkIG9uIHRoZSBFRVBST00KKyAgICAgKiBjb25maWd1cmF0aW9uIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFRoZSBTRFRSIHBlciBUSUQgYml0bWFzayBvdmVycmlkZXMgdGhlIFNEVFJfU1BFRUQxLCBTRFRSX1NQRUVEMiwKKyAgICAgKiBTRFRSX1NQRUVEMywgYW5kIFNEVFJfU1BFRUQ0IHZhbHVlcyBzbyBpdCBpcyBzYWZlIHRvIHNldCB0aGVtCisgICAgICogd2l0aG91dCBkZXRlcm1pbmluZyBoZXJlIHdoZXRoZXIgdGhlIGRldmljZSBzdXBwb3J0cyBTRFRSLgorICAgICAqLworICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ESVNDX0VOQUJMRSwgYXNjX2R2Yy0+Y2ZnLT5kaXNjX2VuYWJsZSk7CisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQxLCBhc2NfZHZjLT5zZHRyX3NwZWVkMSk7CisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQyLCBhc2NfZHZjLT5zZHRyX3NwZWVkMik7CisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQzLCBhc2NfZHZjLT5zZHRyX3NwZWVkMyk7CisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQ0LCBhc2NfZHZjLT5zZHRyX3NwZWVkNCk7CisKKyAgICAvKgorICAgICAqIFNldCBTQ1NJX0NGRzAgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUuCisgICAgICoKKyAgICAgKiBUaGUgbWljcm9jb2RlIHdpbGwgc2V0IHRoZSBTQ1NJX0NGRzAgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFRkFVTFRfU0NTSV9DRkcwLAorICAgICAgICBQQVJJVFlfRU4gfCBRVUVVRV8xMjggfCBTRUxfVE1PX0xPTkcgfCBPVVJfSURfRU4gfAorICAgICAgICBhc2NfZHZjLT5jaGlwX3Njc2lfaWQpOworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgU0NTSV9DRkcxIE1pY3JvY29kZSBEZWZhdWx0IFZhbHVlLgorICAgICAqCisgICAgICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0NTSV9DRkcxIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKKyAgICAgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgorICAgICAqCisgICAgICogRWFjaCBBU0MtMzhDMTYwMCBmdW5jdGlvbiBoYXMgb25seSB0d28gY2FibGUgZGV0ZWN0IGJpdHMuCisgICAgICogVGhlIGJ1cyBtb2RlIG92ZXJyaWRlIGJpdHMgYXJlIGluIElPUEJfU09GVF9PVkVSX1dSLgorICAgICAqLworICAgIHNjc2lfY2ZnMSA9IEFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfU0NTSV9DRkcxKTsKKworICAgIC8qCisgICAgICogSWYgdGhlIGNhYmxlIGlzIHJldmVyc2VkIGFsbCBvZiB0aGUgU0NTSV9DVFJMIHJlZ2lzdGVyIHNpZ25hbHMKKyAgICAgKiB3aWxsIGJlIHNldC4gQ2hlY2sgZm9yIGFuZCByZXR1cm4gYW4gZXJyb3IgaWYgdGhpcyBjb25kaXRpb24gaXMKKyAgICAgKiBmb3VuZC4KKyAgICAgKi8KKyAgICBpZiAoKEFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfU0NTSV9DVFJMKSAmIDB4M0YwNykgPT0gMHgzRjA3KQorICAgIHsKKyAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfUkVWRVJTRURfQ0FCTEU7CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBFYWNoIEFTQy0zOEMxNjAwIGZ1bmN0aW9uIGhhcyB0d28gY29ubmVjdG9ycy4gT25seSBhbiBIVkQgZGV2aWNlCisgICAgICogY2FuIG5vdCBiZSBjb25uZWN0ZWQgdG8gZWl0aGVyIGNvbm5lY3Rvci4gQW4gTFZEIGRldmljZSBvciBTRSBkZXZpY2UKKyAgICAgKiBtYXkgYmUgY29ubmVjdGVkIHRvIGVpdGhlciBjb25uZWNvci4gSWYgYW4gU0UgZGV2aWNlIGlzIGNvbm5lY3RlZCwKKyAgICAgKiB0aGVuIGF0IG1vc3QgVWx0cmEgc3BlZWQgKDIwIE1oeikgY2FuIGJlIHVzZWQgb24gYm90aCBjb25uZWN0b3JzLgorICAgICAqCisgICAgICogSWYgYW4gSFZEIGRldmljZSBpcyBhdHRhY2hlZCwgcmV0dXJuIGFuIGVycm9yLgorICAgICAqLworICAgIGlmIChzY3NpX2NmZzEgJiBIVkQpCisgICAgeworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9IVkRfREVWSUNFOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKworICAgIC8qCisgICAgICogRWFjaCBmdW5jdGlvbiBpbiB0aGUgQVNDLTM4QzE2MDAgdXNlcyBvbmx5IHRoZSBTRSBjYWJsZSBkZXRlY3QgYW5kCisgICAgICogdGVybWluYXRpb24gYmVjYXVzZSB0aGVyZSBhcmUgdHdvIGNvbm5lY3RvcnMgZm9yIGVhY2ggZnVuY3Rpb24uIEVhY2gKKyAgICAgKiBmdW5jdGlvbiBtYXkgdXNlIGVpdGhlciBMVkQgb3IgU0UgbW9kZS4gQ29ycmVzcG9uZGluZyB0aGUgU0UgYXV0b21hdGljCisgICAgICogdGVybWluYXRpb24gY29udHJvbCBFRVBST00gYml0cyBhcmUgdXNlZCBmb3IgZWFjaCBmdW5jdGlvbi4gRWFjaAorICAgICAqIGZ1bmN0aW9uIGhhcyBpdHMgb3duIEVFUFJPTS4gSWYgU0UgYXV0b21hdGljIGNvbnRyb2wgaXMgZW5hYmxlZCBmb3IKKyAgICAgKiB0aGUgZnVuY3Rpb24sIHRoZW4gc2V0IHRoZSB0ZXJtaW5hdGlvbiB2YWx1ZSBiYXNlZCBvbiBhIHRhYmxlIGxpc3RlZAorICAgICAqIGluIGFfY29uZG9yLmguCisgICAgICoKKyAgICAgKiBJZiBtYW51YWwgdGVybWluYXRpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBFRVBST00gZm9yIHRoZSBmdW5jdGlvbiwKKyAgICAgKiB0aGVuICd0ZXJtaW5hdGlvbicgd2FzIHNldC11cCBpbiBBc2NJbml0RnJvbTM4QzE2MDBFRVBST00oKSBhbmQgaXMKKyAgICAgKiByZWFkeSB0byBiZSAnb3JlZCcgaW50byBTQ1NJX0NGRzEuCisgICAgICovCisgICAgaWYgKChhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uICYgVEVSTV9TRSkgPT0gMCkKKyAgICB7CisgICAgICAgIC8qIFNFIGF1dG9tYXRpYyB0ZXJtaW5hdGlvbiBjb250cm9sIGlzIGVuYWJsZWQuICovCisgICAgICAgIHN3aXRjaChzY3NpX2NmZzEgJiBDX0RFVF9TRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVEVSTV9TRV9ISTogb24sIFRFUk1fU0VfTE86IG9uICovCisgICAgICAgICAgICBjYXNlIDB4MTogY2FzZSAweDI6IGNhc2UgMHgzOgorICAgICAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gfD0gVEVSTV9TRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweDA6CisgICAgICAgICAgICAgICAgaWYgKEFTQ19QQ0lfSUQyRlVOQyhhc2NfZHZjLT5jZmctPnBjaV9zbG90X2luZm8pID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiAwIC0gVEVSTV9TRV9ISTogb2ZmLCBURVJNX1NFX0xPOiBvZmYgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gMSAtIFRFUk1fU0VfSEk6IG9uLCBURVJNX1NFX0xPOiBvZmYgKi8KKyAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiB8PSBURVJNX1NFX0hJOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogQ2xlYXIgYW55IHNldCBURVJNX1NFIGJpdHMuCisgICAgICovCisgICAgc2NzaV9jZmcxICY9IH5URVJNX1NFOworCisgICAgLyoKKyAgICAgKiBJbnZlcnQgdGhlIFRFUk1fU0UgYml0cyBhbmQgdGhlbiBzZXQgJ3Njc2lfY2ZnMScuCisgICAgICovCisgICAgc2NzaV9jZmcxIHw9ICh+YXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiAmIFRFUk1fU0UpOworCisgICAgLyoKKyAgICAgKiBDbGVhciBCaWcgRW5kaWFuIGFuZCBUZXJtaW5hdG9yIFBvbGFyaXR5IGJpdHMgYW5kIHNldCBwb3NzaWJseQorICAgICAqIG1vZGlmaWVkIHRlcm1pbmF0aW9uIGNvbnRyb2wgYml0cyBpbiB0aGUgTWljcm9jb2RlIFNDU0lfQ0ZHMQorICAgICAqIFJlZ2lzdGVyIFZhbHVlLgorICAgICAqCisgICAgICogQmlnIEVuZGlhbiBiaXQgaXMgbm90IHVzZWQgZXZlbiBvbiBiaWcgZW5kaWFuIG1hY2hpbmVzLgorICAgICAqLworICAgIHNjc2lfY2ZnMSAmPSAofkJJR19FTkRJQU4gJiB+RElTX1RFUk1fRFJWICYgflRFUk1fUE9MKTsKKworICAgIC8qCisgICAgICogU2V0IFNDU0lfQ0ZHMSBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZQorICAgICAqCisgICAgICogU2V0IHBvc3NpYmx5IG1vZGlmaWVkIHRlcm1pbmF0aW9uIGNvbnRyb2wgYml0cyBpbiB0aGUgTWljcm9jb2RlCisgICAgICogU0NTSV9DRkcxIFJlZ2lzdGVyIFZhbHVlLgorICAgICAqCisgICAgICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0NTSV9DRkcxIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKKyAgICAgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgorICAgICAqLworICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ERUZBVUxUX1NDU0lfQ0ZHMSwgc2NzaV9jZmcxKTsKKworICAgIC8qCisgICAgICogU2V0IE1FTV9DRkcgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUKKyAgICAgKgorICAgICAqIFRoZSBtaWNyb2NvZGUgd2lsbCBzZXQgdGhlIE1FTV9DRkcgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisgICAgICoKKyAgICAgKiBNRU1fQ0ZHIG1heSBiZSBhY2Nlc3NlZCBhcyBhIHdvcmQgb3IgYnl0ZSwgYnV0IG9ubHkgYml0cyAwLTcKKyAgICAgKiBhcmUgZGVmaW5lZC4KKyAgICAgKgorICAgICAqIEFTQy0zOEMxNjAwIGhhcyAzMktCIGludGVybmFsIG1lbW9yeS4KKyAgICAgKgorICAgICAqIFhYWCAtIFNpbmNlIEFTQzM4QzE2MDAgUmV2LjMgaGFzIGEgTG9jYWwgUkFNIGZhaWx1cmUgaXNzdWUsIHdlIGNvbWUKKyAgICAgKiBvdXQgYSBzcGVjaWFsIDE2SyBBZHYgTGlicmFyeSBhbmQgTWljcm9jb2RlIHZlcnNpb24uIEFmdGVyIHRoZSBpc3N1ZQorICAgICAqIHJlc29sdmVkLCB3ZSBzaG91bGQgdHVybiBiYWNrIHRvIHRoZSAzMksgc3VwcG9ydC4gQm90aCBhX2NvbmRvci5oIGFuZAorICAgICAqIG1jb2RlLnNhcyBmaWxlcyBhbHNvIG5lZWQgdG8gYmUgdXBkYXRlZC4KKyAgICAgKgorICAgICAqIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ERUZBVUxUX01FTV9DRkcsCisgICAgICogIEJJT1NfRU4gfCBSQU1fU1pfMzJLQik7CisgICAgICovCisgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ERUZBVUxUX01FTV9DRkcsIEJJT1NfRU4gfCBSQU1fU1pfMTZLQik7CisKKyAgICAvKgorICAgICAqIFNldCBTRUxfTUFTSyBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZQorICAgICAqCisgICAgICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0VMX01BU0sgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFRkFVTFRfU0VMX01BU0ssCisgICAgICAgIEFEVl9USURfVE9fVElETUFTSyhhc2NfZHZjLT5jaGlwX3Njc2lfaWQpKTsKKworICAgIC8qCisgICAgICogQnVpbGQgdGhlIGNhcnJpZXIgZnJlZWxpc3QuCisgICAgICoKKyAgICAgKiBEcml2ZXIgbXVzdCBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIG1lbW9yeSBhbmQgc2V0ICdjYXJyaWVyX2J1ZicuCisgICAgICovCisKKyAgICBBU0NfQVNTRVJUKGFzY19kdmMtPmNhcnJpZXJfYnVmICE9IE5VTEwpOworCisgICAgY2FycnAgPSAoQURWX0NBUlJfVCAqKSBBRFZfMTZCQUxJR04oYXNjX2R2Yy0+Y2Fycmllcl9idWYpOworICAgIGFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSBOVUxMOworICAgIGlmIChjYXJycCA9PSAoQURWX0NBUlJfVCAqKSBhc2NfZHZjLT5jYXJyaWVyX2J1ZikKKyAgICB7CisgICAgICAgIGJ1Zl9zaXplID0gQURWX0NBUlJJRVJfQlVGU0laRTsKKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIGJ1Zl9zaXplID0gQURWX0NBUlJJRVJfQlVGU0laRSAtIHNpemVvZihBRFZfQ0FSUl9UKTsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIC8qCisgICAgICAgICAqIEdldCBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgY2FycmllciAnY2FycnAnLgorICAgICAgICAgKi8KKyAgICAgICAgY29udGlnX2xlbiA9IHNpemVvZihBRFZfQ0FSUl9UKTsKKyAgICAgICAgY2Fycl9wYWRkciA9IGNwdV90b19sZTMyKER2Y0dldFBoeUFkZHIoYXNjX2R2YywgTlVMTCwgKHVjaGFyICopIGNhcnJwLAorICAgICAgICAgICAgKEFEVl9TRENOVCAqKSAmY29udGlnX2xlbiwgQURWX0lTX0NBUlJJRVJfRkxBRykpOworCisgICAgICAgIGJ1Zl9zaXplIC09IHNpemVvZihBRFZfQ0FSUl9UKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgY3VycmVudCBjYXJyaWVyIGlzIG5vdCBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMsIHRoZW4KKyAgICAgICAgICogbWF5YmUgdGhlcmUgd2FzIGEgcGFnZSBjcm9zc2luZy4gVHJ5IHRoZSBuZXh0IGNhcnJpZXIgYWxpZ25lZAorICAgICAgICAgKiBzdGFydCBhZGRyZXNzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGNvbnRpZ19sZW4gPCBzaXplb2YoQURWX0NBUlJfVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhcnJwKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhcnJwLT5jYXJyX3BhID0gY2Fycl9wYWRkcjsKKyAgICAgICAgY2FycnAtPmNhcnJfdmEgPSBjcHVfdG9fbGUzMihBRFZfVkFERFJfVE9fVTMyKGNhcnJwKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSW5zZXJ0IHRoZSBjYXJyaWVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZyZWVsaXN0LgorICAgICAgICAgKi8KKyAgICAgICAgY2FycnAtPm5leHRfdnBhID0gY3B1X3RvX2xlMzIoQURWX1ZBRERSX1RPX1UzMihhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0KSk7CisgICAgICAgIGFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSBjYXJycDsKKworICAgICAgICBjYXJycCsrOworICAgIH0KKyAgICB3aGlsZSAoYnVmX3NpemUgPiAwKTsKKworICAgIC8qCisgICAgICogU2V0LXVwIHRoZSBIb3N0LT5SSVNDIEluaXRpYXRvciBDb21tYW5kIFF1ZXVlIChJQ1EpLgorICAgICAqLworICAgIGlmICgoYXNjX2R2Yy0+aWNxX3NwID0gYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX05PX0NBUlJJRVI7CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorICAgIGFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSAoQURWX0NBUlJfVCAqKQorICAgICAgICBBRFZfVTMyX1RPX1ZBRERSKGxlMzJfdG9fY3B1KGFzY19kdmMtPmljcV9zcC0+bmV4dF92cGEpKTsKKworICAgIC8qCisgICAgICogVGhlIGZpcnN0IGNvbW1hbmQgaXNzdWVkIHdpbGwgYmUgcGxhY2VkIGluIHRoZSBzdG9wcGVyIGNhcnJpZXIuCisgICAgICovCisgICAgYXNjX2R2Yy0+aWNxX3NwLT5uZXh0X3ZwYSA9IGNwdV90b19sZTMyKEFTQ19DUV9TVE9QUEVSKTsKKworICAgIC8qCisgICAgICogU2V0IFJJU0MgSUNRIHBoeXNpY2FsIGFkZHJlc3Mgc3RhcnQgdmFsdWUuIEluaXRpYWxpemUgdGhlCisgICAgICogQ09NTUEgcmVnaXN0ZXIgdG8gdGhlIHNhbWUgdmFsdWUgb3RoZXJ3aXNlIHRoZSBSSVNDIHdpbGwKKyAgICAgKiBwcmVtYXR1cmVseSBkZXRlY3QgYSBjb21tYW5kIGlzIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBBZHZXcml0ZURXb3JkTHJhbU5vU3dhcChpb3BfYmFzZSwgQVNDX01DX0lDUSwgYXNjX2R2Yy0+aWNxX3NwLT5jYXJyX3BhKTsKKyAgICBBZHZXcml0ZURXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUERXX0NPTU1BLAorICAgICAgICBsZTMyX3RvX2NwdShhc2NfZHZjLT5pY3Ffc3AtPmNhcnJfcGEpKTsKKworICAgIC8qCisgICAgICogU2V0LXVwIHRoZSBSSVNDLT5Ib3N0IEluaXRpYXRvciBSZXNwb25zZSBRdWV1ZSAoSVJRKS4KKyAgICAgKi8KKyAgICBpZiAoKGFzY19kdmMtPmlycV9zcCA9IGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpID09IE5VTEwpCisgICAgeworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9OT19DQVJSSUVSOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKyAgICBhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0ID0gKEFEVl9DQVJSX1QgKikKKyAgICAgICAgQURWX1UzMl9UT19WQUREUihsZTMyX3RvX2NwdShhc2NfZHZjLT5pcnFfc3AtPm5leHRfdnBhKSk7CisKKyAgICAvKgorICAgICAqIFRoZSBmaXJzdCBjb21tYW5kIGNvbXBsZXRlZCBieSB0aGUgUklTQyB3aWxsIGJlIHBsYWNlZCBpbgorICAgICAqIHRoZSBzdG9wcGVyLgorICAgICAqCisgICAgICogTm90ZTogU2V0ICduZXh0X3ZwYScgdG8gQVNDX0NRX1NUT1BQRVIuIFdoZW4gdGhlIHJlcXVlc3QgaXMKKyAgICAgKiBjb21wbGV0ZWQgdGhlIFJJU0Mgd2lsbCBzZXQgdGhlIEFTQ19SUV9TVE9QUEVSIGJpdC4KKyAgICAgKi8KKyAgICBhc2NfZHZjLT5pcnFfc3AtPm5leHRfdnBhID0gY3B1X3RvX2xlMzIoQVNDX0NRX1NUT1BQRVIpOworCisgICAgLyoKKyAgICAgKiBTZXQgUklTQyBJUlEgcGh5c2ljYWwgYWRkcmVzcyBzdGFydCB2YWx1ZS4KKyAgICAgKi8KKyAgICBBZHZXcml0ZURXb3JkTHJhbU5vU3dhcChpb3BfYmFzZSwgQVNDX01DX0lSUSwgYXNjX2R2Yy0+aXJxX3NwLT5jYXJyX3BhKTsKKyAgICBhc2NfZHZjLT5jYXJyX3BlbmRpbmdfY250ID0gMDsKKworICAgIEFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0lOVFJfRU5BQkxFUywKKyAgICAgICAgKEFEVl9JTlRSX0VOQUJMRV9IT1NUX0lOVFIgfCBBRFZfSU5UUl9FTkFCTEVfR0xPQkFMX0lOVFIpKTsKKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT0RFX0JFR0lOX0FERFIsIHdvcmQpOworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1BDLCB3b3JkKTsKKworICAgIC8qIGZpbmFsbHksIGZpbmFsbHksIGdlbnRsZW1lbiwgc3RhcnQgeW91ciBlbmdpbmUgKi8KKyAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19SSVNDX0NTUiwgQURWX1JJU0NfQ1NSX1JVTik7CisKKyAgICAvKgorICAgICAqIFJlc2V0IHRoZSBTQ1NJIEJ1cyBpZiB0aGUgRUVQUk9NIGluZGljYXRlcyB0aGF0IFNDU0kgQnVzCisgICAgICogUmVzZXRzIHNob3VsZCBiZSBwZXJmb3JtZWQuIFRoZSBSSVNDIGhhcyB0byBiZSBydW5uaW5nCisgICAgICogdG8gaXNzdWUgYSBTQ1NJIEJ1cyBSZXNldC4KKyAgICAgKi8KKyAgICBpZiAoYXNjX2R2Yy0+Ymlvc19jdHJsICYgQklPU19DVFJMX1JFU0VUX1NDU0lfQlVTKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlIEJJT1MgU2lnbmF0dXJlIGlzIHByZXNlbnQgaW4gbWVtb3J5LCByZXN0b3JlIHRoZQorICAgICAgICAgKiBwZXIgVElEIG1pY3JvY29kZSBvcGVyYXRpbmcgdmFyaWFibGVzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGJpb3NfbWVtWyhBU0NfTUNfQklPU19TSUdOQVRVUkUgLSBBU0NfTUNfQklPU01FTSkvMl0gPT0gMHg1NUFBKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogUmVzdG9yZSBwZXIgVElEIG5lZ290aWF0ZWQgdmFsdWVzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfV0RUUl9BQkxFLCB3ZHRyX2FibGUpOworICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfQUJMRSwgc2R0cl9hYmxlKTsKKyAgICAgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19QUFJfQUJMRSwgcHByX2FibGUpOworICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7CisgICAgICAgICAgICBmb3IgKHRpZCA9IDA7IHRpZCA8PSBBU0NfTUFYX1RJRDsgdGlkKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWR2V3JpdGVCeXRlTHJhbShpb3BfYmFzZSwgQVNDX01DX05VTUJFUl9PRl9NQVhfQ01EICsgdGlkLAorICAgICAgICAgICAgICAgICAgICBtYXhfY21kW3RpZF0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEFkdlJlc2V0U0IoYXNjX2R2YykgIT0gQURWX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2Fybl9jb2RlID0gQVNDX1dBUk5fQlVTUkVTRVRfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gd2Fybl9jb2RlOworfQorCisvKgorICogUmVhZCB0aGUgYm9hcmQncyBFRVBST00gY29uZmlndXJhdGlvbi4gU2V0IGZpZWxkcyBpbiBBRFZfRFZDX1ZBUiBhbmQKKyAqIEFEVl9EVkNfQ0ZHIGJhc2VkIG9uIHRoZSBFRVBST00gc2V0dGluZ3MuIFRoZSBjaGlwIGlzIHN0b3BwZWQgd2hpbGUKKyAqIGFsbCBvZiB0aGlzIGlzIGRvbmUuCisgKgorICogT24gZmFpbHVyZSBzZXQgdGhlIEFEVl9EVkNfVkFSIGZpZWxkICdlcnJfY29kZScgYW5kIHJldHVybiBBRFZfRVJST1IuCisgKgorICogRm9yIGEgbm9uLWZhdGFsIGVycm9yIHJldHVybiBhIHdhcm5pbmcgY29kZS4gSWYgdGhlcmUgYXJlIG5vIHdhcm5pbmdzCisgKiB0aGVuIDAgaXMgcmV0dXJuZWQuCisgKgorICogTm90ZTogQ2hpcCBpcyBzdG9wcGVkIG9uIGVudHJ5LgorICovCitTVEFUSUMgaW50IF9faW5pdAorQWR2SW5pdEZyb20zNTUwRUVQKEFEVl9EVkNfVkFSICphc2NfZHZjKQoreworICAgIEFkdlBvcnRBZGRyICAgICAgICAgaW9wX2Jhc2U7CisgICAgdXNob3J0ICAgICAgICAgICAgICB3YXJuX2NvZGU7CisgICAgQURWRUVQXzM1NTBfQ09ORklHICBlZXBfY29uZmlnOworICAgIGludCAgICAgICAgICAgICAgICAgaTsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisKKyAgICB3YXJuX2NvZGUgPSAwOworCisgICAgLyoKKyAgICAgKiBSZWFkIHRoZSBib2FyZCdzIEVFUFJPTSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogU2V0IGRlZmF1bHQgdmFsdWVzIGlmIGEgYmFkIGNoZWNrc3VtIGlzIGZvdW5kLgorICAgICAqLworICAgIGlmIChBZHZHZXQzNTUwRUVQQ29uZmlnKGlvcF9iYXNlLCAmZWVwX2NvbmZpZykgIT0gZWVwX2NvbmZpZy5jaGVja19zdW0pCisgICAgeworICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fRUVQUk9NX0NIS1NVTTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgRUVQUk9NIGRlZmF1bHQgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihBRFZFRVBfMzU1MF9DT05GSUcpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICooKHVjaGFyICopICZlZXBfY29uZmlnICsgaSkgPQorICAgICAgICAgICAgICAgICooKHVjaGFyICopICZEZWZhdWx0XzM1NTBfRUVQUk9NX0NvbmZpZyArIGkpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXNzdW1lIHRoZSA2IGJ5dGUgYm9hcmQgc2VyaWFsIG51bWJlciB0aGF0IHdhcyByZWFkCisgICAgICAgICAqIGZyb20gRUVQUk9NIGlzIGNvcnJlY3QgZXZlbiBpZiB0aGUgRUVQUk9NIGNoZWNrc3VtCisgICAgICAgICAqIGZhaWxlZC4KKyAgICAgICAgICovCisgICAgICAgIGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMyA9CisgICAgICAgICAgICBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgQURWX0VFUF9EVkNfQ0ZHX0VORCAtIDEpOworCisgICAgICAgIGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMiA9CisgICAgICAgICAgICBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgQURWX0VFUF9EVkNfQ0ZHX0VORCAtIDIpOworCisgICAgICAgIGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMSA9CisgICAgICAgICAgICBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgQURWX0VFUF9EVkNfQ0ZHX0VORCAtIDMpOworCisgICAgICAgIEFkdlNldDM1NTBFRVBDb25maWcoaW9wX2Jhc2UsICZlZXBfY29uZmlnKTsKKyAgICB9CisgICAgLyoKKyAgICAgKiBTZXQgQVNDX0RWQ19WQVIgYW5kIEFTQ19EVkNfQ0ZHIHZhcmlhYmxlcyBmcm9tIHRoZQorICAgICAqIEVFUFJPTSBjb25maWd1cmF0aW9uIHRoYXQgd2FzIHJlYWQuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHRoZSBtYXBwaW5nIG9mIEVFUFJPTSBmaWVsZHMgdG8gQWR2IExpYnJhcnkgZmllbGRzLgorICAgICAqLworICAgIGFzY19kdmMtPndkdHJfYWJsZSA9IGVlcF9jb25maWcud2R0cl9hYmxlOworICAgIGFzY19kdmMtPnNkdHJfYWJsZSA9IGVlcF9jb25maWcuc2R0cl9hYmxlOworICAgIGFzY19kdmMtPnVsdHJhX2FibGUgPSBlZXBfY29uZmlnLnVsdHJhX2FibGU7CisgICAgYXNjX2R2Yy0+dGFncW5nX2FibGUgPSBlZXBfY29uZmlnLnRhZ3FuZ19hYmxlOworICAgIGFzY19kdmMtPmNmZy0+ZGlzY19lbmFibGUgPSBlZXBfY29uZmlnLmRpc2NfZW5hYmxlOworICAgIGFzY19kdmMtPm1heF9ob3N0X3FuZyA9IGVlcF9jb25maWcubWF4X2hvc3RfcW5nOworICAgIGFzY19kdmMtPm1heF9kdmNfcW5nID0gZWVwX2NvbmZpZy5tYXhfZHZjX3FuZzsKKyAgICBhc2NfZHZjLT5jaGlwX3Njc2lfaWQgPSAoZWVwX2NvbmZpZy5hZGFwdGVyX3Njc2lfaWQgJiBBRFZfTUFYX1RJRCk7CisgICAgYXNjX2R2Yy0+c3RhcnRfbW90b3IgPSBlZXBfY29uZmlnLnN0YXJ0X21vdG9yOworICAgIGFzY19kdmMtPnNjc2lfcmVzZXRfd2FpdCA9IGVlcF9jb25maWcuc2NzaV9yZXNldF9kZWxheTsKKyAgICBhc2NfZHZjLT5iaW9zX2N0cmwgPSBlZXBfY29uZmlnLmJpb3NfY3RybDsKKyAgICBhc2NfZHZjLT5ub19zY2FtID0gZWVwX2NvbmZpZy5zY2FtX3RvbGVyYW50OworICAgIGFzY19kdmMtPmNmZy0+c2VyaWFsMSA9IGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMTsKKyAgICBhc2NfZHZjLT5jZmctPnNlcmlhbDIgPSBlZXBfY29uZmlnLnNlcmlhbF9udW1iZXJfd29yZDI7CisgICAgYXNjX2R2Yy0+Y2ZnLT5zZXJpYWwzID0gZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQzOworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGhvc3QgbWF4aW11bSBxdWV1aW5nIChtYXguIDI1MywgbWluLiAxNikgYW5kIHRoZSBwZXIgZGV2aWNlCisgICAgICogbWF4aW11bSBxdWV1aW5nIChtYXguIDYzLCBtaW4uIDQpLgorICAgICAqLworICAgIGlmIChlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA+IEFTQ19ERUZfTUFYX0hPU1RfUU5HKQorICAgIHsKKyAgICAgICAgZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPSBBU0NfREVGX01BWF9IT1NUX1FORzsKKyAgICB9IGVsc2UgaWYgKGVlcF9jb25maWcubWF4X2hvc3RfcW5nIDwgQVNDX0RFRl9NSU5fSE9TVF9RTkcpCisgICAgeworICAgICAgICAvKiBJZiB0aGUgdmFsdWUgaXMgemVybywgYXNzdW1lIGl0IGlzIHVuaW5pdGlhbGl6ZWQuICovCisgICAgICAgIGlmIChlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA9IEFTQ19ERUZfTUFYX0hPU1RfUU5HOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPSBBU0NfREVGX01JTl9IT1NUX1FORzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlZXBfY29uZmlnLm1heF9kdmNfcW5nID4gQVNDX0RFRl9NQVhfRFZDX1FORykKKyAgICB7CisgICAgICAgIGVlcF9jb25maWcubWF4X2R2Y19xbmcgPSBBU0NfREVGX01BWF9EVkNfUU5HOworICAgIH0gZWxzZSBpZiAoZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA8IEFTQ19ERUZfTUlOX0RWQ19RTkcpCisgICAgeworICAgICAgICAvKiBJZiB0aGUgdmFsdWUgaXMgemVybywgYXNzdW1lIGl0IGlzIHVuaW5pdGlhbGl6ZWQuICovCisgICAgICAgIGlmIChlZXBfY29uZmlnLm1heF9kdmNfcW5nID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVlcF9jb25maWcubWF4X2R2Y19xbmcgPSBBU0NfREVGX01BWF9EVkNfUU5HOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA9IEFTQ19ERUZfTUlOX0RWQ19RTkc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIElmICdtYXhfZHZjX3FuZycgaXMgZ3JlYXRlciB0aGFuICdtYXhfaG9zdF9xbmcnLCB0aGVuCisgICAgICogc2V0ICdtYXhfZHZjX3FuZycgdG8gJ21heF9ob3N0X3FuZycuCisgICAgICovCisgICAgaWYgKGVlcF9jb25maWcubWF4X2R2Y19xbmcgPiBlZXBfY29uZmlnLm1heF9ob3N0X3FuZykKKyAgICB7CisgICAgICAgIGVlcF9jb25maWcubWF4X2R2Y19xbmcgPSBlZXBfY29uZmlnLm1heF9ob3N0X3FuZzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCBBRFZfRFZDX1ZBUiAnbWF4X2hvc3RfcW5nJyBhbmQgQURWX0RWQ19WQVIgJ21heF9kdmNfcW5nJworICAgICAqIHZhbHVlcyBiYXNlZCBvbiBwb3NzaWJseSBhZGp1c3RlZCBFRVBST00gdmFsdWVzLgorICAgICAqLworICAgIGFzY19kdmMtPm1heF9ob3N0X3FuZyA9IGVlcF9jb25maWcubWF4X2hvc3RfcW5nOworICAgIGFzY19kdmMtPm1heF9kdmNfcW5nID0gZWVwX2NvbmZpZy5tYXhfZHZjX3FuZzsKKworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgRUVQUk9NICd0ZXJtaW5hdGlvbicgZmllbGQgaXMgc2V0IHRvIGF1dG9tYXRpYyAoMCksIHRoZW4gc2V0CisgICAgICogdGhlIEFEVl9EVkNfQ0ZHICd0ZXJtaW5hdGlvbicgZmllbGQgdG8gYXV0b21hdGljIGFsc28uCisgICAgICoKKyAgICAgKiBJZiB0aGUgdGVybWluYXRpb24gaXMgc3BlY2lmaWVkIHdpdGggYSBub24temVybyAndGVybWluYXRpb24nCisgICAgICogdmFsdWUgY2hlY2sgdGhhdCBhIGxlZ2FsIHZhbHVlIGlzIHNldCBhbmQgc2V0IHRoZSBBRFZfRFZDX0NGRworICAgICAqICd0ZXJtaW5hdGlvbicgZmllbGQgYXBwcm9wcmlhdGVseS4KKyAgICAgKi8KKyAgICBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbiA9PSAwKQorICAgIHsKKyAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiA9IDA7ICAgIC8qIGF1dG8gdGVybWluYXRpb24gKi8KKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIC8qIEVuYWJsZSBtYW51YWwgY29udHJvbCB3aXRoIGxvdyBvZmYgLyBoaWdoIG9mZi4gKi8KKyAgICAgICAgaWYgKGVlcF9jb25maWcudGVybWluYXRpb24gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiA9IFRFUk1fQ1RMX1NFTDsKKworICAgICAgICAvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb2ZmIC8gaGlnaCBvbi4gKi8KKyAgICAgICAgfSBlbHNlIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPSBURVJNX0NUTF9TRUwgfCBURVJNX0NUTF9IOworCisgICAgICAgIC8qIEVuYWJsZSBtYW51YWwgY29udHJvbCB3aXRoIGxvdyBvbiAvIGhpZ2ggb24uICovCisgICAgICAgIH0gZWxzZSBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbiA9PSAzKQorICAgICAgICB7CisgICAgICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gVEVSTV9DVExfU0VMIHwgVEVSTV9DVExfSCB8IFRFUk1fQ1RMX0w7CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIEVFUFJPTSAndGVybWluYXRpb24nIGZpZWxkIGNvbnRhaW5zIGEgYmFkIHZhbHVlLiBVc2UKKyAgICAgICAgICAgICAqIGF1dG9tYXRpYyB0ZXJtaW5hdGlvbiBpbnN0ZWFkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gMDsKKyAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9FRVBST01fVEVSTUlOQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gd2Fybl9jb2RlOworfQorCisvKgorICogUmVhZCB0aGUgYm9hcmQncyBFRVBST00gY29uZmlndXJhdGlvbi4gU2V0IGZpZWxkcyBpbiBBRFZfRFZDX1ZBUiBhbmQKKyAqIEFEVl9EVkNfQ0ZHIGJhc2VkIG9uIHRoZSBFRVBST00gc2V0dGluZ3MuIFRoZSBjaGlwIGlzIHN0b3BwZWQgd2hpbGUKKyAqIGFsbCBvZiB0aGlzIGlzIGRvbmUuCisgKgorICogT24gZmFpbHVyZSBzZXQgdGhlIEFEVl9EVkNfVkFSIGZpZWxkICdlcnJfY29kZScgYW5kIHJldHVybiBBRFZfRVJST1IuCisgKgorICogRm9yIGEgbm9uLWZhdGFsIGVycm9yIHJldHVybiBhIHdhcm5pbmcgY29kZS4gSWYgdGhlcmUgYXJlIG5vIHdhcm5pbmdzCisgKiB0aGVuIDAgaXMgcmV0dXJuZWQuCisgKgorICogTm90ZTogQ2hpcCBpcyBzdG9wcGVkIG9uIGVudHJ5LgorICovCitTVEFUSUMgaW50IF9faW5pdAorQWR2SW5pdEZyb20zOEMwODAwRUVQKEFEVl9EVkNfVkFSICphc2NfZHZjKQoreworICAgIEFkdlBvcnRBZGRyICAgICAgICAgICAgICBpb3BfYmFzZTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICAgICAgd2Fybl9jb2RlOworICAgIEFEVkVFUF8zOEMwODAwX0NPTkZJRyAgICBlZXBfY29uZmlnOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICBpOworICAgIHVjaGFyICAgICAgICAgICAgICAgICAgICB0aWQsIHRlcm1pbmF0aW9uOworICAgIHVzaG9ydCAgICAgICAgICAgICAgICAgICBzZHRyX3NwZWVkID0gMDsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisKKyAgICB3YXJuX2NvZGUgPSAwOworCisgICAgLyoKKyAgICAgKiBSZWFkIHRoZSBib2FyZCdzIEVFUFJPTSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogU2V0IGRlZmF1bHQgdmFsdWVzIGlmIGEgYmFkIGNoZWNrc3VtIGlzIGZvdW5kLgorICAgICAqLworICAgIGlmIChBZHZHZXQzOEMwODAwRUVQQ29uZmlnKGlvcF9iYXNlLCAmZWVwX2NvbmZpZykgIT0gZWVwX2NvbmZpZy5jaGVja19zdW0pCisgICAgeworICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fRUVQUk9NX0NIS1NVTTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgRUVQUk9NIGRlZmF1bHQgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihBRFZFRVBfMzhDMDgwMF9DT05GSUcpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICooKHVjaGFyICopICZlZXBfY29uZmlnICsgaSkgPQorICAgICAgICAgICAgICAgICooKHVjaGFyICopICZEZWZhdWx0XzM4QzA4MDBfRUVQUk9NX0NvbmZpZyArIGkpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXNzdW1lIHRoZSA2IGJ5dGUgYm9hcmQgc2VyaWFsIG51bWJlciB0aGF0IHdhcyByZWFkCisgICAgICAgICAqIGZyb20gRUVQUk9NIGlzIGNvcnJlY3QgZXZlbiBpZiB0aGUgRUVQUk9NIGNoZWNrc3VtCisgICAgICAgICAqIGZhaWxlZC4KKyAgICAgICAgICovCisgICAgICAgIGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMyA9CisgICAgICAgICAgICBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgQURWX0VFUF9EVkNfQ0ZHX0VORCAtIDEpOworCisgICAgICAgIGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMiA9CisgICAgICAgICAgICBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgQURWX0VFUF9EVkNfQ0ZHX0VORCAtIDIpOworCisgICAgICAgIGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMSA9CisgICAgICAgICAgICBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgQURWX0VFUF9EVkNfQ0ZHX0VORCAtIDMpOworCisgICAgICAgIEFkdlNldDM4QzA4MDBFRVBDb25maWcoaW9wX2Jhc2UsICZlZXBfY29uZmlnKTsKKyAgICB9CisgICAgLyoKKyAgICAgKiBTZXQgQURWX0RWQ19WQVIgYW5kIEFEVl9EVkNfQ0ZHIHZhcmlhYmxlcyBmcm9tIHRoZQorICAgICAqIEVFUFJPTSBjb25maWd1cmF0aW9uIHRoYXQgd2FzIHJlYWQuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHRoZSBtYXBwaW5nIG9mIEVFUFJPTSBmaWVsZHMgdG8gQWR2IExpYnJhcnkgZmllbGRzLgorICAgICAqLworICAgIGFzY19kdmMtPndkdHJfYWJsZSA9IGVlcF9jb25maWcud2R0cl9hYmxlOworICAgIGFzY19kdmMtPnNkdHJfc3BlZWQxID0gZWVwX2NvbmZpZy5zZHRyX3NwZWVkMTsKKyAgICBhc2NfZHZjLT5zZHRyX3NwZWVkMiA9IGVlcF9jb25maWcuc2R0cl9zcGVlZDI7CisgICAgYXNjX2R2Yy0+c2R0cl9zcGVlZDMgPSBlZXBfY29uZmlnLnNkdHJfc3BlZWQzOworICAgIGFzY19kdmMtPnNkdHJfc3BlZWQ0ID0gZWVwX2NvbmZpZy5zZHRyX3NwZWVkNDsKKyAgICBhc2NfZHZjLT50YWdxbmdfYWJsZSA9IGVlcF9jb25maWcudGFncW5nX2FibGU7CisgICAgYXNjX2R2Yy0+Y2ZnLT5kaXNjX2VuYWJsZSA9IGVlcF9jb25maWcuZGlzY19lbmFibGU7CisgICAgYXNjX2R2Yy0+bWF4X2hvc3RfcW5nID0gZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmc7CisgICAgYXNjX2R2Yy0+bWF4X2R2Y19xbmcgPSBlZXBfY29uZmlnLm1heF9kdmNfcW5nOworICAgIGFzY19kdmMtPmNoaXBfc2NzaV9pZCA9IChlZXBfY29uZmlnLmFkYXB0ZXJfc2NzaV9pZCAmIEFEVl9NQVhfVElEKTsKKyAgICBhc2NfZHZjLT5zdGFydF9tb3RvciA9IGVlcF9jb25maWcuc3RhcnRfbW90b3I7CisgICAgYXNjX2R2Yy0+c2NzaV9yZXNldF93YWl0ID0gZWVwX2NvbmZpZy5zY3NpX3Jlc2V0X2RlbGF5OworICAgIGFzY19kdmMtPmJpb3NfY3RybCA9IGVlcF9jb25maWcuYmlvc19jdHJsOworICAgIGFzY19kdmMtPm5vX3NjYW0gPSBlZXBfY29uZmlnLnNjYW1fdG9sZXJhbnQ7CisgICAgYXNjX2R2Yy0+Y2ZnLT5zZXJpYWwxID0gZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQxOworICAgIGFzY19kdmMtPmNmZy0+c2VyaWFsMiA9IGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMjsKKyAgICBhc2NfZHZjLT5jZmctPnNlcmlhbDMgPSBlZXBfY29uZmlnLnNlcmlhbF9udW1iZXJfd29yZDM7CisKKyAgICAvKgorICAgICAqIEZvciBldmVyeSBUYXJnZXQgSUQgaWYgYW55IG9mIGl0cyAnc2R0cl9zcGVlZFsxMjM0XScgYml0cworICAgICAqIGFyZSBzZXQsIHRoZW4gc2V0IGFuICdzZHRyX2FibGUnIGJpdCBmb3IgaXQuCisgICAgICovCisgICAgYXNjX2R2Yy0+c2R0cl9hYmxlID0gMDsKKyAgICBmb3IgKHRpZCA9IDA7IHRpZCA8PSBBRFZfTUFYX1RJRDsgdGlkKyspCisgICAgeworICAgICAgICBpZiAodGlkID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNkdHJfc3BlZWQgPSBhc2NfZHZjLT5zZHRyX3NwZWVkMTsKKyAgICAgICAgfSBlbHNlIGlmICh0aWQgPT0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgc2R0cl9zcGVlZCA9IGFzY19kdmMtPnNkdHJfc3BlZWQyOworICAgICAgICB9IGVsc2UgaWYgKHRpZCA9PSA4KQorICAgICAgICB7CisgICAgICAgICAgICBzZHRyX3NwZWVkID0gYXNjX2R2Yy0+c2R0cl9zcGVlZDM7CisgICAgICAgIH0gZWxzZSBpZiAodGlkID09IDEyKQorICAgICAgICB7CisgICAgICAgICAgICBzZHRyX3NwZWVkID0gYXNjX2R2Yy0+c2R0cl9zcGVlZDQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNkdHJfc3BlZWQgJiBBRFZfTUFYX1RJRCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNjX2R2Yy0+c2R0cl9hYmxlIHw9ICgxIDw8IHRpZCk7CisgICAgICAgIH0KKyAgICAgICAgc2R0cl9zcGVlZCA+Pj0gNDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgaG9zdCBtYXhpbXVtIHF1ZXVpbmcgKG1heC4gMjUzLCBtaW4uIDE2KSBhbmQgdGhlIHBlciBkZXZpY2UKKyAgICAgKiBtYXhpbXVtIHF1ZXVpbmcgKG1heC4gNjMsIG1pbi4gNCkuCisgICAgICovCisgICAgaWYgKGVlcF9jb25maWcubWF4X2hvc3RfcW5nID4gQVNDX0RFRl9NQVhfSE9TVF9RTkcpCisgICAgeworICAgICAgICBlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA9IEFTQ19ERUZfTUFYX0hPU1RfUU5HOworICAgIH0gZWxzZSBpZiAoZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPCBBU0NfREVGX01JTl9IT1NUX1FORykKKyAgICB7CisgICAgICAgIC8qIElmIHRoZSB2YWx1ZSBpcyB6ZXJvLCBhc3N1bWUgaXQgaXMgdW5pbml0aWFsaXplZC4gKi8KKyAgICAgICAgaWYgKGVlcF9jb25maWcubWF4X2hvc3RfcW5nID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVlcF9jb25maWcubWF4X2hvc3RfcW5nID0gQVNDX0RFRl9NQVhfSE9TVF9RTkc7CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA9IEFTQ19ERUZfTUlOX0hPU1RfUU5HOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVlcF9jb25maWcubWF4X2R2Y19xbmcgPiBBU0NfREVGX01BWF9EVkNfUU5HKQorICAgIHsKKyAgICAgICAgZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA9IEFTQ19ERUZfTUFYX0RWQ19RTkc7CisgICAgfSBlbHNlIGlmIChlZXBfY29uZmlnLm1heF9kdmNfcW5nIDwgQVNDX0RFRl9NSU5fRFZDX1FORykKKyAgICB7CisgICAgICAgIC8qIElmIHRoZSB2YWx1ZSBpcyB6ZXJvLCBhc3N1bWUgaXQgaXMgdW5pbml0aWFsaXplZC4gKi8KKyAgICAgICAgaWYgKGVlcF9jb25maWcubWF4X2R2Y19xbmcgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA9IEFTQ19ERUZfTUFYX0RWQ19RTkc7CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlZXBfY29uZmlnLm1heF9kdmNfcW5nID0gQVNDX0RFRl9NSU5fRFZDX1FORzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogSWYgJ21heF9kdmNfcW5nJyBpcyBncmVhdGVyIHRoYW4gJ21heF9ob3N0X3FuZycsIHRoZW4KKyAgICAgKiBzZXQgJ21heF9kdmNfcW5nJyB0byAnbWF4X2hvc3RfcW5nJy4KKyAgICAgKi8KKyAgICBpZiAoZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA+IGVlcF9jb25maWcubWF4X2hvc3RfcW5nKQorICAgIHsKKyAgICAgICAgZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA9IGVlcF9jb25maWcubWF4X2hvc3RfcW5nOworICAgIH0KKworICAgIC8qCisgICAgICogU2V0IEFEVl9EVkNfVkFSICdtYXhfaG9zdF9xbmcnIGFuZCBBRFZfRFZDX1ZBUiAnbWF4X2R2Y19xbmcnCisgICAgICogdmFsdWVzIGJhc2VkIG9uIHBvc3NpYmx5IGFkanVzdGVkIEVFUFJPTSB2YWx1ZXMuCisgICAgICovCisgICAgYXNjX2R2Yy0+bWF4X2hvc3RfcW5nID0gZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmc7CisgICAgYXNjX2R2Yy0+bWF4X2R2Y19xbmcgPSBlZXBfY29uZmlnLm1heF9kdmNfcW5nOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgRUVQUk9NICd0ZXJtaW5hdGlvbicgZmllbGQgaXMgc2V0IHRvIGF1dG9tYXRpYyAoMCksIHRoZW4gc2V0CisgICAgICogdGhlIEFEVl9EVkNfQ0ZHICd0ZXJtaW5hdGlvbicgZmllbGQgdG8gYXV0b21hdGljIGFsc28uCisgICAgICoKKyAgICAgKiBJZiB0aGUgdGVybWluYXRpb24gaXMgc3BlY2lmaWVkIHdpdGggYSBub24temVybyAndGVybWluYXRpb24nCisgICAgICogdmFsdWUgY2hlY2sgdGhhdCBhIGxlZ2FsIHZhbHVlIGlzIHNldCBhbmQgc2V0IHRoZSBBRFZfRFZDX0NGRworICAgICAqICd0ZXJtaW5hdGlvbicgZmllbGQgYXBwcm9wcmlhdGVseS4KKyAgICAgKi8KKyAgICBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9zZSA9PSAwKQorICAgIHsKKyAgICAgICAgdGVybWluYXRpb24gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhdXRvIHRlcm1pbmF0aW9uIGZvciBTRSAqLworICAgIH0gZWxzZQorICAgIHsKKyAgICAgICAgLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9mZiAvIGhpZ2ggb2ZmLiAqLworICAgICAgICBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9zZSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB0ZXJtaW5hdGlvbiA9IDA7CisKKyAgICAgICAgLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9mZiAvIGhpZ2ggb24uICovCisgICAgICAgIH0gZWxzZSBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9zZSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICB0ZXJtaW5hdGlvbiA9IFRFUk1fU0VfSEk7CisKKyAgICAgICAgLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9uIC8gaGlnaCBvbi4gKi8KKyAgICAgICAgfSBlbHNlIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX3NlID09IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlcm1pbmF0aW9uID0gVEVSTV9TRTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgRUVQUk9NICd0ZXJtaW5hdGlvbl9zZScgZmllbGQgY29udGFpbnMgYSBiYWQgdmFsdWUuCisgICAgICAgICAgICAgKiBVc2UgYXV0b21hdGljIHRlcm1pbmF0aW9uIGluc3RlYWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRlcm1pbmF0aW9uID0gMDsKKyAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9FRVBST01fVEVSTUlOQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9sdmQgPT0gMCkKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPSB0ZXJtaW5hdGlvbjsgLyogYXV0byB0ZXJtaW5hdGlvbiBmb3IgTFZEICovCisgICAgfSBlbHNlCisgICAgeworICAgICAgICAvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb2ZmIC8gaGlnaCBvZmYuICovCisgICAgICAgIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX2x2ZCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gdGVybWluYXRpb247CisKKyAgICAgICAgLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9mZiAvIGhpZ2ggb24uICovCisgICAgICAgIH0gZWxzZSBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9sdmQgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiA9IHRlcm1pbmF0aW9uIHwgVEVSTV9MVkRfSEk7CisKKyAgICAgICAgLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9uIC8gaGlnaCBvbi4gKi8KKyAgICAgICAgfSBlbHNlIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX2x2ZCA9PSAzKQorICAgICAgICB7CisgICAgICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0KKyAgICAgICAgICAgICAgICB0ZXJtaW5hdGlvbiB8IFRFUk1fTFZEOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBFRVBST00gJ3Rlcm1pbmF0aW9uX2x2ZCcgZmllbGQgY29udGFpbnMgYSBiYWQgdmFsdWUuCisgICAgICAgICAgICAgKiBVc2UgYXV0b21hdGljIHRlcm1pbmF0aW9uIGluc3RlYWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPSB0ZXJtaW5hdGlvbjsKKyAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9FRVBST01fVEVSTUlOQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gd2Fybl9jb2RlOworfQorCisvKgorICogUmVhZCB0aGUgYm9hcmQncyBFRVBST00gY29uZmlndXJhdGlvbi4gU2V0IGZpZWxkcyBpbiBBU0NfRFZDX1ZBUiBhbmQKKyAqIEFTQ19EVkNfQ0ZHIGJhc2VkIG9uIHRoZSBFRVBST00gc2V0dGluZ3MuIFRoZSBjaGlwIGlzIHN0b3BwZWQgd2hpbGUKKyAqIGFsbCBvZiB0aGlzIGlzIGRvbmUuCisgKgorICogT24gZmFpbHVyZSBzZXQgdGhlIEFTQ19EVkNfVkFSIGZpZWxkICdlcnJfY29kZScgYW5kIHJldHVybiBBRFZfRVJST1IuCisgKgorICogRm9yIGEgbm9uLWZhdGFsIGVycm9yIHJldHVybiBhIHdhcm5pbmcgY29kZS4gSWYgdGhlcmUgYXJlIG5vIHdhcm5pbmdzCisgKiB0aGVuIDAgaXMgcmV0dXJuZWQuCisgKgorICogTm90ZTogQ2hpcCBpcyBzdG9wcGVkIG9uIGVudHJ5LgorICovCitTVEFUSUMgaW50IF9faW5pdAorQWR2SW5pdEZyb20zOEMxNjAwRUVQKEFEVl9EVkNfVkFSICphc2NfZHZjKQoreworICAgIEFkdlBvcnRBZGRyICAgICAgICAgICAgICBpb3BfYmFzZTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICAgICAgd2Fybl9jb2RlOworICAgIEFEVkVFUF8zOEMxNjAwX0NPTkZJRyAgICBlZXBfY29uZmlnOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICBpOworICAgIHVjaGFyICAgICAgICAgICAgICAgICAgICB0aWQsIHRlcm1pbmF0aW9uOworICAgIHVzaG9ydCAgICAgICAgICAgICAgICAgICBzZHRyX3NwZWVkID0gMDsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisKKyAgICB3YXJuX2NvZGUgPSAwOworCisgICAgLyoKKyAgICAgKiBSZWFkIHRoZSBib2FyZCdzIEVFUFJPTSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogU2V0IGRlZmF1bHQgdmFsdWVzIGlmIGEgYmFkIGNoZWNrc3VtIGlzIGZvdW5kLgorICAgICAqLworICAgIGlmIChBZHZHZXQzOEMxNjAwRUVQQ29uZmlnKGlvcF9iYXNlLCAmZWVwX2NvbmZpZykgIT0gZWVwX2NvbmZpZy5jaGVja19zdW0pCisgICAgeworICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fRUVQUk9NX0NIS1NVTTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgRUVQUk9NIGRlZmF1bHQgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihBRFZFRVBfMzhDMTYwMF9DT05GSUcpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpID09IDEgJiYgQVNDX1BDSV9JRDJGVU5DKGFzY19kdmMtPmNmZy0+cGNpX3Nsb3RfaW5mbykgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNldCBGdW5jdGlvbiAxIEVFUFJPTSBXb3JkIDAgTVNCCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBDbGVhciB0aGUgQklPU19FTkFCTEUgKGJpdCAxNCkgYW5kIElOVEFCIChiaXQgMTEpCisgICAgICAgICAgICAgICAgICogRUVQUk9NIGJpdHMuCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBEaXNhYmxlIEJpdCAxNCAoQklPU19FTkFCTEUpIHRvIGZpeCBTUEFSQyBVbHRyYSA2MCBhbmQKKyAgICAgICAgICAgICAgICAgKiBvbGQgTWFjIHN5c3RlbSBib290aW5nIHByb2JsZW0uIFRoZSBFeHBhbnNpb24gUk9NIG11c3QKKyAgICAgICAgICAgICAgICAgKiBiZSBkaXNhYmxlZCBpbiBGdW5jdGlvbiAxIGZvciB0aGVzZSBzeXN0ZW1zLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgKigodWNoYXIgKikgJmVlcF9jb25maWcgKyBpKSA9CisgICAgICAgICAgICAgICAgKCgqKCh1Y2hhciAqKSAmRGVmYXVsdF8zOEMxNjAwX0VFUFJPTV9Db25maWcgKyBpKSkgJgorICAgICAgICAgICAgICAgICAgICAofigoKEFEVl9FRVBST01fQklPU19FTkFCTEUgfCBBRFZfRUVQUk9NX0lOVEFCKSA+PiA4KSAmCisgICAgICAgICAgICAgICAgICAgICAweEZGKSkpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIElOVEFCIChiaXQgMTEpIGlmIHRoZSBHUElPIDAgaW5wdXQgaW5kaWNhdGVzCisgICAgICAgICAgICAgICAgICogdGhlIEZ1bmN0aW9uIDEgaW50ZXJydXB0IGxpbmUgaXMgd2lyZWQgdG8gSU5UQS4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIFNldC9DbGVhciBCaXQgMTEgKElOVEFCKSBmcm9tIHRoZSBHUElPIGJpdCAwIGlucHV0OgorICAgICAgICAgICAgICAgICAqICAgMSAtIEZ1bmN0aW9uIDEgaW50ZXJydXB0IGxpbmUgd2lyZWQgdG8gSU5UIEEuCisgICAgICAgICAgICAgICAgICogICAwIC0gRnVuY3Rpb24gMSBpbnRlcnJ1cHQgbGluZSB3aXJlZCB0byBJTlQgQi4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIE5vdGU6IEFkYXB0ZXIgYm9hcmRzIGFsd2F5cyBoYXZlIEZ1bmN0aW9uIDAgd2lyZWQgdG8gSU5UQS4KKyAgICAgICAgICAgICAgICAgKiBQdXQgYWxsIDUgR1BJTyBiaXRzIGluIGlucHV0IG1vZGUgYW5kIHRoZW4gcmVhZAorICAgICAgICAgICAgICAgICAqIHRoZWlyIGlucHV0IHZhbHVlcy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9HUElPX0NOVEwsIDApOworICAgICAgICAgICAgICAgIGlmIChBZHZSZWFkQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0dQSU9fREFUQSkgJiAweDAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gMSBpbnRlcnJ1cHQgd2lyZWQgdG8gSU5UQTsgU2V0IEVFUFJPTSBiaXQuICovCisgICAgICAgICAgICAgICAgKigodWNoYXIgKikgJmVlcF9jb25maWcgKyBpKSB8PQorICAgICAgICAgICAgICAgICAgICAoKEFEVl9FRVBST01fSU5UQUIgPj4gOCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKigodWNoYXIgKikgJmVlcF9jb25maWcgKyBpKSA9CisgICAgICAgICAgICAgICAgKigodWNoYXIgKikgJkRlZmF1bHRfMzhDMTYwMF9FRVBST01fQ29uZmlnICsgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBBc3N1bWUgdGhlIDYgYnl0ZSBib2FyZCBzZXJpYWwgbnVtYmVyIHRoYXQgd2FzIHJlYWQKKyAgICAgICAgICogZnJvbSBFRVBST00gaXMgY29ycmVjdCBldmVuIGlmIHRoZSBFRVBST00gY2hlY2tzdW0KKyAgICAgICAgICogZmFpbGVkLgorICAgICAgICAgKi8KKyAgICAgICAgZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQzID0KKyAgICAgICAgICAgIEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBBRFZfRUVQX0RWQ19DRkdfRU5EIC0gMSk7CisKKyAgICAgICAgZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQyID0KKyAgICAgICAgICAgIEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBBRFZfRUVQX0RWQ19DRkdfRU5EIC0gMik7CisKKyAgICAgICAgZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQxID0KKyAgICAgICAgICAgIEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBBRFZfRUVQX0RWQ19DRkdfRU5EIC0gMyk7CisKKyAgICAgICAgQWR2U2V0MzhDMTYwMEVFUENvbmZpZyhpb3BfYmFzZSwgJmVlcF9jb25maWcpOworICAgIH0KKworICAgIC8qCisgICAgICogU2V0IEFTQ19EVkNfVkFSIGFuZCBBU0NfRFZDX0NGRyB2YXJpYWJsZXMgZnJvbSB0aGUKKyAgICAgKiBFRVBST00gY29uZmlndXJhdGlvbiB0aGF0IHdhcyByZWFkLgorICAgICAqCisgICAgICogVGhpcyBpcyB0aGUgbWFwcGluZyBvZiBFRVBST00gZmllbGRzIHRvIEFkdiBMaWJyYXJ5IGZpZWxkcy4KKyAgICAgKi8KKyAgICBhc2NfZHZjLT53ZHRyX2FibGUgPSBlZXBfY29uZmlnLndkdHJfYWJsZTsKKyAgICBhc2NfZHZjLT5zZHRyX3NwZWVkMSA9IGVlcF9jb25maWcuc2R0cl9zcGVlZDE7CisgICAgYXNjX2R2Yy0+c2R0cl9zcGVlZDIgPSBlZXBfY29uZmlnLnNkdHJfc3BlZWQyOworICAgIGFzY19kdmMtPnNkdHJfc3BlZWQzID0gZWVwX2NvbmZpZy5zZHRyX3NwZWVkMzsKKyAgICBhc2NfZHZjLT5zZHRyX3NwZWVkNCA9IGVlcF9jb25maWcuc2R0cl9zcGVlZDQ7CisgICAgYXNjX2R2Yy0+cHByX2FibGUgPSAwOworICAgIGFzY19kdmMtPnRhZ3FuZ19hYmxlID0gZWVwX2NvbmZpZy50YWdxbmdfYWJsZTsKKyAgICBhc2NfZHZjLT5jZmctPmRpc2NfZW5hYmxlID0gZWVwX2NvbmZpZy5kaXNjX2VuYWJsZTsKKyAgICBhc2NfZHZjLT5tYXhfaG9zdF9xbmcgPSBlZXBfY29uZmlnLm1heF9ob3N0X3FuZzsKKyAgICBhc2NfZHZjLT5tYXhfZHZjX3FuZyA9IGVlcF9jb25maWcubWF4X2R2Y19xbmc7CisgICAgYXNjX2R2Yy0+Y2hpcF9zY3NpX2lkID0gKGVlcF9jb25maWcuYWRhcHRlcl9zY3NpX2lkICYgQVNDX01BWF9USUQpOworICAgIGFzY19kdmMtPnN0YXJ0X21vdG9yID0gZWVwX2NvbmZpZy5zdGFydF9tb3RvcjsKKyAgICBhc2NfZHZjLT5zY3NpX3Jlc2V0X3dhaXQgPSBlZXBfY29uZmlnLnNjc2lfcmVzZXRfZGVsYXk7CisgICAgYXNjX2R2Yy0+Ymlvc19jdHJsID0gZWVwX2NvbmZpZy5iaW9zX2N0cmw7CisgICAgYXNjX2R2Yy0+bm9fc2NhbSA9IGVlcF9jb25maWcuc2NhbV90b2xlcmFudDsKKworICAgIC8qCisgICAgICogRm9yIGV2ZXJ5IFRhcmdldCBJRCBpZiBhbnkgb2YgaXRzICdzZHRyX3NwZWVkWzEyMzRdJyBiaXRzCisgICAgICogYXJlIHNldCwgdGhlbiBzZXQgYW4gJ3NkdHJfYWJsZScgYml0IGZvciBpdC4KKyAgICAgKi8KKyAgICBhc2NfZHZjLT5zZHRyX2FibGUgPSAwOworICAgIGZvciAodGlkID0gMDsgdGlkIDw9IEFTQ19NQVhfVElEOyB0aWQrKykKKyAgICB7CisgICAgICAgIGlmICh0aWQgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc2R0cl9zcGVlZCA9IGFzY19kdmMtPnNkdHJfc3BlZWQxOworICAgICAgICB9IGVsc2UgaWYgKHRpZCA9PSA0KQorICAgICAgICB7CisgICAgICAgICAgICBzZHRyX3NwZWVkID0gYXNjX2R2Yy0+c2R0cl9zcGVlZDI7CisgICAgICAgIH0gZWxzZSBpZiAodGlkID09IDgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNkdHJfc3BlZWQgPSBhc2NfZHZjLT5zZHRyX3NwZWVkMzsKKyAgICAgICAgfSBlbHNlIGlmICh0aWQgPT0gMTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNkdHJfc3BlZWQgPSBhc2NfZHZjLT5zZHRyX3NwZWVkNDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2R0cl9zcGVlZCAmIEFTQ19NQVhfVElEKQorICAgICAgICB7CisgICAgICAgICAgICBhc2NfZHZjLT5zZHRyX2FibGUgfD0gKDEgPDwgdGlkKTsKKyAgICAgICAgfQorICAgICAgICBzZHRyX3NwZWVkID4+PSA0OworICAgIH0KKworICAgIC8qCisgICAgICogU2V0IHRoZSBob3N0IG1heGltdW0gcXVldWluZyAobWF4LiAyNTMsIG1pbi4gMTYpIGFuZCB0aGUgcGVyIGRldmljZQorICAgICAqIG1heGltdW0gcXVldWluZyAobWF4LiA2MywgbWluLiA0KS4KKyAgICAgKi8KKyAgICBpZiAoZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPiBBU0NfREVGX01BWF9IT1NUX1FORykKKyAgICB7CisgICAgICAgIGVlcF9jb25maWcubWF4X2hvc3RfcW5nID0gQVNDX0RFRl9NQVhfSE9TVF9RTkc7CisgICAgfSBlbHNlIGlmIChlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA8IEFTQ19ERUZfTUlOX0hPU1RfUU5HKQorICAgIHsKKyAgICAgICAgLyogSWYgdGhlIHZhbHVlIGlzIHplcm8sIGFzc3VtZSBpdCBpcyB1bmluaXRpYWxpemVkLiAqLworICAgICAgICBpZiAoZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPSBBU0NfREVGX01BWF9IT1NUX1FORzsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVlcF9jb25maWcubWF4X2hvc3RfcW5nID0gQVNDX0RFRl9NSU5fSE9TVF9RTkc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA+IEFTQ19ERUZfTUFYX0RWQ19RTkcpCisgICAgeworICAgICAgICBlZXBfY29uZmlnLm1heF9kdmNfcW5nID0gQVNDX0RFRl9NQVhfRFZDX1FORzsKKyAgICB9IGVsc2UgaWYgKGVlcF9jb25maWcubWF4X2R2Y19xbmcgPCBBU0NfREVGX01JTl9EVkNfUU5HKQorICAgIHsKKyAgICAgICAgLyogSWYgdGhlIHZhbHVlIGlzIHplcm8sIGFzc3VtZSBpdCBpcyB1bmluaXRpYWxpemVkLiAqLworICAgICAgICBpZiAoZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBlZXBfY29uZmlnLm1heF9kdmNfcW5nID0gQVNDX0RFRl9NQVhfRFZDX1FORzsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVlcF9jb25maWcubWF4X2R2Y19xbmcgPSBBU0NfREVGX01JTl9EVkNfUU5HOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiAnbWF4X2R2Y19xbmcnIGlzIGdyZWF0ZXIgdGhhbiAnbWF4X2hvc3RfcW5nJywgdGhlbgorICAgICAqIHNldCAnbWF4X2R2Y19xbmcnIHRvICdtYXhfaG9zdF9xbmcnLgorICAgICAqLworICAgIGlmIChlZXBfY29uZmlnLm1heF9kdmNfcW5nID4gZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcpCisgICAgeworICAgICAgICBlZXBfY29uZmlnLm1heF9kdmNfcW5nID0gZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmc7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXQgQVNDX0RWQ19WQVIgJ21heF9ob3N0X3FuZycgYW5kIEFTQ19EVkNfVkFSICdtYXhfZHZjX3FuZycKKyAgICAgKiB2YWx1ZXMgYmFzZWQgb24gcG9zc2libHkgYWRqdXN0ZWQgRUVQUk9NIHZhbHVlcy4KKyAgICAgKi8KKyAgICBhc2NfZHZjLT5tYXhfaG9zdF9xbmcgPSBlZXBfY29uZmlnLm1heF9ob3N0X3FuZzsKKyAgICBhc2NfZHZjLT5tYXhfZHZjX3FuZyA9IGVlcF9jb25maWcubWF4X2R2Y19xbmc7CisKKyAgICAvKgorICAgICAqIElmIHRoZSBFRVBST00gJ3Rlcm1pbmF0aW9uJyBmaWVsZCBpcyBzZXQgdG8gYXV0b21hdGljICgwKSwgdGhlbiBzZXQKKyAgICAgKiB0aGUgQVNDX0RWQ19DRkcgJ3Rlcm1pbmF0aW9uJyBmaWVsZCB0byBhdXRvbWF0aWMgYWxzby4KKyAgICAgKgorICAgICAqIElmIHRoZSB0ZXJtaW5hdGlvbiBpcyBzcGVjaWZpZWQgd2l0aCBhIG5vbi16ZXJvICd0ZXJtaW5hdGlvbicKKyAgICAgKiB2YWx1ZSBjaGVjayB0aGF0IGEgbGVnYWwgdmFsdWUgaXMgc2V0IGFuZCBzZXQgdGhlIEFTQ19EVkNfQ0ZHCisgICAgICogJ3Rlcm1pbmF0aW9uJyBmaWVsZCBhcHByb3ByaWF0ZWx5LgorICAgICAqLworICAgIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX3NlID09IDApCisgICAgeworICAgICAgICB0ZXJtaW5hdGlvbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGF1dG8gdGVybWluYXRpb24gZm9yIFNFICovCisgICAgfSBlbHNlCisgICAgeworICAgICAgICAvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb2ZmIC8gaGlnaCBvZmYuICovCisgICAgICAgIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX3NlID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlcm1pbmF0aW9uID0gMDsKKworICAgICAgICAvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb2ZmIC8gaGlnaCBvbi4gKi8KKyAgICAgICAgfSBlbHNlIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX3NlID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlcm1pbmF0aW9uID0gVEVSTV9TRV9ISTsKKworICAgICAgICAvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb24gLyBoaWdoIG9uLiAqLworICAgICAgICB9IGVsc2UgaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fc2UgPT0gMykKKyAgICAgICAgeworICAgICAgICAgICAgdGVybWluYXRpb24gPSBURVJNX1NFOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBFRVBST00gJ3Rlcm1pbmF0aW9uX3NlJyBmaWVsZCBjb250YWlucyBhIGJhZCB2YWx1ZS4KKyAgICAgICAgICAgICAqIFVzZSBhdXRvbWF0aWMgdGVybWluYXRpb24gaW5zdGVhZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdGVybWluYXRpb24gPSAwOworICAgICAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0VFUFJPTV9URVJNSU5BVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX2x2ZCA9PSAwKQorICAgIHsKKyAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiA9IHRlcm1pbmF0aW9uOyAvKiBhdXRvIHRlcm1pbmF0aW9uIGZvciBMVkQgKi8KKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIC8qIEVuYWJsZSBtYW51YWwgY29udHJvbCB3aXRoIGxvdyBvZmYgLyBoaWdoIG9mZi4gKi8KKyAgICAgICAgaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fbHZkID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPSB0ZXJtaW5hdGlvbjsKKworICAgICAgICAvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb2ZmIC8gaGlnaCBvbi4gKi8KKyAgICAgICAgfSBlbHNlIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX2x2ZCA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gdGVybWluYXRpb24gfCBURVJNX0xWRF9ISTsKKworICAgICAgICAvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb24gLyBoaWdoIG9uLiAqLworICAgICAgICB9IGVsc2UgaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fbHZkID09IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPQorICAgICAgICAgICAgICAgIHRlcm1pbmF0aW9uIHwgVEVSTV9MVkQ7CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIEVFUFJPTSAndGVybWluYXRpb25fbHZkJyBmaWVsZCBjb250YWlucyBhIGJhZCB2YWx1ZS4KKyAgICAgICAgICAgICAqIFVzZSBhdXRvbWF0aWMgdGVybWluYXRpb24gaW5zdGVhZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiA9IHRlcm1pbmF0aW9uOworICAgICAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0VFUFJPTV9URVJNSU5BVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB3YXJuX2NvZGU7Cit9CisKKy8qCisgKiBSZWFkIEVFUFJPTSBjb25maWd1cmF0aW9uIGludG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKgorICogUmV0dXJuIGEgY2hlY2tzdW0gYmFzZWQgb24gdGhlIEVFUFJPTSBjb25maWd1cmF0aW9uIHJlYWQuCisgKi8KK1NUQVRJQyB1c2hvcnQgX19pbml0CitBZHZHZXQzNTUwRUVQQ29uZmlnKEFkdlBvcnRBZGRyIGlvcF9iYXNlLCBBRFZFRVBfMzU1MF9DT05GSUcgKmNmZ19idWYpCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICB3dmFsLCBjaGtzdW07CisgICAgdXNob3J0ICAgICAgICAgICAgICAqd2J1ZjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGVlcF9hZGRyOworICAgIHVzaG9ydCAgICAgICAgICAgICAgKmNoYXJmaWVsZHM7CisKKyAgICBjaGFyZmllbGRzID0gKHVzaG9ydCAqKSAmQURWRUVQXzM1NTBfQ29uZmlnX0ZpZWxkX0lzQ2hhcjsKKyAgICB3YnVmID0gKHVzaG9ydCAqKSBjZmdfYnVmOworICAgIGNoa3N1bSA9IDA7CisKKyAgICBmb3IgKGVlcF9hZGRyID0gQURWX0VFUF9EVkNfQ0ZHX0JFR0lOOworICAgICAgICAgZWVwX2FkZHIgPCBBRFZfRUVQX0RWQ19DRkdfRU5EOworICAgICAgICAgZWVwX2FkZHIrKywgd2J1ZisrKQorICAgIHsKKyAgICAgICAgd3ZhbCA9IEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBlZXBfYWRkcik7CisgICAgICAgIGNoa3N1bSArPSB3dmFsOyAvKiBDaGVja3N1bSBpcyBjYWxjdWxhdGVkIGZyb20gd29yZCB2YWx1ZXMuICovCisgICAgICAgIGlmICgqY2hhcmZpZWxkcysrKSB7CisgICAgICAgICAgICAqd2J1ZiA9IGxlMTZfdG9fY3B1KHd2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKndidWYgPSB3dmFsOworICAgICAgICB9CisgICAgfQorICAgIC8qIFJlYWQgY2hlY2tzdW0gd29yZC4gKi8KKyAgICAqd2J1ZiA9IEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBlZXBfYWRkcik7CisgICAgd2J1ZisrOyBjaGFyZmllbGRzKys7CisKKyAgICAvKiBSZWFkIHJlc3Qgb2YgRUVQUk9NIG5vdCBjb3ZlcmVkIGJ5IHRoZSBjaGVja3N1bS4gKi8KKyAgICBmb3IgKGVlcF9hZGRyID0gQURWX0VFUF9EVkNfQ1RMX0JFR0lOOworICAgICAgICAgZWVwX2FkZHIgPCBBRFZfRUVQX01BWF9XT1JEX0FERFI7CisgICAgICAgICBlZXBfYWRkcisrLCB3YnVmKyspCisgICAgeworICAgICAgICAqd2J1ZiA9IEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBlZXBfYWRkcik7CisgICAgICAgIGlmICgqY2hhcmZpZWxkcysrKSB7CisgICAgICAgICAgICAqd2J1ZiA9IGxlMTZfdG9fY3B1KCp3YnVmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2hrc3VtOworfQorCisvKgorICogUmVhZCBFRVBST00gY29uZmlndXJhdGlvbiBpbnRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICoKKyAqIFJldHVybiBhIGNoZWNrc3VtIGJhc2VkIG9uIHRoZSBFRVBST00gY29uZmlndXJhdGlvbiByZWFkLgorICovCitTVEFUSUMgdXNob3J0IF9faW5pdAorQWR2R2V0MzhDMDgwMEVFUENvbmZpZyhBZHZQb3J0QWRkciBpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQURWRUVQXzM4QzA4MDBfQ09ORklHICpjZmdfYnVmKQoreworICAgIHVzaG9ydCAgICAgICAgICAgICAgd3ZhbCwgY2hrc3VtOworICAgIHVzaG9ydCAgICAgICAgICAgICAgKndidWY7CisgICAgaW50ICAgICAgICAgICAgICAgICBlZXBfYWRkcjsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICpjaGFyZmllbGRzOworCisgICAgY2hhcmZpZWxkcyA9ICh1c2hvcnQgKikgJkFEVkVFUF8zOEMwODAwX0NvbmZpZ19GaWVsZF9Jc0NoYXI7CisgICAgd2J1ZiA9ICh1c2hvcnQgKikgY2ZnX2J1ZjsKKyAgICBjaGtzdW0gPSAwOworCisgICAgZm9yIChlZXBfYWRkciA9IEFEVl9FRVBfRFZDX0NGR19CRUdJTjsKKyAgICAgICAgIGVlcF9hZGRyIDwgQURWX0VFUF9EVkNfQ0ZHX0VORDsKKyAgICAgICAgIGVlcF9hZGRyKyssIHdidWYrKykKKyAgICB7CisgICAgICAgIHd2YWwgPSBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgZWVwX2FkZHIpOworICAgICAgICBjaGtzdW0gKz0gd3ZhbDsgLyogQ2hlY2tzdW0gaXMgY2FsY3VsYXRlZCBmcm9tIHdvcmQgdmFsdWVzLiAqLworICAgICAgICBpZiAoKmNoYXJmaWVsZHMrKykgeworICAgICAgICAgICAgKndidWYgPSBsZTE2X3RvX2NwdSh3dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICp3YnVmID0gd3ZhbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBSZWFkIGNoZWNrc3VtIHdvcmQuICovCisgICAgKndidWYgPSBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgZWVwX2FkZHIpOworICAgIHdidWYrKzsgY2hhcmZpZWxkcysrOworCisgICAgLyogUmVhZCByZXN0IG9mIEVFUFJPTSBub3QgY292ZXJlZCBieSB0aGUgY2hlY2tzdW0uICovCisgICAgZm9yIChlZXBfYWRkciA9IEFEVl9FRVBfRFZDX0NUTF9CRUdJTjsKKyAgICAgICAgIGVlcF9hZGRyIDwgQURWX0VFUF9NQVhfV09SRF9BRERSOworICAgICAgICAgZWVwX2FkZHIrKywgd2J1ZisrKQorICAgIHsKKyAgICAgICAgKndidWYgPSBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgZWVwX2FkZHIpOworICAgICAgICBpZiAoKmNoYXJmaWVsZHMrKykgeworICAgICAgICAgICAgKndidWYgPSBsZTE2X3RvX2NwdSgqd2J1Zik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNoa3N1bTsKK30KKworLyoKKyAqIFJlYWQgRUVQUk9NIGNvbmZpZ3VyYXRpb24gaW50byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqCisgKiBSZXR1cm4gYSBjaGVja3N1bSBiYXNlZCBvbiB0aGUgRUVQUk9NIGNvbmZpZ3VyYXRpb24gcmVhZC4KKyAqLworU1RBVElDIHVzaG9ydCBfX2luaXQKK0FkdkdldDM4QzE2MDBFRVBDb25maWcoQWR2UG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgIEFEVkVFUF8zOEMxNjAwX0NPTkZJRyAqY2ZnX2J1ZikKK3sKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHd2YWwsIGNoa3N1bTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICp3YnVmOworICAgIGludCAgICAgICAgICAgICAgICAgZWVwX2FkZHI7CisgICAgdXNob3J0ICAgICAgICAgICAgICAqY2hhcmZpZWxkczsKKworICAgIGNoYXJmaWVsZHMgPSAodXNob3J0KikgJkFEVkVFUF8zOEMxNjAwX0NvbmZpZ19GaWVsZF9Jc0NoYXI7CisgICAgd2J1ZiA9ICh1c2hvcnQgKikgY2ZnX2J1ZjsKKyAgICBjaGtzdW0gPSAwOworCisgICAgZm9yIChlZXBfYWRkciA9IEFEVl9FRVBfRFZDX0NGR19CRUdJTjsKKyAgICAgICAgIGVlcF9hZGRyIDwgQURWX0VFUF9EVkNfQ0ZHX0VORDsKKyAgICAgICAgIGVlcF9hZGRyKyssIHdidWYrKykKKyAgICB7CisgICAgICAgIHd2YWwgPSBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgZWVwX2FkZHIpOworICAgICAgICBjaGtzdW0gKz0gd3ZhbDsgLyogQ2hlY2tzdW0gaXMgY2FsY3VsYXRlZCBmcm9tIHdvcmQgdmFsdWVzLiAqLworICAgICAgICBpZiAoKmNoYXJmaWVsZHMrKykgeworICAgICAgICAgICAgKndidWYgPSBsZTE2X3RvX2NwdSh3dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICp3YnVmID0gd3ZhbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBSZWFkIGNoZWNrc3VtIHdvcmQuICovCisgICAgKndidWYgPSBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgZWVwX2FkZHIpOworICAgIHdidWYrKzsgY2hhcmZpZWxkcysrOworCisgICAgLyogUmVhZCByZXN0IG9mIEVFUFJPTSBub3QgY292ZXJlZCBieSB0aGUgY2hlY2tzdW0uICovCisgICAgZm9yIChlZXBfYWRkciA9IEFEVl9FRVBfRFZDX0NUTF9CRUdJTjsKKyAgICAgICAgIGVlcF9hZGRyIDwgQURWX0VFUF9NQVhfV09SRF9BRERSOworICAgICAgICAgZWVwX2FkZHIrKywgd2J1ZisrKQorICAgIHsKKyAgICAgICAgKndidWYgPSBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgZWVwX2FkZHIpOworICAgICAgICBpZiAoKmNoYXJmaWVsZHMrKykgeworICAgICAgICAgICAgKndidWYgPSBsZTE2X3RvX2NwdSgqd2J1Zik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNoa3N1bTsKK30KKworLyoKKyAqIFJlYWQgdGhlIEVFUFJPTSBmcm9tIHNwZWNpZmllZCBsb2NhdGlvbgorICovCitTVEFUSUMgdXNob3J0IF9faW5pdAorQWR2UmVhZEVFUFdvcmQoQWR2UG9ydEFkZHIgaW9wX2Jhc2UsIGludCBlZXBfd29yZF9hZGRyKQoreworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwKKyAgICAgICAgQVNDX0VFUF9DTURfUkVBRCB8IGVlcF93b3JkX2FkZHIpOworICAgIEFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOworICAgIHJldHVybiBBZHZSZWFkV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0RBVEEpOworfQorCisvKgorICogV2FpdCBmb3IgRUVQUk9NIGNvbW1hbmQgdG8gY29tcGxldGUKKyAqLworU1RBVElDIHZvaWQgX19pbml0CitBZHZXYWl0RUVQQ21kKEFkdlBvcnRBZGRyIGlvcF9iYXNlKQoreworICAgIGludCBlZXBfZGVsYXlfbXM7CisKKyAgICBmb3IgKGVlcF9kZWxheV9tcyA9IDA7IGVlcF9kZWxheV9tcyA8IEFEVl9FRVBfREVMQVlfTVM7IGVlcF9kZWxheV9tcysrKQorICAgIHsKKyAgICAgICAgaWYgKEFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01EKSAmIEFTQ19FRVBfQ01EX0RPTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMSk7CisgICAgfQorICAgIGlmICgoQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQpICYgQVNDX0VFUF9DTURfRE9ORSkgPT0gMCkKKyAgICB7CisgICAgICAgIEFTQ19BU1NFUlQoMCk7CisgICAgfQorICAgIHJldHVybjsKK30KKworLyoKKyAqIFdyaXRlIHRoZSBFRVBST00gZnJvbSAnY2ZnX2J1ZicuCisgKi8KK3ZvaWQKK0FkdlNldDM1NTBFRVBDb25maWcoQWR2UG9ydEFkZHIgaW9wX2Jhc2UsIEFEVkVFUF8zNTUwX0NPTkZJRyAqY2ZnX2J1ZikKK3sKKyAgICB1c2hvcnQgKndidWY7CisgICAgdXNob3J0IGFkZHIsIGNoa3N1bTsKKyAgICB1c2hvcnQgKmNoYXJmaWVsZHM7CisKKyAgICB3YnVmID0gKHVzaG9ydCAqKSBjZmdfYnVmOworICAgIGNoYXJmaWVsZHMgPSAodXNob3J0ICopICZBRFZFRVBfMzU1MF9Db25maWdfRmllbGRfSXNDaGFyOworICAgIGNoa3N1bSA9IDA7CisKKyAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsIEFTQ19FRVBfQ01EX1dSSVRFX0FCTEUpOworICAgIEFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOworCisgICAgLyoKKyAgICAgKiBXcml0ZSBFRVBST00gZnJvbSB3b3JkIDAgdG8gd29yZCAyMC4KKyAgICAgKi8KKyAgICBmb3IgKGFkZHIgPSBBRFZfRUVQX0RWQ19DRkdfQkVHSU47CisgICAgICAgICBhZGRyIDwgQURWX0VFUF9EVkNfQ0ZHX0VORDsgYWRkcisrLCB3YnVmKyspCisgICAgeworICAgICAgICB1c2hvcnQgd29yZDsKKworICAgICAgICBpZiAoKmNoYXJmaWVsZHMrKykgeworICAgICAgICAgICAgd29yZCA9IGNwdV90b19sZTE2KCp3YnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdvcmQgPSAqd2J1ZjsKKyAgICAgICAgfQorICAgICAgICBjaGtzdW0gKz0gKndidWY7IC8qIENoZWNrc3VtIGlzIGNhbGN1bGF0ZWQgZnJvbSB3b3JkIHZhbHVlcy4gKi8KKyAgICAgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfREFUQSwgd29yZCk7CisgICAgICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwgQVNDX0VFUF9DTURfV1JJVEUgfCBhZGRyKTsKKyAgICAgICAgQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7CisgICAgICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoQURWX0VFUF9ERUxBWV9NUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBXcml0ZSBFRVBST00gY2hlY2tzdW0gYXQgd29yZCAyMS4KKyAgICAgKi8KKyAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9EQVRBLCBjaGtzdW0pOworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwgQVNDX0VFUF9DTURfV1JJVEUgfCBhZGRyKTsKKyAgICBBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKKyAgICB3YnVmKys7IGNoYXJmaWVsZHMrKzsKKworICAgIC8qCisgICAgICogV3JpdGUgRUVQUk9NIE9FTSBuYW1lIGF0IHdvcmRzIDIyIHRvIDI5LgorICAgICAqLworICAgIGZvciAoYWRkciA9IEFEVl9FRVBfRFZDX0NUTF9CRUdJTjsKKyAgICAgICAgIGFkZHIgPCBBRFZfRUVQX01BWF9XT1JEX0FERFI7IGFkZHIrKywgd2J1ZisrKQorICAgIHsKKyAgICAgICAgdXNob3J0IHdvcmQ7CisKKyAgICAgICAgaWYgKCpjaGFyZmllbGRzKyspIHsKKyAgICAgICAgICAgIHdvcmQgPSBjcHVfdG9fbGUxNigqd2J1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3b3JkID0gKndidWY7CisgICAgICAgIH0KKyAgICAgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfREFUQSwgd29yZCk7CisgICAgICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwgQVNDX0VFUF9DTURfV1JJVEUgfCBhZGRyKTsKKyAgICAgICAgQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7CisgICAgfQorICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwgQVNDX0VFUF9DTURfV1JJVEVfRElTQUJMRSk7CisgICAgQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7CisgICAgcmV0dXJuOworfQorCisvKgorICogV3JpdGUgdGhlIEVFUFJPTSBmcm9tICdjZmdfYnVmJy4KKyAqLwordm9pZAorQWR2U2V0MzhDMDgwMEVFUENvbmZpZyhBZHZQb3J0QWRkciBpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQURWRUVQXzM4QzA4MDBfQ09ORklHICpjZmdfYnVmKQoreworICAgIHVzaG9ydCAqd2J1ZjsKKyAgICB1c2hvcnQgKmNoYXJmaWVsZHM7CisgICAgdXNob3J0IGFkZHIsIGNoa3N1bTsKKworICAgIHdidWYgPSAodXNob3J0ICopIGNmZ19idWY7CisgICAgY2hhcmZpZWxkcyA9ICh1c2hvcnQgKikgJkFEVkVFUF8zOEMwODAwX0NvbmZpZ19GaWVsZF9Jc0NoYXI7CisgICAgY2hrc3VtID0gMDsKKworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwgQVNDX0VFUF9DTURfV1JJVEVfQUJMRSk7CisgICAgQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7CisKKyAgICAvKgorICAgICAqIFdyaXRlIEVFUFJPTSBmcm9tIHdvcmQgMCB0byB3b3JkIDIwLgorICAgICAqLworICAgIGZvciAoYWRkciA9IEFEVl9FRVBfRFZDX0NGR19CRUdJTjsKKyAgICAgICAgIGFkZHIgPCBBRFZfRUVQX0RWQ19DRkdfRU5EOyBhZGRyKyssIHdidWYrKykKKyAgICB7CisgICAgICAgIHVzaG9ydCB3b3JkOworCisgICAgICAgIGlmICgqY2hhcmZpZWxkcysrKSB7CisgICAgICAgICAgICB3b3JkID0gY3B1X3RvX2xlMTYoKndidWYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd29yZCA9ICp3YnVmOworICAgICAgICB9CisgICAgICAgIGNoa3N1bSArPSAqd2J1ZjsgLyogQ2hlY2tzdW0gaXMgY2FsY3VsYXRlZCBmcm9tIHdvcmQgdmFsdWVzLiAqLworICAgICAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9EQVRBLCB3b3JkKTsKKyAgICAgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELCBBU0NfRUVQX0NNRF9XUklURSB8IGFkZHIpOworICAgICAgICBBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKKyAgICAgICAgRHZjU2xlZXBNaWxsaVNlY29uZChBRFZfRUVQX0RFTEFZX01TKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdyaXRlIEVFUFJPTSBjaGVja3N1bSBhdCB3b3JkIDIxLgorICAgICAqLworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0RBVEEsIGNoa3N1bSk7CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELCBBU0NfRUVQX0NNRF9XUklURSB8IGFkZHIpOworICAgIEFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOworICAgIHdidWYrKzsgY2hhcmZpZWxkcysrOworCisgICAgLyoKKyAgICAgKiBXcml0ZSBFRVBST00gT0VNIG5hbWUgYXQgd29yZHMgMjIgdG8gMjkuCisgICAgICovCisgICAgZm9yIChhZGRyID0gQURWX0VFUF9EVkNfQ1RMX0JFR0lOOworICAgICAgICAgYWRkciA8IEFEVl9FRVBfTUFYX1dPUkRfQUREUjsgYWRkcisrLCB3YnVmKyspCisgICAgeworICAgICAgICB1c2hvcnQgd29yZDsKKworICAgICAgICBpZiAoKmNoYXJmaWVsZHMrKykgeworICAgICAgICAgICAgd29yZCA9IGNwdV90b19sZTE2KCp3YnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdvcmQgPSAqd2J1ZjsKKyAgICAgICAgfQorICAgICAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9EQVRBLCB3b3JkKTsKKyAgICAgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELCBBU0NfRUVQX0NNRF9XUklURSB8IGFkZHIpOworICAgICAgICBBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKKyAgICB9CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELCBBU0NfRUVQX0NNRF9XUklURV9ESVNBQkxFKTsKKyAgICBBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKKyAgICByZXR1cm47Cit9CisKKy8qCisgKiBXcml0ZSB0aGUgRUVQUk9NIGZyb20gJ2NmZ19idWYnLgorICovCit2b2lkCitBZHZTZXQzOEMxNjAwRUVQQ29uZmlnKEFkdlBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICBBRFZFRVBfMzhDMTYwMF9DT05GSUcgKmNmZ19idWYpCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICAqd2J1ZjsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICpjaGFyZmllbGRzOworICAgIHVzaG9ydCAgICAgICAgICAgICAgYWRkciwgY2hrc3VtOworCisgICAgd2J1ZiA9ICh1c2hvcnQgKikgY2ZnX2J1ZjsKKyAgICBjaGFyZmllbGRzID0gKHVzaG9ydCAqKSAmQURWRUVQXzM4QzE2MDBfQ29uZmlnX0ZpZWxkX0lzQ2hhcjsKKyAgICBjaGtzdW0gPSAwOworCisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELCBBU0NfRUVQX0NNRF9XUklURV9BQkxFKTsKKyAgICBBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKKworICAgIC8qCisgICAgICogV3JpdGUgRUVQUk9NIGZyb20gd29yZCAwIHRvIHdvcmQgMjAuCisgICAgICovCisgICAgZm9yIChhZGRyID0gQURWX0VFUF9EVkNfQ0ZHX0JFR0lOOworICAgICAgICAgYWRkciA8IEFEVl9FRVBfRFZDX0NGR19FTkQ7IGFkZHIrKywgd2J1ZisrKQorICAgIHsKKyAgICAgICAgdXNob3J0IHdvcmQ7CisKKyAgICAgICAgaWYgKCpjaGFyZmllbGRzKyspIHsKKyAgICAgICAgICAgIHdvcmQgPSBjcHVfdG9fbGUxNigqd2J1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3b3JkID0gKndidWY7CisgICAgICAgIH0KKyAgICAgICAgY2hrc3VtICs9ICp3YnVmOyAvKiBDaGVja3N1bSBpcyBjYWxjdWxhdGVkIGZyb20gd29yZCB2YWx1ZXMuICovCisgICAgICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0RBVEEsIHdvcmQpOworICAgICAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsIEFTQ19FRVBfQ01EX1dSSVRFIHwgYWRkcik7CisgICAgICAgIEFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOworICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKEFEVl9FRVBfREVMQVlfTVMpOworICAgIH0KKworICAgIC8qCisgICAgICogV3JpdGUgRUVQUk9NIGNoZWNrc3VtIGF0IHdvcmQgMjEuCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfREFUQSwgY2hrc3VtKTsKKyAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsIEFTQ19FRVBfQ01EX1dSSVRFIHwgYWRkcik7CisgICAgQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7CisgICAgd2J1ZisrOyBjaGFyZmllbGRzKys7CisKKyAgICAvKgorICAgICAqIFdyaXRlIEVFUFJPTSBPRU0gbmFtZSBhdCB3b3JkcyAyMiB0byAyOS4KKyAgICAgKi8KKyAgICBmb3IgKGFkZHIgPSBBRFZfRUVQX0RWQ19DVExfQkVHSU47CisgICAgICAgICBhZGRyIDwgQURWX0VFUF9NQVhfV09SRF9BRERSOyBhZGRyKyssIHdidWYrKykKKyAgICB7CisgICAgICAgIHVzaG9ydCB3b3JkOworCisgICAgICAgIGlmICgqY2hhcmZpZWxkcysrKSB7CisgICAgICAgICAgICB3b3JkID0gY3B1X3RvX2xlMTYoKndidWYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd29yZCA9ICp3YnVmOworICAgICAgICB9CisgICAgICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0RBVEEsIHdvcmQpOworICAgICAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsIEFTQ19FRVBfQ01EX1dSSVRFIHwgYWRkcik7CisgICAgICAgIEFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOworICAgIH0KKyAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsIEFTQ19FRVBfQ01EX1dSSVRFX0RJU0FCTEUpOworICAgIEFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOworICAgIHJldHVybjsKK30KKworLyogYV9hZHZsaWIuYyAqLworLyoKKyAqIEFkdkV4ZVNjc2lRdWV1ZSgpIC0gU2VuZCBhIHJlcXVlc3QgdG8gdGhlIFJJU0MgbWljcm9jb2RlIHByb2dyYW0uCisgKgorICogICBBbGxvY2F0ZSBhIGNhcnJpZXIgc3RydWN0dXJlLCBwb2ludCB0aGUgY2FycmllciB0byB0aGUgQURWX1NDU0lfUkVRX1EsCisgKiAgIGFkZCB0aGUgY2FycmllciB0byB0aGUgSUNRIChJbml0aWF0b3IgQ29tbWFuZCBRdWV1ZSksIGFuZCB0aWNrbGUgdGhlCisgKiAgIFJJU0MgdG8gbm90aWZ5IGl0IGEgbmV3IGNvbW1hbmQgaXMgcmVhZHkgdG8gYmUgZXhlY3V0ZWQuCisgKgorICogSWYgJ2RvbmVfc3RhdHVzJyBpcyBub3Qgc2V0IHRvIFFEX0RPX1JFVFJZLCB0aGVuICdlcnJvcl9yZXRyeScgd2lsbCBiZQorICogc2V0IHRvIFNDU0lfTUFYX1JFVFJZLgorICoKKyAqIE11bHRpLWJ5dGUgZmllbGRzIGluIHRoZSBBU0NfU0NTSV9SRVFfUSB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBtaWNyb2NvZGUKKyAqIGZvciBETUEgYWRkcmVzc2VzIG9yIG1hdGggb3BlcmF0aW9ucyBhcmUgYnl0ZSBzd2FwcGVkIHRvIGxpdHRsZS1lbmRpYW4KKyAqIG9yZGVyLgorICoKKyAqIFJldHVybjoKKyAqICAgICAgQURWX1NVQ0NFU1MoMSkgLSBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHF1ZXVlZC4KKyAqICAgICAgQURWX0JVU1koMCkgLSAgICBSZXNvdXJjZSB1bmF2YWlsYWJsZTsgUmV0cnkgYWdhaW4gYWZ0ZXIgcGVuZGluZworICogICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgY29tcGxldGVzLgorICogICAgICBBRFZfRVJST1IoLTEpIC0gIEludmFsaWQgQURWX1NDU0lfUkVRX1EgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICAgICAgICAgICBob3N0IElDIGVycm9yLgorICovCitTVEFUSUMgaW50CitBZHZFeGVTY3NpUXVldWUoQURWX0RWQ19WQVIgKmFzY19kdmMsCisgICAgICAgICAgICAgICAgQURWX1NDU0lfUkVRX1EgKnNjc2lxKQoreworICAgIHVsb25nICAgICAgICAgICAgICAgICAgbGFzdF9pbnRfbGV2ZWw7CisgICAgQWR2UG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKKyAgICBBRFZfRENOVCAgICAgICAgICAgICAgIHJlcV9zaXplOworICAgIEFEVl9QQUREUiAgICAgICAgICAgICAgcmVxX3BhZGRyOworICAgIEFEVl9DQVJSX1QgICAgICAgICAgICAgKm5ld19jYXJycDsKKworICAgIEFTQ19BU1NFUlQoc2NzaXEgIT0gTlVMTCk7IC8qICdzY3NpcScgc2hvdWxkIG5ldmVyIGJlIE5VTEwuICovCisKKyAgICAvKgorICAgICAqIFRoZSBBRFZfU0NTSV9SRVFfUSAndGFyZ2V0X2lkJyBmaWVsZCBzaG91bGQgbmV2ZXIgZXhjZWVkIEFEVl9NQVhfVElELgorICAgICAqLworICAgIGlmIChzY3NpcS0+dGFyZ2V0X2lkID4gQURWX01BWF9USUQpCisgICAgeworICAgICAgICBzY3NpcS0+aG9zdF9zdGF0dXMgPSBRSFNUQV9NX0lOVkFMSURfREVWSUNFOworICAgICAgICBzY3NpcS0+ZG9uZV9zdGF0dXMgPSBRRF9XSVRIX0VSUk9SOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisKKyAgICBsYXN0X2ludF9sZXZlbCA9IER2Y0VudGVyQ3JpdGljYWwoKTsKKworICAgIC8qCisgICAgICogQWxsb2NhdGUgYSBjYXJyaWVyIGVuc3VyaW5nIGF0IGxlYXN0IG9uZSBjYXJyaWVyIGFsd2F5cworICAgICAqIHJlbWFpbnMgb24gdGhlIGZyZWVsaXN0IGFuZCBpbml0aWFsaXplIGZpZWxkcy4KKyAgICAgKi8KKyAgICBpZiAoKG5ld19jYXJycCA9IGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpID09IE5VTEwpCisgICAgeworICAgICAgIER2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOworICAgICAgIHJldHVybiBBRFZfQlVTWTsKKyAgICB9CisgICAgYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IChBRFZfQ0FSUl9UICopCisgICAgICAgIEFEVl9VMzJfVE9fVkFERFIobGUzMl90b19jcHUobmV3X2NhcnJwLT5uZXh0X3ZwYSkpOworICAgIGFzY19kdmMtPmNhcnJfcGVuZGluZ19jbnQrKzsKKworICAgIC8qCisgICAgICogU2V0IHRoZSBjYXJyaWVyIHRvIGJlIGEgc3RvcHBlciBieSBzZXR0aW5nICduZXh0X3ZwYScKKyAgICAgKiB0byB0aGUgc3RvcHBlciB2YWx1ZS4gVGhlIGN1cnJlbnQgc3RvcHBlciB3aWxsIGJlIGNoYW5nZWQKKyAgICAgKiBiZWxvdyB0byBwb2ludCB0byB0aGUgbmV3IHN0b3BwZXIuCisgICAgICovCisgICAgbmV3X2NhcnJwLT5uZXh0X3ZwYSA9IGNwdV90b19sZTMyKEFTQ19DUV9TVE9QUEVSKTsKKworICAgIC8qCisgICAgICogQ2xlYXIgdGhlIEFEVl9TQ1NJX1JFUV9RIGRvbmUgZmxhZy4KKyAgICAgKi8KKyAgICBzY3NpcS0+YV9mbGFnICY9IH5BRFZfU0NTSVFfRE9ORTsKKworICAgIHJlcV9zaXplID0gc2l6ZW9mKEFEVl9TQ1NJX1JFUV9RKTsKKyAgICByZXFfcGFkZHIgPSBEdmNHZXRQaHlBZGRyKGFzY19kdmMsIHNjc2lxLCAodWNoYXIgKikgc2NzaXEsCisgICAgICAgIChBRFZfU0RDTlQgKikgJnJlcV9zaXplLCBBRFZfSVNfU0NTSVFfRkxBRyk7CisKKyAgICBBU0NfQVNTRVJUKEFEVl8zMkJBTElHTihyZXFfcGFkZHIpID09IHJlcV9wYWRkcik7CisgICAgQVNDX0FTU0VSVChyZXFfc2l6ZSA+PSBzaXplb2YoQURWX1NDU0lfUkVRX1EpKTsKKworICAgIC8qIFdhaXQgZm9yIGFzc2VydGlvbiBiZWZvcmUgbWFraW5nIGxpdHRsZS1lbmRpYW4gKi8KKyAgICByZXFfcGFkZHIgPSBjcHVfdG9fbGUzMihyZXFfcGFkZHIpOworCisgICAgLyogU2F2ZSB2aXJ0dWFsIGFuZCBwaHlzaWNhbCBhZGRyZXNzIG9mIEFEVl9TQ1NJX1JFUV9RIGFuZCBjYXJyaWVyLiAqLworICAgIHNjc2lxLT5zY3NpcV9wdHIgPSBjcHVfdG9fbGUzMihBRFZfVkFERFJfVE9fVTMyKHNjc2lxKSk7CisgICAgc2NzaXEtPnNjc2lxX3JwdHIgPSByZXFfcGFkZHI7CisKKyAgICBzY3NpcS0+Y2Fycl92YSA9IGNwdV90b19sZTMyKEFEVl9WQUREUl9UT19VMzIoYXNjX2R2Yy0+aWNxX3NwKSk7CisgICAgLyoKKyAgICAgKiBFdmVyeSBBRFZfQ0FSUl9ULmNhcnJfcGEgaXMgYnl0ZSBzd2FwcGVkIHRvIGxpdHRsZS1lbmRpYW4KKyAgICAgKiBvcmRlciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgICAgICovCisgICAgc2NzaXEtPmNhcnJfcGEgPSBhc2NfZHZjLT5pY3Ffc3AtPmNhcnJfcGE7CisKKyAgIC8qCisgICAgKiBVc2UgdGhlIGN1cnJlbnQgc3RvcHBlciB0byBzZW5kIHRoZSBBRFZfU0NTSV9SRVFfUSBjb21tYW5kIHRvCisgICAgKiB0aGUgbWljcm9jb2RlLiBUaGUgbmV3bHkgYWxsb2NhdGVkIHN0b3BwZXIgd2lsbCBiZWNvbWUgdGhlIG5ldworICAgICogc3RvcHBlci4KKyAgICAqLworICAgIGFzY19kdmMtPmljcV9zcC0+YXJlcV92cGEgPSByZXFfcGFkZHI7CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgJ25leHRfdnBhJyBwb2ludGVyIGZvciB0aGUgb2xkIHN0b3BwZXIgdG8gYmUgdGhlCisgICAgICogcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbmV3IHN0b3BwZXIuIFRoZSBSSVNDIGNhbiBvbmx5CisgICAgICogZm9sbG93IHBoeXNpY2FsIGFkZHJlc3Nlcy4KKyAgICAgKi8KKyAgICBhc2NfZHZjLT5pY3Ffc3AtPm5leHRfdnBhID0gbmV3X2NhcnJwLT5jYXJyX3BhOworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGhvc3QgYWRhcHRlciBzdG9wcGVyIHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlIG5ldyBjYXJyaWVyLgorICAgICAqLworICAgIGFzY19kdmMtPmljcV9zcCA9IG5ld19jYXJycDsKKworICAgIGlmIChhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCB8fAorICAgICAgICBhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRpY2tsZSB0aGUgUklTQyB0byB0ZWxsIGl0IHRvIHJlYWQgaXRzIENvbW1hbmQgUXVldWUgSGVhZCBwb2ludGVyLgorICAgICAgICAgKi8KKyAgICAgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfVElDS0xFLCBBRFZfVElDS0xFX0EpOworICAgICAgICBpZiAoYXNjX2R2Yy0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDbGVhciB0aGUgdGlja2xlIHZhbHVlLiBJbiB0aGUgQVNDLTM1NTAgdGhlIFJJU0MgZmxhZworICAgICAgICAgICAgICogY29tbWFuZCAnY2xyX3RpY2tsZV9hJyBkb2VzIG5vdCB3b3JrIHVubGVzcyB0aGUgaG9zdAorICAgICAgICAgICAgICogdmFsdWUgaXMgY2xlYXJlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfVElDS0xFLCBBRFZfVElDS0xFX05PUCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMxNjAwKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTm90aWZ5IHRoZSBSSVNDIGEgY2FycmllciBpcyByZWFkeSBieSB3cml0aW5nIHRoZSBwaHlzaWNhbAorICAgICAgICAgKiBhZGRyZXNzIG9mIHRoZSBuZXcgY2FycmllciBzdG9wcGVyIHRvIHRoZSBDT01NQSByZWdpc3Rlci4KKyAgICAgICAgICovCisgICAgICAgIEFkdldyaXRlRFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QRFdfQ09NTUEsCisgICAgICAgICAgICAgICAgbGUzMl90b19jcHUobmV3X2NhcnJwLT5jYXJyX3BhKSk7CisgICAgfQorCisgICAgRHZjTGVhdmVDcml0aWNhbChsYXN0X2ludF9sZXZlbCk7CisKKyAgICByZXR1cm4gQURWX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBSZXNldCBTQ1NJIEJ1cyBhbmQgcHVyZ2UgYWxsIG91dHN0YW5kaW5nIHJlcXVlc3RzLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgICAgQURWX1RSVUUoMSkgLSAgIEFsbCByZXF1ZXN0cyBhcmUgcHVyZ2VkIGFuZCBTQ1NJIEJ1cyBpcyByZXNldC4KKyAqICAgICAgQURWX0ZBTFNFKDApIC0gIE1pY3JvY29kZSBjb21tYW5kIGZhaWxlZC4KKyAqICAgICAgQURWX0VSUk9SKC0xKSAtIE1pY3JvY29kZSBjb21tYW5kIHRpbWVkLW91dC4gTWljcm9jb2RlIG9yIElDCisgKiAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgaHVuZyB3aGljaCByZXF1aXJlcyBkcml2ZXIgcmVjb3ZlcnkuCisgKi8KK1NUQVRJQyBpbnQKK0FkdlJlc2V0U0IoQURWX0RWQ19WQVIgKmFzY19kdmMpCit7CisgICAgaW50ICAgICAgICAgc3RhdHVzOworCisgICAgLyoKKyAgICAgKiBTZW5kIHRoZSBTQ1NJIEJ1cyBSZXNldCBpZGxlIHN0YXJ0IGlkbGUgY29tbWFuZCB3aGljaCBhc3NlcnRzCisgICAgICogdGhlIFNDU0kgQnVzIFJlc2V0IHNpZ25hbC4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBBZHZTZW5kSWRsZUNtZChhc2NfZHZjLCAodXNob3J0KSBJRExFX0NNRF9TQ1NJX1JFU0VUX1NUQVJULCAwTCk7CisgICAgaWYgKHN0YXR1cyAhPSBBRFZfVFJVRSkKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEZWxheSBmb3IgdGhlIHNwZWNpZmllZCBTQ1NJIEJ1cyBSZXNldCBob2xkIHRpbWUuCisgICAgICoKKyAgICAgKiBUaGUgaG9sZCB0aW1lIGRlbGF5IGlzIGRvbmUgb24gdGhlIGhvc3QgYmVjYXVzZSB0aGUgUklTQyBoYXMgbm8KKyAgICAgKiBtaWNyb3NlY29uZCBhY2N1cmF0ZSB0aW1lci4KKyAgICAgKi8KKyAgICBEdmNEZWxheU1pY3JvU2Vjb25kKGFzY19kdmMsICh1c2hvcnQpIEFTQ19TQ1NJX1JFU0VUX0hPTERfVElNRV9VUyk7CisKKyAgICAvKgorICAgICAqIFNlbmQgdGhlIFNDU0kgQnVzIFJlc2V0IGVuZCBpZGxlIGNvbW1hbmQgd2hpY2ggZGUtYXNzZXJ0cworICAgICAqIHRoZSBTQ1NJIEJ1cyBSZXNldCBzaWduYWwgYW5kIHB1cmdlcyBhbnkgcGVuZGluZyByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBBZHZTZW5kSWRsZUNtZChhc2NfZHZjLCAodXNob3J0KSBJRExFX0NNRF9TQ1NJX1JFU0VUX0VORCwgMEwpOworICAgIGlmIChzdGF0dXMgIT0gQURWX1RSVUUpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoKEFEVl9EQ05UKSBhc2NfZHZjLT5zY3NpX3Jlc2V0X3dhaXQgKiAxMDAwKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBSZXNldCBjaGlwIGFuZCBTQ1NJIEJ1cy4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAgIEFEVl9UUlVFKDEpIC0gICBDaGlwIHJlLWluaXRpYWxpemF0aW9uIGFuZCBTQ1NJIEJ1cyBSZXNldCBzdWNjZXNzZnVsLgorICogICAgICBBRFZfRkFMU0UoMCkgLSAgQ2hpcCByZS1pbml0aWFsaXphdGlvbiBhbmQgU0NTSSBCdXMgUmVzZXQgZmFpbHVyZS4KKyAqLworU1RBVElDIGludAorQWR2UmVzZXRDaGlwQW5kU0IoQURWX0RWQ19WQVIgKmFzY19kdmMpCit7CisgICAgaW50ICAgICAgICAgc3RhdHVzOworICAgIHVzaG9ydCAgICAgIHdkdHJfYWJsZSwgc2R0cl9hYmxlLCB0YWdxbmdfYWJsZTsKKyAgICB1c2hvcnQgICAgICBwcHJfYWJsZSA9IDA7CisgICAgdWNoYXIgICAgICAgdGlkLCBtYXhfY21kW0FEVl9NQVhfVElEICsgMV07CisgICAgQWR2UG9ydEFkZHIgaW9wX2Jhc2U7CisgICAgdXNob3J0ICAgICAgYmlvc19zaWc7CisKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCisgICAgLyoKKyAgICAgKiBTYXZlIGN1cnJlbnQgcGVyIFRJRCBuZWdvdGlhdGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIHdkdHJfYWJsZSk7CisgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLCBzZHRyX2FibGUpOworICAgIGlmIChhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMTYwMCkKKyAgICB7CisgICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1BQUl9BQkxFLCBwcHJfYWJsZSk7CisgICAgfQorICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7CisgICAgZm9yICh0aWQgPSAwOyB0aWQgPD0gQURWX01BWF9USUQ7IHRpZCsrKQorICAgIHsKKyAgICAgICAgQWR2UmVhZEJ5dGVMcmFtKGlvcF9iYXNlLCBBU0NfTUNfTlVNQkVSX09GX01BWF9DTUQgKyB0aWQsCisgICAgICAgICAgICBtYXhfY21kW3RpZF0pOworICAgIH0KKworICAgIC8qCisgICAgICogRm9yY2UgdGhlIEFkdkluaXRBc2MzNTUwLzM4QzA4MDBEcml2ZXIoKSBmdW5jdGlvbiB0bworICAgICAqIHBlcmZvcm0gYSBTQ1NJIEJ1cyBSZXNldCBieSBjbGVhcmluZyB0aGUgQklPUyBzaWduYXR1cmUgd29yZC4KKyAgICAgKiBUaGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIGFzc3VtZXMgYSBTQ1NJIEJ1cyBSZXNldCBpcyBub3QKKyAgICAgKiBuZWVkZWQgaWYgdGhlIEJJT1Mgc2lnbmF0dXJlIHdvcmQgaXMgcHJlc2VudC4KKyAgICAgKi8KKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19CSU9TX1NJR05BVFVSRSwgYmlvc19zaWcpOworICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19CSU9TX1NJR05BVFVSRSwgMCk7CisKKyAgICAvKgorICAgICAqIFN0b3AgY2hpcCBhbmQgcmVzZXQgaXQuCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUklTQ19DU1IsIEFEVl9SSVNDX0NTUl9TVE9QKTsKKyAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19DVFJMX1JFRywgQURWX0NUUkxfUkVHX0NNRF9SRVNFVCk7CisgICAgRHZjU2xlZXBNaWxsaVNlY29uZCgxMDApOworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0NUUkxfUkVHLCBBRFZfQ1RSTF9SRUdfQ01EX1dSX0lPX1JFRyk7CisKKyAgICAvKgorICAgICAqIFJlc2V0IEFkdiBMaWJyYXJ5IGVycm9yIGNvZGUsIGlmIGFueSwgYW5kIHRyeQorICAgICAqIHJlLWluaXRpYWxpemluZyB0aGUgY2hpcC4KKyAgICAgKi8KKyAgICBhc2NfZHZjLT5lcnJfY29kZSA9IDA7CisgICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMxNjAwKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQWR2SW5pdEFzYzM4QzE2MDBEcml2ZXIoYXNjX2R2Yyk7CisgICAgfQorICAgIGVsc2UgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMwODAwKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQWR2SW5pdEFzYzM4QzA4MDBEcml2ZXIoYXNjX2R2Yyk7CisgICAgfSBlbHNlCisgICAgeworICAgICAgICBzdGF0dXMgPSBBZHZJbml0QXNjMzU1MERyaXZlcihhc2NfZHZjKTsKKyAgICB9CisKKyAgICAvKiBUcmFuc2xhdGUgaW5pdGlhbGl6YXRpb24gcmV0dXJuIHZhbHVlIHRvIHN0YXR1cyB2YWx1ZS4gKi8KKyAgICBpZiAoc3RhdHVzID09IDApCisgICAgeworICAgICAgICBzdGF0dXMgPSBBRFZfVFJVRTsKKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEFEVl9GQUxTRTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlc3RvcmUgdGhlIEJJT1Mgc2lnbmF0dXJlIHdvcmQuCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0JJT1NfU0lHTkFUVVJFLCBiaW9zX3NpZyk7CisKKyAgICAvKgorICAgICAqIFJlc3RvcmUgcGVyIFRJRCBuZWdvdGlhdGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfV0RUUl9BQkxFLCB3ZHRyX2FibGUpOworICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIHNkdHJfYWJsZSk7CisgICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMxNjAwKQorICAgIHsKKyAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1BQUl9BQkxFLCBwcHJfYWJsZSk7CisgICAgfQorICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19UQUdRTkdfQUJMRSwgdGFncW5nX2FibGUpOworICAgIGZvciAodGlkID0gMDsgdGlkIDw9IEFEVl9NQVhfVElEOyB0aWQrKykKKyAgICB7CisgICAgICAgIEFkdldyaXRlQnl0ZUxyYW0oaW9wX2Jhc2UsIEFTQ19NQ19OVU1CRVJfT0ZfTUFYX0NNRCArIHRpZCwKKyAgICAgICAgICAgIG1heF9jbWRbdGlkXSk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEFkdiBMaWJyYXJ5IEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUKKyAqCisgKiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYSBkcml2ZXIncyBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLgorICogIFRoZSBmdW5jdGlvbiBkaXNhYmxlcyBhbmQgcmUtZW5hYmxlcyBpbnRlcnJ1cHRzLgorICoKKyAqICBXaGVuIGEgbWljcm9jb2RlIGlkbGUgY29tbWFuZCBpcyBjb21wbGV0ZWQsIHRoZSBBRFZfRFZDX1ZBUgorICogICdpZGxlX2NtZF9kb25lJyBmaWVsZCBpcyBzZXQgdG8gQURWX1RSVUUuCisgKgorICogIE5vdGU6IEFkdklTUigpIGNhbiBiZSBjYWxsZWQgd2hlbiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBvciBldmVuCisgKiAgd2hlbiB0aGVyZSBpcyBubyBoYXJkd2FyZSBpbnRlcnJ1cHQgY29uZGl0aW9uIHByZXNlbnQuIEl0IHdpbGwKKyAqICBhbHdheXMgY2hlY2sgZm9yIGNvbXBsZXRlZCBpZGxlIGNvbW1hbmRzIGFuZCBtaWNyb2NvZGUgcmVxdWVzdHMuCisgKiAgVGhpcyBpcyBhbiBpbXBvcnRhbnQgZmVhdHVyZSB0aGF0IHNob3VsZG4ndCBiZSBjaGFuZ2VkIGJlY2F1c2UgaXQKKyAqICBhbGxvd3MgY29tbWFuZHMgdG8gYmUgY29tcGxldGVkIGZyb20gcG9sbGluZyBtb2RlIGxvb3BzLgorICoKKyAqIFJldHVybjoKKyAqICAgQURWX1RSVUUoMSkgLSBpbnRlcnJ1cHQgd2FzIHBlbmRpbmcKKyAqICAgQURWX0ZBTFNFKDApIC0gbm8gaW50ZXJydXB0IHdhcyBwZW5kaW5nCisgKi8KK1NUQVRJQyBpbnQKK0FkdklTUihBRFZfRFZDX1ZBUiAqYXNjX2R2YykKK3sKKyAgICBBZHZQb3J0QWRkciAgICAgICAgICAgICAgICAgaW9wX2Jhc2U7CisgICAgdWNoYXIgICAgICAgICAgICAgICAgICAgICAgIGludF9zdGF0OworICAgIHVzaG9ydCAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfYml0OworICAgIEFEVl9DQVJSX1QgICAgICAgICAgICAgICAgICAqZnJlZV9jYXJycDsKKyAgICBBRFZfVkFERFIgICAgICAgICAgICAgICAgICAgaXJxX25leHRfdnBhOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKKyAgICBBRFZfU0NTSV9SRVFfUSAgICAgICAgICAgICAgKnNjc2lxOworCisgICAgZmxhZ3MgPSBEdmNFbnRlckNyaXRpY2FsKCk7CisKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCisgICAgLyogUmVhZGluZyB0aGUgcmVnaXN0ZXIgY2xlYXJzIHRoZSBpbnRlcnJ1cHQuICovCisgICAgaW50X3N0YXQgPSBBZHZSZWFkQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0lOVFJfU1RBVFVTX1JFRyk7CisKKyAgICBpZiAoKGludF9zdGF0ICYgKEFEVl9JTlRSX1NUQVRVU19JTlRSQSB8IEFEVl9JTlRSX1NUQVRVU19JTlRSQiB8CisgICAgICAgICBBRFZfSU5UUl9TVEFUVVNfSU5UUkMpKSA9PSAwKQorICAgIHsKKyAgICAgICAgRHZjTGVhdmVDcml0aWNhbChmbGFncyk7CisgICAgICAgIHJldHVybiBBRFZfRkFMU0U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOb3RpZnkgdGhlIGRyaXZlciBvZiBhbiBhc3luY2hyb25vdXMgbWljcm9jb2RlIGNvbmRpdGlvbiBieQorICAgICAqIGNhbGxpbmcgdGhlIEFEVl9EVkNfVkFSLmFzeW5jX2NhbGxiYWNrIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24KKyAgICAgKiBpcyBwYXNzZWQgdGhlIG1pY3JvY29kZSBBU0NfTUNfSU5UUkJfQ09ERSBieXRlIHZhbHVlLgorICAgICAqLworICAgIGlmIChpbnRfc3RhdCAmIEFEVl9JTlRSX1NUQVRVU19JTlRSQikKKyAgICB7CisgICAgICAgIHVjaGFyIGludHJiX2NvZGU7CisKKyAgICAgICAgQWR2UmVhZEJ5dGVMcmFtKGlvcF9iYXNlLCBBU0NfTUNfSU5UUkJfQ09ERSwgaW50cmJfY29kZSk7CisKKyAgICAgICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwIHx8CisgICAgICAgICAgICBhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGludHJiX2NvZGUgPT0gQURWX0FTWU5DX0NBUlJJRVJfUkVBRFlfRkFJTFVSRSAmJgorICAgICAgICAgICAgICAgIGFzY19kdmMtPmNhcnJfcGVuZGluZ19jbnQgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9USUNLTEUsIEFEVl9USUNLTEVfQSk7CisgICAgICAgICAgICAgICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfVElDS0xFLCBBRFZfVElDS0xFX05PUCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGFzY19kdmMtPmFzeW5jX2NhbGxiYWNrICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgICgqYXNjX2R2Yy0+YXN5bmNfY2FsbGJhY2spKGFzY19kdmMsIGludHJiX2NvZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgSVJRIHN0b3BwZXIgY2FycmllciBjb250YWlucyBhIGNvbXBsZXRlZCByZXF1ZXN0LgorICAgICAqLworICAgIHdoaWxlICgoKGlycV9uZXh0X3ZwYSA9CisgICAgICAgICAgICAgbGUzMl90b19jcHUoYXNjX2R2Yy0+aXJxX3NwLT5uZXh0X3ZwYSkpICYgQVNDX1JRX0RPTkUpICE9IDApCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBuZXdseSBjb21wbGV0ZWQgQURWX1NDU0lfUkVRX1Egc3RydWN0dXJlLgorICAgICAgICAgKiBUaGUgUklTQyB3aWxsIGhhdmUgc2V0ICdhcmVxX3ZwYScgdG8gYSB2aXJ0dWFsIGFkZHJlc3MuCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBmaXJtd2FyZSB3aWxsIGhhdmUgY29waWVkIHRoZSBBU0NfU0NTSV9SRVFfUS5zY3NpcV9wdHIKKyAgICAgICAgICogZmllbGQgdG8gdGhlIGNhcnJpZXIgQURWX0NBUlJfVC5hcmVxX3ZwYSBmaWVsZC4gVGhlIGNvbnZlcnNpb24KKyAgICAgICAgICogYmVsb3cgY29tcGxlbWVudHMgdGhlIGNvbnZlcnNpb24gb2YgQVNDX1NDU0lfUkVRX1Euc2NzaXFfcHRyJworICAgICAgICAgKiBpbiBBZHZFeGVTY3NpUXVldWUoKS4KKyAgICAgICAgICovCisgICAgICAgIHNjc2lxID0gKEFEVl9TQ1NJX1JFUV9RICopCisgICAgICAgICAgICBBRFZfVTMyX1RPX1ZBRERSKGxlMzJfdG9fY3B1KGFzY19kdmMtPmlycV9zcC0+YXJlcV92cGEpKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBSZXF1ZXN0IGZpbmlzaGVkIHdpdGggZ29vZCBzdGF0dXMgYW5kIHRoZSBxdWV1ZSB3YXMgbm90CisgICAgICAgICAqIERNQWVkIHRvIGhvc3QgbWVtb3J5IGJ5IHRoZSBmaXJtd2FyZS4gU2V0IGFsbCBzdGF0dXMgZmllbGRzCisgICAgICAgICAqIHRvIGluZGljYXRlIGdvb2Qgc3RhdHVzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChpcnFfbmV4dF92cGEgJiBBU0NfUlFfR09PRCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc2NzaXEtPmRvbmVfc3RhdHVzID0gUURfTk9fRVJST1I7CisgICAgICAgICAgICBzY3NpcS0+aG9zdF9zdGF0dXMgPSBzY3NpcS0+c2NzaV9zdGF0dXMgPSAwOworICAgICAgICAgICAgc2NzaXEtPmRhdGFfY250ID0gMEw7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBBZHZhbmNlIHRoZSBzdG9wcGVyIHBvaW50ZXIgdG8gdGhlIG5leHQgY2FycmllcgorICAgICAgICAgKiBpZ25vcmluZyB0aGUgbG93ZXIgZm91ciBiaXRzLiBGcmVlIHRoZSBwcmV2aW91cworICAgICAgICAgKiBzdG9wcGVyIGNhcnJpZXIuCisgICAgICAgICAqLworICAgICAgICBmcmVlX2NhcnJwID0gYXNjX2R2Yy0+aXJxX3NwOworICAgICAgICBhc2NfZHZjLT5pcnFfc3AgPSAoQURWX0NBUlJfVCAqKQorICAgICAgICAgICAgQURWX1UzMl9UT19WQUREUihBU0NfR0VUX0NBUlJQKGlycV9uZXh0X3ZwYSkpOworCisgICAgICAgIGZyZWVfY2FycnAtPm5leHRfdnBhID0KKyAgICAgICAgICAgICAgICBjcHVfdG9fbGUzMihBRFZfVkFERFJfVE9fVTMyKGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpKTsKKyAgICAgICAgYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IGZyZWVfY2FycnA7CisgICAgICAgIGFzY19kdmMtPmNhcnJfcGVuZGluZ19jbnQtLTsKKworICAgICAgICBBU0NfQVNTRVJUKHNjc2lxICE9IE5VTEwpOworICAgICAgICB0YXJnZXRfYml0ID0gQURWX1RJRF9UT19USURNQVNLKHNjc2lxLT50YXJnZXRfaWQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIENsZWFyIHJlcXVlc3QgbWljcm9jb2RlIGNvbnRyb2wgZmxhZy4KKyAgICAgICAgICovCisgICAgICAgIHNjc2lxLT5jbnRsID0gMDsKKworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgY29tbWFuZCB0aGF0IGNvbXBsZXRlZCB3YXMgYSBTQ1NJIElOUVVJUlkgYW5kCisgICAgICAgICAqIExVTiAwIHdhcyBzZW50IHRoZSBjb21tYW5kLCB0aGVuIHByb2Nlc3MgdGhlIElOUVVJUlkKKyAgICAgICAgICogY29tbWFuZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGRldmljZS4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZTogSWYgZGF0YSByZXR1cm5lZCB3ZXJlIGVpdGhlciBWUEQgb3IgQ21kRHQgZGF0YSwKKyAgICAgICAgICogZG9uJ3QgcHJvY2VzcyB0aGUgSU5RVUlSWSBjb21tYW5kIGluZm9ybWF0aW9uIGZvcgorICAgICAgICAgKiB0aGUgZGV2aWNlLCBvdGhlcndpc2UgbWF5IGVycm9uZW91c2x5IHNldCAqX2FibGUgYml0cy4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzY3NpcS0+ZG9uZV9zdGF0dXMgPT0gUURfTk9fRVJST1IgJiYKKyAgICAgICAgICAgIHNjc2lxLT5jZGJbMF0gPT0gSU5RVUlSWSAmJgorICAgICAgICAgICAgc2NzaXEtPnRhcmdldF9sdW4gPT0gMCAmJgorICAgICAgICAgICAgKHNjc2lxLT5jZGJbMV0gJiBBRFZfSU5RX1JUTl9WUERfQU5EX0NNRERUKQorICAgICAgICAgICAgICAgID09IEFEVl9JTlFfUlROX1NURF9JTlFVSVJZX0RBVEEpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFkdklucXVpcnlIYW5kbGluZyhhc2NfZHZjLCBzY3NpcSk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBOb3RpZnkgdGhlIGRyaXZlciBvZiB0aGUgY29tcGxldGVkIHJlcXVlc3QgYnkgcGFzc2luZworICAgICAgICAgKiB0aGUgQURWX1NDU0lfUkVRX1EgcG9pbnRlciB0byBpdHMgY2FsbGJhY2sgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBzY3NpcS0+YV9mbGFnIHw9IEFEVl9TQ1NJUV9ET05FOworICAgICAgICAoKmFzY19kdmMtPmlzcl9jYWxsYmFjaykoYXNjX2R2Yywgc2NzaXEpOworICAgICAgICAvKgorICAgICAgICAgKiBOb3RlOiBBZnRlciB0aGUgZHJpdmVyIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCwgJ3Njc2lxJworICAgICAgICAgKiBjYW4gbm8gbG9uZ2VyIGJlIHJlZmVyZW5jZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEZhbGwgdGhyb3VnaCBhbmQgY29udGludWUgcHJvY2Vzc2luZyBvdGhlciBjb21wbGV0ZWQKKyAgICAgICAgICogcmVxdWVzdHMuLi4KKyAgICAgICAgICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogRGlzYWJsZSBpbnRlcnJ1cHRzIGFnYWluIGluIGNhc2UgdGhlIGRyaXZlciBpbmFkdmVydGVudGx5CisgICAgICAgICAqIGVuYWJsZWQgaW50ZXJydXB0cyBpbiBpdHMgY2FsbGJhY2sgZnVuY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBEdmNFbnRlckNyaXRpY2FsKCkgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQsIGJlY2F1c2UKKyAgICAgICAgICogdGhlICdmbGFncycgc2F2ZWQgd2hlbiBBZHZJU1IoKSB3YXMgZmlyc3QgZW50ZXJlZCB3aWxsIGJlCisgICAgICAgICAqIHVzZWQgdG8gcmVzdG9yZSB0aGUgaW50ZXJydXB0IGZsYWcgb24gZXhpdC4KKyAgICAgICAgICovCisgICAgICAgICh2b2lkKSBEdmNFbnRlckNyaXRpY2FsKCk7CisgICAgfQorICAgIER2Y0xlYXZlQ3JpdGljYWwoZmxhZ3MpOworICAgIHJldHVybiBBRFZfVFJVRTsKK30KKworLyoKKyAqIFNlbmQgYW4gaWRsZSBjb21tYW5kIHRvIHRoZSBjaGlwIGFuZCB3YWl0IGZvciBjb21wbGV0aW9uLgorICoKKyAqIENvbW1hbmQgY29tcGxldGlvbiBpcyBwb2xsZWQgZm9yIG9uY2UgcGVyIG1pY3Jvc2Vjb25kLgorICoKKyAqIFRoZSBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGZyb20gYW55d2hlcmUgaW5jbHVkaW5nIGFuIGludGVycnVwdCBoYW5kbGVyLgorICogQnV0IHRoZSBmdW5jdGlvbiBpcyBub3QgcmUtZW50cmFudCwgc28gaXQgdXNlcyB0aGUgRHZjRW50ZXIvTGVhdmVDcml0aWNhbCgpCisgKiBmdW5jdGlvbnMgdG8gcHJldmVudCByZWVudHJhbmN5LgorICoKKyAqIFJldHVybiBWYWx1ZXM6CisgKiAgIEFEVl9UUlVFIC0gY29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisgKiAgIEFEVl9GQUxTRSAtIGNvbW1hbmQgZmFpbGVkCisgKiAgIEFEVl9FUlJPUiAtIGNvbW1hbmQgdGltZWQgb3V0CisgKi8KK1NUQVRJQyBpbnQKK0FkdlNlbmRJZGxlQ21kKEFEVl9EVkNfVkFSICphc2NfZHZjLAorICAgICAgICAgICAgICAgdXNob3J0IGlkbGVfY21kLAorICAgICAgICAgICAgICAgQURWX0RDTlQgaWRsZV9jbWRfcGFyYW1ldGVyKQoreworICAgIHVsb25nICAgICAgIGxhc3RfaW50X2xldmVsOworICAgIGludCAgICAgICAgIHJlc3VsdDsKKyAgICBBRFZfRENOVCAgICBpLCBqOworICAgIEFkdlBvcnRBZGRyIGlvcF9iYXNlOworCisgICAgbGFzdF9pbnRfbGV2ZWwgPSBEdmNFbnRlckNyaXRpY2FsKCk7CisKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCisgICAgLyoKKyAgICAgKiBDbGVhciB0aGUgaWRsZSBjb21tYW5kIHN0YXR1cyB3aGljaCBpcyBzZXQgYnkgdGhlIG1pY3JvY29kZQorICAgICAqIHRvIGEgbm9uLXplcm8gdmFsdWUgdG8gaW5kaWNhdGUgd2hlbiB0aGUgY29tbWFuZCBpcyBjb21wbGV0ZWQuCisgICAgICogVGhlIG5vbi16ZXJvIHJlc3VsdCBpcyBvbmUgb2YgdGhlIElETEVfQ01EX1NUQVRVU18qIHZhbHVlcworICAgICAqIGRlZmluZWQgaW4gYV9hZHZsaWIuaC4KKyAgICAgKi8KKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfSURMRV9DTURfU1RBVFVTLCAodXNob3J0KSAwKTsKKworICAgIC8qCisgICAgICogV3JpdGUgdGhlIGlkbGUgY29tbWFuZCB2YWx1ZSBhZnRlciB0aGUgaWRsZSBjb21tYW5kIHBhcmFtZXRlcgorICAgICAqIGhhcyBiZWVuIHdyaXR0ZW4gdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbi4gSWYgdGhlIG9yZGVyIGlzIG5vdAorICAgICAqIGZvbGxvd2VkLCB0aGUgbWljcm9jb2RlIG1heSBwcm9jZXNzIHRoZSBpZGxlIGNvbW1hbmQgYmVmb3JlIHRoZQorICAgICAqIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gTFJBTS4KKyAgICAgKi8KKyAgICBBZHZXcml0ZURXb3JkTHJhbU5vU3dhcChpb3BfYmFzZSwgQVNDX01DX0lETEVfQ01EX1BBUkFNRVRFUiwKKyAgICAgICAgY3B1X3RvX2xlMzIoaWRsZV9jbWRfcGFyYW1ldGVyKSk7CisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0lETEVfQ01ELCBpZGxlX2NtZCk7CisKKyAgICAvKgorICAgICAqIFRpY2tsZSB0aGUgUklTQyB0byB0ZWxsIGl0IHRvIHByb2Nlc3MgdGhlIGlkbGUgY29tbWFuZC4KKyAgICAgKi8KKyAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9USUNLTEUsIEFEVl9USUNLTEVfQik7CisgICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2xlYXIgdGhlIHRpY2tsZSB2YWx1ZS4gSW4gdGhlIEFTQy0zNTUwIHRoZSBSSVNDIGZsYWcKKyAgICAgICAgICogY29tbWFuZCAnY2xyX3RpY2tsZV9iJyBkb2VzIG5vdCB3b3JrIHVubGVzcyB0aGUgaG9zdAorICAgICAgICAgKiB2YWx1ZSBpcyBjbGVhcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfVElDS0xFLCBBRFZfVElDS0xFX05PUCk7CisgICAgfQorCisgICAgLyogV2FpdCBmb3IgdXAgdG8gMTAwIG1pbGxpc2Vjb25kIGZvciB0aGUgaWRsZSBjb21tYW5kIHRvIHRpbWVvdXQuICovCisgICAgZm9yIChpID0gMDsgaSA8IFNDU0lfV0FJVF8xMDBfTVNFQzsgaSsrKQorICAgIHsKKyAgICAgICAgLyogUG9sbCBvbmNlIGVhY2ggbWljcm9zZWNvbmQgZm9yIGNvbW1hbmQgY29tcGxldGlvbi4gKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IFNDU0lfVVNfUEVSX01TRUM7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfSURMRV9DTURfU1RBVFVTLCByZXN1bHQpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIER2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEdmNEZWxheU1pY3JvU2Vjb25kKGFzY19kdmMsICh1c2hvcnQpIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgQVNDX0FTU0VSVCgwKTsgLyogVGhlIGlkbGUgY29tbWFuZCBzaG91bGQgbmV2ZXIgdGltZW91dC4gKi8KKyAgICBEdmNMZWF2ZUNyaXRpY2FsKGxhc3RfaW50X2xldmVsKTsKKyAgICByZXR1cm4gQURWX0VSUk9SOworfQorCisvKgorICogSW5xdWlyeSBJbmZvcm1hdGlvbiBCeXRlIDcgSGFuZGxpbmcKKyAqCisgKiBIYW5kbGUgU0NTSSBJbnF1aXJ5IENvbW1hbmQgaW5mb3JtYXRpb24gZm9yIGEgZGV2aWNlIGJ5IHNldHRpbmcKKyAqIG1pY3JvY29kZSBvcGVyYXRpbmcgdmFyaWFibGVzIHRoYXQgYWZmZWN0IFdEVFIsIFNEVFIsIGFuZCBUYWcKKyAqIFF1ZXVpbmcuCisgKi8KK1NUQVRJQyB2b2lkCitBZHZJbnF1aXJ5SGFuZGxpbmcoCisgICAgQURWX0RWQ19WQVIgICAgICAgICAgICAgICAgICphc2NfZHZjLAorICAgIEFEVl9TQ1NJX1JFUV9RICAgICAgICAgICAgICAqc2NzaXEpCit7CisgICAgQWR2UG9ydEFkZHIgICAgICAgICAgICAgICAgIGlvcF9iYXNlOworICAgIHVjaGFyICAgICAgICAgICAgICAgICAgICAgICB0aWQ7CisgICAgQURWX1NDU0lfSU5RVUlSWSAgICAgICAgICAgICppbnE7CisgICAgdXNob3J0ICAgICAgICAgICAgICAgICAgICAgIHRpZG1hc2s7CisgICAgdXNob3J0ICAgICAgICAgICAgICAgICAgICAgIGNmZ193b3JkOworCisgICAgLyoKKyAgICAgKiBBZHZJbnF1aXJ5SGFuZGxpbmcoKSByZXF1aXJlcyB1cCB0byBJTlFVSVJZIGluZm9ybWF0aW9uIEJ5dGUgNworICAgICAqIHRvIGJlIGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIElmIGxlc3MgdGhhbiA4IGJ5dGVzIG9mIElOUVVJUlkgaW5mb3JtYXRpb24gd2VyZSByZXF1ZXN0ZWQgb3IgbGVzcworICAgICAqIHRoYW4gOCBieXRlcyB3ZXJlIHRyYW5zZmVycmVkLCB0aGVuIHJldHVybi4gY2RiWzRdIGlzIHRoZSByZXF1ZXN0CisgICAgICogbGVuZ3RoIGFuZCB0aGUgQURWX1NDU0lfUkVRX1EgJ2RhdGFfY250JyBmaWVsZCBpcyBzZXQgYnkgdGhlCisgICAgICogbWljcm9jb2RlIHRvIHRoZSB0cmFuc2ZlciByZXNpZHVhbCBjb3VudC4KKyAgICAgKi8KKworICAgIGlmIChzY3NpcS0+Y2RiWzRdIDwgOCB8fAorICAgICAgICAoc2NzaXEtPmNkYls0XSAtIGxlMzJfdG9fY3B1KHNjc2lxLT5kYXRhX2NudCkpIDwgOCkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworICAgIHRpZCA9IHNjc2lxLT50YXJnZXRfaWQ7CisKKyAgICBpbnEgPSAoQURWX1NDU0lfSU5RVUlSWSAqKSBzY3NpcS0+dmRhdGFfYWRkcjsKKworICAgIC8qCisgICAgICogV0RUUiwgU0RUUiwgYW5kIFRhZyBRdWV1aW5nIGNhbm5vdCBiZSBlbmFibGVkIGZvciBvbGQgZGV2aWNlcy4KKyAgICAgKi8KKyAgICBpZiAoQURWX0lOUV9SRVNQT05TRV9GTVQoaW5xKSA8IDIgJiYgQURWX0lOUV9BTlNJX1ZFUihpbnEpIDwgMikKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIElOUVVJUlkgQnl0ZSA3IEhhbmRsaW5nCisgICAgICAgICAqCisgICAgICAgICAqIFVzZSBhIGRldmljZSdzIElOUVVJUlkgYnl0ZSA3IHRvIGRldGVybWluZSB3aGV0aGVyIGl0CisgICAgICAgICAqIHN1cHBvcnRzIFdEVFIsIFNEVFIsIGFuZCBUYWcgUXVldWluZy4gSWYgdGhlIGZlYXR1cmUKKyAgICAgICAgICogaXMgZW5hYmxlZCBpbiB0aGUgRUVQUk9NIGFuZCB0aGUgZGV2aWNlIHN1cHBvcnRzIHRoZQorICAgICAgICAgKiBmZWF0dXJlLCB0aGVuIGVuYWJsZSBpdCBpbiB0aGUgbWljcm9jb2RlLgorICAgICAgICAgKi8KKworICAgICAgICB0aWRtYXNrID0gQURWX1RJRF9UT19USURNQVNLKHRpZCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2lkZSBUcmFuc2ZlcnMKKyAgICAgICAgICoKKyAgICAgICAgICogSWYgdGhlIEVFUFJPTSBlbmFibGVkIFdEVFIgZm9yIHRoZSBkZXZpY2UgYW5kIHRoZSBkZXZpY2UKKyAgICAgICAgICogc3VwcG9ydHMgd2lkZSBidXMgKDE2IGJpdCkgdHJhbnNmZXJzLCB0aGVuIHR1cm4gb24gdGhlCisgICAgICAgICAqIGRldmljZSdzICd3ZHRyX2FibGUnIGJpdCBhbmQgd3JpdGUgdGhlIG5ldyB2YWx1ZSB0byB0aGUKKyAgICAgICAgICogbWljcm9jb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChhc2NfZHZjLT53ZHRyX2FibGUgJiB0aWRtYXNrKSAmJiBBRFZfSU5RX1dJREUxNihpbnEpKQorICAgICAgICB7CisgICAgICAgICAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIGNmZ193b3JkKTsKKyAgICAgICAgICAgIGlmICgoY2ZnX3dvcmQgJiB0aWRtYXNrKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNmZ193b3JkIHw9IHRpZG1hc2s7CisgICAgICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfQUJMRSwgY2ZnX3dvcmQpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDbGVhciB0aGUgbWljcm9jb2RlICJTRFRSIG5lZ290aWF0aW9uIiBhbmQgIldEVFIKKyAgICAgICAgICAgICAgICAgKiBuZWdvdGlhdGlvbiIgZG9uZSBpbmRpY2F0b3JzIGZvciB0aGUgdGFyZ2V0IHRvIGNhdXNlCisgICAgICAgICAgICAgICAgICogaXQgdG8gbmVnb3RpYXRlIHdpdGggdGhlIG5ldyBzZXR0aW5nIHNldCBhYm92ZS4KKyAgICAgICAgICAgICAgICAgKiBXRFRSIHdoZW4gYWNjZXB0ZWQgY2F1c2VzIHRoZSB0YXJnZXQgdG8gZW50ZXIKKyAgICAgICAgICAgICAgICAgKiBhc3luY2hyb25vdXMgbW9kZSwgc28gU0RUUiBtdXN0IGJlIG5lZ290aWF0ZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9ET05FLCBjZmdfd29yZCk7CisgICAgICAgICAgICAgICAgY2ZnX3dvcmQgJj0gfnRpZG1hc2s7CisgICAgICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfRE9ORSwgY2ZnX3dvcmQpOworICAgICAgICAgICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfRE9ORSwgY2ZnX3dvcmQpOworICAgICAgICAgICAgICAgIGNmZ193b3JkICY9IH50aWRtYXNrOworICAgICAgICAgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0RPTkUsIGNmZ193b3JkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFN5bmNocm9ub3VzIFRyYW5zZmVycworICAgICAgICAgKgorICAgICAgICAgKiBJZiB0aGUgRUVQUk9NIGVuYWJsZWQgU0RUUiBmb3IgdGhlIGRldmljZSBhbmQgdGhlIGRldmljZQorICAgICAgICAgKiBzdXBwb3J0cyBzeW5jaHJvbm91cyB0cmFuc2ZlcnMsIHRoZW4gdHVybiBvbiB0aGUgZGV2aWNlJ3MKKyAgICAgICAgICogJ3NkdHJfYWJsZScgYml0LiBXcml0ZSB0aGUgbmV3IHZhbHVlIHRvIHRoZSBtaWNyb2NvZGUuCisgICAgICAgICAqLworICAgICAgICBpZiAoKGFzY19kdmMtPnNkdHJfYWJsZSAmIHRpZG1hc2spICYmIEFEVl9JTlFfU1lOQyhpbnEpKQorICAgICAgICB7CisgICAgICAgICAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIGNmZ193b3JkKTsKKyAgICAgICAgICAgIGlmICgoY2ZnX3dvcmQgJiB0aWRtYXNrKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNmZ193b3JkIHw9IHRpZG1hc2s7CisgICAgICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfQUJMRSwgY2ZnX3dvcmQpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDbGVhciB0aGUgbWljcm9jb2RlICJTRFRSIG5lZ290aWF0aW9uIiBkb25lIGluZGljYXRvcgorICAgICAgICAgICAgICAgICAqIGZvciB0aGUgdGFyZ2V0IHRvIGNhdXNlIGl0IHRvIG5lZ290aWF0ZSB3aXRoIHRoZSBuZXcKKyAgICAgICAgICAgICAgICAgKiBzZXR0aW5nIHNldCBhYm92ZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0RPTkUsIGNmZ193b3JkKTsKKyAgICAgICAgICAgICAgICBjZmdfd29yZCAmPSB+dGlkbWFzazsKKyAgICAgICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9ET05FLCBjZmdfd29yZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlIElucXVpcnkgZGF0YSBpbmNsdWRlZCBlbm91Z2ggc3BhY2UgZm9yIHRoZSBTUEktMworICAgICAgICAgKiBDbG9ja2luZyBmaWVsZCwgdGhlbiBjaGVjayBpZiBEVCBtb2RlIGlzIHN1cHBvcnRlZC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMTYwMCAmJgorICAgICAgICAgICAgKHNjc2lxLT5jZGJbNF0gPj0gNTcgfHwKKyAgICAgICAgICAgIChzY3NpcS0+Y2RiWzRdIC0gbGUzMl90b19jcHUoc2NzaXEtPmRhdGFfY250KSkgPj0gNTcpKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogUFBSIChQYXJhbGxlbCBQcm90b2NvbCBSZXF1ZXN0KSBDYXBhYmxlCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogSWYgdGhlIGRldmljZSBzdXBwb3J0cyBEVCBtb2RlLCB0aGVuIGl0IG11c3QgYmUgUFBSIGNhcGFibGUuCisgICAgICAgICAgICAgKiBUaGUgUFBSIG1lc3NhZ2Ugd2lsbCBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSBTRFRSIGFuZCBXRFRSCisgICAgICAgICAgICAgKiBtZXNzYWdlcyB0byBuZWdvdGlhdGUgc3luY2hyb25vdXMgc3BlZWQgYW5kIG9mZnNldCwgdHJhbnNmZXIKKyAgICAgICAgICAgICAqIHdpZHRoLCBhbmQgcHJvdG9jb2wgb3B0aW9ucy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKEFEVl9JTlFfQ0xPQ0tJTkcoaW5xKSAmIEFEVl9JTlFfQ0xPQ0tJTkdfRFRfT05MWSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19QUFJfQUJMRSwgYXNjX2R2Yy0+cHByX2FibGUpOworICAgICAgICAgICAgICAgIGFzY19kdmMtPnBwcl9hYmxlIHw9IHRpZG1hc2s7CisgICAgICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1BQUl9BQkxFLCBhc2NfZHZjLT5wcHJfYWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgRUVQUk9NIGVuYWJsZWQgVGFnIFF1ZXVpbmcgZm9yIHRoZSBkZXZpY2UgYW5kIHRoZQorICAgICAgICAgKiBkZXZpY2Ugc3VwcG9ydHMgVGFnIFF1ZXVlaW5nLCB0aGVuIHR1cm4gb24gdGhlIGRldmljZSdzCisgICAgICAgICAqICd0YWdxbmdfZW5hYmxlJyBiaXQgaW4gdGhlIG1pY3JvY29kZSBhbmQgc2V0IHRoZSBtaWNyb2NvZGUKKyAgICAgICAgICogbWF4aW11bSBjb21tYW5kIGNvdW50IHRvIHRoZSBBRFZfRFZDX1ZBUiAnbWF4X2R2Y19xbmcnCisgICAgICAgICAqIHZhbHVlLgorICAgICAgICAgKgorICAgICAgICAgKiBUYWcgUXVldWluZyBpcyBkaXNhYmxlZCBmb3IgdGhlIEJJT1Mgd2hpY2ggcnVucyBpbiBwb2xsZWQKKyAgICAgICAgICogbW9kZSBhbmQgd291bGQgc2VlIG5vIGJlbmVmaXQgZnJvbSBUYWcgUXVldWluZy4gQWxzbyBieQorICAgICAgICAgKiBkaXNhYmxpbmcgVGFnIFF1ZXVpbmcgaW4gdGhlIEJJT1MgZGV2aWNlcyB3aXRoIFRhZyBRdWV1aW5nCisgICAgICAgICAqIGJ1Z3Mgd2lsbCBhdCBsZWFzdCB3b3JrIHdpdGggdGhlIEJJT1MuCisgICAgICAgICAqLworICAgICAgICBpZiAoKGFzY19kdmMtPnRhZ3FuZ19hYmxlICYgdGlkbWFzaykgJiYgQURWX0lOUV9DTURfUVVFVUUoaW5xKSkKKyAgICAgICAgeworICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVEFHUU5HX0FCTEUsIGNmZ193b3JkKTsKKyAgICAgICAgICAgIGNmZ193b3JkIHw9IHRpZG1hc2s7CisgICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVEFHUU5HX0FCTEUsIGNmZ193b3JkKTsKKworICAgICAgICAgICAgQWR2V3JpdGVCeXRlTHJhbShpb3BfYmFzZSwgQVNDX01DX05VTUJFUl9PRl9NQVhfQ01EICsgdGlkLAorICAgICAgICAgICAgICAgIGFzY19kdmMtPm1heF9kdmNfcW5nKTsKKyAgICAgICAgfQorICAgIH0KK30KK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hZHZhbnN5cy5oIGIvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0YmRlMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hZHZhbnN5cy5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBhZHZhbnN5cy5oIC0gTGludXggSG9zdCBEcml2ZXIgZm9yIEFkdmFuU3lzIFNDU0kgQWRhcHRlcnMKKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTk1LTIwMDAgQWR2YW5jZWQgU3lzdGVtIFByb2R1Y3RzLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDb25uZWN0Q29tIFNvbHV0aW9ucywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UKKyAqIGNvZGUgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIGNvbW1lbnQgd2l0aG91dAorICogbW9kaWZpY2F0aW9uLgorICoKKyAqIEFzIG9mIE1hcmNoIDgsIDIwMDAgQWR2YW5jZWQgU3lzdGVtIFByb2R1Y3RzLCBJbmMuIChBZHZhblN5cykKKyAqIGNoYW5nZWQgaXRzIG5hbWUgdG8gQ29ubmVjdENvbSBTb2x1dGlvbnMsIEluYy4KKyAqCisgKi8KKworI2lmbmRlZiBfQURWQU5TWVNfSAorI2RlZmluZSBfQURWQU5TWVNfSAorCisvKgorICogU2NzaV9Ib3N0X1RlbXBsYXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMuCisgKi8KK2ludCBhZHZhbnN5c19kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqKTsKK2ludCBhZHZhbnN5c19yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKik7Citjb25zdCBjaGFyICphZHZhbnN5c19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKik7CitpbnQgYWR2YW5zeXNfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKiwgdm9pZCAoKiBkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKK2ludCBhZHZhbnN5c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICopOworaW50IGFkdmFuc3lzX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLAorCQlzZWN0b3JfdCwgaW50W10pOworc3RhdGljIGludCBhZHZhbnN5c19zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICopOworCisvKiBpbml0L21haW4uYyBzZXR1cCBmdW5jdGlvbiAqLwordm9pZCBhZHZhbnN5c19zZXR1cChjaGFyICosIGludCAqKTsKKworI2VuZGlmIC8qIF9BRFZBTlNZU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWhhMTUyeC5jIGIvZHJpdmVycy9zY3NpL2FoYTE1MnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2I4ZWZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FoYTE1MnguYwpAQCAtMCwwICsxLDM5ODIgQEAKKy8qIGFoYTE1MnguYyAtLSBBZGFwdGVjIEFIQS0xNTJ4IGRyaXZlcgorICogQXV0aG9yOiBK/HJnZW4gRS4gRmlzY2hlciwgZmlzY2hlckBub3JiaXQuZGUKKyAqIENvcHlyaWdodCAxOTkzLTIwMDQgSvxyZ2VuIEUuIEZpc2NoZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoKKyAqICRJZDogYWhhMTUyeC5jLHYgMi43IDIwMDQvMDEvMjQgMTE6NDI6NTkgZmlzY2hlciBFeHAgJAorICoKKyAqICRMb2c6IGFoYTE1MnguYyx2ICQKKyAqIFJldmlzaW9uIDIuNyAgMjAwNC8wMS8yNCAxMTo0Mjo1OSAgZmlzY2hlcgorICogLSBnYXRoZXIgY29kZSB0aGF0IGlzIG5vdCB1c2VkIGJ5IFBDTUNJQSBhdCB0aGUgZW5kCisgKiAtIG1vdmUgcmVxdWVzdF9yZWdpb24gZm9yICFQQ01DSUEgY2FzZSB0byBkZXRlY3Rpb24KKyAqIC0gbWlncmF0aW9uIHRvIG5ldyBzY3NpIGhvc3QgYXBpIChyZW1vdmUgbGVnYWN5IGNvZGUpCisgKiAtIGZyZWUgaG9zdCBzY3JpYmJsZSBiZWZvcmUgc2NzaV9kb25lCisgKiAtIGZpeCBlcnJvciBoYW5kbGluZworICogLSBvbmUgaXNhcG5wIGRldmljZSBhZGRlZCB0byBpZF90YWJsZQorICoKKyAqIFJldmlzaW9uIDIuNiAgMjAwMy8xMC8zMCAyMDo1Mjo0NyAgZmlzY2hlcgorICogLSBpbnRlcmZhY2VzIGNoYW5nZXMgZm9yIGtlcm5lbCAyLjYKKyAqIC0gYWhhMTUyeF9wcm9iZV9vbmUgaW50cm9kdWNlZCBmb3IgcGNtY2lhIHN0dWIKKyAqIC0gZml4ZWQgcG5wZGV2IGhhbmRsaW5nCisgKiAtIGluc3RlYWQgb2YgYWxsb2NhdGlvbiBhIG5ldyBvbmUsIHJldXNlIGNvbW1hbmQgZm9yIHJlcXVlc3Qgc2Vuc2UgYWZ0ZXIgY2hlY2sgY29uZGl0aW9uIGFuZCByZXNldAorICogLSBmaXhlcyByYWNlIGluIGlzX2NvbXBsZXRlCisgKgorICogUmV2aXNpb24gMi41ICAyMDAyLzA0LzE0IDExOjI0OjUzICBmaXNjaGVyCisgKiAtIGlzYXBucCBzdXBwb3J0CisgKiAtIGFib3J0IGZpeGVkCisgKiAtIDIuNSBzdXBwb3J0CisgKgorICogUmV2aXNpb24gMi40ICAyMDAwLzEyLzE2IDEyOjUzOjU2ICBmaXNjaGVyCisgKiAtIGFsbG93IFJFUVVFU1QgU0VOU0UgdG8gYmUgcXVldWVkCisgKiAtIGhhbmRsZSBzaGFyZWQgUENJIGludGVycnVwdHMKKyAqCisgKiBSZXZpc2lvbiAyLjMgIDIwMDAvMTEvMDQgMTY6NDA6MjYgIGZpc2NoZXIKKyAqIC0gaGFuZGxlIGRhdGEgb3ZlcnJ1bnMKKyAqIC0gZXh0ZW5kIHRpbWVvdXQgZm9yIGRhdGEgcGhhc2VzCisgKgorICogUmV2aXNpb24gMi4yICAyMDAwLzA4LzA4IDE5OjU0OjUzICBmaXNjaGVyCisgKiAtIG1pbm9yIGNoYW5nZXMKKyAqCisgKiBSZXZpc2lvbiAyLjEgIDIwMDAvMDUvMTcgMTY6MjM6MTcgIGZpc2NoZXIKKyAqIC0gc2lnbmF0dXJlIHVwZGF0ZQorICogLSBmaXggZm9yIGRhdGEgb3V0IHcvbyBzY2F0dGVyIGdhdGhlcgorICoKKyAqIFJldmlzaW9uIDIuMCAgMTk5OS8xMi8yNSAxNTowNzozMiAgZmlzY2hlcgorICogLSBpbnRlcnJ1cHQgcm91dGluZSBjb21wbGV0bHkgcmV3b3JrZWQKKyAqIC0gYmFzaWMgc3VwcG9ydCBmb3IgbmV3IGVoIGNvZGUKKyAqCisgKiBSZXZpc2lvbiAxLjIxICAxOTk5LzExLzEwIDIzOjQ2OjM2ICBmaXNjaGVyCisgKiAtIGRlZmF1bHQgdG8gc3luY2hyb25vdXMgb3BlcmF0aW9uCisgKiAtIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uIGZpeGVkCisgKiAtIGFkZGVkIHRpbWVvdXQgdG8gbG9vcHMKKyAqIC0gZGVidWdnaW5nIG91dHB1dCBjYW4gYmUgY29udHJvbGxlZCB0aHJvdWdoIHByb2NmcworICoKKyAqIFJldmlzaW9uIDEuMjAgIDE5OTkvMTEvMDcgMTg6Mzc6MzEgIGZpc2NoZXIKKyAqIC0gc3luY2hyb25vdXMgb3BlcmF0aW9uIHdvcmtzCisgKiAtIHJlc2lkIHN1cHBvcnQgZm9yIHNnIGRyaXZlcgorICoKKyAqIFJldmlzaW9uIDEuMTkgIDE5OTkvMTEvMDIgMjI6Mzk6NTkgIGZpc2NoZXIKKyAqIC0gbW92ZWQgbGVhZGluZyBjb21tZW50cyB0byBSRUFETUUuYWhhMTUyeAorICogLSBuZXcgYWRkaXRpb25hbCBtb2R1bGUgcGFyYW1ldGVycworICogLSB1cGRhdGVzIGZvciAyLjMKKyAqIC0gc3VwcG9ydCBmb3IgdGhlIFRyaXBhY2UgVEMxNTUwIGNvbnRyb2xsZXIKKyAqIC0gaW50ZXJydXB0IGhhbmRsaW5nIGNoYW5nZWQKKyAqCisgKiBSZXZpc2lvbiAxLjE4ICAxOTk2LzA5LzA3IDIwOjEwOjQwICBmaXNjaGVyCisgKiAtIGZpeGVkIGNhbl9xdWV1ZSBoYW5kbGluZyAobXVsdGlwbGUgb3V0c3RhbmRpbmcgY29tbWFuZHMgd29ya2luZyBhZ2FpbikKKyAqCisgKiBSZXZpc2lvbiAxLjE3ICAxOTk2LzA4LzE3IDE2OjA1OjE0ICBmaXNjaGVyCisgKiAtIGJpb3NwYXJhbSBpbXByb3ZlZAorICogLSBpbnRlcnJ1cHQgdmVyaWZpY2F0aW9uCisgKiAtIHVwZGF0ZWQgZG9jdW1lbnRhdGlvbgorICogLSBjbGVhbnVwcworICoKKyAqIFJldmlzaW9uIDEuMTYgIDE5OTYvMDYvMDkgMDA6MDQ6NTYgIHJvb3QKKyAqIC0gYWRkZWQgY29uZmlndXJhdGlvbiBzeW1ib2xzIGZvciBpbnNtb2QgKGFoYTE1MngvYWhhMTUyeDEpCisgKgorICogUmV2aXNpb24gMS4xNSAgMTk5Ni8wNC8zMCAxNDo1MjowNiAgZmlzY2hlcgorICogLSBwcm9jIGluZm8gZml4ZWQKKyAqIC0gc3VwcG9ydCBmb3IgZXh0ZW5kZWQgdHJhbnNsYXRpb24gZm9yID4xR0IgZGlza3MKKyAqCisgKiBSZXZpc2lvbiAxLjE0ICAxOTk2LzAxLzE3ICAxNToxMToyMCAgZmlzY2hlcgorICogLSBmaXhlZCBsb2NrdXAgaW4gTUVTU0FHRSBJTiBwaGFzZSBhZnRlciByZWNvbm5lY3Rpb24KKyAqCisgKiBSZXZpc2lvbiAxLjEzICAxOTk2LzAxLzA5ICAwMjoxNTo1MyAgZmlzY2hlcgorICogLSBzb21lIGNsZWFudXBzCisgKiAtIG1vdmVkIHJlcXVlc3RfaXJxIGJlaGluZCBjb250cm9sbGVyIGluaXRpYWxpemF0aW9uCisgKiAgICh0byBhdm9pZCBzcHVyaW91cyBpbnRlcnJ1cHRzKQorICoKKyAqIFJldmlzaW9uIDEuMTIgIDE5OTUvMTIvMTYgIDEyOjI2OjA3ICBmaXNjaGVyCisgKiAtIGJhcnJpZXIoKXMgYWRkZWQKKyAqIC0gY29uZmlndXJhYmxlIFJFU0VUIGRlbGF5IGFkZGVkCisgKgorICogUmV2aXNpb24gMS4xMSAgMTk5NS8xMi8wNiAgMjE6MTg6MzUgIGZpc2NoZXIKKyAqIC0gc29tZSBtaW5vciB1cGRhdGVzCisgKgorICogUmV2aXNpb24gMS4xMCAgMTk5NS8wNy8yMiAgMTk6MTg6NDUgIGZpc2NoZXIKKyAqIC0gc3VwcG9ydCBmb3IgMiBjb250cm9sbGVycworICogLSBzdGFydGVkIHN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXJzIChub3Qgd29ya2luZyB5ZXQpCisgKgorICogUmV2aXNpb24gMS45ICAxOTk1LzAzLzE4ICAwOToyMDoyNCAgcm9vdAorICogLSBwYXRjaGVzIGZvciBQQ01DSUEgYW5kIG1vZHVsZXMKKyAqCisgKiBSZXZpc2lvbiAxLjggIDE5OTUvMDEvMjEgIDIyOjA3OjE5ICByb290CisgKiAtIHNuYXJmX3JlZ2lvbiA9PiByZXF1ZXN0X3JlZ2lvbgorICogLSBhaGExNTJ4X2ludHIgaW50ZXJmYWNlIGNoYW5nZQorICoKKyAqIFJldmlzaW9uIDEuNyAgMTk5NS8wMS8wMiAgMjM6MTk6MzYgIHJvb3QKKyAqIC0gdXBkYXRlZCBDT01NQU5EX1NJWkUgdG8gY21kX2xlbgorICogLSBjaGFuZ2VkIHN0aSgpIHRvIHJlc3RvcmVfZmxhZ3MoKQorICogLSBmaXhlZCBzb21lICNpZmRlZiB3aGljaCBnZW5lcmF0ZWQgd2FybmluZ3MKKyAqCisgKiBSZXZpc2lvbiAxLjYgIDE5OTQvMTEvMjQgIDIwOjM1OjI3ICByb290CisgKiAtIHByb2JsZW0gd2l0aCBvZGQgbnVtYmVyIG9mIGJ5dGVzIGluIGZpZm8gZml4ZWQKKyAqCisgKiBSZXZpc2lvbiAxLjUgIDE5OTQvMTAvMzAgIDE0OjM5OjU2ICByb290CisgKiAtIGFib3J0IGNvZGUgZml4ZWQKKyAqIC0gZGVidWdnaW5nIGltcHJvdmVkCisgKgorICogUmV2aXNpb24gMS40ICAxOTk0LzA5LzEyICAxMTozMzowMSAgcm9vdAorICogLSBpcnFhY3Rpb24gdG8gcmVxdWVzdF9pcnEKKyAqIC0gYWJvcnRpb24gdXBkYXRlZAorICoKKyAqIFJldmlzaW9uIDEuMyAgMTk5NC8wOC8wNCAgMTM6NTM6MDUgIHJvb3QKKyAqIC0gdXBkYXRlcyBmb3IgbWlkLWxldmVsLWRyaXZlciBjaGFuZ2VzCisgKiAtIGFjY2VwdCB1bmV4cGVjdGVkIEJVU0ZSRUUgcGhhc2UgYXMgZXJyb3IgY29uZGl0aW9uCisgKiAtIHBhcml0eSBjaGVjayBub3cgY29uZmlndXJhYmxlCisgKgorICogUmV2aXNpb24gMS4yICAxOTk0LzA3LzAzICAxMjo1NjozNiAgcm9vdAorICogLSBjbGVhbmVkIHVwIGRlYnVnZ2luZyBjb2RlCisgKiAtIG1vcmUgdHdlYWtpbmcgb24gcmVzZXQgZGVsYXlzCisgKiAtIHVwZGF0ZWQgYWJvcnQvcmVzZXQgY29kZSAocHJldHR5IHVudGVzdGVkLi4uKQorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5NC8wNS8yOCAgMjE6MTg6NDkgIHJvb3QKKyAqIC0gdXBkYXRlIGZvciBtaWQtbGV2ZWwgaW50ZXJmYWNlIGNoYW5nZSAoYWJvcnQtcmVzZXQpCisgKiAtIGRlbGF5cyBhZnRlciByZXNldHMgYWRqdXN0ZWQgZm9yIHNvbWUgc2xvdyBkZXZpY2VzCisgKgorICogUmV2aXNpb24gMS4wICAxOTk0LzAzLzI1ICAxMjo1MjowMCAgcm9vdAorICogLSBGaXhlZCAibW9yZSBkYXRhIHRoYW4gZXhwZWN0ZWQiIHByb2JsZW0KKyAqIC0gYWRkZWQgbmV3IEJJT1Mgc2lnbmF0dXJlcworICoKKyAqIFJldmlzaW9uIDAuMTAyICAxOTk0LzAxLzMxICAyMDo0NDoxMiAgcm9vdAorICogLSBtaW5vciBjaGFuZ2VzIGluIGluc3cvb3V0c3cgaGFuZGxpbmcKKyAqCisgKiBSZXZpc2lvbiAwLjEwMSAgMTk5My8xMi8xMyAgMDE6MTY6MjcgIHJvb3QKKyAqIC0gZml4ZWQgU1RBVFVTIHBoYXNlIChub24tR09PRCBzdGF0aSB3ZXJlIGRyb3BwZWQgc29tZXRpbWVzOworICogICBmaXhlcyBwcm9ibGVtcyB3aXRoIENELVJPTSBzZWN0b3Igc2l6ZSBkZXRlY3Rpb24gJiBtZWRpYSBjaGFuZ2UpCisgKgorICogUmV2aXNpb24gMC4xMDAgIDE5OTMvMTIvMTAgIDE2OjU4OjQ3ICByb290CisgKiAtIGZpeCBmb3IgdW5zdWNjZXNzZnVsIHNlbGVjdGlvbnMgaW4gY2FzZSBvZiBub24tY29udGludW91cyBpZCBhc3NpZ25tZW50cworICogICBvbiB0aGUgc2NzaSBidXMuCisgKgorICogUmV2aXNpb24gMC45OSAgMTk5My8xMC8yNCAgMTY6MTk6NTkgIHJvb3QKKyAqIC0gZml4ZWQgREFUQSBJTiAocmFyZSByZWFkIGVycm9ycyBnb25lKQorICoKKyAqIFJldmlzaW9uIDAuOTggIDE5OTMvMTAvMTcgIDEyOjU0OjQ0ICByb290CisgKiAtIGZpeGVkIHNvbWUgcmVjZW50IGZpeGVzIChzaGFtZSBvbiBtZSkKKyAqIC0gbW92ZWQgaW5pdGlhbGl6YXRpb24gb2Ygc2NyYXRjaCBhcmVhIHRvIGFoYTE1MnhfcXVldWUKKyAqCisgKiBSZXZpc2lvbiAwLjk3ICAxOTkzLzEwLzA5ICAxODo1Mzo1MyAgcm9vdAorICogLSBEQVRBIElOIGZpeGVkLiBSYXJlbHkgbGVmdCBkYXRhIGluIHRoZSBmaWZvLgorICoKKyAqIFJldmlzaW9uIDAuOTYgIDE5OTMvMTAvMDMgIDAwOjUzOjU5ICByb290CisgKiAtIG1pbm9yIGNoYW5nZXMgb24gREFUQSBJTgorICoKKyAqIFJldmlzaW9uIDAuOTUgIDE5OTMvMDkvMjQgIDEwOjM2OjAxICByb290CisgKiAtIGNoYW5nZSBoYW5kbGluZyBvZiBNU0dJIGFmdGVyIHJlc2VsZWN0aW9uCisgKiAtIGZpeGVkIHN0aS9jbGkKKyAqIC0gbWlub3IgY2hhbmdlcworICoKKyAqIFJldmlzaW9uIDAuOTQgIDE5OTMvMDkvMTggIDE0OjA4OjIyICByb290CisgKiAtIGZpeGVkIGJ1ZyBpbiBtdWx0aXBsZSBvdXRzdGFuZGluZyBjb21tYW5kIGNvZGUKKyAqIC0gY2hhbmdlZCBkZXRlY3Rpb24KKyAqIC0gc3VwcG9ydCBmb3Iga2VybmVsIGNvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uCisgKiAtIHJlc2V0IGNvcnJlY3RlZAorICogLSBjaGFuZ2VkIG1lc3NhZ2UgaGFuZGxpbmcKKyAqCisgKiBSZXZpc2lvbiAwLjkzICAxOTkzLzA5LzE1ICAyMDo0MToxOSAgcm9vdAorICogLSBmaXhlZCBidWdzIHdpdGggbXVsdGlwbGUgb3V0c3RhbmRpbmcgY29tbWFuZHMKKyAqCisgKiBSZXZpc2lvbiAwLjkyICAxOTkzLzA5LzEzICAwMjo0NjozMyAgcm9vdAorICogLSBtdWx0aXBsZSBvdXRzdGFuZGluZyBjb21tYW5kcyB3b3JrIChubyBwcm9ibGVtcyB3aXRoIElCTSBkcml2ZSkKKyAqCisgKiBSZXZpc2lvbiAwLjkxICAxOTkzLzA5LzEyICAyMDo1MTo0NiAgcm9vdAorICogYWRkZWQgbXVsdGlwbGUgb3V0c3RhbmRpbmcgY29tbWFuZHMKKyAqIChzb21lIHByb2JsZW0gd2l0aCB0aGlzICQlJj8gSUJNIGRldmljZSByZW1haW4pCisgKgorICogUmV2aXNpb24gMC45ICAxOTkzLzA5LzEyICAxMToxMToyMiAgcm9vdAorICogLSBjb3JyZWN0ZWQgYXV0by1jb25maWd1cmF0aW9uCisgKiAtIGNoYW5nZWQgdGhlIGF1dG8tY29uZmlndXJhdGlvbiAoYWRkZWQgc29tZSAnI2RlZmluZSdzKQorICogLSBhZGRlZCBzdXBwb3J0IGZvciBkaXMtL3JlY29ubmVjdGlvbgorICoKKyAqIFJldmlzaW9uIDAuOCAgMTk5My8wOS8wNiAgMjM6MDk6MzkgIHJvb3QKKyAqIC0gYWRkZWQgc3VwcG9ydCBmb3IgdGhlIGRyaXZlIGFjdGl2aXR5IGxpZ2h0CisgKiAtIG1pbm9yIGNoYW5nZXMKKyAqCisgKiBSZXZpc2lvbiAwLjcgIDE5OTMvMDkvMDUgIDE0OjMwOjE1ICByb290CisgKiAtIGltcHJvdmVkIHBoYXNlIGRldGVjdGlvbgorICogLSBub3cgdXNpbmcgdGhlIG5ldyBzbmFyZl9yZWdpb24gY29kZSBvZiAwLjk5cGwxMworICoKKyAqIFJldmlzaW9uIDAuNiAgMTk5My8wOS8wMiAgMTE6MDE6MzggIHJvb3QKKyAqIGZpcnN0IHB1YmxpYyByZWxlYXNlOyBhZGRlZCBzb21lIHNpZ25hdHVyZXMgYW5kIGJpb3NwYXJhbSgpCisgKgorICogUmV2aXNpb24gMC41ICAxOTkzLzA4LzMwICAxMDoyMzozMCAgcm9vdAorICogZml4ZWQgdGltaW5nIHByb2JsZW1zIHdpdGggbXkgSUJNIGRyaXZlCisgKgorICogUmV2aXNpb24gMC40ICAxOTkzLzA4LzI5ICAxNDowNjo1MiAgcm9vdAorICogZml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIHRpbWVvdXRzIGR1ZSBpbmNvbXBsZXRlIGNvbW1hbmRzCisgKgorICogUmV2aXNpb24gMC4zICAxOTkzLzA4LzI4ICAxNTo1NTowMyAgcm9vdAorICogd3JpdGluZyBkYXRhIHdvcmtzIHRvby4gIG1vdW50ZWQgYW5kIHdvcmtlZCBvbiBhIGRvcyBwYXJ0aXRpb24KKyAqCisgKiBSZXZpc2lvbiAwLjIgIDE5OTMvMDgvMjcgIDIyOjQyOjA3ICByb290CisgKiByZWFkaW5nIGRhdGEgd29ya3MuICBNb3VudGVkIGEgbXNkb3MgcGFydGl0aW9uLgorICoKKyAqIFJldmlzaW9uIDAuMSAgMTk5My8wOC8yNSAgMTM6Mzg6MzAgIHJvb3QKKyAqIGZpcnN0ICJkYW1uIHRoaW5nIGRvZXNuJ3Qgd29yayIgdmVyc2lvbgorICoKKyAqIFJldmlzaW9uIDAuMCAgMTk5My8wOC8xNCAgMTk6NTQ6MjUgIHJvb3QKKyAqIGVtcHR5IGZ1bmN0aW9uIGJvZGllczsgZGV0ZWN0KCkgd29ya3MuCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIAorIHNlZSBEb2N1bWVudGF0aW9uL3Njc2kvYWhhMTUyeC50eHQgZm9yIGNvbmZpZ3VyYXRpb24gZGV0YWlscworCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lzYXBucC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiYWhhMTUyeC5oIgorCisKKy8qIERFRklORVMgKi8KKworLyogRm9yIFBDTUNJQSBjYXJkcywgYWx3YXlzIHVzZSBBVVRPQ09ORiAqLworI2lmIGRlZmluZWQoUENNQ0lBKSB8fCBkZWZpbmVkKE1PRFVMRSkKKyNpZiAhZGVmaW5lZChBVVRPQ09ORikKKyNkZWZpbmUgQVVUT0NPTkYKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChBVVRPQ09ORikgJiYgIWRlZmluZWQoU0VUVVAwKQorI2Vycm9yIGRlZmluZSBBVVRPQ09ORiBvciBTRVRVUDAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorI2RlZmluZSBERUJVR19ERUZBVUxUIGRlYnVnX2VoCisKKyNkZWZpbmUgRFBSSU5USyh3aGVuLG1zZ3MuLi4pIFwKKwlkbyB7IGlmKEhPU1REQVRBKHNocG50KS0+ZGVidWcgJiAod2hlbikpIHByaW50ayhtc2dzKTsgfSB3aGlsZSgwKQorCisjZGVmaW5lIERPX0xPQ0soZmxhZ3MpCVwKKwlkbyB7IFwKKwkJaWYoc3Bpbl9pc19sb2NrZWQoJlFMT0NLKSkgeyBcCisJCQlEUFJJTlRLKGRlYnVnX2ludHIsIERFQlVHX0xFQUQgIiglczolZCkgYWxyZWFkeSBsb2NrZWQgYXQgJXM6JWRcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIFFMT0NLRVIsIFFMT0NLRVJMKTsgXAorCQl9IFwKKwkJRFBSSU5USyhkZWJ1Z19sb2NrcywgREVCVUdfTEVBRCAiKCVzOiVkKSBsb2NraW5nXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAorCQlzcGluX2xvY2tfaXJxc2F2ZSgmUUxPQ0ssZmxhZ3MpOyBcCisJCURQUklOVEsoZGVidWdfbG9ja3MsIERFQlVHX0xFQUQgIiglczolZCkgbG9ja2VkXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAorCQlRTE9DS0VSPV9fRlVOQ1RJT05fXzsgXAorCQlRTE9DS0VSTD1fX0xJTkVfXzsgXAorCX0gd2hpbGUoMCkKKworI2RlZmluZSBET19VTkxPQ0soZmxhZ3MpCVwKKwlkbyB7IFwKKwkJRFBSSU5USyhkZWJ1Z19sb2NrcywgREVCVUdfTEVBRCAiKCVzOiVkKSB1bmxvY2tpbmcgKGxvY2tlZCBhdCAlczolZClcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIFFMT0NLRVIsIFFMT0NLRVJMKTsgXAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZRTE9DSyxmbGFncyk7IFwKKwkJRFBSSU5USyhkZWJ1Z19sb2NrcywgREVCVUdfTEVBRCAiKCVzOiVkKSB1bmxvY2tlZFxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKKwkJUUxPQ0tFUj0iKG5vdCBsb2NrZWQpIjsgXAorCQlRTE9DS0VSTD0wOyBcCisJfSB3aGlsZSgwKQorCisjZWxzZQorI2RlZmluZSBEUFJJTlRLKHdoZW4sbXNncy4uLikKKyNkZWZpbmUJRE9fTE9DSyhmbGFncykJCXNwaW5fbG9ja19pcnFzYXZlKCZRTE9DSyxmbGFncykKKyNkZWZpbmUJRE9fVU5MT0NLKGZsYWdzKQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZRTE9DSyxmbGFncykKKyNlbmRpZgorCisjZGVmaW5lIExFQUQJCSIoc2NzaSVkOiVkOiVkKSAiCisjZGVmaW5lIFdBUk5fTEVBRAlLRVJOX1dBUk5JTkcJTEVBRAorI2RlZmluZSBJTkZPX0xFQUQJS0VSTl9JTkZPCUxFQUQKKyNkZWZpbmUgTk9URV9MRUFECUtFUk5fTk9USUNFCUxFQUQKKyNkZWZpbmUgRVJSX0xFQUQJS0VSTl9FUlIJTEVBRAorI2RlZmluZSBERUJVR19MRUFECUtFUk5fREVCVUcJTEVBRAorI2RlZmluZSBDTURJTkZPKGNtZCkgXAorCQkJKGNtZCkgPyAoKGNtZCktPmRldmljZS0+aG9zdC0+aG9zdF9ubykgOiAtMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKGNtZCkgPyAoKGNtZCktPmRldmljZS0+aWQgJiAweDBmKSA6IC0xLCBcCisJCQkoY21kKSA/ICgoY21kKS0+ZGV2aWNlLT5sdW4gJiAweDA3KSA6IC0xCisKKyNkZWZpbmUgREVMQVlfREVGQVVMVCAxMDAwCisKKyNpZiBkZWZpbmVkKFBDTUNJQSkKKyNkZWZpbmUgSVJRX01JTiAwCisjZGVmaW5lIElSUV9NQVggMTYKKyNlbHNlCisjZGVmaW5lIElSUV9NSU4gOQorI2lmIGRlZmluZWQoX19QUEMpCisjZGVmaW5lIElSUV9NQVggKE5SX0lSUVMtMSkKKyNlbHNlCisjZGVmaW5lIElSUV9NQVggMTIKKyNlbmRpZgorI2VuZGlmCisKK2VudW0geworCW5vdF9pc3N1ZWQJPSAweDAwMDEsCS8qIGNvbW1hbmQgbm90IHlldCBpc3N1ZWQgKi8KKwlzZWxlY3RpbmcJPSAweDAwMDIsIAkvKiB0YXJnZXQgaXMgYmVlaW5nIHNlbGVjdGVkICovCisJaWRlbnRpZmllZAk9IDB4MDAwNCwJLyogSURFTlRJRlkgd2FzIHNlbnQgKi8KKwlkaXNjb25uZWN0ZWQJPSAweDAwMDgsCS8qIHRhcmdldCBkaXNjb25uZWN0ZWQgKi8KKwljb21wbGV0ZWQJPSAweDAwMTAsCS8qIHRhcmdldCBzZW50IENPTU1BTkQgQ09NUExFVEUgKi8gCisJYWJvcnRlZAkJPSAweDAwMjAsCS8qIEFCT1JUIHdhcyBzZW50ICovCisJcmVzZXR0ZWQJPSAweDAwNDAsCS8qIEJVUyBERVZJQ0UgUkVTRVQgd2FzIHNlbnQgKi8KKwlzcGlvcmR5CQk9IDB4MDA4MCwJLyogd2FpdGluZyBmb3IgU1BJT1JEWSB0byByYWlzZSAqLworCXN5bmNuZWcJCT0gMHgwMTAwLAkvKiBzeW5jaHJvbm91cyBuZWdvdGlhdGlvbiBpbiBwcm9ncmVzcyAqLworCWFib3J0aW5nCT0gMHgwMjAwLAkvKiBBQk9SVCBpcyBwZW5kaW5nICovCisJcmVzZXR0aW5nCT0gMHgwNDAwLAkvKiBCVVMgREVWSUNFIFJFU0VUIGlzIHBlbmRpbmcgKi8KKwljaGVja19jb25kaXRpb24gPSAweDA4MDAsCS8qIHJlcXVlc3Rpbmcgc2Vuc2UgYWZ0ZXIgQ0hFQ0sgQ09ORElUSU9OICovCit9OworCitNT0RVTEVfQVVUSE9SKCJK/HJnZW4gRmlzY2hlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKEFIQTE1MlhfUkVWSUQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaWYgIWRlZmluZWQoUENNQ0lBKQorI2lmIGRlZmluZWQoTU9EVUxFKQorc3RhdGljIGludCBpb1tdID0gezAsIDB9OworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywiYmFzZSBpbyBhZGRyZXNzIG9mIGNvbnRyb2xsZXIiKTsKKworc3RhdGljIGludCBpcnFbXSA9IHswLCAwfTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwiaW50ZXJydXB0IGZvciBjb250cm9sbGVyIik7CisKK3N0YXRpYyBpbnQgc2NzaWlkW10gPSB7NywgN307Cittb2R1bGVfcGFyYW1fYXJyYXkoc2NzaWlkLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhzY3NpaWQsInNjc2kgaWQgb2YgY29udHJvbGxlciIpOworCitzdGF0aWMgaW50IHJlY29ubmVjdFtdID0gezEsIDF9OworbW9kdWxlX3BhcmFtX2FycmF5KHJlY29ubmVjdCwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocmVjb25uZWN0LCJhbGxvdyB0YXJnZXRzIHRvIGRpc2Nvbm5lY3QiKTsKKworc3RhdGljIGludCBwYXJpdHlbXSA9IHsxLCAxfTsKK21vZHVsZV9wYXJhbV9hcnJheShwYXJpdHksIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBhcml0eSwidXNlIHNjc2kgcGFyaXR5Iik7CisKK3N0YXRpYyBpbnQgc3luY1tdID0gezEsIDF9OworbW9kdWxlX3BhcmFtX2FycmF5KHN5bmMsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHN5bmMsInVzZSBzeW5jaHJvbm91cyB0cmFuc2ZlcnMiKTsKKworc3RhdGljIGludCBkZWxheVtdID0ge0RFTEFZX0RFRkFVTFQsIERFTEFZX0RFRkFVTFR9OworbW9kdWxlX3BhcmFtX2FycmF5KGRlbGF5LCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWxheSwic2NzaSByZXNldCBkZWxheSIpOworCitzdGF0aWMgaW50IGV4dHRyYW5zW10gPSB7MCwgMH07Cittb2R1bGVfcGFyYW1fYXJyYXkoZXh0dHJhbnMsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGV4dHRyYW5zLCJ1c2UgZXh0ZW5kZWQgdHJhbnNsYXRpb24iKTsKKworI2lmICFkZWZpbmVkKEFIQTE1MlhfREVCVUcpCitzdGF0aWMgaW50IGFoYTE1MnhbXSA9IHswLCAxMSwgNywgMSwgMSwgMCwgREVMQVlfREVGQVVMVCwgMH07Cittb2R1bGVfcGFyYW1fYXJyYXkoYWhhMTUyeCwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYWhhMTUyeCwgInBhcmFtZXRlcnMgZm9yIGZpcnN0IGNvbnRyb2xsZXIiKTsKKworc3RhdGljIGludCBhaGExNTJ4MVtdID0gezAsIDExLCA3LCAxLCAxLCAwLCBERUxBWV9ERUZBVUxULCAwfTsKK21vZHVsZV9wYXJhbV9hcnJheShhaGExNTJ4MSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYWhhMTUyeDEsICJwYXJhbWV0ZXJzIGZvciBzZWNvbmQgY29udHJvbGxlciIpOworI2Vsc2UKK3N0YXRpYyBpbnQgZGVidWdbXSA9IHtERUJVR19ERUZBVUxULCBERUJVR19ERUZBVUxUfTsKK21vZHVsZV9wYXJhbV9hcnJheShkZWJ1ZywgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJmbGFncyBmb3IgZHJpdmVyIGRlYnVnZ2luZyIpOworCitzdGF0aWMgaW50IGFoYTE1MnhbXSAgID0gezAsIDExLCA3LCAxLCAxLCAxLCBERUxBWV9ERUZBVUxULCAwLCBERUJVR19ERUZBVUxUfTsKK21vZHVsZV9wYXJhbV9hcnJheShhaGExNTJ4LCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhhaGExNTJ4LCAicGFyYW1ldGVycyBmb3IgZmlyc3QgY29udHJvbGxlciIpOworCitzdGF0aWMgaW50IGFoYTE1MngxW10gID0gezAsIDExLCA3LCAxLCAxLCAxLCBERUxBWV9ERUZBVUxULCAwLCBERUJVR19ERUZBVUxUfTsKK21vZHVsZV9wYXJhbV9hcnJheShhaGExNTJ4MSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYWhhMTUyeDEsICJwYXJhbWV0ZXJzIGZvciBzZWNvbmQgY29udHJvbGxlciIpOworI2VuZGlmIC8qICFkZWZpbmVkKEFIQTE1MlhfREVCVUcpICovCisjZW5kaWYgLyogTU9EVUxFICovCisKKyNpZmRlZiBfX0lTQVBOUF9fCitzdGF0aWMgc3RydWN0IGlzYXBucF9kZXZpY2VfaWQgaWRfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXsgSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignQScsJ0QnLCdQJyksIElTQVBOUF9GVU5DVElPTigweDE1MDUpLCAwIH0sCisJeyBJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAorCQlJU0FQTlBfVkVORE9SKCdBJywnRCcsJ1AnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MTUzMCksIDAgfSwKKwl7IElTQVBOUF9ERVZJQ0VfU0lOR0xFX0VORCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaXNhcG5wLCBpZF90YWJsZSk7CisjZW5kaWYgLyogSVNBUE5QICovCisKKyNlbmRpZiAvKiAhUENNQ0lBICovCisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJlZF9jb3VudD0wOworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKmFoYTE1MnhfaG9zdFsyXTsKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgYWhhMTUyeF9kcml2ZXJfdGVtcGxhdGU7CisKKy8qCisgKiBpbnRlcm5hbCBzdGF0ZXMgb2YgdGhlIGhvc3QKKyAqCisgKi8gCitlbnVtIGFoYTE1Mnhfc3RhdGUgeworCWlkbGU9MCwKKwl1bmtub3duLAorCXNlbGRvLAorCXNlbGRpLAorCXNlbHRvLAorCWJ1c2ZyZWUsCisJbXNnbywKKwljbWQsCisJbXNnaSwKKwlzdGF0dXMsCisJZGF0YWksCisJZGF0YW8sCisJcGFyZXJyLAorCXJzdGksCisJbWF4c3RhdGUKK307CisKKy8qCisgKiBjdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uIG9mIHRoZSBob3N0CisgKgorICovCitzdHJ1Y3QgYWhhMTUyeF9ob3N0ZGF0YSB7CisJU2NzaV9DbW5kICppc3N1ZV9TQzsKKwkJLyogcGVuZGluZyBjb21tYW5kcyB0byBpc3N1ZSAqLworCisJU2NzaV9DbW5kICpjdXJyZW50X1NDOworCQkvKiBjdXJyZW50IGNvbW1hbmQgb24gdGhlIGJ1cyAqLworCisJU2NzaV9DbW5kICpkaXNjb25uZWN0ZWRfU0M7CisJCS8qIGNvbW1hbmRzIHRoYXQgZGlzY29ubmVjdGVkICovCisKKwlTY3NpX0NtbmQgKmRvbmVfU0M7CisJCS8qIGNvbW1hbmQgdGhhdCB3YXMgY29tcGxldGVkICovCisKKwlzcGlubG9ja190IGxvY2s7CisJCS8qIGhvc3QgbG9jayAqLworCisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCWNvbnN0IGNoYXIgKmxvY2tlcjsKKwkJLyogd2hpY2ggZnVuY3Rpb24gaGFzIHRoZSBsb2NrICovCisJaW50IGxvY2tlcmw7CS8qIHdoZXJlIGRpZCBpdCBnZXQgaXQgKi8KKworCWludCBkZWJ1ZzsJLyogY3VycmVudCBkZWJ1Z2dpbmcgc2V0dGluZyAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfU1RBVCkKKwlpbnQgICAgICAgICAgIHRvdGFsX2NvbW1hbmRzOworCWludAkgICAgICBkaXNjb25uZWN0aW9uczsKKwlpbnQJICAgICAgYnVzZnJlZV93aXRob3V0X2FueV9hY3Rpb247CisJaW50CSAgICAgIGJ1c2ZyZWVfd2l0aG91dF9vbGRfY29tbWFuZDsKKwlpbnQJICAgICAgYnVzZnJlZV93aXRob3V0X25ld19jb21tYW5kOworCWludAkgICAgICBidXNmcmVlX3dpdGhvdXRfZG9uZV9jb21tYW5kOworCWludAkgICAgICBidXNmcmVlX3dpdGhfY2hlY2tfY29uZGl0aW9uOworCWludCAgICAgICAgICAgY291bnRbbWF4c3RhdGVdOworCWludCAgICAgICAgICAgY291bnRfdHJhbnNbbWF4c3RhdGVdOworCXVuc2lnbmVkIGxvbmcgdGltZVttYXhzdGF0ZV07CisjZW5kaWYKKworCWludCBjb21tYW5kczsJCS8qIGN1cnJlbnQgbnVtYmVyIG9mIGNvbW1hbmRzICovCisKKwlpbnQgcmVjb25uZWN0OwkJLyogZGlzY29ubmVjdGlvbiBhbGxvd2VkICovCisJaW50IHBhcml0eTsJCS8qIHBhcml0eSBjaGVja2luZyBlbmFibGVkICovCisJaW50IHN5bmNocm9ub3VzOwkvKiBzeW5jaHJvbm91cyB0cmFuc2ZlcmVzIGVuYWJsZWQgKi8KKwlpbnQgZGVsYXk7CQkvKiByZXNldCBvdXQgZGVsYXkgKi8KKwlpbnQgZXh0X3RyYW5zOwkJLyogZXh0ZW5kZWQgdHJhbnNsYXRpb24gZW5hYmxlZCAqLworCisJaW50IHN3aW50OyAJCS8qIHNvZnR3YXJlLWludGVycnVwdCB3YXMgZmlyZWQgZHVyaW5nIGRldGVjdCgpICovCisJaW50IHNlcnZpY2U7CQkvKiBiaCBuZWVkcyB0byBiZSBydW4gKi8KKwlpbnQgaW5faW50cjsJCS8qIGJoIGlzIHJ1bm5pbmcgKi8KKworCS8qIGN1cnJlbnQgc3RhdGUsCisJICAgcHJldmlvdXMgc3RhdGUsCisJICAgbGFzdCBzdGF0ZSBkaWZmZXJlbnQgZnJvbSBjdXJyZW50IHN0YXRlICovCisJZW51bSBhaGExNTJ4X3N0YXRlIHN0YXRlLCBwcmV2c3RhdGUsIGxhc3RzdGF0ZTsKKworCWludCB0YXJnZXQ7CisJCS8qIHJlY29ubmVjdGluZyB0YXJnZXQgKi8KKworCXVuc2lnbmVkIGNoYXIgc3luY3JhdGVbOF07CisJCS8qIGN1cnJlbnQgc3luY2hyb25vdXMgdHJhbnNmZXIgYWdyZWVtZW50cyAqLworCisJdW5zaWduZWQgY2hhciBzeW5jbmVnWzhdOworCQkvKiAwOiBubyBuZWdvdGlhdGlvbjsKKwkJICogMTogbmVnb3RpYXRpb24gaW4gcHJvZ3Jlc3M7CisJCSAqIDI6IG5lZ290aWF0aW9uIGNvbXBsZXRlZAorCQkgKi8KKworCWludCBjbWRfaTsKKwkJLyogbnVtYmVyIG9mIHNlbnQgYnl0ZXMgb2YgY3VycmVudCBjb21tYW5kICovCisKKwlpbnQgbXNnaV9sZW47CisJCS8qIG51bWJlciBvZiByZWNlaXZlZCBtZXNzYWdlIGJ5dGVzICovCisJdW5zaWduZWQgY2hhciBtc2dpWzI1Nl07CisJCS8qIHJlY2VpdmVkIG1lc3NhZ2UgYnl0ZXMgKi8KKworCWludCBtc2dvX2ksIG1zZ29fbGVuOwkKKwkJLyogbnVtYmVyIG9mIHNlbnQgYnl0ZXMgYW5kIGxlbmd0aCBvZiBjdXJyZW50IG1lc3NhZ2VzICovCisJdW5zaWduZWQgY2hhciBtc2dvWzI1Nl07CisJCS8qIHBlbmRpbmcgbWVzc2FnZXMgKi8KKworCWludCBkYXRhX2xlbjsKKwkJLyogbnVtYmVyIG9mIHNlbnQvcmVjZWl2ZWQgYnl0ZXMgaW4gZGF0YXBoYXNlICovCisKKwl1bnNpZ25lZCBsb25nIGlvX3BvcnQwOworCXVuc2lnbmVkIGxvbmcgaW9fcG9ydDE7CisKKyNpZmRlZiBfX0lTQVBOUF9fCisJc3RydWN0IHBucF9kZXYgKnBucGRldjsKKyNlbmRpZgorfTsKKworCisvKgorICogaG9zdCBzcGVjaWZpYyBjb21tYW5kIGV4dGVuc2lvbgorICoKKyAqLworc3RydWN0IGFoYTE1Mnhfc2NkYXRhIHsKKwlTY3NpX0NtbmQgKm5leHQ7CS8qIG5leHQgc2MgaW4gcXVldWUgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlICpzZW07CS8qIHNlbWFwaG9yZSB0byBibG9jayBvbiAqLworfTsKKworCisvKiBhY2Nlc3MgbWFjcm9zIGZvciBob3N0ZGF0YSAqLworCisjZGVmaW5lIEhPU1REQVRBKHNocG50KQkJKChzdHJ1Y3QgYWhhMTUyeF9ob3N0ZGF0YSAqKSAmc2hwbnQtPmhvc3RkYXRhKQorCisjZGVmaW5lIEhPU1ROTwkJCSgoc2hwbnQpLT5ob3N0X25vKQorCisjZGVmaW5lIENVUlJFTlRfU0MJCShIT1NUREFUQShzaHBudCktPmN1cnJlbnRfU0MpCisjZGVmaW5lIERPTkVfU0MJCQkoSE9TVERBVEEoc2hwbnQpLT5kb25lX1NDKQorI2RlZmluZSBJU1NVRV9TQwkJKEhPU1REQVRBKHNocG50KS0+aXNzdWVfU0MpCisjZGVmaW5lIERJU0NPTk5FQ1RFRF9TQwkJKEhPU1REQVRBKHNocG50KS0+ZGlzY29ubmVjdGVkX1NDKQorI2RlZmluZSBRTE9DSwkJCShIT1NUREFUQShzaHBudCktPmxvY2spCisjZGVmaW5lIFFMT0NLRVIJCQkoSE9TVERBVEEoc2hwbnQpLT5sb2NrZXIpCisjZGVmaW5lIFFMT0NLRVJMCQkoSE9TVERBVEEoc2hwbnQpLT5sb2NrZXJsKQorCisjZGVmaW5lIFNUQVRFCQkJKEhPU1REQVRBKHNocG50KS0+c3RhdGUpCisjZGVmaW5lIFBSRVZTVEFURQkJKEhPU1REQVRBKHNocG50KS0+cHJldnN0YXRlKQorI2RlZmluZSBMQVNUU1RBVEUJCShIT1NUREFUQShzaHBudCktPmxhc3RzdGF0ZSkKKworI2RlZmluZSBSRUNPTk5fVEFSR0VUCQkoSE9TVERBVEEoc2hwbnQpLT50YXJnZXQpCisKKyNkZWZpbmUgQ01EX0kJCQkoSE9TVERBVEEoc2hwbnQpLT5jbWRfaSkKKworI2RlZmluZSBNU0dPKGkpCQkJKEhPU1REQVRBKHNocG50KS0+bXNnb1tpXSkKKyNkZWZpbmUgTVNHT19JCQkJKEhPU1REQVRBKHNocG50KS0+bXNnb19pKQorI2RlZmluZSBNU0dPTEVOCQkJKEhPU1REQVRBKHNocG50KS0+bXNnb19sZW4pCisjZGVmaW5lIEFERE1TR08oeCkJCShNU0dPTEVOPDI1NiA/ICh2b2lkKShNU0dPKE1TR09MRU4rKyk9eCkgOiBhaGExNTJ4X2Vycm9yKHNocG50LCJNU0dPIG92ZXJmbG93IikpCisKKyNkZWZpbmUgTVNHSShpKQkJCShIT1NUREFUQShzaHBudCktPm1zZ2lbaV0pCisjZGVmaW5lIE1TR0lMRU4JCQkoSE9TVERBVEEoc2hwbnQpLT5tc2dpX2xlbikKKyNkZWZpbmUgQURETVNHSSh4KQkJKE1TR0lMRU48MjU2ID8gKHZvaWQpKE1TR0koTVNHSUxFTisrKT14KSA6IGFoYTE1MnhfZXJyb3Ioc2hwbnQsIk1TR0kgb3ZlcmZsb3ciKSkKKworI2RlZmluZSBEQVRBX0xFTgkJKEhPU1REQVRBKHNocG50KS0+ZGF0YV9sZW4pCisKKyNkZWZpbmUgU1lOQ1JBVEUJCShIT1NUREFUQShzaHBudCktPnN5bmNyYXRlW0NVUlJFTlRfU0MtPmRldmljZS0+aWRdKQorI2RlZmluZSBTWU5DTkVHCQkJKEhPU1REQVRBKHNocG50KS0+c3luY25lZ1tDVVJSRU5UX1NDLT5kZXZpY2UtPmlkXSkKKworI2RlZmluZSBERUxBWQkJCShIT1NUREFUQShzaHBudCktPmRlbGF5KQorI2RlZmluZSBFWFRfVFJBTlMJCShIT1NUREFUQShzaHBudCktPmV4dF90cmFucykKKyNkZWZpbmUgVEMxNTUwCQkJKEhPU1REQVRBKHNocG50KS0+dGMxNTUwKQorI2RlZmluZSBSRUNPTk5FQ1QJCShIT1NUREFUQShzaHBudCktPnJlY29ubmVjdCkKKyNkZWZpbmUgUEFSSVRZCQkJKEhPU1REQVRBKHNocG50KS0+cGFyaXR5KQorI2RlZmluZSBTWU5DSFJPTk9VUwkJKEhPU1REQVRBKHNocG50KS0+c3luY2hyb25vdXMpCisKKyNkZWZpbmUgSE9TVElPUE9SVDAJCShIT1NUREFUQShzaHBudCktPmlvX3BvcnQwKQorI2RlZmluZSBIT1NUSU9QT1JUMQkJKEhPU1REQVRBKHNocG50KS0+aW9fcG9ydDEpCisKKyNkZWZpbmUgU0NEQVRBKFNDcG50KQkJKChzdHJ1Y3QgYWhhMTUyeF9zY2RhdGEgKikgKFNDcG50KS0+aG9zdF9zY3JpYmJsZSkKKyNkZWZpbmUgU0NORVhUKFNDcG50KQkJU0NEQVRBKFNDcG50KS0+bmV4dAorI2RlZmluZSBTQ1NFTShTQ3BudCkJCVNDREFUQShTQ3BudCktPnNlbQorCisjZGVmaW5lIFNHX0FERFJFU1MoYnVmZmVyKQkoKGNoYXIgKikgKHBhZ2VfYWRkcmVzcygoYnVmZmVyKS0+cGFnZSkrKGJ1ZmZlciktPm9mZnNldCkpCisKKy8qIHN0YXRlIGhhbmRsaW5nICovCitzdGF0aWMgdm9pZCBzZWxkaV9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgc2VsZG9fcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKK3N0YXRpYyB2b2lkIHNlbHRvX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CitzdGF0aWMgdm9pZCBidXNmcmVlX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CisKK3N0YXRpYyB2b2lkIG1zZ29faW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CitzdGF0aWMgdm9pZCBtc2dvX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CitzdGF0aWMgdm9pZCBtc2dvX2VuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CisKK3N0YXRpYyB2b2lkIGNtZF9pbml0KHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKK3N0YXRpYyB2b2lkIGNtZF9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgY21kX2VuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CisKK3N0YXRpYyB2b2lkIGRhdGFpX2luaXQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgZGF0YWlfcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKK3N0YXRpYyB2b2lkIGRhdGFpX2VuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CisKK3N0YXRpYyB2b2lkIGRhdGFvX2luaXQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgZGF0YW9fcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKK3N0YXRpYyB2b2lkIGRhdGFvX2VuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CisKK3N0YXRpYyB2b2lkIHN0YXR1c19ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworCitzdGF0aWMgdm9pZCBtc2dpX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CitzdGF0aWMgdm9pZCBtc2dpX2VuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CisKK3N0YXRpYyB2b2lkIHBhcmVycl9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgcnN0aV9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworCitzdGF0aWMgdm9pZCBpc19jb21wbGV0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CisKKy8qCisgKiBkcml2ZXIgc3RhdGVzCisgKgorICovCitzdGF0aWMgc3RydWN0IHsKKwljaGFyCQkqbmFtZTsKKwl2b2lkCQkoKmluaXQpKHN0cnVjdCBTY3NpX0hvc3QgKik7CisJdm9pZAkJKCpydW4pKHN0cnVjdCBTY3NpX0hvc3QgKik7CisJdm9pZAkJKCplbmQpKHN0cnVjdCBTY3NpX0hvc3QgKik7CisJaW50CQlzcGlvOworfSBzdGF0ZXNbXSA9IHsKKwl7ICJpZGxlIiwJTlVMTCwJCU5VTEwsCQlOVUxMLAkJMH0sCisJeyAidW5rbm93biIsCU5VTEwsCQlOVUxMLAkJTlVMTCwJCTB9LAorCXsgInNlbGRvIiwJTlVMTCwJCXNlbGRvX3J1biwJTlVMTCwJCTB9LAorCXsgInNlbGRpIiwJTlVMTCwJCXNlbGRpX3J1biwJTlVMTCwJCTB9LAorCXsgInNlbHRvIiwJTlVMTCwJCXNlbHRvX3J1biwJTlVMTCwJCTB9LAorCXsgImJ1c2ZyZWUiLAlOVUxMLAkJYnVzZnJlZV9ydW4sCU5VTEwsCQkwfSwKKwl7ICJtc2dvIiwJbXNnb19pbml0LAltc2dvX3J1biwJbXNnb19lbmQsCTF9LAorCXsgImNtZCIsCWNtZF9pbml0LAljbWRfcnVuLAljbWRfZW5kLAkxfSwKKwl7ICJtc2dpIiwJTlVMTCwJCW1zZ2lfcnVuLAltc2dpX2VuZCwJMX0sCisJeyAic3RhdHVzIiwJTlVMTCwJCXN0YXR1c19ydW4sCU5VTEwsCQkxfSwKKwl7ICJkYXRhaSIsCWRhdGFpX2luaXQsCWRhdGFpX3J1biwJZGF0YWlfZW5kLAkwfSwKKwl7ICJkYXRhbyIsCWRhdGFvX2luaXQsCWRhdGFvX3J1biwJZGF0YW9fZW5kLAkwfSwKKwl7ICJwYXJlcnIiLAlOVUxMLAkJcGFyZXJyX3J1biwJTlVMTCwJCTB9LAorCXsgInJzdGkiLAlOVUxMLAkJcnN0aV9ydW4sCU5VTEwsCQkwfSwKK307CisKKy8qIHNldHVwICYgaW50ZXJydXB0ICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIHZvaWQgcmVzZXRfcG9ydHMoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgYWhhMTUyeF9lcnJvcihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCwgY2hhciAqbXNnKTsKK3N0YXRpYyB2b2lkIGRvbmUoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQsIGludCBlcnJvcik7CisKKy8qIGRpYWdub3N0aWNzICovCitzdGF0aWMgdm9pZCBkaXNwX3BvcnRzKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKK3N0YXRpYyB2b2lkIHNob3dfY29tbWFuZChTY3NpX0NtbmQgKiBwdHIpOworc3RhdGljIHZvaWQgc2hvd19xdWV1ZXMoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgZGlzcF9lbmludHIoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworCisKKy8qCisgKiAgcXVldWUgc2VydmljZXM6CisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXBwZW5kX1NDKFNjc2lfQ21uZCAqKlNDLCBTY3NpX0NtbmQgKm5ld19TQykKK3sKKwlTY3NpX0NtbmQgKmVuZDsKKworCVNDTkVYVChuZXdfU0MpID0gTlVMTDsKKwlpZiAoISpTQykKKwkJKlNDID0gbmV3X1NDOworCWVsc2UgeworCQlmb3IgKGVuZCA9ICpTQzsgU0NORVhUKGVuZCk7IGVuZCA9IFNDTkVYVChlbmQpKQorCQkJOworCQlTQ05FWFQoZW5kKSA9IG5ld19TQzsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgU2NzaV9DbW5kICpyZW1vdmVfZmlyc3RfU0MoU2NzaV9DbW5kICoqIFNDKQoreworCVNjc2lfQ21uZCAqcHRyOworCisJcHRyID0gKlNDOworCWlmIChwdHIpIHsKKwkJKlNDID0gU0NORVhUKCpTQyk7CisJCVNDTkVYVChwdHIpPU5VTEw7CisJfQorCXJldHVybiBwdHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgU2NzaV9DbW5kICpyZW1vdmVfbHVuX1NDKFNjc2lfQ21uZCAqKiBTQywgaW50IHRhcmdldCwgaW50IGx1bikKK3sKKwlTY3NpX0NtbmQgKnB0ciwgKnByZXY7CisKKwlmb3IgKHB0ciA9ICpTQywgcHJldiA9IE5VTEw7CisJICAgICBwdHIgJiYgKChwdHItPmRldmljZS0+aWQgIT0gdGFyZ2V0KSB8fCAocHRyLT5kZXZpY2UtPmx1biAhPSBsdW4pKTsKKwkgICAgIHByZXYgPSBwdHIsIHB0ciA9IFNDTkVYVChwdHIpKQorCSAgICAgOworCisJaWYgKHB0cikgeworCQlpZiAocHJldikKKwkJCVNDTkVYVChwcmV2KSA9IFNDTkVYVChwdHIpOworCQllbHNlCisJCQkqU0MgPSBTQ05FWFQocHRyKTsKKworCQlTQ05FWFQocHRyKT1OVUxMOworCX0KKworCXJldHVybiBwdHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgU2NzaV9DbW5kICpyZW1vdmVfU0MoU2NzaV9DbW5kICoqU0MsIFNjc2lfQ21uZCAqU0NwKQoreworCVNjc2lfQ21uZCAqcHRyLCAqcHJldjsKKworCWZvciAocHRyID0gKlNDLCBwcmV2ID0gTlVMTDsKKwkgICAgIHB0ciAmJiBTQ3AhPXB0cjsKKwkgICAgIHByZXYgPSBwdHIsIHB0ciA9IFNDTkVYVChwdHIpKQorCSAgICAgOworCisJaWYgKHB0cikgeworCQlpZiAocHJldikKKwkJCVNDTkVYVChwcmV2KSA9IFNDTkVYVChwdHIpOworCQllbHNlCisJCQkqU0MgPSBTQ05FWFQocHRyKTsKKworCQlTQ05FWFQocHRyKT1OVUxMOworCX0KKworCXJldHVybiBwdHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IFNjc2lfSG9zdCAqbG9va3VwX2lycShpbnQgaXJxbm8pCit7CisJaW50IGk7CisKKwlmb3IoaT0wOyBpPEFSUkFZX1NJWkUoYWhhMTUyeF9ob3N0KTsgaSsrKQorCQlpZihhaGExNTJ4X2hvc3RbaV0gJiYgYWhhMTUyeF9ob3N0W2ldLT5pcnE9PWlycW5vKQorCQkJcmV0dXJuIGFoYTE1MnhfaG9zdFtpXTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3dpbnRyKGludCBpcnFubywgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IGxvb2t1cF9pcnEoaXJxbm8pOworCisJaWYgKCFzaHBudCkgeworICAgICAgICAJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4OiBjYXRjaGVkIHNvZnR3YXJlIGludGVycnVwdCAlZCBmb3IgdW5rbm93biBjb250cm9sbGVyLlxuIiwgaXJxbm8pOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJSE9TVERBVEEoc2hwbnQpLT5zd2ludCsrOworCisJU0VUUE9SVChETUFDTlRSTDAsIElOVEVOKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0cnVjdCBTY3NpX0hvc3QgKmFoYTE1MnhfcHJvYmVfb25lKHN0cnVjdCBhaGExNTJ4X3NldHVwICpzZXR1cCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudDsKKworCXNocG50ID0gc2NzaV9ob3N0X2FsbG9jKCZhaGExNTJ4X2RyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBhaGExNTJ4X2hvc3RkYXRhKSk7CisJaWYgKCFzaHBudCkgeworCQlwcmludGsoS0VSTl9FUlIgImFoYTE1Mng6IHNjc2lfaG9zdF9hbGxvYyBmYWlsZWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBuZWVkIHRvIGhhdmUgaG9zdCByZWdpc3RlcmVkIGJlZm9yZSB0cmlnZ2VyaW5nIGFueSBpbnRlcnJ1cHQgKi8KKwlhaGExNTJ4X2hvc3RbcmVnaXN0ZXJlZF9jb3VudF0gPSBzaHBudDsKKworCW1lbXNldChIT1NUREFUQShzaHBudCksIDAsIHNpemVvZiAqSE9TVERBVEEoc2hwbnQpKTsKKworCXNocG50LT5pb19wb3J0ICAgPSBzZXR1cC0+aW9fcG9ydDsKKwlzaHBudC0+bl9pb19wb3J0ID0gSU9fUkFOR0U7CisJc2hwbnQtPmlycSAgICAgICA9IHNldHVwLT5pcnE7CisKKwlpZiAoIXNldHVwLT50YzE1NTApIHsKKwkJSE9TVElPUE9SVDAgPSBzZXR1cC0+aW9fcG9ydDsKKwkJSE9TVElPUE9SVDEgPSBzZXR1cC0+aW9fcG9ydDsKKwl9IGVsc2UgeworCQlIT1NUSU9QT1JUMCA9IHNldHVwLT5pb19wb3J0KzB4MTA7CisJCUhPU1RJT1BPUlQxID0gc2V0dXAtPmlvX3BvcnQtMHgxMDsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmUUxPQ0spOworCVJFQ09OTkVDVCAgID0gc2V0dXAtPnJlY29ubmVjdDsKKwlTWU5DSFJPTk9VUyA9IHNldHVwLT5zeW5jaHJvbm91czsKKwlQQVJJVFkgICAgICA9IHNldHVwLT5wYXJpdHk7CisJREVMQVkgICAgICAgPSBzZXR1cC0+ZGVsYXk7CisJRVhUX1RSQU5TICAgPSBzZXR1cC0+ZXh0X3RyYW5zOworCisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCUhPU1REQVRBKHNocG50KS0+ZGVidWcgPSBzZXR1cC0+ZGVidWc7CisjZW5kaWYKKworCVNFVFBPUlQoU0NTSUlELCBzZXR1cC0+c2NzaWlkIDw8IDQpOworCXNocG50LT50aGlzX2lkID0gc2V0dXAtPnNjc2lpZDsKKworCWlmIChzZXR1cC0+cmVjb25uZWN0KQorCQlzaHBudC0+Y2FuX3F1ZXVlID0gQUhBMTUyWF9NQVhRVUVVRTsKKworCS8qIFJFU0VUIE9VVCAqLworCXByaW50aygiYWhhMTUyeDogcmVzZXR0aW5nIGJ1cy4uLlxuIik7CisJU0VUUE9SVChTQ1NJU0VRLCBTQ1NJUlNUTyk7CisJbWRlbGF5KDI1Nik7CisJU0VUUE9SVChTQ1NJU0VRLCAwKTsKKwltZGVsYXkoREVMQVkpOworCisJcmVzZXRfcG9ydHMoc2hwbnQpOworCisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiYWhhMTUyeCVkJXM6ICIKKwkgICAgICAgInZpdGFsIGRhdGE6IHJldj0leCwgIgorCSAgICAgICAiaW89MHglMDNseCAoMHglMDNseC8weCUwM2x4KSwgIgorCSAgICAgICAiaXJxPSVkLCAiCisJICAgICAgICJzY3NpaWQ9JWQsICIKKwkgICAgICAgInJlY29ubmVjdD0lcywgIgorCSAgICAgICAicGFyaXR5PSVzLCAiCisJICAgICAgICJzeW5jaHJvbm91cz0lcywgIgorCSAgICAgICAiZGVsYXk9JWQsICIKKwkgICAgICAgImV4dGVuZGVkIHRyYW5zbGF0aW9uPSVzXG4iLAorCSAgICAgICBzaHBudC0+aG9zdF9ubywgc2V0dXAtPnRjMTU1MCA/ICIgKHRjMTU1MCBtb2RlKSIgOiAiIiwKKwkgICAgICAgR0VUUE9SVChSRVYpICYgMHg3LAorCSAgICAgICBzaHBudC0+aW9fcG9ydCwgSE9TVElPUE9SVDAsIEhPU1RJT1BPUlQxLAorCSAgICAgICBzaHBudC0+aXJxLAorCSAgICAgICBzaHBudC0+dGhpc19pZCwKKwkgICAgICAgUkVDT05ORUNUID8gImVuYWJsZWQiIDogImRpc2FibGVkIiwKKwkgICAgICAgUEFSSVRZID8gImVuYWJsZWQiIDogImRpc2FibGVkIiwKKwkgICAgICAgU1lOQ0hST05PVVMgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAorCSAgICAgICBERUxBWSwKKwkgICAgICAgRVhUX1RSQU5TID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisKKwkvKiBub3QgZXhwZWN0aW5nIGFueSBpbnRlcnJ1cHRzICovCisJU0VUUE9SVChTSU1PREUwLCAwKTsKKwlTRVRQT1JUKFNJTU9ERTEsIDApOworCisJaWYoIHJlcXVlc3RfaXJxKHNocG50LT5pcnEsIHN3aW50ciwgU0FfSU5URVJSVVBUfFNBX1NISVJRLCAiYWhhMTUyeCIsIHNocG50KSApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4JWQ6IGlycSAlZCBidXN5LlxuIiwgc2hwbnQtPmhvc3Rfbm8sIHNocG50LT5pcnEpOworCQlnb3RvIG91dF9ob3N0X3B1dDsKKwl9CisKKwlIT1NUREFUQShzaHBudCktPnN3aW50ID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gImFoYTE1MnglZDogdHJ5aW5nIHNvZnR3YXJlIGludGVycnVwdCwgIiwgc2hwbnQtPmhvc3Rfbm8pOworCisJbWIoKTsKKwlTRVRQT1JUKERNQUNOVFJMMCwgU1dJTlR8SU5URU4pOworCW1kZWxheSgxMDAwKTsKKwlmcmVlX2lycShzaHBudC0+aXJxLCBzaHBudCk7CisKKwlpZiAoIUhPU1REQVRBKHNocG50KS0+c3dpbnQpIHsKKwkJaWYgKFRFU1RISShETUFTVEFULCBJTlRTVEFUKSkgeworCQkJcHJpbnRrKCJsb3N0LlxuIik7CisJCX0gZWxzZSB7CisJCQlwcmludGsoImZhaWxlZC5cbiIpOworCQl9CisKKwkJU0VUUE9SVChETUFDTlRSTDAsIElOVEVOKTsKKworCQlwcmludGsoS0VSTl9FUlIgImFoYTE1MnglZDogaXJxICVkIHBvc3NpYmx5IHdyb25nLiAgIgorCQkJCSJQbGVhc2UgdmVyaWZ5LlxuIiwgc2hwbnQtPmhvc3Rfbm8sIHNocG50LT5pcnEpOworCQlnb3RvIG91dF9ob3N0X3B1dDsKKwl9CisJcHJpbnRrKCJvay5cbiIpOworCisKKwkvKiBjbGVhciBpbnRlcnJ1cHRzICovCisJU0VUUE9SVChTU1RBVDAsIDB4N2YpOworCVNFVFBPUlQoU1NUQVQxLCAweGVmKTsKKworCWlmICggcmVxdWVzdF9pcnEoc2hwbnQtPmlycSwgaW50ciwgU0FfSU5URVJSVVBUfFNBX1NISVJRLCAiYWhhMTUyeCIsIHNocG50KSApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4JWQ6IGZhaWxlZCB0byByZWFzc2lnbiBpcnEgJWQuXG4iLCBzaHBudC0+aG9zdF9ubywgc2hwbnQtPmlycSk7CisJCWdvdG8gb3V0X2hvc3RfcHV0OworCX0KKworCWlmKCBzY3NpX2FkZF9ob3N0KHNocG50LCBOVUxMKSApIHsKKwkJZnJlZV9pcnEoc2hwbnQtPmlycSwgc2hwbnQpOworCQlwcmludGsoS0VSTl9FUlIgImFoYTE1MnglZDogZmFpbGVkIHRvIGFkZCBob3N0LlxuIiwgc2hwbnQtPmhvc3Rfbm8pOworCQlnb3RvIG91dF9ob3N0X3B1dDsKKwl9CisKKwlzY3NpX3NjYW5faG9zdChzaHBudCk7CisKKwlyZWdpc3RlcmVkX2NvdW50Kys7CisKKwlyZXR1cm4gc2hwbnQ7CisKK291dF9ob3N0X3B1dDoKKwlhaGExNTJ4X2hvc3RbcmVnaXN0ZXJlZF9jb3VudF09TlVMTDsKKwlzY3NpX2hvc3RfcHV0KHNocG50KTsKKworCXJldHVybiBOVUxMOworfQorCit2b2lkIGFoYTE1MnhfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpZighc2hwbnQpCisJCXJldHVybjsKKworCWlmIChzaHBudC0+aXJxKQorCQlmcmVlX2lycShzaHBudC0+aXJxLCBzaHBudCk7CisKKyNpZiAhZGVmaW5lZChQQ01DSUEpCisJaWYgKHNocG50LT5pb19wb3J0KQorCQlyZWxlYXNlX3JlZ2lvbihzaHBudC0+aW9fcG9ydCwgSU9fUkFOR0UpOworI2VuZGlmCisKKyNpZmRlZiBfX0lTQVBOUF9fCisJaWYgKEhPU1REQVRBKHNocG50KS0+cG5wZGV2KQorCQlwbnBfZGV2aWNlX2RldGFjaChIT1NUREFUQShzaHBudCktPnBucGRldik7CisjZW5kaWYKKworCXNjc2lfcmVtb3ZlX2hvc3Qoc2hwbnQpOworCXNjc2lfaG9zdF9wdXQoc2hwbnQpOworfQorCisKKy8qCisgKiBzZXR1cCBjb250cm9sbGVyIHRvIGdlbmVyYXRlIGludGVycnVwdHMgZGVwZW5kaW5nCisgKiBvbiBjdXJyZW50IHN0YXRlIChsb2NrIGhhcyB0byBiZSBhY3F1aXJlZCkKKyAqCisgKi8gCitzdGF0aWMgaW50IHNldHVwX2V4cGVjdGVkX2ludGVycnVwdHMoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaWYoQ1VSUkVOVF9TQykgeworCQlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgfD0gMSA8PCAxNjsKKwkKKwkJaWYoQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICYgc2VsZWN0aW5nKSB7CisJCQlEUFJJTlRLKGRlYnVnX2ludHIsIERFQlVHX0xFQUQgImV4cGVjdGluZzogKHNlbGRvKSAoc2VsdGltbykgKHNlbGRpKVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCQlTRVRQT1JUKFNTVEFUMSwgU0VMVE8pOworCQkJU0VUUE9SVChTSU1PREUwLCBFTlNFTERPIHwgKERJU0NPTk5FQ1RFRF9TQyA/IEVOU0VMREkgOiAwKSk7CisJCQlTRVRQT1JUKFNJTU9ERTEsIEVOU0VMVElNTyk7CisJCX0gZWxzZSB7CisJCQlEUFJJTlRLKGRlYnVnX2ludHIsIERFQlVHX0xFQUQgImV4cGVjdGluZzogKHBoYXNlIGNoYW5nZSkgKGJ1c2ZyZWUpICVzXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBzcGlvcmR5ID8gIihzcGlvcmR5KSIgOiAiIik7CisJCQlTRVRQT1JUKFNJTU9ERTAsIChDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBzcGlvcmR5KSA/IEVOU1BJT1JEWSA6IDApOworCQkJU0VUUE9SVChTSU1PREUxLCBFTlBIQVNFTUlTIHwgRU5TQ1NJUlNUIHwgRU5TQ1NJUEVSUiB8IEVOQlVTRlJFRSk7IAorCQl9CisJfSBlbHNlIGlmKFNUQVRFPT1zZWxkaSkgeworCQlEUFJJTlRLKGRlYnVnX2ludHIsIERFQlVHX0xFQUQgImV4cGVjdGluZzogKHBoYXNlIGNoYW5nZSkgKGlkZW50aWZ5KVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCVNFVFBPUlQoU0lNT0RFMCwgMCk7CisJCVNFVFBPUlQoU0lNT0RFMSwgRU5QSEFTRU1JUyB8IEVOU0NTSVJTVCB8IEVOU0NTSVBFUlIgfCBFTkJVU0ZSRUUpOyAKKwl9IGVsc2UgeworCQlEUFJJTlRLKGRlYnVnX2ludHIsIERFQlVHX0xFQUQgImV4cGVjdGluZzogJXMgJXNcbiIsCisJCQlDTURJTkZPKENVUlJFTlRfU0MpLAorCQkJRElTQ09OTkVDVEVEX1NDID8gIihyZXNlbGVjdGlvbikiIDogIiIsCisJCQlJU1NVRV9TQyA/ICIoYnVzZnJlZSkiIDogIiIpOworCQlTRVRQT1JUKFNJTU9ERTAsIERJU0NPTk5FQ1RFRF9TQyA/IEVOU0VMREkgOiAwKTsKKwkJU0VUUE9SVChTSU1PREUxLCBFTlNDU0lSU1QgfCAoIChJU1NVRV9TQ3x8RE9ORV9TQykgPyBFTkJVU0ZSRUUgOiAwKSk7CisJfQorCisJaWYoIUhPU1REQVRBKHNocG50KS0+aW5faW50cikKKwkJU0VUQklUUyhETUFDTlRSTDAsIElOVEVOKTsKKworCXJldHVybiBURVNUSEkoRE1BU1RBVCwgSU5UU1RBVCk7Cit9CisKKworLyogCisgKiAgUXVldWUgYSBjb21tYW5kIGFuZCBzZXR1cCBpbnRlcnJ1cHRzIGZvciBhIGZyZWUgYnVzLgorICovCitzdGF0aWMgaW50IGFoYTE1MnhfaW50ZXJuYWxfcXVldWUoU2NzaV9DbW5kICpTQ3BudCwgc3RydWN0IHNlbWFwaG9yZSAqc2VtLCBpbnQgcGhhc2UsIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJaWYgKEhPU1REQVRBKHNocG50KS0+ZGVidWcgJiBkZWJ1Z19xdWV1ZSkgeworCQlwcmludGsoSU5GT19MRUFEICJxdWV1ZTogJXA7IGNtZF9sZW49JWQgcGllY2VzPSVkIHNpemU9JXUgY21uZD0iLAorCQkgICAgICAgQ01ESU5GTyhTQ3BudCksIFNDcG50LCBTQ3BudC0+Y21kX2xlbiwgU0NwbnQtPnVzZV9zZywgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbik7CisJCXByaW50X2NvbW1hbmQoU0NwbnQtPmNtbmQpOworCX0KKyNlbmRpZgorCisJU0NwbnQtPnNjc2lfZG9uZQk9IGRvbmU7CisJU0NwbnQtPnJlc2lkIAkJPSBTQ3BudC0+cmVxdWVzdF9idWZmbGVuOworCVNDcG50LT5TQ3AucGhhc2UJPSBub3RfaXNzdWVkIHwgcGhhc2U7CisJU0NwbnQtPlNDcC5TdGF0dXMJPSBDSEVDS19DT05ESVRJT047CisJU0NwbnQtPlNDcC5NZXNzYWdlCT0gMDsKKwlTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbgk9IDA7CisJU0NwbnQtPlNDcC5zZW50X2NvbW1hbmQJPSAwOworCisJaWYoU0NwbnQtPlNDcC5waGFzZSAmIChyZXNldHRpbmd8Y2hlY2tfY29uZGl0aW9uKSkgeworCQlpZihTQ3BudC0+aG9zdF9zY3JpYmJsZT09MCB8fCBTQ1NFTShTQ3BudCkgfHwgU0NORVhUKFNDcG50KSkgeworCQkJcHJpbnRrKEVSUl9MRUFEICJjYW5ub3QgcmV1c2UgY29tbWFuZFxuIiwgQ01ESU5GTyhTQ3BudCkpOworCQkJcmV0dXJuIEZBSUxFRDsKKwkJfQorCX0gZWxzZSB7CisJCVNDcG50LT5ob3N0X3NjcmliYmxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFoYTE1Mnhfc2NkYXRhKSwgR0ZQX0FUT01JQyk7CisJCWlmKFNDcG50LT5ob3N0X3NjcmliYmxlPT0wKSB7CisJCQlwcmludGsoRVJSX0xFQUQgImFsbG9jYXRpb24gZmFpbGVkXG4iLCBDTURJTkZPKFNDcG50KSk7CisJCQlyZXR1cm4gRkFJTEVEOworCQl9CisJfQorCisJU0NORVhUKFNDcG50KQkJPSBOVUxMOworCVNDU0VNKFNDcG50KQkJPSBzZW07CisKKwkvKiBzZXR1cCBzY3JhdGNoIGFyZWEKKwkgICBTQ3AucHRyICAgICAgICAgICAgICA6IGJ1ZmZlciBwb2ludGVyCisJICAgU0NwLnRoaXNfcmVzaWR1YWwgICAgOiBidWZmZXIgbGVuZ3RoCisJICAgU0NwLmJ1ZmZlciAgICAgICAgICAgOiBuZXh0IGJ1ZmZlcgorCSAgIFNDcC5idWZmZXJzX3Jlc2lkdWFsIDogbGVmdCBidWZmZXJzIGluIGxpc3QKKwkgICBTQ3AucGhhc2UgICAgICAgICAgICA6IGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbW1hbmQgKi8KKwlpZiAoU0NwbnQtPnVzZV9zZykgeworCQlTQ3BudC0+U0NwLmJ1ZmZlciAgICAgICAgICAgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwkJU0NwbnQtPlNDcC5wdHIgICAgICAgICAgICAgID0gU0dfQUREUkVTUyhTQ3BudC0+U0NwLmJ1ZmZlcik7CisJCVNDcG50LT5TQ3AudGhpc19yZXNpZHVhbCAgICA9IFNDcG50LT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJCVNDcG50LT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IFNDcG50LT51c2Vfc2cgLSAxOworCX0gZWxzZSB7CisJCVNDcG50LT5TQ3AucHRyICAgICAgICAgICAgICA9IChjaGFyICopIFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwkJU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsICAgID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJU0NwbnQtPlNDcC5idWZmZXIgICAgICAgICAgID0gTlVMTDsKKwkJU0NwbnQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gMDsKKwl9CisKKwlET19MT0NLKGZsYWdzKTsKKworI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQorCUhPU1REQVRBKHNocG50KS0+dG90YWxfY29tbWFuZHMrKzsKKyNlbmRpZgorCisJLyogVHVybiBsZWQgb24sIHdoZW4gdGhpcyBpcyB0aGUgZmlyc3QgY29tbWFuZC4gKi8KKwlIT1NUREFUQShzaHBudCktPmNvbW1hbmRzKys7CisJaWYgKEhPU1REQVRBKHNocG50KS0+Y29tbWFuZHM9PTEpCisJCVNFVFBPUlQoUE9SVEEsIDEpOworCisJYXBwZW5kX1NDKCZJU1NVRV9TQywgU0NwbnQpOworCisJaWYoIUhPU1REQVRBKHNocG50KS0+aW5faW50cikKKwkJc2V0dXBfZXhwZWN0ZWRfaW50ZXJydXB0cyhzaHBudCk7CisKKwlET19VTkxPQ0soZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgcXVldWUgYSBjb21tYW5kCisgKgorICovCitzdGF0aWMgaW50IGFoYTE1MnhfcXVldWUoU2NzaV9DbW5kICpTQ3BudCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKK3sKKyNpZiAwCisJaWYoKlNDcG50LT5jbW5kID09IFJFUVVFU1RfU0VOU0UpIHsKKwkJU0NwbnQtPnJlc3VsdCA9IDA7CisJCWRvbmUoU0NwbnQpOworCisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCisJcmV0dXJuIGFoYTE1MnhfaW50ZXJuYWxfcXVldWUoU0NwbnQsIE5VTEwsIDAsIGRvbmUpOworfQorCisKKy8qCisgKiAgCisgKgorICovCitzdGF0aWMgdm9pZCByZXNldF9kb25lKFNjc2lfQ21uZCAqU0NwbnQpCit7CisjaWYgMAorCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gU0NwbnQtPmhvc3Q7CisJRFBSSU5USyhkZWJ1Z19laCwgSU5GT19MRUFEICJyZXNldF9kb25lIGNhbGxlZFxuIiwgQ01ESU5GTyhTQ3BudCkpOworI2VuZGlmCisJaWYoU0NTRU0oU0NwbnQpKSB7CisJCXVwKFNDU0VNKFNDcG50KSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4OiByZXNldF9kb25lIHcvbyBzZW1hcGhvcmVcbiIpOworCX0KK30KKworLyoKKyAqICBBYm9ydCBhIGNvbW1hbmQKKyAqCisgKi8KK3N0YXRpYyBpbnQgYWhhMTUyeF9hYm9ydChTY3NpX0NtbmQgKlNDcG50KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gU0NwbnQtPmRldmljZS0+aG9zdDsKKwlTY3NpX0NtbmQgKnB0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCWlmKEhPU1REQVRBKHNocG50KS0+ZGVidWcgJiBkZWJ1Z19laCkgeworCQlwcmludGsoREVCVUdfTEVBRCAiYWJvcnQoJXApIiwgQ01ESU5GTyhTQ3BudCksIFNDcG50KTsKKwkJc2hvd19xdWV1ZXMoc2hwbnQpOworCX0KKyNlbmRpZgorCisJRE9fTE9DSyhmbGFncyk7CisKKwlwdHI9cmVtb3ZlX1NDKCZJU1NVRV9TQywgU0NwbnQpOworCisJaWYocHRyKSB7CisJCURQUklOVEsoZGVidWdfZWgsIERFQlVHX0xFQUQgIm5vdCB5ZXQgaXNzdWVkIC0gU1VDQ0VTU1xuIiwgQ01ESU5GTyhTQ3BudCkpOworCisJCUhPU1REQVRBKHNocG50KS0+Y29tbWFuZHMtLTsKKwkJaWYgKCFIT1NUREFUQShzaHBudCktPmNvbW1hbmRzKQorCQkJU0VUUE9SVChQT1JUQSwgMCk7CisJCURPX1VOTE9DSyhmbGFncyk7CisKKwkJa2ZyZWUoU0NwbnQtPmhvc3Rfc2NyaWJibGUpOworCQlTQ3BudC0+aG9zdF9zY3JpYmJsZT1OVUxMOworCisJCXJldHVybiBTVUNDRVNTOworCX0gCisKKwlET19VTkxPQ0soZmxhZ3MpOworCisJLyoKKwkgKiBGSVhNRToKKwkgKiBmb3IgY3VycmVudCBjb21tYW5kOiBxdWV1ZSBBQk9SVCBmb3IgbWVzc2FnZSBvdXQgYW5kIHJhaXNlIEFUTgorCSAqIGZvciBkaXNjb25uZWN0ZWQgY29tbWFuZDogcHNldWRvIFNDIHdpdGggQUJPUlQgbWVzc2FnZSBvciBBQk9SVCBvbiByZXNlbGVjdGlvbj8KKwkgKgorCSAqLworCisJcHJpbnRrKEVSUl9MRUFEICJjYW5ub3QgYWJvcnQgcnVubmluZyBvciBkaXNjb25uZWN0ZWQgY29tbWFuZFxuIiwgQ01ESU5GTyhTQ3BudCkpOworCisJcmV0dXJuIEZBSUxFRDsKK30KKworc3RhdGljIHZvaWQgdGltZXJfZXhwaXJlZCh1bnNpZ25lZCBsb25nIHApCit7CisJU2NzaV9DbW5kCSAqU0NwICAgPSAoU2NzaV9DbW5kICopcDsKKwlzdHJ1Y3Qgc2VtYXBob3JlICpzZW0gICA9IFNDU0VNKFNDcCk7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBTQ3AtPmRldmljZS0+aG9zdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogcmVtb3ZlIGNvbW1hbmQgZnJvbSBpc3N1ZSBxdWV1ZSAqLworCURPX0xPQ0soZmxhZ3MpOworCXJlbW92ZV9TQygmSVNTVUVfU0MsIFNDcCk7CisJRE9fVU5MT0NLKGZsYWdzKTsKKworCXVwKHNlbSk7Cit9CisKKy8qCisgKiBSZXNldCBhIGRldmljZQorICoKKyAqLworc3RhdGljIGludCBhaGExNTJ4X2RldmljZV9yZXNldChTY3NpX0NtbmQgKiBTQ3BudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IFNDcG50LT5kZXZpY2UtPmhvc3Q7CisJREVDTEFSRV9NVVRFWF9MT0NLRUQoc2VtKTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlpbnQgcmV0LCBpc3N1ZWQsIGRpc2Nvbm5lY3RlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCWlmKEhPU1REQVRBKHNocG50KS0+ZGVidWcgJiBkZWJ1Z19laCkgeworCQlwcmludGsoSU5GT19MRUFEICJhaGExNTJ4X2RldmljZV9yZXNldCglcCkiLCBDTURJTkZPKFNDcG50KSwgU0NwbnQpOworCQlzaG93X3F1ZXVlcyhzaHBudCk7CisJfQorI2VuZGlmCisKKwlpZihDVVJSRU5UX1NDPT1TQ3BudCkgeworCQlwcmludGsoRVJSX0xFQUQgImNhbm5vdCByZXNldCBjdXJyZW50IGRldmljZVxuIiwgQ01ESU5GTyhTQ3BudCkpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCURPX0xPQ0soZmxhZ3MpOworCWlzc3VlZCAgICAgICA9IHJlbW92ZV9TQygmSVNTVUVfU0MsIFNDcG50KT09MDsKKwlkaXNjb25uZWN0ZWQgPSBpc3N1ZWQgJiYgcmVtb3ZlX1NDKCZESVNDT05ORUNURURfU0MsIFNDcG50KTsKKwlET19VTkxPQ0soZmxhZ3MpOworCisJU0NwbnQtPmNtZF9sZW4gICAgICAgICA9IDA7CisJU0NwbnQtPnVzZV9zZyAgICAgICAgICA9IDA7CisJU0NwbnQtPnJlcXVlc3RfYnVmZmVyICA9IE5VTEw7CisJU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiA9IDA7CisKKwlpbml0X3RpbWVyKCZ0aW1lcik7CisJdGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZykgU0NwbnQ7CisJdGltZXIuZXhwaXJlcyAgPSBqaWZmaWVzICsgMTAwKkhaOyAgIC8qIDEwcyAqLworCXRpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKSB0aW1lcl9leHBpcmVkOworCisJYWhhMTUyeF9pbnRlcm5hbF9xdWV1ZShTQ3BudCwgJnNlbSwgcmVzZXR0aW5nLCByZXNldF9kb25lKTsKKwlhZGRfdGltZXIoJnRpbWVyKTsKKwlkb3duKCZzZW0pOworCWRlbF90aW1lcigmdGltZXIpOworCQorCVNDcG50LT5jbWRfbGVuICAgICAgICAgPSBTQ3BudC0+b2xkX2NtZF9sZW47CisJU0NwbnQtPnVzZV9zZyAgICAgICAgICA9IFNDcG50LT5vbGRfdXNlX3NnOworICAJU0NwbnQtPnJlcXVlc3RfYnVmZmVyICA9IFNDcG50LT5idWZmZXI7CisgICAgICAgCVNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gPSBTQ3BudC0+YnVmZmxlbjsKKworCURPX0xPQ0soZmxhZ3MpOworCisJaWYoU0NwbnQtPlNDcC5waGFzZSAmIHJlc2V0dGVkKSB7CisJCUhPU1REQVRBKHNocG50KS0+Y29tbWFuZHMtLTsKKwkJaWYgKCFIT1NUREFUQShzaHBudCktPmNvbW1hbmRzKQorCQkJU0VUUE9SVChQT1JUQSwgMCk7CisJCWtmcmVlKFNDcG50LT5ob3N0X3NjcmliYmxlKTsKKwkJU0NwbnQtPmhvc3Rfc2NyaWJibGU9TlVMTDsKKworCQlyZXQgPSBTVUNDRVNTOworCX0gZWxzZSB7CisJCS8qIHJlcXVldWUgKi8KKwkJaWYoIWlzc3VlZCkgeworCQkJYXBwZW5kX1NDKCZJU1NVRV9TQywgU0NwbnQpOworCQl9IGVsc2UgaWYoZGlzY29ubmVjdGVkKSB7CisJCQlhcHBlbmRfU0MoJkRJU0NPTk5FQ1RFRF9TQywgU0NwbnQpOworCQl9CisJCisJCXJldCA9IEZBSUxFRDsKKwl9CisKKwlET19VTkxPQ0soZmxhZ3MpOworCisJc3Bpbl9sb2NrX2lycShzaHBudC0+aG9zdF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBmcmVlX2hhcmRfcmVzZXRfU0NzKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50LCBTY3NpX0NtbmQgKipTQ3MpCit7CisJU2NzaV9DbW5kICpwdHI7CisKKwlwdHI9KlNDczsKKwl3aGlsZShwdHIpIHsKKwkJU2NzaV9DbW5kICpuZXh0OworCisJCWlmKFNDREFUQShwdHIpKSB7CisJCQluZXh0ID0gU0NORVhUKHB0cik7CisJCX0gZWxzZSB7CisJCQlwcmludGsoREVCVUdfTEVBRCAicXVldWUgY29ycnVwdGVkIGF0ICVwXG4iLCBDTURJTkZPKHB0ciksIHB0cik7CisJCQluZXh0ID0gTlVMTDsKKwkJfQorCisJCWlmICghcHRyLT5kZXZpY2UtPnNvZnRfcmVzZXQpIHsKKwkJCURQUklOVEsoZGVidWdfZWgsIERFQlVHX0xFQUQgImRpc2Nvbm5lY3RlZCBjb21tYW5kICVwIHJlbW92ZWRcbiIsIENNRElORk8ocHRyKSwgcHRyKTsKKwkJCXJlbW92ZV9TQyhTQ3MsIHB0cik7CisJCQlIT1NUREFUQShzaHBudCktPmNvbW1hbmRzLS07CisJCQlrZnJlZShwdHItPmhvc3Rfc2NyaWJibGUpOworCQkJcHRyLT5ob3N0X3NjcmliYmxlPU5VTEw7CisJCX0KKworCQlwdHIgPSBuZXh0OworCX0KK30KKworLyoKKyAqIFJlc2V0IHRoZSBidXMKKyAqCisgKi8KK3N0YXRpYyBpbnQgYWhhMTUyeF9idXNfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IFNDcG50LT5kZXZpY2UtPmhvc3Q7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURPX0xPQ0soZmxhZ3MpOworCisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCWlmKEhPU1REQVRBKHNocG50KS0+ZGVidWcgJiBkZWJ1Z19laCkgeworCQlwcmludGsoREVCVUdfTEVBRCAiYWhhMTUyeF9idXNfcmVzZXQoJXApIiwgQ01ESU5GTyhTQ3BudCksIFNDcG50KTsKKwkJc2hvd19xdWV1ZXMoc2hwbnQpOworCX0KKyNlbmRpZgorCisJZnJlZV9oYXJkX3Jlc2V0X1NDcyhzaHBudCwgJklTU1VFX1NDKTsKKwlmcmVlX2hhcmRfcmVzZXRfU0NzKHNocG50LCAmRElTQ09OTkVDVEVEX1NDKTsKKworCURQUklOVEsoZGVidWdfZWgsIERFQlVHX0xFQUQgInJlc2V0dGluZyBidXNcbiIsIENNRElORk8oU0NwbnQpKTsKKworCVNFVFBPUlQoU0NTSVNFUSwgU0NTSVJTVE8pOworCW1kZWxheSgyNTYpOworCVNFVFBPUlQoU0NTSVNFUSwgMCk7CisJbWRlbGF5KERFTEFZKTsKKworCURQUklOVEsoZGVidWdfZWgsIERFQlVHX0xFQUQgImJ1cyByZXNldHRlZFxuIiwgQ01ESU5GTyhTQ3BudCkpOworCisJc2V0dXBfZXhwZWN0ZWRfaW50ZXJydXB0cyhzaHBudCk7CisJaWYoSE9TVERBVEEoc2hwbnQpLT5jb21tYW5kcz09MCkKKwkJU0VUUE9SVChQT1JUQSwgMCk7CisKKwlET19VTkxPQ0soZmxhZ3MpOworCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKworLyoKKyAqICBSZXN0b3JlIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBBSUMtNjI2MCByZWdpc3RlcnMgYW5kIHJlc2V0IHRoZSBmaWZvcworICoKKyAqLworc3RhdGljIHZvaWQgcmVzZXRfcG9ydHMoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCVNFVFBPUlQoRE1BQ05UUkwwLCBSU1RGSUZPKTsKKworCVNFVFBPUlQoU0NTSVNFUSwgMCk7CisKKwlTRVRQT1JUKFNYRlJDVEwxLCAwKTsKKwlTRVRQT1JUKFNDU0lTSUcsIDApOworCVNFVFJBVEUoMCk7CisKKwkvKiBjbGVhciBhbGwgaW50ZXJydXB0IGNvbmRpdGlvbnMgKi8KKwlTRVRQT1JUKFNTVEFUMCwgMHg3Zik7CisJU0VUUE9SVChTU1RBVDEsIDB4ZWYpOworCisJU0VUUE9SVChTU1RBVDQsIFNZTkNFUlIgfCBGV0VSUiB8IEZSRVJSKTsKKworCVNFVFBPUlQoRE1BQ05UUkwwLCAwKTsKKwlTRVRQT1JUKERNQUNOVFJMMSwgMCk7CisKKwlTRVRQT1JUKEJSU1RDTlRSTCwgMHhmMSk7CisKKwkvKiBjbGVhciBTQ1NJIGZpZm9zIGFuZCB0cmFuc2ZlciBjb3VudCAqLworCVNFVFBPUlQoU1hGUkNUTDAsIENIMXxDTFJDSDF8Q0xSU1RDTlQpOworCVNFVFBPUlQoU1hGUkNUTDAsIENIMSk7CisKKwlET19MT0NLKGZsYWdzKTsKKwlzZXR1cF9leHBlY3RlZF9pbnRlcnJ1cHRzKHNocG50KTsKKwlET19VTkxPQ0soZmxhZ3MpOworfQorCisvKgorICogUmVzZXQgdGhlIGhvc3QgKGJ1cyBhbmQgY29udHJvbGxlcikKKyAqCisgKi8KK2ludCBhaGExNTJ4X2hvc3RfcmVzZXQoU2NzaV9DbW5kICogU0NwbnQpCit7CisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gU0NwbnQtPmRldmljZS0+aG9zdDsKKyNlbmRpZgorCisJRFBSSU5USyhkZWJ1Z19laCwgREVCVUdfTEVBRCAiYWhhMTUyeF9ob3N0X3Jlc2V0KCVwKVxuIiwgQ01ESU5GTyhTQ3BudCksIFNDcG50KTsKKworCWFoYTE1MnhfYnVzX3Jlc2V0KFNDcG50KTsKKworCURQUklOVEsoZGVidWdfZWgsIERFQlVHX0xFQUQgInJlc2V0dGluZyBwb3J0c1xuIiwgQ01ESU5GTyhTQ3BudCkpOworCXJlc2V0X3BvcnRzKFNDcG50LT5kZXZpY2UtPmhvc3QpOworCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlICJsb2dpY2FsIGdlb21ldHJ5IgorICoKKyAqLworc3RhdGljIGludCBhaGExNTJ4X2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKmluZm9fYXJyYXkpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBzZGV2LT5ob3N0OworCisJLyogdHJ5IGRlZmF1bHQgdHJhbnNsYXRpb24gKi8KKwlpbmZvX2FycmF5WzBdID0gNjQ7CisJaW5mb19hcnJheVsxXSA9IDMyOworCWluZm9fYXJyYXlbMl0gPSAodW5zaWduZWQgbG9uZyljYXBhY2l0eSAvICg2NCAqIDMyKTsKKworCS8qIGZvciBkaXNrcyA+MUdCIGRvIHNvbWUgZ3Vlc3NpbmcgKi8KKwlpZiAoaW5mb19hcnJheVsyXSA+PSAxMDI0KSB7CisJCWludCBpbmZvWzNdOworCisJCS8qIHRyeSB0byBmaWd1cmUgb3V0IHRoZSBnZW9tZXRyeSBmcm9tIHRoZSBwYXJ0aXRpb24gdGFibGUgKi8KKwkJaWYgKHNjc2ljYW1fYmlvc19wYXJhbShiZGV2LCBjYXBhY2l0eSwgaW5mbykgPCAwIHx8CisJCSAgICAhKChpbmZvWzBdID09IDY0ICYmIGluZm9bMV0gPT0gMzIpIHx8IChpbmZvWzBdID09IDI1NSAmJiBpbmZvWzFdID09IDYzKSkpIHsKKwkJCWlmIChFWFRfVFJBTlMpIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCQkgICAgICAgImFoYTE1Mng6IHVuYWJsZSB0byB2ZXJpZnkgZ2VvbWV0cnkgZm9yIGRpc2sgd2l0aCA+MUdCLlxuIgorCQkJCSAgICAgICAiICAgICAgICAgdXNpbmcgZXh0ZW5kZWQgdHJhbnNsYXRpb24uXG4iKTsKKwkJCQlpbmZvX2FycmF5WzBdID0gMjU1OworCQkJCWluZm9fYXJyYXlbMV0gPSA2MzsKKwkJCQlpbmZvX2FycmF5WzJdID0gKHVuc2lnbmVkIGxvbmcpY2FwYWNpdHkgLyAoMjU1ICogNjMpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCQkgICAgICAgImFoYTE1Mng6IHVuYWJsZSB0byB2ZXJpZnkgZ2VvbWV0cnkgZm9yIGRpc2sgd2l0aCA+MUdCLlxuIgorCQkJCSAgICAgICAiICAgICAgICAgVXNpbmcgZGVmYXVsdCB0cmFuc2xhdGlvbi4gUGxlYXNlIHZlcmlmeSB5b3Vyc2VsZi5cbiIKKwkJCQkgICAgICAgIiAgICAgICAgIFBlcmhhcHMgeW91IG5lZWQgdG8gZW5hYmxlIGV4dGVuZGVkIHRyYW5zbGF0aW9uIGluIHRoZSBkcml2ZXIuXG4iCisJCQkJICAgICAgICIgICAgICAgICBTZWUgRG9jdW1lbnRhdGlvbi9zY3NpL2FoYTE1MngudHh0IGZvciBkZXRhaWxzLlxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpbmZvX2FycmF5WzBdID0gaW5mb1swXTsKKwkJCWluZm9fYXJyYXlbMV0gPSBpbmZvWzFdOworCQkJaW5mb19hcnJheVsyXSA9IGluZm9bMl07CisKKwkJCWlmIChpbmZvWzBdID09IDI1NSAmJiAhRVhUX1RSQU5TKSB7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFCisJCQkJICAgICAgICJhaGExNTJ4OiBjdXJyZW50IHBhcnRpdGlvbiB0YWJsZSBpcyB1c2luZyBleHRlbmRlZCB0cmFuc2xhdGlvbi5cbiIKKwkJCQkgICAgICAgIiAgICAgICAgIHVzaW5nIGl0IGFsc28sIGFsdGhvdWdoIGl0J3Mgbm90IGV4cGxpY2l0bHkgZW5hYmxlZC5cbiIpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgSW50ZXJuYWwgZG9uZSBmdW5jdGlvbgorICoKKyAqLworc3RhdGljIHZvaWQgZG9uZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCwgaW50IGVycm9yKQoreworCWlmIChDVVJSRU5UX1NDKSB7CisJCWlmKERPTkVfU0MpCisJCQlwcmludGsoRVJSX0xFQUQgInRoZXJlJ3MgYWxyZWFkeSBhIGNvbXBsZXRlZCBjb21tYW5kICVwIC0gd2lsbCBjYXVzZSBhYm9ydFxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgRE9ORV9TQyk7CisKKwkJRE9ORV9TQyA9IENVUlJFTlRfU0M7CisJCUNVUlJFTlRfU0MgPSBOVUxMOworCQlET05FX1NDLT5yZXN1bHQgPSBlcnJvcjsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4OiBkb25lKCkgY2FsbGVkIG91dHNpZGUgb2YgY29tbWFuZFxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgYWhhMTUyeF90cTsKKworLyoKKyAqIFJ1biBzZXJ2aWNlIGNvbXBsZXRpb25zIG9uIHRoZSBjYXJkIHdpdGggaW50ZXJydXB0cyBlbmFibGVkLgorICoKKyAqLworc3RhdGljIHZvaWQgcnVuKHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaTxBUlJBWV9TSVpFKGFoYTE1MnhfaG9zdCk7IGkrKykgeworCQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IGFoYTE1MnhfaG9zdFtpXTsKKwkJaWYgKHNocG50ICYmIEhPU1REQVRBKHNocG50KS0+c2VydmljZSkgeworCQkJSE9TVERBVEEoc2hwbnQpLT5zZXJ2aWNlPTA7CisJCQlpc19jb21wbGV0ZShzaHBudCk7CisJCX0KKwl9Cit9CisKKy8qCisgKiAgICBJbnRlcnJ1cHRzIGhhbmRsZXIKKyAqCisgKi8KKworc3RhdGljIGlycXJldHVybl90IGludHIoaW50IGlycW5vLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gbG9va3VwX2lycShpcnFubyk7CisJdW5zaWduZWQgY2hhciByZXYsIGRtYWNudHJsMDsKKworCWlmICghc2hwbnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4OiBjYXRjaGVkIGludGVycnVwdCAlZCBmb3IgdW5rbm93biBjb250cm9sbGVyLlxuIiwgaXJxbm8pOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJLyoKKwkgKiBSZWFkIGEgY291cGxlIG9mIHJlZ2lzdGVycyB0aGF0IGFyZSBrbm93biB0byBub3QgYmUgYWxsIDEncy4gSWYKKwkgKiB3ZSByZWFkIGFsbCAxJ3MgKC0xKSwgdGhhdCBtZWFucyB0aGF0IGVpdGhlcjoKKwkgKgorCSAqIGEuIFRoZSBob3N0IGFkYXB0ZXIgY2hpcCBoYXMgZ29uZSBiYWQsIGFuZCB3ZSBjYW5ub3QgY29udHJvbCBpdCwKKwkgKglPUgorCSAqIGIuIFRoZSBob3N0IGFkYXB0ZXIgaXMgYSBQQ01DSUEgY2FyZCB0aGF0IGhhcyBiZWVuIGVqZWN0ZWQKKwkgKgorCSAqIEluIGVpdGhlciBjYXNlLCB3ZSBjYW5ub3QgZG8gYW55dGhpbmcgd2l0aCB0aGUgaG9zdCBhZGFwdGVyIGF0CisJICogdGhpcyBwb2ludCBpbiB0aW1lLiBTbyBqdXN0IGlnbm9yZSB0aGUgaW50ZXJydXB0IGFuZCByZXR1cm4uCisJICogSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgaW50ZXJydXB0IG1pZ2h0IGFjdHVhbGx5IGJlIG1lYW50IGZvcgorCSAqIHNvbWVvbmUgZWxzZSBzaGFyaW5nIHRoaXMgSVJRLCBhbmQgdGhhdCBkcml2ZXIgd2lsbCBoYW5kbGUgaXQuCisJICovCisJcmV2ID0gR0VUUE9SVChSRVYpOworCWRtYWNudHJsMCA9IEdFVFBPUlQoRE1BQ05UUkwwKTsKKwlpZiAoKHJldiA9PSAweEZGKSAmJiAoZG1hY250cmwwID09IDB4RkYpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKiBubyBtb3JlIGludGVycnVwdHMgZnJvbSB0aGUgY29udHJvbGxlciwgd2hpbGUgd2UncmUgYnVzeS4KKwkgICBJTlRFTiBpcyByZXN0b3JlZCBieSB0aGUgQkggaGFuZGxlciAqLworCUNMUkJJVFMoRE1BQ05UUkwwLCBJTlRFTik7CisKKyNpZiAwCisJLyogY2hlY2sgaWYgdGhlcmUgaXMgYWxyZWFkeSBzb21ldGhpbmcgdG8gYmUKKyAgICAgICAgICAgc2VydmljZWQ7IHNob3VsZCBub3QgaGFwcGVuICovCisJaWYoSE9TVERBVEEoc2hwbnQpLT5zZXJ2aWNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeCVkOiBsb3N0IGludGVycnVwdCAoJWQpXG4iLCBIT1NUTk8sIEhPU1REQVRBKHNocG50KS0+c2VydmljZSk7CisJICAgICAgICBzaG93X3F1ZXVlcyhzaHBudCk7CisJfQorI2VuZGlmCisJCisJLyogUG9rZSB0aGUgQkggaGFuZGxlciAqLworCUhPU1REQVRBKHNocG50KS0+c2VydmljZSsrOworCUlOSVRfV09SSygmYWhhMTUyeF90cSwgKHZvaWQgKikgcnVuLCBOVUxMKTsKKwlzY2hlZHVsZV93b3JrKCZhaGExNTJ4X3RxKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBidXNmcmVlIHBoYXNlCisgKiAtIGhhbmRsZSBjb21wbGV0aXRpb24vZGlzY29ubmVjdGlvbi9lcnJvciBvZiBjdXJyZW50IGNvbW1hbmQKKyAqIC0gc3RhcnQgc2VsZWN0aW9uIGZvciBuZXh0IGNvbW1hbmQgKGlmIGFueSkKKyAqLworc3RhdGljIHZvaWQgYnVzZnJlZV9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZiBkZWZpbmVkKEFIQTE1MlhfU1RBVCkKKwlpbnQgYWN0aW9uPTA7CisjZW5kaWYKKworCVNFVFBPUlQoU1hGUkNUTDAsIENIMXxDTFJDSDF8Q0xSU1RDTlQpOworCVNFVFBPUlQoU1hGUkNUTDAsIENIMSk7CisKKwlTRVRQT1JUKFNTVEFUMSwgQ0xSQlVTRlJFRSk7CisJCisJaWYoQ1VSUkVOVF9TQykgeworI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQorCQlhY3Rpb24rKzsKKyNlbmRpZgorCQlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJj0gfnN5bmNuZWc7CisKKwkJaWYoQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICYgY29tcGxldGVkKSB7CisJCQkvKiB0YXJnZXQgc2VudCBDT01NQU5EIENPTVBMRVRFICovCisJCQlkb25lKHNocG50LCAoQ1VSUkVOVF9TQy0+U0NwLlN0YXR1cyAmIDB4ZmYpIHwgKChDVVJSRU5UX1NDLT5TQ3AuTWVzc2FnZSAmIDB4ZmYpIDw8IDgpIHwgKERJRF9PSyA8PCAxNikpOworCisJCX0gZWxzZSBpZihDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBhYm9ydGVkKSB7CisJCQlEUFJJTlRLKGRlYnVnX2VoLCBERUJVR19MRUFEICJBQk9SVCBzZW50XG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCWRvbmUoc2hwbnQsIChDVVJSRU5UX1NDLT5TQ3AuU3RhdHVzICYgMHhmZikgfCAoKENVUlJFTlRfU0MtPlNDcC5NZXNzYWdlICYgMHhmZikgPDwgOCkgfCAoRElEX0FCT1JUIDw8IDE2KSk7CisKKwkJfSBlbHNlIGlmKENVUlJFTlRfU0MtPlNDcC5waGFzZSAmIHJlc2V0dGVkKSB7CisJCQlEUFJJTlRLKGRlYnVnX2VoLCBERUJVR19MRUFEICJCVVMgREVWSUNFIFJFU0VUIHNlbnRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQkJZG9uZShzaHBudCwgKENVUlJFTlRfU0MtPlNDcC5TdGF0dXMgJiAweGZmKSB8ICgoQ1VSUkVOVF9TQy0+U0NwLk1lc3NhZ2UgJiAweGZmKSA8PCA4KSB8IChESURfUkVTRVQgPDwgMTYpKTsKKworCQl9IGVsc2UgaWYoQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICYgZGlzY29ubmVjdGVkKSB7CisJCQkvKiB0YXJnZXQgc2VudCBESVNDT05ORUNUICovCisJCQlEUFJJTlRLKGRlYnVnX3NlbGVjdGlvbiwgREVCVUdfTEVBRCAidGFyZ2V0IGRpc2Nvbm5lY3RlZCBhdCAlZC8lZFxuIiwKKwkJCQlDTURJTkZPKENVUlJFTlRfU0MpLAorCQkJCUNVUlJFTlRfU0MtPnJlc2lkLAorCQkJCUNVUlJFTlRfU0MtPnJlcXVlc3RfYnVmZmxlbik7CisjaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCisJCQlIT1NUREFUQShzaHBudCktPmRpc2Nvbm5lY3Rpb25zKys7CisjZW5kaWYKKwkJCWFwcGVuZF9TQygmRElTQ09OTkVDVEVEX1NDLCBDVVJSRU5UX1NDKTsKKwkJCUNVUlJFTlRfU0MtPlNDcC5waGFzZSB8PSAxIDw8IDE2OworCQkJQ1VSUkVOVF9TQyA9IE5VTEw7CisKKwkJfSBlbHNlIHsKKwkJCWRvbmUoc2hwbnQsIERJRF9FUlJPUiA8PCAxNik7CisJCX0KKyNpZiBkZWZpbmVkKEFIQTE1MlhfU1RBVCkKKwl9IGVsc2UgeworCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9vbGRfY29tbWFuZCsrOworI2VuZGlmCisJfQorCisJRE9fTE9DSyhmbGFncyk7CisKKwlpZihET05FX1NDKSB7CisjaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCisJCWFjdGlvbisrOworI2VuZGlmCisKKwkJaWYoRE9ORV9TQy0+U0NwLnBoYXNlICYgY2hlY2tfY29uZGl0aW9uKSB7CisjaWYgMAorCQkJaWYoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGRlYnVnX2VoKSB7CisJCQkJcHJpbnRrKEVSUl9MRUFEICJyZWNlaXZlZCBzZW5zZTogIiwgQ01ESU5GTyhET05FX1NDKSk7CisJCQkJcHJpbnRfc2Vuc2UoImJoIiwgRE9ORV9TQyk7CisJCQl9CisjZW5kaWYKKworCQkJLyogcmVzdG9yZSBvbGQgY29tbWFuZCAqLworCQkJbWVtY3B5KCh2b2lkICopIERPTkVfU0MtPmNtbmQsICh2b2lkICopIERPTkVfU0MtPmRhdGFfY21uZCwgc2l6ZW9mKERPTkVfU0MtPmRhdGFfY21uZCkpOworCQkJRE9ORV9TQy0+cmVxdWVzdF9idWZmZXIgID0gRE9ORV9TQy0+YnVmZmVyOworCQkJRE9ORV9TQy0+cmVxdWVzdF9idWZmbGVuID0gRE9ORV9TQy0+YnVmZmxlbjsKKwkJCURPTkVfU0MtPnVzZV9zZyAgICAgICAgICA9IERPTkVfU0MtPm9sZF91c2Vfc2c7CisJCQlET05FX1NDLT5jbWRfbGVuICAgICAgICAgPSBET05FX1NDLT5vbGRfY21kX2xlbjsKKworCQkJRE9ORV9TQy0+U0NwLlN0YXR1cyA9IDB4MDI7CisKKwkJCUhPU1REQVRBKHNocG50KS0+Y29tbWFuZHMtLTsKKwkJCWlmICghSE9TVERBVEEoc2hwbnQpLT5jb21tYW5kcykKKwkJCQlTRVRQT1JUKFBPUlRBLCAwKTsJLyogdHVybiBsZWQgb2ZmICovCisJCX0gZWxzZSBpZihET05FX1NDLT5TQ3AuU3RhdHVzPT0weDAyKSB7CisjaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCisJCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aF9jaGVja19jb25kaXRpb24rKzsKKyNlbmRpZgorI2lmIDAKKwkJCURQUklOVEsoZGVidWdfZWgsIEVSUl9MRUFEICJDSEVDSyBDT05ESVRJT04gZm91bmRcbiIsIENNRElORk8oRE9ORV9TQykpOworI2VuZGlmCisKKwkJCWlmKCEoRE9ORV9TQy0+U0NwLlN0YXR1cyAmIG5vdF9pc3N1ZWQpKSB7CisJCQkJU2NzaV9DbW5kICpwdHIgPSBET05FX1NDOworCQkJCURPTkVfU0M9TlVMTDsKKyNpZiAwCisJCQkJRFBSSU5USyhkZWJ1Z19laCwgRVJSX0xFQUQgInJlcXVlc3Rpbmcgc2Vuc2VcbiIsIENNRElORk8ocHRyKSk7CisjZW5kaWYKKworCQkJCXB0ci0+Y21uZFswXSAgICAgICAgID0gUkVRVUVTVF9TRU5TRTsKKwkJCQlwdHItPmNtbmRbMV0gICAgICAgICA9IDA7CisJCQkJcHRyLT5jbW5kWzJdICAgICAgICAgPSAwOworCQkJCXB0ci0+Y21uZFszXSAgICAgICAgID0gMDsKKwkJCQlwdHItPmNtbmRbNF0gICAgICAgICA9IHNpemVvZihwdHItPnNlbnNlX2J1ZmZlcik7CisJCQkJcHRyLT5jbW5kWzVdICAgICAgICAgPSAwOworCQkJCXB0ci0+Y21kX2xlbiAgICAgICAgID0gNjsKKwkJCQlwdHItPnVzZV9zZyAgICAgICAgICA9IDA7IAorCQkJCXB0ci0+cmVxdWVzdF9idWZmZXIgID0gcHRyLT5zZW5zZV9idWZmZXI7CisJCQkJcHRyLT5yZXF1ZXN0X2J1ZmZsZW4gPSBzaXplb2YocHRyLT5zZW5zZV9idWZmZXIpOworCQkJCisJCQkJRE9fVU5MT0NLKGZsYWdzKTsKKwkJCQlhaGExNTJ4X2ludGVybmFsX3F1ZXVlKHB0ciwgTlVMTCwgY2hlY2tfY29uZGl0aW9uLCBwdHItPnNjc2lfZG9uZSk7CisJCQkJRE9fTE9DSyhmbGFncyk7CisjaWYgMAorCQkJfSBlbHNlIHsKKwkJCQlEUFJJTlRLKGRlYnVnX2VoLCBFUlJfTEVBRCAiY29tbWFuZCBub3QgaXNzdWVkIC0gQ0hFQ0sgQ09ORElUSU9OIGlnbm9yZWRcbiIsIENNRElORk8oRE9ORV9TQykpOworI2VuZGlmCisJCQl9CisJCX0KKworCQlpZihET05FX1NDICYmIERPTkVfU0MtPnNjc2lfZG9uZSkgeworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwkJCWludCBob3N0bm89RE9ORV9TQy0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vOworCQkJaW50IGlkPURPTkVfU0MtPmRldmljZS0+aWQgJiAweGY7CisJCQlpbnQgbHVuPURPTkVfU0MtPmRldmljZS0+bHVuICYgMHg3OworI2VuZGlmCisJCQlTY3NpX0NtbmQgKnB0ciA9IERPTkVfU0M7CisJCQlET05FX1NDPU5VTEw7CisKKwkJCS8qIHR1cm4gbGVkIG9mZiwgd2hlbiBubyBjb21tYW5kcyBhcmUgaW4gdGhlIGRyaXZlciAqLworCQkJSE9TVERBVEEoc2hwbnQpLT5jb21tYW5kcy0tOworCQkJaWYgKCFIT1NUREFUQShzaHBudCktPmNvbW1hbmRzKQorCQkJCVNFVFBPUlQoUE9SVEEsIDApOwkvKiB0dXJuIGxlZCBvZmYgKi8KKworCQkJaWYocHRyLT5zY3NpX2RvbmUgIT0gcmVzZXRfZG9uZSkgeworCQkJCWtmcmVlKHB0ci0+aG9zdF9zY3JpYmJsZSk7CisJCQkJcHRyLT5ob3N0X3NjcmliYmxlPU5VTEw7CisJCQl9CisKKwkJCURPX1VOTE9DSyhmbGFncyk7CisJCQlEUFJJTlRLKGRlYnVnX2RvbmUsIERFQlVHX0xFQUQgImNhbGxpbmcgc2NzaV9kb25lKCVwKVxuIiwgaG9zdG5vLCBpZCwgbHVuLCBwdHIpOworICAgICAgICAgICAgICAgIAlwdHItPnNjc2lfZG9uZShwdHIpOworCQkJRFBSSU5USyhkZWJ1Z19kb25lLCBERUJVR19MRUFEICJzY3NpX2RvbmUoJXApIHJldHVybmVkXG4iLCBob3N0bm8sIGlkLCBsdW4sIHB0cik7CisJCQlET19MT0NLKGZsYWdzKTsKKwkJfQorCisJCURPTkVfU0M9TlVMTDsKKyNpZiBkZWZpbmVkKEFIQTE1MlhfU1RBVCkKKwl9IGVsc2UgeworCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9kb25lX2NvbW1hbmQrKzsKKyNlbmRpZgorCX0KKworCWlmKElTU1VFX1NDKQorCQlDVVJSRU5UX1NDID0gcmVtb3ZlX2ZpcnN0X1NDKCZJU1NVRV9TQyk7CisKKwlET19VTkxPQ0soZmxhZ3MpOworCisJaWYoQ1VSUkVOVF9TQykgeworI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQorCQlhY3Rpb24rKzsKKyNlbmRpZgorCSAgICAJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlIHw9IHNlbGVjdGluZzsKKworCQlEUFJJTlRLKGRlYnVnX3NlbGVjdGlvbiwgREVCVUdfTEVBRCAic2VsZWN0aW5nIHRhcmdldFxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisKKwkJLyogY2xlYXIgc2VsZWN0aW9uIHRpbWVvdXQgKi8KKwkJU0VUUE9SVChTU1RBVDEsIFNFTFRPKTsKKworCQlTRVRQT1JUKFNDU0lJRCwgKHNocG50LT50aGlzX2lkIDw8IE9JRF8pIHwgQ1VSUkVOVF9TQy0+ZGV2aWNlLT5pZCk7CisJCVNFVFBPUlQoU1hGUkNUTDEsIChQQVJJVFkgPyBFTlNQQ0hLIDogMCApIHwgRU5TVElNRVIpOworCQlTRVRQT1JUKFNDU0lTRVEsIEVOU0VMTyB8IEVOQVVUT0FUTk8gfCAoRElTQ09OTkVDVEVEX1NDID8gRU5SRVNFTEkgOiAwKSk7CisJfSBlbHNlIHsKKyNpZiBkZWZpbmVkKEFIQTE1MlhfU1RBVCkKKwkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhvdXRfbmV3X2NvbW1hbmQrKzsKKyNlbmRpZgorCQlTRVRQT1JUKFNDU0lTRVEsIERJU0NPTk5FQ1RFRF9TQyA/IEVOUkVTRUxJIDogMCk7CisJfQorCisjaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCisJaWYoIWFjdGlvbikKKwkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhvdXRfYW55X2FjdGlvbisrOworI2VuZGlmCit9CisKKy8qCisgKiBTZWxlY3Rpb24gZG9uZSAoT1VUKQorICogLSBxdWV1ZSBJREVOVElGWSBtZXNzYWdlIGFuZCBTRFRSIHRvIHNlbGVjdGVkIHRhcmdldCBmb3IgbWVzc2FnZSBvdXQKKyAqICAgKEFUTiBhc3NlcnRlZCBhdXRvbWFnaWNhbGx5IHZpYSBFTkFVVE9BVE5PIGluIGJ1c2ZyZWUoKSkKKyAqLworc3RhdGljIHZvaWQgc2VsZG9fcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCVNFVFBPUlQoU0NTSVNJRywgMCk7CisJU0VUUE9SVChTU1RBVDEsIENMUkJVU0ZSRUUpOworCVNFVFBPUlQoU1NUQVQxLCBDTFJQSEFTRUNIRyk7CisKKyAgICAJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICY9IH4oc2VsZWN0aW5nfG5vdF9pc3N1ZWQpOworCisJU0VUUE9SVChTQ1NJU0VRLCAwKTsKKworCWlmIChURVNUTE8oU1NUQVQwLCBTRUxETykpIHsKKwkJcHJpbnRrKEVSUl9MRUFEICJhaGExNTJ4OiBwYXNzaW5nIGJ1cyBmcmVlIGNvbmRpdGlvblxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCWRvbmUoc2hwbnQsIERJRF9OT19DT05ORUNUIDw8IDE2KTsKKwkJcmV0dXJuOworCX0KKworCVNFVFBPUlQoU1NUQVQwLCBDTFJTRUxETyk7CisJCisJQURETVNHTyhJREVOVElGWShSRUNPTk5FQ1QsIENVUlJFTlRfU0MtPmRldmljZS0+bHVuKSk7CisKKwlpZiAoQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICYgYWJvcnRpbmcpIHsKKwkJQURETVNHTyhBQk9SVCk7CisJfSBlbHNlIGlmIChDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiByZXNldHRpbmcpIHsKKwkJQURETVNHTyhCVVNfREVWSUNFX1JFU0VUKTsKKwl9IGVsc2UgaWYgKFNZTkNORUc9PTAgJiYgU1lOQ0hST05PVVMpIHsKKyAgICAJCUNVUlJFTlRfU0MtPlNDcC5waGFzZSB8PSBzeW5jbmVnOworCQlBRERNU0dPKEVYVEVOREVEX01FU1NBR0UpOworCQlBRERNU0dPKDMpOworCQlBRERNU0dPKEVYVEVOREVEX1NEVFIpOworCQlBRERNU0dPKDUwKTsJCS8qIDIwMG5zICovCisJCUFERE1TR08oOCk7CQkvKiA4IGJ5dGUgcmVxL2FjayBvZmZzZXQgKi8KKworCQlTWU5DTkVHPTE7CQkvKiBuZWdvdGlhdGlvbiBpbiBwcm9ncmVzcyAqLworCX0KKworCVNFVFJBVEUoU1lOQ1JBVEUpOworfQorCisvKgorICogU2VsZWN0aW9uIHRpbWVvdXQKKyAqIC0gcmV0dXJuIGNvbW1hbmQgdG8gbWlkLWxldmVsIHdpdGggZmFpbHVyZSBjYXVzZQorICoKKyAqLworc3RhdGljIHZvaWQgc2VsdG9fcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCVNFVFBPUlQoU0NTSVNFUSwgMCk7CQkKKwlTRVRQT1JUKFNTVEFUMSwgQ0xSU0VMVElNTyk7CisKKwlEUFJJTlRLKGRlYnVnX3NlbGVjdGlvbiwgREVCVUdfTEVBRCAic2VsZWN0aW9uIHRpbWVvdXRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCisJaWYoIUNVUlJFTlRfU0MpIHsKKwkJRFBSSU5USyhkZWJ1Z19zZWxlY3Rpb24sIERFQlVHX0xFQUQgIiFDVVJSRU5UX1NDXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJcmV0dXJuOworCX0KKworICAgIAlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJj0gfnNlbGVjdGluZzsKKworCWlmIChDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBhYm9ydGVkKSB7CisJCURQUklOVEsoZGVidWdfc2VsZWN0aW9uLCBERUJVR19MRUFEICJhYm9ydGVkXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJZG9uZShzaHBudCwgRElEX0FCT1JUIDw8IDE2KTsKKwl9IGVsc2UgaWYgKFRFU1RMTyhTU1RBVDAsIFNFTElOR08pKSB7CisJCURQUklOVEsoZGVidWdfc2VsZWN0aW9uLCBERUJVR19MRUFEICJhcmJpdHJhdGlvbiBub3Qgd29uXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJZG9uZShzaHBudCwgRElEX0JVU19CVVNZIDw8IDE2KTsKKwl9IGVsc2UgeworCQkvKiBBUkJJVFJBVElPTiB3b24sIGJ1dCBTRUxFQ1RJT04gZmFpbGVkICovCisJCURQUklOVEsoZGVidWdfc2VsZWN0aW9uLCBERUJVR19MRUFEICJzZWxlY3Rpb24gZmFpbGVkXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJZG9uZShzaHBudCwgRElEX05PX0NPTk5FQ1QgPDwgMTYpOworCX0KK30KKworLyoKKyAqIFNlbGVjdGlvbiBpbiBkb25lCisgKiAtIHB1dCBjdXJyZW50IGNvbW1hbmQgYmFjayB0byBpc3N1ZSBxdWV1ZQorICogICAocmVjb25uZWN0aW9uIG9mIGEgZGlzY29ubmVjdGVkIG5leHVzIGluc3RlYWQKKyAqICAgIG9mIHN1Y2Nlc3NmdWwgc2VsZWN0aW9uIG91dCkKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNlbGRpX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpbnQgc2VsaWQ7CisJaW50IHRhcmdldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJU0VUUE9SVChTQ1NJU0lHLCAwKTsKKwlTRVRQT1JUKFNTVEFUMCwgQ0xSU0VMREkpOworCVNFVFBPUlQoU1NUQVQxLCBDTFJCVVNGUkVFKTsKKwlTRVRQT1JUKFNTVEFUMSwgQ0xSUEhBU0VDSEcpOworCisJaWYoQ1VSUkVOVF9TQykgeworCQlpZighKENVUlJFTlRfU0MtPlNDcC5waGFzZSAmIG5vdF9pc3N1ZWQpKQorCQkJcHJpbnRrKEVSUl9MRUFEICJjb21tYW5kIHNob3VsZCBub3QgaGF2ZSBiZWVuIGlzc3VlZCB5ZXRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCisJCURQUklOVEsoZGVidWdfc2VsZWN0aW9uLCBFUlJfTEVBRCAiY29tbWFuZCByZXF1ZXVlZCAtIHJlc2VsZWN0aW9uXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKworCQlET19MT0NLKGZsYWdzKTsKKwkJYXBwZW5kX1NDKCZJU1NVRV9TQywgQ1VSUkVOVF9TQyk7CisJCURPX1VOTE9DSyhmbGFncyk7CisKKwkJQ1VSUkVOVF9TQyA9IE5VTEw7CisJfQorCisJaWYoIURJU0NPTk5FQ1RFRF9TQykgeworCQlEUFJJTlRLKGRlYnVnX3NlbGVjdGlvbiwgREVCVUdfTEVBRCAidW5leHBlY3RlZCBTRUxESSAiLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJcmV0dXJuOworCX0KKworCVJFQ09OTl9UQVJHRVQ9LTE7CisKKwlzZWxpZCA9IEdFVFBPUlQoU0VMSUQpICYgfigxIDw8IHNocG50LT50aGlzX2lkKTsKKworCWlmIChzZWxpZD09MCkgeworCQlwcmludGsoImFoYTE1MnglZDogdGFyZ2V0IGlkIHVua25vd24gKCUwMngpXG4iLCBIT1NUTk8sIHNlbGlkKTsKKwkJcmV0dXJuOworCX0KKworCWZvcih0YXJnZXQ9NzsgIShzZWxpZCAmICgxIDw8IHRhcmdldCkpOyB0YXJnZXQtLSkKKwkJOworCisJaWYoc2VsaWQgJiB+KDEgPDwgdGFyZ2V0KSkgeworCQlwcmludGsoImFoYTE1MnglZDogbXVsdGlwbGUgdGFyZ2V0cyByZWNvbm5lY3RlZCAoJTAyeClcbiIsCisJCSAgICAgICBIT1NUTk8sIHNlbGlkKTsKKwl9CisKKworCVNFVFBPUlQoU0NTSUlELCAoc2hwbnQtPnRoaXNfaWQgPDwgT0lEXykgfCB0YXJnZXQpOworCVNFVFBPUlQoU0NTSVNFUSwgMCk7CisKKwlTRVRSQVRFKEhPU1REQVRBKHNocG50KS0+c3luY3JhdGVbdGFyZ2V0XSk7CisKKwlSRUNPTk5fVEFSR0VUPXRhcmdldDsKKwlEUFJJTlRLKGRlYnVnX3NlbGVjdGlvbiwgREVCVUdfTEVBRCAidGFyZ2V0ICVkIHJlc2VsZWN0ZWQgKCUwMngpLlxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgdGFyZ2V0LCBzZWxpZCk7Cit9CisKKy8qCisgKiBtZXNzYWdlIGluIHBoYXNlCisgKiAtIGhhbmRsZSBpbml0aWFsIG1lc3NhZ2UgYWZ0ZXIgcmVjb25uZWN0aW9uIHRvIGlkZW50aWZ5CisgKiAgIHJlY29ubmVjdGluZyBuZXh1cworICogLSBxdWV1ZSBjb21tYW5kIG9uIERJU0NPTk5FQ1RFRF9TQyBvbiBESVNDT05ORUNUIG1lc3NhZ2UKKyAqIC0gc2V0IGNvbXBsZXRlZCBmbGFnIG9uIENPTU1BTkQgQ09NUExFVEUKKyAqICAgKG90aGVyIGNvbXBsZXRpdGlvbiBjb2RlIG1vdmVkIHRvIGJ1c2ZyZWVfcnVuKQorICogLSBoYW5kbGUgcmVzcG9uc2UgdG8gU0RUUgorICogLSBjbGVhciBzeW5jaHJvbm91cyB0cmFuc2ZlciBhZ3JlZW1lbnRzIG9uIEJVUyBSRVNFVAorICoKKyAqIEZJWE1FOiB3aGF0IGFib3V0IFNBVkUgUE9JTlRFUlMsIFJFU1RPUkUgUE9JTlRFUlM/CisgKgorICovCitzdGF0aWMgdm9pZCBtc2dpX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlmb3IoOzspIHsKKwkJaW50IHNzdGF0MSA9IEdFVFBPUlQoU1NUQVQxKTsKKworCQlpZihzc3RhdDEgJiAoUEhBU0VDSEd8UEhBU0VNSVN8QlVTRlJFRSkgfHwgIShzc3RhdDEgJiBSRVFJTklUKSkKKwkJCXJldHVybjsKKworCQlpZihURVNUTE8oU1NUQVQwLFNQSU9SRFkpKSB7CisJCQlEUFJJTlRLKGRlYnVnX21zZ2ksIERFQlVHX0xFQUQgIiFTUElPUkRZXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCXJldHVybjsKKwkJfQkKKworCQlBRERNU0dJKEdFVFBPUlQoU0NTSURBVCkpOworCisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCQlpZiAoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGRlYnVnX21zZ2kpIHsKKwkJCXByaW50ayhJTkZPX0xFQUQgImluYm91bmQgbWVzc2FnZSAlMDJ4ICIsIENNRElORk8oQ1VSUkVOVF9TQyksIE1TR0koMCkpOworCQkJcHJpbnRfbXNnKCZNU0dJKDApKTsKKwkJCXByaW50aygiXG4iKTsKKwkJfQorI2VuZGlmCisKKwkJaWYoIUNVUlJFTlRfU0MpIHsKKwkJCWlmKExBU1RTVEFURSE9c2VsZGkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImFoYTE1MnglZDogbWVzc2FnZSBpbiB3L28gY3VycmVudCBjb21tYW5kIG5vdCBhZnRlciByZXNlbGVjdGlvblxuIiwgSE9TVE5PKTsKKwkJCX0KKworCQkJLyoKKwkgCSAJICogSGFuZGxlIHJlc2VsZWN0aW9uCisJIAkJICovCisJCQlpZighKE1TR0koMCkgJiBJREVOVElGWV9CQVNFKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeCVkOiB0YXJnZXQgZGlkbid0IGlkZW50aWZ5IGFmdGVyIHJlc2VsZWN0aW9uXG4iLCBIT1NUTk8pOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlDVVJSRU5UX1NDID0gcmVtb3ZlX2x1bl9TQygmRElTQ09OTkVDVEVEX1NDLCBSRUNPTk5fVEFSR0VULCBNU0dJKDApICYgMHgzZik7CisKKwkJCWlmICghQ1VSUkVOVF9TQykgeworCQkJCXNob3dfcXVldWVzKHNocG50KTsKKwkJCQlwcmludGsoS0VSTl9FUlIgImFoYTE1MnglZDogbm8gZGlzY29ubmVjdGVkIGNvbW1hbmQgZm9yIHRhcmdldCAlZC8lZFxuIiwgSE9TVE5PLCBSRUNPTk5fVEFSR0VULCBNU0dJKDApICYgMHgzZik7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCURQUklOVEsoZGVidWdfbXNnaSwgREVCVUdfTEVBRCAidGFyZ2V0IHJlY29ubmVjdGVkXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKworCQkJQ1VSUkVOVF9TQy0+U0NwLk1lc3NhZ2UgPSBNU0dJKDApOworCQkJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICY9IH5kaXNjb25uZWN0ZWQ7CisKKwkJCU1TR0lMRU49MDsKKworCQkJLyogbmV4dCBtZXNzYWdlIGlmIGFueSAqLworCQkJY29udGludWU7CisJCX0gCisKKwkJQ1VSUkVOVF9TQy0+U0NwLk1lc3NhZ2UgPSBNU0dJKDApOworCisJCXN3aXRjaCAoTVNHSSgwKSkgeworCQljYXNlIERJU0NPTk5FQ1Q6CisJCQlpZiAoIVJFQ09OTkVDVCkKKwkJCQlwcmludGsoV0FSTl9MRUFEICJ0YXJnZXQgd2FzIG5vdCBhbGxvd2VkIHRvIGRpc2Nvbm5lY3RcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCisJCQlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgfD0gZGlzY29ubmVjdGVkOworCQkJYnJlYWs7CisKKwkJY2FzZSBDT01NQU5EX0NPTVBMRVRFOgorCQkJaWYoQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICYgY29tcGxldGVkKQorCQkJCURQUklOVEsoZGVidWdfbXNnaSwgREVCVUdfTEVBRCAiYWdhaW4gQ09NTUFORCBDT01QTEVURVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisKKwkJCUNVUlJFTlRfU0MtPlNDcC5waGFzZSB8PSBjb21wbGV0ZWQ7CisJCQlicmVhazsKKworCQljYXNlIE1FU1NBR0VfUkVKRUNUOgorCQkJaWYgKFNZTkNORUc9PTEpIHsKKwkJCQlwcmludGsoSU5GT19MRUFEICJTeW5jaHJvbm91cyBEYXRhIFRyYW5zZmVyIFJlcXVlc3Qgd2FzIHJlamVjdGVkXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCQlTWU5DTkVHPTI7CS8qIG5lZ290aWF0aW9uIGNvbXBsZXRlZCAqLworCQkJfSBlbHNlCisJCQkJcHJpbnRrKElORk9fTEVBRCAiaW5ib3VuZCBtZXNzYWdlIChNRVNTQUdFIFJFSkVDVClcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQVZFX1BPSU5URVJTOgorCQkJYnJlYWs7CisKKwkJY2FzZSBSRVNUT1JFX1BPSU5URVJTOgorCQkJYnJlYWs7CisKKwkJY2FzZSBFWFRFTkRFRF9NRVNTQUdFOgorCQkJaWYoTVNHSUxFTjwyIHx8IE1TR0lMRU48TVNHSSgxKSsyKSB7CisJCQkJLyogbm90IHlldCBjb21wbGV0ZWQgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJc3dpdGNoIChNU0dJKDIpKSB7CisJCQljYXNlIEVYVEVOREVEX1NEVFI6CisJCQkJeworCQkJCQlsb25nIHRpY2tzOworCisJCQkJCWlmIChNU0dJKDEpICE9IDMpIHsKKwkJCQkJCXByaW50ayhFUlJfTEVBRCAiU0RUUiBtZXNzYWdlIGxlbmd0aCE9M1xuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWlmICghSE9TVERBVEEoc2hwbnQpLT5zeW5jaHJvbm91cykKKwkJCQkJCWJyZWFrOworCisJCQkJCXByaW50ayhJTkZPX0xFQUQsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQkJCQlwcmludF9tc2coJk1TR0koMCkpOworCQkJCQlwcmludGsoIlxuIik7CisKKwkJCQkJdGlja3MgPSAoTVNHSSgzKSAqIDQgKyA0OSkgLyA1MDsKKworCQkJCQlpZiAoc3luY25lZykgeworCQkJCQkJLyogbmVnb3RpYXRpb24gaW4gcHJvZ3Jlc3MgKi8KKwkJCQkJCWlmICh0aWNrcyA+IDkgfHwgTVNHSSg0KSA8IDEgfHwgTVNHSSg0KSA+IDgpIHsKKwkJCQkJCQlBRERNU0dPKE1FU1NBR0VfUkVKRUNUKTsKKwkJCQkJCQlwcmludGsoSU5GT19MRUFEICJyZWNlaXZlZCBTeW5jaHJvbm91cyBEYXRhIFRyYW5zZmVyIFJlcXVlc3QgaW52YWxpZCAtIHJlamVjdGVkXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJU1lOQ1JBVEUgfD0gKCh0aWNrcyAtIDIpIDw8IDQpICsgTVNHSSg0KTsKKwkJCQkJfSBlbHNlIGlmICh0aWNrcyA8PSA5ICYmIE1TR0koNCkgPj0gMSkgeworCQkJCQkJQURETVNHTyhFWFRFTkRFRF9NRVNTQUdFKTsKKwkJCQkJCUFERE1TR08oMyk7CisJCQkJCQlBRERNU0dPKEVYVEVOREVEX1NEVFIpOworCQkJCQkJaWYgKHRpY2tzIDwgNCkgeworCQkJCQkJCXRpY2tzID0gNDsKKwkJCQkJCQlBRERNU0dPKDUwKTsKKwkJCQkJCX0gZWxzZQorCQkJCQkJCUFERE1TR08oTVNHSSgzKSk7CisKKwkJCQkJCWlmIChNU0dJKDQpID4gOCkKKwkJCQkJCQlNU0dJKDQpID0gODsKKworCQkJCQkJQURETVNHTyhNU0dJKDQpKTsKKworCQkJCQkJU1lOQ1JBVEUgfD0gKCh0aWNrcyAtIDIpIDw8IDQpICsgTVNHSSg0KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qIHJlcXVlc3RlZCBTRFRSIGlzIHRvbyBzbG93LCBkbyBpdCBhc3luY2hyb25vdXNseSAqLworCQkJCQkJcHJpbnRrKElORk9fTEVBRCAiU3luY2hyb25vdXMgRGF0YSBUcmFuc2ZlciBSZXF1ZXN0IHRvbyBzbG93IC0gUmVqZWN0aW5nXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCQkJCUFERE1TR08oTUVTU0FHRV9SRUpFQ1QpOworCQkJCQl9CisKKwkJCQkJU1lOQ05FRz0yOwkJLyogbmVnb3RpYXRpb24gY29tcGxldGVkICovCisJCQkJCVNFVFJBVEUoU1lOQ1JBVEUpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBCVVNfREVWSUNFX1JFU0VUOgorCQkJCXsKKwkJCQkJaW50IGk7CisKKwkJCQkJZm9yKGk9MDsgaTw4OyBpKyspIHsKKwkJCQkJCUhPU1REQVRBKHNocG50KS0+c3luY3JhdGVbaV09MDsKKwkJCQkJCUhPU1REQVRBKHNocG50KS0+c3luY25lZ1tpXT0wOworCQkJCQl9CisKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRVhURU5ERURfTU9ESUZZX0RBVEFfUE9JTlRFUjoKKwkJCWNhc2UgRVhURU5ERURfRVhURU5ERURfSURFTlRJRlk6CisJCQljYXNlIEVYVEVOREVEX1dEVFI6CisJCQlkZWZhdWx0OgorCQkJCUFERE1TR08oTUVTU0FHRV9SRUpFQ1QpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlNU0dJTEVOPTA7CisJfQorfQorCitzdGF0aWMgdm9pZCBtc2dpX2VuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpZihNU0dJTEVOPjApCisJCXByaW50ayhXQVJOX0xFQUQgInRhcmdldCBsZWZ0IGJlZm9yZSBtZXNzYWdlIGNvbXBsZXRlZCAoJWQpXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBNU0dJTEVOKTsKKworCWlmIChNU0dPTEVOID4gMCAmJiAhKEdFVFBPUlQoU1NUQVQxKSAmIEJVU0ZSRUUpKSB7CisJCURQUklOVEsoZGVidWdfbXNnaSwgREVCVUdfTEVBRCAibXNnbyBwZW5kaW5nXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJU0VUUE9SVChTQ1NJU0lHLCBQX01TR0kgfCBTSUdfQVROTyk7CisJfSAKK30KKworLyoKKyAqIG1lc3NhZ2Ugb3V0IHBoYXNlCisgKgorICovCitzdGF0aWMgdm9pZCBtc2dvX2luaXQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaWYoTVNHT0xFTj09MCkgeworCQlpZigoQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICYgc3luY25lZykgJiYgU1lOQ05FRz09MiAmJiBTWU5DUkFURT09MCkgeworCQkJQURETVNHTyhJREVOVElGWShSRUNPTk5FQ1QsIENVUlJFTlRfU0MtPmRldmljZS0+bHVuKSk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoSU5GT19MRUFEICJ1bmV4cGVjdGVkIE1FU1NBR0UgT1VUIHBoYXNlOyByZWplY3RpbmdcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQkJQURETVNHTyhNRVNTQUdFX1JFSkVDVCk7CisJCX0KKwl9CisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJaWYoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGRlYnVnX21zZ28pIHsKKwkJaW50IGk7CisKKwkJcHJpbnRrKERFQlVHX0xFQUQgIm1lc3NhZ2VzKCAiLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJZm9yIChpPTA7IGk8TVNHT0xFTjsgaSs9cHJpbnRfbXNnKCZNU0dPKGkpKSwgcHJpbnRrKCIgIikpCisJCQk7CisJCXByaW50aygiKVxuIik7CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBtZXNzYWdlIG91dCBwaGFzZQorICoKKyAqLworc3RhdGljIHZvaWQgbXNnb19ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaWYoTVNHT19JPT1NU0dPTEVOKQorCQlEUFJJTlRLKGRlYnVnX21zZ28sIERFQlVHX0xFQUQgIm1lc3NhZ2VzIGFsbCBzZW50ICglZC8lZClcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIE1TR09fSSwgTVNHT0xFTik7CisKKwl3aGlsZShNU0dPX0k8TVNHT0xFTikgeworCQlEUFJJTlRLKGRlYnVnX21zZ28sIERFQlVHX0xFQUQgIm1lc3NhZ2UgYnl0ZSAlMDJ4ICglZC8lZClcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIE1TR08oTVNHT19JKSwgTVNHT19JLCBNU0dPTEVOKTsKKworCQlpZihURVNUTE8oU1NUQVQwLCBTUElPUkRZKSkgeworCQkJRFBSSU5USyhkZWJ1Z19tc2dvLCBERUJVR19MRUFEICIhU1BJT1JEWVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoTVNHT19JPT1NU0dPTEVOLTEpIHsKKwkJCS8qIExlYXZlIE1FU1NBR0UgT1VUIGFmdGVyIHRyYW5zZmVyICovCisJCQlTRVRQT1JUKFNTVEFUMSwgQ0xSQVROTyk7CisJCX0KKworCisJCWlmIChNU0dPKE1TR09fSSkgJiBJREVOVElGWV9CQVNFKQorCQkJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlIHw9IGlkZW50aWZpZWQ7CisKKwkJaWYgKE1TR08oTVNHT19JKT09QUJPUlQpCisJCQlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgfD0gYWJvcnRlZDsKKworCQlpZiAoTVNHTyhNU0dPX0kpPT1CVVNfREVWSUNFX1JFU0VUKQorCQkJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlIHw9IHJlc2V0dGVkOworCisJCVNFVFBPUlQoU0NTSURBVCwgTVNHTyhNU0dPX0krKykpOworCX0KK30KKworc3RhdGljIHZvaWQgbXNnb19lbmQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaWYoTVNHT19JPE1TR09MRU4pIHsKKwkJcHJpbnRrKEVSUl9MRUFEICJtZXNzYWdlIHNlbnQgaW5jb21wbGV0ZWx5ICglZC8lZClcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIE1TR09fSSwgTVNHT0xFTik7CisJCWlmKFNZTkNORUc9PTEpIHsKKwkJCXByaW50ayhJTkZPX0xFQUQgIlN5bmNocm9ub3VzIERhdGEgVHJhbnNmZXIgUmVxdWVzdCB3YXMgcmVqZWN0ZWRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQkJU1lOQ05FRz0yOworCQl9CisJfQorCQkKKwlNU0dPX0kgID0gMDsKKwlNU0dPTEVOID0gMDsKK30KKworLyogCisgKiBjb21tYW5kIHBoYXNlCisgKgorICovCitzdGF0aWMgdm9pZCBjbWRfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpZiAoQ1VSUkVOVF9TQy0+U0NwLnNlbnRfY29tbWFuZCkgeworCQlwcmludGsoRVJSX0xFQUQgImNvbW1hbmQgYWxyZWFkeSBzZW50XG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJZG9uZShzaHBudCwgRElEX0VSUk9SIDw8IDE2KTsKKwkJcmV0dXJuOworCX0KKworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwlpZiAoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGRlYnVnX2NtZCkgeworCQlwcmludGsoREVCVUdfTEVBRCAiY21kX2luaXQ6ICIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQlwcmludF9jb21tYW5kKENVUlJFTlRfU0MtPmNtbmQpOworCX0KKyNlbmRpZgorCisJQ01EX0k9MDsKK30KKworLyoKKyAqIGNvbW1hbmQgcGhhc2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGNtZF9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaWYoQ01EX0k9PUNVUlJFTlRfU0MtPmNtZF9sZW4pIHsKKwkJRFBSSU5USyhkZWJ1Z19jbWQsIERFQlVHX0xFQUQgImNvbW1hbmQgYWxyZWFkeSBjb21wbGV0ZWx5IHNlbnQgKCVkLyVkKSIsIENNRElORk8oQ1VSUkVOVF9TQyksIENNRF9JLCBDVVJSRU5UX1NDLT5jbWRfbGVuKTsKKwkJZGlzcF9wb3J0cyhzaHBudCk7CisJfQorCisJd2hpbGUoQ01EX0k8Q1VSUkVOVF9TQy0+Y21kX2xlbikgeworCQlEUFJJTlRLKGRlYnVnX2NtZCwgREVCVUdfTEVBRCAiY29tbWFuZCBieXRlICUwMnggKCVkLyVkKVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgQ1VSUkVOVF9TQy0+Y21uZFtDTURfSV0sIENNRF9JLCBDVVJSRU5UX1NDLT5jbWRfbGVuKTsKKworCQlpZihURVNUTE8oU1NUQVQwLCBTUElPUkRZKSkgeworCQkJRFBSSU5USyhkZWJ1Z19jbWQsIERFQlVHX0xFQUQgIiFTUElPUkRZXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCVNFVFBPUlQoU0NTSURBVCwgQ1VSUkVOVF9TQy0+Y21uZFtDTURfSSsrXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjbWRfZW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCWlmKENNRF9JPENVUlJFTlRfU0MtPmNtZF9sZW4pCisJCXByaW50ayhFUlJfTEVBRCAiY29tbWFuZCBzZW50IGluY29tcGxldGVseSAoJWQvJWQpXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBDTURfSSwgQ1VSUkVOVF9TQy0+Y21kX2xlbik7CisJZWxzZQorCQlDVVJSRU5UX1NDLT5TQ3Auc2VudF9jb21tYW5kKys7Cit9CisKKy8qCisgKiBzdGF0dXMgcGhhc2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHN0YXR1c19ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaWYoVEVTVExPKFNTVEFUMCxTUElPUkRZKSkgeworCQlEUFJJTlRLKGRlYnVnX3N0YXR1cywgREVCVUdfTEVBRCAiIVNQSU9SRFlcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQlyZXR1cm47CisJfQorCisJQ1VSUkVOVF9TQy0+U0NwLlN0YXR1cyA9IEdFVFBPUlQoU0NTSURBVCk7CisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJaWYgKEhPU1REQVRBKHNocG50KS0+ZGVidWcgJiBkZWJ1Z19zdGF0dXMpIHsKKwkJcHJpbnRrKERFQlVHX0xFQUQgImluYm91bmQgc3RhdHVzICUwMnggIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgQ1VSUkVOVF9TQy0+U0NwLlN0YXR1cyk7CisJCXByaW50X3N0YXR1cyhDVVJSRU5UX1NDLT5TQ3AuU3RhdHVzKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKyNlbmRpZgorfQorCisvKgorICogZGF0YSBpbiBwaGFzZQorICoKKyAqLworc3RhdGljIHZvaWQgZGF0YWlfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlTRVRQT1JUKERNQUNOVFJMMCwgUlNURklGTyk7CisJU0VUUE9SVChETUFDTlRSTDAsIFJTVEZJRk98RU5ETUEpOworCisJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxfENMUlNUQ05UKTsKKwlTRVRQT1JUKFNYRlJDVEwwLCBDSDF8U0NTSUVOfERNQUVOKTsKKworCVNFVFBPUlQoU0lNT0RFMCwgMCk7CisJU0VUUE9SVChTSU1PREUxLCBFTlNDU0lQRVJSIHwgRU5TQ1NJUlNUIHwgRU5QSEFTRU1JUyB8IEVOQlVTRlJFRSk7CisKKwlEQVRBX0xFTj0wOworCURQUklOVEsoZGVidWdfZGF0YWksCisJCURFQlVHX0xFQUQgImRhdGFpX2luaXQ6IHJlcXVlc3RfYnVmZmxlbj0lZCByZXNpZD0lZFxuIiwKKwkJQ01ESU5GTyhDVVJSRU5UX1NDKSwgQ1VSUkVOVF9TQy0+cmVxdWVzdF9idWZmbGVuLCBDVVJSRU5UX1NDLT5yZXNpZCk7Cit9CisKK3N0YXRpYyB2b2lkIGRhdGFpX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwl1bnNpZ25lZCBsb25nIHRoZV90aW1lOworCWludCBmaWZvZGF0YSwgZGF0YV9jb3VudDsKKworCS8qCisJICogbG9vcCB3aGlsZSB0aGUgcGhhc2UgcGVyc2lzdHMgb3IgdGhlIGZpZm9zIGFyZSBub3QgZW1wdHkKKwkgKgorCSAqLworCXdoaWxlKFRFU1RMTyhETUFTVEFULCBJTlRTVEFUKSB8fCBURVNUTE8oRE1BU1RBVCwgREZJRk9FTVApIHx8IFRFU1RMTyhTU1RBVDIsIFNFTVBUWSkpIHsKKwkJLyogRklYTUU6IG1heWJlIHRoaXMgc2hvdWxkIGJlIGRvbmUgYnkgc2V0dGluZyB1cAorCQkgKiBTVENOVCB0byB0cmlnZ2VyIEVOU1dSQVAgaW50ZXJydXB0LCBpbnN0ZWFkIG9mCisJCSAqIHBvbGxpbmcgZm9yIERGSUZPRlVMTAorCQkgKi8KKwkJdGhlX3RpbWU9amlmZmllcyArIDEwMCpIWjsKKwkJd2hpbGUoVEVTVExPKERNQVNUQVQsIERGSUZPRlVMTHxJTlRTVEFUKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLHRoZV90aW1lKSkKKwkJCWJhcnJpZXIoKTsKKworCQlpZihURVNUTE8oRE1BU1RBVCwgREZJRk9GVUxMfElOVFNUQVQpKSB7CisJCQlwcmludGsoRVJSX0xFQUQgImRhdGFpIHRpbWVvdXQiLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCWRpc3BfcG9ydHMoc2hwbnQpOworCQkJYnJlYWs7CisJCX0KKworCQlpZihURVNUSEkoRE1BU1RBVCwgREZJRk9GVUxMKSkgeworCQkJZmlmb2RhdGEgPSAxMjg7CisJCX0gZWxzZSB7CisJCQl0aGVfdGltZT1qaWZmaWVzICsgMTAwKkhaOworCQkJd2hpbGUoVEVTVExPKFNTVEFUMiwgU0VNUFRZKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLHRoZV90aW1lKSkKKwkJCQliYXJyaWVyKCk7CisKKwkJCWlmKFRFU1RMTyhTU1RBVDIsIFNFTVBUWSkpIHsKKwkJCQlwcmludGsoRVJSX0xFQUQgImRhdGFpIHNlbXB0eSB0aW1lb3V0IiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCQkJZGlzcF9wb3J0cyhzaHBudCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWZpZm9kYXRhID0gR0VUUE9SVChGSUZPU1RBVCk7CisJCX0KKworCQlpZihDVVJSRU5UX1NDLT5TQ3AudGhpc19yZXNpZHVhbD4wKSB7CisJCQl3aGlsZShmaWZvZGF0YT4wICYmIENVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsPjApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIAlkYXRhX2NvdW50ID0gZmlmb2RhdGE+Q1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgPworCQkJCQkJQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgOgorCQkJCQkJZmlmb2RhdGE7CisJCQkJZmlmb2RhdGEgLT0gZGF0YV9jb3VudDsKKworICAgICAgICAgICAgICAgICAgICAgICAgCWlmKGRhdGFfY291bnQgJiAxKSB7CisJCQkJCURQUklOVEsoZGVidWdfZGF0YWksIERFQlVHX0xFQUQgIjhiaXRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJU0VUUE9SVChETUFDTlRSTDAsIEVORE1BfF84QklUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSpDVVJSRU5UX1NDLT5TQ3AucHRyKysgPSBHRVRQT1JUKERBVEFQT1JUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCUNVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlEQVRBX0xFTisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJU0VUUE9SVChETUFDTlRSTDAsIEVORE1BKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAl9CisJCisgICAgICAgICAgICAgICAgICAgICAgICAJaWYoZGF0YV9jb3VudCA+IDEpIHsKKwkJCQkJRFBSSU5USyhkZWJ1Z19kYXRhaSwgREVCVUdfTEVBRCAiMTZiaXQoJWQpXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBkYXRhX2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWRhdGFfY291bnQgPj49IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlpbnN3KERBVEFQT1JULCBDVVJSRU5UX1NDLT5TQ3AucHRyLCBkYXRhX2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCUNVUlJFTlRfU0MtPlNDcC5wdHIgICAgICAgICAgICs9IDIgKiBkYXRhX2NvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgLT0gMiAqIGRhdGFfY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlEQVRBX0xFTiAgICAgICAgICAgICAgICAgICAgICArPSAyICogZGF0YV9jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIAl9CisJCisgICAgICAgICAgICAgICAgICAgICAgICAJaWYoQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWw9PTAgJiYgQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw+MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJLyogYWR2YW5jZSB0byBuZXh0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCUNVUlJFTlRfU0MtPlNDcC5idWZmZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCUNVUlJFTlRfU0MtPlNDcC5wdHIgICAgICAgICAgID0gU0dfQUREUkVTUyhDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCUNVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsID0gQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCQkJCX0gCisgICAgICAgICAgICAgICAgCX0KKwkJfSBlbHNlIGlmKGZpZm9kYXRhPjApIHsgCisJCQlwcmludGsoRVJSX0xFQUQgIm5vIGJ1ZmZlcnMgbGVmdCBmb3IgJWQoJWQpIGJ5dGVzIChkYXRhIG92ZXJydW4hPylcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIGZpZm9kYXRhLCBHRVRQT1JUKEZJRk9TVEFUKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTRVRQT1JUKERNQUNOVFJMMCwgRU5ETUF8XzhCSVQpOworCQkJd2hpbGUoZmlmb2RhdGE+MCkgeworCQkJCWludCBkYXRhOworCQkJCWRhdGE9R0VUUE9SVChEQVRBUE9SVCk7CisJCQkJRFBSSU5USyhkZWJ1Z19kYXRhaSwgREVCVUdfTEVBRCAiZGF0YT0lMDJ4XG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBkYXRhKTsKKwkJCQlmaWZvZGF0YS0tOworCQkJCURBVEFfTEVOKys7CisJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICBTRVRQT1JUKERNQUNOVFJMMCwgRU5ETUF8XzhCSVQpOworCQl9CisJfQorCisJaWYoVEVTVExPKERNQVNUQVQsIElOVFNUQVQpIHx8CisJICAgVEVTVExPKERNQVNUQVQsIERGSUZPRU1QKSB8fAorCSAgIFRFU1RMTyhTU1RBVDIsIFNFTVBUWSkgfHwKKwkgICBHRVRQT1JUKEZJRk9TVEFUKT4wKSB7CisJICAgCS8qCisJCSAqIHNvbWV0aGluZyB3ZW50IHdyb25nLCBpZiB0aGVyZSdzIHNvbWV0aGluZyBsZWZ0IGluIHRoZSBmaWZvcworCQkgKiBvciB0aGUgcGhhc2UgZGlkbid0IGNoYW5nZQorCQkgKi8KKwkJcHJpbnRrKEVSUl9MRUFEICJmaWZvcyBzaG91bGQgYmUgZW1wdHkgYW5kIHBoYXNlIHNob3VsZCBoYXZlIGNoYW5nZWRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQlkaXNwX3BvcnRzKHNocG50KTsKKwl9CisKKwlpZihEQVRBX0xFTiE9R0VUU1RDTlQoKSkgeworCQlwcmludGsoRVJSX0xFQUQKKwkJICAgICAgICJtYW51YWwgdHJhbnNmZXIgY291bnQgZGlmZmVycyBmcm9tIGF1dG9tYXRpYyAoY291bnQ9JWQ7c3RjbnQ9JWQ7ZGlmZj0lZDtmaWZvc3RhdD0lZCkiLAorCQkgICAgICAgQ01ESU5GTyhDVVJSRU5UX1NDKSwgREFUQV9MRU4sIEdFVFNUQ05UKCksIEdFVFNUQ05UKCktREFUQV9MRU4sIEdFVFBPUlQoRklGT1NUQVQpKTsKKwkJZGlzcF9wb3J0cyhzaHBudCk7CisJCW1kZWxheSgxMDAwMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkYXRhaV9lbmQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJQ1VSUkVOVF9TQy0+cmVzaWQgLT0gR0VUU1RDTlQoKTsKKworCURQUklOVEsoZGVidWdfZGF0YWksCisJCURFQlVHX0xFQUQgImRhdGFpX2VuZDogcmVxdWVzdF9idWZmbGVuPSVkIHJlc2lkPSVkIHN0Y250PSVkXG4iLAorCQlDTURJTkZPKENVUlJFTlRfU0MpLCBDVVJSRU5UX1NDLT5yZXF1ZXN0X2J1ZmZsZW4sIENVUlJFTlRfU0MtPnJlc2lkLCBHRVRTVENOVCgpKTsKKworCVNFVFBPUlQoU1hGUkNUTDAsIENIMXxDTFJTVENOVCk7CisJU0VUUE9SVChETUFDTlRSTDAsIDApOworfQorCisvKgorICogZGF0YSBvdXQgcGhhc2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGRhdGFvX2luaXQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJU0VUUE9SVChETUFDTlRSTDAsIFdSSVRFX1JFQUQgfCBSU1RGSUZPKTsKKwlTRVRQT1JUKERNQUNOVFJMMCwgV1JJVEVfUkVBRCB8IEVORE1BKTsKKworCVNFVFBPUlQoU1hGUkNUTDAsIENIMXxDTFJTVENOVCk7CisJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxfFNDU0lFTnxETUFFTik7CisKKwlTRVRQT1JUKFNJTU9ERTAsIDApOworCVNFVFBPUlQoU0lNT0RFMSwgRU5TQ1NJUEVSUiB8IEVOU0NTSVJTVCB8IEVOUEhBU0VNSVMgfCBFTkJVU0ZSRUUgKTsKKworCURBVEFfTEVOID0gQ1VSUkVOVF9TQy0+cmVzaWQ7CisKKwlEUFJJTlRLKGRlYnVnX2RhdGFvLAorCQlERUJVR19MRUFEICJkYXRhb19pbml0OiByZXF1ZXN0X2J1ZmZsZW49JWQ7IHJlc2lkPSVkXG4iLAorCQlDTURJTkZPKENVUlJFTlRfU0MpLCBDVVJSRU5UX1NDLT5yZXF1ZXN0X2J1ZmZsZW4sIENVUlJFTlRfU0MtPnJlc2lkKTsKK30KKworc3RhdGljIHZvaWQgZGF0YW9fcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCXVuc2lnbmVkIGxvbmcgdGhlX3RpbWU7CisJaW50IGRhdGFfY291bnQ7CisKKwkvKiB1bnRpbCBwaGFzZSBjaGFuZ2VzIG9yIGFsbCBkYXRhIHNlbnQgKi8KKwl3aGlsZShURVNUTE8oRE1BU1RBVCwgSU5UU1RBVCkgJiYgQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWw+MCkgeworCQlkYXRhX2NvdW50ID0gMTI4OworCQlpZihkYXRhX2NvdW50ID4gQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwpCisJCQlkYXRhX2NvdW50PUNVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsOworCisJCWlmKFRFU1RMTyhETUFTVEFULCBERklGT0VNUCkpIHsKKwkJCXByaW50ayhFUlJfTEVBRCAiZGF0YW8gZmlmbyBub3QgZW1wdHkgKCVkKSIsIENNRElORk8oQ1VSUkVOVF9TQyksIEdFVFBPUlQoRklGT1NUQVQpKTsKKwkJCWRpc3BfcG9ydHMoc2hwbnQpOworCQkJYnJlYWs7CisJCX0KKworCQlpZihkYXRhX2NvdW50ICYgMSkgeworCQkJU0VUUE9SVChETUFDTlRSTDAsV1JJVEVfUkVBRHxFTkRNQXxfOEJJVCk7CisJCQlTRVRQT1JUKERBVEFQT1JULCAqQ1VSUkVOVF9TQy0+U0NwLnB0cisrKTsKKwkJCUNVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsLS07CisJCQlDVVJSRU5UX1NDLT5yZXNpZC0tOworCQkJU0VUUE9SVChETUFDTlRSTDAsV1JJVEVfUkVBRHxFTkRNQSk7CisJCX0KKworCQlpZihkYXRhX2NvdW50ID4gMSkgeworCQkJZGF0YV9jb3VudCA+Pj0gMTsKKwkJCW91dHN3KERBVEFQT1JULCBDVVJSRU5UX1NDLT5TQ3AucHRyLCBkYXRhX2NvdW50KTsKKwkJCUNVUlJFTlRfU0MtPlNDcC5wdHIgICAgICAgICAgICs9IDIgKiBkYXRhX2NvdW50OworCQkJQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgLT0gMiAqIGRhdGFfY291bnQ7CisJCQlDVVJSRU5UX1NDLT5yZXNpZCAgICAgICAgICAgICAtPSAyICogZGF0YV9jb3VudDsKKwkgIAl9CisKKwkJaWYoQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWw9PTAgJiYgQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw+MCkgeworCQkJLyogYWR2YW5jZSB0byBuZXh0IGJ1ZmZlciAqLworCQkJQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwtLTsKKwkJCUNVUlJFTlRfU0MtPlNDcC5idWZmZXIrKzsKKwkJCUNVUlJFTlRfU0MtPlNDcC5wdHIgICAgICAgICAgID0gU0dfQUREUkVTUyhDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyKTsKKwkJCUNVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsID0gQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCQl9CisKKwkJdGhlX3RpbWU9amlmZmllcyArIDEwMCpIWjsKKwkJd2hpbGUoVEVTVExPKERNQVNUQVQsIERGSUZPRU1QfElOVFNUQVQpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsdGhlX3RpbWUpKQorCQkJYmFycmllcigpOworCisJCWlmKFRFU1RMTyhETUFTVEFULCBERklGT0VNUHxJTlRTVEFUKSkgeworCQkJcHJpbnRrKEVSUl9MRUFEICJkYXRhb3V0IHRpbWVvdXQiLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCWRpc3BfcG9ydHMoc2hwbnQpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRhdGFvX2VuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpZihURVNUTE8oRE1BU1RBVCwgREZJRk9FTVApKSB7CisJCWludCBkYXRhX2NvdW50ID0gKERBVEFfTEVOIC0gQ1VSUkVOVF9TQy0+cmVzaWQpIC0gR0VUU1RDTlQoKTsKKworCQlEUFJJTlRLKGRlYnVnX2RhdGFvLCBERUJVR19MRUFEICJkYXRhbzogJWQgYnl0ZXMgdG8gcmVzZW5kICglZCB3cml0dGVuLCAlZCB0cmFuc2ZlcnJlZClcbiIsCisJCQlDTURJTkZPKENVUlJFTlRfU0MpLAorCQkJZGF0YV9jb3VudCwKKwkJCURBVEFfTEVOLUNVUlJFTlRfU0MtPnJlc2lkLAorCQkJR0VUU1RDTlQoKSk7CisKKwkJQ1VSUkVOVF9TQy0+cmVzaWQgKz0gZGF0YV9jb3VudDsKKworCQlpZihDVVJSRU5UX1NDLT51c2Vfc2cpIHsKKwkJCWRhdGFfY291bnQgLT0gQ1VSUkVOVF9TQy0+U0NwLnB0ciAtIFNHX0FERFJFU1MoQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlcik7CisJCQl3aGlsZShkYXRhX2NvdW50PjApIHsKKwkJCQlDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyLS07CisJCQkJQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwrKzsKKwkJCQlkYXRhX2NvdW50IC09IENVUlJFTlRfU0MtPlNDcC5idWZmZXItPmxlbmd0aDsKKwkJCX0KKwkJCUNVUlJFTlRfU0MtPlNDcC5wdHIgICAgICAgICAgID0gU0dfQUREUkVTUyhDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyKSAtIGRhdGFfY291bnQ7CisJCQlDVVJSRU5UX1NDLT5TQ3AudGhpc19yZXNpZHVhbCA9IENVUlJFTlRfU0MtPlNDcC5idWZmZXItPmxlbmd0aCArIGRhdGFfY291bnQ7CisJCX0gZWxzZSB7CisJCQlDVVJSRU5UX1NDLT5TQ3AucHRyICAgICAgICAgICAtPSBkYXRhX2NvdW50OworCQkJQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgKz0gZGF0YV9jb3VudDsKKwkJfQorCX0KKworCURQUklOVEsoZGVidWdfZGF0YW8sIERFQlVHX0xFQUQgImRhdGFvX2VuZDogcmVxdWVzdF9idWZmbGVuPSVkOyByZXNpZD0lZDsgc3RjbnQ9JWRcbiIsCisJCUNNRElORk8oQ1VSUkVOVF9TQyksCisJCUNVUlJFTlRfU0MtPnJlcXVlc3RfYnVmZmxlbiwKKwkJQ1VSUkVOVF9TQy0+cmVzaWQsCisJCUdFVFNUQ05UKCkpOworCisJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxfENMUkNIMXxDTFJTVENOVCk7CisJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxKTsKKworCVNFVFBPUlQoRE1BQ05UUkwwLCAwKTsKK30KKworLyoKKyAqIGZpZ3VyZSBvdXQgd2hhdCBzdGF0ZSB3ZSdyZSBpbgorICoKKyAqLworc3RhdGljIGludCB1cGRhdGVfc3RhdGUoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaW50IGRhdGFwaGFzZT0wOworCXVuc2lnbmVkIGludCBzdGF0MCA9IEdFVFBPUlQoU1NUQVQwKTsKKwl1bnNpZ25lZCBpbnQgc3RhdDEgPSBHRVRQT1JUKFNTVEFUMSk7CisKKwlQUkVWU1RBVEUgPSBTVEFURTsKKwlTVEFURT11bmtub3duOworCisJaWYoc3RhdDEgJiBTQ1NJUlNUSSkgeworCQlTVEFURT1yc3RpOworCQlTRVRQT1JUKFNDU0lTRVEsMCk7CisJCVNFVFBPUlQoU1NUQVQxLFNDU0lSU1RJKTsKKyAgCX0gZWxzZSBpZihzdGF0MCAmIFNFTERJICYmIFBSRVZTVEFURT09YnVzZnJlZSkgeworCQlTVEFURT1zZWxkaTsKKwl9IGVsc2UgaWYoc3RhdDAgJiBTRUxETyAmJiBDVVJSRU5UX1NDICYmIChDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBzZWxlY3RpbmcpKSB7CisJCVNUQVRFPXNlbGRvOworCX0gZWxzZSBpZihzdGF0MSAmIFNFTFRPKSB7CisJCVNUQVRFPXNlbHRvOworCX0gZWxzZSBpZihzdGF0MSAmIEJVU0ZSRUUpIHsKKwkJU1RBVEU9YnVzZnJlZTsKKwkJU0VUUE9SVChTU1RBVDEsQlVTRlJFRSk7CisJfSBlbHNlIGlmKHN0YXQxICYgU0NTSVBFUlIpIHsKKwkJU1RBVEU9cGFyZXJyOworCQlTRVRQT1JUKFNTVEFUMSxTQ1NJUEVSUik7CisJfSBlbHNlIGlmKHN0YXQxICYgUkVRSU5JVCkgeworCQlzd2l0Y2goR0VUUE9SVChTQ1NJU0lHKSAmIFBfTUFTSykgeworCQljYXNlIFBfTVNHSToJU1RBVEU9bXNnaTsJYnJlYWs7CisJCWNhc2UgUF9NU0dPOglTVEFURT1tc2dvOwlicmVhazsKKwkJY2FzZSBQX0RBVEFPOglTVEFURT1kYXRhbzsJYnJlYWs7CisJCWNhc2UgUF9EQVRBSToJU1RBVEU9ZGF0YWk7CWJyZWFrOworCQljYXNlIFBfU1RBVFVTOglTVEFURT1zdGF0dXM7CWJyZWFrOworCQljYXNlIFBfQ01EOglTVEFURT1jbWQ7CWJyZWFrOworCQl9CisJCWRhdGFwaGFzZT0xOworCX0KKworCWlmKChzdGF0MCAmIFNFTERJKSAmJiBTVEFURSE9c2VsZGkgJiYgIWRhdGFwaGFzZSkgeworCQlwcmludGsoSU5GT19MRUFEICJyZXNlbGVjdGlvbiBtaXNzZWQ/IiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCWRpc3BfcG9ydHMoc2hwbnQpOworCX0KKworCWlmKFNUQVRFIT1QUkVWU1RBVEUpIHsKKwkJTEFTVFNUQVRFPVBSRVZTVEFURTsKKwl9CisKKwlyZXR1cm4gZGF0YXBoYXNlOworfQorCisvKgorICogaGFuZGxlIHBhcml0eSBlcnJvcgorICoKKyAqIEZJWE1FOiBpbiB3aGljaCBwaGFzZT8KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHBhcmVycl9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJcHJpbnRrKEVSUl9MRUFEICJwYXJpdHkgZXJyb3JcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCWRvbmUoc2hwbnQsIERJRF9QQVJJVFkgPDwgMTYpOworfQorCisvKgorICogaGFuZGxlIHJlc2V0IGluCisgKgorICovCitzdGF0aWMgdm9pZCByc3RpX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlTY3NpX0NtbmQgKnB0cjsKKworCXByaW50ayhLRVJOX05PVElDRSAiYWhhMTUyeCVkOiBzY3NpIHJlc2V0IGluXG4iLCBIT1NUTk8pOworCQorCXB0cj1ESVNDT05ORUNURURfU0M7CisJd2hpbGUocHRyKSB7CisJCVNjc2lfQ21uZCAqbmV4dCA9IFNDTkVYVChwdHIpOworCisJCWlmICghcHRyLT5kZXZpY2UtPnNvZnRfcmVzZXQpIHsKKwkJCXJlbW92ZV9TQygmRElTQ09OTkVDVEVEX1NDLCBwdHIpOworCisJCQlrZnJlZShwdHItPmhvc3Rfc2NyaWJibGUpOworCQkJcHRyLT5ob3N0X3NjcmliYmxlPU5VTEw7CisKKwkJCXB0ci0+cmVzdWx0ID0gIERJRF9SRVNFVCA8PCAxNjsKKwkJCXB0ci0+c2NzaV9kb25lKHB0cik7CisJCX0KKworCQlwdHIgPSBuZXh0OworCX0KKworCWlmKENVUlJFTlRfU0MgJiYgIUNVUlJFTlRfU0MtPmRldmljZS0+c29mdF9yZXNldCkKKwkJZG9uZShzaHBudCwgRElEX1JFU0VUIDw8IDE2ICk7Cit9CisKKworLyoKKyAqIGJvdHRvbS1oYWxmIGhhbmRsZXIKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlzX2NvbXBsZXRlKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCWludCBkYXRhcGhhc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcGVuZGluZzsKKworCURPX0xPQ0soZmxhZ3MpOworCWlmKEhPU1REQVRBKHNocG50KS0+aW5faW50cikgeworCQlET19VTkxPQ0soZmxhZ3MpOworCQkvKiBhaGExNTJ4X2Vycm9yIG5ldmVyIHJldHVybnMuLiAqLworCQlhaGExNTJ4X2Vycm9yKHNocG50LCAiYm90dG9tLWhhbGYgYWxyZWFkeSBydW5uaW5nIT8iKTsKKwl9CisJSE9TVERBVEEoc2hwbnQpLT5pbl9pbnRyKys7CisKKwkvKgorCSAqIGxvb3Agd2hpbGUgdGhlcmUgYXJlIGludGVycnVwdCBjb25kaXRpb25zIHBlbmRpbmcKKwkgKgorCSAqLworCWRvIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCA9IGppZmZpZXM7CisJCURPX1VOTE9DSyhmbGFncyk7CisKKwkJZGF0YXBoYXNlPXVwZGF0ZV9zdGF0ZShzaHBudCk7CisKKwkJRFBSSU5USyhkZWJ1Z19waGFzZXMsIExFQUQgInN0YXJ0ICVzICVzKCVzKVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgc3RhdGVzW1NUQVRFXS5uYW1lLCBzdGF0ZXNbUFJFVlNUQVRFXS5uYW1lLCBzdGF0ZXNbTEFTVFNUQVRFXS5uYW1lKTsKKworCQkvKgorCQkgKiBlbmQgcHJldmlvdXMgc3RhdGUKKwkJICoKKwkJICovCisJCWlmKFBSRVZTVEFURSE9U1RBVEUgJiYgc3RhdGVzW1BSRVZTVEFURV0uZW5kKQorCQkJc3RhdGVzW1BSRVZTVEFURV0uZW5kKHNocG50KTsKKworCQkvKgorCQkgKiBkaXNhYmxlIFNQSU8gbW9kZSBpZiBwcmV2aW91cyBwaGFzZSB1c2VkIGl0CisJCSAqIGFuZCB0aGlzIG9uZSBkb2Vzbid0CisJCSAqCisJCSAqLworCQlpZihzdGF0ZXNbUFJFVlNUQVRFXS5zcGlvICYmICFzdGF0ZXNbU1RBVEVdLnNwaW8pIHsKKwkJCVNFVFBPUlQoU1hGUkNUTDAsIENIMSk7CisJCQlTRVRQT1JUKERNQUNOVFJMMCwgMCk7CisJCQlpZihDVVJSRU5UX1NDKQorCQkJCUNVUlJFTlRfU0MtPlNDcC5waGFzZSAmPSB+c3Bpb3JkeTsKKwkJfQorCisJCS8qCisJCSAqIGFjY2VwdCBjdXJyZW50IGRhdGFwaGFzZSBwaGFzZQorCQkgKgorCQkgKi8KKwkJaWYoZGF0YXBoYXNlKSB7CisJCQlTRVRQT1JUKFNTVEFUMCwgUkVRSU5JVCk7CisJCQlTRVRQT1JUKFNDU0lTSUcsIEdFVFBPUlQoU0NTSVNJRykgJiBQX01BU0spOworCQkJU0VUUE9SVChTU1RBVDEsIFBIQVNFQ0hHKTsgIAorCQl9CisJCQorCQkvKgorCQkgKiBlbmFibGUgU1BJTyBtb2RlIGlmIHByZXZpb3VzIGRpZG4ndCB1c2UgaXQKKwkJICogYW5kIHRoaXMgb25lIGRvZXMKKwkJICoKKwkJICovCisJCWlmKCFzdGF0ZXNbUFJFVlNUQVRFXS5zcGlvICYmIHN0YXRlc1tTVEFURV0uc3BpbykgeworCQkJU0VUUE9SVChETUFDTlRSTDAsIDApOworCQkJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxfFNQSU9FTik7CisJCQlpZihDVVJSRU5UX1NDKQorCQkJCUNVUlJFTlRfU0MtPlNDcC5waGFzZSB8PSBzcGlvcmR5OworCQl9CisJCQorCQkvKgorCQkgKiBpbml0aWFsaXplIGZvciBuZXcgc3RhdGUKKwkJICoKKwkJICovCisJCWlmKFBSRVZTVEFURSE9U1RBVEUgJiYgc3RhdGVzW1NUQVRFXS5pbml0KQorCQkJc3RhdGVzW1NUQVRFXS5pbml0KHNocG50KTsKKwkJCisJCS8qCisJCSAqIGhhbmRsZSBjdXJyZW50IHN0YXRlCisJCSAqCisJCSAqLworCQlpZihzdGF0ZXNbU1RBVEVdLnJ1bikKKwkJCXN0YXRlc1tTVEFURV0ucnVuKHNocG50KTsKKwkJZWxzZQorCQkJcHJpbnRrKEVSUl9MRUFEICJ1bmV4cGVjdGVkIHN0YXRlICgleClcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIFNUQVRFKTsKKwkJCisJCS8qCisJCSAqIHNldHVwIGNvbnRyb2xsZXIgdG8gaW50ZXJydXB0IG9uCisJCSAqIHRoZSBuZXh0IGV4cGVjdGVkIGNvbmRpdGlvbiBhbmQKKwkJICogbG9vcCBpZiBpdCdzIGFscmVhZHkgdGhlcmUKKwkJICoKKwkJICovCisJCURPX0xPQ0soZmxhZ3MpOworCQlwZW5kaW5nPXNldHVwX2V4cGVjdGVkX2ludGVycnVwdHMoc2hwbnQpOworI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQorCQlIT1NUREFUQShzaHBudCktPmNvdW50W1NUQVRFXSsrOworCQlpZihQUkVWU1RBVEUhPVNUQVRFKQorCQkJSE9TVERBVEEoc2hwbnQpLT5jb3VudF90cmFuc1tTVEFURV0rKzsKKwkJSE9TVERBVEEoc2hwbnQpLT50aW1lW1NUQVRFXSArPSBqaWZmaWVzLXN0YXJ0OworI2VuZGlmCisKKwkJRFBSSU5USyhkZWJ1Z19waGFzZXMsIExFQUQgImVuZCAlcyAlcyglcylcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIHN0YXRlc1tTVEFURV0ubmFtZSwgc3RhdGVzW1BSRVZTVEFURV0ubmFtZSwgc3RhdGVzW0xBU1RTVEFURV0ubmFtZSk7CisJfSB3aGlsZShwZW5kaW5nKTsKKworCS8qCisJICogZW5hYmxlIGludGVycnVwdHMgYW5kIGxlYXZlIGJvdHRvbS1oYWxmCisJICoKKwkgKi8KKwlIT1NUREFUQShzaHBudCktPmluX2ludHItLTsKKwlTRVRCSVRTKERNQUNOVFJMMCwgSU5URU4pOworCURPX1VOTE9DSyhmbGFncyk7Cit9CisKKworLyogCisgKiBEdW1wIHRoZSBjdXJyZW50IGRyaXZlciBzdGF0dXMgYW5kIHBhbmljCisgKi8KK3N0YXRpYyB2b2lkIGFoYTE1MnhfZXJyb3Ioc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQsIGNoYXIgKm1zZykKK3sKKwlwcmludGsoS0VSTl9FTUVSRyAiXG5haGExNTJ4JWQ6ICVzXG4iLCBIT1NUTk8sIG1zZyk7CisJc2hvd19xdWV1ZXMoc2hwbnQpOworCXBhbmljKCJhaGExNTJ4IHBhbmljXG4iKTsKK30KKworLyoKKyAqIERpc3BsYXkgcmVnaXN0ZXJzIG9mIEFJQy02MjYwCisgKi8KK3N0YXRpYyB2b2lkIGRpc3BfcG9ydHMoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCWludCBzOworCisJcHJpbnRrKCJcbiVzOiAlcyglcykgIiwKKwkJQ1VSUkVOVF9TQyA/ICJidXN5IiA6ICJ3YWl0aW5nIiwKKwkJc3RhdGVzW1NUQVRFXS5uYW1lLAorCQlzdGF0ZXNbUFJFVlNUQVRFXS5uYW1lKTsKKworCXMgPSBHRVRQT1JUKFNDU0lTRVEpOworCXByaW50aygiU0NTSVNFUSggIik7CisJaWYgKHMgJiBURU1PREVPKQorCQlwcmludGsoIlRBUkdFVCBNT0RFICIpOworCWlmIChzICYgRU5TRUxPKQorCQlwcmludGsoIlNFTE8gIik7CisJaWYgKHMgJiBFTlNFTEkpCisJCXByaW50aygiU0VMSSAiKTsKKwlpZiAocyAmIEVOUkVTRUxJKQorCQlwcmludGsoIlJFU0VMSSAiKTsKKwlpZiAocyAmIEVOQVVUT0FUTk8pCisJCXByaW50aygiQVVUT0FUTk8gIik7CisJaWYgKHMgJiBFTkFVVE9BVE5JKQorCQlwcmludGsoIkFVVE9BVE5JICIpOworCWlmIChzICYgRU5BVVRPQVROUCkKKwkJcHJpbnRrKCJBVVRPQVROUCAiKTsKKwlpZiAocyAmIFNDU0lSU1RPKQorCQlwcmludGsoIlNDU0lSU1RPICIpOworCXByaW50aygiKTsiKTsKKworCXByaW50aygiIFNDU0lTSUcoIik7CisJcyA9IEdFVFBPUlQoU0NTSVNJRyk7CisJc3dpdGNoIChzICYgUF9NQVNLKSB7CisJY2FzZSBQX0RBVEFPOgorCQlwcmludGsoIkRBVEEgT1VUIik7CisJCWJyZWFrOworCWNhc2UgUF9EQVRBSToKKwkJcHJpbnRrKCJEQVRBIElOIik7CisJCWJyZWFrOworCWNhc2UgUF9DTUQ6CisJCXByaW50aygiQ09NTUFORCIpOworCQlicmVhazsKKwljYXNlIFBfU1RBVFVTOgorCQlwcmludGsoIlNUQVRVUyIpOworCQlicmVhazsKKwljYXNlIFBfTVNHTzoKKwkJcHJpbnRrKCJNRVNTQUdFIE9VVCIpOworCQlicmVhazsKKwljYXNlIFBfTVNHSToKKwkJcHJpbnRrKCJNRVNTQUdFIElOIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiKmludmFsaWQqIik7CisJCWJyZWFrOworCX0KKworCXByaW50aygiKTsgIik7CisKKwlwcmludGsoIklOVFNUQVQgKCVzKTsgIiwgVEVTVEhJKERNQVNUQVQsIElOVFNUQVQpID8gImhpIiA6ICJsbyIpOworCisJcHJpbnRrKCJTU1RBVCggIik7CisJcyA9IEdFVFBPUlQoU1NUQVQwKTsKKwlpZiAocyAmIFRBUkdFVCkKKwkJcHJpbnRrKCJUQVJHRVQgIik7CisJaWYgKHMgJiBTRUxETykKKwkJcHJpbnRrKCJTRUxETyAiKTsKKwlpZiAocyAmIFNFTERJKQorCQlwcmludGsoIlNFTERJICIpOworCWlmIChzICYgU0VMSU5HTykKKwkJcHJpbnRrKCJTRUxJTkdPICIpOworCWlmIChzICYgU1dSQVApCisJCXByaW50aygiU1dSQVAgIik7CisJaWYgKHMgJiBTRE9ORSkKKwkJcHJpbnRrKCJTRE9ORSAiKTsKKwlpZiAocyAmIFNQSU9SRFkpCisJCXByaW50aygiU1BJT1JEWSAiKTsKKwlpZiAocyAmIERNQURPTkUpCisJCXByaW50aygiRE1BRE9ORSAiKTsKKworCXMgPSBHRVRQT1JUKFNTVEFUMSk7CisJaWYgKHMgJiBTRUxUTykKKwkJcHJpbnRrKCJTRUxUTyAiKTsKKwlpZiAocyAmIEFUTlRBUkcpCisJCXByaW50aygiQVROVEFSRyAiKTsKKwlpZiAocyAmIFNDU0lSU1RJKQorCQlwcmludGsoIlNDU0lSU1RJICIpOworCWlmIChzICYgUEhBU0VNSVMpCisJCXByaW50aygiUEhBU0VNSVMgIik7CisJaWYgKHMgJiBCVVNGUkVFKQorCQlwcmludGsoIkJVU0ZSRUUgIik7CisJaWYgKHMgJiBTQ1NJUEVSUikKKwkJcHJpbnRrKCJTQ1NJUEVSUiAiKTsKKwlpZiAocyAmIFBIQVNFQ0hHKQorCQlwcmludGsoIlBIQVNFQ0hHICIpOworCWlmIChzICYgUkVRSU5JVCkKKwkJcHJpbnRrKCJSRVFJTklUICIpOworCXByaW50aygiKTsgIik7CisKKworCXByaW50aygiU1NUQVQoICIpOworCisJcyA9IEdFVFBPUlQoU1NUQVQwKSAmIEdFVFBPUlQoU0lNT0RFMCk7CisKKwlpZiAocyAmIFRBUkdFVCkKKwkJcHJpbnRrKCJUQVJHRVQgIik7CisJaWYgKHMgJiBTRUxETykKKwkJcHJpbnRrKCJTRUxETyAiKTsKKwlpZiAocyAmIFNFTERJKQorCQlwcmludGsoIlNFTERJICIpOworCWlmIChzICYgU0VMSU5HTykKKwkJcHJpbnRrKCJTRUxJTkdPICIpOworCWlmIChzICYgU1dSQVApCisJCXByaW50aygiU1dSQVAgIik7CisJaWYgKHMgJiBTRE9ORSkKKwkJcHJpbnRrKCJTRE9ORSAiKTsKKwlpZiAocyAmIFNQSU9SRFkpCisJCXByaW50aygiU1BJT1JEWSAiKTsKKwlpZiAocyAmIERNQURPTkUpCisJCXByaW50aygiRE1BRE9ORSAiKTsKKworCXMgPSBHRVRQT1JUKFNTVEFUMSkgJiBHRVRQT1JUKFNJTU9ERTEpOworCisJaWYgKHMgJiBTRUxUTykKKwkJcHJpbnRrKCJTRUxUTyAiKTsKKwlpZiAocyAmIEFUTlRBUkcpCisJCXByaW50aygiQVROVEFSRyAiKTsKKwlpZiAocyAmIFNDU0lSU1RJKQorCQlwcmludGsoIlNDU0lSU1RJICIpOworCWlmIChzICYgUEhBU0VNSVMpCisJCXByaW50aygiUEhBU0VNSVMgIik7CisJaWYgKHMgJiBCVVNGUkVFKQorCQlwcmludGsoIkJVU0ZSRUUgIik7CisJaWYgKHMgJiBTQ1NJUEVSUikKKwkJcHJpbnRrKCJTQ1NJUEVSUiAiKTsKKwlpZiAocyAmIFBIQVNFQ0hHKQorCQlwcmludGsoIlBIQVNFQ0hHICIpOworCWlmIChzICYgUkVRSU5JVCkKKwkJcHJpbnRrKCJSRVFJTklUICIpOworCXByaW50aygiKTsgIik7CisKKwlwcmludGsoIlNYRlJDVEwwKCAiKTsKKworCXMgPSBHRVRQT1JUKFNYRlJDVEwwKTsKKwlpZiAocyAmIFNDU0lFTikKKwkJcHJpbnRrKCJTQ1NJRU4gIik7CisJaWYgKHMgJiBETUFFTikKKwkJcHJpbnRrKCJETUFFTiAiKTsKKwlpZiAocyAmIENIMSkKKwkJcHJpbnRrKCJDSDEgIik7CisJaWYgKHMgJiBDTFJTVENOVCkKKwkJcHJpbnRrKCJDTFJTVENOVCAiKTsKKwlpZiAocyAmIFNQSU9FTikKKwkJcHJpbnRrKCJTUElPRU4gIik7CisJaWYgKHMgJiBDTFJDSDEpCisJCXByaW50aygiQ0xSQ0gxICIpOworCXByaW50aygiKTsgIik7CisKKwlwcmludGsoIlNJR05BTCggIik7CisKKwlzID0gR0VUUE9SVChTQ1NJU0lHKTsKKwlpZiAocyAmIFNJR19BVE5JKQorCQlwcmludGsoIkFUTkkgIik7CisJaWYgKHMgJiBTSUdfU0VMSSkKKwkJcHJpbnRrKCJTRUxJICIpOworCWlmIChzICYgU0lHX0JTWUkpCisJCXByaW50aygiQlNZSSAiKTsKKwlpZiAocyAmIFNJR19SRVFJKQorCQlwcmludGsoIlJFUUkgIik7CisJaWYgKHMgJiBTSUdfQUNLSSkKKwkJcHJpbnRrKCJBQ0tJICIpOworCXByaW50aygiKTsgIik7CisKKwlwcmludGsoIlNFTElEICglMDJ4KSwgIiwgR0VUUE9SVChTRUxJRCkpOworCisJcHJpbnRrKCJTVENOVCAoJWQpLCAiLCBHRVRTVENOVCgpKTsKKwkKKwlwcmludGsoIlNTVEFUMiggIik7CisKKwlzID0gR0VUUE9SVChTU1RBVDIpOworCWlmIChzICYgU09GRlNFVCkKKwkJcHJpbnRrKCJTT0ZGU0VUICIpOworCWlmIChzICYgU0VNUFRZKQorCQlwcmludGsoIlNFTVBUWSAiKTsKKwlpZiAocyAmIFNGVUxMKQorCQlwcmludGsoIlNGVUxMICIpOworCXByaW50aygiKTsgU0ZDTlQgKCVkKTsgIiwgcyAmIChTRlVMTCB8IFNGQ05UKSk7CisKKwlzID0gR0VUUE9SVChTU1RBVDMpOworCXByaW50aygiU0NTSUNOVCAoJWQpLCBPRkZDTlQoJWQpLCAiLCAocyAmIDB4ZjApID4+IDQsIHMgJiAweDBmKTsKKworCXByaW50aygiU1NUQVQ0KCAiKTsKKwlzID0gR0VUUE9SVChTU1RBVDQpOworCWlmIChzICYgU1lOQ0VSUikKKwkJcHJpbnRrKCJTWU5DRVJSICIpOworCWlmIChzICYgRldFUlIpCisJCXByaW50aygiRldFUlIgIik7CisJaWYgKHMgJiBGUkVSUikKKwkJcHJpbnRrKCJGUkVSUiAiKTsKKwlwcmludGsoIik7ICIpOworCisJcHJpbnRrKCJETUFDTlRSTDAoICIpOworCXMgPSBHRVRQT1JUKERNQUNOVFJMMCk7CisJcHJpbnRrKCIlcyAiLCBzICYgXzhCSVQgPyAiOEJJVCIgOiAiMTZCSVQiKTsKKwlwcmludGsoIiVzICIsIHMgJiBETUEgPyAiRE1BIiA6ICJQSU8iKTsKKwlwcmludGsoIiVzICIsIHMgJiBXUklURV9SRUFEID8gIldSSVRFIiA6ICJSRUFEIik7CisJaWYgKHMgJiBFTkRNQSkKKwkJcHJpbnRrKCJFTkRNQSAiKTsKKwlpZiAocyAmIElOVEVOKQorCQlwcmludGsoIklOVEVOICIpOworCWlmIChzICYgUlNURklGTykKKwkJcHJpbnRrKCJSU1RGSUZPICIpOworCWlmIChzICYgU1dJTlQpCisJCXByaW50aygiU1dJTlQgIik7CisJcHJpbnRrKCIpOyAiKTsKKworCXByaW50aygiRE1BU1RBVCggIik7CisJcyA9IEdFVFBPUlQoRE1BU1RBVCk7CisJaWYgKHMgJiBBVERPTkUpCisJCXByaW50aygiQVRET05FICIpOworCWlmIChzICYgV09SRFJEWSkKKwkJcHJpbnRrKCJXT1JEUkRZICIpOworCWlmIChzICYgREZJRk9GVUxMKQorCQlwcmludGsoIkRGSUZPRlVMTCAiKTsKKwlpZiAocyAmIERGSUZPRU1QKQorCQlwcmludGsoIkRGSUZPRU1QICIpOworCXByaW50aygiKVxuIik7CisjZW5kaWYKK30KKworLyoKKyAqIGRpc3BsYXkgZW5hYmxlZCBpbnRlcnJ1cHRzCisgKi8KK3N0YXRpYyB2b2lkIGRpc3BfZW5pbnRyKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCWludCBzOworCisJcHJpbnRrKEtFUk5fREVCVUcgImVuYWJsZWQgaW50ZXJydXB0cyAoICIpOworCisJcyA9IEdFVFBPUlQoU0lNT0RFMCk7CisJaWYgKHMgJiBFTlNFTERPKQorCQlwcmludGsoIkVOU0VMRE8gIik7CisJaWYgKHMgJiBFTlNFTERJKQorCQlwcmludGsoIkVOU0VMREkgIik7CisJaWYgKHMgJiBFTlNFTElOR08pCisJCXByaW50aygiRU5TRUxJTkdPICIpOworCWlmIChzICYgRU5TV1JBUCkKKwkJcHJpbnRrKCJFTlNXUkFQICIpOworCWlmIChzICYgRU5TRE9ORSkKKwkJcHJpbnRrKCJFTlNET05FICIpOworCWlmIChzICYgRU5TUElPUkRZKQorCQlwcmludGsoIkVOU1BJT1JEWSAiKTsKKwlpZiAocyAmIEVORE1BRE9ORSkKKwkJcHJpbnRrKCJFTkRNQURPTkUgIik7CisKKwlzID0gR0VUUE9SVChTSU1PREUxKTsKKwlpZiAocyAmIEVOU0VMVElNTykKKwkJcHJpbnRrKCJFTlNFTFRJTU8gIik7CisJaWYgKHMgJiBFTkFUTlRBUkcpCisJCXByaW50aygiRU5BVE5UQVJHICIpOworCWlmIChzICYgRU5QSEFTRU1JUykKKwkJcHJpbnRrKCJFTlBIQVNFTUlTICIpOworCWlmIChzICYgRU5CVVNGUkVFKQorCQlwcmludGsoIkVOQlVTRlJFRSAiKTsKKwlpZiAocyAmIEVOU0NTSVBFUlIpCisJCXByaW50aygiRU5TQ1NJUEVSUiAiKTsKKwlpZiAocyAmIEVOUEhBU0VDSEcpCisJCXByaW50aygiRU5QSEFTRUNIRyAiKTsKKwlpZiAocyAmIEVOUkVRSU5JVCkKKwkJcHJpbnRrKCJFTlJFUUlOSVQgIik7CisJcHJpbnRrKCIpXG4iKTsKK30KKworLyoKKyAqIFNob3cgdGhlIGNvbW1hbmQgZGF0YSBvZiBhIGNvbW1hbmQKKyAqLworc3RhdGljIHZvaWQgc2hvd19jb21tYW5kKFNjc2lfQ21uZCAqcHRyKQoreworCXByaW50ayhLRVJOX0RFQlVHICIweCUwOHg6IHRhcmdldD0lZDsgbHVuPSVkOyBjbW5kPSgiLAorCSAgICAgICAodW5zaWduZWQgaW50KSBwdHIsIHB0ci0+ZGV2aWNlLT5pZCwgcHRyLT5kZXZpY2UtPmx1bik7CisKKwlwcmludF9jb21tYW5kKHB0ci0+Y21uZCk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiKTsgcmVxdWVzdF9idWZmbGVuPSVkOyByZXNpZD0lZDsgcGhhc2UgfCIsCisJICAgICAgIHB0ci0+cmVxdWVzdF9idWZmbGVuLCBwdHItPnJlc2lkKTsKKworCWlmIChwdHItPlNDcC5waGFzZSAmIG5vdF9pc3N1ZWQpCisJCXByaW50aygibm90IGlzc3VlZHwiKTsKKwlpZiAocHRyLT5TQ3AucGhhc2UgJiBzZWxlY3RpbmcpCisJCXByaW50aygic2VsZWN0aW5nfCIpOworCWlmIChwdHItPlNDcC5waGFzZSAmIGlkZW50aWZpZWQpCisJCXByaW50aygiaWRlbnRpZmllZHwiKTsKKwlpZiAocHRyLT5TQ3AucGhhc2UgJiBkaXNjb25uZWN0ZWQpCisJCXByaW50aygiZGlzY29ubmVjdGVkfCIpOworCWlmIChwdHItPlNDcC5waGFzZSAmIGNvbXBsZXRlZCkKKwkJcHJpbnRrKCJjb21wbGV0ZWR8Iik7CisJaWYgKHB0ci0+U0NwLnBoYXNlICYgc3Bpb3JkeSkKKwkJcHJpbnRrKCJzcGlvcmR5fCIpOworCWlmIChwdHItPlNDcC5waGFzZSAmIHN5bmNuZWcpCisJCXByaW50aygic3luY25lZ3wiKTsKKwlpZiAocHRyLT5TQ3AucGhhc2UgJiBhYm9ydGVkKQorCQlwcmludGsoImFib3J0ZWR8Iik7CisJaWYgKHB0ci0+U0NwLnBoYXNlICYgcmVzZXR0ZWQpCisJCXByaW50aygicmVzZXR0ZWR8Iik7CisJaWYoIFNDREFUQShwdHIpICkgeworCQlwcmludGsoIjsgbmV4dD0weCVwXG4iLCBTQ05FWFQocHRyKSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCI7IG5leHQ9KGhvc3Qgc2NyaWJibGUgTlVMTClcbiIpOworCX0KK30KKworLyoKKyAqIER1bXAgdGhlIHF1ZXVlZCBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIHNob3dfcXVldWVzKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCVNjc2lfQ21uZCAqcHRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlET19MT0NLKGZsYWdzKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXG5xdWV1ZSBzdGF0dXM6XG5pc3N1ZV9TQzpcbiIpOworCWZvciAocHRyID0gSVNTVUVfU0M7IHB0cjsgcHRyID0gU0NORVhUKHB0cikpCisJCXNob3dfY29tbWFuZChwdHIpOworCURPX1VOTE9DSyhmbGFncyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiY3VycmVudF9TQzpcbiIpOworCWlmIChDVVJSRU5UX1NDKQorCQlzaG93X2NvbW1hbmQoQ1VSUkVOVF9TQyk7CisJZWxzZQorCQlwcmludGsoS0VSTl9ERUJVRyAibm9uZVxuIik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiZGlzY29ubmVjdGVkX1NDOlxuIik7CisJZm9yIChwdHIgPSBESVNDT05ORUNURURfU0M7IHB0cjsgcHRyID0gU0NEQVRBKHB0cikgPyBTQ05FWFQocHRyKSA6IE5VTEwpCisJCXNob3dfY29tbWFuZChwdHIpOworCisJZGlzcF9wb3J0cyhzaHBudCk7CisJZGlzcF9lbmludHIoc2hwbnQpOworfQorCisjdW5kZWYgU1BSSU5URgorI2RlZmluZSBTUFJJTlRGKGFyZ3MuLi4pIHBvcyArPSBzcHJpbnRmKHBvcywgIyMgYXJncykKKworc3RhdGljIGludCBnZXRfY29tbWFuZChjaGFyICpwb3MsIFNjc2lfQ21uZCAqIHB0cikKK3sKKwljaGFyICpzdGFydCA9IHBvczsKKwlpbnQgaTsKKworCVNQUklOVEYoIjB4JTA4eDogdGFyZ2V0PSVkOyBsdW49JWQ7IGNtbmQ9KCAiLAorCQkodW5zaWduZWQgaW50KSBwdHIsIHB0ci0+ZGV2aWNlLT5pZCwgcHRyLT5kZXZpY2UtPmx1bik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ09NTUFORF9TSVpFKHB0ci0+Y21uZFswXSk7IGkrKykKKwkJU1BSSU5URigiMHglMDJ4ICIsIHB0ci0+Y21uZFtpXSk7CisKKwlTUFJJTlRGKCIpOyByZXNpZD0lZDsgcmVzaWR1YWw9JWQ7IGJ1ZmZlcnM9JWQ7IHBoYXNlIHwiLAorCQlwdHItPnJlc2lkLCBwdHItPlNDcC50aGlzX3Jlc2lkdWFsLCBwdHItPlNDcC5idWZmZXJzX3Jlc2lkdWFsKTsKKworCWlmIChwdHItPlNDcC5waGFzZSAmIG5vdF9pc3N1ZWQpCisJCVNQUklOVEYoIm5vdCBpc3N1ZWR8Iik7CisJaWYgKHB0ci0+U0NwLnBoYXNlICYgc2VsZWN0aW5nKQorCQlTUFJJTlRGKCJzZWxlY3Rpbmd8Iik7CisJaWYgKHB0ci0+U0NwLnBoYXNlICYgZGlzY29ubmVjdGVkKQorCQlTUFJJTlRGKCJkaXNjb25uZWN0ZWR8Iik7CisJaWYgKHB0ci0+U0NwLnBoYXNlICYgYWJvcnRlZCkKKwkJU1BSSU5URigiYWJvcnRlZHwiKTsKKwlpZiAocHRyLT5TQ3AucGhhc2UgJiBpZGVudGlmaWVkKQorCQlTUFJJTlRGKCJpZGVudGlmaWVkfCIpOworCWlmIChwdHItPlNDcC5waGFzZSAmIGNvbXBsZXRlZCkKKwkJU1BSSU5URigiY29tcGxldGVkfCIpOworCWlmIChwdHItPlNDcC5waGFzZSAmIHNwaW9yZHkpCisJCVNQUklOVEYoInNwaW9yZHl8Iik7CisJaWYgKHB0ci0+U0NwLnBoYXNlICYgc3luY25lZykKKwkJU1BSSU5URigic3luY25lZ3wiKTsKKwlTUFJJTlRGKCI7IG5leHQ9MHglcFxuIiwgU0NORVhUKHB0cikpOworCisJcmV0dXJuIChwb3MgLSBzdGFydCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3BvcnRzKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50LCBjaGFyICpwb3MpCit7CisJY2hhciAqc3RhcnQgPSBwb3M7CisJaW50IHM7CisKKwlTUFJJTlRGKCJcbiVzOiAlcyglcykgIiwgQ1VSUkVOVF9TQyA/ICJvbiBidXMiIDogIndhaXRpbmciLCBzdGF0ZXNbU1RBVEVdLm5hbWUsIHN0YXRlc1tQUkVWU1RBVEVdLm5hbWUpOworCisJcyA9IEdFVFBPUlQoU0NTSVNFUSk7CisJU1BSSU5URigiU0NTSVNFUSggIik7CisJaWYgKHMgJiBURU1PREVPKQorCQlTUFJJTlRGKCJUQVJHRVQgTU9ERSAiKTsKKwlpZiAocyAmIEVOU0VMTykKKwkJU1BSSU5URigiU0VMTyAiKTsKKwlpZiAocyAmIEVOU0VMSSkKKwkJU1BSSU5URigiU0VMSSAiKTsKKwlpZiAocyAmIEVOUkVTRUxJKQorCQlTUFJJTlRGKCJSRVNFTEkgIik7CisJaWYgKHMgJiBFTkFVVE9BVE5PKQorCQlTUFJJTlRGKCJBVVRPQVROTyAiKTsKKwlpZiAocyAmIEVOQVVUT0FUTkkpCisJCVNQUklOVEYoIkFVVE9BVE5JICIpOworCWlmIChzICYgRU5BVVRPQVROUCkKKwkJU1BSSU5URigiQVVUT0FUTlAgIik7CisJaWYgKHMgJiBTQ1NJUlNUTykKKwkJU1BSSU5URigiU0NTSVJTVE8gIik7CisJU1BSSU5URigiKTsiKTsKKworCVNQUklOVEYoIiBTQ1NJU0lHKCIpOworCXMgPSBHRVRQT1JUKFNDU0lTSUcpOworCXN3aXRjaCAocyAmIFBfTUFTSykgeworCWNhc2UgUF9EQVRBTzoKKwkJU1BSSU5URigiREFUQSBPVVQiKTsKKwkJYnJlYWs7CisJY2FzZSBQX0RBVEFJOgorCQlTUFJJTlRGKCJEQVRBIElOIik7CisJCWJyZWFrOworCWNhc2UgUF9DTUQ6CisJCVNQUklOVEYoIkNPTU1BTkQiKTsKKwkJYnJlYWs7CisJY2FzZSBQX1NUQVRVUzoKKwkJU1BSSU5URigiU1RBVFVTIik7CisJCWJyZWFrOworCWNhc2UgUF9NU0dPOgorCQlTUFJJTlRGKCJNRVNTQUdFIE9VVCIpOworCQlicmVhazsKKwljYXNlIFBfTVNHSToKKwkJU1BSSU5URigiTUVTU0FHRSBJTiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlTUFJJTlRGKCIqaW52YWxpZCoiKTsKKwkJYnJlYWs7CisJfQorCisJU1BSSU5URigiKTsgIik7CisKKwlTUFJJTlRGKCJJTlRTVEFUICglcyk7ICIsIFRFU1RISShETUFTVEFULCBJTlRTVEFUKSA/ICJoaSIgOiAibG8iKTsKKworCVNQUklOVEYoIlNTVEFUKCAiKTsKKwlzID0gR0VUUE9SVChTU1RBVDApOworCWlmIChzICYgVEFSR0VUKQorCQlTUFJJTlRGKCJUQVJHRVQgIik7CisJaWYgKHMgJiBTRUxETykKKwkJU1BSSU5URigiU0VMRE8gIik7CisJaWYgKHMgJiBTRUxESSkKKwkJU1BSSU5URigiU0VMREkgIik7CisJaWYgKHMgJiBTRUxJTkdPKQorCQlTUFJJTlRGKCJTRUxJTkdPICIpOworCWlmIChzICYgU1dSQVApCisJCVNQUklOVEYoIlNXUkFQICIpOworCWlmIChzICYgU0RPTkUpCisJCVNQUklOVEYoIlNET05FICIpOworCWlmIChzICYgU1BJT1JEWSkKKwkJU1BSSU5URigiU1BJT1JEWSAiKTsKKwlpZiAocyAmIERNQURPTkUpCisJCVNQUklOVEYoIkRNQURPTkUgIik7CisKKwlzID0gR0VUUE9SVChTU1RBVDEpOworCWlmIChzICYgU0VMVE8pCisJCVNQUklOVEYoIlNFTFRPICIpOworCWlmIChzICYgQVROVEFSRykKKwkJU1BSSU5URigiQVROVEFSRyAiKTsKKwlpZiAocyAmIFNDU0lSU1RJKQorCQlTUFJJTlRGKCJTQ1NJUlNUSSAiKTsKKwlpZiAocyAmIFBIQVNFTUlTKQorCQlTUFJJTlRGKCJQSEFTRU1JUyAiKTsKKwlpZiAocyAmIEJVU0ZSRUUpCisJCVNQUklOVEYoIkJVU0ZSRUUgIik7CisJaWYgKHMgJiBTQ1NJUEVSUikKKwkJU1BSSU5URigiU0NTSVBFUlIgIik7CisJaWYgKHMgJiBQSEFTRUNIRykKKwkJU1BSSU5URigiUEhBU0VDSEcgIik7CisJaWYgKHMgJiBSRVFJTklUKQorCQlTUFJJTlRGKCJSRVFJTklUICIpOworCVNQUklOVEYoIik7ICIpOworCisKKwlTUFJJTlRGKCJTU1RBVCggIik7CisKKwlzID0gR0VUUE9SVChTU1RBVDApICYgR0VUUE9SVChTSU1PREUwKTsKKworCWlmIChzICYgVEFSR0VUKQorCQlTUFJJTlRGKCJUQVJHRVQgIik7CisJaWYgKHMgJiBTRUxETykKKwkJU1BSSU5URigiU0VMRE8gIik7CisJaWYgKHMgJiBTRUxESSkKKwkJU1BSSU5URigiU0VMREkgIik7CisJaWYgKHMgJiBTRUxJTkdPKQorCQlTUFJJTlRGKCJTRUxJTkdPICIpOworCWlmIChzICYgU1dSQVApCisJCVNQUklOVEYoIlNXUkFQICIpOworCWlmIChzICYgU0RPTkUpCisJCVNQUklOVEYoIlNET05FICIpOworCWlmIChzICYgU1BJT1JEWSkKKwkJU1BSSU5URigiU1BJT1JEWSAiKTsKKwlpZiAocyAmIERNQURPTkUpCisJCVNQUklOVEYoIkRNQURPTkUgIik7CisKKwlzID0gR0VUUE9SVChTU1RBVDEpICYgR0VUUE9SVChTSU1PREUxKTsKKworCWlmIChzICYgU0VMVE8pCisJCVNQUklOVEYoIlNFTFRPICIpOworCWlmIChzICYgQVROVEFSRykKKwkJU1BSSU5URigiQVROVEFSRyAiKTsKKwlpZiAocyAmIFNDU0lSU1RJKQorCQlTUFJJTlRGKCJTQ1NJUlNUSSAiKTsKKwlpZiAocyAmIFBIQVNFTUlTKQorCQlTUFJJTlRGKCJQSEFTRU1JUyAiKTsKKwlpZiAocyAmIEJVU0ZSRUUpCisJCVNQUklOVEYoIkJVU0ZSRUUgIik7CisJaWYgKHMgJiBTQ1NJUEVSUikKKwkJU1BSSU5URigiU0NTSVBFUlIgIik7CisJaWYgKHMgJiBQSEFTRUNIRykKKwkJU1BSSU5URigiUEhBU0VDSEcgIik7CisJaWYgKHMgJiBSRVFJTklUKQorCQlTUFJJTlRGKCJSRVFJTklUICIpOworCVNQUklOVEYoIik7ICIpOworCisJU1BSSU5URigiU1hGUkNUTDAoICIpOworCisJcyA9IEdFVFBPUlQoU1hGUkNUTDApOworCWlmIChzICYgU0NTSUVOKQorCQlTUFJJTlRGKCJTQ1NJRU4gIik7CisJaWYgKHMgJiBETUFFTikKKwkJU1BSSU5URigiRE1BRU4gIik7CisJaWYgKHMgJiBDSDEpCisJCVNQUklOVEYoIkNIMSAiKTsKKwlpZiAocyAmIENMUlNUQ05UKQorCQlTUFJJTlRGKCJDTFJTVENOVCAiKTsKKwlpZiAocyAmIFNQSU9FTikKKwkJU1BSSU5URigiU1BJT0VOICIpOworCWlmIChzICYgQ0xSQ0gxKQorCQlTUFJJTlRGKCJDTFJDSDEgIik7CisJU1BSSU5URigiKTsgIik7CisKKwlTUFJJTlRGKCJTSUdOQUwoICIpOworCisJcyA9IEdFVFBPUlQoU0NTSVNJRyk7CisJaWYgKHMgJiBTSUdfQVROSSkKKwkJU1BSSU5URigiQVROSSAiKTsKKwlpZiAocyAmIFNJR19TRUxJKQorCQlTUFJJTlRGKCJTRUxJICIpOworCWlmIChzICYgU0lHX0JTWUkpCisJCVNQUklOVEYoIkJTWUkgIik7CisJaWYgKHMgJiBTSUdfUkVRSSkKKwkJU1BSSU5URigiUkVRSSAiKTsKKwlpZiAocyAmIFNJR19BQ0tJKQorCQlTUFJJTlRGKCJBQ0tJICIpOworCVNQUklOVEYoIik7ICIpOworCisJU1BSSU5URigiU0VMSUQoJTAyeCksICIsIEdFVFBPUlQoU0VMSUQpKTsKKworCVNQUklOVEYoIlNUQ05UKCVkKSwgIiwgR0VUU1RDTlQoKSk7CisKKwlTUFJJTlRGKCJTU1RBVDIoICIpOworCisJcyA9IEdFVFBPUlQoU1NUQVQyKTsKKwlpZiAocyAmIFNPRkZTRVQpCisJCVNQUklOVEYoIlNPRkZTRVQgIik7CisJaWYgKHMgJiBTRU1QVFkpCisJCVNQUklOVEYoIlNFTVBUWSAiKTsKKwlpZiAocyAmIFNGVUxMKQorCQlTUFJJTlRGKCJTRlVMTCAiKTsKKwlTUFJJTlRGKCIpOyBTRkNOVCAoJWQpOyAiLCBzICYgKFNGVUxMIHwgU0ZDTlQpKTsKKworCXMgPSBHRVRQT1JUKFNTVEFUMyk7CisJU1BSSU5URigiU0NTSUNOVCAoJWQpLCBPRkZDTlQoJWQpLCAiLCAocyAmIDB4ZjApID4+IDQsIHMgJiAweDBmKTsKKworCVNQUklOVEYoIlNTVEFUNCggIik7CisJcyA9IEdFVFBPUlQoU1NUQVQ0KTsKKwlpZiAocyAmIFNZTkNFUlIpCisJCVNQUklOVEYoIlNZTkNFUlIgIik7CisJaWYgKHMgJiBGV0VSUikKKwkJU1BSSU5URigiRldFUlIgIik7CisJaWYgKHMgJiBGUkVSUikKKwkJU1BSSU5URigiRlJFUlIgIik7CisJU1BSSU5URigiKTsgIik7CisKKwlTUFJJTlRGKCJETUFDTlRSTDAoICIpOworCXMgPSBHRVRQT1JUKERNQUNOVFJMMCk7CisJU1BSSU5URigiJXMgIiwgcyAmIF84QklUID8gIjhCSVQiIDogIjE2QklUIik7CisJU1BSSU5URigiJXMgIiwgcyAmIERNQSA/ICJETUEiIDogIlBJTyIpOworCVNQUklOVEYoIiVzICIsIHMgJiBXUklURV9SRUFEID8gIldSSVRFIiA6ICJSRUFEIik7CisJaWYgKHMgJiBFTkRNQSkKKwkJU1BSSU5URigiRU5ETUEgIik7CisJaWYgKHMgJiBJTlRFTikKKwkJU1BSSU5URigiSU5URU4gIik7CisJaWYgKHMgJiBSU1RGSUZPKQorCQlTUFJJTlRGKCJSU1RGSUZPICIpOworCWlmIChzICYgU1dJTlQpCisJCVNQUklOVEYoIlNXSU5UICIpOworCVNQUklOVEYoIik7ICIpOworCisJU1BSSU5URigiRE1BU1RBVCggIik7CisJcyA9IEdFVFBPUlQoRE1BU1RBVCk7CisJaWYgKHMgJiBBVERPTkUpCisJCVNQUklOVEYoIkFURE9ORSAiKTsKKwlpZiAocyAmIFdPUkRSRFkpCisJCVNQUklOVEYoIldPUkRSRFkgIik7CisJaWYgKHMgJiBERklGT0ZVTEwpCisJCVNQUklOVEYoIkRGSUZPRlVMTCAiKTsKKwlpZiAocyAmIERGSUZPRU1QKQorCQlTUFJJTlRGKCJERklGT0VNUCAiKTsKKwlTUFJJTlRGKCIpXG4iKTsKKworCVNQUklOVEYoImVuYWJsZWQgaW50ZXJydXB0cyggIik7CisKKwlzID0gR0VUUE9SVChTSU1PREUwKTsKKwlpZiAocyAmIEVOU0VMRE8pCisJCVNQUklOVEYoIkVOU0VMRE8gIik7CisJaWYgKHMgJiBFTlNFTERJKQorCQlTUFJJTlRGKCJFTlNFTERJICIpOworCWlmIChzICYgRU5TRUxJTkdPKQorCQlTUFJJTlRGKCJFTlNFTElOR08gIik7CisJaWYgKHMgJiBFTlNXUkFQKQorCQlTUFJJTlRGKCJFTlNXUkFQICIpOworCWlmIChzICYgRU5TRE9ORSkKKwkJU1BSSU5URigiRU5TRE9ORSAiKTsKKwlpZiAocyAmIEVOU1BJT1JEWSkKKwkJU1BSSU5URigiRU5TUElPUkRZICIpOworCWlmIChzICYgRU5ETUFET05FKQorCQlTUFJJTlRGKCJFTkRNQURPTkUgIik7CisKKwlzID0gR0VUUE9SVChTSU1PREUxKTsKKwlpZiAocyAmIEVOU0VMVElNTykKKwkJU1BSSU5URigiRU5TRUxUSU1PICIpOworCWlmIChzICYgRU5BVE5UQVJHKQorCQlTUFJJTlRGKCJFTkFUTlRBUkcgIik7CisJaWYgKHMgJiBFTlBIQVNFTUlTKQorCQlTUFJJTlRGKCJFTlBIQVNFTUlTICIpOworCWlmIChzICYgRU5CVVNGUkVFKQorCQlTUFJJTlRGKCJFTkJVU0ZSRUUgIik7CisJaWYgKHMgJiBFTlNDU0lQRVJSKQorCQlTUFJJTlRGKCJFTlNDU0lQRVJSICIpOworCWlmIChzICYgRU5QSEFTRUNIRykKKwkJU1BSSU5URigiRU5QSEFTRUNIRyAiKTsKKwlpZiAocyAmIEVOUkVRSU5JVCkKKwkJU1BSSU5URigiRU5SRVFJTklUICIpOworCVNQUklOVEYoIilcbiIpOworCisJcmV0dXJuIChwb3MgLSBzdGFydCk7Cit9CisKK3N0YXRpYyBpbnQgYWhhMTUyeF9zZXRfaW5mbyhjaGFyICpidWZmZXIsIGludCBsZW5ndGgsIHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCWlmKCFzaHBudCB8fCAhYnVmZmVyIHx8IGxlbmd0aDw4IHx8IHN0cm5jbXAoImFoYTE1MnggIiwgYnVmZmVyLCA4KSE9MCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJaWYobGVuZ3RoPjE0ICYmIHN0cm5jbXAoImRlYnVnICIsIGJ1ZmZlcis4LCA2KT09MCkgeworCQlpbnQgZGVidWcgPSBIT1NUREFUQShzaHBudCktPmRlYnVnOworCisJCUhPU1REQVRBKHNocG50KS0+ZGVidWcgPSBzaW1wbGVfc3RydG91bChidWZmZXIrMTQsIE5VTEwsIDApOworCisJCXByaW50ayhLRVJOX0lORk8gImFoYTE1MnglZDogZGVidWdnaW5nIG9wdGlvbnMgc2V0IHRvIDB4JTA0eCAod2VyZSAweCUwNHgpXG4iLCBIT1NUTk8sIEhPU1REQVRBKHNocG50KS0+ZGVidWcsIGRlYnVnKTsKKwl9IGVsc2UKKyNlbmRpZgorI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQorCWlmKGxlbmd0aD4xMyAmJiBzdHJuY21wKCJyZXNldCIsIGJ1ZmZlcis4LCA1KT09MCkgeworCQlpbnQgaTsKKworCQlIT1NUREFUQShzaHBudCktPnRvdGFsX2NvbW1hbmRzPTA7CisJCUhPU1REQVRBKHNocG50KS0+ZGlzY29ubmVjdGlvbnM9MDsKKwkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhvdXRfYW55X2FjdGlvbj0wOworCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9vbGRfY29tbWFuZD0wOworCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9uZXdfY29tbWFuZD0wOworCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9kb25lX2NvbW1hbmQ9MDsKKwkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhfY2hlY2tfY29uZGl0aW9uPTA7CisJCWZvciAoaSA9IGlkbGU7IGk8bWF4c3RhdGU7IGkrKykgeworCQkJSE9TVERBVEEoc2hwbnQpLT5jb3VudFtpXT0wOworCQkJSE9TVERBVEEoc2hwbnQpLT5jb3VudF90cmFuc1tpXT0wOworCQkJSE9TVERBVEEoc2hwbnQpLT50aW1lW2ldPTA7CisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPICJhaGExNTJ4JWQ6IHN0YXRzIHJlc2V0ZWQuXG4iLCBIT1NUTk8pOworCisJfSBlbHNlCisjZW5kaWYKKwl7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCisJcmV0dXJuIGxlbmd0aDsKK30KKworI3VuZGVmIFNQUklOVEYKKyNkZWZpbmUgU1BSSU5URihhcmdzLi4uKSBcCisJZG8geyBpZihwb3MgPCBidWZmZXIgKyBsZW5ndGgpIHBvcyArPSBzcHJpbnRmKHBvcywgIyMgYXJncyk7IH0gd2hpbGUoMCkKKworc3RhdGljIGludCBhaGExNTJ4X3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsCisJCSAgICAgIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworCWludCBpOworCWNoYXIgKnBvcyA9IGJ1ZmZlcjsKKwlTY3NpX0NtbmQgKnB0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0aGlzbGVuZ3RoOworCisJRFBSSU5USyhkZWJ1Z19wcm9jaW5mbywgCisJICAgICAgIEtFUk5fREVCVUcgImFoYTE1MnhfcHJvY19pbmZvOiBidWZmZXI9JXAgb2Zmc2V0PSVsZCBsZW5ndGg9JWQgaG9zdG5vPSVkIGlub3V0PSVkXG4iLAorCSAgICAgICBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBzaHBudC0+aG9zdF9ubywgaW5vdXQpOworCisKKwlpZiAoaW5vdXQpCisJCXJldHVybiBhaGExNTJ4X3NldF9pbmZvKGJ1ZmZlciwgbGVuZ3RoLCBzaHBudCk7CisKKwlTUFJJTlRGKEFIQTE1MlhfUkVWSUQgIlxuIik7CisKKwlTUFJJTlRGKCJpb3BvcnRzIDB4JTA0bHggdG8gMHglMDRseFxuIiwKKwkJc2hwbnQtPmlvX3BvcnQsIHNocG50LT5pb19wb3J0ICsgc2hwbnQtPm5faW9fcG9ydCAtIDEpOworCVNQUklOVEYoImludGVycnVwdCAweCUwMnhcbiIsIHNocG50LT5pcnEpOworCVNQUklOVEYoImRpc2Nvbm5lY3Rpb24vcmVjb25uZWN0aW9uICVzXG4iLAorCQlSRUNPTk5FQ1QgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwlTUFJJTlRGKCJwYXJpdHkgY2hlY2tpbmcgJXNcbiIsCisJCVBBUklUWSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCVNQUklOVEYoInN5bmNocm9ub3VzIHRyYW5zZmVycyAlc1xuIiwKKwkJU1lOQ0hST05PVVMgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwlTUFJJTlRGKCIlZCBjb21tYW5kcyBjdXJyZW50bHkgcXVldWVkXG4iLCBIT1NUREFUQShzaHBudCktPmNvbW1hbmRzKTsKKworCWlmKFNZTkNIUk9OT1VTKSB7CisJCVNQUklOVEYoInN5bmNocm9ub3VzbHkgb3BlcmF0aW5nIHRhcmdldHMgKHRpY2s9NTAgbnMpOlxuIik7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQlpZiAoSE9TVERBVEEoc2hwbnQpLT5zeW5jcmF0ZVtpXSAmIDB4N2YpCisJCQkJU1BSSU5URigidGFyZ2V0ICVkOiBwZXJpb2QgJWRULyVkbnM7IHJlcS9hY2sgb2Zmc2V0ICVkXG4iLAorCQkJCQlpLAorCQkJCQkoKChIT1NUREFUQShzaHBudCktPnN5bmNyYXRlW2ldICYgMHg3MCkgPj4gNCkgKyAyKSwKKwkJCQkJKCgoSE9TVERBVEEoc2hwbnQpLT5zeW5jcmF0ZVtpXSAmIDB4NzApID4+IDQpICsgMikgKiA1MCwKKwkJCQkgICAgSE9TVERBVEEoc2hwbnQpLT5zeW5jcmF0ZVtpXSAmIDB4MGYpOworCX0KKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisjZGVmaW5lIFBERUJVRyhmbGFncyx0eHQpIFwKKwlpZihIT1NUREFUQShzaHBudCktPmRlYnVnICYgZmxhZ3MpIFNQUklOVEYoIiglcykgIiwgdHh0KTsKKworCVNQUklOVEYoImVuYWJsZWQgZGVidWdnaW5nIG9wdGlvbnM6ICIpOworCisJUERFQlVHKGRlYnVnX3Byb2NpbmZvLCAicHJvY2luZm8iKTsKKwlQREVCVUcoZGVidWdfcXVldWUsICJxdWV1ZSIpOworCVBERUJVRyhkZWJ1Z19pbnRyLCAiaW50ZXJydXB0Iik7CisJUERFQlVHKGRlYnVnX3NlbGVjdGlvbiwgInNlbGVjdGlvbiIpOworCVBERUJVRyhkZWJ1Z19tc2dvLCAibWVzc2FnZSBvdXQiKTsKKwlQREVCVUcoZGVidWdfbXNnaSwgIm1lc3NhZ2UgaW4iKTsKKwlQREVCVUcoZGVidWdfc3RhdHVzLCAic3RhdHVzIik7CisJUERFQlVHKGRlYnVnX2NtZCwgImNvbW1hbmQiKTsKKwlQREVCVUcoZGVidWdfZGF0YWksICJkYXRhIGluIik7CisJUERFQlVHKGRlYnVnX2RhdGFvLCAiZGF0YSBvdXQiKTsKKwlQREVCVUcoZGVidWdfZWgsICJlaCIpOworCVBERUJVRyhkZWJ1Z19sb2NrcywgImxvY2tzIik7CisJUERFQlVHKGRlYnVnX3BoYXNlcywgInBoYXNlcyIpOworCisJU1BSSU5URigiXG4iKTsKKyNlbmRpZgorCisJU1BSSU5URigiXG5xdWV1ZSBzdGF0dXM6XG4iKTsKKwlET19MT0NLKGZsYWdzKTsKKwlpZiAoSVNTVUVfU0MpIHsKKwkJU1BSSU5URigibm90IHlldCBpc3N1ZWQgY29tbWFuZHM6XG4iKTsKKwkJZm9yIChwdHIgPSBJU1NVRV9TQzsgcHRyOyBwdHIgPSBTQ05FWFQocHRyKSkKKwkJCXBvcyArPSBnZXRfY29tbWFuZChwb3MsIHB0cik7CisJfSBlbHNlCisJCVNQUklOVEYoIm5vIG5vdCB5ZXQgaXNzdWVkIGNvbW1hbmRzXG4iKTsKKwlET19VTkxPQ0soZmxhZ3MpOworCisJaWYgKENVUlJFTlRfU0MpIHsKKwkJU1BSSU5URigiY3VycmVudCBjb21tYW5kOlxuIik7CisJCXBvcyArPSBnZXRfY29tbWFuZChwb3MsIENVUlJFTlRfU0MpOworCX0gZWxzZQorCQlTUFJJTlRGKCJubyBjdXJyZW50IGNvbW1hbmRcbiIpOworCisJaWYgKERJU0NPTk5FQ1RFRF9TQykgeworCQlTUFJJTlRGKCJkaXNjb25uZWN0ZWQgY29tbWFuZHM6XG4iKTsKKwkJZm9yIChwdHIgPSBESVNDT05ORUNURURfU0M7IHB0cjsgcHRyID0gU0NORVhUKHB0cikpCisJCQlwb3MgKz0gZ2V0X2NvbW1hbmQocG9zLCBwdHIpOworCX0gZWxzZQorCQlTUFJJTlRGKCJubyBkaXNjb25uZWN0ZWQgY29tbWFuZHNcbiIpOworCisJcG9zICs9IGdldF9wb3J0cyhzaHBudCwgcG9zKTsKKworI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQorCVNQUklOVEYoInN0YXRpc3RpY3M6XG4iCisJICAgICAgICAidG90YWwgY29tbWFuZHM6ICAgICAgICAgICAgICAgJWRcbiIKKwkgICAgICAgICJkaXNjb25uZWN0aW9uczogICAgICAgICAgICAgICAlZFxuIgorCQkiYnVzZnJlZSB3aXRoIGNoZWNrIGNvbmRpdGlvbjogJWRcbiIKKwkJImJ1c2ZyZWUgd2l0aG91dCBvbGQgY29tbWFuZDogICVkXG4iCisJCSJidXNmcmVlIHdpdGhvdXQgbmV3IGNvbW1hbmQ6ICAlZFxuIgorCQkiYnVzZnJlZSB3aXRob3V0IGRvbmUgY29tbWFuZDogJWRcbiIKKwkJImJ1c2ZyZWUgd2l0aG91dCBhbnkgYWN0aW9uOiAgICVkXG4iCisJCSJzdGF0ZSAgICAgICIKKwkJInRyYW5zaXRpb25zICAiCisJCSJjb3VudCAgICAgICAgIgorCQkidGltZVxuIiwKKwkJSE9TVERBVEEoc2hwbnQpLT50b3RhbF9jb21tYW5kcywKKwkJSE9TVERBVEEoc2hwbnQpLT5kaXNjb25uZWN0aW9ucywKKwkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhfY2hlY2tfY29uZGl0aW9uLAorCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9vbGRfY29tbWFuZCwKKwkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhvdXRfbmV3X2NvbW1hbmQsCisJCUhPU1REQVRBKHNocG50KS0+YnVzZnJlZV93aXRob3V0X2RvbmVfY29tbWFuZCwKKwkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhvdXRfYW55X2FjdGlvbik7CisJZm9yKGk9MDsgaTxtYXhzdGF0ZTsgaSsrKSB7CisJCVNQUklOVEYoIiUtMTBzICUtMTJkICUtMTJkICUtMTJsZFxuIiwKKwkJICAgICAgICBzdGF0ZXNbaV0ubmFtZSwKKwkJCUhPU1REQVRBKHNocG50KS0+Y291bnRfdHJhbnNbaV0sCisJCQlIT1NUREFUQShzaHBudCktPmNvdW50W2ldLAorCQkJSE9TVERBVEEoc2hwbnQpLT50aW1lW2ldKTsKKwl9CisjZW5kaWYKKworCURQUklOVEsoZGVidWdfcHJvY2luZm8sIEtFUk5fREVCVUcgImFoYTE1MnhfcHJvY19pbmZvOiBwb3M9JXBcbiIsIHBvcyk7CisKKwl0aGlzbGVuZ3RoID0gcG9zIC0gKGJ1ZmZlciArIG9mZnNldCk7CisJRFBSSU5USyhkZWJ1Z19wcm9jaW5mbywgS0VSTl9ERUJVRyAiYWhhMTUyeF9wcm9jX2luZm86IGxlbmd0aD0lZCB0aGlzbGVuZ3RoPSVkXG4iLCBsZW5ndGgsIHRoaXNsZW5ndGgpOworCisJaWYodGhpc2xlbmd0aDwwKSB7CisJCURQUklOVEsoZGVidWdfcHJvY2luZm8sIEtFUk5fREVCVUcgImFoYTE1MnhfcHJvY19pbmZvOiBvdXRwdXQgdG9vIHNob3J0XG4iKTsKKwkJKnN0YXJ0ID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJdGhpc2xlbmd0aCA9IHRoaXNsZW5ndGg8bGVuZ3RoID8gdGhpc2xlbmd0aCA6IGxlbmd0aDsKKworCURQUklOVEsoZGVidWdfcHJvY2luZm8sIEtFUk5fREVCVUcgImFoYTE1MnhfcHJvY19pbmZvOiByZXR1cm4gJWRcbiIsIHRoaXNsZW5ndGgpOworCisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCXJldHVybiB0aGlzbGVuZ3RoIDwgbGVuZ3RoID8gdGhpc2xlbmd0aCA6IGxlbmd0aDsKK30KKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBhaGExNTJ4X2RyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQkJPSBBSEExNTJYX1JFVklELAorCS5wcm9jX25hbWUJCQk9ICJhaGExNTJ4IiwKKwkucHJvY19pbmZvCQkJPSBhaGExNTJ4X3Byb2NfaW5mbywKKwkucXVldWVjb21tYW5kCQkJPSBhaGExNTJ4X3F1ZXVlLAorCS5laF9hYm9ydF9oYW5kbGVyCQk9IGFoYTE1MnhfYWJvcnQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyCT0gYWhhMTUyeF9kZXZpY2VfcmVzZXQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCQk9IGFoYTE1MnhfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJCT0gYWhhMTUyeF9ob3N0X3Jlc2V0LAorCS5iaW9zX3BhcmFtCQkJPSBhaGExNTJ4X2Jpb3NwYXJhbSwKKwkuY2FuX3F1ZXVlCQkJPSAxLAorCS50aGlzX2lkCQkJPSA3LAorCS5zZ190YWJsZXNpemUJCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQkJPSBESVNBQkxFX0NMVVNURVJJTkcsCit9OworCisjaWYgIWRlZmluZWQoUENNQ0lBKQorc3RhdGljIGludCBzZXR1cF9jb3VudDsKK3N0YXRpYyBzdHJ1Y3QgYWhhMTUyeF9zZXR1cCBzZXR1cFsyXTsKKworLyogcG9zc2libGUgaS9vIGFkZHJlc3NlcyBmb3IgdGhlIEFJQy02MjYwOyBkZWZhdWx0IGZpcnN0ICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcG9ydHNbXSA9IHsgMHgzNDAsIDB4MTQwIH07CisKKyNpZiAhZGVmaW5lZChTS0lQX0JJT1NURVNUKQorLyogcG9zc2libGUgbG9jYXRpb25zIGZvciB0aGUgQWRhcHRlYyBCSU9TOyBkZWZhdWx0cyBmaXJzdCAqLworc3RhdGljIHVuc2lnbmVkIGludCBhZGRyZXNzZXNbXSA9Cit7CisJMHhkYzAwMCwJCS8qIGRlZmF1bHQgZmlyc3QgKi8KKwkweGM4MDAwLAorCTB4Y2MwMDAsCisJMHhkMDAwMCwKKwkweGQ0MDAwLAorCTB4ZDgwMDAsCisJMHhlMDAwMCwKKwkweGViODAwLAkJLyogVlRlY2ggUGxhdGludW0gU01QICovCisJMHhmMDAwMCwKK307CisKKy8qIHNpZ25hdHVyZXMgZm9yIHZhcmlvdXMgQUlDLTZbMjNdNjAgYmFzZWQgY29udHJvbGxlcnMuCisgICBUaGUgcG9pbnQgaW4gZGV0ZWN0aW5nIHNpZ25hdHVyZXMgaXMgdG8gYXZvaWQgdXNlbGVzcyBhbmQgbWF5YmUKKyAgIGhhcm1mdWwgcHJvYmVzIG9uIHBvcnRzLiBJJ20gbm90IHN1cmUgdGhhdCBhbGwgbGlzdGVkIGJvYXJkcyBwYXNzCisgICBhdXRvLWNvbmZpZ3VyYXRpb24uIEZvciB0aG9zZSB3aGljaCBmYWlsIHRoZSBCSU9TIHNpZ25hdHVyZSBpcworICAgb2Jzb2xldGUsIGJlY2F1c2UgdXNlciBpbnRlcnZlbnRpb24gdG8gc3VwcGx5IHRoZSBjb25maWd1cmF0aW9uIGlzCisgICBuZWVkZWQgYW55d2F5LiAgTWF5IGJlIGFuIGluZm9ybWF0aW9uIHdoZXRoZXIgb3Igbm90IHRoZSBCSU9TIHN1cHBvcnRzCisgICBleHRlbmRlZCB0cmFuc2xhdGlvbiBjb3VsZCBiZSBhbHNvIHVzZWZ1bCBoZXJlLiAqLworc3RhdGljIHN0cnVjdCBzaWduYXR1cmUgeworCXVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZTsKKwlpbnQgc2lnX29mZnNldDsKKwlpbnQgc2lnX2xlbmd0aDsKK30gc2lnbmF0dXJlc1tdID0KK3sKKwl7ICJBZGFwdGVjIEFIQS0xNTIwIEJJT1MiLAkweDEwMmUsIDIxIH0sCisJCS8qIEFkYXB0ZWMgMTUyeCAqLworCXsgIkFkYXB0ZWMgQUhBLTE1MjBCIiwJCTB4MDAwYiwgMTcgfSwKKwkJLyogQWRhcHRlYyAxNTJ4IHJldiBCICovCisJeyAiQWRhcHRlYyBBSEEtMTUyMEIiLAkJMHgwMDI2LCAxNyB9LAorCQkvKiBJb21lZ2EgSmF6IEpldCBJU0EgKEFJQzYzNzBRKSAqLworCXsgIkFkYXB0ZWMgQVNXLUI2MjYgQklPUyIsCTB4MTAyOSwgMjEgfSwKKwkJLyogb24tYm9hcmQgY29udHJvbGxlciAqLworCXsgIkFkYXB0ZWMgQklPUzogQVNXLUI2MjYiLAkweDAwMGYsIDIyIH0sCisJCS8qIG9uLWJvYXJkIGNvbnRyb2xsZXIgKi8KKwl7ICJBZGFwdGVjIEFTVy1CNjI2IFMyIiwJMHgyZTZjLCAxOSB9LAorCQkvKiBvbi1ib2FyZCBjb250cm9sbGVyICovCisJeyAiQWRhcHRlYyBCSU9TOkFJQy02MzYwIiwJMHgwMDBjLCAyMSB9LAorCQkvKiBvbi1ib2FyZCBjb250cm9sbGVyICovCisJeyAiU2NzaVBybyBTUC0zNjAgQklPUyIsCTB4Mjg3MywgMTkgfSwKKwkJLyogU2NzaVByby1Db250cm9sbGVyICAqLworCXsgIkdBLTQwMCBMT0NBTCBCVVMgU0NTSSBCSU9TIiwgMHgxMDJlLCAyNiB9LAorCQkvKiBHaWdhYnl0ZSBMb2NhbC1CdXMtU0NTSSAqLworCXsgIkFkYXB0ZWMgQklPUzpBVkEtMjgyWCIsCTB4MDAwYywgMjEgfSwKKwkJLyogQWRhcHRlYyAyODJ4ICovCisJeyAiQWRhcHRlYyBJQk0gRG9jayBJSSBTQ1NJIiwgICAweDJlZGQsIDI0IH0sCisJCS8qIElCTSBUaGlua3BhZCBEb2NrIElJICovCisJeyAiQWRhcHRlYyBCSU9TOkFIQS0xNTMyUCIsICAgICAweDAwMWMsIDIyIH0sCisJCS8qIElCTSBUaGlua3BhZCBEb2NrIElJIFNDU0kgKi8KKwl7ICJEVEMzNTIwQSBIb3N0IEFkYXB0ZXIgQklPUyIsIDB4MzE4YSwgMjYgfSwKKwkJLyogRFRDIDM1MjBBIElTQSBTQ1NJICovCit9OworI2VuZGlmIC8qICFTS0lQX0JJT1NURVNUICovCisKKy8qCisgKiBUZXN0LCBpZiBwb3J0X2Jhc2UgaXMgdmFsaWQuCisgKgorICovCitzdGF0aWMgaW50IGFoYTE1MnhfcG9ydHRlc3QoaW50IGlvX3BvcnQpCit7CisJaW50IGk7CisKKwlTRVRQT1JUKGlvX3BvcnQgKyBPX0RNQUNOVFJMMSwgMCk7CS8qIHJlc2V0IHN0YWNrIHBvaW50ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJU0VUUE9SVChpb19wb3J0ICsgT19TVEFDSywgaSk7CisKKwlTRVRQT1JUKGlvX3BvcnQgKyBPX0RNQUNOVFJMMSwgMCk7CS8qIHJlc2V0IHN0YWNrIHBvaW50ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTYgJiYgR0VUUE9SVChpb19wb3J0ICsgT19TVEFDSykgPT0gaTsgaSsrKQorCQk7CisKKwlyZXR1cm4gKGkgPT0gMTYpOworfQorCitzdGF0aWMgaW50IHRjMTU1MF9wb3J0dGVzdChpbnQgaW9fcG9ydCkKK3sKKwlpbnQgaTsKKworCVNFVFBPUlQoaW9fcG9ydCArIE9fVENfRE1BQ05UUkwxLCAwKTsJLyogcmVzZXQgc3RhY2sgcG9pbnRlciAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlTRVRQT1JUKGlvX3BvcnQgKyBPX1NUQUNLLCBpKTsKKworCVNFVFBPUlQoaW9fcG9ydCArIE9fVENfRE1BQ05UUkwxLCAwKTsJLyogcmVzZXQgc3RhY2sgcG9pbnRlciAqLworCWZvciAoaSA9IDA7IGkgPCAxNiAmJiBHRVRQT1JUKGlvX3BvcnQgKyBPX1RDX1NUQUNLKSA9PSBpOyBpKyspCisJCTsKKworCXJldHVybiAoaSA9PSAxNik7Cit9CisKKworc3RhdGljIGludCBjaGVja3NldHVwKHN0cnVjdCBhaGExNTJ4X3NldHVwICpzZXR1cCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwb3J0cykgJiYgKHNldHVwLT5pb19wb3J0ICE9IHBvcnRzW2ldKTsgaSsrKQorCQk7CisKKwlpZiAoaSA9PSBBUlJBWV9TSVpFKHBvcnRzKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIHJlcXVlc3RfcmVnaW9uKHNldHVwLT5pb19wb3J0LCBJT19SQU5HRSwgImFoYTE1MngiKT09MCApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4OiBpbyBwb3J0IDB4JXggYnVzeS5cbiIsIHNldHVwLT5pb19wb3J0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYoIGFoYTE1MnhfcG9ydHRlc3Qoc2V0dXAtPmlvX3BvcnQpICkgeworCQlzZXR1cC0+dGMxNTUwPTA7CisJfSBlbHNlIGlmKCB0YzE1NTBfcG9ydHRlc3Qoc2V0dXAtPmlvX3BvcnQpICkgeworCQlzZXR1cC0+dGMxNTUwPTE7CisJfSBlbHNlIHsKKwkJcmVsZWFzZV9yZWdpb24oc2V0dXAtPmlvX3BvcnQsIElPX1JBTkdFKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVsZWFzZV9yZWdpb24oc2V0dXAtPmlvX3BvcnQsIElPX1JBTkdFKTsKKworCWlmICgoc2V0dXAtPmlycSA8IElSUV9NSU4pIHx8IChzZXR1cC0+aXJxID4gSVJRX01BWCkpCisJCXJldHVybiAwOworCisJaWYgKChzZXR1cC0+c2NzaWlkIDwgMCkgfHwgKHNldHVwLT5zY3NpaWQgPiA3KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKHNldHVwLT5yZWNvbm5lY3QgPCAwKSB8fCAoc2V0dXAtPnJlY29ubmVjdCA+IDEpKQorCQlyZXR1cm4gMDsKKworCWlmICgoc2V0dXAtPnBhcml0eSA8IDApIHx8IChzZXR1cC0+cGFyaXR5ID4gMSkpCisJCXJldHVybiAwOworCisJaWYgKChzZXR1cC0+c3luY2hyb25vdXMgPCAwKSB8fCAoc2V0dXAtPnN5bmNocm9ub3VzID4gMSkpCisJCXJldHVybiAwOworCisJaWYgKChzZXR1cC0+ZXh0X3RyYW5zIDwgMCkgfHwgKHNldHVwLT5leHRfdHJhbnMgPiAxKSkKKwkJcmV0dXJuIDA7CisKKworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IGFoYTE1MnhfaW5pdCh2b2lkKQoreworCWludCBpLCBqLCBvazsKKyNpZiBkZWZpbmVkKEFVVE9DT05GKQorCWFoYTE1MnhfY29uZmlnIGNvbmY7CisjZW5kaWYKKyNpZmRlZiBfX0lTQVBOUF9fCisJc3RydWN0IHBucF9kZXYgKmRldj1OVUxMLCAqcG5wZGV2WzJdID0ge05VTEwsIE5VTEx9OworI2VuZGlmCisKKwlpZiAoIHNldHVwX2NvdW50ICkgeworCQlwcmludGsoS0VSTl9JTkZPICJhaGExNTJ4OiBwcm9jZXNzaW5nIGNvbW1hbmRsaW5lOiAiKTsKKworCQlmb3IgKGkgPSAwOyBpPHNldHVwX2NvdW50OyBpKyspIHsKKwkJCWlmICghY2hlY2tzZXR1cCgmc2V0dXBbaV0pKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJcbmFoYTE1Mng6ICVzXG4iLCBzZXR1cFtpXS5jb25mKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgImFoYTE1Mng6IGludmFsaWQgbGluZVxuIik7CisJCQl9CisJCX0KKwkJcHJpbnRrKCJva1xuIik7CisJfQorCisjaWYgZGVmaW5lZChTRVRVUDApCisJaWYgKHNldHVwX2NvdW50IDwgQVJSQVlfU0laRShzZXR1cCkpIHsKKwkJc3RydWN0IGFoYTE1Mnhfc2V0dXAgb3ZlcnJpZGUgPSBTRVRVUDA7CisKKwkJaWYgKHNldHVwX2NvdW50ID09IDAgfHwgKG92ZXJyaWRlLmlvX3BvcnQgIT0gc2V0dXBbMF0uaW9fcG9ydCkpIHsKKwkJCWlmICghY2hlY2tzZXR1cCgmb3ZlcnJpZGUpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJcbmFoYTE1Mng6IGludmFsaWQgb3ZlcnJpZGUgU0VUVVAwPXsweCV4LCVkLCVkLCVkLCVkLCVkLCVkLCVkfVxuIiwKKwkJCQkgICAgICAgb3ZlcnJpZGUuaW9fcG9ydCwKKwkJCQkgICAgICAgb3ZlcnJpZGUuaXJxLAorCQkJCSAgICAgICBvdmVycmlkZS5zY3NpaWQsCisJCQkJICAgICAgIG92ZXJyaWRlLnJlY29ubmVjdCwKKwkJCQkgICAgICAgb3ZlcnJpZGUucGFyaXR5LAorCQkJCSAgICAgICBvdmVycmlkZS5zeW5jaHJvbm91cywKKwkJCQkgICAgICAgb3ZlcnJpZGUuZGVsYXksCisJCQkJICAgICAgIG92ZXJyaWRlLmV4dF90cmFucyk7CisJCQl9IGVsc2UKKwkJCQlzZXR1cFtzZXR1cF9jb3VudCsrXSA9IG92ZXJyaWRlOworCQl9CisJfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNFVFVQMSkKKwlpZiAoc2V0dXBfY291bnQgPCBBUlJBWV9TSVpFKHNldHVwKSkgeworCQlzdHJ1Y3QgYWhhMTUyeF9zZXR1cCBvdmVycmlkZSA9IFNFVFVQMTsKKworCQlpZiAoc2V0dXBfY291bnQgPT0gMCB8fCAob3ZlcnJpZGUuaW9fcG9ydCAhPSBzZXR1cFswXS5pb19wb3J0KSkgeworCQkJaWYgKCFjaGVja3NldHVwKCZvdmVycmlkZSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlxuYWhhMTUyeDogaW52YWxpZCBvdmVycmlkZSBTRVRVUDE9ezB4JXgsJWQsJWQsJWQsJWQsJWQsJWQsJWR9XG4iLAorCQkJCSAgICAgICBvdmVycmlkZS5pb19wb3J0LAorCQkJCSAgICAgICBvdmVycmlkZS5pcnEsCisJCQkJICAgICAgIG92ZXJyaWRlLnNjc2lpZCwKKwkJCQkgICAgICAgb3ZlcnJpZGUucmVjb25uZWN0LAorCQkJCSAgICAgICBvdmVycmlkZS5wYXJpdHksCisJCQkJICAgICAgIG92ZXJyaWRlLnN5bmNocm9ub3VzLAorCQkJCSAgICAgICBvdmVycmlkZS5kZWxheSwKKwkJCQkgICAgICAgb3ZlcnJpZGUuZXh0X3RyYW5zKTsKKwkJCX0gZWxzZQorCQkJCXNldHVwW3NldHVwX2NvdW50KytdID0gb3ZlcnJpZGU7CisJCX0KKwl9CisjZW5kaWYKKworI2lmIGRlZmluZWQoTU9EVUxFKQorCWlmIChzZXR1cF9jb3VudDxBUlJBWV9TSVpFKHNldHVwKSAmJiAoYWhhMTUyeFswXSE9MCB8fCBpb1swXSE9MCB8fCBpcnFbMF0hPTApKSB7CisJCWlmKGFoYTE1MnhbMF0hPTApIHsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5jb25mICAgICAgICA9ICIiOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmlvX3BvcnQgICAgID0gYWhhMTUyeFswXTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5pcnEgICAgICAgICA9IGFoYTE1MnhbMV07CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uc2NzaWlkICAgICAgPSBhaGExNTJ4WzJdOworCQkJc2V0dXBbc2V0dXBfY291bnRdLnJlY29ubmVjdCAgID0gYWhhMTUyeFszXTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5wYXJpdHkgICAgICA9IGFoYTE1MnhbNF07CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uc3luY2hyb25vdXMgPSBhaGExNTJ4WzVdOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmRlbGF5ICAgICAgID0gYWhhMTUyeFs2XTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5leHRfdHJhbnMgICA9IGFoYTE1MnhbN107CisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCQkJc2V0dXBbc2V0dXBfY291bnRdLmRlYnVnICAgICAgID0gYWhhMTUyeFs4XTsKKyNlbmRpZgorCSAgCX0gZWxzZSBpZihpb1swXSE9MCB8fCBpcnFbMF0hPTApIHsKKwkJCWlmKGlvWzBdIT0wKSAgc2V0dXBbc2V0dXBfY291bnRdLmlvX3BvcnQgPSBpb1swXTsKKwkJCWlmKGlycVswXSE9MCkgc2V0dXBbc2V0dXBfY291bnRdLmlycSAgICAgPSBpcnFbMF07CisKKwkgICAgCQlzZXR1cFtzZXR1cF9jb3VudF0uc2NzaWlkICAgICAgPSBzY3NpaWRbMF07CisJICAgIAkJc2V0dXBbc2V0dXBfY291bnRdLnJlY29ubmVjdCAgID0gcmVjb25uZWN0WzBdOworCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5wYXJpdHkgICAgICA9IHBhcml0eVswXTsKKwkgICAgCQlzZXR1cFtzZXR1cF9jb3VudF0uc3luY2hyb25vdXMgPSBzeW5jWzBdOworCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5kZWxheSAgICAgICA9IGRlbGF5WzBdOworCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5leHRfdHJhbnMgICA9IGV4dHRyYW5zWzBdOworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwkJCXNldHVwW3NldHVwX2NvdW50XS5kZWJ1ZyAgICAgICA9IGRlYnVnWzBdOworI2VuZGlmCisJCX0KKworICAgICAgICAgIAlpZiAoY2hlY2tzZXR1cCgmc2V0dXBbc2V0dXBfY291bnRdKSkKKwkJCXNldHVwX2NvdW50Kys7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeDogaW52YWxpZCBtb2R1bGUgcGFyYW1zIGlvPTB4JXgsIGlycT0lZCxzY3NpaWQ9JWQscmVjb25uZWN0PSVkLHBhcml0eT0lZCxzeW5jPSVkLGRlbGF5PSVkLGV4dHRyYW5zPSVkXG4iLAorCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5pb19wb3J0LAorCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5pcnEsCisJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLnNjc2lpZCwKKwkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0ucmVjb25uZWN0LAorCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5wYXJpdHksCisJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLnN5bmNocm9ub3VzLAorCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5kZWxheSwKKwkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0uZXh0X3RyYW5zKTsKKwl9CisKKwlpZiAoc2V0dXBfY291bnQ8QVJSQVlfU0laRShzZXR1cCkgJiYgKGFoYTE1MngxWzBdIT0wIHx8IGlvWzFdIT0wIHx8IGlycVsxXSE9MCkpIHsKKwkJaWYoYWhhMTUyeDFbMF0hPTApIHsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5jb25mICAgICAgICA9ICIiOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmlvX3BvcnQgICAgID0gYWhhMTUyeDFbMF07CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uaXJxICAgICAgICAgPSBhaGExNTJ4MVsxXTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5zY3NpaWQgICAgICA9IGFoYTE1MngxWzJdOworCQkJc2V0dXBbc2V0dXBfY291bnRdLnJlY29ubmVjdCAgID0gYWhhMTUyeDFbM107CisJCQlzZXR1cFtzZXR1cF9jb3VudF0ucGFyaXR5ICAgICAgPSBhaGExNTJ4MVs0XTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5zeW5jaHJvbm91cyA9IGFoYTE1MngxWzVdOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmRlbGF5ICAgICAgID0gYWhhMTUyeDFbNl07CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uZXh0X3RyYW5zICAgPSBhaGExNTJ4MVs3XTsKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJCQlzZXR1cFtzZXR1cF9jb3VudF0uZGVidWcgICAgICAgPSBhaGExNTJ4MVs4XTsKKyNlbmRpZgorCSAgCX0gZWxzZSBpZihpb1sxXSE9MCB8fCBpcnFbMV0hPTApIHsKKwkJCWlmKGlvWzFdIT0wKSAgc2V0dXBbc2V0dXBfY291bnRdLmlvX3BvcnQgPSBpb1sxXTsKKwkJCWlmKGlycVsxXSE9MCkgc2V0dXBbc2V0dXBfY291bnRdLmlycSAgICAgPSBpcnFbMV07CisKKwkgICAgCQlzZXR1cFtzZXR1cF9jb3VudF0uc2NzaWlkICAgICAgPSBzY3NpaWRbMV07CisJICAgIAkJc2V0dXBbc2V0dXBfY291bnRdLnJlY29ubmVjdCAgID0gcmVjb25uZWN0WzFdOworCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5wYXJpdHkgICAgICA9IHBhcml0eVsxXTsKKwkgICAgCQlzZXR1cFtzZXR1cF9jb3VudF0uc3luY2hyb25vdXMgPSBzeW5jWzFdOworCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5kZWxheSAgICAgICA9IGRlbGF5WzFdOworCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5leHRfdHJhbnMgICA9IGV4dHRyYW5zWzFdOworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwkJCXNldHVwW3NldHVwX2NvdW50XS5kZWJ1ZyAgICAgICA9IGRlYnVnWzFdOworI2VuZGlmCisJCX0KKwkJaWYgKGNoZWNrc2V0dXAoJnNldHVwW3NldHVwX2NvdW50XSkpCisJCQlzZXR1cF9jb3VudCsrOworCQllbHNlCisJCQlwcmludGsoS0VSTl9FUlIgImFoYTE1Mng6IGludmFsaWQgbW9kdWxlIHBhcmFtcyBpbz0weCV4LCBpcnE9JWQsc2NzaWlkPSVkLHJlY29ubmVjdD0lZCxwYXJpdHk9JWQsc3luYz0lZCxkZWxheT0lZCxleHR0cmFucz0lZFxuIiwKKwkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0uaW9fcG9ydCwKKwkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0uaXJxLAorCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5zY3NpaWQsCisJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLnJlY29ubmVjdCwKKwkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0ucGFyaXR5LAorCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5zeW5jaHJvbm91cywKKwkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0uZGVsYXksCisJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLmV4dF90cmFucyk7CisJfQorI2VuZGlmCisKKyNpZmRlZiBfX0lTQVBOUF9fCisJZm9yKGk9MDsgc2V0dXBfY291bnQ8QVJSQVlfU0laRShzZXR1cCkgJiYgaWRfdGFibGVbaV0udmVuZG9yOyBpKyspIHsKKwkJd2hpbGUgKCBzZXR1cF9jb3VudDxBUlJBWV9TSVpFKHNldHVwKSAmJgorCQkJKGRldj1wbnBfZmluZF9kZXYoTlVMTCwgaWRfdGFibGVbaV0udmVuZG9yLCBpZF90YWJsZVtpXS5mdW5jdGlvbiwgZGV2KSkgKSB7CisJCQlpZiAocG5wX2RldmljZV9hdHRhY2goZGV2KSA8IDApCisJCQkJY29udGludWU7CisKKwkJCWlmIChwbnBfYWN0aXZhdGVfZGV2KGRldikgPCAwKSB7CisJCQkJcG5wX2RldmljZV9kZXRhY2goZGV2KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKCFwbnBfcG9ydF92YWxpZChkZXYsIDApKSB7CisJCQkJcG5wX2RldmljZV9kZXRhY2goZGV2KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHNldHVwX2NvdW50PT0xICYmIHBucF9wb3J0X3N0YXJ0KGRldiwgMCk9PXNldHVwWzBdLmlvX3BvcnQpIHsKKwkJCQlwbnBfZGV2aWNlX2RldGFjaChkZXYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlzZXR1cFtzZXR1cF9jb3VudF0uaW9fcG9ydCAgICAgPSBwbnBfcG9ydF9zdGFydChkZXYsIDApOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmlycSAgICAgICAgID0gcG5wX2lycShkZXYsIDApOworCQkJc2V0dXBbc2V0dXBfY291bnRdLnNjc2lpZCAgICAgID0gNzsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5yZWNvbm5lY3QgICA9IDE7CisJCQlzZXR1cFtzZXR1cF9jb3VudF0ucGFyaXR5ICAgICAgPSAxOworCQkJc2V0dXBbc2V0dXBfY291bnRdLnN5bmNocm9ub3VzID0gMTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5kZWxheSAgICAgICA9IERFTEFZX0RFRkFVTFQ7CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uZXh0X3RyYW5zICAgPSAwOworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwkJCXNldHVwW3NldHVwX2NvdW50XS5kZWJ1ZyAgICAgICA9IERFQlVHX0RFRkFVTFQ7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fSVNBUE5QX18pCisJCQlwbnBkZXZbc2V0dXBfY291bnRdICAgICAgICAgICAgPSBkZXY7CisjZW5kaWYKKwkJCXByaW50ayAoS0VSTl9JTkZPCisJCQkJImFoYTE1Mng6IGZvdW5kIElTQVBuUCBhZGFwdGVyIGF0IGlvPTB4JTAzeCwgaXJxPSVkXG4iLAorCQkJCXNldHVwW3NldHVwX2NvdW50XS5pb19wb3J0LCBzZXR1cFtzZXR1cF9jb3VudF0uaXJxKTsKKwkJCXNldHVwX2NvdW50Kys7CisJCX0KKwl9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQVVUT0NPTkYpCisJaWYgKHNldHVwX2NvdW50PEFSUkFZX1NJWkUoc2V0dXApKSB7CisjaWYgIWRlZmluZWQoU0tJUF9CSU9TVEVTVCkKKwkJb2sgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhZGRyZXNzZXMpICYmICFvazsgaSsrKSB7CisJCQl2b2lkIF9faW9tZW0gKnAgPSBpb3JlbWFwKGFkZHJlc3Nlc1tpXSwgMHg0MDAwKTsKKwkJCWlmICghcCkKKwkJCQljb250aW51ZTsKKwkJCWZvciAoaiA9IDA7IGo8QVJSQVlfU0laRShzaWduYXR1cmVzKSAmJiAhb2s7IGorKykKKwkJCQlvayA9IGNoZWNrX3NpZ25hdHVyZShwICsgc2lnbmF0dXJlc1tqXS5zaWdfb2Zmc2V0LAorCQkJCQkJCQlzaWduYXR1cmVzW2pdLnNpZ25hdHVyZSwgc2lnbmF0dXJlc1tqXS5zaWdfbGVuZ3RoKTsKKwkJCWlvdW5tYXAocCk7CisJCX0KKwkJaWYgKCFvayAmJiBzZXR1cF9jb3VudCA9PSAwKQorCQkJcmV0dXJuIDA7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYWhhMTUyeDogQklPUyB0ZXN0OiBwYXNzZWQsICIpOworI2Vsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYWhhMTUyeDogIik7CisjZW5kaWYJCQkJLyogIVNLSVBfQklPU1RFU1QgKi8KKworCQlvayA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvcnRzKSAmJiBzZXR1cF9jb3VudCA8IDI7IGkrKykgeworCQkJaWYgKChzZXR1cF9jb3VudCA9PSAxKSAmJiAoc2V0dXBbMF0uaW9fcG9ydCA9PSBwb3J0c1tpXSkpCisJCQkJY29udGludWU7CisKKwkJCWlmICggcmVxdWVzdF9yZWdpb24ocG9ydHNbaV0sIElPX1JBTkdFLCAiYWhhMTUyeCIpPT0wICkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeDogaW8gcG9ydCAweCV4IGJ1c3kuXG4iLCBwb3J0c1tpXSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChhaGExNTJ4X3BvcnR0ZXN0KHBvcnRzW2ldKSkgeworCQkJCXNldHVwW3NldHVwX2NvdW50XS50YzE1NTAgID0gMDsKKworCQkJCWNvbmYuY2ZfcG9ydCA9CisJCQkJICAgIChHRVRQT1JUKHBvcnRzW2ldICsgT19QT1JUQSkgPDwgOCkgKyBHRVRQT1JUKHBvcnRzW2ldICsgT19QT1JUQik7CisJCQl9IGVsc2UgaWYgKHRjMTU1MF9wb3J0dGVzdChwb3J0c1tpXSkpIHsKKwkJCQlzZXR1cFtzZXR1cF9jb3VudF0udGMxNTUwICA9IDE7CisKKwkJCQljb25mLmNmX3BvcnQgPQorCQkJCSAgICAoR0VUUE9SVChwb3J0c1tpXSArIE9fVENfUE9SVEEpIDw8IDgpICsgR0VUUE9SVChwb3J0c1tpXSArIE9fVENfUE9SVEIpOworCQkJfSBlbHNlIHsKKwkJCQlyZWxlYXNlX3JlZ2lvbihwb3J0c1tpXSwgSU9fUkFOR0UpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlyZWxlYXNlX3JlZ2lvbihwb3J0c1tpXSwgSU9fUkFOR0UpOworCisJCQlvaysrOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmlvX3BvcnQgPSBwb3J0c1tpXTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5pcnEgPSBJUlFfTUlOICsgY29uZi5jZl9pcnE7CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uc2NzaWlkID0gY29uZi5jZl9pZDsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5yZWNvbm5lY3QgPSBjb25mLmNmX3RhcmRpc2M7CisJCQlzZXR1cFtzZXR1cF9jb3VudF0ucGFyaXR5ID0gIWNvbmYuY2ZfcGFyaXR5OworCQkJc2V0dXBbc2V0dXBfY291bnRdLnN5bmNocm9ub3VzID0gY29uZi5jZl9zeW5jbmVnOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmRlbGF5ID0gREVMQVlfREVGQVVMVDsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5leHRfdHJhbnMgPSAwOworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwkJCXNldHVwW3NldHVwX2NvdW50XS5kZWJ1ZyA9IERFQlVHX0RFRkFVTFQ7CisjZW5kaWYKKwkJCXNldHVwX2NvdW50Kys7CisKKwkJfQorCisJCWlmIChvaykKKwkJCXByaW50aygiYXV0byBjb25maWd1cmF0aW9uOiBvaywgIik7CisJfQorI2VuZGlmCisKKwlwcmludGsoIiVkIGNvbnRyb2xsZXIocykgY29uZmlndXJlZFxuIiwgc2V0dXBfY291bnQpOworCisJZm9yIChpPTA7IGk8c2V0dXBfY291bnQ7IGkrKykgeworCQlpZiAoIHJlcXVlc3RfcmVnaW9uKHNldHVwW2ldLmlvX3BvcnQsIElPX1JBTkdFLCAiYWhhMTUyeCIpICkgeworCQkJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBhaGExNTJ4X3Byb2JlX29uZSgmc2V0dXBbaV0pOworCisJCQlpZiggIXNocG50ICkgeworCQkJCXJlbGVhc2VfcmVnaW9uKHNldHVwW2ldLmlvX3BvcnQsIElPX1JBTkdFKTsKKyNpZiBkZWZpbmVkKF9fSVNBUE5QX18pCisJCQl9IGVsc2UgaWYoIHBucGRldltpXSApIHsKKwkJCQlIT1NUREFUQShzaHBudCktPnBucGRldj1wbnBkZXZbaV07CisJCQkJcG5wZGV2W2ldPU5VTEw7CisjZW5kaWYKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeDogaW8gcG9ydCAweCV4IGJ1c3kuXG4iLCBzZXR1cFtpXS5pb19wb3J0KTsKKwkJfQorCisjaWYgZGVmaW5lZChfX0lTQVBOUF9fKQorCQlpZiggcG5wZGV2W2ldICkKKwkJCXBucF9kZXZpY2VfZGV0YWNoKHBucGRldltpXSk7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gcmVnaXN0ZXJlZF9jb3VudD4wOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWhhMTUyeF9leGl0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IoaT0wOyBpPEFSUkFZX1NJWkUoc2V0dXApOyBpKyspIHsKKwkJYWhhMTUyeF9yZWxlYXNlKGFoYTE1MnhfaG9zdFtpXSk7CisJCWFoYTE1MnhfaG9zdFtpXT1OVUxMOworCX0KK30KKworbW9kdWxlX2luaXQoYWhhMTUyeF9pbml0KTsKK21vZHVsZV9leGl0KGFoYTE1MnhfZXhpdCk7CisKKyNpZiAhZGVmaW5lZChNT0RVTEUpCitzdGF0aWMgaW50IF9faW5pdCBhaGExNTJ4X3NldHVwKGNoYXIgKnN0cikKK3sKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJaW50IGludHNbMTFdOworI2Vsc2UKKwlpbnQgaW50c1sxMF07CisjZW5kaWYKKwlnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCisJaWYoc2V0dXBfY291bnQ+PUFSUkFZX1NJWkUoc2V0dXApKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeDogeW91IGNhbiBvbmx5IGNvbmZpZ3VyZSB1cCB0byB0d28gY29udHJvbGxlcnNcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlzZXR1cFtzZXR1cF9jb3VudF0uY29uZiAgICAgICAgPSBzdHI7CisJc2V0dXBbc2V0dXBfY291bnRdLmlvX3BvcnQgICAgID0gaW50c1swXSA+PSAxID8gaW50c1sxXSA6IDB4MzQwOworCXNldHVwW3NldHVwX2NvdW50XS5pcnEgICAgICAgICA9IGludHNbMF0gPj0gMiA/IGludHNbMl0gOiAxMTsKKwlzZXR1cFtzZXR1cF9jb3VudF0uc2NzaWlkICAgICAgPSBpbnRzWzBdID49IDMgPyBpbnRzWzNdIDogNzsKKwlzZXR1cFtzZXR1cF9jb3VudF0ucmVjb25uZWN0ICAgPSBpbnRzWzBdID49IDQgPyBpbnRzWzRdIDogMTsKKwlzZXR1cFtzZXR1cF9jb3VudF0ucGFyaXR5ICAgICAgPSBpbnRzWzBdID49IDUgPyBpbnRzWzVdIDogMTsKKwlzZXR1cFtzZXR1cF9jb3VudF0uc3luY2hyb25vdXMgPSBpbnRzWzBdID49IDYgPyBpbnRzWzZdIDogMTsKKwlzZXR1cFtzZXR1cF9jb3VudF0uZGVsYXkgICAgICAgPSBpbnRzWzBdID49IDcgPyBpbnRzWzddIDogREVMQVlfREVGQVVMVDsKKwlzZXR1cFtzZXR1cF9jb3VudF0uZXh0X3RyYW5zICAgPSBpbnRzWzBdID49IDggPyBpbnRzWzhdIDogMDsKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJc2V0dXBbc2V0dXBfY291bnRdLmRlYnVnICAgICAgID0gaW50c1swXSA+PSA5ID8gaW50c1s5XSA6IERFQlVHX0RFRkFVTFQ7CisJaWYgKGludHNbMF0gPiA5KSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiYWhhMTUyeDogdXNhZ2U6IGFoYTE1Mng9PElPQkFTRT5bLDxJUlE+Wyw8U0NTSSBJRD4iCisJCSAgICAgICAiWyw8UkVDT05ORUNUPlssPFBBUklUWT5bLDxTWU5DSFJPTk9VUz5bLDxERUxBWT5bLDxFWFRfVFJBTlM+Wyw8REVCVUc+XV1dXV1dXV1cbiIpOworI2Vsc2UKKwlpZiAoaW50c1swXSA+IDgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKn0qLworCQlwcmludGsoS0VSTl9OT1RJQ0UgImFoYTE1Mng6IHVzYWdlOiBhaGExNTJ4PTxJT0JBU0U+Wyw8SVJRPlssPFNDU0kgSUQ+IgorCQkgICAgICAgIlssPFJFQ09OTkVDVD5bLDxQQVJJVFk+Wyw8U1lOQ0hST05PVVM+Wyw8REVMQVk+Wyw8RVhUX1RSQU5TPl1dXV1dXV1cbiIpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJc2V0dXBfY291bnQrKzsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJhaGExNTJ4PSIsIGFoYTE1Mnhfc2V0dXApOworI2VuZGlmCisKKyNlbmRpZiAvKiAhUENNQ0lBICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWhhMTUyeC5oIGIvZHJpdmVycy9zY3NpL2FoYTE1MnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjc3NjEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FoYTE1MnguaApAQCAtMCwwICsxLDMzNyBAQAorI2lmbmRlZiBfQUhBMTUyWF9ICisjZGVmaW5lIF9BSEExNTJYX0gKKworLyoKKyAqICRJZDogYWhhMTUyeC5oLHYgMi43IDIwMDQvMDEvMjQgMTE6Mzk6MDMgZmlzY2hlciBFeHAgJAorICovCisKKy8qIG51bWJlciBvZiBxdWV1ZWFibGUgY29tbWFuZHMKKyAgICh1bmxlc3Mgd2Ugc3VwcG9ydCBtb3JlIHRoYW4gMSBjbWRfcGVyX2x1biB0aGlzIHNob3VsZCBkbykgKi8KKyNkZWZpbmUgQUhBMTUyWF9NQVhRVUVVRSA3CisKKyNkZWZpbmUgQUhBMTUyWF9SRVZJRCAiQWRhcHRlYyAxNTJ4IFNDU0kgZHJpdmVyOyAkUmV2aXNpb246IDIuNyAkIgorCisvKiBwb3J0IGFkZHJlc3NlcyAqLworI2RlZmluZSBTQ1NJU0VRICAgICAgKEhPU1RJT1BPUlQwKzB4MDApICAgIC8qIFNDU0kgc2VxdWVuY2UgY29udHJvbCAqLworI2RlZmluZSBTWEZSQ1RMMCAgICAgKEhPU1RJT1BPUlQwKzB4MDEpICAgIC8qIFNDU0kgdHJhbnNmZXIgY29udHJvbCAwICovCisjZGVmaW5lIFNYRlJDVEwxICAgICAoSE9TVElPUE9SVDArMHgwMikgICAgLyogU0NTSSB0cmFuc2ZlciBjb250cm9sIDEgKi8KKyNkZWZpbmUgU0NTSVNJRyAgICAgIChIT1NUSU9QT1JUMCsweDAzKSAgICAvKiBTQ1NJIHNpZ25hbCBpbi9vdXQgKi8KKyNkZWZpbmUgU0NTSVJBVEUgICAgIChIT1NUSU9QT1JUMCsweDA0KSAgICAvKiBTQ1NJIHJhdGUgY29udHJvbCAqLworI2RlZmluZSBTRUxJRCAgICAgICAgKEhPU1RJT1BPUlQwKzB4MDUpICAgIC8qIHNlbGVjdGlvbi9yZXNlbGVjdGlvbiBJRCAqLworI2RlZmluZSBTQ1NJSUQgICAgICAgU0VMSUQgICAgICAgICAgICAgICAgIC8qIFNDU0kgSUQgKi8KKyNkZWZpbmUgU0NTSURBVCAgICAgIChIT1NUSU9QT1JUMCsweDA2KSAgICAvKiBTQ1NJIGxhdGNoZWQgZGF0YSAqLworI2RlZmluZSBTQ1NJQlVTICAgICAgKEhPU1RJT1BPUlQwKzB4MDcpICAgIC8qIFNDU0kgZGF0YSBidXMgKi8KKyNkZWZpbmUgU1RDTlQwICAgICAgIChIT1NUSU9QT1JUMCsweDA4KSAgICAvKiBTQ1NJIHRyYW5zZmVyIGNvdW50IDAgKi8KKyNkZWZpbmUgU1RDTlQxICAgICAgIChIT1NUSU9QT1JUMCsweDA5KSAgICAvKiBTQ1NJIHRyYW5zZmVyIGNvdW50IDEgKi8KKyNkZWZpbmUgU1RDTlQyICAgICAgIChIT1NUSU9QT1JUMCsweDBhKSAgICAvKiBTQ1NJIHRyYW5zZmVyIGNvdW50IDIgKi8KKyNkZWZpbmUgU1NUQVQwICAgICAgIChIT1NUSU9QT1JUMCsweDBiKSAgICAvKiBTQ1NJIGludGVycnVwdCBzdGF0dXMgMCAqLworI2RlZmluZSBTU1RBVDEgICAgICAgKEhPU1RJT1BPUlQwKzB4MGMpICAgIC8qIFNDU0kgaW50ZXJydXB0IHN0YXR1cyAxICovCisjZGVmaW5lIFNTVEFUMiAgICAgICAoSE9TVElPUE9SVDArMHgwZCkgICAgLyogU0NTSSBpbnRlcnJ1cHQgc3RhdHVzIDIgKi8KKyNkZWZpbmUgU0NTSVRFU1QgICAgIChIT1NUSU9QT1JUMCsweDBlKSAgICAvKiBTQ1NJIHRlc3QgY29udHJvbCAqLworI2RlZmluZSBTU1RBVDMgICAgICAgU0NTSVRFU1QgICAgICAgICAgICAgIC8qIFNDU0kgaW50ZXJydXB0IHN0YXR1cyAzICovCisjZGVmaW5lIFNTVEFUNCAgICAgICAoSE9TVElPUE9SVDArMHgwZikgICAgLyogU0NTSSBzdGF0dXMgNCAqLworI2RlZmluZSBTSU1PREUwICAgICAgKEhPU1RJT1BPUlQxKzB4MTApICAgIC8qIFNDU0kgaW50ZXJydXB0IG1vZGUgMCAqLworI2RlZmluZSBTSU1PREUxICAgICAgKEhPU1RJT1BPUlQxKzB4MTEpICAgIC8qIFNDU0kgaW50ZXJydXB0IG1vZGUgMSAqLworI2RlZmluZSBETUFDTlRSTDAgICAgKEhPU1RJT1BPUlQxKzB4MTIpICAgIC8qIERNQSBjb250cm9sIDAgKi8KKyNkZWZpbmUgRE1BQ05UUkwxICAgIChIT1NUSU9QT1JUMSsweDEzKSAgICAvKiBETUEgY29udHJvbCAxICovCisjZGVmaW5lIERNQVNUQVQgICAgICAoSE9TVElPUE9SVDErMHgxNCkgICAgLyogRE1BIHN0YXR1cyAqLworI2RlZmluZSBGSUZPU1RBVCAgICAgKEhPU1RJT1BPUlQxKzB4MTUpICAgIC8qIEZJRk8gc3RhdHVzICovCisjZGVmaW5lIERBVEFQT1JUICAgICAoSE9TVElPUE9SVDErMHgxNikgICAgLyogREFUQSBwb3J0ICovCisjZGVmaW5lIEJSU1RDTlRSTCAgICAoSE9TVElPUE9SVDErMHgxOCkgICAgLyogYnVyc3QgY29udHJvbCAqLworI2RlZmluZSBQT1JUQSAgICAgICAgKEhPU1RJT1BPUlQxKzB4MWEpICAgIC8qIFBPUlQgQSAqLworI2RlZmluZSBQT1JUQiAgICAgICAgKEhPU1RJT1BPUlQxKzB4MWIpICAgIC8qIFBPUlQgQiAqLworI2RlZmluZSBSRVYgICAgICAgICAgKEhPU1RJT1BPUlQxKzB4MWMpICAgIC8qIHJldmlzaW9uICovCisjZGVmaW5lIFNUQUNLICAgICAgICAoSE9TVElPUE9SVDErMHgxZCkgICAgLyogc3RhY2sgKi8KKyNkZWZpbmUgVEVTVCAgICAgICAgIChIT1NUSU9QT1JUMSsweDFlKSAgICAvKiB0ZXN0IHJlZ2lzdGVyICovCisKKyNkZWZpbmUgSU9fUkFOR0UgICAgICAgIDB4MjAKKworLyogdXNlZCBpbiBhaGExNTJ4X3BvcnR0ZXN0ICovCisjZGVmaW5lIE9fUE9SVEEgICAgICAgICAweDFhICAgICAgICAgICAgICAgLyogUE9SVCBBICovCisjZGVmaW5lIE9fUE9SVEIgICAgICAgICAweDFiICAgICAgICAgICAgICAgLyogUE9SVCBCICovCisjZGVmaW5lIE9fRE1BQ05UUkwxICAgICAweDEzICAgICAgICAgICAgICAgLyogRE1BIGNvbnRyb2wgMSAqLworI2RlZmluZSBPX1NUQUNLICAgICAgICAgMHgxZCAgICAgICAgICAgICAgIC8qIHN0YWNrICovCisKKy8qIHVzZWQgaW4gdGMxNTUwX3BvcnR0ZXN0ICovCisjZGVmaW5lIE9fVENfUE9SVEEgICAgICAweDBhICAgICAgICAgICAgICAgLyogUE9SVCBBICovCisjZGVmaW5lIE9fVENfUE9SVEIgICAgICAweDBiICAgICAgICAgICAgICAgLyogUE9SVCBCICovCisjZGVmaW5lIE9fVENfRE1BQ05UUkwxICAweDAzICAgICAgICAgICAgICAgLyogRE1BIGNvbnRyb2wgMSAqLworI2RlZmluZSBPX1RDX1NUQUNLICAgICAgMHgwZCAgICAgICAgICAgICAgIC8qIHN0YWNrICovCisKKy8qIGJpdHMgYW5kIGJpdG1hc2tzIHRvIHBvcnRzICovCisKKy8qIFNDU0kgc2VxdWVuY2UgY29udHJvbCAqLworI2RlZmluZSBURU1PREVPICAgICAgMHg4MAorI2RlZmluZSBFTlNFTE8gICAgICAgMHg0MAorI2RlZmluZSBFTlNFTEkgICAgICAgMHgyMAorI2RlZmluZSBFTlJFU0VMSSAgICAgMHgxMAorI2RlZmluZSBFTkFVVE9BVE5PICAgMHgwOAorI2RlZmluZSBFTkFVVE9BVE5JICAgMHgwNAorI2RlZmluZSBFTkFVVE9BVE5QICAgMHgwMgorI2RlZmluZSBTQ1NJUlNUTyAgICAgMHgwMQorCisvKiBTQ1NJIHRyYW5zZmVyIGNvbnRyb2wgMCAqLworI2RlZmluZSBTQ1NJRU4gICAgICAgMHg4MAorI2RlZmluZSBETUFFTiAgICAgICAgMHg0MAorI2RlZmluZSBDSDEgICAgICAgICAgMHgyMAorI2RlZmluZSBDTFJTVENOVCAgICAgMHgxMAorI2RlZmluZSBTUElPRU4gICAgICAgMHgwOAorI2RlZmluZSBDTFJDSDEgICAgICAgMHgwMgorCisvKiBTQ1NJIHRyYW5zZmVyIGNvbnRyb2wgMSAqLworI2RlZmluZSBCSVRCVUNLRVQgICAgMHg4MAorI2RlZmluZSBTV1JBUEVOICAgICAgMHg0MAorI2RlZmluZSBFTlNQQ0hLICAgICAgMHgyMAorI2RlZmluZSBTVElNRVNFTCAgICAgMHgxOCAgICAvKiBtYXNrICovCisjZGVmaW5lIFNUSU1FU0VMXyAgICAzCisjZGVmaW5lIEVOU1RJTUVSICAgICAweDA0CisjZGVmaW5lIEJZVEVBTElHTiAgICAweDAyCisKKy8qIFNDU0kgc2lnbmFsIElOICovCisjZGVmaW5lIFNJR19DREkgICAgICAgICAgMHg4MAorI2RlZmluZSBTSUdfSU9JICAgICAgICAgIDB4NDAKKyNkZWZpbmUgU0lHX01TR0kgICAgICAgICAweDIwCisjZGVmaW5lIFNJR19BVE5JICAgICAgICAgMHgxMAorI2RlZmluZSBTSUdfU0VMSSAgICAgICAgIDB4MDgKKyNkZWZpbmUgU0lHX0JTWUkgICAgICAgICAweDA0CisjZGVmaW5lIFNJR19SRVFJICAgICAgICAgMHgwMgorI2RlZmluZSBTSUdfQUNLSSAgICAgICAgIDB4MDEKKworLyogU0NTSSBQaGFzZXMgKi8KKyNkZWZpbmUgUF9NQVNLICAgICAgIChTSUdfTVNHSXxTSUdfQ0RJfFNJR19JT0kpCisjZGVmaW5lIFBfREFUQU8gICAgICAoMCkKKyNkZWZpbmUgUF9EQVRBSSAgICAgIChTSUdfSU9JKQorI2RlZmluZSBQX0NNRCAgICAgICAgKFNJR19DREkpCisjZGVmaW5lIFBfU1RBVFVTICAgICAoU0lHX0NESXxTSUdfSU9JKQorI2RlZmluZSBQX01TR08gICAgICAgKFNJR19NU0dJfFNJR19DREkpCisjZGVmaW5lIFBfTVNHSSAgICAgICAoU0lHX01TR0l8U0lHX0NESXxTSUdfSU9JKQorCisvKiBTQ1NJIHNpZ25hbCBPVVQgKi8KKyNkZWZpbmUgU0lHX0NETyAgICAgICAgICAweDgwCisjZGVmaW5lIFNJR19JT08gICAgICAgICAgMHg0MAorI2RlZmluZSBTSUdfTVNHTyAgICAgICAgIDB4MjAKKyNkZWZpbmUgU0lHX0FUTk8gICAgICAgICAweDEwCisjZGVmaW5lIFNJR19TRUxPICAgICAgICAgMHgwOAorI2RlZmluZSBTSUdfQlNZTyAgICAgICAgIDB4MDQKKyNkZWZpbmUgU0lHX1JFUU8gICAgICAgICAweDAyCisjZGVmaW5lIFNJR19BQ0tPICAgICAgICAgMHgwMQorCisvKiBTQ1NJIHJhdGUgY29udHJvbCAqLworI2RlZmluZSBTWEZSICAgICAgICAgMHg3MCAgICAvKiBtYXNrICovCisjZGVmaW5lIFNYRlJfICAgICAgICA0CisjZGVmaW5lIFNPRlMgICAgICAgICAweDBmICAgIC8qIG1hc2sgKi8KKworLyogU0NTSSBJRCAqLworI2RlZmluZSBPSUQgICAgICAgICAgMHg3MAorI2RlZmluZSBPSURfICAgICAgICAgNAorI2RlZmluZSBUSUQgICAgICAgICAgMHgwNworCisvKiBTQ1NJIHRyYW5zZmVyIGNvdW50ICovCisjZGVmaW5lIEdFVFNUQ05UKCkgKCAoR0VUUE9SVChTVENOVDIpPDwxNikgXAorICAgICAgICAgICAgICAgICAgICsgKEdFVFBPUlQoU1RDTlQxKTw8IDgpIFwKKyAgICAgICAgICAgICAgICAgICArIEdFVFBPUlQoU1RDTlQwKSApCisKKyNkZWZpbmUgU0VUU1RDTlQoWCkgeyBTRVRQT1JUKFNUQ05UMiwgKChYKSAmIDB4RkYwMDAwKSA+PiAxNik7IFwKKyAgICAgICAgICAgICAgICAgICAgICBTRVRQT1JUKFNUQ05UMSwgKChYKSAmIDB4MDBGRjAwKSA+PiAgOCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICBTRVRQT1JUKFNUQ05UMCwgKChYKSAmIDB4MDAwMEZGKSApOyB9CisKKy8qIFNDU0kgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBUQVJHRVQgICAgICAgMHg4MAorI2RlZmluZSBTRUxETyAgICAgICAgMHg0MAorI2RlZmluZSBTRUxESSAgICAgICAgMHgyMAorI2RlZmluZSBTRUxJTkdPICAgICAgMHgxMAorI2RlZmluZSBTV1JBUCAgICAgICAgMHgwOAorI2RlZmluZSBTRE9ORSAgICAgICAgMHgwNAorI2RlZmluZSBTUElPUkRZICAgICAgMHgwMgorI2RlZmluZSBETUFET05FICAgICAgMHgwMQorCisjZGVmaW5lIFNFVFNET05FICAgICAweDgwCisjZGVmaW5lIENMUlNFTERPICAgICAweDQwCisjZGVmaW5lIENMUlNFTERJICAgICAweDIwCisjZGVmaW5lIENMUlNFTElOR08gICAweDEwCisjZGVmaW5lIENMUlNXUkFQICAgICAweDA4CisjZGVmaW5lIENMUlNET05FICAgICAweDA0CisjZGVmaW5lIENMUlNQSU9SRFkgICAweDAyCisjZGVmaW5lIENMUkRNQURPTkUgICAweDAxCisKKy8qIFNDU0kgc3RhdHVzIDEgKi8KKyNkZWZpbmUgU0VMVE8gICAgICAgIDB4ODAKKyNkZWZpbmUgQVROVEFSRyAgICAgIDB4NDAKKyNkZWZpbmUgU0NTSVJTVEkgICAgIDB4MjAKKyNkZWZpbmUgUEhBU0VNSVMgICAgIDB4MTAKKyNkZWZpbmUgQlVTRlJFRSAgICAgIDB4MDgKKyNkZWZpbmUgU0NTSVBFUlIgICAgIDB4MDQKKyNkZWZpbmUgUEhBU0VDSEcgICAgIDB4MDIKKyNkZWZpbmUgUkVRSU5JVCAgICAgIDB4MDEKKworI2RlZmluZSBDTFJTRUxUSU1PICAgMHg4MAorI2RlZmluZSBDTFJBVE5PICAgICAgMHg0MAorI2RlZmluZSBDTFJTQ1NJUlNUSSAgMHgyMAorI2RlZmluZSBDTFJCVVNGUkVFICAgMHgwOAorI2RlZmluZSBDTFJTQ1NJUEVSUiAgMHgwNAorI2RlZmluZSBDTFJQSEFTRUNIRyAgMHgwMgorI2RlZmluZSBDTFJSRVFJTklUICAgMHgwMQorCisvKiBTQ1NJIHN0YXR1cyAyICovCisjZGVmaW5lIFNPRkZTRVQgICAgICAweDIwCisjZGVmaW5lIFNFTVBUWSAgICAgICAweDEwCisjZGVmaW5lIFNGVUxMICAgICAgICAweDA4CisjZGVmaW5lIFNGQ05UICAgICAgICAweDA3ICAgIC8qIG1hc2sgKi8KKworLyogU0NTSSBzdGF0dXMgMyAqLworI2RlZmluZSBTQ1NJQ05UICAgICAgMHhmMCAgICAvKiBtYXNrICovCisjZGVmaW5lIFNDU0lDTlRfICAgICA0CisjZGVmaW5lIE9GRkNOVCAgICAgICAweDBmICAgIC8qIG1hc2sgKi8KKworLyogU0NTSSBURVNUIGNvbnRyb2wgKi8KKyNkZWZpbmUgU0NURVNUVSAgICAgIDB4MDgKKyNkZWZpbmUgU0NURVNURCAgICAgIDB4MDQKKyNkZWZpbmUgU1RDVEVTVCAgICAgIDB4MDEKKworLyogU0NTSSBzdGF0dXMgNCAqLworI2RlZmluZSBTWU5DRVJSICAgICAgMHgwNAorI2RlZmluZSBGV0VSUiAgICAgICAgMHgwMgorI2RlZmluZSBGUkVSUiAgICAgICAgMHgwMQorCisjZGVmaW5lIENMUlNZTkNFUlIgICAweDA0CisjZGVmaW5lIENMUkZXRVJSICAgICAweDAyCisjZGVmaW5lIENMUkZSRVJSICAgICAweDAxCisKKy8qIFNDU0kgaW50ZXJydXB0IG1vZGUgMCAqLworI2RlZmluZSBFTlNFTERPICAgICAgMHg0MAorI2RlZmluZSBFTlNFTERJICAgICAgMHgyMAorI2RlZmluZSBFTlNFTElOR08gICAgMHgxMAorI2RlZmluZSBFTlNXUkFQICAgICAgMHgwOAorI2RlZmluZSBFTlNET05FICAgICAgMHgwNAorI2RlZmluZSBFTlNQSU9SRFkgICAgMHgwMgorI2RlZmluZSBFTkRNQURPTkUgICAgMHgwMQorCisvKiBTQ1NJIGludGVycnVwdCBtb2RlIDEgKi8KKyNkZWZpbmUgRU5TRUxUSU1PICAgIDB4ODAKKyNkZWZpbmUgRU5BVE5UQVJHICAgIDB4NDAKKyNkZWZpbmUgRU5TQ1NJUlNUICAgIDB4MjAKKyNkZWZpbmUgRU5QSEFTRU1JUyAgIDB4MTAKKyNkZWZpbmUgRU5CVVNGUkVFICAgIDB4MDgKKyNkZWZpbmUgRU5TQ1NJUEVSUiAgIDB4MDQKKyNkZWZpbmUgRU5QSEFTRUNIRyAgIDB4MDIKKyNkZWZpbmUgRU5SRVFJTklUICAgIDB4MDEKKworLyogRE1BIGNvbnRyb2wgMCAqLworI2RlZmluZSBFTkRNQSAgICAgICAgMHg4MAorI2RlZmluZSBfOEJJVCAgICAgICAgMHg0MAorI2RlZmluZSBETUEgICAgICAgICAgMHgyMAorI2RlZmluZSBXUklURV9SRUFEICAgMHgwOAorI2RlZmluZSBJTlRFTiAgICAgICAgMHgwNAorI2RlZmluZSBSU1RGSUZPICAgICAgMHgwMgorI2RlZmluZSBTV0lOVCAgICAgICAgMHgwMQorCisvKiBETUEgY29udHJvbCAxICovCisjZGVmaW5lIFBXUkRXTiAgICAgICAweDgwCisjZGVmaW5lIFNUSyAgICAgICAgICAweDA3ICAgIC8qIG1hc2sgKi8KKworLyogRE1BIHN0YXR1cyAqLworI2RlZmluZSBBVERPTkUgICAgICAgMHg4MAorI2RlZmluZSBXT1JEUkRZICAgICAgMHg0MAorI2RlZmluZSBJTlRTVEFUICAgICAgMHgyMAorI2RlZmluZSBERklGT0ZVTEwgICAgMHgxMAorI2RlZmluZSBERklGT0VNUCAgICAgMHgwOAorCisvKiBCVVJTVCBjb250cm9sICovCisjZGVmaW5lIEJPTiAgICAgICAgICAweGYwCisjZGVmaW5lIEJPRkYgICAgICAgICAweDBmCisKKy8qIFRFU1QgUkVHSVNURVIgKi8KKyNkZWZpbmUgQk9GRlRNUiAgICAgIDB4NDAKKyNkZWZpbmUgQk9OVE1SICAgICAgIDB4MjAKKyNkZWZpbmUgU1RDTlRIICAgICAgIDB4MTAKKyNkZWZpbmUgU1RDTlRNICAgICAgIDB4MDgKKyNkZWZpbmUgU1RDTlRMICAgICAgIDB4MDQKKyNkZWZpbmUgU0NTSUJMSyAgICAgIDB4MDIKKyNkZWZpbmUgRE1BQkxLICAgICAgIDB4MDEKKworLyogT24gdGhlIEFIQS0xNTJ4IGJvYXJkIFBPUlRBIGFuZCBQT1JUQiBjb250YWluCisgICBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBib2FyZCdzIGNvbmZpZ3VyYXRpb24uICovCit0eXBlZGVmIHVuaW9uIHsKKyAgc3RydWN0IHsKKyAgICB1bnNpZ25lZCByZXNlcnZlZDoyOyAgICAvKiByZXNlcnZlZCAqLworICAgIHVuc2lnbmVkIHRhcmRpc2M6MTsgICAgIC8qIFRhcmdldCBkaXNjb25uZWN0OiAwPWRpc2FibGVkLCAxPWVuYWJsZWQgKi8KKyAgICB1bnNpZ25lZCBzeW5jbmVnOjE7ICAgICAvKiBJbml0aWFsIHN5bmMgbmVnOiAwPWRpc2FibGVkLCAxPWVuYWJsZWQgKi8KKyAgICB1bnNpZ25lZCBtc2djbGFzc2VzOjI7ICAvKiBNZXNzYWdlIGNsYXNzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA9IzQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9IzAsICMxLCAjMiwgIzMsICM0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyPSMwLCAjMywgIzQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM9IzAsICM0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgYm9vdDoxOyAgICAgICAgLyogYm9vdDogMD1kaXNhYmxlZCwgMT1lbmFibGVkICovCisgICAgdW5zaWduZWQgZG1hOjE7ICAgICAgICAgLyogVHJhbnNmZXIgbW9kZTogMD1QSU87IDE9RE1BICovCisgICAgdW5zaWduZWQgaWQ6MzsgICAgICAgICAgLyogU0NTSS1pZCAqLworICAgIHVuc2lnbmVkIGlycToyOyAgICAgICAgIC8qIElSUS1DaGFubmVsOiAwLDM9MTIsIDE9MTAsIDI9MTEgKi8KKyAgICB1bnNpZ25lZCBkbWFjaGFuOjI7ICAgICAvKiBETUEtQ2hhbm5lbDogMD0wLCAxPTUsIDI9NiwgMz03ICovCisgICAgdW5zaWduZWQgcGFyaXR5OjE7ICAgICAgLyogU0NTSS1wYXJpdHk6IDE9ZW5hYmxlZCAwPWRpc2FibGVkICovCisgIH0gZmllbGRzOworICB1bnNpZ25lZCBzaG9ydCBwb3J0OworfSBhaGExNTJ4X2NvbmZpZyA7CisKKyNkZWZpbmUgY2ZfcGFyaXR5ICAgICBmaWVsZHMucGFyaXR5CisjZGVmaW5lIGNmX2RtYWNoYW4gICAgZmllbGRzLmRtYWNoYW4KKyNkZWZpbmUgY2ZfaXJxICAgICAgICBmaWVsZHMuaXJxCisjZGVmaW5lIGNmX2lkICAgICAgICAgZmllbGRzLmlkCisjZGVmaW5lIGNmX2RtYSAgICAgICAgZmllbGRzLmRtYQorI2RlZmluZSBjZl9ib290ICAgICAgIGZpZWxkcy5ib290CisjZGVmaW5lIGNmX21zZ2NsYXNzZXMgZmllbGRzLm1zZ2NsYXNzZXMKKyNkZWZpbmUgY2Zfc3luY25lZyAgICBmaWVsZHMuc3luY25lZworI2RlZmluZSBjZl90YXJkaXNjICAgIGZpZWxkcy50YXJkaXNjCisjZGVmaW5lIGNmX3BvcnQgICAgICAgcG9ydAorCisvKiBTb21lIG1hY3JvcyB0byBtYW5pcHVsYXRlIHBvcnRzIGFuZCB0aGVpciBiaXRzICovCisKKyNkZWZpbmUgU0VUUE9SVChQT1JULCBWQUwpCW91dGIoIChWQUwpLCAoUE9SVCkgKQorI2RlZmluZSBHRVRQT1JUKFBPUlQpCQlpbmIoIFBPUlQgKQorI2RlZmluZSBTRVRCSVRTKFBPUlQsIEJJVFMpCW91dGIoIChpbmIoUE9SVCkgfCAoQklUUykpLCAoUE9SVCkgKQorI2RlZmluZSBDTFJCSVRTKFBPUlQsIEJJVFMpCW91dGIoIChpbmIoUE9SVCkgJiB+KEJJVFMpKSwgKFBPUlQpICkKKyNkZWZpbmUgVEVTVEhJKFBPUlQsIEJJVFMpCSgoaW5iKFBPUlQpICYgKEJJVFMpKSA9PSAoQklUUykpCisjZGVmaW5lIFRFU1RMTyhQT1JULCBCSVRTKQkoKGluYihQT1JUKSAmIChCSVRTKSkgPT0gMCkKKworI2RlZmluZSBTRVRSQVRFKFJBVEUpCQlTRVRQT1JUKFNDU0lSQVRFLChSQVRFKSAmIDB4N2YpCisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCitlbnVtIHsKKyAgZGVidWdfcHJvY2luZm8gID0gMHgwMDAxLAorICBkZWJ1Z19xdWV1ZSAgICAgPSAweDAwMDIsCisgIGRlYnVnX2xvY2tzICAgICA9IDB4MDAwNCwKKyAgZGVidWdfaW50ciAgICAgID0gMHgwMDA4LAorICBkZWJ1Z19zZWxlY3Rpb24gPSAweDAwMTAsCisgIGRlYnVnX21zZ28gICAgICA9IDB4MDAyMCwKKyAgZGVidWdfbXNnaSAgICAgID0gMHgwMDQwLAorICBkZWJ1Z19zdGF0dXMgICAgPSAweDAwODAsCisgIGRlYnVnX2NtZCAgICAgICA9IDB4MDEwMCwKKyAgZGVidWdfZGF0YWkgICAgID0gMHgwMjAwLAorICBkZWJ1Z19kYXRhbyAgICAgPSAweDA0MDAsCisgIGRlYnVnX2VoCSAgPSAweDA4MDAsCisgIGRlYnVnX2RvbmUgICAgICA9IDB4MTAwMCwKKyAgZGVidWdfcGhhc2VzICAgID0gMHgyMDAwLAorfTsKKyNlbmRpZgorCisvKiBmb3IgdGhlIHBjbWNpYSBzdHViICovCitzdHJ1Y3QgYWhhMTUyeF9zZXR1cCB7CisJaW50IGlvX3BvcnQ7CisJaW50IGlycTsKKwlpbnQgc2NzaWlkOworCWludCByZWNvbm5lY3Q7CisJaW50IHBhcml0eTsKKwlpbnQgc3luY2hyb25vdXM7CisJaW50IGRlbGF5OworCWludCBleHRfdHJhbnM7CisJaW50IHRjMTU1MDsKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJaW50IGRlYnVnOworI2VuZGlmCisJY2hhciAqY29uZjsKK307CisKK3N0cnVjdCBTY3NpX0hvc3QgKmFoYTE1MnhfcHJvYmVfb25lKHN0cnVjdCBhaGExNTJ4X3NldHVwICopOwordm9pZCBhaGExNTJ4X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqKTsKK2ludCBhaGExNTJ4X2hvc3RfcmVzZXQoU2NzaV9DbW5kICopOworCisjZW5kaWYgLyogX0FIQTE1MlhfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FoYTE1NDIuYyBiL2RyaXZlcnMvc2NzaS9haGExNTQyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk5MjBhMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haGExNTQyLmMKQEAgLTAsMCArMSwxODMyIEBACisvKiAkSWQ6IGFoYTE1NDIuYyx2IDEuMSAxOTkyLzA3LzI0IDA2OjI3OjM4IHJvb3QgRXhwIHJvb3QgJAorICogIGxpbnV4L2tlcm5lbC9haGExNTQyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBUb21teSBUaG9ybgorICogIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSBFcmljIFlvdW5nZGFsZQorICoKKyAqICBNb2RpZmllZCBieSBFcmljIFlvdW5nZGFsZQorICogICAgICAgIFVzZSByZXF1ZXN0X2lycSBhbmQgcmVxdWVzdF9kbWEgdG8gaGVscCBwcmV2ZW50IHVuZXhwZWN0ZWQgY29uZmxpY3RzCisgKiAgICAgICAgU2V0IHVwIG9uLWJvYXJkIERNQSBjb250cm9sbGVyLCBzdWNoIHRoYXQgd2UgZG8gbm90IGhhdmUgdG8KKyAqICAgICAgICBoYXZlIHRoZSBiaW9zIGVuYWJsZWQgdG8gdXNlIHRoZSBhaGExNTQyLgorICogIE1vZGlmaWVkIGJ5IERhdmlkIEdlbnR6ZWwKKyAqICAgICAgICBEb24ndCBjYWxsIHJlcXVlc3RfZG1hIGlmIGRtYSBtYXNrIGlzIDAgKGZvciBCdXNMb2dpYyBCVC00NDVTIFZMLUJ1cworICogICAgICAgIGNvbnRyb2xsZXIpLgorICogIE1vZGlmaWVkIGJ5IE1hdHRpIEFhcm5pbworICogICAgICAgIEFjY2VwdCBwYXJhbWV0ZXJzIGZyb20gTElMTyBjbWQtbGluZS4gLS0gMS1PY3QtOTQKKyAqICBNb2RpZmllZCBieSBNaWtlIE1jTGFnYW4gPG1pa2UubWNsYWdhbkBsaW51eC5vcmc+CisgKiAgICAgICAgUmVjb2duaXNlIGV4dGVuZGVkIG1vZGUgb24gQUhBMTU0MkNQLCBkaWZmZXJlbnQgYml0IHRoYW4gMTU0MkNGCisgKiAgICAgICAgMS1KYW4tOTcKKyAqICBNb2RpZmllZCBieSBCam9ybiBMLiBUaG9yZGFyc29uIGFuZCBFaW5hciBUaG9yIEVpbmFyc3NvbgorICogICAgICAgIFJlY29nbml6ZSB0aGF0IERNQTAgaXMgdmFsaWQgRE1BIGNoYW5uZWwgLS0gMTMtSnVsLTk4CisgKiAgTW9kaWZpZWQgYnkgQ2hyaXMgRmF1bGhhYmVyIDxqZWRnYXJAZnhwLm9yZz4KKyAqICAgICAgICBBZGRlZCBtb2R1bGUgY29tbWFuZC1saW5lIG9wdGlvbnMKKyAqICAgICAgICAxOS1KdWwtOTkKKyAqICBNb2RpZmllZCBieSBBZGFtIEZyaXR6bGVyIDxtaWRAYXVrLmN4PgorICogICAgICAgIEFkZGVkIHByb3BlciBkZXRlY3Rpb24gb2YgdGhlIEFIQS0xNjQwIChNQ0EgdmVyc2lvbiBvZiBBSEEtMTU0MCkKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pc2FwbnAuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EtbGVnYWN5Lmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiYWhhMTU0Mi5oIgorCisjZGVmaW5lIFNDU0lfQlVGX1BBKGFkZHJlc3MpCWlzYV92aXJ0X3RvX2J1cyhhZGRyZXNzKQorI2RlZmluZSBTQ1NJX1NHX1BBKHNnZW50KQkoaXNhX3BhZ2VfdG9fYnVzKChzZ2VudCktPnBhZ2UpICsgKHNnZW50KS0+b2Zmc2V0KQorCitzdGF0aWMgdm9pZCBCQURfRE1BKHZvaWQgKmFkZHJlc3MsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJcHJpbnRrKEtFUk5fQ1JJVCAiYnVmIHZhZGRyZXNzICVwIHBhZGRyZXNzIDB4JWx4IGxlbmd0aCAlZFxuIiwKKwkgICAgICAgYWRkcmVzcywKKwkgICAgICAgU0NTSV9CVUZfUEEoYWRkcmVzcyksCisJICAgICAgIGxlbmd0aCk7CisJcGFuaWMoIkJ1ZmZlciBhdCBwaHlzaWNhbCBhZGRyZXNzID4gMTZNYiB1c2VkIGZvciBhaGExNTQyIik7Cit9CisKK3N0YXRpYyB2b2lkIEJBRF9TR19ETUEoU2NzaV9DbW5kICogU0NwbnQsCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNncG50LAorCQkgICAgICAgaW50IG5zZWcsCisJCSAgICAgICBpbnQgYmFkc2VnKQoreworCXByaW50ayhLRVJOX0NSSVQgInNncG50WyVkOiVkXSBwYWdlICVwLzB4JWxseCBsZW5ndGggJXVcbiIsCisJICAgICAgIGJhZHNlZywgbnNlZywKKwkgICAgICAgcGFnZV9hZGRyZXNzKHNncG50W2JhZHNlZ10ucGFnZSkgKyBzZ3BudFtiYWRzZWddLm9mZnNldCwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylTQ1NJX1NHX1BBKCZzZ3BudFtiYWRzZWddKSwKKwkgICAgICAgc2dwbnRbYmFkc2VnXS5sZW5ndGgpOworCisJLyoKKwkgKiBOb3Qgc2FmZSB0byBjb250aW51ZS4KKwkgKi8KKwlwYW5pYygiQnVmZmVyIGF0IHBoeXNpY2FsIGFkZHJlc3MgPiAxNk1iIHVzZWQgZm9yIGFoYTE1NDIiKTsKK30KKworI2luY2x1ZGU8bGludXgvc3RhdC5oPgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREVCKHgpIHgKKyNlbHNlCisjZGVmaW5lIERFQih4KQorI2VuZGlmCisKKy8qCisgICBzdGF0aWMgY29uc3QgY2hhciBSQ1NpZFtdID0gIiRIZWFkZXI6IC91c3Ivc3JjL2xpbnV4L2tlcm5lbC9ibGtfZHJ2L3Njc2kvUkNTL2FoYTE1NDIuYyx2IDEuMSAxOTkyLzA3LzI0IDA2OjI3OjM4IHJvb3QgRXhwIHJvb3QgJCI7CisgKi8KKworLyogVGhlIGFkYXB0ZWMgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIHF1aXRlIGEgbnVtYmVyIG9mIGFkZHJlc3NlcywgYnV0CisgICBJIGdlbmVyYWxseSBkbyBub3Qgd2FudCB0aGUgY2FyZCBwb2tpbmcgYXJvdW5kIGF0IHJhbmRvbS4gIFdlIGFsbG93CisgICB0d28gYWRkcmVzc2VzIC0gdGhpcyBhbGxvd3MgcGVvcGxlIHRvIHVzZSB0aGUgQWRhcHRlYyB3aXRoIGEgTWlkaQorICAgY2FyZCwgd2hpY2ggYWxzbyB1c2VkIDB4MzMwIC0tIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggTElMTyEgKi8KKworI2RlZmluZSBNQVhCT0FSRFMgNAkJLyogSW5jcmVhc2UgdGhpcyBhbmQgdGhlIHNpemVzIG9mIHRoZQorCQkJCSAgIGFycmF5cyBiZWxvdywgaWYgeW91IG5lZWQgbW9yZS4uICovCisKKy8qIEJvYXJkcyAzLDQgc2xvdHMgYXJlIHJlc2VydmVkIGZvciBJU0FQblAvTUNBIHNjYW5zICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYmFzZXNbTUFYQk9BUkRTXSBfX2luaXRkYXRhID0gezB4MzMwLCAweDMzNCwgMCwgMH07CisKKy8qIHNldCBieSBhaGExNTQyX3NldHVwIGFjY29yZGluZyB0byB0aGUgY29tbWFuZCBsaW5lOyB0aGV5IGFsc28gbWF5CisgICBiZSBtYXJrZWQgX19pbml0ZGF0YSwgYnV0IHJlcXVpcmUgemVybyBpbml0aWFsaXplcnMgdGhlbiAqLworCitzdGF0aWMgaW50IHNldHVwX2NhbGxlZFtNQVhCT0FSRFNdOworc3RhdGljIGludCBzZXR1cF9idXNvbltNQVhCT0FSRFNdOworc3RhdGljIGludCBzZXR1cF9idXNvZmZbTUFYQk9BUkRTXTsKK3N0YXRpYyBpbnQgc2V0dXBfZG1hc3BlZWRbTUFYQk9BUkRTXSBfX2luaXRkYXRhID0geyAtMSwgLTEsIC0xLCAtMSB9OworCisvKgorICogTElMTy9Nb2R1bGUgcGFyYW1zOiAgYWhhMTU0Mj08UE9SVEJBU0U+Wyw8QlVTT04+LDxCVVNPRkY+Wyw8RE1BU1BFRUQ+XV0KKyAqCisgKiBXaGVyZTogIDxQT1JUQkFTRT4gaXMgYW55IG9mIHRoZSB2YWxpZCBBSEEgYWRkcmVzc2VzOgorICogICAgICAgICAgICAgICAgICAgICAgMHgxMzAsIDB4MTM0LCAweDIzMCwgMHgyMzQsIDB4MzMwLCAweDMzNAorICogICAgICAgICA8QlVTT04+ICBpcyB0aGUgdGltZSAoaW4gbWljcm9zZWNzKSB0aGF0IEFIQSBzcGVuZHMgb24gdGhlIEFULWJ1cworICogICAgICAgICAgICAgICAgICB3aGVuIHRyYW5zZmVycmluZyBkYXRhLiAgMTU0MkEgcG93ZXItb24gZGVmYXVsdCBpcyAxMXVzLAorICogICAgICAgICAgICAgICAgICB2YWxpZCB2YWx1ZXMgYXJlIGluIHJhbmdlOiAyLi4xNSAoZGVjaW1hbCkKKyAqICAgICAgICAgPEJVU09GRj4gaXMgdGhlIHRpbWUgdGhhdCBBSEEgc3BlbmRzIE9GRiBUSEUgQlVTIGFmdGVyIHdoaWxlCisgKiAgICAgICAgICAgICAgICAgIGl0IGlzIHRyYW5zZmVycmluZyBkYXRhIChub3QgdG8gbW9ub3BvbGl6ZSB0aGUgYnVzKS4KKyAqICAgICAgICAgICAgICAgICAgUG93ZXItb24gZGVmYXVsdCBpcyA0dXMsIHZhbGlkIHJhbmdlOiAxLi42NCBtaWNyb3NlY29uZHMuCisgKiAgICAgICAgIDxETUFTUEVFRD4gRGVmYXVsdCBpcyBqdW1wZXIgc2VsZWN0ZWQgKDE1NDJBOiBvbiB0aGUgSjEpLAorICogICAgICAgICAgICAgICAgICBidXQgZXhwZXJpbWVudGVyIGNhbiBhbHRlciBpdCB3aXRoIHRoaXMuCisgKiAgICAgICAgICAgICAgICAgIFZhbGlkIHZhbHVlczogNSwgNiwgNywgOCwgMTAgKE1CL3MpCisgKiAgICAgICAgICAgICAgICAgIEZhY3RvcnkgZGVmYXVsdCBpcyA1IE1CL3MuCisgKi8KKworI2lmIGRlZmluZWQoTU9EVUxFKQorc3RhdGljIGludCBpc2FwbnAgPSAwOworc3RhdGljIGludCBhaGExNTQyW10gPSB7MHgzMzAsIDExLCA0LCAtMX07Cittb2R1bGVfcGFyYW1fYXJyYXkoYWhhMTU0MiwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShpc2FwbnAsIGJvb2wsIDApOworCitzdGF0aWMgc3RydWN0IGlzYXBucF9kZXZpY2VfaWQgaWRfdGFibGVbXSBfX2luaXRkYXRhID0geworCXsKKwkJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignQScsICdEJywgJ1AnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MTU0MiksCisJCTAKKwl9LAorCXswfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpc2FwbnAsIGlkX3RhYmxlKTsKKworI2Vsc2UKK3N0YXRpYyBpbnQgaXNhcG5wID0gMTsKKyNlbmRpZgorCisjZGVmaW5lIEJJT1NfVFJBTlNMQVRJT05fMTYzMiAwCS8qIFVzZWQgYnkgc29tZSBvbGQgMTU0MkEgYm9hcmRzICovCisjZGVmaW5lIEJJT1NfVFJBTlNMQVRJT05fNjQzMiAxCS8qIERlZmF1bHQgY2FzZSB0aGVzZSBkYXlzICovCisjZGVmaW5lIEJJT1NfVFJBTlNMQVRJT05fMjU1NjMgMgkvKiBCaWcgZGlzayBjYXNlICovCisKK3N0cnVjdCBhaGExNTQyX2hvc3RkYXRhIHsKKwkvKiBUaGlzIHdpbGwgZWZmZWN0aXZlbHkgc3RhcnQgYm90aCBvZiB0aGVtIGF0IHRoZSBmaXJzdCBtYWlsYm94ICovCisJaW50IGJpb3NfdHJhbnNsYXRpb247CS8qIE1hcHBpbmcgYmlvcyB1c2VzIC0gZm9yIGNvbXBhdGliaWxpdHkgKi8KKwlpbnQgYWhhMTU0Ml9sYXN0X21iaV91c2VkOworCWludCBhaGExNTQyX2xhc3RfbWJvX3VzZWQ7CisJU2NzaV9DbW5kICpTQ2ludFtBSEExNTQyX01BSUxCT1hFU107CisJc3RydWN0IG1haWxib3ggbWJbMiAqIEFIQTE1NDJfTUFJTEJPWEVTXTsKKwlzdHJ1Y3QgY2NiIGNjYltBSEExNTQyX01BSUxCT1hFU107Cit9OworCisjZGVmaW5lIEhPU1REQVRBKGhvc3QpICgoc3RydWN0IGFoYTE1NDJfaG9zdGRhdGEgKikgJmhvc3QtPmhvc3RkYXRhKQorCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqYWhhX2hvc3RbN107CS8qIE9uZSBmb3IgZWFjaCBJUlEgbGV2ZWwgKDktMTUpICovCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWhhMTU0Ml9sb2NrKTsKKworCisKKyNkZWZpbmUgV0FJVG5leHR0aW1lb3V0IDMwMDAwMDAKKworc3RhdGljIHZvaWQgc2V0dXBfbWFpbGJveGVzKGludCBiYXNlX2lvLCBzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CitzdGF0aWMgaW50IGFoYTE1NDJfcmVzdGFydChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CitzdGF0aWMgdm9pZCBhaGExNTQyX2ludHJfaGFuZGxlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBkb19haGExNTQyX2ludHJfaGFuZGxlKGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisjZGVmaW5lIGFoYTE1NDJfaW50cl9yZXNldChiYXNlKSAgb3V0YihJUlNULCBDT05UUk9MKGJhc2UpKQorCisjZGVmaW5lIFdBSVQocG9ydCwgbWFzaywgYWxsb2YsIG5vbmVvZikJCQkJCVwKKyB7IHJlZ2lzdGVyIGludCBXQUlUYml0czsJCQkJCQlcCisgICByZWdpc3RlciBpbnQgV0FJVHRpbWVvdXQgPSBXQUlUbmV4dHRpbWVvdXQ7CQkJCVwKKyAgIHdoaWxlICgxKSB7CQkJCQkJCQlcCisgICAgIFdBSVRiaXRzID0gaW5iKHBvcnQpICYgKG1hc2spOwkJCQkJXAorICAgICBpZiAoKFdBSVRiaXRzICYgKGFsbG9mKSkgPT0gKGFsbG9mKSAmJiAoKFdBSVRiaXRzICYgKG5vbmVvZikpID09IDApKSBcCisgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKyAgICAgaWYgKC0tV0FJVHRpbWVvdXQgPT0gMCkgZ290byBmYWlsOwkJCQkJXAorICAgfQkJCQkJCQkJCVwKKyB9CisKKy8qIFNpbWlsYXIgdG8gV0FJVCwgZXhjZXB0IHdlIHVzZSB0aGUgdWRlbGF5IGNhbGwgdG8gcmVndWxhdGUgdGhlCisgICBhbW91bnQgb2YgdGltZSB3ZSB3YWl0LiAgKi8KKyNkZWZpbmUgV0FJVGQocG9ydCwgbWFzaywgYWxsb2YsIG5vbmVvZiwgdGltZW91dCkJCQlcCisgeyByZWdpc3RlciBpbnQgV0FJVGJpdHM7CQkJCQkJXAorICAgcmVnaXN0ZXIgaW50IFdBSVR0aW1lb3V0ID0gdGltZW91dDsJCQkJCVwKKyAgIHdoaWxlICgxKSB7CQkJCQkJCQlcCisgICAgIFdBSVRiaXRzID0gaW5iKHBvcnQpICYgKG1hc2spOwkJCQkJXAorICAgICBpZiAoKFdBSVRiaXRzICYgKGFsbG9mKSkgPT0gKGFsbG9mKSAmJiAoKFdBSVRiaXRzICYgKG5vbmVvZikpID09IDApKSBcCisgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKyAgICAgbWRlbGF5KDEpOwkJCQkJCQlcCisgICAgIGlmICgtLVdBSVR0aW1lb3V0ID09IDApIGdvdG8gZmFpbDsJCQkJCVwKKyAgIH0JCQkJCQkJCQlcCisgfQorCitzdGF0aWMgdm9pZCBhaGExNTQyX3N0YXQodm9pZCkKK3sKKy8qCWludCBzID0gaW5iKFNUQVRVUyksIGkgPSBpbmIoSU5UUkZMQUdTKTsKKwlwcmludGsoInN0YXR1cz0leCBpbnRyZmxhZ3M9JXhcbiIsIHMsIGksIFdBSVRuZXh0dGltZW91dC1XQUlUdGltZW91dCk7ICovCit9CisKKy8qIFRoaXMgaXMgYSBiaXQgY29tcGxpY2F0ZWQsIGJ1dCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGFuIGludGVycnVwdAorICAgcm91dGluZSBkb2VzIG5vdCBzZW5kIHNvbWV0aGluZyBvdXQgd2hpbGUgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgdGhpcy4KKyAgIEZvcnR1bmF0ZWx5LCBpdCBpcyBvbmx5IGF0IGJvb3QgdGltZSB0aGF0IG11bHRpLWJ5dGUgbWVzc2FnZXMKKyAgIGFyZSBldmVyIHNlbnQuICovCitzdGF0aWMgaW50IGFoYTE1NDJfb3V0KHVuc2lnbmVkIGludCBiYXNlLCB1bmNoYXIgKiBjbWRwLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWludCBnb3RfbG9jazsKKworCWlmIChsZW4gPT0gMSkgeworCQlnb3RfbG9jayA9IDA7CisJCXdoaWxlICgxID09IDEpIHsKKwkJCVdBSVQoU1RBVFVTKGJhc2UpLCBDREYsIDAsIENERik7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJCQlpZiAoaW5iKFNUQVRVUyhiYXNlKSkgJiBDREYpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhaGExNTQyX2xvY2ssIGZsYWdzKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW91dGIoKmNtZHAsIERBVEEoYmFzZSkpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhaGExNTQyX2xvY2ssIGZsYWdzKTsKKwkJZ290X2xvY2sgPSAxOworCQl3aGlsZSAobGVuLS0pIHsKKwkJCVdBSVQoU1RBVFVTKGJhc2UpLCBDREYsIDAsIENERik7CisJCQlvdXRiKCpjbWRwKyssIERBVEEoYmFzZSkpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFoYTE1NDJfbG9jaywgZmxhZ3MpOworCX0KKwlyZXR1cm4gMDsKK2ZhaWw6CisJaWYgKGdvdF9sb2NrKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhaGExNTQyX2xvY2ssIGZsYWdzKTsKKwlwcmludGsoS0VSTl9FUlIgImFoYTE1NDJfb3V0IGZhaWxlZCglZCk6ICIsIGxlbiArIDEpOworCWFoYTE1NDJfc3RhdCgpOworCXJldHVybiAxOworfQorCisvKiBPbmx5IHVzZWQgYXQgYm9vdCB0aW1lLCBzbyB3ZSBkbyBub3QgbmVlZCB0byB3b3JyeSBhYm91dCBsYXRlbmN5IGFzIG11Y2gKKyAgIGhlcmUgKi8KKworc3RhdGljIGludCBfX2luaXQgYWhhMTU0Ml9pbih1bnNpZ25lZCBpbnQgYmFzZSwgdW5jaGFyICogY21kcCwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFoYTE1NDJfbG9jaywgZmxhZ3MpOworCXdoaWxlIChsZW4tLSkgeworCQlXQUlUKFNUQVRVUyhiYXNlKSwgREYsIERGLCAwKTsKKwkJKmNtZHArKyA9IGluYihEQVRBKGJhc2UpKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7CitmYWlsOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFoYTE1NDJfbG9jaywgZmxhZ3MpOworCXByaW50ayhLRVJOX0VSUiAiYWhhMTU0Ml9pbiBmYWlsZWQoJWQpOiAiLCBsZW4gKyAxKTsKKwlhaGExNTQyX3N0YXQoKTsKKwlyZXR1cm4gMTsKK30KKworLyogU2ltaWxhciB0byBhaGExNTQyX2luLCBleGNlcHQgdGhhdCB3ZSB3YWl0IGEgdmVyeSBzaG9ydCBwZXJpb2Qgb2YgdGltZS4KKyAgIFdlIHVzZSB0aGlzIGlmIHdlIGtub3cgdGhlIGJvYXJkIGlzIGFsaXZlIGFuZCBhd2FrZSwgYnV0IHdlIGFyZSBub3Qgc3VyZQorICAgaWYgdGhlIGJvYXJkIHdpbGwgcmVzcG9uZCB0byB0aGUgY29tbWFuZCB3ZSBhcmUgYWJvdXQgdG8gc2VuZCBvciBub3QgKi8KK3N0YXRpYyBpbnQgX19pbml0IGFoYTE1NDJfaW4xKHVuc2lnbmVkIGludCBiYXNlLCB1bmNoYXIgKiBjbWRwLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJd2hpbGUgKGxlbi0tKSB7CisJCVdBSVRkKFNUQVRVUyhiYXNlKSwgREYsIERGLCAwLCAxMDApOworCQkqY21kcCsrID0gaW5iKERBVEEoYmFzZSkpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhaGExNTQyX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK2ZhaWw6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWFrZWNvZGUodW5zaWduZWQgaG9zdGVyciwgdW5zaWduZWQgc2NzaWVycikKK3sKKwlzd2l0Y2ggKGhvc3RlcnIpIHsKKwljYXNlIDB4MDoKKwljYXNlIDB4YToJCS8qIExpbmtlZCBjb21tYW5kIGNvbXBsZXRlIHdpdGhvdXQgZXJyb3IgYW5kIGxpbmtlZCBub3JtYWxseSAqLworCWNhc2UgMHhiOgkJLyogTGlua2VkIGNvbW1hbmQgY29tcGxldGUgd2l0aG91dCBlcnJvciwgaW50ZXJydXB0IGdlbmVyYXRlZCAqLworCQlob3N0ZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIDB4MTE6CQkvKiBTZWxlY3Rpb24gdGltZSBvdXQtVGhlIGluaXRpYXRvciBzZWxlY3Rpb24gb3IgdGFyZ2V0CisJCQkJICAgcmVzZWxlY3Rpb24gd2FzIG5vdCBjb21wbGV0ZSB3aXRoaW4gdGhlIFNDU0kgVGltZSBvdXQgcGVyaW9kICovCisJCWhvc3RlcnIgPSBESURfVElNRV9PVVQ7CisJCWJyZWFrOworCisJY2FzZSAweDEyOgkJLyogRGF0YSBvdmVycnVuL3VuZGVycnVuLVRoZSB0YXJnZXQgYXR0ZW1wdGVkIHRvIHRyYW5zZmVyIG1vcmUgZGF0YQorCQkJCSAgIHRoYW4gd2FzIGFsbG9jYXRlZCBieSB0aGUgRGF0YSBMZW5ndGggZmllbGQgb3IgdGhlIHN1bSBvZiB0aGUKKwkJCQkgICBTY2F0dGVyIC8gR2F0aGVyIERhdGEgTGVuZ3RoIGZpZWxkcy4gKi8KKworCWNhc2UgMHgxMzoJCS8qIFVuZXhwZWN0ZWQgYnVzIGZyZWUtVGhlIHRhcmdldCBkcm9wcGVkIHRoZSBTQ1NJIEJTWSBhdCBhbiB1bmV4cGVjdGVkIHRpbWUuICovCisKKwljYXNlIDB4MTU6CQkvKiBNQk8gY29tbWFuZCB3YXMgbm90IDAwLCAwMSBvciAwMi1UaGUgZmlyc3QgYnl0ZSBvZiB0aGUgQ0Igd2FzCisJCQkJICAgaW52YWxpZC4gVGhpcyB1c3VhbGx5IGluZGljYXRlcyBhIHNvZnR3YXJlIGZhaWx1cmUuICovCisKKwljYXNlIDB4MTY6CQkvKiBJbnZhbGlkIENDQiBPcGVyYXRpb24gQ29kZS1UaGUgZmlyc3QgYnl0ZSBvZiB0aGUgQ0NCIHdhcyBpbnZhbGlkLgorCQkJCSAgIFRoaXMgdXN1YWxseSBpbmRpY2F0ZXMgYSBzb2Z0d2FyZSBmYWlsdXJlLiAqLworCisJY2FzZSAweDE3OgkJLyogTGlua2VkIENDQiBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIExVTi1BIHN1YnNlcXVlbnQgQ0NCIG9mIGEgc2V0CisJCQkJICAgb2YgbGlua2VkIENDQidzIGRvZXMgbm90IHNwZWNpZnkgdGhlIHNhbWUgbG9naWNhbCB1bml0IG51bWJlciBhcworCQkJCSAgIHRoZSBmaXJzdC4gKi8KKwljYXNlIDB4MTg6CQkvKiBJbnZhbGlkIFRhcmdldCBEaXJlY3Rpb24gcmVjZWl2ZWQgZnJvbSBIb3N0LVRoZSBkaXJlY3Rpb24gb2YgYQorCQkJCSAgIFRhcmdldCBNb2RlIENDQiB3YXMgaW52YWxpZC4gKi8KKworCWNhc2UgMHgxOToJCS8qIER1cGxpY2F0ZSBDQ0IgUmVjZWl2ZWQgaW4gVGFyZ2V0IE1vZGUtTW9yZSB0aGFuIG9uY2UgQ0NCIHdhcworCQkJCSAgIHJlY2VpdmVkIHRvIHNlcnZpY2UgZGF0YSB0cmFuc2ZlciBiZXR3ZWVuIHRoZSBzYW1lIHRhcmdldCBMVU4KKwkJCQkgICBhbmQgaW5pdGlhdG9yIFNDU0kgSUQgaW4gdGhlIHNhbWUgZGlyZWN0aW9uLiAqLworCisJY2FzZSAweDFhOgkJLyogSW52YWxpZCBDQ0Igb3IgU2VnbWVudCBMaXN0IFBhcmFtZXRlci1BIHNlZ21lbnQgbGlzdCB3aXRoIGEgemVybworCQkJCSAgIGxlbmd0aCBzZWdtZW50IG9yIGludmFsaWQgc2VnbWVudCBsaXN0IGJvdW5kYXJpZXMgd2FzIHJlY2VpdmVkLgorCQkJCSAgIEEgQ0NCIHBhcmFtZXRlciB3YXMgaW52YWxpZC4gKi8KKwkJREVCKHByaW50aygiQWhhMTU0MjogJXggJXhcbiIsIGhvc3RlcnIsIHNjc2llcnIpKTsKKwkJaG9zdGVyciA9IERJRF9FUlJPUjsJLyogQ291bGRuJ3QgZmluZCBhbnkgYmV0dGVyICovCisJCWJyZWFrOworCisJY2FzZSAweDE0OgkJLyogVGFyZ2V0IGJ1cyBwaGFzZSBzZXF1ZW5jZSBmYWlsdXJlLUFuIGludmFsaWQgYnVzIHBoYXNlIG9yIGJ1cworCQkJCSAgIHBoYXNlIHNlcXVlbmNlIHdhcyByZXF1ZXN0ZWQgYnkgdGhlIHRhcmdldC4gVGhlIGhvc3QgYWRhcHRlcgorCQkJCSAgIHdpbGwgZ2VuZXJhdGUgYSBTQ1NJIFJlc2V0IENvbmRpdGlvbiwgbm90aWZ5aW5nIHRoZSBob3N0IHdpdGgKKwkJCQkgICBhIFNDUkQgaW50ZXJydXB0ICovCisJCWhvc3RlcnIgPSBESURfUkVTRVQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiYWhhMTU0MjogbWFrZWNvZGU6IHVua25vd24gaG9zdHN0YXR1cyAleFxuIiwgaG9zdGVycik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc2NzaWVyciB8IChob3N0ZXJyIDw8IDE2KTsKK30KKworc3RhdGljIGludCBfX2luaXQgYWhhMTU0Ml90ZXN0X3BvcnQoaW50IGJzZSwgc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJdW5jaGFyIGlucXVpcnlfY21kW10gPSB7Q01EX0lOUVVJUll9OworCXVuY2hhciBpbnF1aXJ5X3Jlc3VsdFs0XTsKKwl1bmNoYXIgKmNtZHA7CisJaW50IGxlbjsKKwl2b2xhdGlsZSBpbnQgZGVidWcgPSAwOworCisJLyogUXVpY2sgYW5kIGRpcnR5IHRlc3QgZm9yIHByZXNlbmNlIG9mIHRoZSBjYXJkLiAqLworCWlmIChpbmIoU1RBVFVTKGJzZSkpID09IDB4ZmYpCisJCXJldHVybiAwOworCisJLyogUmVzZXQgdGhlIGFkYXB0ZXIuIEkgb3VnaHQgdG8gbWFrZSBhIGhhcmQgcmVzZXQsIGJ1dCBpdCdzIG5vdCByZWFsbHkgbmVjZXNzYXJ5ICovCisKKwkvKiAgREVCKHByaW50aygiYWhhMTU0Ml90ZXN0X3BvcnQgY2FsbGVkIFxuIikpOyAqLworCisJLyogSW4gY2FzZSBzb21lIG90aGVyIGNhcmQgd2FzIHByb2JpbmcgaGVyZSwgcmVzZXQgaW50ZXJydXB0cyAqLworCWFoYTE1NDJfaW50cl9yZXNldChic2UpOwkvKiByZXNldCBpbnRlcnJ1cHRzLCBzbyB0aGV5IGRvbid0IGJsb2NrICovCisKKwlvdXRiKFNSU1QgfCBJUlNUIC8qfFNDUlNUICovICwgQ09OVFJPTChic2UpKTsKKworCW1kZWxheSgyMCk7CQkvKiBXYWl0IGEgbGl0dGxlIGJpdCBmb3IgdGhpbmdzIHRvIHNldHRsZSBkb3duLiAqLworCisJZGVidWcgPSAxOworCS8qIEV4cGVjdCBJTklUIGFuZCBJRExFLCBhbnkgb2YgdGhlIG90aGVycyBhcmUgYmFkICovCisJV0FJVChTVEFUVVMoYnNlKSwgU1RBVE1BU0ssIElOSVQgfCBJRExFLCBTVFNUIHwgRElBR0YgfCBJTlZEQ01EIHwgREYgfCBDREYpOworCisJZGVidWcgPSAyOworCS8qIFNob3VsZG4ndCBoYXZlIGdlbmVyYXRlZCBhbnkgaW50ZXJydXB0cyBkdXJpbmcgcmVzZXQgKi8KKwlpZiAoaW5iKElOVFJGTEFHUyhic2UpKSAmIElOVFJNQVNLKQorCQlnb3RvIGZhaWw7CisKKworCS8qIFBlcmZvcm0gYSBob3N0IGFkYXB0ZXIgaW5xdWlyeSBpbnN0ZWFkIHNvIHdlIGRvIG5vdCBuZWVkIHRvIHNldAorCSAgIHVwIHRoZSBtYWlsYm94ZXMgYWhlYWQgb2YgdGltZSAqLworCisJYWhhMTU0Ml9vdXQoYnNlLCBpbnF1aXJ5X2NtZCwgMSk7CisKKwlkZWJ1ZyA9IDM7CisJbGVuID0gNDsKKwljbWRwID0gJmlucXVpcnlfcmVzdWx0WzBdOworCisJd2hpbGUgKGxlbi0tKSB7CisJCVdBSVQoU1RBVFVTKGJzZSksIERGLCBERiwgMCk7CisJCSpjbWRwKysgPSBpbmIoREFUQShic2UpKTsKKwl9CisKKwlkZWJ1ZyA9IDg7CisJLyogUmVhZGluZyBwb3J0IHNob3VsZCByZXNldCBERiAqLworCWlmIChpbmIoU1RBVFVTKGJzZSkpICYgREYpCisJCWdvdG8gZmFpbDsKKworCWRlYnVnID0gOTsKKwkvKiBXaGVuIEhBQ0MsIGNvbW1hbmQgaXMgY29tcGxldGVkLCBhbmQgd2UncmUgdGhvdWdoIHRlc3RpbmcgKi8KKwlXQUlUKElOVFJGTEFHUyhic2UpLCBIQUNDLCBIQUNDLCAwKTsKKwkvKiBub3cgaW5pdGlhbGl6ZSBhZGFwdGVyICovCisKKwlkZWJ1ZyA9IDEwOworCS8qIENsZWFyIGludGVycnVwdHMgKi8KKwlvdXRiKElSU1QsIENPTlRST0woYnNlKSk7CisKKwlkZWJ1ZyA9IDExOworCisJcmV0dXJuIGRlYnVnOwkJLyogMSA9IG9rICovCitmYWlsOgorCXJldHVybiAwOwkJLyogMCA9IG5vdCBvayAqLworfQorCisvKiBBIHF1aWNrIHdyYXBwZXIgZm9yIGRvX2FoYTE1NDJfaW50cl9oYW5kbGUgdG8gZ3JhYiB0aGUgc3BpbiBsb2NrICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZG9fYWhhMTU0Ml9pbnRyX2hhbmRsZShpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisKKwlzaG9zdCA9IGFoYV9ob3N0W2lycSAtIDldOworCWlmICghc2hvc3QpCisJCXBhbmljKCJTcGx1bmdlISIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWFoYTE1NDJfaW50cl9oYW5kbGUoc2hvc3QsIGRldl9pZCwgcmVncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBBICJoaWdoIiBsZXZlbCBpbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIHZvaWQgYWhhMTU0Ml9pbnRyX2hhbmRsZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl2b2lkICgqbXlfZG9uZSkgKFNjc2lfQ21uZCAqKSA9IE5VTEw7CisJaW50IGVycnN0YXR1cywgbWJpLCBtYm8sIG1iaXN0YXR1czsKKwlpbnQgbnVtYmVyX3NlcnZpY2VkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJU2NzaV9DbW5kICpTQ3RtcDsKKwlpbnQgZmxhZzsKKwlpbnQgbmVlZHNfcmVzdGFydDsKKwlzdHJ1Y3QgbWFpbGJveCAqbWI7CisJc3RydWN0IGNjYiAqY2NiOworCisJbWIgPSBIT1NUREFUQShzaG9zdCktPm1iOworCWNjYiA9IEhPU1REQVRBKHNob3N0KS0+Y2NiOworCisjaWZkZWYgREVCVUcKKwl7CisJCWZsYWcgPSBpbmIoSU5UUkZMQUdTKHNob3N0LT5pb19wb3J0KSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJhaGExNTQyX2ludHJfaGFuZGxlOiAiKTsKKwkJaWYgKCEoZmxhZyAmIEFOWUlOVFIpKQorCQkJcHJpbnRrKCJubyBpbnRlcnJ1cHQ/Iik7CisJCWlmIChmbGFnICYgTUJJRikKKwkJCXByaW50aygiTUJJRiAiKTsKKwkJaWYgKGZsYWcgJiBNQk9BKQorCQkJcHJpbnRrKCJNQk9GICIpOworCQlpZiAoZmxhZyAmIEhBQ0MpCisJCQlwcmludGsoIkhBQ0MgIik7CisJCWlmIChmbGFnICYgU0NSRCkKKwkJCXByaW50aygiU0NSRCAiKTsKKwkJcHJpbnRrKCJzdGF0dXMgJTAyeFxuIiwgaW5iKFNUQVRVUyhzaG9zdC0+aW9fcG9ydCkpKTsKKwl9OworI2VuZGlmCisJbnVtYmVyX3NlcnZpY2VkID0gMDsKKwluZWVkc19yZXN0YXJ0ID0gMDsKKworCXdoaWxlICgxID09IDEpIHsKKwkJZmxhZyA9IGluYihJTlRSRkxBR1Moc2hvc3QtPmlvX3BvcnQpKTsKKworCQkvKiBDaGVjayBmb3IgdW51c3VhbCBpbnRlcnJ1cHRzLiAgSWYgYW55IG9mIHRoZXNlIGhhcHBlbiwgd2Ugc2hvdWxkCisJCSAgIHByb2JhYmx5IGRvIHNvbWV0aGluZyBzcGVjaWFsLCBidXQgZm9yIG5vdyBqdXN0IHByaW50aW5nIGEgbWVzc2FnZQorCQkgICBpcyBzdWZmaWNpZW50LiAgQSBTQ1NJIHJlc2V0IGRldGVjdGVkIGlzIHNvbWV0aGluZyB0aGF0IHdlIHJlYWxseQorCQkgICBuZWVkIHRvIGRlYWwgd2l0aCBpbiBzb21lIHdheS4gKi8KKwkJaWYgKGZsYWcgJiB+TUJJRikgeworCQkJaWYgKGZsYWcgJiBNQk9BKQorCQkJCXByaW50aygiTUJPRiAiKTsKKwkJCWlmIChmbGFnICYgSEFDQykKKwkJCQlwcmludGsoIkhBQ0MgIik7CisJCQlpZiAoZmxhZyAmIFNDUkQpIHsKKwkJCQluZWVkc19yZXN0YXJ0ID0gMTsKKwkJCQlwcmludGsoIlNDUkQgIik7CisJCQl9CisJCX0KKwkJYWhhMTU0Ml9pbnRyX3Jlc2V0KHNob3N0LT5pb19wb3J0KTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJCW1iaSA9IEhPU1REQVRBKHNob3N0KS0+YWhhMTU0Ml9sYXN0X21iaV91c2VkICsgMTsKKwkJaWYgKG1iaSA+PSAyICogQUhBMTU0Ml9NQUlMQk9YRVMpCisJCQltYmkgPSBBSEExNTQyX01BSUxCT1hFUzsKKworCQlkbyB7CisJCQlpZiAobWJbbWJpXS5zdGF0dXMgIT0gMCkKKwkJCQlicmVhazsKKwkJCW1iaSsrOworCQkJaWYgKG1iaSA+PSAyICogQUhBMTU0Ml9NQUlMQk9YRVMpCisJCQkJbWJpID0gQUhBMTU0Ml9NQUlMQk9YRVM7CisJCX0gd2hpbGUgKG1iaSAhPSBIT1NUREFUQShzaG9zdCktPmFoYTE1NDJfbGFzdF9tYmlfdXNlZCk7CisKKwkJaWYgKG1iW21iaV0uc3RhdHVzID09IDApIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFoYTE1NDJfbG9jaywgZmxhZ3MpOworCQkJLyogSG1tLCBubyBtYWlsLiAgTXVzdCBoYXZlIHJlYWQgaXQgdGhlIGxhc3QgdGltZSBhcm91bmQgKi8KKwkJCWlmICghbnVtYmVyX3NlcnZpY2VkICYmICFuZWVkc19yZXN0YXJ0KQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFoYTE1NDIuYzogaW50ZXJydXB0IHJlY2VpdmVkLCBidXQgbm8gbWFpbC5cbiIpOworCQkJLyogV2UgZGV0ZWN0ZWQgYSByZXNldC4gIFJlc3RhcnQgYWxsIHBlbmRpbmcgY29tbWFuZHMgZm9yCisJCQkgICBkZXZpY2VzIHRoYXQgdXNlIHRoZSBoYXJkIHJlc2V0IG9wdGlvbiAqLworCQkJaWYgKG5lZWRzX3Jlc3RhcnQpCisJCQkJYWhhMTU0Ml9yZXN0YXJ0KHNob3N0KTsKKwkJCXJldHVybjsKKwkJfTsKKworCQltYm8gPSAoc2NzaTJpbnQobWJbbWJpXS5jY2JwdHIpIC0gKFNDU0lfQlVGX1BBKCZjY2JbMF0pKSkgLyBzaXplb2Yoc3RydWN0IGNjYik7CisJCW1iaXN0YXR1cyA9IG1iW21iaV0uc3RhdHVzOworCQltYlttYmldLnN0YXR1cyA9IDA7CisJCUhPU1REQVRBKHNob3N0KS0+YWhhMTU0Ml9sYXN0X21iaV91c2VkID0gbWJpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhaGExNTQyX2xvY2ssIGZsYWdzKTsKKworI2lmZGVmIERFQlVHCisJCXsKKwkJCWlmIChjY2JbbWJvXS50YXJzdGF0IHwgY2NiW21ib10uaGFzdGF0KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJhaGExNTQyX2NvbW1hbmQ6IHJldHVybmluZyAleCAoc3RhdHVzICVkKVxuIiwKKwkJCQkgICAgICAgY2NiW21ib10udGFyc3RhdCArICgoaW50KSBjY2JbbWJvXS5oYXN0YXQgPDwgMTYpLCBtYlttYmldLnN0YXR1cyk7CisJCX07CisjZW5kaWYKKworCQlpZiAobWJpc3RhdHVzID09IDMpCisJCQljb250aW51ZTsJLyogQWJvcnRlZCBjb21tYW5kIG5vdCBmb3VuZCAqLworCisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKEtFUk5fREVCVUcgIi4uLmRvbmUgJWQgJWRcbiIsIG1ibywgbWJpKTsKKyNlbmRpZgorCisJCVNDdG1wID0gSE9TVERBVEEoc2hvc3QpLT5TQ2ludFttYm9dOworCisJCWlmICghU0N0bXAgfHwgIVNDdG1wLT5zY3NpX2RvbmUpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFoYTE1NDJfaW50cl9oYW5kbGU6IFVuZXhwZWN0ZWQgaW50ZXJydXB0XG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInRhcnN0YXQ9JXgsIGhhc3RhdD0leCBpZGx1bj0leCBjY2IjPSVkIFxuIiwgY2NiW21ib10udGFyc3RhdCwKKwkJCSAgICAgICBjY2JbbWJvXS5oYXN0YXQsIGNjYlttYm9dLmlkbHVuLCBtYm8pOworCQkJcmV0dXJuOworCQl9CisJCW15X2RvbmUgPSBTQ3RtcC0+c2NzaV9kb25lOworCQlpZiAoU0N0bXAtPmhvc3Rfc2NyaWJibGUpIHsKKwkJCWtmcmVlKFNDdG1wLT5ob3N0X3NjcmliYmxlKTsKKwkJCVNDdG1wLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwkJfQorCQkvKiBGZXRjaCB0aGUgc2Vuc2UgZGF0YSwgYW5kIHR1Y2sgaXQgYXdheSwgaW4gdGhlIHJlcXVpcmVkIHNsb3QuICBUaGUKKwkJICAgQWRhcHRlYyBhdXRvbWF0aWNhbGx5IGZldGNoZXMgaXQsIGFuZCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdAorCQkgICB3ZSB3aWxsIHN0aWxsIGhhdmUgaXQgaW4gdGhlIGNkYiB3aGVuIHdlIGNvbWUgYmFjayAqLworCQlpZiAoY2NiW21ib10udGFyc3RhdCA9PSAyKQorCQkJbWVtY3B5KFNDdG1wLT5zZW5zZV9idWZmZXIsICZjY2JbbWJvXS5jZGJbY2NiW21ib10uY2RibGVuXSwKKwkJCSAgICAgICBzaXplb2YoU0N0bXAtPnNlbnNlX2J1ZmZlcikpOworCisKKwkJLyogaXMgdGhlcmUgbWFpbCA6LSkgKi8KKworCQkvKiBtb3JlIGVycm9yIGNoZWNraW5nIGxlZnQgb3V0IGhlcmUgKi8KKwkJaWYgKG1iaXN0YXR1cyAhPSAxKQorCQkJLyogVGhpcyBpcyBzdXJlbHkgd3JvbmcsIGJ1dCBJIGRvbid0IGtub3cgd2hhdCdzIHJpZ2h0ICovCisJCQllcnJzdGF0dXMgPSBtYWtlY29kZShjY2JbbWJvXS5oYXN0YXQsIGNjYlttYm9dLnRhcnN0YXQpOworCQllbHNlCisJCQllcnJzdGF0dXMgPSAwOworCisjaWZkZWYgREVCVUcKKwkJaWYgKGVycnN0YXR1cykKKwkJCXByaW50ayhLRVJOX0RFQlVHICIoYWhhMTU0MiBlcnJvcjoleCAleCAleCkgIiwgZXJyc3RhdHVzLAorCQkJICAgICAgIGNjYlttYm9dLmhhc3RhdCwgY2NiW21ib10udGFyc3RhdCk7CisjZW5kaWYKKworCQlpZiAoY2NiW21ib10udGFyc3RhdCA9PSAyKSB7CisjaWZkZWYgREVCVUcKKwkJCWludCBpOworI2VuZGlmCisJCQlERUIocHJpbnRrKCJhaGExNTQyX2ludHJfaGFuZGxlOiBzZW5zZToiKSk7CisjaWZkZWYgREVCVUcKKwkJCWZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKQorCQkJCXByaW50aygiJTAyeCAiLCBjY2JbbWJvXS5jZGJbY2NiW21ib10uY2RibGVuICsgaV0pOworCQkJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJCQkvKgorCQkJICAgREVCKHByaW50aygiYWhhMTU0Ml9pbnRyX2hhbmRsZTogYnVmOiIpKTsKKwkJCSAgIGZvciAoaSA9IDA7IGkgPCBidWZmbGVuOyBpKyspCisJCQkgICBwcmludGsoIiUwMnggIiwgKCh1bmNoYXIgKilidWZmKVtpXSk7CisJCQkgICBwcmludGsoIlxuIik7CisJCQkgKi8KKwkJfQorCQlERUIoaWYgKGVycnN0YXR1cykgcHJpbnRrKCJhaGExNTQyX2ludHJfaGFuZGxlOiByZXR1cm5pbmcgJTZ4XG4iLCBlcnJzdGF0dXMpKTsKKwkJU0N0bXAtPnJlc3VsdCA9IGVycnN0YXR1czsKKwkJSE9TVERBVEEoc2hvc3QpLT5TQ2ludFttYm9dID0gTlVMTDsJLyogVGhpcyBlZmZlY3RpdmVseSBmcmVlcyB1cCB0aGUgbWFpbGJveCBzbG90LCBhcworCQkJCQkJCSAgIGZhciBhcyBxdWV1ZWNvbW1hbmQgaXMgY29uY2VybmVkICovCisJCW15X2RvbmUoU0N0bXApOworCQludW1iZXJfc2VydmljZWQrKzsKKwl9OworfQorCitzdGF0aWMgaW50IGFoYTE1NDJfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqIFNDcG50LCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSkKK3sKKwl1bmNoYXIgYWhhY21kID0gQ01EX1NUQVJUX1NDU0k7CisJdW5jaGFyIGRpcmVjdGlvbjsKKwl1bmNoYXIgKmNtZCA9ICh1bmNoYXIgKikgU0NwbnQtPmNtbmQ7CisJdW5jaGFyIHRhcmdldCA9IFNDcG50LT5kZXZpY2UtPmlkOworCXVuY2hhciBsdW4gPSBTQ3BudC0+ZGV2aWNlLT5sdW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkICpidWZmID0gU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCWludCBidWZmbGVuID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKwlpbnQgbWJvOworCXN0cnVjdCBtYWlsYm94ICptYjsKKwlzdHJ1Y3QgY2NiICpjY2I7CisKKwlERUIoaW50IGkpOworCisJbWIgPSBIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KS0+bWI7CisJY2NiID0gSE9TVERBVEEoU0NwbnQtPmRldmljZS0+aG9zdCktPmNjYjsKKworCURFQihpZiAodGFyZ2V0ID4gMSkgeworCSAgICBTQ3BudC0+cmVzdWx0ID0gRElEX1RJTUVfT1VUIDw8IDE2OworCSAgICBkb25lKFNDcG50KTsgcmV0dXJuIDA7CisJICAgIH0KKwkpOworCisJaWYgKCpjbWQgPT0gUkVRVUVTVF9TRU5TRSkgeworCQkvKiBEb24ndCBkbyB0aGUgY29tbWFuZCAtIHdlIGhhdmUgdGhlIHNlbnNlIGRhdGEgYWxyZWFkeSAqLworI2lmIDAKKwkJLyogc2NzaV9yZXF1ZXN0X3NlbnNlKCkgcHJvdmlkZXMgYSBidWZmZXIgb2Ygc2l6ZSAyNTYsCisJCSAgIHNvIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBleHBlY3QgZXF1YWxpdHkgKi8KKwkJaWYgKGJ1ZmZsZW4gIT0gc2l6ZW9mKFNDcG50LT5zZW5zZV9idWZmZXIpKQorCQkJcHJpbnRrKEtFUk5fQ1JJVCAiYWhhMTU0MjogV3JvbmcgYnVmZmVyIGxlbmd0aCBzdXBwbGllZCAiCisJCQkgICAgICAgImZvciByZXF1ZXN0IHNlbnNlICglZClcbiIsIGJ1ZmZsZW4pOworI2VuZGlmCisJCVNDcG50LT5yZXN1bHQgPSAwOworCQlkb25lKFNDcG50KTsKKwkJcmV0dXJuIDA7CisJfQorI2lmZGVmIERFQlVHCisJaWYgKCpjbWQgPT0gUkVBRF8xMCB8fCAqY21kID09IFdSSVRFXzEwKQorCQlpID0geHNjc2kyaW50KGNtZCArIDIpOworCWVsc2UgaWYgKCpjbWQgPT0gUkVBRF82IHx8ICpjbWQgPT0gV1JJVEVfNikKKwkJaSA9IHNjc2kyaW50KGNtZCArIDIpOworCWVsc2UKKwkJaSA9IC0xOworCWlmIChkb25lKQorCQlwcmludGsoS0VSTl9ERUJVRyAiYWhhMTU0Ml9xdWV1ZWNvbW1hbmQ6IGRldiAlZCBjbWQgJTAyeCBwb3MgJWQgbGVuICVkICIsIHRhcmdldCwgKmNtZCwgaSwgYnVmZmxlbik7CisJZWxzZQorCQlwcmludGsoS0VSTl9ERUJVRyAiYWhhMTU0Ml9jb21tYW5kOiBkZXYgJWQgY21kICUwMnggcG9zICVkIGxlbiAlZCAiLCB0YXJnZXQsICpjbWQsIGksIGJ1ZmZsZW4pOworCWFoYTE1NDJfc3RhdCgpOworCXByaW50ayhLRVJOX0RFQlVHICJhaGExNTQyX3F1ZXVlY29tbWFuZDogZHVtcGluZyBzY3NpIGNtZDoiKTsKKwlmb3IgKGkgPSAwOyBpIDwgU0NwbnQtPmNtZF9sZW47IGkrKykKKwkJcHJpbnRrKCIlMDJ4ICIsIGNtZFtpXSk7CisJcHJpbnRrKCJcbiIpOworCWlmICgqY21kID09IFdSSVRFXzEwIHx8ICpjbWQgPT0gV1JJVEVfNikKKwkJcmV0dXJuIDA7CS8qIHdlIGFyZSBzdGlsbCB0ZXN0aW5nLCBzbyAqZG9uJ3QqIHdyaXRlICovCisjZW5kaWYKKwkvKiBVc2UgdGhlIG91dGdvaW5nIG1haWxib3hlcyBpbiBhIHJvdW5kLXJvYmluIGZhc2hpb24sIGJlY2F1c2UgdGhpcworCSAgIGlzIGhvdyB0aGUgaG9zdCBhZGFwdGVyIHdpbGwgc2NhbiBmb3IgdGhlbSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFoYTE1NDJfbG9jaywgZmxhZ3MpOworCW1ibyA9IEhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5haGExNTQyX2xhc3RfbWJvX3VzZWQgKyAxOworCWlmIChtYm8gPj0gQUhBMTU0Ml9NQUlMQk9YRVMpCisJCW1ibyA9IDA7CisKKwlkbyB7CisJCWlmIChtYlttYm9dLnN0YXR1cyA9PSAwICYmIEhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5TQ2ludFttYm9dID09IE5VTEwpCisJCQlicmVhazsKKwkJbWJvKys7CisJCWlmIChtYm8gPj0gQUhBMTU0Ml9NQUlMQk9YRVMpCisJCQltYm8gPSAwOworCX0gd2hpbGUgKG1ibyAhPSBIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KS0+YWhhMTU0Ml9sYXN0X21ib191c2VkKTsKKworCWlmIChtYlttYm9dLnN0YXR1cyB8fCBIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KS0+U0NpbnRbbWJvXSkKKwkJcGFuaWMoIlVuYWJsZSB0byBmaW5kIGVtcHR5IG1haWxib3ggZm9yIGFoYTE1NDIuXG4iKTsKKworCUhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5TQ2ludFttYm9dID0gU0NwbnQ7CS8qIFRoaXMgd2lsbCBlZmZlY3RpdmVseSBwcmV2ZW50IHNvbWVvbmUgZWxzZSBmcm9tCisJCQkJCQkJICAgc2NyZXdpbmcgd2l0aCB0aGlzIGNkYi4gKi8KKworCUhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5haGExNTQyX2xhc3RfbWJvX3VzZWQgPSBtYm87CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJTZW5kaW5nIGNvbW1hbmQgKCVkICV4KS4uLiIsIG1ibywgZG9uZSk7CisjZW5kaWYKKworCWFueTJzY3NpKG1iW21ib10uY2NicHRyLCBTQ1NJX0JVRl9QQSgmY2NiW21ib10pKTsJLyogVGhpcyBnZXRzIHRyYXNoZWQgZm9yIHNvbWUgcmVhc29uICovCisKKwltZW1zZXQoJmNjYlttYm9dLCAwLCBzaXplb2Yoc3RydWN0IGNjYikpOworCisJY2NiW21ib10uY2RibGVuID0gU0NwbnQtPmNtZF9sZW47CisKKwlkaXJlY3Rpb24gPSAwOworCWlmICgqY21kID09IFJFQURfMTAgfHwgKmNtZCA9PSBSRUFEXzYpCisJCWRpcmVjdGlvbiA9IDg7CisJZWxzZSBpZiAoKmNtZCA9PSBXUklURV8xMCB8fCAqY21kID09IFdSSVRFXzYpCisJCWRpcmVjdGlvbiA9IDE2OworCisJbWVtY3B5KGNjYlttYm9dLmNkYiwgY21kLCBjY2JbbWJvXS5jZGJsZW4pOworCisJaWYgKFNDcG50LT51c2Vfc2cpIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ3BudDsKKwkJc3RydWN0IGNoYWluICpjcHRyOworI2lmZGVmIERFQlVHCisJCXVuc2lnbmVkIGNoYXIgKnB0cjsKKyNlbmRpZgorCQlpbnQgaTsKKwkJY2NiW21ib10ub3AgPSAyOwkvKiBTQ1NJIEluaXRpYXRvciBDb21tYW5kICB3L3NjYXR0ZXItZ2F0aGVyICovCisJCVNDcG50LT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikga21hbGxvYyg1MTIsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwkJc2dwbnQgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwkJY3B0ciA9IChzdHJ1Y3QgY2hhaW4gKikgU0NwbnQtPmhvc3Rfc2NyaWJibGU7CisJCWlmIChjcHRyID09IE5VTEwpIHsKKwkJCS8qIGZyZWUgdGhlIGNsYWltZWQgbWFpbGJveCBzbG90ICovCisJCQlIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KS0+U0NpbnRbbWJvXSA9IE5VTEw7CisJCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgU0NwbnQtPnVzZV9zZzsgaSsrKSB7CisJCQlpZiAoc2dwbnRbaV0ubGVuZ3RoID09IDAgfHwgU0NwbnQtPnVzZV9zZyA+IDE2IHx8CisJCQkgICAgKCgoaW50KSBzZ3BudFtpXS5vZmZzZXQpICYgMSkgfHwgKHNncG50W2ldLmxlbmd0aCAmIDEpKSB7CisJCQkJdW5zaWduZWQgY2hhciAqcHRyOworCQkJCXByaW50ayhLRVJOX0NSSVQgIkJhZCBzZWdtZW50IGxpc3Qgc3VwcGxpZWQgdG8gYWhhMTU0Mi5jICglZCwgJWQpXG4iLCBTQ3BudC0+dXNlX3NnLCBpKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgU0NwbnQtPnVzZV9zZzsgaSsrKSB7CisJCQkJCXByaW50ayhLRVJOX0NSSVQgIiVkOiAlcCAlZFxuIiwgaSwKKwkJCQkJICAgICAgIChwYWdlX2FkZHJlc3Moc2dwbnRbaV0ucGFnZSkgKworCQkJCQkJc2dwbnRbaV0ub2Zmc2V0KSwKKwkJCQkJICAgICAgIHNncG50W2ldLmxlbmd0aCk7CisJCQkJfTsKKwkJCQlwcmludGsoS0VSTl9DUklUICJjcHRyICV4OiAiLCAodW5zaWduZWQgaW50KSBjcHRyKTsKKwkJCQlwdHIgPSAodW5zaWduZWQgY2hhciAqKSAmY3B0cltpXTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgMTg7IGkrKykKKwkJCQkJcHJpbnRrKCIlMDJ4ICIsIHB0cltpXSk7CisJCQkJcGFuaWMoIkZvb29vb29vb29kIGZpZ2h0ISIpOworCQkJfTsKKwkJCWFueTJzY3NpKGNwdHJbaV0uZGF0YXB0ciwgU0NTSV9TR19QQSgmc2dwbnRbaV0pKTsKKwkJCWlmIChTQ1NJX1NHX1BBKCZzZ3BudFtpXSkgKyBzZ3BudFtpXS5sZW5ndGggLSAxID4gSVNBX0RNQV9USFJFU0hPTEQpCisJCQkJQkFEX1NHX0RNQShTQ3BudCwgc2dwbnQsIFNDcG50LT51c2Vfc2csIGkpOworCQkJYW55MnNjc2koY3B0cltpXS5kYXRhbGVuLCBzZ3BudFtpXS5sZW5ndGgpOworCQl9OworCQlhbnkyc2NzaShjY2JbbWJvXS5kYXRhbGVuLCBTQ3BudC0+dXNlX3NnICogc2l6ZW9mKHN0cnVjdCBjaGFpbikpOworCQlhbnkyc2NzaShjY2JbbWJvXS5kYXRhcHRyLCBTQ1NJX0JVRl9QQShjcHRyKSk7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJjcHRyICV4OiAiLCBjcHRyKTsKKwkJcHRyID0gKHVuc2lnbmVkIGNoYXIgKikgY3B0cjsKKwkJZm9yIChpID0gMDsgaSA8IDE4OyBpKyspCisJCQlwcmludGsoIiUwMnggIiwgcHRyW2ldKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWNjYlttYm9dLm9wID0gMDsJLyogU0NTSSBJbml0aWF0b3IgQ29tbWFuZCAqLworCQlTQ3BudC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJCWFueTJzY3NpKGNjYlttYm9dLmRhdGFsZW4sIGJ1ZmZsZW4pOworCQlpZiAoYnVmZiAmJiBTQ1NJX0JVRl9QQShidWZmICsgYnVmZmxlbiAtIDEpID4gSVNBX0RNQV9USFJFU0hPTEQpCisJCQlCQURfRE1BKGJ1ZmYsIGJ1ZmZsZW4pOworCQlhbnkyc2NzaShjY2JbbWJvXS5kYXRhcHRyLCBTQ1NJX0JVRl9QQShidWZmKSk7CisJfTsKKwljY2JbbWJvXS5pZGx1biA9ICh0YXJnZXQgJiA3KSA8PCA1IHwgZGlyZWN0aW9uIHwgKGx1biAmIDcpOwkvKlNDU0kgVGFyZ2V0IElkICovCisJY2NiW21ib10ucnNhbGVuID0gMTY7CisJY2NiW21ib10ubGlua3B0clswXSA9IGNjYlttYm9dLmxpbmtwdHJbMV0gPSBjY2JbbWJvXS5saW5rcHRyWzJdID0gMDsKKwljY2JbbWJvXS5jb21tbGlua2lkID0gMDsKKworI2lmZGVmIERFQlVHCisJeworCQlpbnQgaTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImFoYTE1NDJfY29tbWFuZDogc2VuZGluZy4uICIpOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNjYlttYm9dKSAtIDEwOyBpKyspCisJCQlwcmludGsoIiUwMnggIiwgKCh1bmNoYXIgKikgJiBjY2JbbWJvXSlbaV0pOworCX07CisjZW5kaWYKKworCWlmIChkb25lKSB7CisJCURFQihwcmludGsoImFoYTE1NDJfcXVldWVjb21tYW5kOiBub3cgd2FpdGluZyBmb3IgaW50ZXJydXB0ICIpOworCQkgICAgYWhhMTU0Ml9zdGF0KCkpOworCQlTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKKwkJbWJbbWJvXS5zdGF0dXMgPSAxOworCQlhaGExNTQyX291dChTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0LCAmYWhhY21kLCAxKTsJLyogc3RhcnQgc2NzaSBjb21tYW5kICovCisJCURFQihhaGExNTQyX3N0YXQoKSk7CisJfSBlbHNlCisJCXByaW50aygiYWhhMTU0Ml9xdWV1ZWNvbW1hbmQ6IGRvbmUgY2FuJ3QgYmUgTlVMTFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyogSW5pdGlhbGl6ZSBtYWlsYm94ZXMgKi8KK3N0YXRpYyB2b2lkIHNldHVwX21haWxib3hlcyhpbnQgYnNlLCBzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbWFpbGJveCAqbWI7CisJc3RydWN0IGNjYiAqY2NiOworCisJdW5jaGFyIGNtZFs1XSA9IHsgQ01EX01CSU5JVCwgQUhBMTU0Ml9NQUlMQk9YRVMsIDAsIDAsIDB9OworCisJbWIgPSBIT1NUREFUQShzaHBudCktPm1iOworCWNjYiA9IEhPU1REQVRBKHNocG50KS0+Y2NiOworCisJZm9yIChpID0gMDsgaSA8IEFIQTE1NDJfTUFJTEJPWEVTOyBpKyspIHsKKwkJbWJbaV0uc3RhdHVzID0gbWJbQUhBMTU0Ml9NQUlMQk9YRVMgKyBpXS5zdGF0dXMgPSAwOworCQlhbnkyc2NzaShtYltpXS5jY2JwdHIsIFNDU0lfQlVGX1BBKCZjY2JbaV0pKTsKKwl9OworCWFoYTE1NDJfaW50cl9yZXNldChic2UpOwkvKiByZXNldCBpbnRlcnJ1cHRzLCBzbyB0aGV5IGRvbid0IGJsb2NrICovCisJYW55MnNjc2koKGNtZCArIDIpLCBTQ1NJX0JVRl9QQShtYikpOworCWFoYTE1NDJfb3V0KGJzZSwgY21kLCA1KTsKKwlXQUlUKElOVFJGTEFHUyhic2UpLCBJTlRSTUFTSywgSEFDQywgMCk7CisJd2hpbGUgKDApIHsKK2ZhaWw6CisJCXByaW50ayhLRVJOX0VSUiAiYWhhMTU0Ml9kZXRlY3Q6IGZhaWxlZCBzZXR0aW5nIHVwIG1haWxib3hlc1xuIik7CisJfQorCWFoYTE1NDJfaW50cl9yZXNldChic2UpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhaGExNTQyX2dldGNvbmZpZyhpbnQgYmFzZV9pbywgdW5zaWduZWQgY2hhciAqaXJxX2xldmVsLCB1bnNpZ25lZCBjaGFyICpkbWFfY2hhbiwgdW5zaWduZWQgY2hhciAqc2NzaV9pZCkKK3sKKwl1bmNoYXIgaW5xdWlyeV9jbWRbXSA9IHtDTURfUkVUQ09ORn07CisJdW5jaGFyIGlucXVpcnlfcmVzdWx0WzNdOworCWludCBpOworCWkgPSBpbmIoU1RBVFVTKGJhc2VfaW8pKTsKKwlpZiAoaSAmIERGKSB7CisJCWkgPSBpbmIoREFUQShiYXNlX2lvKSk7CisJfTsKKwlhaGExNTQyX291dChiYXNlX2lvLCBpbnF1aXJ5X2NtZCwgMSk7CisJYWhhMTU0Ml9pbihiYXNlX2lvLCBpbnF1aXJ5X3Jlc3VsdCwgMyk7CisJV0FJVChJTlRSRkxBR1MoYmFzZV9pbyksIElOVFJNQVNLLCBIQUNDLCAwKTsKKwl3aGlsZSAoMCkgeworZmFpbDoKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTQyX2RldGVjdDogcXVlcnkgYm9hcmQgc2V0dGluZ3NcbiIpOworCX0KKwlhaGExNTQyX2ludHJfcmVzZXQoYmFzZV9pbyk7CisJc3dpdGNoIChpbnF1aXJ5X3Jlc3VsdFswXSkgeworCWNhc2UgMHg4MDoKKwkJKmRtYV9jaGFuID0gNzsKKwkJYnJlYWs7CisJY2FzZSAweDQwOgorCQkqZG1hX2NoYW4gPSA2OworCQlicmVhazsKKwljYXNlIDB4MjA6CisJCSpkbWFfY2hhbiA9IDU7CisJCWJyZWFrOworCWNhc2UgMHgwMToKKwkJKmRtYV9jaGFuID0gMDsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQkvKiBUaGlzIG1lYW5zIHRoYXQgdGhlIGFkYXB0ZXIsIGFsdGhvdWdoIEFkYXB0ZWMgMTU0MiBjb21wYXRpYmxlLCBkb2Vzbid0IHVzZSBhIERNQSBjaGFubmVsLgorCQkgICBDdXJyZW50bHkgb25seSBhd2FyZSBvZiB0aGUgQnVzTG9naWMgQlQtNDQ1UyBWTC1CdXMgYWRhcHRlciB3aGljaCBuZWVkcyB0aGlzLiAqLworCQkqZG1hX2NoYW4gPSAweEZGOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBkZXRlcm1pbmUgQWRhcHRlYyBETUEgcHJpb3JpdHkuICBEaXNhYmxpbmcgYm9hcmRcbiIpOworCQlyZXR1cm4gLTE7CisJfTsKKwlzd2l0Y2ggKGlucXVpcnlfcmVzdWx0WzFdKSB7CisJY2FzZSAweDQwOgorCQkqaXJxX2xldmVsID0gMTU7CisJCWJyZWFrOworCWNhc2UgMHgyMDoKKwkJKmlycV9sZXZlbCA9IDE0OworCQlicmVhazsKKwljYXNlIDB4ODoKKwkJKmlycV9sZXZlbCA9IDEyOworCQlicmVhazsKKwljYXNlIDB4NDoKKwkJKmlycV9sZXZlbCA9IDExOworCQlicmVhazsKKwljYXNlIDB4MjoKKwkJKmlycV9sZXZlbCA9IDEwOworCQlicmVhazsKKwljYXNlIDB4MToKKwkJKmlycV9sZXZlbCA9IDk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGRldGVybWluZSBBZGFwdGVjIElSUSBsZXZlbC4gIERpc2FibGluZyBib2FyZFxuIik7CisJCXJldHVybiAtMTsKKwl9OworCSpzY3NpX2lkID0gaW5xdWlyeV9yZXN1bHRbMl0gJiA3OworCXJldHVybiAwOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3IgMTU0MkMgYm9hcmRzIC0gd2UgY2FuIGRldGVjdAorICAgdGhlIHNwZWNpYWwgZmlybXdhcmUgc2V0dGluZ3MgYW5kIHVubG9jayB0aGUgYm9hcmQgKi8KKworc3RhdGljIGludCBfX2luaXQgYWhhMTU0Ml9tYmVuYWJsZShpbnQgYmFzZSkKK3sKKwlzdGF0aWMgdW5jaGFyIG1iZW5hYmxlX2NtZFszXTsKKwlzdGF0aWMgdW5jaGFyIG1iZW5hYmxlX3Jlc3VsdFsyXTsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gQklPU19UUkFOU0xBVElPTl82NDMyOworCisJbWJlbmFibGVfY21kWzBdID0gQ01EX0VYVEJJT1M7CisJYWhhMTU0Ml9vdXQoYmFzZSwgbWJlbmFibGVfY21kLCAxKTsKKwlpZiAoYWhhMTU0Ml9pbjEoYmFzZSwgbWJlbmFibGVfcmVzdWx0LCAyKSkKKwkJcmV0dXJuIHJldHZhbDsKKwlXQUlUZChJTlRSRkxBR1MoYmFzZSksIElOVFJNQVNLLCBIQUNDLCAwLCAxMDApOworCWFoYTE1NDJfaW50cl9yZXNldChiYXNlKTsKKworCWlmICgobWJlbmFibGVfcmVzdWx0WzBdICYgMHgwOCkgfHwgbWJlbmFibGVfcmVzdWx0WzFdKSB7CisJCW1iZW5hYmxlX2NtZFswXSA9IENNRF9NQkVOQUJMRTsKKwkJbWJlbmFibGVfY21kWzFdID0gMDsKKwkJbWJlbmFibGVfY21kWzJdID0gbWJlbmFibGVfcmVzdWx0WzFdOworCisJCWlmICgobWJlbmFibGVfcmVzdWx0WzBdICYgMHgwOCkgJiYgKG1iZW5hYmxlX3Jlc3VsdFsxXSAmIDB4MDMpKQorCQkJcmV0dmFsID0gQklPU19UUkFOU0xBVElPTl8yNTU2MzsKKworCQlhaGExNTQyX291dChiYXNlLCBtYmVuYWJsZV9jbWQsIDMpOworCQlXQUlUKElOVFJGTEFHUyhiYXNlKSwgSU5UUk1BU0ssIEhBQ0MsIDApOworCX07CisJd2hpbGUgKDApIHsKK2ZhaWw6CisJCXByaW50ayhLRVJOX0VSUiAiYWhhMTU0Ml9tYmVuYWJsZTogTWFpbGJveCBpbml0IGZhaWxlZFxuIik7CisJfQorCWFoYTE1NDJfaW50cl9yZXNldChiYXNlKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBRdWVyeSB0aGUgYm9hcmQgdG8gZmluZCBvdXQgaWYgaXQgaXMgYSAxNTQyIG9yIGEgMTc0MCwgb3Igd2hhdGV2ZXIuICovCitzdGF0aWMgaW50IF9faW5pdCBhaGExNTQyX3F1ZXJ5KGludCBiYXNlX2lvLCBpbnQgKnRyYW5zbCkKK3sKKwl1bmNoYXIgaW5xdWlyeV9jbWRbXSA9IHtDTURfSU5RVUlSWX07CisJdW5jaGFyIGlucXVpcnlfcmVzdWx0WzRdOworCWludCBpOworCWkgPSBpbmIoU1RBVFVTKGJhc2VfaW8pKTsKKwlpZiAoaSAmIERGKSB7CisJCWkgPSBpbmIoREFUQShiYXNlX2lvKSk7CisJfTsKKwlhaGExNTQyX291dChiYXNlX2lvLCBpbnF1aXJ5X2NtZCwgMSk7CisJYWhhMTU0Ml9pbihiYXNlX2lvLCBpbnF1aXJ5X3Jlc3VsdCwgNCk7CisJV0FJVChJTlRSRkxBR1MoYmFzZV9pbyksIElOVFJNQVNLLCBIQUNDLCAwKTsKKwl3aGlsZSAoMCkgeworZmFpbDoKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTQyX2RldGVjdDogcXVlcnkgY2FyZCB0eXBlXG4iKTsKKwl9CisJYWhhMTU0Ml9pbnRyX3Jlc2V0KGJhc2VfaW8pOworCisJKnRyYW5zbCA9IEJJT1NfVFJBTlNMQVRJT05fNjQzMjsJLyogRGVmYXVsdCBjYXNlICovCisKKwkvKiBGb3IgYW4gQUhBMTc0MCBzZXJpZXMgYm9hcmQsIHdlIGlnbm9yZSB0aGUgYm9hcmQgc2luY2UgdGhlcmUgaXMgYQorCSAgIGhhcmR3YXJlIGJ1ZyB3aGljaCBjYW4gbGVhZCB0byB3cm9uZyBibG9ja3MgYmVpbmcgcmV0dXJuZWQgaWYgdGhlIGJvYXJkCisJICAgaXMgb3BlcmF0aW5nIGluIHRoZSAxNTQyIGVtdWxhdGlvbiBtb2RlLiAgU2luY2UgdGhlcmUgaXMgYW4gZXh0ZW5kZWQgbW9kZQorCSAgIGRyaXZlciwgd2Ugc2ltcGx5IGlnbm9yZSB0aGUgYm9hcmQgYW5kIGxldCB0aGUgMTc0MCBkcml2ZXIgcGljayBpdCB1cC4KKwkgKi8KKworCWlmIChpbnF1aXJ5X3Jlc3VsdFswXSA9PSAweDQzKSB7CisJCXByaW50ayhLRVJOX0lORk8gImFoYTE1NDIuYzogRW11bGF0aW9uIG1vZGUgbm90IHN1cHBvcnRlZCBmb3IgQUhBIDE3NE4gaGFyZHdhcmUuXG4iKTsKKwkJcmV0dXJuIDE7CisJfTsKKworCS8qIEFsd2F5cyBjYWxsIHRoaXMgLSBib2FyZHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBleHRlbmRlZCBiaW9zIHRyYW5zbGF0aW9uCisJICAgd2lsbCBpZ25vcmUgdGhlIGNvbW1hbmQsIGFuZCB3ZSB3aWxsIHNldCB0aGUgcHJvcGVyIGRlZmF1bHQgKi8KKworCSp0cmFuc2wgPSBhaGExNTQyX21iZW5hYmxlKGJhc2VfaW8pOworCisJcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgY2hhciAqc2V0dXBfc3RyW01BWEJPQVJEU10gX19pbml0ZGF0YTsKK3N0YXRpYyBpbnQgc2V0dXBfaWR4ID0gMDsKKworc3RhdGljIHZvaWQgX19pbml0IGFoYTE1NDJfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCit7CisJY29uc3QgY2hhciAqYWhhdXNhZ2UgPSAiYWhhMTU0MjogdXNhZ2U6IGFoYTE1NDI9PFBPUlRCQVNFPlssPEJVU09OPiw8QlVTT0ZGPlssPERNQVNQRUVEPl1dXG4iOworCWludCBzZXR1cF9wb3J0YmFzZTsKKworCWlmIChzZXR1cF9pZHggPj0gTUFYQk9BUkRTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWhhMTU0MjogYWhhMTU0Ml9zZXR1cCBjYWxsZWQgdG9vIG1hbnkgdGltZXMhIEJhZCBMSUxPIHBhcmFtcyA/XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIgICBFbnRyeWxpbmUgMTogJXNcbiIsIHNldHVwX3N0clswXSk7CisJCXByaW50ayhLRVJOX0VSUiAiICAgRW50cnlsaW5lIDI6ICVzXG4iLCBzZXR1cF9zdHJbMV0pOworCQlwcmludGsoS0VSTl9FUlIgIiAgIFRoaXMgbGluZTogICAlc1xuIiwgc3RyKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoaW50c1swXSA8IDEgfHwgaW50c1swXSA+IDQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTQyOiAlc1xuIiwgc3RyKTsKKwkJcHJpbnRrKGFoYXVzYWdlKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTQyOiBXcm9uZyBwYXJhbWV0ZXJzIG1heSBjYXVzZSBzeXN0ZW0gbWFsZnVuY3Rpb24uLiBXZSB0cnkgYW55d2F5Li5cbiIpOworCX0KKwlzZXR1cF9jYWxsZWRbc2V0dXBfaWR4XSA9IGludHNbMF07CisJc2V0dXBfc3RyW3NldHVwX2lkeF0gPSBzdHI7CisKKwlzZXR1cF9wb3J0YmFzZSA9IGludHNbMF0gPj0gMSA/IGludHNbMV0gOiAwOwkvKiBQcmVzZXJ2ZSB0aGUgZGVmYXVsdCB2YWx1ZS4uICovCisJc2V0dXBfYnVzb25bc2V0dXBfaWR4XSA9IGludHNbMF0gPj0gMiA/IGludHNbMl0gOiA3OworCXNldHVwX2J1c29mZltzZXR1cF9pZHhdID0gaW50c1swXSA+PSAzID8gaW50c1szXSA6IDU7CisJaWYgKGludHNbMF0gPj0gNCkgCisJeworCQlpbnQgYXRidCA9IC0xOworCQlzd2l0Y2ggKGludHNbNF0pIHsKKwkJY2FzZSA1OgorCQkJYXRidCA9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJYXRidCA9IDB4MDQ7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJYXRidCA9IDB4MDE7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJYXRidCA9IDB4MDI7CisJCQlicmVhazsKKwkJY2FzZSAxMDoKKwkJCWF0YnQgPSAweDAzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgImFoYTE1NDI6ICVzXG4iLCBzdHIpOworCQkJcHJpbnRrKGFoYXVzYWdlKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiYWhhMTU0MjogVmFsaWQgdmFsdWVzIGZvciBETUFTUEVFRCBhcmUgNS04LCAxMCBNQi9zLiAgVXNpbmcganVtcGVyIGRlZmF1bHRzLlxuIik7CisJCQlicmVhazsKKwkJfQorCQlzZXR1cF9kbWFzcGVlZFtzZXR1cF9pZHhdID0gYXRidDsKKwl9CisJaWYgKHNldHVwX3BvcnRiYXNlICE9IDApCisJCWJhc2VzW3NldHVwX2lkeF0gPSBzZXR1cF9wb3J0YmFzZTsKKworCSsrc2V0dXBfaWR4OworfQorCitzdGF0aWMgaW50IF9faW5pdCBkb19zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGludHNbNV07CisKKwlpbnQgY291bnQ9c2V0dXBfaWR4OworCisJZ2V0X29wdGlvbnMoc3RyLCBzaXplb2YoaW50cykvc2l6ZW9mKGludCksIGludHMpOworCWFoYTE1NDJfc2V0dXAoc3RyLGludHMpOworCisJcmV0dXJuIGNvdW50PHNldHVwX2lkeDsKK30KKworX19zZXR1cCgiYWhhMTU0Mj0iLGRvX3NldHVwKTsKKyNlbmRpZgorCisvKiByZXR1cm4gbm9uLXplcm8gb24gZGV0ZWN0aW9uICovCitzdGF0aWMgaW50IF9faW5pdCBhaGExNTQyX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKiB0cG50KQoreworCXVuc2lnbmVkIGNoYXIgZG1hX2NoYW47CisJdW5zaWduZWQgY2hhciBpcnFfbGV2ZWw7CisJdW5zaWduZWQgY2hhciBzY3NpX2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGJhc2VfaW87CisJaW50IHRyYW5zOworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gTlVMTDsKKwlpbnQgY291bnQgPSAwOworCWludCBpbmR4OworCisJREVCKHByaW50aygiYWhhMTU0Ml9kZXRlY3Q6IFxuIikpOworCisJdHBudC0+cHJvY19uYW1lID0gImFoYTE1NDIiOworCisjaWZkZWYgTU9EVUxFCisJYmFzZXNbMF0gPSBhaGExNTQyWzBdOworCXNldHVwX2J1c29uWzBdID0gYWhhMTU0MlsxXTsKKwlzZXR1cF9idXNvZmZbMF0gPSBhaGExNTQyWzJdOworCXsKKwkJaW50IGF0YnQgPSAtMTsKKwkJc3dpdGNoIChhaGExNTQyWzNdKSB7CisJCWNhc2UgNToKKwkJCWF0YnQgPSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCWF0YnQgPSAweDA0OworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCWF0YnQgPSAweDAxOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCWF0YnQgPSAweDAyOworCQkJYnJlYWs7CisJCWNhc2UgMTA6CisJCQlhdGJ0ID0gMHgwMzsKKwkJCWJyZWFrOworCQl9OworCQlzZXR1cF9kbWFzcGVlZFswXSA9IGF0YnQ7CisJfQorI2VuZGlmCisKKwkvKgorCSAqCUZpbmQgTWljcm9DaGFubmVsIGNhcmRzIChBSEExNjQwKQorCSAqLworI2lmZGVmIENPTkZJR19NQ0FfTEVHQUNZCisJaWYoTUNBX2J1cykgeworCQlpbnQgc2xvdCA9IDA7CisJCWludCBwb3MgPSAwOworCisJCWZvciAoaW5keCA9IDA7IChzbG90ICE9ICBNQ0FfTk9URk9VTkQpICYmIAorCQkJICAgICAoaW5keCA8IHNpemVvZihiYXNlcykvc2l6ZW9mKGJhc2VzWzBdKSk7IGluZHgrKykgeworCisJCQlpZiAoYmFzZXNbaW5keF0pCisJCQkJY29udGludWU7CisKKwkJCS8qIERldGVjdCBvbmx5IEFIQS0xNjQwIGNhcmRzIC0tIE1DQSBJRCAwRjFGICovCisJCQlzbG90ID0gbWNhX2ZpbmRfdW51c2VkX2FkYXB0ZXIoMHgwZjFmLCBzbG90KTsKKwkJCWlmIChzbG90ID09IE1DQV9OT1RGT1VORCkKKwkJCQlicmVhazsKKworCQkJCisJCQkvKiBGb3VuZCBvbmUgKi8KKwkJCXBvcyA9IG1jYV9yZWFkX3N0b3JlZF9wb3Moc2xvdCwgMyk7CisJCQkKKwkJCS8qIERlY29kZSBhZGRyZXNzICovCisJCQlpZiAocG9zICYgMHg4MCkgeworCQkJCWlmIChwb3MgJiAweDAyKSB7CisJCQkJCWlmIChwb3MgJiAweDAxKQorCQkJCQkJYmFzZXNbaW5keF0gPSAweDMzNDsKKwkJCQkJZWxzZQorCQkJCQkJYmFzZXNbaW5keF0gPSAweDIzNDsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAocG9zICYgMHgwMSkKKwkJCQkJCWJhc2VzW2luZHhdID0gMHgxMzQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAocG9zICYgMHgwMikgeworCQkJCQlpZiAocG9zICYgMHgwMSkKKwkJCQkJCWJhc2VzW2luZHhdID0gMHgzMzA7CisJCQkJCWVsc2UKKwkJCQkJCWJhc2VzW2luZHhdID0gMHgyMzA7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHBvcyAmIDB4MDEpCisJCQkJCQliYXNlc1tpbmR4XSA9IDB4MTMwOworCQkJCX0KKwkJCX0KKworCQkJLyogTm8gbmVlZCB0byBkZWNvZGUgSVJRIGFuZCBBcmIgbGV2ZWwgLS0gdGhvc2UgYXJlCisJCQkgKiByZWFkIG9mZiB0aGUgY2FyZCBsYXRlci4KKwkJCSAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgYW4gQUhBLTE2NDAgaW4gTUNBIHNsb3QgJWQsIEkvTyAweCUwNHhcbiIsIHNsb3QsIGJhc2VzW2luZHhdKTsKKworCQkJbWNhX3NldF9hZGFwdGVyX25hbWUoc2xvdCwgIkFkYXB0ZXIgQUhBLTE2NDAiKTsKKwkJCW1jYV9zZXRfYWRhcHRlcl9wcm9jZm4oc2xvdCwgTlVMTCwgTlVMTCk7CisJCQltY2FfbWFya19hc191c2VkKHNsb3QpOworCQkJCisJCQkvKiBHbyBvbiAqLworCQkJc2xvdCsrOworCQl9CisJCQorCX0KKyNlbmRpZgorCisJLyoKKwkgKglIdW50IGZvciBJU0EgUGx1ZyduJ1ByYXkgQWRhcHRlY3MgKEFIQTE1MzUpCisJICovCisJIAorCWlmKGlzYXBucCkKKwl7CisJCXN0cnVjdCBwbnBfZGV2ICpwZGV2ID0gTlVMTDsKKwkJZm9yKGluZHggPSAwOyBpbmR4IDxzaXplb2YoYmFzZXMpL3NpemVvZihiYXNlc1swXSk7aW5keCsrKQorCQl7CisJCQlpZihiYXNlc1tpbmR4XSkKKwkJCQljb250aW51ZTsKKwkJCXBkZXYgPSBwbnBfZmluZF9kZXYoTlVMTCwgSVNBUE5QX1ZFTkRPUignQScsICdEJywgJ1AnKSwgCisJCQkJSVNBUE5QX0ZVTkNUSU9OKDB4MTU0MiksIHBkZXYpOworCQkJaWYocGRldj09TlVMTCkKKwkJCQlicmVhazsKKwkJCS8qCisJCQkgKglBY3RpdmF0ZSB0aGUgUG5QIGNhcmQKKwkJCSAqLworCQkJIAorCQkJaWYocG5wX2RldmljZV9hdHRhY2gocGRldik8MCkKKwkJCQljb250aW51ZTsKKwkJCQorCQkJaWYocG5wX2FjdGl2YXRlX2RldihwZGV2KTwwKSB7CisJCQkJcG5wX2RldmljZV9kZXRhY2gocGRldik7CisJCQkJY29udGludWU7CisJCQl9CisJCQkKKwkJCWlmKCFwbnBfcG9ydF92YWxpZChwZGV2LCAwKSkgeworCQkJCXBucF9kZXZpY2VfZGV0YWNoKHBkZXYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJCQorCQkJYmFzZXNbaW5keF0gPSBwbnBfcG9ydF9zdGFydChwZGV2LCAwKTsKKwkJCQorCQkJLyogVGhlIGNhcmQgY2FuIGJlIHF1ZXJpZWQgZm9yIGl0cyBETUEsIHdlIGhhdmUgCisJCQkgICB0aGUgRE1BIHNldCB1cCB0aGF0IGlzIGVub3VnaCAqLworCQkJICAgCisJCQlwcmludGsoS0VSTl9JTkZPICJJU0FQblAgZm91bmQgYW4gQUhBMTUzNSBhdCBJL08gMHglMDNYXG4iLCBiYXNlc1tpbmR4XSk7CisJCX0KKwl9CisJZm9yIChpbmR4ID0gMDsgaW5keCA8IHNpemVvZihiYXNlcykgLyBzaXplb2YoYmFzZXNbMF0pOyBpbmR4KyspCisJCWlmIChiYXNlc1tpbmR4XSAhPSAwICYmIHJlcXVlc3RfcmVnaW9uKGJhc2VzW2luZHhdLCA0LCAiYWhhMTU0MiIpKSB7CisJCQlzaHBudCA9IHNjc2lfcmVnaXN0ZXIodHBudCwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBhaGExNTQyX2hvc3RkYXRhKSk7CisKKwkJCWlmKHNocG50PT1OVUxMKSB7CisJCQkJcmVsZWFzZV9yZWdpb24oYmFzZXNbaW5keF0sIDQpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogRm9yIG5vdyB3ZSBkbyB0aGlzIC0gdW50aWwga21hbGxvYyBpcyBtb3JlIGludGVsbGlnZW50CisJCQkgICB3ZSBhcmUgcmVzaWduZWQgdG8gc3R1cGlkIGhhY2tzIGxpa2UgdGhpcyAqLworCQkJaWYgKFNDU0lfQlVGX1BBKHNocG50KSA+PSBJU0FfRE1BX1RIUkVTSE9MRCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBhZGRyZXNzIGZvciBzaHBudCB3aXRoIDE1NDIuXG4iKTsKKwkJCQlnb3RvIHVucmVnaXN0ZXI7CisJCQl9CisJCQlpZiAoIWFoYTE1NDJfdGVzdF9wb3J0KGJhc2VzW2luZHhdLCBzaHBudCkpCisJCQkJZ290byB1bnJlZ2lzdGVyOworCisKKwkJCWJhc2VfaW8gPSBiYXNlc1tpbmR4XTsKKworCQkJLyogU2V0IHRoZSBCdXMgb24vb2ZmLXRpbWVzIGFzIG5vdCB0byBydWluIGZsb3BweSBwZXJmb3JtYW5jZSAqLworCQkJeworCQkJCXVuY2hhciBvbmNtZFtdID0ge0NNRF9CVVNPTl9USU1FLCA3fTsKKwkJCQl1bmNoYXIgb2ZmY21kW10gPSB7Q01EX0JVU09GRl9USU1FLCA1fTsKKworCQkJCWlmIChzZXR1cF9jYWxsZWRbaW5keF0pIHsKKwkJCQkJb25jbWRbMV0gPSBzZXR1cF9idXNvbltpbmR4XTsKKwkJCQkJb2ZmY21kWzFdID0gc2V0dXBfYnVzb2ZmW2luZHhdOworCQkJCX0KKwkJCQlhaGExNTQyX2ludHJfcmVzZXQoYmFzZV9pbyk7CisJCQkJYWhhMTU0Ml9vdXQoYmFzZV9pbywgb25jbWQsIDIpOworCQkJCVdBSVQoSU5UUkZMQUdTKGJhc2VfaW8pLCBJTlRSTUFTSywgSEFDQywgMCk7CisJCQkJYWhhMTU0Ml9pbnRyX3Jlc2V0KGJhc2VfaW8pOworCQkJCWFoYTE1NDJfb3V0KGJhc2VfaW8sIG9mZmNtZCwgMik7CisJCQkJV0FJVChJTlRSRkxBR1MoYmFzZV9pbyksIElOVFJNQVNLLCBIQUNDLCAwKTsKKwkJCQlpZiAoc2V0dXBfZG1hc3BlZWRbaW5keF0gPj0gMCkgeworCQkJCQl1bmNoYXIgZG1hY21kW10gPSB7Q01EX0RNQVNQRUVELCAwfTsKKwkJCQkJZG1hY21kWzFdID0gc2V0dXBfZG1hc3BlZWRbaW5keF07CisJCQkJCWFoYTE1NDJfaW50cl9yZXNldChiYXNlX2lvKTsKKwkJCQkJYWhhMTU0Ml9vdXQoYmFzZV9pbywgZG1hY21kLCAyKTsKKwkJCQkJV0FJVChJTlRSRkxBR1MoYmFzZV9pbyksIElOVFJNQVNLLCBIQUNDLCAwKTsKKwkJCQl9CisJCQkJd2hpbGUgKDApIHsKK2ZhaWw6CisJCQkJCXByaW50ayhLRVJOX0VSUiAiYWhhMTU0Ml9kZXRlY3Q6IHNldHRpbmcgYnVzIG9uL29mZi10aW1lIGZhaWxlZFxuIik7CisJCQkJfQorCQkJCWFoYTE1NDJfaW50cl9yZXNldChiYXNlX2lvKTsKKwkJCX0KKwkJCWlmIChhaGExNTQyX3F1ZXJ5KGJhc2VfaW8sICZ0cmFucykpCisJCQkJZ290byB1bnJlZ2lzdGVyOworCisJCQlpZiAoYWhhMTU0Ml9nZXRjb25maWcoYmFzZV9pbywgJmlycV9sZXZlbCwgJmRtYV9jaGFuLCAmc2NzaV9pZCkgPT0gLTEpCisJCQkJZ290byB1bnJlZ2lzdGVyOworCisJCQlwcmludGsoS0VSTl9JTkZPICJDb25maWd1cmluZyBBZGFwdGVjIChTQ1NJLUlEICVkKSBhdCBJTzoleCwgSVJRICVkIiwgc2NzaV9pZCwgYmFzZV9pbywgaXJxX2xldmVsKTsKKwkJCWlmIChkbWFfY2hhbiAhPSAweEZGKQorCQkJCXByaW50aygiLCBETUEgcHJpb3JpdHkgJWQiLCBkbWFfY2hhbik7CisJCQlwcmludGsoIlxuIik7CisKKwkJCURFQihhaGExNTQyX3N0YXQoKSk7CisJCQlzZXR1cF9tYWlsYm94ZXMoYmFzZV9pbywgc2hwbnQpOworCisJCQlERUIoYWhhMTU0Ml9zdGF0KCkpOworCisJCQlERUIocHJpbnRrKCJhaGExNTQyX2RldGVjdDogZW5hYmxlIGludGVycnVwdCBjaGFubmVsICVkXG4iLCBpcnFfbGV2ZWwpKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZhaGExNTQyX2xvY2ssIGZsYWdzKTsKKwkJCWlmIChyZXF1ZXN0X2lycShpcnFfbGV2ZWwsIGRvX2FoYTE1NDJfaW50cl9oYW5kbGUsIDAsICJhaGExNTQyIiwgTlVMTCkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBJUlEgZm9yIGFkYXB0ZWMgY29udHJvbGxlci5cbiIpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFoYTE1NDJfbG9jaywgZmxhZ3MpOworCQkJCWdvdG8gdW5yZWdpc3RlcjsKKwkJCX0KKwkJCWlmIChkbWFfY2hhbiAhPSAweEZGKSB7CisJCQkJaWYgKHJlcXVlc3RfZG1hKGRtYV9jaGFuLCAiYWhhMTU0MiIpKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIERNQSBjaGFubmVsIGZvciBBZGFwdGVjLlxuIik7CisJCQkJCWZyZWVfaXJxKGlycV9sZXZlbCwgTlVMTCk7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFoYTE1NDJfbG9jaywgZmxhZ3MpOworCQkJCQlnb3RvIHVucmVnaXN0ZXI7CisJCQkJfQorCQkJCWlmIChkbWFfY2hhbiA9PSAwIHx8IGRtYV9jaGFuID49IDUpIHsKKwkJCQkJc2V0X2RtYV9tb2RlKGRtYV9jaGFuLCBETUFfTU9ERV9DQVNDQURFKTsKKwkJCQkJZW5hYmxlX2RtYShkbWFfY2hhbik7CisJCQkJfQorCQkJfQorCQkJYWhhX2hvc3RbaXJxX2xldmVsIC0gOV0gPSBzaHBudDsKKwkJCXNocG50LT50aGlzX2lkID0gc2NzaV9pZDsKKwkJCXNocG50LT51bmlxdWVfaWQgPSBiYXNlX2lvOworCQkJc2hwbnQtPmlvX3BvcnQgPSBiYXNlX2lvOworCQkJc2hwbnQtPm5faW9fcG9ydCA9IDQ7CS8qIE51bWJlciBvZiBieXRlcyBvZiBJL08gc3BhY2UgdXNlZCAqLworCQkJc2hwbnQtPmRtYV9jaGFubmVsID0gZG1hX2NoYW47CisJCQlzaHBudC0+aXJxID0gaXJxX2xldmVsOworCQkJSE9TVERBVEEoc2hwbnQpLT5iaW9zX3RyYW5zbGF0aW9uID0gdHJhbnM7CisJCQlpZiAodHJhbnMgPT0gQklPU19UUkFOU0xBVElPTl8yNTU2MykKKwkJCQlwcmludGsoS0VSTl9JTkZPICJhaGExNTQyLmM6IFVzaW5nIGV4dGVuZGVkIGJpb3MgdHJhbnNsYXRpb25cbiIpOworCQkJSE9TVERBVEEoc2hwbnQpLT5haGExNTQyX2xhc3RfbWJpX3VzZWQgPSAoMiAqIEFIQTE1NDJfTUFJTEJPWEVTIC0gMSk7CisJCQlIT1NUREFUQShzaHBudCktPmFoYTE1NDJfbGFzdF9tYm9fdXNlZCA9IChBSEExNTQyX01BSUxCT1hFUyAtIDEpOworCQkJbWVtc2V0KEhPU1REQVRBKHNocG50KS0+U0NpbnQsIDAsIHNpemVvZihIT1NUREFUQShzaHBudCktPlNDaW50KSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhaGExNTQyX2xvY2ssIGZsYWdzKTsKKyNpZiAwCisJCQlERUIocHJpbnRrKCIgKioqIFJFQUQgQ0FQQUNJVFkgKioqXG4iKSk7CisKKwkJCXsKKwkJCQl1bmNoYXIgYnVmWzhdOworCQkJCXN0YXRpYyB1bmNoYXIgY21kW10gPSB7IFJFQURfQ0FQQUNJVFksIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKwkJCQlpbnQgaTsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoYnVmKTsgKytpKQorCQkJCQlidWZbaV0gPSAweDg3OworCQkJCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpCisJCQkJCWlmICghYWhhMTU0Ml9jb21tYW5kKGksIGNtZCwgYnVmLCBzaXplb2YoYnVmKSkpIHsKKwkJCQkJCXByaW50ayhLRVJOX0RFQlVHICJhaGFfZGV0ZWN0OiBMVSAlZCBzZWN0b3Jfc2l6ZSAlZCBkZXZpY2Vfc2l6ZSAlZFxuIiwKKwkJCQkJCSAgICAgICBpLCB4c2NzaTJpbnQoYnVmICsgNCksIHhzY3NpMmludChidWYpKTsKKwkJCQkJfQorCQkJfQorCisJCQlERUIocHJpbnRrKCIgKioqIE5PVyBSVU5OSU5HIE1ZIE9XTiBURVNUICoqKiBcbiIpKTsKKworCQkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCQkJCXVuc2lnbmVkIGNoYXIgY21kWzEwXTsKKwkJCQlzdGF0aWMgYnVmZmVyWzUxMl07CisKKwkJCQljbWRbMF0gPSBSRUFEXzEwOworCQkJCWNtZFsxXSA9IDA7CisJCQkJeGFueTJzY3NpKGNtZCArIDIsIGkpOworCQkJCWNtZFs2XSA9IDA7CisJCQkJY21kWzddID0gMDsKKwkJCQljbWRbOF0gPSAxOworCQkJCWNtZFs5XSA9IDA7CisJCQkJYWhhMTU0Ml9jb21tYW5kKDAsIGNtZCwgYnVmZmVyLCA1MTIpOworCQkJfQorI2VuZGlmCisJCQljb3VudCsrOworCQkJY29udGludWU7Cit1bnJlZ2lzdGVyOgorCQkJcmVsZWFzZV9yZWdpb24oYmFzZXNbaW5keF0sIDQpOworCQkJc2NzaV91bnJlZ2lzdGVyKHNocG50KTsKKwkJCWNvbnRpbnVlOworCisJCX07CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgYWhhMTU0Ml9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCWlmIChzaG9zdC0+aXJxKQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBOVUxMKTsKKwlpZiAoc2hvc3QtPmRtYV9jaGFubmVsICE9IDB4ZmYpCisJCWZyZWVfZG1hKHNob3N0LT5kbWFfY2hhbm5lbCk7CisJaWYgKHNob3N0LT5pb19wb3J0ICYmIHNob3N0LT5uX2lvX3BvcnQpCisJCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKKwlzY3NpX3VucmVnaXN0ZXIoc2hvc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFoYTE1NDJfcmVzdGFydChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpbnQgaTsKKwlpbnQgY291bnQgPSAwOworI2lmIDAKKwl1bmNoYXIgYWhhY21kID0gQ01EX1NUQVJUX1NDU0k7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBBSEExNTQyX01BSUxCT1hFUzsgaSsrKQorCQlpZiAoSE9TVERBVEEoc2hvc3QpLT5TQ2ludFtpXSAmJgorCQkgICAgIShIT1NUREFUQShzaG9zdCktPlNDaW50W2ldLT5kZXZpY2UtPnNvZnRfcmVzZXQpKSB7CisjaWYgMAorCQkJSE9TVERBVEEoc2hvc3QpLT5tYltpXS5zdGF0dXMgPSAxOwkvKiBJbmRpY2F0ZSByZWFkeSB0byByZXN0YXJ0Li4uICovCisjZW5kaWYKKwkJCWNvdW50Kys7CisJCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiUG90ZW50aWFsIHRvIHJlc3RhcnQgJWQgc3RhbGxlZCBjb21tYW5kcy4uLlxuIiwgY291bnQpOworI2lmIDAKKwkvKiBzdGFydCBzY3NpIGNvbW1hbmQgKi8KKwlpZiAoY291bnQpCisJCWFoYTE1NDJfb3V0KHNob3N0LT5pb19wb3J0LCAmYWhhY21kLCAxKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFoYTE1NDJfYWJvcnQoU2NzaV9DbW5kICogU0NwbnQpCit7CisKKwkvKgorCSAqIFRoZSBhYm9ydCBjb21tYW5kIGRvZXMgbm90IGxlYXZlIHRoZSBkZXZpY2UgaW4gYSBjbGVhbiBzdGF0ZSB3aGVyZQorCSAqICBpdCBpcyBhdmFpbGFibGUgdG8gYmUgdXNlZCBhZ2Fpbi4gIFVudGlsIHRoaXMgZ2V0cyB3b3JrZWQgb3V0LCB3ZQorCSAqIHdpbGwgbGVhdmUgaXQgY29tbWVudGVkIG91dC4gIAorCSAqLworCisJcHJpbnRrKEtFUk5fRVJSICJhaGExNTQyLmM6IFVuYWJsZSB0byBhYm9ydCBjb21tYW5kIGZvciB0YXJnZXQgJWRcbiIsCisJICAgICAgIFNDcG50LT5kZXZpY2UtPmlkKTsKKwlyZXR1cm4gRkFJTEVEOworfQorCisvKgorICogVGhpcyBpcyBhIGRldmljZSByZXNldC4gIFRoaXMgaXMgaGFuZGxlZCBieSBzZW5kaW5nIGEgc3BlY2lhbCBjb21tYW5kCisgKiB0byB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgaW50IGFoYTE1NDJfZGV2X3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG1haWxib3ggKm1iOworCXVuY2hhciB0YXJnZXQgPSBTQ3BudC0+ZGV2aWNlLT5pZDsKKwl1bmNoYXIgbHVuID0gU0NwbnQtPmRldmljZS0+bHVuOworCWludCBtYm87CisJc3RydWN0IGNjYiAqY2NiOworCXVuY2hhciBhaGFjbWQgPSBDTURfU1RBUlRfU0NTSTsKKworCWNjYiA9IEhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5jY2I7CisJbWIgPSBIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KS0+bWI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJbWJvID0gSE9TVERBVEEoU0NwbnQtPmRldmljZS0+aG9zdCktPmFoYTE1NDJfbGFzdF9tYm9fdXNlZCArIDE7CisJaWYgKG1ibyA+PSBBSEExNTQyX01BSUxCT1hFUykKKwkJbWJvID0gMDsKKworCWRvIHsKKwkJaWYgKG1iW21ib10uc3RhdHVzID09IDAgJiYgSE9TVERBVEEoU0NwbnQtPmRldmljZS0+aG9zdCktPlNDaW50W21ib10gPT0gTlVMTCkKKwkJCWJyZWFrOworCQltYm8rKzsKKwkJaWYgKG1ibyA+PSBBSEExNTQyX01BSUxCT1hFUykKKwkJCW1ibyA9IDA7CisJfSB3aGlsZSAobWJvICE9IEhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5haGExNTQyX2xhc3RfbWJvX3VzZWQpOworCisJaWYgKG1iW21ib10uc3RhdHVzIHx8IEhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5TQ2ludFttYm9dKQorCQlwYW5pYygiVW5hYmxlIHRvIGZpbmQgZW1wdHkgbWFpbGJveCBmb3IgYWhhMTU0Mi5cbiIpOworCisJSE9TVERBVEEoU0NwbnQtPmRldmljZS0+aG9zdCktPlNDaW50W21ib10gPSBTQ3BudDsJLyogVGhpcyB3aWxsIGVmZmVjdGl2ZWx5CisJCQkJCQkJICAgcHJldmVudCBzb21lb25lIGVsc2UgZnJvbQorCQkJCQkJCSAgIHNjcmV3aW5nIHdpdGggdGhpcyBjZGIuICovCisKKwlIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KS0+YWhhMTU0Ml9sYXN0X21ib191c2VkID0gbWJvOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFoYTE1NDJfbG9jaywgZmxhZ3MpOworCisJYW55MnNjc2kobWJbbWJvXS5jY2JwdHIsIFNDU0lfQlVGX1BBKCZjY2JbbWJvXSkpOwkvKiBUaGlzIGdldHMgdHJhc2hlZCBmb3Igc29tZSByZWFzb24gKi8KKworCW1lbXNldCgmY2NiW21ib10sIDAsIHNpemVvZihzdHJ1Y3QgY2NiKSk7CisKKwljY2JbbWJvXS5vcCA9IDB4ODE7CS8qIEJVUyBERVZJQ0UgUkVTRVQgKi8KKworCWNjYlttYm9dLmlkbHVuID0gKHRhcmdldCAmIDcpIDw8IDUgfCAobHVuICYgNyk7CQkvKlNDU0kgVGFyZ2V0IElkICovCisKKwljY2JbbWJvXS5saW5rcHRyWzBdID0gY2NiW21ib10ubGlua3B0clsxXSA9IGNjYlttYm9dLmxpbmtwdHJbMl0gPSAwOworCWNjYlttYm9dLmNvbW1saW5raWQgPSAwOworCisJLyogCisJICogTm93IHRlbGwgdGhlIDE1NDIgdG8gZmx1c2ggYWxsIHBlbmRpbmcgY29tbWFuZHMgZm9yIHRoaXMgCisJICogdGFyZ2V0IAorCSAqLworCWFoYTE1NDJfb3V0KFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQsICZhaGFjbWQsIDEpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiYWhhMTU0Mi5jOiBUcnlpbmcgZGV2aWNlIHJlc2V0IGZvciB0YXJnZXQgJWRcbiIsIFNDcG50LT5kZXZpY2UtPmlkKTsKKworCXJldHVybiBTVUNDRVNTOworCisKKyNpZmRlZiBFUklDX25ldmVyZGVmCisJLyogCisJICogV2l0aCB0aGUgMTU0MiB3ZSBhcHBhcmVudGx5IG5ldmVyIGdldCBhbiBpbnRlcnJ1cHQgdG8KKwkgKiBhY2tub3dsZWRnZSBhIGRldmljZSByZXNldCBiZWluZyBzZW50LiAgVGhlbiBhZ2FpbiwgTGVvbmFyZAorCSAqIHNheXMgd2UgYXJlIGRvaW5nIHRoaXMgd3JvbmcgaW4gdGhlIGZpcnN0IHBsYWNlLi4uCisJICoKKwkgKiBUYWtlIGEgd2FpdCBhbmQgc2VlIGF0dGl0dWRlLiAgSWYgd2UgZ2V0IHNwdXJpb3VzIGludGVycnVwdHMsCisJICogdGhlbiB0aGUgZGV2aWNlIHJlc2V0IGlzIGRvaW5nIHNvbWV0aGluZyBzYW5lIGFuZCB1c2VmdWwsIGFuZAorCSAqIHdlIHdpbGwgd2FpdCBmb3IgdGhlIGludGVycnVwdCB0byBwb3N0IGNvbXBsZXRpb24uCisJICovCisJcHJpbnRrKEtFUk5fV0FSTklORyAiU2VudCBCVVMgREVWSUNFIFJFU0VUIHRvIHRhcmdldCAlZFxuIiwgU0NwbnQtPnRhcmdldCk7CisKKwkvKgorCSAqIEZyZWUgdGhlIGNvbW1hbmQgYmxvY2sgZm9yIGFsbCBjb21tYW5kcyBydW5uaW5nIG9uIHRoaXMgCisJICogdGFyZ2V0Li4uIAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBSEExNTQyX01BSUxCT1hFUzsgaSsrKSB7CisJCWlmIChIT1NUREFUQShTQ3BudC0+aG9zdCktPlNDaW50W2ldICYmCisJCSAgICBIT1NUREFUQShTQ3BudC0+aG9zdCktPlNDaW50W2ldLT50YXJnZXQgPT0gU0NwbnQtPnRhcmdldCkgeworCQkJU2NzaV9DbW5kICpTQ3RtcDsKKwkJCVNDdG1wID0gSE9TVERBVEEoU0NwbnQtPmhvc3QpLT5TQ2ludFtpXTsKKwkJCWlmIChTQ3RtcC0+aG9zdF9zY3JpYmJsZSkgeworCQkJCWtmcmVlKFNDdG1wLT5ob3N0X3NjcmliYmxlKTsKKwkJCQlTQ3RtcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJCQl9CisJCQlIT1NUREFUQShTQ3BudC0+aG9zdCktPlNDaW50W2ldID0gTlVMTDsKKwkJCUhPU1REQVRBKFNDcG50LT5ob3N0KS0+bWJbaV0uc3RhdHVzID0gMDsKKwkJfQorCX0KKwlyZXR1cm4gU1VDQ0VTUzsKKworCXJldHVybiBGQUlMRUQ7CisjZW5kaWYJCQkJLyogRVJJQ19uZXZlcmRlZiAqLworfQorCitzdGF0aWMgaW50IGFoYTE1NDJfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50KQoreworCWludCBpOworCisJLyogCisJICogVGhpcyBkb2VzIGEgc2NzaSByZXNldCBmb3IgYWxsIGRldmljZXMgb24gdGhlIGJ1cy4KKwkgKiBJbiBwcmluY2lwbGUsIHdlIGNvdWxkIGFsc28gcmVzZXQgdGhlIDE1NDIgLSBzaG91bGQKKwkgKiB3ZSBkbyB0aGlzPyAgVHJ5IHRoaXMgZmlyc3QsIGFuZCB3ZSBjYW4gYWRkIHRoYXQgbGF0ZXIKKwkgKiBpZiBpdCB0dXJucyBvdXQgdG8gYmUgdXNlZnVsLgorCSAqLworCW91dGIoU0NSU1QsIENPTlRST0woU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydCkpOworCisJLyoKKwkgKiBXYWl0IGZvciB0aGUgdGhpbmcgdG8gc2V0dGxlIGRvd24gYSBiaXQuICBVbmZvcnR1bmF0ZWx5CisJICogdGhpcyBpcyBnb2luZyB0byBiYXNpY2FsbHkgbG9jayB1cCB0aGUgbWFjaGluZSB3aGlsZSB3ZQorCSAqIHdhaXQgZm9yIHRoaXMgdG8gY29tcGxldGUuICBUbyBiZSAxMDAlIGNvcnJlY3QsIHdlIG5lZWQgdG8KKwkgKiBjaGVjayBmb3IgdGltZW91dCwgYW5kIGlmIHdlIGFyZSBkb2luZyBzb21ldGhpbmcgbGlrZSB0aGlzCisJICogd2UgYXJlIHByZXR0eSBkZXNwZXJhdGUgYW55d2F5cy4KKwkgKi8KKwlzcGluX3VubG9ja19pcnEoU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrKTsKKwlzc2xlZXAoNCk7CisJc3Bpbl9sb2NrX2lycShTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2spOworCisJV0FJVChTVEFUVVMoU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydCksCisJICAgICBTVEFUTUFTSywgSU5JVCB8IElETEUsIFNUU1QgfCBESUFHRiB8IElOVkRDTUQgfCBERiB8IENERik7CisKKwkvKgorCSAqIE5vdyB0cnkgdG8gcGljayB1cCB0aGUgcGllY2VzLiAgRm9yIGFsbCBwZW5kaW5nIGNvbW1hbmRzLAorCSAqIGZyZWUgYW55IGludGVybmFsIGRhdGEgc3RydWN0dXJlcywgYW5kIGJhc2ljYWxseSBjbGVhciB0aGluZ3MKKwkgKiBvdXQuICBXZSBkbyBub3QgdHJ5IGFuZCByZXN0YXJ0IGFueSBjb21tYW5kcyBvciBhbnl0aGluZyAtIAorCSAqIHRoZSBzdHJhdGVneSBoYW5kbGVyIHRha2VzIGNhcmUgb2YgdGhhdCBjcmFwLgorCSAqLworCXByaW50ayhLRVJOX1dBUk5JTkcgIlNlbnQgQlVTIFJFU0VUIHRvIHNjc2kgaG9zdCAlZFxuIiwgU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdF9ubyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUhBMTU0Ml9NQUlMQk9YRVM7IGkrKykgeworCQlpZiAoSE9TVERBVEEoU0NwbnQtPmRldmljZS0+aG9zdCktPlNDaW50W2ldICE9IE5VTEwpIHsKKwkJCVNjc2lfQ21uZCAqU0N0bXA7CisJCQlTQ3RtcCA9IEhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5TQ2ludFtpXTsKKworCisJCQlpZiAoU0N0bXAtPmRldmljZS0+c29mdF9yZXNldCkgeworCQkJCS8qCisJCQkJICogSWYgdGhpcyBkZXZpY2UgaW1wbGVtZW50cyB0aGUgc29mdCByZXNldCBvcHRpb24sCisJCQkJICogdGhlbiBpdCBpcyBzdGlsbCBob2xkaW5nIG9udG8gdGhlIGNvbW1hbmQsIGFuZAorCQkJCSAqIG1heSB5ZXQgY29tcGxldGUgaXQuICBJbiB0aGlzIGNhc2UsIHdlIGRvbid0CisJCQkJICogZmx1c2ggdGhlIGRhdGEuCisJCQkJICovCisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoU0N0bXAtPmhvc3Rfc2NyaWJibGUpIHsKKwkJCQlrZnJlZShTQ3RtcC0+aG9zdF9zY3JpYmJsZSk7CisJCQkJU0N0bXAtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCQkJfQorCQkJSE9TVERBVEEoU0NwbnQtPmRldmljZS0+aG9zdCktPlNDaW50W2ldID0gTlVMTDsKKwkJCUhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5tYltpXS5zdGF0dXMgPSAwOworCQl9CisJfQorCisJcmV0dXJuIFNVQ0NFU1M7CisKK2ZhaWw6CisJcmV0dXJuIEZBSUxFRDsKK30KKworc3RhdGljIGludCBhaGExNTQyX2hvc3RfcmVzZXQoU2NzaV9DbW5kICogU0NwbnQpCit7CisJaW50IGk7CisKKwkvKiAKKwkgKiBUaGlzIGRvZXMgYSBzY3NpIHJlc2V0IGZvciBhbGwgZGV2aWNlcyBvbiB0aGUgYnVzLgorCSAqIEluIHByaW5jaXBsZSwgd2UgY291bGQgYWxzbyByZXNldCB0aGUgMTU0MiAtIHNob3VsZAorCSAqIHdlIGRvIHRoaXM/ICBUcnkgdGhpcyBmaXJzdCwgYW5kIHdlIGNhbiBhZGQgdGhhdCBsYXRlcgorCSAqIGlmIGl0IHR1cm5zIG91dCB0byBiZSB1c2VmdWwuCisJICovCisJb3V0YihIUlNUIHwgU0NSU1QsIENPTlRST0woU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydCkpOworCisJLyoKKwkgKiBXYWl0IGZvciB0aGUgdGhpbmcgdG8gc2V0dGxlIGRvd24gYSBiaXQuICBVbmZvcnR1bmF0ZWx5CisJICogdGhpcyBpcyBnb2luZyB0byBiYXNpY2FsbHkgbG9jayB1cCB0aGUgbWFjaGluZSB3aGlsZSB3ZQorCSAqIHdhaXQgZm9yIHRoaXMgdG8gY29tcGxldGUuICBUbyBiZSAxMDAlIGNvcnJlY3QsIHdlIG5lZWQgdG8KKwkgKiBjaGVjayBmb3IgdGltZW91dCwgYW5kIGlmIHdlIGFyZSBkb2luZyBzb21ldGhpbmcgbGlrZSB0aGlzCisJICogd2UgYXJlIHByZXR0eSBkZXNwZXJhdGUgYW55d2F5cy4KKwkgKi8KKwlzcGluX3VubG9ja19pcnEoU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrKTsKKwlzc2xlZXAoNCk7CisJc3Bpbl9sb2NrX2lycShTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2spOworCisJV0FJVChTVEFUVVMoU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydCksCisJICAgICBTVEFUTUFTSywgSU5JVCB8IElETEUsIFNUU1QgfCBESUFHRiB8IElOVkRDTUQgfCBERiB8IENERik7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gZG8gdGhpcyB0b28gYmVmb3JlIHRoZSAxNTQyIGNhbiBpbnRlcmFjdCB3aXRoCisJICogdXMgYWdhaW4uCisJICovCisJc2V0dXBfbWFpbGJveGVzKFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQsIFNDcG50LT5kZXZpY2UtPmhvc3QpOworCisJLyoKKwkgKiBOb3cgdHJ5IHRvIHBpY2sgdXAgdGhlIHBpZWNlcy4gIEZvciBhbGwgcGVuZGluZyBjb21tYW5kcywKKwkgKiBmcmVlIGFueSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMsIGFuZCBiYXNpY2FsbHkgY2xlYXIgdGhpbmdzCisJICogb3V0LiAgV2UgZG8gbm90IHRyeSBhbmQgcmVzdGFydCBhbnkgY29tbWFuZHMgb3IgYW55dGhpbmcgLSAKKwkgKiB0aGUgc3RyYXRlZ3kgaGFuZGxlciB0YWtlcyBjYXJlIG9mIHRoYXQgY3JhcC4KKwkgKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICJTZW50IEJVUyBSRVNFVCB0byBzY3NpIGhvc3QgJWRcbiIsIFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8pOworCisJZm9yIChpID0gMDsgaSA8IEFIQTE1NDJfTUFJTEJPWEVTOyBpKyspIHsKKwkJaWYgKEhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5TQ2ludFtpXSAhPSBOVUxMKSB7CisJCQlTY3NpX0NtbmQgKlNDdG1wOworCQkJU0N0bXAgPSBIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KS0+U0NpbnRbaV07CisKKwkJCWlmIChTQ3RtcC0+ZGV2aWNlLT5zb2Z0X3Jlc2V0KSB7CisJCQkJLyoKKwkJCQkgKiBJZiB0aGlzIGRldmljZSBpbXBsZW1lbnRzIHRoZSBzb2Z0IHJlc2V0IG9wdGlvbiwKKwkJCQkgKiB0aGVuIGl0IGlzIHN0aWxsIGhvbGRpbmcgb250byB0aGUgY29tbWFuZCwgYW5kCisJCQkJICogbWF5IHlldCBjb21wbGV0ZSBpdC4gIEluIHRoaXMgY2FzZSwgd2UgZG9uJ3QKKwkJCQkgKiBmbHVzaCB0aGUgZGF0YS4KKwkJCQkgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChTQ3RtcC0+aG9zdF9zY3JpYmJsZSkgeworCQkJCWtmcmVlKFNDdG1wLT5ob3N0X3NjcmliYmxlKTsKKwkJCQlTQ3RtcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJCQl9CisJCQlIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KS0+U0NpbnRbaV0gPSBOVUxMOworCQkJSE9TVERBVEEoU0NwbnQtPmRldmljZS0+aG9zdCktPm1iW2ldLnN0YXR1cyA9IDA7CisJCX0KKwl9CisKKwlyZXR1cm4gU1VDQ0VTUzsKKworZmFpbDoKKwlyZXR1cm4gRkFJTEVEOworfQorCisjaWYgMAorLyoKKyAqIFRoZXNlIGFyZSB0aGUgb2xkIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzLiAgVGhleSBhcmUgb25seSB0ZW1wb3JhcmlseQorICogaGVyZSB3aGlsZSB3ZSBwbGF5IHdpdGggdGhlIG5ldyBlcnJvciBoYW5kbGluZyBjb2RlLgorICovCitzdGF0aWMgaW50IGFoYTE1NDJfb2xkX2Fib3J0KFNjc2lfQ21uZCAqIFNDcG50KQoreworI2lmIDAKKwl1bmNoYXIgYWhhY21kID0gQ01EX1NUQVJUX1NDU0k7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbWFpbGJveCAqbWI7CisJaW50IG1iaSwgbWJvLCBpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIkluIGFoYTE1NDJfYWJvcnQ6ICV4ICV4XG4iLAorCSAgICAgICBpbmIoU1RBVFVTKFNDcG50LT5ob3N0LT5pb19wb3J0KSksCisJICAgICAgIGluYihJTlRSRkxBR1MoU0NwbnQtPmhvc3QtPmlvX3BvcnQpKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJbWIgPSBIT1NUREFUQShTQ3BudC0+aG9zdCktPm1iOworCW1iaSA9IEhPU1REQVRBKFNDcG50LT5ob3N0KS0+YWhhMTU0Ml9sYXN0X21iaV91c2VkICsgMTsKKwlpZiAobWJpID49IDIgKiBBSEExNTQyX01BSUxCT1hFUykKKwkJbWJpID0gQUhBMTU0Ml9NQUlMQk9YRVM7CisKKwlkbyB7CisJCWlmIChtYlttYmldLnN0YXR1cyAhPSAwKQorCQkJYnJlYWs7CisJCW1iaSsrOworCQlpZiAobWJpID49IDIgKiBBSEExNTQyX01BSUxCT1hFUykKKwkJCW1iaSA9IEFIQTE1NDJfTUFJTEJPWEVTOworCX0gd2hpbGUgKG1iaSAhPSBIT1NUREFUQShTQ3BudC0+aG9zdCktPmFoYTE1NDJfbGFzdF9tYmlfdXNlZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisKKwlpZiAobWJbbWJpXS5zdGF0dXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJMb3N0IGludGVycnVwdCBkaXNjb3ZlcmVkIG9uIGlycSAlZCAtIGF0dGVtcHRpbmcgdG8gcmVjb3ZlclxuIiwKKwkJICAgICAgIFNDcG50LT5ob3N0LT5pcnEpOworCQlhaGExNTQyX2ludHJfaGFuZGxlKFNDcG50LT5ob3N0LCBOVUxMKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIE9LLCBubyBsb3N0IGludGVycnVwdC4gIFRyeSBsb29raW5nIHRvIHNlZSBob3cgbWFueSBwZW5kaW5nIGNvbW1hbmRzCisJICAgd2UgdGhpbmsgd2UgaGF2ZS4gKi8KKworCWZvciAoaSA9IDA7IGkgPCBBSEExNTQyX01BSUxCT1hFUzsgaSsrKQorCQlpZiAoSE9TVERBVEEoU0NwbnQtPmhvc3QpLT5TQ2ludFtpXSkgeworCQkJaWYgKEhPU1REQVRBKFNDcG50LT5ob3N0KS0+U0NpbnRbaV0gPT0gU0NwbnQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlRpbWVkIG91dCBjb21tYW5kIHBlbmRpbmcgZm9yICVzXG4iLAorCQkJCSAgICAgICBTQ3BudC0+cmVxdWVzdC0+cnFfZGlzayA/CisJCQkJICAgICAgIFNDcG50LT5yZXF1ZXN0LT5ycV9kaXNrLT5kaXNrX25hbWUgOiAiPyIKKwkJCQkgICAgICAgKTsKKwkJCQlpZiAoSE9TVERBVEEoU0NwbnQtPmhvc3QpLT5tYltpXS5zdGF0dXMpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJPR01CIHN0aWxsIGZ1bGwgLSByZXN0YXJ0aW5nXG4iKTsKKwkJCQkJYWhhMTU0Ml9vdXQoU0NwbnQtPmhvc3QtPmlvX3BvcnQsICZhaGFjbWQsIDEpOworCQkJCX07CisJCQl9IGVsc2UKKwkJCQlwcmludGsoS0VSTl9FUlIgIk90aGVyIHBlbmRpbmcgY29tbWFuZCAlc1xuIiwKKwkJCQkgICAgICAgU0NwbnQtPnJlcXVlc3QtPnJxX2Rpc2sgPworCQkJCSAgICAgICBTQ3BudC0+cmVxdWVzdC0+cnFfZGlzay0+ZGlza19uYW1lIDogIj8iCisJCQkJICAgICAgICk7CisJCX0KKyNlbmRpZgorCisJREVCKHByaW50aygiYWhhMTU0Ml9hYm9ydFxuIikpOworI2lmIDAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJZm9yIChtYm8gPSAwOyBtYm8gPCBBSEExNTQyX01BSUxCT1hFUzsgbWJvKyspIHsKKwkJaWYgKFNDcG50ID09IEhPU1REQVRBKFNDcG50LT5ob3N0KS0+U0NpbnRbbWJvXSkgeworCQkJbWJbbWJvXS5zdGF0dXMgPSAyOwkvKiBBYm9ydCBjb21tYW5kICovCisJCQlhaGExNTQyX291dChTQ3BudC0+aG9zdC0+aW9fcG9ydCwgJmFoYWNtZCwgMSk7CS8qIHN0YXJ0IHNjc2kgY29tbWFuZCAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoQUhBMTU0Ml9NQUlMQk9YRVMgPT0gbWJvKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhaGExNTQyX2xvY2ssIGZsYWdzKTsKKyNlbmRpZgorCXJldHVybiBTQ1NJX0FCT1JUX1NOT09aRTsKK30KKworLyogV2UgZG8gbm90IGltcGxlbWVudCBhIHJlc2V0IGZ1bmN0aW9uIGhlcmUsIGJ1dCB0aGUgdXBwZXIgbGV2ZWwgY29kZQorICAgYXNzdW1lcyB0aGF0IGl0IHdpbGwgZ2V0IHNvbWUga2luZCBvZiByZXNwb25zZSBmb3IgdGhlIGNvbW1hbmQgaW4KKyAgIFNDcG50LiAgV2UgbXVzdCBvYmxpZ2UsIG9yIHRoZSBjb21tYW5kIHdpbGwgaGFuZyB0aGUgc2NzaSBzeXN0ZW0uCisgICBGb3IgYSBmaXJzdCBnbywgd2UgYXNzdW1lIHRoYXQgdGhlIDE1NDIgbm90aWZpZXMgdXMgd2l0aCBhbGwgb2YgdGhlCisgICBwZW5kaW5nIGNvbW1hbmRzIChpdCBkb2VzIGltcGxlbWVudCBzb2Z0IHJlc2V0LCBhZnRlciBhbGwpLiAqLworCitzdGF0aWMgaW50IGFoYTE1NDJfb2xkX3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50LCB1bnNpZ25lZCBpbnQgcmVzZXRfZmxhZ3MpCit7CisJdW5jaGFyIGFoYWNtZCA9IENNRF9TVEFSVF9TQ1NJOworCWludCBpOworCisJLyoKKwkgKiBTZWUgaWYgYSBidXMgcmVzZXQgd2FzIHN1Z2dlc3RlZC4KKwkgKi8KKwlpZiAocmVzZXRfZmxhZ3MgJiBTQ1NJX1JFU0VUX1NVR0dFU1RfQlVTX1JFU0VUKSB7CisJCS8qIAorCQkgKiBUaGlzIGRvZXMgYSBzY3NpIHJlc2V0IGZvciBhbGwgZGV2aWNlcyBvbiB0aGUgYnVzLgorCQkgKiBJbiBwcmluY2lwbGUsIHdlIGNvdWxkIGFsc28gcmVzZXQgdGhlIDE1NDIgLSBzaG91bGQKKwkJICogd2UgZG8gdGhpcz8gIFRyeSB0aGlzIGZpcnN0LCBhbmQgd2UgY2FuIGFkZCB0aGF0IGxhdGVyCisJCSAqIGlmIGl0IHR1cm5zIG91dCB0byBiZSB1c2VmdWwuCisJCSAqLworCQlvdXRiKEhSU1QgfCBTQ1JTVCwgQ09OVFJPTChTQ3BudC0+aG9zdC0+aW9fcG9ydCkpOworCisJCS8qCisJCSAqIFdhaXQgZm9yIHRoZSB0aGluZyB0byBzZXR0bGUgZG93biBhIGJpdC4gIFVuZm9ydHVuYXRlbHkKKwkJICogdGhpcyBpcyBnb2luZyB0byBiYXNpY2FsbHkgbG9jayB1cCB0aGUgbWFjaGluZSB3aGlsZSB3ZQorCQkgKiB3YWl0IGZvciB0aGlzIHRvIGNvbXBsZXRlLiAgVG8gYmUgMTAwJSBjb3JyZWN0LCB3ZSBuZWVkIHRvCisJCSAqIGNoZWNrIGZvciB0aW1lb3V0LCBhbmQgaWYgd2UgYXJlIGRvaW5nIHNvbWV0aGluZyBsaWtlIHRoaXMKKwkJICogd2UgYXJlIHByZXR0eSBkZXNwZXJhdGUgYW55d2F5cy4KKwkJICovCisJCVdBSVQoU1RBVFVTKFNDcG50LT5ob3N0LT5pb19wb3J0KSwKKwkJU1RBVE1BU0ssIElOSVQgfCBJRExFLCBTVFNUIHwgRElBR0YgfCBJTlZEQ01EIHwgREYgfCBDREYpOworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gZG8gdGhpcyB0b28gYmVmb3JlIHRoZSAxNTQyIGNhbiBpbnRlcmFjdCB3aXRoCisJCSAqIHVzIGFnYWluLgorCQkgKi8KKwkJc2V0dXBfbWFpbGJveGVzKFNDcG50LT5ob3N0LT5pb19wb3J0LCBTQ3BudC0+aG9zdCk7CisKKwkJLyoKKwkJICogTm93IHRyeSB0byBwaWNrIHVwIHRoZSBwaWVjZXMuICBSZXN0YXJ0IGFsbCBjb21tYW5kcworCQkgKiB0aGF0IGFyZSBjdXJyZW50bHkgYWN0aXZlIG9uIHRoZSBidXMsIGFuZCByZXNldCBhbGwgb2YKKwkJICogdGhlIGRhdGFzdHJ1Y3R1cmVzLiAgV2UgaGF2ZSBzb21lIHRpbWUgdG8ga2lsbCB3aGlsZQorCQkgKiB0aGluZ3Mgc2V0dGxlIGRvd24sIHNvIHByaW50IGEgbmljZSBtZXNzYWdlLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU2VudCBCVVMgUkVTRVQgdG8gc2NzaSBob3N0ICVkXG4iLCBTQ3BudC0+aG9zdC0+aG9zdF9ubyk7CisKKwkJZm9yIChpID0gMDsgaSA8IEFIQTE1NDJfTUFJTEJPWEVTOyBpKyspCisJCQlpZiAoSE9TVERBVEEoU0NwbnQtPmhvc3QpLT5TQ2ludFtpXSAhPSBOVUxMKSB7CisJCQkJU2NzaV9DbW5kICpTQ3RtcDsKKwkJCQlTQ3RtcCA9IEhPU1REQVRBKFNDcG50LT5ob3N0KS0+U0NpbnRbaV07CisJCQkJU0N0bXAtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwkJCQlpZiAoU0N0bXAtPmhvc3Rfc2NyaWJibGUpIHsKKwkJCQkJa2ZyZWUoU0N0bXAtPmhvc3Rfc2NyaWJibGUpOworCQkJCQlTQ3RtcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJCQkJfQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNlbmRpbmcgRElEX1JFU0VUIGZvciB0YXJnZXQgJWRcbiIsIFNDcG50LT50YXJnZXQpOworCQkJCVNDdG1wLT5zY3NpX2RvbmUoU0NwbnQpOworCisJCQkJSE9TVERBVEEoU0NwbnQtPmhvc3QpLT5TQ2ludFtpXSA9IE5VTEw7CisJCQkJSE9TVERBVEEoU0NwbnQtPmhvc3QpLT5tYltpXS5zdGF0dXMgPSAwOworCQkJfQorCQkvKgorCQkgKiBOb3cgdGVsbCB0aGUgbWlkLWxldmVsIGNvZGUgd2hhdCB3ZSBkaWQgaGVyZS4gIFNpbmNlCisJCSAqIHdlIGhhdmUgcmVzdGFydGVkIGFsbCBvZiB0aGUgb3V0c3RhbmRpbmcgY29tbWFuZHMsCisJCSAqIHRoZW4gcmVwb3J0IFNVQ0NFU1MuCisJCSAqLworCQlyZXR1cm4gKFNDU0lfUkVTRVRfU1VDQ0VTUyB8IFNDU0lfUkVTRVRfQlVTX1JFU0VUKTsKK2ZhaWw6CisJCXByaW50ayhLRVJOX0NSSVQgImFoYTE1NDIuYzogVW5hYmxlIHRvIHBlcmZvcm0gaGFyZCByZXNldC5cbiIpOworCQlwcmludGsoS0VSTl9DUklUICJQb3dlciBjeWNsZSBtYWNoaW5lIHRvIHJlc2V0XG4iKTsKKwkJcmV0dXJuIChTQ1NJX1JFU0VUX0VSUk9SIHwgU0NTSV9SRVNFVF9CVVNfUkVTRVQpOworCisKKwl9IGVsc2UgeworCQkvKiBUaGlzIGRvZXMgYSBzZWxlY3RpdmUgcmVzZXQgb2YganVzdCB0aGUgb25lIGRldmljZSAqLworCQkvKiBGaXJzdCBsb2NhdGUgdGhlIGNjYiBmb3IgdGhpcyBjb21tYW5kICovCisJCWZvciAoaSA9IDA7IGkgPCBBSEExNTQyX01BSUxCT1hFUzsgaSsrKQorCQkJaWYgKEhPU1REQVRBKFNDcG50LT5ob3N0KS0+U0NpbnRbaV0gPT0gU0NwbnQpIHsKKwkJCQlIT1NUREFUQShTQ3BudC0+aG9zdCktPmNjYltpXS5vcCA9IDB4ODE7CS8qIEJVUyBERVZJQ0UgUkVTRVQgKi8KKwkJCQkvKiBOb3cgdGVsbCB0aGUgMTU0MiB0byBmbHVzaCBhbGwgcGVuZGluZyBjb21tYW5kcyBmb3IgdGhpcyB0YXJnZXQgKi8KKwkJCQlhaGExNTQyX291dChTQ3BudC0+aG9zdC0+aW9fcG9ydCwgJmFoYWNtZCwgMSk7CisKKwkJCQkvKiBIZXJlIGlzIHRoZSB0cmlja3kgcGFydC4gIFdoYXQgdG8gZG8gbmV4dC4gIERvIHdlIGdldCBhbiBpbnRlcnJ1cHQKKwkJCQkgICBmb3IgdGhlIGNvbW1hbmRzIHRoYXQgd2UgYWJvcnRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LCBvcgorCQkJCSAgIGRvIHdlIGdlbmVyYXRlIHRoaXMgb24gb3VyIG93bj8gIFRyeSBpdCB3aXRob3V0IGZpcnN0IGFuZCBzZWUKKwkJCQkgICB3aGF0IGhhcHBlbnMgKi8KKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTZW50IEJVUyBERVZJQ0UgUkVTRVQgdG8gdGFyZ2V0ICVkXG4iLCBTQ3BudC0+dGFyZ2V0KTsKKworCQkJCS8qIElmIHRoZSBmaXJzdCBkb2VzIG5vdCB3b3JrLCB0aGVuIHRyeSB0aGUgc2Vjb25kLiAgSSB0aGluayB0aGUKKwkJCQkgICBmaXJzdCBvcHRpb24gaXMgbW9yZSBsaWtlbHkgdG8gYmUgY29ycmVjdC4gRnJlZSB0aGUgY29tbWFuZAorCQkJCSAgIGJsb2NrIGZvciBhbGwgY29tbWFuZHMgcnVubmluZyBvbiB0aGlzIHRhcmdldC4uLiAqLworCQkJCWZvciAoaSA9IDA7IGkgPCBBSEExNTQyX01BSUxCT1hFUzsgaSsrKQorCQkJCQlpZiAoSE9TVERBVEEoU0NwbnQtPmhvc3QpLT5TQ2ludFtpXSAmJgorCQkJCQkgICAgSE9TVERBVEEoU0NwbnQtPmhvc3QpLT5TQ2ludFtpXS0+dGFyZ2V0ID09IFNDcG50LT50YXJnZXQpIHsKKwkJCQkJCVNjc2lfQ21uZCAqU0N0bXA7CisJCQkJCQlTQ3RtcCA9IEhPU1REQVRBKFNDcG50LT5ob3N0KS0+U0NpbnRbaV07CisJCQkJCQlTQ3RtcC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQkJCQkJaWYgKFNDdG1wLT5ob3N0X3NjcmliYmxlKSB7CisJCQkJCQkJa2ZyZWUoU0N0bXAtPmhvc3Rfc2NyaWJibGUpOworCQkJCQkJCVNDdG1wLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwkJCQkJCX0KKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNlbmRpbmcgRElEX1JFU0VUIGZvciB0YXJnZXQgJWRcbiIsIFNDcG50LT50YXJnZXQpOworCQkJCQkJU0N0bXAtPnNjc2lfZG9uZShTQ3BudCk7CisKKwkJCQkJCUhPU1REQVRBKFNDcG50LT5ob3N0KS0+U0NpbnRbaV0gPSBOVUxMOworCQkJCQkJSE9TVERBVEEoU0NwbnQtPmhvc3QpLT5tYltpXS5zdGF0dXMgPSAwOworCQkJCQl9CisJCQkJcmV0dXJuIFNDU0lfUkVTRVRfU1VDQ0VTUzsKKwkJCX0KKwl9CisJLyogTm8gYWN0aXZlIGNvbW1hbmQgYXQgdGhpcyB0aW1lLCBzbyB0aGlzIG1lYW5zIHRoYXQgZWFjaCB0aW1lIHdlIGdvdAorCSAgIHNvbWUga2luZCBvZiByZXNwb25zZSB0aGUgbGFzdCB0aW1lIHRocm91Z2guICBUZWxsIHRoZSBtaWQtbGV2ZWwgY29kZQorCSAgIHRvIHJlcXVlc3Qgc2Vuc2UgaW5mb3JtYXRpb24gaW4gb3JkZXIgdG8gZGVjaWRlIHdoYXQgdG8gZG8gbmV4dC4gKi8KKwlyZXR1cm4gU0NTSV9SRVNFVF9QVU5UOworfQorI2VuZGlmICAgIC8qIGVuZCBvZiBiaWcgY29tbWVudCBibG9jayBhcm91bmQgb2xkX2Fib3J0ICsgb2xkX3Jlc2V0ICovCisKK3N0YXRpYyBpbnQgYWhhMTU0Ml9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICppcCkKK3sKKwlpbnQgdHJhbnNsYXRpb25fYWxnb3JpdGhtOworCWludCBzaXplID0gY2FwYWNpdHk7CisKKwl0cmFuc2xhdGlvbl9hbGdvcml0aG0gPSBIT1NUREFUQShzZGV2LT5ob3N0KS0+Ymlvc190cmFuc2xhdGlvbjsKKworCWlmICgoc2l6ZSA+PiAxMSkgPiAxMDI0ICYmIHRyYW5zbGF0aW9uX2FsZ29yaXRobSA9PSBCSU9TX1RSQU5TTEFUSU9OXzI1NTYzKSB7CisJCS8qIFBsZWFzZSB2ZXJpZnkgdGhhdCB0aGlzIGlzIHRoZSBzYW1lIGFzIHdoYXQgRE9TIHJldHVybnMgKi8KKwkJaXBbMF0gPSAyNTU7CisJCWlwWzFdID0gNjM7CisJCWlwWzJdID0gc2l6ZSAvIDI1NSAvIDYzOworCX0gZWxzZSB7CisJCWlwWzBdID0gNjQ7CisJCWlwWzFdID0gMzI7CisJCWlwWzJdID0gc2l6ZSA+PiAxMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJhaGExNTQyIiwKKwkubmFtZQkJCT0gIkFkYXB0ZWMgMTU0MiIsCisJLmRldGVjdAkJCT0gYWhhMTU0Ml9kZXRlY3QsCisJLnJlbGVhc2UJCT0gYWhhMTU0Ml9yZWxlYXNlLAorCS5xdWV1ZWNvbW1hbmQJCT0gYWhhMTU0Ml9xdWV1ZWNvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBhaGExNTQyX2Fib3J0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcj0gYWhhMTU0Ml9kZXZfcmVzZXQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gYWhhMTU0Ml9idXNfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IGFoYTE1NDJfaG9zdF9yZXNldCwKKwkuYmlvc19wYXJhbQkJPSBhaGExNTQyX2Jpb3NwYXJhbSwKKwkuY2FuX3F1ZXVlCQk9IEFIQTE1NDJfTUFJTEJPWEVTLCAKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gQUhBMTU0Ml9TQ0FUVEVSLAorCS5jbWRfcGVyX2x1bgkJPSBBSEExNTQyX0NNRExVTiwKKwkudW5jaGVja2VkX2lzYV9kbWEJPSAxLCAKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWhhMTU0Mi5oIGIvZHJpdmVycy9zY3NpL2FoYTE1NDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDAyMzUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FoYTE1NDIuaApAQCAtMCwwICsxLDE1MSBAQAorI2lmbmRlZiBfQUhBMTU0Ml9ICisKKy8qICRJZDogYWhhMTU0Mi5oLHYgMS4xIDE5OTIvMDcvMjQgMDY6Mjc6Mzggcm9vdCBFeHAgcm9vdCAkCisgKgorICogSGVhZGVyIGZpbGUgZm9yIHRoZSBhZGFwdGVjIDE1NDIgZHJpdmVyIGZvciBMaW51eAorICoKKyAqICRMb2c6IGFoYTE1NDIuaCx2ICQKKyAqIFJldmlzaW9uIDEuMSAgMTk5Mi8wNy8yNCAgMDY6Mjc6MzggIHJvb3QKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKiBSZXZpc2lvbiAxLjIgIDE5OTIvMDcvMDQgIDE4OjQxOjQ5ICByb290CisgKiBSZXBsYWNlZCBkaXN0cmlidXRpb24gd2l0aCBjdXJyZW50IGRyaXZlcnMKKyAqCisgKiBSZXZpc2lvbiAxLjMgIDE5OTIvMDYvMjMgIDIzOjU4OjIwICByb290CisgKiBGaXhlcy4KKyAqCisgKiBSZXZpc2lvbiAxLjIgIDE5OTIvMDUvMjYgIDIyOjEzOjIzICByb290CisgKiBDaGFuZ2VkIGJ1ZyB0aGF0IHByZXZlbnRlZCBETUEgYWJvdmUgZmlyc3QgMiBtYnl0ZXMuCisgKgorICogUmV2aXNpb24gMS4xICAxOTkyLzA1LzIyICAyMTowMDoyOSAgcm9vdAorICogSW5pdGlhbCByZXZpc2lvbgorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5Mi8wNC8yNCAgMTg6MDE6NTAgIHJvb3QKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKiBSZXZpc2lvbiAxLjEgIDE5OTIvMDQvMDIgIDAzOjIzOjEzICBkcmV3CisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorICogUmV2aXNpb24gMS4zICAxOTkyLzAxLzI3ICAxNDo0NjoyOSAgdHRob3JuCisgKiAqKiogZW1wdHkgbG9nIG1lc3NhZ2UgKioqCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBJL08gUG9ydCBpbnRlcmZhY2UgNC4yICovCisvKiBSRUFEICovCisjZGVmaW5lIFNUQVRVUyhiYXNlKSBiYXNlCisjZGVmaW5lIFNUU1QJMHg4MAkJLyogU2VsZiBUZXN0IGluIFByb2dyZXNzICovCisjZGVmaW5lIERJQUdGCTB4NDAJCS8qIEludGVybmFsIERpYWdub3N0aWMgRmFpbHVyZSAqLworI2RlZmluZSBJTklUCTB4MjAJCS8qIE1haWxib3ggSW5pdGlhbGl6YXRpb24gUmVxdWlyZWQgKi8KKyNkZWZpbmUgSURMRQkweDEwCQkvKiBTQ1NJIEhvc3QgQWRhcHRlciBJZGxlICovCisjZGVmaW5lIENERgkweDA4CQkvKiBDb21tYW5kL0RhdGEgT3V0IFBvcnQgRnVsbCAqLworI2RlZmluZSBERgkweDA0CQkvKiBEYXRhIEluIFBvcnQgRnVsbCAqLworI2RlZmluZSBJTlZEQ01ECTB4MDEJCS8qIEludmFsaWQgSCBBIENvbW1hbmQgKi8KKyNkZWZpbmUgU1RBVE1BU0sgMHhmZAkJLyogMHgwMiBpcyByZXNlcnZlZCAqLworCisjZGVmaW5lIElOVFJGTEFHUyhiYXNlKSAoU1RBVFVTKGJhc2UpKzIpCisjZGVmaW5lIEFOWUlOVFIJMHg4MAkJLyogQW55IEludGVycnVwdCAqLworI2RlZmluZSBTQ1JECTB4MDgJCS8qIFNDU0kgUmVzZXQgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgSEFDQwkweDA0CQkvKiBIQSBDb21tYW5kIENvbXBsZXRlICovCisjZGVmaW5lIE1CT0EJMHgwMgkJLyogTUJPIEVtcHR5ICovCisjZGVmaW5lIE1CSUYJMHgwMQkJLyogTUJJIEZ1bGwgKi8KKyNkZWZpbmUgSU5UUk1BU0sgMHg4ZgorCisvKiBXUklURSAqLworI2RlZmluZSBDT05UUk9MKGJhc2UpIFNUQVRVUyhiYXNlKQorI2RlZmluZSBIUlNUCTB4ODAJCS8qIEhhcmQgUmVzZXQgKi8KKyNkZWZpbmUgU1JTVAkweDQwCQkvKiBTb2Z0IFJlc2V0ICovCisjZGVmaW5lIElSU1QJMHgyMAkJLyogSW50ZXJydXB0IFJlc2V0ICovCisjZGVmaW5lIFNDUlNUCTB4MTAJCS8qIFNDU0kgQnVzIFJlc2V0ICovCisKKy8qIFJFQUQvV1JJVEUgKi8KKyNkZWZpbmUgREFUQShiYXNlKSAoU1RBVFVTKGJhc2UpKzEpCisjZGVmaW5lIENNRF9OT1AJCTB4MDAJLyogTm8gT3BlcmF0aW9uICovCisjZGVmaW5lIENNRF9NQklOSVQJMHgwMQkvKiBNYWlsYm94IEluaXRpYWxpemF0aW9uICovCisjZGVmaW5lIENNRF9TVEFSVF9TQ1NJCTB4MDIJLyogU3RhcnQgU0NTSSBDb21tYW5kICovCisjZGVmaW5lIENNRF9JTlFVSVJZCTB4MDQJLyogQWRhcHRlciBJbnF1aXJ5ICovCisjZGVmaW5lIENNRF9FTUJPSQkweDA1CS8qIEVuYWJsZSBNYWlsQm94IE91dCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQ01EX0JVU09OX1RJTUUJMHgwNwkvKiBTZXQgQnVzLU9uIFRpbWUgKi8KKyNkZWZpbmUgQ01EX0JVU09GRl9USU1FCTB4MDgJLyogU2V0IEJ1cy1PZmYgVGltZSAqLworI2RlZmluZSBDTURfRE1BU1BFRUQJMHgwOQkvKiBTZXQgQVQgQnVzIFRyYW5zZmVyIFNwZWVkICovCisjZGVmaW5lIENNRF9SRVRERVZTCTB4MGEJLyogUmV0dXJuIEluc3RhbGxlZCBEZXZpY2VzICovCisjZGVmaW5lIENNRF9SRVRDT05GCTB4MGIJLyogUmV0dXJuIENvbmZpZ3VyYXRpb24gRGF0YSAqLworI2RlZmluZSBDTURfUkVUU0VUVVAJMHgwZAkvKiBSZXR1cm4gU2V0dXAgRGF0YSAqLworI2RlZmluZSBDTURfRUNITwkweDFmCS8qIEVDSE8gQ29tbWFuZCBEYXRhICovCisKKyNkZWZpbmUgQ01EX0VYVEJJT1MgICAgIDB4MjggICAgLyogUmV0dXJuIGV4dGVuZCBiaW9zIGluZm9ybWF0aW9uIG9ubHkgMTU0MkMgKi8KKyNkZWZpbmUgQ01EX01CRU5BQkxFICAgIDB4MjkgICAgLyogU2V0IE1haWxib3ggSW50ZXJmYWNlIGVuYWJsZSBvbmx5IDE1NDJDICovCisKKy8qIE1haWxib3ggRGVmaW5pdGlvbiA1LjIuMSBhbmQgNS4yLjIgKi8KK3N0cnVjdCBtYWlsYm94IHsKKyAgdW5jaGFyIHN0YXR1czsJCS8qIENvbW1hbmQvU3RhdHVzICovCisgIHVuY2hhciBjY2JwdHJbM107CQkvKiBtc2IsIC4uLCBsc2IgKi8KK307CisKKy8qIFRoaXMgaXMgdXNlZCB3aXRoIHNjYXR0ZXItZ2F0aGVyICovCitzdHJ1Y3QgY2hhaW4geworICB1bmNoYXIgZGF0YWxlblszXTsJCS8qIFNpemUgb2YgdGhpcyBwYXJ0IG9mIGNoYWluICovCisgIHVuY2hhciBkYXRhcHRyWzNdOwkJLyogTG9jYXRpb24gb2YgZGF0YSAqLworfTsKKworLyogVGhlc2UgYmVsb25nIGluIHNjc2kuaCBhbHNvICovCitzdGF0aWMgaW5saW5lIHZvaWQgYW55MnNjc2kodTggKnAsIHUzMiB2KQoreworCXBbMF0gPSB2ID4+IDE2OworCXBbMV0gPSB2ID4+IDg7CisJcFsyXSA9IHY7Cit9CisKKyNkZWZpbmUgc2NzaTJpbnQodXApICggKCgobG9uZykqKHVwKSkgPDwgMTYpICsgKCgobG9uZykodXApWzFdKSA8PCA4KSArICgobG9uZykodXApWzJdKSApCisKKyNkZWZpbmUgeGFueTJzY3NpKHVwLCBwKQlcCisodXApWzBdID0gKChsb25nKShwKSkgPj4gMjQ7CVwKKyh1cClbMV0gPSAoKGxvbmcpKHApKSA+PiAxNjsJXAorKHVwKVsyXSA9ICgobG9uZykocCkpID4+IDg7CVwKKyh1cClbM10gPSAoKGxvbmcpKHApKTsKKworI2RlZmluZSB4c2NzaTJpbnQodXApICggKCgobG9uZykodXApWzBdKSA8PCAyNCkgKyAoKChsb25nKSh1cClbMV0pIDw8IDE2KSBcCisJCSAgICAgICsgKCgobG9uZykodXApWzJdKSA8PCAgOCkgKyAgKChsb25nKSh1cClbM10pICkKKworI2RlZmluZSBNQVhfQ0RCIDEyCisjZGVmaW5lIE1BWF9TRU5TRSAxNAorCitzdHJ1Y3QgY2NiIHsJCQkvKiBDb21tYW5kIENvbnRyb2wgQmxvY2sgNS4zICovCisgIHVuY2hhciBvcDsJCQkvKiBDb21tYW5kIENvbnRyb2wgQmxvY2sgT3BlcmF0aW9uIENvZGUgKi8KKyAgdW5jaGFyIGlkbHVuOwkJCS8qIG9wPTAsMjpUYXJnZXQgSWQsIG9wPTE6SW5pdGlhdG9yIElkICovCisJCQkJLyogT3V0Ym91bmQgZGF0YSB0cmFuc2ZlciwgbGVuZ3RoIGlzIGNoZWNrZWQqLworCQkJCS8qIEluYm91bmQgZGF0YSB0cmFuc2ZlciwgbGVuZ3RoIGlzIGNoZWNrZWQgKi8KKwkJCQkvKiBMb2dpY2FsIFVuaXQgTnVtYmVyICovCisgIHVuY2hhciBjZGJsZW47CQkvKiBTQ1NJIENvbW1hbmQgTGVuZ3RoICovCisgIHVuY2hhciByc2FsZW47CQkvKiBSZXF1ZXN0IFNlbnNlIEFsbG9jYXRpb24gTGVuZ3RoL0Rpc2FibGUgKi8KKyAgdW5jaGFyIGRhdGFsZW5bM107CQkvKiBEYXRhIExlbmd0aCAobXNiLCAuLiwgbHNiKSAqLworICB1bmNoYXIgZGF0YXB0clszXTsJCS8qIERhdGEgUG9pbnRlciAqLworICB1bmNoYXIgbGlua3B0clszXTsJCS8qIExpbmsgUG9pbnRlciAqLworICB1bmNoYXIgY29tbWxpbmtpZDsJCS8qIENvbW1hbmQgTGlua2luZyBJZGVudGlmaWVyICovCisgIHVuY2hhciBoYXN0YXQ7CQkvKiBIb3N0IEFkYXB0ZXIgU3RhdHVzIChIQVNUQVQpICovCisgIHVuY2hhciB0YXJzdGF0OwkJLyogVGFyZ2V0IERldmljZSBTdGF0dXMgKi8KKyAgdW5jaGFyIHJlc2VydmVkWzJdOworICB1bmNoYXIgY2RiW01BWF9DREIrTUFYX1NFTlNFXTsvKiBTQ1NJIENvbW1hbmQgRGVzY3JpcHRvciBCbG9jayAqLworCQkJCS8qIFJFUVVFU1QgU0VOU0UgKi8KK307CisKK3N0YXRpYyBpbnQgYWhhMTU0Ml9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICopOworc3RhdGljIGludCBhaGExNTQyX3F1ZXVlY29tbWFuZChTY3NpX0NtbmQgKiwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSk7CitzdGF0aWMgaW50IGFoYTE1NDJfYWJvcnQoU2NzaV9DbW5kICogU0NwbnQpOworc3RhdGljIGludCBhaGExNTQyX2J1c19yZXNldChTY3NpX0NtbmQgKiBTQ3BudCk7CitzdGF0aWMgaW50IGFoYTE1NDJfZGV2X3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50KTsKK3N0YXRpYyBpbnQgYWhhMTU0Ml9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50KTsKKyNpZiAwCitzdGF0aWMgaW50IGFoYTE1NDJfb2xkX2Fib3J0KFNjc2lfQ21uZCAqIFNDcG50KTsKK3N0YXRpYyBpbnQgYWhhMTU0Ml9vbGRfcmVzZXQoU2NzaV9DbW5kICosIHVuc2lnbmVkIGludCk7CisjZW5kaWYKK3N0YXRpYyBpbnQgYWhhMTU0Ml9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICosIHN0cnVjdCBibG9ja19kZXZpY2UgKiwKKwkJc2VjdG9yX3QsIGludCAqKTsKKworI2RlZmluZSBBSEExNTQyX01BSUxCT1hFUyA4CisjZGVmaW5lIEFIQTE1NDJfU0NBVFRFUiAxNgorI2RlZmluZSBBSEExNTQyX0NNRExVTiAxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FoYTE3NDAuYyBiL2RyaXZlcnMvc2NzaS9haGExNzQwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmMzNlNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haGExNzQwLmMKQEAgLTAsMCArMSw3MDcgQEAKKy8qICAkSWQkCisgKiAgMTk5My8wMy8zMQorICogIGxpbnV4L2tlcm5lbC9haGExNzQwLmMKKyAqCisgKiAgQmFzZWQgbG9vc2VseSBvbiBhaGExNTQyLmMgd2hpY2ggaXMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIgIFRvbW15IFRob3JuIGFuZAorICogIE1vZGlmaWVkIGJ5IEVyaWMgWW91bmdkYWxlCisgKgorICogIFRoaXMgZmlsZSBpcyBhaGExNzQwLmMsIHdyaXR0ZW4gYW5kCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMgIEJyYWQgTWNMZWFuCisgKiAgYnJhZEBzYXR1cm4uZ2F5bG9yZC5jb20gb3IgYnJhZEBicmFkcGMuZ2F5bG9yZC5jb20uCisgKiAgCisgKiAgTW9kaWZpY2F0aW9ucyB0byBtYWtlY29kZSBhbmQgcXVldWVjb21tYW5kCisgKiAgZm9yIHByb3BlciBoYW5kbGluZyBvZiBtdWx0aXBsZSBkZXZpY2VzIGNvdXJ0ZW91c2x5CisgKiAgcHJvdmlkZWQgYnkgTWljaGFlbCBXZWxsZXIsIE1hcmNoLCAxOTkzCisgKgorICogIE11bHRpcGxlIGFkYXB0ZXIgc3VwcG9ydCwgZXh0ZW5kZWQgdHJhbnNsYXRpb24gZGV0ZWN0aW9uLAorICogIHVwZGF0ZSB0byBjdXJyZW50IHNjc2kgc3Vic3lzdGVtIGNoYW5nZXMsIHByb2MgZnMgc3VwcG9ydCwKKyAqICB3b3JraW5nICghKSBtb2R1bGUgc3VwcG9ydCBiYXNlZCBvbiBwYXRjaGVzIGZyb20gQW5kcmVhcyBBcmVucywKKyAqICBieSBBbmRyZWFzIERlZ2VydCA8YWRAcGFweXJ1cy5oYW1idXJnLmNvbT4sIDIvMTk5NworICoKKyAqIGFoYTE3NDBfbWFrZWNvZGUgbWF5IHN0aWxsIG5lZWQgZXZlbiBtb3JlIHdvcmsKKyAqIGlmIGl0IGRvZXNuJ3Qgd29yayBmb3IgeW91ciBkZXZpY2VzLCB0YWtlIGEgbG9vay4KKyAqCisgKiBSZXdvcmtlZCBmb3IgbmV3X2VoIGFuZCBuZXcgbG9ja2luZyBieSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqIENvbnZlcnRlZCB0byBFSVNBIGFuZCBnZW5lcmljIERNQSBBUElzIGJ5IE1hcmMgWnluZ2llcgorICogPG1hekB3aWxkLXdpbmQuZnIuZXUub3JnPiwgNC8yMDAzLgorICoKKyAqIFNoYXJlZCBpbnRlcnJ1cHQgc3VwcG9ydCBhZGRlZCBieSBSYXNrIEluZ2VtYW5uIExhbWJlcnRzZW4KKyAqIDxyYXNrQHN5Z2VodXMuZGs+LCAxMC8yMDAzCisgKgorICogRm9yIHRoZSBhdm9pZGFuY2Ugb2YgZG91YnQgdGhlICJwcmVmZXJyZWQgZm9ybSIgb2YgdGhpcyBjb2RlIGlzIG9uZSB3aGljaAorICogaXMgaW4gYW4gb3BlbiBub24gcGF0ZW50IGVuY3VtYmVyZWQgZm9ybWF0LiBXaGVyZSBjcnlwdG9ncmFwaGljIGtleSBzaWduaW5nCisgKiBmb3JtcyBwYXJ0IG9mIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIGV4ZWN1dGFibGUgdGhlIGluZm9ybWF0aW9uCisgKiBpbmNsdWRpbmcga2V5cyBuZWVkZWQgdG8gZ2VuZXJhdGUgYW4gZXF1aXZhbGVudGx5IGZ1bmN0aW9uYWwgZXhlY3V0YWJsZQorICogYXJlIGRlZW1lZCB0byBiZSBwYXJ0IG9mIHRoZSBzb3VyY2UgY29kZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9laXNhLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJhaGExNzQwLmgiCisKKy8qIElGIFlPVSBBUkUgSEFWSU5HIFBST0JMRU1TIFdJVEggVEhJUyBEUklWRVIsIEFORCBXQU5UIFRPIFdBVENICisgICBJVCBXT1JLLCBUSEVOOgorI2RlZmluZSBERUJVRworKi8KKyNpZmRlZiBERUJVRworI2RlZmluZSBERUIoeCkgeAorI2Vsc2UKKyNkZWZpbmUgREVCKHgpCisjZW5kaWYKKworc3RydWN0IGFoYTE3NDBfaG9zdGRhdGEgeworCXN0cnVjdCBlaXNhX2RldmljZSAqZWRldjsKKwl1bnNpZ25lZCBpbnQgdHJhbnNsYXRpb247CisJdW5zaWduZWQgaW50IGxhc3RfZWNiX3VzZWQ7CisJZG1hX2FkZHJfdCBlY2JfZG1hX2FkZHI7CisJc3RydWN0IGVjYiBlY2JbQUhBMTc0MF9FQ0JTXTsKK307CisKK3N0cnVjdCBhaGExNzQwX3NnIHsKKwlzdHJ1Y3QgYWhhMTc0MF9jaGFpbiBzZ19jaGFpbltBSEExNzQwX1NDQVRURVJdOworCWRtYV9hZGRyX3Qgc2dfZG1hX2FkZHI7CisJZG1hX2FkZHJfdCBidWZfZG1hX2FkZHI7Cit9OworCisjZGVmaW5lIEhPU1REQVRBKGhvc3QpICgoc3RydWN0IGFoYTE3NDBfaG9zdGRhdGEgKikgJmhvc3QtPmhvc3RkYXRhKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBlY2IgKmVjYl9kbWFfdG9fY3B1IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LAorCQkJCQkgIGRtYV9hZGRyX3QgZG1hKQoreworCXN0cnVjdCBhaGExNzQwX2hvc3RkYXRhICpoZGF0YSA9IEhPU1REQVRBIChob3N0KTsKKwlkbWFfYWRkcl90IG9mZnNldDsKKworCW9mZnNldCA9IGRtYSAtIGhkYXRhLT5lY2JfZG1hX2FkZHI7CisKKwlyZXR1cm4gKHN0cnVjdCBlY2IgKikoKChjaGFyICopIGhkYXRhLT5lY2IpICsgKHVuc2lnbmVkIGludCkgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGVjYl9jcHVfdG9fZG1hIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCB2b2lkICpjcHUpCit7CisJc3RydWN0IGFoYTE3NDBfaG9zdGRhdGEgKmhkYXRhID0gSE9TVERBVEEgKGhvc3QpOworCWRtYV9hZGRyX3Qgb2Zmc2V0OworICAgIAorCW9mZnNldCA9IChjaGFyICopIGNwdSAtIChjaGFyICopIGhkYXRhLT5lY2I7CisKKwlyZXR1cm4gaGRhdGEtPmVjYl9kbWFfYWRkciArIG9mZnNldDsKK30KKworc3RhdGljIGludCBhaGExNzQwX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCwgY2hhciAqYnVmZmVyLAorCQkJICAgICBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCSAgICAgaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworCWludCBsZW47CisJc3RydWN0IGFoYTE3NDBfaG9zdGRhdGEgKmhvc3Q7CisKKwlpZiAoaW5vdXQpCisJCXJldHVybi1FTk9TWVM7CisKKwlob3N0ID0gSE9TVERBVEEoc2hwbnQpOworCisJbGVuID0gc3ByaW50ZihidWZmZXIsICJhaGExNzR4IGF0IElPOiVseCwgSVJRICVkLCBTTE9UICVkLlxuIgorCQkgICAgICAiRXh0ZW5kZWQgdHJhbnNsYXRpb24gJXNhYmxlZC5cbiIsCisJCSAgICAgIHNocG50LT5pb19wb3J0LCBzaHBudC0+aXJxLCBob3N0LT5lZGV2LT5zbG90LAorCQkgICAgICBob3N0LT50cmFuc2xhdGlvbiA/ICJlbiIgOiAiZGlzIik7CisKKwlpZiAob2Zmc2V0ID4gbGVuKSB7CisJCSpzdGFydCA9IGJ1ZmZlcjsKKwkJcmV0dXJuIDA7CisJfQorCisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCWxlbiAtPSBvZmZzZXQ7CisJaWYgKGxlbiA+IGxlbmd0aCkKKwkJbGVuID0gbGVuZ3RoOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgYWhhMTc0MF9tYWtlY29kZSh1bmNoYXIgKnNlbnNlLCB1bmNoYXIgKnN0YXR1cykKK3sKKwlzdHJ1Y3Qgc3RhdHVzd29yZAorCXsKKwkJdXNob3J0CWRvbjoxLAkvKiBDb21tYW5kIERvbmUgLSBObyBFcnJvciAqLworCQkJZHU6MSwJLyogRGF0YSB1bmRlcnJ1biAqLworCQkgICAgOjEsCXFmOjEsCS8qIFF1ZXVlIGZ1bGwgKi8KKwkJICAgICAgICBzYzoxLAkvKiBTcGVjaWZpY2F0aW9uIENoZWNrICovCisJCSAgICAgICAgZG9yOjEsCS8qIERhdGEgb3ZlcnJ1biAqLworCQkgICAgICAgIGNoOjEsCS8qIENoYWluaW5nIEhhbHRlZCAqLworCQkgICAgICAgIGludHI6MSwJLyogSW50ZXJydXB0IGlzc3VlZCAqLworCQkgICAgICAgIGFzYToxLAkvKiBBZGRpdGlvbmFsIFN0YXR1cyBBdmFpbGFibGUgKi8KKwkJICAgICAgICBzbnM6MSwJLyogU2Vuc2UgaW5mb3JtYXRpb24gU3RvcmVkICovCisJCSAgICA6MSwJaW5pOjEsCS8qIEluaXRpYWxpemF0aW9uIFJlcXVpcmVkICovCisJCQltZToxLAkvKiBNYWpvciBlcnJvciBvciBleGNlcHRpb24gKi8KKwkJICAgIDoxLAllY2E6MSwgIC8qIEV4dGVuZGVkIENvbnRpbmdlbnQgYWxsaWFuY2UgKi8KKwkJICAgIDoxOworCX0gc3RhdHVzX3dvcmQ7CisJaW50IHJldHZhbCA9IERJRF9PSzsKKworCXN0YXR1c193b3JkID0gKiAoc3RydWN0IHN0YXR1c3dvcmQgKikgc3RhdHVzOworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJtYWtlY29kZSBmcm9tICV4LCV4LCV4LCV4ICV4LCV4LCV4LCV4IiwKKwkgICAgICAgc3RhdHVzWzBdLCBzdGF0dXNbMV0sIHN0YXR1c1syXSwgc3RhdHVzWzNdLAorCSAgICAgICBzZW5zZVswXSwgc2Vuc2VbMV0sIHNlbnNlWzJdLCBzZW5zZVszXSk7CisjZW5kaWYKKwlpZiAoIXN0YXR1c193b3JkLmRvbikgeyAvKiBBbnl0aGluZyBhYm5vcm1hbCB3YXMgZGV0ZWN0ZWQgKi8KKwkJaWYgKCAoc3RhdHVzWzFdJjB4MTgpIHx8IHN0YXR1c193b3JkLnNjICkgeworCQkJLypBZGRpdGlvbmFsIGluZm8gYXZhaWxhYmxlKi8KKwkJCS8qIFVzZSB0aGUgc3VwcGxpZWQgaW5mbyBmb3IgZnVydGhlciBkaWFnbm9zdGljcyAqLworCQkJc3dpdGNoICggc3RhdHVzWzJdICkgeworCQkJY2FzZSAweDEyOgorCQkJCWlmICggc3RhdHVzX3dvcmQuZG9yICkKKwkJCQkJcmV0dmFsPURJRF9FUlJPUjsgLyogSXQncyBhbiBPdmVycnVuICovCisJCQkJLyogSWYgbm90IG92ZXJydW4sIGFzc3VtZSB1bmRlcnJ1biBhbmQKKwkJCQkgKiBpZ25vcmUgaXQhICovCisJCQljYXNlIDB4MDA6IC8qIE5vIGluZm8sIGFzc3VtZSBubyBlcnJvciwgc2hvdWxkCisJCQkJICAgICogbm90IG9jY3VyICovCisJCQkJYnJlYWs7CisJCQljYXNlIDB4MTE6CisJCQljYXNlIDB4MjE6CisJCQkJcmV0dmFsPURJRF9USU1FX09VVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwYToKKwkJCQlyZXR2YWw9RElEX0JBRF9UQVJHRVQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDQ6CisJCQljYXNlIDB4MDU6CisJCQkJcmV0dmFsPURJRF9BQk9SVDsKKwkJCQkvKiBFaXRoZXIgYnkgdGhpcyBkcml2ZXIgb3IgdGhlCisJCQkJICogQUhBMTc0MCBpdHNlbGYgKi8KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dmFsPURJRF9FUlJPUjsgLyogTm8gZnVydGhlcgorCQkJCQkJICAgKiBkaWFnbm9zdGljcworCQkJCQkJICAgKiBwb3NzaWJsZSAqLworCQkJfQorCQl9IGVsc2UgeworCQkJLyogTWljaGFlbCBzdWdnZXN0cywgYW5kIEJyYWQgY29uY3VyczogKi8KKwkJCWlmICggc3RhdHVzX3dvcmQucWYgKSB7CisJCQkJcmV0dmFsID0gRElEX1RJTUVfT1VUOyAvKiBmb3JjZXMgYSByZWRvICovCisJCQkJLyogSSB0aGluayB0aGlzIHNwZWNpZmljIG9uZSBzaG91bGQKKwkJCQkgKiBub3QgaGFwcGVuIC1CcmFkICovCisJCQkJcHJpbnRrKCJhaGExNzQwLmM6IFdBUk5JTkc6IEFIQTE3NDAgcXVldWUgb3ZlcmZsb3chXG4iKTsKKwkJCX0gZWxzZQorCQkJCWlmICggc3RhdHVzWzBdJjB4NjAgKSB7CisJCQkJCSAvKiBEaWRuJ3QgZmluZCBhIGJldHRlciBlcnJvciAqLworCQkJCQlyZXR2YWwgPSBESURfRVJST1I7CisJCQkJfQorCQkJLyogSW4gYW55IG90aGVyIGNhc2UgcmV0dXJuIERJRF9PSyBzbyBmb3IgZXhhbXBsZQorCQkJICAgQ09ORElUSU9OX0NIRUNLUyBtYWtlIGl0IHRocm91Z2ggdG8gdGhlIGFwcHJvcHJpYXRlCisJCQkgICBkZXZpY2UgZHJpdmVyICovCisJCX0KKwl9CisJLyogVW5kZXIgYWxsIGNpcmN1bXN0YW5jZXMgc3VwcGx5IHRoZSB0YXJnZXQgc3RhdHVzIC1NaWNoYWVsICovCisJcmV0dXJuIHN0YXR1c1szXSB8IHJldHZhbCA8PCAxNjsKK30KKworc3RhdGljIGludCBhaGExNzQwX3Rlc3RfcG9ydCh1bnNpZ25lZCBpbnQgYmFzZSkKK3sKKwlpZiAoIGluYihQT1JUQURSKGJhc2UpKSAmIFBPUlRBRERSX0VOSCApCisJCXJldHVybiAxOyAgIC8qIE9rYXksIHdlJ3JlIGFsbCBzZXQgKi8KKwkKKwlwcmludGsoImFoYTE3NHg6IEJvYXJkIGRldGVjdGVkLCBidXQgbm90IGluIGVuaGFuY2VkIG1vZGUsIHNvIGRpc2FibGVkIGl0LlxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIEEgImhpZ2giIGxldmVsIGludGVycnVwdCBoYW5kbGVyICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWhhMTc0MF9pbnRyX2hhbmRsZShpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSAoc3RydWN0IFNjc2lfSG9zdCAqKSBkZXZfaWQ7CisgICAgICAgIHZvaWQgKCpteV9kb25lKShTY3NpX0NtbmQgKik7CisJaW50IGVycnN0YXR1cywgYWRhcHN0YXQ7CisJaW50IG51bWJlcl9zZXJ2aWNlZDsKKwlzdHJ1Y3QgZWNiICplY2JwdHI7CisJU2NzaV9DbW5kICpTQ3RtcDsKKwl1bnNpZ25lZCBpbnQgYmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBoYW5kbGVkID0gMDsKKwlzdHJ1Y3QgYWhhMTc0MF9zZyAqc2dwdHI7CisJc3RydWN0IGVpc2FfZGV2aWNlICplZGV2OworCQorCWlmICghaG9zdCkKKwkJcGFuaWMoImFoYTE3NDAuYzogSXJxIGZyb20gdW5rbm93biBob3N0IVxuIik7CisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJYmFzZSA9IGhvc3QtPmlvX3BvcnQ7CisJbnVtYmVyX3NlcnZpY2VkID0gMDsKKwllZGV2ID0gSE9TVERBVEEoaG9zdCktPmVkZXY7CisKKwl3aGlsZShpbmIoRzJTVEFUKGJhc2UpKSAmIEcyU1RBVF9JTlRQRU5EKSB7CisJCWhhbmRsZWQgPSAxOworCQlERUIocHJpbnRrKCJhaGExNzQwX2ludHIgdG9wIG9mIGxvb3AuXG4iKSk7CisJCWFkYXBzdGF0ID0gaW5iKEcySU5UU1QoYmFzZSkpOworCQllY2JwdHIgPSBlY2JfZG1hX3RvX2NwdSAoaG9zdCwgaW5sKE1CT1hJTjAoYmFzZSkpKTsKKwkJb3V0YihHMkNOVFJMX0lSU1QsRzJDTlRSTChiYXNlKSk7IC8qIGludGVycnVwdCByZXNldCAqLworICAgICAgCisJCXN3aXRjaCAoIGFkYXBzdGF0ICYgRzJJTlRTVF9NQVNLICkgeworCQljYXNlCUcySU5UU1RfQ0NCUkVUUlk6CisJCWNhc2UJRzJJTlRTVF9DQ0JFUlJPUjoKKwkJY2FzZQlHMklOVFNUX0NDQkdPT0Q6CisJCQkvKiBIb3N0IFJlYWR5IC0+IE1haWxib3ggaW4gY29tcGxldGUgKi8KKwkJCW91dGIoRzJDTlRSTF9IUkRZLEcyQ05UUkwoYmFzZSkpOworCQkJaWYgKCFlY2JwdHIpIHsKKwkJCQlwcmludGsoIkFoYTE3NDAgbnVsbCBlY2JwdHIgaW4gaW50ZXJydXB0ICgleCwleCwleCwlZClcbiIsCisJCQkJICAgICAgIGluYihHMlNUQVQoYmFzZSkpLGFkYXBzdGF0LAorCQkJCSAgICAgICBpbmIoRzJJTlRTVChiYXNlKSksIG51bWJlcl9zZXJ2aWNlZCsrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCVNDdG1wID0gZWNicHRyLT5TQ3BudDsKKwkJCWlmICghU0N0bXApIHsKKwkJCQlwcmludGsoIkFoYTE3NDAgbnVsbCBTQ3RtcCBpbiBpbnRlcnJ1cHQgKCV4LCV4LCV4LCVkKVxuIiwKKwkJCQkgICAgICAgaW5iKEcyU1RBVChiYXNlKSksYWRhcHN0YXQsCisJCQkJICAgICAgIGluYihHMklOVFNUKGJhc2UpKSwgbnVtYmVyX3NlcnZpY2VkKyspOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc2dwdHIgPSAoc3RydWN0IGFoYTE3NDBfc2cgKikgU0N0bXAtPmhvc3Rfc2NyaWJibGU7CisJCQlpZiAoU0N0bXAtPnVzZV9zZykgeworCQkJCS8qIFdlIHVzZWQgc2NhdHRlci1nYXRoZXIuCisJCQkJICAgRG8gdGhlIHVubWFwcGluZyBkYW5jZS4gKi8KKwkJCQlkbWFfdW5tYXBfc2cgKCZlZGV2LT5kZXYsCisJCQkJCSAgICAgIChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgU0N0bXAtPnJlcXVlc3RfYnVmZmVyLAorCQkJCQkgICAgICBTQ3RtcC0+dXNlX3NnLAorCQkJCQkgICAgICBTQ3RtcC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQkJfSBlbHNlIHsKKwkJCQlkbWFfdW5tYXBfc2luZ2xlICgmZWRldi0+ZGV2LAorCQkJCQkJICBzZ3B0ci0+YnVmX2RtYV9hZGRyLAorCQkJCQkJICBTQ3RtcC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCQkJICBETUFfQklESVJFQ1RJT05BTCk7CisJCQl9CisJICAgIAorCQkJLyogRnJlZSB0aGUgc2cgYmxvY2sgKi8KKwkJCWRtYV9mcmVlX2NvaGVyZW50ICgmZWRldi0+ZGV2LAorCQkJCQkgICBzaXplb2YgKHN0cnVjdCBhaGExNzQwX3NnKSwKKwkJCQkJICAgU0N0bXAtPmhvc3Rfc2NyaWJibGUsCisJCQkJCSAgIHNncHRyLT5zZ19kbWFfYWRkcik7CisJICAgIAorCQkJLyogRmV0Y2ggdGhlIHNlbnNlIGRhdGEsIGFuZCB0dWNrIGl0IGF3YXksIGluCisJCQkgICB0aGUgcmVxdWlyZWQgc2xvdC4gIFRoZSBBZGFwdGVjCisJCQkgICBhdXRvbWF0aWNhbGx5IGZldGNoZXMgaXQsIGFuZCB0aGVyZSBpcyBubworCQkJICAgZ3VhcmFudGVlIHRoYXQgd2Ugd2lsbCBzdGlsbCBoYXZlIGl0IGluIHRoZQorCQkJICAgY2RiIHdoZW4gd2UgY29tZSBiYWNrICovCisJCQlpZiAoIChhZGFwc3RhdCAmIEcySU5UU1RfTUFTSykgPT0gRzJJTlRTVF9DQ0JFUlJPUiApIHsKKwkJCQltZW1jcHkoU0N0bXAtPnNlbnNlX2J1ZmZlciwgZWNicHRyLT5zZW5zZSwgCisJCQkJICAgICAgIHNpemVvZihTQ3RtcC0+c2Vuc2VfYnVmZmVyKSk7CisJCQkJZXJyc3RhdHVzID0gYWhhMTc0MF9tYWtlY29kZShlY2JwdHItPnNlbnNlLGVjYnB0ci0+c3RhdHVzKTsKKwkJCX0gZWxzZQorCQkJCWVycnN0YXR1cyA9IDA7CisJCQlERUIoaWYgKGVycnN0YXR1cykKKwkJCSAgICBwcmludGsoImFoYTE3NDBfaW50cl9oYW5kbGU6IHJldHVybmluZyAlNnhcbiIsCisJCQkJICAgZXJyc3RhdHVzKSk7CisJCQlTQ3RtcC0+cmVzdWx0ID0gZXJyc3RhdHVzOworCQkJbXlfZG9uZSA9IGVjYnB0ci0+ZG9uZTsKKwkJCW1lbXNldChlY2JwdHIsMCxzaXplb2Yoc3RydWN0IGVjYikpOyAKKwkJCWlmICggbXlfZG9uZSApCisJCQkJbXlfZG9uZShTQ3RtcCk7CisJCQlicmVhazsKKwkJCQorCQljYXNlCUcySU5UU1RfSEFSREZBSUw6CisJCQlwcmludGsoS0VSTl9BTEVSVCAiYWhhMTc0MCBoYXJkd2FyZSBmYWlsdXJlIVxuIik7CisJCQlwYW5pYygiYWhhMTc0MC5jIik7CS8qIEdvb2RieWUgKi8KKwkJCQorCQljYXNlCUcySU5UU1RfQVNORVZFTlQ6CisJCQlwcmludGsoImFoYTE3NDAgYXN5bmNocm9ub3VzIGV2ZW50OiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkgICAgICAgYWRhcHN0YXQsCisJCQkgICAgICAgaW5iKE1CT1hJTjAoYmFzZSkpLAorCQkJICAgICAgIGluYihNQk9YSU4xKGJhc2UpKSwKKwkJCSAgICAgICBpbmIoTUJPWElOMihiYXNlKSksCisJCQkgICAgICAgaW5iKE1CT1hJTjMoYmFzZSkpKTsgLyogU2F5IFdoYXQ/ICovCisJCQkvKiBIb3N0IFJlYWR5IC0+IE1haWxib3ggaW4gY29tcGxldGUgKi8KKwkJCW91dGIoRzJDTlRSTF9IUkRZLEcyQ05UUkwoYmFzZSkpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZQlHMklOVFNUX0NNREdPT0Q6CisJCQkvKiBzZXQgaW1tZWRpYXRlIGNvbW1hbmQgc3VjY2VzcyBmbGFnIGhlcmU6ICovCisJCQlicmVhazsKKwkJCQorCQljYXNlCUcySU5UU1RfQ01ERVJST1I6CisJCQkvKiBTZXQgaW1tZWRpYXRlIGNvbW1hbmQgZmFpbHVyZSBmbGFnIGhlcmU6ICovCisJCQlicmVhazsKKwkJfQorCQludW1iZXJfc2VydmljZWQrKzsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgaW50IGFoYTE3NDBfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqIFNDcG50LCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQoreworCXVuY2hhciBkaXJlY3Rpb247CisJdW5jaGFyICpjbWQgPSAodW5jaGFyICopIFNDcG50LT5jbW5kOworCXVuY2hhciB0YXJnZXQgPSBTQ3BudC0+ZGV2aWNlLT5pZDsKKwlzdHJ1Y3QgYWhhMTc0MF9ob3N0ZGF0YSAqaG9zdCA9IEhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCAqYnVmZiA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwlpbnQgYnVmZmxlbiA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW47CisJZG1hX2FkZHJfdCBzZ19kbWE7CisJc3RydWN0IGFoYTE3NDBfc2cgKnNncHRyOworCWludCBlY2JubzsKKwlERUIoaW50IGkpOworCisJaWYoKmNtZCA9PSBSRVFVRVNUX1NFTlNFKSB7CisJCVNDcG50LT5yZXN1bHQgPSAwOworCQlkb25lKFNDcG50KTsgCisJCXJldHVybiAwOworCX0KKworI2lmZGVmIERFQlVHCisJaWYgKCpjbWQgPT0gUkVBRF8xMCB8fCAqY21kID09IFdSSVRFXzEwKQorCQlpID0geHNjc2kyaW50KGNtZCsyKTsKKwllbHNlIGlmICgqY21kID09IFJFQURfNiB8fCAqY21kID09IFdSSVRFXzYpCisJCWkgPSBzY3NpMmludChjbWQrMik7CisJZWxzZQorCQlpID0gLTE7CisJcHJpbnRrKCJhaGExNzQwX3F1ZXVlY29tbWFuZDogZGV2ICVkIGNtZCAlMDJ4IHBvcyAlZCBsZW4gJWQgIiwKKwkgICAgICAgdGFyZ2V0LCAqY21kLCBpLCBidWZmbGVuKTsKKwlwcmludGsoInNjc2kgY21kOiIpOworCWZvciAoaSA9IDA7IGkgPCBTQ3BudC0+Y21kX2xlbjsgaSsrKSBwcmludGsoIiUwMnggIiwgY21kW2ldKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKworCS8qIGxvY2F0ZSBhbiBhdmFpbGFibGUgZWNiICovCisJc3Bpbl9sb2NrX2lycXNhdmUoU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJZWNibm8gPSBob3N0LT5sYXN0X2VjYl91c2VkICsgMTsgLyogQW4gb3B0aW1pemF0aW9uICovCisJaWYgKGVjYm5vID49IEFIQTE3NDBfRUNCUykKKwkJZWNibm8gPSAwOworCWRvIHsKKwkJaWYgKCFob3N0LT5lY2JbZWNibm9dLmNtZHcpCisJCQlicmVhazsKKwkJZWNibm8rKzsKKwkJaWYgKGVjYm5vID49IEFIQTE3NDBfRUNCUykKKwkJCWVjYm5vID0gMDsKKwl9IHdoaWxlIChlY2JubyAhPSBob3N0LT5sYXN0X2VjYl91c2VkKTsKKworCWlmIChob3N0LT5lY2JbZWNibm9dLmNtZHcpCisJCXBhbmljKCJVbmFibGUgdG8gZmluZCBlbXB0eSBlY2IgZm9yIGFoYTE3NDAuXG4iKTsKKworCWhvc3QtPmVjYltlY2Jub10uY21kdyA9IEFIQTE3NDBDTURfSU5JVDsgLyogU0NTSSBJbml0aWF0b3IgQ29tbWFuZAorCQkJCQkJICAgIGRvdWJsZXMgYXMgcmVzZXJ2ZWQgZmxhZyAqLworCisJaG9zdC0+bGFzdF9lY2JfdXNlZCA9IGVjYm5vOyAgICAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoIlNlbmRpbmcgY29tbWFuZCAoJWQgJXgpLi4uIiwgZWNibm8sIGRvbmUpOworI2VuZGlmCisKKwlob3N0LT5lY2JbZWNibm9dLmNkYmxlbiA9IFNDcG50LT5jbWRfbGVuOyAvKiBTQ1NJIENvbW1hbmQKKwkJCQkJCSAgICogRGVzY3JpcHRvciBCbG9jaworCQkJCQkJICAgKiBMZW5ndGggKi8KKworCWRpcmVjdGlvbiA9IDA7CisJaWYgKCpjbWQgPT0gUkVBRF8xMCB8fCAqY21kID09IFJFQURfNikKKwkJZGlyZWN0aW9uID0gMTsKKwllbHNlIGlmICgqY21kID09IFdSSVRFXzEwIHx8ICpjbWQgPT0gV1JJVEVfNikKKwkJZGlyZWN0aW9uID0gMDsKKworCW1lbWNweShob3N0LT5lY2JbZWNibm9dLmNkYiwgY21kLCBTQ3BudC0+Y21kX2xlbik7CisKKwlTQ3BudC0+aG9zdF9zY3JpYmJsZSA9IGRtYV9hbGxvY19jb2hlcmVudCAoJmhvc3QtPmVkZXYtPmRldiwKKwkJCQkJCSAgIHNpemVvZiAoc3RydWN0IGFoYTE3NDBfc2cpLAorCQkJCQkJICAgJnNnX2RtYSwgR0ZQX0FUT01JQyk7CisJaWYoU0NwbnQtPmhvc3Rfc2NyaWJibGUgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhaGExNzQwOiBvdXQgb2YgbWVtb3J5IGluIHF1ZXVlY29tbWFuZCFcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJc2dwdHIgPSAoc3RydWN0IGFoYTE3NDBfc2cgKikgU0NwbnQtPmhvc3Rfc2NyaWJibGU7CisJc2dwdHItPnNnX2RtYV9hZGRyID0gc2dfZG1hOworICAgIAorCWlmIChTQ3BudC0+dXNlX3NnKSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqIHNncG50OworCQlzdHJ1Y3QgYWhhMTc0MF9jaGFpbiAqIGNwdHI7CisJCWludCBpLCBjb3VudDsKKwkJREVCKHVuc2lnbmVkIGNoYXIgKiBwdHIpOworCisJCWhvc3QtPmVjYltlY2Jub10uc2cgPSAxOyAgLyogU0NTSSBJbml0aWF0b3IgQ29tbWFuZAorCQkJCQkgICAqIHcvc2NhdHRlci1nYXRoZXIqLworCQlzZ3BudCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCQljcHRyID0gc2dwdHItPnNnX2NoYWluOworCQljb3VudCA9IGRtYV9tYXBfc2cgKCZob3N0LT5lZGV2LT5kZXYsIHNncG50LCBTQ3BudC0+dXNlX3NnLAorCQkJCSAgICBTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQlmb3IoaT0wOyBpIDwgY291bnQ7IGkrKykgeworCQkJY3B0cltpXS5kYXRhbGVuID0gc2dfZG1hX2xlbiAoc2dwbnQgKyBpKTsKKwkJCWNwdHJbaV0uZGF0YXB0ciA9IHNnX2RtYV9hZGRyZXNzIChzZ3BudCArIGkpOworCQl9CisJCWhvc3QtPmVjYltlY2Jub10uZGF0YWxlbiA9IGNvdW50KnNpemVvZihzdHJ1Y3QgYWhhMTc0MF9jaGFpbik7CisJCWhvc3QtPmVjYltlY2Jub10uZGF0YXB0ciA9IHNnX2RtYTsKKyNpZmRlZiBERUJVRworCQlwcmludGsoImNwdHIgJXg6ICIsY3B0cik7CisJCXB0ciA9ICh1bnNpZ25lZCBjaGFyICopIGNwdHI7CisJCWZvcihpPTA7aTwyNDtpKyspIHByaW50aygiJTAyeCAiLCBwdHJbaV0pOworI2VuZGlmCisJfSBlbHNlIHsKKwkJaG9zdC0+ZWNiW2VjYm5vXS5kYXRhbGVuID0gYnVmZmxlbjsKKwkJc2dwdHItPmJ1Zl9kbWFfYWRkciA9ICBkbWFfbWFwX3NpbmdsZSAoJmhvc3QtPmVkZXYtPmRldiwKKwkJCQkJCSAgICAgICBidWZmLCBidWZmbGVuLAorCQkJCQkJICAgICAgIERNQV9CSURJUkVDVElPTkFMKTsKKwkJaG9zdC0+ZWNiW2VjYm5vXS5kYXRhcHRyID0gc2dwdHItPmJ1Zl9kbWFfYWRkcjsKKwl9CisJaG9zdC0+ZWNiW2VjYm5vXS5sdW4gPSBTQ3BudC0+ZGV2aWNlLT5sdW47CisJaG9zdC0+ZWNiW2VjYm5vXS5zZXMgPSAxOyAvKiBTdXBwcmVzcyB1bmRlcnJ1biBlcnJvcnMgKi8KKwlob3N0LT5lY2JbZWNibm9dLmRpciA9IGRpcmVjdGlvbjsKKwlob3N0LT5lY2JbZWNibm9dLmFycyA9IDE7IC8qIFllcywgZ2V0IHRoZSBzZW5zZSBvbiBhbiBlcnJvciAqLworCWhvc3QtPmVjYltlY2Jub10uc2Vuc2VsZW4gPSAxMjsKKwlob3N0LT5lY2JbZWNibm9dLnNlbnNlcHRyID0gZWNiX2NwdV90b19kbWEgKFNDcG50LT5kZXZpY2UtPmhvc3QsCisJCQkJCQkgICAgaG9zdC0+ZWNiW2VjYm5vXS5zZW5zZSk7CisJaG9zdC0+ZWNiW2VjYm5vXS5zdGF0dXNwdHIgPSBlY2JfY3B1X3RvX2RtYSAoU0NwbnQtPmRldmljZS0+aG9zdCwKKwkJCQkJCSAgICAgaG9zdC0+ZWNiW2VjYm5vXS5zdGF0dXMpOworCWhvc3QtPmVjYltlY2Jub10uZG9uZSA9IGRvbmU7CisJaG9zdC0+ZWNiW2VjYm5vXS5TQ3BudCA9IFNDcG50OworI2lmZGVmIERFQlVHCisJeworCQlpbnQgaTsKKwkJcHJpbnRrKCJhaGExNzQwX2NvbW1hbmQ6IHNlbmRpbmcuLiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihob3N0LT5lY2JbZWNibm9dKSAtIDEwOyBpKyspCisJCQlwcmludGsoIiUwMnggIiwgKCh1bmNoYXIgKikmaG9zdC0+ZWNiW2VjYm5vXSlbaV0pOworCX0KKwlwcmludGsoIlxuIik7CisjZW5kaWYKKwlpZiAoZG9uZSkgeworCS8qIFRoZSBBZGFwdGVjIFNwZWMgc2F5cyB0aGUgY2FyZCBpcyBzbyBmYXN0IHRoYXQgdGhlIGxvb3BzCisgICAgICAgICAgIHdpbGwgb25seSBiZSBleGVjdXRlZCBvbmNlIGluIHRoZSBjb2RlIGJlbG93LiBFdmVuIGlmIHRoaXMKKyAgICAgICAgICAgd2FzIHRydWUgd2l0aCB0aGUgZmFzdGVzdCBwcm9jZXNzb3JzIHdoZW4gdGhlIHNwZWMgd2FzCisgICAgICAgICAgIHdyaXR0ZW4sIGl0IGRvZXNuJ3Qgc2VlbSB0byBiZSB0cnVlIHdpdGggdG9kYXlzIGZhc3QKKyAgICAgICAgICAgcHJvY2Vzc29ycy4gV2UgcHJpbnQgYSB3YXJuaW5nIGlmIHRoZSBjb2RlIGlzIGV4ZWN1dGVkIG1vcmUKKyAgICAgICAgICAgb2Z0ZW4gdGhhbiBMT09QQ05UX1dBUk4uIElmIHRoaXMgaGFwcGVucywgaXQgc2hvdWxkIGJlCisgICAgICAgICAgIGludmVzdGlnYXRlZC4gSWYgdGhlIGNvdW50IHJlYWNoZXMgTE9PUENOVF9NQVgsIHdlIGFzc3VtZQorICAgICAgICAgICBzb21ldGhpbmcgaXMgYnJva2VuOyBzaW5jZSB0aGVyZSBpcyBubyB3YXkgdG8gcmV0dXJuIGFuCisgICAgICAgICAgIGVycm9yICh0aGUgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQgYnkgdGhlIG1pZC1sZXZlbCBzY3NpCisgICAgICAgICAgIGxheWVyKSB3ZSBoYXZlIHRvIHBhbmljIChhbmQgbWF5YmUgdGhhdCdzIHRoZSBiZXN0IHRoaW5nIHdlCisgICAgICAgICAgIGNhbiBkbyB0aGVuIGFueWhvdykuICovCisKKyNkZWZpbmUgTE9PUENOVF9XQVJOIDEwCQkvKiBleGNlc3NpdmUgbWJ4b3V0IHdhaXQgLT4gc3lzbG9nLW1zZyAqLworI2RlZmluZSBMT09QQ05UX01BWCAxMDAwMDAwCS8qIG1ieG91dCBkZWFkbG9jayAtPiBwYW5pYygpIGFmdGVyIH4gMiBzZWMuICovCisJCWludCBsb29wY250OworCQl1bnNpZ25lZCBpbnQgYmFzZSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisJCURFQihwcmludGsoImFoYTE3NDBbJWRdIGNyaXRpY2FsIHNlY3Rpb25cbiIsZWNibm8pKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZShTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJZm9yIChsb29wY250ID0gMDsgOyBsb29wY250KyspIHsKKwkJCWlmIChpbmIoRzJTVEFUKGJhc2UpKSAmIEcyU1RBVF9NQlhPVVQpIGJyZWFrOworCQkJaWYgKGxvb3BjbnQgPT0gTE9PUENOVF9XQVJOKSB7CisJCQkJcHJpbnRrKCJhaGExNzQwWyVkXV9tYnhvdXQgd2FpdCFcbiIsZWNibm8pOworCQkJfQorCQkJaWYgKGxvb3BjbnQgPT0gTE9PUENOVF9NQVgpCisJCQkJcGFuaWMoImFoYTE3NDAuYzogbWJ4b3V0IGJ1c3khXG4iKTsKKwkJfQorCQlvdXRsIChlY2JfY3B1X3RvX2RtYSAoU0NwbnQtPmRldmljZS0+aG9zdCwgaG9zdC0+ZWNiICsgZWNibm8pLAorCQkgICAgICBNQk9YT1VUMChiYXNlKSk7CisJCWZvciAobG9vcGNudCA9IDA7IDsgbG9vcGNudCsrKSB7CisJCQlpZiAoISAoaW5iKEcyU1RBVChiYXNlKSkgJiBHMlNUQVRfQlVTWSkpIGJyZWFrOworCQkJaWYgKGxvb3BjbnQgPT0gTE9PUENOVF9XQVJOKSB7CisJCQkJcHJpbnRrKCJhaGExNzQwWyVkXV9hdHRuIHdhaXQhXG4iLGVjYm5vKTsKKwkJCX0KKwkJCWlmIChsb29wY250ID09IExPT1BDTlRfTUFYKQorCQkJCXBhbmljKCJhaGExNzQwLmM6IGF0dG4gd2FpdCBmYWlsZWQhXG4iKTsKKwkJfQorCQlvdXRiKEFUVE5fU1RBUlQgfCAodGFyZ2V0ICYgNyksIEFUVE4oYmFzZSkpOyAvKiBTdGFydCBpdCB1cCAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlERUIocHJpbnRrKCJhaGExNzQwWyVkXSByZXF1ZXN0IHF1ZXVlZC5cbiIsZWNibm8pKTsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fQUxFUlQgImFoYTE3NDBfcXVldWVjb21tYW5kOiBkb25lIGNhbid0IGJlIE5VTExcbiIpOworCXJldHVybiAwOworfQorCisvKiBRdWVyeSB0aGUgYm9hcmQgZm9yIGl0cyBpcnFfbGV2ZWwgYW5kIGlycV90eXBlLiAgTm90aGluZyBlbHNlIG1hdHRlcnMKKyAgIGluIGVuaGFuY2VkIG1vZGUgb24gYW4gRUlTQSBidXMuICovCisKK3N0YXRpYyB2b2lkIGFoYTE3NDBfZ2V0Y29uZmlnKHVuc2lnbmVkIGludCBiYXNlLCB1bnNpZ25lZCBpbnQgKmlycV9sZXZlbCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqaXJxX3R5cGUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKnRyYW5zbGF0aW9uKQoreworCXN0YXRpYyBpbnQgaW50YWJbXSA9IHsgOSwgMTAsIDExLCAxMiwgMCwgMTQsIDE1LCAwIH07CisKKwkqaXJxX2xldmVsID0gaW50YWJbaW5iKElOVERFRihiYXNlKSkgJiAweDddOworCSppcnFfdHlwZSAgPSAoaW5iKElOVERFRihiYXNlKSkgJiAweDgpID4+IDM7CisJKnRyYW5zbGF0aW9uID0gaW5iKFJFU1YxKGJhc2UpKSAmIDB4MTsKKwlvdXRiKGluYihJTlRERUYoYmFzZSkpIHwgMHgxMCwgSU5UREVGKGJhc2UpKTsKK30KKworc3RhdGljIGludCBhaGExNzQwX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCQkgICAgIHN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwKKwkJCSAgICAgc2VjdG9yX3QgY2FwYWNpdHksIGludCogaXApCit7CisJaW50IHNpemUgPSBjYXBhY2l0eTsKKwlpbnQgZXh0ZW5kZWQgPSBIT1NUREFUQShzZGV2LT5ob3N0KS0+dHJhbnNsYXRpb247CisKKwlERUIocHJpbnRrKCJhaGExNzQwX2Jpb3NwYXJhbVxuIikpOworCWlmIChleHRlbmRlZCAmJiAoaXBbMl0gPiAxMDI0KSkJeworCQlpcFswXSA9IDI1NTsKKwkJaXBbMV0gPSA2MzsKKwkJaXBbMl0gPSBzaXplIC8gKDI1NSAqIDYzKTsKKwl9IGVsc2UgeworCQlpcFswXSA9IDY0OworCQlpcFsxXSA9IDMyOworCQlpcFsyXSA9IHNpemUgPj4gMTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFoYTE3NDBfZWhfYWJvcnRfaGFuZGxlciAoU2NzaV9DbW5kICpkdW1teSkKK3sKKy8qCisgKiBGcm9tIEFsYW4gQ294IDoKKyAqIFRoZSBBSEExNzQwIGhhcyBmaXJtd2FyZSBoYW5kbGVkIGFib3J0L3Jlc2V0IGhhbmRsaW5nLiBUaGUgImhlYWQgaW4KKyAqIHNhbmQiIGtlcm5lbCBjb2RlIGlzIGNvcnJlY3QgZm9yIG9uY2UgOCkKKyAqCisgKiBTbyB3ZSBkZWZpbmUgYSBkdW1teSBoYW5kbGVyIGp1c3QgdG8ga2VlcCB0aGUga2VybmVsIFNDU0kgY29kZSBhcworICogcXVpZXQgYXMgcG9zc2libGUuLi4KKyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgYWhhMTc0MF90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlICAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5wcm9jX25hbWUgICAgICAgID0gImFoYTE3NDAiLAorCS5wcm9jX2luZm8gICAgICAgID0gYWhhMTc0MF9wcm9jX2luZm8sCisJLm5hbWUgICAgICAgICAgICAgPSAiQWRhcHRlYyAxNzR4IChFSVNBKSIsCisJLnF1ZXVlY29tbWFuZCAgICAgPSBhaGExNzQwX3F1ZXVlY29tbWFuZCwKKwkuYmlvc19wYXJhbSAgICAgICA9IGFoYTE3NDBfYmlvc3BhcmFtLAorCS5jYW5fcXVldWUgICAgICAgID0gQUhBMTc0MF9FQ0JTLAorCS50aGlzX2lkICAgICAgICAgID0gNywKKwkuc2dfdGFibGVzaXplICAgICA9IEFIQTE3NDBfU0NBVFRFUiwKKwkuY21kX3Blcl9sdW4gICAgICA9IEFIQTE3NDBfQ01ETFVOLAorCS51c2VfY2x1c3RlcmluZyAgID0gRU5BQkxFX0NMVVNURVJJTkcsCisJLmVoX2Fib3J0X2hhbmRsZXIgPSBhaGExNzQwX2VoX2Fib3J0X2hhbmRsZXIsCit9OworCitzdGF0aWMgaW50IGFoYTE3NDBfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgc2xvdGJhc2U7CisJdW5zaWduZWQgaW50IGlycV9sZXZlbCwgaXJxX3R5cGUsIHRyYW5zbGF0aW9uOworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50OworCXN0cnVjdCBhaGExNzQwX2hvc3RkYXRhICpob3N0OworCXN0cnVjdCBlaXNhX2RldmljZSAqZWRldiA9IHRvX2Vpc2FfZGV2aWNlIChkZXYpOworCisJREVCKHByaW50aygiYWhhMTc0MF9wcm9iZTogXG4iKSk7CisJCisJc2xvdGJhc2UgPSBlZGV2LT5iYXNlX2FkZHIgKyBFSVNBX1ZFTkRPUl9JRF9PRkZTRVQ7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzbG90YmFzZSwgU0xPVFNJWkUsICJhaGExNzQwIikpIC8qIFNlZSBpZiBpbiB1c2UgKi8KKwkJcmV0dXJuIC1FQlVTWTsKKwlpZiAoIWFoYTE3NDBfdGVzdF9wb3J0KHNsb3RiYXNlKSkKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CisJYWhhMTc0MF9nZXRjb25maWcoc2xvdGJhc2UsJmlycV9sZXZlbCwmaXJxX3R5cGUsJnRyYW5zbGF0aW9uKTsKKwlpZiAoKGluYihHMlNUQVQoc2xvdGJhc2UpKSAmCisJICAgICAoRzJTVEFUX01CWE9VVHxHMlNUQVRfQlVTWSkpICE9IEcyU1RBVF9NQlhPVVQpIHsKKwkJLyogSWYgdGhlIGNhcmQgaXNuJ3QgcmVhZHksIGhhcmQgcmVzZXQgaXQgKi8KKwkJb3V0YihHMkNOVFJMX0hSU1QsIEcyQ05UUkwoc2xvdGJhc2UpKTsKKwkJb3V0YigwLCBHMkNOVFJMKHNsb3RiYXNlKSk7CisJfQorCXByaW50ayhLRVJOX0lORk8gIkNvbmZpZ3VyaW5nIHNsb3QgJWQgYXQgSU86JXgsIElSUSAldSAoJXMpXG4iLAorCSAgICAgICBlZGV2LT5zbG90LCBzbG90YmFzZSwgaXJxX2xldmVsLCBpcnFfdHlwZSA/ICJlZGdlIiA6ICJsZXZlbCIpOworCXByaW50ayhLRVJOX0lORk8gImFoYTE3NHg6IEV4dGVuZGVkIHRyYW5zbGF0aW9uICVzYWJsZWQuXG4iLAorCSAgICAgICB0cmFuc2xhdGlvbiA/ICJlbiIgOiAiZGlzIik7CisJc2hwbnQgPSBzY3NpX2hvc3RfYWxsb2MoJmFoYTE3NDBfdGVtcGxhdGUsCisJCQkgICAgICBzaXplb2Yoc3RydWN0IGFoYTE3NDBfaG9zdGRhdGEpKTsKKwlpZihzaHBudCA9PSBOVUxMKQorCQlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbjsKKworCXNocG50LT5iYXNlID0gMDsKKwlzaHBudC0+aW9fcG9ydCA9IHNsb3RiYXNlOworCXNocG50LT5uX2lvX3BvcnQgPSBTTE9UU0laRTsKKwlzaHBudC0+aXJxID0gaXJxX2xldmVsOworCXNocG50LT5kbWFfY2hhbm5lbCA9IDB4ZmY7CisJaG9zdCA9IEhPU1REQVRBKHNocG50KTsKKwlob3N0LT5lZGV2ID0gZWRldjsKKwlob3N0LT50cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uOworCWhvc3QtPmVjYl9kbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlICgmZWRldi0+ZGV2LCBob3N0LT5lY2IsCisJCQkJCSAgICAgc2l6ZW9mIChob3N0LT5lY2IpLAorCQkJCQkgICAgIERNQV9CSURJUkVDVElPTkFMKTsKKwlpZiAoIWhvc3QtPmVjYl9kbWFfYWRkcikgeworCQlwcmludGsgKEtFUk5fRVJSICJhaGExNzQwX3Byb2JlOiBDb3VsZG4ndCBtYXAgRUNCLCBnaXZpbmcgdXBcbiIpOworCQlzY3NpX3VucmVnaXN0ZXIgKHNocG50KTsKKwkJZ290byBlcnJfaG9zdF9wdXQ7CisJfQorCQorCURFQihwcmludGsoImFoYTE3NDBfcHJvYmU6IGVuYWJsZSBpbnRlcnJ1cHQgY2hhbm5lbCAlZFxuIixpcnFfbGV2ZWwpKTsKKwlpZiAocmVxdWVzdF9pcnEoaXJxX2xldmVsLGFoYTE3NDBfaW50cl9oYW5kbGUsaXJxX3R5cGUgPyAwIDogU0FfU0hJUlEsCisJCQkiYWhhMTc0MCIsc2hwbnQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWhhMTc0MF9wcm9iZTogVW5hYmxlIHRvIGFsbG9jYXRlIElSUSAlZC5cbiIsCisJCSAgICAgICBpcnFfbGV2ZWwpOworCQlnb3RvIGVycl91bm1hcDsKKwl9CisKKwllaXNhX3NldF9kcnZkYXRhIChlZGV2LCBzaHBudCk7CisJc2NzaV9hZGRfaG9zdCAoc2hwbnQsIGRldik7IC8qIFhYWCBoYW5kbGUgZmFpbHVyZSAqLworCXNjc2lfc2Nhbl9ob3N0IChzaHBudCk7CisJcmV0dXJuIDA7CisKKyBlcnJfdW5tYXA6CisJZG1hX3VubWFwX3NpbmdsZSAoJmVkZXYtPmRldiwgaG9zdC0+ZWNiX2RtYV9hZGRyLAorCQkJICBzaXplb2YgKGhvc3QtPmVjYiksIERNQV9CSURJUkVDVElPTkFMKTsKKyBlcnJfaG9zdF9wdXQ6CisJc2NzaV9ob3N0X3B1dCAoc2hwbnQpOworIGVycl9yZWxlYXNlX3JlZ2lvbjoKKwlyZWxlYXNlX3JlZ2lvbihzbG90YmFzZSwgU0xPVFNJWkUpOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBfX2RldmV4aXQgaW50IGFoYTE3NDBfcmVtb3ZlIChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBkZXYtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBhaGExNzQwX2hvc3RkYXRhICpob3N0ID0gSE9TVERBVEEgKHNocG50KTsKKworCXNjc2lfcmVtb3ZlX2hvc3Qoc2hwbnQpOworCQorCWZyZWVfaXJxIChzaHBudC0+aXJxLCBzaHBudCk7CisJZG1hX3VubWFwX3NpbmdsZSAoZGV2LCBob3N0LT5lY2JfZG1hX2FkZHIsCisJCQkgIHNpemVvZiAoaG9zdC0+ZWNiKSwgRE1BX0JJRElSRUNUSU9OQUwpOworCXJlbGVhc2VfcmVnaW9uIChzaHBudC0+aW9fcG9ydCwgU0xPVFNJWkUpOworCisJc2NzaV9ob3N0X3B1dCAoc2hwbnQpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVpc2FfZGV2aWNlX2lkIGFoYTE3NDBfaWRzW10gPSB7CisJeyAiQURQMDAwMCIgfSwJCS8qIDE3NDAgICovCisJeyAiQURQMDAwMSIgfSwJCS8qIDE3NDBBICovCisJeyAiQURQMDAwMiIgfSwJCS8qIDE3NDJBICovCisJeyAiQURQMDQwMCIgfSwJCS8qIDE3NDQgICovCisJeyAiIiB9Cit9OworCitzdGF0aWMgc3RydWN0IGVpc2FfZHJpdmVyIGFoYTE3NDBfZHJpdmVyID0geworCS5pZF90YWJsZSA9IGFoYTE3NDBfaWRzLAorCS5kcml2ZXIgICA9IHsKKwkJLm5hbWUgICAgPSAiYWhhMTc0MCIsCisJCS5wcm9iZSAgID0gYWhhMTc0MF9wcm9iZSwKKwkJLnJlbW92ZSAgPSBfX2RldmV4aXRfcCAoYWhhMTc0MF9yZW1vdmUpLAorCX0sCit9OworCitzdGF0aWMgX19pbml0IGludCBhaGExNzQwX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIGVpc2FfZHJpdmVyX3JlZ2lzdGVyICgmYWhhMTc0MF9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWhhMTc0MF9leGl0ICh2b2lkKQoreworCWVpc2FfZHJpdmVyX3VucmVnaXN0ZXIgKCZhaGExNzQwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0IChhaGExNzQwX2luaXQpOworbW9kdWxlX2V4aXQgKGFoYTE3NDBfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haGExNzQwLmggYi9kcml2ZXJzL3Njc2kvYWhhMTc0MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMjNmZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWhhMTc0MC5oCkBAIC0wLDAgKzEsMTU0IEBACisjaWZuZGVmIF9BSEExNzQwX0gKKworLyogJElkJAorICoKKyAqIEhlYWRlciBmaWxlIGZvciB0aGUgYWRhcHRlYyAxNzQwIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBXaXRoIG1pbm9yIHJldmlzaW9ucyAzLzMxLzkzCisgKiBXcml0dGVuIGFuZCAoQykgMTk5MiwxOTkzIEJyYWQgTWNMZWFuLiAgU2VlIGFoYTE3NDAuYworICogZm9yIG1vcmUgaW5mbworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBTTE9UU0laRQkweDVjCisKKy8qIEVJU0EgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgJiB2YWx1ZXMgKi8KKyNkZWZpbmUJSElEMChiYXNlKQkoYmFzZSArIDB4MCkKKyNkZWZpbmUJSElEMShiYXNlKQkoYmFzZSArIDB4MSkKKyNkZWZpbmUgSElEMihiYXNlKQkoYmFzZSArIDB4MikKKyNkZWZpbmUJSElEMyhiYXNlKQkoYmFzZSArIDB4MykKKyNkZWZpbmUJRUJDTlRSTChiYXNlKQkoYmFzZSArIDB4NCkKKyNkZWZpbmUJUE9SVEFEUihiYXNlKQkoYmFzZSArIDB4NDApCisjZGVmaW5lIEJJT1NBRFIoYmFzZSkJKGJhc2UgKyAweDQxKQorI2RlZmluZSBJTlRERUYoYmFzZSkJKGJhc2UgKyAweDQyKQorI2RlZmluZSBTQ1NJREVGKGJhc2UpCShiYXNlICsgMHg0MykKKyNkZWZpbmUgQlVTREVGKGJhc2UpCShiYXNlICsgMHg0NCkKKyNkZWZpbmUJUkVTVjAoYmFzZSkJKGJhc2UgKyAweDQ1KQorI2RlZmluZSBSRVNWMShiYXNlKQkoYmFzZSArIDB4NDYpCisjZGVmaW5lCVJFU1YyKGJhc2UpCShiYXNlICsgMHg0NykKKworI2RlZmluZQlISURfTUZHCSJBRFAiCisjZGVmaW5lCUhJRF9QUkQgMAorI2RlZmluZSBISURfUkVWIDIKKyNkZWZpbmUgRUJDTlRSTF9WQUxVRSAxCisjZGVmaW5lIFBPUlRBRERSX0VOSCAweDgwCisvKiBSRUFEICovCisjZGVmaW5lCUcySU5UU1QoYmFzZSkJKGJhc2UgKyAweDU2KQorI2RlZmluZSBHMlNUQVQoYmFzZSkJKGJhc2UgKyAweDU3KQorI2RlZmluZQlNQk9YSU4wKGJhc2UpCShiYXNlICsgMHg1OCkKKyNkZWZpbmUJTUJPWElOMShiYXNlKQkoYmFzZSArIDB4NTkpCisjZGVmaW5lCU1CT1hJTjIoYmFzZSkJKGJhc2UgKyAweDVhKQorI2RlZmluZQlNQk9YSU4zKGJhc2UpCShiYXNlICsgMHg1YikKKyNkZWZpbmUgRzJTVEFUMihiYXNlKQkoYmFzZSArIDB4NWMpCisKKyNkZWZpbmUgRzJJTlRTVF9NQVNLCQkweGYwCS8qIGlzb2xhdGUgdGhlIHN0YXR1cyAqLworI2RlZmluZQlHMklOVFNUX0NDQkdPT0QJCTB4MTAJLyogQ0NCIENvbXBsZXRlZCAqLworI2RlZmluZQlHMklOVFNUX0NDQlJFVFJZCTB4NTAJLyogQ0NCIENvbXBsZXRlZCB3aXRoIGEgcmV0cnkgKi8KKyNkZWZpbmUJRzJJTlRTVF9IQVJERkFJTAkweDcwCS8qIEFkYXB0ZXIgSGFyZHdhcmUgRmFpbHVyZSAqLworI2RlZmluZQlHMklOVFNUX0NNREdPT0QJCTB4YTAJLyogSW1tZWRpYXRlIGNvbW1hbmQgc3VjY2VzcyAqLworI2RlZmluZSBHMklOVFNUX0NDQkVSUk9SCTB4YzAJLyogQ0NCIENvbXBsZXRlZCB3aXRoIGVycm9yICovCisjZGVmaW5lCUcySU5UU1RfQVNORVZFTlQJMHhkMAkvKiBBc3luY2hyb25vdXMgRXZlbnQgTm90aWZpY2F0aW9uICovCisjZGVmaW5lCUcySU5UU1RfQ01ERVJST1IJMHhlMAkvKiBJbW1lZGlhdGUgY29tbWFuZCBlcnJvciAqLworCisjZGVmaW5lIEcyU1RBVF9NQlhPVVQJNAkvKiBNYWlsYm94IE91dCBFbXB0eSBCaXQgKi8KKyNkZWZpbmUJRzJTVEFUX0lOVFBFTkQJMgkvKiBJbnRlcnJ1cHQgUGVuZGluZyBCaXQgKi8KKyNkZWZpbmUJRzJTVEFUX0JVU1kJMQkvKiBCdXN5IEJpdCAoYXR0ZW50aW9uIHBlbmRpbmcpICovCisKKyNkZWZpbmUgRzJTVEFUMl9SRUFEWQkwCS8qIEhvc3QgUmVhZHkgQml0ICovCisKKy8qIFdSSVRFIChhbmQgUmVhZEJhY2spICovCisjZGVmaW5lCU1CT1hPVVQwKGJhc2UpCShiYXNlICsgMHg1MCkKKyNkZWZpbmUJTUJPWE9VVDEoYmFzZSkJKGJhc2UgKyAweDUxKQorI2RlZmluZQlNQk9YT1VUMihiYXNlKQkoYmFzZSArIDB4NTIpCisjZGVmaW5lCU1CT1hPVVQzKGJhc2UpCShiYXNlICsgMHg1MykKKyNkZWZpbmUJQVRUTihiYXNlKQkoYmFzZSArIDB4NTQpCisjZGVmaW5lIEcyQ05UUkwoYmFzZSkJKGJhc2UgKyAweDU1KQorCisjZGVmaW5lCUFUVE5fSU1NRUQJMHgxMAkvKiBJbW1lZGlhdGUgQ29tbWFuZCAqLworI2RlZmluZQlBVFROX1NUQVJUCTB4NDAJLyogU3RhcnQgQ0NCICovCisjZGVmaW5lCUFUVE5fQUJPUlQJMHg1MAkvKiBBYm9ydCBDQ0IgKi8KKworI2RlZmluZSBHMkNOVFJMX0hSU1QJMHg4MAkvKiBIYXJkIFJlc2V0ICovCisjZGVmaW5lIEcyQ05UUkxfSVJTVAkweDQwCS8qIENsZWFyIEVJU0EgSW50ZXJydXB0ICovCisjZGVmaW5lIEcyQ05UUkxfSFJEWQkweDIwCS8qIFNldHMgSE9TVCByZWFkeSAqLworCisvKiBUaGlzIGlzIHVzZWQgd2l0aCBzY2F0dGVyLWdhdGhlciAqLworc3RydWN0IGFoYTE3NDBfY2hhaW4geworCXUzMiBkYXRhcHRyOwkJLyogTG9jYXRpb24gb2YgZGF0YSAqLworCXUzMiBkYXRhbGVuOwkJLyogU2l6ZSBvZiB0aGlzIHBhcnQgb2YgY2hhaW4gKi8KK307CisKKy8qIFRoZXNlIGJlbG9uZyBpbiBzY3NpLmggKi8KKyNkZWZpbmUgYW55MnNjc2kodXAsIHApCQkJCVwKKyh1cClbMF0gPSAoKCh1bnNpZ25lZCBsb25nKShwKSkgPj4gMTYpICA7CVwKKyh1cClbMV0gPSAoKCh1bnNpZ25lZCBsb25nKShwKSkgPj4gOCk7CQlcCisodXApWzJdID0gKCh1bnNpZ25lZCBsb25nKShwKSk7CisKKyNkZWZpbmUgc2NzaTJpbnQodXApICggKCgobG9uZykqKHVwKSkgPDwgMTYpICsgKCgobG9uZykodXApWzFdKSA8PCA4KSArICgobG9uZykodXApWzJdKSApCisKKyNkZWZpbmUgeGFueTJzY3NpKHVwLCBwKQlcCisodXApWzBdID0gKChsb25nKShwKSkgPj4gMjQ7CVwKKyh1cClbMV0gPSAoKGxvbmcpKHApKSA+PiAxNjsJXAorKHVwKVsyXSA9ICgobG9uZykocCkpID4+IDg7CVwKKyh1cClbM10gPSAoKGxvbmcpKHApKTsKKworI2RlZmluZSB4c2NzaTJpbnQodXApICggKCgobG9uZykodXApWzBdKSA8PCAyNCkgKyAoKChsb25nKSh1cClbMV0pIDw8IDE2KSBcCisJCSAgICAgICsgKCgobG9uZykodXApWzJdKSA8PCAgOCkgKyAgKChsb25nKSh1cClbM10pICkKKworI2RlZmluZSBNQVhfQ0RCIDEyCisjZGVmaW5lIE1BWF9TRU5TRSAxNAorI2RlZmluZSBNQVhfU1RBVFVTIDMyCisKK3N0cnVjdCBlY2IgewkJCS8qIEVuaGFuY2VkIENvbnRyb2wgQmxvY2sgNi4xICovCisJdTE2IGNtZHc7CQkvKiBDb21tYW5kIFdvcmQgKi8KKwkvKiBGbGFnIFdvcmQgMSAqLworCXUxNiBjbmU6MSwJCS8qIENvbnRyb2wgQmxvY2sgQ2hhaW5pbmcgKi8KKwk6NiwgZGk6MSwJCS8qIERpc2FibGUgSW50ZXJydXB0ICovCisJOjIsIHNlczoxLAkJLyogU3VwcHJlc3MgVW5kZXJydW4gZXJyb3IgKi8KKwk6MSwgc2c6MSwJCS8qIFNjYXR0ZXIvR2F0aGVyICovCisJOjEsIGRzYjoxLAkJLyogRGlzYWJsZSBTdGF0dXMgQmxvY2sgKi8KKwkgYXJzOjE7CQkJLyogQXV0b21hdGljIFJlcXVlc3QgU2Vuc2UgKi8KKwkvKiBGbGFnIFdvcmQgMiAqLworCXUxNiBsdW46MywJCS8qIExvZ2ljYWwgVW5pdCAqLworCSB0YWc6MSwJCQkvKiBUYWdnZWQgUXVldWluZyAqLworCSB0dDoyLAkJCS8qIFRhZyBUeXBlICovCisJIG5kOjEsCQkJLyogTm8gRGlzY29ubmVjdCAqLworCToxLCBkYXQ6MSwJCS8qIERhdGEgdHJhbnNmZXIgLSBjaGVjayBkaXJlY3Rpb24gKi8KKwkgZGlyOjEsCQkJLyogRGlyZWN0aW9uIG9mIHRyYW5zZmVyIDEgPSBkYXRhaW4gKi8KKwkgc3Q6MSwJCQkvKiBTdXBwcmVzcyBUcmFuc2ZlciAqLworCSBjaGs6MSwJCQkvKiBDYWxjdWxhdGUgQ2hlY2tzdW0gKi8KKwk6MiwgcmVjOjEsOjE7CQkvKiBFcnJvciBSZWNvdmVyeSAqLworCXUxNiBuaWwwOwkJLyogbm90aGluZyAqLworCXUzMiBkYXRhcHRyOwkJLyogRGF0YSBvciBTY2F0dGVyIExpc3QgcHRyICovCisJdTMyIGRhdGFsZW47CQkvKiBEYXRhIG9yIFNjYXR0ZXIgTGlzdCBsZW4gKi8KKwl1MzIgc3RhdHVzcHRyOwkJLyogU3RhdHVzIEJsb2NrIHB0ciAqLworCXUzMiBsaW5rcHRyOwkJLyogQ2hhaW4gQWRkcmVzcyAqLworCXUzMiBuaWwxOwkJLyogbm90aGluZyAqLworCXUzMiBzZW5zZXB0cjsJCS8qIFNlbnNlIEluZm8gUG9pbnRlciAqLworCXU4IHNlbnNlbGVuOwkJLyogU2Vuc2UgTGVuZ3RoICovCisJdTggY2RibGVuOwkJLyogQ0RCIExlbmd0aCAqLworCXUxNiBkYXRhY2hlY2s7CQkvKiBEYXRhIGNoZWNrc3VtICovCisJdTggY2RiW01BWF9DREJdOwkvKiBDREIgYXJlYSAqLworLyogSGFyZHdhcmUgZGVmaW5lZCBwb3J0aW9uIGVuZHMgaGVyZSwgcmVzdCBpcyBkcml2ZXIgZGVmaW5lZCAqLworCXU4IHNlbnNlW01BWF9TRU5TRV07CS8qIFNlbnNlIGFyZWEgKi8KKwl1OCBzdGF0dXNbTUFYX1NUQVRVU107CS8qIFN0YXR1cyBhcmVhICovCisJU2NzaV9DbW5kICpTQ3BudDsJLyogTGluayB0byB0aGUgU0NTSSBDb21tYW5kIEJsb2NrICovCisJdm9pZCAoKmRvbmUpIChTY3NpX0NtbmQgKik7CS8qIENvbXBsZXRpb24gRnVuY3Rpb24gKi8KK307CisKKyNkZWZpbmUJQUhBMTc0MENNRF9OT1AJIDB4MDAJLyogTm8gT1AgKi8KKyNkZWZpbmUgQUhBMTc0MENNRF9JTklUCSAweDAxCS8qIEluaXRpYXRvciBTQ1NJIENvbW1hbmQgKi8KKyNkZWZpbmUgQUhBMTc0MENNRF9ESUFHCSAweDA1CS8qIFJ1biBEaWFnbm9zdGljIENvbW1hbmQgKi8KKyNkZWZpbmUgQUhBMTc0MENNRF9TQ1NJCSAweDA2CS8qIEluaXRpYWxpemUgU0NTSSAqLworI2RlZmluZSBBSEExNzQwQ01EX1NFTlNFIDB4MDgJLyogUmVhZCBTZW5zZSBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBBSEExNzQwQ01EX0RPV04gIDB4MDkJLyogRG93bmxvYWQgRmlybXdhcmUgKHllYWgsIEkgYmV0ISkgKi8KKyNkZWZpbmUgQUhBMTc0MENNRF9SSU5RICAweDBhCS8qIFJlYWQgSG9zdCBBZGFwdGVyIElucXVpcnkgRGF0YSAqLworI2RlZmluZSBBSEExNzQwQ01EX1RBUkcgIDB4MTAJLyogVGFyZ2V0IFNDU0kgQ29tbWFuZCAqLworCisjZGVmaW5lIEFIQTE3NDBfRUNCUyAzMgorI2RlZmluZSBBSEExNzQwX1NDQVRURVIgMTYKKyNkZWZpbmUgQUhBMTc0MF9DTURMVU4gMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haGNpLmMgYi9kcml2ZXJzL3Njc2kvYWhjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMTViMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWhjaS5jCkBAIC0wLDAgKzEsMTA2NSBAQAorLyoKKyAqICBhaGNpLmMgLSBBSENJIFNBVEEgc3VwcG9ydAorICoKKyAqICBDb3B5cmlnaHQgMjAwNCBSZWQgSGF0LCBJbmMuCisgKgorICogIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE9wZW4KKyAqICBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4xIHRoYXQgY2FuIGJlIGZvdW5kIGF0CisgKiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMS4xLnR4dCBhbmQgaXMgaW5jbHVkZWQgaGVyZWluCisgKiAgYnkgcmVmZXJlbmNlLgorICoKKyAqICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIikgYXMgZGlzdHJpYnV0ZWQKKyAqICBpbiB0aGUga2VybmVsIHNvdXJjZSBDT1BZSU5HIGZpbGUsIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YKKyAqICB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cKKyAqICB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiAgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCisgKiAgdGhlIE9TTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKKyAqICByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuCisgKiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91cgorICogIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUgT1NMIG9yIHRoZSBHUEwuCisgKgorICogVmVyc2lvbiAxLjAgb2YgdGhlIEFIQ0kgc3BlY2lmaWNhdGlvbjoKKyAqIGh0dHA6Ly93d3cuaW50ZWwuY29tL3RlY2hub2xvZ3kvc2VyaWFsYXRhL3BkZi9yZXYxXzAucGRmCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIERSVl9OQU1FCSJhaGNpIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wMCIKKworCitlbnVtIHsKKwlBSENJX1BDSV9CQVIJCT0gNSwKKwlBSENJX01BWF9TRwkJPSAxNjgsIC8qIGhhcmR3YXJlIG1heCBpcyA2NEsgKi8KKwlBSENJX0RNQV9CT1VOREFSWQk9IDB4ZmZmZmZmZmYsCisJQUhDSV9VU0VfQ0xVU1RFUklORwk9IDAsCisJQUhDSV9DTURfU0xPVF9TWgk9IDMyICogMzIsCisJQUhDSV9SWF9GSVNfU1oJCT0gMjU2LAorCUFIQ0lfQ01EX1RCTF9IRFIJPSAweDgwLAorCUFIQ0lfQ01EX1RCTF9TWgkJPSBBSENJX0NNRF9UQkxfSERSICsgKEFIQ0lfTUFYX1NHICogMTYpLAorCUFIQ0lfUE9SVF9QUklWX0RNQV9TWgk9IEFIQ0lfQ01EX1NMT1RfU1ogKyBBSENJX0NNRF9UQkxfU1ogKworCQkJCSAgQUhDSV9SWF9GSVNfU1osCisJQUhDSV9JUlFfT05fU0cJCT0gKDEgPDwgMzEpLAorCUFIQ0lfQ01EX0FUQVBJCQk9ICgxIDw8IDUpLAorCUFIQ0lfQ01EX1dSSVRFCQk9ICgxIDw8IDYpLAorCisJUlhfRklTX0QySF9SRUcJCT0gMHg0MCwJLyogb2Zmc2V0IG9mIEQySCBSZWdpc3RlciBGSVMgZGF0YSAqLworCisJYm9hcmRfYWhjaQkJPSAwLAorCisJLyogZ2xvYmFsIGNvbnRyb2xsZXIgcmVnaXN0ZXJzICovCisJSE9TVF9DQVAJCT0gMHgwMCwgLyogaG9zdCBjYXBhYmlsaXRpZXMgKi8KKwlIT1NUX0NUTAkJPSAweDA0LCAvKiBnbG9iYWwgaG9zdCBjb250cm9sICovCisJSE9TVF9JUlFfU1RBVAkJPSAweDA4LCAvKiBpbnRlcnJ1cHQgc3RhdHVzICovCisJSE9TVF9QT1JUU19JTVBMCQk9IDB4MGMsIC8qIGJpdG1hcCBvZiBpbXBsZW1lbnRlZCBwb3J0cyAqLworCUhPU1RfVkVSU0lPTgkJPSAweDEwLCAvKiBBSENJIHNwZWMuIHZlcnNpb24gY29tcGxpYW5jeSAqLworCisJLyogSE9TVF9DVEwgYml0cyAqLworCUhPU1RfUkVTRVQJCT0gKDEgPDwgMCksICAvKiByZXNldCBjb250cm9sbGVyOyBzZWxmLWNsZWFyICovCisJSE9TVF9JUlFfRU4JCT0gKDEgPDwgMSksICAvKiBnbG9iYWwgSVJRIGVuYWJsZSAqLworCUhPU1RfQUhDSV9FTgkJPSAoMSA8PCAzMSksIC8qIEFIQ0kgZW5hYmxlZCAqLworCisJLyogSE9TVF9DQVAgYml0cyAqLworCUhPU1RfQ0FQXzY0CQk9ICgxIDw8IDMxKSwgLyogUENJIERBQyAoNjQtYml0IERNQSkgc3VwcG9ydCAqLworCisJLyogcmVnaXN0ZXJzIGZvciBlYWNoIFNBVEEgcG9ydCAqLworCVBPUlRfTFNUX0FERFIJCT0gMHgwMCwgLyogY29tbWFuZCBsaXN0IERNQSBhZGRyICovCisJUE9SVF9MU1RfQUREUl9ISQk9IDB4MDQsIC8qIGNvbW1hbmQgbGlzdCBETUEgYWRkciBoaSAqLworCVBPUlRfRklTX0FERFIJCT0gMHgwOCwgLyogRklTIHJ4IGJ1ZiBhZGRyICovCisJUE9SVF9GSVNfQUREUl9ISQk9IDB4MGMsIC8qIEZJUyByeCBidWYgYWRkciBoaSAqLworCVBPUlRfSVJRX1NUQVQJCT0gMHgxMCwgLyogaW50ZXJydXB0IHN0YXR1cyAqLworCVBPUlRfSVJRX01BU0sJCT0gMHgxNCwgLyogaW50ZXJydXB0IGVuYWJsZS9kaXNhYmxlIG1hc2sgKi8KKwlQT1JUX0NNRAkJPSAweDE4LCAvKiBwb3J0IGNvbW1hbmQgKi8KKwlQT1JUX1RGREFUQQkJPSAweDIwLAkvKiB0YXNrZmlsZSBkYXRhICovCisJUE9SVF9TSUcJCT0gMHgyNCwJLyogZGV2aWNlIFRGIHNpZ25hdHVyZSAqLworCVBPUlRfQ01EX0lTU1VFCQk9IDB4MzgsIC8qIGNvbW1hbmQgaXNzdWUgKi8KKwlQT1JUX1NDUgkJPSAweDI4LCAvKiBTQVRBIHBoeSByZWdpc3RlciBibG9jayAqLworCVBPUlRfU0NSX1NUQVQJCT0gMHgyOCwgLyogU0FUQSBwaHkgcmVnaXN0ZXI6IFNTdGF0dXMgKi8KKwlQT1JUX1NDUl9DVEwJCT0gMHgyYywgLyogU0FUQSBwaHkgcmVnaXN0ZXI6IFNDb250cm9sICovCisJUE9SVF9TQ1JfRVJSCQk9IDB4MzAsIC8qIFNBVEEgcGh5IHJlZ2lzdGVyOiBTRXJyb3IgKi8KKwlQT1JUX1NDUl9BQ1QJCT0gMHgzNCwgLyogU0FUQSBwaHkgcmVnaXN0ZXI6IFNBY3RpdmUgKi8KKworCS8qIFBPUlRfSVJRX3tTVEFULE1BU0t9IGJpdHMgKi8KKwlQT1JUX0lSUV9DT0xEX1BSRVMJPSAoMSA8PCAzMSksIC8qIGNvbGQgcHJlc2VuY2UgZGV0ZWN0ICovCisJUE9SVF9JUlFfVEZfRVJSCQk9ICgxIDw8IDMwKSwgLyogdGFzayBmaWxlIGVycm9yICovCisJUE9SVF9JUlFfSEJVU19FUlIJPSAoMSA8PCAyOSksIC8qIGhvc3QgYnVzIGZhdGFsIGVycm9yICovCisJUE9SVF9JUlFfSEJVU19EQVRBX0VSUgk9ICgxIDw8IDI4KSwgLyogaG9zdCBidXMgZGF0YSBlcnJvciAqLworCVBPUlRfSVJRX0lGX0VSUgkJPSAoMSA8PCAyNyksIC8qIGludGVyZmFjZSBmYXRhbCBlcnJvciAqLworCVBPUlRfSVJRX0lGX05PTkZBVEFMCT0gKDEgPDwgMjYpLCAvKiBpbnRlcmZhY2Ugbm9uLWZhdGFsIGVycm9yICovCisJUE9SVF9JUlFfT1ZFUkZMT1cJPSAoMSA8PCAyNCksIC8qIHhmZXIgZXhoYXVzdGVkIGF2YWlsYWJsZSBTL0cgKi8KKwlQT1JUX0lSUV9CQURfUE1QCT0gKDEgPDwgMjMpLCAvKiBpbmNvcnJlY3QgcG9ydCBtdWx0aXBsaWVyICovCisKKwlQT1JUX0lSUV9QSFlSRFkJCT0gKDEgPDwgMjIpLCAvKiBQaHlSZHkgY2hhbmdlZCAqLworCVBPUlRfSVJRX0RFVl9JTENLCT0gKDEgPDwgNyksIC8qIGRldmljZSBpbnRlcmxvY2sgKi8KKwlQT1JUX0lSUV9DT05ORUNUCT0gKDEgPDwgNiksIC8qIHBvcnQgY29ubmVjdCBjaGFuZ2Ugc3RhdHVzICovCisJUE9SVF9JUlFfU0dfRE9ORQk9ICgxIDw8IDUpLCAvKiBkZXNjcmlwdG9yIHByb2Nlc3NlZCAqLworCVBPUlRfSVJRX1VOS19GSVMJPSAoMSA8PCA0KSwgLyogdW5rbm93biBGSVMgcngnZCAqLworCVBPUlRfSVJRX1NEQl9GSVMJPSAoMSA8PCAzKSwgLyogU2V0IERldmljZSBCaXRzIEZJUyByeCdkICovCisJUE9SVF9JUlFfRE1BU19GSVMJPSAoMSA8PCAyKSwgLyogRE1BIFNldHVwIEZJUyByeCdkICovCisJUE9SVF9JUlFfUElPU19GSVMJPSAoMSA8PCAxKSwgLyogUElPIFNldHVwIEZJUyByeCdkICovCisJUE9SVF9JUlFfRDJIX1JFR19GSVMJPSAoMSA8PCAwKSwgLyogRDJIIFJlZ2lzdGVyIEZJUyByeCdkICovCisKKwlQT1JUX0lSUV9GQVRBTAkJPSBQT1JUX0lSUV9URl9FUlIgfAorCQkJCSAgUE9SVF9JUlFfSEJVU19FUlIgfAorCQkJCSAgUE9SVF9JUlFfSEJVU19EQVRBX0VSUiB8CisJCQkJICBQT1JUX0lSUV9JRl9FUlIsCisJREVGX1BPUlRfSVJRCQk9IFBPUlRfSVJRX0ZBVEFMIHwgUE9SVF9JUlFfUEhZUkRZIHwKKwkJCQkgIFBPUlRfSVJRX0NPTk5FQ1QgfCBQT1JUX0lSUV9TR19ET05FIHwKKwkJCQkgIFBPUlRfSVJRX1VOS19GSVMgfCBQT1JUX0lSUV9TREJfRklTIHwKKwkJCQkgIFBPUlRfSVJRX0RNQVNfRklTIHwgUE9SVF9JUlFfUElPU19GSVMgfAorCQkJCSAgUE9SVF9JUlFfRDJIX1JFR19GSVMsCisKKwkvKiBQT1JUX0NNRCBiaXRzICovCisJUE9SVF9DTURfTElTVF9PTgk9ICgxIDw8IDE1KSwgLyogY21kIGxpc3QgRE1BIGVuZ2luZSBydW5uaW5nICovCisJUE9SVF9DTURfRklTX09OCQk9ICgxIDw8IDE0KSwgLyogRklTIERNQSBlbmdpbmUgcnVubmluZyAqLworCVBPUlRfQ01EX0ZJU19SWAkJPSAoMSA8PCA0KSwgLyogRW5hYmxlIEZJUyByZWNlaXZlIERNQSBlbmdpbmUgKi8KKwlQT1JUX0NNRF9QT1dFUl9PTgk9ICgxIDw8IDIpLCAvKiBQb3dlciB1cCBkZXZpY2UgKi8KKwlQT1JUX0NNRF9TUElOX1VQCT0gKDEgPDwgMSksIC8qIFNwaW4gdXAgZGV2aWNlICovCisJUE9SVF9DTURfU1RBUlQJCT0gKDEgPDwgMCksIC8qIEVuYWJsZSBwb3J0IERNQSBlbmdpbmUgKi8KKworCVBPUlRfQ01EX0lDQ19BQ1RJVkUJPSAoMHgxIDw8IDI4KSwgLyogUHV0IGkvZiBpbiBhY3RpdmUgc3RhdGUgKi8KKwlQT1JUX0NNRF9JQ0NfUEFSVElBTAk9ICgweDIgPDwgMjgpLCAvKiBQdXQgaS9mIGluIHBhcnRpYWwgc3RhdGUgKi8KKwlQT1JUX0NNRF9JQ0NfU0xVTUJFUgk9ICgweDYgPDwgMjgpLCAvKiBQdXQgaS9mIGluIHNsdW1iZXIgc3RhdGUgKi8KK307CisKK3N0cnVjdCBhaGNpX2NtZF9oZHIgeworCXUzMgkJCW9wdHM7CisJdTMyCQkJc3RhdHVzOworCXUzMgkJCXRibF9hZGRyOworCXUzMgkJCXRibF9hZGRyX2hpOworCXUzMgkJCXJlc2VydmVkWzRdOworfTsKKworc3RydWN0IGFoY2lfc2cgeworCXUzMgkJCWFkZHI7CisJdTMyCQkJYWRkcl9oaTsKKwl1MzIJCQlyZXNlcnZlZDsKKwl1MzIJCQlmbGFnc19zaXplOworfTsKKworc3RydWN0IGFoY2lfaG9zdF9wcml2IHsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwl1MzIJCQljYXA7CS8qIGNhY2hlIG9mIEhPU1RfQ0FQIHJlZ2lzdGVyICovCisJdTMyCQkJcG9ydF9tYXA7IC8qIGNhY2hlIG9mIEhPU1RfUE9SVFNfSU1QTCByZWcgKi8KK307CisKK3N0cnVjdCBhaGNpX3BvcnRfcHJpdiB7CisJc3RydWN0IGFoY2lfY21kX2hkcgkqY21kX3Nsb3Q7CisJZG1hX2FkZHJfdAkJY21kX3Nsb3RfZG1hOworCXZvaWQJCQkqY21kX3RibDsKKwlkbWFfYWRkcl90CQljbWRfdGJsX2RtYTsKKwlzdHJ1Y3QgYWhjaV9zZwkJKmNtZF90Ymxfc2c7CisJdm9pZAkJCSpyeF9maXM7CisJZG1hX2FkZHJfdAkJcnhfZmlzX2RtYTsKK307CisKK3N0YXRpYyB1MzIgYWhjaV9zY3JfcmVhZCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZyk7CitzdGF0aWMgdm9pZCBhaGNpX3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCk7CitzdGF0aWMgaW50IGFoY2lfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyBpbnQgYWhjaV9xY19pc3N1ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBhaGNpX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBhaGNpX3BoeV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIGFoY2lfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgYWhjaV9lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyBpbnQgYWhjaV9wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgYWhjaV9wb3J0X3N0b3Aoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgdm9pZCBhaGNpX2hvc3Rfc3RvcChzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCk7CitzdGF0aWMgdm9pZCBhaGNpX3RmX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpOworc3RhdGljIHZvaWQgYWhjaV9xY19wcmVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworc3RhdGljIHU4IGFoY2lfY2hlY2tfc3RhdHVzKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHU4IGFoY2lfY2hlY2tfZXJyKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIGlubGluZSBpbnQgYWhjaV9ob3N0X2ludHIoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgYWhjaV9zaHQgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pb2N0bAkJCT0gYXRhX3Njc2lfaW9jdGwsCisJLnF1ZXVlY29tbWFuZAkJPSBhdGFfc2NzaV9xdWV1ZWNtZCwKKwkuZWhfc3RyYXRlZ3lfaGFuZGxlcgk9IGF0YV9zY3NpX2Vycm9yLAorCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKKwkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCisJLnNnX3RhYmxlc2l6ZQkJPSBBSENJX01BWF9TRywKKwkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAorCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAorCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAorCS51c2VfY2x1c3RlcmluZwkJPSBBSENJX1VTRV9DTFVTVEVSSU5HLAorCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCisJLmRtYV9ib3VuZGFyeQkJPSBBSENJX0RNQV9CT1VOREFSWSwKKwkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkub3JkZXJlZF9mbHVzaAkJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGFoY2lfb3BzID0geworCS5wb3J0X2Rpc2FibGUJCT0gYXRhX3BvcnRfZGlzYWJsZSwKKworCS5jaGVja19zdGF0dXMJCT0gYWhjaV9jaGVja19zdGF0dXMsCisJLmNoZWNrX2FsdHN0YXR1cwk9IGFoY2lfY2hlY2tfc3RhdHVzLAorCS5jaGVja19lcnIJCT0gYWhjaV9jaGVja19lcnIsCisJLmRldl9zZWxlY3QJCT0gYXRhX25vb3BfZGV2X3NlbGVjdCwKKworCS50Zl9yZWFkCQk9IGFoY2lfdGZfcmVhZCwKKworCS5waHlfcmVzZXQJCT0gYWhjaV9waHlfcmVzZXQsCisKKwkucWNfcHJlcAkJPSBhaGNpX3FjX3ByZXAsCisJLnFjX2lzc3VlCQk9IGFoY2lfcWNfaXNzdWUsCisKKwkuZW5nX3RpbWVvdXQJCT0gYWhjaV9lbmdfdGltZW91dCwKKworCS5pcnFfaGFuZGxlcgkJPSBhaGNpX2ludGVycnVwdCwKKwkuaXJxX2NsZWFyCQk9IGFoY2lfaXJxX2NsZWFyLAorCisJLnNjcl9yZWFkCQk9IGFoY2lfc2NyX3JlYWQsCisJLnNjcl93cml0ZQkJPSBhaGNpX3Njcl93cml0ZSwKKworCS5wb3J0X3N0YXJ0CQk9IGFoY2lfcG9ydF9zdGFydCwKKwkucG9ydF9zdG9wCQk9IGFoY2lfcG9ydF9zdG9wLAorCS5ob3N0X3N0b3AJCT0gYWhjaV9ob3N0X3N0b3AsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gYWhjaV9wb3J0X2luZm9bXSA9IHsKKwkvKiBib2FyZF9haGNpICovCisJeworCQkuc2h0CQk9ICZhaGNpX3NodCwKKwkJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkgIEFUQV9GTEFHX1NBVEFfUkVTRVQgfCBBVEFfRkxBR19NTUlPIHwKKwkJCQkgIEFUQV9GTEFHX1BJT19ETUEsCisJCS5waW9fbWFzawk9IDB4MDMsIC8qIHBpbzMtNCAqLworCQkudWRtYV9tYXNrCT0gMHg3ZiwgLyogdWRtYTAtNiA7IEZJWE1FICovCisJCS5wb3J0X29wcwk9ICZhaGNpX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFoY2lfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNjUyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCSAgYm9hcmRfYWhjaSB9LCAvKiBJQ0g2ICovCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI2NTMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJICBib2FyZF9haGNpIH0sIC8qIElDSDZNICovCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI3YzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJICBib2FyZF9haGNpIH0sIC8qIElDSDcgKi8KKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjdjNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkX2FoY2kgfSwgLyogSUNIN00gKi8KKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjdjMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkX2FoY2kgfSwgLyogSUNIN1IgKi8KKwl7IFBDSV9WRU5ET1JfSURfQUwsIDB4NTI4OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkX2FoY2kgfSwgLyogVUxpIE01Mjg4ICovCisJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhaGNpX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQkJPSBhaGNpX3BjaV90YmwsCisJLnByb2JlCQkJPSBhaGNpX2luaXRfb25lLAorCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKK307CisKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFoY2lfcG9ydF9iYXNlX3VsICh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGludCBwb3J0KQoreworCXJldHVybiBiYXNlICsgMHgxMDAgKyAocG9ydCAqIDB4ODApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmFoY2lfcG9ydF9iYXNlICh2b2lkICpiYXNlLCB1bnNpZ25lZCBpbnQgcG9ydCkKK3sKKwlyZXR1cm4gKHZvaWQgKikgYWhjaV9wb3J0X2Jhc2VfdWwoKHVuc2lnbmVkIGxvbmcpYmFzZSwgcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGFoY2lfaG9zdF9zdG9wKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KQoreworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBob3N0X3NldC0+cHJpdmF0ZV9kYXRhOworCWtmcmVlKGhwcml2KTsKK30KKworc3RhdGljIGludCBhaGNpX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhcC0+aG9zdF9zZXQtPmRldjsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3Rfc2V0LT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcDsKKwlpbnQgcmM7CisJdm9pZCAqbWVtLCAqbW1pbyA9IGFwLT5ob3N0X3NldC0+bW1pb19iYXNlOworCXZvaWQgKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKG1taW8sIGFwLT5wb3J0X25vKTsKKwlkbWFfYWRkcl90IG1lbV9kbWE7CisKKwlyYyA9IGF0YV9wb3J0X3N0YXJ0KGFwKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBwID0ga21hbGxvYyhzaXplb2YoKnBwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJbWVtc2V0KHBwLCAwLCBzaXplb2YoKnBwKSk7CisKKwltZW0gPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBBSENJX1BPUlRfUFJJVl9ETUFfU1osICZtZW1fZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1lbSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9rZnJlZTsKKwl9CisJbWVtc2V0KG1lbSwgMCwgQUhDSV9QT1JUX1BSSVZfRE1BX1NaKTsKKworCS8qCisJICogRmlyc3QgaXRlbSBpbiBjaHVuayBvZiBETUEgbWVtb3J5OiAzMi1zbG90IGNvbW1hbmQgdGFibGUsCisJICogMzIgYnl0ZXMgZWFjaCBpbiBzaXplCisJICovCisJcHAtPmNtZF9zbG90ID0gbWVtOworCXBwLT5jbWRfc2xvdF9kbWEgPSBtZW1fZG1hOworCisJbWVtICs9IEFIQ0lfQ01EX1NMT1RfU1o7CisJbWVtX2RtYSArPSBBSENJX0NNRF9TTE9UX1NaOworCisJLyoKKwkgKiBTZWNvbmQgaXRlbTogUmVjZWl2ZWQtRklTIGFyZWEKKwkgKi8KKwlwcC0+cnhfZmlzID0gbWVtOworCXBwLT5yeF9maXNfZG1hID0gbWVtX2RtYTsKKworCW1lbSArPSBBSENJX1JYX0ZJU19TWjsKKwltZW1fZG1hICs9IEFIQ0lfUlhfRklTX1NaOworCisJLyoKKwkgKiBUaGlyZCBpdGVtOiBkYXRhIGFyZWEgZm9yIHN0b3JpbmcgYSBzaW5nbGUgY29tbWFuZAorCSAqIGFuZCBpdHMgc2NhdHRlci1nYXRoZXIgdGFibGUKKwkgKi8KKwlwcC0+Y21kX3RibCA9IG1lbTsKKwlwcC0+Y21kX3RibF9kbWEgPSBtZW1fZG1hOworCisJcHAtPmNtZF90Ymxfc2cgPSBtZW0gKyBBSENJX0NNRF9UQkxfSERSOworCisJYXAtPnByaXZhdGVfZGF0YSA9IHBwOworCisJaWYgKGhwcml2LT5jYXAgJiBIT1NUX0NBUF82NCkKKwkJd3JpdGVsKChwcC0+Y21kX3Nsb3RfZG1hID4+IDE2KSA+PiAxNiwgcG9ydF9tbWlvICsgUE9SVF9MU1RfQUREUl9ISSk7CisJd3JpdGVsKHBwLT5jbWRfc2xvdF9kbWEgJiAweGZmZmZmZmZmLCBwb3J0X21taW8gKyBQT1JUX0xTVF9BRERSKTsKKwlyZWFkbChwb3J0X21taW8gKyBQT1JUX0xTVF9BRERSKTsgLyogZmx1c2ggKi8KKworCWlmIChocHJpdi0+Y2FwICYgSE9TVF9DQVBfNjQpCisJCXdyaXRlbCgocHAtPnJ4X2Zpc19kbWEgPj4gMTYpID4+IDE2LCBwb3J0X21taW8gKyBQT1JUX0ZJU19BRERSX0hJKTsKKwl3cml0ZWwocHAtPnJ4X2Zpc19kbWEgJiAweGZmZmZmZmZmLCBwb3J0X21taW8gKyBQT1JUX0ZJU19BRERSKTsKKwlyZWFkbChwb3J0X21taW8gKyBQT1JUX0ZJU19BRERSKTsgLyogZmx1c2ggKi8KKworCXdyaXRlbChQT1JUX0NNRF9JQ0NfQUNUSVZFIHwgUE9SVF9DTURfRklTX1JYIHwKKwkgICAgICAgUE9SVF9DTURfUE9XRVJfT04gfCBQT1JUX0NNRF9TUElOX1VQIHwKKwkgICAgICAgUE9SVF9DTURfU1RBUlQsIHBvcnRfbW1pbyArIFBPUlRfQ01EKTsKKwlyZWFkbChwb3J0X21taW8gKyBQT1JUX0NNRCk7IC8qIGZsdXNoICovCisKKwlyZXR1cm4gMDsKKworZXJyX291dF9rZnJlZToKKwlrZnJlZShwcCk7CitlcnJfb3V0OgorCWF0YV9wb3J0X3N0b3AoYXApOworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgdm9pZCBhaGNpX3BvcnRfc3RvcChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFwLT5ob3N0X3NldC0+ZGV2OworCXN0cnVjdCBhaGNpX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOworCXZvaWQgKm1taW8gPSBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZTsKKwl2b2lkICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShtbWlvLCBhcC0+cG9ydF9ubyk7CisJdTMyIHRtcDsKKworCXRtcCA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfQ01EKTsKKwl0bXAgJj0gfihQT1JUX0NNRF9TVEFSVCB8IFBPUlRfQ01EX0ZJU19SWCk7CisJd3JpdGVsKHRtcCwgcG9ydF9tbWlvICsgUE9SVF9DTUQpOworCXJlYWRsKHBvcnRfbW1pbyArIFBPUlRfQ01EKTsgLyogZmx1c2ggKi8KKworCS8qIHNwZWMgc2F5cyA1MDAgbXNlY3MgZm9yIGVhY2ggUE9SVF9DTURfe1NUQVJULEZJU19SWH0gYml0LCBzbworCSAqIHRoaXMgaXMgc2xpZ2h0bHkgaW5jb3JyZWN0LgorCSAqLworCW1zbGVlcCg1MDApOworCisJYXAtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBBSENJX1BPUlRfUFJJVl9ETUFfU1osCisJCQkgIHBwLT5jbWRfc2xvdCwgcHAtPmNtZF9zbG90X2RtYSk7CisJa2ZyZWUocHApOworCWF0YV9wb3J0X3N0b3AoYXApOworfQorCitzdGF0aWMgdTMyIGFoY2lfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWdfaW4pCit7CisJdW5zaWduZWQgaW50IHNjX3JlZzsKKworCXN3aXRjaCAoc2NfcmVnX2luKSB7CisJY2FzZSBTQ1JfU1RBVFVTOglzY19yZWcgPSAwOyBicmVhazsKKwljYXNlIFNDUl9DT05UUk9MOglzY19yZWcgPSAxOyBicmVhazsKKwljYXNlIFNDUl9FUlJPUjoJCXNjX3JlZyA9IDI7IGJyZWFrOworCWNhc2UgU0NSX0FDVElWRToJc2NfcmVnID0gMzsgYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDB4ZmZmZmZmZmZVOworCX0KKworCXJldHVybiByZWFkbCgodm9pZCAqKSBhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKK30KKworCitzdGF0aWMgdm9pZCBhaGNpX3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZ19pbiwKKwkJCSAgICAgICB1MzIgdmFsKQoreworCXVuc2lnbmVkIGludCBzY19yZWc7CisKKwlzd2l0Y2ggKHNjX3JlZ19pbikgeworCWNhc2UgU0NSX1NUQVRVUzoJc2NfcmVnID0gMDsgYnJlYWs7CisJY2FzZSBTQ1JfQ09OVFJPTDoJc2NfcmVnID0gMTsgYnJlYWs7CisJY2FzZSBTQ1JfRVJST1I6CQlzY19yZWcgPSAyOyBicmVhazsKKwljYXNlIFNDUl9BQ1RJVkU6CXNjX3JlZyA9IDM7IGJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwl3cml0ZWwodmFsLCAodm9pZCAqKSBhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKK30KKworc3RhdGljIHZvaWQgYWhjaV9waHlfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9ICh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5jbWRfYWRkcjsKKwlzdHJ1Y3QgYXRhX3Rhc2tmaWxlIHRmOworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSAmYXAtPmRldmljZVswXTsKKwl1MzIgdG1wOworCisJX19zYXRhX3BoeV9yZXNldChhcCk7CisKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRCkKKwkJcmV0dXJuOworCisJdG1wID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9TSUcpOworCXRmLmxiYWgJCT0gKHRtcCA+PiAyNCkJJiAweGZmOworCXRmLmxiYW0JCT0gKHRtcCA+PiAxNikJJiAweGZmOworCXRmLmxiYWwJCT0gKHRtcCA+PiA4KQkmIDB4ZmY7CisJdGYubnNlY3QJPSAodG1wKQkJJiAweGZmOworCisJZGV2LT5jbGFzcyA9IGF0YV9kZXZfY2xhc3NpZnkoJnRmKTsKKwlpZiAoIWF0YV9kZXZfcHJlc2VudChkZXYpKQorCQlhdGFfcG9ydF9kaXNhYmxlKGFwKTsKK30KKworc3RhdGljIHU4IGFoY2lfY2hlY2tfc3RhdHVzKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdm9pZCAqbW1pbyA9ICh2b2lkICopIGFwLT5pb2FkZHIuY21kX2FkZHI7CisKKwlyZXR1cm4gcmVhZGwobW1pbyArIFBPUlRfVEZEQVRBKSAmIDB4RkY7Cit9CisKK3N0YXRpYyB1OCBhaGNpX2NoZWNrX2VycihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXZvaWQgKm1taW8gPSAodm9pZCAqKSBhcC0+aW9hZGRyLmNtZF9hZGRyOworCisJcmV0dXJuIChyZWFkbChtbWlvICsgUE9SVF9URkRBVEEpID4+IDgpICYgMHhGRjsKK30KKworc3RhdGljIHZvaWQgYWhjaV90Zl9yZWFkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCXN0cnVjdCBhaGNpX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOworCXU4ICpkMmhfZmlzID0gcHAtPnJ4X2ZpcyArIFJYX0ZJU19EMkhfUkVHOworCisJYXRhX3RmX2Zyb21fZmlzKGQyaF9maXMsIHRmKTsKK30KKworc3RhdGljIHZvaWQgYWhjaV9maWxsX3NnKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcCA9IHFjLT5hcC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBpOworCisJVlBSSU5USygiRU5URVJcbiIpOworCisJLyoKKwkgKiBOZXh0LCB0aGUgUy9HIGxpc3QuCisJICovCisJZm9yIChpID0gMDsgaSA8IHFjLT5uX2VsZW07IGkrKykgeworCQl1MzIgc2dfbGVuOworCQlkbWFfYWRkcl90IGFkZHI7CisKKwkJYWRkciA9IHNnX2RtYV9hZGRyZXNzKCZxYy0+c2dbaV0pOworCQlzZ19sZW4gPSBzZ19kbWFfbGVuKCZxYy0+c2dbaV0pOworCisJCXBwLT5jbWRfdGJsX3NnW2ldLmFkZHIgPSBjcHVfdG9fbGUzMihhZGRyICYgMHhmZmZmZmZmZik7CisJCXBwLT5jbWRfdGJsX3NnW2ldLmFkZHJfaGkgPSBjcHVfdG9fbGUzMigoYWRkciA+PiAxNikgPj4gMTYpOworCQlwcC0+Y21kX3RibF9zZ1tpXS5mbGFnc19zaXplID0gY3B1X3RvX2xlMzIoc2dfbGVuIC0gMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhaGNpX3FjX3ByZXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwID0gcWMtPmFwLT5wcml2YXRlX2RhdGE7CisJdTMyIG9wdHM7CisJY29uc3QgdTMyIGNtZF9maXNfbGVuID0gNTsgLyogZml2ZSBkd29yZHMgKi8KKworCS8qCisJICogRmlsbCBpbiBjb21tYW5kIHNsb3QgaW5mb3JtYXRpb24gKGN1cnJlbnRseSBvbmx5IG9uZSBzbG90LAorCSAqIHNsb3QgMCwgaXMgY3VycmVudGx5IHNpbmNlIHdlIGRvbid0IGRvIHF1ZXVlaW5nKQorCSAqLworCisJb3B0cyA9IChxYy0+bl9lbGVtIDw8IDE2KSB8IGNtZF9maXNfbGVuOworCWlmIChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpCisJCW9wdHMgfD0gQUhDSV9DTURfV1JJVEU7CisKKwlzd2l0Y2ggKHFjLT50Zi5wcm90b2NvbCkgeworCWNhc2UgQVRBX1BST1RfQVRBUEk6CisJY2FzZSBBVEFfUFJPVF9BVEFQSV9OT0RBVEE6CisJY2FzZSBBVEFfUFJPVF9BVEFQSV9ETUE6CisJCW9wdHMgfD0gQUhDSV9DTURfQVRBUEk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogZG8gbm90aGluZyAqLworCQlicmVhazsKKwl9CisKKwlwcC0+Y21kX3Nsb3RbMF0ub3B0cyA9IGNwdV90b19sZTMyKG9wdHMpOworCXBwLT5jbWRfc2xvdFswXS5zdGF0dXMgPSAwOworCXBwLT5jbWRfc2xvdFswXS50YmxfYWRkciA9IGNwdV90b19sZTMyKHBwLT5jbWRfdGJsX2RtYSAmIDB4ZmZmZmZmZmYpOworCXBwLT5jbWRfc2xvdFswXS50YmxfYWRkcl9oaSA9IGNwdV90b19sZTMyKChwcC0+Y21kX3RibF9kbWEgPj4gMTYpID4+IDE2KTsKKworCS8qCisJICogRmlsbCBpbiBjb21tYW5kIHRhYmxlIGluZm9ybWF0aW9uLiAgRmlyc3QsIHRoZSBoZWFkZXIsCisJICogYSBTQVRBIFJlZ2lzdGVyIC0gSG9zdCB0byBEZXZpY2UgY29tbWFuZCBGSVMuCisJICovCisJYXRhX3RmX3RvX2ZpcygmcWMtPnRmLCBwcC0+Y21kX3RibCwgMCk7CisKKwlpZiAoIShxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0RNQU1BUCkpCisJCXJldHVybjsKKworCWFoY2lfZmlsbF9zZyhxYyk7Cit9CisKK3N0YXRpYyB2b2lkIGFoY2lfaW50cl9lcnJvcihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1MzIgaXJxX3N0YXQpCit7CisJdm9pZCAqbW1pbyA9IGFwLT5ob3N0X3NldC0+bW1pb19iYXNlOworCXZvaWQgKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKG1taW8sIGFwLT5wb3J0X25vKTsKKwl1MzIgdG1wOworCWludCB3b3JrOworCisJLyogc3RvcCBETUEgKi8KKwl0bXAgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX0NNRCk7CisJdG1wICY9IH5QT1JUX0NNRF9TVEFSVDsKKwl3cml0ZWwodG1wLCBwb3J0X21taW8gKyBQT1JUX0NNRCk7CisKKwkvKiB3YWl0IGZvciBlbmdpbmUgdG8gc3RvcC4gIFRPRE86IHRoaXMgY291bGQgYmUKKwkgKiBhcyBsb25nIGFzIDUwMCBtc2VjCisJICovCisJd29yayA9IDEwMDA7CisJd2hpbGUgKHdvcmstLSA+IDApIHsKKwkJdG1wID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTUQpOworCQlpZiAoKHRtcCAmIFBPUlRfQ01EX0xJU1RfT04pID09IDApCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwkvKiBjbGVhciBTQVRBIHBoeSBlcnJvciwgaWYgYW55ICovCisJdG1wID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9TQ1JfRVJSKTsKKwl3cml0ZWwodG1wLCBwb3J0X21taW8gKyBQT1JUX1NDUl9FUlIpOworCisJLyogaWYgRFJRL0JTWSBpcyBzZXQsIGRldmljZSBuZWVkcyB0byBiZSByZXNldC4KKwkgKiBpZiBzbywgaXNzdWUgQ09NUkVTRVQKKwkgKi8KKwl0bXAgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX1RGREFUQSk7CisJaWYgKHRtcCAmIChBVEFfQlVTWSB8IEFUQV9EUlEpKSB7CisJCXdyaXRlbCgweDMwMSwgcG9ydF9tbWlvICsgUE9SVF9TQ1JfQ1RMKTsKKwkJcmVhZGwocG9ydF9tbWlvICsgUE9SVF9TQ1JfQ1RMKTsgLyogZmx1c2ggKi8KKwkJdWRlbGF5KDEwKTsKKwkJd3JpdGVsKDB4MzAwLCBwb3J0X21taW8gKyBQT1JUX1NDUl9DVEwpOworCQlyZWFkbChwb3J0X21taW8gKyBQT1JUX1NDUl9DVEwpOyAvKiBmbHVzaCAqLworCX0KKworCS8qIHJlLXN0YXJ0IERNQSAqLworCXRtcCA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfQ01EKTsKKwl0bXAgfD0gUE9SVF9DTURfU1RBUlQ7CisJd3JpdGVsKHRtcCwgcG9ydF9tbWlvICsgUE9SVF9DTUQpOworCXJlYWRsKHBvcnRfbW1pbyArIFBPUlRfQ01EKTsgLyogZmx1c2ggKi8KKworCXByaW50ayhLRVJOX1dBUk5JTkcgImF0YSV1OiBlcnJvciBvY2N1cnJlZCwgcG9ydCByZXNldFxuIiwgYXAtPmlkKTsKK30KKworc3RhdGljIHZvaWQgYWhjaV9lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXZvaWQgKm1taW8gPSBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZTsKKwl2b2lkICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShtbWlvLCBhcC0+cG9ydF9ubyk7CisJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKKworCURQUklOVEsoIkVOVEVSXG4iKTsKKworCWFoY2lfaW50cl9lcnJvcihhcCwgcmVhZGwocG9ydF9tbWlvICsgUE9SVF9JUlFfU1RBVCkpOworCisJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKKwlpZiAoIXFjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXRhJXU6IEJVRzogdGltZW91dCB3aXRob3V0IGNvbW1hbmRcbiIsCisJCSAgICAgICBhcC0+aWQpOworCX0gZWxzZSB7CisJCS8qIGhhY2sgYWxlcnQhICBXZSBjYW5ub3QgdXNlIHRoZSBzdXBwbGllZCBjb21wbGV0aW9uCisJIAkgKiBmdW5jdGlvbiBmcm9tIGluc2lkZSB0aGUgLT5laF9zdHJhdGVneV9oYW5kbGVyKCkgdGhyZWFkLgorCSAJICogbGliYXRhIGlzIHRoZSBvbmx5IHVzZXIgb2YgLT5laF9zdHJhdGVneV9oYW5kbGVyKCkgaW4KKwkgCSAqIGFueSBrZXJuZWwsIHNvIHRoZSBkZWZhdWx0IHNjc2lfZG9uZSgpIGFzc3VtZXMgaXQgaXMKKwkgCSAqIG5vdCBiZWluZyBjYWxsZWQgZnJvbSB0aGUgU0NTSSBFSC4KKwkgCSAqLworCQlxYy0+c2NzaWRvbmUgPSBzY3NpX2ZpbmlzaF9jb21tYW5kOworCQlhdGFfcWNfY29tcGxldGUocWMsIEFUQV9FUlIpOworCX0KKworfQorCitzdGF0aWMgaW5saW5lIGludCBhaGNpX2hvc3RfaW50cihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXZvaWQgKm1taW8gPSBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZTsKKwl2b2lkICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShtbWlvLCBhcC0+cG9ydF9ubyk7CisJdTMyIHN0YXR1cywgc2VyciwgY2k7CisKKwlzZXJyID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9TQ1JfRVJSKTsKKwl3cml0ZWwoc2VyciwgcG9ydF9tbWlvICsgUE9SVF9TQ1JfRVJSKTsKKworCXN0YXR1cyA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfSVJRX1NUQVQpOworCXdyaXRlbChzdGF0dXMsIHBvcnRfbW1pbyArIFBPUlRfSVJRX1NUQVQpOworCisJY2kgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX0NNRF9JU1NVRSk7CisJaWYgKGxpa2VseSgoY2kgJiAweDEpID09IDApKSB7CisJCWlmIChxYykgeworCQkJYXRhX3FjX2NvbXBsZXRlKHFjLCAwKTsKKwkJCXFjID0gTlVMTDsKKwkJfQorCX0KKworCWlmIChzdGF0dXMgJiBQT1JUX0lSUV9GQVRBTCkgeworCQlhaGNpX2ludHJfZXJyb3IoYXAsIHN0YXR1cyk7CisJCWlmIChxYykKKwkJCWF0YV9xY19jb21wbGV0ZShxYywgQVRBX0VSUik7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGFoY2lfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJLyogVE9ETyAqLworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYWhjaV9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdjsKKwl1bnNpZ25lZCBpbnQgaSwgaGFuZGxlZCA9IDA7CisJdm9pZCAqbW1pbzsKKwl1MzIgaXJxX3N0YXQsIGlycV9hY2sgPSAwOworCisJVlBSSU5USygiRU5URVJcbiIpOworCisJaHByaXYgPSBob3N0X3NldC0+cHJpdmF0ZV9kYXRhOworCW1taW8gPSBob3N0X3NldC0+bW1pb19iYXNlOworCisJLyogc2lnaC4gIDB4ZmZmZmZmZmYgaXMgYSB2YWxpZCByZXR1cm4gZnJvbSBoL3cgKi8KKwlpcnFfc3RhdCA9IHJlYWRsKG1taW8gKyBIT1NUX0lSUV9TVEFUKTsKKwlpcnFfc3RhdCAmPSBocHJpdi0+cG9ydF9tYXA7CisJaWYgKCFpcnFfc3RhdCkKKwkJcmV0dXJuIElSUV9OT05FOworCisgICAgICAgIHNwaW5fbG9jaygmaG9zdF9zZXQtPmxvY2spOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBob3N0X3NldC0+bl9wb3J0czsgaSsrKSB7CisJCXN0cnVjdCBhdGFfcG9ydCAqYXA7CisJCXUzMiB0bXA7CisKKwkJVlBSSU5USygicG9ydCAldVxuIiwgaSk7CisJCWFwID0gaG9zdF9zZXQtPnBvcnRzW2ldOworCQl0bXAgPSBpcnFfc3RhdCAmICgxIDw8IGkpOworCQlpZiAodG1wICYmIGFwKSB7CisJCQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCQkJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKKwkJCWlmIChhaGNpX2hvc3RfaW50cihhcCwgcWMpKQorCQkJCWlycV9hY2sgfD0gKDEgPDwgaSk7CisJCX0KKwl9CisKKwlpZiAoaXJxX2FjaykgeworCQl3cml0ZWwoaXJxX2FjaywgbW1pbyArIEhPU1RfSVJRX1NUQVQpOworCQloYW5kbGVkID0gMTsKKwl9CisKKyAgICAgICAgc3Bpbl91bmxvY2soJmhvc3Rfc2V0LT5sb2NrKTsKKworCVZQUklOVEsoIkVYSVRcbiIpOworCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyBpbnQgYWhjaV9xY19pc3N1ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJdm9pZCAqcG9ydF9tbWlvID0gKHZvaWQgKikgYXAtPmlvYWRkci5jbWRfYWRkcjsKKworCXdyaXRlbCgxLCBwb3J0X21taW8gKyBQT1JUX1NDUl9BQ1QpOworCXJlYWRsKHBvcnRfbW1pbyArIFBPUlRfU0NSX0FDVCk7CS8qIGZsdXNoICovCisKKwl3cml0ZWwoMSwgcG9ydF9tbWlvICsgUE9SVF9DTURfSVNTVUUpOworCXJlYWRsKHBvcnRfbW1pbyArIFBPUlRfQ01EX0lTU1VFKTsJLyogZmx1c2ggKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhaGNpX3NldHVwX3BvcnQoc3RydWN0IGF0YV9pb3BvcnRzICpwb3J0LCB1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkgICAgdW5zaWduZWQgaW50IHBvcnRfaWR4KQoreworCVZQUklOVEsoIkVOVEVSLCBiYXNlPT0weCVseCwgcG9ydF9pZHggJXVcbiIsIGJhc2UsIHBvcnRfaWR4KTsKKwliYXNlID0gYWhjaV9wb3J0X2Jhc2VfdWwoYmFzZSwgcG9ydF9pZHgpOworCVZQUklOVEsoImJhc2Ugbm93PT0weCVseFxuIiwgYmFzZSk7CisKKwlwb3J0LT5jbWRfYWRkcgkJPSBiYXNlOworCXBvcnQtPnNjcl9hZGRyCQk9IGJhc2UgKyBQT1JUX1NDUjsKKworCVZQUklOVEsoIkVYSVRcbiIpOworfQorCitzdGF0aWMgaW50IGFoY2lfaG9zdF9pbml0KHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQpCit7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IHByb2JlX2VudC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihwcm9iZV9lbnQtPmRldik7CisJdm9pZCBfX2lvbWVtICptbWlvID0gcHJvYmVfZW50LT5tbWlvX2Jhc2U7CisJdTMyIHRtcCwgY2FwX3NhdmU7CisJdTE2IHRtcDE2OworCXVuc2lnbmVkIGludCBpLCBqLCB1c2luZ19kYWM7CisJaW50IHJjOworCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvOworCisJY2FwX3NhdmUgPSByZWFkbChtbWlvICsgSE9TVF9DQVApOworCWNhcF9zYXZlICY9ICggKDE8PDI4KSB8ICgxPDwxNykgKTsKKwljYXBfc2F2ZSB8PSAoMSA8PCAyNyk7CisKKwkvKiBnbG9iYWwgY29udHJvbGxlciByZXNldCAqLworCXRtcCA9IHJlYWRsKG1taW8gKyBIT1NUX0NUTCk7CisJaWYgKCh0bXAgJiBIT1NUX1JFU0VUKSA9PSAwKSB7CisJCXdyaXRlbCh0bXAgfCBIT1NUX1JFU0VULCBtbWlvICsgSE9TVF9DVEwpOworCQlyZWFkbChtbWlvICsgSE9TVF9DVEwpOyAvKiBmbHVzaCAqLworCX0KKworCS8qIHJlc2V0IG11c3QgY29tcGxldGUgd2l0aGluIDEgc2Vjb25kLCBvcgorCSAqIHRoZSBoYXJkd2FyZSBzaG91bGQgYmUgY29uc2lkZXJlZCBmcmllZC4KKwkgKi8KKwlzc2xlZXAoMSk7CisKKwl0bXAgPSByZWFkbChtbWlvICsgSE9TVF9DVEwpOworCWlmICh0bXAgJiBIT1NUX1JFU0VUKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiKCVzKTogY29udHJvbGxlciByZXNldCBmYWlsZWQgKDB4JXgpXG4iLAorCQkJcGNpX25hbWUocGRldiksIHRtcCk7CisJCXJldHVybiAtRUlPOworCX0KKworCXdyaXRlbChIT1NUX0FIQ0lfRU4sIG1taW8gKyBIT1NUX0NUTCk7CisJKHZvaWQpIHJlYWRsKG1taW8gKyBIT1NUX0NUTCk7CS8qIGZsdXNoICovCisJd3JpdGVsKGNhcF9zYXZlLCBtbWlvICsgSE9TVF9DQVApOworCXdyaXRlbCgweGYsIG1taW8gKyBIT1NUX1BPUlRTX0lNUEwpOworCSh2b2lkKSByZWFkbChtbWlvICsgSE9TVF9QT1JUU19JTVBMKTsJLyogZmx1c2ggKi8KKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIDB4OTIsICZ0bXAxNik7CisJdG1wMTYgfD0gMHhmOworCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCAweDkyLCB0bXAxNik7CisKKwlocHJpdi0+Y2FwID0gcmVhZGwobW1pbyArIEhPU1RfQ0FQKTsKKwlocHJpdi0+cG9ydF9tYXAgPSByZWFkbChtbWlvICsgSE9TVF9QT1JUU19JTVBMKTsKKwlwcm9iZV9lbnQtPm5fcG9ydHMgPSAoaHByaXYtPmNhcCAmIDB4MWYpICsgMTsKKworCVZQUklOVEsoImNhcCAweCV4ICBwb3J0X21hcCAweCV4ICBuX3BvcnRzICVkXG4iLAorCQlocHJpdi0+Y2FwLCBocHJpdi0+cG9ydF9tYXAsIHByb2JlX2VudC0+bl9wb3J0cyk7CisKKwl1c2luZ19kYWMgPSBocHJpdi0+Y2FwICYgSE9TVF9DQVBfNjQ7CisJaWYgKHVzaW5nX2RhYyAmJgorCSAgICAhcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykpIHsKKwkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spOworCQlpZiAocmMpIHsKKwkJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwkJCWlmIChyYykgeworCQkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiKCVzKTogNjQtYml0IERNQSBlbmFibGUgZmFpbGVkXG4iLAorCQkJCQlwY2lfbmFtZShwZGV2KSk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9CisKKwkJaHByaXYtPmZsYWdzIHw9IEhPU1RfQ0FQXzY0OworCX0gZWxzZSB7CisJCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICIoJXMpOiAzMi1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIsCisJCQkJcGNpX25hbWUocGRldikpOworCQkJcmV0dXJuIHJjOworCQl9CisJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIiglcyk6IDMyLWJpdCBjb25zaXN0ZW50IERNQSBlbmFibGUgZmFpbGVkXG4iLAorCQkJCXBjaV9uYW1lKHBkZXYpKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBwcm9iZV9lbnQtPm5fcG9ydHM7IGkrKykgeworI2lmIDAgLyogQklPU2VuIGluaXRpYWxpemUgdGhpcyBpbmNvcnJlY3RseSAqLworCQlpZiAoIShocHJpdi0+cG9ydF9tYXAgJiAoMSA8PCBpKSkpCisJCQljb250aW51ZTsKKyNlbmRpZgorCisJCXBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKG1taW8sIGkpOworCQlWUFJJTlRLKCJtbWlvICVwICBwb3J0X21taW8gJXBcbiIsIG1taW8sIHBvcnRfbW1pbyk7CisKKwkJYWhjaV9zZXR1cF9wb3J0KCZwcm9iZV9lbnQtPnBvcnRbaV0sCisJCQkJKHVuc2lnbmVkIGxvbmcpIG1taW8sIGkpOworCisJCS8qIG1ha2Ugc3VyZSBwb3J0IGlzIG5vdCBhY3RpdmUgKi8KKwkJdG1wID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTUQpOworCQlWUFJJTlRLKCJQT1JUX0NNRCAweCV4XG4iLCB0bXApOworCQlpZiAodG1wICYgKFBPUlRfQ01EX0xJU1RfT04gfCBQT1JUX0NNRF9GSVNfT04gfAorCQkJICAgUE9SVF9DTURfRklTX1JYIHwgUE9SVF9DTURfU1RBUlQpKSB7CisJCQl0bXAgJj0gfihQT1JUX0NNRF9MSVNUX09OIHwgUE9SVF9DTURfRklTX09OIHwKKwkJCQkgUE9SVF9DTURfRklTX1JYIHwgUE9SVF9DTURfU1RBUlQpOworCQkJd3JpdGVsKHRtcCwgcG9ydF9tbWlvICsgUE9SVF9DTUQpOworCQkJcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTUQpOyAvKiBmbHVzaCAqLworCisJCQkvKiBzcGVjIHNheXMgNTAwIG1zZWNzIGZvciBlYWNoIGJpdCwgc28KKwkJCSAqIHRoaXMgaXMgc2xpZ2h0bHkgaW5jb3JyZWN0LgorCQkJICovCisJCQltc2xlZXAoNTAwKTsKKwkJfQorCisJCXdyaXRlbChQT1JUX0NNRF9TUElOX1VQLCBwb3J0X21taW8gKyBQT1JUX0NNRCk7CisKKwkJaiA9IDA7CisJCXdoaWxlIChqIDwgMTAwKSB7CisJCQltc2xlZXAoMTApOworCQkJdG1wID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9TQ1JfU1RBVCk7CisJCQlpZiAoKHRtcCAmIDB4ZikgPT0gMHgzKQorCQkJCWJyZWFrOworCQkJaisrOworCQl9CisKKwkJdG1wID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9TQ1JfRVJSKTsKKwkJVlBSSU5USygiUE9SVF9TQ1JfRVJSIDB4JXhcbiIsIHRtcCk7CisJCXdyaXRlbCh0bXAsIHBvcnRfbW1pbyArIFBPUlRfU0NSX0VSUik7CisKKwkJLyogYWNrIGFueSBwZW5kaW5nIGlycSBldmVudHMgZm9yIHRoaXMgcG9ydCAqLworCQl0bXAgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX0lSUV9TVEFUKTsKKwkJVlBSSU5USygiUE9SVF9JUlFfU1RBVCAweCV4XG4iLCB0bXApOworCQlpZiAodG1wKQorCQkJd3JpdGVsKHRtcCwgcG9ydF9tbWlvICsgUE9SVF9JUlFfU1RBVCk7CisKKwkJd3JpdGVsKDEgPDwgaSwgbW1pbyArIEhPU1RfSVJRX1NUQVQpOworCisJCS8qIHNldCBpcnEgbWFzayAoZW5hYmxlcyBpbnRlcnJ1cHRzKSAqLworCQl3cml0ZWwoREVGX1BPUlRfSVJRLCBwb3J0X21taW8gKyBQT1JUX0lSUV9NQVNLKTsKKwl9CisKKwl0bXAgPSByZWFkbChtbWlvICsgSE9TVF9DVEwpOworCVZQUklOVEsoIkhPU1RfQ1RMIDB4JXhcbiIsIHRtcCk7CisJd3JpdGVsKHRtcCB8IEhPU1RfSVJRX0VOLCBtbWlvICsgSE9TVF9DVEwpOworCXRtcCA9IHJlYWRsKG1taW8gKyBIT1NUX0NUTCk7CisJVlBSSU5USygiSE9TVF9DVEwgMHgleFxuIiwgdG1wKTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIG1vdmUgdG8gUENJIGxheWVyLCBpbnRlZ3JhdGUgdy8gTVNJIHN0dWZmICovCitzdGF0aWMgdm9pZCBwY2lfZW5hYmxlX2ludHgoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTE2IHBjaV9jb21tYW5kOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZwY2lfY29tbWFuZCk7CisJaWYgKHBjaV9jb21tYW5kICYgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKSB7CisJCXBjaV9jb21tYW5kICY9IH5QQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEU7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NvbW1hbmQpOworCX0KK30KKworc3RhdGljIHZvaWQgYWhjaV9wcmludF9pbmZvKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQpCit7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IHByb2JlX2VudC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihwcm9iZV9lbnQtPmRldik7CisJdm9pZCAqbW1pbyA9IHByb2JlX2VudC0+bW1pb19iYXNlOworCXUzMiB2ZXJzLCBjYXAsIGltcGwsIHNwZWVkOworCWNvbnN0IGNoYXIgKnNwZWVkX3M7CisJdTE2IGNjOworCWNvbnN0IGNoYXIgKnNjY19zOworCisJdmVycyA9IHJlYWRsKG1taW8gKyBIT1NUX1ZFUlNJT04pOworCWNhcCA9IGhwcml2LT5jYXA7CisJaW1wbCA9IGhwcml2LT5wb3J0X21hcDsKKworCXNwZWVkID0gKGNhcCA+PiAyMCkgJiAweGY7CisJaWYgKHNwZWVkID09IDEpCisJCXNwZWVkX3MgPSAiMS41IjsKKwllbHNlIGlmIChzcGVlZCA9PSAyKQorCQlzcGVlZF9zID0gIjMiOworCWVsc2UKKwkJc3BlZWRfcyA9ICI/IjsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIDB4MGEsICZjYyk7CisJaWYgKGNjID09IDB4MDEwMSkKKwkJc2NjX3MgPSAiSURFIjsKKwllbHNlIGlmIChjYyA9PSAweDAxMDYpCisJCXNjY19zID0gIlNBVEEiOworCWVsc2UgaWYgKGNjID09IDB4MDEwNCkKKwkJc2NjX3MgPSAiUkFJRCI7CisJZWxzZQorCQlzY2NfcyA9ICJ1bmtub3duIjsKKworCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUgIiglcykgQUhDSSAlMDJ4JTAyeC4lMDJ4JTAyeCAiCisJCSIldSBzbG90cyAldSBwb3J0cyAlcyBHYnBzIDB4JXggaW1wbCAlcyBtb2RlXG4iCisJICAgICAgIAksCisJICAgICAgIAlwY2lfbmFtZShwZGV2KSwKKworCSAgICAgICAJKHZlcnMgPj4gMjQpICYgMHhmZiwKKwkgICAgICAgCSh2ZXJzID4+IDE2KSAmIDB4ZmYsCisJICAgICAgIAkodmVycyA+PiA4KSAmIDB4ZmYsCisJICAgICAgIAl2ZXJzICYgMHhmZiwKKworCQkoKGNhcCA+PiA4KSAmIDB4MWYpICsgMSwKKwkJKGNhcCAmIDB4MWYpICsgMSwKKwkJc3BlZWRfcywKKwkJaW1wbCwKKwkJc2NjX3MpOworCisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiKCVzKSBmbGFnczogIgorCSAgICAgICAJIiVzJXMlcyVzJXMlcyIKKwkgICAgICAgCSIlcyVzJXMlcyVzJXMlc1xuIgorCSAgICAgICAJLAorCSAgICAgICAJcGNpX25hbWUocGRldiksCisKKwkJY2FwICYgKDEgPDwgMzEpID8gIjY0Yml0ICIgOiAiIiwKKwkJY2FwICYgKDEgPDwgMzApID8gIm5jcSAiIDogIiIsCisJCWNhcCAmICgxIDw8IDI4KSA/ICJpbGNrICIgOiAiIiwKKwkJY2FwICYgKDEgPDwgMjcpID8gInN0YWcgIiA6ICIiLAorCQljYXAgJiAoMSA8PCAyNikgPyAicG0gIiA6ICIiLAorCQljYXAgJiAoMSA8PCAyNSkgPyAibGVkICIgOiAiIiwKKworCQljYXAgJiAoMSA8PCAyNCkgPyAiY2xvICIgOiAiIiwKKwkJY2FwICYgKDEgPDwgMTkpID8gIm56ICIgOiAiIiwKKwkJY2FwICYgKDEgPDwgMTgpID8gIm9ubHkgIiA6ICIiLAorCQljYXAgJiAoMSA8PCAxNykgPyAicG1wICIgOiAiIiwKKwkJY2FwICYgKDEgPDwgMTUpID8gInBpbyAiIDogIiIsCisJCWNhcCAmICgxIDw8IDE0KSA/ICJzbHVtICIgOiAiIiwKKwkJY2FwICYgKDEgPDwgMTMpID8gInBhcnQgIiA6ICIiCisJCSk7Cit9CisKK3N0YXRpYyBpbnQgYWhjaV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCA9IE5VTEw7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdjsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJdm9pZCAqbW1pb19iYXNlOworCXVuc2lnbmVkIGludCBib2FyZF9pZHggPSAodW5zaWduZWQgaW50KSBlbnQtPmRyaXZlcl9kYXRhOworCWludCBwY2lfZGV2X2J1c3kgPSAwOworCWludCByYzsKKworCVZQUklOVEsoIkVOVEVSXG4iKTsKKworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKHJjKSB7CisJCXBjaV9kZXZfYnVzeSA9IDE7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlwY2lfZW5hYmxlX2ludHgocGRldik7CisKKwlwcm9iZV9lbnQgPSBrbWFsbG9jKHNpemVvZigqcHJvYmVfZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByb2JlX2VudCA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJfQorCisJbWVtc2V0KHByb2JlX2VudCwgMCwgc2l6ZW9mKCpwcm9iZV9lbnQpKTsKKwlwcm9iZV9lbnQtPmRldiA9IHBjaV9kZXZfdG9fZGV2KHBkZXYpOworCUlOSVRfTElTVF9IRUFEKCZwcm9iZV9lbnQtPm5vZGUpOworCisJbW1pb19iYXNlID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgQUhDSV9QQ0lfQkFSKSwKKwkJICAgICAgICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCBBSENJX1BDSV9CQVIpKTsKKwlpZiAobW1pb19iYXNlID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZV9lbnQ7CisJfQorCWJhc2UgPSAodW5zaWduZWQgbG9uZykgbW1pb19iYXNlOworCisJaHByaXYgPSBrbWFsbG9jKHNpemVvZigqaHByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhwcml2KSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCW1lbXNldChocHJpdiwgMCwgc2l6ZW9mKCpocHJpdikpOworCisJcHJvYmVfZW50LT5zaHQJCT0gYWhjaV9wb3J0X2luZm9bYm9hcmRfaWR4XS5zaHQ7CisJcHJvYmVfZW50LT5ob3N0X2ZsYWdzCT0gYWhjaV9wb3J0X2luZm9bYm9hcmRfaWR4XS5ob3N0X2ZsYWdzOworCXByb2JlX2VudC0+cGlvX21hc2sJPSBhaGNpX3BvcnRfaW5mb1tib2FyZF9pZHhdLnBpb19tYXNrOworCXByb2JlX2VudC0+dWRtYV9tYXNrCT0gYWhjaV9wb3J0X2luZm9bYm9hcmRfaWR4XS51ZG1hX21hc2s7CisJcHJvYmVfZW50LT5wb3J0X29wcwk9IGFoY2lfcG9ydF9pbmZvW2JvYXJkX2lkeF0ucG9ydF9vcHM7CisKKyAgICAgICAJcHJvYmVfZW50LT5pcnEgPSBwZGV2LT5pcnE7CisgICAgICAgCXByb2JlX2VudC0+aXJxX2ZsYWdzID0gU0FfU0hJUlE7CisJcHJvYmVfZW50LT5tbWlvX2Jhc2UgPSBtbWlvX2Jhc2U7CisJcHJvYmVfZW50LT5wcml2YXRlX2RhdGEgPSBocHJpdjsKKworCS8qIGluaXRpYWxpemUgYWRhcHRlciAqLworCXJjID0gYWhjaV9ob3N0X2luaXQocHJvYmVfZW50KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9ocHJpdjsKKworCWFoY2lfcHJpbnRfaW5mbyhwcm9iZV9lbnQpOworCisJLyogRklYTUU6IGNoZWNrIGF0YV9kZXZpY2VfYWRkIHJldHVybiB2YWx1ZSAqLworCWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCk7CisJa2ZyZWUocHJvYmVfZW50KTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2hwcml2OgorCWtmcmVlKGhwcml2KTsKK2Vycl9vdXRfaW91bm1hcDoKKwlpb3VubWFwKG1taW9fYmFzZSk7CitlcnJfb3V0X2ZyZWVfZW50OgorCWtmcmVlKHByb2JlX2VudCk7CitlcnJfb3V0X3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXQ6CisJaWYgKCFwY2lfZGV2X2J1c3kpCisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgYWhjaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmYWhjaV9wY2lfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgYWhjaV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhaGNpX3BjaV9kcml2ZXIpOworfQorCisKK01PRFVMRV9BVVRIT1IoIkplZmYgR2FyemlrIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFIQ0kgU0FUQSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWhjaV9wY2lfdGJsKTsKKworbW9kdWxlX2luaXQoYWhjaV9pbml0KTsKK21vZHVsZV9leGl0KGFoY2lfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9LY29uZmlnLmFpYzc5eHggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9LY29uZmlnLmFpYzc5eHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI1MjNhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L0tjb25maWcuYWljNzl4eApAQCAtMCwwICsxLDk3IEBACisjCisjIEFJQzc5WFggMi41LlggS2VybmVsIGNvbmZpZ3VyYXRpb24gRmlsZS4KKyMgJElkOiAvL2RlcG90L2xpbnV4LWFpYzc5eHgtMi41LjAvZHJpdmVycy9zY3NpL2FpYzd4eHgvS2NvbmZpZy5haWM3OXh4IzQgJAorIworY29uZmlnIFNDU0lfQUlDNzlYWAorCXRyaXN0YXRlICJBZGFwdGVjIEFJQzc5eHggVTMyMCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kKKwloZWxwCisJVGhpcyBkcml2ZXIgc3VwcG9ydHMgYWxsIG9mIEFkYXB0ZWMncyBVbHRyYSAzMjAgUENJLVgKKwliYXNlZCBTQ1NJIGNvbnRyb2xsZXJzLgorCitjb25maWcgQUlDNzlYWF9DTURTX1BFUl9ERVZJQ0UKKwlpbnQgIk1heGltdW0gbnVtYmVyIG9mIFRDUSBjb21tYW5kcyBwZXIgZGV2aWNlIgorCWRlcGVuZHMgb24gU0NTSV9BSUM3OVhYCisJZGVmYXVsdCAiMzIiCisJLS0taGVscC0tLQorCVNwZWNpZnkgdGhlIG51bWJlciBvZiBjb21tYW5kcyB5b3Ugd291bGQgbGlrZSB0byBhbGxvY2F0ZSBwZXIgU0NTSQorCWRldmljZSB3aGVuIFRhZ2dlZCBDb21tYW5kIFF1ZXVlaW5nIChUQ1EpIGlzIGVuYWJsZWQgb24gdGhhdCBkZXZpY2UuCisKKwlUaGlzIGlzIGFuIHVwcGVyIGJvdW5kIHZhbHVlIGZvciB0aGUgbnVtYmVyIG9mIHRhZ2dlZCB0cmFuc2FjdGlvbnMKKwl0byBiZSB1c2VkIGZvciBhbnkgZGV2aWNlLiAgVGhlIGFpYzd4eHggZHJpdmVyIHdpbGwgYXV0b21hdGljYWxseQorCXZhcnkgdGhpcyBudW1iZXIgYmFzZWQgb24gZGV2aWNlIGJlaGF2aW9yLiAgRm9yIGRldmljZXMgd2l0aCBhCisJZml4ZWQgbWF4aW11bSwgdGhlIGRyaXZlciB3aWxsIGV2ZW50dWFsbHkgbG9jayB0byB0aGlzIG1heGltdW0KKwlhbmQgZGlzcGxheSBhIGNvbnNvbGUgbWVzc2FnZSBpbmlkaWNhdGluZyB0aGlzIHZhbHVlLgorCisJRHVlIHRvIHJlc291cmNlIGFsbG9jYXRpb24gaXNzdWVzIGluIHRoZSBMaW51eCBTQ1NJIG1pZC1sYXllciwgdXNpbmcKKwlhIGhpZ2ggbnVtYmVyIG9mIGNvbW1hbmRzIHBlciBkZXZpY2UgbWF5IHJlc3VsdCBpbiBtZW1vcnkgYWxsb2NhdGlvbgorCWZhaWx1cmVzIHdoZW4gbWFueSBkZXZpY2VzIGFyZSBhdHRhY2hlZCB0byB0aGUgc3lzdGVtLiAgRm9yIHRoaXMgcmVhc29uLAorCXRoZSBkZWZhdWx0IGlzIHNldCB0byAzMi4gIEhpZ2hlciB2YWx1ZXMgbWF5IHJlc3VsdCBpbiBoaWdlciBwZXJmb3JtYW5jZQorCW9uIHNvbWUgZGV2aWNlcy4gIFRoZSB1cHBlciBib3VuZCBpcyAyNTMuICAwIGRpc2FibGVzIHRhZ2dlZCBxdWV1ZWluZy4KKworCVBlciBkZXZpY2UgdGFnIGRlcHRoIGNhbiBiZSBjb250cm9sbGVkIHZpYSB0aGUga2VybmVsIGNvbW1hbmQgbGluZQorCSJ0YWdfaW5mbyIgb3B0aW9uLiAgU2VlIGRyaXZlcnMvc2NzaS9haWM3eHh4L1JFQURNRS5haWM3OXh4CisJZm9yIGRldGFpbHMuCisKK2NvbmZpZyBBSUM3OVhYX1JFU0VUX0RFTEFZX01TCisJaW50ICJJbml0aWFsIGJ1cyByZXNldCBkZWxheSBpbiBtaWxsaS1zZWNvbmRzIgorCWRlcGVuZHMgb24gU0NTSV9BSUM3OVhYCisJZGVmYXVsdCAiMTUwMDAiCisJLS0taGVscC0tLQorCVRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGFmdGVyIGFuIGluaXRpYWwgYnVzIHJlc2V0LgorCVRoZSBidXMgc2V0dGxlIGRlbGF5IGZvbGxvd2luZyBhbGwgZXJyb3IgcmVjb3ZlcnkgYWN0aW9ucyBpcworCWRpY3RhdGVkIGJ5IHRoZSBTQ1NJIGxheWVyIGFuZCBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyB2YWx1ZS4KKworCURlZmF1bHQ6IDE1MDAwICgxNSBzZWNvbmRzKQorCitjb25maWcgQUlDNzlYWF9CVUlMRF9GSVJNV0FSRQorCWJvb2wgIkJ1aWxkIEFkYXB0ZXIgRmlybXdhcmUgd2l0aCBLZXJuZWwgQnVpbGQiCisJZGVwZW5kcyBvbiBTQ1NJX0FJQzc5WFggJiYgIVBSRVZFTlRfRklSTVdBUkVfQlVJTEQKKwloZWxwCisJVGhpcyBvcHRpb24gc2hvdWxkIG9ubHkgYmUgZW5hYmxlZCBpZiB5b3UgYXJlIG1vZGlmeWluZyB0aGUgZmlybXdhcmUKKwlzb3VyY2UgdG8gdGhlIGFpYzc5eHggZHJpdmVyIGFuZCB3aXNoIHRvIGhhdmUgdGhlIGdlbmVyYXRlZCBmaXJtd2FyZQorCWluY2x1ZGUgZmlsZXMgdXBkYXRlZCBkdXJpbmcgYSBub3JtYWwga2VybmVsIGJ1aWxkLiAgVGhlIGFzc2VtYmxlcgorCWZvciB0aGUgZmlybXdhcmUgcmVxdWlyZXMgbGV4IGFuZCB5YWNjIG9yIHRoZWlyIGVxdWl2YWxlbnRzLCBhcyB3ZWxsCisJYXMgdGhlIGRiIHYxIGxpYnJhcnkuICBZb3UgbWF5IGhhdmUgdG8gaW5zdGFsbCBhZGRpdGlvbmFsIHBhY2thZ2VzCisJb3IgbW9kaWZ5IHRoZSBhc3NlbWJsZXIgTWFrZWZpbGUgb3IgdGhlIGZpbGVzIGl0IGluY2x1ZGVzIGlmIHlvdXIKKwlidWlsZCBlbnZpcm9ubWVudCBpcyBkaWZmZXJlbnQgdGhhbiB0aGF0IG9mIHRoZSBhdXRob3IuCisKK2NvbmZpZyBBSUM3OVhYX0VOQUJMRV9SRF9TVFJNCisJYm9vbCAiRW5hYmxlIFJlYWQgU3RyZWFtaW5nIGZvciBBbGwgVGFyZ2V0cyIKKwlkZXBlbmRzIG9uIFNDU0lfQUlDNzlYWAorCWRlZmF1bHQgbgorCWhlbHAKKwlSZWFkIFN0cmVhbWluZyBpcyBhIFUzMjAgcHJvdG9jb2wgb3B0aW9uIHRoYXQgc2hvdWxkIGVuaGFuY2UKKwlwZXJmb3JtYW5jZS4gIEVhcmx5IFUzMjAgZHJpdmUgZmlybXdhcmUgYWN0dWFsbHkgcGVyZm9ybXMgc2xvd2VyCisJd2l0aCByZWFkIHN0cmVhbWluZyBlbmFibGVkIHNvIGl0IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuICBSZWFkCisJU3RyZWFtaW5nIGNhbiBiZSBjb25maWd1cmVkIGluIG11Y2ggdGhlIHNhbWUgd2F5IGFzIHRhZ2dlZCBxdWV1ZWluZworCXVzaW5nIHRoZSAicmRfc3RybSIgY29tbWFuZCBsaW5lIG9wdGlvbi4gIFNlZQorCWRyaXZlcnMvc2NzaS9haWM3eHh4L1JFQURNRS5haWM3OXh4IGZvciBkZXRhaWxzLgorCitjb25maWcgQUlDNzlYWF9ERUJVR19FTkFCTEUKKwlib29sICJDb21waWxlIGluIERlYnVnZ2luZyBDb2RlIgorCWRlcGVuZHMgb24gU0NTSV9BSUM3OVhYCisJZGVmYXVsdCB5CisJaGVscAorCUNvbXBpbGUgaW4gYWljNzl4eCBkZWJ1Z2dpbmcgY29kZSB0aGF0IGNhbiBiZSB1c2VmdWwgaW4gZGlhZ25vc2luZworCWRyaXZlciBlcnJvcnMuCisKK2NvbmZpZyBBSUM3OVhYX0RFQlVHX01BU0sKKwlpbnQgIkRlYnVnIGNvZGUgZW5hYmxlIG1hc2sgKDE2MzgzIGZvciBhbGwgZGVidWdnaW5nKSIKKwlkZXBlbmRzIG9uIFNDU0lfQUlDNzlYWAorCWRlZmF1bHQgIjAiCisJaGVscAorCUJpdCBtYXNrIG9mIGRlYnVnIG9wdGlvbnMgdGhhdCBpcyBvbmx5IHZhbGlkIGlmIHRoZQorCUNPTkZJR19BSUM3OVhYX0RFQlVHX0VOQkxFIG9wdGlvbiBpcyBlbmFibGVkLiAgVGhlIGJpdHMgaW4gdGhpcyBtYXNrCisJYXJlIGRlZmluZWQgaW4gdGhlIGRyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHguaCAtIHNlYXJjaCBmb3IgdGhlCisJdmFyaWFibGUgYWhkX2RlYnVnIGluIHRoYXQgZmlsZSB0byBmaW5kIHRoZW0uCisKK2NvbmZpZyBBSUM3OVhYX1JFR19QUkVUVFlfUFJJTlQKKwlib29sICJEZWNvZGUgcmVnaXN0ZXJzIGR1cmluZyBkaWFnbm9zdGljcyIKKwlkZXBlbmRzIG9uIFNDU0lfQUlDNzlYWAorCWRlZmF1bHQgeQorCWhlbHAKKwlDb21waWxlIGluIHJlZ2lzdGVyIHZhbHVlIHRhYmxlcyBmb3IgdGhlIG91dHB1dCBvZiBleHBhbmRlZCByZWdpc3RlcgorCWNvbnRlbnRzIGluIGRpYWdub3N0aWNzLiAgVGhpcyBtYWtlIGl0IG11Y2ggZWFzaWVyIHRvIHVuZGVyc3RhbmQgZGVidWcKKwlvdXRwdXQgd2l0aG91dCBoYXZpbmcgdG8gcmVmZXIgdG8gYSBkYXRhIGJvb2sgYW5kL29yIHRoZSBhaWM3eHh4LnJlZworCWZpbGUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9LY29uZmlnLmFpYzd4eHggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9LY29uZmlnLmFpYzd4eHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5OGUwZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L0tjb25maWcuYWljN3h4eApAQCAtMCwwICsxLDEwMCBAQAorIworIyBBSUM3WFhYIGFuZCBBSUM3OVhYIDIuNS5YIEtlcm5lbCBjb25maWd1cmF0aW9uIEZpbGUuCisjICRJZDogLy9kZXBvdC9saW51eC1haWM3OXh4LTIuNS4wL2RyaXZlcnMvc2NzaS9haWM3eHh4L0tjb25maWcuYWljN3h4eCM3ICQKKyMKK2NvbmZpZyBTQ1NJX0FJQzdYWFgKKwl0cmlzdGF0ZSAiQWRhcHRlYyBBSUM3eHh4IEZhc3QgLT4gVTE2MCBzdXBwb3J0IChOZXcgRHJpdmVyKSIKKwlkZXBlbmRzIG9uIChQQ0kgfHwgRUlTQSkgJiYgU0NTSQorCS0tLWhlbHAtLS0KKwlUaGlzIGRyaXZlciBzdXBwb3J0cyBhbGwgb2YgQWRhcHRlYydzIEZhc3QgdGhyb3VnaCBVbHRyYSAxNjAgUENJCisJYmFzZWQgU0NTSSBjb250cm9sbGVycyBhcyB3ZWxsIGFzIHRoZSBhaWM3NzcwIGJhc2VkIEVJU0EgYW5kIFZMQgorCVNDU0kgY29udHJvbGxlcnMgKHRoZSAyNzR4IGFuZCAyODR4IHNlcmllcykuICBGb3IgQUFBIGFuZCBBUk8gYmFzZWQKKwljb25maWd1cmF0aW9ucywgb25seSBTQ1NJIGZ1bmN0aW9uYWxpdHkgaXMgcHJvdmlkZWQuCisKKwlUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwltb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWljN3h4eC4KKworY29uZmlnIEFJQzdYWFhfQ01EU19QRVJfREVWSUNFCisJaW50ICJNYXhpbXVtIG51bWJlciBvZiBUQ1EgY29tbWFuZHMgcGVyIGRldmljZSIKKwlkZXBlbmRzIG9uIFNDU0lfQUlDN1hYWAorCWRlZmF1bHQgIjMyIgorCS0tLWhlbHAtLS0KKwlTcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29tbWFuZHMgeW91IHdvdWxkIGxpa2UgdG8gYWxsb2NhdGUgcGVyIFNDU0kKKwlkZXZpY2Ugd2hlbiBUYWdnZWQgQ29tbWFuZCBRdWV1ZWluZyAoVENRKSBpcyBlbmFibGVkIG9uIHRoYXQgZGV2aWNlLgorCisJVGhpcyBpcyBhbiB1cHBlciBib3VuZCB2YWx1ZSBmb3IgdGhlIG51bWJlciBvZiB0YWdnZWQgdHJhbnNhY3Rpb25zCisJdG8gYmUgdXNlZCBmb3IgYW55IGRldmljZS4gIFRoZSBhaWM3eHh4IGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkKKwl2YXJ5IHRoaXMgbnVtYmVyIGJhc2VkIG9uIGRldmljZSBiZWhhdmlvci4gIEZvciBkZXZpY2VzIHdpdGggYQorCWZpeGVkIG1heGltdW0sIHRoZSBkcml2ZXIgd2lsbCBldmVudHVhbGx5IGxvY2sgdG8gdGhpcyBtYXhpbXVtCisJYW5kIGRpc3BsYXkgYSBjb25zb2xlIG1lc3NhZ2UgaW5pZGljYXRpbmcgdGhpcyB2YWx1ZS4KKworCUR1ZSB0byByZXNvdXJjZSBhbGxvY2F0aW9uIGlzc3VlcyBpbiB0aGUgTGludXggU0NTSSBtaWQtbGF5ZXIsIHVzaW5nCisJYSBoaWdoIG51bWJlciBvZiBjb21tYW5kcyBwZXIgZGV2aWNlIG1heSByZXN1bHQgaW4gbWVtb3J5IGFsbG9jYXRpb24KKwlmYWlsdXJlcyB3aGVuIG1hbnkgZGV2aWNlcyBhcmUgYXR0YWNoZWQgdG8gdGhlIHN5c3RlbS4gIEZvciB0aGlzIHJlYXNvbiwKKwl0aGUgZGVmYXVsdCBpcyBzZXQgdG8gMzIuICBIaWdoZXIgdmFsdWVzIG1heSByZXN1bHQgaW4gaGlnZXIgcGVyZm9ybWFuY2UKKwlvbiBzb21lIGRldmljZXMuICBUaGUgdXBwZXIgYm91bmQgaXMgMjUzLiAgMCBkaXNhYmxlcyB0YWdnZWQgcXVldWVpbmcuCisKKwlQZXIgZGV2aWNlIHRhZyBkZXB0aCBjYW4gYmUgY29udHJvbGxlZCB2aWEgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUKKwkidGFnX2luZm8iIG9wdGlvbi4gIFNlZSBkcml2ZXJzL3Njc2kvYWljN3h4eC9SRUFETUUuYWljN3h4eAorCWZvciBkZXRhaWxzLgorCitjb25maWcgQUlDN1hYWF9SRVNFVF9ERUxBWV9NUworCWludCAiSW5pdGlhbCBidXMgcmVzZXQgZGVsYXkgaW4gbWlsbGktc2Vjb25kcyIKKwlkZXBlbmRzIG9uIFNDU0lfQUlDN1hYWAorCWRlZmF1bHQgIjE1MDAwIgorCS0tLWhlbHAtLS0KKwlUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBhZnRlciBhbiBpbml0aWFsIGJ1cyByZXNldC4KKwlUaGUgYnVzIHNldHRsZSBkZWxheSBmb2xsb3dpbmcgYWxsIGVycm9yIHJlY292ZXJ5IGFjdGlvbnMgaXMKKwlkaWN0YXRlZCBieSB0aGUgU0NTSSBsYXllciBhbmQgaXMgbm90IGFmZmVjdGVkIGJ5IHRoaXMgdmFsdWUuCisKKwlEZWZhdWx0OiAxNTAwMCAoMTUgc2Vjb25kcykKKworY29uZmlnIEFJQzdYWFhfUFJPQkVfRUlTQV9WTAorCWJvb2wgIlByb2JlIGZvciBFSVNBIGFuZCBWTCBBSUM3WFhYIEFkYXB0ZXJzIgorCWRlcGVuZHMgb24gU0NTSV9BSUM3WFhYICYmIEVJU0EKKwloZWxwCisJUHJvYmUgZm9yIEVJU0EgYW5kIFZMQiBBaWM3eHh4IGNvbnRyb2xsZXJzLiAgSW4gbWFueSBuZXdlciBzeXN0ZW1zLAorCXRoZSBpbnZhc2l2ZSBwcm9iZXMgbmVjZXNzYXJ5IHRvIGRldGVjdCB0aGVzZSBjb250cm9sbGVycyBjYW4gY2F1c2UKKwlvdGhlciBkZXZpY2VzIHRvIGZhaWwuICBGb3IgdGhpcyByZWFzb24sIHRoZSBub24tUENJIHByb2JlIGNvZGUgaXMKKwlkaXNhYmxlZCBieSBkZWZhdWx0LiAgVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhpcyBvcHRpb24gY2FuIGJlICJ0b2dnbGVkIgorCXZpYSB0aGUgbm9fcHJvYmUga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24uCisKK2NvbmZpZyBBSUM3WFhYX0JVSUxEX0ZJUk1XQVJFCisJYm9vbCAiQnVpbGQgQWRhcHRlciBGaXJtd2FyZSB3aXRoIEtlcm5lbCBCdWlsZCIKKwlkZXBlbmRzIG9uIFNDU0lfQUlDN1hYWCAmJiAhUFJFVkVOVF9GSVJNV0FSRV9CVUlMRAorCWhlbHAKKwlUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSBlbmFibGVkIGlmIHlvdSBhcmUgbW9kaWZ5aW5nIHRoZSBmaXJtd2FyZQorCXNvdXJjZSB0byB0aGUgYWljN3h4eCBkcml2ZXIgYW5kIHdpc2ggdG8gaGF2ZSB0aGUgZ2VuZXJhdGVkIGZpcm13YXJlCisJaW5jbHVkZSBmaWxlcyB1cGRhdGVkIGR1cmluZyBhIG5vcm1hbCBrZXJuZWwgYnVpbGQuICBUaGUgYXNzZW1ibGVyCisJZm9yIHRoZSBmaXJtd2FyZSByZXF1aXJlcyBsZXggYW5kIHlhY2Mgb3IgdGhlaXIgZXF1aXZhbGVudHMsIGFzIHdlbGwKKwlhcyB0aGUgZGIgdjEgbGlicmFyeS4gIFlvdSBtYXkgaGF2ZSB0byBpbnN0YWxsIGFkZGl0aW9uYWwgcGFja2FnZXMKKwlvciBtb2RpZnkgdGhlIGFzc2VtYmxlciBNYWtlZmlsZSBvciB0aGUgZmlsZXMgaXQgaW5jbHVkZXMgaWYgeW91cgorCWJ1aWxkIGVudmlyb25tZW50IGlzIGRpZmZlcmVudCB0aGFuIHRoYXQgb2YgdGhlIGF1dGhvci4KKworY29uZmlnIEFJQzdYWFhfREVCVUdfRU5BQkxFCisJYm9vbCAiQ29tcGlsZSBpbiBEZWJ1Z2dpbmcgQ29kZSIKKwlkZXBlbmRzIG9uIFNDU0lfQUlDN1hYWAorCWRlZmF1bHQgeQorCWhlbHAKKwlDb21waWxlIGluIGFpYzd4eHggZGVidWdnaW5nIGNvZGUgdGhhdCBjYW4gYmUgdXNlZnVsIGluIGRpYWdub3NpbmcKKwlkcml2ZXIgZXJyb3JzLgorCitjb25maWcgQUlDN1hYWF9ERUJVR19NQVNLCisgICAgICAgIGludCAiRGVidWcgY29kZSBlbmFibGUgbWFzayAoMjA0NyBmb3IgYWxsIGRlYnVnZ2luZykiCisgICAgICAgIGRlcGVuZHMgb24gU0NTSV9BSUM3WFhYCisgICAgICAgIGRlZmF1bHQgIjAiCisgICAgICAgIGhlbHAKKwlCaXQgbWFzayBvZiBkZWJ1ZyBvcHRpb25zIHRoYXQgaXMgb25seSB2YWxpZCBpZiB0aGUKKwlDT05GSUdfQUlDN1hYWF9ERUJVR19FTkJMRSBvcHRpb24gaXMgZW5hYmxlZC4gIFRoZSBiaXRzIGluIHRoaXMgbWFzaworCWFyZSBkZWZpbmVkIGluIHRoZSBkcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LmggLSBzZWFyY2ggZm9yIHRoZQorCXZhcmlhYmxlIGFoY19kZWJ1ZyBpbiB0aGF0IGZpbGUgdG8gZmluZCB0aGVtLgorCitjb25maWcgQUlDN1hYWF9SRUdfUFJFVFRZX1BSSU5UCisgICAgICAgIGJvb2wgIkRlY29kZSByZWdpc3RlcnMgZHVyaW5nIGRpYWdub3N0aWNzIgorICAgICAgICBkZXBlbmRzIG9uIFNDU0lfQUlDN1hYWAorCWRlZmF1bHQgeQorICAgICAgICBoZWxwCisJQ29tcGlsZSBpbiByZWdpc3RlciB2YWx1ZSB0YWJsZXMgZm9yIHRoZSBvdXRwdXQgb2YgZXhwYW5kZWQgcmVnaXN0ZXIKKwljb250ZW50cyBpbiBkaWFnbm9zdGljcy4gIFRoaXMgbWFrZSBpdCBtdWNoIGVhc2llciB0byB1bmRlcnN0YW5kIGRlYnVnCisJb3V0cHV0IHdpdGhvdXQgaGF2aW5nIHRvIHJlZmVyIHRvIGEgZGF0YSBib29rIGFuZC9vciB0aGUgYWljN3h4eC5yZWcKKwlmaWxlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTZjZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvTWFrZWZpbGUKQEAgLTAsMCArMSw5OSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IGFpYzd4eHggU0NTSSBkcml2ZXIuCisjCisjICRJZDogLy9kZXBvdC9saW51eC1haWM3OXh4LTIuNS4wL2RyaXZlcnMvc2NzaS9haWM3eHh4L01ha2VmaWxlIzggJAorIworCisjIExldCBrYnVpbGQgZGVzY2VuZCBpbnRvIGFpY2FzbSB3aGVuIGNsZWFuaW5nCitzdWJkaXItCQkJCSs9IGFpY2FzbQorCitvYmotJChDT05GSUdfU0NTSV9BSUM3WFhYKQkrPSBhaWM3eHh4Lm8KK29iai0kKENPTkZJR19TQ1NJX0FJQzc5WFgpCSs9IGFpYzc5eHgubworCisjIENvcmUgRmFzdCAtPiBVMTYwIGZpbGVzCithaWM3eHh4LXkJCQkJCSs9IGFpYzd4eHhfY29yZS5vCVwKKwkJCQkJCSAgIGFpYzd4eHhfOTNjeDYubworYWljN3h4eC0kKENPTkZJR19FSVNBKQkJCQkrPSBhaWM3NzcwLm8KK2FpYzd4eHgtJChDT05GSUdfUENJKQkJCQkrPSBhaWM3eHh4X3BjaS5vCithaWM3eHh4LSQoQ09ORklHX0FJQzdYWFhfUkVHX1BSRVRUWV9QUklOVCkJKz0gYWljN3h4eF9yZWdfcHJpbnQubworCisjIFBsYXRmb3JtIFNwZWNpZmljIEZhc3QgLT4gVTE2MCBGaWxlcworYWljN3h4eC15CQkJCQkrPSBhaWM3eHh4X29zbS5vCVwKKwkJCQkJCSAgIGFpYzd4eHhfcHJvYy5vCithaWM3eHh4LSQoQ09ORklHX0VJU0EpCQkJCSs9IGFpYzc3NzBfb3NtLm8KK2FpYzd4eHgtJChDT05GSUdfUENJKQkJCQkrPSBhaWM3eHh4X29zbV9wY2kubworCisjIENvcmUgVTMyMCBmaWxlcworYWljNzl4eC15CQkJCQkrPSBhaWM3OXh4X2NvcmUubwlcCisJCQkJCQkgICBhaWM3OXh4X3BjaS5vCithaWM3OXh4LSQoQ09ORklHX0FJQzc5WFhfUkVHX1BSRVRUWV9QUklOVCkJKz0gYWljNzl4eF9yZWdfcHJpbnQubworCisjIFBsYXRmb3JtIFNwZWNpZmljIFUzMjAgRmlsZXMKK2FpYzc5eHgteQkJCQkJKz0gYWljNzl4eF9vc20ubwlcCisJCQkJCQkgICBhaWM3OXh4X3Byb2MubwlcCisJCQkJCQkgICBhaWM3OXh4X29zbV9wY2kubworCitFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL3Njc2kKK2lmZGVmIFdBUk5JTkdTX0JFQ09NRV9FUlJPUlMKK0VYVFJBX0NGTEFHUyArPSAtV2Vycm9yCitlbmRpZgorI0VYVFJBX0NGTEFHUyArPSAtZworCisjIEZpbGVzIGdlbmVyYXRlZCB0aGF0IHNoYWxsIGJlIHJlbW92ZWQgdXBvbiBtYWtlIGNsZWFuCitjbGVhbi1maWxlcyA6PSBhaWM3eHh4X3NlcS5oIGFpYzd4eHhfcmVnLmggYWljN3h4eF9yZWdfcHJpbnQuYworY2xlYW4tZmlsZXMgKz0gYWljNzl4eF9zZXEuaCBhaWM3OXh4X3JlZy5oIGFpYzc5eHhfcmVnX3ByaW50LmMKKworIyBEZXBlbmRlbmNpZXMgZm9yIGdlbmVyYXRlZCBmaWxlcyBuZWVkIHRvIGJlIGxpc3RlZCBleHBsaWNpdGx5CisKKyQob2JqKS9haWM3eHh4X2NvcmUubzogJChvYmopL2FpYzd4eHhfc2VxLmgKKyQob2JqKS9haWM3OXh4X2NvcmUubzogJChvYmopL2FpYzc5eHhfc2VxLmgKKyQob2JqKS9haWM3OXh4X3JlZ19wcmludC5jOiAkKHNyYykvYWljNzl4eF9yZWdfcHJpbnQuY19zaGlwcGVkCiskKG9iaikvYWljN3h4eF9yZWdfcHJpbnQuYzogJChzcmMpL2FpYzd4eHhfcmVnX3ByaW50LmNfc2hpcHBlZAorCiskKGFkZHByZWZpeCAkKG9iaikvLCQoYWljN3h4eC15KSk6ICQob2JqKS9haWM3eHh4X3JlZy5oCiskKGFkZHByZWZpeCAkKG9iaikvLCQoYWljNzl4eC15KSk6ICQob2JqKS9haWM3OXh4X3JlZy5oCisKK2FpYzd4eHgtZ2VuLSQoQ09ORklHX0FJQzdYWFhfQlVJTERfRklSTVdBUkUpCTo9ICQob2JqKS9haWM3eHh4X3NlcS5oIFwKKwkJCQkJCSAgICQob2JqKS9haWM3eHh4X3JlZy5oCithaWM3eHh4LWdlbi0kKENPTkZJR19BSUM3WFhYX1JFR19QUkVUVFlfUFJJTlQpCSs9ICQob2JqKS9haWM3eHh4X3JlZ19wcmludC5jCisKK2FpY2FzbS03eHh4LW9wdHMtJChDT05GSUdfQUlDN1hYWF9SRUdfUFJFVFRZX1BSSU5UKSA6PSBcCisJLXAgJChvYmopL2FpYzd4eHhfcmVnX3ByaW50LmMgLWkgYWljN3h4eF9vc20uaAorCitpZmVxICgkKENPTkZJR19BSUM3WFhYX0JVSUxEX0ZJUk1XQVJFKSx5KQorIyBDcmVhdGUgYSBkZXBlbmRlbmN5IGNoYWluIGluIGdlbmVyYXRlZCBmaWxlcworIyB0byBhdm9pZCBjb25jdXJyZW50IGludm9jYXRpb25zIG9mIHRoZSBzaW5nbGUKKyMgcnVsZSB0aGF0IGJ1aWxkcyB0aGVtIGFsbC4KK2FpYzd4eHhfc2VxLmg6IGFpYzd4eHhfcmVnLmgKK2lmZXEgKCQoQ09ORklHX0FJQzdYWFhfUkVHX1BSRVRUWV9QUklOVCkseSkKK2FpYzd4eHhfcmVnLmg6IGFpYzd4eHhfcmVnX3ByaW50LmMKK2VuZGlmCiskKGFpYzd4eHgtZ2VuLXkpOiAkKHNyYykvYWljN3h4eC5zZXEgJChzcmMpL2FpYzd4eHgucmVnICQob2JqKS9haWNhc20vYWljYXNtCisJJChvYmopL2FpY2FzbS9haWNhc20gLUkkKHNyYykgLXIgJChvYmopL2FpYzd4eHhfcmVnLmggXAorCQkJICAgICAgJChhaWNhc20tN3h4eC1vcHRzLXkpIC1vICQob2JqKS9haWM3eHh4X3NlcS5oIFwKKwkJCSAgICAgICQoc3JjKS9haWM3eHh4LnNlcQorZW5kaWYKKworYWljNzl4eC1nZW4tJChDT05GSUdfQUlDNzlYWF9CVUlMRF9GSVJNV0FSRSkJOj0gJChvYmopL2FpYzc5eHhfc2VxLmggXAorCQkJCQkJICAgJChvYmopL2FpYzc5eHhfcmVnLmgKK2FpYzc5eHgtZ2VuLSQoQ09ORklHX0FJQzc5WFhfUkVHX1BSRVRUWV9QUklOVCkJKz0gJChvYmopL2FpYzc5eHhfcmVnX3ByaW50LmMKKworYWljYXNtLTc5eHgtb3B0cy0kKENPTkZJR19BSUM3OVhYX1JFR19QUkVUVFlfUFJJTlQpIDo9IFwKKwktcCAkKG9iaikvYWljNzl4eF9yZWdfcHJpbnQuYyAtaSBhaWM3OXh4X29zbS5oCisKK2lmZXEgKCQoQ09ORklHX0FJQzc5WFhfQlVJTERfRklSTVdBUkUpLHkpCisjIENyZWF0ZSBhIGRlcGVuZGVuY3kgY2hhaW4gaW4gZ2VuZXJhdGVkIGZpbGVzCisjIHRvIGF2b2lkIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMgb2YgdGhlIHNpbmdsZQorIyBydWxlIHRoYXQgYnVpbGRzIHRoZW0gYWxsLgorYWljNzl4eF9zZXEuaDogYWljNzl4eF9yZWcuaAoraWZlcSAoJChDT05GSUdfQUlDNzlYWF9SRUdfUFJFVFRZX1BSSU5UKSx5KQorYWljNzl4eF9yZWcuaDogYWljNzl4eF9yZWdfcHJpbnQuYworZW5kaWYKKyQoYWljNzl4eC1nZW4teSk6ICQoc3JjKS9haWM3OXh4LnNlcSAkKHNyYykvYWljNzl4eC5yZWcgJChvYmopL2FpY2FzbS9haWNhc20KKwkkKG9iaikvYWljYXNtL2FpY2FzbSAtSSQoc3JjKSAtciAkKG9iaikvYWljNzl4eF9yZWcuaCBcCisJCQkgICAgICAkKGFpY2FzbS03OXh4LW9wdHMteSkgLW8gJChvYmopL2FpYzc5eHhfc2VxLmggXAorCQkJICAgICAgJChzcmMpL2FpYzc5eHguc2VxCitlbmRpZgorCiskKG9iaikvYWljYXNtL2FpY2FzbTogJChzcmMpL2FpY2FzbS8qLltjaHlsXQorCSQoTUFLRSkgLUMgJChzcmMpL2FpY2FzbQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzc3MC5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzc3MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNzAzYmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3NzcwLmMKQEAgLTAsMCArMSw0MTUgQEAKKy8qCisgKiBQcm9kdWN0IHNwZWNpZmljIHByb2JlIGFuZCBhdHRhY2ggcm91dGluZXMgZm9yOgorICogCTI3LzI4NFggYW5kIGFpYzc3NzAgbW90aGVyYm9hcmQgU0NTSSBjb250cm9sbGVycworICoKKyAqIENvcHlyaWdodCAoYykgMTk5NC0xOTk4LCAyMDAwLCAyMDAxIEp1c3RpbiBULiBHaWJicy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc3NzAuYyMzMiAkCisgKgorICogJEZyZWVCU0QkCisgKi8KKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgImFpYzd4eHhfb3NtLmgiCisjaW5jbHVkZSAiYWljN3h4eF9pbmxpbmUuaCIKKyNpbmNsdWRlICJhaWM3eHh4XzkzY3g2LmgiCisjZWxzZQorI2luY2x1ZGUgPGRldi9haWM3eHh4L2FpYzd4eHhfb3NtLmg+CisjaW5jbHVkZSA8ZGV2L2FpYzd4eHgvYWljN3h4eF9pbmxpbmUuaD4KKyNpbmNsdWRlIDxkZXYvYWljN3h4eC9haWM3eHh4XzkzY3g2Lmg+CisjZW5kaWYKKworI2RlZmluZSBJRF9BSUM3NzcwCTB4MDQ5MDc3NzAKKyNkZWZpbmUgSURfQUhBXzI3NHgJMHgwNDkwNzc3MQorI2RlZmluZSBJRF9BSEFfMjg0eEIJMHgwNDkwNzc1NiAvKiBCSU9TIGVuYWJsZWQgKi8KKyNkZWZpbmUgSURfQUhBXzI4NHgJMHgwNDkwNzc1NyAvKiBCSU9TIGRpc2FibGVkKi8KKyNkZWZpbmUJSURfT0xWXzI3NHgJMHgwNDkwNzc4MiAvKiBPbGl2ZXR0aSBPRU0gKi8KKyNkZWZpbmUJSURfT0xWXzI3NHhECTB4MDQ5MDc3ODMgLyogT2xpdmV0dGkgT0VNIChEaWZmZXJlbnRpYWwpICovCisKK3N0YXRpYyBpbnQgYWljNzc3MF9jaGlwX2luaXQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyBpbnQgYWljNzc3MF9zdXNwZW5kKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgaW50IGFpYzc3NzBfcmVzdW1lKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgaW50IGFoYTI4NDBfbG9hZF9zZWVwcm9tKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgYWhjX2RldmljZV9zZXR1cF90IGFoY19haWM3NzcwX1ZMX3NldHVwOworc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYWljNzc3MF9FSVNBX3NldHVwOworc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYWljNzc3MF9zZXR1cDsKKworc3RydWN0IGFpYzc3NzBfaWRlbnRpdHkgYWljNzc3MF9pZGVudF90YWJsZVtdID0KK3sKKwl7CisJCUlEX0FIQV8yNzR4LAorCQkweEZGRkZGRkZGLAorCQkiQWRhcHRlYyAyNzRYIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3NzcwX0VJU0Ffc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzI4NHhCLAorCQkweEZGRkZGRkZFLAorCQkiQWRhcHRlYyAyODRYIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3NzcwX1ZMX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8yODR4LAorCQkweEZGRkZGRkZFLAorCQkiQWRhcHRlYyAyODRYIFNDU0kgYWRhcHRlciAoQklPUyBEaXNhYmxlZCkiLAorCQlhaGNfYWljNzc3MF9WTF9zZXR1cAorCX0sCisJeworCQlJRF9PTFZfMjc0eCwKKwkJMHhGRkZGRkZGRiwKKwkJIkFkYXB0ZWMgKE9saXZldHRpIE9FTSkgMjc0WCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzc3MF9FSVNBX3NldHVwCisJfSwKKwl7CisJCUlEX09MVl8yNzR4RCwKKwkJMHhGRkZGRkZGRiwKKwkJIkFkYXB0ZWMgKE9saXZldHRpIE9FTSkgMjc0WCBEaWZmZXJlbnRpYWwgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc3NzBfRUlTQV9zZXR1cAorCX0sCisJLyogR2VuZXJpYyBjaGlwIHByb2JlcyBmb3IgZGV2aWNlcyB3ZSBkb24ndCBrbm93ICdleGFjdGx5JyAqLworCXsKKwkJSURfQUlDNzc3MCwKKwkJMHhGRkZGRkZGRiwKKwkJIkFkYXB0ZWMgYWljNzc3MCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzc3MF9FSVNBX3NldHVwCisJfQorfTsKK2NvbnN0IGludCBhaGNfbnVtX2FpYzc3NzBfZGV2cyA9IE5VTV9FTEVNRU5UUyhhaWM3NzcwX2lkZW50X3RhYmxlKTsKKworc3RydWN0IGFpYzc3NzBfaWRlbnRpdHkgKgorYWljNzc3MF9maW5kX2RldmljZSh1aW50MzJfdCBpZCkKK3sKKwlzdHJ1Y3QJYWljNzc3MF9pZGVudGl0eSAqZW50cnk7CisJaW50CWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWhjX251bV9haWM3NzcwX2RldnM7IGkrKykgeworCQllbnRyeSA9ICZhaWM3NzcwX2lkZW50X3RhYmxlW2ldOworCQlpZiAoZW50cnktPmZ1bGxfaWQgPT0gKGlkICYgZW50cnktPmlkX21hc2spKQorCQkJcmV0dXJuIChlbnRyeSk7CisJfQorCXJldHVybiAoTlVMTCk7Cit9CisKK2ludAorYWljNzc3MF9jb25maWcoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWljNzc3MF9pZGVudGl0eSAqZW50cnksIHVfaW50IGlvKQoreworCXVfbG9uZwlsOworCWludAllcnJvcjsKKwlpbnQJaGF2ZV9zZWVwcm9tOworCXVfaW50CWhvc3Rjb25mOworCXVfaW50ICAgaXJxOworCXVfaW50CWludGRlZjsKKworCWVycm9yID0gZW50cnktPnNldHVwKGFoYyk7CisJaGF2ZV9zZWVwcm9tID0gMDsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwllcnJvciA9IGFpYzc3NzBfbWFwX3JlZ2lzdGVycyhhaGMsIGlvKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwkvKgorCSAqIEJlZm9yZSB3ZSBjb250aW51ZSBwcm9iaW5nIHRoZSBjYXJkLCBlbnN1cmUgdGhhdAorCSAqIGl0cyBpbnRlcnJ1cHRzIGFyZSAqZGlzYWJsZWQqLiAgV2UgZG9uJ3Qgd2FudAorCSAqIGEgbWlzc3RlcCB0byBoYW5nIHRoZSBtYWNoaW5lIGluIGFuIGludGVycnVwdAorCSAqIHN0b3JtLgorCSAqLworCWFoY19pbnRyX2VuYWJsZShhaGMsIEZBTFNFKTsKKworCWFoYy0+ZGVzY3JpcHRpb24gPSBlbnRyeS0+bmFtZTsKKwllcnJvciA9IGFoY19zb2Z0Y19pbml0KGFoYyk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOworCisJYWhjLT5idXNfY2hpcF9pbml0ID0gYWljNzc3MF9jaGlwX2luaXQ7CisJYWhjLT5idXNfc3VzcGVuZCA9IGFpYzc3NzBfc3VzcGVuZDsKKwlhaGMtPmJ1c19yZXN1bWUgPSBhaWM3NzcwX3Jlc3VtZTsKKworCWVycm9yID0gYWhjX3Jlc2V0KGFoYywgLypyZWluaXQqL0ZBTFNFKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIGludGVycnVwdCB2ZWN0b3IgKi8KKwlpbnRkZWYgPSBhaGNfaW5iKGFoYywgSU5UREVGKTsKKwlpcnEgPSBpbnRkZWYgJiBWRUNUT1I7CisJc3dpdGNoIChpcnEpIHsKKwljYXNlIDk6CisJY2FzZSAxMDoKKwljYXNlIDExOgorCWNhc2UgMTI6CisJY2FzZSAxNDoKKwljYXNlIDE1OgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoImFpYzc3NzBfY29uZmlnOiBpbnZhbGlkIGlycSBzZXR0aW5nICVkXG4iLCBpbnRkZWYpOworCQlyZXR1cm4gKEVOWElPKTsKKwl9CisKKwlpZiAoKGludGRlZiAmIEVER0VfVFJJRykgIT0gMCkKKwkJYWhjLT5mbGFncyB8PSBBSENfRURHRV9JTlRFUlJVUFQ7CisKKwlzd2l0Y2ggKGFoYy0+Y2hpcCAmIChBSENfRUlTQXxBSENfVkwpKSB7CisJY2FzZSBBSENfRUlTQToKKwl7CisJCXVfaW50IGJpb3NjdHJsOworCQl1X2ludCBzY3NpY29uZjsKKwkJdV9pbnQgc2NzaWNvbmYxOworCisJCWJpb3NjdHJsID0gYWhjX2luYihhaGMsIEhBXzI3NF9CSU9TQ1RSTCk7CisJCXNjc2ljb25mID0gYWhjX2luYihhaGMsIFNDU0lDT05GKTsKKwkJc2NzaWNvbmYxID0gYWhjX2luYihhaGMsIFNDU0lDT05GICsgMSk7CisKKwkJLyogR2V0IHRoZSBwcmltYXJ5IGNoYW5uZWwgaW5mb3JtYXRpb24gKi8KKwkJaWYgKChiaW9zY3RybCAmIENIQU5ORUxfQl9QUklNQVJZKSAhPSAwKQorCQkJYWhjLT5mbGFncyB8PSAxOworCisJCWlmICgoYmlvc2N0cmwgJiBCSU9TTU9ERSkgPT0gQklPU0RJU0FCTEVEKSB7CisJCQlhaGMtPmZsYWdzIHw9IEFIQ19VU0VERUZBVUxUUzsKKwkJfSBlbHNlIHsKKwkJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSAhPSAwKSB7CisJCQkJYWhjLT5vdXJfaWQgPSBzY3NpY29uZjEgJiBIV1NDU0lJRDsKKwkJCQlpZiAoc2NzaWNvbmYgJiBURVJNX0VOQikKKwkJCQkJYWhjLT5mbGFncyB8PSBBSENfVEVSTV9FTkJfQTsKKwkJCX0gZWxzZSB7CisJCQkJYWhjLT5vdXJfaWQgPSBzY3NpY29uZiAmIEhTQ1NJSUQ7CisJCQkJYWhjLT5vdXJfaWRfYiA9IHNjc2ljb25mMSAmIEhTQ1NJSUQ7CisJCQkJaWYgKHNjc2ljb25mICYgVEVSTV9FTkIpCisJCQkJCWFoYy0+ZmxhZ3MgfD0gQUhDX1RFUk1fRU5CX0E7CisJCQkJaWYgKHNjc2ljb25mMSAmIFRFUk1fRU5CKQorCQkJCQlhaGMtPmZsYWdzIHw9IEFIQ19URVJNX0VOQl9COworCQkJfQorCQl9CisJCWlmICgoYWhjX2luYihhaGMsIEhBXzI3NF9CSU9TR0xPQkFMKSAmIEhBXzI3NF9FWFRFTkRFRF9UUkFOUykpCisJCQlhaGMtPmZsYWdzIHw9IEFIQ19FWFRFTkRFRF9UUkFOU19BfEFIQ19FWFRFTkRFRF9UUkFOU19COworCQlicmVhazsKKwl9CisJY2FzZSBBSENfVkw6CisJeworCQloYXZlX3NlZXByb20gPSBhaGEyODQwX2xvYWRfc2VlcHJvbShhaGMpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWlmIChoYXZlX3NlZXByb20gPT0gMCkgeworCQlmcmVlKGFoYy0+c2VlcF9jb25maWcsIE1fREVWQlVGKTsKKwkJYWhjLT5zZWVwX2NvbmZpZyA9IE5VTEw7CisJfQorCisJLyoKKwkgKiBFbnN1cmUgYXV0b2ZsdXNoIGlzIGVuYWJsZWQKKwkgKi8KKwlhaGNfb3V0YihhaGMsIFNCTEtDVEwsIGFoY19pbmIoYWhjLCBTQkxLQ1RMKSAmIH5BVVRPRkxVU0hESVMpOworCisJLyogU2V0dXAgdGhlIEZJRk8gdGhyZXNob2xkIGFuZCB0aGUgYnVzIG9mZiB0aW1lICovCisJaG9zdGNvbmYgPSBhaGNfaW5iKGFoYywgSE9TVENPTkYpOworCWFoY19vdXRiKGFoYywgQlVTU1BELCBob3N0Y29uZiAmIERGVEhSU0gpOworCWFoY19vdXRiKGFoYywgQlVTVElNRSwgKGhvc3Rjb25mIDw8IDIpICYgQk9GRik7CisKKwlhaGMtPmJ1c19zb2Z0Yy5haWM3NzcwX3NvZnRjLmJ1c3NwZCA9IGhvc3Rjb25mICYgREZUSFJTSDsKKwlhaGMtPmJ1c19zb2Z0Yy5haWM3NzcwX3NvZnRjLmJ1c3RpbWUgPSAoaG9zdGNvbmYgPDwgMikgJiBCT0ZGOworCisJLyoKKwkgKiBHZW5lcmljIGFpYzd4eHggaW5pdGlhbGl6YXRpb24uCisJICovCisJZXJyb3IgPSBhaGNfaW5pdChhaGMpOworCWlmIChlcnJvciAhPSAwKQorCQlyZXR1cm4gKGVycm9yKTsKKworCWVycm9yID0gYWljNzc3MF9tYXBfaW50KGFoYywgaXJxKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwlhaGNfbGlzdF9sb2NrKCZsKTsKKwkvKgorCSAqIExpbmsgdGhpcyBzb2Z0YyBpbiB3aXRoIGFsbCBvdGhlciBhaGMgaW5zdGFuY2VzLgorCSAqLworCWFoY19zb2Z0Y19pbnNlcnQoYWhjKTsKKworCS8qCisJICogRW5hYmxlIHRoZSBib2FyZCdzIEJVUyBkcml2ZXJzCisJICovCisJYWhjX291dGIoYWhjLCBCQ1RMLCBFTkFCTEUpOworCisJYWhjX2xpc3RfdW5sb2NrKCZsKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2FpYzc3NzBfY2hpcF9pbml0KHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlhaGNfb3V0YihhaGMsIEJVU1NQRCwgYWhjLT5idXNfc29mdGMuYWljNzc3MF9zb2Z0Yy5idXNzcGQpOworCWFoY19vdXRiKGFoYywgQlVTVElNRSwgYWhjLT5idXNfc29mdGMuYWljNzc3MF9zb2Z0Yy5idXN0aW1lKTsKKwlhaGNfb3V0YihhaGMsIFNCTEtDVEwsIGFoY19pbmIoYWhjLCBTQkxLQ1RMKSAmIH5BVVRPRkxVU0hESVMpOworCWFoY19vdXRiKGFoYywgQkNUTCwgRU5BQkxFKTsKKwlyZXR1cm4gKGFoY19jaGlwX2luaXQoYWhjKSk7Cit9CisKK3N0YXRpYyBpbnQKK2FpYzc3NzBfc3VzcGVuZChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJcmV0dXJuIChhaGNfc3VzcGVuZChhaGMpKTsKK30KKworc3RhdGljIGludAorYWljNzc3MF9yZXN1bWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoYWhjX3Jlc3VtZShhaGMpKTsKK30KKworLyoKKyAqIFJlYWQgdGhlIDI4NHggU0VFUFJPTS4KKyAqLworc3RhdGljIGludAorYWhhMjg0MF9sb2FkX3NlZXByb20oc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXN0cnVjdAlzZWVwcm9tX2Rlc2NyaXB0b3Igc2Q7CisJc3RydWN0CXNlZXByb21fY29uZmlnICpzYzsKKwlpbnQJaGF2ZV9zZWVwcm9tOworCXVpbnQ4X3Qgc2NzaV9jb25mOworCisJc2Quc2RfYWhjID0gYWhjOworCXNkLnNkX2NvbnRyb2xfb2Zmc2V0ID0gU0VFQ1RMXzI4NDA7CisJc2Quc2Rfc3RhdHVzX29mZnNldCA9IFNUQVRVU18yODQwOworCXNkLnNkX2RhdGFvdXRfb2Zmc2V0ID0gU1RBVFVTXzI4NDA7CQkKKwlzZC5zZF9jaGlwID0gQzQ2OworCXNkLnNkX01TID0gMDsKKwlzZC5zZF9SRFkgPSBFRVBST01fVEY7CisJc2Quc2RfQ1MgPSBDU18yODQwOworCXNkLnNkX0NLID0gQ0tfMjg0MDsKKwlzZC5zZF9ETyA9IERPXzI4NDA7CisJc2Quc2RfREkgPSBESV8yODQwOworCXNjID0gYWhjLT5zZWVwX2NvbmZpZzsKKworCWlmIChib290dmVyYm9zZSkKKwkJcHJpbnRmKCIlczogUmVhZGluZyBTRUVQUk9NLi4uIiwgYWhjX25hbWUoYWhjKSk7CisJaGF2ZV9zZWVwcm9tID0gYWhjX3JlYWRfc2VlcHJvbSgmc2QsICh1aW50MTZfdCAqKXNjLAorCQkJCQkvKnN0YXJ0X2FkZHIqLzAsIHNpemVvZigqc2MpLzIpOworCisJaWYgKGhhdmVfc2VlcHJvbSkgeworCisJCWlmIChhaGNfdmVyaWZ5X2Nrc3VtKHNjKSA9PSAwKSB7CisJCQlpZihib290dmVyYm9zZSkKKwkJCQlwcmludGYgKCJjaGVja3N1bSBlcnJvclxuIik7CisJCQloYXZlX3NlZXByb20gPSAwOworCQl9IGVsc2UgaWYgKGJvb3R2ZXJib3NlKSB7CisJCQlwcmludGYoImRvbmUuXG4iKTsKKwkJfQorCX0KKworCWlmICghaGF2ZV9zZWVwcm9tKSB7CisJCWlmIChib290dmVyYm9zZSkKKwkJCXByaW50ZigiJXM6IE5vIFNFRVBST00gYXZhaWxhYmxlXG4iLCBhaGNfbmFtZShhaGMpKTsKKwkJYWhjLT5mbGFncyB8PSBBSENfVVNFREVGQVVMVFM7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogUHV0IHRoZSBkYXRhIHdlJ3ZlIGNvbGxlY3RlZCBkb3duIGludG8gU1JBTQorCQkgKiB3aGVyZSBhaGNfaW5pdCB3aWxsIGZpbmQgaXQuCisJCSAqLworCQlpbnQJIGk7CisJCWludAkgbWF4X3Rhcmc7CisJCXVpbnQxNl90IGRpc2NlbmFibGU7CisKKwkJbWF4X3RhcmcgPSAoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSAhPSAwID8gMTYgOiA4OworCQlkaXNjZW5hYmxlID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IG1heF90YXJnOyBpKyspeworCQkJdWludDhfdCB0YXJnZXRfc2V0dGluZ3M7CisKKwkJCXRhcmdldF9zZXR0aW5ncyA9IChzYy0+ZGV2aWNlX2ZsYWdzW2ldICYgQ0ZYRkVSKSA8PCA0OworCQkJaWYgKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRlNZTkNIKQorCQkJCXRhcmdldF9zZXR0aW5ncyB8PSBTT0ZTOworCQkJaWYgKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRldJREVCKQorCQkJCXRhcmdldF9zZXR0aW5ncyB8PSBXSURFWEZFUjsKKwkJCWlmIChzYy0+ZGV2aWNlX2ZsYWdzW2ldICYgQ0ZESVNDKQorCQkJCWRpc2NlbmFibGUgfD0gKDB4MDEgPDwgaSk7CisJCQlhaGNfb3V0YihhaGMsIFRBUkdfU0NTSVJBVEUgKyBpLCB0YXJnZXRfc2V0dGluZ3MpOworCQl9CisJCWFoY19vdXRiKGFoYywgRElTQ19EU0IsIH4oZGlzY2VuYWJsZSAmIDB4ZmYpKTsKKwkJYWhjX291dGIoYWhjLCBESVNDX0RTQiArIDEsIH4oKGRpc2NlbmFibGUgPj4gOCkgJiAweGZmKSk7CisKKwkJYWhjLT5vdXJfaWQgPSBzYy0+YnJ0aW1lX2lkICYgQ0ZTQ1NJSUQ7CisKKwkJc2NzaV9jb25mID0gKGFoYy0+b3VyX2lkICYgMHg3KTsKKwkJaWYgKHNjLT5hZGFwdGVyX2NvbnRyb2wgJiBDRlNQQVJJVFkpCisJCQlzY3NpX2NvbmYgfD0gRU5TUENISzsKKwkJaWYgKHNjLT5hZGFwdGVyX2NvbnRyb2wgJiBDRlJFU0VUQikKKwkJCXNjc2lfY29uZiB8PSBSRVNFVF9TQ1NJOworCisJCWlmIChzYy0+Ymlvc19jb250cm9sICYgQ0YyODRYRVhURU5EKQkJCisJCQlhaGMtPmZsYWdzIHw9IEFIQ19FWFRFTkRFRF9UUkFOU19BOworCQkvKiBTZXQgU0NTSUNPTkYgaW5mbyAqLworCQlhaGNfb3V0YihhaGMsIFNDU0lDT05GLCBzY3NpX2NvbmYpOworCisJCWlmIChzYy0+YWRhcHRlcl9jb250cm9sICYgQ0YyODRYU1RFUk0pCisJCQlhaGMtPmZsYWdzIHw9IEFIQ19URVJNX0VOQl9BOworCX0KKwlyZXR1cm4gKGhhdmVfc2VlcHJvbSk7Cit9CisKK3N0YXRpYyBpbnQKK2FoY19haWM3NzcwX1ZMX3NldHVwKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGFoY19haWM3NzcwX3NldHVwKGFoYyk7CisJYWhjLT5jaGlwIHw9IEFIQ19WTDsKKwlyZXR1cm4gKGVycm9yKTsKK30KKworc3RhdGljIGludAorYWhjX2FpYzc3NzBfRUlTQV9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBhaGNfYWljNzc3MF9zZXR1cChhaGMpOworCWFoYy0+Y2hpcCB8PSBBSENfRUlTQTsKKwlyZXR1cm4gKGVycm9yKTsKK30KKworc3RhdGljIGludAorYWhjX2FpYzc3NzBfc2V0dXAoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWFoYy0+Y2hhbm5lbCA9ICdBJzsKKwlhaGMtPmNoYW5uZWxfYiA9ICdCJzsKKwlhaGMtPmNoaXAgPSBBSENfQUlDNzc3MDsKKwlhaGMtPmZlYXR1cmVzID0gQUhDX0FJQzc3NzBfRkU7CisJYWhjLT5idWdzIHw9IEFIQ19UTU9ERV9XSURFT0REX0JVRzsKKwlhaGMtPmZsYWdzIHw9IEFIQ19QQUdFU0NCUzsKKwlhaGMtPmluc3RydWN0aW9uX3JhbV9zaXplID0gNDQ4OworCXJldHVybiAoMCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3NzcwX29zbS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzc3MF9vc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmI0N2YyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzc3MF9vc20uYwpAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAqIExpbnV4IGRyaXZlciBhdHRhY2htZW50IGdsdWUgZm9yIGFpYzc3NzAgYmFzZWQgY29udHJvbGxlcnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvbGludXgvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzc3MF9vc20uYyMxNCAkCisgKi8KKworI2luY2x1ZGUgImFpYzd4eHhfb3NtLmgiCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZWlzYS5oPgorCisjZGVmaW5lIEVJU0FfTUZDVFJfQ0hBUjAoSUQpIChjaGFyKSgoKElEPj4yNikgJiAweDFGKSB8ICdAJykgIC8qIEJpdHMgMjYtMzAgKi8KKyNkZWZpbmUgRUlTQV9NRkNUUl9DSEFSMShJRCkgKGNoYXIpKCgoSUQ+PjIxKSAmIDB4MUYpIHwgJ0AnKSAgLyogQml0cyAyMS0yNSAqLworI2RlZmluZSBFSVNBX01GQ1RSX0NIQVIyKElEKSAoY2hhcikoKChJRD4+MTYpICYgMHgxRikgfCAnQCcpICAvKiBCaXRzIDE2LTIwICovCisjZGVmaW5lIEVJU0FfUFJPRFVDVF9JRChJRCkgIChzaG9ydCkoKElEPj40KSAgJiAweEZGRikgICAgICAgIC8qIEJpdHMgIDQtMTUgKi8KKyNkZWZpbmUgRUlTQV9SRVZJU0lPTl9JRChJRCkgKHVpbnQ4X3QpKElEICYgMHgwRikgICAgICAgICAgICAgLyogQml0cyAgMC0zICAqLworCitzdGF0aWMgaW50IGFpYzc3NzBfZWlzYV9kZXZfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYWljNzc3MF9laXNhX2Rldl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZWlzYV9kcml2ZXIgYWljNzc3MF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgICA9ICJhaWM3eHh4IiwKKwkJLnByb2JlICA9IGFpYzc3NzBfZWlzYV9kZXZfcHJvYmUsCisJCS5yZW1vdmUgPSBhaWM3NzcwX2Vpc2FfZGV2X3JlbW92ZSwKKwl9Cit9OworCit0eXBlZGVmICBzdHJ1Y3QgZGV2aWNlICphaWM3NzcwX2Rldl90OworI2Vsc2UKKyNkZWZpbmUgTUlOU0xPVAkJCTEKKyNkZWZpbmUgTlVNU0xPVFMJCTE2CisjZGVmaW5lIElET0ZGU0VUCQkweDgwCisKK3R5cGVkZWYgdm9pZCAqYWljNzc3MF9kZXZfdDsKKyNlbmRpZgorCitzdGF0aWMgaW50IGFpYzc3NzBfbGludXhfY29uZmlnKHN0cnVjdCBhaWM3NzcwX2lkZW50aXR5ICplbnRyeSwKKwkJCQlhaWM3NzcwX2Rldl90IGRldiwgdV9pbnQgZWlzYUJhc2UpOworCitpbnQKK2FoY19saW51eF9laXNhX2luaXQodm9pZCkKK3sKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJc3RydWN0IGVpc2FfZGV2aWNlX2lkICplaWQ7CisJc3RydWN0IGFpYzc3NzBfaWRlbnRpdHkgKmlkOworCWludCBpOworCisJaWYgKGFpYzd4eHhfcHJvYmVfZWlzYV92bCA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJICogTGludXggcmVxdWlyZXMgdGhlIEVJU0EgSURzIHRvIGJlIHNwZWNpZmllZCBpbgorCSAqIHRoZSBFSVNBIElEIHN0cmluZyBmb3JtYXQuICBQZXJmb3JtIHRoZSBjb252ZXJzaW9uCisJICogYW5kIHNldHVwIGEgdGFibGUgd2l0aCBhIE5VTCB0ZXJtaW5hbCBlbnRyeS4KKwkgKi8KKwlhaWM3NzcwX2RyaXZlci5pZF90YWJsZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGVpc2FfZGV2aWNlX2lkKSAqCisJCQkJCSAoYWhjX251bV9haWM3NzcwX2RldnMgKyAxKSwKKwkJCQkJIE1fREVWQlVGLCBNX05PV0FJVCk7CisJaWYgKGFpYzc3NzBfZHJpdmVyLmlkX3RhYmxlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChlaWQgPSAoc3RydWN0IGVpc2FfZGV2aWNlX2lkICopYWljNzc3MF9kcml2ZXIuaWRfdGFibGUsCisJICAgICBpZCA9IGFpYzc3NzBfaWRlbnRfdGFibGUsIGkgPSAwOworCSAgICAgaSA8IGFoY19udW1fYWljNzc3MF9kZXZzOyBlaWQrKywgaWQrKywgaSsrKSB7CisKKwkJc3ByaW50ZihlaWQtPnNpZywgIiVjJWMlYyUwM1glMDFYIiwKKwkJCUVJU0FfTUZDVFJfQ0hBUjAoaWQtPmZ1bGxfaWQpLAorCQkJRUlTQV9NRkNUUl9DSEFSMShpZC0+ZnVsbF9pZCksCisJCQlFSVNBX01GQ1RSX0NIQVIyKGlkLT5mdWxsX2lkKSwKKwkJCUVJU0FfUFJPRFVDVF9JRChpZC0+ZnVsbF9pZCksCisJCQlFSVNBX1JFVklTSU9OX0lEKGlkLT5mdWxsX2lkKSk7CisJCWVpZC0+ZHJpdmVyX2RhdGEgPSBpOworCX0KKwllaWQtPnNpZ1swXSA9IDA7CisKKwlyZXR1cm4gZWlzYV9kcml2ZXJfcmVnaXN0ZXIoJmFpYzc3NzBfZHJpdmVyKTsKKyNlbHNlIC8qIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSAqLworCXN0cnVjdCBhaWM3NzcwX2lkZW50aXR5ICplbnRyeTsKKwl1X2ludCAgc2xvdDsKKwl1X2ludCAgZWlzYUJhc2U7CisJdV9pbnQgIGk7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKwlpZiAoYWljN3h4eF9wcm9iZV9laXNhX3ZsID09IDApCisJCXJldHVybiByZXQ7CisKKwllaXNhQmFzZSA9IDB4MTAwMCArIEFIQ19FSVNBX1NMT1RfT0ZGU0VUOworCWZvciAoc2xvdCA9IDE7IHNsb3QgPCBOVU1TTE9UUzsgZWlzYUJhc2UrPTB4MTAwMCwgc2xvdCsrKSB7CisJCXVpbnQzMl90IGVpc2FfaWQ7CisJCXNpemVfdAkgaWRfc2l6ZTsKKworCQlpZiAocmVxdWVzdF9yZWdpb24oZWlzYUJhc2UsIEFIQ19FSVNBX0lPU0laRSwgImFpYzd4eHgiKSA9PSAwKQorCQkJY29udGludWU7CisKKwkJZWlzYV9pZCA9IDA7CisJCWlkX3NpemUgPSBzaXplb2YoZWlzYV9pZCk7CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCS8qIFZMY2FyZHMgcmVxdWlyZSBwcmltaW5nKi8KKwkJCW91dGIoMHg4MCArIGksIGVpc2FCYXNlICsgSURPRkZTRVQpOworCQkJZWlzYV9pZCB8PSBpbmIoZWlzYUJhc2UgKyBJRE9GRlNFVCArIGkpCisJCQkJICAgPDwgKChpZF9zaXplLWktMSkgKiA4KTsKKwkJfQorCQlyZWxlYXNlX3JlZ2lvbihlaXNhQmFzZSwgQUhDX0VJU0FfSU9TSVpFKTsKKwkJaWYgKGVpc2FfaWQgJiAweDgwMDAwMDAwKQorCQkJY29udGludWU7ICAvKiBubyBFSVNBIGNhcmQgaW4gc2xvdCAqLworCisJCWVudHJ5ID0gYWljNzc3MF9maW5kX2RldmljZShlaXNhX2lkKTsKKwkJaWYgKGVudHJ5ICE9IE5VTEwpIHsKKwkJCWFpYzc3NzBfbGludXhfY29uZmlnKGVudHJ5LCBOVUxMLCBlaXNhQmFzZSk7CisJCQlyZXQgPSAwOworCQl9CisJfQorCXJldHVybiByZXQ7CisjZW5kaWYKK30KKwordm9pZAorYWhjX2xpbnV4X2Vpc2FfZXhpdCh2b2lkKQoreworCWlmKGFpYzd4eHhfcHJvYmVfZWlzYV92bCAhPSAwICYmIGFpYzc3NzBfZHJpdmVyLmlkX3RhYmxlICE9IE5VTEwpIHsKKwkJZWlzYV9kcml2ZXJfdW5yZWdpc3RlcigmYWljNzc3MF9kcml2ZXIpOworCQlmcmVlKGFpYzc3NzBfZHJpdmVyLmlkX3RhYmxlLCBNX0RFVkJVRik7CisJfQorfQorCitzdGF0aWMgaW50CithaWM3NzcwX2xpbnV4X2NvbmZpZyhzdHJ1Y3QgYWljNzc3MF9pZGVudGl0eSAqZW50cnksIGFpYzc3NzBfZGV2X3QgZGV2LAorCQkgICAgIHVfaW50IGVpc2FCYXNlKQoreworCXN0cnVjdAlhaGNfc29mdGMgKmFoYzsKKwljaGFyCWJ1Zls4MF07CisJY2hhciAgICpuYW1lOworCWludAllcnJvcjsKKworCS8qCisJICogQWxsb2NhdGUgYSBzb2Z0YyBmb3IgdGhpcyBjYXJkIGFuZAorCSAqIHNldCBpdCB1cCBmb3IgYXR0YWNobWVudCBieSBvdXIKKwkgKiBjb21tb24gZGV0ZWN0IHJvdXRpbmUuCisJICovCisJc3ByaW50ZihidWYsICJhaGNfZWlzYTolZCIsIGVpc2FCYXNlID4+IDEyKTsKKwluYW1lID0gbWFsbG9jKHN0cmxlbihidWYpICsgMSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisJc3RyY3B5KG5hbWUsIGJ1Zik7CisJYWhjID0gYWhjX2FsbG9jKCZhaWM3eHh4X2RyaXZlcl90ZW1wbGF0ZSwgbmFtZSk7CisJaWYgKGFoYyA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisJZXJyb3IgPSBhaWM3NzcwX2NvbmZpZyhhaGMsIGVudHJ5LCBlaXNhQmFzZSk7CisJaWYgKGVycm9yICE9IDApIHsKKwkJYWhjLT5ic2guaW9wb3J0ID0gMDsKKwkJYWhjX2ZyZWUoYWhjKTsKKwkJcmV0dXJuIChlcnJvcik7CisJfQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlkZXYtPmRyaXZlcl9kYXRhID0gKHZvaWQgKilhaGM7CisJaWYgKGFpYzd4eHhfZGV0ZWN0X2NvbXBsZXRlKQorCQllcnJvciA9IGFoY19saW51eF9yZWdpc3Rlcl9ob3N0KGFoYywgJmFpYzd4eHhfZHJpdmVyX3RlbXBsYXRlKTsKKyNlbmRpZgorCXJldHVybiAoZXJyb3IpOworfQorCitpbnQKK2FpYzc3NzBfbWFwX3JlZ2lzdGVycyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHBvcnQpCit7CisJLyoKKwkgKiBMb2NrIG91dCBvdGhlciBjb250ZW5kZXJzIGZvciBvdXIgaS9vIHNwYWNlLgorCSAqLworCWlmIChyZXF1ZXN0X3JlZ2lvbihwb3J0LCBBSENfRUlTQV9JT1NJWkUsICJhaWM3eHh4IikgPT0gMCkKKwkJcmV0dXJuIChFTk9NRU0pOworCWFoYy0+dGFnID0gQlVTX1NQQUNFX1BJTzsKKwlhaGMtPmJzaC5pb3BvcnQgPSBwb3J0OworCXJldHVybiAoMCk7Cit9CisKK2ludAorYWljNzc3MF9tYXBfaW50KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgaXJxKQoreworCWludCBlcnJvcjsKKwlpbnQgc2hhcmVkOworCisJc2hhcmVkID0gMDsKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfRURHRV9JTlRFUlJVUFQpID09IDApCisJCXNoYXJlZCA9IFNBX1NISVJROworCisJZXJyb3IgPSByZXF1ZXN0X2lycShpcnEsIGFoY19saW51eF9pc3IsIHNoYXJlZCwgImFpYzd4eHgiLCBhaGMpOworCWlmIChlcnJvciA9PSAwKQorCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmlycSA9IGlycTsKKwkKKwlyZXR1cm4gKC1lcnJvcik7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCitzdGF0aWMgaW50CithaWM3NzcwX2Vpc2FfZGV2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVkZXY7CisKKwllZGV2ID0gdG9fZWlzYV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gKGFpYzc3NzBfbGludXhfY29uZmlnKGFpYzc3NzBfaWRlbnRfdGFibGUgKyBlZGV2LT5pZC5kcml2ZXJfZGF0YSwKKwkJCQkgICAgZGV2LCBlZGV2LT5iYXNlX2FkZHIrQUhDX0VJU0FfU0xPVF9PRkZTRVQpKTsKK30KKworc3RhdGljIGludAorYWljNzc3MF9laXNhX2Rldl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhaGNfc29mdGMgKmFoYzsKKwl1X2xvbmcgbDsKKworCS8qCisJICogV2Ugc2hvdWxkIGJlIGFibGUgdG8ganVzdCBwZXJmb3JtCisJICogdGhlIGZyZWUgZGlyZWN0bHksIGJ1dCBjaGVjayBvdXIKKwkgKiBsaXN0IGZvciBleHRyYSBzYW5pdHkuCisJICovCisJYWhjX2xpc3RfbG9jaygmbCk7CisJYWhjID0gYWhjX2ZpbmRfc29mdGMoKHN0cnVjdCBhaGNfc29mdGMgKilkZXYtPmRyaXZlcl9kYXRhKTsKKwlpZiAoYWhjICE9IE5VTEwpIHsKKwkJdV9sb25nIHM7CisKKwkJYWhjX2xvY2soYWhjLCAmcyk7CisJCWFoY19pbnRyX2VuYWJsZShhaGMsIEZBTFNFKTsKKwkJYWhjX3VubG9jayhhaGMsICZzKTsKKwkJYWhjX2ZyZWUoYWhjKTsKKwl9CisJYWhjX2xpc3RfdW5sb2NrKCZsKTsKKworCXJldHVybiAoMCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHguaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDRiMmYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5oCkBAIC0wLDAgKzEsMTUzNyBAQAorLyoKKyAqIENvcmUgZGVmaW5pdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcyBzaGFyZWFibGUgYWNyb3NzIE9TIHBsYXRmb3Jtcy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMjAwMiBKdXN0aW4gVC4gR2liYnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHguaCM5NSAkCisgKgorICogJEZyZWVCU0QkCisgKi8KKworI2lmbmRlZiBfQUlDNzlYWF9IXworI2RlZmluZSBfQUlDNzlYWF9IXworCisvKiBSZWdpc3RlciBEZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImFpYzc5eHhfcmVnLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEZvcndhcmQgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgYWhkX3BsYXRmb3JtX2RhdGE7CitzdHJ1Y3Qgc2NiX3BsYXRmb3JtX2RhdGE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVXNlZnVsIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIE1BWAorI2RlZmluZSBNQVgoYSxiKSAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCisjZW5kaWYKKworI2lmbmRlZiBNSU4KKyNkZWZpbmUgTUlOKGEsYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2VuZGlmCisKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFIDEKKyNlbmRpZgorI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKworI2RlZmluZSBOVU1fRUxFTUVOVFMoYXJyYXkpIChzaXplb2YoYXJyYXkpIC8gc2l6ZW9mKCphcnJheSkpCisKKyNkZWZpbmUgQUxMX0NIQU5ORUxTICdcMCcKKyNkZWZpbmUgQUxMX1RBUkdFVFNfTUFTSyAweEZGRkYKKyNkZWZpbmUgSU5JVElBVE9SX1dJTERDQVJECSh+MCkKKyNkZWZpbmUJU0NCX0xJU1RfTlVMTAkJMHhGRjAwCisjZGVmaW5lCVNDQl9MSVNUX05VTExfTEUJKGFoZF9odG9sZTE2KFNDQl9MSVNUX05VTEwpKQorI2RlZmluZSBRT1VURklGT19FTlRSWV9WQUxJRCAweDgwMDAKKyNkZWZpbmUgUU9VVEZJRk9fRU5UUllfVkFMSURfTEUgKGFoZF9odG9sZTE2KDB4ODAwMCkpCisjZGVmaW5lIFNDQklEX0lTX05VTEwoc2NiaWQpICgoKHNjYmlkKSAmIDB4RkYwMCApID09IFNDQl9MSVNUX05VTEwpCisKKyNkZWZpbmUgU0NTSUlEX1RBUkdFVChhaGQsIHNjc2lpZCkJXAorCSgoKHNjc2lpZCkgJiBUSUQpID4+IFRJRF9TSElGVCkKKyNkZWZpbmUgU0NTSUlEX09VUl9JRChzY3NpaWQpCQlcCisJKChzY3NpaWQpICYgT0lEKQorI2RlZmluZSBTQ1NJSURfQ0hBTk5FTChhaGQsIHNjc2lpZCkgKCdBJykKKyNkZWZpbmUJU0NCX0lTX1NDU0lCVVNfQihhaGQsIHNjYikgKDApCisjZGVmaW5lCVNDQl9HRVRfT1VSX0lEKHNjYikgXAorCVNDU0lJRF9PVVJfSUQoKHNjYiktPmhzY2ItPnNjc2lpZCkKKyNkZWZpbmUJU0NCX0dFVF9UQVJHRVQoYWhkLCBzY2IpIFwKKwlTQ1NJSURfVEFSR0VUKChhaGQpLCAoc2NiKS0+aHNjYi0+c2NzaWlkKQorI2RlZmluZQlTQ0JfR0VUX0NIQU5ORUwoYWhkLCBzY2IpIFwKKwlTQ1NJSURfQ0hBTk5FTChhaGQsIChzY2IpLT5oc2NiLT5zY3NpaWQpCisjZGVmaW5lCVNDQl9HRVRfTFVOKHNjYikgXAorCSgoc2NiKS0+aHNjYi0+bHVuKQorI2RlZmluZSBTQ0JfR0VUX1RBUkdFVF9PRkZTRVQoYWhkLCBzY2IpCVwKKwlTQ0JfR0VUX1RBUkdFVChhaGQsIHNjYikKKyNkZWZpbmUgU0NCX0dFVF9UQVJHRVRfTUFTSyhhaGQsIHNjYikgXAorCSgweDAxIDw8IChTQ0JfR0VUX1RBUkdFVF9PRkZTRVQoYWhkLCBzY2IpKSkKKyNpZmRlZiBBSERfREVCVUcKKyNkZWZpbmUgU0NCX0lTX1NJTEVOVChzY2IpCQkJCQlcCisJKChhaGRfZGVidWcgJiBBSERfU0hPV19NQVNLRURfRVJST1JTKSA9PSAwCQlcCisgICAgICAmJiAoKChzY2IpLT5mbGFncyAmIFNDQl9TSUxFTlQpICE9IDApKQorI2Vsc2UKKyNkZWZpbmUgU0NCX0lTX1NJTEVOVChzY2IpCQkJCQlcCisJKCgoc2NiKS0+ZmxhZ3MgJiBTQ0JfU0lMRU5UKSAhPSAwKQorI2VuZGlmCisvKgorICogVENMcyBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiBUVFRUTExMTExMTEwKKyAqLworI2RlZmluZSBUQ0xfVEFSR0VUX09GRlNFVCh0Y2wpIFwKKwkoKCgodGNsKSA+PiA0KSAmIFRJRCkgPj4gNCkKKyNkZWZpbmUgVENMX0xVTih0Y2wpIFwKKwkodGNsICYgKEFIRF9OVU1fTFVOUyAtIDEpKQorI2RlZmluZSBCVUlMRF9UQ0woc2NzaWlkLCBsdW4pIFwKKwkoKGx1bikgfCAoKChzY3NpaWQpICYgVElEKSA8PCA0KSkKKyNkZWZpbmUgQlVJTERfVENMX1JBVyh0YXJnZXQsIGNoYW5uZWwsIGx1bikgXAorCSgobHVuKSB8ICgodGFyZ2V0KSA8PCA4KSkKKworI2RlZmluZSBTQ0JfR0VUX1RBRyhzY2IpIFwKKwlhaGRfbGUxNnRvaChzY2ItPmhzY2ItPnRhZykKKworI2lmbmRlZglBSERfVEFSR0VUX01PREUKKyN1bmRlZglBSERfVE1PREVfRU5BQkxFCisjZGVmaW5lCUFIRF9UTU9ERV9FTkFCTEUgMAorI2VuZGlmCisKKyNkZWZpbmUgQUhEX0JVSUxEX0NPTF9JRFgodGFyZ2V0LCBsdW4pCQkJCVwKKwkoKChsdW4pIDw8IDQpIHwgdGFyZ2V0KQorCisjZGVmaW5lIEFIRF9HRVRfU0NCX0NPTF9JRFgoYWhkLCBzY2IpCQkJCVwKKwkoKFNDQl9HRVRfTFVOKHNjYikgPDwgNCkgfCBTQ0JfR0VUX1RBUkdFVChhaGQsIHNjYikpCisKKyNkZWZpbmUgQUhEX1NFVF9TQ0JfQ09MX0lEWChzY2IsIGNvbF9pZHgpCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJKHNjYiktPmhzY2ItPnNjc2lpZCA9ICgoY29sX2lkeCkgPDwgVElEX1NISUZUKSAmIFRJRDsJCVwKKwkoc2NiKS0+aHNjYi0+bHVuID0gKChjb2xfaWR4KSA+PiA0KSAmIChBSERfTlVNX0xVTlNfTk9OUEtULTEpOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFIRF9DT1BZX1NDQl9DT0xfSURYKGRzdCwgc3JjKQkJCQlcCitkbyB7CQkJCQkJCQlcCisJZHN0LT5oc2NiLT5zY3NpaWQgPSBzcmMtPmhzY2ItPnNjc2lpZDsJCQlcCisJZHN0LT5oc2NiLT5sdW4gPSBzcmMtPmhzY2ItPmx1bjsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCUFIRF9ORVZFUl9DT0xfSURYIDB4RkZGRgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEcml2ZXIgQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgdGFyZ2V0cy4KKyAqLworI2RlZmluZSBBSERfTlVNX1RBUkdFVFMgMTYKKworLyoKKyAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgbHVucy4KKyAqIFRoZSBpZGVudGlmeSBtZXNzYWdlIG9ubHkgc3VwcG9ydHMgNjQgbHVucyBpbiBub24tcGFja2V0aXplZCB0cmFuc2ZlcnMuCisgKiBZb3UgY2FuIGhhdmUgMl42NCBsdW5zIHdoZW4gaW5mb3JtYXRpb24gdW5pdCB0cmFuc2ZlcnMgYXJlIGVuYWJsZWQsCisgKiBidXQgdW50aWwgd2Ugc2VlIGEgbmVlZCB0byBzdXBwb3J0IHRoYXQgbWFueSwgd2Ugc3VwcG9ydCAyNTYuCisgKi8KKyNkZWZpbmUgQUhEX05VTV9MVU5TX05PTlBLVCA2NAorI2RlZmluZSBBSERfTlVNX0xVTlMgMjU2CisKKy8qCisgKiBUaGUgbWF4aW11bSB0cmFuc2ZlciBwZXIgUy9HIHNlZ21lbnQuCisgKi8KKyNkZWZpbmUgQUhEX01BWFRSQU5TRkVSX1NJWkUJIDB4MDBmZmZmZmYJLyogbGltaXRlZCBieSAyNGJpdCBjb3VudGVyICovCisKKy8qCisgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgU0NCIHN0b3JhZ2UgaW4gaGFyZHdhcmUgb24gYSBjb250cm9sbGVyLgorICogVGhpcyB2YWx1ZSByZXByZXNlbnRzIGFuIHVwcGVyIGJvdW5kLiAgRHVlIHRvIHNvZnR3YXJlIGRlc2lnbiwKKyAqIHdlIG1heSBub3QgYmUgYWJsZSB0byB1c2UgdGhpcyBudW1iZXIuCisgKi8KKyNkZWZpbmUgQUhEX1NDQl9NQVgJNTEyCisKKy8qCisgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCB0cmFuc2FjdGlvbnMgc3VwcG9ydGVkIHBlciBkcml2ZXIgaW5zdGFuY2UuCisgKiBTZXF1ZW5jZXIgQ29udHJvbCBCbG9ja3MgKFNDQnMpIHN0b3JlIHBlci10cmFuc2FjdGlvbiBpbmZvcm1hdGlvbi4KKyAqLworI2RlZmluZSBBSERfTUFYX1FVRVVFCUFIRF9TQ0JfTUFYCisKKy8qCisgKiBEZWZpbmUgdGhlIHNpemUgb2Ygb3VyIFFJTiBhbmQgUU9VVCBGSUZPcy4gIFRoZXkgbXVzdCBiZSBhIHBvd2VyIG9mIDIKKyAqIGluIHNpemUgYW5kIGFjY29tbW9kYXRlIGFzIG1hbnkgdHJhbnNhY3Rpb25zIGFzIGNhbiBiZSBxdWV1ZWQgY29uY3VycmVudGx5LgorICovCisjZGVmaW5lCUFIRF9RSU5fU0laRQlBSERfTUFYX1FVRVVFCisjZGVmaW5lCUFIRF9RT1VUX1NJWkUJQUhEX01BWF9RVUVVRQorCisjZGVmaW5lIEFIRF9RSU5fV1JBUCh4KSAoKHgpICYgKEFIRF9RSU5fU0laRS0xKSkKKy8qCisgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgU0NCIHN0b3JhZ2Ugd2UgYWxsb2NhdGUgaW4gaG9zdCBtZW1vcnkuCisgKi8KKyNkZWZpbmUgQUhEX1NDQl9NQVhfQUxMT0MgQUhEX01BWF9RVUVVRQorCisvKgorICogUmluZyBCdWZmZXIgb2YgaW5jb21pbmcgdGFyZ2V0IGNvbW1hbmRzLgorICogV2UgYWxsb2NhdGUgMjU2IHRvIHNpbXBsaWZ5IHRoZSBsb2dpYyBpbiB0aGUgc2VxdWVuY2VyCisgKiBieSB1c2luZyB0aGUgbmF0dXJhbCB3cmFwIHBvaW50IG9mIGFuIDhiaXQgY291bnRlci4KKyAqLworI2RlZmluZSBBSERfVE1PREVfQ01EUwkyNTYKKworLyogUmVzZXQgbGluZSBhc3NlcnRpb24gdGltZSBpbiB1cyAqLworI2RlZmluZSBBSERfQlVTUkVTRVRfREVMQVkJMjUKKworLyoqKioqKioqKioqKioqKioqKiogQ2hpcCBDaGFyYWN0ZXJpc3RpY3MvT3BlcmF0aW5nIFNldHRpbmdzICAqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDaGlwIFR5cGUKKyAqIFRoZSBjaGlwIG9yZGVyIGlzIGZyb20gbGVhc3Qgc29waGlzdGljYXRlZCB0byBtb3N0IHNvcGhpc3RpY2F0ZWQuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJQUhEX05PTkUJPSAweDAwMDAsCisJQUhEX0NISVBJRF9NQVNLCT0gMHgwMEZGLAorCUFIRF9BSUM3OTAxCT0gMHgwMDAxLAorCUFIRF9BSUM3OTAyCT0gMHgwMDAyLAorCUFIRF9BSUM3OTAxQQk9IDB4MDAwMywKKwlBSERfUENJCQk9IDB4MDEwMCwJLyogQnVzIHR5cGUgUENJICovCisJQUhEX1BDSVgJPSAweDAyMDAsCS8qIEJ1cyB0eXBlIFBDSVggKi8KKwlBSERfQlVTX01BU0sJPSAweDBGMDAKK30gYWhkX2NoaXA7CisKKy8qCisgKiBGZWF0dXJlcyBhdmFpbGFibGUgaW4gZWFjaCBjaGlwIHR5cGUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJQUhEX0ZFTk9ORQkJPSAweDAwMDAwLAorCUFIRF9XSURFICAJCT0gMHgwMDAwMSwvKiBXaWRlIENoYW5uZWwgKi8KKwlBSERfTVVMVElfRlVOQwkJPSAweDAwMTAwLC8qIE11bHRpLUZ1bmN0aW9uL0NoYW5uZWwgRGV2aWNlICovCisJQUhEX1RBUkdFVE1PREUJCT0gMHgwMTAwMCwvKiBIYXMgdGVzdGVkIHRhcmdldCBtb2RlIHN1cHBvcnQgKi8KKwlBSERfTVVMVElST0xFCQk9IDB4MDIwMDAsLyogU3BhY2UgZm9yIHR3byByb2xlcyBhdCBhIHRpbWUgKi8KKwlBSERfUlRJCQkJPSAweDA0MDAwLC8qIFJldGFpbmVkIFRyYWluaW5nIFN1cHBvcnQgKi8KKwlBSERfTkVXX0lPQ0VMTF9PUFRTCT0gMHgwODAwMCwvKiBNb3JlIFNpZ25hbCBrbm9icyBpbiB0aGUgSU9DRUxMICovCisJQUhEX05FV19ERkNOVFJMX09QVFMJPSAweDEwMDAwLC8qIFNDU0lFTldSRElTIGJpdCAqLworCUFIRF9GQVNUX0NEQl9ERUxJVkVSWQk9IDB4MjAwMDAsLyogQ0RCIGFja3MgcmVsZWFzZWQgdG8gT3V0cHV0IFN5bmMgKi8KKwlBSERfUkVNT1ZBQkxFCQk9IDB4MDAwMDAsLyogSG90LVN3YXAgc3VwcG9ydGVkIC0gTm9uZSBzbyBmYXIqLworCUFIRF9BSUM3OTAxX0ZFCQk9IEFIRF9GRU5PTkUsCisJQUhEX0FJQzc5MDFBX0ZFCQk9IEFIRF9GRU5PTkUsCisJQUhEX0FJQzc5MDJfRkUJCT0gQUhEX01VTFRJX0ZVTkMKK30gYWhkX2ZlYXR1cmU7CisKKy8qCisgKiBCdWdzIGluIHRoZSBzaWxpY29uIHRoYXQgd2Ugd29yayBhcm91bmQgaW4gc29mdHdhcmUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJQUhEX0JVR05PTkUJCT0gMHgwMDAwLAorCS8qCisJICogUmV2IEEgaGFyZHdhcmUgZmFpbHMgdG8gdXBkYXRlIExBU1QvQ1VSUi9ORVhUU0NCCisJICogY29ycmVjdGx5IGluIGNlcnRhaW4gcGFja2V0aXplZCBzZWxlY3Rpb24gY2FzZXMuCisJICovCisJQUhEX1NFTlRfU0NCX1VQREFURV9CVUcJPSAweDAwMDEsCisJLyogVGhlIHdyb25nIFNDQiBpcyBhY2Nlc3NlZCB0byBjaGVjayB0aGUgYWJvcnQgcGVuZGluZyBiaXQuICovCisJQUhEX0FCT1JUX0xRSV9CVUcJPSAweDAwMDIsCisJLyogUGFja2V0aXplZCBiaXRidWNrZXQgY3Jvc3NlcyBwYWNrZXQgYm91bmRhcmllcy4gKi8KKwlBSERfUEtUX0JJVEJVQ0tFVF9CVUcJPSAweDAwMDQsCisJLyogVGhlIHNlbGVjdGlvbiB0aW1lciBydW5zIHR3aWNlIGFzIGxvbmcgYXMgaXRzIHNldHRpbmcuICovCisJQUhEX0xPTkdfU0VUSU1PX0JVRwk9IDB4MDAwOCwKKwkvKiBUaGUgTm9uLUxRIENSQyBlcnJvciBzdGF0dXMgaXMgZGVsYXllZCB1bnRpbCBwaGFzZSBjaGFuZ2UuICovCisJQUhEX05MUUlDUkNfREVMQVlFRF9CVUcJPSAweDAwMTAsCisJLyogVGhlIGNoaXAgbXVzdCBiZSByZXNldCBmb3IgYWxsIG91dGdvaW5nIGJ1cyByZXNldHMuICAqLworCUFIRF9TQ1NJUlNUX0JVRwkJPSAweDAwMjAsCisJLyogU29tZSBQQ0lYIGZpZWxkcyBtdXN0IGJlIHNhdmVkIGFuZCByZXN0b3JlZCBhY3Jvc3MgY2hpcCByZXNldC4gKi8KKwlBSERfUENJWF9DSElQUlNUX0JVRwk9IDB4MDA0MCwKKwkvKiBNTUFQSU8gaXMgbm90IGZ1bmN0aW9uYWwgaW4gUENJLVggbW9kZS4gICovCisJQUhEX1BDSVhfTU1BUElPX0JVRwk9IDB4MDA4MCwKKwkvKiBSZWFkcyB0byBTQ0JSQU0gZmFpbCB0byByZXNldCB0aGUgZGlzY2FyZCB0aW1lci4gKi8KKwlBSERfUENJWF9TQ0JSQU1fUkRfQlVHICA9IDB4MDEwMCwKKwkvKiBCdWcgd29ya2Fyb3VuZHMgdGhhdCBjYW4gYmUgZGlzYWJsZWQgb24gbm9uLVBDSVggYnVzc2VzLiAqLworCUFIRF9QQ0lYX0JVR19NQVNLCT0gQUhEX1BDSVhfQ0hJUFJTVF9CVUcKKwkJCQl8IEFIRF9QQ0lYX01NQVBJT19CVUcKKwkJCQl8IEFIRF9QQ0lYX1NDQlJBTV9SRF9CVUcsCisJLyoKKwkgKiBMUU9TVE9QMCBzdGF0dXMgc2V0IGV2ZW4gZm9yIGZvcmNlZCBzZWxlY3Rpb25zIHdpdGggQVROCisJICogdG8gcGVyZm9ybSBub24tcGFja2V0aXplZCBtZXNzYWdlIGRlbGl2ZXJ5LgorCSAqLworCUFIRF9MUU9fQVROT19CVUcJPSAweDAyMDAsCisJLyogRklGTyBhdXRvLWZsdXNoIGRvZXMgbm90IGFsd2F5cyB0cmlnZ2VyLiAgKi8KKwlBSERfQVVUT0ZMVVNIX0JVRwk9IDB4MDQwMCwKKwkvKiBUaGUgQ0xSTFFPIHJlZ2lzdGVycyBhcmUgbm90IHNlbGYtY2xlYXJpbmcuICovCisJQUhEX0NMUkxRT19BVVRPQ0xSX0JVRwk9IDB4MDgwMCwKKwkvKiBUaGUgUEFDS0VUSVpFRCBzdGF0dXMgYml0IHJlZmVycyB0byB0aGUgcHJldmlvdXMgY29ubmVjdGlvbi4gKi8KKwlBSERfUEtUSVpFRF9TVEFUVVNfQlVHICA9IDB4MTAwMCwKKwkvKiAiU2hvcnQgTHVucyIgYXJlIG5vdCBwbGFjZWQgaW50byBvdXRnb2luZyBMUSBwYWNrZXRzIGNvcnJlY3RseS4gKi8KKwlBSERfUEtUX0xVTl9CVUcJCT0gMHgyMDAwLAorCS8qCisJICogT25seSB0aGUgRklGTyBhbGxvY2F0ZWQgdG8gdGhlIG5vbi1wYWNrZXRpemVkIGNvbm5lY3Rpb24gbWF5CisJICogYmUgaW4gdXNlIGR1cmluZyBhIG5vbi1wYWNrZXR6aWVkIGNvbm5lY3Rpb24uCisJICovCisJQUhEX05PTlBBQ0tGSUZPX0JVRwk9IDB4NDAwMCwKKwkvKgorCSAqIFdyaXRpbmcgdG8gYSBERkYgU0NCUFRSIHJlZ2lzdGVyIG1heSBmYWlsIGlmIGNvbmN1cmVudCB3aXRoCisJICogYSBoYXJkd2FyZSB3cml0ZSB0byB0aGUgb3RoZXIgREZGIFNDQlBUUiByZWdpc3Rlci4gIFRoaXMgaXMKKwkgKiBub3QgY3VycmVudGx5IGEgY29uY2VybiBpbiBvdXIgc2VxdWVuY2VyIHNpbmNlIGFsbCBjaGlwcyB3aXRoCisJICogdGhpcyBidWcgaGF2ZSB0aGUgQUhEX05PTlBBQ0tGSUZPX0JVRyBhbmQgYWxsIHdyaXRlcyBvZiBjb25jZXJuCisJICogb2NjdXIgaW4gbm9uLXBhY2tldGl6ZWQgY29ubmVjdGlvbnMuCisJICovCisJQUhEX01ERkZfV1NDQlBUUl9CVUcJPSAweDgwMDAsCisJLyogU0dIQUREUiB1cGRhdGVzIGFyZSBzbG93LiAqLworCUFIRF9SRUdfU0xPV19TRVRUTEVfQlVHCT0gMHgxMDAwMCwKKwkvKgorCSAqIENoYW5naW5nIHRoZSBNT0RFX1BUUiBjb2luY2lkZW50IHdpdGggYW4gaW50ZXJydXB0IHRoYXQKKwkgKiBzd2l0Y2hlcyB0byBhIGRpZmZlcmVudCBtb2RlIHdpbGwgY2F1c2UgdGhlIGludGVycnVwdCB0bworCSAqIGJlIGluIHRoZSBtb2RlIHdyaXR0ZW4gb3V0c2lkZSBvZiBpbnRlcnJ1cHQgY29udGV4dC4KKwkgKi8KKwlBSERfU0VUX01PREVfQlVHCT0gMHgyMDAwMCwKKwkvKiBOb24tcGFja2V0aXplZCBidXNmcmVlIHJldmlzaW9uIGRvZXMgbm90IHdvcmsuICovCisJQUhEX0JVU0ZSRUVSRVZfQlVHCT0gMHg0MDAwMCwKKwkvKgorCSAqIFBhY2VkIHRyYW5zZmVycyBhcmUgaW5kaWNhdGVkIHdpdGggYSBub24tc3RhbmRhcmQgUFBSCisJICogb3B0aW9uIGJpdCBpbiB0aGUgbmVnIHRhYmxlLCAxNjBNSHogaXMgaW5kaWNhdGVkIGJ5CisJICogc3luYyBmYWN0b3IgMHg3LCBhbmQgdGhlIG9mZnNldCBpZiBvZmYgYnkgYSBmYWN0b3Igb2YgMi4KKwkgKi8KKwlBSERfUEFDRURfTkVHVEFCTEVfQlVHCT0gMHg4MDAwMCwKKwkvKiBMUU9PVkVSUlVOIGZhbHNlIHBvc2l0aXZlcy4gKi8KKwlBSERfTFFPT1ZFUlJVTl9CVUcJPSAweDEwMDAwMCwKKwkvKgorCSAqIENvbnRyb2xsZXIgd3JpdGUgdG8gSU5UU1RBVCB3aWxsIGxvc2UgdG8gYSBob3N0CisJICogd3JpdGUgdG8gQ0xSSU5ULgorCSAqLworCUFIRF9JTlRDT0xMSVNJT05fQlVHCT0gMHgyMDAwMDAsCisJLyoKKwkgKiBUaGUgR0VNMzE4IHZpb2xhdGVzIHRoZSBTQ1NJIHNwZWMgYnkgbm90IHdhaXRpbmcKKwkgKiB0aGUgbWFuZGF0ZWQgYnVzIHNldHRsZSBkZWxheSBiZXR3ZWVuIHBoYXNlIGNoYW5nZXMKKwkgKiBpbiBzb21lIHNpdHVhdGlvbnMuICBTb21lIGFpYzc5eHggY2hpcCByZXZzLiBhcmUgbW9yZQorCSAqIHN0cmljdCBpbiB0aGlzIHJlZ2FyZCBhbmQgd2lsbCB0cmVhdCBSRVEgYXNzZXJ0aW9ucworCSAqIHRoYXQgZmFsbCB3aXRoaW4gdGhlIGJ1cyBzZXR0bGUgZGVsYXkgd2luZG93IGFzCisJICogZ2xpdGNoZXMuICBUaGlzIGZsYWcgdGVsbHMgdGhlIGZpcm13YXJlIHRvIHRvbGVyYXRlCisJICogZWFybHkgUkVRIGFzc2VydGlvbnMuCisJICovCisJQUhEX0VBUkxZX1JFUV9CVUcJPSAweDQwMDAwMCwKKwkvKgorCSAqIFRoZSBMRUQgZG9lcyBub3Qgc3RheSBvbiBsb25nIGVub3VnaCBpbiBwYWNrZXRpemVkIG1vZGVzLgorCSAqLworCUFIRF9GQUlOVF9MRURfQlVHCT0gMHg4MDAwMDAKK30gYWhkX2J1ZzsKKworLyoKKyAqIENvbmZpZ3VyYXRpb24gc3BlY2lmaWMgc2V0dGluZ3MuCisgKiBUaGUgZHJpdmVyIGRldGVybWluZXMgdGhlc2Ugc2V0dGluZ3MgYnkgcHJvYmluZyB0aGUKKyAqIGNoaXAvY29udHJvbGxlcidzIGNvbmZpZ3VyYXRpb24uCisgKi8KK3R5cGVkZWYgZW51bSB7CisJQUhEX0ZOT05FCSAgICAgID0gMHgwMDAwMCwKKwlBSERfQk9PVF9DSEFOTkVMICAgICAgPSAweDAwMDAxLC8qIFdlIHdlcmUgc2V0IGFzIHRoZSBib290IGNoYW5uZWwuICovCisJQUhEX1VTRURFRkFVTFRTCSAgICAgID0gMHgwMDAwNCwvKgorCQkJCQkgKiBGb3IgY2FyZHMgd2l0aG91dCBhbiBzZWVwcm9tCisJCQkJCSAqIG9yIGEgQklPUyB0byBpbml0aWFsaXplIHRoZSBjaGlwJ3MKKwkJCQkJICogU1JBTSwgd2UgdXNlIHRoZSBkZWZhdWx0IHRhcmdldAorCQkJCQkgKiBzZXR0aW5ncy4KKwkJCQkJICovCisJQUhEX1NFUVVFTkNFUl9ERUJVRyAgID0gMHgwMDAwOCwKKwlBSERfUkVTRVRfQlVTX0EJICAgICAgPSAweDAwMDEwLAorCUFIRF9FWFRFTkRFRF9UUkFOU19BICA9IDB4MDAwMjAsCisJQUhEX1RFUk1fRU5CX0EJICAgICAgPSAweDAwMDQwLAorCUFIRF9TUENIS19FTkJfQQkgICAgICA9IDB4MDAwODAsCisJQUhEX1NUUFdMRVZFTF9BCSAgICAgID0gMHgwMDEwMCwKKwlBSERfSU5JVElBVE9SUk9MRSAgICAgPSAweDAwMjAwLC8qCisJCQkJCSAqIEFsbG93IGluaXRpYXRvciBvcGVyYXRpb25zIG9uCisJCQkJCSAqIHRoaXMgY29udHJvbGxlci4KKwkJCQkJICovCisJQUhEX1RBUkdFVFJPTEUJICAgICAgPSAweDAwNDAwLC8qCisJCQkJCSAqIEFsbG93IHRhcmdldCBvcGVyYXRpb25zIG9uIHRoaXMKKwkJCQkJICogY29udHJvbGxlci4KKwkJCQkJICovCisJQUhEX1JFU09VUkNFX1NIT1JUQUdFID0gMHgwMDgwMCwKKwlBSERfVFFJTkZJRk9fQkxPQ0tFRCAgPSAweDAxMDAwLC8qIEJsb2NrZWQgd2FpdGluZyBmb3IgQVRJT3MgKi8KKwlBSERfSU5UNTBfU1BFRURGTEVYICAgPSAweDAyMDAwLC8qCisJCQkJCSAqIEludGVybmFsIDUwcGluIGNvbm5lY3RvcgorCQkJCQkgKiBzaXRzIGJlaGluZCBhbiBhaWMzODYwCisJCQkJCSAqLworCUFIRF9CSU9TX0VOQUJMRUQgICAgICA9IDB4MDQwMDAsCisJQUhEX0FMTF9JTlRFUlJVUFRTICAgID0gMHgwODAwMCwKKwlBSERfMzlCSVRfQUREUkVTU0lORyAgPSAweDEwMDAwLC8qIFVzZSAzOSBiaXQgYWRkcmVzc2luZyBzY2hlbWUuICovCisJQUhEXzY0QklUX0FERFJFU1NJTkcgID0gMHgyMDAwMCwvKiBVc2UgNjQgYml0IGFkZHJlc3Npbmcgc2NoZW1lLiAqLworCUFIRF9DVVJSRU5UX1NFTlNJTkcgICA9IDB4NDAwMDAsCisJQUhEX1NDQl9DT05GSUdfVVNFRCAgID0gMHg4MDAwMCwvKiBObyBTRUVQUk9NIGJ1dCBTQ0IgaGFkIGluZm8uICovCisJQUhEX0hQX0JPQVJECSAgICAgID0gMHgxMDAwMDAsCisJQUhEX1JFU0VUX1BPTExfQUNUSVZFID0gMHgyMDAwMDAsCisJQUhEX1VQREFURV9QRU5EX0NNRFMgID0gMHg0MDAwMDAsCisJQUhEX1JVTk5JTkdfUU9VVEZJRk8gID0gMHg4MDAwMDAsCisJQUhEX0hBRF9GSVJTVF9TRUwgICAgID0gMHgxMDAwMDAwCit9IGFoZF9mbGFnOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBIYXJkd2FyZSAgU0NCIERlZmluaXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhlIGRyaXZlciBrZWVwcyB1cCB0byBNQVhfU0NCIHNjYiBzdHJ1Y3R1cmVzIHBlciBjYXJkIGluIG1lbW9yeS4gIFRoZSBTQ0IKKyAqIGNvbnNpc3RzIG9mIGEgImhhcmR3YXJlIFNDQiIgbWlycm9yaW5nIHRoZSBmaWVsZHMgYXZhaWxhYmxlIG9uIHRoZSBjYXJkCisgKiBhbmQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGUga2VybmVsIHN0b3JlcyBmb3IgZWFjaCB0cmFuc2FjdGlvbi4KKyAqCisgKiBUbyBtaW5pbWl6ZSBzcGFjZSB1dGlsaXphdGlvbiwgYSBwb3J0aW9uIG9mIHRoZSBoYXJkd2FyZSBzY2Igc3RvcmVzCisgKiBkaWZmZXJlbnQgZGF0YSBkdXJpbmcgZGlmZmVyZW50IHBvcnRpb25zIG9mIGEgU0NTSSB0cmFuc2FjdGlvbi4KKyAqIEFzIGluaXRpYWxpemVkIGJ5IHRoZSBob3N0IGRyaXZlciBmb3IgdGhlIGluaXRpYXRvciByb2xlLCB0aGlzIGFyZWEKKyAqIGNvbnRhaW5zIHRoZSBTQ1NJIGNkYiAob3IgYSBwb2ludGVyIHRvIHRoZSAgY2RiKSB0byBiZSBleGVjdXRlZC4gIEFmdGVyCisgKiB0aGUgY2RiIGhhcyBiZWVuIHByZXNlbnRlZCB0byB0aGUgdGFyZ2V0LCB0aGlzIGFyZWEgc2VydmVzIHRvIHN0b3JlCisgKiByZXNpZHVhbCB0cmFuc2ZlciBpbmZvcm1hdGlvbiBhbmQgdGhlIFNDU0kgc3RhdHVzIGJ5dGUuCisgKiBGb3IgdGhlIHRhcmdldCByb2xlLCB0aGUgY29udGVudHMgb2YgdGhpcyBhcmVhIGRvIG5vdCBjaGFuZ2UsIGJ1dAorICogc3RpbGwgc2VydmUgYSBkaWZmZXJlbnQgcHVycG9zZSB0aGFuIGZvciB0aGUgaW5pdGlhdG9yIHJvbGUuICBTZWUKKyAqIHN0cnVjdCB0YXJnZXRfZGF0YSBmb3IgZGV0YWlscy4KKyAqLworCisvKgorICogU3RhdHVzIGluZm9ybWF0aW9uIGVtYmVkZGVkIGluIHRoZSBzaGFyZWQgcG9yaXRvbiBvZgorICogYW4gU0NCIGFmdGVyIHBhc3NpbmcgdGhlIGNkYiB0byB0aGUgdGFyZ2V0LiAgVGhlIGtlcm5lbAorICogZHJpdmVyIHdpbGwgb25seSByZWFkIHRoaXMgZGF0YSBmb3IgdHJhbnNhY3Rpb25zIHRoYXQKKyAqIGNvbXBsZXRlIGFibm9ybWFsbHkuCisgKi8KK3N0cnVjdCBpbml0aWF0b3Jfc3RhdHVzIHsKKwl1aW50MzJfdCByZXNpZHVhbF9kYXRhY250OwkvKiBSZXNpZHVhbCBpbiB0aGUgY3VycmVudCBTL0cgc2VnICovCisJdWludDMyX3QgcmVzaWR1YWxfc2dwdHI7CS8qIFRoZSBuZXh0IFMvRyBmb3IgdGhpcyB0cmFuc2ZlciAqLworCXVpbnQ4X3QJIHNjc2lfc3RhdHVzOwkJLyogU3RhbmRhcmQgU0NTSSBzdGF0dXMgYnl0ZSAqLworfTsKKworc3RydWN0IHRhcmdldF9zdGF0dXMgeworCXVpbnQzMl90IHJlc2lkdWFsX2RhdGFjbnQ7CS8qIFJlc2lkdWFsIGluIHRoZSBjdXJyZW50IFMvRyBzZWcgKi8KKwl1aW50MzJfdCByZXNpZHVhbF9zZ3B0cjsJLyogVGhlIG5leHQgUy9HIGZvciB0aGlzIHRyYW5zZmVyICovCisJdWludDhfdCAgc2NzaV9zdGF0dXM7CQkvKiBTQ1NJIHN0YXR1cyB0byBnaXZlIHRvIGluaXRpYXRvciAqLworCXVpbnQ4X3QgIHRhcmdldF9waGFzZXM7CQkvKiBCaXRtYXAgb2YgcGhhc2VzIHRvIGV4ZWN1dGUgKi8KKwl1aW50OF90ICBkYXRhX3BoYXNlOwkJLyogRGF0YS1JbiBvciBEYXRhLU91dCAqLworCXVpbnQ4X3QgIGluaXRpYXRvcl90YWc7CQkvKiBJbml0aWF0b3IncyB0cmFuc2FjdGlvbiB0YWcgKi8KK307CisKKy8qCisgKiBJbml0aWF0b3IgbW9kZSBTQ0Igc2hhcmVkIGRhdGEgYXJlYS4KKyAqIElmIHRoZSBlbWJlZGRlZCBDREIgaXMgMTIgYnl0ZXMgb3IgbGVzcywgd2UgZW1iZWQKKyAqIHRoZSBzZW5zZSBidWZmZXIgYWRkcmVzcyBpbiB0aGUgU0NCLiAgVGhpcyBhbGxvd3MKKyAqIHVzIHRvIHJldHJpZXZlIHNlbnNlIGluZm9ybWF0aW9uIHdpdGhvdXQgaW50ZXJydXB0aW5nCisgKiB0aGUgaG9zdCBpbiBwYWNrZXRpemVkIG1vZGUuCisgKi8KK3R5cGVkZWYgdWludDMyX3Qgc2Vuc2VfYWRkcl90OworI2RlZmluZSBNQVhfQ0RCX0xFTiAxNgorI2RlZmluZSBNQVhfQ0RCX0xFTl9XSVRIX1NFTlNFX0FERFIgKE1BWF9DREJfTEVOIC0gc2l6ZW9mKHNlbnNlX2FkZHJfdCkpCit1bmlvbiBpbml0aWF0b3JfZGF0YSB7CisJc3RydWN0IHsKKwkJdWludDY0X3QgY2RicHRyOworCQl1aW50OF90ICBjZGJsZW47CisJfSBjZGJfZnJvbV9ob3N0OworCXVpbnQ4X3QJIGNkYltNQVhfQ0RCX0xFTl07CisJc3RydWN0IHsKKwkJdWludDhfdAkgY2RiW01BWF9DREJfTEVOX1dJVEhfU0VOU0VfQUREUl07CisJCXNlbnNlX2FkZHJfdCBzZW5zZV9hZGRyOworCX0gY2RiX3BsdXNfc2FkZHI7Cit9OworCisvKgorICogVGFyZ2V0IG1vZGUgdmVyc2lvbiBvZiB0aGUgc2hhcmVkIGRhdGEgU0NCIHNlZ21lbnQuCisgKi8KK3N0cnVjdCB0YXJnZXRfZGF0YSB7CisJdWludDMyX3Qgc3BhcmVbMl07CQorCXVpbnQ4X3QgIHNjc2lfc3RhdHVzOwkJLyogU0NTSSBzdGF0dXMgdG8gZ2l2ZSB0byBpbml0aWF0b3IgKi8KKwl1aW50OF90ICB0YXJnZXRfcGhhc2VzOwkJLyogQml0bWFwIG9mIHBoYXNlcyB0byBleGVjdXRlICovCisJdWludDhfdCAgZGF0YV9waGFzZTsJCS8qIERhdGEtSW4gb3IgRGF0YS1PdXQgKi8KKwl1aW50OF90ICBpbml0aWF0b3JfdGFnOwkJLyogSW5pdGlhdG9yJ3MgdHJhbnNhY3Rpb24gdGFnICovCit9OworCitzdHJ1Y3QgaGFyZHdhcmVfc2NiIHsKKy8qMCovCXVuaW9uIHsKKwkJdW5pb24JaW5pdGlhdG9yX2RhdGEgaWRhdGE7CisJCXN0cnVjdAl0YXJnZXRfZGF0YSB0ZGF0YTsKKwkJc3RydWN0CWluaXRpYXRvcl9zdGF0dXMgaXN0YXR1czsKKwkJc3RydWN0CXRhcmdldF9zdGF0dXMgdHN0YXR1czsKKwl9IHNoYXJlZF9kYXRhOworLyoKKyAqIEEgd29yZCBhYm91dCByZXNpZHVhbHMuCisgKiBUaGUgc2NiIGlzIHByZXNlbnRlZCB0byB0aGUgc2VxdWVuY2VyIHdpdGggdGhlIGRhdGFwdHIgYW5kIGRhdGFjbnQKKyAqIGZpZWxkcyBpbml0aWFsaXplZCB0byB0aGUgY29udGVudHMgb2YgdGhlIGZpcnN0IFMvRyBlbGVtZW50IHRvCisgKiB0cmFuc2Zlci4gIFRoZSBzZ3B0ciBmaWVsZCBpcyBpbml0aWFsaXplZCB0byB0aGUgYnVzIGFkZHJlc3MgZm9yCisgKiB0aGUgUy9HIGVsZW1lbnQgdGhhdCBmb2xsb3dzIHRoZSBmaXJzdCBpbiB0aGUgaW4gY29yZSBTL0cgYXJyYXkKKyAqIG9yJ2VkIHdpdGggdGhlIFNHX0ZVTExfUkVTSUQgZmxhZy4gIFNncHRyIG1heSBwb2ludCB0byBhbiBpbnZhbGlkCisgKiBTL0cgZW50cnkgZm9yIHRoaXMgdHJhbnNmZXIgKHNpbmdsZSBTL0cgZWxlbWVudCB0cmFuc2ZlciB3aXRoIHRoZQorICogZmlyc3QgZWxlbWVudHMgYWRkcmVzcyBhbmQgbGVuZ3RoIHByZWxvYWRlZCBpbiB0aGUgZGF0YXB0ci9kYXRhY250CisgKiBmaWVsZHMpLiAgSWYgbm8gdHJhbnNmZXIgaXMgdG8gb2NjdXIsIHNncHRyIGlzIHNldCB0byBTR19MSVNUX05VTEwuCisgKiBUaGUgU0dfRlVMTF9SRVNJRCBmbGFnIGVuc3VyZXMgdGhhdCB0aGUgcmVzaWR1YWwgd2lsbCBiZSBjb3JyZWN0bHkKKyAqIG5vdGVkIGV2ZW4gaWYgbm8gZGF0YSB0cmFuc2ZlcnMgb2NjdXIuICBPbmNlIHRoZSBkYXRhIHBoYXNlIGlzIGVudGVyZWQsCisgKiB0aGUgcmVzaWR1YWwgc2dwdHIgYW5kIGRhdGFjbnQgYXJlIGxvYWRlZCBmcm9tIHRoZSBzZ3B0ciBhbmQgdGhlCisgKiBkYXRhY250IGZpZWxkcy4gIEFmdGVyIGVhY2ggUy9HIGVsZW1lbnQncyBkYXRhcHRyIGFuZCBsZW5ndGggYXJlCisgKiBsb2FkZWQgaW50byB0aGUgaGFyZHdhcmUsIHRoZSByZXNpZHVhbCBzZ3B0ciBpcyBhZHZhbmNlZC4gIEFmdGVyCisgKiBlYWNoIFMvRyBlbGVtZW50IGlzIGV4cGlyZWQsIGl0cyBkYXRhY250IGZpZWxkIGlzIGNoZWNrZWQgdG8gc2VlCisgKiBpZiB0aGUgTEFTVF9TRUcgZmxhZyBpcyBzZXQuICBJZiBzbywgU0dfTElTVF9OVUxMIGlzIHNldCBpbiB0aGUKKyAqIHJlc2lkdWFsIHNnIHB0ciBhbmQgdGhlIHRyYW5zZmVyIGlzIGNvbnNpZGVyZWQgY29tcGxldGUuICBJZiB0aGUKKyAqIHNlcXVlbmNlciBkZXRlcm1pbmVzIHRoYXQgdGhlcmUgaXMgYSByZXNpZHVhbCBpbiB0aGUgdHJhbmZlciwgb3IKKyAqIHRoZXJlIGlzIG5vbi16ZXJvIHN0YXR1cywgaXQgd2lsbCBzZXQgdGhlIFNHX1NUQVRVU19WQUxJRCBmbGFnIGluCisgKiBzZ3B0ciBhbmQgZG1hIHRoZSBzY2IgYmFjayBpbnRvIGhvc3QgbWVtb3J5LiAgVG8gc3VtYXJpemU6CisgKgorICogU2VxdWVuY2VyOgorICoJbyBBIHJlc2lkdWFsIGhhcyBvY2N1cnJlZCBpZiBTR19GVUxMX1JFU0lEIGlzIHNldCBpbiBzZ3B0ciwKKyAqCSAgb3IgcmVzaWR1YWxfc2dwdHIgZG9lcyBub3QgaGF2ZSBTR19MSVNUX05VTEwgc2V0LgorICoKKyAqCW8gV2UgYXJlIHRyYW5zZmVyaW5nIHRoZSBsYXN0IHNlZ21lbnQgaWYgcmVzaWR1YWxfZGF0YWNudCBoYXMKKyAqCSAgdGhlIFNHX0xBU1RfU0VHIGZsYWcgc2V0LgorICoKKyAqIEhvc3Q6CisgKglvIEEgcmVzaWR1YWwgY2FuIG9ubHkgaGF2ZSBvY2N1cnJlZCBpZiBhIGNvbXBsZXRlZCBzY2IgaGFzIHRoZQorICoJICBTR19TVEFUVVNfVkFMSUQgZmxhZyBzZXQuICBJbnNwZWN0aW9uIG9mIHRoZSBTQ1NJIHN0YXR1cyBmaWVsZCwKKyAqCSAgdGhlIHJlc2lkdWFsX2RhdGFjbnQsIGFuZCB0aGUgcmVzaWR1YWxfc2dwdHIgZmllbGQgd2lsbCB0ZWxsCisgKgkgIGZvciBzdXJlLgorICoKKyAqCW8gcmVzaWR1YWxfc2dwdHIgYW5kIHNncHRyIHJlZmVyIHRvIHRoZSAibmV4dCIgc2cgZW50cnkKKyAqCSAgYW5kIHNvIG1heSBwb2ludCBiZXlvbmQgdGhlIGxhc3QgdmFsaWQgc2cgZW50cnkgZm9yIHRoZQorICoJICB0cmFuc2Zlci4KKyAqLyAKKyNkZWZpbmUgU0dfUFRSX01BU0sJMHhGRkZGRkZGOAorLyoxNiovCXVpbnQxNl90IHRhZzsJCS8qIFJldXNlZCBieSBTZXF1ZW5jZXIuICovCisvKjE4Ki8JdWludDhfdCAgY29udHJvbDsJLyogU2VlIFNDQl9DT05UUk9MIGluIGFpYzc5eHgucmVnIGZvciBkZXRhaWxzICovCisvKjE5Ki8JdWludDhfdAkgc2NzaWlkOwkvKgorCQkJCSAqIFNlbGVjdGlvbiBvdXQgSWQKKwkJCQkgKiBPdXIgSWQgKGJpdHMgMC0zKSBUaGVpciBJRCAoYml0cyA0LTcpCisJCQkJICovCisvKjIwKi8JdWludDhfdCAgbHVuOworLyoyMSovCXVpbnQ4X3QgIHRhc2tfYXR0cmlidXRlOworLyoyMiovCXVpbnQ4X3QgIGNkYl9sZW47CisvKjIzKi8JdWludDhfdCAgdGFza19tYW5hZ2VtZW50OworLyoyNCovCXVpbnQ2NF90IGRhdGFwdHI7CisvKjMyKi8JdWludDMyX3QgZGF0YWNudDsJLyogQnl0ZSAzIGlzIHNwYXJlLiAqLworLyozNiovCXVpbnQzMl90IHNncHRyOworLyo0MCovCXVpbnQzMl90IGhzY2JfYnVzYWRkcjsKKy8qNDQqLwl1aW50MzJfdCBuZXh0X2hzY2JfYnVzYWRkcjsKKy8qKioqKioqKioqIExvbmcgbHVuIGZpZWxkIG9ubHkgZG93bmxvYWRlZCBmb3IgZnVsbCA4IGJ5dGUgbHVuIHN1cHBvcnQgKioqKioqKiovCisvKjQ4Ki8gIHVpbnQ4X3QJIHBrdF9sb25nX2x1bls4XTsKKy8qKioqKioqIEZpZWxkcyBiZWxvdyBhcmUgbm90IERvd25sb2FkZWQgKFNlcXVlbmNlciBtYXkgdXNlIGZvciBzY3JhdGNoKSAqKioqKiovCisvKjU2Ki8gIHVpbnQ4X3QJIHNwYXJlWzhdOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBLZXJuZWwgU0NCIERlZmluaXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBTb21lIGZpZWxkcyBvZiB0aGUgU0NCIGFyZSBPUyBkZXBlbmRlbnQuICBIZXJlIHdlIGNvbGxlY3QgdGhlCisgKiBkZWZpbml0aW9ucyBmb3IgZWxlbWVudHMgdGhhdCBhbGwgT1MgcGxhdGZvcm1zIG5lZWQgdG8gaW5jbHVkZQorICogaW4gdGhlcmUgU0NCIGRlZmluaXRpb24uCisgKi8KKworLyoKKyAqIERlZmluaXRpb24gb2YgYSBzY2F0dGVyL2dhdGhlciBlbGVtZW50IGFzIHRyYW5zZmVyZWQgdG8gdGhlIGNvbnRyb2xsZXIuCisgKiBUaGUgYWljN3h4eCBjaGlwcyBvbmx5IHN1cHBvcnQgYSAyNGJpdCBsZW5ndGguICBXZSB1c2UgdGhlIHRvcCBieXRlIG9mCisgKiB0aGUgbGVuZ3RoIHRvIHN0b3JlIGFkZGl0aW9uYWwgYWRkcmVzcyBiaXRzIGFuZCBhIGZsYWcgdG8gaW5kaWNhdGUKKyAqIHRoYXQgYSBnaXZlbiBzZWdtZW50IHRlcm1pbmF0ZXMgdGhlIHRyYW5zZmVyLiAgVGhpcyBnaXZlcyB1cyBhbgorICogYWRkcmVzc2FibGUgcmFuZ2Ugb2YgNTEyR0Igb24gbWFjaGluZXMgd2l0aCA2NGJpdCBQQ0kgb3Igd2l0aCBjaGlwcworICogdGhhdCBjYW4gc3VwcG9ydCBkdWFsIGFkZHJlc3MgY3ljbGVzIG9uIDMyYml0IFBDSSBidXNzZXMuCisgKi8KK3N0cnVjdCBhaGRfZG1hX3NlZyB7CisJdWludDMyX3QJYWRkcjsKKwl1aW50MzJfdAlsZW47CisjZGVmaW5lCUFIRF9ETUFfTEFTVF9TRUcJMHg4MDAwMDAwMAorI2RlZmluZQlBSERfU0dfSElHSF9BRERSX01BU0sJMHg3RjAwMDAwMAorI2RlZmluZQlBSERfU0dfTEVOX01BU0sJCTB4MDBGRkZGRkYKK307CisKK3N0cnVjdCBhaGRfZG1hNjRfc2VnIHsKKwl1aW50NjRfdAlhZGRyOworCXVpbnQzMl90CWxlbjsKKwl1aW50MzJfdAlwYWQ7Cit9OworCitzdHJ1Y3QgbWFwX25vZGUgeworCWJ1c19kbWFtYXBfdAkJIGRtYW1hcDsKKwlkbWFfYWRkcl90CQkgcGh5c2FkZHI7CisJdWludDhfdAkJCSp2YWRkcjsKKwlTTElTVF9FTlRSWShtYXBfbm9kZSkJIGxpbmtzOworfTsKKworLyoKKyAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoaXMgU0NCLgorICovCit0eXBlZGVmIGVudW0geworCVNDQl9GTEFHX05PTkUJCT0gMHgwMDAwMCwKKwlTQ0JfVFJBTlNNSVNTSU9OX0VSUk9SCT0gMHgwMDAwMSwvKgorCQkJCQkgICAqIFdlIGRldGVjdGVkIGEgcGFyaXR5IG9yIENSQworCQkJCQkgICAqIGVycm9yIHRoYXQgaGFzIGVmZmVjdGVkIHRoZQorCQkJCQkgICAqIHBheWxvYWQgb2YgdGhlIGNvbW1hbmQuICBUaGlzCisJCQkJCSAgICogZmxhZyBpcyBjaGVja2VkIHdoZW4gbm9ybWFsCisJCQkJCSAgICogc3RhdHVzIGlzIHJldHVybmVkIHRvIGNhdGNoCisJCQkJCSAgICogdGhlIGNhc2Ugb2YgYSB0YXJnZXQgbm90CisJCQkJCSAgICogcmVzcG9uZGluZyB0byBvdXIgYXR0ZW1wdAorCQkJCQkgICAqIHRvIHJlcG9ydCB0aGUgZXJyb3IuCisJCQkJCSAgICovCisJU0NCX09USEVSVENMX1RJTUVPVVQJPSAweDAwMDAyLC8qCisJCQkJCSAgICogQW5vdGhlciBkZXZpY2Ugd2FzIGFjdGl2ZQorCQkJCQkgICAqIGR1cmluZyB0aGUgZmlyc3QgdGltZW91dCBmb3IKKwkJCQkJICAgKiB0aGlzIFNDQiBzbyB3ZSBnYXZlIG91cnNlbHZlcworCQkJCQkgICAqIGFuIGFkZGl0aW9uYWwgdGltZW91dCBwZXJpb2QKKwkJCQkJICAgKiBpbiBjYXNlIGl0IHdhcyBob2dnaW5nIHRoZQorCQkJCQkgICAqIGJ1cy4KKwkJCQkgICAgICAgICAgICovCisJU0NCX0RFVklDRV9SRVNFVAk9IDB4MDAwMDQsCisJU0NCX1NFTlNFCQk9IDB4MDAwMDgsCisJU0NCX0NEQjMyX1BUUgkJPSAweDAwMDEwLAorCVNDQl9SRUNPVkVSWV9TQ0IJPSAweDAwMDIwLAorCVNDQl9BVVRPX05FR09USUFURQk9IDB4MDAwNDAsLyogTmVnb3RpYXRlIHRvIGFjaGlldmUgZ29hbC4gKi8KKwlTQ0JfTkVHT1RJQVRFCQk9IDB4MDAwODAsLyogTmVnb3RpYXRpb24gZm9yY2VkIGZvciBjb21tYW5kLiAqLworCVNDQl9BQk9SVAkJPSAweDAwMTAwLAorCVNDQl9BQ1RJVkUJCT0gMHgwMDIwMCwKKwlTQ0JfVEFSR0VUX0lNTUVESUFURQk9IDB4MDA0MDAsCisJU0NCX1BBQ0tFVElaRUQJCT0gMHgwMDgwMCwKKwlTQ0JfRVhQRUNUX1BQUl9CVVNGUkVFCT0gMHgwMTAwMCwKKwlTQ0JfUEtUX1NFTlNFCQk9IDB4MDIwMDAsCisJU0NCX0NNRFBIQVNFX0FCT1JUCT0gMHgwNDAwMCwKKwlTQ0JfT05fQ09MX0xJU1QJCT0gMHgwODAwMCwKKwlTQ0JfU0lMRU5UCQk9IDB4MTAwMDAgLyoKKwkJCQkJICAgKiBCZSBxdWlldCBhYm91dCB0cmFuc21pc3Npb24gdHlwZQorCQkJCQkgICAqIGVycm9ycy4gIFRoZXkgYXJlIGV4cGVjdGVkIGFuZCB3ZQorCQkJCQkgICAqIGRvbid0IHdhbnQgdG8gdXBzZXQgdGhlIHVzZXIuICBUaGlzCisJCQkJCSAgICogZmxhZyBpcyB0eXBpY2FsbHkgdXNlZCBkdXJpbmcgRFYuCisJCQkJCSAgICovCit9IHNjYl9mbGFnOworCitzdHJ1Y3Qgc2NiIHsKKwlzdHJ1Y3QJaGFyZHdhcmVfc2NiCSAqaHNjYjsKKwl1bmlvbiB7CisJCVNMSVNUX0VOVFJZKHNjYikgIHNsZTsKKwkJTElTVF9FTlRSWShzY2IpCSAgbGU7CisJCVRBSUxRX0VOVFJZKHNjYikgIHRxZTsKKwl9IGxpbmtzOworCXVuaW9uIHsKKwkJU0xJU1RfRU5UUlkoc2NiKSAgc2xlOworCQlMSVNUX0VOVFJZKHNjYikJICBsZTsKKwkJVEFJTFFfRU5UUlkoc2NiKSAgdHFlOworCX0gbGlua3MyOworI2RlZmluZSBwZW5kaW5nX2xpbmtzIGxpbmtzMi5sZQorI2RlZmluZSBjb2xsaXNpb25fbGlua3MgbGlua3MyLmxlCisJc3RydWN0IHNjYgkJICpjb2xfc2NiOworCWFoZF9pb19jdHhfdAkJICBpb19jdHg7CisJc3RydWN0IGFoZF9zb2Z0YwkgKmFoZF9zb2Z0YzsKKwlzY2JfZmxhZwkJICBmbGFnczsKKyNpZm5kZWYgX19saW51eF9fCisJYnVzX2RtYW1hcF90CQkgIGRtYW1hcDsKKyNlbmRpZgorCXN0cnVjdCBzY2JfcGxhdGZvcm1fZGF0YSAqcGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbWFwX25vZGUJIAkgKmhzY2JfbWFwOworCXN0cnVjdCBtYXBfbm9kZQkgCSAqc2dfbWFwOworCXN0cnVjdCBtYXBfbm9kZQkgCSAqc2Vuc2VfbWFwOworCXZvaWQJCQkgKnNnX2xpc3Q7CisJdWludDhfdAkJCSAqc2Vuc2VfZGF0YTsKKwlkbWFfYWRkcl90CQkgIHNnX2xpc3RfYnVzYWRkcjsKKwlkbWFfYWRkcl90CQkgIHNlbnNlX2J1c2FkZHI7CisJdV9pbnQJCQkgIHNnX2NvdW50Oy8qIEhvdyBmdWxsIGFoZF9kbWFfc2VnIGlzICovCisjZGVmaW5lCUFIRF9NQVhfTFFfQ1JDX0VSUk9SUyA1CisJdV9pbnQJCQkgIGNyY19yZXRyeV9jb3VudDsKK307CisKK1RBSUxRX0hFQUQoc2NiX3RhaWxxLCBzY2IpOworTElTVF9IRUFEKHNjYl9saXN0LCBzY2IpOworCitzdHJ1Y3Qgc2NiX2RhdGEgeworCS8qCisJICogVEFJTFEgb2YgbGlzdHMgb2YgZnJlZSBTQ0JzIGdyb3VwZWQgYnkgZGV2aWNlCisJICogY29sbGlzaW9uIGRvbWFpbnMuCisJICovCisJc3RydWN0IHNjYl90YWlscSBmcmVlX3NjYnM7CisKKwkvKgorCSAqIFBlci1kZXZpY2UgbGlzdHMgb2YgU0NCcyB3aG9zZSB0YWcgSUQgd291bGQgY29sbGlkZQorCSAqIHdpdGggYW4gYWxyZWFkeSBhY3RpdmUgdGFnIG9uIHRoZSBkZXZpY2UuCisJICovCisJc3RydWN0IHNjYl9saXN0IGZyZWVfc2NiX2xpc3RzW0FIRF9OVU1fVEFSR0VUUyAqIEFIRF9OVU1fTFVOU19OT05QS1RdOworCisJLyoKKwkgKiBTQ0JzIHRoYXQgd2lsbCBub3QgY29sbGlkZSB3aXRoIGFueSBhY3RpdmUgZGV2aWNlLgorCSAqLworCXN0cnVjdCBzY2JfbGlzdCBhbnlfZGV2X2ZyZWVfc2NiX2xpc3Q7CisKKwkvKgorCSAqIE1hcHBpbmcgZnJvbSB0YWcgdG8gU0NCLgorCSAqLworCXN0cnVjdAlzY2IgKnNjYmluZGV4W0FIRF9TQ0JfTUFYXTsKKworCS8qCisJICogIkJ1cyIgYWRkcmVzc2VzIG9mIG91ciBkYXRhIHN0cnVjdHVyZXMuCisJICovCisJYnVzX2RtYV90YWdfdAkgaHNjYl9kbWF0OwkvKiBkbWF0IGZvciBvdXIgaGFyZHdhcmUgU0NCIGFycmF5ICovCisJYnVzX2RtYV90YWdfdAkgc2dfZG1hdDsJLyogZG1hdCBmb3Igb3VyIHNnIHNlZ21lbnRzICovCisJYnVzX2RtYV90YWdfdAkgc2Vuc2VfZG1hdDsJLyogZG1hdCBmb3Igb3VyIHNlbnNlIGJ1ZmZlcnMgKi8KKwlTTElTVF9IRUFEKCwgbWFwX25vZGUpIGhzY2JfbWFwczsKKwlTTElTVF9IRUFEKCwgbWFwX25vZGUpIHNnX21hcHM7CisJU0xJU1RfSEVBRCgsIG1hcF9ub2RlKSBzZW5zZV9tYXBzOworCWludAkJIHNjYnNfbGVmdDsJLyogdW5hbGxvY2F0ZWQgc2NicyBpbiBoZWFkIG1hcF9ub2RlICovCisJaW50CQkgc2dzX2xlZnQ7CS8qIHVuYWxsb2NhdGVkIHNncyBpbiBoZWFkIG1hcF9ub2RlICovCisJaW50CQkgc2Vuc2VfbGVmdDsJLyogdW5hbGxvY2F0ZWQgc2Vuc2UgaW4gaGVhZCBtYXBfbm9kZSAqLworCXVpbnQxNl90CSBudW1zY2JzOworCXVpbnQxNl90CSBtYXhoc2NiczsJLyogTnVtYmVyIG9mIFNDQnMgb24gdGhlIGNhcmQgKi8KKwl1aW50OF90CQkgaW5pdF9sZXZlbDsJLyoKKwkJCQkJICogSG93IGZhciB3ZSd2ZSBpbml0aWFsaXplZAorCQkJCQkgKiB0aGlzIHN0cnVjdHVyZS4KKwkJCQkJICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqIFRhcmdldCBNb2RlIERlZmluaXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29ubmVjdGlvbiBkZXNjaXB0b3IgZm9yIHNlbGVjdC1pbiByZXF1ZXN0cyBpbiB0YXJnZXQgbW9kZS4KKyAqLworc3RydWN0IHRhcmdldF9jbWQgeworCXVpbnQ4X3Qgc2NzaWlkOwkJLyogT3VyIElEIGFuZCB0aGUgaW5pdGlhdG9yJ3MgSUQgKi8KKwl1aW50OF90IGlkZW50aWZ5OwkvKiBJZGVudGlmeSBtZXNzYWdlICovCisJdWludDhfdCBieXRlc1syMl07CS8qIAorCQkJCSAqIEJ5dGVzIGNvbnRhaW5zIGFueSBhZGRpdGlvbmFsIG1lc3NhZ2UKKwkJCQkgKiBieXRlcyB0ZXJtaW5hdGVkIGJ5IDB4RkYuICBUaGUgcmVtYWluZGVyCisJCQkJICogaXMgdGhlIGNkYiB0byBleGVjdXRlLgorCQkJCSAqLworCXVpbnQ4X3QgY21kX3ZhbGlkOwkvKgorCQkJCSAqIFdoZW4gYSBjb21tYW5kIGlzIGNvbXBsZXRlLCB0aGUgZmlybXdhcmUKKwkJCQkgKiB3aWxsIHNldCBjbWRfdmFsaWQgdG8gYWxsIGJpdHMgc2V0LgorCQkJCSAqIEFmdGVyIHRoZSBob3N0IGhhcyBzZWVuIHRoZSBjb21tYW5kLAorCQkJCSAqIHRoZSBiaXRzIGFyZSBjbGVhcmVkLiAgVGhpcyBhbGxvd3MgdXMKKwkJCQkgKiB0byBqdXN0IHBlZWsgYXQgaG9zdCBtZW1vcnkgdG8gZGV0ZXJtaW5lCisJCQkJICogaWYgbW9yZSB3b3JrIGlzIGNvbXBsZXRlLiBjbWRfdmFsaWQgaXMgb24KKwkJCQkgKiBhbiA4IGJ5dGUgYm91bmRhcnkgdG8gc2ltcGxpZnkgc2V0dGluZworCQkJCSAqIGl0IG9uIGFpYzc4ODAgaGFyZHdhcmUgd2hpY2ggb25seSBoYXMKKwkJCQkgKiBsaW1pdGVkIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIERNQSBGSUZPLgorCQkJCSAqLworCXVpbnQ4X3QgcGFkWzddOworfTsKKworLyoKKyAqIE51bWJlciBvZiBldmVudHMgd2UgY2FuIGJ1ZmZlciB1cCBpZiB3ZSBydW4gb3V0CisgKiBvZiBpbW1lZGlhdGUgbm90aWZ5IGNjYnMuCisgKi8KKyNkZWZpbmUgQUhEX1RNT0RFX0VWRU5UX0JVRkZFUl9TSVpFIDgKK3N0cnVjdCBhaGRfdG1vZGVfZXZlbnQgeworCXVpbnQ4X3QgaW5pdGlhdG9yX2lkOworCXVpbnQ4X3QgZXZlbnRfdHlwZTsJLyogTVNHIHR5cGUgb3IgRVZFTlRfVFlQRV9CVVNfUkVTRVQgKi8KKyNkZWZpbmUJRVZFTlRfVFlQRV9CVVNfUkVTRVQgMHhGRgorCXVpbnQ4X3QgZXZlbnRfYXJnOworfTsKKworLyoKKyAqIFBlciBlbmFibGVkIGx1biB0YXJnZXQgbW9kZSBzdGF0ZS4KKyAqIEFzIHRoaXMgc3RhdGUgaXMgZGlyZWN0bHkgaW5mbHVlbmNlZCBieSB0aGUgaG9zdCBPUydlcyB0YXJnZXQgbW9kZQorICogZW52aXJvbm1lbnQsIHdlIGxldCB0aGUgT1MgbW9kdWxlIGRlZmluZSBpdC4gIEZvcndhcmQgZGVjbGFyZSB0aGUKKyAqIHN0cnVjdHVyZSBoZXJlIHNvIHdlIGNhbiBzdG9yZSBhcnJheXMgb2YgdGhlbSwgZXRjLiBpbiBPUyBuZXV0cmFsCisgKiBkYXRhIHN0cnVjdHVyZXMuCisgKi8KKyNpZmRlZiBBSERfVEFSR0VUX01PREUgCitzdHJ1Y3QgYWhkX3Rtb2RlX2xzdGF0ZSB7CisJc3RydWN0IGNhbV9wYXRoICpwYXRoOworCXN0cnVjdCBjY2JfaGRyX3NsaXN0IGFjY2VwdF90aW9zOworCXN0cnVjdCBjY2JfaGRyX3NsaXN0IGltbWVkX25vdGlmaWVzOworCXN0cnVjdCBhaGRfdG1vZGVfZXZlbnQgZXZlbnRfYnVmZmVyW0FIRF9UTU9ERV9FVkVOVF9CVUZGRVJfU0laRV07CisJdWludDhfdCBldmVudF9yX2lkeDsKKwl1aW50OF90IGV2ZW50X3dfaWR4OworfTsKKyNlbHNlCitzdHJ1Y3QgYWhkX3Rtb2RlX2xzdGF0ZTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKiogVHJhbnNmZXIgTmVnb3RpYXRpb24gRGF0YXN0cnVjdHVyZXMgKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBBSERfVFJBTlNfQ1VSCQkweDAxCS8qIE1vZGlmeSBjdXJyZW50IG5lb2d0aWF0aW9uIHN0YXR1cyAqLworI2RlZmluZSBBSERfVFJBTlNfQUNUSVZFCTB4MDMJLyogQXNzdW1lIHRoaXMgdGFyZ2V0IGlzIG9uIHRoZSBidXMgKi8KKyNkZWZpbmUgQUhEX1RSQU5TX0dPQUwJCTB4MDQJLyogTW9kaWZ5IG5lZ290aWF0aW9uIGdvYWwgKi8KKyNkZWZpbmUgQUhEX1RSQU5TX1VTRVIJCTB4MDgJLyogTW9kaWZ5IHVzZXIgbmVnb3RpYXRpb24gc2V0dGluZ3MgKi8KKyNkZWZpbmUgQUhEX1BFUklPRF8xME1IegkweDE5CisKKyNkZWZpbmUgQUhEX1dJRFRIX1VOS05PV04JMHhGRgorI2RlZmluZSBBSERfUEVSSU9EX1VOS05PV04JMHhGRgorI2RlZmluZSBBSERfT0ZGU0VUX1VOS05PV04JMHhGRgorI2RlZmluZSBBSERfUFBSX09QVFNfVU5LTk9XTgkweEZGCisKKy8qCisgKiBUcmFuc2ZlciBOZWdvdGlhdGlvbiBJbmZvcm1hdGlvbi4KKyAqLworc3RydWN0IGFoZF90cmFuc2luZm8geworCXVpbnQ4X3QgcHJvdG9jb2xfdmVyc2lvbjsJLyogU0NTSSBSZXZpc2lvbiBsZXZlbCAqLworCXVpbnQ4X3QgdHJhbnNwb3J0X3ZlcnNpb247CS8qIFNQSSBSZXZpc2lvbiBsZXZlbCAqLworCXVpbnQ4X3Qgd2lkdGg7CQkJLyogQnVzIHdpZHRoICovCisJdWludDhfdCBwZXJpb2Q7CQkJLyogU3luYyByYXRlIGZhY3RvciAqLworCXVpbnQ4X3Qgb2Zmc2V0OwkJCS8qIFN5bmMgb2Zmc2V0ICovCisJdWludDhfdCBwcHJfb3B0aW9uczsJCS8qIFBhcmFsbGVsIFByb3RvY29sIFJlcXVlc3Qgb3B0aW9ucyAqLworfTsKKworLyoKKyAqIFBlci1pbml0aWF0b3IgY3VycmVudCwgZ29hbCBhbmQgdXNlciB0cmFuc2ZlciBuZWdvdGlhdGlvbiBpbmZvcm1hdGlvbi4gKi8KK3N0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvIHsKKwlzdHJ1Y3QgYWhkX3RyYW5zaW5mbyBjdXJyOworCXN0cnVjdCBhaGRfdHJhbnNpbmZvIGdvYWw7CisJc3RydWN0IGFoZF90cmFuc2luZm8gdXNlcjsKK307CisKKy8qCisgKiBQZXIgZW5hYmxlZCB0YXJnZXQgSUQgc3RhdGUuCisgKiBQb2ludGVycyB0byBsdW4gdGFyZ2V0IHN0YXRlIGFzIHdlbGwgYXMgc3luYy93aWRlIG5lZ290aWF0aW9uIGluZm9ybWF0aW9uCisgKiBmb3IgZWFjaCBpbml0aWF0b3I8LT50YXJnZXQgbWFwcGluZy4gIEZvciB0aGUgaW5pdGlhdG9yIHJvbGUgd2UgcHJldGVuZAorICogdGhhdCB3ZSBhcmUgdGhlIHRhcmdldCBhbmQgdGhlIHRhcmdldHMgYXJlIHRoZSBpbml0aWF0b3JzIHNpbmNlIHRoZQorICogbmVnb3RpYXRpb24gaXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiByb2xlLgorICovCitzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSB7CisJc3RydWN0IGFoZF90bW9kZV9sc3RhdGUqCWVuYWJsZWRfbHVuc1tBSERfTlVNX0xVTlNdOworCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvCXRyYW5zaW5mb1tBSERfTlVNX1RBUkdFVFNdOworCisJLyoKKwkgKiBQZXIgaW5pdGlhdG9yIHN0YXRlIGJpdG1hc2tzLgorCSAqLworCXVpbnQxNl90CSBhdXRvX25lZ290aWF0ZTsvKiBBdXRvIE5lZ290aWF0aW9uIFJlcXVpcmVkICovCisJdWludDE2X3QJIGRpc2NlbmFibGU7CS8qIERpc2Nvbm5lY3Rpb24gYWxsb3dlZCAgKi8KKwl1aW50MTZfdAkgdGFnZW5hYmxlOwkvKiBUYWdnZWQgUXVldWluZyBhbGxvd2VkICovCit9OworCisvKgorICogUG9pbnRzIG9mIGludGVyZXN0IGFsb25nIHRoZSBuZWdvdGlhdGVkIHRyYW5zZmVyIHNjYWxlLgorICovCisjZGVmaW5lIEFIRF9TWU5DUkFURV8xNjAJMHg4CisjZGVmaW5lIEFIRF9TWU5DUkFURV9QQUNFRAkweDgKKyNkZWZpbmUgQUhEX1NZTkNSQVRFX0RUCQkweDkKKyNkZWZpbmUgQUhEX1NZTkNSQVRFX1VMVFJBMgkweGEKKyNkZWZpbmUgQUhEX1NZTkNSQVRFX1VMVFJBCTB4YworI2RlZmluZSBBSERfU1lOQ1JBVEVfRkFTVAkweDE5CisjZGVmaW5lIEFIRF9TWU5DUkFURV9NSU5fRFQJQUhEX1NZTkNSQVRFX0ZBU1QKKyNkZWZpbmUgQUhEX1NZTkNSQVRFX1NZTkMJMHgzMgorI2RlZmluZSBBSERfU1lOQ1JBVEVfTUlOCTB4NjAKKyNkZWZpbmUJQUhEX1NZTkNSQVRFX0FTWU5DCTB4RkYKKyNkZWZpbmUgQUhEX1NZTkNSQVRFX01BWAlBSERfU1lOQ1JBVEVfMTYwCisKKy8qIFNhZmUgYW5kIHZhbGlkIHBlcmlvZCBmb3IgYXN5bmMgbmVnb3RpYXRpb25zLiAqLworI2RlZmluZQlBSERfQVNZTkNfWEZFUl9QRVJJT0QJMHg0NAorCisvKgorICogSW4gUmV2QSwgdGhlIHN5bmN0YWJsZSB1c2VzIGEgMTIwTUh6IHJhdGUgZm9yIHRoZSBwZXJpb2QKKyAqIGZhY3RvciA4IGFuZCAxNjBNSHogZm9yIHRoZSBwZXJpb2QgZmFjdG9yIDcuICBUaGUgMTIwTUh6CisgKiByYXRlIG5ldmVyIG1hZGUgaXQgaW50byB0aGUgb2ZmaWNpYWwgU0NTSSBzcGVjLCBzbyB3ZSBtdXN0CisgKiBjb21wZW5zYXRlIHdoZW4gc2V0dGluZyB0aGUgbmVnb3RpYXRpb24gdGFibGUgZm9yIFJldiBBCisgKiBwYXJ0cy4KKyAqLworI2RlZmluZSBBSERfU1lOQ1JBVEVfUkVWQV8xMjAJMHg4CisjZGVmaW5lIEFIRF9TWU5DUkFURV9SRVZBXzE2MAkweDcKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIExvb2t1cCBUYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBQaGFzZSAtPiBuYW1lIGFuZCBtZXNzYWdlIG91dCByZXNwb25zZQorICogdG8gcGFyaXR5IGVycm9ycyBpbiBlYWNoIHBoYXNlIHRhYmxlLiAKKyAqLworc3RydWN0IGFoZF9waGFzZV90YWJsZV9lbnRyeSB7CisgICAgICAgIHVpbnQ4X3QgcGhhc2U7CisgICAgICAgIHVpbnQ4X3QgbWVzZ19vdXQ7IC8qIE1lc3NhZ2UgcmVzcG9uc2UgdG8gcGFyaXR5IGVycm9ycyAqLworCWNoYXIgKnBoYXNlbXNnOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFNlcmlhbCBFRVBST00gRm9ybWF0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IHNlZXByb21fY29uZmlnIHsKKy8qCisgKiBQZXIgU0NTSSBJRCBDb25maWd1cmF0aW9uIEZsYWdzCisgKi8KKwl1aW50MTZfdCBkZXZpY2VfZmxhZ3NbMTZdOwkvKiB3b3JkcyAwLTE1ICovCisjZGVmaW5lCQlDRlhGRVIJCTB4MDAzRgkvKiBzeW5jaHJvbm91cyB0cmFuc2ZlciByYXRlICovCisjZGVmaW5lCQkJQ0ZYRkVSX0FTWU5DCTB4M0YKKyNkZWZpbmUJCUNGUUFTCQkweDAwNDAJLyogTmVnb3RpYXRlIFFBUyAqLworI2RlZmluZQkJQ0ZQQUNLRVRJWkVECTB4MDA4MAkvKiBOZWdvdGlhdGUgUGFja2V0aXplZCBUcmFuc2ZlcnMgKi8KKyNkZWZpbmUJCUNGU1RBUlQJCTB4MDEwMAkvKiBzZW5kIHN0YXJ0IHVuaXQgU0NTSSBjb21tYW5kICovCisjZGVmaW5lCQlDRklOQ0JJT1MJMHgwMjAwCS8qIGluY2x1ZGUgaW4gQklPUyBzY2FuICovCisjZGVmaW5lCQlDRkRJU0MJCTB4MDQwMAkvKiBlbmFibGUgZGlzY29ubmVjdGlvbiAqLworI2RlZmluZQkJQ0ZNVUxUSUxVTkRFVgkweDA4MDAJLyogUHJvYmUgbXVsdGlwbGUgbHVucyBpbiBCSU9TIHNjYW4gKi8KKyNkZWZpbmUJCUNGV0lERUIJCTB4MTAwMAkvKiB3aWRlIGJ1cyBkZXZpY2UgKi8KKyNkZWZpbmUJCUNGSE9TVE1BTkFHRUQJMHg4MDAwCS8qIE1hbmFnZWQgYnkgYSBSQUlEIGNvbnRyb2xsZXIgKi8KKworLyoKKyAqIEJJT1MgQ29udHJvbCBCaXRzCisgKi8KKwl1aW50MTZfdCBiaW9zX2NvbnRyb2w7CQkvKiB3b3JkIDE2ICovCisjZGVmaW5lCQlDRlNVUFJFTQkweDAwMDEJLyogc3VwcG9ydCBhbGwgcmVtb3ZlYWJsZSBkcml2ZXMgKi8KKyNkZWZpbmUJCUNGU1VQUkVNQgkweDAwMDIJLyogc3VwcG9ydCByZW1vdmVhYmxlIGJvb3QgZHJpdmVzICovCisjZGVmaW5lCQlDRkJJT1NTVEFURQkweDAwMEMJLyogQklPUyBBY3Rpb24gU3RhdGUgKi8KKyNkZWZpbmUJCSAgICBDRkJTX0RJU0FCTEVECTB4MDAKKyNkZWZpbmUJCSAgICBDRkJTX0VOQUJMRUQJMHgwNAorI2RlZmluZQkJICAgIENGQlNfRElTQUJMRURfU0NBTgkweDA4CisjZGVmaW5lCQlDRkVOQUJMRURWCTB4MDAxMAkvKiBQZXJmb3JtIERvbWFpbiBWYWxpZGF0aW9uICovCisjZGVmaW5lCQlDRkNUUkxfQQkweDAwMjAJLyogQklPUyBkaXNwbGF5cyBDdHJsLUEgbWVzc2FnZSAqLwkKKyNkZWZpbmUJCUNGU1BBUklUWQkweDAwNDAJLyogU0NTSSBwYXJpdHkgKi8KKyNkZWZpbmUJCUNGRVhURU5ECTB4MDA4MAkvKiBleHRlbmRlZCB0cmFuc2xhdGlvbiBlbmFibGVkICovCisjZGVmaW5lCQlDRkJPT1RDRAkweDAxMDAgIC8qIFN1cHBvcnQgQm9vdGFibGUgQ0QtUk9NICovCisjZGVmaW5lCQlDRk1TR19MRVZFTAkweDA2MDAJLyogQklPUyBNZXNzYWdlIExldmVsICovCisjZGVmaW5lCQkJQ0ZNU0dfVkVSQk9TRQkweDAwMDAKKyNkZWZpbmUJCQlDRk1TR19TSUxFTlQJMHgwMjAwCisjZGVmaW5lCQkJQ0ZNU0dfRElBRwkweDA0MDAKKyNkZWZpbmUJCUNGUkVTRVRCCTB4MDgwMAkvKiByZXNldCBTQ1NJIGJ1cyBhdCBib290ICovCisvKgkJVU5VU0VECQkweGYwMDAJKi8KKworLyoKKyAqIEhvc3QgQWRhcHRlciBDb250cm9sIEJpdHMKKyAqLworCXVpbnQxNl90IGFkYXB0ZXJfY29udHJvbDsJLyogd29yZCAxNyAqLwkKKyNkZWZpbmUJCUNGQVVUT1RFUk0JMHgwMDAxCS8qIFBlcmZvcm0gQXV0byB0ZXJtaW5hdGlvbiAqLworI2RlZmluZQkJQ0ZTVEVSTQkJMHgwMDAyCS8qIFNDU0kgbG93IGJ5dGUgdGVybWluYXRpb24gKi8KKyNkZWZpbmUJCUNGV1NURVJNCTB4MDAwNAkvKiBTQ1NJIGhpZ2ggYnl0ZSB0ZXJtaW5hdGlvbiAqLworI2RlZmluZQkJQ0ZTRUFVVE9URVJNCTB4MDAwOAkvKiBVbHRyYTIgUGVyZm9ybSBzZWNvbmRhcnkgQXV0byBUZXJtKi8KKyNkZWZpbmUJCUNGU0VMT1dURVJNCTB4MDAxMAkvKiBVbHRyYTIgc2Vjb25kYXJ5IGxvdyB0ZXJtICovCisjZGVmaW5lCQlDRlNFSElHSFRFUk0JMHgwMDIwCS8qIFVsdHJhMiBzZWNvbmRhcnkgaGlnaCB0ZXJtICovCisjZGVmaW5lCQlDRlNUUFdMRVZFTAkweDAwNDAJLyogVGVybWluYXRpb24gbGV2ZWwgY29udHJvbCAqLworI2RlZmluZQkJQ0ZCSU9TQVVUT1RFUk0JMHgwMDgwCS8qIFBlcmZvcm0gQXV0byB0ZXJtaW5hdGlvbiAqLworI2RlZmluZQkJQ0ZURVJNX01FTlUJMHgwMTAwCS8qIEJJT1MgZGlzcGxheXMgdGVybWluYXRpb24gbWVudSAqLwkKKyNkZWZpbmUJCUNGQ0xVU1RFUkVOQgkweDgwMDAJLyogQ2x1c3RlciBFbmFibGUgKi8KKworLyoKKyAqIEJ1cyBSZWxlYXNlIFRpbWUsIEhvc3QgQWRhcHRlciBJRAorICovCisJdWludDE2X3QgYnJ0aW1lX2lkOwkJLyogd29yZCAxOCAqLworI2RlZmluZQkJQ0ZTQ1NJSUQJMHgwMDBmCS8qIGhvc3QgYWRhcHRlciBTQ1NJIElEICovCisvKgkJVU5VU0VECQkweDAwZjAJKi8KKyNkZWZpbmUJCUNGQlJUSU1FCTB4ZmYwMAkvKiBidXMgcmVsZWFzZSB0aW1lL1BDSSBMYXRlbmN5IFRpbWUgKi8KKworLyoKKyAqIE1heGltdW0gdGFyZ2V0cworICovCisJdWludDE2X3QgbWF4X3RhcmdldHM7CQkvKiB3b3JkIDE5ICovCQorI2RlZmluZQkJQ0ZNQVhUQVJHCTB4MDBmZgkvKiBtYXhpbXVtIHRhcmdldHMgKi8KKyNkZWZpbmUJCUNGQk9PVExVTgkweDBmMDAJLyogTHVuIHRvIGJvb3QgZnJvbSAqLworI2RlZmluZQkJQ0ZCT09USUQJMHhmMDAwCS8qIFRhcmdldCB0byBib290IGZyb20gKi8KKwl1aW50MTZfdCByZXNfMVsxMF07CQkvKiB3b3JkcyAyMC0yOSAqLworCXVpbnQxNl90IHNpZ25hdHVyZTsJCS8qIEJJT1MgU2lnbmF0dXJlICovCisjZGVmaW5lCQlDRlNJR05BVFVSRQkweDQwMAorCXVpbnQxNl90IGNoZWNrc3VtOwkJLyogd29yZCAzMSAqLworfTsKKworLyoKKyAqIFZpdGFsIFByb2R1Y3QgRGF0YSB1c2VkIGR1cmluZyBQT1NUIGFuZCBieSB0aGUgQklPUy4KKyAqLworc3RydWN0IHZwZF9jb25maWcgeworCXVpbnQ4X3QgIGJpb3NfZmxhZ3M7CisjZGVmaW5lCQlWUERNQVNURVJCSU9TCTB4MDAwMQorI2RlZmluZQkJVlBEQk9PVEhPU1QJMHgwMDAyCisJdWludDhfdCAgcmVzZXJ2ZWRfMVsyMV07CisJdWludDhfdCAgcmVzb3VyY2VfdHlwZTsKKwl1aW50OF90ICByZXNvdXJjZV9sZW5bMl07CisJdWludDhfdCAgcmVzb3VyY2VfZGF0YVs4XTsKKwl1aW50OF90ICB2cGRfdGFnOworCXVpbnQxNl90IHZwZF9sZW47CisJdWludDhfdCAgdnBkX2tleXdvcmRbMl07CisJdWludDhfdCAgbGVuZ3RoOworCXVpbnQ4X3QgIHJldmlzaW9uOworCXVpbnQ4X3QgIGRldmljZV9mbGFnczsKKwl1aW50OF90ICB0ZXJtbmF0aW9uX21lbnVzWzJdOworCXVpbnQ4X3QgIGZpZm9fdGhyZXNob2xkOworCXVpbnQ4X3QgIGVuZF90YWc7CisJdWludDhfdCAgdnBkX2NoZWNrc3VtOworCXVpbnQxNl90IGRlZmF1bHRfdGFyZ2V0X2ZsYWdzOworCXVpbnQxNl90IGRlZmF1bHRfYmlvc19mbGFnczsKKwl1aW50MTZfdCBkZWZhdWx0X2N0cmxfZmxhZ3M7CisJdWludDhfdCAgZGVmYXVsdF9pcnE7CisJdWludDhfdCAgcGNpX2xhdHRpbWU7CisJdWludDhfdCAgbWF4X3RhcmdldDsKKwl1aW50OF90ICBib290X2x1bjsKKwl1aW50MTZfdCBzaWduYXR1cmU7CisJdWludDhfdCAgcmVzZXJ2ZWRfMjsKKwl1aW50OF90ICBjaGVja3N1bTsKKwl1aW50OF90CSByZXNlcnZlZF8zWzRdOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBGbGV4cG9ydCBMb2dpYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRkxYQUREUl9URVJNQ1RMCQkJMHgwCisjZGVmaW5lCQlGTFhfVEVSTUNUTF9FTlNFQ0hJR0gJMHg4CisjZGVmaW5lCQlGTFhfVEVSTUNUTF9FTlNFQ0xPVwkweDQKKyNkZWZpbmUJCUZMWF9URVJNQ1RMX0VOUFJJSElHSAkweDIKKyNkZWZpbmUJCUZMWF9URVJNQ1RMX0VOUFJJTE9XCTB4MQorI2RlZmluZSBGTFhBRERSX1JPTVNUQVRfQ1VSU0VOU0VDVEwJMHgxCisjZGVmaW5lCQlGTFhfUk9NU1RBVF9TRUVDRkcJMHhGMAorI2RlZmluZQkJRkxYX1JPTVNUQVRfRUVDRkcJMHgwRgorI2RlZmluZQkJRkxYX1JPTVNUQVRfU0VFXzkzQzY2CTB4MDAKKyNkZWZpbmUJCUZMWF9ST01TVEFUX1NFRV9OT05FCTB4RjAKKyNkZWZpbmUJCUZMWF9ST01TVEFUX0VFXzUxMng4CTB4MAorI2RlZmluZQkJRkxYX1JPTVNUQVRfRUVfMU1CeDgJMHgxCisjZGVmaW5lCQlGTFhfUk9NU1RBVF9FRV8yTUJ4OAkweDIKKyNkZWZpbmUJCUZMWF9ST01TVEFUX0VFXzRNQng4CTB4MworI2RlZmluZQkJRkxYX1JPTVNUQVRfRUVfMTZNQng4CTB4NAorI2RlZmluZSAJCUNVUlNFTlNFX0VOQgkweDEKKyNkZWZpbmUJRkxYQUREUl9GTEVYU1RBVAkJMHgyCisjZGVmaW5lCQlGTFhfRlNUQVRfQlVTWQkJMHgxCisjZGVmaW5lIEZMWEFERFJfQ1VSUkVOVF9TVEFUCQkweDQKKyNkZWZpbmUJCUZMWF9DU1RBVF9TRUNfSElHSAkweEMwCisjZGVmaW5lCQlGTFhfQ1NUQVRfU0VDX0xPVwkweDMwCisjZGVmaW5lCQlGTFhfQ1NUQVRfUFJJX0hJR0gJMHgwQworI2RlZmluZQkJRkxYX0NTVEFUX1BSSV9MT1cJMHgwMworI2RlZmluZQkJRkxYX0NTVEFUX01BU0sJCTB4MDMKKyNkZWZpbmUJCUZMWF9DU1RBVF9TSElGVAkJMgorI2RlZmluZQkJRkxYX0NTVEFUX09LQVkJCTB4MAorI2RlZmluZQkJRkxYX0NTVEFUX09WRVIJCTB4MQorI2RlZmluZQkJRkxYX0NTVEFUX1VOREVSCQkweDIKKyNkZWZpbmUJCUZMWF9DU1RBVF9JTlZBTElECTB4MworCitpbnQJCWFoZF9yZWFkX3NlZXByb20oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1aW50MTZfdCAqYnVmLAorCQkJCSB1X2ludCBzdGFydF9hZGRyLCB1X2ludCBjb3VudCwgaW50IGJzdHJlYW0pOworCitpbnQJCWFoZF93cml0ZV9zZWVwcm9tKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdWludDE2X3QgKmJ1ZiwKKwkJCQkgIHVfaW50IHN0YXJ0X2FkZHIsIHVfaW50IGNvdW50KTsKK2ludAkJYWhkX3dhaXRfc2VlcHJvbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworaW50CQlhaGRfdmVyaWZ5X3ZwZF9ja3N1bShzdHJ1Y3QgdnBkX2NvbmZpZyAqdnBkKTsKK2ludAkJYWhkX3ZlcmlmeV9ja3N1bShzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgKnNjKTsKK2ludAkJYWhkX2FjcXVpcmVfc2VlcHJvbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwordm9pZAkJYWhkX3JlbGVhc2Vfc2VlcHJvbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTWVzc2FnZSBCdWZmZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKwlNU0dfRkxBR19OT05FCQkJPSAweDAwLAorCU1TR19GTEFHX0VYUEVDVF9QUFJfQlVTRlJFRQk9IDB4MDEsCisJTVNHX0ZMQUdfSVVfUkVRX0NIQU5HRUQJCT0gMHgwMiwKKwlNU0dfRkxBR19FWFBFQ1RfSURFX0JVU0ZSRUUJPSAweDA0LAorCU1TR19GTEFHX0VYUEVDVF9RQVNSRUpfQlVTRlJFRQk9IDB4MDgsCisJTVNHX0ZMQUdfUEFDS0VUSVpFRAkJPSAweDEwCit9IGFoZF9tc2dfZmxhZ3M7CisKK3R5cGVkZWYgZW51bSB7CisJTVNHX1RZUEVfTk9ORQkJCT0gMHgwMCwKKwlNU0dfVFlQRV9JTklUSUFUT1JfTVNHT1VUCT0gMHgwMSwKKwlNU0dfVFlQRV9JTklUSUFUT1JfTVNHSU4JPSAweDAyLAorCU1TR19UWVBFX1RBUkdFVF9NU0dPVVQJCT0gMHgwMywKKwlNU0dfVFlQRV9UQVJHRVRfTVNHSU4JCT0gMHgwNAorfSBhaGRfbXNnX3R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisJTVNHTE9PUF9JTl9QUk9HLAorCU1TR0xPT1BfTVNHQ09NUExFVEUsCisJTVNHTE9PUF9URVJNSU5BVEVECit9IG1zZ19sb29wX3N0YXQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBTb2Z0d2FyZSBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSAqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgYWhkX3N1c3BlbmRfY2hhbm5lbF9zdGF0ZSB7CisJdWludDhfdAlzY3Npc2VxOworCXVpbnQ4X3QJc3hmcmN0bDA7CisJdWludDhfdAlzeGZyY3RsMTsKKwl1aW50OF90CXNpbW9kZTA7CisJdWludDhfdAlzaW1vZGUxOworCXVpbnQ4X3QJc2VsdGltZXI7CisJdWludDhfdAlzZXFjdGw7Cit9OworCitzdHJ1Y3QgYWhkX3N1c3BlbmRfc3RhdGUgeworCXN0cnVjdAlhaGRfc3VzcGVuZF9jaGFubmVsX3N0YXRlIGNoYW5uZWxbMl07CisJdWludDhfdAlvcHRpb25tb2RlOworCXVpbnQ4X3QJZHNjb21tYW5kMDsKKwl1aW50OF90CWRzcGNpc3RhdHVzOworCS8qIGhzbWFpbGJveCAqLworCXVpbnQ4X3QJY3JjY29udHJvbDE7CisJdWludDhfdAlzY2JiYWRkcjsKKwkvKiBIb3N0IGFuZCBzZXF1ZW5jZXIgU0NCIGNvdW50cyAqLworCXVpbnQ4X3QJZGZmX3RocnNoOworCXVpbnQ4X3QJKnNjcmF0Y2hfcmFtOworCXVpbnQ4X3QJKmJ0dDsKK307CisKK3R5cGVkZWYgdm9pZCAoKmFoZF9idXNfaW50cl90KShzdHJ1Y3QgYWhkX3NvZnRjICopOworCit0eXBlZGVmIGVudW0geworCUFIRF9NT0RFX0RGRjAsCisJQUhEX01PREVfREZGMSwKKwlBSERfTU9ERV9DQ0hBTiwKKwlBSERfTU9ERV9TQ1NJLAorCUFIRF9NT0RFX0NGRywKKwlBSERfTU9ERV9VTktOT1dOCit9IGFoZF9tb2RlOworCisjZGVmaW5lIEFIRF9NS19NU0soeCkgKDB4MDEgPDwgKHgpKQorI2RlZmluZSBBSERfTU9ERV9ERkYwX01TSwlBSERfTUtfTVNLKEFIRF9NT0RFX0RGRjApCisjZGVmaW5lIEFIRF9NT0RFX0RGRjFfTVNLCUFIRF9NS19NU0soQUhEX01PREVfREZGMSkKKyNkZWZpbmUgQUhEX01PREVfQ0NIQU5fTVNLCUFIRF9NS19NU0soQUhEX01PREVfQ0NIQU4pCisjZGVmaW5lIEFIRF9NT0RFX1NDU0lfTVNLCUFIRF9NS19NU0soQUhEX01PREVfU0NTSSkKKyNkZWZpbmUgQUhEX01PREVfQ0ZHX01TSwlBSERfTUtfTVNLKEFIRF9NT0RFX0NGRykKKyNkZWZpbmUgQUhEX01PREVfVU5LTk9XTl9NU0sJQUhEX01LX01TSyhBSERfTU9ERV9VTktOT1dOKQorI2RlZmluZSBBSERfTU9ERV9BTllfTVNLICh+MCkKKwordHlwZWRlZiB1aW50OF90IGFoZF9tb2RlX3N0YXRlOworCit0eXBlZGVmIHZvaWQgYWhkX2NhbGxiYWNrX3QgKHZvaWQgKik7CisKK3N0cnVjdCBhaGRfc29mdGMgeworCWJ1c19zcGFjZV90YWdfdCAgICAgICAgICAgdGFnc1syXTsKKwlidXNfc3BhY2VfaGFuZGxlX3QgICAgICAgIGJzaHNbMl07CisjaWZuZGVmIF9fbGludXhfXworCWJ1c19kbWFfdGFnX3QJCSAgYnVmZmVyX2RtYXQ7ICAgLyogZG1hdCBmb3IgYnVmZmVyIEkvTyAqLworI2VuZGlmCisJc3RydWN0IHNjYl9kYXRhCQkgIHNjYl9kYXRhOworCisJc3RydWN0IGhhcmR3YXJlX3NjYgkgKm5leHRfcXVldWVkX2hzY2I7CisKKwkvKgorCSAqIFNDQnMgdGhhdCBoYXZlIGJlZW4gc2VudCB0byB0aGUgY29udHJvbGxlcgorCSAqLworCUxJU1RfSEVBRCgsIHNjYikJICBwZW5kaW5nX3NjYnM7CisKKwkvKgorCSAqIEN1cnJlbnQgcmVnaXN0ZXIgd2luZG93IG1vZGUgaW5mb3JtYXRpb24uCisJICovCisJYWhkX21vZGUJCSAgZHN0X21vZGU7CisJYWhkX21vZGUJCSAgc3JjX21vZGU7CisKKwkvKgorCSAqIFNhdmVkIHJlZ2lzdGVyIHdpbmRvdyBtb2RlIGluZm9ybWF0aW9uCisJICogdXNlZCBmb3IgcmVzdG9yZSBvbiBuZXh0IHVucGF1c2UuCisJICovCisJYWhkX21vZGUJCSAgc2F2ZWRfZHN0X21vZGU7CisJYWhkX21vZGUJCSAgc2F2ZWRfc3JjX21vZGU7CisKKwkvKgorCSAqIFBsYXRmb3JtIHNwZWNpZmljIGRhdGEuCisJICovCisJc3RydWN0IGFoZF9wbGF0Zm9ybV9kYXRhICpwbGF0Zm9ybV9kYXRhOworCisJLyoKKwkgKiBQbGF0Zm9ybSBzcGVjaWZpYyBkZXZpY2UgaW5mb3JtYXRpb24uCisJICovCisJYWhkX2Rldl9zb2Z0Y190CQkgIGRldl9zb2Z0YzsKKworCS8qCisJICogQnVzIHNwZWNpZmljIGRldmljZSBpbmZvcm1hdGlvbi4KKwkgKi8KKwlhaGRfYnVzX2ludHJfdAkJICBidXNfaW50cjsKKworCS8qCisJICogVGFyZ2V0IG1vZGUgcmVsYXRlZCBzdGF0ZSBrZXB0IG9uIGEgcGVyIGVuYWJsZWQgbHVuIGJhc2lzLgorCSAqIFRhcmdldHMgdGhhdCBhcmUgbm90IGVuYWJsZWQgd2lsbCBoYXZlIG51bGwgZW50cmllcy4KKwkgKiBBcyBhbiBpbml0aWF0b3IsIHdlIGtlZXAgb25lIHRhcmdldCBlbnRyeSBmb3Igb3VyIGluaXRpYXRvcgorCSAqIElEIHRvIHN0b3JlIG91ciBzeW5jL3dpZGUgdHJhbnNmZXIgc2V0dGluZ3MuCisJICovCisJc3RydWN0IGFoZF90bW9kZV90c3RhdGUgICplbmFibGVkX3RhcmdldHNbQUhEX05VTV9UQVJHRVRTXTsKKworCS8qCisJICogVGhlIGJsYWNrIGhvbGUgZGV2aWNlIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyByZXF1ZXN0cyBmb3IKKwkgKiBkaXNhYmxlZCBsdW5zIG9uIGVuYWJsZWQgdGFyZ2V0cy4KKwkgKi8KKwlzdHJ1Y3QgYWhkX3Rtb2RlX2xzdGF0ZSAgKmJsYWNrX2hvbGU7CisKKwkvKgorCSAqIERldmljZSBpbnN0YW5jZSBjdXJyZW50bHkgb24gdGhlIGJ1cyBhd2FpdGluZyBhIGNvbnRpbnVlIFRJTworCSAqIGZvciBhIGNvbW1hbmQgdGhhdCB3YXMgbm90IGdpdmVuIHRoZSBkaXNjb25uZWN0IHByaXZlbGVkZ2UuCisJICovCisJc3RydWN0IGFoZF90bW9kZV9sc3RhdGUgICpwZW5kaW5nX2RldmljZTsKKworCS8qCisJICogVGltZXIgaGFuZGxlcyBmb3IgdGltZXIgZHJpdmVuIGNhbGxiYWNrcy4KKwkgKi8KKwlhaGRfdGltZXJfdAkJICByZXNldF90aW1lcjsKKwlhaGRfdGltZXJfdAkJICBzdGF0X3RpbWVyOworCisJLyoKKwkgKiBTdGF0aXN0aWNzLgorCSAqLworI2RlZmluZQlBSERfU1RBVF9VUERBVEVfVVMJMjUwMDAwIC8qIDI1MG1zICovCisjZGVmaW5lCUFIRF9TVEFUX0JVQ0tFVFMJNAorCXVfaW50CQkJICBjbWRjbXBsdF9idWNrZXQ7CisJdWludDMyX3QJCSAgY21kY21wbHRfY291bnRzW0FIRF9TVEFUX0JVQ0tFVFNdOworCXVpbnQzMl90CQkgIGNtZGNtcGx0X3RvdGFsOworCisJLyoKKwkgKiBDYXJkIGNoYXJhY3RlcmlzdGljcworCSAqLworCWFoZF9jaGlwCQkgIGNoaXA7CisJYWhkX2ZlYXR1cmUJCSAgZmVhdHVyZXM7CisJYWhkX2J1ZwkJCSAgYnVnczsKKwlhaGRfZmxhZwkJICBmbGFnczsKKwlzdHJ1Y3Qgc2VlcHJvbV9jb25maWcJICpzZWVwX2NvbmZpZzsKKworCS8qIFZhbHVlcyB0byBzdG9yZSBpbiB0aGUgU0VRQ1RMIHJlZ2lzdGVyIGZvciBwYXVzZSBhbmQgdW5wYXVzZSAqLworCXVpbnQ4X3QJCQkgIHVucGF1c2U7CisJdWludDhfdAkJCSAgcGF1c2U7CisKKwkvKiBDb21tYW5kIFF1ZXVlcyAqLworCXVpbnQxNl90CQkgIHFvdXRmaWZvbmV4dDsKKwl1aW50MTZfdAkJICBxb3V0Zmlmb25leHRfdmFsaWRfdGFnOworCXVpbnQxNl90CQkgIHFpbmZpZm9uZXh0OworCXVpbnQxNl90CQkgIHFpbmZpZm9bQUhEX1NDQl9NQVhdOworCXVpbnQxNl90CQkgKnFvdXRmaWZvOworCisJLyogQ3JpdGljYWwgU2VjdGlvbiBEYXRhICovCisJc3RydWN0IGNzCQkgKmNyaXRpY2FsX3NlY3Rpb25zOworCXVfaW50CQkJICBudW1fY3JpdGljYWxfc2VjdGlvbnM7CisKKwkvKiBCdWZmZXIgZm9yIGhhbmRsaW5nIHBhY2tldGl6ZWQgYml0YnVja2V0LiAqLworCXVpbnQ4X3QJCQkgKm92ZXJydW5fYnVmOworCisJLyogTGlua3MgZm9yIGNoYWluaW5nIHNvZnRjcyAqLworCVRBSUxRX0VOVFJZKGFoZF9zb2Z0YykJICBsaW5rczsKKworCS8qIENoYW5uZWwgTmFtZXMgKCdBJywgJ0InLCBldGMuKSAqLworCWNoYXIJCQkgIGNoYW5uZWw7CisKKwkvKiBJbml0aWF0b3IgQnVzIElEICovCisJdWludDhfdAkJCSAgb3VyX2lkOworCisJLyoKKwkgKiBUYXJnZXQgaW5jb21pbmcgY29tbWFuZCBGSUZPLgorCSAqLworCXN0cnVjdCB0YXJnZXRfY21kCSAqdGFyZ2V0Y21kczsKKwl1aW50OF90CQkJICB0cWluZmlmb25leHQ7CisKKwkvKgorCSAqIENhY2hlZCB2ZXJzb24gb2YgdGhlIGhzX21haWxib3ggc28gd2UgY2FuIGF2b2lkCisJICogcGF1c2luZyB0aGUgc2VxdWVuY2VyIGR1cmluZyBtYWlsYm94IHVwZGF0ZXMuCisJICovCisJdWludDhfdAkJCSAgaHNfbWFpbGJveDsKKworCS8qCisJICogSW5jb21pbmcgYW5kIG91dGdvaW5nIG1lc3NhZ2UgaGFuZGxpbmcuCisJICovCisJdWludDhfdAkJCSAgc2VuZF9tc2dfcGVycm9yOworCWFoZF9tc2dfZmxhZ3MJCSAgbXNnX2ZsYWdzOworCWFoZF9tc2dfdHlwZQkJICBtc2dfdHlwZTsKKwl1aW50OF90CQkJICBtc2dvdXRfYnVmWzEyXTsvKiBNZXNzYWdlIHdlIGFyZSBzZW5kaW5nICovCisJdWludDhfdAkJCSAgbXNnaW5fYnVmWzEyXTsvKiBNZXNzYWdlIHdlIGFyZSByZWNlaXZpbmcgKi8KKwl1X2ludAkJCSAgbXNnb3V0X2xlbjsJLyogTGVuZ3RoIG9mIG1lc3NhZ2UgdG8gc2VuZCAqLworCXVfaW50CQkJICBtc2dvdXRfaW5kZXg7CS8qIEN1cnJlbnQgaW5kZXggaW4gbXNnb3V0ICovCisJdV9pbnQJCQkgIG1zZ2luX2luZGV4OwkvKiBDdXJyZW50IGluZGV4IGluIG1zZ2luICovCisKKwkvKgorCSAqIE1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIGRhdGEgc3RydWN0dXJlcyBzaGFyZWQKKwkgKiBiZXR3ZWVuIHRoZSBzZXF1ZW5jZXIgYW5kIGtlcm5lbC4KKwkgKi8KKwlidXNfZG1hX3RhZ190CQkgIHBhcmVudF9kbWF0OworCWJ1c19kbWFfdGFnX3QJCSAgc2hhcmVkX2RhdGFfZG1hdDsKKwlidXNfZG1hbWFwX3QJCSAgc2hhcmVkX2RhdGFfZG1hbWFwOworCWRtYV9hZGRyX3QJCSAgc2hhcmVkX2RhdGFfYnVzYWRkcjsKKworCS8qIEluZm9ybWF0aW9uIHNhdmVkIHRocm91Z2ggc3VzcGVuZC9yZXN1bWUgY3ljbGVzICovCisJc3RydWN0IGFoZF9zdXNwZW5kX3N0YXRlICBzdXNwZW5kX3N0YXRlOworCisJLyogTnVtYmVyIG9mIGVuYWJsZWQgdGFyZ2V0IG1vZGUgZGV2aWNlIG9uIHRoaXMgY2FyZCAqLworCXVfaW50CQkJICBlbmFibGVkX2x1bnM7CisKKwkvKiBJbml0aWFsaXphdGlvbiBsZXZlbCBvZiB0aGlzIGRhdGEgc3RydWN0dXJlICovCisJdV9pbnQJCQkgIGluaXRfbGV2ZWw7CisKKwkvKiBQQ0kgY2FjaGVsaW5lIHNpemUuICovCisJdV9pbnQJCQkgIHBjaV9jYWNoZXNpemU7CisKKwkvKiBJTyBDZWxsIFBhcmFtZXRlcnMgKi8KKwl1aW50OF90CQkJICBpb2NlbGxfb3B0c1tBSERfTlVNX1BFUl9ERVZfQU5ORVhDT0xTXTsKKworCXVfaW50CQkJICBzdGFja19zaXplOworCXVpbnQxNl90CQkgKnNhdmVkX3N0YWNrOworCisJLyogUGVyLVVuaXQgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gKi8KKwljb25zdCBjaGFyCQkgKmRlc2NyaXB0aW9uOworCWNvbnN0IGNoYXIJCSAqYnVzX2Rlc2NyaXB0aW9uOworCWNoYXIJCQkgKm5hbWU7CisJaW50CQkJICB1bml0OworCisJLyogU2VsZWN0aW9uIFRpbWVyIHNldHRpbmdzICovCisJaW50CQkJICBzZWx0aW1lOworCisJLyoKKwkgKiBJbnRlcnJ1cHQgY29hbGVzY2luZyBzZXR0aW5ncy4KKwkgKi8KKyNkZWZpbmUJQUhEX0lOVF9DT0FMRVNDSU5HX1RJTUVSX0RFRkFVTFQJCTI1MCAvKnVzKi8KKyNkZWZpbmUJQUhEX0lOVF9DT0FMRVNDSU5HX01BWENNRFNfREVGQVVMVAkJMTAKKyNkZWZpbmUJQUhEX0lOVF9DT0FMRVNDSU5HX01BWENNRFNfTUFYCQkJMTI3CisjZGVmaW5lCUFIRF9JTlRfQ09BTEVTQ0lOR19NSU5DTURTX0RFRkFVTFQJCTUKKyNkZWZpbmUJQUhEX0lOVF9DT0FMRVNDSU5HX01JTkNNRFNfTUFYCQkJMTI3CisjZGVmaW5lCUFIRF9JTlRfQ09BTEVTQ0lOR19USFJFU0hPTERfREVGQVVMVAkJMjAwMAorI2RlZmluZQlBSERfSU5UX0NPQUxFU0NJTkdfU1RPUF9USFJFU0hPTERfREVGQVVMVAkxMDAwCisJdV9pbnQJCQkgIGludF9jb2FsZXNjaW5nX3RpbWVyOworCXVfaW50CQkJICBpbnRfY29hbGVzY2luZ19tYXhjbWRzOworCXVfaW50CQkJICBpbnRfY29hbGVzY2luZ19taW5jbWRzOworCXVfaW50CQkJICBpbnRfY29hbGVzY2luZ190aHJlc2hvbGQ7CisJdV9pbnQJCQkgIGludF9jb2FsZXNjaW5nX3N0b3BfdGhyZXNob2xkOworCisJdWludDE2X3QJIAkgIHVzZXJfZGlzY2VuYWJsZTsvKiBEaXNjb25uZWN0aW9uIGFsbG93ZWQgICovCisJdWludDE2X3QJCSAgdXNlcl90YWdlbmFibGU7LyogVGFnZ2VkIFF1ZXVpbmcgYWxsb3dlZCAqLworfTsKKworVEFJTFFfSEVBRChhaGRfc29mdGNfdGFpbHEsIGFoZF9zb2Z0Yyk7CitleHRlcm4gc3RydWN0IGFoZF9zb2Z0Y190YWlscSBhaGRfdGFpbHE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogSU8gQ2VsbCBDb25maWd1cmF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCUFIRF9QUkVDT01QX1NMRVdfSU5ERVgJCQkJCQlcCisgICAgKEFIRF9BTk5FWENPTF9QUkVDT01QX1NMRVcgLSBBSERfQU5ORVhDT0xfUEVSX0RFVjApCisKKyNkZWZpbmUJQUhEX0FNUExJVFVERV9JTkRFWAkJCQkJCVwKKyAgICAoQUhEX0FOTkVYQ09MX0FNUExJVFVERSAtIEFIRF9BTk5FWENPTF9QRVJfREVWMCkKKworI2RlZmluZSBBSERfU0VUX1NMRVdSQVRFKGFoZCwgbmV3X3NsZXcpCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICAgIChhaGQpLT5pb2NlbGxfb3B0c1tBSERfUFJFQ09NUF9TTEVXX0lOREVYXSAmPSB+QUhEX1NMRVdSQVRFX01BU0s7CVwKKyAgICAoYWhkKS0+aW9jZWxsX29wdHNbQUhEX1BSRUNPTVBfU0xFV19JTkRFWF0gfD0JCQlcCisJKCgobmV3X3NsZXcpIDw8IEFIRF9TTEVXUkFURV9TSElGVCkgJiBBSERfU0xFV1JBVEVfTUFTSyk7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUhEX1NFVF9QUkVDT01QKGFoZCwgbmV3X3Bjb21wKQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgICAoYWhkKS0+aW9jZWxsX29wdHNbQUhEX1BSRUNPTVBfU0xFV19JTkRFWF0gJj0gfkFIRF9QUkVDT01QX01BU0s7CVwKKyAgICAoYWhkKS0+aW9jZWxsX29wdHNbQUhEX1BSRUNPTVBfU0xFV19JTkRFWF0gfD0JCQlcCisJKCgobmV3X3Bjb21wKSA8PCBBSERfUFJFQ09NUF9TSElGVCkgJiBBSERfUFJFQ09NUF9NQVNLKTsJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBSERfU0VUX0FNUExJVFVERShhaGQsIG5ld19hbXApCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICAgIChhaGQpLT5pb2NlbGxfb3B0c1tBSERfQU1QTElUVURFX0lOREVYXSAmPSB+QUhEX0FNUExJVFVERV9NQVNLOwlcCisgICAgKGFoZCktPmlvY2VsbF9vcHRzW0FIRF9BTVBMSVRVREVfSU5ERVhdIHw9CQkJCVwKKwkoKChuZXdfYW1wKSA8PCBBSERfQU1QTElUVURFX1NISUZUKSAmIEFIRF9BTVBMSVRVREVfTUFTSyk7CVwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogQWN0aXZlIERldmljZSBJbmZvcm1hdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworCVJPTEVfVU5LTk9XTiwKKwlST0xFX0lOSVRJQVRPUiwKKwlST0xFX1RBUkdFVAorfSByb2xlX3Q7CisKK3N0cnVjdCBhaGRfZGV2aW5mbyB7CisJaW50CSBvdXJfc2NzaWlkOworCWludAkgdGFyZ2V0X29mZnNldDsKKwl1aW50MTZfdCB0YXJnZXRfbWFzazsKKwl1X2ludAkgdGFyZ2V0OworCXVfaW50CSBsdW47CisJY2hhcgkgY2hhbm5lbDsKKwlyb2xlX3QJIHJvbGU7CQkvKgorCQkJCSAqIE9ubHkgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0IGlmIG5vdAorCQkJCSAqIGluIHRoZSBidXNmcmVlIHN0YXRlLgorCQkJCSAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQQ0kgU3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQUhEX1BDSV9JT0FERFIwCVBDSVJfTUFQUwkvKiBJL08gQkFSKi8KKyNkZWZpbmUgQUhEX1BDSV9NRU1BRERSCShQQ0lSX01BUFMgKyA0KQkvKiBNZW1vcnkgQkFSICovCisjZGVmaW5lIEFIRF9QQ0lfSU9BRERSMQkoUENJUl9NQVBTICsgMTIpLyogU2Vjb25kIEkvTyBCQVIgKi8KKwordHlwZWRlZiBpbnQgKGFoZF9kZXZpY2Vfc2V0dXBfdCkoc3RydWN0IGFoZF9zb2Z0YyAqKTsKKworc3RydWN0IGFoZF9wY2lfaWRlbnRpdHkgeworCXVpbnQ2NF90CQkgZnVsbF9pZDsKKwl1aW50NjRfdAkJIGlkX21hc2s7CisJY2hhcgkJCSpuYW1lOworCWFoZF9kZXZpY2Vfc2V0dXBfdAkqc2V0dXA7Cit9OworZXh0ZXJuIHN0cnVjdCBhaGRfcGNpX2lkZW50aXR5IGFoZF9wY2lfaWRlbnRfdGFibGUgW107CitleHRlcm4gY29uc3QgdV9pbnQgYWhkX251bV9wY2lfZGV2czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZML0VJU0EgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBhaWM3NzcwX2lkZW50aXR5IHsKKwl1aW50MzJfdAkJIGZ1bGxfaWQ7CisJdWludDMyX3QJCSBpZF9tYXNrOworCWNoYXIJCQkqbmFtZTsKKwlhaGRfZGV2aWNlX3NldHVwX3QJKnNldHVwOworfTsKK2V4dGVybiBzdHJ1Y3QgYWljNzc3MF9pZGVudGl0eSBhaWM3NzcwX2lkZW50X3RhYmxlIFtdOworZXh0ZXJuIGNvbnN0IGludCBhaGRfbnVtX2FpYzc3NzBfZGV2czsKKworI2RlZmluZSBBSERfRUlTQV9TTE9UX09GRlNFVAkweGMwMAorI2RlZmluZSBBSERfRUlTQV9JT1NJWkUJCTB4MTAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogRnVuY3Rpb24gRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAkJCWFoZF9yZXNldF9jbWRzX3BlbmRpbmcoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3VfaW50CQkJYWhkX2ZpbmRfYnVzeV90Y2woc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0Y2wpOwordm9pZAkJCWFoZF9idXN5X3RjbChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJICAgICB1X2ludCB0Y2wsIHVfaW50IGJ1c3lpZCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfdW5idXN5X3RjbChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHRjbCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3VuYnVzeV90Y2woc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0Y2wpCit7CisJYWhkX2J1c3lfdGNsKGFoZCwgdGNsLCBTQ0JfTElTVF9OVUxMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDSSBGcm9udCBFbmQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0CWFoZF9wY2lfaWRlbnRpdHkgKmFoZF9maW5kX3BjaV9kZXZpY2UoYWhkX2Rldl9zb2Z0Y190KTsKK2ludAkJCSAgYWhkX3BjaV9jb25maWcoc3RydWN0IGFoZF9zb2Z0YyAqLAorCQkJCQkgc3RydWN0IGFoZF9wY2lfaWRlbnRpdHkgKik7CitpbnQJYWhkX3BjaV90ZXN0X3JlZ2lzdGVyX2FjY2VzcyhzdHJ1Y3QgYWhkX3NvZnRjICopOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogU0NCIGFuZCBTQ0IgcXVldWUgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqLworaW50CQlhaGRfcHJvYmVfc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICopOwordm9pZAkJYWhkX3FpbmZpZm9fcmVxdWV1ZV90YWlsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJIHN0cnVjdCBzY2IgKnNjYik7CitpbnQJCWFoZF9tYXRjaF9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IsCisJCQkgICAgICBpbnQgdGFyZ2V0LCBjaGFyIGNoYW5uZWwsIGludCBsdW4sCisJCQkgICAgICB1X2ludCB0YWcsIHJvbGVfdCByb2xlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJbml0aWFsaXphdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBhaGRfc29mdGMJKmFoZF9hbGxvYyh2b2lkICpwbGF0Zm9ybV9hcmcsIGNoYXIgKm5hbWUpOworaW50CQkJIGFoZF9zb2Z0Y19pbml0KHN0cnVjdCBhaGRfc29mdGMgKik7Cit2b2lkCQkJIGFoZF9jb250cm9sbGVyX2luZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBjaGFyICpidWYpOworaW50CQkJIGFoZF9pbml0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitpbnQJCQkgYWhkX2RlZmF1bHRfY29uZmlnKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitpbnQJCQkgYWhkX3BhcnNlX3ZwZGRhdGEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICBzdHJ1Y3QgdnBkX2NvbmZpZyAqdnBkKTsKK2ludAkJCSBhaGRfcGFyc2VfY2ZnZGF0YShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgIHN0cnVjdCBzZWVwcm9tX2NvbmZpZyAqc2MpOwordm9pZAkJCSBhaGRfaW50cl9lbmFibGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgZW5hYmxlKTsKK3ZvaWQJCQkgYWhkX3VwZGF0ZV9jb2FsZXNjaW5nX3ZhbHVlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCQkgICAgICB1X2ludCB0aW1lciwKKwkJCQkJCSAgICAgIHVfaW50IG1heGNtZHMsCisJCQkJCQkgICAgICB1X2ludCBtaW5jbWRzKTsKK3ZvaWQJCQkgYWhkX2VuYWJsZV9jb2FsZXNjaW5nKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgICAgIGludCBlbmFibGUpOwordm9pZAkJCSBhaGRfcGF1c2VfYW5kX2ZsdXNod29yayhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworaW50CQkJIGFoZF9zdXNwZW5kKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7IAoraW50CQkJIGFoZF9yZXN1bWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3ZvaWQJCQkgYWhkX3NvZnRjX2luc2VydChzdHJ1Y3QgYWhkX3NvZnRjICopOworc3RydWN0IGFoZF9zb2Z0YwkqYWhkX2ZpbmRfc29mdGMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3ZvaWQJCQkgYWhkX3NldF91bml0KHN0cnVjdCBhaGRfc29mdGMgKiwgaW50KTsKK3ZvaWQJCQkgYWhkX3NldF9uYW1lKHN0cnVjdCBhaGRfc29mdGMgKiwgY2hhciAqKTsKK3N0cnVjdCBzY2IJCSphaGRfZ2V0X3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IGNvbF9pZHgpOwordm9pZAkJCSBhaGRfZnJlZV9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpOwordm9pZAkJCSBhaGRfYWxsb2Nfc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwordm9pZAkJCSBhaGRfZnJlZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworaW50CQkJIGFoZF9yZXNldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCByZWluaXQpOwordm9pZAkJCSBhaGRfc2h1dGRvd24odm9pZCAqYXJnKTsKK2ludAkJCSBhaGRfd3JpdGVfZmxleHBvcnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgdV9pbnQgYWRkciwgdV9pbnQgdmFsdWUpOworaW50CQkJIGFoZF9yZWFkX2ZsZXhwb3J0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgYWRkciwKKwkJCQkJICAgdWludDhfdCAqdmFsdWUpOworaW50CQkJIGFoZF93YWl0X2ZsZXhwb3J0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogSW50ZXJydXB0IFNlcnZpY2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCQkJYWhkX3BjaV9pbnRyKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Cit2b2lkCQkJYWhkX2NsZWFyX2ludHN0YXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3ZvaWQJCQlhaGRfZmx1c2hfcW91dGZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3ZvaWQJCQlhaGRfcnVuX3FvdXRmaWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCit2b2lkCQkJYWhkX3J1bl90cWluZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCBwYXVzZWQpOworI2VuZGlmCit2b2lkCQkJYWhkX2hhbmRsZV9od2VycmludChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwordm9pZAkJCWFoZF9oYW5kbGVfc2VxaW50KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgaW50c3RhdCk7Cit2b2lkCQkJYWhkX2hhbmRsZV9zY3NpaW50KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgdV9pbnQgaW50c3RhdCk7Cit2b2lkCQkJYWhkX2NsZWFyX2NyaXRpY2FsX3NlY3Rpb24oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVycm9yIFJlY292ZXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgZW51bSB7CisJU0VBUkNIX0NPTVBMRVRFLAorCVNFQVJDSF9DT1VOVCwKKwlTRUFSQ0hfUkVNT1ZFLAorCVNFQVJDSF9QUklOVAorfSBhaGRfc2VhcmNoX2FjdGlvbjsKK2ludAkJCWFoZF9zZWFyY2hfcWluZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCB0YXJnZXQsCisJCQkJCSAgIGNoYXIgY2hhbm5lbCwgaW50IGx1biwgdV9pbnQgdGFnLAorCQkJCQkgICByb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzLAorCQkJCQkgICBhaGRfc2VhcmNoX2FjdGlvbiBhY3Rpb24pOworaW50CQkJYWhkX3NlYXJjaF9kaXNjX2xpc3Qoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgdGFyZ2V0LAorCQkJCQkgICAgIGNoYXIgY2hhbm5lbCwgaW50IGx1biwgdV9pbnQgdGFnLAorCQkJCQkgICAgIGludCBzdG9wX29uX2ZpcnN0LCBpbnQgcmVtb3ZlLAorCQkJCQkgICAgIGludCBzYXZlX3N0YXRlKTsKK3ZvaWQJCQlhaGRfZnJlZXplX2RldnEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpOworaW50CQkJYWhkX3Jlc2V0X2NoYW5uZWwoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBjaGFyIGNoYW5uZWwsCisJCQkJCSAgaW50IGluaXRpYXRlX3Jlc2V0KTsKK2ludAkJCWFoZF9hYm9ydF9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IHRhcmdldCwKKwkJCQkgICAgICAgY2hhciBjaGFubmVsLCBpbnQgbHVuLCB1X2ludCB0YWcsCisJCQkJICAgICAgIHJvbGVfdCByb2xlLCB1aW50MzJfdCBzdGF0dXMpOwordm9pZAkJCWFoZF9yZXN0YXJ0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Cit2b2lkCQkJYWhkX2NsZWFyX2ZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBmaWZvKTsKK3ZvaWQJCQlhaGRfaGFuZGxlX3NjYl9zdGF0dXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgICBzdHJ1Y3Qgc2NiICpzY2IpOwordm9pZAkJCWFoZF9oYW5kbGVfc2NzaV9zdGF0dXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgICAgc3RydWN0IHNjYiAqc2NiKTsKK3ZvaWQJCQlhaGRfY2FsY19yZXNpZHVhbChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgc3RydWN0IHNjYiAqc2NiKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogVXRpbGl0eSBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgYWhkX3BoYXNlX3RhYmxlX2VudHJ5KgorCQkJYWhkX2xvb2t1cF9waGFzZV9lbnRyeShpbnQgcGhhc2UpOwordm9pZAkJCWFoZF9jb21waWxlX2RldmluZm8oc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCQkJCQkgICAgdV9pbnQgb3VyX2lkLCB1X2ludCB0YXJnZXQsCisJCQkJCSAgICB1X2ludCBsdW4sIGNoYXIgY2hhbm5lbCwKKwkJCQkJICAgIHJvbGVfdCByb2xlKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBUcmFuc2ZlciBOZWdvdGlhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCQkJYWhkX2ZpbmRfc3luY3JhdGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCAqcGVyaW9kLAorCQkJCQkgIHVfaW50ICpwcHJfb3B0aW9ucywgdV9pbnQgbWF4c3luYyk7Cit2b2lkCQkJYWhkX3ZhbGlkYXRlX29mZnNldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgICBzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm8sCisJCQkJCSAgICB1X2ludCBwZXJpb2QsIHVfaW50ICpvZmZzZXQsCisJCQkJCSAgICBpbnQgd2lkZSwgcm9sZV90IHJvbGUpOwordm9pZAkJCWFoZF92YWxpZGF0ZV93aWR0aChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgIHN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbywKKwkJCQkJICAgdV9pbnQgKmJ1c193aWR0aCwKKwkJCQkJICAgcm9sZV90IHJvbGUpOworLyoKKyAqIE5lZ290aWF0aW9uIHR5cGVzLiAgVGhlc2UgYXJlIHVzZWQgdG8gcXVhbGlmeSBpZiB3ZSBzaG91bGQgcmVuZWdvdGlhdGUKKyAqIGV2ZW4gaWYgb3VyIGdvYWwgYW5kIGN1cnJlbnQgdHJhbnNwb3J0IHBhcmFtZXRlcnMgYXJlIGlkZW50aWNhbC4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlBSERfTkVHX1RPX0dPQUwsCS8qIFJlbmVnb3RpYXRlIG9ubHkgaWYgZ29hbCBhbmQgY3VyciBkaWZmZXIuICovCisJQUhEX05FR19JRl9OT05fQVNZTkMsCS8qIFJlbmVnb3RpYXRlIHNvIGxvbmcgYXMgZ29hbCBpcyBub24tYXN5bmMuICovCisJQUhEX05FR19BTFdBWVMJCS8qIFJlbmVnb3RpYXQgZXZlbiBpZiBnb2FsIGlzIGFzeW5jLiAqLworfSBhaGRfbmVnX3R5cGU7CitpbnQJCQlhaGRfdXBkYXRlX25lZ19yZXF1ZXN0KHN0cnVjdCBhaGRfc29mdGMqLAorCQkJCQkgICAgICAgc3RydWN0IGFoZF9kZXZpbmZvKiwKKwkJCQkJICAgICAgIHN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlKiwKKwkJCQkJICAgICAgIHN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvKiwKKwkJCQkJICAgICAgIGFoZF9uZWdfdHlwZSk7Cit2b2lkCQkJYWhkX3NldF93aWR0aChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJICAgICAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCQkJCSAgICAgIHVfaW50IHdpZHRoLCB1X2ludCB0eXBlLCBpbnQgcGF1c2VkKTsKK3ZvaWQJCQlhaGRfc2V0X3N5bmNyYXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkJIHVfaW50IHBlcmlvZCwgdV9pbnQgb2Zmc2V0LAorCQkJCQkgdV9pbnQgcHByX29wdGlvbnMsCisJCQkJCSB1X2ludCB0eXBlLCBpbnQgcGF1c2VkKTsKK3R5cGVkZWYgZW51bSB7CisJQUhEX1FVRVVFX05PTkUsCisJQUhEX1FVRVVFX0JBU0lDLAorCUFIRF9RVUVVRV9UQUdHRUQKK30gYWhkX3F1ZXVlX2FsZzsKKwordm9pZAkJCWFoZF9zZXRfdGFncyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQkJICAgICBhaGRfcXVldWVfYWxnIGFsZyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFRhcmdldCBNb2RlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCit2b2lkCQlhaGRfc2VuZF9sc3RhdGVfZXZlbnRzKHN0cnVjdCBhaGRfc29mdGMgKiwKKwkJCQkgICAgICAgc3RydWN0IGFoZF90bW9kZV9sc3RhdGUgKik7Cit2b2lkCQlhaGRfaGFuZGxlX2VuX2x1bihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJICBzdHJ1Y3QgY2FtX3NpbSAqc2ltLCB1bmlvbiBjY2IgKmNjYik7CitjYW1fc3RhdHVzCWFoZF9maW5kX3Rtb2RlX2RldnMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCSAgICBzdHJ1Y3QgY2FtX3NpbSAqc2ltLCB1bmlvbiBjY2IgKmNjYiwKKwkJCQkgICAgc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKip0c3RhdGUsCisJCQkJICAgIHN0cnVjdCBhaGRfdG1vZGVfbHN0YXRlICoqbHN0YXRlLAorCQkJCSAgICBpbnQgbm90Zm91bmRfZmFpbHVyZSk7CisjaWZuZGVmIEFIRF9UTU9ERV9FTkFCTEUKKyNkZWZpbmUgQUhEX1RNT0RFX0VOQUJMRSAwCisjZW5kaWYKKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGVidWcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEFIRF9ERUJVRworZXh0ZXJuIHVpbnQzMl90IGFoZF9kZWJ1ZzsKKyNkZWZpbmUgQUhEX1NIT1dfTUlTQwkJMHgwMDAwMQorI2RlZmluZSBBSERfU0hPV19TRU5TRQkJMHgwMDAwMgorI2RlZmluZSBBSERfU0hPV19SRUNPVkVSWQkweDAwMDA0CisjZGVmaW5lIEFIRF9EVU1QX1NFRVBST00JMHgwMDAwOAorI2RlZmluZSBBSERfU0hPV19URVJNQ1RMCTB4MDAwMTAKKyNkZWZpbmUgQUhEX1NIT1dfTUVNT1JZCQkweDAwMDIwCisjZGVmaW5lIEFIRF9TSE9XX01FU1NBR0VTCTB4MDAwNDAKKyNkZWZpbmUgQUhEX1NIT1dfTU9ERVBUUgkweDAwMDgwCisjZGVmaW5lIEFIRF9TSE9XX1NFTFRPCQkweDAwMTAwCisjZGVmaW5lIEFIRF9TSE9XX0ZJRk9TCQkweDAwMjAwCisjZGVmaW5lIEFIRF9TSE9XX1FGVUxMCQkweDAwNDAwCisjZGVmaW5lCUFIRF9TSE9XX0RWCQkweDAwODAwCisjZGVmaW5lIEFIRF9TSE9XX01BU0tFRF9FUlJPUlMJMHgwMTAwMAorI2RlZmluZSBBSERfU0hPV19RVUVVRQkJMHgwMjAwMAorI2RlZmluZSBBSERfU0hPV19UUUlOCQkweDA0MDAwCisjZGVmaW5lIEFIRF9TSE9XX1NHCQkweDA4MDAwCisjZGVmaW5lIEFIRF9TSE9XX0lOVF9DT0FMRVNDSU5HCTB4MTAwMDAKKyNkZWZpbmUgQUhEX0RFQlVHX1NFUVVFTkNFUgkweDIwMDAwCisjZW5kaWYKK3ZvaWQJCQlhaGRfcHJpbnRfc2NiKHN0cnVjdCBzY2IgKnNjYik7Cit2b2lkCQkJYWhkX3ByaW50X2RldmluZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbyk7Cit2b2lkCQkJYWhkX2R1bXBfc2dsaXN0KHN0cnVjdCBzY2IgKnNjYik7Cit2b2lkCQkJYWhkX2R1bXBfYWxsX2NhcmRzX3N0YXRlKHZvaWQpOwordm9pZAkJCWFoZF9kdW1wX2NhcmRfc3RhdGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK2ludAkJCWFoZF9wcmludF9yZWdpc3RlcihhaGRfcmVnX3BhcnNlX2VudHJ5X3QgKnRhYmxlLAorCQkJCQkgICB1X2ludCBudW1fZW50cmllcywKKwkJCQkJICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICAgdV9pbnQgYWRkcmVzcywKKwkJCQkJICAgdV9pbnQgdmFsdWUsCisJCQkJCSAgIHVfaW50ICpjdXJfY29sdW1uLAorCQkJCQkgICB1X2ludCB3cmFwX3BvaW50KTsKK3ZvaWQJCQlhaGRfZHVtcF9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CisjZW5kaWYgLyogX0FJQzc5WFhfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHgucmVnIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5yZWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhNThlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHgucmVnCkBAIC0wLDAgKzEsMzk1OCBAQAorLyoKKyAqIEFpYzc5eHggcmVnaXN0ZXIgYW5kIHNjcmF0Y2ggcmFtIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NC0yMDAxIEp1c3RpbiBULiBHaWJicy4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIEFkYXB0ZWMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICoKKyAqICRGcmVlQlNEJAorICovCitWRVJTSU9OID0gIiRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5yZWcjNzAgJCIKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm9jZXNzZWQgYnkgdGhlIGFpYzd4eHhfYXNtIHV0aWxpdHkgZm9yIHVzZSBpbiBhc3NlbWJsaW5nCisgKiBmaXJtd2FyZSBmb3IgdGhlIGFpYzc5eHggZmFtaWx5IG9mIFNDU0kgaG9zdCBhZGFwdGVycyBhcyB3ZWxsIGFzIHRvIGdlbmVyYXRlCisgKiBhIEMgaGVhZGVyIGZpbGUgZm9yIHVzZSBpbiB0aGUga2VybmVsIHBvcnRpb24gb2YgdGhlIEFpYzc5eHggZHJpdmVyLgorICovCisKKy8qIFJlZ2lzdGVyIHdpbmRvdyBNb2RlcyAqLworI2RlZmluZSBNX0RGRjAJCTAKKyNkZWZpbmUgTV9ERkYxCQkxCisjZGVmaW5lIE1fQ0NIQU4JCTIKKyNkZWZpbmUgTV9TQ1NJCQkzCisjZGVmaW5lIE1fQ0ZHCQk0CisjZGVmaW5lIE1fRFNUX1NISUZUCTQKKworI2RlZmluZSBNS19NT0RFKHNyYywgZHN0KSAoKHNyYykgfCAoKGRzdCkgPDwgTV9EU1RfU0hJRlQpKQorI2RlZmluZSBTRVRfTU9ERShzcmMsIGRzdCkJCQkJCQlcCisJU0VUX1NSQ19NT0RFCXNyYzsJCQkJCQlcCisJU0VUX0RTVF9NT0RFCWRzdDsJCQkJCQlcCisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfU0VUX01PREVfQlVHKSAhPSAwKSB7CQkJXAorCQltdmkJTUtfTU9ERShzcmMsIGRzdCkgY2FsbCBzZXRfbW9kZV93b3JrX2Fyb3VuZDsJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJbXZpCU1PREVfUFRSLCBNS19NT0RFKHNyYywgZHN0KTsJCQlcCisJfQorCisjZGVmaW5lIFRPR0dMRV9ERkZfTU9ERQkJCQkJCQlcCisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfU0VUX01PREVfQlVHKSAhPSAwKSB7CQkJXAorCQljYWxsCXRvZ2dsZV9kZmZfbW9kZV93b3JrX2Fyb3VuZDsJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQl4b3IJTU9ERV9QVFIsIE1LX01PREUoTV9ERkYxLCBNX0RGRjEpOwkJXAorCX0KKwkKKyNkZWZpbmUgUkVTVE9SRV9NT0RFKG1vZGUpCQkJCQkJXAorCWlmICgoYWhkLT5idWdzICYgQUhEX1NFVF9NT0RFX0JVRykgIT0gMCkgewkJCVwKKwkJbW92CW1vZGUgY2FsbCBzZXRfbW9kZV93b3JrX2Fyb3VuZDsJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQltb3YJTU9ERV9QVFIsIG1vZGU7CQkJCQlcCisJfQorCisjZGVmaW5lIFNFVF9TRVFJTlRDT0RFKGNvZGUpCQkJCQkJXAorCWlmICgoYWhkLT5idWdzICYgQUhEX0lOVENPTExJU0lPTl9CVUcpICE9IDApIHsJCQlcCisJCW12aQljb2RlIGNhbGwgc2V0X3NlcWludF93b3JrX2Fyb3VuZDsJCVwKKwl9IGVsc2UgewkJCQkJCQlcCisJCW12aQlTRVFJTlRDT0RFLCBjb2RlOwkJCQlcCisJfQorCisvKgorICogTW9kZSBQb2ludGVyCisgKiBDb250cm9scyB3aGljaCBvZiB0aGUgNSwgNTEyYnl0ZSwgYWRkcmVzcyBzcGFjZXMgc2hvdWxkIGJlIHVzZWQKKyAqIGFzIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG9mIGFueSByZWdpc3RlciBhY2Nlc3NlcyBpbiBvdXIKKyAqIHJlZ2lzdGVyIHdpbmRvdy4KKyAqLworcmVnaXN0ZXIgTU9ERV9QVFIgeworCWFkZHJlc3MJCQkweDAwMAorCWFjY2Vzc19tb2RlCVJXCisJZmllbGQJRFNUX01PREUJMHg3MAorCWZpZWxkCVNSQ19NT0RFCTB4MDcKKwltb2RlX3BvaW50ZXIKK30KKworY29uc3QgU1JDX01PREVfU0hJRlQJMAorY29uc3QgRFNUX01PREVfU0hJRlQJNAorCisvKgorICogSG9zdCBJbnRlcnJ1cHQgU3RhdHVzCisgKi8KK3JlZ2lzdGVyIElOVFNUQVQgeworCWFkZHJlc3MJCQkweDAwMQorCWFjY2Vzc19tb2RlCVJXCisJZmllbGQJSFdFUlJJTlQJMHg4MAorCWZpZWxkCUJSS0FEUklOVAkweDQwCisJZmllbGQJU1dUTUlOVAkJMHgyMAorCWZpZWxkCVBDSUlOVAkJMHgxMAorCWZpZWxkCVNDU0lJTlQJCTB4MDgKKwlmaWVsZAlTRVFJTlQJCTB4MDQKKwlmaWVsZAlDTURDTVBMVAkweDAyCisJZmllbGQJU1BMVElOVAkJMHgwMQorCW1hc2sJSU5UX1BFTkQgMHhGRgorfQorCisvKgorICogU2VxdWVuY2VyIEludGVycnVwdCBDb2RlCisgKi8KK3JlZ2lzdGVyIFNFUUlOVENPREUgeworCWFkZHJlc3MJCQkweDAwMgorCWFjY2Vzc19tb2RlCVJXCisJZmllbGQgeworCQlOT19TRVFJTlQsCQkJLyogTm8gc2VxaW50IHBlbmRpbmcuICovCisJCUJBRF9QSEFTRSwJCQkvKiB1bmtub3duIHNjc2kgYnVzIHBoYXNlICovCisJCVNFTkRfUkVKRUNULAkJCS8qIHNlbmRpbmcgYSBtZXNzYWdlIHJlamVjdCAqLworCQlQUk9UT19WSU9MQVRJT04sIAkJLyogUHJvdG9jb2wgVmlvbGF0aW9uICovCisJCU5PX01BVENILAkJCS8qIG5vIGNtZCBtYXRjaCBmb3IgcmVjb25uZWN0ICovCisJCUlHTl9XSURFX1JFUywJCQkvKiBDb21wbGV4IElHTiBXaWRlIFJlcyBNc2cgKi8KKwkJUERBVEFfUkVJTklULAkJCS8qCisJCQkJCQkgKiBSZXR1cm5lZCB0byBkYXRhIHBoYXNlCisJCQkJCQkgKiB0aGF0IHJlcXVpcmVzIGRhdGEKKwkJCQkJCSAqIHRyYW5zZmVyIHBvaW50ZXJzIHRvIGJlCisJCQkJCQkgKiByZWNhbGN1bGF0ZWQgZnJvbSB0aGUKKwkJCQkJCSAqIHRyYW5zZmVyIHJlc2lkdWFsLgorCQkJCQkJICovCisJCUhPU1RfTVNHX0xPT1AsCQkJLyoKKwkJCQkJCSAqIFRoZSBidXMgaXMgcmVhZHkgZm9yIHRoZQorCQkJCQkJICogaG9zdCB0byBwZXJmb3JtIGFub3RoZXIKKwkJCQkJCSAqIG1lc3NhZ2UgdHJhbnNhY3Rpb24uICBUaGlzCisJCQkJCQkgKiBtZWNoYW5pc20gaXMgdXNlZCBmb3IgdGhpbmdzCisJCQkJCQkgKiBsaWtlIHN5bmMvd2lkZSBuZWdvdGlhdGlvbgorCQkJCQkJICogdGhhdCByZXF1aXJlIGEga2VybmVsIGJhc2VkCisJCQkJCQkgKiBtZXNzYWdlIHN0YXRlIGVuZ2luZS4KKwkJCQkJCSAqLworCQlCQURfU1RBVFVTLAkJCS8qIEJhZCBzdGF0dXMgZnJvbSB0YXJnZXQgKi8KKwkJREFUQV9PVkVSUlVOLAkJCS8qCisJCQkJCQkgKiBUYXJnZXQgYXR0ZW1wdGVkIHRvIHdyaXRlCisJCQkJCQkgKiBiZXlvbmQgdGhlIGJvdW5kcyBvZiBpdHMKKwkJCQkJCSAqIGNvbW1hbmQuCisJCQkJCQkgKi8KKwkJTUtNU0dfRkFJTEVELAkJCS8qCisJCQkJCQkgKiBUYXJnZXQgY29tcGxldGVkIGNvbW1hbmQKKwkJCQkJCSAqIHdpdGhvdXQgaG9ub3Jpbmcgb3VyIEFUTgorCQkJCQkJICogcmVxdWVzdCB0byBpc3N1ZSBhIG1lc3NhZ2UuIAorCQkJCQkJICovCisJCU1JU1NFRF9CVVNGUkVFLAkJCS8qCisJCQkJCQkgKiBUaGUgc2VxdWVuY2VyIG5ldmVyIHNhdworCQkJCQkJICogdGhlIGJ1cyBnbyBmcmVlIGFmdGVyCisJCQkJCQkgKiBlaXRoZXIgYSBjb21tYW5kIGNvbXBsZXRlCisJCQkJCQkgKiBvciBkaXNjb25uZWN0IG1lc3NhZ2UuCisJCQkJCQkgKi8KKwkJRFVNUF9DQVJEX1NUQVRFLAorCQlJTExFR0FMX1BIQVNFLAorCQlJTlZBTElEX1NFUUlOVCwKKwkJQ0ZHNElTVEFUX0lOVFIsCisJCVNUQVRVU19PVkVSUlVOLAorCQlDRkc0T1ZFUlJVTiwKKwkJRU5URVJJTkdfTk9OUEFDSywKKwkJVEFTS01HTVRfRlVOQ19DT01QTEVURSwJCS8qCisJCQkJCQkgKiBUYXNrIG1hbmFnZW1lbnQgZnVuY3Rpb24KKwkJCQkJCSAqIHJlcXVlc3QgY29tcGxldGVkIHdpdGgKKwkJCQkJCSAqIGFuIGV4cGVjdGVkIGJ1c2ZyZWUuCisJCQkJCQkgKi8KKwkJVEFTS01HTVRfQ01EX0NNUExUX09LQVksCS8qCisJCQkJCQkgKiBBIGNvbW1hbmQgd2l0aCBhIG5vbi16ZXJvCisJCQkJCQkgKiB0YXNrIG1hbmFnZW1lbnQgZnVuY3Rpb24KKwkJCQkJCSAqIGhhcyBjb21wbGV0ZWQgdmlhIHRoZSBub3JtYWwKKwkJCQkJCSAqIGNvbW1hbmQgY29tcGxldGlvbiBtZXRob2QKKwkJCQkJCSAqIGZvciBjb21tYW5kcyB3aXRoIGEgemVybworCQkJCQkJICogdGFzayBtYW5hZ2VtZW50IGZ1bmN0aW9uLgorCQkJCQkJICogVGhpcyBoYXBwZW5zIHdoZW4gYW4gYXR0ZW1wdAorCQkJCQkJICogdG8gYWJvcnQgYSBjb21tYW5kIGxvc2VzCisJCQkJCQkgKiB0aGUgcmFjZSBmb3IgdGhlIGNvbW1hbmQgdG8KKwkJCQkJCSAqIGNvbXBsZXRlIG5vcm1hbGx5LgorCQkJCQkJICovCisJCVRSQUNFUE9JTlQwLAorCQlUUkFDRVBPSU5UMSwKKwkJVFJBQ0VQT0lOVDIsCisJCVRSQUNFUE9JTlQzLAorCQlTQVdfSFdFUlIsCisJCUJBRF9TQ0JfU1RBVFVTCisJfQorfQorCisvKgorICogQ2xlYXIgSG9zdCBJbnRlcnJ1cHQKKyAqLworcmVnaXN0ZXIgQ0xSSU5UIHsKKwlhZGRyZXNzCQkJMHgwMDMKKwlhY2Nlc3NfbW9kZQlXTworCWZpZWxkCUNMUkhXRVJSSU5UCTB4ODAgLyogUmV2IEIgb3IgZ3JlYXRlciAqLworCWZpZWxkCUNMUkJSS0FEUklOVAkweDQwCisJZmllbGQJQ0xSU1dUTUlOVAkweDIwCisJZmllbGQJQ0xSUENJSU5UCTB4MTAKKwlmaWVsZAlDTFJTQ1NJSU5UCTB4MDgKKwlmaWVsZAlDTFJTRVFJTlQJMHgwNAorCWZpZWxkCUNMUkNNRElOVAkweDAyCisJZmllbGQJQ0xSU1BMVElOVAkweDAxCit9CisKKy8qCisgKiBFcnJvciBSZWdpc3RlcgorICovCityZWdpc3RlciBFUlJPUiB7CisJYWRkcmVzcwkJCTB4MDA0CisJYWNjZXNzX21vZGUJUk8KKwlmaWVsZAlDSU9QQVJFUlIJMHg4MAorCWZpZWxkCUNJT0FDQ0VTRkFJTAkweDQwIC8qIFJldiBCIG9yIGdyZWF0ZXIgKi8KKwlmaWVsZAlNUEFSRVJSCQkweDIwCisJZmllbGQJRFBBUkVSUgkJMHgxMAorCWZpZWxkCVNRUEFSRVJSCTB4MDgKKwlmaWVsZAlJTExPUENPREUJMHgwNAorCWZpZWxkCURTQ1RNT1VUCTB4MDIKK30KKworLyoKKyAqIENsZWFyIEVycm9yCisgKi8KK3JlZ2lzdGVyIENMUkVSUiB7CisJYWRkcmVzcwkJCTB4MDA0CisJYWNjZXNzX21vZGUgCVdPCisJZmllbGQJQ0xSQ0lPUEFSRVJSCTB4ODAKKwlmaWVsZAlDTFJDSU9BQ0NFU0ZBSUwJMHg0MCAvKiBSZXYgQiBvciBncmVhdGVyICovCisJZmllbGQJQ0xSTVBBUkVSUgkweDIwCisJZmllbGQJQ0xSRFBBUkVSUgkweDEwCisJZmllbGQJQ0xSU1FQQVJFUlIJMHgwOAorCWZpZWxkCUNMUklMTE9QQ09ERQkweDA0CisJZmllbGQJQ0xSRFNDVE1PVVQJMHgwMgorfQorCisvKgorICogSG9zdCBDb250cm9sIFJlZ2lzdGVyCisgKiBPdmVyYWxsIGhvc3QgY29udHJvbCBvZiB0aGUgZGV2aWNlLgorICovCityZWdpc3RlciBIQ05UUkwgeworCWFkZHJlc3MJCQkweDAwNQorCWFjY2Vzc19tb2RlCVJXCisJZmllbGQJU0VRX1JFU0VUCTB4ODAgLyogUmV2IEIgb3IgZ3JlYXRlciAqLworCWZpZWxkCVBPV1JETgkJMHg0MAorCWZpZWxkCVNXSU5UCQkweDEwCisJZmllbGQJU1dUSU1FUl9TVEFSVF9CCTB4MDggLyogUmV2IEIgb3IgZ3JlYXRlciAqLworCWZpZWxkCVBBVVNFCQkweDA0CisJZmllbGQJSU5URU4JCTB4MDIKKwlmaWVsZAlDSElQUlNUCQkweDAxCisJZmllbGQJQ0hJUFJTVEFDSwkweDAxCit9CisKKy8qCisgKiBIb3N0IE5ldyBTQ0IgUXVldWUgT2Zmc2V0CisgKi8KK3JlZ2lzdGVyIEhOU0NCX1FPRkYgeworCWFkZHJlc3MJCQkweDAwNgorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMgorfQorCisvKgorICogSG9zdCBFbXB0eSBTQ0IgUXVldWUgT2Zmc2V0CisgKi8KK3JlZ2lzdGVyIEhFU0NCX1FPRkYgeworCWFkZHJlc3MJCQkweDAwOAorCWFjY2Vzc19tb2RlCVJXCit9CisKKy8qCisgKiBIb3N0IE1haWxib3gKKyAqLworcmVnaXN0ZXIgSFNfTUFJTEJPWCB7CisJYWRkcmVzcwkJCTB4MDBCCisJYWNjZXNzX21vZGUJUlcKKwltYXNrCUhPU1RfVFFJTlBPUwkweDgwCS8qIEJvdW5kYXJ5IGF0IGVpdGhlciAwIG9yIDEyOCAqLworCW1hc2sJRU5JTlRfQ09BTEVTQ0UJMHg0MAkvKiBQZXJmb3JtIGludGVycnVwdCBjb2FsZXNjaW5nICovCit9CisKKy8qCisgKiBTZXF1ZW5jZXIgSW50ZXJ1cHQgU3RhdHVzCisgKi8KK3JlZ2lzdGVyIFNFUUlOVFNUQVQgeworCWFkZHJlc3MJCQkweDAwQworCWFjY2Vzc19tb2RlCVJPCisJZmllbGQJU0VRX1NXVE1SVE8JMHgxMAorCWZpZWxkCVNFUV9TRVFJTlQJMHgwOAorCWZpZWxkCVNFUV9TQ1NJSU5UCTB4MDQKKwlmaWVsZAlTRVFfUENJSU5UCTB4MDIKKwlmaWVsZAlTRVFfU1BMVElOVAkweDAxCit9CisKKy8qCisgKiBDbGVhciBTRVEgSW50ZXJydXB0CisgKi8KK3JlZ2lzdGVyIENMUlNFUUlOVFNUQVQgeworCWFkZHJlc3MJCQkweDAwQworCWFjY2Vzc19tb2RlCVdPCisJZmllbGQJQ0xSU0VRX1NXVE1SVE8JMHgxMAorCWZpZWxkCUNMUlNFUV9TRVFJTlQJMHgwOAorCWZpZWxkCUNMUlNFUV9TQ1NJSU5UCTB4MDQKKwlmaWVsZAlDTFJTRVFfUENJSU5UCTB4MDIKKwlmaWVsZAlDTFJTRVFfU1BMVElOVAkweDAxCit9CisKKy8qCisgKiBTb2Z0d2FyZSBUaW1lcgorICovCityZWdpc3RlciBTV1RJTUVSIHsKKwlhZGRyZXNzCQkJMHgwMEUKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTIKK30KKworLyoKKyAqIFNFUSBOZXcgU0NCIFF1ZXVlIE9mZnNldAorICovCityZWdpc3RlciBTTlNDQl9RT0ZGIHsKKwlhZGRyZXNzCQkJMHgwMTAKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTIKKwltb2RlcwkJTV9DQ0hBTgorfQorCisvKgorICogU0VRIEVtcHR5IFNDQiBRdWV1ZSBPZmZzZXQKKyAqLworcmVnaXN0ZXIgU0VTQ0JfUU9GRiB7CisJYWRkcmVzcwkJCTB4MDEyCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DQ0hBTgorfQorCisvKgorICogU0VRIERvbmUgU0NCIFF1ZXVlIE9mZnNldAorICovCityZWdpc3RlciBTRFNDQl9RT0ZGIHsKKwlhZGRyZXNzCQkJMHgwMTQKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NDSEFOCisJc2l6ZQkJMgorfQorCisvKgorICogUXVldWUgT2Zmc2V0IENvbnRyb2wgJiBTdGF0dXMKKyAqLworcmVnaXN0ZXIgUU9GRl9DVExTVEEgeworCWFkZHJlc3MJCQkweDAxNgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0NIQU4KKwlmaWVsZAlFTVBUWV9TQ0JfQVZBSUwJMHg4MAorCWZpZWxkCU5FV19TQ0JfQVZBSUwJMHg0MAorCWZpZWxkCVNEU0NCX1JPTExPVlIJMHgyMAorCWZpZWxkCUhTX01BSUxCT1hfQUNUCTB4MTAKKwlmaWVsZAlTQ0JfUVNJWkUJMHgwRiB7CisJCVNDQl9RU0laRV80LAorCQlTQ0JfUVNJWkVfOCwKKwkJU0NCX1FTSVpFXzE2LAorCQlTQ0JfUVNJWkVfMzIsCisJCVNDQl9RU0laRV82NCwKKwkJU0NCX1FTSVpFXzEyOCwKKwkJU0NCX1FTSVpFXzI1NiwKKwkJU0NCX1FTSVpFXzUxMiwKKwkJU0NCX1FTSVpFXzEwMjQsCisJCVNDQl9RU0laRV8yMDQ4LAorCQlTQ0JfUVNJWkVfNDA5NiwKKwkJU0NCX1FTSVpFXzgxOTIsCisJCVNDQl9RU0laRV8xNjM4NAorCX0KK30KKworLyoKKyAqIEludGVycnVwdCBDb250cm9sCisgKi8KK3JlZ2lzdGVyIElOVENUTCB7CisJYWRkcmVzcwkJCTB4MDE4CisJYWNjZXNzX21vZGUJUlcKKwlmaWVsZAlTV1RNSU5UTUFTSwkweDgwCisJZmllbGQJU1dUTUlOVEVOCTB4NDAKKwlmaWVsZAlTV1RJTUVSX1NUQVJUCTB4MjAKKwlmaWVsZAlBVVRPQ0xSQ01ESU5UCTB4MTAKKwlmaWVsZAlQQ0lJTlRFTgkweDA4CisJZmllbGQJU0NTSUlOVEVOCTB4MDQKKwlmaWVsZAlTRVFJTlRFTgkweDAyCisJZmllbGQJU1BMVElOVEVOCTB4MDEKK30KKworLyoKKyAqIERhdGEgRklGTyBDb250cm9sCisgKi8KK3JlZ2lzdGVyIERGQ05UUkwgeworCWFkZHJlc3MJCQkweDAxOQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCisJZmllbGQJUFJFTE9BREVOCTB4ODAKKwlmaWVsZAlTQ1NJRU5XUkRJUwkweDQwCS8qIFJldiBCIG9ubHkuICovCisJZmllbGQJU0NTSUVOCQkweDIwCisJZmllbGQJU0NTSUVOQUNLCTB4MjAKKwlmaWVsZAlIRE1BRU4JCTB4MDgKKwlmaWVsZAlIRE1BRU5BQ0sJMHgwOAorCWZpZWxkCURJUkVDVElPTgkweDA0CisJZmllbGQJRElSRUNUSU9OQUNLCTB4MDQKKwlmaWVsZAlGSUZPRkxVU0gJMHgwMgorCWZpZWxkCUZJRk9GTFVTSEFDSwkweDAyCisJZmllbGQJRElSRUNUSU9ORU4JMHgwMQorfQorCisvKgorICogRGV2aWNlIFNwYWNlIENvbW1hbmQgMAorICovCityZWdpc3RlciBEU0NPTU1BTkQwIHsKKwlhZGRyZXNzCQkJMHgwMTkKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCUNBQ0hFVEhFTgkweDgwCS8qIENhY2hlIFRocmVzaG9sZCBlbmFibGUgKi8KKwlmaWVsZAlEUEFSQ0tFTgkweDQwCS8qIERhdGEgUGFyaXR5IENoZWNrIEVuYWJsZSAqLworCWZpZWxkCU1QQVJDS0VOCTB4MjAJLyogTWVtb3J5IFBhcml0eSBDaGVjayBFbmFibGUgKi8KKwlmaWVsZAlFWFRSRVFMQ0sJMHgxMAkvKiBFeHRlcm5hbCBSZXF1ZXN0IExvY2sgKi8KKwlmaWVsZAlESVNBQkxFX1RXQVRFCTB4MDIJLyogUmV2IEIgb3IgZ3JlYXRlciAqLworCWZpZWxkCUNJT1BBUkNLRU4JMHgwMQkvKiBJbnRlcm5hbCBidXMgcGFyaXR5IGVycm9yIGVuYWJsZSAqLworfQorCisvKgorICogRGF0YSBGSUZPIFN0YXR1cworICovCityZWdpc3RlciBERlNUQVRVUyB7CisJYWRkcmVzcwkJCTB4MDFBCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEKKwlmaWVsZAlQUkVMT0FEX0FWQUlMCQkweDgwCisJZmllbGQJUEtUX1BSRUxPQURfQVZBSUwJMHg0MAorCWZpZWxkCU1SRVFQRU5ECQkweDEwCisJZmllbGQJSERPTkUJCQkweDA4CisJZmllbGQJREZUSFJFU0gJCTB4MDQKKwlmaWVsZAlGSUZPRlVMTAkJMHgwMgorCWZpZWxkCUZJRk9FTVAJCQkweDAxCit9CisKKy8qCisgKiBTL0cgQ2FjaGUgUG9pbnRlcgorICovCityZWdpc3RlciBTR19DQUNIRV9QUkUgeworCWFkZHJlc3MJCQkweDAxQgorCWFjY2Vzc19tb2RlCVdPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCisJZmllbGQJU0dfQUREUl9NQVNLCTB4ZjgKKwlmaWVsZAlPRERfU0VHCQkweDA0CisJZmllbGQJTEFTVF9TRUcJMHgwMgorfQorCityZWdpc3RlciBTR19DQUNIRV9TSEFET1cgeworCWFkZHJlc3MJCQkweDAxQgorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCisJZmllbGQJU0dfQUREUl9NQVNLCTB4ZjgKKwlmaWVsZAlPRERfU0VHCQkweDA0CisJZmllbGQJTEFTVF9TRUcJMHgwMgorCWZpZWxkCUxBU1RfU0VHX0RPTkUJMHgwMQorfQorCisvKgorICogQXJiaXRlciBDb250cm9sCisgKi8KK3JlZ2lzdGVyIEFSQkNUTCB7CisJYWRkcmVzcwkJCTB4MDFCCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlSRVNFVF9IQVJCCTB4ODAKKwlmaWVsZAlSRVRSWV9TV0VOCTB4MDgKKwlmaWVsZAlVU0VfVElNRQkweDA3Cit9CisKKy8qCisgKiBEYXRhIENoYW5uZWwgSG9zdCBBZGRyZXNzCisgKi8KK3JlZ2lzdGVyIEhBRERSIHsKKwlhZGRyZXNzCQkJMHgwNzAKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTgKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEKK30KKworLyoKKyAqIEhvc3QgT3ZlcmxheSBETUEgQWRkcmVzcworICovCityZWdpc3RlciBIT0RNQUFEUiB7CisJYWRkcmVzcwkJCTB4MDcwCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQk4CisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogUENJIFBMTCBEZWxheS4KKyAqLworcmVnaXN0ZXIgUExMREVMQVkgeworCWFkZHJlc3MJCQkweDA3MAorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMQorCW1vZGVzCQlNX0NGRworCWZpZWxkCVNQTElUX0RST1BfUkVRCTB4ODAKK30KKworLyoKKyAqIERhdGEgQ2hhbm5lbCBIb3N0IENvdW50CisgKi8KK3JlZ2lzdGVyIEhDTlQgeworCWFkZHJlc3MJCQkweDA3OAorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorfQorCisvKgorICogSG9zdCBPdmVybGF5IERNQSBDb3VudAorICovCityZWdpc3RlciBIT0RNQUNOVCB7CisJYWRkcmVzcwkJCTB4MDc4CisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogSG9zdCBPdmVybGF5IERNQSBFbmFibGUKKyAqLworcmVnaXN0ZXIgSE9ETUFFTiB7CisJYWRkcmVzcwkJCTB4MDdBCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCit9CisKKy8qCisgKiBTY2F0dGVyL0dhdGhlciBIb3N0IEFkZHJlc3MKKyAqLworcmVnaXN0ZXIgU0dIQUREUiB7CisJYWRkcmVzcwkJCTB4MDdDCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQk4CisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCit9CisKKy8qCisgKiBTQ0IgSG9zdCBBZGRyZXNzCisgKi8KK3JlZ2lzdGVyIFNDQkhBRERSIHsKKwlhZGRyZXNzCQkJMHgwN0MKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTgKKwltb2RlcwkJTV9DQ0hBTgorfQorCisvKgorICogU2NhdHRlci9HYXRoZXIgSG9zdCBDb3VudAorICovCityZWdpc3RlciBTR0hDTlQgeworCWFkZHJlc3MJCQkweDA4NAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCit9CisKKy8qCisgKiBTQ0IgSG9zdCBDb3VudAorICovCityZWdpc3RlciBTQ0JIQ05UIHsKKwlhZGRyZXNzCQkJMHgwODQKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NDSEFOCit9CisKKy8qCisgKiBEYXRhIEZJRk8gVGhyZXNob2xkCisgKi8KK3JlZ2lzdGVyIERGRl9USFJTSCB7CisJYWRkcmVzcwkJCTB4MDg4CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlXUl9ERlRIUlNICTB4NzAgeworCQlXUl9ERlRIUlNIX01JTiwKKwkJV1JfREZUSFJTSF8yNSwKKwkJV1JfREZUSFJTSF81MCwKKwkJV1JfREZUSFJTSF82MywKKwkJV1JfREZUSFJTSF83NSwKKwkJV1JfREZUSFJTSF84NSwKKwkJV1JfREZUSFJTSF85MCwKKwkJV1JfREZUSFJTSF9NQVgKKwl9CisJZmllbGQJUkRfREZUSFJTSAkweDA3IHsKKwkJUkRfREZUSFJTSF9NSU4sCisJCVJEX0RGVEhSU0hfMjUsCisJCVJEX0RGVEhSU0hfNTAsCisJCVJEX0RGVEhSU0hfNjMsCisJCVJEX0RGVEhSU0hfNzUsCisJCVJEX0RGVEhSU0hfODUsCisJCVJEX0RGVEhSU0hfOTAsCisJCVJEX0RGVEhSU0hfTUFYCisJfQorfQorCisvKgorICogUk9NIEFkZHJlc3MKKyAqLworcmVnaXN0ZXIgUk9NQUREUiB7CisJYWRkcmVzcwkJCTB4MDhBCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkzCit9CisKKy8qCisgKiBST00gQ29udHJvbAorICovCityZWdpc3RlciBST01DTlRSTCB7CisJYWRkcmVzcwkJCTB4MDhECisJYWNjZXNzX21vZGUJUlcKKwlmaWVsZAlST01PUAkJMHhFMAorCWZpZWxkCVJPTVNQRAkJMHgxOAorCWZpZWxkCVJFUEVBVAkJMHgwMgorCWZpZWxkCVJEWQkJMHgwMQorfQorCisvKgorICogUk9NIERhdGEKKyAqLworcmVnaXN0ZXIgUk9NREFUQSB7CisJYWRkcmVzcwkJCTB4MDhFCisJYWNjZXNzX21vZGUJUlcKK30KKworLyoKKyAqIERhdGEgQ2hhbm5lbCBSZWNlaXZlIE1lc3NhZ2UgMAorICovCityZWdpc3RlciBEQ0hSWE1TRzAgeworCWFkZHJlc3MJCQkweDA5MAorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCisJZmllbGQJCUNETlVNCTB4RjgKKwlmaWVsZAkJQ0ZOVU0JMHgwNworfQorCisvKgorICogQ01DIFJlY2lldmUgTWVzc2FnZSAwCisgKi8KK3JlZ2lzdGVyIENNQ1JYTVNHMCB7CisJYWRkcmVzcwkJCTB4MDkwCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9DQ0hBTgorCWZpZWxkCQlDRE5VTQkweEY4CisJZmllbGQJCUNGTlVNCTB4MDcKK30KKworLyoKKyAqIE92ZXJsYXkgUmVjaWV2ZSBNZXNzYWdlIDAKKyAqLworcmVnaXN0ZXIgT1ZMWVJYTVNHMCB7CisJYWRkcmVzcwkJCTB4MDkwCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9TQ1NJCisJZmllbGQJCUNETlVNCTB4RjgKKwlmaWVsZAkJQ0ZOVU0JMHgwNworfQorCisvKgorICogUmVsYXhlZCBPcmRlciBFbmFibGUKKyAqLworcmVnaXN0ZXIgUk9FTkFCTEUgeworCWFkZHJlc3MJCQkweDA5MAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJTVNJUk9FTgkJMHgyMAorCWZpZWxkCU9WTFlST0VOCTB4MTAKKwlmaWVsZAlDTUNST0VOCQkweDA4CisJZmllbGQJU0dST0VOCQkweDA0CisJZmllbGQJRENIMVJPRU4JMHgwMgorCWZpZWxkCURDSDBST0VOCTB4MDEKK30KKworLyoKKyAqIERhdGEgQ2hhbm5lbCBSZWNlaXZlIE1lc3NhZ2UgMQorICovCityZWdpc3RlciBEQ0hSWE1TRzEgeworCWFkZHJlc3MJCQkweDA5MQorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCisJZmllbGQJQ0JOVU0JCTB4RkYKK30KKworLyoKKyAqIENNQyBSZWNpZXZlIE1lc3NhZ2UgMQorICovCityZWdpc3RlciBDTUNSWE1TRzEgeworCWFkZHJlc3MJCQkweDA5MQorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fQ0NIQU4KKwlmaWVsZAlDQk5VTQkJMHhGRgorfQorCisvKgorICogT3ZlcmxheSBSZWNpZXZlIE1lc3NhZ2UgMQorICovCityZWdpc3RlciBPVkxZUlhNU0cxIHsKKwlhZGRyZXNzCQkJMHgwOTEKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX1NDU0kKKwlmaWVsZAlDQk5VTQkJMHhGRgorfQorCisvKgorICogTm8gU25vb3AgRW5hYmxlCisgKi8KK3JlZ2lzdGVyIE5TRU5BQkxFIHsKKwlhZGRyZXNzCQkJMHgwOTEKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCU1TSU5TRU4JCTB4MjAKKwlmaWVsZAlPVkxZTlNFTgkweDEwCisJZmllbGQJQ01DTlNFTgkJMHgwOAorCWZpZWxkCVNHTlNFTgkJMHgwNAorCWZpZWxkCURDSDFOU0VOCTB4MDIKKwlmaWVsZAlEQ0gwTlNFTgkweDAxCit9CisKKy8qCisgKiBEYXRhIENoYW5uZWwgUmVjZWl2ZSBNZXNzYWdlIDIKKyAqLworcmVnaXN0ZXIgRENIUlhNU0cyIHsKKwlhZGRyZXNzCQkJMHgwOTIKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCU1JTkRFWAkJMHhGRgorfQorCisvKgorICogQ01DIFJlY2lldmUgTWVzc2FnZSAyCisgKi8KK3JlZ2lzdGVyIENNQ1JYTVNHMiB7CisJYWRkcmVzcwkJCTB4MDkyCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9DQ0hBTgorCWZpZWxkCU1JTkRFWAkJMHhGRgorfQorCisvKgorICogT3ZlcmxheSBSZWNpZXZlIE1lc3NhZ2UgMgorICovCityZWdpc3RlciBPVkxZUlhNU0cyIHsKKwlhZGRyZXNzCQkJMHgwOTIKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX1NDU0kKKwlmaWVsZAlNSU5ERVgJCTB4RkYKK30KKworLyoKKyAqIE91dHN0YW5kaW5nIFNwbGl0IFRyYW5zYWN0aW9ucworICovCityZWdpc3RlciBPU1QgeworCWFkZHJlc3MJCQkweDA5MgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBEYXRhIENoYW5uZWwgUmVjZWl2ZSBNZXNzYWdlIDMKKyAqLworcmVnaXN0ZXIgRENIUlhNU0czIHsKKwlhZGRyZXNzCQkJMHgwOTMKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCU1DTEFTUwkJMHgwRgorfQorCisvKgorICogQ01DIFJlY2lldmUgTWVzc2FnZSAzCisgKi8KK3JlZ2lzdGVyIENNQ1JYTVNHMyB7CisJYWRkcmVzcwkJCTB4MDkzCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9DQ0hBTgorCWZpZWxkCU1DTEFTUwkJMHgwRgorfQorCisvKgorICogT3ZlcmxheSBSZWNpZXZlIE1lc3NhZ2UgMworICovCityZWdpc3RlciBPVkxZUlhNU0czIHsKKwlhZGRyZXNzCQkJMHgwOTMKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX1NDU0kKKwlmaWVsZAlNQ0xBU1MJCTB4MEYKK30KKworLyoKKyAqIFBDSS1YIENvbnRyb2wKKyAqLworcmVnaXN0ZXIgUENJWENUTCB7CisJYWRkcmVzcwkJCTB4MDkzCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlTRVJSUFVMU0UJMHg4MAorCWZpZWxkCVVORVhQU0NJRU4JMHgyMAorCWZpZWxkCVNQTFRTTUFESVMJMHgxMAorCWZpZWxkCVNQTFRTVEFESVMJMHgwOAorCWZpZWxkCVNSU1BEUEVFTgkweDA0CisJZmllbGQJVFNDU0VSUkVOCTB4MDIKKwlmaWVsZAlDTVBBQkNESVMJMHgwMQorfQorCisvKgorICogQ01DIFNlcXVlbmNlciBCeXRlIENvdW50CisgKi8KK3JlZ2lzdGVyIENNQ1NFUUJDTlQgeworCWFkZHJlc3MJCQkweDA5NAorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fQ0NIQU4KK30KKworLyoKKyAqIE92ZXJsYXkgU2VxdWVuY2VyIEJ5dGUgQ291bnQKKyAqLworcmVnaXN0ZXIgT1ZMWVNFUUJDTlQgeworCWFkZHJlc3MJCQkweDA5NAorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogRGF0YSBDaGFubmVsIFNlcXVlbmNlciBCeXRlIENvdW50CisgKi8KK3JlZ2lzdGVyIERDSFNFUUJDTlQgeworCWFkZHJlc3MJCQkweDA5NAorCWFjY2Vzc19tb2RlCVJPCisJc2l6ZQkJMgorCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorfQorCisvKgorICogRGF0YSBDaGFubmVsIFNwbGl0IFN0YXR1cyAwCisgKi8KK3JlZ2lzdGVyIERDSFNQTFRTVEFUMCB7CisJYWRkcmVzcwkJCTB4MDk2CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEKKwlmaWVsZAlTVEFFVEVSTQkweDgwCisJZmllbGQJU0NCQ0VSUgkJMHg0MAorCWZpZWxkCVNDQURFUlIJCTB4MjAKKwlmaWVsZAlTQ0RBVEJVQ0tFVAkweDEwCisJZmllbGQJQ05UTk9UQ01QTFQJMHgwOAorCWZpZWxkCVJYT1ZSVU4JCTB4MDQKKwlmaWVsZAlSWFNDRU1TRwkweDAyCisJZmllbGQJUlhTUExUUlNQCTB4MDEKK30KKworLyoKKyAqIENNQyBTcGxpdCBTdGF0dXMgMAorICovCityZWdpc3RlciBDTUNTUExUU1RBVDAgeworCWFkZHJlc3MJCQkweDA5NgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0NIQU4KKwlmaWVsZAlTVEFFVEVSTQkweDgwCisJZmllbGQJU0NCQ0VSUgkJMHg0MAorCWZpZWxkCVNDQURFUlIJCTB4MjAKKwlmaWVsZAlTQ0RBVEJVQ0tFVAkweDEwCisJZmllbGQJQ05UTk9UQ01QTFQJMHgwOAorCWZpZWxkCVJYT1ZSVU4JCTB4MDQKKwlmaWVsZAlSWFNDRU1TRwkweDAyCisJZmllbGQJUlhTUExUUlNQCTB4MDEKK30KKworLyoKKyAqIE92ZXJsYXkgU3BsaXQgU3RhdHVzIDAKKyAqLworcmVnaXN0ZXIgT1ZMWVNQTFRTVEFUMCB7CisJYWRkcmVzcwkJCTB4MDk2CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCisJZmllbGQJU1RBRVRFUk0JMHg4MAorCWZpZWxkCVNDQkNFUlIJCTB4NDAKKwlmaWVsZAlTQ0FERVJSCQkweDIwCisJZmllbGQJU0NEQVRCVUNLRVQJMHgxMAorCWZpZWxkCUNOVE5PVENNUExUCTB4MDgKKwlmaWVsZAlSWE9WUlVOCQkweDA0CisJZmllbGQJUlhTQ0VNU0cJMHgwMgorCWZpZWxkCVJYU1BMVFJTUAkweDAxCit9CisKKy8qCisgKiBEYXRhIENoYW5uZWwgU3BsaXQgU3RhdHVzIDEKKyAqLworcmVnaXN0ZXIgRENIU1BMVFNUQVQxIHsKKwlhZGRyZXNzCQkJMHgwOTcKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCVJYREFUQUJVQ0tFVAkweDAxCit9CisKKy8qCisgKiBDTUMgU3BsaXQgU3RhdHVzIDEKKyAqLworcmVnaXN0ZXIgQ01DU1BMVFNUQVQxIHsKKwlhZGRyZXNzCQkJMHgwOTcKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NDSEFOCisJZmllbGQJUlhEQVRBQlVDS0VUCTB4MDEKK30KKworLyoKKyAqIE92ZXJsYXkgU3BsaXQgU3RhdHVzIDEKKyAqLworcmVnaXN0ZXIgT1ZMWVNQTFRTVEFUMSB7CisJYWRkcmVzcwkJCTB4MDk3CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCisJZmllbGQJUlhEQVRBQlVDS0VUCTB4MDEKK30KKworLyoKKyAqIFMvRyBSZWNlaXZlIE1lc3NhZ2UgMAorICovCityZWdpc3RlciBTR1JYTVNHMCB7CisJYWRkcmVzcwkJCTB4MDk4CisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEKKwlmaWVsZAkJQ0ROVU0JMHhGOAorCWZpZWxkCQlDRk5VTQkweDA3Cit9CisKKy8qCisgKiBTL0cgUmVjZWl2ZSBNZXNzYWdlIDEKKyAqLworcmVnaXN0ZXIgU0dSWE1TRzEgeworCWFkZHJlc3MJCQkweDA5OQorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCisJZmllbGQJQ0JOVU0JCTB4RkYKK30KKworLyoKKyAqIFMvRyBSZWNlaXZlIE1lc3NhZ2UgMgorICovCityZWdpc3RlciBTR1JYTVNHMiB7CisJYWRkcmVzcwkJCTB4MDlBCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEKKwlmaWVsZAlNSU5ERVgJCTB4RkYKK30KKworLyoKKyAqIFMvRyBSZWNlaXZlIE1lc3NhZ2UgMworICovCityZWdpc3RlciBTR1JYTVNHMyB7CisJYWRkcmVzcwkJCTB4MDlCCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEKKwlmaWVsZAlNQ0xBU1MJCTB4MEYKK30KKworLyoKKyAqIFNsYXZlIFNwbGl0IE91dCBBZGRyZXNzIDAKKyAqLworcmVnaXN0ZXIgU0xWU1BMVE9VVEFEUjAgeworCWFkZHJlc3MJCQkweDA5OAorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fU0NTSQorCWZpZWxkCUxPV0VSX0FERFIJMHg3RgorfQorCisvKgorICogU2xhdmUgU3BsaXQgT3V0IEFkZHJlc3MgMQorICovCityZWdpc3RlciBTTFZTUExUT1VUQURSMSB7CisJYWRkcmVzcwkJCTB4MDk5CisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9TQ1NJCisJZmllbGQJUkVRX0ROVU0JMHhGOAorCWZpZWxkCVJFUV9GTlVNCTB4MDcKK30KKworLyoKKyAqIFNsYXZlIFNwbGl0IE91dCBBZGRyZXNzIDIKKyAqLworcmVnaXN0ZXIgU0xWU1BMVE9VVEFEUjIgeworCWFkZHJlc3MJCQkweDA5QQorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fU0NTSQorCWZpZWxkCVJFUV9CTlVNCTB4RkYKK30KKworLyoKKyAqIFNsYXZlIFNwbGl0IE91dCBBZGRyZXNzIDMKKyAqLworcmVnaXN0ZXIgU0xWU1BMVE9VVEFEUjMgeworCWFkZHJlc3MJCQkweDA5QgorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fU0NTSQorCWZpZWxkCVJMWE9SRAkJMDIwCisJZmllbGQJVEFHX05VTQkJMHgxRgorfQorCisvKgorICogU0cgU2VxdWVuY2VyIEJ5dGUgQ291bnQKKyAqLworcmVnaXN0ZXIgU0dTRVFCQ05UIHsKKwlhZGRyZXNzCQkJMHgwOUMKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorfQorCisvKgorICogU2xhdmUgU3BsaXQgT3V0IEF0dHJpYnV0ZSAwCisgKi8KK3JlZ2lzdGVyIFNMVlNQTFRPVVRBVFRSMCB7CisJYWRkcmVzcwkJCTB4MDlDCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9TQ1NJCisJZmllbGQJTE9XRVJfQkNOVAkweEZGCit9CisKKy8qCisgKiBTbGF2ZSBTcGxpdCBPdXQgQXR0cmlidXRlIDEKKyAqLworcmVnaXN0ZXIgU0xWU1BMVE9VVEFUVFIxIHsKKwlhZGRyZXNzCQkJMHgwOUQKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX1NDU0kKKwlmaWVsZAlDTVBMVF9ETlVNCTB4RjgKKwlmaWVsZAlDTVBMVF9GTlVNCTB4MDcKK30KKworLyoKKyAqIFNsYXZlIFNwbGl0IE91dCBBdHRyaWJ1dGUgMgorICovCityZWdpc3RlciBTTFZTUExUT1VUQVRUUjIgeworCWFkZHJlc3MJCQkweDA5RQorCWFjY2Vzc19tb2RlCVJPCisJc2l6ZQkJMgorCW1vZGVzCQlNX1NDU0kKKwlmaWVsZAlDTVBMVF9CTlVNCTB4RkYKK30KKy8qCisgKiBTL0cgU3BsaXQgU3RhdHVzIDAKKyAqLworcmVnaXN0ZXIgU0dTUExUU1RBVDAgeworCWFkZHJlc3MJCQkweDA5RQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCisJZmllbGQJU1RBRVRFUk0JMHg4MAorCWZpZWxkCVNDQkNFUlIJCTB4NDAKKwlmaWVsZAlTQ0FERVJSCQkweDIwCisJZmllbGQJU0NEQVRCVUNLRVQJMHgxMAorCWZpZWxkCUNOVE5PVENNUExUCTB4MDgKKwlmaWVsZAlSWE9WUlVOCQkweDA0CisJZmllbGQJUlhTQ0VNU0cJMHgwMgorCWZpZWxkCVJYU1BMVFJTUAkweDAxCit9CisKKy8qCisgKiBTL0cgU3BsaXQgU3RhdHVzIDEKKyAqLworcmVnaXN0ZXIgU0dTUExUU1RBVDEgeworCWFkZHJlc3MJCQkweDA5RgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCisJZmllbGQJUlhEQVRBQlVDS0VUCTB4MDEKK30KKworLyoKKyAqIFNwZWNpYWwgRnVuY3Rpb24KKyAqLworcmVnaXN0ZXIgU0ZVTkNUIHsKKwlhZGRyZXNzCQkJMHgwOWYKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCVRFU1RfR1JPVVAJMHhGMAorCWZpZWxkCVRFU1RfTlVNCTB4MEYKK30KKworLyoKKyAqIERhdGEgRklGTyAwIFBDSSBTdGF0dXMgCisgKi8KK3JlZ2lzdGVyIERGMFBDSVNUQVQgeworCWFkZHJlc3MJCQkweDBBMAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRFBFCQkweDgwCisJZmllbGQJU1NFCQkweDQwCisJZmllbGQJUk1BCQkweDIwCisJZmllbGQJUlRBCQkweDEwCisJZmllbGQJU0NBQVBFUlIJMHgwOAorCWZpZWxkCVJEUEVSUgkJMHgwNAorCWZpZWxkCVRXQVRFUlIJCTB4MDIKKwlmaWVsZAlEUFIJCTB4MDEKK30KKworLyoKKyAqIERhdGEgRklGTyAxIFBDSSBTdGF0dXMgCisgKi8KK3JlZ2lzdGVyIERGMVBDSVNUQVQgeworCWFkZHJlc3MJCQkweDBBMQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRFBFCQkweDgwCisJZmllbGQJU1NFCQkweDQwCisJZmllbGQJUk1BCQkweDIwCisJZmllbGQJUlRBCQkweDEwCisJZmllbGQJU0NBQVBFUlIJMHgwOAorCWZpZWxkCVJEUEVSUgkJMHgwNAorCWZpZWxkCVRXQVRFUlIJCTB4MDIKKwlmaWVsZAlEUFIJCTB4MDEKK30KKworLyoKKyAqIFMvRyBQQ0kgU3RhdHVzIAorICovCityZWdpc3RlciBTR1BDSVNUQVQgeworCWFkZHJlc3MJCQkweDBBMgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRFBFCQkweDgwCisJZmllbGQJU1NFCQkweDQwCisJZmllbGQJUk1BCQkweDIwCisJZmllbGQJUlRBCQkweDEwCisJZmllbGQJU0NBQVBFUlIJMHgwOAorCWZpZWxkCVJEUEVSUgkJMHgwNAorCWZpZWxkCURQUgkJMHgwMQorfQorCisvKgorICogQ01DIFBDSSBTdGF0dXMgCisgKi8KK3JlZ2lzdGVyIENNQ1BDSVNUQVQgeworCWFkZHJlc3MJCQkweDBBMworCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRFBFCQkweDgwCisJZmllbGQJU1NFCQkweDQwCisJZmllbGQJUk1BCQkweDIwCisJZmllbGQJUlRBCQkweDEwCisJZmllbGQJU0NBQVBFUlIJMHgwOAorCWZpZWxkCVJEUEVSUgkJMHgwNAorCWZpZWxkCVRXQVRFUlIJCTB4MDIKKwlmaWVsZAlEUFIJCTB4MDEKK30KKworLyoKKyAqIE92ZXJsYXkgUENJIFN0YXR1cyAKKyAqLworcmVnaXN0ZXIgT1ZMWVBDSVNUQVQgeworCWFkZHJlc3MJCQkweDBBNAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRFBFCQkweDgwCisJZmllbGQJU1NFCQkweDQwCisJZmllbGQJUk1BCQkweDIwCisJZmllbGQJUlRBCQkweDEwCisJZmllbGQJU0NBQVBFUlIJMHgwOAorCWZpZWxkCVJEUEVSUgkJMHgwNAorCWZpZWxkCURQUgkJMHgwMQorfQorCisvKgorICogUENJIFN0YXR1cyBmb3IgTVNJIE1hc3RlciBETUEgVHJhbnNmZXIKKyAqLworcmVnaXN0ZXIgTVNJUENJU1RBVCB7CisJYWRkcmVzcwkJCTB4MEE2CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlTU0UJCTB4NDAKKwlmaWVsZAlSTUEJCTB4MjAKKwlmaWVsZAlSVEEJCTB4MTAKKwlmaWVsZAlDTFJQRU5ETVNJCTB4MDgKKwlmaWVsZAlUV0FURVJSCQkweDAyCisJZmllbGQJRFBSCQkweDAxCit9CisKKy8qCisgKiBQQ0kgU3RhdHVzIGZvciBUYXJnZXQKKyAqLworcmVnaXN0ZXIgVEFSR1BDSVNUQVQgeworCWFkZHJlc3MJCQkweDBBNworCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRFBFCQkweDgwCisJZmllbGQJU1NFCQkweDQwCisJZmllbGQJU1RBCQkweDA4CisJZmllbGQJVFdBVEVSUgkJMHgwMgorfQorCisvKgorICogTFEgUGFja2V0IEluCisgKiBUaGUgbGFzdCBMUSBQYWNrZXQgcmVjZWl2ZWQKKyAqLworcmVnaXN0ZXIgTFFJTiB7CisJYWRkcmVzcwkJCTB4MDIwCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyMAorCW1vZGVzCQlNX0RGRjAsIE1fREZGMSwgTV9TQ1NJCit9CisKKy8qCisgKiBTQ0IgVHlwZSBQb2ludGVyCisgKiBTQ0Igb2Zmc2V0IGZvciBUYXJnZXQgTW9kZSBTQ0IgdHlwZSBpbmZvcm1hdGlvbgorICovCityZWdpc3RlciBUWVBFUFRSIHsKKwlhZGRyZXNzCQkJMHgwMjAKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworfQorCisvKgorICogUXVldWUgVGFnIFBvaW50ZXIKKyAqIFNDQiBvZmZzZXQgdG8gdGhlIFR3byBCeXRlIHRhZyBpZGVudGlmaWVyIHVzZWQgZm9yIHRhcmdldCBtb2RlLgorICovCityZWdpc3RlciBUQUdQVFIgeworCWFkZHJlc3MJCQkweDAyMQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBMb2dpY2FsIFVuaXQgTnVtYmVyIFBvaW50ZXIKKyAqIFNDQiBvZmZzZXQgdG8gdGhlIExTQiAobGl0dGxlIGVuZGlhbikgb2YgdGhlIGx1biBmaWVsZC4KKyAqLworcmVnaXN0ZXIgTFVOUFRSIHsKKwlhZGRyZXNzCQkJMHgwMjIKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworfQorCisvKgorICogRGF0YSBMZW5ndGggUG9pbnRlcgorICogU0NCIG9mZnNldCBmb3IgdGhlIDQgYnl0ZSBkYXRhIGxlbmd0aCBmaWVsZCBpbiB0YXJnZXQgbW9kZS4KKyAqLworcmVnaXN0ZXIgREFUQUxFTlBUUiB7CisJYWRkcmVzcwkJCTB4MDIzCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIFN0YXR1cyBMZW5ndGggUG9pbnRlcgorICogU0NCIG9mZnNldCB0byB0aGUgdHdvIGJ5dGUgc3RhdHVzIGZpZWxkIGluIHRhcmdldCBTQ0JzLgorICovCityZWdpc3RlciBTVEFUTEVOUFRSIHsKKwlhZGRyZXNzCQkJMHgwMjQKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworfQorCisvKgorICogQ29tbWFuZCBMZW5ndGggUG9pbnRlcgorICogU2NiIG9mZnNldCBmb3IgdGhlIENEQiBsZW5ndGggZmllbGQgaW4gaW5pdGlhdG9yIFNDQnMuCisgKi8KK3JlZ2lzdGVyIENNRExFTlBUUiB7CisJYWRkcmVzcwkJCTB4MDI1CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIFRhc2sgQXR0cmlidXRlIFBvaW50ZXIKKyAqIFNjYiBvZmZzZXQgZm9yIHRoZSBieXRlIGZpZWxkIHNwZWNpZnlpbmcgdGhlIGF0dHJpYnV0ZSBieXRlCisgKiB0byBiZSB1c2VkIGluIGNvbW1hbmQgcGFja2V0cy4KKyAqLyAKK3JlZ2lzdGVyIEFUVFJQVFIgeworCWFkZHJlc3MJCQkweDAyNgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBUYXNrIE1hbmFnZW1lbnQgRmxhZ3MgUG9pbnRlcgorICogU2NiIG9mZnNldCBmb3IgdGhlIGJ5dGUgZmllbGQgc3BlY2lmeWluZyB0aGUgYXR0cmlidXRlIGZsYWdzCisgKiBieXRlIHRvIGJlIHVzZWQgaW4gY29tbWFuZCBwYWNrZXRzLgorICovIAorcmVnaXN0ZXIgRkxBR1BUUiB7CisJYWRkcmVzcwkJCTB4MDI3CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIENvbW1hbmQgUG9pbnRlcgorICogU2NiIG9mZnNldCBmb3IgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIENEQiBmb3IgaW5pdGlhdG9yIFNDQnMuCisgKi8KK3JlZ2lzdGVyIENNRFBUUiB7CisJYWRkcmVzcwkJCTB4MDI4CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIFF1ZXVlIE5leHQgUG9pbnRlcgorICogU2NiIG9mZnNldCBmb3IgdGhlIDIgYnl0ZSAibmV4dCBzY2IgbGluayIuCisgKi8KK3JlZ2lzdGVyIFFORVhUUFRSIHsKKwlhZGRyZXNzCQkJMHgwMjkKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworfQorCisvKgorICogU0NTSSBJRCBQb2ludGVyCisgKiBTY2Igb2Zmc2V0IHRvIHRoZSB2YWx1ZSB0byBwbGFjZSBpbiB0aGUgU0NTSUlEIHJlZ2lzdGVyCisgKiBkdXJpbmcgdGFyZ2V0IG1vZGUgY29ubmVjdGlvbnMuCisgKi8KK3JlZ2lzdGVyIElEUFRSIHsKKwlhZGRyZXNzCQkJMHgwMkEKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworfQorCisvKgorICogQ29tbWFuZCBBYm9ydGVkIEJ5dGUgUG9pbnRlcgorICogT2Zmc2V0IHRvIHRoZSBTQ0IgZmxhZ3MgZmllbGQgdGhhdCBpbmNsdWRlcyB0aGUKKyAqICJTQ0IgYWJvcnRlZCIgc3RhdHVzIGJpdC4KKyAqLworcmVnaXN0ZXIgQUJSVEJZVEVQVFIgeworCWFkZHJlc3MJCQkweDAyQgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBDb21tYW5kIEFib3J0ZWQgQml0IFBvaW50ZXIKKyAqIEJpdCBvZmZzZXQgaW4gdGhlIFNDQiBmbGFncyBmaWVsZCBmb3IgIlNDQiBhYm9ydGVkIiBzdGF0dXMuCisgKi8KK3JlZ2lzdGVyIEFCUlRCSVRQVFIgeworCWFkZHJlc3MJCQkweDAyQworCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBSZXYgQiBvciBncmVhdGVyLgorICovCityZWdpc3RlciBNQVhDTURCWVRFUyB7CisJYWRkcmVzcwkJCTB4MDJECisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIFJldiBCIG9yIGdyZWF0ZXIuCisgKi8KK3JlZ2lzdGVyIE1BWENNRDJSQ1YgeworCWFkZHJlc3MJCQkweDAyRQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBSZXYgQiBvciBncmVhdGVyLgorICovCityZWdpc3RlciBTSE9SVFRIUkVTSCB7CisJYWRkcmVzcwkJCTB4MDJGCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIExvZ2ljYWwgVW5pdCBOdW1iZXIgTGVuZ3RoCisgKiBUaGUgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIFNDQiBsdW4gZmllbGQuCisgKi8KK3JlZ2lzdGVyIExVTkxFTiB7CisJYWRkcmVzcwkJCTB4MDMwCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwltYXNrCQlJTFVOTEVOCTB4MEYKKwltYXNrCQlUTFVOTEVOCTB4RjAKK30KK2NvbnN0IExVTkxFTl9TSU5HTEVfTEVWRUxfTFVOIDB4RgorCisvKgorICogQ0RCIExpbWl0CisgKiBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBlbWJlZGRlZCBDREIgZmllbGQgaW4gaW5pdGF0b3IgU0NCcy4KKyAqLworcmVnaXN0ZXIgQ0RCTElNSVQgeworCWFkZHJlc3MJCQkweDAzMQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBNYXhpbXVtIENvbW1hbmRzCisgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29tbWFuZHMgdG8gaXNzdWUgZHVyaW5nIGEKKyAqIHNpbmdsZSBwYWNrZXRpemVkIGNvbm5lY3Rpb24uCisgKi8KK3JlZ2lzdGVyIE1BWENNRCB7CisJYWRkcmVzcwkJCTB4MDMyCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIE1heGltdW0gQ29tbWFuZCBDb3VudGVyCisgKiBUaGUgbnVtYmVyIG9mIGNvbW1hbmRzIGFscmVhZHkgc2VudCBkdXJpbmcgdGhpcyBjb25uZWN0aW9uCisgKi8KK3JlZ2lzdGVyIE1BWENNRENOVCB7CisJYWRkcmVzcwkJCTB4MDMzCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIExRIFBhY2tldCBSZXNlcnZlZCBCeXRlcworICogVGhlIGJ5dGVzIHRvIGJlIHNlbnQgaW4gdGhlIGN1cnJlbnRseSByZXNlcnZlZCBmaWxlZHMKKyAqIG9mIGFsbCBMUSBwYWNrZXRzLgorICovCityZWdpc3RlciBMUVJTVkQwMSB7CisJYWRkcmVzcwkJCTB4MDM0CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCit9CityZWdpc3RlciBMUVJTVkQxNiB7CisJYWRkcmVzcwkJCTB4MDM1CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCit9CityZWdpc3RlciBMUVJTVkQxNyB7CisJYWRkcmVzcwkJCTB4MDM2CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCit9CisKKy8qCisgKiBDb21tYW5kIFJlc2VydmVkIDAKKyAqIFRoZSBieXRlIHRvIGJlIHNlbnQgZm9yIHRoZSByZXNlcnZlZCBieXRlIDAgb2YKKyAqIG91dGdvaW5nIGNvbW1hbmQgcGFja2V0cy4KKyAqLworcmVnaXN0ZXIgQ01EUlNWRDAgeworCWFkZHJlc3MJCQkweDAzNworCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBMUSBNYW5hZ2VyIENvbnRyb2wgMAorICovCityZWdpc3RlciBMUUNUTDAgeworCWFkZHJlc3MJCQkweDAzOAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJTFFJVEFSR0NMVAkweEMwCisJZmllbGQJTFFJSU5JVEdDTFQJMHgzMAorCWZpZWxkCUxRMFRBUkdDTFQJMHgwQworCWZpZWxkCUxRMElOSVRHQ0xUCTB4MDMKK30KKworLyoKKyAqIExRIE1hbmFnZXIgQ29udHJvbCAxCisgKi8KK3JlZ2lzdGVyIExRQ1RMMSB7CisJYWRkcmVzcwkJCTB4MDM4CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCVBDSTJQQ0kJCTB4MDQKKwlmaWVsZAlTSU5HTEVDTUQJMHgwMgorCWZpZWxkCUFCT1JUUEVORElORwkweDAxCit9CisKKy8qCisgKiBMUSBNYW5hZ2VyIENvbnRyb2wgMgorICovCityZWdpc3RlciBMUUNUTDIgeworCWFkZHJlc3MJCQkweDAzOQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlMUUlSRVRSWQkweDgwCisJZmllbGQJTFFJQ09OVElOVUUJMHg0MAorCWZpZWxkCUxRSVRPSURMRQkweDIwCisJZmllbGQJTFFJUEFVU0UJMHgxMAorCWZpZWxkCUxRT1JFVFJZCTB4MDgKKwlmaWVsZAlMUU9DT05USU5VRQkweDA0CisJZmllbGQJTFFPVE9JRExFCTB4MDIKKwlmaWVsZAlMUU9QQVVTRQkweDAxCit9CisKKy8qCisgKiBTQ1NJIFJBTSBCSVNUMAorICovCityZWdpc3RlciBTQ1NCSVNUMCB7CisJYWRkcmVzcwkJCTB4MDM5CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlHU0JJU1RFUlIJMHg0MAorCWZpZWxkCUdTQklTVERPTkUJMHgyMAorCWZpZWxkCUdTQklTVFJVTgkweDEwCisJZmllbGQJT1NCSVNURVJSCTB4MDQKKwlmaWVsZAlPU0JJU1RET05FCTB4MDIKKwlmaWVsZAlPU0JJU1RSVU4JMHgwMQorfQorCisvKgorICogU0NTSSBTZXF1ZW5jZSBDb250cm9sMAorICovCityZWdpc3RlciBTQ1NJU0VRMCB7CisJYWRkcmVzcwkJCTB4MDNBCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCVRFTU9ERU8JCTB4ODAKKwlmaWVsZAlFTlNFTE8JCTB4NDAKKwlmaWVsZAlFTkFSQk8JCTB4MjAKKwlmaWVsZAlGT1JDRUJVU0ZSRUUJMHgxMAorCWZpZWxkCVNDU0lSU1RPCTB4MDEKK30KKworLyoKKyAqIFNDU0kgUkFNIEJJU1QgMQorICovCityZWdpc3RlciBTQ1NCSVNUMSB7CisJYWRkcmVzcwkJCTB4MDNBCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlOVEJJU1RFUlIJMHgwNAorCWZpZWxkCU5UQklTVERPTkUJMHgwMgorCWZpZWxkCU5UQklTVFJVTgkweDAxCit9CisKKy8qCisgKiBTQ1NJIFNlcXVlbmNlIENvbnRyb2wgMQorICovCityZWdpc3RlciBTQ1NJU0VRMSB7CisJYWRkcmVzcwkJCTB4MDNCCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCU1BTlVBTENUTAkweDQwCisJZmllbGQJRU5TRUxJCQkweDIwCisJZmllbGQJRU5SU0VMSQkJMHgxMAorCWZpZWxkCU1BTlVBTFAJCTB4MEMKKwlmaWVsZAlFTkFVVE9BVE5QCTB4MDIKKwlmaWVsZAlBTFRTVElNCQkweDAxCit9CisKKy8qCisgKiBTQ1NJIFRyYW5zZmVyIENvbnRyb2wgMAorICovCityZWdpc3RlciBTWEZSQ1RMMCB7CisJYWRkcmVzcwkJCTB4MDNDCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCisJZmllbGQJREZPTgkJMHg4MAorCWZpZWxkCURGUEVYUAkJMHg0MAorCWZpZWxkCUJJT1NDQU5DRUxFTgkweDEwCisJZmllbGQJU1BJT0VOCQkweDA4Cit9CisKKy8qCisgKiBTQ1NJIFRyYW5zZmVyIENvbnRyb2wgMQorICovCityZWdpc3RlciBTWEZSQ1RMMSB7CisJYWRkcmVzcwkJCTB4MDNECisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCisJZmllbGQJQklUQlVDS0VUCTB4ODAKKwlmaWVsZAlFTlNBQ0hLCQkweDQwCisJZmllbGQJRU5TUENISwkJMHgyMAorCWZpZWxkCVNUSU1FU0VMCTB4MTgKKwlmaWVsZAlFTlNUSU1FUgkweDA0CisJZmllbGQJQUNUTkVHRU4JMHgwMgorCWZpZWxkCVNUUFdFTgkJMHgwMQorfQorCisvKgorICogU0NTSSBUcmFuc2ZlciBDb250cm9sIDIKKyAqLworcmVnaXN0ZXIgU1hGUkNUTDIgeworCWFkZHJlc3MJCQkweDAzRQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorCWZpZWxkCUFVVE9SU1RESVMJMHgxMAorCWZpZWxkCUNNRERNQUVOCTB4MDgKKwlmaWVsZAlBU1UJCTB4MDcKK30KKworLyoKKyAqIFNDU0kgQnVzIEluaXRpYXRvciBJRHMKKyAqIEJpdG1hc2sgb2Ygb2JzZXJ2ZWQgaW5pdGlhdG9ycyBvbiB0aGUgYnVzLgorICovCityZWdpc3RlciBCVVNJTklUSUQgeworCWFkZHJlc3MJCQkweDAzQworCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJc2l6ZQkJMgorfQorCisvKgorICogRGF0YSBMZW5ndGggQ291bnRlcnMKKyAqIFBhY2tldCBieXRlIGNvdW50ZXIuCisgKi8KK3JlZ2lzdGVyIERMQ09VTlQgeworCWFkZHJlc3MJCQkweDAzQworCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCisJc2l6ZQkJMworfQorCisvKgorICogRGF0YSBGSUZPIFN0YXR1cworICovCityZWdpc3RlciBERkZTVEFUIHsKKwlhZGRyZXNzCQkJMHgwM0YKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX1NDU0kKKwlmaWVsZAlGSUZPMUZSRUUJMHgyMAorCWZpZWxkCUZJRk8wRlJFRQkweDEwCisJLyoKKwkgKiBPbiB0aGUgQiwgdGhpcyBlbnVtIG9ubHkgd29ya3MKKwkgKiBpbiB0aGUgcmVhZCBkaXJlY3Rpb24uICBGb3Igd3JpdGVzLAorCSAqIHlvdSBtdXN0IHVzZSB0aGUgQiB2ZXJzaW9uIG9mIHRoZQorCSAqIENVUlJGSUZPXzAgZGVmaW5pdGlvbiB3aGljaCBpcyBkZWZpbmVkCisJICogYXMgYSBjb25zdGFudCBvdXRzaWRlIG9mIHRoaXMgcmVnaXN0ZXIKKwkgKiBkZWZpbml0aW9uIHRvIGF2b2lkIGNvbmZ1c2luZyB0aGUKKwkgKiByZWdpc3RlciBwcmV0dHkgcHJpbnRpbmcgY29kZS4KKwkgKi8KKwllbnVtCUNVUlJGSUZPCTB4MDMgeworCQlDVVJSRklGT18wLAorCQlDVVJSRklGT18xLAorCQlDVVJSRklGT19OT05FCTB4MworCX0KK30KKworY29uc3QgQl9DVVJSRklGT18wIDB4MgorCisvKgorICogU0NTSSBCdXMgVGFyZ2V0IElEcworICogQml0bWFzayBvZiBvYnNlcnZlZCB0YXJnZXRzIG9uIHRoZSBidXMuCisgKi8KK3JlZ2lzdGVyIEJVU1RBUkdJRCB7CisJYWRkcmVzcwkJCTB4MDNFCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlzaXplCQkyCit9CisKKy8qCisgKiBTQ1NJIENvbnRyb2wgU2lnbmFsIE91dAorICovCityZWdpc3RlciBTQ1NJU0lHTyB7CisJYWRkcmVzcwkJCTB4MDQwCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCUNETwkJMHg4MAorCWZpZWxkCUlPTwkJMHg0MAorCWZpZWxkCU1TR08JCTB4MjAKKwlmaWVsZAlBVE5PCQkweDEwCisJZmllbGQJU0VMTwkJMHgwOAorCWZpZWxkCUJTWU8JCTB4MDQKKwlmaWVsZAlSRVFPCQkweDAyCisJZmllbGQJQUNLTwkJMHgwMQorLyoKKyAqIFBvc3NpYmxlIHBoYXNlcyB0byB3cml0ZSBpbnRvIFNDU0lTSUcwCisgKi8KKwllbnVtCVBIQVNFX01BU0sgIENET3xJT098TVNHTyB7CisJCVBfREFUQU9VVAkweDAsCisJCVBfREFUQUlOCUlPTywKKwkJUF9EQVRBT1VUX0RUCVBfREFUQU9VVHxNU0dPLAorCQlQX0RBVEFJTl9EVAlQX0RBVEFJTnxNU0dPLAorCQlQX0NPTU1BTkQJQ0RPLAorCQlQX01FU0dPVVQJQ0RPfE1TR08sCisJCVBfU1RBVFVTCUNET3xJT08sCisJCVBfTUVTR0lOCUNET3xJT098TVNHTworCX0KK30KKworcmVnaXN0ZXIgU0NTSVNJR0kgeworCWFkZHJlc3MJCQkweDA0MQorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlDREkJCTB4ODAKKwlmaWVsZAlJT0kJCTB4NDAKKwlmaWVsZAlNU0dJCQkweDIwCisJZmllbGQJQVROSQkJMHgxMAorCWZpZWxkCVNFTEkJCTB4MDgKKwlmaWVsZAlCU1lJCQkweDA0CisJZmllbGQJUkVRSQkJMHgwMgorCWZpZWxkCUFDS0kJCTB4MDEKKy8qCisgKiBQb3NzaWJsZSBwaGFzZXMgaW4gU0NTSVNJR0kKKyAqLworCWVudW0JUEhBU0VfTUFTSyAgQ0RPfElPT3xNU0dPIHsKKwkJUF9EQVRBT1VUCTB4MCwKKwkJUF9EQVRBSU4JSU9PLAorCQlQX0RBVEFPVVRfRFQJUF9EQVRBT1VUfE1TR08sCisJCVBfREFUQUlOX0RUCVBfREFUQUlOfE1TR08sCisJCVBfQ09NTUFORAlDRE8sCisJCVBfTUVTR09VVAlDRE98TVNHTywKKwkJUF9TVEFUVVMJQ0RPfElPTywKKwkJUF9NRVNHSU4JQ0RPfElPT3xNU0dPCisJfQorfQorCisvKgorICogTXVsdGlwbGUgVGFyZ2V0IElEcworICogQml0bWFzayBvZiBpZHMgdG8gcmVzcG9uZCBhcyBhIHRhcmdldC4KKyAqLworcmVnaXN0ZXIgTVVMVEFSR0lEIHsKKwlhZGRyZXNzCQkJMHgwNDAKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCXNpemUJCTIKK30KKworLyoKKyAqIFNDU0kgUGhhc2UKKyAqLworcmVnaXN0ZXIgU0NTSVBIQVNFIHsKKwlhZGRyZXNzCQkJMHgwNDIKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX0RGRjAsIE1fREZGMSwgTV9TQ1NJCisJZmllbGQJU1RBVFVTX1BIQVNFCTB4MjAKKwlmaWVsZAlDT01NQU5EX1BIQVNFCTB4MTAKKwlmaWVsZAlNU0dfSU5fUEhBU0UJMHgwOAorCWZpZWxkCU1TR19PVVRfUEhBU0UJMHgwNAorCWZpZWxkCURBVEFfUEhBU0VfTUFTSwkweDAzIHsKKwkJREFUQV9PVVRfUEhBU0UJMHgwMSwKKwkJREFUQV9JTl9QSEFTRQkweDAyCisJfQorfQorCisvKgorICogU0NTSSBEYXRhIDAgSW1hZ2UKKyAqLworcmVnaXN0ZXIgU0NTSURBVDBfSU1HIHsKKwlhZGRyZXNzCQkJMHgwNDMKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMSwgTV9TQ1NJCit9CisKKy8qCisgKiBTQ1NJIExhdGNoZWQgRGF0YQorICovCityZWdpc3RlciBTQ1NJREFUIHsKKwlhZGRyZXNzCQkJMHgwNDQKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMSwgTV9TQ1NJCisJc2l6ZQkJMgorfQorCisvKgorICogU0NTSSBEYXRhIEJ1cworICovCityZWdpc3RlciBTQ1NJQlVTIHsKKwlhZGRyZXNzCQkJMHgwNDYKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMSwgTV9TQ1NJCisJc2l6ZQkJMgorfQorCisvKgorICogVGFyZ2V0IElEIEluCisgKi8KK3JlZ2lzdGVyIFRBUkdJRElOIHsKKwlhZGRyZXNzCQkJMHgwNDgKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX0RGRjAsIE1fREZGMSwgTV9TQ1NJCisJZmllbGQJQ0xLT1VUCQkweDgwCisJZmllbGQJVEFSR0lECQkweDBGCit9CisKKy8qCisgKiBTZWxlY3Rpb24vUmVzZWxlY3Rpb24gSUQKKyAqIFVwcGVyIGZvdXIgYml0cyBhcmUgdGhlIGRldmljZSBpZC4gIFRoZSBPTkVCSVQgaXMgc2V0IHdoZW4gdGhlIHJlL3NlbGVjdGluZworICogZGV2aWNlIGRpZCBub3Qgc2V0IGl0cyBvd24gSUQuCisgKi8KK3JlZ2lzdGVyIFNFTElEIHsKKwlhZGRyZXNzCQkJMHgwNDkKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMSwgTV9TQ1NJCisJZmllbGQJU0VMSURfTUFTSwkweGYwCisJZmllbGQJT05FQklUCQkweDA4Cit9CisKKy8qCisgKiBTQ1NJIEJsb2NrIENvbnRyb2wKKyAqIENvbnRyb2xzIEJ1cyB0eXBlIGFuZCBjaGFubmVsIHNlbGVjdGlvbi4gIFNFTFdJREUgYWxsb3dzIGZvciB0aGUKKyAqIGNvZXhpc3RlbmNlIG9mIDhiaXQgYW5kIDE2Yml0IGRldmljZXMgb24gYSB3aWRlIGJ1cy4KKyAqLworcmVnaXN0ZXIgU0JMS0NUTCB7CisJYWRkcmVzcwkJCTB4MDRBCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCURJQUdMRURFTgkweDgwCisJZmllbGQJRElBR0xFRE9OCTB4NDAKKwlmaWVsZAlFTkFCNDAJCTB4MDgJLyogTFZEIHRyYW5zY2VpdmVyIGFjdGl2ZSAqLworCWZpZWxkCUVOQUIyMAkJMHgwNAkvKiBTRS9IVkQgdHJhbnNjZWl2ZXIgYWN0aXZlICovCisJZmllbGQJU0VMV0lERQkJMHgwMgorfQorCisvKgorICogT3B0aW9uIE1vZGUKKyAqLworcmVnaXN0ZXIgT1BUSU9OTU9ERSB7CisJYWRkcmVzcwkJCTB4MDRBCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlCSU9TQ0FOQ1RMCQkweDgwCisJZmllbGQJQVVUT0FDS0VOCQkweDQwCisJZmllbGQJQklBU0NBTkNUTAkJMHgyMAorCWZpZWxkCUJVU0ZSRUVSRVYJCTB4MTAKKwlmaWVsZAlFTkRHRk9STUNISwkJMHgwNAorCWZpZWxkCUFVVE9fTVNHT1VUX0RFCQkweDAyCisJbWFzawlPUFRJT05NT0RFX0RFRkFVTFRTCUFVVE9fTVNHT1VUX0RFCit9CisKKy8qCisgKiBTQ1NJIFN0YXR1cyAwCisgKi8KK3JlZ2lzdGVyIFNTVEFUMAl7CisJYWRkcmVzcwkJCTB4MDRCCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCVRBUkdFVAkJMHg4MAkvKiBCb2FyZCBhY3RpbmcgYXMgdGFyZ2V0ICovCisJZmllbGQJU0VMRE8JCTB4NDAJLyogU2VsZWN0aW9uIERvbmUgKi8KKwlmaWVsZAlTRUxESQkJMHgyMAkvKiBCb2FyZCBoYXMgYmVlbiBzZWxlY3RlZCAqLworCWZpZWxkCVNFTElOR08JCTB4MTAJLyogU2VsZWN0aW9uIEluIFByb2dyZXNzICovCisJZmllbGQJSU9FUlIJCTB4MDgJLyogTFZEIFRyYW5jZWl2ZXIgbW9kZSBjaGFuZ2VkICovCisJZmllbGQJT1ZFUlJVTgkJMHgwNAkvKiBTQ1NJIE9mZnNldCBvdmVycnVuIGRldGVjdGVkICovCisJZmllbGQJU1BJT1JEWQkJMHgwMgkvKiBTQ1NJIFBJTyBSZWFkeSAqLworCWZpZWxkCUFSQkRPCQkweDAxCS8qIEFyYml0cmF0aW9uIERvbmUgT3V0ICovCit9CisKKy8qCisgKiBDbGVhciBTQ1NJIEludGVycnVwdCAwCisgKiBXcml0aW5nIGEgMSB0byBhIGJpdCBjbGVhcnMgdGhlIGFzc29jaWF0ZWQgU0NTSSBJbnRlcnJ1cHQgaW4gU1NUQVQwLgorICovCityZWdpc3RlciBDTFJTSU5UMCB7CisJYWRkcmVzcwkJCTB4MDRCCisJYWNjZXNzX21vZGUJV08KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCUNMUlNFTERPCTB4NDAKKwlmaWVsZAlDTFJTRUxESQkweDIwCisJZmllbGQJQ0xSU0VMSU5HTwkweDEwCisJZmllbGQJQ0xSSU9FUlIJMHgwOAorCWZpZWxkCUNMUk9WRVJSVU4JMHgwNAorCWZpZWxkCUNMUlNQSU9SRFkJMHgwMgorCWZpZWxkCUNMUkFSQkRPCTB4MDEKK30KKworLyoKKyAqIFNDU0kgSW50ZXJydXB0IE1vZGUgMAorICogU2V0dGluZyBhbnkgYml0IHdpbGwgZW5hYmxlIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiBpbiBTSU1PREUwIHRvIGludGVycnVwdCB2aWEgdGhlIElSUSBwaW4uCisgKi8KK3JlZ2lzdGVyIFNJTU9ERTAgeworCWFkZHJlc3MJCQkweDA0QgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRU5TRUxETwkJMHg0MAorCWZpZWxkCUVOU0VMREkJCTB4MjAKKwlmaWVsZAlFTlNFTElOR08JMHgxMAorCWZpZWxkCUVOSU9FUlIJCTB4MDgKKwlmaWVsZAlFTk9WRVJSVU4JMHgwNAorCWZpZWxkCUVOU1BJT1JEWQkweDAyCisJZmllbGQJRU5BUkJETwkJMHgwMQorfQorCisvKgorICogU0NTSSBTdGF0dXMgMQorICovCityZWdpc3RlciBTU1RBVDEgeworCWFkZHJlc3MJCQkweDA0QworCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlTRUxUTwkJMHg4MAorCWZpZWxkCUFUTlRBUkcgCTB4NDAKKwlmaWVsZAlTQ1NJUlNUSQkweDIwCisJZmllbGQJUEhBU0VNSVMJMHgxMAorCWZpZWxkCUJVU0ZSRUUJCTB4MDgKKwlmaWVsZAlTQ1NJUEVSUgkweDA0CisJZmllbGQJU1RSQjJGQVNUCTB4MDIKKwlmaWVsZAlSRVFJTklUCQkweDAxCit9CisKKy8qCisgKiBDbGVhciBTQ1NJIEludGVycnVwdCAxCisgKiBXcml0aW5nIGEgMSB0byBhIGJpdCBjbGVhcnMgdGhlIGFzc29jaWF0ZWQgU0NTSSBJbnRlcnJ1cHQgaW4gU1NUQVQxLgorICovCityZWdpc3RlciBDTFJTSU5UMSB7CisJYWRkcmVzcwkJCTB4MDRDCisJYWNjZXNzX21vZGUJV08KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCUNMUlNFTFRJTUVPCTB4ODAKKwlmaWVsZAlDTFJBVE5PCQkweDQwCisJZmllbGQJQ0xSU0NTSVJTVEkJMHgyMAorCWZpZWxkCUNMUkJVU0ZSRUUJMHgwOAorCWZpZWxkCUNMUlNDU0lQRVJSCTB4MDQKKwlmaWVsZAlDTFJTVFJCMkZBU1QJMHgwMgorCWZpZWxkCUNMUlJFUUlOSVQJMHgwMQorfQorCisvKgorICogU0NTSSBTdGF0dXMgMgorICovCityZWdpc3RlciBTU1RBVDIgeworCWFkZHJlc3MJCQkweDA0ZAorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlCVVNGUkVFVElNRQkweGMwIHsKKwkJQlVTRlJFRV9MUU8JMHg0MCwKKwkJQlVTRlJFRV9ERkYwCTB4ODAsCisJCUJVU0ZSRUVfREZGMQkweEMwCisJfQorCWZpZWxkCU5PTlBBQ0tSRVEJMHgyMAorCWZpZWxkCUVYUF9BQ1RJVkUJMHgxMAkvKiBTQ1NJIEV4cGFuZGVyIEFjdGl2ZSAqLworCWZpZWxkCUJTWVgJCTB4MDgJLyogQnVzeSBFeHBhbmRlciAqLworCWZpZWxkCVdJREVfUkVTCTB4MDQJLyogTW9kZXMgMCBhbmQgMSBvbmx5ICovCisJZmllbGQJU0RPTkUJCTB4MDIJLyogTW9kZXMgMCBhbmQgMSBvbmx5ICovCisJZmllbGQJRE1BRE9ORQkJMHgwMQkvKiBNb2RlcyAwIGFuZCAxIG9ubHkgKi8KK30KKworLyoKKyAqIENsZWFyIFNDU0kgSW50ZXJydXB0IDIKKyAqLworcmVnaXN0ZXIgQ0xSU0lOVDIgeworCWFkZHJlc3MJCQkweDA0RAorCWFjY2Vzc19tb2RlCVdPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlDTFJOT05QQUNLUkVRCTB4MjAKKwlmaWVsZAlDTFJXSURFX1JFUwkweDA0CS8qIE1vZGVzIDAgYW5kIDEgb25seSAqLworCWZpZWxkCUNMUlNET05FCTB4MDIJLyogTW9kZXMgMCBhbmQgMSBvbmx5ICovCisJZmllbGQJQ0xSRE1BRE9ORQkweDAxCS8qIE1vZGVzIDAgYW5kIDEgb25seSAqLworfQorCisvKgorICogU0NTSSBJbnRlcnJ1cHQgTW9kZSAyCisgKi8KK3JlZ2lzdGVyIFNJTU9ERTIgeworCWFkZHJlc3MJCQkweDA0RAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRU5XSURFX1JFUwkweDA0CisJZmllbGQJRU5TRE9ORQkJMHgwMgorCWZpZWxkCUVORE1BRE9ORQkweDAxCit9CisKKy8qCisgKiBQaHlzaWNhbCBFcnJvciBEaWFnbm9zaXMKKyAqLworcmVnaXN0ZXIgUEVSUkRJQUcgeworCWFkZHJlc3MJCQkweDA0RQorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlISVpFUk8JCTB4ODAKKwlmaWVsZAlISVBFUlIJCTB4NDAKKwlmaWVsZAlQUkVWUEhBU0UJMHgyMAorCWZpZWxkCVBBUklUWUVSUgkweDEwCisJZmllbGQJQUlQRVJSCQkweDA4CisJZmllbGQJQ1JDRVJSCQkweDA0CisJZmllbGQJREdGT1JNRVJSCTB4MDIKKwlmaWVsZAlEVEVSUgkJMHgwMQorfQorCisvKgorICogTFFJIE1hbmFnZXIgQ3VycmVudCBTdGF0ZQorICovCityZWdpc3RlciBMUUlTVEFURSB7CisJYWRkcmVzcwkJCTB4MDRFCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIFNDU0kgT2Zmc2V0IENvdW50CisgKi8KK3JlZ2lzdGVyIFNPRkZDTlQgeworCWFkZHJlc3MJCQkweDA0RgorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKK30KKworLyoKKyAqIExRTyBNYW5hZ2VyIEN1cnJlbnQgU3RhdGUKKyAqLworcmVnaXN0ZXIgTFFPU1RBVEUgeworCWFkZHJlc3MJCQkweDA0RgorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBMUUkgTWFuYWdlciBTdGF0dXMKKyAqLworcmVnaXN0ZXIgTFFJU1RBVDAgeworCWFkZHJlc3MJCQkweDA1MAorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlMUUlBVE5RQVMJMHgyMAorCWZpZWxkCUxRSUNSQ1QxCTB4MTAKKwlmaWVsZAlMUUlDUkNUMgkweDA4CisJZmllbGQJTFFJQkFETFFUCTB4MDQKKwlmaWVsZAlMUUlBVE5MUQkweDAyCisJZmllbGQJTFFJQVROQ01ECTB4MDEKK30KKworLyoKKyAqIENsZWFyIExRSSBJbnRlcnJ1cHRzIDAKKyAqLworcmVnaXN0ZXIgQ0xSTFFJSU5UMCB7CisJYWRkcmVzcwkJCTB4MDUwCisJYWNjZXNzX21vZGUJV08KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCUNMUkxRSUFUTlFBUwkweDIwCisJZmllbGQJQ0xSTFFJQ1JDVDEJMHgxMAorCWZpZWxkCUNMUkxRSUNSQ1QyCTB4MDgKKwlmaWVsZAlDTFJMUUlCQURMUVQJMHgwNAorCWZpZWxkCUNMUkxRSUFUTkxRCTB4MDIKKwlmaWVsZAlDTFJMUUlBVE5DTUQJMHgwMQorfQorCisvKgorICogTFFJIE1hbmFnZXIgSW50ZXJydXB0IE1vZGUgMAorICovCityZWdpc3RlciBMUUlNT0RFMCB7CisJYWRkcmVzcwkJCTB4MDUwCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlFTkxRSUFUTlFBU0sJMHgyMAorCWZpZWxkCUVOTFFJQ1JDVDEJMHgxMAorCWZpZWxkCUVOTFFJQ1JDVDIJMHgwOAorCWZpZWxkCUVOTFFJQkFETFFUCTB4MDQKKwlmaWVsZAlFTkxRSUFUTkxRCTB4MDIKKwlmaWVsZAlFTkxRSUFUTkNNRAkweDAxCit9CisKKy8qCisgKiBMUUkgTWFuYWdlciBTdGF0dXMgMQorICovCityZWdpc3RlciBMUUlTVEFUMSB7CisJYWRkcmVzcwkJCTB4MDUxCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCUxRSVBIQVNFX0xRCTB4ODAKKwlmaWVsZAlMUUlQSEFTRV9OTFEJMHg0MAorCWZpZWxkCUxRSUFCT1JUCTB4MjAKKwlmaWVsZAlMUUlDUkNJX0xRCTB4MTAKKwlmaWVsZAlMUUlDUkNJX05MUQkweDA4CisJZmllbGQJTFFJQkFETFFJCTB4MDQKKwlmaWVsZAlMUUlPVkVSSV9MUQkweDAyCisJZmllbGQJTFFJT1ZFUklfTkxRCTB4MDEKK30KKworLyoKKyAqIENsZWFyIExRSSBNYW5hZ2VyIEludGVycnVwdHMxCisgKi8KK3JlZ2lzdGVyIENMUkxRSUlOVDEgeworCWFkZHJlc3MJCQkweDA1MQorCWFjY2Vzc19tb2RlCVdPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlDTFJMUUlQSEFTRV9MUQkweDgwCisJZmllbGQJQ0xSTFFJUEhBU0VfTkxRCTB4NDAKKwlmaWVsZAlDTFJMSVFBQk9SVAkweDIwCisJZmllbGQJQ0xSTFFJQ1JDSV9MUQkweDEwCisJZmllbGQJQ0xSTFFJQ1JDSV9OTFEJMHgwOAorCWZpZWxkCUNMUkxRSUJBRExRSQkweDA0CisJZmllbGQJQ0xSTFFJT1ZFUklfTFEJMHgwMgorCWZpZWxkCUNMUkxRSU9WRVJJX05MUQkweDAxCit9CisKKy8qCisgKiBMUUkgTWFuYWdlciBJbnRlcnJ1cHQgTW9kZSAxCisgKi8KK3JlZ2lzdGVyIExRSU1PREUxIHsKKwlhZGRyZXNzCQkJMHgwNTEKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCUVOTFFJUEhBU0VfTFEJMHg4MAkvKiBMUUlQSEFTRTEgKi8KKwlmaWVsZAlFTkxRSVBIQVNFX05MUQkweDQwCS8qIExRSVBIQVNFMiAqLworCWZpZWxkCUVOTElRQUJPUlQJMHgyMAorCWZpZWxkCUVOTFFJQ1JDSV9MUQkweDEwCS8qIExRSUNSQ0kxICovCisJZmllbGQJRU5MUUlDUkNJX05MUQkweDA4CS8qIExRSUNSQ0kyICovCisJZmllbGQJRU5MUUlCQURMUUkJMHgwNAorCWZpZWxkCUVOTFFJT1ZFUklfTFEJMHgwMgkvKiBMUUlPVkVSSTEgKi8KKwlmaWVsZAlFTkxRSU9WRVJJX05MUQkweDAxCS8qIExRSU9WRVJJMiAqLworfQorCisvKgorICogTFFJIE1hbmFnZXIgU3RhdHVzIDIKKyAqLworcmVnaXN0ZXIgTFFJU1RBVDIgeworCWFkZHJlc3MJCQkweDA1MgorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlQQUNLRVRJWkVECTB4ODAKKwlmaWVsZAlMUUlQSEFTRV9PVVRQS1QJMHg0MAorCWZpZWxkCUxRSVdPUktPTkxRCTB4MjAKKwlmaWVsZAlMUUlXQUlURklGTwkweDEwCisJZmllbGQJTFFJU1RPUFBLVAkweDA4CisJZmllbGQJTFFJU1RPUExRCTB4MDQKKwlmaWVsZAlMUUlTVE9QQ01ECTB4MDIKKwlmaWVsZAlMUUlHU0FWQUlMCTB4MDEKK30KKworLyoKKyAqIFNDU0kgU3RhdHVzIDMKKyAqLworcmVnaXN0ZXIgU1NUQVQzIHsKKwlhZGRyZXNzCQkJMHgwNTMKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX0RGRjAsIE1fREZGMSwgTV9TQ1NJCisJZmllbGQJTlRSQU1QRVJSCTB4MDIKKwlmaWVsZAlPU1JBTVBFUlIJMHgwMQorfQorCisvKgorICogQ2xlYXIgU0NTSSBTdGF0dXMgMworICovCityZWdpc3RlciBDTFJTSU5UMyB7CisJYWRkcmVzcwkJCTB4MDUzCisJYWNjZXNzX21vZGUJV08KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCUNMUk5UUkFNUEVSUgkweDAyCisJZmllbGQJQ0xST1NSQU1QRVJSCTB4MDEKK30KKworLyoKKyAqIFNDU0kgSW50ZXJydXB0IE1vZGUgMworICovCityZWdpc3RlciBTSU1PREUzIHsKKwlhZGRyZXNzCQkJMHgwNTMKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCUVOTlRSQU1QRVJSCTB4MDIKKwlmaWVsZAlFTk9TUkFNUEVSUgkweDAxCit9CisKKy8qCisgKiBMUU8gTWFuYWdlciBTdGF0dXMgMAorICovCityZWdpc3RlciBMUU9TVEFUMCB7CisJYWRkcmVzcwkJCTB4MDU0CisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCUxRT1RBUkdTQ0JQRVJSCTB4MTAKKwlmaWVsZAlMUU9TVE9QVDIJMHgwOAorCWZpZWxkCUxRT0FUTkxRCTB4MDQKKwlmaWVsZAlMUU9BVE5QS1QJMHgwMgorCWZpZWxkCUxRT1RDUkMJCTB4MDEKK30KKworLyoKKyAqIENsZWFyIExRTyBNYW5hZ2VyIGludGVycnVwdCAwCisgKi8KK3JlZ2lzdGVyIENMUkxRT0lOVDAgeworCWFkZHJlc3MJCQkweDA1NAorCWFjY2Vzc19tb2RlCVdPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlDTFJMUU9UQVJHU0NCUEVSUgkweDEwCisJZmllbGQJQ0xSTFFPU1RPUFQyCQkweDA4CisJZmllbGQJQ0xSTFFPQVROTFEJCTB4MDQKKwlmaWVsZAlDTFJMUU9BVE5QS1QJCTB4MDIKKwlmaWVsZAlDTFJMUU9UQ1JDCQkweDAxCit9CisKKy8qCisgKiBMUU8gTWFuYWdlciBJbnRlcnJ1cHQgTW9kZSAwCisgKi8KK3JlZ2lzdGVyIExRT01PREUwIHsKKwlhZGRyZXNzCQkJMHgwNTQKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCUVOTFFPVEFSR1NDQlBFUlIJMHgxMAorCWZpZWxkCUVOTFFPU1RPUFQyCQkweDA4CisJZmllbGQJRU5MUU9BVE5MUQkJMHgwNAorCWZpZWxkCUVOTFFPQVROUEtUCQkweDAyCisJZmllbGQJRU5MUU9UQ1JDCQkweDAxCit9CisKKy8qCisgKiBMUU8gTWFuYWdlciBTdGF0dXMgMQorICovCityZWdpc3RlciBMUU9TVEFUMSB7CisJYWRkcmVzcwkJCTB4MDU1CisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCUxRT0lOSVRTQ0JQRVJSCTB4MTAKKwlmaWVsZAlMUU9TVE9QSTIJMHgwOAorCWZpZWxkCUxRT0JBRFFBUwkweDA0CisJZmllbGQJTFFPQlVTRlJFRQkweDAyCisJZmllbGQJTFFPUEhBQ0hHSU5QS1QJMHgwMQorfQorCisvKgorICogQ2xlYXIgTE9RIEludGVycnVwdCAxCisgKi8KK3JlZ2lzdGVyIENMUkxRT0lOVDEgeworCWFkZHJlc3MJCQkweDA1NQorCWFjY2Vzc19tb2RlCVdPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlDTFJMUU9JTklUU0NCUEVSUgkweDEwCisJZmllbGQJQ0xSTFFPU1RPUEkyCQkweDA4CisJZmllbGQJQ0xSTFFPQkFEUUFTCQkweDA0CisJZmllbGQJQ0xSTFFPQlVTRlJFRQkJMHgwMgorCWZpZWxkCUNMUkxRT1BIQUNIR0lOUEtUCTB4MDEKK30KKworLyoKKyAqIExRTyBNYW5hZ2VyIEludGVycnVwdCBNb2RlIDEKKyAqLworcmVnaXN0ZXIgTFFPTU9ERTEgeworCWFkZHJlc3MJCQkweDA1NQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRU5MUU9JTklUU0NCUEVSUgkweDEwCisJZmllbGQJRU5MUU9TVE9QSTIJCTB4MDgKKwlmaWVsZAlFTkxRT0JBRFFBUwkJMHgwNAorCWZpZWxkCUVOTFFPQlVTRlJFRQkJMHgwMgorCWZpZWxkCUVOTFFPUEhBQ0hHSU5QS1QJMHgwMQorfQorCisvKgorICogTFFPIE1hbmFnZXIgU3RhdHVzIDIKKyAqLworcmVnaXN0ZXIgTFFPU1RBVDIgeworCWFkZHJlc3MJCQkweDA1NgorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlMUU9QS1QJCTB4RTAKKwlmaWVsZAlMUU9XQUlURklGTwkweDEwCisJZmllbGQJTFFPUEhBQ0hHT1VUUEtUCTB4MDIJLyogb3V0c2lkZSBvZiBwYWNrZXQgYm91bmRhcmllcy4gKi8KKwlmaWVsZAlMUU9TVE9QMAkweDAxCS8qIFN0b3BwZWQgYWZ0ZXIgc2VuZGluZyBhbGwgcGFja2V0cyAqLworfQorCisvKgorICogT3V0cHV0IFN5bmNocm9uaXplciBTcGFjZSBDb3VudAorICovCityZWdpc3RlciBPU19TUEFDRV9DTlQgeworCWFkZHJlc3MJCQkweDA1NgorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBTQ1NJIEludGVycnVwdCBNb2RlIDEKKyAqIFNldHRpbmcgYW55IGJpdCB3aWxsIGVuYWJsZSB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgorICogaW4gU0lNT0RFMSB0byBpbnRlcnJ1cHQgdmlhIHRoZSBJUlEgcGluLgorICovCityZWdpc3RlciBTSU1PREUxIHsKKwlhZGRyZXNzCQkJMHgwNTcKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMSwgTV9TQ1NJCisJZmllbGQJRU5TRUxUSU1PCTB4ODAKKwlmaWVsZAlFTkFUTlRBUkcJMHg0MAorCWZpZWxkCUVOU0NTSVJTVAkweDIwCisJZmllbGQJRU5QSEFTRU1JUwkweDEwCisJZmllbGQJRU5CVVNGUkVFCTB4MDgKKwlmaWVsZAlFTlNDU0lQRVJSCTB4MDQKKwlmaWVsZAlFTlNUUkIyRkFTVAkweDAyCisJZmllbGQJRU5SRVFJTklUCTB4MDEKK30KKworLyoKKyAqIEdvb2QgU3RhdHVzIEZJRk8KKyAqLworcmVnaXN0ZXIgR1NGSUZPIHsKKwlhZGRyZXNzCQkJMHgwNTgKKwlhY2Nlc3NfbW9kZQlSTworCXNpemUJCTIKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorfQorCisvKgorICogRGF0YSBGSUZPIFNDU0kgVHJhbnNmZXIgQ29udHJvbAorICovCityZWdpc3RlciBERkZTWEZSQ1RMIHsKKwlhZGRyZXNzCQkJMHgwNUEKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCURGRkJJVEJVQ0tFVAkweDA4CisJZmllbGQJQ0xSU0hDTlQJMHgwNAorCWZpZWxkCUNMUkNITgkJMHgwMgorCWZpZWxkCVJTVENITgkJMHgwMQorfQorCisvKgorICogTmV4dCBTQ1NJIENvbnRyb2wgQmxvY2sKKyAqLworcmVnaXN0ZXIgTkVYVFNDQiB7CisJYWRkcmVzcwkJCTB4MDVBCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyCisJbW9kZXMJCU1fU0NTSQorfQorCisvKiBSZXYgQiBvbmx5LiAqLworcmVnaXN0ZXIgTFFPU0NTQ1RMIHsKKwlhZGRyZXNzCQkJMHgwNUEKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTEKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAkJTFFPSDJBX1ZFUlNJT04JMHg4MAorCWZpZWxkCQlMUU9OT0NIS09WRVIJMHgwMQorfQorCisvKgorICogU0VRIEludGVycnVwdHMKKyAqLworcmVnaXN0ZXIgU0VRSU5UU1JDIHsKKwlhZGRyZXNzCQkJMHgwNUIKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCUNUWFRET05FCTB4NDAKKwlmaWVsZAlTQVZFUFRSUwkweDIwCisJZmllbGQJQ0ZHNERBVEEJMHgxMAorCWZpZWxkCUNGRzRJU1RBVAkweDA4CisJZmllbGQJQ0ZHNFRTVEFUCTB4MDQKKwlmaWVsZAlDRkc0SUNNRAkweDAyCisJZmllbGQJQ0ZHNFRDTUQJMHgwMQorfQorCisvKgorICogQ2xlYXIgQXJwIEludGVycnVwdHMKKyAqLworcmVnaXN0ZXIgQ0xSU0VRSU5UU1JDIHsKKwlhZGRyZXNzCQkJMHgwNUIKKwlhY2Nlc3NfbW9kZQlXTworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCUNMUkNUWFRET05FCTB4NDAKKwlmaWVsZAlDTFJTQVZFUFRSUwkweDIwCisJZmllbGQJQ0xSQ0ZHNERBVEEJMHgxMAorCWZpZWxkCUNMUkNGRzRJU1RBVAkweDA4CisJZmllbGQJQ0xSQ0ZHNFRTVEFUCTB4MDQKKwlmaWVsZAlDTFJDRkc0SUNNRAkweDAyCisJZmllbGQJQ0xSQ0ZHNFRDTUQJMHgwMQorfQorCisvKgorICogU0VRIEludGVycnVwdCBFbmFibGVkIChTaGFyZWQpCisgKi8KK3JlZ2lzdGVyIFNFUUlNT0RFIHsKKwlhZGRyZXNzCQkJMHgwNUMKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCUVOQ1RYVERPTkUJMHg0MAorCWZpZWxkCUVOU0FWRVBUUlMJMHgyMAorCWZpZWxkCUVOQ0ZHNERBVEEJMHgxMAorCWZpZWxkCUVOQ0ZHNElTVEFUCTB4MDgKKwlmaWVsZAlFTkNGRzRUU1RBVAkweDA0CisJZmllbGQJRU5DRkc0SUNNRAkweDAyCisJZmllbGQJRU5DRkc0VENNRAkweDAxCit9CisKKy8qCisgKiBDdXJyZW50IFNDU0kgQ29udHJvbCBCbG9jaworICovCityZWdpc3RlciBDVVJSU0NCIHsKKwlhZGRyZXNzCQkJMHgwNUMKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTIKKwltb2RlcwkJTV9TQ1NJCit9CisKKy8qCisgKiBEYXRhIEZJRk8gU3RhdHVzCisgKi8KK3JlZ2lzdGVyIE1ERkZTVEFUIHsKKwlhZGRyZXNzCQkJMHgwNUQKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCVNIQ05UTkVHQVRJVkUJMHg0MCAvKiBSZXYgQiBvciBoaWdoZXIgKi8KKwlmaWVsZAlTSENOVE1JTlVTMQkweDIwIC8qIFJldiBCIG9yIGhpZ2hlciAqLworCWZpZWxkCUxBU1RTRE9ORQkweDEwCisJZmllbGQJU0hWQUxJRAkJMHgwOAorCWZpZWxkCURMWkVSTwkJMHgwNCAvKiBGSUZPIGRhdGEgZW5kcyBvbiBwYWNrZXQgYm91bmRhcnkuICovCisJZmllbGQJREFUQUlORklGTwkweDAyCisJZmllbGQJRklGT0ZSRUUJMHgwMQorfQorCisvKgorICogQ1JDIENvbnRyb2wKKyAqLworcmVnaXN0ZXIgQ1JDQ09OVFJPTCB7CisJYWRkcmVzcwkJCTB4MDVkCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlDUkNWQUxDSEtFTgkJMHg0MAorfQorCisvKgorICogU0NTSSBUZXN0IENvbnRyb2wKKyAqLworcmVnaXN0ZXIgU0NTSVRFU1QgeworCWFkZHJlc3MJCQkweDA1RQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJQ05UUlRFU1QJMHgwOAorCWZpZWxkCVNFTF9UWFBMTF9ERUJVRwkweDA0Cit9CisKKy8qCisgKiBEYXRhIEZJRk8gUXVldWUgVGFnCisgKi8KK3JlZ2lzdGVyIERGRlRBRyB7CisJYWRkcmVzcwkJCTB4MDVFCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCit9CisKKy8qCisgKiBMYXN0IFNDU0kgQ29udHJvbCBCbG9jaworICovCityZWdpc3RlciBMQVNUU0NCIHsKKwlhZGRyZXNzCQkJMHgwNUUKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTIKKwltb2RlcwkJTV9TQ1NJCit9CisKKy8qCisgKiBTQ1NJIEkvTyBDZWxsIFBvd2VyLWRvd24gQ29udHJvbAorICovCityZWdpc3RlciBJT1BETkNUTCB7CisJYWRkcmVzcwkJCTB4MDVGCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlESVNBQkxFX09FCTB4ODAKKwlmaWVsZAlQRE5fSURJU1QJMHgwNAorCWZpZWxkCVBETl9ESUZGU0VOU0UJMHgwMQorfQorCisvKgorICogU2hhZGRvdyBIb3N0IEFkZHJlc3MuCisgKi8KK3JlZ2lzdGVyIFNIQUREUiB7CisJYWRkcmVzcwkJCTB4MDYwCisJYWNjZXNzX21vZGUJUk8KKwlzaXplCQk4CisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCit9CisKKy8qCisgKiBEYXRhIEdyb3VwIENSQyBJbnRlcnZhbC4KKyAqLworcmVnaXN0ZXIgREdSUENSQ0kgeworCWFkZHJlc3MJCQkweDA2MAorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMgorCW1vZGVzCQlNX0NGRworfQorCisvKgorICogRGF0YSBUcmFuc2ZlciBOZWdvdGlhdGlvbiBBZGRyZXNzCisgKi8KK3JlZ2lzdGVyIE5FR09BRERSIHsKKwlhZGRyZXNzCQkJMHgwNjAKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX1NDU0kKK30KKworLyoKKyAqIERhdGEgVHJhbnNmZXIgTmVnb3RpYXRpb24gRGF0YSAtIFBlcmlvZCBCeXRlCisgKi8KK3JlZ2lzdGVyIE5FR1BFUklPRCB7CisJYWRkcmVzcwkJCTB4MDYxCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCit9CisKKy8qCisgKiBQYWNrZXRpemVkIENSQyBJbnRlcnZhbAorICovCityZWdpc3RlciBQQUNLQ1JDSSB7CisJYWRkcmVzcwkJCTB4MDYyCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBEYXRhIFRyYW5zZmVyIE5lZ290aWF0aW9uIERhdGEgLSBPZmZzZXQgQnl0ZQorICovCityZWdpc3RlciBORUdPRkZTRVQgeworCWFkZHJlc3MJCQkweDA2MgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogRGF0YSBUcmFuc2ZlciBOZWdvdGlhdGlvbiBEYXRhIC0gUFBSIE9wdGlvbnMKKyAqLworcmVnaXN0ZXIgTkVHUFBST1BUUyB7CisJYWRkcmVzcwkJCTB4MDYzCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCisJZmllbGQJUFBST1BUX1BBQ0UJMHgwOAorCWZpZWxkCVBQUk9QVF9RQVMJMHgwNAorCWZpZWxkCVBQUk9QVF9EVAkweDAyCisJZmllbGQJUFBST1BUX0lVVAkweDAxCit9CisKKy8qCisgKiBEYXRhIFRyYW5zZmVyIE5lZ290aWF0aW9uIERhdGEgLSAgQ29ubmVjdGlvbiBPcHRpb25zCisgKi8KK3JlZ2lzdGVyIE5FR0NPTk9QVFMgeworCWFkZHJlc3MJCQkweDA2NAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorCWZpZWxkCUVOU05BUFNIT1QJMHg0MAorCWZpZWxkCVJUSV9XUlRESVMJMHgyMAorCWZpZWxkCVJUSV9PVlJEVFJOCTB4MTAKKwlmaWVsZAlFTlNMT1dDUkMJMHgwOAorCWZpZWxkCUVOQVVUT0FUTkkJMHgwNAorCWZpZWxkCUVOQVVUT0FUTk8JMHgwMgorCWZpZWxkCVdJREVYRkVSCTB4MDEKK30KKworLyoKKyAqIE5lZ290aWF0aW9uIFRhYmxlIEFubmV4IENvbHVtbiBJbmRleC4KKyAqLworcmVnaXN0ZXIgQU5ORVhDT0wgeworCWFkZHJlc3MJCQkweDA2NQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorfQorCityZWdpc3RlciBTQ1NDSEtOIHsKKwlhZGRyZXNzCQkJMHgwNjYKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCVNUU0VMU0tJRERJUwkweDQwCisJZmllbGQJQ1VSUkZJRk9ERUYJMHgyMAorCWZpZWxkCVdJREVSRVNFTgkweDEwCisJZmllbGQJU0RPTkVNU0tESVMJMHgwOAorCWZpZWxkCURGRkFDVENMUgkweDA0CisJZmllbGQJU0hWQUxJRFNURElTCTB4MDIKKwlmaWVsZAlMU1RTR0NMUkRJUwkweDAxCit9CisKK2NvbnN0IEFIRF9BTk5FWENPTF9QRVJfREVWMAk0Citjb25zdCBBSERfTlVNX1BFUl9ERVZfQU5ORVhDT0xTCTQKK2NvbnN0IEFIRF9BTk5FWENPTF9QUkVDT01QX1NMRVcJNAorY29uc3QJQUhEX1BSRUNPTVBfTUFTSwkweDA3Citjb25zdAlBSERfUFJFQ09NUF9TSElGVAkwCitjb25zdAlBSERfUFJFQ09NUF9DVVRCQUNLXzE3CTB4MDQKK2NvbnN0CUFIRF9QUkVDT01QX0NVVEJBQ0tfMjkJMHgwNgorY29uc3QJQUhEX1BSRUNPTVBfQ1VUQkFDS18zNwkweDA3Citjb25zdAlBSERfU0xFV1JBVEVfTUFTSwkweDc4Citjb25zdAlBSERfU0xFV1JBVEVfU0hJRlQJMworLyoKKyAqIFJldiBBIGhhcyBvbmx5IGEgc2luZ2xlIGJpdCAoaGlnaCBiaXQgb2YgZmllbGQpIG9mIHNsZXcgYWRqdXN0bWVudC4KKyAqIFJldiBCIGhhcyA0IGJpdHMuICBUaGUgY3VycmVudCBkZWZhdWx0IGhhcHBlbnMgdG8gYmUgdGhlIHNhbWUgZm9yIGJvdGguCisgKi8KK2NvbnN0CUFIRF9TTEVXUkFURV9ERUZfUkVWQQkweDA4Citjb25zdAlBSERfU0xFV1JBVEVfREVGX1JFVkIJMHgwOAorCisvKiBSZXYgQSBkb2VzIG5vdCBoYXZlIGFueSBhbXBsaXR1ZGUgc2V0dGluZy4gKi8KK2NvbnN0IEFIRF9BTk5FWENPTF9BTVBMSVRVREUJNgorY29uc3QJQUhEX0FNUExJVFVERV9NQVNLCTB4NworY29uc3QJQUhEX0FNUExJVFVERV9TSElGVAkwCitjb25zdAlBSERfQU1QTElUVURFX0RFRgkweDcKKworLyoKKyAqIE5lZ290aWF0aW9uIFRhYmxlIEFubmV4IERhdGEgUG9ydC4KKyAqLworcmVnaXN0ZXIgQU5ORVhEQVQgeworCWFkZHJlc3MJCQkweDA2NgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogSW5pdGlhdG9yJ3MgT3duIElkLgorICogVGhlIFNDU0kgSUQgdG8gdXNlIGZvciBTZWxlY3Rpb24gT3V0IGFuZCBzZWVuIGR1cmluZyBhIHJlc2VsZWN0aW9uLi4KKyAqLworcmVnaXN0ZXIgSU9XTklEIHsKKwlhZGRyZXNzCQkJMHgwNjcKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX1NDU0kKK30KKworLyoKKyAqIDk2ME1IeiBQaGFzZS1Mb2NrZWQgTG9vcCBDb250cm9sIDAKKyAqLworcmVnaXN0ZXIgUExMOTYwQ1RMMCB7CisJYWRkcmVzcwkJCTB4MDY4CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlQTExfVkNPU0VMCTB4ODAKKwlmaWVsZAlQTExfUFdETgkweDQwCisJZmllbGQJUExMX05TCQkweDMwCisJZmllbGQJUExMX0VOTFVECTB4MDgKKwlmaWVsZAlQTExfRU5MUEYJMHgwNAorCWZpZWxkCVBMTF9ETFBGCTB4MDIKKwlmaWVsZAlQTExfRU5GQk0JMHgwMQorfQorCisvKgorICogVGFyZ2V0IE93biBJZAorICovCityZWdpc3RlciBUT1dOSUQgeworCWFkZHJlc3MJCQkweDA2OQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogOTYwTUh6IFBoYXNlLUxvY2tlZCBMb29wIENvbnRyb2wgMQorICovCityZWdpc3RlciBQTEw5NjBDVEwxIHsKKwlhZGRyZXNzCQkJMHgwNjkKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCVBMTF9DTlRFTgkweDgwCisJZmllbGQJUExMX0NOVENMUgkweDQwCisJZmllbGQJUExMX1JTVAkJMHgwMQorfQorCisvKgorICogRXhwYW5kZXIgU2lnbmF0dXJlCisgKi8KK3JlZ2lzdGVyIFhTSUcgeworCWFkZHJlc3MJCQkweDA2QQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogU2hhZG93IEJ5dGUgQ291bnQKKyAqLworcmVnaXN0ZXIgU0hDTlQgeworCWFkZHJlc3MJCQkweDA2OAorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorfQorCisvKgorICogU2VsZWN0aW9uIE91dCBJRAorICovCityZWdpc3RlciBTRUxPSUQgeworCWFkZHJlc3MJCQkweDA2QgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogOTYwLU1IeiBQaGFzZS1Mb2NrZWQgTG9vcCBUZXN0IENvdW50CisgKi8KK3JlZ2lzdGVyIFBMTDk2MENOVDAgeworCWFkZHJlc3MJCQkweDA2QQorCWFjY2Vzc19tb2RlCVJPCisJc2l6ZQkJMgorCW1vZGVzCQlNX0NGRworfQorCisvKgorICogNDAwLU1IeiBQaGFzZS1Mb2NrZWQgTG9vcCBDb250cm9sIDAKKyAqLworcmVnaXN0ZXIgUExMNDAwQ1RMMCB7CisJYWRkcmVzcwkJCTB4MDZDCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlQTExfVkNPU0VMCTB4ODAKKwlmaWVsZAlQTExfUFdETgkweDQwCisJZmllbGQJUExMX05TCQkweDMwCisJZmllbGQJUExMX0VOTFVECTB4MDgKKwlmaWVsZAlQTExfRU5MUEYJMHgwNAorCWZpZWxkCVBMTF9ETFBGCTB4MDIKKwlmaWVsZAlQTExfRU5GQk0JMHgwMQorfQorCisvKgorICogQXJiaXRyYXRpb24gRmFpcm5lc3MKKyAqLworcmVnaXN0ZXIgRkFJUk5FU1MgeworCWFkZHJlc3MJCQkweDA2QworCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMgorCW1vZGVzCQlNX1NDU0kKK30KKworLyoKKyAqIDQwMC1NSHogUGhhc2UtTG9ja2VkIExvb3AgQ29udHJvbCAxCisgKi8KK3JlZ2lzdGVyIFBMTDQwMENUTDEgeworCWFkZHJlc3MJCQkweDA2RAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJUExMX0NOVEVOCTB4ODAKKwlmaWVsZAlQTExfQ05UQ0xSCTB4NDAKKwlmaWVsZAlQTExfUlNUCQkweDAxCit9CisKKy8qCisgKiBBcmJpdHJhdGlvbiBVbmZhaXJuZXNzCisgKi8KK3JlZ2lzdGVyIFVORkFJUk5FU1MgeworCWFkZHJlc3MJCQkweDA2RQorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMgorCW1vZGVzCQlNX1NDU0kKK30KKworLyoKKyAqIDQwMC1NSHogUGhhc2UtTG9ja2VkIExvb3AgVGVzdCBDb3VudAorICovCityZWdpc3RlciBQTEw0MDBDTlQwIHsKKwlhZGRyZXNzCQkJMHgwNkUKKwlhY2Nlc3NfbW9kZQlSTworCXNpemUJCTIKKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIFNDQiBQYWdlIFBvaW50ZXIKKyAqLworcmVnaXN0ZXIgU0NCUFRSIHsKKwlhZGRyZXNzCQkJMHgwQTgKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTIKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fQ0NIQU4sIE1fU0NTSQorfQorCisvKgorICogQ01DIFNDQiBBcnJheSBDb3VudAorICogTnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyIGJldHdlZW4gQ01DIFNDQiBtZW1vcnkgYW5kIFNDQlJBTS4KKyAqIFRyYW5zZmVycyBtdXN0IGJlIDhieXRlIGFsaWduZWQgYW5kIHNpemVkLgorICovCityZWdpc3RlciBDQ1NDQkFDTlQgeworCWFkZHJlc3MJCQkweDBBQgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0NIQU4KK30KKworLyoKKyAqIFNDQiBBdXRvcG9pbnRlcgorICogU0NCLU5leHQgQWRkcmVzcyBTbm9vcGluZyBsb2dpYy4gIFdoZW4gYW4gU0NCIGlzIHRyYW5zZmVycmVkIHRvCisgKiB0aGUgY2FyZCwgdGhlIG5leHQgU0NCIGFkZHJlc3MgdG8gYmUgdXNlZCBieSB0aGUgQ01DIGFycmF5IGNhbgorICogYmUgYXV0b2xvYWRlZCBmcm9tIHRoYXQgdHJhbnNmZXIuCisgKi8KK3JlZ2lzdGVyIFNDQkFVVE9QVFIgeworCWFkZHJlc3MJCQkweDBBQgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJQVVTQ0JQVFJfRU4JMHg4MAorCWZpZWxkCVNDQlBUUl9BRERSCTB4MzgKKwlmaWVsZAlTQ0JQVFJfT0ZGCTB4MDcKK30KKworLyoKKyAqIENNQyBTRyBSYW0gQWRkcmVzcyBQb2ludGVyCisgKi8KK3JlZ2lzdGVyIENDU0dBRERSIHsKKwlhZGRyZXNzCQkJMHgwQUMKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorfQorCisvKgorICogQ01DIFNDQiBSQU0gQWRkcmVzcyBQb2ludGVyCisgKi8KK3JlZ2lzdGVyIENDU0NCQUREUiB7CisJYWRkcmVzcwkJCTB4MEFDCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DQ0hBTgorfQorCisvKgorICogQ01DIFNDQiBSYW0gQmFjay11cCBBZGRyZXNzIFBvaW50ZXIKKyAqIEluZGljYXRlcyB0aGUgdHJ1ZSBzdG9wIGxvY2F0aW9uIG9mIHRyYW5zZmVycyBoYWx0ZWQgcHJpb3IKKyAqIHRvIFNDQkhDTlQgZ29pbmcgdG8gMC4KKyAqLworcmVnaXN0ZXIgQ0NTQ0JBRFJfQksgeworCWFkZHJlc3MJCQkweDBBQworCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBDTUMgU0cgQ29udHJvbAorICovCityZWdpc3RlciBDQ1NHQ1RMIHsKKwlhZGRyZXNzCQkJMHgwQUQKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCUNDU0dET05FCTB4ODAKKwlmaWVsZAlTR19DQUNIRV9BVkFJTAkweDEwCisJZmllbGQJQ0NTR0VOQUNLCTB4MDgKKwltYXNrCUNDU0dFTgkJMHgwQworCWZpZWxkCVNHX0ZFVENIX1JFUQkweDAyCisJZmllbGQJQ0NTR1JFU0VUCTB4MDEKK30KKworLyoKKyAqIENNRCBTQ0IgQ29udHJvbAorICovCityZWdpc3RlciBDQ1NDQkNUTCB7CisJYWRkcmVzcwkJCTB4MEFECisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DQ0hBTgorCWZpZWxkCUNDU0NCRE9ORQkweDgwCisJZmllbGQJQVJSRE9ORQkJMHg0MAorCWZpZWxkCUNDQVJSRU4JCTB4MTAKKwlmaWVsZAlDQ1NDQkVOCQkweDA4CisJZmllbGQJQ0NTQ0JESVIJMHgwNAorCWZpZWxkCUNDU0NCUkVTRVQJMHgwMQorfQorCisvKgorICogQ01DIFJhbSBCSVNUCisgKi8KK3JlZ2lzdGVyIENNQ19SQU1CSVNUIHsKKwlhZGRyZXNzCQkJMHgwQUQKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCVNHX0VMRU1FTlRfU0laRQkJMHg4MAorCWZpZWxkCVNDQlJBTUJJU1RfRkFJTAkJMHg0MAorCWZpZWxkCVNHX0JJU1RfRkFJTAkJMHgyMAorCWZpZWxkCVNHX0JJU1RfRU4JCTB4MTAKKwlmaWVsZAlDTUNfQlVGRkVSX0JJU1RfRkFJTAkweDAyCisJZmllbGQJQ01DX0JVRkZFUl9CSVNUX0VOCTB4MDEKK30KKworLyoKKyAqIENNQyBTRyBSQU0gRGF0YSBQb3J0CisgKi8KK3JlZ2lzdGVyIENDU0dSQU0geworCWFkZHJlc3MJCQkweDBCMAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCit9CisKKy8qCisgKiBDTUMgU0NCIFJBTSBEYXRhIFBvcnQKKyAqLworcmVnaXN0ZXIgQ0NTQ0JSQU0geworCWFkZHJlc3MJCQkweDBCMAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0NIQU4KK30KKworLyoKKyAqIEZsZXggRE1BIEFkZHJlc3MuCisgKi8KK3JlZ2lzdGVyIEZMRVhBRFIgeworCWFkZHJlc3MJCQkweDBCMAorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMworCW1vZGVzCQlNX1NDU0kKK30KKworLyoKKyAqIEZsZXggRE1BIEJ5dGUgQ291bnQKKyAqLworcmVnaXN0ZXIgRkxFWENOVCB7CisJYWRkcmVzcwkJCTB4MEIzCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogRmxleCBETUEgU3RhdHVzCisgKi8KK3JlZ2lzdGVyIEZMRVhETUFTVEFUIHsKKwlhZGRyZXNzCQkJMHgwQjUKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX1NDU0kKKwlmaWVsZAlGTEVYRE1BRVJSCTB4MDIKKwlmaWVsZAlGTEVYRE1BRE9ORQkweDAxCit9CisKKy8qCisgKiBGbGV4IERNQSBEYXRhIFBvcnQKKyAqLworcmVnaXN0ZXIgRkxFWERBVEEgeworCWFkZHJlc3MJCQkweDBCNgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogQm9hcmQgRGF0YQorICovCityZWdpc3RlciBCUkREQVQgeworCWFkZHJlc3MJCQkweDBCOAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogQm9hcmQgQ29udHJvbAorICovCityZWdpc3RlciBCUkRDVEwgeworCWFkZHJlc3MJCQkweDBCOQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorCWZpZWxkCUZMWEFSQkFDSwkweDgwCisJZmllbGQJRkxYQVJCUkVRCTB4NDAKKwlmaWVsZAlCUkRBRERSCQkweDM4CisJZmllbGQJQlJERU4JCTB4MDQKKwlmaWVsZAlCUkRSVwkJMHgwMgorCWZpZWxkCUJSRFNUQgkJMHgwMQorfQorCisvKgorICogU2VyaWFsIEVFUFJPTSBBZGRyZXNzCisgKi8KK3JlZ2lzdGVyIFNFRUFEUiB7CisJYWRkcmVzcwkJCTB4MEJBCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCit9CisKKy8qCisgKiBTZXJpYWwgRUVQUk9NIERhdGEKKyAqLworcmVnaXN0ZXIgU0VFREFUIHsKKwlhZGRyZXNzCQkJMHgwQkMKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTIKKwltb2RlcwkJTV9TQ1NJCit9CisKKy8qCisgKiBTZXJpYWwgRUVQUk9NIFN0YXR1cworICovCityZWdpc3RlciBTRUVTVEFUIHsKKwlhZGRyZXNzCQkJMHgwQkUKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX1NDU0kKKwlmaWVsZAlJTklUX0RPTkUJMHg4MAorCWZpZWxkCVNFRU9QQ09ERQkweDcwCisJZmllbGQJTERBTFRJRF9MCTB4MDgKKwlmaWVsZAlTRUVBUkJBQ0sJMHgwNAorCWZpZWxkCVNFRUJVU1kJCTB4MDIKKwlmaWVsZAlTRUVTVEFSVAkweDAxCit9CisKKy8qCisgKiBTZXJpYWwgRUVQUk9NIENvbnRyb2wKKyAqLworcmVnaXN0ZXIgU0VFQ1RMIHsKKwlhZGRyZXNzCQkJMHgwQkUKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX1NDU0kKKwlmaWVsZAlTRUVPUENPREUJMHg3MCB7CisJCVNFRU9QX0VSQVNFCTB4NzAsCisJCVNFRU9QX1JFQUQJMHg2MCwKKwkJU0VFT1BfV1JJVEUJMHg1MCwKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgZm91ciBjb21tYW5kcyB1c2Ugc3BlY2lhbAorCSAqIGFkZHJlc3NlcyBmb3IgZGlmZmVyZW50aWF0aW9uLgorCSAqLworCQlTRUVPUF9FUkFMCTB4NDAKKwl9CisJbWFzawlTRUVPUF9FV0VOCTB4NDAKKwltYXNrCVNFRU9QX1dBTEwJMHg0MAorCW1hc2sJU0VFT1BfRVdEUwkweDQwCisJZmllbGQJU0VFUlNUCQkweDAyCisJZmllbGQJU0VFU1RBUlQJMHgwMQorfQorCitjb25zdCBTRUVPUF9FUkFMX0FERFIJMHg4MAorY29uc3QgU0VFT1BfRVdFTl9BRERSCTB4QzAKK2NvbnN0IFNFRU9QX1dSQUxfQUREUgkweDQwCitjb25zdCBTRUVPUF9FV0RTX0FERFIJMHgwMAorCisvKgorICogU0NCIENvdW50ZXIKKyAqLworcmVnaXN0ZXIgU0NCQ05UIHsKKwlhZGRyZXNzCQkJMHgwQkYKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX1NDU0kKK30KKworLyoKKyAqIERhdGEgRklGTyBXcml0ZSBBZGRyZXNzCisgKiBQb2ludGVyIHRvIHRoZSBuZXh0IFFXRCBsb2NhdGlvbiB0byBiZSB3cml0dGVuIHRvIHRoZSBkYXRhIEZJRk8uCisgKi8KK3JlZ2lzdGVyIERGV0FERFIgeworCWFkZHJlc3MJCQkweDBDMAorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMgorCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorfQorCisvKgorICogRFNQIEZpbHRlciBDb250cm9sCisgKi8KK3JlZ2lzdGVyIERTUEZMVFJDVEwgeworCWFkZHJlc3MJCQkweDBDMAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRkxUUkRJU0FCTEUJMHgyMAorCWZpZWxkCUVER0VTRU5TRQkweDEwCisJZmllbGQJRFNQRkNOVFNFTAkweDBGCit9CisKKy8qCisgKiBEU1AgRGF0YSBDaGFubmVsIENvbnRyb2wKKyAqLworcmVnaXN0ZXIgRFNQREFUQUNUTCB7CisJYWRkcmVzcwkJCTB4MEMxCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlCWVBBU1NFTkFCCTB4ODAKKwlmaWVsZAlERVNRRElTCQkweDEwCisJZmllbGQJUkNWUk9GRlNURElTCTB4MDQKKwlmaWVsZAlYTUlUT0ZGU1RESVMJMHgwMgorfQorCisvKgorICogRGF0YSBGSUZPIFJlYWQgQWRkcmVzcworICogUG9pbnRlciB0byB0aGUgbmV4dCBRV0QgbG9jYXRpb24gdG8gYmUgcmVhZCBmcm9tIHRoZSBkYXRhIEZJRk8uCisgKi8KK3JlZ2lzdGVyIERGUkFERFIgeworCWFkZHJlc3MJCQkweDBDMgorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMgorCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorfQorCisvKgorICogRFNQIFJFUSBDb250cm9sCisgKi8KK3JlZ2lzdGVyIERTUFJFUUNUTCB7CisJYWRkcmVzcwkJCTB4MEMyCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlNQU5SRVFDVEwJMHhDMAorCWZpZWxkCU1BTlJFUURMWQkweDNGCit9CisKKy8qCisgKiBEU1AgQUNLIENvbnRyb2wKKyAqLworcmVnaXN0ZXIgRFNQQUNLQ1RMIHsKKwlhZGRyZXNzCQkJMHgwQzMKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCU1BTkFDS0NUTAkweEMwCisJZmllbGQJTUFOQUNLRExZCTB4M0YKK30KKworLyoKKyAqIERhdGEgRklGTyBEYXRhCisgKiBSZWFkL1dyaXRlIGJ5dGUgcG9ydCBpbnRvIHRoZSBkYXRhIEZJRk8uICBUaGUgcmVhZCBhbmQgd3JpdGUKKyAqIEZJRk8gcG9pbnRlcnMgaW5jcmVtZW50IHdpdGggZWFjaCByZWFkIGFuZCB3cml0ZSByZXNwZWN0aXZlbHkKKyAqIHRvIHRoaXMgcG9ydC4KKyAqLworcmVnaXN0ZXIgREZEQVQgeworCWFkZHJlc3MJCQkweDBDNAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCit9CisKKy8qCisgKiBEU1AgQ2hhbm5lbCBTZWxlY3QKKyAqLworcmVnaXN0ZXIgRFNQU0VMRUNUIHsKKwlhZGRyZXNzCQkJMHgwQzQKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCUFVVE9JTkNFTgkweDgwCisJZmllbGQJRFNQU0VMCQkweDFGCit9CisKK2NvbnN0IE5VTURTUFMgMHgxNAorCisvKgorICogV3JpdGUgQmlhcyBDb250cm9sCisgKi8KK3JlZ2lzdGVyIFdSVEJJQVNDVEwgeworCWFkZHJlc3MJCQkweDBDNQorCWFjY2Vzc19tb2RlCVdPCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJQVVUT1hCQ0RJUwkweDgwCisJZmllbGQJWE1JVE1BTlZBTAkweDNGCit9CisKKy8qCisgKiBDdXJyZW50bHkgdGhlIFdSVEJJQVNDVEwgaXMgdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQuCisgKi8KK2NvbnN0IFdSVEJJQVNDVExfSFBfREVGQVVMVCAweDAKKworLyoKKyAqIFJlY2VpdmVyIEJpYXMgQ29udHJvbAorICovCityZWdpc3RlciBSQ1ZSQklPU0NUTCB7CisJYWRkcmVzcwkJCTB4MEM2CisJYWNjZXNzX21vZGUJV08KKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlBVVRPUkJDRElTCTB4ODAKKwlmaWVsZAlSQ1ZSTUFOVkFMCTB4M0YKK30KKworLyoKKyAqIFdyaXRlIEJpYXMgQ2FsY3VsYXRvcgorICovCityZWdpc3RlciBXUlRCSUFTQ0FMQyB7CisJYWRkcmVzcwkJCTB4MEM3CisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIERhdGEgRklGTyBQb2ludGVycworICogQ29udGFpbnMgdGhlIGJ5dGUgb2Zmc2V0IGZyb20gREZXQUREUiBhbmQgRFdSQUREUiB0byB0aGUgY3VycmVudAorICogRklGTyB3cml0ZS9yZWFkIGxvY2F0aW9ucy4KKyAqLworcmVnaXN0ZXIgREZQVFJTIHsKKwlhZGRyZXNzCQkJMHgwQzgKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorfQorCisvKgorICogUmVjZWl2ZXIgQmlhcyBDYWxjdWxhdG9yCisgKi8KK3JlZ2lzdGVyIFJDVlJCSUFTQ0FMQyB7CisJYWRkcmVzcwkJCTB4MEM4CisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIERhdGEgRklGTyBCYWNrdXAgUmVhZCBQb2ludGVyCisgKiBDb250YWlucyB0aGUgZGF0YSBGSUZPIGFkZHJlc3MgdG8gYmUgcmVzdG9yZWQgaWYgdGhlIGxhc3QKKyAqIGRhdGEgYWNjZXNzZWQgZnJvbSB0aGUgZGF0YSBGSUZPIHdhcyBub3QgdHJhbnNmZXJyZWQgc3VjY2Vzc2Z1bGx5LgorICovCityZWdpc3RlciBERkJLUFRSIHsKKwlhZGRyZXNzCQkJMHgwQzkKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTIKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEKK30KKworLyoKKyAqIFNrZXcgQ2FsY3VsYXRvcgorICovCityZWdpc3RlciBTS0VXQ0FMQyB7CisJYWRkcmVzcwkJCTB4MEM5CisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIERhdGEgRklGTyBEZWJ1ZyBDb250cm9sCisgKi8KK3JlZ2lzdGVyIERGREJDVEwgeworCWFkZHJlc3MJCQkJMHgwQ0IKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCURGRl9DSU9fV1JfUkRZCQkweDIwCisJZmllbGQJREZGX0NJT19SRF9SRFkJCTB4MTAKKwlmaWVsZAlERkZfRElSX0VSUgkJMHgwOAorCWZpZWxkCURGRl9SQU1CSVNUX0ZBSUwJMHgwNAorCWZpZWxkCURGRl9SQU1CSVNUX0RPTkUJMHgwMgorCWZpZWxkCURGRl9SQU1CSVNUX0VOCQkweDAxCit9CisKKy8qCisgKiBEYXRhIEZJRk8gU3BhY2UgQ291bnQKKyAqIE51bWJlciBvZiBGSUZPIGxvY2F0aW9ucyB0aGF0IGFyZSBmcmVlLgorICovCityZWdpc3RlciBERlNDTlQgeworCWFkZHJlc3MJCQkweDBDQworCWFjY2Vzc19tb2RlCVJPCisJc2l6ZQkJMgorCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorfQorCisvKgorICogRGF0YSBGSUZPIEJ5dGUgQ291bnQKKyAqIE51bWJlciBvZiBmaWxsZWQgRklGTyBsb2NhdGlvbnMuCisgKi8KK3JlZ2lzdGVyIERGQkNOVCB7CisJYWRkcmVzcwkJCTB4MENFCisJYWNjZXNzX21vZGUJUk8KKwlzaXplCQkyCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCit9CisKKy8qCisgKiBTZXF1ZW5jZXIgUHJvZ3JhbSBPdmVybGF5IEFkZHJlc3MuCisgKiBMb3cgYWRkcmVzcyBtdXN0IGJlIHdyaXR0ZW4gcHJpb3IgdG8gaGlnaCBhZGRyZXNzLgorICovCityZWdpc3RlciBPVkxZQUREUiB7CisJYWRkcmVzcwkJCTB4MEQ0CisJbW9kZXMJCU1fU0NTSQorCXNpemUJCTIKKwlhY2Nlc3NfbW9kZQlSVworfQorCisvKgorICogU2VxdWVuY2VyIENvbnRyb2wgMAorICogRXJyb3IgZGV0ZWN0aW9uIG1vZGUsIHNwZWVkIGNvbmZpZ3VyYXRpb24sCisgKiBzaW5nbGUgc3RlcCwgYnJlYWtwb2ludHMgYW5kIHByb2dyYW0gbG9hZC4KKyAqLworcmVnaXN0ZXIgU0VRQ1RMMCB7CisJYWRkcmVzcwkJCTB4MEQ2CisJYWNjZXNzX21vZGUgUlcKKwlmaWVsZAlQRVJST1JESVMJMHg4MAorCWZpZWxkCVBBVVNFRElTCTB4NDAKKwlmaWVsZAlGQUlMRElTCQkweDIwCisJZmllbGQJRkFTVE1PREUJMHgxMAorCWZpZWxkCUJSS0FEUklOVEVOCTB4MDgKKwlmaWVsZAlTVEVQCQkweDA0CisJZmllbGQJU0VRUkVTRVQJMHgwMgorCWZpZWxkCUxPQURSQU0JCTB4MDEKK30KKworLyoKKyAqIFNlcXVlbmNlciBDb250cm9sIDEKKyAqIEluc3RydWN0aW9uIFJBTSBEaWFnbm9zdGljcworICovCityZWdpc3RlciBTRVFDVEwxIHsKKwlhZGRyZXNzCQkJMHgwRDcKKwlhY2Nlc3NfbW9kZSBSVworCWZpZWxkCU9WUkxBWV9EQVRBX0NISwkweDA4CisJZmllbGQJUkFNQklTVF9ET05FCTB4MDQKKwlmaWVsZAlSQU1CSVNUX0ZBSUwJMHgwMgorCWZpZWxkCVJBTUJJU1RfRU4JMHgwMQorfQorCisvKgorICogU2VxdWVuY2VyIEZsYWdzCisgKiBaZXJvIGFuZCBDYXJyeSBzdGF0ZSBvZiB0aGUgQUxVLgorICovCityZWdpc3RlciBGTEFHUyB7CisJYWRkcmVzcwkJCTB4MEQ4CisJYWNjZXNzX21vZGUgUk8KKwlmaWVsZAlaRVJPCQkweDAyCisJZmllbGQJQ0FSUlkJCTB4MDEKK30KKworLyoKKyAqIFNlcXVlbmNlciBJbnRlcnJ1cHQgQ29udHJvbAorICovIAorcmVnaXN0ZXIgU0VRSU5UQ1RMIHsKKwlhZGRyZXNzCQkJMHgwRDkKKwlhY2Nlc3NfbW9kZSBSVworCWZpZWxkCUlOVFZFQzFEU0wJMHg4MAorCWZpZWxkCUlOVDFfQ09OVEVYVAkweDIwCisJZmllbGQJU0NTX1NFUV9JTlQxTTEJMHgxMAorCWZpZWxkCVNDU19TRVFfSU5UMU0wCTB4MDgKKwlmaWVsZAlJTlRNQVNLMgkweDA0CisJZmllbGQJSU5UTUFTSzEJMHgwMgorCWZpZWxkCUlSRVQJCTB4MDEKK30KKworLyoKKyAqIFNlcXVlbmNlciBSQU0gRGF0YSBQb3J0CisgKiBTaW5nbGUgYnl0ZSB3aW5kb3cgaW50byB0aGUgU2VxdWVuY2VyIEluc3RydWN0aW9uIFJhbSBhcmVhIHN0YXJ0aW5nCisgKiBhdCB0aGUgYWRkcmVzcyBzcGVjaWZpZWQgYnkgT1ZMWUFERFIuICBUbyB3cml0ZSBhIGZ1bGwgaW5zdHJ1Y3Rpb24gd29yZCwKKyAqIHNpbXBseSB3cml0ZSBmb3VyIGJ5dGVzIGluIHN1Y2Nlc3Npb24uICBPVkxZQUREUiB3aWxsIGluY3JlbWVudCBhZnRlciB0aGUKKyAqIG1vc3Qgc2lnbmlmaWNhbnQgaW5zdHJ1dGlvbiBieXRlICh0aGUgYnl0ZSB3aXRoIHRoZSBwYXJpdHkgYml0KSBpcyB3cml0dGVuLgorICovCityZWdpc3RlciBTRVFSQU0geworCWFkZHJlc3MJCQkweDBEQQorCWFjY2Vzc19tb2RlIFJXCit9CisKKy8qCisgKiBTZXF1ZW5jZXIgUHJvZ3JhbSBDb3VudGVyCisgKiBMb3cgYnl0ZSBtdXN0IGJlIHdyaXR0ZW4gcHJpb3IgdG8gaGlnaCBieXRlLgorICovCityZWdpc3RlciBQUkdNQ05UIHsKKwlhZGRyZXNzCQkJMHgwREUKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTIKK30KKworLyoKKyAqIEFjY3VtdWxhdG9yCisgKi8KK3JlZ2lzdGVyIEFDQ1VNIHsKKwlhZGRyZXNzCQkJMHgwRTAKKwlhY2Nlc3NfbW9kZSBSVworCWFjY3VtdWxhdG9yCit9CisKKy8qCisgKiBTb3VyY2UgSW5kZXggUmVnaXN0ZXIKKyAqIEluY3JlbWVudGluZyBpbmRleCBmb3IgcmVhZHMgb2YgU0lORElSIGFuZCB0aGUgZGVzdGluYXRpb24gKGxvdyBieXRlIG9ubHkpCisgKiBmb3IgYW55IGltbWVkaWF0ZSBvcGVyYW5kcyBwYXNzZWQgaW4gam1wLCBqYywgam5jLCBjYWxsIGluc3RydWN0aW9ucy4KKyAqIEV4YW1wbGU6CisgKgkJbXZpCTB4RkYJY2FsbCBzb21lX3JvdXRpbmU7CisgKgorICogIFdpbGwgc2V0IFNJTkRFWFswXSB0byAweEZGIGFuZCBjYWxsIHRoZSByb3V0aW5lICJzb21lX3JvdXRpbmUuCisgKi8KK3JlZ2lzdGVyIFNJTkRFWAl7CisJYWRkcmVzcwkJCTB4MEUyCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyCisJc2luZGV4Cit9CisKKy8qCisgKiBEZXN0aW5hdGlvbiBJbmRleCBSZWdpc3RlcgorICogSW5jcmVtZW50aW5nIGluZGV4IGZvciB3cml0ZXMgdG8gRElORElSLiAgQ2FuIGJlIHVzZWQgYXMgYSBzY3JhdGNoIHJlZ2lzdGVyLgorICovCityZWdpc3RlciBESU5ERVggeworCWFkZHJlc3MJCQkweDBFNAorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMgorfQorCisvKgorICogQnJlYWsgQWRkcmVzcworICogU2VxdWVuY2VyIGluc3RydWN0aW9uIGJyZWFrcG9pbnQgYWRkcmVzcyBhZGRyZXNzLgorICovCityZWdpc3RlciBCUktBRERSMCB7CisJYWRkcmVzcwkJCTB4MEU2CisJYWNjZXNzX21vZGUJUlcKK30KKworcmVnaXN0ZXIgQlJLQUREUjEgeworCWFkZHJlc3MJCQkweDBFNgorCWFjY2Vzc19tb2RlCVJXCisJZmllbGQJQlJLRElTCQkweDgwCS8qIERpc2FibGUgQnJlYWtwb2ludCAqLworfQorCisvKgorICogQWxsIE9uZXMKKyAqIEFsbCByZWFkcyB0byB0aGlzIHJlZ2lzdGVyIHJldHVybiB0aGUgdmFsdWUgMHhGRi4KKyAqLworcmVnaXN0ZXIgQUxMT05FUyB7CisJYWRkcmVzcwkJCTB4MEU4CisJYWNjZXNzX21vZGUgUk8KKwlhbGxvbmVzCit9CisKKy8qCisgKiBBbGwgWmVyb3MKKyAqIEFsbCByZWFkcyB0byB0aGlzIHJlZ2lzdGVyIHJldHVybiB0aGUgdmFsdWUgMC4KKyAqLworcmVnaXN0ZXIgQUxMWkVST1MgeworCWFkZHJlc3MJCQkweDBFQQorCWFjY2Vzc19tb2RlIFJPCisJYWxsemVyb3MKK30KKworLyoKKyAqIE5vIERlc3RpbmF0aW9uCisgKiBXcml0ZXMgdG8gdGhpcyByZWdpc3RlciBoYXZlIG5vIGVmZmVjdC4KKyAqLworcmVnaXN0ZXIgTk9ORSB7CisJYWRkcmVzcwkJCTB4MEVBCisJYWNjZXNzX21vZGUgV08KKwlub25lCit9CisKKy8qCisgKiBTb3VyY2UgSW5kZXggSW5kaXJlY3QKKyAqIFJlYWRpbmcgdGhpcyByZWdpc3RlciBpcyBlcXVpdmFsZW50IHRvIHJlYWRpbmcgKHJlZ2lzdGVyX2Jhc2UgKyBTSU5ERVgpIGFuZAorICogaW5jcmVtZW50aW5nIFNJTkRFWCBieSAxLgorICovCityZWdpc3RlciBTSU5ESVIJeworCWFkZHJlc3MJCQkweDBFQworCWFjY2Vzc19tb2RlIFJPCit9CisKKy8qCisgKiBEZXN0aW5hdGlvbiBJbmRleCBJbmRpcmVjdAorICogV3JpdGluZyB0aGlzIHJlZ2lzdGVyIGlzIGVxdWl2YWxlbnQgdG8gd3JpdGluZyB0byAocmVnaXN0ZXJfYmFzZSArIERJTkRFWCkKKyAqIGFuZCBpbmNyZW1lbnRpbmcgRElOREVYIGJ5IDEuCisgKi8KK3JlZ2lzdGVyIERJTkRJUgkgeworCWFkZHJlc3MJCQkweDBFRAorCWFjY2Vzc19tb2RlIFdPCit9CisKKy8qCisgKiBGdW5jdGlvbiBPbmUKKyAqIDIncyBjb21wbGVtZW50IHRvIGJpdCB2YWx1ZSBjb252ZXJzaW9uLiAgV3JpdGUgdGhlIDIncyBjb21wbGVtZW50IHZhbHVlCisgKiAoMC03IG9ubHkpIHRvIHRoZSB0b3AgbmliYmxlIGFuZCByZXRyaWV2ZSB0aGUgYml0IGluZGV4ZWQgYnkgdGhhdCB2YWx1ZQorICogb24gdGhlIG5leHQgcmVhZCBvZiB0aGlzIHJlZ2lzdGVyLiAKKyAqIEV4YW1wbGU6CisgKglXcml0ZQkweDYwCisgKglSZWFkCTB4NDAKKyAqLworcmVnaXN0ZXIgRlVOQ1RJT04xIHsKKwlhZGRyZXNzCQkJMHgwRjAKKwlhY2Nlc3NfbW9kZSBSVworfQorCisvKgorICogU3RhY2sKKyAqIFdpbmRvdyBpbnRvIHRoZSBzdGFjay4gIEVhY2ggc3RhY2sgbG9jYXRpb24gaXMgMTAgYml0cyB3aWRlIHJlcG9ydGVkCisgKiBsb3cgYnl0ZSBmb2xsb3dlZCBieSBoaWdoIGJ5dGUuICBUaGVyZSBhcmUgOCBzdGFjayBsb2NhdGlvbnMuCisgKi8KK3JlZ2lzdGVyIFNUQUNLIHsKKwlhZGRyZXNzCQkJMHgwRjIKKwlhY2Nlc3NfbW9kZSBSVworfQorCisvKgorICogSW50ZXJydXB0IFZlY3RvciAxIEFkZHJlc3MKKyAqIEludGVycnVwdCBicmFuY2ggYWRkcmVzcyBmb3IgU0NTIFNFUV9JTlQxIG1vZGUgMCBhbmQgMSBpbnRlcnJ1cHRzLgorICovCityZWdpc3RlciBJTlRWRUMxX0FERFIgeworCWFkZHJlc3MJCQkweDBGNAorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMgorCW1vZGVzCQlNX0NGRworfQorCisvKgorICogQ3VycmVudCBBZGRyZXNzCisgKiBBZGRyZXNzIG9mIHRoZSBTRVFSQU0gaW5zdHJ1Y3Rpb24gY3VycmVudGx5IGV4ZWN1dGluZyBpbnN0cnVjdGlvbi4KKyAqLworcmVnaXN0ZXIgQ1VSQUREUiB7CisJYWRkcmVzcwkJCTB4MEY0CisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogSW50ZXJydXB0IFZlY3RvciAyIEFkZHJlc3MKKyAqIEludGVycnVwdCBicmFuY2ggYWRkcmVzcyBmb3IgSFNUX1NFUV9JTlQyIGludGVycnVwdHMuCisgKi8KK3JlZ2lzdGVyIElOVFZFQzJfQUREUiB7CisJYWRkcmVzcwkJCTB4MEY2CisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBMYXN0IEFkZHJlc3MKKyAqIEFkZHJlc3Mgb2YgdGhlIFNFUVJBTSBpbnN0cnVjdGlvbiBleGVjdXRlZCBwcmlvciB0byB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4KKyAqLworcmVnaXN0ZXIgTEFTVEFERFIgeworCWFkZHJlc3MJCQkweDBGNgorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMgorCW1vZGVzCQlNX1NDU0kKK30KKworcmVnaXN0ZXIgQUhEX1BDSV9DT05GSUdfQkFTRSB7CisJYWRkcmVzcwkJCTB4MTAwCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyNTYKKwltb2RlcwkJTV9DRkcKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTY3JhdGNoIFJBTSBPZmZzZXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3NjcmF0Y2hfcmFtIHsKKwkvKiBNb2RlIFNwZWNpZmljICovCisJYWRkcmVzcwkJCTB4MEEwCisJc2l6ZQk4CisJbW9kZXMJMCwgMSwgMiwgMworCVJFRzAgeworCQlzaXplCQkyCisJfQorCVJFRzEgeworCQlzaXplCQkyCisJfQorCVJFR19JU1IgeworCQlzaXplCQkyCisJfQorCVNHX1NUQVRFIHsKKwkJc2l6ZQkJMQorCQlmaWVsZAlTRUdTX0FWQUlMCTB4MDEKKwkJZmllbGQJTE9BRElOR19ORUVERUQJMHgwMgorCQlmaWVsZAlGRVRDSF9JTlBST0cJMHgwNAorCX0KKwkvKgorCSAqIFRyYWNrIHdoZXRoZXIgdGhlIHRyYW5zZmVyIGJ5dGUgY291bnQgZm9yCisJICogdGhlIGN1cnJlbnQgZGF0YSBwaGFzZSBpcyBvZGQuCisJICovCisJREFUQV9DT1VOVF9PREQgeworCQlzaXplCQkxCisJfQorfQorCitzY3JhdGNoX3JhbSB7CisJLyogTW9kZSBTcGVjaWZpYyAqLworCWFkZHJlc3MJCQkweDBGOAorCXNpemUJOAorCW1vZGVzCTAsIDEsIDIsIDMKKwlMT05HSk1QX0FERFIgeworCQlzaXplCQkyCisJfQorCUFDQ1VNX1NBVkUgeworCQlzaXplCQkxCisJfQorfQorCisKK3NjcmF0Y2hfcmFtIHsKKwlhZGRyZXNzCQkJMHgxMDAKKwlzaXplCTEyOAorCW1vZGVzCTAsIDEsIDIsIDMKKwkvKgorCSAqIFBlciAib3RoZXItaWQiIGV4ZWN1dGlvbiBxdWV1ZXMuICBXZSB1c2UgYW4gYXJyYXkgb2YKKwkgKiB0YWlsIHBvaW50ZXJzIGludG8gbGlzdHMgb2YgU0NCcyBzb3J0ZWQgYnkgIm90aGVyLWlkIi4KKwkgKiBUaGUgZXhlY3V0aW9uIGhlYWQgcG9pbnRlciB0aHJlYWRzIHRoZSBoZWFkIFNDQnMgZm9yCisJICogZWFjaCBsaXN0LgorCSAqLworCVdBSVRJTkdfU0NCX1RBSUxTIHsKKwkJc2l6ZQkJMzIKKwl9CisJV0FJVElOR19USURfSEVBRCB7CisJCXNpemUJCTIKKwl9CisJV0FJVElOR19USURfVEFJTCB7CisJCXNpemUJCTIKKwl9CisJLyoKKwkgKiBTQ0JJRCBvZiB0aGUgbmV4dCBTQ0IgaW4gdGhlIG5ldyBTQ0IgcXVldWUuCisJICovCisJTkVYVF9RVUVVRURfU0NCX0FERFIgeworCQlzaXplCQk0CisJfQorCS8qCisJICogaGVhZCBvZiBsaXN0IG9mIFNDQnMgdGhhdCBoYXZlCisJICogY29tcGxldGVkIGJ1dCBoYXZlIG5vdCBiZWVuCisJICogcHV0IGludG8gdGhlIHFvdXRmaWZvLgorCSAqLworCUNPTVBMRVRFX1NDQl9IRUFEIHsKKwkJc2l6ZQkJMgorCX0KKwkvKgorCSAqIFRoZSBsaXN0IG9mIGNvbXBsZXRlZCBTQ0JzIGluCisJICogdGhlIGFjdGl2ZSBETUEuCisJICovCisJQ09NUExFVEVfU0NCX0RNQUlOUFJPR19IRUFEIHsKKwkJc2l6ZQkJMgorCX0KKwkvKgorCSAqIGhlYWQgb2YgbGlzdCBvZiBTQ0JzIHRoYXQgaGF2ZQorCSAqIGNvbXBsZXRlZCBidXQgbmVlZCB0byBiZSB1cGxvYWRlZAorCSAqIHRvIHRoZSBob3N0IHByaW9yIHRvIGJlaW5nIGNvbXBsZXRlZC4KKwkgKi8KKwlDT01QTEVURV9ETUFfU0NCX0hFQUQgeworCQlzaXplCQkyCisJfQorCS8qIENvdW50aW5nIHNlbWFwaG9yZSB0byBwcmV2ZW50IG5ldyBzZWxlY3Qtb3V0cyAqLworCVFGUkVFWkVfQ09VTlQgeworCQlzaXplCQkyCisJfQorCS8qCisJICogTW9kZSB0byByZXN0b3JlIG9uIGxlZ2FjeSBpZGxlIGxvb3AgZXhpdC4KKwkgKi8KKwlTQVZFRF9NT0RFIHsKKwkJc2l6ZQkJMQorCX0KKwkvKgorCSAqIFNpbmdsZSBieXRlIGJ1ZmZlciB1c2VkIHRvIGRlc2lnbmF0ZSB0aGUgdHlwZSBvciBtZXNzYWdlCisJICogdG8gc2VuZCB0byBhIHRhcmdldC4KKwkgKi8KKwlNU0dfT1VUIHsKKwkJc2l6ZQkJMQorCX0KKwkvKiBQYXJhbWV0ZXJzIGZvciBETUEgTG9naWMgKi8KKwlETUFQQVJBTVMgeworCQlzaXplCQkxCisJCWZpZWxkCVBSRUxPQURFTgkweDgwCisJCWZpZWxkCVdJREVPREQJCTB4NDAKKwkJZmllbGQJU0NTSUVOCQkweDIwCisJCWZpZWxkCVNETUFFTgkJMHgxMAorCQlmaWVsZAlTRE1BRU5BQ0sJMHgxMAorCQlmaWVsZAlIRE1BRU4JCTB4MDgKKwkJZmllbGQJSERNQUVOQUNLCTB4MDgKKwkJZmllbGQJRElSRUNUSU9OCTB4MDQJLyogU2V0IGluZGljYXRlcyBQQ0ktPlNDU0kgKi8KKwkJZmllbGQJRklGT0ZMVVNICTB4MDIKKwkJZmllbGQJRklGT1JFU0VUCTB4MDEKKwl9CisJU0VRX0ZMQUdTIHsKKwkJc2l6ZQkJMQorCQlmaWVsZAlOT1RfSURFTlRJRklFRAkJMHg4MAorCQlmaWVsZAlOT19DREJfU0VOVAkJMHg0MAorCQlmaWVsZAlUQVJHRVRfQ01EX0lTX1RBR0dFRAkweDQwCisJCWZpZWxkCURQSEFTRQkJCTB4MjAKKwkJLyogVGFyZ2V0IGZsYWdzICovCisJCWZpZWxkCVRBUkdfQ01EX1BFTkRJTkcJMHgxMAorCQlmaWVsZAlDTURQSEFTRV9QRU5ESU5HCTB4MDgKKwkJZmllbGQJRFBIQVNFX1BFTkRJTkcJCTB4MDQKKwkJZmllbGQJU1BIQVNFX1BFTkRJTkcJCTB4MDIKKwkJZmllbGQJTk9fRElTQ09OTkVDVAkJMHgwMQorCX0KKwkvKgorCSAqIFRlbXBvcmFyeSBzdG9yYWdlIGZvciB0aGUKKwkgKiB0YXJnZXQvY2hhbm5lbC9sdW4gb2YgYQorCSAqIHJlY29ubmVjdGluZyB0YXJnZXQKKwkgKi8KKwlTQVZFRF9TQ1NJSUQgeworCQlzaXplCQkxCisJfQorCVNBVkVEX0xVTiB7CisJCXNpemUJCTEKKwl9CisJLyoKKwkgKiBUaGUgbGFzdCBidXMgcGhhc2UgYXMgc2VlbiBieSB0aGUgc2VxdWVuY2VyLiAKKwkgKi8KKwlMQVNUUEhBU0UgeworCQlzaXplCQkxCisJCWZpZWxkCUNESQkJMHg4MAorCQlmaWVsZAlJT0kJCTB4NDAKKwkJZmllbGQJTVNHSQkJMHgyMAorCQlmaWVsZAlQX0JVU0ZSRUUJMHgwMQorCQllbnVtCVBIQVNFX01BU0sgIENET3xJT098TVNHTyB7CisJCQlQX0RBVEFPVVQJMHgwLAorCQkJUF9EQVRBSU4JSU9PLAorCQkJUF9EQVRBT1VUX0RUCVBfREFUQU9VVHxNU0dPLAorCQkJUF9EQVRBSU5fRFQJUF9EQVRBSU58TVNHTywKKwkJCVBfQ09NTUFORAlDRE8sCisJCQlQX01FU0dPVVQJQ0RPfE1TR08sCisJCQlQX1NUQVRVUwlDRE98SU9PLAorCQkJUF9NRVNHSU4JQ0RPfElPT3xNU0dPCisJCX0KKwl9CisJLyoKKwkgKiBWYWx1ZSB0byAib3IiIGludG8gdGhlIFNDQlBUUlsxXSB2YWx1ZSB0bworCSAqIGluZGljYXRlIHRoYXQgYW4gZW50cnkgaW4gdGhlIFFJTkZJRk8gaXMgdmFsaWQuCisJICovCisJUU9VVEZJRk9fRU5UUllfVkFMSURfVEFHIHsKKwkJc2l6ZQkJMQorCX0KKwkvKgorCSAqIEJhc2UgYWRkcmVzcyBvZiBvdXIgc2hhcmVkIGRhdGEgd2l0aCB0aGUga2VybmVsIGRyaXZlciBpbiBob3N0CisJICogbWVtb3J5LiAgVGhpcyBpbmNsdWRlcyB0aGUgcW91dGZpZm8gYW5kIHRhcmdldCBtb2RlCisJICogaW5jb21pbmcgY29tbWFuZCBxdWV1ZS4KKwkgKi8KKwlTSEFSRURfREFUQV9BRERSIHsKKwkJc2l6ZQkJNAorCX0KKwkvKgorCSAqIFBvaW50ZXIgdG8gbG9jYXRpb24gaW4gaG9zdCBtZW1vcnkgZm9yIG5leHQKKwkgKiBwb3NpdGlvbiBpbiB0aGUgcW91dGZpZm8uCisJICovCisJUU9VVEZJRk9fTkVYVF9BRERSIHsKKwkJc2l6ZQkJNAorCX0KKwkvKgorCSAqIEtlcm5lbCBhbmQgc2VxdWVuY2VyIG9mZnNldHMgaW50byB0aGUgcXVldWUgb2YKKwkgKiBpbmNvbWluZyB0YXJnZXQgbW9kZSBjb21tYW5kIGRlc2NyaXB0b3JzLiAgVGhlCisJICogcXVldWUgaXMgZnVsbCB3aGVuIHRoZSBLRVJORUxfVFFJTlBPUyA9PSBUUUlOUE9TLgorCSAqLworCUtFUk5FTF9UUUlOUE9TIHsKKwkJc2l6ZQkJMQorCX0KKwlUUUlOUE9TIHsgICAgICAgICAgICAgICAgCisJCXNpemUJCTEKKwl9CisJQVJHXzEgeworCQlzaXplCQkxCisJCW1hc2sJU0VORF9NU0cJCTB4ODAKKwkJbWFzawlTRU5EX1NFTlNFCQkweDQwCisJCW1hc2sJU0VORF9SRUoJCTB4MjAKKwkJbWFzawlNU0dPVVRfUEhBU0VNSVMJCTB4MTAKKwkJbWFzawlFWElUX01TR19MT09QCQkweDA4CisJCW1hc2sJQ09OVF9NU0dfTE9PUF9XUklURQkweDA0CisJCW1hc2sJQ09OVF9NU0dfTE9PUF9SRUFECTB4MDMKKwkJbWFzawlDT05UX01TR19MT09QX1RBUkcJMHgwMgorCQlhbGlhcwlSRVRVUk5fMQorCX0KKwlBUkdfMiB7CisJCXNpemUJCTEKKwkJYWxpYXMJUkVUVVJOXzIKKwl9CisKKwkvKgorCSAqIFNuYXBzaG90IG9mIE1TR19PVVQgdGFrZW4gYWZ0ZXIgZWFjaCBtZXNzYWdlIGlzIHNlbnQuCisJICovCisJTEFTVF9NU0cgeworCQlzaXplCQkxCisJfQorCisJLyoKKwkgKiBTZXF1ZW5jZXMgdGhlIGtlcm5lbCBkcml2ZXIgaGFzIG9rYXllZCBmb3IgdXMuICBUaGlzIGFsbG93cworCSAqIHRoZSBkcml2ZXIgdG8gZG8gdGhpbmdzIGxpa2UgcHJldmVudCBpbml0aWF0b3Igb3IgdGFyZ2V0CisJICogb3BlcmF0aW9ucy4KKwkgKi8KKwlTQ1NJU0VRX1RFTVBMQVRFIHsKKwkJc2l6ZQkJMQorCQlmaWVsZAlNQU5VQUxDVEwJMHg0MAorCQlmaWVsZAlFTlNFTEkJCTB4MjAKKwkJZmllbGQJRU5SU0VMSQkJMHgxMAorCQlmaWVsZAlNQU5VQUxQCQkweDBDCisJCWZpZWxkCUVOQVVUT0FUTlAJMHgwMgorCQlmaWVsZAlBTFRTVElNCQkweDAxCisJfQorCisJLyoKKwkgKiBUaGUgaW5pdGlhdG9yIHNwZWNpZmllZCB0YWcgZm9yIHRoaXMgdGFyZ2V0IG1vZGUgdHJhbnNhY3Rpb24uCisJICovCisJSU5JVElBVE9SX1RBRyB7CisJCXNpemUJCTEKKwl9CisKKwlTRVFfRkxBR1MyIHsKKwkJc2l6ZQkJMQorCQlmaWVsZAlUQVJHRVRfTVNHX1BFTkRJTkcJICAweDAyCisJCWZpZWxkCVNFTEVDVE9VVF9RRlJPWkVOCSAgMHgwNAorCX0KKworCUFMTE9DRklGT19TQ0JQVFIgeworCQlzaXplCQkyCisJfQorCisJLyoKKwkgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byB3YWl0LCB3aGVuIGludGVycnVwdCBjb2FsZXNjaW5nCisJICogaXMgZW5hYmxlZCwgYmVmb3JlIGlzc3VlaW5nIGEgQ01EQ01QTFQgaW50ZXJydXB0IGZvciBhIGNvbXBsZXRlZAorCSAqIGNvbW1hbmQuCisJICovCisJSU5UX0NPQUxFU0NJTkdfVElNRVIgeworCQlzaXplCQkyCisJfQorCisJLyoKKwkgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29tbWFuZHMgdG8gY29hbGVzY2UgaW50byBhIHNpbmdsZSBpbnRlcnJ1cHQuCisJICogQWN0dWFsbHkgdGhlIDIncyBjb21wbGVtZW50IG9mIHRoYXQgdmFsdWUgdG8gc2ltcGxpZnkgc2VxdWVuY2VyCisJICogY29kZS4KKwkgKi8KKwlJTlRfQ09BTEVTQ0lOR19NQVhDTURTIHsKKwkJc2l6ZQkJMQorCX0KKworCS8qCisJICogVGhlIG1pbmltdW0gbnVtYmVyIG9mIGNvbW1hbmRzIHN0aWxsIG91dHN0YW5kaW5nIHJlcXVpcmVkCisJICogdG8gY29udGludWUgY29hbGVzY2luZyAoMidzIGNvbXBsZW1lbnQgb2YgdmFsdWUpLgorCSAqLworCUlOVF9DT0FMRVNDSU5HX01JTkNNRFMgeworCQlzaXplCQkxCisJfQorCisJLyoKKwkgKiBOdW1iZXIgb2YgY29tbWFuZHMgImluLWZsaWdodCIuCisJICovCisJQ01EU19QRU5ESU5HIHsKKwkJc2l6ZQkJMgorCX0KKworCS8qCisJICogVGhlIGNvdW50IG9mIGNvbW1hbmRzIHRoYXQgaGF2ZSBiZWVuIGNvYWxlc2NlZC4KKwkgKi8KKwlJTlRfQ09BTEVTQ0lOR19DTURDT1VOVCB7CisJCXNpemUJCTEKKwl9CisKKwkvKgorCSAqIFNpbmNlIHRoZSBIU19NQUlCT1ggaXMgc2VsZiBjbGVhcmluZywgY29weSBpdHMgY29udGVudHMgdG8KKwkgKiB0aGlzIHBvc2l0aW9uIGluIHNjcmF0Y2ggcmFtIGV2ZXJ5IHRpbWUgaXQgY2hhbmdlcy4KKwkgKi8KKwlMT0NBTF9IU19NQUlMQk9YIHsKKwkJc2l6ZQkJMQorCX0KKwkvKgorCSAqIFRhcmdldC1tb2RlIENEQiB0eXBlIHRvIENEQiBsZW5ndGggdGFibGUgdXNlZAorCSAqIGluIG5vbi1wYWNrZXRpemVkIG9wZXJhdGlvbi4KKwkgKi8KKwlDTURTSVpFX1RBQkxFIHsKKwkJc2l6ZQkJOAorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogSGFyZHdhcmUgU0NCIERlZmluaXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NjYiB7CisJYWRkcmVzcwkJCTB4MTgwCisJc2l6ZQk2NAorCW1vZGVzCTAsIDEsIDIsIDMKKwlTQ0JfUkVTSURVQUxfREFUQUNOVCB7CisJCXNpemUJNAorCQlhbGlhcwlTQ0JfQ0RCX1NUT1JFCisJCWFsaWFzCVNDQl9IT1NUX0NEQl9QVFIKKwl9CisJU0NCX1JFU0lEVUFMX1NHUFRSIHsKKwkJc2l6ZQk0CisJCWZpZWxkCVNHX0FERFJfTUFTSwkJMHhmOAkvKiBJbiB0aGUgbGFzdCBieXRlICovCisJCWZpZWxkCVNHX09WRVJSVU5fUkVTSUQJMHgwMgkvKiBJbiB0aGUgZmlyc3QgYnl0ZSAqLworCQlmaWVsZAlTR19MSVNUX05VTEwJCTB4MDEJLyogSW4gdGhlIGZpcnN0IGJ5dGUgKi8KKwl9CisJU0NCX1NDU0lfU1RBVFVTIHsKKwkJc2l6ZQkxCisJCWFsaWFzCVNDQl9IT1NUX0NEQl9MRU4KKwl9CisJU0NCX1RBUkdFVF9QSEFTRVMgeworCQlzaXplCTEKKwl9CisJU0NCX1RBUkdFVF9EQVRBX0RJUiB7CisJCXNpemUJMQorCX0KKwlTQ0JfVEFSR0VUX0lUQUcgeworCQlzaXplCTEKKwl9CisJU0NCX1NFTlNFX0JVU0FERFIgeworCQkvKgorCQkgKiBPbmx5IHZhbGlkIGlmIENEQiBsZW5ndGggaXMgbGVzcyB0aGFuIDEzIGJ5dGVzIG9yCisJCSAqIHdlIGFyZSB1c2luZyBhIENEQiBwb2ludGVyLiAgT3RoZXJ3aXNlIGNvbnRhaW5zCisJCSAqIHRoZSBsYXN0IDQgYnl0ZXMgb2YgZW1iZWRkZWQgY2RiIGluZm9ybWF0aW9uLgorCQkgKi8KKwkJc2l6ZQk0CisJCWFsaWFzCVNDQl9ORVhUX0NPTVBMRVRFCisJfQorCVNDQl9UQUcgeworCQlhbGlhcwlTQ0JfRklGT19VU0VfQ09VTlQKKwkJc2l6ZQkyCisJfQorCVNDQl9DT05UUk9MIHsKKwkJc2l6ZQkxCisJCWZpZWxkCVRBUkdFVF9TQ0IJMHg4MAorCQlmaWVsZAlESVNDRU5CCQkweDQwCisJCWZpZWxkCVRBR19FTkIJCTB4MjAKKwkJZmllbGQJTUtfTUVTU0FHRQkweDEwCisJCWZpZWxkCVNUQVRVU19SQ1ZECTB4MDgKKwkJZmllbGQJRElTQ09OTkVDVEVECTB4MDQKKwkJZmllbGQJU0NCX1RBR19UWVBFCTB4MDMKKwl9CisJU0NCX1NDU0lJRCB7CisJCXNpemUJMQorCQlmaWVsZAlUSUQJMHhGMAorCQlmaWVsZAlPSUQJMHgwRgorCX0KKwlTQ0JfTFVOIHsKKwkJc2l6ZQkxCisJCWZpZWxkCUxJRAkweGZmCisJfQorCVNDQl9UQVNLX0FUVFJJQlVURSB7CisJCXNpemUJMQorCQkvKgorCQkgKiBPdmVybG9hZGVkIGZpZWxkIGZvciBub24tcGFja2V0aXplZCAKKwkJICogaWdub3JlIHdpZGUgcmVzaWR1ZSBtZXNzYWdlIGhhbmRsaW5nLgorCQkgKi8KKwkJZmllbGQJU0NCX1hGRVJMRU5fT0RECTB4MDEKKwl9CisJU0NCX0NEQl9MRU4geworCQlzaXplCTEKKwkJZmllbGQJU0NCX0NEQl9MRU5fUFRSCTB4ODAJLyogQ0RCIGluIGhvc3QgbWVtb3J5ICovCisJfQorCVNDQl9UQVNLX01BTkFHRU1FTlQgeworCQlzaXplCTEKKwl9CisJU0NCX0RBVEFQVFIgeworCQlzaXplCTgKKwl9CisJU0NCX0RBVEFDTlQgeworCQkvKgorCQkgKiBUaGUgbGFzdCBieXRlIGlzIHJlYWxseSB0aGUgaGlnaCBhZGRyZXNzIGJpdHMgZm9yCisJCSAqIHRoZSBkYXRhIGFkZHJlc3MuCisJCSAqLworCQlzaXplCTQKKwkJZmllbGQJU0dfTEFTVF9TRUcJCTB4ODAJLyogSW4gdGhlIGZvdXJ0aCBieXRlICovCisJCWZpZWxkCVNHX0hJR0hfQUREUl9CSVRTCTB4N0YJLyogSW4gdGhlIGZvdXJ0aCBieXRlICovCisJfQorCVNDQl9TR1BUUiB7CisJCXNpemUJNAorCQlmaWVsZAlTR19TVEFUVVNfVkFMSUQJMHgwNAkvKiBJbiB0aGUgZmlyc3QgYnl0ZSAqLworCQlmaWVsZAlTR19GVUxMX1JFU0lECTB4MDIJLyogSW4gdGhlIGZpcnN0IGJ5dGUgKi8KKwkJZmllbGQJU0dfTElTVF9OVUxMCTB4MDEJLyogSW4gdGhlIGZpcnN0IGJ5dGUgKi8KKwl9CisJU0NCX0JVU0FERFIgeworCQlzaXplCTQKKwl9CisJU0NCX05FWFQgeworCQlhbGlhcwlTQ0JfTkVYVF9TQ0JfQlVTQUREUgorCQlzaXplCTIKKwl9CisJU0NCX05FWFQyIHsKKwkJc2l6ZQkyCisJfQorCVNDQl9TUEFSRSB7CisJCXNpemUJOAorCQlhbGlhcwlTQ0JfUEtUX0xVTgorCX0KKwlTQ0JfRElTQ09OTkVDVEVEX0xJU1RTIHsKKwkJc2l6ZQk4CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3QgTUtfTUVTU0FHRV9CSVRfT0ZGU0VUCTQKK2NvbnN0IFRJRF9TSElGVAkJNAorY29uc3QgVEFSR0VUX0NNRF9DTVBMVAkweGZlCitjb25zdCBJTlZBTElEX0FERFIJMHg4MAorI2RlZmluZSBTQ0JfTElTVF9OVUxMCTB4ZmYKKyNkZWZpbmUgUU9VVEZJRk9fRU5UUllfVkFMSURfVE9HR0xFCTB4ODAKKworY29uc3QgQ0NTR0FERFJfTUFYCTB4ODAKK2NvbnN0IENDU0NCQUREUl9NQVgJMHg4MAorY29uc3QgQ0NTR1JBTV9NQVhTRUdTCTE2CisKKy8qIFNlbGVjdGlvbiBUaW1lb3V0IFRpbWVyIENvbnN0YW50cyAqLworY29uc3QgU1RJTUVTRUxfU0hJRlQJMworY29uc3QgU1RJTUVTRUxfTUlOCTB4MTgKK2NvbnN0IFNUSU1FU0VMX0JVR19BREoJMHg4CisKKy8qIFdEVFIgTWVzc2FnZSB2YWx1ZXMgKi8KK2NvbnN0IEJVU184X0JJVAkJCTB4MDAKK2NvbnN0IEJVU18xNl9CSVQJCTB4MDEKK2NvbnN0IEJVU18zMl9CSVQJCTB4MDIKKworLyogT2Zmc2V0IG1heGltdW1zICovCitjb25zdCBNQVhfT0ZGU0VUCQkweGZlCitjb25zdCBNQVhfT0ZGU0VUX1BBQ0VECQkweGZlCitjb25zdCBNQVhfT0ZGU0VUX1BBQ0VEX0JVRwkweDdmCisvKgorICogU29tZSAxNjAgZGV2aWNlcyBpbmNvcnJlY3RseSBhY2NlcHQgMHhmZSBhcyBhCisgKiBzeW5jIG9mZnNldCwgYnV0IHdpbGwgb3ZlcnJ1biB0aGlzIHZhbHVlLiAgTGltaXQKKyAqIHRvIDB4N2YgZm9yIHNwZWVkIGxvd2VyIHRoYW4gVTMyMCB3aGljaCB3aWxsCisgKiBhdm9pZCB0aGUgcGVyc2lzdGVudCBzeW5jIG9mZnNldCBvdmVycnVucy4KKyAqLworY29uc3QgTUFYX09GRlNFVF9OT05fUEFDRUQJMHg3ZgorY29uc3QgSE9TVF9NU0cJCQkweGZmCisKKy8qCisgKiBUaGUgc2l6ZSBvZiBvdXIgc2Vuc2UgYnVmZmVycy4KKyAqIFNlbnNlIGJ1ZmZlciBtYXBwaW5nIGNhbiBiZSBoYW5kbGVkIGluIGVpdGhlciBvZiB0d28gd2F5cy4KKyAqIFRoZSBmaXJzdCBpcyB0byBhbGxvY2F0ZSBhIGRtYW1hcCBmb3IgZWFjaCB0cmFuc2FjdGlvbi4KKyAqIERlcGVuZGluZyBvbiB0aGUgYXJjaGl0ZWN0dXJlLCBkbWFtYXBzIGNhbiBiZSBjb3N0bHkuIFRoZQorICogYWx0ZXJuYXRpdmUgaXMgdG8gc3RhdGljYWxseSBtYXAgdGhlIGJ1ZmZlcnMgaW4gbXVjaCB0aGUgc2FtZQorICogd2F5IHdlIGhhbmRsZSBvdXIgc2NhdHRlciBnYXRoZXIgbGlzdHMuICBUaGUgZHJpdmVyIGltcGxlbWVudHMKKyAqIHRoZSBsYXRlci4KKyAqLworY29uc3QgQUhEX1NFTlNFX0JVRlNJWkUJCTI1NgorCisvKiBUYXJnZXQgbW9kZSBjb21tYW5kIHByb2Nlc3NpbmcgY29uc3RhbnRzICovCitjb25zdCBDTURfR1JPVVBfQ09ERV9TSElGVAkweDA1CisKK2NvbnN0IFNUQVRVU19CVVNZCQkweDA4Citjb25zdCBTVEFUVVNfUVVFVUVfRlVMTAkJMHgyOAorY29uc3QgU1RBVFVTX1BLVF9TRU5TRQkJMHhGRgorY29uc3QgVEFSR0VUX0RBVEFfSU4JCTEKKworY29uc3QgU0NCX1RSQU5TRkVSX1NJWkVfRlVMTF9MVU4JNTYKK2NvbnN0IFNDQl9UUkFOU0ZFUl9TSVpFXzFCWVRFX0xVTgk0OAorLyogUEtUX09WRVJSVU5fQlVGU0laRSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMjU2IGxlc3MgdGhhbiA2NEsgKi8KK2NvbnN0IFBLVF9PVkVSUlVOX0JVRlNJWkUJNTEyCisKKy8qCisgKiBUaW1lciBwYXJhbWV0ZXJzLgorICovCitjb25zdCBBSERfVElNRVJfVVNfUEVSX1RJQ0sJMjUKK2NvbnN0IEFIRF9USU1FUl9NQVhfVElDS1MJMHhGRkZGCitjb25zdCBBSERfVElNRVJfTUFYX1VTCQkoQUhEX1RJTUVSX01BWF9USUNLUyAqIEFIRF9USU1FUl9VU19QRVJfVElDSykKKworLyoKKyAqIERvd25sb2FkZWQgKGtlcm5lbCBpbnNlcnRlZCkgY29uc3RhbnRzCisgKi8KK2NvbnN0IFNHX1BSRUZFVENIX0NOVCBkb3dubG9hZAorY29uc3QgU0dfUFJFRkVUQ0hfQ05UX0xJTUlUIGRvd25sb2FkCitjb25zdCBTR19QUkVGRVRDSF9BTElHTl9NQVNLIGRvd25sb2FkCitjb25zdCBTR19QUkVGRVRDSF9BRERSX01BU0sgZG93bmxvYWQKK2NvbnN0IFNHX1NJWkVPRiBkb3dubG9hZAorY29uc3QgUEtUX09WRVJSVU5fQlVGT0ZGU0VUIGRvd25sb2FkCitjb25zdCBTQ0JfVFJBTlNGRVJfU0laRQlkb3dubG9hZAorCisvKgorICogQklPUyBTQ0Igb2Zmc2V0cworICovCitjb25zdCBOVlJBTV9TQ0JfT0ZGU0VUCTB4MkMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHguc2VxIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5zZXEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUzMzliYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHguc2VxCkBAIC0wLDAgKzEsMjA1OCBAQAorLyoKKyAqIEFkYXB0ZWMgVTMyMCBkZXZpY2UgZHJpdmVyIGZpcm13YXJlIGZvciBMaW51eCBhbmQgRnJlZUJTRC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMjAwMSBKdXN0aW4gVC4gR2liYnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCitWRVJTSU9OID0gIiRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5zZXEjOTkgJCIKK1BBVENIX0FSR19MSVNUID0gInN0cnVjdCBhaGRfc29mdGMgKmFoZCIKK1BSRUZJWCA9ICJhaGRfIgorCisjaW5jbHVkZSAiYWljNzl4eC5yZWciCisjaW5jbHVkZSAic2NzaV9tZXNzYWdlLmgiCisKK3Jlc3RhcnQ6CitpZiAoKGFoZC0+YnVncyAmIEFIRF9JTlRDT0xMSVNJT05fQlVHKSAhPSAwKSB7CisJdGVzdAlTRVFJTlRDT0RFLCAweEZGIGp6IGlkbGVfbG9vcDsKKwlTRVRfU0VRSU5UQ09ERShOT19TRVFJTlQpCit9CisKK2lkbGVfbG9vcDoKKworCWlmICgoYWhkLT5idWdzICYgQUhEX0lOVENPTExJU0lPTl9CVUcpICE9IDApIHsKKwkJLyoKKwkJICogQ29udmVydCBFUlJPUiBzdGF0dXMgaW50byBhIHNlcXVlbmNlcgorCQkgKiBpbnRlcnJ1cHQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIGFuCisJCSAqIGludGVycnVwdCBjb2xsaXNpb24gb24gdGhlIGhhcmR3YXJlCisJCSAqIHNldHRpbmcgb2YgSFdFUlIuCisJCSAqLworCQl0ZXN0CUVSUk9SLCAweEZGIGp6IG5vX2Vycm9yX3NldDsKKwkJU0VUX1NFUUlOVENPREUoU0FXX0hXRVJSKQorbm9fZXJyb3Jfc2V0OgorCX0KKwlTRVRfTU9ERShNX1NDU0ksIE1fU0NTSSkKKwl0ZXN0CVNDU0lTRVEwLCBFTlNFTE98RU5BUkJPIGpueiBpZGxlX2xvb3BfY2hlY2tidXM7CisJdGVzdAlTRVFfRkxBR1MyLCBTRUxFQ1RPVVRfUUZST1pFTiBqbnogaWRsZV9sb29wX2NoZWNrYnVzOworCWNtcAlXQUlUSU5HX1RJRF9IRUFEWzFdLCBTQ0JfTElTVF9OVUxMIGplIGlkbGVfbG9vcF9jaGVja2J1czsKKwkvKgorCSAqIEVOU0VMTyBpcyBjbGVhcmVkIGJ5IGEgU0VMRE8sIHNvIHdlIG11c3QgdGVzdCBmb3IgU0VMRE8KKwkgKiBvbmUgbGFzdCB0aW1lLgorCSAqLworQkVHSU5fQ1JJVElDQUw7CisJdGVzdAlTU1RBVDAsIFNFTERPIGpueiBzZWxlY3Rfb3V0OworRU5EX0NSSVRJQ0FMOworCWNhbGwJc3RhcnRfc2VsZWN0aW9uOworaWRsZV9sb29wX2NoZWNrYnVzOgorQkVHSU5fQ1JJVElDQUw7CisJdGVzdAlTU1RBVDAsIFNFTERPIGpueiBzZWxlY3Rfb3V0OworRU5EX0NSSVRJQ0FMOworCXRlc3QJU1NUQVQwLCBTRUxESSBqbnogc2VsZWN0X2luOworCXRlc3QJU0NTSVBIQVNFLCB+REFUQV9QSEFTRV9NQVNLIGp6IGlkbGVfbG9vcF9jaGVja19ub25wYWNrcmVxOworCXRlc3QJU0NTSVNJR08sIEFUTk8ganogaWRsZV9sb29wX2NoZWNrX25vbnBhY2tyZXE7CisJY2FsbAl1bmV4cGVjdGVkX25vbnBrdF9waGFzZV9maW5kX2N0eHQ7CitpZGxlX2xvb3BfY2hlY2tfbm9ucGFja3JlcToKKwl0ZXN0CVNTVEFUMiwgTk9OUEFDS1JFUSBqeiAuICsgMjsKKwljYWxsCXVuZXhwZWN0ZWRfbm9ucGt0X3BoYXNlX2ZpbmRfY3R4dDsKKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9GQUlOVF9MRURfQlVHKSAhPSAwKSB7CisJCWFuZAlBLCBGSUZPMEZSRUV8RklGTzFGUkVFLCBERkZTVEFUOworCQljbXAJQSwgRklGTzBGUkVFfEZJRk8xRlJFRSBqbmUgLiArIDM7CisJCWFuZAlTQkxLQ1RMLCB+RElBR0xFREVOfERJQUdMRURPTjsKKwkJam1wCS4gKyAyOworCQlvcglTQkxLQ1RMLCBESUFHTEVERU58RElBR0xFRE9OOworCX0KKwljYWxsCWlkbGVfbG9vcF9nc2ZpZm9faW5fc2NzaV9tb2RlOworCWNhbGwJaWRsZV9sb29wX3NlcnZpY2VfZmlmb3M7CisJY2FsbAlpZGxlX2xvb3BfY2NoYW47CisJam1wCWlkbGVfbG9vcDsKKworQkVHSU5fQ1JJVElDQUw7CitpZGxlX2xvb3BfZ3NmaWZvOgorCVNFVF9NT0RFKE1fU0NTSSwgTV9TQ1NJKQoraWRsZV9sb29wX2dzZmlmb19pbl9zY3NpX21vZGU6CisJdGVzdAlMUUlTVEFUMiwgTFFJR1NBVkFJTCBqeiByZXR1cm47CisJLyoKKwkgKiBXZSBoYXZlIHJlY2VpdmVkIGdvb2Qgc3RhdHVzIGZvciB0aGlzIHRyYW5zYWN0aW9uLiAgVGhlcmUgbWF5CisJICogc3RpbGwgYmUgZGF0YSBpbiBvdXIgRklGT3MgZHJhaW5pbmcgdG8gdGhlIGhvc3QuICBDb21wbGV0ZQorCSAqIHRoZSBTQ0Igb25seSBpZiBhbGwgZGF0YSBoYXMgdHJhbnNmZXJyZWQgdG8gdGhlIGhvc3QuCisJICovCitnb29kX3N0YXR1c19JVV9kb25lOgorCWJtb3YJU0NCUFRSLCBHU0ZJRk8sIDI7CisJY2xyCVNDQl9TQ1NJX1NUQVRVUzsKKwkvKgorCSAqIElmIGEgY29tbWFuZCBjb21wbGV0ZWQgYmVmb3JlIGFuIGF0dGVtcHRlZCB0YXNrIG1hbmFnZW1lbnQKKwkgKiBmdW5jdGlvbiBjb21wbGV0ZWQsIG5vdGlmeSB0aGUgaG9zdCBhZnRlciBkaXNhYmxpbmcgYW55CisJICogcGVuZGluZyBzZWxlY3Qtb3V0cy4KKwkgKi8KKwl0ZXN0CVNDQl9UQVNLX01BTkFHRU1FTlQsIDB4RkYganogZ3NmaWZvX2NvbXBsZXRlX25vcm1hbGx5OworCXRlc3QJU1NUQVQwLCBTRUxET3xTRUxJTkdPIGpueiAuICsgMjsKKwlhbmQJU0NTSVNFUTAsIH5FTlNFTE87CisJU0VUX1NFUUlOVENPREUoVEFTS01HTVRfQ01EX0NNUExUX09LQVkpCitnc2ZpZm9fY29tcGxldGVfbm9ybWFsbHk6CisJb3IJU0NCX0NPTlRST0wsIFNUQVRVU19SQ1ZEOworCisJLyoKKwkgKiBTaW5jZSB0aGlzIHN0YXR1cyBkaWQgbm90IGNvbnN1bWUgYSBGSUZPLCB3ZSBoYXZlIHRvCisJICogYmUgYSBiaXQgbW9yZSBkaWxsaWdlbnQgaW4gaG93IHdlIGNoZWNrIGZvciBGSUZPcyBwZXJ0YWluaW5nCisJICogdG8gdGhpcyB0cmFuc2FjdGlvbi4gIFRoZXJlIGFyZSB0d28gc3RhdGVzIHRoYXQgYSBGSUZPIHN0aWxsCisJICogdHJhbnNmZXJyaW5nIGRhdGEgbWF5IGJlIGluLgorCSAqCisJICogMSkgQ29uZmlndXJlZCBhbmQgZHJhaW5pbmcgdG8gdGhlIGhvc3QsIHdpdGggYSBGSUZPIGhhbmRsZXIuCisJICogMikgUGVuZGluZyBjZmc0ZGF0YSwgZmlmbyBub3QgZW1wdHkuCisJICoKKwkgKiBDYXNlIDEgY2FuIGJlIGRldGVjdGVkIGJ5IG5vdGljaW5nIGEgbm9uLXplcm8gRklGTyBhY3RpdmUKKwkgKiBjb3VudCBpbiB0aGUgU0NCLiAgSW4gdGhpcyBjYXNlLCB3ZSBhbGxvdyB0aGUgcm91dGluZSBzZXJ2aWNpbmcKKwkgKiB0aGUgRklGTyB0byBjb21wbGV0ZSB0aGUgU0NCLgorCSAqIAorCSAqIENhc2UgMiBpbXBsaWVzIGVpdGhlciBhIHBlbmRpbmcgb3IgeWV0IHRvIG9jY3VyIHNhdmUgZGF0YQorCSAqIHBvaW50ZXJzIGZvciB0aGlzIHNhbWUgY29udGV4dCBpbiB0aGUgb3RoZXIgRklGTy4gIFNvLCBpZgorCSAqIHdlIGRldGVjdCBjYXNlIDEsIHdlIHdpbGwgcHJvcGVybHkgZGVmZXIgdGhlIHBvc3Qgb2YgdGhlIFNDQgorCSAqIGFuZCBhY2hpZXZlIHRoZSBkZXNpcmVkIHJlc3VsdC4gIFRoZSBwZW5kaW5nIGNmZzRkYXRhIHdpbGwKKwkgKiBub3RpY2UgdGhhdCBzdGF0dXMgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIGNvbXBsZXRlIHRoZSBTQ0IuCisJICovCisJdGVzdAlTQ0JfRklGT19VU0VfQ09VTlQsIDB4RkYgam56IGlkbGVfbG9vcF9nc2ZpZm9faW5fc2NzaV9tb2RlOworCWNhbGwJY29tcGxldGU7CitFTkRfQ1JJVElDQUw7CisJam1wCWlkbGVfbG9vcF9nc2ZpZm9faW5fc2NzaV9tb2RlOworCitpZGxlX2xvb3Bfc2VydmljZV9maWZvczoKKwlTRVRfTU9ERShNX0RGRjAsIE1fREZGMCkKKwl0ZXN0CUxPTkdKTVBfQUREUlsxXSwgSU5WQUxJRF9BRERSIGpueiBpZGxlX2xvb3BfbmV4dF9maWZvOworCWNhbGwJbG9uZ2ptcDsKK2lkbGVfbG9vcF9uZXh0X2ZpZm86CisJU0VUX01PREUoTV9ERkYxLCBNX0RGRjEpCisJdGVzdAlMT05HSk1QX0FERFJbMV0sIElOVkFMSURfQUREUiBqeiBsb25nam1wOworcmV0dXJuOgorCXJldDsKKworaWRsZV9sb29wX2NjaGFuOgorCVNFVF9NT0RFKE1fQ0NIQU4sIE1fQ0NIQU4pCisJdGVzdAlRT0ZGX0NUTFNUQSwgSFNfTUFJTEJPWF9BQ1QganoJaHNfbWFpbGJveF9lbXB0eTsKKwlvcglRT0ZGX0NUTFNUQSwgSFNfTUFJTEJPWF9BQ1Q7CisJbW92CUxPQ0FMX0hTX01BSUxCT1gsIEhTX01BSUxCT1g7Citoc19tYWlsYm94X2VtcHR5OgorQkVHSU5fQ1JJVElDQUw7CisJdGVzdAlDQ1NDQkNUTCwgQ0NBUlJFTnxDQ1NDQkVOIGp6IHNjYmRtYV9pZGxlOworCXRlc3QJQ0NTQ0JDVEwsIENDU0NCRElSIGpueiBmZXRjaF9uZXdfc2NiX2lucHJvZzsKKwl0ZXN0CUNDU0NCQ1RMLCBDQ1NDQkRPTkUganogcmV0dXJuOworRU5EX0NSSVRJQ0FMOworCS8qIEZBTExUSFJPVUdIICovCitzY2JkbWFfdG9ob3N0X2RvbmU6CisJdGVzdAlDQ1NDQkNUTCwgQ0NBUlJFTiBqeiBmaWxsX3FvdXRmaWZvX2RtYWRvbmU7CisJLyoKKwkgKiBBbiBTQ0IgaGFzIGJlZW4gc3VjY2VzZnVsbHkgdXBsb2FkZWQgdG8gdGhlIGhvc3QuCisJICogSWYgdGhlIFNDQiB3YXMgdXBsb2FkZWQgZm9yIHNvbWUgcmVhc29uIG90aGVyIHRoYW4KKwkgKiBiYWQgU0NTSSBzdGF0dXMgKGN1cnJlbnRseSBvbmx5IGZvciB1bmRlcnJ1bnMpLCB3ZQorCSAqIHF1ZXVlIHRoZSBTQ0IgZm9yIG5vcm1hbCBjb21wbGV0aW9uLiAgT3RoZXJ3aXNlLCB3ZQorCSAqIHdhaXQgdW50aWwgYW55IHNlbGVjdC1vdXQgYWN0aXZpdHkgaGFzIGhhbHRlZCwgYW5kCisJICogdGhlbiBub3RpZnkgdGhlIGhvc3Qgc28gdGhhdCB0aGUgdHJhbnNhY3Rpb24gY2FuIGJlCisJICogZGVhbHQgd2l0aC4KKwkgKi8KKwl0ZXN0CVNDQl9TQ1NJX1NUQVRVUywgMHhmZiBqbnogc2NiZG1hX25vdGlmeV9ob3N0OworCWFuZAlDQ1NDQkNUTCwgfihDQ0FSUkVOfENDU0NCRU4pOworCWJtb3YJQ09NUExFVEVfRE1BX1NDQl9IRUFELCBTQ0JfTkVYVF9DT01QTEVURSwgMjsKKwlibW92CVNDQl9ORVhUX0NPTVBMRVRFLCBDT01QTEVURV9TQ0JfSEVBRCwgMjsKKwlibW92CUNPTVBMRVRFX1NDQl9IRUFELCBTQ0JQVFIsIDIgcmV0Oworc2NiZG1hX25vdGlmeV9ob3N0OgorCVNFVF9NT0RFKE1fU0NTSSwgTV9TQ1NJKQorCXRlc3QJU0NTSVNFUTAsIEVOU0VMTyBqbnogcmV0dXJuOworCXRlc3QJU1NUQVQwLCAoU0VMRE98U0VMSU5HTykgam56IHJldHVybjsKKwlTRVRfTU9ERShNX0NDSEFOLCBNX0NDSEFOKQorCS8qCisJICogUmVtb3ZlIFNDQiBhbmQgbm90aWZ5IGhvc3QuCisJICovCisJYW5kCUNDU0NCQ1RMLCB+KENDQVJSRU58Q0NTQ0JFTik7CisJYm1vdglDT01QTEVURV9ETUFfU0NCX0hFQUQsIFNDQl9ORVhUX0NPTVBMRVRFLCAyOworCVNFVF9TRVFJTlRDT0RFKEJBRF9TQ0JfU1RBVFVTKQorCXJldDsKK2ZpbGxfcW91dGZpZm9fZG1hZG9uZToKKwlhbmQJQ0NTQ0JDVEwsIH4oQ0NBUlJFTnxDQ1NDQkVOKTsKKwljYWxsCXFvdXRmaWZvX3VwZGF0ZWQ7CisJbXZpCUNPTVBMRVRFX1NDQl9ETUFJTlBST0dfSEVBRFsxXSwgU0NCX0xJU1RfTlVMTDsKKwlibW92CVFPVVRGSUZPX05FWFRfQUREUiwgU0NCSEFERFIsIDQ7CisJdGVzdAlRT0ZGX0NUTFNUQSwgU0RTQ0JfUk9MTE9WUiBqeiByZXR1cm47CisJYm1vdglRT1VURklGT19ORVhUX0FERFIsIFNIQVJFRF9EQVRBX0FERFIsIDQ7CisJeG9yCVFPVVRGSUZPX0VOVFJZX1ZBTElEX1RBRywgUU9VVEZJRk9fRU5UUllfVkFMSURfVE9HR0xFIHJldDsKKworcW91dGZpZm9fdXBkYXRlZDoKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBtb3JlIGNvbW1hbmRzIHdhaXRpbmcgdG8gYmUgZG1hJ2VkCisJICogdG8gdGhlIGhvc3QsIGFsd2F5cyBjb2FsZXNjZS4gIE90aGVyd2lzZSBob25vciB0aGUKKwkgKiBob3N0J3Mgd2lzaGVzLgorCSAqLworCWNtcAlDT01QTEVURV9ETUFfU0NCX0hFQURbMV0sIFNDQl9MSVNUX05VTEwgam5lIGNvYWxlc2NlX2J5X2NvdW50OworCWNtcAlDT01QTEVURV9TQ0JfSEVBRFsxXSwgU0NCX0xJU1RfTlVMTCBqbmUgY29hbGVzY2VfYnlfY291bnQ7CisJdGVzdAlMT0NBTF9IU19NQUlMQk9YLCBFTklOVF9DT0FMRVNDRSBqeiBpc3N1ZV9jbWRjbXBsdDsKKworCS8qCisJICogSWYgd2UgaGF2ZSByZWxhdGl2ZWx5IGZldyBjb21tYW5kcyBvdXRzdGFuZGluZywgZG9uJ3QKKwkgKiBib3RoZXIgd2FpdGluZyBmb3IgYW5vdGhlciBjb21tYW5kIHRvIGNvbXBsZXRlLgorCSAqLworCXRlc3QJQ01EU19QRU5ESU5HWzFdLCAweEZGIGpueiBjb2FsZXNjZV9ieV9jb3VudDsKKwkvKiBBZGQgLTEgc28gdGhhdCBqbmMgbWVhbnMgPD0gbm90IGp1c3QgPCAqLworCWFkZAlBLCAtMSwgSU5UX0NPQUxFU0NJTkdfTUlOQ01EUzsKKwlhZGQJTk9ORSwgQSwgQ01EU19QRU5ESU5HOworCWpuYwlpc3N1ZV9jbWRjbXBsdDsKKwkKKwkvKgorCSAqIElmIGNvYWxlc2NpbmcsIG9ubHkgY29hbGVzY2UgdXAgdG8gdGhlIGxpbWl0CisJICogcHJvdmlkZWQgYnkgdGhlIGhvc3QgZHJpdmVyLgorCSAqLworY29hbGVzY2VfYnlfY291bnQ6CisJbW92CUEsIElOVF9DT0FMRVNDSU5HX01BWENNRFM7CisJYWRkCU5PTkUsIEEsIElOVF9DT0FMRVNDSU5HX0NNRENPVU5UOworCWpjCWlzc3VlX2NtZGNtcGx0OworCS8qCisJICogSWYgdGhlIHRpbWVyIGlzIG5vdCBjdXJyZW50bHkgYWN0aXZlLAorCSAqIGZpcmUgaXQgdXAuCisJICovCisJdGVzdAlJTlRDVEwsIFNXVE1JTlRNQVNLIGp6IHJldHVybjsKKwlibW92CVNXVElNRVIsIElOVF9DT0FMRVNDSU5HX1RJTUVSLCAyOworCW12aQlDTFJTRVFJTlRTVEFULCBDTFJTRVFfU1dUTVJUTzsKKwlvcglJTlRDVEwsIFNXVE1JTlRFTnxTV1RJTUVSX1NUQVJUOworCWFuZAlJTlRDVEwsIH5TV1RNSU5UTUFTSyByZXQ7CisKK2lzc3VlX2NtZGNtcGx0OgorCW12aQlJTlRTVEFULCBDTURDTVBMVDsKKwljbHIJSU5UX0NPQUxFU0NJTkdfQ01EQ09VTlQ7CisJb3IJSU5UQ1RMLCBTV1RNSU5UTUFTSyByZXQ7CisKK0JFR0lOX0NSSVRJQ0FMOworZmV0Y2hfbmV3X3NjYl9pbnByb2c6CisJdGVzdAlDQ1NDQkNUTCwgQVJSRE9ORSBqeiByZXR1cm47CitmZXRjaF9uZXdfc2NiX2RvbmU6CisJYW5kCUNDU0NCQ1RMLCB+KENDQVJSRU58Q0NTQ0JFTik7CisJYm1vdglSRUcwLCBTQ0JQVFIsIDI7CisJY2xyCUE7CisJYWRkCUNNRFNfUEVORElORywgMTsKKwlhZGMJQ01EU19QRU5ESU5HWzFdLCBBOworCWlmICgoYWhkLT5idWdzICYgQUhEX1BLVF9MVU5fQlVHKSAhPSAwKSB7CisJCS8qCisJCSAqICJTaG9ydCBMdW5zIiBhcmUgbm90IHBsYWNlZCBpbnRvIG91dGdvaW5nIExRCisJCSAqIHBhY2tldHMgaW4gdGhlIGNvcnJlY3QgYnl0ZSBvcmRlci4gIFVzZSBhIGZ1bGwKKwkJICogc2l6ZWQgbHVuIGZpZWxkIGluc3RlYWQgYW5kIGZpbGwgaXQgd2l0aCB0aGUKKwkJICogb25lIGJ5dGUgb2YgbHVuIGluZm9ybWF0aW9uIHdlIHN1cHBvcnQuCisJCSAqLworCQltb3YJU0NCX1BLVF9MVU5bNl0sIFNDQl9MVU47CisJfQorCS8qCisJICogVGhlIEZJRk8gdXNlIGNvdW50IGZpZWxkIGlzIHNoYXJlZCB3aXRoIHRoZQorCSAqIHRhZyBzZXQgYnkgdGhlIGhvc3Qgc28gdGhhdCBvdXIgU0NCIGRtYSBlbmdpbmUKKwkgKiBrbm93cyB0aGUgY29ycmVjdCBsb2NhdGlvbiB0byBzdG9yZSB0aGUgU0NCLgorCSAqIFNldCBpdCB0byB6ZXJvIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBTQ0IuCisJICovCisJY2xyCVNDQl9GSUZPX1VTRV9DT1VOVDsKKwkvKiBVcGRhdGUgdGhlIG5leHQgU0NCIGFkZHJlc3MgdG8gZG93bmxvYWQuICovCisJYm1vdglORVhUX1FVRVVFRF9TQ0JfQUREUiwgU0NCX05FWFRfU0NCX0JVU0FERFIsIDQ7CisJbXZpCVNDQl9ORVhUWzFdLCBTQ0JfTElTVF9OVUxMOworCW12aQlTQ0JfTkVYVDJbMV0sIFNDQl9MSVNUX05VTEw7CisJLyogSW5jcmVtZW50IG91ciBwb3NpdGlvbiBpbiB0aGUgUUlORklGTy4gKi8KKwltb3YJTk9ORSwgU05TQ0JfUU9GRjsKKwkvKgorCSAqIFNDQnMgdGhhdCB3YW50IHRvIHNlbmQgbWVzc2FnZXMgYXJlIGFsd2F5cworCSAqIHF1ZXVlZCBpbmRlcGVuZGVudGx5LiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhleQorCSAqIGFyZSBhdCB0aGUgaGVhZCBvZiB0aGUgU0NCIGxpc3QgdG8gc2VsZWN0IG91dAorCSAqIHRvIGEgdGFyZ2V0IGFuZCB3ZSB3aWxsIHNlZSB0aGUgTUtfTUVTU0FHRSBmbGFnLgorCSAqLworCXRlc3QJU0NCX0NPTlRST0wsIE1LX01FU1NBR0Ugam56IGZpcnN0X25ld190YXJnZXRfc2NiOworCXNocglTSU5ERVgsIDMsIFNDQl9TQ1NJSUQ7CisJYW5kCVNJTkRFWCwgfjB4MTsKKwltdmkJU0lOREVYWzFdLCAoV0FJVElOR19TQ0JfVEFJTFMgPj4gOCk7CisJYm1vdglESU5ERVgsIFNJTkRFWCwgMjsKKwlibW92CVNDQlBUUiwgU0lORElSLCAyOworCWJtb3YJRElORElSLCBSRUcwLCAyOworCWNtcAlTQ0JQVFJbMV0sIFNDQl9MSVNUX05VTEwgamUgZmlyc3RfbmV3X3RhcmdldF9zY2I7CisJYm1vdglTQ0JfTkVYVCwgUkVHMCwgMiByZXQ7CitmaXJzdF9uZXdfdGFyZ2V0X3NjYjoKKwljbXAJV0FJVElOR19USURfSEVBRFsxXSwgU0NCX0xJU1RfTlVMTCBqZSBmaXJzdF9uZXdfc2NiOworCWJtb3YJU0NCUFRSLCBXQUlUSU5HX1RJRF9UQUlMLCAyOworCWJtb3YJU0NCX05FWFQyLCBSRUcwLCAyOworCWJtb3YJV0FJVElOR19USURfVEFJTCwgUkVHMCwgMiByZXQ7CitmaXJzdF9uZXdfc2NiOgorCWJtb3YJV0FJVElOR19USURfSEVBRCwgUkVHMCwgMjsKKwlibW92CVdBSVRJTkdfVElEX1RBSUwsIFJFRzAsIDIgcmV0OworRU5EX0NSSVRJQ0FMOworCitzY2JkbWFfaWRsZToKKwkvKgorCSAqIEdpdmUgcHJlY2VkZW5jZSB0byBkb3dubG9hZGluZyBuZXcgU0NCcyB0byBleGVjdXRlCisJICogdW5sZXNzIHNlbGVjdC1vdXRzIGFyZSBjdXJyZW50bHkgZnJvemVuLgorCSAqLworCXRlc3QJU0VRX0ZMQUdTMiwgU0VMRUNUT1VUX1FGUk9aRU4gam56IC4gKyAyOworQkVHSU5fQ1JJVElDQUw7CisJdGVzdAlRT0ZGX0NUTFNUQSwgTkVXX1NDQl9BVkFJTCBqbnogZmV0Y2hfbmV3X3NjYjsKKwljbXAJQ09NUExFVEVfRE1BX1NDQl9IRUFEWzFdLCBTQ0JfTElTVF9OVUxMIGpuZSBkbWFfY29tcGxldGVfc2NiOworCWNtcAlDT01QTEVURV9TQ0JfSEVBRFsxXSwgU0NCX0xJU1RfTlVMTCBqZSByZXR1cm47CisJLyogRkFMTFRIUk9VR0ggKi8KK2ZpbGxfcW91dGZpZm86CisJLyoKKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBTQ0JzIHdlIGFyZSBkbWFpbmcganVzdAorCSAqIGluIGNhc2UgdGhlIERNQSBmYWlscyBvciBpcyBhYm9ydGVkLgorCSAqLworCW1vdglBLCBRT1VURklGT19FTlRSWV9WQUxJRF9UQUc7CisJYm1vdglDT01QTEVURV9TQ0JfRE1BSU5QUk9HX0hFQUQsIENPTVBMRVRFX1NDQl9IRUFELCAyOworCW12aQlDQ1NDQkNUTCwgQ0NTQ0JSRVNFVDsKKwlibW92CVNDQkhBRERSLCBRT1VURklGT19ORVhUX0FERFIsIDQ7CisJYm1vdglTQ0JQVFIsIENPTVBMRVRFX1NDQl9IRUFELCAyOworZmlsbF9xb3V0Zmlmb19sb29wOgorCW1vdglDQ1NDQlJBTSwgU0NCUFRSOworCW9yCUNDU0NCUkFNLCBBLCBTQ0JQVFJbMV07CisJbW92CU5PTkUsIFNEU0NCX1FPRkY7CisJaW5jCUlOVF9DT0FMRVNDSU5HX0NNRENPVU5UOworCWFkZAlDTURTX1BFTkRJTkcsIC0xOworCWFkYwlDTURTX1BFTkRJTkdbMV0sIC0xOworCWNtcAlTQ0JfTkVYVF9DT01QTEVURVsxXSwgU0NCX0xJU1RfTlVMTCBqZSBmaWxsX3FvdXRmaWZvX2RvbmU7CisJY21wCUNDU0NCQUREUiwgQ0NTQ0JBRERSX01BWCBqZSBmaWxsX3FvdXRmaWZvX2RvbmU7CisJdGVzdAlRT0ZGX0NUTFNUQSwgU0RTQ0JfUk9MTE9WUiBqbnogZmlsbF9xb3V0Zmlmb19kb25lOworCWJtb3YJU0NCUFRSLCBTQ0JfTkVYVF9DT01QTEVURSwgMjsKKwlqbXAJZmlsbF9xb3V0Zmlmb19sb29wOworZmlsbF9xb3V0Zmlmb19kb25lOgorCW1vdglTQ0JIQ05ULCBDQ1NDQkFERFI7CisJbXZpCUNDU0NCQ1RMLCBDQ1NDQkVOfENDU0NCUkVTRVQ7CisJYm1vdglDT01QTEVURV9TQ0JfSEVBRCwgU0NCX05FWFRfQ09NUExFVEUsIDI7CisJbXZpCVNDQl9ORVhUX0NPTVBMRVRFWzFdLCBTQ0JfTElTVF9OVUxMIHJldDsKKworZmV0Y2hfbmV3X3NjYjoKKwlibW92CVNDQkhBRERSLCBORVhUX1FVRVVFRF9TQ0JfQUREUiwgNDsKKwltdmkJQ0NBUlJFTnxDQ1NDQkVOfENDU0NCRElSfENDU0NCUkVTRVQgam1wIGRtYV9zY2I7CitkbWFfY29tcGxldGVfc2NiOgorCWJtb3YJU0NCUFRSLCBDT01QTEVURV9ETUFfU0NCX0hFQUQsIDI7CisJYm1vdglTQ0JIQUREUiwgU0NCX0JVU0FERFIsIDQ7CisJbXZpCUNDQVJSRU58Q0NTQ0JFTnxDQ1NDQlJFU0VUIGptcCBkbWFfc2NiOworRU5EX0NSSVRJQ0FMOworCisvKgorICogRWl0aGVyIHBvc3Qgb3IgZmV0Y2ggYW4gU0NCIGZyb20gaG9zdCBtZW1vcnkuICBUaGUgY2FsbGVyCisgKiBpcyByZXNwb25zaWJsZSBmb3IgcG9sbGluZyBmb3IgdHJhbnNmZXIgY29tcGxldGlvbi4KKyAqCisgKiBQcmVyZXF1aXNpdHM6IE1vZGUgPT0gTV9DQ0hBTgorICoJCSBTSU5ERVggY29udGFpbnMgQ0NTQ0JDVEwgZmxhZ3MKKyAqCQkgU0NCSEFERFIgc2V0IHRvIEhvc3QgU0NCIGFkZHJlc3MKKyAqCQkgU0NCUFRSIHNldCB0byBTQ0Igc3JjIGxvY2F0aW9uIG9uICJwdXNoIiBvcGVyYXRpb25zCisgKi8KK1NFVF9TUkNfTU9ERQlNX0NDSEFOOworU0VUX0RTVF9NT0RFCU1fQ0NIQU47CitkbWFfc2NiOgorCW12aQlTQ0JIQ05ULCBTQ0JfVFJBTlNGRVJfU0laRTsKKwltb3YJQ0NTQ0JDVEwsIFNJTkRFWCByZXQ7CisKK0JFR0lOX0NSSVRJQ0FMOworc2V0am1wOgorCWJtb3YJTE9OR0pNUF9BRERSLCBTVEFDSywgMiByZXQ7CitzZXRqbXBfaW5saW5lOgorCWJtb3YJTE9OR0pNUF9BRERSLCBTVEFDSywgMjsKK2xvbmdqbXA6CisJYm1vdglTVEFDSywgTE9OR0pNUF9BRERSLCAyIHJldDsKK0VORF9DUklUSUNBTDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBDaGlwIEJ1ZyBXb3JrIEFyb3VuZHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBNdXN0IGRpc2FibGUgaW50ZXJydXB0cyB3aGVuIHNldHRpbmcgdGhlIG1vZGUgcG9pbnRlcgorICogcmVnaXN0ZXIgYXMgYW4gaW50ZXJydXB0IG9jY3VycmluZyBtaWQgdXBkYXRlIHdpbGwKKyAqIGZhaWwgdG8gc3RvcmUgdGhlIG5ldyBtb2RlIHZhbHVlIGZvciByZXN0b3JhdGlvbiBvbgorICogYW4gaXJldC4KKyAqLworaWYgKChhaGQtPmJ1Z3MgJiBBSERfU0VUX01PREVfQlVHKSAhPSAwKSB7CitzZXRfbW9kZV93b3JrX2Fyb3VuZDoKKwltdmkJU0VRSU5UQ1RMLCBJTlRWRUMxRFNMOworCW1vdglNT0RFX1BUUiwgU0lOREVYOworCWNscglTRVFJTlRDVEwgcmV0OworCit0b2dnbGVfZGZmX21vZGVfd29ya19hcm91bmQ6CisJbXZpCVNFUUlOVENUTCwgSU5UVkVDMURTTDsKKwl4b3IJTU9ERV9QVFIsIE1LX01PREUoTV9ERkYxLCBNX0RGRjEpOworCWNscglTRVFJTlRDVEwgcmV0OworfQorCisKK2lmICgoYWhkLT5idWdzICYgQUhEX0lOVENPTExJU0lPTl9CVUcpICE9IDApIHsKK3NldF9zZXFpbnRfd29ya19hcm91bmQ6CisJbW92CVNFUUlOVENPREUsIFNJTkRFWDsKKwltdmkJU0VRSU5UQ09ERSwgTk9fU0VRSU5UIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBQYWNrZXRpemVkIExvbmdKbXAgUm91dGluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NFVF9TUkNfTU9ERQlNX1NDU0k7CitTRVRfRFNUX01PREUJTV9TQ1NJOworc3RhcnRfc2VsZWN0aW9uOgorQkVHSU5fQ1JJVElDQUw7CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfU0VOVF9TQ0JfVVBEQVRFX0JVRykgIT0gMCkgeworCQkvKgorCQkgKiBSYXpvciAjNDk0CisJCSAqIFJldiBBIGhhcmR3YXJlIGZhaWxzIHRvIHVwZGF0ZSBMQVNUL0NVUlIvTkVYVFNDQgorCQkgKiBjb3JyZWN0bHkgYWZ0ZXIgYSBwYWNrZXRpemVkIHNlbGVjdGlvbiBpbiBzZXZlcmFsCisJCSAqIHNpdHVhdGlvbnM6CisJCSAqCisJCSAqIDEpIElmIG9ubHkgb25lIGNvbW1hbmQgZXhpc3RlZCBpbiB0aGUgcXVldWUsIHRoZQorCQkgKiAgICBMQVNUL0NVUlIvTkVYVFNDQiBhcmUgdW5jaGFuZ2VkLgorCQkgKgorCQkgKiAyKSBJbiBhIG5vbiBRQVMsIHByb3RvY29sIGFsbG93ZWQgcGhhc2UgY2hhbmdlLAorCQkgKiAgICB0aGUgcXVldWUgaXMgc2hpZnRlZCAxIHRvbyBmYXIuICBMQVNUU0NCIGlzCisJCSAqICAgIHRoZSBsYXN0IFNDQiB0aGF0IHdhcyBjb3JyZWN0bHkgcHJvY2Vzc2VkLgorCQkgKiAKKwkJICogMykgSW4gdGhlIFFBUyBjYXNlLCBpZiB0aGUgZnVsbCBsaXN0IG9mIGNvbW1hbmRzCisJCSAqICAgIHdhcyBzdWNjZXNzZnVsbHkgc2VudCwgTkVYVFNDQiBpcyBOVUxMIGFuZCBuZWl0aGVyCisJCSAqICAgIENVUlJTQ0Igbm9yIExBU1RTQ0IgY2FuIGJlIHRydXN0ZWQuICBXZSBtdXN0CisJCSAqICAgIG1hbnVhbGx5IHdhbGsgdGhlIGxpc3QgY291bnRpbmcgTUFYQ01EQ05UIGVsZW1lbnRzCisJCSAqICAgIHRvIGZpbmQgdGhlIGxhc3QgU0NCIHRoYXQgd2FzIHNlbnQgY29ycmVjdGx5LgorCQkgKgorCQkgKiBUbyBzaW1wbGlmeSB0aGUgd29ya2Fyb3VuZCBmb3IgdGhpcyBidWcgaW4gU0VMRE8KKwkJICogaGFuZGxpbmcsIHdlIGluaXRpYWxpemUgTEFTVFNDQiBwcmlvciB0byBlbmFibGluZworCQkgKiBzZWxlY3Rpb24gc28gd2UgY2FuIHJlbHkgb24gaXQgZXZlbiBmb3IgY2FzZSAjMSBhYm92ZS4KKwkJICovCisJCWJtb3YJTEFTVFNDQiwgV0FJVElOR19USURfSEVBRCwgMjsKKwl9CisJYm1vdglDVVJSU0NCLCBXQUlUSU5HX1RJRF9IRUFELCAyOworCWJtb3YJU0NCUFRSLCBXQUlUSU5HX1RJRF9IRUFELCAyOworCXNocglTRUxPSUQsIDQsIFNDQl9TQ1NJSUQ7CisJLyoKKwkgKiBJZiB3ZSB3YW50IHRvIHNlbmQgYSBtZXNzYWdlIHRvIHRoZSBkZXZpY2UsIGVuc3VyZQorCSAqIHdlIGFyZSBzZWxlY3Rpbmcgd2l0aCBhdG4gaXJyZWdhcmRsZXNzIG9mIG91ciBwYWNrZXRpemVkCisJICogYWdyZWVtZW50LiAgU2luY2UgU1BJNCBvbmx5IGFsbG93cyB0YXJnZXQgcmVzZXQgb3IgUFBSCisJICogbWVzc2FnZXMgaWYgdGhpcyBpcyBhIHBhY2tldGl6ZWQgY29ubmVjdGlvbiwgdGhlIGNoYW5nZQorCSAqIHRvIG91ciBuZWdvdGlhdGlvbiB0YWJsZSBlbnRyeSBmb3IgdGhpcyBzZWxlY3Rpb24gd2lsbAorCSAqIGJlIGNsZWFyZWQgd2hlbiB0aGUgbWVzc2FnZSBpcyBhY3RlZCBvbi4KKwkgKi8KKwl0ZXN0CVNDQl9DT05UUk9MLCBNS19NRVNTQUdFIGp6IC4gKyAzOworCW1vdglORUdPQUREUiwgU0VMT0lEOworCW9yCU5FR0NPTk9QVFMsIEVOQVVUT0FUTk87CisJb3IJU0NTSVNFUTAsIEVOU0VMTyByZXQ7CitFTkRfQ1JJVElDQUw7CisKKy8qCisgKiBBbGxvY2F0ZSBhIEZJRk8gZm9yIGEgbm9uLXBhY2tldGl6ZWQgdHJhbnNhY3Rpb24uCisgKiBJbiBSZXZBIGhhcmR3YXJlLCBib3RoIEZJRk9zIG11c3QgYmUgZnJlZSBiZWZvcmUgd2UKKyAqIGNhbiBhbGxvY2F0ZSBhIEZJRk8gZm9yIGEgbm9uLXBhY2tldGl6ZWQgdHJhbnNhY3Rpb24uCisgKi8KK2FsbG9jYXRlX2ZpZm9fbG9vcDoKKwkvKgorCSAqIERvIHdoYXRldmVyIHdvcmsgaXMgcmVxdWlyZWQgdG8gZnJlZSBhIEZJRk8uCisJICovCisJY2FsbAlpZGxlX2xvb3Bfc2VydmljZV9maWZvczsKKwlTRVRfTU9ERShNX1NDU0ksIE1fU0NTSSkKK2FsbG9jYXRlX2ZpZm86CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfTk9OUEFDS0ZJRk9fQlVHKSAhPSAwKSB7CisJCWFuZAlBLCBGSUZPMEZSRUV8RklGTzFGUkVFLCBERkZTVEFUOworCQljbXAJQSwgRklGTzBGUkVFfEZJRk8xRlJFRSBqbmUgYWxsb2NhdGVfZmlmb19sb29wOworCX0gZWxzZSB7CisJCXRlc3QJREZGU1RBVCwgRklGTzFGUkVFIGpueiBhbGxvY2F0ZV9maWZvMTsKKwkJdGVzdAlERkZTVEFULCBGSUZPMEZSRUUganogYWxsb2NhdGVfZmlmb19sb29wOworCQltdmkJREZGU1RBVCwgQl9DVVJSRklGT18wOworCQlTRVRfTU9ERShNX0RGRjAsIE1fREZGMCkKKwkJYm1vdglTQ0JQVFIsIEFMTE9DRklGT19TQ0JQVFIsIDIgcmV0OworCX0KK1NFVF9TUkNfTU9ERQlNX1NDU0k7CitTRVRfRFNUX01PREUJTV9TQ1NJOworYWxsb2NhdGVfZmlmbzE6CisJbXZpCURGRlNUQVQsIENVUlJGSUZPXzE7CisJU0VUX01PREUoTV9ERkYxLCBNX0RGRjEpCisJYm1vdglTQ0JQVFIsIEFMTE9DRklGT19TQ0JQVFIsIDIgcmV0OworCisvKgorICogV2UgaGF2ZSBiZWVuIHJlc2VsZWN0ZWQgYXMgYW4gaW5pdGlhdG9yCisgKiBvciBzZWxlY3RlZCBhcyBhIHRhcmdldC4KKyAqLworU0VUX1NSQ19NT0RFCU1fU0NTSTsKK1NFVF9EU1RfTU9ERQlNX1NDU0k7CitzZWxlY3RfaW46CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfQlVTRlJFRVJFVl9CVUcpICE9IDApIHsKKwkJLyoKKwkJICogVGVzdCB0byBlbnN1cmUgdGhhdCB0aGUgYnVzIGhhcyBub3QKKwkJICogYWxyZWFkeSBnb25lIGZyZWUgcHJpb3IgdG8gY2xlYXJpbmcKKwkJICogYW55IHN0YWxlIGJ1c2ZyZWUgc3RhdHVzLiAgVGhpcyBhdm9pZHMKKwkJICogYSB3aW5kb3cgd2hlcmVieSBhIGJ1c2ZyZWUganVzdCBhZnRlcgorCQkgKiBhIHNlbGVjdGlvbiBjb3VsZCBiZSBtaXNzZWQuCisJCSAqLworCQl0ZXN0CVNDU0lTSUdJLCBCU1lJIGp6IC4gKyAyOworCQltdmkJQ0xSU0lOVDEsQ0xSQlVTRlJFRTsKKwkJb3IJU0lNT0RFMSwgRU5CVVNGUkVFOworCX0KKwlvcglTWEZSQ1RMMCwgU1BJT0VOOworCWFuZAlTQVZFRF9TQ1NJSUQsIFNFTElEX01BU0ssIFNFTElEOworCWFuZAlBLCBPSUQsIElPV05JRDsKKwlvcglTQVZFRF9TQ1NJSUQsIEE7CisJbXZpCUNMUlNJTlQwLCBDTFJTRUxESTsKKwlqbXAJSVRsb29wOworCisvKgorICogV2UgaGF2ZSBzdWNjZXNzZnVsbHkgc2VsZWN0ZWQgb3V0LgorICoKKyAqIENsZWFyIFNFTERPLgorICogRGVxdWV1ZSBhbGwgU0NCcyBzZW50IGZyb20gdGhlIHdhaXRpbmcgcXVldWUKKyAqIFJlcXVldWUgYWxsIFNDQnMgKm5vdCogc2VudCB0byB0aGUgdGFpbCBvZiB0aGUgd2FpdGluZyBxdWV1ZQorICogVGFrZSBSYXpvciAjNDk0IGludG8gYWNjb3VudCBmb3IgYWJvdmUuCisgKgorICogSW4gUGFja2V0aXplZCBNb2RlOgorICoJUmV0dXJuIHRvIHRoZSBpZGxlIGxvb3AuICBPdXIgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCB0YWtlCisgKgljYXJlIG9mIGFueSBpbmNvbWluZyBMX1FzLgorICoKKyAqIEluIE5vbi1QYWNrZXRpemUgTW9kZToKKyAqCUNvbnRpbnVlIHRvIG91ciBub3JtYWwgc3RhdGUgbWFjaGluZS4KKyAqLworU0VUX1NSQ19NT0RFCU1fU0NTSTsKK1NFVF9EU1RfTU9ERQlNX1NDU0k7CitzZWxlY3Rfb3V0OgorQkVHSU5fQ1JJVElDQUw7CisJLyogQ2xlYXIgb3V0IGFsbCBTQ0JzIHRoYXQgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBzZW50LiAqLworCWlmICgoYWhkLT5idWdzICYgQUhEX1NFTlRfU0NCX1VQREFURV9CVUcpICE9IDApIHsKKwkJLyoKKwkJICogRm9yIHBhY2tldGl6ZWQsIHRoZSBMUU8gbWFuYWdlciBjbGVhcnMgRU5TRUxPIG9uCisJCSAqIHRoZSBhc3NlcnRpb24gb2YgU0VMRE8uICBJZiB3ZSBhcmUgbm9uLXBhY2tldGl6ZWQsCisJCSAqIExBU1RTQ0IgYW5kIENVUlJTQ0IgYXJlIGFjY3VyYXRlLgorCQkgKi8KKwkJdGVzdAlTQ1NJU0VRMCwgRU5TRUxPIGpueiB1c2VfbGFzdHNjYjsKKworCQkvKgorCQkgKiBUaGUgdXBkYXRlIGlzIGNvcnJlY3QgZm9yIExRT1NUQVQxIGVycm9ycy4gIEFsbAorCQkgKiBidXQgTFFPQlVTRlJFRSBhcmUgaGFuZGxlZCBieSBrZXJuZWwgaW50ZXJydXB0cy4KKwkJICogSWYgd2Ugc2VlIExRT0JVU0ZSRUUsIHJldHVybiB0byB0aGUgaWRsZSBsb29wLgorCQkgKiBPbmNlIHdlIGFyZSBvdXQgb2YgdGhlIHNlbGVjdF9vdXQgY3JpdGljYWwgc2VjdGlvbiwKKwkJICogdGhlIGtlcm5lbCB3aWxsIGNsZWFudXAgdGhlIExRT0JVU0ZSRUUgYW5kIHdlIHdpbGwKKwkJICogZXZlbnR1YWxseSByZXN0YXJ0IHRoZSBzZWxlY3Rpb24gaWYgYXBwcm9wcmlhdGUuCisJCSAqLworCQl0ZXN0CUxRT1NUQVQxLCBMUU9CVVNGUkVFIGpueiBpZGxlX2xvb3A7CisKKwkJLyoKKwkJICogT24gYSBwaGFzZSBjaGFuZ2Ugb3VzdHNpZGUgb2YgcGFja2V0IGJvdW5kYXJpZXMsCisJCSAqIExBU1RTQ0IgcG9pbnRzIHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIFNDQiBjb250ZXh0CisJCSAqIG9uIHRoZSBidXMuCisJCSAqLworCQl0ZXN0CUxRT1NUQVQyLCBMUU9QSEFDSEdPVVRQS1Qgam56IHVzZV9sYXN0c2NiOworCisJCS8qCisJCSAqIElmIHRoZSBoYXJkd2FyZSBoYXMgdHJhdmVyc2VkIHRoZSB3aG9sZSBsaXN0LCBORVhUU0NCCisJCSAqIHdpbGwgYmUgTlVMTCwgQ1VSUlNDQiBhbmQgTEFTVFNDQiBjYW5ub3QgYmUgdHJ1c3RlZCwKKwkJICogYnV0IE1BWENNRENOVCBpcyBhY2N1cmF0ZS4gIElmIHdlIHN0b3AgcGFydCB3YXkgdGhyb3VnaAorCQkgKiB0aGUgbGlzdCBvciBvbmx5IGhhZCBvbmUgY29tbWFuZCB0byBpc3N1ZSwgTkVYVFNDQlsxXSBpcworCQkgKiBub3QgTlVMTCBhbmQgTEFTVFNDQiBpcyB0aGUgbGFzdCBjb21tYW5kIHRvIGdvIG91dC4KKwkJICovCisJCWNtcAlORVhUU0NCWzFdLCBTQ0JfTElTVF9OVUxMIGpuZSB1c2VfbGFzdHNjYjsKKworCQkvKgorCQkgKiBCcnV0ZSBmb3JjZSB3YWxrLgorCQkgKi8KKwkJYm1vdglTQ0JQVFIsIFdBSVRJTkdfVElEX0hFQUQsIDI7CisJCW12aQlTRVFJTlRDVEwsIElOVFZFQzFEU0w7CisJCW12aQlNT0RFX1BUUiwgTUtfTU9ERShNX0NGRywgTV9DRkcpOworCQltb3YJQSwgTUFYQ01EQ05UOworCQltdmkJTU9ERV9QVFIsIE1LX01PREUoTV9TQ1NJLCBNX1NDU0kpOworCQljbHIJU0VRSU5UQ1RMOworZmluZF9sYXN0c2NiX2xvb3A6CisJCWRlYwlBOworCQl0ZXN0CUEsIDB4RkYganogZm91bmRfbGFzdF9zZW50X3NjYjsKKwkJYm1vdglTQ0JQVFIsIFNDQl9ORVhULCAyOworCQlqbXAJZmluZF9sYXN0c2NiX2xvb3A7Cit1c2VfbGFzdHNjYjoKKwkJYm1vdglTQ0JQVFIsIExBU1RTQ0IsIDI7Citmb3VuZF9sYXN0X3NlbnRfc2NiOgorCQlibW92CUNVUlJTQ0IsIFNDQlBUUiwgMjsKK2N1cnNjYl93d19kb25lOgorCX0gZWxzZSB7CisJCWJtb3YJU0NCUFRSLCBDVVJSU0NCLCAyOworCX0KKworCS8qCisJICogUmVxdWV1ZSBhbnkgU0NCcyBub3Qgc2VudCwgdG8gdGhlIHRhaWwgb2YgdGhlIHdhaXRpbmcgUS4KKwkgKi8KKwljbXAJU0NCX05FWFRbMV0sIFNDQl9MSVNUX05VTEwgamUgc2VsZWN0X291dF9saXN0X2RvbmU7CisKKwkvKgorCSAqIFdlIGtub3cgdGhhdCBuZWl0aGVyIHRoZSBwZXItVElEIGxpc3Qgbm9yIHRoZSBsaXN0IG9mCisJICogVElEcyBpcyBlbXB0eS4gIFVzZSB0aGlzIGtub3dsZWRnZSB0byBvdXIgYWR2YW50YWdlLgorCSAqLworCWJtb3YJUkVHMCwgU0NCX05FWFQsIDI7CisJYm1vdglTQ0JQVFIsIFdBSVRJTkdfVElEX1RBSUwsIDI7CisJYm1vdglTQ0JfTkVYVDIsIFJFRzAsIDI7CisJYm1vdglXQUlUSU5HX1RJRF9UQUlMLCBSRUcwLCAyOworCWptcAlzZWxlY3Rfb3V0X2luY190aWRfcTsKKworc2VsZWN0X291dF9saXN0X2RvbmU6CisJLyoKKwkgKiBUaGUgd2hvbGUgbGlzdCBtYWRlIGl0LiAgSnVzdCBjbGVhciBvdXIgVElEJ3MgdGFpbCBwb2ludGVyCisJICogdW5sZXNzIHdlIHdlcmUgcXVldWVkIGluZGVwZW5kZW50bHkgZHVlIHRvIG91ciBuZWVkIHRvCisJICogc2VuZCBhIG1lc3NhZ2UuCisJICovCisJdGVzdAlTQ0JfQ09OVFJPTCwgTUtfTUVTU0FHRSBqbnogc2VsZWN0X291dF9pbmNfdGlkX3E7CisJc2hyCURJTkRFWCwgMywgU0NCX1NDU0lJRDsKKwlvcglESU5ERVgsIDE7CS8qIFdhbnQgb25seSB0aGUgc2Vjb25kIGJ5dGUgKi8KKwltdmkJRElOREVYWzFdLCAoKFdBSVRJTkdfU0NCX1RBSUxTKSA+PiA4KTsKKwltdmkJRElORElSLCBTQ0JfTElTVF9OVUxMOworc2VsZWN0X291dF9pbmNfdGlkX3E6CisJYm1vdglTQ0JQVFIsIFdBSVRJTkdfVElEX0hFQUQsIDI7CisJYm1vdglXQUlUSU5HX1RJRF9IRUFELCBTQ0JfTkVYVDIsIDI7CisJY21wCVdBSVRJTkdfVElEX0hFQURbMV0sIFNDQl9MSVNUX05VTEwgam5lIC4gKyAyOworCW12aQlXQUlUSU5HX1RJRF9UQUlMWzFdLCBTQ0JfTElTVF9OVUxMOworCWJtb3YJU0NCUFRSLCBDVVJSU0NCLCAyOworCW12aQlDTFJTSU5UMCwgQ0xSU0VMRE87CisJdGVzdAlMUU9TVEFUMiwgTFFPUEhBQ0hHT1VUUEtUIGpueiB1bmV4cGVjdGVkX25vbnBrdF9waGFzZTsKKwl0ZXN0CUxRT1NUQVQxLCBMUU9QSEFDSEdJTlBLVCBqbnogdW5leHBlY3RlZF9ub25wa3RfcGhhc2U7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBwYWNrZXRpemVkIGNvbm5lY3Rpb24sIHJldHVybiB0byBvdXIKKwkgKiBpZGxlX2xvb3AgYW5kIGxldCBvdXIgaW50ZXJydXB0IGhhbmRsZXIgZGVhbCB3aXRoCisJICogYW55IGNvbm5lY3Rpb24gc2V0dXAvdGVhcmRvd24gaXNzdWVzLiAgVGhlIG9ubHkKKwkgKiBleGNlcHRpb25zIGFyZSB0aGUgY2FzZSBvZiBNS19NRVNTQUdFIGFuZCB0YXNrIG1hbmFnZW1lbnQKKwkgKiBTQ0JzLgorCSAqLworCWlmICgoYWhkLT5idWdzICYgQUhEX0xRT19BVE5PX0JVRykgIT0gMCkgeworCQkvKgorCQkgKiBJbiB0aGUgQSwgdGhlIExRTyBtYW5hZ2VyIHRyYW5zaXRpb25zIHRvIExRT1NUT1AwIGV2ZW4gaWYKKwkJICogd2UgaGF2ZSBzZWxlY3RlZCBvdXQgd2l0aCBBVE4gYXNzZXJ0ZWQgYW5kIHRoZSB0YXJnZXQKKwkJICogUkVRcyBpbiBhIG5vbi1wYWNrZXQgcGhhc2UuCisJCSAqLworCQl0ZXN0IAlTQ0JfQ09OVFJPTCwgTUtfTUVTU0FHRSBqeiBzZWxlY3Rfb3V0X25vX21lc3NhZ2U7CisJCXRlc3QJU0NTSVNJR08sIEFUTk8gam56IHNlbGVjdF9vdXRfbm9uX3BhY2tldGl6ZWQ7CitzZWxlY3Rfb3V0X25vX21lc3NhZ2U6CisJfQorCXRlc3QJTFFPU1RBVDIsIExRT1NUT1AwIGp6IHNlbGVjdF9vdXRfbm9uX3BhY2tldGl6ZWQ7CisJdGVzdAlTQ0JfVEFTS19NQU5BR0VNRU5ULCAweEZGIGp6IGlkbGVfbG9vcDsKKwlTRVRfU0VRSU5UQ09ERShUQVNLTUdNVF9GVU5DX0NPTVBMRVRFKQorCWptcAlpZGxlX2xvb3A7CisKK3NlbGVjdF9vdXRfbm9uX3BhY2tldGl6ZWQ6CisJLyogTm9uIHBhY2tldGl6ZWQgcmVxdWVzdC4gKi8KKwlhbmQgICAgIFNDU0lTRVEwLCB+RU5TRUxPOworCWlmICgoYWhkLT5idWdzICYgQUhEX0JVU0ZSRUVSRVZfQlVHKSAhPSAwKSB7CisJCS8qCisJCSAqIFRlc3QgdG8gZW5zdXJlIHRoYXQgdGhlIGJ1cyBoYXMgbm90CisJCSAqIGFscmVhZHkgZ29uZSBmcmVlIHByaW9yIHRvIGNsZWFyaW5nCisJCSAqIGFueSBzdGFsZSBidXNmcmVlIHN0YXR1cy4gIFRoaXMgYXZvaWRzCisJCSAqIGEgd2luZG93IHdoZXJlYnkgYSBidXNmcmVlIGp1c3QgYWZ0ZXIKKwkJICogYSBzZWxlY3Rpb24gY291bGQgYmUgbWlzc2VkLgorCQkgKi8KKwkJdGVzdAlTQ1NJU0lHSSwgQlNZSSBqeiAuICsgMjsKKwkJbXZpCUNMUlNJTlQxLENMUkJVU0ZSRUU7CisJCW9yCVNJTU9ERTEsIEVOQlVTRlJFRTsKKwl9CisJbW92CVNBVkVEX1NDU0lJRCwgU0NCX1NDU0lJRDsKKwltb3YJU0FWRURfTFVOLCBTQ0JfTFVOOworCW12aQlTRVFfRkxBR1MsIE5PX0NEQl9TRU5UOworRU5EX0NSSVRJQ0FMOworCW9yCVNYRlJDVEwwLCBTUElPRU47CisKKwkvKgorCSAqIEFzIHNvb24gYXMgd2UgZ2V0IGEgc3VjY2Vzc2Z1bCBzZWxlY3Rpb24sIHRoZSB0YXJnZXQKKwkgKiBzaG91bGQgZ28gaW50byB0aGUgbWVzc2FnZSBvdXQgcGhhc2Ugc2luY2Ugd2UgaGF2ZSBBVE4KKwkgKiBhc3NlcnRlZC4KKwkgKi8KKwltdmkJTVNHX09VVCwgTVNHX0lERU5USUZZRkxBRzsKKworCS8qCisJICogTWFpbiBsb29wIGZvciBpbmZvcm1hdGlvbiB0cmFuc2ZlciBwaGFzZXMuICBXYWl0IGZvciB0aGUKKwkgKiB0YXJnZXQgdG8gYXNzZXJ0IFJFUSBiZWZvcmUgY2hlY2tpbmcgTVNHLCBDL0QgYW5kIEkvTyBmb3IKKwkgKiB0aGUgYnVzIHBoYXNlLgorCSAqLworbWVzZ2luX3BoYXNlbWlzOgorSVRsb29wOgorCWNhbGwJcGhhc2VfbG9jazsKKworCW1vdglBLCBMQVNUUEhBU0U7CisKKwl0ZXN0CUEsIH5QX0RBVEFJTl9EVAlqeiBwX2RhdGE7CisJY21wCUEsUF9DT01NQU5ECWplIHBfY29tbWFuZDsKKwljbXAJQSxQX01FU0dPVVQJamUgcF9tZXNnb3V0OworCWNtcAlBLFBfU1RBVFVTCWplIHBfc3RhdHVzOworCWNtcAlBLFBfTUVTR0lOCWplIHBfbWVzZ2luOworCisJU0VUX1NFUUlOVENPREUoQkFEX1BIQVNFKQorCWptcAlJVGxvb3A7CQkJLyogVHJ5IHJlYWRpbmcgdGhlIGJ1cyBhZ2Fpbi4gKi8KKworLyoKKyAqIENvbW1hbmQgcGhhc2UuICBTZXQgdXAgdGhlIERNQSByZWdpc3RlcnMgYW5kIGxldCAnZXIgcmlwLgorICovCitwX2NvbW1hbmQ6CisJdGVzdAlTRVFfRkxBR1MsIE5PVF9JREVOVElGSUVEIGp6IHBfY29tbWFuZF9va2F5OworCVNFVF9TRVFJTlRDT0RFKFBST1RPX1ZJT0xBVElPTikKK3BfY29tbWFuZF9va2F5OgorCXRlc3QJTU9ERV9QVFIsIH4oTUtfTU9ERShNX0RGRjEsIE1fREZGMSkpCisJCWpueiBwX2NvbW1hbmRfYWxsb2NhdGVfZmlmbzsKKwkvKgorCSAqIENvbW1hbmQgcmV0cnkuICBGcmVlIG91ciBjdXJyZW50IEZJRk8gYW5kCisJICogcmUtYWxsb2NhdGUgYSBGSUZPIHNvIHRyYW5zZmVyIHN0YXRlIGlzCisJICogcmVzZXQuCisJICovCitTRVRfU1JDX01PREUJTV9ERkYxOworU0VUX0RTVF9NT0RFCU1fREZGMTsKKwltdmkJREZGU1hGUkNUTCwgUlNUQ0hOfENMUlNIQ05UOworCVNFVF9NT0RFKE1fU0NTSSwgTV9TQ1NJKQorcF9jb21tYW5kX2FsbG9jYXRlX2ZpZm86CisJYm1vdglBTExPQ0ZJRk9fU0NCUFRSLCBTQ0JQVFIsIDI7CisJY2FsbAlhbGxvY2F0ZV9maWZvOworU0VUX1NSQ19NT0RFCU1fREZGMTsKK1NFVF9EU1RfTU9ERQlNX0RGRjE7CisJYWRkCU5PTkUsIC0xNywgU0NCX0NEQl9MRU47CisJam5jCXBfY29tbWFuZF9lbWJlZGRlZDsKK3BfY29tbWFuZF9mcm9tX2hvc3Q6CisJYm1vdglIQUREUlswXSwgU0NCX0hPU1RfQ0RCX1BUUiwgOTsKKwltdmkJU0dfQ0FDSEVfUFJFLCBMQVNUX1NFRzsKKwltdmkJREZDTlRSTCwgKFBSRUxPQURFTnxTQ1NJRU58SERNQUVOKTsKKwlqbXAJcF9jb21tYW5kX3hmZXI7CitwX2NvbW1hbmRfZW1iZWRkZWQ6CisJYm1vdglTSENOVFswXSwgU0NCX0NEQl9MRU4sICAxOworCWJtb3YJREZEQVQsIFNDQl9DREJfU1RPUkUsIDE2OyAKKwltdmkJREZDTlRSTCwgU0NTSUVOOworcF9jb21tYW5kX3hmZXI6CisJYW5kCVNFUV9GTEFHUywgfk5PX0NEQl9TRU5UOworCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9GQVNUX0NEQl9ERUxJVkVSWSkgIT0gMCkgeworCQkvKgorCQkgKiBUbyBzcGVlZCB1cCBDREIgZGVsaXZlcnkgaW4gUmV2IEIsIGFsbCBDREIgYWNrcworCQkgKiBhcmUgInJlbGVhc2VkIiB0byB0aGUgb3V0cHV0IHN5bmMgYXMgc29vbiBhcyB0aGUKKwkJICogY29tbWFuZCBwaGFzZSBzdGFydHMuICBUaGVyZSBpcyBvbmx5IG9uZSBwcm9ibGVtCisJCSAqIHdpdGggdGhpcyBhcHByb2FjaC4gIElmIHRoZSB0YXJnZXQgY2hhbmdlcyBwaGFzZQorCQkgKiBiZWZvcmUgYWxsIGRhdGEgYXJlIHNlbnQsIHdlIGhhdmUgbGVmdCBvdmVyIGFja3MKKwkJICogdGhhdCBjYW4gZ28gb3V0IG9uIHRoZSBidXMgaW4gYSBkYXRhIHBoYXNlLiAgRHVlCisJCSAqIHRvIG90aGVyIGNoaXAgY29udHJhaW50cywgdGhpcyBvbmx5IGhhcHBlbnMgaWYKKwkJICogdGhlIHRhcmdldCBnb2VzIHRvIGRhdGEtaW4sIGJ1dCBpZiB0aGUgYWNrcyBnbworCQkgKiBvdXQgYmVmb3JlIHdlIGNhbiB0ZXN0IFNET05FLCB3ZSdsbCB0aGluayB0aGF0CisJCSAqIHRoZSB0cmFuc2ZlciBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4gIFdvcmsKKwkJICogYXJvdW5kIHRoaXMgYnkgdGFraW5nIGFkdmFudGFnZSBvZiB0aGUgNDAwbnMgb3IKKwkJICogODAwbnMgZGVhZCB0aW1lIGJldHdlZW4gY29tbWFuZCBwaGFzZSBhbmQgdGhlIFJFUQorCQkgKiBvZiB0aGUgbmV3IHBoYXNlLiAgSWYgdGhlIHRyYW5zZmVyIGhhcyBjb21wbGV0ZWQKKwkJICogc3VjY2Vzc2Z1bGx5LCBTQ1NJRU4gc2hvdWxkIGZhbGwgKmxvbmcqIGJlZm9yZSB3ZQorCQkgKiBzZWUgYSBwaGFzZSBjaGFuZ2UuICBXZSB0aHVzIHRyZWF0IGFueSBwaGFzZW1pc3MKKwkJICogdGhhdCBvY2N1cnMgYmVmb3JlIFNDU0lFTiBmYWxscyBhcyBhbiBpbmNvbXBsZXRlCisJCSAqIHRyYW5zZmVyLgorCQkgKi8KKwkJdGVzdAlTU1RBVDEsIFBIQVNFTUlTIGpueiBwX2NvbW1hbmRfeGZlcl9mYWlsZWQ7CisJCXRlc3QJREZDTlRSTCwgU0NTSUVOIGpueiAuIC0gMTsKKwl9IGVsc2UgeworCQl0ZXN0CURGQ05UUkwsIFNDU0lFTiBqbnogLjsKKwl9CisJLyoKKwkgKiBETUEgQ2hhbm5lbCBhdXRvbWF0aWNhbGx5IGRpc2FibGVkLgorCSAqIERvbid0IGFsbG93IGEgZGF0YSBwaGFzZSBpZiB0aGUgY29tbWFuZAorCSAqIHdhcyBub3QgZnVsbHkgdHJhbnNmZXJyZWQuCisJICovCisJdGVzdAlTU1RBVDIsIFNET05FIGpueiBJVGxvb3A7CitwX2NvbW1hbmRfeGZlcl9mYWlsZWQ6CisJb3IJU0VRX0ZMQUdTLCBOT19DREJfU0VOVDsKKwlqbXAJSVRsb29wOworCisKKy8qCisgKiBTdGF0dXMgcGhhc2UuICBXYWl0IGZvciB0aGUgZGF0YSBieXRlIHRvIGFwcGVhciwgdGhlbiByZWFkIGl0CisgKiBhbmQgc3RvcmUgaXQgaW50byB0aGUgU0NCLgorICovCitTRVRfU1JDX01PREUJTV9TQ1NJOworU0VUX0RTVF9NT0RFCU1fU0NTSTsKK3Bfc3RhdHVzOgorCXRlc3QJU0VRX0ZMQUdTLE5PVF9JREVOVElGSUVEIGpueiBtZXNnaW5fcHJvdG9fdmlvbGF0aW9uOworcF9zdGF0dXNfb2theToKKwltb3YJU0NCX1NDU0lfU1RBVFVTLCBTQ1NJREFUOworCW9yCVNDQl9DT05UUk9MLCBTVEFUVVNfUkNWRDsKKwlqbXAJSVRsb29wOworCisvKgorICogTWVzc2FnZSBvdXQgcGhhc2UuICBJZiBNU0dfT1VUIGlzIE1TR19JREVOVElGWUZMQUcsIGJ1aWxkIGEgZnVsbAorICogaW5kZW50aWZ5IG1lc3NhZ2Ugc2VxdWVuY2UgYW5kIHNlbmQgaXQgdG8gdGhlIHRhcmdldC4gIFRoZSBob3N0IG1heQorICogb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciBieSBzZXR0aW5nIHRoZSBNS19NRVNTQUdFIGJpdCBpbiB0aGUgU0NCCisgKiBjb250cm9sIGJ5dGUuICBUaGlzIHdpbGwgY2F1c2UgdXMgdG8gaW50ZXJydXB0IHRoZSBob3N0IGFuZCBhbGxvdworICogaXQgdG8gaGFuZGxlIHRoZSBtZXNzYWdlIHBoYXNlIGNvbXBsZXRlbHkgb24gaXRzIG93bi4gIElmIHRoZSBiaXQKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhcmdldCBpcyBzZXQsIHdlIHdpbGwgYWxzbyBpbnRlcnJ1cHQgdGhlIGhvc3QsCisgKiB0aGVyZWJ5IGFsbG93aW5nIGl0IHRvIHNlbmQgYSBtZXNzYWdlIG9uIHRoZSBuZXh0IHNlbGVjdGlvbiByZWdhcmRsZXNzCisgKiBvZiB0aGUgdHJhbnNhY3Rpb24gYmVpbmcgc2VudC4KKyAqIAorICogSWYgTVNHX09VVCBpcyA9PSBIT1NUX01TRywgYWxzbyBpbnRlcnJ1cHQgdGhlIGhvc3QgYW5kIHRha2UgYSBtZXNzYWdlLgorICogVGhpcyBpcyBkb25lIHRvIGFsbG93IHRoZSBob3N0IHRvIHNlbmQgbWVzc2FnZXMgb3V0c2lkZSBvZiBhbiBpZGVudGlmeQorICogc2VxdWVuY2Ugd2hpbGUgcHJvdGVjdGluZyB0aGUgc2VxZW5jZXIgZnJvbSB0ZXN0aW5nIHRoZSBNS19NRVNTQUdFIGJpdAorICogb24gYW4gU0NCIHRoYXQgbWlnaHQgbm90IGJlIGZvciB0aGUgY3VycmVudCBuZXh1cy4gKEZvciBleGFtcGxlLCBhCisgKiBCRFIgbWVzc2FnZSBpbiByZXNwb25jZSB0byBhIGJhZCByZXNlbGVjdGlvbiB3b3VsZCBsZWF2ZSB1cyBwb2ludGVkIHRvCisgKiBhbiBTQ0IgdGhhdCBkb2Vzbid0IGhhdmUgYW55dGhpbmcgdG8gZG8gd2l0aCB0aGUgY3VycmVudCB0YXJnZXQpLgorICoKKyAqIE90aGVyd2lzZSwgdHJlYXQgTVNHX09VVCBhcyBhIDEgYnl0ZSBtZXNzYWdlIHRvIHNlbmQgKGFib3J0LCBhYm9ydCB0YWcsCisgKiBidXMgZGV2aWNlIHJlc2V0KS4KKyAqCisgKiBXaGVuIHRoZXJlIGFyZSBubyBtZXNzYWdlcyB0byBzZW5kLCBNU0dfT1VUIHNob3VsZCBiZSBzZXQgdG8gTVNHX05PT1AsCisgKiBpbiBjYXNlIHRoZSB0YXJnZXQgZGVjaWRlcyB0byBwdXQgdXMgaW4gdGhpcyBwaGFzZSBmb3Igc29tZSBzdHJhbmdlCisgKiByZWFzb24uCisgKi8KK3BfbWVzZ291dF9yZXRyeToKKwkvKiBUdXJuIG9uIEFUTiBmb3IgdGhlIHJldHJ5ICovCisJbXZpCVNDU0lTSUdPLCBBVE5POworcF9tZXNnb3V0OgorCW1vdglTSU5ERVgsIE1TR19PVVQ7CisJY21wCVNJTkRFWCwgTVNHX0lERU5USUZZRkxBRyBqbmUgcF9tZXNnb3V0X2Zyb21faG9zdDsKKwl0ZXN0CVNDQl9DT05UUk9MLE1LX01FU1NBR0UJam56IGhvc3RfbWVzc2FnZV9sb29wOworcF9tZXNnb3V0X2lkZW50aWZ5OgorCW9yCVNJTkRFWCwgTVNHX0lERU5USUZZRkxBR3xESVNDRU5CLCBTQ0JfTFVOOworCXRlc3QJU0NCX0NPTlRST0wsIERJU0NFTkIgam56IC4gKyAyOworCWFuZAlTSU5ERVgsIH5ESVNDRU5COworLyoKKyAqIFNlbmQgYSB0YWcgbWVzc2FnZSBpZiBUQUdfRU5CIGlzIHNldCBpbiB0aGUgU0NCIGNvbnRyb2wgYmxvY2suCisgKiBVc2UgU0NCX05PTlBBQ0tFVF9UQUcgYXMgdGhlIHRhZyB2YWx1ZS4KKyAqLworcF9tZXNnb3V0X3RhZzoKKwl0ZXN0CVNDQl9DT05UUk9MLFRBR19FTkIganogIHBfbWVzZ291dF9vbmVieXRlOworCW1vdglTQ1NJREFULCBTSU5ERVg7CS8qIFNlbmQgdGhlIGlkZW50aWZ5IG1lc3NhZ2UgKi8KKwljYWxsCXBoYXNlX2xvY2s7CisJY21wCUxBU1RQSEFTRSwgUF9NRVNHT1VUCWpuZSBwX21lc2dvdXRfZG9uZTsKKwlhbmQJU0NTSURBVCxUQUdfRU5CfFNDQl9UQUdfVFlQRSxTQ0JfQ09OVFJPTDsKKwljYWxsCXBoYXNlX2xvY2s7CisJY21wCUxBU1RQSEFTRSwgUF9NRVNHT1VUCWpuZSBwX21lc2dvdXRfZG9uZTsKKwltb3YJU0NCUFRSIGptcCBwX21lc2dvdXRfb25lYnl0ZTsKKy8qCisgKiBJbnRlcnJ1cHQgdGhlIGRyaXZlciwgYW5kIGFsbG93IGl0IHRvIGhhbmRsZSB0aGlzIG1lc3NhZ2UKKyAqIHBoYXNlIGFuZCBhbnkgcmVxdWlyZWQgcmV0cmllcy4KKyAqLworcF9tZXNnb3V0X2Zyb21faG9zdDoKKwljbXAJU0lOREVYLCBIT1NUX01TRwlqbmUgcF9tZXNnb3V0X29uZWJ5dGU7CisJam1wCWhvc3RfbWVzc2FnZV9sb29wOworCitwX21lc2dvdXRfb25lYnl0ZToKKwltdmkJQ0xSU0lOVDEsIENMUkFUTk87CisJbW92CVNDU0lEQVQsIFNJTkRFWDsKKworLyoKKyAqIElmIHRoZSBuZXh0IGJ1cyBwaGFzZSBhZnRlciBBVE4gZHJvcHMgaXMgbWVzc2FnZSBvdXQsIGl0IG1lYW5zCisgKiB0aGF0IHRoZSB0YXJnZXQgaXMgcmVxdWVzdGluZyB0aGF0IHRoZSBsYXN0IG1lc3NhZ2UocykgYmUgcmVzZW50LgorICovCisJY2FsbAlwaGFzZV9sb2NrOworCWNtcAlMQVNUUEhBU0UsIFBfTUVTR09VVAlqZSBwX21lc2dvdXRfcmV0cnk7CisKK3BfbWVzZ291dF9kb25lOgorCW12aQlDTFJTSU5UMSxDTFJBVE5POwkvKiBCZSBzdXJlIHRvIHR1cm4gQVROTyBvZmYgKi8KKwltb3YJTEFTVF9NU0csIE1TR19PVVQ7CisJbXZpCU1TR19PVVQsIE1TR19OT09QOwkvKiBObyBtZXNzYWdlIGxlZnQgKi8KKwlqbXAJSVRsb29wOworCisvKgorICogTWVzc2FnZSBpbiBwaGFzZS4gIEJ5dGVzIGFyZSByZWFkIHVzaW5nIEF1dG9tYXRpYyBQSU8gbW9kZS4KKyAqLworcF9tZXNnaW46CisJLyogcmVhZCB0aGUgMXN0IG1lc3NhZ2UgYnl0ZSAqLworCW12aQlBQ0NVTQkJY2FsbCBpbmJfZmlyc3Q7CisKKwl0ZXN0CUEsTVNHX0lERU5USUZZRkxBRwlqbnogbWVzZ2luX2lkZW50aWZ5OworCWNtcAlBLE1TR19ESVNDT05ORUNUCWplIG1lc2dpbl9kaXNjb25uZWN0OworCWNtcAlBLE1TR19TQVZFREFUQVBPSU5URVIJamUgbWVzZ2luX3NkcHRyczsKKwljbXAJQUxMWkVST1MsQQkJamUgbWVzZ2luX2NvbXBsZXRlOworCWNtcAlBLE1TR19SRVNUT1JFUE9JTlRFUlMJamUgbWVzZ2luX3JkcHRyczsKKwljbXAJQSxNU0dfSUdOX1dJREVfUkVTSURVRQlqZSBtZXNnaW5faWduX3dpZGVfcmVzaWR1ZTsKKwljbXAJQSxNU0dfTk9PUAkJamUgbWVzZ2luX2RvbmU7CisKKy8qCisgKiBQdXNoZWQgbWVzc2FnZSBsb29wIHRvIGFsbG93IHRoZSBrZXJuZWwgdG8KKyAqIHJ1biBpdCdzIG93biBtZXNzYWdlIHN0YXRlIGVuZ2luZS4gIFRvIGF2b2lkIGFuCisgKiBleHRyYSBub3AgaW5zdHJ1Y3Rpb24gYWZ0ZXIgc2lnbmFsaW5nIHRoZSBrZXJuZWwsCisgKiB3ZSBwZXJmb3JtIHRoZSBwaGFzZV9sb2NrIGJlZm9yZSBjaGVja2luZyB0byBzZWUKKyAqIGlmIHdlIHNob3VsZCBleGl0IHRoZSBsb29wIGFuZCBza2lwIHRoZSBwaGFzZV9sb2NrCisgKiBpbiB0aGUgSVRsb29wLiAgUGVyZm9ybWluZyBiYWNrIHRvIGJhY2sgcGhhc2VfbG9ja3MKKyAqIHNob3VsZG4ndCBodXJ0LCBidXQgd2h5IGRvIGl0IHR3aWNlLi4uCisgKi8KK2hvc3RfbWVzc2FnZV9sb29wOgorCWNhbGwJcGhhc2VfbG9jazsJLyogQmVuaWduIHRoZSBmaXJzdCB0aW1lIHRocm91Z2guICovCisJU0VUX1NFUUlOVENPREUoSE9TVF9NU0dfTE9PUCkKKwljbXAJUkVUVVJOXzEsIEVYSVRfTVNHX0xPT1AJamUgSVRsb29wOworCWNtcAlSRVRVUk5fMSwgQ09OVF9NU0dfTE9PUF9XUklURQlqbmUgLiArIDM7CisJbW92CVNDU0lEQVQsIFJFVFVSTl8yOworCWptcAlob3N0X21lc3NhZ2VfbG9vcDsKKwkvKiBNdXN0IGJlIENPTlRfTVNHX0xPT1BfUkVBRCAqLworCW1vdglOT05FLCBTQ1NJREFUOwkvKiBBQ0sgQnl0ZSAqLworCWptcAlob3N0X21lc3NhZ2VfbG9vcDsKKworbWVzZ2luX2lnbl93aWRlX3Jlc2lkdWU6CisJbW92CVNBVkVEX01PREUsIE1PREVfUFRSOworCVNFVF9NT0RFKE1fU0NTSSwgTV9TQ1NJKQorCXNocglORUdPQUREUiwgNCwgU0FWRURfU0NTSUlEOworCW1vdglBLCBORUdDT05PUFRTOworCVJFU1RPUkVfTU9ERShTQVZFRF9NT0RFKQorCXRlc3QJQSwgV0lERVhGRVIganogbWVzZ2luX3JlamVjdDsKKwkvKiBQdWxsIHRoZSByZXNpZHVlIGJ5dGUgKi8KKwltdmkJUkVHMAljYWxsIGluYl9uZXh0OworCWNtcAlSRUcwLCAweDAxIGpuZSBtZXNnaW5fcmVqZWN0OworCXRlc3QJU0NCX1JFU0lEVUFMX1NHUFRSWzBdLCBTR19MSVNUX05VTEwganogLiArIDI7CisJdGVzdAlTQ0JfVEFTS19BVFRSSUJVVEUsIFNDQl9YRkVSTEVOX09ERCBqbnogbWVzZ2luX2RvbmU7CisJU0VUX1NFUUlOVENPREUoSUdOX1dJREVfUkVTKQorCWptcAltZXNnaW5fZG9uZTsKKworbWVzZ2luX3Byb3RvX3Zpb2xhdGlvbjoKKwlTRVRfU0VRSU5UQ09ERShQUk9UT19WSU9MQVRJT04pCisJam1wCW1lc2dpbl9kb25lOworbWVzZ2luX3JlamVjdDoKKwltdmkJTVNHX01FU1NBR0VfUkVKRUNUCWNhbGwgbWtfbWVzZzsKK21lc2dpbl9kb25lOgorCW1vdglOT05FLFNDU0lEQVQ7CQkvKmR1bW15IHJlYWQgZnJvbSBsYXRjaCB0byBBQ0sqLworCWptcAlJVGxvb3A7CisKKyNkZWZpbmUgSU5ERVhfRElTQ19MSVNUKHNjc2lpZCwgbHVuKQkJCQkJXAorCWFuZAlBLCAweEMwLCBzY3NpaWQ7CQkJCQlcCisJb3IJU0NCUFRSLCBBLCBsdW47CQkJCQkJXAorCWNscglTQ0JQVFJbMV07CQkJCQkJXAorCWFuZAlTSU5ERVgsIDB4MzAsIHNjc2lpZDsJCQkJCVwKKwlzaHIJU0lOREVYLCAzOwkvKiBNdWx0aXBseSBieSAyICovCQkJXAorCWFkZAlTSU5ERVgsIChTQ0JfRElTQ09OTkVDVEVEX0xJU1RTICYgMHhGRik7CQlcCisJbXZpCVNJTkRFWFsxXSwgKChTQ0JfRElTQ09OTkVDVEVEX0xJU1RTID4+IDgpICYgMHhGRikKKworbWVzZ2luX2lkZW50aWZ5OgorCS8qCisJICogRGV0ZXJtaW5lIHdoZXRoZXIgYSB0YXJnZXQgaXMgdXNpbmcgdGFnZ2VkIG9yIG5vbi10YWdnZWQKKwkgKiB0cmFuc2FjdGlvbnMgYnkgZmlyc3QgbG9va2luZyBhdCB0aGUgdHJhbnNhY3Rpb24gc3RvcmVkIGluCisJICogdGhlIHBlci1kZXZpY2UsIGRpc2Nvbm5lY3RlZCBhcnJheS4gIElmIHRoZXJlIGlzIG5vIHVudGFnZ2VkCisJICogdHJhbnNhY3Rpb24gZm9yIHRoaXMgdGFyZ2V0LCB0aGlzIG11c3QgYmUgYSB0YWdnZWQgdHJhbnNhY3Rpb24uCisJICovCisJYW5kCVNBVkVEX0xVTiwgTVNHX0lERU5USUZZX0xVTk1BU0ssIEE7CisJSU5ERVhfRElTQ19MSVNUKFNBVkVEX1NDU0lJRCwgU0FWRURfTFVOKTsKKwlibW92CURJTkRFWCwgU0lOREVYLCAyOworCWJtb3YJUkVHMCwgU0lORElSLCAyOworCWNtcAlSRUcwWzFdLCBTQ0JfTElTVF9OVUxMIGplIHNub29wX3RhZzsKKwkvKiBVbnRhZ2dlZC4gIENsZWFyIHRoZSBidXN5IHRhYmxlIGVudHJ5IGFuZCBzZXR1cCB0aGUgU0NCLiAqLworCWJtb3YJRElORElSLCBBTExPTkVTLCAyOworCWJtb3YJU0NCUFRSLCBSRUcwLCAyOworCWptcAlzZXR1cF9TQ0I7CisKKy8qCisgKiBIZXJlIHdlICJzbm9vcCIgdGhlIGJ1cyBsb29raW5nIGZvciBhIFNJTVBMRSBRVUVVRSBUQUcgbWVzc2FnZS4KKyAqIElmIHdlIGdldCBvbmUsIHdlIHVzZSB0aGUgdGFnIHJldHVybmVkIHRvIGZpbmQgdGhlIHByb3BlcgorICogU0NCLiAgQWZ0ZXIgcmVjZWl2aW5nIHRoZSB0YWcsIGxvb2sgZm9yIHRoZSBTQ0IgYXQgU0NCIGxvY2F0aW9ucyB0YWcgYW5kCisgKiB0YWcgKyAyNTYuCisgKi8KK3Nub29wX3RhZzoKKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfU0VRVUVOQ0VSX0RFQlVHKSAhPSAwKSB7CisJCW9yCVNFUV9GTEFHUywgMHg4MDsKKwl9CisJbW92CU5PTkUsIFNDU0lEQVQ7CQkvKiBBQ0sgSWRlbnRpZnkgTVNHICovCisJY2FsbAlwaGFzZV9sb2NrOworCWlmICgoYWhkLT5mbGFncyAmIEFIRF9TRVFVRU5DRVJfREVCVUcpICE9IDApIHsKKwkJb3IJU0VRX0ZMQUdTLCAweDE7CisJfQorCWNtcAlMQVNUUEhBU0UsIFBfTUVTR0lOCWpuZSBub3RfZm91bmRfSVRsb29wOworCWlmICgoYWhkLT5mbGFncyAmIEFIRF9TRVFVRU5DRVJfREVCVUcpICE9IDApIHsKKwkJb3IJU0VRX0ZMQUdTLCAweDI7CisJfQorCWNtcAlTQ1NJQlVTLCBNU0dfU0lNUExFX1FfVEFHIGpuZSBub3RfZm91bmQ7CitnZXRfdGFnOgorCWNscglTQ0JQVFJbMV07CisJbXZpCVNDQlBUUgljYWxsIGluYl9uZXh0OwkvKiB0YWcgdmFsdWUgKi8KK3ZlcmlmeV9zY2I6CisJdGVzdAlTQ0JfQ09OVFJPTCxESVNDT05ORUNURUQganogdmVyaWZ5X290aGVyX3NjYjsKKwltb3YJQSwgU0FWRURfU0NTSUlEOworCWNtcAlTQ0JfU0NTSUlELCBBIGpuZSB2ZXJpZnlfb3RoZXJfc2NiOworCW1vdglBLCBTQVZFRF9MVU47CisJY21wCVNDQl9MVU4sIEEgamUgc2V0dXBfU0NCX2Rpc2Nvbm5lY3RlZDsKK3ZlcmlmeV9vdGhlcl9zY2I6CisJeG9yCVNDQlBUUlsxXSwgMTsKKwl0ZXN0CVNDQlBUUlsxXSwgMHhGRiBqbnogdmVyaWZ5X3NjYjsKKwlqbXAJbm90X2ZvdW5kOworCisvKgorICogRW5zdXJlIHRoYXQgdGhlIFNDQiB0aGUgdGFnIHBvaW50cyB0byBpcyBmb3IKKyAqIGFuIFNDQiB0cmFuc2FjdGlvbiB0byB0aGUgcmVjb25uZWN0aW5nIHRhcmdldC4KKyAqLworc2V0dXBfU0NCOgorCWlmICgoYWhkLT5mbGFncyAmIEFIRF9TRVFVRU5DRVJfREVCVUcpICE9IDApIHsKKwkJb3IJU0VRX0ZMQUdTLCAweDEwOworCX0KKwl0ZXN0CVNDQl9DT05UUk9MLERJU0NPTk5FQ1RFRCBqeiBub3RfZm91bmQ7CitzZXR1cF9TQ0JfZGlzY29ubmVjdGVkOgorCWFuZAlTQ0JfQ09OVFJPTCx+RElTQ09OTkVDVEVEOworCWNscglTRVFfRkxBR1M7CS8qIG1ha2Ugbm90ZSBvZiBJREVOVElGWSAqLworCXRlc3QJU0NCX1NHUFRSLCBTR19MSVNUX05VTEwgam56IC4gKyAzOworCWJtb3YJQUxMT0NGSUZPX1NDQlBUUiwgU0NCUFRSLCAyOworCWNhbGwJYWxsb2NhdGVfZmlmbzsKKwkvKiBTZWUgaWYgdGhlIGhvc3Qgd2FudHMgdG8gc2VuZCBhIG1lc3NhZ2UgdXBvbiByZWNvbm5lY3Rpb24gKi8KKwl0ZXN0CVNDQl9DT05UUk9MLCBNS19NRVNTQUdFIGp6IG1lc2dpbl9kb25lOworCW12aQlIT1NUX01TRwljYWxsIG1rX21lc2c7CisJam1wCW1lc2dpbl9kb25lOworCitub3RfZm91bmQ6CisJU0VUX1NFUUlOVENPREUoTk9fTUFUQ0gpCisJam1wCW1lc2dpbl9kb25lOworCitub3RfZm91bmRfSVRsb29wOgorCVNFVF9TRVFJTlRDT0RFKE5PX01BVENIKQorCWptcAlJVGxvb3A7CisKKy8qCisgKiBXZSByZWNlaXZlZCBhICJjb21tYW5kIGNvbXBsZXRlIiBtZXNzYWdlLiAgUHV0IHRoZSBTQ0Igb24gdGhlIGNvbXBsZXRlCisgKiBxdWV1ZSBhbmQgdHJpZ2dlciBhIGNvbXBsZXRpb24gaW50ZXJydXB0IHZpYSB0aGUgaWRsZSBsb29wLiAgQmVmb3JlIGRvaW5nCisgKiBzbywgY2hlY2sgdG8gc2VlIGlmIHRoZXJlCisgKiBpcyBhIHJlc2lkdWFsIG9yIHRoZSBzdGF0dXMgYnl0ZSBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiBTVEFUVVNfR09PRCAoMCkuCisgKiBJbiBlaXRoZXIgb2YgdGhlc2UgY29uZGl0aW9ucywgd2UgdXBsb2FkIHRoZSBTQ0IgYmFjayB0byB0aGUgaG9zdCBzbyBpdCBjYW4KKyAqIHByb2Nlc3MgdGhpcyBpbmZvcm1hdGlvbi4gIEluIHRoZSBjYXNlIG9mIGEgbm9uIHplcm8gc3RhdHVzIGJ5dGUsIHdlIAorICogYWRkaXRpb25hbGx5IGludGVycnVwdCB0aGUga2VybmVsIGRyaXZlciBzeW5jaHJvbm91c2x5LCBhbGxvd2luZyBpdCB0bworICogZGVjaWRlIGlmIHNlbnNlIHNob3VsZCBiZSByZXRyaWV2ZWQuICBJZiB0aGUga2VybmVsIGRyaXZlciB3aXNoZXMgdG8gcmVxdWVzdAorICogc2Vuc2UsIGl0IHdpbGwgZmlsbCB0aGUga2VybmVsIFNDQiB3aXRoIGEgcmVxdWVzdCBzZW5zZSBjb21tYW5kLCByZXF1ZXVlCisgKiBpdCB0byB0aGUgUUlORklGTyBhbmQgdGVsbCB1cyBub3QgdG8gcG9zdCB0byB0aGUgUU9VVEZJRk8gYnkgc2V0dGluZyAKKyAqIFJFVFVSTl8xIHRvIFNFTkRfU0VOU0UuCisgKi8KK21lc2dpbl9jb21wbGV0ZToKKworCS8qCisJICogSWYgQVROIGlzIHJhaXNlZCwgd2Ugc3RpbGwgd2FudCB0byBnaXZlIHRoZSB0YXJnZXQgYSBtZXNzYWdlLgorCSAqIFBlcmhhcHMgdGhlcmUgd2FzIGEgcGFyaXR5IGVycm9yIG9uIHRoaXMgbGFzdCBtZXNzYWdlIGJ5dGUuCisJICogRWl0aGVyIHdheSwgdGhlIHRhcmdldCBzaG91bGQgdGFrZSB1cyB0byBtZXNzYWdlIG91dCBwaGFzZQorCSAqIGFuZCB0aGVuIGF0dGVtcHQgdG8gY29tcGxldGUgdGhlIGNvbW1hbmQgYWdhaW4uICBXZSBzaG91bGQgdXNlIGEKKwkgKiBjcml0aWNhbCBzZWN0aW9uIGhlcmUgdG8gZ3VhcmQgYWdhaW5zdCBhIHRpbWVvdXQgdHJpZ2dlcmluZworCSAqIGZvciB0aGlzIGNvbW1hbmQgYW5kIHNldHRpbmcgQVROIHdoaWxlIHdlIGFyZSBzdGlsbCBwcm9jZXNzaW5nCisJICogdGhlIGNvbXBsZXRpb24uCisJdGVzdAlTQ1NJU0lHSSwgQVROSSBqbnogbWVzZ2luX2RvbmU7CisJICovCisKKwkvKgorCSAqIElmIHdlIGFyZSBpZGVudGlmaWVkIGFuZCBoYXZlIHN1Y2Nlc3NmdWxseSBzZW50IHRoZSBDREIsCisJICogYW55IHN0YXR1cyB3aWxsIGRvLiAgT3B0aW1pemUgdGhpcyBmYXN0IHBhdGguCisJICovCisJdGVzdAlTQ0JfQ09OVFJPTCwgU1RBVFVTX1JDVkQganogbWVzZ2luX3Byb3RvX3Zpb2xhdGlvbjsKKwl0ZXN0CVNFUV9GTEFHUywgTk9UX0lERU5USUZJRUR8Tk9fQ0RCX1NFTlQganogY29tcGxldGVfYWNjZXB0ZWQ7CisKKwkvKgorCSAqIElmIHRoZSB0YXJnZXQgbmV2ZXIgc2VudCBhbiBpZGVudGlmeSBtZXNzYWdlIGJ1dCBpbnN0ZWFkIHdlbnQKKwkgKiB0byBtZXNnaW4gdG8gZ2l2ZSBhbiBpbnZhbGlkIG1lc3NhZ2UsIGxldCB0aGUgaG9zdCBhYm9ydCB1cy4KKwkgKi8KKwl0ZXN0CVNFUV9GTEFHUywgTk9UX0lERU5USUZJRUQgam56IG1lc2dpbl9wcm90b192aW9sYXRpb247CisKKwkvKgorCSAqIElmIHdlIHJlY2V2aWVkIGdvb2Qgc3RhdHVzIGJ1dCBuZXZlciBzdWNjZXNzZnVsbHkgc2VudCB0aGUKKwkgKiBjZGIsIGFib3J0IHRoZSBjb21tYW5kLgorCSAqLworCXRlc3QJU0NCX1NDU0lfU1RBVFVTLDB4ZmYJam56IGNvbXBsZXRlX2FjY2VwdGVkOworCXRlc3QJU0VRX0ZMQUdTLCBOT19DREJfU0VOVCBqbnogbWVzZ2luX3Byb3RvX3Zpb2xhdGlvbjsKK2NvbXBsZXRlX2FjY2VwdGVkOgorCisJLyoKKwkgKiBTZWUgaWYgd2UgYXR0ZW1wdGVkIHRvIGRlbGl2ZXIgYSBtZXNzYWdlIGJ1dCB0aGUgdGFyZ2V0IGluZ25vcmVkIHVzLgorCSAqLworCXRlc3QJU0NCX0NPTlRST0wsIE1LX01FU1NBR0UganogY29tcGxldGVfbm9tc2c7CisJU0VUX1NFUUlOVENPREUoTUtNU0dfRkFJTEVEKQorY29tcGxldGVfbm9tc2c6CisJY2FsbAlxdWV1ZV9zY2JfY29tcGxldGlvbjsKKwlqbXAJYXdhaXRfYnVzZnJlZTsKKworZnJlZXplX3F1ZXVlOgorCS8qIENhbmNlbCBhbnkgcGVuZGluZyBzZWxlY3Qtb3V0LiAqLworCXRlc3QJU1NUQVQwLCBTRUxET3xTRUxJTkdPIGpueiAuICsgMjsKKwlhbmQJU0NTSVNFUTAsIH5FTlNFTE87CisJbW92CUFDQ1VNX1NBVkUsIEE7CisJY2xyCUE7CisJYWRkCVFGUkVFWkVfQ09VTlQsIDE7CisJYWRjCVFGUkVFWkVfQ09VTlRbMV0sIEE7CisJb3IJU0VRX0ZMQUdTMiwgU0VMRUNUT1VUX1FGUk9aRU47CisJbW92CUEsIEFDQ1VNX1NBVkUgcmV0OworCisvKgorICogQ29tcGxldGUgdGhlIGN1cnJlbnQgRklGTydzIFNDQiBpZiBkYXRhIGZvciB0aGlzIHNhbWUKKyAqIFNDQiBpcyBub3QgdHJhbnNmZXJyaW5nIGluIHRoZSBvdGhlciBGSUZPLgorICovCitTRVRfU1JDX01PREUJTV9ERkYxOworU0VUX0RTVF9NT0RFCU1fREZGMTsKK3BrdF9jb21wbGV0ZV9zY2JfaWZfZmlmb3NfaWRsZToKKwlibW92CUFSR18xLCBTQ0JQVFIsIDI7CisJbXZpCURGRlNYRlJDVEwsIENMUkNITjsKKwlTRVRfTU9ERShNX1NDU0ksIE1fU0NTSSkKKwlibW92CVNDQlBUUiwgQVJHXzEsIDI7CisJdGVzdAlTQ0JfRklGT19VU0VfQ09VTlQsIDB4RkYgam56IHJldHVybjsKK3F1ZXVlX3NjYl9jb21wbGV0aW9uOgorCXRlc3QJU0NCX1NDU0lfU1RBVFVTLDB4ZmYJam56IGJhZF9zdGF0dXM7CisJLyoKKwkgKiBDaGVjayBmb3IgcmVzaWR1YWxzCisJICovCisJdGVzdAlTQ0JfU0dQVFIsIFNHX0xJU1RfTlVMTCBqbnogY29tcGxldGU7CS8qIE5vIHhmZXIgKi8KKwl0ZXN0CVNDQl9TR1BUUiwgU0dfRlVMTF9SRVNJRCBqbnogdXBsb2FkX3NjYjsvKiBOZXZlciB4ZmVyZWQgKi8KKwl0ZXN0CVNDQl9SRVNJRFVBTF9TR1BUUiwgU0dfTElTVF9OVUxMIGp6IHVwbG9hZF9zY2I7Citjb21wbGV0ZToKKwlibW92CVNDQl9ORVhUX0NPTVBMRVRFLCBDT01QTEVURV9TQ0JfSEVBRCwgMjsKKwlibW92CUNPTVBMRVRFX1NDQl9IRUFELCBTQ0JQVFIsIDIgcmV0OworYmFkX3N0YXR1czoKKwljbXAJU0NCX1NDU0lfU1RBVFVTLCBTVEFUVVNfUEtUX1NFTlNFIGplIHVwbG9hZF9zY2I7CisJY2FsbAlmcmVlemVfcXVldWU7Cit1cGxvYWRfc2NiOgorCS8qCisJICogUmVzdG9yZSBTQ0IgVEFHIHNpbmNlIHdlIHJldXNlIHRoaXMgZmllbGQKKwkgKiBpbiB0aGUgc2VxdWVuY2VyLiAgV2UgZG9uJ3Qgd2FudCB0byBjb3JydXB0CisJICogaXQgb24gdGhlIGhvc3QuCisJICovCisJYm1vdglTQ0JfVEFHLCBTQ0JQVFIsIDI7CisJYm1vdglTQ0JfTkVYVF9DT01QTEVURSwgQ09NUExFVEVfRE1BX1NDQl9IRUFELCAyOworCWJtb3YJQ09NUExFVEVfRE1BX1NDQl9IRUFELCBTQ0JQVFIsIDI7CisJb3IJU0NCX1NHUFRSLCBTR19TVEFUVVNfVkFMSUQgcmV0OworCisvKgorICogSXMgaXQgYSBkaXNjb25uZWN0IG1lc3NhZ2U/ICBTZXQgYSBmbGFnIGluIHRoZSBTQ0IgdG8gcmVtaW5kIHVzCisgKiBhbmQgYXdhaXQgdGhlIGJ1cyBnb2luZyBmcmVlLiAgSWYgdGhpcyBpcyBhbiB1bnRhZ2dlZCB0cmFuc2FjdGlvbgorICogc3RvcmUgdGhlIFNDQiBpZCBmb3IgaXQgaW4gb3VyIHVudGFnZ2VkIHRhcmdldCB0YWJsZSBmb3IgbG9va3VwIG9uCisgKiBhIHJlc2VsY3Rpb24uCisgKi8KK21lc2dpbl9kaXNjb25uZWN0OgorCS8qCisJICogSWYgQVROIGlzIHJhaXNlZCwgd2Ugc3RpbGwgd2FudCB0byBnaXZlIHRoZSB0YXJnZXQgYSBtZXNzYWdlLgorCSAqIFBlcmhhcHMgdGhlcmUgd2FzIGEgcGFyaXR5IGVycm9yIG9uIHRoaXMgbGFzdCBtZXNzYWdlIGJ5dGUKKwkgKiBvciB3ZSB3YW50IHRvIGFib3J0IHRoaXMgY29tbWFuZC4gIEVpdGhlciB3YXksIHRoZSB0YXJnZXQKKwkgKiBzaG91bGQgdGFrZSB1cyB0byBtZXNzYWdlIG91dCBwaGFzZSBhbmQgdGhlbiBhdHRlbXB0IHRvCisJICogZGlzY29ubmVjdCBhZ2Fpbi4KKwkgKiBYWFggLSBXYWl0IGZvciBtb3JlIHRlc3RpbmcuCisJdGVzdAlTQ1NJU0lHSSwgQVROSSBqbnogbWVzZ2luX2RvbmU7CisJICovCisJdGVzdAlTRVFfRkxBR1MsIE5PVF9JREVOVElGSUVEfE5PX0NEQl9TRU5UCisJCWpueiBtZXNnaW5fcHJvdG9fdmlvbGF0aW9uOworCW9yCVNDQl9DT05UUk9MLERJU0NPTk5FQ1RFRDsKKwl0ZXN0CVNDQl9DT05UUk9MLCBUQUdfRU5CIGpueiBhd2FpdF9idXNmcmVlOworcXVldWVfZGlzY19zY2I6CisJYm1vdglSRUcwLCBTQ0JQVFIsIDI7CisJSU5ERVhfRElTQ19MSVNUKFNBVkVEX1NDU0lJRCwgU0FWRURfTFVOKTsKKwlibW92CURJTkRFWCwgU0lOREVYLCAyOworCWJtb3YJRElORElSLCBSRUcwLCAyOworCWJtb3YJU0NCUFRSLCBSRUcwLCAyOworCS8qIEZBTExUSFJPVUdIICovCithd2FpdF9idXNmcmVlOgorCWFuZAlTSU1PREUxLCB+RU5CVVNGUkVFOworCWlmICgoYWhkLT5idWdzICYgQUhEX0JVU0ZSRUVSRVZfQlVHKSA9PSAwKSB7CisJCS8qCisJCSAqIEluIHRoZSBCVVNGUkVFUkVWX0JVRyBjYXNlLCB0aGUKKwkJICogYnVzZnJlZSBzdGF0dXMgd2FzIGNsZWFyZWQgYXQgdGhlCisJCSAqIGJlZ2lubmluZyBvZiB0aGUgY29ubmVjdGlvbi4KKwkJICovCisJCW12aQlDTFJTSU5UMSxDTFJCVVNGUkVFOworCX0KKwltb3YJTk9ORSwgU0NTSURBVDsJCS8qIEFjayB0aGUgbGFzdCBieXRlICovCisJdGVzdAlNT0RFX1BUUiwgfihNS19NT0RFKE1fREZGMSwgTV9ERkYxKSkKKwkJam56IGF3YWl0X2J1c2ZyZWVfbm90X21fZGZmOworU0VUX1NSQ19NT0RFCU1fREZGMTsKK1NFVF9EU1RfTU9ERQlNX0RGRjE7Cithd2FpdF9idXNmcmVlX2NscmNobjoKKwltdmkJREZGU1hGUkNUTCwgQ0xSQ0hOOworYXdhaXRfYnVzZnJlZV9ub3RfbV9kZmY6CisJY2FsbAljbGVhcl90YXJnZXRfc3RhdGU7CisJdGVzdAlTU1RBVDEsUkVRSU5JVHxCVVNGUkVFCWp6IC47CisJdGVzdAlTU1RBVDEsIEJVU0ZSRUUgam56IGlkbGVfbG9vcDsKKwlTRVRfU0VRSU5UQ09ERShNSVNTRURfQlVTRlJFRSkKKworCisvKgorICogU2F2ZSBkYXRhIHBvaW50ZXJzIG1lc3NhZ2U6CisgKiBDb3B5aW5nIFJBTSB2YWx1ZXMgYmFjayB0byBTQ0IsIGZvciBTYXZlIERhdGEgUG9pbnRlcnMgbWVzc2FnZSwgYnV0CisgKiBvbmx5IGlmIHdlJ3ZlIGFjdHVhbGx5IGJlZW4gaW50byBhIGRhdGEgcGhhc2UgdG8gY2hhbmdlIHRoZW0uICBUaGlzCisgKiBwcm90ZWN0cyBhZ2FpbnN0IGJvZ3VzIGRhdGEgaW4gc2NyYXRjaCByYW0gYW5kIHRoZSByZXNpZHVhbCBjb3VudHMKKyAqIHNpbmNlIHRoZXkgYXJlIG9ubHkgaW5pdGlhbGl6ZWQgd2hlbiB3ZSBnbyBpbnRvIGRhdGFfaW4gb3IgZGF0YV9vdXQuCisgKiBBY2sgdGhlIG1lc3NhZ2UgYXMgc29vbiBhcyBwb3NzaWJsZS4KKyAqLworU0VUX1NSQ19NT0RFCU1fREZGMTsKK1NFVF9EU1RfTU9ERQlNX0RGRjE7CittZXNnaW5fc2RwdHJzOgorCW1vdglOT05FLFNDU0lEQVQ7CQkvKmR1bW15IHJlYWQgZnJvbSBsYXRjaCB0byBBQ0sqLworCXRlc3QJU0VRX0ZMQUdTLCBEUEhBU0UJanogSVRsb29wOworCWNhbGwJc2F2ZV9wb2ludGVyczsKKwlqbXAJSVRsb29wOworCitzYXZlX3BvaW50ZXJzOgorCS8qCisJICogSWYgd2UgYXJlIGFza2VkIHRvIHNhdmUgb3VyIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlCisJICogdHJhbnNmZXIsIGp1c3QgbWFyayB1cyBhdCB0aGUgZW5kIHJhdGhlciB0aGFuIHBlcmZvcm0gYQorCSAqIGZ1bGwgc2F2ZS4KKwkgKi8KKwl0ZXN0CVNDQl9SRVNJRFVBTF9TR1BUUlswXSwgU0dfTElTVF9OVUxMIGp6IHNhdmVfcG9pbnRlcnNfZnVsbDsKKwlvcglTQ0JfU0dQVFIsIFNHX0xJU1RfTlVMTCByZXQ7CisKK3NhdmVfcG9pbnRlcnNfZnVsbDoKKwkvKgorCSAqIFRoZSBTQ0JfREFUQVBUUiBiZWNvbWVzIHRoZSBjdXJyZW50IFNIQUREUi4KKwkgKiBBbGwgb3RoZXIgaW5mb3JtYXRpb24gY29tZXMgZGlyZWN0bHkgZnJvbSBvdXIgcmVzaWR1YWwKKwkgKiBzdGF0ZS4KKwkgKi8KKwlibW92CVNDQl9EQVRBUFRSLCBTSEFERFIsIDg7CisJYm1vdglTQ0JfREFUQUNOVCwgU0NCX1JFU0lEVUFMX0RBVEFDTlQsIDggcmV0OworCisvKgorICogUmVzdG9yZSBwb2ludGVycyBtZXNzYWdlPyAgRGF0YSBwb2ludGVycyBhcmUgcmVjb3BpZWQgZnJvbSB0aGUKKyAqIFNDQiBhbnl0aW1lIHdlIGVudGVyIGEgZGF0YSBwaGFzZSBmb3IgdGhlIGZpcnN0IHRpbWUsIHNvIGFsbAorICogd2UgbmVlZCB0byBkbyBpcyBjbGVhciB0aGUgRFBIQVNFIGZsYWcgYW5kIGxldCB0aGUgZGF0YSBwaGFzZQorICogY29kZSBkbyB0aGUgcmVzdC4gIFdlIGFsc28gcmVzZXQvcmVhbGxvY2F0ZSB0aGUgRklGTyB0byBtYWtlCisgKiBzdXJlIHdlIGhhdmUgYSBjbGVhbiBzdGFydCBmb3IgdGhlIG5leHQgZGF0YSBvciBjb21tYW5kIHBoYXNlLgorICovCittZXNnaW5fcmRwdHJzOgorCWFuZAlTRVFfRkxBR1MsIH5EUEhBU0U7CisJdGVzdAlNT0RFX1BUUiwgfihNS19NT0RFKE1fREZGMSwgTV9ERkYxKSkgam56IG1zZ2luX3JkcHRyc19nZXRfZmlmbzsKKwltdmkJREZGU1hGUkNUTCwgUlNUQ0hOfENMUlNIQ05UOworCVNFVF9NT0RFKE1fU0NTSSwgTV9TQ1NJKQorbXNnaW5fcmRwdHJzX2dldF9maWZvOgorCWNhbGwJYWxsb2NhdGVfZmlmbzsKKwlqbXAJbWVzZ2luX2RvbmU7CisKK2NsZWFyX3RhcmdldF9zdGF0ZToKKwltdmkJTEFTVFBIQVNFLCBQX0JVU0ZSRUU7CisJLyogY2xlYXIgdGFyZ2V0IHNwZWNpZmljIGZsYWdzICovCisJbXZpCVNFUV9GTEFHUywgTk9UX0lERU5USUZJRUR8Tk9fQ0RCX1NFTlQgcmV0OworCitwaGFzZV9sb2NrOiAgICAgCisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfRUFSTFlfUkVRX0JVRykgIT0gMCkgeworCQkvKgorCQkgKiBEb24ndCBpZ25vcmUgcGVyc2lzdGVudCBSRVEgYXNzZXJ0aW9ucyBqdXN0IGJlY2F1c2UKKwkJICogdGhleSB3ZXJlIGFzc2VydGVkIHdpdGhpbiB0aGUgYnVzIHNldHRsZSBkZWxheSB3aW5kb3cuCisJCSAqIFRoaXMgYWxsb3dzIHVzIHRvIHRvbGVyYXRlIGRldmljZXMgbGlrZSB0aGUgR0VNMzE4CisJCSAqIHRoYXQgdmlvbGF0ZSB0aGUgU0NTSSBzcGVjLiAgV2UgYXJlIGNhcmVmdWwgbm90IHRvCisJCSAqIGNvdW50IFJFUSB3aGlsZSB3ZSBhcmUgd2FpdGluZyBmb3IgaXQgdG8gZmFsbCBkdXJpbmcKKwkJICogYW4gYXN5bmMgcGhhc2UgZHVlIHRvIG91ciBhc3NlcnRlZCBBQ0suICBFYWNoCisJCSAqIHNlcXVlbmNlciBpbnN0cnVjdGlvbiB0YWtlcyB+MjVucywgc28gdGhlIFJFUSBtdXN0CisJCSAqIGxhc3QgYXQgbGVhc3QgMTAwbnMgaW4gb3JkZXIgdG8gYmUgY291bnRlZCBhcyBhIHRydWUKKwkJICogUkVRLgorCQkgKi8KKwkJdGVzdAlTQ1NJUEhBU0UsIDB4RkYgam56IHBoYXNlX2xvY2tlZDsKKwkJdGVzdAlTQ1NJU0lHSSwgQUNLSSBqbnogcGhhc2VfbG9jazsKKwkJdGVzdAlTQ1NJU0lHSSwgUkVRSSBqeiBwaGFzZV9sb2NrOworCQl0ZXN0CVNDU0lQSEFTRSwgMHhGRiBqbnogcGhhc2VfbG9ja2VkOworCQl0ZXN0CVNDU0lTSUdJLCBBQ0tJIGpueiBwaGFzZV9sb2NrOworCQl0ZXN0CVNDU0lTSUdJLCBSRVFJIGp6IHBoYXNlX2xvY2s7CitwaGFzZV9sb2NrZWQ6CisJfSBlbHNlIHsKKwkJdGVzdAlTQ1NJUEhBU0UsIDB4RkYganogLjsKKwl9CisJdGVzdAlTU1RBVDEsIFNDU0lQRVJSIGpueiBwaGFzZV9sb2NrOworcGhhc2VfbG9ja19sYXRjaF9waGFzZToKKwlhbmQJTEFTVFBIQVNFLCBQSEFTRV9NQVNLLCBTQ1NJU0lHSSByZXQ7CisKKy8qCisgKiBGdW5jdGlvbnMgdG8gcmVhZCBkYXRhIGluIEF1dG9tYXRpYyBQSU8gbW9kZS4KKyAqCisgKiBBbiBBQ0sgaXMgbm90IHNlbnQgb24gaW5wdXQgZnJvbSB0aGUgdGFyZ2V0IHVudGlsIFNDU0lEQVRMIGlzIHJlYWQgZnJvbS4KKyAqIFNvIHdlIHdhaXQgdW50aWwgU0NTSURBVEwgaXMgbGF0Y2hlZCAodGhlIHVzdWFsIHdheSksIHRoZW4gcmVhZCB0aGUgZGF0YQorICogYnl0ZSBkaXJlY3RseSBvZmYgdGhlIGJ1cyB1c2luZyBTQ1NJQlVTTC4gIFdoZW4gd2UgaGF2ZSBwdWxsZWQgdGhlIEFUTgorICogbGluZSwgb3Igd2UganVzdCB3YW50IHRvIGFja25vd2xlZGdlIHRoZSBieXRlLCB0aGVuIHdlIGRvIGEgZHVtbXkgcmVhZAorICogZnJvbSBTQ0lTREFUTC4gIFRoZSBTQ1NJIHNwZWMgZ3VhcmFudGVlcyB0aGF0IHRoZSB0YXJnZXQgd2lsbCBob2xkIHRoZQorICogZGF0YSBieXRlIG9uIHRoZSBidXMgdW50aWwgd2Ugc2VuZCBvdXIgQUNLLgorICoKKyAqIFRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCB0aGVzZSBhcmUgY2FsbGVkIGluIGEgcGFydGljdWxhciBzZXF1ZW5jZSwKKyAqIGFuZCB0aGF0IFJFUSBpcyBhbHJlYWR5IHNldCB3aGVuIGluYl9maXJzdCBpcyBjYWxsZWQuICBpbmJfe2ZpcnN0LG5leHR9CisgKiB1c2UgdGhlIHNhbWUgY2FsbGluZyBjb252ZW50aW9uIGFzIGluYi4KKyAqLworaW5iX25leHQ6CisJbW92CU5PTkUsU0NTSURBVDsJCS8qZHVtbXkgcmVhZCBmcm9tIGxhdGNoIHRvIEFDSyovCitpbmJfbmV4dF93YWl0OgorCS8qCisJICogSWYgdGhlcmUgaXMgYSBwYXJpdHkgZXJyb3IsIHdhaXQgZm9yIHRoZSBrZXJuZWwgdG8KKwkgKiBzZWUgdGhlIGludGVycnVwdCBhbmQgcHJlcGFyZSBvdXIgbWVzc2FnZSByZXNwb25zZQorCSAqIGJlZm9yZSBjb250aW51aW5nLgorCSAqLworCXRlc3QJU0NTSVBIQVNFLCAweEZGIGp6IC47CisJdGVzdAlTU1RBVDEsIFNDU0lQRVJSIGpueiBpbmJfbmV4dF93YWl0OworaW5iX25leHRfY2hlY2tfcGhhc2U6CisJYW5kCUxBU1RQSEFTRSwgUEhBU0VfTUFTSywgU0NTSVNJR0k7CisJY21wCUxBU1RQSEFTRSwgUF9NRVNHSU4gam5lIG1lc2dpbl9waGFzZW1pczsKK2luYl9maXJzdDoKKwljbHIJRElOREVYWzFdOworCW1vdglESU5ERVgsU0lOREVYOworCW1vdglESU5ESVIsU0NTSUJVUwlyZXQ7CQkvKnJlYWQgYnl0ZSBkaXJlY3RseSBmcm9tIGJ1cyovCitpbmJfbGFzdDoKKwltb3YJTk9ORSxTQ1NJREFUIHJldDsJCS8qZHVtbXkgcmVhZCBmcm9tIGxhdGNoIHRvIEFDSyovCisKK21rX21lc2c6CisJbXZpCVNDU0lTSUdPLCBBVE5POworCW1vdglNU0dfT1VULFNJTkRFWCByZXQ7CisKK1NFVF9TUkNfTU9ERQlNX0RGRjE7CitTRVRfRFNUX01PREUJTV9ERkYxOworZGlzYWJsZV9jY3NnZW46CisJdGVzdAlTR19TVEFURSwgRkVUQ0hfSU5QUk9HIGp6IGRpc2FibGVfY2NzZ2VuX2ZldGNoX2RvbmU7CisJY2xyCUNDU0dDVEw7CitkaXNhYmxlX2Njc2dlbl9mZXRjaF9kb25lOgorCWNscglTR19TVEFURSByZXQ7CisKK3NlcnZpY2VfZmlmbzoKKwkvKgorCSAqIERvIHdlIGhhdmUgYW55IHByZWZldGNoIGxlZnQ/Pz8KKwkgKi8KKwl0ZXN0CVNHX1NUQVRFLCBTRUdTX0FWQUlMIGpueiBpZGxlX3NnX2F2YWlsOworCisJLyoKKwkgKiBDYW4gdGhpcyBGSUZPIGhhdmUgYWNjZXNzIHRvIHRoZSBTL0cgY2FjaGUgeWV0PworCSAqLworCXRlc3QJQ0NTR0NUTCwgU0dfQ0FDSEVfQVZBSUwganogcmV0dXJuOworCisJLyogRGlkIHdlIGp1c3QgZmluaXNoIGZldGNoaW5nIHNlZ3M/ICovCisJdGVzdAlDQ1NHQ1RMLCBDQ1NHRE9ORSBqbnogaWRsZV9zZ2ZldGNoX2NvbXBsZXRlOworCisJLyogQXJlIHdlIGFjdGl2ZWx5IGZldGNoaW5nIHNlZ21lbnRzPyAqLworCXRlc3QJQ0NTR0NUTCwgQ0NTR0VOQUNLIGpueiByZXR1cm47CisKKwkvKgorCSAqIFdlIGZldGNoIGEgImNhY2hlbGluZSBhbGlnbmVkIiBhbmQgc2l6ZWQgYW1vdW50IG9mIGRhdGEKKwkgKiBzbyB3ZSBkb24ndCBlbmQgdXAgcmVmZXJlbmNpbmcgYSBub24tZXhpc3RhbnQgcGFnZS4KKwkgKiBDYWNoZWxpbmUgYWxpZ25lZCBpcyBpbiBxdW90ZXMgYmVjYXVzZSB0aGUga2VybmVsIHdpbGwKKwkgKiBzZXQgdGhlIHByZWZldGNoIGFtb3VudCB0byBhIHJlYXNvbmFibGUgbGV2ZWwgaWYgdGhlCisJICogY2FjaGVsaW5lIHNpemUgaXMgdW5rbm93bi4KKwkgKi8KKwlibW92CVNHSEFERFIsIFNDQl9SRVNJRFVBTF9TR1BUUiwgNDsKKwltdmkJU0dIQ05ULCBTR19QUkVGRVRDSF9DTlQ7CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfUkVHX1NMT1dfU0VUVExFX0JVRykgIT0gMCkgeworCQkvKgorCQkgKiBOZWVkIHR3byBpbnN0cnVjdGlvbiBiZXR3ZWVuICJ0b3VjaGVzIiBvZiBTR0hBRERSLgorCQkgKi8KKwkJbm9wOworCX0KKwlhbmQJU0dIQUREUlswXSwgU0dfUFJFRkVUQ0hfQUxJR05fTUFTSywgU0NCX1JFU0lEVUFMX1NHUFRSOworCW12aQlDQ1NHQ1RMLCBDQ1NHRU58Q0NTR1JFU0VUOworCW9yCVNHX1NUQVRFLCBGRVRDSF9JTlBST0cgcmV0OworaWRsZV9zZ2ZldGNoX2NvbXBsZXRlOgorCS8qCisJICogR3VhcmQgYWdhaW5zdCBTR19DQUNIRV9BVkFJTCBhY3RpdmF0aW5nIGR1cmluZyBzZyBmZXRjaAorCSAqIHJlcXVlc3QgaW4gdGhlIG90aGVyIEZJRk8uCisJICovCisJdGVzdAlTR19TVEFURSwgRkVUQ0hfSU5QUk9HIGp6IHJldHVybjsKKwljbHIJQ0NTR0NUTDsKKwlhbmQJQ0NTR0FERFIsIFNHX1BSRUZFVENIX0FERFJfTUFTSywgU0NCX1JFU0lEVUFMX1NHUFRSOworCW12aQlTR19TVEFURSwgU0VHU19BVkFJTHxMT0FESU5HX05FRURFRDsKK2lkbGVfc2dfYXZhaWw6CisJLyogRG9lcyB0aGUgaGFyZHdhcmUgaGF2ZSBzcGFjZSBmb3IgYW5vdGhlciBTRyBlbnRyeT8gKi8KKwl0ZXN0CURGU1RBVFVTLCBQUkVMT0FEX0FWQUlMIGp6IHJldHVybjsKKwkvKgorCSAqIE9uIHRoZSBBLCBwcmVsb2FkaW5nIGEgc2VnbWVudCBiZWZvcmUgSERNQUVOQUNLCisJICogY29tZXMgdHJ1ZSBjYW4gY2xvYmJlciB0aGUgc2hhZGRvdyBhZGRyZXNzIG9mIHRoZQorCSAqIGZpcnN0IHNlZ21lbnQgaW4gdGhlIFMvRyBGSUZPLiAgV2FpdCB1bnRpbCBpdCBpcworCSAqIHNhZmUgdG8gcHJvY2VlZC4KKwkgKi8KKwlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfTkVXX0RGQ05UUkxfT1BUUykgPT0gMCkgeworCQl0ZXN0CURGQ05UUkwsIEhETUFFTkFDSyBqeiByZXR1cm47CisJfQorCWlmICgoYWhkLT5mbGFncyAmIEFIRF82NEJJVF9BRERSRVNTSU5HKSAhPSAwKSB7CisJCWJtb3YJSEFERFIsIENDU0dSQU0sIDg7CisJfSBlbHNlIHsKKwkJYm1vdiAJSEFERFIsIENDU0dSQU0sIDQ7CisJfQorCWJtb3YJSENOVCwgQ0NTR1JBTSwgMzsKKwlibW92CVNDQl9SRVNJRFVBTF9EQVRBQ05UWzNdLCBDQ1NHUkFNLCAxOworCWlmICgoYWhkLT5mbGFncyAmIEFIRF8zOUJJVF9BRERSRVNTSU5HKSAhPSAwKSB7CisJCWFuZAlIQUREUls0XSwgU0dfSElHSF9BRERSX0JJVFMsIFNDQl9SRVNJRFVBTF9EQVRBQ05UWzNdOworCX0KKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfNjRCSVRfQUREUkVTU0lORykgIT0gMCkgeworCQkvKiBTa2lwIDQgYnl0ZXMgb2YgcGFkLiAqLworCQlhZGQJQ0NTR0FERFIsIDQ7CisJfQorc2dfYWR2YW5jZToKKwljbHIJQTsJCQkvKiBhZGQgc2l6ZW9mKHN0cnVjdCBzY2F0dGVyKSAqLworCWFkZAlTQ0JfUkVTSURVQUxfU0dQVFJbMF0sU0dfU0laRU9GOworCWFkYwlTQ0JfUkVTSURVQUxfU0dQVFJbMV0sQTsKKwlhZGMJU0NCX1JFU0lEVUFMX1NHUFRSWzJdLEE7CisJYWRjCVNDQl9SRVNJRFVBTF9TR1BUUlszXSxBOworCW1vdglTSU5ERVgsIFNDQl9SRVNJRFVBTF9TR1BUUlswXTsKKwl0ZXN0CVNDQl9SRVNJRFVBTF9EQVRBQ05UWzNdLCBTR19MQVNUX1NFRyBqeiAuICsgMzsKKwlvcglTSU5ERVgsIExBU1RfU0VHOworCWNscglTR19TVEFURTsKKwltb3YJU0dfQ0FDSEVfUFJFLCBTSU5ERVg7CisJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX05FV19ERkNOVFJMX09QVFMpICE9IDApIHsKKwkJLyoKKwkJICogVXNlIFNDU0lFTldSRElTIHNvIHRoYXQgU0NTSUVOIGlzIG5ldmVyCisJCSAqIG1vZGlmaWVkIGJ5IHRoaXMgb3BlcmF0aW9uLgorCQkgKi8KKwkJb3IJREZDTlRSTCwgUFJFTE9BREVOfEhETUFFTnxTQ1NJRU5XUkRJUzsKKwl9IGVsc2UgeworCQlvcglERkNOVFJMLCBQUkVMT0FERU58SERNQUVOOworCX0KKwkvKgorCSAqIERvIHdlIGhhdmUgYW5vdGhlciBzZWdtZW50IGluIHRoZSBjYWNoZT8KKwkgKi8KKwlhZGQJTk9ORSwgU0dfUFJFRkVUQ0hfQ05UX0xJTUlULCBDQ1NHQUREUjsKKwlqbmMJcmV0dXJuOworCWFuZAlTR19TVEFURSwgflNFR1NfQVZBSUwgcmV0OworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgRE1BIGFkZHJlc3MgYW5kIGNvdW50ZXIgZnJvbSB0aGUgU0NCLgorICovCitsb2FkX2ZpcnN0X3NlZzoKKwlibW92CUhBRERSLCBTQ0JfREFUQVBUUiwgMTE7CisJYW5kCVJFR19JU1IsIH5TR19GVUxMX1JFU0lELCBTQ0JfU0dQVFJbMF07CisJdGVzdAlTQ0JfREFUQUNOVFszXSwgU0dfTEFTVF9TRUcganogLiArIDI7CisJb3IJUkVHX0lTUiwgTEFTVF9TRUc7CisJbW92CVNHX0NBQ0hFX1BSRSwgUkVHX0lTUjsKKwltdmkJREZDTlRSTCwgKFBSRUxPQURFTnxTQ1NJRU58SERNQUVOKTsKKwkvKgorCSAqIFNpbmNlIHdlJ3ZlIGFyZSBlbnRlcmluZyBhIGRhdGEgcGhhc2UsIHdlIHdpbGwKKwkgKiByZWx5IG9uIHRoZSBTQ0JfUkVTSUQqIGZpZWxkcy4gIEluaXRpYWxpemUgdGhlCisJICogcmVzaWR1YWwgYW5kIGNsZWFyIHRoZSBmdWxsIHJlc2lkdWFsIGZsYWcuCisJICovCisJYW5kCVNDQl9TR1BUUlswXSwgflNHX0ZVTExfUkVTSUQ7CisJYm1vdglTQ0JfUkVTSURVQUxfREFUQUNOVFszXSwgU0NCX0RBVEFDTlRbM10sIDU7CisJLyogSWYgd2UgbmVlZCBtb3JlIFMvRyBlbGVtZW50cywgdGVsbCB0aGUgaWRsZSBsb29wICovCisJdGVzdAlTQ0JfUkVTSURVQUxfREFUQUNOVFszXSwgU0dfTEFTVF9TRUcgam56IC4gKyAyOworCW12aQlTR19TVEFURSwgTE9BRElOR19ORUVERUQgcmV0OworCWNscglTR19TVEFURSByZXQ7CisKK3BfZGF0YV9oYW5kbGVfeGZlcjoKKwljYWxsCXNldGptcDsKKwl0ZXN0CVNHX1NUQVRFLCBMT0FESU5HX05FRURFRCBqbnogc2VydmljZV9maWZvOworcF9kYXRhX2NsZWFyX2hhbmRsZXI6CisJb3IJTE9OR0pNUF9BRERSWzFdLCBJTlZBTElEX0FERFIgcmV0OworCitwX2RhdGE6CisJdGVzdAlTRVFfRkxBR1MsIE5PVF9JREVOVElGSUVEfE5PX0NEQl9TRU5UCWp6IHBfZGF0YV9hbGxvd2VkOworCVNFVF9TRVFJTlRDT0RFKFBST1RPX1ZJT0xBVElPTikKK3BfZGF0YV9hbGxvd2VkOgorIAorCXRlc3QJU0VRX0ZMQUdTLCBEUEhBU0UJanogZGF0YV9waGFzZV9pbml0aWFsaXplOworCisJLyoKKwkgKiBJZiB3ZSByZS1lbnRlciB0aGUgZGF0YSBwaGFzZSBhZnRlciBnb2luZyB0aHJvdWdoIGFub3RoZXIKKwkgKiBwaGFzZSwgb3VyIHRyYW5zZmVyIGxvY2F0aW9uIGhhcyBhbG1vc3QgY2VydGFpbmx5IGJlZW4KKwkgKiBjb3JydXB0ZWQgYnkgdGhlIGludGVydmVpbmluZywgbm9uLWRhdGEsIHRyYW5zZmVycy4gIEFzaworCSAqIHRoZSBob3N0IGRyaXZlciB0byBmaXggdXMgdXAgYmFzZWQgb24gdGhlIHRyYW5zZmVyIHJlc2lkdWFsCisJICogdW5sZXNzIHdlIGFscmVhZHkga25vdyB0aGF0IHdlIHNob3VsZCBiZSBiaXRidWNrZXRpbmcuCisJICovCisJdGVzdAlTQ0JfUkVTSURVQUxfU0dQVFJbMF0sIFNHX0xJU1RfTlVMTCBqbnogcF9kYXRhX2JpdGJ1Y2tldDsKKwlTRVRfU0VRSU5UQ09ERShQREFUQV9SRUlOSVQpCisJam1wCWRhdGFfcGhhc2VfaW5ib3VuZHM7CisKK3BfZGF0YV9iaXRidWNrZXQ6CisJLyoKKwkgKiBUdXJuIG9uIGBCaXQgQnVja2V0JyBtb2RlLCB3YWl0IHVudGlsIHRoZSB0YXJnZXQgdGFrZXMKKwkgKiB1cyB0byBhbm90aGVyIHBoYXNlLCBhbmQgdGhlbiBub3RpZnkgdGhlIGhvc3QuCisJICovCisJbW92CVNBVkVEX01PREUsIE1PREVfUFRSOworCXRlc3QJTU9ERV9QVFIsIH4oTUtfTU9ERShNX0RGRjEsIE1fREZGMSkpCisJCWpueiBiaXRidWNrZXRfbm90X21fZGZmOworCS8qCisJICogRW5zdXJlIHRoYXQgYW55IEZJRk8gY29udGVudHMgYXJlIGNsZWFyZWQgb3V0IGFuZCB0aGUKKwkgKiBGSUZPIGZyZWUnZCBwcmlvciB0byBzdGFydGluZyB0aGUgQklUQlVDS0VULiAgQklUQlVDS0VUCisJICogZG9lc24ndCBkaXNjYXJkIGRhdGEgYWxyZWFkeSBpbiB0aGUgRklGTy4KKwkgKi8KKwltdmkJREZGU1hGUkNUTCwgUlNUQ0hOfENMUlNIQ05UOworCVNFVF9NT0RFKE1fU0NTSSwgTV9TQ1NJKQorYml0YnVja2V0X25vdF9tX2RmZjoKKwlvcglTWEZSQ1RMMSxCSVRCVUNLRVQ7CisJLyogV2FpdCBmb3Igbm9uLWRhdGEgcGhhc2UuICovCisJdGVzdAlTQ1NJUEhBU0UsIH5EQVRBX1BIQVNFX01BU0sganogLjsKKwlhbmQJU1hGUkNUTDEsIH5CSVRCVUNLRVQ7CisJUkVTVE9SRV9NT0RFKFNBVkVEX01PREUpCitTRVRfU1JDX01PREUJTV9ERkYxOworU0VUX0RTVF9NT0RFCU1fREZGMTsKKwlTRVRfU0VRSU5UQ09ERShEQVRBX09WRVJSVU4pCisJam1wCUlUbG9vcDsKKworZGF0YV9waGFzZV9pbml0aWFsaXplOgorCXRlc3QJU0NCX1NHUFRSWzBdLCBTR19MSVNUX05VTEwgam56IHBfZGF0YV9iaXRidWNrZXQ7CisJY2FsbAlsb2FkX2ZpcnN0X3NlZzsKK2RhdGFfcGhhc2VfaW5ib3VuZHM6CisJLyogV2UgaGF2ZSBzZWVuIGEgZGF0YSBwaGFzZSBhdCBsZWFzdCBvbmNlLiAqLworCW9yCVNFUV9GTEFHUywgRFBIQVNFOworCW1vdglTQVZFRF9NT0RFLCBNT0RFX1BUUjsKKwl0ZXN0CVNHX1NUQVRFLCBMT0FESU5HX05FRURFRCBqeiBkYXRhX2dyb3VwX2RtYV9sb29wOworCWNhbGwJcF9kYXRhX2hhbmRsZV94ZmVyOworZGF0YV9ncm91cF9kbWFfbG9vcDoKKwkvKgorCSAqIFRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZSBpZiBlaXRoZXIgdGhlIGxhc3Qgc2VnbWVudAorCSAqIGNvbXBsZXRlcyBvciB0aGUgdGFyZ2V0IGNoYW5nZXMgcGhhc2UuICBCb3RoIGNvbmRpdGlvbnMKKwkgKiB3aWxsIGNsZWFyIFNDU0lFTi4KKwkgKi8KKwljYWxsCWlkbGVfbG9vcF9zZXJ2aWNlX2ZpZm9zOworCWNhbGwJaWRsZV9sb29wX2NjaGFuOworCWNhbGwJaWRsZV9sb29wX2dzZmlmbzsKKwlSRVNUT1JFX01PREUoU0FWRURfTU9ERSkKKwl0ZXN0CURGQ05UUkwsIFNDU0lFTiBqbnogZGF0YV9ncm91cF9kbWFfbG9vcDsKKworZGF0YV9ncm91cF9kbWFmaW5pc2g6CisJLyoKKwkgKiBUaGUgdHJhbnNmZXIgaGFzIHRlcm1pbmF0ZWQgZWl0aGVyIGR1ZSB0byBhIHBoYXNlCisJICogY2hhbmdlLCBhbmQvb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGxhc3Qgc2VnbWVudC4KKwkgKiBXZSBoYXZlIHR3byBnb2FscyBoZXJlLiAgRG8gYXMgbXVjaCBvdGhlciB3b3JrCisJICogYXMgcG9zc2libGUgd2hpbGUgdGhlIGRhdGEgZmlmbyBkcmFpbnMgb24gYSByZWFkCisJICogYW5kIHJlc3BvbmQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSB0byB0aGUgc3RhbmRhcmQKKwkgKiBtZXNzYWdlcyAoc2F2ZSBkYXRhIHBvaW50ZXJzL2Rpc2Nvbm5lY3QgYW5kIGNvbW1hbmQKKwkgKiBjb21wbGV0ZSkgdGhhdCB1c3VhbGx5IGZvbGxvdyBhIGRhdGEgcGhhc2UuCisJICovCisJY2FsbAljYWxjX3Jlc2lkdWFsOworCisJLyoKKwkgKiBHbyBhaGVhZCBhbmQgc2h1dCBkb3duIHRoZSBETUEgZW5naW5lIG5vdy4KKwkgKi8KKwl0ZXN0CURGQ05UUkwsIERJUkVDVElPTiBqbnogZGF0YV9waGFzZV9maW5pc2g7CitkYXRhX2dyb3VwX2ZpZm9mbHVzaDoKKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9BVVRPRkxVU0hfQlVHKSAhPSAwKSB7CisJCW9yCURGQ05UUkwsIEZJRk9GTFVTSDsKKwl9CisJLyoKKwkgKiBXZSBoYXZlIGVuYWJsZWQgdGhlIGF1dG8tYWNrIGZlYXR1cmUuICBUaGlzIG1lYW5zCisJICogdGhhdCB0aGUgY29udHJvbGxlciBtYXkgaGF2ZSBhbHJlYWR5IHRyYW5zZmVycmVkCisJICogc29tZSBvdmVycnVuIGJ5dGVzIGludG8gdGhlIGRhdGEgRklGTyBhbmQgYWNrZWQgdGhlbQorCSAqIG9uIHRoZSBidXMuICBUaGUgb25seSB3YXkgdG8gZGV0ZWN0IHRoaXMgc2l0dWF0aW9uIGlzCisJICogdG8gd2FpdCBmb3IgTEFTVF9TRUdfRE9ORSB0byBjb21lIHRydWUgb24gYSBjb21wbGV0ZWQKKwkgKiB0cmFuc2ZlciBhbmQgdGhlbiB0ZXN0IHRvIHNlZSBpZiB0aGUgZGF0YSBGSUZPIGlzCisJICogbm9uLWVtcHR5LiAgV2Uga25vdyB0aGVyZSBpcyBtb3JlIGRhdGEgeWV0IHRvIHRyYW5zZmVyCisJICogaWYgU0dfTElTVF9OVUxMIGlzIG5vdCB5ZXQgc2V0LCB0aHVzIHRoZXJlIGNhbm5vdCBiZQorCSAqIGFuIG92ZXJydW4uCisJICovCisJdGVzdAlTQ0JfUkVTSURVQUxfU0dQVFJbMF0sIFNHX0xJU1RfTlVMTCBqeiBkYXRhX3BoYXNlX2ZpbmlzaDsKKwl0ZXN0CVNHX0NBQ0hFX1NIQURPVywgTEFTVF9TRUdfRE9ORSBqeiAuOworCXRlc3QJREZTVEFUVVMsIEZJRk9FTVAgam56IGRhdGFfcGhhc2VfZmluaXNoOworCS8qIE92ZXJydW4gKi8KKwlqbXAJcF9kYXRhOworZGF0YV9waGFzZV9maW5pc2g6CisJLyoKKwkgKiBJZiB0aGUgdGFyZ2V0IGhhcyBsZWZ0IHVzIGluIGRhdGEgcGhhc2UsIGxvb3AgdGhyb3VnaAorCSAqIHRoZSBkbWEgY29kZSBhZ2Fpbi4gIFdlIHdpbGwgb25seSBsb29wIGlmIHRoZXJlIGlzIGEKKwkgKiBkYXRhIG92ZXJydW4uICAKKwkgKi8KKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfVEFSR0VUUk9MRSkgIT0gMCkgeworCQl0ZXN0CVNTVEFUMCwgVEFSR0VUIGpueiBkYXRhX3BoYXNlX2RvbmU7CisJfQorCWlmICgoYWhkLT5mbGFncyAmIEFIRF9JTklUSUFUT1JST0xFKSAhPSAwKSB7CisJCXRlc3QJU1NUQVQxLCBSRVFJTklUIGp6IC47CisJCXRlc3QJU0NTSVBIQVNFLCBEQVRBX1BIQVNFX01BU0sgam56IHBfZGF0YTsKKwl9CisKK2RhdGFfcGhhc2VfZG9uZToKKwkvKiBLaWxsIG9mZiBhbnkgcGVuZGluZyBwcmVmZXRjaCAqLworCWNhbGwJZGlzYWJsZV9jY3NnZW47CisJb3IgCUxPTkdKTVBfQUREUlsxXSwgSU5WQUxJRF9BRERSOworCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX1RBUkdFVFJPTEUpICE9IDApIHsKKwkJdGVzdAlTRVFfRkxBR1MsIERQSEFTRV9QRU5ESU5HIGp6IElUbG9vcDsKKwkJLyoKKwkJYW5kCVNFUV9GTEFHUywgfkRQSEFTRV9QRU5ESU5HOworCQkgKiBGb3IgZGF0YS1pbiBwaGFzZXMsIHdhaXQgZm9yIGFueSBwZW5kaW5nIGFja3MgZnJvbSB0aGUKKwkJICogaW5pdGlhdG9yIGJlZm9yZSBjaGFuZ2luZyBwaGFzZS4gIFdlIG9ubHkgbmVlZCB0bworCQkgKiBzZW5kIElnbm9yZSBXaWRlIFJlc2lkdWUgbWVzc2FnZXMgZm9yIGRhdGEtaW4gcGhhc2VzLgorCQl0ZXN0CURGQ05UUkwsIERJUkVDVElPTiBqeiB0YXJnZXRfSVRsb29wOworCQl0ZXN0CVNTVEFUMSwgUkVRSU5JVAlqbnogLjsKKwkJdGVzdAlTQ0JfVEFTS19BVFRSSUJVVEUsIFNDQl9YRkVSTEVOX09ERCBqeiB0YXJnZXRfSVRsb29wOworCQlTRVRfTU9ERShNX1NDU0ksIE1fU0NTSSkKKwkJdGVzdAlORUdDT05PUFRTLCBXSURFWEZFUiBqeiB0YXJnZXRfSVRsb29wOworCQkgKi8KKwkJLyoKKwkJICogSXNzdWUgYW4gSWdub3JlIFdpZGUgUmVzaWR1ZSBNZXNzYWdlLgorCQltdmkJUF9NRVNHSU58QlNZTyBjYWxsIGNoYW5nZV9waGFzZTsKKwkJbXZpCU1TR19JR05fV0lERV9SRVNJRFVFIGNhbGwgdGFyZ2V0X291dGI7CisJCW12aQkxIGNhbGwgdGFyZ2V0X291dGI7CisJCWptcAl0YXJnZXRfSVRsb29wOworCQkgKi8KKwl9IGVsc2UgeworCQlqbXAJSVRsb29wOworCX0KKworLyoKKyAqIFdlIGFzc3VtZSB0aGF0LCBldmVuIHRob3VnaCBkYXRhIG1heSBzdGlsbCBiZQorICogdHJhbnNmZXJyaW5nIHRvIHRoZSBob3N0LCB0aGF0IHRoZSBTQ1NJIHNpZGUgb2YKKyAqIHRoZSBETUEgZW5naW5lIGlzIG5vdyBpbiBhIHN0YXRpYyBzdGF0ZS4gIFRoaXMKKyAqIGFsbG93cyB1cyB0byB1cGRhdGUgb3VyIG5vdGlvbiBvZiB3aGVyZSB3ZSBhcmUKKyAqIGluIHRoaXMgdHJhbnNmZXIuCisgKgorICogSWYsIGJ5IGNoYW5jZSwgd2Ugc3RvcHBlZCBiZWZvcmUgYmVpbmcgYWJsZQorICogdG8gZmV0Y2ggYWRkaXRpb25hbCBzZWdtZW50cyBmb3IgdGhpcyB0cmFuc2ZlciwKKyAqIHlldCB0aGUgbGFzdCBTL0cgd2FzIGNvbXBsZXRlbHkgZXhoYXVzdGVkLAorICogY2FsbCBvdXIgaWRsZSBsb29wIHVudGlsIGl0IGlzIGFibGUgdG8gbG9hZAorICogYW5vdGhlciBzZWdtZW50LiAgVGhpcyB3aWxsIGFsbG93IHVzIHRvIGltbWVkaWF0ZWx5CisgKiBwaWNrdXAgb24gdGhlIG5leHQgc2VnbWVudCBvbiB0aGUgbmV4dCBkYXRhIHBoYXNlLgorICoKKyAqIElmIHdlIGhhcHBlbmVkIHRvIHN0b3Agb24gdGhlIGxhc3Qgc2VnbWVudCwgdGhlbgorICogb3VyIHJlc2lkdWFsIGluZm9ybWF0aW9uIGlzIHN0aWxsIGNvcnJlY3QgZnJvbQorICogdGhlIGlkbGUgbG9vcCBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byBwZXJmb3JtCisgKiBhbnkgZml4dXBzLgorICovCityZXNpZHVhbF9iZWZvcmVfbGFzdF9zZWc6CisJdGVzdCAgICBNREZGU1RBVCwgU0hWQUxJRAlqbnogc2dwdHJfZml4dXA7CisJLyoKKwkgKiBDYW4gbmV2ZXIgaGFwcGVuIGZyb20gYW4gaW50ZXJydXB0IGFzIHRoZSBwYWNrZXRpemVkCisJICogaGFyZHdhcmUgd2lsbCBvbmx5IGludGVycnVwdCB1cyBvbmNlIFNIVkFMSUQgb3IKKwkgKiBMQVNUX1NFR19ET05FLgorCSAqLworCWNhbGwJaWRsZV9sb29wX3NlcnZpY2VfZmlmb3M7CisJUkVTVE9SRV9NT0RFKFNBVkVEX01PREUpCisJLyogRkFMTFRIUk9VR0ggKi8KK2NhbGNfcmVzaWR1YWw6CisJdGVzdAlTR19DQUNIRV9TSEFET1csIExBU1RfU0VHIGp6IHJlc2lkdWFsX2JlZm9yZV9sYXN0X3NlZzsKKwkvKiBSZWNvcmQgaWYgd2UndmUgY29uc3VtZWQgYWxsIFMvRyBlbnRyaWVzICovCisJdGVzdAlNREZGU1RBVCwgU0hWQUxJRAlqeiAuICsgMjsKKwlibW92CVNDQl9SRVNJRFVBTF9EQVRBQ05ULCBTSENOVCwgMyByZXQ7CisJb3IJU0NCX1JFU0lEVUFMX1NHUFRSWzBdLCBTR19MSVNUX05VTEwgcmV0OworCitzZ3B0cl9maXh1cDoKKwkvKgorCSAqIEZpeHVwIHRoZSByZXNpZHVhbCBuZXh0IFMvRyBwb2ludGVyLiAgVGhlIFMvRyBwcmVsb2FkCisJICogZmVhdHVyZSBvZiB0aGUgY2hpcCBhbGxvd3MgdXMgdG8gbG9hZCB0d28gZWxlbWVudHMKKwkgKiBpbiBhZGRpdGlvbiB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBlbGVtZW50LiAgV2UKKwkgKiBzdG9yZSB0aGUgYm90dG9tIGJ5dGUgb2YgdGhlIG5leHQgUy9HIHBvaW50ZXIgaW4KKwkgKiB0aGUgU0dfQ0FDSEVfUFRSIHJlZ2lzdGVyIHNvIHdlIGNhbiByZXN0b3JlIHRoZQorCSAqIGNvcnJlY3QgdmFsdWUgd2hlbiB0aGUgRE1BIGNvbXBsZXRlcy4gIElmIHRoZSBuZXh0CisJICogc2cgcHRyIHZhbHVlIGhhcyBhZHZhbmNlZCB0byB0aGUgcG9pbnQgd2hlcmUgaGlnaGVyCisJICogYnl0ZXMgaW4gdGhlIGFkZHJlc3MgaGF2ZSBiZWVuIGFmZmVjdGVkLCBmaXggdGhlbQorCSAqIHRvby4KKwkgKi8KKwl0ZXN0CVNHX0NBQ0hFX1NIQURPVywgMHg4MCBqeiBzZ3B0cl9maXh1cF9kb25lOworCXRlc3QJU0NCX1JFU0lEVUFMX1NHUFRSWzBdLCAweDgwIGpueiBzZ3B0cl9maXh1cF9kb25lOworCWFkZAlTQ0JfUkVTSURVQUxfU0dQVFJbMV0sIC0xOworCWFkYwlTQ0JfUkVTSURVQUxfU0dQVFJbMl0sIC0xOyAKKwlhZGMJU0NCX1JFU0lEVUFMX1NHUFRSWzNdLCAtMTsKK3NncHRyX2ZpeHVwX2RvbmU6CisJYW5kCVNDQl9SRVNJRFVBTF9TR1BUUlswXSwgU0dfQUREUl9NQVNLLCBTR19DQUNIRV9TSEFET1c7CisJY2xyCVNDQl9SRVNJRFVBTF9EQVRBQ05UWzNdOyAvKiBXZSBhcmUgbm90IHRoZSBsYXN0IHNlZyAqLworCWJtb3YJU0NCX1JFU0lEVUFMX0RBVEFDTlQsIFNIQ05ULCAzIHJldDsKKworZXhwb3J0IHRpbWVyX2lzcjoKKwljYWxsCWlzc3VlX2NtZGNtcGx0OworCW12aQlDTFJTRVFJTlRTVEFULCBDTFJTRVFfU1dUTVJUTzsKKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9TRVRfTU9ERV9CVUcpICE9IDApIHsKKwkJLyoKKwkJICogSW4gSDJBNCwgdGhlIG1vZGUgcG9pbnRlciBpcyBub3Qgc2F2ZWQKKwkJICogZm9yIGludHZlYzIsIGJ1dCBpcyByZXN0b3JlZCBvbiBpcmV0LgorCQkgKiBUaGlzIGNhbiBsZWFkIHRvIHRoZSByZXN0b3JhdGlvbiBvZiBhCisJCSAqIGJvZ3VzIG1vZGUgcHRyLiAgTWFudWFsbHkgY2xlYXIgdGhlCisJCSAqIGludG1hc2sgYml0cyBhbmQgZG8gYSBub3JtYWwgcmV0dXJuCisJCSAqIHRvIGNvbXBlbnNhdGUuCisJCSAqLworCQlhbmQJU0VRSU5UQ1RMLCB+KElOVE1BU0syfElOVE1BU0sxKSByZXQ7CisJfSBlbHNlIHsKKwkJb3IJU0VRSU5UQ1RMLCBJUkVUIHJldDsKKwl9CisKK2V4cG9ydCBzZXFfaXNyOgorCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9SVEkpID09IDApIHsKKwkJLyoKKwkJICogT24gUmV2QSBTaWxpY29uLCBpZiB0aGUgdGFyZ2V0IHJldHVybnMgdXMgdG8gZGF0YS1vdXQKKwkJICogYWZ0ZXIgd2UgaGF2ZSBhbHJlYWR5IHRyYWluZWQgZm9yIGRhdGEtb3V0LCBpdCBpcworCQkgKiBwb3NzaWJsZSBmb3IgdXMgdG8gdHJhbnNpdGlvbiB0aGUgZnJlZSBydW5uaW5nIGNsb2NrIHRvCisJCSAqIGRhdGEtdmFsaWQgYmVmb3JlIHRoZSByZXF1aXJlZCAxMDBucyBQMSBzZXR1cCB0aW1lICg4IFAxCisJCSAqIGFzc2VydGlvbnMgaW4gZmFzdC0xNjAgbW9kZSkuICBUaGlzIHdpbGwgb25seSBoYXBwZW4gaWYKKwkJICogdGhpcyBMLVEgaXMgYSBjb250aW51YXRpb24gb2YgYSBkYXRhIHRyYW5zZmVyIGZvciB3aGljaAorCQkgKiB3ZSBoYXZlIGFscmVhZHkgcHJlZmV0Y2hlZCBkYXRhIGludG8gb3VyIEZJRk8gKExRL0RhdGEKKwkJICogZm9sbG93ZWQgYnkgTFEvRGF0YSBmb3IgdGhlIHNhbWUgd3JpdGUgdHJhbnNhY3Rpb24pLgorCQkgKiBUaGlzIGNhbiBjYXVzZSBzb21lIHRhcmdldCBpbXBsZW1lbnRhdGlvbnMgdG8gbWlzcyB0aGUKKwkJICogZmlyc3QgZmV3IGRhdGEgdHJhbnNmZXJzIG9uIHRoZSBidXMuICBXZSBkZXRlY3QgdGhpcworCQkgKiBzaXR1YXRpb24gYnkgbm90aWNpbmcgdGhhdCB0aGlzIGlzIHRoZSBmaXJzdCBkYXRhIHRyYW5zZmVyCisJCSAqIGFmdGVyIGFuIExRIChMUUlXT1JLT05MUSB0cnVlKSwgdGhhdCB0aGUgZGF0YSB0cmFuc2ZlciBpcworCQkgKiBhIGNvbnRpbnVhdGlvbiBvZiBhIHRyYW5zZmVyIGFscmVhZHkgc2V0dXAgaW4gb3VyIEZJRk8KKwkJICogKFNBVkVQVFJTIGludGVycnVwdCksIGFuZCB0aGF0IHRoZSB0cmFuc2FjdGlvbiBpcyBhIHdyaXRlCisJCSAqIChESVJFQ1RJT04gc2V0IGluIERGQ05UUkwpLiBUaGUgZGVsYXkgaXMgcGVyZm9ybWVkIGJ5CisJCSAqIGRpc2FibGluZyBTQ1NJRU4gdW50aWwgd2Ugc2VlIHRoZSBmaXJzdCBSRVEgZnJvbSB0aGUKKwkJICogdGFyZ2V0LgorCQkgKiAKKwkJICogRmlyc3QgaW5zdHJ1Y3Rpb24gaW4gYW4gSVNSIGNhbm5vdCBiZSBhIGJyYW5jaCBvbgorCQkgKiBSZXYgQS4gIFNuYXBzaG90IExRSVNUQVQyIHNvIHRoZSBzdGF0dXMgaXMgbm90IG1pc3NlZAorCQkgKiBhbmQgZGVmZmVyIHRoZSB0ZXN0IGJ5IG9uZSBpbnN0cnVjdGlvbi4KKwkJICovCisJCW1vdglSRUdfSVNSLCBMUUlTVEFUMjsKKwkJdGVzdAlSRUdfSVNSLCBMUUlXT1JLT05MUSBqeiBtYWluX2lzcjsKKwkJdGVzdAlTRVFJTlRTUkMsIFNBVkVQVFJTICBqeiBtYWluX2lzcjsKKwkJdGVzdAlMT05HSk1QX0FERFJbMV0sIElOVkFMSURfQUREUiBqeiBzYXZlcHRyX2FjdGl2ZV9maWZvOworCQkvKgorCQkgKiBTd2l0Y2ggdG8gdGhlIGFjdGl2ZSBGSUZPIGFmdGVyIGNsZWFyaW5nIHRoZSBzbmFwc2hvdAorCQkgKiBzYXZlcG9pbnRlciBpbiB0aGUgY3VycmVudCBGSUZPLiAgV2UgZG8gdGhpcyBzbyB0aGF0CisJCSAqIGEgcGVuZGluZyBDVFhURE9ORSBvciBTQVZFUFRSIGlzIHZpc2libGUgaW4gdGhlIGFjdGl2ZQorCQkgKiBGSUZPLiAgVGhpcyBzdGF0dXMgaXMgdGhlIG9ubHkgd2F5IHdlIGNhbiBkZXRlY3QgaWYgd2UKKwkJICogaGF2ZSBsb3N0IHRoZSByYWNlIChlLmcuIGhvc3QgcGF1c2VkIHVzKSBhbmQgb3VyIGF0dGVwdHMKKwkJICogdG8gZGlzYWJsZSB0aGUgY2hhbm5lbCBvY2N1cnJlZCBhZnRlciBhbGwgUkVRcyB3ZXJlCisJCSAqIGFscmVhZHkgc2VlbiBhbmQgYWNrZWQgKFJFUUlOSVQgbmV2ZXIgY29tZXMgdHJ1ZSkuCisJCSAqLworCQltdmkJREZGU1hGUkNUTCwgQ0xSQ0hOOworCQl4b3IJTU9ERV9QVFIsIE1LX01PREUoTV9ERkYxLCBNX0RGRjEpOworCQl0ZXN0CURGQ05UUkwsIERJUkVDVElPTiBqeiBpbnRlcnJ1cHRfcmV0dXJuOworCQlhbmQJREZDTlRSTCwgflNDU0lFTjsKK3NuYXBzaG90X3dhaXRfZGF0YV92YWxpZDoKKwkJdGVzdAlTRVFJTlRTUkMsIChDVFhURE9ORXxTQVZFUFRSUykgam56IHNuYXBzaG90X2RhdGFfdmFsaWQ7CisJCXRlc3QJU1NUQVQxLCBSRVFJTklUCWp6IHNuYXBzaG90X3dhaXRfZGF0YV92YWxpZDsKK3NuYXBzaG90X2RhdGFfdmFsaWQ6CisJCW9yCURGQ05UUkwsIFNDU0lFTjsKKwkJb3IJU0VRSU5UQ1RMLCBJUkVUIHJldDsKK3NuYXBzaG90X3NhdmVwdHI6CisJCW12aQlERkZTWEZSQ1RMLCBDTFJDSE47CisJCW9yCVNFUUlOVENUTCwgSVJFVCByZXQ7CittYWluX2lzcjoKKwl9CisJdGVzdAlTRVFJTlRTUkMsIENGRzREQVRBCWpueiBjZmc0ZGF0YV9pbnRyOworCXRlc3QJU0VRSU5UU1JDLCBDRkc0SVNUQVQJam56IGNmZzRpc3RhdF9pbnRyOworCXRlc3QJU0VRSU5UU1JDLCBTQVZFUFRSUwlqbnogc2F2ZXB0cl9pbnRyOworCXRlc3QJU0VRSU5UU1JDLCBDRkc0SUNNRAlqbnogY2ZnNGljbWRfaW50cjsKKwlTRVRfU0VRSU5UQ09ERShJTlZBTElEX1NFUUlOVCkKKworLyoKKyAqIFRoZXJlIGFyZSB0d28gdHlwZXMgb2Ygc2F2ZSBwb2ludGVycyBpbnRlcnJ1cHRzOgorICogVGhlIGZpcnN0IGlzIGEgc25hcHNob3Qgc2F2ZSBwb2ludGVycyB3aGVyZSB0aGUgY3VycmVudCBGSUZPIGlzIG5vdAorICogYWN0aXZlIGFuZCBjb250YWlucyBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IHBvbml0ZXIgaW5mb3JtYXRpb24uCisgKiBUaGlzIGhhcHBlbnMgYmV0d2VlbiBwYWNrZXRzIGluIGEgc3RyZWFtIGZvciBhIHNpbmdsZSBMX1EuICBTaW5jZSB3ZQorICogYXJlIG5vdCBwZXJmb3JtaW5nIGEgcG9pbnRlciBzYXZlLCB3ZSBjYW4gc2FmZWx5IGNsZWFyIHRoZSBjaGFubmVsCisgKiBzbyBpdCBjYW4gYmUgdXNlZCBmb3Igb3RoZXIgdHJhbnNhY3Rpb25zLiAgT24gUlRJIGNhcGFibGUgY29udHJvbGxlcnMsCisgKiB3aGVyZSBzbmFwc2hvdHMgY2FuLCBhbmQgYXJlLCBkaXNhYmxlZCwgdGhlIGNvZGUgdG8gaGFuZGxlIHRoaXMgdHlwZQorICogb2Ygc25hcHNob3QgaXMgbm90IGFjdGl2ZS4KKyAqCisgKiBUaGUgc2Vjb25kIGNhc2UgaXMgYSBzYXZlIHBvaW50ZXJzIG9uIGFuIGFjdGl2ZSBGSUZPIHdoaWNoIG9jY3VycworICogaWYgdGhlIHRhcmdldCBjaGFuZ2VzIHRvIGEgbmV3IExfUSBvciBidXNmcmVlcy9RQVNlcyBhbmQgdGhlIHRyYW5zZmVyCisgKiBoYXMgYSByZXNpZHVhbC4gIFRoaXMgc2hvdWxkIG9jY3VyIGNvaW5jaWRlbnQgd2l0aCBhIGN0eHRkb25lLiAgV2UKKyAqIGRpc2FibGUgdGhlIGludGVycnVwdCBhbmQgYWxsb3cgb3VyIGFjdGl2ZSByb3V0aW5lIHRvIGhhbmRsZSB0aGUKKyAqIHNhdmUuCisgKi8KK3NhdmVwdHJfaW50cjoKKwlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfUlRJKSA9PSAwKSB7CisJCXRlc3QJTE9OR0pNUF9BRERSWzFdLCBJTlZBTElEX0FERFIgam56IHNuYXBzaG90X3NhdmVwdHI7CisJfQorc2F2ZXB0cl9hY3RpdmVfZmlmbzoKKwlhbmQJU0VRSU1PREUsIH5FTlNBVkVQVFJTOworCW9yCVNFUUlOVENUTCwgSVJFVCByZXQ7CisKK2NmZzRkYXRhX2ludHI6CisJdGVzdAlTQ0JfU0dQVFJbMF0sIFNHX0xJU1RfTlVMTCBqbnogcGt0X2hhbmRsZV9vdmVycnVuX2luY191c2VfY291bnQ7CisJY2FsbAlsb2FkX2ZpcnN0X3NlZzsKKwljYWxsCXBrdF9oYW5kbGVfeGZlcjsKKwlpbmMJU0NCX0ZJRk9fVVNFX0NPVU5UOworaW50ZXJydXB0X3JldHVybjoKKwlvcglTRVFJTlRDVEwsIElSRVQgcmV0OworCitjZmc0aXN0YXRfaW50cjoKKwljYWxsCWZyZWV6ZV9xdWV1ZTsKKwlhZGQJTk9ORSwgLTEzLCBTQ0JfQ0RCX0xFTjsKKwlqbmMJY2ZnNGlzdGF0X2hhdmVfc2Vuc2VfYWRkcjsKKwl0ZXN0CVNDQl9DREJfTEVOLCBTQ0JfQ0RCX0xFTl9QVFIgam56IGNmZzRpc3RhdF9oYXZlX3NlbnNlX2FkZHI7CisJLyoKKwkgKiBIb3N0IHNldHMgdXAgYWRkcmVzcy9jb3VudCBhbmQgZW5hYmxlcyB0cmFuc2Zlci4KKwkgKi8KKwlTRVRfU0VRSU5UQ09ERShDRkc0SVNUQVRfSU5UUikKKwlqbXAJY2ZnNGlzdGF0X3NldHVwX2hhbmRsZXI7CitjZmc0aXN0YXRfaGF2ZV9zZW5zZV9hZGRyOgorCWJtb3YJSEFERFIsIFNDQl9TRU5TRV9CVVNBRERSLCA0OworCW12aQlIQ05UWzFdLCAoQUhEX1NFTlNFX0JVRlNJWkUgPj4gOCk7CisJbXZpCVNHX0NBQ0hFX1BSRSwgTEFTVF9TRUc7CisJbXZpCURGQ05UUkwsIFBSRUxPQURFTnxTQ1NJRU58SERNQUVOOworY2ZnNGlzdGF0X3NldHVwX2hhbmRsZXI6CisJLyoKKwkgKiBTdGF0dXMgcGt0IGlzIHRyYW5zZmVycmluZyB0byBob3N0LgorCSAqIFdhaXQgaW4gaWRsZSBsb29wIGZvciB0cmFuc2ZlciB0byBjb21wbGV0ZS4KKwkgKiBJZiBhIGNvbW1hbmQgY29tcGxldGVkIGJlZm9yZSBhbiBhdHRlbXB0ZWQKKwkgKiB0YXNrIG1hbmFnZW1lbnQgZnVuY3Rpb24gY29tcGxldGVkLCBub3RpZnkgdGhlIGhvc3QuCisJICovCisJdGVzdAlTQ0JfVEFTS19NQU5BR0VNRU5ULCAweEZGIGp6IGNmZzRpc3RhdF9ub190YXNrbWdtdF9mdW5jOworCVNFVF9TRVFJTlRDT0RFKFRBU0tNR01UX0NNRF9DTVBMVF9PS0FZKQorY2ZnNGlzdGF0X25vX3Rhc2ttZ210X2Z1bmM6CisJY2FsbAlwa3RfaGFuZGxlX3N0YXR1czsKKwlvcglTRVFJTlRDVEwsIElSRVQgcmV0OworCitjZmc0aWNtZF9pbnRyOgorCS8qCisJICogSW4gdGhlIGNhc2Ugb2YgRE1BaW5nIGEgQ0RCIGZyb20gdGhlIGhvc3QsIHRoZSBub3JtYWwKKwkgKiBDREIgYnVmZmVyIGlzIGZvcm1hdHRlZCB3aXRoIGFuIDggYnl0ZSBhZGRyZXNzIGZvbGxvd2VkCisJICogYnkgYSAxIGJ5dGUgY291bnQuCisJICovCisJYm1vdglIQUREUlswXSwgU0NCX0hPU1RfQ0RCX1BUUiwgOTsKKwltdmkJU0dfQ0FDSEVfUFJFLCBMQVNUX1NFRzsKKwltdmkJREZDTlRSTCwgKFBSRUxPQURFTnxTQ1NJRU58SERNQUVOKTsKKwljYWxsCXBrdF9oYW5kbGVfY2RiOworCW9yCVNFUUlOVENUTCwgSVJFVCByZXQ7CisKKy8qCisgKiBTZWUgaWYgdGhlIHRhcmdldCBoYXMgZ29uZSBvbiBpbiB0aGlzIGNvbnRleHQgY3JlYXRpbmcgYW4KKyAqIG92ZXJydW4gY29uZGl0aW9uLiAgRm9yIHRoZSB3cml0ZSBjYXNlLCB0aGUgaGFyZHdhcmUgY2Fubm90CisgKiBhY2sgYnl0ZXMgdW50aWwgZGF0YSBhcmUgcHJvdmlkZWQuICBTbywgaWYgdGhlIHRhcmdldCBiZWdpbnMKKyAqIGFub3RoZXIgIHBhY2tldCB3aXRob3V0IGNoYW5naW5nIGNvbnRleHRzLCBpbXBseWluZyB3ZSBhcmUKKyAqIG5vdCBzaXR0aW5nIG9uIGEgcGFja2V0IGJvdW5kYXJ5LCB3ZSBhcmUgaW4gYW4gb3ZlcnJ1bgorICogc2l0dWF0aW9uLiAgRm9yIHRoZSByZWFkIGNhc2UsIHRoZSBoYXJkd2FyZSB3aWxsIGNvbnRpbnVlIHRvCisgKiBhY2sgYnl0ZXMgaW50byB0aGUgRklGTywgYW5kIG1heSBldmVuIGFjayB0aGUgbGFzdCBvdmVycnVuIHBhY2tldAorICogaW50byB0aGUgRklGTy4gICBJZiB0aGUgRklGTyBzaG91bGQgYmVjb21lIG5vbi1lbXB0eSwgd2UgYXJlIGluCisgKiBhIHJlYWQgb3ZlcnJ1biBjYXNlLgorICovCisjZGVmaW5lIGNoZWNrX292ZXJydW4JCQkJCQkJXAorCS8qIE5vdCBvbiBhIHBhY2tldCBib3VuZGFyeS4gKi8JCQkJCVwKKwl0ZXN0IAlNREZGU1RBVCwgRExaRVJPIGp6IHBrdF9oYW5kbGVfb3ZlcnJ1bjsJCQlcCisJdGVzdAlERlNUQVRVUywgRklGT0VNUCBqeiBwa3RfaGFuZGxlX292ZXJydW4KKworcGt0X2hhbmRsZV94ZmVyOgorCXRlc3QJU0dfU1RBVEUsIExPQURJTkdfTkVFREVEIGp6IHBrdF9sYXN0X3NlZzsKKwljYWxsCXNldGptcDsKKwl0ZXN0CVNFUUlOVFNSQywgU0FWRVBUUlMgam56IHBrdF9zYXZlcHRyczsKKwl0ZXN0CVNDU0lQSEFTRSwgfkRBVEFfUEhBU0VfTUFTSyBqeiAuICsgMjsKKwl0ZXN0CVNDU0lTSUdPLCBBVE5PIGpueiAuICsgMjsKKwl0ZXN0CVNTVEFUMiwgTk9OUEFDS1JFUSBqeiBwa3Rfc2VydmljZV9maWZvOworCS8qCisJICogRGVmZXIgaGFuZGxpbmcgb2YgdGhpcyBOT05QQUNLUkVRIHVudGlsIHdlCisJICogY2FuIGJlIHN1cmUgaXQgcGVydGFpbnMgdG8gdGhpcyBGSUZPLiAgU0FWRVBUUlMKKwkgKiB3aWxsIG5vdCBiZSBhc3NlcnRlZCBpZiB0aGUgTk9OUEFDS1JFUSBpcyBmb3IgdXMsCisJICogc28gd2UgbXVzdCBzaW11bGF0ZSBpdCBpZiBzaGFkZG93IGlzIHZhbGlkLiAgSWYKKwkgKiBzaGFkZG93IGlzIG5vdCB2YWxpZCwga2VlcCBydW5uaW5nIHRoaXMgRklGTyB1bnRpbCB3ZQorCSAqIGhhdmUgc2F0aXNmaWVkIHRoZSB0cmFuc2ZlciBieSBsb2FkaW5nIHNlZ21lbnRzIGFuZAorCSAqIHdhaXRpbmcgZm9yIGVpdGhlciBzaGFkZG93IHZhbGlkIG9yIGxhc3Rfc2VnX2RvbmUuCisJICovCisJdGVzdAlNREZGU1RBVCwgU0hWQUxJRCBqbnogcGt0X3NhdmVwdHJzOworcGt0X3NlcnZpY2VfZmlmbzoKKwl0ZXN0CVNHX1NUQVRFLCBMT0FESU5HX05FRURFRCBqbnogc2VydmljZV9maWZvOworcGt0X2xhc3Rfc2VnOgorCWNhbGwJc2V0am1wOworCXRlc3QJU0VRSU5UU1JDLCBTQVZFUFRSUyBqbnogcGt0X3NhdmVwdHJzOworCXRlc3QJU0dfQ0FDSEVfU0hBRE9XLCBMQVNUX1NFR19ET05FIGpueiBwa3RfbGFzdF9zZWdfZG9uZTsKKwl0ZXN0CVNDU0lQSEFTRSwgfkRBVEFfUEhBU0VfTUFTSyBqeiAuICsgMjsKKwl0ZXN0CVNDU0lTSUdPLCBBVE5PIGpueiAuICsgMjsKKwl0ZXN0CVNTVEFUMiwgTk9OUEFDS1JFUSBqeiByZXR1cm47CisJdGVzdAlNREZGU1RBVCwgU0hWQUxJRCBqeiByZXR1cm47CisJLyogRkFMTFRIUk9VR0ggKi8KKworLyoKKyAqIEVpdGhlciBhIFNBVkVQVFJTIGludGVycnVwdCBjb25kaXRpb24gaXMgcGVuZGluZyBmb3IgdGhpcyBGSUZPCisgKiBvciB3ZSBoYXZlIGEgcGVuZGluZyBOT05QQUNLUkVRIGZvciB0aGlzIEZJRk8uICBXZSBkaWZmZXJlbnRpYXRlCisgKiBiZXR3ZWVuIHRoZSB0d28gYnkgY2FwdHVyaW5nIHRoZSBzdGF0ZSBvZiB0aGUgU0FWRVBUUlMgaW50ZXJydXB0CisgKiBwcmlvciB0byBjbGVhcmluZyB0aGlzIHN0YXR1cyBhbmQgZXhlY3V0aW5nIHRoZSBjb21tb24gY29kZSBmb3IKKyAqIHRoZXNlIHR3byBjYXNlcy4KKyAqLworcGt0X3NhdmVwdHJzOgorQkVHSU5fQ1JJVElDQUw7CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfQVVUT0ZMVVNIX0JVRykgIT0gMCkgeworCQlvcglERkNOVFJMLCBGSUZPRkxVU0g7CisJfQorCW1vdglSRUcwLCBTRVFJTlRTUkM7CisJY2FsbAljYWxjX3Jlc2lkdWFsOworCWNhbGwJc2F2ZV9wb2ludGVyczsKKwltdmkJQ0xSU0VRSU5UU1JDLCBDTFJTQVZFUFRSUzsKKwljYWxsCWRpc2FibGVfY2NzZ2VuOworCW9yCVNFUUlNT0RFLCBFTlNBVkVQVFJTOworCXRlc3QJREZDTlRSTCwgRElSRUNUSU9OIGpueiBwa3Rfc2F2ZXB0cnNfY2hlY2tfc3RhdHVzOworCXRlc3QJREZTVEFUVVMsIEZJRk9FTVAgam56IHBrdF9zYXZlcHRyc19jaGVja19zdGF0dXM7CisJLyoKKwkgKiBLZWVwIGEgaGFuZGxlciBhcm91bmQgZm9yIHRoaXMgRklGTyB1bnRpbCBpdCBkcmFpbnMKKwkgKiB0byB0aGUgaG9zdCB0byBndWFyYW50ZWUgdGhhdCB3ZSBkb24ndCBjb21wbGV0ZSB0aGUKKwkgKiBjb21tYW5kIHRvIHRoZSBob3N0IGJlZm9yZSB0aGUgZGF0YSBhcnJpdmVzLgorCSAqLworcGt0X3NhdmVwdHJzX3dhaXRfZmlmb2VtcDoKKwljYWxsCXNldGptcDsKKwl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGp6IHJldHVybjsKK3BrdF9zYXZlcHRyc19jaGVja19zdGF0dXM6CisJb3IJTE9OR0pNUF9BRERSWzFdLCBJTlZBTElEX0FERFI7CisJdGVzdAlSRUcwLCBTQVZFUFRSUyBqeiB1bmV4cGVjdGVkX25vbnBrdF9waGFzZTsKKwlkZWMJU0NCX0ZJRk9fVVNFX0NPVU5UOworCXRlc3QJU0NCX0NPTlRST0wsIFNUQVRVU19SQ1ZEIGpueiBwa3RfY29tcGxldGVfc2NiX2lmX2ZpZm9zX2lkbGU7CisJbXZpCURGRlNYRlJDVEwsIENMUkNITiByZXQ7CitFTkRfQ1JJVElDQUw7CisKKy8qCisgKiBMQVNUX1NFR19ET05FIHN0YXR1cyBoYXMgYmVlbiBzZWVuIGluIHRoZSBjdXJyZW50IEZJRk8uCisgKiBUaGlzIGluZGljYXRlcyB0aGF0IGFsbCBvZiB0aGUgYWxsb3dlZCBkYXRhIGZvciB0aGlzCisgKiBjb21tYW5kIGhhcyB0cmFuc2ZlcnJlZCBhY3Jvc3MgdGhlIFNDU0kgYW5kIGhvc3QgYnVzZXMuCisgKiBDaGVjayBmb3Igb3ZlcnJ1biBhbmQgc2VlIGlmIHdlIGNhbiBjb21wbGV0ZSB0aGlzIGNvbW1hbmQuCisgKi8KK3BrdF9sYXN0X3NlZ19kb25lOgorQkVHSU5fQ1JJVElDQUw7CisJLyoKKwkgKiBNYXJrIHRyYW5zZmVyIGFzIGNvbXBsZXRlZC4KKwkgKi8KKwlvcglTQ0JfU0dQVFIsIFNHX0xJU1RfTlVMTDsKKworCS8qCisJICogV2FpdCBmb3IgdGhlIGN1cnJlbnQgY29udGV4dCB0byBmaW5pc2ggdG8gdmVyaWZ5IHRoYXQKKwkgKiBubyBvdmVycnVuIGNvbmRpdGlvbiBoYXMgb2NjdXJyZWQuCisJICovCisJdGVzdAlTRVFJTlRTUkMsIENUWFRET05FIGpueiBwa3RfY3R4dF9kb25lOworCWNhbGwJc2V0am1wOworcGt0X3dhaXRfY3R4dF9kb25lX2xvb3A6CisJdGVzdAlTRVFJTlRTUkMsIENUWFRET05FIGpueiBwa3RfY3R4dF9kb25lOworCS8qCisJICogQSBzdWZmaWNpZW50bHkgbGFyZ2Ugb3ZlcnJ1biBvciBhIE5PTlBBQ0tSRVEgbWF5CisJICogcHJldmVudCBDVFhURE9ORSBmcm9tIGV2ZXIgYXNzZXJ0aW5nLCBzbyB3ZSBtdXN0CisJICogcG9sbCBmb3IgdGhlc2Ugc3RhdHVzZXMgdG9vLgorCSAqLworCWNoZWNrX292ZXJydW47CisJdGVzdAlTU1RBVDIsIE5PTlBBQ0tSRVEganogcmV0dXJuOworCXRlc3QJU0VRSU5UU1JDLCBDVFhURE9ORSBqeiB1bmV4cGVjdGVkX25vbnBrdF9waGFzZTsKKwkvKiBGQUxMVEhST1VHSCAqLworCitwa3RfY3R4dF9kb25lOgorCWNoZWNrX292ZXJydW47CisJb3IJTE9OR0pNUF9BRERSWzFdLCBJTlZBTElEX0FERFI7CisJLyoKKwkgKiBJZiBzdGF0dXMgaGFzIGJlZW4gcmVjZWl2ZWQsIGl0IGlzIHNhZmUgdG8gc2tpcAorCSAqIHRoZSBjaGVjayB0byBzZWUgaWYgYW5vdGhlciBGSUZPIGlzIGFjdGl2ZSBiZWNhdXNlCisJICogTEFTVF9TRUdfRE9ORSBoYXMgYmVlbiBvYnNlcnZlZC4gIEhvd2V2ZXIsIHdlIGNoZWNrCisJICogdGhlIEZJRk8gYW55d2F5IHNpbmNlIGl0IGNvc3RzIHVzIG9ubHkgb25lIGV4dHJhCisJICogaW5zdHJ1Y3Rpb24gdG8gbGV2ZXJhZ2UgY29tbW9uIGNvZGUgdG8gcGVyZm9ybSB0aGUKKwkgKiBTQ0IgY29tcGxldGlvbi4KKwkgKi8KKwlkZWMJU0NCX0ZJRk9fVVNFX0NPVU5UOworCXRlc3QJU0NCX0NPTlRST0wsIFNUQVRVU19SQ1ZEIGpueiBwa3RfY29tcGxldGVfc2NiX2lmX2ZpZm9zX2lkbGU7CisJbXZpCURGRlNYRlJDVEwsIENMUkNITiByZXQ7CitFTkRfQ1JJVElDQUw7CisKKy8qCisgKiBNdXN0IHdhaXQgdW50aWwgQ0RCIHhmZXIgaXMgb3ZlciBiZWZvcmUgaXNzdWluZyB0aGUKKyAqIGNsZWFyIGNoYW5uZWwuCisgKi8KK3BrdF9oYW5kbGVfY2RiOgorCWNhbGwJc2V0am1wOworCXRlc3QJU0dfQ0FDSEVfU0hBRE9XLCBMQVNUX1NFR19ET05FIGp6IHJldHVybjsKKwlvcglMT05HSk1QX0FERFJbMV0sIElOVkFMSURfQUREUjsKKwltdmkJREZGU1hGUkNUTCwgQ0xSQ0hOIHJldDsKKworLyoKKyAqIFdhdGNoIG92ZXIgdGhlIHN0YXR1cyB0cmFuc2Zlci4gIE91ciBob3N0IHNlbnNlIGJ1ZmZlciBpcworICogbGFyZ2UgZW5vdWdoIHRvIHRha2UgdGhlIG1heGltdW0gYWxsb3dlZCBzdGF0dXMgcGFja2V0LgorICogTm9uZS10aGUtbGVzcywgd2UgbXVzdCBzdGlsbCBjYXRjaCBhbmQgcmVwb3J0IG92ZXJydW5zIHRvCisgKiB0aGUgaG9zdC4gIEFkZGl0aW9uYWxseSwgcHJvcGVybHkgY2F0Y2ggdW5leHBlY3RlZCBub24tcGFja2V0CisgKiBwaGFzZXMgdGhhdCBhcmUgdHlwaWNhbGx5IGNhdXNlZCBieSBDUkMgZXJyb3JzIGluIHN0YXR1cyBwYWNrZXQKKyAqIHRyYW5zbWlzc2lvbi4KKyAqLworcGt0X2hhbmRsZV9zdGF0dXM6CisJY2FsbAlzZXRqbXA7CisJdGVzdAlTR19DQUNIRV9TSEFET1csIExBU1RfU0VHX0RPTkUgam56IHBrdF9zdGF0dXNfY2hlY2tfb3ZlcnJ1bjsKKwl0ZXN0CVNFUUlOVFNSQywgQ1RYVERPTkUganogcGt0X3N0YXR1c19jaGVja19ub25wYWNrcmVxOworCXRlc3QJU0dfQ0FDSEVfU0hBRE9XLCBMQVNUX1NFR19ET05FIGpueiBwa3Rfc3RhdHVzX2NoZWNrX292ZXJydW47Citwa3Rfc3RhdHVzX0lVX2RvbmU6CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfQVVUT0ZMVVNIX0JVRykgIT0gMCkgeworCQlvcglERkNOVFJMLCBGSUZPRkxVU0g7CisJfQorCXRlc3QJREZTVEFUVVMsIEZJRk9FTVAganogcmV0dXJuOworQkVHSU5fQ1JJVElDQUw7CisJb3IJTE9OR0pNUF9BRERSWzFdLCBJTlZBTElEX0FERFI7CisJbXZpCVNDQl9TQ1NJX1NUQVRVUywgU1RBVFVTX1BLVF9TRU5TRTsKKwlvcglTQ0JfQ09OVFJPTCwgU1RBVFVTX1JDVkQ7CisJam1wCXBrdF9jb21wbGV0ZV9zY2JfaWZfZmlmb3NfaWRsZTsKK0VORF9DUklUSUNBTDsKK3BrdF9zdGF0dXNfY2hlY2tfb3ZlcnJ1bjoKKwkvKgorCSAqIFN0YXR1cyBQS1Qgb3ZlcnJ1bnMgYXJlIHVuY2VyaW1vbmlvdXNseSByZWNvdmVyZWQgd2l0aCBhCisJICogYnVzIHJlc2V0LiAgSWYgd2UndmUgb3ZlcnJ1biwgbGV0IHRoZSBob3N0IGtub3cgc28gdGhhdAorCSAqIHJlY292ZXJ5IGNhbiBiZSBwZXJmb3JtZWQuCisJICoKKwkgKiBMQVNUX1NFR19ET05FIGhhcyBiZWVuIG9ic2VydmVkLiAgSWYgZWl0aGVyIENUWFRET05FIG9yCisJICogYSBOT05QQUNLUkVRIHBoYXNlIGNoYW5nZSBoYXZlIG9jY3VycmVkIGFuZCB0aGUgRklGTyBpcworCSAqIGVtcHR5LCB0aGVyZSBpcyBubyBvdmVycnVuLgorCSAqLworCXRlc3QJREZTVEFUVVMsIEZJRk9FTVAganogcGt0X3N0YXR1c19yZXBvcnRfb3ZlcnJ1bjsKKwl0ZXN0CVNFUUlOVFNSQywgQ1RYVERPTkUganogLiArIDI7CisJdGVzdAlERlNUQVRVUywgRklGT0VNUCBqbnogcGt0X3N0YXR1c19JVV9kb25lOworCXRlc3QJU0NTSVBIQVNFLCB+REFUQV9QSEFTRV9NQVNLIGp6IHJldHVybjsKKwl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGpueiBwa3Rfc3RhdHVzX2NoZWNrX25vbnBhY2tyZXE7Citwa3Rfc3RhdHVzX3JlcG9ydF9vdmVycnVuOgorCVNFVF9TRVFJTlRDT0RFKFNUQVRVU19PVkVSUlVOKQorCS8qIFNFUVVFTkNFUiBSRVNUQVJURUQgKi8KK3BrdF9zdGF0dXNfY2hlY2tfbm9ucGFja3JlcToKKwkvKgorCSAqIENUWFRET05FIG1heSBiZSBoZWxkIG9mZiBpZiBhIE5PTlBBQ0tSRVEgaXMgYXNzb2NpYXRlZCB3aXRoCisJICogdGhlIGN1cnJlbnQgY29udGV4dC4gIElmIGEgTk9OUEFDS1JFUSBpcyBvYnNlcnZlZCwgZGVjaWRlCisJICogaWYgaXQgaXMgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQuICBJZiBpdCBpcyBmb3IgdGhlIGN1cnJlbnQKKwkgKiBjb250ZXh0LCB3ZSBtdXN0IGRlZmVyIE5PTlBBQ0tSRVEgcHJvY2Vzc2luZyB1bnRpbCBhbGwgZGF0YQorCSAqIGhhcyB0cmFuc2ZlcnJlZCB0byB0aGUgaG9zdC4KKwkgKi8KKwl0ZXN0CVNDU0lQSEFTRSwgfkRBVEFfUEhBU0VfTUFTSyBqeiByZXR1cm47CisJdGVzdAlTQ1NJU0lHTywgQVROTyBqbnogLiArIDI7CisJdGVzdAlTU1RBVDIsIE5PTlBBQ0tSRVEganogcmV0dXJuOworCXRlc3QJU0VRSU5UU1JDLCBDVFhURE9ORSBqbnogcGt0X3N0YXR1c19JVV9kb25lOworCXRlc3QJREZTVEFUVVMsIEZJRk9FTVAganogcmV0dXJuOworCS8qCisJICogVGhlIHVuZXhwZWN0ZWQgbm9ucGt0IHBoYXNlIGhhbmRsZXIgYXNzdW1lcyB0aGF0IGFueQorCSAqIGRhdGEgY2hhbm5lbCB1c2Ugd2lsbCBoYXZlIGEgRklGTyByZWZlcmVuY2UgY291bnQuICBJdAorCSAqIHR1cm5zIG91dCB0aGF0IHRoZSBzdGF0dXMgaGFuZGxlciBkb2Vzbid0IG5lZWQgYSByZWZlcm5jZQorCSAqIGNvdW50IHNpbmNlIHRoZSBzdGF0dXMgcmVjZWl2ZWQgZmxhZywgYW5kIHRodXMgY29tcGxldGlvbgorCSAqIHByb2Nlc3NpbmcsIGNhbm5vdCBiZSBzZXQgdW50aWwgdGhlIGhhbmRsZXIgaXMgZmluaXNoZWQuCisJICogV2UgaW5jcmVtZW50IHRoZSBjb3VudCBoZXJlIHRvIG1ha2UgdGhlIG5vbnBrdCBoYW5kbGVyCisJICogaGFwcHkuCisJICovCisJaW5jCVNDQl9GSUZPX1VTRV9DT1VOVDsKKwkvKiBGQUxMVEhST1VHSCAqLworCisvKgorICogTm9ucGFja3JlcSBpcyBhIHBvbGxlZCBzdGF0dXMuICBJdCBjYW4gY29tZSB0cnVlIGluIHRocmVlIHNpdHVhdGlvbnM6CisgKiB3ZSBoYXZlIHJlY2VpdmVkIGFuIExfUSwgd2UgaGF2ZSBzZW50IG9uZSBvciBtb3JlIExfUXMsIG9yIHRoZXJlIGlzIG5vCisgKiBMX1EgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBSRVEgKFJFUSBvY2N1cnMgaW1tZWRpYXRlbHkgYWZ0ZXIgYQorICogKHJlKXNlbGVjdGlvbikuICBSb3V0aW5lcyB0aGF0IGtub3cgdGhhdCB0aGUgY29udGV4dCByZXNwb25zaWJsZSBmb3IgdGhpcworICogbm9ucGFja3JlcSBjYWxsIGRpcmVjdGx5IGludG8gdW5leHBlY3RlZF9ub25wa3RfcGhhc2UuICBJbiB0aGUgY2FzZSBvZiB0aGUKKyAqIHRvcCBsZXZlbCBpZGxlIGxvb3AsIHdlIGV4aGF1c3QgYWxsIGFjdGl2ZSBjb250ZXh0cyBwcmlvciB0byBkZXRlcm1pbmluZyB0aGF0CisgKiB3ZSBzaW1wbHkgZG8gbm90IGhhdmUgdGhlIGZ1bGwgSV9UX0xfUSBmb3IgdGhpcyBwaGFzZS4KKyAqLwordW5leHBlY3RlZF9ub25wa3RfcGhhc2VfZmluZF9jdHh0OgorCS8qCisJICogVGhpcyBub25wYWNrcmVxIGlzIG1vc3QgbGlrZWx5IGFzc29jaWF0ZWQgd2l0aCBvbmUgb2YgdGhlIHRhZ3MKKwkgKiBpbiBhIEZJRk8gb3IgYW4gb3V0Z29pbmcgTFEuICBPbmx5IHRyZWF0IGl0IGFzIGFuIElfVCBvbmx5CisJICogbm9ucGFja3JlcSBpZiB3ZSd2ZSBjbGVhcmVkIG91dCB0aGUgRklGT3MgYW5kIGhhbmRsZWQgYW55CisJICogcGVuZGluZyBTRUxETy4KKwkgKi8KK1NFVF9TUkNfTU9ERQlNX1NDU0k7CitTRVRfRFNUX01PREUJTV9TQ1NJOworCWFuZAlBLCBGSUZPMUZSRUV8RklGTzBGUkVFLCBERkZTVEFUOworCWNtcAlBLCBGSUZPMUZSRUV8RklGTzBGUkVFIGpuZSByZXR1cm47CisJdGVzdAlTU1RBVDAsIFNFTERPIGpueiByZXR1cm47CisJbXZpCVNDQlBUUlsxXSwgU0NCX0xJU1RfTlVMTDsKK3VuZXhwZWN0ZWRfbm9ucGt0X3BoYXNlOgorCXRlc3QJTU9ERV9QVFIsIH4oTUtfTU9ERShNX0RGRjEsIE1fREZGMSkpCisJCWpueiB1bmV4cGVjdGVkX25vbnBrdF9tb2RlX2NsZWFyZWQ7CitTRVRfU1JDX01PREUJTV9ERkYwOworU0VUX0RTVF9NT0RFCU1fREZGMDsKKwlvcglMT05HSk1QX0FERFJbMV0sIElOVkFMSURfQUREUjsKKwlkZWMJU0NCX0ZJRk9fVVNFX0NPVU5UOworCW12aQlERkZTWEZSQ1RMLCBDTFJDSE47Cit1bmV4cGVjdGVkX25vbnBrdF9tb2RlX2NsZWFyZWQ6CisJbXZpCUNMUlNJTlQyLCBDTFJOT05QQUNLUkVROworCXRlc3QJU0NTSVBIQVNFLCB+KE1TR19JTl9QSEFTRXxNU0dfT1VUX1BIQVNFKSBqbnogaWxsZWdhbF9waGFzZTsKKwlTRVRfU0VRSU5UQ09ERShFTlRFUklOR19OT05QQUNLKQorCWptcAlJVGxvb3A7CisKK2lsbGVnYWxfcGhhc2U6CisJU0VUX1NFUUlOVENPREUoSUxMRUdBTF9QSEFTRSkKKwlqbXAJSVRsb29wOworCisvKgorICogV2UgaGF2ZSBlbnRlcmVkIGFuIG92ZXJydW4gc2l0dWF0aW9uLiAgSWYgd2UgaGF2ZSB3b3JraW5nCisgKiBCSVRCVUNLRVQsIGZsaXAgdGhhdCBvbiBhbmQgbGV0IHRoZSBoYXJkd2FyZSBlYXQgYW55IG92ZXJydW4KKyAqIGRhdGEuICBPdGhlcndpc2UgdXNlIGFuIG92ZXJydW4gYnVmZmVyIGluIHRoZSBob3N0IHRvIHNpbXVsYXRlCisgKiBCSVRCVUNLRVQuCisgKi8KK3BrdF9oYW5kbGVfb3ZlcnJ1bl9pbmNfdXNlX2NvdW50OgorCWluYwlTQ0JfRklGT19VU0VfQ09VTlQ7Citwa3RfaGFuZGxlX292ZXJydW46CisJU0VUX1NFUUlOVENPREUoQ0ZHNE9WRVJSVU4pCisJY2FsbAlmcmVlemVfcXVldWU7CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfUEtUX0JJVEJVQ0tFVF9CVUcpID09IDApIHsKKwkJb3IJREZGU1hGUkNUTCwgREZGQklUQlVDS0VUOworU0VUX1NSQ19NT0RFCU1fREZGMTsKK1NFVF9EU1RfTU9ERQlNX0RGRjE7CisJfSBlbHNlIHsKKwkJY2FsbAlsb2FkX292ZXJydW5fYnVmOworCQltdmkJREZDTlRSTCwgKEhETUFFTnxTQ1NJRU58UFJFTE9BREVOKTsKKwl9CisJY2FsbAlzZXRqbXA7CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfUEtUX0JJVEJVQ0tFVF9CVUcpICE9IDApIHsKKwkJdGVzdAlERlNUQVRVUywgUFJFTE9BRF9BVkFJTCBqeiBvdmVycnVuX2xvYWRfZG9uZTsKKwkJY2FsbAlsb2FkX292ZXJydW5fYnVmOworCQlvcglERkNOVFJMLCBQUkVMT0FERU47CitvdmVycnVuX2xvYWRfZG9uZToKKwkJdGVzdAlTRVFJTlRTUkMsIENUWFRET05FIGpueiBwa3Rfb3ZlcnJ1bl9lbmQ7CisJfSBlbHNlIHsKKwkJdGVzdAlERkZTWEZSQ1RMLCBERkZCSVRCVUNLRVQganogcGt0X292ZXJydW5fZW5kOworCX0KKwl0ZXN0CVNTVEFUMiwgTk9OUEFDS1JFUSBqeiByZXR1cm47Citwa3Rfb3ZlcnJ1bl9lbmQ6CisJb3IJU0NCX1JFU0lEVUFMX1NHUFRSLCBTR19PVkVSUlVOX1JFU0lEOworCXRlc3QJU0VRSU5UU1JDLCBDVFhURE9ORSBqeiB1bmV4cGVjdGVkX25vbnBrdF9waGFzZTsKKwlkZWMJU0NCX0ZJRk9fVVNFX0NPVU5UOworCW9yCUxPTkdKTVBfQUREUlsxXSwgSU5WQUxJRF9BRERSOworCXRlc3QJU0NCX0NPTlRST0wsIFNUQVRVU19SQ1ZEIGpueiBwa3RfY29tcGxldGVfc2NiX2lmX2ZpZm9zX2lkbGU7CisJbXZpCURGRlNYRlJDVEwsIENMUkNITiByZXQ7CisKK2lmICgoYWhkLT5idWdzICYgQUhEX1BLVF9CSVRCVUNLRVRfQlVHKSAhPSAwKSB7Citsb2FkX292ZXJydW5fYnVmOgorCS8qCisJICogTG9hZCBhIGR1bW15IHNlZ21lbnQgaWYgcHJlbG9hZCBzcGFjZSBpcyBhdmFpbGFibGUuCisJICovCisJbW92IAlIQUREUlswXSwgU0hBUkVEX0RBVEFfQUREUjsKKwlhZGQJSEFERFJbMV0sIFBLVF9PVkVSUlVOX0JVRk9GRlNFVCwgU0hBUkVEX0RBVEFfQUREUlsxXTsKKwltb3YJQUNDVU1fU0FWRSwgQTsKKwljbHIJQTsKKwlhZGMJSEFERFJbMl0sIEEsIFNIQVJFRF9EQVRBX0FERFJbMl07CisJYWRjCUhBRERSWzNdLCBBLCBTSEFSRURfREFUQV9BRERSWzNdOworCW1vdglBLCBBQ0NVTV9TQVZFOworCWJtb3YJSEFERFJbNF0sIEFMTFpFUk9TLCA0OworCS8qIFBLVF9PVkVSUlVOX0JVRlNJWkUgaXMgYSBtdWx0aXBsZSBvZiAyNTYgKi8KKwljbHIJSENOVFswXTsKKwltdmkJSENOVFsxXSwgKChQS1RfT1ZFUlJVTl9CVUZTSVpFID4+IDgpICYgMHhGRik7CisJY2xyCUhDTlRbMl0gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9jb3JlLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzdmYjFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9jb3JlLmMKQEAgLTAsMCArMSw5ODg4IEBACisvKgorICogQ29yZSByb3V0aW5lcyBhbmQgdGFibGVzIHNoYXJlYWJsZSBhY3Jvc3MgT1MgcGxhdGZvcm1zLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NC0yMDAyIEp1c3RpbiBULiBHaWJicy4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIEFkYXB0ZWMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICoKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5jIzIwMiAkCisgKgorICogJEZyZWVCU0QkCisgKi8KKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgImFpYzc5eHhfb3NtLmgiCisjaW5jbHVkZSAiYWljNzl4eF9pbmxpbmUuaCIKKyNpbmNsdWRlICJhaWNhc20vYWljYXNtX2luc2Zvcm1hdC5oIgorI2Vsc2UKKyNpbmNsdWRlIDxkZXYvYWljN3h4eC9haWM3OXh4X29zbS5oPgorI2luY2x1ZGUgPGRldi9haWM3eHh4L2FpYzc5eHhfaW5saW5lLmg+CisjaW5jbHVkZSA8ZGV2L2FpYzd4eHgvYWljYXNtL2FpY2FzbV9pbnNmb3JtYXQuaD4KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogR2xvYmFscyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGFoZF9zb2Z0Y190YWlscSBhaGRfdGFpbHEgPSBUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKGFoZF90YWlscSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBMb29rdXAgVGFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjaGFyICphaGRfY2hpcF9uYW1lc1tdID0KK3sKKwkiTk9ORSIsCisJImFpYzc5MDEiLAorCSJhaWM3OTAyIiwKKwkiYWljNzkwMUEiCit9Oworc3RhdGljIGNvbnN0IHVfaW50IG51bV9jaGlwX25hbWVzID0gTlVNX0VMRU1FTlRTKGFoZF9jaGlwX25hbWVzKTsKKworLyoKKyAqIEhhcmR3YXJlIGVycm9yIGNvZGVzLgorICovCitzdHJ1Y3QgYWhkX2hhcmRfZXJyb3JfZW50cnkgeworICAgICAgICB1aW50OF90IGVycm5vOworCWNoYXIgKmVycm1lc2c7Cit9OworCitzdGF0aWMgc3RydWN0IGFoZF9oYXJkX2Vycm9yX2VudHJ5IGFoZF9oYXJkX2Vycm9yc1tdID0geworCXsgRFNDVE1PVVQsCSJEaXNjYXJkIFRpbWVyIGhhcyB0aW1lZCBvdXQiIH0sCisJeyBJTExPUENPREUsCSJJbGxlZ2FsIE9wY29kZSBpbiBzZXF1ZW5jZXIgcHJvZ3JhbSIgfSwKKwl7IFNRUEFSRVJSLAkiU2VxdWVuY2VyIFBhcml0eSBFcnJvciIgfSwKKwl7IERQQVJFUlIsCSJEYXRhLXBhdGggUGFyaXR5IEVycm9yIiB9LAorCXsgTVBBUkVSUiwJIlNjcmF0Y2ggb3IgU0NCIE1lbW9yeSBQYXJpdHkgRXJyb3IiIH0sCisJeyBDSU9QQVJFUlIsCSJDSU9CVVMgUGFyaXR5IEVycm9yIiB9LAorfTsKK3N0YXRpYyBjb25zdCB1X2ludCBudW1fZXJyb3JzID0gTlVNX0VMRU1FTlRTKGFoZF9oYXJkX2Vycm9ycyk7CisKK3N0YXRpYyBzdHJ1Y3QgYWhkX3BoYXNlX3RhYmxlX2VudHJ5IGFoZF9waGFzZV90YWJsZVtdID0KK3sKKwl7IFBfREFUQU9VVCwJTVNHX05PT1AsCQkiaW4gRGF0YS1vdXQgcGhhc2UiCX0sCisJeyBQX0RBVEFJTiwJTVNHX0lOSVRJQVRPUl9ERVRfRVJSLAkiaW4gRGF0YS1pbiBwaGFzZSIJfSwKKwl7IFBfREFUQU9VVF9EVCwJTVNHX05PT1AsCQkiaW4gRFQgRGF0YS1vdXQgcGhhc2UiCX0sCisJeyBQX0RBVEFJTl9EVCwJTVNHX0lOSVRJQVRPUl9ERVRfRVJSLAkiaW4gRFQgRGF0YS1pbiBwaGFzZSIJfSwKKwl7IFBfQ09NTUFORCwJTVNHX05PT1AsCQkiaW4gQ29tbWFuZCBwaGFzZSIJfSwKKwl7IFBfTUVTR09VVCwJTVNHX05PT1AsCQkiaW4gTWVzc2FnZS1vdXQgcGhhc2UiCX0sCisJeyBQX1NUQVRVUywJTVNHX0lOSVRJQVRPUl9ERVRfRVJSLAkiaW4gU3RhdHVzIHBoYXNlIgl9LAorCXsgUF9NRVNHSU4sCU1TR19QQVJJVFlfRVJST1IsCSJpbiBNZXNzYWdlLWluIHBoYXNlIgl9LAorCXsgUF9CVVNGUkVFLAlNU0dfTk9PUCwJCSJ3aGlsZSBpZGxlIgkJfSwKKwl7IDAsCQlNU0dfTk9PUCwJCSJpbiB1bmtub3duIHBoYXNlIgl9Cit9OworCisvKgorICogSW4gbW9zdCBjYXNlcyB3ZSBvbmx5IHdpc2ggdG8gaXR0ZXJhdGUgb3ZlciByZWFsIHBoYXNlcywgc28KKyAqIGV4Y2x1ZGUgdGhlIGxhc3QgZWxlbWVudCBmcm9tIHRoZSBjb3VudC4KKyAqLworc3RhdGljIGNvbnN0IHVfaW50IG51bV9waGFzZXMgPSBOVU1fRUxFTUVOVFMoYWhkX3BoYXNlX3RhYmxlKSAtIDE7CisKKy8qIE91ciBTZXF1ZW5jZXIgUHJvZ3JhbSAqLworI2luY2x1ZGUgImFpYzc5eHhfc2VxLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAkJYWhkX2hhbmRsZV90cmFuc21pc3Npb25fZXJyb3Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyB2b2lkCQlhaGRfaGFuZGxlX2xxaXBoYXNlX2Vycm9yKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJCSAgdV9pbnQgbHFpc3RhdDEpOworc3RhdGljIGludAkJYWhkX2hhbmRsZV9wa3RfYnVzZnJlZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgICAgICB1X2ludCBidXNmcmVldGltZSk7CitzdGF0aWMgaW50CQlhaGRfaGFuZGxlX25vbnBrdF9idXNmcmVlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgdm9pZAkJYWhkX2hhbmRsZV9wcm90b192aW9sYXRpb24oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyB2b2lkCQlhaGRfZm9yY2VfcmVuZWdvdGlhdGlvbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCQlzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pOworCitzdGF0aWMgc3RydWN0IGFoZF90bW9kZV90c3RhdGUqCisJCQlhaGRfYWxsb2NfdHN0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJIHVfaW50IHNjc2lfaWQsIGNoYXIgY2hhbm5lbCk7CisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCitzdGF0aWMgdm9pZAkJYWhkX2ZyZWVfdHN0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJdV9pbnQgc2NzaV9pZCwgY2hhciBjaGFubmVsLCBpbnQgZm9yY2UpOworI2VuZGlmCitzdGF0aWMgdm9pZAkJYWhkX2RldmxpbWl0ZWRfc3luY3JhdGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgICAgIHN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICosCisJCQkJCQl1X2ludCAqcGVyaW9kLAorCQkJCQkJdV9pbnQgKnBwcl9vcHRpb25zLAorCQkJCQkJcm9sZV90IHJvbGUpOworc3RhdGljIHZvaWQJCWFoZF91cGRhdGVfbmVnX3RhYmxlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQkJCSAgICAgc3RydWN0IGFoZF90cmFuc2luZm8gKnRpbmZvKTsKK3N0YXRpYyB2b2lkCQlhaGRfdXBkYXRlX3BlbmRpbmdfc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIHZvaWQJCWFoZF9mZXRjaF9kZXZpbmZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHZvaWQJCWFoZF9zY2JfZGV2aW5mbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCXN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkJc3RydWN0IHNjYiAqc2NiKTsKK3N0YXRpYyB2b2lkCQlhaGRfc2V0dXBfaW5pdGlhdG9yX21zZ291dChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCQkgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQkJCQkgICBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIHZvaWQJCWFoZF9idWlsZF90cmFuc2Zlcl9tc2coc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgICAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKTsKK3N0YXRpYyB2b2lkCQlhaGRfY29uc3RydWN0X3NkdHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQkJCSAgIHVfaW50IHBlcmlvZCwgdV9pbnQgb2Zmc2V0KTsKK3N0YXRpYyB2b2lkCQlhaGRfY29uc3RydWN0X3dkdHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQkJCSAgIHVfaW50IGJ1c193aWR0aCk7CitzdGF0aWMgdm9pZAkJYWhkX2NvbnN0cnVjdF9wcHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkJICB1X2ludCBwZXJpb2QsIHVfaW50IG9mZnNldCwKKwkJCQkJICB1X2ludCBidXNfd2lkdGgsIHVfaW50IHBwcl9vcHRpb25zKTsKK3N0YXRpYyB2b2lkCQlhaGRfY2xlYXJfbXNnX3N0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgdm9pZAkJYWhkX2hhbmRsZV9tZXNzYWdlX3BoYXNlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Cit0eXBlZGVmIGVudW0geworCUFIRE1TR18xQiwKKwlBSERNU0dfMkIsCisJQUhETVNHX0VYVAorfSBhaGRfbXNndHlwZTsKK3N0YXRpYyBpbnQJCWFoZF9zZW50X21zZyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGFoZF9tc2d0eXBlIHR5cGUsCisJCQkJICAgICB1X2ludCBtc2d2YWwsIGludCBmdWxsKTsKK3N0YXRpYyBpbnQJCWFoZF9wYXJzZV9tc2coc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCSAgICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbyk7CitzdGF0aWMgaW50CQlhaGRfaGFuZGxlX21zZ19yZWplY3Qoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHZvaWQJCWFoZF9oYW5kbGVfaWduX3dpZGVfcmVzaWR1ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCQlzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHZvaWQJCWFoZF9yZWluaXRpYWxpemVfZGF0YXB0cnMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyB2b2lkCQlhaGRfaGFuZGxlX2RldnJlc2V0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkJICAgIHVfaW50IGx1biwgY2FtX3N0YXR1cyBzdGF0dXMsCisJCQkJCSAgICBjaGFyICptZXNzYWdlLCBpbnQgdmVyYm9zZV9sZXZlbCk7CisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCitzdGF0aWMgdm9pZAkJYWhkX3NldHVwX3RhcmdldF9tc2dpbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQkJCSAgICAgICBzdHJ1Y3Qgc2NiICpzY2IpOworI2VuZGlmCisKK3N0YXRpYyB1X2ludAkJYWhkX3NnbGlzdF9zaXplKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgdV9pbnQJCWFoZF9zZ2xpc3RfYWxsb2NzaXplKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgYnVzX2RtYW1hcF9jYWxsYmFja190CisJCQlhaGRfZG1hbWFwX2NiOyAKK3N0YXRpYyB2b2lkCQlhaGRfaW5pdGlhbGl6ZV9oc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIGludAkJYWhkX2luaXRfc2NiZGF0YShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIHZvaWQJCWFoZF9maW5pX3NjYmRhdGEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyB2b2lkCQlhaGRfc2V0dXBfaW9jZWxsX3dvcmthcm91bmQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyB2b2lkCQlhaGRfaW9jZWxsX2ZpcnN0X3NlbGVjdGlvbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIHZvaWQJCWFoZF9hZGRfY29sX2xpc3Qoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgc3RydWN0IHNjYiAqc2NiLCB1X2ludCBjb2xfaWR4KTsKK3N0YXRpYyB2b2lkCQlhaGRfcmVtX2NvbF9saXN0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJIHN0cnVjdCBzY2IgKnNjYik7CitzdGF0aWMgdm9pZAkJYWhkX2NoaXBfaW5pdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIHZvaWQJCWFoZF9xaW5maWZvX3JlcXVldWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgc3RydWN0IHNjYiAqcHJldl9zY2IsCisJCQkJCSAgICBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIGludAkJYWhkX3FpbmZpZm9fY291bnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyBpbnQJCWFoZF9zZWFyY2hfc2NiX2xpc3Qoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgdGFyZ2V0LAorCQkJCQkgICAgY2hhciBjaGFubmVsLCBpbnQgbHVuLCB1X2ludCB0YWcsCisJCQkJCSAgICByb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzLAorCQkJCQkgICAgYWhkX3NlYXJjaF9hY3Rpb24gYWN0aW9uLAorCQkJCQkgICAgdV9pbnQgKmxpc3RfaGVhZCwgdV9pbnQgdGlkKTsKK3N0YXRpYyB2b2lkCQlhaGRfc3RpdGNoX3RpZF9saXN0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgIHVfaW50IHRpZF9wcmV2LCB1X2ludCB0aWRfY3VyLAorCQkJCQkgICAgdV9pbnQgdGlkX25leHQpOworc3RhdGljIHZvaWQJCWFoZF9hZGRfc2NiX3RvX2ZyZWVfbGlzdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCQkgdV9pbnQgc2NiaWQpOworc3RhdGljIHVfaW50CQlhaGRfcmVtX3dzY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBzY2JpZCwKKwkJCQkgICAgIHVfaW50IHByZXYsIHVfaW50IG5leHQsIHVfaW50IHRpZCk7CitzdGF0aWMgdm9pZAkJYWhkX3Jlc2V0X2N1cnJlbnRfYnVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgYWhkX2NhbGxiYWNrX3QJYWhkX3Jlc2V0X3BvbGw7CitzdGF0aWMgYWhkX2NhbGxiYWNrX3QJYWhkX3N0YXRfdGltZXI7CisjaWZkZWYgQUhEX0RVTVBfU0VRCitzdGF0aWMgdm9pZAkJYWhkX2R1bXBzZXEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKKyNlbmRpZgorc3RhdGljIHZvaWQJCWFoZF9sb2Fkc2VxKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgaW50CQlhaGRfY2hlY2tfcGF0Y2goc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQlzdHJ1Y3QgcGF0Y2ggKipzdGFydF9wYXRjaCwKKwkJCQkJdV9pbnQgc3RhcnRfaW5zdHIsIHVfaW50ICpza2lwX2FkZHIpOworc3RhdGljIHVfaW50CQlhaGRfcmVzb2x2ZV9zZXFhZGRyKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgIHVfaW50IGFkZHJlc3MpOworc3RhdGljIHZvaWQJCWFoZF9kb3dubG9hZF9pbnN0cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgIHVfaW50IGluc3RycHRyLCB1aW50OF90ICpkY29uc3RzKTsKK3N0YXRpYyBpbnQJCWFoZF9wcm9iZV9zdGFja19zaXplKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgaW50CQlhaGRfc2NiX2FjdGl2ZV9pbl9maWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgICAgIHN0cnVjdCBzY2IgKnNjYik7CitzdGF0aWMgdm9pZAkJYWhkX3J1bl9kYXRhX2ZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgIHN0cnVjdCBzY2IgKnNjYik7CisKKyNpZmRlZiBBSERfVEFSR0VUX01PREUKK3N0YXRpYyB2b2lkCQlhaGRfcXVldWVfbHN0YXRlX2V2ZW50KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgICAgIHN0cnVjdCBhaGRfdG1vZGVfbHN0YXRlICpsc3RhdGUsCisJCQkJCSAgICAgICB1X2ludCBpbml0aWF0b3JfaWQsCisJCQkJCSAgICAgICB1X2ludCBldmVudF90eXBlLAorCQkJCQkgICAgICAgdV9pbnQgZXZlbnRfYXJnKTsKK3N0YXRpYyB2b2lkCQlhaGRfdXBkYXRlX3Njc2lpZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgdV9pbnQgdGFyZ2lkX21hc2spOworc3RhdGljIGludAkJYWhkX2hhbmRsZV90YXJnZXRfY21kKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgICAgc3RydWN0IHRhcmdldF9jbWQgKmNtZCk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFByaXZhdGUgSW5saW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoZF9hc3NlcnRfYXRuKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgX19pbmxpbmUgaW50CWFoZF9jdXJyZW50bHlfcGFja2V0aXplZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIGludAlhaGRfc2V0X2FjdGl2ZV9maWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfYXNzZXJ0X2F0bihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJYWhkX291dGIoYWhkLCBTQ1NJU0lHTywgQVROTyk7Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgaWYgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBoYXMgYSBwYWNrZXRpemVkCisgKiBhZ3JlZW1lbnQuICBUaGlzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCB3ZQorICogYXJlIGN1cnJlbnRseSBpbiBhIHBhY2tldGl6ZWQgdHJhbnNmZXIuICBXZSBjb3VsZAorICoganVzdCBhcyBlYXNpbHkgYmUgc2VuZGluZyBvciByZWNlaXZpbmcgYSBtZXNzYWdlLgorICovCitzdGF0aWMgX19pbmxpbmUgaW50CithaGRfY3VycmVudGx5X3BhY2tldGl6ZWQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCWFoZF9tb2RlX3N0YXRlCSBzYXZlZF9tb2RlczsKKwlpbnQJCSBwYWNrZXRpemVkOworCisJc2F2ZWRfbW9kZXMgPSBhaGRfc2F2ZV9tb2RlcyhhaGQpOworCWlmICgoYWhkLT5idWdzICYgQUhEX1BLVElaRURfU1RBVFVTX0JVRykgIT0gMCkgeworCQkvKgorCQkgKiBUaGUgcGFja2V0aXplZCBiaXQgcmVmZXJzIHRvIHRoZSBsYXN0CisJCSAqIGNvbm5lY3Rpb24sIG5vdCB0aGUgY3VycmVudCBvbmUuICBDaGVjaworCQkgKiBmb3Igbm9uLXplcm8gTFFJU1RBVEUgaW5zdGVhZC4KKwkJICovCisJCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9DRkcsIEFIRF9NT0RFX0NGRyk7CisJCXBhY2tldGl6ZWQgPSBhaGRfaW5iKGFoZCwgTFFJU1RBVEUpICE9IDA7CisJfSBlbHNlIHsKKwkJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCQlwYWNrZXRpemVkID0gYWhkX2luYihhaGQsIExRSVNUQVQyKSAmIFBBQ0tFVElaRUQ7CisJfQorCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOworCXJldHVybiAocGFja2V0aXplZCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2FoZF9zZXRfYWN0aXZlX2ZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXVfaW50IGFjdGl2ZV9maWZvOworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CisJYWN0aXZlX2ZpZm8gPSBhaGRfaW5iKGFoZCwgREZGU1RBVCkgJiBDVVJSRklGTzsKKwlzd2l0Y2ggKGFjdGl2ZV9maWZvKSB7CisJY2FzZSAwOgorCWNhc2UgMToKKwkJYWhkX3NldF9tb2RlcyhhaGQsIGFjdGl2ZV9maWZvLCBhY3RpdmVfZmlmbyk7CisJCXJldHVybiAoMSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuICgwKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFNlcXVlbmNlciBFeGVjdXRpb24gQ29udHJvbCAqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogUmVzdGFydCB0aGUgc2VxdWVuY2VyIHByb2dyYW0gZnJvbSBhZGRyZXNzIHplcm8KKyAqLwordm9pZAorYWhkX3Jlc3RhcnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCisJYWhkX3BhdXNlKGFoZCk7CisKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisKKwkvKiBObyBtb3JlIHBlbmRpbmcgbWVzc2FnZXMgKi8KKwlhaGRfY2xlYXJfbXNnX3N0YXRlKGFoZCk7CisJYWhkX291dGIoYWhkLCBTQ1NJU0lHTywgMCk7CQkvKiBEZS1hc3NlcnQgQlNZICovCisJYWhkX291dGIoYWhkLCBNU0dfT1VULCBNU0dfTk9PUCk7CS8qIE5vIG1lc3NhZ2UgdG8gc2VuZCAqLworCWFoZF9vdXRiKGFoZCwgU1hGUkNUTDEsIGFoZF9pbmIoYWhkLCBTWEZSQ1RMMSkgJiB+QklUQlVDS0VUKTsKKwlhaGRfb3V0YihhaGQsIFNFUUlOVENUTCwgMCk7CisJYWhkX291dGIoYWhkLCBMQVNUUEhBU0UsIFBfQlVTRlJFRSk7CisJYWhkX291dGIoYWhkLCBTRVFfRkxBR1MsIDApOworCWFoZF9vdXRiKGFoZCwgU0FWRURfU0NTSUlELCAweEZGKTsKKwlhaGRfb3V0YihhaGQsIFNBVkVEX0xVTiwgMHhGRik7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IHRoZSBzZXF1ZW5jZXIncyBpZGVhIG9mIFRRSU5QT1MKKwkgKiBtYXRjaGVzIG91ciBvd24uICBUaGUgc2VxdWVuY2VyIGluY3JlbWVudHMgVFFJTlBPUworCSAqIG9ubHkgYWZ0ZXIgaXQgc2VlcyBhIERNQSBjb21wbGV0ZSBhbmQgYSByZXNldCBjb3VsZAorCSAqIG9jY3VyIGJlZm9yZSB0aGUgaW5jcmVtZW50IGxlYXZpbmcgdGhlIGtlcm5lbCB0byBiZWxpZXZlCisJICogdGhlIGNvbW1hbmQgYXJyaXZlZCBidXQgdGhlIHNlcXVlbmNlciB0byBub3QuCisJICovCisJYWhkX291dGIoYWhkLCBUUUlOUE9TLCBhaGQtPnRxaW5maWZvbmV4dCk7CisKKwkvKiBBbHdheXMgYWxsb3cgcmVzZWxlY3Rpb24gKi8KKwlhaGRfb3V0YihhaGQsIFNDU0lTRVExLAorCQkgYWhkX2luYihhaGQsIFNDU0lTRVFfVEVNUExBVEUpICYgKEVOU0VMSXxFTlJTRUxJfEVOQVVUT0FUTlApKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfQ0NIQU4sIEFIRF9NT0RFX0NDSEFOKTsKKwlhaGRfb3V0YihhaGQsIFNFUUNUTDAsIEZBU1RNT0RFfFNFUVJFU0VUKTsKKwlhaGRfdW5wYXVzZShhaGQpOworfQorCit2b2lkCithaGRfY2xlYXJfZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IGZpZm8pCit7CisJYWhkX21vZGVfc3RhdGUJIHNhdmVkX21vZGVzOworCisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19GSUZPUykgIT0gMCkKKwkJcHJpbnRmKCIlczogQ2xlYXJpbmcgRklGTyAlZFxuIiwgYWhkX25hbWUoYWhkKSwgZmlmbyk7CisjZW5kaWYKKwlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIGZpZm8sIGZpZm8pOworCWFoZF9vdXRiKGFoZCwgREZGU1hGUkNUTCwgUlNUQ0hOfENMUlNIQ05UKTsKKwlpZiAoKGFoZF9pbmIoYWhkLCBTR19TVEFURSkgJiBGRVRDSF9JTlBST0cpICE9IDApCisJCWFoZF9vdXRiKGFoZCwgQ0NTR0NUTCwgQ0NTR1JFU0VUKTsKKwlhaGRfb3V0YihhaGQsIExPTkdKTVBfQUREUiArIDEsIElOVkFMSURfQUREUik7CisJYWhkX291dGIoYWhkLCBTR19TVEFURSwgMCk7CisJYWhkX3Jlc3RvcmVfbW9kZXMoYWhkLCBzYXZlZF9tb2Rlcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIElucHV0L091dHB1dCBRdWV1ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogRmx1c2ggYW5kIGNvbXBsZXRlZCBjb21tYW5kcyB0aGF0IGFyZSBzaXR0aW5nIGluIHRoZSBjb21tYW5kCisgKiBjb21wbGV0ZSBxdWV1ZXMgZG93biBvbiB0aGUgY2hpcCBidXQgaGF2ZSB5ZXQgdG8gYmUgZG1hJ2VkIGJhY2sgdXAuCisgKi8KK3ZvaWQKK2FoZF9mbHVzaF9xb3V0ZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJc3RydWN0CQlzY2IgKnNjYjsKKwlhaGRfbW9kZV9zdGF0ZQlzYXZlZF9tb2RlczsKKwl1X2ludAkJc2F2ZWRfc2NicHRyOworCXVfaW50CQljY3NjYmN0bDsKKwl1X2ludAkJc2NiaWQ7CisJdV9pbnQJCW5leHRfc2NiaWQ7CisKKwlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CisKKwkvKgorCSAqIENvbXBsZXRlIGFueSBTQ0JzIHRoYXQganVzdCBmaW5pc2hlZCBiZWluZworCSAqIERNQSdlZCBpbnRvIHRoZSBxb3V0Zmlmby4KKwkgKi8KKwlhaGRfcnVuX3FvdXRmaWZvKGFoZCk7CisKKwkvKgorCSAqIEZsdXNoIHRoZSBnb29kIHN0YXR1cyBGSUZPIGZvciBjb21wZWx0ZWQgcGFja2V0aXplZCBjb21tYW5kcy4KKwkgKi8KKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJc2F2ZWRfc2NicHRyID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwl3aGlsZSAoKGFoZF9pbmIoYWhkLCBMUUlTVEFUMikgJiBMUUlHU0FWQUlMKSAhPSAwKSB7CisJCXVfaW50IGZpZm9fbW9kZTsKKwkJdV9pbnQgaTsKKwkJCisJCXNjYmlkID0gKGFoZF9pbmIoYWhkLCBHU0ZJRk8rMSkgPDwgOCkKKwkJICAgICAgfCBhaGRfaW5iKGFoZCwgR1NGSUZPKTsKKwkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJcHJpbnRmKCIlczogV2FybmluZyAtIEdTRklGTyBTQ0IgJWQgaW52YWxpZFxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBzY2JpZCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBEZXRlcm1pbmUgaWYgdGhpcyB0cmFuc2FjdGlvbiBpcyBzdGlsbCBhY3RpdmUgaW4KKwkJICogYW55IEZJRk8uICBJZiBpdCBpcywgd2UgbXVzdCBmbHVzaCB0aGF0IEZJRk8gdG8KKwkJICogdGhlIGhvc3QgYmVmb3JlIGNvbXBsZXRpbmcgdGhlICBjb21tYW5kLgorCQkgKi8KKwkJZmlmb19tb2RlID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJLyogVG9nZ2xlIHRvIHRoZSBvdGhlciBtb2RlLiAqLworCQkJZmlmb19tb2RlIF49IDE7CisJCQlhaGRfc2V0X21vZGVzKGFoZCwgZmlmb19tb2RlLCBmaWZvX21vZGUpOworCQkJaWYgKGFoZF9zY2JfYWN0aXZlX2luX2ZpZm8oYWhkLCBzY2IpID09IDApCisJCQkJY29udGludWU7CisKKwkJCWFoZF9ydW5fZGF0YV9maWZvKGFoZCwgc2NiKTsKKworCQkJLyoKKwkJCSAqIENsZWFyaW5nIHRoaXMgdHJhbnNhY3Rpb24gaW4gdGhpcyBGSUZPIG1heQorCQkJICogY2F1c2UgYSBDRkc0REFUQSBmb3IgdGhpcyBzYW1lIHRyYW5zYWN0aW9uCisJCQkgKiB0byBhc3NlcnQgaW4gdGhlIG90aGVyIEZJRk8uICBNYWtlIHN1cmUgd2UKKwkJCSAqIGxvb3Agb25lIG1vcmUgdGltZSBhbmQgY2hlY2sgdGhlIG90aGVyIEZJRk8uCisJCQkgKi8KKwkJCWkgPSAwOworCQl9CisJCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKwkJYWhkX3NldF9zY2JwdHIoYWhkLCBzY2JpZCk7CisJCWlmICgoYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfU0dQVFIpICYgU0dfTElTVF9OVUxMKSA9PSAwCisJCSAmJiAoKGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1NHUFRSKSAmIFNHX0ZVTExfUkVTSUQpICE9IDAKKwkJICB8fCAoYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfUkVTSURVQUxfU0dQVFIpCisJCSAgICAgICYgU0dfTElTVF9OVUxMKSAhPSAwKSkgeworCQkJdV9pbnQgY29tcF9oZWFkOworCisJCQkvKgorCQkJICogVGhlIHRyYW5zZmVyIGNvbXBsZXRlZCB3aXRoIGEgcmVzaWR1YWwuCisJCQkgKiBQbGFjZSB0aGlzIFNDQiBvbiB0aGUgY29tcGxldGUgRE1BIGxpc3QKKwkJCSAqIHNvIHRoYXQgd2UgVXBkYXRlIG91ciBpbi1jb3JlIGNvcHkgb2YgdGhlCisJCQkgKiBTQ0IgYmVmb3JlIGNvbXBsZXRpbmcgdGhlIGNvbW1hbmQuCisJCQkgKi8KKwkJCWFoZF9vdXRiKGFoZCwgU0NCX1NDU0lfU1RBVFVTLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX1NHUFRSLAorCQkJCSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9TR1BUUikKKwkJCQkgfCBTR19TVEFUVVNfVkFMSUQpOworCQkJYWhkX291dHcoYWhkLCBTQ0JfVEFHLCBTQ0JfR0VUX1RBRyhzY2IpKTsKKwkJCWNvbXBfaGVhZCA9IGFoZF9pbncoYWhkLCBDT01QTEVURV9ETUFfU0NCX0hFQUQpOworCQkJYWhkX291dHcoYWhkLCBTQ0JfTkVYVF9DT01QTEVURSwgY29tcF9oZWFkKTsKKwkJCWlmIChTQ0JJRF9JU19OVUxMKGNvbXBfaGVhZCkpCisJCQkJYWhkX291dHcoYWhkLCBDT01QTEVURV9ETUFfU0NCX0hFQUQsCisJCQkJCSBTQ0JfR0VUX1RBRyhzY2IpKTsKKwkJfSBlbHNlCisJCQlhaGRfY29tcGxldGVfc2NiKGFoZCwgc2NiKTsKKwl9CisJYWhkX3NldF9zY2JwdHIoYWhkLCBzYXZlZF9zY2JwdHIpOworCisJLyoKKwkgKiBTZXR1cCBmb3IgY29tbWFuZCBjaGFubmVsIHBvcnRpb24gb2YgZmx1c2guCisJICovCisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0NDSEFOLCBBSERfTU9ERV9DQ0hBTik7CisKKwkvKgorCSAqIFdhaXQgZm9yIGFueSBpbnByb2dyZXNzIERNQSB0byBjb21wbGV0ZSBhbmQgY2xlYXIgRE1BIHN0YXRlCisJICogaWYgdGhpcyBpZiBmb3IgYW4gU0NCIGluIHRoZSBxaW5maWZvLgorCSAqLworCXdoaWxlICgoKGNjc2NiY3RsID0gYWhkX2luYihhaGQsIENDU0NCQ1RMKSkgJiAoQ0NBUlJFTnxDQ1NDQkVOKSkgIT0gMCkgeworCisJCWlmICgoY2NzY2JjdGwgJiAoQ0NTQ0JESVJ8Q0NBUlJFTikpID09IChDQ1NDQkRJUnxDQ0FSUkVOKSkgeworCQkJaWYgKChjY3NjYmN0bCAmIEFSUkRPTkUpICE9IDApCisJCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoKGNjc2NiY3RsICYgQ0NTQ0JET05FKSAhPSAwKQorCQkJYnJlYWs7CisJCWFoZF9kZWxheSgyMDApOworCX0KKwlpZiAoKGNjc2NiY3RsICYgQ0NTQ0JESVIpICE9IDApCisJCWFoZF9vdXRiKGFoZCwgQ0NTQ0JDVEwsIGNjc2NiY3RsICYgfihDQ0FSUkVOfENDU0NCRU4pKTsKKworCXNhdmVkX3NjYnB0ciA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJLyoKKwkgKiBNYW51YWxseSB1cGRhdGUvY29tcGxldGUgYW55IGNvbXBsZXRlZCBTQ0JzIHRoYXQgYXJlIHdhaXRpbmcgdG8gYmUKKwkgKiBETUEnZWQgYmFjayB1cCB0byB0aGUgaG9zdC4KKwkgKi8KKwlzY2JpZCA9IGFoZF9pbncoYWhkLCBDT01QTEVURV9ETUFfU0NCX0hFQUQpOworCXdoaWxlICghU0NCSURfSVNfTlVMTChzY2JpZCkpIHsKKwkJdWludDhfdCAqaHNjYl9wdHI7CisJCXVfaW50CSBpOworCQkKKwkJYWhkX3NldF9zY2JwdHIoYWhkLCBzY2JpZCk7CisJCW5leHRfc2NiaWQgPSBhaGRfaW53X3NjYnJhbShhaGQsIFNDQl9ORVhUX0NPTVBMRVRFKTsKKwkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJcHJpbnRmKCIlczogV2FybmluZyAtIERNQS11cCBhbmQgY29tcGxldGUgIgorCQkJICAgICAgICJTQ0IgJWQgaW52YWxpZFxuIiwgYWhkX25hbWUoYWhkKSwgc2NiaWQpOworCQkJY29udGludWU7CisJCX0KKwkJaHNjYl9wdHIgPSAodWludDhfdCAqKXNjYi0+aHNjYjsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3QgaGFyZHdhcmVfc2NiKTsgaSsrKQorCQkJKmhzY2JfcHRyKysgPSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9CQVNFICsgaSk7CisKKwkJYWhkX2NvbXBsZXRlX3NjYihhaGQsIHNjYik7CisJCXNjYmlkID0gbmV4dF9zY2JpZDsKKwl9CisJYWhkX291dHcoYWhkLCBDT01QTEVURV9ETUFfU0NCX0hFQUQsIFNDQl9MSVNUX05VTEwpOworCisJc2NiaWQgPSBhaGRfaW53KGFoZCwgQ09NUExFVEVfU0NCX0hFQUQpOworCXdoaWxlICghU0NCSURfSVNfTlVMTChzY2JpZCkpIHsKKworCQlhaGRfc2V0X3NjYnB0cihhaGQsIHNjYmlkKTsKKwkJbmV4dF9zY2JpZCA9IGFoZF9pbndfc2NicmFtKGFoZCwgU0NCX05FWFRfQ09NUExFVEUpOworCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwkJaWYgKHNjYiA9PSBOVUxMKSB7CisJCQlwcmludGYoIiVzOiBXYXJuaW5nIC0gQ29tcGxldGUgU0NCICVkIGludmFsaWRcbiIsCisJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgc2NiaWQpOworCQkJY29udGludWU7CisJCX0KKworCQlhaGRfY29tcGxldGVfc2NiKGFoZCwgc2NiKTsKKwkJc2NiaWQgPSBuZXh0X3NjYmlkOworCX0KKwlhaGRfb3V0dyhhaGQsIENPTVBMRVRFX1NDQl9IRUFELCBTQ0JfTElTVF9OVUxMKTsKKworCS8qCisJICogUmVzdG9yZSBzdGF0ZS4KKwkgKi8KKwlhaGRfc2V0X3NjYnB0cihhaGQsIHNhdmVkX3NjYnB0cik7CisJYWhkX3Jlc3RvcmVfbW9kZXMoYWhkLCBzYXZlZF9tb2Rlcyk7CisJYWhkLT5mbGFncyB8PSBBSERfVVBEQVRFX1BFTkRfQ01EUzsKK30KKworLyoKKyAqIERldGVybWluZSBpZiBhbiBTQ0IgZm9yIGEgcGFja2V0aXplZCB0cmFuc2FjdGlvbgorICogaXMgYWN0aXZlIGluIGEgRklGTy4KKyAqLworc3RhdGljIGludAorYWhkX3NjYl9hY3RpdmVfaW5fZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKworCS8qCisJICogVGhlIEZJRk8gaXMgb25seSBhY3RpdmUgZm9yIG91ciB0cmFuc2FjdGlvbiBpZgorCSAqIHRoZSBTQ0JQVFIgbWF0Y2hlcyB0aGUgU0NCJ3MgSUQgYW5kIHRoZSBmaXJtd2FyZQorCSAqIGhhcyBpbnN0YWxsZWQgYSBoYW5kbGVyIGZvciB0aGUgRklGTyBvciB3ZSBoYXZlCisJICogYSBwZW5kaW5nIFNBVkVQVFJTIG9yIENGRzREQVRBIGludGVycnVwdC4KKwkgKi8KKwlpZiAoYWhkX2dldF9zY2JwdHIoYWhkKSAhPSBTQ0JfR0VUX1RBRyhzY2IpCisJIHx8ICgoYWhkX2luYihhaGQsIExPTkdKTVBfQUREUisxKSAmIElOVkFMSURfQUREUikgIT0gMAorCSAgJiYgKGFoZF9pbmIoYWhkLCBTRVFJTlRTUkMpICYgKENGRzREQVRBfFNBVkVQVFJTKSkgPT0gMCkpCisJCXJldHVybiAoMCk7CisKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogUnVuIGEgZGF0YSBmaWZvIHRvIGNvbXBsZXRpb24gZm9yIGEgdHJhbnNhY3Rpb24gd2Uga25vdworICogaGFzIGNvbXBsZXRlZCBhY3Jvc3MgdGhlIFNDU0kgYnVzIChnb29kIHN0YXR1cyBoYXMgYmVlbgorICogcmVjZWl2ZWQpLiAgV2UgYXJlIGFscmVhZHkgc2V0IHRvIHRoZSBjb3JyZWN0IEZJRk8gbW9kZQorICogb24gZW50cnkgdG8gdGhpcyByb3V0aW5lLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gb3BlcmF0ZSBleGFjdGx5IGFzIHRoZSBmaXJtd2FyZQorICogd291bGQgd2hlbiBydW5uaW5nIHRoaXMgRklGTy4gIENhcmUgbXVzdCBiZSB0YWtlbiB0byB1cGRhdGUKKyAqIHRoaXMgcm91dGluZSBhbnkgdGltZSB0aGUgZmlybXdhcmUncyBGSUZPIGFsZ29yaXRobSBpcworICogY2hhbmdlZC4KKyAqLworc3RhdGljIHZvaWQKK2FoZF9ydW5fZGF0YV9maWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXVfaW50IHNlcWludHNyYzsKKworCXdoaWxlICgxKSB7CisJCXNlcWludHNyYyA9IGFoZF9pbmIoYWhkLCBTRVFJTlRTUkMpOworCQlpZiAoKHNlcWludHNyYyAmIENGRzREQVRBKSAhPSAwKSB7CisJCQl1aW50MzJfdCBkYXRhY250OworCQkJdWludDMyX3Qgc2dwdHI7CisKKwkJCS8qCisJCQkgKiBDbGVhciBmdWxsIHJlc2lkdWFsIGZsYWcuCisJCQkgKi8KKwkJCXNncHRyID0gYWhkX2lubF9zY2JyYW0oYWhkLCBTQ0JfU0dQVFIpICYgflNHX0ZVTExfUkVTSUQ7CisJCQlhaGRfb3V0YihhaGQsIFNDQl9TR1BUUiwgc2dwdHIpOworCisJCQkvKgorCQkJICogTG9hZCBkYXRhY250IGFuZCBhZGRyZXNzLgorCQkJICovCisJCQlkYXRhY250ID0gYWhkX2lubF9zY2JyYW0oYWhkLCBTQ0JfREFUQUNOVCk7CisJCQlpZiAoKGRhdGFjbnQgJiBBSERfRE1BX0xBU1RfU0VHKSAhPSAwKSB7CisJCQkJc2dwdHIgfD0gTEFTVF9TRUc7CisJCQkJYWhkX291dGIoYWhkLCBTR19TVEFURSwgMCk7CisJCQl9IGVsc2UKKwkJCQlhaGRfb3V0YihhaGQsIFNHX1NUQVRFLCBMT0FESU5HX05FRURFRCk7CisJCQlhaGRfb3V0cShhaGQsIEhBRERSLCBhaGRfaW5xX3NjYnJhbShhaGQsIFNDQl9EQVRBUFRSKSk7CisJCQlhaGRfb3V0bChhaGQsIEhDTlQsIGRhdGFjbnQgJiBBSERfU0dfTEVOX01BU0spOworCQkJYWhkX291dGIoYWhkLCBTR19DQUNIRV9QUkUsIHNncHRyKTsKKwkJCWFoZF9vdXRiKGFoZCwgREZDTlRSTCwgUFJFTE9BREVOfFNDU0lFTnxIRE1BRU4pOworCisJCQkvKgorCQkJICogSW5pdGlhbGl6ZSBSZXNpZHVhbCBGaWVsZHMuCisJCQkgKi8KKwkJCWFoZF9vdXRiKGFoZCwgU0NCX1JFU0lEVUFMX0RBVEFDTlQrMywgZGF0YWNudCA+PiAyNCk7CisJCQlhaGRfb3V0bChhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUiwgc2dwdHIgJiBTR19QVFJfTUFTSyk7CisKKwkJCS8qCisJCQkgKiBNYXJrIHRoZSBTQ0IgYXMgaGF2aW5nIGEgRklGTyBpbiB1c2UuCisJCQkgKi8KKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0ZJRk9fVVNFX0NPVU5ULAorCQkJCSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9GSUZPX1VTRV9DT1VOVCkgKyAxKTsKKworCQkJLyoKKwkJCSAqIEluc3RhbGwgYSAiZmFrZSIgaGFuZGxlciBmb3IgdGhpcyBGSUZPLgorCQkJICovCisJCQlhaGRfb3V0dyhhaGQsIExPTkdKTVBfQUREUiwgMCk7CisKKwkJCS8qCisJCQkgKiBOb3RpZnkgdGhlIGhhcmR3YXJlIHRoYXQgd2UgaGF2ZSBzYXRpc2ZpZWQKKwkJCSAqIHRoaXMgc2VxdWVuY2VyIGludGVycnVwdC4KKwkJCSAqLworCQkJYWhkX291dGIoYWhkLCBDTFJTRVFJTlRTUkMsIENMUkNGRzREQVRBKTsKKwkJfSBlbHNlIGlmICgoc2VxaW50c3JjICYgU0FWRVBUUlMpICE9IDApIHsKKwkJCXVpbnQzMl90IHNncHRyOworCQkJdWludDMyX3QgcmVzaWQ7CisKKwkJCWlmICgoYWhkX2luYihhaGQsIExPTkdKTVBfQUREUisxKSZJTlZBTElEX0FERFIpICE9IDApIHsKKwkJCQkvKgorCQkJCSAqIFNuYXBzaG90IFNhdmUgUG9pbnRlcnMuICBDbGVhcgorCQkJCSAqIHRoZSBzbmFwc2hvdCBhbmQgY29udGludWUuCisJCQkJICovCisJCQkJYWhkX291dGIoYWhkLCBERkZTWEZSQ1RMLCBDTFJDSE4pOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogRGlzYWJsZSBTL0cgZmV0Y2ggc28gdGhlIERNQSBlbmdpbmUKKwkJCSAqIGlzIGF2YWlsYWJsZSB0byBmdXR1cmUgdXNlcnMuCisJCQkgKi8KKwkJCWlmICgoYWhkX2luYihhaGQsIFNHX1NUQVRFKSAmIEZFVENIX0lOUFJPRykgIT0gMCkKKwkJCQlhaGRfb3V0YihhaGQsIENDU0dDVEwsIDApOworCQkJYWhkX291dGIoYWhkLCBTR19TVEFURSwgMCk7CisKKwkJCS8qCisJCQkgKiBGbHVzaCB0aGUgZGF0YSBGSUZPLiAgU3RyaWNrbHkgb25seQorCQkJICogbmVjZXNzYXJ5IGZvciBSZXYgQSBwYXJ0cy4KKwkJCSAqLworCQkJYWhkX291dGIoYWhkLCBERkNOVFJMLAorCQkJCSBhaGRfaW5iKGFoZCwgREZDTlRSTCkgfCBGSUZPRkxVU0gpOworCisJCQkvKgorCQkJICogQ2FsY3VsYXRlIHJlc2lkdWFsLgorCQkJICovCisJCQlzZ3B0ciA9IGFoZF9pbmxfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSKTsKKwkJCXJlc2lkID0gYWhkX2lubChhaGQsIFNIQ05UKTsKKwkJCXJlc2lkIHw9CisJCQkgICAgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfUkVTSURVQUxfREFUQUNOVCszKSA8PCAyNDsKKwkJCWFoZF9vdXRsKGFoZCwgU0NCX1JFU0lEVUFMX0RBVEFDTlQsIHJlc2lkKTsKKwkJCWlmICgoYWhkX2luYihhaGQsIFNHX0NBQ0hFX1NIQURPVykgJiBMQVNUX1NFRykgPT0gMCkgeworCQkJCS8qCisJCQkJICogTXVzdCBiYWNrIHVwIHRvIHRoZSBjb3JyZWN0IFMvRyBlbGVtZW50LgorCQkJCSAqIFR5cGljYWxseSB0aGlzIGp1c3QgbWVhbnMgcmVzZXR0aW5nIG91cgorCQkJCSAqIGxvdyBieXRlIHRvIHRoZSBvZmZzZXQgaW4gdGhlIFNHX0NBQ0hFLAorCQkJCSAqIGJ1dCBpZiB3ZSB3cmFwcGVkLCB3ZSBoYXZlIHRvIGNvcnJlY3QKKwkJCQkgKiB0aGUgb3RoZXIgYnl0ZXMgb2YgdGhlIHNncHRyIHRvby4KKwkJCQkgKi8KKwkJCQlpZiAoKGFoZF9pbmIoYWhkLCBTR19DQUNIRV9TSEFET1cpICYgMHg4MCkgIT0gMAorCQkJCSAmJiAoc2dwdHIgJiAweDgwKSA9PSAwKQorCQkJCQlzZ3B0ciAtPSAweDEwMDsKKwkJCQlzZ3B0ciAmPSB+MHhGRjsKKwkJCQlzZ3B0ciB8PSBhaGRfaW5iKGFoZCwgU0dfQ0FDSEVfU0hBRE9XKQorCQkJCSAgICAgICAmIFNHX0FERFJfTUFTSzsKKwkJCQlhaGRfb3V0bChhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUiwgc2dwdHIpOworCQkJCWFoZF9vdXRiKGFoZCwgU0NCX1JFU0lEVUFMX0RBVEFDTlQgKyAzLCAwKTsKKwkJCX0gZWxzZSBpZiAoKHJlc2lkICYgQUhEX1NHX0xFTl9NQVNLKSA9PSAwKSB7CisJCQkJYWhkX291dGIoYWhkLCBTQ0JfUkVTSURVQUxfU0dQVFIsCisJCQkJCSBzZ3B0ciB8IFNHX0xJU1RfTlVMTCk7CisJCQl9CisJCQkvKgorCQkJICogU2F2ZSBQb2ludGVycy4KKwkJCSAqLworCQkJYWhkX291dHEoYWhkLCBTQ0JfREFUQVBUUiwgYWhkX2lucShhaGQsIFNIQUREUikpOworCQkJYWhkX291dGwoYWhkLCBTQ0JfREFUQUNOVCwgcmVzaWQpOworCQkJYWhkX291dGwoYWhkLCBTQ0JfU0dQVFIsIHNncHRyKTsKKwkJCWFoZF9vdXRiKGFoZCwgQ0xSU0VRSU5UU1JDLCBDTFJTQVZFUFRSUyk7CisJCQlhaGRfb3V0YihhaGQsIFNFUUlNT0RFLAorCQkJCSBhaGRfaW5iKGFoZCwgU0VRSU1PREUpIHwgRU5TQVZFUFRSUyk7CisJCQkvKgorCQkJICogSWYgdGhlIGRhdGEgaXMgdG8gdGhlIFNDU0kgYnVzLCB3ZSBhcmUKKwkJCSAqIGRvbmUsIG90aGVyd2lzZSB3YWl0IGZvciBGSUZPRU1QLgorCQkJICovCisJCQlpZiAoKGFoZF9pbmIoYWhkLCBERkNOVFJMKSAmIERJUkVDVElPTikgIT0gMCkKKwkJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoYWhkX2luYihhaGQsIFNHX1NUQVRFKSAmIExPQURJTkdfTkVFREVEKSAhPSAwKSB7CisJCQl1aW50MzJfdCBzZ3B0cjsKKwkJCXVpbnQ2NF90IGRhdGFfYWRkcjsKKwkJCXVpbnQzMl90IGRhdGFfbGVuOworCQkJdV9pbnQJIGRmY250cmw7CisKKwkJCS8qCisJCQkgKiBEaXNhYmxlIFMvRyBmZXRjaCBzbyB0aGUgRE1BIGVuZ2luZQorCQkJICogaXMgYXZhaWxhYmxlIHRvIGZ1dHVyZSB1c2Vycy4KKwkJCSAqLworCQkJaWYgKChhaGRfaW5iKGFoZCwgU0dfU1RBVEUpICYgRkVUQ0hfSU5QUk9HKSAhPSAwKSB7CisJCQkJYWhkX291dGIoYWhkLCBDQ1NHQ1RMLCAwKTsKKwkJCQlhaGRfb3V0YihhaGQsIFNHX1NUQVRFLCBMT0FESU5HX05FRURFRCk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBXYWl0IGZvciB0aGUgRE1BIGVuZ2luZSB0byBub3RpY2UgdGhhdCB0aGUKKwkJCSAqIGhvc3QgdHJhbnNmZXIgaXMgZW5hYmxlZCBhbmQgdGhhdCB0aGVyZSBpcworCQkJICogc3BhY2UgaW4gdGhlIFMvRyBGSUZPIGZvciBuZXcgc2VnbWVudHMgYmVmb3JlCisJCQkgKiBsb2FkaW5nIG1vcmUgc2VnbWVudHMuCisJCQkgKi8KKwkJCWlmICgoYWhkX2luYihhaGQsIERGU1RBVFVTKSAmIFBSRUxPQURfQVZBSUwpID09IDApCisJCQkJY29udGludWU7CisJCQlpZiAoKGFoZF9pbmIoYWhkLCBERkNOVFJMKSAmIEhETUFFTkFDSykgPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJLyoKKwkJCSAqIERldGVybWluZSB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IFMvRworCQkJICogZWxlbWVudCB0byBsb2FkLgorCQkJICovCisJCQlzZ3B0ciA9IGFoZF9pbmxfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSKTsKKwkJCXNncHRyICY9IFNHX1BUUl9NQVNLOworCQkJaWYgKChhaGQtPmZsYWdzICYgQUhEXzY0QklUX0FERFJFU1NJTkcpICE9IDApIHsKKwkJCQlzdHJ1Y3QgYWhkX2RtYTY0X3NlZyAqc2c7CisKKwkJCQlzZyA9IGFoZF9zZ19idXNfdG9fdmlydChhaGQsIHNjYiwgc2dwdHIpOworCQkJCWRhdGFfYWRkciA9IHNnLT5hZGRyOworCQkJCWRhdGFfbGVuID0gc2ctPmxlbjsKKwkJCQlzZ3B0ciArPSBzaXplb2YoKnNnKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0CWFoZF9kbWFfc2VnICpzZzsKKworCQkJCXNnID0gYWhkX3NnX2J1c190b192aXJ0KGFoZCwgc2NiLCBzZ3B0cik7CisJCQkJZGF0YV9hZGRyID0gc2ctPmxlbiAmIEFIRF9TR19ISUdIX0FERFJfTUFTSzsKKwkJCQlkYXRhX2FkZHIgPDw9IDg7CisJCQkJZGF0YV9hZGRyIHw9IHNnLT5hZGRyOworCQkJCWRhdGFfbGVuID0gc2ctPmxlbjsKKwkJCQlzZ3B0ciArPSBzaXplb2YoKnNnKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFVwZGF0ZSByZXNpZHVhbCBpbmZvcm1hdGlvbi4KKwkJCSAqLworCQkJYWhkX291dGIoYWhkLCBTQ0JfUkVTSURVQUxfREFUQUNOVCszLCBkYXRhX2xlbiA+PiAyNCk7CisJCQlhaGRfb3V0bChhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUiwgc2dwdHIpOworCisJCQkvKgorCQkJICogTG9hZCB0aGUgUy9HLgorCQkJICovCisJCQlpZiAoZGF0YV9sZW4gJiBBSERfRE1BX0xBU1RfU0VHKSB7CisJCQkJc2dwdHIgfD0gTEFTVF9TRUc7CisJCQkJYWhkX291dGIoYWhkLCBTR19TVEFURSwgMCk7CisJCQl9CisJCQlhaGRfb3V0cShhaGQsIEhBRERSLCBkYXRhX2FkZHIpOworCQkJYWhkX291dGwoYWhkLCBIQ05ULCBkYXRhX2xlbiAmIEFIRF9TR19MRU5fTUFTSyk7CisJCQlhaGRfb3V0YihhaGQsIFNHX0NBQ0hFX1BSRSwgc2dwdHIgJiAweEZGKTsKKworCQkJLyoKKwkJCSAqIEFkdmVydGlzZSB0aGUgc2VnbWVudCB0byB0aGUgaGFyZHdhcmUuCisJCQkgKi8KKwkJCWRmY250cmwgPSBhaGRfaW5iKGFoZCwgREZDTlRSTCl8UFJFTE9BREVOfEhETUFFTjsKKwkJCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9ORVdfREZDTlRSTF9PUFRTKSE9MCkgeworCQkJCS8qCisJCQkJICogVXNlIFNDU0lFTldSRElTIHNvIHRoYXQgU0NTSUVOCisJCQkJICogaXMgbmV2ZXIgbW9kaWZpZWQgYnkgdGhpcworCQkJCSAqIG9wZXJhdGlvbi4KKwkJCQkgKi8KKwkJCQlkZmNudHJsIHw9IFNDU0lFTldSRElTOworCQkJfQorCQkJYWhkX291dGIoYWhkLCBERkNOVFJMLCBkZmNudHJsKTsKKwkJfSBlbHNlIGlmICgoYWhkX2luYihhaGQsIFNHX0NBQ0hFX1NIQURPVykKKwkJCSAmIExBU1RfU0VHX0RPTkUpICE9IDApIHsKKworCQkJLyoKKwkJCSAqIFRyYW5zZmVyIGNvbXBsZXRlZCB0byB0aGUgZW5kIG9mIFNHIGxpc3QKKwkJCSAqIGFuZCBoYXMgZmx1c2hlZCB0byB0aGUgaG9zdC4KKwkJCSAqLworCQkJYWhkX291dGIoYWhkLCBTQ0JfU0dQVFIsCisJCQkJIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1NHUFRSKSB8IFNHX0xJU1RfTlVMTCk7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoYWhkX2luYihhaGQsIERGU1RBVFVTKSAmIEZJRk9FTVApICE9IDApIHsKKwkJCWJyZWFrOworCQl9CisJCWFoZF9kZWxheSgyMDApOworCX0KKwkvKgorCSAqIENsZWFyIGFueSBoYW5kbGVyIGZvciB0aGlzIEZJRk8sIGRlY3JlbWVudAorCSAqIHRoZSBGSUZPIHVzZSBjb3VudCBmb3IgdGhlIFNDQiwgYW5kIHJlbGVhc2UKKwkgKiB0aGUgRklGTy4KKwkgKi8KKwlhaGRfb3V0YihhaGQsIExPTkdKTVBfQUREUiArIDEsIElOVkFMSURfQUREUik7CisJYWhkX291dGIoYWhkLCBTQ0JfRklGT19VU0VfQ09VTlQsCisJCSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9GSUZPX1VTRV9DT1VOVCkgLSAxKTsKKwlhaGRfb3V0YihhaGQsIERGRlNYRlJDVEwsIENMUkNITik7Cit9CisKK3ZvaWQKK2FoZF9ydW5fcW91dGZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXN0cnVjdCBzY2IgKnNjYjsKKwl1X2ludCAgc2NiX2luZGV4OworCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX1JVTk5JTkdfUU9VVEZJRk8pICE9IDApCisJCXBhbmljKCJhaGRfcnVuX3FvdXRmaWZvIHJlY3Vyc2lvbiIpOworCWFoZC0+ZmxhZ3MgfD0gQUhEX1JVTk5JTkdfUU9VVEZJRk87CisJYWhkX3N5bmNfcW91dGZpZm8oYWhkLCBCVVNfRE1BU1lOQ19QT1NUUkVBRCk7CisJd2hpbGUgKChhaGQtPnFvdXRmaWZvW2FoZC0+cW91dGZpZm9uZXh0XQorCSAgICAgJiBRT1VURklGT19FTlRSWV9WQUxJRF9MRSkgPT0gYWhkLT5xb3V0Zmlmb25leHRfdmFsaWRfdGFnKSB7CisKKwkJc2NiX2luZGV4ID0gYWhkX2xlMTZ0b2goYWhkLT5xb3V0Zmlmb1thaGQtPnFvdXRmaWZvbmV4dF0KKwkJCQkgICAgICAmIH5RT1VURklGT19FTlRSWV9WQUxJRF9MRSk7CisJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiX2luZGV4KTsKKwkJaWYgKHNjYiA9PSBOVUxMKSB7CisJCQlwcmludGYoIiVzOiBXQVJOSU5HIG5vIGNvbW1hbmQgZm9yIHNjYiAlZCAiCisJCQkgICAgICAgIihjbWRjbXBsdClcblFPVVRQT1MgPSAlZFxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBzY2JfaW5kZXgsCisJCQkgICAgICAgYWhkLT5xb3V0Zmlmb25leHQpOworCQkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOworCQl9IGVsc2UKKwkJCWFoZF9jb21wbGV0ZV9zY2IoYWhkLCBzY2IpOworCisJCWFoZC0+cW91dGZpZm9uZXh0ID0gKGFoZC0+cW91dGZpZm9uZXh0KzEpICYgKEFIRF9RT1VUX1NJWkUtMSk7CisJCWlmIChhaGQtPnFvdXRmaWZvbmV4dCA9PSAwKQorCQkJYWhkLT5xb3V0Zmlmb25leHRfdmFsaWRfdGFnIF49IFFPVVRGSUZPX0VOVFJZX1ZBTElEX0xFOworCX0KKwlhaGQtPmZsYWdzICY9IH5BSERfUlVOTklOR19RT1VURklGTzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogSW50ZXJydXB0IEhhbmRsaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2FoZF9oYW5kbGVfaHdlcnJpbnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCS8qCisJICogU29tZSBjYXRhc3Ryb3BoaWMgaGFyZHdhcmUgZXJyb3IgaGFzIG9jY3VycmVkLgorCSAqIFByaW50IGl0IGZvciB0aGUgdXNlciBhbmQgZGlzYWJsZSB0aGUgY29udHJvbGxlci4KKwkgKi8KKwlpbnQgaTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGFoZF9pbmIoYWhkLCBFUlJPUik7CisJZm9yIChpID0gMDsgaSA8IG51bV9lcnJvcnM7IGkrKykgeworCQlpZiAoKGVycm9yICYgYWhkX2hhcmRfZXJyb3JzW2ldLmVycm5vKSAhPSAwKQorCQkJcHJpbnRmKCIlczogaHdlcnJpbnQsICVzXG4iLAorCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGFoZF9oYXJkX2Vycm9yc1tpXS5lcnJtZXNnKTsKKwl9CisKKwlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJcGFuaWMoIkJSS0FEUklOVCIpOworCisJLyogVGVsbCBldmVyeW9uZSB0aGF0IHRoaXMgSEJBIGlzIG5vIGxvbmdlciBhdmFpbGFibGUgKi8KKwlhaGRfYWJvcnRfc2NicyhhaGQsIENBTV9UQVJHRVRfV0lMRENBUkQsIEFMTF9DSEFOTkVMUywKKwkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIFNDQl9MSVNUX05VTEwsIFJPTEVfVU5LTk9XTiwKKwkJICAgICAgIENBTV9OT19IQkEpOworCisJLyogVGVsbCB0aGUgc3lzdGVtIHRoYXQgdGhpcyBjb250cm9sbGVyIGhhcyBnb25lIGF3YXkuICovCisJYWhkX2ZyZWUoYWhkKTsKK30KKwordm9pZAorYWhkX2hhbmRsZV9zZXFpbnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBpbnRzdGF0KQoreworCXVfaW50IHNlcWludGNvZGU7CisKKwkvKgorCSAqIFNhdmUgdGhlIHNlcXVlbmNlciBpbnRlcnJ1cHQgY29kZSBhbmQgY2xlYXIgdGhlIFNFUUlOVAorCSAqIGJpdC4gV2Ugd2lsbCB1bnBhdXNlIHRoZSBzZXF1ZW5jZXIsIGlmIGFwcHJvcHJpYXRlLAorCSAqIGFmdGVyIHNlcnZpY2luZyB0aGUgcmVxdWVzdC4KKwkgKi8KKwlzZXFpbnRjb2RlID0gYWhkX2luYihhaGQsIFNFUUlOVENPREUpOworCWFoZF9vdXRiKGFoZCwgQ0xSSU5ULCBDTFJTRVFJTlQpOworCWlmICgoYWhkLT5idWdzICYgQUhEX0lOVENPTExJU0lPTl9CVUcpICE9IDApIHsKKwkJLyoKKwkJICogVW5wYXVzZSB0aGUgc2VxdWVuY2VyIGFuZCBsZXQgaXQgY2xlYXIKKwkJICogU0VRSU5UIGJ5IHdyaXRpbmcgTk9fU0VRSU5UIHRvIGl0LiAgVGhpcworCQkgKiB3aWxsIGNhdXNlIHRoZSBzZXF1ZW5jZXIgdG8gYmUgcGF1c2VkIGFnYWluLAorCQkgKiB3aGljaCBpcyB0aGUgZXhwZWN0ZWQgc3RhdGUgb2YgdGhpcyByb3V0aW5lLgorCQkgKi8KKwkJYWhkX3VucGF1c2UoYWhkKTsKKwkJd2hpbGUgKCFhaGRfaXNfcGF1c2VkKGFoZCkpCisJCQk7CisJCWFoZF9vdXRiKGFoZCwgQ0xSSU5ULCBDTFJTRVFJTlQpOworCX0KKwlhaGRfdXBkYXRlX21vZGVzKGFoZCk7CisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NSVNDKSAhPSAwKQorCQlwcmludGYoIiVzOiBIYW5kbGUgU2VxaW50IENhbGxlZCBmb3IgY29kZSAlZFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIHNlcWludGNvZGUpOworI2VuZGlmCisJc3dpdGNoIChzZXFpbnRjb2RlKSB7CisJY2FzZSBCQURfU0NCX1NUQVRVUzoKKwl7CisJCXN0cnVjdAlzY2IgKnNjYjsKKwkJdV9pbnQJc2NiaWQ7CisJCWludAljbWRzX3BlbmRpbmc7CisKKwkJc2NiaWQgPSBhaGRfZ2V0X3NjYnB0cihhaGQpOworCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwkJaWYgKHNjYiAhPSBOVUxMKSB7CisJCQlhaGRfY29tcGxldGVfc2NiKGFoZCwgc2NiKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiJXM6IFdBUk5JTkcgbm8gY29tbWFuZCBmb3Igc2NiICVkICIKKwkJCSAgICAgICAiKGJhZCBzdGF0dXMpXG4iLCBhaGRfbmFtZShhaGQpLCBzY2JpZCk7CisJCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJCX0KKwkJY21kc19wZW5kaW5nID0gYWhkX2ludyhhaGQsIENNRFNfUEVORElORyk7CisJCWlmIChjbWRzX3BlbmRpbmcgPiAwKQorCQkJYWhkX291dHcoYWhkLCBDTURTX1BFTkRJTkcsIGNtZHNfcGVuZGluZyAtIDEpOworCQlicmVhazsKKwl9CisJY2FzZSBFTlRFUklOR19OT05QQUNLOgorCXsKKwkJc3RydWN0CXNjYiAqc2NiOworCQl1X2ludAlzY2JpZDsKKworCQlBSERfQVNTRVJUX01PREVTKGFoZCwgfihBSERfTU9ERV9VTktOT1dOX01TS3xBSERfTU9ERV9DRkdfTVNLKSwKKwkJCQkgfihBSERfTU9ERV9VTktOT1dOX01TS3xBSERfTU9ERV9DRkdfTVNLKSk7CisJCXNjYmlkID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJLyoKKwkJCSAqIFNvbWVob3cgbmVlZCB0byBrbm93IGlmIHRoaXMKKwkJCSAqIGlzIGZyb20gYSBzZWxlY3Rpb24gb3IgcmVzZWxlY3Rpb24uCisJCQkgKiBGcm9tIHRoYXQsIHdlIGNhbiBkZXRlcm1pbmUgdGFyZ2V0CisJCQkgKiBJRCBzbyB3ZSBhdCBsZWFzdCBoYXZlIGFuIElfVCBuZXh1cy4KKwkJCSAqLworCQl9IGVsc2UgeworCQkJYWhkX291dGIoYWhkLCBTQVZFRF9TQ1NJSUQsIHNjYi0+aHNjYi0+c2NzaWlkKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0FWRURfTFVOLCBzY2ItPmhzY2ItPmx1bik7CisJCQlhaGRfb3V0YihhaGQsIFNFUV9GTEFHUywgMHgwKTsKKwkJfQorCQlpZiAoKGFoZF9pbmIoYWhkLCBMUUlTVEFUMikgJiBMUUlQSEFTRV9PVVRQS1QpICE9IDAKKwkJICYmIChhaGRfaW5iKGFoZCwgU0NTSVNJR08pICYgQVROTykgIT0gMCkgeworCQkJLyoKKwkJCSAqIFBoYXNlIGNoYW5nZSBhZnRlciByZWFkIHN0cmVhbSB3aXRoCisJCQkgKiBDUkMgZXJyb3Igd2l0aCBQMCBhc3NlcnRlZCBvbiBsYXN0CisJCQkgKiBwYWNrZXQuCisJCQkgKi8KKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApCisJCQkJcHJpbnRmKCIlczogQXNzdW1pbmcgTFFJUEhBU0VfTkxRIHdpdGggIgorCQkJCSAgICAgICAiUDAgYXNzZXJ0aW9uXG4iLCBhaGRfbmFtZShhaGQpKTsKKyNlbmRpZgorCQl9CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApCisJCQlwcmludGYoIiVzOiBFbnRlcmluZyBOT05QQUNLXG4iLCBhaGRfbmFtZShhaGQpKTsKKyNlbmRpZgorCQlicmVhazsKKwl9CisJY2FzZSBJTlZBTElEX1NFUUlOVDoKKwkJcHJpbnRmKCIlczogSW52YWxpZCBTZXF1ZW5jZXIgaW50ZXJydXB0IG9jY3VycmVkLlxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCkpOworCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJCWFoZF9yZXNldF9jaGFubmVsKGFoZCwgJ0EnLCAvKkluaXRpYXRlIFJlc2V0Ki9UUlVFKTsKKwkJYnJlYWs7CisJY2FzZSBTVEFUVVNfT1ZFUlJVTjoKKwl7CisJCXN0cnVjdAlzY2IgKnNjYjsKKwkJdV9pbnQJc2NiaWQ7CisKKwkJc2NiaWQgPSBhaGRfZ2V0X3NjYnB0cihhaGQpOworCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwkJaWYgKHNjYiAhPSBOVUxMKQorCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQllbHNlCisJCQlwcmludGYoIiVzOiAiLCBhaGRfbmFtZShhaGQpKTsKKwkJcHJpbnRmKCJTQ0IgJWQgUGFja2V0aXplZCBTdGF0dXMgT3ZlcnJ1biIsIHNjYmlkKTsKKwkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOworCQlhaGRfcmVzZXRfY2hhbm5lbChhaGQsICdBJywgLypJbml0aWF0ZSBSZXNldCovVFJVRSk7CisJCWJyZWFrOworCX0KKwljYXNlIENGRzRJU1RBVF9JTlRSOgorCXsKKwkJc3RydWN0CXNjYiAqc2NiOworCQl1X2ludAlzY2JpZDsKKworCQlzY2JpZCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOworCQlpZiAoc2NiID09IE5VTEwpIHsKKwkJCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKKwkJCXByaW50ZigiQ0ZHNElTVEFUOiBGcmVlIFNDQiAlZCByZWZlcmVuY2VkIiwgc2NiaWQpOworCQkJcGFuaWMoIkZvciBzYWZldHkiKTsKKwkJfQorCQlhaGRfb3V0cShhaGQsIEhBRERSLCBzY2ItPnNlbnNlX2J1c2FkZHIpOworCQlhaGRfb3V0dyhhaGQsIEhDTlQsIEFIRF9TRU5TRV9CVUZTSVpFKTsKKwkJYWhkX291dGIoYWhkLCBIQ05UICsgMiwgMCk7CisJCWFoZF9vdXRiKGFoZCwgU0dfQ0FDSEVfUFJFLCBTR19MQVNUX1NFRyk7CisJCWFoZF9vdXRiKGFoZCwgREZDTlRSTCwgUFJFTE9BREVOfFNDU0lFTnxIRE1BRU4pOworCQlicmVhazsKKwl9CisJY2FzZSBJTExFR0FMX1BIQVNFOgorCXsKKwkJdV9pbnQgYnVzX3BoYXNlOworCisJCWJ1c19waGFzZSA9IGFoZF9pbmIoYWhkLCBTQ1NJU0lHSSkgJiBQSEFTRV9NQVNLOworCQlwcmludGYoIiVzOiBJTExFR0FMX1BIQVNFIDB4JXhcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBidXNfcGhhc2UpOworCisJCXN3aXRjaCAoYnVzX3BoYXNlKSB7CisJCWNhc2UgUF9EQVRBT1VUOgorCQljYXNlIFBfREFUQUlOOgorCQljYXNlIFBfREFUQU9VVF9EVDoKKwkJY2FzZSBQX0RBVEFJTl9EVDoKKwkJY2FzZSBQX01FU0dPVVQ6CisJCWNhc2UgUF9TVEFUVVM6CisJCWNhc2UgUF9NRVNHSU46CisJCQlhaGRfcmVzZXRfY2hhbm5lbChhaGQsICdBJywgLypJbml0aWF0ZSBSZXNldCovVFJVRSk7CisJCQlwcmludGYoIiVzOiBJc3N1ZWQgQnVzIFJlc2V0LlxuIiwgYWhkX25hbWUoYWhkKSk7CisJCQlicmVhazsKKwkJY2FzZSBQX0NPTU1BTkQ6CisJCXsKKwkJCXN0cnVjdAlhaGRfZGV2aW5mbyBkZXZpbmZvOworCQkJc3RydWN0CXNjYiAqc2NiOworCQkJc3RydWN0CWFoZF9pbml0aWF0b3JfdGluZm8gKnRhcmdfaW5mbzsKKwkJCXN0cnVjdAlhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJCQlzdHJ1Y3QJYWhkX3RyYW5zaW5mbyAqdGluZm87CisJCQl1X2ludAlzY2JpZDsKKworCQkJLyoKKwkJCSAqIElmIGEgdGFyZ2V0IHRha2VzIHVzIGludG8gdGhlIGNvbW1hbmQgcGhhc2UKKwkJCSAqIGFzc3VtZSB0aGF0IGl0IGhhcyBiZWVuIGV4dGVybmFsbHkgcmVzZXQgYW5kCisJCQkgKiBoYXMgdGh1cyBsb3N0IG91ciBwcmV2aW91cyBwYWNrZXRpemVkIG5lZ290aWF0aW9uCisJCQkgKiBhZ3JlZW1lbnQuICBTaW5jZSB3ZSBoYXZlIG5vdCBzZW50IGFuIGlkZW50aWZ5CisJCQkgKiBtZXNzYWdlIGFuZCBtYXkgbm90IGhhdmUgZnVsbHkgcXVhbGlmaWVkIHRoZQorCQkJICogY29ubmVjdGlvbiwgd2UgY2hhbmdlIG91ciBjb21tYW5kIHRvIFRVUiwgYXNzZXJ0CisJCQkgKiBBVE4gYW5kIEFCT1JUIHRoZSB0YXNrIHdoZW4gd2UgZ28gdG8gbWVzc2FnZSBpbgorCQkJICogcGhhc2UuICBUaGUgT1NNIHdpbGwgc2VlIHRoZSBSRVFVRVVFX1JFUVVFU1QKKwkJCSAqIHN0YXR1cyBhbmQgcmV0cnkgdGhlIGNvbW1hbmQuCisJCQkgKi8KKwkJCXNjYmlkID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwkJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOworCQkJaWYgKHNjYiA9PSBOVUxMKSB7CisJCQkJcHJpbnRmKCJJbnZhbGlkIHBoYXNlIHdpdGggbm8gdmFsaWQgU0NCLiAgIgorCQkJCSAgICAgICAiUmVzZXR0aW5nIGJ1cy5cbiIpOworCQkJCWFoZF9yZXNldF9jaGFubmVsKGFoZCwgJ0EnLAorCQkJCQkJICAvKkluaXRpYXRlIFJlc2V0Ki9UUlVFKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIFNDQl9HRVRfT1VSX0lEKHNjYiksCisJCQkJCSAgICBTQ0JfR0VUX1RBUkdFVChhaGQsIHNjYiksCisJCQkJCSAgICBTQ0JfR0VUX0xVTihzY2IpLAorCQkJCQkgICAgU0NCX0dFVF9DSEFOTkVMKGFoZCwgc2NiKSwKKwkJCQkJICAgIFJPTEVfSU5JVElBVE9SKTsKKwkJCXRhcmdfaW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLAorCQkJCQkJCWRldmluZm8uY2hhbm5lbCwKKwkJCQkJCQlkZXZpbmZvLm91cl9zY3NpaWQsCisJCQkJCQkJZGV2aW5mby50YXJnZXQsCisJCQkJCQkJJnRzdGF0ZSk7CisJCQl0aW5mbyA9ICZ0YXJnX2luZm8tPmN1cnI7CisJCQlhaGRfc2V0X3dpZHRoKGFoZCwgJmRldmluZm8sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisJCQkJICAgICAgQUhEX1RSQU5TX0FDVElWRSwgLypwYXVzZWQqL1RSVUUpOworCQkJYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLCAvKnBlcmlvZCovMCwKKwkJCQkJIC8qb2Zmc2V0Ki8wLCAvKnBwcl9vcHRpb25zKi8wLAorCQkJCQkgQUhEX1RSQU5TX0FDVElWRSwgLypwYXVzZWQqL1RSVUUpOworCQkJYWhkX291dGIoYWhkLCBTQ0JfQ0RCX1NUT1JFLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9TVE9SRSsxLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9TVE9SRSsyLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9TVE9SRSszLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9TVE9SRSs0LCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9TVE9SRSs1LCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9MRU4sIDYpOworCQkJc2NiLT5oc2NiLT5jb250cm9sICY9IH4oVEFHX0VOQnxTQ0JfVEFHX1RZUEUpOworCQkJc2NiLT5oc2NiLT5jb250cm9sIHw9IE1LX01FU1NBR0U7CisJCQlhaGRfb3V0YihhaGQsIFNDQl9DT05UUk9MLCBzY2ItPmhzY2ItPmNvbnRyb2wpOworCQkJYWhkX291dGIoYWhkLCBNU0dfT1VULCBIT1NUX01TRyk7CisJCQlhaGRfb3V0YihhaGQsIFNBVkVEX1NDU0lJRCwgc2NiLT5oc2NiLT5zY3NpaWQpOworCQkJLyoKKwkJCSAqIFRoZSBsdW4gaXMgMCwgcmVnYXJkbGVzcyBvZiB0aGUgU0NCJ3MgbHVuCisJCQkgKiBhcyB3ZSBoYXZlIG5vdCBzZW50IGFuIGlkZW50aWZ5IG1lc3NhZ2UuCisJCQkgKi8KKwkJCWFoZF9vdXRiKGFoZCwgU0FWRURfTFVOLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0VRX0ZMQUdTLCAwKTsKKwkJCWFoZF9hc3NlcnRfYXRuKGFoZCk7CisJCQlzY2ItPmZsYWdzICY9IH4oU0NCX1BBQ0tFVElaRUQpOworCQkJc2NiLT5mbGFncyB8PSBTQ0JfQUJPUlR8U0NCX0NNRFBIQVNFX0FCT1JUOworCQkJYWhkX2ZyZWV6ZV9kZXZxKGFoZCwgc2NiKTsKKwkJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX1JFUVVFVUVfUkVRKTsKKwkJCWFoZF9mcmVlemVfc2NiKHNjYik7CisKKwkJCS8qCisJCQkgKiBBbGxvdyB0aGUgc2VxdWVuY2VyIHRvIGNvbnRpbnVlIHdpdGgKKwkJCSAqIG5vbi1wYWNrIHByb2Nlc3NpbmcuCisJCQkgKi8KKwkJCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKwkJCWFoZF9vdXRiKGFoZCwgQ0xSTFFPSU5UMSwgQ0xSTFFPUEhBQ0hHSU5QS1QpOworCQkJaWYgKChhaGQtPmJ1Z3MgJiBBSERfQ0xSTFFPX0FVVE9DTFJfQlVHKSAhPSAwKSB7CisJCQkJYWhkX291dGIoYWhkLCBDTFJMUU9JTlQxLCAwKTsKKwkJCX0KKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApIHsKKwkJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQkJcHJpbnRmKCJVbmV4cGVjdGVkIGNvbW1hbmQgcGhhc2UgZnJvbSAiCisJCQkJICAgICAgICJwYWNrZXRpemVkIHRhcmdldFxuIik7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQ0ZHNE9WRVJSVU46CisJeworCQlzdHJ1Y3QJc2NiICpzY2I7CisJCXVfaW50CXNjYl9pbmRleDsKKwkJCisjaWZkZWYgQUhEX0RFQlVHCisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApIHsKKwkJCXByaW50ZigiJXM6IENGRzRPVkVSUlVOIG1vZGUgPSAleFxuIiwgYWhkX25hbWUoYWhkKSwKKwkJCSAgICAgICBhaGRfaW5iKGFoZCwgTU9ERV9QVFIpKTsKKwkJfQorI2VuZGlmCisJCXNjYl9pbmRleCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiX2luZGV4KTsKKwkJaWYgKHNjYiA9PSBOVUxMKSB7CisJCQkvKgorCQkJICogQXR0ZW1wdCB0byB0cmFuc2ZlciB0byBhbiBTQ0IgdGhhdCBpcworCQkJICogbm90IG91dHN0YW5kaW5nLgorCQkJICovCisJCQlhaGRfYXNzZXJ0X2F0bihhaGQpOworCQkJYWhkX291dGIoYWhkLCBNU0dfT1VULCBIT1NUX01TRyk7CisJCQlhaGQtPm1zZ291dF9idWZbMF0gPSBNU0dfQUJPUlRfVEFTSzsKKwkJCWFoZC0+bXNnb3V0X2xlbiA9IDE7CisJCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCQlhaGQtPm1zZ190eXBlID0gTVNHX1RZUEVfSU5JVElBVE9SX01TR09VVDsKKwkJCS8qCisJCQkgKiBDbGVhciBzdGF0dXMgcmVjZWl2ZWQgZmxhZyB0byBwcmV2ZW50IGFueQorCQkJICogYXR0ZW1wdCB0byBjb21wbGV0ZSB0aGlzIGJvZ3VzIFNDQi4KKwkJCSAqLworCQkJYWhkX291dGIoYWhkLCBTQ0JfQ09OVFJPTCwKKwkJCQkgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQ09OVFJPTCkKKwkJCQkgJiB+U1RBVFVTX1JDVkQpOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIERVTVBfQ0FSRF9TVEFURToKKwl7CisJCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgUERBVEFfUkVJTklUOgorCXsKKyNpZmRlZiBBSERfREVCVUcKKwkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19SRUNPVkVSWSkgIT0gMCkgeworCQkJcHJpbnRmKCIlczogUERBVEFfUkVJTklUIC0gREZDTlRSTCA9IDB4JXggIgorCQkJICAgICAgICJTR19DQUNIRV9TSEFET1cgPSAweCV4XG4iLAorCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGFoZF9pbmIoYWhkLCBERkNOVFJMKSwKKwkJCSAgICAgICBhaGRfaW5iKGFoZCwgU0dfQ0FDSEVfU0hBRE9XKSk7CisJCX0KKyNlbmRpZgorCQlhaGRfcmVpbml0aWFsaXplX2RhdGFwdHJzKGFoZCk7CisJCWJyZWFrOworCX0KKwljYXNlIEhPU1RfTVNHX0xPT1A6CisJeworCQlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKKworCQkvKgorCQkgKiBUaGUgc2VxdWVuY2VyIGhhcyBlbmNvdW50ZXJlZCBhIG1lc3NhZ2UgcGhhc2UKKwkJICogdGhhdCByZXF1aXJlcyBob3N0IGFzc2lzdGFuY2UgZm9yIGNvbXBsZXRpb24uCisJCSAqIFdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlIHBoYXNlKHMpLCB3ZSB3aWxsIGJlCisJCSAqIG5vdGlmaWVkIGJ5IHRoZSBzZXF1ZW5jZXIgYWZ0ZXIgZWFjaCBieXRlIGlzCisJCSAqIHRyYW5zZmVyZWQgc28gd2UgY2FuIHRyYWNrIGJ1cyBwaGFzZSBjaGFuZ2VzLgorCQkgKgorCQkgKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIHNlZW4gYSBIT1NUX01TR19MT09QCisJCSAqIGludGVycnVwdCwgaW5pdGlhbGl6ZSB0aGUgc3RhdGUgb2YgdGhlIGhvc3QgbWVzc2FnZQorCQkgKiBsb29wLgorCQkgKi8KKwkJYWhkX2ZldGNoX2RldmluZm8oYWhkLCAmZGV2aW5mbyk7CisJCWlmIChhaGQtPm1zZ190eXBlID09IE1TR19UWVBFX05PTkUpIHsKKwkJCXN0cnVjdCBzY2IgKnNjYjsKKwkJCXVfaW50IHNjYl9pbmRleDsKKwkJCXVfaW50IGJ1c19waGFzZTsKKworCQkJYnVzX3BoYXNlID0gYWhkX2luYihhaGQsIFNDU0lTSUdJKSAmIFBIQVNFX01BU0s7CisJCQlpZiAoYnVzX3BoYXNlICE9IFBfTUVTR0lOCisJCQkgJiYgYnVzX3BoYXNlICE9IFBfTUVTR09VVCkgeworCQkJCXByaW50ZigiYWhkX2ludHI6IEhPU1RfTVNHX0xPT1AgYmFkICIKKwkJCQkgICAgICAgInBoYXNlIDB4JXhcbiIsIGJ1c19waGFzZSk7CisJCQkJLyoKKwkJCQkgKiBQcm9iYWJseSB0cmFuc2l0aW9uZWQgdG8gYnVzIGZyZWUgYmVmb3JlCisJCQkJICogd2UgZ290IGhlcmUuICBKdXN0IHB1bnQgdGhlIG1lc3NhZ2UuCisJCQkJICovCisJCQkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOworCQkJCWFoZF9jbGVhcl9pbnRzdGF0KGFoZCk7CisJCQkJYWhkX3Jlc3RhcnQoYWhkKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCXNjYl9pbmRleCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYl9pbmRleCk7CisJCQlpZiAoZGV2aW5mby5yb2xlID09IFJPTEVfSU5JVElBVE9SKSB7CisJCQkJaWYgKGJ1c19waGFzZSA9PSBQX01FU0dPVVQpCisJCQkJCWFoZF9zZXR1cF9pbml0aWF0b3JfbXNnb3V0KGFoZCwKKwkJCQkJCQkJICAgJmRldmluZm8sCisJCQkJCQkJCSAgIHNjYik7CisJCQkJZWxzZSB7CisJCQkJCWFoZC0+bXNnX3R5cGUgPQorCQkJCQkgICAgTVNHX1RZUEVfSU5JVElBVE9SX01TR0lOOworCQkJCQlhaGQtPm1zZ2luX2luZGV4ID0gMDsKKwkJCQl9CisJCQl9CisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCisJCQllbHNlIHsKKwkJCQlpZiAoYnVzX3BoYXNlID09IFBfTUVTR09VVCkgeworCQkJCQlhaGQtPm1zZ190eXBlID0KKwkJCQkJICAgIE1TR19UWVBFX1RBUkdFVF9NU0dPVVQ7CisJCQkJCWFoZC0+bXNnaW5faW5kZXggPSAwOworCQkJCX0KKwkJCQllbHNlIAorCQkJCQlhaGRfc2V0dXBfdGFyZ2V0X21zZ2luKGFoZCwKKwkJCQkJCQkgICAgICAgJmRldmluZm8sCisJCQkJCQkJICAgICAgIHNjYik7CisJCQl9CisjZW5kaWYKKwkJfQorCisJCWFoZF9oYW5kbGVfbWVzc2FnZV9waGFzZShhaGQpOworCQlicmVhazsKKwl9CisJY2FzZSBOT19NQVRDSDoKKwl7CisJCS8qIEVuc3VyZSB3ZSBkb24ndCBsZWF2ZSB0aGUgc2VsZWN0aW9uIGhhcmR3YXJlIG9uICovCisJCUFIRF9BU1NFUlRfTU9ERVMoYWhkLCBBSERfTU9ERV9TQ1NJX01TSywgQUhEX01PREVfU0NTSV9NU0spOworCQlhaGRfb3V0YihhaGQsIFNDU0lTRVEwLCBhaGRfaW5iKGFoZCwgU0NTSVNFUTApICYgfkVOU0VMTyk7CisKKwkJcHJpbnRmKCIlczolYzolZDogbm8gYWN0aXZlIFNDQiBmb3IgcmVjb25uZWN0aW5nICIKKwkJICAgICAgICJ0YXJnZXQgLSBpc3N1aW5nIEJVUyBERVZJQ0UgUkVTRVRcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCAnQScsIGFoZF9pbmIoYWhkLCBTRUxJRCkgPj4gNCk7CisJCXByaW50ZigiU0FWRURfU0NTSUlEID09IDB4JXgsIFNBVkVEX0xVTiA9PSAweCV4LCAiCisJCSAgICAgICAiUkVHMCA9PSAweCV4IEFDQ1VNID0gMHgleFxuIiwKKwkJICAgICAgIGFoZF9pbmIoYWhkLCBTQVZFRF9TQ1NJSUQpLCBhaGRfaW5iKGFoZCwgU0FWRURfTFVOKSwKKwkJICAgICAgIGFoZF9pbncoYWhkLCBSRUcwKSwgYWhkX2luYihhaGQsIEFDQ1VNKSk7CisJCXByaW50ZigiU0VRX0ZMQUdTID09IDB4JXgsIFNDQlBUUiA9PSAweCV4LCBCVFQgPT0gMHgleCwgIgorCQkgICAgICAgIlNJTkRFWCA9PSAweCV4XG4iLAorCQkgICAgICAgYWhkX2luYihhaGQsIFNFUV9GTEFHUyksIGFoZF9nZXRfc2NicHRyKGFoZCksCisJCSAgICAgICBhaGRfZmluZF9idXN5X3RjbChhaGQsCisJCQkJCSBCVUlMRF9UQ0woYWhkX2luYihhaGQsIFNBVkVEX1NDU0lJRCksCisJCQkJCQkgICBhaGRfaW5iKGFoZCwgU0FWRURfTFVOKSkpLAorCQkgICAgICAgYWhkX2ludyhhaGQsIFNJTkRFWCkpOworCQlwcmludGYoIlNFTElEID09IDB4JXgsIFNDQl9TQ1NJSUQgPT0gMHgleCwgU0NCX0xVTiA9PSAweCV4LCAiCisJCSAgICAgICAiU0NCX0NPTlRST0wgPT0gMHgleFxuIiwKKwkJICAgICAgIGFoZF9pbmIoYWhkLCBTRUxJRCksIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1NDU0lJRCksCisJCSAgICAgICBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9MVU4pLAorCQkgICAgICAgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQ09OVFJPTCkpOworCQlwcmludGYoIlNDU0lCVVNbMF0gPT0gMHgleCwgU0NTSVNJR0kgPT0gMHgleFxuIiwKKwkJICAgICAgIGFoZF9pbmIoYWhkLCBTQ1NJQlVTKSwgYWhkX2luYihhaGQsIFNDU0lTSUdJKSk7CisJCXByaW50ZigiU1hGUkNUTDAgPT0gMHgleFxuIiwgYWhkX2luYihhaGQsIFNYRlJDVEwwKSk7CisJCXByaW50ZigiU0VRQ1RMMCA9PSAweCV4XG4iLCBhaGRfaW5iKGFoZCwgU0VRQ1RMMCkpOworCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJCWFoZC0+bXNnb3V0X2J1ZlswXSA9IE1TR19CVVNfREVWX1JFU0VUOworCQlhaGQtPm1zZ291dF9sZW4gPSAxOworCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCWFoZC0+bXNnX3R5cGUgPSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHT1VUOworCQlhaGRfb3V0YihhaGQsIE1TR19PVVQsIEhPU1RfTVNHKTsKKwkJYWhkX2Fzc2VydF9hdG4oYWhkKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgUFJPVE9fVklPTEFUSU9OOgorCXsKKwkJYWhkX2hhbmRsZV9wcm90b192aW9sYXRpb24oYWhkKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSUdOX1dJREVfUkVTOgorCXsKKwkJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87CisKKwkJYWhkX2ZldGNoX2RldmluZm8oYWhkLCAmZGV2aW5mbyk7CisJCWFoZF9oYW5kbGVfaWduX3dpZGVfcmVzaWR1ZShhaGQsICZkZXZpbmZvKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQkFEX1BIQVNFOgorCXsKKwkJdV9pbnQgbGFzdHBoYXNlOworCisJCWxhc3RwaGFzZSA9IGFoZF9pbmIoYWhkLCBMQVNUUEhBU0UpOworCQlwcmludGYoIiVzOiVjOiVkOiB1bmtub3duIHNjc2kgYnVzIHBoYXNlICV4LCAiCisJCSAgICAgICAibGFzdHBoYXNlID0gMHgleC4gIEF0dGVtcHRpbmcgdG8gY29udGludWVcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCAnQScsCisJCSAgICAgICBTQ1NJSURfVEFSR0VUKGFoZCwgYWhkX2luYihhaGQsIFNBVkVEX1NDU0lJRCkpLAorCQkgICAgICAgbGFzdHBoYXNlLCBhaGRfaW5iKGFoZCwgU0NTSVNJR0kpKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTUlTU0VEX0JVU0ZSRUU6CisJeworCQl1X2ludCBsYXN0cGhhc2U7CisKKwkJbGFzdHBoYXNlID0gYWhkX2luYihhaGQsIExBU1RQSEFTRSk7CisJCXByaW50ZigiJXM6JWM6JWQ6IE1pc3NlZCBidXNmcmVlLiAiCisJCSAgICAgICAiTGFzdHBoYXNlID0gMHgleCwgQ3VycGhhc2UgPSAweCV4XG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgJ0EnLAorCQkgICAgICAgU0NTSUlEX1RBUkdFVChhaGQsIGFoZF9pbmIoYWhkLCBTQVZFRF9TQ1NJSUQpKSwKKwkJICAgICAgIGxhc3RwaGFzZSwgYWhkX2luYihhaGQsIFNDU0lTSUdJKSk7CisJCWFoZF9yZXN0YXJ0KGFoZCk7CisJCXJldHVybjsKKwl9CisJY2FzZSBEQVRBX09WRVJSVU46CisJeworCQkvKgorCQkgKiBXaGVuIHRoZSBzZXF1ZW5jZXIgZGV0ZWN0cyBhbiBvdmVycnVuLCBpdAorCQkgKiBwbGFjZXMgdGhlIGNvbnRyb2xsZXIgaW4gIkJJVEJVQ0tFVCIgbW9kZQorCQkgKiBhbmQgYWxsb3dzIHRoZSB0YXJnZXQgdG8gY29tcGxldGUgaXRzIHRyYW5zZmVyLgorCQkgKiBVbmZvcnR1bmF0ZWx5LCBub25lIG9mIHRoZSBjb3VudGVycyBnZXQgdXBkYXRlZAorCQkgKiB3aGVuIHRoZSBjb250cm9sbGVyIGlzIGluIHRoaXMgbW9kZSwgc28gd2UgaGF2ZQorCQkgKiBubyB3YXkgb2Yga25vd2luZyBob3cgbGFyZ2UgdGhlIG92ZXJydW4gd2FzLgorCQkgKi8KKwkJc3RydWN0CXNjYiAqc2NiOworCQl1X2ludAlzY2JpbmRleDsKKyNpZmRlZiBBSERfREVCVUcKKwkJdV9pbnQJbGFzdHBoYXNlOworI2VuZGlmCisKKwkJc2NiaW5kZXggPSBhaGRfZ2V0X3NjYnB0cihhaGQpOworCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmluZGV4KTsKKyNpZmRlZiBBSERfREVCVUcKKwkJbGFzdHBoYXNlID0gYWhkX2luYihhaGQsIExBU1RQSEFTRSk7CisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApIHsKKwkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJCXByaW50ZigiZGF0YSBvdmVycnVuIGRldGVjdGVkICVzLiAgVGFnID09IDB4JXguXG4iLAorCQkJICAgICAgIGFoZF9sb29rdXBfcGhhc2VfZW50cnkobGFzdHBoYXNlKS0+cGhhc2Vtc2csCisJCQkgICAgICAgU0NCX0dFVF9UQUcoc2NiKSk7CisJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQlwcmludGYoIiVzIHNlZW4gRGF0YSBQaGFzZS4gIExlbmd0aCA9ICVsZC4gICIKKwkJCSAgICAgICAiTnVtU0dzID0gJWQuXG4iLAorCQkJICAgICAgIGFoZF9pbmIoYWhkLCBTRVFfRkxBR1MpICYgRFBIQVNFCisJCQkgICAgICAgPyAiSGF2ZSIgOiAiSGF2ZW4ndCIsCisJCQkgICAgICAgYWhkX2dldF90cmFuc2Zlcl9sZW5ndGgoc2NiKSwgc2NiLT5zZ19jb3VudCk7CisJCQlhaGRfZHVtcF9zZ2xpc3Qoc2NiKTsKKwkJfQorI2VuZGlmCisKKwkJLyoKKwkJICogU2V0IHRoaXMgYW5kIGl0IHdpbGwgdGFrZSBlZmZlY3Qgd2hlbiB0aGUKKwkJICogdGFyZ2V0IGRvZXMgYSBjb21tYW5kIGNvbXBsZXRlLgorCQkgKi8KKwkJYWhkX2ZyZWV6ZV9kZXZxKGFoZCwgc2NiKTsKKwkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fREFUQV9SVU5fRVJSKTsKKwkJYWhkX2ZyZWV6ZV9zY2Ioc2NiKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTUtNU0dfRkFJTEVEOgorCXsKKwkJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87CisJCXN0cnVjdCBzY2IgKnNjYjsKKwkJdV9pbnQgc2NiaWQ7CisKKwkJYWhkX2ZldGNoX2RldmluZm8oYWhkLCAmZGV2aW5mbyk7CisJCXByaW50ZigiJXM6JWM6JWQ6JWQ6IEF0dGVtcHQgdG8gaXNzdWUgbWVzc2FnZSBmYWlsZWRcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLmNoYW5uZWwsIGRldmluZm8udGFyZ2V0LAorCQkgICAgICAgZGV2aW5mby5sdW4pOworCQlzY2JpZCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOworCQlpZiAoc2NiICE9IE5VTEwKKwkJICYmIChzY2ItPmZsYWdzICYgU0NCX1JFQ09WRVJZX1NDQikgIT0gMCkKKwkJCS8qCisJCQkgKiBFbnN1cmUgdGhhdCB3ZSBkaWRuJ3QgcHV0IGEgc2Vjb25kIGluc3RhbmNlIG9mIHRoaXMKKwkJCSAqIFNDQiBpbnRvIHRoZSBRSU5GSUZPLgorCQkJICovCisJCQlhaGRfc2VhcmNoX3FpbmZpZm8oYWhkLCBTQ0JfR0VUX1RBUkdFVChhaGQsIHNjYiksCisJCQkJCSAgIFNDQl9HRVRfQ0hBTk5FTChhaGQsIHNjYiksCisJCQkJCSAgIFNDQl9HRVRfTFVOKHNjYiksIFNDQl9HRVRfVEFHKHNjYiksCisJCQkJCSAgIFJPTEVfSU5JVElBVE9SLCAvKnN0YXR1cyovMCwKKwkJCQkJICAgU0VBUkNIX1JFTU9WRSk7CisJCWFoZF9vdXRiKGFoZCwgU0NCX0NPTlRST0wsCisJCQkgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQ09OVFJPTCkgJiB+TUtfTUVTU0FHRSk7CisJCWJyZWFrOworCX0KKwljYXNlIFRBU0tNR01UX0ZVTkNfQ09NUExFVEU6CisJeworCQl1X2ludAlzY2JpZDsKKwkJc3RydWN0CXNjYiAqc2NiOworCisJCXNjYmlkID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CisJCWlmIChzY2IgIT0gTlVMTCkgeworCQkJdV9pbnQJICAgbHVuOworCQkJdV9pbnQJICAgdGFnOworCQkJY2FtX3N0YXR1cyBlcnJvcjsKKworCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQkJcHJpbnRmKCJUYXNrIE1hbmFnZW1lbnQgRnVuYyAweCV4IENvbXBsZXRlXG4iLAorCQkJICAgICAgIHNjYi0+aHNjYi0+dGFza19tYW5hZ2VtZW50KTsKKwkJCWx1biA9IENBTV9MVU5fV0lMRENBUkQ7CisJCQl0YWcgPSBTQ0JfTElTVF9OVUxMOworCisJCQlzd2l0Y2ggKHNjYi0+aHNjYi0+dGFza19tYW5hZ2VtZW50KSB7CisJCQljYXNlIFNJVV9UQVNLTUdNVF9BQk9SVF9UQVNLOgorCQkJCXRhZyA9IFNDQl9HRVRfVEFHKHNjYik7CisJCQljYXNlIFNJVV9UQVNLTUdNVF9BQk9SVF9UQVNLX1NFVDoKKwkJCWNhc2UgU0lVX1RBU0tNR01UX0NMRUFSX1RBU0tfU0VUOgorCQkJCWx1biA9IHNjYi0+aHNjYi0+bHVuOworCQkJCWVycm9yID0gQ0FNX1JFUV9BQk9SVEVEOworCQkJCWFoZF9hYm9ydF9zY2JzKGFoZCwgU0NCX0dFVF9UQVJHRVQoYWhkLCBzY2IpLAorCQkJCQkgICAgICAgJ0EnLCBsdW4sIHRhZywgUk9MRV9JTklUSUFUT1IsCisJCQkJCSAgICAgICBlcnJvcik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNJVV9UQVNLTUdNVF9MVU5fUkVTRVQ6CisJCQkJbHVuID0gc2NiLT5oc2NiLT5sdW47CisJCQljYXNlIFNJVV9UQVNLTUdNVF9UQVJHRVRfUkVTRVQ6CisJCQl7CisJCQkJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87CisKKwkJCQlhaGRfc2NiX2RldmluZm8oYWhkLCAmZGV2aW5mbywgc2NiKTsKKwkJCQllcnJvciA9IENBTV9CRFJfU0VOVDsKKwkJCQlhaGRfaGFuZGxlX2RldnJlc2V0KGFoZCwgJmRldmluZm8sIGx1biwKKwkJCQkJCSAgICBDQU1fQkRSX1NFTlQsCisJCQkJCQkgICAgbHVuICE9IENBTV9MVU5fV0lMRENBUkQKKwkJCQkJCSAgICA/ICJMdW4gUmVzZXQiCisJCQkJCQkgICAgOiAiVGFyZ2V0IFJlc2V0IiwKKwkJCQkJCSAgICAvKnZlcmJvc2VfbGV2ZWwqLzApOworCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCQlwYW5pYygiVW5leHBlY3RlZCBUYXNrTWdtdCBGdW5jXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBUQVNLTUdNVF9DTURfQ01QTFRfT0tBWToKKwl7CisJCXVfaW50CXNjYmlkOworCQlzdHJ1Y3QJc2NiICpzY2I7CisKKwkJLyoKKwkJICogQW4gQUJPUlQgVEFTSyBUTUYgZmFpbGVkIHRvIGJlIGRlbGl2ZXJlZCBiZWZvcmUKKwkJICogdGhlIHRhcmdldGVkIGNvbW1hbmQgY29tcGxldGVkIG5vcm1hbGx5LgorCQkgKi8KKwkJc2NiaWQgPSBhaGRfZ2V0X3NjYnB0cihhaGQpOworCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwkJaWYgKHNjYiAhPSBOVUxMKSB7CisJCQkvKgorCQkJICogUmVtb3ZlIHRoZSBzZWNvbmQgaW5zdGFuY2Ugb2YgdGhpcyBTQ0IgZnJvbQorCQkJICogdGhlIFFJTkZJRk8gaWYgaXQgaXMgc3RpbGwgdGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJCXByaW50ZigiU0NCIGNvbXBsZXRlcyBiZWZvcmUgVE1GXG4iKTsKKwkJCS8qCisJCQkgKiBIYW5kbGUgbG9zaW5nIHRoZSByYWNlLiAgV2FpdCB1bnRpbCBhbnkKKwkJCSAqIGN1cnJlbnQgc2VsZWN0aW9uIGNvbXBsZXRlcy4gIFdlIHdpbGwgdGhlbgorCQkJICogc2V0IHRoZSBUTUYgYmFjayB0byB6ZXJvIGluIHRoaXMgU0NCIHNvIHRoYXQKKwkJCSAqIHRoZSBzZXF1ZW5jZXIgZG9lc24ndCBib3RoZXIgdG8gaXNzdWUgYW5vdGhlcgorCQkJICogc2VxdWVuY2VyIGludGVycnVwdCBmb3IgaXRzIGNvbXBsZXRpb24uCisJCQkgKi8KKwkJCXdoaWxlICgoYWhkX2luYihhaGQsIFNDU0lTRVEwKSAmIEVOU0VMTykgIT0gMAorCQkJICAgICYmIChhaGRfaW5iKGFoZCwgU1NUQVQwKSAmIFNFTERPKSA9PSAwCisJCQkgICAgJiYgKGFoZF9pbmIoYWhkLCBTU1RBVDEpICYgU0VMVE8pID09IDApCisJCQkJOworCQkJYWhkX291dGIoYWhkLCBTQ0JfVEFTS19NQU5BR0VNRU5ULCAwKTsKKwkJCWFoZF9zZWFyY2hfcWluZmlmbyhhaGQsIFNDQl9HRVRfVEFSR0VUKGFoZCwgc2NiKSwKKwkJCQkJICAgU0NCX0dFVF9DSEFOTkVMKGFoZCwgc2NiKSwgIAorCQkJCQkgICBTQ0JfR0VUX0xVTihzY2IpLCBTQ0JfR0VUX1RBRyhzY2IpLCAKKwkJCQkJICAgUk9MRV9JTklUSUFUT1IsIC8qc3RhdHVzKi8wLCAgIAorCQkJCQkgICBTRUFSQ0hfUkVNT1ZFKTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBUUkFDRVBPSU5UMDoKKwljYXNlIFRSQUNFUE9JTlQxOgorCWNhc2UgVFJBQ0VQT0lOVDI6CisJY2FzZSBUUkFDRVBPSU5UMzoKKwkJcHJpbnRmKCIlczogVHJhY2Vwb2ludCAlZFxuIiwgYWhkX25hbWUoYWhkKSwKKwkJICAgICAgIHNlcWludGNvZGUgLSBUUkFDRVBPSU5UMCk7CisJCWJyZWFrOworCWNhc2UgTk9fU0VRSU5UOgorCQlicmVhazsKKwljYXNlIFNBV19IV0VSUjoKKwkJYWhkX2hhbmRsZV9od2VycmludChhaGQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIiVzOiBVbmV4cGVjdGVkIFNFUUlOVENPREUgJWRcbiIsIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICBzZXFpbnRjb2RlKTsKKwkJYnJlYWs7CisJfQorCS8qCisJICogIFRoZSBzZXF1ZW5jZXIgaXMgcGF1c2VkIGltbWVkaWF0ZWx5IG9uCisJICogIGEgU0VRSU5ULCBzbyB3ZSBzaG91bGQgcmVzdGFydCBpdCB3aGVuCisJICogIHdlJ3JlIGRvbmUuCisJICovCisJYWhkX3VucGF1c2UoYWhkKTsKK30KKwordm9pZAorYWhkX2hhbmRsZV9zY3NpaW50KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgaW50c3RhdCkKK3sKKwlzdHJ1Y3Qgc2NiCSpzY2I7CisJdV9pbnQJCSBzdGF0dXMwOworCXVfaW50CQkgc3RhdHVzMzsKKwl1X2ludAkJIHN0YXR1czsKKwl1X2ludAkJIGxxaXN0YXQxOworCXVfaW50CQkgbHFvc3RhdDA7CisJdV9pbnQJCSBzY2JpZDsKKwl1X2ludAkJIGJ1c2ZyZWV0aW1lOworCisJYWhkX3VwZGF0ZV9tb2RlcyhhaGQpOworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKworCXN0YXR1czMgPSBhaGRfaW5iKGFoZCwgU1NUQVQzKSAmIChOVFJBTVBFUlJ8T1NSQU1QRVJSKTsKKwlzdGF0dXMwID0gYWhkX2luYihhaGQsIFNTVEFUMCkgJiAoSU9FUlJ8T1ZFUlJVTnxTRUxESXxTRUxETyk7CisJc3RhdHVzID0gYWhkX2luYihhaGQsIFNTVEFUMSkgJiAoU0VMVE98U0NTSVJTVEl8QlVTRlJFRXxTQ1NJUEVSUik7CisJbHFpc3RhdDEgPSBhaGRfaW5iKGFoZCwgTFFJU1RBVDEpOworCWxxb3N0YXQwID0gYWhkX2luYihhaGQsIExRT1NUQVQwKTsKKwlidXNmcmVldGltZSA9IGFoZF9pbmIoYWhkLCBTU1RBVDIpICYgQlVTRlJFRVRJTUU7CisJaWYgKChzdGF0dXMwICYgKFNFTERJfFNFTERPKSkgIT0gMCkgeworCQl1X2ludCBzaW1vZGUwOworCisJCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9DRkcsIEFIRF9NT0RFX0NGRyk7CisJCXNpbW9kZTAgPSBhaGRfaW5iKGFoZCwgU0lNT0RFMCk7CisJCXN0YXR1czAgJj0gc2ltb2RlMCAmIChJT0VSUnxPVkVSUlVOfFNFTERJfFNFTERPKTsKKwkJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCX0KKwlzY2JpZCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CisJaWYgKHNjYiAhPSBOVUxMCisJICYmIChhaGRfaW5iKGFoZCwgU0VRX0ZMQUdTKSAmIE5PVF9JREVOVElGSUVEKSAhPSAwKQorCQlzY2IgPSBOVUxMOworCisJLyogTWFrZSBzdXJlIHRoZSBzZXF1ZW5jZXIgaXMgaW4gYSBzYWZlIGxvY2F0aW9uLiAqLworCWFoZF9jbGVhcl9jcml0aWNhbF9zZWN0aW9uKGFoZCk7CisKKwlpZiAoKHN0YXR1czAgJiBJT0VSUikgIT0gMCkgeworCQl1X2ludCBub3dfbHZkOworCisJCW5vd19sdmQgPSBhaGRfaW5iKGFoZCwgU0JMS0NUTCkgJiBFTkFCNDA7CisJCXByaW50ZigiJXM6IFRyYW5zY2VpdmVyIFN0YXRlIEhhcyBDaGFuZ2VkIHRvICVzIG1vZGVcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBub3dfbHZkID8gIkxWRCIgOiAiU0UiKTsKKwkJYWhkX291dGIoYWhkLCBDTFJTSU5UMCwgQ0xSSU9FUlIpOworCQkvKgorCQkgKiBBIGNoYW5nZSBpbiBJL08gbW9kZSBpcyBlcXVpdmFsZW50IHRvIGEgYnVzIHJlc2V0LgorCQkgKi8KKwkJYWhkX3Jlc2V0X2NoYW5uZWwoYWhkLCAnQScsIC8qSW5pdGlhdGUgUmVzZXQqL1RSVUUpOworCQlhaGRfcGF1c2UoYWhkKTsKKwkJYWhkX3NldHVwX2lvY2VsbF93b3JrYXJvdW5kKGFoZCk7CisJCWFoZF91bnBhdXNlKGFoZCk7CisJfSBlbHNlIGlmICgoc3RhdHVzMCAmIE9WRVJSVU4pICE9IDApIHsKKwkJcHJpbnRmKCIlczogU0NTSSBvZmZzZXQgb3ZlcnJ1biBkZXRlY3RlZC4gIFJlc2V0dGluZyBidXMuXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CisJCWFoZF9yZXNldF9jaGFubmVsKGFoZCwgJ0EnLCAvKkluaXRpYXRlIFJlc2V0Ki9UUlVFKTsKKwl9IGVsc2UgaWYgKChzdGF0dXMgJiBTQ1NJUlNUSSkgIT0gMCkgeworCQlwcmludGYoIiVzOiBTb21lb25lIHJlc2V0IGNoYW5uZWwgQVxuIiwgYWhkX25hbWUoYWhkKSk7CisJCWFoZF9yZXNldF9jaGFubmVsKGFoZCwgJ0EnLCAvKkluaXRpYXRlIFJlc2V0Ki9GQUxTRSk7CisJfSBlbHNlIGlmICgoc3RhdHVzICYgU0NTSVBFUlIpICE9IDApIHsKKwkJYWhkX2hhbmRsZV90cmFuc21pc3Npb25fZXJyb3IoYWhkKTsKKwl9IGVsc2UgaWYgKGxxb3N0YXQwICE9IDApIHsKKwkJcHJpbnRmKCIlczogbHFvc3RhdDAgPT0gMHgleCFcbiIsIGFoZF9uYW1lKGFoZCksIGxxb3N0YXQwKTsKKwkJYWhkX291dGIoYWhkLCBDTFJMUU9JTlQwLCBscW9zdGF0MCk7CisJCWlmICgoYWhkLT5idWdzICYgQUhEX0NMUkxRT19BVVRPQ0xSX0JVRykgIT0gMCkgeworCQkJYWhkX291dGIoYWhkLCBDTFJMUU9JTlQxLCAwKTsKKwkJfQorCX0gZWxzZSBpZiAoKHN0YXR1cyAmIFNFTFRPKSAhPSAwKSB7CisJCXVfaW50ICBzY2JpZDsKKworCQkvKiBTdG9wIHRoZSBzZWxlY3Rpb24gKi8KKwkJYWhkX291dGIoYWhkLCBTQ1NJU0VRMCwgMCk7CisKKwkJLyogTm8gbW9yZSBwZW5kaW5nIG1lc3NhZ2VzICovCisJCWFoZF9jbGVhcl9tc2dfc3RhdGUoYWhkKTsKKworCQkvKiBDbGVhciBpbnRlcnJ1cHQgc3RhdGUgKi8KKwkJYWhkX291dGIoYWhkLCBDTFJTSU5UMSwgQ0xSU0VMVElNRU98Q0xSQlVTRlJFRXxDTFJTQ1NJUEVSUik7CisKKwkJLyoKKwkJICogQWx0aG91Z2ggdGhlIGRyaXZlciBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZQorCQkgKiAnU2VsZWN0aW9uIGluIFByb2dyZXNzJyBzdGF0dXMgYml0LCB0aGUgYnVzeQorCQkgKiBMRUQgZG9lcy4gIFNFTElOR08gaXMgb25seSBjbGVhcmVkIGJ5IGEgc3VjZXNzZnVsbAorCQkgKiBzZWxlY3Rpb24sIHNvIHdlIG11c3QgbWFudWFsbHkgY2xlYXIgaXQgdG8gaW5zdXJlCisJCSAqIHRoZSBMRUQgdHVybnMgb2ZmIGp1c3QgaW5jYXNlIG5vIGZ1dHVyZSBzdWNjZXNzZnVsCisJCSAqIHNlbGVjdGlvbnMgb2NjdXIgKGUuZy4gbm8gZGV2aWNlcyBvbiB0aGUgYnVzKS4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDAsIENMUlNFTElOR08pOworCisJCXNjYmlkID0gYWhkX2ludyhhaGQsIFdBSVRJTkdfVElEX0hFQUQpOworCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwkJaWYgKHNjYiA9PSBOVUxMKSB7CisJCQlwcmludGYoIiVzOiBhaGRfaW50ciAtIHJlZmVyZW5jZWQgc2NiIG5vdCAiCisJCQkgICAgICAgInZhbGlkIGR1cmluZyBTRUxUTyBzY2IoMHgleClcbiIsCisJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgc2NiaWQpOworCQkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOworCQl9IGVsc2UgeworCQkJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87CisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1NFTFRPKSAhPSAwKSB7CisJCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQkJCXByaW50ZigiU2F3IFNlbGVjdGlvbiBUaW1lb3V0IGZvciBTQ0IgMHgleFxuIiwKKwkJCQkgICAgICAgc2NiaWQpOworCQkJfQorI2VuZGlmCisJCQkvKgorCQkJICogRm9yY2UgYSByZW5lZ290aWF0aW9uIHdpdGggdGhpcyB0YXJnZXQganVzdCBpbgorCQkJICogY2FzZSB0aGUgY2FibGUgd2FzIHB1bGxlZCBhbmQgd2lsbCBsYXRlciBiZQorCQkJICogcmUtYXR0YWNoZWQuICBUaGUgdGFyZ2V0IG1heSBmb3JnZXQgaXRzIG5lZ290aWF0aW9uCisJCQkgKiBzZXR0aW5ncyB3aXRoIHVzIHNob3VsZCBpdCBhdHRlbXB0IHRvIHJlc2VsZWN0CisJCQkgKiBkdXJpbmcgdGhlIGludGVycnVwdGlvbi4gIFRoZSB0YXJnZXQgd2lsbCBub3QgaXNzdWUKKwkJCSAqIGEgdW5pdCBhdHRlbnRpb24gaW4gdGhpcyBjYXNlLCBzbyB3ZSBtdXN0IGFsd2F5cworCQkJICogcmVuZWdvdGlhdGUuCisJCQkgKi8KKwkJCWFoZF9zY2JfZGV2aW5mbyhhaGQsICZkZXZpbmZvLCBzY2IpOworCQkJYWhkX2ZvcmNlX3JlbmVnb3RpYXRpb24oYWhkLCAmZGV2aW5mbyk7CisJCQlhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9TRUxfVElNRU9VVCk7CisJCQlhaGRfZnJlZXplX2RldnEoYWhkLCBzY2IpOworCQl9CisJCWFoZF9vdXRiKGFoZCwgQ0xSSU5ULCBDTFJTQ1NJSU5UKTsKKwkJYWhkX2lvY2VsbF9maXJzdF9zZWxlY3Rpb24oYWhkKTsKKwkJYWhkX3VucGF1c2UoYWhkKTsKKwl9IGVsc2UgaWYgKChzdGF0dXMwICYgKFNFTERJfFNFTERPKSkgIT0gMCkgeworCQlhaGRfaW9jZWxsX2ZpcnN0X3NlbGVjdGlvbihhaGQpOworCQlhaGRfdW5wYXVzZShhaGQpOworCX0gZWxzZSBpZiAoc3RhdHVzMyAhPSAwKSB7CisJCXByaW50ZigiJXM6IFNDU0kgQ2VsbCBwYXJpdHkgZXJyb3IgU1NUQVQzID09IDB4JXhcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBzdGF0dXMzKTsKKwkJYWhkX291dGIoYWhkLCBDTFJTSU5UMywgc3RhdHVzMyk7CisJfSBlbHNlIGlmICgobHFpc3RhdDEgJiAoTFFJUEhBU0VfTFF8TFFJUEhBU0VfTkxRKSkgIT0gMCkgeworCQlhaGRfaGFuZGxlX2xxaXBoYXNlX2Vycm9yKGFoZCwgbHFpc3RhdDEpOworCX0gZWxzZSBpZiAoKGxxaXN0YXQxICYgTFFJQ1JDSV9OTFEpICE9IDApIHsKKwkJLyoKKwkJICogVGhpcyBzdGF0dXMgY2FuIGJlIGRlbGF5ZWQgZHVyaW5nIHNvbWUKKwkJICogc3RyZWFtaW5nIG9wZXJhdGlvbnMuICBUaGUgU0NTSVBIQVNFCisJCSAqIGhhbmRsZXIgaGFzIGFscmVhZHkgZGVhbHQgd2l0aCB0aGlzIGNhc2UKKwkJICogc28ganVzdCBjbGVhciB0aGUgZXJyb3IuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIENMUkxRSUlOVDEsIENMUkxRSUNSQ0lfTkxRKTsKKwl9IGVsc2UgaWYgKChzdGF0dXMgJiBCVVNGUkVFKSAhPSAwKSB7CisJCXVfaW50IGxxb3N0YXQxOworCQlpbnQgICByZXN0YXJ0OworCQlpbnQgICBjbGVhcl9maWZvOworCQlpbnQgICBwYWNrZXRpemVkOworCQl1X2ludCBtb2RlOworCisJCS8qCisJCSAqIENsZWFyIG91ciBzZWxlY3Rpb24gaGFyZHdhcmUgYXMgc29vbiBhcyBwb3NzaWJsZS4KKwkJICogV2UgbWF5IGhhdmUgYW4gZW50cnkgaW4gdGhlIHdhaXRpbmcgUSBmb3IgdGhpcyB0YXJnZXQsCisJCSAqIHRoYXQgaXMgYWZmZWN0ZWQgYnkgdGhpcyBidXNmcmVlIGFuZCB3ZSBkb24ndCB3YW50IHRvCisJCSAqIGdvIGFib3V0IHNlbGVjdGluZyB0aGUgdGFyZ2V0IHdoaWxlIHdlIGhhbmRsZSB0aGUgZXZlbnQuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIFNDU0lTRVEwLCAwKTsKKworCQkvKgorCQkgKiBEZXRlcm1pbmUgd2hhdCB3ZSB3ZXJlIHVwIHRvIGF0IHRoZSB0aW1lIG9mCisJCSAqIHRoZSBidXNmcmVlLgorCQkgKi8KKwkJbW9kZSA9IEFIRF9NT0RFX1NDU0k7CisJCWJ1c2ZyZWV0aW1lID0gYWhkX2luYihhaGQsIFNTVEFUMikgJiBCVVNGUkVFVElNRTsKKwkJbHFvc3RhdDEgPSBhaGRfaW5iKGFoZCwgTFFPU1RBVDEpOworCQlzd2l0Y2ggKGJ1c2ZyZWV0aW1lKSB7CisJCWNhc2UgQlVTRlJFRV9ERkYwOgorCQljYXNlIEJVU0ZSRUVfREZGMToKKwkJeworCQkJdV9pbnQJc2NiaWQ7CisJCQlzdHJ1Y3QJc2NiICpzY2I7CisKKwkJCW1vZGUgPSBidXNmcmVldGltZSA9PSBCVVNGUkVFX0RGRjAKKwkJCSAgICAgPyBBSERfTU9ERV9ERkYwIDogQUhEX01PREVfREZGMTsKKwkJCWFoZF9zZXRfbW9kZXMoYWhkLCBtb2RlLCBtb2RlKTsKKwkJCXNjYmlkID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwkJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOworCQkJaWYgKHNjYiA9PSBOVUxMKSB7CisJCQkJcHJpbnRmKCIlczogSW52YWxpZCBTQ0IgJWQgaW4gREZGJWQgIgorCQkJCSAgICAgICAiZHVyaW5nIHVuZXhwZWN0ZWQgYnVzZnJlZVxuIiwKKwkJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgc2NiaWQsIG1vZGUpOworCQkJCXBhY2tldGl6ZWQgPSAwOworCQkJfSBlbHNlCisJCQkJcGFja2V0aXplZCA9IChzY2ItPmZsYWdzICYgU0NCX1BBQ0tFVElaRUQpICE9IDA7CisJCQljbGVhcl9maWZvID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQlVTRlJFRV9MUU86CisJCQljbGVhcl9maWZvID0gMDsKKwkJCXBhY2tldGl6ZWQgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljbGVhcl9maWZvID0gMDsKKwkJCXBhY2tldGl6ZWQgPSAgKGxxb3N0YXQxICYgTFFPQlVTRlJFRSkgIT0gMDsKKwkJCWlmICghcGFja2V0aXplZAorCQkJICYmIGFoZF9pbmIoYWhkLCBMQVNUUEhBU0UpID09IFBfQlVTRlJFRSkKKwkJCQlwYWNrZXRpemVkID0gMTsKKwkJCWJyZWFrOworCQl9CisKKyNpZmRlZiBBSERfREVCVUcKKwkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NSVNDKSAhPSAwKQorCQkJcHJpbnRmKCJTYXcgQnVzZnJlZS4gIEJ1c2ZyZWV0aW1lID0gMHgleC5cbiIsCisJCQkgICAgICAgYnVzZnJlZXRpbWUpOworI2VuZGlmCisJCS8qCisJCSAqIEJ1c2ZyZWVzIHRoYXQgb2NjdXIgaW4gbm9uLXBhY2tldGl6ZWQgcGhhc2VzIGFyZQorCQkgKiBoYW5kbGVkIGJ5IHRoZSBub25wa3RfYnVzZnJlZSBoYW5kbGVyLgorCQkgKi8KKwkJaWYgKHBhY2tldGl6ZWQgJiYgYWhkX2luYihhaGQsIExBU1RQSEFTRSkgPT0gUF9CVVNGUkVFKSB7CisJCQlyZXN0YXJ0ID0gYWhkX2hhbmRsZV9wa3RfYnVzZnJlZShhaGQsIGJ1c2ZyZWV0aW1lKTsKKwkJfSBlbHNlIHsKKwkJCXBhY2tldGl6ZWQgPSAwOworCQkJcmVzdGFydCA9IGFoZF9oYW5kbGVfbm9ucGt0X2J1c2ZyZWUoYWhkKTsKKwkJfQorCQkvKgorCQkgKiBDbGVhciB0aGUgYnVzZnJlZSBpbnRlcnJ1cHQgc3RhdHVzLiAgVGhlIHNldHRpbmcgb2YKKwkJICogdGhlIGludGVycnVwdCBpcyBhIHB1bHNlLCBzbyBpbiBhIHBlcmZlY3Qgd29ybGQsIHdlCisJCSAqIHdvdWxkIG5vdCBuZWVkIHRvIG11Y2sgd2l0aCB0aGUgRU5CVVNGUkVFIGxvZ2ljLiAgVGhpcworCQkgKiB3b3VsZCBlbnN1cmUgdGhhdCBpZiB0aGUgYnVzIG1vdmVzIG9uIHRvIGFub3RoZXIKKwkJICogY29ubmVjdGlvbiwgYnVzZnJlZSBwcm90ZWN0aW9uIGlzIHN0aWxsIGluIGZvcmNlLiAgSWYKKwkJICogQlVTRlJFRVJFViBpcyBicm9rZW4sIGhvd2V2ZXIsIHdlIG11c3QgbWFudWFsbHkgY2xlYXIKKwkJICogdGhlIEVOQlVTRlJFRSBpZiB0aGUgYnVzZnJlZSBvY2N1cnJlZCBkdXJpbmcgYSBub24tcGFjaworCQkgKiBjb25uZWN0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGZhbHNlIHBvc2l0aXZlcyBkdXJpbmcKKwkJICogZnV0dXJlLCBwYWNrZXRpemVkLCBjb25uZWN0aW9ucy4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDEsIENMUkJVU0ZSRUUpOworCQlpZiAocGFja2V0aXplZCA9PSAwCisJCSAmJiAoYWhkLT5idWdzICYgQUhEX0JVU0ZSRUVSRVZfQlVHKSAhPSAwKQorCQkJYWhkX291dGIoYWhkLCBTSU1PREUxLAorCQkJCSBhaGRfaW5iKGFoZCwgU0lNT0RFMSkgJiB+RU5CVVNGUkVFKTsKKworCQlpZiAoY2xlYXJfZmlmbykKKwkJCWFoZF9jbGVhcl9maWZvKGFoZCwgbW9kZSk7CisKKwkJYWhkX2NsZWFyX21zZ19zdGF0ZShhaGQpOworCQlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSU0NTSUlOVCk7CisJCWlmIChyZXN0YXJ0KSB7CisJCQlhaGRfcmVzdGFydChhaGQpOworCQl9IGVsc2UgeworCQkJYWhkX3VucGF1c2UoYWhkKTsKKwkJfQorCX0gZWxzZSB7CisJCXByaW50ZigiJXM6IE1pc3NpbmcgY2FzZSBpbiBhaGRfaGFuZGxlX3Njc2lpbnQuIHN0YXR1cyA9ICV4XG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgc3RhdHVzKTsKKwkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOworCQlhaGRfY2xlYXJfaW50c3RhdChhaGQpOworCQlhaGRfdW5wYXVzZShhaGQpOworCX0KK30KKworc3RhdGljIHZvaWQKK2FoZF9oYW5kbGVfdHJhbnNtaXNzaW9uX2Vycm9yKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlzdHJ1Y3QJc2NiICpzY2I7CisJdV9pbnQJc2NiaWQ7CisJdV9pbnQJbHFpc3RhdDE7CisJdV9pbnQJbHFpc3RhdDI7CisJdV9pbnQJbXNnX291dDsKKwl1X2ludAljdXJwaGFzZTsKKwl1X2ludAlsYXN0cGhhc2U7CisJdV9pbnQJcGVycmRpYWc7CisJdV9pbnQJY3VyX2NvbDsKKwlpbnQJc2lsZW50OworCisJc2NiID0gTlVMTDsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJbHFpc3RhdDEgPSBhaGRfaW5iKGFoZCwgTFFJU1RBVDEpICYgfihMUUlQSEFTRV9MUXxMUUlQSEFTRV9OTFEpOworCWxxaXN0YXQyID0gYWhkX2luYihhaGQsIExRSVNUQVQyKTsKKwlpZiAoKGxxaXN0YXQxICYgKExRSUNSQ0lfTkxRfExRSUNSQ0lfTFEpKSA9PSAwCisJICYmIChhaGQtPmJ1Z3MgJiBBSERfTkxRSUNSQ19ERUxBWUVEX0JVRykgIT0gMCkgeworCQl1X2ludCBscWlzdGF0ZTsKKworCQlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfQ0ZHLCBBSERfTU9ERV9DRkcpOworCQlscWlzdGF0ZSA9IGFoZF9pbmIoYWhkLCBMUUlTVEFURSk7CisJCWlmICgobHFpc3RhdGUgPj0gMHgxRSAmJiBscWlzdGF0ZSA8PSAweDI0KQorCQkgfHwgKGxxaXN0YXRlID09IDB4MjkpKSB7CisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1JFQ09WRVJZKSAhPSAwKSB7CisJCQkJcHJpbnRmKCIlczogTkxRQ1JDIGZvdW5kIHZpYSBMUUlTVEFURVxuIiwKKwkJCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CisJCQl9CisjZW5kaWYKKwkJCWxxaXN0YXQxIHw9IExRSUNSQ0lfTkxROworCQl9CisJCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKwl9CisKKwlhaGRfb3V0YihhaGQsIENMUkxRSUlOVDEsIGxxaXN0YXQxKTsKKwlsYXN0cGhhc2UgPSBhaGRfaW5iKGFoZCwgTEFTVFBIQVNFKTsKKwljdXJwaGFzZSA9IGFoZF9pbmIoYWhkLCBTQ1NJU0lHSSkgJiBQSEFTRV9NQVNLOworCXBlcnJkaWFnID0gYWhkX2luYihhaGQsIFBFUlJESUFHKTsKKwltc2dfb3V0ID0gTVNHX0lOSVRJQVRPUl9ERVRfRVJSOworCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDEsIENMUlNDU0lQRVJSKTsKKwkKKwkvKgorCSAqIFRyeSB0byBmaW5kIHRoZSBTQ0IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXJyb3IuCisJICovCisJc2lsZW50ID0gRkFMU0U7CisJaWYgKGxxaXN0YXQxID09IDAKKwkgfHwgKGxxaXN0YXQxICYgTFFJQ1JDSV9OTFEpICE9IDApIHsKKwkgCWlmICgobHFpc3RhdDEgJiAoTFFJQ1JDSV9OTFF8TFFJT1ZFUklfTkxRKSkgIT0gMCkKKwkJCWFoZF9zZXRfYWN0aXZlX2ZpZm8oYWhkKTsKKwkJc2NiaWQgPSBhaGRfZ2V0X3NjYnB0cihhaGQpOworCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwkJaWYgKHNjYiAhPSBOVUxMICYmIFNDQl9JU19TSUxFTlQoc2NiKSkKKwkJCXNpbGVudCA9IFRSVUU7CisJfQorCisJY3VyX2NvbCA9IDA7CisJaWYgKHNpbGVudCA9PSBGQUxTRSkgeworCQlwcmludGYoIiVzOiBUcmFuc21pc3Npb24gZXJyb3IgZGV0ZWN0ZWRcbiIsIGFoZF9uYW1lKGFoZCkpOworCQlhaGRfbHFpc3RhdDFfcHJpbnQobHFpc3RhdDEsICZjdXJfY29sLCA1MCk7CisJCWFoZF9sYXN0cGhhc2VfcHJpbnQobGFzdHBoYXNlLCAmY3VyX2NvbCwgNTApOworCQlhaGRfc2NzaXNpZ2lfcHJpbnQoY3VycGhhc2UsICZjdXJfY29sLCA1MCk7CisJCWFoZF9wZXJyZGlhZ19wcmludChwZXJyZGlhZywgJmN1cl9jb2wsIDUwKTsKKwkJcHJpbnRmKCJcbiIpOworCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJfQorCisJaWYgKChscWlzdGF0MSAmIChMUUlPVkVSSV9MUXxMUUlPVkVSSV9OTFEpKSAhPSAwKSB7CisJCWlmIChzaWxlbnQgPT0gRkFMU0UpIHsKKwkJCXByaW50ZigiJXM6IEdyb3NzIHByb3RvY29sIGVycm9yIGR1cmluZyBpbmNvbWluZyAiCisJCQkgICAgICAgInBhY2tldC4gIGxxaXN0YXQxID09IDB4JXguICBSZXNldHRpbmcgYnVzLlxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBscWlzdGF0MSk7CisJCX0KKwkJYWhkX3Jlc2V0X2NoYW5uZWwoYWhkLCAnQScsIC8qSW5pdGlhdGUgUmVzZXQqL1RSVUUpOworCQlyZXR1cm47CisJfSBlbHNlIGlmICgobHFpc3RhdDEgJiBMUUlDUkNJX0xRKSAhPSAwKSB7CisJCS8qCisJCSAqIEEgQ1JDIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkIG9uIGFuIGluY29taW5nIExRLgorCQkgKiBUaGUgYnVzIGlzIGN1cnJlbnRseSBodW5nIG9uIHRoZSBsYXN0IEFDSy4KKwkJICogSGl0IExRSVJFVFJZIHRvIHJlbGVhc2UgdGhlIGxhc3QgYWNrLCBhbmQKKwkJICogd2FpdCBmb3IgdGhlIHNlcXVlbmNlciB0byBkZXRlcm1pbmUgdGhhdCBBVE5PCisJCSAqIGlzIGFzc2VydGVkIHdoaWxlIGluIG1lc3NhZ2Ugb3V0IHRvIHRha2UgdXMKKwkJICogdG8gb3VyIGhvc3QgbWVzc2FnZSBsb29wLiAgTm8gTk9OUEFDS1JFUSBvcgorCQkgKiBMUUlQSEFTRSB0eXBlIGVycm9ycyB3aWxsIG9jY3VyIGluIHRoaXMKKwkJICogc2NlbmFyaW8uICBBZnRlciB0aGlzIGZpcnN0IExRSVJFVFJZLCB0aGUgTFFJCisJCSAqIG1hbmFnZXIgd2lsbCBiZSBpbiBJU0VMTyB3aGVyZSBpdCB3aWxsCisJCSAqIGhhcHBpbHkgc2l0IHVudGlsIGFub3RoZXIgcGFja2V0IHBoYXNlIGJlZ2lucy4KKwkJICogVW5leHBlY3RlZCBidXMgZnJlZSBkZXRlY3Rpb24gaXMgZW5hYmxlZAorCQkgKiB0aHJvdWdoIGFueSBwaGFzZXMgdGhhdCBvY2N1ciBhZnRlciB3ZSByZWxlYXNlCisJCSAqIHRoaXMgbGFzdCBhY2sgdW50aWwgdGhlIExRSSBtYW5hZ2VyIHNlZXMgYQorCQkgKiBwYWNrZXQgcGhhc2UuICBUaGlzIGltcGxpZXMgd2UgbWF5IGhhdmUgdG8KKwkJICogaWdub3JlIGEgcGVyZmVjdGx5IHZhbGlkICJ1bmV4ZWN0ZWQgYnVzZnJlZSIKKwkJICogYWZ0ZXIgb3VyICJpbml0aWF0b3IgZGV0ZWN0ZWQgZXJyb3IiIG1lc3NhZ2UgaXMKKwkJICogc2VudC4gIEEgYnVzZnJlZSBpcyB0aGUgZXhwZWN0ZWQgcmVzcG9uc2UgYWZ0ZXIKKwkJICogd2UgdGVsbCB0aGUgdGFyZ2V0IHRoYXQgaXQncyBMX1Egd2FzIGNvcnJ1cHRlZC4KKwkJICogKFNQSTRSMDkgMTAuNy4zLjMuMykKKwkJICovCisJCWFoZF9vdXRiKGFoZCwgTFFDVEwyLCBMUUlSRVRSWSk7CisJCXByaW50ZigiTFFJUmV0cnkgZm9yIExRSUNSQ0lfTFEgdG8gcmVsZWFzZSBBQ0tcbiIpOworCX0gZWxzZSBpZiAoKGxxaXN0YXQxICYgTFFJQ1JDSV9OTFEpICE9IDApIHsKKwkJLyoKKwkJICogV2UgZGV0ZWN0ZWQgYSBDUkMgZXJyb3IgaW4gYSBOT04tTFEgcGFja2V0LgorCQkgKiBUaGUgaGFyZHdhcmUgaGFzIHZhcnlpbmcgYmVoYXZpb3IgaW4gdGhpcyBzaXR1YXRpb24KKwkJICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhpcyBwYWNrZXQgd2FzIHBhcnQgb2YgYQorCQkgKiBzdHJlYW0gb3Igbm90LgorCQkgKgorCQkgKiBQS1QgYnkgUEtUIG1vZGU6CisJCSAqIFRoZSBoYXJkd2FyZSBoYXMgYWxyZWFkeSBhY2tlZCB0aGUgY29tcGxldGUgcGFja2V0LgorCQkgKiBJZiB0aGUgdGFyZ2V0IGhvbm9ycyBvdXIgb3V0c3RhbmRpbmcgQVROIGNvbmRpdGlvbiwKKwkJICogd2Ugc2hvdWxkIGJlIChvciBzb29uIHdpbGwgYmUpIGluIE1TR09VVCBwaGFzZS4KKwkJICogVGhpcyB3aWxsIHRyaWdnZXIgdGhlIExRSVBIQVNFX0xRIHN0YXR1cyBiaXQgYXMgdGhlCisJCSAqIGhhcmR3YXJlIHdhcyBleHBlY3RpbmcgYW5vdGhlciBMUS4gIFVuZXhwZWN0ZWQKKwkJICogYnVzZnJlZSBkZXRlY3Rpb24gaXMgZW5hYmxlZC4gIE9uY2UgTFFJUEhBU0VfTFEgaXMKKwkJICogdHJ1ZSAoZmlyc3QgZW50cnkgaW50byBob3N0IG1lc3NhZ2UgbG9vcCBpcyBtdWNoCisJCSAqIHRoZSBzYW1lKSwgd2UgbXVzdCBjbGVhciBMUUlQSEFTRV9MUSBhbmQgaGl0CisJCSAqIExRSVJFVFJZIHNvIHRoZSBoYXJkd2FyZSBpcyByZWFkeSB0byBoYW5kbGUKKwkJICogYSBmdXR1cmUgTFEuICBOT05QQUNLUkVRIHdpbGwgbm90IGJlIGFzc2VydGVkIGFnYWluCisJCSAqIG9uY2Ugd2UgaGl0IExRSVJFVFJZIHVudGlsIGFub3RoZXIgcGFja2V0IGlzCisJCSAqIHByb2Nlc3NlZC4gIFRoZSB0YXJnZXQgbWF5IGVpdGhlciBnbyBidXNmcmVlCisJCSAqIG9yIHN0YXJ0IGFub3RoZXIgcGFja2V0IGluIHJlc3BvbnNlIHRvIG91ciBtZXNzYWdlLgorCQkgKgorCQkgKiBSZWFkIFN0cmVhbWluZyBQMCBhc3NlcnRlZDoKKwkJICogSWYgd2UgcmFpc2UgQVROIGFuZCB0aGUgdGFyZ2V0IGNvbXBsZXRlcyB0aGUgZW50aXJlCisJCSAqIHN0cmVhbSAoUDAgYXNzZXJ0ZWQgZHVyaW5nIHRoZSBsYXN0IHBhY2tldCksIHRoZQorCQkgKiBoYXJkd2FyZSB3aWxsIGFjayBhbGwgZGF0YSBhbmQgcmV0dXJuIHRvIHRoZSBJU1RBUlQKKwkJICogc3RhdGUuICBXaGVuIHRoZSB0YXJnZXQgcmVwb25kcyB0byBvdXIgQVROIGNvbmRpdGlvbiwKKwkJICogTFFJUEhBU0VfTFEgd2lsbCBiZSBhc3NlcnRlZC4gIFdlIHNob3VsZCByZXNwb25kIHRvCisJCSAqIHRoaXMgd2l0aCBhbiBMUUlSRVRSWSB0byBwcmVwYXJlIGZvciBhbnkgZnV0dXJlCisJCSAqIHBhY2tldHMuICBOT05QQUNLUkVRIHdpbGwgbm90IGJlIGFzc2VydGVkIGFnYWluCisJCSAqIG9uY2Ugd2UgaGl0IExRSVJFVFJZIHVudGlsIGFub3RoZXIgcGFja2V0IGlzCisJCSAqIHByb2Nlc3NlZC4gIFRoZSB0YXJnZXQgbWF5IGVpdGhlciBnbyBidXNmcmVlIG9yCisJCSAqIHN0YXJ0IGFub3RoZXIgcGFja2V0IGluIHJlc3BvbnNlIHRvIG91ciBtZXNzYWdlLgorCQkgKiBCdXNmcmVlIGRldGVjdGlvbiBpcyBlbmFibGVkLgorCQkgKgorCQkgKiBSZWFkIFN0cmVhbWluZyBQMCBub3QgYXNzZXJ0ZWQ6CisJCSAqIElmIHdlIHJhaXNlIEFUTiBhbmQgdGhlIHRhcmdldCB0cmFuc2l0aW9ucyB0bworCQkgKiBNU0dPVVQgaW4gb3IgYWZ0ZXIgYSBwYWNrZXQgd2hlcmUgUDAgaXMgbm90CisJCSAqIGFzc2VydGVkLCB0aGUgaGFyZHdhcmUgd2lsbCBhc3NlcnQgTFFJUEhBU0VfTkxRLgorCQkgKiBXZSBzaG91bGQgcmVzcG9uZCB0byB0aGUgTFFJUEhBU0VfTkxRIHdpdGggYW4KKwkJICogTFFJUkVUUlkuICBTaG91bGQgdGhlIHRhcmdldCBzdGF5IGluIGEgbm9uLXBrdAorCQkgKiBwaGFzZSBhZnRlciB3ZSBzZW5kIG91ciBtZXNzYWdlLCB0aGUgaGFyZHdhcmUKKwkJICogd2lsbCBhc3NlcnQgTFFJUEhBU0VfTFEuICBSZWNvdmVyeSBpcyB0aGVuIGp1c3QgYXMKKwkJICogbGlzdGVkIGFib3ZlIGZvciB0aGUgcmVhZCBzdHJlYW1pbmcgd2l0aCBQMCBhc3NlcnRlZC4KKwkJICogQnVzZnJlZSBkZXRlY3Rpb24gaXMgZW5hYmxlZC4KKwkJICovCisJCWlmIChzaWxlbnQgPT0gRkFMU0UpCisJCQlwcmludGYoIkxRSUNSQ19OTFFcbiIpOworCQlpZiAoc2NiID09IE5VTEwpIHsKKwkJCXByaW50ZigiJXM6IE5vIFNDQiB2YWxpZCBmb3IgTFFJQ1JDX05MUS4gICIKKwkJCSAgICAgICAiUmVzZXR0aW5nIGJ1c1xuIiwgYWhkX25hbWUoYWhkKSk7CisJCQlhaGRfcmVzZXRfY2hhbm5lbChhaGQsICdBJywgLypJbml0aWF0ZSBSZXNldCovVFJVRSk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgaWYgKChscWlzdGF0MSAmIExRSUJBRExRSSkgIT0gMCkgeworCQlwcmludGYoIk5lZWQgdG8gaGFuZGxlIEJBRExRSSFcbiIpOworCQlhaGRfcmVzZXRfY2hhbm5lbChhaGQsICdBJywgLypJbml0aWF0ZSBSZXNldCovVFJVRSk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKChwZXJyZGlhZyAmIChQQVJJVFlFUlJ8UFJFVlBIQVNFKSkgPT0gUEFSSVRZRVJSKSB7CisJCWlmICgoY3VycGhhc2UgJiB+UF9EQVRBSU5fRFQpICE9IDApIHsKKwkJCS8qIEFjayB0aGUgYnl0ZS4gIFNvIHdlIGNhbiBjb250aW51ZS4gKi8KKwkJCWlmIChzaWxlbnQgPT0gRkFMU0UpCisJCQkJcHJpbnRmKCJBY2tpbmcgJXMgdG8gY2xlYXIgcGVycm9yXG4iLAorCQkJCSAgICBhaGRfbG9va3VwX3BoYXNlX2VudHJ5KGN1cnBoYXNlKS0+cGhhc2Vtc2cpOworCQkJYWhkX2luYihhaGQsIFNDU0lEQVQpOworCQl9CisJCisJCWlmIChjdXJwaGFzZSA9PSBQX01FU0dJTikKKwkJCW1zZ19vdXQgPSBNU0dfUEFSSVRZX0VSUk9SOworCX0KKworCS8qCisJICogV2UndmUgc2V0IHRoZSBoYXJkd2FyZSB0byBhc3NlcnQgQVROIGlmIHdlIAorCSAqIGdldCBhIHBhcml0eSBlcnJvciBvbiAiaW4iIHBoYXNlcywgc28gYWxsIHdlCisJICogbmVlZCB0byBkbyBpcyBzdHVmZiB0aGUgbWVzc2FnZSBidWZmZXIgd2l0aAorCSAqIHRoZSBhcHByb3ByaWF0ZSBtZXNzYWdlLiAgIkluIiBwaGFzZXMgaGF2ZSBzZXQKKwkgKiBtZXNnX291dCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBNU0dfTk9QLgorCSAqLworCWFoZC0+c2VuZF9tc2dfcGVycm9yID0gbXNnX291dDsKKwlpZiAoc2NiICE9IE5VTEwgJiYgbXNnX291dCA9PSBNU0dfSU5JVElBVE9SX0RFVF9FUlIpCisJCXNjYi0+ZmxhZ3MgfD0gU0NCX1RSQU5TTUlTU0lPTl9FUlJPUjsKKwlhaGRfb3V0YihhaGQsIE1TR19PVVQsIEhPU1RfTVNHKTsKKwlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSU0NTSUlOVCk7CisJYWhkX3VucGF1c2UoYWhkKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9oYW5kbGVfbHFpcGhhc2VfZXJyb3Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBscWlzdGF0MSkKK3sKKwkvKgorCSAqIENsZWFyIHRoZSBzb3VyY2VzIG9mIHRoZSBpbnRlcnJ1cHRzLgorCSAqLworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKwlhaGRfb3V0YihhaGQsIENMUkxRSUlOVDEsIGxxaXN0YXQxKTsKKworCS8qCisJICogSWYgdGhlICJpbGxlZ2FsIiBwaGFzZSBjaGFuZ2VzIHdlcmUgaW4gcmVzcG9uc2UKKwkgKiB0byBvdXIgQVROIHRvIGZsYWcgYSBDUkMgZXJyb3IsIEFORCB3ZSBlbmRlZCB1cAorCSAqIG9uIHBhY2tldCBib3VuZGFyaWVzLCBjbGVhciB0aGUgZXJyb3IsIHJlc3RhcnQgdGhlCisJICogTFFJIG1hbmFnZXIgYXMgYXBwcm9wcmlhdGUsIGFuZCBnbyBvbiBvdXIgbWVycnkKKwkgKiB3YXkgdG93YXJkIHNlbmRpbmcgdGhlIG1lc3NhZ2UuICBPdGhlcndpc2UsIHJlc2V0CisJICogdGhlIGJ1cyB0byBjbGVhciB0aGUgZXJyb3IuCisJICovCisJYWhkX3NldF9hY3RpdmVfZmlmbyhhaGQpOworCWlmICgoYWhkX2luYihhaGQsIFNDU0lTSUdPKSAmIEFUTk8pICE9IDAKKwkgJiYgKGFoZF9pbmIoYWhkLCBNREZGU1RBVCkgJiBETFpFUk8pICE9IDApIHsKKwkJaWYgKChscWlzdGF0MSAmIExRSVBIQVNFX0xRKSAhPSAwKSB7CisJCQlwcmludGYoIkxRSVJFVFJZIGZvciBMUUlQSEFTRV9MUVxuIik7CisJCQlhaGRfb3V0YihhaGQsIExRQ1RMMiwgTFFJUkVUUlkpOworCQl9IGVsc2UgaWYgKChscWlzdGF0MSAmIExRSVBIQVNFX05MUSkgIT0gMCkgeworCQkJcHJpbnRmKCJMUUlSRVRSWSBmb3IgTFFJUEhBU0VfTkxRXG4iKTsKKwkJCWFoZF9vdXRiKGFoZCwgTFFDVEwyLCBMUUlSRVRSWSk7CisJCX0gZWxzZQorCQkJcGFuaWMoImFoZF9oYW5kbGVfbHFpcGhhc2VfZXJyb3I6IE5vIHBoYXNlIGVycm9yc1xuIik7CisJCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKKwkJYWhkX291dGIoYWhkLCBDTFJJTlQsIENMUlNDU0lJTlQpOworCQlhaGRfdW5wYXVzZShhaGQpOworCX0gZWxzZSB7CisJCXByaW50ZigiUmVzZXRpbmcgQ2hhbm5lbCBmb3IgTFFJIFBoYXNlIGVycm9yXG4iKTsKKwkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOworCQlhaGRfcmVzZXRfY2hhbm5lbChhaGQsICdBJywgLypJbml0aWF0ZSBSZXNldCovVFJVRSk7CisJfQorfQorCisvKgorICogUGFja2V0aXplZCB1bmV4cGVjdGVkIG9yIGV4cGVjdGVkIGJ1c2ZyZWUuCisgKiBFbnRlcmVkIGluIG1vZGUgYmFzZWQgb24gYnVzZnJlZXRpbWUuCisgKi8KK3N0YXRpYyBpbnQKK2FoZF9oYW5kbGVfcGt0X2J1c2ZyZWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBidXNmcmVldGltZSkKK3sKKwl1X2ludCBscW9zdGF0MTsKKworCUFIRF9BU1NFUlRfTU9ERVMoYWhkLCB+KEFIRF9NT0RFX1VOS05PV05fTVNLfEFIRF9NT0RFX0NGR19NU0spLAorCQkJIH4oQUhEX01PREVfVU5LTk9XTl9NU0t8QUhEX01PREVfQ0ZHX01TSykpOworCWxxb3N0YXQxID0gYWhkX2luYihhaGQsIExRT1NUQVQxKTsKKwlpZiAoKGxxb3N0YXQxICYgTFFPQlVTRlJFRSkgIT0gMCkgeworCQlzdHJ1Y3Qgc2NiICpzY2I7CisJCXVfaW50IHNjYmlkOworCQl1X2ludCBzYXZlZF9zY2JwdHI7CisJCXVfaW50IHdhaXRpbmdfaDsKKwkJdV9pbnQgd2FpdGluZ190OworCQl1X2ludCBuZXh0OworCisJCWlmICgoYnVzZnJlZXRpbWUgJiBCVVNGUkVFX0xRTykgPT0gMCkKKwkJCXByaW50ZigiJXM6IFdhcm5pbmcsIEJVU0ZSRUUgdGltZSBpcyAweCV4LiAgIgorCQkJICAgICAgICJFeHBlY3RlZCBCVVNGUkVFX0xRTy5cbiIsCisJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgYnVzZnJlZXRpbWUpOworCQkvKgorCQkgKiBUaGUgTFFPIG1hbmFnZXIgZGV0ZWN0ZWQgYW4gdW5leHBlY3RlZCBidXNmcmVlCisJCSAqIGVpdGhlcjoKKwkJICoKKwkJICogMSkgRHVyaW5nIGFuIG91dGdvaW5nIExRLgorCQkgKiAyKSBBZnRlciBhbiBvdXRnb2luZyBMUSBidXQgYmVmb3JlIHRoZSBmaXJzdAorCQkgKiAgICBSRVEgb2YgdGhlIGNvbW1hbmQgcGFja2V0LgorCQkgKiAzKSBEdXJpbmcgYW4gb3V0Z29pbmcgY29tbWFuZCBwYWNrZXQuCisJCSAqCisJCSAqIEluIGFsbCBjYXNlcywgQ1VSUlNDQiBpcyBwb2ludGluZyB0byB0aGUKKwkJICogU0NCIHRoYXQgZW5jb3VudGVyZWQgdGhlIGZhaWx1cmUuICBDbGVhbgorCQkgKiB1cCB0aGUgcXVldWUsIGNsZWFyIFNFTERPIGFuZCBMUU9CVVNGUkVFLAorCQkgKiBhbmQgYWxsb3cgdGhlIHNlcXVlbmNlciB0byByZXN0YXJ0IHRoZSBzZWxlY3QKKwkJICogb3V0IGF0IGl0cyBsZXN1cmUuCisJCSAqLworCQlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJCXNjYmlkID0gYWhkX2ludyhhaGQsIENVUlJTQ0IpOworCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwkJaWYgKHNjYiA9PSBOVUxMKQorCQkgICAgICAgcGFuaWMoIlNDQiBub3QgdmFsaWQgZHVyaW5nIExRT0JVU0ZSRUUiKTsKKwkJLyoKKwkJICogQ2xlYXIgdGhlIHN0YXR1cy4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgQ0xSTFFPSU5UMSwgQ0xSTFFPQlVTRlJFRSk7CisJCWlmICgoYWhkLT5idWdzICYgQUhEX0NMUkxRT19BVVRPQ0xSX0JVRykgIT0gMCkKKwkJCWFoZF9vdXRiKGFoZCwgQ0xSTFFPSU5UMSwgMCk7CisJCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTAsIGFoZF9pbmIoYWhkLCBTQ1NJU0VRMCkgJiB+RU5TRUxPKTsKKwkJYWhkX2ZsdXNoX2RldmljZV93cml0ZXMoYWhkKTsKKwkJYWhkX291dGIoYWhkLCBDTFJTSU5UMCwgQ0xSU0VMRE8pOworCisJCS8qCisJCSAqIFJldHVybiB0aGUgTFFPIG1hbmFnZXIgdG8gaXRzIGlkbGUgbG9vcC4gIEl0IHdpbGwKKwkJICogbm90IGRvIHRoaXMgYXV0b21hdGljYWxseSBpZiB0aGUgYnVzZnJlZSBvY2N1cnMKKwkJICogYWZ0ZXIgdGhlIGZpcnN0IFJFUSBvZiBlaXRoZXIgdGhlIExRIG9yIGNvbW1hbmQKKwkJICogcGFja2V0IG9yIGJldHdlZW4gdGhlIExRIGFuZCBjb21tYW5kIHBhY2tldC4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgTFFDVEwyLCBhaGRfaW5iKGFoZCwgTFFDVEwyKSB8IExRT1RPSURMRSk7CisKKwkJLyoKKwkJICogVXBkYXRlIHRoZSB3YWl0aW5nIGZvciBzZWxlY3Rpb24gcXVldWUgc28KKwkJICogd2UgcmVzdGFydCBvbiB0aGUgY29ycmVjdCBTQ0IuCisJCSAqLworCQl3YWl0aW5nX2ggPSBhaGRfaW53KGFoZCwgV0FJVElOR19USURfSEVBRCk7CisJCXNhdmVkX3NjYnB0ciA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJCWlmICh3YWl0aW5nX2ggIT0gc2NiaWQpIHsKKworCQkJYWhkX291dHcoYWhkLCBXQUlUSU5HX1RJRF9IRUFELCBzY2JpZCk7CisJCQl3YWl0aW5nX3QgPSBhaGRfaW53KGFoZCwgV0FJVElOR19USURfVEFJTCk7CisJCQlpZiAod2FpdGluZ190ID09IHdhaXRpbmdfaCkgeworCQkJCWFoZF9vdXR3KGFoZCwgV0FJVElOR19USURfVEFJTCwgc2NiaWQpOworCQkJCW5leHQgPSBTQ0JfTElTVF9OVUxMOworCQkJfSBlbHNlIHsKKwkJCQlhaGRfc2V0X3NjYnB0cihhaGQsIHdhaXRpbmdfaCk7CisJCQkJbmV4dCA9IGFoZF9pbndfc2NicmFtKGFoZCwgU0NCX05FWFQyKTsKKwkJCX0KKwkJCWFoZF9zZXRfc2NicHRyKGFoZCwgc2NiaWQpOworCQkJYWhkX291dHcoYWhkLCBTQ0JfTkVYVDIsIG5leHQpOworCQl9CisJCWFoZF9zZXRfc2NicHRyKGFoZCwgc2F2ZWRfc2NicHRyKTsKKwkJaWYgKHNjYi0+Y3JjX3JldHJ5X2NvdW50IDwgQUhEX01BWF9MUV9DUkNfRVJST1JTKSB7CisJCQlpZiAoU0NCX0lTX1NJTEVOVChzY2IpID09IEZBTFNFKSB7CisJCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQkJCXByaW50ZigiUHJvYmFibGUgb3V0Z29pbmcgTFEgQ1JDIGVycm9yLiAgIgorCQkJCSAgICAgICAiUmV0cnlpbmcgY29tbWFuZFxuIik7CisJCQl9CisJCQlzY2ItPmNyY19yZXRyeV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fVU5DT1JfUEFSSVRZKTsKKwkJCWFoZF9mcmVlemVfc2NiKHNjYik7CisJCQlhaGRfZnJlZXplX2RldnEoYWhkLCBzY2IpOworCQl9CisJCS8qIFJldHVybiB1bnBhdXNpbmcgdGhlIHNlcXVlbmNlci4gKi8KKwkJcmV0dXJuICgwKTsKKwl9IGVsc2UgaWYgKChhaGRfaW5iKGFoZCwgUEVSUkRJQUcpICYgUEFSSVRZRVJSKSAhPSAwKSB7CisJCS8qCisJCSAqIElnbm9yZSB3aGF0IGFyZSByZWFsbHkgcGFyaXR5IGVycm9ycyB0aGF0CisJCSAqIG9jY3VyIG9uIHRoZSBsYXN0IFJFUSBvZiBhIGZyZWUgcnVubmluZworCQkgKiBjbG9jayBwcmlvciB0byBnb2luZyBidXNmcmVlLiAgU29tZSBkcml2ZXMKKwkJICogZG8gbm90IHByb3Blcmx5IGFjdGl2ZSBuZWdhdGUganVzdCBiZWZvcmUKKwkJICogZ29pbmcgYnVzZnJlZSByZXN1bHRpbmcgaW4gYSBwYXJpdHkgZ2xpdGNoLgorCQkgKi8KKwkJYWhkX291dGIoYWhkLCBDTFJTSU5UMSwgQ0xSU0NTSVBFUlJ8Q0xSQlVTRlJFRSk7CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUFTS0VEX0VSUk9SUykgIT0gMCkKKwkJCXByaW50ZigiJXM6IFBhcml0eSBvbiBsYXN0IFJFUSBkZXRlY3RlZCAiCisJCQkgICAgICAgImR1cmluZyBidXNmcmVlIHBoYXNlLlxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpKTsKKyNlbmRpZgorCQkvKiBSZXR1cm4gdW5wYXVzaW5nIHRoZSBzZXF1ZW5jZXIuICovCisJCXJldHVybiAoMCk7CisJfQorCWlmIChhaGQtPnNyY19tb2RlICE9IEFIRF9NT0RFX1NDU0kpIHsKKwkJdV9pbnQJc2NiaWQ7CisJCXN0cnVjdAlzY2IgKnNjYjsKKworCQlzY2JpZCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOworCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCXByaW50ZigiVW5leHBlY3RlZCBQS1QgYnVzZnJlZSBjb25kaXRpb25cbiIpOworCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJCWFoZF9hYm9ydF9zY2JzKGFoZCwgU0NCX0dFVF9UQVJHRVQoYWhkLCBzY2IpLCAnQScsCisJCQkgICAgICAgU0NCX0dFVF9MVU4oc2NiKSwgU0NCX0dFVF9UQUcoc2NiKSwKKwkJCSAgICAgICBST0xFX0lOSVRJQVRPUiwgQ0FNX1VORVhQX0JVU0ZSRUUpOworCisJCS8qIFJldHVybiByZXN0YXJ0aW5nIHRoZSBzZXF1ZW5jZXIuICovCisJCXJldHVybiAoMSk7CisJfQorCXByaW50ZigiJXM6IFVuZXhwZWN0ZWQgUEtUIGJ1c2ZyZWUgY29uZGl0aW9uXG4iLCBhaGRfbmFtZShhaGQpKTsKKwlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJLyogUmVzdGFydCB0aGUgc2VxdWVuY2VyLiAqLworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBOb24tcGFja2V0aXplZCB1bmV4cGVjdGVkIG9yIGV4cGVjdGVkIGJ1c2ZyZWUuCisgKi8KK3N0YXRpYyBpbnQKK2FoZF9oYW5kbGVfbm9ucGt0X2J1c2ZyZWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXN0cnVjdAlhaGRfZGV2aW5mbyBkZXZpbmZvOworCXN0cnVjdAlzY2IgKnNjYjsKKwl1X2ludAlsYXN0cGhhc2U7CisJdV9pbnQJc2F2ZWRfc2NzaWlkOworCXVfaW50CXNhdmVkX2x1bjsKKwl1X2ludAl0YXJnZXQ7CisJdV9pbnQJaW5pdGlhdG9yX3JvbGVfaWQ7CisJdV9pbnQJc2NiaWQ7CisJdV9pbnQJcHByX2J1c2ZyZWU7CisJaW50CXByaW50ZXJyb3I7CisKKwkvKgorCSAqIExvb2sgYXQgd2hhdCBwaGFzZSB3ZSB3ZXJlIGxhc3QgaW4uICBJZiBpdHMgbWVzc2FnZSBvdXQsCisJICogY2hhbmNlcyBhcmUgcHJldHR5IGdvb2QgdGhhdCB0aGUgYnVzZnJlZSB3YXMgaW4gcmVzcG9uc2UKKwkgKiB0byBvbmUgb2Ygb3VyIGFib3J0IHJlcXVlc3RzLgorCSAqLworCWxhc3RwaGFzZSA9IGFoZF9pbmIoYWhkLCBMQVNUUEhBU0UpOworCXNhdmVkX3Njc2lpZCA9IGFoZF9pbmIoYWhkLCBTQVZFRF9TQ1NJSUQpOworCXNhdmVkX2x1biA9IGFoZF9pbmIoYWhkLCBTQVZFRF9MVU4pOworCXRhcmdldCA9IFNDU0lJRF9UQVJHRVQoYWhkLCBzYXZlZF9zY3NpaWQpOworCWluaXRpYXRvcl9yb2xlX2lkID0gU0NTSUlEX09VUl9JRChzYXZlZF9zY3NpaWQpOworCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIGluaXRpYXRvcl9yb2xlX2lkLAorCQkJICAgIHRhcmdldCwgc2F2ZWRfbHVuLCAnQScsIFJPTEVfSU5JVElBVE9SKTsKKwlwcmludGVycm9yID0gMTsKKworCXNjYmlkID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwlpZiAoc2NiICE9IE5VTEwKKwkgJiYgKGFoZF9pbmIoYWhkLCBTRVFfRkxBR1MpICYgTk9UX0lERU5USUZJRUQpICE9IDApCisJCXNjYiA9IE5VTEw7CisKKwlwcHJfYnVzZnJlZSA9IChhaGQtPm1zZ19mbGFncyAmIE1TR19GTEFHX0VYUEVDVF9QUFJfQlVTRlJFRSkgIT0gMDsKKwlpZiAobGFzdHBoYXNlID09IFBfTUVTR09VVCkgeworCQl1X2ludCB0YWc7CisKKwkJdGFnID0gU0NCX0xJU1RfTlVMTDsKKwkJaWYgKGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR18xQiwgTVNHX0FCT1JUX1RBRywgVFJVRSkKKwkJIHx8IGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR18xQiwgTVNHX0FCT1JULCBUUlVFKSkgeworCQkJaW50IGZvdW5kOworCQkJaW50IHNlbnRfbXNnOworCisJCQlpZiAoc2NiID09IE5VTEwpIHsKKwkJCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsICZkZXZpbmZvKTsKKwkJCQlwcmludGYoIkFib3J0IGZvciB1bmlkZW50aWZpZWQgIgorCQkJCSAgICAgICAiY29ubmVjdGlvbiBjb21wbGV0ZWQuXG4iKTsKKwkJCQkvKiByZXN0YXJ0IHRoZSBzZXF1ZW5jZXIuICovCisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJCXNlbnRfbXNnID0gYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4IC0gMV07CisJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQlwcmludGYoIlNDQiAlZCAtIEFib3J0JXMgQ29tcGxldGVkLlxuIiwKKwkJCSAgICAgICBTQ0JfR0VUX1RBRyhzY2IpLAorCQkJICAgICAgIHNlbnRfbXNnID09IE1TR19BQk9SVF9UQUcgPyAiIiA6ICIgVGFnIik7CisKKwkJCWlmIChzZW50X21zZyA9PSBNU0dfQUJPUlRfVEFHKQorCQkJCXRhZyA9IFNDQl9HRVRfVEFHKHNjYik7CisKKwkJCWlmICgoc2NiLT5mbGFncyAmIFNDQl9DTURQSEFTRV9BQk9SVCkgIT0gMCkgeworCQkJCS8qCisJCQkJICogVGhpcyBhYm9ydCBpcyBpbiByZXNwb25zZSB0byBhbgorCQkJCSAqIHVuZXhwZWN0ZWQgc3dpdGNoIHRvIGNvbW1hbmQgcGhhc2UKKwkJCQkgKiBmb3IgYSBwYWNrZXRpemVkIGNvbm5lY3Rpb24uICBTaW5jZQorCQkJCSAqIHRoZSBpZGVudGlmeSBtZXNzYWdlIHdhcyBuZXZlciBzZW50LAorCQkJCSAqICJzYXZlZCBsdW4iIGlzIDAuICBXZSByZWFsbHkgd2FudCB0bworCQkJCSAqIGFib3J0IG9ubHkgdGhlIFNDQiB0aGF0IGVuY291bnRlcmVkCisJCQkJICogdGhpcyBlcnJvciwgd2hpY2ggY291bGQgaGF2ZSBhIGRpZmZlcmVudAorCQkJCSAqIGx1bi4gIFRoZSBTQ0Igd2lsbCBiZSByZXRyaWVkIHNvIHRoZSBPUworCQkJCSAqIHdpbGwgc2VlIHRoZSBVQSBhZnRlciByZW5lZ290aWF0aW5nIHRvCisJCQkJICogcGFja2V0aXplZC4KKwkJCQkgKi8KKwkJCQl0YWcgPSBTQ0JfR0VUX1RBRyhzY2IpOworCQkJCXNhdmVkX2x1biA9IHNjYi0+aHNjYi0+bHVuOworCQkJfQorCQkJZm91bmQgPSBhaGRfYWJvcnRfc2NicyhhaGQsIHRhcmdldCwgJ0EnLCBzYXZlZF9sdW4sCisJCQkJCSAgICAgICB0YWcsIFJPTEVfSU5JVElBVE9SLAorCQkJCQkgICAgICAgQ0FNX1JFUV9BQk9SVEVEKTsKKwkJCXByaW50ZigiZm91bmQgPT0gMHgleFxuIiwgZm91bmQpOworCQkJcHJpbnRlcnJvciA9IDA7CisJCX0gZWxzZSBpZiAoYWhkX3NlbnRfbXNnKGFoZCwgQUhETVNHXzFCLAorCQkJCQlNU0dfQlVTX0RFVl9SRVNFVCwgVFJVRSkpIHsKKyNpZmRlZiBfX0ZyZWVCU0RfXworCQkJLyoKKwkJCSAqIERvbid0IG1hcmsgdGhlIHVzZXIncyByZXF1ZXN0IGZvciB0aGlzIEJEUgorCQkJICogYXMgY29tcGxldGluZyB3aXRoIENBTV9CRFJfU0VOVC4gIENBTTMKKwkJCSAqIHNwZWNpZmllcyBDQU1fUkVRX0NNUC4KKwkJCSAqLworCQkJaWYgKHNjYiAhPSBOVUxMCisJCQkgJiYgc2NiLT5pb19jdHgtPmNjYl9oLmZ1bmNfY29kZT09IFhQVF9SRVNFVF9ERVYKKwkJCSAmJiBhaGRfbWF0Y2hfc2NiKGFoZCwgc2NiLCB0YXJnZXQsICdBJywKKwkJCQkJICBDQU1fTFVOX1dJTERDQVJELCBTQ0JfTElTVF9OVUxMLAorCQkJCQkgIFJPTEVfSU5JVElBVE9SKSkKKwkJCQlhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9SRVFfQ01QKTsKKyNlbmRpZgorCQkJYWhkX2hhbmRsZV9kZXZyZXNldChhaGQsICZkZXZpbmZvLCBDQU1fTFVOX1dJTERDQVJELAorCQkJCQkgICAgQ0FNX0JEUl9TRU5ULCAiQnVzIERldmljZSBSZXNldCIsCisJCQkJCSAgICAvKnZlcmJvc2VfbGV2ZWwqLzApOworCQkJcHJpbnRlcnJvciA9IDA7CisJCX0gZWxzZSBpZiAoYWhkX3NlbnRfbXNnKGFoZCwgQUhETVNHX0VYVCwgTVNHX0VYVF9QUFIsIEZBTFNFKQorCQkJJiYgcHByX2J1c2ZyZWUgPT0gMCkgeworCQkJc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQkJc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKworCQkJLyoKKwkJCSAqIFBQUiBSZWplY3RlZC4gIFRyeSBub24tcHByIG5lZ290aWF0aW9uCisJCQkgKiBhbmQgcmV0cnkgY29tbWFuZC4KKwkJCSAqLworI2lmZGVmIEFIRF9ERUJVRworCQkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NRVNTQUdFUykgIT0gMCkKKwkJCQlwcmludGYoIlBQUiBuZWdvdGlhdGlvbiByZWplY3RlZCBidXNmcmVlLlxuIik7CisjZW5kaWYKKwkJCXRpbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsIGRldmluZm8uY2hhbm5lbCwKKwkJCQkJCSAgICBkZXZpbmZvLm91cl9zY3NpaWQsCisJCQkJCQkgICAgZGV2aW5mby50YXJnZXQsICZ0c3RhdGUpOworCQkJdGluZm8tPmN1cnIudHJhbnNwb3J0X3ZlcnNpb24gPSAyOworCQkJdGluZm8tPmdvYWwudHJhbnNwb3J0X3ZlcnNpb24gPSAyOworCQkJdGluZm8tPmdvYWwucHByX29wdGlvbnMgPSAwOworCQkJYWhkX3FpbmZpZm9fcmVxdWV1ZV90YWlsKGFoZCwgc2NiKTsKKwkJCXByaW50ZXJyb3IgPSAwOworCQl9IGVsc2UgaWYgKGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR19FWFQsIE1TR19FWFRfV0RUUiwgRkFMU0UpCisJCQkmJiBwcHJfYnVzZnJlZSA9PSAwKSB7CisJCQkvKgorCQkJICogTmVnb3RpYXRpb24gUmVqZWN0ZWQuICBHby1uYXJyb3cgYW5kCisJCQkgKiByZXRyeSBjb21tYW5kLgorCQkJICovCisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKQorCQkJCXByaW50ZigiV0RUUiBuZWdvdGlhdGlvbiByZWplY3RlZCBidXNmcmVlLlxuIik7CisjZW5kaWYKKwkJCWFoZF9zZXRfd2lkdGgoYWhkLCAmZGV2aW5mbywKKwkJCQkgICAgICBNU0dfRVhUX1dEVFJfQlVTXzhfQklULAorCQkJCSAgICAgIEFIRF9UUkFOU19DVVJ8QUhEX1RSQU5TX0dPQUwsCisJCQkJICAgICAgLypwYXVzZWQqL1RSVUUpOworCQkJYWhkX3FpbmZpZm9fcmVxdWV1ZV90YWlsKGFoZCwgc2NiKTsKKwkJCXByaW50ZXJyb3IgPSAwOworCQl9IGVsc2UgaWYgKGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR19FWFQsIE1TR19FWFRfU0RUUiwgRkFMU0UpCisJCQkmJiBwcHJfYnVzZnJlZSA9PSAwKSB7CisJCQkvKgorCQkJICogTmVnb3RpYXRpb24gUmVqZWN0ZWQuICBHby1hc3luYyBhbmQKKwkJCSAqIHJldHJ5IGNvbW1hbmQuCisJCQkgKi8KKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApCisJCQkJcHJpbnRmKCJTRFRSIG5lZ290aWF0aW9uIHJlamVjdGVkIGJ1c2ZyZWUuXG4iKTsKKyNlbmRpZgorCQkJYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLAorCQkJCQkvKnBlcmlvZCovMCwgLypvZmZzZXQqLzAsCisJCQkJCS8qcHByX29wdGlvbnMqLzAsCisJCQkJCUFIRF9UUkFOU19DVVJ8QUhEX1RSQU5TX0dPQUwsCisJCQkJCS8qcGF1c2VkKi9UUlVFKTsKKwkJCWFoZF9xaW5maWZvX3JlcXVldWVfdGFpbChhaGQsIHNjYik7CisJCQlwcmludGVycm9yID0gMDsKKwkJfSBlbHNlIGlmICgoYWhkLT5tc2dfZmxhZ3MgJiBNU0dfRkxBR19FWFBFQ1RfSURFX0JVU0ZSRUUpICE9IDAKKwkJCSYmIGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR18xQiwKKwkJCQkJIE1TR19JTklUSUFUT1JfREVUX0VSUiwgVFJVRSkpIHsKKworI2lmZGVmIEFIRF9ERUJVRworCQkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NRVNTQUdFUykgIT0gMCkKKwkJCQlwcmludGYoIkV4cGVjdGVkIElERSBCdXNmcmVlXG4iKTsKKyNlbmRpZgorCQkJcHJpbnRlcnJvciA9IDA7CisJCX0gZWxzZSBpZiAoKGFoZC0+bXNnX2ZsYWdzICYgTVNHX0ZMQUdfRVhQRUNUX1FBU1JFSl9CVVNGUkVFKQorCQkJJiYgYWhkX3NlbnRfbXNnKGFoZCwgQUhETVNHXzFCLAorCQkJCQlNU0dfTUVTU0FHRV9SRUpFQ1QsIFRSVUUpKSB7CisKKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApCisJCQkJcHJpbnRmKCJFeHBlY3RlZCBRQVMgUmVqZWN0IEJ1c2ZyZWVcbiIpOworI2VuZGlmCisJCQlwcmludGVycm9yID0gMDsKKwkJfQorCX0KKworCS8qCisJICogVGhlIGJ1c2ZyZWUgcmVxdWlyZWQgZmxhZyBpcyBob25vcmVkIGF0IHRoZSBlbmQgb2YKKwkgKiB0aGUgbWVzc2FnZSBwaGFzZXMuICBXZSBjaGVjayBpdCBsYXN0IGluIGNhc2Ugd2UKKwkgKiBoYWQgdG8gc2VuZCBzb21lIG90aGVyIG1lc3NhZ2UgdGhhdCBjYXVzZWQgYSBidXNmcmVlLgorCSAqLworCWlmIChwcmludGVycm9yICE9IDAKKwkgJiYgKGxhc3RwaGFzZSA9PSBQX01FU0dJTiB8fCBsYXN0cGhhc2UgPT0gUF9NRVNHT1VUKQorCSAmJiAoKGFoZC0+bXNnX2ZsYWdzICYgTVNHX0ZMQUdfRVhQRUNUX1BQUl9CVVNGUkVFKSAhPSAwKSkgeworCisJCWFoZF9mcmVlemVfZGV2cShhaGQsIHNjYik7CisJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX1JFUVVFVUVfUkVRKTsKKwkJYWhkX2ZyZWV6ZV9zY2Ioc2NiKTsKKwkJaWYgKChhaGQtPm1zZ19mbGFncyAmIE1TR19GTEFHX0lVX1JFUV9DSEFOR0VEKSAhPSAwKSB7CisJCQlhaGRfYWJvcnRfc2NicyhhaGQsIFNDQl9HRVRfVEFSR0VUKGFoZCwgc2NiKSwKKwkJCQkgICAgICAgU0NCX0dFVF9DSEFOTkVMKGFoZCwgc2NiKSwKKwkJCQkgICAgICAgU0NCX0dFVF9MVU4oc2NiKSwgU0NCX0xJU1RfTlVMTCwKKwkJCQkgICAgICAgUk9MRV9JTklUSUFUT1IsIENBTV9SRVFfQUJPUlRFRCk7CisJCX0gZWxzZSB7CisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKQorCQkJCXByaW50ZigiUFBSIE5lZ290aWF0aW9uIEJ1c2ZyZWUuXG4iKTsKKyNlbmRpZgorCQkJYWhkX2RvbmUoYWhkLCBzY2IpOworCQl9CisJCXByaW50ZXJyb3IgPSAwOworCX0KKwlpZiAocHJpbnRlcnJvciAhPSAwKSB7CisJCWludCBhYm9ydGVkOworCisJCWFib3J0ZWQgPSAwOworCQlpZiAoc2NiICE9IE5VTEwpIHsKKwkJCXVfaW50IHRhZzsKKworCQkJaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiBUQUdfRU5CKSAhPSAwKQorCQkJCXRhZyA9IFNDQl9HRVRfVEFHKHNjYik7CisJCQllbHNlCisJCQkJdGFnID0gU0NCX0xJU1RfTlVMTDsKKwkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJCWFib3J0ZWQgPSBhaGRfYWJvcnRfc2NicyhhaGQsIHRhcmdldCwgJ0EnLAorCQkJCSAgICAgICBTQ0JfR0VUX0xVTihzY2IpLCB0YWcsCisJCQkJICAgICAgIFJPTEVfSU5JVElBVE9SLAorCQkJCSAgICAgICBDQU1fVU5FWFBfQlVTRlJFRSk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2UgaGFkIG5vdCBmdWxseSBpZGVudGlmaWVkIHRoaXMgY29ubmVjdGlvbiwKKwkJCSAqIHNvIHdlIGNhbm5vdCBhYm9ydCBhbnl0aGluZy4KKwkJCSAqLworCQkJcHJpbnRmKCIlczogIiwgYWhkX25hbWUoYWhkKSk7CisJCX0KKwkJaWYgKGxhc3RwaGFzZSAhPSBQX0JVU0ZSRUUpCisJCQlhaGRfZm9yY2VfcmVuZWdvdGlhdGlvbihhaGQsICZkZXZpbmZvKTsKKwkJcHJpbnRmKCJVbmV4cGVjdGVkIGJ1c2ZyZWUgJXMsICVkIFNDQnMgYWJvcnRlZCwgIgorCQkgICAgICAgIlBSR01DTlQgPT0gMHgleFxuIiwKKwkJICAgICAgIGFoZF9sb29rdXBfcGhhc2VfZW50cnkobGFzdHBoYXNlKS0+cGhhc2Vtc2csCisJCSAgICAgICBhYm9ydGVkLAorCQkgICAgICAgYWhkX2luYihhaGQsIFBSR01DTlQpCisJCQl8IChhaGRfaW5iKGFoZCwgUFJHTUNOVCsxKSA8PCA4KSk7CisJCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKKwl9CisJLyogQWx3YXlzIHJlc3RhcnQgdGhlIHNlcXVlbmNlci4gKi8KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgdm9pZAorYWhkX2hhbmRsZV9wcm90b192aW9sYXRpb24oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXN0cnVjdAlhaGRfZGV2aW5mbyBkZXZpbmZvOworCXN0cnVjdAlzY2IgKnNjYjsKKwl1X2ludAlzY2JpZDsKKwl1X2ludAlzZXFfZmxhZ3M7CisJdV9pbnQJY3VycGhhc2U7CisJdV9pbnQJbGFzdHBoYXNlOworCWludAlmb3VuZDsKKworCWFoZF9mZXRjaF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOworCXNjYmlkID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwlzZXFfZmxhZ3MgPSBhaGRfaW5iKGFoZCwgU0VRX0ZMQUdTKTsKKwljdXJwaGFzZSA9IGFoZF9pbmIoYWhkLCBTQ1NJU0lHSSkgJiBQSEFTRV9NQVNLOworCWxhc3RwaGFzZSA9IGFoZF9pbmIoYWhkLCBMQVNUUEhBU0UpOworCWlmICgoc2VxX2ZsYWdzICYgTk9UX0lERU5USUZJRUQpICE9IDApIHsKKworCQkvKgorCQkgKiBUaGUgcmVjb25uZWN0aW5nIHRhcmdldCBlaXRoZXIgZGlkIG5vdCBzZW5kIGFuCisJCSAqIGlkZW50aWZ5IG1lc3NhZ2UsIG9yIGRpZCwgYnV0IHdlIGRpZG4ndCBmaW5kIGFuIFNDQgorCQkgKiB0byBtYXRjaC4KKwkJICovCisJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOworCQlwcmludGYoIlRhcmdldCBkaWQgbm90IHNlbmQgYW4gSURFTlRJRlkgbWVzc2FnZS4gIgorCQkgICAgICAgIkxBU1RQSEFTRSA9IDB4JXguXG4iLCBsYXN0cGhhc2UpOworCQlzY2IgPSBOVUxMOworCX0gZWxzZSBpZiAoc2NiID09IE5VTEwpIHsKKwkJLyoKKwkJICogV2UgZG9uJ3Qgc2VlbSB0byBoYXZlIGFuIFNDQiBhY3RpdmUgZm9yIHRoaXMKKwkJICogdHJhbnNhY3Rpb24uICBQcmludCBhbiBlcnJvciBhbmQgcmVzZXQgdGhlIGJ1cy4KKwkJICovCisJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOworCQlwcmludGYoIk5vIFNDQiBmb3VuZCBkdXJpbmcgcHJvdG9jb2wgdmlvbGF0aW9uXG4iKTsKKwkJZ290byBwcm90b192aW9sYXRpb25fcmVzZXQ7CisJfSBlbHNlIHsKKwkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fU0VRVUVOQ0VfRkFJTCk7CisJCWlmICgoc2VxX2ZsYWdzICYgTk9fQ0RCX1NFTlQpICE9IDApIHsKKwkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJCXByaW50ZigiTm8gb3IgaW5jb21wbGV0ZSBDREIgc2VudCB0byBkZXZpY2UuXG4iKTsKKwkJfSBlbHNlIGlmICgoYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQ09OVFJPTCkKKwkJCSAgJiBTVEFUVVNfUkNWRCkgPT0gMCkgeworCQkJLyoKKwkJCSAqIFRoZSB0YXJnZXQgbmV2ZXIgYm90aGVyZWQgdG8gcHJvdmlkZSBzdGF0dXMgdG8KKwkJCSAqIHVzIHByaW9yIHRvIGNvbXBsZXRpbmcgdGhlIGNvbW1hbmQuICBTaW5jZSB3ZSBkb24ndAorCQkJICoga25vdyB0aGUgZGlzcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kLCB3ZSBtdXN0IGF0dGVtcHQKKwkJCSAqIHRvIGFib3J0IGl0LiAgQXNzZXJ0IEFUTiBhbmQgcHJlcGFyZSB0byBzZW5kIGFuIGFib3J0CisJCQkgKiBtZXNzYWdlLgorCQkJICovCisJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQlwcmludGYoIkNvbXBsZXRlZCBjb21tYW5kIHdpdGhvdXQgc3RhdHVzLlxuIik7CisJCX0gZWxzZSB7CisJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQlwcmludGYoIlVua25vd24gcHJvdG9jb2wgdmlvbGF0aW9uLlxuIik7CisJCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJCX0KKwl9CisJaWYgKChsYXN0cGhhc2UgJiB+UF9EQVRBSU5fRFQpID09IDAKKwkgfHwgbGFzdHBoYXNlID09IFBfQ09NTUFORCkgeworcHJvdG9fdmlvbGF0aW9uX3Jlc2V0OgorCQkvKgorCQkgKiBUYXJnZXQgZWl0aGVyIHdlbnQgZGlyZWN0bHkgdG8gZGF0YQorCQkgKiBwaGFzZSBvciBkaWRuJ3QgcmVzcG9uZCB0byBvdXIgQVROLgorCQkgKiBUaGUgb25seSBzYWZlIHRoaW5nIHRvIGRvIGlzIHRvIGJsb3cKKwkJICogaXQgYXdheSB3aXRoIGEgYnVzIHJlc2V0LgorCQkgKi8KKwkJZm91bmQgPSBhaGRfcmVzZXRfY2hhbm5lbChhaGQsICdBJywgVFJVRSk7CisJCXByaW50ZigiJXM6IElzc3VlZCBDaGFubmVsICVjIEJ1cyBSZXNldC4gIgorCQkgICAgICAgIiVkIFNDQnMgYWJvcnRlZFxuIiwgYWhkX25hbWUoYWhkKSwgJ0EnLCBmb3VuZCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTGVhdmUgdGhlIHNlbGVjdGlvbiBoYXJkd2FyZSBvZmYgaW4gY2FzZQorCQkgKiB0aGlzIGFib3J0IGF0dGVtcHQgd2lsbCBhZmZlY3QgeWV0IHRvCisJCSAqIGJlIHNlbnQgY29tbWFuZHMuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIFNDU0lTRVEwLAorCQkJIGFoZF9pbmIoYWhkLCBTQ1NJU0VRMCkgJiB+RU5TRUxPKTsKKwkJYWhkX2Fzc2VydF9hdG4oYWhkKTsKKwkJYWhkX291dGIoYWhkLCBNU0dfT1VULCBIT1NUX01TRyk7CisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCAmZGV2aW5mbyk7CisJCQlhaGQtPm1zZ291dF9idWZbMF0gPSBNU0dfQUJPUlRfVEFTSzsKKwkJCWFoZC0+bXNnb3V0X2xlbiA9IDE7CisJCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCQlhaGQtPm1zZ190eXBlID0gTVNHX1RZUEVfSU5JVElBVE9SX01TR09VVDsKKwkJfSBlbHNlIHsKKwkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJCXNjYi0+ZmxhZ3MgfD0gU0NCX0FCT1JUOworCQl9CisJCXByaW50ZigiUHJvdG9jb2wgdmlvbGF0aW9uICVzLiAgQXR0ZW1wdGluZyB0byBhYm9ydC5cbiIsCisJCSAgICAgICBhaGRfbG9va3VwX3BoYXNlX2VudHJ5KGN1cnBoYXNlKS0+cGhhc2Vtc2cpOworCX0KK30KKworLyoKKyAqIEZvcmNlIHJlbmVnb3RpYXRpb24gdG8gb2NjdXIgdGhlIG5leHQgdGltZSB3ZSBpbml0aWF0ZQorICogYSBjb21tYW5kIHRvIHRoZSBjdXJyZW50IGRldmljZS4KKyAqLworc3RhdGljIHZvaWQKK2FoZF9mb3JjZV9yZW5lZ290aWF0aW9uKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKQoreworCXN0cnVjdAlhaGRfaW5pdGlhdG9yX3RpbmZvICp0YXJnX2luZm87CisJc3RydWN0CWFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKworI2lmZGVmIEFIRF9ERUJVRworCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApIHsKKwkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKKwkJcHJpbnRmKCJGb3JjaW5nIHJlbmVnb3RpYXRpb25cbiIpOworCX0KKyNlbmRpZgorCXRhcmdfaW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLAorCQkJCQlkZXZpbmZvLT5jaGFubmVsLAorCQkJCQlkZXZpbmZvLT5vdXJfc2NzaWlkLAorCQkJCQlkZXZpbmZvLT50YXJnZXQsCisJCQkJCSZ0c3RhdGUpOworCWFoZF91cGRhdGVfbmVnX3JlcXVlc3QoYWhkLCBkZXZpbmZvLCB0c3RhdGUsCisJCQkgICAgICAgdGFyZ19pbmZvLCBBSERfTkVHX0lGX05PTl9BU1lOQyk7Cit9CisKKyNkZWZpbmUgQUhEX01BWF9TVEVQUyAyMDAwCit2b2lkCithaGRfY2xlYXJfY3JpdGljYWxfc2VjdGlvbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJYWhkX21vZGVfc3RhdGUJc2F2ZWRfbW9kZXM7CisJaW50CQlzdGVwcGluZzsKKwlpbnQJCXN0ZXBzOworCWludAkJZmlyc3RfaW5zdHI7CisJdV9pbnQJCXNpbW9kZTA7CisJdV9pbnQJCXNpbW9kZTE7CisJdV9pbnQJCXNpbW9kZTM7CisJdV9pbnQJCWxxaW1vZGUwOworCXVfaW50CQlscWltb2RlMTsKKwl1X2ludAkJbHFvbW9kZTA7CisJdV9pbnQJCWxxb21vZGUxOworCisJaWYgKGFoZC0+bnVtX2NyaXRpY2FsX3NlY3Rpb25zID09IDApCisJCXJldHVybjsKKworCXN0ZXBwaW5nID0gRkFMU0U7CisJc3RlcHMgPSAwOworCWZpcnN0X2luc3RyID0gMDsKKwlzaW1vZGUwID0gMDsKKwlzaW1vZGUxID0gMDsKKwlzaW1vZGUzID0gMDsKKwlscWltb2RlMCA9IDA7CisJbHFpbW9kZTEgPSAwOworCWxxb21vZGUwID0gMDsKKwlscW9tb2RlMSA9IDA7CisJc2F2ZWRfbW9kZXMgPSBhaGRfc2F2ZV9tb2RlcyhhaGQpOworCWZvciAoOzspIHsKKwkJc3RydWN0CWNzICpjczsKKwkJdV9pbnQJc2VxYWRkcjsKKwkJdV9pbnQJaTsKKworCQlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJCXNlcWFkZHIgPSBhaGRfaW5iKGFoZCwgQ1VSQUREUikKKwkJCXwgKGFoZF9pbmIoYWhkLCBDVVJBRERSKzEpIDw8IDgpOworCisJCWNzID0gYWhkLT5jcml0aWNhbF9zZWN0aW9uczsKKwkJZm9yIChpID0gMDsgaSA8IGFoZC0+bnVtX2NyaXRpY2FsX3NlY3Rpb25zOyBpKyssIGNzKyspIHsKKwkJCQorCQkJaWYgKGNzLT5iZWdpbiA8IHNlcWFkZHIgJiYgY3MtPmVuZCA+PSBzZXFhZGRyKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gYWhkLT5udW1fY3JpdGljYWxfc2VjdGlvbnMpCisJCQlicmVhazsKKworCQlpZiAoc3RlcHMgPiBBSERfTUFYX1NURVBTKSB7CisJCQlwcmludGYoIiVzOiBJbmZpbml0ZSBsb29wIGluIGNyaXRpY2FsIHNlY3Rpb25cbiIKKwkJCSAgICAgICAiJXM6IEZpcnN0IEluc3RydWN0aW9uIDB4JXggbm93IDB4JXhcbiIsCisJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgYWhkX25hbWUoYWhkKSwgZmlyc3RfaW5zdHIsCisJCQkgICAgICAgc2VxYWRkcik7CisJCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJCQlwYW5pYygiY3JpdGljYWwgc2VjdGlvbiBsb29wIik7CisJCX0KKworCQlzdGVwcysrOworI2lmZGVmIEFIRF9ERUJVRworCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01JU0MpICE9IDApCisJCQlwcmludGYoIiVzOiBTaW5nbGUgc3RlcHBpbmcgYXQgMHgleFxuIiwgYWhkX25hbWUoYWhkKSwKKwkJCSAgICAgICBzZXFhZGRyKTsKKyNlbmRpZgorCQlpZiAoc3RlcHBpbmcgPT0gRkFMU0UpIHsKKworCQkJZmlyc3RfaW5zdHIgPSBzZXFhZGRyOworICAJCQlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfQ0ZHLCBBSERfTU9ERV9DRkcpOworICAJCQlzaW1vZGUwID0gYWhkX2luYihhaGQsIFNJTU9ERTApOworCQkJc2ltb2RlMyA9IGFoZF9pbmIoYWhkLCBTSU1PREUzKTsKKwkJCWxxaW1vZGUwID0gYWhkX2luYihhaGQsIExRSU1PREUwKTsKKwkJCWxxaW1vZGUxID0gYWhkX2luYihhaGQsIExRSU1PREUxKTsKKwkJCWxxb21vZGUwID0gYWhkX2luYihhaGQsIExRT01PREUwKTsKKwkJCWxxb21vZGUxID0gYWhkX2luYihhaGQsIExRT01PREUxKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0lNT0RFMCwgMCk7CisJCQlhaGRfb3V0YihhaGQsIFNJTU9ERTMsIDApOworCQkJYWhkX291dGIoYWhkLCBMUUlNT0RFMCwgMCk7CisJCQlhaGRfb3V0YihhaGQsIExRSU1PREUxLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgTFFPTU9ERTAsIDApOworCQkJYWhkX291dGIoYWhkLCBMUU9NT0RFMSwgMCk7CisJCQlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJCQlzaW1vZGUxID0gYWhkX2luYihhaGQsIFNJTU9ERTEpOworCQkJLyoKKwkJCSAqIFdlIGRvbid0IGNsZWFyIEVOQlVTRlJFRS4gIFVuZm9ydHVuYXRlbHkKKwkJCSAqIHdlIGNhbm5vdCByZS1lbmFibGUgYnVzZnJlZSBkZXRlY3Rpb24gd2l0aGluCisJCQkgKiB0aGUgY3VycmVudCBjb25uZWN0aW9uLCBzbyB3ZSBtdXN0IGxlYXZlIGl0CisJCQkgKiBvbiB3aGlsZSBzaW5nbGUgc3RlcHBpbmcuCisJCQkgKi8KKwkJCWFoZF9vdXRiKGFoZCwgU0lNT0RFMSwgc2ltb2RlMSAmIEVOQlVTRlJFRSk7CisJCQlhaGRfb3V0YihhaGQsIFNFUUNUTDAsIGFoZF9pbmIoYWhkLCBTRVFDVEwwKSB8IFNURVApOworCQkJc3RlcHBpbmcgPSBUUlVFOworCQl9CisJCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDEsIENMUkJVU0ZSRUUpOworCQlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSU0NTSUlOVCk7CisJCWFoZF9zZXRfbW9kZXMoYWhkLCBhaGQtPnNhdmVkX3NyY19tb2RlLCBhaGQtPnNhdmVkX2RzdF9tb2RlKTsKKwkJYWhkX291dGIoYWhkLCBIQ05UUkwsIGFoZC0+dW5wYXVzZSk7CisJCXdoaWxlICghYWhkX2lzX3BhdXNlZChhaGQpKQorCQkJYWhkX2RlbGF5KDIwMCk7CisJCWFoZF91cGRhdGVfbW9kZXMoYWhkKTsKKwl9CisJaWYgKHN0ZXBwaW5nKSB7CisJCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9DRkcsIEFIRF9NT0RFX0NGRyk7CisJCWFoZF9vdXRiKGFoZCwgU0lNT0RFMCwgc2ltb2RlMCk7CisJCWFoZF9vdXRiKGFoZCwgU0lNT0RFMywgc2ltb2RlMyk7CisJCWFoZF9vdXRiKGFoZCwgTFFJTU9ERTAsIGxxaW1vZGUwKTsKKwkJYWhkX291dGIoYWhkLCBMUUlNT0RFMSwgbHFpbW9kZTEpOworCQlhaGRfb3V0YihhaGQsIExRT01PREUwLCBscW9tb2RlMCk7CisJCWFoZF9vdXRiKGFoZCwgTFFPTU9ERTEsIGxxb21vZGUxKTsKKwkJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCQlhaGRfb3V0YihhaGQsIFNFUUNUTDAsIGFoZF9pbmIoYWhkLCBTRVFDVEwwKSAmIH5TVEVQKTsKKyAgCQlhaGRfb3V0YihhaGQsIFNJTU9ERTEsIHNpbW9kZTEpOworCQkvKgorCQkgKiBTQ1NJSU5UIHNlZW1zIHRvIGdsaXRjaCBvY2Nhc3Npb25hbGx5IHdoZW4KKwkJICogdGhlIGludGVycnVwdCBtYXNrcyBhcmUgcmVzdG9yZWQuICBDbGVhciBTQ1NJSU5UCisJCSAqIG9uZSBtb3JlIHRpbWUgc28gdGhhdCBvbmx5IHBlcnNpc3RlbnQgZXJyb3JzCisJCSAqIGFyZSBzZWVuIGFzIGEgcmVhbCBpbnRlcnJ1cHQuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSU0NTSUlOVCk7CisJfQorCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOworfQorCisvKgorICogQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0IHN0YXR1cy4KKyAqLwordm9pZAorYWhkX2NsZWFyX2ludHN0YXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCUFIRF9BU1NFUlRfTU9ERVMoYWhkLCB+KEFIRF9NT0RFX1VOS05PV05fTVNLfEFIRF9NT0RFX0NGR19NU0spLAorCQkJIH4oQUhEX01PREVfVU5LTk9XTl9NU0t8QUhEX01PREVfQ0ZHX01TSykpOworCS8qIENsZWFyIGFueSBpbnRlcnJ1cHQgY29uZGl0aW9ucyB0aGlzIG1heSBoYXZlIGNhdXNlZCAqLworCWFoZF9vdXRiKGFoZCwgQ0xSTFFJSU5UMCwgQ0xSTFFJQVROUUFTfENMUkxRSUNSQ1QxfENMUkxRSUNSQ1QyCisJCQkJIHxDTFJMUUlCQURMUVR8Q0xSTFFJQVROTFF8Q0xSTFFJQVROQ01EKTsKKwlhaGRfb3V0YihhaGQsIENMUkxRSUlOVDEsIENMUkxRSVBIQVNFX0xRfENMUkxRSVBIQVNFX05MUXxDTFJMSVFBQk9SVAorCQkJCSB8Q0xSTFFJQ1JDSV9MUXxDTFJMUUlDUkNJX05MUXxDTFJMUUlCQURMUUkKKwkJCQkgfENMUkxRSU9WRVJJX0xRfENMUkxRSU9WRVJJX05MUXxDTFJOT05QQUNLUkVRKTsKKwlhaGRfb3V0YihhaGQsIENMUkxRT0lOVDAsIENMUkxRT1RBUkdTQ0JQRVJSfENMUkxRT1NUT1BUMnxDTFJMUU9BVE5MUQorCQkJCSB8Q0xSTFFPQVROUEtUfENMUkxRT1RDUkMpOworCWFoZF9vdXRiKGFoZCwgQ0xSTFFPSU5UMSwgQ0xSTFFPSU5JVFNDQlBFUlJ8Q0xSTFFPU1RPUEkyfENMUkxRT0JBRFFBUworCQkJCSB8Q0xSTFFPQlVTRlJFRXxDTFJMUU9QSEFDSEdJTlBLVCk7CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfQ0xSTFFPX0FVVE9DTFJfQlVHKSAhPSAwKSB7CisJCWFoZF9vdXRiKGFoZCwgQ0xSTFFPSU5UMCwgMCk7CisJCWFoZF9vdXRiKGFoZCwgQ0xSTFFPSU5UMSwgMCk7CisJfQorCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDMsIENMUk5UUkFNUEVSUnxDTFJPU1JBTVBFUlIpOworCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDEsIENMUlNFTFRJTUVPfENMUkFUTk98Q0xSU0NTSVJTVEkKKwkJCQl8Q0xSQlVTRlJFRXxDTFJTQ1NJUEVSUnxDTFJSRVFJTklUKTsKKwlhaGRfb3V0YihhaGQsIENMUlNJTlQwLCBDTFJTRUxET3xDTFJTRUxESXxDTFJTRUxJTkdPCisJCQkgICAgICAgIHxDTFJJT0VSUnxDTFJPVkVSUlVOKTsKKwlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSU0NTSUlOVCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIERlYnVnZ2luZyBSb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQUhEX0RFQlVHCit1aW50MzJfdCBhaGRfZGVidWcgPSBBSERfREVCVUdfT1BUUzsKKyNlbmRpZgordm9pZAorYWhkX3ByaW50X3NjYihzdHJ1Y3Qgc2NiICpzY2IpCit7CisJc3RydWN0IGhhcmR3YXJlX3NjYiAqaHNjYjsKKwlpbnQgaTsKKworCWhzY2IgPSBzY2ItPmhzY2I7CisJcHJpbnRmKCJzY2I6JXAgY29udHJvbDoweCV4IHNjc2lpZDoweCV4IGx1bjolZCBjZGJfbGVuOiVkXG4iLAorCSAgICAgICAodm9pZCAqKXNjYiwKKwkgICAgICAgaHNjYi0+Y29udHJvbCwKKwkgICAgICAgaHNjYi0+c2NzaWlkLAorCSAgICAgICBoc2NiLT5sdW4sCisJICAgICAgIGhzY2ItPmNkYl9sZW4pOworCXByaW50ZigiU2hhcmVkIERhdGE6ICIpOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaHNjYi0+c2hhcmVkX2RhdGEuaWRhdGEuY2RiKTsgaSsrKQorCQlwcmludGYoIiUjMDJ4IiwgaHNjYi0+c2hhcmVkX2RhdGEuaWRhdGEuY2RiW2ldKTsKKwlwcmludGYoIiAgICAgICAgZGF0YXB0cjolI3gleCBkYXRhY250OiUjeCBzZ3B0cjolI3ggdGFnOiUjeFxuIiwKKwkgICAgICAgKHVpbnQzMl90KSgoYWhkX2xlNjR0b2goaHNjYi0+ZGF0YXB0cikgPj4gMzIpICYgMHhGRkZGRkZGRiksCisJICAgICAgICh1aW50MzJfdCkoYWhkX2xlNjR0b2goaHNjYi0+ZGF0YXB0cikgJiAweEZGRkZGRkZGKSwKKwkgICAgICAgYWhkX2xlMzJ0b2goaHNjYi0+ZGF0YWNudCksCisJICAgICAgIGFoZF9sZTMydG9oKGhzY2ItPnNncHRyKSwKKwkgICAgICAgU0NCX0dFVF9UQUcoc2NiKSk7CisJYWhkX2R1bXBfc2dsaXN0KHNjYik7Cit9CisKK3ZvaWQKK2FoZF9kdW1wX3NnbGlzdChzdHJ1Y3Qgc2NiICpzY2IpCit7CisJaW50IGk7CisKKwlpZiAoc2NiLT5zZ19jb3VudCA+IDApIHsKKwkJaWYgKChzY2ItPmFoZF9zb2Z0Yy0+ZmxhZ3MgJiBBSERfNjRCSVRfQUREUkVTU0lORykgIT0gMCkgeworCQkJc3RydWN0IGFoZF9kbWE2NF9zZWcgKnNnX2xpc3Q7CisKKwkJCXNnX2xpc3QgPSAoc3RydWN0IGFoZF9kbWE2NF9zZWcqKXNjYi0+c2dfbGlzdDsKKwkJCWZvciAoaSA9IDA7IGkgPCBzY2ItPnNnX2NvdW50OyBpKyspIHsKKwkJCQl1aW50NjRfdCBhZGRyOworCQkJCXVpbnQzMl90IGxlbjsKKworCQkJCWFkZHIgPSBhaGRfbGU2NHRvaChzZ19saXN0W2ldLmFkZHIpOworCQkJCWxlbiA9IGFoZF9sZTMydG9oKHNnX2xpc3RbaV0ubGVuKTsKKwkJCQlwcmludGYoInNnWyVkXSAtIEFkZHIgMHgleCV4IDogTGVuZ3RoICVkJXNcbiIsCisJCQkJICAgICAgIGksCisJCQkJICAgICAgICh1aW50MzJfdCkoKGFkZHIgPj4gMzIpICYgMHhGRkZGRkZGRiksCisJCQkJICAgICAgICh1aW50MzJfdCkoYWRkciAmIDB4RkZGRkZGRkYpLAorCQkJCSAgICAgICBzZ19saXN0W2ldLmxlbiAmIEFIRF9TR19MRU5fTUFTSywKKwkJCQkgICAgICAgKHNnX2xpc3RbaV0ubGVuICYgQUhEX0RNQV9MQVNUX1NFRykKKwkJCQkgICAgID8gIiBMYXN0IiA6ICIiKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBhaGRfZG1hX3NlZyAqc2dfbGlzdDsKKworCQkJc2dfbGlzdCA9IChzdHJ1Y3QgYWhkX2RtYV9zZWcqKXNjYi0+c2dfbGlzdDsKKwkJCWZvciAoaSA9IDA7IGkgPCBzY2ItPnNnX2NvdW50OyBpKyspIHsKKwkJCQl1aW50MzJfdCBsZW47CisKKwkJCQlsZW4gPSBhaGRfbGUzMnRvaChzZ19saXN0W2ldLmxlbik7CisJCQkJcHJpbnRmKCJzZ1slZF0gLSBBZGRyIDB4JXgleCA6IExlbmd0aCAlZCVzXG4iLAorCQkJCSAgICAgICBpLAorCQkJCSAgICAgICAobGVuICYgQUhEX1NHX0hJR0hfQUREUl9NQVNLKSA+PiAyNCwKKwkJCQkgICAgICAgYWhkX2xlMzJ0b2goc2dfbGlzdFtpXS5hZGRyKSwKKwkJCQkgICAgICAgbGVuICYgQUhEX1NHX0xFTl9NQVNLLAorCQkJCSAgICAgICBsZW4gJiBBSERfRE1BX0xBU1RfU0VHID8gIiBMYXN0IiA6ICIiKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogVHJhbnNmZXIgTmVnb3RpYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBBbGxvY2F0ZSBwZXIgdGFyZ2V0IG1vZGUgaW5zdGFuY2UgKElEIHdlIHJlc3BvbmQgdG8gYXMgYSB0YXJnZXQpCisgKiB0cmFuc2ZlciBuZWdvdGlhdGlvbiBkYXRhIHN0cnVjdHVyZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqCithaGRfYWxsb2NfdHN0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgc2NzaV9pZCwgY2hhciBjaGFubmVsKQoreworCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICptYXN0ZXJfdHN0YXRlOworCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJaW50IGk7CisKKwltYXN0ZXJfdHN0YXRlID0gYWhkLT5lbmFibGVkX3RhcmdldHNbYWhkLT5vdXJfaWRdOworCWlmIChhaGQtPmVuYWJsZWRfdGFyZ2V0c1tzY3NpX2lkXSAhPSBOVUxMCisJICYmIGFoZC0+ZW5hYmxlZF90YXJnZXRzW3Njc2lfaWRdICE9IG1hc3Rlcl90c3RhdGUpCisJCXBhbmljKCIlczogYWhkX2FsbG9jX3RzdGF0ZSAtIFRhcmdldCBhbHJlYWR5IGFsbG9jYXRlZCIsCisJCSAgICAgIGFoZF9uYW1lKGFoZCkpOworCXRzdGF0ZSA9IG1hbGxvYyhzaXplb2YoKnRzdGF0ZSksIE1fREVWQlVGLCBNX05PV0FJVCk7CisJaWYgKHRzdGF0ZSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGFsbG9jYXRlZCBhIG1hc3RlciB0c3RhdGUsIGNvcHkgdXNlciBzZXR0aW5ncyBmcm9tCisJICogdGhlIG1hc3RlciB0c3RhdGUgKHRha2VuIGZyb20gU1JBTSBvciB0aGUgRUVQUk9NKSBmb3IgdGhpcworCSAqIGNoYW5uZWwsIGJ1dCByZXNldCBvdXIgY3VycmVudCBhbmQgZ29hbCBzZXR0aW5ncyB0byBhc3luYy9uYXJyb3cKKwkgKiB1bnRpbCBhbiBpbml0aWF0b3IgdGFsa3MgdG8gdXMuCisJICovCisJaWYgKG1hc3Rlcl90c3RhdGUgIT0gTlVMTCkgeworCQltZW1jcHkodHN0YXRlLCBtYXN0ZXJfdHN0YXRlLCBzaXplb2YoKnRzdGF0ZSkpOworCQltZW1zZXQodHN0YXRlLT5lbmFibGVkX2x1bnMsIDAsIHNpemVvZih0c3RhdGUtPmVuYWJsZWRfbHVucykpOworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJbWVtc2V0KCZ0c3RhdGUtPnRyYW5zaW5mb1tpXS5jdXJyLCAwLAorCQkJICAgICAgc2l6ZW9mKHRzdGF0ZS0+dHJhbnNpbmZvW2ldLmN1cnIpKTsKKwkJCW1lbXNldCgmdHN0YXRlLT50cmFuc2luZm9baV0uZ29hbCwgMCwKKwkJCSAgICAgIHNpemVvZih0c3RhdGUtPnRyYW5zaW5mb1tpXS5nb2FsKSk7CisJCX0KKwl9IGVsc2UKKwkJbWVtc2V0KHRzdGF0ZSwgMCwgc2l6ZW9mKCp0c3RhdGUpKTsKKwlhaGQtPmVuYWJsZWRfdGFyZ2V0c1tzY3NpX2lkXSA9IHRzdGF0ZTsKKwlyZXR1cm4gKHRzdGF0ZSk7Cit9CisKKyNpZmRlZiBBSERfVEFSR0VUX01PREUKKy8qCisgKiBGcmVlIHBlciB0YXJnZXQgbW9kZSBpbnN0YW5jZSAoSUQgd2UgcmVzcG9uZCB0byBhcyBhIHRhcmdldCkKKyAqIHRyYW5zZmVyIG5lZ290aWF0aW9uIGRhdGEgc3RydWN0dXJlcy4KKyAqLworc3RhdGljIHZvaWQKK2FoZF9mcmVlX3RzdGF0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHNjc2lfaWQsIGNoYXIgY2hhbm5lbCwgaW50IGZvcmNlKQoreworCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisKKwkvKgorCSAqIERvbid0IGNsZWFuIHVwIG91ciAibWFzdGVyIiB0c3RhdGUuCisJICogSXQgaGFzIG91ciBkZWZhdWx0IHVzZXIgc2V0dGluZ3MuCisJICovCisJaWYgKHNjc2lfaWQgPT0gYWhkLT5vdXJfaWQKKwkgJiYgZm9yY2UgPT0gRkFMU0UpCisJCXJldHVybjsKKworCXRzdGF0ZSA9IGFoZC0+ZW5hYmxlZF90YXJnZXRzW3Njc2lfaWRdOworCWlmICh0c3RhdGUgIT0gTlVMTCkKKwkJZnJlZSh0c3RhdGUsIE1fREVWQlVGKTsKKwlhaGQtPmVuYWJsZWRfdGFyZ2V0c1tzY3NpX2lkXSA9IE5VTEw7Cit9CisjZW5kaWYKKworLyoKKyAqIENhbGxlZCB3aGVuIHdlIGhhdmUgYW4gYWN0aXZlIGNvbm5lY3Rpb24gdG8gYSB0YXJnZXQgb24gdGhlIGJ1cywKKyAqIHRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIG5lYXJlc3QgcGVyaW9kIHRvIHRoZSBpbnB1dCBwZXJpb2QgbGltaXRlZAorICogYnkgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgYnVzIGNvbm5lY3Rpdml0eSBvZiBhbmQgc3luYyBzZXR0aW5ncyBmb3IKKyAqIHRoZSB0YXJnZXQuCisgKi8KK3ZvaWQKK2FoZF9kZXZsaW1pdGVkX3N5bmNyYXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbywKKwkJCXVfaW50ICpwZXJpb2QsIHVfaW50ICpwcHJfb3B0aW9ucywgcm9sZV90IHJvbGUpCit7CisJc3RydWN0CWFoZF90cmFuc2luZm8gKnRyYW5zaW5mbzsKKwl1X2ludAltYXhzeW5jOworCisJaWYgKChhaGRfaW5iKGFoZCwgU0JMS0NUTCkgJiBFTkFCNDApICE9IDAKKwkgJiYgKGFoZF9pbmIoYWhkLCBTU1RBVDIpICYgRVhQX0FDVElWRSkgPT0gMCkgeworCQltYXhzeW5jID0gQUhEX1NZTkNSQVRFX1BBQ0VEOworCX0gZWxzZSB7CisJCW1heHN5bmMgPSBBSERfU1lOQ1JBVEVfVUxUUkE7CisJCS8qIENhbid0IGRvIERUIHJlbGF0ZWQgb3B0aW9ucyBvbiBhbiBTRSBidXMgKi8KKwkJKnBwcl9vcHRpb25zICY9IE1TR19FWFRfUFBSX1FBU19SRVE7CisJfQorCS8qCisJICogTmV2ZXIgYWxsb3cgYSB2YWx1ZSBoaWdoZXIgdGhhbiBvdXIgY3VycmVudCBnb2FsCisJICogcGVyaW9kIG90aGVyd2lzZSB3ZSBtYXkgYWxsb3cgYSB0YXJnZXQgaW5pdGlhdGVkCisJICogbmVnb3RpYXRpb24gdG8gZ28gYWJvdmUgdGhlIGxpbWl0IGFzIHNldCBieSB0aGUKKwkgKiB1c2VyLiAgSW4gdGhlIGNhc2Ugb2YgYW4gaW5pdGlhdG9yIGluaXRpYXRlZAorCSAqIHN5bmMgbmVnb3RpYXRpb24sIHdlIGxpbWl0IGJhc2VkIG9uIHRoZSB1c2VyCisJICogc2V0dGluZy4gIFRoaXMgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gc3RpbGwgYWNjZXB0CisJICogaW5jb21pbmcgbmVnb3RpYXRpb25zIGV2ZW4gaWYgdGFyZ2V0IGluaXRpYXRlZAorCSAqIG5lZ290aWF0aW9uIGlzIG5vdCBwZXJmb3JtZWQuCisJICovCisJaWYgKHJvbGUgPT0gUk9MRV9UQVJHRVQpCisJCXRyYW5zaW5mbyA9ICZ0aW5mby0+dXNlcjsKKwllbHNlIAorCQl0cmFuc2luZm8gPSAmdGluZm8tPmdvYWw7CisJKnBwcl9vcHRpb25zICY9ICh0cmFuc2luZm8tPnBwcl9vcHRpb25zfE1TR19FWFRfUFBSX1BDT01QX0VOKTsKKwlpZiAodHJhbnNpbmZvLT53aWR0aCA9PSBNU0dfRVhUX1dEVFJfQlVTXzhfQklUKSB7CisJCW1heHN5bmMgPSBNQVgobWF4c3luYywgQUhEX1NZTkNSQVRFX1VMVFJBMik7CisJCSpwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfRFRfUkVROworCX0KKwlpZiAodHJhbnNpbmZvLT5wZXJpb2QgPT0gMCkgeworCQkqcGVyaW9kID0gMDsKKwkJKnBwcl9vcHRpb25zID0gMDsKKwl9IGVsc2UgeworCQkqcGVyaW9kID0gTUFYKCpwZXJpb2QsIHRyYW5zaW5mby0+cGVyaW9kKTsKKwkJYWhkX2ZpbmRfc3luY3JhdGUoYWhkLCBwZXJpb2QsIHBwcl9vcHRpb25zLCBtYXhzeW5jKTsKKwl9Cit9CisKKy8qCisgKiBMb29rIHVwIHRoZSB2YWxpZCBwZXJpb2QgdG8gU0NTSVJBVEUgY29udmVyc2lvbiBpbiBvdXIgdGFibGUuCisgKiBSZXR1cm4gdGhlIHBlcmlvZCBhbmQgb2Zmc2V0IHRoYXQgc2hvdWxkIGJlIHNlbnQgdG8gdGhlIHRhcmdldAorICogaWYgdGhpcyB3YXMgdGhlIGJlZ2lubmluZyBvZiBhbiBTRFRSLgorICovCit2b2lkCithaGRfZmluZF9zeW5jcmF0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50ICpwZXJpb2QsCisJCSAgdV9pbnQgKnBwcl9vcHRpb25zLCB1X2ludCBtYXhzeW5jKQoreworCWlmICgqcGVyaW9kIDwgbWF4c3luYykKKwkJKnBlcmlvZCA9IG1heHN5bmM7CisKKwlpZiAoKCpwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUSkgIT0gMAorCSAmJiAqcGVyaW9kID4gQUhEX1NZTkNSQVRFX01JTl9EVCkKKwkJKnBwcl9vcHRpb25zICY9IH5NU0dfRVhUX1BQUl9EVF9SRVE7CisJCQorCWlmICgqcGVyaW9kID4gQUhEX1NZTkNSQVRFX01JTikKKwkJKnBlcmlvZCA9IDA7CisKKwkvKiBIb25vciBQUFIgb3B0aW9uIGNvbmZvcm1hbmNlIHJ1bGVzLiAqLworCWlmICgqcGVyaW9kID4gQUhEX1NZTkNSQVRFX1BBQ0VEKQorCQkqcHByX29wdGlvbnMgJj0gfk1TR19FWFRfUFBSX1JUSTsKKworCWlmICgoKnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfSVVfUkVRKSA9PSAwKQorCQkqcHByX29wdGlvbnMgJj0gKE1TR19FWFRfUFBSX0RUX1JFUXxNU0dfRVhUX1BQUl9RQVNfUkVRKTsKKworCWlmICgoKnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVRKSA9PSAwKQorCQkqcHByX29wdGlvbnMgJj0gTVNHX0VYVF9QUFJfUUFTX1JFUTsKKworCS8qIFNraXAgYWxsIFBBQ0VEIG9ubHkgZW50cmllcyBpZiBJVSBpcyBub3QgYXZhaWxhYmxlICovCisJaWYgKCgqcHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9JVV9SRVEpID09IDAKKwkgJiYgKnBlcmlvZCA8IEFIRF9TWU5DUkFURV9EVCkKKwkJKnBlcmlvZCA9IEFIRF9TWU5DUkFURV9EVDsKKworCS8qIFNraXAgYWxsIERUIG9ubHkgZW50cmllcyBpZiBEVCBpcyBub3QgYXZhaWxhYmxlICovCisJaWYgKCgqcHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9EVF9SRVEpID09IDAKKwkgJiYgKnBlcmlvZCA8IEFIRF9TWU5DUkFURV9VTFRSQTIpCisJCSpwZXJpb2QgPSBBSERfU1lOQ1JBVEVfVUxUUkEyOworfQorCisvKgorICogVHJ1bmNhdGUgdGhlIGdpdmVuIHN5bmNocm9ub3VzIG9mZnNldCB0byBhIHZhbHVlIHRoZQorICogY3VycmVudCBhZGFwdGVyIHR5cGUgYW5kIHN5bmNyYXRlIGFyZSBjYXBhYmxlIG9mLgorICovCit2b2lkCithaGRfdmFsaWRhdGVfb2Zmc2V0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJICAgIHN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbywKKwkJICAgIHVfaW50IHBlcmlvZCwgdV9pbnQgKm9mZnNldCwgaW50IHdpZGUsCisJCSAgICByb2xlX3Qgcm9sZSkKK3sKKwl1X2ludCBtYXhvZmZzZXQ7CisKKwkvKiBMaW1pdCBvZmZzZXQgdG8gd2hhdCB3ZSBjYW4gZG8gKi8KKwlpZiAocGVyaW9kID09IDApCisJCW1heG9mZnNldCA9IDA7CisJZWxzZSBpZiAocGVyaW9kIDw9IEFIRF9TWU5DUkFURV9QQUNFRCkgeworCQlpZiAoKGFoZC0+YnVncyAmIEFIRF9QQUNFRF9ORUdUQUJMRV9CVUcpICE9IDApCisJCQltYXhvZmZzZXQgPSBNQVhfT0ZGU0VUX1BBQ0VEX0JVRzsKKwkJZWxzZQorCQkJbWF4b2Zmc2V0ID0gTUFYX09GRlNFVF9QQUNFRDsKKwl9IGVsc2UKKwkJbWF4b2Zmc2V0ID0gTUFYX09GRlNFVF9OT05fUEFDRUQ7CisJKm9mZnNldCA9IE1JTigqb2Zmc2V0LCBtYXhvZmZzZXQpOworCWlmICh0aW5mbyAhPSBOVUxMKSB7CisJCWlmIChyb2xlID09IFJPTEVfVEFSR0VUKQorCQkJKm9mZnNldCA9IE1JTigqb2Zmc2V0LCB0aW5mby0+dXNlci5vZmZzZXQpOworCQllbHNlCisJCQkqb2Zmc2V0ID0gTUlOKCpvZmZzZXQsIHRpbmZvLT5nb2FsLm9mZnNldCk7CisJfQorfQorCisvKgorICogVHJ1bmNhdGUgdGhlIGdpdmVuIHRyYW5zZmVyIHdpZHRoIHBhcmFtZXRlciB0byBhIHZhbHVlIHRoZQorICogY3VycmVudCBhZGFwdGVyIHR5cGUgaXMgY2FwYWJsZSBvZi4KKyAqLwordm9pZAorYWhkX3ZhbGlkYXRlX3dpZHRoKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvLAorCQkgICB1X2ludCAqYnVzX3dpZHRoLCByb2xlX3Qgcm9sZSkKK3sKKwlzd2l0Y2ggKCpidXNfd2lkdGgpIHsKKwlkZWZhdWx0OgorCQlpZiAoYWhkLT5mZWF0dXJlcyAmIEFIRF9XSURFKSB7CisJCQkvKiBSZXNwb25kIFdpZGUgKi8KKwkJCSpidXNfd2lkdGggPSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVDsKKwkJCWJyZWFrOworCQl9CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSBNU0dfRVhUX1dEVFJfQlVTXzhfQklUOgorCQkqYnVzX3dpZHRoID0gTVNHX0VYVF9XRFRSX0JVU184X0JJVDsKKwkJYnJlYWs7CisJfQorCWlmICh0aW5mbyAhPSBOVUxMKSB7CisJCWlmIChyb2xlID09IFJPTEVfVEFSR0VUKQorCQkJKmJ1c193aWR0aCA9IE1JTih0aW5mby0+dXNlci53aWR0aCwgKmJ1c193aWR0aCk7CisJCWVsc2UKKwkJCSpidXNfd2lkdGggPSBNSU4odGluZm8tPmdvYWwud2lkdGgsICpidXNfd2lkdGgpOworCX0KK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgYml0bWFzayBvZiB0YXJnZXRzIGZvciB3aGljaCB0aGUgY29udHJvbGxlciBzaG91bGQKKyAqIG5lZ290aWF0ZSB3aXRoIGF0IHRoZSBuZXh0IGNvbnZlbmllbnQgb3BvcnR1bml0eS4gIFRoaXMgY3VycmVudGx5CisgKiBtZWFucyB0aGUgbmV4dCB0aW1lIHdlIHNlbmQgdGhlIGluaXRpYWwgaWRlbnRpZnkgbWVzc2FnZXMgZm9yCisgKiBhIG5ldyB0cmFuc2FjdGlvbi4KKyAqLworaW50CithaGRfdXBkYXRlX25lZ19yZXF1ZXN0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCQkgICAgICAgc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZSwKKwkJICAgICAgIHN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbywgYWhkX25lZ190eXBlIG5lZ190eXBlKQoreworCXVfaW50IGF1dG9fbmVnb3RpYXRlX29yaWc7CisKKwlhdXRvX25lZ290aWF0ZV9vcmlnID0gdHN0YXRlLT5hdXRvX25lZ290aWF0ZTsKKwlpZiAobmVnX3R5cGUgPT0gQUhEX05FR19BTFdBWVMpIHsKKwkJLyoKKwkJICogRm9yY2Ugb3VyICJjdXJyZW50IiBzZXR0aW5ncyB0byBiZQorCQkgKiB1bmtub3duIHNvIHRoYXQgdW5sZXNzIGEgYnVzIHJlc2V0CisJCSAqIG9jY3VycyB0aGUgbmVlZCB0byByZW5lZ290aWF0ZSBpcworCQkgKiByZWNvcmRlZCBwZXJzaXN0ZW50bHkuCisJCSAqLworCQlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfV0lERSkgIT0gMCkKKwkJCXRpbmZvLT5jdXJyLndpZHRoID0gQUhEX1dJRFRIX1VOS05PV047CisJCXRpbmZvLT5jdXJyLnBlcmlvZCA9IEFIRF9QRVJJT0RfVU5LTk9XTjsKKwkJdGluZm8tPmN1cnIub2Zmc2V0ID0gQUhEX09GRlNFVF9VTktOT1dOOworCX0KKwlpZiAodGluZm8tPmN1cnIucGVyaW9kICE9IHRpbmZvLT5nb2FsLnBlcmlvZAorCSB8fCB0aW5mby0+Y3Vyci53aWR0aCAhPSB0aW5mby0+Z29hbC53aWR0aAorCSB8fCB0aW5mby0+Y3Vyci5vZmZzZXQgIT0gdGluZm8tPmdvYWwub2Zmc2V0CisJIHx8IHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICE9IHRpbmZvLT5nb2FsLnBwcl9vcHRpb25zCisJIHx8IChuZWdfdHlwZSA9PSBBSERfTkVHX0lGX05PTl9BU1lOQworCSAgJiYgKHRpbmZvLT5nb2FsLm9mZnNldCAhPSAwCisJICAgfHwgdGluZm8tPmdvYWwud2lkdGggIT0gTVNHX0VYVF9XRFRSX0JVU184X0JJVAorCSAgIHx8IHRpbmZvLT5nb2FsLnBwcl9vcHRpb25zICE9IDApKSkKKwkJdHN0YXRlLT5hdXRvX25lZ290aWF0ZSB8PSBkZXZpbmZvLT50YXJnZXRfbWFzazsKKwllbHNlCisJCXRzdGF0ZS0+YXV0b19uZWdvdGlhdGUgJj0gfmRldmluZm8tPnRhcmdldF9tYXNrOworCisJcmV0dXJuIChhdXRvX25lZ290aWF0ZV9vcmlnICE9IHRzdGF0ZS0+YXV0b19uZWdvdGlhdGUpOworfQorCisvKgorICogVXBkYXRlIHRoZSB1c2VyL2dvYWwvY3VyciB0YWJsZXMgb2Ygc3luY2hyb25vdXMgbmVnb3RpYXRpb24KKyAqIHBhcmFtZXRlcnMgYXMgd2VsbCBhcywgaW4gdGhlIGNhc2Ugb2YgYSBjdXJyZW50IG9yIGFjdGl2ZSB1cGRhdGUsCisgKiBhbnkgZGF0YSBzdHJ1Y3R1cmVzIG9uIHRoZSBob3N0IGNvbnRyb2xsZXIuICBJbiB0aGUgY2FzZSBvZiBhbgorICogYWN0aXZlIHVwZGF0ZSwgdGhlIHNwZWNpZmllZCB0YXJnZXQgaXMgY3VycmVudGx5IHRhbGtpbmcgdG8gdXMgb24KKyAqIHRoZSBidXMsIHNvIHRoZSB0cmFuc2ZlciBwYXJhbWV0ZXIgdXBkYXRlIG11c3QgdGFrZSBlZmZlY3QKKyAqIGltbWVkaWF0ZWx5LgorICovCit2b2lkCithaGRfc2V0X3N5bmNyYXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCQkgdV9pbnQgcGVyaW9kLCB1X2ludCBvZmZzZXQsIHVfaW50IHBwcl9vcHRpb25zLAorCQkgdV9pbnQgdHlwZSwgaW50IHBhdXNlZCkKK3sKKwlzdHJ1Y3QJYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJc3RydWN0CWFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwl1X2ludAlvbGRfcGVyaW9kOworCXVfaW50CW9sZF9vZmZzZXQ7CisJdV9pbnQJb2xkX3BwcjsKKwlpbnQJYWN0aXZlOworCWludAl1cGRhdGVfbmVlZGVkOworCisJYWN0aXZlID0gKHR5cGUgJiBBSERfVFJBTlNfQUNUSVZFKSA9PSBBSERfVFJBTlNfQUNUSVZFOworCXVwZGF0ZV9uZWVkZWQgPSAwOworCisJaWYgKHBlcmlvZCA9PSAwIHx8IG9mZnNldCA9PSAwKSB7CisJCXBlcmlvZCA9IDA7CisJCW9mZnNldCA9IDA7CisJfQorCisJdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+b3VyX3Njc2lpZCwKKwkJCQkgICAgZGV2aW5mby0+dGFyZ2V0LCAmdHN0YXRlKTsKKworCWlmICgodHlwZSAmIEFIRF9UUkFOU19VU0VSKSAhPSAwKSB7CisJCXRpbmZvLT51c2VyLnBlcmlvZCA9IHBlcmlvZDsKKwkJdGluZm8tPnVzZXIub2Zmc2V0ID0gb2Zmc2V0OworCQl0aW5mby0+dXNlci5wcHJfb3B0aW9ucyA9IHBwcl9vcHRpb25zOworCX0KKworCWlmICgodHlwZSAmIEFIRF9UUkFOU19HT0FMKSAhPSAwKSB7CisJCXRpbmZvLT5nb2FsLnBlcmlvZCA9IHBlcmlvZDsKKwkJdGluZm8tPmdvYWwub2Zmc2V0ID0gb2Zmc2V0OworCQl0aW5mby0+Z29hbC5wcHJfb3B0aW9ucyA9IHBwcl9vcHRpb25zOworCX0KKworCW9sZF9wZXJpb2QgPSB0aW5mby0+Y3Vyci5wZXJpb2Q7CisJb2xkX29mZnNldCA9IHRpbmZvLT5jdXJyLm9mZnNldDsKKwlvbGRfcHByCSAgID0gdGluZm8tPmN1cnIucHByX29wdGlvbnM7CisKKwlpZiAoKHR5cGUgJiBBSERfVFJBTlNfQ1VSKSAhPSAwCisJICYmIChvbGRfcGVyaW9kICE9IHBlcmlvZAorCSAgfHwgb2xkX29mZnNldCAhPSBvZmZzZXQKKwkgIHx8IG9sZF9wcHIgIT0gcHByX29wdGlvbnMpKSB7CisKKwkJdXBkYXRlX25lZWRlZCsrOworCisJCXRpbmZvLT5jdXJyLnBlcmlvZCA9IHBlcmlvZDsKKwkJdGluZm8tPmN1cnIub2Zmc2V0ID0gb2Zmc2V0OworCQl0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyA9IHBwcl9vcHRpb25zOworCisJCWFoZF9zZW5kX2FzeW5jKGFoZCwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAorCQkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIEFDX1RSQU5TRkVSX05FRywgTlVMTCk7CisJCWlmIChib290dmVyYm9zZSkgeworCQkJaWYgKG9mZnNldCAhPSAwKSB7CisJCQkJaW50IG9wdGlvbnM7CisKKwkJCQlwcmludGYoIiVzOiB0YXJnZXQgJWQgc3luY2hyb25vdXMgd2l0aCAiCisJCQkJICAgICAgICJwZXJpb2QgPSAweCV4LCBvZmZzZXQgPSAweCV4IiwKKwkJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby0+dGFyZ2V0LAorCQkJCSAgICAgICBwZXJpb2QsIG9mZnNldCk7CisJCQkJb3B0aW9ucyA9IDA7CisJCQkJaWYgKChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX1JEX1NUUk0pICE9IDApIHsKKwkJCQkJcHJpbnRmKCIoUkRTVFJNIik7CisJCQkJCW9wdGlvbnMrKzsKKwkJCQl9CisJCQkJaWYgKChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUSkgIT0gMCkgeworCQkJCQlwcmludGYoIiVzIiwgb3B0aW9ucyA/ICJ8RFQiIDogIihEVCIpOworCQkJCQlvcHRpb25zKys7CisJCQkJfQorCQkJCWlmICgocHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9JVV9SRVEpICE9IDApIHsKKwkJCQkJcHJpbnRmKCIlcyIsIG9wdGlvbnMgPyAifElVIiA6ICIoSVUiKTsKKwkJCQkJb3B0aW9ucysrOworCQkJCX0KKwkJCQlpZiAoKHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfUlRJKSAhPSAwKSB7CisJCQkJCXByaW50ZigiJXMiLCBvcHRpb25zID8gInxSVEkiIDogIihSVEkiKTsKKwkJCQkJb3B0aW9ucysrOworCQkJCX0KKwkJCQlpZiAoKHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfUUFTX1JFUSkgIT0gMCkgeworCQkJCQlwcmludGYoIiVzIiwgb3B0aW9ucyA/ICJ8UUFTIiA6ICIoUUFTIik7CisJCQkJCW9wdGlvbnMrKzsKKwkJCQl9CisJCQkJaWYgKG9wdGlvbnMgIT0gMCkKKwkJCQkJcHJpbnRmKCIpXG4iKTsKKwkJCQllbHNlCisJCQkJCXByaW50ZigiXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmKCIlczogdGFyZ2V0ICVkIHVzaW5nICIKKwkJCQkgICAgICAgImFzeW5jaHJvbm91cyB0cmFuc2ZlcnMlc1xuIiwKKwkJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby0+dGFyZ2V0LAorCQkJCSAgICAgICAocHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9RQVNfUkVRKSAhPSAwCisJCQkJICAgICA/ICAiKFFBUykiIDogIiIpOworCQkJfQorCQl9CisJfQorCS8qCisJICogQWx3YXlzIHJlZnJlc2ggdGhlIG5lZy10YWJsZSB0byBoYW5kbGUgdGhlIGNhc2Ugb2YgdGhlCisJICogc2VxdWVuY2VyIHNldHRpbmcgdGhlIEVOQVROTyBiaXQgZm9yIGEgTUtfTUVTU0FHRSByZXF1ZXN0LgorCSAqIFdlIHdpbGwgYWx3YXlzIHJlbmVnb3RpYXRlIGluIHRoYXQgY2FzZSBpZiB0aGlzIGlzIGEKKwkgKiBwYWNrZXRpemVkIHJlcXVlc3QuICBBbHNvIG1hbmFnZSB0aGUgYnVzZnJlZSBleHBlY3RlZCBmbGFnCisJICogZnJvbSB0aGlzIGNvbW1vbiByb3V0aW5lIHNvIHRoYXQgd2UgY2F0Y2ggY2hhbmdlcyBkdWUgdG8KKwkgKiBXRFRSIG9yIFNEVFIgbWVzc2FnZXMuCisJICovCisJaWYgKCh0eXBlICYgQUhEX1RSQU5TX0NVUikgIT0gMCkgeworCQlpZiAoIXBhdXNlZCkKKwkJCWFoZF9wYXVzZShhaGQpOworCQlhaGRfdXBkYXRlX25lZ190YWJsZShhaGQsIGRldmluZm8sICZ0aW5mby0+Y3Vycik7CisJCWlmICghcGF1c2VkKQorCQkJYWhkX3VucGF1c2UoYWhkKTsKKwkJaWYgKGFoZC0+bXNnX3R5cGUgIT0gTVNHX1RZUEVfTk9ORSkgeworCQkJaWYgKChvbGRfcHByICYgTVNHX0VYVF9QUFJfSVVfUkVRKQorCQkJICE9IChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0lVX1JFUSkpIHsKKyNpZmRlZiBBSERfREVCVUcKKwkJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKSB7CisJCQkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7CisJCQkJCXByaW50ZigiRXhwZWN0aW5nIElVIENoYW5nZSBidXNmcmVlXG4iKTsKKwkJCQl9CisjZW5kaWYKKwkJCQlhaGQtPm1zZ19mbGFncyB8PSBNU0dfRkxBR19FWFBFQ1RfUFBSX0JVU0ZSRUUKKwkJCQkJICAgICAgIHwgIE1TR19GTEFHX0lVX1JFUV9DSEFOR0VEOworCQkJfQorCQkJaWYgKChvbGRfcHByICYgTVNHX0VYVF9QUFJfSVVfUkVRKSAhPSAwKSB7CisjaWZkZWYgQUhEX0RFQlVHCisJCQkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NRVNTQUdFUykgIT0gMCkKKwkJCQkJcHJpbnRmKCJQUFIgd2l0aCBJVV9SRVEgb3V0c3RhbmRpbmdcbiIpOworI2VuZGlmCisJCQkJYWhkLT5tc2dfZmxhZ3MgfD0gTVNHX0ZMQUdfRVhQRUNUX1BQUl9CVVNGUkVFOworCQkJfQorCQl9CisJfQorCisJdXBkYXRlX25lZWRlZCArPSBhaGRfdXBkYXRlX25lZ19yZXF1ZXN0KGFoZCwgZGV2aW5mbywgdHN0YXRlLAorCQkJCQkJdGluZm8sIEFIRF9ORUdfVE9fR09BTCk7CisKKwlpZiAodXBkYXRlX25lZWRlZCAmJiBhY3RpdmUpCisJCWFoZF91cGRhdGVfcGVuZGluZ19zY2JzKGFoZCk7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIHVzZXIvZ29hbC9jdXJyIHRhYmxlcyBvZiB3aWRlIG5lZ290aWF0aW9uCisgKiBwYXJhbWV0ZXJzIGFzIHdlbGwgYXMsIGluIHRoZSBjYXNlIG9mIGEgY3VycmVudCBvciBhY3RpdmUgdXBkYXRlLAorICogYW55IGRhdGEgc3RydWN0dXJlcyBvbiB0aGUgaG9zdCBjb250cm9sbGVyLiAgSW4gdGhlIGNhc2Ugb2YgYW4KKyAqIGFjdGl2ZSB1cGRhdGUsIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGlzIGN1cnJlbnRseSB0YWxraW5nIHRvIHVzIG9uCisgKiB0aGUgYnVzLCBzbyB0aGUgdHJhbnNmZXIgcGFyYW1ldGVyIHVwZGF0ZSBtdXN0IHRha2UgZWZmZWN0CisgKiBpbW1lZGlhdGVseS4KKyAqLwordm9pZAorYWhkX3NldF93aWR0aChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkgICAgICB1X2ludCB3aWR0aCwgdV9pbnQgdHlwZSwgaW50IHBhdXNlZCkKK3sKKwlzdHJ1Y3QJYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJc3RydWN0CWFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwl1X2ludAlvbGR3aWR0aDsKKwlpbnQJYWN0aXZlOworCWludAl1cGRhdGVfbmVlZGVkOworCisJYWN0aXZlID0gKHR5cGUgJiBBSERfVFJBTlNfQUNUSVZFKSA9PSBBSERfVFJBTlNfQUNUSVZFOworCXVwZGF0ZV9uZWVkZWQgPSAwOworCXRpbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPm91cl9zY3NpaWQsCisJCQkJICAgIGRldmluZm8tPnRhcmdldCwgJnRzdGF0ZSk7CisKKwlpZiAoKHR5cGUgJiBBSERfVFJBTlNfVVNFUikgIT0gMCkKKwkJdGluZm8tPnVzZXIud2lkdGggPSB3aWR0aDsKKworCWlmICgodHlwZSAmIEFIRF9UUkFOU19HT0FMKSAhPSAwKQorCQl0aW5mby0+Z29hbC53aWR0aCA9IHdpZHRoOworCisJb2xkd2lkdGggPSB0aW5mby0+Y3Vyci53aWR0aDsKKwlpZiAoKHR5cGUgJiBBSERfVFJBTlNfQ1VSKSAhPSAwICYmIG9sZHdpZHRoICE9IHdpZHRoKSB7CisKKwkJdXBkYXRlX25lZWRlZCsrOworCisJCXRpbmZvLT5jdXJyLndpZHRoID0gd2lkdGg7CisJCWFoZF9zZW5kX2FzeW5jKGFoZCwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAorCQkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIEFDX1RSQU5TRkVSX05FRywgTlVMTCk7CisJCWlmIChib290dmVyYm9zZSkgeworCQkJcHJpbnRmKCIlczogdGFyZ2V0ICVkIHVzaW5nICVkYml0IHRyYW5zZmVyc1xuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT50YXJnZXQsCisJCQkgICAgICAgOCAqICgweDAxIDw8IHdpZHRoKSk7CisJCX0KKwl9CisKKwlpZiAoKHR5cGUgJiBBSERfVFJBTlNfQ1VSKSAhPSAwKSB7CisJCWlmICghcGF1c2VkKQorCQkJYWhkX3BhdXNlKGFoZCk7CisJCWFoZF91cGRhdGVfbmVnX3RhYmxlKGFoZCwgZGV2aW5mbywgJnRpbmZvLT5jdXJyKTsKKwkJaWYgKCFwYXVzZWQpCisJCQlhaGRfdW5wYXVzZShhaGQpOworCX0KKworCXVwZGF0ZV9uZWVkZWQgKz0gYWhkX3VwZGF0ZV9uZWdfcmVxdWVzdChhaGQsIGRldmluZm8sIHRzdGF0ZSwKKwkJCQkJCXRpbmZvLCBBSERfTkVHX1RPX0dPQUwpOworCWlmICh1cGRhdGVfbmVlZGVkICYmIGFjdGl2ZSkKKwkJYWhkX3VwZGF0ZV9wZW5kaW5nX3NjYnMoYWhkKTsKKworfQorCisvKgorICogVXBkYXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRhZ2dlZCBxdWV1aW5nIGZvciBhIGdpdmVuIHRhcmdldC4KKyAqLwordm9pZAorYWhkX3NldF90YWdzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCSAgICAgYWhkX3F1ZXVlX2FsZyBhbGcpCit7CisJYWhkX3BsYXRmb3JtX3NldF90YWdzKGFoZCwgZGV2aW5mbywgYWxnKTsKKwlhaGRfc2VuZF9hc3luYyhhaGQsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKKwkJICAgICAgIGRldmluZm8tPmx1biwgQUNfVFJBTlNGRVJfTkVHLCAmYWxnKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF91cGRhdGVfbmVnX3RhYmxlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCQkgICAgIHN0cnVjdCBhaGRfdHJhbnNpbmZvICp0aW5mbykKK3sKKwlhaGRfbW9kZV9zdGF0ZQlzYXZlZF9tb2RlczsKKwl1X2ludAkJcGVyaW9kOworCXVfaW50CQlwcHJfb3B0czsKKwl1X2ludAkJY29uX29wdHM7CisJdV9pbnQJCW9mZnNldDsKKwl1X2ludAkJc2F2ZWRfbmVnb2FkZHI7CisJdWludDhfdAkJaW9jZWxsX29wdHNbc2l6ZW9mKGFoZC0+aW9jZWxsX29wdHMpXTsKKworCXNhdmVkX21vZGVzID0gYWhkX3NhdmVfbW9kZXMoYWhkKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisKKwlzYXZlZF9uZWdvYWRkciA9IGFoZF9pbmIoYWhkLCBORUdPQUREUik7CisJYWhkX291dGIoYWhkLCBORUdPQUREUiwgZGV2aW5mby0+dGFyZ2V0KTsKKwlwZXJpb2QgPSB0aW5mby0+cGVyaW9kOworCW9mZnNldCA9IHRpbmZvLT5vZmZzZXQ7CisJbWVtY3B5KGlvY2VsbF9vcHRzLCBhaGQtPmlvY2VsbF9vcHRzLCBzaXplb2YoYWhkLT5pb2NlbGxfb3B0cykpOyAKKwlwcHJfb3B0cyA9IHRpbmZvLT5wcHJfb3B0aW9ucyAmIChNU0dfRVhUX1BQUl9RQVNfUkVRfE1TR19FWFRfUFBSX0RUX1JFUQorCQkJCQl8TVNHX0VYVF9QUFJfSVVfUkVRfE1TR19FWFRfUFBSX1JUSSk7CisJY29uX29wdHMgPSAwOworCWlmIChwZXJpb2QgPT0gMCkKKwkJcGVyaW9kID0gQUhEX1NZTkNSQVRFX0FTWU5DOworCWlmIChwZXJpb2QgPT0gQUhEX1NZTkNSQVRFXzE2MCkgeworCisJCWlmICgoYWhkLT5idWdzICYgQUhEX1BBQ0VEX05FR1RBQkxFX0JVRykgIT0gMCkgeworCQkJLyoKKwkJCSAqIFdoZW4gdGhlIFNQSTQgc3BlYyB3YXMgZmluYWxpemVkLCBQQUNFIHRyYW5zZmVycworCQkJICogd2FzIG5vdCBtYWRlIGEgY29uZmlndXJhYmxlIG9wdGlvbiBpbiB0aGUgUFBSCisJCQkgKiBtZXNzYWdlLiAgSW5zdGVhZCBpdCBpcyBhc3N1bWVkIHRvIGJlIGVuYWJsZWQgZm9yCisJCQkgKiBhbnkgc3luY3JhdGUgZmFzdGVyIHRoYW4gODBNSHouICBOZXZlcnRoZWxlc3MsCisJCQkgKiBIYXJwb29uMkE0IGFsbG93cyB0aGlzIHRvIGJlIGNvbmZpZ3VyYWJsZS4KKwkJCSAqCisJCQkgKiBIYXJwb29uMkE0IGFsc28gYXNzdW1lcyBhdCBtb3N0IDIgZGF0YSBieXRlcyBwZXIKKwkJCSAqIG5lZ290aWF0ZWQgUkVRL0FDSyBvZmZzZXQuICBQYWNlZCB0cmFuc2ZlcnMgdGFrZQorCQkJICogNCwgc28gd2UgbXVzdCBhZGp1c3Qgb3VyIG9mZnNldC4KKwkJCSAqLworCQkJcHByX29wdHMgfD0gUFBST1BUX1BBQ0U7CisJCQlvZmZzZXQgKj0gMjsKKworCQkJLyoKKwkJCSAqIEhhcnBvb24yQSBhc3N1bWVkIHRoYXQgdGhlcmUgd291bGQgYmUgYQorCQkJICogZmFsbGJhY2sgcmF0ZSBiZXR3ZWVuIDE2ME1IeiBhbmQgODBNaHosCisJCQkgKiBzbyA3IGlzIHVzZWQgYXMgdGhlIHBlcmlvZCBmYWN0b3IgcmF0aGVyCisJCQkgKiB0aGFuIDggZm9yIDE2ME1Iei4KKwkJCSAqLworCQkJcGVyaW9kID0gQUhEX1NZTkNSQVRFX1JFVkFfMTYwOworCQl9CisJCWlmICgodGluZm8tPnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfUENPTVBfRU4pID09IDApCisJCQlpb2NlbGxfb3B0c1tBSERfUFJFQ09NUF9TTEVXX0lOREVYXSAmPQorCQkJICAgIH5BSERfUFJFQ09NUF9NQVNLOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFByZWNvbXAgc2hvdWxkIGJlIGRpc2FibGVkIGZvciBub24tcGFjZWQgdHJhbnNmZXJzLgorCQkgKi8KKwkJaW9jZWxsX29wdHNbQUhEX1BSRUNPTVBfU0xFV19JTkRFWF0gJj0gfkFIRF9QUkVDT01QX01BU0s7CisKKwkJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX05FV19JT0NFTExfT1BUUykgIT0gMAorCQkgJiYgKHBwcl9vcHRzICYgTVNHX0VYVF9QUFJfRFRfUkVRKSAhPSAwKSB7CisJCQkvKgorCQkJICogU2xvdyBkb3duIG91ciBDUkMgaW50ZXJ2YWwgdG8gYmUKKwkJCSAqIGNvbXBhdGlibGUgd2l0aCBkZXZpY2VzIHRoYXQgY2FuJ3QKKwkJCSAqIGhhbmRsZSBhIENSQyBhdCBmdWxsIHNwZWVkLgorCQkJICovCisJCQljb25fb3B0cyB8PSBFTlNMT1dDUkM7CisJCX0KKwl9CisKKwlhaGRfb3V0YihhaGQsIEFOTkVYQ09MLCBBSERfQU5ORVhDT0xfUFJFQ09NUF9TTEVXKTsKKwlhaGRfb3V0YihhaGQsIEFOTkVYREFULCBpb2NlbGxfb3B0c1tBSERfUFJFQ09NUF9TTEVXX0lOREVYXSk7CisJYWhkX291dGIoYWhkLCBBTk5FWENPTCwgQUhEX0FOTkVYQ09MX0FNUExJVFVERSk7CisJYWhkX291dGIoYWhkLCBBTk5FWERBVCwgaW9jZWxsX29wdHNbQUhEX0FNUExJVFVERV9JTkRFWF0pOworCisJYWhkX291dGIoYWhkLCBORUdQRVJJT0QsIHBlcmlvZCk7CisJYWhkX291dGIoYWhkLCBORUdQUFJPUFRTLCBwcHJfb3B0cyk7CisJYWhkX291dGIoYWhkLCBORUdPRkZTRVQsIG9mZnNldCk7CisKKwlpZiAodGluZm8tPndpZHRoID09IE1TR19FWFRfV0RUUl9CVVNfMTZfQklUKQorCQljb25fb3B0cyB8PSBXSURFWEZFUjsKKworCS8qCisJICogRHVyaW5nIHBhY2tldGl6ZWQgdHJhbnNmZXJzLCB0aGUgdGFyZ2V0IHdpbGwKKwkgKiBnaXZlIHVzIHRoZSBvcG9ydHVuaXR5IHRvIHNlbmQgY29tbWFuZCBwYWNrZXRzCisJICogd2l0aG91dCB1cyBhc3NlcnRpbmcgYXR0ZW50aW9uLgorCSAqLworCWlmICgodGluZm8tPnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfSVVfUkVRKSA9PSAwKQorCQljb25fb3B0cyB8PSBFTkFVVE9BVE5POworCWFoZF9vdXRiKGFoZCwgTkVHQ09OT1BUUywgY29uX29wdHMpOworCWFoZF9vdXRiKGFoZCwgTkVHT0FERFIsIHNhdmVkX25lZ29hZGRyKTsKKwlhaGRfcmVzdG9yZV9tb2RlcyhhaGQsIHNhdmVkX21vZGVzKTsKK30KKworLyoKKyAqIFdoZW4gdGhlIHRyYW5zZmVyIHNldHRpbmdzIGZvciBhIGNvbm5lY3Rpb24gY2hhbmdlLCBzZXR1cCBmb3IKKyAqIG5lZ290aWF0aW9uIGluIHBlbmRpbmcgU0NCcyB0byBlZmZlY3QgdGhlIGNoYW5nZSBhcyBxdWlja2x5IGFzCisgKiBwb3NzaWJsZS4gIFdlIGFsc28gY2FuY2VsIGFueSBuZWdvdGlhdGlvbnMgdGhhdCBhcmUgc2NoZWR1bGVkCisgKiBmb3IgaW5mbGlnaHQgU0NCcyB0aGF0IGhhdmUgbm90IGJlZW4gc3RhcnRlZCB5ZXQuCisgKi8KK3N0YXRpYyB2b2lkCithaGRfdXBkYXRlX3BlbmRpbmdfc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJc3RydWN0CQlzY2IgKnBlbmRpbmdfc2NiOworCWludAkJcGVuZGluZ19zY2JfY291bnQ7CisJdV9pbnQJCXNjYl90YWc7CisJaW50CQlwYXVzZWQ7CisJdV9pbnQJCXNhdmVkX3NjYnB0cjsKKwlhaGRfbW9kZV9zdGF0ZQlzYXZlZF9tb2RlczsKKworCS8qCisJICogVHJhdmVyc2UgdGhlIHBlbmRpbmcgU0NCIGxpc3QgYW5kIGVuc3VyZSB0aGF0IGFsbCBvZiB0aGUKKwkgKiBTQ0JzIHRoZXJlIGhhdmUgdGhlIHByb3BlciBzZXR0aW5ncy4gIFdlIGNhbiBvbmx5IHNhZmVseQorCSAqIGNsZWFyIHRoZSBuZWdvdGlhdGlvbiByZXF1aXJlZCBmbGFnIChzZXR0aW5nIHJlcXVpcmVzIHRoZQorCSAqIGV4ZWN1dGlvbiBxdWV1ZSB0byBiZSBtb2RpZmllZCkgYW5kIHRoaXMgaXMgb25seSBwb3NzaWJsZQorCSAqIGlmIHdlIGFyZSBub3QgYWxyZWFkeSBhdHRlbXB0aW5nIHRvIHNlbGVjdCBvdXQgZm9yIHRoaXMKKwkgKiBTQ0IuICBGb3IgdGhpcyByZWFzb24sIGFsbCBjYWxsZXJzIG9ubHkgY2FsbCB0aGlzIHJvdXRpbmUKKwkgKiBpZiB3ZSBhcmUgY2hhbmdpbmcgdGhlIG5lZ290aWF0aW9uIHNldHRpbmdzIGZvciB0aGUgY3VycmVudGx5CisJICogYWN0aXZlIHRyYW5zYWN0aW9uIG9uIHRoZSBidXMuCisJICovCisJcGVuZGluZ19zY2JfY291bnQgPSAwOworCUxJU1RfRk9SRUFDSChwZW5kaW5nX3NjYiwgJmFoZC0+cGVuZGluZ19zY2JzLCBwZW5kaW5nX2xpbmtzKSB7CisJCXN0cnVjdCBhaGRfZGV2aW5mbyBkZXZpbmZvOworCQlzdHJ1Y3QgaGFyZHdhcmVfc2NiICpwZW5kaW5nX2hzY2I7CisJCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwkJc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKworCQlhaGRfc2NiX2RldmluZm8oYWhkLCAmZGV2aW5mbywgcGVuZGluZ19zY2IpOworCQl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCBkZXZpbmZvLmNoYW5uZWwsCisJCQkJCSAgICBkZXZpbmZvLm91cl9zY3NpaWQsCisJCQkJCSAgICBkZXZpbmZvLnRhcmdldCwgJnRzdGF0ZSk7CisJCXBlbmRpbmdfaHNjYiA9IHBlbmRpbmdfc2NiLT5oc2NiOworCQlpZiAoKHRzdGF0ZS0+YXV0b19uZWdvdGlhdGUgJiBkZXZpbmZvLnRhcmdldF9tYXNrKSA9PSAwCisJCSAmJiAocGVuZGluZ19zY2ItPmZsYWdzICYgU0NCX0FVVE9fTkVHT1RJQVRFKSAhPSAwKSB7CisJCQlwZW5kaW5nX3NjYi0+ZmxhZ3MgJj0gflNDQl9BVVRPX05FR09USUFURTsKKwkJCXBlbmRpbmdfaHNjYi0+Y29udHJvbCAmPSB+TUtfTUVTU0FHRTsKKwkJfQorCQlhaGRfc3luY19zY2IoYWhkLCBwZW5kaW5nX3NjYiwKKwkJCSAgICAgQlVTX0RNQVNZTkNfUFJFUkVBRHxCVVNfRE1BU1lOQ19QUkVXUklURSk7CisJCXBlbmRpbmdfc2NiX2NvdW50Kys7CisJfQorCisJaWYgKHBlbmRpbmdfc2NiX2NvdW50ID09IDApCisJCXJldHVybjsKKworCWlmIChhaGRfaXNfcGF1c2VkKGFoZCkpIHsKKwkJcGF1c2VkID0gMTsKKwl9IGVsc2UgeworCQlwYXVzZWQgPSAwOworCQlhaGRfcGF1c2UoYWhkKTsKKwl9CisKKwkvKgorCSAqIEZvcmNlIHRoZSBzZXF1ZW5jZXIgdG8gcmVpbml0aWFsaXplIHRoZSBzZWxlY3Rpb24gZm9yCisJICogdGhlIGNvbW1hbmQgYXQgdGhlIGhlYWQgb2YgdGhlIGV4ZWN1dGlvbiBxdWV1ZSBpZiBpdAorCSAqIGhhcyBhbHJlYWR5IGJlZW4gc2V0dXAuICBUaGUgbmVnb3RpYXRpb24gY2hhbmdlcyBtYXkKKwkgKiBlZmZlY3Qgd2hldGhlciB3ZSBzZWxlY3Qtb3V0IHdpdGggQVROLgorCSAqLworCXNhdmVkX21vZGVzID0gYWhkX3NhdmVfbW9kZXMoYWhkKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJYWhkX291dGIoYWhkLCBTQ1NJU0VRMCwgYWhkX2luYihhaGQsIFNDU0lTRVEwKSAmIH5FTlNFTE8pOworCXNhdmVkX3NjYnB0ciA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJLyogRW5zdXJlIHRoYXQgdGhlIGhzY2JzIGRvd24gb24gdGhlIGNhcmQgbWF0Y2ggdGhlIG5ldyBpbmZvcm1hdGlvbiAqLworCWZvciAoc2NiX3RhZyA9IDA7IHNjYl90YWcgPCBhaGQtPnNjYl9kYXRhLm1heGhzY2JzOyBzY2JfdGFnKyspIHsKKwkJc3RydWN0CWhhcmR3YXJlX3NjYiAqcGVuZGluZ19oc2NiOworCQl1X2ludAljb250cm9sOworCisJCXBlbmRpbmdfc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JfdGFnKTsKKwkJaWYgKHBlbmRpbmdfc2NiID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJYWhkX3NldF9zY2JwdHIoYWhkLCBzY2JfdGFnKTsKKwkJcGVuZGluZ19oc2NiID0gcGVuZGluZ19zY2ItPmhzY2I7CisJCWNvbnRyb2wgPSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9DT05UUk9MKTsKKwkJY29udHJvbCAmPSB+TUtfTUVTU0FHRTsKKwkJY29udHJvbCB8PSBwZW5kaW5nX2hzY2ItPmNvbnRyb2wgJiBNS19NRVNTQUdFOworCQlhaGRfb3V0YihhaGQsIFNDQl9DT05UUk9MLCBjb250cm9sKTsKKwl9CisJYWhkX3NldF9zY2JwdHIoYWhkLCBzYXZlZF9zY2JwdHIpOworCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOworCisJaWYgKHBhdXNlZCA9PSAwKQorCQlhaGRfdW5wYXVzZShhaGQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQYXRoaW5nIEluZm9ybWF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FoZF9mZXRjaF9kZXZpbmZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKQoreworCWFoZF9tb2RlX3N0YXRlCXNhdmVkX21vZGVzOworCXVfaW50CQlzYXZlZF9zY3NpaWQ7CisJcm9sZV90CQlyb2xlOworCWludAkJb3VyX2lkOworCisJc2F2ZWRfbW9kZXMgPSBhaGRfc2F2ZV9tb2RlcyhhaGQpOworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKworCWlmIChhaGRfaW5iKGFoZCwgU1NUQVQwKSAmIFRBUkdFVCkKKwkJcm9sZSA9IFJPTEVfVEFSR0VUOworCWVsc2UKKwkJcm9sZSA9IFJPTEVfSU5JVElBVE9SOworCisJaWYgKHJvbGUgPT0gUk9MRV9UQVJHRVQKKwkgJiYgKGFoZF9pbmIoYWhkLCBTRVFfRkxBR1MpICYgQ01EUEhBU0VfUEVORElORykgIT0gMCkgeworCQkvKiBXZSB3ZXJlIHNlbGVjdGVkLCBzbyBwdWxsIG91ciBpZCBmcm9tIFRBUkdJRElOICovCisJCW91cl9pZCA9IGFoZF9pbmIoYWhkLCBUQVJHSURJTikgJiBPSUQ7CisJfSBlbHNlIGlmIChyb2xlID09IFJPTEVfVEFSR0VUKQorCQlvdXJfaWQgPSBhaGRfaW5iKGFoZCwgVE9XTklEKTsKKwllbHNlCisJCW91cl9pZCA9IGFoZF9pbmIoYWhkLCBJT1dOSUQpOworCisJc2F2ZWRfc2NzaWlkID0gYWhkX2luYihhaGQsIFNBVkVEX1NDU0lJRCk7CisJYWhkX2NvbXBpbGVfZGV2aW5mbyhkZXZpbmZvLAorCQkJICAgIG91cl9pZCwKKwkJCSAgICBTQ1NJSURfVEFSR0VUKGFoZCwgc2F2ZWRfc2NzaWlkKSwKKwkJCSAgICBhaGRfaW5iKGFoZCwgU0FWRURfTFVOKSwKKwkJCSAgICBTQ1NJSURfQ0hBTk5FTChhaGQsIHNhdmVkX3Njc2lpZCksCisJCQkgICAgcm9sZSk7CisJYWhkX3Jlc3RvcmVfbW9kZXMoYWhkLCBzYXZlZF9tb2Rlcyk7Cit9CisKK3ZvaWQKK2FoZF9wcmludF9kZXZpbmZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKQoreworCXByaW50ZigiJXM6JWM6JWQ6JWQ6ICIsIGFoZF9uYW1lKGFoZCksICdBJywKKwkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOworfQorCitzdHJ1Y3QgYWhkX3BoYXNlX3RhYmxlX2VudHJ5KgorYWhkX2xvb2t1cF9waGFzZV9lbnRyeShpbnQgcGhhc2UpCit7CisJc3RydWN0IGFoZF9waGFzZV90YWJsZV9lbnRyeSAqZW50cnk7CisJc3RydWN0IGFoZF9waGFzZV90YWJsZV9lbnRyeSAqbGFzdF9lbnRyeTsKKworCS8qCisJICogbnVtX3BoYXNlcyBkb2Vzbid0IGluY2x1ZGUgdGhlIGRlZmF1bHQgZW50cnkgd2hpY2gKKwkgKiB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBwaGFzZSBkb2Vzbid0IG1hdGNoLgorCSAqLworCWxhc3RfZW50cnkgPSAmYWhkX3BoYXNlX3RhYmxlW251bV9waGFzZXNdOworCWZvciAoZW50cnkgPSBhaGRfcGhhc2VfdGFibGU7IGVudHJ5IDwgbGFzdF9lbnRyeTsgZW50cnkrKykgeworCQlpZiAocGhhc2UgPT0gZW50cnktPnBoYXNlKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAoZW50cnkpOworfQorCit2b2lkCithaGRfY29tcGlsZV9kZXZpbmZvKHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywgdV9pbnQgb3VyX2lkLCB1X2ludCB0YXJnZXQsCisJCSAgICB1X2ludCBsdW4sIGNoYXIgY2hhbm5lbCwgcm9sZV90IHJvbGUpCit7CisJZGV2aW5mby0+b3VyX3Njc2lpZCA9IG91cl9pZDsKKwlkZXZpbmZvLT50YXJnZXQgPSB0YXJnZXQ7CisJZGV2aW5mby0+bHVuID0gbHVuOworCWRldmluZm8tPnRhcmdldF9vZmZzZXQgPSB0YXJnZXQ7CisJZGV2aW5mby0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJZGV2aW5mby0+cm9sZSA9IHJvbGU7CisJaWYgKGNoYW5uZWwgPT0gJ0InKQorCQlkZXZpbmZvLT50YXJnZXRfb2Zmc2V0ICs9IDg7CisJZGV2aW5mby0+dGFyZ2V0X21hc2sgPSAoMHgwMSA8PCBkZXZpbmZvLT50YXJnZXRfb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9zY2JfZGV2aW5mbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkJc3RydWN0IHNjYiAqc2NiKQoreworCXJvbGVfdAlyb2xlOworCWludAlvdXJfaWQ7CisKKwlvdXJfaWQgPSBTQ1NJSURfT1VSX0lEKHNjYi0+aHNjYi0+c2NzaWlkKTsKKwlyb2xlID0gUk9MRV9JTklUSUFUT1I7CisJaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiBUQVJHRVRfU0NCKSAhPSAwKQorCQlyb2xlID0gUk9MRV9UQVJHRVQ7CisJYWhkX2NvbXBpbGVfZGV2aW5mbyhkZXZpbmZvLCBvdXJfaWQsIFNDQl9HRVRfVEFSR0VUKGFoZCwgc2NiKSwKKwkJCSAgICBTQ0JfR0VUX0xVTihzY2IpLCBTQ0JfR0VUX0NIQU5ORUwoYWhkLCBzY2IpLCByb2xlKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqIE1lc3NhZ2UgUGhhc2UgUHJvY2Vzc2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFdoZW4gYW4gaW5pdGlhdG9yIHRyYW5zYWN0aW9uIHdpdGggdGhlIE1LX01FU1NBR0UgZmxhZyBlaXRoZXIgcmVjb25uZWN0cworICogb3IgZW50ZXJzIHRoZSBpbml0aWFsIG1lc3NhZ2Ugb3V0IHBoYXNlLCB3ZSBhcmUgaW50ZXJydXB0ZWQuICBGaWxsIG91cgorICogb3V0Z29pbmcgbWVzc2FnZSBidWZmZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnZSBhbmQgYmVnaW5nIGhhbmRpbmcKKyAqIHRoZSBtZXNzYWdlIHBoYXNlKHMpIG1hbnVhbGx5LgorICovCitzdGF0aWMgdm9pZAorYWhkX3NldHVwX2luaXRpYXRvcl9tc2dvdXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQkgICBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJLyoKKwkgKiBUbyBmYWNpbGl0YXRlIGFkZGluZyBtdWx0aXBsZSBtZXNzYWdlcyB0b2dldGhlciwKKwkgKiBlYWNoIHJvdXRpbmUgc2hvdWxkIGluY3JlbWVudCB0aGUgaW5kZXggYW5kIGxlbgorCSAqIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIHNldHRpbmcgdGhlbSBleHBsaWNpdGx5LgorCSAqLworCWFoZC0+bXNnb3V0X2luZGV4ID0gMDsKKwlhaGQtPm1zZ291dF9sZW4gPSAwOworCisJaWYgKGFoZF9jdXJyZW50bHlfcGFja2V0aXplZChhaGQpKQorCQlhaGQtPm1zZ19mbGFncyB8PSBNU0dfRkxBR19QQUNLRVRJWkVEOworCisJaWYgKGFoZC0+c2VuZF9tc2dfcGVycm9yCisJICYmIGFoZF9pbmIoYWhkLCBNU0dfT1VUKSA9PSBIT1NUX01TRykgeworCQlhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10gPSBhaGQtPnNlbmRfbXNnX3BlcnJvcjsKKwkJYWhkLT5tc2dvdXRfbGVuKys7CisJCWFoZC0+bXNnX3R5cGUgPSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHT1VUOworI2lmZGVmIEFIRF9ERUJVRworCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKQorCQkJcHJpbnRmKCJTZXR0aW5nIHVwIGZvciBQYXJpdHkgRXJyb3IgZGVsaXZlcnlcbiIpOworI2VuZGlmCisJCXJldHVybjsKKwl9IGVsc2UgaWYgKHNjYiA9PSBOVUxMKSB7CisJCXByaW50ZigiJXM6IFdBUk5JTkcuIE5vIHBlbmRpbmcgbWVzc2FnZSBmb3IgIgorCQkgICAgICAgIklfVCBtc2dpbi4gIElzc3VpbmcgTk8tT1BcbiIsIGFoZF9uYW1lKGFoZCkpOworCQlhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10gPSBNU0dfTk9PUDsKKwkJYWhkLT5tc2dvdXRfbGVuKys7CisJCWFoZC0+bXNnX3R5cGUgPSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHT1VUOworCQlyZXR1cm47CisJfQorCisJaWYgKChzY2ItPmZsYWdzICYgU0NCX0RFVklDRV9SRVNFVCkgPT0gMAorCSAmJiAoc2NiLT5mbGFncyAmIFNDQl9QQUNLRVRJWkVEKSA9PSAwCisJICYmIGFoZF9pbmIoYWhkLCBNU0dfT1VUKSA9PSBNU0dfSURFTlRJRllGTEFHKSB7CisJCXVfaW50IGlkZW50aWZ5X21zZzsKKworCQlpZGVudGlmeV9tc2cgPSBNU0dfSURFTlRJRllGTEFHIHwgU0NCX0dFVF9MVU4oc2NiKTsKKwkJaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiBESVNDRU5CKSAhPSAwKQorCQkJaWRlbnRpZnlfbXNnIHw9IE1TR19JREVOVElGWV9ESVNDRkxBRzsKKwkJYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4KytdID0gaWRlbnRpZnlfbXNnOworCQlhaGQtPm1zZ291dF9sZW4rKzsKKworCQlpZiAoKHNjYi0+aHNjYi0+Y29udHJvbCAmIFRBR19FTkIpICE9IDApIHsKKwkJCWFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSA9CisJCQkgICAgc2NiLT5oc2NiLT5jb250cm9sICYgKFRBR19FTkJ8U0NCX1RBR19UWVBFKTsKKwkJCWFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSA9IFNDQl9HRVRfVEFHKHNjYik7CisJCQlhaGQtPm1zZ291dF9sZW4gKz0gMjsKKwkJfQorCX0KKworCWlmIChzY2ItPmZsYWdzICYgU0NCX0RFVklDRV9SRVNFVCkgeworCQlhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10gPSBNU0dfQlVTX0RFVl9SRVNFVDsKKwkJYWhkLT5tc2dvdXRfbGVuKys7CisJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJcHJpbnRmKCJCdXMgRGV2aWNlIFJlc2V0IE1lc3NhZ2UgU2VudFxuIik7CisJCS8qCisJCSAqIENsZWFyIG91ciBzZWxlY3Rpb24gaGFyZHdhcmUgaW4gYWR2YW5jZSBvZgorCQkgKiB0aGUgYnVzZnJlZS4gIFdlIG1heSBoYXZlIGFuIGVudHJ5IGluIHRoZSB3YWl0aW5nCisJCSAqIFEgZm9yIHRoaXMgdGFyZ2V0LCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBnbyBhYm91dAorCQkgKiBzZWxlY3Rpbmcgd2hpbGUgd2UgaGFuZGxlIHRoZSBidXNmcmVlIGFuZCBibG93IGl0CisJCSAqIGF3YXkuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIFNDU0lTRVEwLCAwKTsKKwl9IGVsc2UgaWYgKChzY2ItPmZsYWdzICYgU0NCX0FCT1JUKSAhPSAwKSB7CisKKwkJaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiBUQUdfRU5CKSAhPSAwKSB7CisJCQlhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10gPSBNU0dfQUJPUlRfVEFHOworCQl9IGVsc2UgeworCQkJYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4KytdID0gTVNHX0FCT1JUOworCQl9CisJCWFoZC0+bXNnb3V0X2xlbisrOworCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCXByaW50ZigiQWJvcnQlcyBNZXNzYWdlIFNlbnRcbiIsCisJCSAgICAgICAoc2NiLT5oc2NiLT5jb250cm9sICYgVEFHX0VOQikgIT0gMCA/ICIgVGFnIiA6ICIiKTsKKwkJLyoKKwkJICogQ2xlYXIgb3VyIHNlbGVjdGlvbiBoYXJkd2FyZSBpbiBhZHZhbmNlIG9mCisJCSAqIHRoZSBidXNmcmVlLiAgV2UgbWF5IGhhdmUgYW4gZW50cnkgaW4gdGhlIHdhaXRpbmcKKwkJICogUSBmb3IgdGhpcyB0YXJnZXQsIGFuZCB3ZSBkb24ndCB3YW50IHRvIGdvIGFib3V0CisJCSAqIHNlbGVjdGluZyB3aGlsZSB3ZSBoYW5kbGUgdGhlIGJ1c2ZyZWUgYW5kIGJsb3cgaXQKKwkJICogYXdheS4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTAsIDApOworCX0gZWxzZSBpZiAoKHNjYi0+ZmxhZ3MgJiAoU0NCX0FVVE9fTkVHT1RJQVRFfFNDQl9ORUdPVElBVEUpKSAhPSAwKSB7CisJCWFoZF9idWlsZF90cmFuc2Zlcl9tc2coYWhkLCBkZXZpbmZvKTsKKwkJLyoKKwkJICogQ2xlYXIgb3VyIHNlbGVjdGlvbiBoYXJkd2FyZSBpbiBhZHZhbmNlIG9mIHBvdGVudGlhbAorCQkgKiBQUFIgSVUgc3RhdHVzIGNoYW5nZSBidXNmcmVlLiAgV2UgbWF5IGhhdmUgYW4gZW50cnkgaW4KKwkJICogdGhlIHdhaXRpbmcgUSBmb3IgdGhpcyB0YXJnZXQsIGFuZCB3ZSBkb24ndCB3YW50IHRvIGdvCisJCSAqIGFib3V0IHNlbGVjdGluZyB3aGlsZSB3ZSBoYW5kbGUgdGhlIGJ1c2ZyZWUgYW5kIGJsb3cKKwkJICogaXQgYXdheS4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTAsIDApOworCX0gZWxzZSB7CisJCXByaW50ZigiYWhkX2ludHI6IEFXQUlUSU5HX01TRyBmb3IgYW4gU0NCIHRoYXQgIgorCQkgICAgICAgImRvZXMgbm90IGhhdmUgYSB3YWl0aW5nIG1lc3NhZ2VcbiIpOworCQlwcmludGYoIlNDU0lJRCA9ICV4LCB0YXJnZXRfbWFzayA9ICV4XG4iLCBzY2ItPmhzY2ItPnNjc2lpZCwKKwkJICAgICAgIGRldmluZm8tPnRhcmdldF9tYXNrKTsKKwkJcGFuaWMoIlNDQiA9ICVkLCBTQ0IgQ29udHJvbCA9ICV4OiV4LCBNU0dfT1VUID0gJXggIgorCQkgICAgICAiU0NCIGZsYWdzID0gJXgiLCBTQ0JfR0VUX1RBRyhzY2IpLCBzY2ItPmhzY2ItPmNvbnRyb2wsCisJCSAgICAgIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0NPTlRST0wpLCBhaGRfaW5iKGFoZCwgTVNHX09VVCksCisJCSAgICAgIHNjYi0+ZmxhZ3MpOworCX0KKworCS8qCisJICogQ2xlYXIgdGhlIE1LX01FU1NBR0UgZmxhZyBmcm9tIHRoZSBTQ0Igc28gd2UgYXJlbid0CisJICogYXNrZWQgdG8gc2VuZCB0aGlzIG1lc3NhZ2UgYWdhaW4uCisJICovCisJYWhkX291dGIoYWhkLCBTQ0JfQ09OVFJPTCwKKwkJIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0NPTlRST0wpICYgfk1LX01FU1NBR0UpOworCXNjYi0+aHNjYi0+Y29udHJvbCAmPSB+TUtfTUVTU0FHRTsKKwlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJYWhkLT5tc2dfdHlwZSA9IE1TR19UWVBFX0lOSVRJQVRPUl9NU0dPVVQ7Cit9CisKKy8qCisgKiBCdWlsZCBhbiBhcHByb3ByaWF0ZSB0cmFuc2ZlciBuZWdvdGlhdGlvbiBtZXNzYWdlIGZvciB0aGUKKyAqIGN1cnJlbnRseSBhY3RpdmUgdGFyZ2V0LgorICovCitzdGF0aWMgdm9pZAorYWhkX2J1aWxkX3RyYW5zZmVyX21zZyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbykKK3sKKwkvKgorCSAqIFdlIG5lZWQgdG8gaW5pdGlhdGUgdHJhbnNmZXIgbmVnb3RpYXRpb25zLgorCSAqIElmIG91ciBjdXJyZW50IGFuZCBnb2FsIHNldHRpbmdzIGFyZSBpZGVudGljYWwsCisJICogd2Ugd2FudCB0byByZW5lZ290aWF0ZSBkdWUgdG8gYSBjaGVjayBjb25kaXRpb24uCisJICovCisJc3RydWN0CWFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCXN0cnVjdAlhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJaW50CWRvd2lkZTsKKwlpbnQJZG9zeW5jOworCWludAlkb3BwcjsKKwl1X2ludAlwZXJpb2Q7CisJdV9pbnQJcHByX29wdGlvbnM7CisJdV9pbnQJb2Zmc2V0OworCisJdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+b3VyX3Njc2lpZCwKKwkJCQkgICAgZGV2aW5mby0+dGFyZ2V0LCAmdHN0YXRlKTsKKwkvKgorCSAqIEZpbHRlciBvdXIgcGVyaW9kIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24uCisJICogSWYgd2UgY2FuJ3QgcGVyZm9ybSBEVCB0cmFuc2ZlcnMgb24gdGhpcyBzZWdtZW50IChub3QgaW4gTFZECisJICogbW9kZSBmb3IgaW5zdGFuY2UpLCB0aGVuIG91ciBkZWNpc2lvbiB0byBpc3N1ZSBhIFBQUiBtZXNzYWdlCisJICogbWF5IGNoYW5nZS4KKwkgKi8KKwlwZXJpb2QgPSB0aW5mby0+Z29hbC5wZXJpb2Q7CisJb2Zmc2V0ID0gdGluZm8tPmdvYWwub2Zmc2V0OworCXBwcl9vcHRpb25zID0gdGluZm8tPmdvYWwucHByX29wdGlvbnM7CisJLyogVGFyZ2V0IGluaXRpYXRlZCBQUFIgaXMgbm90IGFsbG93ZWQgaW4gdGhlIFNDU0kgc3BlYyAqLworCWlmIChkZXZpbmZvLT5yb2xlID09IFJPTEVfVEFSR0VUKQorCQlwcHJfb3B0aW9ucyA9IDA7CisJYWhkX2RldmxpbWl0ZWRfc3luY3JhdGUoYWhkLCB0aW5mbywgJnBlcmlvZCwKKwkJCQkmcHByX29wdGlvbnMsIGRldmluZm8tPnJvbGUpOworCWRvd2lkZSA9IHRpbmZvLT5jdXJyLndpZHRoICE9IHRpbmZvLT5nb2FsLndpZHRoOworCWRvc3luYyA9IHRpbmZvLT5jdXJyLm9mZnNldCAhPSBvZmZzZXQgfHwgdGluZm8tPmN1cnIucGVyaW9kICE9IHBlcmlvZDsKKwkvKgorCSAqIE9ubHkgdXNlIFBQUiBpZiB3ZSBoYXZlIG9wdGlvbnMgdGhhdCBuZWVkIGl0LCBldmVuIGlmIHRoZSBkZXZpY2UKKwkgKiBjbGFpbXMgdG8gc3VwcG9ydCBpdC4gIFRoZXJlIG1pZ2h0IGJlIGFuIGV4cGFuZGVyIGluIHRoZSB3YXkKKwkgKiB0aGF0IGRvZXNuJ3QuCisJICovCisJZG9wcHIgPSBwcHJfb3B0aW9ucyAhPSAwOworCisJaWYgKCFkb3dpZGUgJiYgIWRvc3luYyAmJiAhZG9wcHIpIHsKKwkJZG93aWRlID0gdGluZm8tPmdvYWwud2lkdGggIT0gTVNHX0VYVF9XRFRSX0JVU184X0JJVDsKKwkJZG9zeW5jID0gdGluZm8tPmdvYWwub2Zmc2V0ICE9IDA7CisJfQorCisJaWYgKCFkb3dpZGUgJiYgIWRvc3luYyAmJiAhZG9wcHIpIHsKKwkJLyoKKwkJICogRm9yY2UgYXN5bmMgd2l0aCBhIFdEVFIgbWVzc2FnZSBpZiB3ZSBoYXZlIGEgd2lkZSBidXMsCisJCSAqIG9yIGp1c3QgaXNzdWUgYW4gU0RUUiB3aXRoIGEgMCBvZmZzZXQuCisJCSAqLworCQlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfV0lERSkgIT0gMCkKKwkJCWRvd2lkZSA9IDE7CisJCWVsc2UKKwkJCWRvc3luYyA9IDE7CisKKwkJaWYgKGJvb3R2ZXJib3NlKSB7CisJCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOworCQkJcHJpbnRmKCJFbnN1cmluZyBhc3luY1xuIik7CisJCX0KKwl9CisJLyogVGFyZ2V0IGluaXRpYXRlZCBQUFIgaXMgbm90IGFsbG93ZWQgaW4gdGhlIFNDU0kgc3BlYyAqLworCWlmIChkZXZpbmZvLT5yb2xlID09IFJPTEVfVEFSR0VUKQorCQlkb3BwciA9IDA7CisKKwkvKgorCSAqIEJvdGggdGhlIFBQUiBtZXNzYWdlIGFuZCBTRFRSIG1lc3NhZ2UgcmVxdWlyZSB0aGUKKwkgKiBnb2FsIHN5bmNyYXRlIHRvIGJlIGxpbWl0ZWQgdG8gd2hhdCB0aGUgdGFyZ2V0IGRldmljZQorCSAqIGlzIGNhcGFibGUgb2YgaGFuZGxpbmcgKGJhc2VkIG9uIHdoZXRoZXIgYW4gTFZELT5TRQorCSAqIGV4cGFuZGVyIGlzIG9uIHRoZSBidXMpLCBzbyBjb21iaW5lIHRoZXNlIHR3byBjYXNlcy4KKwkgKiBSZWdhcmRsZXNzLCBndWFyYW50ZWUgdGhhdCBpZiB3ZSBhcmUgdXNpbmcgV0RUUiBhbmQgU0RUUgorCSAqIG1lc3NhZ2VzIHRoYXQgV0RUUiBjb21lcyBmaXJzdC4KKwkgKi8KKwlpZiAoZG9wcHIgfHwgKGRvc3luYyAmJiAhZG93aWRlKSkgeworCisJCW9mZnNldCA9IHRpbmZvLT5nb2FsLm9mZnNldDsKKwkJYWhkX3ZhbGlkYXRlX29mZnNldChhaGQsIHRpbmZvLCBwZXJpb2QsICZvZmZzZXQsCisJCQkJICAgIGRvcHByID8gdGluZm8tPmdvYWwud2lkdGgKKwkJCQkJICA6IHRpbmZvLT5jdXJyLndpZHRoLAorCQkJCSAgICBkZXZpbmZvLT5yb2xlKTsKKwkJaWYgKGRvcHByKSB7CisJCQlhaGRfY29uc3RydWN0X3BwcihhaGQsIGRldmluZm8sIHBlcmlvZCwgb2Zmc2V0LAorCQkJCQkgIHRpbmZvLT5nb2FsLndpZHRoLCBwcHJfb3B0aW9ucyk7CisJCX0gZWxzZSB7CisJCQlhaGRfY29uc3RydWN0X3NkdHIoYWhkLCBkZXZpbmZvLCBwZXJpb2QsIG9mZnNldCk7CisJCX0KKwl9IGVsc2UgeworCQlhaGRfY29uc3RydWN0X3dkdHIoYWhkLCBkZXZpbmZvLCB0aW5mby0+Z29hbC53aWR0aCk7CisJfQorfQorCisvKgorICogQnVpbGQgYSBzeW5jaHJvbm91cyBuZWdvdGlhdGlvbiBtZXNzYWdlIGluIG91ciBtZXNzYWdlCisgKiBidWZmZXIgYmFzZWQgb24gdGhlIGlucHV0IHBhcmFtZXRlcnMuCisgKi8KK3N0YXRpYyB2b2lkCithaGRfY29uc3RydWN0X3NkdHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCSAgIHVfaW50IHBlcmlvZCwgdV9pbnQgb2Zmc2V0KQoreworCWlmIChvZmZzZXQgPT0gMCkKKwkJcGVyaW9kID0gQUhEX0FTWU5DX1hGRVJfUEVSSU9EOworCWFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSA9IE1TR19FWFRFTkRFRDsKKwlhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10gPSBNU0dfRVhUX1NEVFJfTEVOOworCWFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSA9IE1TR19FWFRfU0RUUjsKKwlhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10gPSBwZXJpb2Q7CisJYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4KytdID0gb2Zmc2V0OworCWFoZC0+bXNnb3V0X2xlbiArPSA1OworCWlmIChib290dmVyYm9zZSkgeworCQlwcmludGYoIiglczolYzolZDolZCk6IFNlbmRpbmcgU0RUUiBwZXJpb2QgJXgsIG9mZnNldCAleFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKKwkJICAgICAgIGRldmluZm8tPmx1biwgcGVyaW9kLCBvZmZzZXQpOworCX0KK30KKworLyoKKyAqIEJ1aWxkIGEgd2lkZSBuZWdvdGlhdGVpb24gbWVzc2FnZSBpbiBvdXIgbWVzc2FnZQorICogYnVmZmVyIGJhc2VkIG9uIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgdm9pZAorYWhkX2NvbnN0cnVjdF93ZHRyKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCQkgICB1X2ludCBidXNfd2lkdGgpCit7CisJYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4KytdID0gTVNHX0VYVEVOREVEOworCWFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSA9IE1TR19FWFRfV0RUUl9MRU47CisJYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4KytdID0gTVNHX0VYVF9XRFRSOworCWFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSA9IGJ1c193aWR0aDsKKwlhaGQtPm1zZ291dF9sZW4gKz0gNDsKKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBTZW5kaW5nIFdEVFIgJXhcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsCisJCSAgICAgICBkZXZpbmZvLT5sdW4sIGJ1c193aWR0aCk7CisJfQorfQorCisvKgorICogQnVpbGQgYSBwYXJhbGxlbCBwcm90b2NvbCByZXF1ZXN0IG1lc3NhZ2UgaW4gb3VyIG1lc3NhZ2UKKyAqIGJ1ZmZlciBiYXNlZCBvbiB0aGUgaW5wdXQgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIHZvaWQKK2FoZF9jb25zdHJ1Y3RfcHByKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCQkgIHVfaW50IHBlcmlvZCwgdV9pbnQgb2Zmc2V0LCB1X2ludCBidXNfd2lkdGgsCisJCSAgdV9pbnQgcHByX29wdGlvbnMpCit7CisJLyoKKwkgKiBBbHdheXMgcmVxdWVzdCBwcmVjb21wZW5zYXRpb24gZnJvbQorCSAqIHRoZSBvdGhlciB0YXJnZXQgaWYgd2UgYXJlIHJ1bm5pbmcKKwkgKiBhdCBwYWNlZCBzeW5jcmF0ZXMuCisJICovCisJaWYgKHBlcmlvZCA8PSBBSERfU1lOQ1JBVEVfUEFDRUQpCisJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX1BDT01QX0VOOworCWlmIChvZmZzZXQgPT0gMCkKKwkJcGVyaW9kID0gQUhEX0FTWU5DX1hGRVJfUEVSSU9EOworCWFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSA9IE1TR19FWFRFTkRFRDsKKwlhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10gPSBNU0dfRVhUX1BQUl9MRU47CisJYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4KytdID0gTVNHX0VYVF9QUFI7CisJYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4KytdID0gcGVyaW9kOworCWFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSA9IDA7CisJYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4KytdID0gb2Zmc2V0OworCWFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSA9IGJ1c193aWR0aDsKKwlhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10gPSBwcHJfb3B0aW9uczsKKwlhaGQtPm1zZ291dF9sZW4gKz0gODsKKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBTZW5kaW5nIFBQUiBidXNfd2lkdGggJXgsIHBlcmlvZCAleCwgIgorCQkgICAgICAgIm9mZnNldCAleCwgcHByX29wdGlvbnMgJXhcbiIsIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1biwKKwkJICAgICAgIGJ1c193aWR0aCwgcGVyaW9kLCBvZmZzZXQsIHBwcl9vcHRpb25zKTsKKwl9Cit9CisKKy8qCisgKiBDbGVhciBhbnkgYWN0aXZlIG1lc3NhZ2Ugc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkCithaGRfY2xlYXJfbXNnX3N0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlhaGRfbW9kZV9zdGF0ZSBzYXZlZF9tb2RlczsKKworCXNhdmVkX21vZGVzID0gYWhkX3NhdmVfbW9kZXMoYWhkKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJYWhkLT5zZW5kX21zZ19wZXJyb3IgPSAwOworCWFoZC0+bXNnX2ZsYWdzID0gTVNHX0ZMQUdfTk9ORTsKKwlhaGQtPm1zZ291dF9sZW4gPSAwOworCWFoZC0+bXNnaW5faW5kZXggPSAwOworCWFoZC0+bXNnX3R5cGUgPSBNU0dfVFlQRV9OT05FOworCWlmICgoYWhkX2luYihhaGQsIFNDU0lTSUdPKSAmIEFUTk8pICE9IDApIHsKKwkJLyoKKwkJICogVGhlIHRhcmdldCBkaWRuJ3QgY2FyZSB0byByZXNwb25kIHRvIG91cgorCQkgKiBtZXNzYWdlIHJlcXVlc3QsIHNvIGNsZWFyIEFUTi4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDEsIENMUkFUTk8pOworCX0KKwlhaGRfb3V0YihhaGQsIE1TR19PVVQsIE1TR19OT09QKTsKKwlhaGRfb3V0YihhaGQsIFNFUV9GTEFHUzIsCisJCSBhaGRfaW5iKGFoZCwgU0VRX0ZMQUdTMikgJiB+VEFSR0VUX01TR19QRU5ESU5HKTsKKwlhaGRfcmVzdG9yZV9tb2RlcyhhaGQsIHNhdmVkX21vZGVzKTsKK30KKworLyoKKyAqIE1hbnVhbCBtZXNzYWdlIGxvb3AgaGFuZGxlci4KKyAqLworc3RhdGljIHZvaWQKK2FoZF9oYW5kbGVfbWVzc2FnZV9waGFzZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7IAorCXN0cnVjdAlhaGRfZGV2aW5mbyBkZXZpbmZvOworCXVfaW50CWJ1c19waGFzZTsKKwlpbnQJZW5kX3Nlc3Npb247CisKKwlhaGRfZmV0Y2hfZGV2aW5mbyhhaGQsICZkZXZpbmZvKTsKKwllbmRfc2Vzc2lvbiA9IEZBTFNFOworCWJ1c19waGFzZSA9IGFoZF9pbmIoYWhkLCBMQVNUUEhBU0UpOworCisJaWYgKChhaGRfaW5iKGFoZCwgTFFJU1RBVDIpICYgTFFJUEhBU0VfT1VUUEtUKSAhPSAwKSB7CisJCXByaW50ZigiTFFJUkVUUlkgZm9yIExRSVBIQVNFX09VVFBLVFxuIik7CisJCWFoZF9vdXRiKGFoZCwgTFFDVEwyLCBMUUlSRVRSWSk7CisJfQorcmVzd2l0Y2g6CisJc3dpdGNoIChhaGQtPm1zZ190eXBlKSB7CisJY2FzZSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHT1VUOgorCXsKKwkJaW50IGxhc3RieXRlOworCQlpbnQgcGhhc2VtaXM7CisJCWludCBtc2dkb25lOworCisJCWlmIChhaGQtPm1zZ291dF9sZW4gPT0gMCAmJiBhaGQtPnNlbmRfbXNnX3BlcnJvciA9PSAwKQorCQkJcGFuaWMoIkhPU1RfTVNHX0xPT1AgaW50ZXJydXB0IHdpdGggbm8gYWN0aXZlIG1lc3NhZ2UiKTsKKworI2lmZGVmIEFIRF9ERUJVRworCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKSB7CisJCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsICZkZXZpbmZvKTsKKwkJCXByaW50ZigiSU5JVElBVE9SX01TR19PVVQiKTsKKwkJfQorI2VuZGlmCisJCXBoYXNlbWlzID0gYnVzX3BoYXNlICE9IFBfTUVTR09VVDsKKwkJaWYgKHBoYXNlbWlzKSB7CisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKSB7CisJCQkJcHJpbnRmKCIgUEhBU0VNSVMgJXNcbiIsCisJCQkJICAgICAgIGFoZF9sb29rdXBfcGhhc2VfZW50cnkoYnVzX3BoYXNlKQorCQkJCQkJCSAgICAgLT5waGFzZW1zZyk7CisJCQl9CisjZW5kaWYKKwkJCWlmIChidXNfcGhhc2UgPT0gUF9NRVNHSU4pIHsKKwkJCQkvKgorCQkJCSAqIENoYW5nZSBnZWFycyBhbmQgc2VlIGlmCisJCQkJICogdGhpcyBtZXNzYWdlcyBpcyBvZiBpbnRlcmVzdCB0bworCQkJCSAqIHVzIG9yIHNob3VsZCBiZSBwYXNzZWQgYmFjayB0bworCQkJCSAqIHRoZSBzZXF1ZW5jZXIuCisJCQkJICovCisJCQkJYWhkX291dGIoYWhkLCBDTFJTSU5UMSwgQ0xSQVROTyk7CisJCQkJYWhkLT5zZW5kX21zZ19wZXJyb3IgPSAwOworCQkJCWFoZC0+bXNnX3R5cGUgPSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHSU47CisJCQkJYWhkLT5tc2dpbl9pbmRleCA9IDA7CisJCQkJZ290byByZXN3aXRjaDsKKwkJCX0KKwkJCWVuZF9zZXNzaW9uID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGFoZC0+c2VuZF9tc2dfcGVycm9yKSB7CisJCQlhaGRfb3V0YihhaGQsIENMUlNJTlQxLCBDTFJBVE5PKTsKKwkJCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDEsIENMUlJFUUlOSVQpOworI2lmZGVmIEFIRF9ERUJVRworCQkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NRVNTQUdFUykgIT0gMCkKKwkJCQlwcmludGYoIiBieXRlIDB4JXhcbiIsIGFoZC0+c2VuZF9tc2dfcGVycm9yKTsKKyNlbmRpZgorCQkJLyoKKwkJCSAqIElmIHdlIGFyZSBub3RpZnlpbmcgdGhlIHRhcmdldCBvZiBhIENSQyBlcnJvcgorCQkJICogZHVyaW5nIHBhY2tldGl6ZWQgb3BlcmF0aW9ucywgdGhlIHRhcmdldCBpcworCQkJICogd2l0aGluIGl0cyByaWdodHMgdG8gYWNrbm93bGVkZ2Ugb3VyIG1lc3NhZ2UKKwkJCSAqIHdpdGggYSBidXNmcmVlLgorCQkJICovCisJCQlpZiAoKGFoZC0+bXNnX2ZsYWdzICYgTVNHX0ZMQUdfUEFDS0VUSVpFRCkgIT0gMAorCQkJICYmIGFoZC0+c2VuZF9tc2dfcGVycm9yID09IE1TR19JTklUSUFUT1JfREVUX0VSUikKKwkJCQlhaGQtPm1zZ19mbGFncyB8PSBNU0dfRkxBR19FWFBFQ1RfSURFX0JVU0ZSRUU7CisKKwkJCWFoZF9vdXRiKGFoZCwgUkVUVVJOXzIsIGFoZC0+c2VuZF9tc2dfcGVycm9yKTsKKwkJCWFoZF9vdXRiKGFoZCwgUkVUVVJOXzEsIENPTlRfTVNHX0xPT1BfV1JJVEUpOworCQkJYnJlYWs7CisJCX0KKworCQltc2dkb25lCT0gYWhkLT5tc2dvdXRfaW5kZXggPT0gYWhkLT5tc2dvdXRfbGVuOworCQlpZiAobXNnZG9uZSkgeworCQkJLyoKKwkJCSAqIFRoZSB0YXJnZXQgaGFzIHJlcXVlc3RlZCBhIHJldHJ5LgorCQkJICogUmUtYXNzZXJ0IEFUTiwgcmVzZXQgb3VyIG1lc3NhZ2UgaW5kZXggdG8KKwkJCSAqIDAsIGFuZCB0cnkgYWdhaW4uCisJCQkgKi8KKwkJCWFoZC0+bXNnb3V0X2luZGV4ID0gMDsKKwkJCWFoZF9hc3NlcnRfYXRuKGFoZCk7CisJCX0KKworCQlsYXN0Ynl0ZSA9IGFoZC0+bXNnb3V0X2luZGV4ID09IChhaGQtPm1zZ291dF9sZW4gLSAxKTsKKwkJaWYgKGxhc3RieXRlKSB7CisJCQkvKiBMYXN0IGJ5dGUgaXMgc2lnbmlmaWVkIGJ5IGRyb3BwaW5nIEFUTiAqLworCQkJYWhkX291dGIoYWhkLCBDTFJTSU5UMSwgQ0xSQVROTyk7CisJCX0KKworCQkvKgorCQkgKiBDbGVhciBvdXIgaW50ZXJydXB0IHN0YXR1cyBhbmQgcHJlc2VudAorCQkgKiB0aGUgbmV4dCBieXRlIG9uIHRoZSBidXMuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIENMUlNJTlQxLCBDTFJSRVFJTklUKTsKKyNpZmRlZiBBSERfREVCVUcKKwkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NRVNTQUdFUykgIT0gMCkKKwkJCXByaW50ZigiIGJ5dGUgMHgleFxuIiwKKwkJCSAgICAgICBhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXhdKTsKKyNlbmRpZgorCQlhaGRfb3V0YihhaGQsIFJFVFVSTl8yLCBhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10pOworCQlhaGRfb3V0YihhaGQsIFJFVFVSTl8xLCBDT05UX01TR19MT09QX1dSSVRFKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTVNHX1RZUEVfSU5JVElBVE9SX01TR0lOOgorCXsKKwkJaW50IHBoYXNlbWlzOworCQlpbnQgbWVzc2FnZV9kb25lOworCisjaWZkZWYgQUhEX0RFQlVHCisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApIHsKKwkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOworCQkJcHJpbnRmKCJJTklUSUFUT1JfTVNHX0lOIik7CisJCX0KKyNlbmRpZgorCQlwaGFzZW1pcyA9IGJ1c19waGFzZSAhPSBQX01FU0dJTjsKKwkJaWYgKHBoYXNlbWlzKSB7CisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKSB7CisJCQkJcHJpbnRmKCIgUEhBU0VNSVMgJXNcbiIsCisJCQkJICAgICAgIGFoZF9sb29rdXBfcGhhc2VfZW50cnkoYnVzX3BoYXNlKQorCQkJCQkJCSAgICAgLT5waGFzZW1zZyk7CisJCQl9CisjZW5kaWYKKwkJCWFoZC0+bXNnaW5faW5kZXggPSAwOworCQkJaWYgKGJ1c19waGFzZSA9PSBQX01FU0dPVVQKKwkJCSAmJiAoYWhkLT5zZW5kX21zZ19wZXJyb3IgIT0gMAorCQkJICB8fCAoYWhkLT5tc2dvdXRfbGVuICE9IDAKKwkJCSAgICYmIGFoZC0+bXNnb3V0X2luZGV4ID09IDApKSkgeworCQkJCWFoZC0+bXNnX3R5cGUgPSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHT1VUOworCQkJCWdvdG8gcmVzd2l0Y2g7CisJCQl9CisJCQllbmRfc2Vzc2lvbiA9IFRSVUU7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFB1bGwgdGhlIGJ5dGUgaW4gd2l0aG91dCBhY2tpbmcgaXQgKi8KKwkJYWhkLT5tc2dpbl9idWZbYWhkLT5tc2dpbl9pbmRleF0gPSBhaGRfaW5iKGFoZCwgU0NTSUJVUyk7CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApCisJCQlwcmludGYoIiBieXRlIDB4JXhcbiIsCisJCQkgICAgICAgYWhkLT5tc2dpbl9idWZbYWhkLT5tc2dpbl9pbmRleF0pOworI2VuZGlmCisKKwkJbWVzc2FnZV9kb25lID0gYWhkX3BhcnNlX21zZyhhaGQsICZkZXZpbmZvKTsKKworCQlpZiAobWVzc2FnZV9kb25lKSB7CisJCQkvKgorCQkJICogQ2xlYXIgb3VyIGluY29taW5nIG1lc3NhZ2UgYnVmZmVyIGluIGNhc2UgdGhlcmUKKwkJCSAqIGlzIGFub3RoZXIgbWVzc2FnZSBmb2xsb3dpbmcgdGhpcyBvbmUuCisJCQkgKi8KKwkJCWFoZC0+bXNnaW5faW5kZXggPSAwOworCisJCQkvKgorCQkJICogSWYgdGhpcyBtZXNzYWdlIGlsbGljaXRlZCBhIHJlc3BvbnNlLAorCQkJICogYXNzZXJ0IEFUTiBzbyB0aGUgdGFyZ2V0IHRha2VzIHVzIHRvIHRoZQorCQkJICogbWVzc2FnZSBvdXQgcGhhc2UuCisJCQkgKi8KKwkJCWlmIChhaGQtPm1zZ291dF9sZW4gIT0gMCkgeworI2lmZGVmIEFIRF9ERUJVRworCQkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApIHsKKwkJCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCAmZGV2aW5mbyk7CisJCQkJCXByaW50ZigiQXNzZXJ0aW5nIEFUTiBmb3IgcmVzcG9uc2VcbiIpOworCQkJCX0KKyNlbmRpZgorCQkJCWFoZF9hc3NlcnRfYXRuKGFoZCk7CisJCQl9CisJCX0gZWxzZSAKKwkJCWFoZC0+bXNnaW5faW5kZXgrKzsKKworCQlpZiAobWVzc2FnZV9kb25lID09IE1TR0xPT1BfVEVSTUlOQVRFRCkgeworCQkJZW5kX3Nlc3Npb24gPSBUUlVFOworCQl9IGVsc2UgeworCQkJLyogQWNrIHRoZSBieXRlICovCisJCQlhaGRfb3V0YihhaGQsIENMUlNJTlQxLCBDTFJSRVFJTklUKTsKKwkJCWFoZF9vdXRiKGFoZCwgUkVUVVJOXzEsIENPTlRfTVNHX0xPT1BfUkVBRCk7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgTVNHX1RZUEVfVEFSR0VUX01TR0lOOgorCXsKKwkJaW50IG1zZ2RvbmU7CisJCWludCBtc2dvdXRfcmVxdWVzdDsKKworCQkvKgorCQkgKiBCeSBkZWZhdWx0LCB0aGUgbWVzc2FnZSBsb29wIHdpbGwgY29udGludWUuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIFJFVFVSTl8xLCBDT05UX01TR19MT09QX1RBUkcpOworCisJCWlmIChhaGQtPm1zZ291dF9sZW4gPT0gMCkKKwkJCXBhbmljKCJUYXJnZXQgTVNHSU4gd2l0aCBubyBhY3RpdmUgbWVzc2FnZSIpOworCisJCS8qCisJCSAqIElmIHdlIGludGVycnVwdGVkIGEgbWVzZ291dCBzZXNzaW9uLCB0aGUgaW5pdGlhdG9yCisJCSAqIHdpbGwgbm90IGtub3cgdGhpcyB1bnRpbCBvdXIgZmlyc3QgUkVRLiAgU28sIHdlCisJCSAqIG9ubHkgaG9ub3IgbWVzZ291dCByZXF1ZXN0cyBhZnRlciB3ZSd2ZSBzZW50IG91cgorCQkgKiBmaXJzdCBieXRlLgorCQkgKi8KKwkJaWYgKChhaGRfaW5iKGFoZCwgU0NTSVNJR0kpICYgQVROSSkgIT0gMAorCQkgJiYgYWhkLT5tc2dvdXRfaW5kZXggPiAwKQorCQkJbXNnb3V0X3JlcXVlc3QgPSBUUlVFOworCQllbHNlCisJCQltc2dvdXRfcmVxdWVzdCA9IEZBTFNFOworCisJCWlmIChtc2dvdXRfcmVxdWVzdCkgeworCisJCQkvKgorCQkJICogQ2hhbmdlIGdlYXJzIGFuZCBzZWUgaWYKKwkJCSAqIHRoaXMgbWVzc2FnZXMgaXMgb2YgaW50ZXJlc3QgdG8KKwkJCSAqIHVzIG9yIHNob3VsZCBiZSBwYXNzZWQgYmFjayB0bworCQkJICogdGhlIHNlcXVlbmNlci4KKwkJCSAqLworCQkJYWhkLT5tc2dfdHlwZSA9IE1TR19UWVBFX1RBUkdFVF9NU0dPVVQ7CisJCQlhaGRfb3V0YihhaGQsIFNDU0lTSUdPLCBQX01FU0dPVVQgfCBCU1lPKTsKKwkJCWFoZC0+bXNnaW5faW5kZXggPSAwOworCQkJLyogRHVtbXkgcmVhZCB0byBSRVEgZm9yIGZpcnN0IGJ5dGUgKi8KKwkJCWFoZF9pbmIoYWhkLCBTQ1NJREFUKTsKKwkJCWFoZF9vdXRiKGFoZCwgU1hGUkNUTDAsCisJCQkJIGFoZF9pbmIoYWhkLCBTWEZSQ1RMMCkgfCBTUElPRU4pOworCQkJYnJlYWs7CisJCX0KKworCQltc2dkb25lID0gYWhkLT5tc2dvdXRfaW5kZXggPT0gYWhkLT5tc2dvdXRfbGVuOworCQlpZiAobXNnZG9uZSkgeworCQkJYWhkX291dGIoYWhkLCBTWEZSQ1RMMCwKKwkJCQkgYWhkX2luYihhaGQsIFNYRlJDVEwwKSAmIH5TUElPRU4pOworCQkJZW5kX3Nlc3Npb24gPSBUUlVFOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBQcmVzZW50IHRoZSBuZXh0IGJ5dGUgb24gdGhlIGJ1cy4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgU1hGUkNUTDAsIGFoZF9pbmIoYWhkLCBTWEZSQ1RMMCkgfCBTUElPRU4pOworCQlhaGRfb3V0YihhaGQsIFNDU0lEQVQsIGFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSk7CisJCWJyZWFrOworCX0KKwljYXNlIE1TR19UWVBFX1RBUkdFVF9NU0dPVVQ6CisJeworCQlpbnQgbGFzdGJ5dGU7CisJCWludCBtc2dkb25lOworCisJCS8qCisJCSAqIEJ5IGRlZmF1bHQsIHRoZSBtZXNzYWdlIGxvb3Agd2lsbCBjb250aW51ZS4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgUkVUVVJOXzEsIENPTlRfTVNHX0xPT1BfVEFSRyk7CisKKwkJLyoKKwkJICogVGhlIGluaXRpYXRvciBzaWduYWxzIHRoYXQgdGhpcyBpcworCQkgKiB0aGUgbGFzdCBieXRlIGJ5IGRyb3BwaW5nIEFUTi4KKwkJICovCisJCWxhc3RieXRlID0gKGFoZF9pbmIoYWhkLCBTQ1NJU0lHSSkgJiBBVE5JKSA9PSAwOworCisJCS8qCisJCSAqIFJlYWQgdGhlIGxhdGNoZWQgYnl0ZSwgYnV0IHR1cm4gb2ZmIFNQSU9FTiBmaXJzdAorCQkgKiBzbyB0aGF0IHdlIGRvbid0IGluYWR2ZXJ0ZW50bHkgY2F1c2UgYSBSRVEgZm9yIHRoZQorCQkgKiBuZXh0IGJ5dGUuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIFNYRlJDVEwwLCBhaGRfaW5iKGFoZCwgU1hGUkNUTDApICYgflNQSU9FTik7CisJCWFoZC0+bXNnaW5fYnVmW2FoZC0+bXNnaW5faW5kZXhdID0gYWhkX2luYihhaGQsIFNDU0lEQVQpOworCQltc2dkb25lID0gYWhkX3BhcnNlX21zZyhhaGQsICZkZXZpbmZvKTsKKwkJaWYgKG1zZ2RvbmUgPT0gTVNHTE9PUF9URVJNSU5BVEVEKSB7CisJCQkvKgorCQkJICogVGhlIG1lc3NhZ2UgaXMgKnJlYWxseSogZG9uZSBpbiB0aGF0IGl0IGNhdXNlZAorCQkJICogdXMgdG8gZ28gdG8gYnVzIGZyZWUuICBUaGUgc2VxdWVuY2VyIGhhcyBhbHJlYWR5CisJCQkgKiBiZWVuIHJlc2V0IGF0IHRoaXMgcG9pbnQsIHNvIHB1bGwgdGhlIGVqZWN0aW9uCisJCQkgKiBoYW5kbGUuCisJCQkgKi8KKwkJCXJldHVybjsKKwkJfQorCQkKKwkJYWhkLT5tc2dpbl9pbmRleCsrOworCisJCS8qCisJCSAqIFhYWCBSZWFkIHNwZWMgYWJvdXQgaW5pdGlhdG9yIGRyb3BwaW5nIEFUTiB0b28gc29vbgorCQkgKiAgICAgYW5kIHVzZSBtc2dkb25lIHRvIGRldGVjdCBpdC4KKwkJICovCisJCWlmIChtc2dkb25lID09IE1TR0xPT1BfTVNHQ09NUExFVEUpIHsKKwkJCWFoZC0+bXNnaW5faW5kZXggPSAwOworCisJCQkvKgorCQkJICogSWYgdGhpcyBtZXNzYWdlIGlsbGljaXRlZCBhIHJlc3BvbnNlLCB0cmFuc2l0aW9uCisJCQkgKiB0byB0aGUgTWVzc2FnZSBpbiBwaGFzZSBhbmQgc2VuZCBpdC4KKwkJCSAqLworCQkJaWYgKGFoZC0+bXNnb3V0X2xlbiAhPSAwKSB7CisJCQkJYWhkX291dGIoYWhkLCBTQ1NJU0lHTywgUF9NRVNHSU4gfCBCU1lPKTsKKwkJCQlhaGRfb3V0YihhaGQsIFNYRlJDVEwwLAorCQkJCQkgYWhkX2luYihhaGQsIFNYRlJDVEwwKSB8IFNQSU9FTik7CisJCQkJYWhkLT5tc2dfdHlwZSA9IE1TR19UWVBFX1RBUkdFVF9NU0dJTjsKKwkJCQlhaGQtPm1zZ2luX2luZGV4ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChsYXN0Ynl0ZSkKKwkJCWVuZF9zZXNzaW9uID0gVFJVRTsKKwkJZWxzZSB7CisJCQkvKiBBc2sgZm9yIHRoZSBuZXh0IGJ5dGUuICovCisJCQlhaGRfb3V0YihhaGQsIFNYRlJDVEwwLAorCQkJCSBhaGRfaW5iKGFoZCwgU1hGUkNUTDApIHwgU1BJT0VOKTsKKwkJfQorCisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwYW5pYygiVW5rbm93biBSRVFJTklUIG1lc3NhZ2UgdHlwZSIpOworCX0KKworCWlmIChlbmRfc2Vzc2lvbikgeworCQlpZiAoKGFoZC0+bXNnX2ZsYWdzICYgTVNHX0ZMQUdfUEFDS0VUSVpFRCkgIT0gMCkgeworCQkJcHJpbnRmKCIlczogUmV0dXJuaW5nIHRvIElkbGUgTG9vcFxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpKTsKKwkJCWFoZF9jbGVhcl9tc2dfc3RhdGUoYWhkKTsKKworCQkJLyoKKwkJCSAqIFBlcmZvcm0gdGhlIGVxdWl2YWxlbnQgb2YgYSBjbGVhcl90YXJnZXRfc3RhdGUuCisJCQkgKi8KKwkJCWFoZF9vdXRiKGFoZCwgTEFTVFBIQVNFLCBQX0JVU0ZSRUUpOworCQkJYWhkX291dGIoYWhkLCBTRVFfRkxBR1MsIE5PVF9JREVOVElGSUVEfE5PX0NEQl9TRU5UKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0VRQ1RMMCwgRkFTVE1PREV8U0VRUkVTRVQpOworCQl9IGVsc2UgeworCQkJYWhkX2NsZWFyX21zZ19zdGF0ZShhaGQpOworCQkJYWhkX291dGIoYWhkLCBSRVRVUk5fMSwgRVhJVF9NU0dfTE9PUCk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBTZWUgaWYgd2Ugc2VudCBhIHBhcnRpY3VsYXIgZXh0ZW5kZWQgbWVzc2FnZSB0byB0aGUgdGFyZ2V0LgorICogSWYgImZ1bGwiIGlzIHRydWUsIHJldHVybiB0cnVlIG9ubHkgaWYgdGhlIHRhcmdldCBzYXcgdGhlIGZ1bGwKKyAqIG1lc3NhZ2UuICBJZiAiZnVsbCIgaXMgZmFsc2UsIHJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgc2F3IGF0CisgKiBsZWFzdCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbWVzc2FnZS4KKyAqLworc3RhdGljIGludAorYWhkX3NlbnRfbXNnKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYWhkX21zZ3R5cGUgdHlwZSwgdV9pbnQgbXNndmFsLCBpbnQgZnVsbCkKK3sKKwlpbnQgZm91bmQ7CisJdV9pbnQgaW5kZXg7CisKKwlmb3VuZCA9IEZBTFNFOworCWluZGV4ID0gMDsKKworCXdoaWxlIChpbmRleCA8IGFoZC0+bXNnb3V0X2xlbikgeworCQlpZiAoYWhkLT5tc2dvdXRfYnVmW2luZGV4XSA9PSBNU0dfRVhURU5ERUQpIHsKKwkJCXVfaW50IGVuZF9pbmRleDsKKworCQkJZW5kX2luZGV4ID0gaW5kZXggKyAxICsgYWhkLT5tc2dvdXRfYnVmW2luZGV4ICsgMV07CisJCQlpZiAoYWhkLT5tc2dvdXRfYnVmW2luZGV4KzJdID09IG1zZ3ZhbAorCQkJICYmIHR5cGUgPT0gQUhETVNHX0VYVCkgeworCisJCQkJaWYgKGZ1bGwpIHsKKwkJCQkJaWYgKGFoZC0+bXNnb3V0X2luZGV4ID4gZW5kX2luZGV4KQorCQkJCQkJZm91bmQgPSBUUlVFOworCQkJCX0gZWxzZSBpZiAoYWhkLT5tc2dvdXRfaW5kZXggPiBpbmRleCkKKwkJCQkJZm91bmQgPSBUUlVFOworCQkJfQorCQkJaW5kZXggPSBlbmRfaW5kZXg7CisJCX0gZWxzZSBpZiAoYWhkLT5tc2dvdXRfYnVmW2luZGV4XSA+PSBNU0dfU0lNUExFX1RBU0sKKwkJCSYmIGFoZC0+bXNnb3V0X2J1ZltpbmRleF0gPD0gTVNHX0lHTl9XSURFX1JFU0lEVUUpIHsKKworCQkJLyogU2tpcCB0YWcgdHlwZSBhbmQgdGFnIGlkIG9yIHJlc2lkdWUgcGFyYW0qLworCQkJaW5kZXggKz0gMjsKKwkJfSBlbHNlIHsKKwkJCS8qIFNpbmdsZSBieXRlIG1lc3NhZ2UgKi8KKwkJCWlmICh0eXBlID09IEFIRE1TR18xQgorCQkJICYmIGFoZC0+bXNnb3V0X2luZGV4ID4gaW5kZXgKKwkJCSAmJiAoYWhkLT5tc2dvdXRfYnVmW2luZGV4XSA9PSBtc2d2YWwKKwkJCSAgfHwgKChhaGQtPm1zZ291dF9idWZbaW5kZXhdICYgTVNHX0lERU5USUZZRkxBRykgIT0gMAorCQkJICAgJiYgbXNndmFsID09IE1TR19JREVOVElGWUZMQUcpKSkKKwkJCQlmb3VuZCA9IFRSVUU7CisJCQlpbmRleCsrOworCQl9CisKKwkJaWYgKGZvdW5kKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAoZm91bmQpOworfQorCisvKgorICogV2FpdCBmb3IgYSBjb21wbGV0ZSBpbmNvbWluZyBtZXNzYWdlLCBwYXJzZSBpdCwgYW5kIHJlc3BvbmQgYWNjb3JkaW5nbHkuCisgKi8KK3N0YXRpYyBpbnQKK2FoZF9wYXJzZV9tc2coc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pCit7CisJc3RydWN0CWFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCXN0cnVjdAlhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJaW50CXJlamVjdDsKKwlpbnQJZG9uZTsKKwlpbnQJcmVzcG9uc2U7CisKKwlkb25lID0gTVNHTE9PUF9JTl9QUk9HOworCXJlc3BvbnNlID0gRkFMU0U7CisJcmVqZWN0ID0gRkFMU0U7CisJdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+b3VyX3Njc2lpZCwKKwkJCQkgICAgZGV2aW5mby0+dGFyZ2V0LCAmdHN0YXRlKTsKKworCS8qCisJICogUGFyc2UgYXMgbXVjaCBvZiB0aGUgbWVzc2FnZSBhcyBpcyBhdmFpbGFibGUsCisJICogcmVqZWN0aW5nIGl0IGlmIHdlIGRvbid0IHN1cHBvcnQgaXQuICBXaGVuCisJICogdGhlIGVudGlyZSBtZXNzYWdlIGlzIGF2YWlsYWJsZSBhbmQgaGFzIGJlZW4KKwkgKiBoYW5kbGVkLCByZXR1cm4gTVNHTE9PUF9NU0dDT01QTEVURSwgaW5kaWNhdGluZworCSAqIHRoYXQgd2UgaGF2ZSBwYXJzZWQgYW4gZW50aXJlIG1lc3NhZ2UuCisJICoKKwkgKiBJbiB0aGUgY2FzZSBvZiBleHRlbmRlZCBtZXNzYWdlcywgd2UgYWNjZXB0IHRoZSBsZW5ndGgKKwkgKiBieXRlIG91dHJpZ2h0IGFuZCBwZXJmb3JtIG1vcmUgY2hlY2tpbmcgb25jZSB3ZSBrbm93IHRoZQorCSAqIGV4dGVuZGVkIG1lc3NhZ2UgdHlwZS4KKwkgKi8KKwlzd2l0Y2ggKGFoZC0+bXNnaW5fYnVmWzBdKSB7CisJY2FzZSBNU0dfRElTQ09OTkVDVDoKKwljYXNlIE1TR19TQVZFREFUQVBPSU5URVI6CisJY2FzZSBNU0dfQ01EQ09NUExFVEU6CisJY2FzZSBNU0dfUkVTVE9SRVBPSU5URVJTOgorCWNhc2UgTVNHX0lHTl9XSURFX1JFU0lEVUU6CisJCS8qCisJCSAqIEVuZCBvdXIgbWVzc2FnZSBsb29wIGFzIHRoZXNlIGFyZSBtZXNzYWdlcworCQkgKiB0aGUgc2VxdWVuY2VyIGhhbmRsZXMgb24gaXRzIG93bi4KKwkJICovCisJCWRvbmUgPSBNU0dMT09QX1RFUk1JTkFURUQ7CisJCWJyZWFrOworCWNhc2UgTVNHX01FU1NBR0VfUkVKRUNUOgorCQlyZXNwb25zZSA9IGFoZF9oYW5kbGVfbXNnX3JlamVjdChhaGQsIGRldmluZm8pOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgTVNHX05PT1A6CisJCWRvbmUgPSBNU0dMT09QX01TR0NPTVBMRVRFOworCQlicmVhazsKKwljYXNlIE1TR19FWFRFTkRFRDoKKwl7CisJCS8qIFdhaXQgZm9yIGVub3VnaCBvZiB0aGUgbWVzc2FnZSB0byBiZWdpbiB2YWxpZGF0aW9uICovCisJCWlmIChhaGQtPm1zZ2luX2luZGV4IDwgMikKKwkJCWJyZWFrOworCQlzd2l0Y2ggKGFoZC0+bXNnaW5fYnVmWzJdKSB7CisJCWNhc2UgTVNHX0VYVF9TRFRSOgorCQl7CisJCQl1X2ludAkgcGVyaW9kOworCQkJdV9pbnQJIHBwcl9vcHRpb25zOworCQkJdV9pbnQJIG9mZnNldDsKKwkJCXVfaW50CSBzYXZlZF9vZmZzZXQ7CisJCQkKKwkJCWlmIChhaGQtPm1zZ2luX2J1ZlsxXSAhPSBNU0dfRVhUX1NEVFJfTEVOKSB7CisJCQkJcmVqZWN0ID0gVFJVRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFdhaXQgdW50aWwgd2UgaGF2ZSBib3RoIGFyZ3MgYmVmb3JlIHZhbGlkYXRpbmcKKwkJCSAqIGFuZCBhY3Rpbmcgb24gdGhpcyBtZXNzYWdlLgorCQkJICoKKwkJCSAqIEFkZCBvbmUgdG8gTVNHX0VYVF9TRFRSX0xFTiB0byBhY2NvdW50IGZvcgorCQkJICogdGhlIGV4dGVuZGVkIG1lc3NhZ2UgcHJlYW1ibGUuCisJCQkgKi8KKwkJCWlmIChhaGQtPm1zZ2luX2luZGV4IDwgKE1TR19FWFRfU0RUUl9MRU4gKyAxKSkKKwkJCQlicmVhazsKKworCQkJcGVyaW9kID0gYWhkLT5tc2dpbl9idWZbM107CisJCQlwcHJfb3B0aW9ucyA9IDA7CisJCQlzYXZlZF9vZmZzZXQgPSBvZmZzZXQgPSBhaGQtPm1zZ2luX2J1Zls0XTsKKwkJCWFoZF9kZXZsaW1pdGVkX3N5bmNyYXRlKGFoZCwgdGluZm8sICZwZXJpb2QsCisJCQkJCQkmcHByX29wdGlvbnMsIGRldmluZm8tPnJvbGUpOworCQkJYWhkX3ZhbGlkYXRlX29mZnNldChhaGQsIHRpbmZvLCBwZXJpb2QsICZvZmZzZXQsCisJCQkJCSAgICB0aW5mby0+Y3Vyci53aWR0aCwgZGV2aW5mby0+cm9sZSk7CisJCQlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJCQlwcmludGYoIiglczolYzolZDolZCk6IFJlY2VpdmVkICIKKwkJCQkgICAgICAgIlNEVFIgcGVyaW9kICV4LCBvZmZzZXQgJXhcblx0IgorCQkJCSAgICAgICAiRmlsdGVyZWQgdG8gcGVyaW9kICV4LCBvZmZzZXQgJXhcbiIsCisJCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGRldmluZm8tPmNoYW5uZWwsCisJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuLAorCQkJCSAgICAgICBhaGQtPm1zZ2luX2J1ZlszXSwgc2F2ZWRfb2Zmc2V0LAorCQkJCSAgICAgICBwZXJpb2QsIG9mZnNldCk7CisJCQl9CisJCQlhaGRfc2V0X3N5bmNyYXRlKGFoZCwgZGV2aW5mbywgcGVyaW9kLAorCQkJCQkgb2Zmc2V0LCBwcHJfb3B0aW9ucywKKwkJCQkJIEFIRF9UUkFOU19BQ1RJVkV8QUhEX1RSQU5TX0dPQUwsCisJCQkJCSAvKnBhdXNlZCovVFJVRSk7CisKKwkJCS8qCisJCQkgKiBTZWUgaWYgd2UgaW5pdGlhdGVkIFN5bmMgTmVnb3RpYXRpb24KKwkJCSAqIGFuZCBkaWRuJ3QgaGF2ZSB0byBmYWxsIGRvd24gdG8gYXN5bmMKKwkJCSAqIHRyYW5zZmVycy4KKwkJCSAqLworCQkJaWYgKGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR19FWFQsIE1TR19FWFRfU0RUUiwgVFJVRSkpIHsKKwkJCQkvKiBXZSBzdGFydGVkIGl0ICovCisJCQkJaWYgKHNhdmVkX29mZnNldCAhPSBvZmZzZXQpIHsKKwkJCQkJLyogV2VudCB0b28gbG93IC0gZm9yY2UgYXN5bmMgKi8KKwkJCQkJcmVqZWN0ID0gVFJVRTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogU2VuZCBvdXIgb3duIFNEVFIgaW4gcmVwbHkKKwkJCQkgKi8KKwkJCQlpZiAoYm9vdHZlcmJvc2UKKwkJCQkgJiYgZGV2aW5mby0+cm9sZSA9PSBST0xFX0lOSVRJQVRPUikgeworCQkJCQlwcmludGYoIiglczolYzolZDolZCk6IFRhcmdldCAiCisJCQkJCSAgICAgICAiSW5pdGlhdGVkIFNEVFJcbiIsCisJCQkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOworCQkJCX0KKwkJCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCQkJYWhkLT5tc2dvdXRfbGVuID0gMDsKKwkJCQlhaGRfY29uc3RydWN0X3NkdHIoYWhkLCBkZXZpbmZvLAorCQkJCQkJICAgcGVyaW9kLCBvZmZzZXQpOworCQkJCWFoZC0+bXNnb3V0X2luZGV4ID0gMDsKKwkJCQlyZXNwb25zZSA9IFRSVUU7CisJCQl9CisJCQlkb25lID0gTVNHTE9PUF9NU0dDT01QTEVURTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgTVNHX0VYVF9XRFRSOgorCQl7CisJCQl1X2ludCBidXNfd2lkdGg7CisJCQl1X2ludCBzYXZlZF93aWR0aDsKKwkJCXVfaW50IHNlbmRpbmdfcmVwbHk7CisKKwkJCXNlbmRpbmdfcmVwbHkgPSBGQUxTRTsKKwkJCWlmIChhaGQtPm1zZ2luX2J1ZlsxXSAhPSBNU0dfRVhUX1dEVFJfTEVOKSB7CisJCQkJcmVqZWN0ID0gVFJVRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFdhaXQgdW50aWwgd2UgaGF2ZSBvdXIgYXJnIGJlZm9yZSB2YWxpZGF0aW5nCisJCQkgKiBhbmQgYWN0aW5nIG9uIHRoaXMgbWVzc2FnZS4KKwkJCSAqCisJCQkgKiBBZGQgb25lIHRvIE1TR19FWFRfV0RUUl9MRU4gdG8gYWNjb3VudCBmb3IKKwkJCSAqIHRoZSBleHRlbmRlZCBtZXNzYWdlIHByZWFtYmxlLgorCQkJICovCisJCQlpZiAoYWhkLT5tc2dpbl9pbmRleCA8IChNU0dfRVhUX1dEVFJfTEVOICsgMSkpCisJCQkJYnJlYWs7CisKKwkJCWJ1c193aWR0aCA9IGFoZC0+bXNnaW5fYnVmWzNdOworCQkJc2F2ZWRfd2lkdGggPSBidXNfd2lkdGg7CisJCQlhaGRfdmFsaWRhdGVfd2lkdGgoYWhkLCB0aW5mbywgJmJ1c193aWR0aCwKKwkJCQkJICAgZGV2aW5mby0+cm9sZSk7CisJCQlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJCQlwcmludGYoIiglczolYzolZDolZCk6IFJlY2VpdmVkIFdEVFIgIgorCQkJCSAgICAgICAiJXggZmlsdGVyZWQgdG8gJXhcbiIsCisJCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGRldmluZm8tPmNoYW5uZWwsCisJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuLAorCQkJCSAgICAgICBzYXZlZF93aWR0aCwgYnVzX3dpZHRoKTsKKwkJCX0KKworCQkJaWYgKGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR19FWFQsIE1TR19FWFRfV0RUUiwgVFJVRSkpIHsKKwkJCQkvKgorCQkJCSAqIERvbid0IHNlbmQgYSBXRFRSIGJhY2sgdG8gdGhlCisJCQkJICogdGFyZ2V0LCBzaW5jZSB3ZSBhc2tlZCBmaXJzdC4KKwkJCQkgKiBJZiB0aGUgd2lkdGggd2VudCBoaWdoZXIgdGhhbiBvdXIKKwkJCQkgKiByZXF1ZXN0LCByZWplY3QgaXQuCisJCQkJICovCisJCQkJaWYgKHNhdmVkX3dpZHRoID4gYnVzX3dpZHRoKSB7CisJCQkJCXJlamVjdCA9IFRSVUU7CisJCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogcmVxdWVzdGVkICVkQml0ICIKKwkJCQkJICAgICAgICJ0cmFuc2ZlcnMuICBSZWplY3RpbmcuLi5cbiIsCisJCQkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4sCisJCQkJCSAgICAgICA4ICogKDB4MDEgPDwgYnVzX3dpZHRoKSk7CisJCQkJCWJ1c193aWR0aCA9IDA7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFNlbmQgb3VyIG93biBXRFRSIGluIHJlcGx5CisJCQkJICovCisJCQkJaWYgKGJvb3R2ZXJib3NlCisJCQkJICYmIGRldmluZm8tPnJvbGUgPT0gUk9MRV9JTklUSUFUT1IpIHsKKwkJCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBUYXJnZXQgIgorCQkJCQkgICAgICAgIkluaXRpYXRlZCBXRFRSXG4iLAorCQkJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby0+Y2hhbm5lbCwKKwkJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKKwkJCQl9CisJCQkJYWhkLT5tc2dvdXRfaW5kZXggPSAwOworCQkJCWFoZC0+bXNnb3V0X2xlbiA9IDA7CisJCQkJYWhkX2NvbnN0cnVjdF93ZHRyKGFoZCwgZGV2aW5mbywgYnVzX3dpZHRoKTsKKwkJCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCQkJcmVzcG9uc2UgPSBUUlVFOworCQkJCXNlbmRpbmdfcmVwbHkgPSBUUlVFOworCQkJfQorCQkJLyoKKwkJCSAqIEFmdGVyIGEgd2lkZSBtZXNzYWdlLCB3ZSBhcmUgYXN5bmMsIGJ1dAorCQkJICogc29tZSBkZXZpY2VzIGRvbid0IHNlZW0gdG8gaG9ub3IgdGhpcyBwb3J0aW9uCisJCQkgKiBvZiB0aGUgc3BlYy4gIEZvcmNlIGEgcmVuZWdvdGlhdGlvbiBvZiB0aGUKKwkJCSAqIHN5bmMgY29tcG9uZW50IG9mIG91ciB0cmFuc2ZlciBhZ3JlZW1lbnQgZXZlbgorCQkJICogaWYgb3VyIGdvYWwgaXMgYXN5bmMuICBCeSB1cGRhdGluZyBvdXIgd2lkdGgKKwkJCSAqIGFmdGVyIGZvcmNpbmcgdGhlIG5lZ290aWF0aW9uLCB3ZSBhdm9pZAorCQkJICogcmVuZWdvdGlhdGluZyBmb3Igd2lkdGguCisJCQkgKi8KKwkJCWFoZF91cGRhdGVfbmVnX3JlcXVlc3QoYWhkLCBkZXZpbmZvLCB0c3RhdGUsCisJCQkJCSAgICAgICB0aW5mbywgQUhEX05FR19BTFdBWVMpOworCQkJYWhkX3NldF93aWR0aChhaGQsIGRldmluZm8sIGJ1c193aWR0aCwKKwkJCQkgICAgICBBSERfVFJBTlNfQUNUSVZFfEFIRF9UUkFOU19HT0FMLAorCQkJCSAgICAgIC8qcGF1c2VkKi9UUlVFKTsKKwkJCWlmIChzZW5kaW5nX3JlcGx5ID09IEZBTFNFICYmIHJlamVjdCA9PSBGQUxTRSkgeworCisJCQkJLyoKKwkJCQkgKiBXZSB3aWxsIGFsd2F5cyBoYXZlIGFuIFNEVFIgdG8gc2VuZC4KKwkJCQkgKi8KKwkJCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCQkJYWhkLT5tc2dvdXRfbGVuID0gMDsKKwkJCQlhaGRfYnVpbGRfdHJhbnNmZXJfbXNnKGFoZCwgZGV2aW5mbyk7CisJCQkJYWhkLT5tc2dvdXRfaW5kZXggPSAwOworCQkJCXJlc3BvbnNlID0gVFJVRTsKKwkJCX0KKwkJCWRvbmUgPSBNU0dMT09QX01TR0NPTVBMRVRFOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBNU0dfRVhUX1BQUjoKKwkJeworCQkJdV9pbnQJcGVyaW9kOworCQkJdV9pbnQJb2Zmc2V0OworCQkJdV9pbnQJYnVzX3dpZHRoOworCQkJdV9pbnQJcHByX29wdGlvbnM7CisJCQl1X2ludAlzYXZlZF93aWR0aDsKKwkJCXVfaW50CXNhdmVkX29mZnNldDsKKwkJCXVfaW50CXNhdmVkX3Bwcl9vcHRpb25zOworCisJCQlpZiAoYWhkLT5tc2dpbl9idWZbMV0gIT0gTVNHX0VYVF9QUFJfTEVOKSB7CisJCQkJcmVqZWN0ID0gVFJVRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFdhaXQgdW50aWwgd2UgaGF2ZSBhbGwgYXJncyBiZWZvcmUgdmFsaWRhdGluZworCQkJICogYW5kIGFjdGluZyBvbiB0aGlzIG1lc3NhZ2UuCisJCQkgKgorCQkJICogQWRkIG9uZSB0byBNU0dfRVhUX1BQUl9MRU4gdG8gYWNjb3VudCBmb3IKKwkJCSAqIHRoZSBleHRlbmRlZCBtZXNzYWdlIHByZWFtYmxlLgorCQkJICovCisJCQlpZiAoYWhkLT5tc2dpbl9pbmRleCA8IChNU0dfRVhUX1BQUl9MRU4gKyAxKSkKKwkJCQlicmVhazsKKworCQkJcGVyaW9kID0gYWhkLT5tc2dpbl9idWZbM107CisJCQlvZmZzZXQgPSBhaGQtPm1zZ2luX2J1Zls1XTsKKwkJCWJ1c193aWR0aCA9IGFoZC0+bXNnaW5fYnVmWzZdOworCQkJc2F2ZWRfd2lkdGggPSBidXNfd2lkdGg7CisJCQlwcHJfb3B0aW9ucyA9IGFoZC0+bXNnaW5fYnVmWzddOworCQkJLyoKKwkJCSAqIEFjY29yZGluZyB0byB0aGUgc3BlYywgYSBEVCBvbmx5CisJCQkgKiBwZXJpb2QgZmFjdG9yIHdpdGggbm8gRFQgb3B0aW9uCisJCQkgKiBzZXQgaW1wbGllcyBhc3luYy4KKwkJCSAqLworCQkJaWYgKChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUSkgPT0gMAorCQkJICYmIHBlcmlvZCA8PSA5KQorCQkJCW9mZnNldCA9IDA7CisJCQlzYXZlZF9wcHJfb3B0aW9ucyA9IHBwcl9vcHRpb25zOworCQkJc2F2ZWRfb2Zmc2V0ID0gb2Zmc2V0OworCisJCQkvKgorCQkJICogVHJhbnNmZXIgb3B0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgaWYgd2UKKwkJCSAqIGFyZSBuZWdvdGlhdGluZyB3aWRlLgorCQkJICovCisJCQlpZiAoYnVzX3dpZHRoID09IDApCisJCQkJcHByX29wdGlvbnMgJj0gTVNHX0VYVF9QUFJfUUFTX1JFUTsKKworCQkJYWhkX3ZhbGlkYXRlX3dpZHRoKGFoZCwgdGluZm8sICZidXNfd2lkdGgsCisJCQkJCSAgIGRldmluZm8tPnJvbGUpOworCQkJYWhkX2RldmxpbWl0ZWRfc3luY3JhdGUoYWhkLCB0aW5mbywgJnBlcmlvZCwKKwkJCQkJCSZwcHJfb3B0aW9ucywgZGV2aW5mby0+cm9sZSk7CisJCQlhaGRfdmFsaWRhdGVfb2Zmc2V0KGFoZCwgdGluZm8sIHBlcmlvZCwgJm9mZnNldCwKKwkJCQkJICAgIGJ1c193aWR0aCwgZGV2aW5mby0+cm9sZSk7CisKKwkJCWlmIChhaGRfc2VudF9tc2coYWhkLCBBSERNU0dfRVhULCBNU0dfRVhUX1BQUiwgVFJVRSkpIHsKKwkJCQkvKgorCQkJCSAqIElmIHdlIGFyZSB1bmFibGUgdG8gZG8gYW55IG9mIHRoZQorCQkJCSAqIHJlcXVlc3RlZCBvcHRpb25zICh3ZSB3ZW50IHRvbyBsb3cpLAorCQkJCSAqIHRoZW4gd2UnbGwgaGF2ZSB0byByZWplY3QgdGhlIG1lc3NhZ2UuCisJCQkJICovCisJCQkJaWYgKHNhdmVkX3dpZHRoID4gYnVzX3dpZHRoCisJCQkJIHx8IHNhdmVkX29mZnNldCAhPSBvZmZzZXQKKwkJCQkgfHwgc2F2ZWRfcHByX29wdGlvbnMgIT0gcHByX29wdGlvbnMpIHsKKwkJCQkJcmVqZWN0ID0gVFJVRTsKKwkJCQkJcGVyaW9kID0gMDsKKwkJCQkJb2Zmc2V0ID0gMDsKKwkJCQkJYnVzX3dpZHRoID0gMDsKKwkJCQkJcHByX29wdGlvbnMgPSAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGRldmluZm8tPnJvbGUgIT0gUk9MRV9UQVJHRVQpCisJCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogVGFyZ2V0ICIKKwkJCQkJICAgICAgICJJbml0aWF0ZWQgUFBSXG4iLAorCQkJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby0+Y2hhbm5lbCwKKwkJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKKwkJCQllbHNlCisJCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogSW5pdGlhdG9yICIKKwkJCQkJICAgICAgICJJbml0aWF0ZWQgUFBSXG4iLAorCQkJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby0+Y2hhbm5lbCwKKwkJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKKwkJCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCQkJYWhkLT5tc2dvdXRfbGVuID0gMDsKKwkJCQlhaGRfY29uc3RydWN0X3BwcihhaGQsIGRldmluZm8sIHBlcmlvZCwgb2Zmc2V0LAorCQkJCQkJICBidXNfd2lkdGgsIHBwcl9vcHRpb25zKTsKKwkJCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCQkJcmVzcG9uc2UgPSBUUlVFOworCQkJfQorCQkJaWYgKGJvb3R2ZXJib3NlKSB7CisJCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBSZWNlaXZlZCBQUFIgd2lkdGggJXgsICIKKwkJCQkgICAgICAgInBlcmlvZCAleCwgb2Zmc2V0ICV4LG9wdGlvbnMgJXhcbiIKKwkJCQkgICAgICAgIlx0RmlsdGVyZWQgdG8gd2lkdGggJXgsIHBlcmlvZCAleCwgIgorCQkJCSAgICAgICAib2Zmc2V0ICV4LCBvcHRpb25zICV4XG4iLAorCQkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1biwKKwkJCQkgICAgICAgc2F2ZWRfd2lkdGgsIGFoZC0+bXNnaW5fYnVmWzNdLAorCQkJCSAgICAgICBzYXZlZF9vZmZzZXQsIHNhdmVkX3Bwcl9vcHRpb25zLAorCQkJCSAgICAgICBidXNfd2lkdGgsIHBlcmlvZCwgb2Zmc2V0LCBwcHJfb3B0aW9ucyk7CisJCQl9CisJCQlhaGRfc2V0X3dpZHRoKGFoZCwgZGV2aW5mbywgYnVzX3dpZHRoLAorCQkJCSAgICAgIEFIRF9UUkFOU19BQ1RJVkV8QUhEX1RSQU5TX0dPQUwsCisJCQkJICAgICAgLypwYXVzZWQqL1RSVUUpOworCQkJYWhkX3NldF9zeW5jcmF0ZShhaGQsIGRldmluZm8sIHBlcmlvZCwKKwkJCQkJIG9mZnNldCwgcHByX29wdGlvbnMsCisJCQkJCSBBSERfVFJBTlNfQUNUSVZFfEFIRF9UUkFOU19HT0FMLAorCQkJCQkgLypwYXVzZWQqL1RSVUUpOworCisJCQlkb25lID0gTVNHTE9PUF9NU0dDT01QTEVURTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQkvKiBVbmtub3duIGV4dGVuZGVkIG1lc3NhZ2UuICBSZWplY3QgaXQuICovCisJCQlyZWplY3QgPSBUUlVFOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorI2lmZGVmIEFIRF9UQVJHRVRfTU9ERQorCWNhc2UgTVNHX0JVU19ERVZfUkVTRVQ6CisJCWFoZF9oYW5kbGVfZGV2cmVzZXQoYWhkLCBkZXZpbmZvLCBDQU1fTFVOX1dJTERDQVJELAorCQkJCSAgICBDQU1fQkRSX1NFTlQsCisJCQkJICAgICJCdXMgRGV2aWNlIFJlc2V0IFJlY2VpdmVkIiwKKwkJCQkgICAgLyp2ZXJib3NlX2xldmVsKi8wKTsKKwkJYWhkX3Jlc3RhcnQoYWhkKTsKKwkJZG9uZSA9IE1TR0xPT1BfVEVSTUlOQVRFRDsKKwkJYnJlYWs7CisJY2FzZSBNU0dfQUJPUlRfVEFHOgorCWNhc2UgTVNHX0FCT1JUOgorCWNhc2UgTVNHX0NMRUFSX1FVRVVFOgorCXsKKwkJaW50IHRhZzsKKworCQkvKiBUYXJnZXQgbW9kZSBtZXNzYWdlcyAqLworCQlpZiAoZGV2aW5mby0+cm9sZSAhPSBST0xFX1RBUkdFVCkgeworCQkJcmVqZWN0ID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisJCXRhZyA9IFNDQl9MSVNUX05VTEw7CisJCWlmIChhaGQtPm1zZ2luX2J1ZlswXSA9PSBNU0dfQUJPUlRfVEFHKQorCQkJdGFnID0gYWhkX2luYihhaGQsIElOSVRJQVRPUl9UQUcpOworCQlhaGRfYWJvcnRfc2NicyhhaGQsIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+Y2hhbm5lbCwKKwkJCSAgICAgICBkZXZpbmZvLT5sdW4sIHRhZywgUk9MRV9UQVJHRVQsCisJCQkgICAgICAgQ0FNX1JFUV9BQk9SVEVEKTsKKworCQl0c3RhdGUgPSBhaGQtPmVuYWJsZWRfdGFyZ2V0c1tkZXZpbmZvLT5vdXJfc2NzaWlkXTsKKwkJaWYgKHRzdGF0ZSAhPSBOVUxMKSB7CisJCQlzdHJ1Y3QgYWhkX3Rtb2RlX2xzdGF0ZSogbHN0YXRlOworCisJCQlsc3RhdGUgPSB0c3RhdGUtPmVuYWJsZWRfbHVuc1tkZXZpbmZvLT5sdW5dOworCQkJaWYgKGxzdGF0ZSAhPSBOVUxMKSB7CisJCQkJYWhkX3F1ZXVlX2xzdGF0ZV9ldmVudChhaGQsIGxzdGF0ZSwKKwkJCQkJCSAgICAgICBkZXZpbmZvLT5vdXJfc2NzaWlkLAorCQkJCQkJICAgICAgIGFoZC0+bXNnaW5fYnVmWzBdLAorCQkJCQkJICAgICAgIC8qYXJnKi90YWcpOworCQkJCWFoZF9zZW5kX2xzdGF0ZV9ldmVudHMoYWhkLCBsc3RhdGUpOworCQkJfQorCQl9CisJCWFoZF9yZXN0YXJ0KGFoZCk7CisJCWRvbmUgPSBNU0dMT09QX1RFUk1JTkFURUQ7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCWNhc2UgTVNHX1FBU19SRVFVRVNUOgorI2lmZGVmIEFIRF9ERUJVRworCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKQorCQkJcHJpbnRmKCIlczogUUFTIHJlcXVlc3QuICBTQ1NJU0lHSSA9PSAweCV4XG4iLAorCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGFoZF9pbmIoYWhkLCBTQ1NJU0lHSSkpOworI2VuZGlmCisJCWFoZC0+bXNnX2ZsYWdzIHw9IE1TR19GTEFHX0VYUEVDVF9RQVNSRUpfQlVTRlJFRTsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIE1TR19URVJNX0lPX1BST0M6CisJZGVmYXVsdDoKKwkJcmVqZWN0ID0gVFJVRTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJlamVjdCkgeworCQkvKgorCQkgKiBTZXR1cCB0byByZWplY3QgdGhlIG1lc3NhZ2UuCisJCSAqLworCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCWFoZC0+bXNnb3V0X2xlbiA9IDE7CisJCWFoZC0+bXNnb3V0X2J1ZlswXSA9IE1TR19NRVNTQUdFX1JFSkVDVDsKKwkJZG9uZSA9IE1TR0xPT1BfTVNHQ09NUExFVEU7CisJCXJlc3BvbnNlID0gVFJVRTsKKwl9CisKKwlpZiAoZG9uZSAhPSBNU0dMT09QX0lOX1BST0cgJiYgIXJlc3BvbnNlKQorCQkvKiBDbGVhciB0aGUgb3V0Z29pbmcgbWVzc2FnZSBidWZmZXIgKi8KKwkJYWhkLT5tc2dvdXRfbGVuID0gMDsKKworCXJldHVybiAoZG9uZSk7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgbWVzc2FnZSByZWplY3QgbWVzc2FnZS4KKyAqLworc3RhdGljIGludAorYWhkX2hhbmRsZV9tc2dfcmVqZWN0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKQoreworCS8qCisJICogV2hhdCB3ZSBjYXJlIGFib3V0IGhlcmUgaXMgaWYgd2UgaGFkIGFuCisJICogb3V0c3RhbmRpbmcgU0RUUiBvciBXRFRSIG1lc3NhZ2UgZm9yIHRoaXMKKwkgKiB0YXJnZXQuICBJZiB3ZSBkaWQsIHRoaXMgaXMgYSBzaWduYWwgdGhhdAorCSAqIHRoZSB0YXJnZXQgaXMgcmVmdXNpbmcgbmVnb3RpYXRpb24uCisJICovCisJc3RydWN0IHNjYiAqc2NiOworCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXVfaW50IHNjYl9pbmRleDsKKwl1X2ludCBsYXN0X21zZzsKKwlpbnQgICByZXNwb25zZSA9IDA7CisKKwlzY2JfaW5kZXggPSBhaGRfZ2V0X3NjYnB0cihhaGQpOworCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiX2luZGV4KTsKKwl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCSAgICBkZXZpbmZvLT5vdXJfc2NzaWlkLAorCQkJCSAgICBkZXZpbmZvLT50YXJnZXQsICZ0c3RhdGUpOworCS8qIE1pZ2h0IGJlIG5lY2Vzc2FyeSAqLworCWxhc3RfbXNnID0gYWhkX2luYihhaGQsIExBU1RfTVNHKTsKKworCWlmIChhaGRfc2VudF9tc2coYWhkLCBBSERNU0dfRVhULCBNU0dfRVhUX1BQUiwgLypmdWxsKi9GQUxTRSkpIHsKKwkJaWYgKGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR19FWFQsIE1TR19FWFRfUFBSLCAvKmZ1bGwqL1RSVUUpCisJCSAmJiB0aW5mby0+Z29hbC5wZXJpb2QgPD0gQUhEX1NZTkNSQVRFX1BBQ0VEKSB7CisJCQkvKgorCQkJICogVGFyZ2V0IG1heSBub3QgbGlrZSBvdXIgU1BJLTQgUFBSIE9wdGlvbnMuCisJCQkgKiBBdHRlbXB0IHRvIG5lZ290aWF0ZSA4ME1IeiB3aGljaCB3aWxsIHR1cm4KKwkJCSAqIG9mZiB0aGVzZSBvcHRpb25zLgorCQkJICovCisJCQlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJCQlwcmludGYoIiglczolYzolZDolZCk6IFBQUiBSZWplY3RlZC4gIgorCQkJCSAgICAgICAiVHJ5aW5nIHNpbXBsZSBVMTYwIFBQUlxuIiwKKwkJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby0+Y2hhbm5lbCwKKwkJCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOworCQkJfQorCQkJdGluZm8tPmdvYWwucGVyaW9kID0gQUhEX1NZTkNSQVRFX0RUOworCQkJdGluZm8tPmdvYWwucHByX29wdGlvbnMgJj0gTVNHX0VYVF9QUFJfSVVfUkVRCisJCQkJCQl8ICBNU0dfRVhUX1BQUl9RQVNfUkVRCisJCQkJCQl8ICBNU0dfRVhUX1BQUl9EVF9SRVE7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgdGhlIFBQUiBtZXNzYWdlLgorCQkJICogQXR0ZW1wdCB0byBuZWdvdGlhdGUgU1BJLTIgc3R5bGUuCisJCQkgKi8KKwkJCWlmIChib290dmVyYm9zZSkgeworCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogUFBSIFJlamVjdGVkLiAiCisJCQkJICAgICAgICJUcnlpbmcgV0RUUi9TRFRSXG4iLAorCQkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1bik7CisJCQl9CisJCQl0aW5mby0+Z29hbC5wcHJfb3B0aW9ucyA9IDA7CisJCQl0aW5mby0+Y3Vyci50cmFuc3BvcnRfdmVyc2lvbiA9IDI7CisJCQl0aW5mby0+Z29hbC50cmFuc3BvcnRfdmVyc2lvbiA9IDI7CisJCX0KKwkJYWhkLT5tc2dvdXRfaW5kZXggPSAwOworCQlhaGQtPm1zZ291dF9sZW4gPSAwOworCQlhaGRfYnVpbGRfdHJhbnNmZXJfbXNnKGFoZCwgZGV2aW5mbyk7CisJCWFoZC0+bXNnb3V0X2luZGV4ID0gMDsKKwkJcmVzcG9uc2UgPSAxOworCX0gZWxzZSBpZiAoYWhkX3NlbnRfbXNnKGFoZCwgQUhETVNHX0VYVCwgTVNHX0VYVF9XRFRSLCAvKmZ1bGwqL0ZBTFNFKSkgeworCisJCS8qIG5vdGUgOGJpdCB4ZmVycyAqLworCQlwcmludGYoIiglczolYzolZDolZCk6IHJlZnVzZXMgV0lERSBuZWdvdGlhdGlvbi4gIFVzaW5nICIKKwkJICAgICAgICI4Yml0IHRyYW5zZmVyc1xuIiwgYWhkX25hbWUoYWhkKSwKKwkJICAgICAgIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKKwkJYWhkX3NldF93aWR0aChhaGQsIGRldmluZm8sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisJCQkgICAgICBBSERfVFJBTlNfQUNUSVZFfEFIRF9UUkFOU19HT0FMLAorCQkJICAgICAgLypwYXVzZWQqL1RSVUUpOworCQkvKgorCQkgKiBObyBuZWVkIHRvIGNsZWFyIHRoZSBzeW5jIHJhdGUuICBJZiB0aGUgdGFyZ2V0CisJCSAqIGRpZCBub3QgYWNjZXB0IHRoZSBjb21tYW5kLCBvdXIgc3luY3JhdGUgaXMKKwkJICogdW5hZmZlY3RlZC4gIElmIHRoZSB0YXJnZXQgc3RhcnRlZCB0aGUgbmVnb3RpYXRpb24sCisJCSAqIGJ1dCByZWplY3RlZCBvdXIgcmVzcG9uc2UsIHdlIGFscmVhZHkgY2xlYXJlZCB0aGUKKwkJICogc3luYyByYXRlIGJlZm9yZSBzZW5kaW5nIG91ciBXRFRSLgorCQkgKi8KKwkJaWYgKHRpbmZvLT5nb2FsLm9mZnNldCAhPSB0aW5mby0+Y3Vyci5vZmZzZXQpIHsKKworCQkJLyogU3RhcnQgdGhlIHN5bmMgbmVnb3RpYXRpb24gKi8KKwkJCWFoZC0+bXNnb3V0X2luZGV4ID0gMDsKKwkJCWFoZC0+bXNnb3V0X2xlbiA9IDA7CisJCQlhaGRfYnVpbGRfdHJhbnNmZXJfbXNnKGFoZCwgZGV2aW5mbyk7CisJCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCQlyZXNwb25zZSA9IDE7CisJCX0KKwl9IGVsc2UgaWYgKGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR19FWFQsIE1TR19FWFRfU0RUUiwgLypmdWxsKi9GQUxTRSkpIHsKKwkJLyogbm90ZSBhc3luY2ggeGZlcnMgYW5kIGNsZWFyIGZsYWcgKi8KKwkJYWhkX3NldF9zeW5jcmF0ZShhaGQsIGRldmluZm8sIC8qcGVyaW9kKi8wLAorCQkJCSAvKm9mZnNldCovMCwgLypwcHJfb3B0aW9ucyovMCwKKwkJCQkgQUhEX1RSQU5TX0FDVElWRXxBSERfVFJBTlNfR09BTCwKKwkJCQkgLypwYXVzZWQqL1RSVUUpOworCQlwcmludGYoIiglczolYzolZDolZCk6IHJlZnVzZXMgc3luY2hyb25vdXMgbmVnb3RpYXRpb24uICIKKwkJICAgICAgICJVc2luZyBhc3luY2hyb25vdXMgdHJhbnNmZXJzXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby0+Y2hhbm5lbCwKKwkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKKwl9IGVsc2UgaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiBNU0dfU0lNUExFX1RBU0spICE9IDApIHsKKwkJaW50IHRhZ190eXBlOworCQlpbnQgbWFzazsKKworCQl0YWdfdHlwZSA9IChzY2ItPmhzY2ItPmNvbnRyb2wgJiBNU0dfU0lNUExFX1RBU0spOworCisJCWlmICh0YWdfdHlwZSA9PSBNU0dfU0lNUExFX1RBU0spIHsKKwkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogcmVmdXNlcyB0YWdnZWQgY29tbWFuZHMuICAiCisJCQkgICAgICAgIlBlcmZvcm1pbmcgbm9uLXRhZ2dlZCBJL09cbiIsIGFoZF9uYW1lKGFoZCksCisJCQkgICAgICAgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOworCQkJYWhkX3NldF90YWdzKGFoZCwgZGV2aW5mbywgQUhEX1FVRVVFX05PTkUpOworCQkJbWFzayA9IH4weDIzOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiByZWZ1c2VzICVzIHRhZ2dlZCBjb21tYW5kcy4gICIKKwkJCSAgICAgICAiUGVyZm9ybWluZyBzaW1wbGUgcXVldWUgdGFnZ2VkIEkvTyBvbmx5XG4iLAorCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKKwkJCSAgICAgICBkZXZpbmZvLT5sdW4sIHRhZ190eXBlID09IE1TR19PUkRFUkVEX1RBU0sKKwkJCSAgICAgICA/ICJvcmRlcmVkIiA6ICJoZWFkIG9mIHF1ZXVlIik7CisJCQlhaGRfc2V0X3RhZ3MoYWhkLCBkZXZpbmZvLCBBSERfUVVFVUVfQkFTSUMpOworCQkJbWFzayA9IH4weDAzOworCQl9CisKKwkJLyoKKwkJICogUmVzZW5kIHRoZSBpZGVudGlmeSBmb3IgdGhpcyBDQ0IgYXMgdGhlIHRhcmdldAorCQkgKiBtYXkgYmVsaWV2ZSB0aGF0IHRoZSBzZWxlY3Rpb24gaXMgaW52YWxpZCBvdGhlcndpc2UuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIFNDQl9DT05UUk9MLAorCQkJIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0NPTlRST0wpICYgbWFzayk7CisJIAlzY2ItPmhzY2ItPmNvbnRyb2wgJj0gbWFzazsKKwkJYWhkX3NldF90cmFuc2FjdGlvbl90YWcoc2NiLCAvKmVuYWJsZWQqL0ZBTFNFLAorCQkJCQkvKnR5cGUqL01TR19TSU1QTEVfVEFTSyk7CisJCWFoZF9vdXRiKGFoZCwgTVNHX09VVCwgTVNHX0lERU5USUZZRkxBRyk7CisJCWFoZF9hc3NlcnRfYXRuKGFoZCk7CisJCWFoZF9idXN5X3RjbChhaGQsIEJVSUxEX1RDTChzY2ItPmhzY2ItPnNjc2lpZCwgZGV2aW5mby0+bHVuKSwKKwkJCSAgICAgU0NCX0dFVF9UQUcoc2NiKSk7CisKKwkJLyoKKwkJICogUmVxdWV1ZSBhbGwgdGFnZ2VkIGNvbW1hbmRzIGZvciB0aGlzIHRhcmdldAorCQkgKiBjdXJyZW50bHkgaW4gb3VyIHBvc2Vzc2lvbiBzbyB0aGV5IGNhbiBiZQorCQkgKiBjb252ZXJ0ZWQgdG8gdW50YWdnZWQgY29tbWFuZHMuCisJCSAqLworCQlhaGRfc2VhcmNoX3FpbmZpZm8oYWhkLCBTQ0JfR0VUX1RBUkdFVChhaGQsIHNjYiksCisJCQkJICAgU0NCX0dFVF9DSEFOTkVMKGFoZCwgc2NiKSwKKwkJCQkgICBTQ0JfR0VUX0xVTihzY2IpLCAvKnRhZyovU0NCX0xJU1RfTlVMTCwKKwkJCQkgICBST0xFX0lOSVRJQVRPUiwgQ0FNX1JFUVVFVUVfUkVRLAorCQkJCSAgIFNFQVJDSF9DT01QTEVURSk7CisJfSBlbHNlIGlmIChhaGRfc2VudF9tc2coYWhkLCBBSERNU0dfMUIsIE1TR19JREVOVElGWUZMQUcsIFRSVUUpKSB7CisJCS8qCisJCSAqIE1vc3QgbGlrZWx5IHRoZSBkZXZpY2UgYmVsaWV2ZXMgdGhhdCB3ZSBoYWQKKwkJICogcHJldmlvdXNseSBuZWdvdGlhdGVkIHBhY2tldGl6ZWQuCisJCSAqLworCQlhaGQtPm1zZ19mbGFncyB8PSBNU0dfRkxBR19FWFBFQ1RfUFBSX0JVU0ZSRUUKKwkJCSAgICAgICB8ICBNU0dfRkxBR19JVV9SRVFfQ0hBTkdFRDsKKworCQlhaGRfZm9yY2VfcmVuZWdvdGlhdGlvbihhaGQsIGRldmluZm8pOworCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCWFoZC0+bXNnb3V0X2xlbiA9IDA7CisJCWFoZF9idWlsZF90cmFuc2Zlcl9tc2coYWhkLCBkZXZpbmZvKTsKKwkJYWhkLT5tc2dvdXRfaW5kZXggPSAwOworCQlyZXNwb25zZSA9IDE7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogT3RoZXJ3aXNlLCB3ZSBpZ25vcmUgaXQuCisJCSAqLworCQlwcmludGYoIiVzOiVjOiVkOiBNZXNzYWdlIHJlamVjdCBmb3IgJXggLS0gaWdub3JlZFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKKwkJICAgICAgIGxhc3RfbXNnKTsKKwl9CisJcmV0dXJuIChyZXNwb25zZSk7Cit9CisKKy8qCisgKiBQcm9jZXNzIGFuIGluZ25vcmUgd2lkZSByZXNpZHVlIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyB2b2lkCithaGRfaGFuZGxlX2lnbl93aWRlX3Jlc2lkdWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pCit7CisJdV9pbnQgc2NiX2luZGV4OworCXN0cnVjdCBzY2IgKnNjYjsKKworCXNjYl9pbmRleCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JfaW5kZXgpOworCS8qCisJICogWFhYIEFjdHVhbGx5IGNoZWNrIGRhdGEgZGlyZWN0aW9uIGluIHRoZSBzZXF1ZW5jZXI/CisJICogUGVyaGFwcyBhZGQgZGF0YWRpciB0byBzb21lIHNwYXJlIGJpdHMgaW4gdGhlIGhzY2I/CisJICovCisJaWYgKChhaGRfaW5iKGFoZCwgU0VRX0ZMQUdTKSAmIERQSEFTRSkgPT0gMAorCSB8fCBhaGRfZ2V0X3RyYW5zZmVyX2RpcihzY2IpICE9IENBTV9ESVJfSU4pIHsKKwkJLyoKKwkJICogSWdub3JlIHRoZSBtZXNzYWdlIGlmIHdlIGhhdmVuJ3QKKwkJICogc2VlbiBhbiBhcHByb3ByaWF0ZSBkYXRhIHBoYXNlIHlldC4KKwkJICovCisJfSBlbHNlIHsKKwkJLyoKKwkJICogSWYgdGhlIHJlc2lkdWFsIG9jY3VycmVkIG9uIHRoZSBsYXN0CisJCSAqIHRyYW5zZmVyIGFuZCB0aGUgdHJhbnNmZXIgcmVxdWVzdCB3YXMKKwkJICogZXhwZWN0ZWQgdG8gZW5kIG9uIGFuIG9kZCBjb3VudCwgZG8KKwkJICogbm90aGluZy4gIE90aGVyd2lzZSwgc3VidHJhY3QgYSBieXRlCisJCSAqIGFuZCB1cGRhdGUgdGhlIHJlc2lkdWFsIGNvdW50IGFjY29yZGluZ2x5LgorCQkgKi8KKwkJdWludDMyX3Qgc2dwdHI7CisKKwkJc2dwdHIgPSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUik7CisJCWlmICgoc2dwdHIgJiBTR19MSVNUX05VTEwpICE9IDAKKwkJICYmIChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9UQVNLX0FUVFJJQlVURSkKKwkJICAgICAmIFNDQl9YRkVSTEVOX09ERCkgIT0gMCkgeworCQkJLyoKKwkJCSAqIElmIHRoZSByZXNpZHVhbCBvY2N1cnJlZCBvbiB0aGUgbGFzdAorCQkJICogdHJhbnNmZXIgYW5kIHRoZSB0cmFuc2ZlciByZXF1ZXN0IHdhcworCQkJICogZXhwZWN0ZWQgdG8gZW5kIG9uIGFuIG9kZCBjb3VudCwgZG8KKwkJCSAqIG5vdGhpbmcuCisJCQkgKi8KKwkJfSBlbHNlIHsKKwkJCXVpbnQzMl90IGRhdGFfY250OworCQkJdWludDY0X3QgZGF0YV9hZGRyOworCQkJdWludDMyX3Qgc2dsZW47CisKKwkJCS8qIFB1bGwgaW4gdGhlIHJlc3Qgb2YgdGhlIHNncHRyICovCisJCQlzZ3B0ciA9IGFoZF9pbmxfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSKTsKKwkJCWRhdGFfY250ID0gYWhkX2lubF9zY2JyYW0oYWhkLCBTQ0JfUkVTSURVQUxfREFUQUNOVCk7CisJCQlpZiAoKHNncHRyICYgU0dfTElTVF9OVUxMKSAhPSAwKSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgcmVzaWR1YWwgZGF0YSBjb3VudCBpcyBub3QgdXBkYXRlZAorCQkJCSAqIGZvciB0aGUgY29tbWFuZCBydW4gdG8gY29tcGxldGlvbiBjYXNlLgorCQkJCSAqIEV4cGxpY2l0bHkgemVybyB0aGUgY291bnQuCisJCQkJICovCisJCQkJZGF0YV9jbnQgJj0gfkFIRF9TR19MRU5fTUFTSzsKKwkJCX0KKwkJCWRhdGFfYWRkciA9IGFoZF9pbnEoYWhkLCBTSEFERFIpOworCQkJZGF0YV9jbnQgKz0gMTsKKwkJCWRhdGFfYWRkciAtPSAxOworCQkJc2dwdHIgJj0gU0dfUFRSX01BU0s7CisJCQlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfNjRCSVRfQUREUkVTU0lORykgIT0gMCkgeworCQkJCXN0cnVjdCBhaGRfZG1hNjRfc2VnICpzZzsKKworCQkJCXNnID0gYWhkX3NnX2J1c190b192aXJ0KGFoZCwgc2NiLCBzZ3B0cik7CisKKwkJCQkvKgorCQkJCSAqIFRoZSByZXNpZHVhbCBzZyBwdHIgcG9pbnRzIHRvIHRoZSBuZXh0IFMvRworCQkJCSAqIHRvIGxvYWQgc28gd2UgbXVzdCBnbyBiYWNrIG9uZS4KKwkJCQkgKi8KKwkJCQlzZy0tOworCQkJCXNnbGVuID0gYWhkX2xlMzJ0b2goc2ctPmxlbikgJiBBSERfU0dfTEVOX01BU0s7CisJCQkJaWYgKHNnICE9IHNjYi0+c2dfbGlzdAorCQkJCSAmJiBzZ2xlbiA8IChkYXRhX2NudCAmIEFIRF9TR19MRU5fTUFTSykpIHsKKworCQkJCQlzZy0tOworCQkJCQlzZ2xlbiA9IGFoZF9sZTMydG9oKHNnLT5sZW4pOworCQkJCQkvKgorCQkJCQkgKiBQcmVzZXJ2ZSBIaWdoIEFkZHJlc3MgYW5kIFNHX0xJU1QKKwkJCQkJICogYml0cyB3aGlsZSBzZXR0aW5nIHRoZSBjb3VudCB0byAxLgorCQkJCQkgKi8KKwkJCQkJZGF0YV9jbnQgPSAxfChzZ2xlbiYofkFIRF9TR19MRU5fTUFTSykpOworCQkJCQlkYXRhX2FkZHIgPSBhaGRfbGU2NHRvaChzZy0+YWRkcikKKwkJCQkJCSAgKyAoc2dsZW4gJiBBSERfU0dfTEVOX01BU0spCisJCQkJCQkgIC0gMTsKKworCQkJCQkvKgorCQkJCQkgKiBJbmNyZW1lbnQgc2cgc28gaXQgcG9pbnRzIHRvIHRoZQorCQkJCQkgKiAibmV4dCIgc2cuCisJCQkJCSAqLworCQkJCQlzZysrOworCQkJCQlzZ3B0ciA9IGFoZF9zZ192aXJ0X3RvX2J1cyhhaGQsIHNjYiwKKwkJCQkJCQkJICAgc2cpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IGFoZF9kbWFfc2VnICpzZzsKKworCQkJCXNnID0gYWhkX3NnX2J1c190b192aXJ0KGFoZCwgc2NiLCBzZ3B0cik7CisKKwkJCQkvKgorCQkJCSAqIFRoZSByZXNpZHVhbCBzZyBwdHIgcG9pbnRzIHRvIHRoZSBuZXh0IFMvRworCQkJCSAqIHRvIGxvYWQgc28gd2UgbXVzdCBnbyBiYWNrIG9uZS4KKwkJCQkgKi8KKwkJCQlzZy0tOworCQkJCXNnbGVuID0gYWhkX2xlMzJ0b2goc2ctPmxlbikgJiBBSERfU0dfTEVOX01BU0s7CisJCQkJaWYgKHNnICE9IHNjYi0+c2dfbGlzdAorCQkJCSAmJiBzZ2xlbiA8IChkYXRhX2NudCAmIEFIRF9TR19MRU5fTUFTSykpIHsKKworCQkJCQlzZy0tOworCQkJCQlzZ2xlbiA9IGFoZF9sZTMydG9oKHNnLT5sZW4pOworCQkJCQkvKgorCQkJCQkgKiBQcmVzZXJ2ZSBIaWdoIEFkZHJlc3MgYW5kIFNHX0xJU1QKKwkJCQkJICogYml0cyB3aGlsZSBzZXR0aW5nIHRoZSBjb3VudCB0byAxLgorCQkJCQkgKi8KKwkJCQkJZGF0YV9jbnQgPSAxfChzZ2xlbiYofkFIRF9TR19MRU5fTUFTSykpOworCQkJCQlkYXRhX2FkZHIgPSBhaGRfbGUzMnRvaChzZy0+YWRkcikKKwkJCQkJCSAgKyAoc2dsZW4gJiBBSERfU0dfTEVOX01BU0spCisJCQkJCQkgIC0gMTsKKworCQkJCQkvKgorCQkJCQkgKiBJbmNyZW1lbnQgc2cgc28gaXQgcG9pbnRzIHRvIHRoZQorCQkJCQkgKiAibmV4dCIgc2cuCisJCQkJCSAqLworCQkJCQlzZysrOworCQkJCQlzZ3B0ciA9IGFoZF9zZ192aXJ0X3RvX2J1cyhhaGQsIHNjYiwKKwkJCQkJCQkJICBzZyk7CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCSAqIFRvZ2dsZSB0aGUgIm9kZG5lc3MiIG9mIHRoZSB0cmFuc2ZlciBsZW5ndGgKKwkJCSAqIHRvIGhhbmRsZSB0aGlzIG1pZC10cmFuc2ZlciBpZ25vcmUgd2lkZQorCQkJICogcmVzaWR1ZS4gIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBvZGRuZXNzIGlzCisJCQkgKiBjb3JyZWN0IGZvciBzdWJzZXF1ZW50IGRhdGEgdHJhbnNmZXJzLgorCQkJICovCisJCQlhaGRfb3V0YihhaGQsIFNDQl9UQVNLX0FUVFJJQlVURSwKKwkJCSAgICBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9UQVNLX0FUVFJJQlVURSkKKwkJCSAgICBeIFNDQl9YRkVSTEVOX09ERCk7CisKKwkJCWFoZF9vdXRsKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSLCBzZ3B0cik7CisJCQlhaGRfb3V0bChhaGQsIFNDQl9SRVNJRFVBTF9EQVRBQ05ULCBkYXRhX2NudCk7CisJCQkvKgorCQkJICogVGhlIEZJRk8ncyBwb2ludGVycyB3aWxsIGJlIHVwZGF0ZWQgaWYvd2hlbiB0aGUKKwkJCSAqIHNlcXVlbmNlciByZS1lbnRlcnMgYSBkYXRhIHBoYXNlLgorCQkJICovCisJCX0KKwl9Cit9CisKKworLyoKKyAqIFJlaW5pdGlhbGl6ZSB0aGUgZGF0YSBwb2ludGVycyBmb3IgdGhlIGFjdGl2ZSB0cmFuc2ZlcgorICogYmFzZWQgb24gaXRzIGN1cnJlbnQgcmVzaWR1YWwuCisgKi8KK3N0YXRpYyB2b2lkCithaGRfcmVpbml0aWFsaXplX2RhdGFwdHJzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlzdHJ1Y3QJCSBzY2IgKnNjYjsKKwlhaGRfbW9kZV9zdGF0ZQkgc2F2ZWRfbW9kZXM7CisJdV9pbnQJCSBzY2JfaW5kZXg7CisJdV9pbnQJCSB3YWl0OworCXVpbnQzMl90CSBzZ3B0cjsKKwl1aW50MzJfdAkgcmVzaWQ7CisJdWludDY0X3QJIGRhdGFwdHI7CisKKwlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfREZGMF9NU0t8QUhEX01PREVfREZGMV9NU0ssCisJCQkgQUhEX01PREVfREZGMF9NU0t8QUhEX01PREVfREZGMV9NU0spOworCQkJIAorCXNjYl9pbmRleCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JfaW5kZXgpOworCisJLyoKKwkgKiBSZWxlYXNlIGFuZCByZWFjcXVpcmUgdGhlIEZJRk8gc28gd2UKKwkgKiBoYXZlIGEgY2xlYW4gc2xhdGUuCisJICovCisJYWhkX291dGIoYWhkLCBERkZTWEZSQ1RMLCBDTFJDSE4pOworCXdhaXQgPSAxMDAwOworCXdoaWxlICgtLXdhaXQgJiYgIShhaGRfaW5iKGFoZCwgTURGRlNUQVQpICYgRklGT0ZSRUUpKQorCQlhaGRfZGVsYXkoMTAwKTsKKwlpZiAod2FpdCA9PSAwKSB7CisJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJcHJpbnRmKCJhaGRfcmVpbml0aWFsaXplX2RhdGFwdHJzOiBGb3JjaW5nIEZJRk8gZnJlZS5cbiIpOworCQlhaGRfb3V0YihhaGQsIERGRlNYRlJDVEwsIFJTVENITnxDTFJTSENOVCk7CisJfQorCXNhdmVkX21vZGVzID0gYWhkX3NhdmVfbW9kZXMoYWhkKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJYWhkX291dGIoYWhkLCBERkZTVEFULAorCQkgYWhkX2luYihhaGQsIERGRlNUQVQpCisJCXwgKHNhdmVkX21vZGVzID09IDB4MTEgPyBDVVJSRklGT18xIDogQ1VSUkZJRk9fMCkpOworCisJLyoKKwkgKiBEZXRlcm1pbmUgaW5pdGlhbCB2YWx1ZXMgZm9yIGRhdGFfYWRkciBhbmQgZGF0YV9jbnQKKwkgKiBmb3IgcmVzdW1pbmcgdGhlIGRhdGEgcGhhc2UuCisJICovCisJc2dwdHIgPSAoYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfUkVTSURVQUxfU0dQVFIgKyAzKSA8PCAyNCkKKwkgICAgICB8IChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUiArIDIpIDw8IDE2KQorCSAgICAgIHwgKGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSICsgMSkgPDwgOCkKKwkgICAgICB8CWFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSKTsKKwlzZ3B0ciAmPSBTR19QVFJfTUFTSzsKKworCXJlc2lkID0gKGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX0RBVEFDTlQgKyAyKSA8PCAxNikKKwkgICAgICB8IChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9SRVNJRFVBTF9EQVRBQ05UICsgMSkgPDwgOCkKKwkgICAgICB8IGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX0RBVEFDTlQpOworCisJaWYgKChhaGQtPmZsYWdzICYgQUhEXzY0QklUX0FERFJFU1NJTkcpICE9IDApIHsKKwkJc3RydWN0IGFoZF9kbWE2NF9zZWcgKnNnOworCisJCXNnID0gYWhkX3NnX2J1c190b192aXJ0KGFoZCwgc2NiLCBzZ3B0cik7CisKKwkJLyogVGhlIHJlc2lkdWFsIHNnX3B0ciBhbHdheXMgcG9pbnRzIHRvIHRoZSBuZXh0IHNnICovCisJCXNnLS07CisKKwkJZGF0YXB0ciA9IGFoZF9sZTY0dG9oKHNnLT5hZGRyKQorCQkJKyAoYWhkX2xlMzJ0b2goc2ctPmxlbikgJiBBSERfU0dfTEVOX01BU0spCisJCQktIHJlc2lkOworCQlhaGRfb3V0YihhaGQsIEhBRERSICsgNywgZGF0YXB0ciA+PiA1Nik7CisJCWFoZF9vdXRiKGFoZCwgSEFERFIgKyA2LCBkYXRhcHRyID4+IDQ4KTsKKwkJYWhkX291dGIoYWhkLCBIQUREUiArIDUsIGRhdGFwdHIgPj4gNDApOworCQlhaGRfb3V0YihhaGQsIEhBRERSICsgNCwgZGF0YXB0ciA+PiAzMik7CisJfSBlbHNlIHsKKwkJc3RydWN0CSBhaGRfZG1hX3NlZyAqc2c7CisKKwkJc2cgPSBhaGRfc2dfYnVzX3RvX3ZpcnQoYWhkLCBzY2IsIHNncHRyKTsKKworCQkvKiBUaGUgcmVzaWR1YWwgc2dfcHRyIGFsd2F5cyBwb2ludHMgdG8gdGhlIG5leHQgc2cgKi8KKwkJc2ctLTsKKworCQlkYXRhcHRyID0gYWhkX2xlMzJ0b2goc2ctPmFkZHIpCisJCQkrIChhaGRfbGUzMnRvaChzZy0+bGVuKSAmIEFIRF9TR19MRU5fTUFTSykKKwkJCS0gcmVzaWQ7CisJCWFoZF9vdXRiKGFoZCwgSEFERFIgKyA0LAorCQkJIChhaGRfbGUzMnRvaChzZy0+bGVuKSAmIH5BSERfU0dfTEVOX01BU0spID4+IDI0KTsKKwl9CisJYWhkX291dGIoYWhkLCBIQUREUiArIDMsIGRhdGFwdHIgPj4gMjQpOworCWFoZF9vdXRiKGFoZCwgSEFERFIgKyAyLCBkYXRhcHRyID4+IDE2KTsKKwlhaGRfb3V0YihhaGQsIEhBRERSICsgMSwgZGF0YXB0ciA+PiA4KTsKKwlhaGRfb3V0YihhaGQsIEhBRERSLCBkYXRhcHRyKTsKKwlhaGRfb3V0YihhaGQsIEhDTlQgKyAyLCByZXNpZCA+PiAxNik7CisJYWhkX291dGIoYWhkLCBIQ05UICsgMSwgcmVzaWQgPj4gOCk7CisJYWhkX291dGIoYWhkLCBIQ05ULCByZXNpZCk7Cit9CisKKy8qCisgKiBIYW5kbGUgdGhlIGVmZmVjdHMgb2YgaXNzdWluZyBhIGJ1cyBkZXZpY2UgcmVzZXQgbWVzc2FnZS4KKyAqLworc3RhdGljIHZvaWQKK2FoZF9oYW5kbGVfZGV2cmVzZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCSAgICB1X2ludCBsdW4sIGNhbV9zdGF0dXMgc3RhdHVzLCBjaGFyICptZXNzYWdlLAorCQkgICAgaW50IHZlcmJvc2VfbGV2ZWwpCit7CisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCisJc3RydWN0IGFoZF90bW9kZV90c3RhdGUqIHRzdGF0ZTsKKyNlbmRpZgorCWludCBmb3VuZDsKKworCWZvdW5kID0gYWhkX2Fib3J0X3NjYnMoYWhkLCBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmNoYW5uZWwsCisJCQkgICAgICAgbHVuLCBTQ0JfTElTVF9OVUxMLCBkZXZpbmZvLT5yb2xlLAorCQkJICAgICAgIHN0YXR1cyk7CisKKyNpZmRlZiBBSERfVEFSR0VUX01PREUKKwkvKgorCSAqIFNlbmQgYW4gaW1tZWRpYXRlIG5vdGlmeSBjY2IgdG8gYWxsIHRhcmdldCBtb3JkIHBlcmlwaGVyYWwKKwkgKiBkcml2ZXJzIGFmZmVjdGVkIGJ5IHRoaXMgYWN0aW9uLgorCSAqLworCXRzdGF0ZSA9IGFoZC0+ZW5hYmxlZF90YXJnZXRzW2RldmluZm8tPm91cl9zY3NpaWRdOworCWlmICh0c3RhdGUgIT0gTlVMTCkgeworCQl1X2ludCBjdXJfbHVuOworCQl1X2ludCBtYXhfbHVuOworCisJCWlmIChsdW4gIT0gQ0FNX0xVTl9XSUxEQ0FSRCkgeworCQkJY3VyX2x1biA9IDA7CisJCQltYXhfbHVuID0gQUhEX05VTV9MVU5TIC0gMTsKKwkJfSBlbHNlIHsKKwkJCWN1cl9sdW4gPSBsdW47CisJCQltYXhfbHVuID0gbHVuOworCQl9CisJCWZvciAoY3VyX2x1biA8PSBtYXhfbHVuOyBjdXJfbHVuKyspIHsKKwkJCXN0cnVjdCBhaGRfdG1vZGVfbHN0YXRlKiBsc3RhdGU7CisKKwkJCWxzdGF0ZSA9IHRzdGF0ZS0+ZW5hYmxlZF9sdW5zW2N1cl9sdW5dOworCQkJaWYgKGxzdGF0ZSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCisJCQlhaGRfcXVldWVfbHN0YXRlX2V2ZW50KGFoZCwgbHN0YXRlLCBkZXZpbmZvLT5vdXJfc2NzaWlkLAorCQkJCQkgICAgICAgTVNHX0JVU19ERVZfUkVTRVQsIC8qYXJnKi8wKTsKKwkJCWFoZF9zZW5kX2xzdGF0ZV9ldmVudHMoYWhkLCBsc3RhdGUpOworCQl9CisJfQorI2VuZGlmCisKKwkvKgorCSAqIEdvIGJhY2sgdG8gYXN5bmMvbmFycm93IHRyYW5zZmVycyBhbmQgcmVuZWdvdGlhdGUuCisJICovCisJYWhkX3NldF93aWR0aChhaGQsIGRldmluZm8sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisJCSAgICAgIEFIRF9UUkFOU19DVVIsIC8qcGF1c2VkKi9UUlVFKTsKKwlhaGRfc2V0X3N5bmNyYXRlKGFoZCwgZGV2aW5mbywgLypwZXJpb2QqLzAsIC8qb2Zmc2V0Ki8wLAorCQkJIC8qcHByX29wdGlvbnMqLzAsIEFIRF9UUkFOU19DVVIsIC8qcGF1c2VkKi9UUlVFKTsKKwkKKwlhaGRfc2VuZF9hc3luYyhhaGQsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKKwkJICAgICAgIGx1biwgQUNfU0VOVF9CRFIsIE5VTEwpOworCisJaWYgKG1lc3NhZ2UgIT0gTlVMTAorCSAmJiAodmVyYm9zZV9sZXZlbCA8PSBib290dmVyYm9zZSkpCisJCXByaW50ZigiJXM6ICVzIG9uICVjOiVkLiAlZCBTQ0JzIGFib3J0ZWRcbiIsIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICBtZXNzYWdlLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsIGZvdW5kKTsKK30KKworI2lmZGVmIEFIRF9UQVJHRVRfTU9ERQorc3RhdGljIHZvaWQKK2FoZF9zZXR1cF90YXJnZXRfbXNnaW4oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCSAgICAgICBzdHJ1Y3Qgc2NiICpzY2IpCit7CisKKwkvKiAgICAgICAgICAgICAgCisJICogVG8gZmFjaWxpdGF0ZSBhZGRpbmcgbXVsdGlwbGUgbWVzc2FnZXMgdG9nZXRoZXIsCisJICogZWFjaCByb3V0aW5lIHNob3VsZCBpbmNyZW1lbnQgdGhlIGluZGV4IGFuZCBsZW4KKwkgKiB2YXJpYWJsZXMgaW5zdGVhZCBvZiBzZXR0aW5nIHRoZW0gZXhwbGljaXRseS4KKwkgKi8gICAgICAgICAgICAgCisJYWhkLT5tc2dvdXRfaW5kZXggPSAwOworCWFoZC0+bXNnb3V0X2xlbiA9IDA7CisKKwlpZiAoc2NiICE9IE5VTEwgJiYgKHNjYi0+ZmxhZ3MgJiBTQ0JfQVVUT19ORUdPVElBVEUpICE9IDApCisJCWFoZF9idWlsZF90cmFuc2Zlcl9tc2coYWhkLCBkZXZpbmZvKTsKKwllbHNlCisJCXBhbmljKCJhaGRfaW50cjogQVdBSVRJTkcgdGFyZ2V0IG1lc3NhZ2Ugd2l0aCBubyBtZXNzYWdlIik7CisKKwlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJYWhkLT5tc2dfdHlwZSA9IE1TR19UWVBFX1RBUkdFVF9NU0dJTjsKK30KKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogSW5pdGlhbGl6YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1X2ludAorYWhkX3NnbGlzdF9zaXplKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlidXNfc2l6ZV90IGxpc3Rfc2l6ZTsKKworCWxpc3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWhkX2RtYV9zZWcpICogQUhEX05TRUc7CisJaWYgKChhaGQtPmZsYWdzICYgQUhEXzY0QklUX0FERFJFU1NJTkcpICE9IDApCisJCWxpc3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWhkX2RtYTY0X3NlZykgKiBBSERfTlNFRzsKKwlyZXR1cm4gKGxpc3Rfc2l6ZSk7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIG9wdGltdW0gUy9HIExpc3QgYWxsb2NhdGlvbiBzaXplLiAgUy9HIGVsZW1lbnRzIHVzZWQKKyAqIGZvciBhIGdpdmVuIHRyYW5zYWN0aW9uIG11c3QgYmUgcGh5c2ljYWxseSBjb250aWd1b3VzLiAgQXNzdW1lIHRoZQorICogT1Mgd2lsbCBhbGxvY2F0ZSBmdWxsIHBhZ2VzIHRvIHVzLCBzbyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcmVxdWVzdAorICogbGVzcyB0aGFuIGEgcGFnZS4KKyAqLworc3RhdGljIHVfaW50CithaGRfc2dsaXN0X2FsbG9jc2l6ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJYnVzX3NpemVfdCBzZ19saXN0X2luY3JlbWVudDsKKwlidXNfc2l6ZV90IHNnX2xpc3Rfc2l6ZTsKKwlidXNfc2l6ZV90IG1heF9saXN0X3NpemU7CisJYnVzX3NpemVfdCBiZXN0X2xpc3Rfc2l6ZTsKKworCS8qIFN0YXJ0IG91dCB3aXRoIHRoZSBtaW5pbXVtIHJlcXVpcmVkIGZvciBBSERfTlNFRy4gKi8KKwlzZ19saXN0X2luY3JlbWVudCA9IGFoZF9zZ2xpc3Rfc2l6ZShhaGQpOworCXNnX2xpc3Rfc2l6ZSA9IHNnX2xpc3RfaW5jcmVtZW50OworCisJLyogR2V0IHVzIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIGEgcGFnZSBpbiBzaXplLiAqLworCXdoaWxlICgoc2dfbGlzdF9zaXplICsgc2dfbGlzdF9pbmNyZW1lbnQpIDw9IFBBR0VfU0laRSkKKwkJc2dfbGlzdF9zaXplICs9IHNnX2xpc3RfaW5jcmVtZW50OworCisJLyoKKwkgKiBUcnkgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2Ygd2FzdGFnZSBieSBhbGxvY2F0aW5nCisJICogbXVsdGlwbGUgcGFnZXMuCisJICovCisJYmVzdF9saXN0X3NpemUgPSBzZ19saXN0X3NpemU7CisJbWF4X2xpc3Rfc2l6ZSA9IHJvdW5kdXAoc2dfbGlzdF9pbmNyZW1lbnQsIFBBR0VfU0laRSk7CisJaWYgKG1heF9saXN0X3NpemUgPCA0ICogUEFHRV9TSVpFKQorCQltYXhfbGlzdF9zaXplID0gNCAqIFBBR0VfU0laRTsKKwlpZiAobWF4X2xpc3Rfc2l6ZSA+IChBSERfU0NCX01BWF9BTExPQyAqIHNnX2xpc3RfaW5jcmVtZW50KSkKKwkJbWF4X2xpc3Rfc2l6ZSA9IChBSERfU0NCX01BWF9BTExPQyAqIHNnX2xpc3RfaW5jcmVtZW50KTsKKwl3aGlsZSAoKHNnX2xpc3Rfc2l6ZSArIHNnX2xpc3RfaW5jcmVtZW50KSA8PSBtYXhfbGlzdF9zaXplCisJICAgJiYgIChzZ19saXN0X3NpemUgJSBQQUdFX1NJWkUpICE9IDApIHsKKwkJYnVzX3NpemVfdCBuZXdfbW9kOworCQlidXNfc2l6ZV90IGJlc3RfbW9kOworCisJCXNnX2xpc3Rfc2l6ZSArPSBzZ19saXN0X2luY3JlbWVudDsKKwkJbmV3X21vZCA9IHNnX2xpc3Rfc2l6ZSAlIFBBR0VfU0laRTsKKwkJYmVzdF9tb2QgPSBiZXN0X2xpc3Rfc2l6ZSAlIFBBR0VfU0laRTsKKwkJaWYgKG5ld19tb2QgPiBiZXN0X21vZCB8fCBuZXdfbW9kID09IDApIHsKKwkJCWJlc3RfbGlzdF9zaXplID0gc2dfbGlzdF9zaXplOworCQl9CisJfQorCXJldHVybiAoYmVzdF9saXN0X3NpemUpOworfQorCisvKgorICogQWxsb2NhdGUgYSBjb250cm9sbGVyIHN0cnVjdHVyZSBmb3IgYSBuZXcgZGV2aWNlCisgKiBhbmQgcGVyZm9ybSBpbml0aWFsIGluaXRpYWxpemlvbi4KKyAqLworc3RydWN0IGFoZF9zb2Z0YyAqCithaGRfYWxsb2Modm9pZCAqcGxhdGZvcm1fYXJnLCBjaGFyICpuYW1lKQoreworCXN0cnVjdCAgYWhkX3NvZnRjICphaGQ7CisKKyNpZm5kZWYJX19GcmVlQlNEX18KKwlhaGQgPSBtYWxsb2Moc2l6ZW9mKCphaGQpLCBNX0RFVkJVRiwgTV9OT1dBSVQpOworCWlmICghYWhkKSB7CisJCXByaW50ZigiYWljN3h4eDogY2Fubm90IG1hbGxvYyBzb2Z0YyFcbiIpOworCQlmcmVlKG5hbWUsIE1fREVWQlVGKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorI2Vsc2UKKwlhaGQgPSBkZXZpY2VfZ2V0X3NvZnRjKChkZXZpY2VfdClwbGF0Zm9ybV9hcmcpOworI2VuZGlmCisJbWVtc2V0KGFoZCwgMCwgc2l6ZW9mKCphaGQpKTsKKwlhaGQtPnNlZXBfY29uZmlnID0gbWFsbG9jKHNpemVvZigqYWhkLT5zZWVwX2NvbmZpZyksCisJCQkJICBNX0RFVkJVRiwgTV9OT1dBSVQpOworCWlmIChhaGQtPnNlZXBfY29uZmlnID09IE5VTEwpIHsKKyNpZm5kZWYJX19GcmVlQlNEX18KKwkJZnJlZShhaGQsIE1fREVWQlVGKTsKKyNlbmRpZgorCQlmcmVlKG5hbWUsIE1fREVWQlVGKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJTElTVF9JTklUKCZhaGQtPnBlbmRpbmdfc2Nicyk7CisJLyogV2UgZG9uJ3Qga25vdyBvdXIgdW5pdCBudW1iZXIgdW50aWwgdGhlIE9TTSBzZXRzIGl0ICovCisJYWhkLT5uYW1lID0gbmFtZTsKKwlhaGQtPnVuaXQgPSAtMTsKKwlhaGQtPmRlc2NyaXB0aW9uID0gTlVMTDsKKwlhaGQtPmJ1c19kZXNjcmlwdGlvbiA9IE5VTEw7CisJYWhkLT5jaGFubmVsID0gJ0EnOworCWFoZC0+Y2hpcCA9IEFIRF9OT05FOworCWFoZC0+ZmVhdHVyZXMgPSBBSERfRkVOT05FOworCWFoZC0+YnVncyA9IEFIRF9CVUdOT05FOworCWFoZC0+ZmxhZ3MgPSBBSERfU1BDSEtfRU5CX0F8QUhEX1JFU0VUX0JVU19BfEFIRF9URVJNX0VOQl9BCisJCSAgIHwgQUhEX0VYVEVOREVEX1RSQU5TX0F8QUhEX1NUUFdMRVZFTF9BOworCWFoZF90aW1lcl9pbml0KCZhaGQtPnJlc2V0X3RpbWVyKTsKKwlhaGRfdGltZXJfaW5pdCgmYWhkLT5zdGF0X3RpbWVyKTsKKwlhaGQtPmludF9jb2FsZXNjaW5nX3RpbWVyID0gQUhEX0lOVF9DT0FMRVNDSU5HX1RJTUVSX0RFRkFVTFQ7CisJYWhkLT5pbnRfY29hbGVzY2luZ19tYXhjbWRzID0gQUhEX0lOVF9DT0FMRVNDSU5HX01BWENNRFNfREVGQVVMVDsKKwlhaGQtPmludF9jb2FsZXNjaW5nX21pbmNtZHMgPSBBSERfSU5UX0NPQUxFU0NJTkdfTUlOQ01EU19ERUZBVUxUOworCWFoZC0+aW50X2NvYWxlc2NpbmdfdGhyZXNob2xkID0gQUhEX0lOVF9DT0FMRVNDSU5HX1RIUkVTSE9MRF9ERUZBVUxUOworCWFoZC0+aW50X2NvYWxlc2Npbmdfc3RvcF90aHJlc2hvbGQgPQorCSAgICBBSERfSU5UX0NPQUxFU0NJTkdfU1RPUF9USFJFU0hPTERfREVGQVVMVDsKKworCWlmIChhaGRfcGxhdGZvcm1fYWxsb2MoYWhkLCBwbGF0Zm9ybV9hcmcpICE9IDApIHsKKwkJYWhkX2ZyZWUoYWhkKTsKKwkJYWhkID0gTlVMTDsKKwl9CisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NRU1PUlkpICE9IDApIHsKKwkJcHJpbnRmKCIlczogc2NiIHNpemUgPSAweCV4LCBoc2NiIHNpemUgPSAweCV4XG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgKHVfaW50KXNpemVvZihzdHJ1Y3Qgc2NiKSwKKwkJICAgICAgICh1X2ludClzaXplb2Yoc3RydWN0IGhhcmR3YXJlX3NjYikpOworCX0KKyNlbmRpZgorCXJldHVybiAoYWhkKTsKK30KKworaW50CithaGRfc29mdGNfaW5pdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisKKwlhaGQtPnVucGF1c2UgPSAwOworCWFoZC0+cGF1c2UgPSBQQVVTRTsgCisJcmV0dXJuICgwKTsKK30KKwordm9pZAorYWhkX3NvZnRjX2luc2VydChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJc3RydWN0IGFoZF9zb2Z0YyAqbGlzdF9haGQ7CisKKyNpZiBBSERfUENJX0NPTkZJRyA+IDAKKwkvKgorCSAqIFNlY29uZCBGdW5jdGlvbiBQQ0kgZGV2aWNlcyBuZWVkIHRvIGluaGVyaXQgc29tZQorCSAqIHNldHRpbmdzIGZyb20gZnVuY3Rpb24gMC4KKwkgKi8KKwlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfTVVMVElfRlVOQykgIT0gMCkgeworCQlUQUlMUV9GT1JFQUNIKGxpc3RfYWhkLCAmYWhkX3RhaWxxLCBsaW5rcykgeworCQkJYWhkX2Rldl9zb2Z0Y190IGxpc3RfcGNpOworCQkJYWhkX2Rldl9zb2Z0Y190IHBjaTsKKworCQkJbGlzdF9wY2kgPSBsaXN0X2FoZC0+ZGV2X3NvZnRjOworCQkJcGNpID0gYWhkLT5kZXZfc29mdGM7CisJCQlpZiAoYWhkX2dldF9wY2lfc2xvdChsaXN0X3BjaSkgPT0gYWhkX2dldF9wY2lfc2xvdChwY2kpCisJCQkgJiYgYWhkX2dldF9wY2lfYnVzKGxpc3RfcGNpKSA9PSBhaGRfZ2V0X3BjaV9idXMocGNpKSkgeworCQkJCXN0cnVjdCBhaGRfc29mdGMgKm1hc3RlcjsKKwkJCQlzdHJ1Y3QgYWhkX3NvZnRjICpzbGF2ZTsKKworCQkJCWlmIChhaGRfZ2V0X3BjaV9mdW5jdGlvbihsaXN0X3BjaSkgPT0gMCkgeworCQkJCQltYXN0ZXIgPSBsaXN0X2FoZDsKKwkJCQkJc2xhdmUgPSBhaGQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJbWFzdGVyID0gYWhkOworCQkJCQlzbGF2ZSA9IGxpc3RfYWhkOworCQkJCX0KKwkJCQlzbGF2ZS0+ZmxhZ3MgJj0gfkFIRF9CSU9TX0VOQUJMRUQ7IAorCQkJCXNsYXZlLT5mbGFncyB8PQorCQkJCSAgICBtYXN0ZXItPmZsYWdzICYgQUhEX0JJT1NfRU5BQkxFRDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJLyoKKwkgKiBJbnNlcnRpb24gc29ydCBpbnRvIG91ciBsaXN0IG9mIHNvZnRjcy4KKwkgKi8KKwlsaXN0X2FoZCA9IFRBSUxRX0ZJUlNUKCZhaGRfdGFpbHEpOworCXdoaWxlIChsaXN0X2FoZCAhPSBOVUxMCisJICAgICYmIGFoZF9zb2Z0Y19jb21wKGFoZCwgbGlzdF9haGQpIDw9IDApCisJCWxpc3RfYWhkID0gVEFJTFFfTkVYVChsaXN0X2FoZCwgbGlua3MpOworCWlmIChsaXN0X2FoZCAhPSBOVUxMKQorCQlUQUlMUV9JTlNFUlRfQkVGT1JFKGxpc3RfYWhkLCBhaGQsIGxpbmtzKTsKKwllbHNlCisJCVRBSUxRX0lOU0VSVF9UQUlMKCZhaGRfdGFpbHEsIGFoZCwgbGlua3MpOworCWFoZC0+aW5pdF9sZXZlbCsrOworfQorCisvKgorICogVmVyaWZ5IHRoYXQgdGhlIHBhc3NlZCBpbiBzb2Z0YyBwb2ludGVyIGlzIGZvciBhCisgKiBjb250cm9sbGVyIHRoYXQgaXMgc3RpbGwgY29uZmlndXJlZC4KKyAqLworc3RydWN0IGFoZF9zb2Z0YyAqCithaGRfZmluZF9zb2Z0YyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJc3RydWN0IGFoZF9zb2Z0YyAqbGlzdF9haGQ7CisKKwlUQUlMUV9GT1JFQUNIKGxpc3RfYWhkLCAmYWhkX3RhaWxxLCBsaW5rcykgeworCQlpZiAobGlzdF9haGQgPT0gYWhkKQorCQkJcmV0dXJuIChhaGQpOworCX0KKwlyZXR1cm4gKE5VTEwpOworfQorCit2b2lkCithaGRfc2V0X3VuaXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgdW5pdCkKK3sKKwlhaGQtPnVuaXQgPSB1bml0OworfQorCit2b2lkCithaGRfc2V0X25hbWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBjaGFyICpuYW1lKQoreworCWlmIChhaGQtPm5hbWUgIT0gTlVMTCkKKwkJZnJlZShhaGQtPm5hbWUsIE1fREVWQlVGKTsKKwlhaGQtPm5hbWUgPSBuYW1lOworfQorCit2b2lkCithaGRfZnJlZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJaW50IGk7CisKKwlzd2l0Y2ggKGFoZC0+aW5pdF9sZXZlbCkgeworCWRlZmF1bHQ6CisJY2FzZSA1OgorCQlhaGRfc2h1dGRvd24oYWhkKTsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIDQ6CisJCWFoZF9kbWFtYXBfdW5sb2FkKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LAorCQkJCSAgYWhkLT5zaGFyZWRfZGF0YV9kbWFtYXApOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgMzoKKwkJYWhkX2RtYW1lbV9mcmVlKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LCBhaGQtPnFvdXRmaWZvLAorCQkJCWFoZC0+c2hhcmVkX2RhdGFfZG1hbWFwKTsKKwkJYWhkX2RtYW1hcF9kZXN0cm95KGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LAorCQkJCSAgIGFoZC0+c2hhcmVkX2RhdGFfZG1hbWFwKTsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIDI6CisJCWFoZF9kbWFfdGFnX2Rlc3Ryb3koYWhkLCBhaGQtPnNoYXJlZF9kYXRhX2RtYXQpOworCWNhc2UgMToKKyNpZm5kZWYgX19saW51eF9fCisJCWFoZF9kbWFfdGFnX2Rlc3Ryb3koYWhkLCBhaGQtPmJ1ZmZlcl9kbWF0KTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIDA6CisJCWJyZWFrOworCX0KKworI2lmbmRlZiBfX2xpbnV4X18KKwlhaGRfZG1hX3RhZ19kZXN0cm95KGFoZCwgYWhkLT5wYXJlbnRfZG1hdCk7CisjZW5kaWYKKwlhaGRfcGxhdGZvcm1fZnJlZShhaGQpOworCWFoZF9maW5pX3NjYmRhdGEoYWhkKTsKKwlmb3IgKGkgPSAwOyBpIDwgQUhEX05VTV9UQVJHRVRTOyBpKyspIHsKKwkJc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKworCQl0c3RhdGUgPSBhaGQtPmVuYWJsZWRfdGFyZ2V0c1tpXTsKKwkJaWYgKHRzdGF0ZSAhPSBOVUxMKSB7CisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCisJCQlpbnQgajsKKworCQkJZm9yIChqID0gMDsgaiA8IEFIRF9OVU1fTFVOUzsgaisrKSB7CisJCQkJc3RydWN0IGFoZF90bW9kZV9sc3RhdGUgKmxzdGF0ZTsKKworCQkJCWxzdGF0ZSA9IHRzdGF0ZS0+ZW5hYmxlZF9sdW5zW2pdOworCQkJCWlmIChsc3RhdGUgIT0gTlVMTCkgeworCQkJCQl4cHRfZnJlZV9wYXRoKGxzdGF0ZS0+cGF0aCk7CisJCQkJCWZyZWUobHN0YXRlLCBNX0RFVkJVRik7CisJCQkJfQorCQkJfQorI2VuZGlmCisJCQlmcmVlKHRzdGF0ZSwgTV9ERVZCVUYpOworCQl9CisJfQorI2lmZGVmIEFIRF9UQVJHRVRfTU9ERQorCWlmIChhaGQtPmJsYWNrX2hvbGUgIT0gTlVMTCkgeworCQl4cHRfZnJlZV9wYXRoKGFoZC0+YmxhY2tfaG9sZS0+cGF0aCk7CisJCWZyZWUoYWhkLT5ibGFja19ob2xlLCBNX0RFVkJVRik7CisJfQorI2VuZGlmCisJaWYgKGFoZC0+bmFtZSAhPSBOVUxMKQorCQlmcmVlKGFoZC0+bmFtZSwgTV9ERVZCVUYpOworCWlmIChhaGQtPnNlZXBfY29uZmlnICE9IE5VTEwpCisJCWZyZWUoYWhkLT5zZWVwX2NvbmZpZywgTV9ERVZCVUYpOworCWlmIChhaGQtPnNhdmVkX3N0YWNrICE9IE5VTEwpCisJCWZyZWUoYWhkLT5zYXZlZF9zdGFjaywgTV9ERVZCVUYpOworI2lmbmRlZiBfX0ZyZWVCU0RfXworCWZyZWUoYWhkLCBNX0RFVkJVRik7CisjZW5kaWYKKwlyZXR1cm47Cit9CisKK3ZvaWQKK2FoZF9zaHV0ZG93bih2b2lkICphcmcpCit7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkOworCisJYWhkID0gKHN0cnVjdCBhaGRfc29mdGMgKilhcmc7CisKKwkvKgorCSAqIFN0b3AgcGVyaW9kaWMgdGltZXIgY2FsbGJhY2tzLgorCSAqLworCWFoZF90aW1lcl9zdG9wKCZhaGQtPnJlc2V0X3RpbWVyKTsKKwlhaGRfdGltZXJfc3RvcCgmYWhkLT5zdGF0X3RpbWVyKTsKKworCS8qIFRoaXMgd2lsbCByZXNldCBtb3N0IHJlZ2lzdGVycyB0byAwLCBidXQgbm90IGFsbCAqLworCWFoZF9yZXNldChhaGQsIC8qcmVpbml0Ki9GQUxTRSk7Cit9CisKKy8qCisgKiBSZXNldCB0aGUgY29udHJvbGxlciBhbmQgcmVjb3JkIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgaXQKKyAqIHRoYXQgaXMgb25seSBhdmFpbGFibGUganVzdCBhZnRlciBhIHJlc2V0LiAgSWYgInJlaW5pdCIgaXMKKyAqIG5vbi16ZXJvLCB0aGlzIHJlc2V0IG9jY3VyZWQgYWZ0ZXIgaW5pdGlhbCBjb25maWd1cmF0aW9uCisgKiBhbmQgdGhlIGNhbGxlciByZXF1ZXN0cyB0aGF0IHRoZSBjaGlwIGJlIGZ1bGx5IHJlaW5pdGlhbGl6ZWQKKyAqIHRvIGEgcnVuYWJsZSBzdGF0ZS4gIENoaXAgaW50ZXJydXB0cyBhcmUgKm5vdCogZW5hYmxlZCBhZnRlcgorICogYSByZWluaXRpYWxpemF0aW9uLiAgVGhlIGNhbGxlciBtdXN0IGVuYWJsZSBpbnRlcnJ1cHRzIHZpYQorICogYWhkX2ludHJfZW5hYmxlKCkuCisgKi8KK2ludAorYWhkX3Jlc2V0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IHJlaW5pdCkKK3sKKwl1X2ludAkgc3hmcmN0bDE7CisJaW50CSB3YWl0OworCXVpbnQzMl90IGNtZDsKKwkKKwkvKgorCSAqIFByZXNlcnZlIHRoZSB2YWx1ZSBvZiB0aGUgU1hGUkNUTDEgcmVnaXN0ZXIgZm9yIGFsbCBjaGFubmVscy4KKwkgKiBJdCBjb250YWlucyBzZXR0aW5ncyB0aGF0IGFmZmVjdCB0ZXJtaW5hdGlvbiBhbmQgd2UgZG9uJ3Qgd2FudAorCSAqIHRvIGRpc3R1cmIgdGhlIGludGVncml0eSBvZiB0aGUgYnVzLgorCSAqLworCWFoZF9wYXVzZShhaGQpOworCWFoZF91cGRhdGVfbW9kZXMoYWhkKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJc3hmcmN0bDEgPSBhaGRfaW5iKGFoZCwgU1hGUkNUTDEpOworCisJY21kID0gYWhkX3BjaV9yZWFkX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywgUENJUl9DT01NQU5ELCAvKmJ5dGVzKi8yKTsKKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9QQ0lYX0NISVBSU1RfQlVHKSAhPSAwKSB7CisJCXVpbnQzMl90IG1vZF9jbWQ7CisKKwkJLyoKKwkJICogQTQgUmF6b3IgIzYzMgorCQkgKiBEdXJpbmcgdGhlIGFzc2VydGlvbiBvZiBDSElQUlNULCB0aGUgY2hpcAorCQkgKiBkb2VzIG5vdCBkaXNhYmxlIGl0cyBwYXJpdHkgbG9naWMgcHJpb3IgdG8KKwkJICogdGhlIHN0YXJ0IG9mIHRoZSByZXNldC4gIFRoaXMgbWF5IGNhdXNlIGEKKwkJICogcGFyaXR5IGVycm9yIHRvIGJlIGRldGVjdGVkIGFuZCB0aHVzIGEKKwkJICogc3B1cmlvdXMgU0VSUiBvciBQRVJSIGFzc2VydGlvbi4gIERpc2JsZQorCQkgKiBQRVJSIGFuZCBTRVJSIHJlc3BvbnNlcyBkdXJpbmcgdGhlIENISVBSU1QuCisJCSAqLworCQltb2RfY21kID0gY21kICYgfihQQ0lNX0NNRF9QRVJSRVNQRU58UENJTV9DTURfU0VSUkVTUEVOKTsKKwkJYWhkX3BjaV93cml0ZV9jb25maWcoYWhkLT5kZXZfc29mdGMsIFBDSVJfQ09NTUFORCwKKwkJCQkgICAgIG1vZF9jbWQsIC8qYnl0ZXMqLzIpOworCX0KKwlhaGRfb3V0YihhaGQsIEhDTlRSTCwgQ0hJUFJTVCB8IGFoZC0+cGF1c2UpOworCisJLyoKKwkgKiBFbnN1cmUgdGhhdCB0aGUgcmVzZXQgaGFzIGZpbmlzaGVkLiAgV2UgZGVsYXkgMTAwMHVzCisJICogcHJpb3IgdG8gcmVhZGluZyB0aGUgcmVnaXN0ZXIgdG8gbWFrZSBzdXJlIHRoZSBjaGlwCisJICogaGFzIHN1ZmZpY2llbnRseSBjb21wbGV0ZWQgaXRzIHJlc2V0IHRvIGhhbmRsZSByZWdpc3RlcgorCSAqIGFjY2Vzc2VzLgorCSAqLworCXdhaXQgPSAxMDAwOworCWRvIHsKKwkJYWhkX2RlbGF5KDEwMDApOworCX0gd2hpbGUgKC0td2FpdCAmJiAhKGFoZF9pbmIoYWhkLCBIQ05UUkwpICYgQ0hJUFJTVEFDSykpOworCisJaWYgKHdhaXQgPT0gMCkgeworCQlwcmludGYoIiVzOiBXQVJOSU5HIC0gRmFpbGVkIGNoaXAgcmVzZXQhICAiCisJCSAgICAgICAiVHJ5aW5nIHRvIGluaXRpYWxpemUgYW55d2F5LlxuIiwgYWhkX25hbWUoYWhkKSk7CisJfQorCWFoZF9vdXRiKGFoZCwgSENOVFJMLCBhaGQtPnBhdXNlKTsKKworCWlmICgoYWhkLT5idWdzICYgQUhEX1BDSVhfQ0hJUFJTVF9CVUcpICE9IDApIHsKKwkJLyoKKwkJICogQ2xlYXIgYW55IGxhdGNoZWQgUENJIGVycm9yIHN0YXR1cyBhbmQgcmVzdG9yZQorCQkgKiBwcmV2aW91cyBTRVJSIGFuZCBQRVJSIHJlc3BvbnNlIGVuYWJsZXMuCisJCSAqLworCQlhaGRfcGNpX3dyaXRlX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywgUENJUl9TVEFUVVMgKyAxLAorCQkJCSAgICAgMHhGRiwgLypieXRlcyovMSk7CisJCWFoZF9wY2lfd3JpdGVfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBQQ0lSX0NPTU1BTkQsCisJCQkJICAgICBjbWQsIC8qYnl0ZXMqLzIpOworCX0KKworCS8qCisJICogTW9kZSBzaG91bGQgYmUgU0NTSSBhZnRlciBhIGNoaXAgcmVzZXQsIGJ1dCBsZXRzCisJICogc2V0IGl0IGp1c3QgdG8gYmUgc2FmZS4gIFdlIHRvdWNoIHRoZSBNT0RFX1BUUgorCSAqIHJlZ2lzdGVyIGRpcmVjdGx5IHNvIGFzIHRvIGJ5cGFzcyB0aGUgbGF6eSB1cGRhdGUKKwkgKiBjb2RlIGluIGFoZF9zZXRfbW9kZXMoKS4KKwkgKi8KKwlhaGRfa25vd25fbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKwlhaGRfb3V0YihhaGQsIE1PREVfUFRSLAorCQkgYWhkX2J1aWxkX21vZGVfc3RhdGUoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKSk7CisKKwkvKgorCSAqIFJlc3RvcmUgU1hGUkNUTDEuCisJICoKKwkgKiBXZSBtdXN0IGFsd2F5cyBpbml0aWFsaXplIFNUUFdFTiB0byAxIGJlZm9yZSB3ZQorCSAqIHJlc3RvcmUgdGhlIHNhdmVkIHZhbHVlcy4gIFNUUFdFTiBpcyBpbml0aWFsaXplZAorCSAqIHRvIGEgdHJpLXN0YXRlIGNvbmRpdGlvbiB3aGljaCBjYW4gb25seSBiZSBjbGVhcmVkCisJICogYnkgdHVybmluZyBpdCBvbi4KKwkgKi8KKwlhaGRfb3V0YihhaGQsIFNYRlJDVEwxLCBzeGZyY3RsMXxTVFBXRU4pOworCWFoZF9vdXRiKGFoZCwgU1hGUkNUTDEsIHN4ZnJjdGwxKTsKKworCS8qIERldGVybWluZSBjaGlwIGNvbmZpZ3VyYXRpb24gKi8KKwlhaGQtPmZlYXR1cmVzICY9IH5BSERfV0lERTsKKwlpZiAoKGFoZF9pbmIoYWhkLCBTQkxLQ1RMKSAmIFNFTFdJREUpICE9IDApCisJCWFoZC0+ZmVhdHVyZXMgfD0gQUhEX1dJREU7CisKKwkvKgorCSAqIElmIGEgcmVjb3ZlcnkgYWN0aW9uIGhhcyBmb3JjZWQgYSBjaGlwIHJlc2V0LAorCSAqIHJlLWluaXRpYWxpemUgdGhlIGNoaXAgdG8gb3VyIGxpa2luZy4KKwkgKi8KKwlpZiAocmVpbml0ICE9IDApCisJCWFoZF9jaGlwX2luaXQoYWhkKTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBTQ0JzIGF2YWlsYWJsZSBvbiB0aGUgY29udHJvbGxlcgorICovCitpbnQKK2FoZF9wcm9iZV9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkgeworCWludCBpOworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIH4oQUhEX01PREVfVU5LTk9XTl9NU0t8QUhEX01PREVfQ0ZHX01TSyksCisJCQkgfihBSERfTU9ERV9VTktOT1dOX01TS3xBSERfTU9ERV9DRkdfTVNLKSk7CisJZm9yIChpID0gMDsgaSA8IEFIRF9TQ0JfTUFYOyBpKyspIHsKKwkJaW50IGo7CisKKwkJYWhkX3NldF9zY2JwdHIoYWhkLCBpKTsKKwkJYWhkX291dHcoYWhkLCBTQ0JfQkFTRSwgaSk7CisJCWZvciAoaiA9IDI7IGogPCA2NDsgaisrKQorCQkJYWhkX291dGIoYWhkLCBTQ0JfQkFTRStqLCAwKTsKKwkJLyogU3RhcnQgb3V0IGxpZmUgYXMgdW5hbGxvY2F0ZWQgKG5lZWRpbmcgYW4gYWJvcnQpICovCisJCWFoZF9vdXRiKGFoZCwgU0NCX0NPTlRST0wsIE1LX01FU1NBR0UpOworCQlpZiAoYWhkX2lud19zY2JyYW0oYWhkLCBTQ0JfQkFTRSkgIT0gaSkKKwkJCWJyZWFrOworCQlhaGRfc2V0X3NjYnB0cihhaGQsIDApOworCQlpZiAoYWhkX2lud19zY2JyYW0oYWhkLCBTQ0JfQkFTRSkgIT0gMCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gKGkpOworfQorCitzdGF0aWMgdm9pZAorYWhkX2RtYW1hcF9jYih2b2lkICphcmcsIGJ1c19kbWFfc2VnbWVudF90ICpzZWdzLCBpbnQgbnNlZywgaW50IGVycm9yKSAKK3sKKwlkbWFfYWRkcl90ICpiYWRkcjsKKworCWJhZGRyID0gKGRtYV9hZGRyX3QgKilhcmc7CisJKmJhZGRyID0gc2Vncy0+ZHNfYWRkcjsKK30KKworc3RhdGljIHZvaWQKK2FoZF9pbml0aWFsaXplX2hzY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhaGQtPnNjYl9kYXRhLm1heGhzY2JzOyBpKyspIHsKKwkJYWhkX3NldF9zY2JwdHIoYWhkLCBpKTsKKworCQkvKiBDbGVhciB0aGUgY29udHJvbCBieXRlLiAqLworCQlhaGRfb3V0YihhaGQsIFNDQl9DT05UUk9MLCAwKTsKKworCQkvKiBTZXQgdGhlIG5leHQgcG9pbnRlciAqLworCQlhaGRfb3V0dyhhaGQsIFNDQl9ORVhULCBTQ0JfTElTVF9OVUxMKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2FoZF9pbml0X3NjYmRhdGEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXN0cnVjdAlzY2JfZGF0YSAqc2NiX2RhdGE7CisJaW50CWk7CisKKwlzY2JfZGF0YSA9ICZhaGQtPnNjYl9kYXRhOworCVRBSUxRX0lOSVQoJnNjYl9kYXRhLT5mcmVlX3NjYnMpOworCWZvciAoaSA9IDA7IGkgPCBBSERfTlVNX1RBUkdFVFMgKiBBSERfTlVNX0xVTlNfTk9OUEtUOyBpKyspCisJCUxJU1RfSU5JVCgmc2NiX2RhdGEtPmZyZWVfc2NiX2xpc3RzW2ldKTsKKwlMSVNUX0lOSVQoJnNjYl9kYXRhLT5hbnlfZGV2X2ZyZWVfc2NiX2xpc3QpOworCVNMSVNUX0lOSVQoJnNjYl9kYXRhLT5oc2NiX21hcHMpOworCVNMSVNUX0lOSVQoJnNjYl9kYXRhLT5zZ19tYXBzKTsKKwlTTElTVF9JTklUKCZzY2JfZGF0YS0+c2Vuc2VfbWFwcyk7CisKKwkvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBoYXJkd2FyZSBTQ0JzIGFuZCBpbml0aWFsaXplIHRoZW0gKi8KKwlzY2JfZGF0YS0+bWF4aHNjYnMgPSBhaGRfcHJvYmVfc2NicyhhaGQpOworCWlmIChzY2JfZGF0YS0+bWF4aHNjYnMgPT0gMCkgeworCQlwcmludGYoIiVzOiBObyBTQ0Igc3BhY2UgZm91bmRcbiIsIGFoZF9uYW1lKGFoZCkpOworCQlyZXR1cm4gKEVOWElPKTsKKwl9CisKKwlhaGRfaW5pdGlhbGl6ZV9oc2NicyhhaGQpOworCisJLyoKKwkgKiBDcmVhdGUgb3VyIERNQSB0YWdzLiAgVGhlc2UgdGFncyBkZWZpbmUgdGhlIGtpbmRzIG9mIGRldmljZQorCSAqIGFjY2Vzc2libGUgbWVtb3J5IGFsbG9jYXRpb25zIGFuZCBtZW1vcnkgbWFwcGluZ3Mgd2Ugd2lsbAorCSAqIG5lZWQgdG8gcGVyZm9ybSBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbi4KKwkgKgorCSAqIFVubGVzcyB3ZSBuZWVkIHRvIGZ1cnRoZXIgcmVzdHJpY3QgdGhlIGFsbG9jYXRpb24sIHdlIHJlbHkKKwkgKiBvbiB0aGUgcmVzdHJpY3Rpb25zIG9mIHRoZSBwYXJlbnQgZG1hdCwgaGVuY2UgdGhlIGNvbW1vbgorCSAqIHVzZSBvZiBNQVhBRERSIGFuZCBNQVhTSVpFLgorCSAqLworCisJLyogRE1BIHRhZyBmb3Igb3VyIGhhcmR3YXJlIHNjYiBzdHJ1Y3R1cmVzICovCisJaWYgKGFoZF9kbWFfdGFnX2NyZWF0ZShhaGQsIGFoZC0+cGFyZW50X2RtYXQsIC8qYWxpZ25tZW50Ki8xLAorCQkJICAgICAgIC8qYm91bmRhcnkqL0JVU19TUEFDRV9NQVhBRERSXzMyQklUICsgMSwKKwkJCSAgICAgICAvKmxvd2FkZHIqL0JVU19TUEFDRV9NQVhBRERSXzMyQklULAorCQkJICAgICAgIC8qaGlnaGFkZHIqL0JVU19TUEFDRV9NQVhBRERSLAorCQkJICAgICAgIC8qZmlsdGVyKi9OVUxMLCAvKmZpbHRlcmFyZyovTlVMTCwKKwkJCSAgICAgICBQQUdFX1NJWkUsIC8qbnNlZ21lbnRzKi8xLAorCQkJICAgICAgIC8qbWF4c2Vnc3oqL0JVU19TUEFDRV9NQVhTSVpFXzMyQklULAorCQkJICAgICAgIC8qZmxhZ3MqLzAsICZzY2JfZGF0YS0+aHNjYl9kbWF0KSAhPSAwKSB7CisJCWdvdG8gZXJyb3JfZXhpdDsKKwl9CisKKwlzY2JfZGF0YS0+aW5pdF9sZXZlbCsrOworCisJLyogRE1BIHRhZyBmb3Igb3VyIFMvRyBzdHJ1Y3R1cmVzLiAqLworCWlmIChhaGRfZG1hX3RhZ19jcmVhdGUoYWhkLCBhaGQtPnBhcmVudF9kbWF0LCAvKmFsaWdubWVudCovOCwKKwkJCSAgICAgICAvKmJvdW5kYXJ5Ki9CVVNfU1BBQ0VfTUFYQUREUl8zMkJJVCArIDEsCisJCQkgICAgICAgLypsb3dhZGRyKi9CVVNfU1BBQ0VfTUFYQUREUl8zMkJJVCwKKwkJCSAgICAgICAvKmhpZ2hhZGRyKi9CVVNfU1BBQ0VfTUFYQUREUiwKKwkJCSAgICAgICAvKmZpbHRlciovTlVMTCwgLypmaWx0ZXJhcmcqL05VTEwsCisJCQkgICAgICAgYWhkX3NnbGlzdF9hbGxvY3NpemUoYWhkKSwgLypuc2VnbWVudHMqLzEsCisJCQkgICAgICAgLyptYXhzZWdzeiovQlVTX1NQQUNFX01BWFNJWkVfMzJCSVQsCisJCQkgICAgICAgLypmbGFncyovMCwgJnNjYl9kYXRhLT5zZ19kbWF0KSAhPSAwKSB7CisJCWdvdG8gZXJyb3JfZXhpdDsKKwl9CisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NRU1PUlkpICE9IDApCisJCXByaW50ZigiJXM6IGFoZF9zZ2xpc3RfYWxsb2NzaXplID0gMHgleFxuIiwgYWhkX25hbWUoYWhkKSwKKwkJICAgICAgIGFoZF9zZ2xpc3RfYWxsb2NzaXplKGFoZCkpOworI2VuZGlmCisKKwlzY2JfZGF0YS0+aW5pdF9sZXZlbCsrOworCisJLyogRE1BIHRhZyBmb3Igb3VyIHNlbnNlIGJ1ZmZlcnMuICBXZSBhbGxvY2F0ZSBpbiBwYWdlIHNpemVkIGNodW5rcyAqLworCWlmIChhaGRfZG1hX3RhZ19jcmVhdGUoYWhkLCBhaGQtPnBhcmVudF9kbWF0LCAvKmFsaWdubWVudCovMSwKKwkJCSAgICAgICAvKmJvdW5kYXJ5Ki9CVVNfU1BBQ0VfTUFYQUREUl8zMkJJVCArIDEsCisJCQkgICAgICAgLypsb3dhZGRyKi9CVVNfU1BBQ0VfTUFYQUREUl8zMkJJVCwKKwkJCSAgICAgICAvKmhpZ2hhZGRyKi9CVVNfU1BBQ0VfTUFYQUREUiwKKwkJCSAgICAgICAvKmZpbHRlciovTlVMTCwgLypmaWx0ZXJhcmcqL05VTEwsCisJCQkgICAgICAgUEFHRV9TSVpFLCAvKm5zZWdtZW50cyovMSwKKwkJCSAgICAgICAvKm1heHNlZ3N6Ki9CVVNfU1BBQ0VfTUFYU0laRV8zMkJJVCwKKwkJCSAgICAgICAvKmZsYWdzKi8wLCAmc2NiX2RhdGEtPnNlbnNlX2RtYXQpICE9IDApIHsKKwkJZ290byBlcnJvcl9leGl0OworCX0KKworCXNjYl9kYXRhLT5pbml0X2xldmVsKys7CisKKwkvKiBQZXJmb3JtIGluaXRpYWwgQ0NCIGFsbG9jYXRpb24gKi8KKwlhaGRfYWxsb2Nfc2NicyhhaGQpOworCisJaWYgKHNjYl9kYXRhLT5udW1zY2JzID09IDApIHsKKwkJcHJpbnRmKCIlczogYWhkX2luaXRfc2NiZGF0YSAtICIKKwkJICAgICAgICJVbmFibGUgdG8gYWxsb2NhdGUgaW5pdGlhbCBzY2JzXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CisJCWdvdG8gZXJyb3JfZXhpdDsKKwl9CisKKwkvKgorCSAqIE5vdGUgdGhhdCB3ZSB3ZXJlIHN1Y2Nlc3NmdWxsCisJICovCisJcmV0dXJuICgwKTsgCisKK2Vycm9yX2V4aXQ6CisKKwlyZXR1cm4gKEVOT01FTSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NiICoKK2FoZF9maW5kX3NjYl9ieV90YWcoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0YWcpCit7CisJc3RydWN0IHNjYiAqc2NiOworCisJLyoKKwkgKiBMb29rIG9uIHRoZSBwZW5kaW5nIGxpc3QuCisJICovCisJTElTVF9GT1JFQUNIKHNjYiwgJmFoZC0+cGVuZGluZ19zY2JzLCBwZW5kaW5nX2xpbmtzKSB7CisJCWlmIChTQ0JfR0VUX1RBRyhzY2IpID09IHRhZykKKwkJCXJldHVybiAoc2NiKTsKKwl9CisKKwkvKgorCSAqIFRoZW4gb24gYWxsIG9mIHRoZSBjb2xsaXNpb24gZnJlZSBsaXN0cy4KKwkgKi8KKwlUQUlMUV9GT1JFQUNIKHNjYiwgJmFoZC0+c2NiX2RhdGEuZnJlZV9zY2JzLCBsaW5rcy50cWUpIHsKKwkJc3RydWN0IHNjYiAqbGlzdF9zY2I7CisKKwkJbGlzdF9zY2IgPSBzY2I7CisJCWRvIHsKKwkJCWlmIChTQ0JfR0VUX1RBRyhsaXN0X3NjYikgPT0gdGFnKQorCQkJCXJldHVybiAobGlzdF9zY2IpOworCQkJbGlzdF9zY2IgPSBMSVNUX05FWFQobGlzdF9zY2IsIGNvbGxpc2lvbl9saW5rcyk7CisJCX0gd2hpbGUgKGxpc3Rfc2NiKTsKKwl9CisKKwkvKgorCSAqIEFuZCBmaW5hbGx5IG9uIHRoZSBnZW5lcmljIGZyZWUgbGlzdC4KKwkgKi8KKwlMSVNUX0ZPUkVBQ0goc2NiLCAmYWhkLT5zY2JfZGF0YS5hbnlfZGV2X2ZyZWVfc2NiX2xpc3QsIGxpbmtzLmxlKSB7CisJCWlmIChTQ0JfR0VUX1RBRyhzY2IpID09IHRhZykKKwkJCXJldHVybiAoc2NiKTsKKwl9CisKKwlyZXR1cm4gKE5VTEwpOworfQorCitzdGF0aWMgdm9pZAorYWhkX2Zpbmlfc2NiZGF0YShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJc3RydWN0IHNjYl9kYXRhICpzY2JfZGF0YTsKKworCXNjYl9kYXRhID0gJmFoZC0+c2NiX2RhdGE7CisJaWYgKHNjYl9kYXRhID09IE5VTEwpCisJCXJldHVybjsKKworCXN3aXRjaCAoc2NiX2RhdGEtPmluaXRfbGV2ZWwpIHsKKwlkZWZhdWx0OgorCWNhc2UgNzoKKwl7CisJCXN0cnVjdCBtYXBfbm9kZSAqc25zX21hcDsKKworCQl3aGlsZSAoKHNuc19tYXAgPSBTTElTVF9GSVJTVCgmc2NiX2RhdGEtPnNlbnNlX21hcHMpKSAhPSBOVUxMKSB7CisJCQlTTElTVF9SRU1PVkVfSEVBRCgmc2NiX2RhdGEtPnNlbnNlX21hcHMsIGxpbmtzKTsKKwkJCWFoZF9kbWFtYXBfdW5sb2FkKGFoZCwgc2NiX2RhdGEtPnNlbnNlX2RtYXQsCisJCQkJCSAgc25zX21hcC0+ZG1hbWFwKTsKKwkJCWFoZF9kbWFtZW1fZnJlZShhaGQsIHNjYl9kYXRhLT5zZW5zZV9kbWF0LAorCQkJCQlzbnNfbWFwLT52YWRkciwgc25zX21hcC0+ZG1hbWFwKTsKKwkJCWZyZWUoc25zX21hcCwgTV9ERVZCVUYpOworCQl9CisJCWFoZF9kbWFfdGFnX2Rlc3Ryb3koYWhkLCBzY2JfZGF0YS0+c2Vuc2VfZG1hdCk7CisJCS8qIEZBTExUSFJPVUdIICovCisJfQorCWNhc2UgNjoKKwl7CisJCXN0cnVjdCBtYXBfbm9kZSAqc2dfbWFwOworCisJCXdoaWxlICgoc2dfbWFwID0gU0xJU1RfRklSU1QoJnNjYl9kYXRhLT5zZ19tYXBzKSkgIT0gTlVMTCkgeworCQkJU0xJU1RfUkVNT1ZFX0hFQUQoJnNjYl9kYXRhLT5zZ19tYXBzLCBsaW5rcyk7CisJCQlhaGRfZG1hbWFwX3VubG9hZChhaGQsIHNjYl9kYXRhLT5zZ19kbWF0LAorCQkJCQkgIHNnX21hcC0+ZG1hbWFwKTsKKwkJCWFoZF9kbWFtZW1fZnJlZShhaGQsIHNjYl9kYXRhLT5zZ19kbWF0LAorCQkJCQlzZ19tYXAtPnZhZGRyLCBzZ19tYXAtPmRtYW1hcCk7CisJCQlmcmVlKHNnX21hcCwgTV9ERVZCVUYpOworCQl9CisJCWFoZF9kbWFfdGFnX2Rlc3Ryb3koYWhkLCBzY2JfZGF0YS0+c2dfZG1hdCk7CisJCS8qIEZBTExUSFJPVUdIICovCisJfQorCWNhc2UgNToKKwl7CisJCXN0cnVjdCBtYXBfbm9kZSAqaHNjYl9tYXA7CisKKwkJd2hpbGUgKChoc2NiX21hcCA9IFNMSVNUX0ZJUlNUKCZzY2JfZGF0YS0+aHNjYl9tYXBzKSkgIT0gTlVMTCkgeworCQkJU0xJU1RfUkVNT1ZFX0hFQUQoJnNjYl9kYXRhLT5oc2NiX21hcHMsIGxpbmtzKTsKKwkJCWFoZF9kbWFtYXBfdW5sb2FkKGFoZCwgc2NiX2RhdGEtPmhzY2JfZG1hdCwKKwkJCQkJICBoc2NiX21hcC0+ZG1hbWFwKTsKKwkJCWFoZF9kbWFtZW1fZnJlZShhaGQsIHNjYl9kYXRhLT5oc2NiX2RtYXQsCisJCQkJCWhzY2JfbWFwLT52YWRkciwgaHNjYl9tYXAtPmRtYW1hcCk7CisJCQlmcmVlKGhzY2JfbWFwLCBNX0RFVkJVRik7CisJCX0KKwkJYWhkX2RtYV90YWdfZGVzdHJveShhaGQsIHNjYl9kYXRhLT5oc2NiX2RtYXQpOworCQkvKiBGQUxMVEhST1VHSCAqLworCX0KKwljYXNlIDQ6CisJY2FzZSAzOgorCWNhc2UgMjoKKwljYXNlIDE6CisJY2FzZSAwOgorCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBEU1AgZmlsdGVyIEJ5cGFzcyBtdXN0IGJlIGVuYWJsZWQgdW50aWwgdGhlIGZpcnN0IHNlbGVjdGlvbgorICogYWZ0ZXIgYSBjaGFuZ2UgaW4gYnVzIG1vZGUgKFJhem9yICM0OTEgYW5kICM0OTMpLgorICovCitzdGF0aWMgdm9pZAorYWhkX3NldHVwX2lvY2VsbF93b3JrYXJvdW5kKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlhaGRfbW9kZV9zdGF0ZSBzYXZlZF9tb2RlczsKKworCXNhdmVkX21vZGVzID0gYWhkX3NhdmVfbW9kZXMoYWhkKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfQ0ZHLCBBSERfTU9ERV9DRkcpOworCWFoZF9vdXRiKGFoZCwgRFNQREFUQUNUTCwgYWhkX2luYihhaGQsIERTUERBVEFDVEwpCisJICAgICAgIHwgQllQQVNTRU5BQiB8IFJDVlJPRkZTVERJUyB8IFhNSVRPRkZTVERJUyk7CisJYWhkX291dGIoYWhkLCBTSU1PREUwLCBhaGRfaW5iKGFoZCwgU0lNT0RFMCkgfCAoRU5TRUxET3xFTlNFTERJKSk7CisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NSVNDKSAhPSAwKQorCQlwcmludGYoIiVzOiBTZXR0aW5nIHVwIGlvY2VsbCB3b3JrYXJvdW5kXG4iLCBhaGRfbmFtZShhaGQpKTsKKyNlbmRpZgorCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOworCWFoZC0+ZmxhZ3MgJj0gfkFIRF9IQURfRklSU1RfU0VMOworfQorCitzdGF0aWMgdm9pZAorYWhkX2lvY2VsbF9maXJzdF9zZWxlY3Rpb24oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCWFoZF9tb2RlX3N0YXRlCXNhdmVkX21vZGVzOworCXVfaW50CQlzYmxrY3RsOworCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX0hBRF9GSVJTVF9TRUwpICE9IDApCisJCXJldHVybjsKKwlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCXNibGtjdGwgPSBhaGRfaW5iKGFoZCwgU0JMS0NUTCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0NGRywgQUhEX01PREVfQ0ZHKTsKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01JU0MpICE9IDApCisJCXByaW50ZigiJXM6IGlvY2VsbCBmaXJzdCBzZWxlY3Rpb25cbiIsIGFoZF9uYW1lKGFoZCkpOworI2VuZGlmCisJaWYgKChzYmxrY3RsICYgRU5BQjQwKSAhPSAwKSB7CisJCWFoZF9vdXRiKGFoZCwgRFNQREFUQUNUTCwKKwkJCSBhaGRfaW5iKGFoZCwgRFNQREFUQUNUTCkgJiB+QllQQVNTRU5BQik7CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUlTQykgIT0gMCkKKwkJCXByaW50ZigiJXM6IEJZUEFTUyBub3cgZGlzYWJsZWRcbiIsIGFoZF9uYW1lKGFoZCkpOworI2VuZGlmCisJfQorCWFoZF9vdXRiKGFoZCwgU0lNT0RFMCwgYWhkX2luYihhaGQsIFNJTU9ERTApICYgfihFTlNFTERPfEVOU0VMREkpKTsKKwlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSU0NTSUlOVCk7CisJYWhkX3Jlc3RvcmVfbW9kZXMoYWhkLCBzYXZlZF9tb2Rlcyk7CisJYWhkLT5mbGFncyB8PSBBSERfSEFEX0ZJUlNUX1NFTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQ0IgTWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaGRfYWRkX2NvbF9saXN0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiLCB1X2ludCBjb2xfaWR4KQoreworCXN0cnVjdAlzY2JfbGlzdCAqZnJlZV9saXN0OworCXN0cnVjdAlzY2JfdGFpbHEgKmZyZWVfdGFpbHE7CisJc3RydWN0CXNjYiAqZmlyc3Rfc2NiOworCisJc2NiLT5mbGFncyB8PSBTQ0JfT05fQ09MX0xJU1Q7CisJQUhEX1NFVF9TQ0JfQ09MX0lEWChzY2IsIGNvbF9pZHgpOworCWZyZWVfbGlzdCA9ICZhaGQtPnNjYl9kYXRhLmZyZWVfc2NiX2xpc3RzW2NvbF9pZHhdOworCWZyZWVfdGFpbHEgPSAmYWhkLT5zY2JfZGF0YS5mcmVlX3NjYnM7CisJZmlyc3Rfc2NiID0gTElTVF9GSVJTVChmcmVlX2xpc3QpOworCWlmIChmaXJzdF9zY2IgIT0gTlVMTCkgeworCQlMSVNUX0lOU0VSVF9BRlRFUihmaXJzdF9zY2IsIHNjYiwgY29sbGlzaW9uX2xpbmtzKTsKKwl9IGVsc2UgeworCQlMSVNUX0lOU0VSVF9IRUFEKGZyZWVfbGlzdCwgc2NiLCBjb2xsaXNpb25fbGlua3MpOworCQlUQUlMUV9JTlNFUlRfVEFJTChmcmVlX3RhaWxxLCBzY2IsIGxpbmtzLnRxZSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWhkX3JlbV9jb2xfbGlzdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlzdHJ1Y3QJc2NiX2xpc3QgKmZyZWVfbGlzdDsKKwlzdHJ1Y3QJc2NiX3RhaWxxICpmcmVlX3RhaWxxOworCXN0cnVjdAlzY2IgKmZpcnN0X3NjYjsKKwl1X2ludAljb2xfaWR4OworCisJc2NiLT5mbGFncyAmPSB+U0NCX09OX0NPTF9MSVNUOworCWNvbF9pZHggPSBBSERfR0VUX1NDQl9DT0xfSURYKGFoZCwgc2NiKTsKKwlmcmVlX2xpc3QgPSAmYWhkLT5zY2JfZGF0YS5mcmVlX3NjYl9saXN0c1tjb2xfaWR4XTsKKwlmcmVlX3RhaWxxID0gJmFoZC0+c2NiX2RhdGEuZnJlZV9zY2JzOworCWZpcnN0X3NjYiA9IExJU1RfRklSU1QoZnJlZV9saXN0KTsKKwlpZiAoZmlyc3Rfc2NiID09IHNjYikgeworCQlzdHJ1Y3Qgc2NiICpuZXh0X3NjYjsKKworCQkvKgorCQkgKiBNYWludGFpbiBvcmRlciBpbiB0aGUgY29sbGlzaW9uIGZyZWUKKwkJICogbGlzdHMgZm9yIGZhaXJuZXNzIGlmIHRoaXMgZGV2aWNlIGhhcworCQkgKiBvdGhlciBjb2xsaWRpbmcgdGFncyBhY3RpdmUuCisJCSAqLworCQluZXh0X3NjYiA9IExJU1RfTkVYVChzY2IsIGNvbGxpc2lvbl9saW5rcyk7CisJCWlmIChuZXh0X3NjYiAhPSBOVUxMKSB7CisJCQlUQUlMUV9JTlNFUlRfQUZURVIoZnJlZV90YWlscSwgc2NiLAorCQkJCQkgICBuZXh0X3NjYiwgbGlua3MudHFlKTsKKwkJfQorCQlUQUlMUV9SRU1PVkUoZnJlZV90YWlscSwgc2NiLCBsaW5rcy50cWUpOworCX0KKwlMSVNUX1JFTU9WRShzY2IsIGNvbGxpc2lvbl9saW5rcyk7Cit9CisKKy8qCisgKiBHZXQgYSBmcmVlIHNjYi4gSWYgdGhlcmUgYXJlIG5vbmUsIHNlZSBpZiB3ZSBjYW4gYWxsb2NhdGUgYSBuZXcgU0NCLgorICovCitzdHJ1Y3Qgc2NiICoKK2FoZF9nZXRfc2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgY29sX2lkeCkKK3sKKwlzdHJ1Y3Qgc2NiICpzY2I7CisJaW50IHRyaWVzOworCisJdHJpZXMgPSAwOworbG9va19hZ2FpbjoKKwlUQUlMUV9GT1JFQUNIKHNjYiwgJmFoZC0+c2NiX2RhdGEuZnJlZV9zY2JzLCBsaW5rcy50cWUpIHsKKwkJaWYgKEFIRF9HRVRfU0NCX0NPTF9JRFgoYWhkLCBzY2IpICE9IGNvbF9pZHgpIHsKKwkJCWFoZF9yZW1fY29sX2xpc3QoYWhkLCBzY2IpOworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKwlpZiAoKHNjYiA9IExJU1RfRklSU1QoJmFoZC0+c2NiX2RhdGEuYW55X2Rldl9mcmVlX3NjYl9saXN0KSkgPT0gTlVMTCkgeworCisJCWlmICh0cmllcysrICE9IDApCisJCQlyZXR1cm4gKE5VTEwpOworCQlhaGRfYWxsb2Nfc2NicyhhaGQpOworCQlnb3RvIGxvb2tfYWdhaW47CisJfQorCUxJU1RfUkVNT1ZFKHNjYiwgbGlua3MubGUpOworCWlmIChjb2xfaWR4ICE9IEFIRF9ORVZFUl9DT0xfSURYCisJICYmIChzY2ItPmNvbF9zY2IgIT0gTlVMTCkKKwkgJiYgKHNjYi0+Y29sX3NjYi0+ZmxhZ3MgJiBTQ0JfQUNUSVZFKSA9PSAwKSB7CisJCUxJU1RfUkVNT1ZFKHNjYi0+Y29sX3NjYiwgbGlua3MubGUpOworCQlhaGRfYWRkX2NvbF9saXN0KGFoZCwgc2NiLT5jb2xfc2NiLCBjb2xfaWR4KTsKKwl9Citmb3VuZDoKKwlzY2ItPmZsYWdzIHw9IFNDQl9BQ1RJVkU7CisJcmV0dXJuIChzY2IpOworfQorCisvKgorICogUmV0dXJuIGFuIFNDQiByZXNvdXJjZSB0byB0aGUgZnJlZSBsaXN0LgorICovCit2b2lkCithaGRfZnJlZV9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCit7ICAgICAgIAorCisJLyogQ2xlYW4gdXAgZm9yIHRoZSBuZXh0IHVzZXIgKi8KKwlzY2ItPmZsYWdzID0gU0NCX0ZMQUdfTk9ORTsKKwlzY2ItPmhzY2ItPmNvbnRyb2wgPSAwOworCWFoZC0+c2NiX2RhdGEuc2NiaW5kZXhbU0NCX0dFVF9UQUcoc2NiKV0gPSBOVUxMOworCisJaWYgKHNjYi0+Y29sX3NjYiA9PSBOVUxMKSB7CisKKwkJLyoKKwkJICogTm8gY29sbGlzaW9uIHBvc3NpYmxlLiAgSnVzdCBmcmVlIG5vcm1hbGx5LgorCQkgKi8KKwkJTElTVF9JTlNFUlRfSEVBRCgmYWhkLT5zY2JfZGF0YS5hbnlfZGV2X2ZyZWVfc2NiX2xpc3QsCisJCQkJIHNjYiwgbGlua3MubGUpOworCX0gZWxzZSBpZiAoKHNjYi0+Y29sX3NjYi0+ZmxhZ3MgJiBTQ0JfT05fQ09MX0xJU1QpICE9IDApIHsKKworCQkvKgorCQkgKiBUaGUgU0NCIHdlIG1pZ2h0IGhhdmUgY29sbGlkZWQgd2l0aCBpcyBvbgorCQkgKiBhIGZyZWUgY29sbGlzaW9uIGxpc3QuICBQdXQgYm90aCBTQ0JzIG9uCisJCSAqIHRoZSBnZW5lcmljIGxpc3QuCisJCSAqLworCQlhaGRfcmVtX2NvbF9saXN0KGFoZCwgc2NiLT5jb2xfc2NiKTsKKwkJTElTVF9JTlNFUlRfSEVBRCgmYWhkLT5zY2JfZGF0YS5hbnlfZGV2X2ZyZWVfc2NiX2xpc3QsCisJCQkJIHNjYiwgbGlua3MubGUpOworCQlMSVNUX0lOU0VSVF9IRUFEKCZhaGQtPnNjYl9kYXRhLmFueV9kZXZfZnJlZV9zY2JfbGlzdCwKKwkJCQkgc2NiLT5jb2xfc2NiLCBsaW5rcy5sZSk7CisJfSBlbHNlIGlmICgoc2NiLT5jb2xfc2NiLT5mbGFncworCQkgICYgKFNDQl9QQUNLRVRJWkVEfFNDQl9BQ1RJVkUpKSA9PSBTQ0JfQUNUSVZFCisJCSYmIChzY2ItPmNvbF9zY2ItPmhzY2ItPmNvbnRyb2wgJiBUQUdfRU5CKSAhPSAwKSB7CisKKwkJLyoKKwkJICogVGhlIFNDQiB3ZSBtaWdodCBjb2xsaWRlIHdpdGggb24gdGhlIG5leHQgYWxsb2NhdGlvbgorCQkgKiBpcyBzdGlsbCBhY3RpdmUgaW4gYSBub24tcGFja2V0aXplZCwgdGFnZ2VkLCBjb250ZXh0LgorCQkgKiBQdXQgdXMgb24gdGhlIFNDQiBjb2xsaXNpb24gbGlzdC4KKwkJICovCisJCWFoZF9hZGRfY29sX2xpc3QoYWhkLCBzY2IsCisJCQkJIEFIRF9HRVRfU0NCX0NPTF9JRFgoYWhkLCBzY2ItPmNvbF9zY2IpKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgU0NCIHdlIG1pZ2h0IGNvbGxpZGUgd2l0aCBvbiB0aGUgbmV4dCBhbGxvY2F0aW9uCisJCSAqIGlzIGVpdGhlciBhY3RpdmUgaW4gYSBwYWNrZXRpemVkIGNvbnRleHQsIG9yIGZyZWUuCisJCSAqIFNpbmNlIHdlIGNhbid0IGNvbGxpZGUsIHB1dCB0aGlzIFNDQiBvbiB0aGUgZ2VuZXJpYworCQkgKiBmcmVlIGxpc3QuCisJCSAqLworCQlMSVNUX0lOU0VSVF9IRUFEKCZhaGQtPnNjYl9kYXRhLmFueV9kZXZfZnJlZV9zY2JfbGlzdCwKKwkJCQkgc2NiLCBsaW5rcy5sZSk7CisJfQorCisJYWhkX3BsYXRmb3JtX3NjYl9mcmVlKGFoZCwgc2NiKTsKK30KKwordm9pZAorYWhkX2FsbG9jX3NjYnMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXN0cnVjdCBzY2JfZGF0YSAqc2NiX2RhdGE7CisJc3RydWN0IHNjYgkqbmV4dF9zY2I7CisJc3RydWN0IGhhcmR3YXJlX3NjYiAqaHNjYjsKKwlzdHJ1Y3QgbWFwX25vZGUgKmhzY2JfbWFwOworCXN0cnVjdCBtYXBfbm9kZSAqc2dfbWFwOworCXN0cnVjdCBtYXBfbm9kZSAqc2Vuc2VfbWFwOworCXVpbnQ4X3QJCSpzZWdzOworCXVpbnQ4X3QJCSpzZW5zZV9kYXRhOworCWRtYV9hZGRyX3QJIGhzY2JfYnVzYWRkcjsKKwlkbWFfYWRkcl90CSBzZ19idXNhZGRyOworCWRtYV9hZGRyX3QJIHNlbnNlX2J1c2FkZHI7CisJaW50CQkgbmV3Y291bnQ7CisJaW50CQkgaTsKKworCXNjYl9kYXRhID0gJmFoZC0+c2NiX2RhdGE7CisJaWYgKHNjYl9kYXRhLT5udW1zY2JzID49IEFIRF9TQ0JfTUFYX0FMTE9DKQorCQkvKiBDYW4ndCBhbGxvY2F0ZSBhbnkgbW9yZSAqLworCQlyZXR1cm47CisKKwlpZiAoc2NiX2RhdGEtPnNjYnNfbGVmdCAhPSAwKSB7CisJCWludCBvZmZzZXQ7CisKKwkJb2Zmc2V0ID0gKFBBR0VfU0laRSAvIHNpemVvZigqaHNjYikpIC0gc2NiX2RhdGEtPnNjYnNfbGVmdDsKKwkJaHNjYl9tYXAgPSBTTElTVF9GSVJTVCgmc2NiX2RhdGEtPmhzY2JfbWFwcyk7CisJCWhzY2IgPSAmKChzdHJ1Y3QgaGFyZHdhcmVfc2NiICopaHNjYl9tYXAtPnZhZGRyKVtvZmZzZXRdOworCQloc2NiX2J1c2FkZHIgPSBoc2NiX21hcC0+cGh5c2FkZHIgKyAob2Zmc2V0ICogc2l6ZW9mKCpoc2NiKSk7CisJfSBlbHNlIHsKKwkJaHNjYl9tYXAgPSBtYWxsb2Moc2l6ZW9mKCpoc2NiX21hcCksIE1fREVWQlVGLCBNX05PV0FJVCk7CisKKwkJaWYgKGhzY2JfbWFwID09IE5VTEwpCisJCQlyZXR1cm47CisKKwkJLyogQWxsb2NhdGUgdGhlIG5leHQgYmF0Y2ggb2YgaGFyZHdhcmUgU0NCcyAqLworCQlpZiAoYWhkX2RtYW1lbV9hbGxvYyhhaGQsIHNjYl9kYXRhLT5oc2NiX2RtYXQsCisJCQkJICAgICAodm9pZCAqKikmaHNjYl9tYXAtPnZhZGRyLAorCQkJCSAgICAgQlVTX0RNQV9OT1dBSVQsICZoc2NiX21hcC0+ZG1hbWFwKSAhPSAwKSB7CisJCQlmcmVlKGhzY2JfbWFwLCBNX0RFVkJVRik7CisJCQlyZXR1cm47CisJCX0KKworCQlTTElTVF9JTlNFUlRfSEVBRCgmc2NiX2RhdGEtPmhzY2JfbWFwcywgaHNjYl9tYXAsIGxpbmtzKTsKKworCQlhaGRfZG1hbWFwX2xvYWQoYWhkLCBzY2JfZGF0YS0+aHNjYl9kbWF0LCBoc2NiX21hcC0+ZG1hbWFwLAorCQkJCWhzY2JfbWFwLT52YWRkciwgUEFHRV9TSVpFLCBhaGRfZG1hbWFwX2NiLAorCQkJCSZoc2NiX21hcC0+cGh5c2FkZHIsIC8qZmxhZ3MqLzApOworCisJCWhzY2IgPSAoc3RydWN0IGhhcmR3YXJlX3NjYiAqKWhzY2JfbWFwLT52YWRkcjsKKwkJaHNjYl9idXNhZGRyID0gaHNjYl9tYXAtPnBoeXNhZGRyOworCQlzY2JfZGF0YS0+c2Nic19sZWZ0ID0gUEFHRV9TSVpFIC8gc2l6ZW9mKCpoc2NiKTsKKwl9CisKKwlpZiAoc2NiX2RhdGEtPnNnc19sZWZ0ICE9IDApIHsKKwkJaW50IG9mZnNldDsKKworCQlvZmZzZXQgPSAoKGFoZF9zZ2xpc3RfYWxsb2NzaXplKGFoZCkgLyBhaGRfc2dsaXN0X3NpemUoYWhkKSkKKwkJICAgICAgIC0gc2NiX2RhdGEtPnNnc19sZWZ0KSAqIGFoZF9zZ2xpc3Rfc2l6ZShhaGQpOworCQlzZ19tYXAgPSBTTElTVF9GSVJTVCgmc2NiX2RhdGEtPnNnX21hcHMpOworCQlzZWdzID0gc2dfbWFwLT52YWRkciArIG9mZnNldDsKKwkJc2dfYnVzYWRkciA9IHNnX21hcC0+cGh5c2FkZHIgKyBvZmZzZXQ7CisJfSBlbHNlIHsKKwkJc2dfbWFwID0gbWFsbG9jKHNpemVvZigqc2dfbWFwKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKworCQlpZiAoc2dfbWFwID09IE5VTEwpCisJCQlyZXR1cm47CisKKwkJLyogQWxsb2NhdGUgdGhlIG5leHQgYmF0Y2ggb2YgUy9HIGxpc3RzICovCisJCWlmIChhaGRfZG1hbWVtX2FsbG9jKGFoZCwgc2NiX2RhdGEtPnNnX2RtYXQsCisJCQkJICAgICAodm9pZCAqKikmc2dfbWFwLT52YWRkciwKKwkJCQkgICAgIEJVU19ETUFfTk9XQUlULCAmc2dfbWFwLT5kbWFtYXApICE9IDApIHsKKwkJCWZyZWUoc2dfbWFwLCBNX0RFVkJVRik7CisJCQlyZXR1cm47CisJCX0KKworCQlTTElTVF9JTlNFUlRfSEVBRCgmc2NiX2RhdGEtPnNnX21hcHMsIHNnX21hcCwgbGlua3MpOworCisJCWFoZF9kbWFtYXBfbG9hZChhaGQsIHNjYl9kYXRhLT5zZ19kbWF0LCBzZ19tYXAtPmRtYW1hcCwKKwkJCQlzZ19tYXAtPnZhZGRyLCBhaGRfc2dsaXN0X2FsbG9jc2l6ZShhaGQpLAorCQkJCWFoZF9kbWFtYXBfY2IsICZzZ19tYXAtPnBoeXNhZGRyLCAvKmZsYWdzKi8wKTsKKworCQlzZWdzID0gc2dfbWFwLT52YWRkcjsKKwkJc2dfYnVzYWRkciA9IHNnX21hcC0+cGh5c2FkZHI7CisJCXNjYl9kYXRhLT5zZ3NfbGVmdCA9CisJCSAgICBhaGRfc2dsaXN0X2FsbG9jc2l6ZShhaGQpIC8gYWhkX3NnbGlzdF9zaXplKGFoZCk7CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19NRU1PUlkpCisJCQlwcmludGYoIk1hcHBlZCBTRyBkYXRhXG4iKTsKKyNlbmRpZgorCX0KKworCWlmIChzY2JfZGF0YS0+c2Vuc2VfbGVmdCAhPSAwKSB7CisJCWludCBvZmZzZXQ7CisKKwkJb2Zmc2V0ID0gUEFHRV9TSVpFIC0gKEFIRF9TRU5TRV9CVUZTSVpFICogc2NiX2RhdGEtPnNlbnNlX2xlZnQpOworCQlzZW5zZV9tYXAgPSBTTElTVF9GSVJTVCgmc2NiX2RhdGEtPnNlbnNlX21hcHMpOworCQlzZW5zZV9kYXRhID0gc2Vuc2VfbWFwLT52YWRkciArIG9mZnNldDsKKwkJc2Vuc2VfYnVzYWRkciA9IHNlbnNlX21hcC0+cGh5c2FkZHIgKyBvZmZzZXQ7CisJfSBlbHNlIHsKKwkJc2Vuc2VfbWFwID0gbWFsbG9jKHNpemVvZigqc2Vuc2VfbWFwKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKworCQlpZiAoc2Vuc2VfbWFwID09IE5VTEwpCisJCQlyZXR1cm47CisKKwkJLyogQWxsb2NhdGUgdGhlIG5leHQgYmF0Y2ggb2Ygc2Vuc2UgYnVmZmVycyAqLworCQlpZiAoYWhkX2RtYW1lbV9hbGxvYyhhaGQsIHNjYl9kYXRhLT5zZW5zZV9kbWF0LAorCQkJCSAgICAgKHZvaWQgKiopJnNlbnNlX21hcC0+dmFkZHIsCisJCQkJICAgICBCVVNfRE1BX05PV0FJVCwgJnNlbnNlX21hcC0+ZG1hbWFwKSAhPSAwKSB7CisJCQlmcmVlKHNlbnNlX21hcCwgTV9ERVZCVUYpOworCQkJcmV0dXJuOworCQl9CisKKwkJU0xJU1RfSU5TRVJUX0hFQUQoJnNjYl9kYXRhLT5zZW5zZV9tYXBzLCBzZW5zZV9tYXAsIGxpbmtzKTsKKworCQlhaGRfZG1hbWFwX2xvYWQoYWhkLCBzY2JfZGF0YS0+c2Vuc2VfZG1hdCwgc2Vuc2VfbWFwLT5kbWFtYXAsCisJCQkJc2Vuc2VfbWFwLT52YWRkciwgUEFHRV9TSVpFLCBhaGRfZG1hbWFwX2NiLAorCQkJCSZzZW5zZV9tYXAtPnBoeXNhZGRyLCAvKmZsYWdzKi8wKTsKKworCQlzZW5zZV9kYXRhID0gc2Vuc2VfbWFwLT52YWRkcjsKKwkJc2Vuc2VfYnVzYWRkciA9IHNlbnNlX21hcC0+cGh5c2FkZHI7CisJCXNjYl9kYXRhLT5zZW5zZV9sZWZ0ID0gUEFHRV9TSVpFIC8gQUhEX1NFTlNFX0JVRlNJWkU7CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19NRU1PUlkpCisJCQlwcmludGYoIk1hcHBlZCBzZW5zZSBkYXRhXG4iKTsKKyNlbmRpZgorCX0KKworCW5ld2NvdW50ID0gTUlOKHNjYl9kYXRhLT5zZW5zZV9sZWZ0LCBzY2JfZGF0YS0+c2Nic19sZWZ0KTsKKwluZXdjb3VudCA9IE1JTihuZXdjb3VudCwgc2NiX2RhdGEtPnNnc19sZWZ0KTsKKwluZXdjb3VudCA9IE1JTihuZXdjb3VudCwgKEFIRF9TQ0JfTUFYX0FMTE9DIC0gc2NiX2RhdGEtPm51bXNjYnMpKTsKKwlzY2JfZGF0YS0+c2Vuc2VfbGVmdCAtPSBuZXdjb3VudDsKKwlzY2JfZGF0YS0+c2Nic19sZWZ0IC09IG5ld2NvdW50OworCXNjYl9kYXRhLT5zZ3NfbGVmdCAtPSBuZXdjb3VudDsKKwlmb3IgKGkgPSAwOyBpIDwgbmV3Y291bnQ7IGkrKykgeworCQl1X2ludCBjb2xfdGFnOworCisJCXN0cnVjdCBzY2JfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisjaWZuZGVmIF9fbGludXhfXworCQlpbnQgZXJyb3I7CisjZW5kaWYKKwkJbmV4dF9zY2IgPSAoc3RydWN0IHNjYiAqKW1hbGxvYyhzaXplb2YoKm5leHRfc2NiKSwKKwkJCQkJCU1fREVWQlVGLCBNX05PV0FJVCk7CisJCWlmIChuZXh0X3NjYiA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJcGRhdGEgPSAoc3RydWN0IHNjYl9wbGF0Zm9ybV9kYXRhICopbWFsbG9jKHNpemVvZigqcGRhdGEpLAorCQkJCQkJCSAgIE1fREVWQlVGLCBNX05PV0FJVCk7CisJCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCQlmcmVlKG5leHRfc2NiLCBNX0RFVkJVRik7CisJCQlicmVhazsKKwkJfQorCQluZXh0X3NjYi0+cGxhdGZvcm1fZGF0YSA9IHBkYXRhOworCQluZXh0X3NjYi0+aHNjYl9tYXAgPSBoc2NiX21hcDsKKwkJbmV4dF9zY2ItPnNnX21hcCA9IHNnX21hcDsKKwkJbmV4dF9zY2ItPnNlbnNlX21hcCA9IHNlbnNlX21hcDsKKwkJbmV4dF9zY2ItPnNnX2xpc3QgPSBzZWdzOworCQluZXh0X3NjYi0+c2Vuc2VfZGF0YSA9IHNlbnNlX2RhdGE7CisJCW5leHRfc2NiLT5zZW5zZV9idXNhZGRyID0gc2Vuc2VfYnVzYWRkcjsKKwkJbWVtc2V0KGhzY2IsIDAsIHNpemVvZigqaHNjYikpOworCQluZXh0X3NjYi0+aHNjYiA9IGhzY2I7CisJCWhzY2ItPmhzY2JfYnVzYWRkciA9IGFoZF9odG9sZTMyKGhzY2JfYnVzYWRkcik7CisKKwkJLyoKKwkJICogVGhlIHNlcXVlbmNlciBhbHdheXMgc3RhcnRzIHdpdGggdGhlIHNlY29uZCBlbnRyeS4KKwkJICogVGhlIGZpcnN0IGVudHJ5IGlzIGVtYmVkZGVkIGluIHRoZSBzY2IuCisJCSAqLworCQluZXh0X3NjYi0+c2dfbGlzdF9idXNhZGRyID0gc2dfYnVzYWRkcjsKKwkJaWYgKChhaGQtPmZsYWdzICYgQUhEXzY0QklUX0FERFJFU1NJTkcpICE9IDApCisJCQluZXh0X3NjYi0+c2dfbGlzdF9idXNhZGRyCisJCQkgICAgKz0gc2l6ZW9mKHN0cnVjdCBhaGRfZG1hNjRfc2VnKTsKKwkJZWxzZQorCQkJbmV4dF9zY2ItPnNnX2xpc3RfYnVzYWRkciArPSBzaXplb2Yoc3RydWN0IGFoZF9kbWFfc2VnKTsKKwkJbmV4dF9zY2ItPmFoZF9zb2Z0YyA9IGFoZDsKKwkJbmV4dF9zY2ItPmZsYWdzID0gU0NCX0ZMQUdfTk9ORTsKKyNpZm5kZWYgX19saW51eF9fCisJCWVycm9yID0gYWhkX2RtYW1hcF9jcmVhdGUoYWhkLCBhaGQtPmJ1ZmZlcl9kbWF0LCAvKmZsYWdzKi8wLAorCQkJCQkgICZuZXh0X3NjYi0+ZG1hbWFwKTsKKwkJaWYgKGVycm9yICE9IDApIHsKKwkJCWZyZWUobmV4dF9zY2IsIE1fREVWQlVGKTsKKwkJCWZyZWUocGRhdGEsIE1fREVWQlVGKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJbmV4dF9zY2ItPmhzY2ItPnRhZyA9IGFoZF9odG9sZTE2KHNjYl9kYXRhLT5udW1zY2JzKTsKKwkJY29sX3RhZyA9IHNjYl9kYXRhLT5udW1zY2JzIF4gMHgxMDA7CisJCW5leHRfc2NiLT5jb2xfc2NiID0gYWhkX2ZpbmRfc2NiX2J5X3RhZyhhaGQsIGNvbF90YWcpOworCQlpZiAobmV4dF9zY2ItPmNvbF9zY2IgIT0gTlVMTCkKKwkJCW5leHRfc2NiLT5jb2xfc2NiLT5jb2xfc2NiID0gbmV4dF9zY2I7CisJCWFoZF9mcmVlX3NjYihhaGQsIG5leHRfc2NiKTsKKwkJaHNjYisrOworCQloc2NiX2J1c2FkZHIgKz0gc2l6ZW9mKCpoc2NiKTsKKwkJc2VncyArPSBhaGRfc2dsaXN0X3NpemUoYWhkKTsKKwkJc2dfYnVzYWRkciArPSBhaGRfc2dsaXN0X3NpemUoYWhkKTsKKwkJc2Vuc2VfZGF0YSArPSBBSERfU0VOU0VfQlVGU0laRTsKKwkJc2Vuc2VfYnVzYWRkciArPSBBSERfU0VOU0VfQlVGU0laRTsKKwkJc2NiX2RhdGEtPm51bXNjYnMrKzsKKwl9Cit9CisKK3ZvaWQKK2FoZF9jb250cm9sbGVyX2luZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBjaGFyICpidWYpCit7CisJY29uc3QgY2hhciAqc3BlZWQ7CisJY29uc3QgY2hhciAqdHlwZTsKKwlpbnQgbGVuOworCisJbGVuID0gc3ByaW50ZihidWYsICIlczogIiwgYWhkX2NoaXBfbmFtZXNbYWhkLT5jaGlwICYgQUhEX0NISVBJRF9NQVNLXSk7CisJYnVmICs9IGxlbjsKKworCXNwZWVkID0gIlVsdHJhMzIwICI7CisJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX1dJREUpICE9IDApIHsKKwkJdHlwZSA9ICJXaWRlICI7CisJfSBlbHNlIHsKKwkJdHlwZSA9ICJTaW5nbGUgIjsKKwl9CisJbGVuID0gc3ByaW50ZihidWYsICIlcyVzQ2hhbm5lbCAlYywgU0NTSSBJZD0lZCwgIiwKKwkJICAgICAgc3BlZWQsIHR5cGUsIGFoZC0+Y2hhbm5lbCwgYWhkLT5vdXJfaWQpOworCWJ1ZiArPSBsZW47CisKKwlzcHJpbnRmKGJ1ZiwgIiVzLCAlZCBTQ0JzIiwgYWhkLT5idXNfZGVzY3JpcHRpb24sCisJCWFoZC0+c2NiX2RhdGEubWF4aHNjYnMpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY2hhbm5lbF9zdHJpbmdzW10gPSB7CisJIlByaW1hcnkgTG93IiwKKwkiUHJpbWFyeSBIaWdoIiwKKwkiU2Vjb25kYXJ5IExvdyIsIAorCSJTZWNvbmRhcnkgSGlnaCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICp0ZXJtc3RhdF9zdHJpbmdzW10gPSB7CisJIlRlcm1pbmF0ZWQgQ29ycmVjdGx5IiwKKwkiT3ZlciBUZXJtaW5hdGVkIiwKKwkiVW5kZXIgVGVybWluYXRlZCIsCisJIk5vdCBDb25maWd1cmVkIgorfTsKKworLyoKKyAqIFN0YXJ0IHRoZSBib2FyZCwgcmVhZHkgZm9yIG5vcm1hbCBvcGVyYXRpb24KKyAqLworaW50CithaGRfaW5pdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJdWludDhfdAkJKmJhc2VfdmFkZHI7CisJdWludDhfdAkJKm5leHRfdmFkZHI7CisJZG1hX2FkZHJfdAkgbmV4dF9iYWRkcjsKKwlzaXplX3QJCSBkcml2ZXJfZGF0YV9zaXplOworCWludAkJIGk7CisJaW50CQkgZXJyb3I7CisJdV9pbnQJCSB3YXJuX3VzZXI7CisJdWludDhfdAkJIGN1cnJlbnRfc2Vuc2luZzsKKwl1aW50OF90CQkgZnN0YXQ7CisKKwlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfU0NTSV9NU0ssIEFIRF9NT0RFX1NDU0lfTVNLKTsKKworCWFoZC0+c3RhY2tfc2l6ZSA9IGFoZF9wcm9iZV9zdGFja19zaXplKGFoZCk7CisJYWhkLT5zYXZlZF9zdGFjayA9IG1hbGxvYyhhaGQtPnN0YWNrX3NpemUgKiBzaXplb2YodWludDE2X3QpLAorCQkJCSAgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlpZiAoYWhkLT5zYXZlZF9zdGFjayA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisKKwkvKgorCSAqIFZlcmlmeSB0aGF0IHRoZSBjb21waWxlciBoYXNuJ3Qgb3Zlci1hZ3Jlc3NpdmVseQorCSAqIHBhZGRlZCBpbXBvcnRhbnQgc3RydWN0dXJlcy4KKwkgKi8KKwlpZiAoc2l6ZW9mKHN0cnVjdCBoYXJkd2FyZV9zY2IpICE9IDY0KQorCQlwYW5pYygiSGFyZHdhcmUgU0NCIHNpemUgaXMgaW5jb3JyZWN0Iik7CisKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9ERUJVR19TRVFVRU5DRVIpICE9IDApCisJCWFoZC0+ZmxhZ3MgfD0gQUhEX1NFUVVFTkNFUl9ERUJVRzsKKyNlbmRpZgorCisJLyoKKwkgKiBEZWZhdWx0IHRvIGFsbG93aW5nIGluaXRpYXRvciBvcGVyYXRpb25zLgorCSAqLworCWFoZC0+ZmxhZ3MgfD0gQUhEX0lOSVRJQVRPUlJPTEU7CisKKwkvKgorCSAqIE9ubHkgYWxsb3cgdGFyZ2V0IG1vZGUgZmVhdHVyZXMgaWYgdGhpcyB1bml0IGhhcyB0aGVtIGVuYWJsZWQuCisJICovCisJaWYgKChBSERfVE1PREVfRU5BQkxFICYgKDB4MSA8PCBhaGQtPnVuaXQpKSA9PSAwKQorCQlhaGQtPmZlYXR1cmVzICY9IH5BSERfVEFSR0VUTU9ERTsKKworI2lmbmRlZiBfX2xpbnV4X18KKwkvKiBETUEgdGFnIGZvciBtYXBwaW5nIGJ1ZmZlcnMgaW50byBkZXZpY2UgdmlzaWJsZSBzcGFjZS4gKi8KKwlpZiAoYWhkX2RtYV90YWdfY3JlYXRlKGFoZCwgYWhkLT5wYXJlbnRfZG1hdCwgLyphbGlnbm1lbnQqLzEsCisJCQkgICAgICAgLypib3VuZGFyeSovQlVTX1NQQUNFX01BWEFERFJfMzJCSVQgKyAxLAorCQkJICAgICAgIC8qbG93YWRkciovYWhkLT5mbGFncyAmIEFIRF8zOUJJVF9BRERSRVNTSU5HCisJCQkJCT8gKGRtYV9hZGRyX3QpMHg3RkZGRkZGRkZGVUxMCisJCQkJCTogQlVTX1NQQUNFX01BWEFERFJfMzJCSVQsCisJCQkgICAgICAgLypoaWdoYWRkciovQlVTX1NQQUNFX01BWEFERFIsCisJCQkgICAgICAgLypmaWx0ZXIqL05VTEwsIC8qZmlsdGVyYXJnKi9OVUxMLAorCQkJICAgICAgIC8qbWF4c2l6ZSovKEFIRF9OU0VHIC0gMSkgKiBQQUdFX1NJWkUsCisJCQkgICAgICAgLypuc2VnbWVudHMqL0FIRF9OU0VHLAorCQkJICAgICAgIC8qbWF4c2Vnc3oqL0FIRF9NQVhUUkFOU0ZFUl9TSVpFLAorCQkJICAgICAgIC8qZmxhZ3MqL0JVU19ETUFfQUxMT0NOT1csCisJCQkgICAgICAgJmFoZC0+YnVmZmVyX2RtYXQpICE9IDApIHsKKwkJcmV0dXJuIChFTk9NRU0pOworCX0KKyNlbmRpZgorCisJYWhkLT5pbml0X2xldmVsKys7CisKKwkvKgorCSAqIERNQSB0YWcgZm9yIG91ciBjb21tYW5kIGZpZm9zIGFuZCBvdGhlciBkYXRhIGluIHN5c3RlbSBtZW1vcnkKKwkgKiB0aGUgY2FyZCdzIHNlcXVlbmNlciBtdXN0IGJlIGFibGUgdG8gYWNjZXNzLiAgRm9yIGluaXRpYXRvcgorCSAqIHJvbGVzLCB3ZSBuZWVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcW91dGZpZm8uICBXaGVuIHByb3ZpZGluZworCSAqIGZvciB0aGUgdGFyZ2V0IG1vZGUgcm9sZSwgd2UgbXVzdCBhZGRpdGlvbmFsbHkgcHJvdmlkZSBzcGFjZSBmb3IKKwkgKiB0aGUgaW5jb21pbmcgdGFyZ2V0IGNvbW1hbmQgZmlmby4KKwkgKi8KKwlkcml2ZXJfZGF0YV9zaXplID0gQUhEX1NDQl9NQVggKiBzaXplb2YodWludDE2X3QpCisJCQkgKyBzaXplb2Yoc3RydWN0IGhhcmR3YXJlX3NjYik7CisJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX1RBUkdFVE1PREUpICE9IDApCisJCWRyaXZlcl9kYXRhX3NpemUgKz0gQUhEX1RNT0RFX0NNRFMgKiBzaXplb2Yoc3RydWN0IHRhcmdldF9jbWQpOworCWlmICgoYWhkLT5idWdzICYgQUhEX1BLVF9CSVRCVUNLRVRfQlVHKSAhPSAwKQorCQlkcml2ZXJfZGF0YV9zaXplICs9IFBLVF9PVkVSUlVOX0JVRlNJWkU7CisJaWYgKGFoZF9kbWFfdGFnX2NyZWF0ZShhaGQsIGFoZC0+cGFyZW50X2RtYXQsIC8qYWxpZ25tZW50Ki8xLAorCQkJICAgICAgIC8qYm91bmRhcnkqL0JVU19TUEFDRV9NQVhBRERSXzMyQklUICsgMSwKKwkJCSAgICAgICAvKmxvd2FkZHIqL0JVU19TUEFDRV9NQVhBRERSXzMyQklULAorCQkJICAgICAgIC8qaGlnaGFkZHIqL0JVU19TUEFDRV9NQVhBRERSLAorCQkJICAgICAgIC8qZmlsdGVyKi9OVUxMLCAvKmZpbHRlcmFyZyovTlVMTCwKKwkJCSAgICAgICBkcml2ZXJfZGF0YV9zaXplLAorCQkJICAgICAgIC8qbnNlZ21lbnRzKi8xLAorCQkJICAgICAgIC8qbWF4c2Vnc3oqL0JVU19TUEFDRV9NQVhTSVpFXzMyQklULAorCQkJICAgICAgIC8qZmxhZ3MqLzAsICZhaGQtPnNoYXJlZF9kYXRhX2RtYXQpICE9IDApIHsKKwkJcmV0dXJuIChFTk9NRU0pOworCX0KKworCWFoZC0+aW5pdF9sZXZlbCsrOworCisJLyogQWxsb2NhdGlvbiBvZiBkcml2ZXIgZGF0YSAqLworCWlmIChhaGRfZG1hbWVtX2FsbG9jKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LAorCQkJICAgICAodm9pZCAqKikmYmFzZV92YWRkciwKKwkJCSAgICAgQlVTX0RNQV9OT1dBSVQsICZhaGQtPnNoYXJlZF9kYXRhX2RtYW1hcCkgIT0gMCkgeworCQlyZXR1cm4gKEVOT01FTSk7CisJfQorCisJYWhkLT5pbml0X2xldmVsKys7CisKKwkvKiBBbmQgcGVybWFuZW50bHkgbWFwIGl0IGluICovCisJYWhkX2RtYW1hcF9sb2FkKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LCBhaGQtPnNoYXJlZF9kYXRhX2RtYW1hcCwKKwkJCWJhc2VfdmFkZHIsIGRyaXZlcl9kYXRhX3NpemUsIGFoZF9kbWFtYXBfY2IsCisJCQkmYWhkLT5zaGFyZWRfZGF0YV9idXNhZGRyLCAvKmZsYWdzKi8wKTsKKwlhaGQtPnFvdXRmaWZvID0gKHVpbnQxNl90ICopYmFzZV92YWRkcjsKKwluZXh0X3ZhZGRyID0gKHVpbnQ4X3QgKikmYWhkLT5xb3V0Zmlmb1tBSERfUU9VVF9TSVpFXTsKKwluZXh0X2JhZGRyID0gYWhkLT5zaGFyZWRfZGF0YV9idXNhZGRyICsgQUhEX1FPVVRfU0laRSpzaXplb2YodWludDE2X3QpOworCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9UQVJHRVRNT0RFKSAhPSAwKSB7CisJCWFoZC0+dGFyZ2V0Y21kcyA9IChzdHJ1Y3QgdGFyZ2V0X2NtZCAqKW5leHRfdmFkZHI7CisJCW5leHRfdmFkZHIgKz0gQUhEX1RNT0RFX0NNRFMgKiBzaXplb2Yoc3RydWN0IHRhcmdldF9jbWQpOworCQluZXh0X2JhZGRyICs9IEFIRF9UTU9ERV9DTURTICogc2l6ZW9mKHN0cnVjdCB0YXJnZXRfY21kKTsKKwl9CisKKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9QS1RfQklUQlVDS0VUX0JVRykgIT0gMCkgeworCQlhaGQtPm92ZXJydW5fYnVmID0gbmV4dF92YWRkcjsKKwkJbmV4dF92YWRkciArPSBQS1RfT1ZFUlJVTl9CVUZTSVpFOworCQluZXh0X2JhZGRyICs9IFBLVF9PVkVSUlVOX0JVRlNJWkU7CisJfQorCisJLyoKKwkgKiBXZSBuZWVkIG9uZSBTQ0IgdG8gc2VydmUgYXMgdGhlICJuZXh0IFNDQiIuICBTaW5jZSB0aGUKKwkgKiB0YWcgaWRlbnRpZmllciBpbiB0aGlzIFNDQiB3aWxsIG5ldmVyIGJlIHVzZWQsIHRoZXJlIGlzCisJICogbm8gcG9pbnQgaW4gdXNpbmcgYSB2YWxpZCBIU0NCIHRhZyBmcm9tIGFuIFNDQiBwdWxsZWQgZnJvbQorCSAqIHRoZSBzdGFuZGFyZCBmcmVlIHBvb2wuICBTbywgd2UgYWxsb2NhdGUgdGhpcyAic2VudGluZWwiCisJICogc3BlY2lhbGx5IGZyb20gdGhlIERNQSBzYWZlIG1lbW9yeSBjaHVuayB1c2VkIGZvciB0aGUgUU9VVEZJRk8uCisJICovCisJYWhkLT5uZXh0X3F1ZXVlZF9oc2NiID0gKHN0cnVjdCBoYXJkd2FyZV9zY2IgKiluZXh0X3ZhZGRyOworCWFoZC0+bmV4dF9xdWV1ZWRfaHNjYi0+aHNjYl9idXNhZGRyID0gYWhkX2h0b2xlMzIobmV4dF9iYWRkcik7CisKKwlhaGQtPmluaXRfbGV2ZWwrKzsKKworCS8qIEFsbG9jYXRlIFNDQiBkYXRhIG5vdyB0aGF0IGJ1ZmZlcl9kbWF0IGlzIGluaXRpYWxpemVkICovCisJaWYgKGFoZF9pbml0X3NjYmRhdGEoYWhkKSAhPSAwKQorCQlyZXR1cm4gKEVOT01FTSk7CisKKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfSU5JVElBVE9SUk9MRSkgPT0gMCkKKwkJYWhkLT5mbGFncyAmPSB+QUhEX1JFU0VUX0JVU19BOworCisJLyoKKwkgKiBCZWZvcmUgY29tbWl0dGluZyB0aGVzZSBzZXR0aW5ncyB0byB0aGUgY2hpcCwgZ2l2ZQorCSAqIHRoZSBPU00gb25lIGxhc3QgY2hhbmNlIHRvIG1vZGlmeSBvdXIgY29uZmlndXJhdGlvbi4KKwkgKi8KKwlhaGRfcGxhdGZvcm1faW5pdChhaGQpOworCisJLyogQnJpbmcgdXAgdGhlIGNoaXAuICovCisJYWhkX2NoaXBfaW5pdChhaGQpOworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CisKKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfQ1VSUkVOVF9TRU5TSU5HKSA9PSAwKQorCQlnb3RvIGluaXRfZG9uZTsKKworCS8qCisJICogVmVyaWZ5IHRlcm1pbmF0aW9uIGJhc2VkIG9uIGN1cnJlbnQgZHJhdyBhbmQKKwkgKiB3YXJuIHVzZXIgaWYgdGhlIGJ1cyBpcyBvdmVyL3VuZGVyIHRlcm1pbmF0ZWQuCisJICovCisJZXJyb3IgPSBhaGRfd3JpdGVfZmxleHBvcnQoYWhkLCBGTFhBRERSX1JPTVNUQVRfQ1VSU0VOU0VDVEwsCisJCQkJICAgQ1VSU0VOU0VfRU5CKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlwcmludGYoIiVzOiBjdXJyZW50IHNlbnNpbmcgdGltZW91dCAxXG4iLCBhaGRfbmFtZShhaGQpKTsKKwkJZ290byBpbml0X2RvbmU7CisJfQorCWZvciAoaSA9IDIwLCBmc3RhdCA9IEZMWF9GU1RBVF9CVVNZOworCSAgICAgKGZzdGF0ICYgRkxYX0ZTVEFUX0JVU1kpICE9IDAgJiYgaTsgaS0tKSB7CisJCWVycm9yID0gYWhkX3JlYWRfZmxleHBvcnQoYWhkLCBGTFhBRERSX0ZMRVhTVEFULCAmZnN0YXQpOworCQlpZiAoZXJyb3IgIT0gMCkgeworCQkJcHJpbnRmKCIlczogY3VycmVudCBzZW5zaW5nIHRpbWVvdXQgMlxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpKTsKKwkJCWdvdG8gaW5pdF9kb25lOworCQl9CisJfQorCWlmIChpID09IDApIHsKKwkJcHJpbnRmKCIlczogVGltZWRvdXQgZHVyaW5nIGN1cnJlbnQtc2Vuc2luZyB0ZXN0XG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CisJCWdvdG8gaW5pdF9kb25lOworCX0KKworCS8qIExhdGNoIEN1cnJlbnQgU2Vuc2luZyBzdGF0dXMuICovCisJZXJyb3IgPSBhaGRfcmVhZF9mbGV4cG9ydChhaGQsIEZMWEFERFJfQ1VSUkVOVF9TVEFULCAmY3VycmVudF9zZW5zaW5nKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlwcmludGYoIiVzOiBjdXJyZW50IHNlbnNpbmcgdGltZW91dCAzXG4iLCBhaGRfbmFtZShhaGQpKTsKKwkJZ290byBpbml0X2RvbmU7CisJfQorCisJLyogRGlhYmxlIGN1cnJlbnQgc2Vuc2luZy4gKi8KKwlhaGRfd3JpdGVfZmxleHBvcnQoYWhkLCBGTFhBRERSX1JPTVNUQVRfQ1VSU0VOU0VDVEwsIDApOworCisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19URVJNQ1RMKSAhPSAwKSB7CisJCXByaW50ZigiJXM6IGN1cnJlbnRfc2Vuc2luZyA9PSAweCV4XG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgY3VycmVudF9zZW5zaW5nKTsKKwl9CisjZW5kaWYKKwl3YXJuX3VzZXIgPSAwOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGN1cnJlbnRfc2Vuc2luZyA+Pj0gRkxYX0NTVEFUX1NISUZUKSB7CisJCXVfaW50IHRlcm1fc3RhdDsKKworCQl0ZXJtX3N0YXQgPSAoY3VycmVudF9zZW5zaW5nICYgRkxYX0NTVEFUX01BU0spOworCQlzd2l0Y2ggKHRlcm1fc3RhdCkgeworCQljYXNlIEZMWF9DU1RBVF9PVkVSOgorCQljYXNlIEZMWF9DU1RBVF9VTkRFUjoKKwkJCXdhcm5fdXNlcisrOworCQljYXNlIEZMWF9DU1RBVF9JTlZBTElEOgorCQljYXNlIEZMWF9DU1RBVF9PS0FZOgorCQkJaWYgKHdhcm5fdXNlciA9PSAwICYmIGJvb3R2ZXJib3NlID09IDApCisJCQkJYnJlYWs7CisJCQlwcmludGYoIiVzOiAlcyBDaGFubmVsICVzXG4iLCBhaGRfbmFtZShhaGQpLAorCQkJICAgICAgIGNoYW5uZWxfc3RyaW5nc1tpXSwgdGVybXN0YXRfc3RyaW5nc1t0ZXJtX3N0YXRdKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICh3YXJuX3VzZXIpIHsKKwkJcHJpbnRmKCIlczogV0FSTklORy4gVGVybWluYXRpb24gaXMgbm90IGNvbmZpZ3VyZWQgY29ycmVjdGx5LlxuIgorCQkgICAgICAgIiVzOiBXQVJOSU5HLiBTQ1NJIGJ1cyBvcGVyYXRpb25zIG1heSBGQUlMLlxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIGFoZF9uYW1lKGFoZCkpOworCX0KK2luaXRfZG9uZToKKwlhaGRfcmVzdGFydChhaGQpOworCWFoZF90aW1lcl9yZXNldCgmYWhkLT5zdGF0X3RpbWVyLCBBSERfU1RBVF9VUERBVEVfVVMsCisJCQlhaGRfc3RhdF90aW1lciwgYWhkKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogKFJlKWluaXRpYWxpemUgY2hpcCBzdGF0ZSBhZnRlciBhIGNoaXAgcmVzZXQuCisgKi8KK3N0YXRpYyB2b2lkCithaGRfY2hpcF9pbml0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl1aW50MzJfdCBidXNhZGRyOworCXVfaW50CSBzeGZyY3RsMTsKKwl1X2ludAkgc2NzaXNlcV90ZW1wbGF0ZTsKKwl1X2ludAkgd2FpdDsKKwl1X2ludAkgaTsKKwl1X2ludAkgdGFyZ2V0OworCisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCS8qCisJICogVGFrZSB0aGUgTEVEIG91dCBvZiBkaWFnbm9zdGljIG1vZGUKKwkgKi8KKwlhaGRfb3V0YihhaGQsIFNCTEtDVEwsIGFoZF9pbmIoYWhkLCBTQkxLQ1RMKSAmIH4oRElBR0xFREVOfERJQUdMRURPTikpOworCisJLyoKKwkgKiBSZXR1cm4gSFNfTUFJTEJPWCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KKwkgKi8KKwlhaGQtPmhzX21haWxib3ggPSAwOworCWFoZF9vdXRiKGFoZCwgSFNfTUFJTEJPWCwgMCk7CisKKwkvKiBTZXQgdGhlIFNDU0kgSWQsIFNYRlJDVEwwLCBTWEZSQ1RMMSwgYW5kIFNJTU9ERTEuICovCisJYWhkX291dGIoYWhkLCBJT1dOSUQsIGFoZC0+b3VyX2lkKTsKKwlhaGRfb3V0YihhaGQsIFRPV05JRCwgYWhkLT5vdXJfaWQpOworCXN4ZnJjdGwxID0gKGFoZC0+ZmxhZ3MgJiBBSERfVEVSTV9FTkJfQSkgIT0gMCA/IFNUUFdFTiA6IDA7CisJc3hmcmN0bDEgfD0gKGFoZC0+ZmxhZ3MgJiBBSERfU1BDSEtfRU5CX0EpICE9IDAgPyBFTlNQQ0hLIDogMDsKKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9MT05HX1NFVElNT19CVUcpCisJICYmIChhaGQtPnNlbHRpbWUgIT0gU1RJTUVTRUxfTUlOKSkgeworCQkvKgorCQkgKiBUaGUgc2VsZWN0aW9uIHRpbWVyIGR1cmF0aW9uIGlzIHR3aWNlIGFzIGxvbmcKKwkJICogYXMgaXQgc2hvdWxkIGJlLiAgSGFsdmUgaXQgYnkgYWRkaW5nICIxIiB0bworCQkgKiB0aGUgdXNlciBzcGVjaWZpZWQgc2V0dGluZy4KKwkJICovCisJCXN4ZnJjdGwxIHw9IGFoZC0+c2VsdGltZSArIFNUSU1FU0VMX0JVR19BREo7CisJfSBlbHNlIHsKKwkJc3hmcmN0bDEgfD0gYWhkLT5zZWx0aW1lOworCX0KKwkJCisJYWhkX291dGIoYWhkLCBTWEZSQ1RMMCwgREZPTik7CisJYWhkX291dGIoYWhkLCBTWEZSQ1RMMSwgc3hmcmN0bDF8YWhkLT5zZWx0aW1lfEVOU1RJTUVSfEFDVE5FR0VOKTsKKwlhaGRfb3V0YihhaGQsIFNJTU9ERTEsIEVOU0VMVElNT3xFTlNDU0lSU1R8RU5TQ1NJUEVSUik7CisKKwkvKgorCSAqIE5vdyB0aGF0IHRlcm1pbmF0aW9uIGlzIHNldCwgd2FpdCBmb3IgdXAKKwkgKiB0byA1MDBtcyBmb3Igb3VyIHRyYW5zY2VpdmVycyB0byBzZXR0bGUuICBJZgorCSAqIHRoZSBhZGFwdGVyIGRvZXMgbm90IGhhdmUgYSBjYWJsZSBhdHRhY2hlZCwKKwkgKiB0aGUgdHJhbnNjZWl2ZXJzIG1heSBuZXZlciBzZXR0bGUsIHNvIGRvbid0CisJICogY29tcGxhaW4gaWYgd2UgZmFpbCBoZXJlLgorCSAqLworCWZvciAod2FpdCA9IDEwMDAwOworCSAgICAgKGFoZF9pbmIoYWhkLCBTQkxLQ1RMKSAmIChFTkFCNDB8RU5BQjIwKSkgPT0gMCAmJiB3YWl0OworCSAgICAgd2FpdC0tKQorCQlhaGRfZGVsYXkoMTAwKTsKKworCS8qIENsZWFyIGFueSBmYWxzZSBidXMgcmVzZXRzIGR1ZSB0byB0aGUgdHJhbnNjZWl2ZXJzIHNldHRsaW5nICovCisJYWhkX291dGIoYWhkLCBDTFJTSU5UMSwgQ0xSU0NTSVJTVEkpOworCWFoZF9vdXRiKGFoZCwgQ0xSSU5ULCBDTFJTQ1NJSU5UKTsKKworCS8qIEluaXRpYWxpemUgbW9kZSBzcGVjaWZpYyBTL0cgc3RhdGUuICovCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfREZGMCArIGksIEFIRF9NT0RFX0RGRjAgKyBpKTsKKwkJYWhkX291dGIoYWhkLCBMT05HSk1QX0FERFIgKyAxLCBJTlZBTElEX0FERFIpOworCQlhaGRfb3V0YihhaGQsIFNHX1NUQVRFLCAwKTsKKwkJYWhkX291dGIoYWhkLCBDTFJTRVFJTlRTUkMsIDB4RkYpOworCQlhaGRfb3V0YihhaGQsIFNFUUlNT0RFLAorCQkJIEVOU0FWRVBUUlN8RU5DRkc0REFUQXxFTkNGRzRJU1RBVAorCQkJfEVOQ0ZHNFRTVEFUfEVOQ0ZHNElDTUR8RU5DRkc0VENNRCk7CisJfQorCisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0NGRywgQUhEX01PREVfQ0ZHKTsKKwlhaGRfb3V0YihhaGQsIERTQ09NTUFORDAsIGFoZF9pbmIoYWhkLCBEU0NPTU1BTkQwKXxNUEFSQ0tFTnxDQUNIRVRIRU4pOworCWFoZF9vdXRiKGFoZCwgREZGX1RIUlNILCBSRF9ERlRIUlNIXzc1fFdSX0RGVEhSU0hfNzUpOworCWFoZF9vdXRiKGFoZCwgU0lNT0RFMCwgRU5JT0VSUnxFTk9WRVJSVU4pOworCWFoZF9vdXRiKGFoZCwgU0lNT0RFMywgRU5OVFJBTVBFUlJ8RU5PU1JBTVBFUlIpOworCWlmICgoYWhkLT5idWdzICYgQUhEX0JVU0ZSRUVSRVZfQlVHKSAhPSAwKSB7CisJCWFoZF9vdXRiKGFoZCwgT1BUSU9OTU9ERSwgQVVUT0FDS0VOfEFVVE9fTVNHT1VUX0RFKTsKKwl9IGVsc2UgeworCQlhaGRfb3V0YihhaGQsIE9QVElPTk1PREUsIEFVVE9BQ0tFTnxCVVNGUkVFUkVWfEFVVE9fTVNHT1VUX0RFKTsKKwl9CisJYWhkX291dGIoYWhkLCBTQ1NDSEtOLCBDVVJSRklGT0RFRnxXSURFUkVTRU58U0hWQUxJRFNURElTKTsKKwlpZiAoKGFoZC0+Y2hpcCAmIEFIRF9CVVNfTUFTSykgPT0gQUhEX1BDSVgpCisJCS8qCisJCSAqIERvIG5vdCBpc3N1ZSBhIHRhcmdldCBhYm9ydCB3aGVuIGEgc3BsaXQgY29tcGxldGlvbgorCQkgKiBlcnJvciBvY2N1cnMuICBMZXQgb3VyIFBDSVggaW50ZXJydXB0IGhhbmRsZXIgZGVhbAorCQkgKiB3aXRoIGl0IGluc3RlYWQuIEgyQTQgUmF6b3IgIzYyNQorCQkgKi8KKwkJYWhkX291dGIoYWhkLCBQQ0lYQ1RMLCBhaGRfaW5iKGFoZCwgUENJWENUTCkgfCBTUExUU1RBRElTKTsKKworCWlmICgoYWhkLT5idWdzICYgQUhEX0xRT09WRVJSVU5fQlVHKSAhPSAwKQorCQlhaGRfb3V0YihhaGQsIExRT1NDU0NUTCwgTFFPTk9DSEtPVkVSKTsKKworCS8qCisJICogVHdlYWsgSU9DRUxMIHNldHRpbmdzLgorCSAqLworCWlmICgoYWhkLT5mbGFncyAmIEFIRF9IUF9CT0FSRCkgIT0gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgTlVNRFNQUzsgaSsrKSB7CisJCQlhaGRfb3V0YihhaGQsIERTUFNFTEVDVCwgaSk7CisJCQlhaGRfb3V0YihhaGQsIFdSVEJJQVNDVEwsIFdSVEJJQVNDVExfSFBfREVGQVVMVCk7CisJCX0KKyNpZmRlZiBBSERfREVCVUcKKwkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NSVNDKSAhPSAwKQorCQkJcHJpbnRmKCIlczogV1JUQklBU0NUTCBub3cgMHgleFxuIiwgYWhkX25hbWUoYWhkKSwKKwkJCSAgICAgICBXUlRCSUFTQ1RMX0hQX0RFRkFVTFQpOworI2VuZGlmCisJfQorCWFoZF9zZXR1cF9pb2NlbGxfd29ya2Fyb3VuZChhaGQpOworCisJLyoKKwkgKiBFbmFibGUgTFFJIE1hbmFnZXIgaW50ZXJydXB0cy4KKwkgKi8KKwlhaGRfb3V0YihhaGQsIExRSU1PREUxLCBFTkxRSVBIQVNFX0xRfEVOTFFJUEhBU0VfTkxRfEVOTElRQUJPUlQKKwkJCSAgICAgIHwgRU5MUUlDUkNJX0xRfEVOTFFJQ1JDSV9OTFF8RU5MUUlCQURMUUkKKwkJCSAgICAgIHwgRU5MUUlPVkVSSV9MUXxFTkxRSU9WRVJJX05MUSk7CisJYWhkX291dGIoYWhkLCBMUU9NT0RFMCwgRU5MUU9BVE5MUXxFTkxRT0FUTlBLVHxFTkxRT1RDUkMpOworCS8qCisJICogQW4gaW50ZXJydXB0IGZyb20gTFFPQlVTRlJFRSBpcyBtYWRlIHJlZHVuZGFudCBieSB0aGUKKwkgKiBCVVNGUkVFIGludGVycnVwdC4gIFdlIGNob29zZSB0byBoYXZlIHRoZSBzZXF1ZW5jZXIgY2F0Y2gKKwkgKiBMUU9QSENIR0lOUEtUIGVycm9ycyBtYW51YWxseSBmb3IgdGhlIGNvbW1hbmQgcGhhc2UgYXQgdGhlCisJICogc3RhcnQgb2YgYSBwYWNrZXRpemVkIHNlbGVjdGlvbiBjYXNlLgorCWFoZF9vdXRiKGFoZCwgTFFPTU9ERTEsIEVOTFFPQlVTRlJFRXxFTkxRT1BIQUNIR0lOUEtUKTsKKwkgKi8KKwlhaGRfb3V0YihhaGQsIExRT01PREUxLCAwKTsKKworCS8qCisJICogU2V0dXAgc2VxdWVuY2VyIGludGVycnVwdCBoYW5kbGVycy4KKwkgKi8KKwlhaGRfb3V0dyhhaGQsIElOVFZFQzFfQUREUiwgYWhkX3Jlc29sdmVfc2VxYWRkcihhaGQsIExBQkVMX3NlcV9pc3IpKTsKKwlhaGRfb3V0dyhhaGQsIElOVFZFQzJfQUREUiwgYWhkX3Jlc29sdmVfc2VxYWRkcihhaGQsIExBQkVMX3RpbWVyX2lzcikpOworCisJLyoKKwkgKiBTZXR1cCBTQ0IgT2Zmc2V0IHJlZ2lzdGVycy4KKwkgKi8KKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9QS1RfTFVOX0JVRykgIT0gMCkgeworCQlhaGRfb3V0YihhaGQsIExVTlBUUiwgb2Zmc2V0b2Yoc3RydWN0IGhhcmR3YXJlX3NjYiwKKwkJCSBwa3RfbG9uZ19sdW4pKTsKKwl9IGVsc2UgeworCQlhaGRfb3V0YihhaGQsIExVTlBUUiwgb2Zmc2V0b2Yoc3RydWN0IGhhcmR3YXJlX3NjYiwgbHVuKSk7CisJfQorCWFoZF9vdXRiKGFoZCwgQ01ETEVOUFRSLCBvZmZzZXRvZihzdHJ1Y3QgaGFyZHdhcmVfc2NiLCBjZGJfbGVuKSk7CisJYWhkX291dGIoYWhkLCBBVFRSUFRSLCBvZmZzZXRvZihzdHJ1Y3QgaGFyZHdhcmVfc2NiLCB0YXNrX2F0dHJpYnV0ZSkpOworCWFoZF9vdXRiKGFoZCwgRkxBR1BUUiwgb2Zmc2V0b2Yoc3RydWN0IGhhcmR3YXJlX3NjYiwgdGFza19tYW5hZ2VtZW50KSk7CisJYWhkX291dGIoYWhkLCBDTURQVFIsIG9mZnNldG9mKHN0cnVjdCBoYXJkd2FyZV9zY2IsCisJCQkJICAgICAgIHNoYXJlZF9kYXRhLmlkYXRhLmNkYikpOworCWFoZF9vdXRiKGFoZCwgUU5FWFRQVFIsCisJCSBvZmZzZXRvZihzdHJ1Y3QgaGFyZHdhcmVfc2NiLCBuZXh0X2hzY2JfYnVzYWRkcikpOworCWFoZF9vdXRiKGFoZCwgQUJSVEJJVFBUUiwgTUtfTUVTU0FHRV9CSVRfT0ZGU0VUKTsKKwlhaGRfb3V0YihhaGQsIEFCUlRCWVRFUFRSLCBvZmZzZXRvZihzdHJ1Y3QgaGFyZHdhcmVfc2NiLCBjb250cm9sKSk7CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfUEtUX0xVTl9CVUcpICE9IDApIHsKKwkJYWhkX291dGIoYWhkLCBMVU5MRU4sCisJCQkgc2l6ZW9mKGFoZC0+bmV4dF9xdWV1ZWRfaHNjYi0+cGt0X2xvbmdfbHVuKSAtIDEpOworCX0gZWxzZSB7CisJCWFoZF9vdXRiKGFoZCwgTFVOTEVOLCBMVU5MRU5fU0lOR0xFX0xFVkVMX0xVTik7CisJfQorCWFoZF9vdXRiKGFoZCwgQ0RCTElNSVQsIFNDQl9DREJfTEVOX1BUUiAtIDEpOworCWFoZF9vdXRiKGFoZCwgTUFYQ01ELCAweEZGKTsKKwlhaGRfb3V0YihhaGQsIFNDQkFVVE9QVFIsCisJCSBBVVNDQlBUUl9FTiB8IG9mZnNldG9mKHN0cnVjdCBoYXJkd2FyZV9zY2IsIHRhZykpOworCisJLyogV2UgaGF2ZW4ndCBiZWVuIGVuYWJsZWQgZm9yIHRhcmdldCBtb2RlIHlldC4gKi8KKwlhaGRfb3V0YihhaGQsIE1VTFRBUkdJRCwgMCk7CisJYWhkX291dGIoYWhkLCBNVUxUQVJHSUQgKyAxLCAwKTsKKworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKwkvKiBJbml0aWFsaXplIHRoZSBuZWdvdGlhdGlvbiB0YWJsZS4gKi8KKwlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfTkVXX0lPQ0VMTF9PUFRTKSA9PSAwKSB7CisJCS8qCisJCSAqIENsZWFyIHRoZSBzcGFyZSBieXRlcyBpbiB0aGUgbmVnIHRhYmxlIHRvIGF2b2lkCisJCSAqIHNwdXJpb3VzIHBhcml0eSBlcnJvcnMuCisJCSAqLworCQlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8IEFIRF9OVU1fVEFSR0VUUzsgdGFyZ2V0KyspIHsKKwkJCWFoZF9vdXRiKGFoZCwgTkVHT0FERFIsIHRhcmdldCk7CisJCQlhaGRfb3V0YihhaGQsIEFOTkVYQ09MLCBBSERfQU5ORVhDT0xfUEVSX0RFVjApOworCQkJZm9yIChpID0gMDsgaSA8IEFIRF9OVU1fUEVSX0RFVl9BTk5FWENPTFM7IGkrKykKKwkJCQlhaGRfb3V0YihhaGQsIEFOTkVYREFULCAwKTsKKwkJfQorCX0KKwlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8IEFIRF9OVU1fVEFSR0VUUzsgdGFyZ2V0KyspIHsKKwkJc3RydWN0CSBhaGRfZGV2aW5mbyBkZXZpbmZvOworCQlzdHJ1Y3QJIGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQlzdHJ1Y3QJIGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKworCQl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCAnQScsIGFoZC0+b3VyX2lkLAorCQkJCQkgICAgdGFyZ2V0LCAmdHN0YXRlKTsKKwkJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywgYWhkLT5vdXJfaWQsCisJCQkJICAgIHRhcmdldCwgQ0FNX0xVTl9XSUxEQ0FSRCwKKwkJCQkgICAgJ0EnLCBST0xFX0lOSVRJQVRPUik7CisJCWFoZF91cGRhdGVfbmVnX3RhYmxlKGFoZCwgJmRldmluZm8sICZ0aW5mby0+Y3Vycik7CisJfQorCisJYWhkX291dGIoYWhkLCBDTFJTSU5UMywgTlRSQU1QRVJSfE9TUkFNUEVSUik7CisJYWhkX291dGIoYWhkLCBDTFJJTlQsIENMUlNDU0lJTlQpOworCisjaWZkZWYgTkVFRFNfTU9SRV9URVNUSU5HCisJLyoKKwkgKiBBbHdheXMgZW5hYmxlIGFib3J0IG9uIGluY29taW5nIExfUXMgaWYgdGhpcyBmZWF0dXJlIGlzCisJICogc3VwcG9ydGVkLiAgV2UgdXNlIHRoaXMgdG8gY2F0Y2ggaW52YWxpZCBTQ0IgcmVmZXJlbmNlcy4KKwkgKi8KKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9BQk9SVF9MUUlfQlVHKSA9PSAwKQorCQlhaGRfb3V0YihhaGQsIExRQ1RMMSwgQUJPUlRQRU5ESU5HKTsKKwllbHNlCisjZW5kaWYKKwkJYWhkX291dGIoYWhkLCBMUUNUTDEsIDApOworCisJLyogQWxsIG9mIG91ciBxdWV1ZXMgYXJlIGVtcHR5ICovCisJYWhkLT5xb3V0Zmlmb25leHQgPSAwOworCWFoZC0+cW91dGZpZm9uZXh0X3ZhbGlkX3RhZyA9IFFPVVRGSUZPX0VOVFJZX1ZBTElEX0xFOworCWFoZF9vdXRiKGFoZCwgUU9VVEZJRk9fRU5UUllfVkFMSURfVEFHLCBRT1VURklGT19FTlRSWV9WQUxJRCA+PiA4KTsKKwlmb3IgKGkgPSAwOyBpIDwgQUhEX1FPVVRfU0laRTsgaSsrKQorCQlhaGQtPnFvdXRmaWZvW2ldID0gMDsKKwlhaGRfc3luY19xb3V0ZmlmbyhhaGQsIEJVU19ETUFTWU5DX1BSRVJFQUQpOworCisJYWhkLT5xaW5maWZvbmV4dCA9IDA7CisJZm9yIChpID0gMDsgaSA8IEFIRF9RSU5fU0laRTsgaSsrKQorCQlhaGQtPnFpbmZpZm9baV0gPSBTQ0JfTElTVF9OVUxMOworCisJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX1RBUkdFVE1PREUpICE9IDApIHsKKwkJLyogQWxsIHRhcmdldCBjb21tYW5kIGJsb2NrcyBzdGFydCBvdXQgaW52YWxpZC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IEFIRF9UTU9ERV9DTURTOyBpKyspCisJCQlhaGQtPnRhcmdldGNtZHNbaV0uY21kX3ZhbGlkID0gMDsKKwkJYWhkX3N5bmNfdHFpbmZpZm8oYWhkLCBCVVNfRE1BU1lOQ19QUkVSRUFEKTsKKwkJYWhkLT50cWluZmlmb25leHQgPSAxOworCQlhaGRfb3V0YihhaGQsIEtFUk5FTF9UUUlOUE9TLCBhaGQtPnRxaW5maWZvbmV4dCAtIDEpOworCQlhaGRfb3V0YihhaGQsIFRRSU5QT1MsIGFoZC0+dHFpbmZpZm9uZXh0KTsKKwl9CisKKwkvKiBJbml0aWFsaXplIFNjcmF0Y2ggUmFtLiAqLworCWFoZF9vdXRiKGFoZCwgU0VRX0ZMQUdTLCAwKTsKKwlhaGRfb3V0YihhaGQsIFNFUV9GTEFHUzIsIDApOworCisJLyogV2UgZG9uJ3QgaGF2ZSBhbnkgd2FpdGluZyBzZWxlY3Rpb25zICovCisJYWhkX291dHcoYWhkLCBXQUlUSU5HX1RJRF9IRUFELCBTQ0JfTElTVF9OVUxMKTsKKwlhaGRfb3V0dyhhaGQsIFdBSVRJTkdfVElEX1RBSUwsIFNDQl9MSVNUX05VTEwpOworCWZvciAoaSA9IDA7IGkgPCBBSERfTlVNX1RBUkdFVFM7IGkrKykKKwkJYWhkX291dHcoYWhkLCBXQUlUSU5HX1NDQl9UQUlMUyArICgyICogaSksIFNDQl9MSVNUX05VTEwpOworCisJLyoKKwkgKiBOb2JvZHkgaXMgd2FpdGluZyB0byBiZSBETUFlZCBpbnRvIHRoZSBRT1VURklGTy4KKwkgKi8KKwlhaGRfb3V0dyhhaGQsIENPTVBMRVRFX1NDQl9IRUFELCBTQ0JfTElTVF9OVUxMKTsKKwlhaGRfb3V0dyhhaGQsIENPTVBMRVRFX1NDQl9ETUFJTlBST0dfSEVBRCwgU0NCX0xJU1RfTlVMTCk7CisJYWhkX291dHcoYWhkLCBDT01QTEVURV9ETUFfU0NCX0hFQUQsIFNDQl9MSVNUX05VTEwpOworCisJLyoKKwkgKiBUaGUgRnJlZXplIENvdW50IGlzIDAuCisJICovCisJYWhkX291dHcoYWhkLCBRRlJFRVpFX0NPVU5ULCAwKTsKKworCS8qCisJICogVGVsbCB0aGUgc2VxdWVuY2VyIHdoZXJlIGl0IGNhbiBmaW5kIG91ciBhcnJheXMgaW4gbWVtb3J5LgorCSAqLworCWJ1c2FkZHIgPSBhaGQtPnNoYXJlZF9kYXRhX2J1c2FkZHI7CisJYWhkX291dGIoYWhkLCBTSEFSRURfREFUQV9BRERSLCBidXNhZGRyICYgMHhGRik7CisJYWhkX291dGIoYWhkLCBTSEFSRURfREFUQV9BRERSICsgMSwgKGJ1c2FkZHIgPj4gOCkgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIFNIQVJFRF9EQVRBX0FERFIgKyAyLCAoYnVzYWRkciA+PiAxNikgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIFNIQVJFRF9EQVRBX0FERFIgKyAzLCAoYnVzYWRkciA+PiAyNCkgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIFFPVVRGSUZPX05FWFRfQUREUiwgYnVzYWRkciAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgUU9VVEZJRk9fTkVYVF9BRERSICsgMSwgKGJ1c2FkZHIgPj4gOCkgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIFFPVVRGSUZPX05FWFRfQUREUiArIDIsIChidXNhZGRyID4+IDE2KSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgUU9VVEZJRk9fTkVYVF9BRERSICsgMywgKGJ1c2FkZHIgPj4gMjQpICYgMHhGRik7CisKKwkvKgorCSAqIFNldHVwIHRoZSBhbGxvd2VkIFNDU0kgU2VxdWVuY2VzIGJhc2VkIG9uIG9wZXJhdGlvbmFsIG1vZGUuCisJICogSWYgd2UgYXJlIGEgdGFyZ2V0LCB3ZSdsbCBlbmFibGUgc2VsZWN0IGluIG9wZXJhdGlvbnMgb25jZQorCSAqIHdlJ3ZlIGhhZCBhIGx1biBlbmFibGVkLgorCSAqLworCXNjc2lzZXFfdGVtcGxhdGUgPSBFTkFVVE9BVE5QOworCWlmICgoYWhkLT5mbGFncyAmIEFIRF9JTklUSUFUT1JST0xFKSAhPSAwKQorCQlzY3Npc2VxX3RlbXBsYXRlIHw9IEVOUlNFTEk7CisJYWhkX291dGIoYWhkLCBTQ1NJU0VRX1RFTVBMQVRFLCBzY3Npc2VxX3RlbXBsYXRlKTsKKworCS8qIFRoZXJlIGFyZSBubyBidXN5IFNDQnMgeWV0LiAqLworCWZvciAodGFyZ2V0ID0gMDsgdGFyZ2V0IDwgQUhEX05VTV9UQVJHRVRTOyB0YXJnZXQrKykgeworCQlpbnQgbHVuOworCisJCWZvciAobHVuID0gMDsgbHVuIDwgQUhEX05VTV9MVU5TX05PTlBLVDsgbHVuKyspCisJCQlhaGRfdW5idXN5X3RjbChhaGQsIEJVSUxEX1RDTF9SQVcodGFyZ2V0LCAnQScsIGx1bikpOworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgZ3JvdXAgY29kZSB0byBjb21tYW5kIGxlbmd0aCB0YWJsZS4KKwkgKiBWZW5kb3IgVW5pcXVlIGNvZGVzIGFyZSBzZXQgdG8gMCBzbyB3ZSBvbmx5IGNhcHR1cmUKKwkgKiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgY2RiLiAgVGhlc2UgY2FuIGJlIG92ZXJyaWRkZW4KKwkgKiB3aGVuIHRhcmdldCBtb2RlIGlzIGVuYWJsZWQuCisJICovCisJYWhkX291dGIoYWhkLCBDTURTSVpFX1RBQkxFLCA1KTsKKwlhaGRfb3V0YihhaGQsIENNRFNJWkVfVEFCTEUgKyAxLCA5KTsKKwlhaGRfb3V0YihhaGQsIENNRFNJWkVfVEFCTEUgKyAyLCA5KTsKKwlhaGRfb3V0YihhaGQsIENNRFNJWkVfVEFCTEUgKyAzLCAwKTsKKwlhaGRfb3V0YihhaGQsIENNRFNJWkVfVEFCTEUgKyA0LCAxNSk7CisJYWhkX291dGIoYWhkLCBDTURTSVpFX1RBQkxFICsgNSwgMTEpOworCWFoZF9vdXRiKGFoZCwgQ01EU0laRV9UQUJMRSArIDYsIDApOworCWFoZF9vdXRiKGFoZCwgQ01EU0laRV9UQUJMRSArIDcsIDApOworCQkKKwkvKiBUZWxsIHRoZSBzZXF1ZW5jZXIgb2Ygb3VyIGluaXRpYWwgcXVldWUgcG9zaXRpb25zICovCisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0NDSEFOLCBBSERfTU9ERV9DQ0hBTik7CisJYWhkX291dGIoYWhkLCBRT0ZGX0NUTFNUQSwgU0NCX1FTSVpFXzUxMik7CisJYWhkLT5xaW5maWZvbmV4dCA9IDA7CisJYWhkX3NldF9obnNjYl9xb2ZmKGFoZCwgYWhkLT5xaW5maWZvbmV4dCk7CisJYWhkX3NldF9oZXNjYl9xb2ZmKGFoZCwgMCk7CisJYWhkX3NldF9zbnNjYl9xb2ZmKGFoZCwgMCk7CisJYWhkX3NldF9zZXNjYl9xb2ZmKGFoZCwgMCk7CisJYWhkX3NldF9zZHNjYl9xb2ZmKGFoZCwgMCk7CisKKwkvKgorCSAqIFRlbGwgdGhlIHNlcXVlbmNlciB3aGljaCBTQ0Igd2lsbCBiZSB0aGUgbmV4dCBvbmUgaXQgcmVjZWl2ZXMuCisJICovCisJYnVzYWRkciA9IGFoZF9sZTMydG9oKGFoZC0+bmV4dF9xdWV1ZWRfaHNjYi0+aHNjYl9idXNhZGRyKTsKKwlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMCwgYnVzYWRkciAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAxLCAoYnVzYWRkciA+PiA4KSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAyLCAoYnVzYWRkciA+PiAxNikgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMywgKGJ1c2FkZHIgPj4gMjQpICYgMHhGRik7CisKKwkvKgorCSAqIERlZmF1bHQgdG8gY29hbGVzY2luZyBkaXNhYmxlZC4KKwkgKi8KKwlhaGRfb3V0dyhhaGQsIElOVF9DT0FMRVNDSU5HX0NNRENPVU5ULCAwKTsKKwlhaGRfb3V0dyhhaGQsIENNRFNfUEVORElORywgMCk7CisJYWhkX3VwZGF0ZV9jb2FsZXNjaW5nX3ZhbHVlcyhhaGQsIGFoZC0+aW50X2NvYWxlc2NpbmdfdGltZXIsCisJCQkJICAgICBhaGQtPmludF9jb2FsZXNjaW5nX21heGNtZHMsCisJCQkJICAgICBhaGQtPmludF9jb2FsZXNjaW5nX21pbmNtZHMpOworCWFoZF9lbmFibGVfY29hbGVzY2luZyhhaGQsIEZBTFNFKTsKKworCWFoZF9sb2Fkc2VxKGFoZCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworfQorCisvKgorICogU2V0dXAgZGVmYXVsdCBkZXZpY2UgYW5kIGNvbnRyb2xsZXIgc2V0dGluZ3MuCisgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBvdXIgcHJvYmUgaGFzCisgKiBkZXRlcm1pbmVkIHRoYXQgbm8gY29uZmlndXJhdGlvbiBkYXRhIGlzIGF2YWlsYWJsZS4KKyAqLworaW50CithaGRfZGVmYXVsdF9jb25maWcoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCWludAl0YXJnOworCisJYWhkLT5vdXJfaWQgPSA3OworCisJLyoKKwkgKiBBbGxvY2F0ZSBhIHRzdGF0ZSB0byBob3VzZSBpbmZvcm1hdGlvbiBmb3Igb3VyCisJICogaW5pdGlhdG9yIHByZXNlbmNlIG9uIHRoZSBidXMgYXMgd2VsbCBhcyB0aGUgdXNlcgorCSAqIGRhdGEgZm9yIGFueSB0YXJnZXQgbW9kZSBpbml0aWF0b3IuCisJICovCisJaWYgKGFoZF9hbGxvY190c3RhdGUoYWhkLCBhaGQtPm91cl9pZCwgJ0EnKSA9PSBOVUxMKSB7CisJCXByaW50ZigiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBhaGRfdG1vZGVfdHN0YXRlLiAgIgorCQkgICAgICAgIkZhaWxpbmcgYXR0YWNoXG4iLCBhaGRfbmFtZShhaGQpKTsKKwkJcmV0dXJuIChFTk9NRU0pOworCX0KKworCWZvciAodGFyZyA9IDA7IHRhcmcgPCBBSERfTlVNX1RBUkdFVFM7IHRhcmcrKykgeworCQlzdHJ1Y3QJIGFoZF9kZXZpbmZvIGRldmluZm87CisJCXN0cnVjdAkgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJCXN0cnVjdAkgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCQl1aW50MTZfdCB0YXJnZXRfbWFzazsKKworCQl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCAnQScsIGFoZC0+b3VyX2lkLAorCQkJCQkgICAgdGFyZywgJnRzdGF0ZSk7CisJCS8qCisJCSAqIFdlIHN1cHBvcnQgU1BDMiBhbmQgU1BJNC4KKwkJICovCisJCXRpbmZvLT51c2VyLnByb3RvY29sX3ZlcnNpb24gPSA0OworCQl0aW5mby0+dXNlci50cmFuc3BvcnRfdmVyc2lvbiA9IDQ7CisKKwkJdGFyZ2V0X21hc2sgPSAweDAxIDw8IHRhcmc7CisJCWFoZC0+dXNlcl9kaXNjZW5hYmxlIHw9IHRhcmdldF9tYXNrOworCQl0c3RhdGUtPmRpc2NlbmFibGUgfD0gdGFyZ2V0X21hc2s7CisJCWFoZC0+dXNlcl90YWdlbmFibGUgfD0gdGFyZ2V0X21hc2s7CisjaWZkZWYgQUhEX0ZPUkNFXzE2MAorCQl0aW5mby0+dXNlci5wZXJpb2QgPSBBSERfU1lOQ1JBVEVfRFQ7CisjZWxzZQorCQl0aW5mby0+dXNlci5wZXJpb2QgPSBBSERfU1lOQ1JBVEVfMTYwOworI2VuZGlmCisJCXRpbmZvLT51c2VyLm9mZnNldCA9IE1BWF9PRkZTRVQ7CisJCXRpbmZvLT51c2VyLnBwcl9vcHRpb25zID0gTVNHX0VYVF9QUFJfUkRfU1RSTQorCQkJCQl8IE1TR19FWFRfUFBSX1dSX0ZMT1cKKwkJCQkJfCBNU0dfRVhUX1BQUl9IT0xEX01DUworCQkJCQl8IE1TR19FWFRfUFBSX0lVX1JFUQorCQkJCQl8IE1TR19FWFRfUFBSX1FBU19SRVEKKwkJCQkJfCBNU0dfRVhUX1BQUl9EVF9SRVE7CisJCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9SVEkpICE9IDApCisJCQl0aW5mby0+dXNlci5wcHJfb3B0aW9ucyB8PSBNU0dfRVhUX1BQUl9SVEk7CisKKwkJdGluZm8tPnVzZXIud2lkdGggPSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVDsKKworCQkvKgorCQkgKiBTdGFydCBvdXQgQXN5bmMvTmFycm93L1VudGFnZ2VkIGFuZCB3aXRoCisJCSAqIGNvbnNlcnZhdGl2ZSBwcm90b2NvbCBzdXBwb3J0LgorCQkgKi8KKwkJdGluZm8tPmdvYWwucHJvdG9jb2xfdmVyc2lvbiA9IDI7CisJCXRpbmZvLT5nb2FsLnRyYW5zcG9ydF92ZXJzaW9uID0gMjsKKwkJdGluZm8tPmN1cnIucHJvdG9jb2xfdmVyc2lvbiA9IDI7CisJCXRpbmZvLT5jdXJyLnRyYW5zcG9ydF92ZXJzaW9uID0gMjsKKwkJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywgYWhkLT5vdXJfaWQsCisJCQkJICAgIHRhcmcsIENBTV9MVU5fV0lMRENBUkQsCisJCQkJICAgICdBJywgUk9MRV9JTklUSUFUT1IpOworCQl0c3RhdGUtPnRhZ2VuYWJsZSAmPSB+dGFyZ2V0X21hc2s7CisJCWFoZF9zZXRfd2lkdGgoYWhkLCAmZGV2aW5mbywgTVNHX0VYVF9XRFRSX0JVU184X0JJVCwKKwkJCSAgICAgIEFIRF9UUkFOU19DVVJ8QUhEX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9UUlVFKTsKKwkJYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLCAvKnBlcmlvZCovMCwgLypvZmZzZXQqLzAsCisJCQkJIC8qcHByX29wdGlvbnMqLzAsIEFIRF9UUkFOU19DVVJ8QUhEX1RSQU5TX0dPQUwsCisJCQkJIC8qcGF1c2VkKi9UUlVFKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFBhcnNlIGRldmljZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICovCitpbnQKK2FoZF9wYXJzZV9jZmdkYXRhKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNlZXByb21fY29uZmlnICpzYykKK3sKKwlpbnQgdGFyZzsKKwlpbnQgbWF4X3Rhcmc7CisKKwltYXhfdGFyZyA9IHNjLT5tYXhfdGFyZ2V0cyAmIENGTUFYVEFSRzsKKwlhaGQtPm91cl9pZCA9IHNjLT5icnRpbWVfaWQgJiBDRlNDU0lJRDsKKworCS8qCisJICogQWxsb2NhdGUgYSB0c3RhdGUgdG8gaG91c2UgaW5mb3JtYXRpb24gZm9yIG91cgorCSAqIGluaXRpYXRvciBwcmVzZW5jZSBvbiB0aGUgYnVzIGFzIHdlbGwgYXMgdGhlIHVzZXIKKwkgKiBkYXRhIGZvciBhbnkgdGFyZ2V0IG1vZGUgaW5pdGlhdG9yLgorCSAqLworCWlmIChhaGRfYWxsb2NfdHN0YXRlKGFoZCwgYWhkLT5vdXJfaWQsICdBJykgPT0gTlVMTCkgeworCQlwcmludGYoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgYWhkX3Rtb2RlX3RzdGF0ZS4gICIKKwkJICAgICAgICJGYWlsaW5nIGF0dGFjaFxuIiwgYWhkX25hbWUoYWhkKSk7CisJCXJldHVybiAoRU5PTUVNKTsKKwl9CisKKwlmb3IgKHRhcmcgPSAwOyB0YXJnIDwgbWF4X3Rhcmc7IHRhcmcrKykgeworCQlzdHJ1Y3QJIGFoZF9kZXZpbmZvIGRldmluZm87CisJCXN0cnVjdAkgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJCXN0cnVjdAkgYWhkX3RyYW5zaW5mbyAqdXNlcl90aW5mbzsKKwkJc3RydWN0CSBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJCXVpbnQxNl90IHRhcmdldF9tYXNrOworCisJCXRpbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsICdBJywgYWhkLT5vdXJfaWQsCisJCQkJCSAgICB0YXJnLCAmdHN0YXRlKTsKKwkJdXNlcl90aW5mbyA9ICZ0aW5mby0+dXNlcjsKKworCQkvKgorCQkgKiBXZSBzdXBwb3J0IFNQQzIgYW5kIFNQSTQuCisJCSAqLworCQl0aW5mby0+dXNlci5wcm90b2NvbF92ZXJzaW9uID0gNDsKKwkJdGluZm8tPnVzZXIudHJhbnNwb3J0X3ZlcnNpb24gPSA0OworCisJCXRhcmdldF9tYXNrID0gMHgwMSA8PCB0YXJnOworCQlhaGQtPnVzZXJfZGlzY2VuYWJsZSAmPSB+dGFyZ2V0X21hc2s7CisJCXRzdGF0ZS0+ZGlzY2VuYWJsZSAmPSB+dGFyZ2V0X21hc2s7CisJCWFoZC0+dXNlcl90YWdlbmFibGUgJj0gfnRhcmdldF9tYXNrOworCQlpZiAoc2MtPmRldmljZV9mbGFnc1t0YXJnXSAmIENGRElTQykgeworCQkJdHN0YXRlLT5kaXNjZW5hYmxlIHw9IHRhcmdldF9tYXNrOworCQkJYWhkLT51c2VyX2Rpc2NlbmFibGUgfD0gdGFyZ2V0X21hc2s7CisJCQlhaGQtPnVzZXJfdGFnZW5hYmxlIHw9IHRhcmdldF9tYXNrOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIENhbm5vdCBiZSBwYWNrZXRpemVkIHdpdGhvdXQgZGlzY29ubmVjdGlvbi4KKwkJCSAqLworCQkJc2MtPmRldmljZV9mbGFnc1t0YXJnXSAmPSB+Q0ZQQUNLRVRJWkVEOworCQl9CisKKwkJdXNlcl90aW5mby0+cHByX29wdGlvbnMgPSAwOworCQl1c2VyX3RpbmZvLT5wZXJpb2QgPSAoc2MtPmRldmljZV9mbGFnc1t0YXJnXSAmIENGWEZFUik7CisJCWlmICh1c2VyX3RpbmZvLT5wZXJpb2QgPCBDRlhGRVJfQVNZTkMpIHsKKwkJCWlmICh1c2VyX3RpbmZvLT5wZXJpb2QgPD0gQUhEX1BFUklPRF8xME1IeikKKwkJCQl1c2VyX3RpbmZvLT5wcHJfb3B0aW9ucyB8PSBNU0dfRVhUX1BQUl9EVF9SRVE7CisJCQl1c2VyX3RpbmZvLT5vZmZzZXQgPSBNQVhfT0ZGU0VUOworCQl9IGVsc2UgIHsKKwkJCXVzZXJfdGluZm8tPm9mZnNldCA9IDA7CisJCQl1c2VyX3RpbmZvLT5wZXJpb2QgPSBBSERfQVNZTkNfWEZFUl9QRVJJT0Q7CisJCX0KKyNpZmRlZiBBSERfRk9SQ0VfMTYwCisJCWlmICh1c2VyX3RpbmZvLT5wZXJpb2QgPD0gQUhEX1NZTkNSQVRFXzE2MCkKKwkJCXVzZXJfdGluZm8tPnBlcmlvZCA9IEFIRF9TWU5DUkFURV9EVDsKKyNlbmRpZgorCisJCWlmICgoc2MtPmRldmljZV9mbGFnc1t0YXJnXSAmIENGUEFDS0VUSVpFRCkgIT0gMCkgeworCQkJdXNlcl90aW5mby0+cHByX29wdGlvbnMgfD0gTVNHX0VYVF9QUFJfUkRfU1RSTQorCQkJCQkJfCAgTVNHX0VYVF9QUFJfV1JfRkxPVworCQkJCQkJfCAgTVNHX0VYVF9QUFJfSE9MRF9NQ1MKKwkJCQkJCXwgIE1TR19FWFRfUFBSX0lVX1JFUTsKKwkJCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9SVEkpICE9IDApCisJCQkJdXNlcl90aW5mby0+cHByX29wdGlvbnMgfD0gTVNHX0VYVF9QUFJfUlRJOworCQl9CisKKwkJaWYgKChzYy0+ZGV2aWNlX2ZsYWdzW3RhcmddICYgQ0ZRQVMpICE9IDApCisJCQl1c2VyX3RpbmZvLT5wcHJfb3B0aW9ucyB8PSBNU0dfRVhUX1BQUl9RQVNfUkVROworCisJCWlmICgoc2MtPmRldmljZV9mbGFnc1t0YXJnXSAmIENGV0lERUIpICE9IDApCisJCQl1c2VyX3RpbmZvLT53aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfMTZfQklUOworCQllbHNlCisJCQl1c2VyX3RpbmZvLT53aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQ7CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUlTQykgIT0gMCkKKwkJCXByaW50ZigiKCVkKTogJXg6JXg6JXg6JXhcbiIsIHRhcmcsIHVzZXJfdGluZm8tPndpZHRoLAorCQkJICAgICAgIHVzZXJfdGluZm8tPnBlcmlvZCwgdXNlcl90aW5mby0+b2Zmc2V0LAorCQkJICAgICAgIHVzZXJfdGluZm8tPnBwcl9vcHRpb25zKTsKKyNlbmRpZgorCQkvKgorCQkgKiBTdGFydCBvdXQgQXN5bmMvTmFycm93L1VudGFnZ2VkIGFuZCB3aXRoCisJCSAqIGNvbnNlcnZhdGl2ZSBwcm90b2NvbCBzdXBwb3J0LgorCQkgKi8KKwkJdHN0YXRlLT50YWdlbmFibGUgJj0gfnRhcmdldF9tYXNrOworCQl0aW5mby0+Z29hbC5wcm90b2NvbF92ZXJzaW9uID0gMjsKKwkJdGluZm8tPmdvYWwudHJhbnNwb3J0X3ZlcnNpb24gPSAyOworCQl0aW5mby0+Y3Vyci5wcm90b2NvbF92ZXJzaW9uID0gMjsKKwkJdGluZm8tPmN1cnIudHJhbnNwb3J0X3ZlcnNpb24gPSAyOworCQlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBhaGQtPm91cl9pZCwKKwkJCQkgICAgdGFyZywgQ0FNX0xVTl9XSUxEQ0FSRCwKKwkJCQkgICAgJ0EnLCBST0xFX0lOSVRJQVRPUik7CisJCWFoZF9zZXRfd2lkdGgoYWhkLCAmZGV2aW5mbywgTVNHX0VYVF9XRFRSX0JVU184X0JJVCwKKwkJCSAgICAgIEFIRF9UUkFOU19DVVJ8QUhEX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9UUlVFKTsKKwkJYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLCAvKnBlcmlvZCovMCwgLypvZmZzZXQqLzAsCisJCQkJIC8qcHByX29wdGlvbnMqLzAsIEFIRF9UUkFOU19DVVJ8QUhEX1RSQU5TX0dPQUwsCisJCQkJIC8qcGF1c2VkKi9UUlVFKTsKKwl9CisKKwlhaGQtPmZsYWdzICY9IH5BSERfU1BDSEtfRU5CX0E7CisJaWYgKHNjLT5iaW9zX2NvbnRyb2wgJiBDRlNQQVJJVFkpCisJCWFoZC0+ZmxhZ3MgfD0gQUhEX1NQQ0hLX0VOQl9BOworCisJYWhkLT5mbGFncyAmPSB+QUhEX1JFU0VUX0JVU19BOworCWlmIChzYy0+Ymlvc19jb250cm9sICYgQ0ZSRVNFVEIpCisJCWFoZC0+ZmxhZ3MgfD0gQUhEX1JFU0VUX0JVU19BOworCisJYWhkLT5mbGFncyAmPSB+QUhEX0VYVEVOREVEX1RSQU5TX0E7CisJaWYgKHNjLT5iaW9zX2NvbnRyb2wgJiBDRkVYVEVORCkKKwkJYWhkLT5mbGFncyB8PSBBSERfRVhURU5ERURfVFJBTlNfQTsKKworCWFoZC0+ZmxhZ3MgJj0gfkFIRF9CSU9TX0VOQUJMRUQ7CisJaWYgKChzYy0+Ymlvc19jb250cm9sICYgQ0ZCSU9TU1RBVEUpID09IENGQlNfRU5BQkxFRCkKKwkJYWhkLT5mbGFncyB8PSBBSERfQklPU19FTkFCTEVEOworCisJYWhkLT5mbGFncyAmPSB+QUhEX1NUUFdMRVZFTF9BOworCWlmICgoc2MtPmFkYXB0ZXJfY29udHJvbCAmIENGU1RQV0xFVkVMKSAhPSAwKQorCQlhaGQtPmZsYWdzIHw9IEFIRF9TVFBXTEVWRUxfQTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBQYXJzZSBkZXZpY2UgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAqLworaW50CithaGRfcGFyc2VfdnBkZGF0YShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCB2cGRfY29uZmlnICp2cGQpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBhaGRfdmVyaWZ5X3ZwZF9ja3N1bSh2cGQpOworCWlmIChlcnJvciA9PSAwKQorCQlyZXR1cm4gKEVJTlZBTCk7CisJaWYgKCh2cGQtPmJpb3NfZmxhZ3MgJiBWUERCT09USE9TVCkgIT0gMCkKKwkJYWhkLT5mbGFncyB8PSBBSERfQk9PVF9DSEFOTkVMOworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK2FoZF9pbnRyX2VuYWJsZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCBlbmFibGUpCit7CisJdV9pbnQgaGNudHJsOworCisJaGNudHJsID0gYWhkX2luYihhaGQsIEhDTlRSTCk7CisJaGNudHJsICY9IH5JTlRFTjsKKwlhaGQtPnBhdXNlICY9IH5JTlRFTjsKKwlhaGQtPnVucGF1c2UgJj0gfklOVEVOOworCWlmIChlbmFibGUpIHsKKwkJaGNudHJsIHw9IElOVEVOOworCQlhaGQtPnBhdXNlIHw9IElOVEVOOworCQlhaGQtPnVucGF1c2UgfD0gSU5URU47CisJfQorCWFoZF9vdXRiKGFoZCwgSENOVFJMLCBoY250cmwpOworfQorCit2b2lkCithaGRfdXBkYXRlX2NvYWxlc2NpbmdfdmFsdWVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdGltZXIsIHVfaW50IG1heGNtZHMsCisJCQkgICAgIHVfaW50IG1pbmNtZHMpCit7CisJaWYgKHRpbWVyID4gQUhEX1RJTUVSX01BWF9VUykKKwkJdGltZXIgPSBBSERfVElNRVJfTUFYX1VTOworCWFoZC0+aW50X2NvYWxlc2NpbmdfdGltZXIgPSB0aW1lcjsKKworCWlmIChtYXhjbWRzID4gQUhEX0lOVF9DT0FMRVNDSU5HX01BWENNRFNfTUFYKQorCQltYXhjbWRzID0gQUhEX0lOVF9DT0FMRVNDSU5HX01BWENNRFNfTUFYOworCWlmIChtaW5jbWRzID4gQUhEX0lOVF9DT0FMRVNDSU5HX01JTkNNRFNfTUFYKQorCQltaW5jbWRzID0gQUhEX0lOVF9DT0FMRVNDSU5HX01JTkNNRFNfTUFYOworCWFoZC0+aW50X2NvYWxlc2NpbmdfbWF4Y21kcyA9IG1heGNtZHM7CisJYWhkX291dHcoYWhkLCBJTlRfQ09BTEVTQ0lOR19USU1FUiwgdGltZXIgLyBBSERfVElNRVJfVVNfUEVSX1RJQ0spOworCWFoZF9vdXRiKGFoZCwgSU5UX0NPQUxFU0NJTkdfTUFYQ01EUywgLW1heGNtZHMpOworCWFoZF9vdXRiKGFoZCwgSU5UX0NPQUxFU0NJTkdfTUlOQ01EUywgLW1pbmNtZHMpOworfQorCit2b2lkCithaGRfZW5hYmxlX2NvYWxlc2Npbmcoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgZW5hYmxlKQoreworCisJYWhkLT5oc19tYWlsYm94ICY9IH5FTklOVF9DT0FMRVNDRTsKKwlpZiAoZW5hYmxlKQorCQlhaGQtPmhzX21haWxib3ggfD0gRU5JTlRfQ09BTEVTQ0U7CisJYWhkX291dGIoYWhkLCBIU19NQUlMQk9YLCBhaGQtPmhzX21haWxib3gpOworCWFoZF9mbHVzaF9kZXZpY2Vfd3JpdGVzKGFoZCk7CisJYWhkX3J1bl9xb3V0ZmlmbyhhaGQpOworfQorCisvKgorICogRW5zdXJlIHRoYXQgdGhlIGNhcmQgaXMgcGF1c2VkIGluIGEgbG9jYXRpb24KKyAqIG91dHNpZGUgb2YgYWxsIGNyaXRpY2FsIHNlY3Rpb25zIGFuZCB0aGF0IGFsbAorICogcGVuZGluZyB3b3JrIGlzIGNvbXBsZXRlZCBwcmlvciB0byByZXR1cm5pbmcuCisgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gb3V0c2lkZQorICogYW4gaW50ZXJydXB0IGNvbnRleHQuCisgKi8KK3ZvaWQKK2FoZF9wYXVzZV9hbmRfZmx1c2h3b3JrKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl1X2ludCBpbnRzdGF0OworCXVfaW50IG1heGxvb3BzOworCXVfaW50IHFmcmVlemVfY250OworCisJbWF4bG9vcHMgPSAxMDAwOworCWFoZC0+ZmxhZ3MgfD0gQUhEX0FMTF9JTlRFUlJVUFRTOworCWFoZF9wYXVzZShhaGQpOworCS8qCisJICogSW5jcmVtZW50IHRoZSBRRnJlZXplIENvdW50IHNvIHRoYXQgdGhlIHNlcXVlbmNlcgorCSAqIHdpbGwgbm90IHN0YXJ0IG5ldyBzZWxlY3Rpb25zLiAgV2UgZG8gdGhpcyBvbmx5CisJICogdW50aWwgd2UgYXJlIHNhZmVseSBwYXVzZWQgd2l0aG91dCBmdXJ0aGVyIHNlbGVjdGlvbnMKKwkgKiBwZW5kaW5nLgorCSAqLworCWFoZF9vdXR3KGFoZCwgUUZSRUVaRV9DT1VOVCwgYWhkX2ludyhhaGQsIFFGUkVFWkVfQ09VTlQpICsgMSk7CisJYWhkX291dGIoYWhkLCBTRVFfRkxBR1MyLCBhaGRfaW5iKGFoZCwgU0VRX0ZMQUdTMikgfCBTRUxFQ1RPVVRfUUZST1pFTik7CisJZG8geworCQlzdHJ1Y3Qgc2NiICp3YWl0aW5nX3NjYjsKKworCQlhaGRfdW5wYXVzZShhaGQpOworCQlhaGRfaW50cihhaGQpOworCQlhaGRfcGF1c2UoYWhkKTsKKwkJYWhkX2NsZWFyX2NyaXRpY2FsX3NlY3Rpb24oYWhkKTsKKwkJaW50c3RhdCA9IGFoZF9pbmIoYWhkLCBJTlRTVEFUKTsKKwkJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCQlpZiAoKGFoZF9pbmIoYWhkLCBTU1RBVDApICYgKFNFTERPfFNFTElOR08pKSA9PSAwKQorCQkJYWhkX291dGIoYWhkLCBTQ1NJU0VRMCwKKwkJCQkgYWhkX2luYihhaGQsIFNDU0lTRVEwKSAmIH5FTlNFTE8pOworCQkvKgorCQkgKiBJbiB0aGUgbm9uLXBhY2tldGl6ZWQgY2FzZSwgdGhlIHNlcXVlbmNlciAoZm9yIFJldiBBKSwKKwkJICogcmVsaWVzIG9uIEVOU0VMTyByZW1haW5pbmcgc2V0IGFmdGVyIFNFTERPLiAgVGhlIGhhcmR3YXJlCisJCSAqIGF1dG8tY2xlYXJzIEVOU0VMTyBpbiB0aGUgcGFja2V0aXplZCBjYXNlLgorCQkgKi8KKwkJd2FpdGluZ19zY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsCisJCQkJCSAgICAgYWhkX2ludyhhaGQsIFdBSVRJTkdfVElEX0hFQUQpKTsKKwkJaWYgKHdhaXRpbmdfc2NiICE9IE5VTEwKKwkJICYmICh3YWl0aW5nX3NjYi0+ZmxhZ3MgJiBTQ0JfUEFDS0VUSVpFRCkgPT0gMAorCQkgJiYgKGFoZF9pbmIoYWhkLCBTU1RBVDApICYgKFNFTERPfFNFTElOR08pKSAhPSAwKQorCQkJYWhkX291dGIoYWhkLCBTQ1NJU0VRMCwKKwkJCQkgYWhkX2luYihhaGQsIFNDU0lTRVEwKSB8IEVOU0VMTyk7CisJfSB3aGlsZSAoLS1tYXhsb29wcworCSAgICAgICYmIChpbnRzdGF0ICE9IDB4RkYgfHwgKGFoZC0+ZmVhdHVyZXMgJiBBSERfUkVNT1ZBQkxFKSA9PSAwKQorCSAgICAgICYmICgoaW50c3RhdCAmIElOVF9QRU5EKSAhPSAwCisJICAgICAgIHx8IChhaGRfaW5iKGFoZCwgU0NTSVNFUTApICYgRU5TRUxPKSAhPSAwCisJICAgICAgIHx8IChhaGRfaW5iKGFoZCwgU1NUQVQwKSAmIChTRUxET3xTRUxJTkdPKSkgIT0gMCkpOworCisJaWYgKG1heGxvb3BzID09IDApIHsKKwkJcHJpbnRmKCJJbmZpbml0ZSBpbnRlcnJ1cHQgbG9vcCwgSU5UU1RBVCA9ICV4IiwKKwkJICAgICAgYWhkX2luYihhaGQsIElOVFNUQVQpKTsKKwl9CisJcWZyZWV6ZV9jbnQgPSBhaGRfaW53KGFoZCwgUUZSRUVaRV9DT1VOVCk7CisJaWYgKHFmcmVlemVfY250ID09IDApIHsKKwkJcHJpbnRmKCIlczogYWhkX3BhdXNlX2FuZF9mbHVzaHdvcmsgd2l0aCAwIHFmcmVlemUgY291bnQhXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CisJfSBlbHNlIHsKKwkJcWZyZWV6ZV9jbnQtLTsKKwl9CisJYWhkX291dHcoYWhkLCBRRlJFRVpFX0NPVU5ULCBxZnJlZXplX2NudCk7CisJaWYgKHFmcmVlemVfY250ID09IDApCisJCWFoZF9vdXRiKGFoZCwgU0VRX0ZMQUdTMiwKKwkJCSBhaGRfaW5iKGFoZCwgU0VRX0ZMQUdTMikgJiB+U0VMRUNUT1VUX1FGUk9aRU4pOworCisJYWhkX2ZsdXNoX3FvdXRmaWZvKGFoZCk7CisKKwlhaGRfcGxhdGZvcm1fZmx1c2h3b3JrKGFoZCk7CisJYWhkLT5mbGFncyAmPSB+QUhEX0FMTF9JTlRFUlJVUFRTOworfQorCitpbnQKK2FoZF9zdXNwZW5kKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKworCWFoZF9wYXVzZV9hbmRfZmx1c2h3b3JrKGFoZCk7CisKKwlpZiAoTElTVF9GSVJTVCgmYWhkLT5wZW5kaW5nX3NjYnMpICE9IE5VTEwpIHsKKwkJYWhkX3VucGF1c2UoYWhkKTsKKwkJcmV0dXJuIChFQlVTWSk7CisJfQorCWFoZF9zaHV0ZG93bihhaGQpOworCXJldHVybiAoMCk7Cit9CisKK2ludAorYWhkX3Jlc3VtZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisKKwlhaGRfcmVzZXQoYWhkLCAvKnJlaW5pdCovVFJVRSk7CisJYWhkX2ludHJfZW5hYmxlKGFoZCwgVFJVRSk7IAorCWFoZF9yZXN0YXJ0KGFoZCk7CisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEJ1c3kgVGFyZ2V0IFRhYmxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBTZXQgU0NCUFRSIHRvIHRoZSBTQ0IgdGhhdCBjb250YWlucyB0aGUgYnVzeQorICogdGFibGUgZW50cnkgZm9yIFRDTC4gIFJldHVybiB0aGUgb2Zmc2V0IGludG8KKyAqIHRoZSBTQ0IgdGhhdCBjb250YWlucyB0aGUgZW50cnkgZm9yIFRDTC4KKyAqIHNhdmVkX3NjYmlkIGlzIGRlcmVmZXJlbmNlZCBhbmQgc2V0IHRvIHRoZQorICogc2NiaWQgdGhhdCBzaG91bGQgYmUgcmVzdG9yZWQgb25jZSBtYW5pcHVhbHRpb24KKyAqIG9mIHRoZSBUQ0wgZW50cnkgaXMgY29tcGxldGUuCisgKi8KK3N0YXRpYyBfX2lubGluZSB1X2ludAorYWhkX2luZGV4X2J1c3lfdGNsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgKnNhdmVkX3NjYmlkLCB1X2ludCB0Y2wpCit7CisJLyoKKwkgKiBJbmRleCB0byB0aGUgU0NCIHRoYXQgY29udGFpbnMgdGhlIGJ1c3kgZW50cnkuCisJICovCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CisJKnNhdmVkX3NjYmlkID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwlhaGRfc2V0X3NjYnB0cihhaGQsIFRDTF9MVU4odGNsKQorCQkgICAgIHwgKChUQ0xfVEFSR0VUX09GRlNFVCh0Y2wpICYgMHhDKSA8PCA0KSk7CisKKwkvKgorCSAqIEFuZCBub3cgY2FsY3VsYXRlIHRoZSBTQ0Igb2Zmc2V0IHRvIHRoZSBlbnRyeS4KKwkgKiBFYWNoIGVudHJ5IGlzIDIgYnl0ZXMgd2lkZSwgaGVuY2UgdGhlCisJICogbXVsdGlwbGljYXRpb24gYnkgMi4KKwkgKi8KKwlyZXR1cm4gKCgoVENMX1RBUkdFVF9PRkZTRVQodGNsKSAmIDB4MykgPDwgMSkgKyBTQ0JfRElTQ09OTkVDVEVEX0xJU1RTKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgdW50YWdnZWQgdHJhbnNhY3Rpb24gaWQgZm9yIGEgZ2l2ZW4gdGFyZ2V0L2NoYW5uZWwgbHVuLgorICovCit1X2ludAorYWhkX2ZpbmRfYnVzeV90Y2woc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0Y2wpCit7CisJdV9pbnQgc2NiaWQ7CisJdV9pbnQgc2NiX29mZnNldDsKKwl1X2ludCBzYXZlZF9zY2JwdHI7CisJCQorCXNjYl9vZmZzZXQgPSBhaGRfaW5kZXhfYnVzeV90Y2woYWhkLCAmc2F2ZWRfc2NicHRyLCB0Y2wpOworCXNjYmlkID0gYWhkX2lud19zY2JyYW0oYWhkLCBzY2Jfb2Zmc2V0KTsKKwlhaGRfc2V0X3NjYnB0cihhaGQsIHNhdmVkX3NjYnB0cik7CisJcmV0dXJuIChzY2JpZCk7Cit9CisKK3ZvaWQKK2FoZF9idXN5X3RjbChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHRjbCwgdV9pbnQgc2NiaWQpCit7CisJdV9pbnQgc2NiX29mZnNldDsKKwl1X2ludCBzYXZlZF9zY2JwdHI7CisJCQorCXNjYl9vZmZzZXQgPSBhaGRfaW5kZXhfYnVzeV90Y2woYWhkLCAmc2F2ZWRfc2NicHRyLCB0Y2wpOworCWFoZF9vdXR3KGFoZCwgc2NiX29mZnNldCwgc2NiaWQpOworCWFoZF9zZXRfc2NicHRyKGFoZCwgc2F2ZWRfc2NicHRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFNDQiBhbmQgU0NCIHF1ZXVlIG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorYWhkX21hdGNoX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYiwgaW50IHRhcmdldCwKKwkgICAgICBjaGFyIGNoYW5uZWwsIGludCBsdW4sIHVfaW50IHRhZywgcm9sZV90IHJvbGUpCit7CisJaW50IHRhcmcgPSBTQ0JfR0VUX1RBUkdFVChhaGQsIHNjYik7CisJY2hhciBjaGFuID0gU0NCX0dFVF9DSEFOTkVMKGFoZCwgc2NiKTsKKwlpbnQgc2x1biA9IFNDQl9HRVRfTFVOKHNjYik7CisJaW50IG1hdGNoOworCisJbWF0Y2ggPSAoKGNoYW4gPT0gY2hhbm5lbCkgfHwgKGNoYW5uZWwgPT0gQUxMX0NIQU5ORUxTKSk7CisJaWYgKG1hdGNoICE9IDApCisJCW1hdGNoID0gKCh0YXJnID09IHRhcmdldCkgfHwgKHRhcmdldCA9PSBDQU1fVEFSR0VUX1dJTERDQVJEKSk7CisJaWYgKG1hdGNoICE9IDApCisJCW1hdGNoID0gKChsdW4gPT0gc2x1bikgfHwgKGx1biA9PSBDQU1fTFVOX1dJTERDQVJEKSk7CisJaWYgKG1hdGNoICE9IDApIHsKKyNpZmRlZiBBSERfVEFSR0VUX01PREUKKwkJaW50IGdyb3VwOworCisJCWdyb3VwID0gWFBUX0ZDX0dST1VQKHNjYi0+aW9fY3R4LT5jY2JfaC5mdW5jX2NvZGUpOworCQlpZiAocm9sZSA9PSBST0xFX0lOSVRJQVRPUikgeworCQkJbWF0Y2ggPSAoZ3JvdXAgIT0gWFBUX0ZDX0dST1VQX1RNT0RFKQorCQkJICAgICAgJiYgKCh0YWcgPT0gU0NCX0dFVF9UQUcoc2NiKSkKKwkJCSAgICAgICB8fCAodGFnID09IFNDQl9MSVNUX05VTEwpKTsKKwkJfSBlbHNlIGlmIChyb2xlID09IFJPTEVfVEFSR0VUKSB7CisJCQltYXRjaCA9IChncm91cCA9PSBYUFRfRkNfR1JPVVBfVE1PREUpCisJCQkgICAgICAmJiAoKHRhZyA9PSBzY2ItPmlvX2N0eC0+Y3Npby50YWdfaWQpCisJCQkgICAgICAgfHwgKHRhZyA9PSBTQ0JfTElTVF9OVUxMKSk7CisJCX0KKyNlbHNlIC8qICFBSERfVEFSR0VUX01PREUgKi8KKwkJbWF0Y2ggPSAoKHRhZyA9PSBTQ0JfR0VUX1RBRyhzY2IpKSB8fCAodGFnID09IFNDQl9MSVNUX05VTEwpKTsKKyNlbmRpZiAvKiBBSERfVEFSR0VUX01PREUgKi8KKwl9CisKKwlyZXR1cm4gbWF0Y2g7Cit9CisKK3ZvaWQKK2FoZF9mcmVlemVfZGV2cShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlpbnQJdGFyZ2V0OworCWNoYXIJY2hhbm5lbDsKKwlpbnQJbHVuOworCisJdGFyZ2V0ID0gU0NCX0dFVF9UQVJHRVQoYWhkLCBzY2IpOworCWx1biA9IFNDQl9HRVRfTFVOKHNjYik7CisJY2hhbm5lbCA9IFNDQl9HRVRfQ0hBTk5FTChhaGQsIHNjYik7CisJCisJYWhkX3NlYXJjaF9xaW5maWZvKGFoZCwgdGFyZ2V0LCBjaGFubmVsLCBsdW4sCisJCQkgICAvKnRhZyovU0NCX0xJU1RfTlVMTCwgUk9MRV9VTktOT1dOLAorCQkJICAgQ0FNX1JFUVVFVUVfUkVRLCBTRUFSQ0hfQ09NUExFVEUpOworCisJYWhkX3BsYXRmb3JtX2ZyZWV6ZV9kZXZxKGFoZCwgc2NiKTsKK30KKwordm9pZAorYWhkX3FpbmZpZm9fcmVxdWV1ZV90YWlsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXN0cnVjdCBzY2IJKnByZXZfc2NiOworCWFoZF9tb2RlX3N0YXRlCSBzYXZlZF9tb2RlczsKKworCXNhdmVkX21vZGVzID0gYWhkX3NhdmVfbW9kZXMoYWhkKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfQ0NIQU4sIEFIRF9NT0RFX0NDSEFOKTsKKwlwcmV2X3NjYiA9IE5VTEw7CisJaWYgKGFoZF9xaW5maWZvX2NvdW50KGFoZCkgIT0gMCkgeworCQl1X2ludCBwcmV2X3RhZzsKKwkJdV9pbnQgcHJldl9wb3M7CisKKwkJcHJldl9wb3MgPSBBSERfUUlOX1dSQVAoYWhkLT5xaW5maWZvbmV4dCAtIDEpOworCQlwcmV2X3RhZyA9IGFoZC0+cWluZmlmb1twcmV2X3Bvc107CisJCXByZXZfc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBwcmV2X3RhZyk7CisJfQorCWFoZF9xaW5maWZvX3JlcXVldWUoYWhkLCBwcmV2X3NjYiwgc2NiKTsKKwlhaGRfc2V0X2huc2NiX3FvZmYoYWhkLCBhaGQtPnFpbmZpZm9uZXh0KTsKKwlhaGRfcmVzdG9yZV9tb2RlcyhhaGQsIHNhdmVkX21vZGVzKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9xaW5maWZvX3JlcXVldWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpwcmV2X3NjYiwKKwkJICAgIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlpZiAocHJldl9zY2IgPT0gTlVMTCkgeworCQl1aW50MzJfdCBidXNhZGRyOworCisJCWJ1c2FkZHIgPSBhaGRfbGUzMnRvaChzY2ItPmhzY2ItPmhzY2JfYnVzYWRkcik7CisJCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAwLCBidXNhZGRyICYgMHhGRik7CisJCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAxLCAoYnVzYWRkciA+PiA4KSAmIDB4RkYpOworCQlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMiwgKGJ1c2FkZHIgPj4gMTYpICYgMHhGRik7CisJCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAzLCAoYnVzYWRkciA+PiAyNCkgJiAweEZGKTsKKwl9IGVsc2UgeworCQlwcmV2X3NjYi0+aHNjYi0+bmV4dF9oc2NiX2J1c2FkZHIgPSBzY2ItPmhzY2ItPmhzY2JfYnVzYWRkcjsKKwkJYWhkX3N5bmNfc2NiKGFoZCwgcHJldl9zY2IsIAorCQkJICAgICBCVVNfRE1BU1lOQ19QUkVSRUFEfEJVU19ETUFTWU5DX1BSRVdSSVRFKTsKKwl9CisJYWhkLT5xaW5maWZvW0FIRF9RSU5fV1JBUChhaGQtPnFpbmZpZm9uZXh0KV0gPSBTQ0JfR0VUX1RBRyhzY2IpOworCWFoZC0+cWluZmlmb25leHQrKzsKKwlzY2ItPmhzY2ItPm5leHRfaHNjYl9idXNhZGRyID0gYWhkLT5uZXh0X3F1ZXVlZF9oc2NiLT5oc2NiX2J1c2FkZHI7CisJYWhkX3N5bmNfc2NiKGFoZCwgc2NiLCBCVVNfRE1BU1lOQ19QUkVSRUFEfEJVU19ETUFTWU5DX1BSRVdSSVRFKTsKK30KKworc3RhdGljIGludAorYWhkX3FpbmZpZm9fY291bnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXVfaW50IHFpbnBvczsKKwl1X2ludCB3cmFwX3FpbnBvczsKKwl1X2ludCB3cmFwX3FpbmZpZm9uZXh0OworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX0NDSEFOX01TSywgQUhEX01PREVfQ0NIQU5fTVNLKTsKKwlxaW5wb3MgPSBhaGRfZ2V0X3Nuc2NiX3FvZmYoYWhkKTsKKwl3cmFwX3FpbnBvcyA9IEFIRF9RSU5fV1JBUChxaW5wb3MpOworCXdyYXBfcWluZmlmb25leHQgPSBBSERfUUlOX1dSQVAoYWhkLT5xaW5maWZvbmV4dCk7CisJaWYgKHdyYXBfcWluZmlmb25leHQgPj0gd3JhcF9xaW5wb3MpCisJCXJldHVybiAod3JhcF9xaW5maWZvbmV4dCAtIHdyYXBfcWlucG9zKTsKKwllbHNlCisJCXJldHVybiAod3JhcF9xaW5maWZvbmV4dAorCQkgICAgICArIE5VTV9FTEVNRU5UUyhhaGQtPnFpbmZpZm8pIC0gd3JhcF9xaW5wb3MpOworfQorCit2b2lkCithaGRfcmVzZXRfY21kc19wZW5kaW5nKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlzdHJ1Y3QJCXNjYiAqc2NiOworCWFoZF9tb2RlX3N0YXRlCXNhdmVkX21vZGVzOworCXVfaW50CQlwZW5kaW5nX2NtZHM7CisKKwlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0NDSEFOLCBBSERfTU9ERV9DQ0hBTik7CisKKwkvKgorCSAqIERvbid0IGNvdW50IGFueSBjb21tYW5kcyBhcyBvdXRzdGFuZGluZyB0aGF0IHRoZQorCSAqIHNlcXVlbmNlciBoYXMgYWxyZWFkeSBtYXJrZWQgZm9yIGNvbXBsZXRpb24uCisJICovCisJYWhkX2ZsdXNoX3FvdXRmaWZvKGFoZCk7CisKKwlwZW5kaW5nX2NtZHMgPSAwOworCUxJU1RfRk9SRUFDSChzY2IsICZhaGQtPnBlbmRpbmdfc2NicywgcGVuZGluZ19saW5rcykgeworCQlwZW5kaW5nX2NtZHMrKzsKKwl9CisJYWhkX291dHcoYWhkLCBDTURTX1BFTkRJTkcsIHBlbmRpbmdfY21kcyAtIGFoZF9xaW5maWZvX2NvdW50KGFoZCkpOworCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOworCWFoZC0+ZmxhZ3MgJj0gfkFIRF9VUERBVEVfUEVORF9DTURTOworfQorCitpbnQKK2FoZF9zZWFyY2hfcWluZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwKKwkJICAgaW50IGx1biwgdV9pbnQgdGFnLCByb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzLAorCQkgICBhaGRfc2VhcmNoX2FjdGlvbiBhY3Rpb24pCit7CisJc3RydWN0IHNjYgkqc2NiOworCXN0cnVjdCBzY2IJKnByZXZfc2NiOworCWFoZF9tb2RlX3N0YXRlCSBzYXZlZF9tb2RlczsKKwl1X2ludAkJIHFpbnN0YXJ0OworCXVfaW50CQkgcWlucG9zOworCXVfaW50CQkgcWludGFpbDsKKwl1X2ludAkJIHRpZF9uZXh0OworCXVfaW50CQkgdGlkX3ByZXY7CisJdV9pbnQJCSBzY2JpZDsKKwl1X2ludAkJIHNhdmVkc2NicHRyOworCXVpbnQzMl90CSBidXNhZGRyOworCWludAkJIGZvdW5kOworCWludAkJIHRhcmdldHM7CisKKwkvKiBNdXN0IGJlIGluIENDSEFOIG1vZGUgKi8KKwlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0NDSEFOLCBBSERfTU9ERV9DQ0hBTik7CisKKwkvKgorCSAqIEhhbHQgYW55IHBlbmRpbmcgU0NCIERNQS4gIFRoZSBzZXF1ZW5jZXIgd2lsbCByZWluaXRpYXRlCisJICogdGhpcyBkbWEgaWYgdGhlIHFpbmZpZm8gaXMgbm90IGVtcHR5IG9uY2Ugd2UgdW5wYXVzZS4KKwkgKi8KKwlpZiAoKGFoZF9pbmIoYWhkLCBDQ1NDQkNUTCkgJiAoQ0NBUlJFTnxDQ1NDQkVOfENDU0NCRElSKSkKKwkgPT0gKENDQVJSRU58Q0NTQ0JFTnxDQ1NDQkRJUikpIHsKKwkJYWhkX291dGIoYWhkLCBDQ1NDQkNUTCwKKwkJCSBhaGRfaW5iKGFoZCwgQ0NTQ0JDVEwpICYgfihDQ0FSUkVOfENDU0NCRU4pKTsKKwkJd2hpbGUgKChhaGRfaW5iKGFoZCwgQ0NTQ0JDVEwpICYgKENDQVJSRU58Q0NTQ0JFTikpICE9IDApCisJCQk7CisJfQorCS8qIERldGVybWluZSBzZXF1ZW5jZXIncyBwb3NpdGlvbiBpbiB0aGUgcWluZmlmby4gKi8KKwlxaW50YWlsID0gQUhEX1FJTl9XUkFQKGFoZC0+cWluZmlmb25leHQpOworCXFpbnN0YXJ0ID0gYWhkX2dldF9zbnNjYl9xb2ZmKGFoZCk7CisJcWlucG9zID0gQUhEX1FJTl9XUkFQKHFpbnN0YXJ0KTsKKwlmb3VuZCA9IDA7CisJcHJldl9zY2IgPSBOVUxMOworCisJaWYgKGFjdGlvbiA9PSBTRUFSQ0hfUFJJTlQpIHsKKwkJcHJpbnRmKCJxaW5zdGFydCA9ICVkIHFpbmZpZm9uZXh0ID0gJWRcblFJTkZJRk86IiwKKwkJICAgICAgIHFpbnN0YXJ0LCBhaGQtPnFpbmZpZm9uZXh0KTsKKwl9CisKKwkvKgorCSAqIFN0YXJ0IHdpdGggYW4gZW1wdHkgcXVldWUuICBFbnRyaWVzIHRoYXQgYXJlIG5vdCBjaG9zZW4KKwkgKiBmb3IgcmVtb3ZhbCB3aWxsIGJlIHJlLWFkZGVkIHRvIHRoZSBxdWV1ZSBhcyB3ZSBnby4KKwkgKi8KKwlhaGQtPnFpbmZpZm9uZXh0ID0gcWluc3RhcnQ7CisJYnVzYWRkciA9IGFoZF9sZTMydG9oKGFoZC0+bmV4dF9xdWV1ZWRfaHNjYi0+aHNjYl9idXNhZGRyKTsKKwlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMCwgYnVzYWRkciAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAxLCAoYnVzYWRkciA+PiA4KSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAyLCAoYnVzYWRkciA+PiAxNikgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMywgKGJ1c2FkZHIgPj4gMjQpICYgMHhGRik7CisKKwl3aGlsZSAocWlucG9zICE9IHFpbnRhaWwpIHsKKwkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBhaGQtPnFpbmZpZm9bcWlucG9zXSk7CisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJcHJpbnRmKCJxaW5wb3MgPSAlZCwgU0NCIGluZGV4ID0gJWRcbiIsCisJCQkJcWlucG9zLCBhaGQtPnFpbmZpZm9bcWlucG9zXSk7CisJCQlwYW5pYygiTG9vcCAxXG4iKTsKKwkJfQorCisJCWlmIChhaGRfbWF0Y2hfc2NiKGFoZCwgc2NiLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgdGFnLCByb2xlKSkgeworCQkJLyoKKwkJCSAqIFdlIGZvdW5kIGFuIHNjYiB0aGF0IG5lZWRzIHRvIGJlIGFjdGVkIG9uLgorCQkJICovCisJCQlmb3VuZCsrOworCQkJc3dpdGNoIChhY3Rpb24pIHsKKwkJCWNhc2UgU0VBUkNIX0NPTVBMRVRFOgorCQkJeworCQkJCWNhbV9zdGF0dXMgb3N0YXQ7CisJCQkJY2FtX3N0YXR1cyBjc3RhdDsKKworCQkJCW9zdGF0ID0gYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKTsKKwkJCQlpZiAob3N0YXQgPT0gQ0FNX1JFUV9JTlBST0cpCisJCQkJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwKKwkJCQkJCQkJICAgc3RhdHVzKTsKKwkJCQljc3RhdCA9IGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYik7CisJCQkJaWYgKGNzdGF0ICE9IENBTV9SRVFfQ01QKQorCQkJCQlhaGRfZnJlZXplX3NjYihzY2IpOworCQkJCWlmICgoc2NiLT5mbGFncyAmIFNDQl9BQ1RJVkUpID09IDApCisJCQkJCXByaW50ZigiSW5hY3RpdmUgU0NCIGluIHFpbmZpZm9cbiIpOworCQkJCWFoZF9kb25lKGFoZCwgc2NiKTsKKworCQkJCS8qIEZBTExUSFJPVUdIICovCisJCQl9CisJCQljYXNlIFNFQVJDSF9SRU1PVkU6CisJCQkJYnJlYWs7CisJCQljYXNlIFNFQVJDSF9QUklOVDoKKwkJCQlwcmludGYoIiAweCV4IiwgYWhkLT5xaW5maWZvW3FpbnBvc10pOworCQkJCS8qIEZBTExUSFJPVUdIICovCisJCQljYXNlIFNFQVJDSF9DT1VOVDoKKwkJCQlhaGRfcWluZmlmb19yZXF1ZXVlKGFoZCwgcHJldl9zY2IsIHNjYik7CisJCQkJcHJldl9zY2IgPSBzY2I7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlhaGRfcWluZmlmb19yZXF1ZXVlKGFoZCwgcHJldl9zY2IsIHNjYik7CisJCQlwcmV2X3NjYiA9IHNjYjsKKwkJfQorCQlxaW5wb3MgPSBBSERfUUlOX1dSQVAocWlucG9zKzEpOworCX0KKworCWFoZF9zZXRfaG5zY2JfcW9mZihhaGQsIGFoZC0+cWluZmlmb25leHQpOworCisJaWYgKGFjdGlvbiA9PSBTRUFSQ0hfUFJJTlQpCisJCXByaW50ZigiXG5XQUlUSU5HX1RJRF9RVUVVRVM6XG4iKTsKKworCS8qCisJICogU2VhcmNoIHdhaXRpbmcgZm9yIHNlbGVjdGlvbiBsaXN0cy4gIFdlIHRyYXZlcnNlIHRoZQorCSAqIGxpc3Qgb2YgInRoZWlyIGlkcyIgd2FpdGluZyBmb3Igc2VsZWN0aW9uIGFuZCwgaWYKKwkgKiBhcHByb3ByaWF0ZSwgdHJhdmVyc2UgdGhlIFNDQnMgb2YgZWFjaCAidGhlaXIgaWQiCisJICogbG9va2luZyBmb3IgbWF0Y2hlcy4KKwkgKi8KKwlzYXZlZHNjYnB0ciA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJdGlkX25leHQgPSBhaGRfaW53KGFoZCwgV0FJVElOR19USURfSEVBRCk7CisJdGlkX3ByZXYgPSBTQ0JfTElTVF9OVUxMOworCXRhcmdldHMgPSAwOworCWZvciAoc2NiaWQgPSB0aWRfbmV4dDsgIVNDQklEX0lTX05VTEwoc2NiaWQpOyBzY2JpZCA9IHRpZF9uZXh0KSB7CisJCXVfaW50IHRpZF9oZWFkOworCisJCS8qCisJCSAqIFdlIGxpbWl0IGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgU0NCcyBzaW5jZQorCQkgKiBNS19NRVNTQUdFIFNDQnMgYXJlIG5vdCBpbiB0aGUgcGVyLXRpZCBsaXN0cy4KKwkJICovCisJCXRhcmdldHMrKzsKKwkJaWYgKHRhcmdldHMgPiBBSERfU0NCX01BWCkgeworCQkJcGFuaWMoIlRJRCBMSVNUIExPT1AiKTsKKwkJfQorCQlpZiAoc2NiaWQgPj0gYWhkLT5zY2JfZGF0YS5udW1zY2JzKSB7CisJCQlwcmludGYoIiVzOiBXYWl0aW5nIFRJRCBMaXN0IGluY29uc2lzdGVuY3kuICIKKwkJCSAgICAgICAiU0NCIGluZGV4ID09IDB4JXgsIHlldCBudW1zY2JzID09IDB4JXguIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBzY2JpZCwgYWhkLT5zY2JfZGF0YS5udW1zY2JzKTsKKwkJCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKKwkJCXBhbmljKCJmb3Igc2FmZXR5Iik7CisJCX0KKwkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJcHJpbnRmKCIlczogU0NCID0gMHgleCBOb3QgQWN0aXZlIVxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBzY2JpZCk7CisJCQlwYW5pYygiV2FpdGluZyBUSUQgTGlzdCB0cmF2ZXJzYWxcbiIpOworCQl9CisJCWFoZF9zZXRfc2NicHRyKGFoZCwgc2NiaWQpOworCQl0aWRfbmV4dCA9IGFoZF9pbndfc2NicmFtKGFoZCwgU0NCX05FWFQyKTsKKwkJaWYgKGFoZF9tYXRjaF9zY2IoYWhkLCBzY2IsIHRhcmdldCwgY2hhbm5lbCwgQ0FNX0xVTl9XSUxEQ0FSRCwKKwkJCQkgIFNDQl9MSVNUX05VTEwsIFJPTEVfVU5LTk9XTikgPT0gMCkgeworCQkJdGlkX3ByZXYgPSBzY2JpZDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogV2UgZm91bmQgYSBsaXN0IG9mIHNjYnMgdGhhdCBuZWVkcyB0byBiZSBzZWFyY2hlZC4KKwkJICovCisJCWlmIChhY3Rpb24gPT0gU0VBUkNIX1BSSU5UKQorCQkJcHJpbnRmKCIgICAgICAgJWQgKCAiLCBTQ0JfR0VUX1RBUkdFVChhaGQsIHNjYikpOworCQl0aWRfaGVhZCA9IHNjYmlkOworCQlmb3VuZCArPSBhaGRfc2VhcmNoX3NjYl9saXN0KGFoZCwgdGFyZ2V0LCBjaGFubmVsLAorCQkJCQkgICAgIGx1biwgdGFnLCByb2xlLCBzdGF0dXMsCisJCQkJCSAgICAgYWN0aW9uLCAmdGlkX2hlYWQsCisJCQkJCSAgICAgU0NCX0dFVF9UQVJHRVQoYWhkLCBzY2IpKTsKKwkJaWYgKHRpZF9oZWFkICE9IHNjYmlkKQorCQkJYWhkX3N0aXRjaF90aWRfbGlzdChhaGQsIHRpZF9wcmV2LCB0aWRfaGVhZCwgdGlkX25leHQpOworCQlpZiAoIVNDQklEX0lTX05VTEwodGlkX2hlYWQpKQorCQkJdGlkX3ByZXYgPSB0aWRfaGVhZDsKKwkJaWYgKGFjdGlvbiA9PSBTRUFSQ0hfUFJJTlQpCisJCQlwcmludGYoIilcbiIpOworCX0KKwlhaGRfc2V0X3NjYnB0cihhaGQsIHNhdmVkc2NicHRyKTsKKwlhaGRfcmVzdG9yZV9tb2RlcyhhaGQsIHNhdmVkX21vZGVzKTsKKwlyZXR1cm4gKGZvdW5kKTsKK30KKworc3RhdGljIGludAorYWhkX3NlYXJjaF9zY2JfbGlzdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwKKwkJICAgIGludCBsdW4sIHVfaW50IHRhZywgcm9sZV90IHJvbGUsIHVpbnQzMl90IHN0YXR1cywKKwkJICAgIGFoZF9zZWFyY2hfYWN0aW9uIGFjdGlvbiwgdV9pbnQgKmxpc3RfaGVhZCwgdV9pbnQgdGlkKQoreworCXN0cnVjdAlzY2IgKnNjYjsKKwl1X2ludAlzY2JpZDsKKwl1X2ludAluZXh0OworCXVfaW50CXByZXY7CisJaW50CWZvdW5kOworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX0NDSEFOX01TSywgQUhEX01PREVfQ0NIQU5fTVNLKTsKKwlmb3VuZCA9IDA7CisJcHJldiA9IFNDQl9MSVNUX05VTEw7CisJbmV4dCA9ICpsaXN0X2hlYWQ7CisJZm9yIChzY2JpZCA9IG5leHQ7ICFTQ0JJRF9JU19OVUxMKHNjYmlkKTsgc2NiaWQgPSBuZXh0KSB7CisJCWlmIChzY2JpZCA+PSBhaGQtPnNjYl9kYXRhLm51bXNjYnMpIHsKKwkJCXByaW50ZigiJXM6U0NCIExpc3QgaW5jb25zaXN0ZW5jeS4gIgorCQkJICAgICAgICJTQ0IgPT0gMHgleCwgeWV0IG51bXNjYnMgPT0gMHgleC4iLAorCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIHNjYmlkLCBhaGQtPnNjYl9kYXRhLm51bXNjYnMpOworCQkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOworCQkJcGFuaWMoImZvciBzYWZldHkiKTsKKwkJfQorCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwkJaWYgKHNjYiA9PSBOVUxMKSB7CisJCQlwcmludGYoIiVzOiBTQ0IgPSAlZCBOb3QgQWN0aXZlIVxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBzY2JpZCk7CisJCQlwYW5pYygiV2FpdGluZyBMaXN0IHRyYXZlcnNhbFxuIik7CisJCX0KKwkJYWhkX3NldF9zY2JwdHIoYWhkLCBzY2JpZCk7CisJCW5leHQgPSBhaGRfaW53X3NjYnJhbShhaGQsIFNDQl9ORVhUKTsKKwkJaWYgKGFoZF9tYXRjaF9zY2IoYWhkLCBzY2IsIHRhcmdldCwgY2hhbm5lbCwKKwkJCQkgIGx1biwgU0NCX0xJU1RfTlVMTCwgcm9sZSkgPT0gMCkgeworCQkJcHJldiA9IHNjYmlkOworCQkJY29udGludWU7CisJCX0KKwkJZm91bmQrKzsKKwkJc3dpdGNoIChhY3Rpb24pIHsKKwkJY2FzZSBTRUFSQ0hfQ09NUExFVEU6CisJCXsKKwkJCWNhbV9zdGF0dXMgb3N0YXQ7CisJCQljYW1fc3RhdHVzIGNzdGF0OworCisJCQlvc3RhdCA9IGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYik7CisJCQlpZiAob3N0YXQgPT0gQ0FNX1JFUV9JTlBST0cpCisJCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBzdGF0dXMpOworCQkJY3N0YXQgPSBhaGRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpOworCQkJaWYgKGNzdGF0ICE9IENBTV9SRVFfQ01QKQorCQkJCWFoZF9mcmVlemVfc2NiKHNjYik7CisJCQlpZiAoKHNjYi0+ZmxhZ3MgJiBTQ0JfQUNUSVZFKSA9PSAwKQorCQkJCXByaW50ZigiSW5hY3RpdmUgU0NCIGluIFdhaXRpbmcgTGlzdFxuIik7CisJCQlhaGRfZG9uZShhaGQsIHNjYik7CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQl9CisJCWNhc2UgU0VBUkNIX1JFTU9WRToKKwkJCWFoZF9yZW1fd3NjYihhaGQsIHNjYmlkLCBwcmV2LCBuZXh0LCB0aWQpOworCQkJaWYgKHByZXYgPT0gU0NCX0xJU1RfTlVMTCkKKwkJCQkqbGlzdF9oZWFkID0gbmV4dDsKKwkJCWJyZWFrOworCQljYXNlIFNFQVJDSF9QUklOVDoKKwkJCXByaW50ZigiMHgleCAiLCBzY2JpZCk7CisJCWNhc2UgU0VBUkNIX0NPVU5UOgorCQkJcHJldiA9IHNjYmlkOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGZvdW5kID4gQUhEX1NDQl9NQVgpCisJCQlwYW5pYygiU0NCIExJU1QgTE9PUCIpOworCX0KKwlpZiAoYWN0aW9uID09IFNFQVJDSF9DT01QTEVURQorCSB8fCBhY3Rpb24gPT0gU0VBUkNIX1JFTU9WRSkKKwkJYWhkX291dHcoYWhkLCBDTURTX1BFTkRJTkcsIGFoZF9pbncoYWhkLCBDTURTX1BFTkRJTkcpIC0gZm91bmQpOworCXJldHVybiAoZm91bmQpOworfQorCitzdGF0aWMgdm9pZAorYWhkX3N0aXRjaF90aWRfbGlzdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHRpZF9wcmV2LAorCQkgICAgdV9pbnQgdGlkX2N1ciwgdV9pbnQgdGlkX25leHQpCit7CisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX0NDSEFOX01TSywgQUhEX01PREVfQ0NIQU5fTVNLKTsKKworCWlmIChTQ0JJRF9JU19OVUxMKHRpZF9jdXIpKSB7CisKKwkJLyogQnlwYXNzIGN1cnJlbnQgVElEIGxpc3QgKi8KKwkJaWYgKFNDQklEX0lTX05VTEwodGlkX3ByZXYpKSB7CisJCQlhaGRfb3V0dyhhaGQsIFdBSVRJTkdfVElEX0hFQUQsIHRpZF9uZXh0KTsKKwkJfSBlbHNlIHsKKwkJCWFoZF9zZXRfc2NicHRyKGFoZCwgdGlkX3ByZXYpOworCQkJYWhkX291dHcoYWhkLCBTQ0JfTkVYVDIsIHRpZF9uZXh0KTsKKwkJfQorCQlpZiAoU0NCSURfSVNfTlVMTCh0aWRfbmV4dCkpCisJCQlhaGRfb3V0dyhhaGQsIFdBSVRJTkdfVElEX1RBSUwsIHRpZF9wcmV2KTsKKwl9IGVsc2UgeworCisJCS8qIFN0aXRjaCB0aHJvdWdoIHRpZF9jdXIgKi8KKwkJaWYgKFNDQklEX0lTX05VTEwodGlkX3ByZXYpKSB7CisJCQlhaGRfb3V0dyhhaGQsIFdBSVRJTkdfVElEX0hFQUQsIHRpZF9jdXIpOworCQl9IGVsc2UgeworCQkJYWhkX3NldF9zY2JwdHIoYWhkLCB0aWRfcHJldik7CisJCQlhaGRfb3V0dyhhaGQsIFNDQl9ORVhUMiwgdGlkX2N1cik7CisJCX0KKwkJYWhkX3NldF9zY2JwdHIoYWhkLCB0aWRfY3VyKTsKKwkJYWhkX291dHcoYWhkLCBTQ0JfTkVYVDIsIHRpZF9uZXh0KTsKKworCQlpZiAoU0NCSURfSVNfTlVMTCh0aWRfbmV4dCkpCisJCQlhaGRfb3V0dyhhaGQsIFdBSVRJTkdfVElEX1RBSUwsIHRpZF9jdXIpOworCX0KK30KKworLyoKKyAqIE1hbmlwdWxhdGUgdGhlIHdhaXRpbmcgZm9yIHNlbGVjdGlvbiBsaXN0IGFuZCByZXR1cm4gdGhlCisgKiBzY2IgdGhhdCBmb2xsb3dzIHRoZSBvbmUgdGhhdCB3ZSByZW1vdmUuCisgKi8KK3N0YXRpYyB1X2ludAorYWhkX3JlbV93c2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgc2NiaWQsCisJICAgICB1X2ludCBwcmV2LCB1X2ludCBuZXh0LCB1X2ludCB0aWQpCit7CisJdV9pbnQgdGFpbF9vZmZzZXQ7CisKKwlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfQ0NIQU5fTVNLLCBBSERfTU9ERV9DQ0hBTl9NU0spOworCWlmICghU0NCSURfSVNfTlVMTChwcmV2KSkgeworCQlhaGRfc2V0X3NjYnB0cihhaGQsIHByZXYpOworCQlhaGRfb3V0dyhhaGQsIFNDQl9ORVhULCBuZXh0KTsKKwl9CisKKwkvKgorCSAqIFNDQnMgdGhhdCBoYWQgTUtfTUVTU0FHRSBzZXQgaW4gdGhlbSB3aWxsIG5vdAorCSAqIGJlIHF1ZXVlZCB0byB0aGUgcGVyLXRhcmdldCBsaXN0cywgc28gZG9uJ3QKKwkgKiBibGluZGx5IGNsZWFyIHRoZSB0YWlsIHBvaW50ZXIuCisJICovCisJdGFpbF9vZmZzZXQgPSBXQUlUSU5HX1NDQl9UQUlMUyArICgyICogdGlkKTsKKwlpZiAoU0NCSURfSVNfTlVMTChuZXh0KQorCSAmJiBhaGRfaW53KGFoZCwgdGFpbF9vZmZzZXQpID09IHNjYmlkKQorCQlhaGRfb3V0dyhhaGQsIHRhaWxfb2Zmc2V0LCBwcmV2KTsKKwlhaGRfYWRkX3NjYl90b19mcmVlX2xpc3QoYWhkLCBzY2JpZCk7CisJcmV0dXJuIChuZXh0KTsKK30KKworLyoKKyAqIEFkZCB0aGUgU0NCIGFzIHNlbGVjdGVkIGJ5IFNDQlBUUiBvbnRvIHRoZSBvbiBjaGlwIGxpc3Qgb2YKKyAqIGZyZWUgaGFyZHdhcmUgU0NCcy4gIFRoaXMgbGlzdCBpcyBlbXB0eS91bnVzZWQgaWYgd2UgYXJlIG5vdAorICogcGVyZm9ybWluZyBTQ0IgcGFnaW5nLgorICovCitzdGF0aWMgdm9pZAorYWhkX2FkZF9zY2JfdG9fZnJlZV9saXN0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgc2NiaWQpCit7CisvKiBYWFggTmVlZCBzb21lIG90aGVyIG1lY2hhbmlzbSB0byBkZXNpZ25hdGUgImZyZWUiLiAqLworCS8qCisJICogSW52YWxpZGF0ZSB0aGUgdGFnIHNvIHRoYXQgb3VyIGFib3J0CisJICogcm91dGluZXMgZG9uJ3QgdGhpbmsgaXQncyBhY3RpdmUuCisJYWhkX291dGIoYWhkLCBTQ0JfVEFHLCBTQ0JfTElTVF9OVUxMKTsKKwkgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVycm9yIEhhbmRsaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBBYm9ydCBhbGwgU0NCcyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBkZXNjcmlwdGlvbiAodGFyZ2V0L2NoYW5uZWwvbHVuL3RhZyksCisgKiBzZXR0aW5nIHRoZWlyIHN0YXR1cyB0byB0aGUgcGFzc2VkIGluIHN0YXR1cyBpZiB0aGUgc3RhdHVzIGhhcyBub3QgYWxyZWFkeQorICogYmVlbiBtb2RpZmllZCBmcm9tIENBTV9SRVFfSU5QUk9HLiAgVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCB0aGUgc2VxdWVuY2VyCisgKiBpcyBwYXVzZWQgYmVmb3JlIGl0IGlzIGNhbGxlZC4KKyAqLworaW50CithaGRfYWJvcnRfc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwKKwkgICAgICAgaW50IGx1biwgdV9pbnQgdGFnLCByb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzKQoreworCXN0cnVjdAkJc2NiICpzY2JwOworCXN0cnVjdAkJc2NiICpzY2JwX25leHQ7CisJdV9pbnQJCWksIGo7CisJdV9pbnQJCW1heHRhcmdldDsKKwl1X2ludAkJbWlubHVuOworCXVfaW50CQltYXhsdW47CisJaW50CQlmb3VuZDsKKwlhaGRfbW9kZV9zdGF0ZQlzYXZlZF9tb2RlczsKKworCS8qIHJlc3RvcmUgdGhpcyB3aGVuIHdlJ3JlIGRvbmUgKi8KKwlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCisJZm91bmQgPSBhaGRfc2VhcmNoX3FpbmZpZm8oYWhkLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgU0NCX0xJU1RfTlVMTCwKKwkJCQkgICByb2xlLCBDQU1fUkVRVUVVRV9SRVEsIFNFQVJDSF9DT01QTEVURSk7CisKKwkvKgorCSAqIENsZWFuIG91dCB0aGUgYnVzeSB0YXJnZXQgdGFibGUgZm9yIGFueSB1bnRhZ2dlZCBjb21tYW5kcy4KKwkgKi8KKwlpID0gMDsKKwltYXh0YXJnZXQgPSAxNjsKKwlpZiAodGFyZ2V0ICE9IENBTV9UQVJHRVRfV0lMRENBUkQpIHsKKwkJaSA9IHRhcmdldDsKKwkJaWYgKGNoYW5uZWwgPT0gJ0InKQorCQkJaSArPSA4OworCQltYXh0YXJnZXQgPSBpICsgMTsKKwl9CisKKwlpZiAobHVuID09IENBTV9MVU5fV0lMRENBUkQpIHsKKwkJbWlubHVuID0gMDsKKwkJbWF4bHVuID0gQUhEX05VTV9MVU5TX05PTlBLVDsKKwl9IGVsc2UgaWYgKGx1biA+PSBBSERfTlVNX0xVTlNfTk9OUEtUKSB7CisJCW1pbmx1biA9IG1heGx1biA9IDA7CisJfSBlbHNlIHsKKwkJbWlubHVuID0gbHVuOworCQltYXhsdW4gPSBsdW4gKyAxOworCX0KKworCWlmIChyb2xlICE9IFJPTEVfVEFSR0VUKSB7CisJCWZvciAoO2kgPCBtYXh0YXJnZXQ7IGkrKykgeworCQkJZm9yIChqID0gbWlubHVuO2ogPCBtYXhsdW47IGorKykgeworCQkJCXVfaW50IHNjYmlkOworCQkJCXVfaW50IHRjbDsKKworCQkJCXRjbCA9IEJVSUxEX1RDTF9SQVcoaSwgJ0EnLCBqKTsKKwkJCQlzY2JpZCA9IGFoZF9maW5kX2J1c3lfdGNsKGFoZCwgdGNsKTsKKwkJCQlzY2JwID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CisJCQkJaWYgKHNjYnAgPT0gTlVMTAorCQkJCSB8fCBhaGRfbWF0Y2hfc2NiKGFoZCwgc2NicCwgdGFyZ2V0LCBjaGFubmVsLAorCQkJCQkJICBsdW4sIHRhZywgcm9sZSkgPT0gMCkKKwkJCQkJY29udGludWU7CisJCQkJYWhkX3VuYnVzeV90Y2woYWhkLCBCVUlMRF9UQ0xfUkFXKGksICdBJywgaikpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBEb24ndCBhYm9ydCBjb21tYW5kcyB0aGF0IGhhdmUgYWxyZWFkeSBjb21wbGV0ZWQsCisJICogYnV0IGhhdmVuJ3QgcXVpdGUgbWFkZSBpdCB1cCB0byB0aGUgaG9zdCB5ZXQuCisJICovCisJYWhkX2ZsdXNoX3FvdXRmaWZvKGFoZCk7CisKKwkvKgorCSAqIEdvIHRocm91Z2ggdGhlIHBlbmRpbmcgQ0NCIGxpc3QgYW5kIGxvb2sgZm9yCisJICogY29tbWFuZHMgZm9yIHRoaXMgdGFyZ2V0IHRoYXQgYXJlIHN0aWxsIGFjdGl2ZS4KKwkgKiBUaGVzZSBhcmUgb3RoZXIgdGFnZ2VkIGNvbW1hbmRzIHRoYXQgd2VyZQorCSAqIGRpc2Nvbm5lY3RlZCB3aGVuIHRoZSByZXNldCBvY2N1cnJlZC4KKwkgKi8KKwlzY2JwX25leHQgPSBMSVNUX0ZJUlNUKCZhaGQtPnBlbmRpbmdfc2Nicyk7CisJd2hpbGUgKHNjYnBfbmV4dCAhPSBOVUxMKSB7CisJCXNjYnAgPSBzY2JwX25leHQ7CisJCXNjYnBfbmV4dCA9IExJU1RfTkVYVChzY2JwLCBwZW5kaW5nX2xpbmtzKTsKKwkJaWYgKGFoZF9tYXRjaF9zY2IoYWhkLCBzY2JwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgdGFnLCByb2xlKSkgeworCQkJY2FtX3N0YXR1cyBvc3RhdDsKKworCQkJb3N0YXQgPSBhaGRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2JwKTsKKwkJCWlmIChvc3RhdCA9PSBDQU1fUkVRX0lOUFJPRykKKwkJCQlhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2JwLCBzdGF0dXMpOworCQkJaWYgKGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYnApICE9IENBTV9SRVFfQ01QKQorCQkJCWFoZF9mcmVlemVfc2NiKHNjYnApOworCQkJaWYgKChzY2JwLT5mbGFncyAmIFNDQl9BQ1RJVkUpID09IDApCisJCQkJcHJpbnRmKCJJbmFjdGl2ZSBTQ0Igb24gcGVuZGluZyBsaXN0XG4iKTsKKwkJCWFoZF9kb25lKGFoZCwgc2NicCk7CisJCQlmb3VuZCsrOworCQl9CisJfQorCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOworCWFoZF9wbGF0Zm9ybV9hYm9ydF9zY2JzKGFoZCwgdGFyZ2V0LCBjaGFubmVsLCBsdW4sIHRhZywgcm9sZSwgc3RhdHVzKTsKKwlhaGQtPmZsYWdzIHw9IEFIRF9VUERBVEVfUEVORF9DTURTOworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIHZvaWQKK2FoZF9yZXNldF9jdXJyZW50X2J1cyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJdWludDhfdCBzY3Npc2VxOworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CisJYWhkX291dGIoYWhkLCBTSU1PREUxLCBhaGRfaW5iKGFoZCwgU0lNT0RFMSkgJiB+RU5TQ1NJUlNUKTsKKwlzY3Npc2VxID0gYWhkX2luYihhaGQsIFNDU0lTRVEwKSAmIH4oRU5TRUxPfEVOQVJCT3xTQ1NJUlNUTyk7CisJYWhkX291dGIoYWhkLCBTQ1NJU0VRMCwgc2NzaXNlcSB8IFNDU0lSU1RPKTsKKwlhaGRfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGQpOworCWFoZF9kZWxheShBSERfQlVTUkVTRVRfREVMQVkpOworCS8qIFR1cm4gb2ZmIHRoZSBidXMgcmVzZXQgKi8KKwlhaGRfb3V0YihhaGQsIFNDU0lTRVEwLCBzY3Npc2VxKTsKKwlhaGRfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGQpOworCWFoZF9kZWxheShBSERfQlVTUkVTRVRfREVMQVkpOworCWlmICgoYWhkLT5idWdzICYgQUhEX1NDU0lSU1RfQlVHKSAhPSAwKSB7CisJCS8qCisJCSAqIDJBIFJhem9yICM0NzQKKwkJICogQ2VydGFpbiBjaGlwIHN0YXRlIGlzIG5vdCBjbGVhcmVkIGZvcgorCQkgKiBTQ1NJIGJ1cyByZXNldHMgdGhhdCB3ZSBpbml0aWF0ZSwgc28KKwkJICogd2UgbXVzdCByZXNldCB0aGUgY2hpcC4KKwkJICovCisJCWFoZF9yZXNldChhaGQsIC8qcmVpbml0Ki9UUlVFKTsKKwkJYWhkX2ludHJfZW5hYmxlKGFoZCwgLyplbmFibGUqL1RSVUUpOworCQlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfU0NTSV9NU0ssIEFIRF9NT0RFX1NDU0lfTVNLKTsKKwl9CisKKwlhaGRfY2xlYXJfaW50c3RhdChhaGQpOworfQorCitpbnQKK2FoZF9yZXNldF9jaGFubmVsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgY2hhciBjaGFubmVsLCBpbnQgaW5pdGlhdGVfcmVzZXQpCit7CisJc3RydWN0CWFoZF9kZXZpbmZvIGRldmluZm87CisJdV9pbnQJaW5pdGlhdG9yOworCXVfaW50CXRhcmdldDsKKwl1X2ludAltYXhfc2NzaWlkOworCWludAlmb3VuZDsKKwl1X2ludAlmaWZvOworCXVfaW50CW5leHRfZmlmbzsKKworCWFoZC0+cGVuZGluZ19kZXZpY2UgPSBOVUxMOworCisJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywKKwkJCSAgICBDQU1fVEFSR0VUX1dJTERDQVJELAorCQkJICAgIENBTV9UQVJHRVRfV0lMRENBUkQsCisJCQkgICAgQ0FNX0xVTl9XSUxEQ0FSRCwKKwkJCSAgICBjaGFubmVsLCBST0xFX1VOS05PV04pOworCWFoZF9wYXVzZShhaGQpOworCisJLyogTWFrZSBzdXJlIHRoZSBzZXF1ZW5jZXIgaXMgaW4gYSBzYWZlIGxvY2F0aW9uLiAqLworCWFoZF9jbGVhcl9jcml0aWNhbF9zZWN0aW9uKGFoZCk7CisKKyNpZmRlZiBBSERfVEFSR0VUX01PREUKKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfVEFSR0VUUk9MRSkgIT0gMCkgeworCQlhaGRfcnVuX3RxaW5maWZvKGFoZCwgLypwYXVzZWQqL1RSVUUpOworCX0KKyNlbmRpZgorCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKworCS8qCisJICogRGlzYWJsZSBzZWxlY3Rpb25zIHNvIG5vIGF1dG9tYXRpYyBoYXJkd2FyZQorCSAqIGZ1bmN0aW9ucyB3aWxsIG1vZGlmeSBjaGlwIHN0YXRlLgorCSAqLworCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTAsIDApOworCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTEsIDApOworCisJLyoKKwkgKiBTYWZlbHkgc2h1dCBkb3duIG91ciBETUEgZW5naW5lcy4gIEFsd2F5cyBzdGFydCB3aXRoCisJICogdGhlIEZJRk8gdGhhdCBpcyBub3QgY3VycmVudGx5IGFjdGl2ZSAoaWYgYW55IGFyZQorCSAqIGFjdGl2ZWx5IGNvbm5lY3RlZCkuCisJICovCisJbmV4dF9maWZvID0gZmlmbyA9IGFoZF9pbmIoYWhkLCBERkZTVEFUKSAmIENVUlJGSUZPOworCWlmIChuZXh0X2ZpZm8gPiBDVVJSRklGT18xKQorCQkvKiBJZiBkaXNjb25uZWNlZCwgYXJiaXRyYXJpbHkgc3RhcnQgd2l0aCBGSUZPMS4gKi8KKwkJbmV4dF9maWZvID0gZmlmbyA9IDA7CisJZG8geworCQluZXh0X2ZpZm8gXj0gQ1VSUkZJRk9fMTsKKwkJYWhkX3NldF9tb2RlcyhhaGQsIG5leHRfZmlmbywgbmV4dF9maWZvKTsKKwkJYWhkX291dGIoYWhkLCBERkNOVFJMLAorCQkJIGFoZF9pbmIoYWhkLCBERkNOVFJMKSAmIH4oU0NTSUVOfEhETUFFTikpOworCQl3aGlsZSAoKGFoZF9pbmIoYWhkLCBERkNOVFJMKSAmIEhETUFFTkFDSykgIT0gMCkKKwkJCWFoZF9kZWxheSgxMCk7CisJCS8qCisJCSAqIFNldCBDVVJSRklGTyB0byB0aGUgbm93IGluYWN0aXZlIGNoYW5uZWwuCisJCSAqLworCQlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJCWFoZF9vdXRiKGFoZCwgREZGU1RBVCwgbmV4dF9maWZvKTsKKwl9IHdoaWxlIChuZXh0X2ZpZm8gIT0gZmlmbyk7CisKKwkvKgorCSAqIFJlc2V0IHRoZSBidXMgaWYgd2UgYXJlIGluaXRpYXRpbmcgdGhpcyByZXNldAorCSAqLworCWFoZF9jbGVhcl9tc2dfc3RhdGUoYWhkKTsKKwlhaGRfb3V0YihhaGQsIFNJTU9ERTEsCisJCSBhaGRfaW5iKGFoZCwgU0lNT0RFMSkgJiB+KEVOQlVTRlJFRXxFTlNDU0lSU1R8RU5CVVNGUkVFKSk7CisKKwlpZiAoaW5pdGlhdGVfcmVzZXQpCisJCWFoZF9yZXNldF9jdXJyZW50X2J1cyhhaGQpOworCisJYWhkX2NsZWFyX2ludHN0YXQoYWhkKTsKKworCS8qCisJICogQ2xlYW4gdXAgYWxsIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgdGhlCisJICogcGVuZGluZyB0cmFuc2FjdGlvbnMgb24gdGhpcyBidXMuCisJICovCisJZm91bmQgPSBhaGRfYWJvcnRfc2NicyhhaGQsIENBTV9UQVJHRVRfV0lMRENBUkQsIGNoYW5uZWwsCisJCQkgICAgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgU0NCX0xJU1RfTlVMTCwKKwkJCSAgICAgICBST0xFX1VOS05PV04sIENBTV9TQ1NJX0JVU19SRVNFVCk7CisKKwkvKgorCSAqIENsZWFudXAgYW55dGhpbmcgbGVmdCBpbiB0aGUgRklGT3MuCisJICovCisJYWhkX2NsZWFyX2ZpZm8oYWhkLCAwKTsKKwlhaGRfY2xlYXJfZmlmbyhhaGQsIDEpOworCisJLyoKKwkgKiBSZXZlcnQgdG8gYXN5bmMvbmFycm93IHRyYW5zZmVycyB1bnRpbCB3ZSByZW5lZ290aWF0ZS4KKwkgKi8KKwltYXhfc2NzaWlkID0gKGFoZC0+ZmVhdHVyZXMgJiBBSERfV0lERSkgPyAxNSA6IDc7CisJZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPD0gbWF4X3Njc2lpZDsgdGFyZ2V0KyspIHsKKworCQlpZiAoYWhkLT5lbmFibGVkX3RhcmdldHNbdGFyZ2V0XSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWZvciAoaW5pdGlhdG9yID0gMDsgaW5pdGlhdG9yIDw9IG1heF9zY3NpaWQ7IGluaXRpYXRvcisrKSB7CisJCQlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKKworCQkJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywgdGFyZ2V0LCBpbml0aWF0b3IsCisJCQkJCSAgICBDQU1fTFVOX1dJTERDQVJELAorCQkJCQkgICAgJ0EnLCBST0xFX1VOS05PV04pOworCQkJYWhkX3NldF93aWR0aChhaGQsICZkZXZpbmZvLCBNU0dfRVhUX1dEVFJfQlVTXzhfQklULAorCQkJCSAgICAgIEFIRF9UUkFOU19DVVIsIC8qcGF1c2VkKi9UUlVFKTsKKwkJCWFoZF9zZXRfc3luY3JhdGUoYWhkLCAmZGV2aW5mbywgLypwZXJpb2QqLzAsCisJCQkJCSAvKm9mZnNldCovMCwgLypwcHJfb3B0aW9ucyovMCwKKwkJCQkJIEFIRF9UUkFOU19DVVIsIC8qcGF1c2VkKi9UUlVFKTsKKwkJfQorCX0KKworI2lmZGVmIEFIRF9UQVJHRVRfTU9ERQorCW1heF9zY3NpaWQgPSAoYWhkLT5mZWF0dXJlcyAmIEFIRF9XSURFKSA/IDE1IDogNzsKKworCS8qCisJICogU2VuZCBhbiBpbW1lZGlhdGUgbm90aWZ5IGNjYiB0byBhbGwgdGFyZ2V0IG1vcmUgcGVyaXBoZXJhbAorCSAqIGRyaXZlcnMgYWZmZWN0ZWQgYnkgdGhpcyBhY3Rpb24uCisJICovCisJZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPD0gbWF4X3Njc2lpZDsgdGFyZ2V0KyspIHsKKwkJc3RydWN0IGFoZF90bW9kZV90c3RhdGUqIHRzdGF0ZTsKKwkJdV9pbnQgbHVuOworCisJCXRzdGF0ZSA9IGFoZC0+ZW5hYmxlZF90YXJnZXRzW3RhcmdldF07CisJCWlmICh0c3RhdGUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGx1biA9IDA7IGx1biA8IEFIRF9OVU1fTFVOUzsgbHVuKyspIHsKKwkJCXN0cnVjdCBhaGRfdG1vZGVfbHN0YXRlKiBsc3RhdGU7CisKKwkJCWxzdGF0ZSA9IHRzdGF0ZS0+ZW5hYmxlZF9sdW5zW2x1bl07CisJCQlpZiAobHN0YXRlID09IE5VTEwpCisJCQkJY29udGludWU7CisKKwkJCWFoZF9xdWV1ZV9sc3RhdGVfZXZlbnQoYWhkLCBsc3RhdGUsIENBTV9UQVJHRVRfV0lMRENBUkQsCisJCQkJCSAgICAgICBFVkVOVF9UWVBFX0JVU19SRVNFVCwgLyphcmcqLzApOworCQkJYWhkX3NlbmRfbHN0YXRlX2V2ZW50cyhhaGQsIGxzdGF0ZSk7CisJCX0KKwl9CisjZW5kaWYKKwkvKiBOb3RpZnkgdGhlIFhQVCB0aGF0IGEgYnVzIHJlc2V0IG9jY3VycmVkICovCisJYWhkX3NlbmRfYXN5bmMoYWhkLCBkZXZpbmZvLmNoYW5uZWwsIENBTV9UQVJHRVRfV0lMRENBUkQsCisJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBBQ19CVVNfUkVTRVQsIE5VTEwpOworCWFoZF9yZXN0YXJ0KGFoZCk7CisJLyoKKwkgKiBGcmVlemUgdGhlIFNJTVEgdW50aWwgb3VyIHBvbGxlciBjYW4gZGV0ZXJtaW5lIHRoYXQKKwkgKiB0aGUgYnVzIHJlc2V0IGhhcyByZWFsbHkgZ29uZSBhd2F5LiAgV2Ugc2V0IHRoZSBpbml0aWFsCisJICogdGltZXIgdG8gMCB0byBoYXZlIHRoZSBjaGVjayBwZXJmb3JtZWQgYXMgc29vbiBhcyBwb3NzaWJsZQorCSAqIGZyb20gdGhlIHRpbWVyIGNvbnRleHQuCisJICovCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX1JFU0VUX1BPTExfQUNUSVZFKSA9PSAwKSB7CisJCWFoZC0+ZmxhZ3MgfD0gQUhEX1JFU0VUX1BPTExfQUNUSVZFOworCQlhaGRfZnJlZXplX3NpbXEoYWhkKTsKKwkJYWhkX3RpbWVyX3Jlc2V0KCZhaGQtPnJlc2V0X3RpbWVyLCAwLCBhaGRfcmVzZXRfcG9sbCwgYWhkKTsKKwl9CisJcmV0dXJuIChmb3VuZCk7Cit9CisKKworI2RlZmluZSBBSERfUkVTRVRfUE9MTF9VUyAxMDAwCitzdGF0aWMgdm9pZAorYWhkX3Jlc2V0X3BvbGwodm9pZCAqYXJnKQoreworCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKKwl1X2ludAlzY3Npc2VxMTsKKwl1X2xvbmcJbDsKKwl1X2xvbmcJczsKKwkKKwlhaGRfbGlzdF9sb2NrKCZsKTsKKwlhaGQgPSBhaGRfZmluZF9zb2Z0Yygoc3RydWN0IGFoZF9zb2Z0YyAqKWFyZyk7CisJaWYgKGFoZCA9PSBOVUxMKSB7CisJCXByaW50ZigiYWhkX3Jlc2V0X3BvbGw6IEluc3RhbmNlICVwIG5vIGxvbmdlciBleGlzdHNcbiIsIGFyZyk7CisJCWFoZF9saXN0X3VubG9jaygmbCk7CisJCXJldHVybjsKKwl9CisJYWhkX2xvY2soYWhkLCAmcyk7CisJYWhkX3BhdXNlKGFoZCk7CisJYWhkX3VwZGF0ZV9tb2RlcyhhaGQpOworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKwlhaGRfb3V0YihhaGQsIENMUlNJTlQxLCBDTFJTQ1NJUlNUSSk7CisJaWYgKChhaGRfaW5iKGFoZCwgU1NUQVQxKSAmIFNDU0lSU1RJKSAhPSAwKSB7CisJCWFoZF90aW1lcl9yZXNldCgmYWhkLT5yZXNldF90aW1lciwgQUhEX1JFU0VUX1BPTExfVVMsCisJCQkJYWhkX3Jlc2V0X3BvbGwsIGFoZCk7CisJCWFoZF91bnBhdXNlKGFoZCk7CisJCWFoZF91bmxvY2soYWhkLCAmcyk7CisJCWFoZF9saXN0X3VubG9jaygmbCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBSZXNldCBpcyBub3cgbG93LiAgQ29tcGxldGUgY2hpcCByZWluaXRpYWxpemF0aW9uLiAqLworCWFoZF9vdXRiKGFoZCwgU0lNT0RFMSwgYWhkX2luYihhaGQsIFNJTU9ERTEpIHwgRU5TQ1NJUlNUKTsKKwlzY3Npc2VxMSA9IGFoZF9pbmIoYWhkLCBTQ1NJU0VRX1RFTVBMQVRFKTsKKwlhaGRfb3V0YihhaGQsIFNDU0lTRVExLCBzY3Npc2VxMSAmIChFTlNFTEl8RU5SU0VMSXxFTkFVVE9BVE5QKSk7CisJYWhkX3VucGF1c2UoYWhkKTsKKwlhaGQtPmZsYWdzICY9IH5BSERfUkVTRVRfUE9MTF9BQ1RJVkU7CisJYWhkX3VubG9jayhhaGQsICZzKTsKKwlhaGRfcmVsZWFzZV9zaW1xKGFoZCk7CisJYWhkX2xpc3RfdW5sb2NrKCZsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU3RhdGlzdGljcyBQcm9jZXNzaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaGRfc3RhdF90aW1lcih2b2lkICphcmcpCit7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkOworCXVfbG9uZwlsOworCXVfbG9uZwlzOworCWludAllbmludF9jb2FsOworCQorCWFoZF9saXN0X2xvY2soJmwpOworCWFoZCA9IGFoZF9maW5kX3NvZnRjKChzdHJ1Y3QgYWhkX3NvZnRjICopYXJnKTsKKwlpZiAoYWhkID09IE5VTEwpIHsKKwkJcHJpbnRmKCJhaGRfc3RhdF90aW1lcjogSW5zdGFuY2UgJXAgbm8gbG9uZ2VyIGV4aXN0c1xuIiwgYXJnKTsKKwkJYWhkX2xpc3RfdW5sb2NrKCZsKTsKKwkJcmV0dXJuOworCX0KKwlhaGRfbG9jayhhaGQsICZzKTsKKworCWVuaW50X2NvYWwgPSBhaGQtPmhzX21haWxib3ggJiBFTklOVF9DT0FMRVNDRTsKKwlpZiAoYWhkLT5jbWRjbXBsdF90b3RhbCA+IGFoZC0+aW50X2NvYWxlc2NpbmdfdGhyZXNob2xkKQorCQllbmludF9jb2FsIHw9IEVOSU5UX0NPQUxFU0NFOworCWVsc2UgaWYgKGFoZC0+Y21kY21wbHRfdG90YWwgPCBhaGQtPmludF9jb2FsZXNjaW5nX3N0b3BfdGhyZXNob2xkKQorCQllbmludF9jb2FsICY9IH5FTklOVF9DT0FMRVNDRTsKKworCWlmIChlbmludF9jb2FsICE9IChhaGQtPmhzX21haWxib3ggJiBFTklOVF9DT0FMRVNDRSkpIHsKKwkJYWhkX2VuYWJsZV9jb2FsZXNjaW5nKGFoZCwgZW5pbnRfY29hbCk7CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfSU5UX0NPQUxFU0NJTkcpICE9IDApCisJCQlwcmludGYoIiVzOiBJbnRlcnJ1cHQgY29hbGVzY2luZyAiCisJCQkgICAgICAgIm5vdyAlc2FibGVkLiBDbWRzICVkXG4iLAorCQkJICAgICAgIGFoZF9uYW1lKGFoZCksCisJCQkgICAgICAgKGVuaW50X2NvYWwgJiBFTklOVF9DT0FMRVNDRSkgPyAiZW4iIDogImRpcyIsCisJCQkgICAgICAgYWhkLT5jbWRjbXBsdF90b3RhbCk7CisjZW5kaWYKKwl9CisKKwlhaGQtPmNtZGNtcGx0X2J1Y2tldCA9IChhaGQtPmNtZGNtcGx0X2J1Y2tldCsxKSAmIChBSERfU1RBVF9CVUNLRVRTLTEpOworCWFoZC0+Y21kY21wbHRfdG90YWwgLT0gYWhkLT5jbWRjbXBsdF9jb3VudHNbYWhkLT5jbWRjbXBsdF9idWNrZXRdOworCWFoZC0+Y21kY21wbHRfY291bnRzW2FoZC0+Y21kY21wbHRfYnVja2V0XSA9IDA7CisJYWhkX3RpbWVyX3Jlc2V0KCZhaGQtPnN0YXRfdGltZXIsIEFIRF9TVEFUX1VQREFURV9VUywKKwkJCWFoZF9zdGF0X3RpbWVyLCBhaGQpOworCWFoZF91bmxvY2soYWhkLCAmcyk7CisJYWhkX2xpc3RfdW5sb2NrKCZsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTdGF0dXMgUHJvY2Vzc2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2FoZF9oYW5kbGVfc2NiX3N0YXR1cyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlpZiAoc2NiLT5oc2NiLT5zaGFyZWRfZGF0YS5pc3RhdHVzLnNjc2lfc3RhdHVzICE9IDApIHsKKwkJYWhkX2hhbmRsZV9zY3NpX3N0YXR1cyhhaGQsIHNjYik7CisJfSBlbHNlIHsKKwkJYWhkX2NhbGNfcmVzaWR1YWwoYWhkLCBzY2IpOworCQlhaGRfZG9uZShhaGQsIHNjYik7CisJfQorfQorCit2b2lkCithaGRfaGFuZGxlX3Njc2lfc3RhdHVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXN0cnVjdCBoYXJkd2FyZV9zY2IgKmhzY2I7CisJdV9pbnQgIHFmcmVlemVfY250OworCisJLyoKKwkgKiBUaGUgc2VxdWVuY2VyIGZyZWV6ZXMgaXRzIHNlbGVjdC1vdXQgcXVldWUKKwkgKiBhbnl0aW1lIGEgU0NTSSBzdGF0dXMgZXJyb3Igb2NjdXJzLiAgV2UgbXVzdAorCSAqIGhhbmRsZSB0aGUgZXJyb3IgYW5kIGRlY3JlbWVudCB0aGUgUUZSRUVaRSBjb3VudAorCSAqIHRvIGFsbG93IHRoZSBzZXF1ZW5jZXIgdG8gY29udGludWUuCisJICovCisJaHNjYiA9IHNjYi0+aHNjYjsgCisKKwkvKiBGcmVlemUgdGhlIHF1ZXVlIHVudGlsIHRoZSBjbGllbnQgc2VlcyB0aGUgZXJyb3IuICovCisJYWhkX2ZyZWV6ZV9kZXZxKGFoZCwgc2NiKTsKKwlhaGRfZnJlZXplX3NjYihzY2IpOworCXFmcmVlemVfY250ID0gYWhkX2ludyhhaGQsIFFGUkVFWkVfQ09VTlQpOworCWlmIChxZnJlZXplX2NudCA9PSAwKSB7CisJCXByaW50ZigiJXM6IEJhZCBzdGF0dXMgd2l0aCAwIHFmcmVlemUgY291bnQhXG4iLCBhaGRfbmFtZShhaGQpKTsKKwl9IGVsc2UgeworCQlxZnJlZXplX2NudC0tOworCQlhaGRfb3V0dyhhaGQsIFFGUkVFWkVfQ09VTlQsIHFmcmVlemVfY250KTsKKwl9CisJaWYgKHFmcmVlemVfY250ID09IDApCisJCWFoZF9vdXRiKGFoZCwgU0VRX0ZMQUdTMiwKKwkJCSBhaGRfaW5iKGFoZCwgU0VRX0ZMQUdTMikgJiB+U0VMRUNUT1VUX1FGUk9aRU4pOworCisJLyogRG9uJ3Qgd2FudCB0byBjbG9iYmVyIHRoZSBvcmlnaW5hbCBzZW5zZSBjb2RlICovCisJaWYgKChzY2ItPmZsYWdzICYgU0NCX1NFTlNFKSAhPSAwKSB7CisJCS8qCisJCSAqIENsZWFyIHRoZSBTQ0JfU0VOU0UgRmxhZyBhbmQgcGVyZm9ybQorCQkgKiBhIG5vcm1hbCBjb21tYW5kIGNvbXBsZXRpb24uCisJCSAqLworCQlzY2ItPmZsYWdzICY9IH5TQ0JfU0VOU0U7CisJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX0FVVE9TRU5TRV9GQUlMKTsKKwkJYWhkX2RvbmUoYWhkLCBzY2IpOworCQlyZXR1cm47CisJfQorCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX1NDU0lfU1RBVFVTX0VSUk9SKTsKKwlhaGRfc2V0X3Njc2lfc3RhdHVzKHNjYiwgaHNjYi0+c2hhcmVkX2RhdGEuaXN0YXR1cy5zY3NpX3N0YXR1cyk7CisJc3dpdGNoIChoc2NiLT5zaGFyZWRfZGF0YS5pc3RhdHVzLnNjc2lfc3RhdHVzKSB7CisJY2FzZSBTVEFUVVNfUEtUX1NFTlNFOgorCXsKKwkJc3RydWN0IHNjc2lfc3RhdHVzX2l1X2hlYWRlciAqc2l1OworCisJCWFoZF9zeW5jX3NlbnNlKGFoZCwgc2NiLCBCVVNfRE1BU1lOQ19QT1NUUkVBRCk7CisJCXNpdSA9IChzdHJ1Y3Qgc2NzaV9zdGF0dXNfaXVfaGVhZGVyICopc2NiLT5zZW5zZV9kYXRhOworCQlhaGRfc2V0X3Njc2lfc3RhdHVzKHNjYiwgc2l1LT5zdGF0dXMpOworI2lmZGVmIEFIRF9ERUJVRworCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1NFTlNFKSAhPSAwKSB7CisJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQlwcmludGYoIlNDQiAweCV4IFJlY2VpdmVkIFBLVCBTdGF0dXMgb2YgMHgleFxuIiwKKwkJCSAgICAgICBTQ0JfR0VUX1RBRyhzY2IpLCBzaXUtPnN0YXR1cyk7CisJCQlwcmludGYoIlx0ZmxhZ3MgPSAweCV4LCBzZW5zZSBsZW4gPSAweCV4LCAiCisJCQkgICAgICAgInBrdGZhaWwgPSAweCV4XG4iLAorCQkJICAgICAgIHNpdS0+ZmxhZ3MsIHNjc2lfNGJ0b3VsKHNpdS0+c2Vuc2VfbGVuZ3RoKSwKKwkJCSAgICAgICBzY3NpXzRidG91bChzaXUtPnBrdF9mYWlsdXJlc19sZW5ndGgpKTsKKwkJfQorI2VuZGlmCisJCWlmICgoc2l1LT5mbGFncyAmIFNJVV9SU1BWQUxJRCkgIT0gMCkgeworCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQkJaWYgKHNjc2lfNGJ0b3VsKHNpdS0+cGt0X2ZhaWx1cmVzX2xlbmd0aCkgPCA0KSB7CisJCQkJcHJpbnRmKCJVbmFibGUgdG8gcGFyc2UgcGt0X2ZhaWx1cmVzXG4iKTsKKwkJCX0gZWxzZSB7CisKKwkJCQlzd2l0Y2ggKFNJVV9QS1RGQUlMX0NPREUoc2l1KSkgeworCQkJCWNhc2UgU0lVX1BGQ19OT05FOgorCQkJCQlwcmludGYoIk5vIHBhY2tldCBmYWlsdXJlIGZvdW5kXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTSVVfUEZDX0NJVV9GSUVMRFNfSU5WQUxJRDoKKwkJCQkJcHJpbnRmKCJJbnZhbGlkIENvbW1hbmQgSVUgRmllbGRcbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNJVV9QRkNfVE1GX05PVF9TVVBQT1JURUQ6CisJCQkJCXByaW50ZigiVE1GIG5vdCBzdXBwb3J0ZFxuIik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0lVX1BGQ19UTUZfRkFJTEVEOgorCQkJCQlwcmludGYoIlRNRiBmYWlsZWRcbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNJVV9QRkNfSU5WQUxJRF9UWVBFX0NPREU6CisJCQkJCXByaW50ZigiSW52YWxpZCBMX1EgVHlwZSBjb2RlXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTSVVfUEZDX0lMTEVHQUxfUkVRVUVTVDoKKwkJCQkJcHJpbnRmKCJJbGxlZ2FsIHJlcXVlc3RcbiIpOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChzaXUtPnN0YXR1cyA9PSBTQ1NJX1NUQVRVU19PSykKKwkJCQlhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsCisJCQkJCQkJICAgQ0FNX1JFUV9DTVBfRVJSKTsKKwkJfQorCQlpZiAoKHNpdS0+ZmxhZ3MgJiBTSVVfU05TVkFMSUQpICE9IDApIHsKKwkJCXNjYi0+ZmxhZ3MgfD0gU0NCX1BLVF9TRU5TRTsKKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfU0VOU0UpICE9IDApCisJCQkJcHJpbnRmKCJTZW5zZSBkYXRhIGF2YWlsYWJsZVxuIik7CisjZW5kaWYKKwkJfQorCQlhaGRfZG9uZShhaGQsIHNjYik7CisJCWJyZWFrOworCX0KKwljYXNlIFNDU0lfU1RBVFVTX0NNRF9URVJNSU5BVEVEOgorCWNhc2UgU0NTSV9TVEFUVVNfQ0hFQ0tfQ09ORDoKKwl7CisJCXN0cnVjdCBhaGRfZGV2aW5mbyBkZXZpbmZvOworCQlzdHJ1Y3QgYWhkX2RtYV9zZWcgKnNnOworCQlzdHJ1Y3Qgc2NzaV9zZW5zZSAqc2M7CisJCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0YXJnX2luZm87CisJCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJCXN0cnVjdCBhaGRfdHJhbnNpbmZvICp0aW5mbzsKKyNpZmRlZiBBSERfREVCVUcKKwkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1NFTlNFKSB7CisJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQlwcmludGYoIlNDQiAlZDogcmVxdWVzdHMgQ2hlY2sgU3RhdHVzXG4iLAorCQkJICAgICAgIFNDQl9HRVRfVEFHKHNjYikpOworCQl9CisjZW5kaWYKKworCQlpZiAoYWhkX3BlcmZvcm1fYXV0b3NlbnNlKHNjYikgPT0gMCkKKwkJCWJyZWFrOworCisJCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIFNDQl9HRVRfT1VSX0lEKHNjYiksCisJCQkJICAgIFNDQl9HRVRfVEFSR0VUKGFoZCwgc2NiKSwKKwkJCQkgICAgU0NCX0dFVF9MVU4oc2NiKSwKKwkJCQkgICAgU0NCX0dFVF9DSEFOTkVMKGFoZCwgc2NiKSwKKwkJCQkgICAgUk9MRV9JTklUSUFUT1IpOworCQl0YXJnX2luZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwKKwkJCQkJCWRldmluZm8uY2hhbm5lbCwKKwkJCQkJCWRldmluZm8ub3VyX3Njc2lpZCwKKwkJCQkJCWRldmluZm8udGFyZ2V0LAorCQkJCQkJJnRzdGF0ZSk7CisJCXRpbmZvID0gJnRhcmdfaW5mby0+Y3VycjsKKwkJc2cgPSBzY2ItPnNnX2xpc3Q7CisJCXNjID0gKHN0cnVjdCBzY3NpX3NlbnNlICopaHNjYi0+c2hhcmVkX2RhdGEuaWRhdGEuY2RiOworCQkvKgorCQkgKiBTYXZlIG9mZiB0aGUgcmVzaWR1YWwgaWYgdGhlcmUgaXMgb25lLgorCQkgKi8KKwkJYWhkX3VwZGF0ZV9yZXNpZHVhbChhaGQsIHNjYik7CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19TRU5TRSkgeworCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQkJcHJpbnRmKCJTZW5kaW5nIFNlbnNlXG4iKTsKKwkJfQorI2VuZGlmCisJCXNjYi0+c2dfY291bnQgPSAwOworCQlzZyA9IGFoZF9zZ19zZXR1cChhaGQsIHNjYiwgc2csIGFoZF9nZXRfc2Vuc2VfYnVmYWRkcihhaGQsIHNjYiksCisJCQkJICBhaGRfZ2V0X3NlbnNlX2J1ZnNpemUoYWhkLCBzY2IpLAorCQkJCSAgLypsYXN0Ki9UUlVFKTsKKwkJc2MtPm9wY29kZSA9IFJFUVVFU1RfU0VOU0U7CisJCXNjLT5ieXRlMiA9IDA7CisJCWlmICh0aW5mby0+cHJvdG9jb2xfdmVyc2lvbiA8PSBTQ1NJX1JFVl8yCisJCSAmJiBTQ0JfR0VUX0xVTihzY2IpIDwgOCkKKwkJCXNjLT5ieXRlMiA9IFNDQl9HRVRfTFVOKHNjYikgPDwgNTsKKwkJc2MtPnVudXNlZFswXSA9IDA7CisJCXNjLT51bnVzZWRbMV0gPSAwOworCQlzYy0+bGVuZ3RoID0gYWhkX2dldF9zZW5zZV9idWZzaXplKGFoZCwgc2NiKTsKKwkJc2MtPmNvbnRyb2wgPSAwOworCisJCS8qCisJCSAqIFdlIGNhbid0IGFsbG93IHRoZSB0YXJnZXQgdG8gZGlzY29ubmVjdC4KKwkJICogVGhpcyB3aWxsIGJlIGFuIHVudGFnZ2VkIHRyYW5zYWN0aW9uIGFuZAorCQkgKiBoYXZpbmcgdGhlIHRhcmdldCBkaXNjb25uZWN0IHdpbGwgbWFrZSB0aGlzCisJCSAqIHRyYW5zYWN0aW9uIGluZGVzdGluZ3Vpc2hhYmxlIGZyb20gb3V0c3RhbmRpbmcKKwkJICogdGFnZ2VkIHRyYW5zYWN0aW9ucy4KKwkJICovCisJCWhzY2ItPmNvbnRyb2wgPSAwOworCisJCS8qCisJCSAqIFRoaXMgcmVxdWVzdCBzZW5zZSBjb3VsZCBiZSBiZWNhdXNlIHRoZQorCQkgKiB0aGUgZGV2aWNlIGxvc3QgcG93ZXIgb3IgaW4gc29tZSBvdGhlcgorCQkgKiB3YXkgaGFzIGxvc3Qgb3VyIHRyYW5zZmVyIG5lZ290aWF0aW9ucy4KKwkJICogUmVuZWdvdGlhdGUgaWYgYXBwcm9wcmlhdGUuICBVbml0IGF0dGVudGlvbgorCQkgKiBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZCBiZWZvcmUgYW55IGRhdGEKKwkJICogcGhhc2VzIG9jY3VyLgorCQkgKi8KKwkJaWYgKGFoZF9nZXRfcmVzaWR1YWwoc2NiKSA9PSBhaGRfZ2V0X3RyYW5zZmVyX2xlbmd0aChzY2IpKSB7CisJCQlhaGRfdXBkYXRlX25lZ19yZXF1ZXN0KGFoZCwgJmRldmluZm8sCisJCQkJCSAgICAgICB0c3RhdGUsIHRhcmdfaW5mbywKKwkJCQkJICAgICAgIEFIRF9ORUdfSUZfTk9OX0FTWU5DKTsKKwkJfQorCQlpZiAodHN0YXRlLT5hdXRvX25lZ290aWF0ZSAmIGRldmluZm8udGFyZ2V0X21hc2spIHsKKwkJCWhzY2ItPmNvbnRyb2wgfD0gTUtfTUVTU0FHRTsKKwkJCXNjYi0+ZmxhZ3MgJj0KKwkJCSAgICB+KFNDQl9ORUdPVElBVEV8U0NCX0FCT1JUfFNDQl9ERVZJQ0VfUkVTRVQpOworCQkJc2NiLT5mbGFncyB8PSBTQ0JfQVVUT19ORUdPVElBVEU7CisJCX0KKwkJaHNjYi0+Y2RiX2xlbiA9IHNpemVvZigqc2MpOworCQlhaGRfc2V0dXBfZGF0YV9zY2IoYWhkLCBzY2IpOworCQlzY2ItPmZsYWdzIHw9IFNDQl9TRU5TRTsKKwkJYWhkX3F1ZXVlX3NjYihhaGQsIHNjYik7CisJCS8qCisJCSAqIEVuc3VyZSB3ZSBoYXZlIGVub3VnaCB0aW1lIHRvIGFjdHVhbGx5CisJCSAqIHJldHJpZXZlIHRoZSBzZW5zZS4KKwkJICovCisJCWFoZF9zY2JfdGltZXJfcmVzZXQoc2NiLCA1ICogMTAwMDAwMCk7CisJCWJyZWFrOworCX0KKwljYXNlIFNDU0lfU1RBVFVTX09LOgorCQlwcmludGYoIiVzOiBJbnRlcnJ1cHRlZCBmb3Igc3RhdXMgb2YgMD8/P1xuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCkpOworCQkvKiBGQUxMVEhST1VHSCAqLworCWRlZmF1bHQ6CisJCWFoZF9kb25lKGFoZCwgc2NiKTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSByZXNpZHVhbCBmb3IgYSBqdXN0IGNvbXBsZXRlZCBTQ0IuCisgKi8KK3ZvaWQKK2FoZF9jYWxjX3Jlc2lkdWFsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXN0cnVjdCBoYXJkd2FyZV9zY2IgKmhzY2I7CisJc3RydWN0IGluaXRpYXRvcl9zdGF0dXMgKnNwa3Q7CisJdWludDMyX3Qgc2dwdHI7CisJdWludDMyX3QgcmVzaWRfc2dwdHI7CisJdWludDMyX3QgcmVzaWQ7CisKKwkvKgorCSAqIDUgY2FzZXMuCisJICogMSkgTm8gcmVzaWR1YWwuCisJICogICAgU0dfU1RBVFVTX1ZBTElEIGNsZWFyIGluIHNncHRyLgorCSAqIDIpIFRyYW5zZmVybGVzcyBjb21tYW5kCisJICogMykgTmV2ZXIgcGVyZm9ybWVkIGFueSB0cmFuc2ZlcnMuCisJICogICAgc2dwdHIgaGFzIFNHX0ZVTExfUkVTSUQgc2V0LgorCSAqIDQpIE5vIHJlc2lkdWFsIGJ1dCB0YXJnZXQgZGlkIG5vdAorCSAqICAgIHNhdmUgZGF0YSBwb2ludGVycyBhZnRlciB0aGUKKwkgKiAgICBsYXN0IHRyYW5zZmVyLCBzbyBzZ3B0ciB3YXMKKwkgKiAgICBuZXZlciB1cGRhdGVkLgorCSAqIDUpIFdlIGhhdmUgYSBwYXJ0aWFsIHJlc2lkdWFsLgorCSAqICAgIFVzZSByZXNpZHVhbF9zZ3B0ciB0byBkZXRlcm1pbmUKKwkgKiAgICB3aGVyZSB3ZSBhcmUuCisJICovCisKKwloc2NiID0gc2NiLT5oc2NiOworCXNncHRyID0gYWhkX2xlMzJ0b2goaHNjYi0+c2dwdHIpOworCWlmICgoc2dwdHIgJiBTR19TVEFUVVNfVkFMSUQpID09IDApCisJCS8qIENhc2UgMSAqLworCQlyZXR1cm47CisJc2dwdHIgJj0gflNHX1NUQVRVU19WQUxJRDsKKworCWlmICgoc2dwdHIgJiBTR19MSVNUX05VTEwpICE9IDApCisJCS8qIENhc2UgMiAqLworCQlyZXR1cm47CisKKwkvKgorCSAqIFJlc2lkdWFsIGZpZWxkcyBhcmUgdGhlIHNhbWUgaW4gYm90aAorCSAqIHRhcmdldCBhbmQgaW5pdGlhdG9yIHN0YXR1cyBwYWNrZXRzLAorCSAqIHNvIHdlIGNhbiBhbHdheXMgdXNlIHRoZSBpbml0aWF0b3IgZmllbGRzCisJICogcmVnYXJkbGVzcyBvZiB0aGUgcm9sZSBmb3IgdGhpcyBTQ0IuCisJICovCisJc3BrdCA9ICZoc2NiLT5zaGFyZWRfZGF0YS5pc3RhdHVzOworCXJlc2lkX3NncHRyID0gYWhkX2xlMzJ0b2goc3BrdC0+cmVzaWR1YWxfc2dwdHIpOworCWlmICgoc2dwdHIgJiBTR19GVUxMX1JFU0lEKSAhPSAwKSB7CisJCS8qIENhc2UgMyAqLworCQlyZXNpZCA9IGFoZF9nZXRfdHJhbnNmZXJfbGVuZ3RoKHNjYik7CisJfSBlbHNlIGlmICgocmVzaWRfc2dwdHIgJiBTR19MSVNUX05VTEwpICE9IDApIHsKKwkJLyogQ2FzZSA0ICovCisJCXJldHVybjsKKwl9IGVsc2UgaWYgKChyZXNpZF9zZ3B0ciAmIFNHX09WRVJSVU5fUkVTSUQpICE9IDApIHsKKwkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQlwcmludGYoImRhdGEgb3ZlcnJ1biBkZXRlY3RlZCBUYWcgPT0gMHgleC5cbiIsCisJCSAgICAgICBTQ0JfR0VUX1RBRyhzY2IpKTsKKwkJYWhkX2ZyZWV6ZV9kZXZxKGFoZCwgc2NiKTsKKwkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fREFUQV9SVU5fRVJSKTsKKwkJYWhkX2ZyZWV6ZV9zY2Ioc2NiKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoKHJlc2lkX3NncHRyICYgflNHX1BUUl9NQVNLKSAhPSAwKSB7CisJCXBhbmljKCJCb2d1cyByZXNpZCBzZ3B0ciB2YWx1ZSAweCV4XG4iLCByZXNpZF9zZ3B0cik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9IGVsc2UgeworCQlzdHJ1Y3QgYWhkX2RtYV9zZWcgKnNnOworCisJCS8qCisJCSAqIFJlbWFpbmRlciBvZiB0aGUgU0cgd2hlcmUgdGhlIHRyYW5zZmVyCisJCSAqIHN0b3BwZWQuICAKKwkJICovCisJCXJlc2lkID0gYWhkX2xlMzJ0b2goc3BrdC0+cmVzaWR1YWxfZGF0YWNudCkgJiBBSERfU0dfTEVOX01BU0s7CisJCXNnID0gYWhkX3NnX2J1c190b192aXJ0KGFoZCwgc2NiLCByZXNpZF9zZ3B0ciAmIFNHX1BUUl9NQVNLKTsKKworCQkvKiBUaGUgcmVzaWR1YWwgc2dfcHRyIGFsd2F5cyBwb2ludHMgdG8gdGhlIG5leHQgc2cgKi8KKwkJc2ctLTsKKworCQkvKgorCQkgKiBBZGQgdXAgdGhlIGNvbnRlbnRzIG9mIGFsbCByZXNpZHVhbAorCQkgKiBTRyBzZWdtZW50cyB0aGF0IGFyZSBhZnRlciB0aGUgU0cgd2hlcmUKKwkJICogdGhlIHRyYW5zZmVyIHN0b3BwZWQuCisJCSAqLworCQl3aGlsZSAoKGFoZF9sZTMydG9oKHNnLT5sZW4pICYgQUhEX0RNQV9MQVNUX1NFRykgPT0gMCkgeworCQkJc2crKzsKKwkJCXJlc2lkICs9IGFoZF9sZTMydG9oKHNnLT5sZW4pICYgQUhEX1NHX0xFTl9NQVNLOworCQl9CisJfQorCWlmICgoc2NiLT5mbGFncyAmIFNDQl9TRU5TRSkgPT0gMCkKKwkJYWhkX3NldF9yZXNpZHVhbChzY2IsIHJlc2lkKTsKKwllbHNlCisJCWFoZF9zZXRfc2Vuc2VfcmVzaWR1YWwoc2NiLCByZXNpZCk7CisKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01JU0MpICE9IDApIHsKKwkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQlwcmludGYoIkhhbmRsZWQgJXNSZXNpZHVhbCBvZiAlZCBieXRlc1xuIiwKKwkJICAgICAgIChzY2ItPmZsYWdzICYgU0NCX1NFTlNFKSA/ICJTZW5zZSAiIDogIiIsIHJlc2lkKTsKKwl9CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVGFyZ2V0IE1vZGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBBSERfVEFSR0VUX01PREUKKy8qCisgKiBBZGQgYSB0YXJnZXQgbW9kZSBldmVudCB0byB0aGlzIGx1bidzIHF1ZXVlCisgKi8KK3N0YXRpYyB2b2lkCithaGRfcXVldWVfbHN0YXRlX2V2ZW50KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF90bW9kZV9sc3RhdGUgKmxzdGF0ZSwKKwkJICAgICAgIHVfaW50IGluaXRpYXRvcl9pZCwgdV9pbnQgZXZlbnRfdHlwZSwgdV9pbnQgZXZlbnRfYXJnKQoreworCXN0cnVjdCBhaGRfdG1vZGVfZXZlbnQgKmV2ZW50OworCWludCBwZW5kaW5nOworCisJeHB0X2ZyZWV6ZV9kZXZxKGxzdGF0ZS0+cGF0aCwgLypjb3VudCovMSk7CisJaWYgKGxzdGF0ZS0+ZXZlbnRfd19pZHggPj0gbHN0YXRlLT5ldmVudF9yX2lkeCkKKwkJcGVuZGluZyA9IGxzdGF0ZS0+ZXZlbnRfd19pZHggLSBsc3RhdGUtPmV2ZW50X3JfaWR4OworCWVsc2UKKwkJcGVuZGluZyA9IEFIRF9UTU9ERV9FVkVOVF9CVUZGRVJfU0laRSArIDEKKwkJCS0gKGxzdGF0ZS0+ZXZlbnRfcl9pZHggLSBsc3RhdGUtPmV2ZW50X3dfaWR4KTsKKworCWlmIChldmVudF90eXBlID09IEVWRU5UX1RZUEVfQlVTX1JFU0VUCisJIHx8IGV2ZW50X3R5cGUgPT0gTVNHX0JVU19ERVZfUkVTRVQpIHsKKwkJLyoKKwkJICogQW55IGVhcmxpZXIgZXZlbnRzIGFyZSBpcnJlbGV2YW50LCBzbyByZXNldCBvdXIgYnVmZmVyLgorCQkgKiBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIGFsbG93aW5nIHVzIHRvIGRlYWwgd2l0aCByZXNldAorCQkgKiBmbG9vZHMgKGFuIGV4dGVybmFsIGRldmljZSBob2xkaW5nIGRvd24gdGhlIHJlc2V0IGxpbmUpCisJCSAqIHdpdGhvdXQgbG9zaW5nIHRoZSBldmVudCB0aGF0IGlzIHJlYWxseSBpbnRlcmVzdGluZy4KKwkJICovCisJCWxzdGF0ZS0+ZXZlbnRfcl9pZHggPSAwOworCQlsc3RhdGUtPmV2ZW50X3dfaWR4ID0gMDsKKwkJeHB0X3JlbGVhc2VfZGV2cShsc3RhdGUtPnBhdGgsIHBlbmRpbmcsIC8qcnVucXVldWUqL0ZBTFNFKTsKKwl9CisKKwlpZiAocGVuZGluZyA9PSBBSERfVE1PREVfRVZFTlRfQlVGRkVSX1NJWkUpIHsKKwkJeHB0X3ByaW50X3BhdGgobHN0YXRlLT5wYXRoKTsKKwkJcHJpbnRmKCJpbW1lZGlhdGUgZXZlbnQgJXg6JXggbG9zdFxuIiwKKwkJICAgICAgIGxzdGF0ZS0+ZXZlbnRfYnVmZmVyW2xzdGF0ZS0+ZXZlbnRfcl9pZHhdLmV2ZW50X3R5cGUsCisJCSAgICAgICBsc3RhdGUtPmV2ZW50X2J1ZmZlcltsc3RhdGUtPmV2ZW50X3JfaWR4XS5ldmVudF9hcmcpOworCQlsc3RhdGUtPmV2ZW50X3JfaWR4Kys7CisJCWlmIChsc3RhdGUtPmV2ZW50X3JfaWR4ID09IEFIRF9UTU9ERV9FVkVOVF9CVUZGRVJfU0laRSkKKwkJCWxzdGF0ZS0+ZXZlbnRfcl9pZHggPSAwOworCQl4cHRfcmVsZWFzZV9kZXZxKGxzdGF0ZS0+cGF0aCwgLypjb3VudCovMSwgLypydW5xdWV1ZSovRkFMU0UpOworCX0KKworCWV2ZW50ID0gJmxzdGF0ZS0+ZXZlbnRfYnVmZmVyW2xzdGF0ZS0+ZXZlbnRfd19pZHhdOworCWV2ZW50LT5pbml0aWF0b3JfaWQgPSBpbml0aWF0b3JfaWQ7CisJZXZlbnQtPmV2ZW50X3R5cGUgPSBldmVudF90eXBlOworCWV2ZW50LT5ldmVudF9hcmcgPSBldmVudF9hcmc7CisJbHN0YXRlLT5ldmVudF93X2lkeCsrOworCWlmIChsc3RhdGUtPmV2ZW50X3dfaWR4ID09IEFIRF9UTU9ERV9FVkVOVF9CVUZGRVJfU0laRSkKKwkJbHN0YXRlLT5ldmVudF93X2lkeCA9IDA7Cit9CisKKy8qCisgKiBTZW5kIGFueSB0YXJnZXQgbW9kZSBldmVudHMgcXVldWVkIHVwIHdhaXRpbmcKKyAqIGZvciBpbW1lZGlhdGUgbm90aWZ5IHJlc291cmNlcy4KKyAqLwordm9pZAorYWhkX3NlbmRfbHN0YXRlX2V2ZW50cyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfdG1vZGVfbHN0YXRlICpsc3RhdGUpCit7CisJc3RydWN0IGNjYl9oZHIgKmNjYmg7CisJc3RydWN0IGNjYl9pbW1lZF9ub3RpZnkgKmlub3Q7CisKKwl3aGlsZSAobHN0YXRlLT5ldmVudF9yX2lkeCAhPSBsc3RhdGUtPmV2ZW50X3dfaWR4CisJICAgICYmIChjY2JoID0gU0xJU1RfRklSU1QoJmxzdGF0ZS0+aW1tZWRfbm90aWZpZXMpKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBhaGRfdG1vZGVfZXZlbnQgKmV2ZW50OworCisJCWV2ZW50ID0gJmxzdGF0ZS0+ZXZlbnRfYnVmZmVyW2xzdGF0ZS0+ZXZlbnRfcl9pZHhdOworCQlTTElTVF9SRU1PVkVfSEVBRCgmbHN0YXRlLT5pbW1lZF9ub3RpZmllcywgc2ltX2xpbmtzLnNsZSk7CisJCWlub3QgPSAoc3RydWN0IGNjYl9pbW1lZF9ub3RpZnkgKiljY2JoOworCQlzd2l0Y2ggKGV2ZW50LT5ldmVudF90eXBlKSB7CisJCWNhc2UgRVZFTlRfVFlQRV9CVVNfUkVTRVQ6CisJCQljY2JoLT5zdGF0dXMgPSBDQU1fU0NTSV9CVVNfUkVTRVR8Q0FNX0RFVl9RRlJaTjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY2NiaC0+c3RhdHVzID0gQ0FNX01FU1NBR0VfUkVDVnxDQU1fREVWX1FGUlpOOworCQkJaW5vdC0+bWVzc2FnZV9hcmdzWzBdID0gZXZlbnQtPmV2ZW50X3R5cGU7CisJCQlpbm90LT5tZXNzYWdlX2FyZ3NbMV0gPSBldmVudC0+ZXZlbnRfYXJnOworCQkJYnJlYWs7CisJCX0KKwkJaW5vdC0+aW5pdGlhdG9yX2lkID0gZXZlbnQtPmluaXRpYXRvcl9pZDsKKwkJaW5vdC0+c2Vuc2VfbGVuID0gMDsKKwkJeHB0X2RvbmUoKHVuaW9uIGNjYiAqKWlub3QpOworCQlsc3RhdGUtPmV2ZW50X3JfaWR4Kys7CisJCWlmIChsc3RhdGUtPmV2ZW50X3JfaWR4ID09IEFIRF9UTU9ERV9FVkVOVF9CVUZGRVJfU0laRSkKKwkJCWxzdGF0ZS0+ZXZlbnRfcl9pZHggPSAwOworCX0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKiogU2VxdWVuY2VyIFByb2dyYW0gUGF0Y2hpbmcvRG93bmxvYWQgKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQUhEX0RVTVBfU0VRCit2b2lkCithaGRfZHVtcHNlcShzdHJ1Y3QgYWhkX3NvZnRjKiBhaGQpCit7CisJaW50IGk7CisJaW50IG1heF9wcm9nOworCisJbWF4X3Byb2cgPSAyMDQ4OworCisJYWhkX291dGIoYWhkLCBTRVFDVEwwLCBQRVJST1JESVN8RkFJTERJU3xGQVNUTU9ERXxMT0FEUkFNKTsKKwlhaGRfb3V0YihhaGQsIFBSR01DTlQsIDApOworCWFoZF9vdXRiKGFoZCwgUFJHTUNOVCsxLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X3Byb2c7IGkrKykgeworCQl1aW50OF90IGluc19ieXRlc1s0XTsKKworCQlhaGRfaW5zYihhaGQsIFNFUVJBTSwgaW5zX2J5dGVzLCA0KTsKKwkJcHJpbnRmKCIweCUwOHhcbiIsIGluc19ieXRlc1swXSA8PCAyNAorCQkJCSB8IGluc19ieXRlc1sxXSA8PCAxNgorCQkJCSB8IGluc19ieXRlc1syXSA8PCA4CisJCQkJIHwgaW5zX2J5dGVzWzNdKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2FoZF9sb2Fkc2VxKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlzdHJ1Y3QJY3MgY3NfdGFibGVbbnVtX2NyaXRpY2FsX3NlY3Rpb25zXTsKKwl1X2ludAliZWdpbl9zZXRbbnVtX2NyaXRpY2FsX3NlY3Rpb25zXTsKKwl1X2ludAllbmRfc2V0W251bV9jcml0aWNhbF9zZWN0aW9uc107CisJc3RydWN0CXBhdGNoICpjdXJfcGF0Y2g7CisJdV9pbnQJY3NfY291bnQ7CisJdV9pbnQJY3VyX2NzOworCXVfaW50CWk7CisJaW50CWRvd25sb2FkZWQ7CisJdV9pbnQJc2tpcF9hZGRyOworCXVfaW50CXNnX3ByZWZldGNoX2NudDsKKwl1X2ludAlzZ19wcmVmZXRjaF9jbnRfbGltaXQ7CisJdV9pbnQJc2dfcHJlZmV0Y2hfYWxpZ247CisJdV9pbnQJc2dfc2l6ZTsKKwl1aW50OF90CWRvd25sb2FkX2NvbnN0c1tET1dOTE9BRF9DT05TVF9DT1VOVF07CisKKwlpZiAoYm9vdHZlcmJvc2UpCisJCXByaW50ZigiJXM6IERvd25sb2FkaW5nIFNlcXVlbmNlciBQcm9ncmFtLi4uIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCkpOworCisjaWYgRE9XTkxPQURfQ09OU1RfQ09VTlQgIT0gNworI2Vycm9yICJEb3dubG9hZCBDb25zdCBNaXNtYXRjaCIKKyNlbmRpZgorCS8qCisJICogU3RhcnQgb3V0IHdpdGggMCBjcml0aWNhbCBzZWN0aW9ucworCSAqIHRoYXQgYXBwbHkgdG8gdGhpcyBmaXJtd2FyZSBsb2FkLgorCSAqLworCWNzX2NvdW50ID0gMDsKKwljdXJfY3MgPSAwOworCW1lbXNldChiZWdpbl9zZXQsIDAsIHNpemVvZihiZWdpbl9zZXQpKTsKKwltZW1zZXQoZW5kX3NldCwgMCwgc2l6ZW9mKGVuZF9zZXQpKTsKKworCS8qCisJICogU2V0dXAgZG93bmxvYWRhYmxlIGNvbnN0YW50IHRhYmxlLgorCSAqIAorCSAqIFRoZSBjb21wdXRhdGlvbiBmb3IgdGhlIFMvRyBwcmVmZXRjaCB2YXJpYWJsZXMgaXMKKwkgKiBhIGJpdCBjb21wbGljYXRlZC4gIFdlIHdvdWxkIGxpa2UgdG8gYWx3YXlzIGZldGNoCisJICogaW4gdGVybXMgb2YgY2FjaGVsaW5lZCBzaXplZCBpbmNyZW1lbnRzLiAgSG93ZXZlciwKKwkgKiBpZiB0aGUgY2FjaGVsaW5lIGlzIG5vdCBhbiBldmVuIG11bHRpcGxlIG9mIHRoZQorCSAqIFNHIGVsZW1lbnQgc2l6ZSBvciBpcyBsYXJnZXIgdGhhbiBvdXIgU0cgUkFNLCB1c2luZworCSAqIGp1c3QgdGhlIGNhY2hlIHNpemUgbWlnaHQgbGVhdmUgdXMgd2l0aCBvbmx5IGEgcG9ydGlvbgorCSAqIG9mIGFuIFNHIGVsZW1lbnQgYXQgdGhlIHRhaWwgb2YgYSBwcmVmZXRjaC4gIElmIHRoZQorCSAqIGNhY2hlbGluZSBpcyBsYXJnZXIgdGhhbiBvdXIgUy9HIHByZWZldGNoIGJ1ZmZlciBsZXNzCisJICogdGhlIHNpemUgb2YgYW4gU0cgZWxlbWVudCwgd2UgbWF5IHJvdW5kIGRvd24gdG8gYSBjYWNoZWxpbmUKKwkgKiB0aGF0IGRvZXNuJ3QgY29udGFpbiBhbnkgb3IgYWxsIG9mIHRoZSBTL0cgb2YgaW50ZXJlc3QKKwkgKiB3aXRoaW4gdGhlIGJvdW5kcyBvZiBvdXIgUy9HIHJhbS4gIFByb3ZpZGUgdmFyaWFibGVzIHRvCisJICogdGhlIHNlcXVlbmNlciB0aGF0IHdpbGwgYWxsb3cgaXQgdG8gaGFuZGxlIHRoZXNlIGVkZ2UKKwkgKiBjYXNlcy4KKwkgKi8KKwkvKiBTdGFydCBieSBhbGlnbmluZyB0byB0aGUgbmVhcmVzdCBjYWNoZWxpbmUuICovCisJc2dfcHJlZmV0Y2hfYWxpZ24gPSBhaGQtPnBjaV9jYWNoZXNpemU7CisJaWYgKHNnX3ByZWZldGNoX2FsaWduID09IDApCisJCXNnX3ByZWZldGNoX2FsaWduID0gODsKKwkvKiBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIuICovCisJd2hpbGUgKHBvd2Vyb2YyKHNnX3ByZWZldGNoX2FsaWduKSA9PSAwKQorCQlzZ19wcmVmZXRjaF9hbGlnbi0tOworCS8qCisJICogSWYgdGhlIGNhY2hlbGluZSBib3VuZGFyeSBpcyBncmVhdGVyIHRoYW4gaGFsZiBvdXIgcHJlZmV0Y2ggUkFNCisJICogd2UgcmlzayBub3QgYmVpbmcgYWJsZSB0byBmZXRjaCBldmVuIGEgc2luZ2xlIGNvbXBsZXRlIFMvRworCSAqIHNlZ21lbnQgaWYgd2UgYWxpZ24gdG8gdGhhdCBib3VuZGFyeS4KKwkgKi8KKwlpZiAoc2dfcHJlZmV0Y2hfYWxpZ24gPiBDQ1NHQUREUl9NQVgvMikKKwkJc2dfcHJlZmV0Y2hfYWxpZ24gPSBDQ1NHQUREUl9NQVgvMjsKKwkvKiBTdGFydCBieSBmZXRjaGluZyBhIHNpbmdsZSBjYWNoZWxpbmUuICovCisJc2dfcHJlZmV0Y2hfY250ID0gc2dfcHJlZmV0Y2hfYWxpZ247CisJLyoKKwkgKiBJbmNyZW1lbnQgdGhlIHByZWZldGNoIGNvdW50IGJ5IGNhY2hlbGluZXMgdW50aWwKKwkgKiBhdCBsZWFzdCBvbmUgUy9HIGVsZW1lbnQgd2lsbCBmaXQuCisJICovCisJc2dfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWhkX2RtYV9zZWcpOworCWlmICgoYWhkLT5mbGFncyAmIEFIRF82NEJJVF9BRERSRVNTSU5HKSAhPSAwKQorCQlzZ19zaXplID0gc2l6ZW9mKHN0cnVjdCBhaGRfZG1hNjRfc2VnKTsKKwl3aGlsZSAoc2dfcHJlZmV0Y2hfY250IDwgc2dfc2l6ZSkKKwkJc2dfcHJlZmV0Y2hfY250ICs9IHNnX3ByZWZldGNoX2FsaWduOworCS8qCisJICogSWYgdGhlIGNhY2hlbGluZSBpcyBub3QgYW4gZXZlbiBtdWx0aXBsZSBvZgorCSAqIHRoZSBTL0cgc2l6ZSwgd2UgbWF5IG9ubHkgZ2V0IGEgcGFydGlhbCBTL0cgd2hlbgorCSAqIHdlIGFsaWduLiBBZGQgYSBjYWNoZWxpbmUgaWYgdGhpcyBpcyB0aGUgY2FzZS4KKwkgKi8KKwlpZiAoKHNnX3ByZWZldGNoX2FsaWduICUgc2dfc2l6ZSkgIT0gMAorCSAmJiAoc2dfcHJlZmV0Y2hfY250IDwgQ0NTR0FERFJfTUFYKSkKKwkJc2dfcHJlZmV0Y2hfY250ICs9IHNnX3ByZWZldGNoX2FsaWduOworCS8qCisJICogTGFzdGx5LCBjb21wdXRlIGEgdmFsdWUgdGhhdCB0aGUgc2VxdWVuY2VyIGNhbiB1c2UKKwkgKiB0byBkZXRlcm1pbmUgaWYgdGhlIHJlbWFpbmRlciBvZiB0aGUgQ0NTR1JBTSBidWZmZXIKKwkgKiBoYXMgYSBmdWxsIFMvRyBlbGVtZW50IGluIGl0LgorCSAqLworCXNnX3ByZWZldGNoX2NudF9saW1pdCA9IC0oc2dfcHJlZmV0Y2hfY250IC0gc2dfc2l6ZSArIDEpOworCWRvd25sb2FkX2NvbnN0c1tTR19QUkVGRVRDSF9DTlRdID0gc2dfcHJlZmV0Y2hfY250OworCWRvd25sb2FkX2NvbnN0c1tTR19QUkVGRVRDSF9DTlRfTElNSVRdID0gc2dfcHJlZmV0Y2hfY250X2xpbWl0OworCWRvd25sb2FkX2NvbnN0c1tTR19QUkVGRVRDSF9BTElHTl9NQVNLXSA9IH4oc2dfcHJlZmV0Y2hfYWxpZ24gLSAxKTsKKwlkb3dubG9hZF9jb25zdHNbU0dfUFJFRkVUQ0hfQUREUl9NQVNLXSA9IChzZ19wcmVmZXRjaF9hbGlnbiAtIDEpOworCWRvd25sb2FkX2NvbnN0c1tTR19TSVpFT0ZdID0gc2dfc2l6ZTsKKwlkb3dubG9hZF9jb25zdHNbUEtUX09WRVJSVU5fQlVGT0ZGU0VUXSA9CisJCShhaGQtPm92ZXJydW5fYnVmIC0gKHVpbnQ4X3QgKilhaGQtPnFvdXRmaWZvKSAvIDI1NjsKKwlkb3dubG9hZF9jb25zdHNbU0NCX1RSQU5TRkVSX1NJWkVdID0gU0NCX1RSQU5TRkVSX1NJWkVfMUJZVEVfTFVOOworCWN1cl9wYXRjaCA9IHBhdGNoZXM7CisJZG93bmxvYWRlZCA9IDA7CisJc2tpcF9hZGRyID0gMDsKKwlhaGRfb3V0YihhaGQsIFNFUUNUTDAsIFBFUlJPUkRJU3xGQUlMRElTfEZBU1RNT0RFfExPQURSQU0pOworCWFoZF9vdXRiKGFoZCwgUFJHTUNOVCwgMCk7CisJYWhkX291dGIoYWhkLCBQUkdNQ05UKzEsIDApOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzZXFwcm9nKS80OyBpKyspIHsKKwkJaWYgKGFoZF9jaGVja19wYXRjaChhaGQsICZjdXJfcGF0Y2gsIGksICZza2lwX2FkZHIpID09IDApIHsKKwkJCS8qCisJCQkgKiBEb24ndCBkb3dubG9hZCB0aGlzIGluc3RydWN0aW9uIGFzIGl0CisJCQkgKiBpcyBpbiBhIHBhdGNoIHRoYXQgd2FzIHJlbW92ZWQuCisJCQkgKi8KKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIE1vdmUgdGhyb3VnaCB0aGUgQ1MgdGFibGUgdW50aWwgd2UgZmluZCBhIENTCisJCSAqIHRoYXQgbWlnaHQgYXBwbHkgdG8gdGhpcyBpbnN0cnVjdGlvbi4KKwkJICovCisJCWZvciAoOyBjdXJfY3MgPCBudW1fY3JpdGljYWxfc2VjdGlvbnM7IGN1cl9jcysrKSB7CisJCQlpZiAoY3JpdGljYWxfc2VjdGlvbnNbY3VyX2NzXS5lbmQgPD0gaSkgeworCQkJCWlmIChiZWdpbl9zZXRbY3NfY291bnRdID09IFRSVUUKKwkJCQkgJiYgZW5kX3NldFtjc19jb3VudF0gPT0gRkFMU0UpIHsKKwkJCQkJY3NfdGFibGVbY3NfY291bnRdLmVuZCA9IGRvd25sb2FkZWQ7CisJCQkJIAllbmRfc2V0W2NzX2NvdW50XSA9IFRSVUU7CisJCQkJCWNzX2NvdW50Kys7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGNyaXRpY2FsX3NlY3Rpb25zW2N1cl9jc10uYmVnaW4gPD0gaQorCQkJICYmIGJlZ2luX3NldFtjc19jb3VudF0gPT0gRkFMU0UpIHsKKwkJCQljc190YWJsZVtjc19jb3VudF0uYmVnaW4gPSBkb3dubG9hZGVkOworCQkJCWJlZ2luX3NldFtjc19jb3VudF0gPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJYWhkX2Rvd25sb2FkX2luc3RyKGFoZCwgaSwgZG93bmxvYWRfY29uc3RzKTsKKwkJZG93bmxvYWRlZCsrOworCX0KKworCWFoZC0+bnVtX2NyaXRpY2FsX3NlY3Rpb25zID0gY3NfY291bnQ7CisJaWYgKGNzX2NvdW50ICE9IDApIHsKKworCQljc19jb3VudCAqPSBzaXplb2Yoc3RydWN0IGNzKTsKKwkJYWhkLT5jcml0aWNhbF9zZWN0aW9ucyA9IG1hbGxvYyhjc19jb3VudCwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwkJaWYgKGFoZC0+Y3JpdGljYWxfc2VjdGlvbnMgPT0gTlVMTCkKKwkJCXBhbmljKCJhaGRfbG9hZHNlcTogQ291bGQgbm90IG1hbGxvYyIpOworCQltZW1jcHkoYWhkLT5jcml0aWNhbF9zZWN0aW9ucywgY3NfdGFibGUsIGNzX2NvdW50KTsKKwl9CisJYWhkX291dGIoYWhkLCBTRVFDVEwwLCBQRVJST1JESVN8RkFJTERJU3xGQVNUTU9ERSk7CisKKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCIgJWQgaW5zdHJ1Y3Rpb25zIGRvd25sb2FkZWRcbiIsIGRvd25sb2FkZWQpOworCQlwcmludGYoIiVzOiBGZWF0dXJlcyAweCV4LCBCdWdzIDB4JXgsIEZsYWdzIDB4JXhcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBhaGQtPmZlYXR1cmVzLCBhaGQtPmJ1Z3MsIGFoZC0+ZmxhZ3MpOworCX0KK30KKworc3RhdGljIGludAorYWhkX2NoZWNrX3BhdGNoKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHBhdGNoICoqc3RhcnRfcGF0Y2gsCisJCXVfaW50IHN0YXJ0X2luc3RyLCB1X2ludCAqc2tpcF9hZGRyKQoreworCXN0cnVjdAlwYXRjaCAqY3VyX3BhdGNoOworCXN0cnVjdAlwYXRjaCAqbGFzdF9wYXRjaDsKKwl1X2ludAludW1fcGF0Y2hlczsKKworCW51bV9wYXRjaGVzID0gc2l6ZW9mKHBhdGNoZXMpL3NpemVvZihzdHJ1Y3QgcGF0Y2gpOworCWxhc3RfcGF0Y2ggPSAmcGF0Y2hlc1tudW1fcGF0Y2hlc107CisJY3VyX3BhdGNoID0gKnN0YXJ0X3BhdGNoOworCisJd2hpbGUgKGN1cl9wYXRjaCA8IGxhc3RfcGF0Y2ggJiYgc3RhcnRfaW5zdHIgPT0gY3VyX3BhdGNoLT5iZWdpbikgeworCisJCWlmIChjdXJfcGF0Y2gtPnBhdGNoX2Z1bmMoYWhkKSA9PSAwKSB7CisKKwkJCS8qIFN0YXJ0IHJlamVjdGluZyBjb2RlICovCisJCQkqc2tpcF9hZGRyID0gc3RhcnRfaW5zdHIgKyBjdXJfcGF0Y2gtPnNraXBfaW5zdHI7CisJCQljdXJfcGF0Y2ggKz0gY3VyX3BhdGNoLT5za2lwX3BhdGNoOworCQl9IGVsc2UgeworCQkJLyogQWNjZXB0ZWQgdGhpcyBwYXRjaC4gIEFkdmFuY2UgdG8gdGhlIG5leHQKKwkJCSAqIG9uZSBhbmQgd2FpdCBmb3Igb3VyIGludHJ1Y3Rpb24gcG9pbnRlciB0bworCQkJICogaGl0IHRoaXMgcG9pbnQuCisJCQkgKi8KKwkJCWN1cl9wYXRjaCsrOworCQl9CisJfQorCisJKnN0YXJ0X3BhdGNoID0gY3VyX3BhdGNoOworCWlmIChzdGFydF9pbnN0ciA8ICpza2lwX2FkZHIpCisJCS8qIFN0aWxsIHNraXBwaW5nICovCisJCXJldHVybiAoMCk7CisKKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgdV9pbnQKK2FoZF9yZXNvbHZlX3NlcWFkZHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBhZGRyZXNzKQoreworCXN0cnVjdCBwYXRjaCAqY3VyX3BhdGNoOworCWludCBhZGRyZXNzX29mZnNldDsKKwl1X2ludCBza2lwX2FkZHI7CisJdV9pbnQgaTsKKworCWFkZHJlc3Nfb2Zmc2V0ID0gMDsKKwljdXJfcGF0Y2ggPSBwYXRjaGVzOworCXNraXBfYWRkciA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRkcmVzczspIHsKKworCQlhaGRfY2hlY2tfcGF0Y2goYWhkLCAmY3VyX3BhdGNoLCBpLCAmc2tpcF9hZGRyKTsKKworCQlpZiAoc2tpcF9hZGRyID4gaSkgeworCQkJaW50IGVuZF9hZGRyOworCisJCQllbmRfYWRkciA9IE1JTihhZGRyZXNzLCBza2lwX2FkZHIpOworCQkJYWRkcmVzc19vZmZzZXQgKz0gZW5kX2FkZHIgLSBpOworCQkJaSA9IHNraXBfYWRkcjsKKwkJfSBlbHNlIHsKKwkJCWkrKzsKKwkJfQorCX0KKwlyZXR1cm4gKGFkZHJlc3MgLSBhZGRyZXNzX29mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkCithaGRfZG93bmxvYWRfaW5zdHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBpbnN0cnB0ciwgdWludDhfdCAqZGNvbnN0cykKK3sKKwl1bmlvbglpbnNfZm9ybWF0cyBpbnN0cjsKKwlzdHJ1Y3QJaW5zX2Zvcm1hdDEgKmZtdDFfaW5zOworCXN0cnVjdAlpbnNfZm9ybWF0MyAqZm10M19pbnM7CisJdV9pbnQJb3Bjb2RlOworCisJLyoKKwkgKiBUaGUgZmlybXdhcmUgaXMgYWx3YXlzIGNvbXBpbGVkIGludG8gYSBsaXR0bGUgZW5kaWFuIGZvcm1hdC4KKwkgKi8KKwlpbnN0ci5pbnRlZ2VyID0gYWhkX2xlMzJ0b2goKih1aW50MzJfdCopJnNlcXByb2dbaW5zdHJwdHIgKiA0XSk7CisKKwlmbXQxX2lucyA9ICZpbnN0ci5mb3JtYXQxOworCWZtdDNfaW5zID0gTlVMTDsKKworCS8qIFB1bGwgdGhlIG9wY29kZSAqLworCW9wY29kZSA9IGluc3RyLmZvcm1hdDEub3Bjb2RlOworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBBSUNfT1BfSk1QOgorCWNhc2UgQUlDX09QX0pDOgorCWNhc2UgQUlDX09QX0pOQzoKKwljYXNlIEFJQ19PUF9DQUxMOgorCWNhc2UgQUlDX09QX0pORToKKwljYXNlIEFJQ19PUF9KTlo6CisJY2FzZSBBSUNfT1BfSkU6CisJY2FzZSBBSUNfT1BfSlo6CisJeworCQlmbXQzX2lucyA9ICZpbnN0ci5mb3JtYXQzOworCQlmbXQzX2lucy0+YWRkcmVzcyA9IGFoZF9yZXNvbHZlX3NlcWFkZHIoYWhkLCBmbXQzX2lucy0+YWRkcmVzcyk7CisJCS8qIEZBTExUSFJPVUdIICovCisJfQorCWNhc2UgQUlDX09QX09SOgorCWNhc2UgQUlDX09QX0FORDoKKwljYXNlIEFJQ19PUF9YT1I6CisJY2FzZSBBSUNfT1BfQUREOgorCWNhc2UgQUlDX09QX0FEQzoKKwljYXNlIEFJQ19PUF9CTU9WOgorCQlpZiAoZm10MV9pbnMtPnBhcml0eSAhPSAwKSB7CisJCQlmbXQxX2lucy0+aW1tZWRpYXRlID0gZGNvbnN0c1tmbXQxX2lucy0+aW1tZWRpYXRlXTsKKwkJfQorCQlmbXQxX2lucy0+cGFyaXR5ID0gMDsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIEFJQ19PUF9ST0w6CisJeworCQlpbnQgaSwgY291bnQ7CisKKwkJLyogQ2FsY3VsYXRlIG9kZCBwYXJpdHkgZm9yIHRoZSBpbnN0cnVjdGlvbiAqLworCQlmb3IgKGkgPSAwLCBjb3VudCA9IDA7IGkgPCAzMTsgaSsrKSB7CisJCQl1aW50MzJfdCBtYXNrOworCisJCQltYXNrID0gMHgwMSA8PCBpOworCQkJaWYgKChpbnN0ci5pbnRlZ2VyICYgbWFzaykgIT0gMCkKKwkJCQljb3VudCsrOworCQl9CisJCWlmICgoY291bnQgJiAweDAxKSA9PSAwKQorCQkJaW5zdHIuZm9ybWF0MS5wYXJpdHkgPSAxOworCisJCS8qIFRoZSBzZXF1ZW5jZXIgaXMgYSBsaXR0bGUgZW5kaWFuIGNwdSAqLworCQlpbnN0ci5pbnRlZ2VyID0gYWhkX2h0b2xlMzIoaW5zdHIuaW50ZWdlcik7CisJCWFoZF9vdXRzYihhaGQsIFNFUVJBTSwgaW5zdHIuYnl0ZXMsIDQpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcGFuaWMoIlVua25vd24gb3Bjb2RlIGVuY291bnRlcmVkIGluIHNlcSBwcm9ncmFtIik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludAorYWhkX3Byb2JlX3N0YWNrX3NpemUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCWludCBsYXN0X3Byb2JlOworCisJbGFzdF9wcm9iZSA9IDA7CisJd2hpbGUgKDEpIHsKKwkJaW50IGk7CisKKwkJLyoKKwkJICogV2UgYXZvaWQgdXNpbmcgMCBhcyBhIHBhdHRlcm4gdG8gYXZvaWQKKwkJICogY29uZnVzaW9uIGlmIHRoZSBzdGFjayBpbXBsZW1lbnRhdGlvbgorCQkgKiAiYmFjay1maWxscyIgd2l0aCB6ZXJvcyB3aGVuICJwb3BpbmcnCisJCSAqIGVudHJpZXMuCisJCSAqLworCQlmb3IgKGkgPSAxOyBpIDw9IGxhc3RfcHJvYmUrMTsgaSsrKSB7CisJCSAgICAgICBhaGRfb3V0YihhaGQsIFNUQUNLLCBpICYgMHhGRik7CisJCSAgICAgICBhaGRfb3V0YihhaGQsIFNUQUNLLCAoaSA+PiA4KSAmIDB4RkYpOworCQl9CisKKwkJLyogVmVyaWZ5ICovCisJCWZvciAoaSA9IGxhc3RfcHJvYmUrMTsgaSA+IDA7IGktLSkgeworCQkJdV9pbnQgc3RhY2tfZW50cnk7CisKKwkJCXN0YWNrX2VudHJ5ID0gYWhkX2luYihhaGQsIFNUQUNLKQorCQkJCSAgICB8KGFoZF9pbmIoYWhkLCBTVEFDSykgPDwgOCk7CisJCQlpZiAoc3RhY2tfZW50cnkgIT0gaSkKKwkJCQlnb3RvIHNpemVkOworCQl9CisJCWxhc3RfcHJvYmUrKzsKKwl9CitzaXplZDoKKwlyZXR1cm4gKGxhc3RfcHJvYmUpOworfQorCit2b2lkCithaGRfZHVtcF9hbGxfY2FyZHNfc3RhdGUodm9pZCkKK3sKKwlzdHJ1Y3QgYWhkX3NvZnRjICpsaXN0X2FoZDsKKworCVRBSUxRX0ZPUkVBQ0gobGlzdF9haGQsICZhaGRfdGFpbHEsIGxpbmtzKSB7CisJCWFoZF9kdW1wX2NhcmRfc3RhdGUobGlzdF9haGQpOworCX0KK30KKworaW50CithaGRfcHJpbnRfcmVnaXN0ZXIoYWhkX3JlZ19wYXJzZV9lbnRyeV90ICp0YWJsZSwgdV9pbnQgbnVtX2VudHJpZXMsCisJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIHVfaW50IGFkZHJlc3MsIHVfaW50IHZhbHVlLAorCQkgICB1X2ludCAqY3VyX2NvbHVtbiwgdV9pbnQgd3JhcF9wb2ludCkKK3sKKwlpbnQJcHJpbnRlZDsKKwl1X2ludAlwcmludGVkX21hc2s7CisKKwlpZiAoY3VyX2NvbHVtbiAhPSBOVUxMICYmICpjdXJfY29sdW1uID49IHdyYXBfcG9pbnQpIHsKKwkJcHJpbnRmKCJcbiIpOworCQkqY3VyX2NvbHVtbiA9IDA7CisJfQorCXByaW50ZWQgPSBwcmludGYoIiVzWzB4JXhdIiwgbmFtZSwgdmFsdWUpOworCWlmICh0YWJsZSA9PSBOVUxMKSB7CisJCXByaW50ZWQgKz0gcHJpbnRmKCIgIik7CisJCSpjdXJfY29sdW1uICs9IHByaW50ZWQ7CisJCXJldHVybiAocHJpbnRlZCk7CisJfQorCXByaW50ZWRfbWFzayA9IDA7CisJd2hpbGUgKHByaW50ZWRfbWFzayAhPSAweEZGKSB7CisJCWludCBlbnRyeTsKKworCQlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCBudW1fZW50cmllczsgZW50cnkrKykgeworCQkJaWYgKCgodmFsdWUgJiB0YWJsZVtlbnRyeV0ubWFzaykKKwkJCSAgIT0gdGFibGVbZW50cnldLnZhbHVlKQorCQkJIHx8ICgocHJpbnRlZF9tYXNrICYgdGFibGVbZW50cnldLm1hc2spCisJCQkgID09IHRhYmxlW2VudHJ5XS5tYXNrKSkKKwkJCQljb250aW51ZTsKKworCQkJcHJpbnRlZCArPSBwcmludGYoIiVzJXMiLAorCQkJCQkgIHByaW50ZWRfbWFzayA9PSAwID8gIjooIiA6ICJ8IiwKKwkJCQkJICB0YWJsZVtlbnRyeV0ubmFtZSk7CisJCQlwcmludGVkX21hc2sgfD0gdGFibGVbZW50cnldLm1hc2s7CisJCQkKKwkJCWJyZWFrOworCQl9CisJCWlmIChlbnRyeSA+PSBudW1fZW50cmllcykKKwkJCWJyZWFrOworCX0KKwlpZiAocHJpbnRlZF9tYXNrICE9IDApCisJCXByaW50ZWQgKz0gcHJpbnRmKCIpICIpOworCWVsc2UKKwkJcHJpbnRlZCArPSBwcmludGYoIiAiKTsKKwlpZiAoY3VyX2NvbHVtbiAhPSBOVUxMKQorCQkqY3VyX2NvbHVtbiArPSBwcmludGVkOworCXJldHVybiAocHJpbnRlZCk7Cit9CisKK3ZvaWQKK2FoZF9kdW1wX2NhcmRfc3RhdGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXN0cnVjdCBzY2IJKnNjYjsKKwlhaGRfbW9kZV9zdGF0ZQkgc2F2ZWRfbW9kZXM7CisJdV9pbnQJCSBkZmZzdGF0OworCWludAkJIHBhdXNlZDsKKwl1X2ludAkJIHNjYl9pbmRleDsKKwl1X2ludAkJIHNhdmVkX3NjYl9pbmRleDsKKwl1X2ludAkJIGN1cl9jb2w7CisJaW50CQkgaTsKKworCWlmIChhaGRfaXNfcGF1c2VkKGFoZCkpIHsKKwkJcGF1c2VkID0gMTsKKwl9IGVsc2UgeworCQlwYXVzZWQgPSAwOworCQlhaGRfcGF1c2UoYWhkKTsKKwl9CisJc2F2ZWRfbW9kZXMgPSBhaGRfc2F2ZV9tb2RlcyhhaGQpOworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKwlwcmludGYoIj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiBEdW1wIENhcmQgU3RhdGUgQmVnaW5zIDw8PDw8PDw8PDw8PDw8PDw8XG4iCisJICAgICAgICIlczogRHVtcGluZyBDYXJkIFN0YXRlIGF0IHByb2dyYW0gYWRkcmVzcyAweCV4IE1vZGUgMHgleFxuIiwKKwkgICAgICAgYWhkX25hbWUoYWhkKSwgCisJICAgICAgIGFoZF9pbmIoYWhkLCBDVVJBRERSKSB8IChhaGRfaW5iKGFoZCwgQ1VSQUREUisxKSA8PCA4KSwKKwkgICAgICAgYWhkX2J1aWxkX21vZGVfc3RhdGUoYWhkLCBhaGQtPnNhdmVkX3NyY19tb2RlLAorCQkJCSAgICBhaGQtPnNhdmVkX2RzdF9tb2RlKSk7CisJaWYgKHBhdXNlZCkKKwkJcHJpbnRmKCJDYXJkIHdhcyBwYXVzZWRcbiIpOworCisJaWYgKGFoZF9jaGVja19jbWRjbXBsdHF1ZXVlcyhhaGQpKQorCQlwcmludGYoIkNvbXBsZXRpb25zIGFyZSBwZW5kaW5nXG4iKTsKKworCS8qCisJICogTW9kZSBpbmRlcGVuZGVudCByZWdpc3RlcnMuCisJICovCisJY3VyX2NvbCA9IDA7CisJYWhkX2hzX21haWxib3hfcHJpbnQoYWhkX2luYihhaGQsIExPQ0FMX0hTX01BSUxCT1gpLCAmY3VyX2NvbCwgNTApOworCWFoZF9pbnRjdGxfcHJpbnQoYWhkX2luYihhaGQsIElOVENUTCksICZjdXJfY29sLCA1MCk7CisJYWhkX3NlcWludHN0YXRfcHJpbnQoYWhkX2luYihhaGQsIFNFUUlOVFNUQVQpLCAmY3VyX2NvbCwgNTApOworCWFoZF9zYXZlZF9tb2RlX3ByaW50KGFoZF9pbmIoYWhkLCBTQVZFRF9NT0RFKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfZGZmc3RhdF9wcmludChhaGRfaW5iKGFoZCwgREZGU1RBVCksICZjdXJfY29sLCA1MCk7CisJYWhkX3Njc2lzaWdpX3ByaW50KGFoZF9pbmIoYWhkLCBTQ1NJU0lHSSksICZjdXJfY29sLCA1MCk7CisJYWhkX3Njc2lwaGFzZV9wcmludChhaGRfaW5iKGFoZCwgU0NTSVBIQVNFKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfc2NzaWJ1c19wcmludChhaGRfaW5iKGFoZCwgU0NTSUJVUyksICZjdXJfY29sLCA1MCk7CisJYWhkX2xhc3RwaGFzZV9wcmludChhaGRfaW5iKGFoZCwgTEFTVFBIQVNFKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfc2NzaXNlcTBfcHJpbnQoYWhkX2luYihhaGQsIFNDU0lTRVEwKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfc2NzaXNlcTFfcHJpbnQoYWhkX2luYihhaGQsIFNDU0lTRVExKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfc2VxY3RsMF9wcmludChhaGRfaW5iKGFoZCwgU0VRQ1RMMCksICZjdXJfY29sLCA1MCk7CisJYWhkX3NlcWludGN0bF9wcmludChhaGRfaW5iKGFoZCwgU0VRSU5UQ1RMKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfc2VxX2ZsYWdzX3ByaW50KGFoZF9pbmIoYWhkLCBTRVFfRkxBR1MpLCAmY3VyX2NvbCwgNTApOworCWFoZF9zZXFfZmxhZ3MyX3ByaW50KGFoZF9pbmIoYWhkLCBTRVFfRkxBR1MyKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfc3N0YXQwX3ByaW50KGFoZF9pbmIoYWhkLCBTU1RBVDApLCAmY3VyX2NvbCwgNTApOworCWFoZF9zc3RhdDFfcHJpbnQoYWhkX2luYihhaGQsIFNTVEFUMSksICZjdXJfY29sLCA1MCk7CisJYWhkX3NzdGF0Ml9wcmludChhaGRfaW5iKGFoZCwgU1NUQVQyKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfc3N0YXQzX3ByaW50KGFoZF9pbmIoYWhkLCBTU1RBVDMpLCAmY3VyX2NvbCwgNTApOworCWFoZF9wZXJyZGlhZ19wcmludChhaGRfaW5iKGFoZCwgUEVSUkRJQUcpLCAmY3VyX2NvbCwgNTApOworCWFoZF9zaW1vZGUxX3ByaW50KGFoZF9pbmIoYWhkLCBTSU1PREUxKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfbHFpc3RhdDBfcHJpbnQoYWhkX2luYihhaGQsIExRSVNUQVQwKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfbHFpc3RhdDFfcHJpbnQoYWhkX2luYihhaGQsIExRSVNUQVQxKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfbHFpc3RhdDJfcHJpbnQoYWhkX2luYihhaGQsIExRSVNUQVQyKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfbHFvc3RhdDBfcHJpbnQoYWhkX2luYihhaGQsIExRT1NUQVQwKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfbHFvc3RhdDFfcHJpbnQoYWhkX2luYihhaGQsIExRT1NUQVQxKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfbHFvc3RhdDJfcHJpbnQoYWhkX2luYihhaGQsIExRT1NUQVQyKSwgJmN1cl9jb2wsIDUwKTsKKwlwcmludGYoIlxuIik7CisJcHJpbnRmKCJcblNDQiBDb3VudCA9ICVkIENNRFNfUEVORElORyA9ICVkIExBU1RTQ0IgMHgleCAiCisJICAgICAgICJDVVJSU0NCIDB4JXggTkVYVFNDQiAweCV4XG4iLAorCSAgICAgICBhaGQtPnNjYl9kYXRhLm51bXNjYnMsIGFoZF9pbncoYWhkLCBDTURTX1BFTkRJTkcpLAorCSAgICAgICBhaGRfaW53KGFoZCwgTEFTVFNDQiksIGFoZF9pbncoYWhkLCBDVVJSU0NCKSwKKwkgICAgICAgYWhkX2ludyhhaGQsIE5FWFRTQ0IpKTsKKwljdXJfY29sID0gMDsKKwkvKiBRSU5GSUZPICovCisJYWhkX3NlYXJjaF9xaW5maWZvKGFoZCwgQ0FNX1RBUkdFVF9XSUxEQ0FSRCwgQUxMX0NIQU5ORUxTLAorCQkJICAgQ0FNX0xVTl9XSUxEQ0FSRCwgU0NCX0xJU1RfTlVMTCwKKwkJCSAgIFJPTEVfVU5LTk9XTiwgLypzdGF0dXMqLzAsIFNFQVJDSF9QUklOVCk7CisJc2F2ZWRfc2NiX2luZGV4ID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwlwcmludGYoIlBlbmRpbmcgbGlzdDoiKTsKKwlpID0gMDsKKwlMSVNUX0ZPUkVBQ0goc2NiLCAmYWhkLT5wZW5kaW5nX3NjYnMsIHBlbmRpbmdfbGlua3MpIHsKKwkJaWYgKGkrKyA+IEFIRF9TQ0JfTUFYKQorCQkJYnJlYWs7CisJCWN1cl9jb2wgPSBwcmludGYoIlxuJTNkIEZJRk9fVVNFWzB4JXhdICIsIFNDQl9HRVRfVEFHKHNjYiksCisJCQkJIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0ZJRk9fVVNFX0NPVU5UKSk7CisJCWFoZF9zZXRfc2NicHRyKGFoZCwgU0NCX0dFVF9UQUcoc2NiKSk7CisJCWFoZF9zY2JfY29udHJvbF9wcmludChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9DT05UUk9MKSwKKwkJCQkgICAgICAmY3VyX2NvbCwgNjApOworCQlhaGRfc2NiX3Njc2lpZF9wcmludChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9TQ1NJSUQpLAorCQkJCSAgICAgJmN1cl9jb2wsIDYwKTsKKwl9CisJcHJpbnRmKCJcblRvdGFsICVkXG4iLCBpKTsKKworCXByaW50ZigiS2VybmVsIEZyZWUgU0NCIGxpc3Q6ICIpOworCWkgPSAwOworCVRBSUxRX0ZPUkVBQ0goc2NiLCAmYWhkLT5zY2JfZGF0YS5mcmVlX3NjYnMsIGxpbmtzLnRxZSkgeworCQlzdHJ1Y3Qgc2NiICpsaXN0X3NjYjsKKworCQlsaXN0X3NjYiA9IHNjYjsKKwkJZG8geworCQkJcHJpbnRmKCIlZCAiLCBTQ0JfR0VUX1RBRyhsaXN0X3NjYikpOworCQkJbGlzdF9zY2IgPSBMSVNUX05FWFQobGlzdF9zY2IsIGNvbGxpc2lvbl9saW5rcyk7CisJCX0gd2hpbGUgKGxpc3Rfc2NiICYmIGkrKyA8IEFIRF9TQ0JfTUFYKTsKKwl9CisKKwlMSVNUX0ZPUkVBQ0goc2NiLCAmYWhkLT5zY2JfZGF0YS5hbnlfZGV2X2ZyZWVfc2NiX2xpc3QsIGxpbmtzLmxlKSB7CisJCWlmIChpKysgPiBBSERfU0NCX01BWCkKKwkJCWJyZWFrOworCQlwcmludGYoIiVkICIsIFNDQl9HRVRfVEFHKHNjYikpOworCX0KKwlwcmludGYoIlxuIik7CisKKwlwcmludGYoIlNlcXVlbmNlciBDb21wbGV0ZSBETUEtaW5wcm9nIGxpc3Q6ICIpOworCXNjYl9pbmRleCA9IGFoZF9pbncoYWhkLCBDT01QTEVURV9TQ0JfRE1BSU5QUk9HX0hFQUQpOworCWkgPSAwOworCXdoaWxlICghU0NCSURfSVNfTlVMTChzY2JfaW5kZXgpICYmIGkrKyA8IEFIRF9TQ0JfTUFYKSB7CisJCWFoZF9zZXRfc2NicHRyKGFoZCwgc2NiX2luZGV4KTsKKwkJcHJpbnRmKCIlZCAiLCBzY2JfaW5kZXgpOworCQlzY2JfaW5kZXggPSBhaGRfaW53X3NjYnJhbShhaGQsIFNDQl9ORVhUX0NPTVBMRVRFKTsKKwl9CisJcHJpbnRmKCJcbiIpOworCisJcHJpbnRmKCJTZXF1ZW5jZXIgQ29tcGxldGUgbGlzdDogIik7CisJc2NiX2luZGV4ID0gYWhkX2ludyhhaGQsIENPTVBMRVRFX1NDQl9IRUFEKTsKKwlpID0gMDsKKwl3aGlsZSAoIVNDQklEX0lTX05VTEwoc2NiX2luZGV4KSAmJiBpKysgPCBBSERfU0NCX01BWCkgeworCQlhaGRfc2V0X3NjYnB0cihhaGQsIHNjYl9pbmRleCk7CisJCXByaW50ZigiJWQgIiwgc2NiX2luZGV4KTsKKwkJc2NiX2luZGV4ID0gYWhkX2lud19zY2JyYW0oYWhkLCBTQ0JfTkVYVF9DT01QTEVURSk7CisJfQorCXByaW50ZigiXG4iKTsKKworCQorCXByaW50ZigiU2VxdWVuY2VyIERNQS1VcCBhbmQgQ29tcGxldGUgbGlzdDogIik7CisJc2NiX2luZGV4ID0gYWhkX2ludyhhaGQsIENPTVBMRVRFX0RNQV9TQ0JfSEVBRCk7CisJaSA9IDA7CisJd2hpbGUgKCFTQ0JJRF9JU19OVUxMKHNjYl9pbmRleCkgJiYgaSsrIDwgQUhEX1NDQl9NQVgpIHsKKwkJYWhkX3NldF9zY2JwdHIoYWhkLCBzY2JfaW5kZXgpOworCQlwcmludGYoIiVkICIsIHNjYl9pbmRleCk7CisJCXNjYl9pbmRleCA9IGFoZF9pbndfc2NicmFtKGFoZCwgU0NCX05FWFRfQ09NUExFVEUpOworCX0KKwlwcmludGYoIlxuIik7CisJYWhkX3NldF9zY2JwdHIoYWhkLCBzYXZlZF9zY2JfaW5kZXgpOworCWRmZnN0YXQgPSBhaGRfaW5iKGFoZCwgREZGU1RBVCk7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworI2lmZGVmIEFIRF9ERUJVRworCQlzdHJ1Y3Qgc2NiICpmaWZvX3NjYjsKKyNlbmRpZgorCQl1X2ludAkgICAgZmlmb19zY2JwdHI7CisKKwkJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0RGRjAgKyBpLCBBSERfTU9ERV9ERkYwICsgaSk7CisJCWZpZm9fc2NicHRyID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwkJcHJpbnRmKCJcbiVzOiBGSUZPJWQgJXMsIExPTkdKTVAgPT0gMHgleCwgU0NCIDB4JXhcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBpLAorCQkgICAgICAgKGRmZnN0YXQgJiAoRklGTzBGUkVFIDw8IGkpKSA/ICJGcmVlIiA6ICJBY3RpdmUiLAorCQkgICAgICAgYWhkX2ludyhhaGQsIExPTkdKTVBfQUREUiksIGZpZm9fc2NicHRyKTsKKwkJY3VyX2NvbCA9IDA7CisJCWFoZF9zZXFpbW9kZV9wcmludChhaGRfaW5iKGFoZCwgU0VRSU1PREUpLCAmY3VyX2NvbCwgNTApOworCQlhaGRfc2VxaW50c3JjX3ByaW50KGFoZF9pbmIoYWhkLCBTRVFJTlRTUkMpLCAmY3VyX2NvbCwgNTApOworCQlhaGRfZGZjbnRybF9wcmludChhaGRfaW5iKGFoZCwgREZDTlRSTCksICZjdXJfY29sLCA1MCk7CisJCWFoZF9kZnN0YXR1c19wcmludChhaGRfaW5iKGFoZCwgREZTVEFUVVMpLCAmY3VyX2NvbCwgNTApOworCQlhaGRfc2dfY2FjaGVfc2hhZG93X3ByaW50KGFoZF9pbmIoYWhkLCBTR19DQUNIRV9TSEFET1cpLAorCQkJCQkgICZjdXJfY29sLCA1MCk7CisJCWFoZF9zZ19zdGF0ZV9wcmludChhaGRfaW5iKGFoZCwgU0dfU1RBVEUpLCAmY3VyX2NvbCwgNTApOworCQlhaGRfZGZmc3hmcmN0bF9wcmludChhaGRfaW5iKGFoZCwgREZGU1hGUkNUTCksICZjdXJfY29sLCA1MCk7CisJCWFoZF9zb2ZmY250X3ByaW50KGFoZF9pbmIoYWhkLCBTT0ZGQ05UKSwgJmN1cl9jb2wsIDUwKTsKKwkJYWhkX21kZmZzdGF0X3ByaW50KGFoZF9pbmIoYWhkLCBNREZGU1RBVCksICZjdXJfY29sLCA1MCk7CisJCWlmIChjdXJfY29sID4gNTApIHsKKwkJCXByaW50ZigiXG4iKTsKKwkJCWN1cl9jb2wgPSAwOworCQl9CisJCWN1cl9jb2wgKz0gcHJpbnRmKCJTSEFERFIgPSAweCV4JXgsIFNIQ05UID0gMHgleCAiLAorCQkJCSAgYWhkX2lubChhaGQsIFNIQUREUis0KSwKKwkJCQkgIGFoZF9pbmwoYWhkLCBTSEFERFIpLAorCQkJCSAgKGFoZF9pbmIoYWhkLCBTSENOVCkKKwkJCQl8IChhaGRfaW5iKGFoZCwgU0hDTlQgKyAxKSA8PCA4KQorCQkJCXwgKGFoZF9pbmIoYWhkLCBTSENOVCArIDIpIDw8IDE2KSkpOworCQlpZiAoY3VyX2NvbCA+IDUwKSB7CisJCQlwcmludGYoIlxuIik7CisJCQljdXJfY29sID0gMDsKKwkJfQorCQljdXJfY29sICs9IHByaW50ZigiSEFERFIgPSAweCV4JXgsIEhDTlQgPSAweCV4ICIsCisJCQkJICBhaGRfaW5sKGFoZCwgSEFERFIrNCksCisJCQkJICBhaGRfaW5sKGFoZCwgSEFERFIpLAorCQkJCSAgKGFoZF9pbmIoYWhkLCBIQ05UKQorCQkJCXwgKGFoZF9pbmIoYWhkLCBIQ05UICsgMSkgPDwgOCkKKwkJCQl8IChhaGRfaW5iKGFoZCwgSENOVCArIDIpIDw8IDE2KSkpOworCQlhaGRfY2NzZ2N0bF9wcmludChhaGRfaW5iKGFoZCwgQ0NTR0NUTCksICZjdXJfY29sLCA1MCk7CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfU0cpICE9IDApIHsKKwkJCWZpZm9fc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBmaWZvX3NjYnB0cik7CisJCQlpZiAoZmlmb19zY2IgIT0gTlVMTCkKKwkJCQlhaGRfZHVtcF9zZ2xpc3QoZmlmb19zY2IpOworCQl9CisjZW5kaWYKKwl9CisJcHJpbnRmKCJcbkxRSU46ICIpOworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKQorCQlwcmludGYoIjB4JXggIiwgYWhkX2luYihhaGQsIExRSU4gKyBpKSk7CisJcHJpbnRmKCJcbiIpOworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9DRkcsIEFIRF9NT0RFX0NGRyk7CisJcHJpbnRmKCIlczogTFFJU1RBVEUgPSAweCV4LCBMUU9TVEFURSA9IDB4JXgsIE9QVElPTk1PREUgPSAweCV4XG4iLAorCSAgICAgICBhaGRfbmFtZShhaGQpLCBhaGRfaW5iKGFoZCwgTFFJU1RBVEUpLCBhaGRfaW5iKGFoZCwgTFFPU1RBVEUpLAorCSAgICAgICBhaGRfaW5iKGFoZCwgT1BUSU9OTU9ERSkpOworCXByaW50ZigiJXM6IE9TX1NQQUNFX0NOVCA9IDB4JXggTUFYQ01EQ05UID0gMHgleFxuIiwKKwkgICAgICAgYWhkX25hbWUoYWhkKSwgYWhkX2luYihhaGQsIE9TX1NQQUNFX0NOVCksCisJICAgICAgIGFoZF9pbmIoYWhkLCBNQVhDTURDTlQpKTsKKwlhaGRfc2ltb2RlMF9wcmludChhaGRfaW5iKGFoZCwgU0lNT0RFMCksICZjdXJfY29sLCA1MCk7CisJcHJpbnRmKCJcbiIpOworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9DQ0hBTiwgQUhEX01PREVfQ0NIQU4pOworCWN1cl9jb2wgPSAwOworCWFoZF9jY3NjYmN0bF9wcmludChhaGRfaW5iKGFoZCwgQ0NTQ0JDVEwpLCAmY3VyX2NvbCwgNTApOworCXByaW50ZigiXG4iKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgYWhkLT5zYXZlZF9zcmNfbW9kZSwgYWhkLT5zYXZlZF9kc3RfbW9kZSk7CisJcHJpbnRmKCIlczogUkVHMCA9PSAweCV4LCBTSU5ERVggPSAweCV4LCBESU5ERVggPSAweCV4XG4iLAorCSAgICAgICBhaGRfbmFtZShhaGQpLCBhaGRfaW53KGFoZCwgUkVHMCksIGFoZF9pbncoYWhkLCBTSU5ERVgpLAorCSAgICAgICBhaGRfaW53KGFoZCwgRElOREVYKSk7CisJcHJpbnRmKCIlczogU0NCUFRSID09IDB4JXgsIFNDQl9ORVhUID09IDB4JXgsIFNDQl9ORVhUMiA9PSAweCV4XG4iLAorCSAgICAgICBhaGRfbmFtZShhaGQpLCBhaGRfZ2V0X3NjYnB0cihhaGQpLAorCSAgICAgICBhaGRfaW53X3NjYnJhbShhaGQsIFNDQl9ORVhUKSwKKwkgICAgICAgYWhkX2lud19zY2JyYW0oYWhkLCBTQ0JfTkVYVDIpKTsKKwlwcmludGYoIkNEQiAleCAleCAleCAleCAleCAleFxuIiwKKwkgICAgICAgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQ0RCX1NUT1JFKSwKKwkgICAgICAgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQ0RCX1NUT1JFKzEpLAorCSAgICAgICBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9DREJfU1RPUkUrMiksCisJICAgICAgIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0NEQl9TVE9SRSszKSwKKwkgICAgICAgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQ0RCX1NUT1JFKzQpLAorCSAgICAgICBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9DREJfU1RPUkUrNSkpOworCXByaW50ZigiU1RBQ0s6Iik7CisJZm9yIChpID0gMDsgaSA8IGFoZC0+c3RhY2tfc2l6ZTsgaSsrKSB7CisJCWFoZC0+c2F2ZWRfc3RhY2tbaV0gPQorCQkgICAgYWhkX2luYihhaGQsIFNUQUNLKXwoYWhkX2luYihhaGQsIFNUQUNLKSA8PCA4KTsKKwkJcHJpbnRmKCIgMHgleCIsIGFoZC0+c2F2ZWRfc3RhY2tbaV0pOworCX0KKwlmb3IgKGkgPSBhaGQtPnN0YWNrX3NpemUtMTsgaSA+PSAwOyBpLS0pIHsKKwkJYWhkX291dGIoYWhkLCBTVEFDSywgYWhkLT5zYXZlZF9zdGFja1tpXSAmIDB4RkYpOworCQlhaGRfb3V0YihhaGQsIFNUQUNLLCAoYWhkLT5zYXZlZF9zdGFja1tpXSA+PiA4KSAmIDB4RkYpOworCX0KKwlwcmludGYoIlxuPDw8PDw8PDw8PDw8PDw8PDwgRHVtcCBDYXJkIFN0YXRlIEVuZHMgPj4+Pj4+Pj4+Pj4+Pj4+Pj4+XG4iKTsKKwlhaGRfcGxhdGZvcm1fZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJYWhkX3Jlc3RvcmVfbW9kZXMoYWhkLCBzYXZlZF9tb2Rlcyk7CisJaWYgKHBhdXNlZCA9PSAwKQorCQlhaGRfdW5wYXVzZShhaGQpOworfQorCit2b2lkCithaGRfZHVtcF9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlhaGRfbW9kZV9zdGF0ZSBzYXZlZF9tb2RlczsKKwl1X2ludAkgICAgICAgc2F2ZWRfc2NiX2luZGV4OworCWludAkgICAgICAgaTsKKworCXNhdmVkX21vZGVzID0gYWhkX3NhdmVfbW9kZXMoYWhkKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJc2F2ZWRfc2NiX2luZGV4ID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwlmb3IgKGkgPSAwOyBpIDwgQUhEX1NDQl9NQVg7IGkrKykgeworCQlhaGRfc2V0X3NjYnB0cihhaGQsIGkpOworCQlwcmludGYoIiUzZCIsIGkpOworCQlwcmludGYoIihDVFJMIDB4JXggSUQgMHgleCBOIDB4JXggTjIgMHgleCBTRyAweCV4LCBSU0cgMHgleClcbiIsCisJCSAgICAgICBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9DT05UUk9MKSwKKwkJICAgICAgIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1NDU0lJRCksCisJCSAgICAgICBhaGRfaW53X3NjYnJhbShhaGQsIFNDQl9ORVhUKSwKKwkJICAgICAgIGFoZF9pbndfc2NicmFtKGFoZCwgU0NCX05FWFQyKSwKKwkJICAgICAgIGFoZF9pbmxfc2NicmFtKGFoZCwgU0NCX1NHUFRSKSwKKwkJICAgICAgIGFoZF9pbmxfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSKSk7CisJfQorCXByaW50ZigiXG4iKTsKKwlhaGRfc2V0X3NjYnB0cihhaGQsIHNhdmVkX3NjYl9pbmRleCk7CisJYWhkX3Jlc3RvcmVfbW9kZXMoYWhkLCBzYXZlZF9tb2Rlcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEZsZXhwb3J0IExvZ2ljICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogUmVhZCBjb3VudCAxNmJpdCB3b3JkcyBmcm9tIDE2Yml0IHdvcmQgYWRkcmVzcyBzdGFydF9hZGRyIGZyb20gdGhlCisgKiBTRUVQUk9NIGF0dGFjaGVkIHRvIHRoZSBjb250cm9sbGVyLCBpbnRvIGJ1ZiwgdXNpbmcgdGhlIGNvbnRyb2xsZXIncworICogU0VFUFJPTSByZWFkaW5nIHN0YXRlIG1hY2hpbmUuICBPcHRpb25hbGx5IHRyZWF0IHRoZSBkYXRhIGFzIGEgYnl0ZQorICogc3RyZWFtIGluIHRlcm1zIG9mIGJ5dGUgb3JkZXIuCisgKi8KK2ludAorYWhkX3JlYWRfc2VlcHJvbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVpbnQxNl90ICpidWYsCisJCSB1X2ludCBzdGFydF9hZGRyLCB1X2ludCBjb3VudCwgaW50IGJ5dGVzdHJlYW0pCit7CisJdV9pbnQgY3VyX2FkZHI7CisJdV9pbnQgZW5kX2FkZHI7CisJaW50ICAgZXJyb3I7CisKKwkvKgorCSAqIElmIHdlIG5ldmVyIG1ha2UgaXQgdGhyb3VnaCB0aGUgbG9vcCBldmVuIG9uY2UsCisJICogd2Ugd2VyZSBwYXNzZWQgaW52YWxpZCBhcmd1bWVudHMuCisJICovCisJZXJyb3IgPSBFSU5WQUw7CisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CisJZW5kX2FkZHIgPSBzdGFydF9hZGRyICsgY291bnQ7CisJZm9yIChjdXJfYWRkciA9IHN0YXJ0X2FkZHI7IGN1cl9hZGRyIDwgZW5kX2FkZHI7IGN1cl9hZGRyKyspIHsKKworCQlhaGRfb3V0YihhaGQsIFNFRUFEUiwgY3VyX2FkZHIpOworCQlhaGRfb3V0YihhaGQsIFNFRUNUTCwgU0VFT1BfUkVBRCB8IFNFRVNUQVJUKTsKKwkJCisJCWVycm9yID0gYWhkX3dhaXRfc2VlcHJvbShhaGQpOworCQlpZiAoZXJyb3IpCisJCQlicmVhazsKKwkJaWYgKGJ5dGVzdHJlYW0gIT0gMCkgeworCQkJdWludDhfdCAqYnl0ZXN0cmVhbV9wdHI7CisKKwkJCWJ5dGVzdHJlYW1fcHRyID0gKHVpbnQ4X3QgKilidWY7CisJCQkqYnl0ZXN0cmVhbV9wdHIrKyA9IGFoZF9pbmIoYWhkLCBTRUVEQVQpOworCQkJKmJ5dGVzdHJlYW1fcHRyID0gYWhkX2luYihhaGQsIFNFRURBVCsxKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBhaGRfaW53KCkgYWxyZWFkeSBoYW5kbGVzIG1hY2hpbmUgYnl0ZSBvcmRlci4KKwkJCSAqLworCQkJKmJ1ZiA9IGFoZF9pbncoYWhkLCBTRUVEQVQpOworCQl9CisJCWJ1ZisrOworCX0KKwlyZXR1cm4gKGVycm9yKTsKK30KKworLyoKKyAqIFdyaXRlIGNvdW50IDE2Yml0IHdvcmRzIGZyb20gYnVmLCBpbnRvIFNFRVBST00gYXR0YWNoZSB0byB0aGUKKyAqIGNvbnRyb2xsZXIgc3RhcnRpbmcgYXQgMTZiaXQgd29yZCBhZGRyZXNzIHN0YXJ0X2FkZHIsIHVzaW5nIHRoZQorICogY29udHJvbGxlcidzIFNFRVBST00gd3JpdGluZyBzdGF0ZSBtYWNoaW5lLgorICovCitpbnQKK2FoZF93cml0ZV9zZWVwcm9tKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdWludDE2X3QgKmJ1ZiwKKwkJICB1X2ludCBzdGFydF9hZGRyLCB1X2ludCBjb3VudCkKK3sKKwl1X2ludCBjdXJfYWRkcjsKKwl1X2ludCBlbmRfYWRkcjsKKwlpbnQgICBlcnJvcjsKKwlpbnQgICByZXR2YWw7CisKKwlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfU0NTSV9NU0ssIEFIRF9NT0RFX1NDU0lfTVNLKTsKKwllcnJvciA9IEVOT0VOVDsKKworCS8qIFBsYWNlIHRoZSBjaGlwIGludG8gd3JpdGUtZW5hYmxlIG1vZGUgKi8KKwlhaGRfb3V0YihhaGQsIFNFRUFEUiwgU0VFT1BfRVdFTl9BRERSKTsKKwlhaGRfb3V0YihhaGQsIFNFRUNUTCwgU0VFT1BfRVdFTiB8IFNFRVNUQVJUKTsKKwllcnJvciA9IGFoZF93YWl0X3NlZXByb20oYWhkKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiAoZXJyb3IpOworCisJLyoKKwkgKiBXcml0ZSB0aGUgZGF0YS4gIElmIHdlIGRvbid0IGdldCB0aHJvdWdodCB0aGUgbG9vcCBhdAorCSAqIGxlYXN0IG9uY2UsIHRoZSBhcmd1bWVudHMgd2VyZSBpbnZhbGlkLgorCSAqLworCXJldHZhbCA9IEVJTlZBTDsKKwllbmRfYWRkciA9IHN0YXJ0X2FkZHIgKyBjb3VudDsKKwlmb3IgKGN1cl9hZGRyID0gc3RhcnRfYWRkcjsgY3VyX2FkZHIgPCBlbmRfYWRkcjsgY3VyX2FkZHIrKykgeworCQlhaGRfb3V0dyhhaGQsIFNFRURBVCwgKmJ1ZisrKTsKKwkJYWhkX291dGIoYWhkLCBTRUVBRFIsIGN1cl9hZGRyKTsKKwkJYWhkX291dGIoYWhkLCBTRUVDVEwsIFNFRU9QX1dSSVRFIHwgU0VFU1RBUlQpOworCQkKKwkJcmV0dmFsID0gYWhkX3dhaXRfc2VlcHJvbShhaGQpOworCQlpZiAocmV0dmFsKQorCQkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBEaXNhYmxlIHdyaXRlcy4KKwkgKi8KKwlhaGRfb3V0YihhaGQsIFNFRUFEUiwgU0VFT1BfRVdEU19BRERSKTsKKwlhaGRfb3V0YihhaGQsIFNFRUNUTCwgU0VFT1BfRVdEUyB8IFNFRVNUQVJUKTsKKwllcnJvciA9IGFoZF93YWl0X3NlZXByb20oYWhkKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiAoZXJyb3IpOworCXJldHVybiAocmV0dmFsKTsKK30KKworLyoKKyAqIFdhaXQgfjEwMHVzIGZvciB0aGUgc2VyaWFsIGVlcHJvbSB0byBzYXRpc2Z5IG91ciByZXF1ZXN0LgorICovCitpbnQKK2FoZF93YWl0X3NlZXByb20oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCWludCBjbnQ7CisKKwljbnQgPSAyMDsKKwl3aGlsZSAoKGFoZF9pbmIoYWhkLCBTRUVTVEFUKSAmIChTRUVBUkJBQ0t8U0VFQlVTWSkpICE9IDAgJiYgLS1jbnQpCisJCWFoZF9kZWxheSg1KTsKKworCWlmIChjbnQgPT0gMCkKKwkJcmV0dXJuIChFVElNRURPVVQpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBWYWxpZGF0ZSB0aGUgdHdvIGNoZWNrc3VtcyBpbiB0aGUgcGVyX2NoYW5uZWwKKyAqIHZpdGFsIHByb2R1Y3QgZGF0YSBzdHJ1Y3QuCisgKi8KK2ludAorYWhkX3ZlcmlmeV92cGRfY2tzdW0oc3RydWN0IHZwZF9jb25maWcgKnZwZCkKK3sKKwlpbnQgaTsKKwlpbnQgbWF4YWRkcjsKKwl1aW50MzJfdCBjaGVja3N1bTsKKwl1aW50OF90ICp2cGRhcnJheTsKKworCXZwZGFycmF5ID0gKHVpbnQ4X3QgKil2cGQ7CisJbWF4YWRkciA9IG9mZnNldG9mKHN0cnVjdCB2cGRfY29uZmlnLCB2cGRfY2hlY2tzdW0pOworCWNoZWNrc3VtID0gMDsKKwlmb3IgKGkgPSBvZmZzZXRvZihzdHJ1Y3QgdnBkX2NvbmZpZywgcmVzb3VyY2VfdHlwZSk7IGkgPCBtYXhhZGRyOyBpKyspCisJCWNoZWNrc3VtID0gY2hlY2tzdW0gKyB2cGRhcnJheVtpXTsKKwlpZiAoY2hlY2tzdW0gPT0gMAorCSB8fCAoLWNoZWNrc3VtICYgMHhGRikgIT0gdnBkLT52cGRfY2hlY2tzdW0pCisJCXJldHVybiAoMCk7CisKKwljaGVja3N1bSA9IDA7CisJbWF4YWRkciA9IG9mZnNldG9mKHN0cnVjdCB2cGRfY29uZmlnLCBjaGVja3N1bSk7CisJZm9yIChpID0gb2Zmc2V0b2Yoc3RydWN0IHZwZF9jb25maWcsIGRlZmF1bHRfdGFyZ2V0X2ZsYWdzKTsKKwkgICAgIGkgPCBtYXhhZGRyOyBpKyspCisJCWNoZWNrc3VtID0gY2hlY2tzdW0gKyB2cGRhcnJheVtpXTsKKwlpZiAoY2hlY2tzdW0gPT0gMAorCSB8fCAoLWNoZWNrc3VtICYgMHhGRikgIT0gdnBkLT5jaGVja3N1bSkKKwkJcmV0dXJuICgwKTsKKwlyZXR1cm4gKDEpOworfQorCitpbnQKK2FoZF92ZXJpZnlfY2tzdW0oc3RydWN0IHNlZXByb21fY29uZmlnICpzYykKK3sKKwlpbnQgaTsKKwlpbnQgbWF4YWRkcjsKKwl1aW50MzJfdCBjaGVja3N1bTsKKwl1aW50MTZfdCAqc2NhcnJheTsKKworCW1heGFkZHIgPSAoc2l6ZW9mKCpzYykvMikgLSAxOworCWNoZWNrc3VtID0gMDsKKwlzY2FycmF5ID0gKHVpbnQxNl90ICopc2M7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4YWRkcjsgaSsrKQorCQljaGVja3N1bSA9IGNoZWNrc3VtICsgc2NhcnJheVtpXTsKKwlpZiAoY2hlY2tzdW0gPT0gMAorCSB8fCAoY2hlY2tzdW0gJiAweEZGRkYpICE9IHNjLT5jaGVja3N1bSkgeworCQlyZXR1cm4gKDApOworCX0gZWxzZSB7CisJCXJldHVybiAoMSk7CisJfQorfQorCitpbnQKK2FoZF9hY3F1aXJlX3NlZXByb20oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCS8qCisJICogV2Ugc2hvdWxkIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHRoZSBTRUVQUk9NIHR5cGUKKwkgKiBmcm9tIHRoZSBmbGV4cG9ydCBsb2dpYywgYnV0IHVuZm9ydHVuYXRlbHkgbm90CisJICogYWxsIGltcGxlbWVudGF0aW9ucyBoYXZlIHRoaXMgbG9naWMgYW5kIHRoZXJlIGlzCisJICogbm8gcHJvZ3JhbWF0aWMgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBpZiB0aGUgbG9naWMKKwkgKiBpcyBwcmVzZW50LgorCSAqLworCXJldHVybiAoMSk7CisjaWYgMAorCXVpbnQ4X3QJc2VldHlwZTsKKwlpbnQJZXJyb3I7CisKKwllcnJvciA9IGFoZF9yZWFkX2ZsZXhwb3J0KGFoZCwgRkxYQUREUl9ST01TVEFUX0NVUlNFTlNFQ1RMLCAmc2VldHlwZSk7CisJaWYgKGVycm9yICE9IDAKKyAgICAgICAgIHx8ICgoc2VldHlwZSAmIEZMWF9ST01TVEFUX1NFRUNGRykgPT0gRkxYX1JPTVNUQVRfU0VFX05PTkUpKQorCQlyZXR1cm4gKDApOworCXJldHVybiAoMSk7CisjZW5kaWYKK30KKwordm9pZAorYWhkX3JlbGVhc2Vfc2VlcHJvbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJLyogQ3VycmVudGx5IGEgbm8tb3AgKi8KK30KKworaW50CithaGRfd3JpdGVfZmxleHBvcnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBhZGRyLCB1X2ludCB2YWx1ZSkKK3sKKwlpbnQgZXJyb3I7CisKKwlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfU0NTSV9NU0ssIEFIRF9NT0RFX1NDU0lfTVNLKTsKKwlpZiAoYWRkciA+IDcpCisJCXBhbmljKCJhaGRfd3JpdGVfZmxleHBvcnQ6IGFkZHJlc3Mgb3V0IG9mIHJhbmdlIik7CisJYWhkX291dGIoYWhkLCBCUkRDVEwsIEJSREVOfChhZGRyIDw8IDMpKTsKKwllcnJvciA9IGFoZF93YWl0X2ZsZXhwb3J0KGFoZCk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOworCWFoZF9vdXRiKGFoZCwgQlJEREFULCB2YWx1ZSk7CisJYWhkX2ZsdXNoX2RldmljZV93cml0ZXMoYWhkKTsKKwlhaGRfb3V0YihhaGQsIEJSRENUTCwgQlJEU1RCfEJSREVOfChhZGRyIDw8IDMpKTsKKwlhaGRfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGQpOworCWFoZF9vdXRiKGFoZCwgQlJEQ1RMLCBCUkRFTnwoYWRkciA8PCAzKSk7CisJYWhkX2ZsdXNoX2RldmljZV93cml0ZXMoYWhkKTsKKwlhaGRfb3V0YihhaGQsIEJSRENUTCwgMCk7CisJYWhkX2ZsdXNoX2RldmljZV93cml0ZXMoYWhkKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK2FoZF9yZWFkX2ZsZXhwb3J0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgYWRkciwgdWludDhfdCAqdmFsdWUpCit7CisJaW50CWVycm9yOworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CisJaWYgKGFkZHIgPiA3KQorCQlwYW5pYygiYWhkX3JlYWRfZmxleHBvcnQ6IGFkZHJlc3Mgb3V0IG9mIHJhbmdlIik7CisJYWhkX291dGIoYWhkLCBCUkRDVEwsIEJSRFJXfEJSREVOfChhZGRyIDw8IDMpKTsKKwllcnJvciA9IGFoZF93YWl0X2ZsZXhwb3J0KGFoZCk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOworCSp2YWx1ZSA9IGFoZF9pbmIoYWhkLCBCUkREQVQpOworCWFoZF9vdXRiKGFoZCwgQlJEQ1RMLCAwKTsKKwlhaGRfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGQpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBXYWl0IGF0IG1vc3QgMiBzZWNvbmRzIGZvciBmbGV4cG9ydCBhcmJpdHJhdGlvbiB0byBzdWNjZWVkLgorICovCitpbnQKK2FoZF93YWl0X2ZsZXhwb3J0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlpbnQgY250OworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CisJY250ID0gMTAwMDAwMCAqIDIgLyA1OworCXdoaWxlICgoYWhkX2luYihhaGQsIEJSRENUTCkgJiBGTFhBUkJBQ0spID09IDAgJiYgLS1jbnQpCisJCWFoZF9kZWxheSg1KTsKKworCWlmIChjbnQgPT0gMCkKKwkJcmV0dXJuIChFVElNRURPVVQpOworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFRhcmdldCBNb2RlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCitjYW1fc3RhdHVzCithaGRfZmluZF90bW9kZV9kZXZzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGNhbV9zaW0gKnNpbSwgdW5pb24gY2NiICpjY2IsCisJCSAgICBzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqKnRzdGF0ZSwKKwkJICAgIHN0cnVjdCBhaGRfdG1vZGVfbHN0YXRlICoqbHN0YXRlLAorCQkgICAgaW50IG5vdGZvdW5kX2ZhaWx1cmUpCit7CisKKwlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfVEFSR0VUTU9ERSkgPT0gMCkKKwkJcmV0dXJuIChDQU1fUkVRX0lOVkFMSUQpOworCisJLyoKKwkgKiBIYW5kbGUgdGhlICdibGFjayBob2xlJyBkZXZpY2UgdGhhdCBzdWNrcyB1cAorCSAqIHJlcXVlc3RzIHRvIHVuYXR0YWNoZWQgbHVucyBvbiBlbmFibGVkIHRhcmdldHMuCisJICovCisJaWYgKGNjYi0+Y2NiX2gudGFyZ2V0X2lkID09IENBTV9UQVJHRVRfV0lMRENBUkQKKwkgJiYgY2NiLT5jY2JfaC50YXJnZXRfbHVuID09IENBTV9MVU5fV0lMRENBUkQpIHsKKwkJKnRzdGF0ZSA9IE5VTEw7CisJCSpsc3RhdGUgPSBhaGQtPmJsYWNrX2hvbGU7CisJfSBlbHNlIHsKKwkJdV9pbnQgbWF4X2lkOworCisJCW1heF9pZCA9IChhaGQtPmZlYXR1cmVzICYgQUhEX1dJREUpID8gMTUgOiA3OworCQlpZiAoY2NiLT5jY2JfaC50YXJnZXRfaWQgPiBtYXhfaWQpCisJCQlyZXR1cm4gKENBTV9USURfSU5WQUxJRCk7CisKKwkJaWYgKGNjYi0+Y2NiX2gudGFyZ2V0X2x1biA+PSBBSERfTlVNX0xVTlMpCisJCQlyZXR1cm4gKENBTV9MVU5fSU5WQUxJRCk7CisKKwkJKnRzdGF0ZSA9IGFoZC0+ZW5hYmxlZF90YXJnZXRzW2NjYi0+Y2NiX2gudGFyZ2V0X2lkXTsKKwkJKmxzdGF0ZSA9IE5VTEw7CisJCWlmICgqdHN0YXRlICE9IE5VTEwpCisJCQkqbHN0YXRlID0KKwkJCSAgICAoKnRzdGF0ZSktPmVuYWJsZWRfbHVuc1tjY2ItPmNjYl9oLnRhcmdldF9sdW5dOworCX0KKworCWlmIChub3Rmb3VuZF9mYWlsdXJlICE9IDAgJiYgKmxzdGF0ZSA9PSBOVUxMKQorCQlyZXR1cm4gKENBTV9QQVRIX0lOVkFMSUQpOworCisJcmV0dXJuIChDQU1fUkVRX0NNUCk7Cit9CisKK3ZvaWQKK2FoZF9oYW5kbGVfZW5fbHVuKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGNhbV9zaW0gKnNpbSwgdW5pb24gY2NiICpjY2IpCit7CisjaWYgTk9UX1lFVAorCXN0cnVjdAkgICBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJc3RydWN0CSAgIGFoZF90bW9kZV9sc3RhdGUgKmxzdGF0ZTsKKwlzdHJ1Y3QJICAgY2NiX2VuX2x1biAqY2VsOworCWNhbV9zdGF0dXMgc3RhdHVzOworCXVfaW50CSAgIHRhcmdldDsKKwl1X2ludAkgICBsdW47CisJdV9pbnQJICAgdGFyZ2V0X21hc2s7CisJdV9sb25nCSAgIHM7CisJY2hhcgkgICBjaGFubmVsOworCisJc3RhdHVzID0gYWhkX2ZpbmRfdG1vZGVfZGV2cyhhaGQsIHNpbSwgY2NiLCAmdHN0YXRlLCAmbHN0YXRlLAorCQkJCSAgICAgLypub3Rmb3VuZF9mYWlsdXJlKi9GQUxTRSk7CisKKwlpZiAoc3RhdHVzICE9IENBTV9SRVFfQ01QKSB7CisJCWNjYi0+Y2NiX2guc3RhdHVzID0gc3RhdHVzOworCQlyZXR1cm47CisJfQorCisJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX01VTFRJUk9MRSkgIT0gMCkgeworCQl1X2ludAkgICBvdXJfaWQ7CisKKwkJb3VyX2lkID0gYWhkLT5vdXJfaWQ7CisJCWlmIChjY2ItPmNjYl9oLnRhcmdldF9pZCAhPSBvdXJfaWQpIHsKKwkJCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9NVUxUSV9USUQpICE9IDAKKwkJICAgCSAmJiAoYWhkLT5mbGFncyAmIEFIRF9JTklUSUFUT1JST0xFKSAhPSAwKSB7CisJCQkJLyoKKwkJCQkgKiBPbmx5IGFsbG93IGFkZGl0aW9uYWwgdGFyZ2V0cyBpZgorCQkJCSAqIHRoZSBpbml0aWF0b3Igcm9sZSBpcyBkaXNhYmxlZC4KKwkJCQkgKiBUaGUgaGFyZHdhcmUgY2Fubm90IGhhbmRsZSBhIHJlLXNlbGVjdC1pbgorCQkJCSAqIG9uIHRoZSBpbml0aWF0b3IgaWQgZHVyaW5nIGEgcmUtc2VsZWN0LW91dAorCQkJCSAqIG9uIGEgZGlmZmVyZW50IHRhcmdldCBpZC4KKwkJCQkgKi8KKwkJCQlzdGF0dXMgPSBDQU1fVElEX0lOVkFMSUQ7CisJCQl9IGVsc2UgaWYgKChhaGQtPmZsYWdzICYgQUhEX0lOSVRJQVRPUlJPTEUpICE9IDAKKwkJCQl8fCBhaGQtPmVuYWJsZWRfbHVucyA+IDApIHsKKwkJCQkvKgorCQkJCSAqIE9ubHkgYWxsb3cgb3VyIHRhcmdldCBpZCB0byBjaGFuZ2UKKwkJCQkgKiBpZiB0aGUgaW5pdGlhdG9yIHJvbGUgaXMgbm90IGNvbmZpZ3VyZWQKKwkJCQkgKiBhbmQgdGhlcmUgYXJlIG5vIGVuYWJsZWQgbHVucyB3aGljaAorCQkJCSAqIGFyZSBhdHRhY2hlZCB0byB0aGUgY3VycmVudGx5IHJlZ2lzdGVyZWQKKwkJCQkgKiBzY3NpIGlkLgorCQkJCSAqLworCQkJCXN0YXR1cyA9IENBTV9USURfSU5WQUxJRDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChzdGF0dXMgIT0gQ0FNX1JFUV9DTVApIHsKKwkJY2NiLT5jY2JfaC5zdGF0dXMgPSBzdGF0dXM7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFdlIG5vdyBoYXZlIGFuIGlkIHRoYXQgaXMgdmFsaWQuCisJICogSWYgd2UgYXJlbid0IGluIHRhcmdldCBtb2RlLCBzd2l0Y2ggbW9kZXMuCisJICovCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX1RBUkdFVFJPTEUpID09IDAKKwkgJiYgY2NiLT5jY2JfaC50YXJnZXRfaWQgIT0gQ0FNX1RBUkdFVF9XSUxEQ0FSRCkgeworCQl1X2xvbmcJczsKKworCQlwcmludGYoIkNvbmZpZ3VyaW5nIFRhcmdldCBNb2RlXG4iKTsKKwkJYWhkX2xvY2soYWhkLCAmcyk7CisJCWlmIChMSVNUX0ZJUlNUKCZhaGQtPnBlbmRpbmdfc2NicykgIT0gTlVMTCkgeworCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fQlVTWTsKKwkJCWFoZF91bmxvY2soYWhkLCAmcyk7CisJCQlyZXR1cm47CisJCX0KKwkJYWhkLT5mbGFncyB8PSBBSERfVEFSR0VUUk9MRTsKKwkJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX01VTFRJUk9MRSkgPT0gMCkKKwkJCWFoZC0+ZmxhZ3MgJj0gfkFIRF9JTklUSUFUT1JST0xFOworCQlhaGRfcGF1c2UoYWhkKTsKKwkJYWhkX2xvYWRzZXEoYWhkKTsKKwkJYWhkX3Jlc3RhcnQoYWhkKTsKKwkJYWhkX3VubG9jayhhaGQsICZzKTsKKwl9CisJY2VsID0gJmNjYi0+Y2VsOworCXRhcmdldCA9IGNjYi0+Y2NiX2gudGFyZ2V0X2lkOworCWx1biA9IGNjYi0+Y2NiX2gudGFyZ2V0X2x1bjsKKwljaGFubmVsID0gU0lNX0NIQU5ORUwoYWhkLCBzaW0pOworCXRhcmdldF9tYXNrID0gMHgwMSA8PCB0YXJnZXQ7CisJaWYgKGNoYW5uZWwgPT0gJ0InKQorCQl0YXJnZXRfbWFzayA8PD0gODsKKworCWlmIChjZWwtPmVuYWJsZSAhPSAwKSB7CisJCXVfaW50IHNjc2lzZXExOworCisJCS8qIEFyZSB3ZSBhbHJlYWR5IGVuYWJsZWQ/PyAqLworCQlpZiAobHN0YXRlICE9IE5VTEwpIHsKKwkJCXhwdF9wcmludF9wYXRoKGNjYi0+Y2NiX2gucGF0aCk7CisJCQlwcmludGYoIkx1biBhbHJlYWR5IGVuYWJsZWRcbiIpOworCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fTFVOX0FMUkRZX0VOQTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChjZWwtPmdycDZfbGVuICE9IDAKKwkJIHx8IGNlbC0+Z3JwN19sZW4gIT0gMCkgeworCQkJLyoKKwkJCSAqIERvbid0ICh5ZXQ/KSBzdXBwb3J0IHZlbmRvcgorCQkJICogc3BlY2lmaWMgY29tbWFuZHMuCisJCQkgKi8KKwkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFUV9JTlZBTElEOworCQkJcHJpbnRmKCJOb24temVybyBHcm91cCBDb2Rlc1xuIik7CisJCQlyZXR1cm47CisJCX0KKworCQkvKgorCQkgKiBTZWVtcyB0byBiZSBva2F5LgorCQkgKiBTZXR1cCBvdXIgZGF0YSBzdHJ1Y3R1cmVzLgorCQkgKi8KKwkJaWYgKHRhcmdldCAhPSBDQU1fVEFSR0VUX1dJTERDQVJEICYmIHRzdGF0ZSA9PSBOVUxMKSB7CisJCQl0c3RhdGUgPSBhaGRfYWxsb2NfdHN0YXRlKGFoZCwgdGFyZ2V0LCBjaGFubmVsKTsKKwkJCWlmICh0c3RhdGUgPT0gTlVMTCkgeworCQkJCXhwdF9wcmludF9wYXRoKGNjYi0+Y2NiX2gucGF0aCk7CisJCQkJcHJpbnRmKCJDb3VsZG4ndCBhbGxvY2F0ZSB0c3RhdGVcbiIpOworCQkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFU1JDX1VOQVZBSUw7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWxzdGF0ZSA9IG1hbGxvYyhzaXplb2YoKmxzdGF0ZSksIE1fREVWQlVGLCBNX05PV0FJVCk7CisJCWlmIChsc3RhdGUgPT0gTlVMTCkgeworCQkJeHB0X3ByaW50X3BhdGgoY2NiLT5jY2JfaC5wYXRoKTsKKwkJCXByaW50ZigiQ291bGRuJ3QgYWxsb2NhdGUgbHN0YXRlXG4iKTsKKwkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFU1JDX1VOQVZBSUw7CisJCQlyZXR1cm47CisJCX0KKwkJbWVtc2V0KGxzdGF0ZSwgMCwgc2l6ZW9mKCpsc3RhdGUpKTsKKwkJc3RhdHVzID0geHB0X2NyZWF0ZV9wYXRoKCZsc3RhdGUtPnBhdGgsIC8qcGVyaXBoKi9OVUxMLAorCQkJCQkgeHB0X3BhdGhfcGF0aF9pZChjY2ItPmNjYl9oLnBhdGgpLAorCQkJCQkgeHB0X3BhdGhfdGFyZ2V0X2lkKGNjYi0+Y2NiX2gucGF0aCksCisJCQkJCSB4cHRfcGF0aF9sdW5faWQoY2NiLT5jY2JfaC5wYXRoKSk7CisJCWlmIChzdGF0dXMgIT0gQ0FNX1JFUV9DTVApIHsKKwkJCWZyZWUobHN0YXRlLCBNX0RFVkJVRik7CisJCQl4cHRfcHJpbnRfcGF0aChjY2ItPmNjYl9oLnBhdGgpOworCQkJcHJpbnRmKCJDb3VsZG4ndCBhbGxvY2F0ZSBwYXRoXG4iKTsKKwkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFU1JDX1VOQVZBSUw7CisJCQlyZXR1cm47CisJCX0KKwkJU0xJU1RfSU5JVCgmbHN0YXRlLT5hY2NlcHRfdGlvcyk7CisJCVNMSVNUX0lOSVQoJmxzdGF0ZS0+aW1tZWRfbm90aWZpZXMpOworCQlhaGRfbG9jayhhaGQsICZzKTsKKwkJYWhkX3BhdXNlKGFoZCk7CisJCWlmICh0YXJnZXQgIT0gQ0FNX1RBUkdFVF9XSUxEQ0FSRCkgeworCQkJdHN0YXRlLT5lbmFibGVkX2x1bnNbbHVuXSA9IGxzdGF0ZTsKKwkJCWFoZC0+ZW5hYmxlZF9sdW5zKys7CisKKwkJCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9NVUxUSV9USUQpICE9IDApIHsKKwkJCQl1X2ludCB0YXJnaWRfbWFzazsKKworCQkJCXRhcmdpZF9tYXNrID0gYWhkX2luYihhaGQsIFRBUkdJRCkKKwkJCQkJICAgIHwgKGFoZF9pbmIoYWhkLCBUQVJHSUQgKyAxKSA8PCA4KTsKKworCQkJCXRhcmdpZF9tYXNrIHw9IHRhcmdldF9tYXNrOworCQkJCWFoZF9vdXRiKGFoZCwgVEFSR0lELCB0YXJnaWRfbWFzayk7CisJCQkJYWhkX291dGIoYWhkLCBUQVJHSUQrMSwgKHRhcmdpZF9tYXNrID4+IDgpKTsKKwkJCQkKKwkJCQlhaGRfdXBkYXRlX3Njc2lpZChhaGQsIHRhcmdpZF9tYXNrKTsKKwkJCX0gZWxzZSB7CisJCQkJdV9pbnQgb3VyX2lkOworCQkJCWNoYXIgIGNoYW5uZWw7CisKKwkJCQljaGFubmVsID0gU0lNX0NIQU5ORUwoYWhkLCBzaW0pOworCQkJCW91cl9pZCA9IFNJTV9TQ1NJX0lEKGFoZCwgc2ltKTsKKworCQkJCS8qCisJCQkJICogVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgc2VsZWN0aW9ucworCQkJCSAqIGFyZSBub3QgZW5hYmxlZAorCQkJCSAqLworCQkJCWlmICh0YXJnZXQgIT0gb3VyX2lkKSB7CisJCQkJCXVfaW50IHNibGtjdGw7CisJCQkJCWNoYXIgIGN1cl9jaGFubmVsOworCQkJCQlpbnQgICBzd2FwOworCisJCQkJCXNibGtjdGwgPSBhaGRfaW5iKGFoZCwgU0JMS0NUTCk7CisJCQkJCWN1cl9jaGFubmVsID0gKHNibGtjdGwgJiBTRUxCVVNCKQorCQkJCQkJICAgID8gJ0InIDogJ0EnOworCQkJCQlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfVFdJTikgPT0gMCkKKwkJCQkJCWN1cl9jaGFubmVsID0gJ0EnOworCQkJCQlzd2FwID0gY3VyX2NoYW5uZWwgIT0gY2hhbm5lbDsKKwkJCQkJYWhkLT5vdXJfaWQgPSB0YXJnZXQ7CisKKwkJCQkJaWYgKHN3YXApCisJCQkJCQlhaGRfb3V0YihhaGQsIFNCTEtDVEwsCisJCQkJCQkJIHNibGtjdGwgXiBTRUxCVVNCKTsKKworCQkJCQlhaGRfb3V0YihhaGQsIFNDU0lJRCwgdGFyZ2V0KTsKKworCQkJCQlpZiAoc3dhcCkKKwkJCQkJCWFoZF9vdXRiKGFoZCwgU0JMS0NUTCwgc2Jsa2N0bCk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UKKwkJCWFoZC0+YmxhY2tfaG9sZSA9IGxzdGF0ZTsKKwkJLyogQWxsb3cgc2VsZWN0LWluIG9wZXJhdGlvbnMgKi8KKwkJaWYgKGFoZC0+YmxhY2tfaG9sZSAhPSBOVUxMICYmIGFoZC0+ZW5hYmxlZF9sdW5zID4gMCkgeworCQkJc2NzaXNlcTEgPSBhaGRfaW5iKGFoZCwgU0NTSVNFUV9URU1QTEFURSk7CisJCQlzY3Npc2VxMSB8PSBFTlNFTEk7CisJCQlhaGRfb3V0YihhaGQsIFNDU0lTRVFfVEVNUExBVEUsIHNjc2lzZXExKTsKKwkJCXNjc2lzZXExID0gYWhkX2luYihhaGQsIFNDU0lTRVExKTsKKwkJCXNjc2lzZXExIHw9IEVOU0VMSTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTEsIHNjc2lzZXExKTsKKwkJfQorCQlhaGRfdW5wYXVzZShhaGQpOworCQlhaGRfdW5sb2NrKGFoZCwgJnMpOworCQljY2ItPmNjYl9oLnN0YXR1cyA9IENBTV9SRVFfQ01QOworCQl4cHRfcHJpbnRfcGF0aChjY2ItPmNjYl9oLnBhdGgpOworCQlwcmludGYoIkx1biBub3cgZW5hYmxlZCBmb3IgdGFyZ2V0IG1vZGVcbiIpOworCX0gZWxzZSB7CisJCXN0cnVjdCBzY2IgKnNjYjsKKwkJaW50IGksIGVtcHR5OworCisJCWlmIChsc3RhdGUgPT0gTlVMTCkgeworCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fTFVOX0lOVkFMSUQ7CisJCQlyZXR1cm47CisJCX0KKworCQlhaGRfbG9jayhhaGQsICZzKTsKKwkJCisJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFUV9DTVA7CisJCUxJU1RfRk9SRUFDSChzY2IsICZhaGQtPnBlbmRpbmdfc2NicywgcGVuZGluZ19saW5rcykgeworCQkJc3RydWN0IGNjYl9oZHIgKmNjYmg7CisKKwkJCWNjYmggPSAmc2NiLT5pb19jdHgtPmNjYl9oOworCQkJaWYgKGNjYmgtPmZ1bmNfY29kZSA9PSBYUFRfQ09OVF9UQVJHRVRfSU8KKwkJCSAmJiAheHB0X3BhdGhfY29tcChjY2JoLT5wYXRoLCBjY2ItPmNjYl9oLnBhdGgpKXsKKwkJCQlwcmludGYoIkNUSU8gcGVuZGluZ1xuIik7CisJCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fUkVRX0lOVkFMSUQ7CisJCQkJYWhkX3VubG9jayhhaGQsICZzKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlpZiAoU0xJU1RfRklSU1QoJmxzdGF0ZS0+YWNjZXB0X3Rpb3MpICE9IE5VTEwpIHsKKwkJCXByaW50ZigiQVRJT3MgcGVuZGluZ1xuIik7CisJCQljY2ItPmNjYl9oLnN0YXR1cyA9IENBTV9SRVFfSU5WQUxJRDsKKwkJfQorCisJCWlmIChTTElTVF9GSVJTVCgmbHN0YXRlLT5pbW1lZF9ub3RpZmllcykgIT0gTlVMTCkgeworCQkJcHJpbnRmKCJJTk9UcyBwZW5kaW5nXG4iKTsKKwkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFUV9JTlZBTElEOworCQl9CisKKwkJaWYgKGNjYi0+Y2NiX2guc3RhdHVzICE9IENBTV9SRVFfQ01QKSB7CisJCQlhaGRfdW5sb2NrKGFoZCwgJnMpOworCQkJcmV0dXJuOworCQl9CisKKwkJeHB0X3ByaW50X3BhdGgoY2NiLT5jY2JfaC5wYXRoKTsKKwkJcHJpbnRmKCJUYXJnZXQgbW9kZSBkaXNhYmxlZFxuIik7CisJCXhwdF9mcmVlX3BhdGgobHN0YXRlLT5wYXRoKTsKKwkJZnJlZShsc3RhdGUsIE1fREVWQlVGKTsKKworCQlhaGRfcGF1c2UoYWhkKTsKKwkJLyogQ2FuIHdlIGNsZWFuIHVwIHRoZSB0YXJnZXQgdG9vPyAqLworCQlpZiAodGFyZ2V0ICE9IENBTV9UQVJHRVRfV0lMRENBUkQpIHsKKwkJCXRzdGF0ZS0+ZW5hYmxlZF9sdW5zW2x1bl0gPSBOVUxMOworCQkJYWhkLT5lbmFibGVkX2x1bnMtLTsKKwkJCWZvciAoZW1wdHkgPSAxLCBpID0gMDsgaSA8IDg7IGkrKykKKwkJCQlpZiAodHN0YXRlLT5lbmFibGVkX2x1bnNbaV0gIT0gTlVMTCkgeworCQkJCQllbXB0eSA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJaWYgKGVtcHR5KSB7CisJCQkJYWhkX2ZyZWVfdHN0YXRlKGFoZCwgdGFyZ2V0LCBjaGFubmVsLAorCQkJCQkJLypmb3JjZSovRkFMU0UpOworCQkJCWlmIChhaGQtPmZlYXR1cmVzICYgQUhEX01VTFRJX1RJRCkgeworCQkJCQl1X2ludCB0YXJnaWRfbWFzazsKKworCQkJCQl0YXJnaWRfbWFzayA9IGFoZF9pbmIoYWhkLCBUQVJHSUQpCisJCQkJCQkgICAgfCAoYWhkX2luYihhaGQsIFRBUkdJRCArIDEpCisJCQkJCQkgICAgICAgPDwgOCk7CisKKwkJCQkJdGFyZ2lkX21hc2sgJj0gfnRhcmdldF9tYXNrOworCQkJCQlhaGRfb3V0YihhaGQsIFRBUkdJRCwgdGFyZ2lkX21hc2spOworCQkJCQlhaGRfb3V0YihhaGQsIFRBUkdJRCsxLAorCQkJCQkgCSAodGFyZ2lkX21hc2sgPj4gOCkpOworCQkJCQlhaGRfdXBkYXRlX3Njc2lpZChhaGQsIHRhcmdpZF9tYXNrKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisKKwkJCWFoZC0+YmxhY2tfaG9sZSA9IE5VTEw7CisKKwkJCS8qCisJCQkgKiBXZSBjYW4ndCBhbGxvdyBzZWxlY3Rpb25zIHdpdGhvdXQKKwkJCSAqIG91ciBibGFjayBob2xlIGRldmljZS4KKwkJCSAqLworCQkJZW1wdHkgPSBUUlVFOworCQl9CisJCWlmIChhaGQtPmVuYWJsZWRfbHVucyA9PSAwKSB7CisJCQkvKiBEaXNhbGxvdyBzZWxlY3QtaW4gKi8KKwkJCXVfaW50IHNjc2lzZXExOworCisJCQlzY3Npc2VxMSA9IGFoZF9pbmIoYWhkLCBTQ1NJU0VRX1RFTVBMQVRFKTsKKwkJCXNjc2lzZXExICY9IH5FTlNFTEk7CisJCQlhaGRfb3V0YihhaGQsIFNDU0lTRVFfVEVNUExBVEUsIHNjc2lzZXExKTsKKwkJCXNjc2lzZXExID0gYWhkX2luYihhaGQsIFNDU0lTRVExKTsKKwkJCXNjc2lzZXExICY9IH5FTlNFTEk7CisJCQlhaGRfb3V0YihhaGQsIFNDU0lTRVExLCBzY3Npc2VxMSk7CisKKwkJCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9NVUxUSVJPTEUpID09IDApIHsKKwkJCQlwcmludGYoIkNvbmZpZ3VyaW5nIEluaXRpYXRvciBNb2RlXG4iKTsKKwkJCQlhaGQtPmZsYWdzICY9IH5BSERfVEFSR0VUUk9MRTsKKwkJCQlhaGQtPmZsYWdzIHw9IEFIRF9JTklUSUFUT1JST0xFOworCQkJCWFoZF9wYXVzZShhaGQpOworCQkJCWFoZF9sb2Fkc2VxKGFoZCk7CisJCQkJYWhkX3Jlc3RhcnQoYWhkKTsKKwkJCQkvKgorCQkJCSAqIFVucGF1c2VkLiAgVGhlIGV4dHJhIHVucGF1c2UKKwkJCQkgKiB0aGF0IGZvbGxvd3MgaXMgaGFybWxlc3MuCisJCQkJICovCisJCQl9CisJCX0KKwkJYWhkX3VucGF1c2UoYWhkKTsKKwkJYWhkX3VubG9jayhhaGQsICZzKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FoZF91cGRhdGVfc2NzaWlkKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdGFyZ2lkX21hc2spCit7CisjaWYgTk9UX1lFVAorCXVfaW50IHNjc2lpZF9tYXNrOworCXVfaW50IHNjc2lpZDsKKworCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9NVUxUSV9USUQpID09IDApCisJCXBhbmljKCJhaGRfdXBkYXRlX3Njc2lpZCBjYWxsZWQgb24gbm9uLW11bHRpdGlkIHVuaXRcbiIpOworCisJLyoKKwkgKiBTaW5jZSB3ZSB3aWxsIHJlbHkgb24gdGhlIFRBUkdJRCBtYXNrCisJICogZm9yIHNlbGVjdGlvbiBlbmFibGVzLCBlbnN1cmUgdGhhdCBPSUQKKwkgKiBpbiBTQ1NJSUQgaXMgbm90IHNldCB0byBzb21lIG90aGVyIElECisJICogdGhhdCB3ZSBkb24ndCB3YW50IHRvIGFsbG93IHNlbGVjdGlvbnMgb24uCisJICovCisJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX1VMVFJBMikgIT0gMCkKKwkJc2NzaWlkID0gYWhkX2luYihhaGQsIFNDU0lJRF9VTFRSQTIpOworCWVsc2UKKwkJc2NzaWlkID0gYWhkX2luYihhaGQsIFNDU0lJRCk7CisJc2NzaWlkX21hc2sgPSAweDEgPDwgKHNjc2lpZCAmIE9JRCk7CisJaWYgKCh0YXJnaWRfbWFzayAmIHNjc2lpZF9tYXNrKSA9PSAwKSB7CisJCXVfaW50IG91cl9pZDsKKworCQkvKiBmZnMgY291bnRzIGZyb20gMSAqLworCQlvdXJfaWQgPSBmZnModGFyZ2lkX21hc2spOworCQlpZiAob3VyX2lkID09IDApCisJCQlvdXJfaWQgPSBhaGQtPm91cl9pZDsKKwkJZWxzZQorCQkJb3VyX2lkLS07CisJCXNjc2lpZCAmPSBUSUQ7CisJCXNjc2lpZCB8PSBvdXJfaWQ7CisJfQorCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9VTFRSQTIpICE9IDApCisJCWFoZF9vdXRiKGFoZCwgU0NTSUlEX1VMVFJBMiwgc2NzaWlkKTsKKwllbHNlCisJCWFoZF9vdXRiKGFoZCwgU0NTSUlELCBzY3NpaWQpOworI2VuZGlmCit9CisKK3ZvaWQKK2FoZF9ydW5fdHFpbmZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgcGF1c2VkKQoreworCXN0cnVjdCB0YXJnZXRfY21kICpjbWQ7CisKKwlhaGRfc3luY190cWluZmlmbyhhaGQsIEJVU19ETUFTWU5DX1BPU1RSRUFEKTsKKwl3aGlsZSAoKGNtZCA9ICZhaGQtPnRhcmdldGNtZHNbYWhkLT50cWluZmlmb25leHRdKS0+Y21kX3ZhbGlkICE9IDApIHsKKworCQkvKgorCQkgKiBPbmx5IGFkdmFuY2UgdGhyb3VnaCB0aGUgcXVldWUgaWYgd2UKKwkJICogaGF2ZSB0aGUgcmVzb3VyY2VzIHRvIHByb2Nlc3MgdGhlIGNvbW1hbmQuCisJCSAqLworCQlpZiAoYWhkX2hhbmRsZV90YXJnZXRfY21kKGFoZCwgY21kKSAhPSAwKQorCQkJYnJlYWs7CisKKwkJY21kLT5jbWRfdmFsaWQgPSAwOworCQlhaGRfZG1hbWFwX3N5bmMoYWhkLCBhaGQtPnNoYXJlZF9kYXRhX2RtYXQsCisJCQkJYWhkLT5zaGFyZWRfZGF0YV9kbWFtYXAsCisJCQkJYWhkX3RhcmdldGNtZF9vZmZzZXQoYWhkLCBhaGQtPnRxaW5maWZvbmV4dCksCisJCQkJc2l6ZW9mKHN0cnVjdCB0YXJnZXRfY21kKSwKKwkJCQlCVVNfRE1BU1lOQ19QUkVSRUFEKTsKKwkJYWhkLT50cWluZmlmb25leHQrKzsKKworCQkvKgorCQkgKiBMYXppbHkgdXBkYXRlIG91ciBwb3NpdGlvbiBpbiB0aGUgdGFyZ2V0IG1vZGUgaW5jb21pbmcKKwkJICogY29tbWFuZCBxdWV1ZSBhcyBzZWVuIGJ5IHRoZSBzZXF1ZW5jZXIuCisJCSAqLworCQlpZiAoKGFoZC0+dHFpbmZpZm9uZXh0ICYgKEhPU1RfVFFJTlBPUyAtIDEpKSA9PSAxKSB7CisJCQl1X2ludCBoc19tYWlsYm94OworCisJCQloc19tYWlsYm94ID0gYWhkX2luYihhaGQsIEhTX01BSUxCT1gpOworCQkJaHNfbWFpbGJveCAmPSB+SE9TVF9UUUlOUE9TOworCQkJaHNfbWFpbGJveCB8PSBhaGQtPnRxaW5maWZvbmV4dCAmIEhPU1RfVFFJTlBPUzsKKwkJCWFoZF9vdXRiKGFoZCwgSFNfTUFJTEJPWCwgaHNfbWFpbGJveCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQKK2FoZF9oYW5kbGVfdGFyZ2V0X2NtZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCB0YXJnZXRfY21kICpjbWQpCit7CisJc3RydWN0CSAgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXN0cnVjdAkgIGFoZF90bW9kZV9sc3RhdGUgKmxzdGF0ZTsKKwlzdHJ1Y3QJICBjY2JfYWNjZXB0X3RpbyAqYXRpbzsKKwl1aW50OF90ICpieXRlOworCWludAkgIGluaXRpYXRvcjsKKwlpbnQJICB0YXJnZXQ7CisJaW50CSAgbHVuOworCisJaW5pdGlhdG9yID0gU0NTSUlEX1RBUkdFVChhaGQsIGNtZC0+c2NzaWlkKTsKKwl0YXJnZXQgPSBTQ1NJSURfT1VSX0lEKGNtZC0+c2NzaWlkKTsKKwlsdW4gICAgPSAoY21kLT5pZGVudGlmeSAmIE1TR19JREVOVElGWV9MVU5NQVNLKTsKKworCWJ5dGUgPSBjbWQtPmJ5dGVzOworCXRzdGF0ZSA9IGFoZC0+ZW5hYmxlZF90YXJnZXRzW3RhcmdldF07CisJbHN0YXRlID0gTlVMTDsKKwlpZiAodHN0YXRlICE9IE5VTEwpCisJCWxzdGF0ZSA9IHRzdGF0ZS0+ZW5hYmxlZF9sdW5zW2x1bl07CisKKwkvKgorCSAqIENvbW1hbmRzIGZvciBkaXNhYmxlZCBsdW5zIGdvIHRvIHRoZSBibGFjayBob2xlIGRyaXZlci4KKwkgKi8KKwlpZiAobHN0YXRlID09IE5VTEwpCisJCWxzdGF0ZSA9IGFoZC0+YmxhY2tfaG9sZTsKKworCWF0aW8gPSAoc3RydWN0IGNjYl9hY2NlcHRfdGlvKilTTElTVF9GSVJTVCgmbHN0YXRlLT5hY2NlcHRfdGlvcyk7CisJaWYgKGF0aW8gPT0gTlVMTCkgeworCQlhaGQtPmZsYWdzIHw9IEFIRF9UUUlORklGT19CTE9DS0VEOworCQkvKgorCQkgKiBXYWl0IGZvciBtb3JlIEFUSU9zIGZyb20gdGhlIHBlcmlwaGVyYWwgZHJpdmVyIGZvciB0aGlzIGx1bi4KKwkJICovCisJCXJldHVybiAoMSk7CisJfSBlbHNlCisJCWFoZC0+ZmxhZ3MgJj0gfkFIRF9UUUlORklGT19CTE9DS0VEOworI2lmZGVmIEFIRF9ERUJVRworCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfVFFJTikgIT0gMCkKKwkJcHJpbnRmKCJJbmNvbWluZyBjb21tYW5kIGZyb20gJWQgZm9yICVkOiVkJXNcbiIsCisJCSAgICAgICBpbml0aWF0b3IsIHRhcmdldCwgbHVuLAorCQkgICAgICAgbHN0YXRlID09IGFoZC0+YmxhY2tfaG9sZSA/ICIoQmxhY2sgSG9sZWQpIiA6ICIiKTsKKyNlbmRpZgorCVNMSVNUX1JFTU9WRV9IRUFEKCZsc3RhdGUtPmFjY2VwdF90aW9zLCBzaW1fbGlua3Muc2xlKTsKKworCWlmIChsc3RhdGUgPT0gYWhkLT5ibGFja19ob2xlKSB7CisJCS8qIEZpbGwgaW4gdGhlIHdpbGRjYXJkcyAqLworCQlhdGlvLT5jY2JfaC50YXJnZXRfaWQgPSB0YXJnZXQ7CisJCWF0aW8tPmNjYl9oLnRhcmdldF9sdW4gPSBsdW47CisJfQorCisJLyoKKwkgKiBQYWNrYWdlIGl0IHVwIGFuZCBzZW5kIGl0IG9mZiB0bworCSAqIHdob21ldmVyIGhhcyB0aGlzIGx1biBlbmFibGVkLgorCSAqLworCWF0aW8tPnNlbnNlX2xlbiA9IDA7CisJYXRpby0+aW5pdF9pZCA9IGluaXRpYXRvcjsKKwlpZiAoYnl0ZVswXSAhPSAweEZGKSB7CisJCS8qIFRhZyB3YXMgaW5jbHVkZWQgKi8KKwkJYXRpby0+dGFnX2FjdGlvbiA9ICpieXRlKys7CisJCWF0aW8tPnRhZ19pZCA9ICpieXRlKys7CisJCWF0aW8tPmNjYl9oLmZsYWdzID0gQ0FNX1RBR19BQ1RJT05fVkFMSUQ7CisJfSBlbHNlIHsKKwkJYXRpby0+Y2NiX2guZmxhZ3MgPSAwOworCX0KKwlieXRlKys7CisKKwkvKiBPa2F5LiAgTm93IGRldGVybWluZSB0aGUgY2RiIHNpemUgYmFzZWQgb24gdGhlIGNvbW1hbmQgY29kZSAqLworCXN3aXRjaCAoKmJ5dGUgPj4gQ01EX0dST1VQX0NPREVfU0hJRlQpIHsKKwljYXNlIDA6CisJCWF0aW8tPmNkYl9sZW4gPSA2OworCQlicmVhazsKKwljYXNlIDE6CisJY2FzZSAyOgorCQlhdGlvLT5jZGJfbGVuID0gMTA7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJYXRpby0+Y2RiX2xlbiA9IDE2OworCQlicmVhazsKKwljYXNlIDU6CisJCWF0aW8tPmNkYl9sZW4gPSAxMjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCWRlZmF1bHQ6CisJCS8qIE9ubHkgY29weSB0aGUgb3Bjb2RlLiAqLworCQlhdGlvLT5jZGJfbGVuID0gMTsKKwkJcHJpbnRmKCJSZXNlcnZlZCBvciBWVSBjb21tYW5kIGNvZGUgdHlwZSBlbmNvdW50ZXJlZFxuIik7CisJCWJyZWFrOworCX0KKwkKKwltZW1jcHkoYXRpby0+Y2RiX2lvLmNkYl9ieXRlcywgYnl0ZSwgYXRpby0+Y2RiX2xlbik7CisKKwlhdGlvLT5jY2JfaC5zdGF0dXMgfD0gQ0FNX0NEQl9SRUNWRDsKKworCWlmICgoY21kLT5pZGVudGlmeSAmIE1TR19JREVOVElGWV9ESVNDRkxBRykgPT0gMCkgeworCQkvKgorCQkgKiBXZSB3ZXJlbid0IGFsbG93ZWQgdG8gZGlzY29ubmVjdC4KKwkJICogV2UncmUgaGFuZ2luZyBvbiB0aGUgYnVzIHVudGlsIGEKKwkJICogY29udGludWUgdGFyZ2V0IEkvTyBjb21lcyBpbiByZXNwb25zZQorCQkgKiB0byB0aGlzIGFjY2VwdCB0aW8uCisJCSAqLworI2lmZGVmIEFIRF9ERUJVRworCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1RRSU4pICE9IDApCisJCQlwcmludGYoIlJlY2VpdmVkIEltbWVkaWF0ZSBDb21tYW5kICVkOiVkOiVkIC0gJXBcbiIsCisJCQkgICAgICAgaW5pdGlhdG9yLCB0YXJnZXQsIGx1biwgYWhkLT5wZW5kaW5nX2RldmljZSk7CisjZW5kaWYKKwkJYWhkLT5wZW5kaW5nX2RldmljZSA9IGxzdGF0ZTsKKwkJYWhkX2ZyZWV6ZV9jY2IoKHVuaW9uIGNjYiAqKWF0aW8pOworCQlhdGlvLT5jY2JfaC5mbGFncyB8PSBDQU1fRElTX0RJU0NPTk5FQ1Q7CisJfQorCXhwdF9kb25lKCh1bmlvbiBjY2IqKWF0aW8pOworCXJldHVybiAoMCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9pbmxpbmUuaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwYmM1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfaW5saW5lLmgKQEAgLTAsMCArMSw5NjUgQEAKKy8qCisgKiBJbmxpbmUgcm91dGluZXMgc2hhcmVhYmxlIGFjcm9zcyBPUyBwbGF0Zm9ybXMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMDEgSnVzdGluIFQuIEdpYmJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4X2lubGluZS5oIzUxICQKKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCisjaWZuZGVmIF9BSUM3OVhYX0lOTElORV9IXworI2RlZmluZSBfQUlDNzlYWF9JTkxJTkVfSF8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERlYnVnZ2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSBjaGFyICphaGRfbmFtZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworCitzdGF0aWMgX19pbmxpbmUgY2hhciAqCithaGRfbmFtZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuIChhaGQtPm5hbWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqIFNlcXVlbmNlciBFeGVjdXRpb24gQ29udHJvbCAqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2tub3duX21vZGVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkgICAgIGFoZF9tb2RlIHNyYywgYWhkX21vZGUgZHN0KTsKK3N0YXRpYyBfX2lubGluZSBhaGRfbW9kZV9zdGF0ZSBhaGRfYnVpbGRfbW9kZV9zdGF0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCQkgICAgYWhkX21vZGUgc3JjLAorCQkJCQkJICAgIGFoZF9tb2RlIGRzdCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfZXh0cmFjdF9tb2RlX3N0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgIGFoZF9tb2RlX3N0YXRlIHN0YXRlLAorCQkJCQkgICAgYWhkX21vZGUgKnNyYywgYWhkX21vZGUgKmRzdCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfc2V0X21vZGVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYWhkX21vZGUgc3JjLAorCQkJCSAgIGFoZF9tb2RlIGRzdCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfdXBkYXRlX21vZGVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfYXNzZXJ0X21vZGVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYWhkX21vZGUgc3JjbW9kZSwKKwkJCQkgICAgICBhaGRfbW9kZSBkc3Rtb2RlLCBjb25zdCBjaGFyICpmaWxlLAorCQkJCSAgICAgIGludCBsaW5lKTsKK3N0YXRpYyBfX2lubGluZSBhaGRfbW9kZV9zdGF0ZSBhaGRfc2F2ZV9tb2RlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3Jlc3RvcmVfbW9kZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCSAgICAgICBhaGRfbW9kZV9zdGF0ZSBzdGF0ZSk7CitzdGF0aWMgX19pbmxpbmUgaW50ICBhaGRfaXNfcGF1c2VkKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfcGF1c2Uoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF91bnBhdXNlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfa25vd25fbW9kZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBhaGRfbW9kZSBzcmMsIGFoZF9tb2RlIGRzdCkKK3sKKwlhaGQtPnNyY19tb2RlID0gc3JjOworCWFoZC0+ZHN0X21vZGUgPSBkc3Q7CisJYWhkLT5zYXZlZF9zcmNfbW9kZSA9IHNyYzsKKwlhaGQtPnNhdmVkX2RzdF9tb2RlID0gZHN0OworfQorCitzdGF0aWMgX19pbmxpbmUgYWhkX21vZGVfc3RhdGUKK2FoZF9idWlsZF9tb2RlX3N0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYWhkX21vZGUgc3JjLCBhaGRfbW9kZSBkc3QpCit7CisJcmV0dXJuICgoc3JjIDw8IFNSQ19NT0RFX1NISUZUKSB8IChkc3QgPDwgRFNUX01PREVfU0hJRlQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9leHRyYWN0X21vZGVfc3RhdGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBhaGRfbW9kZV9zdGF0ZSBzdGF0ZSwKKwkJICAgICAgIGFoZF9tb2RlICpzcmMsIGFoZF9tb2RlICpkc3QpCit7CisJKnNyYyA9IChzdGF0ZSAmIFNSQ19NT0RFKSA+PiBTUkNfTU9ERV9TSElGVDsKKwkqZHN0ID0gKHN0YXRlICYgRFNUX01PREUpID4+IERTVF9NT0RFX1NISUZUOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3NldF9tb2RlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGFoZF9tb2RlIHNyYywgYWhkX21vZGUgZHN0KQoreworCWlmIChhaGQtPnNyY19tb2RlID09IHNyYyAmJiBhaGQtPmRzdF9tb2RlID09IGRzdCkKKwkJcmV0dXJuOworI2lmZGVmIEFIRF9ERUJVRworCWlmIChhaGQtPnNyY19tb2RlID09IEFIRF9NT0RFX1VOS05PV04KKwkgfHwgYWhkLT5kc3RfbW9kZSA9PSBBSERfTU9ERV9VTktOT1dOKQorCQlwYW5pYygiU2V0dGluZyBtb2RlIHByaW9yIHRvIHNhdmluZyBpdC5cbiIpOworCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTU9ERVBUUikgIT0gMCkKKwkJcHJpbnRmKCIlczogU2V0dGluZyBtb2RlIDB4JXhcbiIsIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICBhaGRfYnVpbGRfbW9kZV9zdGF0ZShhaGQsIHNyYywgZHN0KSk7CisjZW5kaWYKKwlhaGRfb3V0YihhaGQsIE1PREVfUFRSLCBhaGRfYnVpbGRfbW9kZV9zdGF0ZShhaGQsIHNyYywgZHN0KSk7CisJYWhkLT5zcmNfbW9kZSA9IHNyYzsKKwlhaGQtPmRzdF9tb2RlID0gZHN0OworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3VwZGF0ZV9tb2RlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJYWhkX21vZGVfc3RhdGUgbW9kZV9wdHI7CisJYWhkX21vZGUgc3JjOworCWFoZF9tb2RlIGRzdDsKKworCW1vZGVfcHRyID0gYWhkX2luYihhaGQsIE1PREVfUFRSKTsKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01PREVQVFIpICE9IDApCisJCXByaW50ZigiUmVhZGluZyBtb2RlIDB4JXhcbiIsIG1vZGVfcHRyKTsKKyNlbmRpZgorCWFoZF9leHRyYWN0X21vZGVfc3RhdGUoYWhkLCBtb2RlX3B0ciwgJnNyYywgJmRzdCk7CisJYWhkX2tub3duX21vZGVzKGFoZCwgc3JjLCBkc3QpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX2Fzc2VydF9tb2RlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGFoZF9tb2RlIHNyY21vZGUsCisJCSBhaGRfbW9kZSBkc3Rtb2RlLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoKHNyY21vZGUgJiBBSERfTUtfTVNLKGFoZC0+c3JjX21vZGUpKSA9PSAwCisJIHx8IChkc3Rtb2RlICYgQUhEX01LX01TSyhhaGQtPmRzdF9tb2RlKSkgPT0gMCkgeworCQlwYW5pYygiJXM6JXM6JWQ6IE1vZGUgYXNzZXJ0aW9uIGZhaWxlZC5cbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBmaWxlLCBsaW5lKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lIGFoZF9tb2RlX3N0YXRlCithaGRfc2F2ZV9tb2RlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJaWYgKGFoZC0+c3JjX21vZGUgPT0gQUhEX01PREVfVU5LTk9XTgorCSB8fCBhaGQtPmRzdF9tb2RlID09IEFIRF9NT0RFX1VOS05PV04pCisJCWFoZF91cGRhdGVfbW9kZXMoYWhkKTsKKworCXJldHVybiAoYWhkX2J1aWxkX21vZGVfc3RhdGUoYWhkLCBhaGQtPnNyY19tb2RlLCBhaGQtPmRzdF9tb2RlKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfcmVzdG9yZV9tb2RlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGFoZF9tb2RlX3N0YXRlIHN0YXRlKQoreworCWFoZF9tb2RlIHNyYzsKKwlhaGRfbW9kZSBkc3Q7CisKKwlhaGRfZXh0cmFjdF9tb2RlX3N0YXRlKGFoZCwgc3RhdGUsICZzcmMsICZkc3QpOworCWFoZF9zZXRfbW9kZXMoYWhkLCBzcmMsIGRzdCk7Cit9CisKKyNkZWZpbmUgQUhEX0FTU0VSVF9NT0RFUyhhaGQsIHNvdXJjZSwgZGVzdCkgXAorCWFoZF9hc3NlcnRfbW9kZXMoYWhkLCBzb3VyY2UsIGRlc3QsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisKKy8qCisgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc2VxdWVuY2VyIGhhcyBoYWx0ZWQgY29kZSBleGVjdXRpb24uCisgKiBSZXR1cm5zIG5vbi16ZXJvIHN0YXR1cyBpZiB0aGUgc2VxdWVuY2VyIGlzIHN0b3BwZWQuCisgKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK2FoZF9pc19wYXVzZWQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZF9pbmIoYWhkLCBIQ05UUkwpICYgUEFVU0UpICE9IDApOworfQorCisvKgorICogUmVxdWVzdCB0aGF0IHRoZSBzZXF1ZW5jZXIgc3RvcCBhbmQgd2FpdCwgaW5kZWZpbml0ZWx5LCBmb3IgaXQKKyAqIHRvIHN0b3AuICBUaGUgc2VxdWVuY2VyIHdpbGwgb25seSBhY2tub3dsZWRnZSB0aGF0IGl0IGlzIHBhdXNlZAorICogb25jZSBpdCBoYXMgcmVhY2hlZCBhbiBpbnN0cnVjdGlvbiBib3VuZGFyeSBhbmQgUEFVU0VESVMgaXMKKyAqIGNsZWFyZWQgaW4gdGhlIFNFUUNUTCByZWdpc3Rlci4gIFRoZSBzZXF1ZW5jZXIgbWF5IHVzZSBQQVVTRURJUworICogZm9yIGNyaXRpY2FsIHNlY3Rpb25zLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3BhdXNlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlhaGRfb3V0YihhaGQsIEhDTlRSTCwgYWhkLT5wYXVzZSk7CisKKwkvKgorCSAqIFNpbmNlIHRoZSBzZXF1ZW5jZXIgY2FuIGRpc2FibGUgcGF1c2luZyBpbiBhIGNyaXRpY2FsIHNlY3Rpb24sIHdlCisJICogbXVzdCBsb29wIHVudGlsIGl0IGFjdHVhbGx5IHN0b3BzLgorCSAqLworCXdoaWxlIChhaGRfaXNfcGF1c2VkKGFoZCkgPT0gMCkKKwkJOworfQorCisvKgorICogQWxsb3cgdGhlIHNlcXVlbmNlciB0byBjb250aW51ZSBwcm9ncmFtIGV4ZWN1dGlvbi4KKyAqIFdlIGNoZWNrIGhlcmUgdG8gZW5zdXJlIHRoYXQgbm8gYWRkaXRpb25hbCBpbnRlcnJ1cHQKKyAqIHNvdXJjZXMgdGhhdCB3b3VsZCBjYXVzZSB0aGUgc2VxdWVuY2VyIHRvIGhhbHQgaGF2ZSBiZWVuCisgKiBhc3NlcnRlZC4gIElmLCBmb3IgZXhhbXBsZSwgYSBTQ1NJIGJ1cyByZXNldCBpcyBkZXRlY3RlZAorICogd2hpbGUgd2UgYXJlIGZpZWxkaW5nIGEgZGlmZmVyZW50LCBwYXVzaW5nLCBpbnRlcnJ1cHQgdHlwZSwKKyAqIHdlIGRvbid0IHdhbnQgdG8gcmVsZWFzZSB0aGUgc2VxdWVuY2VyIGJlZm9yZSBnb2luZyBiYWNrCisgKiBpbnRvIG91ciBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgZGVhbGluZyB3aXRoIHRoaXMgbmV3CisgKiBjb25kaXRpb24uCisgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfdW5wYXVzZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJLyoKKwkgKiBBdXRvbWF0aWNhbGx5IHJlc3RvcmUgb3VyIG1vZGVzIHRvIHRob3NlIHNhdmVkCisJICogcHJpb3IgdG8gdGhlIGZpcnN0IGNoYW5nZSBvZiB0aGUgbW9kZS4KKwkgKi8KKwlpZiAoYWhkLT5zYXZlZF9zcmNfbW9kZSAhPSBBSERfTU9ERV9VTktOT1dOCisJICYmIGFoZC0+c2F2ZWRfZHN0X21vZGUgIT0gQUhEX01PREVfVU5LTk9XTikgeworCQlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfVVBEQVRFX1BFTkRfQ01EUykgIT0gMCkKKwkJCWFoZF9yZXNldF9jbWRzX3BlbmRpbmcoYWhkKTsKKwkJYWhkX3NldF9tb2RlcyhhaGQsIGFoZC0+c2F2ZWRfc3JjX21vZGUsIGFoZC0+c2F2ZWRfZHN0X21vZGUpOworCX0KKworCWlmICgoYWhkX2luYihhaGQsIElOVFNUQVQpICYgfkNNRENNUExUKSA9PSAwKQorCQlhaGRfb3V0YihhaGQsIEhDTlRSTCwgYWhkLT51bnBhdXNlKTsKKworCWFoZF9rbm93bl9tb2RlcyhhaGQsIEFIRF9NT0RFX1VOS05PV04sIEFIRF9NT0RFX1VOS05PV04pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKiogU2NhdHRlciBHYXRoZXIgTGlzdCBIYW5kbGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIF9faW5saW5lIHZvaWQJKmFoZF9zZ19zZXR1cChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYiwKKwkJCQkgICAgICB2b2lkICpzZ3B0ciwgZG1hX2FkZHJfdCBhZGRyLAorCQkJCSAgICAgIGJ1c19zaXplX3QgbGVuLCBpbnQgbGFzdCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAkgYWhkX3NldHVwX3NjYl9jb21tb24oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgICBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIF9faW5saW5lIHZvaWQJIGFoZF9zZXR1cF9kYXRhX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgICBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIF9faW5saW5lIHZvaWQJIGFoZF9zZXR1cF9ub3hmZXJfc2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgICAgc3RydWN0IHNjYiAqc2NiKTsKKworc3RhdGljIF9faW5saW5lIHZvaWQgKgorYWhkX3NnX3NldHVwKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiLAorCSAgICAgdm9pZCAqc2dwdHIsIGRtYV9hZGRyX3QgYWRkciwgYnVzX3NpemVfdCBsZW4sIGludCBsYXN0KQoreworCXNjYi0+c2dfY291bnQrKzsKKwlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gNAorCSAmJiAoYWhkLT5mbGFncyAmIEFIRF82NEJJVF9BRERSRVNTSU5HKSAhPSAwKSB7CisJCXN0cnVjdCBhaGRfZG1hNjRfc2VnICpzZzsKKworCQlzZyA9IChzdHJ1Y3QgYWhkX2RtYTY0X3NlZyAqKXNncHRyOworCQlzZy0+YWRkciA9IGFoZF9odG9sZTY0KGFkZHIpOworCQlzZy0+bGVuID0gYWhkX2h0b2xlMzIobGVuIHwgKGxhc3QgPyBBSERfRE1BX0xBU1RfU0VHIDogMCkpOworCQlyZXR1cm4gKHNnICsgMSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGFoZF9kbWFfc2VnICpzZzsKKworCQlzZyA9IChzdHJ1Y3QgYWhkX2RtYV9zZWcgKilzZ3B0cjsKKwkJc2ctPmFkZHIgPSBhaGRfaHRvbGUzMihhZGRyICYgMHhGRkZGRkZGRik7CisJCXNnLT5sZW4gPSBhaGRfaHRvbGUzMihsZW4gfCAoKGFkZHIgPj4gOCkgJiAweDdGMDAwMDAwKQorCQkJCSAgICB8IChsYXN0ID8gQUhEX0RNQV9MQVNUX1NFRyA6IDApKTsKKwkJcmV0dXJuIChzZyArIDEpOworCX0KK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9zZXR1cF9zY2JfY29tbW9uKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCS8qIFhYWCBIYW5kbGUgdGFyZ2V0IG1vZGUgU0NCcy4gKi8KKwlzY2ItPmNyY19yZXRyeV9jb3VudCA9IDA7CisJaWYgKChzY2ItPmZsYWdzICYgU0NCX1BBQ0tFVElaRUQpICE9IDApIHsKKwkJLyogWFhYIHdoYXQgYWJvdXQgQUNBPz8gIEl0IGlzIHR5cGUgNCwgYnV0IFRBR19UWVBFID09IDB4My4gKi8KKwkJc2NiLT5oc2NiLT50YXNrX2F0dHJpYnV0ZSA9IHNjYi0+aHNjYi0+Y29udHJvbCAmIFNDQl9UQUdfVFlQRTsKKwl9IGVsc2UgeworCQlpZiAoYWhkX2dldF90cmFuc2Zlcl9sZW5ndGgoc2NiKSAmIDB4MDEpCisJCQlzY2ItPmhzY2ItPnRhc2tfYXR0cmlidXRlID0gU0NCX1hGRVJMRU5fT0REOworCQllbHNlCisJCQlzY2ItPmhzY2ItPnRhc2tfYXR0cmlidXRlID0gMDsKKwl9CisKKwlpZiAoc2NiLT5oc2NiLT5jZGJfbGVuIDw9IE1BWF9DREJfTEVOX1dJVEhfU0VOU0VfQUREUgorCSB8fCAoc2NiLT5oc2NiLT5jZGJfbGVuICYgU0NCX0NEQl9MRU5fUFRSKSAhPSAwKQorCQlzY2ItPmhzY2ItPnNoYXJlZF9kYXRhLmlkYXRhLmNkYl9wbHVzX3NhZGRyLnNlbnNlX2FkZHIgPQorCQkgICAgYWhkX2h0b2xlMzIoc2NiLT5zZW5zZV9idXNhZGRyKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9zZXR1cF9kYXRhX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwkvKgorCSAqIENvcHkgdGhlIGZpcnN0IFNHIGludG8gdGhlICJjdXJyZW50IiBkYXRhIHBvbnRlciBhcmVhLgorCSAqLworCWlmICgoYWhkLT5mbGFncyAmIEFIRF82NEJJVF9BRERSRVNTSU5HKSAhPSAwKSB7CisJCXN0cnVjdCBhaGRfZG1hNjRfc2VnICpzZzsKKworCQlzZyA9IChzdHJ1Y3QgYWhkX2RtYTY0X3NlZyAqKXNjYi0+c2dfbGlzdDsKKwkJc2NiLT5oc2NiLT5kYXRhcHRyID0gc2ctPmFkZHI7CisJCXNjYi0+aHNjYi0+ZGF0YWNudCA9IHNnLT5sZW47CisJfSBlbHNlIHsKKwkJc3RydWN0IGFoZF9kbWFfc2VnICpzZzsKKwkJdWludDMyX3QgKmRhdGFwdHJfd29yZHM7CisKKwkJc2cgPSAoc3RydWN0IGFoZF9kbWFfc2VnICopc2NiLT5zZ19saXN0OworCQlkYXRhcHRyX3dvcmRzID0gKHVpbnQzMl90Kikmc2NiLT5oc2NiLT5kYXRhcHRyOworCQlkYXRhcHRyX3dvcmRzWzBdID0gc2ctPmFkZHI7CisJCWRhdGFwdHJfd29yZHNbMV0gPSAwOworCQlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfMzlCSVRfQUREUkVTU0lORykgIT0gMCkgeworCQkJdWludDY0X3QgaGlnaF9hZGRyOworCisJCQloaWdoX2FkZHIgPSBhaGRfbGUzMnRvaChzZy0+bGVuKSAmIDB4N0YwMDAwMDA7CisJCQlzY2ItPmhzY2ItPmRhdGFwdHIgfD0gYWhkX2h0b2xlNjQoaGlnaF9hZGRyIDw8IDgpOworCQl9CisJCXNjYi0+aHNjYi0+ZGF0YWNudCA9IHNnLT5sZW47CisJfQorCS8qCisJICogTm90ZSB3aGVyZSB0byBmaW5kIHRoZSBTRyBlbnRyaWVzIGluIGJ1cyBzcGFjZS4KKwkgKiBXZSBhbHNvIHNldCB0aGUgZnVsbCByZXNpZHVhbCBmbGFnIHdoaWNoIHRoZSAKKwkgKiBzZXF1ZW5jZXIgd2lsbCBjbGVhciBhcyBzb29uIGFzIGEgZGF0YSB0cmFuc2ZlcgorCSAqIG9jY3Vycy4KKwkgKi8KKwlzY2ItPmhzY2ItPnNncHRyID0gYWhkX2h0b2xlMzIoc2NiLT5zZ19saXN0X2J1c2FkZHJ8U0dfRlVMTF9SRVNJRCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfc2V0dXBfbm94ZmVyX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlzY2ItPmhzY2ItPnNncHRyID0gYWhkX2h0b2xlMzIoU0dfTElTVF9OVUxMKTsKKwlzY2ItPmhzY2ItPmRhdGFwdHIgPSAwOworCXNjYi0+aHNjYi0+ZGF0YWNudCA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBNZW1vcnkgbWFwcGluZyByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgX19pbmxpbmUgc2l6ZV90CWFoZF9zZ19zaXplKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCAqCisJCQlhaGRfc2dfYnVzX3RvX3ZpcnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICBzdHJ1Y3Qgc2NiICpzY2IsCisJCQkJCSAgIHVpbnQzMl90IHNnX2J1c2FkZHIpOworc3RhdGljIF9faW5saW5lIHVpbnQzMl90CisJCQlhaGRfc2dfdmlydF90b19idXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICBzdHJ1Y3Qgc2NiICpzY2IsCisJCQkJCSAgIHZvaWQgKnNnKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoZF9zeW5jX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJICAgICBzdHJ1Y3Qgc2NiICpzY2IsIGludCBvcCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfc3luY19zZ2xpc3Qoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQlzdHJ1Y3Qgc2NiICpzY2IsIGludCBvcCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfc3luY19zZW5zZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJICAgICAgIHN0cnVjdCBzY2IgKnNjYiwgaW50IG9wKTsKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdAorCQkJYWhkX3RhcmdldGNtZF9vZmZzZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgIHVfaW50IGluZGV4KTsKKworc3RhdGljIF9faW5saW5lIHNpemVfdAorYWhkX3NnX3NpemUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCWlmICgoYWhkLT5mbGFncyAmIEFIRF82NEJJVF9BRERSRVNTSU5HKSAhPSAwKQorCQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgYWhkX2RtYTY0X3NlZykpOworCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBhaGRfZG1hX3NlZykpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCAqCithaGRfc2dfYnVzX3RvX3ZpcnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IsIHVpbnQzMl90IHNnX2J1c2FkZHIpCit7CisJZG1hX2FkZHJfdCBzZ19vZmZzZXQ7CisKKwkvKiBzZ19saXN0X3BoeXMgcG9pbnRzIHRvIGVudHJ5IDEsIG5vdCAwICovCisJc2dfb2Zmc2V0ID0gc2dfYnVzYWRkciAtIChzY2ItPnNnX2xpc3RfYnVzYWRkciAtIGFoZF9zZ19zaXplKGFoZCkpOworCXJldHVybiAoKHVpbnQ4X3QgKilzY2ItPnNnX2xpc3QgKyBzZ19vZmZzZXQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKK2FoZF9zZ192aXJ0X3RvX2J1cyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYiwgdm9pZCAqc2cpCit7CisJZG1hX2FkZHJfdCBzZ19vZmZzZXQ7CisKKwkvKiBzZ19saXN0X3BoeXMgcG9pbnRzIHRvIGVudHJ5IDEsIG5vdCAwICovCisJc2dfb2Zmc2V0ID0gKCh1aW50OF90ICopc2cgLSAodWludDhfdCAqKXNjYi0+c2dfbGlzdCkKKwkJICAtIGFoZF9zZ19zaXplKGFoZCk7CisKKwlyZXR1cm4gKHNjYi0+c2dfbGlzdF9idXNhZGRyICsgc2dfb2Zmc2V0KTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9zeW5jX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYiwgaW50IG9wKQoreworCWFoZF9kbWFtYXBfc3luYyhhaGQsIGFoZC0+c2NiX2RhdGEuaHNjYl9kbWF0LAorCQkJc2NiLT5oc2NiX21hcC0+ZG1hbWFwLAorCQkJLypvZmZzZXQqLyh1aW50OF90KilzY2ItPmhzY2IgLSBzY2ItPmhzY2JfbWFwLT52YWRkciwKKwkJCS8qbGVuKi9zaXplb2YoKnNjYi0+aHNjYiksIG9wKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9zeW5jX3NnbGlzdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYiwgaW50IG9wKQoreworCWlmIChzY2ItPnNnX2NvdW50ID09IDApCisJCXJldHVybjsKKworCWFoZF9kbWFtYXBfc3luYyhhaGQsIGFoZC0+c2NiX2RhdGEuc2dfZG1hdCwKKwkJCXNjYi0+c2dfbWFwLT5kbWFtYXAsCisJCQkvKm9mZnNldCovc2NiLT5zZ19saXN0X2J1c2FkZHIgLSBhaGRfc2dfc2l6ZShhaGQpLAorCQkJLypsZW4qL2FoZF9zZ19zaXplKGFoZCkgKiBzY2ItPnNnX2NvdW50LCBvcCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfc3luY19zZW5zZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYiwgaW50IG9wKQoreworCWFoZF9kbWFtYXBfc3luYyhhaGQsIGFoZC0+c2NiX2RhdGEuc2Vuc2VfZG1hdCwKKwkJCXNjYi0+c2Vuc2VfbWFwLT5kbWFtYXAsCisJCQkvKm9mZnNldCovc2NiLT5zZW5zZV9idXNhZGRyLAorCQkJLypsZW4qL0FIRF9TRU5TRV9CVUZTSVpFLCBvcCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdAorYWhkX3RhcmdldGNtZF9vZmZzZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBpbmRleCkKK3sKKwlyZXR1cm4gKCgodWludDhfdCAqKSZhaGQtPnRhcmdldGNtZHNbaW5kZXhdKQorCSAgICAgICAtICh1aW50OF90ICopYWhkLT5xb3V0Zmlmbyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNaXNjZWxhbmVvdXMgU3VwcG9ydCBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfY29tcGxldGVfc2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJIHN0cnVjdCBzY2IgKnNjYik7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfdXBkYXRlX3Jlc2lkdWFsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgIHN0cnVjdCBzY2IgKnNjYik7CitzdGF0aWMgX19pbmxpbmUgc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKgorCQkJYWhkX2ZldGNoX3RyYW5zaW5mbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgICBjaGFyIGNoYW5uZWwsIHVfaW50IG91cl9pZCwKKwkJCQkJICAgIHVfaW50IHJlbW90ZV9pZCwKKwkJCQkJICAgIHN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICoqdHN0YXRlKTsKK3N0YXRpYyBfX2lubGluZSB1aW50MTZfdAorCQkJYWhkX2ludyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHBvcnQpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX291dHcoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBwb3J0LAorCQkJCSB1X2ludCB2YWx1ZSk7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKKwkJCWFoZF9pbmwoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBwb3J0KTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoZF9vdXRsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgcG9ydCwKKwkJCQkgdWludDMyX3QgdmFsdWUpOworc3RhdGljIF9faW5saW5lIHVpbnQ2NF90CisJCQlhaGRfaW5xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgcG9ydCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfb3V0cShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHBvcnQsCisJCQkJIHVpbnQ2NF90IHZhbHVlKTsKK3N0YXRpYyBfX2lubGluZSB1X2ludAlhaGRfZ2V0X3NjYnB0cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX3NldF9zY2JwdHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBzY2JwdHIpOworc3RhdGljIF9faW5saW5lIHVfaW50CWFoZF9nZXRfaG5zY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX3NldF9obnNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdmFsdWUpOworc3RhdGljIF9faW5saW5lIHVfaW50CWFoZF9nZXRfaGVzY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX3NldF9oZXNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdmFsdWUpOworc3RhdGljIF9faW5saW5lIHVfaW50CWFoZF9nZXRfc25zY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX3NldF9zbnNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdmFsdWUpOworc3RhdGljIF9faW5saW5lIHVfaW50CWFoZF9nZXRfc2VzY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX3NldF9zZXNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdmFsdWUpOworc3RhdGljIF9faW5saW5lIHVfaW50CWFoZF9nZXRfc2RzY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX3NldF9zZHNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdmFsdWUpOworc3RhdGljIF9faW5saW5lIHVfaW50CWFoZF9pbmJfc2NicmFtKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgb2Zmc2V0KTsKK3N0YXRpYyBfX2lubGluZSB1X2ludAlhaGRfaW53X3NjYnJhbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IG9mZnNldCk7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKKwkJCWFoZF9pbmxfc2NicmFtKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgb2Zmc2V0KTsKK3N0YXRpYyBfX2lubGluZSB1aW50NjRfdAorCQkJYWhkX2lucV9zY2JyYW0oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBvZmZzZXQpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX3N3YXBfd2l0aF9uZXh0X2hzY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkJc3RydWN0IHNjYiAqc2NiKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoZF9xdWV1ZV9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIF9faW5saW5lIHVpbnQ4X3QgKgorCQkJYWhkX2dldF9zZW5zZV9idWYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgIHN0cnVjdCBzY2IgKnNjYik7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKKwkJCWFoZF9nZXRfc2Vuc2VfYnVmYWRkcihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgICAgIHN0cnVjdCBzY2IgKnNjYik7CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfY29tcGxldGVfc2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXVpbnQzMl90IHNncHRyOworCisJc2dwdHIgPSBhaGRfbGUzMnRvaChzY2ItPmhzY2ItPnNncHRyKTsKKwlpZiAoKHNncHRyICYgU0dfU1RBVFVTX1ZBTElEKSAhPSAwKQorCQlhaGRfaGFuZGxlX3NjYl9zdGF0dXMoYWhkLCBzY2IpOworCWVsc2UKKwkJYWhkX2RvbmUoYWhkLCBzY2IpOworfQorCisvKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNlcXVlbmNlciByZXBvcnRlZCBhIHJlc2lkdWFsCisgKiBmb3IgdGhpcyBTQ0IvdHJhbnNhY3Rpb24uCisgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfdXBkYXRlX3Jlc2lkdWFsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXVpbnQzMl90IHNncHRyOworCisJc2dwdHIgPSBhaGRfbGUzMnRvaChzY2ItPmhzY2ItPnNncHRyKTsKKwlpZiAoKHNncHRyICYgU0dfU1RBVFVTX1ZBTElEKSAhPSAwKQorCQlhaGRfY2FsY19yZXNpZHVhbChhaGQsIHNjYik7Cit9CisKKy8qCisgKiBSZXR1cm4gcG9pbnRlcnMgdG8gdGhlIHRyYW5zZmVyIG5lZ290aWF0aW9uIGluZm9ybWF0aW9uCisgKiBmb3IgdGhlIHNwZWNpZmllZCBvdXJfaWQvcmVtb3RlX2lkIHBhaXIuCisgKi8KK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqCithaGRfZmV0Y2hfdHJhbnNpbmZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgY2hhciBjaGFubmVsLCB1X2ludCBvdXJfaWQsCisJCSAgICB1X2ludCByZW1vdGVfaWQsIHN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICoqdHN0YXRlKQoreworCS8qCisJICogVHJhbnNmZXIgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBzdG9yZWQgZnJvbSB0aGUgcGVyc3BlY3RpdmUKKwkgKiBvZiB0aGUgdGFyZ2V0IHJvbGUuICBTaW5jZSB0aGUgcGFyYW1ldGVycyBmb3IgYSBjb25uZWN0aW9uCisJICogaW4gdGhlIGluaXRpYXRvciByb2xlIHRvIGEgZ2l2ZW4gdGFyZ2V0IGFyZSB0aGUgc2FtZSBhcworCSAqIHdoZW4gdGhlIHJvbGVzIGFyZSByZXZlcnNlZCwgd2UgcHJldGVuZCB3ZSBhcmUgdGhlIHRhcmdldC4KKwkgKi8KKwlpZiAoY2hhbm5lbCA9PSAnQicpCisJCW91cl9pZCArPSA4OworCSp0c3RhdGUgPSBhaGQtPmVuYWJsZWRfdGFyZ2V0c1tvdXJfaWRdOworCXJldHVybiAoJigqdHN0YXRlKS0+dHJhbnNpbmZvW3JlbW90ZV9pZF0pOworfQorCisjZGVmaW5lIEFIRF9DT1BZX0NPTF9JRFgoZHN0LCBzcmMpCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlkc3QtPmhzY2ItPnNjc2lpZCA9IHNyYy0+aHNjYi0+c2NzaWlkOwkJCVwKKwlkc3QtPmhzY2ItPmx1biA9IHNyYy0+aHNjYi0+bHVuOwkJCVwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBfX2lubGluZSB1aW50MTZfdAorYWhkX2ludyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHBvcnQpCit7CisJcmV0dXJuICgoYWhkX2luYihhaGQsIHBvcnQrMSkgPDwgOCkgfCBhaGRfaW5iKGFoZCwgcG9ydCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX291dHcoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBwb3J0LCB1X2ludCB2YWx1ZSkKK3sKKwlhaGRfb3V0YihhaGQsIHBvcnQsIHZhbHVlICYgMHhGRik7CisJYWhkX291dGIoYWhkLCBwb3J0KzEsICh2YWx1ZSA+PiA4KSAmIDB4RkYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKK2FoZF9pbmwoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBwb3J0KQoreworCXJldHVybiAoKGFoZF9pbmIoYWhkLCBwb3J0KSkKKwkgICAgICB8IChhaGRfaW5iKGFoZCwgcG9ydCsxKSA8PCA4KQorCSAgICAgIHwgKGFoZF9pbmIoYWhkLCBwb3J0KzIpIDw8IDE2KQorCSAgICAgIHwgKGFoZF9pbmIoYWhkLCBwb3J0KzMpIDw8IDI0KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfb3V0bChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHBvcnQsIHVpbnQzMl90IHZhbHVlKQoreworCWFoZF9vdXRiKGFoZCwgcG9ydCwgKHZhbHVlKSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgcG9ydCsxLCAoKHZhbHVlKSA+PiA4KSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgcG9ydCsyLCAoKHZhbHVlKSA+PiAxNikgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIHBvcnQrMywgKCh2YWx1ZSkgPj4gMjQpICYgMHhGRik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1aW50NjRfdAorYWhkX2lucShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHBvcnQpCit7CisJcmV0dXJuICgoYWhkX2luYihhaGQsIHBvcnQpKQorCSAgICAgIHwgKGFoZF9pbmIoYWhkLCBwb3J0KzEpIDw8IDgpCisJICAgICAgfCAoYWhkX2luYihhaGQsIHBvcnQrMikgPDwgMTYpCisJICAgICAgfCAoYWhkX2luYihhaGQsIHBvcnQrMykgPDwgMjQpCisJICAgICAgfCAoKCh1aW50NjRfdClhaGRfaW5iKGFoZCwgcG9ydCs0KSkgPDwgMzIpCisJICAgICAgfCAoKCh1aW50NjRfdClhaGRfaW5iKGFoZCwgcG9ydCs1KSkgPDwgNDApCisJICAgICAgfCAoKCh1aW50NjRfdClhaGRfaW5iKGFoZCwgcG9ydCs2KSkgPDwgNDgpCisJICAgICAgfCAoKCh1aW50NjRfdClhaGRfaW5iKGFoZCwgcG9ydCs3KSkgPDwgNTYpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9vdXRxKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgcG9ydCwgdWludDY0X3QgdmFsdWUpCit7CisJYWhkX291dGIoYWhkLCBwb3J0LCB2YWx1ZSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgcG9ydCsxLCAodmFsdWUgPj4gOCkgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIHBvcnQrMiwgKHZhbHVlID4+IDE2KSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgcG9ydCszLCAodmFsdWUgPj4gMjQpICYgMHhGRik7CisJYWhkX291dGIoYWhkLCBwb3J0KzQsICh2YWx1ZSA+PiAzMikgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIHBvcnQrNSwgKHZhbHVlID4+IDQwKSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgcG9ydCs2LCAodmFsdWUgPj4gNDgpICYgMHhGRik7CisJYWhkX291dGIoYWhkLCBwb3J0KzcsICh2YWx1ZSA+PiA1NikgJiAweEZGKTsKK30KKworc3RhdGljIF9faW5saW5lIHVfaW50CithaGRfZ2V0X3NjYnB0cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIH4oQUhEX01PREVfVU5LTk9XTl9NU0t8QUhEX01PREVfQ0ZHX01TSyksCisJCQkgfihBSERfTU9ERV9VTktOT1dOX01TS3xBSERfTU9ERV9DRkdfTVNLKSk7CisJcmV0dXJuIChhaGRfaW5iKGFoZCwgU0NCUFRSKSB8IChhaGRfaW5iKGFoZCwgU0NCUFRSICsgMSkgPDwgOCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3NldF9zY2JwdHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBzY2JwdHIpCit7CisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIH4oQUhEX01PREVfVU5LTk9XTl9NU0t8QUhEX01PREVfQ0ZHX01TSyksCisJCQkgfihBSERfTU9ERV9VTktOT1dOX01TS3xBSERfTU9ERV9DRkdfTVNLKSk7CisJYWhkX291dGIoYWhkLCBTQ0JQVFIsIHNjYnB0ciAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgU0NCUFRSKzEsIChzY2JwdHIgPj4gOCkgJiAweEZGKTsKK30KKworc3RhdGljIF9faW5saW5lIHVfaW50CithaGRfZ2V0X2huc2NiX3FvZmYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoYWhkX2lud19hdG9taWMoYWhkLCBITlNDQl9RT0ZGKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfc2V0X2huc2NiX3FvZmYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB2YWx1ZSkKK3sKKwlhaGRfb3V0d19hdG9taWMoYWhkLCBITlNDQl9RT0ZGLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1X2ludAorYWhkX2dldF9oZXNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlyZXR1cm4gKGFoZF9pbmIoYWhkLCBIRVNDQl9RT0ZGKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfc2V0X2hlc2NiX3FvZmYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB2YWx1ZSkKK3sKKwlhaGRfb3V0YihhaGQsIEhFU0NCX1FPRkYsIHZhbHVlKTsKK30KKworc3RhdGljIF9faW5saW5lIHVfaW50CithaGRfZ2V0X3Nuc2NiX3FvZmYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXVfaW50IG9sZHZhbHVlOworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX0NDSEFOX01TSywgQUhEX01PREVfQ0NIQU5fTVNLKTsKKwlvbGR2YWx1ZSA9IGFoZF9pbncoYWhkLCBTTlNDQl9RT0ZGKTsKKwlhaGRfb3V0dyhhaGQsIFNOU0NCX1FPRkYsIG9sZHZhbHVlKTsKKwlyZXR1cm4gKG9sZHZhbHVlKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9zZXRfc25zY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHZhbHVlKQoreworCUFIRF9BU1NFUlRfTU9ERVMoYWhkLCBBSERfTU9ERV9DQ0hBTl9NU0ssIEFIRF9NT0RFX0NDSEFOX01TSyk7CisJYWhkX291dHcoYWhkLCBTTlNDQl9RT0ZGLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1X2ludAorYWhkX2dldF9zZXNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfQ0NIQU5fTVNLLCBBSERfTU9ERV9DQ0hBTl9NU0spOworCXJldHVybiAoYWhkX2luYihhaGQsIFNFU0NCX1FPRkYpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9zZXRfc2VzY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHZhbHVlKQoreworCUFIRF9BU1NFUlRfTU9ERVMoYWhkLCBBSERfTU9ERV9DQ0hBTl9NU0ssIEFIRF9NT0RFX0NDSEFOX01TSyk7CisJYWhkX291dGIoYWhkLCBTRVNDQl9RT0ZGLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1X2ludAorYWhkX2dldF9zZHNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfQ0NIQU5fTVNLLCBBSERfTU9ERV9DQ0hBTl9NU0spOworCXJldHVybiAoYWhkX2luYihhaGQsIFNEU0NCX1FPRkYpIHwgKGFoZF9pbmIoYWhkLCBTRFNDQl9RT0ZGICsgMSkgPDwgOCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3NldF9zZHNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdmFsdWUpCit7CisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX0NDSEFOX01TSywgQUhEX01PREVfQ0NIQU5fTVNLKTsKKwlhaGRfb3V0YihhaGQsIFNEU0NCX1FPRkYsIHZhbHVlICYgMHhGRik7CisJYWhkX291dGIoYWhkLCBTRFNDQl9RT0ZGKzEsICh2YWx1ZSA+PiA4KSAmIDB4RkYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdV9pbnQKK2FoZF9pbmJfc2NicmFtKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgb2Zmc2V0KQoreworCXVfaW50IHZhbHVlOworCisJLyoKKwkgKiBXb3JrYXJvdW5kIFBDSS1YIFJldiBBLiBoYXJkd2FyZSBidWcuCisJICogQWZ0ZXIgYSBob3N0IHJlYWQgb2YgU0NCIG1lbW9yeSwgdGhlIGNoaXAKKwkgKiBtYXkgYmVjb21lIGNvbmZ1c2VkIGludG8gdGhpbmtpbmcgcHJlZmV0Y2gKKwkgKiB3YXMgcmVxdWlyZWQuICBUaGlzIHN0YXJ0cyB0aGUgZGlzY2FyZCB0aW1lcgorCSAqIHJ1bm5pbmcgYW5kIGNhbiBjYXVzZSBhbiB1bmV4cGVjdGVkIGRpc2NhcmQKKwkgKiB0aW1lciBpbnRlcnJ1cHQuICBUaGUgd29yayBhcm91bmQgaXMgdG8gcmVhZAorCSAqIGEgbm9ybWFsIHJlZ2lzdGVyIHByaW9yIHRvIHRoZSBleGhhdXN0aW9uIG9mCisJICogdGhlIGRpc2NhcmQgdGltZXIuICBUaGUgbW9kZSBwb2ludGVyIHJlZ2lzdGVyCisJICogaGFzIG5vIHNpZGUgZWZmZWN0cyBhbmQgc28gc2VydmVzIHdlbGwgZm9yCisJICogdGhpcyBwdXJwb3NlLgorCSAqCisJICogUmF6b3IgIzUyOAorCSAqLworCXZhbHVlID0gYWhkX2luYihhaGQsIG9mZnNldCk7CisJaWYgKChhaGQtPmZsYWdzICYgQUhEX1BDSVhfU0NCUkFNX1JEX0JVRykgIT0gMCkKKwkJYWhkX2luYihhaGQsIE1PREVfUFRSKTsKKwlyZXR1cm4gKHZhbHVlKTsKK30KKworc3RhdGljIF9faW5saW5lIHVfaW50CithaGRfaW53X3NjYnJhbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gKGFoZF9pbmJfc2NicmFtKGFoZCwgb2Zmc2V0KQorCSAgICAgIHwgKGFoZF9pbmJfc2NicmFtKGFoZCwgb2Zmc2V0KzEpIDw8IDgpKTsKK30KKworc3RhdGljIF9faW5saW5lIHVpbnQzMl90CithaGRfaW5sX3NjYnJhbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gKGFoZF9pbndfc2NicmFtKGFoZCwgb2Zmc2V0KQorCSAgICAgIHwgKGFoZF9pbndfc2NicmFtKGFoZCwgb2Zmc2V0KzIpIDw8IDE2KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1aW50NjRfdAorYWhkX2lucV9zY2JyYW0oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBvZmZzZXQpCit7CisJcmV0dXJuIChhaGRfaW5sX3NjYnJhbShhaGQsIG9mZnNldCkKKwkgICAgICB8ICgodWludDY0X3QpYWhkX2lubF9zY2JyYW0oYWhkLCBvZmZzZXQrNCkpIDw8IDMyKTsKK30KKworc3RhdGljIF9faW5saW5lIHN0cnVjdCBzY2IgKgorYWhkX2xvb2t1cF9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0YWcpCit7CisJc3RydWN0IHNjYiogc2NiOworCisJaWYgKHRhZyA+PSBBSERfU0NCX01BWCkKKwkJcmV0dXJuIChOVUxMKTsKKwlzY2IgPSBhaGQtPnNjYl9kYXRhLnNjYmluZGV4W3RhZ107CisJaWYgKHNjYiAhPSBOVUxMKQorCQlhaGRfc3luY19zY2IoYWhkLCBzY2IsCisJCQkgICAgIEJVU19ETUFTWU5DX1BPU1RSRUFEfEJVU19ETUFTWU5DX1BPU1RXUklURSk7CisJcmV0dXJuIChzY2IpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3N3YXBfd2l0aF9uZXh0X2hzY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJc3RydWN0IGhhcmR3YXJlX3NjYiAqcV9oc2NiOworCXVpbnQzMl90IHNhdmVkX2hzY2JfYnVzYWRkcjsKKworCS8qCisJICogT3VyIHF1ZXVpbmcgbWV0aG9kIGlzIGEgYml0IHRyaWNreS4gIFRoZSBjYXJkCisJICoga25vd3MgaW4gYWR2YW5jZSB3aGljaCBIU0NCIChieSBhZGRyZXNzKSB0byBkb3dubG9hZCwKKwkgKiBhbmQgd2UgY2FuJ3QgZGlzYXBwb2ludCBpdC4gIFRvIGFjaGlldmUgdGhpcywgdGhlIG5leHQKKwkgKiBIU0NCIHRvIGRvd25sb2FkIGlzIHNhdmVkIG9mZiBpbiBhaGQtPm5leHRfcXVldWVkX2hzY2IuCisJICogV2hlbiB3ZSBhcmUgY2FsbGVkIHRvIHF1ZXVlICJhbiBhcmJpdHJhcnkgc2NiIiwKKwkgKiB3ZSBjb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgaW5jb21pbmcgSFNDQiB0byB0aGUgb25lCisJICogdGhlIHNlcXVlbmNlciBrbm93cyBhYm91dCwgc3dhcCBIU0NCIHBvaW50ZXJzIGFuZAorCSAqIGZpbmFsbHkgYXNzaWduIHRoZSBTQ0IgdG8gdGhlIHRhZyBpbmRleGVkIGxvY2F0aW9uCisJICogaW4gdGhlIHNjYl9hcnJheS4gIFRoaXMgbWFrZXMgc3VyZSB0aGF0IHdlIGNhbiBzdGlsbAorCSAqIGxvY2F0ZSB0aGUgY29ycmVjdCBTQ0IgYnkgU0NCX1RBRy4KKwkgKi8KKwlxX2hzY2IgPSBhaGQtPm5leHRfcXVldWVkX2hzY2I7CisJc2F2ZWRfaHNjYl9idXNhZGRyID0gcV9oc2NiLT5oc2NiX2J1c2FkZHI7CisJbWVtY3B5KHFfaHNjYiwgc2NiLT5oc2NiLCBzaXplb2YoKnNjYi0+aHNjYikpOworCXFfaHNjYi0+aHNjYl9idXNhZGRyID0gc2F2ZWRfaHNjYl9idXNhZGRyOworCXFfaHNjYi0+bmV4dF9oc2NiX2J1c2FkZHIgPSBzY2ItPmhzY2ItPmhzY2JfYnVzYWRkcjsKKworCS8qIE5vdyBzd2FwIEhTQ0IgcG9pbnRlcnMuICovCisJYWhkLT5uZXh0X3F1ZXVlZF9oc2NiID0gc2NiLT5oc2NiOworCXNjYi0+aHNjYiA9IHFfaHNjYjsKKworCS8qIE5vdyBkZWZpbmUgdGhlIG1hcHBpbmcgZnJvbSB0YWcgdG8gU0NCIGluIHRoZSBzY2JpbmRleCAqLworCWFoZC0+c2NiX2RhdGEuc2NiaW5kZXhbU0NCX0dFVF9UQUcoc2NiKV0gPSBzY2I7Cit9CisKKy8qCisgKiBUZWxsIHRoZSBzZXF1ZW5jZXIgYWJvdXQgYSBuZXcgdHJhbnNhY3Rpb24gdG8gZXhlY3V0ZS4KKyAqLworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9xdWV1ZV9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJYWhkX3N3YXBfd2l0aF9uZXh0X2hzY2IoYWhkLCBzY2IpOworCisJaWYgKFNDQklEX0lTX05VTEwoU0NCX0dFVF9UQUcoc2NiKSkpCisJCXBhbmljKCJBdHRlbXB0IHRvIHF1ZXVlIGludmFsaWQgU0NCIHRhZyAleFxuIiwKKwkJICAgICAgU0NCX0dFVF9UQUcoc2NiKSk7CisKKwkvKgorCSAqIEtlZXAgYSBoaXN0b3J5IG9mIFNDQnMgd2UndmUgZG93bmxvYWRlZCBpbiB0aGUgcWluZmlmby4KKwkgKi8KKwlhaGQtPnFpbmZpZm9bQUhEX1FJTl9XUkFQKGFoZC0+cWluZmlmb25leHQpXSA9IFNDQl9HRVRfVEFHKHNjYik7CisJYWhkLT5xaW5maWZvbmV4dCsrOworCisJaWYgKHNjYi0+c2dfY291bnQgIT0gMCkKKwkJYWhkX3NldHVwX2RhdGFfc2NiKGFoZCwgc2NiKTsKKwllbHNlCisJCWFoZF9zZXR1cF9ub3hmZXJfc2NiKGFoZCwgc2NiKTsKKwlhaGRfc2V0dXBfc2NiX2NvbW1vbihhaGQsIHNjYik7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBvdXIgZGF0YSBpcyBjb25zaXN0ZW50IGZyb20gdGhlCisJICogcGVyc3BlY3RpdmUgb2YgdGhlIGFkYXB0ZXIuCisJICovCisJYWhkX3N5bmNfc2NiKGFoZCwgc2NiLCBCVVNfRE1BU1lOQ19QUkVSRUFEfEJVU19ETUFTWU5DX1BSRVdSSVRFKTsKKworI2lmZGVmIEFIRF9ERUJVRworCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUVVFVUUpICE9IDApIHsKKwkJdWludDY0X3QgaG9zdF9kYXRhcHRyOworCisJCWhvc3RfZGF0YXB0ciA9IGFoZF9sZTY0dG9oKHNjYi0+aHNjYi0+ZGF0YXB0cik7CisJCXByaW50ZigiJXM6IFF1ZXVlaW5nIFNDQiAweCV4IGJ1cyBhZGRyIDB4JXggLSAweCV4JXgvMHgleFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICBTQ0JfR0VUX1RBRyhzY2IpLCBhaGRfbGUzMnRvaChzY2ItPmhzY2ItPmhzY2JfYnVzYWRkciksCisJCSAgICAgICAodV9pbnQpKChob3N0X2RhdGFwdHIgPj4gMzIpICYgMHhGRkZGRkZGRiksCisJCSAgICAgICAodV9pbnQpKGhvc3RfZGF0YXB0ciAmIDB4RkZGRkZGRkYpLAorCQkgICAgICAgYWhkX2xlMzJ0b2goc2NiLT5oc2NiLT5kYXRhY250KSk7CisJfQorI2VuZGlmCisJLyogVGVsbCB0aGUgYWRhcHRlciBhYm91dCB0aGUgbmV3bHkgcXVldWVkIFNDQiAqLworCWFoZF9zZXRfaG5zY2JfcW9mZihhaGQsIGFoZC0+cWluZmlmb25leHQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdWludDhfdCAqCithaGRfZ2V0X3NlbnNlX2J1ZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlyZXR1cm4gKHNjYi0+c2Vuc2VfZGF0YSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdAorYWhkX2dldF9zZW5zZV9idWZhZGRyKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXJldHVybiAoc2NiLT5zZW5zZV9idXNhZGRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEludGVycnVwdCBQcm9jZXNzaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoZF9zeW5jX3FvdXRmaWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IG9wKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoZF9zeW5jX3RxaW5maWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IG9wKTsKK3N0YXRpYyBfX2lubGluZSB1X2ludAlhaGRfY2hlY2tfY21kY21wbHRxdWV1ZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyBfX2lubGluZSBpbnQJYWhkX2ludHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9zeW5jX3FvdXRmaWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IG9wKQoreworCWFoZF9kbWFtYXBfc3luYyhhaGQsIGFoZC0+c2hhcmVkX2RhdGFfZG1hdCwgYWhkLT5zaGFyZWRfZGF0YV9kbWFtYXAsCisJCQkvKm9mZnNldCovMCwgLypsZW4qL0FIQ19TQ0JfTUFYICogc2l6ZW9mKHVpbnQxNl90KSwgb3ApOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3N5bmNfdHFpbmZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgb3ApCit7CisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX1RBUkdFVFJPTEUpICE9IDApIHsKKwkJYWhkX2RtYW1hcF9zeW5jKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LAorCQkJCWFoZC0+c2hhcmVkX2RhdGFfZG1hbWFwLAorCQkJCWFoZF90YXJnZXRjbWRfb2Zmc2V0KGFoZCwgMCksCisJCQkJc2l6ZW9mKHN0cnVjdCB0YXJnZXRfY21kKSAqIEFIRF9UTU9ERV9DTURTLAorCQkJCW9wKTsKKwl9CisjZW5kaWYKK30KKworLyoKKyAqIFNlZSBpZiB0aGUgZmlybXdhcmUgaGFzIHBvc3RlZCBhbnkgY29tcGxldGVkIGNvbW1hbmRzCisgKiBpbnRvIG91ciBpbi1jb3JlIGNvbW1hbmQgY29tcGxldGUgZmlmb3MuCisgKi8KKyNkZWZpbmUgQUhEX1JVTl9RT1VURklGTyAweDEKKyNkZWZpbmUgQUhEX1JVTl9UUUlORklGTyAweDIKK3N0YXRpYyBfX2lubGluZSB1X2ludAorYWhkX2NoZWNrX2NtZGNtcGx0cXVldWVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl1X2ludCByZXR2YWw7CisKKwlyZXR2YWwgPSAwOworCWFoZF9kbWFtYXBfc3luYyhhaGQsIGFoZC0+c2hhcmVkX2RhdGFfZG1hdCwgYWhkLT5zaGFyZWRfZGF0YV9kbWFtYXAsCisJCQkvKm9mZnNldCovYWhkLT5xb3V0Zmlmb25leHQsIC8qbGVuKi8yLAorCQkJQlVTX0RNQVNZTkNfUE9TVFJFQUQpOworCWlmICgoYWhkLT5xb3V0Zmlmb1thaGQtPnFvdXRmaWZvbmV4dF0KKwkgICAgICYgUU9VVEZJRk9fRU5UUllfVkFMSURfTEUpID09IGFoZC0+cW91dGZpZm9uZXh0X3ZhbGlkX3RhZykKKwkJcmV0dmFsIHw9IEFIRF9SVU5fUU9VVEZJRk87CisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX1RBUkdFVFJPTEUpICE9IDAKKwkgJiYgKGFoZC0+ZmxhZ3MgJiBBSERfVFFJTkZJRk9fQkxPQ0tFRCkgPT0gMCkgeworCQlhaGRfZG1hbWFwX3N5bmMoYWhkLCBhaGQtPnNoYXJlZF9kYXRhX2RtYXQsCisJCQkJYWhkLT5zaGFyZWRfZGF0YV9kbWFtYXAsCisJCQkJYWhkX3RhcmdldGNtZF9vZmZzZXQoYWhkLCBhaGQtPnRxaW5maWZvZm5leHQpLAorCQkJCS8qbGVuKi9zaXplb2Yoc3RydWN0IHRhcmdldF9jbWQpLAorCQkJCUJVU19ETUFTWU5DX1BPU1RSRUFEKTsKKwkJaWYgKGFoZC0+dGFyZ2V0Y21kc1thaGQtPnRxaW5maWZvbmV4dF0uY21kX3ZhbGlkICE9IDApCisJCQlyZXR2YWwgfD0gQUhEX1JVTl9UUUlORklGTzsKKwl9CisjZW5kaWYKKwlyZXR1cm4gKHJldHZhbCk7Cit9CisKKy8qCisgKiBDYXRjaCBhbiBpbnRlcnJ1cHQgZnJvbSB0aGUgYWRhcHRlcgorICovCitzdGF0aWMgX19pbmxpbmUgaW50CithaGRfaW50cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJdV9pbnQJaW50c3RhdDsKKworCWlmICgoYWhkLT5wYXVzZSAmIElOVEVOKSA9PSAwKSB7CisJCS8qCisJCSAqIE91ciBpbnRlcnJ1cHQgaXMgbm90IGVuYWJsZWQgb24gdGhlIGNoaXAKKwkJICogYW5kIG1heSBiZSBkaXNhYmxlZCBmb3IgcmUtZW50cmFuY3kgcmVhc29ucywKKwkJICogc28ganVzdCByZXR1cm4uICBUaGlzIGlzIGxpa2VseSBqdXN0IGEgc2hhcmVkCisJCSAqIGludGVycnVwdC4KKwkJICovCisJCXJldHVybiAoMCk7CisJfQorCisJLyoKKwkgKiBJbnN0ZWFkIG9mIGRpcmVjdGx5IHJlYWRpbmcgdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIsCisJICogaW5mZXIgdGhlIGNhdXNlIG9mIHRoZSBpbnRlcnJ1cHQgYnkgY2hlY2tpbmcgb3VyIGluLWNvcmUKKwkgKiBjb21wbGV0aW9uIHF1ZXVlcy4gIFRoaXMgYXZvaWRzIGEgY29zdGx5IFBDSSBidXMgcmVhZCBpbgorCSAqIG1vc3QgY2FzZXMuCisJICovCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX0FMTF9JTlRFUlJVUFRTKSA9PSAwCisJICYmIChhaGRfY2hlY2tfY21kY21wbHRxdWV1ZXMoYWhkKSAhPSAwKSkKKwkJaW50c3RhdCA9IENNRENNUExUOworCWVsc2UKKwkJaW50c3RhdCA9IGFoZF9pbmIoYWhkLCBJTlRTVEFUKTsKKworCWlmICgoaW50c3RhdCAmIElOVF9QRU5EKSA9PSAwKQorCQlyZXR1cm4gKDApOworCisJaWYgKGludHN0YXQgJiBDTURDTVBMVCkgeworCQlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSQ01ESU5UKTsKKworCQkvKgorCQkgKiBFbnN1cmUgdGhhdCB0aGUgY2hpcCBzZWVzIHRoYXQgd2UndmUgY2xlYXJlZAorCQkgKiB0aGlzIGludGVycnVwdCBiZWZvcmUgd2Ugd2FsayB0aGUgb3V0cHV0IGZpZm8uCisJCSAqIE90aGVyd2lzZSwgd2UgbWF5LCBkdWUgdG8gcG9zdGVkIGJ1cyB3cml0ZXMsCisJCSAqIGNsZWFyIHRoZSBpbnRlcnJ1cHQgYWZ0ZXIgd2UgZmluaXNoIHRoZSBzY2FuLAorCQkgKiBhbmQgYWZ0ZXIgdGhlIHNlcXVlbmNlciBoYXMgYWRkZWQgbmV3IGVudHJpZXMKKwkJICogYW5kIGFzc2VydGVkIHRoZSBpbnRlcnJ1cHQgYWdhaW4uCisJCSAqLworCQlpZiAoKGFoZC0+YnVncyAmIEFIRF9JTlRDT0xMSVNJT05fQlVHKSAhPSAwKSB7CisJCQlpZiAoYWhkX2lzX3BhdXNlZChhaGQpKSB7CisJCQkJLyoKKwkJCQkgKiBQb3RlbnRpYWxseSBsb3N0IFNFUUlOVC4KKwkJCQkgKiBJZiBTRVFJTlRDT0RFIGlzIG5vbi16ZXJvLAorCQkJCSAqIHNpbXVsYXRlIHRoZSBTRVFJTlQuCisJCQkJICovCisJCQkJaWYgKGFoZF9pbmIoYWhkLCBTRVFJTlRDT0RFKSAhPSBOT19TRVFJTlQpCisJCQkJCWludHN0YXQgfD0gU0VRSU5UOworCQkJfQorCQl9IGVsc2UgeworCQkJYWhkX2ZsdXNoX2RldmljZV93cml0ZXMoYWhkKTsKKwkJfQorCQlhaGRfcnVuX3FvdXRmaWZvKGFoZCk7CisJCWFoZC0+Y21kY21wbHRfY291bnRzW2FoZC0+Y21kY21wbHRfYnVja2V0XSsrOworCQlhaGQtPmNtZGNtcGx0X3RvdGFsKys7CisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCisJCWlmICgoYWhkLT5mbGFncyAmIEFIRF9UQVJHRVRST0xFKSAhPSAwKQorCQkJYWhkX3J1bl90cWluZmlmbyhhaGQsIC8qcGF1c2VkKi9GQUxTRSk7CisjZW5kaWYKKwl9CisKKwkvKgorCSAqIEhhbmRsZSBzdGF0dXNlcyB0aGF0IG1heSBpbnZhbGlkYXRlIG91ciBjYWNoZWQKKwkgKiBjb3B5IG9mIElOVFNUQVQgc2VwYXJhdGVseS4KKwkgKi8KKwlpZiAoaW50c3RhdCA9PSAweEZGICYmIChhaGQtPmZlYXR1cmVzICYgQUhEX1JFTU9WQUJMRSkgIT0gMCkgeworCQkvKiBIb3QgZWplY3QuICBEbyBub3RoaW5nICovCisJfSBlbHNlIGlmIChpbnRzdGF0ICYgSFdFUlJJTlQpIHsKKwkJYWhkX2hhbmRsZV9od2VycmludChhaGQpOworCX0gZWxzZSBpZiAoKGludHN0YXQgJiAoUENJSU5UfFNQTFRJTlQpKSAhPSAwKSB7CisJCWFoZC0+YnVzX2ludHIoYWhkKTsKKwl9IGVsc2UgeworCisJCWlmICgoaW50c3RhdCAmIFNFUUlOVCkgIT0gMCkKKwkJCWFoZF9oYW5kbGVfc2VxaW50KGFoZCwgaW50c3RhdCk7CisKKwkJaWYgKChpbnRzdGF0ICYgU0NTSUlOVCkgIT0gMCkKKwkJCWFoZF9oYW5kbGVfc2NzaWludChhaGQsIGludHN0YXQpOworCX0KKwlyZXR1cm4gKDEpOworfQorCisjZW5kaWYgIC8qIF9BSUM3OVhYX0lOTElORV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyODc3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMKQEAgLTAsMCArMSw1MDE3IEBACisvKgorICogQWRhcHRlYyBBSUM3OXh4IGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2xpbnV4L2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMjMTcxICQKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMDAgSnVzdGluIFQuIEdpYmJzLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkgRG91ZyBMZWRmb3JkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSAiYWljNzl4eF9vc20uaCIKKyNpbmNsdWRlICJhaWM3OXh4X2lubGluZS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgorCisvKgorICogSW5jbHVkZSBhaWNsaWIuYyBhcyBwYXJ0IG9mIG91cgorICogIm1vZHVsZSBkZXBlbmRlbmNpZXMgYXJlIGhhcmQiIHdvcmsgYXJvdW5kLgorICovCisjaW5jbHVkZSAiYWljbGliLmMiCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CQkvKiBfX3NldHVwICovCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNpbmNsdWRlICJzZC5oIgkJCS8qIEZvciBnZW9tZXRyeSBkZXRlY3Rpb24gKi8KKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW0uaD4JCS8qIEZvciBmZXRjaGluZyBzeXN0ZW0gbWVtb3J5IHNpemUgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiBGb3Igc3NsZWVwL21zbGVlcCAqLworCisvKgorICogTG9jayBwcm90ZWN0aW5nIG1hbmlwdWxhdGlvbiBvZiB0aGUgYWhkIHNvZnRjIGxpc3QuCisgKi8KK3NwaW5sb2NrX3QgYWhkX2xpc3Rfc3BpbmxvY2s7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKy8qIEZvciBkeW5hbWljIHNnbGlzdCBzaXplIGNhbGN1bGF0aW9uLiAqLwordV9pbnQgYWhkX2xpbnV4X25zZWc7CisjZW5kaWYKKworLyoKKyAqIEJ1Y2tldCBzaXplIGZvciBjb3VudGluZyBnb29kIGNvbW1hbmRzIGluIGJldHdlZW4gYmFkIG9uZXMuCisgKi8KKyNkZWZpbmUgQUhEX0xJTlVYX0VSUl9USFJFU0gJMTAwMAorCisvKgorICogU2V0IHRoaXMgdG8gdGhlIGRlbGF5IGluIHNlY29uZHMgYWZ0ZXIgU0NTSSBidXMgcmVzZXQuCisgKiBOb3RlLCB3ZSBob25vciB0aGlzIG9ubHkgZm9yIHRoZSBpbml0aWFsIGJ1cyByZXNldC4KKyAqIFRoZSBzY3NpIGVycm9yIHJlY292ZXJ5IGNvZGUgcGVyZm9ybXMgaXRzIG93biBidXMgc2V0dGxlCisgKiBkZWxheSBoYW5kbGluZyBmb3IgZXJyb3IgcmVjb3ZlcnkgYWN0aW9ucy4KKyAqLworI2lmZGVmIENPTkZJR19BSUM3OVhYX1JFU0VUX0RFTEFZX01TCisjZGVmaW5lIEFJQzc5WFhfUkVTRVRfREVMQVkgQ09ORklHX0FJQzc5WFhfUkVTRVRfREVMQVlfTVMKKyNlbHNlCisjZGVmaW5lIEFJQzc5WFhfUkVTRVRfREVMQVkgNTAwMAorI2VuZGlmCisKKy8qCisgKiBUbyBjaGFuZ2UgdGhlIGRlZmF1bHQgbnVtYmVyIG9mIHRhZ2dlZCB0cmFuc2FjdGlvbnMgYWxsb3dlZCBwZXItZGV2aWNlLAorICogYWRkIGEgbGluZSB0byB0aGUgbGlsby5jb25mIGZpbGUgbGlrZToKKyAqIGFwcGVuZD0iYWljNzl4eD12ZXJib3NlLHRhZ19pbmZvOnt7MzIsMzIsMzIsMzJ9LHszMiwzMiwzMiwzMn19IgorICogd2hpY2ggd2lsbCByZXN1bHQgaW4gdGhlIGZpcnN0IGZvdXIgZGV2aWNlcyBvbiB0aGUgZmlyc3QgdHdvCisgKiBjb250cm9sbGVycyBiZWluZyBzZXQgdG8gYSB0YWdnZWQgcXVldWUgZGVwdGggb2YgMzIuCisgKgorICogVGhlIHRhZ19jb21tYW5kcyBpcyBhbiBhcnJheSBvZiAxNiB0byBhbGxvdyBmb3Igd2lkZSBhbmQgdHdpbiBhZGFwdGVycy4KKyAqIFR3aW4gYWRhcHRlcnMgd2lsbCB1c2UgaW5kZXhlcyAwLTcgZm9yIGNoYW5uZWwgMCwgYW5kIGluZGV4ZXMgOC0xNQorICogZm9yIGNoYW5uZWwgMS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90IHRhZ19jb21tYW5kc1sxNl07CS8qIEFsbG93IGZvciB3aWRlL3R3aW4gYWRhcHRlcnMuICovCit9IGFkYXB0ZXJfdGFnX2luZm9fdDsKKworLyoKKyAqIE1vZGlmeSB0aGlzIGFzIHlvdSBzZWUgZml0IGZvciB5b3VyIHN5c3RlbS4KKyAqCisgKiAwCQkJdGFnZ2VkIHF1ZXVpbmcgZGlzYWJsZWQKKyAqIDEgPD0gbiA8PSAyNTMJbiA9PSBtYXggdGFncyBldmVyIGRpc3BhdGNoZWQuCisgKgorICogVGhlIGRyaXZlciB3aWxsIHRocm90dGxlIHRoZSBudW1iZXIgb2YgY29tbWFuZHMgZGlzcGF0Y2hlZCB0byBhCisgKiBkZXZpY2UgaWYgaXQgcmV0dXJucyBxdWV1ZSBmdWxsLiAgRm9yIGRldmljZXMgd2l0aCBhIGZpeGVkIG1heGltdW0KKyAqIHF1ZXVlIGRlcHRoLCB0aGUgZHJpdmVyIHdpbGwgZXZlbnR1YWxseSBkZXRlcm1pbmUgdGhpcyBkZXB0aCBhbmQKKyAqIGxvY2sgaXQgaW4gKGEgY29uc29sZSBtZXNzYWdlIGlzIHByaW50ZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGxvY2sKKyAqIGhhcyBvY2N1cnJlZCkuICBPbiBzb21lIGRldmljZXMsIHF1ZXVlIGZ1bGwgaXMgcmV0dXJuZWQgZm9yIGEgdGVtcG9yYXJ5CisgKiByZXNvdXJjZSBzaG9ydGFnZS4gIFRoZXNlIGRldmljZXMgd2lsbCByZXR1cm4gcXVldWUgZnVsbCBhdCB2YXJ5aW5nCisgKiBkZXB0aHMuICBUaGUgZHJpdmVyIHdpbGwgdGhyb3R0bGUgYmFjayB3aGVuIHRoZSBxdWV1ZSBmdWxscyBvY2N1ciBhbmQKKyAqIGF0dGVtcHQgdG8gc2xvd2x5IGluY3JlYXNlIHRoZSBkZXB0aCBvdmVyIHRpbWUgYXMgdGhlIGRldmljZSByZWNvdmVycworICogZnJvbSB0aGUgcmVzb3VyY2Ugc2hvcnRhZ2UuCisgKgorICogSW4gdGhpcyBleGFtcGxlLCB0aGUgZmlyc3QgbGluZSB3aWxsIGRpc2FibGUgdGFnZ2VkIHF1ZXVlaW5nIGZvciBhbGwKKyAqIHRoZSBkZXZpY2VzIG9uIHRoZSBmaXJzdCBwcm9iZWQgYWljNzl4eCBhZGFwdGVyLgorICoKKyAqIFRoZSBzZWNvbmQgbGluZSBlbmFibGVzIHRhZ2dlZCBxdWV1ZWluZyB3aXRoIDQgY29tbWFuZHMvTFVOIGZvciBJRHMKKyAqICgwLCAyLTExLCAxMy0xNSksIGRpc2FibGVzIHRhZ2dlZCBxdWV1ZWluZyBmb3IgSUQgMTIsIGFuZCB0ZWxscyB0aGUKKyAqIGRyaXZlciB0byBhdHRlbXB0IHRvIHVzZSB1cCB0byA2NCB0YWdzIGZvciBJRCAxLgorICoKKyAqIFRoZSB0aGlyZCBsaW5lIGlzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBsaW5lLgorICoKKyAqIFRoZSBmb3VydGggbGluZSBkaXNhYmxlcyB0YWdnZWQgcXVldWVpbmcgZm9yIGRldmljZXMgMCBhbmQgMy4gIEl0CisgKiBlbmFibGVzIHRhZ2dlZCBxdWV1ZWluZyBmb3IgdGhlIG90aGVyIElEcywgd2l0aCAxNiBjb21tYW5kcy9MVU4KKyAqIGZvciBJRHMgMSBhbmQgNCwgMTI3IGNvbW1hbmRzL0xVTiBmb3IgSUQgOCwgYW5kIDQgY29tbWFuZHMvTFVOIGZvcgorICogSURzIDIsIDUtNywgYW5kIDktMTUuCisgKi8KKworLyoKKyAqIE5PVEU6IFRoZSBiZWxvdyBzdHJ1Y3R1cmUgaXMgZm9yIHJlZmVyZW5jZSBvbmx5LCB0aGUgYWN0dWFsIHN0cnVjdHVyZQorICogICAgICAgdG8gbW9kaWZ5IGluIG9yZGVyIHRvIGNoYW5nZSB0aGluZ3MgaXMganVzdCBiZWxvdyB0aGlzIGNvbW1lbnQgYmxvY2suCithZGFwdGVyX3RhZ19pbmZvX3QgYWljNzl4eF90YWdfaW5mb1tdID0KK3sKKwl7ezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9fSwKKwl7ezQsIDY0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCAwLCA0LCA0LCA0fX0sCisJe3swLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfX0sCisJe3swLCAxNiwgNCwgMCwgMTYsIDQsIDQsIDQsIDEyNywgNCwgNCwgNCwgNCwgNCwgNCwgNH19Cit9OworKi8KKworI2lmZGVmIENPTkZJR19BSUM3OVhYX0NNRFNfUEVSX0RFVklDRQorI2RlZmluZSBBSUM3OVhYX0NNRFNfUEVSX0RFVklDRSBDT05GSUdfQUlDNzlYWF9DTURTX1BFUl9ERVZJQ0UKKyNlbHNlCisjZGVmaW5lIEFJQzc5WFhfQ01EU19QRVJfREVWSUNFIEFIRF9NQVhfUVVFVUUKKyNlbmRpZgorCisjZGVmaW5lIEFJQzc5WFhfQ09ORklHRURfVEFHX0NPTU1BTkRTIHsJCQkJCVwKKwlBSUM3OVhYX0NNRFNfUEVSX0RFVklDRSwgQUlDNzlYWF9DTURTX1BFUl9ERVZJQ0UsCQlcCisJQUlDNzlYWF9DTURTX1BFUl9ERVZJQ0UsIEFJQzc5WFhfQ01EU19QRVJfREVWSUNFLAkJXAorCUFJQzc5WFhfQ01EU19QRVJfREVWSUNFLCBBSUM3OVhYX0NNRFNfUEVSX0RFVklDRSwJCVwKKwlBSUM3OVhYX0NNRFNfUEVSX0RFVklDRSwgQUlDNzlYWF9DTURTX1BFUl9ERVZJQ0UsCQlcCisJQUlDNzlYWF9DTURTX1BFUl9ERVZJQ0UsIEFJQzc5WFhfQ01EU19QRVJfREVWSUNFLAkJXAorCUFJQzc5WFhfQ01EU19QRVJfREVWSUNFLCBBSUM3OVhYX0NNRFNfUEVSX0RFVklDRSwJCVwKKwlBSUM3OVhYX0NNRFNfUEVSX0RFVklDRSwgQUlDNzlYWF9DTURTX1BFUl9ERVZJQ0UsCQlcCisJQUlDNzlYWF9DTURTX1BFUl9ERVZJQ0UsIEFJQzc5WFhfQ01EU19QRVJfREVWSUNFCQlcCit9CisKKy8qCisgKiBCeSBkZWZhdWx0LCB1c2UgdGhlIG51bWJlciBvZiBjb21tYW5kcyBzcGVjaWZpZWQgYnkKKyAqIHRoZSB1c2VycyBrZXJuZWwgY29uZmlndXJhdGlvbi4KKyAqLworc3RhdGljIGFkYXB0ZXJfdGFnX2luZm9fdCBhaWM3OXh4X3RhZ19pbmZvW10gPQoreworCXtBSUM3OVhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzc5WFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDNzlYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3OVhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzc5WFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDNzlYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3OVhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzc5WFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDNzlYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3OVhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzc5WFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDNzlYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3OVhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzc5WFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDNzlYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3OVhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30KK307CisKKy8qCisgKiBCeSBkZWZhdWx0LCByZWFkIHN0cmVhbWluZyBpcyBkaXNhYmxlZC4gIEluIHRoZW9yeSwKKyAqIHJlYWQgc3RyZWFtaW5nIHNob3VsZCBlbmhhbmNlIHBlcmZvcm1hbmNlLCBidXQgZWFybHkKKyAqIFUzMjAgZHJpdmUgZmlybXdhcmUgYWN0dWFsbHkgcGVyZm9ybXMgc2xvd2VyIHdpdGgKKyAqIHJlYWQgc3RyZWFtaW5nIGVuYWJsZWQuCisgKi8KKyNpZmRlZiBDT05GSUdfQUlDNzlYWF9FTkFCTEVfUkRfU1RSTQorI2RlZmluZSBBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0gMHhGRkZGCisjZWxzZQorI2RlZmluZSBBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0gMAorI2VuZGlmCisKK3N0YXRpYyB1aW50MTZfdCBhaWM3OXh4X3JkX3N0cm1faW5mb1tdID0KK3sKKwlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCisJQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAorCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKKwlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCisJQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAorCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKKwlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCisJQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAorCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKKwlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCisJQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAorCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKKwlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCisJQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAorCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKKwlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0KK307CisKKy8qCisgKiBEViBvcHRpb246CisgKgorICogcG9zaXRpdmUgdmFsdWUgPSBEViBFbmFibGVkCisgKiB6ZXJvCQkgID0gRFYgRGlzYWJsZWQKKyAqIG5lZ2F0aXZlIHZhbHVlID0gRFYgRGVmYXVsdCBmb3IgYWRhcHRlciB0eXBlL3NlZXByb20KKyAqLworI2lmZGVmIENPTkZJR19BSUM3OVhYX0RWX1NFVFRJTkcKKyNkZWZpbmUgQUlDNzlYWF9DT05GSUdFRF9EViBDT05GSUdfQUlDNzlYWF9EVl9TRVRUSU5HCisjZWxzZQorI2RlZmluZSBBSUM3OVhYX0NPTkZJR0VEX0RWIC0xCisjZW5kaWYKKworc3RhdGljIGludDhfdCBhaWM3OXh4X2R2X3NldHRpbmdzW10gPQoreworCUFJQzc5WFhfQ09ORklHRURfRFYsCisJQUlDNzlYWF9DT05GSUdFRF9EViwKKwlBSUM3OVhYX0NPTkZJR0VEX0RWLAorCUFJQzc5WFhfQ09ORklHRURfRFYsCisJQUlDNzlYWF9DT05GSUdFRF9EViwKKwlBSUM3OVhYX0NPTkZJR0VEX0RWLAorCUFJQzc5WFhfQ09ORklHRURfRFYsCisJQUlDNzlYWF9DT05GSUdFRF9EViwKKwlBSUM3OVhYX0NPTkZJR0VEX0RWLAorCUFJQzc5WFhfQ09ORklHRURfRFYsCisJQUlDNzlYWF9DT05GSUdFRF9EViwKKwlBSUM3OVhYX0NPTkZJR0VEX0RWLAorCUFJQzc5WFhfQ09ORklHRURfRFYsCisJQUlDNzlYWF9DT05GSUdFRF9EViwKKwlBSUM3OVhYX0NPTkZJR0VEX0RWLAorCUFJQzc5WFhfQ09ORklHRURfRFYKK307CisKKy8qCisgKiBUaGUgSS9PIGNlbGwgb24gdGhlIGNoaXAgaXMgdmVyeSBjb25maWd1cmFibGUgaW4gcmVzcGVjdCB0byBpdHMgYW5hbG9nCisgKiBjaGFyYWN0ZXJpc3RpY3MuICBTZXQgdGhlIGRlZmF1bHRzIGhlcmU7IHRoZXkgY2FuIGJlIG92ZXJyaWRlbiB3aXRoCisgKiB0aGUgcHJvcGVyIGluc21vZCBwYXJhbWV0ZXJzLgorICovCitzdHJ1Y3QgYWhkX2xpbnV4X2lvY2VsbF9vcHRzCit7CisJdWludDhfdAlwcmVjb21wOworCXVpbnQ4X3QJc2xld3JhdGU7CisJdWludDhfdCBhbXBsaXR1ZGU7Cit9OworI2RlZmluZSBBSUM3OVhYX0RFRkFVTFRfUFJFQ09NUAkJMHhGRgorI2RlZmluZSBBSUM3OVhYX0RFRkFVTFRfU0xFV1JBVEUJMHhGRgorI2RlZmluZSBBSUM3OVhYX0RFRkFVTFRfQU1QTElUVURFCTB4RkYKKyNkZWZpbmUgQUlDNzlYWF9ERUZBVUxUX0lPT1BUUwkJCVwKK3sJCQkJCQlcCisJQUlDNzlYWF9ERUZBVUxUX1BSRUNPTVAsCQlcCisJQUlDNzlYWF9ERUZBVUxUX1NMRVdSQVRFLAkJXAorCUFJQzc5WFhfREVGQVVMVF9BTVBMSVRVREUJCVwKK30KKyNkZWZpbmUgQUlDNzlYWF9QUkVDT01QX0lOREVYCTAKKyNkZWZpbmUgQUlDNzlYWF9TTEVXUkFURV9JTkRFWAkxCisjZGVmaW5lIEFJQzc5WFhfQU1QTElUVURFX0lOREVYCTIKK3N0YXRpYyBzdHJ1Y3QgYWhkX2xpbnV4X2lvY2VsbF9vcHRzIGFpYzc5eHhfaW9jZWxsX2luZm9bXSA9Cit7CisJQUlDNzlYWF9ERUZBVUxUX0lPT1BUUywKKwlBSUM3OVhYX0RFRkFVTFRfSU9PUFRTLAorCUFJQzc5WFhfREVGQVVMVF9JT09QVFMsCisJQUlDNzlYWF9ERUZBVUxUX0lPT1BUUywKKwlBSUM3OVhYX0RFRkFVTFRfSU9PUFRTLAorCUFJQzc5WFhfREVGQVVMVF9JT09QVFMsCisJQUlDNzlYWF9ERUZBVUxUX0lPT1BUUywKKwlBSUM3OVhYX0RFRkFVTFRfSU9PUFRTLAorCUFJQzc5WFhfREVGQVVMVF9JT09QVFMsCisJQUlDNzlYWF9ERUZBVUxUX0lPT1BUUywKKwlBSUM3OVhYX0RFRkFVTFRfSU9PUFRTLAorCUFJQzc5WFhfREVGQVVMVF9JT09QVFMsCisJQUlDNzlYWF9ERUZBVUxUX0lPT1BUUywKKwlBSUM3OVhYX0RFRkFVTFRfSU9PUFRTLAorCUFJQzc5WFhfREVGQVVMVF9JT09QVFMsCisJQUlDNzlYWF9ERUZBVUxUX0lPT1BUUworfTsKKworLyoKKyAqIFRoZXJlIHNob3VsZCBiZSBhIHNwZWNpZmljIHJldHVybiB2YWx1ZSBmb3IgdGhpcyBpbiBzY3NpLmgsIGJ1dAorICogaXQgc2VlbXMgdGhhdCBtb3N0IGRyaXZlcnMgaWdub3JlIGl0LgorICovCisjZGVmaW5lIERJRF9VTkRFUkZMT1cgICBESURfRVJST1IKKwordm9pZAorYWhkX3ByaW50X3BhdGgoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJcHJpbnRrKCIoc2NzaSVkOiVjOiVkOiVkKTogIiwKKwkgICAgICAgYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0LT5ob3N0X25vLAorCSAgICAgICBzY2IgIT0gTlVMTCA/IFNDQl9HRVRfQ0hBTk5FTChhaGQsIHNjYikgOiAnWCcsCisJICAgICAgIHNjYiAhPSBOVUxMID8gU0NCX0dFVF9UQVJHRVQoYWhkLCBzY2IpIDogLTEsCisJICAgICAgIHNjYiAhPSBOVUxMID8gU0NCX0dFVF9MVU4oc2NiKSA6IC0xKTsKK30KKworLyoKKyAqIFhYWCAtIHRoZXNlIG9wdGlvbnMgYXBwbHkgdW5pbGF0ZXJhbGx5IHRvIF9hbGxfIGFkYXB0ZXJzCisgKiAgICAgICBjYXJkcyBpbiB0aGUgc3lzdGVtLiAgVGhpcyBzaG91bGQgYmUgZml4ZWQuICBFeGNlcHRpb25zIHRvIHRoaXMKKyAqICAgICAgIHJ1bGUgYXJlIG5vdGVkIGluIHRoZSBjb21tZW50cy4KKyAqLworCisvKgorICogU2tpcCB0aGUgc2NzaSBidXMgcmVzZXQuICBOb24gMCBtYWtlIHVzIHNraXAgdGhlIHJlc2V0IGF0IHN0YXJ0dXAuICBUaGlzCisgKiBoYXMgbm8gZWZmZWN0IG9uIGFueSBsYXRlciByZXNldHMgdGhhdCBtaWdodCBvY2N1ciBkdWUgdG8gdGhpbmdzIGxpa2UKKyAqIFNDU0kgYnVzIHRpbWVvdXRzLgorICovCitzdGF0aWMgdWludDMyX3QgYWljNzl4eF9ub19yZXNldDsKKworLyoKKyAqIENlcnRhaW4gUENJIG1vdGhlcmJvYXJkcyB3aWxsIHNjYW4gUENJIGRldmljZXMgZnJvbSBoaWdoZXN0IHRvIGxvd2VzdCwKKyAqIG90aGVycyBzY2FuIGZyb20gbG93ZXN0IHRvIGhpZ2hlc3QsIGFuZCB0aGV5IHRlbmQgdG8gZG8gYWxsIGtpbmRzIG9mCisgKiBzdHJhbmdlIHRoaW5ncyB3aGVuIHRoZXkgY29tZSBpbnRvIGNvbnRhY3Qgd2l0aCBQQ0kgYnJpZGdlIGNoaXBzLiAgVGhlCisgKiBuZXQgcmVzdWx0IG9mIGFsbCB0aGlzIGlzIHRoYXQgdGhlIFBDSSBjYXJkIHRoYXQgaXMgYWN0dWFsbHkgdXNlZCB0byBib290CisgKiB0aGUgbWFjaGluZSBpcyB2ZXJ5IGhhcmQgdG8gZGV0ZWN0LiAgTW9zdCBtb3RoZXJib2FyZHMgZ28gZnJvbSBsb3dlc3QKKyAqIFBDSSBzbG90IG51bWJlciB0byBoaWdoZXN0LCBhbmQgdGhlIGZpcnN0IFNDU0kgY29udHJvbGxlciBmb3VuZCBpcyB0aGUKKyAqIG9uZSB5b3UgYm9vdCBmcm9tLiAgVGhlIG9ubHkgZXhjZXB0aW9ucyB0byB0aGlzIGFyZSB3aGVuIGEgY29udHJvbGxlcgorICogaGFzIGl0cyBCSU9TIGRpc2FibGVkLiAgU28sIHdlIGJ5IGRlZmF1bHQgc29ydCBhbGwgb2Ygb3VyIFNDU0kgY29udHJvbGxlcnMKKyAqIGZyb20gbG93ZXN0IFBDSSBzbG90IG51bWJlciB0byBoaWdoZXN0IFBDSSBzbG90IG51bWJlci4gIFdlIGFsc28gZm9yY2UKKyAqIGFsbCBjb250cm9sbGVycyB3aXRoIHRoZWlyIEJJT1MgZGlzYWJsZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gIFRoaXMKKyAqIHdvcmtzIG9uICphbG1vc3QqIGFsbCBjb21wdXRlcnMuICBXaGVyZSBpdCBkb2Vzbid0IHdvcmssIHdlIGhhdmUgdGhpcworICogb3B0aW9uLiAgU2V0dGluZyB0aGlzIG9wdGlvbiB0byBub24tMCB3aWxsIHJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBzb3J0CisgKiB0byBoaWdoZXN0IGZpcnN0LCB0aGVuIGxvd2VzdCwgYnV0IHdpbGwgc3RpbGwgbGVhdmUgY2FyZHMgd2l0aCB0aGVpciBCSU9TCisgKiBkaXNhYmxlZCBhdCB0aGUgdmVyeSBlbmQuICBUaGF0IHNob3VsZCBmaXggZXZlcnlvbmUgdXAgdW5sZXNzIHRoZXJlIGFyZQorICogcmVhbGx5IHN0cmFuZ2UgY2lydW1zdGFuY2VzLgorICovCitzdGF0aWMgdWludDMyX3QgYWljNzl4eF9yZXZlcnNlX3NjYW47CisKKy8qCisgKiBTaG91bGQgd2UgZm9yY2UgRVhURU5ERUQgdHJhbnNsYXRpb24gb24gYSBjb250cm9sbGVyLgorICogICAgIDAgPT0gVXNlIHdoYXRldmVyIGlzIGluIHRoZSBTRUVQUk9NIG9yIGRlZmF1bHQgdG8gb2ZmCisgKiAgICAgMSA9PSBVc2Ugd2hhdGV2ZXIgaXMgaW4gdGhlIFNFRVBST00gb3IgZGVmYXVsdCB0byBvbgorICovCitzdGF0aWMgdWludDMyX3QgYWljNzl4eF9leHRlbmRlZDsKKworLyoKKyAqIFBDSSBidXMgcGFyaXR5IGNoZWNraW5nIG9mIHRoZSBBZGFwdGVjIGNvbnRyb2xsZXJzLiAgVGhpcyBpcyBzb21ld2hhdAorICogZHViaW91cyBhdCBiZXN0LiAgVG8gbXkga25vd2xlZGdlLCB0aGlzIG9wdGlvbiBoYXMgbmV2ZXIgYWN0dWFsbHkKKyAqIHNvbHZlZCBhIFBDSSBwYXJpdHkgcHJvYmxlbSwgYnV0IG9uIGNlcnRhaW4gbWFjaGluZXMgd2l0aCBicm9rZW4gUENJCisgKiBjaGlwc2V0IGNvbmZpZ3VyYXRpb25zLCBpdCBjYW4gZ2VuZXJhdGUgdG9ucyBvZiBmYWxzZSBlcnJvciBtZXNzYWdlcy4KKyAqIEl0J3MgaW5jbHVkZWQgaW4gdGhlIGRyaXZlciBmb3IgY29tcGxldGVuZXNzLgorICogICAwCSAgID0gU2h1dCBvZmYgUENJIHBhcml0eSBjaGVjaworICogICBub24tMCA9IEVuYWJsZSBQQ0kgcGFyaXR5IGNoZWNrCisgKgorICogTk9URTogeW91IGNhbid0IGFjdHVhbGx5IHBhc3MgLTEgb24gdGhlIGxpbG8gcHJvbXB0LiAgU28sIHRvIHNldCB0aGlzCisgKiB2YXJpYWJsZSB0byAtMSB5b3Ugd291bGQgYWN0dWFsbHkgd2FudCB0byBzaW1wbHkgcGFzcyB0aGUgdmFyaWFibGUKKyAqIG5hbWUgd2l0aG91dCBhIG51bWJlci4gIFRoYXQgd2lsbCBpbnZlcnQgdGhlIDAgd2hpY2ggd2lsbCByZXN1bHQgaW4KKyAqIC0xLgorICovCitzdGF0aWMgdWludDMyX3QgYWljNzl4eF9wY2lfcGFyaXR5ID0gfjA7CisKKy8qCisgKiBUaGVyZSBhcmUgbG90cyBvZiBicm9rZW4gY2hpcHNldHMgaW4gdGhlIHdvcmxkLiAgU29tZSBvZiB0aGVtIHdpbGwKKyAqIHZpb2xhdGUgdGhlIFBDSSBzcGVjIHdoZW4gd2UgaXNzdWUgYnl0ZSBzaXplZCBtZW1vcnkgd3JpdGVzIHRvIG91cgorICogY29udHJvbGxlci4gIEkvTyBtYXBwZWQgcmVnaXN0ZXIgYWNjZXNzLCBpZiBhbGxvd2VkIGJ5IHRoZSBnaXZlbgorICogcGxhdGZvcm0sIHdpbGwgd29yayBpbiBhbG1vc3QgYWxsIGNhc2VzLgorICovCit1aW50MzJfdCBhaWM3OXh4X2FsbG93X21lbWlvID0gfjA7CisKKy8qCisgKiBhaWM3OXh4X2RldGVjdCgpIGhhcyBiZWVuIHJ1biwgc28gcmVnaXN0ZXIgYWxsIGRldmljZSBhcnJpdmFscworICogaW1tZWRpYXRlbHkgd2l0aCB0aGUgc3lzdGVtIHJhdGhlciB0aGFuIGRlZmVycmluZyB0byB0aGUgc29ydGVkCisgKiBhdHRhY2htZW50IHBlcmZvcm1lZCBieSBhaWM3OXh4X2RldGVjdCgpLgorICovCitpbnQgYWljNzl4eF9kZXRlY3RfY29tcGxldGU7CisKKy8qCisgKiBTbyB0aGF0IHdlIGNhbiBzZXQgaG93IGxvbmcgZWFjaCBkZXZpY2UgaXMgZ2l2ZW4gYXMgYSBzZWxlY3Rpb24gdGltZW91dC4KKyAqIFRoZSB0YWJsZSBvZiB2YWx1ZXMgZ29lcyBsaWtlIHRoaXM6CisgKiAgIDAgLSAyNTZtcworICogICAxIC0gMTI4bXMKKyAqICAgMiAtIDY0bXMKKyAqICAgMyAtIDMybXMKKyAqIFdlIGRlZmF1bHQgdG8gMjU2bXMgYmVjYXVzZSBzb21lIG9sZGVyIGRldmljZXMgbmVlZCBhIGxvbmdlciB0aW1lCisgKiB0byByZXNwb25kIHRvIGluaXRpYWwgc2VsZWN0aW9uLgorICovCitzdGF0aWMgdWludDMyX3QgYWljNzl4eF9zZWx0aW1lOworCisvKgorICogQ2VydGFpbiBkZXZpY2VzIGRvIG5vdCBwZXJmb3JtIGFueSBhZ2luZyBvbiBjb21tYW5kcy4gIFNob3VsZCB0aGUKKyAqIGRldmljZSBiZSBzYXR1cmF0ZWQgYnkgY29tbWFuZHMgaW4gb25lIHBvcnRpb24gb2YgdGhlIGRpc2ssIGl0IGlzCisgKiBwb3NzaWJsZSBmb3IgdHJhbnNhY3Rpb25zIG9uIGZhciBhd2F5IHNlY3RvcnMgdG8gbmV2ZXIgYmUgc2VydmljZWQuCisgKiBUbyBoYW5kbGUgdGhlc2UgZGV2aWNlcywgd2UgY2FuIHBlcmlvZGljYWxseSBzZW5kIGFuIG9yZGVyZWQgdGFnIHRvCisgKiBmb3JjZSBhbGwgb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb25zIHRvIGJlIHNlcnZpY2VkIHByaW9yIHRvIGEgbmV3CisgKiB0cmFuc2FjdGlvbi4KKyAqLwordWludDMyX3QgYWljNzl4eF9wZXJpb2RpY19vdGFnOworCisvKgorICogTW9kdWxlIGluZm9ybWF0aW9uIGFuZCBzZXR0YWJsZSBvcHRpb25zLgorICovCitzdGF0aWMgY2hhciAqYWljNzl4eCA9IE5VTEw7CisKK01PRFVMRV9BVVRIT1IoIk1haW50YWluZXI6IEp1c3RpbiBULiBHaWJicyA8Z2liYnNAc2NzaWd1eS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFkYXB0ZWMgQWljNzkwWCBVMzIwIFNDU0kgSG9zdCBCdXMgQWRhcHRlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9WRVJTSU9OKEFJQzc5WFhfRFJJVkVSX1ZFUlNJT04pOworbW9kdWxlX3BhcmFtKGFpYzc5eHgsIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYWljNzl4eCwKKyJwZXJpb2QgZGVsaW1pdGVkLCBvcHRpb25zIHN0cmluZy5cbiIKKyIJdmVyYm9zZQkJCUVuYWJsZSB2ZXJib3NlL2RpYWdub3N0aWMgbG9nZ2luZ1xuIgorIglhbGxvd19tZW1pbwkJQWxsb3cgZGV2aWNlIHJlZ2lzdGVycyB0byBiZSBtZW1vcnkgbWFwcGVkXG4iCisiCWRlYnVnCQkJQml0bWFzayBvZiBkZWJ1ZyB2YWx1ZXMgdG8gZW5hYmxlXG4iCisiCW5vX3Jlc2V0CQlTdXByZXNzIGluaXRpYWwgYnVzIHJlc2V0c1xuIgorIglleHRlbmRlZAkJRW5hYmxlIGV4dGVuZGVkIGdlb21ldHJ5IG9uIGFsbCBjb250cm9sbGVyc1xuIgorIglwZXJpb2RpY19vdGFnCQlTZW5kIGFuIG9yZGVyZWQgdGFnZ2VkIHRyYW5zYWN0aW9uXG4iCisiCQkJCXBlcmlvZGljYWxseSB0byBwcmV2ZW50IHRhZyBzdGFydmF0aW9uLlxuIgorIgkJCQlUaGlzIG1heSBiZSByZXF1aXJlZCBieSBzb21lIG9sZGVyIGRpc2tcbiIKKyIJCQkJb3IgZHJpdmVzL1JBSUQgYXJyYXlzLlxuIgorIglyZXZlcnNlX3NjYW4JCVNvcnQgUENJIGRldmljZXMgaGlnaGVzdCBCdXMvU2xvdCB0byBsb3dlc3RcbiIKKyIJdGFnX2luZm86PHRhZ19zdHI+CVNldCBwZXItdGFyZ2V0IHRhZyBkZXB0aFxuIgorIglnbG9iYWxfdGFnX2RlcHRoOjxpbnQ+CUdsb2JhbCB0YWcgZGVwdGggZm9yIGFsbCB0YXJnZXRzIG9uIGFsbCBidXNlc1xuIgorIglyZF9zdHJtOjxyZF9zdHJtX21hc2tzPiBTZXQgcGVyLXRhcmdldCByZWFkIHN0cmVhbWluZyBzZXR0aW5nLlxuIgorIglkdjo8ZHZfc2V0dGluZ3M+CVNldCBwZXItY29udHJvbGxlciBEb21haW4gVmFsaWRhdGlvbiBTZXR0aW5nLlxuIgorIglzbGV3cmF0ZTo8c2xld3JhdGVfbGlzdD5TZXQgdGhlIHNpZ25hbCBzbGV3IHJhdGUgKDAtMTUpLlxuIgorIglwcmVjb21wOjxwY29tcF9saXN0PglTZXQgdGhlIHNpZ25hbCBwcmVjb21wZW5zYXRpb24gKDAtNykuXG4iCisiCWFtcGxpdHVkZTo8aW50PgkJU2V0IHRoZSBzaWduYWwgYW1wbGl0dWRlICgwLTcpLlxuIgorIglzZWx0aW1lOjxpbnQ+CQlTZWxlY3Rpb24gVGltZW91dDpcbiIKKyIJCQkJKDAvMjU2bXMsMS8xMjhtcywyLzY0bXMsMy8zMm1zKVxuIgorIlxuIgorIglTYW1wbGUgL2V0Yy9tb2Rwcm9iZS5jb25mIGxpbmU6XG4iCisiCQlFbmFibGUgdmVyYm9zZSBsb2dnaW5nXG4iCisiCQlTZXQgdGFnIGRlcHRoIG9uIENvbnRyb2xsZXIgMi9UYXJnZXQgMiB0byAxMCB0YWdzXG4iCisiCQlTaG9ydGVuIHRoZSBzZWxlY3Rpb24gdGltZW91dCB0byAxMjhtc1xuIgorIlxuIgorIglvcHRpb25zIGFpYzc5eHggJ2FpYzc5eHg9dmVyYm9zZS50YWdfaW5mbzp7e30ue30uey4uMTB9fS5zZWx0aW1lOjEnXG4iCisiXG4iCisiCVNhbXBsZSAvZXRjL21vZHByb2JlLmNvbmYgbGluZTpcbiIKKyIJCUNoYW5nZSBSZWFkIFN0cmVhbWluZyBmb3IgQ29udHJvbGxlcidzIDIgYW5kIDNcbiIKKyJcbiIKKyIJb3B0aW9ucyBhaWM3OXh4ICdhaWM3OXh4PXJkX3N0cm06ey4uMHhGRkYwLjB4QzBGMH0nIik7CisKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9oYW5kbGVfc2NzaV9zdGF0dXMoc3RydWN0IGFoZF9zb2Z0YyAqLAorCQkJCQkgc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKiwKKwkJCQkJIHN0cnVjdCBzY2IgKik7CitzdGF0aWMgdm9pZCBhaGRfbGludXhfcXVldWVfY21kX2NvbXBsZXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJIFNjc2lfQ21uZCAqY21kKTsKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9maWx0ZXJfaW5xdWlyeShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X2Rldl90aW1lZF91bmZyZWV6ZSh1X2xvbmcgYXJnKTsKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9zZW1fdGltZW91dCh1X2xvbmcgYXJnKTsKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9pbml0aWFsaXplX3Njc2lfYnVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgdm9pZCBhaGRfbGludXhfc2l6ZV9uc2VnKHZvaWQpOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X3RocmVhZF9ydW5fY29tcGxldGVfcXVldWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9zdGFydF9kdihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X2R2X3RpbWVvdXQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK3N0YXRpYyBpbnQgIGFoZF9saW51eF9kdl90aHJlYWQodm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBhaGRfbGludXhfa2lsbF9kdl90aHJlYWQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9kdl90YXJnZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0YXJnZXQpOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X2R2X3RyYW5zaXRpb24oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCSAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQkJICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkgICAgc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcpOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X2R2X2ZpbGxfY21kKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCQkgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbyk7CitzdGF0aWMgdm9pZCBhaGRfbGludXhfZHZfaW5xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQkgICAgIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnLAorCQkJICAgICB1X2ludCByZXF1ZXN0X2xlbmd0aCk7CitzdGF0aWMgdm9pZCBhaGRfbGludXhfZHZfdHVyKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X2R2X3JlYmQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJICAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgICAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCQkJICAgICAgc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcpOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X2R2X3dlYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkgICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCSAgICAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCQkJICAgICBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZyk7CitzdGF0aWMgdm9pZCBhaGRfbGludXhfZHZfcmViKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQkgICAgIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnKTsKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9kdl9zdShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkJCSAgICBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZyk7CitzdGF0aWMgaW50IGFoZF9saW51eF9mYWxsYmFjayhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkgICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIF9faW5saW5lIGludCBhaGRfbGludXhfZHZfZmFsbGJhY2soc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbyk7CitzdGF0aWMgdm9pZCBhaGRfbGludXhfZHZfY29tcGxldGUoU2NzaV9DbW5kICpjbWQpOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X2dlbmVyYXRlX2R2X3BhdHRlcm4oc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcpOworc3RhdGljIHVfaW50IGFoZF9saW51eF91c2VyX3RhZ2RlcHRoKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkgICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbyk7CitzdGF0aWMgdV9pbnQgYWhkX2xpbnV4X3VzZXJfZHZfc2V0dGluZyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X3NldHVwX3VzZXJfcmRfc3RybV9zZXR0aW5ncyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X2RldmljZV9xdWV1ZV9kZXB0aChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSBzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCoJYWhkX2xpbnV4X2FsbG9jX3RhcmdldChzdHJ1Y3QgYWhkX3NvZnRjKiwKKwkJCQkJCSAgICAgICB1X2ludCwgdV9pbnQpOworc3RhdGljIHZvaWQJCQlhaGRfbGludXhfZnJlZV90YXJnZXQoc3RydWN0IGFoZF9zb2Z0YyosCisJCQkJCQkgICAgICBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCopOworc3RhdGljIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlKglhaGRfbGludXhfYWxsb2NfZGV2aWNlKHN0cnVjdCBhaGRfc29mdGMqLAorCQkJCQkJICAgICAgIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0KiwKKwkJCQkJCSAgICAgICB1X2ludCk7CitzdGF0aWMgdm9pZAkJCWFoZF9saW51eF9mcmVlX2RldmljZShzdHJ1Y3QgYWhkX3NvZnRjKiwKKwkJCQkJCSAgICAgIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlKik7CitzdGF0aWMgdm9pZCBhaGRfbGludXhfcnVuX2RldmljZV9xdWV1ZShzdHJ1Y3QgYWhkX3NvZnRjKiwKKwkJCQkgICAgICAgc3RydWN0IGFoZF9saW51eF9kZXZpY2UqKTsKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9zZXR1cF90YWdfaW5mb19nbG9iYWwoY2hhciAqcCk7CitzdGF0aWMgYWljX29wdGlvbl9jYWxsYmFja190IGFoZF9saW51eF9zZXR1cF90YWdfaW5mbzsKK3N0YXRpYyBhaWNfb3B0aW9uX2NhbGxiYWNrX3QgYWhkX2xpbnV4X3NldHVwX3JkX3N0cm1faW5mbzsKK3N0YXRpYyBhaWNfb3B0aW9uX2NhbGxiYWNrX3QgYWhkX2xpbnV4X3NldHVwX2R2Oworc3RhdGljIGFpY19vcHRpb25fY2FsbGJhY2tfdCBhaGRfbGludXhfc2V0dXBfaW9jZWxsX2luZm87CitzdGF0aWMgaW50IGFoZF9saW51eF9uZXh0X3VuaXQodm9pZCk7CitzdGF0aWMgdm9pZCBhaGRfcnVucV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgaW50IGFpYzc5eHhfc2V0dXAoY2hhciAqYyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSW5saW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfc2NoZWR1bGVfY29tcGxldGVxKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfc2NoZWR1bGVfcnVucShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3NldHVwX3J1bnFfdGFza2xldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3RlYXJkb3duX3J1bnFfdGFza2xldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlKgorCQkgICAgIGFoZF9saW51eF9nZXRfZGV2aWNlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgY2hhbm5lbCwKKwkJCQkJICB1X2ludCB0YXJnZXQsIHVfaW50IGx1biwgaW50IGFsbG9jKTsKK3N0YXRpYyBzdHJ1Y3QgYWhkX2NtZCAqYWhkX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2xpbnV4X2NoZWNrX2RldmljZV9xdWV1ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCQkgIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXYpOworc3RhdGljIF9faW5saW5lIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICoKKwkJICAgICBhaGRfbGludXhfbmV4dF9kZXZpY2VfdG9fcnVuKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfbGludXhfcnVuX2RldmljZV9xdWV1ZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9saW51eF91bm1hcF9zY2Ioc3RydWN0IGFoZF9zb2Z0YyosIHN0cnVjdCBzY2IqKTsKKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9zY2hlZHVsZV9jb21wbGV0ZXEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCWlmICgoYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmIEFIRF9SVU5fQ01QTFRfUV9USU1FUikgPT0gMCkgeworCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmZsYWdzIHw9IEFIRF9SVU5fQ01QTFRfUV9USU1FUjsKKwkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIuZXhwaXJlcyA9IGppZmZpZXM7CisJCWFkZF90aW1lcigmYWhkLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIpOworCX0KK30KKworLyoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggb3VyIGxvY2sgaGVsZC4KKyAqLworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9zY2hlZHVsZV9ydW5xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl0YXNrbGV0X3NjaGVkdWxlKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnJ1bnFfdGFza2xldCk7Cit9CisKK3N0YXRpYyBfX2lubGluZQordm9pZCBhaGRfc2V0dXBfcnVucV90YXNrbGV0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl0YXNrbGV0X2luaXQoJmFoZC0+cGxhdGZvcm1fZGF0YS0+cnVucV90YXNrbGV0LCBhaGRfcnVucV90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKWFoZCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfdGVhcmRvd25fcnVucV90YXNrbGV0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl0YXNrbGV0X2tpbGwoJmFoZC0+cGxhdGZvcm1fZGF0YS0+cnVucV90YXNrbGV0KTsKK30KKworc3RhdGljIF9faW5saW5lIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlKgorYWhkX2xpbnV4X2dldF9kZXZpY2Uoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBjaGFubmVsLCB1X2ludCB0YXJnZXQsCisJCSAgICAgdV9pbnQgbHVuLCBpbnQgYWxsb2MpCit7CisJc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmc7CisJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKKwl1X2ludCB0YXJnZXRfb2Zmc2V0OworCisJdGFyZ2V0X29mZnNldCA9IHRhcmdldDsKKwlpZiAoY2hhbm5lbCAhPSAwKQorCQl0YXJnZXRfb2Zmc2V0ICs9IDg7CisJdGFyZyA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+dGFyZ2V0c1t0YXJnZXRfb2Zmc2V0XTsKKwlpZiAodGFyZyA9PSBOVUxMKSB7CisJCWlmIChhbGxvYyAhPSAwKSB7CisJCQl0YXJnID0gYWhkX2xpbnV4X2FsbG9jX3RhcmdldChhaGQsIGNoYW5uZWwsIHRhcmdldCk7CisJCQlpZiAodGFyZyA9PSBOVUxMKQorCQkJCXJldHVybiAoTlVMTCk7CisJCX0gZWxzZQorCQkJcmV0dXJuIChOVUxMKTsKKwl9CisJZGV2ID0gdGFyZy0+ZGV2aWNlc1tsdW5dOworCWlmIChkZXYgPT0gTlVMTCAmJiBhbGxvYyAhPSAwKQorCQlkZXYgPSBhaGRfbGludXhfYWxsb2NfZGV2aWNlKGFoZCwgdGFyZywgbHVuKTsKKwlyZXR1cm4gKGRldik7Cit9CisKKyNkZWZpbmUgQUhEX0xJTlVYX01BWF9SRVRVUk5FRF9FUlJPUlMgNAorc3RhdGljIHN0cnVjdCBhaGRfY21kICoKK2FoZF9saW51eF9ydW5fY29tcGxldGVfcXVldWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQorewkKKwlzdHJ1Y3QJYWhkX2NtZCAqYWNtZDsKKwl1X2xvbmcJZG9uZV9mbGFnczsKKwlpbnQJd2l0aF9lcnJvcnM7CisKKwl3aXRoX2Vycm9ycyA9IDA7CisJYWhkX2RvbmVfbG9jayhhaGQsICZkb25lX2ZsYWdzKTsKKwl3aGlsZSAoKGFjbWQgPSBUQUlMUV9GSVJTVCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXEpKSAhPSBOVUxMKSB7CisJCVNjc2lfQ21uZCAqY21kOworCisJCWlmICh3aXRoX2Vycm9ycyA+IEFIRF9MSU5VWF9NQVhfUkVUVVJORURfRVJST1JTKSB7CisJCQkvKgorCQkJICogTGludXggdXNlcyBzdGFjayByZWN1cnNpb24gdG8gcmVxdWV1ZQorCQkJICogY29tbWFuZHMgdGhhdCBuZWVkIHRvIGJlIHJldHJpZWQuICBBdm9pZAorCQkJICogYmxvd2luZyBvdXQgdGhlIHN0YWNrIGJ5ICJzcG9vbiBmZWVkaW5nIgorCQkJICogY29tbWFuZHMgdGhhdCBjb21wbGV0ZWQgd2l0aCBlcnJvciBiYWNrCisJCQkgKiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpbiBjYXNlIHRoZXkgYXJlIGdvaW5nCisJCQkgKiB0byBiZSByZXRyaWVkLiAiaWNrIgorCQkJICovCisJCQlhaGRfc2NoZWR1bGVfY29tcGxldGVxKGFoZCk7CisJCQlicmVhazsKKwkJfQorCQlUQUlMUV9SRU1PVkUoJmFoZC0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxLAorCQkJICAgICBhY21kLCBhY21kX2xpbmtzLnRxZSk7CisJCWNtZCA9ICZhY21kX3Njc2lfY21kKGFjbWQpOworCQljbWQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCQlpZiAoYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCkgIT0gRElEX09LCisJCSB8fCAoY21kLT5yZXN1bHQgJiAweEZGKSAhPSBTQ1NJX1NUQVRVU19PSykKKwkJCXdpdGhfZXJyb3JzKys7CisKKwkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwl9CisJYWhkX2RvbmVfdW5sb2NrKGFoZCwgJmRvbmVfZmxhZ3MpOworCXJldHVybiAoYWNtZCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfbGludXhfY2hlY2tfZGV2aWNlX3F1ZXVlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCSAgICAgc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldikKK3sKKwlpZiAoKGRldi0+ZmxhZ3MgJiBBSERfREVWX0ZSRUVaRV9USUxfRU1QVFkpICE9IDAKKwkgJiYgZGV2LT5hY3RpdmUgPT0gMCkgeworCQlkZXYtPmZsYWdzICY9IH5BSERfREVWX0ZSRUVaRV9USUxfRU1QVFk7CisJCWRldi0+cWZyb3plbi0tOworCX0KKworCWlmIChUQUlMUV9GSVJTVCgmZGV2LT5idXN5cSkgPT0gTlVMTAorCSB8fCBkZXYtPm9wZW5pbmdzID09IDAgfHwgZGV2LT5xZnJvemVuICE9IDApCisJCXJldHVybjsKKworCWFoZF9saW51eF9ydW5fZGV2aWNlX3F1ZXVlKGFoZCwgZGV2KTsKK30KKworc3RhdGljIF9faW5saW5lIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICoKK2FoZF9saW51eF9uZXh0X2RldmljZV90b19ydW4oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCQorCWlmICgoYWhkLT5mbGFncyAmIEFIRF9SRVNPVVJDRV9TSE9SVEFHRSkgIT0gMAorCSB8fCAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuICE9IDAKKwkgICYmIEFIRF9EVl9TSU1RX0ZST1pFTihhaGQpID09IDApKQorCQlyZXR1cm4gKE5VTEwpOworCXJldHVybiAoVEFJTFFfRklSU1QoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZGV2aWNlX3J1bnEpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9saW51eF9ydW5fZGV2aWNlX3F1ZXVlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKKworCXdoaWxlICgoZGV2ID0gYWhkX2xpbnV4X25leHRfZGV2aWNlX3RvX3J1bihhaGQpKSAhPSBOVUxMKSB7CisJCVRBSUxRX1JFTU9WRSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kZXZpY2VfcnVucSwgZGV2LCBsaW5rcyk7CisJCWRldi0+ZmxhZ3MgJj0gfkFIRF9ERVZfT05fUlVOX0xJU1Q7CisJCWFoZF9saW51eF9jaGVja19kZXZpY2VfcXVldWUoYWhkLCBkZXYpOworCX0KK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9saW51eF91bm1hcF9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJU2NzaV9DbW5kICpjbWQ7CisJaW50IGRpcmVjdGlvbjsKKworCWNtZCA9IHNjYi0+aW9fY3R4OworCWRpcmVjdGlvbiA9IHNjc2lfdG9fcGNpX2RtYV9kaXIoY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJYWhkX3N5bmNfc2dsaXN0KGFoZCwgc2NiLCBCVVNfRE1BU1lOQ19QT1NUV1JJVEUpOworCWlmIChjbWQtPnVzZV9zZyAhPSAwKSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisKKwkJc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJcGNpX3VubWFwX3NnKGFoZC0+ZGV2X3NvZnRjLCBzZywgY21kLT51c2Vfc2csIGRpcmVjdGlvbik7CisJfSBlbHNlIGlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbiAhPSAwKSB7CisJCXBjaV91bm1hcF9zaW5nbGUoYWhkLT5kZXZfc29mdGMsCisJCQkJIHNjYi0+cGxhdGZvcm1fZGF0YS0+YnVmX2J1c2FkZHIsCisJCQkJIGNtZC0+cmVxdWVzdF9idWZmbGVuLCBkaXJlY3Rpb24pOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQlVJTERfU0NTSUlEKGFoZCwgY21kKQkJCQkJCVwKKwkoKCgoY21kKS0+ZGV2aWNlLT5pZCA8PCBUSURfU0hJRlQpICYgVElEKSB8IChhaGQpLT5vdXJfaWQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogIEhvc3QgdGVtcGxhdGUgZW50cnkgcG9pbnRzICoqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CSAgIGFoZF9saW51eF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICopOworc3RhdGljIGNvbnN0IGNoYXIgKmFoZF9saW51eF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgaW50CSAgIGFoZF9saW51eF9xdWV1ZShTY3NpX0NtbmQgKiwgdm9pZCAoKikoU2NzaV9DbW5kICopKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCitzdGF0aWMgaW50CSAgIGFoZF9saW51eF9zbGF2ZV9hbGxvYyhTY3NpX0RldmljZSAqKTsKK3N0YXRpYyBpbnQJICAgYWhkX2xpbnV4X3NsYXZlX2NvbmZpZ3VyZShTY3NpX0RldmljZSAqKTsKK3N0YXRpYyB2b2lkCSAgIGFoZF9saW51eF9zbGF2ZV9kZXN0cm95KFNjc2lfRGV2aWNlICopOworI2lmIGRlZmluZWQoX19pMzg2X18pCitzdGF0aWMgaW50CSAgIGFoZF9saW51eF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlKiwKKwkJCQkgICAgICAgc3RydWN0IGJsb2NrX2RldmljZSosIHNlY3Rvcl90LCBpbnRbXSk7CisjZW5kaWYKKyNlbHNlCitzdGF0aWMgaW50CSAgIGFoZF9saW51eF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgdm9pZAkgICBhaGRfbGludXhfc2VsZWN0X3F1ZXVlX2RlcHRoKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsCisJCQkJCQlTY3NpX0RldmljZSAqc2NzaV9kZXZzKTsKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorc3RhdGljIGludAkgICBhaGRfbGludXhfYmlvc3BhcmFtKERpc2sgKiwga2Rldl90LCBpbnRbXSk7CisjZW5kaWYKKyNlbmRpZgorc3RhdGljIGludAkgICBhaGRfbGludXhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQJICAgYWhkX2xpbnV4X2Rldl9yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50CSAgIGFoZF9saW51eF9hYm9ydChTY3NpX0NtbmQgKik7CisKKy8qCisgKiBDYWxjdWxhdGUgYSBzYWZlIHZhbHVlIGZvciBBSERfTlNFRyAoYXMgZXhwcmVzc2VkIHRocm91Z2ggYWhkX2xpbnV4X25zZWcpLgorICoKKyAqIEluIHByZS0yLjUuWC4uLgorICogVGhlIG1pZGxheWVyIGFsbG9jYXRlcyBhbiBTL0cgYXJyYXkgZHluYW1pY2FsbHkgd2hlbiBhIGNvbW1hbmQgaXMgaXNzdWVkCisgKiB1c2luZyBTQ1NJIG1hbGxvYy4gIFRoaXMgYXJyYXksIHdoaWNoIGlzIGluIGFuIE9TIGRlcGVuZGVudCBmb3JtYXQgdGhhdAorICogbXVzdCBsYXRlciBiZSBjb3BpZWQgdG8gb3VyIHByaXZhdGUgUy9HIGxpc3QsIGlzIHNpemVkIHRvIGhvdXNlIGp1c3QgdGhlCisgKiBudW1iZXIgb2Ygc2VnbWVudHMgbmVlZGVkIGZvciB0aGUgY3VycmVudCB0cmFuc2Zlci4gIFNpbmNlIHRoZSBjb2RlIHRoYXQKKyAqIHNpemVzIHRoZSBTQ1NJIG1hbGxvYyBwb29sIGRvZXMgbm90IHRha2UgaW50byBjb25zaWRlcmF0aW9uIGZyYWdtZW50YXRpb24KKyAqIG9mIHRoZSBwb29sLCBleGVjdXRpbmcgdHJhbnNhY3Rpb25zIG51bWJlcmluZyBqdXN0IGEgZnJhY3Rpb24gb2Ygb3VyCisgKiBjb25jdXJyZW50IHRyYW5zYWN0aW9uIGxpbWl0IHdpdGggU0cgbGlzdCBsZW5ndGhzIGFwcm9hY2hpbmcgQUhDX05TRUcgd2lsbAorICogcXVpY2tseSBkZXBsZWF0IHRoZSBTQ1NJIG1hbGxvYyBwb29sIG9mIHVzYWJsZSBzcGFjZS4gIFVuZm9ydHVuYXRlbHksIHRoZQorICogbWlkLWxheWVyIGRvZXMgbm90IHByb3Blcmx5IGhhbmRsZSB0aGlzIHNjc2kgbWFsbG9jIGZhaWx1cmVzIGZvciB0aGUgUy9HCisgKiBhcnJheSBhbmQgdGhlIHJlc3VsdCBjYW4gYmUgYSBsb2NrdXAgb2YgdGhlIEkvTyBzdWJzeXN0ZW0uICBXZSB0cnkgdG8gc2l6ZQorICogb3VyIFMvRyBsaXN0IHNvIHRoYXQgaXQgc2F0aXNmaWVzIG91ciBkcml2ZXJzIGFsbG9jYXRpb24gcmVxdWlyZW1lbnRzIGluCisgKiBhZGRpdGlvbiB0byBhdm9pZGluZyBmcmFnbWVudGF0aW9uIG9mIHRoZSBTQ1NJIG1hbGxvYyBwb29sLgorICovCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X3NpemVfbnNlZyh2b2lkKQoreworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXVfaW50IGN1cl9zaXplOworCXVfaW50IGJlc3Rfc2l6ZTsKKworCS8qCisJICogVGhlIFNDU0kgYWxsb2NhdG9yIHJvdW5kcyB0byB0aGUgbmVhcmVzdCA1MTIgYnl0ZXMKKwkgKiBhbiBjYW5ub3QgYWxsb2NhdGUgYWNyb3NzIGEgcGFnZSBib3VuZGFyeS4gIE91ciBhbGdvcml0aG0KKwkgKiBpcyB0byBzdGFydCBhdCAxSyBvZiBzY3NpIG1hbGxvYyBzcGFjZSBwZXItY29tbWFuZCBhbmQKKwkgKiBsb29wIHRocm91Z2ggYWxsIGZhY3RvcnMgb2YgdGhlIFBBR0VfU0laRSBhbmQgcGljayB0aGUgYmVzdC4KKwkgKi8KKwliZXN0X3NpemUgPSAwOworCWZvciAoY3VyX3NpemUgPSAxMDI0OyBjdXJfc2l6ZSA8PSBQQUdFX1NJWkU7IGN1cl9zaXplICo9IDIpIHsKKwkJdV9pbnQgbnNlZzsKKworCQluc2VnID0gY3VyX3NpemUgLyBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KTsKKwkJaWYgKG5zZWcgPCBBSERfTElOVVhfTUlOX05TRUcpCisJCQljb250aW51ZTsKKworCQlpZiAoYmVzdF9zaXplID09IDApIHsKKwkJCWJlc3Rfc2l6ZSA9IGN1cl9zaXplOworCQkJYWhkX2xpbnV4X25zZWcgPSBuc2VnOworCQl9IGVsc2UgeworCQkJdV9pbnQgYmVzdF9yZW07CisJCQl1X2ludCBjdXJfcmVtOworCisJCQkvKgorCQkJICogQ29tcGFyZSB0aGUgdHJhaXRzIG9mIHRoZSBjdXJyZW50ICJiZXN0X3NpemUiCisJCQkgKiB3aXRoIHRoZSBjdXJyZW50IHNpemUgdG8gZGV0ZXJtaW5lIGlmIHRoZQorCQkJICogY3VycmVudCBzaXplIGlzIGEgYmV0dGVyIHNpemUuCisJCQkgKi8KKwkJCWJlc3RfcmVtID0gYmVzdF9zaXplICUgc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCk7CisJCQljdXJfcmVtID0gY3VyX3NpemUgJSBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KTsKKwkJCWlmIChjdXJfcmVtIDwgYmVzdF9yZW0pIHsKKwkJCQliZXN0X3NpemUgPSBjdXJfc2l6ZTsKKwkJCQlhaGRfbGludXhfbnNlZyA9IG5zZWc7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKK30KKworLyoKKyAqIFRyeSB0byBkZXRlY3QgYW4gQWRhcHRlYyA3OVhYIGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyBpbnQKK2FoZF9saW51eF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICp0ZW1wbGF0ZSkKK3sKKwlzdHJ1Y3QJYWhkX3NvZnRjICphaGQ7CisJaW50ICAgICBmb3VuZDsKKwlpbnQJZXJyb3IgPSAwOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJLyoKKwkgKiBJdCBpcyBhIGJ1ZyB0aGF0IHRoZSB1cHBlciBsYXllciB0YWtlcworCSAqIHRoaXMgbG9jayBqdXN0IHByaW9yIHRvIGNhbGxpbmcgdXMuCisJICovCisJc3Bpbl91bmxvY2tfaXJxKCZpb19yZXF1ZXN0X2xvY2spOworI2VuZGlmCisKKwkvKgorCSAqIFNhbml0eSBjaGVja2luZyBvZiBMaW51eCBTQ1NJIGRhdGEgc3RydWN0dXJlcyBzbworCSAqIHRoYXQgc29tZSBvZiBvdXIgaGFja3NeSF5IXkheSF5IYXNzdW1wdGlvbnMgYXJlbid0CisJICogdmlvbGF0ZWQuCisJICovCisJaWYgKG9mZnNldG9mKHN0cnVjdCBhaGRfY21kX2ludGVybmFsLCBlbmQpCisJICA+IG9mZnNldG9mKHN0cnVjdCBzY3NpX2NtbmQsIGhvc3Rfc2NyaWJibGUpKSB7CisJCXByaW50ZigiYWhkX2xpbnV4X2RldGVjdDogU0NTSSBkYXRhIHN0cnVjdHVyZXMgY2hhbmdlZC5cbiIpOworCQlwcmludGYoImFoZF9saW51eF9kZXRlY3Q6IFVuYWJsZSB0byBhdHRhY2hcbiIpOworCQlyZXR1cm4gKDApOworCX0KKwkvKgorCSAqIERldGVybWluZSBhbiBhcHByb3ByaWF0ZSBzaXplIGZvciBvdXIgU2NhdHRlciBHYXR0aGVyIGxpc3RzLgorCSAqLworCWFoZF9saW51eF9zaXplX25zZWcoKTsKKyNpZmRlZiBNT0RVTEUKKwkvKgorCSAqIElmIHdlJ3ZlIGJlZW4gcGFzc2VkIGFueSBwYXJhbWV0ZXJzLCBwcm9jZXNzIHRoZW0gbm93LgorCSAqLworCWlmIChhaWM3OXh4KQorCQlhaWM3OXh4X3NldHVwKGFpYzc5eHgpOworI2VuZGlmCisKKwl0ZW1wbGF0ZS0+cHJvY19uYW1lID0gImFpYzc5eHgiOworCisJLyoKKwkgKiBJbml0aWFsaXplIG91ciBzb2Z0YyBsaXN0IGxvY2sgcHJpb3IgdG8KKwkgKiBwcm9iaW5nIGZvciBhbnkgYWRhcHRlcnMuCisJICovCisJYWhkX2xpc3RfbG9ja2luaXQoKTsKKworI2lmZGVmIENPTkZJR19QQ0kKKwllcnJvciA9IGFoZF9saW51eF9wY2lfaW5pdCgpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworI2VuZGlmCisKKwkvKgorCSAqIFJlZ2lzdGVyIHdpdGggdGhlIFNDU0kgbGF5ZXIgYWxsCisJICogY29udHJvbGxlcnMgd2UndmUgZm91bmQuCisJICovCisJZm91bmQgPSAwOworCVRBSUxRX0ZPUkVBQ0goYWhkLCAmYWhkX3RhaWxxLCBsaW5rcykgeworCisJCWlmIChhaGRfbGludXhfcmVnaXN0ZXJfaG9zdChhaGQsIHRlbXBsYXRlKSA9PSAwKQorCQkJZm91bmQrKzsKKwl9CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJc3Bpbl9sb2NrX2lycSgmaW9fcmVxdWVzdF9sb2NrKTsKKyNlbmRpZgorCWFpYzc5eHhfZGV0ZWN0X2NvbXBsZXRlKys7CisJcmV0dXJuIDA7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKy8qCisgKiBGcmVlIHRoZSBwYXNzZWQgaW4gU2NzaV9Ib3N0IG1lbW9yeSBzdHJ1Y3R1cmVzIHByaW9yIHRvIHVubG9hZGluZyB0aGUKKyAqIG1vZHVsZS4KKyAqLworc3RhdGljIGludAorYWhkX2xpbnV4X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqIGhvc3QpCit7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkOworCXVfbG9uZyBsOworCisJYWhkX2xpc3RfbG9jaygmbCk7CisJaWYgKGhvc3QgIT0gTlVMTCkgeworCisJCS8qCisJCSAqIFdlIHNob3VsZCBiZSBhYmxlIHRvIGp1c3QgcGVyZm9ybQorCQkgKiB0aGUgZnJlZSBkaXJlY3RseSwgYnV0IGNoZWNrIG91cgorCQkgKiBsaXN0IGZvciBleHRyYSBzYW5pdHkuCisJCSAqLworCQlhaGQgPSBhaGRfZmluZF9zb2Z0YygqKHN0cnVjdCBhaGRfc29mdGMgKiopaG9zdC0+aG9zdGRhdGEpOworCQlpZiAoYWhkICE9IE5VTEwpIHsKKwkJCXVfbG9uZyBzOworCisJCQlhaGRfbG9jayhhaGQsICZzKTsKKwkJCWFoZF9pbnRyX2VuYWJsZShhaGQsIEZBTFNFKTsKKwkJCWFoZF91bmxvY2soYWhkLCAmcyk7CisJCQlhaGRfZnJlZShhaGQpOworCQl9CisJfQorCWFoZF9saXN0X3VubG9jaygmbCk7CisJcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCisvKgorICogUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGRyaXZlci4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorYWhkX2xpbnV4X2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdGF0aWMgY2hhciBidWZmZXJbNTEyXTsKKwljaGFyCWFoZF9pbmZvWzI1Nl07CisJY2hhciAgICpicDsKKwlzdHJ1Y3QgYWhkX3NvZnRjICphaGQ7CisKKwlicCA9ICZidWZmZXJbMF07CisJYWhkID0gKihzdHJ1Y3QgYWhkX3NvZnRjICoqKWhvc3QtPmhvc3RkYXRhOworCW1lbXNldChicCwgMCwgc2l6ZW9mKGJ1ZmZlcikpOworCXN0cmNweShicCwgIkFkYXB0ZWMgQUlDNzlYWCBQQ0ktWCBTQ1NJIEhCQSBEUklWRVIsIFJldiAiKTsKKwlzdHJjYXQoYnAsIEFJQzc5WFhfRFJJVkVSX1ZFUlNJT04pOworCXN0cmNhdChicCwgIlxuIik7CisJc3RyY2F0KGJwLCAiICAgICAgICA8Iik7CisJc3RyY2F0KGJwLCBhaGQtPmRlc2NyaXB0aW9uKTsKKwlzdHJjYXQoYnAsICI+XG4iKTsKKwlzdHJjYXQoYnAsICIgICAgICAgICIpOworCWFoZF9jb250cm9sbGVyX2luZm8oYWhkLCBhaGRfaW5mbyk7CisJc3RyY2F0KGJwLCBhaGRfaW5mbyk7CisJc3RyY2F0KGJwLCAiXG4iKTsKKworCXJldHVybiAoYnApOworfQorCisvKgorICogUXVldWUgYW4gU0NCIHRvIHRoZSBjb250cm9sbGVyLgorICovCitzdGF0aWMgaW50CithaGRfbGludXhfcXVldWUoU2NzaV9DbW5kICogY21kLCB2b2lkICgqc2NzaV9kb25lKSAoU2NzaV9DbW5kICopKQoreworCXN0cnVjdAkgYWhkX3NvZnRjICphaGQ7CisJc3RydWN0CSBhaGRfbGludXhfZGV2aWNlICpkZXY7CisJdV9sb25nCSBmbGFnczsKKworCWFoZCA9ICooc3RydWN0IGFoZF9zb2Z0YyAqKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwkvKgorCSAqIFNhdmUgdGhlIGNhbGxiYWNrIG9uIGNvbXBsZXRpb24gZnVuY3Rpb24uCisJICovCisJY21kLT5zY3NpX2RvbmUgPSBzY3NpX2RvbmU7CisKKwlhaGRfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKGFoZCwgJmZsYWdzKTsKKworCS8qCisJICogQ2xvc2UgdGhlIHJhY2Ugb2YgYSBjb21tYW5kIHRoYXQgd2FzIGluIHRoZSBwcm9jZXNzIG9mCisJICogYmVpbmcgcXVldWVkIHRvIHVzIGp1c3QgYXMgb3VyIHNpbXEgd2FzIGZyb3plbi4gIExldAorCSAqIERWIGNvbW1hbmRzIHRocm91Z2ggc28gbG9uZyBhcyB3ZSBhcmUgb25seSBmcm96ZW4gdG8KKwkgKiBwZXJmb3JtIERWLgorCSAqLworCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPnFmcm96ZW4gIT0gMAorCSAmJiBBSERfRFZfQ01EKGNtZCkgPT0gMCkgeworCisJCWFoZF9jbWRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQsIENBTV9SRVFVRVVFX1JFUSk7CisJCWFoZF9saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoYWhkLCBjbWQpOworCQlhaGRfc2NoZWR1bGVfY29tcGxldGVxKGFoZCk7CisJCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGQsICZmbGFncyk7CisJCXJldHVybiAoMCk7CisJfQorCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgY21kLT5kZXZpY2UtPmNoYW5uZWwsCisJCQkJICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLAorCQkJCSAgIC8qYWxsb2MqL1RSVUUpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlhaGRfY21kX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kLCBDQU1fUkVTUkNfVU5BVkFJTCk7CisJCWFoZF9saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoYWhkLCBjbWQpOworCQlhaGRfc2NoZWR1bGVfY29tcGxldGVxKGFoZCk7CisJCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGQsICZmbGFncyk7CisJCXByaW50ZigiJXM6IGFpYzc5eHhfbGludXhfcXVldWUgLSBVbmFibGUgdG8gYWxsb2NhdGUgZGV2aWNlIVxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCkpOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAoY21kLT5jbWRfbGVuID4gTUFYX0NEQl9MRU4pCisJCXJldHVybiAoLUVJTlZBTCk7CisJY21kLT5yZXN1bHQgPSBDQU1fUkVRX0lOUFJPRyA8PCAxNjsKKwlUQUlMUV9JTlNFUlRfVEFJTCgmZGV2LT5idXN5cSwgKHN0cnVjdCBhaGRfY21kICopY21kLCBhY21kX2xpbmtzLnRxZSk7CisJaWYgKChkZXYtPmZsYWdzICYgQUhEX0RFVl9PTl9SVU5fTElTVCkgPT0gMCkgeworCQlUQUlMUV9JTlNFUlRfVEFJTCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kZXZpY2VfcnVucSwgZGV2LCBsaW5rcyk7CisJCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9PTl9SVU5fTElTVDsKKwkJYWhkX2xpbnV4X3J1bl9kZXZpY2VfcXVldWVzKGFoZCk7CisJfQorCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGQsICZmbGFncyk7CisJcmV0dXJuICgwKTsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKK3N0YXRpYyBpbnQKK2FoZF9saW51eF9zbGF2ZV9hbGxvYyhTY3NpX0RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKKworCWFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSk7CisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoIiVzOiBTbGF2ZSBBbGxvYyAlZFxuIiwgYWhkX25hbWUoYWhkKSwgZGV2aWNlLT5pZCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhkX2xpbnV4X3NsYXZlX2NvbmZpZ3VyZShTY3NpX0RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKKwlzdHJ1Y3QJYWhkX2xpbnV4X2RldmljZSAqZGV2OworCXVfbG9uZwlmbGFnczsKKworCWFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSk7CisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoIiVzOiBTbGF2ZSBDb25maWd1cmUgJWRcbiIsIGFoZF9uYW1lKGFoZCksIGRldmljZS0+aWQpOworCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X2xvY2soYWhkLCAmZmxhZ3MpOworCS8qCisJICogU2luY2UgTGludXggaGFzIGF0dGFjaGVkIHRvIHRoZSBkZXZpY2UsIGNvbmZpZ3VyZQorCSAqIGl0IHNvIHdlIGRvbid0IGZyZWUgYW5kIGFsbG9jYXRlIHRoZSBkZXZpY2UKKwkgKiBzdHJ1Y3R1cmUgb24gZXZlcnkgY29tbWFuZC4KKwkgKi8KKwlkZXYgPSBhaGRfbGludXhfZ2V0X2RldmljZShhaGQsIGRldmljZS0+Y2hhbm5lbCwKKwkJCQkgICBkZXZpY2UtPmlkLCBkZXZpY2UtPmx1biwKKwkJCQkgICAvKmFsbG9jKi9UUlVFKTsKKwlpZiAoZGV2ICE9IE5VTEwpIHsKKwkJZGV2LT5mbGFncyAmPSB+QUhEX0RFVl9VTkNPTkZJR1VSRUQ7CisJCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9TTEFWRV9DT05GSUdVUkVEOworCQlkZXYtPnNjc2lfZGV2aWNlID0gZGV2aWNlOworCQlhaGRfbGludXhfZGV2aWNlX3F1ZXVlX2RlcHRoKGFoZCwgZGV2KTsKKwl9CisJYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X3NsYXZlX2Rlc3Ryb3koU2NzaV9EZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QJYWhkX3NvZnRjICphaGQ7CisJc3RydWN0CWFoZF9saW51eF9kZXZpY2UgKmRldjsKKwl1X2xvbmcJZmxhZ3M7CisKKwlhaGQgPSAqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKWRldmljZS0+aG9zdC0+aG9zdGRhdGEpOworCWlmIChib290dmVyYm9zZSkKKwkJcHJpbnRmKCIlczogU2xhdmUgRGVzdHJveSAlZFxuIiwgYWhkX25hbWUoYWhkKSwgZGV2aWNlLT5pZCk7CisJYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfbG9jayhhaGQsICZmbGFncyk7CisJZGV2ID0gYWhkX2xpbnV4X2dldF9kZXZpY2UoYWhkLCBkZXZpY2UtPmNoYW5uZWwsCisJCQkJICAgZGV2aWNlLT5pZCwgZGV2aWNlLT5sdW4sCisJCQkJCSAgIC8qYWxsb2MqL0ZBTFNFKTsKKworCS8qCisJICogRmlsdGVyIG91dCAic2lsbHkiIGRlbGV0aW9ucyBvZiByZWFsIGRldmljZXMgYnkgb25seQorCSAqIGRlbGV0aW5nIGRldmljZXMgdGhhdCBoYXZlIGhhZCBzbGF2ZV9jb25maWd1cmUoKQorCSAqIGNhbGxlZCBvbiB0aGVtLiAgQWxsIG90aGVyIGRldmljZXMgdGhhdCBoYXZlIG5vdAorCSAqIGJlZW4gY29uZmlndXJlZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGVsZXRlZCBieQorCSAqIHRoZSByZWZjb3VudGluZyBwcm9jZXNzLgorCSAqLworCWlmIChkZXYgIT0gTlVMTAorCSAmJiAoZGV2LT5mbGFncyAmIEFIRF9ERVZfU0xBVkVfQ09ORklHVVJFRCkgIT0gMCkgeworCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfVU5DT05GSUdVUkVEOworCQlpZiAoVEFJTFFfRU1QVFkoJmRldi0+YnVzeXEpCisJCSAmJiBkZXYtPmFjdGl2ZSA9PSAwCisJCSAmJiAoZGV2LT5mbGFncyAmIEFIRF9ERVZfVElNRVJfQUNUSVZFKSA9PSAwKQorCQkJYWhkX2xpbnV4X2ZyZWVfZGV2aWNlKGFoZCwgZGV2KTsKKwl9CisJYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKK30KKyNlbHNlCisvKgorICogU2V0cyB0aGUgcXVldWUgZGVwdGggZm9yIGVhY2ggU0NTSSBkZXZpY2UgaGFuZ2luZworICogb2ZmIHRoZSBpbnB1dCBob3N0IGFkYXB0ZXIuCisgKi8KK3N0YXRpYyB2b2lkCithaGRfbGludXhfc2VsZWN0X3F1ZXVlX2RlcHRoKHN0cnVjdCBTY3NpX0hvc3QgKiBob3N0LAorCQkJICAgICBTY3NpX0RldmljZSAqIHNjc2lfZGV2cykKK3sKKwlTY3NpX0RldmljZSAqZGV2aWNlOworCVNjc2lfRGV2aWNlICpsZGV2OworCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKKwl1X2xvbmcJZmxhZ3M7CisKKwlhaGQgPSAqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKWhvc3QtPmhvc3RkYXRhKTsKKwlhaGRfbG9jayhhaGQsICZmbGFncyk7CisJZm9yIChkZXZpY2UgPSBzY3NpX2RldnM7IGRldmljZSAhPSBOVUxMOyBkZXZpY2UgPSBkZXZpY2UtPm5leHQpIHsKKworCQkvKgorCQkgKiBXYXRjaCBvdXQgZm9yIGR1cGxpY2F0ZSBkZXZpY2VzLiAgVGhpcyB3b3JrcyBhcm91bmQKKwkJICogc29tZSBxdWlya3MgaW4gaG93IHRoZSBTQ1NJIHNjYW5uaW5nIGNvZGUgZG9lcyBpdHMKKwkJICogZGV2aWNlIG1hbmFnZW1lbnQuCisJCSAqLworCQlmb3IgKGxkZXYgPSBzY3NpX2RldnM7IGxkZXYgIT0gZGV2aWNlOyBsZGV2ID0gbGRldi0+bmV4dCkgeworCQkJaWYgKGxkZXYtPmhvc3QgPT0gZGV2aWNlLT5ob3N0CisJCQkgJiYgbGRldi0+Y2hhbm5lbCA9PSBkZXZpY2UtPmNoYW5uZWwKKwkJCSAmJiBsZGV2LT5pZCA9PSBkZXZpY2UtPmlkCisJCQkgJiYgbGRldi0+bHVuID09IGRldmljZS0+bHVuKQorCQkJCWJyZWFrOworCQl9CisJCS8qIFNraXAgZHVwbGljYXRlLiAqLworCQlpZiAobGRldiAhPSBkZXZpY2UpCisJCQljb250aW51ZTsKKworCQlpZiAoZGV2aWNlLT5ob3N0ID09IGhvc3QpIHsKKwkJCXN0cnVjdAkgYWhkX2xpbnV4X2RldmljZSAqZGV2OworCisJCQkvKgorCQkJICogU2luY2UgTGludXggaGFzIGF0dGFjaGVkIHRvIHRoZSBkZXZpY2UsIGNvbmZpZ3VyZQorCQkJICogaXQgc28gd2UgZG9uJ3QgZnJlZSBhbmQgYWxsb2NhdGUgdGhlIGRldmljZQorCQkJICogc3RydWN0dXJlIG9uIGV2ZXJ5IGNvbW1hbmQuCisJCQkgKi8KKwkJCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgZGV2aWNlLT5jaGFubmVsLAorCQkJCQkJICAgZGV2aWNlLT5pZCwgZGV2aWNlLT5sdW4sCisJCQkJCQkgICAvKmFsbG9jKi9UUlVFKTsKKwkJCWlmIChkZXYgIT0gTlVMTCkgeworCQkJCWRldi0+ZmxhZ3MgJj0gfkFIRF9ERVZfVU5DT05GSUdVUkVEOworCQkJCWRldi0+c2NzaV9kZXZpY2UgPSBkZXZpY2U7CisJCQkJYWhkX2xpbnV4X2RldmljZV9xdWV1ZV9kZXB0aChhaGQsIGRldik7CisJCQkJZGV2aWNlLT5xdWV1ZV9kZXB0aCA9IGRldi0+b3BlbmluZ3MKKwkJCQkJCSAgICArIGRldi0+YWN0aXZlOworCQkJCWlmICgoZGV2LT5mbGFncyAmIChBSERfREVWX1FfQkFTSUMKKwkJCQkJCXwgQUhEX0RFVl9RX1RBR0dFRCkpID09IDApIHsKKwkJCQkJLyoKKwkJCQkJICogV2UgYWxsb3cgdGhlIE9TIHRvIHF1ZXVlIDIgdW50YWdnZWQKKwkJCQkJICogdHJhbnNhY3Rpb25zIHRvIHVzIGF0IGFueSB0aW1lIGV2ZW4KKwkJCQkJICogdGhvdWdoIHdlIGNhbiBvbmx5IGV4ZWN1dGUgdGhlbQorCQkJCQkgKiBzZXJpYWxseSBvbiB0aGUgY29udHJvbGxlci9kZXZpY2UuCisJCQkJCSAqIFRoaXMgc2hvdWxkIHJlbW92ZSBzb21lIGxhdGVuY3kuCisJCQkJCSAqLworCQkJCQlkZXZpY2UtPnF1ZXVlX2RlcHRoID0gMjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJYWhkX3VubG9jayhhaGQsICZmbGFncyk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19pMzg2X18pCisvKgorICogUmV0dXJuIHRoZSBkaXNrIGdlb21ldHJ5IGZvciB0aGUgZ2l2ZW4gU0NTSSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCithaGRfbGludXhfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJICAgIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgZ2VvbVtdKQoreworCXVpbnQ4X3QgKmJoOworI2Vsc2UKK2FoZF9saW51eF9iaW9zcGFyYW0oRGlzayAqZGlzaywga2Rldl90IGRldiwgaW50IGdlb21bXSkKK3sKKwlzdHJ1Y3QJc2NzaV9kZXZpY2UgKnNkZXYgPSBkaXNrLT5kZXZpY2U7CisJdV9sb25nCWNhcGFjaXR5ID0gZGlzay0+Y2FwYWNpdHk7CisJc3RydWN0CWJ1ZmZlcl9oZWFkICpiaDsKKyNlbmRpZgorCWludAkgaGVhZHM7CisJaW50CSBzZWN0b3JzOworCWludAkgY3lsaW5kZXJzOworCWludAkgcmV0OworCWludAkgZXh0ZW5kZWQ7CisJc3RydWN0CSBhaGRfc29mdGMgKmFoZDsKKworCWFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopc2Rldi0+aG9zdC0+aG9zdGRhdGEpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCWJoID0gc2NzaV9iaW9zX3B0YWJsZShiZGV2KTsKKyNlbGlmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMTcpCisJYmggPSBicmVhZChNS0RFVihNQUpPUihkZXYpLCBNSU5PUihkZXYpICYgfjB4ZiksIDAsIGJsb2NrX3NpemUoZGV2KSk7CisjZWxzZQorCWJoID0gYnJlYWQoTUtERVYoTUFKT1IoZGV2KSwgTUlOT1IoZGV2KSAmIH4weGYpLCAwLCAxMDI0KTsKKyNlbmRpZgorCisJaWYgKGJoKSB7CisJCXJldCA9IHNjc2lfcGFydHNpemUoYmgsIGNhcGFjaXR5LAorCQkJCSAgICAmZ2VvbVsyXSwgJmdlb21bMF0sICZnZW9tWzFdKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJCWtmcmVlKGJoKTsKKyNlbHNlCisJCWJyZWxzZShiaCk7CisjZW5kaWYKKwkJaWYgKHJldCAhPSAtMSkKKwkJCXJldHVybiAocmV0KTsKKwl9CisJaGVhZHMgPSA2NDsKKwlzZWN0b3JzID0gMzI7CisJY3lsaW5kZXJzID0gYWljX3NlY3Rvcl9kaXYoY2FwYWNpdHksIGhlYWRzLCBzZWN0b3JzKTsKKworCWlmIChhaWM3OXh4X2V4dGVuZGVkICE9IDApCisJCWV4dGVuZGVkID0gMTsKKwllbHNlCisJCWV4dGVuZGVkID0gKGFoZC0+ZmxhZ3MgJiBBSERfRVhURU5ERURfVFJBTlNfQSkgIT0gMDsKKwlpZiAoZXh0ZW5kZWQgJiYgY3lsaW5kZXJzID49IDEwMjQpIHsKKwkJaGVhZHMgPSAyNTU7CisJCXNlY3RvcnMgPSA2MzsKKwkJY3lsaW5kZXJzID0gYWljX3NlY3Rvcl9kaXYoY2FwYWNpdHksIGhlYWRzLCBzZWN0b3JzKTsKKwl9CisJZ2VvbVswXSA9IGhlYWRzOworCWdlb21bMV0gPSBzZWN0b3JzOworCWdlb21bMl0gPSBjeWxpbmRlcnM7CisJcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCisvKgorICogQWJvcnQgdGhlIGN1cnJlbnQgU0NTSSBjb21tYW5kKHMpLgorICovCitzdGF0aWMgaW50CithaGRfbGludXhfYWJvcnQoU2NzaV9DbW5kICpjbWQpCit7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkOworCXN0cnVjdCBhaGRfY21kICphY21kOworCXN0cnVjdCBhaGRfY21kICpsaXN0X2FjbWQ7CisJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc2NiICpwZW5kaW5nX3NjYjsKKwl1X2xvbmcgczsKKwl1X2ludCAgc2F2ZWRfc2NicHRyOworCXVfaW50ICBhY3RpdmVfc2NicHRyOworCXVfaW50ICBsYXN0X3BoYXNlOworCXVfaW50ICBjZGJfYnl0ZTsKKwlpbnQgICAgcmV0dmFsOworCWludCAgICB3YXNfcGF1c2VkOworCWludCAgICBwYXVzZWQ7CisJaW50ICAgIHdhaXQ7CisJaW50ICAgIGRpc2Nvbm5lY3RlZDsKKwlhaGRfbW9kZV9zdGF0ZSBzYXZlZF9tb2RlczsKKworCXBlbmRpbmdfc2NiID0gTlVMTDsKKwlwYXVzZWQgPSBGQUxTRTsKKwl3YWl0ID0gRkFMU0U7CisJYWhkID0gKihzdHJ1Y3QgYWhkX3NvZnRjICoqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlhY21kID0gKHN0cnVjdCBhaGRfY21kICopY21kOworCisJcHJpbnRmKCIlczolZDolZDolZDogQXR0ZW1wdGluZyB0byBhYm9ydCBjbWQgJXA6IiwKKwkgICAgICAgYWhkX25hbWUoYWhkKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkgICAgICAgY21kLT5kZXZpY2UtPmx1biwgY21kKTsKKwlmb3IgKGNkYl9ieXRlID0gMDsgY2RiX2J5dGUgPCBjbWQtPmNtZF9sZW47IGNkYl9ieXRlKyspCisJCXByaW50ZigiIDB4JXgiLCBjbWQtPmNtbmRbY2RiX2J5dGVdKTsKKwlwcmludGYoIlxuIik7CisKKwkvKgorCSAqIEluIGFsbCB2ZXJzaW9ucyBvZiBMaW51eCwgd2UgaGF2ZSB0byB3b3JrIGFyb3VuZAorCSAqIGEgbWFqb3IgZmxhdyBpbiBob3cgdGhlIG1pZC1sYXllciBpcyBsb2NrZWQgZG93bgorCSAqIGlmIHdlIGFyZSB0byBzbGVlcCBzdWNjZXNzZnVsbHkgaW4gb3VyIGVycm9yIGhhbmRsZXIKKwkgKiB3aGlsZSBhbGxvd2luZyBvdXIgaW50ZXJydXB0IGhhbmRsZXIgdG8gcnVuLiAgU2luY2UKKwkgKiB0aGUgbWlkbGF5ZXIgYWNxdWlyZXMgZWl0aGVyIHRoZSBpb19yZXF1ZXN0X2xvY2sgb3IKKwkgKiBvdXIgbG9jayBwcmlvciB0byBjYWxsaW5nIHVzLCB3ZSBtdXN0IHVzZSB0aGUKKwkgKiBzcGluX3VubG9ja19pcnEoKSBtZXRob2QgZm9yIHVubG9ja2luZyBvdXIgbG9jay4KKwkgKiBUaGlzIHdpbGwgZm9yY2UgaW50ZXJydXB0cyB0byBiZSBlbmFibGVkIG9uIHRoZQorCSAqIGN1cnJlbnQgQ1BVLiAgU2luY2UgdGhlIEVIIHRocmVhZCBzaG91bGQgbm90IGhhdmUKKwkgKiBiZWVuIHJ1bm5pbmcgd2l0aCBDUFUgaW50ZXJydXB0cyBkaXNhYmxlZCBvdGhlciB0aGFuCisJICogYnkgYWNxdWlyaW5nIGVpdGhlciB0aGUgaW9fcmVxdWVzdF9sb2NrIG9yIG91ciBvd24KKwkgKiBsb2NrLCB0aGlzICpzaG91bGQqIGJlIHNhZmUuCisJICovCisJYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfbG9jayhhaGQsICZzKTsKKworCS8qCisJICogRmlyc3QgZGV0ZXJtaW5lIGlmIHdlIGN1cnJlbnRseSBvd24gdGhpcyBjb21tYW5kLgorCSAqIFN0YXJ0IGJ5IHNlYXJjaGluZyB0aGUgZGV2aWNlIHF1ZXVlLiAgSWYgbm90IGZvdW5kCisJICogdGhlcmUsIGNoZWNrIHRoZSBwZW5kaW5nX3NjYiBsaXN0LiAgSWYgbm90IGZvdW5kCisJICogYXQgYWxsLCBhbmQgdGhlIHN5c3RlbSB3YW50ZWQgdXMgdG8ganVzdCBhYm9ydCB0aGUKKwkgKiBjb21tYW5kLCByZXR1cm4gc3VjY2Vzcy4KKwkgKi8KKwlkZXYgPSBhaGRfbGludXhfZ2V0X2RldmljZShhaGQsIGNtZC0+ZGV2aWNlLT5jaGFubmVsLAorCQkJCSAgIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwKKwkJCQkgICAvKmFsbG9jKi9GQUxTRSk7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJLyoKKwkJICogTm8gdGFyZ2V0IGRldmljZSBmb3IgdGhpcyBjb21tYW5kIGV4aXN0cywKKwkJICogc28gd2UgbXVzdCBub3Qgc3RpbGwgb3duIHRoZSBjb21tYW5kLgorCQkgKi8KKwkJcHJpbnRmKCIlczolZDolZDolZDogSXMgbm90IGFuIGFjdGl2ZSBkZXZpY2VcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwgY21kLT5kZXZpY2UtPmlkLAorCQkgICAgICAgY21kLT5kZXZpY2UtPmx1bik7CisJCXJldHZhbCA9IFNVQ0NFU1M7CisJCWdvdG8gbm9fY21kOworCX0KKworCVRBSUxRX0ZPUkVBQ0gobGlzdF9hY21kLCAmZGV2LT5idXN5cSwgYWNtZF9saW5rcy50cWUpIHsKKwkJaWYgKGxpc3RfYWNtZCA9PSBhY21kKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGxpc3RfYWNtZCAhPSBOVUxMKSB7CisJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IENvbW1hbmQgZm91bmQgb24gZGV2aWNlIHF1ZXVlXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4pOworCQlUQUlMUV9SRU1PVkUoJmRldi0+YnVzeXEsIGxpc3RfYWNtZCwgYWNtZF9saW5rcy50cWUpOworCQljbWQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKwkJYWhkX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShhaGQsIGNtZCk7CisJCXJldHZhbCA9IFNVQ0NFU1M7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgorCSAqIFNlZSBpZiB3ZSBjYW4gZmluZCBhIG1hdGNoaW5nIGNtZCBpbiB0aGUgcGVuZGluZyBsaXN0LgorCSAqLworCUxJU1RfRk9SRUFDSChwZW5kaW5nX3NjYiwgJmFoZC0+cGVuZGluZ19zY2JzLCBwZW5kaW5nX2xpbmtzKSB7CisJCWlmIChwZW5kaW5nX3NjYi0+aW9fY3R4ID09IGNtZCkKKwkJCWJyZWFrOworCX0KKworCWlmIChwZW5kaW5nX3NjYiA9PSBOVUxMKSB7CisJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IENvbW1hbmQgbm90IGZvdW5kXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4pOworCQlnb3RvIG5vX2NtZDsKKwl9CisKKwlpZiAoKHBlbmRpbmdfc2NiLT5mbGFncyAmIFNDQl9SRUNPVkVSWV9TQ0IpICE9IDApIHsKKwkJLyoKKwkJICogV2UgY2FuJ3QgcXVldWUgdHdvIHJlY292ZXJ5IGFjdGlvbnMgdXNpbmcgdGhlIHNhbWUgU0NCCisJCSAqLworCQlyZXR2YWwgPSBGQUlMRUQ7CisJCWdvdG8gIGRvbmU7CisJfQorCisJLyoKKwkgKiBFbnN1cmUgdGhhdCB0aGUgY2FyZCBkb2Vzbid0IGRvIGFueXRoaW5nCisJICogYmVoaW5kIG91ciBiYWNrLiAgQWxzbyBtYWtlIHN1cmUgdGhhdCB3ZQorCSAqIGRpZG4ndCAianVzdCIgbWlzcyBhbiBpbnRlcnJ1cHQgdGhhdCB3b3VsZAorCSAqIGFmZmVjdCB0aGlzIGNtZC4KKwkgKi8KKwl3YXNfcGF1c2VkID0gYWhkX2lzX3BhdXNlZChhaGQpOworCWFoZF9wYXVzZV9hbmRfZmx1c2h3b3JrKGFoZCk7CisJcGF1c2VkID0gVFJVRTsKKworCWlmICgocGVuZGluZ19zY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkgeworCQlwcmludGYoIiVzOiVkOiVkOiVkOiBDb21tYW5kIGFscmVhZHkgY29tcGxldGVkXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4pOworCQlnb3RvIG5vX2NtZDsKKwl9CisKKwlwcmludGYoIiVzOiBBdCB0aW1lIG9mIHJlY292ZXJ5LCBjYXJkIHdhcyAlc3BhdXNlZFxuIiwKKwkgICAgICAgYWhkX25hbWUoYWhkKSwgd2FzX3BhdXNlZCA/ICIiIDogIm5vdCAiKTsKKwlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisKKwlkaXNjb25uZWN0ZWQgPSBUUlVFOworCWlmIChhaGRfc2VhcmNoX3FpbmZpZm8oYWhkLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5jaGFubmVsICsgJ0EnLAorCQkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4sIFNDQl9HRVRfVEFHKHBlbmRpbmdfc2NiKSwKKwkJCSAgICAgICBST0xFX0lOSVRJQVRPUiwgQ0FNX1JFUV9BQk9SVEVELAorCQkJICAgICAgIFNFQVJDSF9DT01QTEVURSkgPiAwKSB7CisJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IENtZCBhYm9ydGVkIGZyb20gUUlORklGT1xuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCisJCQkJY21kLT5kZXZpY2UtPmx1bik7CisJCXJldHZhbCA9IFNVQ0NFU1M7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCWxhc3RfcGhhc2UgPSBhaGRfaW5iKGFoZCwgTEFTVFBIQVNFKTsKKwlzYXZlZF9zY2JwdHIgPSBhaGRfZ2V0X3NjYnB0cihhaGQpOworCWFjdGl2ZV9zY2JwdHIgPSBzYXZlZF9zY2JwdHI7CisJaWYgKGRpc2Nvbm5lY3RlZCAmJiAoYWhkX2luYihhaGQsIFNFUV9GTEFHUykgJiBOT1RfSURFTlRJRklFRCkgPT0gMCkgeworCQlzdHJ1Y3Qgc2NiICpidXNfc2NiOworCisJCWJ1c19zY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIGFjdGl2ZV9zY2JwdHIpOworCQlpZiAoYnVzX3NjYiA9PSBwZW5kaW5nX3NjYikKKwkJCWRpc2Nvbm5lY3RlZCA9IEZBTFNFOworCX0KKworCS8qCisJICogQXQgdGhpcyBwb2ludCwgcGVuZGluZ19zY2IgaXMgdGhlIHNjYiBhc3NvY2lhdGVkIHdpdGggdGhlCisJICogcGFzc2VkIGluIGNvbW1hbmQuICBUaGF0IGNvbW1hbmQgaXMgY3VycmVudGx5IGFjdGl2ZSBvbiB0aGUKKwkgKiBidXMgb3IgaXMgaW4gdGhlIGRpc2Nvbm5lY3RlZCBzdGF0ZS4KKwkgKi8KKwlpZiAobGFzdF9waGFzZSAhPSBQX0JVU0ZSRUUKKwkgJiYgU0NCX0dFVF9UQUcocGVuZGluZ19zY2IpID09IGFjdGl2ZV9zY2JwdHIpIHsKKworCQkvKgorCQkgKiBXZSdyZSBhY3RpdmUgb24gdGhlIGJ1cywgc28gYXNzZXJ0IEFUTgorCQkgKiBhbmQgaG9wZSB0aGF0IHRoZSB0YXJnZXQgcmVzcG9uZHMuCisJCSAqLworCQlwZW5kaW5nX3NjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgYWN0aXZlX3NjYnB0cik7CisJCXBlbmRpbmdfc2NiLT5mbGFncyB8PSBTQ0JfUkVDT1ZFUllfU0NCfFNDQl9BQk9SVDsKKwkJYWhkX291dGIoYWhkLCBNU0dfT1VULCBIT1NUX01TRyk7CisJCWFoZF9vdXRiKGFoZCwgU0NTSVNJR08sIGxhc3RfcGhhc2V8QVROTyk7CisJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IERldmljZSBpcyBhY3RpdmUsIGFzc2VydGluZyBBVE5cbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwKKwkJICAgICAgIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisJCXdhaXQgPSBUUlVFOworCX0gZWxzZSBpZiAoZGlzY29ubmVjdGVkKSB7CisKKwkJLyoKKwkJICogQWN0dWFsbHkgcmUtcXVldWUgdGhpcyBTQ0IgaW4gYW4gYXR0ZW1wdAorCQkgKiB0byBzZWxlY3QgdGhlIGRldmljZSBiZWZvcmUgaXQgcmVjb25uZWN0cy4KKwkJICovCisJCXBlbmRpbmdfc2NiLT5mbGFncyB8PSBTQ0JfUkVDT1ZFUllfU0NCfFNDQl9BQk9SVDsKKwkJYWhkX3NldF9zY2JwdHIoYWhkLCBTQ0JfR0VUX1RBRyhwZW5kaW5nX3NjYikpOworCQlwZW5kaW5nX3NjYi0+aHNjYi0+Y2RiX2xlbiA9IDA7CisJCXBlbmRpbmdfc2NiLT5oc2NiLT50YXNrX2F0dHJpYnV0ZSA9IDA7CisJCXBlbmRpbmdfc2NiLT5oc2NiLT50YXNrX21hbmFnZW1lbnQgPSBTSVVfVEFTS01HTVRfQUJPUlRfVEFTSzsKKworCQlpZiAoKHBlbmRpbmdfc2NiLT5mbGFncyAmIFNDQl9QQUNLRVRJWkVEKSAhPSAwKSB7CisJCQkvKgorCQkJICogTWFyayB0aGUgU0NCIGhhcyBoYXZpbmcgYW4gb3V0c3RhbmRpbmcKKwkJCSAqIHRhc2sgbWFuYWdlbWVudCBmdW5jdGlvbi4gIFNob3VsZCB0aGUgY29tbWFuZAorCQkJICogY29tcGxldGUgbm9ybWFsbHkgYmVmb3JlIHRoZSB0YXNrIG1hbmFnZW1lbnQKKwkJCSAqIGZ1bmN0aW9uIGNhbiBiZSBzZW50LCB0aGUgaG9zdCB3aWxsIGJlIG5vdGlmaWVkCisJCQkgKiB0byBhYm9ydCBvdXIgcmVxdWV1ZWQgU0NCLgorCQkJICovCisJCQlhaGRfb3V0YihhaGQsIFNDQl9UQVNLX01BTkFHRU1FTlQsCisJCQkJIHBlbmRpbmdfc2NiLT5oc2NiLT50YXNrX21hbmFnZW1lbnQpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIElmIG5vbi1wYWNrZXRpemVkLCBzZXQgdGhlIE1LX01FU1NBR0UgY29udHJvbAorCQkJICogYml0IGluZGljYXRpbmcgdGhhdCB3ZSBkZXNpcmUgdG8gc2VuZCBhIG1lc3NhZ2UuCisJCQkgKiBXZSBhbHNvIHNldCB0aGUgZGlzY29ubmVjdGVkIGZsYWcgc2luY2UgdGhlcmUgaXMKKwkJCSAqIG5vIGd1YXJhbnRlZSB0aGF0IG91ciBTQ0IgY29udHJvbCBieXRlIG1hdGNoZXMKKwkJCSAqIHRoZSB2ZXJzaW9uIG9uIHRoZSBjYXJkLiAgV2UgZG9uJ3Qgd2FudCB0aGUKKwkJCSAqIHNlcXVlbmNlciB0byBhYm9ydCB0aGUgY29tbWFuZCB0aGlua2luZyBhbgorCQkJICogdW5zb2xpY2l0ZWQgcmVzZWxlY3Rpb24gb2NjdXJyZWQuCisJCQkgKi8KKwkJCXBlbmRpbmdfc2NiLT5oc2NiLT5jb250cm9sIHw9IE1LX01FU1NBR0V8RElTQ09OTkVDVEVEOworCisJCQkvKgorCQkJICogVGhlIHNlcXVlbmNlciB3aWxsIG5ldmVyIHJlLXJlZmVyZW5jZSB0aGUKKwkJCSAqIGluLWNvcmUgU0NCLiAgVG8gbWFrZSBzdXJlIHdlIGFyZSBub3RpZmllZAorCQkJICogZHVyaW5nIHJlc2xlY3Rpb24sIHNldCB0aGUgTUtfTUVTU0FHRSBmbGFnIGluCisJCQkgKiB0aGUgY2FyZCdzIGNvcHkgb2YgdGhlIFNDQi4KKwkJCSAqLworCQkJYWhkX291dGIoYWhkLCBTQ0JfQ09OVFJPTCwKKwkJCQkgYWhkX2luYihhaGQsIFNDQl9DT05UUk9MKXxNS19NRVNTQUdFKTsKKwkJfQorCisJCS8qCisJCSAqIENsZWFyIG91dCBhbnkgZW50cmllcyBpbiB0aGUgUUlORklGTyBmaXJzdAorCQkgKiBzbyB3ZSBhcmUgdGhlIG5leHQgU0NCIGZvciB0aGlzIHRhcmdldAorCQkgKiB0byBydW4uCisJCSAqLworCQlhaGRfc2VhcmNoX3FpbmZpZm8oYWhkLCBjbWQtPmRldmljZS0+aWQsCisJCQkJICAgY21kLT5kZXZpY2UtPmNoYW5uZWwgKyAnQScsIGNtZC0+ZGV2aWNlLT5sdW4sCisJCQkJICAgU0NCX0xJU1RfTlVMTCwgUk9MRV9JTklUSUFUT1IsCisJCQkJICAgQ0FNX1JFUVVFVUVfUkVRLCBTRUFSQ0hfQ09NUExFVEUpOworCQlhaGRfcWluZmlmb19yZXF1ZXVlX3RhaWwoYWhkLCBwZW5kaW5nX3NjYik7CisJCWFoZF9zZXRfc2NicHRyKGFoZCwgc2F2ZWRfc2NicHRyKTsKKwkJYWhkX3ByaW50X3BhdGgoYWhkLCBwZW5kaW5nX3NjYik7CisJCXByaW50ZigiRGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCwgcmUtcXVldWluZyBTQ0JcbiIpOworCQl3YWl0ID0gVFJVRTsKKwl9IGVsc2UgeworCQlwcmludGYoIiVzOiVkOiVkOiVkOiBVbmFibGUgdG8gZGVsaXZlciBtZXNzYWdlXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsCisJCSAgICAgICBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCQlyZXR2YWwgPSBGQUlMRUQ7CisJCWdvdG8gZG9uZTsKKwl9CisKK25vX2NtZDoKKwkvKgorCSAqIE91ciBhc3N1bXB0aW9uIGlzIHRoYXQgaWYgd2UgZG9uJ3QgaGF2ZSB0aGUgY29tbWFuZCwgbm8KKwkgKiByZWNvdmVyeSBhY3Rpb24gd2FzIHJlcXVpcmVkLCBzbyB3ZSByZXR1cm4gc3VjY2Vzcy4gIEFnYWluLAorCSAqIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIG1pZC1sYXllciByZWNvdmVyeSBlbmdpbmUgYXJlIG5vdAorCSAqIHdlbGwgZGVmaW5lZCwgc28gdGhpcyBtYXkgY2hhbmdlIGluIHRpbWUuCisJICovCisJcmV0dmFsID0gU1VDQ0VTUzsKK2RvbmU6CisJaWYgKHBhdXNlZCkKKwkJYWhkX3VucGF1c2UoYWhkKTsKKwlpZiAod2FpdCkgeworCQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwkJaW50IHJldDsKKworCQlwZW5kaW5nX3NjYi0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgfD0gQUhEX1NDQl9VUF9FSF9TRU07CisJCXNwaW5fdW5sb2NrX2lycSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2spOworCQlpbml0X3RpbWVyKCZ0aW1lcik7CisJCXRpbWVyLmRhdGEgPSAodV9sb25nKXBlbmRpbmdfc2NiOworCQl0aW1lci5leHBpcmVzID0gamlmZmllcyArICg1ICogSFopOworCQl0aW1lci5mdW5jdGlvbiA9IGFoZF9saW51eF9zZW1fdGltZW91dDsKKwkJYWRkX3RpbWVyKCZ0aW1lcik7CisJCXByaW50ZigiUmVjb3ZlcnkgY29kZSBzbGVlcGluZ1xuIik7CisJCWRvd24oJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZWhfc2VtKTsKKwkJcHJpbnRmKCJSZWNvdmVyeSBjb2RlIGF3YWtlXG4iKTsKKyAgICAgICAgCXJldCA9IGRlbF90aW1lcl9zeW5jKCZ0aW1lcik7CisJCWlmIChyZXQgPT0gMCkgeworCQkJcHJpbnRmKCJUaW1lciBFeHBpcmVkXG4iKTsKKwkJCXJldHZhbCA9IEZBSUxFRDsKKwkJfQorCQlzcGluX2xvY2tfaXJxKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jayk7CisJfQorCWFoZF9zY2hlZHVsZV9ydW5xKGFoZCk7CisJYWhkX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShhaGQpOworCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGQsICZzKTsKKwlyZXR1cm4gKHJldHZhbCk7Cit9CisKKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9kZXZfcmVzZXRfY29tcGxldGUoU2NzaV9DbW5kICpjbWQpCit7CisJZnJlZShjbWQsIE1fREVWQlVGKTsKK30KKworLyoKKyAqIEF0dGVtcHQgdG8gc2VuZCBhIHRhcmdldCByZXNldCBtZXNzYWdlIHRvIHRoZSBkZXZpY2UgdGhhdCB0aW1lZCBvdXQuCisgKi8KK3N0YXRpYyBpbnQKK2FoZF9saW51eF9kZXZfcmVzZXQoU2NzaV9DbW5kICpjbWQpCit7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkOworCXN0cnVjdAlzY3NpX2NtbmQgKnJlY292ZXJ5X2NtZDsKKwlzdHJ1Y3QJYWhkX2xpbnV4X2RldmljZSAqZGV2OworCXN0cnVjdAlhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QJYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXN0cnVjdAlzY2IgKnNjYjsKKwlzdHJ1Y3QJaGFyZHdhcmVfc2NiICpoc2NiOworCXVfbG9uZwlzOworCXN0cnVjdAl0aW1lcl9saXN0IHRpbWVyOworCWludAlyZXR2YWw7CisKKwlhaGQgPSAqKHN0cnVjdCBhaGRfc29mdGMgKiopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXJlY292ZXJ5X2NtZCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNjc2lfY21uZCksIE1fREVWQlVGLCBNX1dBSVRPSyk7CisJaWYgKCFyZWNvdmVyeV9jbWQpCisJCXJldHVybiAoRkFJTEVEKTsKKwltZW1zZXQocmVjb3ZlcnlfY21kLCAwLCBzaXplb2Yoc3RydWN0IHNjc2lfY21uZCkpOworCXJlY292ZXJ5X2NtZC0+ZGV2aWNlID0gY21kLT5kZXZpY2U7CisJcmVjb3ZlcnlfY21kLT5zY3NpX2RvbmUgPSBhaGRfbGludXhfZGV2X3Jlc2V0X2NvbXBsZXRlOworI2lmIEFIRF9ERUJVRworCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApCisJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IERldmljZSByZXNldCBjYWxsZWQgZm9yIGNtZCAlcFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCisJCSAgICAgICBjbWQtPmRldmljZS0+bHVuLCBjbWQpOworI2VuZGlmCisJYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfbG9jayhhaGQsICZzKTsKKworCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJCQkgICBjbWQtPmRldmljZS0+bHVuLCAvKmFsbG9jKi9GQUxTRSk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGQsICZzKTsKKwkJa2ZyZWUocmVjb3ZlcnlfY21kKTsKKwkJcmV0dXJuIChGQUlMRUQpOworCX0KKwlpZiAoKHNjYiA9IGFoZF9nZXRfc2NiKGFoZCwgQUhEX05FVkVSX0NPTF9JRFgpKSA9PSBOVUxMKSB7CisJCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGQsICZzKTsKKwkJa2ZyZWUocmVjb3ZlcnlfY21kKTsKKwkJcmV0dXJuIChGQUlMRUQpOworCX0KKwl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCAnQScsIGFoZC0+b3VyX2lkLAorCQkJCSAgICBjbWQtPmRldmljZS0+aWQsICZ0c3RhdGUpOworCXJlY292ZXJ5X2NtZC0+cmVzdWx0ID0gQ0FNX1JFUV9JTlBST0cgPDwgMTY7CisJcmVjb3ZlcnlfY21kLT5ob3N0X3NjcmliYmxlID0gKGNoYXIgKilzY2I7CisJc2NiLT5pb19jdHggPSByZWNvdmVyeV9jbWQ7CisJc2NiLT5wbGF0Zm9ybV9kYXRhLT5kZXYgPSBkZXY7CisJc2NiLT5zZ19jb3VudCA9IDA7CisJYWhkX3NldF9yZXNpZHVhbChzY2IsIDApOworCWFoZF9zZXRfc2Vuc2VfcmVzaWR1YWwoc2NiLCAwKTsKKwloc2NiID0gc2NiLT5oc2NiOworCWhzY2ItPmNvbnRyb2wgPSAwOworCWhzY2ItPnNjc2lpZCA9IEJVSUxEX1NDU0lJRChhaGQsIGNtZCk7CisJaHNjYi0+bHVuID0gY21kLT5kZXZpY2UtPmx1bjsKKwloc2NiLT5jZGJfbGVuID0gMDsKKwloc2NiLT50YXNrX21hbmFnZW1lbnQgPSBTSVVfVEFTS01HTVRfTFVOX1JFU0VUOworCXNjYi0+ZmxhZ3MgfD0gU0NCX0RFVklDRV9SRVNFVHxTQ0JfUkVDT1ZFUllfU0NCfFNDQl9BQ1RJVkU7CisJaWYgKCh0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0lVX1JFUSkgIT0gMCkgeworCQlzY2ItPmZsYWdzIHw9IFNDQl9QQUNLRVRJWkVEOworCX0gZWxzZSB7CisJCWhzY2ItPmNvbnRyb2wgfD0gTUtfTUVTU0FHRTsKKwl9CisJZGV2LT5vcGVuaW5ncy0tOworCWRldi0+YWN0aXZlKys7CisJZGV2LT5jb21tYW5kc19pc3N1ZWQrKzsKKwlMSVNUX0lOU0VSVF9IRUFEKCZhaGQtPnBlbmRpbmdfc2Nicywgc2NiLCBwZW5kaW5nX2xpbmtzKTsKKwlhaGRfcXVldWVfc2NiKGFoZCwgc2NiKTsKKworCXNjYi0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgfD0gQUhEX1NDQl9VUF9FSF9TRU07CisJc3Bpbl91bmxvY2tfaXJxKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jayk7CisJaW5pdF90aW1lcigmdGltZXIpOworCXRpbWVyLmRhdGEgPSAodV9sb25nKXNjYjsKKwl0aW1lci5leHBpcmVzID0gamlmZmllcyArICg1ICogSFopOworCXRpbWVyLmZ1bmN0aW9uID0gYWhkX2xpbnV4X3NlbV90aW1lb3V0OworCWFkZF90aW1lcigmdGltZXIpOworCXByaW50ZigiUmVjb3ZlcnkgY29kZSBzbGVlcGluZ1xuIik7CisJZG93bigmYWhkLT5wbGF0Zm9ybV9kYXRhLT5laF9zZW0pOworCXByaW50ZigiUmVjb3ZlcnkgY29kZSBhd2FrZVxuIik7CisJcmV0dmFsID0gU1VDQ0VTUzsKKwlpZiAoZGVsX3RpbWVyX3N5bmMoJnRpbWVyKSA9PSAwKSB7CisJCXByaW50ZigiVGltZXIgRXhwaXJlZFxuIik7CisJCXJldHZhbCA9IEZBSUxFRDsKKwl9CisJc3Bpbl9sb2NrX2lycSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2spOworCWFoZF9zY2hlZHVsZV9ydW5xKGFoZCk7CisJYWhkX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShhaGQpOworCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGQsICZzKTsKKwlwcmludGYoIiVzOiBEZXZpY2UgcmVzZXQgcmV0dXJuaW5nIDB4JXhcbiIsIGFoZF9uYW1lKGFoZCksIHJldHZhbCk7CisJcmV0dXJuIChyZXR2YWwpOworfQorCisvKgorICogUmVzZXQgdGhlIFNDU0kgYnVzLgorICovCitzdGF0aWMgaW50CithaGRfbGludXhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqY21kKQoreworCXN0cnVjdCBhaGRfc29mdGMgKmFoZDsKKwl1X2xvbmcgczsKKwlpbnQgICAgZm91bmQ7CisKKwlhaGQgPSAqKHN0cnVjdCBhaGRfc29mdGMgKiopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworI2lmZGVmIEFIRF9ERUJVRworCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApCisJCXByaW50ZigiJXM6IEJ1cyByZXNldCBjYWxsZWQgZm9yIGNtZCAlcFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZCk7CisjZW5kaWYKKwlhaGRfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKGFoZCwgJnMpOworCWZvdW5kID0gYWhkX3Jlc2V0X2NoYW5uZWwoYWhkLCBjbWQtPmRldmljZS0+Y2hhbm5lbCArICdBJywKKwkJCQkgIC8qaW5pdGlhdGUgcmVzZXQqL1RSVUUpOworCWFoZF9saW51eF9ydW5fY29tcGxldGVfcXVldWUoYWhkKTsKKwlhaGRfbWlkbGF5ZXJfZW50cnlwb2ludF91bmxvY2soYWhkLCAmcyk7CisKKwlpZiAoYm9vdHZlcmJvc2UpCisJCXByaW50ZigiJXM6IFNDU0kgYnVzIHJlc2V0IGRlbGl2ZXJlZC4gIgorCQkgICAgICAgIiVkIFNDQnMgYWJvcnRlZC5cbiIsIGFoZF9uYW1lKGFoZCksIGZvdW5kKTsKKworCXJldHVybiAoU1VDQ0VTUyk7Cit9CisKK1Njc2lfSG9zdF9UZW1wbGF0ZSBhaWM3OXh4X2RyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gImFpYzc5eHgiLAorCS5wcm9jX2luZm8JCT0gYWhkX2xpbnV4X3Byb2NfaW5mbywKKwkuaW5mbwkJCT0gYWhkX2xpbnV4X2luZm8sCisJLnF1ZXVlY29tbWFuZAkJPSBhaGRfbGludXhfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBhaGRfbGludXhfYWJvcnQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gYWhkX2xpbnV4X2Rldl9yZXNldCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBhaGRfbGludXhfYnVzX3Jlc2V0LAorI2lmIGRlZmluZWQoX19pMzg2X18pCisJLmJpb3NfcGFyYW0JCT0gYWhkX2xpbnV4X2Jpb3NwYXJhbSwKKyNlbmRpZgorCS5jYW5fcXVldWUJCT0gQUhEX01BWF9RVUVVRSwKKwkudGhpc19pZAkJPSAtMSwKKwkuY21kX3Blcl9sdW4JCT0gMiwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLnNsYXZlX2FsbG9jCQk9IGFoZF9saW51eF9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfY29uZmlndXJlCT0gYWhkX2xpbnV4X3NsYXZlX2NvbmZpZ3VyZSwKKwkuc2xhdmVfZGVzdHJveQkJPSBhaGRfbGludXhfc2xhdmVfZGVzdHJveSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFRhc2tsZXQgSGFuZGxlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBJbiAyLjQuWCBhbmQgYWJvdmUsIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBhIHRhc2tsZXQsCisgKiBzbyB3ZSBtdXN0IHJlLWFjcXVpcmUgb3VyIGxvY2sgcHJpb3IgdG8gZXhlY3V0aW5nIHRoaXMgY29kZS4KKyAqIEluIGFsbCBwcmlvciBrZXJuZWxzLCBhaGRfc2NoZWR1bGVfcnVucSgpIGNhbGxzIHRoaXMgcm91dGluZQorICogZGlyZWN0bHkgYW5kIGFoZF9zY2hlZHVsZV9ydW5xKCkgaXMgY2FsbGVkIHdpdGggb3VyIGxvY2sgaGVsZC4KKyAqLworc3RhdGljIHZvaWQKK2FoZF9ydW5xX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBhaGRfc29mdGMqIGFoZDsKKwlzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2OworCXVfbG9uZyBmbGFnczsKKworCWFoZCA9IChzdHJ1Y3QgYWhkX3NvZnRjICopZGF0YTsKKwlhaGRfbG9jayhhaGQsICZmbGFncyk7CisJd2hpbGUgKChkZXYgPSBhaGRfbGludXhfbmV4dF9kZXZpY2VfdG9fcnVuKGFoZCkpICE9IE5VTEwpIHsKKwkKKwkJVEFJTFFfUkVNT1ZFKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xLCBkZXYsIGxpbmtzKTsKKwkJZGV2LT5mbGFncyAmPSB+QUhEX0RFVl9PTl9SVU5fTElTVDsKKwkJYWhkX2xpbnV4X2NoZWNrX2RldmljZV9xdWV1ZShhaGQsIGRldik7CisJCS8qIFllaWxkIHRvIG91ciBpbnRlcnJ1cHQgaGFuZGxlciAqLworCQlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKKwkJYWhkX2xvY2soYWhkLCAmZmxhZ3MpOworCX0KKwlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEJ1cyBETUEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorYWhkX2RtYV90YWdfY3JlYXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYnVzX2RtYV90YWdfdCBwYXJlbnQsCisJCSAgIGJ1c19zaXplX3QgYWxpZ25tZW50LCBidXNfc2l6ZV90IGJvdW5kYXJ5LAorCQkgICBkbWFfYWRkcl90IGxvd2FkZHIsIGRtYV9hZGRyX3QgaGlnaGFkZHIsCisJCSAgIGJ1c19kbWFfZmlsdGVyX3QgKmZpbHRlciwgdm9pZCAqZmlsdGVyYXJnLAorCQkgICBidXNfc2l6ZV90IG1heHNpemUsIGludCBuc2VnbWVudHMsCisJCSAgIGJ1c19zaXplX3QgbWF4c2Vnc3osIGludCBmbGFncywgYnVzX2RtYV90YWdfdCAqcmV0X3RhZykKK3sKKwlidXNfZG1hX3RhZ190IGRtYXQ7CisKKwlkbWF0ID0gbWFsbG9jKHNpemVvZigqZG1hdCksIE1fREVWQlVGLCBNX05PV0FJVCk7CisJaWYgKGRtYXQgPT0gTlVMTCkKKwkJcmV0dXJuIChFTk9NRU0pOworCisJLyoKKwkgKiBMaW51eCBpcyB2ZXJ5IHNpbXBsaXN0aWMgYWJvdXQgRE1BIG1lbW9yeS4gIEZvciBub3cgZG9uJ3QKKwkgKiBtYWludGFpbiBhbGwgc3BlY2lmaWNhdGlvbiBpbmZvcm1hdGlvbi4gIE9uY2UgTGludXggc3VwcGxpZXMKKwkgKiBiZXR0ZXIgZmFjaWxpdGllcyBmb3IgZG9pbmcgdGhlc2Ugb3BlcmF0aW9ucywgb3IgdGhlCisJICogbmVlZHMgb2YgdGhpcyBwYXJ0aWN1bGFyIGRyaXZlciBjaGFuZ2UsIHdlIG1pZ2h0IG5lZWQgdG8gZG8KKwkgKiBtb3JlIGhlcmUuCisJICovCisJZG1hdC0+YWxpZ25tZW50ID0gYWxpZ25tZW50OworCWRtYXQtPmJvdW5kYXJ5ID0gYm91bmRhcnk7CisJZG1hdC0+bWF4c2l6ZSA9IG1heHNpemU7CisJKnJldF90YWcgPSBkbWF0OworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK2FoZF9kbWFfdGFnX2Rlc3Ryb3koc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBidXNfZG1hX3RhZ190IGRtYXQpCit7CisJZnJlZShkbWF0LCBNX0RFVkJVRik7Cit9CisKK2ludAorYWhkX2RtYW1lbV9hbGxvYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGJ1c19kbWFfdGFnX3QgZG1hdCwgdm9pZCoqIHZhZGRyLAorCQkgaW50IGZsYWdzLCBidXNfZG1hbWFwX3QgKm1hcHApCit7CisJYnVzX2RtYW1hcF90IG1hcDsKKworCW1hcCA9IG1hbGxvYyhzaXplb2YoKm1hcCksIE1fREVWQlVGLCBNX05PV0FJVCk7CisJaWYgKG1hcCA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisJLyoKKwkgKiBBbHRob3VnaCB3ZSBjYW4gZG1hIGRhdGEgYWJvdmUgNEdCLCBvdXIKKwkgKiAiY29uc2lzdGVudCIgbWVtb3J5IGlzIGJlbG93IDRHQiBmb3IKKwkgKiBzcGFjZSBlZmZpY2llbmN5IHJlYXNvbnMgKG9ubHkgbmVlZCBhIDRieXRlCisJICogYWRkcmVzcykuICBGb3IgdGhpcyByZWFzb24sIHdlIGhhdmUgdG8gcmVzZXQKKwkgKiBvdXIgZG1hIG1hc2sgd2hlbiBkb2luZyBhbGxvY2F0aW9ucy4KKwkgKi8KKwlpZiAoYWhkLT5kZXZfc29mdGMgIT0gTlVMTCkKKwkJaWYgKHBjaV9zZXRfZG1hX21hc2soYWhkLT5kZXZfc29mdGMsIDB4RkZGRkZGRkYpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhaWM3OXh4OiBObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlLlxuIik7CisJCQlrZnJlZShtYXApOworCQkJcmV0dXJuIChFTk9ERVYpOworCQl9CisJKnZhZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWhkLT5kZXZfc29mdGMsCisJCQkJICAgICAgZG1hdC0+bWF4c2l6ZSwgJm1hcC0+YnVzX2FkZHIpOworCWlmIChhaGQtPmRldl9zb2Z0YyAhPSBOVUxMKQorCQlpZiAocGNpX3NldF9kbWFfbWFzayhhaGQtPmRldl9zb2Z0YywKKwkJCQkgICAgIGFoZC0+cGxhdGZvcm1fZGF0YS0+aHdfZG1hX21hc2spKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhaWM3OXh4OiBObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlLlxuIik7CisJCQlrZnJlZShtYXApOworCQkJcmV0dXJuIChFTk9ERVYpOworCQl9CisJaWYgKCp2YWRkciA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisJKm1hcHAgPSBtYXA7CisJcmV0dXJuKDApOworfQorCit2b2lkCithaGRfZG1hbWVtX2ZyZWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBidXNfZG1hX3RhZ190IGRtYXQsCisJCXZvaWQqIHZhZGRyLCBidXNfZG1hbWFwX3QgbWFwKQoreworCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWhkLT5kZXZfc29mdGMsIGRtYXQtPm1heHNpemUsCisJCQkgICAgdmFkZHIsIG1hcC0+YnVzX2FkZHIpOworfQorCitpbnQKK2FoZF9kbWFtYXBfbG9hZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwKKwkJdm9pZCAqYnVmLCBidXNfc2l6ZV90IGJ1ZmxlbiwgYnVzX2RtYW1hcF9jYWxsYmFja190ICpjYiwKKwkJdm9pZCAqY2JfYXJnLCBpbnQgZmxhZ3MpCit7CisJLyoKKwkgKiBBc3N1bWUgZm9yIG5vdyB0aGF0IHRoaXMgd2lsbCBvbmx5IGJlIHVzZWQgZHVyaW5nCisJICogaW5pdGlhbGl6YXRpb24gYW5kIG5vdCBmb3IgcGVyLXRyYW5zYWN0aW9uIGJ1ZmZlciBtYXBwaW5nLgorCSAqLworCWJ1c19kbWFfc2VnbWVudF90IHN0YWNrX3NnOworCisJc3RhY2tfc2cuZHNfYWRkciA9IG1hcC0+YnVzX2FkZHI7CisJc3RhY2tfc2cuZHNfbGVuID0gZG1hdC0+bWF4c2l6ZTsKKwljYihjYl9hcmcsICZzdGFja19zZywgLypuc2VnKi8xLCAvKmVycm9yKi8wKTsKKwlyZXR1cm4gKDApOworfQorCit2b2lkCithaGRfZG1hbWFwX2Rlc3Ryb3koc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXApCit7CisJLyoKKwkgKiBUaGUgbWFwIG1heSBpcyBOVUxMIGluIG91ciA8IDIuMy5YIGltcGxlbWVudGF0aW9uLgorCSAqLworCWlmIChtYXAgIT0gTlVMTCkKKwkJZnJlZShtYXAsIE1fREVWQlVGKTsKK30KKworaW50CithaGRfZG1hbWFwX3VubG9hZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCkKK3sKKwkvKiBOb3RoaW5nIHRvIGRvICovCisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKiBQbGF0Zm9ybSBEZXBlbmRlbnQgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDb21wYXJlICJsZWZ0IGhhbmQiIHNvZnRjIHdpdGggInJpZ2h0IGhhbmQiIHNvZnRjLCByZXR1cm5pbmc6CisgKiA8IDAgLSBsYWhkIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gcmFoZAorICogICAwIC0gU29mdGNzIGFyZSBlcXVhbAorICogPiAwIC0gbGFoZCBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiByYWhkCisgKi8KK2ludAorYWhkX3NvZnRjX2NvbXAoc3RydWN0IGFoZF9zb2Z0YyAqbGFoZCwgc3RydWN0IGFoZF9zb2Z0YyAqcmFoZCkKK3sKKwlpbnQJdmFsdWU7CisKKwkvKgorCSAqIFVuZGVyIExpbnV4LCBjYXJkcyBhcmUgb3JkZXJlZCBhcyBmb2xsb3dzOgorCSAqCTEpIFBDSSBkZXZpY2VzIHRoYXQgYXJlIG1hcmtlZCBhcyB0aGUgYm9vdCBjb250cm9sbGVyLgorCSAqCTIpIFBDSSBkZXZpY2VzIHdpdGggQklPUyBlbmFibGVkIHNvcnRlZCBieSBidXMvc2xvdC9mdW5jLgorCSAqCTMpIEFsbCByZW1haW5pbmcgUENJIGRldmljZXMgc29ydGVkIGJ5IGJ1cy9zbG90L2Z1bmMuCisJICovCisjaWYgMAorCXZhbHVlID0gKGxhaGQtPmZsYWdzICYgQUhEX0JPT1RfQ0hBTk5FTCkKKwkgICAgICAtIChyYWhkLT5mbGFncyAmIEFIRF9CT09UX0NIQU5ORUwpOworCWlmICh2YWx1ZSAhPSAwKQorCQkvKiBDb250cm9sbGVycyBzZXQgZm9yIGJvb3QgaGF2ZSBhICpoaWdoZXIqIHByaW9yaXR5ICovCisJCXJldHVybiAodmFsdWUpOworI2VuZGlmCisKKwl2YWx1ZSA9IChsYWhkLT5mbGFncyAmIEFIRF9CSU9TX0VOQUJMRUQpCisJICAgICAgLSAocmFoZC0+ZmxhZ3MgJiBBSERfQklPU19FTkFCTEVEKTsKKwlpZiAodmFsdWUgIT0gMCkKKwkJLyogQ29udHJvbGxlcnMgd2l0aCBCSU9TIGVuYWJsZWQgaGF2ZSBhICpoaWdoZXIqIHByaW9yaXR5ICovCisJCXJldHVybiAodmFsdWUpOworCisJLyogU3RpbGwgZXF1YWwuICBTb3J0IGJ5IGJ1cy9zbG90L2Z1bmMuICovCisJaWYgKGFpYzc5eHhfcmV2ZXJzZV9zY2FuICE9IDApCisJCXZhbHVlID0gYWhkX2dldF9wY2lfYnVzKGxhaGQtPmRldl9zb2Z0YykKKwkJICAgICAgLSBhaGRfZ2V0X3BjaV9idXMocmFoZC0+ZGV2X3NvZnRjKTsKKwllbHNlCisJCXZhbHVlID0gYWhkX2dldF9wY2lfYnVzKHJhaGQtPmRldl9zb2Z0YykKKwkJICAgICAgLSBhaGRfZ2V0X3BjaV9idXMobGFoZC0+ZGV2X3NvZnRjKTsKKwlpZiAodmFsdWUgIT0gMCkKKwkJcmV0dXJuICh2YWx1ZSk7CisJaWYgKGFpYzc5eHhfcmV2ZXJzZV9zY2FuICE9IDApCisJCXZhbHVlID0gYWhkX2dldF9wY2lfc2xvdChsYWhkLT5kZXZfc29mdGMpCisJCSAgICAgIC0gYWhkX2dldF9wY2lfc2xvdChyYWhkLT5kZXZfc29mdGMpOworCWVsc2UKKwkJdmFsdWUgPSBhaGRfZ2V0X3BjaV9zbG90KHJhaGQtPmRldl9zb2Z0YykKKwkJICAgICAgLSBhaGRfZ2V0X3BjaV9zbG90KGxhaGQtPmRldl9zb2Z0Yyk7CisJaWYgKHZhbHVlICE9IDApCisJCXJldHVybiAodmFsdWUpOworCisJdmFsdWUgPSByYWhkLT5jaGFubmVsIC0gbGFoZC0+Y2hhbm5lbDsKKwlyZXR1cm4gKHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9zZXR1cF90YWdfaW5mbyh1X2xvbmcgYXJnLCBpbnQgaW5zdGFuY2UsIGludCB0YXJnLCBpbnQzMl90IHZhbHVlKQoreworCisJaWYgKChpbnN0YW5jZSA+PSAwKSAmJiAodGFyZyA+PSAwKQorCSAmJiAoaW5zdGFuY2UgPCBOVU1fRUxFTUVOVFMoYWljNzl4eF90YWdfaW5mbykpCisJICYmICh0YXJnIDwgQUhEX05VTV9UQVJHRVRTKSkgeworCQlhaWM3OXh4X3RhZ19pbmZvW2luc3RhbmNlXS50YWdfY29tbWFuZHNbdGFyZ10gPSB2YWx1ZSAmIDB4MUZGOworCQlpZiAoYm9vdHZlcmJvc2UpCisJCQlwcmludGYoInRhZ19pbmZvWyVkOiVkXSA9ICVkXG4iLCBpbnN0YW5jZSwgdGFyZywgdmFsdWUpOworCX0KK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9zZXR1cF9yZF9zdHJtX2luZm8odV9sb25nIGFyZywgaW50IGluc3RhbmNlLCBpbnQgdGFyZywgaW50MzJfdCB2YWx1ZSkKK3sKKwlpZiAoKGluc3RhbmNlID49IDApCisJICYmIChpbnN0YW5jZSA8IE5VTV9FTEVNRU5UUyhhaWM3OXh4X3JkX3N0cm1faW5mbykpKSB7CisJCWFpYzc5eHhfcmRfc3RybV9pbmZvW2luc3RhbmNlXSA9IHZhbHVlICYgMHhGRkZGOworCQlpZiAoYm9vdHZlcmJvc2UpCisJCQlwcmludGYoInJkX3N0cm1bJWRdID0gMHgleFxuIiwgaW5zdGFuY2UsIHZhbHVlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfc2V0dXBfZHYodV9sb25nIGFyZywgaW50IGluc3RhbmNlLCBpbnQgdGFyZywgaW50MzJfdCB2YWx1ZSkKK3sKKwlpZiAoKGluc3RhbmNlID49IDApCisJICYmIChpbnN0YW5jZSA8IE5VTV9FTEVNRU5UUyhhaWM3OXh4X2R2X3NldHRpbmdzKSkpIHsKKwkJYWljNzl4eF9kdl9zZXR0aW5nc1tpbnN0YW5jZV0gPSB2YWx1ZTsKKwkJaWYgKGJvb3R2ZXJib3NlKQorCQkJcHJpbnRmKCJkdlslZF0gPSAlZFxuIiwgaW5zdGFuY2UsIHZhbHVlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfc2V0dXBfaW9jZWxsX2luZm8odV9sb25nIGluZGV4LCBpbnQgaW5zdGFuY2UsIGludCB0YXJnLCBpbnQzMl90IHZhbHVlKQoreworCisJaWYgKChpbnN0YW5jZSA+PSAwKQorCSAmJiAoaW5zdGFuY2UgPCBOVU1fRUxFTUVOVFMoYWljNzl4eF9pb2NlbGxfaW5mbykpKSB7CisJCXVpbnQ4X3QgKmlvY2VsbF9pbmZvOworCisJCWlvY2VsbF9pbmZvID0gKHVpbnQ4X3QqKSZhaWM3OXh4X2lvY2VsbF9pbmZvW2luc3RhbmNlXTsKKwkJaW9jZWxsX2luZm9baW5kZXhdID0gdmFsdWUgJiAweEZGRkY7CisJCWlmIChib290dmVyYm9zZSkKKwkJCXByaW50ZigiaW9jZWxsWyVkOiVsZF0gPSAlZFxuIiwgaW5zdGFuY2UsIGluZGV4LCB2YWx1ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X3NldHVwX3RhZ19pbmZvX2dsb2JhbChjaGFyICpwKQoreworCWludCB0YWdzLCBpLCBqOworCisJdGFncyA9IHNpbXBsZV9zdHJ0b3VsKHAgKyAxLCBOVUxMLCAwKSAmIDB4ZmY7CisJcHJpbnRmKCJTZXR0aW5nIEdsb2JhbCBUYWdzPSAlZFxuIiwgdGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0VMRU1FTlRTKGFpYzc5eHhfdGFnX2luZm8pOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IEFIRF9OVU1fVEFSR0VUUzsgaisrKSB7CisJCQlhaWM3OXh4X3RhZ19pbmZvW2ldLnRhZ19jb21tYW5kc1tqXSA9IHRhZ3M7CisJCX0KKwl9Cit9CisKKy8qCisgKiBIYW5kbGUgTGludXggYm9vdCBwYXJhbWV0ZXJzLiBUaGlzIHJvdXRpbmUgYWxsb3dzIGZvciBhc3NpZ25pbmcgYSB2YWx1ZQorICogdG8gYSBwYXJhbWV0ZXIgd2l0aCBhICc6JyBiZXR3ZWVuIHRoZSBwYXJhbWV0ZXIgYW5kIHRoZSB2YWx1ZS4KKyAqIGllLiBhaWM3OXh4PXN0cHdsZXY6MSxleHRlbmRlZAorICovCitzdGF0aWMgaW50CithaWM3OXh4X3NldHVwKGNoYXIgKnMpCit7CisJaW50CWksIG47CisJY2hhciAgICpwOworCWNoYXIgICAqZW5kOworCisJc3RhdGljIHN0cnVjdCB7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCXVpbnQzMl90ICpmbGFnOworCX0gb3B0aW9uc1tdID0geworCQl7ICJleHRlbmRlZCIsICZhaWM3OXh4X2V4dGVuZGVkIH0sCisJCXsgIm5vX3Jlc2V0IiwgJmFpYzc5eHhfbm9fcmVzZXQgfSwKKwkJeyAidmVyYm9zZSIsICZhaWM3OXh4X3ZlcmJvc2UgfSwKKwkJeyAiYWxsb3dfbWVtaW8iLCAmYWljNzl4eF9hbGxvd19tZW1pb30sCisjaWZkZWYgQUhEX0RFQlVHCisJCXsgImRlYnVnIiwgJmFoZF9kZWJ1ZyB9LAorI2VuZGlmCisJCXsgInJldmVyc2Vfc2NhbiIsICZhaWM3OXh4X3JldmVyc2Vfc2NhbiB9LAorCQl7ICJwZXJpb2RpY19vdGFnIiwgJmFpYzc5eHhfcGVyaW9kaWNfb3RhZyB9LAorCQl7ICJwY2lfcGFyaXR5IiwgJmFpYzc5eHhfcGNpX3Bhcml0eSB9LAorCQl7ICJzZWx0aW1lIiwgJmFpYzc5eHhfc2VsdGltZSB9LAorCQl7ICJ0YWdfaW5mbyIsIE5VTEwgfSwKKwkJeyAiZ2xvYmFsX3RhZ19kZXB0aCIsIE5VTEx9LAorCQl7ICJyZF9zdHJtIiwgTlVMTCB9LAorCQl7ICJkdiIsIE5VTEwgfSwKKwkJeyAic2xld3JhdGUiLCBOVUxMIH0sCisJCXsgInByZWNvbXAiLCBOVUxMIH0sCisJCXsgImFtcGxpdHVkZSIsIE5VTEwgfSwKKwl9OworCisJZW5kID0gc3RyY2hyKHMsICdcMCcpOworCisJLyoKKwkgKiBYWFggaWE2NCBnY2MgaXNuJ3Qgc21hcnQgZW5vdWdoIHRvIGtub3cgdGhhdCBOVU1fRUxFTUVOVFMKKwkgKiB3aWxsIG5ldmVyIGJlIDAgaW4gdGhpcyBjYXNlLgorCSAqLyAgICAgIAorCW4gPSAwOyAgCisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJnMsICIsLiIpKSAhPSBOVUxMKSB7CisJCWlmICgqcCA9PSAnXDAnKQorCQkJY29udGludWU7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRUxFTUVOVFMob3B0aW9ucyk7IGkrKykgeworCisJCQluID0gc3RybGVuKG9wdGlvbnNbaV0ubmFtZSk7CisJCQlpZiAoc3RybmNtcChvcHRpb25zW2ldLm5hbWUsIHAsIG4pID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPT0gTlVNX0VMRU1FTlRTKG9wdGlvbnMpKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cm5jbXAocCwgImdsb2JhbF90YWdfZGVwdGgiLCBuKSA9PSAwKSB7CisJCQlhaGRfbGludXhfc2V0dXBfdGFnX2luZm9fZ2xvYmFsKHAgKyBuKTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJ0YWdfaW5mbyIsIG4pID09IDApIHsKKwkJCXMgPSBhaWNfcGFyc2VfYnJhY2Vfb3B0aW9uKCJ0YWdfaW5mbyIsIHAgKyBuLCBlbmQsCisJCQkgICAgMiwgYWhkX2xpbnV4X3NldHVwX3RhZ19pbmZvLCAwKTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJyZF9zdHJtIiwgbikgPT0gMCkgeworCQkJcyA9IGFpY19wYXJzZV9icmFjZV9vcHRpb24oInJkX3N0cm0iLCBwICsgbiwgZW5kLAorCQkJICAgIDEsIGFoZF9saW51eF9zZXR1cF9yZF9zdHJtX2luZm8sIDApOworCQl9IGVsc2UgaWYgKHN0cm5jbXAocCwgImR2IiwgbikgPT0gMCkgeworCQkJcyA9IGFpY19wYXJzZV9icmFjZV9vcHRpb24oImR2IiwgcCArIG4sIGVuZCwgMSwKKwkJCSAgICBhaGRfbGludXhfc2V0dXBfZHYsIDApOworCQl9IGVsc2UgaWYgKHN0cm5jbXAocCwgInNsZXdyYXRlIiwgbikgPT0gMCkgeworCQkJcyA9IGFpY19wYXJzZV9icmFjZV9vcHRpb24oInNsZXdyYXRlIiwKKwkJCSAgICBwICsgbiwgZW5kLCAxLCBhaGRfbGludXhfc2V0dXBfaW9jZWxsX2luZm8sCisJCQkgICAgQUlDNzlYWF9TTEVXUkFURV9JTkRFWCk7CisJCX0gZWxzZSBpZiAoc3RybmNtcChwLCAicHJlY29tcCIsIG4pID09IDApIHsKKwkJCXMgPSBhaWNfcGFyc2VfYnJhY2Vfb3B0aW9uKCJwcmVjb21wIiwKKwkJCSAgICBwICsgbiwgZW5kLCAxLCBhaGRfbGludXhfc2V0dXBfaW9jZWxsX2luZm8sCisJCQkgICAgQUlDNzlYWF9QUkVDT01QX0lOREVYKTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJhbXBsaXR1ZGUiLCBuKSA9PSAwKSB7CisJCQlzID0gYWljX3BhcnNlX2JyYWNlX29wdGlvbigiYW1wbGl0dWRlIiwKKwkJCSAgICBwICsgbiwgZW5kLCAxLCBhaGRfbGludXhfc2V0dXBfaW9jZWxsX2luZm8sCisJCQkgICAgQUlDNzlYWF9BTVBMSVRVREVfSU5ERVgpOworCQl9IGVsc2UgaWYgKHBbbl0gPT0gJzonKSB7CisJCQkqKG9wdGlvbnNbaV0uZmxhZykgPSBzaW1wbGVfc3RydG91bChwICsgbiArIDEsIE5VTEwsIDApOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHAsICJ2ZXJib3NlIiwgbikpIHsKKwkJCSoob3B0aW9uc1tpXS5mbGFnKSA9IDE7CisJCX0gZWxzZSB7CisJCQkqKG9wdGlvbnNbaV0uZmxhZykgXj0gMHhGRkZGRkZGRjsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiYWljNzl4eD0iLCBhaWM3OXh4X3NldHVwKTsKKwordWludDMyX3QgYWljNzl4eF92ZXJib3NlOworCitpbnQKK2FoZF9saW51eF9yZWdpc3Rlcl9ob3N0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgU2NzaV9Ib3N0X1RlbXBsYXRlICp0ZW1wbGF0ZSkKK3sKKwljaGFyCWJ1Zls4MF07CisJc3RydWN0CVNjc2lfSG9zdCAqaG9zdDsKKwljaGFyCSpuZXdfbmFtZTsKKwl1X2xvbmcJczsKKwl1X2xvbmcJdGFyZ2V0OworCisJdGVtcGxhdGUtPm5hbWUgPSBhaGQtPmRlc2NyaXB0aW9uOworCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2ModGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgYWhkX3NvZnRjICopKTsKKwlpZiAoaG9zdCA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisKKwkqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKWhvc3QtPmhvc3RkYXRhKSA9IGFoZDsKKwlhaGRfbG9jayhhaGQsICZzKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJc2NzaV9hc3NpZ25fbG9jayhob3N0LCAmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2spOworI2VsaWYgQUhEX1NDU0lfSEFTX0hPU1RfTE9DSyAhPSAwCisJaG9zdC0+bG9jayA9ICZhaGQtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jazsKKyNlbmRpZgorCWFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCA9IGhvc3Q7CisJaG9zdC0+Y2FuX3F1ZXVlID0gQUhEX01BWF9RVUVVRTsKKwlob3N0LT5jbWRfcGVyX2x1biA9IDI7CisJaG9zdC0+c2dfdGFibGVzaXplID0gQUhEX05TRUc7CisJaG9zdC0+dGhpc19pZCA9IGFoZC0+b3VyX2lkOworCWhvc3QtPmlycSA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+aXJxOworCWhvc3QtPm1heF9pZCA9IChhaGQtPmZlYXR1cmVzICYgQUhEX1dJREUpID8gMTYgOiA4OworCWhvc3QtPm1heF9sdW4gPSBBSERfTlVNX0xVTlM7CisJaG9zdC0+bWF4X2NoYW5uZWwgPSAwOworCWhvc3QtPnNnX3RhYmxlc2l6ZSA9IEFIRF9OU0VHOworCWFoZF9zZXRfdW5pdChhaGQsIGFoZF9saW51eF9uZXh0X3VuaXQoKSk7CisJc3ByaW50ZihidWYsICJzY3NpJWQiLCBob3N0LT5ob3N0X25vKTsKKwluZXdfbmFtZSA9IG1hbGxvYyhzdHJsZW4oYnVmKSArIDEsIE1fREVWQlVGLCBNX05PV0FJVCk7CisJaWYgKG5ld19uYW1lICE9IE5VTEwpIHsKKwkJc3RyY3B5KG5ld19uYW1lLCBidWYpOworCQlhaGRfc2V0X25hbWUoYWhkLCBuZXdfbmFtZSk7CisJfQorCWhvc3QtPnVuaXF1ZV9pZCA9IGFoZC0+dW5pdDsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlzY3NpX3NldF9wY2lfZGV2aWNlKGhvc3QsIGFoZC0+ZGV2X3NvZnRjKTsKKyNlbmRpZgorCWFoZF9saW51eF9zZXR1cF91c2VyX3JkX3N0cm1fc2V0dGluZ3MoYWhkKTsKKwlhaGRfbGludXhfaW5pdGlhbGl6ZV9zY3NpX2J1cyhhaGQpOworCWFoZF91bmxvY2soYWhkLCAmcyk7CisJYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9waWQgPSBrZXJuZWxfdGhyZWFkKGFoZF9saW51eF9kdl90aHJlYWQsIGFoZCwgMCk7CisJYWhkX2xvY2soYWhkLCAmcyk7CisJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfcGlkIDwgMCkgeworCQlwcmludGYoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIERWIHRocmVhZCwgZXJyb3I9ICVkXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9waWQpOworCQlyZXR1cm4gKC1haGQtPnBsYXRmb3JtX2RhdGEtPmR2X3BpZCk7CisJfQorCS8qCisJICogSW5pdGlhbGx5IGFsbG9jYXRlICphbGwqIG9mIG91ciBsaW51eCB0YXJnZXQgb2JqZWN0cworCSAqIHNvIHRoYXQgdGhlIERWIHRocmVhZCB3aWxsIHNjYW4gdGhlbSBhbGwgaW4gcGFyYWxsZWwKKwkgKiBqdXN0IGFmdGVyIGRyaXZlciBpbml0aWFsaXphdGlvbi4gIEFueSBkZXZpY2UgdGhhdAorCSAqIGRvZXMgbm90IGV4aXN0IHdpbGwgaGF2ZSBpdHMgdGFyZ2V0IG9iamVjdCBkZXN0cm95ZWQKKwkgKiBieSB0aGUgc2VsZWN0aW9uIHRpbWVvdXQgaGFuZGxlci4gIEluIHRoZSBjYXNlIG9mIGEKKwkgKiBkZXZpY2UgdGhhdCBhcHBlYXJzIGFmdGVyIHRoZSBpbml0aWFsIERWIHNjYW4sIGFzeW5jCisJICogbmVnb3RpYXRpb24gd2lsbCBvY2N1ciBmb3IgdGhlIGZpcnN0IGNvbW1hbmQsIGFuZCBEVgorCSAqIHdpbGwgY29tZW5jZSBzaG91bGQgdGhhdCBmaXJzdCBjb21tYW5kIGJlIHN1Y2Nlc3NmdWwuCisJICovCisJZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPCBob3N0LT5tYXhfaWQ7IHRhcmdldCsrKSB7CisKKwkJLyoKKwkJICogU2tpcCBvdXIgb3duIElELiAgU29tZSBDb21wYXEvSFAgc3RvcmFnZSBkZXZpY2VzCisJCSAqIGhhdmUgZW5jbG9zdXJlIG1hbmFnZW1lbnQgZGV2aWNlcyB0aGF0IHJlc3BvbmQgdG8KKwkJICogc2luZ2xlIGJpdCBzZWxlY3Rpb24gKGkuZS4gc2VsZWN0aW5nIG91cnNlbHZlcykuCisJCSAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgZWl0aGVyIGFuIGV4dGVybmFsIGFwcGxpY2F0aW9uCisJCSAqIG9yIGEgbW9kaWZpZWQga2VybmVsIHdpbGwgYmUgdXNlZCB0byBwcm9iZSB0aGlzCisJCSAqIElEIGlmIGl0IGlzIGFwcHJvcHJpYXRlLiAgVG8gYWNjb21tb2RhdGUgdGhlc2UKKwkJICogaW5zdGFsbGF0aW9ucywgYWhjX2xpbnV4X2FsbG9jX3RhcmdldCgpIHdpbGwgYWxsb2NhdGUKKwkJICogZm9yIG91ciBJRCBpZiBhc2tlZCB0byBkbyBzby4KKwkJICovCisJCWlmICh0YXJnZXQgPT0gYWhkLT5vdXJfaWQpIAorCQkJY29udGludWU7CisKKwkJYWhkX2xpbnV4X2FsbG9jX3RhcmdldChhaGQsIDAsIHRhcmdldCk7CisJfQorCWFoZF9pbnRyX2VuYWJsZShhaGQsIFRSVUUpOworCWFoZF9saW51eF9zdGFydF9kdihhaGQpOworCWFoZF91bmxvY2soYWhkLCAmcyk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJc2NzaV9hZGRfaG9zdChob3N0LCAmYWhkLT5kZXZfc29mdGMtPmRldik7IC8qIFhYWCBoYW5kbGUgZmFpbHVyZSAqLworCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworI2VuZGlmCisJcmV0dXJuICgwKTsKK30KKwordWludDY0X3QKK2FoZF9saW51eF9nZXRfbWVtc2l6ZSh2b2lkKQoreworCXN0cnVjdCBzeXNpbmZvIHNpOworCisJc2lfbWVtaW5mbygmc2kpOworCXJldHVybiAoKHVpbnQ2NF90KXNpLnRvdGFscmFtIDw8IFBBR0VfU0hJRlQpOworfQorCisvKgorICogRmluZCB0aGUgc21hbGxlc3QgYXZhaWxhYmxlIHVuaXQgbnVtYmVyIHRvIHVzZQorICogZm9yIGEgbmV3IGRldmljZS4gIFdlIGRvbid0IGp1c3QgdXNlIGEgc3RhdGljCisgKiBjb3VudCB0byBoYW5kbGUgdGhlICJyZXBlYXRlZCBob3QtKHVuKXBsdWciCisgKiBzY2VuYXJpby4KKyAqLworc3RhdGljIGludAorYWhkX2xpbnV4X25leHRfdW5pdCh2b2lkKQoreworCXN0cnVjdCBhaGRfc29mdGMgKmFoZDsKKwlpbnQgdW5pdDsKKworCXVuaXQgPSAwOworcmV0cnk6CisJVEFJTFFfRk9SRUFDSChhaGQsICZhaGRfdGFpbHEsIGxpbmtzKSB7CisJCWlmIChhaGQtPnVuaXQgPT0gdW5pdCkgeworCQkJdW5pdCsrOworCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwlyZXR1cm4gKHVuaXQpOworfQorCisvKgorICogUGxhY2UgdGhlIFNDU0kgYnVzIGludG8gYSBrbm93biBzdGF0ZSBieSBlaXRoZXIgcmVzZXR0aW5nIGl0LAorICogb3IgZm9yY2luZyB0cmFuc2ZlciBuZWdvdGlhdGlvbnMgb24gdGhlIG5leHQgY29tbWFuZCB0byBhbnkKKyAqIHRhcmdldC4KKyAqLworc3RhdGljIHZvaWQKK2FoZF9saW51eF9pbml0aWFsaXplX3Njc2lfYnVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl1X2ludCB0YXJnZXRfaWQ7CisJdV9pbnQgbnVtdGFyZzsKKworCXRhcmdldF9pZCA9IDA7CisJbnVtdGFyZyA9IDA7CisKKwlpZiAoYWljNzl4eF9ub19yZXNldCAhPSAwKQorCQlhaGQtPmZsYWdzICY9IH5BSERfUkVTRVRfQlVTX0E7CisKKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfUkVTRVRfQlVTX0EpICE9IDApCisJCWFoZF9yZXNldF9jaGFubmVsKGFoZCwgJ0EnLCAvKmluaXRpYXRlX3Jlc2V0Ki9UUlVFKTsKKwllbHNlCisJCW51bXRhcmcgPSAoYWhkLT5mZWF0dXJlcyAmIEFIRF9XSURFKSA/IDE2IDogODsKKworCS8qCisJICogRm9yY2UgbmVnb3RpYXRpb24gdG8gYXN5bmMgZm9yIGFsbCB0YXJnZXRzIHRoYXQKKwkgKiB3aWxsIG5vdCBzZWUgYW4gaW5pdGlhbCBidXMgcmVzZXQuCisJICovCisJZm9yICg7IHRhcmdldF9pZCA8IG51bXRhcmc7IHRhcmdldF9pZCsrKSB7CisJCXN0cnVjdCBhaGRfZGV2aW5mbyBkZXZpbmZvOworCQlzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisKKwkJdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgJ0EnLCBhaGQtPm91cl9pZCwKKwkJCQkJICAgIHRhcmdldF9pZCwgJnRzdGF0ZSk7CisJCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIGFoZC0+b3VyX2lkLCB0YXJnZXRfaWQsCisJCQkJICAgIENBTV9MVU5fV0lMRENBUkQsICdBJywgUk9MRV9JTklUSUFUT1IpOworCQlhaGRfdXBkYXRlX25lZ19yZXF1ZXN0KGFoZCwgJmRldmluZm8sIHRzdGF0ZSwKKwkJCQkgICAgICAgdGluZm8sIEFIRF9ORUdfQUxXQVlTKTsKKwl9CisJLyogR2l2ZSB0aGUgYnVzIHNvbWUgdGltZSB0byByZWNvdmVyICovCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX1JFU0VUX0JVU19BKSAhPSAwKSB7CisJCWFoZF9mcmVlemVfc2ltcShhaGQpOworCQlpbml0X3RpbWVyKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyKTsKKwkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lci5kYXRhID0gKHVfbG9uZylhaGQ7CisJCWFoZC0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZXhwaXJlcyA9CisJCSAgICBqaWZmaWVzICsgKEFJQzc5WFhfUkVTRVRfREVMQVkgKiBIWikvMTAwMDsKKwkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lci5mdW5jdGlvbiA9CisJCSAgICAoYWhkX2xpbnV4X2NhbGxiYWNrX3QgKilhaGRfcmVsZWFzZV9zaW1xOworCQlhZGRfdGltZXIoJmFoZC0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIpOworCX0KK30KKworaW50CithaGRfcGxhdGZvcm1fYWxsb2Moc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB2b2lkICpwbGF0Zm9ybV9hcmcpCit7CisJYWhkLT5wbGF0Zm9ybV9kYXRhID0KKwkgICAgbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWhkX3BsYXRmb3JtX2RhdGEpLCBNX0RFVkJVRiwgTV9OT1dBSVQpOworCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIChFTk9NRU0pOworCW1lbXNldChhaGQtPnBsYXRmb3JtX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgYWhkX3BsYXRmb3JtX2RhdGEpKTsKKwlUQUlMUV9JTklUKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcSk7CisJVEFJTFFfSU5JVCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kZXZpY2VfcnVucSk7CisJYWhkLT5wbGF0Zm9ybV9kYXRhLT5pcnEgPSBBSERfTElOVVhfTk9JUlE7CisJYWhkLT5wbGF0Zm9ybV9kYXRhLT5od19kbWFfbWFzayA9IDB4RkZGRkZGRkY7CisJYWhkX2xvY2tpbml0KGFoZCk7CisJYWhkX2RvbmVfbG9ja2luaXQoYWhkKTsKKwlpbml0X3RpbWVyKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcV90aW1lcik7CisJYWhkLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIuZGF0YSA9ICh1X2xvbmcpYWhkOworCWFoZC0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxX3RpbWVyLmZ1bmN0aW9uID0KKwkgICAgKGFoZF9saW51eF9jYWxsYmFja190ICopYWhkX2xpbnV4X3RocmVhZF9ydW5fY29tcGxldGVfcXVldWU7CisJaW5pdF9NVVRFWF9MT0NLRUQoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZWhfc2VtKTsKKwlpbml0X01VVEVYX0xPQ0tFRCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9zZW0pOworCWluaXRfTVVURVhfTE9DS0VEKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X2NtZF9zZW0pOworCWFoZF9zZXR1cF9ydW5xX3Rhc2tsZXQoYWhkKTsKKwlhaGQtPnNlbHRpbWUgPSAoYWljNzl4eF9zZWx0aW1lICYgMHgzKSA8PCA0OworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK2FoZF9wbGF0Zm9ybV9mcmVlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZzsKKwlzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2OworCWludCBpLCBqOworCisJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YSAhPSBOVUxMKSB7CisJCWRlbF90aW1lcl9zeW5jKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcV90aW1lcik7CisJCWFoZF9saW51eF9raWxsX2R2X3RocmVhZChhaGQpOworCQlhaGRfdGVhcmRvd25fcnVucV90YXNrbGV0KGFoZCk7CisJCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QgIT0gTlVMTCkgeworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkJCXNjc2lfcmVtb3ZlX2hvc3QoYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0KTsKKyNlbmRpZgorCQkJc2NzaV9ob3N0X3B1dChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QpOworCQl9CisKKwkJLyogZGVzdHJveSBhbGwgb2YgdGhlIGRldmljZSBhbmQgdGFyZ2V0IG9iamVjdHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IEFIRF9OVU1fVEFSR0VUUzsgaSsrKSB7CisJCQl0YXJnID0gYWhkLT5wbGF0Zm9ybV9kYXRhLT50YXJnZXRzW2ldOworCQkJaWYgKHRhcmcgIT0gTlVMTCkgeworCQkJCS8qIEtlZXAgdGFyZ2V0IGFyb3VuZCB0aHJvdWdoIHRoZSBsb29wLiAqLworCQkJCXRhcmctPnJlZmNvdW50Kys7CisJCQkJZm9yIChqID0gMDsgaiA8IEFIRF9OVU1fTFVOUzsgaisrKSB7CisKKwkJCQkJaWYgKHRhcmctPmRldmljZXNbal0gPT0gTlVMTCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlkZXYgPSB0YXJnLT5kZXZpY2VzW2pdOworCQkJCQlhaGRfbGludXhfZnJlZV9kZXZpY2UoYWhkLCBkZXYpOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIEZvcmNpYmx5IGZyZWUgdGhlIHRhcmdldCBub3cgdGhhdAorCQkJCSAqIGFsbCBkZXZpY2VzIGFyZSBnb25lLgorCQkJCSAqLworCQkJCWFoZF9saW51eF9mcmVlX3RhcmdldChhaGQsIHRhcmcpOworCQkJfQorCQl9CisKKwkJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+aXJxICE9IEFIRF9MSU5VWF9OT0lSUSkKKwkJCWZyZWVfaXJxKGFoZC0+cGxhdGZvcm1fZGF0YS0+aXJxLCBhaGQpOworCQlpZiAoYWhkLT50YWdzWzBdID09IEJVU19TUEFDRV9QSU8KKwkJICYmIGFoZC0+YnNoc1swXS5pb3BvcnQgIT0gMCkKKwkJCXJlbGVhc2VfcmVnaW9uKGFoZC0+YnNoc1swXS5pb3BvcnQsIDI1Nik7CisJCWlmIChhaGQtPnRhZ3NbMV0gPT0gQlVTX1NQQUNFX1BJTworCQkgJiYgYWhkLT5ic2hzWzFdLmlvcG9ydCAhPSAwKQorCQkJcmVsZWFzZV9yZWdpb24oYWhkLT5ic2hzWzFdLmlvcG9ydCwgMjU2KTsKKwkJaWYgKGFoZC0+dGFnc1swXSA9PSBCVVNfU1BBQ0VfTUVNSU8KKwkJICYmIGFoZC0+YnNoc1swXS5tYWRkciAhPSBOVUxMKSB7CisJCQlpb3VubWFwKGFoZC0+YnNoc1swXS5tYWRkcik7CisJCQlyZWxlYXNlX21lbV9yZWdpb24oYWhkLT5wbGF0Zm9ybV9kYXRhLT5tZW1fYnVzYWRkciwKKwkJCQkJICAgMHgxMDAwKTsKKwkJfQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorICAgIAkJLyoKKwkJICogSW4gMi40IHdlIGRldGFjaCBmcm9tIHRoZSBzY3NpIG1pZGxheWVyIGJlZm9yZSB0aGUgUENJCisJCSAqIGxheWVyIGludm9rZXMgb3VyIHJlbW92ZSBjYWxsYmFjay4gIE5vIHBlci1pbnN0YW5jZQorCQkgKiBkZXRhY2ggaXMgcHJvdmlkZWQsIHNvIHdlIG11c3QgcmVhY2ggaW5zaWRlIHRoZSBQQ0kKKwkJICogc3Vic3lzdGVtJ3MgaW50ZXJuYWxzIGFuZCBkZXRhY2ggb3VyIGRyaXZlciBtYW51YWxseS4KKwkJICovCisJCWlmIChhaGQtPmRldl9zb2Z0YyAhPSBOVUxMKQorCQkJYWhkLT5kZXZfc29mdGMtPmRyaXZlciA9IE5VTEw7CisjZW5kaWYKKwkJZnJlZShhaGQtPnBsYXRmb3JtX2RhdGEsIE1fREVWQlVGKTsKKwl9Cit9CisKK3ZvaWQKK2FoZF9wbGF0Zm9ybV9pbml0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwkvKgorCSAqIExvb2t1cCBhbmQgY29tbWl0IGFueSBtb2RpZmllZCBJTyBDZWxsIG9wdGlvbnMuCisJICovCisJaWYgKGFoZC0+dW5pdCA8IE5VTV9FTEVNRU5UUyhhaWM3OXh4X2lvY2VsbF9pbmZvKSkgeworCQlzdHJ1Y3QgYWhkX2xpbnV4X2lvY2VsbF9vcHRzICppb2NlbGxfb3B0czsKKworCQlpb2NlbGxfb3B0cyA9ICZhaWM3OXh4X2lvY2VsbF9pbmZvW2FoZC0+dW5pdF07CisJCWlmIChpb2NlbGxfb3B0cy0+cHJlY29tcCAhPSBBSUM3OVhYX0RFRkFVTFRfUFJFQ09NUCkKKwkJCUFIRF9TRVRfUFJFQ09NUChhaGQsIGlvY2VsbF9vcHRzLT5wcmVjb21wKTsKKwkJaWYgKGlvY2VsbF9vcHRzLT5zbGV3cmF0ZSAhPSBBSUM3OVhYX0RFRkFVTFRfU0xFV1JBVEUpCisJCQlBSERfU0VUX1NMRVdSQVRFKGFoZCwgaW9jZWxsX29wdHMtPnNsZXdyYXRlKTsKKwkJaWYgKGlvY2VsbF9vcHRzLT5hbXBsaXR1ZGUgIT0gQUlDNzlYWF9ERUZBVUxUX0FNUExJVFVERSkKKwkJCUFIRF9TRVRfQU1QTElUVURFKGFoZCwgaW9jZWxsX29wdHMtPmFtcGxpdHVkZSk7CisJfQorCit9CisKK3ZvaWQKK2FoZF9wbGF0Zm9ybV9mcmVlemVfZGV2cShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlhaGRfcGxhdGZvcm1fYWJvcnRfc2NicyhhaGQsIFNDQl9HRVRfVEFSR0VUKGFoZCwgc2NiKSwKKwkJCQlTQ0JfR0VUX0NIQU5ORUwoYWhkLCBzY2IpLAorCQkJCVNDQl9HRVRfTFVOKHNjYiksIFNDQl9MSVNUX05VTEwsCisJCQkJUk9MRV9VTktOT1dOLCBDQU1fUkVRVUVVRV9SRVEpOworfQorCit2b2lkCithaGRfcGxhdGZvcm1fc2V0X3RhZ3Moc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCSAgICAgIGFoZF9xdWV1ZV9hbGcgYWxnKQoreworCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXY7CisJaW50IHdhc19xdWV1aW5nOworCWludCBub3dfcXVldWluZzsKKworCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgZGV2aW5mby0+Y2hhbm5lbCAtICdBJywKKwkJCQkgICBkZXZpbmZvLT50YXJnZXQsCisJCQkJICAgZGV2aW5mby0+bHVuLCAvKmFsbG9jKi9GQUxTRSk7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm47CisJd2FzX3F1ZXVpbmcgPSBkZXYtPmZsYWdzICYgKEFIRF9ERVZfUV9CQVNJQ3xBSERfREVWX1FfVEFHR0VEKTsKKwlzd2l0Y2ggKGFsZykgeworCWRlZmF1bHQ6CisJY2FzZSBBSERfUVVFVUVfTk9ORToKKwkJbm93X3F1ZXVpbmcgPSAwOworCQlicmVhazsgCisJY2FzZSBBSERfUVVFVUVfQkFTSUM6CisJCW5vd19xdWV1aW5nID0gQUhEX0RFVl9RX0JBU0lDOworCQlicmVhazsKKwljYXNlIEFIRF9RVUVVRV9UQUdHRUQ6CisJCW5vd19xdWV1aW5nID0gQUhEX0RFVl9RX1RBR0dFRDsKKwkJYnJlYWs7CisJfQorCWlmICgoZGV2LT5mbGFncyAmIEFIRF9ERVZfRlJFRVpFX1RJTF9FTVBUWSkgPT0gMAorCSAmJiAod2FzX3F1ZXVpbmcgIT0gbm93X3F1ZXVpbmcpCisJICYmIChkZXYtPmFjdGl2ZSAhPSAwKSkgeworCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfRlJFRVpFX1RJTF9FTVBUWTsKKwkJZGV2LT5xZnJvemVuKys7CisJfQorCisJZGV2LT5mbGFncyAmPSB+KEFIRF9ERVZfUV9CQVNJQ3xBSERfREVWX1FfVEFHR0VEfEFIRF9ERVZfUEVSSU9ESUNfT1RBRyk7CisJaWYgKG5vd19xdWV1aW5nKSB7CisJCXVfaW50IHVzZXJ0YWdzOworCisJCXVzZXJ0YWdzID0gYWhkX2xpbnV4X3VzZXJfdGFnZGVwdGgoYWhkLCBkZXZpbmZvKTsKKwkJaWYgKCF3YXNfcXVldWluZykgeworCQkJLyoKKwkJCSAqIFN0YXJ0IG91dCBhZ3Jlc3NpdmVseSBhbmQgYWxsb3cgb3VyCisJCQkgKiBkeW5hbWljIHF1ZXVlIGRlcHRoIGFsZ29yaXRobSB0byB0YWtlCisJCQkgKiBjYXJlIG9mIHRoZSByZXN0LgorCQkJICovCisJCQlkZXYtPm1heHRhZ3MgPSB1c2VydGFnczsKKwkJCWRldi0+b3BlbmluZ3MgPSBkZXYtPm1heHRhZ3MgLSBkZXYtPmFjdGl2ZTsKKwkJfQorCQlpZiAoZGV2LT5tYXh0YWdzID09IDApIHsKKwkJCS8qCisJCQkgKiBRdWV1ZWluZyBpcyBkaXNhYmxlZCBieSB0aGUgdXNlci4KKwkJCSAqLworCQkJZGV2LT5vcGVuaW5ncyA9IDE7CisJCX0gZWxzZSBpZiAoYWxnID09IEFIRF9RVUVVRV9UQUdHRUQpIHsKKwkJCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9RX1RBR0dFRDsKKwkJCWlmIChhaWM3OXh4X3BlcmlvZGljX290YWcgIT0gMCkKKwkJCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfUEVSSU9ESUNfT1RBRzsKKwkJfSBlbHNlCisJCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfUV9CQVNJQzsKKwl9IGVsc2UgeworCQkvKiBXZSBjYW4gb25seSBoYXZlIG9uZSBvcGVuaW5nLiAqLworCQlkZXYtPm1heHRhZ3MgPSAwOworCQlkZXYtPm9wZW5pbmdzID0gIDEgLSBkZXYtPmFjdGl2ZTsKKwl9CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCWlmIChkZXYtPnNjc2lfZGV2aWNlICE9IE5VTEwpIHsKKwkJc3dpdGNoICgoZGV2LT5mbGFncyAmIChBSERfREVWX1FfQkFTSUN8QUhEX0RFVl9RX1RBR0dFRCkpKSB7CisJCWNhc2UgQUhEX0RFVl9RX0JBU0lDOgorCQkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2LT5zY3NpX2RldmljZSwKKwkJCQkJCU1TR19TSU1QTEVfVEFTSywKKwkJCQkJCWRldi0+b3BlbmluZ3MgKyBkZXYtPmFjdGl2ZSk7CisJCQlicmVhazsKKwkJY2FzZSBBSERfREVWX1FfVEFHR0VEOgorCQkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2LT5zY3NpX2RldmljZSwKKwkJCQkJCU1TR19PUkRFUkVEX1RBU0ssCisJCQkJCQlkZXYtPm9wZW5pbmdzICsgZGV2LT5hY3RpdmUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogV2UgYWxsb3cgdGhlIE9TIHRvIHF1ZXVlIDIgdW50YWdnZWQgdHJhbnNhY3Rpb25zIHRvCisJCQkgKiB1cyBhdCBhbnkgdGltZSBldmVuIHRob3VnaCB3ZSBjYW4gb25seSBleGVjdXRlIHRoZW0KKwkJCSAqIHNlcmlhbGx5IG9uIHRoZSBjb250cm9sbGVyL2RldmljZS4gIFRoaXMgc2hvdWxkCisJCQkgKiByZW1vdmUgc29tZSBsYXRlbmN5LgorCQkJICovCisJCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXYtPnNjc2lfZGV2aWNlLAorCQkJCQkJLypOT04tVEFHR0VEKi8wLAorCQkJCQkJLypxdWV1ZSBkZXB0aCovMik7CisJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZgorfQorCitpbnQKK2FoZF9wbGF0Zm9ybV9hYm9ydF9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IHRhcmdldCwgY2hhciBjaGFubmVsLAorCQkJaW50IGx1biwgdV9pbnQgdGFnLCByb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzKQoreworCWludCB0YXJnOworCWludCBtYXh0YXJnOworCWludCBtYXhsdW47CisJaW50IGNsdW47CisJaW50IGNvdW50OworCisJaWYgKHRhZyAhPSBTQ0JfTElTVF9OVUxMKQorCQlyZXR1cm4gKDApOworCisJdGFyZyA9IDA7CisJaWYgKHRhcmdldCAhPSBDQU1fVEFSR0VUX1dJTERDQVJEKSB7CisJCXRhcmcgPSB0YXJnZXQ7CisJCW1heHRhcmcgPSB0YXJnICsgMTsKKwl9IGVsc2UgeworCQltYXh0YXJnID0gKGFoZC0+ZmVhdHVyZXMgJiBBSERfV0lERSkgPyAxNiA6IDg7CisJfQorCWNsdW4gPSAwOworCWlmIChsdW4gIT0gQ0FNX0xVTl9XSUxEQ0FSRCkgeworCQljbHVuID0gbHVuOworCQltYXhsdW4gPSBjbHVuICsgMTsKKwl9IGVsc2UgeworCQltYXhsdW4gPSBBSERfTlVNX0xVTlM7CisJfQorCisJY291bnQgPSAwOworCWZvciAoOyB0YXJnIDwgbWF4dGFyZzsgdGFyZysrKSB7CisKKwkJZm9yICg7IGNsdW4gPCBtYXhsdW47IGNsdW4rKykgeworCQkJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKKwkJCXN0cnVjdCBhaGRfYnVzeXEgKmJ1c3lxOworCQkJc3RydWN0IGFoZF9jbWQgKmFjbWQ7CisKKwkJCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgLypjaGFuKi8wLCB0YXJnLAorCQkJCQkJICAgY2x1biwgLyphbGxvYyovRkFMU0UpOworCQkJaWYgKGRldiA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCisJCQlidXN5cSA9ICZkZXYtPmJ1c3lxOworCQkJd2hpbGUgKChhY21kID0gVEFJTFFfRklSU1QoYnVzeXEpKSAhPSBOVUxMKSB7CisJCQkJU2NzaV9DbW5kICpjbWQ7CisKKwkJCQljbWQgPSAmYWNtZF9zY3NpX2NtZChhY21kKTsKKwkJCQlUQUlMUV9SRU1PVkUoYnVzeXEsIGFjbWQsCisJCQkJCSAgICAgYWNtZF9saW5rcy50cWUpOworCQkJCWNvdW50Kys7CisJCQkJY21kLT5yZXN1bHQgPSBzdGF0dXMgPDwgMTY7CisJCQkJYWhkX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShhaGQsIGNtZCk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gKGNvdW50KTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF90aHJlYWRfcnVuX2NvbXBsZXRlX3F1ZXVlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl1X2xvbmcgZmxhZ3M7CisKKwlhaGRfbG9jayhhaGQsICZmbGFncyk7CisJZGVsX3RpbWVyKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcV90aW1lcik7CisJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmPSB+QUhEX1JVTl9DTVBMVF9RX1RJTUVSOworCWFoZF9saW51eF9ydW5fY29tcGxldGVfcXVldWUoYWhkKTsKKwlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9zdGFydF9kdihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisKKwkvKgorCSAqIEZyZWV6ZSB0aGUgc2ltcSBhbmQgc2lnbmFsIGFoZF9saW51eF9xdWV1ZSB0byBub3QgbGV0IGFueQorCSAqIG1vcmUgY29tbWFuZHMgdGhyb3VnaAorCSAqLworCWlmICgoYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmIEFIRF9EVl9BQ1RJVkUpID09IDApIHsKKyNpZmRlZiBBSERfREVCVUcKKwkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKQorCQkJcHJpbnRmKCIlczogU3RhcnRpbmcgRFZcbiIsIGFoZF9uYW1lKGFoZCkpOworI2VuZGlmCisKKwkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSERfRFZfQUNUSVZFOworCQlhaGRfZnJlZXplX3NpbXEoYWhkKTsKKworCQkvKiBXYWtlIHVwIHRoZSBEViBrdGhyZWFkICovCisJCXVwKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3NlbSk7CisJfQorfQorCitzdGF0aWMgaW50CithaGRfbGludXhfZHZfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkOworCWludAl0YXJnZXQ7CisJdV9sb25nCXM7CisKKwlhaGQgPSAoc3RydWN0IGFoZF9zb2Z0YyAqKWRhdGE7CisKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpCisJCXByaW50ZigiSW4gRFYgVGhyZWFkXG4iKTsKKyNlbmRpZgorCisJLyoKKwkgKiBDb21wbGV0ZSB0aHJlYWQgY3JlYXRpb24uCisJICovCisJbG9ja19rZXJuZWwoKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsNjApCisJLyoKKwkgKiBEb24ndCBjYXJlIGFib3V0IGFueSBzaWduYWxzLgorCSAqLworCXNpZ2luaXRzZXRpbnYoJmN1cnJlbnQtPmJsb2NrZWQsIDApOworCisJZGFlbW9uaXplKCk7CisJc3ByaW50ZihjdXJyZW50LT5jb21tLCAiYWhkX2R2XyVkIiwgYWhkLT51bml0KTsKKyNlbHNlCisJZGFlbW9uaXplKCJhaGRfZHZfJWQiLCBhaGQtPnVuaXQpOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX0ZSRUVaRTsKKyNlbmRpZgorCXVubG9ja19rZXJuZWwoKTsKKworCXdoaWxlICgxKSB7CisJCS8qCisJCSAqIFVzZSBkb3duX2ludGVycnVwdGlibGUoKSByYXRoZXIgdGhhbiBkb3duKCkgdG8KKwkJICogYXZvaWQgaW5jbHVzaW9uIGluIHRoZSBsb2FkIGF2ZXJhZ2UuCisJCSAqLworCQlkb3duX2ludGVycnVwdGlibGUoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2VtKTsKKworCQkvKiBDaGVjayB0byBzZWUgaWYgd2UndmUgYmVlbiBzaWduYWxlZCB0byBleGl0ICovCisJCWFoZF9sb2NrKGFoZCwgJnMpOworCQlpZiAoKGFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSERfRFZfU0hVVERPV04pICE9IDApIHsKKwkJCWFoZF91bmxvY2soYWhkLCAmcyk7CisJCQlicmVhazsKKwkJfQorCQlhaGRfdW5sb2NrKGFoZCwgJnMpOworCisjaWZkZWYgQUhEX0RFQlVHCisJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikKKwkJCXByaW50ZigiJXM6IEJlZ2lubmluZyBEb21haW4gVmFsaWRhdGlvblxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpKTsKKyNlbmRpZgorCisJCS8qCisJCSAqIFdhaXQgZm9yIGFueSBwZW5kaW5nIGNvbW1hbmRzIHRvIGRyYWluIGJlZm9yZSBwcm9jZWVkaW5nLgorCQkgKi8KKwkJYWhkX2xvY2soYWhkLCAmcyk7CisJCXdoaWxlIChMSVNUX0ZJUlNUKCZhaGQtPnBlbmRpbmdfc2NicykgIT0gTlVMTCkgeworCQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSERfRFZfV0FJVF9TSU1RX0VNUFRZOworCQkJYWhkX3VubG9jayhhaGQsICZzKTsKKwkJCWRvd25faW50ZXJydXB0aWJsZSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9zZW0pOworCQkJYWhkX2xvY2soYWhkLCAmcyk7CisJCX0KKworCQkvKgorCQkgKiBXYWl0IGZvciB0aGUgU0lNUSB0byBiZSByZWxlYXNlZCBzbyB0aGF0IERWIGlzIHRoZQorCQkgKiBvbmx5IHJlYXNvbiB0aGUgcXVldWUgaXMgZnJvemVuLgorCQkgKi8KKwkJd2hpbGUgKEFIRF9EVl9TSU1RX0ZST1pFTihhaGQpID09IDApIHsKKwkJCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgfD0gQUhEX0RWX1dBSVRfU0lNUV9SRUxFQVNFOworCQkJYWhkX3VubG9jayhhaGQsICZzKTsKKwkJCWRvd25faW50ZXJydXB0aWJsZSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9zZW0pOworCQkJYWhkX2xvY2soYWhkLCAmcyk7CisJCX0KKwkJYWhkX3VubG9jayhhaGQsICZzKTsKKworCQlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8IEFIRF9OVU1fVEFSR0VUUzsgdGFyZ2V0KyspCisJCQlhaGRfbGludXhfZHZfdGFyZ2V0KGFoZCwgdGFyZ2V0KTsKKworCQlhaGRfbG9jayhhaGQsICZzKTsKKwkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmPSB+QUhEX0RWX0FDVElWRTsKKwkJYWhkX3VubG9jayhhaGQsICZzKTsKKworCQkvKgorCQkgKiBSZWxlYXNlIHRoZSBTSU1RIHNvIHRoYXQgbm9ybWFsIGNvbW1hbmRzIGFyZQorCQkgKiBhbGxvd2VkIHRvIGNvbnRpbnVlIG9uIHRoZSBidXMuCisJCSAqLworCQlhaGRfcmVsZWFzZV9zaW1xKGFoZCk7CisJfQorCXVwKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmVoX3NlbSk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9raWxsX2R2X3RocmVhZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJdV9sb25nIHM7CisKKwlhaGRfbG9jayhhaGQsICZzKTsKKwlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9waWQgIT0gMCkgeworCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmZsYWdzIHw9IEFIRF9EVl9TSFVURE9XTjsKKwkJYWhkX3VubG9jayhhaGQsICZzKTsKKwkJdXAoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2VtKTsKKworCQkvKgorCQkgKiBVc2UgdGhlIGVoX3NlbSBhcyBhbiBpbmRpY2F0b3IgdGhhdCB0aGUKKwkJICogZHYgdGhyZWFkIGlzIGV4aXRpbmcuICBOb3RlIHRoYXQgdGhlIGR2CisJCSAqIHRocmVhZCBtdXN0IHN0aWxsIHJldHVybiBhZnRlciBwZXJmb3JtaW5nCisJCSAqIHRoZSB1cCBvbiBvdXIgc2VtYXBob3JlIGJlZm9yZSBpdCBoYXMKKwkJICogY29tcGxldGVseSBleGl0ZWQgdGhpcyBtb2R1bGUuICBVbmZvcnR1bmF0ZWx5LAorCQkgKiB0aGVyZSBzZWVtcyB0byBiZSBubyBlYXN5IHdheSB0byB3YWl0IGZvciB0aGUKKwkJICogZXhpdCBvZiBhIHRocmVhZCBmb3Igd2hpY2ggeW91IGFyZSBub3QgdGhlCisJCSAqIHBhcmVudCAoZHYgdGhyZWFkcyBhcmUgcGFyZW50ZWQgYnkgaW5pdCkuCisJCSAqIENyb3NzIHlvdXIgZmluZ2Vycy4uLgorCQkgKi8KKwkJZG93bigmYWhkLT5wbGF0Zm9ybV9kYXRhLT5laF9zZW0pOworCisJCS8qCisJCSAqIE1hcmsgdGhlIGR2IHRocmVhZCBhcyBhbHJlYWR5IGRlYWQuICBUaGlzCisJCSAqIGF2b2lkcyBhdHRlbXB0aW5nIHRvIGtpbGwgaXQgYSBzZWNvbmQgdGltZS4KKwkJICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBtdXN0IGtpbGwgdGhlCisJCSAqIERWIHRocmVhZCBiZWZvcmUgY2FsbGluZyBhaGRfZnJlZSgpIGluIHRoZQorCQkgKiBtb2R1bGUgc2h1dGRvd24gY2FzZSB0byBhdm9pZCBib2d1cyBsb2NraW5nCisJCSAqIGluIHRoZSBTQ1NJIG1pZC1sYXllciwgYnV0IHdlIGFoZF9mcmVlKCkgaXMKKwkJICogY2FsbGVkIHdpdGhvdXQga2lsbGluZyB0aGUgRFYgdGhyZWFkIGluIHRoZQorCQkgKiBpbnN0YW5jZSBkZXRhY2ggY2FzZSwgc28gYWhkX3BsYXRmb3JtX2ZyZWUoKQorCQkgKiBjYWxscyB1cyBhZ2FpbiB0byB2ZXJpZnkgdGhhdCB0aGUgRFYgdGhyZWFkCisJCSAqIGlzIGRlYWQuCisJCSAqLworCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3BpZCA9IDA7CisJfSBlbHNlIHsKKwkJYWhkX3VubG9jayhhaGQsICZzKTsKKwl9Cit9CisKKyNkZWZpbmUgQUhEX0xJTlVYX0RWX0lOUV9TSE9SVF9MRU4JMzYKKyNkZWZpbmUgQUhEX0xJTlVYX0RWX0lOUV9MRU4JCTI1NgorI2RlZmluZSBBSERfTElOVVhfRFZfVElNRU9VVAkJKEhaIC8gNCkKKworI2RlZmluZSBBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgbmV3c3RhdGUpIFwKKwlhaGRfc2V0X2R2X3N0YXRlKGFoZCwgdGFyZywgbmV3c3RhdGUsIF9fTElORV9fKQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3NldF9kdl9zdGF0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnLAorCQkgYWhkX2R2X3N0YXRlIG5ld3N0YXRlLCB1X2ludCBsaW5lKQoreworCWFoZF9kdl9zdGF0ZSBvbGRzdGF0ZTsKKworCW9sZHN0YXRlID0gdGFyZy0+ZHZfc3RhdGU7CisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKQorCQlwcmludGYoIiVzOiVkOiBHb2luZyBmcm9tIHN0YXRlICVkIHRvIHN0YXRlICVkXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgbGluZSwgb2xkc3RhdGUsIG5ld3N0YXRlKTsKKyNlbmRpZgorCisJaWYgKG9sZHN0YXRlID09IG5ld3N0YXRlKQorCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeSsrOworCWVsc2UKKwkJdGFyZy0+ZHZfc3RhdGVfcmV0cnkgPSAwOworCXRhcmctPmR2X3N0YXRlID0gbmV3c3RhdGU7Cit9CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfZHZfdGFyZ2V0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdGFyZ2V0X29mZnNldCkKK3sKKwlzdHJ1Y3QJIGFoZF9kZXZpbmZvIGRldmluZm87CisJc3RydWN0CSBhaGRfbGludXhfdGFyZ2V0ICp0YXJnOworCXN0cnVjdAkgc2NzaV9jbW5kICpjbWQ7CisJc3RydWN0CSBzY3NpX2RldmljZSAqc2NzaV9kZXY7CisJc3RydWN0CSBzY3NpX3NlbnNlX2RhdGEgKnNlbnNlOworCXVpbnQ4X3QgKmJ1ZmZlcjsKKwl1X2xvbmcJIHM7CisJdV9pbnQJIHRpbWVvdXQ7CisJaW50CSBlY2hvX3NpemU7CisKKwlzZW5zZSA9IE5VTEw7CisJYnVmZmVyID0gTlVMTDsKKwllY2hvX3NpemUgPSAwOworCWFoZF9sb2NrKGFoZCwgJnMpOworCXRhcmcgPSBhaGQtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0X29mZnNldF07CisJaWYgKHRhcmcgPT0gTlVMTCB8fCAodGFyZy0+ZmxhZ3MgJiBBSERfRFZfUkVRVUlSRUQpID09IDApIHsKKwkJYWhkX3VubG9jayhhaGQsICZzKTsKKwkJcmV0dXJuOworCX0KKwlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBhaGQtPm91cl9pZCwgdGFyZy0+dGFyZ2V0LCAvKmx1biovMCwKKwkJCSAgICB0YXJnLT5jaGFubmVsICsgJ0EnLCBST0xFX0lOSVRJQVRPUik7CisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOworCQlwcmludGYoIlBlcmZvcm1pbmcgRFZcbiIpOworCX0KKyNlbmRpZgorCisJYWhkX3VubG9jayhhaGQsICZzKTsKKworCWNtZCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNjc2lfY21uZCksIE1fREVWQlVGLCBNX1dBSVRPSyk7CisJc2NzaV9kZXYgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY3NpX2RldmljZSksIE1fREVWQlVGLCBNX1dBSVRPSyk7CisJc2NzaV9kZXYtPmhvc3QgPSBhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3Q7CisJc2NzaV9kZXYtPmlkID0gZGV2aW5mby50YXJnZXQ7CisJc2NzaV9kZXYtPmx1biA9IGRldmluZm8ubHVuOworCXNjc2lfZGV2LT5jaGFubmVsID0gZGV2aW5mby5jaGFubmVsIC0gJ0EnOworCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2NzaV9kZXYgPSBzY3NpX2RldjsKKworCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKKworCXdoaWxlICh0YXJnLT5kdl9zdGF0ZSAhPSBBSERfRFZfU1RBVEVfRVhJVCkgeworCQl0aW1lb3V0ID0gQUhEX0xJTlVYX0RWX1RJTUVPVVQ7CisJCXN3aXRjaCAodGFyZy0+ZHZfc3RhdGUpIHsKKwkJY2FzZSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DOgorCQljYXNlIEFIRF9EVl9TVEFURV9JTlFfQVNZTkM6CisJCWNhc2UgQUhEX0RWX1NUQVRFX0lOUV9BU1lOQ19WRVJJRlk6CisJCQkvKgorCQkJICogU2V0IHRoaW5ncyB0byBhc3luYyBuYXJyb3cgdG8gcmVkdWNlIHRoZQorCQkJICogY2hhbmNlIHRoYXQgdGhlIElOUSB3aWxsIGZhaWwuCisJCQkgKi8KKwkJCWFoZF9sb2NrKGFoZCwgJnMpOworCQkJYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLCAwLCAwLCAwLAorCQkJCQkgQUhEX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9GQUxTRSk7CisJCQlhaGRfc2V0X3dpZHRoKGFoZCwgJmRldmluZm8sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisJCQkJICAgICAgQUhEX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9GQUxTRSk7CisJCQlhaGRfdW5sb2NrKGFoZCwgJnMpOworCQkJdGltZW91dCA9IDEwICogSFo7CisJCQl0YXJnLT5mbGFncyAmPSB+QUhEX0lOUV9WQUxJRDsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgQUhEX0RWX1NUQVRFX0lOUV9WRVJJRlk6CisJCXsKKwkJCXVfaW50IGlucV9sZW47CisKKwkJCWlmICh0YXJnLT5kdl9zdGF0ZSA9PSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKQorCQkJCWlucV9sZW4gPSBBSERfTElOVVhfRFZfSU5RX1NIT1JUX0xFTjsKKwkJCWVsc2UKKwkJCQlpbnFfbGVuID0gdGFyZy0+aW5xX2RhdGEtPmFkZGl0aW9uYWxfbGVuZ3RoICsgNTsKKwkJCWFoZF9saW51eF9kdl9pbnEoYWhkLCBjbWQsICZkZXZpbmZvLCB0YXJnLCBpbnFfbGVuKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQUhEX0RWX1NUQVRFX1RVUjoKKwkJY2FzZSBBSERfRFZfU1RBVEVfQlVTWToKKwkJCXRpbWVvdXQgPSA1ICogSFo7CisJCQlhaGRfbGludXhfZHZfdHVyKGFoZCwgY21kLCAmZGV2aW5mbyk7CisJCQlicmVhazsKKwkJY2FzZSBBSERfRFZfU1RBVEVfUkVCRDoKKwkJCWFoZF9saW51eF9kdl9yZWJkKGFoZCwgY21kLCAmZGV2aW5mbywgdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSBBSERfRFZfU1RBVEVfV0VCOgorCQkJYWhkX2xpbnV4X2R2X3dlYihhaGQsIGNtZCwgJmRldmluZm8sIHRhcmcpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBSERfRFZfU1RBVEVfUkVCOgorCQkJYWhkX2xpbnV4X2R2X3JlYihhaGQsIGNtZCwgJmRldmluZm8sIHRhcmcpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBSERfRFZfU1RBVEVfU1U6CisJCQlhaGRfbGludXhfZHZfc3UoYWhkLCBjbWQsICZkZXZpbmZvLCB0YXJnKTsKKwkJCXRpbWVvdXQgPSA1MCAqIEhaOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOworCQkJcHJpbnRmKCJVbmtub3duIERWIHN0YXRlICVkXG4iLCB0YXJnLT5kdl9zdGF0ZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIFF1ZXVlIHRoZSBjb21tYW5kIGFuZCB3YWl0IGZvciBpdCB0byBjb21wbGV0ZSAqLworCQkvKiBBYnVzZSBlaF90aW1lb3V0IGluIHRoZSBzY3NpX2NtbmQgc3RydWN0IGZvciBvdXIgcHVycG9zZXMgKi8KKwkJaW5pdF90aW1lcigmY21kLT5laF90aW1lb3V0KTsKKyNpZmRlZiBBSERfREVCVUcKKwkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NRVNTQUdFUykgIT0gMCkKKwkJCS8qCisJCQkgKiBBbGwgb2YgdGhlIHByaW50ZnMgZHVyaW5nIG5lZ290aWF0aW9uCisJCQkgKiByZWFsbHkgc2xvdyBkb3duIHRoZSBuZWdvdGlhdGlvbi4KKwkJCSAqIEFkZCBhIGJpdCBvZiB0aW1lIGp1c3QgdG8gYmUgc2FmZS4KKwkJCSAqLworCQkJdGltZW91dCArPSBIWjsKKyNlbmRpZgorCQlzY3NpX2FkZF90aW1lcihjbWQsIHRpbWVvdXQsIGFoZF9saW51eF9kdl90aW1lb3V0KTsKKwkJLyoKKwkJICogSW4gMi41LlgsIGl0IGlzIGFzc3VtZWQgdGhhdCBhbGwgY2FsbHMgZnJvbSB0aGUKKwkJICogIm1pZGxheWVyIiAod2hpY2ggd2UgYXJlIGVtdWxhdGluZykgd2lsbCBoYXZlIHRoZQorCQkgKiBhaGQgaG9zdCBsb2NrIGhlbGQuICBGb3Igb3RoZXIga2VybmVscywgdGhlCisJCSAqIGlvX3JlcXVlc3RfbG9jayBtdXN0IGJlIGhlbGQuCisJCSAqLworI2lmIEFIRF9TQ1NJX0hBU19IT1NUX0xPQ0sgIT0gMAorCQlhaGRfbG9jayhhaGQsICZzKTsKKyNlbHNlCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb19yZXF1ZXN0X2xvY2ssIHMpOworI2VuZGlmCisJCWFoZF9saW51eF9xdWV1ZShjbWQsIGFoZF9saW51eF9kdl9jb21wbGV0ZSk7CisjaWYgQUhEX1NDU0lfSEFTX0hPU1RfTE9DSyAhPSAwCisJCWFoZF91bmxvY2soYWhkLCAmcyk7CisjZWxzZQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb19yZXF1ZXN0X2xvY2ssIHMpOworI2VuZGlmCisJCWRvd25faW50ZXJydXB0aWJsZSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9jbWRfc2VtKTsKKwkJLyoKKwkJICogV2FpdCBmb3IgdGhlIFNJTVEgdG8gYmUgcmVsZWFzZWQgc28gdGhhdCBEViBpcyB0aGUKKwkJICogb25seSByZWFzb24gdGhlIHF1ZXVlIGlzIGZyb3plbi4KKwkJICovCisJCWFoZF9sb2NrKGFoZCwgJnMpOworCQl3aGlsZSAoQUhEX0RWX1NJTVFfRlJPWkVOKGFoZCkgPT0gMCkgeworCQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSERfRFZfV0FJVF9TSU1RX1JFTEVBU0U7CisJCQlhaGRfdW5sb2NrKGFoZCwgJnMpOworCQkJZG93bl9pbnRlcnJ1cHRpYmxlKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3NlbSk7CisJCQlhaGRfbG9jayhhaGQsICZzKTsKKwkJfQorCQlhaGRfdW5sb2NrKGFoZCwgJnMpOworCisJCWFoZF9saW51eF9kdl90cmFuc2l0aW9uKGFoZCwgY21kLCAmZGV2aW5mbywgdGFyZyk7CisJfQorCitvdXQ6CisJaWYgKCh0YXJnLT5mbGFncyAmIEFIRF9JTlFfVkFMSUQpICE9IDAKKwkgJiYgYWhkX2xpbnV4X2dldF9kZXZpY2UoYWhkLCBkZXZpbmZvLmNoYW5uZWwgLSAnQScsCisJCQkJIGRldmluZm8udGFyZ2V0LCBkZXZpbmZvLmx1biwKKwkJCQkgLyphbGxvYyovRkFMU0UpID09IE5VTEwpIHsKKwkJLyoKKwkJICogVGhlIERWIHN0YXRlIG1hY2hpbmUgZmFpbGVkIHRvIGNvbmZpZ3VyZSB0aGlzIGRldmljZS4gIAorCQkgKiBUaGlzIGlzIG5vcm1hbCBpZiBEViBpcyBkaXNhYmxlZC4gIFNpbmNlIHdlIGhhdmUgaW5xdWlyeQorCQkgKiBkYXRhLCBmaWx0ZXIgaXQgYW5kIHVzZSB0aGUgIm9wdGltaXN0aWMiIG5lZ290aWF0aW9uCisJCSAqIHBhcmFtZXRlcnMgZm91bmQgaW4gdGhlIGlucXVpcnkgc3RyaW5nLgorCQkgKi8KKwkJYWhkX2xpbnV4X2ZpbHRlcl9pbnF1aXJ5KGFoZCwgJmRldmluZm8pOworCQlpZiAoKHRhcmctPmZsYWdzICYgKEFIRF9CQVNJQ19EVnxBSERfRU5IQU5DRURfRFYpKSAhPSAwKSB7CisJCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsICZkZXZpbmZvKTsKKwkJCXByaW50ZigiRFYgZmFpbGVkIHRvIGNvbmZpZ3VyZSBkZXZpY2UuICAiCisJCQkgICAgICAgIlBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydCBhZ2FpbnN0ICIKKwkJCSAgICAgICAidGhpcyBkcml2ZXIuXG4iKTsKKwkJfQorCX0KKworCWlmIChjbWQgIT0gTlVMTCkKKwkJZnJlZShjbWQsIE1fREVWQlVGKTsKKworCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3Njc2lfZGV2ICE9IE5VTEwpIHsKKwkJZnJlZShhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3Njc2lfZGV2LCBNX0RFVkJVRik7CisJCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2NzaV9kZXYgPSBOVUxMOworCX0KKworCWFoZF9sb2NrKGFoZCwgJnMpOworCWlmICh0YXJnLT5kdl9idWZmZXIgIT0gTlVMTCkgeworCQlmcmVlKHRhcmctPmR2X2J1ZmZlciwgTV9ERVZCVUYpOworCQl0YXJnLT5kdl9idWZmZXIgPSBOVUxMOworCX0KKwlpZiAodGFyZy0+ZHZfYnVmZmVyMSAhPSBOVUxMKSB7CisJCWZyZWUodGFyZy0+ZHZfYnVmZmVyMSwgTV9ERVZCVUYpOworCQl0YXJnLT5kdl9idWZmZXIxID0gTlVMTDsKKwl9CisJdGFyZy0+ZmxhZ3MgJj0gfkFIRF9EVl9SRVFVSVJFRDsKKwlpZiAodGFyZy0+cmVmY291bnQgPT0gMCkKKwkJYWhkX2xpbnV4X2ZyZWVfdGFyZ2V0KGFoZCwgdGFyZyk7CisJYWhkX3VubG9jayhhaGQsICZzKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorYWhkX2xpbnV4X2R2X2ZhbGxiYWNrKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKQoreworCXVfbG9uZyBzOworCWludCByZXR2YWw7CisKKwlhaGRfbG9jayhhaGQsICZzKTsKKwlyZXR2YWwgPSBhaGRfbGludXhfZmFsbGJhY2soYWhkLCBkZXZpbmZvKTsKKwlhaGRfdW5sb2NrKGFoZCwgJnMpOworCisJcmV0dXJuIChyZXR2YWwpOworfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X2R2X3RyYW5zaXRpb24oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQlzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQlzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZykKK3sKKwl1X2ludDMyX3Qgc3RhdHVzOworCisJc3RhdHVzID0gYWljX2Vycm9yX2FjdGlvbihjbWQsIHRhcmctPmlucV9kYXRhLAorCQkJCSAgYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCksCisJCQkJICBhaGRfY21kX2dldF9zY3NpX3N0YXR1cyhjbWQpKTsKKworCQorI2lmZGVmIEFIRF9ERUJVRworCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgeworCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOworCQlwcmludGYoIkVudGVyaW5nIGFoZF9saW51eF9kdl90cmFuc2l0aW9uLCBzdGF0ZT0gJWQsICIKKwkJICAgICAgICJzdGF0dXM9IDB4JXgsIGNtZC0+cmVzdWx0PSAweCV4XG4iLCB0YXJnLT5kdl9zdGF0ZSwKKwkJICAgICAgIHN0YXR1cywgY21kLT5yZXN1bHQpOworCX0KKyNlbmRpZgorCisJc3dpdGNoICh0YXJnLT5kdl9zdGF0ZSkgeworCWNhc2UgQUhEX0RWX1NUQVRFX0lOUV9TSE9SVF9BU1lOQzoKKwljYXNlIEFIRF9EVl9TVEFURV9JTlFfQVNZTkM6CisJCXN3aXRjaCAoc3RhdHVzICYgU1NfTUFTSykgeworCQljYXNlIFNTX05PUDoKKwkJeworCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIHRhcmctPmR2X3N0YXRlKzEpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTU19JTlFfUkVGUkVTSDoKKwkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAorCQkJCQkgQUhEX0RWX1NUQVRFX0lOUV9TSE9SVF9BU1lOQyk7CisJCQlicmVhazsKKwkJY2FzZSBTU19UVVI6CisJCWNhc2UgU1NfUkVUUlk6CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOworCQkJaWYgKGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpCisJCQkgPT0gQ0FNX1JFUVVFVUVfUkVRKQorCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07CisJCQlpZiAoKHN0YXR1cyAmIFNTX0VSUk1BU0spID09IEVCVVNZKQorCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfQlVTWSk7CisJCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPCAxMCkKKwkJCQlicmVhazsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWRlZmF1bHQ6CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOworI2lmZGVmIEFIRF9ERUJVRworCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKKwkJCQlwcmludGYoIkZhaWxlZCBEViBpbnF1aXJ5LCBza2lwcGluZ1xuIik7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgQUhEX0RWX1NUQVRFX0lOUV9BU1lOQ19WRVJJRlk6CisJCXN3aXRjaCAoc3RhdHVzICYgU1NfTUFTSykgeworCQljYXNlIFNTX05PUDoKKwkJeworCQkJdV9pbnQgeHBvcnRmbGFnczsKKwkJCXVfaW50IHNwaTNkYXRhOworCisJCQlpZiAobWVtY21wKHRhcmctPmlucV9kYXRhLCB0YXJnLT5kdl9idWZmZXIsCisJCQkJICAgQUhEX0xJTlVYX0RWX0lOUV9MRU4pICE9IDApIHsKKwkJCQkvKgorCQkJCSAqIElucXVpcnkgZGF0YSBtdXN0IGhhdmUgY2hhbmdlZC4KKwkJCQkgKiBUcnkgZnJvbSB0aGUgdG9wIGFnYWluLgorCQkJCSAqLworCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAorCQkJCQkJIEFIRF9EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgdGFyZy0+ZHZfc3RhdGUrMSk7CisJCQl0YXJnLT5mbGFncyB8PSBBSERfSU5RX1ZBTElEOworCQkJaWYgKGFoZF9saW51eF91c2VyX2R2X3NldHRpbmcoYWhkKSA9PSAwKQorCQkJCWJyZWFrOworCisJCQl4cG9ydGZsYWdzID0gdGFyZy0+aW5xX2RhdGEtPmZsYWdzOworCQkJaWYgKCh4cG9ydGZsYWdzICYgKFNJRF9TeW5jfFNJRF9XQnVzMTYpKSA9PSAwKQorCQkJCWJyZWFrOworCisJCQlzcGkzZGF0YSA9IHRhcmctPmlucV9kYXRhLT5zcGkzZGF0YTsKKwkJCXN3aXRjaCAoc3BpM2RhdGEgJiBTSURfU1BJX0NMT0NLX0RUX1NUKSB7CisJCQlkZWZhdWx0OgorCQkJY2FzZSBTSURfU1BJX0NMT0NLX1NUOgorCQkJCS8qIEFzc3VtZSBvbmx5IGJhc2ljIERWIGlzIHN1cHBvcnRlZC4gKi8KKwkJCQl0YXJnLT5mbGFncyB8PSBBSERfQkFTSUNfRFY7CisJCQkJYnJlYWs7CisJCQljYXNlIFNJRF9TUElfQ0xPQ0tfRFQ6CisJCQljYXNlIFNJRF9TUElfQ0xPQ0tfRFRfU1Q6CisJCQkJdGFyZy0+ZmxhZ3MgfD0gQUhEX0VOSEFOQ0VEX0RWOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTU19JTlFfUkVGUkVTSDoKKwkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAorCQkJCQkgQUhEX0RWX1NUQVRFX0lOUV9TSE9SVF9BU1lOQyk7CisJCQlicmVhazsKKwkJY2FzZSBTU19UVVI6CisJCWNhc2UgU1NfUkVUUlk6CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOworCQkJaWYgKGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpCisJCQkgPT0gQ0FNX1JFUVVFVUVfUkVRKQorCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07CisKKwkJCWlmICgoc3RhdHVzICYgU1NfRVJSTUFTSykgPT0gRUJVU1kpCisJCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9CVVNZKTsKKwkJCWlmICh0YXJnLT5kdl9zdGF0ZV9yZXRyeSA8IDEwKQorCQkJCWJyZWFrOworCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJZGVmYXVsdDoKKwkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7CisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKKwkJCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOworCQkJCXByaW50ZigiRmFpbGVkIERWIGlucXVpcnksIHNraXBwaW5nXG4iKTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBSERfRFZfU1RBVEVfSU5RX1ZFUklGWToKKwkJc3dpdGNoIChzdGF0dXMgJiBTU19NQVNLKSB7CisJCWNhc2UgU1NfTk9QOgorCQl7CisKKwkJCWlmIChtZW1jbXAodGFyZy0+aW5xX2RhdGEsIHRhcmctPmR2X2J1ZmZlciwKKwkJCQkgICBBSERfTElOVVhfRFZfSU5RX0xFTikgPT0gMCkgeworCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7CisJCQkJYnJlYWs7CisJCQl9CisKKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgeworCQkJCWludCBpOworCisJCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKKwkJCQlwcmludGYoIklucXVpcnkgYnVmZmVyIG1pc21hdGNoOiIpOworCQkJCWZvciAoaSA9IDA7IGkgPCBBSERfTElOVVhfRFZfSU5RX0xFTjsgaSsrKSB7CisJCQkJCWlmICgoaSAmIDB4RikgPT0gMCkKKwkJCQkJCXByaW50ZigiXG4gICAgICAgICIpOworCQkJCQlwcmludGYoIjB4JXg6MHgwJXggIiwKKwkJCQkJICAgICAgICgodWludDhfdCAqKXRhcmctPmlucV9kYXRhKVtpXSwgCisJCQkJCSAgICAgICB0YXJnLT5kdl9idWZmZXJbaV0pOworCQkJCX0KKwkJCQlwcmludGYoIlxuIik7CisJCQl9CisjZW5kaWYKKworCQkJaWYgKGFoZF9saW51eF9kdl9mYWxsYmFjayhhaGQsIGRldmluZm8pICE9IDApIHsKKwkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyoKKwkJCSAqIERvIG5vdCBjb3VudCAiZmFsbGluZyBiYWNrIgorCQkJICogYWdhaW5zdCBvdXIgcmV0cmllcy4KKwkJCSAqLworCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnkgPSAwOworCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU1NfSU5RX1JFRlJFU0g6CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywKKwkJCQkJIEFIRF9EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCQkJYnJlYWs7CisJCWNhc2UgU1NfVFVSOgorCQljYXNlIFNTX1JFVFJZOgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKKwkJCWlmIChhaGRfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQorCQkJID09IENBTV9SRVFVRVVFX1JFUSkgeworCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07CisJCQl9IGVsc2UgaWYgKChzdGF0dXMgJiBTU1FfRkFMTEJBQ0spICE9IDApIHsKKwkJCQlpZiAoYWhkX2xpbnV4X2R2X2ZhbGxiYWNrKGFoZCwgZGV2aW5mbykgIT0gMCkgeworCQkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywKKwkJCQkJCQkgQUhEX0RWX1NUQVRFX0VYSVQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBEbyBub3QgY291bnQgImZhbGxpbmcgYmFjayIKKwkJCQkgKiBhZ2FpbnN0IG91ciByZXRyaWVzLgorCQkJCSAqLworCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5ID0gMDsKKwkJCX0gZWxzZSBpZiAoKHN0YXR1cyAmIFNTX0VSUk1BU0spID09IEVCVVNZKQorCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfQlVTWSk7CisJCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPCAxMCkKKwkJCQlicmVhazsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWRlZmF1bHQ6CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOworI2lmZGVmIEFIRF9ERUJVRworCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKKwkJCQlwcmludGYoIkZhaWxlZCBEViBpbnF1aXJ5LCBza2lwcGluZ1xuIik7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBSERfRFZfU1RBVEVfVFVSOgorCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKKwkJY2FzZSBTU19OT1A6CisJCQlpZiAoKHRhcmctPmZsYWdzICYgQUhEX0JBU0lDX0RWKSAhPSAwKSB7CisJCQkJYWhkX2xpbnV4X2ZpbHRlcl9pbnF1aXJ5KGFoZCwgZGV2aW5mbyk7CisJCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCisJCQkJCQkgQUhEX0RWX1NUQVRFX0lOUV9WRVJJRlkpOworCQkJfSBlbHNlIGlmICgodGFyZy0+ZmxhZ3MgJiBBSERfRU5IQU5DRURfRFYpICE9IDApIHsKKwkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX1JFQkQpOworCQkJfSBlbHNlIHsKKwkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1NfUkVUUlk6CisJCWNhc2UgU1NfVFVSOgorCQkJaWYgKChzdGF0dXMgJiBTU19FUlJNQVNLKSA9PSBFQlVTWSkgeworCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfQlVTWSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOworCQkJaWYgKGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpCisJCQkgPT0gQ0FNX1JFUVVFVUVfUkVRKSB7CisJCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnktLTsKKwkJCX0gZWxzZSBpZiAoKHN0YXR1cyAmIFNTUV9GQUxMQkFDSykgIT0gMCkgeworCQkJCWlmIChhaGRfbGludXhfZHZfZmFsbGJhY2soYWhkLCBkZXZpbmZvKSAhPSAwKSB7CisJCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAorCQkJCQkJCSBBSERfRFZfU1RBVEVfRVhJVCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIERvIG5vdCBjb3VudCAiZmFsbGluZyBiYWNrIgorCQkJCSAqIGFnYWluc3Qgb3VyIHJldHJpZXMuCisJCQkJICovCisJCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnkgPSAwOworCQkJfQorCQkJaWYgKHRhcmctPmR2X3N0YXRlX3JldHJ5ID49IDEwKSB7CisjaWZkZWYgQUhEX0RFQlVHCisJCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCQkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7CisJCQkJCXByaW50ZigiRFYgVFVSIHJldGllcyBleGhhdXN0ZWRcbiIpOworCQkJCX0KKyNlbmRpZgorCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3RhdHVzICYgU1NRX0RFTEFZKQorCQkJCXNzbGVlcCgxKTsKKworCQkJYnJlYWs7CisJCWNhc2UgU1NfU1RBUlQ6CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX1NVKTsKKwkJCWJyZWFrOworCQljYXNlIFNTX0lOUV9SRUZSRVNIOgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCisJCQkJCSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBSERfRFZfU1RBVEVfUkVCRDoKKwkJc3dpdGNoIChzdGF0dXMgJiBTU19NQVNLKSB7CisJCWNhc2UgU1NfTk9QOgorCQl7CisJCQl1aW50MzJfdCBlY2hvX3NpemU7CisKKwkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfV0VCKTsKKwkJCWVjaG9fc2l6ZSA9IHNjc2lfM2J0b3VsKCZ0YXJnLT5kdl9idWZmZXJbMV0pOworCQkJZWNob19zaXplICY9IDB4MUZGRjsKKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgeworCQkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7CisJCQkJcHJpbnRmKCJFY2hvIGJ1ZmZlciBzaXplPSAlZFxuIiwgZWNob19zaXplKTsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKGVjaG9fc2l6ZSA9PSAwKSB7CisJCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogR2VuZXJhdGUgdGhlIGJ1ZmZlciBwYXR0ZXJuICovCisJCQl0YXJnLT5kdl9lY2hvX3NpemUgPSBlY2hvX3NpemU7CisJCQlhaGRfbGludXhfZ2VuZXJhdGVfZHZfcGF0dGVybih0YXJnKTsKKwkJCS8qCisJCQkgKiBTZXR1cCBpbml0aWFsIG5lZ290aWF0aW9uIHZhbHVlcy4KKwkJCSAqLworCQkJYWhkX2xpbnV4X2ZpbHRlcl9pbnF1aXJ5KGFoZCwgZGV2aW5mbyk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNTX0lOUV9SRUZSRVNIOgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCisJCQkJCSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKKwkJCWJyZWFrOworCQljYXNlIFNTX1JFVFJZOgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKKwkJCWlmIChhaGRfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQorCQkJID09IENBTV9SRVFVRVVFX1JFUSkKKwkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeS0tOworCQkJaWYgKHRhcmctPmR2X3N0YXRlX3JldHJ5IDw9IDEwKQorCQkJCWJyZWFrOworI2lmZGVmIEFIRF9ERUJVRworCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKKwkJCQlwcmludGYoIkRWIFJFQkQgcmV0aWVzIGV4aGF1c3RlZFxuIik7CisJCQl9CisjZW5kaWYKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgU1NfRkFUQUw6CisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogU2V0dXAgaW5pdGlhbCBuZWdvdGlhdGlvbiB2YWx1ZXMKKwkJCSAqIGFuZCB0cnkgbGV2ZWwgMSBEVi4KKwkJCSAqLworCQkJYWhkX2xpbnV4X2ZpbHRlcl9pbnF1aXJ5KGFoZCwgZGV2aW5mbyk7CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0lOUV9WRVJJRlkpOworCQkJdGFyZy0+ZHZfZWNob19zaXplID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBSERfRFZfU1RBVEVfV0VCOgorCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKKwkJY2FzZSBTU19OT1A6CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX1JFQik7CisJCQlicmVhazsKKwkJY2FzZSBTU19JTlFfUkVGUkVTSDoKKwkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAorCQkJCQkgQUhEX0RWX1NUQVRFX0lOUV9TSE9SVF9BU1lOQyk7CisJCQlicmVhazsKKwkJY2FzZSBTU19SRVRSWToKKwkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCB0YXJnLT5kdl9zdGF0ZSk7CisJCQlpZiAoYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCkKKwkJCSA9PSBDQU1fUkVRVUVVRV9SRVEpIHsKKwkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeS0tOworCQkJfSBlbHNlIGlmICgoc3RhdHVzICYgU1NRX0ZBTExCQUNLKSAhPSAwKSB7CisJCQkJaWYgKGFoZF9saW51eF9kdl9mYWxsYmFjayhhaGQsIGRldmluZm8pICE9IDApIHsKKwkJCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCisJCQkJCQkJIEFIRF9EVl9TVEFURV9FWElUKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qCisJCQkJICogRG8gbm90IGNvdW50ICJmYWxsaW5nIGJhY2siCisJCQkJICogYWdhaW5zdCBvdXIgcmV0cmllcy4KKwkJCQkgKi8KKwkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeSA9IDA7CisJCQl9CisJCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPD0gMTApCisJCQkJYnJlYWs7CisJCQkvKiBGQUxMVEhST1VHSCAqLworI2lmZGVmIEFIRF9ERUJVRworCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKKwkJCQlwcmludGYoIkRWIFdFQiByZXRpZXMgZXhoYXVzdGVkXG4iKTsKKwkJCX0KKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBSERfRFZfU1RBVEVfUkVCOgorCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKKwkJY2FzZSBTU19OT1A6CisJCQlpZiAobWVtY21wKHRhcmctPmR2X2J1ZmZlciwgdGFyZy0+ZHZfYnVmZmVyMSwKKwkJCQkgICB0YXJnLT5kdl9lY2hvX3NpemUpICE9IDApIHsKKwkJCQlpZiAoYWhkX2xpbnV4X2R2X2ZhbGxiYWNrKGFoZCwgZGV2aW5mbykgIT0gMCkKKwkJCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCisJCQkJCQkJIEFIRF9EVl9TVEFURV9FWElUKTsKKwkJCQllbHNlCisJCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAorCQkJCQkJCSBBSERfRFZfU1RBVEVfV0VCKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJaWYgKHRhcmctPmR2X2J1ZmZlciAhPSBOVUxMKSB7CisJCQkJZnJlZSh0YXJnLT5kdl9idWZmZXIsIE1fREVWQlVGKTsKKwkJCQl0YXJnLT5kdl9idWZmZXIgPSBOVUxMOworCQkJfQorCQkJaWYgKHRhcmctPmR2X2J1ZmZlcjEgIT0gTlVMTCkgeworCQkJCWZyZWUodGFyZy0+ZHZfYnVmZmVyMSwgTV9ERVZCVUYpOworCQkJCXRhcmctPmR2X2J1ZmZlcjEgPSBOVUxMOworCQkJfQorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKKwkJCWJyZWFrOworCQljYXNlIFNTX0lOUV9SRUZSRVNIOgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCisJCQkJCSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKKwkJCWJyZWFrOworCQljYXNlIFNTX1JFVFJZOgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKKwkJCWlmIChhaGRfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQorCQkJID09IENBTV9SRVFVRVVFX1JFUSkgeworCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07CisJCQl9IGVsc2UgaWYgKChzdGF0dXMgJiBTU1FfRkFMTEJBQ0spICE9IDApIHsKKwkJCQlpZiAoYWhkX2xpbnV4X2R2X2ZhbGxiYWNrKGFoZCwgZGV2aW5mbykgIT0gMCkgeworCQkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywKKwkJCQkJCQkgQUhEX0RWX1NUQVRFX0VYSVQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9XRUIpOworCQkJfQorCQkJaWYgKHRhcmctPmR2X3N0YXRlX3JldHJ5IDw9IDEwKSB7CisJCQkJaWYgKChzdGF0dXMgJiAoU1NRX0RFTEFZX1JBTkRPTXxTU1FfREVMQVkpKSE9IDApCisJCQkJCW1zbGVlcChhaGQtPm91cl9pZCoxMDAwLzEwKTsKKwkJCQlicmVhazsKKwkJCX0KKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgeworCQkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7CisJCQkJcHJpbnRmKCJEViBSRUIgcmV0aWVzIGV4aGF1c3RlZFxuIik7CisJCQl9CisjZW5kaWYKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWRlZmF1bHQ6CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFIRF9EVl9TVEFURV9TVToKKwkJc3dpdGNoIChzdGF0dXMgJiBTU19NQVNLKSB7CisJCWNhc2UgU1NfTk9QOgorCQljYXNlIFNTX0lOUV9SRUZSRVNIOgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCisJCQkJCSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBSERfRFZfU1RBVEVfQlVTWToKKwkJc3dpdGNoIChzdGF0dXMgJiBTU19NQVNLKSB7CisJCWNhc2UgU1NfTk9QOgorCQljYXNlIFNTX0lOUV9SRUZSRVNIOgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCisJCQkJCSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKKwkJCWJyZWFrOworCQljYXNlIFNTX1RVUjoKKwkJY2FzZSBTU19SRVRSWToKKwkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCB0YXJnLT5kdl9zdGF0ZSk7CisJCQlpZiAoYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCkKKwkJCSA9PSBDQU1fUkVRVUVVRV9SRVEpIHsKKwkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeS0tOworCQkJfSBlbHNlIGlmICh0YXJnLT5kdl9zdGF0ZV9yZXRyeSA8IDYwKSB7CisJCQkJaWYgKChzdGF0dXMgJiBTU1FfREVMQVkpICE9IDApCisJCQkJCXNzbGVlcCgxKTsKKwkJCX0gZWxzZSB7CisjaWZkZWYgQUhEX0RFQlVHCisJCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCQkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7CisJCQkJCXByaW50ZigiRFYgQlVTWSByZXRpZXMgZXhoYXVzdGVkXG4iKTsKKwkJCQl9CisjZW5kaWYKKwkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGYoIiVzOiBJbnZhbGlkIERWIGNvbXBsZXRpb24gc3RhdGUgJWRcbiIsIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICB0YXJnLT5kdl9zdGF0ZSk7CisJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9kdl9maWxsX2NtZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJICAgICAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKQoreworCW1lbXNldChjbWQsIDAsIHNpemVvZihzdHJ1Y3Qgc2NzaV9jbW5kKSk7CisJY21kLT5kZXZpY2UgPSBhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3Njc2lfZGV2OworCWNtZC0+c2NzaV9kb25lID0gYWhkX2xpbnV4X2R2X2NvbXBsZXRlOworfQorCisvKgorICogU3ludGhlc2l6ZSBhbiBpbnF1aXJ5IGNvbW1hbmQuICBPbiB0aGUgcmV0dXJuIHRyaXAsIGl0J2xsIGJlCisgKiBzbmlmZmVkIGFuZCB0aGUgZGV2aWNlIHRyYW5zZmVyIHNldHRpbmdzIHNldCBmb3IgdXMuCisgKi8KK3N0YXRpYyB2b2lkCithaGRfbGludXhfZHZfaW5xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLCBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZywKKwkJIHVfaW50IHJlcXVlc3RfbGVuZ3RoKQoreworCisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7CisJCXByaW50ZigiU2VuZGluZyBJTlFcbiIpOworCX0KKyNlbmRpZgorCWlmICh0YXJnLT5pbnFfZGF0YSA9PSBOVUxMKQorCQl0YXJnLT5pbnFfZGF0YSA9IG1hbGxvYyhBSERfTElOVVhfRFZfSU5RX0xFTiwKKwkJCQkJTV9ERVZCVUYsIE1fV0FJVE9LKTsKKwlpZiAodGFyZy0+ZHZfc3RhdGUgPiBBSERfRFZfU1RBVEVfSU5RX0FTWU5DKSB7CisJCWlmICh0YXJnLT5kdl9idWZmZXIgIT0gTlVMTCkKKwkJCWZyZWUodGFyZy0+ZHZfYnVmZmVyLCBNX0RFVkJVRik7CisJCXRhcmctPmR2X2J1ZmZlciA9IG1hbGxvYyhBSERfTElOVVhfRFZfSU5RX0xFTiwKKwkJCQkJIE1fREVWQlVGLCBNX1dBSVRPSyk7CisJfQorCisJYWhkX2xpbnV4X2R2X2ZpbGxfY21kKGFoZCwgY21kLCBkZXZpbmZvKTsKKwljbWQtPnNjX2RhdGFfZGlyZWN0aW9uID0gU0NTSV9EQVRBX1JFQUQ7CisJY21kLT5jbWRfbGVuID0gNjsKKwljbWQtPmNtbmRbMF0gPSBJTlFVSVJZOworCWNtZC0+Y21uZFs0XSA9IHJlcXVlc3RfbGVuZ3RoOworCWNtZC0+cmVxdWVzdF9idWZmbGVuID0gcmVxdWVzdF9sZW5ndGg7CisJaWYgKHRhcmctPmR2X3N0YXRlID4gQUhEX0RWX1NUQVRFX0lOUV9BU1lOQykKKwkJY21kLT5yZXF1ZXN0X2J1ZmZlciA9IHRhcmctPmR2X2J1ZmZlcjsKKwllbHNlCisJCWNtZC0+cmVxdWVzdF9idWZmZXIgPSB0YXJnLT5pbnFfZGF0YTsKKwltZW1zZXQoY21kLT5yZXF1ZXN0X2J1ZmZlciwgMCwgQUhEX0xJTlVYX0RWX0lOUV9MRU4pOworfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X2R2X3R1cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbykKK3sKKworI2lmZGVmIEFIRF9ERUJVRworCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgeworCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOworCQlwcmludGYoIlNlbmRpbmcgVFVSXG4iKTsKKwl9CisjZW5kaWYKKwkvKiBEbyBhIFRVUiB0byBjbGVhciBvdXQgYW55IG5vbi1mYXRhbCB0cmFuc2l0aW9uYWwgc3RhdGUgKi8KKwlhaGRfbGludXhfZHZfZmlsbF9jbWQoYWhkLCBjbWQsIGRldmluZm8pOworCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfTk9ORTsKKwljbWQtPmNtZF9sZW4gPSA2OworCWNtZC0+Y21uZFswXSA9IFRFU1RfVU5JVF9SRUFEWTsKK30KKworI2RlZmluZSBBSERfUkVCRF9MRU4gNAorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X2R2X3JlYmQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCSBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnKQoreworCisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7CisJCXByaW50ZigiU2VuZGluZyBSRUJEXG4iKTsKKwl9CisjZW5kaWYKKwlpZiAodGFyZy0+ZHZfYnVmZmVyICE9IE5VTEwpCisJCWZyZWUodGFyZy0+ZHZfYnVmZmVyLCBNX0RFVkJVRik7CisJdGFyZy0+ZHZfYnVmZmVyID0gbWFsbG9jKEFIRF9SRUJEX0xFTiwgTV9ERVZCVUYsIE1fV0FJVE9LKTsKKwlhaGRfbGludXhfZHZfZmlsbF9jbWQoYWhkLCBjbWQsIGRldmluZm8pOworCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfUkVBRDsKKwljbWQtPmNtZF9sZW4gPSAxMDsKKwljbWQtPmNtbmRbMF0gPSBSRUFEX0JVRkZFUjsKKwljbWQtPmNtbmRbMV0gPSAweDBiOworCXNjc2lfdWx0bzNiKEFIRF9SRUJEX0xFTiwgJmNtZC0+Y21uZFs2XSk7CisJY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPSBBSERfUkVCRF9MRU47CisJY21kLT51bmRlcmZsb3cgPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwljbWQtPnJlcXVlc3RfYnVmZmVyID0gdGFyZy0+ZHZfYnVmZmVyOworfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X2R2X3dlYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywgc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcpCit7CisKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKKwkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKKwkJcHJpbnRmKCJTZW5kaW5nIFdFQlxuIik7CisJfQorI2VuZGlmCisJYWhkX2xpbnV4X2R2X2ZpbGxfY21kKGFoZCwgY21kLCBkZXZpbmZvKTsKKwljbWQtPnNjX2RhdGFfZGlyZWN0aW9uID0gU0NTSV9EQVRBX1dSSVRFOworCWNtZC0+Y21kX2xlbiA9IDEwOworCWNtZC0+Y21uZFswXSA9IFdSSVRFX0JVRkZFUjsKKwljbWQtPmNtbmRbMV0gPSAweDBhOworCXNjc2lfdWx0bzNiKHRhcmctPmR2X2VjaG9fc2l6ZSwgJmNtZC0+Y21uZFs2XSk7CisJY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPSB0YXJnLT5kdl9lY2hvX3NpemU7CisJY21kLT51bmRlcmZsb3cgPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwljbWQtPnJlcXVlc3RfYnVmZmVyID0gdGFyZy0+ZHZfYnVmZmVyOworfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X2R2X3JlYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywgc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcpCit7CisKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKKwkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKKwkJcHJpbnRmKCJTZW5kaW5nIFJFQlxuIik7CisJfQorI2VuZGlmCisJYWhkX2xpbnV4X2R2X2ZpbGxfY21kKGFoZCwgY21kLCBkZXZpbmZvKTsKKwljbWQtPnNjX2RhdGFfZGlyZWN0aW9uID0gU0NTSV9EQVRBX1JFQUQ7CisJY21kLT5jbWRfbGVuID0gMTA7CisJY21kLT5jbW5kWzBdID0gUkVBRF9CVUZGRVI7CisJY21kLT5jbW5kWzFdID0gMHgwYTsKKwlzY3NpX3VsdG8zYih0YXJnLT5kdl9lY2hvX3NpemUsICZjbWQtPmNtbmRbNl0pOworCWNtZC0+cmVxdWVzdF9idWZmbGVuID0gdGFyZy0+ZHZfZWNob19zaXplOworCWNtZC0+dW5kZXJmbG93ID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJY21kLT5yZXF1ZXN0X2J1ZmZlciA9IHRhcmctPmR2X2J1ZmZlcjE7Cit9CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfZHZfc3Uoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCXN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkJc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcpCit7CisJdV9pbnQgbGU7CisKKwlsZSA9IFNJRF9JU19SRU1PVkFCTEUodGFyZy0+aW5xX2RhdGEpID8gU1NTX0xPRUogOiAwOworCisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7CisJCXByaW50ZigiU2VuZGluZyBTVVxuIik7CisJfQorI2VuZGlmCisJYWhkX2xpbnV4X2R2X2ZpbGxfY21kKGFoZCwgY21kLCBkZXZpbmZvKTsKKwljbWQtPnNjX2RhdGFfZGlyZWN0aW9uID0gU0NTSV9EQVRBX05PTkU7CisJY21kLT5jbWRfbGVuID0gNjsKKwljbWQtPmNtbmRbMF0gPSBTVEFSVF9TVE9QX1VOSVQ7CisJY21kLT5jbW5kWzRdID0gbGUgfCBTU1NfU1RBUlQ7Cit9CisKK3N0YXRpYyBpbnQKK2FoZF9saW51eF9mYWxsYmFjayhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbykKK3sKKwlzdHJ1Y3QJYWhkX2xpbnV4X3RhcmdldCAqdGFyZzsKKwlzdHJ1Y3QJYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJc3RydWN0CWFoZF90cmFuc2luZm8gKmdvYWw7CisJc3RydWN0CWFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwl1X2ludAl3aWR0aDsKKwl1X2ludAlwZXJpb2Q7CisJdV9pbnQJb2Zmc2V0OworCXVfaW50CXBwcl9vcHRpb25zOworCXVfaW50CWN1cl9zcGVlZDsKKwl1X2ludAl3aWRlX3NwZWVkOworCXVfaW50CW5hcnJvd19zcGVlZDsKKwl1X2ludAlmYWxsYmFja19zcGVlZDsKKworI2lmZGVmIEFIRF9ERUJVRworCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgeworCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOworCQlwcmludGYoIlRyeWluZyB0byBmYWxsYmFja1xuIik7CisJfQorI2VuZGlmCisJdGFyZyA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+dGFyZ2V0c1tkZXZpbmZvLT50YXJnZXRfb2Zmc2V0XTsKKwl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCSAgICBkZXZpbmZvLT5vdXJfc2NzaWlkLAorCQkJCSAgICBkZXZpbmZvLT50YXJnZXQsICZ0c3RhdGUpOworCWdvYWwgPSAmdGluZm8tPmdvYWw7CisJd2lkdGggPSBnb2FsLT53aWR0aDsKKwlwZXJpb2QgPSBnb2FsLT5wZXJpb2Q7CisJb2Zmc2V0ID0gZ29hbC0+b2Zmc2V0OworCXBwcl9vcHRpb25zID0gZ29hbC0+cHByX29wdGlvbnM7CisJaWYgKG9mZnNldCA9PSAwKQorCQlwZXJpb2QgPSBBSERfQVNZTkNfWEZFUl9QRVJJT0Q7CisJaWYgKHRhcmctPmR2X25leHRfbmFycm93X3BlcmlvZCA9PSAwKQorCQl0YXJnLT5kdl9uZXh0X25hcnJvd19wZXJpb2QgPSBNQVgocGVyaW9kLCBBSERfU1lOQ1JBVEVfVUxUUkEyKTsKKwlpZiAodGFyZy0+ZHZfbmV4dF93aWRlX3BlcmlvZCA9PSAwKQorCQl0YXJnLT5kdl9uZXh0X3dpZGVfcGVyaW9kID0gcGVyaW9kOworCWlmICh0YXJnLT5kdl9tYXhfd2lkdGggPT0gMCkKKwkJdGFyZy0+ZHZfbWF4X3dpZHRoID0gd2lkdGg7CisJaWYgKHRhcmctPmR2X21heF9wcHJfb3B0aW9ucyA9PSAwKQorCQl0YXJnLT5kdl9tYXhfcHByX29wdGlvbnMgPSBwcHJfb3B0aW9uczsKKwlpZiAodGFyZy0+ZHZfbGFzdF9wcHJfb3B0aW9ucyA9PSAwKQorCQl0YXJnLT5kdl9sYXN0X3Bwcl9vcHRpb25zID0gcHByX29wdGlvbnM7CisKKwljdXJfc3BlZWQgPSBhaWNfY2FsY19zcGVlZCh3aWR0aCwgcGVyaW9kLCBvZmZzZXQsIEFIRF9TWU5DUkFURV9NSU4pOworCXdpZGVfc3BlZWQgPSBhaWNfY2FsY19zcGVlZChNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVCwKKwkJCQkJICB0YXJnLT5kdl9uZXh0X3dpZGVfcGVyaW9kLAorCQkJCQkgIE1BWF9PRkZTRVQsIEFIRF9TWU5DUkFURV9NSU4pOworCW5hcnJvd19zcGVlZCA9IGFpY19jYWxjX3NwZWVkKE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisJCQkJCSAgICB0YXJnLT5kdl9uZXh0X25hcnJvd19wZXJpb2QsCisJCQkJCSAgICBNQVhfT0ZGU0VULCBBSERfU1lOQ1JBVEVfTUlOKTsKKwlmYWxsYmFja19zcGVlZCA9IGFpY19jYWxjX3NwZWVkKHdpZHRoLCBwZXJpb2QrMSwgb2Zmc2V0LAorCQkJCQkgICAgICBBSERfU1lOQ1JBVEVfTUlOKTsKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKKwkJcHJpbnRmKCJjdXJfc3BlZWQ9ICVkLCB3aWRlX3NwZWVkPSAlZCwgbmFycm93X3NwZWVkPSAlZCwgIgorCQkgICAgICAgImZhbGxiYWNrX3NwZWVkPSAlZFxuIiwgY3VyX3NwZWVkLCB3aWRlX3NwZWVkLAorCQkgICAgICAgbmFycm93X3NwZWVkLCBmYWxsYmFja19zcGVlZCk7CisJfQorI2VuZGlmCisKKwlpZiAoY3VyX3NwZWVkID4gMTYwMDAwKSB7CisJCS8qCisJCSAqIFBhY2VkL0RUL0lVX1JFUSBvbmx5IHRyYW5zZmVyIHNwZWVkcy4gIEFsbCB3ZQorCQkgKiBjYW4gZG8gaXMgZmFsbGJhY2sgaW4gdGVybXMgb2Ygc3luY3JhdGUuCisJCSAqLworCQlwZXJpb2QrKzsKKwl9IGVsc2UgaWYgKGN1cl9zcGVlZCA+IDgwMDAwKSB7CisJCWlmICgocHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9JVV9SRVEpICE9IDApIHsKKwkJCS8qCisJCQkgKiBUcnkgd2l0aG91dCBJVV9SRVEgYXMgaXQgbWF5IGJlIGNvbmZ1c2luZworCQkJICogYW4gZXhwYW5kZXIuCisJCQkgKi8KKwkJCXBwcl9vcHRpb25zICY9IH5NU0dfRVhUX1BQUl9JVV9SRVE7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogUGFjZWQvRFQgb25seSB0cmFuc2ZlciBzcGVlZHMuICBBbGwgd2UKKwkJCSAqIGNhbiBkbyBpcyBmYWxsYmFjayBpbiB0ZXJtcyBvZiBzeW5jcmF0ZS4KKwkJCSAqLworCQkJcGVyaW9kKys7CisJCQlwcHJfb3B0aW9ucyA9IHRhcmctPmR2X21heF9wcHJfb3B0aW9uczsKKwkJfQorCX0gZWxzZSBpZiAoY3VyX3NwZWVkID4gMzMwMCkgeworCisJCS8qCisJCSAqIEluIHRoaXMgcmFuZ2Ugd2UgdGhlIGZvbGxvd2luZworCQkgKiBvcHRpb25zIG9yZGVyZWQgZnJvbSBoaWdoZXN0IHRvCisJCSAqIGxvd2VzdCBkZXNpcmVhYmlsaXR5OgorCQkgKgorCQkgKiBvIFdpZGUvRFQKKwkJICogbyBXaWRlL25vbi1EVAorCQkgKiBvIE5hcnJvdyBhdCBhIHBvdGVudGFsbHkgaGlnaGVyIHN5bmMgcmF0ZS4KKwkJICoKKwkJICogQWxsIG1vZGVzIGFyZSB0ZXN0ZWQgd2l0aCBhbmQgd2l0aG91dCBJVV9SRVEKKwkJICogc2V0IHNpbmNlIHVzaW5nIElVcyBtYXkgY29uZnVzZSBhbiBleHBhbmRlci4KKwkJICovCisJCWlmICgocHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9JVV9SRVEpICE9IDApIHsKKworCQkJcHByX29wdGlvbnMgJj0gfk1TR19FWFRfUFBSX0lVX1JFUTsKKwkJfSBlbHNlIGlmICgocHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9EVF9SRVEpICE9IDApIHsKKwkJCS8qCisJCQkgKiBUcnkgZ29pbmcgbm9uLURULgorCQkJICovCisJCQlwcHJfb3B0aW9ucyA9IHRhcmctPmR2X21heF9wcHJfb3B0aW9uczsKKwkJCXBwcl9vcHRpb25zICY9IH5NU0dfRVhUX1BQUl9EVF9SRVE7CisJCX0gZWxzZSBpZiAodGFyZy0+ZHZfbGFzdF9wcHJfb3B0aW9ucyAhPSAwKSB7CisJCQkvKgorCQkJICogVHJ5IHdpdGhvdXQgUUFTIG9yIGFueSBvdGhlciBQUFIgb3B0aW9ucy4KKwkJCSAqIFdlIG1heSBuZWVkIGEgbm9uLVBQUiBtZXNzYWdlIHRvIHdvcmsgd2l0aAorCQkJICogYW4gZXhwYW5kZXIuICBXZSBsb29rIGF0IHRoZSAibGFzdCBQUFIgb3B0aW9ucyIKKwkJCSAqIHNvIHdlIHdpbGwgcGVyZm9ybSB0aGlzIGZhbGxiYWNrIGV2ZW4gaWYgdGhlCisJCQkgKiB0YXJnZXQgcmVzcG9uZGVkIHRvIG91ciBQUFIgbmVnb3RpYXRpb24gd2l0aAorCQkJICogbm8gb3B0aW9uIGJpdHMgc2V0LgorCQkJICovCisJCQlwcHJfb3B0aW9ucyA9IDA7CisJCX0gZWxzZSBpZiAod2lkdGggPT0gTVNHX0VYVF9XRFRSX0JVU18xNl9CSVQpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgbmV4dCBuYXJyb3cgc3BlZWQgaXMgZ3JlYXRlciB0aGFuCisJCQkgKiB0aGUgbmV4dCB3aWRlIHNwZWVkLCBmYWxsYmFjayB0byBuYXJyb3cuCisJCQkgKiBPdGhlcndpc2UgZmFsbGJhY2sgdG8gdGhlIG5leHQgRFQvV2lkZSBzZXR0aW5nLgorCQkJICogVGhlIG5hcnJvdyBhc3luYyBzcGVlZCB3aWxsIGFsd2F5cyBiZSBzbWFsbGVyCisJCQkgKiB0aGFuIHRoZSB3aWRlIGFzeW5jIHNwZWVkLCBzbyBoYW5kbGUgdGhpcyBjYXNlCisJCQkgKiBzcGVjaWZpY2FsbHkuCisJCQkgKi8KKwkJCXBwcl9vcHRpb25zID0gdGFyZy0+ZHZfbWF4X3Bwcl9vcHRpb25zOworCQkJaWYgKG5hcnJvd19zcGVlZCA+IGZhbGxiYWNrX3NwZWVkCisJCQkgfHwgcGVyaW9kID49IEFIRF9BU1lOQ19YRkVSX1BFUklPRCkgeworCQkJCXRhcmctPmR2X25leHRfd2lkZV9wZXJpb2QgPSBwZXJpb2QrMTsKKwkJCQl3aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQ7CisJCQkJcGVyaW9kID0gdGFyZy0+ZHZfbmV4dF9uYXJyb3dfcGVyaW9kOworCQkJfSBlbHNlIHsKKwkJCQlwZXJpb2QrKzsKKwkJCX0KKwkJfSBlbHNlIGlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9XSURFKSAhPSAwCisJCQkmJiB0YXJnLT5kdl9tYXhfd2lkdGggIT0gMAorCQkJJiYgd2lkZV9zcGVlZCA+PSBmYWxsYmFja19zcGVlZAorCQkJJiYgKHRhcmctPmR2X25leHRfd2lkZV9wZXJpb2QgPD0gQUhEX0FTWU5DX1hGRVJfUEVSSU9ECisJCQkgfHwgcGVyaW9kID49IEFIRF9BU1lOQ19YRkVSX1BFUklPRCkpIHsKKworCQkJLyoKKwkJCSAqIFdlIGFyZSBuYXJyb3cuICBUcnkgZmFsbGluZyBiYWNrCisJCQkgKiB0byB0aGUgbmV4dCB3aWRlIHNwZWVkIHdpdGggCisJCQkgKiBhbGwgc3VwcG9ydGVkIHBwciBvcHRpb25zIHNldC4KKwkJCSAqLworCQkJdGFyZy0+ZHZfbmV4dF9uYXJyb3dfcGVyaW9kID0gcGVyaW9kKzE7CisJCQl3aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfMTZfQklUOworCQkJcGVyaW9kID0gdGFyZy0+ZHZfbmV4dF93aWRlX3BlcmlvZDsKKwkJCXBwcl9vcHRpb25zID0gdGFyZy0+ZHZfbWF4X3Bwcl9vcHRpb25zOworCQl9IGVsc2UgeworCQkJLyogT25seSBuYXJyb3cgZmFsbGJhY2sgaXMgYWxsb3dlZC4gKi8KKwkJCXBlcmlvZCsrOworCQkJcHByX29wdGlvbnMgPSB0YXJnLT5kdl9tYXhfcHByX29wdGlvbnM7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gKC0xKTsKKwl9CisJb2Zmc2V0ID0gTUFYX09GRlNFVDsKKwlhaGRfZmluZF9zeW5jcmF0ZShhaGQsICZwZXJpb2QsICZwcHJfb3B0aW9ucywgQUhEX1NZTkNSQVRFX1BBQ0VEKTsKKwlhaGRfc2V0X3dpZHRoKGFoZCwgZGV2aW5mbywgd2lkdGgsIEFIRF9UUkFOU19HT0FMLCBGQUxTRSk7CisJaWYgKHBlcmlvZCA9PSAwKSB7CisJCXBlcmlvZCA9IDA7CisJCW9mZnNldCA9IDA7CisJCXBwcl9vcHRpb25zID0gMDsKKwkJaWYgKHdpZHRoID09IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQpCisJCQl0YXJnLT5kdl9uZXh0X25hcnJvd19wZXJpb2QgPSBBSERfQVNZTkNfWEZFUl9QRVJJT0Q7CisJCWVsc2UKKwkJCXRhcmctPmR2X25leHRfd2lkZV9wZXJpb2QgPSBBSERfQVNZTkNfWEZFUl9QRVJJT0Q7CisJfQorCWFoZF9zZXRfc3luY3JhdGUoYWhkLCBkZXZpbmZvLCBwZXJpb2QsIG9mZnNldCwKKwkJCSBwcHJfb3B0aW9ucywgQUhEX1RSQU5TX0dPQUwsIEZBTFNFKTsKKwl0YXJnLT5kdl9sYXN0X3Bwcl9vcHRpb25zID0gcHByX29wdGlvbnM7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9kdl90aW1lb3V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QJYWhkX3NvZnRjICphaGQ7CisJc3RydWN0CXNjYiAqc2NiOworCXVfbG9uZwlmbGFnczsKKworCWFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhKTsKKwlhaGRfbG9jayhhaGQsICZmbGFncyk7CisKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKKwkJcHJpbnRmKCIlczogVGltZW91dCB3aGlsZSBkb2luZyBEViBjb21tYW5kICV4LlxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZC0+Y21uZFswXSk7CisJCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKKwl9CisjZW5kaWYKKwkKKwkvKgorCSAqIEd1YXJkIGFnYWluc3QgImRvbmUgcmFjZSIuICBObyBhY3Rpb24gaXMKKwkgKiByZXF1aXJlZCBpZiB3ZSBqdXN0IGNvbXBsZXRlZC4KKwkgKi8KKwlpZiAoKHNjYiA9IChzdHJ1Y3Qgc2NiICopY21kLT5ob3N0X3NjcmliYmxlKSA9PSBOVUxMKSB7CisJCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBDb21tYW5kIGhhcyBub3QgY29tcGxldGVkLiAgTWFyayB0aGlzCisJICogU0NCIGFzIGhhdmluZyBmYWlsaW5nIHN0YXR1cyBwcmlvciB0bworCSAqIHJlc2V0dGluZyB0aGUgYnVzLCBzbyB3ZSBnZXQgdGhlIGNvcnJlY3QKKwkgKiBlcnJvciBjb2RlLgorCSAqLworCWlmICgoc2NiLT5mbGFncyAmIFNDQl9TRU5TRSkgIT0gMCkKKwkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fQVVUT1NFTlNFX0ZBSUwpOworCWVsc2UKKwkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fQ01EX1RJTUVPVVQpOworCWFoZF9yZXNldF9jaGFubmVsKGFoZCwgY21kLT5kZXZpY2UtPmNoYW5uZWwgKyAnQScsIC8qaW5pdGlhdGUqL1RSVUUpOworCisJLyoKKwkgKiBBZGQgYSBtaW5pbWFsIGJ1cyBzZXR0bGUgZGVsYXkgZm9yIGRldmljZXMgdGhhdCBhcmUgc2xvdyB0bworCSAqIHJlc3BvbmQgYWZ0ZXIgYnVzIHJlc2V0cy4KKwkgKi8KKwlhaGRfZnJlZXplX3NpbXEoYWhkKTsKKwlpbml0X3RpbWVyKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyKTsKKwlhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyLmRhdGEgPSAodV9sb25nKWFoZDsKKwlhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyAyOworCWFoZC0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZnVuY3Rpb24gPQorCSAgICAoYWhkX2xpbnV4X2NhbGxiYWNrX3QgKilhaGRfcmVsZWFzZV9zaW1xOworCWFkZF90aW1lcigmYWhkLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lcik7CisJaWYgKGFoZF9saW51eF9uZXh0X2RldmljZV90b19ydW4oYWhkKSAhPSBOVUxMKQorCQlhaGRfc2NoZWR1bGVfcnVucShhaGQpOworCWFoZF9saW51eF9ydW5fY29tcGxldGVfcXVldWUoYWhkKTsKKwlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9kdl9jb21wbGV0ZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkOworCisJYWhkID0gKigoc3RydWN0IGFoZF9zb2Z0YyAqKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGEpOworCisJLyogRGVsZXRlIHRoZSBEViB0aW1lciBiZWZvcmUgaXQgZ29lcyBvZmYhICovCisJc2NzaV9kZWxldGVfdGltZXIoY21kKTsKKworI2lmZGVmIEFIRF9ERUJVRworCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikKKwkJcHJpbnRmKCIlczolYzolZDogQ29tbWFuZCBjb21wbGV0ZWQsIHN0YXR1cz0gMHgleFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCisJCSAgICAgICBjbWQtPnJlc3VsdCk7CisjZW5kaWYKKworCS8qIFdha2UgdXAgdGhlIHN0YXRlIG1hY2hpbmUgKi8KKwl1cCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9jbWRfc2VtKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9nZW5lcmF0ZV9kdl9wYXR0ZXJuKHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnKQoreworCXVpbnQxNl90IGI7CisJdV9pbnQJIGk7CisJdV9pbnQJIGo7CisKKwlpZiAodGFyZy0+ZHZfYnVmZmVyICE9IE5VTEwpCisJCWZyZWUodGFyZy0+ZHZfYnVmZmVyLCBNX0RFVkJVRik7CisJdGFyZy0+ZHZfYnVmZmVyID0gbWFsbG9jKHRhcmctPmR2X2VjaG9fc2l6ZSwgTV9ERVZCVUYsIE1fV0FJVE9LKTsKKwlpZiAodGFyZy0+ZHZfYnVmZmVyMSAhPSBOVUxMKQorCQlmcmVlKHRhcmctPmR2X2J1ZmZlcjEsIE1fREVWQlVGKTsKKwl0YXJnLT5kdl9idWZmZXIxID0gbWFsbG9jKHRhcmctPmR2X2VjaG9fc2l6ZSwgTV9ERVZCVUYsIE1fV0FJVE9LKTsKKworCWkgPSAwOworCisJYiA9IDB4MDAwMTsKKwlmb3IgKGogPSAwIDsgaSA8IHRhcmctPmR2X2VjaG9fc2l6ZTsgaisrKSB7CisJCWlmIChqIDwgMzIpIHsKKwkJCS8qCisJCQkgKiAzMmJ5dGVzIG9mIHNlcXVlbnRpYWwgbnVtYmVycy4KKwkJCSAqLworCQkJdGFyZy0+ZHZfYnVmZmVyW2krK10gPSBqICYgMHhmZjsKKwkJfSBlbHNlIGlmIChqIDwgNDgpIHsKKwkJCS8qCisJCQkgKiAzMmJ5dGVzIG9mIHJlcGVhdGluZyAweDAwMDAsIDB4ZmZmZi4KKwkJCSAqLworCQkJdGFyZy0+ZHZfYnVmZmVyW2krK10gPSAoaiAmIDB4MDIpID8gMHhmZiA6IDB4MDA7CisJCX0gZWxzZSBpZiAoaiA8IDY0KSB7CisJCQkvKgorCQkJICogMzJieXRlcyBvZiByZXBlYXRpbmcgMHg1NTU1LCAweGFhYWEuCisJCQkgKi8KKwkJCXRhcmctPmR2X2J1ZmZlcltpKytdID0gKGogJiAweDAyKSA/IDB4YWEgOiAweDU1OworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFJlbWFpbmluZyBidWZmZXIgaXMgZmlsbGVkIHdpdGggYSByZXBlYXRpbmcKKwkJCSAqIHBhdHRlciBvZjoKKwkJCSAqCisJCQkgKgkgMHhmZmZmCisJCQkgKgl+MHgwMDAxIDw8IHNoaWZ0ZWQgb25jZSBpbiBlYWNoIGxvb3AuCisJCQkgKi8KKwkJCWlmIChqICYgMHgwMikgeworCQkJCWlmIChqICYgMHgwMSkgeworCQkJCQl0YXJnLT5kdl9idWZmZXJbaSsrXSA9IH4oYiA+PiA4KSAmIDB4ZmY7CisJCQkJCWIgPDw9IDE7CisJCQkJCWlmIChiID09IDB4MDAwMCkKKwkJCQkJCWIgPSAweDAwMDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGFyZy0+ZHZfYnVmZmVyW2krK10gPSAofmIgJiAweGZmKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXRhcmctPmR2X2J1ZmZlcltpKytdID0gMHhmZjsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHVfaW50CithaGRfbGludXhfdXNlcl90YWdkZXB0aChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbykKK3sKKwlzdGF0aWMgaW50IHdhcm5lZF91c2VyOworCXVfaW50IHRhZ3M7CisKKwl0YWdzID0gMDsKKwlpZiAoKGFoZC0+dXNlcl9kaXNjZW5hYmxlICYgZGV2aW5mby0+dGFyZ2V0X21hc2spICE9IDApIHsKKwkJaWYgKGFoZC0+dW5pdCA+PSBOVU1fRUxFTUVOVFMoYWljNzl4eF90YWdfaW5mbykpIHsKKworCQkJaWYgKHdhcm5lZF91c2VyID09IDApIHsKKwkJCQlwcmludGYoS0VSTl9XQVJOSU5HCisiYWljNzl4eDogV0FSTklORzogSW5zdWZmaWNpZW50IHRhZ19pbmZvIGluc3RhbmNlc1xuIgorImFpYzc5eHg6IGZvciBpbnN0YWxsZWQgY29udHJvbGxlcnMuICBVc2luZyBkZWZhdWx0c1xuIgorImFpYzc5eHg6IFBsZWFzZSB1cGRhdGUgdGhlIGFpYzc5eHhfdGFnX2luZm8gYXJyYXkgaW5cbiIKKyJhaWM3OXh4OiB0aGUgYWljNzl4eF9vc20uYyBzb3VyY2UgZmlsZS5cbiIpOworCQkJCXdhcm5lZF91c2VyKys7CisJCQl9CisJCQl0YWdzID0gQUhEX01BWF9RVUVVRTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXJfdGFnX2luZm9fdCAqdGFnX2luZm87CisKKwkJCXRhZ19pbmZvID0gJmFpYzc5eHhfdGFnX2luZm9bYWhkLT51bml0XTsKKwkJCXRhZ3MgPSB0YWdfaW5mby0+dGFnX2NvbW1hbmRzW2RldmluZm8tPnRhcmdldF9vZmZzZXRdOworCQkJaWYgKHRhZ3MgPiBBSERfTUFYX1FVRVVFKQorCQkJCXRhZ3MgPSBBSERfTUFYX1FVRVVFOworCQl9CisJfQorCXJldHVybiAodGFncyk7Cit9CisKK3N0YXRpYyB1X2ludAorYWhkX2xpbnV4X3VzZXJfZHZfc2V0dGluZyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJc3RhdGljIGludCB3YXJuZWRfdXNlcjsKKwlpbnQgZHY7CisKKwlpZiAoYWhkLT51bml0ID49IE5VTV9FTEVNRU5UUyhhaWM3OXh4X2R2X3NldHRpbmdzKSkgeworCisJCWlmICh3YXJuZWRfdXNlciA9PSAwKSB7CisJCQlwcmludGYoS0VSTl9XQVJOSU5HCisiYWljNzl4eDogV0FSTklORzogSW5zdWZmaWNpZW50IGR2IHNldHRpbmdzIGluc3RhbmNlc1xuIgorImFpYzc5eHg6IGZvciBpbnN0YWxsZWQgY29udHJvbGxlcnMuIFVzaW5nIGRlZmF1bHRzXG4iCisiYWljNzl4eDogUGxlYXNlIHVwZGF0ZSB0aGUgYWljNzl4eF9kdl9zZXR0aW5ncyBhcnJheSBpbiIKKyJhaWM3OXh4OiB0aGUgYWljNzl4eF9vc20uYyBzb3VyY2UgZmlsZS5cbiIpOworCQkJd2FybmVkX3VzZXIrKzsKKwkJfQorCQlkdiA9IC0xOworCX0gZWxzZSB7CisKKwkJZHYgPSBhaWM3OXh4X2R2X3NldHRpbmdzW2FoZC0+dW5pdF07CisJfQorCisJaWYgKGR2IDwgMCkgeworCQkvKgorCQkgKiBBcHBseSB0aGUgZGVmYXVsdC4KKwkJICovCisJCWR2ID0gMTsKKwkJaWYgKGFoZC0+c2VlcF9jb25maWcgIT0gMCkKKwkJCWR2ID0gKGFoZC0+c2VlcF9jb25maWctPmJpb3NfY29udHJvbCAmIENGRU5BQkxFRFYpOworCX0KKwlyZXR1cm4gKGR2KTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9zZXR1cF91c2VyX3JkX3N0cm1fc2V0dGluZ3Moc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXN0YXRpYwlpbnQgd2FybmVkX3VzZXI7CisJdV9pbnQJcmRfc3RybV9tYXNrOworCXVfaW50CXRhcmdldF9pZDsKKworCS8qCisJICogSWYgd2UgaGF2ZSBzcGVjaWZpYyByZWFkIHN0cmVhbWluZyBpbmZvIGZvciB0aGlzIGNvbnRyb2xsZXIsCisJICogYXBwbHkgaXQuICBPdGhlcndpc2UgdXNlIHRoZSBkZWZhdWx0cy4KKwkgKi8KKwkgaWYgKGFoZC0+dW5pdCA+PSBOVU1fRUxFTUVOVFMoYWljNzl4eF9yZF9zdHJtX2luZm8pKSB7CisKKwkJaWYgKHdhcm5lZF91c2VyID09IDApIHsKKworCQkJcHJpbnRmKEtFUk5fV0FSTklORworImFpYzc5eHg6IFdBUk5JTkc6IEluc3VmZmljaWVudCByZF9zdHJtIGluc3RhbmNlc1xuIgorImFpYzc5eHg6IGZvciBpbnN0YWxsZWQgY29udHJvbGxlcnMuIFVzaW5nIGRlZmF1bHRzXG4iCisiYWljNzl4eDogUGxlYXNlIHVwZGF0ZSB0aGUgYWljNzl4eF9yZF9zdHJtX2luZm8gYXJyYXlcbiIKKyJhaWM3OXh4OiBpbiB0aGUgYWljNzl4eF9vc20uYyBzb3VyY2UgZmlsZS5cbiIpOworCQkJd2FybmVkX3VzZXIrKzsKKwkJfQorCQlyZF9zdHJtX21hc2sgPSBBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk07CisJfSBlbHNlIHsKKworCQlyZF9zdHJtX21hc2sgPSBhaWM3OXh4X3JkX3N0cm1faW5mb1thaGQtPnVuaXRdOworCX0KKwlmb3IgKHRhcmdldF9pZCA9IDA7IHRhcmdldF9pZCA8IDE2OyB0YXJnZXRfaWQrKykgeworCQlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKKwkJc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQlzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCisJCXRpbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsICdBJywgYWhkLT5vdXJfaWQsCisJCQkJCSAgICB0YXJnZXRfaWQsICZ0c3RhdGUpOworCQlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBhaGQtPm91cl9pZCwgdGFyZ2V0X2lkLAorCQkJCSAgICBDQU1fTFVOX1dJTERDQVJELCAnQScsIFJPTEVfSU5JVElBVE9SKTsKKwkJdGluZm8tPnVzZXIucHByX29wdGlvbnMgJj0gfk1TR19FWFRfUFBSX1JEX1NUUk07CisJCWlmICgocmRfc3RybV9tYXNrICYgZGV2aW5mby50YXJnZXRfbWFzaykgIT0gMCkKKwkJCXRpbmZvLT51c2VyLnBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX1JEX1NUUk07CisJfQorfQorCisvKgorICogRGV0ZXJtaW5lcyB0aGUgcXVldWUgZGVwdGggZm9yIGEgZ2l2ZW4gZGV2aWNlLgorICovCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X2RldmljZV9xdWV1ZV9kZXB0aChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkgICAgIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXYpCit7CisJc3RydWN0CWFoZF9kZXZpbmZvIGRldmluZm87CisJdV9pbnQJdGFnczsKKworCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sCisJCQkgICAgYWhkLT5vdXJfaWQsCisJCQkgICAgZGV2LT50YXJnZXQtPnRhcmdldCwgZGV2LT5sdW4sCisJCQkgICAgZGV2LT50YXJnZXQtPmNoYW5uZWwgPT0gMCA/ICdBJyA6ICdCJywKKwkJCSAgICBST0xFX0lOSVRJQVRPUik7CisJdGFncyA9IGFoZF9saW51eF91c2VyX3RhZ2RlcHRoKGFoZCwgJmRldmluZm8pOworCWlmICh0YWdzICE9IDAKKwkgJiYgZGV2LT5zY3NpX2RldmljZSAhPSBOVUxMCisJICYmIGRldi0+c2NzaV9kZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQgIT0gMCkgeworCisJCWFoZF9zZXRfdGFncyhhaGQsICZkZXZpbmZvLCBBSERfUVVFVUVfVEFHR0VEKTsKKwkJYWhkX3ByaW50X2RldmluZm8oYWhkLCAmZGV2aW5mbyk7CisJCXByaW50ZigiVGFnZ2VkIFF1ZXVpbmcgZW5hYmxlZC4gIERlcHRoICVkXG4iLCB0YWdzKTsKKwl9IGVsc2UgeworCQlhaGRfc2V0X3RhZ3MoYWhkLCAmZGV2aW5mbywgQUhEX1FVRVVFX05PTkUpOworCX0KK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9ydW5fZGV2aWNlX3F1ZXVlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QJIGFoZF9jbWQgKmFjbWQ7CisJc3RydWN0CSBzY3NpX2NtbmQgKmNtZDsKKwlzdHJ1Y3QJIHNjYiAqc2NiOworCXN0cnVjdAkgaGFyZHdhcmVfc2NiICpoc2NiOworCXN0cnVjdAkgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJc3RydWN0CSBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJdV9pbnQJIGNvbF9pZHg7CisJdWludDE2X3QgbWFzazsKKworCWlmICgoZGV2LT5mbGFncyAmIEFIRF9ERVZfT05fUlVOX0xJU1QpICE9IDApCisJCXBhbmljKCJydW5uaW5nIGRldmljZSBvbiBydW4gbGlzdCIpOworCisJd2hpbGUgKChhY21kID0gVEFJTFFfRklSU1QoJmRldi0+YnVzeXEpKSAhPSBOVUxMCisJICAgICYmIGRldi0+b3BlbmluZ3MgPiAwICYmIGRldi0+cWZyb3plbiA9PSAwKSB7CisKKwkJLyoKKwkJICogU2NoZWR1bGUgdXMgdG8gcnVuIGxhdGVyLiAgVGhlIG9ubHkgcmVhc29uIHdlIGFyZSBub3QKKwkJICogcnVubmluZyBpcyBiZWNhdXNlIHRoZSB3aG9sZSBjb250cm9sbGVyIFEgaXMgZnJvemVuLgorCQkgKi8KKwkJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiAhPSAwCisJCSAmJiBBSERfRFZfU0lNUV9GUk9aRU4oYWhkKSA9PSAwKSB7CisKKwkJCVRBSUxRX0lOU0VSVF9UQUlMKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xLAorCQkJCQkgIGRldiwgbGlua3MpOworCQkJZGV2LT5mbGFncyB8PSBBSERfREVWX09OX1JVTl9MSVNUOworCQkJcmV0dXJuOworCQl9CisKKwkJY21kID0gJmFjbWRfc2NzaV9jbWQoYWNtZCk7CisKKwkJLyoKKwkJICogR2V0IGFuIHNjYiB0byB1c2UuCisJCSAqLworCQl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCAnQScsIGFoZC0+b3VyX2lkLAorCQkJCQkgICAgY21kLT5kZXZpY2UtPmlkLCAmdHN0YXRlKTsKKwkJaWYgKChkZXYtPmZsYWdzICYgKEFIRF9ERVZfUV9UQUdHRUR8QUhEX0RFVl9RX0JBU0lDKSkgPT0gMAorCQkgfHwgKHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfSVVfUkVRKSAhPSAwKSB7CisJCQljb2xfaWR4ID0gQUhEX05FVkVSX0NPTF9JRFg7CisJCX0gZWxzZSB7CisJCQljb2xfaWR4ID0gQUhEX0JVSUxEX0NPTF9JRFgoY21kLT5kZXZpY2UtPmlkLAorCQkJCQkJICAgIGNtZC0+ZGV2aWNlLT5sdW4pOworCQl9CisJCWlmICgoc2NiID0gYWhkX2dldF9zY2IoYWhkLCBjb2xfaWR4KSkgPT0gTlVMTCkgeworCQkJVEFJTFFfSU5TRVJUX1RBSUwoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZGV2aWNlX3J1bnEsCisJCQkJCSBkZXYsIGxpbmtzKTsKKwkJCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9PTl9SVU5fTElTVDsKKwkJCWFoZC0+ZmxhZ3MgfD0gQUhEX1JFU09VUkNFX1NIT1JUQUdFOworCQkJcmV0dXJuOworCQl9CisJCVRBSUxRX1JFTU9WRSgmZGV2LT5idXN5cSwgYWNtZCwgYWNtZF9saW5rcy50cWUpOworCQlzY2ItPmlvX2N0eCA9IGNtZDsKKwkJc2NiLT5wbGF0Zm9ybV9kYXRhLT5kZXYgPSBkZXY7CisJCWhzY2IgPSBzY2ItPmhzY2I7CisJCWNtZC0+aG9zdF9zY3JpYmJsZSA9IChjaGFyICopc2NiOworCisJCS8qCisJCSAqIEZpbGwgb3V0IGJhc2ljcyBvZiB0aGUgSFNDQi4KKwkJICovCisJCWhzY2ItPmNvbnRyb2wgPSAwOworCQloc2NiLT5zY3NpaWQgPSBCVUlMRF9TQ1NJSUQoYWhkLCBjbWQpOworCQloc2NiLT5sdW4gPSBjbWQtPmRldmljZS0+bHVuOworCQlzY2ItPmhzY2ItPnRhc2tfbWFuYWdlbWVudCA9IDA7CisJCW1hc2sgPSBTQ0JfR0VUX1RBUkdFVF9NQVNLKGFoZCwgc2NiKTsKKworCQlpZiAoKGFoZC0+dXNlcl9kaXNjZW5hYmxlICYgbWFzaykgIT0gMCkKKwkJCWhzY2ItPmNvbnRyb2wgfD0gRElTQ0VOQjsKKworCSAJaWYgKEFIRF9EVl9DTUQoY21kKSAhPSAwKQorCQkJc2NiLT5mbGFncyB8PSBTQ0JfU0lMRU5UOworCisJCWlmICgodGluZm8tPmN1cnIucHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9JVV9SRVEpICE9IDApCisJCQlzY2ItPmZsYWdzIHw9IFNDQl9QQUNLRVRJWkVEOworCisJCWlmICgodHN0YXRlLT5hdXRvX25lZ290aWF0ZSAmIG1hc2spICE9IDApIHsKKwkJCXNjYi0+ZmxhZ3MgfD0gU0NCX0FVVE9fTkVHT1RJQVRFOworCQkJc2NiLT5oc2NiLT5jb250cm9sIHw9IE1LX01FU1NBR0U7CisJCX0KKworCQlpZiAoKGRldi0+ZmxhZ3MgJiAoQUhEX0RFVl9RX1RBR0dFRHxBSERfREVWX1FfQkFTSUMpKSAhPSAwKSB7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCQkJaW50CW1zZ19ieXRlczsKKwkJCXVpbnQ4X3QgdGFnX21zZ3NbMl07CisKKwkJCW1zZ19ieXRlcyA9IHNjc2lfcG9wdWxhdGVfdGFnX21zZyhjbWQsIHRhZ19tc2dzKTsKKwkJCWlmIChtc2dfYnl0ZXMgJiYgdGFnX21zZ3NbMF0gIT0gTVNHX1NJTVBMRV9UQVNLKSB7CisJCQkJaHNjYi0+Y29udHJvbCB8PSB0YWdfbXNnc1swXTsKKwkJCQlpZiAodGFnX21zZ3NbMF0gPT0gTVNHX09SREVSRURfVEFTSykKKwkJCQkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPSAwOworCQkJfSBlbHNlCisjZW5kaWYKKwkJCWlmIChkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZyA9PSBBSERfT1RBR19USFJFU0gKKwkJCSAmJiAoZGV2LT5mbGFncyAmIEFIRF9ERVZfUV9UQUdHRUQpICE9IDApIHsKKwkJCQloc2NiLT5jb250cm9sIHw9IE1TR19PUkRFUkVEX1RBU0s7CisJCQkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPSAwOworCQkJfSBlbHNlIHsKKwkJCQloc2NiLT5jb250cm9sIHw9IE1TR19TSU1QTEVfVEFTSzsKKwkJCX0KKwkJfQorCisJCWhzY2ItPmNkYl9sZW4gPSBjbWQtPmNtZF9sZW47CisJCW1lbWNweShoc2NiLT5zaGFyZWRfZGF0YS5pZGF0YS5jZGIsIGNtZC0+Y21uZCwgaHNjYi0+Y2RiX2xlbik7CisKKwkJc2NiLT5zZ19jb3VudCA9IDA7CisJCWFoZF9zZXRfcmVzaWR1YWwoc2NiLCAwKTsKKwkJYWhkX3NldF9zZW5zZV9yZXNpZHVhbChzY2IsIDApOworCQlpZiAoY21kLT51c2Vfc2cgIT0gMCkgeworCQkJdm9pZAkqc2c7CisJCQlzdHJ1Y3QJIHNjYXR0ZXJsaXN0ICpjdXJfc2VnOworCQkJdV9pbnQJIG5zZWc7CisJCQlpbnQJIGRpcjsKKworCQkJY3VyX3NlZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPnJlcXVlc3RfYnVmZmVyOworCQkJZGlyID0gc2NzaV90b19wY2lfZG1hX2RpcihjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJCW5zZWcgPSBwY2lfbWFwX3NnKGFoZC0+ZGV2X3NvZnRjLCBjdXJfc2VnLAorCQkJCQkgIGNtZC0+dXNlX3NnLCBkaXIpOworCQkJc2NiLT5wbGF0Zm9ybV9kYXRhLT54ZmVyX2xlbiA9IDA7CisJCQlmb3IgKHNnID0gc2NiLT5zZ19saXN0OyBuc2VnID4gMDsgbnNlZy0tLCBjdXJfc2VnKyspIHsKKwkJCQlkbWFfYWRkcl90IGFkZHI7CisJCQkJYnVzX3NpemVfdCBsZW47CisKKwkJCQlhZGRyID0gc2dfZG1hX2FkZHJlc3MoY3VyX3NlZyk7CisJCQkJbGVuID0gc2dfZG1hX2xlbihjdXJfc2VnKTsKKwkJCQlzY2ItPnBsYXRmb3JtX2RhdGEtPnhmZXJfbGVuICs9IGxlbjsKKwkJCQlzZyA9IGFoZF9zZ19zZXR1cChhaGQsIHNjYiwgc2csIGFkZHIsIGxlbiwKKwkJCQkJCSAgLypsYXN0Ki9uc2VnID09IDEpOworCQkJfQorCQl9IGVsc2UgaWYgKGNtZC0+cmVxdWVzdF9idWZmbGVuICE9IDApIHsKKwkJCXZvaWQgKnNnOworCQkJZG1hX2FkZHJfdCBhZGRyOworCQkJaW50IGRpcjsKKworCQkJc2cgPSBzY2ItPnNnX2xpc3Q7CisJCQlkaXIgPSBzY3NpX3RvX3BjaV9kbWFfZGlyKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQkJYWRkciA9IHBjaV9tYXBfc2luZ2xlKGFoZC0+ZGV2X3NvZnRjLAorCQkJCQkgICAgICBjbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCQkgICAgICBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgZGlyKTsKKwkJCXNjYi0+cGxhdGZvcm1fZGF0YS0+eGZlcl9sZW4gPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJCXNjYi0+cGxhdGZvcm1fZGF0YS0+YnVmX2J1c2FkZHIgPSBhZGRyOworCQkJc2cgPSBhaGRfc2dfc2V0dXAoYWhkLCBzY2IsIHNnLCBhZGRyLAorCQkJCQkgIGNtZC0+cmVxdWVzdF9idWZmbGVuLCAvKmxhc3QqL1RSVUUpOworCQl9CisKKwkJTElTVF9JTlNFUlRfSEVBRCgmYWhkLT5wZW5kaW5nX3NjYnMsIHNjYiwgcGVuZGluZ19saW5rcyk7CisJCWRldi0+b3BlbmluZ3MtLTsKKwkJZGV2LT5hY3RpdmUrKzsKKwkJZGV2LT5jb21tYW5kc19pc3N1ZWQrKzsKKworCQkvKiBVcGRhdGUgdGhlIGVycm9yIGNvdW50aW5nIGJ1Y2tldCBhbmQgZHVtcCBpZiBuZWVkZWQgKi8KKwkJaWYgKGRldi0+dGFyZ2V0LT5jbWRzX3NpbmNlX2Vycm9yKSB7CisJCQlkZXYtPnRhcmdldC0+Y21kc19zaW5jZV9lcnJvcisrOworCQkJaWYgKGRldi0+dGFyZ2V0LT5jbWRzX3NpbmNlX2Vycm9yID4KKwkJCSAgICBBSERfTElOVVhfRVJSX1RIUkVTSCkKKwkJCQlkZXYtPnRhcmdldC0+Y21kc19zaW5jZV9lcnJvciA9IDA7CisJCX0KKworCQlpZiAoKGRldi0+ZmxhZ3MgJiBBSERfREVWX1BFUklPRElDX09UQUcpICE9IDApCisJCQlkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZysrOworCQlzY2ItPmZsYWdzIHw9IFNDQl9BQ1RJVkU7CisJCWFoZF9xdWV1ZV9zY2IoYWhkLCBzY2IpOworCX0KK30KKworLyoKKyAqIFNDU0kgY29udHJvbGxlciBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworaXJxcmV0dXJuX3QKK2FoZF9saW51eF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkOworCXVfbG9uZwlmbGFnczsKKwlpbnQJb3VyczsKKworCWFoZCA9IChzdHJ1Y3QgYWhkX3NvZnRjICopIGRldl9pZDsKKwlhaGRfbG9jayhhaGQsICZmbGFncyk7IAorCW91cnMgPSBhaGRfaW50cihhaGQpOworCWlmIChhaGRfbGludXhfbmV4dF9kZXZpY2VfdG9fcnVuKGFoZCkgIT0gTlVMTCkKKwkJYWhkX3NjaGVkdWxlX3J1bnEoYWhkKTsKKwlhaGRfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlKGFoZCk7CisJYWhkX3VubG9jayhhaGQsICZmbGFncyk7CisJcmV0dXJuIElSUV9SRVRWQUwob3Vycyk7Cit9CisKK3ZvaWQKK2FoZF9wbGF0Zm9ybV9mbHVzaHdvcmsoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCisJd2hpbGUgKGFoZF9saW51eF9ydW5fY29tcGxldGVfcXVldWUoYWhkKSAhPSBOVUxMKQorCQk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCoKK2FoZF9saW51eF9hbGxvY190YXJnZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBjaGFubmVsLCB1X2ludCB0YXJnZXQpCit7CisJc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmc7CisKKwl0YXJnID0gbWFsbG9jKHNpemVvZigqdGFyZyksIE1fREVWQlVGLCBNX05PV0FJVCk7CisJaWYgKHRhcmcgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKwltZW1zZXQodGFyZywgMCwgc2l6ZW9mKCp0YXJnKSk7CisJdGFyZy0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJdGFyZy0+dGFyZ2V0ID0gdGFyZ2V0OworCXRhcmctPmFoZCA9IGFoZDsKKwl0YXJnLT5mbGFncyA9IEFIRF9EVl9SRVFVSVJFRDsKKwlhaGQtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0XSA9IHRhcmc7CisJcmV0dXJuICh0YXJnKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9mcmVlX3RhcmdldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnKQoreworCXN0cnVjdCBhaGRfZGV2aW5mbyBkZXZpbmZvOworCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXVfaW50IG91cl9pZDsKKwl1X2ludCB0YXJnZXRfb2Zmc2V0OworCWNoYXIgY2hhbm5lbDsKKworCS8qCisJICogRm9yY2UgYSBuZWdvdGlhdGlvbiB0byBhc3luYy9uYXJyb3cgb24gYW55CisJICogZnV0dXJlIGNvbW1hbmQgdG8gdGhpcyBkZXZpY2UgdW5sZXNzIGEgYnVzCisJICogcmVzZXQgb2NjdXJzIGJldHdlZW4gbm93IGFuZCB0aGF0IGNvbW1hbmQuCisJICovCisJY2hhbm5lbCA9ICdBJyArIHRhcmctPmNoYW5uZWw7CisJb3VyX2lkID0gYWhkLT5vdXJfaWQ7CisJdGFyZ2V0X29mZnNldCA9IHRhcmctPnRhcmdldDsKKwl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCBjaGFubmVsLCBvdXJfaWQsCisJCQkJICAgIHRhcmctPnRhcmdldCwgJnRzdGF0ZSk7CisJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywgb3VyX2lkLCB0YXJnLT50YXJnZXQsIENBTV9MVU5fV0lMRENBUkQsCisJCQkgICAgY2hhbm5lbCwgUk9MRV9JTklUSUFUT1IpOworCWFoZF9zZXRfc3luY3JhdGUoYWhkLCAmZGV2aW5mbywgMCwgMCwgMCwKKwkJCSBBSERfVFJBTlNfR09BTCwgLypwYXVzZWQqL0ZBTFNFKTsKKwlhaGRfc2V0X3dpZHRoKGFoZCwgJmRldmluZm8sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisJCSAgICAgIEFIRF9UUkFOU19HT0FMLCAvKnBhdXNlZCovRkFMU0UpOworCWFoZF91cGRhdGVfbmVnX3JlcXVlc3QoYWhkLCAmZGV2aW5mbywgdHN0YXRlLCB0aW5mbywgQUhEX05FR19BTFdBWVMpOworIAlhaGQtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0X29mZnNldF0gPSBOVUxMOworCWlmICh0YXJnLT5pbnFfZGF0YSAhPSBOVUxMKQorCQlmcmVlKHRhcmctPmlucV9kYXRhLCBNX0RFVkJVRik7CisJaWYgKHRhcmctPmR2X2J1ZmZlciAhPSBOVUxMKQorCQlmcmVlKHRhcmctPmR2X2J1ZmZlciwgTV9ERVZCVUYpOworCWlmICh0YXJnLT5kdl9idWZmZXIxICE9IE5VTEwpCisJCWZyZWUodGFyZy0+ZHZfYnVmZmVyMSwgTV9ERVZCVUYpOworCWZyZWUodGFyZywgTV9ERVZCVUYpOworfQorCitzdGF0aWMgc3RydWN0IGFoZF9saW51eF9kZXZpY2UqCithaGRfbGludXhfYWxsb2NfZGV2aWNlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnLCB1X2ludCBsdW4pCit7CisJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKKworCWRldiA9IG1hbGxvYyhzaXplb2YoKmRldiksIE1fREVWQlVHLCBNX05PV0FJVCk7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCW1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7CisJaW5pdF90aW1lcigmZGV2LT50aW1lcik7CisJVEFJTFFfSU5JVCgmZGV2LT5idXN5cSk7CisJZGV2LT5mbGFncyA9IEFIRF9ERVZfVU5DT05GSUdVUkVEOworCWRldi0+bHVuID0gbHVuOworCWRldi0+dGFyZ2V0ID0gdGFyZzsKKworCS8qCisJICogV2Ugc3RhcnQgb3V0IGxpZmUgdXNpbmcgdW50YWdnZWQKKwkgKiB0cmFuc2FjdGlvbnMgb2Ygd2hpY2ggd2UgYWxsb3cgb25lLgorCSAqLworCWRldi0+b3BlbmluZ3MgPSAxOworCisJLyoKKwkgKiBTZXQgbWF4dGFncyB0byAwLiAgVGhpcyB3aWxsIGJlIGNoYW5nZWQgaWYgd2UKKwkgKiBsYXRlciBkZXRlcm1pbmUgdGhhdCB3ZSBhcmUgZGVhbGluZyB3aXRoCisJICogYSB0YWdnZWQgcXVldWluZyBjYXBhYmxlIGRldmljZS4KKwkgKi8KKwlkZXYtPm1heHRhZ3MgPSAwOworCQorCXRhcmctPnJlZmNvdW50Kys7CisJdGFyZy0+ZGV2aWNlc1tsdW5dID0gZGV2OworCXJldHVybiAoZGV2KTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9mcmVlX2RldmljZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmc7CisKKwlkZWxfdGltZXIoJmRldi0+dGltZXIpOworCXRhcmcgPSBkZXYtPnRhcmdldDsKKwl0YXJnLT5kZXZpY2VzW2Rldi0+bHVuXSA9IE5VTEw7CisJZnJlZShkZXYsIE1fREVWQlVGKTsKKwl0YXJnLT5yZWZjb3VudC0tOworCWlmICh0YXJnLT5yZWZjb3VudCA9PSAwCisJICYmICh0YXJnLT5mbGFncyAmIEFIRF9EVl9SRVFVSVJFRCkgPT0gMCkKKwkJYWhkX2xpbnV4X2ZyZWVfdGFyZ2V0KGFoZCwgdGFyZyk7Cit9CisKK3ZvaWQKK2FoZF9zZW5kX2FzeW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgY2hhciBjaGFubmVsLAorCSAgICAgICB1X2ludCB0YXJnZXQsIHVfaW50IGx1biwgYWNfY29kZSBjb2RlLCB2b2lkICphcmcpCit7CisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBBQ19UUkFOU0ZFUl9ORUc6CisJeworCQljaGFyCWJ1Zls4MF07CisJCXN0cnVjdAlhaGRfbGludXhfdGFyZ2V0ICp0YXJnOworCQlzdHJ1Y3QJaW5mb19zdHIgaW5mbzsKKwkJc3RydWN0CWFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQlzdHJ1Y3QJYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCisJCWluZm8uYnVmZmVyID0gYnVmOworCQlpbmZvLmxlbmd0aCA9IHNpemVvZihidWYpOworCQlpbmZvLm9mZnNldCA9IDA7CisJCWluZm8ucG9zID0gMDsKKwkJdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgY2hhbm5lbCwgYWhkLT5vdXJfaWQsCisJCQkJCSAgICB0YXJnZXQsICZ0c3RhdGUpOworCisJCS8qCisJCSAqIERvbid0IGJvdGhlciByZXBvcnRpbmcgcmVzdWx0cyB3aGlsZQorCQkgKiBuZWdvdGlhdGlvbnMgYXJlIHN0aWxsIHBlbmRpbmcuCisJCSAqLworCQlpZiAodGluZm8tPmN1cnIucGVyaW9kICE9IHRpbmZvLT5nb2FsLnBlcmlvZAorCQkgfHwgdGluZm8tPmN1cnIud2lkdGggIT0gdGluZm8tPmdvYWwud2lkdGgKKwkJIHx8IHRpbmZvLT5jdXJyLm9mZnNldCAhPSB0aW5mby0+Z29hbC5vZmZzZXQKKwkJIHx8IHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICE9IHRpbmZvLT5nb2FsLnBwcl9vcHRpb25zKQorCQkJaWYgKGJvb3R2ZXJib3NlID09IDApCisJCQkJYnJlYWs7CisKKwkJLyoKKwkJICogRG9uJ3QgYm90aGVyIHJlcG9ydGluZyByZXN1bHRzIHRoYXQKKwkJICogYXJlIGlkZW50aWNhbCB0byB0aG9zZSBsYXN0IHJlcG9ydGVkLgorCQkgKi8KKwkJdGFyZyA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+dGFyZ2V0c1t0YXJnZXRdOworCQlpZiAodGFyZyA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWlmICh0aW5mby0+Y3Vyci5wZXJpb2QgPT0gdGFyZy0+bGFzdF90aW5mby5wZXJpb2QKKwkJICYmIHRpbmZvLT5jdXJyLndpZHRoID09IHRhcmctPmxhc3RfdGluZm8ud2lkdGgKKwkJICYmIHRpbmZvLT5jdXJyLm9mZnNldCA9PSB0YXJnLT5sYXN0X3RpbmZvLm9mZnNldAorCQkgJiYgdGluZm8tPmN1cnIucHByX29wdGlvbnMgPT0gdGFyZy0+bGFzdF90aW5mby5wcHJfb3B0aW9ucykKKwkJCWlmIChib290dmVyYm9zZSA9PSAwKQorCQkJCWJyZWFrOworCisJCXRhcmctPmxhc3RfdGluZm8ucGVyaW9kID0gdGluZm8tPmN1cnIucGVyaW9kOworCQl0YXJnLT5sYXN0X3RpbmZvLndpZHRoID0gdGluZm8tPmN1cnIud2lkdGg7CisJCXRhcmctPmxhc3RfdGluZm8ub2Zmc2V0ID0gdGluZm8tPmN1cnIub2Zmc2V0OworCQl0YXJnLT5sYXN0X3RpbmZvLnBwcl9vcHRpb25zID0gdGluZm8tPmN1cnIucHByX29wdGlvbnM7CisKKwkJcHJpbnRmKCIoJXM6JWM6IiwgYWhkX25hbWUoYWhkKSwgY2hhbm5lbCk7CisJCWlmICh0YXJnZXQgPT0gQ0FNX1RBUkdFVF9XSUxEQ0FSRCkKKwkJCXByaW50ZigiKik6ICIpOworCQllbHNlCisJCQlwcmludGYoIiVkKTogIiwgdGFyZ2V0KTsKKwkJYWhkX2Zvcm1hdF90cmFuc2luZm8oJmluZm8sICZ0aW5mby0+Y3Vycik7CisJCWlmIChpbmZvLnBvcyA8IGluZm8ubGVuZ3RoKQorCQkJKmluZm8uYnVmZmVyID0gJ1wwJzsKKwkJZWxzZQorCQkJYnVmW2luZm8ubGVuZ3RoIC0gMV0gPSAnXDAnOworCQlwcmludGYoIiVzIiwgYnVmKTsKKwkJYnJlYWs7CisJfQorICAgICAgICBjYXNlIEFDX1NFTlRfQkRSOgorCXsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJCVdBUk5fT04obHVuICE9IENBTV9MVU5fV0lMRENBUkQpOworCQlzY3NpX3JlcG9ydF9kZXZpY2VfcmVzZXQoYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0LAorCQkJCQkgY2hhbm5lbCAtICdBJywgdGFyZ2V0KTsKKyNlbHNlCisJCVNjc2lfRGV2aWNlICpzY3NpX2RldjsKKworCQkvKgorCQkgKiBGaW5kIHRoZSBTQ1NJIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcworCQkgKiByZXF1ZXN0IGFuZCBpbmRpY2F0ZSB0aGF0IGEgVUEgaXMgZXhwZWN0ZWQuCisJCSAqLworCQlmb3IgKHNjc2lfZGV2ID0gYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0LT5ob3N0X3F1ZXVlOworCQkgICAgIHNjc2lfZGV2ICE9IE5VTEw7IHNjc2lfZGV2ID0gc2NzaV9kZXYtPm5leHQpIHsKKwkJCWlmIChjaGFubmVsIC0gJ0EnID09IHNjc2lfZGV2LT5jaGFubmVsCisJCQkgJiYgdGFyZ2V0ID09IHNjc2lfZGV2LT5pZAorCQkJICYmIChsdW4gPT0gQ0FNX0xVTl9XSUxEQ0FSRAorCQkJICB8fCBsdW4gPT0gc2NzaV9kZXYtPmx1bikpIHsKKwkJCQlzY3NpX2Rldi0+d2FzX3Jlc2V0ID0gMTsKKwkJCQlzY3NpX2Rldi0+ZXhwZWN0aW5nX2NjX3VhID0gMTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWJyZWFrOworCX0KKyAgICAgICAgY2FzZSBBQ19CVVNfUkVTRVQ6CisJCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QgIT0gTlVMTCkgeworCQkJc2NzaV9yZXBvcnRfYnVzX3Jlc2V0KGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCwKKwkJCQkJICAgICAgY2hhbm5lbCAtICdBJyk7CisJCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwYW5pYygiYWhkX3NlbmRfYXN5bmM6IFVuZXhwZWN0ZWQgYXN5bmMgZXZlbnQiKTsKKyAgICAgICAgfQorfQorCisvKgorICogQ2FsbHMgdGhlIGhpZ2hlciBsZXZlbCBzY3NpIGRvbmUgZnVuY3Rpb24gYW5kIGZyZWVzIHRoZSBzY2IuCisgKi8KK3ZvaWQKK2FoZF9kb25lKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCVNjc2lfQ21uZCAqY21kOworCXN0cnVjdAkgIGFoZF9saW51eF9kZXZpY2UgKmRldjsKKworCWlmICgoc2NiLT5mbGFncyAmIFNDQl9BQ1RJVkUpID09IDApIHsKKwkJcHJpbnRmKCJTQ0IgJWQgZG9uZSdkIHR3aWNlXG4iLCBTQ0JfR0VUX1RBRyhzY2IpKTsKKwkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOworCQlwYW5pYygiU3RvcHBpbmcgZm9yIHNhZmV0eSIpOworCX0KKwlMSVNUX1JFTU9WRShzY2IsIHBlbmRpbmdfbGlua3MpOworCWNtZCA9IHNjYi0+aW9fY3R4OworCWRldiA9IHNjYi0+cGxhdGZvcm1fZGF0YS0+ZGV2OworCWRldi0+YWN0aXZlLS07CisJZGV2LT5vcGVuaW5ncysrOworCWlmICgoY21kLT5yZXN1bHQgJiAoQ0FNX0RFVl9RRlJaTiA8PCAxNikpICE9IDApIHsKKwkJY21kLT5yZXN1bHQgJj0gfihDQU1fREVWX1FGUlpOIDw8IDE2KTsKKwkJZGV2LT5xZnJvemVuLS07CisJfQorCWFoZF9saW51eF91bm1hcF9zY2IoYWhkLCBzY2IpOworCisJLyoKKwkgKiBHdWFyZCBhZ2FpbnN0IHN0YWxlIHNlbnNlIGRhdGEuCisJICogVGhlIExpbnV4IG1pZC1sYXllciBhc3N1bWVzIHRoYXQgc2Vuc2UKKwkgKiB3YXMgcmV0cmlldmVkIGFueXRpbWUgdGhlIGZpcnN0IGJ5dGUgb2YKKwkgKiB0aGUgc2Vuc2UgYnVmZmVyIGxvb2tzICJzYW5lIi4KKwkgKi8KKwljbWQtPnNlbnNlX2J1ZmZlclswXSA9IDA7CisJaWYgKGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgPT0gQ0FNX1JFUV9JTlBST0cpIHsKKwkJdWludDMyX3QgYW1vdW50X3hmZXJyZWQ7CisKKwkJYW1vdW50X3hmZXJyZWQgPQorCQkgICAgYWhkX2dldF90cmFuc2Zlcl9sZW5ndGgoc2NiKSAtIGFoZF9nZXRfcmVzaWR1YWwoc2NiKTsKKwkJaWYgKChzY2ItPmZsYWdzICYgU0NCX1RSQU5TTUlTU0lPTl9FUlJPUikgIT0gMCkgeworI2lmZGVmIEFIRF9ERUJVRworCQkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NSVNDKSAhPSAwKSB7CisJCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQkJCXByaW50ZigiU2V0IENBTV9VTkNPUl9QQVJJVFlcbiIpOworCQkJfQorI2VuZGlmCisJCQlhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9VTkNPUl9QQVJJVFkpOworI2lmZGVmIEFIRF9SRVBPUlRfVU5ERVJGTE9XUworCQkvKgorCQkgKiBUaGlzIGNvZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhcyBzb21lCisJCSAqIGNsaWVudHMgb2YgdGhlIFNDU0kgc3lzdGVtIGRvIG5vdCBwcm9wZXJseQorCQkgKiBpbml0aWFsaXplIHRoZSB1bmRlcmZsb3cgcGFyYW1ldGVyLiAgVGhpcworCQkgKiByZXN1bHRzIGluIHNwdXJpb3VzIHRlcm1pbmF0aW9uIG9mIGNvbW1hbmRzCisJCSAqIHRoYXQgY29tcGxldGUgYXMgZXhwZWN0ZWQgKGUuZy4gdW5kZXJmbG93IGlzCisJCSAqIGFsbG93ZWQgYXMgY29tbWFuZCBjYW4gcmV0dXJuIHZhcmlhYmxlIGFtb3VudHMKKwkJICogb2YgZGF0YS4KKwkJICovCisJCX0gZWxzZSBpZiAoYW1vdW50X3hmZXJyZWQgPCBzY2ItPmlvX2N0eC0+dW5kZXJmbG93KSB7CisJCQl1X2ludCBpOworCisJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQlwcmludGYoIkNEQjoiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzY2ItPmlvX2N0eC0+Y21kX2xlbjsgaSsrKQorCQkJCXByaW50ZigiIDB4JXgiLCBzY2ItPmlvX2N0eC0+Y21uZFtpXSk7CisJCQlwcmludGYoIlxuIik7CisJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQlwcmludGYoIlNhdyB1bmRlcmZsb3cgKCVsZCBvZiAlbGQgYnl0ZXMpLiAiCisJCQkgICAgICAgIlRyZWF0ZWQgYXMgZXJyb3JcbiIsCisJCQkJYWhkX2dldF9yZXNpZHVhbChzY2IpLAorCQkJCWFoZF9nZXRfdHJhbnNmZXJfbGVuZ3RoKHNjYikpOworCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fREFUQV9SVU5fRVJSKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fUkVRX0NNUCk7CisJCX0KKwl9IGVsc2UgaWYgKGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgPT0gQ0FNX1NDU0lfU1RBVFVTX0VSUk9SKSB7CisJCWFoZF9saW51eF9oYW5kbGVfc2NzaV9zdGF0dXMoYWhkLCBkZXYsIHNjYik7CisJfSBlbHNlIGlmIChhaGRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9TRUxfVElNRU9VVCkgeworCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfVU5DT05GSUdVUkVEOworCQlpZiAoQUhEX0RWX0NNRChjbWQpID09IEZBTFNFKQorCQkJZGV2LT50YXJnZXQtPmZsYWdzICY9IH5BSERfRFZfUkVRVUlSRUQ7CisJfQorCS8qCisJICogU3RhcnQgRFYgZm9yIGRldmljZXMgdGhhdCByZXF1aXJlIGl0IGFzc3VtaW5nIHRoZSBmaXJzdCBjb21tYW5kCisJICogc2VudCBkb2VzIG5vdCByZXN1bHQgaW4gYSBzZWxlY3Rpb24gdGltZW91dC4KKwkgKi8KKwlpZiAoYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSAhPSBDQU1fU0VMX1RJTUVPVVQKKwkgJiYgKGRldi0+dGFyZ2V0LT5mbGFncyAmIEFIRF9EVl9SRVFVSVJFRCkgIT0gMCkKKwkJYWhkX2xpbnV4X3N0YXJ0X2R2KGFoZCk7CisKKwlpZiAoZGV2LT5vcGVuaW5ncyA9PSAxCisJICYmIGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgPT0gQ0FNX1JFUV9DTVAKKwkgJiYgYWhkX2dldF9zY3NpX3N0YXR1cyhzY2IpICE9IFNDU0lfU1RBVFVTX1FVRVVFX0ZVTEwpCisJCWRldi0+dGFnX3N1Y2Nlc3NfY291bnQrKzsKKwkvKgorCSAqIFNvbWUgZGV2aWNlcyBkZWFsIHdpdGggdGVtcG9yYXJ5IGludGVybmFsIHJlc291cmNlCisJICogc2hvcnRhZ2VzIGJ5IHJldHVybmluZyBxdWV1ZSBmdWxsLiAgV2hlbiB0aGUgcXVldWUKKwkgKiBmdWxsIG9jY3VycnMsIHdlIHRocm90dGxlIGJhY2suICBTbG93bHkgdHJ5IHRvIGdldAorCSAqIGJhY2sgdG8gb3VyIHByZXZpb3VzIHF1ZXVlIGRlcHRoLgorCSAqLworCWlmICgoZGV2LT5vcGVuaW5ncyArIGRldi0+YWN0aXZlKSA8IGRldi0+bWF4dGFncworCSAmJiBkZXYtPnRhZ19zdWNjZXNzX2NvdW50ID4gQUhEX1RBR19TVUNDRVNTX0lOVEVSVkFMKSB7CisJCWRldi0+dGFnX3N1Y2Nlc3NfY291bnQgPSAwOworCQlkZXYtPm9wZW5pbmdzKys7CisJfQorCisJaWYgKGRldi0+YWN0aXZlID09IDApCisJCWRldi0+Y29tbWFuZHNfc2luY2VfaWRsZV9vcl9vdGFnID0gMDsKKworCWlmIChUQUlMUV9FTVBUWSgmZGV2LT5idXN5cSkpIHsKKwkJaWYgKChkZXYtPmZsYWdzICYgQUhEX0RFVl9VTkNPTkZJR1VSRUQpICE9IDAKKwkJICYmIGRldi0+YWN0aXZlID09IDAKKwkJICYmIChkZXYtPmZsYWdzICYgQUhEX0RFVl9USU1FUl9BQ1RJVkUpID09IDApCisJCQlhaGRfbGludXhfZnJlZV9kZXZpY2UoYWhkLCBkZXYpOworCX0gZWxzZSBpZiAoKGRldi0+ZmxhZ3MgJiBBSERfREVWX09OX1JVTl9MSVNUKSA9PSAwKSB7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xLCBkZXYsIGxpbmtzKTsKKwkJZGV2LT5mbGFncyB8PSBBSERfREVWX09OX1JVTl9MSVNUOworCX0KKworCWlmICgoc2NiLT5mbGFncyAmIFNDQl9SRUNPVkVSWV9TQ0IpICE9IDApIHsKKwkJcHJpbnRmKCJSZWNvdmVyeSBTQ0IgY29tcGxldGVzXG4iKTsKKwkJaWYgKGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgPT0gQ0FNX0JEUl9TRU5UCisJCSB8fCBhaGRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9SRVFfQUJPUlRFRCkKKwkJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX0NNRF9USU1FT1VUKTsKKwkJaWYgKChzY2ItPnBsYXRmb3JtX2RhdGEtPmZsYWdzICYgQUhEX1NDQl9VUF9FSF9TRU0pICE9IDApIHsKKwkJCXNjYi0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJj0gfkFIRF9TQ0JfVVBfRUhfU0VNOworCQkJdXAoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZWhfc2VtKTsKKwkJfQorCX0KKworCWFoZF9mcmVlX3NjYihhaGQsIHNjYik7CisJYWhkX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShhaGQsIGNtZCk7CisKKwlpZiAoKGFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSERfRFZfV0FJVF9TSU1RX0VNUFRZKSAhPSAwCisJICYmIExJU1RfRklSU1QoJmFoZC0+cGVuZGluZ19zY2JzKSA9PSBOVUxMKSB7CisJCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJj0gfkFIRF9EVl9XQUlUX1NJTVFfRU1QVFk7CisJCXVwKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3NlbSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X2hhbmRsZV9zY3NpX3N0YXR1cyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkgICAgIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXYsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlzdHJ1Y3QJYWhkX2RldmluZm8gZGV2aW5mbzsKKworCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sCisJCQkgICAgYWhkLT5vdXJfaWQsCisJCQkgICAgZGV2LT50YXJnZXQtPnRhcmdldCwgZGV2LT5sdW4sCisJCQkgICAgZGV2LT50YXJnZXQtPmNoYW5uZWwgPT0gMCA/ICdBJyA6ICdCJywKKwkJCSAgICBST0xFX0lOSVRJQVRPUik7CisJCisJLyoKKwkgKiBXZSBkb24ndCBjdXJyZW50bHkgdHJ1c3QgdGhlIG1pZC1sYXllciB0bworCSAqIHByb3Blcmx5IGRlYWwgd2l0aCBxdWV1ZSBmdWxsIG9yIGJ1c3kuICBTbywKKwkgKiB3aGVuIG9uZSBvY2N1cnMsIHdlIHRlbGwgdGhlIG1pZC1sYXllciB0bworCSAqIHVuY29uZGl0aW9uYWxseSByZXF1ZXVlIHRoZSBjb21tYW5kIHRvIHVzCisJICogc28gdGhhdCB3ZSBjYW4gcmV0cnkgaXQgb3Vyc2VsdmVzLiAgV2UgYWxzbworCSAqIGltcGxlbWVudCBvdXIgb3duIHRocm90dGxpbmcgbWVjaGFuaXNtIHNvCisJICogd2UgZG9uJ3QgY2xvYmJlciB0aGUgZGV2aWNlIHdpdGggdG9vIG1hbnkKKwkgKiBjb21tYW5kcy4KKwkgKi8KKwlzd2l0Y2ggKGFoZF9nZXRfc2NzaV9zdGF0dXMoc2NiKSkgeworCWRlZmF1bHQ6CisJCWJyZWFrOworCWNhc2UgU0NTSV9TVEFUVVNfQ0hFQ0tfQ09ORDoKKwljYXNlIFNDU0lfU1RBVFVTX0NNRF9URVJNSU5BVEVEOgorCXsKKwkJU2NzaV9DbW5kICpjbWQ7CisKKwkJLyoKKwkJICogQ29weSBzZW5zZSBpbmZvcm1hdGlvbiB0byB0aGUgT1MncyBjbWQKKwkJICogc3RydWN0dXJlIGlmIGl0IGlzIGF2YWlsYWJsZS4KKwkJICovCisJCWNtZCA9IHNjYi0+aW9fY3R4OworCQlpZiAoKHNjYi0+ZmxhZ3MgJiAoU0NCX1NFTlNFfFNDQl9QS1RfU0VOU0UpKSAhPSAwKSB7CisJCQlzdHJ1Y3Qgc2NzaV9zdGF0dXNfaXVfaGVhZGVyICpzaXU7CisJCQl1X2ludCBzZW5zZV9zaXplOworCQkJdV9pbnQgc2Vuc2Vfb2Zmc2V0OworCisJCQlpZiAoc2NiLT5mbGFncyAmIFNDQl9TRU5TRSkgeworCQkJCXNlbnNlX3NpemUgPSBNSU4oc2l6ZW9mKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEpCisJCQkJCSAgICAgICAtIGFoZF9nZXRfc2Vuc2VfcmVzaWR1YWwoc2NiKSwKKwkJCQkJCSBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpKTsKKwkJCQlzZW5zZV9vZmZzZXQgPSAwOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIENvcHkgb25seSB0aGUgc2Vuc2UgZGF0YSBpbnRvIHRoZSBwcm92aWRlZAorCQkJCSAqIGJ1ZmZlci4KKwkJCQkgKi8KKwkJCQlzaXUgPSAoc3RydWN0IHNjc2lfc3RhdHVzX2l1X2hlYWRlciAqKQorCQkJCSAgICBzY2ItPnNlbnNlX2RhdGE7CisJCQkJc2Vuc2Vfc2l6ZSA9IE1JTihzY3NpXzRidG91bChzaXUtPnNlbnNlX2xlbmd0aCksCisJCQkJCQlzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpKTsKKwkJCQlzZW5zZV9vZmZzZXQgPSBTSVVfU0VOU0VfT0ZGU0VUKHNpdSk7CisJCQl9CisKKwkJCW1lbXNldChjbWQtPnNlbnNlX2J1ZmZlciwgMCwgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisJCQltZW1jcHkoY21kLT5zZW5zZV9idWZmZXIsCisJCQkgICAgICAgYWhkX2dldF9zZW5zZV9idWYoYWhkLCBzY2IpCisJCQkgICAgICAgKyBzZW5zZV9vZmZzZXQsIHNlbnNlX3NpemUpOworCQkJY21kLT5yZXN1bHQgfD0gKERSSVZFUl9TRU5TRSA8PCAyNCk7CisKKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19TRU5TRSkgeworCQkJCWludCBpOworCisJCQkJcHJpbnRmKCJDb3BpZWQgJWQgYnl0ZXMgb2Ygc2Vuc2UgZGF0YSBhdCAlZDoiLAorCQkJCSAgICAgICBzZW5zZV9zaXplLCBzZW5zZV9vZmZzZXQpOworCQkJCWZvciAoaSA9IDA7IGkgPCBzZW5zZV9zaXplOyBpKyspIHsKKwkJCQkJaWYgKChpICYgMHhGKSA9PSAwKQorCQkJCQkJcHJpbnRmKCJcbiIpOworCQkJCQlwcmludGYoIjB4JXggIiwgY21kLT5zZW5zZV9idWZmZXJbaV0pOworCQkJCX0KKwkJCQlwcmludGYoIlxuIik7CisJCQl9CisjZW5kaWYKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBTQ1NJX1NUQVRVU19RVUVVRV9GVUxMOgorCXsKKwkJLyoKKwkJICogQnkgdGhlIHRpbWUgdGhlIGNvcmUgZHJpdmVyIGhhcyByZXR1cm5lZCB0aGlzCisJCSAqIGNvbW1hbmQsIGFsbCBvdGhlciBjb21tYW5kcyB0aGF0IHdlcmUgcXVldWVkCisJCSAqIHRvIHVzIGJ1dCBub3QgdGhlIGRldmljZSBoYXZlIGJlZW4gcmV0dXJuZWQuCisJCSAqIFRoaXMgZW5zdXJlcyB0aGF0IGRldi0+YWN0aXZlIGlzIGVxdWFsIHRvCisJCSAqIHRoZSBudW1iZXIgb2YgY29tbWFuZHMgYWN0dWFsbHkgcXVldWVkIHRvCisJCSAqIHRoZSBkZXZpY2UuCisJCSAqLworCQlkZXYtPnRhZ19zdWNjZXNzX2NvdW50ID0gMDsKKwkJaWYgKGRldi0+YWN0aXZlICE9IDApIHsKKwkJCS8qCisJCQkgKiBEcm9wIG91ciBvcGVuaW5nIGNvdW50IHRvIHRoZSBudW1iZXIKKwkJCSAqIG9mIGNvbW1hbmRzIGN1cnJlbnRseSBvdXRzdGFuZGluZy4KKwkJCSAqLworCQkJZGV2LT5vcGVuaW5ncyA9IDA7CisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1FGVUxMKSAhPSAwKSB7CisJCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQkJCXByaW50ZigiRHJvcHBpbmcgdGFnIGNvdW50IHRvICVkXG4iLAorCQkJCSAgICAgICBkZXYtPmFjdGl2ZSk7CisJCQl9CisjZW5kaWYKKwkJCWlmIChkZXYtPmFjdGl2ZSA9PSBkZXYtPnRhZ3Nfb25fbGFzdF9xdWV1ZWZ1bGwpIHsKKworCQkJCWRldi0+bGFzdF9xdWV1ZWZ1bGxfc2FtZV9jb3VudCsrOworCQkJCS8qCisJCQkJICogSWYgd2UgcmVwZWF0ZWRseSBzZWUgYSBxdWV1ZSBmdWxsCisJCQkJICogYXQgdGhlIHNhbWUgcXVldWUgZGVwdGgsIHRoaXMKKwkJCQkgKiBkZXZpY2UgaGFzIGEgZml4ZWQgbnVtYmVyIG9mIHRhZworCQkJCSAqIHNsb3RzLiAgTG9jayBpbiB0aGlzIHRhZyBkZXB0aAorCQkJCSAqIHNvIHdlIHN0b3Agc2VlaW5nIHF1ZXVlIGZ1bGxzIGZyb20KKwkJCQkgKiB0aGlzIGRldmljZS4KKwkJCQkgKi8KKwkJCQlpZiAoZGV2LT5sYXN0X3F1ZXVlZnVsbF9zYW1lX2NvdW50CisJCQkJID09IEFIRF9MT0NLX1RBR1NfQ09VTlQpIHsKKwkJCQkJZGV2LT5tYXh0YWdzID0gZGV2LT5hY3RpdmU7CisJCQkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJCQkJcHJpbnRmKCJMb2NraW5nIG1heCB0YWcgY291bnQgYXQgJWRcbiIsCisJCQkJCSAgICAgICBkZXYtPmFjdGl2ZSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlkZXYtPnRhZ3Nfb25fbGFzdF9xdWV1ZWZ1bGwgPSBkZXYtPmFjdGl2ZTsKKwkJCQlkZXYtPmxhc3RfcXVldWVmdWxsX3NhbWVfY291bnQgPSAwOworCQkJfQorCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fUkVRVUVVRV9SRVEpOworCQkJYWhkX3NldF9zY3NpX3N0YXR1cyhzY2IsIFNDU0lfU1RBVFVTX09LKTsKKwkJCWFoZF9wbGF0Zm9ybV9zZXRfdGFncyhhaGQsICZkZXZpbmZvLAorCQkJCSAgICAgKGRldi0+ZmxhZ3MgJiBBSERfREVWX1FfQkFTSUMpCisJCQkJICAgPyBBSERfUVVFVUVfQkFTSUMgOiBBSERfUVVFVUVfVEFHR0VEKTsKKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqIERyb3AgZG93biB0byBhIHNpbmdsZSBvcGVuaW5nLCBhbmQgdHJlYXQgdGhpcworCQkgKiBhcyBpZiB0aGUgdGFyZ2V0IHJldHVybmVkIEJVU1kgU0NTSSBzdGF0dXMuCisJCSAqLworCQlkZXYtPm9wZW5pbmdzID0gMTsKKwkJYWhkX3BsYXRmb3JtX3NldF90YWdzKGFoZCwgJmRldmluZm8sCisJCQkgICAgIChkZXYtPmZsYWdzICYgQUhEX0RFVl9RX0JBU0lDKQorCQkJICAgPyBBSERfUVVFVUVfQkFTSUMgOiBBSERfUVVFVUVfVEFHR0VEKTsKKwkJYWhkX3NldF9zY3NpX3N0YXR1cyhzY2IsIFNDU0lfU1RBVFVTX0JVU1kpOworCQkvKiBGQUxMVEhST1VHSCAqLworCX0KKwljYXNlIFNDU0lfU1RBVFVTX0JVU1k6CisJCS8qCisJCSAqIFNldCBhIHNob3J0IHRpbWVyIHRvIGRlZmVyIHNlbmRpbmcgY29tbWFuZHMgZm9yCisJCSAqIGEgYml0IHNpbmNlIExpbnV4IHdpbGwgbm90IGRlbGF5IGluIHRoaXMgY2FzZS4KKwkJICovCisJCWlmICgoZGV2LT5mbGFncyAmIEFIRF9ERVZfVElNRVJfQUNUSVZFKSAhPSAwKSB7CisJCQlwcmludGYoIiVzOiVjOiVkOiBEZXZpY2UgVGltZXIgc3RpbGwgYWN0aXZlIGR1cmluZyAiCisJCQkgICAgICAgImJ1c3kgcHJvY2Vzc2luZ1xuIiwgYWhkX25hbWUoYWhkKSwKKwkJCQlkZXYtPnRhcmdldC0+Y2hhbm5lbCwgZGV2LT50YXJnZXQtPnRhcmdldCk7CisJCQlicmVhazsKKwkJfQorCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfVElNRVJfQUNUSVZFOworCQlkZXYtPnFmcm96ZW4rKzsKKwkJaW5pdF90aW1lcigmZGV2LT50aW1lcik7CisJCWRldi0+dGltZXIuZGF0YSA9ICh1X2xvbmcpZGV2OworCQlkZXYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaLzIpOworCQlkZXYtPnRpbWVyLmZ1bmN0aW9uID0gYWhkX2xpbnV4X2Rldl90aW1lZF91bmZyZWV6ZTsKKwkJYWRkX3RpbWVyKCZkZXYtPnRpbWVyKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIFNjc2lfQ21uZCAqY21kKQoreworCS8qCisJICogVHlwaWNhbGx5LCB0aGUgY29tcGxldGUgcXVldWUgaGFzIHZlcnkgZmV3IGVudHJpZXMKKwkgKiBxdWV1ZWQgdG8gaXQgYmVmb3JlIHRoZSBxdWV1ZSBpcyBlbXB0aWVkIGJ5CisJICogYWhkX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZSwgc28gc29ydGluZyB0aGUgZW50cmllcworCSAqIGJ5IGdlbmVyYXRpb24gbnVtYmVyIHNob3VsZCBiZSBpbmV4cGVuc2l2ZS4KKwkgKiBXZSBwZXJmb3JtIHRoZSBzb3J0IHNvIHRoYXQgY29tbWFuZHMgdGhhdCBjb21wbGV0ZQorCSAqIHdpdGggYW4gZXJyb3IgYXJlIHJldHVuZWQgaW4gdGhlIG9yZGVyIG9yaWdpb25hbGx5CisJICogcXVldWVkIHRvIHRoZSBjb250cm9sbGVyIHNvIHRoYXQgYW55IHN1YnNlcXVlbnQgcmV0cmllcworCSAqIGFyZSBwZXJmb3JtZWQgaW4gb3JkZXIuICBUaGUgdW5kZXJseWluZyBhaGQgcm91dGluZXMgZG8KKwkgKiBub3QgZ3VhcmFudGVlIHRoZSBvcmRlciB0aGF0IGFib3J0ZWQgY29tbWFuZHMgd2lsbCBiZQorCSAqIHJldHVybmVkIHRvIHVzLgorCSAqLworCXN0cnVjdCBhaGRfY29tcGxldGVxICpjb21wbGV0ZXE7CisJc3RydWN0IGFoZF9jbWQgKmxpc3RfY21kOworCXN0cnVjdCBhaGRfY21kICphY21kOworCisJLyoKKwkgKiBNYXAgQ0FNIGVycm9yIGNvZGVzIGludG8gTGludXggRXJyb3IgY29kZXMuICBXZQorCSAqIGF2b2lkIHRoZSBjb252ZXJzaW9uIHNvIHRoYXQgdGhlIERWIGNvZGUgaGFzIHRoZQorCSAqIGZ1bGwgZXJyb3IgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHdoZW4gbWFraW5nCisJICogc3RhdGUgY2hhbmdlIGRlY2lzaW9ucy4KKwkgKi8KKwlpZiAoQUhEX0RWX0NNRChjbWQpID09IEZBTFNFKSB7CisJCXVpbnQzMl90IHN0YXR1czsKKwkJdV9pbnQgbmV3X3N0YXR1czsKKworCQlzdGF0dXMgPSBhaGRfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKTsKKwkJaWYgKHN0YXR1cyAhPSBDQU1fUkVRX0NNUCkgeworCQkJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKKwkJCXN0cnVjdCBhaGRfZGV2aW5mbyBkZXZpbmZvOworCQkJY2FtX3N0YXR1cyBjYW1fc3RhdHVzOworCQkJdWludDMyX3QgYWN0aW9uOworCQkJdV9pbnQgc2NzaV9zdGF0dXM7CisKKwkJCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgY21kLT5kZXZpY2UtPmNoYW5uZWwsCisJCQkJCQkgICBjbWQtPmRldmljZS0+aWQsCisJCQkJCQkgICBjbWQtPmRldmljZS0+bHVuLAorCQkJCQkJICAgLyphbGxvYyovRkFMU0UpOworCisJCQlpZiAoZGV2ID09IE5VTEwpCisJCQkJZ290byBub19mYWxsYmFjazsKKworCQkJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywKKwkJCQkJICAgIGFoZC0+b3VyX2lkLAorCQkJCQkgICAgZGV2LT50YXJnZXQtPnRhcmdldCwgZGV2LT5sdW4sCisJCQkJCSAgICBkZXYtPnRhcmdldC0+Y2hhbm5lbCA9PSAwID8gJ0EnOidCJywKKwkJCQkJICAgIFJPTEVfSU5JVElBVE9SKTsKKworCQkJc2NzaV9zdGF0dXMgPSBhaGRfY21kX2dldF9zY3NpX3N0YXR1cyhjbWQpOworCQkJY2FtX3N0YXR1cyA9IGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpOworCQkJYWN0aW9uID0gYWljX2Vycm9yX2FjdGlvbihjbWQsIGRldi0+dGFyZ2V0LT5pbnFfZGF0YSwKKwkJCQkJCSAgY2FtX3N0YXR1cywgc2NzaV9zdGF0dXMpOworCQkJaWYgKChhY3Rpb24gJiBTU1FfRkFMTEJBQ0spICE9IDApIHsKKworCQkJCS8qIFVwZGF0ZSBzdGF0cyAqLworCQkJCWRldi0+dGFyZ2V0LT5lcnJvcnNfZGV0ZWN0ZWQrKzsKKwkJCQlpZiAoZGV2LT50YXJnZXQtPmNtZHNfc2luY2VfZXJyb3IgPT0gMCkKKwkJCQkJZGV2LT50YXJnZXQtPmNtZHNfc2luY2VfZXJyb3IrKzsKKwkJCQllbHNlIHsKKwkJCQkJZGV2LT50YXJnZXQtPmNtZHNfc2luY2VfZXJyb3IgPSAwOworCQkJCQlhaGRfbGludXhfZmFsbGJhY2soYWhkLCAmZGV2aW5mbyk7CisJCQkJfQorCQkJfQorCQl9Citub19mYWxsYmFjazoKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSBDQU1fUkVRX0lOUFJPRzoKKwkJY2FzZSBDQU1fUkVRX0NNUDoKKwkJY2FzZSBDQU1fU0NTSV9TVEFUVVNfRVJST1I6CisJCQluZXdfc3RhdHVzID0gRElEX09LOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX1JFUV9BQk9SVEVEOgorCQkJbmV3X3N0YXR1cyA9IERJRF9BQk9SVDsKKwkJCWJyZWFrOworCQljYXNlIENBTV9CVVNZOgorCQkJbmV3X3N0YXR1cyA9IERJRF9CVVNfQlVTWTsKKwkJCWJyZWFrOworCQljYXNlIENBTV9SRVFfSU5WQUxJRDoKKwkJY2FzZSBDQU1fUEFUSF9JTlZBTElEOgorCQkJbmV3X3N0YXR1cyA9IERJRF9CQURfVEFSR0VUOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX1NFTF9USU1FT1VUOgorCQkJbmV3X3N0YXR1cyA9IERJRF9OT19DT05ORUNUOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX1NDU0lfQlVTX1JFU0VUOgorCQljYXNlIENBTV9CRFJfU0VOVDoKKwkJCW5ld19zdGF0dXMgPSBESURfUkVTRVQ7CisJCQlicmVhazsKKwkJY2FzZSBDQU1fVU5DT1JfUEFSSVRZOgorCQkJbmV3X3N0YXR1cyA9IERJRF9QQVJJVFk7CisJCQlicmVhazsKKwkJY2FzZSBDQU1fQ01EX1RJTUVPVVQ6CisJCQluZXdfc3RhdHVzID0gRElEX1RJTUVfT1VUOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX1VBX0FCT1JUOgorCQljYXNlIENBTV9SRVFfQ01QX0VSUjoKKwkJY2FzZSBDQU1fQVVUT1NFTlNFX0ZBSUw6CisJCWNhc2UgQ0FNX05PX0hCQToKKwkJY2FzZSBDQU1fREFUQV9SVU5fRVJSOgorCQljYXNlIENBTV9VTkVYUF9CVVNGUkVFOgorCQljYXNlIENBTV9TRVFVRU5DRV9GQUlMOgorCQljYXNlIENBTV9DQ0JfTEVOX0VSUjoKKwkJY2FzZSBDQU1fUFJPVklERV9GQUlMOgorCQljYXNlIENBTV9SRVFfVEVSTUlPOgorCQljYXNlIENBTV9VTlJFQ19IQkFfRVJST1I6CisJCWNhc2UgQ0FNX1JFUV9UT09fQklHOgorCQkJbmV3X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJCWJyZWFrOworCQljYXNlIENBTV9SRVFVRVVFX1JFUToKKwkJCS8qCisJCQkgKiBJZiB3ZSB3YW50IHRoZSByZXF1ZXN0IHJlcXVldWVkLCBtYWtlIHN1cmUgdGhlcmUKKwkJCSAqIGFyZSBzdWZmaWNlbnQgcmV0cmllcy4gIEluIHRoZSBvbGQgc2NzaSBlcnJvciBjb2RlLAorCQkJICogd2UgdXNlZCB0byBiZSBhYmxlIHRvIHNwZWNpZnkgYSByZXN1bHQgY29kZSB0aGF0CisJCQkgKiBieXBhc3NlZCB0aGUgcmV0cnkgY291bnQuICBOb3cgd2UgbXVzdCB1c2UgdGhpcworCQkJICogaGFjay4gIFdlIGFsc28gImZha2UiIGEgY2hlY2sgY29uZGl0aW9uIHdpdGgKKwkJCSAqIGEgc2Vuc2UgY29kZSBvZiBBQk9SVEVEIENPTU1BTkQuICBUaGlzIHNlZW1zIHRvCisJCQkgKiBldm9rZSBhIHJldHJ5IGV2ZW4gaWYgdGhpcyBjb21tYW5kIGlzIGJlaW5nIHNlbnQKKwkJCSAqIHZpYSB0aGUgZWggdGhyZWFkLiAgSWNrISAgSWNrISAgSWNrIQorCQkJICovCisJCQlpZiAoY21kLT5yZXRyaWVzID4gMCkKKwkJCQljbWQtPnJldHJpZXMtLTsKKwkJCW5ld19zdGF0dXMgPSBESURfT0s7CisJCQlhaGRfY21kX3NldF9zY3NpX3N0YXR1cyhjbWQsIFNDU0lfU1RBVFVTX0NIRUNLX0NPTkQpOworCQkJY21kLT5yZXN1bHQgfD0gKERSSVZFUl9TRU5TRSA8PCAyNCk7CisJCQltZW1zZXQoY21kLT5zZW5zZV9idWZmZXIsIDAsCisJCQkgICAgICAgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisJCQljbWQtPnNlbnNlX2J1ZmZlclswXSA9IFNTRF9FUlJDT0RFX1ZBTElECisJCQkJCSAgICAgfCBTU0RfQ1VSUkVOVF9FUlJPUjsKKwkJCWNtZC0+c2Vuc2VfYnVmZmVyWzJdID0gU1NEX0tFWV9BQk9SVEVEX0NPTU1BTkQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSAqLworCQkJbmV3X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJCWJyZWFrOworCQl9CisKKwkJYWhkX2NtZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCwgbmV3X3N0YXR1cyk7CisJfQorCisJY29tcGxldGVxID0gJmFoZC0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxOworCWxpc3RfY21kID0gVEFJTFFfRklSU1QoY29tcGxldGVxKTsKKwlhY21kID0gKHN0cnVjdCBhaGRfY21kICopY21kOworCXdoaWxlIChsaXN0X2NtZCAhPSBOVUxMCisJICAgICYmIGFjbWRfc2NzaV9jbWQobGlzdF9jbWQpLnNlcmlhbF9udW1iZXIKKwkgICAgIDwgYWNtZF9zY3NpX2NtZChhY21kKS5zZXJpYWxfbnVtYmVyKQorCQlsaXN0X2NtZCA9IFRBSUxRX05FWFQobGlzdF9jbWQsIGFjbWRfbGlua3MudHFlKTsKKwlpZiAobGlzdF9jbWQgIT0gTlVMTCkKKwkJVEFJTFFfSU5TRVJUX0JFRk9SRShsaXN0X2NtZCwgYWNtZCwgYWNtZF9saW5rcy50cWUpOworCWVsc2UKKwkJVEFJTFFfSU5TRVJUX1RBSUwoY29tcGxldGVxLCBhY21kLCBhY21kX2xpbmtzLnRxZSk7Cit9CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfZmlsdGVyX2lucXVpcnkoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pCit7CisJc3RydWN0CXNjc2lfaW5xdWlyeV9kYXRhICpzaWQ7CisJc3RydWN0CWFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCXN0cnVjdAlhaGRfdHJhbnNpbmZvICp1c2VyOworCXN0cnVjdAlhaGRfdHJhbnNpbmZvICpnb2FsOworCXN0cnVjdAlhaGRfdHJhbnNpbmZvICpjdXJyOworCXN0cnVjdAlhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJc3RydWN0CWFoZF9saW51eF9kZXZpY2UgKmRldjsKKwl1X2ludAl3aWR0aDsKKwl1X2ludAlwZXJpb2Q7CisJdV9pbnQJb2Zmc2V0OworCXVfaW50CXBwcl9vcHRpb25zOworCXVfaW50CXRyYW5zX3ZlcnNpb247CisJdV9pbnQJcHJvdF92ZXJzaW9uOworCisJLyoKKwkgKiBEZXRlcm1pbmUgaWYgdGhpcyBsdW4gYWN0dWFsbHkgZXhpc3RzLiAgSWYgc28sCisJICogaG9sZCBvbiB0byBpdHMgY29ycmVzcG9uZGluZyBkZXZpY2Ugc3RydWN0dXJlLgorCSAqIElmIG5vdCwgbWFrZSBzdXJlIHdlIHJlbGVhc2UgdGhlIGRldmljZSBhbmQKKwkgKiBkb24ndCBib3RoZXIgcHJvY2Vzc2luZyB0aGUgcmVzdCBvZiB0aGlzIGlucXVpcnkKKwkgKiBjb21tYW5kLgorCSAqLworCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgZGV2aW5mby0+Y2hhbm5lbCAtICdBJywKKwkJCQkgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1biwKKwkJCQkgICAvKmFsbG9jKi9UUlVFKTsKKworCXNpZCA9IChzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKilkZXYtPnRhcmdldC0+aW5xX2RhdGE7CisJaWYgKFNJRF9RVUFMKHNpZCkgPT0gU0lEX1FVQUxfTFVfQ09OTkVDVEVEKSB7CisKKwkJZGV2LT5mbGFncyAmPSB+QUhEX0RFVl9VTkNPTkZJR1VSRUQ7CisJfSBlbHNlIHsKKwkJZGV2LT5mbGFncyB8PSBBSERfREVWX1VOQ09ORklHVVJFRDsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogVXBkYXRlIG91ciBub3Rpb24gb2YgdGhpcyBkZXZpY2UncyB0cmFuc2ZlcgorCSAqIG5lZ290aWF0aW9uIGNhcGFiaWxpdGllcy4KKwkgKi8KKwl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCSAgICBkZXZpbmZvLT5vdXJfc2NzaWlkLAorCQkJCSAgICBkZXZpbmZvLT50YXJnZXQsICZ0c3RhdGUpOworCXVzZXIgPSAmdGluZm8tPnVzZXI7CisJZ29hbCA9ICZ0aW5mby0+Z29hbDsKKwljdXJyID0gJnRpbmZvLT5jdXJyOworCXdpZHRoID0gdXNlci0+d2lkdGg7CisJcGVyaW9kID0gdXNlci0+cGVyaW9kOworCW9mZnNldCA9IHVzZXItPm9mZnNldDsKKwlwcHJfb3B0aW9ucyA9IHVzZXItPnBwcl9vcHRpb25zOworCXRyYW5zX3ZlcnNpb24gPSB1c2VyLT50cmFuc3BvcnRfdmVyc2lvbjsKKwlwcm90X3ZlcnNpb24gPSBNSU4odXNlci0+cHJvdG9jb2xfdmVyc2lvbiwgU0lEX0FOU0lfUkVWKHNpZCkpOworCisJLyoKKwkgKiBPbmx5IGF0dGVtcHQgU1BJMy80IG9uY2Ugd2UndmUgdmVyaWZpZWQgdGhhdAorCSAqIHRoZSBkZXZpY2UgY2xhaW1zIHRvIHN1cHBvcnQgU1BJMy80IGZlYXR1cmVzLgorCSAqLworCWlmIChwcm90X3ZlcnNpb24gPCBTQ1NJX1JFVl8yKQorCQl0cmFuc192ZXJzaW9uID0gU0lEX0FOU0lfUkVWKHNpZCk7CisJZWxzZQorCQl0cmFuc192ZXJzaW9uID0gU0NTSV9SRVZfMjsKKworCWlmICgoc2lkLT5mbGFncyAmIFNJRF9XQnVzMTYpID09IDApCisJCXdpZHRoID0gTVNHX0VYVF9XRFRSX0JVU184X0JJVDsKKwlpZiAoKHNpZC0+ZmxhZ3MgJiBTSURfU3luYykgPT0gMCkgeworCQlwZXJpb2QgPSAwOworCQlvZmZzZXQgPSAwOworCQlwcHJfb3B0aW9ucyA9IDA7CisJfQorCWlmICgoc2lkLT5zcGkzZGF0YSAmIFNJRF9TUElfUUFTKSA9PSAwKQorCQlwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfUUFTX1JFUTsKKwlpZiAoKHNpZC0+c3BpM2RhdGEgJiBTSURfU1BJX0NMT0NLX0RUKSA9PSAwKQorCQlwcHJfb3B0aW9ucyAmPSBNU0dfRVhUX1BQUl9RQVNfUkVROworCWlmICgoc2lkLT5zcGkzZGF0YSAmIFNJRF9TUElfSVVTKSA9PSAwKQorCQlwcHJfb3B0aW9ucyAmPSAoTVNHX0VYVF9QUFJfRFRfUkVRCisJCQkgICAgICB8IE1TR19FWFRfUFBSX1FBU19SRVEpOworCisJaWYgKHByb3RfdmVyc2lvbiA+IFNDU0lfUkVWXzIKKwkgJiYgcHByX29wdGlvbnMgIT0gMCkKKwkJdHJhbnNfdmVyc2lvbiA9IHVzZXItPnRyYW5zcG9ydF92ZXJzaW9uOworCisJYWhkX3ZhbGlkYXRlX3dpZHRoKGFoZCwgLyp0aW5mbyBsaW1pdCovTlVMTCwgJndpZHRoLCBST0xFX1VOS05PV04pOworCWFoZF9maW5kX3N5bmNyYXRlKGFoZCwgJnBlcmlvZCwgJnBwcl9vcHRpb25zLCBBSERfU1lOQ1JBVEVfTUFYKTsKKwlhaGRfdmFsaWRhdGVfb2Zmc2V0KGFoZCwgLyp0aW5mbyBsaW1pdCovTlVMTCwgcGVyaW9kLAorCQkJICAgICZvZmZzZXQsIHdpZHRoLCBST0xFX1VOS05PV04pOworCWlmIChvZmZzZXQgPT0gMCB8fCBwZXJpb2QgPT0gMCkgeworCQlwZXJpb2QgPSAwOworCQlvZmZzZXQgPSAwOworCQlwcHJfb3B0aW9ucyA9IDA7CisJfQorCS8qIEFwcGx5IG91ciBmaWx0ZXJlZCB1c2VyIHNldHRpbmdzLiAqLworCWN1cnItPnRyYW5zcG9ydF92ZXJzaW9uID0gdHJhbnNfdmVyc2lvbjsKKwljdXJyLT5wcm90b2NvbF92ZXJzaW9uID0gcHJvdF92ZXJzaW9uOworCWFoZF9zZXRfd2lkdGgoYWhkLCBkZXZpbmZvLCB3aWR0aCwgQUhEX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9GQUxTRSk7CisJYWhkX3NldF9zeW5jcmF0ZShhaGQsIGRldmluZm8sIHBlcmlvZCwgb2Zmc2V0LCBwcHJfb3B0aW9ucywKKwkJCSBBSERfVFJBTlNfR09BTCwgLypwYXVzZWQqL0ZBTFNFKTsKK30KKwordm9pZAorYWhkX2ZyZWV6ZV9zaW1xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlhaGQtPnBsYXRmb3JtX2RhdGEtPnFmcm96ZW4rKzsKKwlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuID09IDEpIHsKKwkJc2NzaV9ibG9ja19yZXF1ZXN0cyhhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QpOworCQlhaGRfcGxhdGZvcm1fYWJvcnRfc2NicyhhaGQsIENBTV9UQVJHRVRfV0lMRENBUkQsIEFMTF9DSEFOTkVMUywKKwkJCQkJQ0FNX0xVTl9XSUxEQ0FSRCwgU0NCX0xJU1RfTlVMTCwKKwkJCQkJUk9MRV9JTklUSUFUT1IsIENBTV9SRVFVRVVFX1JFUSk7CisJfQorfQorCit2b2lkCithaGRfcmVsZWFzZV9zaW1xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl1X2xvbmcgczsKKwlpbnQgICAgdW5ibG9ja19yZXFzOworCisJdW5ibG9ja19yZXFzID0gMDsKKwlhaGRfbG9jayhhaGQsICZzKTsKKwlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuID4gMCkKKwkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuLS07CisJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiA9PSAwKSB7CisJCXVuYmxvY2tfcmVxcyA9IDE7CisJfQorCWlmIChBSERfRFZfU0lNUV9GUk9aRU4oYWhkKQorCSAmJiAoKGFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSERfRFZfV0FJVF9TSU1RX1JFTEVBU0UpICE9IDApKSB7CisJCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJj0gfkFIRF9EVl9XQUlUX1NJTVFfUkVMRUFTRTsKKwkJdXAoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2VtKTsKKwl9CisJYWhkX3NjaGVkdWxlX3J1bnEoYWhkKTsKKwlhaGRfdW5sb2NrKGFoZCwgJnMpOworCS8qCisJICogVGhlcmUgaXMgc3RpbGwgYSByYWNlIGhlcmUuICBUaGUgbWlkLWxheWVyCisJICogc2hvdWxkIGtlZXAgaXRzIG93biBmcmVlemUgY291bnQgYW5kIHVzZQorCSAqIGEgYm90dG9tIGhhbGYgaGFuZGxlciB0byBydW4gdGhlIHF1ZXVlcworCSAqIHNvIHdlIGNhbiB1bmJsb2NrIHdpdGggb3VyIG93biBsb2NrIGhlbGQuCisJICovCisJaWYgKHVuYmxvY2tfcmVxcykKKwkJc2NzaV91bmJsb2NrX3JlcXVlc3RzKGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCk7Cit9CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfc2VtX3RpbWVvdXQodV9sb25nIGFyZykKK3sKKwlzdHJ1Y3QJc2NiICpzY2I7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkOworCXVfbG9uZwlzOworCisJc2NiID0gKHN0cnVjdCBzY2IgKilhcmc7CisJYWhkID0gc2NiLT5haGRfc29mdGM7CisJYWhkX2xvY2soYWhkLCAmcyk7CisJaWYgKChzY2ItPnBsYXRmb3JtX2RhdGEtPmZsYWdzICYgQUhEX1NDQl9VUF9FSF9TRU0pICE9IDApIHsKKwkJc2NiLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmPSB+QUhEX1NDQl9VUF9FSF9TRU07CisJCXVwKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmVoX3NlbSk7CisJfQorCWFoZF91bmxvY2soYWhkLCAmcyk7Cit9CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfZGV2X3RpbWVkX3VuZnJlZXplKHVfbG9uZyBhcmcpCit7CisJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYWhkX3NvZnRjICphaGQ7CisJdV9sb25nIHM7CisKKwlkZXYgPSAoc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKilhcmc7CisJYWhkID0gZGV2LT50YXJnZXQtPmFoZDsKKwlhaGRfbG9jayhhaGQsICZzKTsKKwlkZXYtPmZsYWdzICY9IH5BSERfREVWX1RJTUVSX0FDVElWRTsKKwlpZiAoZGV2LT5xZnJvemVuID4gMCkKKwkJZGV2LT5xZnJvemVuLS07CisJaWYgKGRldi0+cWZyb3plbiA9PSAwCisJICYmIChkZXYtPmZsYWdzICYgQUhEX0RFVl9PTl9SVU5fTElTVCkgPT0gMCkKKwkJYWhkX2xpbnV4X3J1bl9kZXZpY2VfcXVldWUoYWhkLCBkZXYpOworCWlmICgoZGV2LT5mbGFncyAmIEFIRF9ERVZfVU5DT05GSUdVUkVEKSAhPSAwCisJICYmIGRldi0+YWN0aXZlID09IDApCisJCWFoZF9saW51eF9mcmVlX2RldmljZShhaGQsIGRldik7CisJYWhkX3VubG9jayhhaGQsICZzKTsKK30KKwordm9pZAorYWhkX3BsYXRmb3JtX2R1bXBfY2FyZF9zdGF0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKKwlpbnQgdGFyZ2V0OworCWludCBtYXh0YXJnZXQ7CisJaW50IGx1bjsKKwlpbnQgaTsKKworCW1heHRhcmdldCA9IChhaGQtPmZlYXR1cmVzICYgQUhEX1dJREUpID8gMTUgOiA3OworCWZvciAodGFyZ2V0ID0gMDsgdGFyZ2V0IDw9bWF4dGFyZ2V0OyB0YXJnZXQrKykgeworCisJCWZvciAobHVuID0gMDsgbHVuIDwgQUhEX05VTV9MVU5TOyBsdW4rKykgeworCQkJc3RydWN0IGFoZF9jbWQgKmFjbWQ7CisKKwkJCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgMCwgdGFyZ2V0LAorCQkJCQkJICAgbHVuLCAvKmFsbG9jKi9GQUxTRSk7CisJCQlpZiAoZGV2ID09IE5VTEwpCisJCQkJY29udGludWU7CisKKwkJCXByaW50ZigiRGV2USglZDolZDolZCk6ICIsIDAsIHRhcmdldCwgbHVuKTsKKwkJCWkgPSAwOworCQkJVEFJTFFfRk9SRUFDSChhY21kLCAmZGV2LT5idXN5cSwgYWNtZF9saW5rcy50cWUpIHsKKwkJCQlpZiAoaSsrID4gQUhEX1NDQl9NQVgpCisJCQkJCWJyZWFrOworCQkJfQorCQkJcHJpbnRmKCIlZCB3YWl0aW5nXG4iLCBpKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBfX2luaXQKK2FoZF9saW51eF9pbml0KHZvaWQpCit7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXJldHVybiBhaGRfbGludXhfZGV0ZWN0KCZhaWM3OXh4X2RyaXZlcl90ZW1wbGF0ZSk7CisjZWxzZQorCXNjc2lfcmVnaXN0ZXJfbW9kdWxlKE1PRFVMRV9TQ1NJX0hBLCAmYWljNzl4eF9kcml2ZXJfdGVtcGxhdGUpOworCWlmIChhaWM3OXh4X2RyaXZlcl90ZW1wbGF0ZS5wcmVzZW50ID09IDApIHsKKwkJc2NzaV91bnJlZ2lzdGVyX21vZHVsZShNT0RVTEVfU0NTSV9IQSwKKwkJCQkgICAgICAgJmFpYzc5eHhfZHJpdmVyX3RlbXBsYXRlKTsKKwkJcmV0dXJuICgtRU5PREVWKTsKKwl9CisKKwlyZXR1cm4gKDApOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorYWhkX2xpbnV4X2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgYWhkX3NvZnRjICphaGQ7CisKKwkvKgorCSAqIFNodXRkb3duIERWIHRocmVhZHMgYmVmb3JlIGdvaW5nIGludG8gdGhlIFNDU0kgbWlkLWxheWVyLgorCSAqIFRoaXMgYXZvaWRzIHNpdHVhdGlvbnMgd2hlcmUgdGhlIG1pZC1sYXllciBsb2NrcyB0aGUgZW50aXJlCisJICoga2VybmVsIHNvIHRoYXQgd2FpdGluZyBmb3Igb3VyIERWIHRocmVhZHMgdG8gZXhpdCBsZWFkcworCSAqIHRvIGRlYWRsb2NrLgorCSAqLworCVRBSUxRX0ZPUkVBQ0goYWhkLCAmYWhkX3RhaWxxLCBsaW5rcykgeworCisJCWFoZF9saW51eF9raWxsX2R2X3RocmVhZChhaGQpOworCX0KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCS8qCisJICogSW4gMi40IHdlIGhhdmUgdG8gdW5yZWdpc3RlciBmcm9tIHRoZSBQQ0kgY29yZSBfYWZ0ZXJfCisJICogdW5yZWdpc3RlcmluZyBmcm9tIHRoZSBzY3NpIG1pZGxheWVyIHRvIGF2b2lkIGRhbmdsaW5nCisJICogcmVmZXJlbmNlcy4KKwkgKi8KKwlzY3NpX3VucmVnaXN0ZXJfbW9kdWxlKE1PRFVMRV9TQ1NJX0hBLCAmYWljNzl4eF9kcml2ZXJfdGVtcGxhdGUpOworI2VuZGlmCisJYWhkX2xpbnV4X3BjaV9leGl0KCk7Cit9CisKK21vZHVsZV9pbml0KGFoZF9saW51eF9pbml0KTsKK21vZHVsZV9leGl0KGFoZF9saW51eF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNWY5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5oCkBAIC0wLDAgKzEsMTE0NyBAQAorLyoKKyAqIEFkYXB0ZWMgQUlDNzl4eCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9saW51eC9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5oIzEzNyAkCisgKgorICovCisjaWZuZGVmIF9BSUM3OVhYX0xJTlVYX0hfCisjZGVmaW5lIF9BSUM3OVhYX0xJTlVYX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+IC8qIEZvciB0YXNrbGV0IHN1cHBvcnQuICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisvKiBDb3JlIFNDU0kgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQUlDX0xJQl9QUkVGSVggYWhkCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKy8qIE5hbWUgc3BhY2UgY29uZmxpY3Qgd2l0aCBCU0QgcXVldWUgbWFjcm9zICovCisjaWZkZWYgTElTVF9IRUFECisjdW5kZWYgTElTVF9IRUFECisjZW5kaWYKKworI2luY2x1ZGUgImNhbS5oIgorI2luY2x1ZGUgInF1ZXVlLmgiCisjaW5jbHVkZSAic2NzaV9tZXNzYWdlLmgiCisjaW5jbHVkZSAic2NzaV9pdS5oIgorI2luY2x1ZGUgImFpY2xpYi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGVidWdnaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIENPTkZJR19BSUM3OVhYX0RFQlVHX0VOQUJMRQorI2lmZGVmIENPTkZJR19BSUM3OVhYX0RFQlVHX01BU0sKKyNkZWZpbmUgQUhEX0RFQlVHIDEKKyNkZWZpbmUgQUhEX0RFQlVHX09QVFMgQ09ORklHX0FJQzc5WFhfREVCVUdfTUFTSworI2Vsc2UKKy8qCisgKiBDb21waWxlIGluIGRlYnVnZ2luZyBjb2RlLCBidXQgZG8gbm90IGVuYWJsZSBhbnkgcHJpbnRmcy4KKyAqLworI2RlZmluZSBBSERfREVCVUcgMQorI2RlZmluZSBBSERfREVCVUdfT1BUUyAwCisjZW5kaWYKKy8qIE5vIGRlYnVnZ2luZyBjb2RlLiAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1pc2MgTWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCXJvdW5kdXAoeCwgeSkgICAoKCgoeCkrKCh5KS0xKSkvKHkpKSooeSkpCisjZGVmaW5lCXBvd2Vyb2YyKHgpCSgoKCh4KS0xKSYoeCkpPT0wKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBGb3J3YXJkIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGFoZF9zb2Z0YzsKK3R5cGVkZWYgc3RydWN0IHBjaV9kZXYgKmFoZF9kZXZfc29mdGNfdDsKK3R5cGVkZWYgU2NzaV9DbW5kICAgICAgKmFoZF9pb19jdHhfdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQnl0ZSBPcmRlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgYWhkX2h0b2JlMTYoeCkJY3B1X3RvX2JlMTYoeCkKKyNkZWZpbmUgYWhkX2h0b2JlMzIoeCkJY3B1X3RvX2JlMzIoeCkKKyNkZWZpbmUgYWhkX2h0b2JlNjQoeCkJY3B1X3RvX2JlNjQoeCkKKyNkZWZpbmUgYWhkX2h0b2xlMTYoeCkJY3B1X3RvX2xlMTYoeCkKKyNkZWZpbmUgYWhkX2h0b2xlMzIoeCkJY3B1X3RvX2xlMzIoeCkKKyNkZWZpbmUgYWhkX2h0b2xlNjQoeCkJY3B1X3RvX2xlNjQoeCkKKworI2RlZmluZSBhaGRfYmUxNnRvaCh4KQliZTE2X3RvX2NwdSh4KQorI2RlZmluZSBhaGRfYmUzMnRvaCh4KQliZTMyX3RvX2NwdSh4KQorI2RlZmluZSBhaGRfYmU2NHRvaCh4KQliZTY0X3RvX2NwdSh4KQorI2RlZmluZSBhaGRfbGUxNnRvaCh4KQlsZTE2X3RvX2NwdSh4KQorI2RlZmluZSBhaGRfbGUzMnRvaCh4KQlsZTMyX3RvX2NwdSh4KQorI2RlZmluZSBhaGRfbGU2NHRvaCh4KQlsZTY0X3RvX2NwdSh4KQorCisjaWZuZGVmIExJVFRMRV9FTkRJQU4KKyNkZWZpbmUgTElUVExFX0VORElBTiAxMjM0CisjZW5kaWYKKworI2lmbmRlZiBCSUdfRU5ESUFOCisjZGVmaW5lIEJJR19FTkRJQU4gNDMyMQorI2VuZGlmCisKKyNpZm5kZWYgQllURV9PUkRFUgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorI2RlZmluZSBCWVRFX09SREVSIEJJR19FTkRJQU4KKyNlbmRpZgorI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorI2RlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyNlbmRpZgorI2VuZGlmIC8qIEJZVEVfT1JERVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogQ29uZmlndXJhdGlvbiBEYXRhICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiB1aW50MzJfdCBhaWM3OXh4X2FsbG93X21lbWlvOworZXh0ZXJuIGludCBhaWM3OXh4X2RldGVjdF9jb21wbGV0ZTsKK2V4dGVybiBTY3NpX0hvc3RfVGVtcGxhdGUgYWljNzl4eF9kcml2ZXJfdGVtcGxhdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBCdXMgU3BhY2UvRE1BICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgdWludDMyX3QgYnVzX3NpemVfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlCVVNfU1BBQ0VfTUVNSU8sCisJQlVTX1NQQUNFX1BJTworfSBidXNfc3BhY2VfdGFnX3Q7CisKK3R5cGVkZWYgdW5pb24geworCXVfbG9uZwkJICBpb3BvcnQ7CisJdm9sYXRpbGUgdWludDhfdCBfX2lvbWVtICptYWRkcjsKK30gYnVzX3NwYWNlX2hhbmRsZV90OworCit0eXBlZGVmIHN0cnVjdCBidXNfZG1hX3NlZ21lbnQKK3sKKwlkbWFfYWRkcl90CWRzX2FkZHI7CisJYnVzX3NpemVfdAlkc19sZW47Cit9IGJ1c19kbWFfc2VnbWVudF90OworCitzdHJ1Y3QgYWhkX2xpbnV4X2RtYV90YWcKK3sKKwlidXNfc2l6ZV90CWFsaWdubWVudDsKKwlidXNfc2l6ZV90CWJvdW5kYXJ5OworCWJ1c19zaXplX3QJbWF4c2l6ZTsKK307Cit0eXBlZGVmIHN0cnVjdCBhaGRfbGludXhfZG1hX3RhZyogYnVzX2RtYV90YWdfdDsKKworc3RydWN0IGFoZF9saW51eF9kbWFtYXAKK3sKKwlkbWFfYWRkcl90CWJ1c19hZGRyOworfTsKK3R5cGVkZWYgc3RydWN0IGFoZF9saW51eF9kbWFtYXAqIGJ1c19kbWFtYXBfdDsKKwordHlwZWRlZiBpbnQgYnVzX2RtYV9maWx0ZXJfdCh2b2lkKiwgZG1hX2FkZHJfdCk7Cit0eXBlZGVmIHZvaWQgYnVzX2RtYW1hcF9jYWxsYmFja190KHZvaWQgKiwgYnVzX2RtYV9zZWdtZW50X3QgKiwgaW50LCBpbnQpOworCisjZGVmaW5lIEJVU19ETUFfV0FJVE9LCQkweDAKKyNkZWZpbmUgQlVTX0RNQV9OT1dBSVQJCTB4MQorI2RlZmluZSBCVVNfRE1BX0FMTE9DTk9XCTB4MgorI2RlZmluZSBCVVNfRE1BX0xPQURfU0VHUwkweDQJLyoKKwkJCQkJICogQXJndW1lbnQgaXMgYW4gUy9HIGxpc3Qgbm90CisJCQkJCSAqIGEgc2luZ2xlIGJ1ZmZlci4KKwkJCQkJICovCisKKyNkZWZpbmUgQlVTX1NQQUNFX01BWEFERFIJMHhGRkZGRkZGRgorI2RlZmluZSBCVVNfU1BBQ0VfTUFYQUREUl8zMkJJVAkweEZGRkZGRkZGCisjZGVmaW5lIEJVU19TUEFDRV9NQVhTSVpFXzMyQklUCTB4RkZGRkZGRkYKKworaW50CWFoZF9kbWFfdGFnX2NyZWF0ZShzdHJ1Y3QgYWhkX3NvZnRjICosIGJ1c19kbWFfdGFnX3QgLypwYXJlbnQqLywKKwkJCSAgIGJ1c19zaXplX3QgLyphbGlnbm1lbnQqLywgYnVzX3NpemVfdCAvKmJvdW5kYXJ5Ki8sCisJCQkgICBkbWFfYWRkcl90IC8qbG93YWRkciovLCBkbWFfYWRkcl90IC8qaGlnaGFkZHIqLywKKwkJCSAgIGJ1c19kbWFfZmlsdGVyX3QqLypmaWx0ZXIqLywgdm9pZCAqLypmaWx0ZXJhcmcqLywKKwkJCSAgIGJ1c19zaXplX3QgLyptYXhzaXplKi8sIGludCAvKm5zZWdtZW50cyovLAorCQkJICAgYnVzX3NpemVfdCAvKm1heHNlZ3N6Ki8sIGludCAvKmZsYWdzKi8sCisJCQkgICBidXNfZG1hX3RhZ190ICovKmRtYV90YWdwKi8pOworCit2b2lkCWFoZF9kbWFfdGFnX2Rlc3Ryb3koc3RydWN0IGFoZF9zb2Z0YyAqLCBidXNfZG1hX3RhZ190IC8qdGFnKi8pOworCitpbnQJYWhkX2RtYW1lbV9hbGxvYyhzdHJ1Y3QgYWhkX3NvZnRjICosIGJ1c19kbWFfdGFnX3QgLypkbWF0Ki8sCisJCQkgdm9pZCoqIC8qdmFkZHIqLywgaW50IC8qZmxhZ3MqLywKKwkJCSBidXNfZG1hbWFwX3QqIC8qbWFwcCovKTsKKwordm9pZAlhaGRfZG1hbWVtX2ZyZWUoc3RydWN0IGFoZF9zb2Z0YyAqLCBidXNfZG1hX3RhZ190IC8qZG1hdCovLAorCQkJdm9pZCogLyp2YWRkciovLCBidXNfZG1hbWFwX3QgLyptYXAqLyk7CisKK3ZvaWQJYWhkX2RtYW1hcF9kZXN0cm95KHN0cnVjdCBhaGRfc29mdGMgKiwgYnVzX2RtYV90YWdfdCAvKnRhZyovLAorCQkJICAgYnVzX2RtYW1hcF90IC8qbWFwKi8pOworCitpbnQJYWhkX2RtYW1hcF9sb2FkKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYnVzX2RtYV90YWdfdCAvKmRtYXQqLywKKwkJCWJ1c19kbWFtYXBfdCAvKm1hcCovLCB2b2lkICogLypidWYqLywKKwkJCWJ1c19zaXplX3QgLypidWZsZW4qLywgYnVzX2RtYW1hcF9jYWxsYmFja190ICosCisJCQl2b2lkICovKmNhbGxiYWNrX2FyZyovLCBpbnQgLypmbGFncyovKTsKKworaW50CWFoZF9kbWFtYXBfdW5sb2FkKHN0cnVjdCBhaGRfc29mdGMgKiwgYnVzX2RtYV90YWdfdCwgYnVzX2RtYW1hcF90KTsKKworLyoKKyAqIE9wZXJhdGlvbnMgcGVyZm9ybWVkIGJ5IGFoZF9kbWFtYXBfc3luYygpLgorICovCisjZGVmaW5lIEJVU19ETUFTWU5DX1BSRVJFQUQJMHgwMQkvKiBwcmUtcmVhZCBzeW5jaHJvbml6YXRpb24gKi8KKyNkZWZpbmUgQlVTX0RNQVNZTkNfUE9TVFJFQUQJMHgwMgkvKiBwb3N0LXJlYWQgc3luY2hyb25pemF0aW9uICovCisjZGVmaW5lIEJVU19ETUFTWU5DX1BSRVdSSVRFCTB4MDQJLyogcHJlLXdyaXRlIHN5bmNocm9uaXphdGlvbiAqLworI2RlZmluZSBCVVNfRE1BU1lOQ19QT1NUV1JJVEUJMHgwOAkvKiBwb3N0LXdyaXRlIHN5bmNocm9uaXphdGlvbiAqLworCisvKgorICogWFhYCisgKiBhaGRfZG1hbWFwX3N5bmMgaXMgb25seSB1c2VkIG9uIGJ1ZmZlcnMgYWxsb2NhdGVkIHdpdGgKKyAqIHRoZSBwY2lfYWxsb2NfY29uc2lzdGVudCgpIEFQSS4gIEFsdGhvdWdoIEknbSBub3Qgc3VyZSBob3cKKyAqIHRoaXMgd29ya3Mgb24gYXJjaGl0ZWN0dXJlcyB3aXRoIGEgd3JpdGUgYnVmZmVyLCBMaW51eCBkb2VzCisgKiBub3QgaGF2ZSBhbiBBUEkgdG8gc3luYyAiY29oZXJlbnQiIG1lbW9yeS4gIFBlcmhhcHMgd2UgbmVlZAorICogdG8gZG8gYW4gbWIoKT8KKyAqLworI2RlZmluZSBhaGRfZG1hbWFwX3N5bmMoYWhkLCBkbWFfdGFnLCBkbWFtYXAsIG9mZnNldCwgbGVuLCBvcCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFRpbWVyIERhdGFTdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QgYWhkX3RpbWVyX3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ09ORklHX0FJQzc5WFhfUkVHX1BSRVRUWV9QUklOVAorI2RlZmluZSBBSUNfREVCVUdfUkVHSVNURVJTIDEKKyNlbHNlCisjZGVmaW5lIEFJQ19ERUJVR19SRUdJU1RFUlMgMAorI2VuZGlmCisjaW5jbHVkZSAiYWljNzl4eC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVGltZXIgRmFjaWxpdGllcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBhaGRfdGltZXJfaW5pdCBpbml0X3RpbWVyCisjZGVmaW5lIGFoZF90aW1lcl9zdG9wIGRlbF90aW1lcl9zeW5jCit0eXBlZGVmIHZvaWQgYWhkX2xpbnV4X2NhbGxiYWNrX3QgKHVfbG9uZyk7ICAKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF90aW1lcl9yZXNldChhaGRfdGltZXJfdCAqdGltZXIsIHVfaW50IHVzZWMsCisJCQkJICAgICBhaGRfY2FsbGJhY2tfdCAqZnVuYywgdm9pZCAqYXJnKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9zY2JfdGltZXJfcmVzZXQoc3RydWN0IHNjYiAqc2NiLCB1X2ludCB1c2VjKTsKKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF90aW1lcl9yZXNldChhaGRfdGltZXJfdCAqdGltZXIsIHVfaW50IHVzZWMsIGFoZF9jYWxsYmFja190ICpmdW5jLCB2b2lkICphcmcpCit7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkOworCisJYWhkID0gKHN0cnVjdCBhaGRfc29mdGMgKilhcmc7CisJZGVsX3RpbWVyKHRpbWVyKTsKKwl0aW1lci0+ZGF0YSA9ICh1X2xvbmcpYXJnOworCXRpbWVyLT5leHBpcmVzID0gamlmZmllcyArICh1c2VjICogSFopLzEwMDAwMDA7CisJdGltZXItPmZ1bmN0aW9uID0gKGFoZF9saW51eF9jYWxsYmFja190KilmdW5jOworCWFkZF90aW1lcih0aW1lcik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfc2NiX3RpbWVyX3Jlc2V0KHN0cnVjdCBzY2IgKnNjYiwgdV9pbnQgdXNlYykKK3sKKwltb2RfdGltZXIoJnNjYi0+aW9fY3R4LT5laF90aW1lb3V0LCBqaWZmaWVzICsgKHVzZWMgKiBIWikvMTAwMDAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTTVAgc3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApIHx8IGRlZmluZWQoU0NTSV9IQVNfSE9TVF9MT0NLKSkKKyNkZWZpbmUgQUhEX1NDU0lfSEFTX0hPU1RfTE9DSyAxCisjZWxzZQorI2RlZmluZSBBSERfU0NTSV9IQVNfSE9TVF9MT0NLIDAKKyNlbmRpZgorCisjZGVmaW5lIEFJQzc5WFhfRFJJVkVSX1ZFUlNJT04gIjEuMy4xMSIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogRnJvbnQgRW5kIFF1ZXVlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBEYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGNhc3QgdGhlIExpbnV4IHN0cnVjdCBzY3NpX2NtbmQgdG8gc29tZXRoaW5nCisgKiB0aGF0IGFsbG93cyB1cyB0byB1c2UgdGhlIHF1ZXVlIG1hY3Jvcy4gIFRoZSBsaW51eCBzdHJ1Y3R1cmUgaGFzCisgKiBwbGVudHkgb2Ygc3BhY2UgdG8gaG9sZCB0aGUgbGlua3MgZmllbGRzIGFzIHJlcXVpcmVkIGJ5IHRoZSBxdWV1ZQorICogbWFjcm9zLCBidXQgdGhlIHF1ZXVlIG1hY29ycyByZXF1aXJlIHRoZW0gdG8gaGF2ZSB0aGUgY29ycmVjdCB0eXBlLgorICovCitzdHJ1Y3QgYWhkX2NtZF9pbnRlcm5hbCB7CisJLyogQXJlYSBvd25lZCBieSB0aGUgTGludXggc2NzaSBsYXllci4gKi8KKwl1aW50OF90CXByaXZhdGVbb2Zmc2V0b2Yoc3RydWN0IHNjc2lfY21uZCwgU0NwLlN0YXR1cyldOworCXVuaW9uIHsKKwkJU1RBSUxRX0VOVFJZKGFoZF9jbWQpCXN0ZTsKKwkJTElTVF9FTlRSWShhaGRfY21kKQlsZTsKKwkJVEFJTFFfRU5UUlkoYWhkX2NtZCkJdHFlOworCX0gbGlua3M7CisJdWludDMyX3QJCQllbmQ7Cit9OworCitzdHJ1Y3QgYWhkX2NtZCB7CisJdW5pb24geworCQlzdHJ1Y3QgYWhkX2NtZF9pbnRlcm5hbAlpY21kOworCQlzdHJ1Y3Qgc2NzaV9jbW5kCXNjc2lfY21kOworCX0gdW47Cit9OworCisjZGVmaW5lIGFjbWRfaWNtZChjbWQpICgoY21kKS0+dW4uaWNtZCkKKyNkZWZpbmUgYWNtZF9zY3NpX2NtZChjbWQpICgoY21kKS0+dW4uc2NzaV9jbWQpCisjZGVmaW5lIGFjbWRfbGlua3MgdW4uaWNtZC5saW5rcworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIERldmljZSBEYXRhIFN0cnVjdHVyZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEEgcGVyIHByb2JlZCBkZXZpY2Ugc3RydWN0dXJlIHVzZWQgdG8gZGVhbCB3aXRoIHNvbWUgZXJyb3IgcmVjb3ZlcnkKKyAqIHNjZW5hcmlvcyB0aGF0IHRoZSBMaW51eCBtaWQtbGF5ZXIgY29kZSBqdXN0IGRvZXNuJ3Qga25vdyBob3cgdG8KKyAqIGhhbmRsZS4gIFRoZSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGZvciBhIGRldmljZSBvbmx5IGJlY29tZXMgcGVyc2lzdGVudAorICogYWZ0ZXIgYSBzdWNjZXNzZnVsbHkgY29tcGxldGVkIGlucXVpcnkgY29tbWFuZCB0byB0aGUgdGFyZ2V0IHdoZW4KKyAqIHRoYXQgaW5xdWlyeSBkYXRhIGluZGljYXRlcyBhIGx1biBpcyBwcmVzZW50LgorICovCitUQUlMUV9IRUFEKGFoZF9idXN5cSwgYWhkX2NtZCk7Cit0eXBlZGVmIGVudW0geworCUFIRF9ERVZfVU5DT05GSUdVUkVECSA9IDB4MDEsCisJQUhEX0RFVl9GUkVFWkVfVElMX0VNUFRZID0gMHgwMiwgLyogRnJlZXplIHF1ZXVlIHVudGlsIGFjdGl2ZSA9PSAwICovCisJQUhEX0RFVl9USU1FUl9BQ1RJVkUJID0gMHgwNCwgLyogT3VyIHRpbWVyIGlzIGFjdGl2ZSAqLworCUFIRF9ERVZfT05fUlVOX0xJU1QJID0gMHgwOCwgLyogUXVldWVkIHRvIGJlIHJ1biBsYXRlciAqLworCUFIRF9ERVZfUV9CQVNJQwkJID0gMHgxMCwgLyogQWxsb3cgYmFzaWMgZGV2aWNlIHF1ZXVpbmcgKi8KKwlBSERfREVWX1FfVEFHR0VECSA9IDB4MjAsIC8qIEFsbG93IGZ1bGwgU0NTSTIgY29tbWFuZCBxdWV1ZWluZyAqLworCUFIRF9ERVZfUEVSSU9ESUNfT1RBRwkgPSAweDQwLCAvKiBTZW5kIE9UQUcgdG8gcHJldmVudCBzdGFydmF0aW9uICovCisJQUhEX0RFVl9TTEFWRV9DT05GSUdVUkVEID0gMHg4MAkgLyogc2xhdmVfY29uZmlndXJlKCkgaGFzIGJlZW4gY2FsbGVkICovCit9IGFoZF9saW51eF9kZXZfZmxhZ3M7CisKK3N0cnVjdCBhaGRfbGludXhfdGFyZ2V0Oworc3RydWN0IGFoZF9saW51eF9kZXZpY2UgeworCVRBSUxRX0VOVFJZKGFoZF9saW51eF9kZXZpY2UpIGxpbmtzOworCXN0cnVjdAkJCWFoZF9idXN5cSBidXN5cTsKKworCS8qCisJICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgY3VycmVudGx5CisJICogcXVldWVkIHRvIHRoZSBkZXZpY2UuCisJICovCisJaW50CQkJYWN0aXZlOworCisJLyoKKwkgKiBUaGUgY3VycmVudGx5IGFsbG93ZWQgbnVtYmVyIG9mIAorCSAqIHRyYW5zYWN0aW9ucyB0aGF0IGNhbiBiZSBxdWV1ZWQgdG8KKwkgKiB0aGUgZGV2aWNlLiAgTXVzdCBiZSBzaWduZWQgZm9yCisJICogY29udmVyc2lvbiBmcm9tIHRhZ2dlZCB0byB1bnRhZ2dlZAorCSAqIG1vZGUgd2hlcmUgdGhlIGRldmljZSBtYXkgaGF2ZSBtb3JlCisJICogdGhhbiBvbmUgb3V0c3RhbmRpbmcgYWN0aXZlIHRyYW5zYWN0aW9uLgorCSAqLworCWludAkJCW9wZW5pbmdzOworCisJLyoKKwkgKiBBIHBvc2l0aXZlIGNvdW50IGluZGljYXRlcyB0aGF0IHRoaXMKKwkgKiBkZXZpY2UncyBxdWV1ZSBpcyBoYWx0ZWQuCisJICovCisJdV9pbnQJCQlxZnJvemVuOworCQorCS8qCisJICogQ3VtdWxhdGl2ZSBjb21tYW5kIGNvdW50ZXIuCisJICovCisJdV9sb25nCQkJY29tbWFuZHNfaXNzdWVkOworCisJLyoKKwkgKiBUaGUgbnVtYmVyIG9mIHRhZ2dlZCB0cmFuc2FjdGlvbnMgd2hlbgorCSAqIHJ1bm5pbmcgYXQgb3VyIGN1cnJlbnQgb3BlbmluZyBsZXZlbAorCSAqIHRoYXQgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBieQorCSAqIHRoaXMgZGV2aWNlIHNpbmNlIHRoZSBsYXN0IFFVRVVFIEZVTEwuCisJICovCisJdV9pbnQJCQl0YWdfc3VjY2Vzc19jb3VudDsKKyNkZWZpbmUgQUhEX1RBR19TVUNDRVNTX0lOVEVSVkFMIDUwCisKKwlhaGRfbGludXhfZGV2X2ZsYWdzCWZsYWdzOworCisJLyoKKwkgKiBQZXIgZGV2aWNlIHRpbWVyLgorCSAqLworCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOworCisJLyoKKwkgKiBUaGUgaGlnaCBsaW1pdCBmb3IgdGhlIHRhZ3MgdmFyaWFibGUuCisJICovCisJdV9pbnQJCQltYXh0YWdzOworCisJLyoKKwkgKiBUaGUgY29tcHV0ZWQgbnVtYmVyIG9mIHRhZ3Mgb3V0c3RhbmRpbmcKKwkgKiBhdCB0aGUgdGltZSBvZiB0aGUgbGFzdCBRVUVVRSBGVUxMIGV2ZW50LgorCSAqLworCXVfaW50CQkJdGFnc19vbl9sYXN0X3F1ZXVlZnVsbDsKKworCS8qCisJICogSG93IG1hbnkgdGltZXMgd2UgaGF2ZSBzZWVuIGEgcXVldWUgZnVsbAorCSAqIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIHRhZ3MuICBUaGlzIGlzIHVzZWQKKwkgKiB0byBzdG9wIG91ciBhZGFwdGl2ZSBxdWV1ZSBkZXB0aCBhbGdvcml0aG0KKwkgKiBvbiBkZXZpY2VzIHdpdGggYSBmaXhlZCBudW1iZXIgb2YgdGFncy4KKwkgKi8KKwl1X2ludAkJCWxhc3RfcXVldWVmdWxsX3NhbWVfY291bnQ7CisjZGVmaW5lIEFIRF9MT0NLX1RBR1NfQ09VTlQgNTAKKworCS8qCisJICogSG93IG1hbnkgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBxdWV1ZWQKKwkgKiB3aXRob3V0IHRoZSBkZXZpY2UgZ29pbmcgaWRsZS4gIFdlIHVzZQorCSAqIHRoaXMgc3RhdGlzdGljIHRvIGRldGVybWluZSB3aGVuIHRvIGlzc3VlCisJICogYW4gb3JkZXJlZCB0YWcgdG8gcHJldmVudCB0cmFuc2FjdGlvbgorCSAqIHN0YXJ2YXRpb24uICBUaGlzIHN0YXRpc3RpYyBpcyBvbmx5IHVwZGF0ZWQKKwkgKiBpZiB0aGUgQUhEX0RFVl9QRVJJT0RJQ19PVEFHIGZsYWcgaXMgc2V0CisJICogb24gdGhpcyBkZXZpY2UuCisJICovCisJdV9pbnQJCQljb21tYW5kc19zaW5jZV9pZGxlX29yX290YWc7CisjZGVmaW5lIEFIRF9PVEFHX1RIUkVTSAk1MDAKKworCWludAkJCWx1bjsKKwlTY3NpX0RldmljZQkgICAgICAgKnNjc2lfZGV2aWNlOworCXN0cnVjdAkJCWFoZF9saW51eF90YXJnZXQgKnRhcmdldDsKK307CisKK3R5cGVkZWYgZW51bSB7CisJQUhEX0RWX1JFUVVJUkVECQkgPSAweDAxLAorCUFIRF9JTlFfVkFMSUQJCSA9IDB4MDIsCisJQUhEX0JBU0lDX0RWCQkgPSAweDA0LAorCUFIRF9FTkhBTkNFRF9EVgkJID0gMHgwOAorfSBhaGRfbGludXhfdGFyZ19mbGFnczsKKworLyogRFYgU3RhdGVzICovCit0eXBlZGVmIGVudW0geworCUFIRF9EVl9TVEFURV9FWElUID0gMCwKKwlBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DLAorCUFIRF9EVl9TVEFURV9JTlFfQVNZTkMsCisJQUhEX0RWX1NUQVRFX0lOUV9BU1lOQ19WRVJJRlksCisJQUhEX0RWX1NUQVRFX1RVUiwKKwlBSERfRFZfU1RBVEVfUkVCRCwKKwlBSERfRFZfU1RBVEVfSU5RX1ZFUklGWSwKKwlBSERfRFZfU1RBVEVfV0VCLAorCUFIRF9EVl9TVEFURV9SRUIsCisJQUhEX0RWX1NUQVRFX1NVLAorCUFIRF9EVl9TVEFURV9CVVNZCit9IGFoZF9kdl9zdGF0ZTsKKworc3RydWN0IGFoZF9saW51eF90YXJnZXQgeworCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlCSAqZGV2aWNlc1tBSERfTlVNX0xVTlNdOworCWludAkJCSAgY2hhbm5lbDsKKwlpbnQJCQkgIHRhcmdldDsKKwlpbnQJCQkgIHJlZmNvdW50OworCXN0cnVjdCBhaGRfdHJhbnNpbmZvCSAgbGFzdF90aW5mbzsKKwlzdHJ1Y3QgYWhkX3NvZnRjCSAqYWhkOworCWFoZF9saW51eF90YXJnX2ZsYWdzCSAgZmxhZ3M7CisJc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhICppbnFfZGF0YTsKKwkvKgorCSAqIFRoZSBuZXh0ICJmYWxsYmFjayIgcGVyaW9kIHRvIHVzZSBmb3IgbmFycm93L3dpZGUgdHJhbnNmZXJzLgorCSAqLworCXVpbnQ4X3QJCQkgIGR2X25leHRfbmFycm93X3BlcmlvZDsKKwl1aW50OF90CQkJICBkdl9uZXh0X3dpZGVfcGVyaW9kOworCXVpbnQ4X3QJCQkgIGR2X21heF93aWR0aDsKKwl1aW50OF90CQkJICBkdl9tYXhfcHByX29wdGlvbnM7CisJdWludDhfdAkJCSAgZHZfbGFzdF9wcHJfb3B0aW9uczsKKwl1X2ludAkJCSAgZHZfZWNob19zaXplOworCWFoZF9kdl9zdGF0ZQkJICBkdl9zdGF0ZTsKKwl1X2ludAkJCSAgZHZfc3RhdGVfcmV0cnk7CisJdWludDhfdAkJCSAqZHZfYnVmZmVyOworCXVpbnQ4X3QJCQkgKmR2X2J1ZmZlcjE7CisKKwkvKgorCSAqIEN1bXVsYXRpdmUgY291bnRlciBvZiBlcnJvcnMuCisJICovCisJdV9sb25nCQkJZXJyb3JzX2RldGVjdGVkOworCXVfbG9uZwkJCWNtZHNfc2luY2VfZXJyb3I7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqIERlZmluaXRpb25zIFJlcXVpcmVkIGJ5IHRoZSBDb3JlICoqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIE51bWJlciBvZiBTRyBzZWdtZW50cyB3ZSByZXF1aXJlLiAgU28gbG9uZyBhcyB0aGUgUy9HIHNlZ21lbnRzIGZvcgorICogYSBwYXJ0aWN1bGFyIHRyYW5zYWN0aW9uIGFyZSBhbGxvY2F0ZWQgaW4gYSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMKKyAqIG1hbm5lciBhbmQgYXJlIGFsbG9jYXRlZCBiZWxvdyA0R0IsIHRoZSBudW1iZXIgb2YgUy9HIHNlZ21lbnRzIGlzCisgKiB1bnJlc3RyaWN0ZWQuCisgKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKy8qCisgKiBXZSBkeW5hbWljYWxseSBhZGp1c3QgdGhlIG51bWJlciBvZiBzZWdtZW50cyBpbiBwcmUtMi41IGtlcm5lbHMgdG8KKyAqIGF2b2lkIGZyYWdtZW50YXRpb24gaXNzdWVzIGluIHRoZSBTQ1NJIG1pZC1sYXllcidzIHByaXZhdGUgbWVtb3J5CisgKiBhbGxvY2F0b3IuICBTZWUgYWljNzl4eF9vc20uYyBhaGRfbGludXhfc2l6ZV9uc2VnKCkgZm9yIGRldGFpbHMuCisgKi8KK2V4dGVybiB1X2ludCBhaGRfbGludXhfbnNlZzsKKyNkZWZpbmUJQUhEX05TRUcgYWhkX2xpbnV4X25zZWcKKyNkZWZpbmUJQUhEX0xJTlVYX01JTl9OU0VHIDY0CisjZWxzZQorI2RlZmluZQlBSERfTlNFRyAxMjgKKyNlbmRpZgorCisvKgorICogUGVyLVNDQiBPU00gc3RvcmFnZS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlBSERfU0NCX1VQX0VIX1NFTSA9IDB4MQorfSBhaGRfbGludXhfc2NiX2ZsYWdzOworCitzdHJ1Y3Qgc2NiX3BsYXRmb3JtX2RhdGEgeworCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlCSpkZXY7CisJZG1hX2FkZHJfdAkJIGJ1Zl9idXNhZGRyOworCXVpbnQzMl90CQkgeGZlcl9sZW47CisJdWludDMyX3QJCSBzZW5zZV9yZXNpZDsJLyogQXV0by1TZW5zZSByZXNpZHVhbCAqLworCWFoZF9saW51eF9zY2JfZmxhZ3MJIGZsYWdzOworfTsKKworLyoKKyAqIERlZmluZSBhIHN0cnVjdHVyZSB1c2VkIGZvciBlYWNoIGhvc3QgYWRhcHRlci4gIEFsbCBtZW1iZXJzIGFyZQorICogYWxpZ25lZCBvbiBhIGJvdW5kYXJ5ID49IHRoZSBzaXplIG9mIHRoZSBtZW1iZXIgdG8gaG9ub3IgdGhlCisgKiBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIG9mIHRoZSB2YXJpb3VzIHBsYXRmb3JtcyBzdXBwb3J0ZWQgYnkKKyAqIHRoaXMgZHJpdmVyLgorICovCit0eXBlZGVmIGVudW0geworCUFIRF9EVl9XQUlUX1NJTVFfRU1QVFkJID0gMHgwMSwKKwlBSERfRFZfV0FJVF9TSU1RX1JFTEVBU0UgPSAweDAyLAorCUFIRF9EVl9BQ1RJVkUJCSA9IDB4MDQsCisJQUhEX0RWX1NIVVRET1dOCQkgPSAweDA4LAorCUFIRF9SVU5fQ01QTFRfUV9USU1FUgkgPSAweDEwCit9IGFoZF9saW51eF9zb2Z0Y19mbGFnczsKKworVEFJTFFfSEVBRChhaGRfY29tcGxldGVxLCBhaGRfY21kKTsKKworc3RydWN0IGFoZF9wbGF0Zm9ybV9kYXRhIHsKKwkvKgorCSAqIEZpZWxkcyBhY2Nlc3NlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LgorCSAqLworCXN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnZXRzW0FIRF9OVU1fVEFSR0VUU107IAorCVRBSUxRX0hFQUQoLCBhaGRfbGludXhfZGV2aWNlKSBkZXZpY2VfcnVucTsKKwlzdHJ1Y3QgYWhkX2NvbXBsZXRlcQkgY29tcGxldGVxOworCisJc3BpbmxvY2tfdAkJIHNwaW5fbG9jazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJIHJ1bnFfdGFza2xldDsKKwl1X2ludAkJCSBxZnJvemVuOworCXBpZF90CQkJIGR2X3BpZDsKKwlzdHJ1Y3QgdGltZXJfbGlzdAkgY29tcGxldGVxX3RpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0CSByZXNldF90aW1lcjsKKwlzdHJ1Y3QgdGltZXJfbGlzdAkgc3RhdHNfdGltZXI7CisJc3RydWN0IHNlbWFwaG9yZQkgZWhfc2VtOworCXN0cnVjdCBzZW1hcGhvcmUJIGR2X3NlbTsKKwlzdHJ1Y3Qgc2VtYXBob3JlCSBkdl9jbWRfc2VtOwkvKiBYWFggVGhpcyBuZWVkcyB0byBiZSBpbgorCQkJCQkJICogdGhlIHRhcmdldCBzdHJ1Y3QKKwkJCQkJCSAqLworCXN0cnVjdCBzY3NpX2RldmljZQkqZHZfc2NzaV9kZXY7CisJc3RydWN0IFNjc2lfSG9zdCAgICAgICAgKmhvc3Q7CQkvKiBwb2ludGVyIHRvIHNjc2kgaG9zdCAqLworI2RlZmluZSBBSERfTElOVVhfTk9JUlEJKCh1aW50MzJfdCl+MCkKKwl1aW50MzJfdAkJIGlycTsJCS8qIElSUSBmb3IgdGhpcyBhZGFwdGVyICovCisJdWludDMyX3QJCSBiaW9zX2FkZHJlc3M7CisJdWludDMyX3QJCSBtZW1fYnVzYWRkcjsJLyogTWVtIEJhc2UgQWRkciAqLworCXVpbnQ2NF90CQkgaHdfZG1hX21hc2s7CisJYWhkX2xpbnV4X3NvZnRjX2ZsYWdzCSBmbGFnczsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBPUyBVdGlsaXR5IFdyYXBwZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIHByaW50ZiBwcmludGsKKyNkZWZpbmUgTV9OT1dBSVQgR0ZQX0FUT01JQworI2RlZmluZSBNX1dBSVRPSyAwCisjZGVmaW5lIG1hbGxvYyhzaXplLCB0eXBlLCBmbGFncykga21hbGxvYyhzaXplLCBmbGFncykKKyNkZWZpbmUgZnJlZShwdHIsIHR5cGUpIGtmcmVlKHB0cikKKworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2RlbGF5KGxvbmcpOworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9kZWxheShsb25nIHVzZWMpCit7CisJLyoKKwkgKiB1ZGVsYXkgb24gTGludXggY2FuIGhhdmUgcHJvYmxlbXMgZm9yCisJICogbXVsdGktbWlsbGlzZWNvbmQgd2FpdHMuICBXYWl0IGF0IG1vc3QKKwkgKiAxMDI0dXMgcGVyIGNhbGwuCisJICovCisJd2hpbGUgKHVzZWMgPiAwKSB7CisJCXVkZWxheSh1c2VjICUgMTAyNCk7CisJCXVzZWMgLT0gMTAyNDsKKwl9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIExvdyBMZXZlbCBJL08gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSB1aW50OF90IGFoZF9pbmIoc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0KTsKK3N0YXRpYyBfX2lubGluZSB1aW50MTZfdCBhaGRfaW53X2F0b21pYyhzdHJ1Y3QgYWhkX3NvZnRjICogYWhkLCBsb25nIHBvcnQpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX291dGIoc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0LCB1aW50OF90IHZhbCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfb3V0d19hdG9taWMoc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwKKwkJCQkgICAgIGxvbmcgcG9ydCwgdWludDE2X3QgdmFsKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9vdXRzYihzdHJ1Y3QgYWhkX3NvZnRjICogYWhkLCBsb25nIHBvcnQsCisJCQkgICAgICAgdWludDhfdCAqLCBpbnQgY291bnQpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2luc2Ioc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0LAorCQkJICAgICAgIHVpbnQ4X3QgKiwgaW50IGNvdW50KTsKKworc3RhdGljIF9faW5saW5lIHVpbnQ4X3QKK2FoZF9pbmIoc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0KQoreworCXVpbnQ4X3QgeDsKKworCWlmIChhaGQtPnRhZ3NbMF0gPT0gQlVTX1NQQUNFX01FTUlPKSB7CisJCXggPSByZWFkYihhaGQtPmJzaHNbMF0ubWFkZHIgKyBwb3J0KTsKKwl9IGVsc2UgeworCQl4ID0gaW5iKGFoZC0+YnNoc1socG9ydCkgPj4gOF0uaW9wb3J0ICsgKChwb3J0KSAmIDB4RkYpKTsKKwl9CisJbWIoKTsKKwlyZXR1cm4gKHgpOworfQorCitzdGF0aWMgX19pbmxpbmUgdWludDE2X3QKK2FoZF9pbndfYXRvbWljKHN0cnVjdCBhaGRfc29mdGMgKiBhaGQsIGxvbmcgcG9ydCkKK3sKKwl1aW50OF90IHg7CisKKwlpZiAoYWhkLT50YWdzWzBdID09IEJVU19TUEFDRV9NRU1JTykgeworCQl4ID0gcmVhZHcoYWhkLT5ic2hzWzBdLm1hZGRyICsgcG9ydCk7CisJfSBlbHNlIHsKKwkJeCA9IGludyhhaGQtPmJzaHNbKHBvcnQpID4+IDhdLmlvcG9ydCArICgocG9ydCkgJiAweEZGKSk7CisJfQorCW1iKCk7CisJcmV0dXJuICh4KTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9vdXRiKHN0cnVjdCBhaGRfc29mdGMgKiBhaGQsIGxvbmcgcG9ydCwgdWludDhfdCB2YWwpCit7CisJaWYgKGFoZC0+dGFnc1swXSA9PSBCVVNfU1BBQ0VfTUVNSU8pIHsKKwkJd3JpdGViKHZhbCwgYWhkLT5ic2hzWzBdLm1hZGRyICsgcG9ydCk7CisJfSBlbHNlIHsKKwkJb3V0Yih2YWwsIGFoZC0+YnNoc1socG9ydCkgPj4gOF0uaW9wb3J0ICsgKHBvcnQgJiAweEZGKSk7CisJfQorCW1iKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfb3V0d19hdG9taWMoc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0LCB1aW50MTZfdCB2YWwpCit7CisJaWYgKGFoZC0+dGFnc1swXSA9PSBCVVNfU1BBQ0VfTUVNSU8pIHsKKwkJd3JpdGV3KHZhbCwgYWhkLT5ic2hzWzBdLm1hZGRyICsgcG9ydCk7CisJfSBlbHNlIHsKKwkJb3V0dyh2YWwsIGFoZC0+YnNoc1socG9ydCkgPj4gOF0uaW9wb3J0ICsgKHBvcnQgJiAweEZGKSk7CisJfQorCW1iKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfb3V0c2Ioc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0LCB1aW50OF90ICphcnJheSwgaW50IGNvdW50KQoreworCWludCBpOworCisJLyoKKwkgKiBUaGVyZSBpcyBwcm9iYWJseSBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyB0aGlzIG9uIExpbnV4CisJICogYnV0IHdlIGRvbid0IHVzZSB0aGlzIGZvciBhbnl0aGluZyBzcGVlZCBjcml0aWNhbCBhbmQgdGhpcworCSAqIHNob3VsZCB3b3JrLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlhaGRfb3V0YihhaGQsIHBvcnQsICphcnJheSsrKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9pbnNiKHN0cnVjdCBhaGRfc29mdGMgKiBhaGQsIGxvbmcgcG9ydCwgdWludDhfdCAqYXJyYXksIGludCBjb3VudCkKK3sKKwlpbnQgaTsKKworCS8qCisJICogVGhlcmUgaXMgcHJvYmFibHkgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gdGhpcyBvbiBMaW51eAorCSAqIGJ1dCB3ZSBkb24ndCB1c2UgdGhpcyBmb3IgYW55dGhpbmcgc3BlZWQgY3JpdGljYWwgYW5kIHRoaXMKKwkgKiBzaG91bGQgd29yay4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJKmFycmF5KysgPSBhaGRfaW5iKGFoZCwgcG9ydCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXRpYWxpemF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQJCWFoZF9saW51eF9yZWdpc3Rlcl9ob3N0KHN0cnVjdCBhaGRfc29mdGMgKiwKKwkJCQkJU2NzaV9Ib3N0X1RlbXBsYXRlICopOworCit1aW50NjRfdAlhaGRfbGludXhfZ2V0X21lbXNpemUodm9pZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogUHJldHR5IFByaW50aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgaW5mb19zdHIgeworCWNoYXIgKmJ1ZmZlcjsKKwlpbnQgbGVuZ3RoOworCW9mZl90IG9mZnNldDsKKwlpbnQgcG9zOworfTsKKwordm9pZAlhaGRfZm9ybWF0X3RyYW5zaW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sCisJCQkgICAgIHN0cnVjdCBhaGRfdHJhbnNpbmZvICp0aW5mbyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBMb2NraW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBMb2NrIHByb3RlY3RpbmcgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfbG9ja2luaXQoc3RydWN0IGFoZF9zb2Z0YyAqKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9sb2NrKHN0cnVjdCBhaGRfc29mdGMgKiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3VubG9jayhzdHJ1Y3QgYWhkX3NvZnRjICosIHVuc2lnbmVkIGxvbmcgKmZsYWdzKTsKKworLyogTG9jayBhY3F1aXNpdGlvbiBhbmQgcmVsZWFzZSBvZiB0aGUgYWJvdmUgbG9jayBpbiBtaWRsYXllciBlbnRyeSBwb2ludHMuICovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKHN0cnVjdCBhaGRfc29mdGMgKiwKKwkJCQkJCSAgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKHN0cnVjdCBhaGRfc29mdGMgKiwKKwkJCQkJCSAgICB1bnNpZ25lZCBsb25nICpmbGFncyk7CisKKy8qIExvY2sgaGVsZCBkdXJpbmcgY29tbWFuZCBjb21wZWxldGlvbiB0byB0aGUgdXBwZXIgbGF5ZXIgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9kb25lX2xvY2tpbml0KHN0cnVjdCBhaGRfc29mdGMgKik7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfZG9uZV9sb2NrKHN0cnVjdCBhaGRfc29mdGMgKiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2RvbmVfdW5sb2NrKHN0cnVjdCBhaGRfc29mdGMgKiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOworCisvKiBMb2NrIGhlbGQgZHVyaW5nIGFoZF9saXN0IG1hbmlwdWxhdGlvbiBhbmQgYWhkIHNvZnRjIGZyZWVzICovCitleHRlcm4gc3BpbmxvY2tfdCBhaGRfbGlzdF9zcGlubG9jazsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9saXN0X2xvY2tpbml0KHZvaWQpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2xpc3RfbG9jayh1bnNpZ25lZCBsb25nICpmbGFncyk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfbGlzdF91bmxvY2sodW5zaWduZWQgbG9uZyAqZmxhZ3MpOworCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX2xvY2tpbml0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlzcGluX2xvY2tfaW5pdCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2spOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX2xvY2soc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1bnNpZ25lZCBsb25nICpmbGFncykKK3sKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2ssICpmbGFncyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfdW5sb2NrKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2ssICpmbGFncyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJLyoKKwkgKiBJbiAyLjUuWCBhbmQgc29tZSAyLjQuWCB2ZXJzaW9ucywgdGhlIG1pZGxheWVyIHRha2VzIG91cgorCSAqIGxvY2sganVzdCBiZWZvcmUgY2FsbGluZyB1cywgc28gd2UgYXZvaWQgbG9ja2luZyBhZ2Fpbi4KKwkgKiBGb3Igb3RoZXIga2VybmVsIHZlcnNpb25zLCB0aGUgaW9fcmVxdWVzdF9sb2NrIGlzIHRha2VuCisJICoganVzdCBiZWZvcmUgb3VyIGVudHJ5IHBvaW50IGlzIGNhbGxlZC4gIEluIHRoaXMgY2FzZSwgd2UKKwkgKiB0cmFkZSB0aGUgaW9fcmVxdWVzdF9sb2NrIGZvciBvdXIgcGVyLXNvZnRjIGxvY2suCisJICovCisjaWYgQUhEX1NDU0lfSEFTX0hPU1RfTE9DSyA9PSAwCisJc3Bpbl91bmxvY2soJmlvX3JlcXVlc3RfbG9jayk7CisJc3Bpbl9sb2NrKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jayk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworI2lmIEFIRF9TQ1NJX0hBU19IT1NUX0xPQ0sgPT0gMAorCXNwaW5fdW5sb2NrKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jayk7CisJc3Bpbl9sb2NrKCZpb19yZXF1ZXN0X2xvY2spOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfZG9uZV9sb2NraW5pdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJLyoKKwkgKiBJbiAyLjUuWCwgb3VyIG93biBsb2NrIGlzIGhlbGQgZHVyaW5nIGNvbXBsZXRpb25zLgorCSAqIEluIHByZXZpb3VzIHZlcnNpb25zLCB0aGUgaW9fcmVxdWVzdF9sb2NrIGlzIHVzZWQuCisJICogSW4gZWl0aGVyIGNhc2UsIHdlIGNhbid0IGluaXRpYWxpemUgdGhpcyBsb2NrIGFnYWluLgorCSAqLworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX2RvbmVfbG9jayhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworI2lmIEFIRF9TQ1NJX0hBU19IT1NUX0xPQ0sgPT0gMAorCXNwaW5fbG9jaygmaW9fcmVxdWVzdF9sb2NrKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX2RvbmVfdW5sb2NrKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisjaWYgQUhEX1NDU0lfSEFTX0hPU1RfTE9DSyA9PSAwCisJc3Bpbl91bmxvY2soJmlvX3JlcXVlc3RfbG9jayk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9saXN0X2xvY2tpbml0KHZvaWQpCit7CisJc3Bpbl9sb2NrX2luaXQoJmFoZF9saXN0X3NwaW5sb2NrKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9saXN0X2xvY2sodW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFoZF9saXN0X3NwaW5sb2NrLCAqZmxhZ3MpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX2xpc3RfdW5sb2NrKHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFoZF9saXN0X3NwaW5sb2NrLCAqZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQQ0kgRGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFBDSU1feHh4OiBtYXNrIHRvIGxvY2F0ZSBzdWJmaWVsZCBpbiByZWdpc3RlcgorICogUENJUl94eHg6IGNvbmZpZyByZWdpc3RlciBvZmZzZXQKKyAqIFBDSUNfeHh4OiBkZXZpY2UgY2xhc3MKKyAqIFBDSVNfeHh4OiBkZXZpY2Ugc3ViY2xhc3MKKyAqIFBDSVBfeHh4OiBkZXZpY2UgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlCisgKiBQQ0lWX3h4eDogUENJIHZlbmRvciBJRCAob25seSByZXF1aXJlZCB0byBmaXh1cCBhbmNpZW50IGRldmljZXMpCisgKiBQQ0lEX3h4eDogZGV2aWNlIElECisgKi8KKyNkZWZpbmUgUENJUl9ERVZWRU5ET1IJCTB4MDAKKyNkZWZpbmUgUENJUl9WRU5ET1IJCTB4MDAKKyNkZWZpbmUgUENJUl9ERVZJQ0UJCTB4MDIKKyNkZWZpbmUgUENJUl9DT01NQU5ECQkweDA0CisjZGVmaW5lIFBDSU1fQ01EX1BPUlRFTgkJMHgwMDAxCisjZGVmaW5lIFBDSU1fQ01EX01FTUVOCQkweDAwMDIKKyNkZWZpbmUgUENJTV9DTURfQlVTTUFTVEVSRU4JMHgwMDA0CisjZGVmaW5lIFBDSU1fQ01EX01XUklDRU4JMHgwMDEwCisjZGVmaW5lIFBDSU1fQ01EX1BFUlJFU1BFTgkweDAwNDAKKyNkZWZpbmUJUENJTV9DTURfU0VSUkVTUEVOCTB4MDEwMAorI2RlZmluZSBQQ0lSX1NUQVRVUwkJMHgwNgorI2RlZmluZSBQQ0lSX1JFVklECQkweDA4CisjZGVmaW5lIFBDSVJfUFJPR0lGCQkweDA5CisjZGVmaW5lIFBDSVJfU1VCQ0xBU1MJCTB4MGEKKyNkZWZpbmUgUENJUl9DTEFTUwkJMHgwYgorI2RlZmluZSBQQ0lSX0NBQ0hFTE5TWgkJMHgwYworI2RlZmluZSBQQ0lSX0xBVFRJTUVSCQkweDBkCisjZGVmaW5lIFBDSVJfSEVBREVSVFlQRQkJMHgwZQorI2RlZmluZSBQQ0lNX01GREVWCQkweDgwCisjZGVmaW5lIFBDSVJfQklTVAkJMHgwZgorI2RlZmluZSBQQ0lSX0NBUF9QVFIJCTB4MzQKKworLyogY29uZmlnIHJlZ2lzdGVycyBmb3IgaGVhZGVyIHR5cGUgMCBkZXZpY2VzICovCisjZGVmaW5lIFBDSVJfTUFQUwkweDEwCisjZGVmaW5lIFBDSVJfU1VCVkVORF8wCTB4MmMKKyNkZWZpbmUgUENJUl9TVUJERVZfMAkweDJlCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUENJLVggZGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBDSVhSX0NPTU1BTkQJMHg5NgorI2RlZmluZSBQQ0lYUl9ERVZBRERSCTB4OTgKKyNkZWZpbmUgUENJWE1fREVWQUREUl9GTlVNCTB4MDAwMwkvKiBGdW5jdGlvbiBOdW1iZXIgKi8KKyNkZWZpbmUgUENJWE1fREVWQUREUl9ETlVNCTB4MDBGOAkvKiBEZXZpY2UgTnVtYmVyICovCisjZGVmaW5lIFBDSVhNX0RFVkFERFJfQk5VTQkweEZGMDAJLyogQnVzIE51bWJlciAqLworI2RlZmluZSBQQ0lYUl9TVEFUVVMJMHg5QQorI2RlZmluZSBQQ0lYTV9TVEFUVVNfNjRCSVQJMHgwMDAxCS8qIEFjdGl2ZSA2NGJpdCBjb25uZWN0aW9uIHRvIGRldmljZS4gKi8KKyNkZWZpbmUgUENJWE1fU1RBVFVTXzEzM0NBUAkweDAwMDIJLyogRGV2aWNlIGlzIDEzM01IeiBjYXBhYmxlICovCisjZGVmaW5lIFBDSVhNX1NUQVRVU19TQ0RJU0MJMHgwMDA0CS8qIFNwbGl0IENvbXBsZXRpb24gRGlzY2FyZGVkICovCisjZGVmaW5lIFBDSVhNX1NUQVRVU19VTkVYUFNDCTB4MDAwOAkvKiBVbmV4cGVjdGVkIFNwbGl0IENvbXBsZXRpb24gKi8KKyNkZWZpbmUgUENJWE1fU1RBVFVTX0NNUExFWERFVgkweDAwMTAJLyogRGV2aWNlIENvbXBsZXhpdHkgKHNldCA9PSBicmlkZ2UpICovCisjZGVmaW5lIFBDSVhNX1NUQVRVU19NQVhNUkRCQwkweDAwNjAJLyogTWF4aW11bSBCdXJzdCBSZWFkIENvdW50ICovCisjZGVmaW5lIFBDSVhNX1NUQVRVU19NQVhTUExJVFMJMHgwMzgwCS8qIE1heGltdW0gU3BsaXQgVHJhbnNhY3Rpb25zICovCisjZGVmaW5lIFBDSVhNX1NUQVRVU19NQVhDUkRTCTB4MUMwMAkvKiBNYXhpbXVtIEN1bXVsYXRpdmUgUmVhZCBTaXplICovCisjZGVmaW5lIFBDSVhNX1NUQVRVU19SQ1ZEU0NFTQkweDIwMDAJLyogUmVjZWl2ZWQgYSBTcGxpdCBDb21wIHcvRXJyb3IgbXNnICovCisKK2V4dGVybiBzdHJ1Y3QgcGNpX2RyaXZlciBhaWM3OXh4X3BjaV9kcml2ZXI7CisKK3R5cGVkZWYgZW51bQoreworCUFIRF9QT1dFUl9TVEFURV9EMCwKKwlBSERfUE9XRVJfU1RBVEVfRDEsCisJQUhEX1BPV0VSX1NUQVRFX0QyLAorCUFIRF9QT1dFUl9TVEFURV9EMworfSBhaGRfcG93ZXJfc3RhdGU7CisKK3ZvaWQgYWhkX3Bvd2VyX3N0YXRlX2NoYW5nZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkgICAgYWhkX3Bvd2VyX3N0YXRlIG5ld19zdGF0ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDSSBSb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQJCQkgYWhkX2xpbnV4X3BjaV9pbml0KHZvaWQpOwordm9pZAkJCSBhaGRfbGludXhfcGNpX2V4aXQodm9pZCk7CitpbnQJCQkgYWhkX3BjaV9tYXBfcmVnaXN0ZXJzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitpbnQJCQkgYWhkX3BjaV9tYXBfaW50KHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CisKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdCBhaGRfcGNpX3JlYWRfY29uZmlnKGFoZF9kZXZfc29mdGNfdCBwY2ksCisJCQkJCSAgICAgaW50IHJlZywgaW50IHdpZHRoKTsKKworc3RhdGljIF9faW5saW5lIHVpbnQzMl90CithaGRfcGNpX3JlYWRfY29uZmlnKGFoZF9kZXZfc29mdGNfdCBwY2ksIGludCByZWcsIGludCB3aWR0aCkKK3sKKwlzd2l0Y2ggKHdpZHRoKSB7CisJY2FzZSAxOgorCXsKKwkJdWludDhfdCByZXR2YWw7CisKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpLCByZWcsICZyZXR2YWwpOworCQlyZXR1cm4gKHJldHZhbCk7CisJfQorCWNhc2UgMjoKKwl7CisJCXVpbnQxNl90IHJldHZhbDsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCByZWcsICZyZXR2YWwpOworCQlyZXR1cm4gKHJldHZhbCk7CisJfQorCWNhc2UgNDoKKwl7CisJCXVpbnQzMl90IHJldHZhbDsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaSwgcmVnLCAmcmV0dmFsKTsKKwkJcmV0dXJuIChyZXR2YWwpOworCX0KKwlkZWZhdWx0OgorCQlwYW5pYygiYWhkX3BjaV9yZWFkX2NvbmZpZzogUmVhZCBzaXplIHRvbyBiaWciKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCQlyZXR1cm4gKDApOworCX0KK30KKworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3BjaV93cml0ZV9jb25maWcoYWhkX2Rldl9zb2Z0Y190IHBjaSwKKwkJCQkJICBpbnQgcmVnLCB1aW50MzJfdCB2YWx1ZSwKKwkJCQkJICBpbnQgd2lkdGgpOworCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3BjaV93cml0ZV9jb25maWcoYWhkX2Rldl9zb2Z0Y190IHBjaSwgaW50IHJlZywgdWludDMyX3QgdmFsdWUsIGludCB3aWR0aCkKK3sKKwlzd2l0Y2ggKHdpZHRoKSB7CisJY2FzZSAxOgorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpLCByZWcsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGNpLCByZWcsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaSwgcmVnLCB2YWx1ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXBhbmljKCJhaGRfcGNpX3dyaXRlX2NvbmZpZzogV3JpdGUgc2l6ZSB0b28gYmlnIik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQgYWhkX2dldF9wY2lfZnVuY3Rpb24oYWhkX2Rldl9zb2Z0Y190KTsKK3N0YXRpYyBfX2lubGluZSBpbnQKK2FoZF9nZXRfcGNpX2Z1bmN0aW9uKGFoZF9kZXZfc29mdGNfdCBwY2kpCit7CisJcmV0dXJuIChQQ0lfRlVOQyhwY2ktPmRldmZuKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQgYWhkX2dldF9wY2lfc2xvdChhaGRfZGV2X3NvZnRjX3QpOworc3RhdGljIF9faW5saW5lIGludAorYWhkX2dldF9wY2lfc2xvdChhaGRfZGV2X3NvZnRjX3QgcGNpKQoreworCXJldHVybiAoUENJX1NMT1QocGNpLT5kZXZmbikpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50IGFoZF9nZXRfcGNpX2J1cyhhaGRfZGV2X3NvZnRjX3QpOworc3RhdGljIF9faW5saW5lIGludAorYWhkX2dldF9wY2lfYnVzKGFoZF9kZXZfc29mdGNfdCBwY2kpCit7CisJcmV0dXJuIChwY2ktPmJ1cy0+bnVtYmVyKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2ZsdXNoX2RldmljZV93cml0ZXMoc3RydWN0IGFoZF9zb2Z0YyAqKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfZmx1c2hfZGV2aWNlX3dyaXRlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJLyogWFhYIElzIHRoaXMgc3VmZmljaWVudCBmb3IgYWxsIGFyY2hpdGVjdHVyZXM/Pz8gKi8KKwlhaGRfaW5iKGFoZCwgSU5UU1RBVCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFByb2MgRlMgU3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCitpbnQJYWhkX2xpbnV4X3Byb2NfaW5mbyhjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCwgaW50KTsKKyNlbHNlCitpbnQJYWhkX2xpbnV4X3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgY2hhciAqKiwKKwkJCSAgICBvZmZfdCwgaW50LCBpbnQpOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogRG9tYWluIFZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEFIRF9EVl9DTUQoY21kKSAoKGNtZCktPnNjc2lfZG9uZSA9PSBhaGRfbGludXhfZHZfY29tcGxldGUpCisjZGVmaW5lIEFIRF9EVl9TSU1RX0ZST1pFTihhaGQpCQkJCQlcCisJKCgoKGFoZCktPnBsYXRmb3JtX2RhdGEtPmZsYWdzICYgQUhEX0RWX0FDVElWRSkgIT0gMCkJXAorCSAmJiAoYWhkKS0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiA9PSAxKQorCisvKioqKioqKioqKioqKioqKioqKioqKiogVHJhbnNhY3Rpb24gQWNjZXNzIFdyYXBwZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2NtZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKFNjc2lfQ21uZCAqLCB1aW50MzJfdCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzdHJ1Y3Qgc2NiICosIHVpbnQzMl90KTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9jbWRfc2V0X3Njc2lfc3RhdHVzKFNjc2lfQ21uZCAqLCB1aW50MzJfdCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfc2V0X3Njc2lfc3RhdHVzKHN0cnVjdCBzY2IgKiwgdWludDMyX3QpOworc3RhdGljIF9faW5saW5lIHVpbnQzMl90IGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhTY3NpX0NtbmQgKmNtZCk7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QgYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc3RydWN0IHNjYiAqKTsKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdCBhaGRfY21kX2dldF9zY3NpX3N0YXR1cyhTY3NpX0NtbmQgKmNtZCk7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QgYWhkX2dldF9zY3NpX3N0YXR1cyhzdHJ1Y3Qgc2NiICopOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3NldF90cmFuc2FjdGlvbl90YWcoc3RydWN0IHNjYiAqLCBpbnQsIHVfaW50KTsKK3N0YXRpYyBfX2lubGluZSB1X2xvbmcgYWhkX2dldF90cmFuc2Zlcl9sZW5ndGgoc3RydWN0IHNjYiAqKTsKK3N0YXRpYyBfX2lubGluZSBpbnQgYWhkX2dldF90cmFuc2Zlcl9kaXIoc3RydWN0IHNjYiAqKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9zZXRfcmVzaWR1YWwoc3RydWN0IHNjYiAqLCB1X2xvbmcpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3NldF9zZW5zZV9yZXNpZHVhbChzdHJ1Y3Qgc2NiICpzY2IsIHVfbG9uZyByZXNpZCk7CitzdGF0aWMgX19pbmxpbmUgdV9sb25nIGFoZF9nZXRfcmVzaWR1YWwoc3RydWN0IHNjYiAqKTsKK3N0YXRpYyBfX2lubGluZSB1X2xvbmcgYWhkX2dldF9zZW5zZV9yZXNpZHVhbChzdHJ1Y3Qgc2NiICopOworc3RhdGljIF9faW5saW5lIGludCBhaGRfcGVyZm9ybV9hdXRvc2Vuc2Uoc3RydWN0IHNjYiAqKTsKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdCBhaGRfZ2V0X3NlbnNlX2J1ZnNpemUoc3RydWN0IGFoZF9zb2Z0YyAqLAorCQkJCQkgICAgICAgc3RydWN0IHNjYiAqKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9ub3RpZnlfeGZlcl9zZXR0aW5nc19jaGFuZ2Uoc3RydWN0IGFoZF9zb2Z0YyAqLAorCQkJCQkJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKik7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfcGxhdGZvcm1fc2NiX2ZyZWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2ZyZWV6ZV9zY2Ioc3RydWN0IHNjYiAqc2NiKTsKKworc3RhdGljIF9faW5saW5lCit2b2lkIGFoZF9jbWRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhTY3NpX0NtbmQgKmNtZCwgdWludDMyX3Qgc3RhdHVzKQoreworCWNtZC0+cmVzdWx0ICY9IH4oQ0FNX1NUQVRVU19NQVNLIDw8IDE2KTsKKwljbWQtPnJlc3VsdCB8PSBzdGF0dXMgPDwgMTY7Cit9CisKK3N0YXRpYyBfX2lubGluZQordm9pZCBhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzdHJ1Y3Qgc2NiICpzY2IsIHVpbnQzMl90IHN0YXR1cykKK3sKKwlhaGRfY21kX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLT5pb19jdHgsc3RhdHVzKTsKK30KKworc3RhdGljIF9faW5saW5lCit2b2lkIGFoZF9jbWRfc2V0X3Njc2lfc3RhdHVzKFNjc2lfQ21uZCAqY21kLCB1aW50MzJfdCBzdGF0dXMpCit7CisJY21kLT5yZXN1bHQgJj0gfjB4RkZGRjsKKwljbWQtPnJlc3VsdCB8PSBzdGF0dXM7Cit9CisKK3N0YXRpYyBfX2lubGluZQordm9pZCBhaGRfc2V0X3Njc2lfc3RhdHVzKHN0cnVjdCBzY2IgKnNjYiwgdWludDMyX3Qgc3RhdHVzKQoreworCWFoZF9jbWRfc2V0X3Njc2lfc3RhdHVzKHNjYi0+aW9fY3R4LCBzdGF0dXMpOworfQorCitzdGF0aWMgX19pbmxpbmUKK3VpbnQzMl90IGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhTY3NpX0NtbmQgKmNtZCkKK3sKKwlyZXR1cm4gKChjbWQtPnJlc3VsdCA+PiAxNikgJiBDQU1fU1RBVFVTX01BU0spOworfQorCitzdGF0aWMgX19pbmxpbmUKK3VpbnQzMl90IGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHN0cnVjdCBzY2IgKnNjYikKK3sKKwlyZXR1cm4gKGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2ItPmlvX2N0eCkpOworfQorCitzdGF0aWMgX19pbmxpbmUKK3VpbnQzMl90IGFoZF9jbWRfZ2V0X3Njc2lfc3RhdHVzKFNjc2lfQ21uZCAqY21kKQoreworCXJldHVybiAoY21kLT5yZXN1bHQgJiAweEZGRkYpOworfQorCitzdGF0aWMgX19pbmxpbmUKK3VpbnQzMl90IGFoZF9nZXRfc2NzaV9zdGF0dXMoc3RydWN0IHNjYiAqc2NiKQoreworCXJldHVybiAoYWhkX2NtZF9nZXRfc2NzaV9zdGF0dXMoc2NiLT5pb19jdHgpKTsKK30KKworc3RhdGljIF9faW5saW5lCit2b2lkIGFoZF9zZXRfdHJhbnNhY3Rpb25fdGFnKHN0cnVjdCBzY2IgKnNjYiwgaW50IGVuYWJsZWQsIHVfaW50IHR5cGUpCit7CisJLyoKKwkgKiBOb3RoaW5nIHRvIGRvIGZvciBsaW51eCBhcyB0aGUgaW5jb21pbmcgdHJhbnNhY3Rpb24KKwkgKiBoYXMgbm8gY29uY2VwdCBvZiB0YWcvbm9uIHRhZ2dlZCwgZXRjLgorCSAqLworfQorCitzdGF0aWMgX19pbmxpbmUKK3VfbG9uZyBhaGRfZ2V0X3RyYW5zZmVyX2xlbmd0aChzdHJ1Y3Qgc2NiICpzY2IpCit7CisJcmV0dXJuIChzY2ItPnBsYXRmb3JtX2RhdGEtPnhmZXJfbGVuKTsKK30KKworc3RhdGljIF9faW5saW5lCitpbnQgYWhkX2dldF90cmFuc2Zlcl9kaXIoc3RydWN0IHNjYiAqc2NiKQoreworCXJldHVybiAoc2NiLT5pb19jdHgtPnNjX2RhdGFfZGlyZWN0aW9uKTsKK30KKworc3RhdGljIF9faW5saW5lCit2b2lkIGFoZF9zZXRfcmVzaWR1YWwoc3RydWN0IHNjYiAqc2NiLCB1X2xvbmcgcmVzaWQpCit7CisJc2NiLT5pb19jdHgtPnJlc2lkID0gcmVzaWQ7Cit9CisKK3N0YXRpYyBfX2lubGluZQordm9pZCBhaGRfc2V0X3NlbnNlX3Jlc2lkdWFsKHN0cnVjdCBzY2IgKnNjYiwgdV9sb25nIHJlc2lkKQoreworCXNjYi0+cGxhdGZvcm1fZGF0YS0+c2Vuc2VfcmVzaWQgPSByZXNpZDsKK30KKworc3RhdGljIF9faW5saW5lCit1X2xvbmcgYWhkX2dldF9yZXNpZHVhbChzdHJ1Y3Qgc2NiICpzY2IpCit7CisJcmV0dXJuIChzY2ItPmlvX2N0eC0+cmVzaWQpOworfQorCitzdGF0aWMgX19pbmxpbmUKK3VfbG9uZyBhaGRfZ2V0X3NlbnNlX3Jlc2lkdWFsKHN0cnVjdCBzY2IgKnNjYikKK3sKKwlyZXR1cm4gKHNjYi0+cGxhdGZvcm1fZGF0YS0+c2Vuc2VfcmVzaWQpOworfQorCitzdGF0aWMgX19pbmxpbmUKK2ludCBhaGRfcGVyZm9ybV9hdXRvc2Vuc2Uoc3RydWN0IHNjYiAqc2NiKQoreworCS8qCisJICogV2UgYWx3YXlzIHBlcmZvcm0gYXV0b3NlbnNlIGluIExpbnV4LgorCSAqIE9uIG90aGVyIHBsYXRmb3JtcyB0aGlzIGlzIHNldCBvbiBhCisJICogcGVyLXRyYW5zYWN0aW9uIGJhc2lzLgorCSAqLworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdAorYWhkX2dldF9zZW5zZV9idWZzaXplKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9ub3RpZnlfeGZlcl9zZXR0aW5nc19jaGFuZ2Uoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCXN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbykKK3sKKwkvKiBOb3RoaW5nIHRvIGRvIGhlcmUgZm9yIGxpbnV4ICovCit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfcGxhdGZvcm1fc2NiX2ZyZWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJYWhkLT5mbGFncyAmPSB+QUhEX1JFU09VUkNFX1NIT1JUQUdFOworfQorCitpbnQJYWhkX3BsYXRmb3JtX2FsbG9jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdm9pZCAqcGxhdGZvcm1fYXJnKTsKK3ZvaWQJYWhkX3BsYXRmb3JtX2ZyZWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3ZvaWQJYWhkX3BsYXRmb3JtX2luaXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3ZvaWQJYWhkX3BsYXRmb3JtX2ZyZWV6ZV9kZXZxKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKTsKK3ZvaWQJYWhkX2ZyZWV6ZV9zaW1xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Cit2b2lkCWFoZF9yZWxlYXNlX3NpbXEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9mcmVlemVfc2NiKHN0cnVjdCBzY2IgKnNjYikKK3sKKwlpZiAoKHNjYi0+aW9fY3R4LT5yZXN1bHQgJiAoQ0FNX0RFVl9RRlJaTiA8PCAxNikpID09IDApIHsKKyAgICAgICAgICAgICAgICBzY2ItPmlvX2N0eC0+cmVzdWx0IHw9IENBTV9ERVZfUUZSWk4gPDwgMTY7CisgICAgICAgICAgICAgICAgc2NiLT5wbGF0Zm9ybV9kYXRhLT5kZXYtPnFmcm96ZW4rKzsKKyAgICAgICAgfQorfQorCit2b2lkCWFoZF9wbGF0Zm9ybV9zZXRfdGFncyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkgICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sIGFoZF9xdWV1ZV9hbGcpOworaW50CWFoZF9wbGF0Zm9ybV9hYm9ydF9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IHRhcmdldCwKKwkJCQljaGFyIGNoYW5uZWwsIGludCBsdW4sIHVfaW50IHRhZywKKwkJCQlyb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzKTsKK2lycXJldHVybl90CisJYWhkX2xpbnV4X2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncyk7Cit2b2lkCWFoZF9wbGF0Zm9ybV9mbHVzaHdvcmsoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK2ludAlhaGRfc29mdGNfY29tcChzdHJ1Y3QgYWhkX3NvZnRjICosIHN0cnVjdCBhaGRfc29mdGMgKik7Cit2b2lkCWFoZF9kb25lKHN0cnVjdCBhaGRfc29mdGMqLCBzdHJ1Y3Qgc2NiKik7Cit2b2lkCWFoZF9zZW5kX2FzeW5jKHN0cnVjdCBhaGRfc29mdGMgKiwgY2hhciBjaGFubmVsLAorCQkgICAgICAgdV9pbnQgdGFyZ2V0LCB1X2ludCBsdW4sIGFjX2NvZGUsIHZvaWQgKik7Cit2b2lkCWFoZF9wcmludF9wYXRoKHN0cnVjdCBhaGRfc29mdGMgKiwgc3RydWN0IHNjYiAqKTsKK3ZvaWQJYWhkX3BsYXRmb3JtX2R1bXBfY2FyZF9zdGF0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworCisjaWZkZWYgQ09ORklHX1BDSQorI2RlZmluZSBBSERfUENJX0NPTkZJRyAxCisjZWxzZQorI2RlZmluZSBBSERfUENJX0NPTkZJRyAwCisjZW5kaWYKKyNkZWZpbmUgYm9vdHZlcmJvc2UgYWljNzl4eF92ZXJib3NlCitleHRlcm4gdWludDMyX3QgYWljNzl4eF92ZXJib3NlOworCisjZW5kaWYgLyogX0FJQzc5WFhfTElOVVhfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtX3BjaS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc21fcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkYWYwYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtX3BjaS5jCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogTGludXggZHJpdmVyIGF0dGFjaG1lbnQgZ2x1ZSBmb3IgUENJIGJhc2VkIFUzMjAgY29udHJvbGxlcnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvbGludXgvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc21fcGNpLmMjMjUgJAorICovCisKKyNpbmNsdWRlICJhaWM3OXh4X29zbS5oIgorI2luY2x1ZGUgImFpYzc5eHhfaW5saW5lLmgiCisjaW5jbHVkZSAiYWljNzl4eF9wY2kuaCIKKworc3RhdGljIGludAlhaGRfbGludXhfcGNpX2Rldl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgaW50CWFoZF9saW51eF9wY2lfcmVzZXJ2ZV9pb19yZWdpb25zKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJCSB1X2xvbmcgKmJhc2UsIHVfbG9uZyAqYmFzZTIpOworc3RhdGljIGludAlhaGRfbGludXhfcGNpX3Jlc2VydmVfbWVtX3JlZ2lvbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCQkgdV9sb25nICpidXNfYWRkciwKKwkJCQkJCSB1aW50OF90IF9faW9tZW0gKiptYWRkcik7CitzdGF0aWMgdm9pZAlhaGRfbGludXhfcGNpX2Rldl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworCisvKiBEZWZpbmUgdGhlIG1hY3JvIGxvY2FsbHkgc2luY2UgaXQncyBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBjbGFzcyBvZiBjaGlwcy4KKyAqLworI2RlZmluZSBJRCh4KSAgICAgICAgICAgIFwKKwlJRDJDKHgpLCAgICAgICAgIFwKKwlJRDJDKElESVJPQyh4KSkKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFoZF9saW51eF9wY2lfaWRfdGFibGVbXSA9IHsKKwkvKiBhaWM3OTAxIGJhc2VkIGNvbnRyb2xsZXJzICovCisJSUQoSURfQUhBXzI5MzIwQSksCisJSUQoSURfQUhBXzI5MzIwQUxQKSwKKwkvKiBhaWM3OTAyIGJhc2VkIGNvbnRyb2xsZXJzICovCisJSUQoSURfQUhBXzI5MzIwKSwKKwlJRChJRF9BSEFfMjkzMjBCKSwKKwlJRChJRF9BSEFfMjkzMjBMUCksCisJSUQoSURfQUhBXzM5MzIwKSwKKwlJRChJRF9BSEFfMzkzMjBfQiksCisJSUQoSURfQUhBXzM5MzIwQSksCisJSUQoSURfQUhBXzM5MzIwRCksCisJSUQoSURfQUhBXzM5MzIwRF9IUCksCisJSUQoSURfQUhBXzM5MzIwRF9CKSwKKwlJRChJRF9BSEFfMzkzMjBEX0JfSFApLAorCS8qIEdlbmVyaWMgY2hpcCBwcm9iZXMgZm9yIGRldmljZXMgd2UgZG9uJ3Qga25vdyBleGFjdGx5LiAqLworCUlEMTYoSURfQUlDNzkwMSAmIElEXzkwMDVfR0VORVJJQ19NQVNLKSwKKwlJRChJRF9BSUM3OTAxQSAmIElEX0RFVl9WRU5ET1JfTUFTSyksCisJSUQxNihJRF9BSUM3OTAyICYgSURfOTAwNV9HRU5FUklDX01BU0spLAorCXsgMCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWhkX2xpbnV4X3BjaV9pZF90YWJsZSk7CisKK3N0cnVjdCBwY2lfZHJpdmVyIGFpYzc5eHhfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYWljNzl4eCIsCisJLnByb2JlCQk9IGFoZF9saW51eF9wY2lfZGV2X3Byb2JlLAorCS5yZW1vdmUJCT0gYWhkX2xpbnV4X3BjaV9kZXZfcmVtb3ZlLAorCS5pZF90YWJsZQk9IGFoZF9saW51eF9wY2lfaWRfdGFibGUKK307CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfcGNpX2Rldl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkOworCXVfbG9uZyBsOworCisJLyoKKwkgKiBXZSBzaG91bGQgYmUgYWJsZSB0byBqdXN0IHBlcmZvcm0KKwkgKiB0aGUgZnJlZSBkaXJlY3RseSwgYnV0IGNoZWNrIG91cgorCSAqIGxpc3QgZm9yIGV4dHJhIHNhbml0eS4KKwkgKi8KKwlhaGRfbGlzdF9sb2NrKCZsKTsKKwlhaGQgPSBhaGRfZmluZF9zb2Z0Yygoc3RydWN0IGFoZF9zb2Z0YyAqKXBjaV9nZXRfZHJ2ZGF0YShwZGV2KSk7CisJaWYgKGFoZCAhPSBOVUxMKSB7CisJCXVfbG9uZyBzOworCisJCVRBSUxRX1JFTU9WRSgmYWhkX3RhaWxxLCBhaGQsIGxpbmtzKTsKKwkJYWhkX2xpc3RfdW5sb2NrKCZsKTsKKwkJYWhkX2xvY2soYWhkLCAmcyk7CisJCWFoZF9pbnRyX2VuYWJsZShhaGQsIEZBTFNFKTsKKwkJYWhkX3VubG9jayhhaGQsICZzKTsKKwkJYWhkX2ZyZWUoYWhkKTsKKwl9IGVsc2UKKwkJYWhkX2xpc3RfdW5sb2NrKCZsKTsKK30KKworc3RhdGljIGludAorYWhkX2xpbnV4X3BjaV9kZXZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJY2hhcgkJIGJ1Zls4MF07CisJc3RydWN0CQkgYWhkX3NvZnRjICphaGQ7CisJYWhkX2Rldl9zb2Z0Y190CSBwY2k7CisJc3RydWN0CQkgYWhkX3BjaV9pZGVudGl0eSAqZW50cnk7CisJY2hhcgkJKm5hbWU7CisJaW50CQkgZXJyb3I7CisKKwkvKgorCSAqIFNvbWUgQklPU2VuIHJlcG9ydCB0aGUgc2FtZSBkZXZpY2UgbXVsdGlwbGUgdGltZXMuCisJICovCisJVEFJTFFfRk9SRUFDSChhaGQsICZhaGRfdGFpbHEsIGxpbmtzKSB7CisJCXN0cnVjdCBwY2lfZGV2ICpwcm9iZWRfcGRldjsKKworCQlwcm9iZWRfcGRldiA9IGFoZC0+ZGV2X3NvZnRjOworCQlpZiAocHJvYmVkX3BkZXYtPmJ1cy0+bnVtYmVyID09IHBkZXYtPmJ1cy0+bnVtYmVyCisJCSAmJiBwcm9iZWRfcGRldi0+ZGV2Zm4gPT0gcGRldi0+ZGV2Zm4pCisJCQlicmVhazsKKwl9CisJaWYgKGFoZCAhPSBOVUxMKSB7CisJCS8qIFNraXAgZHVwbGljYXRlLiAqLworCQlyZXR1cm4gKC1FTk9ERVYpOworCX0KKworCXBjaSA9IHBkZXY7CisJZW50cnkgPSBhaGRfZmluZF9wY2lfZGV2aWNlKHBjaSk7CisJaWYgKGVudHJ5ID09IE5VTEwpCisJCXJldHVybiAoLUVOT0RFVik7CisKKwkvKgorCSAqIEFsbG9jYXRlIGEgc29mdGMgZm9yIHRoaXMgY2FyZCBhbmQKKwkgKiBzZXQgaXQgdXAgZm9yIGF0dGFjaG1lbnQgYnkgb3VyCisJICogY29tbW9uIGRldGVjdCByb3V0aW5lLgorCSAqLworCXNwcmludGYoYnVmLCAiYWhkX3BjaTolZDolZDolZCIsCisJCWFoZF9nZXRfcGNpX2J1cyhwY2kpLAorCQlhaGRfZ2V0X3BjaV9zbG90KHBjaSksCisJCWFoZF9nZXRfcGNpX2Z1bmN0aW9uKHBjaSkpOworCW5hbWUgPSBtYWxsb2Moc3RybGVuKGJ1ZikgKyAxLCBNX0RFVkJVRiwgTV9OT1dBSVQpOworCWlmIChuYW1lID09IE5VTEwpCisJCXJldHVybiAoLUVOT01FTSk7CisJc3RyY3B5KG5hbWUsIGJ1Zik7CisJYWhkID0gYWhkX2FsbG9jKE5VTEwsIG5hbWUpOworCWlmIChhaGQgPT0gTlVMTCkKKwkJcmV0dXJuICgtRU5PTUVNKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJYWhkX2ZyZWUoYWhkKTsKKwkJcmV0dXJuICgtRU5PREVWKTsKKwl9CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gNCkgeworCQl1aW50NjRfdCAgIG1lbXNpemU7CisJCWNvbnN0IHVpbnQ2NF90IG1hc2tfMzliaXQgPSAweDdGRkZGRkZGRkZVTEw7CisKKwkJbWVtc2l6ZSA9IGFoZF9saW51eF9nZXRfbWVtc2l6ZSgpOworCisJCWlmIChtZW1zaXplID49IDB4ODAwMDAwMDAwMFVMTAorCSAJICYmIHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spID09IDApIHsKKwkJCWFoZC0+ZmxhZ3MgfD0gQUhEXzY0QklUX0FERFJFU1NJTkc7CisJCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmh3X2RtYV9tYXNrID0gRE1BXzY0QklUX01BU0s7CisJCX0gZWxzZSBpZiAobWVtc2l6ZSA+IDB4ODAwMDAwMDAKKwkJCSYmIHBjaV9zZXRfZG1hX21hc2socGRldiwgbWFza18zOWJpdCkgPT0gMCkgeworCQkJYWhkLT5mbGFncyB8PSBBSERfMzlCSVRfQUREUkVTU0lORzsKKwkJCWFoZC0+cGxhdGZvcm1fZGF0YS0+aHdfZG1hX21hc2sgPSBtYXNrXzM5Yml0OworCQl9CisJfSBlbHNlIHsKKwkJcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJCWFoZC0+cGxhdGZvcm1fZGF0YS0+aHdfZG1hX21hc2sgPSBETUFfMzJCSVRfTUFTSzsKKwl9CisJYWhkLT5kZXZfc29mdGMgPSBwY2k7CisJZXJyb3IgPSBhaGRfcGNpX2NvbmZpZyhhaGQsIGVudHJ5KTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlhaGRfZnJlZShhaGQpOworCQlyZXR1cm4gKC1lcnJvcik7CisJfQorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBhaGQpOworCWlmIChhaWM3OXh4X2RldGVjdF9jb21wbGV0ZSkgeworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkJYWhkX2xpbnV4X3JlZ2lzdGVyX2hvc3QoYWhkLCAmYWljNzl4eF9kcml2ZXJfdGVtcGxhdGUpOworI2Vsc2UKKwkJcHJpbnRmKCJhaWM3OXh4OiBpZ25vcmluZyBQQ0kgZGV2aWNlIGZvdW5kIGFmdGVyICIKKwkJICAgICAgICJpbml0aWFsaXphdGlvblxuIik7CisJCXJldHVybiAoLUVOT0RFVik7CisjZW5kaWYKKwl9CisJcmV0dXJuICgwKTsKK30KKworaW50CithaGRfbGludXhfcGNpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gKHBjaV9tb2R1bGVfaW5pdCgmYWljNzl4eF9wY2lfZHJpdmVyKSk7Cit9CisKK3ZvaWQKK2FoZF9saW51eF9wY2lfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWljNzl4eF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIGludAorYWhkX2xpbnV4X3BjaV9yZXNlcnZlX2lvX3JlZ2lvbnMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2xvbmcgKmJhc2UsCisJCQkJIHVfbG9uZyAqYmFzZTIpCit7CisJKmJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoYWhkLT5kZXZfc29mdGMsIDApOworCS8qCisJICogVGhpcyBpcyByZWFsbHkgdGhlIDNyZCBiYXIgYW5kIHNob3VsZCBiZSBhdCBpbmRleCAyLAorCSAqIGJ1dCB0aGUgTGludXggUENJIGNvZGUgZG9lc24ndCBrbm93IGhvdyB0byAiY291bnQiIDY0Yml0CisJICogYmFycy4KKwkgKi8KKwkqYmFzZTIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoYWhkLT5kZXZfc29mdGMsIDMpOworCWlmICgqYmFzZSA9PSAwIHx8ICpiYXNlMiA9PSAwKQorCQlyZXR1cm4gKEVOT01FTSk7CisJaWYgKHJlcXVlc3RfcmVnaW9uKCpiYXNlLCAyNTYsICJhaWM3OXh4IikgPT0gMCkKKwkJcmV0dXJuIChFTk9NRU0pOworCWlmIChyZXF1ZXN0X3JlZ2lvbigqYmFzZTIsIDI1NiwgImFpYzc5eHgiKSA9PSAwKSB7CisJCXJlbGVhc2VfcmVnaW9uKCpiYXNlMiwgMjU2KTsKKwkJcmV0dXJuIChFTk9NRU0pOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CithaGRfbGludXhfcGNpX3Jlc2VydmVfbWVtX3JlZ2lvbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJIHVfbG9uZyAqYnVzX2FkZHIsCisJCQkJIHVpbnQ4X3QgX19pb21lbSAqKm1hZGRyKQoreworCXVfbG9uZwlzdGFydDsKKwl1X2xvbmcJYmFzZV9wYWdlOworCXVfbG9uZwliYXNlX29mZnNldDsKKwlpbnQJZXJyb3I7CisKKwlpZiAoYWljNzl4eF9hbGxvd19tZW1pbyA9PSAwKQorCQlyZXR1cm4gKEVOT01FTSk7CisKKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9QQ0lYX01NQVBJT19CVUcpICE9IDApCisJCXJldHVybiAoRU5PTUVNKTsKKworCWVycm9yID0gMDsKKwlzdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChhaGQtPmRldl9zb2Z0YywgMSk7CisJYmFzZV9wYWdlID0gc3RhcnQgJiBQQUdFX01BU0s7CisJYmFzZV9vZmZzZXQgPSBzdGFydCAtIGJhc2VfcGFnZTsKKwlpZiAoc3RhcnQgIT0gMCkgeworCQkqYnVzX2FkZHIgPSBzdGFydDsKKwkJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihzdGFydCwgMHgxMDAwLCAiYWljNzl4eCIpID09IDApCisJCQllcnJvciA9IEVOT01FTTsKKwkJaWYgKGVycm9yID09IDApIHsKKwkJCSptYWRkciA9IGlvcmVtYXBfbm9jYWNoZShiYXNlX3BhZ2UsIGJhc2Vfb2Zmc2V0ICsgMjU2KTsKKwkJCWlmICgqbWFkZHIgPT0gTlVMTCkgeworCQkJCWVycm9yID0gRU5PTUVNOworCQkJCXJlbGVhc2VfbWVtX3JlZ2lvbihzdGFydCwgMHgxMDAwKTsKKwkJCX0gZWxzZQorCQkJCSptYWRkciArPSBiYXNlX29mZnNldDsKKwkJfQorCX0gZWxzZQorCQllcnJvciA9IEVOT01FTTsKKwlyZXR1cm4gKGVycm9yKTsKK30KKworaW50CithaGRfcGNpX21hcF9yZWdpc3RlcnMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXVpbnQzMl90IGNvbW1hbmQ7CisJdV9sb25nCSBiYXNlOworCXVpbnQ4X3QJX19pb21lbSAqbWFkZHI7CisJaW50CSBlcnJvcjsKKworCS8qCisJICogSWYgaXRzIGFsbG93ZWQsIHdlIHByZWZlciBtZW1vcnkgbWFwcGVkIGFjY2Vzcy4KKwkgKi8KKwljb21tYW5kID0gYWhkX3BjaV9yZWFkX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywgUENJUl9DT01NQU5ELCA0KTsKKwljb21tYW5kICY9IH4oUENJTV9DTURfUE9SVEVOfFBDSU1fQ01EX01FTUVOKTsKKwliYXNlID0gMDsKKwltYWRkciA9IE5VTEw7CisJZXJyb3IgPSBhaGRfbGludXhfcGNpX3Jlc2VydmVfbWVtX3JlZ2lvbihhaGQsICZiYXNlLCAmbWFkZHIpOworCWlmIChlcnJvciA9PSAwKSB7CisJCWFoZC0+cGxhdGZvcm1fZGF0YS0+bWVtX2J1c2FkZHIgPSBiYXNlOworCQlhaGQtPnRhZ3NbMF0gPSBCVVNfU1BBQ0VfTUVNSU87CisJCWFoZC0+YnNoc1swXS5tYWRkciA9IG1hZGRyOworCQlhaGQtPnRhZ3NbMV0gPSBCVVNfU1BBQ0VfTUVNSU87CisJCWFoZC0+YnNoc1sxXS5tYWRkciA9IG1hZGRyICsgMHgxMDA7CisJCWFoZF9wY2lfd3JpdGVfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBQQ0lSX0NPTU1BTkQsCisJCQkJICAgICBjb21tYW5kIHwgUENJTV9DTURfTUVNRU4sIDQpOworCisJCWlmIChhaGRfcGNpX3Rlc3RfcmVnaXN0ZXJfYWNjZXNzKGFoZCkgIT0gMCkgeworCisJCQlwcmludGYoImFpYzc5eHg6IFBDSSBEZXZpY2UgJWQ6JWQ6JWQgIgorCQkJICAgICAgICJmYWlsZWQgbWVtb3J5IG1hcHBlZCB0ZXN0LiAgVXNpbmcgUElPLlxuIiwKKwkJCSAgICAgICBhaGRfZ2V0X3BjaV9idXMoYWhkLT5kZXZfc29mdGMpLAorCQkJICAgICAgIGFoZF9nZXRfcGNpX3Nsb3QoYWhkLT5kZXZfc29mdGMpLAorCQkJICAgICAgIGFoZF9nZXRfcGNpX2Z1bmN0aW9uKGFoZC0+ZGV2X3NvZnRjKSk7CisJCQlpb3VubWFwKG1hZGRyKTsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbihhaGQtPnBsYXRmb3JtX2RhdGEtPm1lbV9idXNhZGRyLAorCQkJCQkgICAweDEwMDApOworCQkJYWhkLT5ic2hzWzBdLm1hZGRyID0gTlVMTDsKKwkJCW1hZGRyID0gTlVMTDsKKwkJfSBlbHNlCisJCQljb21tYW5kIHw9IFBDSU1fQ01EX01FTUVOOworCX0gZWxzZSBpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCJhaWM3OXh4OiBQQ0klZDolZDolZCBNRU0gcmVnaW9uIDB4JWx4ICIKKwkJICAgICAgICJ1bmF2YWlsYWJsZS4gQ2Fubm90IG1lbW9yeSBtYXAgZGV2aWNlLlxuIiwKKwkJICAgICAgIGFoZF9nZXRfcGNpX2J1cyhhaGQtPmRldl9zb2Z0YyksCisJCSAgICAgICBhaGRfZ2V0X3BjaV9zbG90KGFoZC0+ZGV2X3NvZnRjKSwKKwkJICAgICAgIGFoZF9nZXRfcGNpX2Z1bmN0aW9uKGFoZC0+ZGV2X3NvZnRjKSwKKwkJICAgICAgIGJhc2UpOworCX0KKworCWlmIChtYWRkciA9PSBOVUxMKSB7CisJCXVfbG9uZwkgYmFzZTI7CisKKwkJZXJyb3IgPSBhaGRfbGludXhfcGNpX3Jlc2VydmVfaW9fcmVnaW9ucyhhaGQsICZiYXNlLCAmYmFzZTIpOworCQlpZiAoZXJyb3IgPT0gMCkgeworCQkJYWhkLT50YWdzWzBdID0gQlVTX1NQQUNFX1BJTzsKKwkJCWFoZC0+dGFnc1sxXSA9IEJVU19TUEFDRV9QSU87CisJCQlhaGQtPmJzaHNbMF0uaW9wb3J0ID0gYmFzZTsKKwkJCWFoZC0+YnNoc1sxXS5pb3BvcnQgPSBiYXNlMjsKKwkJCWNvbW1hbmQgfD0gUENJTV9DTURfUE9SVEVOOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJhaWM3OXh4OiBQQ0klZDolZDolZCBJTyByZWdpb25zIDB4JWx4IGFuZCAweCVseCIKKwkJCSAgICAgICAidW5hdmFpbGFibGUuIENhbm5vdCBtYXAgZGV2aWNlLlxuIiwKKwkJCSAgICAgICBhaGRfZ2V0X3BjaV9idXMoYWhkLT5kZXZfc29mdGMpLAorCQkJICAgICAgIGFoZF9nZXRfcGNpX3Nsb3QoYWhkLT5kZXZfc29mdGMpLAorCQkJICAgICAgIGFoZF9nZXRfcGNpX2Z1bmN0aW9uKGFoZC0+ZGV2X3NvZnRjKSwKKwkJCSAgICAgICBiYXNlLCBiYXNlMik7CisJCX0KKwl9CisJYWhkX3BjaV93cml0ZV9jb25maWcoYWhkLT5kZXZfc29mdGMsIFBDSVJfQ09NTUFORCwgY29tbWFuZCwgNCk7CisJcmV0dXJuIChlcnJvcik7Cit9CisKK2ludAorYWhkX3BjaV9tYXBfaW50KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHJlcXVlc3RfaXJxKGFoZC0+ZGV2X3NvZnRjLT5pcnEsIGFoZF9saW51eF9pc3IsCisJCQkgICAgU0FfU0hJUlEsICJhaWM3OXh4IiwgYWhkKTsKKwlpZiAoZXJyb3IgPT0gMCkKKwkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5pcnEgPSBhaGQtPmRldl9zb2Z0Yy0+aXJxOworCQorCXJldHVybiAoLWVycm9yKTsKK30KKwordm9pZAorYWhkX3Bvd2VyX3N0YXRlX2NoYW5nZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGFoZF9wb3dlcl9zdGF0ZSBuZXdfc3RhdGUpCit7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShhaGQtPmRldl9zb2Z0YywgbmV3X3N0YXRlKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcGNpLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjM2JiN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5jCkBAIC0wLDAgKzEsOTg3IEBACisvKgorICogUHJvZHVjdCBzcGVjaWZpYyBwcm9iZSBhbmQgYXR0YWNoIHJvdXRpbmVzIGZvcjoKKyAqCWFpYzc5MDEgYW5kIGFpYzc5MDIgU0NTSSBjb250cm9sbGVycworICoKKyAqIENvcHlyaWdodCAoYykgMTk5NC0yMDAxIEp1c3RpbiBULiBHaWJicy4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIEFkYXB0ZWMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICoKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eF9wY2kuYyM3NyAkCisgKgorICogJEZyZWVCU0QkCisgKi8KKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgImFpYzc5eHhfb3NtLmgiCisjaW5jbHVkZSAiYWljNzl4eF9pbmxpbmUuaCIKKyNlbHNlCisjaW5jbHVkZSA8ZGV2L2FpYzd4eHgvYWljNzl4eF9vc20uaD4KKyNpbmNsdWRlIDxkZXYvYWljN3h4eC9haWM3OXh4X2lubGluZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJhaWM3OXh4X3BjaS5oIgorCitzdGF0aWMgX19pbmxpbmUgdWludDY0X3QKK2FoZF9jb21wb3NlX2lkKHVfaW50IGRldmljZSwgdV9pbnQgdmVuZG9yLCB1X2ludCBzdWJkZXZpY2UsIHVfaW50IHN1YnZlbmRvcikKK3sKKwl1aW50NjRfdCBpZDsKKworCWlkID0gc3VidmVuZG9yCisJICAgfCAoc3ViZGV2aWNlIDw8IDE2KQorCSAgIHwgKCh1aW50NjRfdCl2ZW5kb3IgPDwgMzIpCisJICAgfCAoKHVpbnQ2NF90KWRldmljZSA8PCA0OCk7CisKKwlyZXR1cm4gKGlkKTsKK30KKworI2RlZmluZSBJRF9BSUM3OTAyX1BDSV9SRVZfQTQJCTB4MworI2RlZmluZSBJRF9BSUM3OTAyX1BDSV9SRVZfQjAJCTB4MTAKKyNkZWZpbmUgU1VCSURfSFAJCQkweDBFMTEKKworI2RlZmluZSBERVZJRF85MDA1X0hPU1RSQUlEKGlkKSAoKGlkKSAmIDB4ODApCisKKyNkZWZpbmUgREVWSURfOTAwNV9UWVBFKGlkKSAoKGlkKSAmIDB4RikKKyNkZWZpbmUJCURFVklEXzkwMDVfVFlQRV9IQkEJCTB4MAkvKiBTdGFuZGFyZCBDYXJkICovCisjZGVmaW5lCQlERVZJRF85MDA1X1RZUEVfSEJBXzJFWFQJMHgxCS8qIDIgRXh0ZXJuYWwgUG9ydHMgKi8KKyNkZWZpbmUJCURFVklEXzkwMDVfVFlQRV9JUk9DCQkweDgJLyogUmFpZCgwLDEsMTApIENhcmQgKi8KKyNkZWZpbmUJCURFVklEXzkwMDVfVFlQRV9NQgkJMHhGCS8qIE9uIE1vdGhlcmJvYXJkICovCisKKyNkZWZpbmUgREVWSURfOTAwNV9NRlVOQyhpZCkgKChpZCkgJiAweDEwKQorCisjZGVmaW5lIERFVklEXzkwMDVfUEFDS0VUSVpFRChpZCkgKChpZCkgJiAweDgwMDApCisKKyNkZWZpbmUgU1VCSURfOTAwNV9UWVBFKGlkKSAoKGlkKSAmIDB4RikKKyNkZWZpbmUJCVNVQklEXzkwMDVfVFlQRV9IQkEJCTB4MAkvKiBTdGFuZGFyZCBDYXJkICovCisjZGVmaW5lCQlTVUJJRF85MDA1X1RZUEVfTUIJCTB4RgkvKiBPbiBNb3RoZXJib2FyZCAqLworCisjZGVmaW5lIFNVQklEXzkwMDVfQVVUT1RFUk0oaWQpCSgoKGlkKSAmIDB4MTApID09IDApCisKKyNkZWZpbmUgU1VCSURfOTAwNV9MRUdBQ1lDT05OX0ZVTkMoaWQpICgoaWQpICYgMHgyMCkKKworI2RlZmluZSBTVUJJRF85MDA1X1NFRVBUWVBFKGlkKSAoKGlkKSAmIDB4MEMwKSA+PiA2KQorI2RlZmluZQkJU1VCSURfOTAwNV9TRUVQVFlQRV9OT05FCTB4MAorI2RlZmluZQkJU1VCSURfOTAwNV9TRUVQVFlQRV80SwkJMHgxCisKK3N0YXRpYyBhaGRfZGV2aWNlX3NldHVwX3QgYWhkX2FpYzc5MDFfc2V0dXA7CitzdGF0aWMgYWhkX2RldmljZV9zZXR1cF90IGFoZF9haWM3OTAxQV9zZXR1cDsKK3N0YXRpYyBhaGRfZGV2aWNlX3NldHVwX3QgYWhkX2FpYzc5MDJfc2V0dXA7CitzdGF0aWMgYWhkX2RldmljZV9zZXR1cF90IGFoZF9haWM3OTBYX3NldHVwOworCitzdHJ1Y3QgYWhkX3BjaV9pZGVudGl0eSBhaGRfcGNpX2lkZW50X3RhYmxlIFtdID0KK3sKKwkvKiBhaWM3OTAxIGJhc2VkIGNvbnRyb2xsZXJzICovCisJeworCQlJRF9BSEFfMjkzMjBBLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjkzMjBBIFVsdHJhMzIwIFNDU0kgYWRhcHRlciIsCisJCWFoZF9haWM3OTAxX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8yOTMyMEFMUCwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDI5MzIwQUxQIFVsdHJhMzIwIFNDU0kgYWRhcHRlciIsCisJCWFoZF9haWM3OTAxX3NldHVwCisJfSwKKwkvKiBhaWM3OTAyIGJhc2VkIGNvbnRyb2xsZXJzICovCQorCXsKKwkJSURfQUhBXzI5MzIwLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjkzMjAgVWx0cmEzMjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhkX2FpYzc5MDJfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzI5MzIwQiwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDI5MzIwQiBVbHRyYTMyMCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGRfYWljNzkwMl9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMjkzMjBMUCwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDI5MzIwTFAgVWx0cmEzMjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhkX2FpYzc5MDFBX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8zOTMyMCwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDM5MzIwIFVsdHJhMzIwIFNDU0kgYWRhcHRlciIsCisJCWFoZF9haWM3OTAyX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8zOTMyMF9CLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMzkzMjAgVWx0cmEzMjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhkX2FpYzc5MDJfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzM5MzIwQSwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDM5MzIwQSBVbHRyYTMyMCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGRfYWljNzkwMl9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMzkzMjBELAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMzkzMjBEIFVsdHJhMzIwIFNDU0kgYWRhcHRlciIsCisJCWFoZF9haWM3OTAyX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8zOTMyMERfSFAsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAoSFAgT0VNKSAzOTMyMEQgVWx0cmEzMjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhkX2FpYzc5MDJfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzM5MzIwRF9CLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMzkzMjBEIFVsdHJhMzIwIFNDU0kgYWRhcHRlciIsCisJCWFoZF9haWM3OTAyX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8zOTMyMERfQl9IUCwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIChIUCBPRU0pIDM5MzIwRCBVbHRyYTMyMCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGRfYWljNzkwMl9zZXR1cAorCX0sCisJLyogR2VuZXJpYyBjaGlwIHByb2JlcyBmb3IgZGV2aWNlcyB3ZSBkb24ndCBrbm93ICdleGFjdGx5JyAqLworCXsKKwkJSURfQUlDNzkwMSAmIElEXzkwMDVfR0VORVJJQ19NQVNLLAorCQlJRF85MDA1X0dFTkVSSUNfTUFTSywKKwkJIkFkYXB0ZWMgQUlDNzkwMSBVbHRyYTMyMCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGRfYWljNzkwMV9zZXR1cAorCX0sCisJeworCQlJRF9BSUM3OTAxQSAmIElEX0RFVl9WRU5ET1JfTUFTSywKKwkJSURfREVWX1ZFTkRPUl9NQVNLLAorCQkiQWRhcHRlYyBBSUM3OTAxQSBVbHRyYTMyMCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGRfYWljNzkwMUFfc2V0dXAKKwl9LAorCXsKKwkJSURfQUlDNzkwMiAmIElEXzkwMDVfR0VORVJJQ19NQVNLLAorCQlJRF85MDA1X0dFTkVSSUNfTUFTSywKKwkJIkFkYXB0ZWMgQUlDNzkwMiBVbHRyYTMyMCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGRfYWljNzkwMl9zZXR1cAorCX0KK307CisKK2NvbnN0IHVfaW50IGFoZF9udW1fcGNpX2RldnMgPSBOVU1fRUxFTUVOVFMoYWhkX3BjaV9pZGVudF90YWJsZSk7CisJCQorI2RlZmluZQlERVZDT05GSUcJCTB4NDAKKyNkZWZpbmUJCVBDSVhJTklUUEFUCTB4MDAwMEUwMDB1bAorI2RlZmluZQkJCVBDSVhJTklUX1BDSTMzXzY2CTB4MDAwMEUwMDB1bAorI2RlZmluZQkJCVBDSVhJTklUX1BDSVg1MF82NgkweDAwMDBDMDAwdWwKKyNkZWZpbmUJCQlQQ0lYSU5JVF9QQ0lYNjZfMTAwCTB4MDAwMEEwMDB1bAorI2RlZmluZQkJCVBDSVhJTklUX1BDSVgxMDBfMTMzCTB4MDAwMDgwMDB1bAorI2RlZmluZQlQQ0lfQlVTX01PREVTX0lOREVYKGRldmNvbmZpZykJXAorCSgoKGRldmNvbmZpZykgJiBQQ0lYSU5JVFBBVCkgPj4gMTMpCitzdGF0aWMgY29uc3QgY2hhciAqcGNpX2J1c19tb2Rlc1tdID0KK3sKKwkiUENJIGJ1cyBtb2RlIHVua25vd24iLAorCSJQQ0kgYnVzIG1vZGUgdW5rbm93biIsCisJIlBDSSBidXMgbW9kZSB1bmtub3duIiwKKwkiUENJIGJ1cyBtb2RlIHVua25vd24iLAorCSJQQ0ktWCAxMDEtMTMzTWh6IiwKKwkiUENJLVggNjctMTAwTWh6IiwKKwkiUENJLVggNTAtNjZNaHoiLAorCSJQQ0kgMzMgb3IgNjZNaHoiCit9OworCisjZGVmaW5lCQlURVNUTU9ERQkweDAwMDAwODAwdWwKKyNkZWZpbmUJCUlSRFlfUlNUCTB4MDAwMDAyMDB1bAorI2RlZmluZQkJRlJBTUVfUlNUCTB4MDAwMDAxMDB1bAorI2RlZmluZQkJUENJNjRCSVQJMHgwMDAwMDA4MHVsCisjZGVmaW5lCQlNUkRDRU4JCTB4MDAwMDAwNDB1bAorI2RlZmluZQkJRU5ESUFOU0VMCTB4MDAwMDAwMjB1bAorI2RlZmluZQkJTUlYUVdFTkRJQU5FTgkweDAwMDAwMDA4dWwKKyNkZWZpbmUJCURBQ0VOCQkweDAwMDAwMDA0dWwKKyNkZWZpbmUJCVNUUFdMRVZFTAkweDAwMDAwMDAydWwKKyNkZWZpbmUJCVFXRU5ESUFOU0VMCTB4MDAwMDAwMDF1bAorCisjZGVmaW5lCURFVkNPTkZJRzEJCTB4NDQKKyNkZWZpbmUJCVBSRVFESVMJCTB4MDEKKworI2RlZmluZQlDU0laRV9MQVRUSU1FCQkweDBjCisjZGVmaW5lCQlDQUNIRVNJWkUJMHgwMDAwMDBmZnVsCisjZGVmaW5lCQlMQVRUSU1FCQkweDAwMDBmZjAwdWwKKworc3RhdGljIGludAlhaGRfY2hlY2tfZXh0cG9ydChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIHZvaWQJYWhkX2NvbmZpZ3VyZV90ZXJtaW5hdGlvbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgdV9pbnQgYWRhcHRlcl9jb250cm9sKTsKK3N0YXRpYyB2b2lkCWFoZF9wY2lfc3BsaXRfaW50cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IGludHN0YXQpOworCitzdHJ1Y3QgYWhkX3BjaV9pZGVudGl0eSAqCithaGRfZmluZF9wY2lfZGV2aWNlKGFoZF9kZXZfc29mdGNfdCBwY2kpCit7CisJdWludDY0X3QgIGZ1bGxfaWQ7CisJdWludDE2X3QgIGRldmljZTsKKwl1aW50MTZfdCAgdmVuZG9yOworCXVpbnQxNl90ICBzdWJkZXZpY2U7CisJdWludDE2X3QgIHN1YnZlbmRvcjsKKwlzdHJ1Y3QJICBhaGRfcGNpX2lkZW50aXR5ICplbnRyeTsKKwl1X2ludAkgIGk7CisKKwl2ZW5kb3IgPSBhaGRfcGNpX3JlYWRfY29uZmlnKHBjaSwgUENJUl9ERVZWRU5ET1IsIC8qYnl0ZXMqLzIpOworCWRldmljZSA9IGFoZF9wY2lfcmVhZF9jb25maWcocGNpLCBQQ0lSX0RFVklDRSwgLypieXRlcyovMik7CisJc3VidmVuZG9yID0gYWhkX3BjaV9yZWFkX2NvbmZpZyhwY2ksIFBDSVJfU1VCVkVORF8wLCAvKmJ5dGVzKi8yKTsKKwlzdWJkZXZpY2UgPSBhaGRfcGNpX3JlYWRfY29uZmlnKHBjaSwgUENJUl9TVUJERVZfMCwgLypieXRlcyovMik7CisJZnVsbF9pZCA9IGFoZF9jb21wb3NlX2lkKGRldmljZSwKKwkJCQkgdmVuZG9yLAorCQkJCSBzdWJkZXZpY2UsCisJCQkJIHN1YnZlbmRvcik7CisKKwkvKgorCSAqIENvbnRyb2xsZXJzLCBtYXNrIG91dCB0aGUgSVJPQy9Ib3N0UkFJRCBiaXQKKwkgKi8KKwkKKwlmdWxsX2lkICY9IElEX0FMTF9JUk9DX01BU0s7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWhkX251bV9wY2lfZGV2czsgaSsrKSB7CisJCWVudHJ5ID0gJmFoZF9wY2lfaWRlbnRfdGFibGVbaV07CisJCWlmIChlbnRyeS0+ZnVsbF9pZCA9PSAoZnVsbF9pZCAmIGVudHJ5LT5pZF9tYXNrKSkgeworCQkJLyogSG9ub3IgZXhjbHVzaW9uIGVudHJpZXMuICovCisJCQlpZiAoZW50cnktPm5hbWUgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJcmV0dXJuIChlbnRyeSk7CisJCX0KKwl9CisJcmV0dXJuIChOVUxMKTsKK30KKworaW50CithaGRfcGNpX2NvbmZpZyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfcGNpX2lkZW50aXR5ICplbnRyeSkKK3sKKwlzdHJ1Y3Qgc2NiX2RhdGEgKnNoYXJlZF9zY2JfZGF0YTsKKwl1X2xvbmcJCSBsOworCXVfaW50CQkgY29tbWFuZDsKKwl1aW50MzJfdAkgZGV2Y29uZmlnOworCXVpbnQxNl90CSBzdWJ2ZW5kb3I7IAorCWludAkJIGVycm9yOworCisJc2hhcmVkX3NjYl9kYXRhID0gTlVMTDsKKwlhaGQtPmRlc2NyaXB0aW9uID0gZW50cnktPm5hbWU7CisJLyoKKwkgKiBSZWNvcmQgaWYgdGhpcyBpcyBhbiBIUCBib2FyZC4KKwkgKi8KKwlzdWJ2ZW5kb3IgPSBhaGRfcGNpX3JlYWRfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLAorCQkJCQlQQ0lSX1NVQlZFTkRfMCwgLypieXRlcyovMik7CisJaWYgKHN1YnZlbmRvciA9PSBTVUJJRF9IUCkKKwkJYWhkLT5mbGFncyB8PSBBSERfSFBfQk9BUkQ7CisKKwllcnJvciA9IGVudHJ5LT5zZXR1cChhaGQpOworCWlmIChlcnJvciAhPSAwKQorCQlyZXR1cm4gKGVycm9yKTsKKwkKKwlkZXZjb25maWcgPSBhaGRfcGNpX3JlYWRfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBERVZDT05GSUcsIC8qYnl0ZXMqLzQpOworCWlmICgoZGV2Y29uZmlnICYgUENJWElOSVRQQVQpID09IFBDSVhJTklUX1BDSTMzXzY2KSB7CisJCWFoZC0+Y2hpcCB8PSBBSERfUENJOworCQkvKiBEaXNhYmxlIFBDSVggd29ya2Fyb3VuZHMgd2hlbiBydW5uaW5nIGluIFBDSSBtb2RlLiAqLworCQlhaGQtPmJ1Z3MgJj0gfkFIRF9QQ0lYX0JVR19NQVNLOworCX0gZWxzZSB7CisJCWFoZC0+Y2hpcCB8PSBBSERfUENJWDsKKwl9CisJYWhkLT5idXNfZGVzY3JpcHRpb24gPSBwY2lfYnVzX21vZGVzW1BDSV9CVVNfTU9ERVNfSU5ERVgoZGV2Y29uZmlnKV07CisKKwlhaGRfcG93ZXJfc3RhdGVfY2hhbmdlKGFoZCwgQUhEX1BPV0VSX1NUQVRFX0QwKTsKKworCWVycm9yID0gYWhkX3BjaV9tYXBfcmVnaXN0ZXJzKGFoZCk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOworCisJLyoKKwkgKiBJZiB3ZSBuZWVkIHRvIHN1cHBvcnQgaGlnaCBtZW1vcnksIGVuYWJsZSBkdWFsCisJICogYWRkcmVzcyBjeWNsZXMuICBUaGlzIGJpdCBtdXN0IGJlIHNldCB0byBlbmFibGUKKwkgKiBoaWdoIGFkZHJlc3MgYml0IGdlbmVyYXRpb24gZXZlbiBpZiB3ZSBhcmUgb24gYQorCSAqIDY0Yml0IGJ1cyAoUENJNjRCSVQgc2V0IGluIGRldmNvbmZpZykuCisJICovCisJaWYgKChhaGQtPmZsYWdzICYgKEFIRF8zOUJJVF9BRERSRVNTSU5HfEFIRF82NEJJVF9BRERSRVNTSU5HKSkgIT0gMCkgeworCQl1aW50MzJfdCBkZXZjb25maWc7CisKKwkJaWYgKGJvb3R2ZXJib3NlKQorCQkJcHJpbnRmKCIlczogRW5hYmxpbmcgMzlCaXQgQWRkcmVzc2luZ1xuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpKTsKKwkJZGV2Y29uZmlnID0gYWhkX3BjaV9yZWFkX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywKKwkJCQkJCURFVkNPTkZJRywgLypieXRlcyovNCk7CisJCWRldmNvbmZpZyB8PSBEQUNFTjsKKwkJYWhkX3BjaV93cml0ZV9jb25maWcoYWhkLT5kZXZfc29mdGMsIERFVkNPTkZJRywKKwkJCQkgICAgIGRldmNvbmZpZywgLypieXRlcyovNCk7CisJfQorCQorCS8qIEVuc3VyZSBidXNtYXN0ZXJpbmcgaXMgZW5hYmxlZCAqLworCWNvbW1hbmQgPSBhaGRfcGNpX3JlYWRfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBQQ0lSX0NPTU1BTkQsIC8qYnl0ZXMqLzIpOworCWNvbW1hbmQgfD0gUENJTV9DTURfQlVTTUFTVEVSRU47CisJYWhkX3BjaV93cml0ZV9jb25maWcoYWhkLT5kZXZfc29mdGMsIFBDSVJfQ09NTUFORCwgY29tbWFuZCwgLypieXRlcyovMik7CisKKwllcnJvciA9IGFoZF9zb2Z0Y19pbml0KGFoZCk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOworCisJYWhkLT5idXNfaW50ciA9IGFoZF9wY2lfaW50cjsKKworCWVycm9yID0gYWhkX3Jlc2V0KGFoZCwgLypyZWluaXQqL0ZBTFNFKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChFTlhJTyk7CisKKwlhaGQtPnBjaV9jYWNoZXNpemUgPQorCSAgICBhaGRfcGNpX3JlYWRfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBDU0laRV9MQVRUSU1FLAorCQkJCS8qYnl0ZXMqLzEpICYgQ0FDSEVTSVpFOworCWFoZC0+cGNpX2NhY2hlc2l6ZSAqPSA0OworCisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCS8qIFNlZSBpZiB3ZSBoYXZlIGEgU0VFUFJPTSBhbmQgcGVyZm9ybSBhdXRvLXRlcm0gKi8KKwllcnJvciA9IGFoZF9jaGVja19leHRwb3J0KGFoZCk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOworCisJLyogQ29yZSBpbml0aWFsaXphdGlvbiAqLworCWVycm9yID0gYWhkX2luaXQoYWhkKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwkvKgorCSAqIEFsbG93IGludGVycnVwdHMgbm93IHRoYXQgd2UgYXJlIGNvbXBsZXRlbHkgc2V0dXAuCisJICovCisJZXJyb3IgPSBhaGRfcGNpX21hcF9pbnQoYWhkKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwlhaGRfbGlzdF9sb2NrKCZsKTsKKwkvKgorCSAqIExpbmsgdGhpcyBzb2Z0YyBpbiB3aXRoIGFsbCBvdGhlciBhaGQgaW5zdGFuY2VzLgorCSAqLworCWFoZF9zb2Z0Y19pbnNlcnQoYWhkKTsKKwlhaGRfbGlzdF91bmxvY2soJmwpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBQZXJmb3JtIHNvbWUgc2ltcGxlIHRlc3RzIHRoYXQgc2hvdWxkIGNhdGNoIHNpdHVhdGlvbnMgd2hlcmUKKyAqIG91ciByZWdpc3RlcnMgYXJlIGludmFsaWRseSBtYXBwZWQuCisgKi8KK2ludAorYWhkX3BjaV90ZXN0X3JlZ2lzdGVyX2FjY2VzcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJdWludDMyX3QgY21kOworCXVfaW50CSB0YXJncGNpc3RhdDsKKwl1X2ludAkgcGNpX3N0YXR1czE7CisJaW50CSBlcnJvcjsKKwl1aW50OF90CSBoY250cmw7CisKKwllcnJvciA9IEVJTzsKKworCS8qCisJICogRW5hYmxlIFBDSSBlcnJvciBpbnRlcnJ1cHQgc3RhdHVzLCBidXQgc3VwcHJlc3MgTk1JcworCSAqIGdlbmVyYXRlZCBieSBTRVJSIHJhaXNlZCBkdWUgdG8gdGFyZ2V0IGFib3J0cy4KKwkgKi8KKwljbWQgPSBhaGRfcGNpX3JlYWRfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBQQ0lSX0NPTU1BTkQsIC8qYnl0ZXMqLzIpOworCWFoZF9wY2lfd3JpdGVfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBQQ0lSX0NPTU1BTkQsCisJCQkgICAgIGNtZCAmIH5QQ0lNX0NNRF9TRVJSRVNQRU4sIC8qYnl0ZXMqLzIpOworCisJLyoKKwkgKiBGaXJzdCBhIHNpbXBsZSB0ZXN0IHRvIHNlZSBpZiBhbnkKKwkgKiByZWdpc3RlcnMgY2FuIGJlIHJlYWQuICBSZWFkaW5nCisJICogSENOVFJMIGhhcyBubyBzaWRlIGVmZmVjdHMgYW5kIGhhcworCSAqIGF0IGxlYXN0IG9uZSBiaXQgdGhhdCBpcyBndWFyYW50ZWVkIHRvCisJICogYmUgemVybyBzbyBpdCBpcyBhIGdvb2QgcmVnaXN0ZXIgdG8KKwkgKiB1c2UgZm9yIHRoaXMgdGVzdC4KKwkgKi8KKwloY250cmwgPSBhaGRfaW5iKGFoZCwgSENOVFJMKTsKKwlpZiAoaGNudHJsID09IDB4RkYpCisJCWdvdG8gZmFpbDsKKworCS8qCisJICogTmV4dCBjcmVhdGUgYSBzaXR1YXRpb24gd2hlcmUgd3JpdGUgY29tYmluaW5nCisJICogb3IgcmVhZCBwcmVmZXRjaGluZyBjb3VsZCBiZSBpbml0aWF0ZWQgYnkgdGhlCisJICogQ1BVIG9yIGhvc3QgYnJpZGdlLiAgT3VyIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0CisJICogZWl0aGVyLCBzbyBsb29rIGZvciBkYXRhIGNvcnJ1cHRpb24gYW5kL29yIGZsYWdlZAorCSAqIFBDSSBlcnJvcnMuICBGaXJzdCBwYXVzZSB3aXRob3V0IGNhdXNpbmcgYW5vdGhlcgorCSAqIGNoaXAgcmVzZXQuCisJICovCisJaGNudHJsICY9IH5DSElQUlNUOworCWFoZF9vdXRiKGFoZCwgSENOVFJMLCBoY250cmx8UEFVU0UpOworCXdoaWxlIChhaGRfaXNfcGF1c2VkKGFoZCkgPT0gMCkKKwkJOworCisJLyogQ2xlYXIgYW55IFBDSSBlcnJvcnMgdGhhdCBvY2N1cnJlZCBiZWZvcmUgb3VyIGRyaXZlciBhdHRhY2hlZC4gKi8KKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfQ0ZHLCBBSERfTU9ERV9DRkcpOworCXRhcmdwY2lzdGF0ID0gYWhkX2luYihhaGQsIFRBUkdQQ0lTVEFUKTsKKwlhaGRfb3V0YihhaGQsIFRBUkdQQ0lTVEFULCB0YXJncGNpc3RhdCk7CisJcGNpX3N0YXR1czEgPSBhaGRfcGNpX3JlYWRfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLAorCQkJCQkgIFBDSVJfU1RBVFVTICsgMSwgLypieXRlcyovMSk7CisJYWhkX3BjaV93cml0ZV9jb25maWcoYWhkLT5kZXZfc29mdGMsIFBDSVJfU1RBVFVTICsgMSwKKwkJCSAgICAgcGNpX3N0YXR1czEsIC8qYnl0ZXMqLzEpOworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKwlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSUENJSU5UKTsKKworCWFoZF9vdXRiKGFoZCwgU0VRQ1RMMCwgUEVSUk9SRElTKTsKKwlhaGRfb3V0bChhaGQsIFNSQU1fQkFTRSwgMHg1YWE1NTVhYSk7CisJaWYgKGFoZF9pbmwoYWhkLCBTUkFNX0JBU0UpICE9IDB4NWFhNTU1YWEpCisJCWdvdG8gZmFpbDsKKworCWlmICgoYWhkX2luYihhaGQsIElOVFNUQVQpICYgUENJSU5UKSAhPSAwKSB7CisJCXVfaW50IHRhcmdwY2lzdGF0OworCisJCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9DRkcsIEFIRF9NT0RFX0NGRyk7CisJCXRhcmdwY2lzdGF0ID0gYWhkX2luYihhaGQsIFRBUkdQQ0lTVEFUKTsKKwkJaWYgKCh0YXJncGNpc3RhdCAmIFNUQSkgIT0gMCkKKwkJCWdvdG8gZmFpbDsKKwl9CisKKwllcnJvciA9IDA7CisKK2ZhaWw6CisJaWYgKChhaGRfaW5iKGFoZCwgSU5UU1RBVCkgJiBQQ0lJTlQpICE9IDApIHsKKworCQlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfQ0ZHLCBBSERfTU9ERV9DRkcpOworCQl0YXJncGNpc3RhdCA9IGFoZF9pbmIoYWhkLCBUQVJHUENJU1RBVCk7CisKKwkJLyogU2lsZW50bHkgY2xlYXIgYW55IGxhdGNoZWQgZXJyb3JzLiAqLworCQlhaGRfb3V0YihhaGQsIFRBUkdQQ0lTVEFULCB0YXJncGNpc3RhdCk7CisJCXBjaV9zdGF0dXMxID0gYWhkX3BjaV9yZWFkX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywKKwkJCQkJCSAgUENJUl9TVEFUVVMgKyAxLCAvKmJ5dGVzKi8xKTsKKwkJYWhkX3BjaV93cml0ZV9jb25maWcoYWhkLT5kZXZfc29mdGMsIFBDSVJfU1RBVFVTICsgMSwKKwkJCQkgICAgIHBjaV9zdGF0dXMxLCAvKmJ5dGVzKi8xKTsKKwkJYWhkX291dGIoYWhkLCBDTFJJTlQsIENMUlBDSUlOVCk7CisJfQorCWFoZF9vdXRiKGFoZCwgU0VRQ1RMMCwgUEVSUk9SRElTfEZBSUxESVMpOworCWFoZF9wY2lfd3JpdGVfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBQQ0lSX0NPTU1BTkQsIGNtZCwgLypieXRlcyovMik7CisJcmV0dXJuIChlcnJvcik7Cit9CisKKy8qCisgKiBDaGVjayB0aGUgZXh0ZXJuYWwgcG9ydCBsb2dpYyBmb3IgYSBzZXJpYWwgZWVwcm9tCisgKiBhbmQgdGVybWluYXRpb24vY2FibGUgZGV0ZWN0aW9uIGNvbnRybHMuCisgKi8KK3N0YXRpYyBpbnQKK2FoZF9jaGVja19leHRwb3J0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlzdHJ1Y3QJdnBkX2NvbmZpZyB2cGQ7CisJc3RydWN0CXNlZXByb21fY29uZmlnICpzYzsKKwl1X2ludAlhZGFwdGVyX2NvbnRyb2w7CisJaW50CWhhdmVfc2VlcHJvbTsKKwlpbnQJZXJyb3I7CisKKwlzYyA9IGFoZC0+c2VlcF9jb25maWc7CisJaGF2ZV9zZWVwcm9tID0gYWhkX2FjcXVpcmVfc2VlcHJvbShhaGQpOworCWlmIChoYXZlX3NlZXByb20pIHsKKwkJdV9pbnQgc3RhcnRfYWRkcjsKKworCQkvKgorCQkgKiBGZXRjaCBWUEQgZm9yIHRoaXMgZnVuY3Rpb24gYW5kIHBhcnNlIGl0LgorCQkgKi8KKwkJaWYgKGJvb3R2ZXJib3NlKSAKKwkJCXByaW50ZigiJXM6IFJlYWRpbmcgVlBEIGZyb20gU0VFUFJPTS4uLiIsCisJCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CisKKwkJLyogQWRkcmVzcyBpcyBhbHdheXMgaW4gdW5pdHMgb2YgMTZiaXQgd29yZHMgKi8KKwkJc3RhcnRfYWRkciA9ICgoMiAqIHNpemVvZigqc2MpKQorCQkJICAgICsgKHNpemVvZih2cGQpICogKGFoZC0+Y2hhbm5lbCAtICdBJykpKSAvIDI7CisKKwkJZXJyb3IgPSBhaGRfcmVhZF9zZWVwcm9tKGFoZCwgKHVpbnQxNl90ICopJnZwZCwKKwkJCQkJIHN0YXJ0X2FkZHIsIHNpemVvZih2cGQpLzIsCisJCQkJCSAvKmJ5dGVzdHJlYW0qL1RSVUUpOworCQlpZiAoZXJyb3IgPT0gMCkKKwkJCWVycm9yID0gYWhkX3BhcnNlX3ZwZGRhdGEoYWhkLCAmdnBkKTsKKwkJaWYgKGJvb3R2ZXJib3NlKSAKKwkJCXByaW50ZigiJXM6IFZQRCBwYXJzaW5nICVzXG4iLAorCQkJICAgICAgIGFoZF9uYW1lKGFoZCksCisJCQkgICAgICAgZXJyb3IgPT0gMCA/ICJzdWNjZXNzZnVsIiA6ICJmYWlsZWQiKTsKKworCQlpZiAoYm9vdHZlcmJvc2UpIAorCQkJcHJpbnRmKCIlczogUmVhZGluZyBTRUVQUk9NLi4uIiwgYWhkX25hbWUoYWhkKSk7CisKKwkJLyogQWRkcmVzcyBpcyBhbHdheXMgaW4gdW5pdHMgb2YgMTZiaXQgd29yZHMgKi8KKwkJc3RhcnRfYWRkciA9IChzaXplb2YoKnNjKSAvIDIpICogKGFoZC0+Y2hhbm5lbCAtICdBJyk7CisKKwkJZXJyb3IgPSBhaGRfcmVhZF9zZWVwcm9tKGFoZCwgKHVpbnQxNl90ICopc2MsCisJCQkJCSBzdGFydF9hZGRyLCBzaXplb2YoKnNjKS8yLAorCQkJCQkgLypieXRlc3RyZWFtKi9GQUxTRSk7CisKKwkJaWYgKGVycm9yICE9IDApIHsKKwkJCXByaW50ZigiVW5hYmxlIHRvIHJlYWQgU0VFUFJPTVxuIik7CisJCQloYXZlX3NlZXByb20gPSAwOworCQl9IGVsc2UgeworCQkJaGF2ZV9zZWVwcm9tID0gYWhkX3ZlcmlmeV9ja3N1bShzYyk7CisKKwkJCWlmIChib290dmVyYm9zZSkgeworCQkJCWlmIChoYXZlX3NlZXByb20gPT0gMCkKKwkJCQkJcHJpbnRmICgiY2hlY2tzdW0gZXJyb3JcbiIpOworCQkJCWVsc2UKKwkJCQkJcHJpbnRmICgiZG9uZS5cbiIpOworCQkJfQorCQl9CisJCWFoZF9yZWxlYXNlX3NlZXByb20oYWhkKTsKKwl9CisKKwlpZiAoIWhhdmVfc2VlcHJvbSkgeworCQl1X2ludAkgIG52cmFtX3NjYjsKKworCQkvKgorCQkgKiBQdWxsIHNjcmF0Y2ggcmFtIHNldHRpbmdzIGFuZCB0cmVhdCB0aGVtIGFzCisJCSAqIGlmIHRoZXkgYXJlIHRoZSBjb250ZW50cyBvZiBhbiBzZWVwcm9tIGlmCisJCSAqIHRoZSAnQURQVCcsICdCSU9TJywgb3IgJ0FTUEknIHNpZ25hdHVyZSBpcyBmb3VuZAorCQkgKiBpbiBTQ0IgMHhGRi4gIFdlIG1hbnVhbGx5IGNvbXBvc2UgdGhlIGRhdGEgYXMgMTZiaXQKKwkJICogdmFsdWVzIHRvIGF2b2lkIGVuZGlhbiBpc3N1ZXMuCisJCSAqLworCQlhaGRfc2V0X3NjYnB0cihhaGQsIDB4RkYpOworCQludnJhbV9zY2IgPSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9CQVNFICsgTlZSQU1fU0NCX09GRlNFVCk7CisJCWlmIChudnJhbV9zY2IgIT0gMHhGRgorCQkgJiYgKChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9CQVNFICsgMCkgPT0gJ0EnCisJCSAgICYmIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0JBU0UgKyAxKSA9PSAnRCcKKwkJICAgJiYgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQkFTRSArIDIpID09ICdQJworCQkgICAmJiBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9CQVNFICsgMykgPT0gJ1QnKQorCQkgIHx8IChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9CQVNFICsgMCkgPT0gJ0InCisJCSAgICYmIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0JBU0UgKyAxKSA9PSAnSScKKwkJICAgJiYgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQkFTRSArIDIpID09ICdPJworCQkgICAmJiBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9CQVNFICsgMykgPT0gJ1MnKQorCQkgIHx8IChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9CQVNFICsgMCkgPT0gJ0EnCisJCSAgICYmIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0JBU0UgKyAxKSA9PSAnUycKKwkJICAgJiYgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQkFTRSArIDIpID09ICdQJworCQkgICAmJiBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9CQVNFICsgMykgPT0gJ0knKSkpIHsKKwkJCXVpbnQxNl90ICpzY19kYXRhOworCQkJaW50CSAgaTsKKworCQkJYWhkX3NldF9zY2JwdHIoYWhkLCBudnJhbV9zY2IpOworCQkJc2NfZGF0YSA9ICh1aW50MTZfdCAqKXNjOworCQkJZm9yIChpID0gMDsgaSA8IDY0OyBpICs9IDIpCisJCQkJKnNjX2RhdGErKyA9IGFoZF9pbndfc2NicmFtKGFoZCwgU0NCX0JBU0UraSk7CisJCQloYXZlX3NlZXByb20gPSBhaGRfdmVyaWZ5X2Nrc3VtKHNjKTsKKwkJCWlmIChoYXZlX3NlZXByb20pCisJCQkJYWhkLT5mbGFncyB8PSBBSERfU0NCX0NPTkZJR19VU0VEOworCQl9CisJfQorCisjaWYgQUhEX0RFQlVHCisJaWYgKGhhdmVfc2VlcHJvbSAhPSAwCisJICYmIChhaGRfZGVidWcgJiBBSERfRFVNUF9TRUVQUk9NKSAhPSAwKSB7CisJCXVpbnQxNl90ICpzY19kYXRhOworCQlpbnQJICBpOworCisJCXByaW50ZigiJXM6IFNlZXByb20gQ29udGVudHM6IiwgYWhkX25hbWUoYWhkKSk7CisJCXNjX2RhdGEgPSAodWludDE2X3QgKilzYzsKKwkJZm9yIChpID0gMDsgaSA8IChzaXplb2YoKnNjKSk7IGkgKz0gMikKKwkJCXByaW50ZigiXG5cdDB4JS40eCIsIHNjX2RhdGFbaV0pOworCQlwcmludGYoIlxuIik7CisJfQorI2VuZGlmCisKKwlpZiAoIWhhdmVfc2VlcHJvbSkgeworCQlpZiAoYm9vdHZlcmJvc2UpCisJCQlwcmludGYoIiVzOiBObyBTRUVQUk9NIGF2YWlsYWJsZS5cbiIsIGFoZF9uYW1lKGFoZCkpOworCQlhaGQtPmZsYWdzIHw9IEFIRF9VU0VERUZBVUxUUzsKKwkJZXJyb3IgPSBhaGRfZGVmYXVsdF9jb25maWcoYWhkKTsKKwkJYWRhcHRlcl9jb250cm9sID0gQ0ZBVVRPVEVSTXxDRlNFQVVUT1RFUk07CisJCWZyZWUoYWhkLT5zZWVwX2NvbmZpZywgTV9ERVZCVUYpOworCQlhaGQtPnNlZXBfY29uZmlnID0gTlVMTDsKKwl9IGVsc2UgeworCQllcnJvciA9IGFoZF9wYXJzZV9jZmdkYXRhKGFoZCwgc2MpOworCQlhZGFwdGVyX2NvbnRyb2wgPSBzYy0+YWRhcHRlcl9jb250cm9sOworCX0KKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwlhaGRfY29uZmlndXJlX3Rlcm1pbmF0aW9uKGFoZCwgYWRhcHRlcl9jb250cm9sKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCithaGRfY29uZmlndXJlX3Rlcm1pbmF0aW9uKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgYWRhcHRlcl9jb250cm9sKQoreworCWludAkgZXJyb3I7CisJdV9pbnQJIHN4ZnJjdGwxOworCXVpbnQ4X3QJIHRlcm1jdGw7CisJdWludDMyX3QgZGV2Y29uZmlnOworCisJZGV2Y29uZmlnID0gYWhkX3BjaV9yZWFkX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywgREVWQ09ORklHLCAvKmJ5dGVzKi80KTsKKwlkZXZjb25maWcgJj0gflNUUFdMRVZFTDsKKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfU1RQV0xFVkVMX0EpICE9IDApCisJCWRldmNvbmZpZyB8PSBTVFBXTEVWRUw7CisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoIiVzOiBTVFBXTEVWRUwgaXMgJXNcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCAoZGV2Y29uZmlnICYgU1RQV0xFVkVMKSA/ICJvbiIgOiAib2ZmIik7CisJYWhkX3BjaV93cml0ZV9jb25maWcoYWhkLT5kZXZfc29mdGMsIERFVkNPTkZJRywgZGV2Y29uZmlnLCAvKmJ5dGVzKi80KTsKKyAKKwkvKiBNYWtlIHN1cmUgY3VycmVudCBzZW5zaW5nIGlzIG9mZi4gKi8KKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfQ1VSUkVOVF9TRU5TSU5HKSAhPSAwKSB7CisJCSh2b2lkKWFoZF93cml0ZV9mbGV4cG9ydChhaGQsIEZMWEFERFJfUk9NU1RBVF9DVVJTRU5TRUNUTCwgMCk7CisJfQorCisJLyoKKwkgKiBSZWFkIHRvIHNlbnNlLiAgV3JpdGUgdG8gc2V0LgorCSAqLworCWVycm9yID0gYWhkX3JlYWRfZmxleHBvcnQoYWhkLCBGTFhBRERSX1RFUk1DVEwsICZ0ZXJtY3RsKTsKKwlpZiAoKGFkYXB0ZXJfY29udHJvbCAmIENGQVVUT1RFUk0pID09IDApIHsKKwkJaWYgKGJvb3R2ZXJib3NlKQorCQkJcHJpbnRmKCIlczogTWFudWFsIFByaW1hcnkgVGVybWluYXRpb25cbiIsCisJCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CisJCXRlcm1jdGwgJj0gfihGTFhfVEVSTUNUTF9FTlBSSUxPV3xGTFhfVEVSTUNUTF9FTlBSSUhJR0gpOworCQlpZiAoKGFkYXB0ZXJfY29udHJvbCAmIENGU1RFUk0pICE9IDApCisJCQl0ZXJtY3RsIHw9IEZMWF9URVJNQ1RMX0VOUFJJTE9XOworCQlpZiAoKGFkYXB0ZXJfY29udHJvbCAmIENGV1NURVJNKSAhPSAwKQorCQkJdGVybWN0bCB8PSBGTFhfVEVSTUNUTF9FTlBSSUhJR0g7CisJfSBlbHNlIGlmIChlcnJvciAhPSAwKSB7CisJCXByaW50ZigiJXM6IFByaW1hcnkgQXV0by1UZXJtIFNlbnNpbmcgZmFpbGVkISAiCisJCSAgICAgICAiVXNpbmcgRGVmYXVsdHMuXG4iLCBhaGRfbmFtZShhaGQpKTsKKwkJdGVybWN0bCA9IEZMWF9URVJNQ1RMX0VOUFJJTE9XfEZMWF9URVJNQ1RMX0VOUFJJSElHSDsKKwl9CisKKwlpZiAoKGFkYXB0ZXJfY29udHJvbCAmIENGU0VBVVRPVEVSTSkgPT0gMCkgeworCQlpZiAoYm9vdHZlcmJvc2UpCisJCQlwcmludGYoIiVzOiBNYW51YWwgU2Vjb25kYXJ5IFRlcm1pbmF0aW9uXG4iLAorCQkJICAgICAgIGFoZF9uYW1lKGFoZCkpOworCQl0ZXJtY3RsICY9IH4oRkxYX1RFUk1DVExfRU5TRUNMT1d8RkxYX1RFUk1DVExfRU5TRUNISUdIKTsKKwkJaWYgKChhZGFwdGVyX2NvbnRyb2wgJiBDRlNFTE9XVEVSTSkgIT0gMCkKKwkJCXRlcm1jdGwgfD0gRkxYX1RFUk1DVExfRU5TRUNMT1c7CisJCWlmICgoYWRhcHRlcl9jb250cm9sICYgQ0ZTRUhJR0hURVJNKSAhPSAwKQorCQkJdGVybWN0bCB8PSBGTFhfVEVSTUNUTF9FTlNFQ0hJR0g7CisJfSBlbHNlIGlmIChlcnJvciAhPSAwKSB7CisJCXByaW50ZigiJXM6IFNlY29uZGFyeSBBdXRvLVRlcm0gU2Vuc2luZyBmYWlsZWQhICIKKwkJICAgICAgICJVc2luZyBEZWZhdWx0cy5cbiIsIGFoZF9uYW1lKGFoZCkpOworCQl0ZXJtY3RsIHw9IEZMWF9URVJNQ1RMX0VOU0VDTE9XfEZMWF9URVJNQ1RMX0VOU0VDSElHSDsKKwl9CisKKwkvKgorCSAqIE5vdyBzZXQgdGhlIHRlcm1pbmF0aW9uIGJhc2VkIG9uIHdoYXQgd2UgZm91bmQuCisJICovCisJc3hmcmN0bDEgPSBhaGRfaW5iKGFoZCwgU1hGUkNUTDEpICYgflNUUFdFTjsKKwlpZiAoKHRlcm1jdGwgJiBGTFhfVEVSTUNUTF9FTlBSSUxPVykgIT0gMCkgeworCQlhaGQtPmZsYWdzIHw9IEFIRF9URVJNX0VOQl9BOworCQlzeGZyY3RsMSB8PSBTVFBXRU47CisJfQorCS8qIE11c3Qgc2V0IHRoZSBsYXRjaCBvbmNlIGluIG9yZGVyIHRvIGJlIGVmZmVjdGl2ZS4gKi8KKwlhaGRfb3V0YihhaGQsIFNYRlJDVEwxLCBzeGZyY3RsMXxTVFBXRU4pOworCWFoZF9vdXRiKGFoZCwgU1hGUkNUTDEsIHN4ZnJjdGwxKTsKKworCWVycm9yID0gYWhkX3dyaXRlX2ZsZXhwb3J0KGFoZCwgRkxYQUREUl9URVJNQ1RMLCB0ZXJtY3RsKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlwcmludGYoIiVzOiBVbmFibGUgdG8gc2V0IHRlcm1pbmF0aW9uIHNldHRpbmdzIVxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCkpOworCX0gZWxzZSBpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCIlczogUHJpbWFyeSBIaWdoIGJ5dGUgdGVybWluYXRpb24gJXNhYmxlZFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICAodGVybWN0bCAmIEZMWF9URVJNQ1RMX0VOUFJJSElHSCkgPyAiRW4iIDogIkRpcyIpOworCisJCXByaW50ZigiJXM6IFByaW1hcnkgTG93IGJ5dGUgdGVybWluYXRpb24gJXNhYmxlZFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICAodGVybWN0bCAmIEZMWF9URVJNQ1RMX0VOUFJJTE9XKSA/ICJFbiIgOiAiRGlzIik7CisKKwkJcHJpbnRmKCIlczogU2Vjb25kYXJ5IEhpZ2ggYnl0ZSB0ZXJtaW5hdGlvbiAlc2FibGVkXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwKKwkJICAgICAgICh0ZXJtY3RsICYgRkxYX1RFUk1DVExfRU5TRUNISUdIKSA/ICJFbiIgOiAiRGlzIik7CisKKwkJcHJpbnRmKCIlczogU2Vjb25kYXJ5IExvdyBieXRlIHRlcm1pbmF0aW9uICVzYWJsZWRcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLAorCQkgICAgICAgKHRlcm1jdGwgJiBGTFhfVEVSTUNUTF9FTlNFQ0xPVykgPyAiRW4iIDogIkRpcyIpOworCX0KKwlyZXR1cm47Cit9CisKKyNkZWZpbmUJRFBFCTB4ODAKKyNkZWZpbmUgU1NFCTB4NDAKKyNkZWZpbmUJUk1BCTB4MjAKKyNkZWZpbmUJUlRBCTB4MTAKKyNkZWZpbmUgU1RBCTB4MDgKKyNkZWZpbmUgRFBSCTB4MDEKKworc3RhdGljIGNvbnN0IGNoYXIgKnNwbGl0X3N0YXR1c19zb3VyY2VbXSA9Cit7CisJIkRGRjAiLAorCSJERkYxIiwKKwkiT1ZMWSIsCisJIkNNQyIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqcGNpX3N0YXR1c19zb3VyY2VbXSA9Cit7CisJIkRGRjAiLAorCSJERkYxIiwKKwkiU0ciLAorCSJDTUMiLAorCSJPVkxZIiwKKwkiTk9ORSIsCisJIk1TSSIsCisJIlRBUkciCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqc3BsaXRfc3RhdHVzX3N0cmluZ3NbXSA9Cit7CisJIiVzOiBSZWNlaXZlZCBzcGxpdCByZXNwb25zZSBpbiAlcy5cbiIsCisJIiVzOiBSZWNlaXZlZCBzcGxpdCBjb21wbGV0aW9uIGVycm9yIG1lc3NhZ2UgaW4gJXNcbiIsCisJIiVzOiBSZWNlaXZlIG92ZXJydW4gaW4gJXNcbiIsCisJIiVzOiBDb3VudCBub3QgY29tcGxldGUgaW4gJXNcbiIsCisJIiVzOiBTcGxpdCBjb21wbGV0aW9uIGRhdGEgYnVja2V0IGluICVzXG4iLAorCSIlczogU3BsaXQgY29tcGxldGlvbiBhZGRyZXNzIGVycm9yIGluICVzXG4iLAorCSIlczogU3BsaXQgY29tcGxldGlvbiBieXRlIGNvdW50IGVycm9yIGluICVzXG4iLAorCSIlczogU2lnbmFsZWQgVGFyZ2V0LWFib3J0IHRvIGVhcmx5IHRlcm1pbmF0ZSBhIHNwbGl0IGluICVzXG4iCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqcGNpX3N0YXR1c19zdHJpbmdzW10gPQoreworCSIlczogRGF0YSBQYXJpdHkgRXJyb3IgaGFzIGJlZW4gcmVwb3J0ZWQgdmlhIFBFUlIjIGluICVzXG4iLAorCSIlczogVGFyZ2V0IGluaXRpYWwgd2FpdCBzdGF0ZSBlcnJvciBpbiAlc1xuIiwKKwkiJXM6IFNwbGl0IGNvbXBsZXRpb24gcmVhZCBkYXRhIHBhcml0eSBlcnJvciBpbiAlc1xuIiwKKwkiJXM6IFNwbGl0IGNvbXBsZXRpb24gYWRkcmVzcyBhdHRyaWJ1dGUgcGFyaXR5IGVycm9yIGluICVzXG4iLAorCSIlczogUmVjZWl2ZWQgYSBUYXJnZXQgQWJvcnQgaW4gJXNcbiIsCisJIiVzOiBSZWNlaXZlZCBhIE1hc3RlciBBYm9ydCBpbiAlc1xuIiwKKwkiJXM6IFNpZ25hbCBTeXN0ZW0gRXJyb3IgRGV0ZWN0ZWQgaW4gJXNcbiIsCisJIiVzOiBBZGRyZXNzIG9yIFdyaXRlIFBoYXNlIFBhcml0eSBFcnJvciBEZXRlY3RlZCBpbiAlcy5cbiIKK307CisKK3ZvaWQKK2FoZF9wY2lfaW50cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJdWludDhfdAkJcGNpX3N0YXR1c1s4XTsKKwlhaGRfbW9kZV9zdGF0ZQlzYXZlZF9tb2RlczsKKwl1X2ludAkJcGNpX3N0YXR1czE7CisJdV9pbnQJCWludHN0YXQ7CisJdV9pbnQJCWk7CisJdV9pbnQJCXJlZzsKKwkKKwlpbnRzdGF0ID0gYWhkX2luYihhaGQsIElOVFNUQVQpOworCisJaWYgKChpbnRzdGF0ICYgU1BMVElOVCkgIT0gMCkKKwkJYWhkX3BjaV9zcGxpdF9pbnRyKGFoZCwgaW50c3RhdCk7CisKKwlpZiAoKGludHN0YXQgJiBQQ0lJTlQpID09IDApCisJCXJldHVybjsKKworCXByaW50ZigiJXM6IFBDSSBlcnJvciBJbnRlcnJ1cHRcbiIsIGFoZF9uYW1lKGFoZCkpOworCXNhdmVkX21vZGVzID0gYWhkX3NhdmVfbW9kZXMoYWhkKTsKKwlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0NGRywgQUhEX01PREVfQ0ZHKTsKKwlmb3IgKGkgPSAwLCByZWcgPSBERjBQQ0lTVEFUOyBpIDwgODsgaSsrLCByZWcrKykgeworCisJCWlmIChpID09IDUpCisJCQljb250aW51ZTsKKwkJcGNpX3N0YXR1c1tpXSA9IGFoZF9pbmIoYWhkLCByZWcpOworCQkvKiBDbGVhciBsYXRjaGVkIGVycm9ycy4gIFNvIG91ciBpbnRlcnJ1cHQgZGVhc3NlcnRzLiAqLworCQlhaGRfb3V0YihhaGQsIHJlZywgcGNpX3N0YXR1c1tpXSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQl1X2ludCBiaXQ7CisJCisJCWlmIChpID09IDUpCisJCQljb250aW51ZTsKKworCQlmb3IgKGJpdCA9IDA7IGJpdCA8IDg7IGJpdCsrKSB7CisKKwkJCWlmICgocGNpX3N0YXR1c1tpXSAmICgweDEgPDwgYml0KSkgIT0gMCkgeworCQkJCXN0YXRpYyBjb25zdCBjaGFyICpzOworCisJCQkJcyA9IHBjaV9zdGF0dXNfc3RyaW5nc1tiaXRdOworCQkJCWlmIChpID09IDcvKlRBUkcqLyAmJiBiaXQgPT0gMykKKwkJCQkJcyA9ICIlczogU2lnbmFsZWQgVGFyZ2V0IEFib3J0XG4iOworCQkJCXByaW50ZihzLCBhaGRfbmFtZShhaGQpLCBwY2lfc3RhdHVzX3NvdXJjZVtpXSk7CisJCQl9CisJCX0JCisJfQorCXBjaV9zdGF0dXMxID0gYWhkX3BjaV9yZWFkX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywKKwkJCQkJICBQQ0lSX1NUQVRVUyArIDEsIC8qYnl0ZXMqLzEpOworCWFoZF9wY2lfd3JpdGVfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBQQ0lSX1NUQVRVUyArIDEsCisJCQkgICAgIHBjaV9zdGF0dXMxLCAvKmJ5dGVzKi8xKTsKKwlhaGRfcmVzdG9yZV9tb2RlcyhhaGQsIHNhdmVkX21vZGVzKTsKKwlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSUENJSU5UKTsKKwlhaGRfdW5wYXVzZShhaGQpOworfQorCitzdGF0aWMgdm9pZAorYWhkX3BjaV9zcGxpdF9pbnRyKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgaW50c3RhdCkKK3sKKwl1aW50OF90CQlzcGxpdF9zdGF0dXNbNF07CisJdWludDhfdAkJc3BsaXRfc3RhdHVzMVs0XTsKKwl1aW50OF90CQlzZ19zcGxpdF9zdGF0dXNbMl07CisJdWludDhfdAkJc2dfc3BsaXRfc3RhdHVzMVsyXTsKKwlhaGRfbW9kZV9zdGF0ZQlzYXZlZF9tb2RlczsKKwl1X2ludAkJaTsKKwl1aW50MTZfdAlwY2l4X3N0YXR1czsKKworCS8qCisJICogQ2hlY2sgZm9yIHNwbGl0cyBpbiBhbGwgbW9kZXMuICBNb2RlcyAwIGFuZCAxCisJICogYWRkaXRpb25hbGx5IGhhdmUgU0cgZW5naW5lIHNwbGl0cyB0byBsb29rIGF0LgorCSAqLworCXBjaXhfc3RhdHVzID0gYWhkX3BjaV9yZWFkX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywgUENJWFJfU1RBVFVTLAorCQkJCQkgIC8qYnl0ZXMqLzIpOworCXByaW50ZigiJXM6IFBDSSBTcGxpdCBJbnRlcnJ1cHQgLSBQQ0ktWCBzdGF0dXMgPSAweCV4XG4iLAorCSAgICAgICBhaGRfbmFtZShhaGQpLCBwY2l4X3N0YXR1cyk7CisJc2F2ZWRfbW9kZXMgPSBhaGRfc2F2ZV9tb2RlcyhhaGQpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJYWhkX3NldF9tb2RlcyhhaGQsIGksIGkpOworCisJCXNwbGl0X3N0YXR1c1tpXSA9IGFoZF9pbmIoYWhkLCBEQ0hTUExUU1RBVDApOworCQlzcGxpdF9zdGF0dXMxW2ldID0gYWhkX2luYihhaGQsIERDSFNQTFRTVEFUMSk7CisJCS8qIENsZWFyIGxhdGNoZWQgZXJyb3JzLiAgU28gb3VyIGludGVycnVwdCBkZWFzc2VydHMuICovCisJCWFoZF9vdXRiKGFoZCwgRENIU1BMVFNUQVQwLCBzcGxpdF9zdGF0dXNbaV0pOworCQlhaGRfb3V0YihhaGQsIERDSFNQTFRTVEFUMSwgc3BsaXRfc3RhdHVzMVtpXSk7CisJCWlmIChpID4gMSkKKwkJCWNvbnRpbnVlOworCQlzZ19zcGxpdF9zdGF0dXNbaV0gPSBhaGRfaW5iKGFoZCwgU0dTUExUU1RBVDApOworCQlzZ19zcGxpdF9zdGF0dXMxW2ldID0gYWhkX2luYihhaGQsIFNHU1BMVFNUQVQxKTsKKwkJLyogQ2xlYXIgbGF0Y2hlZCBlcnJvcnMuICBTbyBvdXIgaW50ZXJydXB0IGRlYXNzZXJ0cy4gKi8KKwkJYWhkX291dGIoYWhkLCBTR1NQTFRTVEFUMCwgc2dfc3BsaXRfc3RhdHVzW2ldKTsKKwkJYWhkX291dGIoYWhkLCBTR1NQTFRTVEFUMSwgc2dfc3BsaXRfc3RhdHVzMVtpXSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQl1X2ludCBiaXQ7CisKKwkJZm9yIChiaXQgPSAwOyBiaXQgPCA4OyBiaXQrKykgeworCisJCQlpZiAoKHNwbGl0X3N0YXR1c1tpXSAmICgweDEgPDwgYml0KSkgIT0gMCkgeworCQkJCXN0YXRpYyBjb25zdCBjaGFyICpzOworCisJCQkJcyA9IHNwbGl0X3N0YXR1c19zdHJpbmdzW2JpdF07CisJCQkJcHJpbnRmKHMsIGFoZF9uYW1lKGFoZCksCisJCQkJICAgICAgIHNwbGl0X3N0YXR1c19zb3VyY2VbaV0pOworCQkJfQorCisJCQlpZiAoaSA+IDEpCisJCQkJY29udGludWU7CisKKwkJCWlmICgoc2dfc3BsaXRfc3RhdHVzW2ldICYgKDB4MSA8PCBiaXQpKSAhPSAwKSB7CisJCQkJc3RhdGljIGNvbnN0IGNoYXIgKnM7CisKKwkJCQlzID0gc3BsaXRfc3RhdHVzX3N0cmluZ3NbYml0XTsKKwkJCQlwcmludGYocywgYWhkX25hbWUoYWhkKSwgIlNHIik7CisJCQl9CisJCX0KKwl9CisJLyoKKwkgKiBDbGVhciBQQ0ktWCBzdGF0dXMgYml0cy4KKwkgKi8KKwlhaGRfcGNpX3dyaXRlX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywgUENJWFJfU1RBVFVTLAorCQkJICAgICBwY2l4X3N0YXR1cywgLypieXRlcyovMik7CisJYWhkX291dGIoYWhkLCBDTFJJTlQsIENMUlNQTFRJTlQpOworCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOworfQorCitzdGF0aWMgaW50CithaGRfYWljNzkwMV9zZXR1cChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisKKwlhaGQtPmNoaXAgPSBBSERfQUlDNzkwMTsKKwlhaGQtPmZlYXR1cmVzID0gQUhEX0FJQzc5MDFfRkU7CisJcmV0dXJuIChhaGRfYWljNzkwWF9zZXR1cChhaGQpKTsKK30KKworc3RhdGljIGludAorYWhkX2FpYzc5MDFBX3NldHVwKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKworCWFoZC0+Y2hpcCA9IEFIRF9BSUM3OTAxQTsKKwlhaGQtPmZlYXR1cmVzID0gQUhEX0FJQzc5MDFBX0ZFOworCXJldHVybiAoYWhkX2FpYzc5MFhfc2V0dXAoYWhkKSk7Cit9CisKK3N0YXRpYyBpbnQKK2FoZF9haWM3OTAyX3NldHVwKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlhaGQtPmNoaXAgPSBBSERfQUlDNzkwMjsKKwlhaGQtPmZlYXR1cmVzID0gQUhEX0FJQzc5MDJfRkU7CisJcmV0dXJuIChhaGRfYWljNzkwWF9zZXR1cChhaGQpKTsKK30KKworc3RhdGljIGludAorYWhkX2FpYzc5MFhfc2V0dXAoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCWFoZF9kZXZfc29mdGNfdCBwY2k7CisJdV9pbnQgcmV2OworCisJcGNpID0gYWhkLT5kZXZfc29mdGM7CisJcmV2ID0gYWhkX3BjaV9yZWFkX2NvbmZpZyhwY2ksIFBDSVJfUkVWSUQsIC8qYnl0ZXMqLzEpOworCWlmIChyZXYgPCBJRF9BSUM3OTAyX1BDSV9SRVZfQTQpIHsKKwkJcHJpbnRmKCIlczogVW5hYmxlIHRvIGF0dGFjaCB0byB1bnN1cHBvcnRlZCBjaGlwIHJldmlzaW9uICVkXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgcmV2KTsKKwkJYWhkX3BjaV93cml0ZV9jb25maWcocGNpLCBQQ0lSX0NPTU1BTkQsIDAsIC8qYnl0ZXMqLzIpOworCQlyZXR1cm4gKEVOWElPKTsKKwl9CisJYWhkLT5jaGFubmVsID0gYWhkX2dldF9wY2lfZnVuY3Rpb24ocGNpKSArICdBJzsKKwlpZiAocmV2IDwgSURfQUlDNzkwMl9QQ0lfUkVWX0IwKSB7CisJCS8qCisJCSAqIEVuYWJsZSBBIHNlcmllcyB3b3JrYXJvdW5kcy4KKwkJICovCisJCWFoZC0+YnVncyB8PSBBSERfU0VOVF9TQ0JfVVBEQVRFX0JVR3xBSERfQUJPUlRfTFFJX0JVRworCQkJICB8ICBBSERfUEtUX0JJVEJVQ0tFVF9CVUd8QUhEX0xPTkdfU0VUSU1PX0JVRworCQkJICB8ICBBSERfTkxRSUNSQ19ERUxBWUVEX0JVR3xBSERfU0NTSVJTVF9CVUcKKwkJCSAgfCAgQUhEX0xRT19BVE5PX0JVR3xBSERfQVVUT0ZMVVNIX0JVRworCQkJICB8ICBBSERfQ0xSTFFPX0FVVE9DTFJfQlVHfEFIRF9QQ0lYX01NQVBJT19CVUcKKwkJCSAgfCAgQUhEX1BDSVhfQ0hJUFJTVF9CVUd8QUhEX1BDSVhfU0NCUkFNX1JEX0JVRworCQkJICB8ICBBSERfUEtUSVpFRF9TVEFUVVNfQlVHfEFIRF9QS1RfTFVOX0JVRworCQkJICB8ICBBSERfTURGRl9XU0NCUFRSX0JVR3xBSERfUkVHX1NMT1dfU0VUVExFX0JVRworCQkJICB8ICBBSERfU0VUX01PREVfQlVHfEFIRF9CVVNGUkVFUkVWX0JVRworCQkJICB8ICBBSERfTk9OUEFDS0ZJRk9fQlVHfEFIRF9QQUNFRF9ORUdUQUJMRV9CVUcKKwkJCSAgfCAgQUhEX0ZBSU5UX0xFRF9CVUc7CisKKwkJLyoKKwkJICogSU8gQ2VsbCBwYXJhbXRlciBzZXR1cC4KKwkJICovCisJCUFIRF9TRVRfUFJFQ09NUChhaGQsIEFIRF9QUkVDT01QX0NVVEJBQ0tfMjkpOworCisJCWlmICgoYWhkLT5mbGFncyAmIEFIRF9IUF9CT0FSRCkgPT0gMCkKKwkJCUFIRF9TRVRfU0xFV1JBVEUoYWhkLCBBSERfU0xFV1JBVEVfREVGX1JFVkEpOworCX0gZWxzZSB7CisJCXVfaW50IGRldmNvbmZpZzE7CisKKwkJYWhkLT5mZWF0dXJlcyB8PSBBSERfUlRJfEFIRF9ORVdfSU9DRUxMX09QVFMKKwkJCSAgICAgIHwgIEFIRF9ORVdfREZDTlRSTF9PUFRTfEFIRF9GQVNUX0NEQl9ERUxJVkVSWTsKKwkJYWhkLT5idWdzIHw9IEFIRF9MUU9PVkVSUlVOX0JVR3xBSERfRUFSTFlfUkVRX0JVRzsKKworCQkvKgorCQkgKiBTb21lIGlzc3VlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgaW4gdGhlIDc5MDFCLgorCQkgKi8KKwkJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX01VTFRJX0ZVTkMpICE9IDApCisJCQlhaGQtPmJ1Z3MgfD0gQUhEX0lOVENPTExJU0lPTl9CVUd8QUhEX0FCT1JUX0xRSV9CVUc7CisKKwkJLyoKKwkJICogSU8gQ2VsbCBwYXJhbXRlciBzZXR1cC4KKwkJICovCisJCUFIRF9TRVRfUFJFQ09NUChhaGQsIEFIRF9QUkVDT01QX0NVVEJBQ0tfMjkpOworCQlBSERfU0VUX1NMRVdSQVRFKGFoZCwgQUhEX1NMRVdSQVRFX0RFRl9SRVZCKTsKKwkJQUhEX1NFVF9BTVBMSVRVREUoYWhkLCBBSERfQU1QTElUVURFX0RFRik7CisKKwkJLyoKKwkJICogU2V0IHRoZSBQUkVRRElTIGJpdCBmb3IgSDJCIHdoaWNoIGRpc2FibGVzIHNvbWUgd29ya2Fyb3VuZAorCQkgKiB0aGF0IGRvZXNuJ3Qgd29yayBvbiByZWd1bGFyIFBDSSBidXNzZXMuCisJCSAqIFhYWCAtIEZpbmQgb3V0IGV4YWN0bHkgd2hhdCB0aGlzIGRvZXMgZnJvbSB0aGUgaGFyZHdhcmUKKwkJICogCSBmb2xrcyEKKwkJICovCisJCWRldmNvbmZpZzEgPSBhaGRfcGNpX3JlYWRfY29uZmlnKHBjaSwgREVWQ09ORklHMSwgLypieXRlcyovMSk7CisJCWFoZF9wY2lfd3JpdGVfY29uZmlnKHBjaSwgREVWQ09ORklHMSwKKwkJCQkgICAgIGRldmNvbmZpZzF8UFJFUURJUywgLypieXRlcyovMSk7CisJCWRldmNvbmZpZzEgPSBhaGRfcGNpX3JlYWRfY29uZmlnKHBjaSwgREVWQ09ORklHMSwgLypieXRlcyovMSk7CisJfQorCisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcGNpLmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Y2ZlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBBZGFwdGVjIEFJQzc5eHggZGV2aWNlIGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkJAorICoKKyAqLworI2lmbmRlZiBfQUlDNzlYWF9QQ0lfSF8KKyNkZWZpbmUgX0FJQzc5WFhfUENJX0hfCisKKyNkZWZpbmUgSURfQUxMX01BU0sJCQkweEZGRkZGRkZGRkZGRkZGRkZ1bGwKKyNkZWZpbmUgSURfQUxMX0lST0NfTUFTSwkJMHhGRjdGRkZGRkZGRkZGRkZGdWxsCisjZGVmaW5lIElEX0RFVl9WRU5ET1JfTUFTSwkJMHhGRkZGRkZGRjAwMDAwMDAwdWxsCisjZGVmaW5lIElEXzkwMDVfR0VORVJJQ19NQVNLCQkweEZGRjBGRkZGMDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfOTAwNV9HRU5FUklDX0lST0NfTUFTSwkweEZGNzBGRkZGMDAwMDAwMDB1bGwKKworI2RlZmluZSBJRF9BSUM3OTAxCQkJMHg4MDBGOTAwNUZGRkY5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8yOTMyMEEJCQkweDgwMDA5MDA1MDA2MDkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzI5MzIwQUxQCQkJMHg4MDE3OTAwNTAwNDQ5MDA1dWxsCisKKyNkZWZpbmUgSURfQUlDNzkwMUEJCQkweDgwMUU5MDA1RkZGRjkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzI5MzIwCQkJMHg4MDEyOTAwNTAwNDI5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8yOTMyMEIJCQkweDgwMTM5MDA1MDA0MzkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzI5MzIwTFAJCQkweDgwMTQ5MDA1MDA0NDkwMDV1bGwKKworI2RlZmluZSBJRF9BSUM3OTAyCQkJMHg4MDFGOTAwNUZGRkY5MDA1dWxsCisjZGVmaW5lIElEX0FJQzc5MDJfQgkJCTB4ODAxRDkwMDVGRkZGOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMzkzMjAJCQkweDgwMTA5MDA1MDA0MDkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzM5MzIwX0IJCQkweDgwMTU5MDA1MDA0MDkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzM5MzIwQQkJCTB4ODAxNjkwMDUwMDQwOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMzkzMjBECQkJMHg4MDExOTAwNTAwNDE5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8zOTMyMERfQgkJCTB4ODAxQzkwMDUwMDQxOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMzkzMjBEX0hQCQkweDgwMTE5MDA1MDBBQzBFMTF1bGwKKyNkZWZpbmUgSURfQUhBXzM5MzIwRF9CX0hQCQkweDgwMUM5MDA1MDBBQzBFMTF1bGwKKworI2VuZGlmIC8qIF9BSUM3OVhYX1BDSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wcm9jLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDFjZDYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wcm9jLmMKQEAgLTAsMCArMSwzNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiBTdHJpbmcgaGFuZGxpbmcgY29kZSBjb3VydGVzeSBvZiBHZXJhcmQgUm91ZGllcidzIDxncm91ZGllckBjbHViLWludGVybmV0LmZyPgorICogc3ltIGRyaXZlci4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9saW51eC9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3Byb2MuYyMxOSAkCisgKi8KKyNpbmNsdWRlICJhaWM3OXh4X29zbS5oIgorI2luY2x1ZGUgImFpYzc5eHhfaW5saW5lLmgiCisKK3N0YXRpYyB2b2lkCWNvcHlfbWVtX2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBjaGFyICpkYXRhLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQJY29weV9pbmZvKHN0cnVjdCBpbmZvX3N0ciAqaW5mbywgY2hhciAqZm10LCAuLi4pOworc3RhdGljIHZvaWQJYWhkX2R1bXBfdGFyZ2V0X3N0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkgICAgICBzdHJ1Y3QgaW5mb19zdHIgKmluZm8sCisJCQkJICAgICAgdV9pbnQgb3VyX2lkLCBjaGFyIGNoYW5uZWwsCisJCQkJICAgICAgdV9pbnQgdGFyZ2V0X2lkLCB1X2ludCB0YXJnZXRfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkCWFoZF9kdW1wX2RldmljZV9zdGF0ZShzdHJ1Y3QgaW5mb19zdHIgKmluZm8sCisJCQkJICAgICAgc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CWFoZF9wcm9jX3dyaXRlX3NlZXByb20oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCSAgICAgICBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpOworCitzdGF0aWMgdm9pZAorY29weV9tZW1faW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJaWYgKGluZm8tPnBvcyArIGxlbiA+IGluZm8tPm9mZnNldCArIGluZm8tPmxlbmd0aCkKKwkJbGVuID0gaW5mby0+b2Zmc2V0ICsgaW5mby0+bGVuZ3RoIC0gaW5mby0+cG9zOworCisJaWYgKGluZm8tPnBvcyArIGxlbiA8IGluZm8tPm9mZnNldCkgeworCQlpbmZvLT5wb3MgKz0gbGVuOworCQlyZXR1cm47CisJfQorCisJaWYgKGluZm8tPnBvcyA8IGluZm8tPm9mZnNldCkgeworCQlvZmZfdCBwYXJ0aWFsOworCisJCXBhcnRpYWwgPSBpbmZvLT5vZmZzZXQgLSBpbmZvLT5wb3M7CisJCWRhdGEgKz0gcGFydGlhbDsKKwkJaW5mby0+cG9zICs9IHBhcnRpYWw7CisJCWxlbiAgLT0gcGFydGlhbDsKKwl9CisKKwlpZiAobGVuID4gMCkgeworCQltZW1jcHkoaW5mby0+YnVmZmVyLCBkYXRhLCBsZW4pOworCQlpbmZvLT5wb3MgKz0gbGVuOworCQlpbmZvLT5idWZmZXIgKz0gbGVuOworCX0KK30KKworc3RhdGljIGludAorY29weV9pbmZvKHN0cnVjdCBpbmZvX3N0ciAqaW5mbywgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWNoYXIgYnVmWzI1Nl07CisJaW50IGxlbjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbGVuID0gdnNwcmludGYoYnVmLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCWNvcHlfbWVtX2luZm8oaW5mbywgYnVmLCBsZW4pOworCXJldHVybiAobGVuKTsKK30KKwordm9pZAorYWhkX2Zvcm1hdF90cmFuc2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBzdHJ1Y3QgYWhkX3RyYW5zaW5mbyAqdGluZm8pCit7CisJdV9pbnQgc3BlZWQ7CisJdV9pbnQgZnJlcTsKKwl1X2ludCBtYjsKKworCWlmICh0aW5mby0+cGVyaW9kID09IEFIRF9QRVJJT0RfVU5LTk9XTikgeworCQljb3B5X2luZm8oaW5mbywgIlJlbmVnb3RpYXRpb24gUGVuZGluZ1xuIik7CisJCXJldHVybjsKKwl9CisgICAgICAgIHNwZWVkID0gMzMwMDsKKyAgICAgICAgZnJlcSA9IDA7CisJaWYgKHRpbmZvLT5vZmZzZXQgIT0gMCkgeworCQlmcmVxID0gYWljX2NhbGNfc3luY3NyYXRlKHRpbmZvLT5wZXJpb2QpOworCQlzcGVlZCA9IGZyZXE7CisJfQorCXNwZWVkICo9ICgweDAxIDw8IHRpbmZvLT53aWR0aCk7CisgICAgICAgIG1iID0gc3BlZWQgLyAxMDAwOworICAgICAgICBpZiAobWIgPiAwKQorCQljb3B5X2luZm8oaW5mbywgIiVkLiUwM2RNQi9zIHRyYW5zZmVycyIsIG1iLCBzcGVlZCAlIDEwMDApOworICAgICAgICBlbHNlCisJCWNvcHlfaW5mbyhpbmZvLCAiJWRLQi9zIHRyYW5zZmVycyIsIHNwZWVkKTsKKworCWlmIChmcmVxICE9IDApIHsKKwkJaW50CXByaW50ZWRfb3B0aW9uczsKKworCQlwcmludGVkX29wdGlvbnMgPSAwOworCQljb3B5X2luZm8oaW5mbywgIiAoJWQuJTAzZE1IeiIsIGZyZXEgLyAxMDAwLCBmcmVxICUgMTAwMCk7CisJCWlmICgodGluZm8tPnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfUkRfU1RSTSkgIT0gMCkgeworCQkJY29weV9pbmZvKGluZm8sICIgUkRTVFJNIik7CisJCQlwcmludGVkX29wdGlvbnMrKzsKKwkJfQorCQlpZiAoKHRpbmZvLT5wcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUSkgIT0gMCkgeworCQkJY29weV9pbmZvKGluZm8sICIlcyIsIHByaW50ZWRfb3B0aW9ucyA/ICJ8RFQiIDogIiBEVCIpOworCQkJcHJpbnRlZF9vcHRpb25zKys7CisJCX0KKwkJaWYgKCh0aW5mby0+cHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9JVV9SRVEpICE9IDApIHsKKwkJCWNvcHlfaW5mbyhpbmZvLCAiJXMiLCBwcmludGVkX29wdGlvbnMgPyAifElVIiA6ICIgSVUiKTsKKwkJCXByaW50ZWRfb3B0aW9ucysrOworCQl9CisJCWlmICgodGluZm8tPnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfUlRJKSAhPSAwKSB7CisJCQljb3B5X2luZm8oaW5mbywgIiVzIiwKKwkJCQkgIHByaW50ZWRfb3B0aW9ucyA/ICJ8UlRJIiA6ICIgUlRJIik7CisJCQlwcmludGVkX29wdGlvbnMrKzsKKwkJfQorCQlpZiAoKHRpbmZvLT5wcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX1FBU19SRVEpICE9IDApIHsKKwkJCWNvcHlfaW5mbyhpbmZvLCAiJXMiLAorCQkJCSAgcHJpbnRlZF9vcHRpb25zID8gInxRQVMiIDogIiBRQVMiKTsKKwkJCXByaW50ZWRfb3B0aW9ucysrOworCQl9CisJfQorCisJaWYgKHRpbmZvLT53aWR0aCA+IDApIHsKKwkJaWYgKGZyZXEgIT0gMCkgeworCQkJY29weV9pbmZvKGluZm8sICIsICIpOworCQl9IGVsc2UgeworCQkJY29weV9pbmZvKGluZm8sICIgKCIpOworCQl9CisJCWNvcHlfaW5mbyhpbmZvLCAiJWRiaXQpIiwgOCAqICgweDAxIDw8IHRpbmZvLT53aWR0aCkpOworCX0gZWxzZSBpZiAoZnJlcSAhPSAwKSB7CisJCWNvcHlfaW5mbyhpbmZvLCAiKSIpOworCX0KKwljb3B5X2luZm8oaW5mbywgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCithaGRfZHVtcF90YXJnZXRfc3RhdGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgaW5mb19zdHIgKmluZm8sCisJCSAgICAgIHVfaW50IG91cl9pZCwgY2hhciBjaGFubmVsLCB1X2ludCB0YXJnZXRfaWQsCisJCSAgICAgIHVfaW50IHRhcmdldF9vZmZzZXQpCit7CisJc3RydWN0CWFoZF9saW51eF90YXJnZXQgKnRhcmc7CisJc3RydWN0CWFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCXN0cnVjdAlhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJaW50CWx1bjsKKworCXRpbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsIGNoYW5uZWwsIG91cl9pZCwKKwkJCQkgICAgdGFyZ2V0X2lkLCAmdHN0YXRlKTsKKwljb3B5X2luZm8oaW5mbywgIlRhcmdldCAlZCBOZWdvdGlhdGlvbiBTZXR0aW5nc1xuIiwgdGFyZ2V0X2lkKTsKKwljb3B5X2luZm8oaW5mbywgIlx0VXNlcjogIik7CisJYWhkX2Zvcm1hdF90cmFuc2luZm8oaW5mbywgJnRpbmZvLT51c2VyKTsKKwl0YXJnID0gYWhkLT5wbGF0Zm9ybV9kYXRhLT50YXJnZXRzW3RhcmdldF9vZmZzZXRdOworCWlmICh0YXJnID09IE5VTEwpCisJCXJldHVybjsKKworCWNvcHlfaW5mbyhpbmZvLCAiXHRHb2FsOiAiKTsKKwlhaGRfZm9ybWF0X3RyYW5zaW5mbyhpbmZvLCAmdGluZm8tPmdvYWwpOworCWNvcHlfaW5mbyhpbmZvLCAiXHRDdXJyOiAiKTsKKwlhaGRfZm9ybWF0X3RyYW5zaW5mbyhpbmZvLCAmdGluZm8tPmN1cnIpOworCWNvcHlfaW5mbyhpbmZvLCAiXHRUcmFuc21pc3Npb24gRXJyb3JzICVsZFxuIiwgdGFyZy0+ZXJyb3JzX2RldGVjdGVkKTsKKworCWZvciAobHVuID0gMDsgbHVuIDwgQUhEX05VTV9MVU5TOyBsdW4rKykgeworCQlzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2OworCisJCWRldiA9IHRhcmctPmRldmljZXNbbHVuXTsKKworCQlpZiAoZGV2ID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlhaGRfZHVtcF9kZXZpY2Vfc3RhdGUoaW5mbywgZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCithaGRfZHVtcF9kZXZpY2Vfc3RhdGUoc3RydWN0IGluZm9fc3RyICppbmZvLCBzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2KQoreworCWNvcHlfaW5mbyhpbmZvLCAiXHRDaGFubmVsICVjIFRhcmdldCAlZCBMdW4gJWQgU2V0dGluZ3NcbiIsCisJCSAgZGV2LT50YXJnZXQtPmNoYW5uZWwgKyAnQScsIGRldi0+dGFyZ2V0LT50YXJnZXQsIGRldi0+bHVuKTsKKworCWNvcHlfaW5mbyhpbmZvLCAiXHRcdENvbW1hbmRzIFF1ZXVlZCAlbGRcbiIsIGRldi0+Y29tbWFuZHNfaXNzdWVkKTsKKwljb3B5X2luZm8oaW5mbywgIlx0XHRDb21tYW5kcyBBY3RpdmUgJWRcbiIsIGRldi0+YWN0aXZlKTsKKwljb3B5X2luZm8oaW5mbywgIlx0XHRDb21tYW5kIE9wZW5pbmdzICVkXG4iLCBkZXYtPm9wZW5pbmdzKTsKKwljb3B5X2luZm8oaW5mbywgIlx0XHRNYXggVGFnZ2VkIE9wZW5pbmdzICVkXG4iLCBkZXYtPm1heHRhZ3MpOworCWNvcHlfaW5mbyhpbmZvLCAiXHRcdERldmljZSBRdWV1ZSBGcm96ZW4gQ291bnQgJWRcbiIsIGRldi0+cWZyb3plbik7Cit9CisKK3N0YXRpYyBpbnQKK2FoZF9wcm9jX3dyaXRlX3NlZXByb20oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCit7CisJYWhkX21vZGVfc3RhdGUgc2F2ZWRfbW9kZXM7CisJaW50IGhhdmVfc2VlcHJvbTsKKwl1X2xvbmcgczsKKwlpbnQgcGF1c2VkOworCWludCB3cml0dGVuOworCisJLyogRGVmYXVsdCB0byBmYWlsdXJlLiAqLworCXdyaXR0ZW4gPSAtRUlOVkFMOworCWFoZF9sb2NrKGFoZCwgJnMpOworCXBhdXNlZCA9IGFoZF9pc19wYXVzZWQoYWhkKTsKKwlpZiAoIXBhdXNlZCkKKwkJYWhkX3BhdXNlKGFoZCk7CisKKwlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCWlmIChsZW5ndGggIT0gc2l6ZW9mKHN0cnVjdCBzZWVwcm9tX2NvbmZpZykpIHsKKwkJcHJpbnRmKCJhaGRfcHJvY193cml0ZV9zZWVwcm9tOiBpbmNvcnJlY3QgYnVmZmVyIHNpemVcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJaGF2ZV9zZWVwcm9tID0gYWhkX3ZlcmlmeV9ja3N1bSgoc3RydWN0IHNlZXByb21fY29uZmlnKilidWZmZXIpOworCWlmIChoYXZlX3NlZXByb20gPT0gMCkgeworCQlwcmludGYoImFoZF9wcm9jX3dyaXRlX3NlZXByb206IGNrc3VtIHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJaGF2ZV9zZWVwcm9tID0gYWhkX2FjcXVpcmVfc2VlcHJvbShhaGQpOworCWlmICghaGF2ZV9zZWVwcm9tKSB7CisJCXByaW50ZigiYWhkX3Byb2Nfd3JpdGVfc2VlcHJvbTogTm8gU2VyaWFsIEVFUFJPTVxuIik7CisJCWdvdG8gZG9uZTsKKwl9IGVsc2UgeworCQl1X2ludCBzdGFydF9hZGRyOworCisJCWlmIChhaGQtPnNlZXBfY29uZmlnID09IE5VTEwpIHsKKwkJCWFoZC0+c2VlcF9jb25maWcgPSBtYWxsb2Moc2l6ZW9mKCphaGQtPnNlZXBfY29uZmlnKSwKKwkJCQkJCSAgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwkJCWlmIChhaGQtPnNlZXBfY29uZmlnID09IE5VTEwpIHsKKwkJCQlwcmludGYoImFpYzc5eHg6IFVuYWJsZSB0byBhbGxvY2F0ZSBzZXJpYWwgIgorCQkJCSAgICAgICAiZWVwcm9tIGJ1ZmZlci4gIFdyaXRlIGZhaWxpbmdcbiIpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCQlwcmludGYoImFpYzc5eHg6IFdyaXRpbmcgU2VyaWFsIEVFUFJPTVxuIik7CisJCXN0YXJ0X2FkZHIgPSAzMiAqIChhaGQtPmNoYW5uZWwgLSAnQScpOworCQlhaGRfd3JpdGVfc2VlcHJvbShhaGQsICh1X2ludDE2X3QgKilidWZmZXIsIHN0YXJ0X2FkZHIsCisJCQkJICBzaXplb2Yoc3RydWN0IHNlZXByb21fY29uZmlnKS8yKTsKKwkJYWhkX3JlYWRfc2VlcHJvbShhaGQsICh1aW50MTZfdCAqKWFoZC0+c2VlcF9jb25maWcsCisJCQkJIHN0YXJ0X2FkZHIsIHNpemVvZihzdHJ1Y3Qgc2VlcHJvbV9jb25maWcpLzIsCisJCQkJIC8qQnl0ZVN0cmVhbSovRkFMU0UpOworCQlhaGRfcmVsZWFzZV9zZWVwcm9tKGFoZCk7CisJCXdyaXR0ZW4gPSBsZW5ndGg7CisJfQorCitkb25lOgorCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOworCWlmICghcGF1c2VkKQorCQlhaGRfdW5wYXVzZShhaGQpOworCWFoZF91bmxvY2soYWhkLCAmcyk7CisJcmV0dXJuICh3cml0dGVuKTsKK30KKy8qCisgKiBSZXR1cm4gaW5mb3JtYXRpb24gdG8gaGFuZGxlIC9wcm9jIHN1cHBvcnQgZm9yIHRoZSBkcml2ZXIuCisgKi8KK2ludAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorYWhkX2xpbnV4X3Byb2NfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkgICAgaW50IGxlbmd0aCwgaW50IGhvc3RubywgaW50IGlub3V0KQorI2Vsc2UKK2FoZF9saW51eF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LAorCQkgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCisjZW5kaWYKK3sKKwlzdHJ1Y3QJYWhkX3NvZnRjICphaGQ7CisJc3RydWN0CWluZm9fc3RyIGluZm87CisJY2hhcglhaGRfaW5mb1syNTZdOworCXVfbG9uZwlsOworCXVfaW50CW1heF90YXJnOworCXVfaW50CWk7CisJaW50CXJldHZhbDsKKworCXJldHZhbCA9IC1FSU5WQUw7CisJYWhkX2xpc3RfbG9jaygmbCk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJVEFJTFFfRk9SRUFDSChhaGQsICZhaGRfdGFpbHEsIGxpbmtzKSB7CisJCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QtPmhvc3Rfbm8gPT0gaG9zdG5vKQorCQkJYnJlYWs7CisJfQorI2Vsc2UKKwlhaGQgPSBhaGRfZmluZF9zb2Z0YygqKHN0cnVjdCBhaGRfc29mdGMgKiopc2hvc3QtPmhvc3RkYXRhKTsKKyNlbmRpZgorCisJaWYgKGFoZCA9PSBOVUxMKQorCQlnb3RvIGRvbmU7CisKKwkgLyogSGFzIGRhdGEgYmVlbiB3cml0dGVuIHRvIHRoZSBmaWxlPyAqLyAKKwlpZiAoaW5vdXQgPT0gVFJVRSkgeworCQlyZXR2YWwgPSBhaGRfcHJvY193cml0ZV9zZWVwcm9tKGFoZCwgYnVmZmVyLCBsZW5ndGgpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHN0YXJ0KQorCQkqc3RhcnQgPSBidWZmZXI7CisKKwlpbmZvLmJ1ZmZlcgk9IGJ1ZmZlcjsKKwlpbmZvLmxlbmd0aAk9IGxlbmd0aDsKKwlpbmZvLm9mZnNldAk9IG9mZnNldDsKKwlpbmZvLnBvcwk9IDA7CisKKwljb3B5X2luZm8oJmluZm8sICJBZGFwdGVjIEFJQzc5eHggZHJpdmVyIHZlcnNpb246ICVzXG4iLAorCQkgIEFJQzc5WFhfRFJJVkVSX1ZFUlNJT04pOworCWNvcHlfaW5mbygmaW5mbywgIiVzXG4iLCBhaGQtPmRlc2NyaXB0aW9uKTsKKwlhaGRfY29udHJvbGxlcl9pbmZvKGFoZCwgYWhkX2luZm8pOworCWNvcHlfaW5mbygmaW5mbywgIiVzXG4iLCBhaGRfaW5mbyk7CisJY29weV9pbmZvKCZpbmZvLCAiQWxsb2NhdGVkIFNDQnM6ICVkLCBTRyBMaXN0IExlbmd0aDogJWRcblxuIiwKKwkJICBhaGQtPnNjYl9kYXRhLm51bXNjYnMsIEFIRF9OU0VHKTsKKworCW1heF90YXJnID0gMTU7CisKKwlpZiAoYWhkLT5zZWVwX2NvbmZpZyA9PSBOVUxMKQorCQljb3B5X2luZm8oJmluZm8sICJObyBTZXJpYWwgRUVQUk9NXG4iKTsKKwllbHNlIHsKKwkJY29weV9pbmZvKCZpbmZvLCAiU2VyaWFsIEVFUFJPTTpcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKCphaGQtPnNlZXBfY29uZmlnKS8yOyBpKyspIHsKKwkJCWlmICgoKGkgJSA4KSA9PSAwKSAmJiAoaSAhPSAwKSkgeworCQkJCWNvcHlfaW5mbygmaW5mbywgIlxuIik7CisJCQl9CisJCQljb3B5X2luZm8oJmluZm8sICIweCUuNHggIiwKKwkJCQkgICgodWludDE2X3QqKWFoZC0+c2VlcF9jb25maWcpW2ldKTsKKwkJfQorCQljb3B5X2luZm8oJmluZm8sICJcbiIpOworCX0KKwljb3B5X2luZm8oJmluZm8sICJcbiIpOworCisJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX1dJREUpID09IDApCisJCW1heF90YXJnID0gNzsKKworCWZvciAoaSA9IDA7IGkgPD0gbWF4X3Rhcmc7IGkrKykgeworCisJCWFoZF9kdW1wX3RhcmdldF9zdGF0ZShhaGQsICZpbmZvLCBhaGQtPm91cl9pZCwgJ0EnLAorCQkJCSAgICAgIC8qdGFyZ2V0X2lkKi9pLCAvKnRhcmdldF9vZmZzZXQqL2kpOworCX0KKwlyZXR2YWwgPSBpbmZvLnBvcyA+IGluZm8ub2Zmc2V0ID8gaW5mby5wb3MgLSBpbmZvLm9mZnNldCA6IDA7Citkb25lOgorCWFoZF9saXN0X3VubG9jaygmbCk7CisJcmV0dXJuIChyZXR2YWwpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9yZWcuaF9zaGlwcGVkIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9yZWcuaF9zaGlwcGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMWFjMzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3JlZy5oX3NoaXBwZWQKQEAgLTAsMCArMSwzNzc2IEBACisvKgorICogRE8gTk9UIEVESVQgLSBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKyAqCQkgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZSBmaWxlczoKKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHguc2VxIzk0ICQKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5yZWcjNzAgJAorICovCit0eXBlZGVmIGludCAoYWhkX3JlZ19wcmludF90KSh1X2ludCwgdV9pbnQgKiwgdV9pbnQpOwordHlwZWRlZiBzdHJ1Y3QgYWhkX3JlZ19wYXJzZV9lbnRyeSB7CisJY2hhcgkqbmFtZTsKKwl1aW50OF90CSB2YWx1ZTsKKwl1aW50OF90CSBtYXNrOworfSBhaGRfcmVnX3BhcnNlX2VudHJ5X3Q7CisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX21vZGVfcHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX21vZGVfcHRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJNT0RFX1BUUiIsIDB4MDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ludHN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfaW50c3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UU1RBVCIsIDB4MDEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlcWludGNvZGVfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2VxaW50Y29kZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VRSU5UQ09ERSIsIDB4MDIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscmludF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbHJpbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNMUklOVCIsIDB4MDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Vycm9yX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Vycm9yX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJFUlJPUiIsIDB4MDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscmVycl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbHJlcnJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNMUkVSUiIsIDB4MDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2hjbnRybF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9oY250cmxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkhDTlRSTCIsIDB4MDUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2huc2NiX3FvZmZfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfaG5zY2JfcW9mZl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSE5TQ0JfUU9GRiIsIDB4MDYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2hlc2NiX3FvZmZfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfaGVzY2JfcW9mZl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSEVTQ0JfUU9GRiIsIDB4MDgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2hzX21haWxib3hfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfaHNfbWFpbGJveF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSFNfTUFJTEJPWCIsIDB4MGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscnNlcWludHN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY2xyc2VxaW50c3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0xSU0VRSU5UU1RBVCIsIDB4MGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlcWludHN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2VxaW50c3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VRSU5UU1RBVCIsIDB4MGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3N3dGltZXJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc3d0aW1lcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU1dUSU1FUiIsIDB4MGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nuc2NiX3FvZmZfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc25zY2JfcW9mZl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU05TQ0JfUU9GRiIsIDB4MTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nlc2NiX3FvZmZfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2VzY2JfcW9mZl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VTQ0JfUU9GRiIsIDB4MTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nkc2NiX3FvZmZfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2RzY2JfcW9mZl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0RTQ0JfUU9GRiIsIDB4MTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3FvZmZfY3Rsc3RhX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3FvZmZfY3Rsc3RhX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRT0ZGX0NUTFNUQSIsIDB4MTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ludGN0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9pbnRjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVENUTCIsIDB4MTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmY250cmxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGZjbnRybF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZDTlRSTCIsIDB4MTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RzY29tbWFuZDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZHNjb21tYW5kMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRFNDT01NQU5EMCIsIDB4MTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Rmc3RhdHVzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Rmc3RhdHVzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERlNUQVRVUyIsIDB4MWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NnX2NhY2hlX3NoYWRvd19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZ19jYWNoZV9zaGFkb3dfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHX0NBQ0hFX1NIQURPVyIsIDB4MWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2FyYmN0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9hcmJjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFSQkNUTCIsIDB4MWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NnX2NhY2hlX3ByZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZ19jYWNoZV9wcmVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHX0NBQ0hFX1BSRSIsIDB4MWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxaW5fcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbHFpbl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTFFJTiIsIDB4MjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3R5cGVwdHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfdHlwZXB0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiVFlQRVBUUiIsIDB4MjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3RhZ3B0cl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF90YWdwdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlRBR1BUUiIsIDB4MjEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2x1bnB0cl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9sdW5wdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxVTlBUUiIsIDB4MjIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RhdGFsZW5wdHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGF0YWxlbnB0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREFUQUxFTlBUUiIsIDB4MjMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3N0YXRsZW5wdHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc3RhdGxlbnB0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU1RBVExFTlBUUiIsIDB4MjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtZGxlbnB0cl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWRsZW5wdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNRExFTlBUUiIsIDB4MjUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2F0dHJwdHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfYXR0cnB0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQVRUUlBUUiIsIDB4MjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ZsYWdwdHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZmxhZ3B0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRkxBR1BUUiIsIDB4MjcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtZHB0cl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWRwdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNRFBUUiIsIDB4MjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3FuZXh0cHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3FuZXh0cHRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRTkVYVFBUUiIsIDB4MjksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2lkcHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2lkcHRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJRFBUUiIsIDB4MmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2FicnRieXRlcHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2FicnRieXRlcHRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBQlJUQllURVBUUiIsIDB4MmIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2FicnRiaXRwdHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfYWJydGJpdHB0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQUJSVEJJVFBUUiIsIDB4MmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX21heGNtZGJ5dGVzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX21heGNtZGJ5dGVzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJNQVhDTURCWVRFUyIsIDB4MmQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX21heGNtZDJyY3ZfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbWF4Y21kMnJjdl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTUFYQ01EMlJDViIsIDB4MmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nob3J0dGhyZXNoX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Nob3J0dGhyZXNoX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTSE9SVFRIUkVTSCIsIDB4MmYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2x1bmxlbl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9sdW5sZW5fcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxVTkxFTiIsIDB4MzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NkYmxpbWl0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NkYmxpbWl0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDREJMSU1JVCIsIDB4MzEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX21heGNtZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9tYXhjbWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk1BWENNRCIsIDB4MzIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX21heGNtZGNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9tYXhjbWRjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk1BWENNRENOVCIsIDB4MzMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxcnN2ZDAxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxcnN2ZDAxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUVJTVkQwMSIsIDB4MzQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxcnN2ZDE2X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxcnN2ZDE2X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUVJTVkQxNiIsIDB4MzUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxcnN2ZDE3X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxcnN2ZDE3X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUVJTVkQxNyIsIDB4MzYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtZHJzdmQwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NtZHJzdmQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTURSU1ZEMCIsIDB4MzcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxY3RsMF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9scWN0bDBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxRQ1RMMCIsIDB4MzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxY3RsMV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9scWN0bDFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxRQ1RMMSIsIDB4MzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2Jpc3QwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Njc2Jpc3QwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NCSVNUMCIsIDB4MzksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxY3RsMl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9scWN0bDJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxRQ1RMMiIsIDB4MzksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2Jpc3QxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Njc2Jpc3QxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NCSVNUMSIsIDB4M2EsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2lzZXEwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Njc2lzZXEwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJU0VRMCIsIDB4M2EsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2lzZXExX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Njc2lzZXExX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJU0VRMSIsIDB4M2IsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3N4ZnJjdGwwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3N4ZnJjdGwwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTWEZSQ1RMMCIsIDB4M2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2J1c2luaXRpZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9idXNpbml0aWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJVU0lOSVRJRCIsIDB4M2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RsY291bnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGxjb3VudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRExDT1VOVCIsIDB4M2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3N4ZnJjdGwxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3N4ZnJjdGwxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTWEZSQ1RMMSIsIDB4M2QsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2J1c3RhcmdpZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9idXN0YXJnaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJVU1RBUkdJRCIsIDB4M2UsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3N4ZnJjdGwyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3N4ZnJjdGwyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTWEZSQ1RMMiIsIDB4M2UsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmZnN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGZmc3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZGU1RBVCIsIDB4M2YsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2lzaWdvX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Njc2lzaWdvX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJU0lHTyIsIDB4NDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX211bHRhcmdpZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9tdWx0YXJnaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk1VTFRBUkdJRCIsIDB4NDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2lzaWdpX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Njc2lzaWdpX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJU0lHSSIsIDB4NDEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2lwaGFzZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY3NpcGhhc2VfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lQSEFTRSIsIDB4NDIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2lkYXQwX2ltZ19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY3NpZGF0MF9pbWdfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lEQVQwX0lNRyIsIDB4NDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2lkYXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2NzaWRhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NTSURBVCIsIDB4NDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2lidXNfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2NzaWJ1c19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NTSUJVUyIsIDB4NDYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3RhcmdpZGluX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3RhcmdpZGluX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJUQVJHSURJTiIsIDB4NDgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlbGlkX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NlbGlkX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRUxJRCIsIDB4NDksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NibGtjdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2Jsa2N0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0JMS0NUTCIsIDB4NGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX29wdGlvbm1vZGVfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfb3B0aW9ubW9kZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1BUSU9OTU9ERSIsIDB4NGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NzdGF0MF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zc3RhdDBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNTVEFUMCIsIDB4NGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscnNpbnQwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NscnNpbnQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTFJTSU5UMCIsIDB4NGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NpbW9kZTBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2ltb2RlMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0lNT0RFMCIsIDB4NGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscnNpbnQxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NscnNpbnQxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTFJTSU5UMSIsIDB4NGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NzdGF0MV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zc3RhdDFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNTVEFUMSIsIDB4NGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NzdGF0Ml9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zc3RhdDJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNTVEFUMiIsIDB4NGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscnNpbnQyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NscnNpbnQyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTFJTSU5UMiIsIDB4NGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NpbW9kZTJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2ltb2RlMl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0lNT0RFMiIsIDB4NGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BlcnJkaWFnX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3BlcnJkaWFnX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJQRVJSRElBRyIsIDB4NGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxaXN0YXRlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxaXN0YXRlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUUlTVEFURSIsIDB4NGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NvZmZjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc29mZmNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU09GRkNOVCIsIDB4NGYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxb3N0YXRlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxb3N0YXRlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUU9TVEFURSIsIDB4NGYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxaXN0YXQwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxaXN0YXQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUUlTVEFUMCIsIDB4NTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscmxxaWludDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY2xybHFpaW50MF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0xSTFFJSU5UMCIsIDB4NTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxaW1vZGUwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxaW1vZGUwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUUlNT0RFMCIsIDB4NTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxaW1vZGUxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxaW1vZGUxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUUlNT0RFMSIsIDB4NTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxaXN0YXQxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxaXN0YXQxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUUlTVEFUMSIsIDB4NTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscmxxaWludDFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY2xybHFpaW50MV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0xSTFFJSU5UMSIsIDB4NTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxaXN0YXQyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxaXN0YXQyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUUlTVEFUMiIsIDB4NTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NzdGF0M19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zc3RhdDNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNTVEFUMyIsIDB4NTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NpbW9kZTNfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2ltb2RlM19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0lNT0RFMyIsIDB4NTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscnNpbnQzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NscnNpbnQzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTFJTSU5UMyIsIDB4NTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxb21vZGUwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxb21vZGUwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUU9NT0RFMCIsIDB4NTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxb3N0YXQwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxb3N0YXQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUU9TVEFUMCIsIDB4NTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Nscmxxb2ludDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY2xybHFvaW50MF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0xSTFFPSU5UMCIsIDB4NTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxb3N0YXQxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxb3N0YXQxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUU9TVEFUMSIsIDB4NTUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Nscmxxb2ludDFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY2xybHFvaW50MV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0xSTFFPSU5UMSIsIDB4NTUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxb21vZGUxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxb21vZGUxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUU9NT0RFMSIsIDB4NTUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxb3N0YXQyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxb3N0YXQyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUU9TVEFUMiIsIDB4NTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX29zX3NwYWNlX2NudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9vc19zcGFjZV9jbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk9TX1NQQUNFX0NOVCIsIDB4NTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NpbW9kZTFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2ltb2RlMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0lNT0RFMSIsIDB4NTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2dzZmlmb19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9nc2ZpZm9fcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkdTRklGTyIsIDB4NTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmZnN4ZnJjdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGZmc3hmcmN0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZGU1hGUkNUTCIsIDB4NWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxb3Njc2N0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9scW9zY3NjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxRT1NDU0NUTCIsIDB4NWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX25leHRzY2JfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbmV4dHNjYl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTkVYVFNDQiIsIDB4NWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscnNlcWludHNyY19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbHJzZXFpbnRzcmNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNMUlNFUUlOVFNSQyIsIDB4NWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlcWludHNyY19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZXFpbnRzcmNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFUUlOVFNSQyIsIDB4NWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2N1cnJzY2JfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY3VycnNjYl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ1VSUlNDQiIsIDB4NWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlcWltb2RlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NlcWltb2RlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRVFJTU9ERSIsIDB4NWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX21kZmZzdGF0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX21kZmZzdGF0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJNREZGU1RBVCIsIDB4NWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NyY2NvbnRyb2xfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY3JjY29udHJvbF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ1JDQ09OVFJPTCIsIDB4NWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmZnRhZ19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kZmZ0YWdfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGRlRBRyIsIDB4NWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xhc3RzY2JfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbGFzdHNjYl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTEFTVFNDQiIsIDB4NWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2l0ZXN0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Njc2l0ZXN0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJVEVTVCIsIDB4NWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2lvcGRuY3RsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2lvcGRuY3RsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJT1BETkNUTCIsIDB4NWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NoYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zaGFkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNIQUREUiIsIDB4NjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX25lZ29hZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX25lZ29hZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJORUdPQUREUiIsIDB4NjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RncnBjcmNpX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2RncnBjcmNpX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJER1JQQ1JDSSIsIDB4NjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX25lZ3BlcmlvZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9uZWdwZXJpb2RfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk5FR1BFUklPRCIsIDB4NjEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BhY2tjcmNpX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3BhY2tjcmNpX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJQQUNLQ1JDSSIsIDB4NjIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX25lZ29mZnNldF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9uZWdvZmZzZXRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk5FR09GRlNFVCIsIDB4NjIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX25lZ3Bwcm9wdHNfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbmVncHByb3B0c19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTkVHUFBST1BUUyIsIDB4NjMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX25lZ2Nvbm9wdHNfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbmVnY29ub3B0c19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTkVHQ09OT1BUUyIsIDB4NjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2FubmV4Y29sX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2FubmV4Y29sX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBTk5FWENPTCIsIDB4NjUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2Noa25fcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2NzY2hrbl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NTQ0hLTiIsIDB4NjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2FubmV4ZGF0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2FubmV4ZGF0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBTk5FWERBVCIsIDB4NjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2lvd25pZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9pb3duaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklPV05JRCIsIDB4NjcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BsbDk2MGN0bDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcGxsOTYwY3RsMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUExMOTYwQ1RMMCIsIDB4NjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NoY250X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NoY250X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTSENOVCIsIDB4NjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Rvd25pZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF90b3duaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlRPV05JRCIsIDB4NjksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BsbDk2MGN0bDFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcGxsOTYwY3RsMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUExMOTYwQ1RMMSIsIDB4NjksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BsbDk2MGNudDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcGxsOTYwY250MF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUExMOTYwQ05UMCIsIDB4NmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3hzaWdfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfeHNpZ19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiWFNJRyIsIDB4NmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlbG9pZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZWxvaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFTE9JRCIsIDB4NmIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BsbDQwMGN0bDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcGxsNDAwY3RsMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUExMNDAwQ1RMMCIsIDB4NmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ZhaXJuZXNzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2ZhaXJuZXNzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJGQUlSTkVTUyIsIDB4NmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BsbDQwMGN0bDFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcGxsNDAwY3RsMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUExMNDAwQ1RMMSIsIDB4NmQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BsbDQwMGNudDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcGxsNDAwY250MF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUExMNDAwQ05UMCIsIDB4NmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3VuZmFpcm5lc3NfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfdW5mYWlybmVzc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiVU5GQUlSTkVTUyIsIDB4NmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2hhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2hhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIQUREUiIsIDB4NzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BsbGRlbGF5X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3BsbGRlbGF5X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJQTExERUxBWSIsIDB4NzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2hvZG1hYWRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2hvZG1hYWRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIT0RNQUFEUiIsIDB4NzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2hvZG1hY250X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2hvZG1hY250X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIT0RNQUNOVCIsIDB4NzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2hjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfaGNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSENOVCIsIDB4NzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2hvZG1hZW5fcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfaG9kbWFlbl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSE9ETUFFTiIsIDB4N2EsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NnaGFkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2doYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0dIQUREUiIsIDB4N2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYmhhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYmhhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JIQUREUiIsIDB4N2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NnaGNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZ2hjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHSENOVCIsIDB4ODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYmhjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2NiaGNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCSENOVCIsIDB4ODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmZl90aHJzaF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kZmZfdGhyc2hfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGRl9USFJTSCIsIDB4ODgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3JvbWFkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcm9tYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUk9NQUREUiIsIDB4OGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3JvbWNudHJsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3JvbWNudHJsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJST01DTlRSTCIsIDB4OGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3JvbWRhdGFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcm9tZGF0YV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUk9NREFUQSIsIDB4OGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtY3J4bXNnMF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWNyeG1zZzBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNQ1JYTVNHMCIsIDB4OTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3JvZW5hYmxlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3JvZW5hYmxlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJST0VOQUJMRSIsIDB4OTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX292bHlyeG1zZzBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfb3ZseXJ4bXNnMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1ZMWVJYTVNHMCIsIDB4OTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RjaHJ4bXNnMF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kY2hyeG1zZzBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRDSFJYTVNHMCIsIDB4OTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX292bHlyeG1zZzFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfb3ZseXJ4bXNnMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1ZMWVJYTVNHMSIsIDB4OTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX25zZW5hYmxlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX25zZW5hYmxlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJOU0VOQUJMRSIsIDB4OTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RjaHJ4bXNnMV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kY2hyeG1zZzFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRDSFJYTVNHMSIsIDB4OTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtY3J4bXNnMV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWNyeG1zZzFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNQ1JYTVNHMSIsIDB4OTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RjaHJ4bXNnMl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kY2hyeG1zZzJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRDSFJYTVNHMiIsIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX292bHlyeG1zZzJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfb3ZseXJ4bXNnMl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1ZMWVJYTVNHMiIsIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtY3J4bXNnMl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWNyeG1zZzJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNQ1JYTVNHMiIsIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX29zdF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9vc3RfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk9TVCIsIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RjaHJ4bXNnM19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kY2hyeG1zZzNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRDSFJYTVNHMyIsIDB4OTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtY3J4bXNnM19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWNyeG1zZzNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNQ1JYTVNHMyIsIDB4OTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BjaXhjdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcGNpeGN0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUENJWENUTCIsIDB4OTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX292bHlyeG1zZzNfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfb3ZseXJ4bXNnM19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1ZMWVJYTVNHMyIsIDB4OTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX292bHlzZXFiY250X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX292bHlzZXFiY250X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJPVkxZU0VRQkNOVCIsIDB4OTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtY3NlcWJjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY21jc2VxYmNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01DU0VRQkNOVCIsIDB4OTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RjaHNlcWJjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGNoc2VxYmNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRENIU0VRQkNOVCIsIDB4OTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtY3NwbHRzdGF0MF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWNzcGx0c3RhdDBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNQ1NQTFRTVEFUMCIsIDB4OTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX292bHlzcGx0c3RhdDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfb3ZseXNwbHRzdGF0MF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1ZMWVNQTFRTVEFUMCIsIDB4OTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RjaHNwbHRzdGF0MF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kY2hzcGx0c3RhdDBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRDSFNQTFRTVEFUMCIsIDB4OTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RjaHNwbHRzdGF0MV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kY2hzcGx0c3RhdDFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRDSFNQTFRTVEFUMSIsIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtY3NwbHRzdGF0MV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWNzcGx0c3RhdDFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNQ1NQTFRTVEFUMSIsIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX292bHlzcGx0c3RhdDFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfb3ZseXNwbHRzdGF0MV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1ZMWVNQTFRTVEFUMSIsIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nncnhtc2cwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Nncnhtc2cwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR1JYTVNHMCIsIDB4OTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NsdnNwbHRvdXRhZHIwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NsdnNwbHRvdXRhZHIwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTTFZTUExUT1VUQURSMCIsIDB4OTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nncnhtc2cxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Nncnhtc2cxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR1JYTVNHMSIsIDB4OTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NsdnNwbHRvdXRhZHIxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NsdnNwbHRvdXRhZHIxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTTFZTUExUT1VUQURSMSIsIDB4OTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nncnhtc2cyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Nncnhtc2cyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR1JYTVNHMiIsIDB4OWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NsdnNwbHRvdXRhZHIyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NsdnNwbHRvdXRhZHIyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTTFZTUExUT1VUQURSMiIsIDB4OWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nncnhtc2czX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Nncnhtc2czX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR1JYTVNHMyIsIDB4OWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NsdnNwbHRvdXRhZHIzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NsdnNwbHRvdXRhZHIzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTTFZTUExUT1VUQURSMyIsIDB4OWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nnc2VxYmNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZ3NlcWJjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHU0VRQkNOVCIsIDB4OWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NsdnNwbHRvdXRhdHRyMF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zbHZzcGx0b3V0YXR0cjBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNMVlNQTFRPVVRBVFRSMCIsIDB4OWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NsdnNwbHRvdXRhdHRyMV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zbHZzcGx0b3V0YXR0cjFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNMVlNQTFRPVVRBVFRSMSIsIDB4OWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NsdnNwbHRvdXRhdHRyMl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zbHZzcGx0b3V0YXR0cjJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNMVlNQTFRPVVRBVFRSMiIsIDB4OWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nnc3BsdHN0YXQwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Nnc3BsdHN0YXQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR1NQTFRTVEFUMCIsIDB4OWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NmdW5jdF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZnVuY3RfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNGVU5DVCIsIDB4OWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nnc3BsdHN0YXQxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Nnc3BsdHN0YXQxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR1NQTFRTVEFUMSIsIDB4OWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmMHBjaXN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGYwcGNpc3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREYwUENJU1RBVCIsIDB4YTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3JlZzBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcmVnMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUkVHMCIsIDB4YTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmMXBjaXN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGYxcGNpc3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREYxUENJU1RBVCIsIDB4YTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NncGNpc3RhdF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZ3BjaXN0YXRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHUENJU1RBVCIsIDB4YTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3JlZzFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcmVnMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUkVHMSIsIDB4YTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtY3BjaXN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY21jcGNpc3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01DUENJU1RBVCIsIDB4YTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX292bHlwY2lzdGF0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX292bHlwY2lzdGF0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJPVkxZUENJU1RBVCIsIDB4YTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3JlZ19pc3JfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcmVnX2lzcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUkVHX0lTUiIsIDB4YTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NnX3N0YXRlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NnX3N0YXRlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR19TVEFURSIsIDB4YTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX21zaXBjaXN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbXNpcGNpc3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTVNJUENJU1RBVCIsIDB4YTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3RhcmdwY2lzdGF0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3RhcmdwY2lzdGF0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJUQVJHUENJU1RBVCIsIDB4YTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RhdGFfY291bnRfb2RkX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2RhdGFfY291bnRfb2RkX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJEQVRBX0NPVU5UX09ERCIsIDB4YTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYnB0cl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JwdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQlBUUiIsIDB4YTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Njc2NiYWNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jY3NjYmFjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0NCQUNOVCIsIDB4YWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYmF1dG9wdHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2NiYXV0b3B0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCQVVUT1BUUiIsIDB4YWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Njc2dhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Njc2dhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NHQUREUiIsIDB4YWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Njc2NiYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jY3NjYmFkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0NCQUREUiIsIDB4YWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Njc2NiYWRyX2JrX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Njc2NiYWRyX2JrX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQkFEUl9CSyIsIDB4YWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtY19yYW1iaXN0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NtY19yYW1iaXN0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTUNfUkFNQklTVCIsIDB4YWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Njc2djdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY2NzZ2N0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTR0NUTCIsIDB4YWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Njc2NiY3RsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Njc2NiY3RsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQkNUTCIsIDB4YWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Njc2dyYW1fcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY2NzZ3JhbV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTR1JBTSIsIDB4YjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ZsZXhhZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZmxleGFkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRkxFWEFEUiIsIDB4YjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Njc2NicmFtX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Njc2NicmFtX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQlJBTSIsIDB4YjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ZsZXhjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZmxleGNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRkxFWENOVCIsIDB4YjMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ZsZXhkbWFzdGF0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2ZsZXhkbWFzdGF0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJGTEVYRE1BU1RBVCIsIDB4YjUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ZsZXhkYXRhX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2ZsZXhkYXRhX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJGTEVYREFUQSIsIDB4YjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2JyZGRhdF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9icmRkYXRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJSRERBVCIsIDB4YjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2JyZGN0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9icmRjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJSRENUTCIsIDB4YjksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlZWFkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZWVhZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFRUFEUiIsIDB4YmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlZWRhdF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZWVkYXRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFRURBVCIsIDB4YmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlZWN0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZWVjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFRUNUTCIsIDB4YmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlZXN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2Vlc3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VFU1RBVCIsIDB4YmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYmNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQkNOVCIsIDB4YmYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Rmd2FkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGZ3YWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZXQUREUiIsIDB4YzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RzcGZsdHJjdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZHNwZmx0cmN0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRFNQRkxUUkNUTCIsIDB4YzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RzcGRhdGFjdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZHNwZGF0YWN0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRFNQREFUQUNUTCIsIDB4YzEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmcmFkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGZyYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZSQUREUiIsIDB4YzIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RzcHJlcWN0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kc3ByZXFjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRTUFJFUUNUTCIsIDB4YzIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RzcGFja2N0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kc3BhY2tjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRTUEFDS0NUTCIsIDB4YzMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmZGF0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2RmZGF0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERkRBVCIsIDB4YzQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RzcHNlbGVjdF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kc3BzZWxlY3RfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRTUFNFTEVDVCIsIDB4YzQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3dydGJpYXNjdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfd3J0Ymlhc2N0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiV1JUQklBU0NUTCIsIDB4YzUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3JjdnJiaW9zY3RsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3JjdnJiaW9zY3RsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJSQ1ZSQklPU0NUTCIsIDB4YzYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3dydGJpYXNjYWxjX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3dydGJpYXNjYWxjX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJXUlRCSUFTQ0FMQyIsIDB4YzcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmcHRyc19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kZnB0cnNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGUFRSUyIsIDB4YzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3JjdnJiaWFzY2FsY19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9yY3ZyYmlhc2NhbGNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlJDVlJCSUFTQ0FMQyIsIDB4YzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmYmtwdHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGZia3B0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZCS1BUUiIsIDB4YzksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NrZXdjYWxjX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NrZXdjYWxjX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTS0VXQ0FMQyIsIDB4YzksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmZGJjdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGZkYmN0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZEQkNUTCIsIDB4Y2IsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Rmc2NudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kZnNjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGU0NOVCIsIDB4Y2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmYmNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kZmJjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGQkNOVCIsIDB4Y2UsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX292bHlhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX292bHlhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJPVkxZQUREUiIsIDB4ZDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlcWN0bDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2VxY3RsMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VRQ1RMMCIsIDB4ZDYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlcWN0bDFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2VxY3RsMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VRQ1RMMSIsIDB4ZDcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ZsYWdzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2ZsYWdzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJGTEFHUyIsIDB4ZDgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlcWludGN0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZXFpbnRjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFUUlOVENUTCIsIDB4ZDksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlcXJhbV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZXFyYW1fcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFUVJBTSIsIDB4ZGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3ByZ21jbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcHJnbWNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUFJHTUNOVCIsIDB4ZGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2FjY3VtX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2FjY3VtX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBQ0NVTSIsIDB4ZTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NpbmRleF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zaW5kZXhfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNJTkRFWCIsIDB4ZTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RpbmRleF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kaW5kZXhfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRJTkRFWCIsIDB4ZTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Jya2FkZHIxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Jya2FkZHIxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJCUktBRERSMSIsIDB4ZTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Jya2FkZHIwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Jya2FkZHIwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJCUktBRERSMCIsIDB4ZTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2FsbG9uZXNfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfYWxsb25lc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQUxMT05FUyIsIDB4ZTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2FsbHplcm9zX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2FsbHplcm9zX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBTExaRVJPUyIsIDB4ZWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX25vbmVfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbm9uZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTk9ORSIsIDB4ZWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NpbmRpcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zaW5kaXJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNJTkRJUiIsIDB4ZWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RpbmRpcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kaW5kaXJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRJTkRJUiIsIDB4ZWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Z1bmN0aW9uMV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9mdW5jdGlvbjFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkZVTkNUSU9OMSIsIDB4ZjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3N0YWNrX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3N0YWNrX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTVEFDSyIsIDB4ZjIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2N1cmFkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY3VyYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ1VSQUREUiIsIDB4ZjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ludHZlYzFfYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9pbnR2ZWMxX2FkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVFZFQzFfQUREUiIsIDB4ZjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ludHZlYzJfYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9pbnR2ZWMyX2FkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVFZFQzJfQUREUiIsIDB4ZjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xhc3RhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xhc3RhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMQVNUQUREUiIsIDB4ZjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xvbmdqbXBfYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9sb25nam1wX2FkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxPTkdKTVBfQUREUiIsIDB4ZjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2FjY3VtX3NhdmVfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfYWNjdW1fc2F2ZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQUNDVU1fU0FWRSIsIDB4ZmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3dhaXRpbmdfc2NiX3RhaWxzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3dhaXRpbmdfc2NiX3RhaWxzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJXQUlUSU5HX1NDQl9UQUlMUyIsIDB4MTAwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9haGRfcGNpX2NvbmZpZ19iYXNlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2FoZF9wY2lfY29uZmlnX2Jhc2VfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFIRF9QQ0lfQ09ORklHX0JBU0UiLCAweDEwMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc3JhbV9iYXNlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NyYW1fYmFzZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU1JBTV9CQVNFIiwgMHgxMDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3dhaXRpbmdfdGlkX2hlYWRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfd2FpdGluZ190aWRfaGVhZF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiV0FJVElOR19USURfSEVBRCIsIDB4MTIwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF93YWl0aW5nX3RpZF90YWlsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3dhaXRpbmdfdGlkX3RhaWxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIldBSVRJTkdfVElEX1RBSUwiLCAweDEyMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfbmV4dF9xdWV1ZWRfc2NiX2FkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbmV4dF9xdWV1ZWRfc2NiX2FkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk5FWFRfUVVFVUVEX1NDQl9BRERSIiwgMHgxMjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NvbXBsZXRlX3NjYl9oZWFkX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NvbXBsZXRlX3NjYl9oZWFkX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDT01QTEVURV9TQ0JfSEVBRCIsIDB4MTI4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9jb21wbGV0ZV9zY2JfZG1haW5wcm9nX2hlYWRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY29tcGxldGVfc2NiX2RtYWlucHJvZ19oZWFkX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDT01QTEVURV9TQ0JfRE1BSU5QUk9HX0hFQUQiLCAweDEyYSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfY29tcGxldGVfZG1hX3NjYl9oZWFkX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NvbXBsZXRlX2RtYV9zY2JfaGVhZF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ09NUExFVEVfRE1BX1NDQl9IRUFEIiwgMHgxMmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3FmcmVlemVfY291bnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcWZyZWV6ZV9jb3VudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUUZSRUVaRV9DT1VOVCIsIDB4MTJlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zYXZlZF9tb2RlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NhdmVkX21vZGVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX01PREUiLCAweDEzMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfbXNnX291dF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9tc2dfb3V0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJNU0dfT1VUIiwgMHgxMzEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RtYXBhcmFtc19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kbWFwYXJhbXNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRNQVBBUkFNUyIsIDB4MTMyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zZXFfZmxhZ3NfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2VxX2ZsYWdzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRVFfRkxBR1MiLCAweDEzMywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2F2ZWRfc2NzaWlkX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NhdmVkX3Njc2lpZF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0FWRURfU0NTSUlEIiwgMHgxMzQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NhdmVkX2x1bl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zYXZlZF9sdW5fcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX0xVTiIsIDB4MTM1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9sYXN0cGhhc2VfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbGFzdHBoYXNlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMQVNUUEhBU0UiLCAweDEzNiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfcW91dGZpZm9fZW50cnlfdmFsaWRfdGFnX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3FvdXRmaWZvX2VudHJ5X3ZhbGlkX3RhZ19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUU9VVEZJRk9fRU5UUllfVkFMSURfVEFHIiwgMHgxMzcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NoYXJlZF9kYXRhX2FkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2hhcmVkX2RhdGFfYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0hBUkVEX0RBVEFfQUREUiIsIDB4MTM4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9xb3V0Zmlmb19uZXh0X2FkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcW91dGZpZm9fbmV4dF9hZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRT1VURklGT19ORVhUX0FERFIiLCAweDEzYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfa2VybmVsX3RxaW5wb3NfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfa2VybmVsX3RxaW5wb3NfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIktFUk5FTF9UUUlOUE9TIiwgMHgxNDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3RxaW5wb3NfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfdHFpbnBvc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiVFFJTlBPUyIsIDB4MTQxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9hcmdfMV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9hcmdfMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQVJHXzEiLCAweDE0MiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfYXJnXzJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfYXJnXzJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFSR18yIiwgMHgxNDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xhc3RfbXNnX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xhc3RfbXNnX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMQVNUX01TRyIsIDB4MTQ0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY3Npc2VxX3RlbXBsYXRlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Njc2lzZXFfdGVtcGxhdGVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lTRVFfVEVNUExBVEUiLCAweDE0NSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfaW5pdGlhdG9yX3RhZ19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9pbml0aWF0b3JfdGFnX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTklUSUFUT1JfVEFHIiwgMHgxNDYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlcV9mbGFnczJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2VxX2ZsYWdzMl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VRX0ZMQUdTMiIsIDB4MTQ3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9hbGxvY2ZpZm9fc2NicHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2FsbG9jZmlmb19zY2JwdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFMTE9DRklGT19TQ0JQVFIiLCAweDE0OCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfaW50X2NvYWxlc2NpbmdfdGltZXJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfaW50X2NvYWxlc2NpbmdfdGltZXJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVF9DT0FMRVNDSU5HX1RJTUVSIiwgMHgxNGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ludF9jb2FsZXNjaW5nX21heGNtZHNfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfaW50X2NvYWxlc2NpbmdfbWF4Y21kc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UX0NPQUxFU0NJTkdfTUFYQ01EUyIsIDB4MTRjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9pbnRfY29hbGVzY2luZ19taW5jbWRzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2ludF9jb2FsZXNjaW5nX21pbmNtZHNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVF9DT0FMRVNDSU5HX01JTkNNRFMiLCAweDE0ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfY21kc19wZW5kaW5nX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NtZHNfcGVuZGluZ19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01EU19QRU5ESU5HIiwgMHgxNGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ludF9jb2FsZXNjaW5nX2NtZGNvdW50X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2ludF9jb2FsZXNjaW5nX2NtZGNvdW50X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRfQ09BTEVTQ0lOR19DTURDT1VOVCIsIDB4MTUwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9sb2NhbF9oc19tYWlsYm94X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xvY2FsX2hzX21haWxib3hfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxPQ0FMX0hTX01BSUxCT1giLCAweDE1MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfY21kc2l6ZV90YWJsZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWRzaXplX3RhYmxlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTURTSVpFX1RBQkxFIiwgMHgxNTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYl9iYXNlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYl9iYXNlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfQkFTRSIsIDB4MTgwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY2JfcmVzaWR1YWxfZGF0YWNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfcmVzaWR1YWxfZGF0YWNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1JFU0lEVUFMX0RBVEFDTlQiLCAweDE4MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2NiX3Jlc2lkdWFsX3NncHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYl9yZXNpZHVhbF9zZ3B0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1JFU0lEVUFMX1NHUFRSIiwgMHgxODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYl9zY3NpX3N0YXR1c19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2Jfc2NzaV9zdGF0dXNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9TQ1NJX1NUQVRVUyIsIDB4MTg4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY2JfdGFyZ2V0X3BoYXNlc19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfdGFyZ2V0X3BoYXNlc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1RBUkdFVF9QSEFTRVMiLCAweDE4OSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2NiX3RhcmdldF9kYXRhX2Rpcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfdGFyZ2V0X2RhdGFfZGlyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfVEFSR0VUX0RBVEFfRElSIiwgMHgxOGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYl90YXJnZXRfaXRhZ19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfdGFyZ2V0X2l0YWdfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9UQVJHRVRfSVRBRyIsIDB4MThiLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY2Jfc2Vuc2VfYnVzYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2Jfc2Vuc2VfYnVzYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1NFTlNFX0JVU0FERFIiLCAweDE4YywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2NiX3RhZ19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfdGFnX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfVEFHIiwgMHgxOTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYl9jb250cm9sX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYl9jb250cm9sX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfQ09OVFJPTCIsIDB4MTkyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY2Jfc2NzaWlkX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYl9zY3NpaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9TQ1NJSUQiLCAweDE5MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2NiX2x1bl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfbHVuX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfTFVOIiwgMHgxOTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYl90YXNrX2F0dHJpYnV0ZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfdGFza19hdHRyaWJ1dGVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9UQVNLX0FUVFJJQlVURSIsIDB4MTk1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY2JfY2RiX2xlbl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfY2RiX2xlbl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX0NEQl9MRU4iLCAweDE5NiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2NiX3Rhc2tfbWFuYWdlbWVudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfdGFza19tYW5hZ2VtZW50X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfVEFTS19NQU5BR0VNRU5UIiwgMHgxOTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYl9kYXRhcHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYl9kYXRhcHRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfREFUQVBUUiIsIDB4MTk4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY2JfZGF0YWNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfZGF0YWNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX0RBVEFDTlQiLCAweDFhMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2NiX3NncHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYl9zZ3B0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1NHUFRSIiwgMHgxYTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYl9idXNhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYl9idXNhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfQlVTQUREUiIsIDB4MWE4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY2JfbmV4dF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfbmV4dF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX05FWFQiLCAweDFhYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2NiX25leHQyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYl9uZXh0Ml9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX05FWFQyIiwgMHgxYWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYl9zcGFyZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2Jfc3BhcmVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9TUEFSRSIsIDB4MWIwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY2JfZGlzY29ubmVjdGVkX2xpc3RzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYl9kaXNjb25uZWN0ZWRfbGlzdHNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9ESVNDT05ORUNURURfTElTVFMiLCAweDFiOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworCisjZGVmaW5lCU1PREVfUFRSICAgICAgICAJCTB4MDAKKyNkZWZpbmUJCURTVF9NT0RFICAgICAgICAJMHg3MAorI2RlZmluZQkJU1JDX01PREUgICAgICAgIAkweDA3CisKKyNkZWZpbmUJSU5UU1RBVCAgICAgICAgIAkJMHgwMQorI2RlZmluZQkJSU5UX1BFTkQgICAgICAgIAkweGZmCisjZGVmaW5lCQlIV0VSUklOVCAgICAgICAgCTB4ODAKKyNkZWZpbmUJCUJSS0FEUklOVCAgICAgICAJMHg0MAorI2RlZmluZQkJU1dUTUlOVCAgICAgICAgIAkweDIwCisjZGVmaW5lCQlQQ0lJTlQgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCVNDU0lJTlQgICAgICAgICAJMHgwOAorI2RlZmluZQkJU0VRSU5UICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlDTURDTVBMVCAgICAgICAgCTB4MDIKKyNkZWZpbmUJCVNQTFRJTlQgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNFUUlOVENPREUgICAgICAJCTB4MDIKKyNkZWZpbmUJCUJBRF9TQ0JfU1RBVFVTICAJMHgxYQorI2RlZmluZQkJU0FXX0hXRVJSICAgICAgIAkweDE5CisjZGVmaW5lCQlUUkFDRVBPSU5UMyAgICAgCTB4MTgKKyNkZWZpbmUJCVRSQUNFUE9JTlQyICAgICAJMHgxNworI2RlZmluZQkJVFJBQ0VQT0lOVDEgICAgIAkweDE2CisjZGVmaW5lCQlUUkFDRVBPSU5UMCAgICAgCTB4MTUKKyNkZWZpbmUJCVRBU0tNR01UX0NNRF9DTVBMVF9PS0FZCTB4MTQKKyNkZWZpbmUJCVRBU0tNR01UX0ZVTkNfQ09NUExFVEUJMHgxMworI2RlZmluZQkJRU5URVJJTkdfTk9OUEFDSwkweDEyCisjZGVmaW5lCQlDRkc0T1ZFUlJVTiAgICAgCTB4MTEKKyNkZWZpbmUJCVNUQVRVU19PVkVSUlVOICAJMHgxMAorI2RlZmluZQkJQ0ZHNElTVEFUX0lOVFIgIAkweDBmCisjZGVmaW5lCQlJTlZBTElEX1NFUUlOVCAgCTB4MGUKKyNkZWZpbmUJCUlMTEVHQUxfUEhBU0UgICAJMHgwZAorI2RlZmluZQkJRFVNUF9DQVJEX1NUQVRFIAkweDBjCisjZGVmaW5lCQlNSVNTRURfQlVTRlJFRSAgCTB4MGIKKyNkZWZpbmUJCU1LTVNHX0ZBSUxFRCAgICAJMHgwYQorI2RlZmluZQkJREFUQV9PVkVSUlVOICAgIAkweDA5CisjZGVmaW5lCQlCQURfU1RBVFVTICAgICAgCTB4MDgKKyNkZWZpbmUJCUhPU1RfTVNHX0xPT1AgICAJMHgwNworI2RlZmluZQkJUERBVEFfUkVJTklUICAgIAkweDA2CisjZGVmaW5lCQlJR05fV0lERV9SRVMgICAgCTB4MDUKKyNkZWZpbmUJCU5PX01BVENIICAgICAgICAJMHgwNAorI2RlZmluZQkJUFJPVE9fVklPTEFUSU9OIAkweDAzCisjZGVmaW5lCQlTRU5EX1JFSkVDVCAgICAgCTB4MDIKKyNkZWZpbmUJCUJBRF9QSEFTRSAgICAgICAJMHgwMQorI2RlZmluZQkJTk9fU0VRSU5UICAgICAgIAkweDAwCisKKyNkZWZpbmUJQ0xSSU5UICAgICAgICAgIAkJMHgwMworI2RlZmluZQkJQ0xSSFdFUlJJTlQgICAgIAkweDgwCisjZGVmaW5lCQlDTFJCUktBRFJJTlQgICAgCTB4NDAKKyNkZWZpbmUJCUNMUlNXVE1JTlQgICAgICAJMHgyMAorI2RlZmluZQkJQ0xSUENJSU5UICAgICAgIAkweDEwCisjZGVmaW5lCQlDTFJTQ1NJSU5UICAgICAgCTB4MDgKKyNkZWZpbmUJCUNMUlNFUUlOVCAgICAgICAJMHgwNAorI2RlZmluZQkJQ0xSQ01ESU5UICAgICAgIAkweDAyCisjZGVmaW5lCQlDTFJTUExUSU5UICAgICAgCTB4MDEKKworI2RlZmluZQlFUlJPUiAgICAgICAgICAgCQkweDA0CisjZGVmaW5lCQlDSU9QQVJFUlIgICAgICAgCTB4ODAKKyNkZWZpbmUJCUNJT0FDQ0VTRkFJTCAgICAJMHg0MAorI2RlZmluZQkJTVBBUkVSUiAgICAgICAgIAkweDIwCisjZGVmaW5lCQlEUEFSRVJSICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCVNRUEFSRVJSICAgICAgICAJMHgwOAorI2RlZmluZQkJSUxMT1BDT0RFICAgICAgIAkweDA0CisjZGVmaW5lCQlEU0NUTU9VVCAgICAgICAgCTB4MDIKKworI2RlZmluZQlDTFJFUlIgICAgICAgICAgCQkweDA0CisjZGVmaW5lCQlDTFJDSU9QQVJFUlIgICAgCTB4ODAKKyNkZWZpbmUJCUNMUkNJT0FDQ0VTRkFJTCAJMHg0MAorI2RlZmluZQkJQ0xSTVBBUkVSUiAgICAgIAkweDIwCisjZGVmaW5lCQlDTFJEUEFSRVJSICAgICAgCTB4MTAKKyNkZWZpbmUJCUNMUlNRUEFSRVJSICAgICAJMHgwOAorI2RlZmluZQkJQ0xSSUxMT1BDT0RFICAgIAkweDA0CisjZGVmaW5lCQlDTFJEU0NUTU9VVCAgICAgCTB4MDIKKworI2RlZmluZQlIQ05UUkwgICAgICAgICAgCQkweDA1CisjZGVmaW5lCQlTRVFfUkVTRVQgICAgICAgCTB4ODAKKyNkZWZpbmUJCVBPV1JETiAgICAgICAgICAJMHg0MAorI2RlZmluZQkJU1dJTlQgICAgICAgICAgIAkweDEwCisjZGVmaW5lCQlTV1RJTUVSX1NUQVJUX0IgCTB4MDgKKyNkZWZpbmUJCVBBVVNFICAgICAgICAgICAJMHgwNAorI2RlZmluZQkJSU5URU4gICAgICAgICAgIAkweDAyCisjZGVmaW5lCQlDSElQUlNUICAgICAgICAgCTB4MDEKKyNkZWZpbmUJCUNISVBSU1RBQ0sgICAgICAJMHgwMQorCisjZGVmaW5lCUhOU0NCX1FPRkYgICAgICAJCTB4MDYKKworI2RlZmluZQlIRVNDQl9RT0ZGICAgICAgCQkweDA4CisKKyNkZWZpbmUJSFNfTUFJTEJPWCAgICAgIAkJMHgwYgorI2RlZmluZQkJSE9TVF9UUUlOUE9TICAgIAkweDgwCisjZGVmaW5lCQlFTklOVF9DT0FMRVNDRSAgCTB4NDAKKworI2RlZmluZQlDTFJTRVFJTlRTVEFUICAgCQkweDBjCisjZGVmaW5lCQlDTFJTRVFfU1dUTVJUTyAgCTB4MTAKKyNkZWZpbmUJCUNMUlNFUV9TRVFJTlQgICAJMHgwOAorI2RlZmluZQkJQ0xSU0VRX1NDU0lJTlQgIAkweDA0CisjZGVmaW5lCQlDTFJTRVFfUENJSU5UICAgCTB4MDIKKyNkZWZpbmUJCUNMUlNFUV9TUExUSU5UICAJMHgwMQorCisjZGVmaW5lCVNFUUlOVFNUQVQgICAgICAJCTB4MGMKKyNkZWZpbmUJCVNFUV9TV1RNUlRPICAgICAJMHgxMAorI2RlZmluZQkJU0VRX1NFUUlOVCAgICAgIAkweDA4CisjZGVmaW5lCQlTRVFfU0NTSUlOVCAgICAgCTB4MDQKKyNkZWZpbmUJCVNFUV9QQ0lJTlQgICAgICAJMHgwMgorI2RlZmluZQkJU0VRX1NQTFRJTlQgICAgIAkweDAxCisKKyNkZWZpbmUJU1dUSU1FUiAgICAgICAgIAkJMHgwZQorCisjZGVmaW5lCVNOU0NCX1FPRkYgICAgICAJCTB4MTAKKworI2RlZmluZQlTRVNDQl9RT0ZGICAgICAgCQkweDEyCisKKyNkZWZpbmUJU0RTQ0JfUU9GRiAgICAgIAkJMHgxNAorCisjZGVmaW5lCVFPRkZfQ1RMU1RBICAgICAJCTB4MTYKKyNkZWZpbmUJCUVNUFRZX1NDQl9BVkFJTCAJMHg4MAorI2RlZmluZQkJTkVXX1NDQl9BVkFJTCAgIAkweDQwCisjZGVmaW5lCQlTRFNDQl9ST0xMT1ZSICAgCTB4MjAKKyNkZWZpbmUJCUhTX01BSUxCT1hfQUNUICAJMHgxMAorI2RlZmluZQkJU0NCX1FTSVpFICAgICAgIAkweDBmCisjZGVmaW5lCQlTQ0JfUVNJWkVfMTYzODQgCTB4MGMKKyNkZWZpbmUJCVNDQl9RU0laRV84MTkyICAJMHgwYgorI2RlZmluZQkJU0NCX1FTSVpFXzQwOTYgIAkweDBhCisjZGVmaW5lCQlTQ0JfUVNJWkVfMjA0OCAgCTB4MDkKKyNkZWZpbmUJCVNDQl9RU0laRV8xMDI0ICAJMHgwOAorI2RlZmluZQkJU0NCX1FTSVpFXzUxMiAgIAkweDA3CisjZGVmaW5lCQlTQ0JfUVNJWkVfMjU2ICAgCTB4MDYKKyNkZWZpbmUJCVNDQl9RU0laRV8xMjggICAJMHgwNQorI2RlZmluZQkJU0NCX1FTSVpFXzY0ICAgIAkweDA0CisjZGVmaW5lCQlTQ0JfUVNJWkVfMzIgICAgCTB4MDMKKyNkZWZpbmUJCVNDQl9RU0laRV8xNiAgICAJMHgwMgorI2RlZmluZQkJU0NCX1FTSVpFXzggICAgIAkweDAxCisjZGVmaW5lCQlTQ0JfUVNJWkVfNCAgICAgCTB4MDAKKworI2RlZmluZQlJTlRDVEwgICAgICAgICAgCQkweDE4CisjZGVmaW5lCQlTV1RNSU5UTUFTSyAgICAgCTB4ODAKKyNkZWZpbmUJCVNXVE1JTlRFTiAgICAgICAJMHg0MAorI2RlZmluZQkJU1dUSU1FUl9TVEFSVCAgIAkweDIwCisjZGVmaW5lCQlBVVRPQ0xSQ01ESU5UICAgCTB4MTAKKyNkZWZpbmUJCVBDSUlOVEVOICAgICAgICAJMHgwOAorI2RlZmluZQkJU0NTSUlOVEVOICAgICAgIAkweDA0CisjZGVmaW5lCQlTRVFJTlRFTiAgICAgICAgCTB4MDIKKyNkZWZpbmUJCVNQTFRJTlRFTiAgICAgICAJMHgwMQorCisjZGVmaW5lCURGQ05UUkwgICAgICAgICAJCTB4MTkKKyNkZWZpbmUJCVNDU0lFTldSRElTICAgICAJMHg0MAorI2RlZmluZQkJU0NTSUVOQUNLICAgICAgIAkweDIwCisjZGVmaW5lCQlESVJFQ1RJT05BQ0sgICAgCTB4MDQKKyNkZWZpbmUJCUZJRk9GTFVTSEFDSyAgICAJMHgwMgorI2RlZmluZQkJRElSRUNUSU9ORU4gICAgIAkweDAxCisKKyNkZWZpbmUJRFNDT01NQU5EMCAgICAgIAkJMHgxOQorI2RlZmluZQkJQ0FDSEVUSEVOICAgICAgIAkweDgwCisjZGVmaW5lCQlEUEFSQ0tFTiAgICAgICAgCTB4NDAKKyNkZWZpbmUJCU1QQVJDS0VOICAgICAgICAJMHgyMAorI2RlZmluZQkJRVhUUkVRTENLICAgICAgIAkweDEwCisjZGVmaW5lCQlESVNBQkxFX1RXQVRFICAgCTB4MDIKKyNkZWZpbmUJCUNJT1BBUkNLRU4gICAgICAJMHgwMQorCisjZGVmaW5lCURGU1RBVFVTICAgICAgICAJCTB4MWEKKyNkZWZpbmUJCVBSRUxPQURfQVZBSUwgICAJMHg4MAorI2RlZmluZQkJUEtUX1BSRUxPQURfQVZBSUwJMHg0MAorI2RlZmluZQkJTVJFUVBFTkQgICAgICAgIAkweDEwCisjZGVmaW5lCQlIRE9ORSAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCURGVEhSRVNIICAgICAgICAJMHgwNAorI2RlZmluZQkJRklGT0ZVTEwgICAgICAgIAkweDAyCisjZGVmaW5lCQlGSUZPRU1QICAgICAgICAgCTB4MDEKKworI2RlZmluZQlTR19DQUNIRV9TSEFET1cgCQkweDFiCisjZGVmaW5lCQlPRERfU0VHICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCUxBU1RfU0VHICAgICAgICAJMHgwMgorI2RlZmluZQkJTEFTVF9TRUdfRE9ORSAgIAkweDAxCisKKyNkZWZpbmUJQVJCQ1RMICAgICAgICAgIAkJMHgxYgorI2RlZmluZQkJUkVTRVRfSEFSQiAgICAgIAkweDgwCisjZGVmaW5lCQlSRVRSWV9TV0VOICAgICAgCTB4MDgKKyNkZWZpbmUJCVVTRV9USU1FICAgICAgICAJMHgwNworCisjZGVmaW5lCVNHX0NBQ0hFX1BSRSAgICAJCTB4MWIKKworI2RlZmluZQlMUUlOICAgICAgICAgICAgCQkweDIwCisKKyNkZWZpbmUJVFlQRVBUUiAgICAgICAgIAkJMHgyMAorCisjZGVmaW5lCVRBR1BUUiAgICAgICAgICAJCTB4MjEKKworI2RlZmluZQlMVU5QVFIgICAgICAgICAgCQkweDIyCisKKyNkZWZpbmUJREFUQUxFTlBUUiAgICAgIAkJMHgyMworCisjZGVmaW5lCVNUQVRMRU5QVFIgICAgICAJCTB4MjQKKworI2RlZmluZQlDTURMRU5QVFIgICAgICAgCQkweDI1CisKKyNkZWZpbmUJQVRUUlBUUiAgICAgICAgIAkJMHgyNgorCisjZGVmaW5lCUZMQUdQVFIgICAgICAgICAJCTB4MjcKKworI2RlZmluZQlDTURQVFIgICAgICAgICAgCQkweDI4CisKKyNkZWZpbmUJUU5FWFRQVFIgICAgICAgIAkJMHgyOQorCisjZGVmaW5lCUlEUFRSICAgICAgICAgICAJCTB4MmEKKworI2RlZmluZQlBQlJUQllURVBUUiAgICAgCQkweDJiCisKKyNkZWZpbmUJQUJSVEJJVFBUUiAgICAgIAkJMHgyYworCisjZGVmaW5lCU1BWENNREJZVEVTICAgICAJCTB4MmQKKworI2RlZmluZQlNQVhDTUQyUkNWICAgICAgCQkweDJlCisKKyNkZWZpbmUJU0hPUlRUSFJFU0ggICAgIAkJMHgyZgorCisjZGVmaW5lCUxVTkxFTiAgICAgICAgICAJCTB4MzAKKyNkZWZpbmUJCVRMVU5MRU4gICAgICAgICAJMHhmMAorI2RlZmluZQkJSUxVTkxFTiAgICAgICAgIAkweDBmCisKKyNkZWZpbmUJQ0RCTElNSVQgICAgICAgIAkJMHgzMQorCisjZGVmaW5lCU1BWENNRCAgICAgICAgICAJCTB4MzIKKworI2RlZmluZQlNQVhDTURDTlQgICAgICAgCQkweDMzCisKKyNkZWZpbmUJTFFSU1ZEMDEgICAgICAgIAkJMHgzNAorCisjZGVmaW5lCUxRUlNWRDE2ICAgICAgICAJCTB4MzUKKworI2RlZmluZQlMUVJTVkQxNyAgICAgICAgCQkweDM2CisKKyNkZWZpbmUJQ01EUlNWRDAgICAgICAgIAkJMHgzNworCisjZGVmaW5lCUxRQ1RMMCAgICAgICAgICAJCTB4MzgKKyNkZWZpbmUJCUxRSVRBUkdDTFQgICAgICAJMHhjMAorI2RlZmluZQkJTFFJSU5JVEdDTFQgICAgIAkweDMwCisjZGVmaW5lCQlMUTBUQVJHQ0xUICAgICAgCTB4MGMKKyNkZWZpbmUJCUxRMElOSVRHQ0xUICAgICAJMHgwMworCisjZGVmaW5lCUxRQ1RMMSAgICAgICAgICAJCTB4MzgKKyNkZWZpbmUJCVBDSTJQQ0kgICAgICAgICAJMHgwNAorI2RlZmluZQkJU0lOR0xFQ01EICAgICAgIAkweDAyCisjZGVmaW5lCQlBQk9SVFBFTkRJTkcgICAgCTB4MDEKKworI2RlZmluZQlTQ1NCSVNUMCAgICAgICAgCQkweDM5CisjZGVmaW5lCQlHU0JJU1RFUlIgICAgICAgCTB4NDAKKyNkZWZpbmUJCUdTQklTVERPTkUgICAgICAJMHgyMAorI2RlZmluZQkJR1NCSVNUUlVOICAgICAgIAkweDEwCisjZGVmaW5lCQlPU0JJU1RFUlIgICAgICAgCTB4MDQKKyNkZWZpbmUJCU9TQklTVERPTkUgICAgICAJMHgwMgorI2RlZmluZQkJT1NCSVNUUlVOICAgICAgIAkweDAxCisKKyNkZWZpbmUJTFFDVEwyICAgICAgICAgIAkJMHgzOQorI2RlZmluZQkJTFFJUkVUUlkgICAgICAgIAkweDgwCisjZGVmaW5lCQlMUUlDT05USU5VRSAgICAgCTB4NDAKKyNkZWZpbmUJCUxRSVRPSURMRSAgICAgICAJMHgyMAorI2RlZmluZQkJTFFJUEFVU0UgICAgICAgIAkweDEwCisjZGVmaW5lCQlMUU9SRVRSWSAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUxRT0NPTlRJTlVFICAgICAJMHgwNAorI2RlZmluZQkJTFFPVE9JRExFICAgICAgIAkweDAyCisjZGVmaW5lCQlMUU9QQVVTRSAgICAgICAgCTB4MDEKKworI2RlZmluZQlTQ1NCSVNUMSAgICAgICAgCQkweDNhCisjZGVmaW5lCQlOVEJJU1RFUlIgICAgICAgCTB4MDQKKyNkZWZpbmUJCU5UQklTVERPTkUgICAgICAJMHgwMgorI2RlZmluZQkJTlRCSVNUUlVOICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0NTSVNFUTAgICAgICAgIAkJMHgzYQorI2RlZmluZQkJVEVNT0RFTyAgICAgICAgIAkweDgwCisjZGVmaW5lCQlFTlNFTE8gICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUVOQVJCTyAgICAgICAgICAJMHgyMAorI2RlZmluZQkJRk9SQ0VCVVNGUkVFICAgIAkweDEwCisjZGVmaW5lCQlTQ1NJUlNUTyAgICAgICAgCTB4MDEKKworI2RlZmluZQlTQ1NJU0VRMSAgICAgICAgCQkweDNiCisKKyNkZWZpbmUJU1hGUkNUTDAgICAgICAgIAkJMHgzYworI2RlZmluZQkJREZPTiAgICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlERlBFWFAgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUJJT1NDQU5DRUxFTiAgICAJMHgxMAorI2RlZmluZQkJU1BJT0VOICAgICAgICAgIAkweDA4CisKKyNkZWZpbmUJQlVTSU5JVElEICAgICAgIAkJMHgzYworCisjZGVmaW5lCURMQ09VTlQgICAgICAgICAJCTB4M2MKKworI2RlZmluZQlTWEZSQ1RMMSAgICAgICAgCQkweDNkCisjZGVmaW5lCQlCSVRCVUNLRVQgICAgICAgCTB4ODAKKyNkZWZpbmUJCUVOU0FDSEsgICAgICAgICAJMHg0MAorI2RlZmluZQkJRU5TUENISyAgICAgICAgIAkweDIwCisjZGVmaW5lCQlTVElNRVNFTCAgICAgICAgCTB4MTgKKyNkZWZpbmUJCUVOU1RJTUVSICAgICAgICAJMHgwNAorI2RlZmluZQkJQUNUTkVHRU4gICAgICAgIAkweDAyCisjZGVmaW5lCQlTVFBXRU4gICAgICAgICAgCTB4MDEKKworI2RlZmluZQlCVVNUQVJHSUQgICAgICAgCQkweDNlCisKKyNkZWZpbmUJU1hGUkNUTDIgICAgICAgIAkJMHgzZQorI2RlZmluZQkJQVVUT1JTVERJUyAgICAgIAkweDEwCisjZGVmaW5lCQlDTURETUFFTiAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUFTVSAgICAgICAgICAgICAJMHgwNworCisjZGVmaW5lCURGRlNUQVQgICAgICAgICAJCTB4M2YKKyNkZWZpbmUJCUNVUlJGSUZPICAgICAgICAJMHgwMworI2RlZmluZQkJRklGTzFGUkVFICAgICAgIAkweDIwCisjZGVmaW5lCQlGSUZPMEZSRUUgICAgICAgCTB4MTAKKyNkZWZpbmUJCUNVUlJGSUZPX05PTkUgICAJMHgwMworI2RlZmluZQkJQ1VSUkZJRk9fMSAgICAgIAkweDAxCisjZGVmaW5lCQlDVVJSRklGT18wICAgICAgCTB4MDAKKworI2RlZmluZQlTQ1NJU0lHTyAgICAgICAgCQkweDQwCisjZGVmaW5lCQlDRE8gICAgICAgICAgICAgCTB4ODAKKyNkZWZpbmUJCUlPTyAgICAgICAgICAgICAJMHg0MAorI2RlZmluZQkJTVNHTyAgICAgICAgICAgIAkweDIwCisjZGVmaW5lCQlBVE5PICAgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCVNFTE8gICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJQlNZTyAgICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlSRVFPICAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUFDS08gICAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCU1VTFRBUkdJRCAgICAgICAJCTB4NDAKKworI2RlZmluZQlTQ1NJU0lHSSAgICAgICAgCQkweDQxCisjZGVmaW5lCQlBVE5JICAgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCVNFTEkgICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJQlNZSSAgICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlSRVFJICAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUFDS0kgICAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNDU0lQSEFTRSAgICAgICAJCTB4NDIKKyNkZWZpbmUJCVNUQVRVU19QSEFTRSAgICAJMHgyMAorI2RlZmluZQkJQ09NTUFORF9QSEFTRSAgIAkweDEwCisjZGVmaW5lCQlNU0dfSU5fUEhBU0UgICAgCTB4MDgKKyNkZWZpbmUJCU1TR19PVVRfUEhBU0UgICAJMHgwNAorI2RlZmluZQkJREFUQV9QSEFTRV9NQVNLIAkweDAzCisjZGVmaW5lCQlEQVRBX0lOX1BIQVNFICAgCTB4MDIKKyNkZWZpbmUJCURBVEFfT1VUX1BIQVNFICAJMHgwMQorCisjZGVmaW5lCVNDU0lEQVQwX0lNRyAgICAJCTB4NDMKKworI2RlZmluZQlTQ1NJREFUICAgICAgICAgCQkweDQ0CisKKyNkZWZpbmUJU0NTSUJVUyAgICAgICAgIAkJMHg0NgorCisjZGVmaW5lCVRBUkdJRElOICAgICAgICAJCTB4NDgKKyNkZWZpbmUJCUNMS09VVCAgICAgICAgICAJMHg4MAorI2RlZmluZQkJVEFSR0lEICAgICAgICAgIAkweDBmCisKKyNkZWZpbmUJU0VMSUQgICAgICAgICAgIAkJMHg0OQorI2RlZmluZQkJU0VMSURfTUFTSyAgICAgIAkweGYwCisjZGVmaW5lCQlPTkVCSVQgICAgICAgICAgCTB4MDgKKworI2RlZmluZQlTQkxLQ1RMICAgICAgICAgCQkweDRhCisjZGVmaW5lCQlESUFHTEVERU4gICAgICAgCTB4ODAKKyNkZWZpbmUJCURJQUdMRURPTiAgICAgICAJMHg0MAorI2RlZmluZQkJRU5BQjQwICAgICAgICAgIAkweDA4CisjZGVmaW5lCQlFTkFCMjAgICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVNFTFdJREUgICAgICAgICAJMHgwMgorCisjZGVmaW5lCU9QVElPTk1PREUgICAgICAJCTB4NGEKKyNkZWZpbmUJCU9QVElPTk1PREVfREVGQVVMVFMJMHgwMgorI2RlZmluZQkJQklPU0NBTkNUTCAgICAgIAkweDgwCisjZGVmaW5lCQlBVVRPQUNLRU4gICAgICAgCTB4NDAKKyNkZWZpbmUJCUJJQVNDQU5DVEwgICAgICAJMHgyMAorI2RlZmluZQkJQlVTRlJFRVJFViAgICAgIAkweDEwCisjZGVmaW5lCQlFTkRHRk9STUNISyAgICAgCTB4MDQKKyNkZWZpbmUJCUFVVE9fTVNHT1VUX0RFICAJMHgwMgorCisjZGVmaW5lCVNTVEFUMCAgICAgICAgICAJCTB4NGIKKyNkZWZpbmUJCVRBUkdFVCAgICAgICAgICAJMHg4MAorI2RlZmluZQkJU0VMRE8gICAgICAgICAgIAkweDQwCisjZGVmaW5lCQlTRUxESSAgICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVNFTElOR08gICAgICAgICAJMHgxMAorI2RlZmluZQkJSU9FUlIgICAgICAgICAgIAkweDA4CisjZGVmaW5lCQlPVkVSUlVOICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVNQSU9SRFkgICAgICAgICAJMHgwMgorI2RlZmluZQkJQVJCRE8gICAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJQ0xSU0lOVDAgICAgICAgIAkJMHg0YgorI2RlZmluZQkJQ0xSU0VMRE8gICAgICAgIAkweDQwCisjZGVmaW5lCQlDTFJTRUxESSAgICAgICAgCTB4MjAKKyNkZWZpbmUJCUNMUlNFTElOR08gICAgICAJMHgxMAorI2RlZmluZQkJQ0xSSU9FUlIgICAgICAgIAkweDA4CisjZGVmaW5lCQlDTFJPVkVSUlVOICAgICAgCTB4MDQKKyNkZWZpbmUJCUNMUlNQSU9SRFkgICAgICAJMHgwMgorI2RlZmluZQkJQ0xSQVJCRE8gICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0lNT0RFMCAgICAgICAgIAkJMHg0YgorI2RlZmluZQkJRU5TRUxETyAgICAgICAgIAkweDQwCisjZGVmaW5lCQlFTlNFTERJICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCUVOU0VMSU5HTyAgICAgICAJMHgxMAorI2RlZmluZQkJRU5JT0VSUiAgICAgICAgIAkweDA4CisjZGVmaW5lCQlFTk9WRVJSVU4gICAgICAgCTB4MDQKKyNkZWZpbmUJCUVOU1BJT1JEWSAgICAgICAJMHgwMgorI2RlZmluZQkJRU5BUkJETyAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJQ0xSU0lOVDEgICAgICAgIAkJMHg0YworI2RlZmluZQkJQ0xSU0VMVElNRU8gICAgIAkweDgwCisjZGVmaW5lCQlDTFJBVE5PICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUNMUlNDU0lSU1RJICAgICAJMHgyMAorI2RlZmluZQkJQ0xSQlVTRlJFRSAgICAgIAkweDA4CisjZGVmaW5lCQlDTFJTQ1NJUEVSUiAgICAgCTB4MDQKKyNkZWZpbmUJCUNMUlNUUkIyRkFTVCAgICAJMHgwMgorI2RlZmluZQkJQ0xSUkVRSU5JVCAgICAgIAkweDAxCisKKyNkZWZpbmUJU1NUQVQxICAgICAgICAgIAkJMHg0YworI2RlZmluZQkJU0VMVE8gICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlBVE5UQVJHICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVNDU0lSU1RJICAgICAgICAJMHgyMAorI2RlZmluZQkJUEhBU0VNSVMgICAgICAgIAkweDEwCisjZGVmaW5lCQlCVVNGUkVFICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVNDU0lQRVJSICAgICAgICAJMHgwNAorI2RlZmluZQkJU1RSQjJGQVNUICAgICAgIAkweDAyCisjZGVmaW5lCQlSRVFJTklUICAgICAgICAgCTB4MDEKKworI2RlZmluZQlTU1RBVDIgICAgICAgICAgCQkweDRkCisjZGVmaW5lCQlCVVNGUkVFVElNRSAgICAgCTB4YzAKKyNkZWZpbmUJCU5PTlBBQ0tSRVEgICAgICAJMHgyMAorI2RlZmluZQkJRVhQX0FDVElWRSAgICAgIAkweDEwCisjZGVmaW5lCQlCU1lYICAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVdJREVfUkVTICAgICAgICAJMHgwNAorI2RlZmluZQkJU0RPTkUgICAgICAgICAgIAkweDAyCisjZGVmaW5lCQlETUFET05FICAgICAgICAgCTB4MDEKKyNkZWZpbmUJCUJVU0ZSRUVfREZGMSAgICAJMHhjMAorI2RlZmluZQkJQlVTRlJFRV9ERkYwICAgIAkweDgwCisjZGVmaW5lCQlCVVNGUkVFX0xRTyAgICAgCTB4NDAKKworI2RlZmluZQlDTFJTSU5UMiAgICAgICAgCQkweDRkCisjZGVmaW5lCQlDTFJOT05QQUNLUkVRICAgCTB4MjAKKyNkZWZpbmUJCUNMUldJREVfUkVTICAgICAJMHgwNAorI2RlZmluZQkJQ0xSU0RPTkUgICAgICAgIAkweDAyCisjZGVmaW5lCQlDTFJETUFET05FICAgICAgCTB4MDEKKworI2RlZmluZQlTSU1PREUyICAgICAgICAgCQkweDRkCisjZGVmaW5lCQlFTldJREVfUkVTICAgICAgCTB4MDQKKyNkZWZpbmUJCUVOU0RPTkUgICAgICAgICAJMHgwMgorI2RlZmluZQkJRU5ETUFET05FICAgICAgIAkweDAxCisKKyNkZWZpbmUJUEVSUkRJQUcgICAgICAgIAkJMHg0ZQorI2RlZmluZQkJSElaRVJPICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlISVBFUlIgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVBSRVZQSEFTRSAgICAgICAJMHgyMAorI2RlZmluZQkJUEFSSVRZRVJSICAgICAgIAkweDEwCisjZGVmaW5lCQlBSVBFUlIgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUNSQ0VSUiAgICAgICAgICAJMHgwNAorI2RlZmluZQkJREdGT1JNRVJSICAgICAgIAkweDAyCisjZGVmaW5lCQlEVEVSUiAgICAgICAgICAgCTB4MDEKKworI2RlZmluZQlMUUlTVEFURSAgICAgICAgCQkweDRlCisKKyNkZWZpbmUJU09GRkNOVCAgICAgICAgIAkJMHg0ZgorCisjZGVmaW5lCUxRT1NUQVRFICAgICAgICAJCTB4NGYKKworI2RlZmluZQlMUUlTVEFUMCAgICAgICAgCQkweDUwCisjZGVmaW5lCQlMUUlBVE5RQVMgICAgICAgCTB4MjAKKyNkZWZpbmUJCUxRSUNSQ1QxICAgICAgICAJMHgxMAorI2RlZmluZQkJTFFJQ1JDVDIgICAgICAgIAkweDA4CisjZGVmaW5lCQlMUUlCQURMUVQgICAgICAgCTB4MDQKKyNkZWZpbmUJCUxRSUFUTkxRICAgICAgICAJMHgwMgorI2RlZmluZQkJTFFJQVROQ01EICAgICAgIAkweDAxCisKKyNkZWZpbmUJQ0xSTFFJSU5UMCAgICAgIAkJMHg1MAorI2RlZmluZQkJQ0xSTFFJQVROUUFTICAgIAkweDIwCisjZGVmaW5lCQlDTFJMUUlDUkNUMSAgICAgCTB4MTAKKyNkZWZpbmUJCUNMUkxRSUNSQ1QyICAgICAJMHgwOAorI2RlZmluZQkJQ0xSTFFJQkFETFFUICAgIAkweDA0CisjZGVmaW5lCQlDTFJMUUlBVE5MUSAgICAgCTB4MDIKKyNkZWZpbmUJCUNMUkxRSUFUTkNNRCAgICAJMHgwMQorCisjZGVmaW5lCUxRSU1PREUwICAgICAgICAJCTB4NTAKKyNkZWZpbmUJCUVOTFFJQVROUUFTSyAgICAJMHgyMAorI2RlZmluZQkJRU5MUUlDUkNUMSAgICAgIAkweDEwCisjZGVmaW5lCQlFTkxRSUNSQ1QyICAgICAgCTB4MDgKKyNkZWZpbmUJCUVOTFFJQkFETFFUICAgICAJMHgwNAorI2RlZmluZQkJRU5MUUlBVE5MUSAgICAgIAkweDAyCisjZGVmaW5lCQlFTkxRSUFUTkNNRCAgICAgCTB4MDEKKworI2RlZmluZQlMUUlNT0RFMSAgICAgICAgCQkweDUxCisjZGVmaW5lCQlFTkxRSVBIQVNFX0xRICAgCTB4ODAKKyNkZWZpbmUJCUVOTFFJUEhBU0VfTkxRICAJMHg0MAorI2RlZmluZQkJRU5MSVFBQk9SVCAgICAgIAkweDIwCisjZGVmaW5lCQlFTkxRSUNSQ0lfTFEgICAgCTB4MTAKKyNkZWZpbmUJCUVOTFFJQ1JDSV9OTFEgICAJMHgwOAorI2RlZmluZQkJRU5MUUlCQURMUUkgICAgIAkweDA0CisjZGVmaW5lCQlFTkxRSU9WRVJJX0xRICAgCTB4MDIKKyNkZWZpbmUJCUVOTFFJT1ZFUklfTkxRICAJMHgwMQorCisjZGVmaW5lCUxRSVNUQVQxICAgICAgICAJCTB4NTEKKyNkZWZpbmUJCUxRSVBIQVNFX0xRICAgICAJMHg4MAorI2RlZmluZQkJTFFJUEhBU0VfTkxRICAgIAkweDQwCisjZGVmaW5lCQlMUUlBQk9SVCAgICAgICAgCTB4MjAKKyNkZWZpbmUJCUxRSUNSQ0lfTFEgICAgICAJMHgxMAorI2RlZmluZQkJTFFJQ1JDSV9OTFEgICAgIAkweDA4CisjZGVmaW5lCQlMUUlCQURMUUkgICAgICAgCTB4MDQKKyNkZWZpbmUJCUxRSU9WRVJJX0xRICAgICAJMHgwMgorI2RlZmluZQkJTFFJT1ZFUklfTkxRICAgIAkweDAxCisKKyNkZWZpbmUJQ0xSTFFJSU5UMSAgICAgIAkJMHg1MQorI2RlZmluZQkJQ0xSTFFJUEhBU0VfTFEgIAkweDgwCisjZGVmaW5lCQlDTFJMUUlQSEFTRV9OTFEgCTB4NDAKKyNkZWZpbmUJCUNMUkxJUUFCT1JUICAgICAJMHgyMAorI2RlZmluZQkJQ0xSTFFJQ1JDSV9MUSAgIAkweDEwCisjZGVmaW5lCQlDTFJMUUlDUkNJX05MUSAgCTB4MDgKKyNkZWZpbmUJCUNMUkxRSUJBRExRSSAgICAJMHgwNAorI2RlZmluZQkJQ0xSTFFJT1ZFUklfTFEgIAkweDAyCisjZGVmaW5lCQlDTFJMUUlPVkVSSV9OTFEgCTB4MDEKKworI2RlZmluZQlMUUlTVEFUMiAgICAgICAgCQkweDUyCisjZGVmaW5lCQlQQUNLRVRJWkVEICAgICAgCTB4ODAKKyNkZWZpbmUJCUxRSVBIQVNFX09VVFBLVCAJMHg0MAorI2RlZmluZQkJTFFJV09SS09OTFEgICAgIAkweDIwCisjZGVmaW5lCQlMUUlXQUlURklGTyAgICAgCTB4MTAKKyNkZWZpbmUJCUxRSVNUT1BQS1QgICAgICAJMHgwOAorI2RlZmluZQkJTFFJU1RPUExRICAgICAgIAkweDA0CisjZGVmaW5lCQlMUUlTVE9QQ01EICAgICAgCTB4MDIKKyNkZWZpbmUJCUxRSUdTQVZBSUwgICAgICAJMHgwMQorCisjZGVmaW5lCVNTVEFUMyAgICAgICAgICAJCTB4NTMKKyNkZWZpbmUJCU5UUkFNUEVSUiAgICAgICAJMHgwMgorI2RlZmluZQkJT1NSQU1QRVJSICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0lNT0RFMyAgICAgICAgIAkJMHg1MworI2RlZmluZQkJRU5OVFJBTVBFUlIgICAgIAkweDAyCisjZGVmaW5lCQlFTk9TUkFNUEVSUiAgICAgCTB4MDEKKworI2RlZmluZQlDTFJTSU5UMyAgICAgICAgCQkweDUzCisjZGVmaW5lCQlDTFJOVFJBTVBFUlIgICAgCTB4MDIKKyNkZWZpbmUJCUNMUk9TUkFNUEVSUiAgICAJMHgwMQorCisjZGVmaW5lCUxRT01PREUwICAgICAgICAJCTB4NTQKKyNkZWZpbmUJCUVOTFFPVEFSR1NDQlBFUlIJMHgxMAorI2RlZmluZQkJRU5MUU9TVE9QVDIgICAgIAkweDA4CisjZGVmaW5lCQlFTkxRT0FUTkxRICAgICAgCTB4MDQKKyNkZWZpbmUJCUVOTFFPQVROUEtUICAgICAJMHgwMgorI2RlZmluZQkJRU5MUU9UQ1JDICAgICAgIAkweDAxCisKKyNkZWZpbmUJTFFPU1RBVDAgICAgICAgIAkJMHg1NAorI2RlZmluZQkJTFFPVEFSR1NDQlBFUlIgIAkweDEwCisjZGVmaW5lCQlMUU9TVE9QVDIgICAgICAgCTB4MDgKKyNkZWZpbmUJCUxRT0FUTkxRICAgICAgICAJMHgwNAorI2RlZmluZQkJTFFPQVROUEtUICAgICAgIAkweDAyCisjZGVmaW5lCQlMUU9UQ1JDICAgICAgICAgCTB4MDEKKworI2RlZmluZQlDTFJMUU9JTlQwICAgICAgCQkweDU0CisjZGVmaW5lCQlDTFJMUU9UQVJHU0NCUEVSUgkweDEwCisjZGVmaW5lCQlDTFJMUU9TVE9QVDIgICAgCTB4MDgKKyNkZWZpbmUJCUNMUkxRT0FUTkxRICAgICAJMHgwNAorI2RlZmluZQkJQ0xSTFFPQVROUEtUICAgIAkweDAyCisjZGVmaW5lCQlDTFJMUU9UQ1JDICAgICAgCTB4MDEKKworI2RlZmluZQlMUU9TVEFUMSAgICAgICAgCQkweDU1CisjZGVmaW5lCQlMUU9JTklUU0NCUEVSUiAgCTB4MTAKKyNkZWZpbmUJCUxRT1NUT1BJMiAgICAgICAJMHgwOAorI2RlZmluZQkJTFFPQkFEUUFTICAgICAgIAkweDA0CisjZGVmaW5lCQlMUU9CVVNGUkVFICAgICAgCTB4MDIKKyNkZWZpbmUJCUxRT1BIQUNIR0lOUEtUICAJMHgwMQorCisjZGVmaW5lCUNMUkxRT0lOVDEgICAgICAJCTB4NTUKKyNkZWZpbmUJCUNMUkxRT0lOSVRTQ0JQRVJSCTB4MTAKKyNkZWZpbmUJCUNMUkxRT1NUT1BJMiAgICAJMHgwOAorI2RlZmluZQkJQ0xSTFFPQkFEUUFTICAgIAkweDA0CisjZGVmaW5lCQlDTFJMUU9CVVNGUkVFICAgCTB4MDIKKyNkZWZpbmUJCUNMUkxRT1BIQUNIR0lOUEtUCTB4MDEKKworI2RlZmluZQlMUU9NT0RFMSAgICAgICAgCQkweDU1CisjZGVmaW5lCQlFTkxRT0lOSVRTQ0JQRVJSCTB4MTAKKyNkZWZpbmUJCUVOTFFPU1RPUEkyICAgICAJMHgwOAorI2RlZmluZQkJRU5MUU9CQURRQVMgICAgIAkweDA0CisjZGVmaW5lCQlFTkxRT0JVU0ZSRUUgICAgCTB4MDIKKyNkZWZpbmUJCUVOTFFPUEhBQ0hHSU5QS1QJMHgwMQorCisjZGVmaW5lCUxRT1NUQVQyICAgICAgICAJCTB4NTYKKyNkZWZpbmUJCUxRT1BLVCAgICAgICAgICAJMHhlMAorI2RlZmluZQkJTFFPV0FJVEZJRk8gICAgIAkweDEwCisjZGVmaW5lCQlMUU9QSEFDSEdPVVRQS1QgCTB4MDIKKyNkZWZpbmUJCUxRT1NUT1AwICAgICAgICAJMHgwMQorCisjZGVmaW5lCU9TX1NQQUNFX0NOVCAgICAJCTB4NTYKKworI2RlZmluZQlTSU1PREUxICAgICAgICAgCQkweDU3CisjZGVmaW5lCQlFTlNFTFRJTU8gICAgICAgCTB4ODAKKyNkZWZpbmUJCUVOQVROVEFSRyAgICAgICAJMHg0MAorI2RlZmluZQkJRU5TQ1NJUlNUICAgICAgIAkweDIwCisjZGVmaW5lCQlFTlBIQVNFTUlTICAgICAgCTB4MTAKKyNkZWZpbmUJCUVOQlVTRlJFRSAgICAgICAJMHgwOAorI2RlZmluZQkJRU5TQ1NJUEVSUiAgICAgIAkweDA0CisjZGVmaW5lCQlFTlNUUkIyRkFTVCAgICAgCTB4MDIKKyNkZWZpbmUJCUVOUkVRSU5JVCAgICAgICAJMHgwMQorCisjZGVmaW5lCUdTRklGTyAgICAgICAgICAJCTB4NTgKKworI2RlZmluZQlERkZTWEZSQ1RMICAgICAgCQkweDVhCisjZGVmaW5lCQlERkZCSVRCVUNLRVQgICAgCTB4MDgKKyNkZWZpbmUJCUNMUlNIQ05UICAgICAgICAJMHgwNAorI2RlZmluZQkJQ0xSQ0hOICAgICAgICAgIAkweDAyCisjZGVmaW5lCQlSU1RDSE4gICAgICAgICAgCTB4MDEKKworI2RlZmluZQlMUU9TQ1NDVEwgICAgICAgCQkweDVhCisjZGVmaW5lCQlMUU9IMkFfVkVSU0lPTiAgCTB4ODAKKyNkZWZpbmUJCUxRT05PQ0hLT1ZFUiAgICAJMHgwMQorCisjZGVmaW5lCU5FWFRTQ0IgICAgICAgICAJCTB4NWEKKworI2RlZmluZQlDTFJTRVFJTlRTUkMgICAgCQkweDViCisjZGVmaW5lCQlDTFJDVFhURE9ORSAgICAgCTB4NDAKKyNkZWZpbmUJCUNMUlNBVkVQVFJTICAgICAJMHgyMAorI2RlZmluZQkJQ0xSQ0ZHNERBVEEgICAgIAkweDEwCisjZGVmaW5lCQlDTFJDRkc0SVNUQVQgICAgCTB4MDgKKyNkZWZpbmUJCUNMUkNGRzRUU1RBVCAgICAJMHgwNAorI2RlZmluZQkJQ0xSQ0ZHNElDTUQgICAgIAkweDAyCisjZGVmaW5lCQlDTFJDRkc0VENNRCAgICAgCTB4MDEKKworI2RlZmluZQlTRVFJTlRTUkMgICAgICAgCQkweDViCisjZGVmaW5lCQlDVFhURE9ORSAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVNBVkVQVFJTICAgICAgICAJMHgyMAorI2RlZmluZQkJQ0ZHNERBVEEgICAgICAgIAkweDEwCisjZGVmaW5lCQlDRkc0SVNUQVQgICAgICAgCTB4MDgKKyNkZWZpbmUJCUNGRzRUU1RBVCAgICAgICAJMHgwNAorI2RlZmluZQkJQ0ZHNElDTUQgICAgICAgIAkweDAyCisjZGVmaW5lCQlDRkc0VENNRCAgICAgICAgCTB4MDEKKworI2RlZmluZQlDVVJSU0NCICAgICAgICAgCQkweDVjCisKKyNkZWZpbmUJU0VRSU1PREUgICAgICAgIAkJMHg1YworI2RlZmluZQkJRU5DVFhURE9ORSAgICAgIAkweDQwCisjZGVmaW5lCQlFTlNBVkVQVFJTICAgICAgCTB4MjAKKyNkZWZpbmUJCUVOQ0ZHNERBVEEgICAgICAJMHgxMAorI2RlZmluZQkJRU5DRkc0SVNUQVQgICAgIAkweDA4CisjZGVmaW5lCQlFTkNGRzRUU1RBVCAgICAgCTB4MDQKKyNkZWZpbmUJCUVOQ0ZHNElDTUQgICAgICAJMHgwMgorI2RlZmluZQkJRU5DRkc0VENNRCAgICAgIAkweDAxCisKKyNkZWZpbmUJTURGRlNUQVQgICAgICAgIAkJMHg1ZAorI2RlZmluZQkJU0hDTlRORUdBVElWRSAgIAkweDQwCisjZGVmaW5lCQlTSENOVE1JTlVTMSAgICAgCTB4MjAKKyNkZWZpbmUJCUxBU1RTRE9ORSAgICAgICAJMHgxMAorI2RlZmluZQkJU0hWQUxJRCAgICAgICAgIAkweDA4CisjZGVmaW5lCQlETFpFUk8gICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCURBVEFJTkZJRk8gICAgICAJMHgwMgorI2RlZmluZQkJRklGT0ZSRUUgICAgICAgIAkweDAxCisKKyNkZWZpbmUJQ1JDQ09OVFJPTCAgICAgIAkJMHg1ZAorI2RlZmluZQkJQ1JDVkFMQ0hLRU4gICAgIAkweDQwCisKKyNkZWZpbmUJREZGVEFHICAgICAgICAgIAkJMHg1ZQorCisjZGVmaW5lCUxBU1RTQ0IgICAgICAgICAJCTB4NWUKKworI2RlZmluZQlTQ1NJVEVTVCAgICAgICAgCQkweDVlCisjZGVmaW5lCQlDTlRSVEVTVCAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVNFTF9UWFBMTF9ERUJVRyAJMHgwNAorCisjZGVmaW5lCUlPUEROQ1RMICAgICAgICAJCTB4NWYKKyNkZWZpbmUJCURJU0FCTEVfT0UgICAgICAJMHg4MAorI2RlZmluZQkJUEROX0lESVNUICAgICAgIAkweDA0CisjZGVmaW5lCQlQRE5fRElGRlNFTlNFICAgCTB4MDEKKworI2RlZmluZQlTSEFERFIgICAgICAgICAgCQkweDYwCisKKyNkZWZpbmUJTkVHT0FERFIgICAgICAgIAkJMHg2MAorCisjZGVmaW5lCURHUlBDUkNJICAgICAgICAJCTB4NjAKKworI2RlZmluZQlORUdQRVJJT0QgICAgICAgCQkweDYxCisKKyNkZWZpbmUJUEFDS0NSQ0kgICAgICAgIAkJMHg2MgorCisjZGVmaW5lCU5FR09GRlNFVCAgICAgICAJCTB4NjIKKworI2RlZmluZQlORUdQUFJPUFRTICAgICAgCQkweDYzCisjZGVmaW5lCQlQUFJPUFRfUEFDRSAgICAgCTB4MDgKKyNkZWZpbmUJCVBQUk9QVF9RQVMgICAgICAJMHgwNAorI2RlZmluZQkJUFBST1BUX0RUICAgICAgIAkweDAyCisjZGVmaW5lCQlQUFJPUFRfSVVUICAgICAgCTB4MDEKKworI2RlZmluZQlORUdDT05PUFRTICAgICAgCQkweDY0CisjZGVmaW5lCQlFTlNOQVBTSE9UICAgICAgCTB4NDAKKyNkZWZpbmUJCVJUSV9XUlRESVMgICAgICAJMHgyMAorI2RlZmluZQkJUlRJX09WUkRUUk4gICAgIAkweDEwCisjZGVmaW5lCQlFTlNMT1dDUkMgICAgICAgCTB4MDgKKyNkZWZpbmUJCUVOQVVUT0FUTkkgICAgICAJMHgwNAorI2RlZmluZQkJRU5BVVRPQVROTyAgICAgIAkweDAyCisjZGVmaW5lCQlXSURFWEZFUiAgICAgICAgCTB4MDEKKworI2RlZmluZQlBTk5FWENPTCAgICAgICAgCQkweDY1CisKKyNkZWZpbmUJU0NTQ0hLTiAgICAgICAgIAkJMHg2NgorI2RlZmluZQkJU1RTRUxTS0lERElTICAgIAkweDQwCisjZGVmaW5lCQlDVVJSRklGT0RFRiAgICAgCTB4MjAKKyNkZWZpbmUJCVdJREVSRVNFTiAgICAgICAJMHgxMAorI2RlZmluZQkJU0RPTkVNU0tESVMgICAgIAkweDA4CisjZGVmaW5lCQlERkZBQ1RDTFIgICAgICAgCTB4MDQKKyNkZWZpbmUJCVNIVkFMSURTVERJUyAgICAJMHgwMgorI2RlZmluZQkJTFNUU0dDTFJESVMgICAgIAkweDAxCisKKyNkZWZpbmUJQU5ORVhEQVQgICAgICAgIAkJMHg2NgorCisjZGVmaW5lCUlPV05JRCAgICAgICAgICAJCTB4NjcKKworI2RlZmluZQlQTEw5NjBDVEwwICAgICAgCQkweDY4CisKKyNkZWZpbmUJU0hDTlQgICAgICAgICAgIAkJMHg2OAorCisjZGVmaW5lCVRPV05JRCAgICAgICAgICAJCTB4NjkKKworI2RlZmluZQlQTEw5NjBDVEwxICAgICAgCQkweDY5CisKKyNkZWZpbmUJUExMOTYwQ05UMCAgICAgIAkJMHg2YQorCisjZGVmaW5lCVhTSUcgICAgICAgICAgICAJCTB4NmEKKworI2RlZmluZQlTRUxPSUQgICAgICAgICAgCQkweDZiCisKKyNkZWZpbmUJUExMNDAwQ1RMMCAgICAgIAkJMHg2YworI2RlZmluZQkJUExMX1ZDT1NFTCAgICAgIAkweDgwCisjZGVmaW5lCQlQTExfUFdETiAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVBMTF9OUyAgICAgICAgICAJMHgzMAorI2RlZmluZQkJUExMX0VOTFVEICAgICAgIAkweDA4CisjZGVmaW5lCQlQTExfRU5MUEYgICAgICAgCTB4MDQKKyNkZWZpbmUJCVBMTF9ETFBGICAgICAgICAJMHgwMgorI2RlZmluZQkJUExMX0VORkJNICAgICAgIAkweDAxCisKKyNkZWZpbmUJRkFJUk5FU1MgICAgICAgIAkJMHg2YworCisjZGVmaW5lCVBMTDQwMENUTDEgICAgICAJCTB4NmQKKyNkZWZpbmUJCVBMTF9DTlRFTiAgICAgICAJMHg4MAorI2RlZmluZQkJUExMX0NOVENMUiAgICAgIAkweDQwCisjZGVmaW5lCQlQTExfUlNUICAgICAgICAgCTB4MDEKKworI2RlZmluZQlQTEw0MDBDTlQwICAgICAgCQkweDZlCisKKyNkZWZpbmUJVU5GQUlSTkVTUyAgICAgIAkJMHg2ZQorCisjZGVmaW5lCUhBRERSICAgICAgICAgICAJCTB4NzAKKworI2RlZmluZQlQTExERUxBWSAgICAgICAgCQkweDcwCisjZGVmaW5lCQlTUExJVF9EUk9QX1JFUSAgCTB4ODAKKworI2RlZmluZQlIT0RNQUFEUiAgICAgICAgCQkweDcwCisKKyNkZWZpbmUJSE9ETUFDTlQgICAgICAgIAkJMHg3OAorCisjZGVmaW5lCUhDTlQgICAgICAgICAgICAJCTB4NzgKKworI2RlZmluZQlIT0RNQUVOICAgICAgICAgCQkweDdhCisKKyNkZWZpbmUJU0dIQUREUiAgICAgICAgIAkJMHg3YworCisjZGVmaW5lCVNDQkhBRERSICAgICAgICAJCTB4N2MKKworI2RlZmluZQlTR0hDTlQgICAgICAgICAgCQkweDg0CisKKyNkZWZpbmUJU0NCSENOVCAgICAgICAgIAkJMHg4NAorCisjZGVmaW5lCURGRl9USFJTSCAgICAgICAJCTB4ODgKKyNkZWZpbmUJCVdSX0RGVEhSU0ggICAgICAJMHg3MAorI2RlZmluZQkJUkRfREZUSFJTSCAgICAgIAkweDA3CisjZGVmaW5lCQlXUl9ERlRIUlNIX01BWCAgCTB4NzAKKyNkZWZpbmUJCVdSX0RGVEhSU0hfOTAgICAJMHg2MAorI2RlZmluZQkJV1JfREZUSFJTSF84NSAgIAkweDUwCisjZGVmaW5lCQlXUl9ERlRIUlNIXzc1ICAgCTB4NDAKKyNkZWZpbmUJCVdSX0RGVEhSU0hfNjMgICAJMHgzMAorI2RlZmluZQkJV1JfREZUSFJTSF81MCAgIAkweDIwCisjZGVmaW5lCQlXUl9ERlRIUlNIXzI1ICAgCTB4MTAKKyNkZWZpbmUJCVJEX0RGVEhSU0hfTUFYICAJMHgwNworI2RlZmluZQkJUkRfREZUSFJTSF85MCAgIAkweDA2CisjZGVmaW5lCQlSRF9ERlRIUlNIXzg1ICAgCTB4MDUKKyNkZWZpbmUJCVJEX0RGVEhSU0hfNzUgICAJMHgwNAorI2RlZmluZQkJUkRfREZUSFJTSF82MyAgIAkweDAzCisjZGVmaW5lCQlSRF9ERlRIUlNIXzUwICAgCTB4MDIKKyNkZWZpbmUJCVJEX0RGVEhSU0hfMjUgICAJMHgwMQorI2RlZmluZQkJV1JfREZUSFJTSF9NSU4gIAkweDAwCisjZGVmaW5lCQlSRF9ERlRIUlNIX01JTiAgCTB4MDAKKworI2RlZmluZQlST01BRERSICAgICAgICAgCQkweDhhCisKKyNkZWZpbmUJUk9NQ05UUkwgICAgICAgIAkJMHg4ZAorI2RlZmluZQkJUk9NT1AgICAgICAgICAgIAkweGUwCisjZGVmaW5lCQlST01TUEQgICAgICAgICAgCTB4MTgKKyNkZWZpbmUJCVJFUEVBVCAgICAgICAgICAJMHgwMgorI2RlZmluZQkJUkRZICAgICAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJUk9NREFUQSAgICAgICAgIAkJMHg4ZQorCisjZGVmaW5lCUNNQ1JYTVNHMCAgICAgICAJCTB4OTAKKworI2RlZmluZQlST0VOQUJMRSAgICAgICAgCQkweDkwCisjZGVmaW5lCQlNU0lST0VOICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCU9WTFlST0VOICAgICAgICAJMHgxMAorI2RlZmluZQkJQ01DUk9FTiAgICAgICAgIAkweDA4CisjZGVmaW5lCQlTR1JPRU4gICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCURDSDFST0VOICAgICAgICAJMHgwMgorI2RlZmluZQkJRENIMFJPRU4gICAgICAgIAkweDAxCisKKyNkZWZpbmUJT1ZMWVJYTVNHMCAgICAgIAkJMHg5MAorCisjZGVmaW5lCURDSFJYTVNHMCAgICAgICAJCTB4OTAKKworI2RlZmluZQlPVkxZUlhNU0cxICAgICAgCQkweDkxCisKKyNkZWZpbmUJTlNFTkFCTEUgICAgICAgIAkJMHg5MQorI2RlZmluZQkJTVNJTlNFTiAgICAgICAgIAkweDIwCisjZGVmaW5lCQlPVkxZTlNFTiAgICAgICAgCTB4MTAKKyNkZWZpbmUJCUNNQ05TRU4gICAgICAgICAJMHgwOAorI2RlZmluZQkJU0dOU0VOICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlEQ0gxTlNFTiAgICAgICAgCTB4MDIKKyNkZWZpbmUJCURDSDBOU0VOICAgICAgICAJMHgwMQorCisjZGVmaW5lCURDSFJYTVNHMSAgICAgICAJCTB4OTEKKworI2RlZmluZQlDTUNSWE1TRzEgICAgICAgCQkweDkxCisKKyNkZWZpbmUJRENIUlhNU0cyICAgICAgIAkJMHg5MgorCisjZGVmaW5lCU9WTFlSWE1TRzIgICAgICAJCTB4OTIKKworI2RlZmluZQlDTUNSWE1TRzIgICAgICAgCQkweDkyCisKKyNkZWZpbmUJT1NUICAgICAgICAgICAgIAkJMHg5MgorCisjZGVmaW5lCURDSFJYTVNHMyAgICAgICAJCTB4OTMKKworI2RlZmluZQlDTUNSWE1TRzMgICAgICAgCQkweDkzCisKKyNkZWZpbmUJUENJWENUTCAgICAgICAgIAkJMHg5MworI2RlZmluZQkJU0VSUlBVTFNFICAgICAgIAkweDgwCisjZGVmaW5lCQlVTkVYUFNDSUVOICAgICAgCTB4MjAKKyNkZWZpbmUJCVNQTFRTTUFESVMgICAgICAJMHgxMAorI2RlZmluZQkJU1BMVFNUQURJUyAgICAgIAkweDA4CisjZGVmaW5lCQlTUlNQRFBFRU4gICAgICAgCTB4MDQKKyNkZWZpbmUJCVRTQ1NFUlJFTiAgICAgICAJMHgwMgorI2RlZmluZQkJQ01QQUJDRElTICAgICAgIAkweDAxCisKKyNkZWZpbmUJT1ZMWVJYTVNHMyAgICAgIAkJMHg5MworCisjZGVmaW5lCU9WTFlTRVFCQ05UICAgICAJCTB4OTQKKworI2RlZmluZQlDTUNTRVFCQ05UICAgICAgCQkweDk0CisKKyNkZWZpbmUJRENIU0VRQkNOVCAgICAgIAkJMHg5NAorCisjZGVmaW5lCUNNQ1NQTFRTVEFUMCAgICAJCTB4OTYKKworI2RlZmluZQlPVkxZU1BMVFNUQVQwICAgCQkweDk2CisKKyNkZWZpbmUJRENIU1BMVFNUQVQwICAgIAkJMHg5NgorCisjZGVmaW5lCURDSFNQTFRTVEFUMSAgICAJCTB4OTcKKworI2RlZmluZQlDTUNTUExUU1RBVDEgICAgCQkweDk3CisKKyNkZWZpbmUJT1ZMWVNQTFRTVEFUMSAgIAkJMHg5NworCisjZGVmaW5lCVNHUlhNU0cwICAgICAgICAJCTB4OTgKKyNkZWZpbmUJCUNETlVNICAgICAgICAgICAJMHhmOAorI2RlZmluZQkJQ0ZOVU0gICAgICAgICAgIAkweDA3CisKKyNkZWZpbmUJU0xWU1BMVE9VVEFEUjAgIAkJMHg5OAorI2RlZmluZQkJTE9XRVJfQUREUiAgICAgIAkweDdmCisKKyNkZWZpbmUJU0dSWE1TRzEgICAgICAgIAkJMHg5OQorI2RlZmluZQkJQ0JOVU0gICAgICAgICAgIAkweGZmCisKKyNkZWZpbmUJU0xWU1BMVE9VVEFEUjEgIAkJMHg5OQorI2RlZmluZQkJUkVRX0ROVU0gICAgICAgIAkweGY4CisjZGVmaW5lCQlSRVFfRk5VTSAgICAgICAgCTB4MDcKKworI2RlZmluZQlTR1JYTVNHMiAgICAgICAgCQkweDlhCisjZGVmaW5lCQlNSU5ERVggICAgICAgICAgCTB4ZmYKKworI2RlZmluZQlTTFZTUExUT1VUQURSMiAgCQkweDlhCisjZGVmaW5lCQlSRVFfQk5VTSAgICAgICAgCTB4ZmYKKworI2RlZmluZQlTR1JYTVNHMyAgICAgICAgCQkweDliCisjZGVmaW5lCQlNQ0xBU1MgICAgICAgICAgCTB4MGYKKworI2RlZmluZQlTTFZTUExUT1VUQURSMyAgCQkweDliCisjZGVmaW5lCQlUQUdfTlVNICAgICAgICAgCTB4MWYKKyNkZWZpbmUJCVJMWE9SRCAgICAgICAgICAJMHgxMAorCisjZGVmaW5lCVNHU0VRQkNOVCAgICAgICAJCTB4OWMKKworI2RlZmluZQlTTFZTUExUT1VUQVRUUjAgCQkweDljCisjZGVmaW5lCQlMT1dFUl9CQ05UICAgICAgCTB4ZmYKKworI2RlZmluZQlTTFZTUExUT1VUQVRUUjEgCQkweDlkCisjZGVmaW5lCQlDTVBMVF9ETlVNICAgICAgCTB4ZjgKKyNkZWZpbmUJCUNNUExUX0ZOVU0gICAgICAJMHgwNworCisjZGVmaW5lCVNMVlNQTFRPVVRBVFRSMiAJCTB4OWUKKyNkZWZpbmUJCUNNUExUX0JOVU0gICAgICAJMHhmZgorCisjZGVmaW5lCVNHU1BMVFNUQVQwICAgICAJCTB4OWUKKyNkZWZpbmUJCVNUQUVURVJNICAgICAgICAJMHg4MAorI2RlZmluZQkJU0NCQ0VSUiAgICAgICAgIAkweDQwCisjZGVmaW5lCQlTQ0FERVJSICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVNDREFUQlVDS0VUICAgICAJMHgxMAorI2RlZmluZQkJQ05UTk9UQ01QTFQgICAgIAkweDA4CisjZGVmaW5lCQlSWE9WUlVOICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVJYU0NFTVNHICAgICAgICAJMHgwMgorI2RlZmluZQkJUlhTUExUUlNQICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0ZVTkNUICAgICAgICAgIAkJMHg5ZgorI2RlZmluZQkJVEVTVF9HUk9VUCAgICAgIAkweGYwCisjZGVmaW5lCQlURVNUX05VTSAgICAgICAgCTB4MGYKKworI2RlZmluZQlTR1NQTFRTVEFUMSAgICAgCQkweDlmCisjZGVmaW5lCQlSWERBVEFCVUNLRVQgICAgCTB4MDEKKworI2RlZmluZQlERjBQQ0lTVEFUICAgICAgCQkweGEwCisKKyNkZWZpbmUJUkVHMCAgICAgICAgICAgIAkJMHhhMAorCisjZGVmaW5lCURGMVBDSVNUQVQgICAgICAJCTB4YTEKKworI2RlZmluZQlTR1BDSVNUQVQgICAgICAgCQkweGEyCisKKyNkZWZpbmUJUkVHMSAgICAgICAgICAgIAkJMHhhMgorCisjZGVmaW5lCUNNQ1BDSVNUQVQgICAgICAJCTB4YTMKKworI2RlZmluZQlPVkxZUENJU1RBVCAgICAgCQkweGE0CisjZGVmaW5lCQlTQ0FBUEVSUiAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVJEUEVSUiAgICAgICAgICAJMHgwNAorCisjZGVmaW5lCVJFR19JU1IgICAgICAgICAJCTB4YTQKKworI2RlZmluZQlTR19TVEFURSAgICAgICAgCQkweGE2CisjZGVmaW5lCQlGRVRDSF9JTlBST0cgICAgCTB4MDQKKyNkZWZpbmUJCUxPQURJTkdfTkVFREVEICAJMHgwMgorI2RlZmluZQkJU0VHU19BVkFJTCAgICAgIAkweDAxCisKKyNkZWZpbmUJTVNJUENJU1RBVCAgICAgIAkJMHhhNgorI2RlZmluZQkJUk1BICAgICAgICAgICAgIAkweDIwCisjZGVmaW5lCQlSVEEgICAgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCUNMUlBFTkRNU0kgICAgICAJMHgwOAorI2RlZmluZQkJRFBSICAgICAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJVEFSR1BDSVNUQVQgICAgIAkJMHhhNworI2RlZmluZQkJRFBFICAgICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlTU0UgICAgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVNUQSAgICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJVFdBVEVSUiAgICAgICAgIAkweDAyCisKKyNkZWZpbmUJREFUQV9DT1VOVF9PREQgIAkJMHhhNworCisjZGVmaW5lCVNDQlBUUiAgICAgICAgICAJCTB4YTgKKworI2RlZmluZQlDQ1NDQkFDTlQgICAgICAgCQkweGFiCisKKyNkZWZpbmUJU0NCQVVUT1BUUiAgICAgIAkJMHhhYgorI2RlZmluZQkJQVVTQ0JQVFJfRU4gICAgIAkweDgwCisjZGVmaW5lCQlTQ0JQVFJfQUREUiAgICAgCTB4MzgKKyNkZWZpbmUJCVNDQlBUUl9PRkYgICAgICAJMHgwNworCisjZGVmaW5lCUNDU0dBRERSICAgICAgICAJCTB4YWMKKworI2RlZmluZQlDQ1NDQkFERFIgICAgICAgCQkweGFjCisKKyNkZWZpbmUJQ0NTQ0JBRFJfQksgICAgIAkJMHhhYworCisjZGVmaW5lCUNNQ19SQU1CSVNUICAgICAJCTB4YWQKKyNkZWZpbmUJCVNHX0VMRU1FTlRfU0laRSAJMHg4MAorI2RlZmluZQkJU0NCUkFNQklTVF9GQUlMIAkweDQwCisjZGVmaW5lCQlTR19CSVNUX0ZBSUwgICAgCTB4MjAKKyNkZWZpbmUJCVNHX0JJU1RfRU4gICAgICAJMHgxMAorI2RlZmluZQkJQ01DX0JVRkZFUl9CSVNUX0ZBSUwJMHgwMgorI2RlZmluZQkJQ01DX0JVRkZFUl9CSVNUX0VOCTB4MDEKKworI2RlZmluZQlDQ1NHQ1RMICAgICAgICAgCQkweGFkCisjZGVmaW5lCQlDQ1NHRU4gICAgICAgICAgCTB4MGMKKyNkZWZpbmUJCUNDU0dET05FICAgICAgICAJMHg4MAorI2RlZmluZQkJU0dfQ0FDSEVfQVZBSUwgIAkweDEwCisjZGVmaW5lCQlDQ1NHRU5BQ0sgICAgICAgCTB4MDgKKyNkZWZpbmUJCVNHX0ZFVENIX1JFUSAgICAJMHgwMgorI2RlZmluZQkJQ0NTR1JFU0VUICAgICAgIAkweDAxCisKKyNkZWZpbmUJQ0NTQ0JDVEwgICAgICAgIAkJMHhhZAorI2RlZmluZQkJQ0NTQ0JET05FICAgICAgIAkweDgwCisjZGVmaW5lCQlBUlJET05FICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUNDQVJSRU4gICAgICAgICAJMHgxMAorI2RlZmluZQkJQ0NTQ0JFTiAgICAgICAgIAkweDA4CisjZGVmaW5lCQlDQ1NDQkRJUiAgICAgICAgCTB4MDQKKyNkZWZpbmUJCUNDU0NCUkVTRVQgICAgICAJMHgwMQorCisjZGVmaW5lCUNDU0dSQU0gICAgICAgICAJCTB4YjAKKworI2RlZmluZQlGTEVYQURSICAgICAgICAgCQkweGIwCisKKyNkZWZpbmUJQ0NTQ0JSQU0gICAgICAgIAkJMHhiMAorCisjZGVmaW5lCUZMRVhDTlQgICAgICAgICAJCTB4YjMKKworI2RlZmluZQlGTEVYRE1BU1RBVCAgICAgCQkweGI1CisjZGVmaW5lCQlGTEVYRE1BRVJSICAgICAgCTB4MDIKKyNkZWZpbmUJCUZMRVhETUFET05FICAgICAJMHgwMQorCisjZGVmaW5lCUZMRVhEQVRBICAgICAgICAJCTB4YjYKKworI2RlZmluZQlCUkREQVQgICAgICAgICAgCQkweGI4CisKKyNkZWZpbmUJQlJEQ1RMICAgICAgICAgIAkJMHhiOQorI2RlZmluZQkJRkxYQVJCQUNLICAgICAgIAkweDgwCisjZGVmaW5lCQlGTFhBUkJSRVEgICAgICAgCTB4NDAKKyNkZWZpbmUJCUJSREFERFIgICAgICAgICAJMHgzOAorI2RlZmluZQkJQlJERU4gICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlCUkRSVyAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUJSRFNUQiAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNFRUFEUiAgICAgICAgICAJCTB4YmEKKworI2RlZmluZQlTRUVEQVQgICAgICAgICAgCQkweGJjCisKKyNkZWZpbmUJU0VFQ1RMICAgICAgICAgIAkJMHhiZQorI2RlZmluZQkJU0VFT1BfRVdFTiAgICAgIAkweDQwCisjZGVmaW5lCQlTRUVPUF9XQUxMICAgICAgCTB4NDAKKyNkZWZpbmUJCVNFRU9QX0VXRFMgICAgICAJMHg0MAorI2RlZmluZQkJU0VFT1BDT0RFICAgICAgIAkweDcwCisjZGVmaW5lCQlTRUVSU1QgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCVNFRVNUQVJUICAgICAgICAJMHgwMQorI2RlZmluZQkJU0VFT1BfRVJBU0UgICAgIAkweDcwCisjZGVmaW5lCQlTRUVPUF9SRUFEICAgICAgCTB4NjAKKyNkZWZpbmUJCVNFRU9QX1dSSVRFICAgICAJMHg1MAorI2RlZmluZQkJU0VFT1BfRVJBTCAgICAgIAkweDQwCisKKyNkZWZpbmUJU0VFU1RBVCAgICAgICAgIAkJMHhiZQorI2RlZmluZQkJSU5JVF9ET05FICAgICAgIAkweDgwCisjZGVmaW5lCQlMREFMVElEX0wgICAgICAgCTB4MDgKKyNkZWZpbmUJCVNFRUFSQkFDSyAgICAgICAJMHgwNAorI2RlZmluZQkJU0VFQlVTWSAgICAgICAgIAkweDAyCisKKyNkZWZpbmUJU0NCQ05UICAgICAgICAgIAkJMHhiZgorCisjZGVmaW5lCURGV0FERFIgICAgICAgICAJCTB4YzAKKworI2RlZmluZQlEU1BGTFRSQ1RMICAgICAgCQkweGMwCisjZGVmaW5lCQlGTFRSRElTQUJMRSAgICAgCTB4MjAKKyNkZWZpbmUJCUVER0VTRU5TRSAgICAgICAJMHgxMAorI2RlZmluZQkJRFNQRkNOVFNFTCAgICAgIAkweDBmCisKKyNkZWZpbmUJRFNQREFUQUNUTCAgICAgIAkJMHhjMQorI2RlZmluZQkJQllQQVNTRU5BQiAgICAgIAkweDgwCisjZGVmaW5lCQlERVNRRElTICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCVJDVlJPRkZTVERJUyAgICAJMHgwNAorI2RlZmluZQkJWE1JVE9GRlNURElTICAgIAkweDAyCisKKyNkZWZpbmUJREZSQUREUiAgICAgICAgIAkJMHhjMgorCisjZGVmaW5lCURTUFJFUUNUTCAgICAgICAJCTB4YzIKKyNkZWZpbmUJCU1BTlJFUUNUTCAgICAgICAJMHhjMAorI2RlZmluZQkJTUFOUkVRRExZICAgICAgIAkweDNmCisKKyNkZWZpbmUJRFNQQUNLQ1RMICAgICAgIAkJMHhjMworI2RlZmluZQkJTUFOQUNLQ1RMICAgICAgIAkweGMwCisjZGVmaW5lCQlNQU5BQ0tETFkgICAgICAgCTB4M2YKKworI2RlZmluZQlERkRBVCAgICAgICAgICAgCQkweGM0CisKKyNkZWZpbmUJRFNQU0VMRUNUICAgICAgIAkJMHhjNAorI2RlZmluZQkJQVVUT0lOQ0VOICAgICAgIAkweDgwCisjZGVmaW5lCQlEU1BTRUwgICAgICAgICAgCTB4MWYKKworI2RlZmluZQlXUlRCSUFTQ1RMICAgICAgCQkweGM1CisjZGVmaW5lCQlBVVRPWEJDRElTICAgICAgCTB4ODAKKyNkZWZpbmUJCVhNSVRNQU5WQUwgICAgICAJMHgzZgorCisjZGVmaW5lCVJDVlJCSU9TQ1RMICAgICAJCTB4YzYKKyNkZWZpbmUJCUFVVE9SQkNESVMgICAgICAJMHg4MAorI2RlZmluZQkJUkNWUk1BTlZBTCAgICAgIAkweDNmCisKKyNkZWZpbmUJV1JUQklBU0NBTEMgICAgIAkJMHhjNworCisjZGVmaW5lCURGUFRSUyAgICAgICAgICAJCTB4YzgKKworI2RlZmluZQlSQ1ZSQklBU0NBTEMgICAgCQkweGM4CisKKyNkZWZpbmUJREZCS1BUUiAgICAgICAgIAkJMHhjOQorCisjZGVmaW5lCVNLRVdDQUxDICAgICAgICAJCTB4YzkKKworI2RlZmluZQlERkRCQ1RMICAgICAgICAgCQkweGNiCisjZGVmaW5lCQlERkZfQ0lPX1dSX1JEWSAgCTB4MjAKKyNkZWZpbmUJCURGRl9DSU9fUkRfUkRZICAJMHgxMAorI2RlZmluZQkJREZGX0RJUl9FUlIgICAgIAkweDA4CisjZGVmaW5lCQlERkZfUkFNQklTVF9GQUlMCTB4MDQKKyNkZWZpbmUJCURGRl9SQU1CSVNUX0RPTkUJMHgwMgorI2RlZmluZQkJREZGX1JBTUJJU1RfRU4gIAkweDAxCisKKyNkZWZpbmUJREZTQ05UICAgICAgICAgIAkJMHhjYworCisjZGVmaW5lCURGQkNOVCAgICAgICAgICAJCTB4Y2UKKworI2RlZmluZQlPVkxZQUREUiAgICAgICAgCQkweGQ0CisKKyNkZWZpbmUJU0VRQ1RMMCAgICAgICAgIAkJMHhkNgorI2RlZmluZQkJUEVSUk9SRElTICAgICAgIAkweDgwCisjZGVmaW5lCQlQQVVTRURJUyAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUZBSUxESVMgICAgICAgICAJMHgyMAorI2RlZmluZQkJRkFTVE1PREUgICAgICAgIAkweDEwCisjZGVmaW5lCQlCUktBRFJJTlRFTiAgICAgCTB4MDgKKyNkZWZpbmUJCVNURVAgICAgICAgICAgICAJMHgwNAorI2RlZmluZQkJU0VRUkVTRVQgICAgICAgIAkweDAyCisjZGVmaW5lCQlMT0FEUkFNICAgICAgICAgCTB4MDEKKworI2RlZmluZQlTRVFDVEwxICAgICAgICAgCQkweGQ3CisjZGVmaW5lCQlPVlJMQVlfREFUQV9DSEsgCTB4MDgKKyNkZWZpbmUJCVJBTUJJU1RfRE9ORSAgICAJMHgwNAorI2RlZmluZQkJUkFNQklTVF9GQUlMICAgIAkweDAyCisjZGVmaW5lCQlSQU1CSVNUX0VOICAgICAgCTB4MDEKKworI2RlZmluZQlGTEFHUyAgICAgICAgICAgCQkweGQ4CisjZGVmaW5lCQlaRVJPICAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUNBUlJZICAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNFUUlOVENUTCAgICAgICAJCTB4ZDkKKyNkZWZpbmUJCUlOVFZFQzFEU0wgICAgICAJMHg4MAorI2RlZmluZQkJSU5UMV9DT05URVhUICAgIAkweDIwCisjZGVmaW5lCQlTQ1NfU0VRX0lOVDFNMSAgCTB4MTAKKyNkZWZpbmUJCVNDU19TRVFfSU5UMU0wICAJMHgwOAorI2RlZmluZQkJSU5UTUFTSzIgICAgICAgIAkweDA0CisjZGVmaW5lCQlJTlRNQVNLMSAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUlSRVQgICAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNFUVJBTSAgICAgICAgICAJCTB4ZGEKKworI2RlZmluZQlQUkdNQ05UICAgICAgICAgCQkweGRlCisKKyNkZWZpbmUJQUNDVU0gICAgICAgICAgIAkJMHhlMAorCisjZGVmaW5lCVNJTkRFWCAgICAgICAgICAJCTB4ZTIKKworI2RlZmluZQlESU5ERVggICAgICAgICAgCQkweGU0CisKKyNkZWZpbmUJQlJLQUREUjEgICAgICAgIAkJMHhlNgorI2RlZmluZQkJQlJLRElTICAgICAgICAgIAkweDgwCisKKyNkZWZpbmUJQlJLQUREUjAgICAgICAgIAkJMHhlNgorCisjZGVmaW5lCUFMTE9ORVMgICAgICAgICAJCTB4ZTgKKworI2RlZmluZQlBTExaRVJPUyAgICAgICAgCQkweGVhCisKKyNkZWZpbmUJTk9ORSAgICAgICAgICAgIAkJMHhlYQorCisjZGVmaW5lCVNJTkRJUiAgICAgICAgICAJCTB4ZWMKKworI2RlZmluZQlESU5ESVIgICAgICAgICAgCQkweGVkCisKKyNkZWZpbmUJRlVOQ1RJT04xICAgICAgIAkJMHhmMAorCisjZGVmaW5lCVNUQUNLICAgICAgICAgICAJCTB4ZjIKKworI2RlZmluZQlDVVJBRERSICAgICAgICAgCQkweGY0CisKKyNkZWZpbmUJSU5UVkVDMV9BRERSICAgIAkJMHhmNAorCisjZGVmaW5lCUlOVFZFQzJfQUREUiAgICAJCTB4ZjYKKworI2RlZmluZQlMQVNUQUREUiAgICAgICAgCQkweGY2CisKKyNkZWZpbmUJTE9OR0pNUF9BRERSICAgIAkJMHhmOAorCisjZGVmaW5lCUFDQ1VNX1NBVkUgICAgICAJCTB4ZmEKKworI2RlZmluZQlXQUlUSU5HX1NDQl9UQUlMUwkJMHgxMDAKKworI2RlZmluZQlBSERfUENJX0NPTkZJR19CQVNFCQkweDEwMAorCisjZGVmaW5lCVNSQU1fQkFTRSAgICAgICAJCTB4MTAwCisKKyNkZWZpbmUJV0FJVElOR19USURfSEVBRAkJMHgxMjAKKworI2RlZmluZQlXQUlUSU5HX1RJRF9UQUlMCQkweDEyMgorCisjZGVmaW5lCU5FWFRfUVVFVUVEX1NDQl9BRERSCQkweDEyNAorCisjZGVmaW5lCUNPTVBMRVRFX1NDQl9IRUFECQkweDEyOAorCisjZGVmaW5lCUNPTVBMRVRFX1NDQl9ETUFJTlBST0dfSEVBRAkJMHgxMmEKKworI2RlZmluZQlDT01QTEVURV9ETUFfU0NCX0hFQUQJCTB4MTJjCisKKyNkZWZpbmUJUUZSRUVaRV9DT1VOVCAgIAkJMHgxMmUKKworI2RlZmluZQlTQVZFRF9NT0RFICAgICAgCQkweDEzMAorCisjZGVmaW5lCU1TR19PVVQgICAgICAgICAJCTB4MTMxCisKKyNkZWZpbmUJRE1BUEFSQU1TICAgICAgIAkJMHgxMzIKKyNkZWZpbmUJCVBSRUxPQURFTiAgICAgICAJMHg4MAorI2RlZmluZQkJV0lERU9ERCAgICAgICAgIAkweDQwCisjZGVmaW5lCQlTQ1NJRU4gICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVNETUFFTiAgICAgICAgICAJMHgxMAorI2RlZmluZQkJU0RNQUVOQUNLICAgICAgIAkweDEwCisjZGVmaW5lCQlIRE1BRU5BQ0sgICAgICAgCTB4MDgKKyNkZWZpbmUJCUhETUFFTiAgICAgICAgICAJMHgwOAorI2RlZmluZQkJRElSRUNUSU9OICAgICAgIAkweDA0CisjZGVmaW5lCQlGSUZPRkxVU0ggICAgICAgCTB4MDIKKyNkZWZpbmUJCUZJRk9SRVNFVCAgICAgICAJMHgwMQorCisjZGVmaW5lCVNFUV9GTEFHUyAgICAgICAJCTB4MTMzCisjZGVmaW5lCQlOT1RfSURFTlRJRklFRCAgCTB4ODAKKyNkZWZpbmUJCU5PX0NEQl9TRU5UICAgICAJMHg0MAorI2RlZmluZQkJVEFSR0VUX0NNRF9JU19UQUdHRUQJMHg0MAorI2RlZmluZQkJRFBIQVNFICAgICAgICAgIAkweDIwCisjZGVmaW5lCQlUQVJHX0NNRF9QRU5ESU5HCTB4MTAKKyNkZWZpbmUJCUNNRFBIQVNFX1BFTkRJTkcJMHgwOAorI2RlZmluZQkJRFBIQVNFX1BFTkRJTkcgIAkweDA0CisjZGVmaW5lCQlTUEhBU0VfUEVORElORyAgCTB4MDIKKyNkZWZpbmUJCU5PX0RJU0NPTk5FQ1QgICAJMHgwMQorCisjZGVmaW5lCVNBVkVEX1NDU0lJRCAgICAJCTB4MTM0CisKKyNkZWZpbmUJU0FWRURfTFVOICAgICAgIAkJMHgxMzUKKworI2RlZmluZQlMQVNUUEhBU0UgICAgICAgCQkweDEzNgorI2RlZmluZQkJUEhBU0VfTUFTSyAgICAgIAkweGUwCisjZGVmaW5lCQlDREkgICAgICAgICAgICAgCTB4ODAKKyNkZWZpbmUJCUlPSSAgICAgICAgICAgICAJMHg0MAorI2RlZmluZQkJTVNHSSAgICAgICAgICAgIAkweDIwCisjZGVmaW5lCQlQX0JVU0ZSRUUgICAgICAgCTB4MDEKKyNkZWZpbmUJCVBfTUVTR0lOICAgICAgICAJMHhlMAorI2RlZmluZQkJUF9TVEFUVVMgICAgICAgIAkweGMwCisjZGVmaW5lCQlQX01FU0dPVVQgICAgICAgCTB4YTAKKyNkZWZpbmUJCVBfQ09NTUFORCAgICAgICAJMHg4MAorI2RlZmluZQkJUF9EQVRBSU5fRFQgICAgIAkweDYwCisjZGVmaW5lCQlQX0RBVEFJTiAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVBfREFUQU9VVF9EVCAgICAJMHgyMAorI2RlZmluZQkJUF9EQVRBT1VUICAgICAgIAkweDAwCisKKyNkZWZpbmUJUU9VVEZJRk9fRU5UUllfVkFMSURfVEFHCQkweDEzNworCisjZGVmaW5lCVNIQVJFRF9EQVRBX0FERFIJCTB4MTM4CisKKyNkZWZpbmUJUU9VVEZJRk9fTkVYVF9BRERSCQkweDEzYworCisjZGVmaW5lCUtFUk5FTF9UUUlOUE9TICAJCTB4MTQwCisKKyNkZWZpbmUJVFFJTlBPUyAgICAgICAgIAkJMHgxNDEKKworI2RlZmluZQlBUkdfMSAgICAgICAgICAgCQkweDE0MgorI2RlZmluZQlSRVRVUk5fMSAgICAgICAgCQkweDE0MgorI2RlZmluZQkJU0VORF9NU0cgICAgICAgIAkweDgwCisjZGVmaW5lCQlTRU5EX1NFTlNFICAgICAgCTB4NDAKKyNkZWZpbmUJCVNFTkRfUkVKICAgICAgICAJMHgyMAorI2RlZmluZQkJTVNHT1VUX1BIQVNFTUlTIAkweDEwCisjZGVmaW5lCQlFWElUX01TR19MT09QICAgCTB4MDgKKyNkZWZpbmUJCUNPTlRfTVNHX0xPT1BfV1JJVEUJMHgwNAorI2RlZmluZQkJQ09OVF9NU0dfTE9PUF9SRUFECTB4MDMKKyNkZWZpbmUJCUNPTlRfTVNHX0xPT1BfVEFSRwkweDAyCisKKyNkZWZpbmUJQVJHXzIgICAgICAgICAgIAkJMHgxNDMKKyNkZWZpbmUJUkVUVVJOXzIgICAgICAgIAkJMHgxNDMKKworI2RlZmluZQlMQVNUX01TRyAgICAgICAgCQkweDE0NAorCisjZGVmaW5lCVNDU0lTRVFfVEVNUExBVEUJCTB4MTQ1CisjZGVmaW5lCQlNQU5VQUxDVEwgICAgICAgCTB4NDAKKyNkZWZpbmUJCUVOU0VMSSAgICAgICAgICAJMHgyMAorI2RlZmluZQkJRU5SU0VMSSAgICAgICAgIAkweDEwCisjZGVmaW5lCQlNQU5VQUxQICAgICAgICAgCTB4MGMKKyNkZWZpbmUJCUVOQVVUT0FUTlAgICAgICAJMHgwMgorI2RlZmluZQkJQUxUU1RJTSAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJSU5JVElBVE9SX1RBRyAgIAkJMHgxNDYKKworI2RlZmluZQlTRVFfRkxBR1MyICAgICAgCQkweDE0NworI2RlZmluZQkJU0VMRUNUT1VUX1FGUk9aRU4JMHgwNAorI2RlZmluZQkJVEFSR0VUX01TR19QRU5ESU5HCTB4MDIKKworI2RlZmluZQlBTExPQ0ZJRk9fU0NCUFRSCQkweDE0OAorCisjZGVmaW5lCUlOVF9DT0FMRVNDSU5HX1RJTUVSCQkweDE0YQorCisjZGVmaW5lCUlOVF9DT0FMRVNDSU5HX01BWENNRFMJCTB4MTRjCisKKyNkZWZpbmUJSU5UX0NPQUxFU0NJTkdfTUlOQ01EUwkJMHgxNGQKKworI2RlZmluZQlDTURTX1BFTkRJTkcgICAgCQkweDE0ZQorCisjZGVmaW5lCUlOVF9DT0FMRVNDSU5HX0NNRENPVU5UCQkweDE1MAorCisjZGVmaW5lCUxPQ0FMX0hTX01BSUxCT1gJCTB4MTUxCisKKyNkZWZpbmUJQ01EU0laRV9UQUJMRSAgIAkJMHgxNTIKKworI2RlZmluZQlTQ0JfQkFTRSAgICAgICAgCQkweDE4MAorCisjZGVmaW5lCVNDQl9SRVNJRFVBTF9EQVRBQ05UCQkweDE4MAorI2RlZmluZQlTQ0JfQ0RCX1NUT1JFICAgCQkweDE4MAorI2RlZmluZQlTQ0JfSE9TVF9DREJfUFRSCQkweDE4MAorCisjZGVmaW5lCVNDQl9SRVNJRFVBTF9TR1BUUgkJMHgxODQKKyNkZWZpbmUJCVNHX0FERFJfTUFTSyAgICAJMHhmOAorI2RlZmluZQkJU0dfT1ZFUlJVTl9SRVNJRAkweDAyCisKKyNkZWZpbmUJU0NCX1NDU0lfU1RBVFVTIAkJMHgxODgKKyNkZWZpbmUJU0NCX0hPU1RfQ0RCX0xFTgkJMHgxODgKKworI2RlZmluZQlTQ0JfVEFSR0VUX1BIQVNFUwkJMHgxODkKKworI2RlZmluZQlTQ0JfVEFSR0VUX0RBVEFfRElSCQkweDE4YQorCisjZGVmaW5lCVNDQl9UQVJHRVRfSVRBRyAJCTB4MThiCisKKyNkZWZpbmUJU0NCX1NFTlNFX0JVU0FERFIJCTB4MThjCisjZGVmaW5lCVNDQl9ORVhUX0NPTVBMRVRFCQkweDE4YworCisjZGVmaW5lCVNDQl9UQUcgICAgICAgICAJCTB4MTkwCisjZGVmaW5lCVNDQl9GSUZPX1VTRV9DT1VOVAkJMHgxOTAKKworI2RlZmluZQlTQ0JfQ09OVFJPTCAgICAgCQkweDE5MgorI2RlZmluZQkJVEFSR0VUX1NDQiAgICAgIAkweDgwCisjZGVmaW5lCQlESVNDRU5CICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVRBR19FTkIgICAgICAgICAJMHgyMAorI2RlZmluZQkJTUtfTUVTU0FHRSAgICAgIAkweDEwCisjZGVmaW5lCQlTVEFUVVNfUkNWRCAgICAgCTB4MDgKKyNkZWZpbmUJCURJU0NPTk5FQ1RFRCAgICAJMHgwNAorI2RlZmluZQkJU0NCX1RBR19UWVBFICAgIAkweDAzCisKKyNkZWZpbmUJU0NCX1NDU0lJRCAgICAgIAkJMHgxOTMKKyNkZWZpbmUJCVRJRCAgICAgICAgICAgICAJMHhmMAorI2RlZmluZQkJT0lEICAgICAgICAgICAgIAkweDBmCisKKyNkZWZpbmUJU0NCX0xVTiAgICAgICAgIAkJMHgxOTQKKyNkZWZpbmUJCUxJRCAgICAgICAgICAgICAJMHhmZgorCisjZGVmaW5lCVNDQl9UQVNLX0FUVFJJQlVURQkJMHgxOTUKKyNkZWZpbmUJCVNDQl9YRkVSTEVOX09ERCAJMHgwMQorCisjZGVmaW5lCVNDQl9DREJfTEVOICAgICAJCTB4MTk2CisjZGVmaW5lCQlTQ0JfQ0RCX0xFTl9QVFIgCTB4ODAKKworI2RlZmluZQlTQ0JfVEFTS19NQU5BR0VNRU5UCQkweDE5NworCisjZGVmaW5lCVNDQl9EQVRBUFRSICAgICAJCTB4MTk4CisKKyNkZWZpbmUJU0NCX0RBVEFDTlQgICAgIAkJMHgxYTAKKyNkZWZpbmUJCVNHX0xBU1RfU0VHICAgICAJMHg4MAorI2RlZmluZQkJU0dfSElHSF9BRERSX0JJVFMJMHg3ZgorCisjZGVmaW5lCVNDQl9TR1BUUiAgICAgICAJCTB4MWE0CisjZGVmaW5lCQlTR19TVEFUVVNfVkFMSUQgCTB4MDQKKyNkZWZpbmUJCVNHX0ZVTExfUkVTSUQgICAJMHgwMgorI2RlZmluZQkJU0dfTElTVF9OVUxMICAgIAkweDAxCisKKyNkZWZpbmUJU0NCX0JVU0FERFIgICAgIAkJMHgxYTgKKworI2RlZmluZQlTQ0JfTkVYVCAgICAgICAgCQkweDFhYworI2RlZmluZQlTQ0JfTkVYVF9TQ0JfQlVTQUREUgkJMHgxYWMKKworI2RlZmluZQlTQ0JfTkVYVDIgICAgICAgCQkweDFhZQorCisjZGVmaW5lCVNDQl9TUEFSRSAgICAgICAJCTB4MWIwCisjZGVmaW5lCVNDQl9QS1RfTFVOICAgICAJCTB4MWIwCisKKyNkZWZpbmUJU0NCX0RJU0NPTk5FQ1RFRF9MSVNUUwkJMHgxYjgKKworCisjZGVmaW5lCUFIRF9USU1FUl9VU19QRVJfVElDSwkweDE5CisjZGVmaW5lCVNDQl9UUkFOU0ZFUl9TSVpFX0ZVTExfTFVOCTB4MzgKKyNkZWZpbmUJU1RBVFVTX1FVRVVFX0ZVTEwJMHgyOAorI2RlZmluZQlTVEFUVVNfQlVTWQkweDA4CisjZGVmaW5lCU1BWF9PRkZTRVRfTk9OX1BBQ0VECTB4N2YKKyNkZWZpbmUJTUFYX09GRlNFVF9QQUNFRAkweGZlCisjZGVmaW5lCUJVU18zMl9CSVQJMHgwMgorI2RlZmluZQlDQ1NHQUREUl9NQVgJMHg4MAorI2RlZmluZQlUSURfU0hJRlQJMHgwNAorI2RlZmluZQlNS19NRVNTQUdFX0JJVF9PRkZTRVQJMHgwNAorI2RlZmluZQlXUlRCSUFTQ1RMX0hQX0RFRkFVTFQJMHgwMAorI2RlZmluZQlTRUVPUF9FV0RTX0FERFIJMHgwMAorI2RlZmluZQlBSERfQU1QTElUVURFX1NISUZUCTB4MDAKKyNkZWZpbmUJQUhEX0FNUExJVFVERV9NQVNLCTB4MDcKKyNkZWZpbmUJQUhEX0FOTkVYQ09MX0FNUExJVFVERQkweDA2CisjZGVmaW5lCUFIRF9TTEVXUkFURV9ERUZfUkVWQQkweDA4CisjZGVmaW5lCUFIRF9TTEVXUkFURV9TSElGVAkweDAzCisjZGVmaW5lCUFIRF9TTEVXUkFURV9NQVNLCTB4NzgKKyNkZWZpbmUJQUhEX1BSRUNPTVBfQ1VUQkFDS18yOQkweDA2CisjZGVmaW5lCUFIRF9OVU1fUEVSX0RFVl9BTk5FWENPTFMJMHgwNAorI2RlZmluZQlCX0NVUlJGSUZPXzAJMHgwMgorI2RlZmluZQlMVU5MRU5fU0lOR0xFX0xFVkVMX0xVTgkweDBmCisjZGVmaW5lCU5WUkFNX1NDQl9PRkZTRVQJMHgyYworI2RlZmluZQlBSERfVElNRVJfTUFYX1VTCTB4MThmZmU3CisjZGVmaW5lCUFIRF9USU1FUl9NQVhfVElDS1MJMHhmZmZmCisjZGVmaW5lCVNUQVRVU19QS1RfU0VOU0UJMHhmZgorI2RlZmluZQlDTURfR1JPVVBfQ09ERV9TSElGVAkweDA1CisjZGVmaW5lCUFIRF9TRU5TRV9CVUZTSVpFCTB4MTAwCisjZGVmaW5lCU1BWF9PRkZTRVRfUEFDRURfQlVHCTB4N2YKKyNkZWZpbmUJQlVTXzhfQklUCTB4MDAKKyNkZWZpbmUJU1RJTUVTRUxfQlVHX0FESgkweDA4CisjZGVmaW5lCVNUSU1FU0VMX01JTgkweDE4CisjZGVmaW5lCVNUSU1FU0VMX1NISUZUCTB4MDMKKyNkZWZpbmUJQ0NTR1JBTV9NQVhTRUdTCTB4MTAKKyNkZWZpbmUJSU5WQUxJRF9BRERSCTB4ODAKKyNkZWZpbmUJVEFSR0VUX0NNRF9DTVBMVAkweGZlCisjZGVmaW5lCVNFRU9QX1dSQUxfQUREUgkweDQwCisjZGVmaW5lCVNFRU9QX0VSQUxfQUREUgkweDgwCisjZGVmaW5lCUFIRF9BTVBMSVRVREVfREVGCTB4MDcKKyNkZWZpbmUJQUhEX1NMRVdSQVRFX0RFRl9SRVZCCTB4MDgKKyNkZWZpbmUJQUhEX1BSRUNPTVBfQ1VUQkFDS18zNwkweDA3CisjZGVmaW5lCUFIRF9QUkVDT01QX0NVVEJBQ0tfMTcJMHgwNAorI2RlZmluZQlBSERfUFJFQ09NUF9TSElGVAkweDAwCisjZGVmaW5lCUFIRF9QUkVDT01QX01BU0sJMHgwNworI2RlZmluZQlBSERfQU5ORVhDT0xfUFJFQ09NUF9TTEVXCTB4MDQKKyNkZWZpbmUJU1JDX01PREVfU0hJRlQJMHgwMAorI2RlZmluZQlQS1RfT1ZFUlJVTl9CVUZTSVpFCTB4MjAwCisjZGVmaW5lCVNDQl9UUkFOU0ZFUl9TSVpFXzFCWVRFX0xVTgkweDMwCisjZGVmaW5lCVRBUkdFVF9EQVRBX0lOCTB4MDEKKyNkZWZpbmUJSE9TVF9NU0cJMHhmZgorI2RlZmluZQlNQVhfT0ZGU0VUCTB4ZmUKKyNkZWZpbmUJQlVTXzE2X0JJVAkweDAxCisjZGVmaW5lCUNDU0NCQUREUl9NQVgJMHg4MAorI2RlZmluZQlOVU1EU1BTIAkweDE0CisjZGVmaW5lCVNFRU9QX0VXRU5fQUREUgkweGMwCisjZGVmaW5lCUFIRF9BTk5FWENPTF9QRVJfREVWMAkweDA0CisjZGVmaW5lCURTVF9NT0RFX1NISUZUCTB4MDQKKworCisvKiBEb3dubG9hZGVkIENvbnN0YW50IERlZmluaXRpb25zICovCisjZGVmaW5lCVNDQl9UUkFOU0ZFUl9TSVpFCTB4MDYKKyNkZWZpbmUJUEtUX09WRVJSVU5fQlVGT0ZGU0VUCTB4MDUKKyNkZWZpbmUJU0dfU0laRU9GCTB4MDQKKyNkZWZpbmUJU0dfUFJFRkVUQ0hfQUREUl9NQVNLCTB4MDMKKyNkZWZpbmUJU0dfUFJFRkVUQ0hfQUxJR05fTUFTSwkweDAyCisjZGVmaW5lCVNHX1BSRUZFVENIX0NOVF9MSU1JVAkweDAxCisjZGVmaW5lCVNHX1BSRUZFVENIX0NOVAkweDAwCisjZGVmaW5lCURPV05MT0FEX0NPTlNUX0NPVU5UCTB4MDcKKworCisvKiBFeHBvcnRlZCBMYWJlbHMgKi8KKyNkZWZpbmUJTEFCRUxfc2VxX2lzciAJMHgyNjkKKyNkZWZpbmUJTEFCRUxfdGltZXJfaXNyCTB4MjY1CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3JlZ19wcmludC5jX3NoaXBwZWQgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3JlZ19wcmludC5jX3NoaXBwZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA5OGE3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcmVnX3ByaW50LmNfc2hpcHBlZApAQCAtMCwwICsxLDM2MzUgQEAKKy8qCisgKiBETyBOT1QgRURJVCAtIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorICoJCSBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlIGZpbGVzOgorICoKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5zZXEjOTQgJAorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4LnJlZyM3MCAkCisgKi8KKworI2luY2x1ZGUgImFpYzc5eHhfb3NtLmgiCisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgTU9ERV9QVFJfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTUkNfTU9ERSIsCQkweDA3LCAweDA3IH0sCisJeyAiRFNUX01PREUiLAkJMHg3MCwgMHg3MCB9Cit9OworCitpbnQKK2FoZF9tb2RlX3B0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTU9ERV9QVFJfcGFyc2VfdGFibGUsIDIsICJNT0RFX1BUUiIsCisJICAgIDB4MDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgSU5UU1RBVF9wYXJzZV90YWJsZVtdID0geworCXsgIlNQTFRJTlQiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkNNRENNUExUIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJTRVFJTlQiLAkJMHgwNCwgMHgwNCB9LAorCXsgIlNDU0lJTlQiLAkJMHgwOCwgMHgwOCB9LAorCXsgIlBDSUlOVCIsCQkweDEwLCAweDEwIH0sCisJeyAiU1dUTUlOVCIsCQkweDIwLCAweDIwIH0sCisJeyAiQlJLQURSSU5UIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJIV0VSUklOVCIsCQkweDgwLCAweDgwIH0sCisJeyAiSU5UX1BFTkQiLAkJMHhmZiwgMHhmZiB9Cit9OworCitpbnQKK2FoZF9pbnRzdGF0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihJTlRTVEFUX3BhcnNlX3RhYmxlLCA5LCAiSU5UU1RBVCIsCisJICAgIDB4MDEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0VRSU5UQ09ERV9wYXJzZV90YWJsZVtdID0geworCXsgIk5PX1NFUUlOVCIsCQkweDAwLCAweGZmIH0sCisJeyAiQkFEX1BIQVNFIiwJCTB4MDEsIDB4ZmYgfSwKKwl7ICJTRU5EX1JFSkVDVCIsCTB4MDIsIDB4ZmYgfSwKKwl7ICJQUk9UT19WSU9MQVRJT04iLAkweDAzLCAweGZmIH0sCisJeyAiTk9fTUFUQ0giLAkJMHgwNCwgMHhmZiB9LAorCXsgIklHTl9XSURFX1JFUyIsCTB4MDUsIDB4ZmYgfSwKKwl7ICJQREFUQV9SRUlOSVQiLAkweDA2LCAweGZmIH0sCisJeyAiSE9TVF9NU0dfTE9PUCIsCTB4MDcsIDB4ZmYgfSwKKwl7ICJCQURfU1RBVFVTIiwJCTB4MDgsIDB4ZmYgfSwKKwl7ICJEQVRBX09WRVJSVU4iLAkweDA5LCAweGZmIH0sCisJeyAiTUtNU0dfRkFJTEVEIiwJMHgwYSwgMHhmZiB9LAorCXsgIk1JU1NFRF9CVVNGUkVFIiwJMHgwYiwgMHhmZiB9LAorCXsgIkRVTVBfQ0FSRF9TVEFURSIsCTB4MGMsIDB4ZmYgfSwKKwl7ICJJTExFR0FMX1BIQVNFIiwJMHgwZCwgMHhmZiB9LAorCXsgIklOVkFMSURfU0VRSU5UIiwJMHgwZSwgMHhmZiB9LAorCXsgIkNGRzRJU1RBVF9JTlRSIiwJMHgwZiwgMHhmZiB9LAorCXsgIlNUQVRVU19PVkVSUlVOIiwJMHgxMCwgMHhmZiB9LAorCXsgIkNGRzRPVkVSUlVOIiwJMHgxMSwgMHhmZiB9LAorCXsgIkVOVEVSSU5HX05PTlBBQ0siLAkweDEyLCAweGZmIH0sCisJeyAiVEFTS01HTVRfRlVOQ19DT01QTEVURSIsMHgxMywgMHhmZiB9LAorCXsgIlRBU0tNR01UX0NNRF9DTVBMVF9PS0FZIiwweDE0LCAweGZmIH0sCisJeyAiVFJBQ0VQT0lOVDAiLAkweDE1LCAweGZmIH0sCisJeyAiVFJBQ0VQT0lOVDEiLAkweDE2LCAweGZmIH0sCisJeyAiVFJBQ0VQT0lOVDIiLAkweDE3LCAweGZmIH0sCisJeyAiVFJBQ0VQT0lOVDMiLAkweDE4LCAweGZmIH0sCisJeyAiU0FXX0hXRVJSIiwJCTB4MTksIDB4ZmYgfSwKKwl7ICJCQURfU0NCX1NUQVRVUyIsCTB4MWEsIDB4ZmYgfQorfTsKKworaW50CithaGRfc2VxaW50Y29kZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0VRSU5UQ09ERV9wYXJzZV90YWJsZSwgMjcsICJTRVFJTlRDT0RFIiwKKwkgICAgMHgwMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTFJJTlRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDTFJTUExUSU5UIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJDTFJDTURJTlQiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkNMUlNFUUlOVCIsCQkweDA0LCAweDA0IH0sCisJeyAiQ0xSU0NTSUlOVCIsCQkweDA4LCAweDA4IH0sCisJeyAiQ0xSUENJSU5UIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJDTFJTV1RNSU5UIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJDTFJCUktBRFJJTlQiLAkweDQwLCAweDQwIH0sCisJeyAiQ0xSSFdFUlJJTlQiLAkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2NscmludF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ0xSSU5UX3BhcnNlX3RhYmxlLCA4LCAiQ0xSSU5UIiwKKwkgICAgMHgwMywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBFUlJPUl9wYXJzZV90YWJsZVtdID0geworCXsgIkRTQ1RNT1VUIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJJTExPUENPREUiLAkJMHgwNCwgMHgwNCB9LAorCXsgIlNRUEFSRVJSIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJEUEFSRVJSIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJNUEFSRVJSIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJDSU9BQ0NFU0ZBSUwiLAkweDQwLCAweDQwIH0sCisJeyAiQ0lPUEFSRVJSIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfZXJyb3JfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKEVSUk9SX3BhcnNlX3RhYmxlLCA3LCAiRVJST1IiLAorCSAgICAweDA0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IENMUkVSUl9wYXJzZV90YWJsZVtdID0geworCXsgIkNMUkRTQ1RNT1VUIiwJMHgwMiwgMHgwMiB9LAorCXsgIkNMUklMTE9QQ09ERSIsCTB4MDQsIDB4MDQgfSwKKwl7ICJDTFJTUVBBUkVSUiIsCTB4MDgsIDB4MDggfSwKKwl7ICJDTFJEUEFSRVJSIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJDTFJNUEFSRVJSIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJDTFJDSU9BQ0NFU0ZBSUwiLAkweDQwLCAweDQwIH0sCisJeyAiQ0xSQ0lPUEFSRVJSIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9jbHJlcnJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENMUkVSUl9wYXJzZV90YWJsZSwgNywgIkNMUkVSUiIsCisJICAgIDB4MDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgSENOVFJMX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0hJUFJTVCIsCQkweDAxLCAweDAxIH0sCisJeyAiQ0hJUFJTVEFDSyIsCQkweDAxLCAweDAxIH0sCisJeyAiSU5URU4iLAkJMHgwMiwgMHgwMiB9LAorCXsgIlBBVVNFIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJTV1RJTUVSX1NUQVJUX0IiLAkweDA4LCAweDA4IH0sCisJeyAiU1dJTlQiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlBPV1JETiIsCQkweDQwLCAweDQwIH0sCisJeyAiU0VRX1JFU0VUIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfaGNudHJsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihIQ05UUkxfcGFyc2VfdGFibGUsIDgsICJIQ05UUkwiLAorCSAgICAweDA1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9obnNjYl9xb2ZmX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSE5TQ0JfUU9GRiIsCisJICAgIDB4MDYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2hlc2NiX3FvZmZfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIRVNDQl9RT0ZGIiwKKwkgICAgMHgwOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBIU19NQUlMQk9YX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRU5JTlRfQ09BTEVTQ0UiLAkweDQwLCAweDQwIH0sCisJeyAiSE9TVF9UUUlOUE9TIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9oc19tYWlsYm94X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihIU19NQUlMQk9YX3BhcnNlX3RhYmxlLCAyLCAiSFNfTUFJTEJPWCIsCisJICAgIDB4MGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0xSU0VRSU5UU1RBVF9wYXJzZV90YWJsZVtdID0geworCXsgIkNMUlNFUV9TUExUSU5UIiwJMHgwMSwgMHgwMSB9LAorCXsgIkNMUlNFUV9QQ0lJTlQiLAkweDAyLCAweDAyIH0sCisJeyAiQ0xSU0VRX1NDU0lJTlQiLAkweDA0LCAweDA0IH0sCisJeyAiQ0xSU0VRX1NFUUlOVCIsCTB4MDgsIDB4MDggfSwKKwl7ICJDTFJTRVFfU1dUTVJUTyIsCTB4MTAsIDB4MTAgfQorfTsKKworaW50CithaGRfY2xyc2VxaW50c3RhdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ0xSU0VRSU5UU1RBVF9wYXJzZV90YWJsZSwgNSwgIkNMUlNFUUlOVFNUQVQiLAorCSAgICAweDBjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNFUUlOVFNUQVRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTRVFfU1BMVElOVCIsCTB4MDEsIDB4MDEgfSwKKwl7ICJTRVFfUENJSU5UIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJTRVFfU0NTSUlOVCIsCTB4MDQsIDB4MDQgfSwKKwl7ICJTRVFfU0VRSU5UIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJTRVFfU1dUTVJUTyIsCTB4MTAsIDB4MTAgfQorfTsKKworaW50CithaGRfc2VxaW50c3RhdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0VRSU5UU1RBVF9wYXJzZV90YWJsZSwgNSwgIlNFUUlOVFNUQVQiLAorCSAgICAweDBjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zd3RpbWVyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU1dUSU1FUiIsCisJICAgIDB4MGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3Nuc2NiX3FvZmZfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTTlNDQl9RT0ZGIiwKKwkgICAgMHgxMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfc2VzY2JfcW9mZl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFU0NCX1FPRkYiLAorCSAgICAweDEyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zZHNjYl9xb2ZmX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0RTQ0JfUU9GRiIsCisJICAgIDB4MTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgUU9GRl9DVExTVEFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTQ0JfUVNJWkVfNCIsCTB4MDAsIDB4MGYgfSwKKwl7ICJTQ0JfUVNJWkVfOCIsCTB4MDEsIDB4MGYgfSwKKwl7ICJTQ0JfUVNJWkVfMTYiLAkweDAyLCAweDBmIH0sCisJeyAiU0NCX1FTSVpFXzMyIiwJMHgwMywgMHgwZiB9LAorCXsgIlNDQl9RU0laRV82NCIsCTB4MDQsIDB4MGYgfSwKKwl7ICJTQ0JfUVNJWkVfMTI4IiwJMHgwNSwgMHgwZiB9LAorCXsgIlNDQl9RU0laRV8yNTYiLAkweDA2LCAweDBmIH0sCisJeyAiU0NCX1FTSVpFXzUxMiIsCTB4MDcsIDB4MGYgfSwKKwl7ICJTQ0JfUVNJWkVfMTAyNCIsCTB4MDgsIDB4MGYgfSwKKwl7ICJTQ0JfUVNJWkVfMjA0OCIsCTB4MDksIDB4MGYgfSwKKwl7ICJTQ0JfUVNJWkVfNDA5NiIsCTB4MGEsIDB4MGYgfSwKKwl7ICJTQ0JfUVNJWkVfODE5MiIsCTB4MGIsIDB4MGYgfSwKKwl7ICJTQ0JfUVNJWkVfMTYzODQiLAkweDBjLCAweDBmIH0sCisJeyAiU0NCX1FTSVpFIiwJCTB4MGYsIDB4MGYgfSwKKwl7ICJIU19NQUlMQk9YX0FDVCIsCTB4MTAsIDB4MTAgfSwKKwl7ICJTRFNDQl9ST0xMT1ZSIiwJMHgyMCwgMHgyMCB9LAorCXsgIk5FV19TQ0JfQVZBSUwiLAkweDQwLCAweDQwIH0sCisJeyAiRU1QVFlfU0NCX0FWQUlMIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9xb2ZmX2N0bHN0YV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoUU9GRl9DVExTVEFfcGFyc2VfdGFibGUsIDE4LCAiUU9GRl9DVExTVEEiLAorCSAgICAweDE2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IElOVENUTF9wYXJzZV90YWJsZVtdID0geworCXsgIlNQTFRJTlRFTiIsCQkweDAxLCAweDAxIH0sCisJeyAiU0VRSU5URU4iLAkJMHgwMiwgMHgwMiB9LAorCXsgIlNDU0lJTlRFTiIsCQkweDA0LCAweDA0IH0sCisJeyAiUENJSU5URU4iLAkJMHgwOCwgMHgwOCB9LAorCXsgIkFVVE9DTFJDTURJTlQiLAkweDEwLCAweDEwIH0sCisJeyAiU1dUSU1FUl9TVEFSVCIsCTB4MjAsIDB4MjAgfSwKKwl7ICJTV1RNSU5URU4iLAkJMHg0MCwgMHg0MCB9LAorCXsgIlNXVE1JTlRNQVNLIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9pbnRjdGxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKElOVENUTF9wYXJzZV90YWJsZSwgOCwgIklOVENUTCIsCisJICAgIDB4MTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgREZDTlRSTF9wYXJzZV90YWJsZVtdID0geworCXsgIkRJUkVDVElPTkVOIiwJMHgwMSwgMHgwMSB9LAorCXsgIkZJRk9GTFVTSCIsCQkweDAyLCAweDAyIH0sCisJeyAiRklGT0ZMVVNIQUNLIiwJMHgwMiwgMHgwMiB9LAorCXsgIkRJUkVDVElPTiIsCQkweDA0LCAweDA0IH0sCisJeyAiRElSRUNUSU9OQUNLIiwJMHgwNCwgMHgwNCB9LAorCXsgIkhETUFFTiIsCQkweDA4LCAweDA4IH0sCisJeyAiSERNQUVOQUNLIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJTQ1NJRU4iLAkJMHgyMCwgMHgyMCB9LAorCXsgIlNDU0lFTkFDSyIsCQkweDIwLCAweDIwIH0sCisJeyAiU0NTSUVOV1JESVMiLAkweDQwLCAweDQwIH0sCisJeyAiUFJFTE9BREVOIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfZGZjbnRybF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoREZDTlRSTF9wYXJzZV90YWJsZSwgMTEsICJERkNOVFJMIiwKKwkgICAgMHgxOSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBEU0NPTU1BTkQwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0lPUEFSQ0tFTiIsCQkweDAxLCAweDAxIH0sCisJeyAiRElTQUJMRV9UV0FURSIsCTB4MDIsIDB4MDIgfSwKKwl7ICJFWFRSRVFMQ0siLAkJMHgxMCwgMHgxMCB9LAorCXsgIk1QQVJDS0VOIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJEUEFSQ0tFTiIsCQkweDQwLCAweDQwIH0sCisJeyAiQ0FDSEVUSEVOIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfZHNjb21tYW5kMF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoRFNDT01NQU5EMF9wYXJzZV90YWJsZSwgNiwgIkRTQ09NTUFORDAiLAorCSAgICAweDE5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IERGU1RBVFVTX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRklGT0VNUCIsCQkweDAxLCAweDAxIH0sCisJeyAiRklGT0ZVTEwiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkRGVEhSRVNIIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJIRE9ORSIsCQkweDA4LCAweDA4IH0sCisJeyAiTVJFUVBFTkQiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlBLVF9QUkVMT0FEX0FWQUlMIiwJMHg0MCwgMHg0MCB9LAorCXsgIlBSRUxPQURfQVZBSUwiLAkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2Rmc3RhdHVzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihERlNUQVRVU19wYXJzZV90YWJsZSwgNywgIkRGU1RBVFVTIiwKKwkgICAgMHgxYSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTR19DQUNIRV9TSEFET1dfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJMQVNUX1NFR19ET05FIiwJMHgwMSwgMHgwMSB9LAorCXsgIkxBU1RfU0VHIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJPRERfU0VHIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJTR19BRERSX01BU0siLAkweGY4LCAweGY4IH0KK307CisKK2ludAorYWhkX3NnX2NhY2hlX3NoYWRvd19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0dfQ0FDSEVfU0hBRE9XX3BhcnNlX3RhYmxlLCA0LCAiU0dfQ0FDSEVfU0hBRE9XIiwKKwkgICAgMHgxYiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBBUkJDVExfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJVU0VfVElNRSIsCQkweDA3LCAweDA3IH0sCisJeyAiUkVUUllfU1dFTiIsCQkweDA4LCAweDA4IH0sCisJeyAiUkVTRVRfSEFSQiIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2FyYmN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQVJCQ1RMX3BhcnNlX3RhYmxlLCAzLCAiQVJCQ1RMIiwKKwkgICAgMHgxYiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTR19DQUNIRV9QUkVfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJMQVNUX1NFRyIsCQkweDAyLCAweDAyIH0sCisJeyAiT0REX1NFRyIsCQkweDA0LCAweDA0IH0sCisJeyAiU0dfQUREUl9NQVNLIiwJMHhmOCwgMHhmOCB9Cit9OworCitpbnQKK2FoZF9zZ19jYWNoZV9wcmVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNHX0NBQ0hFX1BSRV9wYXJzZV90YWJsZSwgMywgIlNHX0NBQ0hFX1BSRSIsCisJICAgIDB4MWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2xxaW5fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUUlOIiwKKwkgICAgMHgyMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfdHlwZXB0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlRZUEVQVFIiLAorCSAgICAweDIwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF90YWdwdHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJUQUdQVFIiLAorCSAgICAweDIxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9sdW5wdHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMVU5QVFIiLAorCSAgICAweDIyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9kYXRhbGVucHRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREFUQUxFTlBUUiIsCisJICAgIDB4MjMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3N0YXRsZW5wdHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTVEFUTEVOUFRSIiwKKwkgICAgMHgyNCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfY21kbGVucHRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01ETEVOUFRSIiwKKwkgICAgMHgyNSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfYXR0cnB0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFUVFJQVFIiLAorCSAgICAweDI2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9mbGFncHRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRkxBR1BUUiIsCisJICAgIDB4MjcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2NtZHB0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNRFBUUiIsCisJICAgIDB4MjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3FuZXh0cHRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUU5FWFRQVFIiLAorCSAgICAweDI5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9pZHB0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklEUFRSIiwKKwkgICAgMHgyYSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfYWJydGJ5dGVwdHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBQlJUQllURVBUUiIsCisJICAgIDB4MmIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2FicnRiaXRwdHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBQlJUQklUUFRSIiwKKwkgICAgMHgyYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfbWF4Y21kYnl0ZXNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJNQVhDTURCWVRFUyIsCisJICAgIDB4MmQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX21heGNtZDJyY3ZfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJNQVhDTUQyUkNWIiwKKwkgICAgMHgyZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfc2hvcnR0aHJlc2hfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTSE9SVFRIUkVTSCIsCisJICAgIDB4MmYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgTFVOTEVOX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiSUxVTkxFTiIsCQkweDBmLCAweDBmIH0sCisJeyAiVExVTkxFTiIsCQkweGYwLCAweGYwIH0KK307CisKK2ludAorYWhkX2x1bmxlbl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTFVOTEVOX3BhcnNlX3RhYmxlLCAyLCAiTFVOTEVOIiwKKwkgICAgMHgzMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfY2RibGltaXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDREJMSU1JVCIsCisJICAgIDB4MzEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX21heGNtZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk1BWENNRCIsCisJICAgIDB4MzIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX21heGNtZGNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk1BWENNRENOVCIsCisJICAgIDB4MzMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2xxcnN2ZDAxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTFFSU1ZEMDEiLAorCSAgICAweDM0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9scXJzdmQxNl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxRUlNWRDE2IiwKKwkgICAgMHgzNSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfbHFyc3ZkMTdfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUVJTVkQxNyIsCisJICAgIDB4MzYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2NtZHJzdmQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01EUlNWRDAiLAorCSAgICAweDM3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRQ1RMMF9wYXJzZV90YWJsZVtdID0geworCXsgIkxRMElOSVRHQ0xUIiwJMHgwMywgMHgwMyB9LAorCXsgIkxRMFRBUkdDTFQiLAkJMHgwYywgMHgwYyB9LAorCXsgIkxRSUlOSVRHQ0xUIiwJMHgzMCwgMHgzMCB9LAorCXsgIkxRSVRBUkdDTFQiLAkJMHhjMCwgMHhjMCB9Cit9OworCitpbnQKK2FoZF9scWN0bDBfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKExRQ1RMMF9wYXJzZV90YWJsZSwgNCwgIkxRQ1RMMCIsCisJICAgIDB4MzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgTFFDVEwxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQUJPUlRQRU5ESU5HIiwJMHgwMSwgMHgwMSB9LAorCXsgIlNJTkdMRUNNRCIsCQkweDAyLCAweDAyIH0sCisJeyAiUENJMlBDSSIsCQkweDA0LCAweDA0IH0KK307CisKK2ludAorYWhkX2xxY3RsMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTFFDVEwxX3BhcnNlX3RhYmxlLCAzLCAiTFFDVEwxIiwKKwkgICAgMHgzOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTQ1NCSVNUMF9wYXJzZV90YWJsZVtdID0geworCXsgIk9TQklTVFJVTiIsCQkweDAxLCAweDAxIH0sCisJeyAiT1NCSVNURE9ORSIsCQkweDAyLCAweDAyIH0sCisJeyAiT1NCSVNURVJSIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJHU0JJU1RSVU4iLAkJMHgxMCwgMHgxMCB9LAorCXsgIkdTQklTVERPTkUiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkdTQklTVEVSUiIsCQkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhkX3Njc2Jpc3QwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTQ1NCSVNUMF9wYXJzZV90YWJsZSwgNiwgIlNDU0JJU1QwIiwKKwkgICAgMHgzOSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBMUUNUTDJfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJMUU9QQVVTRSIsCQkweDAxLCAweDAxIH0sCisJeyAiTFFPVE9JRExFIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJMUU9DT05USU5VRSIsCTB4MDQsIDB4MDQgfSwKKwl7ICJMUU9SRVRSWSIsCQkweDA4LCAweDA4IH0sCisJeyAiTFFJUEFVU0UiLAkJMHgxMCwgMHgxMCB9LAorCXsgIkxRSVRPSURMRSIsCQkweDIwLCAweDIwIH0sCisJeyAiTFFJQ09OVElOVUUiLAkweDQwLCAweDQwIH0sCisJeyAiTFFJUkVUUlkiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9scWN0bDJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKExRQ1RMMl9wYXJzZV90YWJsZSwgOCwgIkxRQ1RMMiIsCisJICAgIDB4MzksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NTQklTVDFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJOVEJJU1RSVU4iLAkJMHgwMSwgMHgwMSB9LAorCXsgIk5UQklTVERPTkUiLAkJMHgwMiwgMHgwMiB9LAorCXsgIk5UQklTVEVSUiIsCQkweDA0LCAweDA0IH0KK307CisKK2ludAorYWhkX3Njc2Jpc3QxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTQ1NCSVNUMV9wYXJzZV90YWJsZSwgMywgIlNDU0JJU1QxIiwKKwkgICAgMHgzYSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTQ1NJU0VRMF9wYXJzZV90YWJsZVtdID0geworCXsgIlNDU0lSU1RPIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJGT1JDRUJVU0ZSRUUiLAkweDEwLCAweDEwIH0sCisJeyAiRU5BUkJPIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJFTlNFTE8iLAkJMHg0MCwgMHg0MCB9LAorCXsgIlRFTU9ERU8iLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9zY3Npc2VxMF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0NTSVNFUTBfcGFyc2VfdGFibGUsIDUsICJTQ1NJU0VRMCIsCisJICAgIDB4M2EsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NTSVNFUTFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJBTFRTVElNIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJFTkFVVE9BVE5QIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJNQU5VQUxQIiwJCTB4MGMsIDB4MGMgfSwKKwl7ICJFTlJTRUxJIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJFTlNFTEkiLAkJMHgyMCwgMHgyMCB9LAorCXsgIk1BTlVBTENUTCIsCQkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhkX3Njc2lzZXExX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTQ1NJU0VRMV9wYXJzZV90YWJsZSwgNiwgIlNDU0lTRVExIiwKKwkgICAgMHgzYiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTWEZSQ1RMMF9wYXJzZV90YWJsZVtdID0geworCXsgIlNQSU9FTiIsCQkweDA4LCAweDA4IH0sCisJeyAiQklPU0NBTkNFTEVOIiwJMHgxMCwgMHgxMCB9LAorCXsgIkRGUEVYUCIsCQkweDQwLCAweDQwIH0sCisJeyAiREZPTiIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX3N4ZnJjdGwwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTWEZSQ1RMMF9wYXJzZV90YWJsZSwgNCwgIlNYRlJDVEwwIiwKKwkgICAgMHgzYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfYnVzaW5pdGlkX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQlVTSU5JVElEIiwKKwkgICAgMHgzYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfZGxjb3VudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRMQ09VTlQiLAorCSAgICAweDNjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNYRlJDVEwxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiU1RQV0VOIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJBQ1RORUdFTiIsCQkweDAyLCAweDAyIH0sCisJeyAiRU5TVElNRVIiLAkJMHgwNCwgMHgwNCB9LAorCXsgIlNUSU1FU0VMIiwJCTB4MTgsIDB4MTggfSwKKwl7ICJFTlNQQ0hLIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJFTlNBQ0hLIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJCSVRCVUNLRVQiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9zeGZyY3RsMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU1hGUkNUTDFfcGFyc2VfdGFibGUsIDcsICJTWEZSQ1RMMSIsCisJICAgIDB4M2QsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2J1c3RhcmdpZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJVU1RBUkdJRCIsCisJICAgIDB4M2UsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU1hGUkNUTDJfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJBU1UiLAkJMHgwNywgMHgwNyB9LAorCXsgIkNNRERNQUVOIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJBVVRPUlNURElTIiwJCTB4MTAsIDB4MTAgfQorfTsKKworaW50CithaGRfc3hmcmN0bDJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNYRlJDVEwyX3BhcnNlX3RhYmxlLCAzLCAiU1hGUkNUTDIiLAorCSAgICAweDNlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IERGRlNUQVRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDVVJSRklGT18wIiwJCTB4MDAsIDB4MDMgfSwKKwl7ICJDVVJSRklGT18xIiwJCTB4MDEsIDB4MDMgfSwKKwl7ICJDVVJSRklGT19OT05FIiwJMHgwMywgMHgwMyB9LAorCXsgIkZJRk8wRlJFRSIsCQkweDEwLCAweDEwIH0sCisJeyAiRklGTzFGUkVFIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJDVVJSRklGTyIsCQkweDAzLCAweDAzIH0KK307CisKK2ludAorYWhkX2RmZnN0YXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERGRlNUQVRfcGFyc2VfdGFibGUsIDYsICJERkZTVEFUIiwKKwkgICAgMHgzZiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTQ1NJU0lHT19wYXJzZV90YWJsZVtdID0geworCXsgIlBfREFUQU9VVCIsCQkweDAwLCAweGUwIH0sCisJeyAiUF9EQVRBT1VUX0RUIiwJMHgyMCwgMHhlMCB9LAorCXsgIlBfREFUQUlOIiwJCTB4NDAsIDB4ZTAgfSwKKwl7ICJQX0RBVEFJTl9EVCIsCTB4NjAsIDB4ZTAgfSwKKwl7ICJQX0NPTU1BTkQiLAkJMHg4MCwgMHhlMCB9LAorCXsgIlBfTUVTR09VVCIsCQkweGEwLCAweGUwIH0sCisJeyAiUF9TVEFUVVMiLAkJMHhjMCwgMHhlMCB9LAorCXsgIlBfTUVTR0lOIiwJCTB4ZTAsIDB4ZTAgfSwKKwl7ICJBQ0tPIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJSRVFPIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJCU1lPIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJTRUxPIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJBVE5PIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJNU0dPIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJJT08iLAkJMHg0MCwgMHg0MCB9LAorCXsgIkNETyIsCQkweDgwLCAweDgwIH0sCisJeyAiUEhBU0VfTUFTSyIsCQkweGUwLCAweGUwIH0KK307CisKK2ludAorYWhkX3Njc2lzaWdvX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTQ1NJU0lHT19wYXJzZV90YWJsZSwgMTcsICJTQ1NJU0lHTyIsCisJICAgIDB4NDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX211bHRhcmdpZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk1VTFRBUkdJRCIsCisJICAgIDB4NDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NTSVNJR0lfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJQX0RBVEFPVVQiLAkJMHgwMCwgMHhlMCB9LAorCXsgIlBfREFUQU9VVF9EVCIsCTB4MjAsIDB4ZTAgfSwKKwl7ICJQX0RBVEFJTiIsCQkweDQwLCAweGUwIH0sCisJeyAiUF9EQVRBSU5fRFQiLAkweDYwLCAweGUwIH0sCisJeyAiUF9DT01NQU5EIiwJCTB4ODAsIDB4ZTAgfSwKKwl7ICJQX01FU0dPVVQiLAkJMHhhMCwgMHhlMCB9LAorCXsgIlBfU1RBVFVTIiwJCTB4YzAsIDB4ZTAgfSwKKwl7ICJQX01FU0dJTiIsCQkweGUwLCAweGUwIH0sCisJeyAiQUNLSSIsCQkweDAxLCAweDAxIH0sCisJeyAiUkVRSSIsCQkweDAyLCAweDAyIH0sCisJeyAiQlNZSSIsCQkweDA0LCAweDA0IH0sCisJeyAiU0VMSSIsCQkweDA4LCAweDA4IH0sCisJeyAiQVROSSIsCQkweDEwLCAweDEwIH0sCisJeyAiTVNHSSIsCQkweDIwLCAweDIwIH0sCisJeyAiSU9JIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJDREkiLAkJMHg4MCwgMHg4MCB9LAorCXsgIlBIQVNFX01BU0siLAkJMHhlMCwgMHhlMCB9Cit9OworCitpbnQKK2FoZF9zY3Npc2lnaV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0NTSVNJR0lfcGFyc2VfdGFibGUsIDE3LCAiU0NTSVNJR0kiLAorCSAgICAweDQxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNDU0lQSEFTRV9wYXJzZV90YWJsZVtdID0geworCXsgIkRBVEFfT1VUX1BIQVNFIiwJMHgwMSwgMHgwMyB9LAorCXsgIkRBVEFfSU5fUEhBU0UiLAkweDAyLCAweDAzIH0sCisJeyAiREFUQV9QSEFTRV9NQVNLIiwJMHgwMywgMHgwMyB9LAorCXsgIk1TR19PVVRfUEhBU0UiLAkweDA0LCAweDA0IH0sCisJeyAiTVNHX0lOX1BIQVNFIiwJMHgwOCwgMHgwOCB9LAorCXsgIkNPTU1BTkRfUEhBU0UiLAkweDEwLCAweDEwIH0sCisJeyAiU1RBVFVTX1BIQVNFIiwJMHgyMCwgMHgyMCB9Cit9OworCitpbnQKK2FoZF9zY3NpcGhhc2VfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNDU0lQSEFTRV9wYXJzZV90YWJsZSwgNywgIlNDU0lQSEFTRSIsCisJICAgIDB4NDIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3Njc2lkYXQwX2ltZ19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lEQVQwX0lNRyIsCisJICAgIDB4NDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3Njc2lkYXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJREFUIiwKKwkgICAgMHg0NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfc2NzaWJ1c19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lCVVMiLAorCSAgICAweDQ2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFRBUkdJRElOX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiVEFSR0lEIiwJCTB4MGYsIDB4MGYgfSwKKwl7ICJDTEtPVVQiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF90YXJnaWRpbl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoVEFSR0lESU5fcGFyc2VfdGFibGUsIDIsICJUQVJHSURJTiIsCisJICAgIDB4NDgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0VMSURfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJPTkVCSVQiLAkJMHgwOCwgMHgwOCB9LAorCXsgIlNFTElEX01BU0siLAkJMHhmMCwgMHhmMCB9Cit9OworCitpbnQKK2FoZF9zZWxpZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0VMSURfcGFyc2VfdGFibGUsIDIsICJTRUxJRCIsCisJICAgIDB4NDksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0JMS0NUTF9wYXJzZV90YWJsZVtdID0geworCXsgIlNFTFdJREUiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkVOQUIyMCIsCQkweDA0LCAweDA0IH0sCisJeyAiRU5BQjQwIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJESUFHTEVET04iLAkJMHg0MCwgMHg0MCB9LAorCXsgIkRJQUdMRURFTiIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX3NibGtjdGxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNCTEtDVExfcGFyc2VfdGFibGUsIDUsICJTQkxLQ1RMIiwKKwkgICAgMHg0YSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBPUFRJT05NT0RFX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQVVUT19NU0dPVVRfREUiLAkweDAyLCAweDAyIH0sCisJeyAiRU5ER0ZPUk1DSEsiLAkweDA0LCAweDA0IH0sCisJeyAiQlVTRlJFRVJFViIsCQkweDEwLCAweDEwIH0sCisJeyAiQklBU0NBTkNUTCIsCQkweDIwLCAweDIwIH0sCisJeyAiQVVUT0FDS0VOIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJCSU9TQ0FOQ1RMIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJPUFRJT05NT0RFX0RFRkFVTFRTIiwweDAyLCAweDAyIH0KK307CisKK2ludAorYWhkX29wdGlvbm1vZGVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE9QVElPTk1PREVfcGFyc2VfdGFibGUsIDcsICJPUFRJT05NT0RFIiwKKwkgICAgMHg0YSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTU1RBVDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJBUkJETyIsCQkweDAxLCAweDAxIH0sCisJeyAiU1BJT1JEWSIsCQkweDAyLCAweDAyIH0sCisJeyAiT1ZFUlJVTiIsCQkweDA0LCAweDA0IH0sCisJeyAiSU9FUlIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIlNFTElOR08iLAkJMHgxMCwgMHgxMCB9LAorCXsgIlNFTERJIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTRUxETyIsCQkweDQwLCAweDQwIH0sCisJeyAiVEFSR0VUIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfc3N0YXQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTU1RBVDBfcGFyc2VfdGFibGUsIDgsICJTU1RBVDAiLAorCSAgICAweDRiLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IENMUlNJTlQwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0xSQVJCRE8iLAkJMHgwMSwgMHgwMSB9LAorCXsgIkNMUlNQSU9SRFkiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkNMUk9WRVJSVU4iLAkJMHgwNCwgMHgwNCB9LAorCXsgIkNMUklPRVJSIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJDTFJTRUxJTkdPIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJDTFJTRUxESSIsCQkweDIwLCAweDIwIH0sCisJeyAiQ0xSU0VMRE8iLAkJMHg0MCwgMHg0MCB9Cit9OworCitpbnQKK2FoZF9jbHJzaW50MF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ0xSU0lOVDBfcGFyc2VfdGFibGUsIDcsICJDTFJTSU5UMCIsCisJICAgIDB4NGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0lNT0RFMF9wYXJzZV90YWJsZVtdID0geworCXsgIkVOQVJCRE8iLAkJMHgwMSwgMHgwMSB9LAorCXsgIkVOU1BJT1JEWSIsCQkweDAyLCAweDAyIH0sCisJeyAiRU5PVkVSUlVOIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJFTklPRVJSIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJFTlNFTElOR08iLAkJMHgxMCwgMHgxMCB9LAorCXsgIkVOU0VMREkiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkVOU0VMRE8iLAkJMHg0MCwgMHg0MCB9Cit9OworCitpbnQKK2FoZF9zaW1vZGUwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTSU1PREUwX3BhcnNlX3RhYmxlLCA3LCAiU0lNT0RFMCIsCisJICAgIDB4NGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0xSU0lOVDFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDTFJSRVFJTklUIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJDTFJTVFJCMkZBU1QiLAkweDAyLCAweDAyIH0sCisJeyAiQ0xSU0NTSVBFUlIiLAkweDA0LCAweDA0IH0sCisJeyAiQ0xSQlVTRlJFRSIsCQkweDA4LCAweDA4IH0sCisJeyAiQ0xSU0NTSVJTVEkiLAkweDIwLCAweDIwIH0sCisJeyAiQ0xSQVROTyIsCQkweDQwLCAweDQwIH0sCisJeyAiQ0xSU0VMVElNRU8iLAkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2NscnNpbnQxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihDTFJTSU5UMV9wYXJzZV90YWJsZSwgNywgIkNMUlNJTlQxIiwKKwkgICAgMHg0YywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTU1RBVDFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJSRVFJTklUIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJTVFJCMkZBU1QiLAkJMHgwMiwgMHgwMiB9LAorCXsgIlNDU0lQRVJSIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJCVVNGUkVFIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJQSEFTRU1JUyIsCQkweDEwLCAweDEwIH0sCisJeyAiU0NTSVJTVEkiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkFUTlRBUkciLAkJMHg0MCwgMHg0MCB9LAorCXsgIlNFTFRPIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfc3N0YXQxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTU1RBVDFfcGFyc2VfdGFibGUsIDgsICJTU1RBVDEiLAorCSAgICAweDRjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNTVEFUMl9wYXJzZV90YWJsZVtdID0geworCXsgIkJVU0ZSRUVfTFFPIiwJMHg0MCwgMHhjMCB9LAorCXsgIkJVU0ZSRUVfREZGMCIsCTB4ODAsIDB4YzAgfSwKKwl7ICJCVVNGUkVFX0RGRjEiLAkweGMwLCAweGMwIH0sCisJeyAiRE1BRE9ORSIsCQkweDAxLCAweDAxIH0sCisJeyAiU0RPTkUiLAkJMHgwMiwgMHgwMiB9LAorCXsgIldJREVfUkVTIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJCU1lYIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJFWFBfQUNUSVZFIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJOT05QQUNLUkVRIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJCVVNGUkVFVElNRSIsCTB4YzAsIDB4YzAgfQorfTsKKworaW50CithaGRfc3N0YXQyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTU1RBVDJfcGFyc2VfdGFibGUsIDEwLCAiU1NUQVQyIiwKKwkgICAgMHg0ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTFJTSU5UMl9wYXJzZV90YWJsZVtdID0geworCXsgIkNMUkRNQURPTkUiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkNMUlNET05FIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJDTFJXSURFX1JFUyIsCTB4MDQsIDB4MDQgfSwKKwl7ICJDTFJOT05QQUNLUkVRIiwJMHgyMCwgMHgyMCB9Cit9OworCitpbnQKK2FoZF9jbHJzaW50Ml9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ0xSU0lOVDJfcGFyc2VfdGFibGUsIDQsICJDTFJTSU5UMiIsCisJICAgIDB4NGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0lNT0RFMl9wYXJzZV90YWJsZVtdID0geworCXsgIkVORE1BRE9ORSIsCQkweDAxLCAweDAxIH0sCisJeyAiRU5TRE9ORSIsCQkweDAyLCAweDAyIH0sCisJeyAiRU5XSURFX1JFUyIsCQkweDA0LCAweDA0IH0KK307CisKK2ludAorYWhkX3NpbW9kZTJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNJTU9ERTJfcGFyc2VfdGFibGUsIDMsICJTSU1PREUyIiwKKwkgICAgMHg0ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBQRVJSRElBR19wYXJzZV90YWJsZVtdID0geworCXsgIkRURVJSIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJER0ZPUk1FUlIiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkNSQ0VSUiIsCQkweDA0LCAweDA0IH0sCisJeyAiQUlQRVJSIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJQQVJJVFlFUlIiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlBSRVZQSEFTRSIsCQkweDIwLCAweDIwIH0sCisJeyAiSElQRVJSIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJISVpFUk8iLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9wZXJyZGlhZ19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoUEVSUkRJQUdfcGFyc2VfdGFibGUsIDgsICJQRVJSRElBRyIsCisJICAgIDB4NGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2xxaXN0YXRlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTFFJU1RBVEUiLAorCSAgICAweDRlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zb2ZmY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU09GRkNOVCIsCisJICAgIDB4NGYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2xxb3N0YXRlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTFFPU1RBVEUiLAorCSAgICAweDRmLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRSVNUQVQwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTFFJQVROQ01EIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJMUUlBVE5MUSIsCQkweDAyLCAweDAyIH0sCisJeyAiTFFJQkFETFFUIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJMUUlDUkNUMiIsCQkweDA4LCAweDA4IH0sCisJeyAiTFFJQ1JDVDEiLAkJMHgxMCwgMHgxMCB9LAorCXsgIkxRSUFUTlFBUyIsCQkweDIwLCAweDIwIH0KK307CisKK2ludAorYWhkX2xxaXN0YXQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihMUUlTVEFUMF9wYXJzZV90YWJsZSwgNiwgIkxRSVNUQVQwIiwKKwkgICAgMHg1MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTFJMUUlJTlQwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0xSTFFJQVROQ01EIiwJMHgwMSwgMHgwMSB9LAorCXsgIkNMUkxRSUFUTkxRIiwJMHgwMiwgMHgwMiB9LAorCXsgIkNMUkxRSUJBRExRVCIsCTB4MDQsIDB4MDQgfSwKKwl7ICJDTFJMUUlDUkNUMiIsCTB4MDgsIDB4MDggfSwKKwl7ICJDTFJMUUlDUkNUMSIsCTB4MTAsIDB4MTAgfSwKKwl7ICJDTFJMUUlBVE5RQVMiLAkweDIwLCAweDIwIH0KK307CisKK2ludAorYWhkX2NscmxxaWludDBfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENMUkxRSUlOVDBfcGFyc2VfdGFibGUsIDYsICJDTFJMUUlJTlQwIiwKKwkgICAgMHg1MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBMUUlNT0RFMF9wYXJzZV90YWJsZVtdID0geworCXsgIkVOTFFJQVROQ01EIiwJMHgwMSwgMHgwMSB9LAorCXsgIkVOTFFJQVROTFEiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkVOTFFJQkFETFFUIiwJMHgwNCwgMHgwNCB9LAorCXsgIkVOTFFJQ1JDVDIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIkVOTFFJQ1JDVDEiLAkJMHgxMCwgMHgxMCB9LAorCXsgIkVOTFFJQVROUUFTSyIsCTB4MjAsIDB4MjAgfQorfTsKKworaW50CithaGRfbHFpbW9kZTBfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKExRSU1PREUwX3BhcnNlX3RhYmxlLCA2LCAiTFFJTU9ERTAiLAorCSAgICAweDUwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRSU1PREUxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRU5MUUlPVkVSSV9OTFEiLAkweDAxLCAweDAxIH0sCisJeyAiRU5MUUlPVkVSSV9MUSIsCTB4MDIsIDB4MDIgfSwKKwl7ICJFTkxRSUJBRExRSSIsCTB4MDQsIDB4MDQgfSwKKwl7ICJFTkxRSUNSQ0lfTkxRIiwJMHgwOCwgMHgwOCB9LAorCXsgIkVOTFFJQ1JDSV9MUSIsCTB4MTAsIDB4MTAgfSwKKwl7ICJFTkxJUUFCT1JUIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJFTkxRSVBIQVNFX05MUSIsCTB4NDAsIDB4NDAgfSwKKwl7ICJFTkxRSVBIQVNFX0xRIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9scWltb2RlMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTFFJTU9ERTFfcGFyc2VfdGFibGUsIDgsICJMUUlNT0RFMSIsCisJICAgIDB4NTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgTFFJU1RBVDFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJMUUlPVkVSSV9OTFEiLAkweDAxLCAweDAxIH0sCisJeyAiTFFJT1ZFUklfTFEiLAkweDAyLCAweDAyIH0sCisJeyAiTFFJQkFETFFJIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJMUUlDUkNJX05MUSIsCTB4MDgsIDB4MDggfSwKKwl7ICJMUUlDUkNJX0xRIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJMUUlBQk9SVCIsCQkweDIwLCAweDIwIH0sCisJeyAiTFFJUEhBU0VfTkxRIiwJMHg0MCwgMHg0MCB9LAorCXsgIkxRSVBIQVNFX0xRIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9scWlzdGF0MV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTFFJU1RBVDFfcGFyc2VfdGFibGUsIDgsICJMUUlTVEFUMSIsCisJICAgIDB4NTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0xSTFFJSU5UMV9wYXJzZV90YWJsZVtdID0geworCXsgIkNMUkxRSU9WRVJJX05MUSIsCTB4MDEsIDB4MDEgfSwKKwl7ICJDTFJMUUlPVkVSSV9MUSIsCTB4MDIsIDB4MDIgfSwKKwl7ICJDTFJMUUlCQURMUUkiLAkweDA0LCAweDA0IH0sCisJeyAiQ0xSTFFJQ1JDSV9OTFEiLAkweDA4LCAweDA4IH0sCisJeyAiQ0xSTFFJQ1JDSV9MUSIsCTB4MTAsIDB4MTAgfSwKKwl7ICJDTFJMSVFBQk9SVCIsCTB4MjAsIDB4MjAgfSwKKwl7ICJDTFJMUUlQSEFTRV9OTFEiLAkweDQwLCAweDQwIH0sCisJeyAiQ0xSTFFJUEhBU0VfTFEiLAkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2NscmxxaWludDFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENMUkxRSUlOVDFfcGFyc2VfdGFibGUsIDgsICJDTFJMUUlJTlQxIiwKKwkgICAgMHg1MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBMUUlTVEFUMl9wYXJzZV90YWJsZVtdID0geworCXsgIkxRSUdTQVZBSUwiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkxRSVNUT1BDTUQiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkxRSVNUT1BMUSIsCQkweDA0LCAweDA0IH0sCisJeyAiTFFJU1RPUFBLVCIsCQkweDA4LCAweDA4IH0sCisJeyAiTFFJV0FJVEZJRk8iLAkweDEwLCAweDEwIH0sCisJeyAiTFFJV09SS09OTFEiLAkweDIwLCAweDIwIH0sCisJeyAiTFFJUEhBU0VfT1VUUEtUIiwJMHg0MCwgMHg0MCB9LAorCXsgIlBBQ0tFVElaRUQiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9scWlzdGF0Ml9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTFFJU1RBVDJfcGFyc2VfdGFibGUsIDgsICJMUUlTVEFUMiIsCisJICAgIDB4NTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU1NUQVQzX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiT1NSQU1QRVJSIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJOVFJBTVBFUlIiLAkJMHgwMiwgMHgwMiB9Cit9OworCitpbnQKK2FoZF9zc3RhdDNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNTVEFUM19wYXJzZV90YWJsZSwgMiwgIlNTVEFUMyIsCisJICAgIDB4NTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0lNT0RFM19wYXJzZV90YWJsZVtdID0geworCXsgIkVOT1NSQU1QRVJSIiwJMHgwMSwgMHgwMSB9LAorCXsgIkVOTlRSQU1QRVJSIiwJMHgwMiwgMHgwMiB9Cit9OworCitpbnQKK2FoZF9zaW1vZGUzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTSU1PREUzX3BhcnNlX3RhYmxlLCAyLCAiU0lNT0RFMyIsCisJICAgIDB4NTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0xSU0lOVDNfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDTFJPU1JBTVBFUlIiLAkweDAxLCAweDAxIH0sCisJeyAiQ0xSTlRSQU1QRVJSIiwJMHgwMiwgMHgwMiB9Cit9OworCitpbnQKK2FoZF9jbHJzaW50M19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ0xSU0lOVDNfcGFyc2VfdGFibGUsIDIsICJDTFJTSU5UMyIsCisJICAgIDB4NTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgTFFPTU9ERTBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJFTkxRT1RDUkMiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkVOTFFPQVROUEtUIiwJMHgwMiwgMHgwMiB9LAorCXsgIkVOTFFPQVROTFEiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkVOTFFPU1RPUFQyIiwJMHgwOCwgMHgwOCB9LAorCXsgIkVOTFFPVEFSR1NDQlBFUlIiLAkweDEwLCAweDEwIH0KK307CisKK2ludAorYWhkX2xxb21vZGUwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihMUU9NT0RFMF9wYXJzZV90YWJsZSwgNSwgIkxRT01PREUwIiwKKwkgICAgMHg1NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBMUU9TVEFUMF9wYXJzZV90YWJsZVtdID0geworCXsgIkxRT1RDUkMiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkxRT0FUTlBLVCIsCQkweDAyLCAweDAyIH0sCisJeyAiTFFPQVROTFEiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkxRT1NUT1BUMiIsCQkweDA4LCAweDA4IH0sCisJeyAiTFFPVEFSR1NDQlBFUlIiLAkweDEwLCAweDEwIH0KK307CisKK2ludAorYWhkX2xxb3N0YXQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihMUU9TVEFUMF9wYXJzZV90YWJsZSwgNSwgIkxRT1NUQVQwIiwKKwkgICAgMHg1NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTFJMUU9JTlQwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0xSTFFPVENSQyIsCQkweDAxLCAweDAxIH0sCisJeyAiQ0xSTFFPQVROUEtUIiwJMHgwMiwgMHgwMiB9LAorCXsgIkNMUkxRT0FUTkxRIiwJMHgwNCwgMHgwNCB9LAorCXsgIkNMUkxRT1NUT1BUMiIsCTB4MDgsIDB4MDggfSwKKwl7ICJDTFJMUU9UQVJHU0NCUEVSUiIsCTB4MTAsIDB4MTAgfQorfTsKKworaW50CithaGRfY2xybHFvaW50MF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ0xSTFFPSU5UMF9wYXJzZV90YWJsZSwgNSwgIkNMUkxRT0lOVDAiLAorCSAgICAweDU0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRT1NUQVQxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTFFPUEhBQ0hHSU5QS1QiLAkweDAxLCAweDAxIH0sCisJeyAiTFFPQlVTRlJFRSIsCQkweDAyLCAweDAyIH0sCisJeyAiTFFPQkFEUUFTIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJMUU9TVE9QSTIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIkxRT0lOSVRTQ0JQRVJSIiwJMHgxMCwgMHgxMCB9Cit9OworCitpbnQKK2FoZF9scW9zdGF0MV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTFFPU1RBVDFfcGFyc2VfdGFibGUsIDUsICJMUU9TVEFUMSIsCisJICAgIDB4NTUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0xSTFFPSU5UMV9wYXJzZV90YWJsZVtdID0geworCXsgIkNMUkxRT1BIQUNIR0lOUEtUIiwJMHgwMSwgMHgwMSB9LAorCXsgIkNMUkxRT0JVU0ZSRUUiLAkweDAyLCAweDAyIH0sCisJeyAiQ0xSTFFPQkFEUUFTIiwJMHgwNCwgMHgwNCB9LAorCXsgIkNMUkxRT1NUT1BJMiIsCTB4MDgsIDB4MDggfSwKKwl7ICJDTFJMUU9JTklUU0NCUEVSUiIsCTB4MTAsIDB4MTAgfQorfTsKKworaW50CithaGRfY2xybHFvaW50MV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ0xSTFFPSU5UMV9wYXJzZV90YWJsZSwgNSwgIkNMUkxRT0lOVDEiLAorCSAgICAweDU1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRT01PREUxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRU5MUU9QSEFDSEdJTlBLVCIsCTB4MDEsIDB4MDEgfSwKKwl7ICJFTkxRT0JVU0ZSRUUiLAkweDAyLCAweDAyIH0sCisJeyAiRU5MUU9CQURRQVMiLAkweDA0LCAweDA0IH0sCisJeyAiRU5MUU9TVE9QSTIiLAkweDA4LCAweDA4IH0sCisJeyAiRU5MUU9JTklUU0NCUEVSUiIsCTB4MTAsIDB4MTAgfQorfTsKKworaW50CithaGRfbHFvbW9kZTFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKExRT01PREUxX3BhcnNlX3RhYmxlLCA1LCAiTFFPTU9ERTEiLAorCSAgICAweDU1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRT1NUQVQyX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTFFPU1RPUDAiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkxRT1BIQUNIR09VVFBLVCIsCTB4MDIsIDB4MDIgfSwKKwl7ICJMUU9XQUlURklGTyIsCTB4MTAsIDB4MTAgfSwKKwl7ICJMUU9QS1QiLAkJMHhlMCwgMHhlMCB9Cit9OworCitpbnQKK2FoZF9scW9zdGF0Ml9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTFFPU1RBVDJfcGFyc2VfdGFibGUsIDQsICJMUU9TVEFUMiIsCisJICAgIDB4NTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX29zX3NwYWNlX2NudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk9TX1NQQUNFX0NOVCIsCisJICAgIDB4NTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0lNT0RFMV9wYXJzZV90YWJsZVtdID0geworCXsgIkVOUkVRSU5JVCIsCQkweDAxLCAweDAxIH0sCisJeyAiRU5TVFJCMkZBU1QiLAkweDAyLCAweDAyIH0sCisJeyAiRU5TQ1NJUEVSUiIsCQkweDA0LCAweDA0IH0sCisJeyAiRU5CVVNGUkVFIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJFTlBIQVNFTUlTIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJFTlNDU0lSU1QiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkVOQVROVEFSRyIsCQkweDQwLCAweDQwIH0sCisJeyAiRU5TRUxUSU1PIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfc2ltb2RlMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0lNT0RFMV9wYXJzZV90YWJsZSwgOCwgIlNJTU9ERTEiLAorCSAgICAweDU3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9nc2ZpZm9fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJHU0ZJRk8iLAorCSAgICAweDU4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IERGRlNYRlJDVExfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJSU1RDSE4iLAkJMHgwMSwgMHgwMSB9LAorCXsgIkNMUkNITiIsCQkweDAyLCAweDAyIH0sCisJeyAiQ0xSU0hDTlQiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkRGRkJJVEJVQ0tFVCIsCTB4MDgsIDB4MDggfQorfTsKKworaW50CithaGRfZGZmc3hmcmN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoREZGU1hGUkNUTF9wYXJzZV90YWJsZSwgNCwgIkRGRlNYRlJDVEwiLAorCSAgICAweDVhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRT1NDU0NUTF9wYXJzZV90YWJsZVtdID0geworCXsgIkxRT05PQ0hLT1ZFUiIsCTB4MDEsIDB4MDEgfSwKKwl7ICJMUU9IMkFfVkVSU0lPTiIsCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfbHFvc2NzY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihMUU9TQ1NDVExfcGFyc2VfdGFibGUsIDIsICJMUU9TQ1NDVEwiLAorCSAgICAweDVhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9uZXh0c2NiX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTkVYVFNDQiIsCisJICAgIDB4NWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0xSU0VRSU5UU1JDX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0xSQ0ZHNFRDTUQiLAkweDAxLCAweDAxIH0sCisJeyAiQ0xSQ0ZHNElDTUQiLAkweDAyLCAweDAyIH0sCisJeyAiQ0xSQ0ZHNFRTVEFUIiwJMHgwNCwgMHgwNCB9LAorCXsgIkNMUkNGRzRJU1RBVCIsCTB4MDgsIDB4MDggfSwKKwl7ICJDTFJDRkc0REFUQSIsCTB4MTAsIDB4MTAgfSwKKwl7ICJDTFJTQVZFUFRSUyIsCTB4MjAsIDB4MjAgfSwKKwl7ICJDTFJDVFhURE9ORSIsCTB4NDAsIDB4NDAgfQorfTsKKworaW50CithaGRfY2xyc2VxaW50c3JjX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihDTFJTRVFJTlRTUkNfcGFyc2VfdGFibGUsIDcsICJDTFJTRVFJTlRTUkMiLAorCSAgICAweDViLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNFUUlOVFNSQ19wYXJzZV90YWJsZVtdID0geworCXsgIkNGRzRUQ01EIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJDRkc0SUNNRCIsCQkweDAyLCAweDAyIH0sCisJeyAiQ0ZHNFRTVEFUIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJDRkc0SVNUQVQiLAkJMHgwOCwgMHgwOCB9LAorCXsgIkNGRzREQVRBIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJTQVZFUFRSUyIsCQkweDIwLCAweDIwIH0sCisJeyAiQ1RYVERPTkUiLAkJMHg0MCwgMHg0MCB9Cit9OworCitpbnQKK2FoZF9zZXFpbnRzcmNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNFUUlOVFNSQ19wYXJzZV90YWJsZSwgNywgIlNFUUlOVFNSQyIsCisJICAgIDB4NWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2N1cnJzY2JfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDVVJSU0NCIiwKKwkgICAgMHg1YywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTRVFJTU9ERV9wYXJzZV90YWJsZVtdID0geworCXsgIkVOQ0ZHNFRDTUQiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkVOQ0ZHNElDTUQiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkVOQ0ZHNFRTVEFUIiwJMHgwNCwgMHgwNCB9LAorCXsgIkVOQ0ZHNElTVEFUIiwJMHgwOCwgMHgwOCB9LAorCXsgIkVOQ0ZHNERBVEEiLAkJMHgxMCwgMHgxMCB9LAorCXsgIkVOU0FWRVBUUlMiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkVOQ1RYVERPTkUiLAkJMHg0MCwgMHg0MCB9Cit9OworCitpbnQKK2FoZF9zZXFpbW9kZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0VRSU1PREVfcGFyc2VfdGFibGUsIDcsICJTRVFJTU9ERSIsCisJICAgIDB4NWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgTURGRlNUQVRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJGSUZPRlJFRSIsCQkweDAxLCAweDAxIH0sCisJeyAiREFUQUlORklGTyIsCQkweDAyLCAweDAyIH0sCisJeyAiRExaRVJPIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJTSFZBTElEIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJMQVNUU0RPTkUiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlNIQ05UTUlOVVMxIiwJMHgyMCwgMHgyMCB9LAorCXsgIlNIQ05UTkVHQVRJVkUiLAkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhkX21kZmZzdGF0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihNREZGU1RBVF9wYXJzZV90YWJsZSwgNywgIk1ERkZTVEFUIiwKKwkgICAgMHg1ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDUkNDT05UUk9MX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ1JDVkFMQ0hLRU4iLAkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhkX2NyY2NvbnRyb2xfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENSQ0NPTlRST0xfcGFyc2VfdGFibGUsIDEsICJDUkNDT05UUk9MIiwKKwkgICAgMHg1ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfZGZmdGFnX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZGVEFHIiwKKwkgICAgMHg1ZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfbGFzdHNjYl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxBU1RTQ0IiLAorCSAgICAweDVlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNDU0lURVNUX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiU0VMX1RYUExMX0RFQlVHIiwJMHgwNCwgMHgwNCB9LAorCXsgIkNOVFJURVNUIiwJCTB4MDgsIDB4MDggfQorfTsKKworaW50CithaGRfc2NzaXRlc3RfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNDU0lURVNUX3BhcnNlX3RhYmxlLCAyLCAiU0NTSVRFU1QiLAorCSAgICAweDVlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IElPUEROQ1RMX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUEROX0RJRkZTRU5TRSIsCTB4MDEsIDB4MDEgfSwKKwl7ICJQRE5fSURJU1QiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkRJU0FCTEVfT0UiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9pb3BkbmN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoSU9QRE5DVExfcGFyc2VfdGFibGUsIDMsICJJT1BETkNUTCIsCisJICAgIDB4NWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NoYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNIQUREUiIsCisJICAgIDB4NjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX25lZ29hZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTkVHT0FERFIiLAorCSAgICAweDYwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9kZ3JwY3JjaV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRHUlBDUkNJIiwKKwkgICAgMHg2MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfbmVncGVyaW9kX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTkVHUEVSSU9EIiwKKwkgICAgMHg2MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfcGFja2NyY2lfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJQQUNLQ1JDSSIsCisJICAgIDB4NjIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX25lZ29mZnNldF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk5FR09GRlNFVCIsCisJICAgIDB4NjIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgTkVHUFBST1BUU19wYXJzZV90YWJsZVtdID0geworCXsgIlBQUk9QVF9JVVQiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlBQUk9QVF9EVCIsCQkweDAyLCAweDAyIH0sCisJeyAiUFBST1BUX1FBUyIsCQkweDA0LCAweDA0IH0sCisJeyAiUFBST1BUX1BBQ0UiLAkweDA4LCAweDA4IH0KK307CisKK2ludAorYWhkX25lZ3Bwcm9wdHNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5FR1BQUk9QVFNfcGFyc2VfdGFibGUsIDQsICJORUdQUFJPUFRTIiwKKwkgICAgMHg2MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBORUdDT05PUFRTX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiV0lERVhGRVIiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkVOQVVUT0FUTk8iLAkJMHgwMiwgMHgwMiB9LAorCXsgIkVOQVVUT0FUTkkiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkVOU0xPV0NSQyIsCQkweDA4LCAweDA4IH0sCisJeyAiUlRJX09WUkRUUk4iLAkweDEwLCAweDEwIH0sCisJeyAiUlRJX1dSVERJUyIsCQkweDIwLCAweDIwIH0sCisJeyAiRU5TTkFQU0hPVCIsCQkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhkX25lZ2Nvbm9wdHNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5FR0NPTk9QVFNfcGFyc2VfdGFibGUsIDcsICJORUdDT05PUFRTIiwKKwkgICAgMHg2NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfYW5uZXhjb2xfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBTk5FWENPTCIsCisJICAgIDB4NjUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NTQ0hLTl9wYXJzZV90YWJsZVtdID0geworCXsgIkxTVFNHQ0xSRElTIiwJMHgwMSwgMHgwMSB9LAorCXsgIlNIVkFMSURTVERJUyIsCTB4MDIsIDB4MDIgfSwKKwl7ICJERkZBQ1RDTFIiLAkJMHgwNCwgMHgwNCB9LAorCXsgIlNET05FTVNLRElTIiwJMHgwOCwgMHgwOCB9LAorCXsgIldJREVSRVNFTiIsCQkweDEwLCAweDEwIH0sCisJeyAiQ1VSUkZJRk9ERUYiLAkweDIwLCAweDIwIH0sCisJeyAiU1RTRUxTS0lERElTIiwJMHg0MCwgMHg0MCB9Cit9OworCitpbnQKK2FoZF9zY3NjaGtuX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTQ1NDSEtOX3BhcnNlX3RhYmxlLCA3LCAiU0NTQ0hLTiIsCisJICAgIDB4NjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2FubmV4ZGF0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQU5ORVhEQVQiLAorCSAgICAweDY2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9pb3duaWRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJT1dOSUQiLAorCSAgICAweDY3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFBMTDk2MENUTDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJQTExfRU5GQk0iLAkJMHgwMSwgMHgwMSB9LAorCXsgIlBMTF9ETFBGIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJQTExfRU5MUEYiLAkJMHgwNCwgMHgwNCB9LAorCXsgIlBMTF9FTkxVRCIsCQkweDA4LCAweDA4IH0sCisJeyAiUExMX05TIiwJCTB4MzAsIDB4MzAgfSwKKwl7ICJQTExfUFdETiIsCQkweDQwLCAweDQwIH0sCisJeyAiUExMX1ZDT1NFTCIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX3BsbDk2MGN0bDBfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFBMTDk2MENUTDBfcGFyc2VfdGFibGUsIDcsICJQTEw5NjBDVEwwIiwKKwkgICAgMHg2OCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfc2hjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTSENOVCIsCisJICAgIDB4NjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3Rvd25pZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlRPV05JRCIsCisJICAgIDB4NjksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgUExMOTYwQ1RMMV9wYXJzZV90YWJsZVtdID0geworCXsgIlBMTF9SU1QiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlBMTF9DTlRDTFIiLAkJMHg0MCwgMHg0MCB9LAorCXsgIlBMTF9DTlRFTiIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX3BsbDk2MGN0bDFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFBMTDk2MENUTDFfcGFyc2VfdGFibGUsIDMsICJQTEw5NjBDVEwxIiwKKwkgICAgMHg2OSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfcGxsOTYwY250MF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlBMTDk2MENOVDAiLAorCSAgICAweDZhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF94c2lnX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiWFNJRyIsCisJICAgIDB4NmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NlbG9pZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFTE9JRCIsCisJICAgIDB4NmIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgUExMNDAwQ1RMMF9wYXJzZV90YWJsZVtdID0geworCXsgIlBMTF9FTkZCTSIsCQkweDAxLCAweDAxIH0sCisJeyAiUExMX0RMUEYiLAkJMHgwMiwgMHgwMiB9LAorCXsgIlBMTF9FTkxQRiIsCQkweDA0LCAweDA0IH0sCisJeyAiUExMX0VOTFVEIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJQTExfTlMiLAkJMHgzMCwgMHgzMCB9LAorCXsgIlBMTF9QV0ROIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJQTExfVkNPU0VMIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfcGxsNDAwY3RsMF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoUExMNDAwQ1RMMF9wYXJzZV90YWJsZSwgNywgIlBMTDQwMENUTDAiLAorCSAgICAweDZjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9mYWlybmVzc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkZBSVJORVNTIiwKKwkgICAgMHg2YywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBQTEw0MDBDVEwxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUExMX1JTVCIsCQkweDAxLCAweDAxIH0sCisJeyAiUExMX0NOVENMUiIsCQkweDQwLCAweDQwIH0sCisJeyAiUExMX0NOVEVOIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfcGxsNDAwY3RsMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoUExMNDAwQ1RMMV9wYXJzZV90YWJsZSwgMywgIlBMTDQwMENUTDEiLAorCSAgICAweDZkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9wbGw0MDBjbnQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUExMNDAwQ05UMCIsCisJICAgIDB4NmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3VuZmFpcm5lc3NfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJVTkZBSVJORVNTIiwKKwkgICAgMHg2ZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfaGFkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIQUREUiIsCisJICAgIDB4NzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgUExMREVMQVlfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTUExJVF9EUk9QX1JFUSIsCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfcGxsZGVsYXlfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFBMTERFTEFZX3BhcnNlX3RhYmxlLCAxLCAiUExMREVMQVkiLAorCSAgICAweDcwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9ob2RtYWFkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkhPRE1BQURSIiwKKwkgICAgMHg3MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfaG9kbWFjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIT0RNQUNOVCIsCisJICAgIDB4NzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2hjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIQ05UIiwKKwkgICAgMHg3OCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfaG9kbWFlbl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkhPRE1BRU4iLAorCSAgICAweDdhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zZ2hhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0dIQUREUiIsCisJICAgIDB4N2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYmhhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCSEFERFIiLAorCSAgICAweDdjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zZ2hjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR0hDTlQiLAorCSAgICAweDg0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zY2JoY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCSENOVCIsCisJICAgIDB4ODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgREZGX1RIUlNIX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiV1JfREZUSFJTSF9NSU4iLAkweDAwLCAweDcwIH0sCisJeyAiUkRfREZUSFJTSF9NSU4iLAkweDAwLCAweDA3IH0sCisJeyAiUkRfREZUSFJTSF8yNSIsCTB4MDEsIDB4MDcgfSwKKwl7ICJSRF9ERlRIUlNIXzUwIiwJMHgwMiwgMHgwNyB9LAorCXsgIlJEX0RGVEhSU0hfNjMiLAkweDAzLCAweDA3IH0sCisJeyAiUkRfREZUSFJTSF83NSIsCTB4MDQsIDB4MDcgfSwKKwl7ICJSRF9ERlRIUlNIXzg1IiwJMHgwNSwgMHgwNyB9LAorCXsgIlJEX0RGVEhSU0hfOTAiLAkweDA2LCAweDA3IH0sCisJeyAiUkRfREZUSFJTSF9NQVgiLAkweDA3LCAweDA3IH0sCisJeyAiV1JfREZUSFJTSF8yNSIsCTB4MTAsIDB4NzAgfSwKKwl7ICJXUl9ERlRIUlNIXzUwIiwJMHgyMCwgMHg3MCB9LAorCXsgIldSX0RGVEhSU0hfNjMiLAkweDMwLCAweDcwIH0sCisJeyAiV1JfREZUSFJTSF83NSIsCTB4NDAsIDB4NzAgfSwKKwl7ICJXUl9ERlRIUlNIXzg1IiwJMHg1MCwgMHg3MCB9LAorCXsgIldSX0RGVEhSU0hfOTAiLAkweDYwLCAweDcwIH0sCisJeyAiV1JfREZUSFJTSF9NQVgiLAkweDcwLCAweDcwIH0sCisJeyAiUkRfREZUSFJTSCIsCQkweDA3LCAweDA3IH0sCisJeyAiV1JfREZUSFJTSCIsCQkweDcwLCAweDcwIH0KK307CisKK2ludAorYWhkX2RmZl90aHJzaF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoREZGX1RIUlNIX3BhcnNlX3RhYmxlLCAxOCwgIkRGRl9USFJTSCIsCisJICAgIDB4ODgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3JvbWFkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJST01BRERSIiwKKwkgICAgMHg4YSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBST01DTlRSTF9wYXJzZV90YWJsZVtdID0geworCXsgIlJEWSIsCQkweDAxLCAweDAxIH0sCisJeyAiUkVQRUFUIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJST01TUEQiLAkJMHgxOCwgMHgxOCB9LAorCXsgIlJPTU9QIiwJCTB4ZTAsIDB4ZTAgfQorfTsKKworaW50CithaGRfcm9tY250cmxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFJPTUNOVFJMX3BhcnNlX3RhYmxlLCA0LCAiUk9NQ05UUkwiLAorCSAgICAweDhkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9yb21kYXRhX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUk9NREFUQSIsCisJICAgIDB4OGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ01DUlhNU0cwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0ZOVU0iLAkJMHgwNywgMHgwNyB9LAorCXsgIkNETlVNIiwJCTB4ZjgsIDB4ZjggfQorfTsKKworaW50CithaGRfY21jcnhtc2cwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihDTUNSWE1TRzBfcGFyc2VfdGFibGUsIDIsICJDTUNSWE1TRzAiLAorCSAgICAweDkwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFJPRU5BQkxFX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRENIMFJPRU4iLAkJMHgwMSwgMHgwMSB9LAorCXsgIkRDSDFST0VOIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJTR1JPRU4iLAkJMHgwNCwgMHgwNCB9LAorCXsgIkNNQ1JPRU4iLAkJMHgwOCwgMHgwOCB9LAorCXsgIk9WTFlST0VOIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJNU0lST0VOIiwJCTB4MjAsIDB4MjAgfQorfTsKKworaW50CithaGRfcm9lbmFibGVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFJPRU5BQkxFX3BhcnNlX3RhYmxlLCA2LCAiUk9FTkFCTEUiLAorCSAgICAweDkwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IE9WTFlSWE1TRzBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDRk5VTSIsCQkweDA3LCAweDA3IH0sCisJeyAiQ0ROVU0iLAkJMHhmOCwgMHhmOCB9Cit9OworCitpbnQKK2FoZF9vdmx5cnhtc2cwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihPVkxZUlhNU0cwX3BhcnNlX3RhYmxlLCAyLCAiT1ZMWVJYTVNHMCIsCisJICAgIDB4OTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRENIUlhNU0cwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0ZOVU0iLAkJMHgwNywgMHgwNyB9LAorCXsgIkNETlVNIiwJCTB4ZjgsIDB4ZjggfQorfTsKKworaW50CithaGRfZGNocnhtc2cwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihEQ0hSWE1TRzBfcGFyc2VfdGFibGUsIDIsICJEQ0hSWE1TRzAiLAorCSAgICAweDkwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IE9WTFlSWE1TRzFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDQk5VTSIsCQkweGZmLCAweGZmIH0KK307CisKK2ludAorYWhkX292bHlyeG1zZzFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE9WTFlSWE1TRzFfcGFyc2VfdGFibGUsIDEsICJPVkxZUlhNU0cxIiwKKwkgICAgMHg5MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBOU0VOQUJMRV9wYXJzZV90YWJsZVtdID0geworCXsgIkRDSDBOU0VOIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJEQ0gxTlNFTiIsCQkweDAyLCAweDAyIH0sCisJeyAiU0dOU0VOIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJDTUNOU0VOIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJPVkxZTlNFTiIsCQkweDEwLCAweDEwIH0sCisJeyAiTVNJTlNFTiIsCQkweDIwLCAweDIwIH0KK307CisKK2ludAorYWhkX25zZW5hYmxlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOU0VOQUJMRV9wYXJzZV90YWJsZSwgNiwgIk5TRU5BQkxFIiwKKwkgICAgMHg5MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBEQ0hSWE1TRzFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDQk5VTSIsCQkweGZmLCAweGZmIH0KK307CisKK2ludAorYWhkX2RjaHJ4bXNnMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoRENIUlhNU0cxX3BhcnNlX3RhYmxlLCAxLCAiRENIUlhNU0cxIiwKKwkgICAgMHg5MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTUNSWE1TRzFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDQk5VTSIsCQkweGZmLCAweGZmIH0KK307CisKK2ludAorYWhkX2NtY3J4bXNnMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ01DUlhNU0cxX3BhcnNlX3RhYmxlLCAxLCAiQ01DUlhNU0cxIiwKKwkgICAgMHg5MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBEQ0hSWE1TRzJfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJNSU5ERVgiLAkJMHhmZiwgMHhmZiB9Cit9OworCitpbnQKK2FoZF9kY2hyeG1zZzJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERDSFJYTVNHMl9wYXJzZV90YWJsZSwgMSwgIkRDSFJYTVNHMiIsCisJICAgIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgT1ZMWVJYTVNHMl9wYXJzZV90YWJsZVtdID0geworCXsgIk1JTkRFWCIsCQkweGZmLCAweGZmIH0KK307CisKK2ludAorYWhkX292bHlyeG1zZzJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE9WTFlSWE1TRzJfcGFyc2VfdGFibGUsIDEsICJPVkxZUlhNU0cyIiwKKwkgICAgMHg5MiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTUNSWE1TRzJfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJNSU5ERVgiLAkJMHhmZiwgMHhmZiB9Cit9OworCitpbnQKK2FoZF9jbWNyeG1zZzJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENNQ1JYTVNHMl9wYXJzZV90YWJsZSwgMSwgIkNNQ1JYTVNHMiIsCisJICAgIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX29zdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk9TVCIsCisJICAgIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRENIUlhNU0czX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTUNMQVNTIiwJCTB4MGYsIDB4MGYgfQorfTsKKworaW50CithaGRfZGNocnhtc2czX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihEQ0hSWE1TRzNfcGFyc2VfdGFibGUsIDEsICJEQ0hSWE1TRzMiLAorCSAgICAweDkzLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IENNQ1JYTVNHM19wYXJzZV90YWJsZVtdID0geworCXsgIk1DTEFTUyIsCQkweDBmLCAweDBmIH0KK307CisKK2ludAorYWhkX2NtY3J4bXNnM19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ01DUlhNU0czX3BhcnNlX3RhYmxlLCAxLCAiQ01DUlhNU0czIiwKKwkgICAgMHg5MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBQQ0lYQ1RMX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ01QQUJDRElTIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJUU0NTRVJSRU4iLAkJMHgwMiwgMHgwMiB9LAorCXsgIlNSU1BEUEVFTiIsCQkweDA0LCAweDA0IH0sCisJeyAiU1BMVFNUQURJUyIsCQkweDA4LCAweDA4IH0sCisJeyAiU1BMVFNNQURJUyIsCQkweDEwLCAweDEwIH0sCisJeyAiVU5FWFBTQ0lFTiIsCQkweDIwLCAweDIwIH0sCisJeyAiU0VSUlBVTFNFIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfcGNpeGN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoUENJWENUTF9wYXJzZV90YWJsZSwgNywgIlBDSVhDVEwiLAorCSAgICAweDkzLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IE9WTFlSWE1TRzNfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJNQ0xBU1MiLAkJMHgwZiwgMHgwZiB9Cit9OworCitpbnQKK2FoZF9vdmx5cnhtc2czX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihPVkxZUlhNU0czX3BhcnNlX3RhYmxlLCAxLCAiT1ZMWVJYTVNHMyIsCisJICAgIDB4OTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX292bHlzZXFiY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1ZMWVNFUUJDTlQiLAorCSAgICAweDk0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9jbWNzZXFiY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01DU0VRQkNOVCIsCisJICAgIDB4OTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2RjaHNlcWJjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJEQ0hTRVFCQ05UIiwKKwkgICAgMHg5NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTUNTUExUU1RBVDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJSWFNQTFRSU1AiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlJYU0NFTVNHIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJSWE9WUlVOIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJDTlROT1RDTVBMVCIsCTB4MDgsIDB4MDggfSwKKwl7ICJTQ0RBVEJVQ0tFVCIsCTB4MTAsIDB4MTAgfSwKKwl7ICJTQ0FERVJSIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTQ0JDRVJSIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJTVEFFVEVSTSIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2NtY3NwbHRzdGF0MF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ01DU1BMVFNUQVQwX3BhcnNlX3RhYmxlLCA4LCAiQ01DU1BMVFNUQVQwIiwKKwkgICAgMHg5NiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBPVkxZU1BMVFNUQVQwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUlhTUExUUlNQIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJSWFNDRU1TRyIsCQkweDAyLCAweDAyIH0sCisJeyAiUlhPVlJVTiIsCQkweDA0LCAweDA0IH0sCisJeyAiQ05UTk9UQ01QTFQiLAkweDA4LCAweDA4IH0sCisJeyAiU0NEQVRCVUNLRVQiLAkweDEwLCAweDEwIH0sCisJeyAiU0NBREVSUiIsCQkweDIwLCAweDIwIH0sCisJeyAiU0NCQ0VSUiIsCQkweDQwLCAweDQwIH0sCisJeyAiU1RBRVRFUk0iLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9vdmx5c3BsdHN0YXQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihPVkxZU1BMVFNUQVQwX3BhcnNlX3RhYmxlLCA4LCAiT1ZMWVNQTFRTVEFUMCIsCisJICAgIDB4OTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRENIU1BMVFNUQVQwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUlhTUExUUlNQIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJSWFNDRU1TRyIsCQkweDAyLCAweDAyIH0sCisJeyAiUlhPVlJVTiIsCQkweDA0LCAweDA0IH0sCisJeyAiQ05UTk9UQ01QTFQiLAkweDA4LCAweDA4IH0sCisJeyAiU0NEQVRCVUNLRVQiLAkweDEwLCAweDEwIH0sCisJeyAiU0NBREVSUiIsCQkweDIwLCAweDIwIH0sCisJeyAiU0NCQ0VSUiIsCQkweDQwLCAweDQwIH0sCisJeyAiU1RBRVRFUk0iLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9kY2hzcGx0c3RhdDBfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERDSFNQTFRTVEFUMF9wYXJzZV90YWJsZSwgOCwgIkRDSFNQTFRTVEFUMCIsCisJICAgIDB4OTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRENIU1BMVFNUQVQxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUlhEQVRBQlVDS0VUIiwJMHgwMSwgMHgwMSB9Cit9OworCitpbnQKK2FoZF9kY2hzcGx0c3RhdDFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERDSFNQTFRTVEFUMV9wYXJzZV90YWJsZSwgMSwgIkRDSFNQTFRTVEFUMSIsCisJICAgIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ01DU1BMVFNUQVQxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUlhEQVRBQlVDS0VUIiwJMHgwMSwgMHgwMSB9Cit9OworCitpbnQKK2FoZF9jbWNzcGx0c3RhdDFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENNQ1NQTFRTVEFUMV9wYXJzZV90YWJsZSwgMSwgIkNNQ1NQTFRTVEFUMSIsCisJICAgIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgT1ZMWVNQTFRTVEFUMV9wYXJzZV90YWJsZVtdID0geworCXsgIlJYREFUQUJVQ0tFVCIsCTB4MDEsIDB4MDEgfQorfTsKKworaW50CithaGRfb3ZseXNwbHRzdGF0MV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoT1ZMWVNQTFRTVEFUMV9wYXJzZV90YWJsZSwgMSwgIk9WTFlTUExUU1RBVDEiLAorCSAgICAweDk3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNHUlhNU0cwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0ZOVU0iLAkJMHgwNywgMHgwNyB9LAorCXsgIkNETlVNIiwJCTB4ZjgsIDB4ZjggfQorfTsKKworaW50CithaGRfc2dyeG1zZzBfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNHUlhNU0cwX3BhcnNlX3RhYmxlLCAyLCAiU0dSWE1TRzAiLAorCSAgICAweDk4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNMVlNQTFRPVVRBRFIwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTE9XRVJfQUREUiIsCQkweDdmLCAweDdmIH0KK307CisKK2ludAorYWhkX3NsdnNwbHRvdXRhZHIwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTTFZTUExUT1VUQURSMF9wYXJzZV90YWJsZSwgMSwgIlNMVlNQTFRPVVRBRFIwIiwKKwkgICAgMHg5OCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTR1JYTVNHMV9wYXJzZV90YWJsZVtdID0geworCXsgIkNCTlVNIiwJCTB4ZmYsIDB4ZmYgfQorfTsKKworaW50CithaGRfc2dyeG1zZzFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNHUlhNU0cxX3BhcnNlX3RhYmxlLCAxLCAiU0dSWE1TRzEiLAorCSAgICAweDk5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNMVlNQTFRPVVRBRFIxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUkVRX0ZOVU0iLAkJMHgwNywgMHgwNyB9LAorCXsgIlJFUV9ETlVNIiwJCTB4ZjgsIDB4ZjggfQorfTsKKworaW50CithaGRfc2x2c3BsdG91dGFkcjFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNMVlNQTFRPVVRBRFIxX3BhcnNlX3RhYmxlLCAyLCAiU0xWU1BMVE9VVEFEUjEiLAorCSAgICAweDk5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNHUlhNU0cyX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTUlOREVYIiwJCTB4ZmYsIDB4ZmYgfQorfTsKKworaW50CithaGRfc2dyeG1zZzJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNHUlhNU0cyX3BhcnNlX3RhYmxlLCAxLCAiU0dSWE1TRzIiLAorCSAgICAweDlhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNMVlNQTFRPVVRBRFIyX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUkVRX0JOVU0iLAkJMHhmZiwgMHhmZiB9Cit9OworCitpbnQKK2FoZF9zbHZzcGx0b3V0YWRyMl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0xWU1BMVE9VVEFEUjJfcGFyc2VfdGFibGUsIDEsICJTTFZTUExUT1VUQURSMiIsCisJICAgIDB4OWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0dSWE1TRzNfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJNQ0xBU1MiLAkJMHgwZiwgMHgwZiB9Cit9OworCitpbnQKK2FoZF9zZ3J4bXNnM19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0dSWE1TRzNfcGFyc2VfdGFibGUsIDEsICJTR1JYTVNHMyIsCisJICAgIDB4OWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0xWU1BMVE9VVEFEUjNfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJSTFhPUkQiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlRBR19OVU0iLAkJMHgxZiwgMHgxZiB9Cit9OworCitpbnQKK2FoZF9zbHZzcGx0b3V0YWRyM19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0xWU1BMVE9VVEFEUjNfcGFyc2VfdGFibGUsIDIsICJTTFZTUExUT1VUQURSMyIsCisJICAgIDB4OWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3Nnc2VxYmNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHU0VRQkNOVCIsCisJICAgIDB4OWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0xWU1BMVE9VVEFUVFIwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTE9XRVJfQkNOVCIsCQkweGZmLCAweGZmIH0KK307CisKK2ludAorYWhkX3NsdnNwbHRvdXRhdHRyMF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0xWU1BMVE9VVEFUVFIwX3BhcnNlX3RhYmxlLCAxLCAiU0xWU1BMVE9VVEFUVFIwIiwKKwkgICAgMHg5YywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTTFZTUExUT1VUQVRUUjFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDTVBMVF9GTlVNIiwJCTB4MDcsIDB4MDcgfSwKKwl7ICJDTVBMVF9ETlVNIiwJCTB4ZjgsIDB4ZjggfQorfTsKKworaW50CithaGRfc2x2c3BsdG91dGF0dHIxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTTFZTUExUT1VUQVRUUjFfcGFyc2VfdGFibGUsIDIsICJTTFZTUExUT1VUQVRUUjEiLAorCSAgICAweDlkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNMVlNQTFRPVVRBVFRSMl9wYXJzZV90YWJsZVtdID0geworCXsgIkNNUExUX0JOVU0iLAkJMHhmZiwgMHhmZiB9Cit9OworCitpbnQKK2FoZF9zbHZzcGx0b3V0YXR0cjJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNMVlNQTFRPVVRBVFRSMl9wYXJzZV90YWJsZSwgMSwgIlNMVlNQTFRPVVRBVFRSMiIsCisJICAgIDB4OWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0dTUExUU1RBVDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJSWFNQTFRSU1AiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlJYU0NFTVNHIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJSWE9WUlVOIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJDTlROT1RDTVBMVCIsCTB4MDgsIDB4MDggfSwKKwl7ICJTQ0RBVEJVQ0tFVCIsCTB4MTAsIDB4MTAgfSwKKwl7ICJTQ0FERVJSIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTQ0JDRVJSIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJTVEFFVEVSTSIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX3Nnc3BsdHN0YXQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTR1NQTFRTVEFUMF9wYXJzZV90YWJsZSwgOCwgIlNHU1BMVFNUQVQwIiwKKwkgICAgMHg5ZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTRlVOQ1RfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJURVNUX05VTSIsCQkweDBmLCAweDBmIH0sCisJeyAiVEVTVF9HUk9VUCIsCQkweGYwLCAweGYwIH0KK307CisKK2ludAorYWhkX3NmdW5jdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0ZVTkNUX3BhcnNlX3RhYmxlLCAyLCAiU0ZVTkNUIiwKKwkgICAgMHg5ZiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTR1NQTFRTVEFUMV9wYXJzZV90YWJsZVtdID0geworCXsgIlJYREFUQUJVQ0tFVCIsCTB4MDEsIDB4MDEgfQorfTsKKworaW50CithaGRfc2dzcGx0c3RhdDFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNHU1BMVFNUQVQxX3BhcnNlX3RhYmxlLCAxLCAiU0dTUExUU1RBVDEiLAorCSAgICAweDlmLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IERGMFBDSVNUQVRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJEUFIiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlRXQVRFUlIiLAkJMHgwMiwgMHgwMiB9LAorCXsgIlJEUEVSUiIsCQkweDA0LCAweDA0IH0sCisJeyAiU0NBQVBFUlIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIlJUQSIsCQkweDEwLCAweDEwIH0sCisJeyAiUk1BIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTU0UiLAkJMHg0MCwgMHg0MCB9LAorCXsgIkRQRSIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2RmMHBjaXN0YXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERGMFBDSVNUQVRfcGFyc2VfdGFibGUsIDgsICJERjBQQ0lTVEFUIiwKKwkgICAgMHhhMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfcmVnMF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlJFRzAiLAorCSAgICAweGEwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IERGMVBDSVNUQVRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJEUFIiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlRXQVRFUlIiLAkJMHgwMiwgMHgwMiB9LAorCXsgIlJEUEVSUiIsCQkweDA0LCAweDA0IH0sCisJeyAiU0NBQVBFUlIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIlJUQSIsCQkweDEwLCAweDEwIH0sCisJeyAiUk1BIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTU0UiLAkJMHg0MCwgMHg0MCB9LAorCXsgIkRQRSIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2RmMXBjaXN0YXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERGMVBDSVNUQVRfcGFyc2VfdGFibGUsIDgsICJERjFQQ0lTVEFUIiwKKwkgICAgMHhhMSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTR1BDSVNUQVRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJEUFIiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlJEUEVSUiIsCQkweDA0LCAweDA0IH0sCisJeyAiU0NBQVBFUlIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIlJUQSIsCQkweDEwLCAweDEwIH0sCisJeyAiUk1BIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTU0UiLAkJMHg0MCwgMHg0MCB9LAorCXsgIkRQRSIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX3NncGNpc3RhdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0dQQ0lTVEFUX3BhcnNlX3RhYmxlLCA3LCAiU0dQQ0lTVEFUIiwKKwkgICAgMHhhMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfcmVnMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlJFRzEiLAorCSAgICAweGEyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IENNQ1BDSVNUQVRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJEUFIiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlRXQVRFUlIiLAkJMHgwMiwgMHgwMiB9LAorCXsgIlJEUEVSUiIsCQkweDA0LCAweDA0IH0sCisJeyAiU0NBQVBFUlIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIlJUQSIsCQkweDEwLCAweDEwIH0sCisJeyAiUk1BIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTU0UiLAkJMHg0MCwgMHg0MCB9LAorCXsgIkRQRSIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2NtY3BjaXN0YXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENNQ1BDSVNUQVRfcGFyc2VfdGFibGUsIDgsICJDTUNQQ0lTVEFUIiwKKwkgICAgMHhhMywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBPVkxZUENJU1RBVF9wYXJzZV90YWJsZVtdID0geworCXsgIkRQUiIsCQkweDAxLCAweDAxIH0sCisJeyAiUkRQRVJSIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJTQ0FBUEVSUiIsCQkweDA4LCAweDA4IH0sCisJeyAiUlRBIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJSTUEiLAkJMHgyMCwgMHgyMCB9LAorCXsgIlNTRSIsCQkweDQwLCAweDQwIH0sCisJeyAiRFBFIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfb3ZseXBjaXN0YXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE9WTFlQQ0lTVEFUX3BhcnNlX3RhYmxlLCA3LCAiT1ZMWVBDSVNUQVQiLAorCSAgICAweGE0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9yZWdfaXNyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUkVHX0lTUiIsCisJICAgIDB4YTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0dfU1RBVEVfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTRUdTX0FWQUlMIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJMT0FESU5HX05FRURFRCIsCTB4MDIsIDB4MDIgfSwKKwl7ICJGRVRDSF9JTlBST0ciLAkweDA0LCAweDA0IH0KK307CisKK2ludAorYWhkX3NnX3N0YXRlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTR19TVEFURV9wYXJzZV90YWJsZSwgMywgIlNHX1NUQVRFIiwKKwkgICAgMHhhNiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBNU0lQQ0lTVEFUX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRFBSIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJUV0FURVJSIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJDTFJQRU5ETVNJIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJSVEEiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlJNQSIsCQkweDIwLCAweDIwIH0sCisJeyAiU1NFIiwJCTB4NDAsIDB4NDAgfQorfTsKKworaW50CithaGRfbXNpcGNpc3RhdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTVNJUENJU1RBVF9wYXJzZV90YWJsZSwgNiwgIk1TSVBDSVNUQVQiLAorCSAgICAweGE2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFRBUkdQQ0lTVEFUX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiVFdBVEVSUiIsCQkweDAyLCAweDAyIH0sCisJeyAiU1RBIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJTU0UiLAkJMHg0MCwgMHg0MCB9LAorCXsgIkRQRSIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX3RhcmdwY2lzdGF0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihUQVJHUENJU1RBVF9wYXJzZV90YWJsZSwgNCwgIlRBUkdQQ0lTVEFUIiwKKwkgICAgMHhhNywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfZGF0YV9jb3VudF9vZGRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJEQVRBX0NPVU5UX09ERCIsCisJICAgIDB4YTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYnB0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQlBUUiIsCisJICAgIDB4YTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2Njc2NiYWNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0NCQUNOVCIsCisJICAgIDB4YWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NCQVVUT1BUUl9wYXJzZV90YWJsZVtdID0geworCXsgIlNDQlBUUl9PRkYiLAkJMHgwNywgMHgwNyB9LAorCXsgIlNDQlBUUl9BRERSIiwJMHgzOCwgMHgzOCB9LAorCXsgIkFVU0NCUFRSX0VOIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9zY2JhdXRvcHRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTQ0JBVVRPUFRSX3BhcnNlX3RhYmxlLCAzLCAiU0NCQVVUT1BUUiIsCisJICAgIDB4YWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2Njc2dhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTR0FERFIiLAorCSAgICAweGFjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9jY3NjYmFkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQkFERFIiLAorCSAgICAweGFjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9jY3NjYmFkcl9ia19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0NCQURSX0JLIiwKKwkgICAgMHhhYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTUNfUkFNQklTVF9wYXJzZV90YWJsZVtdID0geworCXsgIkNNQ19CVUZGRVJfQklTVF9FTiIsCTB4MDEsIDB4MDEgfSwKKwl7ICJDTUNfQlVGRkVSX0JJU1RfRkFJTCIsMHgwMiwgMHgwMiB9LAorCXsgIlNHX0JJU1RfRU4iLAkJMHgxMCwgMHgxMCB9LAorCXsgIlNHX0JJU1RfRkFJTCIsCTB4MjAsIDB4MjAgfSwKKwl7ICJTQ0JSQU1CSVNUX0ZBSUwiLAkweDQwLCAweDQwIH0sCisJeyAiU0dfRUxFTUVOVF9TSVpFIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9jbWNfcmFtYmlzdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ01DX1JBTUJJU1RfcGFyc2VfdGFibGUsIDYsICJDTUNfUkFNQklTVCIsCisJICAgIDB4YWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0NTR0NUTF9wYXJzZV90YWJsZVtdID0geworCXsgIkNDU0dSRVNFVCIsCQkweDAxLCAweDAxIH0sCisJeyAiU0dfRkVUQ0hfUkVRIiwJMHgwMiwgMHgwMiB9LAorCXsgIkNDU0dFTkFDSyIsCQkweDA4LCAweDA4IH0sCisJeyAiU0dfQ0FDSEVfQVZBSUwiLAkweDEwLCAweDEwIH0sCisJeyAiQ0NTR0RPTkUiLAkJMHg4MCwgMHg4MCB9LAorCXsgIkNDU0dFTiIsCQkweDBjLCAweDBjIH0KK307CisKK2ludAorYWhkX2Njc2djdGxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENDU0dDVExfcGFyc2VfdGFibGUsIDYsICJDQ1NHQ1RMIiwKKwkgICAgMHhhZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDQ1NDQkNUTF9wYXJzZV90YWJsZVtdID0geworCXsgIkNDU0NCUkVTRVQiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkNDU0NCRElSIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJDQ1NDQkVOIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJDQ0FSUkVOIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJBUlJET05FIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJDQ1NDQkRPTkUiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9jY3NjYmN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ0NTQ0JDVExfcGFyc2VfdGFibGUsIDYsICJDQ1NDQkNUTCIsCisJICAgIDB4YWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2Njc2dyYW1fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NHUkFNIiwKKwkgICAgMHhiMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfZmxleGFkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkZMRVhBRFIiLAorCSAgICAweGIwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9jY3NjYnJhbV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0NCUkFNIiwKKwkgICAgMHhiMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfZmxleGNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkZMRVhDTlQiLAorCSAgICAweGIzLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IEZMRVhETUFTVEFUX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRkxFWERNQURPTkUiLAkweDAxLCAweDAxIH0sCisJeyAiRkxFWERNQUVSUiIsCQkweDAyLCAweDAyIH0KK307CisKK2ludAorYWhkX2ZsZXhkbWFzdGF0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihGTEVYRE1BU1RBVF9wYXJzZV90YWJsZSwgMiwgIkZMRVhETUFTVEFUIiwKKwkgICAgMHhiNSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfZmxleGRhdGFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJGTEVYREFUQSIsCisJICAgIDB4YjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2JyZGRhdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJSRERBVCIsCisJICAgIDB4YjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQlJEQ1RMX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQlJEU1RCIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJCUkRSVyIsCQkweDAyLCAweDAyIH0sCisJeyAiQlJERU4iLAkJMHgwNCwgMHgwNCB9LAorCXsgIkJSREFERFIiLAkJMHgzOCwgMHgzOCB9LAorCXsgIkZMWEFSQlJFUSIsCQkweDQwLCAweDQwIH0sCisJeyAiRkxYQVJCQUNLIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfYnJkY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihCUkRDVExfcGFyc2VfdGFibGUsIDYsICJCUkRDVEwiLAorCSAgICAweGI5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zZWVhZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRUVBRFIiLAorCSAgICAweGJhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zZWVkYXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRUVEQVQiLAorCSAgICAweGJjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNFRUNUTF9wYXJzZV90YWJsZVtdID0geworCXsgIlNFRU9QX0VSQUwiLAkJMHg0MCwgMHg3MCB9LAorCXsgIlNFRU9QX1dSSVRFIiwJMHg1MCwgMHg3MCB9LAorCXsgIlNFRU9QX1JFQUQiLAkJMHg2MCwgMHg3MCB9LAorCXsgIlNFRU9QX0VSQVNFIiwJMHg3MCwgMHg3MCB9LAorCXsgIlNFRVNUQVJUIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJTRUVSU1QiLAkJMHgwMiwgMHgwMiB9LAorCXsgIlNFRU9QQ09ERSIsCQkweDcwLCAweDcwIH0sCisJeyAiU0VFT1BfRVdFTiIsCQkweDQwLCAweDQwIH0sCisJeyAiU0VFT1BfV0FMTCIsCQkweDQwLCAweDQwIH0sCisJeyAiU0VFT1BfRVdEUyIsCQkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhkX3NlZWN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0VFQ1RMX3BhcnNlX3RhYmxlLCAxMCwgIlNFRUNUTCIsCisJICAgIDB4YmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0VFU1RBVF9wYXJzZV90YWJsZVtdID0geworCXsgIlNFRVNUQVJUIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJTRUVCVVNZIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJTRUVBUkJBQ0siLAkJMHgwNCwgMHgwNCB9LAorCXsgIkxEQUxUSURfTCIsCQkweDA4LCAweDA4IH0sCisJeyAiU0VFT1BDT0RFIiwJCTB4NzAsIDB4NzAgfSwKKwl7ICJJTklUX0RPTkUiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9zZWVzdGF0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTRUVTVEFUX3BhcnNlX3RhYmxlLCA2LCAiU0VFU1RBVCIsCisJICAgIDB4YmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYmNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQkNOVCIsCisJICAgIDB4YmYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2Rmd2FkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERldBRERSIiwKKwkgICAgMHhjMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBEU1BGTFRSQ1RMX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRFNQRkNOVFNFTCIsCQkweDBmLCAweDBmIH0sCisJeyAiRURHRVNFTlNFIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJGTFRSRElTQUJMRSIsCTB4MjAsIDB4MjAgfQorfTsKKworaW50CithaGRfZHNwZmx0cmN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoRFNQRkxUUkNUTF9wYXJzZV90YWJsZSwgMywgIkRTUEZMVFJDVEwiLAorCSAgICAweGMwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IERTUERBVEFDVExfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJYTUlUT0ZGU1RESVMiLAkweDAyLCAweDAyIH0sCisJeyAiUkNWUk9GRlNURElTIiwJMHgwNCwgMHgwNCB9LAorCXsgIkRFU1FESVMiLAkJMHgxMCwgMHgxMCB9LAorCXsgIkJZUEFTU0VOQUIiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9kc3BkYXRhY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihEU1BEQVRBQ1RMX3BhcnNlX3RhYmxlLCA0LCAiRFNQREFUQUNUTCIsCisJICAgIDB4YzEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2RmcmFkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERlJBRERSIiwKKwkgICAgMHhjMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBEU1BSRVFDVExfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJNQU5SRVFETFkiLAkJMHgzZiwgMHgzZiB9LAorCXsgIk1BTlJFUUNUTCIsCQkweGMwLCAweGMwIH0KK307CisKK2ludAorYWhkX2RzcHJlcWN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoRFNQUkVRQ1RMX3BhcnNlX3RhYmxlLCAyLCAiRFNQUkVRQ1RMIiwKKwkgICAgMHhjMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBEU1BBQ0tDVExfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJNQU5BQ0tETFkiLAkJMHgzZiwgMHgzZiB9LAorCXsgIk1BTkFDS0NUTCIsCQkweGMwLCAweGMwIH0KK307CisKK2ludAorYWhkX2RzcGFja2N0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoRFNQQUNLQ1RMX3BhcnNlX3RhYmxlLCAyLCAiRFNQQUNLQ1RMIiwKKwkgICAgMHhjMywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfZGZkYXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERkRBVCIsCisJICAgIDB4YzQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRFNQU0VMRUNUX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRFNQU0VMIiwJCTB4MWYsIDB4MWYgfSwKKwl7ICJBVVRPSU5DRU4iLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9kc3BzZWxlY3RfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERTUFNFTEVDVF9wYXJzZV90YWJsZSwgMiwgIkRTUFNFTEVDVCIsCisJICAgIDB4YzQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgV1JUQklBU0NUTF9wYXJzZV90YWJsZVtdID0geworCXsgIlhNSVRNQU5WQUwiLAkJMHgzZiwgMHgzZiB9LAorCXsgIkFVVE9YQkNESVMiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF93cnRiaWFzY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihXUlRCSUFTQ1RMX3BhcnNlX3RhYmxlLCAyLCAiV1JUQklBU0NUTCIsCisJICAgIDB4YzUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgUkNWUkJJT1NDVExfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJSQ1ZSTUFOVkFMIiwJCTB4M2YsIDB4M2YgfSwKKwl7ICJBVVRPUkJDRElTIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfcmN2cmJpb3NjdGxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFJDVlJCSU9TQ1RMX3BhcnNlX3RhYmxlLCAyLCAiUkNWUkJJT1NDVEwiLAorCSAgICAweGM2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF93cnRiaWFzY2FsY19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIldSVEJJQVNDQUxDIiwKKwkgICAgMHhjNywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfZGZwdHJzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZQVFJTIiwKKwkgICAgMHhjOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfcmN2cmJpYXNjYWxjX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUkNWUkJJQVNDQUxDIiwKKwkgICAgMHhjOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfZGZia3B0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGQktQVFIiLAorCSAgICAweGM5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9za2V3Y2FsY19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNLRVdDQUxDIiwKKwkgICAgMHhjOSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBERkRCQ1RMX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiREZGX1JBTUJJU1RfRU4iLAkweDAxLCAweDAxIH0sCisJeyAiREZGX1JBTUJJU1RfRE9ORSIsCTB4MDIsIDB4MDIgfSwKKwl7ICJERkZfUkFNQklTVF9GQUlMIiwJMHgwNCwgMHgwNCB9LAorCXsgIkRGRl9ESVJfRVJSIiwJMHgwOCwgMHgwOCB9LAorCXsgIkRGRl9DSU9fUkRfUkRZIiwJMHgxMCwgMHgxMCB9LAorCXsgIkRGRl9DSU9fV1JfUkRZIiwJMHgyMCwgMHgyMCB9Cit9OworCitpbnQKK2FoZF9kZmRiY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihERkRCQ1RMX3BhcnNlX3RhYmxlLCA2LCAiREZEQkNUTCIsCisJICAgIDB4Y2IsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2Rmc2NudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGU0NOVCIsCisJICAgIDB4Y2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2RmYmNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGQkNOVCIsCisJICAgIDB4Y2UsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX292bHlhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1ZMWUFERFIiLAorCSAgICAweGQ0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNFUUNUTDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJMT0FEUkFNIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJTRVFSRVNFVCIsCQkweDAyLCAweDAyIH0sCisJeyAiU1RFUCIsCQkweDA0LCAweDA0IH0sCisJeyAiQlJLQURSSU5URU4iLAkweDA4LCAweDA4IH0sCisJeyAiRkFTVE1PREUiLAkJMHgxMCwgMHgxMCB9LAorCXsgIkZBSUxESVMiLAkJMHgyMCwgMHgyMCB9LAorCXsgIlBBVVNFRElTIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJQRVJST1JESVMiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9zZXFjdGwwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTRVFDVEwwX3BhcnNlX3RhYmxlLCA4LCAiU0VRQ1RMMCIsCisJICAgIDB4ZDYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0VRQ1RMMV9wYXJzZV90YWJsZVtdID0geworCXsgIlJBTUJJU1RfRU4iLAkJMHgwMSwgMHgwMSB9LAorCXsgIlJBTUJJU1RfRkFJTCIsCTB4MDIsIDB4MDIgfSwKKwl7ICJSQU1CSVNUX0RPTkUiLAkweDA0LCAweDA0IH0sCisJeyAiT1ZSTEFZX0RBVEFfQ0hLIiwJMHgwOCwgMHgwOCB9Cit9OworCitpbnQKK2FoZF9zZXFjdGwxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTRVFDVEwxX3BhcnNlX3RhYmxlLCA0LCAiU0VRQ1RMMSIsCisJICAgIDB4ZDcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRkxBR1NfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDQVJSWSIsCQkweDAxLCAweDAxIH0sCisJeyAiWkVSTyIsCQkweDAyLCAweDAyIH0KK307CisKK2ludAorYWhkX2ZsYWdzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihGTEFHU19wYXJzZV90YWJsZSwgMiwgIkZMQUdTIiwKKwkgICAgMHhkOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTRVFJTlRDVExfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJJUkVUIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJJTlRNQVNLMSIsCQkweDAyLCAweDAyIH0sCisJeyAiSU5UTUFTSzIiLAkJMHgwNCwgMHgwNCB9LAorCXsgIlNDU19TRVFfSU5UMU0wIiwJMHgwOCwgMHgwOCB9LAorCXsgIlNDU19TRVFfSU5UMU0xIiwJMHgxMCwgMHgxMCB9LAorCXsgIklOVDFfQ09OVEVYVCIsCTB4MjAsIDB4MjAgfSwKKwl7ICJJTlRWRUMxRFNMIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfc2VxaW50Y3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTRVFJTlRDVExfcGFyc2VfdGFibGUsIDcsICJTRVFJTlRDVEwiLAorCSAgICAweGQ5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zZXFyYW1fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRVFSQU0iLAorCSAgICAweGRhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9wcmdtY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUFJHTUNOVCIsCisJICAgIDB4ZGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2FjY3VtX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQUNDVU0iLAorCSAgICAweGUwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zaW5kZXhfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTSU5ERVgiLAorCSAgICAweGUyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9kaW5kZXhfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJESU5ERVgiLAorCSAgICAweGU0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IEJSS0FERFIxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQlJLRElTIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfYnJrYWRkcjFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKEJSS0FERFIxX3BhcnNlX3RhYmxlLCAxLCAiQlJLQUREUjEiLAorCSAgICAweGU2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9icmthZGRyMF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJSS0FERFIwIiwKKwkgICAgMHhlNiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfYWxsb25lc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFMTE9ORVMiLAorCSAgICAweGU4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9hbGx6ZXJvc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFMTFpFUk9TIiwKKwkgICAgMHhlYSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfbm9uZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk5PTkUiLAorCSAgICAweGVhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zaW5kaXJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTSU5ESVIiLAorCSAgICAweGVjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9kaW5kaXJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJESU5ESVIiLAorCSAgICAweGVkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9mdW5jdGlvbjFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJGVU5DVElPTjEiLAorCSAgICAweGYwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zdGFja19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNUQUNLIiwKKwkgICAgMHhmMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfY3VyYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNVUkFERFIiLAorCSAgICAweGY0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9pbnR2ZWMxX2FkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRWRUMxX0FERFIiLAorCSAgICAweGY0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9pbnR2ZWMyX2FkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRWRUMyX0FERFIiLAorCSAgICAweGY2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9sYXN0YWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxBU1RBRERSIiwKKwkgICAgMHhmNiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfbG9uZ2ptcF9hZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTE9OR0pNUF9BRERSIiwKKwkgICAgMHhmOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfYWNjdW1fc2F2ZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFDQ1VNX1NBVkUiLAorCSAgICAweGZhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF93YWl0aW5nX3NjYl90YWlsc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIldBSVRJTkdfU0NCX1RBSUxTIiwKKwkgICAgMHgxMDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2FoZF9wY2lfY29uZmlnX2Jhc2VfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBSERfUENJX0NPTkZJR19CQVNFIiwKKwkgICAgMHgxMDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NyYW1fYmFzZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNSQU1fQkFTRSIsCisJICAgIDB4MTAwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF93YWl0aW5nX3RpZF9oZWFkX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiV0FJVElOR19USURfSEVBRCIsCisJICAgIDB4MTIwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF93YWl0aW5nX3RpZF90YWlsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiV0FJVElOR19USURfVEFJTCIsCisJICAgIDB4MTIyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9uZXh0X3F1ZXVlZF9zY2JfYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk5FWFRfUVVFVUVEX1NDQl9BRERSIiwKKwkgICAgMHgxMjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2NvbXBsZXRlX3NjYl9oZWFkX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ09NUExFVEVfU0NCX0hFQUQiLAorCSAgICAweDEyOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfY29tcGxldGVfc2NiX2RtYWlucHJvZ19oZWFkX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ09NUExFVEVfU0NCX0RNQUlOUFJPR19IRUFEIiwKKwkgICAgMHgxMmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2NvbXBsZXRlX2RtYV9zY2JfaGVhZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNPTVBMRVRFX0RNQV9TQ0JfSEVBRCIsCisJICAgIDB4MTJjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9xZnJlZXplX2NvdW50X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUUZSRUVaRV9DT1VOVCIsCisJICAgIDB4MTJlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zYXZlZF9tb2RlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0FWRURfTU9ERSIsCisJICAgIDB4MTMwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9tc2dfb3V0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTVNHX09VVCIsCisJICAgIDB4MTMxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IERNQVBBUkFNU19wYXJzZV90YWJsZVtdID0geworCXsgIkZJRk9SRVNFVCIsCQkweDAxLCAweDAxIH0sCisJeyAiRklGT0ZMVVNIIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJESVJFQ1RJT04iLAkJMHgwNCwgMHgwNCB9LAorCXsgIkhETUFFTiIsCQkweDA4LCAweDA4IH0sCisJeyAiSERNQUVOQUNLIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJTRE1BRU4iLAkJMHgxMCwgMHgxMCB9LAorCXsgIlNETUFFTkFDSyIsCQkweDEwLCAweDEwIH0sCisJeyAiU0NTSUVOIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJXSURFT0REIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJQUkVMT0FERU4iLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9kbWFwYXJhbXNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERNQVBBUkFNU19wYXJzZV90YWJsZSwgMTAsICJETUFQQVJBTVMiLAorCSAgICAweDEzMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTRVFfRkxBR1NfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJOT19ESVNDT05ORUNUIiwJMHgwMSwgMHgwMSB9LAorCXsgIlNQSEFTRV9QRU5ESU5HIiwJMHgwMiwgMHgwMiB9LAorCXsgIkRQSEFTRV9QRU5ESU5HIiwJMHgwNCwgMHgwNCB9LAorCXsgIkNNRFBIQVNFX1BFTkRJTkciLAkweDA4LCAweDA4IH0sCisJeyAiVEFSR19DTURfUEVORElORyIsCTB4MTAsIDB4MTAgfSwKKwl7ICJEUEhBU0UiLAkJMHgyMCwgMHgyMCB9LAorCXsgIk5PX0NEQl9TRU5UIiwJMHg0MCwgMHg0MCB9LAorCXsgIlRBUkdFVF9DTURfSVNfVEFHR0VEIiwweDQwLCAweDQwIH0sCisJeyAiTk9UX0lERU5USUZJRUQiLAkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX3NlcV9mbGFnc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0VRX0ZMQUdTX3BhcnNlX3RhYmxlLCA5LCAiU0VRX0ZMQUdTIiwKKwkgICAgMHgxMzMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NhdmVkX3Njc2lpZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX1NDU0lJRCIsCisJICAgIDB4MTM0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zYXZlZF9sdW5fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQVZFRF9MVU4iLAorCSAgICAweDEzNSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBMQVNUUEhBU0VfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJQX0RBVEFPVVQiLAkJMHgwMCwgMHhlMCB9LAorCXsgIlBfREFUQU9VVF9EVCIsCTB4MjAsIDB4ZTAgfSwKKwl7ICJQX0RBVEFJTiIsCQkweDQwLCAweGUwIH0sCisJeyAiUF9EQVRBSU5fRFQiLAkweDYwLCAweGUwIH0sCisJeyAiUF9DT01NQU5EIiwJCTB4ODAsIDB4ZTAgfSwKKwl7ICJQX01FU0dPVVQiLAkJMHhhMCwgMHhlMCB9LAorCXsgIlBfU1RBVFVTIiwJCTB4YzAsIDB4ZTAgfSwKKwl7ICJQX01FU0dJTiIsCQkweGUwLCAweGUwIH0sCisJeyAiUF9CVVNGUkVFIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJNU0dJIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJJT0kiLAkJMHg0MCwgMHg0MCB9LAorCXsgIkNESSIsCQkweDgwLCAweDgwIH0sCisJeyAiUEhBU0VfTUFTSyIsCQkweGUwLCAweGUwIH0KK307CisKK2ludAorYWhkX2xhc3RwaGFzZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTEFTVFBIQVNFX3BhcnNlX3RhYmxlLCAxMywgIkxBU1RQSEFTRSIsCisJICAgIDB4MTM2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9xb3V0Zmlmb19lbnRyeV92YWxpZF90YWdfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRT1VURklGT19FTlRSWV9WQUxJRF9UQUciLAorCSAgICAweDEzNywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfc2hhcmVkX2RhdGFfYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNIQVJFRF9EQVRBX0FERFIiLAorCSAgICAweDEzOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfcW91dGZpZm9fbmV4dF9hZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUU9VVEZJRk9fTkVYVF9BRERSIiwKKwkgICAgMHgxM2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2tlcm5lbF90cWlucG9zX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiS0VSTkVMX1RRSU5QT1MiLAorCSAgICAweDE0MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfdHFpbnBvc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlRRSU5QT1MiLAorCSAgICAweDE0MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBBUkdfMV9wYXJzZV90YWJsZVtdID0geworCXsgIkNPTlRfTVNHX0xPT1BfVEFSRyIsCTB4MDIsIDB4MDIgfSwKKwl7ICJDT05UX01TR19MT09QX1JFQUQiLAkweDAzLCAweDAzIH0sCisJeyAiQ09OVF9NU0dfTE9PUF9XUklURSIsMHgwNCwgMHgwNCB9LAorCXsgIkVYSVRfTVNHX0xPT1AiLAkweDA4LCAweDA4IH0sCisJeyAiTVNHT1VUX1BIQVNFTUlTIiwJMHgxMCwgMHgxMCB9LAorCXsgIlNFTkRfUkVKIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTRU5EX1NFTlNFIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJTRU5EX01TRyIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2FyZ18xX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihBUkdfMV9wYXJzZV90YWJsZSwgOCwgIkFSR18xIiwKKwkgICAgMHgxNDIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2FyZ18yX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQVJHXzIiLAorCSAgICAweDE0MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfbGFzdF9tc2dfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMQVNUX01TRyIsCisJICAgIDB4MTQ0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNDU0lTRVFfVEVNUExBVEVfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJBTFRTVElNIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJFTkFVVE9BVE5QIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJNQU5VQUxQIiwJCTB4MGMsIDB4MGMgfSwKKwl7ICJFTlJTRUxJIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJFTlNFTEkiLAkJMHgyMCwgMHgyMCB9LAorCXsgIk1BTlVBTENUTCIsCQkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhkX3Njc2lzZXFfdGVtcGxhdGVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNDU0lTRVFfVEVNUExBVEVfcGFyc2VfdGFibGUsIDYsICJTQ1NJU0VRX1RFTVBMQVRFIiwKKwkgICAgMHgxNDUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2luaXRpYXRvcl90YWdfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTklUSUFUT1JfVEFHIiwKKwkgICAgMHgxNDYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0VRX0ZMQUdTMl9wYXJzZV90YWJsZVtdID0geworCXsgIlRBUkdFVF9NU0dfUEVORElORyIsCTB4MDIsIDB4MDIgfSwKKwl7ICJTRUxFQ1RPVVRfUUZST1pFTiIsCTB4MDQsIDB4MDQgfQorfTsKKworaW50CithaGRfc2VxX2ZsYWdzMl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0VRX0ZMQUdTMl9wYXJzZV90YWJsZSwgMiwgIlNFUV9GTEFHUzIiLAorCSAgICAweDE0NywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfYWxsb2NmaWZvX3NjYnB0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFMTE9DRklGT19TQ0JQVFIiLAorCSAgICAweDE0OCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfaW50X2NvYWxlc2NpbmdfdGltZXJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRfQ09BTEVTQ0lOR19USU1FUiIsCisJICAgIDB4MTRhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9pbnRfY29hbGVzY2luZ19tYXhjbWRzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UX0NPQUxFU0NJTkdfTUFYQ01EUyIsCisJICAgIDB4MTRjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9pbnRfY29hbGVzY2luZ19taW5jbWRzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UX0NPQUxFU0NJTkdfTUlOQ01EUyIsCisJICAgIDB4MTRkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9jbWRzX3BlbmRpbmdfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTURTX1BFTkRJTkciLAorCSAgICAweDE0ZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfaW50X2NvYWxlc2NpbmdfY21kY291bnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRfQ09BTEVTQ0lOR19DTURDT1VOVCIsCisJICAgIDB4MTUwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9sb2NhbF9oc19tYWlsYm94X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTE9DQUxfSFNfTUFJTEJPWCIsCisJICAgIDB4MTUxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9jbWRzaXplX3RhYmxlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01EU0laRV9UQUJMRSIsCisJICAgIDB4MTUyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zY2JfYmFzZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9CQVNFIiwKKwkgICAgMHgxODAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYl9yZXNpZHVhbF9kYXRhY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1JFU0lEVUFMX0RBVEFDTlQiLAorCSAgICAweDE4MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTQ0JfUkVTSURVQUxfU0dQVFJfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTR19MSVNUX05VTEwiLAkweDAxLCAweDAxIH0sCisJeyAiU0dfT1ZFUlJVTl9SRVNJRCIsCTB4MDIsIDB4MDIgfSwKKwl7ICJTR19BRERSX01BU0siLAkweGY4LCAweGY4IH0KK307CisKK2ludAorYWhkX3NjYl9yZXNpZHVhbF9zZ3B0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0NCX1JFU0lEVUFMX1NHUFRSX3BhcnNlX3RhYmxlLCAzLCAiU0NCX1JFU0lEVUFMX1NHUFRSIiwKKwkgICAgMHgxODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYl9zY3NpX3N0YXR1c19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9TQ1NJX1NUQVRVUyIsCisJICAgIDB4MTg4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zY2JfdGFyZ2V0X3BoYXNlc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9UQVJHRVRfUEhBU0VTIiwKKwkgICAgMHgxODksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYl90YXJnZXRfZGF0YV9kaXJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfVEFSR0VUX0RBVEFfRElSIiwKKwkgICAgMHgxOGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYl90YXJnZXRfaXRhZ19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9UQVJHRVRfSVRBRyIsCisJICAgIDB4MThiLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zY2Jfc2Vuc2VfYnVzYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9TRU5TRV9CVVNBRERSIiwKKwkgICAgMHgxOGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYl90YWdfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfVEFHIiwKKwkgICAgMHgxOTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NCX0NPTlRST0xfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTQ0JfVEFHX1RZUEUiLAkweDAzLCAweDAzIH0sCisJeyAiRElTQ09OTkVDVEVEIiwJMHgwNCwgMHgwNCB9LAorCXsgIlNUQVRVU19SQ1ZEIiwJMHgwOCwgMHgwOCB9LAorCXsgIk1LX01FU1NBR0UiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlRBR19FTkIiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkRJU0NFTkIiLAkJMHg0MCwgMHg0MCB9LAorCXsgIlRBUkdFVF9TQ0IiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9zY2JfY29udHJvbF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0NCX0NPTlRST0xfcGFyc2VfdGFibGUsIDcsICJTQ0JfQ09OVFJPTCIsCisJICAgIDB4MTkyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNDQl9TQ1NJSURfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJPSUQiLAkJMHgwZiwgMHgwZiB9LAorCXsgIlRJRCIsCQkweGYwLCAweGYwIH0KK307CisKK2ludAorYWhkX3NjYl9zY3NpaWRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNDQl9TQ1NJSURfcGFyc2VfdGFibGUsIDIsICJTQ0JfU0NTSUlEIiwKKwkgICAgMHgxOTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NCX0xVTl9wYXJzZV90YWJsZVtdID0geworCXsgIkxJRCIsCQkweGZmLCAweGZmIH0KK307CisKK2ludAorYWhkX3NjYl9sdW5fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNDQl9MVU5fcGFyc2VfdGFibGUsIDEsICJTQ0JfTFVOIiwKKwkgICAgMHgxOTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NCX1RBU0tfQVRUUklCVVRFX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiU0NCX1hGRVJMRU5fT0REIiwJMHgwMSwgMHgwMSB9Cit9OworCitpbnQKK2FoZF9zY2JfdGFza19hdHRyaWJ1dGVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNDQl9UQVNLX0FUVFJJQlVURV9wYXJzZV90YWJsZSwgMSwgIlNDQl9UQVNLX0FUVFJJQlVURSIsCisJICAgIDB4MTk1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNDQl9DREJfTEVOX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiU0NCX0NEQl9MRU5fUFRSIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9zY2JfY2RiX2xlbl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0NCX0NEQl9MRU5fcGFyc2VfdGFibGUsIDEsICJTQ0JfQ0RCX0xFTiIsCisJICAgIDB4MTk2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zY2JfdGFza19tYW5hZ2VtZW50X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1RBU0tfTUFOQUdFTUVOVCIsCisJICAgIDB4MTk3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zY2JfZGF0YXB0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9EQVRBUFRSIiwKKwkgICAgMHgxOTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NCX0RBVEFDTlRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTR19ISUdIX0FERFJfQklUUyIsCTB4N2YsIDB4N2YgfSwKKwl7ICJTR19MQVNUX1NFRyIsCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfc2NiX2RhdGFjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNDQl9EQVRBQ05UX3BhcnNlX3RhYmxlLCAyLCAiU0NCX0RBVEFDTlQiLAorCSAgICAweDFhMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTQ0JfU0dQVFJfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTR19MSVNUX05VTEwiLAkweDAxLCAweDAxIH0sCisJeyAiU0dfRlVMTF9SRVNJRCIsCTB4MDIsIDB4MDIgfSwKKwl7ICJTR19TVEFUVVNfVkFMSUQiLAkweDA0LCAweDA0IH0KK307CisKK2ludAorYWhkX3NjYl9zZ3B0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0NCX1NHUFRSX3BhcnNlX3RhYmxlLCAzLCAiU0NCX1NHUFRSIiwKKwkgICAgMHgxYTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYl9idXNhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX0JVU0FERFIiLAorCSAgICAweDFhOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfc2NiX25leHRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfTkVYVCIsCisJICAgIDB4MWFjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zY2JfbmV4dDJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfTkVYVDIiLAorCSAgICAweDFhZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfc2NiX3NwYXJlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1NQQVJFIiwKKwkgICAgMHgxYjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYl9kaXNjb25uZWN0ZWRfbGlzdHNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfRElTQ09OTkVDVEVEX0xJU1RTIiwKKwkgICAgMHgxYjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfc2VxLmhfc2hpcHBlZCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfc2VxLmhfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2M0NzFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9zZXEuaF9zaGlwcGVkCkBAIC0wLDAgKzEsMTEzOSBAQAorLyoKKyAqIERPIE5PVCBFRElUIC0gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisgKgkJIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2UgZmlsZXM6CisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4LnNlcSM5NCAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHgucmVnIzcwICQKKyAqLworc3RhdGljIHVpbnQ4X3Qgc2VxcHJvZ1tdID0geworCTB4ZmYsIDB4MDIsIDB4MDYsIDB4NzgsCisJMHgwMCwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDAxLCAweGVhLCAweDA0LCAweDMwLAorCTB4ZmYsIDB4MDQsIDB4MGMsIDB4NzgsCisJMHgxOSwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDE5LCAweGVhLCAweDA0LCAweDAwLAorCTB4MzMsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHgzMywgMHhlYSwgMHgwMCwgMHgwMCwKKwkweDYwLCAweDNhLCAweDFhLCAweDY4LAorCTB4MDQsIDB4NDcsIDB4MWIsIDB4NjgsCisJMHhmZiwgMHgyMSwgMHgxYiwgMHg3MCwKKwkweDQwLCAweDRiLCAweDkyLCAweDY5LAorCTB4MDAsIDB4ZTIsIDB4NTQsIDB4NTksCisJMHg0MCwgMHg0YiwgMHg5MiwgMHg2OSwKKwkweDIwLCAweDRiLCAweDgyLCAweDY5LAorCTB4ZmMsIDB4NDIsIDB4MjQsIDB4NzgsCisJMHgxMCwgMHg0MCwgMHgyNCwgMHg3OCwKKwkweDAwLCAweGUyLCAweGM0LCAweDVkLAorCTB4MjAsIDB4NGQsIDB4MjgsIDB4NzgsCisJMHgwMCwgMHhlMiwgMHhjNCwgMHg1ZCwKKwkweDMwLCAweDNmLCAweGMwLCAweDA5LAorCTB4MzAsIDB4ZTAsIDB4MzAsIDB4NjAsCisJMHg3ZiwgMHg0YSwgMHg5NCwgMHgwOCwKKwkweDAwLCAweGUyLCAweDMyLCAweDQwLAorCTB4YzAsIDB4NGEsIDB4OTQsIDB4MDAsCisJMHgwMCwgMHhlMiwgMHgzZSwgMHg1OCwKKwkweDAwLCAweGUyLCAweDU2LCAweDU4LAorCTB4MDAsIDB4ZTIsIDB4NjYsIDB4NTgsCisJMHgwMCwgMHhlMiwgMHgwNiwgMHg0MCwKKwkweDMzLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCisJMHgwMSwgMHg1MiwgMHg2NCwgMHg3OCwKKwkweDAyLCAweDU4LCAweDUwLCAweDMxLAorCTB4ZmYsIDB4ZWEsIDB4MTAsIDB4MGIsCisJMHhmZiwgMHg5NywgMHg0ZiwgMHg3OCwKKwkweDUwLCAweDRiLCAweDRhLCAweDY4LAorCTB4YmYsIDB4M2EsIDB4NzQsIDB4MDgsCisJMHgxNCwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDE0LCAweGVhLCAweDA0LCAweDAwLAorCTB4MDgsIDB4OTIsIDB4MjUsIDB4MDMsCisJMHhmZiwgMHg5MCwgMHgzZiwgMHg2OCwKKwkweDAwLCAweGUyLCAweDU2LCAweDViLAorCTB4MDAsIDB4ZTIsIDB4M2UsIDB4NDAsCisJMHgwMCwgMHhlYSwgMHg0NCwgMHg1OSwKKwkweDAxLCAweGVhLCAweDAwLCAweDMwLAorCTB4ODAsIDB4ZjksIDB4NWUsIDB4NjgsCisJMHgwMCwgMHhlMiwgMHg0MiwgMHg1OSwKKwkweDExLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MTEsIDB4ZWEsIDB4MDAsIDB4MDAsCisJMHg4MCwgMHhmOSwgMHg0MiwgMHg3OSwKKwkweGZmLCAweGVhLCAweGQ0LCAweDBkLAorCTB4MjIsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHgyMiwgMHhlYSwgMHgwMCwgMHgwMCwKKwkweDEwLCAweDE2LCAweDcwLCAweDc4LAorCTB4MDEsIDB4MGIsIDB4YTIsIDB4MzIsCisJMHgxMCwgMHgxNiwgMHgyYywgMHgwMCwKKwkweDE4LCAweGFkLCAweDAwLCAweDc5LAorCTB4MDQsIDB4YWQsIDB4Y2EsIDB4NjgsCisJMHg4MCwgMHhhZCwgMHg2NCwgMHg3OCwKKwkweDEwLCAweGFkLCAweDk4LCAweDc4LAorCTB4ZmYsIDB4ODgsIDB4ODMsIDB4NjgsCisJMHhlNywgMHhhZCwgMHg1YSwgMHgwOSwKKwkweDAyLCAweDhjLCAweDU5LCAweDMyLAorCTB4MDIsIDB4MjgsIDB4MTksIDB4MzMsCisJMHgwMiwgMHhhOCwgMHg1MCwgMHgzNiwKKwkweDMzLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCisJMHg0MCwgMHgzYSwgMHg2NCwgMHg2OCwKKwkweDUwLCAweDRiLCAweDY0LCAweDY4LAorCTB4MjIsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHgyMiwgMHhlYSwgMHgwMCwgMHgwMCwKKwkweGU3LCAweGFkLCAweDVhLCAweDA5LAorCTB4MDIsIDB4OGMsIDB4NTksIDB4MzIsCisJMHgxYSwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDFhLCAweGVhLCAweDA0LCAweDAwLAorCTB4ZmYsIDB4ZWEsIDB4ZDQsIDB4MGQsCisJMHhlNywgMHhhZCwgMHg1YSwgMHgwOSwKKwkweDAwLCAweGUyLCAweGE2LCAweDU4LAorCTB4ZmYsIDB4ZWEsIDB4NTYsIDB4MDIsCisJMHgwNCwgMHg3YywgMHg3OCwgMHgzMiwKKwkweDIwLCAweDE2LCAweDY0LCAweDc4LAorCTB4MDQsIDB4MzgsIDB4NzksIDB4MzIsCisJMHg4MCwgMHgzNywgMHg2ZiwgMHgxNiwKKwkweGZmLCAweDJkLCAweGI1LCAweDYwLAorCTB4ZmYsIDB4MjksIDB4YjUsIDB4NjAsCisJMHg0MCwgMHg1MSwgMHhjNSwgMHg3OCwKKwkweGZmLCAweDRmLCAweGI1LCAweDY4LAorCTB4ZmYsIDB4NGQsIDB4YzEsIDB4MTksCisJMHgwMCwgMHg0ZSwgMHhkNSwgMHgxOSwKKwkweDAwLCAweGUyLCAweGM0LCAweDUwLAorCTB4MDEsIDB4NGMsIDB4YzEsIDB4MzEsCisJMHgwMCwgMHg1MCwgMHhkNSwgMHgxOSwKKwkweDAwLCAweGUyLCAweGM0LCAweDQ4LAorCTB4ODAsIDB4MTgsIDB4NjQsIDB4NzgsCisJMHgwMiwgMHg0YSwgMHgxZCwgMHgzMCwKKwkweDEwLCAweGVhLCAweDE4LCAweDAwLAorCTB4NjAsIDB4MTgsIDB4MzAsIDB4MDAsCisJMHg3ZiwgMHgxOCwgMHgzMCwgMHgwYywKKwkweDAyLCAweGVhLCAweDAyLCAweDAwLAorCTB4ZmYsIDB4ZWEsIDB4YTAsIDB4MGEsCisJMHg4MCwgMHgxOCwgMHgzMCwgMHgwNCwKKwkweDQwLCAweGFkLCAweDY0LCAweDc4LAorCTB4ZTcsIDB4YWQsIDB4NWEsIDB4MDksCisJMHgwMiwgMHhhOCwgMHg0MCwgMHgzMSwKKwkweGZmLCAweGVhLCAweGMwLCAweDA5LAorCTB4MDEsIDB4NGUsIDB4OWQsIDB4MWEsCisJMHgwMCwgMHg0ZiwgMHg5ZiwgMHgyMiwKKwkweDAxLCAweDk0LCAweDZkLCAweDMzLAorCTB4MDEsIDB4ZWEsIDB4MjAsIDB4MzMsCisJMHgwNCwgMHhhYywgMHg0OSwgMHgzMiwKKwkweGZmLCAweGVhLCAweDVhLCAweDAzLAorCTB4ZmYsIDB4ZWEsIDB4NWUsIDB4MDMsCisJMHgwMSwgMHgxMCwgMHhkNCwgMHgzMSwKKwkweDEwLCAweDkyLCAweGY1LCAweDY4LAorCTB4M2QsIDB4OTMsIDB4YzUsIDB4MjksCisJMHhmZSwgMHhlMiwgMHhjNCwgMHgwOSwKKwkweDAxLCAweGVhLCAweGM2LCAweDAxLAorCTB4MDIsIDB4ZTIsIDB4YzgsIDB4MzEsCisJMHgwMiwgMHhlYywgMHg1MCwgMHgzMSwKKwkweDAyLCAweGEwLCAweGRhLCAweDMxLAorCTB4ZmYsIDB4YTksIDB4ZjQsIDB4NzAsCisJMHgwMiwgMHhhMCwgMHg1OCwgMHgzNywKKwkweGZmLCAweDIxLCAweGZkLCAweDcwLAorCTB4MDIsIDB4MjIsIDB4NTEsIDB4MzEsCisJMHgwMiwgMHhhMCwgMHg1YywgMHgzMywKKwkweDAyLCAweGEwLCAweDQ0LCAweDM2LAorCTB4MDIsIDB4YTAsIDB4NDAsIDB4MzIsCisJMHgwMiwgMHhhMCwgMHg0NCwgMHgzNiwKKwkweDA0LCAweDQ3LCAweDA1LCAweDY5LAorCTB4NDAsIDB4MTYsIDB4MzAsIDB4NjksCisJMHhmZiwgMHgyZCwgMHgzNSwgMHg2MSwKKwkweGZmLCAweDI5LCAweDY1LCAweDcwLAorCTB4MDEsIDB4MzcsIDB4YzEsIDB4MzEsCisJMHgwMiwgMHgyOCwgMHg1NSwgMHgzMiwKKwkweDAxLCAweGVhLCAweDVhLCAweDAxLAorCTB4MDQsIDB4M2MsIDB4ZjksIDB4MzAsCisJMHgwMiwgMHgyOCwgMHg1MSwgMHgzMSwKKwkweDAxLCAweGE4LCAweDYwLCAweDMxLAorCTB4MDAsIDB4YTksIDB4NjAsIDB4MDEsCisJMHgwMSwgMHgxNCwgMHhkNCwgMHgzMSwKKwkweDAxLCAweDUwLCAweGExLCAweDFhLAorCTB4ZmYsIDB4NGUsIDB4OWQsIDB4MWEsCisJMHhmZiwgMHg0ZiwgMHg5ZiwgMHgyMiwKKwkweGZmLCAweDhkLCAweDI5LCAweDcxLAorCTB4ODAsIDB4YWMsIDB4MjgsIDB4NzEsCisJMHgyMCwgMHgxNiwgMHgyOCwgMHg2OSwKKwkweDAyLCAweDhjLCAweDUxLCAweDMxLAorCTB4MDAsIDB4ZTIsIDB4MTIsIDB4NDEsCisJMHgwMSwgMHhhYywgMHgwOCwgMHgzMSwKKwkweDA5LCAweGVhLCAweDVhLCAweDAxLAorCTB4MDIsIDB4OGMsIDB4NTEsIDB4MzIsCisJMHhmZiwgMHhlYSwgMHgxYSwgMHgwNywKKwkweDA0LCAweDI0LCAweGY5LCAweDMwLAorCTB4MWQsIDB4ZWEsIDB4M2EsIDB4NDEsCisJMHgwMiwgMHgyYywgMHg1MSwgMHgzMSwKKwkweDA0LCAweGE4LCAweGY5LCAweDMwLAorCTB4MTksIDB4ZWEsIDB4M2EsIDB4NDEsCisJMHgwNiwgMHhlYSwgMHgwOCwgMHg4MSwKKwkweDAxLCAweGUyLCAweDVhLCAweDM1LAorCTB4MDIsIDB4ZjIsIDB4ZjAsIDB4MzUsCisJMHgwMiwgMHhmMiwgMHhmMCwgMHgzMSwKKwkweDAyLCAweGY4LCAweGU0LCAweDM1LAorCTB4ODAsIDB4ZWEsIDB4YjIsIDB4MDEsCisJMHgwMSwgMHhlMiwgMHgwMCwgMHgzMCwKKwkweGZmLCAweGVhLCAweGIyLCAweDBkLAorCTB4ODAsIDB4ZWEsIDB4YjIsIDB4MDEsCisJMHgxMSwgMHgwMCwgMHgwMCwgMHgxMCwKKwkweGZmLCAweGVhLCAweGIyLCAweDBkLAorCTB4MDEsIDB4ZTIsIDB4MDQsIDB4MzAsCisJMHgwMSwgMHhlYSwgMHgwNCwgMHgzNCwKKwkweDAyLCAweDIwLCAweGJkLCAweDMwLAorCTB4MDIsIDB4MjAsIDB4YjksIDB4MzAsCisJMHgwMiwgMHgyMCwgMHg1MSwgMHgzMSwKKwkweDRjLCAweDkzLCAweGQ3LCAweDI4LAorCTB4MTAsIDB4OTIsIDB4NjMsIDB4NzksCisJMHgwMSwgMHg2YiwgMHhjMCwgMHgzMCwKKwkweDAyLCAweDY0LCAweGM4LCAweDAwLAorCTB4NDAsIDB4M2EsIDB4NzQsIDB4MDQsCisJMHgwMCwgMHhlMiwgMHg1NiwgMHg1OCwKKwkweDMzLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCisJMHgzMCwgMHgzZiwgMHhjMCwgMHgwOSwKKwkweDMwLCAweGUwLCAweDY0LCAweDYxLAorCTB4MjAsIDB4M2YsIDB4N2EsIDB4NjksCisJMHgxMCwgMHgzZiwgMHg2NCwgMHg3OSwKKwkweDAyLCAweGVhLCAweDdlLCAweDAwLAorCTB4MDAsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHgwMSwgMHhlYSwgMHgwMCwgMHgzMCwKKwkweDAyLCAweDQ4LCAweDUxLCAweDM1LAorCTB4MDEsIDB4ZWEsIDB4N2UsIDB4MDAsCisJMHgxMSwgMHhlYSwgMHg0NCwgMHg1OSwKKwkweDExLCAweGVhLCAweDAwLCAweDAwLAorCTB4MDIsIDB4NDgsIDB4NTEsIDB4MzUsCisJMHgwOCwgMHhlYSwgMHg5OCwgMHgwMCwKKwkweDA4LCAweDU3LCAweGFlLCAweDAwLAorCTB4MDgsIDB4M2MsIDB4NzgsIDB4MDAsCisJMHhmMCwgMHg0OSwgMHg2OCwgMHgwYSwKKwkweDBmLCAweDY3LCAweGMwLCAweDA5LAorCTB4MDAsIDB4MzQsIDB4NjksIDB4MDIsCisJMHgyMCwgMHhlYSwgMHg5NiwgMHgwMCwKKwkweDAwLCAweGUyLCAweGY4LCAweDQxLAorCTB4NDAsIDB4M2EsIDB4YWUsIDB4NjksCisJMHgwMiwgMHg1NSwgMHgwNiwgMHg2OCwKKwkweDAyLCAweDU2LCAweGFlLCAweDY5LAorCTB4ZmYsIDB4NWIsIDB4YWUsIDB4NjEsCisJMHgwMiwgMHgyMCwgMHg1MSwgMHgzMSwKKwkweDgwLCAweGVhLCAweGIyLCAweDAxLAorCTB4NDQsIDB4ZWEsIDB4MDAsIDB4MDAsCisJMHgwMSwgMHgzMywgMHhjMCwgMHgzMSwKKwkweDMzLCAweGVhLCAweDAwLCAweDAwLAorCTB4ZmYsIDB4ZWEsIDB4YjIsIDB4MDksCisJMHhmZiwgMHhlMCwgMHhjMCwgMHgxOSwKKwkweGZmLCAweGUwLCAweGIwLCAweDc5LAorCTB4MDIsIDB4YWMsIDB4NTEsIDB4MzEsCisJMHgwMCwgMHhlMiwgMHhhNiwgMHg0MSwKKwkweDAyLCAweDVlLCAweDUwLCAweDMxLAorCTB4MDIsIDB4YTgsIDB4YjgsIDB4MzAsCisJMHgwMiwgMHg1YywgMHg1MCwgMHgzMSwKKwkweGZmLCAweGFkLCAweGMxLCAweDcxLAorCTB4MDIsIDB4YWMsIDB4NDEsIDB4MzEsCisJMHgwMiwgMHgyMiwgMHg1MSwgMHgzMSwKKwkweDAyLCAweGEwLCAweDVjLCAweDMzLAorCTB4MDIsIDB4YTAsIDB4NDQsIDB4MzIsCisJMHgwMCwgMHhlMiwgMHhjYSwgMHg0MSwKKwkweDEwLCAweDkyLCAweGNiLCAweDY5LAorCTB4M2QsIDB4OTMsIDB4YzksIDB4MjksCisJMHgwMSwgMHhlNCwgMHhjOCwgMHgwMSwKKwkweDAxLCAweGVhLCAweGNhLCAweDAxLAorCTB4ZmYsIDB4ZWEsIDB4ZGEsIDB4MDEsCisJMHgwMiwgMHgyMCwgMHg1MSwgMHgzMSwKKwkweDAyLCAweGFlLCAweDQxLCAweDMyLAorCTB4ZmYsIDB4MjEsIDB4ZDMsIDB4NjEsCisJMHhmZiwgMHhlYSwgMHg0NiwgMHgwMiwKKwkweDAyLCAweDVjLCAweDUwLCAweDMxLAorCTB4NDAsIDB4ZWEsIDB4OTYsIDB4MDAsCisJMHgwMiwgMHg1NiwgMHhjYywgMHg2ZCwKKwkweDAxLCAweDU1LCAweGNjLCAweDZkLAorCTB4MTAsIDB4OTIsIDB4ZGYsIDB4NzksCisJMHgxMCwgMHg0MCwgMHhlOCwgMHg2OSwKKwkweDAxLCAweDU2LCAweGU4LCAweDc5LAorCTB4ZmYsIDB4OTcsIDB4MDcsIDB4NzgsCisJMHgxMywgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDEzLCAweGVhLCAweDA0LCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4MDYsIDB4NDAsCisJMHhiZiwgMHgzYSwgMHg3NCwgMHgwOCwKKwkweDA4LCAweGVhLCAweDk4LCAweDAwLAorCTB4MDgsIDB4NTcsIDB4YWUsIDB4MDAsCisJMHgwMSwgMHg5MywgMHg2OSwgMHgzMiwKKwkweDAxLCAweDk0LCAweDZiLCAweDMyLAorCTB4NDAsIDB4ZWEsIDB4NjYsIDB4MDIsCisJMHgwOCwgMHgzYywgMHg3OCwgMHgwMCwKKwkweDgwLCAweGVhLCAweDYyLCAweDAyLAorCTB4MDAsIDB4ZTIsIDB4YjgsIDB4NWIsCisJMHgwMSwgMHgzNiwgMHhjMSwgMHgzMSwKKwkweDlmLCAweGUwLCAweDRjLCAweDdjLAorCTB4ODAsIDB4ZTAsIDB4MGMsIDB4NzIsCisJMHhhMCwgMHhlMCwgMHg0NCwgMHg3MiwKKwkweGMwLCAweGUwLCAweDNhLCAweDcyLAorCTB4ZTAsIDB4ZTAsIDB4NzQsIDB4NzIsCisJMHgwMSwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDAxLCAweGVhLCAweDA0LCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCisJMHg4MCwgMHgzMywgMHgxMywgMHg3YSwKKwkweDAzLCAweGVhLCAweDUwLCAweDU5LAorCTB4MDMsIDB4ZWEsIDB4MDQsIDB4MDAsCisJMHhlZSwgMHgwMCwgMHgxYSwgMHg2YSwKKwkweDA1LCAweGVhLCAweGI0LCAweDAwLAorCTB4MzMsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHgzMywgMHhlYSwgMHgwMCwgMHgwMCwKKwkweDAyLCAweGE4LCAweDkwLCAweDMyLAorCTB4MDAsIDB4ZTIsIDB4NmEsIDB4NTksCisJMHhlZiwgMHg5NiwgMHhkNSwgMHgxOSwKKwkweDAwLCAweGUyLCAweDJhLCAweDUyLAorCTB4MDksIDB4ODAsIDB4ZTEsIDB4MzAsCisJMHgwMiwgMHhlYSwgMHgzNiwgMHgwMCwKKwkweGE4LCAweGVhLCAweDMyLCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4MzAsIDB4NDIsCisJMHgwMSwgMHg5NiwgMHhkMSwgMHgzMCwKKwkweDEwLCAweDgwLCAweDg5LCAweDMxLAorCTB4MjAsIDB4ZWEsIDB4MzIsIDB4MDAsCisJMHhiZiwgMHgzMywgMHg2NywgMHgwYSwKKwkweDIwLCAweDE5LCAweDMyLCAweDZhLAorCTB4MDIsIDB4NGQsIDB4ZjgsIDB4NjksCisJMHg0MCwgMHgzMywgMHg2NywgMHgwMiwKKwkweDAwLCAweGUyLCAweGY4LCAweDQxLAorCTB4ODAsIDB4MzMsIDB4YjUsIDB4NmEsCisJMHgwMSwgMHg0NCwgMHgxMCwgMHgzMywKKwkweDA4LCAweDkyLCAweDI1LCAweDAzLAorCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCisJMHgxMCwgMHhlYSwgMHg4MCwgMHgwMCwKKwkweDAxLCAweDMxLCAweGM1LCAweDMxLAorCTB4ODAsIDB4ZTIsIDB4NjAsIDB4NjIsCisJMHgxMCwgMHg5MiwgMHg4NSwgMHg2YSwKKwkweGMwLCAweDk0LCAweGM1LCAweDAxLAorCTB4NDAsIDB4OTIsIDB4NTEsIDB4NmEsCisJMHhiZiwgMHhlMiwgMHhjNCwgMHgwOSwKKwkweDIwLCAweDkyLCAweDY1LCAweDdhLAorCTB4MDEsIDB4ZTIsIDB4ODgsIDB4MzAsCisJMHgwMCwgMHhlMiwgMHhiOCwgMHg1YiwKKwkweGEwLCAweDM2LCAweDZkLCAweDYyLAorCTB4MjMsIDB4OTIsIDB4ODksIDB4MDgsCisJMHgwMCwgMHhlMiwgMHhiOCwgMHg1YiwKKwkweGEwLCAweDM2LCAweDZkLCAweDYyLAorCTB4MDAsIDB4YTgsIDB4NjQsIDB4NDIsCisJMHhmZiwgMHhlMiwgMHg2NCwgMHg2MiwKKwkweDAwLCAweGUyLCAweDg0LCAweDQyLAorCTB4NDAsIDB4ZWEsIDB4OTgsIDB4MDAsCisJMHgwMSwgMHhlMiwgMHg4OCwgMHgzMCwKKwkweDAwLCAweGUyLCAweGI4LCAweDViLAorCTB4YTAsIDB4MzYsIDB4NDMsIDB4NzIsCisJMHg0MCwgMHhlYSwgMHg5OCwgMHgwMCwKKwkweDAxLCAweDMxLCAweDg5LCAweDMyLAorCTB4MDgsIDB4ZWEsIDB4NjIsIDB4MDIsCisJMHgwMCwgMHhlMiwgMHhmOCwgMHg0MSwKKwkweGUwLCAweGVhLCAweGQ0LCAweDViLAorCTB4ODAsIDB4ZTAsIDB4YzAsIDB4NmEsCisJMHgwNCwgMHhlMCwgMHg2NiwgMHg3MywKKwkweDAyLCAweGUwLCAweDk2LCAweDczLAorCTB4MDAsIDB4ZWEsIDB4MWUsIDB4NzMsCisJMHgwMywgMHhlMCwgMHhhNiwgMHg3MywKKwkweDIzLCAweGUwLCAweDk2LCAweDcyLAorCTB4MDgsIDB4ZTAsIDB4YmMsIDB4NzIsCisJMHgwMCwgMHhlMiwgMHhiOCwgMHg1YiwKKwkweDA3LCAweGVhLCAweDUwLCAweDU5LAorCTB4MDcsIDB4ZWEsIDB4MDQsIDB4MDAsCisJMHgwOCwgMHg0MiwgMHhmOSwgMHg3MSwKKwkweDA0LCAweDQyLCAweDkzLCAweDYyLAorCTB4MDEsIDB4NDMsIDB4ODksIDB4MzAsCisJMHgwMCwgMHhlMiwgMHg4NCwgMHg0MiwKKwkweDAxLCAweDQ0LCAweGQ0LCAweDMxLAorCTB4MDAsIDB4ZTIsIDB4ODQsIDB4NDIsCisJMHgwMSwgMHgwMCwgMHg2MCwgMHgzMiwKKwkweDMzLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCisJMHg0YywgMHgzNCwgMHhjMSwgMHgyOCwKKwkweDAxLCAweDY0LCAweGMwLCAweDMxLAorCTB4MDAsIDB4MzAsIDB4NDUsIDB4NTksCisJMHgwMSwgMHgzMCwgMHgwMSwgMHgzMCwKKwkweDAxLCAweGUwLCAweGJhLCAweDdhLAorCTB4YTAsIDB4ZWEsIDB4Y2EsIDB4NWIsCisJMHgwMSwgMHhhMCwgMHhiYSwgMHg2MiwKKwkweDAxLCAweDg0LCAweGFmLCAweDdhLAorCTB4MDEsIDB4OTUsIDB4YmQsIDB4NmEsCisJMHgwNSwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDA1LCAweGVhLCAweDA0LCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4YmMsIDB4NDIsCisJMHgwMywgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDAzLCAweGVhLCAweDA0LCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4YmMsIDB4NDIsCisJMHgwNywgMHhlYSwgMHhkYywgMHg1YiwKKwkweDAxLCAweDQ0LCAweGQ0LCAweDMxLAorCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCisJMHgzZiwgMHhlMCwgMHg2YSwgMHgwYSwKKwkweGMwLCAweDM0LCAweGMxLCAweDA5LAorCTB4MDAsIDB4MzUsIDB4NTEsIDB4MDEsCisJMHhmZiwgMHhlYSwgMHg1MiwgMHgwOSwKKwkweDMwLCAweDM0LCAweGM1LCAweDA5LAorCTB4M2QsIDB4ZTIsIDB4YzQsIDB4MjksCisJMHhiOCwgMHhlMiwgMHhjNCwgMHgxOSwKKwkweDAxLCAweGVhLCAweGM2LCAweDAxLAorCTB4MDIsIDB4ZTIsIDB4YzgsIDB4MzEsCisJMHgwMiwgMHhlYywgMHg0MCwgMHgzMSwKKwkweGZmLCAweGExLCAweGRjLCAweDcyLAorCTB4MDIsIDB4ZTgsIDB4ZGEsIDB4MzEsCisJMHgwMiwgMHhhMCwgMHg1MCwgMHgzMSwKKwkweDAwLCAweGUyLCAweGZlLCAweDQyLAorCTB4ODAsIDB4MzMsIDB4NjcsIDB4MDIsCisJMHgwMSwgMHg0NCwgMHhkNCwgMHgzMSwKKwkweDAwLCAweGUyLCAweGI4LCAweDViLAorCTB4MDEsIDB4MzMsIDB4NjcsIDB4MDIsCisJMHhlMCwgMHgzNiwgMHgxOSwgMHg2MywKKwkweDAyLCAweDMzLCAweDY3LCAweDAyLAorCTB4MjAsIDB4NDYsIDB4MTIsIDB4NjMsCisJMHhmZiwgMHhlYSwgMHg1MiwgMHgwOSwKKwkweGE4LCAweGVhLCAweGNhLCAweDViLAorCTB4MDQsIDB4OTIsIDB4ZjksIDB4N2EsCisJMHgwMSwgMHgzNCwgMHhjMSwgMHgzMSwKKwkweDAwLCAweDkzLCAweGY5LCAweDYyLAorCTB4MDEsIDB4MzUsIDB4YzEsIDB4MzEsCisJMHgwMCwgMHg5NCwgMHgwMywgMHg3MywKKwkweDAxLCAweGE5LCAweDUyLCAweDExLAorCTB4ZmYsIDB4YTksIDB4ZWUsIDB4NmEsCisJMHgwMCwgMHhlMiwgMHgxMiwgMHg0MywKKwkweDEwLCAweDMzLCAweDY3LCAweDAyLAorCTB4MDQsIDB4OTIsIDB4MTMsIDB4N2IsCisJMHhmYiwgMHg5MiwgMHgyNSwgMHgwYiwKKwkweGZmLCAweGVhLCAweDY2LCAweDBhLAorCTB4MDEsIDB4YTQsIDB4MGQsIDB4NmIsCisJMHgwMiwgMHhhOCwgMHg5MCwgMHgzMiwKKwkweDAwLCAweGUyLCAweDZhLCAweDU5LAorCTB4MTAsIDB4OTIsIDB4YmQsIDB4N2EsCisJMHhmZiwgMHhlYSwgMHhkYywgMHg1YiwKKwkweDAwLCAweGUyLCAweGJjLCAweDQyLAorCTB4MDQsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwNCwgMHhlYSwgMHgwNCwgMHgwMCwKKwkweDAwLCAweGUyLCAweGJjLCAweDQyLAorCTB4MDQsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwNCwgMHhlYSwgMHgwNCwgMHgwMCwKKwkweDAwLCAweGUyLCAweGY4LCAweDQxLAorCTB4MDgsIDB4OTIsIDB4YjUsIDB4N2EsCisJMHhjMCwgMHgzMywgMHgyOSwgMHg3YiwKKwkweDgwLCAweDMzLCAweGI1LCAweDZhLAorCTB4ZmYsIDB4ODgsIDB4MjksIDB4NmIsCisJMHg0MCwgMHgzMywgMHhiNSwgMHg2YSwKKwkweDEwLCAweDkyLCAweDJmLCAweDdiLAorCTB4MGEsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwYSwgMHhlYSwgMHgwNCwgMHgwMCwKKwkweDAwLCAweGUyLCAweDRlLCAweDViLAorCTB4MDAsIDB4ZTIsIDB4ODIsIDB4NDMsCisJMHg1MCwgMHg0YiwgMHgzNiwgMHg2YiwKKwkweGJmLCAweDNhLCAweDc0LCAweDA4LAorCTB4MDEsIDB4ZTAsIDB4ZjQsIDB4MzEsCisJMHhmZiwgMHhlYSwgMHhjMCwgMHgwOSwKKwkweDAxLCAweDJlLCAweDVkLCAweDFhLAorCTB4MDAsIDB4MmYsIDB4NWYsIDB4MjIsCisJMHgwNCwgMHg0NywgMHg4ZiwgMHgwMiwKKwkweDAxLCAweGZhLCAweGMwLCAweDM1LAorCTB4MDIsIDB4YTgsIDB4ODQsIDB4MzIsCisJMHgwMiwgMHhlYSwgMHhiNCwgMHgwMCwKKwkweDMzLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCisJMHgwMiwgMHg0MiwgMHg1MSwgMHgzMSwKKwkweGZmLCAweDkwLCAweDY1LCAweDY4LAorCTB4ZmYsIDB4ODgsIDB4NWIsIDB4NmIsCisJMHgwMSwgMHhhNCwgMHg1NywgMHg2YiwKKwkweDAyLCAweGE0LCAweDVmLCAweDZiLAorCTB4MDEsIDB4ODQsIDB4NWYsIDB4N2IsCisJMHgwMiwgMHgyOCwgMHgxOSwgMHgzMywKKwkweDAyLCAweGE4LCAweDUwLCAweDM2LAorCTB4ZmYsIDB4ODgsIDB4NWYsIDB4NzMsCisJMHgwMCwgMHhlMiwgMHgzMiwgMHg1YiwKKwkweDAyLCAweGE4LCAweDIwLCAweDMzLAorCTB4MDIsIDB4MmMsIDB4MTksIDB4MzMsCisJMHgwMiwgMHhhOCwgMHg1OCwgMHgzMiwKKwkweDA0LCAweGE0LCAweDQ5LCAweDA3LAorCTB4YzAsIDB4MzMsIDB4YjUsIDB4NmEsCisJMHgwNCwgMHg5MiwgMHgyNSwgMHgwMywKKwkweDIwLCAweDkyLCAweDgzLCAweDZiLAorCTB4MDIsIDB4YTgsIDB4NDAsIDB4MzEsCisJMHhjMCwgMHgzNCwgMHhjMSwgMHgwOSwKKwkweDAwLCAweDM1LCAweDUxLCAweDAxLAorCTB4ZmYsIDB4ZWEsIDB4NTIsIDB4MDksCisJMHgzMCwgMHgzNCwgMHhjNSwgMHgwOSwKKwkweDNkLCAweGUyLCAweGM0LCAweDI5LAorCTB4YjgsIDB4ZTIsIDB4YzQsIDB4MTksCisJMHgwMSwgMHhlYSwgMHhjNiwgMHgwMSwKKwkweDAyLCAweGUyLCAweGM4LCAweDMxLAorCTB4MDIsIDB4YTAsIDB4ZGEsIDB4MzEsCisJMHgwMiwgMHhhMCwgMHg1MCwgMHgzMSwKKwkweGY3LCAweDU3LCAweGFlLCAweDA4LAorCTB4MDgsIDB4ZWEsIDB4OTgsIDB4MDAsCisJMHgwMSwgMHg0NCwgMHhkNCwgMHgzMSwKKwkweGVlLCAweDAwLCAweDhjLCAweDZiLAorCTB4MDIsIDB4ZWEsIDB4YjQsIDB4MDAsCisJMHgwMCwgMHhlMiwgMHhiNCwgMHg1YiwKKwkweDA5LCAweDRjLCAweDhlLCAweDdiLAorCTB4MDgsIDB4NGMsIDB4MDYsIDB4NjgsCisJMHgwYiwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDBiLCAweGVhLCAweDA0LCAweDAwLAorCTB4MDEsIDB4NDQsIDB4ZDQsIDB4MzEsCisJMHgyMCwgMHgzMywgMHhmOSwgMHg3OSwKKwkweDAwLCAweGUyLCAweDllLCAweDViLAorCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCisJMHgwMSwgMHg4NCwgMHhhMywgMHg3YiwKKwkweDAxLCAweGE0LCAweDQ5LCAweDA3LAorCTB4MDgsIDB4NjAsIDB4MzAsIDB4MzMsCisJMHgwOCwgMHg4MCwgMHg0MSwgMHgzNywKKwkweGRmLCAweDMzLCAweDY3LCAweDBhLAorCTB4ZWUsIDB4MDAsIDB4YjAsIDB4NmIsCisJMHgwNSwgMHhlYSwgMHhiNCwgMHgwMCwKKwkweDMzLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhlMiwgMHg2YSwgMHg1OSwKKwkweDAwLCAweGUyLCAweGJjLCAweDQyLAorCTB4MDEsIDB4ZWEsIDB4NmMsIDB4MDIsCisJMHhjMCwgMHhlYSwgMHg2NiwgMHgwNiwKKwkweGZmLCAweDQyLCAweGM0LCAweDZiLAorCTB4MDEsIDB4NDEsIDB4YjgsIDB4NmIsCisJMHgwMiwgMHg0MSwgMHhiOCwgMHg3YiwKKwkweGZmLCAweDQyLCAweGM0LCAweDZiLAorCTB4MDEsIDB4NDEsIDB4YjgsIDB4NmIsCisJMHgwMiwgMHg0MSwgMHhiOCwgMHg3YiwKKwkweGZmLCAweDQyLCAweGM0LCAweDdiLAorCTB4MDQsIDB4NGMsIDB4YjgsIDB4NmIsCisJMHhlMCwgMHg0MSwgMHg2YywgMHgwZSwKKwkweDAxLCAweDQ0LCAweGQ0LCAweDMxLAorCTB4ZmYsIDB4NDIsIDB4Y2MsIDB4N2IsCisJMHgwNCwgMHg0YywgMHhjYywgMHg2YiwKKwkweGUwLCAweDQxLCAweDZjLCAweDBhLAorCTB4ZTAsIDB4MzYsIDB4ZjksIDB4NjEsCisJMHhmZiwgMHhlYSwgMHhjYSwgMHgwOSwKKwkweDAxLCAweGUyLCAweGM4LCAweDMxLAorCTB4MDEsIDB4NDYsIDB4ZGEsIDB4MzUsCisJMHgwMSwgMHg0NCwgMHhkNCwgMHgzNSwKKwkweDEwLCAweGVhLCAweDgwLCAweDAwLAorCTB4MDEsIDB4ZTIsIDB4NjIsIDB4MzYsCisJMHgwNCwgMHhhNiwgMHhlNCwgMHg3YiwKKwkweGZmLCAweGVhLCAweDVhLCAweDA5LAorCTB4ZmYsIDB4ZWEsIDB4NGMsIDB4MGQsCisJMHgwMSwgMHhhNiwgMHgwMiwgMHg2YywKKwkweDEwLCAweGFkLCAweDY0LCAweDc4LAorCTB4ODAsIDB4YWQsIDB4ZmEsIDB4NmIsCisJMHgwOCwgMHhhZCwgMHg2NCwgMHg2OCwKKwkweDA0LCAweDg0LCAweGY5LCAweDMwLAorCTB4MDAsIDB4ZWEsIDB4MDgsIDB4ODEsCisJMHhmZiwgMHhlYSwgMHhkNCwgMHgwOSwKKwkweDAyLCAweDg0LCAweGY5LCAweDg4LAorCTB4MGQsIDB4ZWEsIDB4NWEsIDB4MDEsCisJMHgwNCwgMHhhNiwgMHg0YywgMHgwNSwKKwkweDA0LCAweGE2LCAweDY0LCAweDc4LAorCTB4ZmYsIDB4ZWEsIDB4NWEsIDB4MDksCisJMHgwMywgMHg4NCwgMHg1OSwgMHg4OSwKKwkweDAzLCAweGVhLCAweDRjLCAweDAxLAorCTB4ODAsIDB4MWEsIDB4NjQsIDB4NzgsCisJMHgwOCwgMHgxOSwgMHg2NCwgMHg3OCwKKwkweDA4LCAweGIwLCAweGUwLCAweDMwLAorCTB4MDQsIDB4YjAsIDB4ZTAsIDB4MzAsCisJMHgwMywgMHhiMCwgMHhmMCwgMHgzMCwKKwkweDAxLCAweGIwLCAweDA2LCAweDMzLAorCTB4N2YsIDB4ODMsIDB4ZTksIDB4MDgsCisJMHgwNCwgMHhhYywgMHg1OCwgMHgxOSwKKwkweGZmLCAweGVhLCAweGMwLCAweDA5LAorCTB4MDQsIDB4ODQsIDB4MDksIDB4OWIsCisJMHgwMCwgMHg4NSwgMHgwYiwgMHgyMywKKwkweDAwLCAweDg2LCAweDBkLCAweDIzLAorCTB4MDAsIDB4ODcsIDB4MGYsIDB4MjMsCisJMHgwMSwgMHg4NCwgMHhjNSwgMHgzMSwKKwkweDgwLCAweDgzLCAweDI1LCAweDdjLAorCTB4MDIsIDB4ZTIsIDB4YzQsIDB4MDEsCisJMHhmZiwgMHhlYSwgMHg0YywgMHgwOSwKKwkweDAxLCAweGUyLCAweDM2LCAweDMwLAorCTB4YzgsIDB4MTksIDB4MzIsIDB4MDAsCisJMHg4OCwgMHgxOSwgMHgzMiwgMHgwMCwKKwkweDAxLCAweGFjLCAweGQ0LCAweDk5LAorCTB4MDAsIDB4ZTIsIDB4NjQsIDB4NTAsCisJMHhmZSwgMHhhNiwgMHg0YywgMHgwZCwKKwkweDBiLCAweDk4LCAweGUxLCAweDMwLAorCTB4ZmQsIDB4YTQsIDB4NDksIDB4MDksCisJMHg4MCwgMHhhMywgMHgzOSwgMHg3YywKKwkweDAyLCAweGE0LCAweDQ4LCAweDAxLAorCTB4MDEsIDB4YTQsIDB4MzYsIDB4MzAsCisJMHhhOCwgMHhlYSwgMHgzMiwgMHgwMCwKKwkweGZkLCAweGE0LCAweDQ5LCAweDBiLAorCTB4MDUsIDB4YTMsIDB4MDcsIDB4MzMsCisJMHg4MCwgMHg4MywgMHg0NSwgMHg2YywKKwkweDAyLCAweGVhLCAweDRjLCAweDA1LAorCTB4ZmYsIDB4ZWEsIDB4NGMsIDB4MGQsCisJMHgwMCwgMHhlMiwgMHgzZSwgMHg1OSwKKwkweDAyLCAweGE2LCAweGU2LCAweDZiLAorCTB4ODAsIDB4ZjksIDB4ZjIsIDB4MDUsCisJMHhjMCwgMHgzMywgMHg1MywgMHg3YywKKwkweDAzLCAweGVhLCAweDUwLCAweDU5LAorCTB4MDMsIDB4ZWEsIDB4MDQsIDB4MDAsCisJMHgyMCwgMHgzMywgMHg3NywgMHg3YywKKwkweDAxLCAweDg0LCAweDVkLCAweDZjLAorCTB4MDYsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwNiwgMHhlYSwgMHgwNCwgMHgwMCwKKwkweDAwLCAweGUyLCAweDdhLCAweDQ0LAorCTB4MDEsIDB4MDAsIDB4NjAsIDB4MzIsCisJMHhlZSwgMHgwMCwgMHg2NiwgMHg2YywKKwkweDA1LCAweGVhLCAweGI0LCAweDAwLAorCTB4MzMsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHgzMywgMHhlYSwgMHgwMCwgMHgwMCwKKwkweDgwLCAweDNkLCAweDdhLCAweDAwLAorCTB4ZmMsIDB4NDIsIDB4NjgsIDB4N2MsCisJMHg3ZiwgMHgzZCwgMHg3YSwgMHgwOCwKKwkweDAwLCAweDMwLCAweDQ1LCAweDU5LAorCTB4MDEsIDB4MzAsIDB4MDEsIDB4MzAsCisJMHgwOSwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDA5LCAweGVhLCAweDA0LCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCisJMHgwMSwgMHhhNCwgMHg1ZCwgMHg2YywKKwkweDAwLCAweGUyLCAweDMwLCAweDVjLAorCTB4MjAsIDB4MzMsIDB4NjcsIDB4MDIsCisJMHgwMSwgMHgwMCwgMHg2MCwgMHgzMiwKKwkweDAyLCAweGE2LCAweDgyLCAweDdjLAorCTB4MDAsIDB4ZTIsIDB4NDYsIDB4NWMsCisJMHgwMCwgMHhlMiwgMHg1NiwgMHg1OCwKKwkweDAwLCAweGUyLCAweDY2LCAweDU4LAorCTB4MDAsIDB4ZTIsIDB4M2EsIDB4NTgsCisJMHgwMCwgMHgzMCwgMHg0NSwgMHg1OSwKKwkweDAxLCAweDMwLCAweDAxLCAweDMwLAorCTB4MjAsIDB4MTksIDB4ODIsIDB4NmMsCisJMHgwMCwgMHhlMiwgMHhiMiwgMHg1YywKKwkweDA0LCAweDE5LCAweDljLCAweDZjLAorCTB4MDIsIDB4MTksIDB4MzIsIDB4MDAsCisJMHgwMSwgMHg4NCwgMHg5ZCwgMHg3YywKKwkweDAxLCAweDFiLCAweDk2LCAweDdjLAorCTB4MDEsIDB4MWEsIDB4OWMsIDB4NmMsCisJMHgwMCwgMHhlMiwgMHg0YywgMHg0NCwKKwkweDgwLCAweDRiLCAweGEyLCAweDZjLAorCTB4MDEsIDB4NGMsIDB4OWUsIDB4N2MsCisJMHgwMywgMHg0MiwgMHg0YywgMHg2YywKKwkweDAwLCAweGUyLCAweGUwLCAweDViLAorCTB4ODAsIDB4ZjksIDB4ZjIsIDB4MDEsCisJMHgwNCwgMHgzMywgMHhmOSwgMHg3OSwKKwkweDAwLCAweGUyLCAweGY4LCAweDQxLAorCTB4MDgsIDB4NWQsIDB4YmEsIDB4NmMsCisJMHgwMCwgMHhlMiwgMHg1NiwgMHg1OCwKKwkweDAwLCAweDMwLCAweDQ1LCAweDU5LAorCTB4MDEsIDB4MzAsIDB4MDEsIDB4MzAsCisJMHgwMiwgMHgxYiwgMHhhYSwgMHg3YywKKwkweDA4LCAweDVkLCAweGI4LCAweDdjLAorCTB4MDMsIDB4NjgsIDB4MDAsIDB4MzcsCisJMHgwMSwgMHg4NCwgMHgwOSwgMHgwNywKKwkweDgwLCAweDFiLCAweGM0LCAweDdjLAorCTB4ODAsIDB4ODQsIDB4YzUsIDB4NmMsCisJMHhmZiwgMHg4NSwgMHgwYiwgMHgxYiwKKwkweGZmLCAweDg2LCAweDBkLCAweDIzLAorCTB4ZmYsIDB4ODcsIDB4MGYsIDB4MjMsCisJMHhmOCwgMHgxYiwgMHgwOCwgMHgwYiwKKwkweGZmLCAweGVhLCAweDA2LCAweDBiLAorCTB4MDMsIDB4NjgsIDB4MDAsIDB4MzcsCisJMHgwMCwgMHhlMiwgMHhjNCwgMHg1OCwKKwkweDEwLCAweGVhLCAweDE4LCAweDAwLAorCTB4ZjksIDB4ZDksIDB4YjIsIDB4MGQsCisJMHgwMSwgMHhkOSwgMHhiMiwgMHgwNSwKKwkweDAxLCAweDUyLCAweDQ4LCAweDMxLAorCTB4MjAsIDB4YTQsIDB4ZWUsIDB4N2MsCisJMHgyMCwgMHg1YiwgMHhlZSwgMHg3YywKKwkweDgwLCAweGY5LCAweGZjLCAweDdjLAorCTB4MDIsIDB4ZWEsIDB4YjQsIDB4MDAsCisJMHgxMSwgMHgwMCwgMHgwMCwgMHgxMCwKKwkweDA0LCAweDE5LCAweDA4LCAweDdkLAorCTB4ZGYsIDB4MTksIDB4MzIsIDB4MDgsCisJMHg2MCwgMHg1YiwgMHhlNiwgMHg2YywKKwkweDAxLCAweDRjLCAweGUyLCAweDdjLAorCTB4MjAsIDB4MTksIDB4MzIsIDB4MDAsCisJMHgwMSwgMHhkOSwgMHhiMiwgMHgwNSwKKwkweDAyLCAweGVhLCAweGI0LCAweDAwLAorCTB4MDEsIDB4ZDksIDB4YjIsIDB4MDUsCisJMHgxMCwgMHg1YiwgMHgwMCwgMHg2ZCwKKwkweDA4LCAweDViLCAweDBhLCAweDZkLAorCTB4MjAsIDB4NWIsIDB4ZmEsIDB4NmMsCisJMHgwMiwgMHg1YiwgMHgyYSwgMHg2ZCwKKwkweDBlLCAweGVhLCAweDUwLCAweDU5LAorCTB4MGUsIDB4ZWEsIDB4MDQsIDB4MDAsCisJMHg4MCwgMHhmOSwgMHhlYSwgMHg2YywKKwkweGRmLCAweDVjLCAweGI4LCAweDA4LAorCTB4MDEsIDB4ZDksIDB4YjIsIDB4MDUsCisJMHgwMSwgMHhhNCwgMHhlNSwgMHg2ZCwKKwkweDAwLCAweGUyLCAweDMwLCAweDVjLAorCTB4MDAsIDB4ZTIsIDB4MzQsIDB4NWQsCisJMHgwMSwgMHg5MCwgMHgyMSwgMHgxYiwKKwkweDAxLCAweGQ5LCAweGIyLCAweDA1LAorCTB4MDAsIDB4ZTIsIDB4MzIsIDB4NWIsCisJMHhmMywgMHg5NiwgMHhkNSwgMHgxOSwKKwkweDAwLCAweGUyLCAweDE4LCAweDU1LAorCTB4ODAsIDB4OTYsIDB4MTksIDB4NmQsCisJMHgwZiwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDBmLCAweGVhLCAweDA0LCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4MjAsIDB4NDUsCisJMHgwNCwgMHg4YywgMHhlMSwgMHgzMCwKKwkweDAxLCAweGVhLCAweGYyLCAweDAwLAorCTB4MDIsIDB4ZWEsIDB4MzYsIDB4MDAsCisJMHhhOCwgMHhlYSwgMHgzMiwgMHgwMCwKKwkweGZmLCAweDk3LCAweDI3LCAweDdkLAorCTB4MTQsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgxNCwgMHhlYSwgMHgwNCwgMHgwMCwKKwkweDAwLCAweGUyLCAweDk2LCAweDVkLAorCTB4MDEsIDB4ZDksIDB4YjIsIDB4MDUsCisJMHgwOSwgMHg4MCwgMHhlMSwgMHgzMCwKKwkweDAyLCAweGVhLCAweDM2LCAweDAwLAorCTB4YTgsIDB4ZWEsIDB4MzIsIDB4MDAsCisJMHgwMCwgMHhlMiwgMHg4ZSwgMHg1ZCwKKwkweDAxLCAweGQ5LCAweGIyLCAweDA1LAorCTB4MDIsIDB4YTYsIDB4NDQsIDB4N2QsCisJMHgwMCwgMHhlMiwgMHgzZSwgMHg1OSwKKwkweDIwLCAweDViLCAweDUyLCAweDZkLAorCTB4ZmMsIDB4NDIsIDB4M2UsIDB4N2QsCisJMHgxMCwgMHg0MCwgMHg0MCwgMHg2ZCwKKwkweDIwLCAweDRkLCAweDQyLCAweDdkLAorCTB4MDgsIDB4NWQsIDB4NTIsIDB4NmQsCisJMHgwMiwgMHhhNiwgMHhlNiwgMHg2YiwKKwkweDAwLCAweGUyLCAweDNlLCAweDU5LAorCTB4MjAsIDB4NWIsIDB4NTIsIDB4NmQsCisJMHgwMSwgMHgxYiwgMHg3MiwgMHg2ZCwKKwkweGZjLCAweDQyLCAweDRlLCAweDdkLAorCTB4MTAsIDB4NDAsIDB4NTAsIDB4NmQsCisJMHgyMCwgMHg0ZCwgMHg2NCwgMHg3OCwKKwkweDA4LCAweDVkLCAweDY0LCAweDc4LAorCTB4MDIsIDB4MTksIDB4MzIsIDB4MDAsCisJMHgwMSwgMHg1YiwgMHg0MCwgMHgzMSwKKwkweDAwLCAweGUyLCAweGIyLCAweDVjLAorCTB4MDAsIDB4ZTIsIDB4OWUsIDB4NWIsCisJMHgyMCwgMHhlYSwgMHhiNiwgMHgwMCwKKwkweDAwLCAweGUyLCAweGUwLCAweDViLAorCTB4MjAsIDB4NWMsIDB4YjgsIDB4MDAsCisJMHgwNCwgMHgxOSwgMHg2OCwgMHg2ZCwKKwkweDAxLCAweDFhLCAweDY4LCAweDZkLAorCTB4MDAsIDB4ZTIsIDB4M2UsIDB4NTksCisJMHgwMSwgMHgxYSwgMHg2NCwgMHg3OCwKKwkweDgwLCAweGY5LCAweGYyLCAweDAxLAorCTB4MjAsIDB4YTAsIDB4Y2MsIDB4N2QsCisJMHhmZiwgMHg5MCwgMHgyMSwgMHgxYiwKKwkweDA4LCAweDkyLCAweDQzLCAweDZiLAorCTB4MDIsIDB4ZWEsIDB4YjQsIDB4MDQsCisJMHgwMSwgMHhhNCwgMHg0OSwgMHgwMywKKwkweDQwLCAweDViLCAweDgyLCAweDZkLAorCTB4MDAsIDB4ZTIsIDB4M2UsIDB4NTksCisJMHg0MCwgMHg1YiwgMHg4MiwgMHg2ZCwKKwkweDA0LCAweDVkLCAweGU2LCAweDdkLAorCTB4MDEsIDB4MWEsIDB4ZTYsIDB4N2QsCisJMHgyMCwgMHg0ZCwgMHg2NCwgMHg3OCwKKwkweDQwLCAweDViLCAweGNjLCAweDdkLAorCTB4MDQsIDB4NWQsIDB4ZTYsIDB4N2QsCisJMHgwMSwgMHgxYSwgMHhlNiwgMHg3ZCwKKwkweDgwLCAweGY5LCAweGYyLCAweDAxLAorCTB4ZmYsIDB4OTAsIDB4MjEsIDB4MWIsCisJMHgwOCwgMHg5MiwgMHg0MywgMHg2YiwKKwkweDAyLCAweGVhLCAweGI0LCAweDA0LAorCTB4MDAsIDB4ZTIsIDB4M2UsIDB4NTksCisJMHgwMSwgMHgxYiwgMHg2NCwgMHg3OCwKKwkweDgwLCAweGY5LCAweGYyLCAweDAxLAorCTB4MDIsIDB4ZWEsIDB4YjQsIDB4MDQsCisJMHgwMCwgMHhlMiwgMHgzZSwgMHg1OSwKKwkweDAxLCAweDFiLCAweGFhLCAweDZkLAorCTB4NDAsIDB4NWIsIDB4YjgsIDB4N2QsCisJMHgwMSwgMHgxYiwgMHhhYSwgMHg2ZCwKKwkweDAyLCAweDE5LCAweDMyLCAweDAwLAorCTB4MDEsIDB4MWEsIDB4NjQsIDB4NzgsCisJMHg4MCwgMHhmOSwgMHhmMiwgMHgwMSwKKwkweGZmLCAweGVhLCAweDEwLCAweDAzLAorCTB4MDgsIDB4OTIsIDB4MjUsIDB4MDMsCisJMHgwMCwgMHhlMiwgMHg0MiwgMHg0MywKKwkweDAxLCAweDFhLCAweGI0LCAweDdkLAorCTB4NDAsIDB4NWIsIDB4YjAsIDB4N2QsCisJMHgwMSwgMHgxYSwgMHg5ZSwgMHg2ZCwKKwkweGZjLCAweDQyLCAweDY0LCAweDc4LAorCTB4MDEsIDB4MWEsIDB4YjgsIDB4NmQsCisJMHgxMCwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDEwLCAweGVhLCAweDA0LCAweDAwLAorCTB4ZmMsIDB4NDIsIDB4NjQsIDB4NzgsCisJMHgxMCwgMHg0MCwgMHhiZSwgMHg2ZCwKKwkweDIwLCAweDRkLCAweDY0LCAweDc4LAorCTB4NDAsIDB4NWIsIDB4OWUsIDB4NmQsCisJMHgwMSwgMHgxYSwgMHg2NCwgMHg3OCwKKwkweDAxLCAweDkwLCAweDIxLCAweDFiLAorCTB4MzAsIDB4M2YsIDB4YzAsIDB4MDksCisJMHgzMCwgMHhlMCwgMHg2NCwgMHg2MCwKKwkweDQwLCAweDRiLCAweDY0LCAweDY4LAorCTB4ZmYsIDB4ZWEsIDB4NTIsIDB4MDEsCisJMHhlZSwgMHgwMCwgMHhkMiwgMHg2ZCwKKwkweDgwLCAweGY5LCAweGYyLCAweDAxLAorCTB4ZmYsIDB4OTAsIDB4MjEsIDB4MWIsCisJMHgwMiwgMHhlYSwgMHhiNCwgMHgwMCwKKwkweDIwLCAweGVhLCAweDlhLCAweDAwLAorCTB4ZjMsIDB4NDIsIDB4ZGUsIDB4NmQsCisJMHgxMiwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDEyLCAweGVhLCAweDA0LCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCisJMHgwZCwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDBkLCAweGVhLCAweDA0LCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCisJMHgwMSwgMHg5MCwgMHgyMSwgMHgxYiwKKwkweDExLCAweGVhLCAweDUwLCAweDU5LAorCTB4MTEsIDB4ZWEsIDB4MDQsIDB4MDAsCisJMHgwMCwgMHhlMiwgMHgzMiwgMHg1YiwKKwkweDA4LCAweDVhLCAweGI0LCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4MGMsIDB4NWUsCisJMHhhOCwgMHhlYSwgMHgzMiwgMHgwMCwKKwkweDAwLCAweGUyLCAweDNlLCAweDU5LAorCTB4ODAsIDB4MWEsIDB4ZmEsIDB4N2QsCisJMHgwMCwgMHhlMiwgMHgwYywgMHg1ZSwKKwkweDgwLCAweDE5LCAweDMyLCAweDAwLAorCTB4NDAsIDB4NWIsIDB4MDAsIDB4NmUsCisJMHgwOCwgMHg1YSwgMHgwMCwgMHg3ZSwKKwkweDIwLCAweDRkLCAweDY0LCAweDc4LAorCTB4MDIsIDB4ODQsIDB4MDksIDB4MDMsCisJMHg0MCwgMHg1YiwgMHhjYywgMHg3ZCwKKwkweGZmLCAweDkwLCAweDIxLCAweDFiLAorCTB4ODAsIDB4ZjksIDB4ZjIsIDB4MDEsCisJMHgwOCwgMHg5MiwgMHg0MywgMHg2YiwKKwkweDAyLCAweGVhLCAweGI0LCAweDA0LAorCTB4MDEsIDB4MzgsIDB4ZTEsIDB4MzAsCisJMHgwNSwgMHgzOSwgMHhlMywgMHg5OCwKKwkweDAxLCAweGUwLCAweGY0LCAweDMxLAorCTB4ZmYsIDB4ZWEsIDB4YzAsIDB4MDksCisJMHgwMCwgMHgzYSwgMHhlNSwgMHgyMCwKKwkweDAwLCAweDNiLCAweGU3LCAweDIwLAorCTB4MDEsIDB4ZmEsIDB4YzAsIDB4MzEsCisJMHgwNCwgMHhlYSwgMHhlOCwgMHgzMCwKKwkweGZmLCAweGVhLCAweGYwLCAweDA4LAorCTB4MDIsIDB4ZWEsIDB4ZjIsIDB4MDAsCisJMHhmZiwgMHhlYSwgMHhmNCwgMHgwYworfTsKKwordHlwZWRlZiBpbnQgYWhkX3BhdGNoX2Z1bmNfdCAoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyBhaGRfcGF0Y2hfZnVuY190IGFoZF9wYXRjaDIyX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDIyX2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9QS1RfQklUQlVDS0VUX0JVRykgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGRfcGF0Y2hfZnVuY190IGFoZF9wYXRjaDIxX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDIxX2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9QS1RfQklUQlVDS0VUX0JVRykgPT0gMCk7Cit9CisKK3N0YXRpYyBhaGRfcGF0Y2hfZnVuY190IGFoZF9wYXRjaDIwX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDIwX2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfUlRJKSA9PSAwKTsKK30KKworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMTlfZnVuYzsKKworc3RhdGljIGludAorYWhkX3BhdGNoMTlfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgoYWhkLT5mbGFncyAmIEFIRF9JTklUSUFUT1JST0xFKSAhPSAwKTsKK30KKworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMThfZnVuYzsKKworc3RhdGljIGludAorYWhkX3BhdGNoMThfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgoYWhkLT5mbGFncyAmIEFIRF9UQVJHRVRST0xFKSAhPSAwKTsKK30KKworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMTdfZnVuYzsKKworc3RhdGljIGludAorYWhkX3BhdGNoMTdfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX0FVVE9GTFVTSF9CVUcpICE9IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gxNl9mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2gxNl9mdW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlyZXR1cm4gKChhaGQtPmZlYXR1cmVzICYgQUhEX05FV19ERkNOVFJMX09QVFMpICE9IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gxNV9mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2gxNV9mdW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlyZXR1cm4gKChhaGQtPmZsYWdzICYgQUhEXzM5QklUX0FERFJFU1NJTkcpICE9IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gxNF9mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2gxNF9mdW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlyZXR1cm4gKChhaGQtPmZsYWdzICYgQUhEXzY0QklUX0FERFJFU1NJTkcpICE9IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gxM19mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2gxM19mdW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlyZXR1cm4gKChhaGQtPmZlYXR1cmVzICYgQUhEX05FV19ERkNOVFJMX09QVFMpID09IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gxMl9mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2gxMl9mdW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlyZXR1cm4gKChhaGQtPmJ1Z3MgJiBBSERfUkVHX1NMT1dfU0VUVExFX0JVRykgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGRfcGF0Y2hfZnVuY190IGFoZF9wYXRjaDExX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDExX2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9FQVJMWV9SRVFfQlVHKSAhPSAwKTsKK30KKworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMTBfZnVuYzsKKworc3RhdGljIGludAorYWhkX3BhdGNoMTBfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX0JVU0ZSRUVSRVZfQlVHKSA9PSAwKTsKK30KKworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoOV9mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2g5X2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+ZmxhZ3MgJiBBSERfU0VRVUVOQ0VSX0RFQlVHKSAhPSAwKTsKK30KKworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoOF9mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2g4X2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9MUU9fQVROT19CVUcpICE9IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2g3X2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDdfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX0JVU0ZSRUVSRVZfQlVHKSAhPSAwKTsKK30KKworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoNl9mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2g2X2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9OT05QQUNLRklGT19CVUcpICE9IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2g1X2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDVfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX1NFTlRfU0NCX1VQREFURV9CVUcpICE9IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2g0X2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDRfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX1BLVF9MVU5fQlVHKSAhPSAwKTsKK30KKworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoM19mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2gzX2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9GQUlOVF9MRURfQlVHKSAhPSAwKTsKK30KKworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMl9mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2gyX2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9TRVRfTU9ERV9CVUcpICE9IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gxX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDFfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX0lOVENPTExJU0lPTl9CVUcpICE9IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gwX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDBfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHN0cnVjdCBwYXRjaCB7CisJYWhkX3BhdGNoX2Z1bmNfdAkJKnBhdGNoX2Z1bmM7CisJdWludDMyX3QJCSBiZWdpbgkJOjEwLAorCQkJCSBza2lwX2luc3RyCToxMCwKKwkJCQkgc2tpcF9wYXRjaAk6MTI7Cit9IHBhdGNoZXNbXSA9IHsKKwl7IGFoZF9wYXRjaDFfZnVuYywgMCwgMywgMyB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCAxLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDIsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgMywgMywgMyB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA0LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDUsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgNiwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA3LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gzX2Z1bmMsIDIwLCA1LCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDI5LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDMwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDM3LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDM4LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDQzLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDQ0LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDQ3LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDQ4LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDUxLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDUyLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDY1LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDY2LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDY5LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDcwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDczLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDc0LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2g0X2Z1bmMsIDEwNywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCAxNjIsIDYsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgMTY4LCAyLCAxIH0sCisJeyBhaGRfcGF0Y2g1X2Z1bmMsIDE3MCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCAxNzksIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMTgwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2g2X2Z1bmMsIDE4MSwgMiwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAxODMsIDYsIDMgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgMTg2LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDE4NywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCAxOTAsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMTkxLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2g3X2Z1bmMsIDE5MywgMiwgMSB9LAorCXsgYWhkX3BhdGNoNV9mdW5jLCAyMDEsIDE2LCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDIxNywgMSwgMSB9LAorCXsgYWhkX3BhdGNoOF9mdW5jLCAyMzcsIDIsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgMjQxLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDI0MiwgMSwgMSB9LAorCXsgYWhkX3BhdGNoN19mdW5jLCAyNDUsIDIsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgMjU5LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDI2MCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCAyNjMsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMjY0LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDI2NywgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAyNjgsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgMzIzLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDMyNCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCAzMzIsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMzMzLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDMzNiwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAzMzcsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgMzQzLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDM0NCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCAzNDYsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMzQ3LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2g5X2Z1bmMsIDM2NiwgMSwgMSB9LAorCXsgYWhkX3BhdGNoOV9mdW5jLCAzNjksIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDlfZnVuYywgMzcxLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2g5X2Z1bmMsIDM4MywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCAzOTMsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMzk0LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDM5NiwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAzOTcsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgNDA1LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDQwNiwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCA0MTksIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNDIwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxMF9mdW5jLCA0NTAsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgNDU3LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDQ1OCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCA0NzAsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNDcxLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxMV9mdW5jLCA0NzYsIDYsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNDgyLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxMl9mdW5jLCA1MDUsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDEzX2Z1bmMsIDUxNCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMTRfZnVuYywgNTE1LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDUxNiwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMTVfZnVuYywgNTE5LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxNF9mdW5jLCA1MjAsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDE2X2Z1bmMsIDUzMSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA1MzIsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgNTUxLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDU1MiwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA1NTUsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNTU2LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDU2MSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA1NjIsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgNTY2LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDU2NywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA1NjgsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNTY5LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDU4MCwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA1ODEsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDE3X2Z1bmMsIDU4NSwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMThfZnVuYywgNTkwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxOV9mdW5jLCA1OTEsIDIsIDEgfSwKKwl7IGFoZF9wYXRjaDE4X2Z1bmMsIDU5NSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA1OTYsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgNTk5LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDYwMCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCA2MTUsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNjE2LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyMF9mdW5jLCA2MTcsIDE0LCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDYzNSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA2MzYsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDIwX2Z1bmMsIDYzNywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA2NDksIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNjUwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDY1NywgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA2NTgsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDE3X2Z1bmMsIDY4MSwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMTdfZnVuYywgNzE5LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDczMCwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA3MzEsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgNzQ4LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDc0OSwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA3NTEsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNzUyLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDc1NSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA3NTYsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDIxX2Z1bmMsIDc1OCwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA3NTksIDIsIDEgfSwKKwl7IGFoZF9wYXRjaDIyX2Z1bmMsIDc2MiwgNCwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA3NjYsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDIyX2Z1bmMsIDc3NCwgMTEsIDEgfQorfTsKKworc3RhdGljIHN0cnVjdCBjcyB7CisJdWludDE2X3QJYmVnaW47CisJdWludDE2X3QJZW5kOworfSBjcml0aWNhbF9zZWN0aW9uc1tdID0geworCXsgMTEsIDEyIH0sCisJeyAxMywgMTQgfSwKKwl7IDI5LCA0MiB9LAorCXsgNTYsIDU5IH0sCisJeyAxMDEsIDEyOCB9LAorCXsgMTI5LCAxNTcgfSwKKwl7IDE1OSwgMTYyIH0sCisJeyAxNzAsIDE3OCB9LAorCXsgMjAxLCAyNTAgfSwKKwl7IDY4MSwgNjk3IH0sCisJeyA2OTcsIDcxMSB9LAorCXsgNzIxLCA3MjUgfQorfTsKKworc3RhdGljIGNvbnN0IGludCBudW1fY3JpdGljYWxfc2VjdGlvbnMgPSBzaXplb2YoY3JpdGljYWxfc2VjdGlvbnMpCisJCQkJICAgICAgIC8gc2l6ZW9mKCpjcml0aWNhbF9zZWN0aW9ucyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZmMTZmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHguaApAQCAtMCwwICsxLDEzNTIgQEAKKy8qCisgKiBDb3JlIGRlZmluaXRpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMgc2hhcmVhYmxlIGFjcm9zcyBPUyBwbGF0Zm9ybXMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMDEgSnVzdGluIFQuIEdpYmJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LmgjNzkgJAorICoKKyAqICRGcmVlQlNEJAorICovCisKKyNpZm5kZWYgX0FJQzdYWFhfSF8KKyNkZWZpbmUgX0FJQzdYWFhfSF8KKworLyogUmVnaXN0ZXIgRGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJhaWM3eHh4X3JlZy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBGb3J3YXJkIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGFoY19wbGF0Zm9ybV9kYXRhOworc3RydWN0IHNjYl9wbGF0Zm9ybV9kYXRhOworc3RydWN0IHNlZXByb21fZGVzY3JpcHRvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVc2VmdWwgTWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgTUFYCisjZGVmaW5lIE1BWChhLGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKyNlbmRpZgorCisjaWZuZGVmIE1JTgorI2RlZmluZSBNSU4oYSxiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZW5kaWYKKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgMQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCisjZGVmaW5lIE5VTV9FTEVNRU5UUyhhcnJheSkgKHNpemVvZihhcnJheSkgLyBzaXplb2YoKmFycmF5KSkKKworI2RlZmluZSBBTExfQ0hBTk5FTFMgJ1wwJworI2RlZmluZSBBTExfVEFSR0VUU19NQVNLIDB4RkZGRgorI2RlZmluZSBJTklUSUFUT1JfV0lMRENBUkQJKH4wKQorCisjZGVmaW5lIFNDU0lJRF9UQVJHRVQoYWhjLCBzY3NpaWQpIFwKKwkoKChzY3NpaWQpICYgKCgoKGFoYyktPmZlYXR1cmVzICYgQUhDX1RXSU4pICE9IDApID8gVFdJTl9USUQgOiBUSUQpKSBcCisJPj4gVElEX1NISUZUKQorI2RlZmluZSBTQ1NJSURfT1VSX0lEKHNjc2lpZCkgXAorCSgoc2NzaWlkKSAmIE9JRCkKKyNkZWZpbmUgU0NTSUlEX0NIQU5ORUwoYWhjLCBzY3NpaWQpIFwKKwkoKCgoYWhjKS0+ZmVhdHVyZXMgJiBBSENfVFdJTikgIT0gMCkgXAorICAgICAgICA/ICgoKChzY3NpaWQpICYgVFdJTl9DSE5MQikgIT0gMCkgPyAnQicgOiAnQScpIFwKKyAgICAgICA6ICdBJykKKyNkZWZpbmUJU0NCX0lTX1NDU0lCVVNfQihhaGMsIHNjYikgXAorCShTQ1NJSURfQ0hBTk5FTChhaGMsIChzY2IpLT5oc2NiLT5zY3NpaWQpID09ICdCJykKKyNkZWZpbmUJU0NCX0dFVF9PVVJfSUQoc2NiKSBcCisJU0NTSUlEX09VUl9JRCgoc2NiKS0+aHNjYi0+c2NzaWlkKQorI2RlZmluZQlTQ0JfR0VUX1RBUkdFVChhaGMsIHNjYikgXAorCVNDU0lJRF9UQVJHRVQoKGFoYyksIChzY2IpLT5oc2NiLT5zY3NpaWQpCisjZGVmaW5lCVNDQl9HRVRfQ0hBTk5FTChhaGMsIHNjYikgXAorCVNDU0lJRF9DSEFOTkVMKGFoYywgKHNjYiktPmhzY2ItPnNjc2lpZCkKKyNkZWZpbmUJU0NCX0dFVF9MVU4oc2NiKSBcCisJKChzY2IpLT5oc2NiLT5sdW4gJiBMSUQpCisjZGVmaW5lIFNDQl9HRVRfVEFSR0VUX09GRlNFVChhaGMsIHNjYikJXAorCShTQ0JfR0VUX1RBUkdFVChhaGMsIHNjYikgKyAoU0NCX0lTX1NDU0lCVVNfQihhaGMsIHNjYikgPyA4IDogMCkpCisjZGVmaW5lIFNDQl9HRVRfVEFSR0VUX01BU0soYWhjLCBzY2IpIFwKKwkoMHgwMSA8PCAoU0NCX0dFVF9UQVJHRVRfT0ZGU0VUKGFoYywgc2NiKSkpCisjaWZkZWYgQUhDX0RFQlVHCisjZGVmaW5lIFNDQl9JU19TSUxFTlQoc2NiKQkJCQkJXAorCSgoYWhjX2RlYnVnICYgQUhDX1NIT1dfTUFTS0VEX0VSUk9SUykgPT0gMAkJXAorICAgICAgJiYgKCgoc2NiKS0+ZmxhZ3MgJiBTQ0JfU0lMRU5UKSAhPSAwKSkKKyNlbHNlCisjZGVmaW5lIFNDQl9JU19TSUxFTlQoc2NiKQkJCQkJXAorCSgoKHNjYiktPmZsYWdzICYgU0NCX1NJTEVOVCkgIT0gMCkKKyNlbmRpZgorI2RlZmluZSBUQ0xfVEFSR0VUX09GRlNFVCh0Y2wpIFwKKwkoKCgodGNsKSA+PiA0KSAmIFRJRCkgPj4gNCkKKyNkZWZpbmUgVENMX0xVTih0Y2wpIFwKKwkodGNsICYgKEFIQ19OVU1fTFVOUyAtIDEpKQorI2RlZmluZSBCVUlMRF9UQ0woc2NzaWlkLCBsdW4pIFwKKwkoKGx1bikgfCAoKChzY3NpaWQpICYgVElEKSA8PCA0KSkKKworI2lmbmRlZglBSENfVEFSR0VUX01PREUKKyN1bmRlZglBSENfVE1PREVfRU5BQkxFCisjZGVmaW5lCUFIQ19UTU9ERV9FTkFCTEUgMAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIERyaXZlciBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCB0YXJnZXRzLgorICovCisjZGVmaW5lIEFIQ19OVU1fVEFSR0VUUyAxNgorCisvKgorICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBsdW5zLgorICogVGhlIGlkZW50aWZ5IG1lc3NhZ2Ugb25seSBzdXBwb3J0cyA2NCBsdW5zIGluIFNQSTMuCisgKiBZb3UgY2FuIGhhdmUgMl42NCBsdW5zIHdoZW4gaW5mb3JtYXRpb24gdW5pdCB0cmFuc2ZlcnMgYXJlIGVuYWJsZWQsCisgKiBidXQgaXQgaXMgZG91YnRmdWwgdGhpcyBkcml2ZXIgd2lsbCBldmVyIHN1cHBvcnQgSVVUcy4KKyAqLworI2RlZmluZSBBSENfTlVNX0xVTlMgNjQKKworLyoKKyAqIFRoZSBtYXhpbXVtIHRyYW5zZmVyIHBlciBTL0cgc2VnbWVudC4KKyAqLworI2RlZmluZSBBSENfTUFYVFJBTlNGRVJfU0laRQkgMHgwMGZmZmZmZgkvKiBsaW1pdGVkIGJ5IDI0Yml0IGNvdW50ZXIgKi8KKworLyoKKyAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBTQ0Igc3RvcmFnZSBpbiBoYXJkd2FyZSBvbiBhIGNvbnRyb2xsZXIuCisgKiBUaGlzIHZhbHVlIHJlcHJlc2VudHMgYW4gdXBwZXIgYm91bmQuICBDb250cm9sbGVycyB2YXJ5IGluIHRoZSBudW1iZXIKKyAqIHRoZXkgYWN0dWFsbHkgc3VwcG9ydC4KKyAqLworI2RlZmluZSBBSENfU0NCX01BWAkyNTUKKworLyoKKyAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IHRyYW5zYWN0aW9ucyBzdXBwb3J0ZWQgcGVyIGRyaXZlciBpbnN0YW5jZS4KKyAqIFNlcXVlbmNlciBDb250cm9sIEJsb2NrcyAoU0NCcykgc3RvcmUgcGVyLXRyYW5zYWN0aW9uIGluZm9ybWF0aW9uLiAgQWx0aG91Z2gKKyAqIHRoZSBzcGFjZSBmb3IgU0NCcyBvbiB0aGUgaG9zdCBhZGFwdGVyIHZhcmllcyBieSBtb2RlbCwgdGhlIGRyaXZlciB3aWxsCisgKiBwYWdlIHRoZSBTQ0JzIGJldHdlZW4gaG9zdCBhbmQgY29udHJvbGxlciBtZW1vcnkgYXMgbmVlZGVkLiAgV2UgYXJlIGxpbWl0ZWQKKyAqIHRvIDI1MyBiZWNhdXNlOgorICogCTEpIFRoZSA4Yml0IG5hdHVyZSBvZiB0aGUgUklTQyBlbmdpbmUgaG9sZHMgdXMgdG8gYW4gOGJpdCB2YWx1ZS4KKyAqIAkyKSBXZSByZXNlcnZlIG9uZSB2YWx1ZSwgMjU1LCB0byByZXByZXNlbnQgdGhlIGludmFsaWQgZWxlbWVudC4KKyAqCTMpIE91ciBpbnB1dCBxdWV1ZSBzY2hlbWUgcmVxdWlyZXMgb25lIFNDQiB0byBhbHdheXMgYmUgcmVzZXJ2ZWQKKyAqCSAgIGluIGFkdmFuY2Ugb2YgcXVldWluZyBhbnkgU0NCcy4gIFRoaXMgdGFrZXMgdXMgZG93biB0byAyNTQuCisgKgk0KSBUbyBoYW5kbGUgb3VyIG91dHB1dCBxdWV1ZSBjb3JyZWN0bHkgb24gbWFjaGluZXMgdGhhdCBvbmx5CisgKiAJICAgc3VwcG9ydCAzMmJpdCBzdG9yZXMsIHdlIG11c3QgY2xlYXIgdGhlIGFycmF5IDQgYnl0ZXMgYXQgYQorICoJICAgdGltZS4gIFRvIGF2b2lkIGNvbGxpZGluZyB3aXRoIGEgRE1BIHdyaXRlIGZyb20gdGhlIHNlcXVlbmNlciwKKyAqCSAgIHdlIG11c3QgYmUgc3VyZSB0aGF0IDQgc2xvdHMgYXJlIGVtcHR5IHdoZW4gd2Ugd3JpdGUgdG8gY2xlYXIKKyAqCSAgIHRoZSBxdWV1ZS4gIFRoaXMgcmVkdWNlcyB1cyB0byAyNTMgU0NCczogMSB0aGF0IGp1c3QgY29tcGxldGVkCisgKgkgICBhbmQgdGhlIGtub3duIHRocmVlIGFkZGl0aW9uYWwgZW1wdHkgc2xvdHMgaW4gdGhlIHF1ZXVlIHRoYXQKKyAqCSAgIHByZWNlZGUgaXQuCisgKi8KKyNkZWZpbmUgQUhDX01BWF9RVUVVRQkyNTMKKworLyoKKyAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBTQ0Igc3RvcmFnZSB3ZSBhbGxvY2F0ZSBpbiBob3N0IG1lbW9yeS4gIFRoaXMKKyAqIG51bWJlciBzaG91bGQgcmVmbGVjdCB0aGUgMSBhZGRpdGlvbmFsIFNDQiB3ZSByZXF1aXJlIHRvIGhhbmRsZSBvdXIKKyAqIHFpbmZpZm8gbWVjaGFuaXNtLgorICovCisjZGVmaW5lIEFIQ19TQ0JfTUFYX0FMTE9DIChBSENfTUFYX1FVRVVFKzEpCisKKy8qCisgKiBSaW5nIEJ1ZmZlciBvZiBpbmNvbWluZyB0YXJnZXQgY29tbWFuZHMuCisgKiBXZSBhbGxvY2F0ZSAyNTYgdG8gc2ltcGxpZnkgdGhlIGxvZ2ljIGluIHRoZSBzZXF1ZW5jZXIKKyAqIGJ5IHVzaW5nIHRoZSBuYXR1cmFsIHdyYXAgcG9pbnQgb2YgYW4gOGJpdCBjb3VudGVyLgorICovCisjZGVmaW5lIEFIQ19UTU9ERV9DTURTCTI1NgorCisvKiBSZXNldCBsaW5lIGFzc2VydGlvbiB0aW1lIGluIHVzICovCisjZGVmaW5lIEFIQ19CVVNSRVNFVF9ERUxBWQkyNQorCisvKioqKioqKioqKioqKioqKioqKiBDaGlwIENoYXJhY3RlcmlzdGljcy9PcGVyYXRpbmcgU2V0dGluZ3MgICoqKioqKioqKioqKioqKioqLworLyoKKyAqIENoaXAgVHlwZQorICogVGhlIGNoaXAgb3JkZXIgaXMgZnJvbSBsZWFzdCBzb3BoaXN0aWNhdGVkIHRvIG1vc3Qgc29waGlzdGljYXRlZC4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlBSENfTk9ORQk9IDB4MDAwMCwKKwlBSENfQ0hJUElEX01BU0sJPSAweDAwRkYsCisJQUhDX0FJQzc3NzAJPSAweDAwMDEsCisJQUhDX0FJQzc4NTAJPSAweDAwMDIsCisJQUhDX0FJQzc4NTUJPSAweDAwMDMsCisJQUhDX0FJQzc4NTkJPSAweDAwMDQsCisJQUhDX0FJQzc4NjAJPSAweDAwMDUsCisJQUhDX0FJQzc4NzAJPSAweDAwMDYsCisJQUhDX0FJQzc4ODAJPSAweDAwMDcsCisJQUhDX0FJQzc4OTUJPSAweDAwMDgsCisJQUhDX0FJQzc4OTVDCT0gMHgwMDA5LAorCUFIQ19BSUM3ODkwCT0gMHgwMDBhLAorCUFIQ19BSUM3ODk2CT0gMHgwMDBiLAorCUFIQ19BSUM3ODkyCT0gMHgwMDBjLAorCUFIQ19BSUM3ODk5CT0gMHgwMDBkLAorCUFIQ19WTAkJPSAweDAxMDAsCS8qIEJ1cyB0eXBlIFZMICovCisJQUhDX0VJU0EJPSAweDAyMDAsCS8qIEJ1cyB0eXBlIEVJU0EgKi8KKwlBSENfUENJCQk9IDB4MDQwMCwJLyogQnVzIHR5cGUgUENJICovCisJQUhDX0JVU19NQVNLCT0gMHgwRjAwCit9IGFoY19jaGlwOworCisvKgorICogRmVhdHVyZXMgYXZhaWxhYmxlIGluIGVhY2ggY2hpcCB0eXBlLgorICovCit0eXBlZGVmIGVudW0geworCUFIQ19GRU5PTkUJPSAweDAwMDAwLAorCUFIQ19VTFRSQQk9IDB4MDAwMDEsCS8qIFN1cHBvcnRzIDIwTUh6IFRyYW5zZmVycyAqLworCUFIQ19VTFRSQTIJPSAweDAwMDAyLAkvKiBTdXBwb3J0cyA0ME1IeiBUcmFuc2ZlcnMgKi8KKwlBSENfV0lERSAgCT0gMHgwMDAwNCwJLyogV2lkZSBDaGFubmVsICovCisJQUhDX1RXSU4JPSAweDAwMDA4LAkvKiBUd2luIENoYW5uZWwgKi8KKwlBSENfTU9SRV9TUkFNCT0gMHgwMDAxMCwJLyogODAgYnl0ZXMgaW5zdGVhZCBvZiA2NCAqLworCUFIQ19DTURfQ0hBTgk9IDB4MDAwMjAsCS8qIEhhcyBhIENvbW1hbmQgRE1BIENoYW5uZWwgKi8KKwlBSENfUVVFVUVfUkVHUwk9IDB4MDAwNDAsCS8qIEhhcyBRdWV1ZSBtYW5hZ2VtZW50IHJlZ2lzdGVycyAqLworCUFIQ19TR19QUkVMT0FECT0gMHgwMDA4MCwJLyogQ2FuIHBlcmZvcm0gYXV0by1TRyBwcmVsb2FkICovCisJQUhDX1NQSU9DQVAJPSAweDAwMTAwLAkvKiBIYXMgYSBTZXJpYWwgUG9ydCBJL08gQ2FwIFJlZ2lzdGVyICovCisJQUhDX01VTFRJX1RJRAk9IDB4MDAyMDAsCS8qIEhhcyBiaXRtYXNrIG9mIFRJRHMgZm9yIHNlbGVjdC1pbiAqLworCUFIQ19IU19NQUlMQk9YCT0gMHgwMDQwMCwJLyogSGFzIEhTX01BSUxCT1ggcmVnaXN0ZXIgKi8KKwlBSENfRFQJCT0gMHgwMDgwMCwJLyogRG91YmxlIFRyYW5zaXRpb24gdHJhbnNmZXJzICovCisJQUhDX05FV19URVJNQ1RMCT0gMHgwMTAwMCwJLyogTmV3ZXIgdGVybWluYXRpb24gc2NoZW1lICovCisJQUhDX01VTFRJX0ZVTkMJPSAweDAyMDAwLAkvKiBNdWx0aS1GdW5jdGlvbiBUd2luIENoYW5uZWwgRGV2aWNlICovCisJQUhDX0xBUkdFX1NDQlMJPSAweDA0MDAwLAkvKiA2NGJ5dGUgU0NCcyAqLworCUFIQ19BVVRPUkFURQk9IDB4MDgwMDAsCS8qIEF1dG9tYXRpYyB1cGRhdGUgb2YgU0NTSVJBVEUvT0ZGU0VUKi8KKwlBSENfQVVUT1BBVVNFCT0gMHgxMDAwMCwJLyogQXV0b21hdGljIHBhdXNlIG9uIHJlZ2lzdGVyIGFjY2VzcyAqLworCUFIQ19UQVJHRVRNT0RFCT0gMHgyMDAwMCwJLyogSGFzIHRlc3RlZCB0YXJnZXQgbW9kZSBzdXBwb3J0ICovCisJQUhDX01VTFRJUk9MRQk9IDB4NDAwMDAsCS8qIFNwYWNlIGZvciB0d28gcm9sZXMgYXQgYSB0aW1lICovCisJQUhDX1JFTU9WQUJMRQk9IDB4ODAwMDAsCS8qIEhvdC1Td2FwIHN1cHBvcnRlZCAqLworCUFIQ19BSUM3NzcwX0ZFCT0gQUhDX0ZFTk9ORSwKKwkvKgorCSAqIFRoZSByZWFsIDc4NTAgZG9lcyBub3Qgc3VwcG9ydCBVbHRyYSBtb2RlcywgYnV0IHRoZXJlIGFyZQorCSAqIHNldmVyYWwgY2FyZHMgdGhhdCB1c2UgdGhlIGdlbmVyaWMgNzg1MCBQQ0kgSUQgZXZlbiB0aG91Z2gKKwkgKiB0aGV5IGFyZSB1c2luZyBhbiBVbHRyYSBjYXBhYmxlIGNoaXAgKDc4NTkvNzg2MCkuICBXZSBzdGFydAorCSAqIG91dCB3aXRoIHRoZSBBSENfVUxUUkEgZmVhdHVyZSBzZXQgYW5kIHRoZW4gY2hlY2sgdGhlIERFVlNUQVRVUworCSAqIHJlZ2lzdGVyIHRvIGRldGVybWluZSBpZiB0aGUgY2FwYWJpbGl0eSBpcyByZWFsbHkgcHJlc2VudC4KKwkgKi8KKwlBSENfQUlDNzg1MF9GRQk9IEFIQ19TUElPQ0FQfEFIQ19BVVRPUEFVU0V8QUhDX1RBUkdFVE1PREV8QUhDX1VMVFJBLAorCUFIQ19BSUM3ODYwX0ZFCT0gQUhDX0FJQzc4NTBfRkUsCisJQUhDX0FJQzc4NzBfRkUJPSBBSENfVEFSR0VUTU9ERSwKKwlBSENfQUlDNzg4MF9GRQk9IEFIQ19BSUM3ODcwX0ZFfEFIQ19VTFRSQSwKKwkvKgorCSAqIEFsdGhvdWdoIHdlIGhhdmUgc3BhY2UgZm9yIGJvdGggdGhlIGluaXRpYXRvciBhbmQKKwkgKiB0YXJnZXQgcm9sZXMgb24gVUxUUkEyIGNoaXBzLCB3ZSBjdXJyZW50bHkgZGlzYWJsZQorCSAqIHRoZSBpbml0aWF0b3Igcm9sZSB0byBhbGxvdyBtdWx0aS1zY3NpLWlkIHRhcmdldCBtb2RlCisJICogY29uZmlndXJhdGlvbnMuICBXZSBjYW4gb25seSByZXNwb25kIG9uIHRoZSBzYW1lIFNDU0kKKwkgKiBJRCBhcyBvdXIgaW5pdGlhdG9yIHJvbGUgaWYgd2UgYWxsb3cgaW5pdGlhdG9yIG9wZXJhdGlvbi4KKwkgKiBBdCBzb21lIHBvaW50LCB3ZSBzaG91bGQgYWRkIGEgY29uZmlndXJhdGlvbiBrbm9iIHRvCisJICogYWxsb3cgYm90aCByb2xlcyB0byBiZSBsb2FkZWQuCisJICovCisJQUhDX0FJQzc4OTBfRkUJPSBBSENfTU9SRV9TUkFNfEFIQ19DTURfQ0hBTnxBSENfVUxUUkEyCisJCQkgIHxBSENfUVVFVUVfUkVHU3xBSENfU0dfUFJFTE9BRHxBSENfTVVMVElfVElECisJCQkgIHxBSENfSFNfTUFJTEJPWHxBSENfTkVXX1RFUk1DVEx8QUhDX0xBUkdFX1NDQlMKKwkJCSAgfEFIQ19UQVJHRVRNT0RFLAorCUFIQ19BSUM3ODkyX0ZFCT0gQUhDX0FJQzc4OTBfRkV8QUhDX0RUfEFIQ19BVVRPUkFURXxBSENfQVVUT1BBVVNFLAorCUFIQ19BSUM3ODk1X0ZFCT0gQUhDX0FJQzc4ODBfRkV8QUhDX01PUkVfU1JBTXxBSENfQVVUT1BBVVNFCisJCQkgIHxBSENfQ01EX0NIQU58QUhDX01VTFRJX0ZVTkN8QUhDX0xBUkdFX1NDQlMsCisJQUhDX0FJQzc4OTVDX0ZFCT0gQUhDX0FJQzc4OTVfRkV8QUhDX01VTFRJX1RJRCwKKwlBSENfQUlDNzg5Nl9GRQk9IEFIQ19BSUM3ODkwX0ZFfEFIQ19NVUxUSV9GVU5DLAorCUFIQ19BSUM3ODk5X0ZFCT0gQUhDX0FJQzc4OTJfRkV8QUhDX01VTFRJX0ZVTkMKK30gYWhjX2ZlYXR1cmU7CisKKy8qCisgKiBCdWdzIGluIHRoZSBzaWxpY29uIHRoYXQgd2Ugd29yayBhcm91bmQgaW4gc29mdHdhcmUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJQUhDX0JVR05PTkUJCT0gMHgwMCwKKwkvKgorCSAqIE9uIGFsbCBjaGlwcyBwcmlvciB0byB0aGUgVTIgcHJvZHVjdCBsaW5lLAorCSAqIHRoZSBXSURFT0REIFMvRyBzZWdtZW50IGZlYXR1cmUgZG9lcyBub3QKKwkgKiB3b3JrIGR1cmluZyBzY3NpLT5Ib3N0QnVzIHRyYW5zZmVycy4KKwkgKi8KKwlBSENfVE1PREVfV0lERU9ERF9CVUcJPSAweDAxLAorCS8qCisJICogT24gdGhlIGFpYzc4OTAvOTEgUmV2IDAgY2hpcHMsIHRoZSBhdXRvZmx1c2gKKwkgKiBmZWF0dXJlIGRvZXMgbm90IHdvcmsuICBBIG1hbnVhbCBmbHVzaCBvZgorCSAqIHRoZSBETUEgRklGTyBpcyByZXF1aXJlZC4KKwkgKi8KKwlBSENfQVVUT0ZMVVNIX0JVRwk9IDB4MDIsCisJLyoKKwkgKiBPbiBtYW55IGNoaXBzLCBjYWNoZWxpbmUgc3RyZWFtaW5nIGRvZXMgbm90IHdvcmsuCisJICovCisJQUhDX0NBQ0hFVEhFTl9CVUcJPSAweDA0LAorCS8qCisJICogT24gdGhlIGFpYzc4OTYvOTcgY2hpcHMsIGNhY2hlbGluZQorCSAqIHN0cmVhbWluZyBtdXN0IGJlIGVuYWJsZWQuCisJICovCisJQUhDX0NBQ0hFVEhFTl9ESVNfQlVHCT0gMHgwOCwKKwkvKgorCSAqIFBDSSAyLjEgUmV0cnkgZmFpbHVyZSBvbiBub24tZW1wdHkgZGF0YSBmaWZvLgorCSAqLworCUFIQ19QQ0lfMl8xX1JFVFJZX0JVRwk9IDB4MTAsCisJLyoKKwkgKiBDb250cm9sbGVyIGRvZXMgbm90IGhhbmRsZSBjYWNoZWxpbmUgcmVzaWR1YWxzCisJICogcHJvcGVybHkgb24gUy9HIHNlZ21lbnRzIGlmIFBDSSBNV0kgaW5zdHJ1Y3Rpb25zCisJICogYXJlIGFsbG93ZWQuCisJICovCisJQUhDX1BDSV9NV0lfQlVHCQk9IDB4MjAsCisJLyoKKwkgKiBBbiBTQ0IgdXBsb2FkIHVzaW5nIHRoZSBTQ0IgY2hhbm5lbCdzCisJICogYXV0byBhcnJheSBlbnRyeSBjb3B5IGZlYXR1cmUgbWF5IAorCSAqIGNvcnJ1cHQgZGF0YS4gIFRoaXMgYXBwZWFycyB0byBvbmx5CisJICogb2NjdXIgb24gNjZNSHogc3lzdGVtcy4KKwkgKi8KKwlBSENfU0NCQ0hBTl9VUExPQURfQlVHCT0gMHg0MAorfSBhaGNfYnVnOworCisvKgorICogQ29uZmlndXJhdGlvbiBzcGVjaWZpYyBzZXR0aW5ncy4KKyAqIFRoZSBkcml2ZXIgZGV0ZXJtaW5lcyB0aGVzZSBzZXR0aW5ncyBieSBwcm9iaW5nIHRoZQorICogY2hpcC9jb250cm9sbGVyJ3MgY29uZmlndXJhdGlvbi4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlBSENfRk5PTkUJICAgICAgPSAweDAwMCwKKwlBSENfUFJJTUFSWV9DSEFOTkVMICAgPSAweDAwMywgIC8qCisJCQkJCSAqIFRoZSBjaGFubmVsIHRoYXQgc2hvdWxkCisJCQkJCSAqIGJlIHByb2JlZCBmaXJzdC4KKwkJCQkJICovCisJQUhDX1VTRURFRkFVTFRTCSAgICAgID0gMHgwMDQsICAvKgorCQkJCQkgKiBGb3IgY2FyZHMgd2l0aG91dCBhbiBzZWVwcm9tCisJCQkJCSAqIG9yIGEgQklPUyB0byBpbml0aWFsaXplIHRoZSBjaGlwJ3MKKwkJCQkJICogU1JBTSwgd2UgdXNlIHRoZSBkZWZhdWx0IHRhcmdldAorCQkJCQkgKiBzZXR0aW5ncy4KKwkJCQkJICovCisJQUhDX1NFUVVFTkNFUl9ERUJVRyAgID0gMHgwMDgsCisJQUhDX1NIQVJFRF9TUkFNCSAgICAgID0gMHgwMTAsCisJQUhDX0xBUkdFX1NFRVBST00gICAgID0gMHgwMjAsICAvKiBVc2VzIEM1Nl82NiBub3QgQzQ2ICovCisJQUhDX1JFU0VUX0JVU19BCSAgICAgID0gMHgwNDAsCisJQUhDX1JFU0VUX0JVU19CCSAgICAgID0gMHgwODAsCisJQUhDX0VYVEVOREVEX1RSQU5TX0EgID0gMHgxMDAsCisJQUhDX0VYVEVOREVEX1RSQU5TX0IgID0gMHgyMDAsCisJQUhDX1RFUk1fRU5CX0EJICAgICAgPSAweDQwMCwKKwlBSENfVEVSTV9FTkJfQgkgICAgICA9IDB4ODAwLAorCUFIQ19JTklUSUFUT1JST0xFICAgICA9IDB4MTAwMCwgIC8qCisJCQkJCSAgKiBBbGxvdyBpbml0aWF0b3Igb3BlcmF0aW9ucyBvbgorCQkJCQkgICogdGhpcyBjb250cm9sbGVyLgorCQkJCQkgICovCisJQUhDX1RBUkdFVFJPTEUJICAgICAgPSAweDIwMDAsICAvKgorCQkJCQkgICogQWxsb3cgdGFyZ2V0IG9wZXJhdGlvbnMgb24gdGhpcworCQkJCQkgICogY29udHJvbGxlci4KKwkJCQkJICAqLworCUFIQ19ORVdFRVBST01fRk1UICAgICA9IDB4NDAwMCwKKwlBSENfUkVTT1VSQ0VfU0hPUlRBR0UgPSAweDgwMDAsCisJQUhDX1RRSU5GSUZPX0JMT0NLRUQgID0gMHgxMDAwMCwgIC8qIEJsb2NrZWQgd2FpdGluZyBmb3IgQVRJT3MgKi8KKwlBSENfSU5UNTBfU1BFRURGTEVYICAgPSAweDIwMDAwLCAgLyoKKwkJCQkJICAgKiBJbnRlcm5hbCA1MHBpbiBjb25uZWN0b3IKKwkJCQkJICAgKiBzaXRzIGJlaGluZCBhbiBhaWMzODYwCisJCQkJCSAgICovCisJQUhDX1NDQl9CVFQJICAgICAgPSAweDQwMDAwLCAgLyoKKwkJCQkJICAgKiBUaGUgYnVzeSB0YXJnZXRzIHRhYmxlIGlzCisJCQkJCSAgICogc3RvcmVkIGluIFNDQiBzcGFjZSByYXRoZXIKKwkJCQkJICAgKiB0aGFuIFNSQU0uCisJCQkJCSAgICovCisJQUhDX0JJT1NfRU5BQkxFRCAgICAgID0gMHg4MDAwMCwKKwlBSENfQUxMX0lOVEVSUlVQVFMgICAgPSAweDEwMDAwMCwKKwlBSENfUEFHRVNDQlMJICAgICAgPSAweDQwMDAwMCwgIC8qIEVuYWJsZSBTQ0IgcGFnaW5nICovCisJQUhDX0VER0VfSU5URVJSVVBUICAgID0gMHg4MDAwMDAsICAvKiBEZXZpY2UgdXNlcyBlZGdlIHRyaWdnZXJlZCBpbnRzICovCisJQUhDXzM5QklUX0FERFJFU1NJTkcgID0gMHgxMDAwMDAwLCAvKiBVc2UgMzkgYml0IGFkZHJlc3Npbmcgc2NoZW1lLiAqLworCUFIQ19MU0NCU19FTkFCTEVEICAgICA9IDB4MjAwMDAwMCwgLyogNjRCeXRlIFNDQnMgZW5hYmxlZCAqLworCUFIQ19TQ0JfQ09ORklHX1VTRUQgICA9IDB4NDAwMDAwMCwgLyogTm8gU0VFUFJPTSBidXQgU0NCMiBoYWQgaW5mby4gKi8KKwlBSENfTk9fQklPU19JTklUICAgICAgPSAweDgwMDAwMDAsIC8qIE5vIEJJT1MgbGVmdCBvdmVyIHNldHRpbmdzLiAqLworCUFIQ19ESVNBQkxFX1BDSV9QRVJSICA9IDB4MTAwMDAwMDAsCisJQUhDX0hBU19URVJNX0xPR0lDICAgID0gMHgyMDAwMDAwMAorfSBhaGNfZmxhZzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogSGFyZHdhcmUgIFNDQiBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoZSBkcml2ZXIga2VlcHMgdXAgdG8gTUFYX1NDQiBzY2Igc3RydWN0dXJlcyBwZXIgY2FyZCBpbiBtZW1vcnkuICBUaGUgU0NCCisgKiBjb25zaXN0cyBvZiBhICJoYXJkd2FyZSBTQ0IiIG1pcnJvcmluZyB0aGUgZmllbGRzIGF2YWlsYWJsZSBvbiB0aGUgY2FyZAorICogYW5kIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhlIGtlcm5lbCBzdG9yZXMgZm9yIGVhY2ggdHJhbnNhY3Rpb24uCisgKgorICogVG8gbWluaW1pemUgc3BhY2UgdXRpbGl6YXRpb24sIGEgcG9ydGlvbiBvZiB0aGUgaGFyZHdhcmUgc2NiIHN0b3JlcworICogZGlmZmVyZW50IGRhdGEgZHVyaW5nIGRpZmZlcmVudCBwb3J0aW9ucyBvZiBhIFNDU0kgdHJhbnNhY3Rpb24uCisgKiBBcyBpbml0aWFsaXplZCBieSB0aGUgaG9zdCBkcml2ZXIgZm9yIHRoZSBpbml0aWF0b3Igcm9sZSwgdGhpcyBhcmVhCisgKiBjb250YWlucyB0aGUgU0NTSSBjZGIgKG9yIGEgcG9pbnRlciB0byB0aGUgIGNkYikgdG8gYmUgZXhlY3V0ZWQuICBBZnRlcgorICogdGhlIGNkYiBoYXMgYmVlbiBwcmVzZW50ZWQgdG8gdGhlIHRhcmdldCwgdGhpcyBhcmVhIHNlcnZlcyB0byBzdG9yZQorICogcmVzaWR1YWwgdHJhbnNmZXIgaW5mb3JtYXRpb24gYW5kIHRoZSBTQ1NJIHN0YXR1cyBieXRlLgorICogRm9yIHRoZSB0YXJnZXQgcm9sZSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJlYSBkbyBub3QgY2hhbmdlLCBidXQKKyAqIHN0aWxsIHNlcnZlIGEgZGlmZmVyZW50IHB1cnBvc2UgdGhhbiBmb3IgdGhlIGluaXRpYXRvciByb2xlLiAgU2VlCisgKiBzdHJ1Y3QgdGFyZ2V0X2RhdGEgZm9yIGRldGFpbHMuCisgKi8KKworLyoKKyAqIFN0YXR1cyBpbmZvcm1hdGlvbiBlbWJlZGRlZCBpbiB0aGUgc2hhcmVkIHBvcml0b24gb2YKKyAqIGFuIFNDQiBhZnRlciBwYXNzaW5nIHRoZSBjZGIgdG8gdGhlIHRhcmdldC4gIFRoZSBrZXJuZWwKKyAqIGRyaXZlciB3aWxsIG9ubHkgcmVhZCB0aGlzIGRhdGEgZm9yIHRyYW5zYWN0aW9ucyB0aGF0CisgKiBjb21wbGV0ZSBhYm5vcm1hbGx5IChub24temVybyBzdGF0dXMgYnl0ZSkuCisgKi8KK3N0cnVjdCBzdGF0dXNfcGt0IHsKKwl1aW50MzJfdCByZXNpZHVhbF9kYXRhY250OwkvKiBSZXNpZHVhbCBpbiB0aGUgY3VycmVudCBTL0cgc2VnICovCisJdWludDMyX3QgcmVzaWR1YWxfc2dfcHRyOwkvKiBUaGUgbmV4dCBTL0cgZm9yIHRoaXMgdHJhbnNmZXIgKi8KKwl1aW50OF90CSBzY3NpX3N0YXR1czsJCS8qIFN0YW5kYXJkIFNDU0kgc3RhdHVzIGJ5dGUgKi8KK307CisKKy8qCisgKiBUYXJnZXQgbW9kZSB2ZXJzaW9uIG9mIHRoZSBzaGFyZWQgZGF0YSBTQ0Igc2VnbWVudC4KKyAqLworc3RydWN0IHRhcmdldF9kYXRhIHsKKwl1aW50MzJfdCByZXNpZHVhbF9kYXRhY250OwkvKiBSZXNpZHVhbCBpbiB0aGUgY3VycmVudCBTL0cgc2VnICovCisJdWludDMyX3QgcmVzaWR1YWxfc2dfcHRyOwkvKiBUaGUgbmV4dCBTL0cgZm9yIHRoaXMgdHJhbnNmZXIgKi8KKwl1aW50OF90ICBzY3NpX3N0YXR1czsJCS8qIFNDU0kgc3RhdHVzIHRvIGdpdmUgdG8gaW5pdGlhdG9yICovCisJdWludDhfdCAgdGFyZ2V0X3BoYXNlczsJCS8qIEJpdG1hcCBvZiBwaGFzZXMgdG8gZXhlY3V0ZSAqLworCXVpbnQ4X3QgIGRhdGFfcGhhc2U7CQkvKiBEYXRhLUluIG9yIERhdGEtT3V0ICovCisJdWludDhfdCAgaW5pdGlhdG9yX3RhZzsJCS8qIEluaXRpYXRvcidzIHRyYW5zYWN0aW9uIHRhZyAqLworfTsKKworc3RydWN0IGhhcmR3YXJlX3NjYiB7CisvKjAqLwl1bmlvbiB7CisJCS8qCisJCSAqIElmIHRoZSBjZGIgaXMgMTIgYnl0ZXMgb3IgbGVzcywgd2UgZW1iZWQgaXQgZGlyZWN0bHkKKwkJICogaW4gdGhlIFNDQi4gIEZvciBsb25nZXIgY2Ricywgd2UgZW1iZWQgdGhlIGFkZHJlc3MKKwkJICogb2YgdGhlIGNkYiBwYXlsb2FkIGFzIHNlZW4gYnkgdGhlIGNoaXAgYW5kIGEgRE1BCisJCSAqIGlzIHVzZWQgdG8gcHVsbCBpdCBpbi4KKwkJICovCisJCXVpbnQ4X3QJIGNkYlsxMl07CisJCXVpbnQzMl90IGNkYl9wdHI7CisJCXN0cnVjdAkgc3RhdHVzX3BrdCBzdGF0dXM7CisJCXN0cnVjdAkgdGFyZ2V0X2RhdGEgdGRhdGE7CisJfSBzaGFyZWRfZGF0YTsKKy8qCisgKiBBIHdvcmQgYWJvdXQgcmVzaWR1YWxzLgorICogVGhlIHNjYiBpcyBwcmVzZW50ZWQgdG8gdGhlIHNlcXVlbmNlciB3aXRoIHRoZSBkYXRhcHRyIGFuZCBkYXRhY250CisgKiBmaWVsZHMgaW5pdGlhbGl6ZWQgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBmaXJzdCBTL0cgZWxlbWVudCB0bworICogdHJhbnNmZXIuICBUaGUgc2dwdHIgZmllbGQgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIGJ1cyBhZGRyZXNzIGZvcgorICogdGhlIFMvRyBlbGVtZW50IHRoYXQgZm9sbG93cyB0aGUgZmlyc3QgaW4gdGhlIGluIGNvcmUgUy9HIGFycmF5CisgKiBvcidlZCB3aXRoIHRoZSBTR19GVUxMX1JFU0lEIGZsYWcuICBTZ3B0ciBtYXkgcG9pbnQgdG8gYW4gaW52YWxpZAorICogUy9HIGVudHJ5IGZvciB0aGlzIHRyYW5zZmVyIChzaW5nbGUgUy9HIGVsZW1lbnQgdHJhbnNmZXIgd2l0aCB0aGUKKyAqIGZpcnN0IGVsZW1lbnRzIGFkZHJlc3MgYW5kIGxlbmd0aCBwcmVsb2FkZWQgaW4gdGhlIGRhdGFwdHIvZGF0YWNudAorICogZmllbGRzKS4gIElmIG5vIHRyYW5zZmVyIGlzIHRvIG9jY3VyLCBzZ3B0ciBpcyBzZXQgdG8gU0dfTElTVF9OVUxMLgorICogVGhlIFNHX0ZVTExfUkVTSUQgZmxhZyBlbnN1cmVzIHRoYXQgdGhlIHJlc2lkdWFsIHdpbGwgYmUgY29ycmVjdGx5CisgKiBub3RlZCBldmVuIGlmIG5vIGRhdGEgdHJhbnNmZXJzIG9jY3VyLiAgT25jZSB0aGUgZGF0YSBwaGFzZSBpcyBlbnRlcmVkLAorICogdGhlIHJlc2lkdWFsIHNncHRyIGFuZCBkYXRhY250IGFyZSBsb2FkZWQgZnJvbSB0aGUgc2dwdHIgYW5kIHRoZQorICogZGF0YWNudCBmaWVsZHMuICBBZnRlciBlYWNoIFMvRyBlbGVtZW50J3MgZGF0YXB0ciBhbmQgbGVuZ3RoIGFyZQorICogbG9hZGVkIGludG8gdGhlIGhhcmR3YXJlLCB0aGUgcmVzaWR1YWwgc2dwdHIgaXMgYWR2YW5jZWQuICBBZnRlcgorICogZWFjaCBTL0cgZWxlbWVudCBpcyBleHBpcmVkLCBpdHMgZGF0YWNudCBmaWVsZCBpcyBjaGVja2VkIHRvIHNlZQorICogaWYgdGhlIExBU1RfU0VHIGZsYWcgaXMgc2V0LiAgSWYgc28sIFNHX0xJU1RfTlVMTCBpcyBzZXQgaW4gdGhlCisgKiByZXNpZHVhbCBzZyBwdHIgYW5kIHRoZSB0cmFuc2ZlciBpcyBjb25zaWRlcmVkIGNvbXBsZXRlLiAgSWYgdGhlCisgKiBzZXF1ZW5jZXIgZGV0ZXJtaW5lcyB0aGF0IHRoZXJlIGlzIGEgcmVzaWR1YWwgaW4gdGhlIHRyYW5mZXIsIGl0CisgKiB3aWxsIHNldCB0aGUgU0dfUkVTSURfVkFMSUQgZmxhZyBpbiBzZ3B0ciBhbmQgZG1hIHRoZSBzY2IgYmFjayBpbnRvCisgKiBob3N0IG1lbW9yeS4gIFRvIHN1bWFyaXplOgorICoKKyAqIFNlcXVlbmNlcjoKKyAqCW8gQSByZXNpZHVhbCBoYXMgb2NjdXJyZWQgaWYgU0dfRlVMTF9SRVNJRCBpcyBzZXQgaW4gc2dwdHIsCisgKgkgIG9yIHJlc2lkdWFsX3NncHRyIGRvZXMgbm90IGhhdmUgU0dfTElTVF9OVUxMIHNldC4KKyAqCisgKglvIFdlIGFyZSB0cmFuc2ZlcmluZyB0aGUgbGFzdCBzZWdtZW50IGlmIHJlc2lkdWFsX2RhdGFjbnQgaGFzCisgKgkgIHRoZSBTR19MQVNUX1NFRyBmbGFnIHNldC4KKyAqCisgKiBIb3N0OgorICoJbyBBIHJlc2lkdWFsIGhhcyBvY2N1cnJlZCBpZiBhIGNvbXBsZXRlZCBzY2IgaGFzIHRoZQorICoJICBTR19SRVNJRF9WQUxJRCBmbGFnIHNldC4KKyAqCisgKglvIHJlc2lkdWFsX3NncHRyIGFuZCBzZ3B0ciByZWZlciB0byB0aGUgIm5leHQiIHNnIGVudHJ5CisgKgkgIGFuZCBzbyBtYXkgcG9pbnQgYmV5b25kIHRoZSBsYXN0IHZhbGlkIHNnIGVudHJ5IGZvciB0aGUKKyAqCSAgdHJhbnNmZXIuCisgKi8gCisvKjEyKi8JdWludDMyX3QgZGF0YXB0cjsKKy8qMTYqLwl1aW50MzJfdCBkYXRhY250OwkJLyoKKwkJCQkJICogQnl0ZSAzIChudW1iZXJlZCBmcm9tIDApIG9mCisJCQkJCSAqIHRoZSBkYXRhY250IGlzIHJlYWxseSB0aGUKKwkJCQkJICogNHRoIGJ5dGUgaW4gdGhhdCBkYXRhIGFkZHJlc3MuCisJCQkJCSAqLworLyoyMCovCXVpbnQzMl90IHNncHRyOworI2RlZmluZSBTR19QVFJfTUFTSwkweEZGRkZGRkY4CisvKjI0Ki8JdWludDhfdCAgY29udHJvbDsJLyogU2VlIFNDQl9DT05UUk9MIGluIGFpYzd4eHgucmVnIGZvciBkZXRhaWxzICovCisvKjI1Ki8JdWludDhfdCAgc2NzaWlkOwkvKiB3aGF0IHRvIGxvYWQgaW4gdGhlIFNDU0lJRCByZWdpc3RlciAqLworLyoyNiovCXVpbnQ4X3QgIGx1bjsKKy8qMjcqLwl1aW50OF90ICB0YWc7CQkJLyoKKwkJCQkJICogSW5kZXggaW50byBvdXIga2VybmVsIFNDQiBhcnJheS4KKwkJCQkJICogQWxzbyB1c2VkIGFzIHRoZSB0YWcgZm9yIHRhZ2dlZCBJL08KKwkJCQkJICovCisvKjI4Ki8JdWludDhfdCAgY2RiX2xlbjsKKy8qMjkqLwl1aW50OF90ICBzY3NpcmF0ZTsJCS8qIFZhbHVlIGZvciBTQ1NJUkFURSByZWdpc3RlciAqLworLyozMCovCXVpbnQ4X3QgIHNjc2lvZmZzZXQ7CQkvKiBWYWx1ZSBmb3IgU0NTSU9GRlNFVCByZWdpc3RlciAqLworLyozMSovCXVpbnQ4X3QgIG5leHQ7CQkJLyoKKwkJCQkJICogVXNlZCBmb3IgdGhyZWFkaW5nIFNDQnMgaW4gdGhlCisJCQkJCSAqICJXYWl0aW5nIGZvciBTZWxlY3Rpb24iIGFuZAorCQkJCQkgKiAiRGlzY29ubmVjdGVkIFNDQiIgbGlzdHMgZG93bgorCQkJCQkgKiBpbiB0aGUgc2VxdWVuY2VyLgorCQkJCQkgKi8KKy8qMzIqLwl1aW50OF90ICBjZGIzMlszMl07CQkvKgorCQkJCQkgKiBDREIgc3RvcmFnZSBmb3IgY2RicyBvZiBzaXplCisJCQkJCSAqIDEzLT4zMi4gIFdlIHN0b3JlIHRoZW0gaGVyZQorCQkJCQkgKiBiZWNhdXNlIGhhcmR3YXJlIHNjYnMgYXJlCisJCQkJCSAqIGFsbG9jYXRlZCBmcm9tIERNQSBzYWZlCisJCQkJCSAqIG1lbW9yeSBzbyB3ZSBhcmUgZ3VhcmFudGVlZAorCQkJCQkgKiB0aGUgY29udHJvbGxlciBjYW4gYWNjZXNzCisJCQkJCSAqIHRoaXMgZGF0YS4KKwkJCQkJICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqIEtlcm5lbCBTQ0IgRGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFNvbWUgZmllbGRzIG9mIHRoZSBTQ0IgYXJlIE9TIGRlcGVuZGVudC4gIEhlcmUgd2UgY29sbGVjdCB0aGUKKyAqIGRlZmluaXRpb25zIGZvciBlbGVtZW50cyB0aGF0IGFsbCBPUyBwbGF0Zm9ybXMgbmVlZCB0byBpbmNsdWRlCisgKiBpbiB0aGVyZSBTQ0IgZGVmaW5pdGlvbi4KKyAqLworCisvKgorICogRGVmaW5pdGlvbiBvZiBhIHNjYXR0ZXIvZ2F0aGVyIGVsZW1lbnQgYXMgdHJhbnNmZXJlZCB0byB0aGUgY29udHJvbGxlci4KKyAqIFRoZSBhaWM3eHh4IGNoaXBzIG9ubHkgc3VwcG9ydCBhIDI0Yml0IGxlbmd0aC4gIFdlIHVzZSB0aGUgdG9wIGJ5dGUgb2YKKyAqIHRoZSBsZW5ndGggdG8gc3RvcmUgYWRkaXRpb25hbCBhZGRyZXNzIGJpdHMgYW5kIGEgZmxhZyB0byBpbmRpY2F0ZQorICogdGhhdCBhIGdpdmVuIHNlZ21lbnQgdGVybWluYXRlcyB0aGUgdHJhbnNmZXIuICBUaGlzIGdpdmVzIHVzIGFuCisgKiBhZGRyZXNzYWJsZSByYW5nZSBvZiA1MTJHQiBvbiBtYWNoaW5lcyB3aXRoIDY0Yml0IFBDSSBvciB3aXRoIGNoaXBzCisgKiB0aGF0IGNhbiBzdXBwb3J0IGR1YWwgYWRkcmVzcyBjeWNsZXMgb24gMzJiaXQgUENJIGJ1c3Nlcy4KKyAqLworc3RydWN0IGFoY19kbWFfc2VnIHsKKwl1aW50MzJfdAlhZGRyOworCXVpbnQzMl90CWxlbjsKKyNkZWZpbmUJQUhDX0RNQV9MQVNUX1NFRwkweDgwMDAwMDAwCisjZGVmaW5lCUFIQ19TR19ISUdIX0FERFJfTUFTSwkweDdGMDAwMDAwCisjZGVmaW5lCUFIQ19TR19MRU5fTUFTSwkJMHgwMEZGRkZGRgorfTsKKworc3RydWN0IHNnX21hcF9ub2RlIHsKKwlidXNfZG1hbWFwX3QJCSBzZ19kbWFtYXA7CisJZG1hX2FkZHJfdAkJIHNnX3BoeXNhZGRyOworCXN0cnVjdCBhaGNfZG1hX3NlZyoJIHNnX3ZhZGRyOworCVNMSVNUX0VOVFJZKHNnX21hcF9ub2RlKSBsaW5rczsKK307CisKKy8qCisgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGlzIFNDQi4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlTQ0JfRlJFRQkJPSAweDAwMDAsCisJU0NCX09USEVSVENMX1RJTUVPVVQJPSAweDAwMDIsLyoKKwkJCQkJICAqIEFub3RoZXIgZGV2aWNlIHdhcyBhY3RpdmUKKwkJCQkJICAqIGR1cmluZyB0aGUgZmlyc3QgdGltZW91dCBmb3IKKwkJCQkJICAqIHRoaXMgU0NCIHNvIHdlIGdhdmUgb3Vyc2VsdmVzCisJCQkJCSAgKiBhbiBhZGRpdGlvbmFsIHRpbWVvdXQgcGVyaW9kCisJCQkJCSAgKiBpbiBjYXNlIGl0IHdhcyBob2dnaW5nIHRoZQorCQkJCQkgICogYnVzLgorCQkJCSAgICAgICAgICAqLworCVNDQl9ERVZJQ0VfUkVTRVQJPSAweDAwMDQsCisJU0NCX1NFTlNFCQk9IDB4MDAwOCwKKwlTQ0JfQ0RCMzJfUFRSCQk9IDB4MDAxMCwKKwlTQ0JfUkVDT1ZFUllfU0NCCT0gMHgwMDIwLAorCVNDQl9BVVRPX05FR09USUFURQk9IDB4MDA0MCwvKiBOZWdvdGlhdGUgdG8gYWNoaWV2ZSBnb2FsLiAqLworCVNDQl9ORUdPVElBVEUJCT0gMHgwMDgwLC8qIE5lZ290aWF0aW9uIGZvcmNlZCBmb3IgY29tbWFuZC4gKi8KKwlTQ0JfQUJPUlQJCT0gMHgwMTAwLAorCVNDQl9VTlRBR0dFRFEJCT0gMHgwMjAwLAorCVNDQl9BQ1RJVkUJCT0gMHgwNDAwLAorCVNDQl9UQVJHRVRfSU1NRURJQVRFCT0gMHgwODAwLAorCVNDQl9UUkFOU01JU1NJT05fRVJST1IJPSAweDEwMDAsLyoKKwkJCQkJICAqIFdlIGRldGVjdGVkIGEgcGFyaXR5IG9yIENSQworCQkJCQkgICogZXJyb3IgdGhhdCBoYXMgZWZmZWN0ZWQgdGhlCisJCQkJCSAgKiBwYXlsb2FkIG9mIHRoZSBjb21tYW5kLiAgVGhpcworCQkJCQkgICogZmxhZyBpcyBjaGVja2VkIHdoZW4gbm9ybWFsCisJCQkJCSAgKiBzdGF0dXMgaXMgcmV0dXJuZWQgdG8gY2F0Y2gKKwkJCQkJICAqIHRoZSBjYXNlIG9mIGEgdGFyZ2V0IG5vdAorCQkJCQkgICogcmVzcG9uZGluZyB0byBvdXIgYXR0ZW1wdAorCQkJCQkgICogdG8gcmVwb3J0IHRoZSBlcnJvci4KKwkJCQkJICAqLworCVNDQl9UQVJHRVRfU0NCCQk9IDB4MjAwMCwKKwlTQ0JfU0lMRU5UCQk9IDB4NDAwMCAvKgorCQkJCQkgICogQmUgcXVpZXQgYWJvdXQgdHJhbnNtaXNzaW9uIHR5cGUKKwkJCQkJICAqIGVycm9ycy4gIFRoZXkgYXJlIGV4cGVjdGVkIGFuZCB3ZQorCQkJCQkgICogZG9uJ3Qgd2FudCB0byB1cHNldCB0aGUgdXNlci4gIFRoaXMKKwkJCQkJICAqIGZsYWcgaXMgdHlwaWNhbGx5IHVzZWQgZHVyaW5nIERWLgorCQkJCQkgICovCit9IHNjYl9mbGFnOworCitzdHJ1Y3Qgc2NiIHsKKwlzdHJ1Y3QJaGFyZHdhcmVfc2NiCSAqaHNjYjsKKwl1bmlvbiB7CisJCVNMSVNUX0VOVFJZKHNjYikgIHNsZTsKKwkJVEFJTFFfRU5UUlkoc2NiKSAgdHFlOworCX0gbGlua3M7CisJTElTVF9FTlRSWShzY2IpCQkgIHBlbmRpbmdfbGlua3M7CisJYWhjX2lvX2N0eF90CQkgIGlvX2N0eDsKKwlzdHJ1Y3QgYWhjX3NvZnRjCSAqYWhjX3NvZnRjOworCXNjYl9mbGFnCQkgIGZsYWdzOworI2lmbmRlZiBfX2xpbnV4X18KKwlidXNfZG1hbWFwX3QJCSAgZG1hbWFwOworI2VuZGlmCisJc3RydWN0IHNjYl9wbGF0Zm9ybV9kYXRhICpwbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzZ19tYXBfbm9kZQkgKnNnX21hcDsKKwlzdHJ1Y3QgYWhjX2RtYV9zZWcgCSAqc2dfbGlzdDsKKwlkbWFfYWRkcl90CQkgIHNnX2xpc3RfcGh5czsKKwl1X2ludAkJCSAgc2dfY291bnQ7LyogSG93IGZ1bGwgYWhjX2RtYV9zZWcgaXMgKi8KK307CisKK3N0cnVjdCBzY2JfZGF0YSB7CisJU0xJU1RfSEVBRCgsIHNjYikgZnJlZV9zY2JzOwkvKgorCQkJCQkgKiBQb29sIG9mIFNDQnMgcmVhZHkgdG8gYmUgYXNzaWduZWQKKwkJCQkJICogY29tbWFuZHMgdG8gZXhlY3V0ZS4KKwkJCQkJICovCisJc3RydWN0CXNjYiAqc2NiaW5kZXhbMjU2XTsJLyoKKwkJCQkJICogTWFwcGluZyBmcm9tIHRhZyB0byBTQ0IuCisJCQkJCSAqIEFzIHRhZyBpZGVudGlmaWVycyBhcmUgYW4KKwkJCQkJICogOGJpdCB2YWx1ZSwgd2UgcHJvdmlkZSBzcGFjZQorCQkJCQkgKiBmb3IgYWxsIHBvc3NpYmxlIHRhZyB2YWx1ZXMuCisJCQkJCSAqIEFueSBsb29rdXBzIHRvIGVudHJpZXMgYXQgb3IKKwkJCQkJICogYWJvdmUgQUhDX1NDQl9NQVhfQUxMT0Mgd2lsbAorCQkJCQkgKiBhbHdheXMgZmFpbC4KKwkJCQkJICovCisJc3RydWN0CWhhcmR3YXJlX3NjYgkqaHNjYnM7CS8qIEFycmF5IG9mIGhhcmR3YXJlIFNDQnMgKi8KKwlzdHJ1Y3QJc2NiICpzY2JhcnJheTsJCS8qIEFycmF5IG9mIGtlcm5lbCBTQ0JzICovCisJc3RydWN0CXNjc2lfc2Vuc2VfZGF0YSAqc2Vuc2U7IC8qIFBlciBTQ0Igc2Vuc2UgZGF0YSAqLworCisJLyoKKwkgKiAiQnVzIiBhZGRyZXNzZXMgb2Ygb3VyIGRhdGEgc3RydWN0dXJlcy4KKwkgKi8KKwlidXNfZG1hX3RhZ190CSBoc2NiX2RtYXQ7CS8qIGRtYXQgZm9yIG91ciBoYXJkd2FyZSBTQ0IgYXJyYXkgKi8KKwlidXNfZG1hbWFwX3QJIGhzY2JfZG1hbWFwOworCWRtYV9hZGRyX3QJIGhzY2JfYnVzYWRkcjsKKwlidXNfZG1hX3RhZ190CSBzZW5zZV9kbWF0OworCWJ1c19kbWFtYXBfdAkgc2Vuc2VfZG1hbWFwOworCWRtYV9hZGRyX3QJIHNlbnNlX2J1c2FkZHI7CisJYnVzX2RtYV90YWdfdAkgc2dfZG1hdDsJLyogZG1hdCBmb3Igb3VyIHNnIHNlZ21lbnRzICovCisJU0xJU1RfSEVBRCgsIHNnX21hcF9ub2RlKSBzZ19tYXBzOworCXVpbnQ4X3QJbnVtc2NiczsKKwl1aW50OF90CW1heGhzY2JzOwkJLyogTnVtYmVyIG9mIFNDQnMgb24gdGhlIGNhcmQgKi8KKwl1aW50OF90CWluaXRfbGV2ZWw7CQkvKgorCQkJCQkgKiBIb3cgZmFyIHdlJ3ZlIGluaXRpYWxpemVkCisJCQkJCSAqIHRoaXMgc3RydWN0dXJlLgorCQkJCQkgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogVGFyZ2V0IE1vZGUgRGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb25uZWN0aW9uIGRlc2NpcHRvciBmb3Igc2VsZWN0LWluIHJlcXVlc3RzIGluIHRhcmdldCBtb2RlLgorICovCitzdHJ1Y3QgdGFyZ2V0X2NtZCB7CisJdWludDhfdCBzY3NpaWQ7CQkvKiBPdXIgSUQgYW5kIHRoZSBpbml0aWF0b3IncyBJRCAqLworCXVpbnQ4X3QgaWRlbnRpZnk7CS8qIElkZW50aWZ5IG1lc3NhZ2UgKi8KKwl1aW50OF90IGJ5dGVzWzIyXTsJLyogCisJCQkJICogQnl0ZXMgY29udGFpbnMgYW55IGFkZGl0aW9uYWwgbWVzc2FnZQorCQkJCSAqIGJ5dGVzIHRlcm1pbmF0ZWQgYnkgMHhGRi4gIFRoZSByZW1haW5kZXIKKwkJCQkgKiBpcyB0aGUgY2RiIHRvIGV4ZWN1dGUuCisJCQkJICovCisJdWludDhfdCBjbWRfdmFsaWQ7CS8qCisJCQkJICogV2hlbiBhIGNvbW1hbmQgaXMgY29tcGxldGUsIHRoZSBmaXJtd2FyZQorCQkJCSAqIHdpbGwgc2V0IGNtZF92YWxpZCB0byBhbGwgYml0cyBzZXQuCisJCQkJICogQWZ0ZXIgdGhlIGhvc3QgaGFzIHNlZW4gdGhlIGNvbW1hbmQsCisJCQkJICogdGhlIGJpdHMgYXJlIGNsZWFyZWQuICBUaGlzIGFsbG93cyB1cworCQkJCSAqIHRvIGp1c3QgcGVlayBhdCBob3N0IG1lbW9yeSB0byBkZXRlcm1pbmUKKwkJCQkgKiBpZiBtb3JlIHdvcmsgaXMgY29tcGxldGUuIGNtZF92YWxpZCBpcyBvbgorCQkJCSAqIGFuIDggYnl0ZSBib3VuZGFyeSB0byBzaW1wbGlmeSBzZXR0aW5nCisJCQkJICogaXQgb24gYWljNzg4MCBoYXJkd2FyZSB3aGljaCBvbmx5IGhhcworCQkJCSAqIGxpbWl0ZWQgZGlyZWN0IGFjY2VzcyB0byB0aGUgRE1BIEZJRk8uCisJCQkJICovCisJdWludDhfdCBwYWRbN107Cit9OworCisvKgorICogTnVtYmVyIG9mIGV2ZW50cyB3ZSBjYW4gYnVmZmVyIHVwIGlmIHdlIHJ1biBvdXQKKyAqIG9mIGltbWVkaWF0ZSBub3RpZnkgY2Nicy4KKyAqLworI2RlZmluZSBBSENfVE1PREVfRVZFTlRfQlVGRkVSX1NJWkUgOAorc3RydWN0IGFoY190bW9kZV9ldmVudCB7CisJdWludDhfdCBpbml0aWF0b3JfaWQ7CisJdWludDhfdCBldmVudF90eXBlOwkvKiBNU0cgdHlwZSBvciBFVkVOVF9UWVBFX0JVU19SRVNFVCAqLworI2RlZmluZQlFVkVOVF9UWVBFX0JVU19SRVNFVCAweEZGCisJdWludDhfdCBldmVudF9hcmc7Cit9OworCisvKgorICogUGVyIGVuYWJsZWQgbHVuIHRhcmdldCBtb2RlIHN0YXRlLgorICogQXMgdGhpcyBzdGF0ZSBpcyBkaXJlY3RseSBpbmZsdWVuY2VkIGJ5IHRoZSBob3N0IE9TJ2VzIHRhcmdldCBtb2RlCisgKiBlbnZpcm9ubWVudCwgd2UgbGV0IHRoZSBPUyBtb2R1bGUgZGVmaW5lIGl0LiAgRm9yd2FyZCBkZWNsYXJlIHRoZQorICogc3RydWN0dXJlIGhlcmUgc28gd2UgY2FuIHN0b3JlIGFycmF5cyBvZiB0aGVtLCBldGMuIGluIE9TIG5ldXRyYWwKKyAqIGRhdGEgc3RydWN0dXJlcy4KKyAqLworI2lmZGVmIEFIQ19UQVJHRVRfTU9ERSAKK3N0cnVjdCBhaGNfdG1vZGVfbHN0YXRlIHsKKwlzdHJ1Y3QgY2FtX3BhdGggKnBhdGg7CisJc3RydWN0IGNjYl9oZHJfc2xpc3QgYWNjZXB0X3Rpb3M7CisJc3RydWN0IGNjYl9oZHJfc2xpc3QgaW1tZWRfbm90aWZpZXM7CisJc3RydWN0IGFoY190bW9kZV9ldmVudCBldmVudF9idWZmZXJbQUhDX1RNT0RFX0VWRU5UX0JVRkZFUl9TSVpFXTsKKwl1aW50OF90IGV2ZW50X3JfaWR4OworCXVpbnQ4X3QgZXZlbnRfd19pZHg7Cit9OworI2Vsc2UKK3N0cnVjdCBhaGNfdG1vZGVfbHN0YXRlOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKiBUcmFuc2ZlciBOZWdvdGlhdGlvbiBEYXRhc3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEFIQ19UUkFOU19DVVIJCTB4MDEJLyogTW9kaWZ5IGN1cnJlbnQgbmVvZ3RpYXRpb24gc3RhdHVzICovCisjZGVmaW5lIEFIQ19UUkFOU19BQ1RJVkUJMHgwMwkvKiBBc3N1bWUgdGhpcyB0YXJnZXQgaXMgb24gdGhlIGJ1cyAqLworI2RlZmluZSBBSENfVFJBTlNfR09BTAkJMHgwNAkvKiBNb2RpZnkgbmVnb3RpYXRpb24gZ29hbCAqLworI2RlZmluZSBBSENfVFJBTlNfVVNFUgkJMHgwOAkvKiBNb2RpZnkgdXNlciBuZWdvdGlhdGlvbiBzZXR0aW5ncyAqLworCisjZGVmaW5lIEFIQ19XSURUSF9VTktOT1dOCTB4RkYKKyNkZWZpbmUgQUhDX1BFUklPRF9VTktOT1dOCTB4RkYKKyNkZWZpbmUgQUhDX09GRlNFVF9VTktOT1dOCTB4RkYKKyNkZWZpbmUgQUhDX1BQUl9PUFRTX1VOS05PV04JMHhGRgorCisvKgorICogVHJhbnNmZXIgTmVnb3RpYXRpb24gSW5mb3JtYXRpb24uCisgKi8KK3N0cnVjdCBhaGNfdHJhbnNpbmZvIHsKKwl1aW50OF90IHByb3RvY29sX3ZlcnNpb247CS8qIFNDU0kgUmV2aXNpb24gbGV2ZWwgKi8KKwl1aW50OF90IHRyYW5zcG9ydF92ZXJzaW9uOwkvKiBTUEkgUmV2aXNpb24gbGV2ZWwgKi8KKwl1aW50OF90IHdpZHRoOwkJCS8qIEJ1cyB3aWR0aCAqLworCXVpbnQ4X3QgcGVyaW9kOwkJCS8qIFN5bmMgcmF0ZSBmYWN0b3IgKi8KKwl1aW50OF90IG9mZnNldDsJCQkvKiBTeW5jIG9mZnNldCAqLworCXVpbnQ4X3QgcHByX29wdGlvbnM7CQkvKiBQYXJhbGxlbCBQcm90b2NvbCBSZXF1ZXN0IG9wdGlvbnMgKi8KK307CisKKy8qCisgKiBQZXItaW5pdGlhdG9yIGN1cnJlbnQsIGdvYWwgYW5kIHVzZXIgdHJhbnNmZXIgbmVnb3RpYXRpb24gaW5mb3JtYXRpb24uICovCitzdHJ1Y3QgYWhjX2luaXRpYXRvcl90aW5mbyB7CisJdWludDhfdCBzY3NpcmF0ZTsJCS8qIENvbXB1dGVkIHZhbHVlIGZvciBTQ1NJUkFURSByZWcgKi8KKwlzdHJ1Y3QgYWhjX3RyYW5zaW5mbyBjdXJyOworCXN0cnVjdCBhaGNfdHJhbnNpbmZvIGdvYWw7CisJc3RydWN0IGFoY190cmFuc2luZm8gdXNlcjsKK307CisKKy8qCisgKiBQZXIgZW5hYmxlZCB0YXJnZXQgSUQgc3RhdGUuCisgKiBQb2ludGVycyB0byBsdW4gdGFyZ2V0IHN0YXRlIGFzIHdlbGwgYXMgc3luYy93aWRlIG5lZ290aWF0aW9uIGluZm9ybWF0aW9uCisgKiBmb3IgZWFjaCBpbml0aWF0b3I8LT50YXJnZXQgbWFwcGluZy4gIEZvciB0aGUgaW5pdGlhdG9yIHJvbGUgd2UgcHJldGVuZAorICogdGhhdCB3ZSBhcmUgdGhlIHRhcmdldCBhbmQgdGhlIHRhcmdldHMgYXJlIHRoZSBpbml0aWF0b3JzIHNpbmNlIHRoZQorICogbmVnb3RpYXRpb24gaXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiByb2xlLgorICovCitzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSB7CisJc3RydWN0IGFoY190bW9kZV9sc3RhdGUqCWVuYWJsZWRfbHVuc1tBSENfTlVNX0xVTlNdOworCXN0cnVjdCBhaGNfaW5pdGlhdG9yX3RpbmZvCXRyYW5zaW5mb1tBSENfTlVNX1RBUkdFVFNdOworCisJLyoKKwkgKiBQZXIgaW5pdGlhdG9yIHN0YXRlIGJpdG1hc2tzLgorCSAqLworCXVpbnQxNl90CSBhdXRvX25lZ290aWF0ZTsvKiBBdXRvIE5lZ290aWF0aW9uIFJlcXVpcmVkICovCisJdWludDE2X3QJIHVsdHJhZW5iOwkvKiBVc2luZyB1bHRyYSBzeW5jIHJhdGUgICovCisJdWludDE2X3QJIGRpc2NlbmFibGU7CS8qIERpc2Nvbm5lY3Rpb24gYWxsb3dlZCAgKi8KKwl1aW50MTZfdAkgdGFnZW5hYmxlOwkvKiBUYWdnZWQgUXVldWluZyBhbGxvd2VkICovCit9OworCisvKgorICogRGF0YSBzdHJ1Y3R1cmUgZm9yIG91ciB0YWJsZSBvZiBhbGxvd2VkIHN5bmNocm9ub3VzIHRyYW5zZmVyIHJhdGVzLgorICovCitzdHJ1Y3QgYWhjX3N5bmNyYXRlIHsKKwl1X2ludCBzeGZyX3UyOwkvKiBWYWx1ZSBvZiB0aGUgU1hGUiBwYXJhbWV0ZXIgZm9yIFVsdHJhMisgQ2hpcHMgKi8KKwl1X2ludCBzeGZyOwkvKiBWYWx1ZSBvZiB0aGUgU1hGUiBwYXJhbWV0ZXIgZm9yIDw9IFVsdHJhIENoaXBzICovCisjZGVmaW5lCQlVTFRSQV9TWEZSIDB4MTAwCS8qIFJhdGUgUmVxdWlyZXMgVWx0cmEgTW9kZSBzZXQgKi8KKyNkZWZpbmUJCVNUX1NYRlIJICAgMHgwMTAJLyogUmF0ZSBTaW5nbGUgVHJhbnNpdGlvbiBPbmx5ICovCisjZGVmaW5lCQlEVF9TWEZSCSAgIDB4MDQwCS8qIFJhdGUgRG91YmxlIFRyYW5zaXRpb24gT25seSAqLworCXVpbnQ4X3QgcGVyaW9kOyAvKiBQZXJpb2QgdG8gc2VuZCB0byBTQ1NJIHRhcmdldCAqLworCWNoYXIgKnJhdGU7Cit9OworCisvKiBTYWZlIGFuZCB2YWxpZCBwZXJpb2QgZm9yIGFzeW5jIG5lZ290aWF0aW9ucy4gKi8KKyNkZWZpbmUJQUhDX0FTWU5DX1hGRVJfUEVSSU9EIDB4NDUKKyNkZWZpbmUJQUhDX1VMVFJBMl9YRkVSX1BFUklPRCAweDBhCisKKy8qCisgKiBJbmRleGVzIGludG8gb3VyIHRhYmxlIG9mIHN5bmNyb25vdXMgdHJhbnNmZXIgcmF0ZXMuCisgKi8KKyNkZWZpbmUgQUhDX1NZTkNSQVRFX0RUCQkwCisjZGVmaW5lIEFIQ19TWU5DUkFURV9VTFRSQTIJMQorI2RlZmluZSBBSENfU1lOQ1JBVEVfVUxUUkEJMworI2RlZmluZSBBSENfU1lOQ1JBVEVfRkFTVAk2CisjZGVmaW5lIEFIQ19TWU5DUkFURV9NQVgJQUhDX1NZTkNSQVRFX0RUCisjZGVmaW5lCUFIQ19TWU5DUkFURV9NSU4JMTMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIExvb2t1cCBUYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBQaGFzZSAtPiBuYW1lIGFuZCBtZXNzYWdlIG91dCByZXNwb25zZQorICogdG8gcGFyaXR5IGVycm9ycyBpbiBlYWNoIHBoYXNlIHRhYmxlLiAKKyAqLworc3RydWN0IGFoY19waGFzZV90YWJsZV9lbnRyeSB7CisgICAgICAgIHVpbnQ4X3QgcGhhc2U7CisgICAgICAgIHVpbnQ4X3QgbWVzZ19vdXQ7IC8qIE1lc3NhZ2UgcmVzcG9uc2UgdG8gcGFyaXR5IGVycm9ycyAqLworCWNoYXIgKnBoYXNlbXNnOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFNlcmlhbCBFRVBST00gRm9ybWF0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IHNlZXByb21fY29uZmlnIHsKKy8qCisgKiBQZXIgU0NTSSBJRCBDb25maWd1cmF0aW9uIEZsYWdzCisgKi8KKwl1aW50MTZfdCBkZXZpY2VfZmxhZ3NbMTZdOwkvKiB3b3JkcyAwLTE1ICovCisjZGVmaW5lCQlDRlhGRVIJCTB4MDAwNwkvKiBzeW5jaHJvbm91cyB0cmFuc2ZlciByYXRlICovCisjZGVmaW5lCQlDRlNZTkNICQkweDAwMDgJLyogZW5hYmxlIHN5bmNocm9ub3VzIHRyYW5zZmVyICovCisjZGVmaW5lCQlDRkRJU0MJCTB4MDAxMAkvKiBlbmFibGUgZGlzY29ubmVjdGlvbiAqLworI2RlZmluZQkJQ0ZXSURFQgkJMHgwMDIwCS8qIHdpZGUgYnVzIGRldmljZSAqLworI2RlZmluZQkJQ0ZTWU5DSElTVUxUUkEJMHgwMDQwCS8qIENGU1lOQ0ggaXMgYW4gdWx0cmEgb2Zmc2V0ICgyOTQwQVUpKi8KKyNkZWZpbmUJCUNGU1lOQ1NJTkdMRQkweDAwODAJLyogU2luZ2xlLVRyYW5zaXRpb24gc2lnbmFsbGluZyAqLworI2RlZmluZQkJQ0ZTVEFSVAkJMHgwMTAwCS8qIHNlbmQgc3RhcnQgdW5pdCBTQ1NJIGNvbW1hbmQgKi8KKyNkZWZpbmUJCUNGSU5DQklPUwkweDAyMDAJLyogaW5jbHVkZSBpbiBCSU9TIHNjYW4gKi8KKyNkZWZpbmUJCUNGUk5GT1VORAkweDA0MDAJLyogcmVwb3J0IGV2ZW4gaWYgbm90IGZvdW5kICovCisjZGVmaW5lCQlDRk1VTFRJTFVOREVWCTB4MDgwMAkvKiBQcm9iZSBtdWx0aXBsZSBsdW5zIGluIEJJT1Mgc2NhbiAqLworI2RlZmluZQkJQ0ZXQkNBQ0hFRU5CCTB4NDAwMAkvKiBFbmFibGUgVy1CZWhpbmQgQ2FjaGUgb24gZGlza3MgKi8KKyNkZWZpbmUJCUNGV0JDQUNIRU5PUAkweGMwMDAJLyogRG9uJ3QgdG91Y2ggVy1CZWhpbmQgQ2FjaGUgKi8KKworLyoKKyAqIEJJT1MgQ29udHJvbCBCaXRzCisgKi8KKwl1aW50MTZfdCBiaW9zX2NvbnRyb2w7CQkvKiB3b3JkIDE2ICovCisjZGVmaW5lCQlDRlNVUFJFTQkweDAwMDEJLyogc3VwcG9ydCBhbGwgcmVtb3ZlYWJsZSBkcml2ZXMgKi8KKyNkZWZpbmUJCUNGU1VQUkVNQgkweDAwMDIJLyogc3VwcG9ydCByZW1vdmVhYmxlIGJvb3QgZHJpdmVzICovCisjZGVmaW5lCQlDRkJJT1NFTgkweDAwMDQJLyogQklPUyBlbmFibGVkICovCisjZGVmaW5lCQlDRkJJT1NfQlVTU0NBTgkweDAwMDgJLyogSGF2ZSB0aGUgQklPUyBTY2FuIHRoZSBCdXMgKi8KKyNkZWZpbmUJCUNGU00yRFJWCTB4MDAxMAkvKiBzdXBwb3J0IG1vcmUgdGhhbiB0d28gZHJpdmVzICovCisjZGVmaW5lCQlDRlNUUFdMRVZFTAkweDAwMTAJLyogVGVybWluYXRpb24gbGV2ZWwgY29udHJvbCAqLworI2RlZmluZQkJQ0YyODRYRVhURU5ECTB4MDAyMAkvKiBleHRlbmRlZCB0cmFuc2xhdGlvbiAoMjg0eCBjYXJkcykgKi8JCisjZGVmaW5lCQlDRkNUUkxfQQkweDAwMjAJLyogQklPUyBkaXNwbGF5cyBDdHJsLUEgbWVzc2FnZSAqLwkKKyNkZWZpbmUJCUNGVEVSTV9NRU5VCTB4MDA0MAkvKiBCSU9TIGRpc3BsYXlzIHRlcm1pbmF0aW9uIG1lbnUgKi8JCisjZGVmaW5lCQlDRkVYVEVORAkweDAwODAJLyogZXh0ZW5kZWQgdHJhbnNsYXRpb24gZW5hYmxlZCAqLworI2RlZmluZQkJQ0ZTQ0FNRU4JMHgwMTAwCS8qIFNDQU0gZW5hYmxlICovCisjZGVmaW5lCQlDRk1TR19MRVZFTAkweDA2MDAJLyogQklPUyBNZXNzYWdlIExldmVsICovCisjZGVmaW5lCQkJQ0ZNU0dfVkVSQk9TRQkweDAwMDAKKyNkZWZpbmUJCQlDRk1TR19TSUxFTlQJMHgwMjAwCisjZGVmaW5lCQkJQ0ZNU0dfRElBRwkweDA0MDAKKyNkZWZpbmUJCUNGQk9PVENECTB4MDgwMCAgLyogU3VwcG9ydCBCb290YWJsZSBDRC1ST00gKi8KKy8qCQlVTlVTRUQJCTB4ZmYwMAkqLworCisvKgorICogSG9zdCBBZGFwdGVyIENvbnRyb2wgQml0cworICovCisJdWludDE2X3QgYWRhcHRlcl9jb250cm9sOwkvKiB3b3JkIDE3ICovCQorI2RlZmluZQkJQ0ZBVVRPVEVSTQkweDAwMDEJLyogUGVyZm9ybSBBdXRvIHRlcm1pbmF0aW9uICovCisjZGVmaW5lCQlDRlVMVFJBRU4JMHgwMDAyCS8qIFVsdHJhIFNDU0kgc3BlZWQgZW5hYmxlICovCisjZGVmaW5lCQlDRjI4NFhTRUxUTyAgICAgMHgwMDAzCS8qIFNlbGVjdGlvbiB0aW1lb3V0ICgyODR4IGNhcmRzKSAqLworI2RlZmluZQkJQ0YyODRYRklGTyAgICAgIDB4MDAwQwkvKiBGSUZPIFRocmVzaG9sZCAoMjg0eCBjYXJkcykgKi8KKyNkZWZpbmUJCUNGU1RFUk0JCTB4MDAwNAkvKiBTQ1NJIGxvdyBieXRlIHRlcm1pbmF0aW9uICovCisjZGVmaW5lCQlDRldTVEVSTQkweDAwMDgJLyogU0NTSSBoaWdoIGJ5dGUgdGVybWluYXRpb24gKi8KKyNkZWZpbmUJCUNGU1BBUklUWQkweDAwMTAJLyogU0NTSSBwYXJpdHkgKi8KKyNkZWZpbmUJCUNGMjg0WFNURVJNICAgICAweDAwMjAJLyogU0NTSSBsb3cgYnl0ZSB0ZXJtICgyODR4IGNhcmRzKSAqLwkKKyNkZWZpbmUJCUNGTVVMVElMVU4JMHgwMDIwCisjZGVmaW5lCQlDRlJFU0VUQgkweDAwNDAJLyogcmVzZXQgU0NTSSBidXMgYXQgYm9vdCAqLworI2RlZmluZQkJQ0ZDTFVTVEVSRU5CCTB4MDA4MAkvKiBDbHVzdGVyIEVuYWJsZSAqLworI2RlZmluZQkJQ0ZCT09UQ0hBTgkweDAzMDAJLyogcHJvYmUgdGhpcyBjaGFubmVsIGZpcnN0ICovCisjZGVmaW5lCQlDRkJPT1RDSEFOU0hJRlQgOAorI2RlZmluZQkJQ0ZTRUFVVE9URVJNCTB4MDQwMAkvKiBVbHRyYTIgUGVyZm9ybSBzZWNvbmRhcnkgQXV0byBUZXJtKi8KKyNkZWZpbmUJCUNGU0VMT1dURVJNCTB4MDgwMAkvKiBVbHRyYTIgc2Vjb25kYXJ5IGxvdyB0ZXJtICovCisjZGVmaW5lCQlDRlNFSElHSFRFUk0JMHgxMDAwCS8qIFVsdHJhMiBzZWNvbmRhcnkgaGlnaCB0ZXJtICovCisjZGVmaW5lCQlDRkVOQUJMRURWCTB4NDAwMAkvKiBQZXJmb3JtIERvbWFpbiBWYWxpZGF0aW9uKi8KKworLyoKKyAqIEJ1cyBSZWxlYXNlIFRpbWUsIEhvc3QgQWRhcHRlciBJRAorICovCisJdWludDE2X3QgYnJ0aW1lX2lkOwkJLyogd29yZCAxOCAqLworI2RlZmluZQkJQ0ZTQ1NJSUQJMHgwMDBmCS8qIGhvc3QgYWRhcHRlciBTQ1NJIElEICovCisvKgkJVU5VU0VECQkweDAwZjAJKi8KKyNkZWZpbmUJCUNGQlJUSU1FCTB4ZmYwMAkvKiBidXMgcmVsZWFzZSB0aW1lICovCisKKy8qCisgKiBNYXhpbXVtIHRhcmdldHMKKyAqLworCXVpbnQxNl90IG1heF90YXJnZXRzOwkJLyogd29yZCAxOSAqLwkKKyNkZWZpbmUJCUNGTUFYVEFSRwkweDAwZmYJLyogbWF4aW11bSB0YXJnZXRzICovCisjZGVmaW5lCQlDRkJPT1RMVU4JMHgwZjAwCS8qIEx1biB0byBib290IGZyb20gKi8KKyNkZWZpbmUJCUNGQk9PVElECTB4ZjAwMAkvKiBUYXJnZXQgdG8gYm9vdCBmcm9tICovCisJdWludDE2X3QgcmVzXzFbMTBdOwkJLyogd29yZHMgMjAtMjkgKi8KKwl1aW50MTZfdCBzaWduYXR1cmU7CQkvKiBTaWduYXR1cmUgPT0gMHgyNTAgKi8KKyNkZWZpbmUJCUNGU0lHTkFUVVJFCTB4MjUwCisjZGVmaW5lCQlDRlNJR05BVFVSRTIJMHgzMDAKKwl1aW50MTZfdCBjaGVja3N1bTsJCS8qIHdvcmQgMzEgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNZXNzYWdlIEJ1ZmZlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworCU1TR19UWVBFX05PTkUJCQk9IDB4MDAsCisJTVNHX1RZUEVfSU5JVElBVE9SX01TR09VVAk9IDB4MDEsCisJTVNHX1RZUEVfSU5JVElBVE9SX01TR0lOCT0gMHgwMiwKKwlNU0dfVFlQRV9UQVJHRVRfTVNHT1VUCQk9IDB4MDMsCisJTVNHX1RZUEVfVEFSR0VUX01TR0lOCQk9IDB4MDQKK30gYWhjX21zZ190eXBlOworCit0eXBlZGVmIGVudW0geworCU1TR0xPT1BfSU5fUFJPRywKKwlNU0dMT09QX01TR0NPTVBMRVRFLAorCU1TR0xPT1BfVEVSTUlOQVRFRAorfSBtc2dfbG9vcF9zdGF0OworCisvKioqKioqKioqKioqKioqKioqKioqKiogU29mdHdhcmUgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgKioqKioqKioqKioqKioqKioqKioqLworVEFJTFFfSEVBRChzY2JfdGFpbHEsIHNjYik7CisKK3N0cnVjdCBhaGNfYWljNzc3MF9zb2Z0YyB7CisJLyoKKwkgKiBTYXZlZCByZWdpc3RlciBzdGF0ZSB1c2VkIGZvciBjaGlwX2luaXQoKS4KKwkgKi8KKwl1aW50OF90IGJ1c3NwZDsKKwl1aW50OF90IGJ1c3RpbWU7Cit9OworCitzdHJ1Y3QgYWhjX3BjaV9zb2Z0YyB7CisJLyoKKwkgKiBTYXZlZCByZWdpc3RlciBzdGF0ZSB1c2VkIGZvciBjaGlwX2luaXQoKS4KKwkgKi8KKwl1aW50MzJfdCAgZGV2Y29uZmlnOworCXVpbnQxNl90ICB0YXJnY3JjY250OworCXVpbnQ4X3QgICBjb21tYW5kOworCXVpbnQ4X3QgICBjc2l6ZV9sYXR0aW1lOworCXVpbnQ4X3QgICBvcHRpb25tb2RlOworCXVpbnQ4X3QgICBjcmNjb250cm9sMTsKKwl1aW50OF90ICAgZHNjb21tYW5kMDsKKwl1aW50OF90ICAgZHNwY2lzdGF0dXM7CisJdWludDhfdCAgIHNjYmJhZGRyOworCXVpbnQ4X3QgICBkZmZfdGhyc2g7Cit9OworCit1bmlvbiBhaGNfYnVzX3NvZnRjIHsKKwlzdHJ1Y3QgYWhjX2FpYzc3NzBfc29mdGMgYWljNzc3MF9zb2Z0YzsKKwlzdHJ1Y3QgYWhjX3BjaV9zb2Z0YyBwY2lfc29mdGM7Cit9OworCit0eXBlZGVmIHZvaWQgKCphaGNfYnVzX2ludHJfdCkoc3RydWN0IGFoY19zb2Z0YyAqKTsKK3R5cGVkZWYgaW50ICgqYWhjX2J1c19jaGlwX2luaXRfdCkoc3RydWN0IGFoY19zb2Z0YyAqKTsKK3R5cGVkZWYgaW50ICgqYWhjX2J1c19zdXNwZW5kX3QpKHN0cnVjdCBhaGNfc29mdGMgKik7Cit0eXBlZGVmIGludCAoKmFoY19idXNfcmVzdW1lX3QpKHN0cnVjdCBhaGNfc29mdGMgKik7Cit0eXBlZGVmIHZvaWQgYWhjX2NhbGxiYWNrX3QgKHZvaWQgKik7CisKK3N0cnVjdCBhaGNfc29mdGMgeworCWJ1c19zcGFjZV90YWdfdCAgICAgICAgICAgdGFnOworCWJ1c19zcGFjZV9oYW5kbGVfdCAgICAgICAgYnNoOworI2lmbmRlZiBfX2xpbnV4X18KKwlidXNfZG1hX3RhZ190CQkgIGJ1ZmZlcl9kbWF0OyAgIC8qIGRtYXQgZm9yIGJ1ZmZlciBJL08gKi8KKyNlbmRpZgorCXN0cnVjdCBzY2JfZGF0YQkJICpzY2JfZGF0YTsKKworCXN0cnVjdCBzY2IJCSAqbmV4dF9xdWV1ZWRfc2NiOworCisJLyoKKwkgKiBTQ0JzIHRoYXQgaGF2ZSBiZWVuIHNlbnQgdG8gdGhlIGNvbnRyb2xsZXIKKwkgKi8KKwlMSVNUX0hFQUQoLCBzY2IpCSAgcGVuZGluZ19zY2JzOworCisJLyoKKwkgKiBDb3VudGluZyBsb2NrIGZvciBkZWZlcnJpbmcgdGhlIHJlbGVhc2Ugb2YgYWRkaXRpb25hbAorCSAqIHVudGFnZ2VkIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSB1bnRhZ2dlZF9xdWV1ZXMuICBXaGVuCisJICogdGhlIGxvY2sgaXMgZGVjcmVtZW50ZWQgdG8gMCwgYWxsIHF1ZXVlcyBpbiB0aGUKKwkgKiB1bnRhZ2dlZF9xdWV1ZXMgYXJyYXkgYXJlIHJ1bi4KKwkgKi8KKwl1X2ludAkJCSAgdW50YWdnZWRfcXVldWVfbG9jazsKKworCS8qCisJICogUGVyLXRhcmdldCBxdWV1ZSBvZiB1bnRhZ2dlZC10cmFuc2FjdGlvbnMuICBUaGUKKwkgKiB0cmFuc2FjdGlvbiBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgaXMgdGhlCisJICogY3VycmVudGx5IHBlbmRpbmcgdW50YWdnZWQgdHJhbnNhY3Rpb24gZm9yIHRoZQorCSAqIHRhcmdldC4gIFRoZSBkcml2ZXIgb25seSBhbGxvd3MgYSBzaW5nbGUgdW50YWdnZWQKKwkgKiB0cmFuc2FjdGlvbiBwZXIgdGFyZ2V0LgorCSAqLworCXN0cnVjdCBzY2JfdGFpbHEJICB1bnRhZ2dlZF9xdWV1ZXNbQUhDX05VTV9UQVJHRVRTXTsKKworCS8qCisJICogQnVzIGF0dGFjaG1lbnQgc3BlY2lmaWMgZGF0YS4KKwkgKi8KKwl1bmlvbiBhaGNfYnVzX3NvZnRjCSAgYnVzX3NvZnRjOworCisJLyoKKwkgKiBQbGF0Zm9ybSBzcGVjaWZpYyBkYXRhLgorCSAqLworCXN0cnVjdCBhaGNfcGxhdGZvcm1fZGF0YSAqcGxhdGZvcm1fZGF0YTsKKworCS8qCisJICogUGxhdGZvcm0gc3BlY2lmaWMgZGV2aWNlIGluZm9ybWF0aW9uLgorCSAqLworCWFoY19kZXZfc29mdGNfdAkJICBkZXZfc29mdGM7CisKKwkvKgorCSAqIEJ1cyBzcGVjaWZpYyBkZXZpY2UgaW5mb3JtYXRpb24uCisJICovCisJYWhjX2J1c19pbnRyX3QJCSAgYnVzX2ludHI7CisKKwkvKgorCSAqIEJ1cyBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiByZXF1aXJlZAorCSAqIGFmdGVyIGEgY2hpcCByZXNldC4KKwkgKi8KKwlhaGNfYnVzX2NoaXBfaW5pdF90CSAgYnVzX2NoaXBfaW5pdDsKKworCS8qCisJICogQnVzIHNwZWNpZmljIHN1c3BlbmQgcm91dGluZS4KKwkgKi8KKwlhaGNfYnVzX3N1c3BlbmRfdAkgIGJ1c19zdXNwZW5kOworCisJLyoKKwkgKiBCdXMgc3BlY2lmaWMgcmVzdW1lIHJvdXRpbmUuCisJICovCisJYWhjX2J1c19yZXN1bWVfdAkgIGJ1c19yZXN1bWU7CisKKwkvKgorCSAqIFRhcmdldCBtb2RlIHJlbGF0ZWQgc3RhdGUga2VwdCBvbiBhIHBlciBlbmFibGVkIGx1biBiYXNpcy4KKwkgKiBUYXJnZXRzIHRoYXQgYXJlIG5vdCBlbmFibGVkIHdpbGwgaGF2ZSBudWxsIGVudHJpZXMuCisJICogQXMgYW4gaW5pdGlhdG9yLCB3ZSBrZWVwIG9uZSB0YXJnZXQgZW50cnkgZm9yIG91ciBpbml0aWF0b3IKKwkgKiBJRCB0byBzdG9yZSBvdXIgc3luYy93aWRlIHRyYW5zZmVyIHNldHRpbmdzLgorCSAqLworCXN0cnVjdCBhaGNfdG1vZGVfdHN0YXRlICAqZW5hYmxlZF90YXJnZXRzW0FIQ19OVU1fVEFSR0VUU107CisKKwkvKgorCSAqIFRoZSBibGFjayBob2xlIGRldmljZSByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgcmVxdWVzdHMgZm9yCisJICogZGlzYWJsZWQgbHVucyBvbiBlbmFibGVkIHRhcmdldHMuCisJICovCisJc3RydWN0IGFoY190bW9kZV9sc3RhdGUgICpibGFja19ob2xlOworCisJLyoKKwkgKiBEZXZpY2UgaW5zdGFuY2UgY3VycmVudGx5IG9uIHRoZSBidXMgYXdhaXRpbmcgYSBjb250aW51ZSBUSU8KKwkgKiBmb3IgYSBjb21tYW5kIHRoYXQgd2FzIG5vdCBnaXZlbiB0aGUgZGlzY29ubmVjdCBwcml2ZWxlZGdlLgorCSAqLworCXN0cnVjdCBhaGNfdG1vZGVfbHN0YXRlICAqcGVuZGluZ19kZXZpY2U7CisKKwkvKgorCSAqIENhcmQgY2hhcmFjdGVyaXN0aWNzCisJICovCisJYWhjX2NoaXAJCSAgY2hpcDsKKwlhaGNfZmVhdHVyZQkJICBmZWF0dXJlczsKKwlhaGNfYnVnCQkJICBidWdzOworCWFoY19mbGFnCQkgIGZsYWdzOworCXN0cnVjdCBzZWVwcm9tX2NvbmZpZwkgKnNlZXBfY29uZmlnOworCisJLyogVmFsdWVzIHRvIHN0b3JlIGluIHRoZSBTRVFDVEwgcmVnaXN0ZXIgZm9yIHBhdXNlIGFuZCB1bnBhdXNlICovCisJdWludDhfdAkJCSAgdW5wYXVzZTsKKwl1aW50OF90CQkJICBwYXVzZTsKKworCS8qIENvbW1hbmQgUXVldWVzICovCisJdWludDhfdAkJCSAgcW91dGZpZm9uZXh0OworCXVpbnQ4X3QJCQkgIHFpbmZpZm9uZXh0OworCXVpbnQ4X3QJCQkgKnFvdXRmaWZvOworCXVpbnQ4X3QJCQkgKnFpbmZpZm87CisKKwkvKiBDcml0aWNhbCBTZWN0aW9uIERhdGEgKi8KKwlzdHJ1Y3QgY3MJCSAqY3JpdGljYWxfc2VjdGlvbnM7CisJdV9pbnQJCQkgIG51bV9jcml0aWNhbF9zZWN0aW9uczsKKworCS8qIExpbmtzIGZvciBjaGFpbmluZyBzb2Z0Y3MgKi8KKwlUQUlMUV9FTlRSWShhaGNfc29mdGMpCSAgbGlua3M7CisKKwkvKiBDaGFubmVsIE5hbWVzICgnQScsICdCJywgZXRjLikgKi8KKwljaGFyCQkJICBjaGFubmVsOworCWNoYXIJCQkgIGNoYW5uZWxfYjsKKworCS8qIEluaXRpYXRvciBCdXMgSUQgKi8KKwl1aW50OF90CQkJICBvdXJfaWQ7CisJdWludDhfdAkJCSAgb3VyX2lkX2I7CisKKwkvKgorCSAqIFBDSSBlcnJvciBkZXRlY3Rpb24uCisJICovCisJaW50CQkJICB1bnNvbGljaXRlZF9pbnRzOworCisJLyoKKwkgKiBUYXJnZXQgaW5jb21pbmcgY29tbWFuZCBGSUZPLgorCSAqLworCXN0cnVjdCB0YXJnZXRfY21kCSAqdGFyZ2V0Y21kczsKKwl1aW50OF90CQkJICB0cWluZmlmb25leHQ7CisKKwkvKgorCSAqIENhY2hlZCBjb3B5IG9mIHRoZSBzZXF1ZW5jZXIgY29udHJvbCByZWdpc3Rlci4KKwkgKi8KKwl1aW50OF90CQkJICBzZXFjdGw7CisKKwkvKgorCSAqIEluY29taW5nIGFuZCBvdXRnb2luZyBtZXNzYWdlIGhhbmRsaW5nLgorCSAqLworCXVpbnQ4X3QJCQkgIHNlbmRfbXNnX3BlcnJvcjsKKwlhaGNfbXNnX3R5cGUJCSAgbXNnX3R5cGU7CisJdWludDhfdAkJCSAgbXNnb3V0X2J1ZlsxMl07LyogTWVzc2FnZSB3ZSBhcmUgc2VuZGluZyAqLworCXVpbnQ4X3QJCQkgIG1zZ2luX2J1ZlsxMl07LyogTWVzc2FnZSB3ZSBhcmUgcmVjZWl2aW5nICovCisJdV9pbnQJCQkgIG1zZ291dF9sZW47CS8qIExlbmd0aCBvZiBtZXNzYWdlIHRvIHNlbmQgKi8KKwl1X2ludAkJCSAgbXNnb3V0X2luZGV4OwkvKiBDdXJyZW50IGluZGV4IGluIG1zZ291dCAqLworCXVfaW50CQkJICBtc2dpbl9pbmRleDsJLyogQ3VycmVudCBpbmRleCBpbiBtc2dpbiAqLworCisJLyoKKwkgKiBNYXBwaW5nIGluZm9ybWF0aW9uIGZvciBkYXRhIHN0cnVjdHVyZXMgc2hhcmVkCisJICogYmV0d2VlbiB0aGUgc2VxdWVuY2VyIGFuZCBrZXJuZWwuCisJICovCisJYnVzX2RtYV90YWdfdAkJICBwYXJlbnRfZG1hdDsKKwlidXNfZG1hX3RhZ190CQkgIHNoYXJlZF9kYXRhX2RtYXQ7CisJYnVzX2RtYW1hcF90CQkgIHNoYXJlZF9kYXRhX2RtYW1hcDsKKwlkbWFfYWRkcl90CQkgIHNoYXJlZF9kYXRhX2J1c2FkZHI7CisKKwkvKgorCSAqIEJ1cyBhZGRyZXNzIG9mIHRoZSBvbmUgYnl0ZSBidWZmZXIgdXNlZCB0bworCSAqIHdvcmstYXJvdW5kIGEgRE1BIGJ1ZyBmb3IgY2hpcHMgPD0gYWljNzg4MAorCSAqIGluIHRhcmdldCBtb2RlLgorCSAqLworCWRtYV9hZGRyX3QJCSAgZG1hX2J1Z19idWY7CisKKwkvKiBOdW1iZXIgb2YgZW5hYmxlZCB0YXJnZXQgbW9kZSBkZXZpY2Ugb24gdGhpcyBjYXJkICovCisJdV9pbnQJCQkgIGVuYWJsZWRfbHVuczsKKworCS8qIEluaXRpYWxpemF0aW9uIGxldmVsIG9mIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgKi8KKwl1X2ludAkJCSAgaW5pdF9sZXZlbDsKKworCS8qIFBDSSBjYWNoZWxpbmUgc2l6ZS4gKi8KKwl1X2ludAkJCSAgcGNpX2NhY2hlc2l6ZTsKKworCS8qCisJICogQ291bnQgb2YgcGFyaXR5IGVycm9ycyB3ZSBoYXZlIHNlZW4gYXMgYSB0YXJnZXQuCisJICogV2UgYXV0by1kaXNhYmxlIHBhcml0eSBlcnJvciBjaGVja2luZyBhZnRlciBzZWVpbmcKKwkgKiBBSENfUENJX1RBUkdFVF9QRVJSX1RIUkVTSCBudW1iZXIgb2YgZXJyb3JzLgorCSAqLworCXVfaW50CQkJICBwY2lfdGFyZ2V0X3BlcnJfY291bnQ7CisjZGVmaW5lCQlBSENfUENJX1RBUkdFVF9QRVJSX1RIUkVTSAkxMAorCisJLyogTWF4aW11bSBudW1iZXIgb2Ygc2VxdWVuY2VyIGluc3RydWN0aW9ucyBzdXBwb3J0ZWQuICovCisJdV9pbnQJCQkgIGluc3RydWN0aW9uX3JhbV9zaXplOworCisJLyogUGVyLVVuaXQgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gKi8KKwljb25zdCBjaGFyCQkgKmRlc2NyaXB0aW9uOworCWNoYXIJCQkgKm5hbWU7CisJaW50CQkJICB1bml0OworCisJLyogU2VsZWN0aW9uIFRpbWVyIHNldHRpbmdzICovCisJaW50CQkJICBzZWx0aW1lOworCWludAkJCSAgc2VsdGltZV9iOworCisJdWludDE2X3QJIAkgIHVzZXJfZGlzY2VuYWJsZTsvKiBEaXNjb25uZWN0aW9uIGFsbG93ZWQgICovCisJdWludDE2X3QJCSAgdXNlcl90YWdlbmFibGU7LyogVGFnZ2VkIFF1ZXVpbmcgYWxsb3dlZCAqLworfTsKKworVEFJTFFfSEVBRChhaGNfc29mdGNfdGFpbHEsIGFoY19zb2Z0Yyk7CitleHRlcm4gc3RydWN0IGFoY19zb2Z0Y190YWlscSBhaGNfdGFpbHE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogQWN0aXZlIERldmljZSBJbmZvcm1hdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworCVJPTEVfVU5LTk9XTiwKKwlST0xFX0lOSVRJQVRPUiwKKwlST0xFX1RBUkdFVAorfSByb2xlX3Q7CisKK3N0cnVjdCBhaGNfZGV2aW5mbyB7CisJaW50CSBvdXJfc2NzaWlkOworCWludAkgdGFyZ2V0X29mZnNldDsKKwl1aW50MTZfdCB0YXJnZXRfbWFzazsKKwl1X2ludAkgdGFyZ2V0OworCXVfaW50CSBsdW47CisJY2hhcgkgY2hhbm5lbDsKKwlyb2xlX3QJIHJvbGU7CQkvKgorCQkJCSAqIE9ubHkgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0IGlmIG5vdAorCQkJCSAqIGluIHRoZSBidXNmcmVlIHN0YXRlLgorCQkJCSAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQQ0kgU3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgaW50IChhaGNfZGV2aWNlX3NldHVwX3QpKHN0cnVjdCBhaGNfc29mdGMgKik7CisKK3N0cnVjdCBhaGNfcGNpX2lkZW50aXR5IHsKKwl1aW50NjRfdAkJIGZ1bGxfaWQ7CisJdWludDY0X3QJCSBpZF9tYXNrOworCWNoYXIJCQkqbmFtZTsKKwlhaGNfZGV2aWNlX3NldHVwX3QJKnNldHVwOworfTsKK2V4dGVybiBzdHJ1Y3QgYWhjX3BjaV9pZGVudGl0eSBhaGNfcGNpX2lkZW50X3RhYmxlW107CitleHRlcm4gY29uc3QgdV9pbnQgYWhjX251bV9wY2lfZGV2czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZML0VJU0EgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBhaWM3NzcwX2lkZW50aXR5IHsKKwl1aW50MzJfdAkJIGZ1bGxfaWQ7CisJdWludDMyX3QJCSBpZF9tYXNrOworCWNvbnN0IGNoYXIJCSpuYW1lOworCWFoY19kZXZpY2Vfc2V0dXBfdAkqc2V0dXA7Cit9OworZXh0ZXJuIHN0cnVjdCBhaWM3NzcwX2lkZW50aXR5IGFpYzc3NzBfaWRlbnRfdGFibGVbXTsKK2V4dGVybiBjb25zdCBpbnQgYWhjX251bV9haWM3NzcwX2RldnM7CisKKyNkZWZpbmUgQUhDX0VJU0FfU0xPVF9PRkZTRVQJMHhjMDAKKyNkZWZpbmUgQUhDX0VJU0FfSU9TSVpFCQkweDEwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VfaW50CQkJYWhjX2luZGV4X2J1c3lfdGNsKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgdGNsKTsKK3ZvaWQJCQlhaGNfdW5idXN5X3RjbChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHRjbCk7Cit2b2lkCQkJYWhjX2J1c3lfdGNsKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkgICAgIHVfaW50IHRjbCwgdV9pbnQgYnVzeWlkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDSSBGcm9udCBFbmQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGFoY19wY2lfaWRlbnRpdHkJKmFoY19maW5kX3BjaV9kZXZpY2UoYWhjX2Rldl9zb2Z0Y190KTsKK2ludAkJCSBhaGNfcGNpX2NvbmZpZyhzdHJ1Y3QgYWhjX3NvZnRjICosCisJCQkJCXN0cnVjdCBhaGNfcGNpX2lkZW50aXR5ICopOworaW50CQkJIGFoY19wY2lfdGVzdF9yZWdpc3Rlcl9hY2Nlc3Moc3RydWN0IGFoY19zb2Z0YyAqKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBFSVNBL1ZMIEZyb250IEVuZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBhaWM3NzcwX2lkZW50aXR5ICphaWM3NzcwX2ZpbmRfZGV2aWNlKHVpbnQzMl90KTsKK2ludAkJCSBhaWM3NzcwX2NvbmZpZyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCXN0cnVjdCBhaWM3NzcwX2lkZW50aXR5ICosCisJCQkJCXVfaW50IHBvcnQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogU0NCIGFuZCBTQ0IgcXVldWUgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqLworaW50CQlhaGNfcHJvYmVfc2NicyhzdHJ1Y3QgYWhjX3NvZnRjICopOwordm9pZAkJYWhjX3J1bl91bnRhZ2dlZF9xdWV1ZXMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3ZvaWQJCWFoY19ydW5fdW50YWdnZWRfcXVldWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2NiX3RhaWxxICpxdWV1ZSk7Cit2b2lkCQlhaGNfcWluZmlmb19yZXF1ZXVlX3RhaWwoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkgc3RydWN0IHNjYiAqc2NiKTsKK2ludAkJYWhjX21hdGNoX3NjYihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYiwKKwkJCSAgICAgIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwgaW50IGx1biwKKwkJCSAgICAgIHVfaW50IHRhZywgcm9sZV90IHJvbGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXRpYWxpemF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGFoY19zb2Z0YwkqYWhjX2FsbG9jKHZvaWQgKnBsYXRmb3JtX2FyZywgY2hhciAqbmFtZSk7CitpbnQJCQkgYWhjX3NvZnRjX2luaXQoc3RydWN0IGFoY19zb2Z0YyAqKTsKK3ZvaWQJCQkgYWhjX2NvbnRyb2xsZXJfaW5mbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGNoYXIgKmJ1Zik7CitpbnQJCQkgYWhjX2NoaXBfaW5pdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworaW50CQkJIGFoY19pbml0KHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7Cit2b2lkCQkJIGFoY19pbnRyX2VuYWJsZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCBlbmFibGUpOwordm9pZAkJCSBhaGNfcGF1c2VfYW5kX2ZsdXNod29yayhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworaW50CQkJIGFoY19zdXNwZW5kKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7IAoraW50CQkJIGFoY19yZXN1bWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3ZvaWQJCQkgYWhjX3NvZnRjX2luc2VydChzdHJ1Y3QgYWhjX3NvZnRjICopOworc3RydWN0IGFoY19zb2Z0YwkqYWhjX2ZpbmRfc29mdGMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3ZvaWQJCQkgYWhjX3NldF91bml0KHN0cnVjdCBhaGNfc29mdGMgKiwgaW50KTsKK3ZvaWQJCQkgYWhjX3NldF9uYW1lKHN0cnVjdCBhaGNfc29mdGMgKiwgY2hhciAqKTsKK3ZvaWQJCQkgYWhjX2FsbG9jX3NjYnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3ZvaWQJCQkgYWhjX2ZyZWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK2ludAkJCSBhaGNfcmVzZXQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBpbnQgcmVpbml0KTsKK3ZvaWQJCQkgYWhjX3NodXRkb3duKHZvaWQgKmFyZyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogSW50ZXJydXB0IFNlcnZpY2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCQkJYWhjX2NsZWFyX2ludHN0YXQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3ZvaWQJCQlhaGNfcnVuX3FvdXRmaWZvKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCit2b2lkCQkJYWhjX3J1bl90cWluZmlmbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCBwYXVzZWQpOworI2VuZGlmCit2b2lkCQkJYWhjX2hhbmRsZV9icmthZHJpbnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3ZvaWQJCQlhaGNfaGFuZGxlX3NlcWludChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IGludHN0YXQpOwordm9pZAkJCWFoY19oYW5kbGVfc2NzaWludChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgIHVfaW50IGludHN0YXQpOwordm9pZAkJCWFoY19jbGVhcl9jcml0aWNhbF9zZWN0aW9uKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFcnJvciBSZWNvdmVyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworCVNFQVJDSF9DT01QTEVURSwKKwlTRUFSQ0hfQ09VTlQsCisJU0VBUkNIX1JFTU9WRQorfSBhaGNfc2VhcmNoX2FjdGlvbjsKK2ludAkJCWFoY19zZWFyY2hfcWluZmlmbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCB0YXJnZXQsCisJCQkJCSAgIGNoYXIgY2hhbm5lbCwgaW50IGx1biwgdV9pbnQgdGFnLAorCQkJCQkgICByb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzLAorCQkJCQkgICBhaGNfc2VhcmNoX2FjdGlvbiBhY3Rpb24pOworaW50CQkJYWhjX3NlYXJjaF91bnRhZ2dlZF9xdWV1ZXMoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkJICAgYWhjX2lvX2N0eF90IGN0eCwKKwkJCQkJCSAgIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwKKwkJCQkJCSAgIGludCBsdW4sIHVpbnQzMl90IHN0YXR1cywKKwkJCQkJCSAgIGFoY19zZWFyY2hfYWN0aW9uIGFjdGlvbik7CitpbnQJCQlhaGNfc2VhcmNoX2Rpc2NfbGlzdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCB0YXJnZXQsCisJCQkJCSAgICAgY2hhciBjaGFubmVsLCBpbnQgbHVuLCB1X2ludCB0YWcsCisJCQkJCSAgICAgaW50IHN0b3Bfb25fZmlyc3QsIGludCByZW1vdmUsCisJCQkJCSAgICAgaW50IHNhdmVfc3RhdGUpOwordm9pZAkJCWFoY19mcmVlemVfZGV2cShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYik7CitpbnQJCQlhaGNfcmVzZXRfY2hhbm5lbChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGNoYXIgY2hhbm5lbCwKKwkJCQkJICBpbnQgaW5pdGlhdGVfcmVzZXQpOworaW50CQkJYWhjX2Fib3J0X3NjYnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBpbnQgdGFyZ2V0LAorCQkJCSAgICAgICBjaGFyIGNoYW5uZWwsIGludCBsdW4sIHVfaW50IHRhZywKKwkJCQkgICAgICAgcm9sZV90IHJvbGUsIHVpbnQzMl90IHN0YXR1cyk7Cit2b2lkCQkJYWhjX3Jlc3RhcnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3ZvaWQJCQlhaGNfY2FsY19yZXNpZHVhbChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgc3RydWN0IHNjYiAqc2NiKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogVXRpbGl0eSBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgYWhjX3BoYXNlX3RhYmxlX2VudHJ5KgorCQkJYWhjX2xvb2t1cF9waGFzZV9lbnRyeShpbnQgcGhhc2UpOwordm9pZAkJCWFoY19jb21waWxlX2RldmluZm8oc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLAorCQkJCQkgICAgdV9pbnQgb3VyX2lkLCB1X2ludCB0YXJnZXQsCisJCQkJCSAgICB1X2ludCBsdW4sIGNoYXIgY2hhbm5lbCwKKwkJCQkJICAgIHJvbGVfdCByb2xlKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBUcmFuc2ZlciBOZWdvdGlhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgYWhjX3N5bmNyYXRlKglhaGNfZmluZF9zeW5jcmF0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50ICpwZXJpb2QsCisJCQkJCSAgdV9pbnQgKnBwcl9vcHRpb25zLCB1X2ludCBtYXhzeW5jKTsKK3VfaW50CQkJYWhjX2ZpbmRfcGVyaW9kKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJdV9pbnQgc2NzaXJhdGUsIHVfaW50IG1heHN5bmMpOwordm9pZAkJCWFoY192YWxpZGF0ZV9vZmZzZXQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkgICAgc3RydWN0IGFoY19pbml0aWF0b3JfdGluZm8gKnRpbmZvLAorCQkJCQkgICAgc3RydWN0IGFoY19zeW5jcmF0ZSAqc3luY3JhdGUsCisJCQkJCSAgICB1X2ludCAqb2Zmc2V0LCBpbnQgd2lkZSwKKwkJCQkJICAgIHJvbGVfdCByb2xlKTsKK3ZvaWQJCQlhaGNfdmFsaWRhdGVfd2lkdGgoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkgICBzdHJ1Y3QgYWhjX2luaXRpYXRvcl90aW5mbyAqdGluZm8sCisJCQkJCSAgIHVfaW50ICpidXNfd2lkdGgsCisJCQkJCSAgIHJvbGVfdCByb2xlKTsKKy8qCisgKiBOZWdvdGlhdGlvbiB0eXBlcy4gIFRoZXNlIGFyZSB1c2VkIHRvIHF1YWxpZnkgaWYgd2Ugc2hvdWxkIHJlbmVnb3RpYXRlCisgKiBldmVuIGlmIG91ciBnb2FsIGFuZCBjdXJyZW50IHRyYW5zcG9ydCBwYXJhbWV0ZXJzIGFyZSBpZGVudGljYWwuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJQUhDX05FR19UT19HT0FMLAkvKiBSZW5lZ290aWF0ZSBvbmx5IGlmIGdvYWwgYW5kIGN1cnIgZGlmZmVyLiAqLworCUFIQ19ORUdfSUZfTk9OX0FTWU5DLAkvKiBSZW5lZ290aWF0ZSBzbyBsb25nIGFzIGdvYWwgaXMgbm9uLWFzeW5jLiAqLworCUFIQ19ORUdfQUxXQVlTCQkvKiBSZW5lZ290aWF0IGV2ZW4gaWYgZ29hbCBpcyBhc3luYy4gKi8KK30gYWhjX25lZ190eXBlOworaW50CQkJYWhjX3VwZGF0ZV9uZWdfcmVxdWVzdChzdHJ1Y3QgYWhjX3NvZnRjKiwKKwkJCQkJICAgICAgIHN0cnVjdCBhaGNfZGV2aW5mbyosCisJCQkJCSAgICAgICBzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSosCisJCQkJCSAgICAgICBzdHJ1Y3QgYWhjX2luaXRpYXRvcl90aW5mbyosCisJCQkJCSAgICAgICBhaGNfbmVnX3R5cGUpOwordm9pZAkJCWFoY19zZXRfd2lkdGgoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCSAgICAgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkgICAgICB1X2ludCB3aWR0aCwgdV9pbnQgdHlwZSwgaW50IHBhdXNlZCk7Cit2b2lkCQkJYWhjX3NldF9zeW5jcmF0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sCisJCQkJCSBzdHJ1Y3QgYWhjX3N5bmNyYXRlICpzeW5jcmF0ZSwKKwkJCQkJIHVfaW50IHBlcmlvZCwgdV9pbnQgb2Zmc2V0LAorCQkJCQkgdV9pbnQgcHByX29wdGlvbnMsCisJCQkJCSB1X2ludCB0eXBlLCBpbnQgcGF1c2VkKTsKK3R5cGVkZWYgZW51bSB7CisJQUhDX1FVRVVFX05PTkUsCisJQUhDX1FVRVVFX0JBU0lDLAorCUFIQ19RVUVVRV9UQUdHRUQKK30gYWhjX3F1ZXVlX2FsZzsKKwordm9pZAkJCWFoY19zZXRfdGFncyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sCisJCQkJICAgICBhaGNfcXVldWVfYWxnIGFsZyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFRhcmdldCBNb2RlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCit2b2lkCQlhaGNfc2VuZF9sc3RhdGVfZXZlbnRzKHN0cnVjdCBhaGNfc29mdGMgKiwKKwkJCQkgICAgICAgc3RydWN0IGFoY190bW9kZV9sc3RhdGUgKik7Cit2b2lkCQlhaGNfaGFuZGxlX2VuX2x1bihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJICBzdHJ1Y3QgY2FtX3NpbSAqc2ltLCB1bmlvbiBjY2IgKmNjYik7CitjYW1fc3RhdHVzCWFoY19maW5kX3Rtb2RlX2RldnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCSAgICBzdHJ1Y3QgY2FtX3NpbSAqc2ltLCB1bmlvbiBjY2IgKmNjYiwKKwkJCQkgICAgc3RydWN0IGFoY190bW9kZV90c3RhdGUgKip0c3RhdGUsCisJCQkJICAgIHN0cnVjdCBhaGNfdG1vZGVfbHN0YXRlICoqbHN0YXRlLAorCQkJCSAgICBpbnQgbm90Zm91bmRfZmFpbHVyZSk7CisjaWZuZGVmIEFIQ19UTU9ERV9FTkFCTEUKKyNkZWZpbmUgQUhDX1RNT0RFX0VOQUJMRSAwCisjZW5kaWYKKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGVidWcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEFIQ19ERUJVRworZXh0ZXJuIHVpbnQzMl90IGFoY19kZWJ1ZzsKKyNkZWZpbmUJQUhDX1NIT1dfTUlTQwkJMHgwMDAxCisjZGVmaW5lCUFIQ19TSE9XX1NFTlNFCQkweDAwMDIKKyNkZWZpbmUgQUhDX0RVTVBfU0VFUFJPTQkweDAwMDQKKyNkZWZpbmUgQUhDX1NIT1dfVEVSTUNUTAkweDAwMDgKKyNkZWZpbmUgQUhDX1NIT1dfTUVNT1JZCQkweDAwMTAKKyNkZWZpbmUgQUhDX1NIT1dfTUVTU0FHRVMJMHgwMDIwCisjZGVmaW5lCUFIQ19TSE9XX0RWCQkweDAwNDAKKyNkZWZpbmUgQUhDX1NIT1dfU0VMVE8JCTB4MDA4MAorI2RlZmluZSBBSENfU0hPV19RRlVMTAkJMHgwMjAwCisjZGVmaW5lIEFIQ19TSE9XX1FVRVVFCQkweDA0MDAKKyNkZWZpbmUgQUhDX1NIT1dfVFFJTgkJMHgwODAwCisjZGVmaW5lIEFIQ19TSE9XX01BU0tFRF9FUlJPUlMJMHgxMDAwCisjZGVmaW5lIEFIQ19ERUJVR19TRVFVRU5DRVIJMHgyMDAwCisjZW5kaWYKK3ZvaWQJCQlhaGNfcHJpbnRfc2NiKHN0cnVjdCBzY2IgKnNjYik7Cit2b2lkCQkJYWhjX3ByaW50X2RldmluZm8oc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2KTsKK3ZvaWQJCQlhaGNfZHVtcF9jYXJkX3N0YXRlKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitpbnQJCQlhaGNfcHJpbnRfcmVnaXN0ZXIoYWhjX3JlZ19wYXJzZV9lbnRyeV90ICp0YWJsZSwKKwkJCQkJICAgdV9pbnQgbnVtX2VudHJpZXMsCisJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgIHVfaW50IGFkZHJlc3MsCisJCQkJCSAgIHVfaW50IHZhbHVlLAorCQkJCQkgICB1X2ludCAqY3VyX2NvbHVtbiwKKwkJCQkJICAgdV9pbnQgd3JhcF9wb2ludCk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTRUVQUk9NICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQJCWFoY19hY3F1aXJlX3NlZXByb20oc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCSAgICBzdHJ1Y3Qgc2VlcHJvbV9kZXNjcmlwdG9yICpzZCk7Cit2b2lkCQlhaGNfcmVsZWFzZV9zZWVwcm9tKHN0cnVjdCBzZWVwcm9tX2Rlc2NyaXB0b3IgKnNkKTsKKyNlbmRpZiAvKiBfQUlDN1hYWF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5yZWcgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LnJlZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTBlYzcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5yZWcKQEAgLTAsMCArMSwxNTk0IEBACisvKgorICogQWljN3h4eCByZWdpc3RlciBhbmQgc2NyYXRjaCByYW0gZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMDEgSnVzdGluIFQuIEdpYmJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJEZyZWVCU0QkCisgKi8KK1ZFUlNJT04gPSAiJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LnJlZyMzOSAkIgorCisvKgorICogVGhpcyBmaWxlIGlzIHByb2Nlc3NlZCBieSB0aGUgYWljN3h4eF9hc20gdXRpbGl0eSBmb3IgdXNlIGluIGFzc2VtYmxpbmcKKyAqIGZpcm13YXJlIGZvciB0aGUgYWljN3h4eCBmYW1pbHkgb2YgU0NTSSBob3N0IGFkYXB0ZXJzIGFzIHdlbGwgYXMgdG8gZ2VuZXJhdGUKKyAqIGEgQyBoZWFkZXIgZmlsZSBmb3IgdXNlIGluIHRoZSBrZXJuZWwgcG9ydGlvbiBvZiB0aGUgQWljN3h4eCBkcml2ZXIuCisgKgorICogQWxsIHBhZ2UgbnVtYmVycyByZWZlciB0byB0aGUgQWRhcHRlYyBBSUMtNzc3MCBEYXRhIEJvb2sgYXZhaWxhYmxlIGZyb20KKyAqIEFkYXB0ZWMncyBUZWNobmljYWwgRG9jdW1lbnRzIERlcGFydG1lbnQgMS04MDAtOTM0LTI3NjYKKyAqLworCisvKgorICogU0NTSSBTZXF1ZW5jZSBDb250cm9sIChwLiAzLTExKS4KKyAqIEVhY2ggYml0LCB3aGVuIHNldCBzdGFydHMgYSBzcGVjaWZpYyBTQ1NJIHNlcXVlbmNlIG9uIHRoZSBidXMKKyAqLworcmVnaXN0ZXIgU0NTSVNFUSB7CisJYWRkcmVzcwkJCTB4MDAwCisJYWNjZXNzX21vZGUgUlcKKwlmaWVsZAlURU1PREUJCTB4ODAKKwlmaWVsZAlFTlNFTE8JCTB4NDAKKwlmaWVsZAlFTlNFTEkJCTB4MjAKKwlmaWVsZAlFTlJTRUxJCQkweDEwCisJZmllbGQJRU5BVVRPQVROTwkweDA4CisJZmllbGQJRU5BVVRPQVROSQkweDA0CisJZmllbGQJRU5BVVRPQVROUAkweDAyCisJZmllbGQJU0NTSVJTVE8JMHgwMQorfQorCisvKgorICogU0NTSSBUcmFuc2ZlciBDb250cm9sIDAgUmVnaXN0ZXIgKHBwLiAzLTEzKS4KKyAqIENvbnRyb2xzIHRoZSBTQ1NJIG1vZHVsZSBkYXRhIHBhdGguCisgKi8KK3JlZ2lzdGVyIFNYRlJDVEwwIHsKKwlhZGRyZXNzCQkJMHgwMDEKKwlhY2Nlc3NfbW9kZSBSVworCWZpZWxkCURGT04JCTB4ODAKKwlmaWVsZAlERlBFWFAJCTB4NDAKKwlmaWVsZAlGQVNUMjAJCTB4MjAKKwlmaWVsZAlDTFJTVENOVAkweDEwCisJZmllbGQJU1BJT0VOCQkweDA4CisJZmllbGQJU0NBTUVOCQkweDA0CisJZmllbGQJQ0xSQ0hOCQkweDAyCit9CisKKy8qCisgKiBTQ1NJIFRyYW5zZmVyIENvbnRyb2wgMSBSZWdpc3RlciAocHAuIDMtMTQsMTUpLgorICogQ29udHJvbHMgdGhlIFNDU0kgbW9kdWxlIGRhdGEgcGF0aC4KKyAqLworcmVnaXN0ZXIgU1hGUkNUTDEgeworCWFkZHJlc3MJCQkweDAwMgorCWFjY2Vzc19tb2RlIFJXCisJZmllbGQJQklUQlVDS0VUCTB4ODAKKwlmaWVsZAlTV1JBUEVOCQkweDQwCisJZmllbGQJRU5TUENISwkJMHgyMAorCW1hc2sJU1RJTUVTRUwJMHgxOAorCWZpZWxkCUVOU1RJTUVSCTB4MDQKKwlmaWVsZAlBQ1RORUdFTgkweDAyCisJZmllbGQJU1RQV0VOCQkweDAxCS8qIFBvd2VyZWQgVGVybWluYXRpb24gKi8KK30KKworLyoKKyAqIFNDU0kgQ29udHJvbCBTaWduYWwgUmVhZCBSZWdpc3RlciAocC4gMy0xNSkuCisgKiBSZWFkcyB0aGUgYWN0dWFsIHN0YXRlIG9mIHRoZSBTQ1NJIGJ1cyBwaW5zCisgKi8KK3JlZ2lzdGVyIFNDU0lTSUdJIHsKKwlhZGRyZXNzCQkJMHgwMDMKKwlhY2Nlc3NfbW9kZSBSTworCWZpZWxkCUNESQkJMHg4MAorCWZpZWxkCUlPSQkJMHg0MAorCWZpZWxkCU1TR0kJCTB4MjAKKwlmaWVsZAlBVE5JCQkweDEwCisJZmllbGQJU0VMSQkJMHgwOAorCWZpZWxkCUJTWUkJCTB4MDQKKwlmaWVsZAlSRVFJCQkweDAyCisJZmllbGQJQUNLSQkJMHgwMQorLyoKKyAqIFBvc3NpYmxlIHBoYXNlcyBpbiBTQ1NJU0lHSQorICovCisJbWFzawlQSEFTRV9NQVNLCUNESXxJT0l8TVNHSQorCW1hc2sJUF9EQVRBT1VUCTB4MDAKKwltYXNrCVBfREFUQUlOCUlPSQorCW1hc2sJUF9EQVRBT1VUX0RUCVBfREFUQU9VVHxNU0dJCisJbWFzawlQX0RBVEFJTl9EVAlQX0RBVEFJTnxNU0dJCisJbWFzawlQX0NPTU1BTkQJQ0RJCisJbWFzawlQX01FU0dPVVQJQ0RJfE1TR0kKKwltYXNrCVBfU1RBVFVTCUNESXxJT0kKKwltYXNrCVBfTUVTR0lOCUNESXxJT0l8TVNHSQorfQorCisvKgorICogU0NTSSBDb250cm9sIFNpZ25hbCBXcml0ZSBSZWdpc3RlciAocC4gMy0xNikuCisgKiBXcml0aW5nIHRvIHRoaXMgcmVnaXN0ZXIgbW9kaWZpZXMgdGhlIGNvbnRyb2wgc2lnbmFscyBvbiB0aGUgYnVzLiAgT25seQorICogdGhvc2Ugc2lnbmFscyB0aGF0IGFyZSBhbGxvd2VkIGluIHRoZSBjdXJyZW50IG1vZGUgKEluaXRpYXRvci9UYXJnZXQpIGFyZQorICogYXNzZXJ0ZWQuCisgKi8KK3JlZ2lzdGVyIFNDU0lTSUdPIHsKKwlhZGRyZXNzCQkJMHgwMDMKKwlhY2Nlc3NfbW9kZSBXTworCWZpZWxkCUNETwkJMHg4MAorCWZpZWxkCUlPTwkJMHg0MAorCWZpZWxkCU1TR08JCTB4MjAKKwlmaWVsZAlBVE5PCQkweDEwCisJZmllbGQJU0VMTwkJMHgwOAorCWZpZWxkCUJTWU8JCTB4MDQKKwlmaWVsZAlSRVFPCQkweDAyCisJZmllbGQJQUNLTwkJMHgwMQorLyoKKyAqIFBvc3NpYmxlIHBoYXNlcyB0byB3cml0ZSBpbnRvIFNDU0lTSUcwCisgKi8KKwltYXNrCVBIQVNFX01BU0sJQ0RJfElPSXxNU0dJCisJbWFzawlQX0RBVEFPVVQJMHgwMAorCW1hc2sJUF9EQVRBSU4JSU9JCisJbWFzawlQX0NPTU1BTkQJQ0RJCisJbWFzawlQX01FU0dPVVQJQ0RJfE1TR0kKKwltYXNrCVBfU1RBVFVTCUNESXxJT0kKKwltYXNrCVBfTUVTR0lOCUNESXxJT0l8TVNHSQorfQorCisvKiAKKyAqIFNDU0kgUmF0ZSBDb250cm9sIChwLiAzLTE3KS4KKyAqIENvbnRlbnRzIG9mIHRoaXMgcmVnaXN0ZXIgZGV0ZXJtaW5lIHRoZSBTeW5jaHJvbm91cyBTQ1NJIGRhdGEgdHJhbnNmZXIKKyAqIHJhdGUgYW5kIHRoZSBtYXhpbXVtIHN5bmNocm9ub3VzIFJlcS9BY2sgb2Zmc2V0LiAgQW4gb2Zmc2V0IG9mIDAgaW4gdGhlCisgKiBTT0ZTICgzOjApIGJpdHMgZGlzYWJsZXMgc3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlcnMuICBBbnkgb2Zmc2V0IHZhbHVlCisgKiBncmVhdGVyIHRoYW4gMCBlbmFibGVzIHN5bmNocm9ub3VzIHRyYW5zZmVycy4KKyAqLworcmVnaXN0ZXIgU0NTSVJBVEUgeworCWFkZHJlc3MJCQkweDAwNAorCWFjY2Vzc19tb2RlIFJXCisJZmllbGQJV0lERVhGRVIJMHg4MAkJLyogV2lkZSB0cmFuc2ZlciBjb250cm9sICovCisJZmllbGQJRU5BQkxFX0NSQwkweDQwCQkvKiBDUkMgZm9yIEQtUGhhc2VzICovCisJZmllbGQJU0lOR0xFX0VER0UJMHgxMAkJLyogRGlzYWJsZSBEVCBUcmFuc2ZlcnMgKi8KKwltYXNrCVNYRlIJCTB4NzAJCS8qIFN5bmMgdHJhbnNmZXIgcmF0ZSAqLworCW1hc2sJU1hGUl9VTFRSQTIJMHgwZgkJLyogU3luYyB0cmFuc2ZlciByYXRlICovCisJbWFzawlTT0ZTCQkweDBmCQkvKiBTeW5jIG9mZnNldCAqLworfQorCisvKgorICogU0NTSSBJRCAocC4gMy0xOCkuCisgKiBDb250YWlucyB0aGUgSUQgb2YgdGhlIGJvYXJkIGFuZCB0aGUgY3VycmVudCB0YXJnZXQgb24gdGhlCisgKiBzZWxlY3RlZCBjaGFubmVsLgorICovCityZWdpc3RlciBTQ1NJSUQJeworCWFkZHJlc3MJCQkweDAwNQorCWFjY2Vzc19tb2RlIFJXCisJbWFzawlUSUQJCTB4ZjAJCS8qIFRhcmdldCBJRCBtYXNrICovCisJbWFzawlUV0lOX1RJRAkweDcwCisJZmllbGQJVFdJTl9DSE5MQgkweDgwCisJbWFzawlPSUQJCTB4MGYJCS8qIE91ciBJRCBtYXNrICovCisJLyoKKwkgKiBTQ1NJIE1heGltdW0gT2Zmc2V0IChwLiA0LTYxIGFpYzc4OTAvOTEgRGF0YSBCb29rKQorCSAqIFRoZSBhaWM3ODkwLzkxIGFsbG93IGFuIG9mZnNldCBvZiB1cCB0byAxMjcgdHJhbnNmZXJzIGluIGJvdGggd2lkZQorCSAqIGFuZCBuYXJyb3cgbW9kZS4KKwkgKi8KKwlhbGlhcwlTQ1NJT0ZGU0VUCisJbWFzawlTT0ZTX1VMVFJBMgkweDdmCQkvKiBTeW5jIG9mZnNldCBVMiBjaGlwcyAqLworfQorCisvKgorICogU0NTSSBMYXRjaGVkIERhdGEgKHAuIDMtMTkpLgorICogUmVhZC9Xcml0ZSBsYXRjaGVzIHVzZWQgdG8gdHJhbnNmZXIgZGF0YSBvbiB0aGUgU0NTSSBidXMgZHVyaW5nCisgKiBBdXRvbWF0aWMgb3IgTWFudWFsIFBJTyBtb2RlLiAgU0NTSURBVEggY2FuIGJlIHVzZWQgZm9yIHRoZQorICogdXBwZXIgYnl0ZSBvZiBhIDE2Yml0IHdpZGUgYXN5bmNocm9ub3VzZSBkYXRhIHBoYXNlIHRyYW5zZmVyLgorICovCityZWdpc3RlciBTQ1NJREFUTCB7CisJYWRkcmVzcwkJCTB4MDA2CisJYWNjZXNzX21vZGUgUlcKK30KKworcmVnaXN0ZXIgU0NTSURBVEggeworCWFkZHJlc3MJCQkweDAwNworCWFjY2Vzc19tb2RlIFJXCit9CisKKy8qCisgKiBTQ1NJIFRyYW5zZmVyIENvdW50IChwcC4gMy0xOSwyMCkKKyAqIFRoZXNlIHJlZ2lzdGVycyBjb3VudCBkb3duIHRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQKKyAqIGFjcm9zcyB0aGUgU0NTSSBidXMuICBUaGUgY291bnRlciBpcyBkZWNyZW1lbnRlZCBvbmx5IG9uY2UKKyAqIHRoZSBkYXRhIGhhcyBiZWVuIHNhZmVseSB0cmFuc2ZlcnJlZC4gIFNET05FIGluIFNTVEFUMCBpcworICogc2V0IHdoZW4gU1RDTlQgZ29lcyB0byAwCisgKi8gCityZWdpc3RlciBTVENOVCB7CisJYWRkcmVzcwkJCTB4MDA4CisJc2l6ZQkzCisJYWNjZXNzX21vZGUgUlcKK30KKworLyogQUxUX01PREUgcmVnaXN0ZXJzIChVbHRyYTIgYW5kIFVsdHJhMTYwIGNoaXBzKSAqLworcmVnaXN0ZXIgU1hGUkNUTDIgeworCWFkZHJlc3MJCQkweDAxMworCWFjY2Vzc19tb2RlIFJXCisJZmllbGQJQVVUT1JTVERJUwkweDEwCisJZmllbGQJQ01ERE1BRU4JMHgwOAorCW1hc2sJQVNZTkNfU0VUVVAJMHgwNworfQorCisvKiBBTFRfTU9ERSByZWdpc3RlciBvbiBVbHRyYTE2MCBjaGlwcyAqLworcmVnaXN0ZXIgT1BUSU9OTU9ERSB7CisJYWRkcmVzcwkJCTB4MDA4CisJYWNjZXNzX21vZGUgUlcKKwlmaWVsZAlBVVRPUkFURUVOCQkweDgwCisJZmllbGQJQVVUT0FDS0VOCQkweDQwCisJZmllbGQJQVROTUdNTlRFTgkJMHgyMAorCWZpZWxkCUJVU0ZSRUVSRVYJCTB4MTAKKwlmaWVsZAlFWFBQSEFTRURJUwkJMHgwOAorCWZpZWxkCVNDU0lEQVRMX0lNR0VOCQkweDA0CisJZmllbGQJQVVUT19NU0dPVVRfREUJCTB4MDIKKwlmaWVsZAlESVNfTVNHSU5fRFVBTEVER0UJMHgwMQorCW1hc2sJT1BUSU9OTU9ERV9ERUZBVUxUUwlBVVRPX01TR09VVF9ERXxESVNfTVNHSU5fRFVBTEVER0UKK30KKworLyogQUxUX01PREUgcmVnaXN0ZXIgb24gVWx0cmExNjAgY2hpcHMgKi8KK3JlZ2lzdGVyIFRBUkdDUkNDTlQgeworCWFkZHJlc3MJCQkweDAwYQorCXNpemUJMgorCWFjY2Vzc19tb2RlIFJXCit9CisKKy8qCisgKiBDbGVhciBTQ1NJIEludGVycnVwdCAwIChwLiAzLTIwKQorICogV3JpdGluZyBhIDEgdG8gYSBiaXQgY2xlYXJzIHRoZSBhc3NvY2lhdGVkIFNDU0kgSW50ZXJydXB0IGluIFNTVEFUMC4KKyAqLworcmVnaXN0ZXIgQ0xSU0lOVDAgeworCWFkZHJlc3MJCQkweDAwYgorCWFjY2Vzc19tb2RlIFdPCisJZmllbGQJQ0xSU0VMRE8JMHg0MAorCWZpZWxkCUNMUlNFTERJCTB4MjAKKwlmaWVsZAlDTFJTRUxJTkdPCTB4MTAKKwlmaWVsZAlDTFJTV1JBUAkweDA4CisJZmllbGQJQ0xSSU9FUlIJMHgwOAkvKiBVbHRyYTIgT25seSAqLworCWZpZWxkCUNMUlNQSU9SRFkJMHgwMgorfQorCisvKgorICogU0NTSSBTdGF0dXMgMCAocC4gMy0yMSkKKyAqIENvbnRhaW5zIG9uZSBzZXQgb2YgU0NTSSBJbnRlcnJ1cHQgY29kZXMKKyAqIFRoZXNlIGFyZSBtb3N0IGxpa2VseSBvZiBpbnRlcmVzdCB0byB0aGUgc2VxdWVuY2VyCisgKi8KK3JlZ2lzdGVyIFNTVEFUMAl7CisJYWRkcmVzcwkJCTB4MDBiCisJYWNjZXNzX21vZGUgUk8KKwlmaWVsZAlUQVJHRVQJCTB4ODAJLyogQm9hcmQgYWN0aW5nIGFzIHRhcmdldCAqLworCWZpZWxkCVNFTERPCQkweDQwCS8qIFNlbGVjdGlvbiBEb25lICovCisJZmllbGQJU0VMREkJCTB4MjAJLyogQm9hcmQgaGFzIGJlZW4gc2VsZWN0ZWQgKi8KKwlmaWVsZAlTRUxJTkdPCQkweDEwCS8qIFNlbGVjdGlvbiBJbiBQcm9ncmVzcyAqLworCWZpZWxkCVNXUkFQCQkweDA4CS8qIDI0Yml0IGNvdW50ZXIgd3JhcCAqLworCWZpZWxkCUlPRVJSCQkweDA4CS8qIExWRCBUcmFuY2VpdmVyIG1vZGUgY2hhbmdlZCAqLworCWZpZWxkCVNET05FCQkweDA0CS8qIFNUQ05UID0gMHgwMDAwMDAgKi8KKwlmaWVsZAlTUElPUkRZCQkweDAyCS8qIFNDU0kgUElPIFJlYWR5ICovCisJZmllbGQJRE1BRE9ORQkJMHgwMQkvKiBETUEgdHJhbnNmZXIgY29tcGxldGVkICovCit9CisKKy8qCisgKiBDbGVhciBTQ1NJIEludGVycnVwdCAxIChwLiAzLTIzKQorICogV3JpdGluZyBhIDEgdG8gYSBiaXQgY2xlYXJzIHRoZSBhc3NvY2lhdGVkIFNDU0kgSW50ZXJydXB0IGluIFNTVEFUMS4KKyAqLworcmVnaXN0ZXIgQ0xSU0lOVDEgeworCWFkZHJlc3MJCQkweDAwYworCWFjY2Vzc19tb2RlIFdPCisJZmllbGQJQ0xSU0VMVElNRU8JMHg4MAorCWZpZWxkCUNMUkFUTk8JCTB4NDAKKwlmaWVsZAlDTFJTQ1NJUlNUSQkweDIwCisJZmllbGQJQ0xSQlVTRlJFRQkweDA4CisJZmllbGQJQ0xSU0NTSVBFUlIJMHgwNAorCWZpZWxkCUNMUlBIQVNFQ0hHCTB4MDIKKwlmaWVsZAlDTFJSRVFJTklUCTB4MDEKK30KKworLyoKKyAqIFNDU0kgU3RhdHVzIDEgKHAuIDMtMjQpCisgKi8KK3JlZ2lzdGVyIFNTVEFUMQl7CisJYWRkcmVzcwkJCTB4MDBjCisJYWNjZXNzX21vZGUgUk8KKwlmaWVsZAlTRUxUTwkJMHg4MAorCWZpZWxkCUFUTlRBUkcgCTB4NDAKKwlmaWVsZAlTQ1NJUlNUSQkweDIwCisJZmllbGQJUEhBU0VNSVMJMHgxMAorCWZpZWxkCUJVU0ZSRUUJCTB4MDgKKwlmaWVsZAlTQ1NJUEVSUgkweDA0CisJZmllbGQJUEhBU0VDSEcJMHgwMgorCWZpZWxkCVJFUUlOSVQJCTB4MDEKK30KKworLyoKKyAqIFNDU0kgU3RhdHVzIDIgKHBwLiAzLTI1LDI2KQorICovCityZWdpc3RlciBTU1RBVDIgeworCWFkZHJlc3MJCQkweDAwZAorCWFjY2Vzc19tb2RlIFJPCisJZmllbGQJT1ZFUlJVTgkJMHg4MAorCWZpZWxkCVNIVkFMSUQJCTB4NDAJLyogU2hhZGRvdyBMYXllciBub24temVybyAqLworCWZpZWxkCUVYUF9BQ1RJVkUJMHgxMAkvKiBTQ1NJIEV4cGFuZGVyIEFjdGl2ZSAqLworCWZpZWxkCUNSQ1ZBTEVSUgkweDA4CS8qIENSQyBkb2Vzbid0IG1hdGNoIChVMyBvbmx5KSAqLworCWZpZWxkCUNSQ0VOREVSUgkweDA0CS8qIE5vIHRlcm1pbmFsIENSQyBwYWNrZXQgKFUzIG9ubHkpICovCisJZmllbGQJQ1JDUkVRRVJSCTB4MDIJLyogSWxsZWdhbCBDUkMgcGFja2V0IHJlcSAoVTMgb25seSkgKi8KKwlmaWVsZAlEVUFMX0VER0VfRVJSCTB4MDEJLyogSW5jb3JyZWN0IGRhdGEgcGhhc2UgKFUzIG9ubHkpICovCisJbWFzawlTRkNOVAkJMHgxZgorfQorCisvKgorICogU0NTSSBTdGF0dXMgMyAocC4gMy0yNikKKyAqLworcmVnaXN0ZXIgU1NUQVQzIHsKKwlhZGRyZXNzCQkJMHgwMGUKKwlhY2Nlc3NfbW9kZSBSTworCW1hc2sJU0NTSUNOVAkJMHhmMAorCW1hc2sJT0ZGQ05UCQkweDBmCisJbWFzawlVMk9GRkNOVAkweDdmCit9CisKKy8qCisgKiBTQ1NJIElEIGZvciB0aGUgYWljNzg5MC85MSBjaGlwcworICovCityZWdpc3RlciBTQ1NJSURfVUxUUkEyIHsKKwlhZGRyZXNzCQkJMHgwMGYKKwlhY2Nlc3NfbW9kZSBSVworCW1hc2sJVElECQkweGYwCQkvKiBUYXJnZXQgSUQgbWFzayAqLworCW1hc2sJT0lECQkweDBmCQkvKiBPdXIgSUQgbWFzayAqLworfQorCisvKgorICogU0NTSSBJbnRlcnJ1cHQgTW9kZSAxIChwLiAzLTI4KQorICogU2V0dGluZyBhbnkgYml0IHdpbGwgZW5hYmxlIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiBpbiBTSU1PREUwIHRvIGludGVycnVwdCB2aWEgdGhlIElSUSBwaW4uCisgKi8KK3JlZ2lzdGVyIFNJTU9ERTAgeworCWFkZHJlc3MJCQkweDAxMAorCWFjY2Vzc19tb2RlIFJXCisJZmllbGQJRU5TRUxETwkJMHg0MAorCWZpZWxkCUVOU0VMREkJCTB4MjAKKwlmaWVsZAlFTlNFTElOR08JMHgxMAorCWZpZWxkCUVOU1dSQVAJCTB4MDgKKwlmaWVsZAlFTklPRVJSCQkweDA4CS8qIExWRCBUcmFuY2VpdmVyIG1vZGUgY2hhbmdlcyAqLworCWZpZWxkCUVOU0RPTkUJCTB4MDQKKwlmaWVsZAlFTlNQSU9SRFkJMHgwMgorCWZpZWxkCUVORE1BRE9ORQkweDAxCit9CisKKy8qCisgKiBTQ1NJIEludGVycnVwdCBNb2RlIDEgKHBwLiAzLTI4LDI5KQorICogU2V0dGluZyBhbnkgYml0IHdpbGwgZW5hYmxlIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiBpbiBTSU1PREUxIHRvIGludGVycnVwdCB2aWEgdGhlIElSUSBwaW4uCisgKi8KK3JlZ2lzdGVyIFNJTU9ERTEgeworCWFkZHJlc3MJCQkweDAxMQorCWFjY2Vzc19tb2RlIFJXCisJZmllbGQJRU5TRUxUSU1PCTB4ODAKKwlmaWVsZAlFTkFUTlRBUkcJMHg0MAorCWZpZWxkCUVOU0NTSVJTVAkweDIwCisJZmllbGQJRU5QSEFTRU1JUwkweDEwCisJZmllbGQJRU5CVVNGUkVFCTB4MDgKKwlmaWVsZAlFTlNDU0lQRVJSCTB4MDQKKwlmaWVsZAlFTlBIQVNFQ0hHCTB4MDIKKwlmaWVsZAlFTlJFUUlOSVQJMHgwMQorfQorCisvKgorICogU0NTSSBEYXRhIEJ1cyAoSGlnaCkgKHAuIDMtMjkpCisgKiBUaGlzIHJlZ2lzdGVyIHJlYWRzIGRhdGEgb24gdGhlIFNDU0kgRGF0YSBidXMgZGlyZWN0bHkuCisgKi8KK3JlZ2lzdGVyIFNDU0lCVVNMIHsKKwlhZGRyZXNzCQkJMHgwMTIKKwlhY2Nlc3NfbW9kZSBSVworfQorCityZWdpc3RlciBTQ1NJQlVTSCB7CisJYWRkcmVzcwkJCTB4MDEzCisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIFNDU0kvSG9zdCBBZGRyZXNzIChwLiAzLTMwKQorICogVGhlc2UgcmVnaXN0ZXJzIGhvbGQgdGhlIGhvc3QgYWRkcmVzcyBmb3IgdGhlIGJ5dGUgYWJvdXQgdG8gYmUKKyAqIHRyYW5zZmVycmVkIG9uIHRoZSBTQ1NJIGJ1cy4gIFRoZXkgYXJlIGNvdW50ZWQgdXAgaW4gdGhlIHNhbWUKKyAqIG1hbm5lciBhcyBTVENOVCBpcyBjb3VudGVkIGRvd24uICBTSEFERFIgc2hvdWxkIGFsd2F5cyBiZSB1c2VkCisgKiB0byBkZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhc3QgYnl0ZSB0cmFuc2ZlcnJlZCBzaW5jZSBIQUREUgorICogY2FuIGJlIHNrZXdlZCBieSB3cml0ZSBhaGVhZC4KKyAqLworcmVnaXN0ZXIgU0hBRERSIHsKKwlhZGRyZXNzCQkJMHgwMTQKKwlzaXplCTQKKwlhY2Nlc3NfbW9kZSBSTworfQorCisvKgorICogU2VsZWN0aW9uIFRpbWVvdXQgVGltZXIgKHAuIDMtMzApCisgKi8KK3JlZ2lzdGVyIFNFTFRJTUVSIHsKKwlhZGRyZXNzCQkJMHgwMTgKKwlhY2Nlc3NfbW9kZSBSVworCWZpZWxkCVNUQUdFNgkJMHgyMAorCWZpZWxkCVNUQUdFNQkJMHgxMAorCWZpZWxkCVNUQUdFNAkJMHgwOAorCWZpZWxkCVNUQUdFMwkJMHgwNAorCWZpZWxkCVNUQUdFMgkJMHgwMgorCWZpZWxkCVNUQUdFMQkJMHgwMQorCWFsaWFzCVRBUkdJRElOCit9CisKKy8qCisgKiBTZWxlY3Rpb24vUmVzZWxlY3Rpb24gSUQgKHAuIDMtMzEpCisgKiBVcHBlciBmb3VyIGJpdHMgYXJlIHRoZSBkZXZpY2UgaWQuICBUaGUgT05FQklUIGlzIHNldCB3aGVuIHRoZSByZS9zZWxlY3RpbmcKKyAqIGRldmljZSBkaWQgbm90IHNldCBpdHMgb3duIElELgorICovCityZWdpc3RlciBTRUxJRCB7CisJYWRkcmVzcwkJCTB4MDE5CisJYWNjZXNzX21vZGUgUlcKKwltYXNrCVNFTElEX01BU0sJMHhmMAorCWZpZWxkCU9ORUJJVAkJMHgwOAorfQorCityZWdpc3RlciBTQ0FNQ1RMIHsKKwlhZGRyZXNzCQkJMHgwMWEKKwlhY2Nlc3NfbW9kZSBSVworCWZpZWxkCUVOU0NBTVNFTE8JMHg4MAorCWZpZWxkCUNMUlNDQU1TRUxJRAkweDQwCisJZmllbGQJQUxUU1RJTQkJMHgyMAorCWZpZWxkCURGTFRUSUQJCTB4MTAKKwltYXNrCVNDQU1MVkwJCTB4MDMKK30KKworLyoKKyAqIFRhcmdldCBNb2RlIFNlbGVjdGluZyBpbiBJRCBiaXRtYXNrIChhaWM3ODkwLzkxLzk2Lzk3KQorICovCityZWdpc3RlciBUQVJHSUQgeworCWFkZHJlc3MJCQkweDAxYgorCXNpemUJCQkyCisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIFNlcmlhbCBQb3J0IEkvTyBDYWJhYmlsaXR5IHJlZ2lzdGVyIChwLiA0LTk1IGFpYzc4NjAgRGF0YSBCb29rKQorICogSW5kaWNhdGVzIGlmIGV4dGVybmFsIGxvZ2ljIGhhcyBiZWVuIGF0dGFjaGVkIHRvIHRoZSBjaGlwIHRvCisgKiBwZXJmb3JtIHRoZSB0YXNrcyBvZiBhY2Nlc3NpbmcgYSBzZXJpYWwgZWVwcm9tLCB0ZXN0aW5nIHRlcm1pbmF0aW9uCisgKiBzdHJlbmd0aCwgYW5kIHBlcmZvcm1pbmcgY2FibGUgZGV0ZWN0aW9uLiAgT24gdGhlIGFpYzc4NjAsIG1vc3Qgb2YKKyAqIHRoZXNlIGZlYXR1cmVzIGFyZSBoYW5kbGVkIG9uIGNoaXAsIGJ1dCBvbiB0aGUgYWljNzg1NSBhbiBhdHRhY2hlZAorICogYWljMzgwMCBkb2VzIHRoZSBncnVudCB3b3JrLgorICovCityZWdpc3RlciBTUElPQ0FQIHsKKwlhZGRyZXNzCQkJMHgwMWIKKwlhY2Nlc3NfbW9kZSBSVworCWZpZWxkCVNPRlQxCQkweDgwCisJZmllbGQJU09GVDAJCTB4NDAKKwlmaWVsZAlTT0ZUQ01ERU4JMHgyMAkKKwlmaWVsZAlFWFRfQlJEQ1RMCTB4MTAJLyogRXh0ZXJuYWwgQm9hcmQgY29udHJvbCAqLworCWZpZWxkCVNFRVBST00JCTB4MDgJLyogRXh0ZXJuYWwgc2VyaWFsIGVlcHJvbSBsb2dpYyAqLworCWZpZWxkCUVFUFJPTQkJMHgwNAkvKiBXcml0YWJsZSBleHRlcm5hbCBCSU9TIFJPTSAqLworCWZpZWxkCVJPTQkJMHgwMgkvKiBMb2dpYyBmb3IgYWNjZXNzaW5nIGV4dGVybmFsIFJPTSAqLworCWZpZWxkCVNTUElPQ1BTCTB4MDEJLyogVGVybWluYXRpb24gYW5kIGNhYmxlIGRldGVjdGlvbiAqLworfQorCityZWdpc3RlciBCUkRDVEwJeworCWFkZHJlc3MJCQkweDAxZAorCWZpZWxkCUJSRERBVDcJCTB4ODAKKwlmaWVsZAlCUkREQVQ2CQkweDQwCisJZmllbGQJQlJEREFUNQkJMHgyMAorCWZpZWxkCUJSRFNUQgkJMHgxMAorCWZpZWxkCUJSRENTCQkweDA4CisJZmllbGQJQlJEUlcJCTB4MDQKKwlmaWVsZAlCUkRDVEwxCQkweDAyCisJZmllbGQJQlJEQ1RMMAkJMHgwMQorCS8qIDc4OTAgRGVmaW5pdGlvbnMgKi8KKwlmaWVsZAlCUkREQVQ0CQkweDEwCisJZmllbGQJQlJEREFUMwkJMHgwOAorCWZpZWxkCUJSRERBVDIJCTB4MDQKKwlmaWVsZAlCUkRSV19VTFRSQTIJMHgwMgorCWZpZWxkCUJSRFNUQl9VTFRSQTIJMHgwMQorfQorCisvKgorICogU2VyaWFsIEVFUFJPTSBDb250cm9sIChwLiA0LTkyIGluIDc4NzAgRGF0YWJvb2spCisgKiBDb250cm9scyB0aGUgcmVhZGluZyBhbmQgd3JpdGluZyBvZiBhbiBleHRlcm5hbCBzZXJpYWwgMS1iaXQKKyAqIEVFUFJPTSBEZXZpY2UuICBJbiBvcmRlciB0byBhY2Nlc3MgdGhlIHNlcmlhbCBFRVBST00sIHlvdSBtdXN0CisgKiBmaXJzdCBzZXQgdGhlIFNFRU1TIGJpdCB0aGF0IGdlbmVyYXRlcyBhIHJlcXVlc3QgdG8gdGhlIG1lbW9yeQorICogcG9ydCBmb3IgYWNjZXNzIHRvIHRoZSBzZXJpYWwgRUVQUk9NIGRldmljZS4gIFdoZW4gdGhlIG1lbW9yeQorICogcG9ydCBpcyBub3QgYnVzeSBzZXJ2aWNpbmcgYW5vdGhlciByZXF1ZXN0LCBpdCByZWNvbmZpZ3VyZXMKKyAqIHRvIGFsbG93IGFjY2VzcyB0byB0aGUgc2VyaWFsIEVFUFJPTS4gIFdoZW4gdGhpcyBoYXBwZW5zLCBTRUVSRFkKKyAqIGdldHMgc2V0IGhpZ2ggdG8gdmVyaWZ5IHRoYXQgdGhlIG1lbW9yeSBwb3J0IGFjY2VzcyBoYXMgYmVlbgorICogZ3JhbnRlZC4gIAorICoKKyAqIEFmdGVyIHN1Y2Nlc3NmdWwgYXJiaXRyYXRpb24gZm9yIHRoZSBtZW1vcnkgcG9ydCwgdGhlIFNFRUNTIGJpdCBvZiAKKyAqIHRoZSBTRUVDVEwgcmVnaXN0ZXIgaXMgY29ubmVjdGVkIHRvIHRoZSBjaGlwIHNlbGVjdC4gIFRoZSBTRUVDSywgCisgKiBTRUVETywgYW5kIFNFRURJIGFyZSBjb25uZWN0ZWQgdG8gdGhlIGNsb2NrLCBkYXRhIG91dCwgYW5kIGRhdGEgaW4gCisgKiBsaW5lcyByZXNwZWN0aXZlbHkuICBUaGUgU0VFUkRZIGJpdCBvZiBTRUVDVEwgaXMgdXNlZnVsIGluIHRoYXQgaXQgCisgKiBnaXZlcyB1cyBhbiA4MDAgbnNlYyB0aW1lci4gIEFmdGVyIGEgd3JpdGUgdG8gdGhlIFNFRUNUTCByZWdpc3RlciwgCisgKiB0aGUgU0VFUkRZIGdvZXMgaGlnaCA4MDAgbnNlYyBsYXRlci4gIFRoZSBvbmUgZXhjZXB0aW9uIHRvIHRoaXMgaXMgCisgKiB3aGVuIHdlIGZpcnN0IHJlcXVlc3QgYWNjZXNzIHRvIHRoZSBtZW1vcnkgcG9ydC4gIFRoZSBTRUVSRFkgZ29lcyAKKyAqIGhpZ2ggdG8gc2lnbmlmeSB0aGF0IGFjY2VzcyBoYXMgYmVlbiBncmFudGVkIGFuZCwgZm9yIHRoaXMgY2FzZSwgaGFzIAorICogbm8gaW1wbGllZCB0aW1pbmcuCisgKgorICogU2VlIDkzY3g2LmMgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBwcm90b2NvbCBuZWNlc3NhcnkgdG8gCisgKiByZWFkIHRoZSBzZXJpYWwgRUVQUk9NLgorICovCityZWdpc3RlciBTRUVDVEwgeworCWFkZHJlc3MJCQkweDAxZQorCWZpZWxkCUVYVEFSQkFDSwkweDgwCisJZmllbGQJRVhUQVJCUkVRCTB4NDAKKwlmaWVsZAlTRUVNUwkJMHgyMAorCWZpZWxkCVNFRVJEWQkJMHgxMAorCWZpZWxkCVNFRUNTCQkweDA4CisJZmllbGQJU0VFQ0sJCTB4MDQKKwlmaWVsZAlTRUVETwkJMHgwMgorCWZpZWxkCVNFRURJCQkweDAxCit9CisvKgorICogU0NTSSBCbG9jayBDb250cm9sIChwLiAzLTMyKQorICogQ29udHJvbHMgQnVzIHR5cGUgYW5kIGNoYW5uZWwgc2VsZWN0aW9uLiAgSW4gYSB0d2luIGNoYW5uZWwgY29uZmlndXJhdGlvbgorICogYWRkcmVzc2VzIDB4MDAtMHgxZSBhcmUgZ2F0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGNoYW5uZWwgYmFzZWQgb24gdGhpcworICogcmVnaXN0ZXIuICBTRUxXSURFIGFsbG93cyBmb3IgdGhlIGNvZXhpc3RlbmNlIG9mIDhiaXQgYW5kIDE2Yml0IGRldmljZXMKKyAqIG9uIGEgd2lkZSBidXMuCisgKi8KK3JlZ2lzdGVyIFNCTEtDVEwgeworCWFkZHJlc3MJCQkweDAxZgorCWFjY2Vzc19tb2RlIFJXCisJZmllbGQJRElBR0xFREVOCTB4ODAJLyogQWljNzhYMCBvbmx5ICovCisJZmllbGQJRElBR0xFRE9OCTB4NDAJLyogQWljNzhYMCBvbmx5ICovCisJZmllbGQJQVVUT0ZMVVNIRElTCTB4MjAKKwlmaWVsZAlTRUxCVVNCCQkweDA4CisJZmllbGQJRU5BQjQwCQkweDA4CS8qIExWRCB0cmFuc2NlaXZlciBhY3RpdmUgKi8KKwlmaWVsZAlFTkFCMjAJCTB4MDQJLyogU0UvSFZEIHRyYW5zY2VpdmVyIGFjdGl2ZSAqLworCWZpZWxkCVNFTFdJREUJCTB4MDIKKwlmaWVsZAlYQ1ZSCQkweDAxCS8qIEV4dGVybmFsIHRyYW5zY2VpdmVyIGFjdGl2ZSAqLworfQorCisvKgorICogU2VxdWVuY2VyIENvbnRyb2wgKHAuIDMtMzMpCisgKiBFcnJvciBkZXRlY3Rpb24gbW9kZSBhbmQgc3BlZWQgY29uZmlndXJhdGlvbgorICovCityZWdpc3RlciBTRVFDVEwgeworCWFkZHJlc3MJCQkweDA2MAorCWFjY2Vzc19tb2RlIFJXCisJZmllbGQJUEVSUk9SRElTCTB4ODAKKwlmaWVsZAlQQVVTRURJUwkweDQwCisJZmllbGQJRkFJTERJUwkJMHgyMAorCWZpZWxkCUZBU1RNT0RFCTB4MTAKKwlmaWVsZAlCUktBRFJJTlRFTgkweDA4CisJZmllbGQJU1RFUAkJMHgwNAorCWZpZWxkCVNFUVJFU0VUCTB4MDIKKwlmaWVsZAlMT0FEUkFNCQkweDAxCit9CisKKy8qCisgKiBTZXF1ZW5jZXIgUkFNIERhdGEgKHAuIDMtMzQpCisgKiBTaW5nbGUgYnl0ZSB3aW5kb3cgaW50byB0aGUgU2NyYXRjaCBSYW0gYXJlYSBzdGFydGluZyBhdCB0aGUgYWRkcmVzcworICogc3BlY2lmaWVkIGJ5IFNFUUFERFIwIGFuZCBTRVFBRERSMS4gIFRvIHdyaXRlIGEgZnVsbCB3b3JkLCBzaW1wbHkgd3JpdGUKKyAqIGZvdXIgYnl0ZXMgaW4gc3VjY2Vzc2lvbi4gIFRoZSBTRVFBRERScyB3aWxsIGluY3JlbWVudCBhZnRlciB0aGUgbW9zdAorICogc2lnbmlmaWNhbnQgYnl0ZSBpcyB3cml0dGVuCisgKi8KK3JlZ2lzdGVyIFNFUVJBTSB7CisJYWRkcmVzcwkJCTB4MDYxCisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIFNlcXVlbmNlciBBZGRyZXNzIFJlZ2lzdGVycyAocC4gMy0zNSkKKyAqIE9ubHkgdGhlIGZpcnN0IGJpdCBvZiBTRVFBRERSMSBob2xkcyBhZGRyZXNzaW5nIGluZm9ybWF0aW9uCisgKi8KK3JlZ2lzdGVyIFNFUUFERFIwIHsKKwlhZGRyZXNzCQkJMHgwNjIKKwlhY2Nlc3NfbW9kZSBSVworfQorCityZWdpc3RlciBTRVFBRERSMSB7CisJYWRkcmVzcwkJCTB4MDYzCisJYWNjZXNzX21vZGUgUlcKKwltYXNrCVNFUUFERFIxX01BU0sJMHgwMQorfQorCisvKgorICogQWNjdW11bGF0b3IKKyAqIFdlIGNoZWF0IGJ5IHBhc3NpbmcgYXJndW1lbnRzIGluIHRoZSBBY2N1bXVsYXRvciB1cCB0byB0aGUga2VybmVsIGRyaXZlcgorICovCityZWdpc3RlciBBQ0NVTSB7CisJYWRkcmVzcwkJCTB4MDY0CisJYWNjZXNzX21vZGUgUlcKKwlhY2N1bXVsYXRvcgorfQorCityZWdpc3RlciBTSU5ERVgJeworCWFkZHJlc3MJCQkweDA2NQorCWFjY2Vzc19tb2RlIFJXCisJc2luZGV4Cit9CisKK3JlZ2lzdGVyIERJTkRFWCB7CisJYWRkcmVzcwkJCTB4MDY2CisJYWNjZXNzX21vZGUgUlcKK30KKworcmVnaXN0ZXIgQUxMT05FUyB7CisJYWRkcmVzcwkJCTB4MDY5CisJYWNjZXNzX21vZGUgUk8KKwlhbGxvbmVzCit9CisKK3JlZ2lzdGVyIEFMTFpFUk9TIHsKKwlhZGRyZXNzCQkJMHgwNmEKKwlhY2Nlc3NfbW9kZSBSTworCWFsbHplcm9zCit9CisKK3JlZ2lzdGVyIE5PTkUgeworCWFkZHJlc3MJCQkweDA2YQorCWFjY2Vzc19tb2RlIFdPCisJbm9uZQorfQorCityZWdpc3RlciBGTEFHUyB7CisJYWRkcmVzcwkJCTB4MDZiCisJYWNjZXNzX21vZGUgUk8KKwlmaWVsZAlaRVJPCQkweDAyCisJZmllbGQJQ0FSUlkJCTB4MDEKK30KKworcmVnaXN0ZXIgU0lORElSCXsKKwlhZGRyZXNzCQkJMHgwNmMKKwlhY2Nlc3NfbW9kZSBSTworfQorCityZWdpc3RlciBESU5ESVIJIHsKKwlhZGRyZXNzCQkJMHgwNmQKKwlhY2Nlc3NfbW9kZSBXTworfQorCityZWdpc3RlciBGVU5DVElPTjEgeworCWFkZHJlc3MJCQkweDA2ZQorCWFjY2Vzc19tb2RlIFJXCit9CisKK3JlZ2lzdGVyIFNUQUNLIHsKKwlhZGRyZXNzCQkJMHgwNmYKKwlhY2Nlc3NfbW9kZSBSTworfQorCitjb25zdAlTVEFDS19TSVpFCTQKKworLyoKKyAqIEJvYXJkIENvbnRyb2wgKHAuIDMtNDMpCisgKi8KK3JlZ2lzdGVyIEJDVEwgeworCWFkZHJlc3MJCQkweDA4NAorCWFjY2Vzc19tb2RlIFJXCisJZmllbGQJQUNFCQkweDA4CisJZmllbGQJRU5BQkxFCQkweDAxCit9CisKKy8qCisgKiBPbiB0aGUgYWljNzhYMCBjaGlwcywgQm9hcmQgQ29udHJvbCBpcyByZXBsYWNlZCBieSB0aGUgRFNDb21tYW5kCisgKiByZWdpc3RlciAocC4gNC02NCkKKyAqLworcmVnaXN0ZXIgRFNDT01NQU5EMCB7CisJYWRkcmVzcwkJCTB4MDg0CisJYWNjZXNzX21vZGUgUlcKKwlmaWVsZAlDQUNIRVRIRU4JMHg4MAkvKiBDYWNoZSBUaHJlc2hvbGQgZW5hYmxlICovCisJZmllbGQJRFBBUkNLRU4JMHg0MAkvKiBEYXRhIFBhcml0eSBDaGVjayBFbmFibGUgKi8KKwlmaWVsZAlNUEFSQ0tFTgkweDIwCS8qIE1lbW9yeSBQYXJpdHkgQ2hlY2sgRW5hYmxlICovCisJZmllbGQJRVhUUkVRTENLCTB4MTAJLyogRXh0ZXJuYWwgUmVxdWVzdCBMb2NrICovCisJLyogYWljNzg5MC85MS85Ni85NyBvbmx5ICovCisJZmllbGQJSU5UU0NCUkFNU0VMCTB4MDgJLyogSW50ZXJuYWwgU0NCIFJBTSBTZWxlY3QgKi8KKwlmaWVsZAlSQU1QUwkJMHgwNAkvKiBFeHRlcm5hbCBTQ0IgUkFNIFByZXNlbnQgKi8KKwlmaWVsZAlVU0NCU0laRTMyCTB4MDIJLyogVXNlIDMyYnl0ZSBTQ0IgUGFnZSBTaXplICovCisJZmllbGQJQ0lPUEFSQ0tFTgkweDAxCS8qIEludGVybmFsIGJ1cyBwYXJpdHkgZXJyb3IgZW5hYmxlICovCit9CisKK3JlZ2lzdGVyIERTQ09NTUFORDEgeworCWFkZHJlc3MJCQkweDA4NQorCWFjY2Vzc19tb2RlIFJXCisJbWFzawlEU0xBVFQJCTB4ZmMJLyogUENJIGxhdGVuY3kgdGltZXIgKG5vbi11bHRyYTIpICovCisJZmllbGQJSEFERExEU0VMMQkweDAyCS8qIEhvc3QgQWRkcmVzcyBMb2FkIFNlbGVjdCBCaXRzICovCisJZmllbGQJSEFERExEU0VMMAkweDAxCit9CisKKy8qCisgKiBCdXMgT24vT2ZmIFRpbWUgKHAuIDMtNDQpIGFpYzc3NzAgb25seQorICovCityZWdpc3RlciBCVVNUSU1FIHsKKwlhZGRyZXNzCQkJMHgwODUKKwlhY2Nlc3NfbW9kZSBSVworCW1hc2sJQk9GRgkJMHhmMAorCW1hc2sJQk9OCQkweDBmCit9CisKKy8qCisgKiBCdXMgU3BlZWQgKHAuIDMtNDUpIGFpYzc3NzAgb25seQorICovCityZWdpc3RlciBCVVNTUEQgeworCWFkZHJlc3MJCQkweDA4NgorCWFjY2Vzc19tb2RlIFJXCisJbWFzawlERlRIUlNICQkweGMwCisJbWFzawlTVEJPRkYJCTB4MzgKKwltYXNrCVNUQk9OCQkweDA3CisJbWFzawlERlRIUlNIXzEwMAkweGMwCisJbWFzawlERlRIUlNIXzc1CTB4ODAKK30KKworLyogYWljNzg1MC81NS82MC83MC84MC85NSBvbmx5ICovCityZWdpc3RlciBEU1BDSVNUQVRVUyB7CisJYWRkcmVzcwkJCTB4MDg2CisJbWFzawlERlRIUlNIXzEwMAkweGMwCit9CisKKy8qIGFpYzc4OTAvOTEvOTYvOTcgb25seSAqLworcmVnaXN0ZXIgSFNfTUFJTEJPWCB7CisJYWRkcmVzcwkJCTB4MDg2CisJbWFzawlIT1NUX01BSUxCT1gJMHhGMAorCW1hc2sJU0VRX01BSUxCT1gJMHgwRgorCW1hc2sJSE9TVF9UUUlOUE9TCTB4ODAJLyogQm91bmRhcnkgYXQgZWl0aGVyIDAgb3IgMTI4ICovCit9CisKK2NvbnN0CUhPU1RfTUFJTEJPWF9TSElGVAk0Citjb25zdAlTRVFfTUFJTEJPWF9TSElGVAkwCisKKy8qCisgKiBIb3N0IENvbnRyb2wgKHAuIDMtNDcpIFIvVworICogT3ZlcmFsbCBob3N0IGNvbnRyb2wgb2YgdGhlIGRldmljZS4KKyAqLworcmVnaXN0ZXIgSENOVFJMIHsKKwlhZGRyZXNzCQkJMHgwODcKKwlhY2Nlc3NfbW9kZSBSVworCWZpZWxkCVBPV1JETgkJMHg0MAorCWZpZWxkCVNXSU5UCQkweDEwCisJZmllbGQJSVJRTVMJCTB4MDgKKwlmaWVsZAlQQVVTRQkJMHgwNAorCWZpZWxkCUlOVEVOCQkweDAyCisJZmllbGQJQ0hJUFJTVAkJMHgwMQorCWZpZWxkCUNISVBSU1RBQ0sJMHgwMQorfQorCisvKgorICogSG9zdCBBZGRyZXNzIChwLiAzLTQ4KQorICogVGhpcyByZWdpc3RlciBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGUgYnl0ZSBhYm91dAorICogdG8gYmUgdHJhbnNmZXJyZWQgYWNyb3NzIHRoZSBob3N0IGJ1cy4KKyAqLworcmVnaXN0ZXIgSEFERFIgeworCWFkZHJlc3MJCQkweDA4OAorCXNpemUJNAorCWFjY2Vzc19tb2RlIFJXCit9CisKK3JlZ2lzdGVyIEhDTlQgeworCWFkZHJlc3MJCQkweDA4YworCXNpemUJMworCWFjY2Vzc19tb2RlIFJXCit9CisKKy8qCisgKiBTQ0IgUG9pbnRlciAocC4gMy00OSkKKyAqIEdhdGUgb25lIG9mIHRoZSBTQ0JzIGludG8gdGhlIFNDQkFSUkFZIHdpbmRvdy4KKyAqLworcmVnaXN0ZXIgU0NCUFRSIHsKKwlhZGRyZXNzCQkJMHgwOTAKKwlhY2Nlc3NfbW9kZSBSVworfQorCisvKgorICogSW50ZXJydXB0IFN0YXR1cyAocC4gMy01MCkKKyAqIFN0YXR1cyBmb3Igc3lzdGVtIGludGVycnVwdHMKKyAqLworcmVnaXN0ZXIgSU5UU1RBVCB7CisJYWRkcmVzcwkJCTB4MDkxCisJYWNjZXNzX21vZGUgUlcKKwlmaWVsZAlCUktBRFJJTlQgMHgwOAorCWZpZWxkCVNDU0lJTlQJICAweDA0CisJZmllbGQJQ01EQ01QTFQgIDB4MDIKKwlmaWVsZAlTRVFJTlQgICAgMHgwMQorCW1hc2sJQkFEX1BIQVNFCVNFUUlOVAkJLyogdW5rbm93biBzY3NpIGJ1cyBwaGFzZSAqLworCW1hc2sJU0VORF9SRUpFQ1QJMHgxMHxTRVFJTlQJLyogc2VuZGluZyBhIG1lc3NhZ2UgcmVqZWN0ICovCisJbWFzawlQUk9UT19WSU9MQVRJT04JMHgyMHxTRVFJTlQJLyogU0NTSSBwcm90b2NvbCB2aW9sYXRpb24gKi8gCisJbWFzawlOT19NQVRDSAkweDMwfFNFUUlOVAkvKiBubyBjbWQgbWF0Y2ggZm9yIHJlY29ubmVjdCAqLworCW1hc2sJSUdOX1dJREVfUkVTCTB4NDB8U0VRSU5UCS8qIENvbXBsZXggSUdOIFdpZGUgUmVzIE1zZyAqLworCW1hc2sJUERBVEFfUkVJTklUCTB4NTB8U0VRSU5UCS8qCisJCQkJCQkgKiBSZXR1cm5lZCB0byBkYXRhIHBoYXNlCisJCQkJCQkgKiB0aGF0IHJlcXVpcmVzIGRhdGEKKwkJCQkJCSAqIHRyYW5zZmVyIHBvaW50ZXJzIHRvIGJlCisJCQkJCQkgKiByZWNhbGN1bGF0ZWQgZnJvbSB0aGUKKwkJCQkJCSAqIHRyYW5zZmVyIHJlc2lkdWFsLgorCQkJCQkJICovCisJbWFzawlIT1NUX01TR19MT09QCTB4NjB8U0VRSU5UCS8qCisJCQkJCQkgKiBUaGUgYnVzIGlzIHJlYWR5IGZvciB0aGUKKwkJCQkJCSAqIGhvc3QgdG8gcGVyZm9ybSBhbm90aGVyCisJCQkJCQkgKiBtZXNzYWdlIHRyYW5zYWN0aW9uLiAgVGhpcworCQkJCQkJICogbWVjaGFuaXNtIGlzIHVzZWQgZm9yIHRoaW5ncworCQkJCQkJICogbGlrZSBzeW5jL3dpZGUgbmVnb3RpYXRpb24KKwkJCQkJCSAqIHRoYXQgcmVxdWlyZSBhIGtlcm5lbCBiYXNlZAorCQkJCQkJICogbWVzc2FnZSBzdGF0ZSBlbmdpbmUuCisJCQkJCQkgKi8KKwltYXNrCUJBRF9TVEFUVVMJMHg3MHxTRVFJTlQJLyogQmFkIHN0YXR1cyBmcm9tIHRhcmdldCAqLworCW1hc2sJUEVSUl9ERVRFQ1RFRAkweDgwfFNFUUlOVAkvKgorCQkJCQkJICogRWl0aGVyIHRoZSBwaGFzZV9sb2NrCisJCQkJCQkgKiBvciBpbmJfbmV4dCByb3V0aW5lIGhhcworCQkJCQkJICogbm90aWNlZCBhIHBhcml0eSBlcnJvci4KKwkJCQkJCSAqLworCW1hc2sJREFUQV9PVkVSUlVOCTB4OTB8U0VRSU5UCS8qCisJCQkJCQkgKiBUYXJnZXQgYXR0ZW1wdGVkIHRvIHdyaXRlCisJCQkJCQkgKiBiZXlvbmQgdGhlIGJvdW5kcyBvZiBpdHMKKwkJCQkJCSAqIGNvbW1hbmQuCisJCQkJCQkgKi8KKwltYXNrCU1LTVNHX0ZBSUxFRAkweGEwfFNFUUlOVAkvKgorCQkJCQkJICogVGFyZ2V0IGNvbXBsZXRlZCBjb21tYW5kCisJCQkJCQkgKiB3aXRob3V0IGhvbm9yaW5nIG91ciBBVE4KKwkJCQkJCSAqIHJlcXVlc3QgdG8gaXNzdWUgYSBtZXNzYWdlLiAKKwkJCQkJCSAqLworCW1hc2sJTUlTU0VEX0JVU0ZSRUUJMHhiMHxTRVFJTlQJLyoKKwkJCQkJCSAqIFRoZSBzZXF1ZW5jZXIgbmV2ZXIgc2F3CisJCQkJCQkgKiB0aGUgYnVzIGdvIGZyZWUgYWZ0ZXIKKwkJCQkJCSAqIGVpdGhlciBhIGNvbW1hbmQgY29tcGxldGUKKwkJCQkJCSAqIG9yIGRpc2Nvbm5lY3QgbWVzc2FnZS4KKwkJCQkJCSAqLworCW1hc2sJU0NCX01JU01BVENICTB4YzB8U0VRSU5UCS8qCisJCQkJCQkgKiBEb3dubG9hZGVkIFNDQidzIHRhZyBkb2VzCisJCQkJCQkgKiBub3QgbWF0Y2ggdGhlIGVudHJ5IHdlCisJCQkJCQkgKiBpbnRlbmRlZCB0byBkb3dubG9hZC4KKwkJCQkJCSAqLworCW1hc2sJTk9fRlJFRV9TQ0IJMHhkMHxTRVFJTlQJLyoKKwkJCQkJCSAqIGdldF9mcmVlX29yX2Rpc2Nfc2NiIGZhaWxlZC4KKwkJCQkJCSAqLworCW1hc2sJT1VUX09GX1JBTkdFCTB4ZTB8U0VRSU5UCisKKwltYXNrCVNFUUlOVF9NQVNLCTB4ZjB8U0VRSU5UCS8qIFNFUUlOVCBTdGF0dXMgQ29kZXMgKi8KKwltYXNrCUlOVF9QRU5EICAoQlJLQURSSU5UfFNFUUlOVHxTQ1NJSU5UfENNRENNUExUKQorfQorCisvKgorICogSGFyZCBFcnJvciAocC4gMy01MykKKyAqIFJlcG9ydGluZyBvZiBjYXRhc3Ryb3BoaWMgZXJyb3JzLiAgWW91IHVzdWFsbHkgY2Fubm90IHJlY292ZXIgZnJvbQorICogdGhlc2Ugd2l0aG91dCBhIGZ1bGwgYm9hcmQgcmVzZXQuCisgKi8KK3JlZ2lzdGVyIEVSUk9SIHsKKwlhZGRyZXNzCQkJMHgwOTIKKwlhY2Nlc3NfbW9kZSBSTworCWZpZWxkCUNJT1BBUkVSUgkweDgwCS8qIFVsdHJhMiBvbmx5ICovCisJZmllbGQJUENJRVJSU1RBVAkweDQwCS8qIFBDSSBvbmx5ICovCisJZmllbGQJTVBBUkVSUgkJMHgyMAkvKiBQQ0kgb25seSAqLworCWZpZWxkCURQQVJFUlIJCTB4MTAJLyogUENJIG9ubHkgKi8KKwlmaWVsZAlTUVBBUkVSUgkweDA4CisJZmllbGQJSUxMT1BDT0RFCTB4MDQKKwlmaWVsZAlJTExTQUREUgkweDAyCisJZmllbGQJSUxMSEFERFIJMHgwMQorfQorCisvKgorICogQ2xlYXIgSW50ZXJydXB0IFN0YXR1cyAocC4gMy01MikKKyAqLworcmVnaXN0ZXIgQ0xSSU5UIHsKKwlhZGRyZXNzCQkJMHgwOTIKKwlhY2Nlc3NfbW9kZSBXTworCWZpZWxkCUNMUlBBUkVSUgkweDEwCS8qIFBDSSBvbmx5ICovCisJZmllbGQJQ0xSQlJLQURSSU5UCTB4MDgKKwlmaWVsZAlDTFJTQ1NJSU5UICAgICAgMHgwNAorCWZpZWxkCUNMUkNNRElOVCAJMHgwMgorCWZpZWxkCUNMUlNFUUlOVCAJMHgwMQorfQorCityZWdpc3RlciBERkNOVFJMIHsKKwlhZGRyZXNzCQkJMHgwOTMKKwlhY2Nlc3NfbW9kZSBSVworCWZpZWxkCVBSRUxPQURFTgkweDgwCS8qIGFpYzc4OTAgb25seSAqLworCWZpZWxkCVdJREVPREQJCTB4NDAKKwlmaWVsZAlTQ1NJRU4JCTB4MjAKKwlmaWVsZAlTRE1BRU4JCTB4MTAKKwlmaWVsZAlTRE1BRU5BQ0sJMHgxMAorCWZpZWxkCUhETUFFTgkJMHgwOAorCWZpZWxkCUhETUFFTkFDSwkweDA4CisJZmllbGQJRElSRUNUSU9OCTB4MDQKKwlmaWVsZAlGSUZPRkxVU0gJMHgwMgorCWZpZWxkCUZJRk9SRVNFVAkweDAxCit9CisKK3JlZ2lzdGVyIERGU1RBVFVTIHsKKwlhZGRyZXNzCQkJMHgwOTQKKwlhY2Nlc3NfbW9kZSBSTworCWZpZWxkCVBSRUxPQURfQVZBSUwJMHg4MAorCWZpZWxkCURGQ0FDSEVUSAkweDQwCisJZmllbGQJRklGT1FXREVNUAkweDIwCisJZmllbGQJTVJFUVBFTkQJMHgxMAorCWZpZWxkCUhET05FCQkweDA4CisJZmllbGQJREZUSFJFU0gJMHgwNAorCWZpZWxkCUZJRk9GVUxMCTB4MDIKKwlmaWVsZAlGSUZPRU1QCQkweDAxCit9CisKK3JlZ2lzdGVyIERGV0FERFIgeworCWFkZHJlc3MJCQkweDk1CisJYWNjZXNzX21vZGUgUlcKK30KKworcmVnaXN0ZXIgREZSQUREUiB7CisJYWRkcmVzcwkJCTB4OTcKKwlhY2Nlc3NfbW9kZSBSVworfQorCityZWdpc3RlciBERkRBVCB7CisJYWRkcmVzcwkJCTB4MDk5CisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIFNDQiBBdXRvIEluY3JlbWVudCAocC4gMy01OSkKKyAqIEJ5dGUgb2Zmc2V0IGludG8gdGhlIFNDQiBBcnJheSBhbmQgYW4gb3B0aW9uYWwgYml0IHRvIGFsbG93IGF1dG8KKyAqIGluY3JlbWVudGluZyBvZiB0aGUgYWRkcmVzcyBkdXJpbmcgZG93bmxvYWQgYW5kIHVwbG9hZCBvcGVyYXRpb25zCisgKi8KK3JlZ2lzdGVyIFNDQkNOVCB7CisJYWRkcmVzcwkJCTB4MDlhCisJYWNjZXNzX21vZGUgUlcKKwlmaWVsZAlTQ0JBVVRPCQkweDgwCisJbWFzawlTQ0JDTlRfTUFTSwkweDFmCit9CisKKy8qCisgKiBRdWV1ZSBJbiBGSUZPIChwLiAzLTYwKQorICogSW5wdXQgcXVldWUgZm9yIHF1ZXVlZCBTQ0JzIChjb21tYW5kcyB0aGF0IHRoZSBzZXFlbmNlciBoYXMgeWV0IHRvIHN0YXJ0KQorICovCityZWdpc3RlciBRSU5GSUZPIHsKKwlhZGRyZXNzCQkJMHgwOWIKKwlhY2Nlc3NfbW9kZSBSVworfQorCisvKgorICogUXVldWUgSW4gQ291bnQgKHAuIDMtNjApCisgKiBOdW1iZXIgb2YgcXVldWVkIFNDQnMKKyAqLworcmVnaXN0ZXIgUUlOQ05UCXsKKwlhZGRyZXNzCQkJMHgwOWMKKwlhY2Nlc3NfbW9kZSBSTworfQorCisvKgorICogUXVldWUgT3V0IEZJRk8gKHAuIDMtNjEpCisgKiBRdWV1ZSBvZiBTQ0JzIHRoYXQgaGF2ZSBjb21wbGV0ZWQgYW5kIGF3YWl0IHRoZSBob3N0CisgKi8KK3JlZ2lzdGVyIFFPVVRGSUZPIHsKKwlhZGRyZXNzCQkJMHgwOWQKKwlhY2Nlc3NfbW9kZSBXTworfQorCityZWdpc3RlciBDUkNDT05UUk9MMSB7CisJYWRkcmVzcwkJCTB4MDlkCisJYWNjZXNzX21vZGUgUlcKKwlmaWVsZAlDUkNPTlNFRU4JCTB4ODAKKwlmaWVsZAlDUkNWQUxDSEtFTgkJMHg0MAorCWZpZWxkCUNSQ0VORENIS0VOCQkweDIwCisJZmllbGQJQ1JDUkVRQ0hLRU4JCTB4MTAKKwlmaWVsZAlUQVJHQ1JDRU5ERU4JCTB4MDgKKwlmaWVsZAlUQVJHQ1JDQ05URU4JCTB4MDQKK30KKworCisvKgorICogUXVldWUgT3V0IENvdW50IChwLiAzLTYxKQorICogTnVtYmVyIG9mIHF1ZXVlZCBTQ0JzIGluIHRoZSBPdXQgRklGTworICovCityZWdpc3RlciBRT1VUQ05UIHsKKwlhZGRyZXNzCQkJMHgwOWUKKwlhY2Nlc3NfbW9kZSBSTworfQorCityZWdpc3RlciBTQ1NJUEhBU0UgeworCWFkZHJlc3MJCQkweDA5ZQorCWFjY2Vzc19tb2RlIFJPCisJZmllbGQJU1RBVFVTX1BIQVNFCTB4MjAKKwlmaWVsZAlDT01NQU5EX1BIQVNFCTB4MTAKKwlmaWVsZAlNU0dfSU5fUEhBU0UJMHgwOAorCWZpZWxkCU1TR19PVVRfUEhBU0UJMHgwNAorCWZpZWxkCURBVEFfSU5fUEhBU0UJMHgwMgorCWZpZWxkCURBVEFfT1VUX1BIQVNFCTB4MDEKKwltYXNrCURBVEFfUEhBU0VfTUFTSwkweDAzCit9CisKKy8qCisgKiBTcGVjaWFsIEZ1bmN0aW9uCisgKi8KK3JlZ2lzdGVyIFNGVU5DVCB7CisJYWRkcmVzcwkJCTB4MDlmCisJYWNjZXNzX21vZGUgUlcKKwlmaWVsZAlBTFRfTU9ERQkweDgwCit9CisKKy8qCisgKiBTQ0IgRGVmaW5pdGlvbiAocC4gNS00KQorICovCitzY2IgeworCWFkZHJlc3MJCTB4MGEwCisJc2l6ZQkJNjQKKworCVNDQl9DREJfUFRSIHsKKwkJc2l6ZQk0CisJCWFsaWFzCVNDQl9SRVNJRFVBTF9EQVRBQ05UCisJCWFsaWFzCVNDQl9DREJfU1RPUkUKKwl9CisJU0NCX1JFU0lEVUFMX1NHUFRSIHsKKwkJc2l6ZQk0CisJfQorCVNDQl9TQ1NJX1NUQVRVUyB7CisJCXNpemUJMQorCX0KKwlTQ0JfVEFSR0VUX1BIQVNFUyB7CisJCXNpemUJMQorCX0KKwlTQ0JfVEFSR0VUX0RBVEFfRElSIHsKKwkJc2l6ZQkxCisJfQorCVNDQl9UQVJHRVRfSVRBRyB7CisJCXNpemUJMQorCX0KKwlTQ0JfREFUQVBUUiB7CisJCXNpemUJNAorCX0KKwlTQ0JfREFUQUNOVCB7CisJCS8qCisJCSAqIFRoZSBsYXN0IGJ5dGUgaXMgcmVhbGx5IHRoZSBoaWdoIGFkZHJlc3MgYml0cyBmb3IKKwkJICogdGhlIGRhdGEgYWRkcmVzcy4KKwkJICovCisJCXNpemUJNAorCQlmaWVsZAlTR19MQVNUX1NFRwkJMHg4MAkvKiBJbiB0aGUgZm91cnRoIGJ5dGUgKi8KKwkJbWFzawlTR19ISUdIX0FERFJfQklUUwkweDdGCS8qIEluIHRoZSBmb3VydGggYnl0ZSAqLworCX0KKwlTQ0JfU0dQVFIgeworCQlzaXplCTQKKwkJZmllbGQJU0dfUkVTSURfVkFMSUQJMHgwNAkvKiBJbiB0aGUgZmlyc3QgYnl0ZSAqLworCQlmaWVsZAlTR19GVUxMX1JFU0lECTB4MDIJLyogSW4gdGhlIGZpcnN0IGJ5dGUgKi8KKwkJZmllbGQJU0dfTElTVF9OVUxMCTB4MDEJLyogSW4gdGhlIGZpcnN0IGJ5dGUgKi8KKwl9CisJU0NCX0NPTlRST0wgeworCQlzaXplCTEKKwkJZmllbGQJVEFSR0VUX1NDQgkJCTB4ODAKKwkJZmllbGQJU1RBVFVTX1JDVkQJCQkweDgwCisJCWZpZWxkCURJU0NFTkIJCQkJMHg0MAorCQlmaWVsZAlUQUdfRU5CCQkJCTB4MjAKKwkJZmllbGQJTUtfTUVTU0FHRQkJCTB4MTAKKwkJZmllbGQJVUxUUkFFTkIJCQkweDA4CisJCWZpZWxkCURJU0NPTk5FQ1RFRAkJCTB4MDQKKwkJbWFzawlTQ0JfVEFHX1RZUEUJCQkweDAzCisJfQorCVNDQl9TQ1NJSUQgeworCQlzaXplCTEKKwkJZmllbGQJVFdJTl9DSE5MQgkJCTB4ODAKKwkJbWFzawlUV0lOX1RJRAkJCTB4NzAKKwkJbWFzawlUSUQJCQkJMHhmMAorCQltYXNrCU9JRAkJCQkweDBmCisJfQorCVNDQl9MVU4geworCQlmaWVsZAlTQ0JfWEZFUkxFTl9PREQJCQkweDgwCisJCW1hc2sJTElECQkJCTB4M2YKKwkJc2l6ZQkxCisJfQorCVNDQl9UQUcgeworCQlzaXplCTEKKwl9CisJU0NCX0NEQl9MRU4geworCQlzaXplCTEKKwl9CisJU0NCX1NDU0lSQVRFIHsKKwkJc2l6ZQkxCisJfQorCVNDQl9TQ1NJT0ZGU0VUIHsKKwkJc2l6ZQkxCisJfQorCVNDQl9ORVhUIHsKKwkJc2l6ZQkxCisJfQorCVNDQl82NF9TUEFSRSB7CisJCXNpemUJMTYKKwl9CisJU0NCXzY0X0JUVCB7CisJCXNpemUJMTYKKwl9Cit9CisKK2NvbnN0CVNDQl9VUExPQURfU0laRQkJMzIKK2NvbnN0CVNDQl9ET1dOTE9BRF9TSVpFCTMyCitjb25zdAlTQ0JfRE9XTkxPQURfU0laRV82NAk0OAorCitjb25zdAlTR19TSVpFT0YJMHgwOAkJLyogc2l6ZW9mKHN0cnVjdCBhaGNfZG1hKSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQUhBLTI4NDAtb25seSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCityZWdpc3RlciBTRUVDVExfMjg0MCB7CisJYWRkcmVzcwkJCTB4MGMwCisJYWNjZXNzX21vZGUgUlcKKwlmaWVsZAlDU18yODQwCQkweDA0CisJZmllbGQJQ0tfMjg0MAkJMHgwMgorCWZpZWxkCURPXzI4NDAJCTB4MDEKK30KKworcmVnaXN0ZXIgU1RBVFVTXzI4NDAgeworCWFkZHJlc3MJCQkweDBjMQorCWFjY2Vzc19tb2RlIFJXCisJZmllbGQJRUVQUk9NX1RGCTB4ODAKKwltYXNrCUJJT1NfU0VMCTB4NjAKKwltYXNrCUFEU0VMCQkweDFlCisJZmllbGQJRElfMjg0MAkJMHgwMQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQUlDLTc4NzAtb25seSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCityZWdpc3RlciBDQ0hBRERSIHsKKwlhZGRyZXNzCQkJMHgwRTAKKwlzaXplIDgKK30KKworcmVnaXN0ZXIgQ0NIQ05UIHsKKwlhZGRyZXNzCQkJMHgwRTgKK30KKworcmVnaXN0ZXIgQ0NTR1JBTSB7CisJYWRkcmVzcwkJCTB4MEU5Cit9CisKK3JlZ2lzdGVyIENDU0dBRERSIHsKKwlhZGRyZXNzCQkJMHgwRUEKK30KKworcmVnaXN0ZXIgQ0NTR0NUTCB7CisJYWRkcmVzcwkJCTB4MEVCCisJZmllbGQJQ0NTR0RPTkUJMHg4MAorCWZpZWxkCUNDU0dFTgkJMHgwOAorCWZpZWxkCVNHX0ZFVENIX05FRURFRCAweDAyCS8qIEJpdCB1c2VkIGZvciBzb2Z0d2FyZSBzdGF0ZSAqLworCWZpZWxkCUNDU0dSRVNFVAkweDAxCit9CisKK3JlZ2lzdGVyIENDU0NCQ05UIHsKKwlhZGRyZXNzCQkJMHhFRgorfQorCityZWdpc3RlciBDQ1NDQkNUTCB7CisJYWRkcmVzcwkJCTB4MEVFCisJZmllbGQJQ0NTQ0JET05FCTB4ODAKKwlmaWVsZAlBUlJET05FCQkweDQwCS8qIFNDQiBBcnJheSBwcmVmZXRjaCBkb25lICovCisJZmllbGQJQ0NBUlJFTgkJMHgxMAorCWZpZWxkCUNDU0NCRU4JCTB4MDgKKwlmaWVsZAlDQ1NDQkRJUgkweDA0CisJZmllbGQJQ0NTQ0JSRVNFVAkweDAxCit9CisKK3JlZ2lzdGVyIENDU0NCQUREUiB7CisJYWRkcmVzcwkJCTB4MEVECit9CisKK3JlZ2lzdGVyIENDU0NCUkFNIHsKKwlhZGRyZXNzCQkJMHhFQworfQorCisvKgorICogU0NCIGJhbmsgYWRkcmVzcyAoNzg5NS83ODk2Lzk3IG9ubHkpCisgKi8KK3JlZ2lzdGVyIFNDQkJBRERSIHsKKwlhZGRyZXNzCQkJMHgwRjAKKwlhY2Nlc3NfbW9kZSBSVworfQorCityZWdpc3RlciBDQ1NDQlBUUiB7CisJYWRkcmVzcwkJCTB4MEYxCit9CisKK3JlZ2lzdGVyIEhOU0NCX1FPRkYgeworCWFkZHJlc3MJCQkweDBGNAorfQorCityZWdpc3RlciBTTlNDQl9RT0ZGIHsKKwlhZGRyZXNzCQkJMHgwRjYKK30KKworcmVnaXN0ZXIgU0RTQ0JfUU9GRiB7CisJYWRkcmVzcwkJCTB4MEY4Cit9CisKK3JlZ2lzdGVyIFFPRkZfQ1RMU1RBIHsKKwlhZGRyZXNzCQkJMHgwRkEKKwlmaWVsZAlTQ0JfQVZBSUwJMHg0MAorCWZpZWxkCVNOU0NCX1JPTExPVkVSCTB4MjAKKwlmaWVsZAlTRFNDQl9ST0xMT1ZFUgkweDEwCisJbWFzawlTQ0JfUVNJWkUJMHgwNworCW1hc2sJU0NCX1FTSVpFXzI1NgkweDA2Cit9CisKK3JlZ2lzdGVyIERGRl9USFJTSCB7CisJYWRkcmVzcwkJCTB4MEZCCisJbWFzawlXUl9ERlRIUlNICTB4NzAKKwltYXNrCVJEX0RGVEhSU0gJMHgwNworCW1hc2sJUkRfREZUSFJTSF9NSU4JMHgwMAorCW1hc2sJUkRfREZUSFJTSF8yNQkweDAxCisJbWFzawlSRF9ERlRIUlNIXzUwCTB4MDIKKwltYXNrCVJEX0RGVEhSU0hfNjMJMHgwMworCW1hc2sJUkRfREZUSFJTSF83NQkweDA0CisJbWFzawlSRF9ERlRIUlNIXzg1CTB4MDUKKwltYXNrCVJEX0RGVEhSU0hfOTAJMHgwNgorCW1hc2sJUkRfREZUSFJTSF9NQVgJMHgwNworCW1hc2sJV1JfREZUSFJTSF9NSU4JMHgwMAorCW1hc2sJV1JfREZUSFJTSF8yNQkweDEwCisJbWFzawlXUl9ERlRIUlNIXzUwCTB4MjAKKwltYXNrCVdSX0RGVEhSU0hfNjMJMHgzMAorCW1hc2sJV1JfREZUSFJTSF83NQkweDQwCisJbWFzawlXUl9ERlRIUlNIXzg1CTB4NTAKKwltYXNrCVdSX0RGVEhSU0hfOTAJMHg2MAorCW1hc2sJV1JfREZUSFJTSF9NQVgJMHg3MAorfQorCityZWdpc3RlciBTR19DQUNIRV9QUkUgeworCWFjY2Vzc19tb2RlIFdPCisJYWRkcmVzcwkJCTB4MGZjCisJbWFzawlTR19BRERSX01BU0sJMHhmOAorCWZpZWxkCUxBU1RfU0VHCTB4MDIKKwlmaWVsZAlMQVNUX1NFR19ET05FCTB4MDEKK30KKworcmVnaXN0ZXIgU0dfQ0FDSEVfU0hBRE9XIHsKKwlhY2Nlc3NfbW9kZSBSTworCWFkZHJlc3MJCQkweDBmYworCW1hc2sJU0dfQUREUl9NQVNLCTB4ZjgKKwlmaWVsZAlMQVNUX1NFRwkweDAyCisJZmllbGQJTEFTVF9TRUdfRE9ORQkweDAxCit9CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNjcmF0Y2ggUkFNIE9mZnNldHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogVGhlc2Ugb2Zmc2V0cyBhcmUgZWl0aGVyIHRvIHZhbHVlcyB0aGF0IGFyZSBpbml0aWFsaXplZCBieSB0aGUgYm9hcmQncworICogQklPUyBvciBhcmUgc3BlY2lmaWVkIGJ5IHRoZSBzZXF1ZW5jZXIgY29kZS4KKyAqCisgKiBUaGUgaG9zdCBhZGFwdGVyIGNhcmQgKGF0IGxlYXN0IHRoZSBCSU9TKSB1c2VzIDIwLTJmIGZvciBTQ1NJCisgKiBkZXZpY2UgaW5mb3JtYXRpb24sIDMyLTMzIGFuZCA1YS01ZiBhcyB3ZWxsLiBBcyBpdCB0dXJucyBvdXQsIHRoZQorICogQklPUyB0cmFzaGVzIDIwLTJmLCB3cml0aW5nIHRoZSBzeW5jaHJvbm91cyBuZWdvdGlhdGlvbiByZXN1bHRzCisgKiBvbiB0b3Agb2YgdGhlIEJJT1MgdmFsdWVzLCBzbyB3ZSByZS11c2UgdGhvc2UgZm9yIG91ciBwZXItdGFyZ2V0CisgKiBzY3JhdGNoc3BhY2UgKGFjdHVhbGx5IGEgdmFsdWUgdGhhdCBjYW4gYmUgY29waWVkIGRpcmVjdGx5IGludG8KKyAqIFNDU0lSQVRFKS4gIFRoZSBrZXJuZWwgZHJpdmVyIHdpbGwgZW5hYmxlIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uCisgKiBmb3IgYWxsIHRhcmdldHMgdGhhdCBoYXZlIGEgdmFsdWUgb3RoZXIgdGhhbiAwIGluIHRoZSBsb3dlciBmb3VyCisgKiBiaXRzIG9mIHRoZSB0YXJnZXQgc2NyYXRjaCBzcGFjZS4gIFRoaXMgc2hvdWxkIHdvcmsgcmVnYXJkbGVzcyBvZgorICogd2hldGhlciB0aGUgYmlvcyBoYXMgYmVlbiBpbnN0YWxsZWQuCisgKi8KKworc2NyYXRjaF9yYW0geworCWFkZHJlc3MJCTB4MDIwCisJc2l6ZQkJNTgKKworCS8qCisJICogMSBieXRlIHBlciB0YXJnZXQgc3RhcnRpbmcgYXQgdGhpcyBhZGRyZXNzIGZvciBjb25maWd1cmF0aW9uIHZhbHVlcworCSAqLworCUJVU1lfVEFSR0VUUyB7CisJCWFsaWFzCQlUQVJHX1NDU0lSQVRFCisJCXNpemUJCTE2CisJfQorCS8qCisJICogQml0IHZlY3RvciBvZiB0YXJnZXRzIHRoYXQgaGF2ZSBVTFRSQSBlbmFibGVkIGFzIHNldCBieQorCSAqIHRoZSBCSU9TLiAgVGhlIFNlcXVlbmNlciByZWxpZXMgb24gYSBwZXItU0NCIGZpZWxkIHRvCisJICogY29udHJvbCB3aGV0aGVyIHRvIGVuYWJsZSBVbHRyYSB0cmFuc2ZlcnMgb3Igbm90LiAgRHVyaW5nCisJICogaW5pdGlhbGl6YXRpb24sIHdlIHJlYWQgdGhpcyBmaWVsZCBhbmQgcmV1c2UgaXQgZm9yIDIKKwkgKiBlbnRyaWVzIGluIHRoZSBidXN5IHRhcmdldCB0YWJsZS4KKwkgKi8KKwlVTFRSQV9FTkIgeworCQlhbGlhcwkJQ01EU0laRV9UQUJMRQorCQlzaXplCQkyCisJfQorCS8qCisJICogQml0IHZlY3RvciBvZiB0YXJnZXRzIHRoYXQgaGF2ZSBkaXNjb25uZWN0aW9uIGRpc2FibGVkIGFzIHNldCBieQorCSAqIHRoZSBCSU9TLiAgVGhlIFNlcXVlbmNlciByZWxpZXMgaW4gYSBwZXItU0NCIGZpZWxkIHRvIGNvbnRyb2wgdGhlCisJICogZGlzY29ubmVjdCBwcml2ZWxkZ2UuICBEdXJpbmcgaW5pdGlhbGl6YXRpb24sIHdlIHJlYWQgdGhpcyBmaWVsZAorCSAqIGFuZCByZXVzZSBpdCBmb3IgMiBlbnRyaWVzIGluIHRoZSBidXN5IHRhcmdldCB0YWJsZS4KKwkgKi8KKwlESVNDX0RTQiB7CisJCXNpemUJCTIKKwl9CisJQ01EU0laRV9UQUJMRV9UQUlMIHsKKwkJc2l6ZQkJNAorCX0KKwkvKgorCSAqIFBhcnRpYWwgdHJhbnNmZXIgcGFzdCBjYWNoZWxpbmUgZW5kIHRvIGJlCisJICogdHJhbnNmZXJyZWQgdXNpbmcgYW4gZXh0cmEgUy9HLgorCSAqLworCU1XSV9SRVNJRFVBTCB7CisJCXNpemUJCTEKKwkJYWxpYXMJVEFSR19JTU1FRElBVEVfU0NCCisJfQorCS8qCisJICogU0NCSUQgb2YgdGhlIG5leHQgU0NCIHRvIGJlIHN0YXJ0ZWQgYnkgdGhlIGNvbnRyb2xsZXIuCisJICovCisJTkVYVF9RVUVVRURfU0NCIHsKKwkJc2l6ZQkJMQorCX0KKwkvKgorCSAqIFNpbmdsZSBieXRlIGJ1ZmZlciB1c2VkIHRvIGRlc2lnbmF0ZSB0aGUgdHlwZSBvciBtZXNzYWdlCisJICogdG8gc2VuZCB0byBhIHRhcmdldC4KKwkgKi8KKwlNU0dfT1VUIHsKKwkJc2l6ZQkJMQorCX0KKwkvKiBQYXJhbWV0ZXJzIGZvciBETUEgTG9naWMgKi8KKwlETUFQQVJBTVMgeworCQlzaXplCQkxCisJCWZpZWxkCVBSRUxPQURFTgkweDgwCisJCWZpZWxkCVdJREVPREQJCTB4NDAKKwkJZmllbGQJU0NTSUVOCQkweDIwCisJCWZpZWxkCVNETUFFTgkJMHgxMAorCQlmaWVsZAlTRE1BRU5BQ0sJMHgxMAorCQlmaWVsZAlIRE1BRU4JCTB4MDgKKwkJZmllbGQJSERNQUVOQUNLCTB4MDgKKwkJZmllbGQJRElSRUNUSU9OCTB4MDQJLyogU2V0IGluZGljYXRlcyBQQ0ktPlNDU0kgKi8KKwkJZmllbGQJRklGT0ZMVVNICTB4MDIKKwkJZmllbGQJRklGT1JFU0VUCTB4MDEKKwl9CisJU0VRX0ZMQUdTIHsKKwkJc2l6ZQkJMQorCQlmaWVsZAlOT1RfSURFTlRJRklFRAkJMHg4MAorCQlmaWVsZAlOT19DREJfU0VOVAkJMHg0MAorCQlmaWVsZAlUQVJHRVRfQ01EX0lTX1RBR0dFRAkweDQwCisJCWZpZWxkCURQSEFTRQkJCTB4MjAKKwkJLyogVGFyZ2V0IGZsYWdzICovCisJCWZpZWxkCVRBUkdfQ01EX1BFTkRJTkcJMHgxMAorCQlmaWVsZAlDTURQSEFTRV9QRU5ESU5HCTB4MDgKKwkJZmllbGQJRFBIQVNFX1BFTkRJTkcJCTB4MDQKKwkJZmllbGQJU1BIQVNFX1BFTkRJTkcJCTB4MDIKKwkJZmllbGQJTk9fRElTQ09OTkVDVAkJMHgwMQorCX0KKwkvKgorCSAqIFRlbXBvcmFyeSBzdG9yYWdlIGZvciB0aGUKKwkgKiB0YXJnZXQvY2hhbm5lbC9sdW4gb2YgYQorCSAqIHJlY29ubmVjdGluZyB0YXJnZXQKKwkgKi8KKwlTQVZFRF9TQ1NJSUQgeworCQlzaXplCQkxCisJfQorCVNBVkVEX0xVTiB7CisJCXNpemUJCTEKKwl9CisJLyoKKwkgKiBUaGUgbGFzdCBidXMgcGhhc2UgYXMgc2VlbiBieSB0aGUgc2VxdWVuY2VyLiAKKwkgKi8KKwlMQVNUUEhBU0UgeworCQlzaXplCQkxCisJCWZpZWxkCUNESQkJMHg4MAorCQlmaWVsZAlJT0kJCTB4NDAKKwkJZmllbGQJTVNHSQkJMHgyMAorCQltYXNrCVBIQVNFX01BU0sJQ0RJfElPSXxNU0dJCisJCW1hc2sJUF9EQVRBT1VUCTB4MDAKKwkJbWFzawlQX0RBVEFJTglJT0kKKwkJbWFzawlQX0NPTU1BTkQJQ0RJCisJCW1hc2sJUF9NRVNHT1VUCUNESXxNU0dJCisJCW1hc2sJUF9TVEFUVVMJQ0RJfElPSQorCQltYXNrCVBfTUVTR0lOCUNESXxJT0l8TVNHSQorCQltYXNrCVBfQlVTRlJFRQkweDAxCisJfQorCS8qCisJICogaGVhZCBvZiBsaXN0IG9mIFNDQnMgYXdhaXRpbmcKKwkgKiBzZWxlY3Rpb24KKwkgKi8KKwlXQUlUSU5HX1NDQkggeworCQlzaXplCQkxCisJfQorCS8qCisJICogaGVhZCBvZiBsaXN0IG9mIFNDQnMgdGhhdCBhcmUKKwkgKiBkaXNjb25uZWN0ZWQuICBVc2VkIGZvciBTQ0IKKwkgKiBwYWdpbmcuCisJICovCisJRElTQ09OTkVDVEVEX1NDQkggeworCQlzaXplCQkxCisJfQorCS8qCisJICogaGVhZCBvZiBsaXN0IG9mIFNDQnMgdGhhdCBhcmUKKwkgKiBub3QgaW4gdXNlLiAgVXNlZCBmb3IgU0NCIHBhZ2luZy4KKwkgKi8KKwlGUkVFX1NDQkggeworCQlzaXplCQkxCisJfQorCS8qCisJICogaGVhZCBvZiBsaXN0IG9mIFNDQnMgdGhhdCBoYXZlCisJICogY29tcGxldGVkIGJ1dCBoYXZlIG5vdCBiZWVuCisJICogcHV0IGludG8gdGhlIHFvdXRmaWZvLgorCSAqLworCUNPTVBMRVRFX1NDQkggeworCQlzaXplCQkxCisJfQorCS8qCisJICogQWRkcmVzcyBvZiB0aGUgaGFyZHdhcmUgc2NiIGFycmF5IGluIHRoZSBob3N0LgorCSAqLworCUhTQ0JfQUREUiB7CisJCXNpemUJCTQKKwl9CisJLyoKKwkgKiBCYXNlIGFkZHJlc3Mgb2Ygb3VyIHNoYXJlZCBkYXRhIHdpdGggdGhlIGtlcm5lbCBkcml2ZXIgaW4gaG9zdAorCSAqIG1lbW9yeS4gIFRoaXMgaW5jbHVkZXMgdGhlIHFvdXRmaWZvIGFuZCB0YXJnZXQgbW9kZQorCSAqIGluY29taW5nIGNvbW1hbmQgcXVldWUuCisJICovCisJU0hBUkVEX0RBVEFfQUREUiB7CisJCXNpemUJCTQKKwl9CisJS0VSTkVMX1FJTlBPUyB7CisJCXNpemUJCTEKKwl9CisJUUlOUE9TIHsKKwkJc2l6ZQkJMQorCX0KKwlRT1VUUE9TIHsKKwkJc2l6ZQkJMQorCX0KKwkvKgorCSAqIEtlcm5lbCBhbmQgc2VxdWVuY2VyIG9mZnNldHMgaW50byB0aGUgcXVldWUgb2YKKwkgKiBpbmNvbWluZyB0YXJnZXQgbW9kZSBjb21tYW5kIGRlc2NyaXB0b3JzLiAgVGhlCisJICogcXVldWUgaXMgZnVsbCB3aGVuIHRoZSBLRVJORUxfVFFJTlBPUyA9PSBUUUlOUE9TLgorCSAqLworCUtFUk5FTF9UUUlOUE9TIHsKKwkJc2l6ZQkJMQorCX0KKwlUUUlOUE9TIHsgICAgICAgICAgICAgICAgCisJCXNpemUJCTEKKwl9CisJQVJHXzEgeworCQlzaXplCQkxCisJCW1hc2sJU0VORF9NU0cJCTB4ODAKKwkJbWFzawlTRU5EX1NFTlNFCQkweDQwCisJCW1hc2sJU0VORF9SRUoJCTB4MjAKKwkJbWFzawlNU0dPVVRfUEhBU0VNSVMJCTB4MTAKKwkJbWFzawlFWElUX01TR19MT09QCQkweDA4CisJCW1hc2sJQ09OVF9NU0dfTE9PUAkJMHgwNAorCQltYXNrCUNPTlRfVEFSR19TRVNTSU9OCTB4MDIKKwkJYWxpYXMJUkVUVVJOXzEKKwl9CisJQVJHXzIgeworCQlzaXplCQkxCisJCWFsaWFzCVJFVFVSTl8yCisJfQorCisJLyoKKwkgKiBTbmFwc2hvdCBvZiBNU0dfT1VUIHRha2VuIGFmdGVyIGVhY2ggbWVzc2FnZSBpcyBzZW50LgorCSAqLworCUxBU1RfTVNHIHsKKwkJc2l6ZQkJMQorCX0KKworCS8qCisJICogU2VxdWVuY2VzIHRoZSBrZXJuZWwgZHJpdmVyIGhhcyBva2F5ZWQgZm9yIHVzLiAgVGhpcyBhbGxvd3MKKwkgKiB0aGUgZHJpdmVyIHRvIGRvIHRoaW5ncyBsaWtlIHByZXZlbnQgaW5pdGlhdG9yIG9yIHRhcmdldAorCSAqIG9wZXJhdGlvbnMuCisJICovCisJU0NTSVNFUV9URU1QTEFURSB7CisJCXNpemUJCTEKKwkJZmllbGQJRU5TRUxPCQkweDQwCisJCWZpZWxkCUVOU0VMSQkJMHgyMAorCQlmaWVsZAlFTlJTRUxJCQkweDEwCisJCWZpZWxkCUVOQVVUT0FUTk8JMHgwOAorCQlmaWVsZAlFTkFVVE9BVE5JCTB4MDQKKwkJZmllbGQJRU5BVVRPQVROUAkweDAyCisJfQorfQorCitzY3JhdGNoX3JhbSB7CisJYWRkcmVzcwkJMHgwNTYKKwlzaXplCQk0CisJLyoKKwkgKiBUaGVzZSBzY3JhdGNoIHJhbSBsb2NhdGlvbnMgYXJlIGluaXRpYWxpemVkIGJ5IHRoZSAyNzRYIEJJT1MuCisJICogV2UgcmV1c2UgdGhlbSBhZnRlciBjYXB0dXJpbmcgdGhlIEJJT1Mgc2V0dGluZ3MgZHVyaW5nCisJICogaW5pdGlhbGl6YXRpb24uCisJICovCisKKwkvKgorCSAqIFRoZSBpbml0aWF0b3Igc3BlY2lmaWVkIHRhZyBmb3IgdGhpcyB0YXJnZXQgbW9kZSB0cmFuc2FjdGlvbi4KKwkgKi8KKwlIQV8yNzRfQklPU0dMT0JBTCB7CisJCXNpemUJMQorCQlmaWVsZAlIQV8yNzRfRVhURU5ERURfVFJBTlMJMHgwMQorCQlhbGlhcwlJTklUSUFUT1JfVEFHCisJfQorCisJU0VRX0ZMQUdTMiB7CisJCXNpemUJMQorCQlmaWVsZAlTQ0JfRE1BCQkJMHgwMQorCQlmaWVsZAlUQVJHRVRfTVNHX1BFTkRJTkcJMHgwMgorCX0KK30KKworc2NyYXRjaF9yYW0geworCWFkZHJlc3MJCTB4MDVhCisJc2l6ZQkJNgorCS8qCisJICogVGhlc2UgYXJlIHJlc2VydmVkIHJlZ2lzdGVycyBpbiB0aGUgY2FyZCdzIHNjcmF0Y2ggcmFtIG9uIHRoZSAyNzQyLgorCSAqIFRoZSBFSVNBIGNvbmZpZ3VyYWl0b24gY2hpcCBpcyBtYXBwZWQgaGVyZS4gIE9uIFJldiBFLiBvZiB0aGUKKwkgKiBhaWM3NzcwLCB0aGUgc2VxdWVuY2VyIGNhbiB1c2UgdGhpcyBhcmVhIGZvciBzY3JhdGNoLCBidXQgdGhlCisJICogaG9zdCBjYW5ub3QgZGlyZWN0bHkgYWNjZXNzIHRoZXNlIHJlZ2lzdGVycy4gIE9uIGxhdGVyIGNoaXBzLCB0aGlzCisJICogYXJlYSBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbiBieSBib3RoIHRoZSBob3N0IGFuZCB0aGUgc2VxdWVuY2VyLgorCSAqIEV2ZW4gb24gbGF0ZXIgY2hpcHMsIG1hbnkgb2YgdGhlc2UgbG9jYXRpb25zIGFyZSBpbml0aWFsaXplZCBieQorCSAqIHRoZSBCSU9TLgorCSAqLworCVNDU0lDT05GIHsKKwkJc2l6ZQkJMQorCQlmaWVsZAlURVJNX0VOQgkweDgwCisJCWZpZWxkCVJFU0VUX1NDU0kJMHg0MAorCQlmaWVsZAlFTlNQQ0hLCQkweDIwCisJCW1hc2sJSFNDU0lJRAkJMHgwNwkvKiBvdXIgU0NTSSBJRCAqLworCQltYXNrCUhXU0NTSUlECTB4MGYJLyogb3VyIFNDU0kgSUQgaWYgV2lkZSBCdXMgKi8KKwl9CisJSU5UREVGIHsKKwkJYWRkcmVzcwkJMHgwNWMKKwkJc2l6ZQkJMQorCQlmaWVsZAlFREdFX1RSSUcJMHg4MAorCQltYXNrCVZFQ1RPUgkJMHgwZgorCX0KKwlIT1NUQ09ORiB7CisJCWFkZHJlc3MJCTB4MDVkCisJCXNpemUJCTEKKwl9CisJSEFfMjc0X0JJT1NDVFJMCXsKKwkJYWRkcmVzcwkJMHgwNWYKKwkJc2l6ZQkJMQorCQltYXNrCUJJT1NNT0RFCQkweDMwCisJCW1hc2sJQklPU0RJU0FCTEVECQkweDMwCQorCQlmaWVsZAlDSEFOTkVMX0JfUFJJTUFSWQkweDA4CisJfQorfQorCitzY3JhdGNoX3JhbSB7CisJYWRkcmVzcwkJMHgwNzAKKwlzaXplCQkxNgorCisJLyoKKwkgKiBQZXIgdGFyZ2V0IFNDU0kgb2Zmc2V0IHZhbHVlcyBmb3IgVWx0cmEyIGNvbnRyb2xsZXJzLgorCSAqLworCVRBUkdfT0ZGU0VUIHsKKwkJc2l6ZQkJMTYKKwl9Cit9CisKK2NvbnN0IFRJRF9TSElGVAkJNAorY29uc3QgU0NCX0xJU1RfTlVMTAkweGZmCitjb25zdCBUQVJHRVRfQ01EX0NNUExUCTB4ZmUKKworY29uc3QgQ0NTR0FERFJfTUFYCTB4ODAKK2NvbnN0IENDU0dSQU1fTUFYU0VHUwkxNgorCisvKiBXRFRSIE1lc3NhZ2UgdmFsdWVzICovCitjb25zdCBCVVNfOF9CSVQJCQkweDAwCitjb25zdCBCVVNfMTZfQklUCQkweDAxCitjb25zdCBCVVNfMzJfQklUCQkweDAyCisKKy8qIE9mZnNldCBtYXhpbXVtcyAqLworY29uc3QgTUFYX09GRlNFVF84QklUCQkweDBmCitjb25zdCBNQVhfT0ZGU0VUXzE2QklUCQkweDA4Citjb25zdCBNQVhfT0ZGU0VUX1VMVFJBMgkJMHg3ZgorY29uc3QgTUFYX09GRlNFVAkJMHg3ZgorY29uc3QgSE9TVF9NU0cJCQkweGZmCisKKy8qIFRhcmdldCBtb2RlIGNvbW1hbmQgcHJvY2Vzc2luZyBjb25zdGFudHMgKi8KK2NvbnN0IENNRF9HUk9VUF9DT0RFX1NISUZUCTB4MDUKKworY29uc3QgU1RBVFVTX0JVU1kJCTB4MDgKK2NvbnN0IFNUQVRVU19RVUVVRV9GVUxMCTB4MjgKK2NvbnN0IFRBUkdFVF9EQVRBX0lOCQkxCisKKy8qCisgKiBEb3dubG9hZGVkIChrZXJuZWwgaW5zZXJ0ZWQpIGNvbnN0YW50cworICovCisvKiBPZmZzZXRzIGludG8gdGhlIFNDQklEIGFycmF5IHdoZXJlIGRpZmZlcmVudCBkYXRhIGlzIHN0b3JlZCAqLworY29uc3QgUU9VVEZJRk9fT0ZGU0VUIGRvd25sb2FkCitjb25zdCBRSU5GSUZPX09GRlNFVCBkb3dubG9hZAorY29uc3QgQ0FDSEVTSVpFX01BU0sgZG93bmxvYWQKK2NvbnN0IElOVkVSVEVEX0NBQ0hFU0laRV9NQVNLIGRvd25sb2FkCitjb25zdCBTR19QUkVGRVRDSF9DTlQgZG93bmxvYWQKK2NvbnN0IFNHX1BSRUZFVENIX0FMSUdOX01BU0sgZG93bmxvYWQKK2NvbnN0IFNHX1BSRUZFVENIX0FERFJfTUFTSyBkb3dubG9hZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5zZXEgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LnNlcQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODRiNzQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5zZXEKQEAgLTAsMCArMSwyMzk4IEBACisvKgorICogQWRhcHRlYyAyNzR4LzI4NHgvMjk0eCBkZXZpY2UgZHJpdmVyIGZpcm13YXJlIGZvciBMaW51eCBhbmQgRnJlZUJTRC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMjAwMSBKdXN0aW4gVC4gR2liYnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCitWRVJTSU9OID0gIiRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5zZXEjNTYgJCIKK1BBVENIX0FSR19MSVNUID0gInN0cnVjdCBhaGNfc29mdGMgKmFoYyIKK1BSRUZJWCA9ICJhaGNfIgorCisjaW5jbHVkZSAiYWljN3h4eC5yZWciCisjaW5jbHVkZSAic2NzaV9tZXNzYWdlLmgiCisKKy8qCisgKiBBIGZldyB3b3JkcyBvbiB0aGUgd2FpdGluZyBTQ0IgbGlzdDoKKyAqIEFmdGVyIHN0YXJ0aW5nIHRoZSBzZWxlY3Rpb24gaGFyZHdhcmUsIHdlIGNoZWNrIGZvciByZWNvbm5lY3RpbmcgdGFyZ2V0cworICogYXMgd2VsbCBhcyBmb3Igb3VyIHNlbGVjdGlvbiB0byBjb21wbGV0ZSBqdXN0IGluIGNhc2UgdGhlIHJlc2VsZWN0aW9uIHdpbnMKKyAqIGJ1cyBhcmJpdHJhdGlvbi4gIFRoZSBwcm9ibGVtIHdpdGggdGhpcyBpcyB0aGF0IHdlIG11c3Qga2VlcCB0cmFjayBvZiB0aGUKKyAqIFNDQiB0aGF0IHdlJ3ZlIGFscmVhZHkgcHVsbGVkIGZyb20gdGhlIFFJTkZJRk8gYW5kIHN0YXJ0ZWQgdGhlIHNlbGVjdGlvbgorICogb24ganVzdCBpbiBjYXNlIHRoZSByZXNlbGVjdGlvbiB3aW5zIHNvIHRoYXQgd2UgY2FuIHJldHJ5IHRoZSBzZWxlY3Rpb24gYXQKKyAqIGEgbGF0ZXIgdGltZS4gIFRoaXMgcHJvYmxlbSBjYW5ub3QgYmUgcmVzb2x2ZWQgYnkgaG9sZGluZyBhIHNpbmdsZSBlbnRyeQorICogaW4gc2NyYXRjaCByYW0gc2luY2UgYSByZWNvbm5lY3RpbmcgdGFyZ2V0IGNhbiByZXF1ZXN0IHNlbnNlIGFuZCB0aGlzIHdpbGwKKyAqIGNyZWF0ZSB5ZXQgYW5vdGhlciBTQ0Igd2FpdGluZyBmb3Igc2VsZWN0aW9uLiAgVGhlIHNvbHV0aW9uIHVzZWQgaGVyZSBpcyB0byAKKyAqIHVzZSBieXRlIDI3IG9mIHRoZSBTQ0IgYXMgYSBwc3VlZG8tbmV4dCBwb2ludGVyIGFuZCB0byB0aHJlYWQgYSBsaXN0CisgKiBvZiBTQ0JzIHRoYXQgYXJlIGF3YWl0aW5nIHNlbGVjdGlvbi4gIFNpbmNlIDAtMHhmZSBhcmUgdmFsaWQgU0NCIGluZGV4ZXMsIAorICogU0NCX0xJU1RfTlVMTCBpcyAweGZmIHdoaWNoIGlzIG91dCBvZiByYW5nZS4gIEFuIGVudHJ5IGlzIGFsc28gYWRkZWQgdG8KKyAqIHRoaXMgbGlzdCBldmVyeXRpbWUgYSByZXF1ZXN0IHNlbnNlIG9jY3VycyBvciBhZnRlciBjb21wbGV0aW5nIGEgbm9uLXRhZ2dlZAorICogY29tbWFuZCBmb3Igd2hpY2ggYSBzZWNvbmQgU0NCIGhhcyBiZWVuIHF1ZXVlZC4gIFRoZSBzZXF1ZW5jZXIgd2lsbAorICogYXV0b21hdGljYWxseSBjb25zdW1lIHRoZSBlbnRyaWVzLgorICovCisKK2J1c19mcmVlX3NlbDoKKwkvKgorCSAqIFR1cm4gb2ZmIHRoZSBzZWxlY3Rpb24gaGFyZHdhcmUuICBXZSBuZWVkIHRvIHJlc2V0IHRoZQorCSAqIHNlbGVjdGlvbiByZXF1ZXN0IGluIG9yZGVyIHRvIHBlcmZvcm0gYSBuZXcgc2VsZWN0aW9uLgorCSAqLworCWFuZAlTQ1NJU0VRLCBURU1PREV8RU5TRUxJfEVOUlNFTEl8RU5BVVRPQVROUDsKKwlhbmQJU0lNT0RFMSwgfkVOQlVTRlJFRTsKK3BvbGxfZm9yX3dvcms6CisJY2FsbAljbGVhcl90YXJnZXRfc3RhdGU7CisJYW5kCVNYRlJDVEwwLCB+U1BJT0VOOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJY2xyCVNDU0lCVVNMOworCX0KKwl0ZXN0CVNDU0lTRVEsIEVOU0VMTwlqbnogcG9sbF9mb3Jfc2VsZWN0aW9uOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSAhPSAwKSB7CisJCXhvcglTQkxLQ1RMLFNFTEJVU0I7CS8qIFRvZ2dsZSB0byB0aGUgb3RoZXIgYnVzICovCisJCXRlc3QJU0NTSVNFUSwgRU5TRUxPCQlqbnogcG9sbF9mb3Jfc2VsZWN0aW9uOworCX0KKwljbXAJV0FJVElOR19TQ0JILFNDQl9MSVNUX05VTEwgam5lIHN0YXJ0X3dhaXRpbmc7Citwb2xsX2Zvcl93b3JrX2xvb3A6CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pICE9IDApIHsKKwkJeG9yCVNCTEtDVEwsU0VMQlVTQjsJLyogVG9nZ2xlIHRvIHRoZSBvdGhlciBidXMgKi8KKwl9CisJdGVzdAlTU1RBVDAsIFNFTERPfFNFTERJCWpueiBzZWxlY3Rpb247Cit0ZXN0X3F1ZXVlOgorCS8qIEhhcyB0aGUgZHJpdmVyIHBvc3RlZCBhbnkgd29yayBmb3IgdXM/ICovCitCRUdJTl9DUklUSUNBTDsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfUVVFVUVfUkVHUykgIT0gMCkgeworCQl0ZXN0CVFPRkZfQ1RMU1RBLCBTQ0JfQVZBSUwganogcG9sbF9mb3Jfd29ya19sb29wOworCX0gZWxzZSB7CisJCW1vdglBLCBRSU5QT1M7CisJCWNtcAlLRVJORUxfUUlOUE9TLCBBIGplIHBvbGxfZm9yX3dvcmtfbG9vcDsKKwl9CisJbW92CUFSR18xLCBORVhUX1FVRVVFRF9TQ0I7CisKKwkvKgorCSAqIFdlIGhhdmUgYXQgbGVhc3Qgb25lIHF1ZXVlZCBTQ0Igbm93IGFuZCB3ZSBkb24ndCBoYXZlIGFueSAKKwkgKiBTQ0JzIGluIHRoZSBsaXN0IG9mIFNDQnMgYXdhaXRpbmcgc2VsZWN0aW9uLiAgQWxsb2NhdGUgYQorCSAqIGNhcmQgU0NCIGZvciB0aGUgaG9zdCdzIFNDQiBhbmQgZ2V0IHRvIHdvcmsgb24gaXQuCisJICovCisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKSB7CisJCW1vdglBTExaRVJPUwljYWxsCWdldF9mcmVlX29yX2Rpc2Nfc2NiOworCX0gZWxzZSB7CisJCS8qIEluIHRoZSBub24tcGFnaW5nIGNhc2UsIHRoZSBTQ0JJRCA9PSBoYXJkd2FyZSBTQ0IgaW5kZXggKi8KKwkJbW92CVNDQlBUUiwgQVJHXzE7CisJfQorCW9yCVNFUV9GTEFHUzIsIFNDQl9ETUE7CitFTkRfQ1JJVElDQUw7CitkbWFfcXVldWVkX3NjYjoKKwkvKgorCSAqIERNQSB0aGUgU0NCIGZyb20gaG9zdCByYW0gaW50byB0aGUgY3VycmVudCBTQ0IgbG9jYXRpb24uCisJICovCisJbXZpCURNQVBBUkFNUywgSERNQUVOfERJUkVDVElPTnxGSUZPUkVTRVQ7CisJbW92CUFSR18xCWNhbGwgZG1hX3NjYjsKKwkvKgorCSAqIENoZWNrIG9uZSBsYXN0IHRpbWUgdG8gc2VlIGlmIHRoaXMgU0NCIHdhcyBjYW5jZWxlZAorCSAqIGJlZm9yZSB3ZSBjb21wbGV0ZWQgdGhlIERNQSBvcGVyYXRpb24uICBJZiBpdCB3YXMsCisJICogdGhlIFFJTkZJRk8gbmV4dCBwb2ludGVyIHdpbGwgbm90IG1hdGNoIG91ciBzYXZlZAorCSAqIHZhbHVlLgorCSAqLworCW1vdglBLCBBUkdfMTsKK0JFR0lOX0NSSVRJQ0FMOworCWNtcAlORVhUX1FVRVVFRF9TQ0IsIEEgam5lIGFib3J0X3FpbnNjYjsKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfU0VRVUVOQ0VSX0RFQlVHKSAhPSAwKSB7CisJCWNtcAlTQ0JfVEFHLCBBIGplIC4gKyAyOworCQltdmkJU0NCX01JU01BVENIIGNhbGwgc2V0X3NlcWludDsKKwl9CisJbW92CU5FWFRfUVVFVUVEX1NDQiwgU0NCX05FWFQ7CisJbW92CVNDQl9ORVhULFdBSVRJTkdfU0NCSDsKKwltb3YJV0FJVElOR19TQ0JILCBTQ0JQVFI7CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpICE9IDApIHsKKwkJbW92CU5PTkUsIFNOU0NCX1FPRkY7CisJfSBlbHNlIHsKKwkJaW5jCVFJTlBPUzsKKwl9CisJYW5kCVNFUV9GTEFHUzIsIH5TQ0JfRE1BOworRU5EX0NSSVRJQ0FMOworc3RhcnRfd2FpdGluZzoKKwkvKgorCSAqIFN0YXJ0IHRoZSBmaXJzdCBlbnRyeSBvbiB0aGUgd2FpdGluZyBTQ0IgbGlzdC4KKwkgKi8KKwltb3YJU0NCUFRSLCBXQUlUSU5HX1NDQkg7CisJY2FsbAlzdGFydF9zZWxlY3Rpb247CisKK3BvbGxfZm9yX3NlbGVjdGlvbjoKKwkvKgorCSAqIFR3aW4gY2hhbm5lbCBkZXZpY2VzIGNhbm5vdCBoYW5kbGUgdGhpbmdzIGxpa2UgU0VMVE8KKwkgKiBpbnRlcnJ1cHRzIG9uIHRoZSAiYmFja2dyb3VuZCIgY2hhbm5lbC4gIFNvLCB3aGlsZQorCSAqIHNlbGVjdGluZywga2VlcCBwb2xsaW5nIHRoZSBjdXJyZW50IGNoYW5uZWwgdW50aWwKKwkgKiBlaXRoZXIgYSBzZWxlY3Rpb24gb3IgcmVzZWxlY3Rpb24gb2NjdXJzLgorCSAqLworCXRlc3QJU1NUQVQwLCBTRUxET3xTRUxESQlqeiBwb2xsX2Zvcl9zZWxlY3Rpb247CisKK3NlbGVjdGlvbjoKKwkvKgorCSAqIFdlIGFyZW4ndCBleHBlY3RpbmcgYSBidXMgZnJlZSwgc28gaW50ZXJydXB0CisJICogdGhlIGtlcm5lbCBkcml2ZXIgaWYgaXQgaGFwcGVucy4KKwkgKi8KKwltdmkJQ0xSU0lOVDEsQ0xSQlVTRlJFRTsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfRFQpID09IDApIHsKKwkJb3IJU0lNT0RFMSwgRU5CVVNGUkVFOworCX0KKworCS8qCisJICogR3VhcmQgYWdhaW5zdCBhIGJ1cyBmcmVlIGFmdGVyIChyZSlzZWxlY3Rpb24KKwkgKiBidXQgcHJpb3IgdG8gZW5hYmxpbmcgdGhlIGJ1c2ZyZWUgaW50ZXJydXB0LiAgU0VMREkKKwkgKiBhbmQgU0VMRE8gd2lsbCBiZSBjbGVhcmVkIGluIHRoYXQgY2FzZS4KKwkgKi8KKwl0ZXN0CVNTVEFUMCwgU0VMREl8U0VMRE8JanogYnVzX2ZyZWVfc2VsOworCXRlc3QJU1NUQVQwLFNFTERPCWpueiBzZWxlY3Rfb3V0Oworc2VsZWN0X2luOgorCWlmICgoYWhjLT5mbGFncyAmIEFIQ19UQVJHRVRST0xFKSAhPSAwKSB7CisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19JTklUSUFUT1JST0xFKSAhPSAwKSB7CisJCQl0ZXN0CVNTVEFUMCwgVEFSR0VUCWp6IGluaXRpYXRvcl9yZXNlbGVjdDsKKwkJfQorCQltdmkJQ0xSU0lOVDAsIENMUlNFTERJOworCisJCS8qCisJCSAqIFdlJ3ZlIGp1c3QgYmVlbiBzZWxlY3RlZC4gIEFzc2VydCBCU1kgYW5kCisJCSAqIHNldHVwIHRoZSBwaGFzZSBmb3IgcmVjZWl2aW5nIG1lc3NhZ2VzCisJCSAqIGZyb20gdGhlIHRhcmdldC4KKwkJICovCisJCW12aQlTQ1NJU0lHTywgUF9NRVNHT1VUfEJTWU87CisKKwkJLyoKKwkJICogU2V0dXAgdGhlIERNQSBmb3Igc2VuZGluZyB0aGUgaWRlbnRpZnkgYW5kCisJCSAqIGNvbW1hbmQgaW5mb3JtYXRpb24uCisJCSAqLworCQltdmkJU0VRX0ZMQUdTLCBDTURQSEFTRV9QRU5ESU5HOworCisJCW1vdiAgICAgQSwgVFFJTlBPUzsKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCQltdmkJRElOREVYLCBDQ0hBRERSOworCQkJbXZpCVNIQVJFRF9EQVRBX0FERFIgY2FsbCBzZXRfMzJieXRlX2FkZHI7CisJCQltdmkJQ0NTQ0JDVEwsIENDU0NCUkVTRVQ7CisJCX0gZWxzZSB7CisJCQltdmkJRElOREVYLCBIQUREUjsKKwkJCW12aQlTSEFSRURfREFUQV9BRERSIGNhbGwgc2V0XzMyYnl0ZV9hZGRyOworCQkJbXZpCURGQ05UUkwsIEZJRk9SRVNFVDsKKwkJfQorCisJCS8qIEluaXRpYXRvciB0aGF0IHNlbGVjdGVkIHVzICovCisJCWFuZAlTQVZFRF9TQ1NJSUQsIFNFTElEX01BU0ssIFNFTElEOworCQkvKiBUaGUgVGFyZ2V0IElEIHdlIHdlcmUgc2VsZWN0ZWQgYXQgKi8KKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX01VTFRJX1RJRCkgIT0gMCkgeworCQkJYW5kCUEsIE9JRCwgVEFSR0lESU47CisJCX0gZWxzZSBpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCQlhbmQJQSwgT0lELCBTQ1NJSURfVUxUUkEyOworCQl9IGVsc2UgeworCQkJYW5kCUEsIE9JRCwgU0NTSUlEOworCQl9CisJCW9yCVNBVkVEX1NDU0lJRCwgQTsKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pICE9IDApIHsKKwkJCXRlc3QgCVNCTEtDVEwsIFNFTEJVU0IganogLiArIDI7CisJCQlvcglTQVZFRF9TQ1NJSUQsIFRXSU5fQ0hOTEI7CisJCX0KKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCQltb3YJQ0NTQ0JSQU0sIFNBVkVEX1NDU0lJRDsKKwkJfSBlbHNlIHsKKwkJCW1vdglERkRBVCwgU0FWRURfU0NTSUlEOworCQl9CisKKwkJLyoKKwkJICogSWYgQVROIGlzbid0IGFzc2VydGVkLCB0aGUgdGFyZ2V0IGlzbid0IGludGVyZXN0ZWQKKwkJICogaW4gdGFsa2luZyB0byB1cy4gIEdvIGRpcmVjdGx5IHRvIGJ1cyBmcmVlLgorCQkgKiBYWFggU0NTSS0xIG1heSByZXF1aXJlIHVzIHRvIGFzc3VtZSBsdW4gMCBpZgorCQkgKiBBVE4gaXMgZmFsc2UuCisJCSAqLworCQl0ZXN0CVNDU0lTSUdJLCBBVE5JCWp6CXRhcmdldF9idXNmcmVlOworCisJCS8qCisJCSAqIFdhdGNoIEFUTiBjbG9zZWx5IG5vdyBhcyB3ZSBwdWxsIGluIG1lc3NhZ2VzIGZyb20gdGhlCisJCSAqIGluaXRpYXRvci4gIFdlIGZvbGxvdyB0aGUgZ3VpZGxpbmVzIGZyb20gc2VjdGlvbiA2LjUKKwkJICogb2YgdGhlIFNDU0ktMiBzcGVjIGZvciB3aGF0IG1lc3NhZ2VzIGFyZSBhbGxvd2VkIHdoZW4uCisJCSAqLworCQljYWxsCXRhcmdldF9pbmI7CisKKwkJLyoKKwkJICogT3VyIGZpcnN0IG1lc3NhZ2UgbXVzdCBiZSBvbmUgb2YgSURFTlRJRlksIEFCT1JULCBvcgorCQkgKiBCVVNfREVWSUNFX1JFU0VULgorCQkgKi8KKwkJdGVzdAlESU5ERVgsIE1TR19JREVOVElGWUZMQUcganogaG9zdF90YXJnZXRfbWVzc2FnZV9sb29wOworCQkvKiBTdG9yZSBmb3IgaG9zdCAqLworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJCW1vdglDQ1NDQlJBTSwgRElOREVYOworCQl9IGVsc2UgeworCQkJbW92CURGREFULCBESU5ERVg7CisJCX0KKwkJYW5kCVNBVkVEX0xVTiwgTVNHX0lERU5USUZZX0xVTk1BU0ssIERJTkRFWDsKKworCQkvKiBSZW1lbWJlciBmb3IgZGlzY29ubmVjdGlvbiBkZWNpc2lvbiAqLworCQl0ZXN0CURJTkRFWCwgTVNHX0lERU5USUZZX0RJU0NGTEFHIGpueiAuICsgMjsKKwkJLyogWFhYIEhvbm9yIHBlciB0YXJnZXQgc2V0dGluZ3MgdG9vICovCisJCW9yCVNFUV9GTEFHUywgTk9fRElTQ09OTkVDVDsKKworCQl0ZXN0CVNDU0lTSUdJLCBBVE5JCWp6CWlkZW50X21lc3NhZ2VzX2RvbmU7CisJCWNhbGwJdGFyZ2V0X2luYjsKKwkJLyoKKwkJICogSWYgdGhpcyBpcyBhIHRhZ2dlZCByZXF1ZXN0LCB0aGUgdGFnZ2VkIG1lc3NhZ2UgbXVzdAorCQkgKiBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIGlkZW50aWZ5LiAgV2UgdGVzdCBmb3IgYSB2YWxpZAorCQkgKiB0YWcgbWVzc2FnZSBieSBzZWVpbmcgaWYgaXQgaXMgPj0gTVNHX1NJTVBMRV9RX1RBRyBhbmQKKwkJICogPCBNU0dfSUdOX1dJREVfUkVTSURVRS4KKwkJICovCisJCWFkZAlBLCAtTVNHX1NJTVBMRV9RX1RBRywgRElOREVYOworCQlqbmMJaWRlbnRfbWVzc2FnZXNfZG9uZV9tc2dfcGVuZGluZzsKKwkJYWRkCUEsIC1NU0dfSUdOX1dJREVfUkVTSURVRSwgRElOREVYOworCQlqYwlpZGVudF9tZXNzYWdlc19kb25lX21zZ19wZW5kaW5nOworCisJCS8qIFN0b3JlIGZvciBob3N0ICovCisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQkJbW92CUNDU0NCUkFNLCBESU5ERVg7CisJCX0gZWxzZSB7CisJCQltb3YJREZEQVQsIERJTkRFWDsKKwkJfQorCQkKKwkJLyoKKwkJICogSWYgdGhlIGluaXRpYXRvciBkb2Vzbid0IGZlZWwgbGlrZSBwcm92aWRpbmcgYSB0YWcgbnVtYmVyLAorCQkgKiB3ZSd2ZSBnb3QgYSBmYWlsZWQgc2VsZWN0aW9uIGFuZCBtdXN0IHRyYW5zaXRpb24gdG8gYnVzCisJCSAqIGZyZWUuCisJCSAqLworCQl0ZXN0CVNDU0lTSUdJLCBBVE5JCWp6CXRhcmdldF9idXNmcmVlOworCisJCS8qCisJCSAqIFN0b3JlIHRoZSB0YWcgZm9yIHRoZSBob3N0LgorCQkgKi8KKwkJY2FsbAl0YXJnZXRfaW5iOworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJCW1vdglDQ1NDQlJBTSwgRElOREVYOworCQl9IGVsc2UgeworCQkJbW92CURGREFULCBESU5ERVg7CisJCX0KKwkJbW92CUlOSVRJQVRPUl9UQUcsIERJTkRFWDsKKwkJb3IJU0VRX0ZMQUdTLCBUQVJHRVRfQ01EX0lTX1RBR0dFRDsKKworaWRlbnRfbWVzc2FnZXNfZG9uZToKKwkJLyogVGVybWluYXRlIHRoZSBpZGVudCBsaXN0ICovCisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQkJbXZpCUNDU0NCUkFNLCBTQ0JfTElTVF9OVUxMOworCQl9IGVsc2UgeworCQkJbXZpCURGREFULCBTQ0JfTElTVF9OVUxMOworCQl9CisJCW9yCVNFUV9GTEFHUywgVEFSR19DTURfUEVORElORzsKKwkJdGVzdAlTRVFfRkxBR1MyLCBUQVJHRVRfTVNHX1BFTkRJTkcKKwkJCWpueiB0YXJnZXRfbWVzZ291dF9wZW5kaW5nOworCQl0ZXN0CVNDU0lTSUdJLCBBVE5JIGpueiB0YXJnZXRfbWVzZ291dF9jb250aW51ZTsKKwkJam1wCXRhcmdldF9JVGxvb3A7CisKKworaWRlbnRfbWVzc2FnZXNfZG9uZV9tc2dfcGVuZGluZzoKKwkJb3IJU0VRX0ZMQUdTMiwgVEFSR0VUX01TR19QRU5ESU5HOworCQlqbXAJaWRlbnRfbWVzc2FnZXNfZG9uZTsKKworCQkvKgorCQkgKiBQdXNoZWQgbWVzc2FnZSBsb29wIHRvIGFsbG93IHRoZSBrZXJuZWwgdG8KKwkJICogcnVuIGl0J3Mgb3duIHRhcmdldCBtb2RlIG1lc3NhZ2Ugc3RhdGUgZW5naW5lLgorCQkgKi8KK2hvc3RfdGFyZ2V0X21lc3NhZ2VfbG9vcDoKKwkJbXZpCUhPU1RfTVNHX0xPT1AgY2FsbCBzZXRfc2VxaW50OworCQljbXAJUkVUVVJOXzEsIEVYSVRfTVNHX0xPT1AJamUgdGFyZ2V0X0lUbG9vcDsKKwkJdGVzdAlTU1RBVDAsIFNQSU9SRFkganogLjsKKwkJam1wCWhvc3RfdGFyZ2V0X21lc3NhZ2VfbG9vcDsKKwl9CisKK2lmICgoYWhjLT5mbGFncyAmIEFIQ19JTklUSUFUT1JST0xFKSAhPSAwKSB7CisvKgorICogUmVzZWxlY3Rpb24gaGFzIGJlZW4gaW5pdGlhdGVkIGJ5IGEgdGFyZ2V0LiBNYWtlIGEgbm90ZSB0aGF0IHdlJ3ZlIGJlZW4KKyAqIHJlc2VsZWN0ZWQsIGJ1dCBoYXZlbid0IHNlZW4gYW4gSURFTlRJRlkgbWVzc2FnZSBmcm9tIHRoZSB0YXJnZXQgeWV0LgorICovCitpbml0aWF0b3JfcmVzZWxlY3Q6CisJLyogWFhYIHRlc3QgZm9yIGFuZCBoYW5kbGUgT05FIEJJVCBjb25kaXRpb24gKi8KKwlvcglTWEZSQ1RMMCwgU1BJT0VOfENMUlNUQ05UfENMUkNITjsKKwlhbmQJU0FWRURfU0NTSUlELCBTRUxJRF9NQVNLLCBTRUxJRDsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCWFuZAlBLCBPSUQsIFNDU0lJRF9VTFRSQTI7CisJfSBlbHNlIHsKKwkJYW5kCUEsIE9JRCwgU0NTSUlEOworCX0KKwlvcglTQVZFRF9TQ1NJSUQsIEE7CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pICE9IDApIHsKKwkJdGVzdAlTQkxLQ1RMLCBTRUxCVVNCCWp6IC4gKyAyOworCQlvcglTQVZFRF9TQ1NJSUQsIFRXSU5fQ0hOTEI7CisJfQorCW12aQlDTFJTSU5UMCwgQ0xSU0VMREk7CisJam1wCUlUbG9vcDsKK30KKworYWJvcnRfcWluc2NiOgorCWNhbGwJYWRkX3NjYl90b19mcmVlX2xpc3Q7CisJam1wCXBvbGxfZm9yX3dvcmtfbG9vcDsKKworc3RhcnRfc2VsZWN0aW9uOgorCS8qCisJICogSWYgYnVzIHJlc2V0IGludGVycnVwdHMgaGF2ZSBiZWVuIGRpc2FibGVkIChmcm9tIGEgcHJldmlvdXMKKwkgKiByZXNldCksIHJlLWVuYWJsZSB0aGVtIG5vdy4gIFJlc2V0cyBhcmUgb25seSBvZiBpbnRlcmVzdAorCSAqIHdoZW4gd2UgaGF2ZSBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbnMsIHNvIHdlIGNhbiBzYWZlbHkKKwkgKiBkZWZlciByZS1lbmFibGluZyB0aGUgaW50ZXJydXB0IHVudGlsLCBhcyBhbiBpbml0aWF0b3IsCisJICogd2Ugc3RhcnQgc2VuZGluZyBvdXQgdHJhbnNhY3Rpb25zIGFnYWluLgorCSAqLworCXRlc3QJU0lNT0RFMSwgRU5TQ1NJUlNUCWpueiAuICsgMzsKKwltdmkJQ0xSU0lOVDEsIENMUlNDU0lSU1RJOworCW9yCVNJTU9ERTEsIEVOU0NTSVJTVDsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVFdJTikgIT0gMCkgeworCQlhbmQJU0lOREVYLH5TRUxCVVNCLFNCTEtDVEw7LyogQ2xlYXIgY2hhbm5lbCBzZWxlY3QgYml0ICovCisJCXRlc3QJU0NCX1NDU0lJRCwgVFdJTl9DSE5MQiBqeiAuICsgMjsKKwkJb3IJU0lOREVYLCBTRUxCVVNCOworCQltb3YJU0JMS0NUTCxTSU5ERVg7CQkvKiBzZWxlY3QgY2hhbm5lbCAqLworCX0KK2luaXRpYWxpemVfc2NzaWlkOgorCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJbW92CVNDU0lJRF9VTFRSQTIsIFNDQl9TQ1NJSUQ7CisJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSAhPSAwKSB7CisJCWFuZAlTQ1NJSUQsIFRXSU5fVElEfE9JRCwgU0NCX1NDU0lJRDsKKwl9IGVsc2UgeworCQltb3YJU0NTSUlELCBTQ0JfU0NTSUlEOworCX0KKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfVEFSR0VUUk9MRSkgIT0gMCkgeworCQltb3YJU0lOREVYLCBTQ1NJU0VRX1RFTVBMQVRFOworCQl0ZXN0CVNDQl9DT05UUk9MLCBUQVJHRVRfU0NCIGp6IC4gKyAyOworCQlvcglTSU5ERVgsIFRFTU9ERTsKKwkJbW92CVNDU0lTRVEsIFNJTkRFWCByZXQ7CisJfSBlbHNlIHsKKwkJbW92CVNDU0lTRVEsIFNDU0lTRVFfVEVNUExBVEUgcmV0OworCX0KKworLyoKKyAqIEluaXRpYWxpemUgdHJhbnNmZXIgc2V0dGluZ3Mgd2l0aCBTQ0IgcHJvdmlkZWQgc2V0dGluZ3MuCisgKi8KK3NldF90cmFuc2Zlcl9zZXR0aW5nczoKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEpICE9IDApIHsKKwkJdGVzdAlTQ0JfQ09OVFJPTCwgVUxUUkFFTkIganogLiArIDI7CisJCW9yCVNYRlJDVEwwLCBGQVNUMjA7CisJfSAKKwkvKgorCSAqIEluaXRpYWxpemUgU0NTSVJBVEUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgZm9yIHRoaXMgdGFyZ2V0LgorCSAqLworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJYm1vdglTQ1NJUkFURSwgU0NCX1NDU0lSQVRFLCAyIHJldDsKKwl9IGVsc2UgeworCQltb3YJU0NTSVJBVEUsIFNDQl9TQ1NJUkFURSByZXQ7CisJfQorCitpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfVEFSR0VUUk9MRSkgIT0gMCkgeworLyoKKyAqIFdlIGNhcmVmdWxseSB0b2dnbGUgU1BJT0VOIHRvIGFsbG93IHVzIHRvIHJldHVybiB0aGUgCisgKiBtZXNzYWdlIGJ5dGUgd2UgcmVjZWl2ZSBzbyBpdCBjYW4gYmUgY2hlY2tlZCBwcmlvciB0bworICogZHJpdmluZyBSRVEgb24gdGhlIGJ1cyBmb3IgdGhlIG5leHQgYnl0ZS4KKyAqLwordGFyZ2V0X2luYjoKKwkvKgorCSAqIERyaXZlIFJFUSBvbiB0aGUgYnVzIGJ5IGVuYWJsaW5nIFNDU0kgUElPLgorCSAqLworCW9yCVNYRlJDVEwwLCBTUElPRU47CisJLyogV2FpdCBmb3IgdGhlIGJ5dGUgKi8KKwl0ZXN0CVNTVEFUMCwgU1BJT1JEWSBqeiAuOworCS8qIFByZXZlbnQgb3VyIHJlYWQgZnJvbSB0cmlnZ2VyaW5nIGFub3RoZXIgUkVRICovCisJYW5kCVNYRlJDVEwwLCB+U1BJT0VOOworCS8qIFNhdmUgbGF0Y2hlZCBjb250ZW50cyAqLworCW1vdglESU5ERVgsIFNDU0lEQVRMIHJldDsKK30KKworLyoKKyAqIEFmdGVyIHRoZSBzZWxlY3Rpb24sIHJlbW92ZSB0aGlzIFNDQiBmcm9tIHRoZSAid2FpdGluZyBTQ0IiCisgKiBsaXN0LiAgVGhpcyBpcyBhY2hpZXZlZCBieSBzaW1wbHkgbW92aW5nIG91ciAibmV4dCIgcG9pbnRlciBpbnRvCisgKiBXQUlUSU5HX1NDQkguICBPdXIgbmV4dCBwb2ludGVyIHdpbGwgYmUgc2V0IHRvIG51bGwgdGhlIG5leHQgdGltZSB0aGlzCisgKiBTQ0IgaXMgdXNlZCwgc28gZG9uJ3QgYm90aGVyIHdpdGggaXQgbm93LgorICovCitzZWxlY3Rfb3V0OgorCS8qIFR1cm4gb2ZmIHRoZSBzZWxlY3Rpb24gaGFyZHdhcmUgKi8KKwlhbmQJU0NTSVNFUSwgVEVNT0RFfEVOU0VMSXxFTlJTRUxJfEVOQVVUT0FUTlAsIFNDU0lTRVE7CisJbW92CVNDQlBUUiwgV0FJVElOR19TQ0JIOworCW1vdglXQUlUSU5HX1NDQkgsU0NCX05FWFQ7CisJbW92CVNBVkVEX1NDU0lJRCwgU0NCX1NDU0lJRDsKKwlhbmQJU0FWRURfTFVOLCBMSUQsIFNDQl9MVU47CisJY2FsbAlzZXRfdHJhbnNmZXJfc2V0dGluZ3M7CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1RBUkdFVFJPTEUpICE9IDApIHsKKwkJdGVzdAlTU1RBVDAsIFRBUkdFVAlqeiBpbml0aWF0b3Jfc2VsZWN0OworCisJCW9yCVNYRlJDVEwwLCBDTFJTVENOVHxDTFJDSE47CisKKwkJLyoKKwkJICogUHV0IHRhZyBpbiBjb25ub25pY2FsIGxvY2F0aW9uIHNpbmNlIG5vdAorCQkgKiBhbGwgY29ubmVjdGlvbnMgaGF2ZSBhbiBTQ0IuCisJCSAqLworCQltb3YJSU5JVElBVE9SX1RBRywgU0NCX1RBUkdFVF9JVEFHOworCisJCS8qCisJCSAqIFdlJ3ZlIGp1c3QgcmUtc2VsZWN0ZWQgYW4gaW5pdGlhdG9yLgorCQkgKiBBc3NlcnQgQlNZIGFuZCBzZXR1cCB0aGUgcGhhc2UgZm9yCisJCSAqIHNlbmRpbmcgb3VyIGlkZW50aWZ5IG1lc3NhZ2VzLgorCQkgKi8KKwkJbXZpCVBfTUVTR0lOfEJTWU8gY2FsbCBjaGFuZ2VfcGhhc2U7CisJCW12aQlDTFJTSU5UMCwgQ0xSU0VMRE87CisKKwkJLyoKKwkJICogU3RhcnQgb3V0IHdpdGggYSBzaW1wbGUgaWRlbnRpZnkgbWVzc2FnZS4KKwkJICovCisJCW9yCVNBVkVEX0xVTiwgTVNHX0lERU5USUZZRkxBRyBjYWxsIHRhcmdldF9vdXRiOworCisJCS8qCisJCSAqIElmIHdlIGFyZSB0aGUgcmVzdWx0IG9mIGEgdGFnZ2VkIGNvbW1hbmQsIHNlbmQKKwkJICogYSBzaW1wbGUgUSB0YWcgYW5kIHRoZSB0YWcgaWQuCisJCSAqLworCQl0ZXN0CVNDQl9DT05UUk9MLCBUQUdfRU5CCWp6IC4gKyAzOworCQltdmkJTVNHX1NJTVBMRV9RX1RBRyBjYWxsIHRhcmdldF9vdXRiOworCQltb3YJU0NCX1RBUkdFVF9JVEFHIGNhbGwgdGFyZ2V0X291dGI7Cit0YXJnZXRfc3luY2NtZDoKKwkJLyoKKwkJICogTm93IGRldGVybWluZSB3aGF0IHBoYXNlcyB0aGUgaG9zdCB3YW50cyB1cworCQkgKiB0byBnbyB0aHJvdWdoLgorCQkgKi8KKwkJbW92CVNFUV9GTEFHUywgU0NCX1RBUkdFVF9QSEFTRVM7CisJCQorCQl0ZXN0CVNDQl9DT05UUk9MLCBNS19NRVNTQUdFCWp6IHRhcmdldF9JVGxvb3A7CisJCW12aQlQX01FU0dJTnxCU1lPIGNhbGwgY2hhbmdlX3BoYXNlOworCQlqbXAJaG9zdF90YXJnZXRfbWVzc2FnZV9sb29wOwordGFyZ2V0X0lUbG9vcDoKKwkJLyoKKwkJICogU3RhcnQgaG9ub3JpbmcgQVROIHNpZ25hbHMgbm93IHRoYXQKKwkJICogd2UgcHJvcGVybHkgaWRlbnRpZmllZCBvdXJzZWx2ZXMuCisJCSAqLworCQl0ZXN0CVNDU0lTSUdJLCBBVE5JCQkJam56IHRhcmdldF9tZXNnb3V0OworCQl0ZXN0CVNFUV9GTEFHUywgQ01EUEhBU0VfUEVORElORwlqbnogdGFyZ2V0X2NtZHBoYXNlOworCQl0ZXN0CVNFUV9GTEFHUywgRFBIQVNFX1BFTkRJTkcJam56IHRhcmdldF9kcGhhc2U7CisJCXRlc3QJU0VRX0ZMQUdTLCBTUEhBU0VfUEVORElORwlqbnogdGFyZ2V0X3NwaGFzZTsKKworCQkvKgorCQkgKiBObyBtb3JlIHdvcmsgdG8gZG8uICBFaXRoZXIgZGlzY29ubmVjdCBvciBub3QgZGVwZW5kaW5nCisJCSAqIG9uIHRoZSBzdGF0ZSBvZiBOT19ESVNDT05ORUNULgorCQkgKi8KKwkJdGVzdAlTRVFfRkxBR1MsIE5PX0RJU0NPTk5FQ1QganogdGFyZ2V0X2Rpc2Nvbm5lY3Q7IAorCQltdmkJVEFSR19JTU1FRElBVEVfU0NCLCBTQ0JfTElTVF9OVUxMOworCQljYWxsCWNvbXBsZXRlX3RhcmdldF9jbWQ7CisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19QQUdFU0NCUykgIT0gMCkgeworCQkJbW92CUFMTFpFUk9TCWNhbGwJZ2V0X2ZyZWVfb3JfZGlzY19zY2I7CisJCX0KKwkJY21wCVRBUkdfSU1NRURJQVRFX1NDQiwgU0NCX0xJU1RfTlVMTCBqZSAuOworCQltdmkJRE1BUEFSQU1TLCBIRE1BRU58RElSRUNUSU9OfEZJRk9SRVNFVDsKKwkJbW92CVRBUkdfSU1NRURJQVRFX1NDQiBjYWxsIGRtYV9zY2I7CisJCWNhbGwJc2V0X3RyYW5zZmVyX3NldHRpbmdzOworCQlvcglTWEZSQ1RMMCwgQ0xSU1RDTlR8Q0xSQ0hOOworCQlqbXAJdGFyZ2V0X3N5bmNjbWQ7CisKK3RhcmdldF9tZXNnb3V0OgorCQltdmkJU0NTSVNJR08sIFBfTUVTR09VVHxCU1lPOwordGFyZ2V0X21lc2dvdXRfY29udGludWU6CisJCWNhbGwJdGFyZ2V0X2luYjsKK3RhcmdldF9tZXNnb3V0X3BlbmRpbmc6CisJCWFuZAlTRVFfRkxBR1MyLCB+VEFSR0VUX01TR19QRU5ESU5HOworCQkvKiBMb2NhbCBQcm9jZXNzaW5nIGdvZXMgaGVyZS4uLiAqLworCQlqbXAJaG9zdF90YXJnZXRfbWVzc2FnZV9sb29wOworCQkKK3RhcmdldF9kaXNjb25uZWN0OgorCQltdmkJUF9NRVNHSU58QlNZTyBjYWxsIGNoYW5nZV9waGFzZTsKKwkJdGVzdAlTRVFfRkxBR1MsIERQSEFTRQlqeiAuICsgMjsKKwkJbXZpCU1TR19TQVZFREFUQVBPSU5URVIgY2FsbCB0YXJnZXRfb3V0YjsKKwkJbXZpCU1TR19ESVNDT05ORUNUIGNhbGwgdGFyZ2V0X291dGI7CisKK3RhcmdldF9idXNmcmVlX3dhaXQ6CisJCS8qIFdhaXQgZm9yIHByZWNlZGluZyBJL08gc2Vzc2lvbiB0byBjb21wbGV0ZS4gKi8KKwkJdGVzdAlTQ1NJU0lHSSwgQUNLSSBqbnogLjsKK3RhcmdldF9idXNmcmVlOgorCQlhbmQJU0lNT0RFMSwgfkVOQlVTRlJFRTsKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQkJY2xyCVNDU0lCVVNMOworCQl9CisJCWNscglTQ1NJU0lHTzsKKwkJbXZpCUxBU1RQSEFTRSwgUF9CVVNGUkVFOworCQljYWxsCWNvbXBsZXRlX3RhcmdldF9jbWQ7CisJCWptcAlwb2xsX2Zvcl93b3JrOworCit0YXJnZXRfY21kcGhhc2U6CisJCS8qCisJCSAqIFRoZSB0YXJnZXQgaGFzIGRyb3BwZWQgQVROIChkb2Vzbid0IHdhbnQgdG8gYWJvcnQgb3IgQkRSKQorCQkgKiBhbmQgd2UgYmVsaWV2ZSB0aGlzIHNlbGVjdGlvbiB0byBiZSB2YWxpZC4gIElmIHRoZSByaW5nCisJCSAqIGJ1ZmZlciBmb3IgbmV3IGNvbW1hbmRzIGlzIGZ1bGwsIHJldHVybiBidXN5IG9yIHF1ZXVlIGZ1bGwuCisJCSAqLworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfSFNfTUFJTEJPWCkgIT0gMCkgeworCQkJYW5kCUEsIEhPU1RfVFFJTlBPUywgSFNfTUFJTEJPWDsKKwkJfSBlbHNlIHsKKwkJCW1vdglBLCBLRVJORUxfVFFJTlBPUzsKKwkJfQorCQljbXAJVFFJTlBPUywgQSBqbmUgdHFpbmZpZm9faGFzX3NwYWNlOworCQltdmkJUF9TVEFUVVN8QlNZTyBjYWxsIGNoYW5nZV9waGFzZTsKKwkJdGVzdAlTRVFfRkxBR1MsIFRBUkdFVF9DTURfSVNfVEFHR0VEIGp6IC4gKyAzOworCQltdmkJU1RBVFVTX1FVRVVFX0ZVTEwgY2FsbCB0YXJnZXRfb3V0YjsKKwkJam1wCXRhcmdldF9idXNmcmVlX3dhaXQ7CisJCW12aQlTVEFUVVNfQlVTWSBjYWxsIHRhcmdldF9vdXRiOworCQlqbXAJdGFyZ2V0X2J1c2ZyZWVfd2FpdDsKK3RxaW5maWZvX2hhc19zcGFjZToJCisJCW12aQlQX0NPTU1BTkR8QlNZTyBjYWxsIGNoYW5nZV9waGFzZTsKKwkJY2FsbAl0YXJnZXRfaW5iOworCQltb3YJQSwgRElOREVYOworCQkvKiBTdG9yZSBmb3IgaG9zdCAqLworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJCW1vdglDQ1NDQlJBTSwgQTsKKwkJfSBlbHNlIHsKKwkJCW1vdglERkRBVCwgQTsKKwkJfQorCisJCS8qCisJCSAqIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKwkJICogYmFzZWQgb24gdGhlIGNvbW1hbmQgZ3JvdXAgY29kZSB2aWEgdGFibGUgbG9va3VwLgorCQkgKiBXZSByZXVzZSB0aGUgZmlyc3QgOCBieXRlcyBvZiB0aGUgVEFSR19TQ1NJUkFURQorCQkgKiBCSU9TIGFycmF5IGZvciB0aGlzIHRhYmxlLiBDb3VudCBpcyBvbmUgbGVzcyB0aGFuCisJCSAqIHRoZSB0b3RhbCBmb3IgdGhlIGNvbW1hbmQgc2luY2Ugd2UndmUgYWxyZWFkeSBmZXRjaGVkCisJCSAqIHRoZSBmaXJzdCBieXRlLgorCQkgKi8KKwkJc2hyCUEsIENNRF9HUk9VUF9DT0RFX1NISUZUOworCQlhZGQJU0lOREVYLCBDTURTSVpFX1RBQkxFLCBBOworCQltb3YJQSwgU0lORElSOworCisJCXRlc3QJQSwgMHhGRiBqeiBjb21tYW5kX3BoYXNlX2RvbmU7CisJCW9yCVNYRlJDVEwwLCBTUElPRU47Citjb21tYW5kX2xvb3A6CisJCXRlc3QJU1NUQVQwLCBTUElPUkRZIGp6IC47CisJCWNtcAlBLCAxIGpuZSAuICsgMjsKKwkJYW5kCVNYRlJDVEwwLCB+U1BJT0VOOwkvKiBMYXN0IEJ5dGUgKi8KKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCQltb3YJQ0NTQ0JSQU0sIFNDU0lEQVRMOworCQl9IGVsc2UgeworCQkJbW92CURGREFULCBTQ1NJREFUTDsKKwkJfQorCQlkZWMJQTsKKwkJdGVzdAlBLCAweEZGIGpueiBjb21tYW5kX2xvb3A7CisKK2NvbW1hbmRfcGhhc2VfZG9uZToKKwkJYW5kCVNFUV9GTEFHUywgfkNNRFBIQVNFX1BFTkRJTkc7CisJCWptcAl0YXJnZXRfSVRsb29wOworCit0YXJnZXRfZHBoYXNlOgorCQkvKgorCQkgKiBEYXRhIHBoYXNlcyBvbiB0aGUgYnVzIGFyZSBmcm9tIHRoZQorCQkgKiBwZXJzcGVjdGl2ZSBvZiB0aGUgaW5pdGlhdG9yLiAgVGhlIGRtYQorCQkgKiBjb2RlIGxvb2tzIGF0IExBU1RQSEFTRSB0byBkZXRlcm1pbmUgdGhlCisJCSAqIGRhdGEgZGlyZWN0aW9uIG9mIHRoZSBETUEuICBUb2dnbGUgaXQgZm9yCisJCSAqIHRhcmdldCB0cmFuc2ZlcnMuCisJCSAqLworCQl4b3IJTEFTVFBIQVNFLCBJT0ksIFNDQl9UQVJHRVRfREFUQV9ESVI7CisJCW9yCVNDQl9UQVJHRVRfREFUQV9ESVIsIEJTWU8gY2FsbCBjaGFuZ2VfcGhhc2U7CisJCWptcAlwX2RhdGE7CisKK3RhcmdldF9zcGhhc2U6CisJCW12aQlQX1NUQVRVU3xCU1lPIGNhbGwgY2hhbmdlX3BoYXNlOworCQltdmkJTEFTVFBIQVNFLCBQX1NUQVRVUzsKKwkJbW92CVNDQl9TQ1NJX1NUQVRVUyBjYWxsIHRhcmdldF9vdXRiOworCQkvKiBYWFggV2F0Y2ggZm9yIEFUTiBvciBwYXJpdHkgZXJyb3JzPz8/ICovCisJCW12aQlTQ1NJU0lHTywgUF9NRVNHSU58QlNZTzsKKwkJLyogTVNHX0NNRENNUExUIGlzIDAsIGJ1dCB3ZSBjYW4ndCBkbyBhbiBpbW1lZGlhdGUgb2YgMCAqLworCQltb3YJQUxMWkVST1MgY2FsbCB0YXJnZXRfb3V0YjsKKwkJam1wCXRhcmdldF9idXNmcmVlX3dhaXQ7CisJCitjb21wbGV0ZV90YXJnZXRfY21kOgorCQl0ZXN0CVNFUV9GTEFHUywgVEFSR19DTURfUEVORElORwlqbnogLiArIDI7CisJCW1vdglTQ0JfVEFHIGptcCBjb21wbGV0ZV9wb3N0OworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJCS8qIFNldCB0aGUgdmFsaWQgYnl0ZSAqLworCQkJbXZpCUNDU0NCQUREUiwgMjQ7CisJCQltb3YJQ0NTQ0JSQU0sIEFMTE9ORVM7CisJCQltdmkJQ0NIQ05ULCAyODsKKwkJCW9yCUNDU0NCQ1RMLCBDQ1NDQkVOfENDU0NCUkVTRVQ7CisJCQl0ZXN0CUNDU0NCQ1RMLCBDQ1NDQkRPTkUganogLjsKKwkJCWNscglDQ1NDQkNUTDsKKwkJfSBlbHNlIHsKKwkJCS8qIFNldCB0aGUgdmFsaWQgYnl0ZSAqLworCQkJb3IJREZDTlRSTCwgRklGT1JFU0VUOworCQkJbXZpCURGV0FERFIsIDM7IC8qIFRoaXJkIDY0Yml0IHdvcmQgb3IgYnl0ZSAyNCAqLworCQkJbW92CURGREFULCBBTExPTkVTOworCQkJbXZpCTI4CWNhbGwgc2V0X2hjbnQ7CisJCQlvcglERkNOVFJMLCBIRE1BRU58RklGT0ZMVVNIOworCQkJY2FsbAlkbWFfZmluaXNoOworCQl9CisJCWluYwlUUUlOUE9TOworCQltdmkJSU5UU1RBVCxDTURDTVBMVCByZXQ7CisJfQorCitpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfSU5JVElBVE9SUk9MRSkgIT0gMCkgeworaW5pdGlhdG9yX3NlbGVjdDoKKwlvcglTWEZSQ1RMMCwgU1BJT0VOfENMUlNUQ05UfENMUkNITjsKKwkvKgorCSAqIEFzIHNvb24gYXMgd2UgZ2V0IGEgc3VjY2Vzc2Z1bCBzZWxlY3Rpb24sIHRoZSB0YXJnZXQKKwkgKiBzaG91bGQgZ28gaW50byB0aGUgbWVzc2FnZSBvdXQgcGhhc2Ugc2luY2Ugd2UgaGF2ZSBBVE4KKwkgKiBhc3NlcnRlZC4KKwkgKi8KKwltdmkJTVNHX09VVCwgTVNHX0lERU5USUZZRkxBRzsKKwltdmkJU0VRX0ZMQUdTLCBOT19DREJfU0VOVDsKKwltdmkJQ0xSU0lOVDAsIENMUlNFTERPOworCisJLyoKKwkgKiBNYWluIGxvb3AgZm9yIGluZm9ybWF0aW9uIHRyYW5zZmVyIHBoYXNlcy4gIFdhaXQgZm9yIHRoZQorCSAqIHRhcmdldCB0byBhc3NlcnQgUkVRIGJlZm9yZSBjaGVja2luZyBNU0csIEMvRCBhbmQgSS9PIGZvcgorCSAqIHRoZSBidXMgcGhhc2UuCisJICovCittZXNnaW5fcGhhc2VtaXM6CitJVGxvb3A6CisJY2FsbAlwaGFzZV9sb2NrOworCisJbW92CUEsIExBU1RQSEFTRTsKKworCXRlc3QJQSwgflBfREFUQUlOCWp6IHBfZGF0YTsKKwljbXAJQSxQX0NPTU1BTkQJamUgcF9jb21tYW5kOworCWNtcAlBLFBfTUVTR09VVAlqZSBwX21lc2dvdXQ7CisJY21wCUEsUF9TVEFUVVMJamUgcF9zdGF0dXM7CisJY21wCUEsUF9NRVNHSU4JamUgcF9tZXNnaW47CisKKwltdmkJQkFEX1BIQVNFIGNhbGwgc2V0X3NlcWludDsKKwlqbXAJSVRsb29wOwkJCS8qIFRyeSByZWFkaW5nIHRoZSBidXMgYWdhaW4uICovCisKK2F3YWl0X2J1c2ZyZWU6CisJYW5kCVNJTU9ERTEsIH5FTkJVU0ZSRUU7CisJbW92CU5PTkUsIFNDU0lEQVRMOwkJLyogQWNrIHRoZSBsYXN0IGJ5dGUgKi8KKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCWNscglTQ1NJQlVTTDsJLyogUHJldmVudCBiaXQgbGVha2FnZSBkdXJpbnQgU0VMVE8gKi8KKwl9CisJYW5kCVNYRlJDVEwwLCB+U1BJT0VOOworCXRlc3QJU1NUQVQxLFJFUUlOSVR8QlVTRlJFRQlqeiAuOworCXRlc3QJU1NUQVQxLCBCVVNGUkVFIGpueiBwb2xsX2Zvcl93b3JrOworCW12aQlNSVNTRURfQlVTRlJFRSBjYWxsIHNldF9zZXFpbnQ7Cit9CisJCitjbGVhcl90YXJnZXRfc3RhdGU6CisJLyoKKwkgKiBXZSBhc3N1bWUgdGhhdCB0aGUga2VybmVsIGRyaXZlciBtYXkgcmVzZXQgdXMKKwkgKiBhdCBhbnkgdGltZSwgZXZlbiBpbiB0aGUgbWlkZGxlIG9mIGEgRE1BLCBzbworCSAqIGNsZWFyIERGQ05UUkwgdG9vLgorCSAqLworCWNscglERkNOVFJMOworCW9yCVNYRlJDVEwwLCBDTFJTVENOVHxDTFJDSE47CisKKwkvKgorCSAqIFdlIGRvbid0IGtub3cgdGhlIHRhcmdldCB3ZSB3aWxsIGNvbm5lY3QgdG8sCisJICogc28gZGVmYXVsdCB0byBuYXJyb3cgdHJhbnNmZXJzIHRvIGF2b2lkCisJICogcGFyaXR5IHByb2JsZW1zLgorCSAqLworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJYm1vdglTQ1NJUkFURSwgQUxMWkVST1MsIDI7CisJfSBlbHNlIHsKKwkJY2xyCVNDU0lSQVRFOworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEpICE9IDApIHsKKwkJCWFuZAlTWEZSQ1RMMCwgfihGQVNUMjApOworCQl9CisJfQorCW12aQlMQVNUUEhBU0UsIFBfQlVTRlJFRTsKKwkvKiBjbGVhciB0YXJnZXQgc3BlY2lmaWMgZmxhZ3MgKi8KKwltdmkJU0VRX0ZMQUdTLCBOT1RfSURFTlRJRklFRHxOT19DREJfU0VOVCByZXQ7CisKK3NnX2FkdmFuY2U6CisJY2xyCUE7CQkJLyogYWRkIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcikgKi8KKwlhZGQJU0NCX1JFU0lEVUFMX1NHUFRSWzBdLFNHX1NJWkVPRjsKKwlhZGMJU0NCX1JFU0lEVUFMX1NHUFRSWzFdLEE7CisJYWRjCVNDQl9SRVNJRFVBTF9TR1BUUlsyXSxBOworCWFkYwlTQ0JfUkVTSURVQUxfU0dQVFJbM10sQSByZXQ7CisKK2lmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworZGlzYWJsZV9jY3NnZW46CisJdGVzdAlDQ1NHQ1RMLCBDQ1NHRU4ganogcmV0dXJuOworCXRlc3QJQ0NTR0NUTCwgQ0NTR0RPTkUganogLjsKK2Rpc2FibGVfY2NzZ2VuX2ZldGNoX2RvbmU6CisJY2xyCUNDU0dDVEw7CisJdGVzdAlDQ1NHQ1RMLCBDQ1NHRU4gam56IC47CisJcmV0OworaWRsZV9sb29wOgorCS8qCisJICogRG8gd2UgbmVlZCBhbnkgbW9yZSBzZWdtZW50cyBmb3IgdGhpcyB0cmFuc2Zlcj8KKwkgKi8KKwl0ZXN0CVNDQl9SRVNJRFVBTF9EQVRBQ05UWzNdLCBTR19MQVNUX1NFRyBqbnogcmV0dXJuOworCisJLyogRGlkIHdlIGp1c3QgZmluaXNoIGZldGNoaW5nIHNlZ3M/ICovCisJY21wCUNDU0dDVEwsIENDU0dFTnxDQ1NHRE9ORSBqZSBpZGxlX3NnZmV0Y2hfY29tcGxldGU7CisKKwkvKiBBcmUgd2UgYWN0aXZlbHkgZmV0Y2hpbmcgc2VnbWVudHM/ICovCisJdGVzdAlDQ1NHQ1RMLCBDQ1NHRU4gam56IHJldHVybjsKKworCS8qCisJICogRG8gd2UgaGF2ZSBhbnkgcHJlZmV0Y2ggbGVmdD8/PworCSAqLworCWNtcAlDQ1NHQUREUiwgU0dfUFJFRkVUQ0hfQ05UIGpuZSBpZGxlX3NnX2F2YWlsOworCisJLyoKKwkgKiBOZWVkIHRvIGZldGNoIHNlZ21lbnRzLCBidXQgd2UgY2FuIG9ubHkgZG8gdGhhdAorCSAqIGlmIHRoZSBjb21tYW5kIGNoYW5uZWwgaXMgY29tcGxldGVseSBpZGxlLiAgTWFrZQorCSAqIHN1cmUgd2UgZG9uJ3QgaGF2ZSBhbiBTQ0IgcHJlZmV0Y2ggZ29pbmcgb24uCisJICovCisJdGVzdAlDQ1NDQkNUTCwgQ0NTQ0JFTiBqbnogcmV0dXJuOworCisJLyoKKwkgKiBXZSBmZXRjaCBhICJjYWNoZWxpbmUgYWxpZ25lZCIgYW5kIHNpemVkIGFtb3VudCBvZiBkYXRhCisJICogc28gd2UgZG9uJ3QgZW5kIHVwIHJlZmVyZW5jaW5nIGEgbm9uLWV4aXN0YW50IHBhZ2UuCisJICogQ2FjaGVsaW5lIGFsaWduZWQgaXMgaW4gcXVvdGVzIGJlY2F1c2UgdGhlIGtlcm5lbCB3aWxsCisJICogc2V0IHRoZSBwcmVmZXRjaCBhbW91bnQgdG8gYSByZWFzb25hYmxlIGxldmVsIGlmIHRoZQorCSAqIGNhY2hlbGluZSBzaXplIGlzIHVua25vd24uCisJICovCisJbXZpCUNDSENOVCwgU0dfUFJFRkVUQ0hfQ05UOworCWFuZAlDQ0hBRERSWzBdLCBTR19QUkVGRVRDSF9BTElHTl9NQVNLLCBTQ0JfUkVTSURVQUxfU0dQVFI7CisJYm1vdglDQ0hBRERSWzFdLCBTQ0JfUkVTSURVQUxfU0dQVFJbMV0sIDM7CisJbXZpCUNDU0dDVEwsIENDU0dFTnxDQ1NHUkVTRVQgcmV0OworaWRsZV9zZ2ZldGNoX2NvbXBsZXRlOgorCWNhbGwJZGlzYWJsZV9jY3NnZW5fZmV0Y2hfZG9uZTsKKwlhbmQJQ0NTR0FERFIsIFNHX1BSRUZFVENIX0FERFJfTUFTSywgU0NCX1JFU0lEVUFMX1NHUFRSOworaWRsZV9zZ19hdmFpbDoKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCS8qIERvZXMgdGhlIGhhcmR3YXJlIGhhdmUgc3BhY2UgZm9yIGFub3RoZXIgU0cgZW50cnk/ICovCisJCXRlc3QJREZTVEFUVVMsIFBSRUxPQURfQVZBSUwganogcmV0dXJuOworCQlibW92IAlIQUREUiwgQ0NTR1JBTSwgNzsKKwkJYm1vdglTQ0JfUkVTSURVQUxfREFUQUNOVFszXSwgQ0NTR1JBTSwgMTsKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDXzM5QklUX0FERFJFU1NJTkcpICE9IDApIHsKKwkJCW1vdglTQ0JfUkVTSURVQUxfREFUQUNOVFszXSBjYWxsIHNldF9oaGFkZHI7CisJCX0KKwkJY2FsbAlzZ19hZHZhbmNlOworCQltb3YJU0lOREVYLCBTQ0JfUkVTSURVQUxfU0dQVFJbMF07CisJCXRlc3QJU0NCX1JFU0lEVUFMX0RBVEFDTlRbM10sIFNHX0xBU1RfU0VHIGp6IC4gKyAyOworCQlvcglTSU5ERVgsIExBU1RfU0VHOworCQltb3YJU0dfQ0FDSEVfUFJFLCBTSU5ERVg7CisJCS8qIExvYWQgdGhlIHNlZ21lbnQgKi8KKwkJb3IJREZDTlRSTCwgUFJFTE9BREVOOworCX0KKwlyZXQ7Cit9CisKK2lmICgoYWhjLT5idWdzICYgQUhDX1BDSV9NV0lfQlVHKSAhPSAwICYmIGFoYy0+cGNpX2NhY2hlc2l6ZSAhPSAwKSB7CisvKgorICogQ2FsY3VsYXRlIHRoZSB0cmFpbGluZyBwb3J0aW9uIG9mIHRoaXMgUy9HIHNlZ21lbnQgdGhhdCBjYW5ub3QKKyAqIGJlIHRyYW5zZmVycmVkIHVzaW5nIG1lbW9yeSB3cml0ZSBhbmQgaW52YWxpZGF0ZSBQQ0kgdHJhbnNhY3Rpb25zLiAgCisgKiBYWFggQ2FuIHdlIG9wdGltaXplIHRoaXMgZm9yIFBDSSB3cml0ZXMgb25seT8/PworICovCitjYWxjX213aV9yZXNpZHVhbDoKKwkvKgorCSAqIElmIHRoZSBlbmRpbmcgYWRkcmVzcyBpcyBvbiBhIGNhY2hlbGluZSBib3VuZGFyeSwKKwkgKiB0aGVyZSBpcyBubyBuZWVkIGZvciBhbiBleHRyYSBzZWdtZW50LgorCSAqLworCW1vdglBLCBIQ05UWzBdOworCWFkZAlBLCBBLCBIQUREUlswXTsKKwlhbmQJQSwgQ0FDSEVTSVpFX01BU0s7CisJdGVzdAlBLCAweEZGIGp6IHJldHVybjsKKworCS8qCisJICogSWYgdGhlIHRyYW5zZmVyIGlzIGxlc3MgdGhhbiBhIGNhY2hsaW5lLAorCSAqIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGFuIGV4dHJhIHNlZ21lbnQuCisJICovCisJdGVzdAlIQ05UWzFdLCAweEZGCWpueiBjYWxjX213aV9yZXNpZHVhbF9maW5hbDsKKwl0ZXN0CUhDTlRbMl0sIDB4RkYJam56IGNhbGNfbXdpX3Jlc2lkdWFsX2ZpbmFsOworCWFkZAlOT05FLCBJTlZFUlRFRF9DQUNIRVNJWkVfTUFTSywgSENOVFswXTsKKwlqbmMJcmV0dXJuOworCitjYWxjX213aV9yZXNpZHVhbF9maW5hbDoKKwltb3YJTVdJX1JFU0lEVUFMLCBBOworCW5vdAlBOworCWluYwlBOworCWFkZAlIQ05UWzBdLCBBOworCWFkYwlIQ05UWzFdLCAtMTsKKwlhZGMJSENOVFsyXSwgLTEgcmV0OworfQorCitwX2RhdGE6CisJdGVzdAlTRVFfRkxBR1MsTk9UX0lERU5USUZJRUR8Tk9fQ0RCX1NFTlQganogcF9kYXRhX2FsbG93ZWQ7CisJbXZpCVBST1RPX1ZJT0xBVElPTiBjYWxsIHNldF9zZXFpbnQ7CitwX2RhdGFfYWxsb3dlZDoKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCW12aQlETUFQQVJBTVMsIFBSRUxPQURFTnxTQ1NJRU58SERNQUVOOworCX0gZWxzZSB7CisJCW12aQlETUFQQVJBTVMsIFdJREVPRER8U0NTSUVOfFNETUFFTnxIRE1BRU58RklGT1JFU0VUOworCX0KKwl0ZXN0CUxBU1RQSEFTRSwgSU9JIGpueiAuICsgMjsKKwlvcglETUFQQVJBTVMsIERJUkVDVElPTjsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJLyogV2UgZG9uJ3QgaGF2ZSBhbnkgdmFsaWQgUy9HIGVsZW1lbnRzICovCisJCW12aQlDQ1NHQUREUiwgU0dfUFJFRkVUQ0hfQ05UOworCX0KKwl0ZXN0CVNFUV9GTEFHUywgRFBIQVNFCWp6IGRhdGFfcGhhc2VfaW5pdGlhbGl6ZTsKKworCS8qCisJICogSWYgd2UgcmUtZW50ZXIgdGhlIGRhdGEgcGhhc2UgYWZ0ZXIgZ29pbmcgdGhyb3VnaCBhbm90aGVyCisJICogcGhhc2UsIG91ciB0cmFuc2ZlciBsb2NhdGlvbiBoYXMgYWxtb3N0IGNlcnRhaW5seSBiZWVuCisJICogY29ycnVwdGVkIGJ5IHRoZSBpbnRlcnZlaW5pbmcsIG5vbi1kYXRhLCB0cmFuc2ZlcnMuICBBc2sKKwkgKiB0aGUgaG9zdCBkcml2ZXIgdG8gZml4IHVzIHVwIGJhc2VkIG9uIHRoZSB0cmFuc2ZlciByZXNpZHVhbC4KKwkgKi8KKwltdmkJUERBVEFfUkVJTklUCWNhbGwgc2V0X3NlcWludDsKKwlqbXAJZGF0YV9waGFzZV9sb29wOworCitkYXRhX3BoYXNlX2luaXRpYWxpemU6CisJLyogV2UgaGF2ZSBzZWVuIGEgZGF0YSBwaGFzZSBmb3IgdGhlIGZpcnN0IHRpbWUgKi8KKwlvcglTRVFfRkxBR1MsIERQSEFTRTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgRE1BIGFkZHJlc3MgYW5kIGNvdW50ZXIgZnJvbSB0aGUgU0NCLgorCSAqIEFsc28gc2V0IFNDQl9SRVNJRFVBTF9TR1BUUiwgaW5jbHVkaW5nIHRoZSBMQVNUX1NFRworCSAqIGZsYWcgaW4gdGhlIGhpZ2hlc3QgYnl0ZSBvZiB0aGUgZGF0YSBjb3VudC4gIFdlIGNhbm5vdAorCSAqIG1vZGlmeSB0aGUgc2F2ZWQgdmFsdWVzIGluIHRoZSBTQ0IgdW50aWwgd2Ugc2VlIGEgc2F2ZQorCSAqIGRhdGEgcG9pbnRlcnMgbWVzc2FnZS4KKwkgKi8KKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfMzlCSVRfQUREUkVTU0lORykgIT0gMCkgeworCQkvKiBUaGUgbG93ZXN0IGFkZHJlc3MgYnl0ZSBtdXN0IGJlIGxvYWRlZCBsYXN0LiAqLworCQltb3YJU0NCX0RBVEFDTlRbM10gY2FsbCBzZXRfaGhhZGRyOworCX0KKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJYm1vdglIQUREUiwgU0NCX0RBVEFQVFIsIDc7CisJCWJtb3YJU0NCX1JFU0lEVUFMX0RBVEFDTlRbM10sIFNDQl9EQVRBQ05UWzNdLCA1OworCX0gZWxzZSB7CisJCW12aQlESU5ERVgsIEhBRERSOworCQltdmkJU0NCX0RBVEFQVFIJY2FsbCBiY29weV83OworCQltdmkJRElOREVYLCBTQ0JfUkVTSURVQUxfREFUQUNOVCArIDM7CisJCW12aQlTQ0JfREFUQUNOVCArIDMgY2FsbCBiY29weV81OworCX0KKwlpZiAoKGFoYy0+YnVncyAmIEFIQ19QQ0lfTVdJX0JVRykgIT0gMCAmJiBhaGMtPnBjaV9jYWNoZXNpemUgIT0gMCkgeworCQljYWxsCWNhbGNfbXdpX3Jlc2lkdWFsOworCX0KKwlhbmQJU0NCX1JFU0lEVUFMX1NHUFRSWzBdLCB+U0dfRlVMTF9SRVNJRDsKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID09IDApIHsKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCQlibW92CVNUQ05ULCBIQ05ULCAzOworCQl9IGVsc2UgeworCQkJY2FsbAlzZXRfc3RjbnRfZnJvbV9oY250OworCQl9CisJfQorCitkYXRhX3BoYXNlX2xvb3A6CisJLyogR3VhcmQgYWdhaW5zdCBvdmVycnVucyAqLworCXRlc3QJU0NCX1JFU0lEVUFMX1NHUFRSWzBdLCBTR19MSVNUX05VTEwganogZGF0YV9waGFzZV9pbmJvdW5kczsKKworCS8qCisJICogVHVybiBvbiBgQml0IEJ1Y2tldCcgbW9kZSwgd2FpdCB1bnRpbCB0aGUgdGFyZ2V0IHRha2VzCisJICogdXMgdG8gYW5vdGhlciBwaGFzZSwgYW5kIHRoZW4gbm90aWZ5IHRoZSBob3N0LgorCSAqLworCWFuZAlETUFQQVJBTVMsIERJUkVDVElPTjsKKwltb3YJREZDTlRSTCwgRE1BUEFSQU1TOworCW9yCVNYRlJDVEwxLEJJVEJVQ0tFVDsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfRFQpID09IDApIHsKKwkJdGVzdAlTU1RBVDEsUEhBU0VNSVMJanogLjsKKwl9IGVsc2UgeworCQl0ZXN0CVNDU0lQSEFTRSwgREFUQV9QSEFTRV9NQVNLIGpueiAuOworCX0KKwlhbmQJU1hGUkNUTDEsIH5CSVRCVUNLRVQ7CisJbXZpCURBVEFfT1ZFUlJVTiBjYWxsIHNldF9zZXFpbnQ7CisJam1wCUlUbG9vcDsKKworZGF0YV9waGFzZV9pbmJvdW5kczoKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCW1vdglTSU5ERVgsIFNDQl9SRVNJRFVBTF9TR1BUUlswXTsKKwkJdGVzdAlTQ0JfUkVTSURVQUxfREFUQUNOVFszXSwgU0dfTEFTVF9TRUcganogLiArIDI7CisJCW9yCVNJTkRFWCwgTEFTVF9TRUc7CisJCW1vdglTR19DQUNIRV9QUkUsIFNJTkRFWDsKKwkJbW92CURGQ05UUkwsIERNQVBBUkFNUzsKK3VsdHJhMl9kbWFfbG9vcDoKKwkJY2FsbAlpZGxlX2xvb3A7CisJCS8qCisJCSAqIFRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZSBpZiBlaXRoZXIgdGhlIGxhc3Qgc2VnbWVudAorCQkgKiBjb21wbGV0ZXMgb3IgdGhlIHRhcmdldCBjaGFuZ2VzIHBoYXNlLgorCQkgKi8KKwkJdGVzdAlTR19DQUNIRV9TSEFET1csIExBU1RfU0VHX0RPTkUgam56IHVsdHJhMl9kbWFmaW5pc2g7CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgPT0gMCkgeworCQkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1RBUkdFVFJPTEUpICE9IDApIHsKKwkJCQkgLyoKKwkJCQkgICogQXMgYSB0YXJnZXQsIHdlIGNvbnRyb2wgdGhlIHBoYXNlcywKKwkJCQkgICogc28gaWdub3JlIFBIQVNFTUlTLgorCQkJCSAgKi8KKwkJCQl0ZXN0CVNTVEFUMCwgVEFSR0VUIGpueiB1bHRyYTJfZG1hX2xvb3A7CisJCQl9CisJCQlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfSU5JVElBVE9SUk9MRSkgIT0gMCkgeworCQkJCXRlc3QJU1NUQVQxLFBIQVNFTUlTCWp6IHVsdHJhMl9kbWFfbG9vcDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRlc3QJREZDTlRSTCwgU0NTSUVOIGpueiB1bHRyYTJfZG1hX2xvb3A7CisJCX0KKwordWx0cmEyX2RtYWZpbmlzaDoKKwkJLyoKKwkJICogVGhlIHRyYW5zZmVyIGhhcyB0ZXJtaW5hdGVkIGVpdGhlciBkdWUgdG8gYSBwaGFzZQorCQkgKiBjaGFuZ2UsIGFuZC9vciB0aGUgY29tcGxldGlvbiBvZiB0aGUgbGFzdCBzZWdtZW50LgorCQkgKiBXZSBoYXZlIHR3byBnb2FscyBoZXJlLiAgRG8gYXMgbXVjaCBvdGhlciB3b3JrCisJCSAqIGFzIHBvc3NpYmxlIHdoaWxlIHRoZSBkYXRhIGZpZm8gZHJhaW5zIG9uIGEgcmVhZAorCQkgKiBhbmQgcmVzcG9uZCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlIHRvIHRoZSBzdGFuZGFyZAorCQkgKiBtZXNzYWdlcyAoc2F2ZSBkYXRhIHBvaW50ZXJzL2Rpc2Nvbm5lY3QgYW5kIGNvbW1hbmQKKwkJICogY29tcGxldGUpIHRoYXQgdXN1YWxseSBmb2xsb3cgYSBkYXRhIHBoYXNlLgorCQkgKi8KKwkJaWYgKChhaGMtPmJ1Z3MgJiBBSENfQVVUT0ZMVVNIX0JVRykgIT0gMCkgeworCQkJLyoKKwkJCSAqIE9uIGNoaXBzIHdpdGggYnJva2VuIGF1dG8tZmx1c2gsIHN0YXJ0CisJCQkgKiB0aGUgZmx1c2hpbmcgcHJvY2VzcyBub3cuICBXZSdsbCBwb2tlCisJCQkgKiB0aGUgY2hpcCBmcm9tIHRpbWUgdG8gdGltZSB0byBrZWVwIHRoZQorCQkJICogZmx1c2ggcHJvY2VzcyBnb2luZyBhcyB3ZSBjb21wbGV0ZSB0aGUKKwkJCSAqIGRhdGEgcGhhc2UuCisJCQkgKi8KKwkJCW9yCURGQ05UUkwsIEZJRk9GTFVTSDsKKwkJfQorCQkvKgorCQkgKiBXZSBhc3N1bWUgdGhhdCwgZXZlbiB0aG91Z2ggZGF0YSBtYXkgc3RpbGwgYmUKKwkJICogdHJhbnNmZXJyaW5nIHRvIHRoZSBob3N0LCB0aGF0IHRoZSBTQ1NJIHNpZGUgb2YKKwkJICogdGhlIERNQSBlbmdpbmUgaXMgbm93IGluIGEgc3RhdGljIHN0YXRlLiAgVGhpcworCQkgKiBhbGxvd3MgdXMgdG8gdXBkYXRlIG91ciBub3Rpb24gb2Ygd2hlcmUgd2UgYXJlCisJCSAqIGluIHRoaXMgdHJhbnNmZXIuCisJCSAqCisJCSAqIElmLCBieSBjaGFuY2UsIHdlIHN0b3BwZWQgYmVmb3JlIGJlaW5nIGFibGUKKwkJICogdG8gZmV0Y2ggYWRkaXRpb25hbCBzZWdtZW50cyBmb3IgdGhpcyB0cmFuc2ZlciwKKwkJICogeWV0IHRoZSBsYXN0IFMvRyB3YXMgY29tcGxldGVseSBleGhhdXN0ZWQsCisJCSAqIGNhbGwgb3VyIGlkbGUgbG9vcCB1bnRpbCBpdCBpcyBhYmxlIHRvIGxvYWQKKwkJICogYW5vdGhlciBzZWdtZW50LiAgVGhpcyB3aWxsIGFsbG93IHVzIHRvIGltbWVkaWF0ZWx5CisJCSAqIHBpY2t1cCBvbiB0aGUgbmV4dCBzZWdtZW50IG9uIHRoZSBuZXh0IGRhdGEgcGhhc2UuCisJCSAqCisJCSAqIElmIHdlIGhhcHBlbmVkIHRvIHN0b3Agb24gdGhlIGxhc3Qgc2VnbWVudCwgdGhlbgorCQkgKiBvdXIgcmVzaWR1YWwgaW5mb3JtYXRpb24gaXMgc3RpbGwgY29ycmVjdCBmcm9tCisJCSAqIHRoZSBpZGxlIGxvb3AgYW5kIHRoZXJlIGlzIG5vIG5lZWQgdG8gcGVyZm9ybQorCQkgKiBhbnkgZml4dXBzLgorCQkgKi8KK3VsdHJhMl9lbnN1cmVfc2c6CisJCXRlc3QJU0dfQ0FDSEVfU0hBRE9XLCBMQVNUX1NFRyBqeiB1bHRyYTJfc2h2YWxpZDsKKwkJLyogUmVjb3JkIGlmIHdlJ3ZlIGNvbnN1bWVkIGFsbCBTL0cgZW50cmllcyAqLworCQl0ZXN0CVNTVEFUMiwgU0hWQUxJRAlqbnogcmVzaWR1YWxzX2NvcnJlY3Q7CisJCW9yCVNDQl9SRVNJRFVBTF9TR1BUUlswXSwgU0dfTElTVF9OVUxMOworCQlqbXAJcmVzaWR1YWxzX2NvcnJlY3Q7CisKK3VsdHJhMl9zaHZhbGlkOgorCQl0ZXN0CVNTVEFUMiwgU0hWQUxJRAlqbnogc2dwdHJfZml4dXA7CisJCWNhbGwJaWRsZV9sb29wOworCQlqbXAJdWx0cmEyX2Vuc3VyZV9zZzsKKworc2dwdHJfZml4dXA6CisJCS8qCisJCSAqIEZpeHVwIHRoZSByZXNpZHVhbCBuZXh0IFMvRyBwb2ludGVyLiAgVGhlIFMvRyBwcmVsb2FkCisJCSAqIGZlYXR1cmUgb2YgdGhlIGNoaXAgYWxsb3dzIHVzIHRvIGxvYWQgdHdvIGVsZW1lbnRzCisJCSAqIGluIGFkZGl0aW9uIHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIGVsZW1lbnQuICBXZQorCQkgKiBzdG9yZSB0aGUgYm90dG9tIGJ5dGUgb2YgdGhlIG5leHQgUy9HIHBvaW50ZXIgaW4KKwkJICogdGhlIFNHX0NBQ0VQVFIgcmVnaXN0ZXIgc28gd2UgY2FuIHJlc3RvcmUgdGhlCisJCSAqIGNvcnJlY3QgdmFsdWUgd2hlbiB0aGUgRE1BIGNvbXBsZXRlcy4gIElmIHRoZSBuZXh0CisJCSAqIHNnIHB0ciB2YWx1ZSBoYXMgYWR2YW5jZWQgdG8gdGhlIHBvaW50IHdoZXJlIGhpZ2hlcgorCQkgKiBieXRlcyBpbiB0aGUgYWRkcmVzcyBoYXZlIGJlZW4gYWZmZWN0ZWQsIGZpeCB0aGVtCisJCSAqIHRvby4KKwkJICovCisJCXRlc3QJU0dfQ0FDSEVfU0hBRE9XLCAweDgwIGp6IHNncHRyX2ZpeHVwX2RvbmU7CisJCXRlc3QJU0NCX1JFU0lEVUFMX1NHUFRSWzBdLCAweDgwIGpueiBzZ3B0cl9maXh1cF9kb25lOworCQlhZGQJU0NCX1JFU0lEVUFMX1NHUFRSWzFdLCAtMTsKKwkJYWRjCVNDQl9SRVNJRFVBTF9TR1BUUlsyXSwgLTE7IAorCQlhZGMJU0NCX1JFU0lEVUFMX1NHUFRSWzNdLCAtMTsKK3NncHRyX2ZpeHVwX2RvbmU6CisJCWFuZAlTQ0JfUkVTSURVQUxfU0dQVFJbMF0sIFNHX0FERFJfTUFTSywgU0dfQ0FDSEVfU0hBRE9XOworCQkvKiBXZSBhcmUgbm90IHRoZSBsYXN0IHNlZyAqLworCQlhbmQJU0NCX1JFU0lEVUFMX0RBVEFDTlRbM10sIH5TR19MQVNUX1NFRzsKK3Jlc2lkdWFsc19jb3JyZWN0OgorCQkvKgorCQkgKiBHbyBhaGVhZCBhbmQgc2h1dCBkb3duIHRoZSBETUEgZW5naW5lIG5vdy4KKwkJICogSW4gdGhlIGZ1dHVyZSwgd2UnbGwgd2FudCB0byBoYW5kbGUgZW5kIG9mCisJCSAqIHRyYW5zZmVyIG1lc3NhZ2VzIHByaW9yIHRvIGRvaW5nIHRoaXMsIGJ1dCB0aGlzCisJCSAqIHJlcXVpcmVzIHNpbWlsYXIgcmVzdHJ1Y3R1cmluZyBmb3IgcHJlLVVMVFJBMgorCQkgKiBjb250cm9sbGVycy4KKwkJICovCisJCXRlc3QJRE1BUEFSQU1TLCBESVJFQ1RJT04gam56IHVsdHJhMl9maWZvZW1wdHk7Cit1bHRyYTJfZmlmb2ZsdXNoOgorCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfRFQpID09IDApIHsKKwkJCWlmICgoYWhjLT5idWdzICYgQUhDX0FVVE9GTFVTSF9CVUcpICE9IDApIHsKKwkJCQkvKgorCQkJCSAqIE9uIFJldiBBIG9mIHRoZSBhaWM3ODkwLCB0aGUgYXV0b2ZsdXNoCisJCQkJICogZmVhdHVyZSBkb2Vzbid0IGZ1bmN0aW9uIGNvcnJlY3RseS4KKwkJCQkgKiBQZXJmb3JtIGFuIGV4cGxpY2l0IG1hbnVhbCBmbHVzaC4gIER1cmluZworCQkJCSAqIGEgbWFudWFsIGZsdXNoLCB0aGUgRklGT0VNUCBiaXQgYmVjb21lcworCQkJCSAqIHRydWUgZXZlcnkgdGltZSB0aGUgUENJIEZJRk8gZW1wdGllcworCQkJCSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXRlIG9mIHRoZSBTQ1NJIEZJRk8uCisJCQkJICogSXQgY2FuIHRha2UgdXAgdG8gNCBjbG9jayBjeWNsZXMgZm9yIHRoZQorCQkJCSAqIFNDU0kgRklGTyB0byBnZXQgZGF0YSBpbnRvIHRoZSBQQ0kgRklGTworCQkJCSAqIGFuZCBmb3IgRklGT0VNUCB0byBkZS1hc3NlcnQuICBIZXJlIHdlCisJCQkJICogZ3VhcmQgYWdhaW5zdCB0aGlzIGNvbmRpdGlvbiBieSBtYWtpbmcKKwkJCQkgKiBzdXJlIHRoZSBGSUZPRU1QIGJpdCBzdGF5cyBvbiBmb3IgNSBmdWxsCisJCQkJICogY2xvY2sgY3ljbGVzLgorCQkJCSAqLworCQkJCW9yCURGQ05UUkwsIEZJRk9GTFVTSDsKKwkJCQl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGp6IHVsdHJhMl9maWZvZmx1c2g7CisJCQkJdGVzdAlERlNUQVRVUywgRklGT0VNUCBqeiB1bHRyYTJfZmlmb2ZsdXNoOworCQkJCXRlc3QJREZTVEFUVVMsIEZJRk9FTVAganogdWx0cmEyX2ZpZm9mbHVzaDsKKwkJCQl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGp6IHVsdHJhMl9maWZvZmx1c2g7CisJCQl9CisJCQl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGp6IHVsdHJhMl9maWZvZmx1c2g7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2UgZW5hYmxlIHRoZSBhdXRvLWFjayBmZWF0dXJlIG9uIERUIGNhcGFibGUKKwkJCSAqIGNvbnRyb2xsZXJzLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBjb250cm9sbGVyIG1heQorCQkJICogaGF2ZSBhbHJlYWR5IHRyYW5zZmVycmVkIHNvbWUgb3ZlcnJ1biBieXRlcyBpbnRvCisJCQkgKiB0aGUgZGF0YSBGSUZPIGFuZCBhY2tlZCB0aGVtIG9uIHRoZSBidXMuICBUaGUgb25seQorCQkJICogd2F5IHRvIGRldGVjdCB0aGlzIHNpdHVhdGlvbiBpcyB0byB3YWl0IGZvcgorCQkJICogTEFTVF9TRUdfRE9ORSB0byBjb21lIHRydWUgb24gYSBjb21wbGV0ZWQgdHJhbnNmZXIKKwkJCSAqIGFuZCB0aGVuIHRlc3QgdG8gc2VlIGlmIHRoZSBkYXRhIEZJRk8gaXMgbm9uLWVtcHR5LgorCQkJICovCisJCQl0ZXN0CVNDQl9SRVNJRFVBTF9TR1BUUlswXSwgU0dfTElTVF9OVUxMCisJCQkJanogdWx0cmEyX3dhaXRfZmlmb2VtcDsKKwkJCXRlc3QJU0dfQ0FDSEVfU0hBRE9XLCBMQVNUX1NFR19ET05FIGp6IC47CisJCQkvKgorCQkJICogRklGT0VNUCBjYW4gbGFnIExBU1RfU0VHX0RPTkUuICBXYWl0IGEgZmV3CisJCQkgKiBjbG9ja3MgYmVmb3JlIGNhbGxpbmcgdGhpcyBhbiBvdmVycnVuLgorCQkJICovCisJCQl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGpueiB1bHRyYTJfZmlmb2VtcHR5OworCQkJdGVzdAlERlNUQVRVUywgRklGT0VNUCBqbnogdWx0cmEyX2ZpZm9lbXB0eTsKKwkJCXRlc3QJREZTVEFUVVMsIEZJRk9FTVAgam56IHVsdHJhMl9maWZvZW1wdHk7CisJCQkvKiBPdmVycnVuICovCisJCQlqbXAJZGF0YV9waGFzZV9sb29wOwordWx0cmEyX3dhaXRfZmlmb2VtcDoKKwkJCXRlc3QJREZTVEFUVVMsIEZJRk9FTVAganogLjsKKwkJfQordWx0cmEyX2ZpZm9lbXB0eToKKwkJLyogRG9uJ3QgY2xvYmJlciBhbiBpbnByb2dyZXNzIGhvc3QgZGF0YSB0cmFuc2ZlciAqLworCQl0ZXN0CURGU1RBVFVTLCBNUkVRUEVORAlqbnogdWx0cmEyX2ZpZm9lbXB0eTsKK3VsdHJhMl9kbWFoYWx0OgorCQlhbmQgICAgIERGQ05UUkwsIH4oU0NTSUVOfEhETUFFTik7CisJCXRlc3QJREZDTlRSTCwgU0NTSUVOfEhETUFFTiBqbnogLjsKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDXzM5QklUX0FERFJFU1NJTkcpICE9IDApIHsKKwkJCS8qCisJCQkgKiBLZWVwIEhIQUREUiBjbGVhcmVkIGZvciBmdXR1cmUsIDMyYml0IGFkZHJlc3NlZAorCQkJICogb25seSwgRE1BIG9wZXJhdGlvbnMuCisJCQkgKgorCQkJICogRHVlIHRvIGJheW9uZXR0ZSBzdHlsZSBTL0cgaGFuZGxpbmcsIG91ciByZXNpZHVhbAorCQkJICogZGF0YSBtdXN0IGJlICJmaXhlZCB1cCIgb25jZSB0aGUgdHJhbnNmZXIgaXMgaGFsdGVkLgorCQkJICogSGVyZSB3ZSBmaXh1cCB0aGUgSFNIQUREUiBzdG9yZWQgaW4gdGhlIGhpZ2ggYnl0ZQorCQkJICogb2YgdGhlIHJlc2lkdWFsIGRhdGEgY250LiAgQnkgcG9zdHBvbmluZyB0aGUgZml4dXAsCisJCQkgKiB3ZSBjYW4gYmF0Y2ggdGhlIGNsZWFyaW5nIG9mIEhBRERSIHdpdGggdGhlIGZpeHVwLgorCQkJICogSWYgd2UgaGFsdGVkIG9uIHRoZSBsYXN0IHNlZ21lbnQsIHRoZSByZXNpZHVhbCBpcworCQkJICogYWxyZWFkeSBjb3JyZWN0LiAgIElmIHdlIGFyZSBub3Qgb24gdGhlIGxhc3QKKwkJCSAqIHNlZ21lbnQsIGNvcHkgdGhlIGhpZ2ggYWRkcmVzcyBkaXJlY3RseSBmcm9tIEhTSEFERFIuCisJCQkgKiBXZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IG1haW50YWluaW5nIHRoZQorCQkJICogU0dfTEFTVF9TRUcgZmxhZyBhcyBpdCB3aWxsIGFsd2F5cyBiZSBmYWxzZSBpbiB0aGUKKwkJCSAqIGNhc2Ugd2hlcmUgYW4gdXBkYXRlIGlzIHJlcXVpcmVkLgorCQkJICovCisJCQlvcglEU0NPTU1BTkQxLCBIQURETERTRUwwOworCQkJdGVzdAlTR19DQUNIRV9TSEFET1csIExBU1RfU0VHIGpueiAuICsgMjsKKwkJCW1vdglTQ0JfUkVTSURVQUxfREFUQUNOVFszXSwgU0hBRERSOworCQkJY2xyCUhBRERSOworCQkJYW5kCURTQ09NTUFORDEsIH5IQURETERTRUwwOworCQl9CisJfSBlbHNlIHsKKwkJLyogSWYgd2UgYXJlIHRoZSBsYXN0IFNHIGJsb2NrLCB0ZWxsIHRoZSBoYXJkd2FyZS4gKi8KKwkJaWYgKChhaGMtPmJ1Z3MgJiBBSENfUENJX01XSV9CVUcpICE9IDAKKwkJICAmJiBhaGMtPnBjaV9jYWNoZXNpemUgIT0gMCkgeworCQkJdGVzdAlNV0lfUkVTSURVQUwsIDB4RkYgam56IGRtYV9taWRfc2c7CisJCX0KKwkJdGVzdAlTQ0JfUkVTSURVQUxfREFUQUNOVFszXSwgU0dfTEFTVF9TRUcganogZG1hX21pZF9zZzsKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1RBUkdFVFJPTEUpICE9IDApIHsKKwkJCXRlc3QJU1NUQVQwLCBUQVJHRVQganogZG1hX2xhc3Rfc2c7CisJCQlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfVE1PREVfV0lERU9ERF9CVUcpICE9IDApIHsKKwkJCQl0ZXN0CURNQVBBUkFNUywgRElSRUNUSU9OIGp6IGRtYV9taWRfc2c7CisJCQl9CisJCX0KK2RtYV9sYXN0X3NnOgorCQlhbmQJRE1BUEFSQU1TLCB+V0lERU9ERDsKK2RtYV9taWRfc2c6CisJCS8qIFN0YXJ0IERNQSBkYXRhIHRyYW5zZmVyLiAqLworCQltb3YJREZDTlRSTCwgRE1BUEFSQU1TOworZG1hX2xvb3A6CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQkJY2FsbAlpZGxlX2xvb3A7CisJCX0KKwkJdGVzdAlTU1RBVDAsRE1BRE9ORQlqbnogZG1hX2RtYWRvbmU7CisJCXRlc3QJU1NUQVQxLFBIQVNFTUlTCWp6IGRtYV9sb29wOwkvKiBpZS4gdW5kZXJydW4gKi8KK2RtYV9waGFzZW1pczoKKwkJLyoKKwkJICogV2Ugd2lsbCBiZSAiZG9uZSIgRE1BaW5nIHdoZW4gdGhlIHRyYW5zZmVyIGNvdW50IGdvZXMgdG8KKwkJICogemVybywgb3IgdGhlIHRhcmdldCBjaGFuZ2VzIHRoZSBwaGFzZSAoaW4gbGlnaHQgb2YgdGhpcywKKwkJICogaXQgbWFrZXMgc2Vuc2UgdGhhdCB0aGUgRE1BIGNpcmN1aXRyeSBkb2Vzbid0IEFDSyB3aGVuCisJCSAqIFBIQVNFTUlTIGlzIGFjdGl2ZSkuICBJZiB3ZSBhcmUgZG9pbmcgYSBTQ1NJLT5Ib3N0IHRyYW5zZmVyLAorCQkgKiB0aGUgZGF0YSBGSUZPIHNob3VsZCBiZSBmbHVzaGVkIGF1dG8tbWFnaWNhbGx5IG9uIFNUQ05UPTAKKwkJICogb3IgYSBwaGFzZSBjaGFuZ2UsIHNvIGp1c3Qgd2FpdCBmb3IgRklGTyBlbXB0eSBzdGF0dXMuCisJCSAqLworZG1hX2NoZWNrZmlmbzoKKwkJdGVzdAlERkNOVFJMLERJUkVDVElPTglqbnogZG1hX2ZpZm9lbXB0eTsKK2RtYV9maWZvZmx1c2g6CisJCXRlc3QJREZTVEFUVVMsRklGT0VNUAlqeiBkbWFfZmlmb2ZsdXNoOworZG1hX2ZpZm9lbXB0eToKKwkJLyogRG9uJ3QgY2xvYmJlciBhbiBpbnByb2dyZXNzIGhvc3QgZGF0YSB0cmFuc2ZlciAqLworCQl0ZXN0CURGU1RBVFVTLCBNUkVRUEVORAlqbnogZG1hX2ZpZm9lbXB0eTsKKworCQkvKgorCQkgKiBOb3cgc2h1dCBvZmYgdGhlIERNQSBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlIERNQQorCQkgKiBoYXJkd2FyZSBoYXMgYWN0dWFsbHkgc3RvcHBlZC4gIFRvdWNoaW5nIHRoZSBETUEKKwkJICogY291bnRlcnMsIGV0Yy4gd2hpbGUgYSBETUEgaXMgYWN0aXZlIHdpbGwgcmVzdWx0CisJCSAqIGluIGFuIElMTFNBRERSIGV4Y2VwdGlvbi4KKwkJICovCitkbWFfZG1hZG9uZToKKwkJYW5kCURGQ05UUkwsIH4oU0NTSUVOfFNETUFFTnxIRE1BRU4pOworZG1hX2hhbHQ6CisJCS8qCisJCSAqIFNvbWUgcmV2aXNpb25zIG9mIHRoZSBhaWM3OFhYIGhhdmUgYSBwcm9ibGVtIHdoZXJlLCBpZiB0aGUKKwkJICogZGF0YSBmaWZvIGlzIGZ1bGwsIGJ1dCB0aGUgUENJIGlucHV0IGxhdGNoIGlzIG5vdCBlbXB0eSwgCisJCSAqIEhETUFFTiBjYW5ub3QgYmUgY2xlYXJlZC4gIFRoZSBmaXggdXNlZCBoZXJlIGlzIHRvIGRyYWluCisJCSAqIHRoZSBwcmVmZXRjaGVkIGJ1dCB1bnVzZWQgZGF0YSBmcm9tIHRoZSBkYXRhIGZpZm8gdW50aWwKKwkJICogdGhlcmUgaXMgc3BhY2UgZm9yIHRoZSBpbnB1dCBsYXRjaCB0byBkcmFpbi4KKwkJICovCisJCWlmICgoYWhjLT5idWdzICYgQUhDX1BDSV8yXzFfUkVUUllfQlVHKSAhPSAwKSB7CisJCQltb3YJTk9ORSwgREZEQVQ7CisJCX0KKwkJdGVzdAlERkNOVFJMLCAoU0NTSUVOfFNETUFFTnxIRE1BRU4pIGpueiBkbWFfaGFsdDsKKworCQkvKiBTZWUgaWYgd2UgaGF2ZSBjb21wbGV0ZWQgdGhpcyBsYXN0IHNlZ21lbnQgKi8KKwkJdGVzdAlTVENOVFswXSwgMHhmZglqbnogZGF0YV9waGFzZV9maW5pc2g7CisJCXRlc3QJU1RDTlRbMV0sIDB4ZmYJam56IGRhdGFfcGhhc2VfZmluaXNoOworCQl0ZXN0CVNUQ05UWzJdLCAweGZmCWpueiBkYXRhX3BoYXNlX2ZpbmlzaDsKKworCQkvKgorCQkgKiBBZHZhbmNlIHRoZSBzY2F0dGVyLWdhdGhlciBwb2ludGVycyBpZiBuZWVkZWQgCisJCSAqLworCQlpZiAoKGFoYy0+YnVncyAmIEFIQ19QQ0lfTVdJX0JVRykgIT0gMAorCQkgICYmIGFoYy0+cGNpX2NhY2hlc2l6ZSAhPSAwKSB7CisJCQl0ZXN0CU1XSV9SRVNJRFVBTCwgMHhGRiBqeiBub19td2lfcmVzaWQ7CisJCQkvKgorCQkJICogUmVsb2FkIEhBRERSIGZyb20gU0hBRERSIGFuZCBzZXR1cCB0aGUKKwkJCSAqIGNvdW50IHRvIGJlIHRoZSBzaXplIG9mIG91ciByZXNpZHVhbC4KKwkJCSAqLworCQkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCQkJYm1vdglIQUREUiwgU0hBRERSLCA0OworCQkJCW1vdglIQ05ULCBNV0lfUkVTSURVQUw7CisJCQkJYm1vdglIQ05UWzFdLCBBTExaRVJPUywgMjsKKwkJCX0gZWxzZSB7CisJCQkJbXZpCURJTkRFWCwgSEFERFI7CisJCQkJbXZpCVNIQUREUiBjYWxsIGJjb3B5XzQ7CisJCQkJbW92CU1XSV9SRVNJRFVBTCBjYWxsIHNldF9oY250OworCQkJfQorCQkJY2xyCU1XSV9SRVNJRFVBTDsKKwkJCWptcAlzZ19sb2FkX2RvbmU7Citub19td2lfcmVzaWQ6CisJCX0KKwkJdGVzdAlTQ0JfUkVTSURVQUxfREFUQUNOVFszXSwgU0dfTEFTVF9TRUcganogc2dfbG9hZDsKKwkJb3IJU0NCX1JFU0lEVUFMX1NHUFRSWzBdLCBTR19MSVNUX05VTEw7CisJCWptcAlkYXRhX3BoYXNlX2ZpbmlzaDsKK3NnX2xvYWQ6CisJCS8qCisJCSAqIExvYWQgdGhlIG5leHQgU0cgZWxlbWVudCdzIGRhdGEgYWRkcmVzcyBhbmQgbGVuZ3RoCisJCSAqIGludG8gdGhlIERNQSBlbmdpbmUuICBJZiB3ZSBkb24ndCBoYXZlIGhhcmR3YXJlCisJCSAqIHRvIHBlcmZvcm0gYSBwcmVmZXRjaCwgd2UnbGwgaGF2ZSB0byBmZXRjaCB0aGUKKwkJICogc2VnbWVudCBmcm9tIGhvc3QgbWVtb3J5IGZpcnN0LgorCQkgKi8KKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCQkvKiBXYWl0IGZvciB0aGUgaWRsZSBsb29wIHRvIGNvbXBsZXRlICovCisJCQl0ZXN0CUNDU0dDVEwsIENDU0dFTiBqeiAuICsgMzsKKwkJCWNhbGwJaWRsZV9sb29wOworCQkJdGVzdAlDQ1NHQ1RMLCBDQ1NHRU4gam56IC4gLSAxOworCQkJYm1vdiAJSEFERFIsIENDU0dSQU0sIDc7CisJCQkvKgorCQkJICogV29ya2Fyb3VuZCBmb3IgZmxha3kgZXh0ZXJuYWwgU0NCIFJBTQorCQkJICogb24gY2VydGFpbiBhaWM3ODk1IHNldHVwcy4gIEl0IHNlZW1zCisJCQkgKiB1bmFibGUgdG8gaGFuZGxlIGRpcmVjdCB0cmFuc2ZlcnMgZnJvbQorCQkJICogUy9HIHJhbSB0byBjZXJ0YWluIFNDQiBsb2NhdGlvbnMuCisJCQkgKi8KKwkJCW1vdglTSU5ERVgsIENDU0dSQU07CisJCQltb3YJU0NCX1JFU0lEVUFMX0RBVEFDTlRbM10sIFNJTkRFWDsKKwkJfSBlbHNlIHsKKwkJCWlmICgoYWhjLT5mbGFncyAmIEFIQ18zOUJJVF9BRERSRVNTSU5HKSAhPSAwKSB7CisJCQkJbW92CUFMTFpFUk9TIGNhbGwgc2V0X2hoYWRkcjsKKwkJCX0KKwkJCW12aQlESU5ERVgsIEhBRERSOworCQkJbXZpCVNDQl9SRVNJRFVBTF9TR1BUUgljYWxsIGJjb3B5XzQ7CisKKwkJCW12aQlTR19TSVpFT0YJY2FsbCBzZXRfaGNudDsKKworCQkJb3IJREZDTlRSTCwgSERNQUVOfERJUkVDVElPTnxGSUZPUkVTRVQ7CisKKwkJCWNhbGwJZG1hX2ZpbmlzaDsKKworCQkJbXZpCURJTkRFWCwgSEFERFI7CisJCQljYWxsCWRmZGF0X2luXzc7CisJCQltb3YJU0NCX1JFU0lEVUFMX0RBVEFDTlRbM10sIERGREFUOworCQl9CisKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDXzM5QklUX0FERFJFU1NJTkcpICE9IDApIHsKKwkJCW1vdglTQ0JfUkVTSURVQUxfREFUQUNOVFszXSBjYWxsIHNldF9oaGFkZHI7CisKKwkJCS8qCisJCQkgKiBUaGUgbG93ZXN0IGFkZHJlc3MgYnl0ZSBtdXN0IGJlIGxvYWRlZAorCQkJICogbGFzdCBhcyBpdCB0cmlnZ2VycyB0aGUgY29tcHV0YXRpb24gb2YKKwkJCSAqIHNvbWUgaXRlbXMgaW4gdGhlIFBDSSBibG9jay4gIFRoZSBVTFRSQTIKKwkJCSAqIGNoaXBzIGRvIHRoaXMgb24gUFJFTE9BRC4KKwkJCSAqLworCQkJbW92CUhBRERSLCBIQUREUjsKKwkJfQorCQlpZiAoKGFoYy0+YnVncyAmIEFIQ19QQ0lfTVdJX0JVRykgIT0gMAorCQkgICYmIGFoYy0+cGNpX2NhY2hlc2l6ZSAhPSAwKSB7CisJCQljYWxsIGNhbGNfbXdpX3Jlc2lkdWFsOworCQl9CisKKwkJLyogUG9pbnQgdG8gdGhlIG5ldyBuZXh0IHNnIGluIG1lbW9yeSAqLworCQljYWxsCXNnX2FkdmFuY2U7CisKK3NnX2xvYWRfZG9uZToKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCQlibW92CVNUQ05ULCBIQ05ULCAzOworCQl9IGVsc2UgeworCQkJY2FsbAlzZXRfc3RjbnRfZnJvbV9oY250OworCQl9CisKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1RBUkdFVFJPTEUpICE9IDApIHsKKwkJCXRlc3QJU1NUQVQwLCBUQVJHRVQgam56IGRhdGFfcGhhc2VfbG9vcDsKKwkJfQorCX0KK2RhdGFfcGhhc2VfZmluaXNoOgorCS8qCisJICogSWYgdGhlIHRhcmdldCBoYXMgbGVmdCB1cyBpbiBkYXRhIHBoYXNlLCBsb29wIHRocm91Z2gKKwkgKiB0aGUgZG1hIGNvZGUgYWdhaW4uICBJbiB0aGUgY2FzZSBvZiBVTFRSQTIgYWRhcHRlcnMsCisJICogd2Ugc2hvdWxkIG9ubHkgbG9vcCBpZiB0aGVyZSBpcyBhIGRhdGEgb3ZlcnJ1bi4gIEZvcgorCSAqIGFsbCBvdGhlciBhZGFwdGVycywgd2UnbGwgbG9vcCBhZnRlciBlYWNoIFMvRyBlbGVtZW50CisJICogaXMgbG9hZGVkIGFzIHdlbGwgYXMgaWYgdGhlcmUgaXMgYW4gb3ZlcnJ1bi4KKwkgKi8KKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfVEFSR0VUUk9MRSkgIT0gMCkgeworCQl0ZXN0CVNTVEFUMCwgVEFSR0VUIGpueiBkYXRhX3BoYXNlX2RvbmU7CisJfQorCWlmICgoYWhjLT5mbGFncyAmIEFIQ19JTklUSUFUT1JST0xFKSAhPSAwKSB7CisJCXRlc3QJU1NUQVQxLCBSRVFJTklUIGp6IC47CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgPT0gMCkgeworCQkJdGVzdAlTU1RBVDEsUEhBU0VNSVMJanogZGF0YV9waGFzZV9sb29wOworCQl9IGVsc2UgeworCQkJdGVzdAlTQ1NJUEhBU0UsIERBVEFfUEhBU0VfTUFTSyBqbnogZGF0YV9waGFzZV9sb29wOworCQl9CisJfQorCitkYXRhX3BoYXNlX2RvbmU6CisJLyoKKwkgKiBBZnRlciBhIERNQSBmaW5pc2hlcywgc2F2ZSB0aGUgU0cgYW5kIFNUQ05UIHJlc2lkdWFscyBiYWNrIGludG8KKwkgKiB0aGUgU0NCLiAgV2UgdXNlIFNUQ05UIGluc3RlYWQgb2YgSENOVCwgc2luY2UgaXQncyBhIHJlZmxlY3Rpb24KKwkgKiBvZiBob3cgbWFueSBieXRlcyB3ZXJlIHRyYW5zZmVycmVkIG9uIHRoZSBTQ1NJIChhcyBvcHBvc2VkIHRvIHRoZQorCSAqIGhvc3QpIGJ1cy4KKwkgKi8KKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJLyogS2lsbCBvZmYgYW55IHBlbmRpbmcgcHJlZmV0Y2ggKi8KKwkJY2FsbAlkaXNhYmxlX2Njc2dlbjsKKwl9CisKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSA9PSAwKSB7CisJCS8qCisJCSAqIENsZWFyIHRoZSBoaWdoIGFkZHJlc3MgYnl0ZSBzbyB0aGF0IGFsbCBvdGhlciBETUEKKwkJICogb3BlcmF0aW9ucywgd2hpY2ggdXNlIDMyYml0IGFkZHJlc3NpbmcsIGNhbiBhc3N1bWUKKwkJICogSEhBRERSIGlzIDAuCisJCSAqLworCQlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfMzlCSVRfQUREUkVTU0lORykgIT0gMCkgeworCQkJbW92CUFMTFpFUk9TIGNhbGwgc2V0X2hoYWRkcjsKKwkJfQorCX0KKworCS8qCisJICogVXBkYXRlIG91ciByZXNpZHVhbCBpbmZvcm1hdGlvbiBiZWZvcmUgdGhlIGluZm9ybWF0aW9uIGlzCisJICogbG9zdCBieSBzb21lIG90aGVyIHR5cGUgb2YgU0NTSSBJL08gKGUuZy4gUElPKS4gIElmIHdlIGhhdmUKKwkgKiB0cmFuc2ZlcnJlZCBhbGwgZGF0YSwgbm8gdXBkYXRlIGlzIG5lZWRlZC4KKwkgKgorCSAqLworCXRlc3QJU0NCX1JFU0lEVUFMX1NHUFRSLCBTR19MSVNUX05VTEwgam56IHJlc2lkdWFsX3VwZGF0ZV9kb25lOworCWlmICgoYWhjLT5idWdzICYgQUhDX1BDSV9NV0lfQlVHKSAhPSAwCisJICAmJiBhaGMtPnBjaV9jYWNoZXNpemUgIT0gMCkgeworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJCXRlc3QJTVdJX1JFU0lEVUFMLCAweEZGIGp6IGJtb3ZfcmVzaWQ7CisJCX0KKwkJbW92CUEsIE1XSV9SRVNJRFVBTDsKKwkJYWRkCVNDQl9SRVNJRFVBTF9EQVRBQ05UWzBdLCBBLCBTVENOVFswXTsKKwkJY2xyCUE7CisJCWFkYwlTQ0JfUkVTSURVQUxfREFUQUNOVFsxXSwgQSwgU1RDTlRbMV07CisJCWFkYwlTQ0JfUkVTSURVQUxfREFUQUNOVFsyXSwgQSwgU1RDTlRbMl07CisJCWNscglNV0lfUkVTSURVQUw7CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQkJam1wCS4gKyAyOworYm1vdl9yZXNpZDoKKwkJCWJtb3YJU0NCX1JFU0lEVUFMX0RBVEFDTlQsIFNUQ05ULCAzOworCQl9CisJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQlibW92CVNDQl9SRVNJRFVBTF9EQVRBQ05ULCBTVENOVCwgMzsKKwl9IGVsc2UgeworCQltb3YJU0NCX1JFU0lEVUFMX0RBVEFDTlRbMF0sIFNUQ05UWzBdOworCQltb3YJU0NCX1JFU0lEVUFMX0RBVEFDTlRbMV0sIFNUQ05UWzFdOworCQltb3YJU0NCX1JFU0lEVUFMX0RBVEFDTlRbMl0sIFNUQ05UWzJdOworCX0KK3Jlc2lkdWFsX3VwZGF0ZV9kb25lOgorCS8qCisJICogU2luY2Ugd2UndmUgYmVlbiB0aHJvdWdoIGEgZGF0YSBwaGFzZSwgdGhlIFNDQl9SRVNJRCogZmllbGRzCisJICogYXJlIG5vdyBpbml0aWFsaXplZC4gIENsZWFyIHRoZSBmdWxsIHJlc2lkdWFsIGZsYWcuCisJICovCisJYW5kCVNDQl9TR1BUUlswXSwgflNHX0ZVTExfUkVTSUQ7CisKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCS8qIENsZWFyIHRoZSBjaGFubmVsIGluIGNhc2Ugd2UgcmV0dXJuIHRvIGRhdGEgcGhhc2UgbGF0ZXIgKi8KKwkJb3IJU1hGUkNUTDAsIENMUlNUQ05UfENMUkNITjsKKwkJb3IJU1hGUkNUTDAsIENMUlNUQ05UfENMUkNITjsKKwl9CisKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfVEFSR0VUUk9MRSkgIT0gMCkgeworCQl0ZXN0CVNFUV9GTEFHUywgRFBIQVNFX1BFTkRJTkcganogSVRsb29wOworCQlhbmQJU0VRX0ZMQUdTLCB+RFBIQVNFX1BFTkRJTkc7CisJCS8qCisJCSAqIEZvciBkYXRhLWluIHBoYXNlcywgd2FpdCBmb3IgYW55IHBlbmRpbmcgYWNrcyBmcm9tIHRoZQorCQkgKiBpbml0aWF0b3IgYmVmb3JlIGNoYW5naW5nIHBoYXNlLiAgV2Ugb25seSBuZWVkIHRvCisJCSAqIHNlbmQgSWdub3JlIFdpZGUgUmVzaWR1ZSBtZXNzYWdlcyBmb3IgZGF0YS1pbiBwaGFzZXMuCisJCSAqLworCQl0ZXN0CURGQ05UUkwsIERJUkVDVElPTiBqeiB0YXJnZXRfSVRsb29wOworCQl0ZXN0CVNTVEFUMSwgUkVRSU5JVAlqbnogLjsKKwkJdGVzdAlTQ0JfTFVOLCBTQ0JfWEZFUkxFTl9PREQganogdGFyZ2V0X0lUbG9vcDsKKwkJdGVzdAlTQ1NJUkFURSwgV0lERVhGRVIganogdGFyZ2V0X0lUbG9vcDsKKwkJLyoKKwkJICogSXNzdWUgYW4gSWdub3JlIFdpZGUgUmVzaWR1ZSBNZXNzYWdlLgorCQkgKi8KKwkJbXZpCVBfTUVTR0lOfEJTWU8gY2FsbCBjaGFuZ2VfcGhhc2U7CisJCW12aQlNU0dfSUdOX1dJREVfUkVTSURVRSBjYWxsIHRhcmdldF9vdXRiOworCQltdmkJMSBjYWxsIHRhcmdldF9vdXRiOworCQlqbXAJdGFyZ2V0X0lUbG9vcDsKKwl9IGVsc2UgeworCQlqbXAJSVRsb29wOworCX0KKworaWYgKChhaGMtPmZsYWdzICYgQUhDX0lOSVRJQVRPUlJPTEUpICE9IDApIHsKKy8qCisgKiBDb21tYW5kIHBoYXNlLiAgU2V0IHVwIHRoZSBETUEgcmVnaXN0ZXJzIGFuZCBsZXQgJ2VyIHJpcC4KKyAqLworcF9jb21tYW5kOgorCXRlc3QJU0VRX0ZMQUdTLCBOT1RfSURFTlRJRklFRCBqeiBwX2NvbW1hbmRfb2theTsKKwltdmkJUFJPVE9fVklPTEFUSU9OIGNhbGwgc2V0X3NlcWludDsKK3BfY29tbWFuZF9va2F5OgorCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQlibW92CUhDTlRbMF0sIFNDQl9DREJfTEVOLCAgMTsKKwkJYm1vdglIQ05UWzFdLCBBTExaRVJPUywgMjsKKwkJbXZpCVNHX0NBQ0hFX1BSRSwgTEFTVF9TRUc7CisJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQlibW92CVNUQ05UWzBdLCBTQ0JfQ0RCX0xFTiwgMTsKKwkJYm1vdglTVENOVFsxXSwgQUxMWkVST1MsIDI7CisJfSBlbHNlIHsKKwkJbW92CVNUQ05UWzBdLCBTQ0JfQ0RCX0xFTjsKKwkJY2xyCVNUQ05UWzFdOworCQljbHIJU1RDTlRbMl07CisJfQorCWFkZAlOT05FLCAtMTMsIFNDQl9DREJfTEVOOworCW12aQlTQ0JfQ0RCX1NUT1JFIGpuYyBwX2NvbW1hbmRfZW1iZWRkZWQ7CitwX2NvbW1hbmRfZnJvbV9ob3N0OgorCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJYm1vdglIQUREUlswXSwgU0NCX0NEQl9QVFIsIDQ7CisJCW12aQlERkNOVFJMLCAoUFJFTE9BREVOfFNDU0lFTnxIRE1BRU58RElSRUNUSU9OKTsKKwl9IGVsc2UgeworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJCWJtb3YJSEFERFJbMF0sIFNDQl9DREJfUFRSLCA0OworCQkJYm1vdglIQ05ULCBTVENOVCwgMzsKKwkJfSBlbHNlIHsKKwkJCW12aQlESU5ERVgsIEhBRERSOworCQkJbXZpCVNDQl9DREJfUFRSIGNhbGwgYmNvcHlfNDsKKwkJCW1vdglTQ0JfQ0RCX0xFTiBjYWxsIHNldF9oY250OworCQl9CisJCW12aQlERkNOVFJMLCAoU0NTSUVOfFNETUFFTnxIRE1BRU58RElSRUNUSU9OfEZJRk9SRVNFVCk7CisJfQorCWptcAlwX2NvbW1hbmRfeGZlcjsKK3BfY29tbWFuZF9lbWJlZGRlZDoKKwkvKgorCSAqIFRoZSBkYXRhIGZpZm8gc2VlbXMgdG8gcmVxdWlyZSA0IGJ5dGUgYWxpZ25lZAorCSAqIHRyYW5zZmVycyBmcm9tIHRoZSBzZXF1ZW5jZXIuICBGb3JjZSB0aGlzIHRvCisJICogYmUgdGhlIGNhc2UgYnkgY2xlYXJpbmcgSEFERFJbMF0gZXZlbiB0aG91Z2gKKwkgKiB3ZSBhcmVuJ3QgZ29pbmcgdG8gdG91Y2ggaG9zdCBtZW1vcnkuCisJICovCisJY2xyCUhBRERSWzBdOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJbXZpCURGQ05UUkwsIChQUkVMT0FERU58U0NTSUVOfERJUkVDVElPTik7CisJCWJtb3YJREZEQVQsIFNDQl9DREJfU1RPUkUsIDEyOyAKKwl9IGVsc2UgaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TQ0JfQlRUKSAhPSAwKSB7CisJCQkvKgorCQkJICogT24gdGhlIDc4OTUgdGhlIGRhdGEgRklGTyB3aWxsCisJCQkgKiBnZXQgY29ycnVwdGVkIGlmIHlvdSB0cnkgdG8gZHVtcAorCQkJICogZGF0YSBmcm9tIGV4dGVybmFsIFNDQiBtZW1vcnkgaW50bworCQkJICogdGhlIEZJRk8gd2hpbGUgaXQgaXMgZW5hYmxlZC4gIFNvLAorCQkJICogZmlsbCB0aGUgZmlmbyBhbmQgdGhlbiBlbmFibGUgU0NTSQorCQkJICogdHJhbnNmZXJzLgorCQkJICovCisJCQltdmkJREZDTlRSTCwgKERJUkVDVElPTnxGSUZPUkVTRVQpOworCQl9IGVsc2UgeworCQkJbXZpCURGQ05UUkwsIChTQ1NJRU58U0RNQUVOfERJUkVDVElPTnxGSUZPUkVTRVQpOworCQl9CisJCWJtb3YJREZEQVQsIFNDQl9DREJfU1RPUkUsIDEyOyAKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1NDQl9CVFQpICE9IDApIHsKKwkJCW12aQlERkNOVFJMLCAoU0NTSUVOfFNETUFFTnxESVJFQ1RJT058RklGT0ZMVVNIKTsKKwkJfSBlbHNlIHsKKwkJCW9yCURGQ05UUkwsIEZJRk9GTFVTSDsKKwkJfQorCX0gZWxzZSB7CisJCW12aQlERkNOVFJMLCAoU0NTSUVOfFNETUFFTnxESVJFQ1RJT058RklGT1JFU0VUKTsKKwkJY2FsbAljb3B5X3RvX2ZpZm9fNjsKKwkJY2FsbAljb3B5X3RvX2ZpZm9fNjsKKwkJb3IJREZDTlRSTCwgRklGT0ZMVVNIOworCX0KK3BfY29tbWFuZF94ZmVyOgorCWFuZAlTRVFfRkxBR1MsIH5OT19DREJfU0VOVDsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfRFQpID09IDApIHsKKwkJdGVzdAlTU1RBVDAsIFNET05FIGpueiAuICsgMjsKKwkJdGVzdCAgICBTU1RBVDEsIFBIQVNFTUlTIGp6IC4gLSAxOworCQkvKgorCQkgKiBXYWl0IGZvciBvdXIgQUNLIHRvIGdvLWF3YXkgb24gaXQncyBvd24KKwkJICogaW5zdGVhZCBvZiBiZWluZyBraWxsZWQgYnkgU0NTSUVOIGdldHRpbmcgY2xlYXJlZC4KKwkJICovCisJCXRlc3QJU0NTSVNJR0ksIEFDS0kgam56IC47CisJfSBlbHNlIHsKKwkJdGVzdAlERkNOVFJMLCBTQ1NJRU4gam56IC47CisJfQorCXRlc3QJU1NUQVQwLCBTRE9ORSBqbnogcF9jb21tYW5kX3N1Y2Nlc3NmdWw7CisJLyoKKwkgKiBEb24ndCBhbGxvdyBhIGRhdGEgcGhhc2UgaWYgdGhlIGNvbW1hbmQKKwkgKiB3YXMgbm90IGZ1bGx5IHRyYW5zZmVycmVkLgorCSAqLworCW9yCVNFUV9GTEFHUywgTk9fQ0RCX1NFTlQ7CitwX2NvbW1hbmRfc3VjY2Vzc2Z1bDoKKwlhbmQJREZDTlRSTCwgfihTQ1NJRU58U0RNQUVOfEhETUFFTik7CisJdGVzdAlERkNOVFJMLCAoU0NTSUVOfFNETUFFTnxIRE1BRU4pIGpueiAuOworCWptcAlJVGxvb3A7CisKKy8qCisgKiBTdGF0dXMgcGhhc2UuICBXYWl0IGZvciB0aGUgZGF0YSBieXRlIHRvIGFwcGVhciwgdGhlbiByZWFkIGl0CisgKiBhbmQgc3RvcmUgaXQgaW50byB0aGUgU0NCLgorICovCitwX3N0YXR1czoKKwl0ZXN0CVNFUV9GTEFHUywgTk9UX0lERU5USUZJRUQgam56IG1lc2dpbl9wcm90b192aW9sYXRpb247CitwX3N0YXR1c19va2F5OgorCW1vdglTQ0JfU0NTSV9TVEFUVVMsIFNDU0lEQVRMOworCW9yCVNDQl9DT05UUk9MLCBTVEFUVVNfUkNWRDsKKwlqbXAJSVRsb29wOworCisvKgorICogTWVzc2FnZSBvdXQgcGhhc2UuICBJZiBNU0dfT1VUIGlzIE1TR19JREVOVElGWUZMQUcsIGJ1aWxkIGEgZnVsbAorICogaW5kZW50aWZ5IG1lc3NhZ2Ugc2VxdWVuY2UgYW5kIHNlbmQgaXQgdG8gdGhlIHRhcmdldC4gIFRoZSBob3N0IG1heQorICogb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciBieSBzZXR0aW5nIHRoZSBNS19NRVNTQUdFIGJpdCBpbiB0aGUgU0NCCisgKiBjb250cm9sIGJ5dGUuICBUaGlzIHdpbGwgY2F1c2UgdXMgdG8gaW50ZXJydXB0IHRoZSBob3N0IGFuZCBhbGxvdworICogaXQgdG8gaGFuZGxlIHRoZSBtZXNzYWdlIHBoYXNlIGNvbXBsZXRlbHkgb24gaXRzIG93bi4gIElmIHRoZSBiaXQKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhcmdldCBpcyBzZXQsIHdlIHdpbGwgYWxzbyBpbnRlcnJ1cHQgdGhlIGhvc3QsCisgKiB0aGVyZWJ5IGFsbG93aW5nIGl0IHRvIHNlbmQgYSBtZXNzYWdlIG9uIHRoZSBuZXh0IHNlbGVjdGlvbiByZWdhcmRsZXNzCisgKiBvZiB0aGUgdHJhbnNhY3Rpb24gYmVpbmcgc2VudC4KKyAqIAorICogSWYgTVNHX09VVCBpcyA9PSBIT1NUX01TRywgYWxzbyBpbnRlcnJ1cHQgdGhlIGhvc3QgYW5kIHRha2UgYSBtZXNzYWdlLgorICogVGhpcyBpcyBkb25lIHRvIGFsbG93IHRoZSBob3N0IHRvIHNlbmQgbWVzc2FnZXMgb3V0c2lkZSBvZiBhbiBpZGVudGlmeQorICogc2VxdWVuY2Ugd2hpbGUgcHJvdGVjdGluZyB0aGUgc2VxZW5jZXIgZnJvbSB0ZXN0aW5nIHRoZSBNS19NRVNTQUdFIGJpdAorICogb24gYW4gU0NCIHRoYXQgbWlnaHQgbm90IGJlIGZvciB0aGUgY3VycmVudCBuZXh1cy4gKEZvciBleGFtcGxlLCBhCisgKiBCRFIgbWVzc2FnZSBpbiByZXNwb25jZSB0byBhIGJhZCByZXNlbGVjdGlvbiB3b3VsZCBsZWF2ZSB1cyBwb2ludGVkIHRvCisgKiBhbiBTQ0IgdGhhdCBkb2Vzbid0IGhhdmUgYW55dGhpbmcgdG8gZG8gd2l0aCB0aGUgY3VycmVudCB0YXJnZXQpLgorICoKKyAqIE90aGVyd2lzZSwgdHJlYXQgTVNHX09VVCBhcyBhIDEgYnl0ZSBtZXNzYWdlIHRvIHNlbmQgKGFib3J0LCBhYm9ydCB0YWcsCisgKiBidXMgZGV2aWNlIHJlc2V0KS4KKyAqCisgKiBXaGVuIHRoZXJlIGFyZSBubyBtZXNzYWdlcyB0byBzZW5kLCBNU0dfT1VUIHNob3VsZCBiZSBzZXQgdG8gTVNHX05PT1AsCisgKiBpbiBjYXNlIHRoZSB0YXJnZXQgZGVjaWRlcyB0byBwdXQgdXMgaW4gdGhpcyBwaGFzZSBmb3Igc29tZSBzdHJhbmdlCisgKiByZWFzb24uCisgKi8KK3BfbWVzZ291dF9yZXRyeToKKwkvKiBUdXJuIG9uIEFUTiBmb3IgdGhlIHJldHJ5ICovCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0RUKSA9PSAwKSB7CisJCW9yCVNDU0lTSUdPLCBBVE5PLCBMQVNUUEhBU0U7CisJfSBlbHNlIHsKKwkJbXZpCVNDU0lTSUdPLCBBVE5POworCX0KK3BfbWVzZ291dDoKKwltb3YJU0lOREVYLCBNU0dfT1VUOworCWNtcAlTSU5ERVgsIE1TR19JREVOVElGWUZMQUcgam5lIHBfbWVzZ291dF9mcm9tX2hvc3Q7CisJdGVzdAlTQ0JfQ09OVFJPTCxNS19NRVNTQUdFCWpueiBob3N0X21lc3NhZ2VfbG9vcDsKK3BfbWVzZ291dF9pZGVudGlmeToKKwlvcglTSU5ERVgsIE1TR19JREVOVElGWUZMQUd8RElTQ0VOQiwgU0FWRURfTFVOOworCXRlc3QJU0NCX0NPTlRST0wsIERJU0NFTkIgam56IC4gKyAyOworCWFuZAlTSU5ERVgsIH5ESVNDRU5COworLyoKKyAqIFNlbmQgYSB0YWcgbWVzc2FnZSBpZiBUQUdfRU5CIGlzIHNldCBpbiB0aGUgU0NCIGNvbnRyb2wgYmxvY2suCisgKiBVc2UgU0NCX1RBRyAodGhlIHBvc2l0aW9uIGluIHRoZSBrZXJuZWwncyBTQ0IgYXJyYXkpIGFzIHRoZSB0YWcgdmFsdWUuCisgKi8KK3BfbWVzZ291dF90YWc6CisJdGVzdAlTQ0JfQ09OVFJPTCxUQUdfRU5CIGp6ICBwX21lc2dvdXRfb25lYnl0ZTsKKwltb3YJU0NTSURBVEwsIFNJTkRFWDsJLyogU2VuZCB0aGUgaWRlbnRpZnkgbWVzc2FnZSAqLworCWNhbGwJcGhhc2VfbG9jazsKKwljbXAJTEFTVFBIQVNFLCBQX01FU0dPVVQJam5lIHBfbWVzZ291dF9kb25lOworCWFuZAlTQ1NJREFUTCxUQUdfRU5CfFNDQl9UQUdfVFlQRSxTQ0JfQ09OVFJPTDsKKwljYWxsCXBoYXNlX2xvY2s7CisJY21wCUxBU1RQSEFTRSwgUF9NRVNHT1VUCWpuZSBwX21lc2dvdXRfZG9uZTsKKwltb3YJU0NCX1RBRwlqbXAgcF9tZXNnb3V0X29uZWJ5dGU7CisvKgorICogSW50ZXJydXB0IHRoZSBkcml2ZXIsIGFuZCBhbGxvdyBpdCB0byBoYW5kbGUgdGhpcyBtZXNzYWdlCisgKiBwaGFzZSBhbmQgYW55IHJlcXVpcmVkIHJldHJpZXMuCisgKi8KK3BfbWVzZ291dF9mcm9tX2hvc3Q6CisJY21wCVNJTkRFWCwgSE9TVF9NU0cJam5lIHBfbWVzZ291dF9vbmVieXRlOworCWptcAlob3N0X21lc3NhZ2VfbG9vcDsKKworcF9tZXNnb3V0X29uZWJ5dGU6CisJbXZpCUNMUlNJTlQxLCBDTFJBVE5POworCW1vdglTQ1NJREFUTCwgU0lOREVYOworCisvKgorICogSWYgdGhlIG5leHQgYnVzIHBoYXNlIGFmdGVyIEFUTiBkcm9wcyBpcyBtZXNzYWdlIG91dCwgaXQgbWVhbnMKKyAqIHRoYXQgdGhlIHRhcmdldCBpcyByZXF1ZXN0aW5nIHRoYXQgdGhlIGxhc3QgbWVzc2FnZShzKSBiZSByZXNlbnQuCisgKi8KKwljYWxsCXBoYXNlX2xvY2s7CisJY21wCUxBU1RQSEFTRSwgUF9NRVNHT1VUCWplIHBfbWVzZ291dF9yZXRyeTsKKworcF9tZXNnb3V0X2RvbmU6CisJbXZpCUNMUlNJTlQxLENMUkFUTk87CS8qIEJlIHN1cmUgdG8gdHVybiBBVE5PIG9mZiAqLworCW1vdglMQVNUX01TRywgTVNHX09VVDsKKwltdmkJTVNHX09VVCwgTVNHX05PT1A7CS8qIE5vIG1lc3NhZ2UgbGVmdCAqLworCWptcAlJVGxvb3A7CisKKy8qCisgKiBNZXNzYWdlIGluIHBoYXNlLiAgQnl0ZXMgYXJlIHJlYWQgdXNpbmcgQXV0b21hdGljIFBJTyBtb2RlLgorICovCitwX21lc2dpbjoKKwltdmkJQUNDVU0JCWNhbGwgaW5iX2ZpcnN0OwkvKiByZWFkIHRoZSAxc3QgbWVzc2FnZSBieXRlICovCisKKwl0ZXN0CUEsTVNHX0lERU5USUZZRkxBRwlqbnogbWVzZ2luX2lkZW50aWZ5OworCWNtcAlBLE1TR19ESVNDT05ORUNUCWplIG1lc2dpbl9kaXNjb25uZWN0OworCWNtcAlBLE1TR19TQVZFREFUQVBPSU5URVIJamUgbWVzZ2luX3NkcHRyczsKKwljbXAJQUxMWkVST1MsQQkJamUgbWVzZ2luX2NvbXBsZXRlOworCWNtcAlBLE1TR19SRVNUT1JFUE9JTlRFUlMJamUgbWVzZ2luX3JkcHRyczsKKwljbXAJQSxNU0dfSUdOX1dJREVfUkVTSURVRQlqZSBtZXNnaW5faWduX3dpZGVfcmVzaWR1ZTsKKwljbXAJQSxNU0dfTk9PUAkJamUgbWVzZ2luX2RvbmU7CisKKy8qCisgKiBQdXNoZWQgbWVzc2FnZSBsb29wIHRvIGFsbG93IHRoZSBrZXJuZWwgdG8KKyAqIHJ1biBpdCdzIG93biBtZXNzYWdlIHN0YXRlIGVuZ2luZS4gIFRvIGF2b2lkIGFuCisgKiBleHRyYSBub3AgaW5zdHJ1Y3Rpb24gYWZ0ZXIgc2lnbmFsaW5nIHRoZSBrZXJuZWwsCisgKiB3ZSBwZXJmb3JtIHRoZSBwaGFzZV9sb2NrIGJlZm9yZSBjaGVja2luZyB0byBzZWUKKyAqIGlmIHdlIHNob3VsZCBleGl0IHRoZSBsb29wIGFuZCBza2lwIHRoZSBwaGFzZV9sb2NrCisgKiBpbiB0aGUgSVRsb29wLiAgUGVyZm9ybWluZyBiYWNrIHRvIGJhY2sgcGhhc2VfbG9ja3MKKyAqIHNob3VsZG4ndCBodXJ0LCBidXQgd2h5IGRvIGl0IHR3aWNlLi4uCisgKi8KK2hvc3RfbWVzc2FnZV9sb29wOgorCW12aQlIT1NUX01TR19MT09QIGNhbGwgc2V0X3NlcWludDsKKwljYWxsCXBoYXNlX2xvY2s7CisJY21wCVJFVFVSTl8xLCBFWElUX01TR19MT09QCWplIElUbG9vcCArIDE7CisJam1wCWhvc3RfbWVzc2FnZV9sb29wOworCittZXNnaW5faWduX3dpZGVfcmVzaWR1ZToKK2lmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSAhPSAwKSB7CisJdGVzdAlTQ1NJUkFURSwgV0lERVhGRVIganogbWVzZ2luX3JlamVjdDsKKwkvKiBQdWxsIHRoZSByZXNpZHVlIGJ5dGUgKi8KKwltdmkJQVJHXzEJY2FsbCBpbmJfbmV4dDsKKwljbXAJQVJHXzEsIDB4MDEgam5lIG1lc2dpbl9yZWplY3Q7CisJdGVzdAlTQ0JfUkVTSURVQUxfU0dQVFJbMF0sIFNHX0xJU1RfTlVMTCBqeiAuICsgMjsKKwl0ZXN0CVNDQl9MVU4sIFNDQl9YRkVSTEVOX09ERCBqbnogbWVzZ2luX2RvbmU7CisJbXZpCUlHTl9XSURFX1JFUyBjYWxsIHNldF9zZXFpbnQ7CisJam1wCW1lc2dpbl9kb25lOworfQorCittZXNnaW5fcHJvdG9fdmlvbGF0aW9uOgorCW12aQlQUk9UT19WSU9MQVRJT04gY2FsbCBzZXRfc2VxaW50OworCWptcAltZXNnaW5fZG9uZTsKK21lc2dpbl9yZWplY3Q6CisJbXZpCU1TR19NRVNTQUdFX1JFSkVDVAljYWxsIG1rX21lc2c7CittZXNnaW5fZG9uZToKKwltb3YJTk9ORSxTQ1NJREFUTDsJCS8qZHVtbXkgcmVhZCBmcm9tIGxhdGNoIHRvIEFDSyovCisJam1wCUlUbG9vcDsKKworLyoKKyAqIFdlIHJlY2VpdmVkIGEgImNvbW1hbmQgY29tcGxldGUiIG1lc3NhZ2UuICBQdXQgdGhlIFNDQl9UQUcgaW50byB0aGUgUU9VVEZJRk8sCisgKiBhbmQgdHJpZ2dlciBhIGNvbXBsZXRpb24gaW50ZXJydXB0LiAgQmVmb3JlIGRvaW5nIHNvLCBjaGVjayB0byBzZWUgaWYgdGhlcmUKKyAqIGlzIGEgcmVzaWR1YWwgb3IgdGhlIHN0YXR1cyBieXRlIGlzIHNvbWV0aGluZyBvdGhlciB0aGFuIFNUQVRVU19HT09EICgwKS4KKyAqIEluIGVpdGhlciBvZiB0aGVzZSBjb25kaXRpb25zLCB3ZSB1cGxvYWQgdGhlIFNDQiBiYWNrIHRvIHRoZSBob3N0IHNvIGl0IGNhbgorICogcHJvY2VzcyB0aGlzIGluZm9ybWF0aW9uLiAgSW4gdGhlIGNhc2Ugb2YgYSBub24gemVybyBzdGF0dXMgYnl0ZSwgd2UgCisgKiBhZGRpdGlvbmFsbHkgaW50ZXJydXB0IHRoZSBrZXJuZWwgZHJpdmVyIHN5bmNocm9ub3VzbHksIGFsbG93aW5nIGl0IHRvCisgKiBkZWNpZGUgaWYgc2Vuc2Ugc2hvdWxkIGJlIHJldHJpZXZlZC4gIElmIHRoZSBrZXJuZWwgZHJpdmVyIHdpc2hlcyB0byByZXF1ZXN0CisgKiBzZW5zZSwgaXQgd2lsbCBmaWxsIHRoZSBrZXJuZWwgU0NCIHdpdGggYSByZXF1ZXN0IHNlbnNlIGNvbW1hbmQsIHJlcXVldWUKKyAqIGl0IHRvIHRoZSBRSU5GSUZPIGFuZCB0ZWxsIHVzIG5vdCB0byBwb3N0IHRvIHRoZSBRT1VURklGTyBieSBzZXR0aW5nIAorICogUkVUVVJOXzEgdG8gU0VORF9TRU5TRS4KKyAqLworbWVzZ2luX2NvbXBsZXRlOgorCisJLyoKKwkgKiBJZiBBVE4gaXMgcmFpc2VkLCB3ZSBzdGlsbCB3YW50IHRvIGdpdmUgdGhlIHRhcmdldCBhIG1lc3NhZ2UuCisJICogUGVyaGFwcyB0aGVyZSB3YXMgYSBwYXJpdHkgZXJyb3Igb24gdGhpcyBsYXN0IG1lc3NhZ2UgYnl0ZS4KKwkgKiBFaXRoZXIgd2F5LCB0aGUgdGFyZ2V0IHNob3VsZCB0YWtlIHVzIHRvIG1lc3NhZ2Ugb3V0IHBoYXNlCisJICogYW5kIHRoZW4gYXR0ZW1wdCB0byBjb21wbGV0ZSB0aGUgY29tbWFuZCBhZ2Fpbi4gIFdlIHNob3VsZCB1c2UgYQorCSAqIGNyaXRpY2FsIHNlY3Rpb24gaGVyZSB0byBndWFyZCBhZ2FpbnN0IGEgdGltZW91dCB0cmlnZ2VyaW5nCisJICogZm9yIHRoaXMgY29tbWFuZCBhbmQgc2V0dGluZyBBVE4gd2hpbGUgd2UgYXJlIHN0aWxsIHByb2Nlc3NpbmcKKwkgKiB0aGUgY29tcGxldGlvbi4KKwl0ZXN0CVNDU0lTSUdJLCBBVE5JIGpueiBtZXNnaW5fZG9uZTsKKwkgKi8KKworCS8qCisJICogSWYgd2UgYXJlIGlkZW50aWZpZWQgYW5kIGhhdmUgc3VjY2Vzc2Z1bGx5IHNlbnQgdGhlIENEQiwKKwkgKiBhbnkgc3RhdHVzIHdpbGwgZG8uICBPcHRpbWl6ZSB0aGlzIGZhc3QgcGF0aC4KKwkgKi8KKwl0ZXN0CVNDQl9DT05UUk9MLCBTVEFUVVNfUkNWRCBqeiBtZXNnaW5fcHJvdG9fdmlvbGF0aW9uOworCXRlc3QJU0VRX0ZMQUdTLCBOT1RfSURFTlRJRklFRHxOT19DREJfU0VOVCBqeiBjb21wbGV0ZV9hY2NlcHRlZDsgCisKKwkvKgorCSAqIElmIHRoZSB0YXJnZXQgbmV2ZXIgc2VudCBhbiBpZGVudGlmeSBtZXNzYWdlIGJ1dCBpbnN0ZWFkIHdlbnQKKwkgKiB0byBtZXNnaW4gdG8gZ2l2ZSBhbiBpbnZhbGlkIG1lc3NhZ2UsIGxldCB0aGUgaG9zdCBhYm9ydCB1cy4KKwkgKi8KKwl0ZXN0CVNFUV9GTEFHUywgTk9UX0lERU5USUZJRUQgam56IG1lc2dpbl9wcm90b192aW9sYXRpb247CisKKwkvKgorCSAqIElmIHdlIHJlY2V2aWVkIGdvb2Qgc3RhdHVzIGJ1dCBuZXZlciBzdWNjZXNzZnVsbHkgc2VudCB0aGUKKwkgKiBjZGIsIGFib3J0IHRoZSBjb21tYW5kLgorCSAqLworCXRlc3QJU0NCX1NDU0lfU1RBVFVTLDB4ZmYJam56IGNvbXBsZXRlX2FjY2VwdGVkOworCXRlc3QJU0VRX0ZMQUdTLCBOT19DREJfU0VOVCBqbnogbWVzZ2luX3Byb3RvX3Zpb2xhdGlvbjsKKworY29tcGxldGVfYWNjZXB0ZWQ6CisJLyoKKwkgKiBTZWUgaWYgd2UgYXR0ZW1wdGVkIHRvIGRlbGl2ZXIgYSBtZXNzYWdlIGJ1dCB0aGUgdGFyZ2V0IGluZ25vcmVkIHVzLgorCSAqLworCXRlc3QJU0NCX0NPTlRST0wsIE1LX01FU1NBR0UganogLiArIDI7CisJbXZpCU1LTVNHX0ZBSUxFRCBjYWxsIHNldF9zZXFpbnQ7CisKKwkvKgorCSAqIENoZWNrIGZvciByZXNpZHVhbHMKKwkgKi8KKwl0ZXN0CVNDQl9TR1BUUiwgU0dfTElTVF9OVUxMIGpueiBjaGVja19zdGF0dXM7LyogTm8geGZlciAqLworCXRlc3QJU0NCX1NHUFRSLCBTR19GVUxMX1JFU0lEIGpueiB1cGxvYWRfc2NiOy8qIE5ldmVyIHhmZXJlZCAqLworCXRlc3QJU0NCX1JFU0lEVUFMX1NHUFRSLCBTR19MSVNUX05VTEwganogdXBsb2FkX3NjYjsKK2NoZWNrX3N0YXR1czoKKwl0ZXN0CVNDQl9TQ1NJX1NUQVRVUywweGZmCWp6IGNvbXBsZXRlOwkvKiBHb29kIFN0YXR1cz8gKi8KK3VwbG9hZF9zY2I6CisJb3IJU0NCX1NHUFRSLCBTR19SRVNJRF9WQUxJRDsKKwltdmkJRE1BUEFSQU1TLCBGSUZPUkVTRVQ7CisJbW92CVNDQl9UQUcJCWNhbGwgZG1hX3NjYjsKKwl0ZXN0CVNDQl9TQ1NJX1NUQVRVUywgMHhmZglqeiBjb21wbGV0ZTsJLyogSnVzdCBhIHJlc2lkdWFsPyAqLworCW12aQlCQURfU1RBVFVTIGNhbGwgc2V0X3NlcWludDsJCS8qIGxldCBkcml2ZXIga25vdyAqLworCWNtcAlSRVRVUk5fMSwgU0VORF9TRU5TRQlqbmUgY29tcGxldGU7CisJY2FsbAlhZGRfc2NiX3RvX2ZyZWVfbGlzdDsKKwlqbXAJYXdhaXRfYnVzZnJlZTsKK2NvbXBsZXRlOgorCW1vdglTQ0JfVEFHIGNhbGwgY29tcGxldGVfcG9zdDsKKwlqbXAJYXdhaXRfYnVzZnJlZTsKK30KKworY29tcGxldGVfcG9zdDoKKwkvKiBQb3N0IHRoZSBTQ0JJRCBpbiBTSU5ERVggYW5kIGlzc3VlIGFuIGludGVycnVwdCAqLworCWNhbGwJYWRkX3NjYl90b19mcmVlX2xpc3Q7CisJbW92CUFSR18xLCBTSU5ERVg7CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpICE9IDApIHsKKwkJbW92CUEsIFNEU0NCX1FPRkY7CisJfSBlbHNlIHsKKwkJbW92CUEsIFFPVVRQT1M7CisJfQorCW12aQlRT1VURklGT19PRkZTRVQgY2FsbCBwb3N0X2J5dGVfc2V0dXA7CisJbW92CUFSR18xIGNhbGwgcG9zdF9ieXRlOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19RVUVVRV9SRUdTKSA9PSAwKSB7CisJCWluYyAJUU9VVFBPUzsKKwl9CisJbXZpCUlOVFNUQVQsQ01EQ01QTFQgcmV0OworCitpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfSU5JVElBVE9SUk9MRSkgIT0gMCkgeworLyoKKyAqIElzIGl0IGEgZGlzY29ubmVjdCBtZXNzYWdlPyAgU2V0IGEgZmxhZyBpbiB0aGUgU0NCIHRvIHJlbWluZCB1cworICogYW5kIGF3YWl0IHRoZSBidXMgZ29pbmcgZnJlZS4gIElmIHRoaXMgaXMgYW4gdW50YWdnZWQgdHJhbnNhY3Rpb24KKyAqIHN0b3JlIHRoZSBTQ0IgaWQgZm9yIGl0IGluIG91ciB1bnRhZ2dlZCB0YXJnZXQgdGFibGUgZm9yIGxvb2t1cCBvbgorICogYSByZXNlbGN0aW9uLgorICovCittZXNnaW5fZGlzY29ubmVjdDoKKwkvKgorCSAqIElmIEFUTiBpcyByYWlzZWQsIHdlIHN0aWxsIHdhbnQgdG8gZ2l2ZSB0aGUgdGFyZ2V0IGEgbWVzc2FnZS4KKwkgKiBQZXJoYXBzIHRoZXJlIHdhcyBhIHBhcml0eSBlcnJvciBvbiB0aGlzIGxhc3QgbWVzc2FnZSBieXRlCisJICogb3Igd2Ugd2FudCB0byBhYm9ydCB0aGlzIGNvbW1hbmQuICBFaXRoZXIgd2F5LCB0aGUgdGFyZ2V0CisJICogc2hvdWxkIHRha2UgdXMgdG8gbWVzc2FnZSBvdXQgcGhhc2UgYW5kIHRoZW4gYXR0ZW1wdCB0bworCSAqIGRpc2Nvbm5lY3QgYWdhaW4uCisJICogWFhYIC0gV2FpdCBmb3IgbW9yZSB0ZXN0aW5nLgorCXRlc3QJU0NTSVNJR0ksIEFUTkkgam56IG1lc2dpbl9kb25lOworCSAqLworCXRlc3QJU0VRX0ZMQUdTLCBOT1RfSURFTlRJRklFRHxOT19DREJfU0VOVAorCQlqbnogbWVzZ2luX3Byb3RvX3Zpb2xhdGlvbjsKKwlvcglTQ0JfQ09OVFJPTCxESVNDT05ORUNURUQ7CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKSB7CisJCWNhbGwJYWRkX3NjYl90b19kaXNjX2xpc3Q7CisJfQorCXRlc3QJU0NCX0NPTlRST0wsIFRBR19FTkIgam56IGF3YWl0X2J1c2ZyZWU7CisJbW92CUFSR18xLCBTQ0JfVEFHOworCWFuZAlTQVZFRF9MVU4sIExJRCwgU0NCX0xVTjsKKwltb3YJU0NCX1NDU0lJRAljYWxsIHNldF9idXN5X3RhcmdldDsKKwlqbXAJYXdhaXRfYnVzZnJlZTsKKworLyoKKyAqIFNhdmUgZGF0YSBwb2ludGVycyBtZXNzYWdlOgorICogQ29weWluZyBSQU0gdmFsdWVzIGJhY2sgdG8gU0NCLCBmb3IgU2F2ZSBEYXRhIFBvaW50ZXJzIG1lc3NhZ2UsIGJ1dAorICogb25seSBpZiB3ZSd2ZSBhY3R1YWxseSBiZWVuIGludG8gYSBkYXRhIHBoYXNlIHRvIGNoYW5nZSB0aGVtLiAgVGhpcworICogcHJvdGVjdHMgYWdhaW5zdCBib2d1cyBkYXRhIGluIHNjcmF0Y2ggcmFtIGFuZCB0aGUgcmVzaWR1YWwgY291bnRzCisgKiBzaW5jZSB0aGV5IGFyZSBvbmx5IGluaXRpYWxpemVkIHdoZW4gd2UgZ28gaW50byBkYXRhX2luIG9yIGRhdGFfb3V0LgorICogQWNrIHRoZSBtZXNzYWdlIGFzIHNvb24gYXMgcG9zc2libGUuICBGb3IgY2hpcHMgd2l0aG91dCBTL0cgcGlwZWxpbmluZywKKyAqIHdlIGNhbiBvbmx5IGFjayB0aGUgbWVzc2FnZSBhZnRlciBTSEFERFIgaGFzIGJlZW4gc2F2ZWQuICBPbiB0aGVzZQorICogY2hpcHMsIFNIQUREUiBpbmNyZW1lbnRzIHdpdGggZXZlcnkgYnVzIHRyYW5zYWN0aW9uLCBldmVuIFBJTy4KKyAqLworbWVzZ2luX3NkcHRyczoKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCW1vdglOT05FLFNDU0lEQVRMOwkJLypkdW1teSByZWFkIGZyb20gbGF0Y2ggdG8gQUNLKi8KKwkJdGVzdAlTRVFfRkxBR1MsIERQSEFTRQlqeiBJVGxvb3A7CisJfSBlbHNlIHsKKwkJdGVzdAlTRVFfRkxBR1MsIERQSEFTRQlqeiBtZXNnaW5fZG9uZTsKKwl9CisKKwkvKgorCSAqIElmIHdlIGFyZSBhc2tlZCB0byBzYXZlIG91ciBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZQorCSAqIHRyYW5zZmVyLCBqdXN0IG1hcmsgdXMgYXQgdGhlIGVuZCByYXRoZXIgdGhhbiBwZXJmb3JtIGEKKwkgKiBmdWxsIHNhdmUuCisJICovCisJdGVzdAlTQ0JfUkVTSURVQUxfU0dQVFJbMF0sIFNHX0xJU1RfTlVMTCBqeiBtZXNnaW5fc2RwdHJzX2Z1bGw7CisJb3IJU0NCX1NHUFRSLCBTR19MSVNUX05VTEw7CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQlqbXAJSVRsb29wOworCX0gZWxzZSB7CisJCWptcAltZXNnaW5fZG9uZTsKKwl9CisKK21lc2dpbl9zZHB0cnNfZnVsbDoKKworCS8qCisJICogVGhlIFNDQl9TR1BUUiBiZWNvbWVzIHRoZSBuZXh0IG9uZSB3ZSdsbCBkb3dubG9hZCwKKwkgKiBhbmQgdGhlIFNDQl9EQVRBUFRSIGJlY29tZXMgdGhlIGN1cnJlbnQgU0hBRERSLgorCSAqIFVzZSB0aGUgcmVzaWR1YWwgbnVtYmVyIHNpbmNlIFNUQ05UIGlzIGNvcnJ1cHRlZCBieQorCSAqIGFueSBtZXNzYWdlIHRyYW5zZmVyLgorCSAqLworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQlibW92CVNDQl9EQVRBUFRSLCBTSEFERFIsIDQ7CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID09IDApIHsKKwkJCW1vdglOT05FLFNDU0lEQVRMOwkvKmR1bW15IHJlYWQgZnJvbSBsYXRjaCB0byBBQ0sqLworCQl9CisJCWJtb3YJU0NCX0RBVEFDTlQsIFNDQl9SRVNJRFVBTF9EQVRBQ05ULCA4OworCX0gZWxzZSB7CisJCW12aQlESU5ERVgsIFNDQl9EQVRBUFRSOworCQltdmkJU0hBRERSIGNhbGwgYmNvcHlfNDsKKwkJbW92CU5PTkUsU0NTSURBVEw7CS8qZHVtbXkgcmVhZCBmcm9tIGxhdGNoIHRvIEFDSyovCisJCW12aQlTQ0JfUkVTSURVQUxfREFUQUNOVCBjYWxsIGJjb3B5Xzg7CisJfQorCWptcAlJVGxvb3A7CisKKy8qCisgKiBSZXN0b3JlIHBvaW50ZXJzIG1lc3NhZ2U/ICBEYXRhIHBvaW50ZXJzIGFyZSByZWNvcGllZCBmcm9tIHRoZQorICogU0NCIGFueXRpbWUgd2UgZW50ZXIgYSBkYXRhIHBoYXNlIGZvciB0aGUgZmlyc3QgdGltZSwgc28gYWxsCisgKiB3ZSBuZWVkIHRvIGRvIGlzIGNsZWFyIHRoZSBEUEhBU0UgZmxhZyBhbmQgbGV0IHRoZSBkYXRhIHBoYXNlCisgKiBjb2RlIGRvIHRoZSByZXN0LiAgV2UgYWxzbyByZXNldC9yZWFsbG9jYXRlIHRoZSBGSUZPIHRvIG1ha2UKKyAqIHN1cmUgd2UgaGF2ZSBhIGNsZWFuIHN0YXJ0IGZvciB0aGUgbmV4dCBkYXRhIG9yIGNvbW1hbmQgcGhhc2UuCisgKi8KK21lc2dpbl9yZHB0cnM6CisJYW5kCVNFUV9GTEFHUywgfkRQSEFTRTsJCS8qCisJCQkJCQkgKiBXZSdsbCByZWxvYWQgdGhlbQorCQkJCQkJICogdGhlIG5leHQgdGltZSB0aHJvdWdoCisJCQkJCQkgKiB0aGUgZGF0YXBoYXNlLgorCQkJCQkJICovCisJb3IJU1hGUkNUTDAsIENMUlNUQ05UfENMUkNITjsKKwlqbXAJbWVzZ2luX2RvbmU7CisKKy8qCisgKiBJbmRleCBpbnRvIG91ciBCdXN5IFRhcmdldCB0YWJsZS4gIFNJTkRFWCBhbmQgRElOREVYIGFyZSBtb2RpZmllZAorICogdXBvbiByZXR1cm4uICBTQ0JQVFIgbWF5IGJlIG1vZGlmaWVkIGJ5IHRoaXMgYWN0aW9uLgorICovCitzZXRfYnVzeV90YXJnZXQ6CisJc2hyCURJTkRFWCwgNCwgU0lOREVYOworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TQ0JfQlRUKSAhPSAwKSB7CisJCW1vdglTQ0JQVFIsIFNBVkVEX0xVTjsKKwkJYWRkCURJTkRFWCwgU0NCXzY0X0JUVDsKKwl9IGVsc2UgeworCQlhZGQJRElOREVYLCBCVVNZX1RBUkdFVFM7CisJfQorCW1vdglESU5ESVIsIEFSR18xIHJldDsKKworLyoKKyAqIElkZW50aWZ5IG1lc3NhZ2U/ICBGb3IgYSByZWNvbm5lY3RpbmcgdGFyZ2V0LCB0aGlzIHRlbGxzIHVzIHRoZSBsdW4KKyAqIHRoYXQgdGhlIHJlY29ubmVjdGlvbiBpcyBmb3IgLSBmaW5kIHRoZSBjb3JyZWN0IFNDQiBhbmQgc3dpdGNoIHRvIGl0LAorICogY2xlYXJpbmcgdGhlICJkaXNjb25uZWN0ZWQiIGJpdCBzbyB3ZSBkb24ndCAiZmluZCIgaXQgYnkgYWNjaWRlbnQgbGF0ZXIuCisgKi8KK21lc2dpbl9pZGVudGlmeToKKwkvKgorCSAqIERldGVybWluZSB3aGV0aGVyIGEgdGFyZ2V0IGlzIHVzaW5nIHRhZ2dlZCBvciBub24tdGFnZ2VkCisJICogdHJhbnNhY3Rpb25zIGJ5IGZpcnN0IGxvb2tpbmcgYXQgdGhlIHRyYW5zYWN0aW9uIHN0b3JlZCBpbgorCSAqIHRoZSBidXN5IHRhcmdldCBhcnJheS4gIElmIHRoZXJlIGlzIG5vIHVudGFnZ2VkIHRyYW5zYWN0aW9uCisJICogZm9yIHRoaXMgdGFyZ2V0IG9yIHRoZSB0cmFuc2FjdGlvbiBpcyBmb3IgYSBkaWZmZXJlbnQgbHVuLCB0aGVuCisJICogdGhpcyBtdXN0IGJlIGEgdGFnZ2VkIHRyYW5zYWN0aW9uLgorCSAqLworCXNocglTSU5ERVgsIDQsIFNBVkVEX1NDU0lJRDsKKwlhbmQJU0FWRURfTFVOLCBNU0dfSURFTlRJRllfTFVOTUFTSywgQTsKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfU0NCX0JUVCkgIT0gMCkgeworCQlhZGQJU0lOREVYLCBTQ0JfNjRfQlRUOworCQltb3YJU0NCUFRSLCBTQVZFRF9MVU47CisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TRVFVRU5DRVJfREVCVUcpICE9IDApIHsKKwkJCWFkZAlOT05FLCAtU0NCXzY0X0JUVCwgU0lOREVYOworCQkJamMJLiArIDI7CisJCQltdmkJSU5UU1RBVCwgT1VUX09GX1JBTkdFOworCQkJbm9wOworCQkJYWRkCU5PTkUsIC0oU0NCXzY0X0JUVCArIDE2KSwgU0lOREVYOworCQkJam5jCS4gKyAyOworCQkJbXZpCUlOVFNUQVQsIE9VVF9PRl9SQU5HRTsKKwkJCW5vcDsKKwkJfQorCX0gZWxzZSB7CisJCWFkZAlTSU5ERVgsIEJVU1lfVEFSR0VUUzsKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1NFUVVFTkNFUl9ERUJVRykgIT0gMCkgeworCQkJYWRkCU5PTkUsIC1CVVNZX1RBUkdFVFMsIFNJTkRFWDsKKwkJCWpjCS4gKyAyOworCQkJbXZpCUlOVFNUQVQsIE9VVF9PRl9SQU5HRTsKKwkJCW5vcDsKKwkJCWFkZAlOT05FLCAtKEJVU1lfVEFSR0VUUyArIDE2KSwgU0lOREVYOworCQkJam5jCS4gKyAyOworCQkJbXZpCUlOVFNUQVQsIE9VVF9PRl9SQU5HRTsKKwkJCW5vcDsKKwkJfQorCX0KKwltb3YJQVJHXzEsIFNJTkRJUjsKKwljbXAJQVJHXzEsIFNDQl9MSVNUX05VTEwJamUgc25vb3BfdGFnOworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19QQUdFU0NCUykgIT0gMCkgeworCQltb3YJQVJHXzEgY2FsbCBmaW5kU0NCOworCX0gZWxzZSB7CisJCW1vdglTQ0JQVFIsIEFSR18xOworCX0KKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfU0NCX0JUVCkgIT0gMCkgeworCQlqbXAgc2V0dXBfU0NCX2lkX2x1bl9va2F5OworCX0gZWxzZSB7CisJCS8qCisJCSAqIFdlIG9ubHkgYWxsb3cgb25lIHVudGFnZ2VkIGNvbW1hbmQgcGVyLXRhcmdldAorCQkgKiBhdCBhIHRpbWUuICBTbywgaWYgdGhlIGx1biBkb2Vzbid0IG1hdGNoLCBsb29rCisJCSAqIGZvciBhIHRhZyBtZXNzYWdlLgorCQkgKi8KKwkJYW5kCUEsIExJRCwgU0NCX0xVTjsKKwkJY21wCVNBVkVEX0xVTiwgQQlqZSBzZXR1cF9TQ0JfaWRfbHVuX29rYXk7CisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19QQUdFU0NCUykgIT0gMCkgeworCQkJLyoKKwkJCSAqIGZpbmRTQ0IgcmVtb3ZlcyB0aGUgU0NCIGZyb20gdGhlCisJCQkgKiBkaXNjb25uZWN0ZWQgbGlzdCwgc28gd2UgbXVzdCByZXBsYWNlCisJCQkgKiBpdCB0aGVyZSBzaG91bGQgdGhpcyBTQ0IgYmUgZm9yIGFub3RoZXIKKwkJCSAqIGx1bi4KKwkJCSAqLworCQkJY2FsbAljbGVhbnVwX3NjYjsKKwkJfQorCX0KKworLyoKKyAqIEhlcmUgd2UgInNub29wIiB0aGUgYnVzIGxvb2tpbmcgZm9yIGEgU0lNUExFIFFVRVVFIFRBRyBtZXNzYWdlLgorICogSWYgd2UgZ2V0IG9uZSwgd2UgdXNlIHRoZSB0YWcgcmV0dXJuZWQgdG8gZmluZCB0aGUgcHJvcGVyCisgKiBTQ0IuICBXaXRoIFNDQiBwYWdpbmcsIHdlIG11c3Qgc2VhcmNoIGZvciBub24tdGFnZ2VkCisgKiB0cmFuc2FjdGlvbnMgc2luY2UgdGhlIFNDQiBtYXkgZXhpc3QgaW4gYW55IHNsb3QuICBJZiB3ZSdyZSBub3QKKyAqIHVzaW5nIFNDQiBwYWdpbmcsIHdlIGNhbiB1c2UgdGhlIHRhZyBhcyB0aGUgZGlyZWN0IGluZGV4IHRvIHRoZQorICogU0NCLgorICovCitzbm9vcF90YWc6CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1NFUVVFTkNFUl9ERUJVRykgIT0gMCkgeworCQlvcglTRVFfRkxBR1MsIDB4ODA7CisJfQorCW1vdglOT05FLFNDU0lEQVRMOwkJLyogQUNLIElkZW50aWZ5IE1TRyAqLworCWNhbGwJcGhhc2VfbG9jazsKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfU0VRVUVOQ0VSX0RFQlVHKSAhPSAwKSB7CisJCW9yCVNFUV9GTEFHUywgMHgxOworCX0KKwljbXAJTEFTVFBIQVNFLCBQX01FU0dJTglqbmUgbm90X2ZvdW5kOworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TRVFVRU5DRVJfREVCVUcpICE9IDApIHsKKwkJb3IJU0VRX0ZMQUdTLCAweDI7CisJfQorCWNtcAlTQ1NJQlVTTCxNU0dfU0lNUExFX1FfVEFHIGpuZSBub3RfZm91bmQ7CitnZXRfdGFnOgorCWlmICgoYWhjLT5mbGFncyAmIEFIQ19QQUdFU0NCUykgIT0gMCkgeworCQltdmkJQVJHXzEJY2FsbCBpbmJfbmV4dDsJLyogdGFnIHZhbHVlICovCisJCW1vdglBUkdfMQljYWxsIGZpbmRTQ0I7CisJfSBlbHNlIHsKKwkJbXZpCUFSR18xCWNhbGwgaW5iX25leHQ7CS8qIHRhZyB2YWx1ZSAqLworCQltb3YJU0NCUFRSLCBBUkdfMTsKKwl9CisKKy8qCisgKiBFbnN1cmUgdGhhdCB0aGUgU0NCIHRoZSB0YWcgcG9pbnRzIHRvIGlzIGZvcgorICogYW4gU0NCIHRyYW5zYWN0aW9uIHRvIHRoZSByZWNvbm5lY3RpbmcgdGFyZ2V0LgorICovCitzZXR1cF9TQ0I6CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1NFUVVFTkNFUl9ERUJVRykgIT0gMCkgeworCQlvcglTRVFfRkxBR1MsIDB4NDsKKwl9CisJbW92CUEsIFNDQl9TQ1NJSUQ7CisJY21wCVNBVkVEX1NDU0lJRCwgQQlqbmUgbm90X2ZvdW5kX2NsZWFudXBfc2NiOworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TRVFVRU5DRVJfREVCVUcpICE9IDApIHsKKwkJb3IJU0VRX0ZMQUdTLCAweDg7CisJfQorc2V0dXBfU0NCX2lkX29rYXk6CisJYW5kCUEsIExJRCwgU0NCX0xVTjsKKwljbXAJU0FWRURfTFVOLCBBCWpuZSBub3RfZm91bmRfY2xlYW51cF9zY2I7CitzZXR1cF9TQ0JfaWRfbHVuX29rYXk6CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1NFUVVFTkNFUl9ERUJVRykgIT0gMCkgeworCQlvcglTRVFfRkxBR1MsIDB4MTA7CisJfQorCXRlc3QJU0NCX0NPTlRST0wsRElTQ09OTkVDVEVEIGp6IG5vdF9mb3VuZF9jbGVhbnVwX3NjYjsKKwlhbmQJU0NCX0NPTlRST0wsfkRJU0NPTk5FQ1RFRDsKKwl0ZXN0CVNDQl9DT05UUk9MLCBUQUdfRU5CCWpueiBzZXR1cF9TQ0JfdGFnZ2VkOworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TQ0JfQlRUKSAhPSAwKSB7CisJCW1vdglBLCBTQ0JQVFI7CisJfQorCW12aQlBUkdfMSwgU0NCX0xJU1RfTlVMTDsKKwltb3YJU0FWRURfU0NTSUlECWNhbGwJc2V0X2J1c3lfdGFyZ2V0OworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TQ0JfQlRUKSAhPSAwKSB7CisJCW1vdglTQ0JQVFIsIEE7CisJfQorc2V0dXBfU0NCX3RhZ2dlZDoKKwljbHIJU0VRX0ZMQUdTOwkvKiBtYWtlIG5vdGUgb2YgSURFTlRJRlkgKi8KKwljYWxsCXNldF90cmFuc2Zlcl9zZXR0aW5nczsKKwkvKiBTZWUgaWYgdGhlIGhvc3Qgd2FudHMgdG8gc2VuZCBhIG1lc3NhZ2UgdXBvbiByZWNvbm5lY3Rpb24gKi8KKwl0ZXN0CVNDQl9DT05UUk9MLCBNS19NRVNTQUdFIGp6IG1lc2dpbl9kb25lOworCW12aQlIT1NUX01TRwljYWxsIG1rX21lc2c7CisJam1wCW1lc2dpbl9kb25lOworCitub3RfZm91bmRfY2xlYW51cF9zY2I6CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKSB7CisJCWNhbGwJY2xlYW51cF9zY2I7CisJfQorbm90X2ZvdW5kOgorCW12aQlOT19NQVRDSCBjYWxsIHNldF9zZXFpbnQ7CisJam1wCW1lc2dpbl9kb25lOworCitta19tZXNnOgorCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgPT0gMCkgeworCQlvcglTQ1NJU0lHTywgQVROTywgTEFTVFBIQVNFOworCX0gZWxzZSB7CisJCW12aQlTQ1NJU0lHTywgQVROTzsKKwl9CisJbW92CU1TR19PVVQsU0lOREVYIHJldDsKKworLyoKKyAqIEZ1bmN0aW9ucyB0byByZWFkIGRhdGEgaW4gQXV0b21hdGljIFBJTyBtb2RlLgorICoKKyAqIEFjY29yZGluZyB0byBBZGFwdGVjJ3MgZG9jdW1lbnRhdGlvbiwgYW4gQUNLIGlzIG5vdCBzZW50IG9uIGlucHV0IGZyb20KKyAqIHRoZSB0YXJnZXQgdW50aWwgU0NTSURBVEwgaXMgcmVhZCBmcm9tLiAgU28gd2Ugd2FpdCB1bnRpbCBTQ1NJREFUTCBpcworICogbGF0Y2hlZCAodGhlIHVzdWFsIHdheSksIHRoZW4gcmVhZCB0aGUgZGF0YSBieXRlIGRpcmVjdGx5IG9mZiB0aGUgYnVzCisgKiB1c2luZyBTQ1NJQlVTTC4gIFdoZW4gd2UgaGF2ZSBwdWxsZWQgdGhlIEFUTiBsaW5lLCBvciB3ZSBqdXN0IHdhbnQgdG8KKyAqIGFja25vd2xlZGdlIHRoZSBieXRlLCB0aGVuIHdlIGRvIGEgZHVtbXkgcmVhZCBmcm9tIFNDSVNEQVRMLiAgVGhlIFNDU0kKKyAqIHNwZWMgZ3VhcmFudGVlcyB0aGF0IHRoZSB0YXJnZXQgd2lsbCBob2xkIHRoZSBkYXRhIGJ5dGUgb24gdGhlIGJ1cyB1bnRpbAorICogd2Ugc2VuZCBvdXIgQUNLLgorICoKKyAqIFRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCB0aGVzZSBhcmUgY2FsbGVkIGluIGEgcGFydGljdWxhciBzZXF1ZW5jZSwKKyAqIGFuZCB0aGF0IFJFUSBpcyBhbHJlYWR5IHNldCB3aGVuIGluYl9maXJzdCBpcyBjYWxsZWQuICBpbmJfe2ZpcnN0LG5leHR9CisgKiB1c2UgdGhlIHNhbWUgY2FsbGluZyBjb252ZW50aW9uIGFzIGluYi4KKyAqLworaW5iX25leHRfd2FpdF9wZXJyOgorCW12aQlQRVJSX0RFVEVDVEVEIGNhbGwgc2V0X3NlcWludDsKKwlqbXAJaW5iX25leHRfd2FpdDsKK2luYl9uZXh0OgorCW1vdglOT05FLFNDU0lEQVRMOwkJLypkdW1teSByZWFkIGZyb20gbGF0Y2ggdG8gQUNLKi8KK2luYl9uZXh0X3dhaXQ6CisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIHBhcml0eSBlcnJvciwgd2FpdCBmb3IgdGhlIGtlcm5lbCB0bworCSAqIHNlZSB0aGUgaW50ZXJydXB0IGFuZCBwcmVwYXJlIG91ciBtZXNzYWdlIHJlc3BvbnNlCisJICogYmVmb3JlIGNvbnRpbnVpbmcuCisJICovCisJdGVzdAlTU1RBVDEsIFJFUUlOSVQJanogaW5iX25leHRfd2FpdDsKKwl0ZXN0CVNTVEFUMSwgU0NTSVBFUlIgam56IGluYl9uZXh0X3dhaXRfcGVycjsKK2luYl9uZXh0X2NoZWNrX3BoYXNlOgorCWFuZAlMQVNUUEhBU0UsIFBIQVNFX01BU0ssIFNDU0lTSUdJOworCWNtcAlMQVNUUEhBU0UsIFBfTUVTR0lOIGpuZSBtZXNnaW5fcGhhc2VtaXM7CitpbmJfZmlyc3Q6CisJbW92CURJTkRFWCxTSU5ERVg7CisJbW92CURJTkRJUixTQ1NJQlVTTAlyZXQ7CQkvKnJlYWQgYnl0ZSBkaXJlY3RseSBmcm9tIGJ1cyovCitpbmJfbGFzdDoKKwltb3YJTk9ORSxTQ1NJREFUTCByZXQ7CQkvKmR1bW15IHJlYWQgZnJvbSBsYXRjaCB0byBBQ0sqLworfQorCitpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfVEFSR0VUUk9MRSkgIT0gMCkgeworLyoKKyAqIENoYW5nZSB0byBhIG5ldyBwaGFzZS4gIElmIHdlIGFyZSBjaGFuZ2luZyB0aGUgc3RhdGUgb2YgdGhlIEkvTyBzaWduYWwsCisgKiBmcm9tIG91dCB0byBpbiwgd2FpdCBhbiBhZGRpdGlvbmFsIGRhdGEgcmVsZWFzZSBkZWxheSBiZWZvcmUgY29udGludWluZy4KKyAqLworY2hhbmdlX3BoYXNlOgorCS8qIFdhaXQgZm9yIHByZWNlZWRpbmcgSS9PIHNlc3Npb24gdG8gY29tcGxldGUuICovCisJdGVzdAlTQ1NJU0lHSSwgQUNLSSBqbnogLjsKKworCS8qIENoYW5nZSB0aGUgcGhhc2UgKi8KKwlhbmQJRElOREVYLCBJT0ksIFNDU0lTSUdJOworCW1vdglTQ1NJU0lHTywgU0lOREVYOworCWFuZAlBLCBJT0ksIFNJTkRFWDsKKworCS8qCisJICogSWYgdGhlIGRhdGEgZGlyZWN0aW9uIGhhcyBjaGFuZ2VkLCBmcm9tCisJICogb3V0IChpbml0aWF0b3IgZHJpdmluZykgdG8gaW4gKHRhcmdldCBkcml2aW5nKSwKKwkgKiB3ZSBtdXN0IHdhaXQgYXQgbGVhc3QgYSBkYXRhIHJlbGVhc2UgZGVsYXkgcGx1cworCSAqIHRoZSBub3JtYWwgYnVzIHNldHRsZSBkZWxheS4gW1NDU0kgSUlJIFNQSSAxMC4xMS4wXQorCSAqLworCWNtcCAJRElOREVYLCBBIGplIGNoYW5nZV9waGFzZV93YWl0OworCXRlc3QJU0lOREVYLCBJT0kganogY2hhbmdlX3BoYXNlX3dhaXQ7CisJY2FsbAljaGFuZ2VfcGhhc2Vfd2FpdDsKK2NoYW5nZV9waGFzZV93YWl0OgorCW5vcDsKKwlub3A7CisJbm9wOworCW5vcCByZXQ7CisKKy8qCisgKiBTZW5kIGEgYnl0ZSB0byBhbiBpbml0aWF0b3IgaW4gQXV0b21hdGljIFBJTyBtb2RlLgorICovCit0YXJnZXRfb3V0YjoKKwlvcglTWEZSQ1RMMCwgU1BJT0VOOworCXRlc3QJU1NUQVQwLCBTUElPUkRZCWp6IC47CisJbW92CVNDU0lEQVRMLCBTSU5ERVg7CisJdGVzdAlTU1RBVDAsIFNQSU9SRFkJanogLjsKKwlhbmQJU1hGUkNUTDAsIH5TUElPRU4gcmV0OworfQorCQorLyoKKyAqIExvY2F0ZSBhIGRpc2Nvbm5lY3RlZCBTQ0IgYnkgU0NCSUQuICBVcG9uIHJldHVybiwgU0NCUFRSIGFuZCBTSU5ERVggd2lsbAorICogYmUgc2V0IHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgU0NCLiAgSWYgdGhlIFNDQiBjYW5ub3QgYmUgZm91bmQgbG9jYWxseSwKKyAqIGl0IHdpbGwgYmUgcGFnZWQgaW4gZnJvbSBob3N0IG1lbW9yeS4gIFJFVFVSTl8yIHN0b3JlcyB0aGUgYWRkcmVzcyBvZiB0aGUKKyAqIHByZWNlZGluZyBTQ0IgaW4gdGhlIGRpc2Nvbm5lY3RlZCBsaXN0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHNwZWVkIHVwCisgKiByZW1vdmFsIG9mIHRoZSBmb3VuZCBTQ0IgZnJvbSB0aGUgZGlzY29ubmVjdGVkIGxpc3QuCisgKi8KK2lmICgoYWhjLT5mbGFncyAmIEFIQ19QQUdFU0NCUykgIT0gMCkgeworQkVHSU5fQ1JJVElDQUw7CitmaW5kU0NCOgorCW1vdglBLCBTSU5ERVg7CQkJLyogVGFnIHBhc3NlZCBpbiBTSU5ERVggKi8KKwljbXAJRElTQ09OTkVDVEVEX1NDQkgsIFNDQl9MSVNUX05VTEwgamUgZmluZFNDQl9ub3RGb3VuZDsKKwltb3YJU0NCUFRSLCBESVNDT05ORUNURURfU0NCSDsJLyogSW5pdGlhbGl6ZSBTQ0JQVFIgKi8KKwltdmkJQVJHXzIsIFNDQl9MSVNUX05VTEw7CQkvKiBIZWFkIG9mIGxpc3QgKi8KKwlqbXAJZmluZFNDQl9sb29wOworZmluZFNDQl9uZXh0OgorCWNtcAlTQ0JfTkVYVCwgU0NCX0xJU1RfTlVMTCBqZSBmaW5kU0NCX25vdEZvdW5kOworCW1vdglBUkdfMiwgU0NCUFRSOworCW1vdglTQ0JQVFIsU0NCX05FWFQ7CitmaW5kU0NCX2xvb3A6CisJY21wCVNDQl9UQUcsIEEJam5lIGZpbmRTQ0JfbmV4dDsKK3JlbV9zY2JfZnJvbV9kaXNjX2xpc3Q6CisJY21wCUFSR18yLCBTQ0JfTElTVF9OVUxMCWplIHJIZWFkOworCW1vdglESU5ERVgsIFNDQl9ORVhUOworCW1vdglTSU5ERVgsIFNDQlBUUjsKKwltb3YJU0NCUFRSLCBBUkdfMjsKKwltb3YJU0NCX05FWFQsIERJTkRFWDsKKwltb3YJU0NCUFRSLCBTSU5ERVggcmV0OworckhlYWQ6CisJbW92CURJU0NPTk5FQ1RFRF9TQ0JILFNDQl9ORVhUIHJldDsKK0VORF9DUklUSUNBTDsKK2ZpbmRTQ0Jfbm90Rm91bmQ6CisJLyoKKwkgKiBXZSBkaWRuJ3QgZmluZCBpdC4gIFBhZ2UgaW4gdGhlIFNDQi4KKwkgKi8KKwltb3YJQVJHXzEsIEE7IC8qIFNhdmUgdGFnICovCisJbW92CUFMTFpFUk9TIGNhbGwgZ2V0X2ZyZWVfb3JfZGlzY19zY2I7CisJbXZpCURNQVBBUkFNUywgSERNQUVOfERJUkVDVElPTnxGSUZPUkVTRVQ7CisJbW92CUFSR18xCWptcCBkbWFfc2NiOworfQorCisvKgorICogUHJlcGFyZSB0aGUgaGFyZHdhcmUgdG8gcG9zdCBhIGJ5dGUgdG8gaG9zdCBtZW1vcnkgZ2l2ZW4gYW4KKyAqIGluZGV4IG9mIChBICsgKDI1NiAqIFNJTkRFWCkpIGFuZCBhIGJhc2UgYWRkcmVzcyBvZiBTSEFSRURfREFUQV9BRERSLgorICovCitwb3N0X2J5dGVfc2V0dXA6CisJbW92CUFSR18yLCBTSU5ERVg7CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCW12aQlESU5ERVgsIENDSEFERFI7CisJCW12aQlTSEFSRURfREFUQV9BRERSIGNhbGwJc2V0XzFieXRlX2FkZHI7CisJCW12aQlDQ0hDTlQsIDE7CisJCW12aQlDQ1NDQkNUTCwgQ0NTQ0JSRVNFVCByZXQ7CisJfSBlbHNlIHsKKwkJbXZpCURJTkRFWCwgSEFERFI7CisJCW12aQlTSEFSRURfREFUQV9BRERSIGNhbGwJc2V0XzFieXRlX2FkZHI7CisJCW12aQkxCWNhbGwgc2V0X2hjbnQ7CisJCW12aQlERkNOVFJMLCBGSUZPUkVTRVQgcmV0OworCX0KKworcG9zdF9ieXRlOgorCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQlibW92CUNDU0NCUkFNLCBTSU5ERVgsIDE7CisJCW9yCUNDU0NCQ1RMLCBDQ1NDQkVOfENDU0NCUkVTRVQ7CisJCXRlc3QJQ0NTQ0JDVEwsIENDU0NCRE9ORSBqeiAuOworCQljbHIJQ0NTQ0JDVEwgcmV0OworCX0gZWxzZSB7CisJCW1vdglERkRBVCwgU0lOREVYOworCQlvcglERkNOVFJMLCBIRE1BRU58RklGT0ZMVVNIOworCQlqbXAJZG1hX2ZpbmlzaDsKKwl9CisKK3BoYXNlX2xvY2tfcGVycjoKKwltdmkJUEVSUl9ERVRFQ1RFRCBjYWxsIHNldF9zZXFpbnQ7CitwaGFzZV9sb2NrOiAgICAgCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIHBhcml0eSBlcnJvciwgd2FpdCBmb3IgdGhlIGtlcm5lbCB0bworCSAqIHNlZSB0aGUgaW50ZXJydXB0IGFuZCBwcmVwYXJlIG91ciBtZXNzYWdlIHJlc3BvbnNlCisJICogYmVmb3JlIGNvbnRpbnVpbmcuCisJICovCisJdGVzdAlTU1RBVDEsIFJFUUlOSVQganogcGhhc2VfbG9jazsKKwl0ZXN0CVNTVEFUMSwgU0NTSVBFUlIgam56IHBoYXNlX2xvY2tfcGVycjsKK3BoYXNlX2xvY2tfbGF0Y2hfcGhhc2U6CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0RUKSA9PSAwKSB7CisJCWFuZAlTQ1NJU0lHTywgUEhBU0VfTUFTSywgU0NTSVNJR0k7CisJfQorCWFuZAlMQVNUUEhBU0UsIFBIQVNFX01BU0ssIFNDU0lTSUdJIHJldDsKKworaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSA9PSAwKSB7CitzZXRfaGNudDoKKwltb3YJSENOVFswXSwgU0lOREVYOworY2xlYXJfaGNudDoKKwljbHIJSENOVFsxXTsKKwljbHIJSENOVFsyXSByZXQ7CisKK3NldF9zdGNudF9mcm9tX2hjbnQ6CisJbW92CVNUQ05UWzBdLCBIQ05UWzBdOworCW1vdglTVENOVFsxXSwgSENOVFsxXTsKKwltb3YJU1RDTlRbMl0sIEhDTlRbMl0gcmV0OworCitiY29weV84OgorCW1vdglESU5ESVIsIFNJTkRJUjsKK2Jjb3B5Xzc6CisJbW92CURJTkRJUiwgU0lORElSOworCW1vdglESU5ESVIsIFNJTkRJUjsKK2Jjb3B5XzU6CisJbW92CURJTkRJUiwgU0lORElSOworYmNvcHlfNDoKKwltb3YJRElORElSLCBTSU5ESVI7CitiY29weV8zOgorCW1vdglESU5ESVIsIFNJTkRJUjsKKwltb3YJRElORElSLCBTSU5ESVI7CisJbW92CURJTkRJUiwgU0lORElSIHJldDsKK30KKworaWYgKChhaGMtPmZsYWdzICYgQUhDX1RBUkdFVFJPTEUpICE9IDApIHsKKy8qCisgKiBTZXR1cCBhZGRyIGFzc3VtaW5nIHRoYXQgQSBpcyBhbiBpbmRleCBpbnRvCisgKiBhbiBhcnJheSBvZiAzMmJ5dGUgb2JqZWN0cywgU0lOREVYIGNvbnRhaW5zCisgKiB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoYXQgYXJyYXksIGFuZCBESU5ERVgKKyAqIGNvbnRhaW5zIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGxvY2F0aW9uCisgKiB0byBzdG9yZSB0aGUgaW5kZXhlZCBhZGRyZXNzLgorICovCitzZXRfMzJieXRlX2FkZHI6CisJc2hyCUFSR18yLCAzLCBBOworCXNobAlBLCA1OworCWptcAlzZXRfMWJ5dGVfYWRkcjsKK30KKworLyoKKyAqIFNldHVwIGFkZHIgYXNzdW1pbmcgdGhhdCBBIGlzIGFuIGluZGV4IGludG8KKyAqIGFuIGFycmF5IG9mIDY0Ynl0ZSBvYmplY3RzLCBTSU5ERVggY29udGFpbnMKKyAqIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhhdCBhcnJheSwgYW5kIERJTkRFWAorICogY29udGFpbnMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgbG9jYXRpb24KKyAqIHRvIHN0b3JlIHRoZSBpbmRleGVkIGFkZHJlc3MuCisgKi8KK3NldF82NGJ5dGVfYWRkcjoKKwlzaHIJQVJHXzIsIDIsIEE7CisJc2hsCUEsIDY7CisKKy8qCisgKiBTZXR1cCBhZGRyIGFzc3VtaW5nIHRoYXQgQSArIChBUkdfMiAqIDI1NikgaXMgYW4KKyAqIGluZGV4IGludG8gYW4gYXJyYXkgb2YgMWJ5dGUgb2JqZWN0cywgU0lOREVYIGNvbnRhaW5zCisgKiB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoYXQgYXJyYXksIGFuZCBESU5ERVggY29udGFpbnMKKyAqIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBjb21wdXRlZAorICogYWRkcmVzcy4KKyAqLworc2V0XzFieXRlX2FkZHI6CisJYWRkICAgICBESU5ESVIsIEEsIFNJTkRJUjsKKwltb3YgICAgIEEsIEFSR18yOworCWFkYwlESU5ESVIsIEEsIFNJTkRJUjsKKwljbHIJQTsKKwlhZGMJRElORElSLCBBLCBTSU5ESVI7CisJYWRjCURJTkRJUiwgQSwgU0lORElSIHJldDsKKworLyoKKyAqIEVpdGhlciBwb3N0IG9yIGZldGNoIGFuIFNDQiBmcm9tIGhvc3QgbWVtb3J5IGJhc2VkIG9uIHRoZQorICogRElSRUNUSU9OIGJpdCBpbiBETUFQQVJBTVMuIFRoZSBob3N0IFNDQiBpbmRleCBpcyBpbiBTSU5ERVguCisgKi8KK2RtYV9zY2I6CisJbW92CUEsIFNJTkRFWDsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJbXZpCURJTkRFWCwgQ0NIQUREUjsKKwkJbXZpCUhTQ0JfQUREUiBjYWxsIHNldF82NGJ5dGVfYWRkcjsKKwkJbW92CUNDU0NCUFRSLCBTQ0JQVFI7CisJCXRlc3QJRE1BUEFSQU1TLCBESVJFQ1RJT04ganogZG1hX3NjYl90b2hvc3Q7CisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TQ0JfQlRUKSAhPSAwKSB7CisJCQltdmkJQ0NIQ05ULCBTQ0JfRE9XTkxPQURfU0laRV82NDsKKwkJfSBlbHNlIHsKKwkJCW12aQlDQ0hDTlQsIFNDQl9ET1dOTE9BRF9TSVpFOworCQl9CisJCW12aQlDQ1NDQkNUTCwgQ0NBUlJFTnxDQ1NDQkVOfENDU0NCRElSfENDU0NCUkVTRVQ7CisJCWNtcAlDQ1NDQkNUTCwgQ0NTQ0JET05FfEFSUkRPTkV8Q0NBUlJFTnxDQ1NDQkVOfENDU0NCRElSIGpuZSAuOworCQlqbXAJZG1hX3NjYl9maW5pc2g7CitkbWFfc2NiX3RvaG9zdDoKKwkJbXZpCUNDSENOVCwgU0NCX1VQTE9BRF9TSVpFOworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSA9PSAwKSB7CisJCQltdmkJQ0NTQ0JDVEwsIENDU0NCUkVTRVQ7CisJCQlibW92CUNDU0NCUkFNLCBTQ0JfQkFTRSwgU0NCX1VQTE9BRF9TSVpFOworCQkJb3IJQ0NTQ0JDVEwsIENDU0NCRU58Q0NTQ0JSRVNFVDsKKwkJCXRlc3QJQ0NTQ0JDVEwsIENDU0NCRE9ORSBqeiAuOworCQl9IGVsc2UgaWYgKChhaGMtPmJ1Z3MgJiBBSENfU0NCQ0hBTl9VUExPQURfQlVHKSAhPSAwKSB7CisJCQltdmkJQ0NTQ0JDVEwsIENDQVJSRU58Q0NTQ0JSRVNFVDsKKwkJCWNtcAlDQ1NDQkNUTCwgQVJSRE9ORXxDQ0FSUkVOIGpuZSAuOworCQkJbXZpCUNDSENOVCwgU0NCX1VQTE9BRF9TSVpFOworCQkJbXZpCUNDU0NCQ1RMLCBDQ1NDQkVOfENDU0NCUkVTRVQ7CisJCQljbXAJQ0NTQ0JDVEwsIENDU0NCRE9ORXxDQ1NDQkVOIGpuZSAuOworCQl9IGVsc2UgeworCQkJbXZpCUNDU0NCQ1RMLCBDQ0FSUkVOfENDU0NCRU58Q0NTQ0JSRVNFVDsKKwkJCWNtcAlDQ1NDQkNUTCwgQ0NTQ0JET05FfEFSUkRPTkV8Q0NBUlJFTnxDQ1NDQkVOIGpuZSAuOworCQl9CitkbWFfc2NiX2ZpbmlzaDoKKwkJY2xyCUNDU0NCQ1RMOworCQl0ZXN0CUNDU0NCQ1RMLCBDQ0FSUkVOfENDU0NCRU4gam56IC47CisJCXJldDsKKwl9IGVsc2UgeworCQltdmkJRElOREVYLCBIQUREUjsKKwkJbXZpCUhTQ0JfQUREUiBjYWxsIHNldF82NGJ5dGVfYWRkcjsKKwkJbXZpCVNDQl9ET1dOTE9BRF9TSVpFIGNhbGwgc2V0X2hjbnQ7CisJCW1vdglERkNOVFJMLCBETUFQQVJBTVM7CisJCXRlc3QJRE1BUEFSQU1TLCBESVJFQ1RJT04Jam56IGRtYV9zY2JfZnJvbWhvc3Q7CisJCS8qIEZpbGwgaXQgd2l0aCB0aGUgU0NCIGRhdGEgKi8KK2NvcHlfc2NiX3RvZmlmbzoKKwkJbXZpCVNJTkRFWCwgU0NCX0JBU0U7CisJCWFkZAlBLCBTQ0JfRE9XTkxPQURfU0laRSwgU0lOREVYOworY29weV9zY2JfdG9maWZvX2xvb3A6CisJCWNhbGwJY29weV90b19maWZvXzg7CisJCWNtcAlTSU5ERVgsIEEgam5lIGNvcHlfc2NiX3RvZmlmb19sb29wOworCQlvcglERkNOVFJMLCBIRE1BRU58RklGT0ZMVVNIOworCQlqbXAJZG1hX2ZpbmlzaDsKK2RtYV9zY2JfZnJvbWhvc3Q6CisJCW12aQlESU5ERVgsIFNDQl9CQVNFOworCQlpZiAoKGFoYy0+YnVncyAmIEFIQ19QQ0lfMl8xX1JFVFJZX0JVRykgIT0gMCkgeworCQkJLyoKKwkJCSAqIFRoZSBQQ0kgbW9kdWxlIHdpbGwgb25seSBpc3N1ZSBhIFBDSQorCQkJICogcmV0cnkgaWYgdGhlIGRhdGEgRklGTyBpcyBlbXB0eS4gIElmIHRoZQorCQkJICogaG9zdCBkaXNjb25uZWN0cyBpbiB0aGUgbWlkZGxlIG9mIGEKKwkJCSAqIHRyYW5zZmVyLCB3ZSBtdXN0IGVtcHR5IHRoZSBmaWZvIG9mIGFsbAorCQkJICogYXZhaWxhYmxlIGRhdGEgdG8gZm9yY2UgdGhlIGNoaXAgdG8KKwkJCSAqIGNvbnRpbnVlIHRoZSB0cmFuc2Zlci4gIFRoaXMgZG9lcyBub3QKKwkJCSAqIGhhcHBlbiBmb3IgU0NTSSB0cmFuc2ZlcnMgYXMgdGhlIFNDU0kgbW9kdWxlCisJCQkgKiB3aWxsIGRyYWluIHRoZSBGSUZPIGFzIGRhdGEgYXJlIG1hZGUgYXZhaWxhYmxlLgorCQkJICogV2hlbiB0aGUgaGFuZyBvY2N1cnMsIHdlIGtub3cgdGhhdCBhIG11bHRpcGxlCisJCQkgKiBvZiA4IGJ5dGVzIGlzIGluIHRoZSBGSUZPIGJlY2F1c2UgdGhlIFBDSQorCQkJICogbW9kdWxlIGhhcyBhbiA4IGJ5dGUgaW5wdXQgbGF0Y2ggdGhhdCBvbmx5CisJCQkgKiBkdW1wcyB0byB0aGUgRklGTyB3aGVuIEhDTlQgPT0gMCBvciB0aGUKKwkJCSAqIGxhdGNoIGlzIGZ1bGwuCisJCQkgKi8KKwkJCWNscglBOworCQkJLyogV2FpdCBmb3IgYXQgbGVhc3QgOCBieXRlcyBvZiBkYXRhIHRvIGFycml2ZS4gKi8KK2RtYV9zY2JfaGFuZ19maWZvOgorCQkJdGVzdAlERlNUQVRVUywgRklGT1FXREVNUCBqbnogZG1hX3NjYl9oYW5nX2ZpZm87CitkbWFfc2NiX2hhbmdfd2FpdDoKKwkJCXRlc3QJREZTVEFUVVMsIE1SRVFQRU5EIGpueiBkbWFfc2NiX2hhbmdfd2FpdDsKKwkJCXRlc3QJREZTVEFUVVMsIEhET05FCWpueiBkbWFfc2NiX2hhbmdfZG1hX2RvbmU7CisJCQl0ZXN0CURGU1RBVFVTLCBIRE9ORQlqbnogZG1hX3NjYl9oYW5nX2RtYV9kb25lOworCQkJdGVzdAlERlNUQVRVUywgSERPTkUJam56IGRtYV9zY2JfaGFuZ19kbWFfZG9uZTsKKwkJCS8qCisJCQkgKiBUaGUgUENJIG1vZHVsZSBubyBsb25nZXIgaW50ZW5kcyB0byBwZXJmb3JtCisJCQkgKiBhIFBDSSB0cmFuc2FjdGlvbi4gIERyYWluIHRoZSBmaWZvLgorCQkJICovCitkbWFfc2NiX2hhbmdfZG1hX2RyYWluX2ZpZm86CisJCQlub3QJQSwgSENOVDsKKwkJCWFkZAlBLCBTQ0JfRE9XTkxPQURfU0laRStTQ0JfQkFTRSsxOworCQkJYW5kCUEsIH4weDc7CisJCQltb3YJRElORElSLERGREFUOworCQkJY21wCURJTkRFWCwgQSBqbmUgLiAtIDE7CisJCQljbXAJRElOREVYLCBTQ0JfRE9XTkxPQURfU0laRStTQ0JfQkFTRQorCQkJCWplCWRtYV9maW5pc2hfbm93YWl0OworCQkJLyogUmVzdG9yZSBBIGFzIHRoZSBsaW5lcyBsZWZ0IHRvIHRyYW5zZmVyLiAqLworCQkJYWRkCUEsIC1TQ0JfQkFTRSwgRElOREVYOworCQkJc2hyCUEsIDM7CisJCQlqbXAJZG1hX3NjYl9oYW5nX2ZpZm87CitkbWFfc2NiX2hhbmdfZG1hX2RvbmU6CisJCQlhbmQJREZDTlRSTCwgfkhETUFFTjsKKwkJCXRlc3QJREZDTlRSTCwgSERNQUVOIGpueiAuOworCQkJYWRkCVNFUUFERFIwLCBBOworCQl9IGVsc2UgeworCQkJY2FsbAlkbWFfZmluaXNoOworCQl9CisJCWNhbGwJZGZkYXRfaW5fODsKKwkJY2FsbAlkZmRhdF9pbl84OworCQljYWxsCWRmZGF0X2luXzg7CitkZmRhdF9pbl84OgorCQltb3YJRElORElSLERGREFUOworZGZkYXRfaW5fNzoKKwkJbW92CURJTkRJUixERkRBVDsKKwkJbW92CURJTkRJUixERkRBVDsKKwkJbW92CURJTkRJUixERkRBVDsKKwkJbW92CURJTkRJUixERkRBVDsKKwkJbW92CURJTkRJUixERkRBVDsKK2RmZGF0X2luXzI6CisJCW1vdglESU5ESVIsREZEQVQ7CisJCW1vdglESU5ESVIsREZEQVQgcmV0OworCX0KKworY29weV90b19maWZvXzg6CisJbW92CURGREFULFNJTkRJUjsKKwltb3YJREZEQVQsU0lORElSOworY29weV90b19maWZvXzY6CisJbW92CURGREFULFNJTkRJUjsKK2NvcHlfdG9fZmlmb181OgorCW1vdglERkRBVCxTSU5ESVI7Citjb3B5X3RvX2ZpZm9fNDoKKwltb3YJREZEQVQsU0lORElSOworCW1vdglERkRBVCxTSU5ESVI7CisJbW92CURGREFULFNJTkRJUjsKKwltb3YJREZEQVQsU0lORElSIHJldDsKKworLyoKKyAqIFdhaXQgZm9yIERNQSBmcm9tIGhvc3QgbWVtb3J5IHRvIGRhdGEgRklGTyB0byBjb21wbGV0ZSwgdGhlbiBkaXNhYmxlCisgKiBETUEgYW5kIHdhaXQgZm9yIGl0IHRvIGFja25vd2xlZGdlIHRoYXQgaXQncyBvZmYuCisgKi8KK2RtYV9maW5pc2g6CisJdGVzdAlERlNUQVRVUyxIRE9ORQlqeiBkbWFfZmluaXNoOworZG1hX2ZpbmlzaF9ub3dhaXQ6CisJLyogVHVybiBvZmYgRE1BICovCisJYW5kCURGQ05UUkwsIH5IRE1BRU47CisJdGVzdAlERkNOVFJMLCBIRE1BRU4gam56IC47CisJcmV0OworCisvKgorICogUmVzdG9yZSBhbiBTQ0IgdGhhdCBmYWlsZWQgdG8gbWF0Y2ggYW4gaW5jb21pbmcgcmVzZWxlY3Rpb24KKyAqIHRvIHRoZSBjb3JyZWN0L3NhZmUgc3RhdGUuICBJZiB0aGUgU0NCIGlzIGZvciBhIGRpc2Nvbm5lY3RlZAorICogdHJhbnNhY3Rpb24sIGl0IG11c3QgYmUgcmV0dXJuZWQgdG8gdGhlIGRpc2Nvbm5lY3RlZCBsaXN0LgorICogSWYgaXQgaXMgbm90IGluIHRoZSBkaXNjb25uZWN0ZWQgc3RhdGUsIGl0IG11c3QgYmUgZnJlZS4KKyAqLworY2xlYW51cF9zY2I6CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKSB7CisJCXRlc3QJU0NCX0NPTlRST0wsRElTQ09OTkVDVEVEIGpueiBhZGRfc2NiX3RvX2Rpc2NfbGlzdDsKKwl9CithZGRfc2NiX3RvX2ZyZWVfbGlzdDoKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfUEFHRVNDQlMpICE9IDApIHsKK0JFR0lOX0NSSVRJQ0FMOworCQltb3YJU0NCX05FWFQsIEZSRUVfU0NCSDsKKwkJbXZpCVNDQl9UQUcsIFNDQl9MSVNUX05VTEw7CisJCW1vdglGUkVFX1NDQkgsIFNDQlBUUiByZXQ7CitFTkRfQ1JJVElDQUw7CisJfSBlbHNlIHsKKwkJbXZpCVNDQl9UQUcsIFNDQl9MSVNUX05VTEwgcmV0OworCX0KKworaWYgKChhaGMtPmZsYWdzICYgQUhDXzM5QklUX0FERFJFU1NJTkcpICE9IDApIHsKK3NldF9oaGFkZHI6CisJb3IJRFNDT01NQU5EMSwgSEFERExEU0VMMDsKKwlhbmQJSEFERFIsIFNHX0hJR0hfQUREUl9CSVRTLCBTSU5ERVg7CisJYW5kCURTQ09NTUFORDEsIH5IQURETERTRUwwIHJldDsKK30KKworaWYgKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKSB7CitnZXRfZnJlZV9vcl9kaXNjX3NjYjoKK0JFR0lOX0NSSVRJQ0FMOworCWNtcAlGUkVFX1NDQkgsIFNDQl9MSVNUX05VTEwgam5lIGRlcXVldWVfZnJlZV9zY2I7CisJY21wCURJU0NPTk5FQ1RFRF9TQ0JILCBTQ0JfTElTVF9OVUxMIGpuZSBkZXF1ZXVlX2Rpc2Nfc2NiOworcmV0dXJuX2Vycm9yOgorCW12aQlOT19GUkVFX1NDQiBjYWxsIHNldF9zZXFpbnQ7CisJbXZpCVNJTkRFWCwgU0NCX0xJU1RfTlVMTAlyZXQ7CitkZXF1ZXVlX2Rpc2Nfc2NiOgorCW1vdglTQ0JQVFIsIERJU0NPTk5FQ1RFRF9TQ0JIOworCW1vdglESVNDT05ORUNURURfU0NCSCwgU0NCX05FWFQ7CitFTkRfQ1JJVElDQUw7CisJbXZpCURNQVBBUkFNUywgRklGT1JFU0VUOworCW1vdglTQ0JfVEFHCWptcCBkbWFfc2NiOworQkVHSU5fQ1JJVElDQUw7CitkZXF1ZXVlX2ZyZWVfc2NiOgorCW1vdglTQ0JQVFIsIEZSRUVfU0NCSDsKKwltb3YJRlJFRV9TQ0JILCBTQ0JfTkVYVCByZXQ7CitFTkRfQ1JJVElDQUw7CisKK2FkZF9zY2JfdG9fZGlzY19saXN0OgorLyoKKyAqIExpbmsgdGhpcyBTQ0IgaW50byB0aGUgRElTQ09OTkVDVEVEIGxpc3QuICBUaGlzIGxpc3QgaG9sZHMgdGhlCisgKiBjYW5kaWRhdGVzIGZvciBwYWdpbmcgb3V0IGFuIFNDQiBpZiBvbmUgaXMgbmVlZGVkIGZvciBhIG5ldyBjb21tYW5kLgorICogTW9kaWZ5aW5nIHRoZSBkaXNjb25uZWN0ZWQgbGlzdCBpcyBhIGNyaXRpY2FsKHBhdXNlIGRpc3NhYmxlZCkgc2VjdGlvbi4KKyAqLworQkVHSU5fQ1JJVElDQUw7CisJbW92CVNDQl9ORVhULCBESVNDT05ORUNURURfU0NCSDsKKwltb3YJRElTQ09OTkVDVEVEX1NDQkgsIFNDQlBUUiByZXQ7CitFTkRfQ1JJVElDQUw7Cit9CitzZXRfc2VxaW50OgorCW1vdglJTlRTVEFULCBTSU5ERVg7CisJbm9wOworcmV0dXJuOgorCXJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfOTNjeDYuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfOTNjeDYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjhkNjEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF85M2N4Ni5jCkBAIC0wLDAgKzEsMzA2IEBACisvKgorICogSW50ZXJmYWNlIGZvciB0aGUgOTNDNjYvNTYvNDYvMjYvMDYgc2VyaWFsIGVlcHJvbSBwYXJ0cy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgRGFuaWVsIE0uIEVpc2NoZW4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4XzkzY3g2LmMjMTcgJAorICoKKyAqICRGcmVlQlNEJAorICovCisKKy8qCisgKiAgIFRoZSBpbnN0cnVjdGlvbiBzZXQgb2YgdGhlIDkzQzY2LzU2LzQ2LzI2LzA2IGNoaXBzIGFyZSBhcyBmb2xsb3dzOgorICoKKyAqICAgICAgICAgICAgICAgU3RhcnQgIE9QCSAgICAqCisgKiAgICAgRnVuY3Rpb24gICBCaXQgIENvZGUgIEFkZHJlc3MqKiAgRGF0YSAgICAgRGVzY3JpcHRpb24KKyAqICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgUkVBRCAgICAgICAgMSAgICAxMCAgIEE1IC0gQTAgICAgICAgICAgICAgUmVhZHMgZGF0YSBzdG9yZWQgaW4gbWVtb3J5LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGF0IHNwZWNpZmllZCBhZGRyZXNzCisgKiAgICAgRVdFTiAgICAgICAgMSAgICAwMCAgIDExWFhYWCAgICAgICAgICAgICAgV3JpdGUgZW5hYmxlIG11c3QgcHJlY2VkZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBwcm9ncmFtbWluZyBtb2RlcworICogICAgIEVSQVNFICAgICAgIDEgICAgMTEgICBBNSAtIEEwICAgICAgICAgICAgIEVyYXNlIHJlZ2lzdGVyIEE1QTRBM0EyQTFBMAorICogICAgIFdSSVRFICAgICAgIDEgICAgMDEgICBBNSAtIEEwICAgRDE1IC0gRDAgIFdyaXRlcyByZWdpc3RlcgorICogICAgIEVSQUwgICAgICAgIDEgICAgMDAgICAxMFhYWFggICAgICAgICAgICAgIEVyYXNlIGFsbCByZWdpc3RlcnMKKyAqICAgICBXUkFMICAgICAgICAxICAgIDAwICAgMDFYWFhYICAgIEQxNSAtIEQwICBXcml0ZXMgdG8gYWxsIHJlZ2lzdGVycworICogICAgIEVXRFMgICAgICAgIDEgICAgMDAgICAwMFhYWFggICAgICAgICAgICAgIERpc2FibGVzIGFsbCBwcm9ncmFtbWluZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9ucworICogICAgICpOb3RlOiBBIHZhbHVlIG9mIFggZm9yIGFkZHJlc3MgaXMgYSBkb24ndCBjYXJlIGNvbmRpdGlvbi4KKyAqICAgICoqTm90ZTogVGhlcmUgYXJlIDggYWRkcmVzcyBiaXRzIGZvciB0aGUgOTNDNTYvNjYgY2hpcHMgdW5saWtlCisgKgkgICAgICB0aGUgOTNDNDYvMjYvMDYgY2hpcHMgd2hpY2ggaGF2ZSA2IGFkZHJlc3MgYml0cy4KKyAqCisgKiAgIFRoZSA5M0M0NiBoYXMgYSBmb3VyIHdpcmUgaW50ZXJmYWNlOiBjbG9jaywgY2hpcCBzZWxlY3QsIGRhdGEgaW4sIGFuZAorICogICBkYXRhIG91dC4gIEluIG9yZGVyIHRvIHBlcmZvcm0gb25lIG9mIHRoZSBhYm92ZSBmdW5jdGlvbnMsIHlvdSBuZWVkCisgKiAgIHRvIGVuYWJsZSB0aGUgY2hpcCBzZWxlY3QgZm9yIGEgY2xvY2sgcGVyaW9kICh0eXBpY2FsbHkgYSBtaW5pbXVtIG9mCisgKiAgIDEgdXNlYywgd2l0aCB0aGUgY2xvY2sgaGlnaCBhbmQgbG93IGEgbWluaW11bSBvZiA3NTAgYW5kIDI1MCBuc2VjCisgKiAgIHJlc3BlY3RpdmVseSkuICBXaGlsZSB0aGUgY2hpcCBzZWxlY3QgcmVtYWlucyBoaWdoLCB5b3UgY2FuIGNsb2NrIGluCisgKiAgIHRoZSBpbnN0cnVjdGlvbnMgKGFib3ZlKSBzdGFydGluZyB3aXRoIHRoZSBzdGFydCBiaXQsIGZvbGxvd2VkIGJ5IHRoZQorICogICBPUCBjb2RlLCBBZGRyZXNzLCBhbmQgRGF0YSAoaWYgbmVlZGVkKS4gIEZvciB0aGUgUkVBRCBpbnN0cnVjdGlvbiwgdGhlCisgKiAgIHJlcXVlc3RlZCAxNi1iaXQgcmVnaXN0ZXIgY29udGVudHMgaXMgcmVhZCBmcm9tIHRoZSBkYXRhIG91dCBsaW5lIGJ1dAorICogICBpcyBwcmVjZWRlZCBieSBhbiBpbml0aWFsIHplcm8gKGxlYWRpbmcgMCwgZm9sbG93ZWQgYnkgMTYtYml0cywgTVNCCisgKiAgIGZpcnN0KS4gIFRoZSBjbG9jayBjeWNsaW5nIGZyb20gbG93IHRvIGhpZ2ggaW5pdGlhdGVzIHRoZSBuZXh0IGRhdGEKKyAqICAgYml0IHRvIGJlIHNlbnQgZnJvbSB0aGUgY2hpcC4KKyAqCisgKi8KKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgImFpYzd4eHhfb3NtLmgiCisjaW5jbHVkZSAiYWljN3h4eF9pbmxpbmUuaCIKKyNpbmNsdWRlICJhaWM3eHh4XzkzY3g2LmgiCisjZWxzZQorI2luY2x1ZGUgPGRldi9haWM3eHh4L2FpYzd4eHhfb3NtLmg+CisjaW5jbHVkZSA8ZGV2L2FpYzd4eHgvYWljN3h4eF9pbmxpbmUuaD4KKyNpbmNsdWRlIDxkZXYvYWljN3h4eC9haWM3eHh4XzkzY3g2Lmg+CisjZW5kaWYKKworLyoKKyAqIFJpZ2h0IG5vdywgd2Ugb25seSBoYXZlIHRvIHJlYWQgdGhlIFNFRVBST00uICBCdXQgd2UgbWFrZSBpdCBlYXNpZXIgdG8KKyAqIGFkZCBvdGhlciA5M0N4NiBmdW5jdGlvbnMuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2VlcHJvbV9jbWQgeworICAJdWludDhfdCBsZW47CisgCXVpbnQ4X3QgYml0c1s5XTsKK30gc2VlcHJvbV9yZWFkID0gezMsIHsxLCAxLCAwfX07CisKK3N0YXRpYyBzdHJ1Y3Qgc2VlcHJvbV9jbWQgc2VlcHJvbV9ld2VuID0gezksIHsxLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwfX07CitzdGF0aWMgc3RydWN0IHNlZXByb21fY21kIHNlZXByb21fZXdkcyA9IHs5LCB7MSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH19Oworc3RhdGljIHN0cnVjdCBzZWVwcm9tX2NtZCBzZWVwcm9tX3dyaXRlID0gezMsIHsxLCAwLCAxfX07CisKKy8qCisgKiBXYWl0IGZvciB0aGUgU0VFUkRZIHRvIGdvIGhpZ2g7IGFib3V0IDgwMCBucy4KKyAqLworI2RlZmluZSBDTE9DS19QVUxTRShzZCwgcmR5KQkJCQlcCisJd2hpbGUgKChTRUVQUk9NX1NUQVRVU19JTkIoc2QpICYgcmR5KSA9PSAwKSB7CVwKKwkJOyAgLyogRG8gbm90aGluZyAqLwkJCVwKKwl9CQkJCQkJXAorCSh2b2lkKVNFRVBST01fSU5CKHNkKTsJLyogQ2xlYXIgY2xvY2sgKi8KKworLyoKKyAqIFNlbmQgYSBTVEFSVCBjb25kaXRpb24gYW5kIHRoZSBnaXZlbiBjb21tYW5kCisgKi8KK3N0YXRpYyB2b2lkCitzZW5kX3NlZXByb21fY21kKHN0cnVjdCBzZWVwcm9tX2Rlc2NyaXB0b3IgKnNkLCBzdHJ1Y3Qgc2VlcHJvbV9jbWQgKmNtZCkKK3sKKwl1aW50OF90IHRlbXA7CisJaW50IGkgPSAwOworCisJLyogU2VuZCBjaGlwIHNlbGVjdCBmb3Igb25lIGNsb2NrIGN5Y2xlLiAqLworCXRlbXAgPSBzZC0+c2RfTVMgXiBzZC0+c2RfQ1M7CisJU0VFUFJPTV9PVVRCKHNkLCB0ZW1wIF4gc2QtPnNkX0NLKTsKKwlDTE9DS19QVUxTRShzZCwgc2QtPnNkX1JEWSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY21kLT5sZW47IGkrKykgeworCQlpZiAoY21kLT5iaXRzW2ldICE9IDApCisJCQl0ZW1wIF49IHNkLT5zZF9ETzsKKwkJU0VFUFJPTV9PVVRCKHNkLCB0ZW1wKTsKKwkJQ0xPQ0tfUFVMU0Uoc2QsIHNkLT5zZF9SRFkpOworCQlTRUVQUk9NX09VVEIoc2QsIHRlbXAgXiBzZC0+c2RfQ0spOworCQlDTE9DS19QVUxTRShzZCwgc2QtPnNkX1JEWSk7CisJCWlmIChjbWQtPmJpdHNbaV0gIT0gMCkKKwkJCXRlbXAgXj0gc2QtPnNkX0RPOworCX0KK30KKworLyoKKyAqIENsZWFyIENTIHB1dCB0aGUgY2hpcCBpbiB0aGUgcmVzZXQgc3RhdGUsIHdoZXJlIGl0IGNhbiB3YWl0IGZvciBuZXcgY29tbWFuZHMuCisgKi8KK3N0YXRpYyB2b2lkCityZXNldF9zZWVwcm9tKHN0cnVjdCBzZWVwcm9tX2Rlc2NyaXB0b3IgKnNkKQoreworCXVpbnQ4X3QgdGVtcDsKKworCXRlbXAgPSBzZC0+c2RfTVM7CisJU0VFUFJPTV9PVVRCKHNkLCB0ZW1wKTsKKwlDTE9DS19QVUxTRShzZCwgc2QtPnNkX1JEWSk7CisJU0VFUFJPTV9PVVRCKHNkLCB0ZW1wIF4gc2QtPnNkX0NLKTsKKwlDTE9DS19QVUxTRShzZCwgc2QtPnNkX1JEWSk7CisJU0VFUFJPTV9PVVRCKHNkLCB0ZW1wKTsKKwlDTE9DS19QVUxTRShzZCwgc2QtPnNkX1JEWSk7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBzZXJpYWwgRUVQUk9NIGFuZCByZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bCBhbmQgMCBpZgorICogbm90IHN1Y2Nlc3NmdWwuCisgKi8KK2ludAorYWhjX3JlYWRfc2VlcHJvbShzdHJ1Y3Qgc2VlcHJvbV9kZXNjcmlwdG9yICpzZCwgdWludDE2X3QgKmJ1ZiwKKwkJIHVfaW50IHN0YXJ0X2FkZHIsIHVfaW50IGNvdW50KQoreworCWludCBpID0gMDsKKwl1X2ludCBrID0gMDsKKwl1aW50MTZfdCB2OworCXVpbnQ4X3QgdGVtcDsKKworCS8qCisJICogUmVhZCB0aGUgcmVxdWVzdGVkIHJlZ2lzdGVycyBvZiB0aGUgc2VlcHJvbS4gIFRoZSBsb29wCisJICogd2lsbCByYW5nZSBmcm9tIDAgdG8gY291bnQtMS4KKwkgKi8KKwlmb3IgKGsgPSBzdGFydF9hZGRyOyBrIDwgY291bnQgKyBzdGFydF9hZGRyOyBrKyspIHsKKwkJLyoKKwkJICogTm93IHdlJ3JlIHJlYWR5IHRvIHNlbmQgdGhlIHJlYWQgY29tbWFuZCBmb2xsb3dlZCBieSB0aGUKKwkJICogYWRkcmVzcyBvZiB0aGUgMTYtYml0IHJlZ2lzdGVyIHdlIHdhbnQgdG8gcmVhZC4KKwkJICovCisJCXNlbmRfc2VlcHJvbV9jbWQoc2QsICZzZWVwcm9tX3JlYWQpOworCisJCS8qIFNlbmQgdGhlIDYgb3IgOCBiaXQgYWRkcmVzcyAoTVNCIGZpcnN0LCBMU0IgbGFzdCkuICovCisJCXRlbXAgPSBzZC0+c2RfTVMgXiBzZC0+c2RfQ1M7CisJCWZvciAoaSA9IChzZC0+c2RfY2hpcCAtIDEpOyBpID49IDA7IGktLSkgeworCQkJaWYgKChrICYgKDEgPDwgaSkpICE9IDApCisJCQkJdGVtcCBePSBzZC0+c2RfRE87CisJCQlTRUVQUk9NX09VVEIoc2QsIHRlbXApOworCQkJQ0xPQ0tfUFVMU0Uoc2QsIHNkLT5zZF9SRFkpOworCQkJU0VFUFJPTV9PVVRCKHNkLCB0ZW1wIF4gc2QtPnNkX0NLKTsKKwkJCUNMT0NLX1BVTFNFKHNkLCBzZC0+c2RfUkRZKTsKKwkJCWlmICgoayAmICgxIDw8IGkpKSAhPSAwKQorCQkJCXRlbXAgXj0gc2QtPnNkX0RPOworCQl9CisKKwkJLyoKKwkJICogTm93IHJlYWQgdGhlIDE2IGJpdCByZWdpc3Rlci4gIEFuIGluaXRpYWwgMCBwcmVjZWRlcyB0aGUKKwkJICogcmVnaXN0ZXIgY29udGVudHMgd2hpY2ggYmVnaW5zIHdpdGggYml0IDE1IChNU0IpIGFuZCBlbmRzCisJCSAqIHdpdGggYml0IDAgKExTQikuICBUaGUgaW5pdGlhbCAwIHdpbGwgYmUgc2hpZnRlZCBvZmYgdGhlCisJCSAqIHRvcCBvZiBvdXIgd29yZCBhcyB3ZSBsZXQgdGhlIGxvb3AgcnVuIGZyb20gMCB0byAxNi4KKwkJICovCisJCXYgPSAwOworCQlmb3IgKGkgPSAxNjsgaSA+PSAwOyBpLS0pIHsKKwkJCVNFRVBST01fT1VUQihzZCwgdGVtcCk7CisJCQlDTE9DS19QVUxTRShzZCwgc2QtPnNkX1JEWSk7CisJCQl2IDw8PSAxOworCQkJaWYgKFNFRVBST01fREFUQV9JTkIoc2QpICYgc2QtPnNkX0RJKQorCQkJCXYgfD0gMTsKKwkJCVNFRVBST01fT1VUQihzZCwgdGVtcCBeIHNkLT5zZF9DSyk7CisJCQlDTE9DS19QVUxTRShzZCwgc2QtPnNkX1JEWSk7CisJCX0KKworCQlidWZbayAtIHN0YXJ0X2FkZHJdID0gdjsKKworCQkvKiBSZXNldCB0aGUgY2hpcCBzZWxlY3QgZm9yIHRoZSBuZXh0IGNvbW1hbmQgY3ljbGUuICovCisJCXJlc2V0X3NlZXByb20oc2QpOworCX0KKyNpZmRlZiBBSENfRFVNUF9FRVBST00KKwlwcmludGYoIlxuU2VyaWFsIEVFUFJPTTpcblx0Iik7CisJZm9yIChrID0gMDsgayA8IGNvdW50OyBrID0gayArIDEpIHsKKwkJaWYgKCgoayAlIDgpID09IDApICYmIChrICE9IDApKSB7CisJCQlwcmludGYgKCJcblx0Iik7CisJCX0KKwkJcHJpbnRmICgiIDB4JXgiLCBidWZba10pOworCX0KKwlwcmludGYgKCJcbiIpOworI2VuZGlmCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIFdyaXRlIHRoZSBzZXJpYWwgRUVQUk9NIGFuZCByZXR1cm4gMSBpZiBzdWNjZXNzZnVsIGFuZCAwIGlmCisgKiBub3Qgc3VjY2Vzc2Z1bC4KKyAqLworaW50CithaGNfd3JpdGVfc2VlcHJvbShzdHJ1Y3Qgc2VlcHJvbV9kZXNjcmlwdG9yICpzZCwgdWludDE2X3QgKmJ1ZiwKKwkJICB1X2ludCBzdGFydF9hZGRyLCB1X2ludCBjb3VudCkKK3sKKwl1aW50MTZfdCB2OworCXVpbnQ4X3QgdGVtcDsKKwlpbnQgaSwgazsKKworCS8qIFBsYWNlIHRoZSBjaGlwIGludG8gd3JpdGUtZW5hYmxlIG1vZGUgKi8KKwlzZW5kX3NlZXByb21fY21kKHNkLCAmc2VlcHJvbV9ld2VuKTsKKwlyZXNldF9zZWVwcm9tKHNkKTsKKworCS8qIFdyaXRlIGFsbCByZXF1ZXN0ZWQgZGF0YSBvdXQgdG8gdGhlIHNlZXByb20uICovCisJdGVtcCA9IHNkLT5zZF9NUyBeIHNkLT5zZF9DUzsKKwlmb3IgKGsgPSBzdGFydF9hZGRyOyBrIDwgY291bnQgKyBzdGFydF9hZGRyOyBrKyspIHsKKwkJLyogU2VuZCB0aGUgd3JpdGUgY29tbWFuZCAqLworCQlzZW5kX3NlZXByb21fY21kKHNkLCAmc2VlcHJvbV93cml0ZSk7CisKKwkJLyogU2VuZCB0aGUgNiBvciA4IGJpdCBhZGRyZXNzIChNU0IgZmlyc3QpLiAqLworCQlmb3IgKGkgPSAoc2QtPnNkX2NoaXAgLSAxKTsgaSA+PSAwOyBpLS0pIHsKKwkJCWlmICgoayAmICgxIDw8IGkpKSAhPSAwKQorCQkJCXRlbXAgXj0gc2QtPnNkX0RPOworCQkJU0VFUFJPTV9PVVRCKHNkLCB0ZW1wKTsKKwkJCUNMT0NLX1BVTFNFKHNkLCBzZC0+c2RfUkRZKTsKKwkJCVNFRVBST01fT1VUQihzZCwgdGVtcCBeIHNkLT5zZF9DSyk7CisJCQlDTE9DS19QVUxTRShzZCwgc2QtPnNkX1JEWSk7CisJCQlpZiAoKGsgJiAoMSA8PCBpKSkgIT0gMCkKKwkJCQl0ZW1wIF49IHNkLT5zZF9ETzsKKwkJfQorCisJCS8qIFdyaXRlIHRoZSAxNiBiaXQgdmFsdWUsIE1TQiBmaXJzdCAqLworCQl2ID0gYnVmW2sgLSBzdGFydF9hZGRyXTsKKwkJZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKSB7CisJCQlpZiAoKHYgJiAoMSA8PCBpKSkgIT0gMCkKKwkJCQl0ZW1wIF49IHNkLT5zZF9ETzsKKwkJCVNFRVBST01fT1VUQihzZCwgdGVtcCk7CisJCQlDTE9DS19QVUxTRShzZCwgc2QtPnNkX1JEWSk7CisJCQlTRUVQUk9NX09VVEIoc2QsIHRlbXAgXiBzZC0+c2RfQ0spOworCQkJQ0xPQ0tfUFVMU0Uoc2QsIHNkLT5zZF9SRFkpOworCQkJaWYgKCh2ICYgKDEgPDwgaSkpICE9IDApCisJCQkJdGVtcCBePSBzZC0+c2RfRE87CisJCX0KKworCQkvKiBXYWl0IGZvciB0aGUgY2hpcCB0byBjb21wbGV0ZSB0aGUgd3JpdGUgKi8KKwkJdGVtcCA9IHNkLT5zZF9NUzsKKwkJU0VFUFJPTV9PVVRCKHNkLCB0ZW1wKTsKKwkJQ0xPQ0tfUFVMU0Uoc2QsIHNkLT5zZF9SRFkpOworCQl0ZW1wID0gc2QtPnNkX01TIF4gc2QtPnNkX0NTOworCQlkbyB7CisJCQlTRUVQUk9NX09VVEIoc2QsIHRlbXApOworCQkJQ0xPQ0tfUFVMU0Uoc2QsIHNkLT5zZF9SRFkpOworCQkJU0VFUFJPTV9PVVRCKHNkLCB0ZW1wIF4gc2QtPnNkX0NLKTsKKwkJCUNMT0NLX1BVTFNFKHNkLCBzZC0+c2RfUkRZKTsKKwkJfSB3aGlsZSAoKFNFRVBST01fREFUQV9JTkIoc2QpICYgc2QtPnNkX0RJKSA9PSAwKTsKKworCQlyZXNldF9zZWVwcm9tKHNkKTsKKwl9CisKKwkvKiBQdXQgdGhlIGNoaXAgYmFjayBpbnRvIHdyaXRlLXByb3RlY3QgbW9kZSAqLworCXNlbmRfc2VlcHJvbV9jbWQoc2QsICZzZWVwcm9tX2V3ZHMpOworCXJlc2V0X3NlZXByb20oc2QpOworCisJcmV0dXJuICgxKTsKK30KKworaW50CithaGNfdmVyaWZ5X2Nrc3VtKHN0cnVjdCBzZWVwcm9tX2NvbmZpZyAqc2MpCit7CisJaW50IGk7CisJaW50IG1heGFkZHI7CisJdWludDMyX3QgY2hlY2tzdW07CisJdWludDE2X3QgKnNjYXJyYXk7CisKKwltYXhhZGRyID0gKHNpemVvZigqc2MpLzIpIC0gMTsKKwljaGVja3N1bSA9IDA7CisJc2NhcnJheSA9ICh1aW50MTZfdCAqKXNjOworCisJZm9yIChpID0gMDsgaSA8IG1heGFkZHI7IGkrKykKKwkJY2hlY2tzdW0gPSBjaGVja3N1bSArIHNjYXJyYXlbaV07CisJaWYgKGNoZWNrc3VtID09IDAKKwkgfHwgKGNoZWNrc3VtICYgMHhGRkZGKSAhPSBzYy0+Y2hlY2tzdW0pIHsKKwkJcmV0dXJuICgwKTsKKwl9IGVsc2UgeworCQlyZXR1cm4oMSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF85M2N4Ni5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF85M2N4Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OWM0M2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4XzkzY3g2LmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBJbnRlcmZhY2UgdG8gdGhlIDkzQzQ2LzU2IHNlcmlhbCBFRVBST00gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIEJJT1MKKyAqIHNldHRpbmdzIGZvciB0aGUgYWljN3h4eCBiYXNlZCBhZGFwdGVjIFNDU0kgY29udHJvbGxlcnMuICBJdCBjYW4KKyAqIGFsc28gYmUgdXNlZCBmb3IgOTNDMjYgYW5kIDkzQzA2IHNlcmlhbCBFRVBST01TLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSwgMjAwMCBKdXN0aW4gVC4gR2liYnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4XzkzY3g2LmgjMTIgJAorICoKKyAqICRGcmVlQlNEJAorICovCisjaWZuZGVmIF9BSUM3WFhYXzkzQ1g2X0hfCisjZGVmaW5lIF9BSUM3WFhYXzkzQ1g2X0hfCisKK3R5cGVkZWYgZW51bSB7CisJQzQ2ID0gNiwKKwlDNTZfNjYgPSA4Cit9IHNlZXByb21fY2hpcF90OworCitzdHJ1Y3Qgc2VlcHJvbV9kZXNjcmlwdG9yIHsKKwlzdHJ1Y3QgYWhjX3NvZnRjICpzZF9haGM7CisJdV9pbnQgc2RfY29udHJvbF9vZmZzZXQ7CisJdV9pbnQgc2Rfc3RhdHVzX29mZnNldDsKKwl1X2ludCBzZF9kYXRhb3V0X29mZnNldDsKKwlzZWVwcm9tX2NoaXBfdCBzZF9jaGlwOworCXVpbnQxNl90IHNkX01TOworCXVpbnQxNl90IHNkX1JEWTsKKwl1aW50MTZfdCBzZF9DUzsKKwl1aW50MTZfdCBzZF9DSzsKKwl1aW50MTZfdCBzZF9ETzsKKwl1aW50MTZfdCBzZF9ESTsKK307CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVhZCBjb3VudCAxNi1iaXQgd29yZHMgZnJvbSB0aGUgc2VyaWFsIEVFUFJPTSBhbmQKKyAqIHJldHVybiB0aGVpciB2YWx1ZSBpbiBidWYuICBUaGUgcG9ydCBhZGRyZXNzIG9mIHRoZSBhaWM3eHh4IHNlcmlhbCBFRVBST00KKyAqIGNvbnRyb2wgcmVnaXN0ZXIgaXMgcGFzc2VkIGluIGFzIG9mZnNldC4gIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUKKyAqIGFsc28gcGFzc2VkIGluOgorICoKKyAqICAgQ1MgIC0gQ2hpcCBzZWxlY3QKKyAqICAgQ0sgIC0gQ2xvY2sKKyAqICAgRE8gIC0gRGF0YSBvdXQKKyAqICAgREkgIC0gRGF0YSBpbgorICogICBSRFkgLSBTRUVQUk9NIHJlYWR5CisgKiAgIE1TICAtIE1lbW9yeSBwb3J0IG1vZGUgc2VsZWN0CisgKgorICogIEEgZmFpbGVkIHJlYWQgYXR0ZW1wdCByZXR1cm5zIDAsIGFuZCBhIHN1Y2Nlc3NmdWwgcmVhZCByZXR1cm5zIDEuCisgKi8KKworI2RlZmluZQlTRUVQUk9NX0lOQihzZCkgXAorCWFoY19pbmIoc2QtPnNkX2FoYywgc2QtPnNkX2NvbnRyb2xfb2Zmc2V0KQorI2RlZmluZQlTRUVQUk9NX09VVEIoc2QsIHZhbHVlKQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWFoY19vdXRiKHNkLT5zZF9haGMsIHNkLT5zZF9jb250cm9sX29mZnNldCwgdmFsdWUpOwlcCisJYWhjX2ZsdXNoX2RldmljZV93cml0ZXMoc2QtPnNkX2FoYyk7CQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lCVNFRVBST01fU1RBVFVTX0lOQihzZCkgXAorCWFoY19pbmIoc2QtPnNkX2FoYywgc2QtPnNkX3N0YXR1c19vZmZzZXQpCisjZGVmaW5lCVNFRVBST01fREFUQV9JTkIoc2QpIFwKKwlhaGNfaW5iKHNkLT5zZF9haGMsIHNkLT5zZF9kYXRhb3V0X29mZnNldCkKKworaW50IGFoY19yZWFkX3NlZXByb20oc3RydWN0IHNlZXByb21fZGVzY3JpcHRvciAqc2QsIHVpbnQxNl90ICpidWYsCisJCSAgICAgdV9pbnQgc3RhcnRfYWRkciwgdV9pbnQgY291bnQpOworaW50IGFoY193cml0ZV9zZWVwcm9tKHN0cnVjdCBzZWVwcm9tX2Rlc2NyaXB0b3IgKnNkLCB1aW50MTZfdCAqYnVmLAorCQkgICAgICB1X2ludCBzdGFydF9hZGRyLCB1X2ludCBjb3VudCk7CitpbnQgYWhjX3ZlcmlmeV9ja3N1bShzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgKnNjKTsKKworI2VuZGlmIC8qIF9BSUM3WFhYXzkzQ1g2X0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X2NvcmUuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNmI0YTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X2NvcmUuYwpAQCAtMCwwICsxLDc0NTEgQEAKKy8qCisgKiBDb3JlIHJvdXRpbmVzIGFuZCB0YWJsZXMgc2hhcmVhYmxlIGFjcm9zcyBPUyBwbGF0Zm9ybXMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMDIgSnVzdGluIFQuIEdpYmJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LmMjMTM0ICQKKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSAiYWljN3h4eF9vc20uaCIKKyNpbmNsdWRlICJhaWM3eHh4X2lubGluZS5oIgorI2luY2x1ZGUgImFpY2FzbS9haWNhc21faW5zZm9ybWF0LmgiCisjZWxzZQorI2luY2x1ZGUgPGRldi9haWM3eHh4L2FpYzd4eHhfb3NtLmg+CisjaW5jbHVkZSA8ZGV2L2FpYzd4eHgvYWljN3h4eF9pbmxpbmUuaD4KKyNpbmNsdWRlIDxkZXYvYWljN3h4eC9haWNhc20vYWljYXNtX2luc2Zvcm1hdC5oPgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU29mdGMgRGF0YSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgYWhjX3NvZnRjX3RhaWxxIGFoY190YWlscSA9IFRBSUxRX0hFQURfSU5JVElBTElaRVIoYWhjX3RhaWxxKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIExvb2t1cCBUYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NoYXIgKmFoY19jaGlwX25hbWVzW10gPQoreworCSJOT05FIiwKKwkiYWljNzc3MCIsCisJImFpYzc4NTAiLAorCSJhaWM3ODU1IiwKKwkiYWljNzg1OSIsCisJImFpYzc4NjAiLAorCSJhaWM3ODcwIiwKKwkiYWljNzg4MCIsCisJImFpYzc4OTUiLAorCSJhaWM3ODk1QyIsCisJImFpYzc4OTAvOTEiLAorCSJhaWM3ODk2Lzk3IiwKKwkiYWljNzg5MiIsCisJImFpYzc4OTkiCit9Oworc3RhdGljIGNvbnN0IHVfaW50IG51bV9jaGlwX25hbWVzID0gTlVNX0VMRU1FTlRTKGFoY19jaGlwX25hbWVzKTsKKworLyoKKyAqIEhhcmR3YXJlIGVycm9yIGNvZGVzLgorICovCitzdHJ1Y3QgYWhjX2hhcmRfZXJyb3JfZW50cnkgeworICAgICAgICB1aW50OF90IGVycm5vOworCWNoYXIgKmVycm1lc2c7Cit9OworCitzdGF0aWMgc3RydWN0IGFoY19oYXJkX2Vycm9yX2VudHJ5IGFoY19oYXJkX2Vycm9yc1tdID0geworCXsgSUxMSEFERFIsCSJJbGxlZ2FsIEhvc3QgQWNjZXNzIiB9LAorCXsgSUxMU0FERFIsCSJJbGxlZ2FsIFNlcXVlbmNlciBBZGRyZXNzIHJlZmVycmVuY2VkIiB9LAorCXsgSUxMT1BDT0RFLAkiSWxsZWdhbCBPcGNvZGUgaW4gc2VxdWVuY2VyIHByb2dyYW0iIH0sCisJeyBTUVBBUkVSUiwJIlNlcXVlbmNlciBQYXJpdHkgRXJyb3IiIH0sCisJeyBEUEFSRVJSLAkiRGF0YS1wYXRoIFBhcml0eSBFcnJvciIgfSwKKwl7IE1QQVJFUlIsCSJTY3JhdGNoIG9yIFNDQiBNZW1vcnkgUGFyaXR5IEVycm9yIiB9LAorCXsgUENJRVJSU1RBVCwJIlBDSSBFcnJvciBkZXRlY3RlZCIgfSwKKwl7IENJT1BBUkVSUiwJIkNJT0JVUyBQYXJpdHkgRXJyb3IiIH0sCit9Oworc3RhdGljIGNvbnN0IHVfaW50IG51bV9lcnJvcnMgPSBOVU1fRUxFTUVOVFMoYWhjX2hhcmRfZXJyb3JzKTsKKworc3RhdGljIHN0cnVjdCBhaGNfcGhhc2VfdGFibGVfZW50cnkgYWhjX3BoYXNlX3RhYmxlW10gPQoreworCXsgUF9EQVRBT1VULAlNU0dfTk9PUCwJCSJpbiBEYXRhLW91dCBwaGFzZSIJfSwKKwl7IFBfREFUQUlOLAlNU0dfSU5JVElBVE9SX0RFVF9FUlIsCSJpbiBEYXRhLWluIHBoYXNlIgl9LAorCXsgUF9EQVRBT1VUX0RULAlNU0dfTk9PUCwJCSJpbiBEVCBEYXRhLW91dCBwaGFzZSIJfSwKKwl7IFBfREFUQUlOX0RULAlNU0dfSU5JVElBVE9SX0RFVF9FUlIsCSJpbiBEVCBEYXRhLWluIHBoYXNlIgl9LAorCXsgUF9DT01NQU5ELAlNU0dfTk9PUCwJCSJpbiBDb21tYW5kIHBoYXNlIgl9LAorCXsgUF9NRVNHT1VULAlNU0dfTk9PUCwJCSJpbiBNZXNzYWdlLW91dCBwaGFzZSIJfSwKKwl7IFBfU1RBVFVTLAlNU0dfSU5JVElBVE9SX0RFVF9FUlIsCSJpbiBTdGF0dXMgcGhhc2UiCX0sCisJeyBQX01FU0dJTiwJTVNHX1BBUklUWV9FUlJPUiwJImluIE1lc3NhZ2UtaW4gcGhhc2UiCX0sCisJeyBQX0JVU0ZSRUUsCU1TR19OT09QLAkJIndoaWxlIGlkbGUiCQl9LAorCXsgMCwJCU1TR19OT09QLAkJImluIHVua25vd24gcGhhc2UiCX0KK307CisKKy8qCisgKiBJbiBtb3N0IGNhc2VzIHdlIG9ubHkgd2lzaCB0byBpdHRlcmF0ZSBvdmVyIHJlYWwgcGhhc2VzLCBzbworICogZXhjbHVkZSB0aGUgbGFzdCBlbGVtZW50IGZyb20gdGhlIGNvdW50LgorICovCitzdGF0aWMgY29uc3QgdV9pbnQgbnVtX3BoYXNlcyA9IE5VTV9FTEVNRU5UUyhhaGNfcGhhc2VfdGFibGUpIC0gMTsKKworLyoKKyAqIFZhbGlkIFNDU0lSQVRFIHZhbHVlcy4gIChwLiAzLTE3KQorICogUHJvdmlkZXMgYSBtYXBwaW5nIG9mIHRyYW5mZXIgcGVyaW9kcyBpbiBucyB0byB0aGUgcHJvcGVyIHZhbHVlIHRvCisgKiBzdGljayBpbiB0aGUgc2NzaXhmZXIgcmVnLgorICovCitzdGF0aWMgc3RydWN0IGFoY19zeW5jcmF0ZSBhaGNfc3luY3JhdGVzW10gPQoreworICAgICAgLyogdWx0cmEyICAgIGZhc3QvdWx0cmEgIHBlcmlvZCAgICAgcmF0ZSAqLworCXsgMHg0MiwgICAgICAweDAwMCwgICAgICA5LCAgICAgICI4MC4wIiB9LAorCXsgMHgwMywgICAgICAweDAwMCwgICAgIDEwLCAgICAgICI0MC4wIiB9LAorCXsgMHgwNCwgICAgICAweDAwMCwgICAgIDExLCAgICAgICIzMy4wIiB9LAorCXsgMHgwNSwgICAgICAweDEwMCwgICAgIDEyLCAgICAgICIyMC4wIiB9LAorCXsgMHgwNiwgICAgICAweDExMCwgICAgIDE1LCAgICAgICIxNi4wIiB9LAorCXsgMHgwNywgICAgICAweDEyMCwgICAgIDE4LCAgICAgICIxMy40IiB9LAorCXsgMHgwOCwgICAgICAweDAwMCwgICAgIDI1LCAgICAgICIxMC4wIiB9LAorCXsgMHgxOSwgICAgICAweDAxMCwgICAgIDMxLCAgICAgICI4LjAiICB9LAorCXsgMHgxYSwgICAgICAweDAyMCwgICAgIDM3LCAgICAgICI2LjY3IiB9LAorCXsgMHgxYiwgICAgICAweDAzMCwgICAgIDQzLCAgICAgICI1LjciICB9LAorCXsgMHgxYywgICAgICAweDA0MCwgICAgIDUwLCAgICAgICI1LjAiICB9LAorCXsgMHgwMCwgICAgICAweDA1MCwgICAgIDU2LCAgICAgICI0LjQiICB9LAorCXsgMHgwMCwgICAgICAweDA2MCwgICAgIDYyLCAgICAgICI0LjAiICB9LAorCXsgMHgwMCwgICAgICAweDA3MCwgICAgIDY4LCAgICAgICIzLjYiICB9LAorCXsgMHgwMCwgICAgICAweDAwMCwgICAgICAwLCAgICAgIE5VTEwgICB9Cit9OworCisvKiBPdXIgU2VxdWVuY2VyIFByb2dyYW0gKi8KKyNpbmNsdWRlICJhaWM3eHh4X3NlcS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQJCWFoY19mb3JjZV9yZW5lZ290aWF0aW9uKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJCXN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbyk7CitzdGF0aWMgc3RydWN0IGFoY190bW9kZV90c3RhdGUqCisJCQlhaGNfYWxsb2NfdHN0YXRlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJIHVfaW50IHNjc2lfaWQsIGNoYXIgY2hhbm5lbCk7CisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCitzdGF0aWMgdm9pZAkJYWhjX2ZyZWVfdHN0YXRlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJdV9pbnQgc2NzaV9pZCwgY2hhciBjaGFubmVsLCBpbnQgZm9yY2UpOworI2VuZGlmCitzdGF0aWMgc3RydWN0IGFoY19zeW5jcmF0ZSoKKwkJCWFoY19kZXZsaW1pdGVkX3N5bmNyYXRlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJICAgICAgICBzdHJ1Y3QgYWhjX2luaXRpYXRvcl90aW5mbyAqLAorCQkJCQkJdV9pbnQgKnBlcmlvZCwKKwkJCQkJCXVfaW50ICpwcHJfb3B0aW9ucywKKwkJCQkJCXJvbGVfdCByb2xlKTsKK3N0YXRpYyB2b2lkCQlhaGNfdXBkYXRlX3BlbmRpbmdfc2NicyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworc3RhdGljIHZvaWQJCWFoY19mZXRjaF9kZXZpbmZvKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHZvaWQJCWFoY19zY2JfZGV2aW5mbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCXN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkJc3RydWN0IHNjYiAqc2NiKTsKK3N0YXRpYyB2b2lkCQlhaGNfYXNzZXJ0X2F0bihzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworc3RhdGljIHZvaWQJCWFoY19zZXR1cF9pbml0aWF0b3JfbXNnb3V0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJCSAgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkJCSAgIHN0cnVjdCBzY2IgKnNjYik7CitzdGF0aWMgdm9pZAkJYWhjX2J1aWxkX3RyYW5zZmVyX21zZyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHZvaWQJCWFoY19jb25zdHJ1Y3Rfc2R0cihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkJICAgdV9pbnQgcGVyaW9kLCB1X2ludCBvZmZzZXQpOworc3RhdGljIHZvaWQJCWFoY19jb25zdHJ1Y3Rfd2R0cihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkJICAgdV9pbnQgYnVzX3dpZHRoKTsKK3N0YXRpYyB2b2lkCQlhaGNfY29uc3RydWN0X3BwcihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLAorCQkJCQkgIHVfaW50IHBlcmlvZCwgdV9pbnQgb2Zmc2V0LAorCQkJCQkgIHVfaW50IGJ1c193aWR0aCwgdV9pbnQgcHByX29wdGlvbnMpOworc3RhdGljIHZvaWQJCWFoY19jbGVhcl9tc2dfc3RhdGUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyB2b2lkCQlhaGNfaGFuZGxlX3Byb3RvX3Zpb2xhdGlvbihzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworc3RhdGljIHZvaWQJCWFoY19oYW5kbGVfbWVzc2FnZV9waGFzZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOwordHlwZWRlZiBlbnVtIHsKKwlBSENNU0dfMUIsCisJQUhDTVNHXzJCLAorCUFIQ01TR19FWFQKK30gYWhjX21zZ3R5cGU7CitzdGF0aWMgaW50CQlhaGNfc2VudF9tc2coc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBhaGNfbXNndHlwZSB0eXBlLAorCQkJCSAgICAgdV9pbnQgbXNndmFsLCBpbnQgZnVsbCk7CitzdGF0aWMgaW50CQlhaGNfcGFyc2VfbXNnKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkgICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIGludAkJYWhjX2hhbmRsZV9tc2dfcmVqZWN0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJICAgICAgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvKTsKK3N0YXRpYyB2b2lkCQlhaGNfaGFuZGxlX2lnbl93aWRlX3Jlc2lkdWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkJc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvKTsKK3N0YXRpYyB2b2lkCQlhaGNfcmVpbml0aWFsaXplX2RhdGFwdHJzKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgdm9pZAkJYWhjX2hhbmRsZV9kZXZyZXNldChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sCisJCQkJCSAgICBjYW1fc3RhdHVzIHN0YXR1cywgY2hhciAqbWVzc2FnZSwKKwkJCQkJICAgIGludCB2ZXJib3NlX2xldmVsKTsKKyNpZmRlZiBBSENfVEFSR0VUX01PREUKK3N0YXRpYyB2b2lkCQlhaGNfc2V0dXBfdGFyZ2V0X21zZ2luKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJICAgICAgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkJICAgICAgIHN0cnVjdCBzY2IgKnNjYik7CisjZW5kaWYKKworc3RhdGljIGJ1c19kbWFtYXBfY2FsbGJhY2tfdAlhaGNfZG1hbWFwX2NiOyAKK3N0YXRpYyB2b2lkCQkJYWhjX2J1aWxkX2ZyZWVfc2NiX2xpc3Qoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyBpbnQJCQlhaGNfaW5pdF9zY2JkYXRhKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgdm9pZAkJCWFoY19maW5pX3NjYmRhdGEoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyB2b2lkCQlhaGNfcWluZmlmb19yZXF1ZXVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJICAgIHN0cnVjdCBzY2IgKnByZXZfc2NiLAorCQkJCQkgICAgc3RydWN0IHNjYiAqc2NiKTsKK3N0YXRpYyBpbnQJCWFoY19xaW5maWZvX2NvdW50KHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgdV9pbnQJCWFoY19yZW1fc2NiX2Zyb21fZGlzY19saXN0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJCSAgIHVfaW50IHByZXYsIHVfaW50IHNjYnB0cik7CitzdGF0aWMgdm9pZAkJYWhjX2FkZF9jdXJzY2JfdG9fZnJlZV9saXN0KHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgdV9pbnQJCWFoY19yZW1fd3NjYihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJICAgICB1X2ludCBzY2Jwb3MsIHVfaW50IHByZXYpOworc3RhdGljIHZvaWQJCWFoY19yZXNldF9jdXJyZW50X2J1cyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworI2lmZGVmIEFIQ19EVU1QX1NFUQorc3RhdGljIHZvaWQJCWFoY19kdW1wc2VxKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CisjZW5kaWYKK3N0YXRpYyBpbnQJCWFoY19sb2Fkc2VxKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgaW50CQlhaGNfY2hlY2tfcGF0Y2goc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQlzdHJ1Y3QgcGF0Y2ggKipzdGFydF9wYXRjaCwKKwkJCQkJdV9pbnQgc3RhcnRfaW5zdHIsIHVfaW50ICpza2lwX2FkZHIpOworc3RhdGljIHZvaWQJCWFoY19kb3dubG9hZF9pbnN0cihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgIHVfaW50IGluc3RycHRyLCB1aW50OF90ICpkY29uc3RzKTsKKyNpZmRlZiBBSENfVEFSR0VUX01PREUKK3N0YXRpYyB2b2lkCQlhaGNfcXVldWVfbHN0YXRlX2V2ZW50KHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJICAgICAgIHN0cnVjdCBhaGNfdG1vZGVfbHN0YXRlICpsc3RhdGUsCisJCQkJCSAgICAgICB1X2ludCBpbml0aWF0b3JfaWQsCisJCQkJCSAgICAgICB1X2ludCBldmVudF90eXBlLAorCQkJCQkgICAgICAgdV9pbnQgZXZlbnRfYXJnKTsKK3N0YXRpYyB2b2lkCQlhaGNfdXBkYXRlX3Njc2lpZChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgdV9pbnQgdGFyZ2lkX21hc2spOworc3RhdGljIGludAkJYWhjX2hhbmRsZV90YXJnZXRfY21kKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJICAgICAgc3RydWN0IHRhcmdldF9jbWQgKmNtZCk7CisjZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFNlcXVlbmNlciBFeGVjdXRpb24gQ29udHJvbCAqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogUmVzdGFydCB0aGUgc2VxdWVuY2VyIHByb2dyYW0gZnJvbSBhZGRyZXNzIHplcm8KKyAqLwordm9pZAorYWhjX3Jlc3RhcnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCisJYWhjX3BhdXNlKGFoYyk7CisKKwkvKiBObyBtb3JlIHBlbmRpbmcgbWVzc2FnZXMuICovCisJYWhjX2NsZWFyX21zZ19zdGF0ZShhaGMpOworCisJYWhjX291dGIoYWhjLCBTQ1NJU0lHTywgMCk7CQkvKiBEZS1hc3NlcnQgQlNZICovCisJYWhjX291dGIoYWhjLCBNU0dfT1VULCBNU0dfTk9PUCk7CS8qIE5vIG1lc3NhZ2UgdG8gc2VuZCAqLworCWFoY19vdXRiKGFoYywgU1hGUkNUTDEsIGFoY19pbmIoYWhjLCBTWEZSQ1RMMSkgJiB+QklUQlVDS0VUKTsKKwlhaGNfb3V0YihhaGMsIExBU1RQSEFTRSwgUF9CVVNGUkVFKTsKKwlhaGNfb3V0YihhaGMsIFNBVkVEX1NDU0lJRCwgMHhGRik7CisJYWhjX291dGIoYWhjLCBTQVZFRF9MVU4sIDB4RkYpOworCisJLyoKKwkgKiBFbnN1cmUgdGhhdCB0aGUgc2VxdWVuY2VyJ3MgaWRlYSBvZiBUUUlOUE9TCisJICogbWF0Y2hlcyBvdXIgb3duLiAgVGhlIHNlcXVlbmNlciBpbmNyZW1lbnRzIFRRSU5QT1MKKwkgKiBvbmx5IGFmdGVyIGl0IHNlZXMgYSBETUEgY29tcGxldGUgYW5kIGEgcmVzZXQgY291bGQKKwkgKiBvY2N1ciBiZWZvcmUgdGhlIGluY3JlbWVudCBsZWF2aW5nIHRoZSBrZXJuZWwgdG8gYmVsaWV2ZQorCSAqIHRoZSBjb21tYW5kIGFycml2ZWQgYnV0IHRoZSBzZXF1ZW5jZXIgdG8gbm90LgorCSAqLworCWFoY19vdXRiKGFoYywgVFFJTlBPUywgYWhjLT50cWluZmlmb25leHQpOworCisJLyogQWx3YXlzIGFsbG93IHJlc2VsZWN0aW9uICovCisJYWhjX291dGIoYWhjLCBTQ1NJU0VRLAorCQkgYWhjX2luYihhaGMsIFNDU0lTRVFfVEVNUExBVEUpICYgKEVOU0VMSXxFTlJTRUxJfEVOQVVUT0FUTlApKTsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJLyogRW5zdXJlIHRoYXQgbm8gRE1BIG9wZXJhdGlvbnMgYXJlIGluIHByb2dyZXNzICovCisJCWFoY19vdXRiKGFoYywgQ0NTQ0JDTlQsIDApOworCQlhaGNfb3V0YihhaGMsIENDU0dDVEwsIDApOworCQlhaGNfb3V0YihhaGMsIENDU0NCQ1RMLCAwKTsKKwl9CisJLyoKKwkgKiBJZiB3ZSB3ZXJlIGluIHRoZSBwcm9jZXNzIG9mIERNQSdpbmcgU0NCIGRhdGEgaW50bworCSAqIGFuIFNDQiwgcmVwbGFjZSB0aGF0IFNDQiBvbiB0aGUgZnJlZSBsaXN0LiAgVGhpcyBwcmV2ZW50cworCSAqIGFuIFNDQiBsZWFrLgorCSAqLworCWlmICgoYWhjX2luYihhaGMsIFNFUV9GTEFHUzIpICYgU0NCX0RNQSkgIT0gMCkgeworCQlhaGNfYWRkX2N1cnNjYl90b19mcmVlX2xpc3QoYWhjKTsKKwkJYWhjX291dGIoYWhjLCBTRVFfRkxBR1MyLAorCQkJIGFoY19pbmIoYWhjLCBTRVFfRkxBR1MyKSAmIH5TQ0JfRE1BKTsKKwl9CisJYWhjX291dGIoYWhjLCBNV0lfUkVTSURVQUwsIDApOworCWFoY19vdXRiKGFoYywgU0VRQ1RMLCBhaGMtPnNlcWN0bCk7CisJYWhjX291dGIoYWhjLCBTRVFBRERSMCwgMCk7CisJYWhjX291dGIoYWhjLCBTRVFBRERSMSwgMCk7CisJYWhjX3VucGF1c2UoYWhjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogSW5wdXQvT3V0cHV0IFF1ZXVlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2FoY19ydW5fcW91dGZpZm8oc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXN0cnVjdCBzY2IgKnNjYjsKKwl1X2ludCAgc2NiX2luZGV4OworCisJYWhjX3N5bmNfcW91dGZpZm8oYWhjLCBCVVNfRE1BU1lOQ19QT1NUUkVBRCk7CisJd2hpbGUgKGFoYy0+cW91dGZpZm9bYWhjLT5xb3V0Zmlmb25leHRdICE9IFNDQl9MSVNUX05VTEwpIHsKKworCQlzY2JfaW5kZXggPSBhaGMtPnFvdXRmaWZvW2FoYy0+cW91dGZpZm9uZXh0XTsKKwkJaWYgKChhaGMtPnFvdXRmaWZvbmV4dCAmIDB4MDMpID09IDB4MDMpIHsKKwkJCXVfaW50IG1vZG5leHQ7CisKKwkJCS8qCisJCQkgKiBDbGVhciAzMmJpdHMgb2YgUU9VVEZJRk8gYXQgYSB0aW1lCisJCQkgKiBzbyB0aGF0IHdlIGRvbid0IGNsb2JiZXIgYW4gaW5jb21pbmcKKwkJCSAqIGJ5dGUgRE1BIHRvIHRoZSBhcnJheSBvbiBhcmNoaXRlY3R1cmVzCisJCQkgKiB0aGF0IG9ubHkgc3VwcG9ydCAzMmJpdCBsb2FkIGFuZCBzdG9yZQorCQkJICogb3BlcmF0aW9ucy4KKwkJCSAqLworCQkJbW9kbmV4dCA9IGFoYy0+cW91dGZpZm9uZXh0ICYgfjB4MzsKKwkJCSooKHVpbnQzMl90ICopKCZhaGMtPnFvdXRmaWZvW21vZG5leHRdKSkgPSAweEZGRkZGRkZGVUw7CisJCQlhaGNfZG1hbWFwX3N5bmMoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsCisJCQkJCWFoYy0+c2hhcmVkX2RhdGFfZG1hbWFwLAorCQkJCQkvKm9mZnNldCovbW9kbmV4dCwgLypsZW4qLzQsCisJCQkJCUJVU19ETUFTWU5DX1BSRVJFQUQpOworCQl9CisJCWFoYy0+cW91dGZpZm9uZXh0Kys7CisKKwkJc2NiID0gYWhjX2xvb2t1cF9zY2IoYWhjLCBzY2JfaW5kZXgpOworCQlpZiAoc2NiID09IE5VTEwpIHsKKwkJCXByaW50ZigiJXM6IFdBUk5JTkcgbm8gY29tbWFuZCBmb3Igc2NiICVkICIKKwkJCSAgICAgICAiKGNtZGNtcGx0KVxuUU9VVFBPUyA9ICVkXG4iLAorCQkJICAgICAgIGFoY19uYW1lKGFoYyksIHNjYl9pbmRleCwKKwkJCSAgICAgICAoYWhjLT5xb3V0Zmlmb25leHQgLSAxKSAmIDB4RkYpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBTYXZlIG9mZiB0aGUgcmVzaWR1YWwKKwkJICogaWYgdGhlcmUgaXMgb25lLgorCQkgKi8KKwkJYWhjX3VwZGF0ZV9yZXNpZHVhbChhaGMsIHNjYik7CisJCWFoY19kb25lKGFoYywgc2NiKTsKKwl9Cit9CisKK3ZvaWQKK2FoY19ydW5fdW50YWdnZWRfcXVldWVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlhaGNfcnVuX3VudGFnZ2VkX3F1ZXVlKGFoYywgJmFoYy0+dW50YWdnZWRfcXVldWVzW2ldKTsKK30KKwordm9pZAorYWhjX3J1bl91bnRhZ2dlZF9xdWV1ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2JfdGFpbHEgKnF1ZXVlKQoreworCXN0cnVjdCBzY2IgKnNjYjsKKworCWlmIChhaGMtPnVudGFnZ2VkX3F1ZXVlX2xvY2sgIT0gMCkKKwkJcmV0dXJuOworCisJaWYgKChzY2IgPSBUQUlMUV9GSVJTVChxdWV1ZSkpICE9IE5VTEwKKwkgJiYgKHNjYi0+ZmxhZ3MgJiBTQ0JfQUNUSVZFKSA9PSAwKSB7CisJCXNjYi0+ZmxhZ3MgfD0gU0NCX0FDVElWRTsKKwkJYWhjX3F1ZXVlX3NjYihhaGMsIHNjYik7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBJbnRlcnJ1cHQgSGFuZGxpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorYWhjX2hhbmRsZV9icmthZHJpbnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCS8qCisJICogV2UgdXBzZXQgdGhlIHNlcXVlbmNlciA6LSgKKwkgKiBMb29rdXAgdGhlIGVycm9yIG1lc3NhZ2UKKwkgKi8KKwlpbnQgaTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGFoY19pbmIoYWhjLCBFUlJPUik7CisJZm9yIChpID0gMDsgZXJyb3IgIT0gMSAmJiBpIDwgbnVtX2Vycm9yczsgaSsrKQorCQllcnJvciA+Pj0gMTsKKwlwcmludGYoIiVzOiBicmthZHJpbnQsICVzIGF0IHNlcWFkZHIgPSAweCV4XG4iLAorCSAgICAgICBhaGNfbmFtZShhaGMpLCBhaGNfaGFyZF9lcnJvcnNbaV0uZXJybWVzZywKKwkgICAgICAgYWhjX2luYihhaGMsIFNFUUFERFIwKSB8CisJICAgICAgIChhaGNfaW5iKGFoYywgU0VRQUREUjEpIDw8IDgpKTsKKworCWFoY19kdW1wX2NhcmRfc3RhdGUoYWhjKTsKKworCS8qIFRlbGwgZXZlcnlvbmUgdGhhdCB0aGlzIEhCQSBpcyBubyBsb25nZXIgYXZhaWxhYmxlICovCisJYWhjX2Fib3J0X3NjYnMoYWhjLCBDQU1fVEFSR0VUX1dJTERDQVJELCBBTExfQ0hBTk5FTFMsCisJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBTQ0JfTElTVF9OVUxMLCBST0xFX1VOS05PV04sCisJCSAgICAgICBDQU1fTk9fSEJBKTsKKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdCBzb3VyY2VzIGJ5IHJlc2V0dGluZyB0aGUgY29udHJvbGxlciAqLworCWFoY19zaHV0ZG93bihhaGMpOworfQorCit2b2lkCithaGNfaGFuZGxlX3NlcWludChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IGludHN0YXQpCit7CisJc3RydWN0IHNjYiAqc2NiOworCXN0cnVjdCBhaGNfZGV2aW5mbyBkZXZpbmZvOworCQorCWFoY19mZXRjaF9kZXZpbmZvKGFoYywgJmRldmluZm8pOworCisJLyoKKwkgKiBDbGVhciB0aGUgdXBwZXIgYnl0ZSB0aGF0IGhvbGRzIFNFUUlOVCBzdGF0dXMKKwkgKiBjb2RlcyBhbmQgY2xlYXIgdGhlIFNFUUlOVCBiaXQuIFdlIHdpbGwgdW5wYXVzZQorCSAqIHRoZSBzZXF1ZW5jZXIsIGlmIGFwcHJvcHJpYXRlLCBhZnRlciBzZXJ2aWNpbmcKKwkgKiB0aGUgcmVxdWVzdC4KKwkgKi8KKwlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSU0VRSU5UKTsKKwlzd2l0Y2ggKGludHN0YXQgJiBTRVFJTlRfTUFTSykgeworCWNhc2UgQkFEX1NUQVRVUzoKKwl7CisJCXVfaW50ICBzY2JfaW5kZXg7CisJCXN0cnVjdCBoYXJkd2FyZV9zY2IgKmhzY2I7CisKKwkJLyoKKwkJICogU2V0IHRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSB0byAwIChkb24ndAorCQkgKiBzZW5kIHNlbnNlKS4gIFRoZSBzZW5zZSBjb2RlIHdpbGwgY2hhbmdlCisJCSAqIHRoaXMgaWYgbmVlZGVkLgorCQkgKi8KKwkJYWhjX291dGIoYWhjLCBSRVRVUk5fMSwgMCk7CisKKwkJLyoKKwkJICogVGhlIHNlcXVlbmNlciB3aWxsIG5vdGlmeSB1cyB3aGVuIGEgY29tbWFuZAorCQkgKiBoYXMgYW4gZXJyb3IgdGhhdCB3b3VsZCBiZSBvZiBpbnRlcmVzdCB0bworCQkgKiB0aGUga2VybmVsLiAgVGhpcyBhbGxvd3MgdXMgdG8gbGVhdmUgdGhlIHNlcXVlbmNlcgorCQkgKiBydW5uaW5nIGluIHRoZSBjb21tb24gY2FzZSBvZiBjb21tYW5kIGNvbXBsZXRlcworCQkgKiB3aXRob3V0IGVycm9yLiAgVGhlIHNlcXVlbmNlciB3aWxsIGFscmVhZHkgaGF2ZQorCQkgKiBkbWEnZCB0aGUgU0NCIGJhY2sgdXAgdG8gdXMsIHNvIHdlIGNhbiByZWZlcmVuY2UKKwkJICogdGhlIGluIGtlcm5lbCBjb3B5IGRpcmVjdGx5LgorCQkgKi8KKwkJc2NiX2luZGV4ID0gYWhjX2luYihhaGMsIFNDQl9UQUcpOworCQlzY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIHNjYl9pbmRleCk7CisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJYWhjX3ByaW50X2RldmluZm8oYWhjLCAmZGV2aW5mbyk7CisJCQlwcmludGYoImFoY19pbnRyIC0gcmVmZXJlbmNlZCBzY2IgIgorCQkJICAgICAgICJub3QgdmFsaWQgZHVyaW5nIHNlcWludCAweCV4IHNjYiglZClcbiIsCisJCQkgICAgICAgaW50c3RhdCwgc2NiX2luZGV4KTsKKwkJCWFoY19kdW1wX2NhcmRfc3RhdGUoYWhjKTsKKwkJCXBhbmljKCJmb3Igc2FmZXR5Iik7CisJCQlnb3RvIHVucGF1c2U7CisJCX0KKworCQloc2NiID0gc2NiLT5oc2NiOyAKKworCQkvKiBEb24ndCB3YW50IHRvIGNsb2JiZXIgdGhlIG9yaWdpbmFsIHNlbnNlIGNvZGUgKi8KKwkJaWYgKChzY2ItPmZsYWdzICYgU0NCX1NFTlNFKSAhPSAwKSB7CisJCQkvKgorCQkJICogQ2xlYXIgdGhlIFNDQl9TRU5TRSBGbGFnIGFuZCBoYXZlCisJCQkgKiB0aGUgc2VxdWVuY2VyIGRvIGEgbm9ybWFsIGNvbW1hbmQKKwkJCSAqIGNvbXBsZXRlLgorCQkJICovCisJCQlzY2ItPmZsYWdzICY9IH5TQ0JfU0VOU0U7CisJCQlhaGNfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9BVVRPU0VOU0VfRkFJTCk7CisJCQlicmVhazsKKwkJfQorCQlhaGNfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9TQ1NJX1NUQVRVU19FUlJPUik7CisJCS8qIEZyZWV6ZSB0aGUgcXVldWUgdW50aWwgdGhlIGNsaWVudCBzZWVzIHRoZSBlcnJvci4gKi8KKwkJYWhjX2ZyZWV6ZV9kZXZxKGFoYywgc2NiKTsKKwkJYWhjX2ZyZWV6ZV9zY2Ioc2NiKTsKKwkJYWhjX3NldF9zY3NpX3N0YXR1cyhzY2IsIGhzY2ItPnNoYXJlZF9kYXRhLnN0YXR1cy5zY3NpX3N0YXR1cyk7CisJCXN3aXRjaCAoaHNjYi0+c2hhcmVkX2RhdGEuc3RhdHVzLnNjc2lfc3RhdHVzKSB7CisJCWNhc2UgU0NTSV9TVEFUVVNfT0s6CisJCQlwcmludGYoIiVzOiBJbnRlcnJ1cHRlZCBmb3Igc3RhdXMgb2YgMD8/P1xuIiwKKwkJCSAgICAgICBhaGNfbmFtZShhaGMpKTsKKwkJCWJyZWFrOworCQljYXNlIFNDU0lfU1RBVFVTX0NNRF9URVJNSU5BVEVEOgorCQljYXNlIFNDU0lfU1RBVFVTX0NIRUNLX0NPTkQ6CisJCXsKKwkJCXN0cnVjdCBhaGNfZG1hX3NlZyAqc2c7CisJCQlzdHJ1Y3Qgc2NzaV9zZW5zZSAqc2M7CisJCQlzdHJ1Y3QgYWhjX2luaXRpYXRvcl90aW5mbyAqdGFyZ19pbmZvOworCQkJc3RydWN0IGFoY190bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwkJCXN0cnVjdCBhaGNfdHJhbnNpbmZvICp0aW5mbzsKKyNpZmRlZiBBSENfREVCVUcKKwkJCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19TRU5TRSkgeworCQkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKKwkJCQlwcmludGYoIlNDQiAlZDogcmVxdWVzdHMgQ2hlY2sgU3RhdHVzXG4iLAorCQkJCSAgICAgICBzY2ItPmhzY2ItPnRhZyk7CisJCQl9CisjZW5kaWYKKworCQkJaWYgKGFoY19wZXJmb3JtX2F1dG9zZW5zZShzY2IpID09IDApCisJCQkJYnJlYWs7CisKKwkJCXRhcmdfaW5mbyA9IGFoY19mZXRjaF90cmFuc2luZm8oYWhjLAorCQkJCQkJCWRldmluZm8uY2hhbm5lbCwKKwkJCQkJCQlkZXZpbmZvLm91cl9zY3NpaWQsCisJCQkJCQkJZGV2aW5mby50YXJnZXQsCisJCQkJCQkJJnRzdGF0ZSk7CisJCQl0aW5mbyA9ICZ0YXJnX2luZm8tPmN1cnI7CisJCQlzZyA9IHNjYi0+c2dfbGlzdDsKKwkJCXNjID0gKHN0cnVjdCBzY3NpX3NlbnNlICopKCZoc2NiLT5zaGFyZWRfZGF0YS5jZGIpOyAKKwkJCS8qCisJCQkgKiBTYXZlIG9mZiB0aGUgcmVzaWR1YWwgaWYgdGhlcmUgaXMgb25lLgorCQkJICovCisJCQlhaGNfdXBkYXRlX3Jlc2lkdWFsKGFoYywgc2NiKTsKKyNpZmRlZiBBSENfREVCVUcKKwkJCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19TRU5TRSkgeworCQkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKKwkJCQlwcmludGYoIlNlbmRpbmcgU2Vuc2VcbiIpOworCQkJfQorI2VuZGlmCisJCQlzZy0+YWRkciA9IGFoY19nZXRfc2Vuc2VfYnVmYWRkcihhaGMsIHNjYik7CisJCQlzZy0+bGVuID0gYWhjX2dldF9zZW5zZV9idWZzaXplKGFoYywgc2NiKTsKKwkJCXNnLT5sZW4gfD0gQUhDX0RNQV9MQVNUX1NFRzsKKworCQkJLyogRml4dXAgYnl0ZSBvcmRlciAqLworCQkJc2ctPmFkZHIgPSBhaGNfaHRvbGUzMihzZy0+YWRkcik7CisJCQlzZy0+bGVuID0gYWhjX2h0b2xlMzIoc2ctPmxlbik7CisKKwkJCXNjLT5vcGNvZGUgPSBSRVFVRVNUX1NFTlNFOworCQkJc2MtPmJ5dGUyID0gMDsKKwkJCWlmICh0aW5mby0+cHJvdG9jb2xfdmVyc2lvbiA8PSBTQ1NJX1JFVl8yCisJCQkgJiYgU0NCX0dFVF9MVU4oc2NiKSA8IDgpCisJCQkJc2MtPmJ5dGUyID0gU0NCX0dFVF9MVU4oc2NiKSA8PCA1OworCQkJc2MtPnVudXNlZFswXSA9IDA7CisJCQlzYy0+dW51c2VkWzFdID0gMDsKKwkJCXNjLT5sZW5ndGggPSBzZy0+bGVuOworCQkJc2MtPmNvbnRyb2wgPSAwOworCisJCQkvKgorCQkJICogV2UgY2FuJ3QgYWxsb3cgdGhlIHRhcmdldCB0byBkaXNjb25uZWN0LgorCQkJICogVGhpcyB3aWxsIGJlIGFuIHVudGFnZ2VkIHRyYW5zYWN0aW9uIGFuZAorCQkJICogaGF2aW5nIHRoZSB0YXJnZXQgZGlzY29ubmVjdCB3aWxsIG1ha2UgdGhpcworCQkJICogdHJhbnNhY3Rpb24gaW5kZXN0aW5ndWlzaGFibGUgZnJvbSBvdXRzdGFuZGluZworCQkJICogdGFnZ2VkIHRyYW5zYWN0aW9ucy4KKwkJCSAqLworCQkJaHNjYi0+Y29udHJvbCA9IDA7CisKKwkJCS8qCisJCQkgKiBUaGlzIHJlcXVlc3Qgc2Vuc2UgY291bGQgYmUgYmVjYXVzZSB0aGUKKwkJCSAqIHRoZSBkZXZpY2UgbG9zdCBwb3dlciBvciBpbiBzb21lIG90aGVyCisJCQkgKiB3YXkgaGFzIGxvc3Qgb3VyIHRyYW5zZmVyIG5lZ290aWF0aW9ucy4KKwkJCSAqIFJlbmVnb3RpYXRlIGlmIGFwcHJvcHJpYXRlLiAgVW5pdCBhdHRlbnRpb24KKwkJCSAqIGVycm9ycyB3aWxsIGJlIHJlcG9ydGVkIGJlZm9yZSBhbnkgZGF0YQorCQkJICogcGhhc2VzIG9jY3VyLgorCQkJICovCisJCQlpZiAoYWhjX2dldF9yZXNpZHVhbChzY2IpIAorCQkJID09IGFoY19nZXRfdHJhbnNmZXJfbGVuZ3RoKHNjYikpIHsKKwkJCQlhaGNfdXBkYXRlX25lZ19yZXF1ZXN0KGFoYywgJmRldmluZm8sCisJCQkJCQkgICAgICAgdHN0YXRlLCB0YXJnX2luZm8sCisJCQkJCQkgICAgICAgQUhDX05FR19JRl9OT05fQVNZTkMpOworCQkJfQorCQkJaWYgKHRzdGF0ZS0+YXV0b19uZWdvdGlhdGUgJiBkZXZpbmZvLnRhcmdldF9tYXNrKSB7CisJCQkJaHNjYi0+Y29udHJvbCB8PSBNS19NRVNTQUdFOworCQkJCXNjYi0+ZmxhZ3MgJj0gflNDQl9ORUdPVElBVEU7CisJCQkJc2NiLT5mbGFncyB8PSBTQ0JfQVVUT19ORUdPVElBVEU7CisJCQl9CisJCQloc2NiLT5jZGJfbGVuID0gc2l6ZW9mKCpzYyk7CisJCQloc2NiLT5kYXRhcHRyID0gc2ctPmFkZHI7IAorCQkJaHNjYi0+ZGF0YWNudCA9IHNnLT5sZW47CisJCQloc2NiLT5zZ3B0ciA9IHNjYi0+c2dfbGlzdF9waHlzIHwgU0dfRlVMTF9SRVNJRDsKKwkJCWhzY2ItPnNncHRyID0gYWhjX2h0b2xlMzIoaHNjYi0+c2dwdHIpOworCQkJc2NiLT5zZ19jb3VudCA9IDE7CisJCQlzY2ItPmZsYWdzIHw9IFNDQl9TRU5TRTsKKwkJCWFoY19xaW5maWZvX3JlcXVldWVfdGFpbChhaGMsIHNjYik7CisJCQlhaGNfb3V0YihhaGMsIFJFVFVSTl8xLCBTRU5EX1NFTlNFKTsKKwkJCS8qCisJCQkgKiBFbnN1cmUgd2UgaGF2ZSBlbm91Z2ggdGltZSB0byBhY3R1YWxseQorCQkJICogcmV0cmlldmUgdGhlIHNlbnNlLgorCQkJICovCisJCQlhaGNfc2NiX3RpbWVyX3Jlc2V0KHNjYiwgNSAqIDEwMDAwMDApOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIE5PX01BVENIOgorCXsKKwkJLyogRW5zdXJlIHdlIGRvbid0IGxlYXZlIHRoZSBzZWxlY3Rpb24gaGFyZHdhcmUgb24gKi8KKwkJYWhjX291dGIoYWhjLCBTQ1NJU0VRLAorCQkJIGFoY19pbmIoYWhjLCBTQ1NJU0VRKSAmIChFTlNFTEl8RU5SU0VMSXxFTkFVVE9BVE5QKSk7CisKKwkJcHJpbnRmKCIlczolYzolZDogbm8gYWN0aXZlIFNDQiBmb3IgcmVjb25uZWN0aW5nICIKKwkJICAgICAgICJ0YXJnZXQgLSBpc3N1aW5nIEJVUyBERVZJQ0UgUkVTRVRcbiIsCisJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLmNoYW5uZWwsIGRldmluZm8udGFyZ2V0KTsKKwkJcHJpbnRmKCJTQVZFRF9TQ1NJSUQgPT0gMHgleCwgU0FWRURfTFVOID09IDB4JXgsICIKKwkJICAgICAgICJBUkdfMSA9PSAweCV4IEFDQ1VNID0gMHgleFxuIiwKKwkJICAgICAgIGFoY19pbmIoYWhjLCBTQVZFRF9TQ1NJSUQpLCBhaGNfaW5iKGFoYywgU0FWRURfTFVOKSwKKwkJICAgICAgIGFoY19pbmIoYWhjLCBBUkdfMSksIGFoY19pbmIoYWhjLCBBQ0NVTSkpOworCQlwcmludGYoIlNFUV9GTEFHUyA9PSAweCV4LCBTQ0JQVFIgPT0gMHgleCwgQlRUID09IDB4JXgsICIKKwkJICAgICAgICJTSU5ERVggPT0gMHgleFxuIiwKKwkJICAgICAgIGFoY19pbmIoYWhjLCBTRVFfRkxBR1MpLCBhaGNfaW5iKGFoYywgU0NCUFRSKSwKKwkJICAgICAgIGFoY19pbmRleF9idXN5X3RjbChhaGMsCisJCQkgICAgQlVJTERfVENMKGFoY19pbmIoYWhjLCBTQVZFRF9TQ1NJSUQpLAorCQkJCSAgICAgIGFoY19pbmIoYWhjLCBTQVZFRF9MVU4pKSksCisJCSAgICAgICBhaGNfaW5iKGFoYywgU0lOREVYKSk7CisJCXByaW50ZigiU0NTSUlEID09IDB4JXgsIFNDQl9TQ1NJSUQgPT0gMHgleCwgU0NCX0xVTiA9PSAweCV4LCAiCisJCSAgICAgICAiU0NCX1RBRyA9PSAweCV4LCBTQ0JfQ09OVFJPTCA9PSAweCV4XG4iLAorCQkgICAgICAgYWhjX2luYihhaGMsIFNDU0lJRCksIGFoY19pbmIoYWhjLCBTQ0JfU0NTSUlEKSwKKwkJICAgICAgIGFoY19pbmIoYWhjLCBTQ0JfTFVOKSwgYWhjX2luYihhaGMsIFNDQl9UQUcpLAorCQkgICAgICAgYWhjX2luYihhaGMsIFNDQl9DT05UUk9MKSk7CisJCXByaW50ZigiU0NTSUJVU0wgPT0gMHgleCwgU0NTSVNJR0kgPT0gMHgleFxuIiwKKwkJICAgICAgIGFoY19pbmIoYWhjLCBTQ1NJQlVTTCksIGFoY19pbmIoYWhjLCBTQ1NJU0lHSSkpOworCQlwcmludGYoIlNYRlJDVEwwID09IDB4JXhcbiIsIGFoY19pbmIoYWhjLCBTWEZSQ1RMMCkpOworCQlwcmludGYoIlNFUUNUTCA9PSAweCV4XG4iLCBhaGNfaW5iKGFoYywgU0VRQ1RMKSk7CisJCWFoY19kdW1wX2NhcmRfc3RhdGUoYWhjKTsKKwkJYWhjLT5tc2dvdXRfYnVmWzBdID0gTVNHX0JVU19ERVZfUkVTRVQ7CisJCWFoYy0+bXNnb3V0X2xlbiA9IDE7CisJCWFoYy0+bXNnb3V0X2luZGV4ID0gMDsKKwkJYWhjLT5tc2dfdHlwZSA9IE1TR19UWVBFX0lOSVRJQVRPUl9NU0dPVVQ7CisJCWFoY19vdXRiKGFoYywgTVNHX09VVCwgSE9TVF9NU0cpOworCQlhaGNfYXNzZXJ0X2F0bihhaGMpOworCQlicmVhazsKKwl9CisJY2FzZSBTRU5EX1JFSkVDVDogCisJeworCQl1X2ludCByZWpieXRlID0gYWhjX2luYihhaGMsIEFDQ1VNKTsKKwkJcHJpbnRmKCIlczolYzolZDogV2FybmluZyAtIHVua25vd24gbWVzc2FnZSByZWNlaXZlZCBmcm9tICIKKwkJICAgICAgICJ0YXJnZXQgKDB4JXgpLiAgUmVqZWN0aW5nXG4iLCAKKwkJICAgICAgIGFoY19uYW1lKGFoYyksIGRldmluZm8uY2hhbm5lbCwgZGV2aW5mby50YXJnZXQsIHJlamJ5dGUpOworCQlicmVhazsgCisJfQorCWNhc2UgUFJPVE9fVklPTEFUSU9OOgorCXsKKwkJYWhjX2hhbmRsZV9wcm90b192aW9sYXRpb24oYWhjKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSUdOX1dJREVfUkVTOgorCQlhaGNfaGFuZGxlX2lnbl93aWRlX3Jlc2lkdWUoYWhjLCAmZGV2aW5mbyk7CisJCWJyZWFrOworCWNhc2UgUERBVEFfUkVJTklUOgorCQlhaGNfcmVpbml0aWFsaXplX2RhdGFwdHJzKGFoYyk7CisJCWJyZWFrOworCWNhc2UgQkFEX1BIQVNFOgorCXsKKwkJdV9pbnQgbGFzdHBoYXNlOworCisJCWxhc3RwaGFzZSA9IGFoY19pbmIoYWhjLCBMQVNUUEhBU0UpOworCQlwcmludGYoIiVzOiVjOiVkOiB1bmtub3duIHNjc2kgYnVzIHBoYXNlICV4LCAiCisJCSAgICAgICAibGFzdHBoYXNlID0gMHgleC4gIEF0dGVtcHRpbmcgdG8gY29udGludWVcbiIsCisJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLmNoYW5uZWwsIGRldmluZm8udGFyZ2V0LAorCQkgICAgICAgbGFzdHBoYXNlLCBhaGNfaW5iKGFoYywgU0NTSVNJR0kpKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTUlTU0VEX0JVU0ZSRUU6CisJeworCQl1X2ludCBsYXN0cGhhc2U7CisKKwkJbGFzdHBoYXNlID0gYWhjX2luYihhaGMsIExBU1RQSEFTRSk7CisJCXByaW50ZigiJXM6JWM6JWQ6IE1pc3NlZCBidXNmcmVlLiAiCisJCSAgICAgICAiTGFzdHBoYXNlID0gMHgleCwgQ3VycGhhc2UgPSAweCV4XG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby5jaGFubmVsLCBkZXZpbmZvLnRhcmdldCwKKwkJICAgICAgIGxhc3RwaGFzZSwgYWhjX2luYihhaGMsIFNDU0lTSUdJKSk7CisJCWFoY19yZXN0YXJ0KGFoYyk7CisJCXJldHVybjsKKwl9CisJY2FzZSBIT1NUX01TR19MT09QOgorCXsKKwkJLyoKKwkJICogVGhlIHNlcXVlbmNlciBoYXMgZW5jb3VudGVyZWQgYSBtZXNzYWdlIHBoYXNlCisJCSAqIHRoYXQgcmVxdWlyZXMgaG9zdCBhc3Npc3RhbmNlIGZvciBjb21wbGV0aW9uLgorCQkgKiBXaGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZSBwaGFzZShzKSwgd2Ugd2lsbCBiZQorCQkgKiBub3RpZmllZCBieSB0aGUgc2VxdWVuY2VyIGFmdGVyIGVhY2ggYnl0ZSBpcworCQkgKiB0cmFuc2ZlcmVkIHNvIHdlIGNhbiB0cmFjayBidXMgcGhhc2UgY2hhbmdlcy4KKwkJICoKKwkJICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBzZWVuIGEgSE9TVF9NU0dfTE9PUAorCQkgKiBpbnRlcnJ1cHQsIGluaXRpYWxpemUgdGhlIHN0YXRlIG9mIHRoZSBob3N0IG1lc3NhZ2UKKwkJICogbG9vcC4KKwkJICovCisJCWlmIChhaGMtPm1zZ190eXBlID09IE1TR19UWVBFX05PTkUpIHsKKwkJCXN0cnVjdCBzY2IgKnNjYjsKKwkJCXVfaW50IHNjYl9pbmRleDsKKwkJCXVfaW50IGJ1c19waGFzZTsKKworCQkJYnVzX3BoYXNlID0gYWhjX2luYihhaGMsIFNDU0lTSUdJKSAmIFBIQVNFX01BU0s7CisJCQlpZiAoYnVzX3BoYXNlICE9IFBfTUVTR0lOCisJCQkgJiYgYnVzX3BoYXNlICE9IFBfTUVTR09VVCkgeworCQkJCXByaW50ZigiYWhjX2ludHI6IEhPU1RfTVNHX0xPT1AgYmFkICIKKwkJCQkgICAgICAgInBoYXNlIDB4JXhcbiIsCisJCQkJICAgICAgYnVzX3BoYXNlKTsKKwkJCQkvKgorCQkJCSAqIFByb2JhYmx5IHRyYW5zaXRpb25lZCB0byBidXMgZnJlZSBiZWZvcmUKKwkJCQkgKiB3ZSBnb3QgaGVyZS4gIEp1c3QgcHVudCB0aGUgbWVzc2FnZS4KKwkJCQkgKi8KKwkJCQlhaGNfY2xlYXJfaW50c3RhdChhaGMpOworCQkJCWFoY19yZXN0YXJ0KGFoYyk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlzY2JfaW5kZXggPSBhaGNfaW5iKGFoYywgU0NCX1RBRyk7CisJCQlzY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIHNjYl9pbmRleCk7CisJCQlpZiAoZGV2aW5mby5yb2xlID09IFJPTEVfSU5JVElBVE9SKSB7CisJCQkJaWYgKHNjYiA9PSBOVUxMKQorCQkJCQlwYW5pYygiSE9TVF9NU0dfTE9PUCB3aXRoICIKKwkJCQkJICAgICAgImludmFsaWQgU0NCICV4XG4iLCBzY2JfaW5kZXgpOworCisJCQkJaWYgKGJ1c19waGFzZSA9PSBQX01FU0dPVVQpCisJCQkJCWFoY19zZXR1cF9pbml0aWF0b3JfbXNnb3V0KGFoYywKKwkJCQkJCQkJICAgJmRldmluZm8sCisJCQkJCQkJCSAgIHNjYik7CisJCQkJZWxzZSB7CisJCQkJCWFoYy0+bXNnX3R5cGUgPQorCQkJCQkgICAgTVNHX1RZUEVfSU5JVElBVE9SX01TR0lOOworCQkJCQlhaGMtPm1zZ2luX2luZGV4ID0gMDsKKwkJCQl9CisJCQl9CisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCisJCQllbHNlIHsKKwkJCQlpZiAoYnVzX3BoYXNlID09IFBfTUVTR09VVCkgeworCQkJCQlhaGMtPm1zZ190eXBlID0KKwkJCQkJICAgIE1TR19UWVBFX1RBUkdFVF9NU0dPVVQ7CisJCQkJCWFoYy0+bXNnaW5faW5kZXggPSAwOworCQkJCX0KKwkJCQllbHNlIAorCQkJCQlhaGNfc2V0dXBfdGFyZ2V0X21zZ2luKGFoYywKKwkJCQkJCQkgICAgICAgJmRldmluZm8sCisJCQkJCQkJICAgICAgIHNjYik7CisJCQl9CisjZW5kaWYKKwkJfQorCisJCWFoY19oYW5kbGVfbWVzc2FnZV9waGFzZShhaGMpOworCQlicmVhazsKKwl9CisJY2FzZSBQRVJSX0RFVEVDVEVEOgorCXsKKwkJLyoKKwkJICogSWYgd2UndmUgY2xlYXJlZCB0aGUgcGFyaXR5IGVycm9yIGludGVycnVwdAorCQkgKiBidXQgdGhlIHNlcXVlbmNlciBzdGlsbCBiZWxpZXZlcyB0aGF0IFNDU0lQRVJSCisJCSAqIGlzIHRydWUsIGl0IG11c3QgYmUgdGhhdCB0aGUgcGFyaXR5IGVycm9yIGlzCisJCSAqIGZvciB0aGUgY3VycmVudGx5IHByZXNlbnRlZCBieXRlIG9uIHRoZSBidXMsCisJCSAqIGFuZCB3ZSBhcmUgbm90IGluIGEgcGhhc2UgKGRhdGEtaW4pIHdoZXJlIHdlIHdpbGwKKwkJICogZXZlbnR1YWxseSBhY2sgdGhpcyBieXRlLiAgQWNrIHRoZSBieXRlIGFuZAorCQkgKiB0aHJvdyBpdCBhd2F5IGluIHRoZSBob3BlIHRoYXQgdGhlIHRhcmdldCB3aWxsCisJCSAqIHRha2UgdXMgdG8gbWVzc2FnZSBvdXQgdG8gZGVsaXZlciB0aGUgYXBwcm9wcmlhdGUKKwkJICogZXJyb3IgbWVzc2FnZS4KKwkJICovCisJCWlmICgoaW50c3RhdCAmIFNDU0lJTlQpID09IDAKKwkJICYmIChhaGNfaW5iKGFoYywgU1NUQVQxKSAmIFNDU0lQRVJSKSAhPSAwKSB7CisKKwkJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgPT0gMCkgeworCQkJCXVfaW50IGN1cnBoYXNlOworCisJCQkJLyoKKwkJCQkgKiBUaGUgaGFyZHdhcmUgd2lsbCBvbmx5IGxldCB5b3UgYWNrIGJ5dGVzCisJCQkJICogaWYgdGhlIGV4cGVjdGVkIHBoYXNlIGluIFNDU0lTSUdPIG1hdGNoZXMKKwkJCQkgKiB0aGUgY3VycmVudCBwaGFzZS4gIE1ha2Ugc3VyZSB0aGlzIGlzCisJCQkJICogY3VycmVudGx5IHRoZSBjYXNlLgorCQkJCSAqLworCQkJCWN1cnBoYXNlID0gYWhjX2luYihhaGMsIFNDU0lTSUdJKSAmIFBIQVNFX01BU0s7CisJCQkJYWhjX291dGIoYWhjLCBMQVNUUEhBU0UsIGN1cnBoYXNlKTsKKwkJCQlhaGNfb3V0YihhaGMsIFNDU0lTSUdPLCBjdXJwaGFzZSk7CisJCQl9CisJCQlpZiAoKGFoY19pbmIoYWhjLCBTQ1NJU0lHSSkgJiAoQ0RJfE1TR0kpKSA9PSAwKSB7CisJCQkJaW50IHdhaXQ7CisKKwkJCQkvKgorCQkJCSAqIEluIGEgZGF0YSBwaGFzZS4gIEZhc3RlciB0byBiaXRidWNrZXQKKwkJCQkgKiB0aGUgZGF0YSB0aGFuIHRvIGluZGl2aWR1YWxseSBhY2sgZWFjaAorCQkJCSAqIGJ5dGUuICBUaGlzIGlzIGFsc28gdGhlIG9ubHkgc3RyYXRlZ3kKKwkJCQkgKiB0aGF0IHdpbGwgd29yayB3aXRoIEFVVE9BQ0sgZW5hYmxlZC4KKwkJCQkgKi8KKwkJCQlhaGNfb3V0YihhaGMsIFNYRlJDVEwxLAorCQkJCQkgYWhjX2luYihhaGMsIFNYRlJDVEwxKSB8IEJJVEJVQ0tFVCk7CisJCQkJd2FpdCA9IDUwMDA7CisJCQkJd2hpbGUgKC0td2FpdCAhPSAwKSB7CisJCQkJCWlmICgoYWhjX2luYihhaGMsIFNDU0lTSUdJKQorCQkJCQkgICYgKENESXxNU0dJKSkgIT0gMCkKKwkJCQkJCWJyZWFrOworCQkJCQlhaGNfZGVsYXkoMTAwKTsKKwkJCQl9CisJCQkJYWhjX291dGIoYWhjLCBTWEZSQ1RMMSwKKwkJCQkJIGFoY19pbmIoYWhjLCBTWEZSQ1RMMSkgJiB+QklUQlVDS0VUKTsKKwkJCQlpZiAod2FpdCA9PSAwKSB7CisJCQkJCXN0cnVjdAlzY2IgKnNjYjsKKwkJCQkJdV9pbnQJc2NiX2luZGV4OworCisJCQkJCWFoY19wcmludF9kZXZpbmZvKGFoYywgJmRldmluZm8pOworCQkJCQlwcmludGYoIlVuYWJsZSB0byBjbGVhciBwYXJpdHkgZXJyb3IuICAiCisJCQkJCSAgICAgICAiUmVzZXR0aW5nIGJ1cy5cbiIpOworCQkJCQlzY2JfaW5kZXggPSBhaGNfaW5iKGFoYywgU0NCX1RBRyk7CisJCQkJCXNjYiA9IGFoY19sb29rdXBfc2NiKGFoYywgc2NiX2luZGV4KTsKKwkJCQkJaWYgKHNjYiAhPSBOVUxMKQorCQkJCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLAorCQkJCQkJICAgIENBTV9VTkNPUl9QQVJJVFkpOworCQkJCQlhaGNfcmVzZXRfY2hhbm5lbChhaGMsIGRldmluZm8uY2hhbm5lbCwgCisJCQkJCQkJICAvKmluaXQgcmVzZXQqL1RSVUUpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJYWhjX2luYihhaGMsIFNDU0lEQVRMKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBEQVRBX09WRVJSVU46CisJeworCQkvKgorCQkgKiBXaGVuIHRoZSBzZXF1ZW5jZXIgZGV0ZWN0cyBhbiBvdmVycnVuLCBpdAorCQkgKiBwbGFjZXMgdGhlIGNvbnRyb2xsZXIgaW4gIkJJVEJVQ0tFVCIgbW9kZQorCQkgKiBhbmQgYWxsb3dzIHRoZSB0YXJnZXQgdG8gY29tcGxldGUgaXRzIHRyYW5zZmVyLgorCQkgKiBVbmZvcnR1bmF0ZWx5LCBub25lIG9mIHRoZSBjb3VudGVycyBnZXQgdXBkYXRlZAorCQkgKiB3aGVuIHRoZSBjb250cm9sbGVyIGlzIGluIHRoaXMgbW9kZSwgc28gd2UgaGF2ZQorCQkgKiBubyB3YXkgb2Yga25vd2luZyBob3cgbGFyZ2UgdGhlIG92ZXJydW4gd2FzLgorCQkgKi8KKwkJdV9pbnQgc2NiaW5kZXggPSBhaGNfaW5iKGFoYywgU0NCX1RBRyk7CisJCXVfaW50IGxhc3RwaGFzZSA9IGFoY19pbmIoYWhjLCBMQVNUUEhBU0UpOworCQl1X2ludCBpOworCisJCXNjYiA9IGFoY19sb29rdXBfc2NiKGFoYywgc2NiaW5kZXgpOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BoYXNlczsgaSsrKSB7CisJCQlpZiAobGFzdHBoYXNlID09IGFoY19waGFzZV90YWJsZVtpXS5waGFzZSkKKwkJCQlicmVhazsKKwkJfQorCQlhaGNfcHJpbnRfcGF0aChhaGMsIHNjYik7CisJCXByaW50ZigiZGF0YSBvdmVycnVuIGRldGVjdGVkICVzLiIKKwkJICAgICAgICIgIFRhZyA9PSAweCV4LlxuIiwKKwkJICAgICAgIGFoY19waGFzZV90YWJsZVtpXS5waGFzZW1zZywKKyAgCQkgICAgICAgc2NiLT5oc2NiLT50YWcpOworCQlhaGNfcHJpbnRfcGF0aChhaGMsIHNjYik7CisJCXByaW50ZigiJXMgc2VlbiBEYXRhIFBoYXNlLiAgTGVuZ3RoID0gJWxkLiAgTnVtU0dzID0gJWQuXG4iLAorCQkgICAgICAgYWhjX2luYihhaGMsIFNFUV9GTEFHUykgJiBEUEhBU0UgPyAiSGF2ZSIgOiAiSGF2ZW4ndCIsCisJCSAgICAgICBhaGNfZ2V0X3RyYW5zZmVyX2xlbmd0aChzY2IpLCBzY2ItPnNnX2NvdW50KTsKKwkJaWYgKHNjYi0+c2dfY291bnQgPiAwKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2NiLT5zZ19jb3VudDsgaSsrKSB7CisKKwkJCQlwcmludGYoInNnWyVkXSAtIEFkZHIgMHgleCV4IDogTGVuZ3RoICVkXG4iLAorCQkJCSAgICAgICBpLAorCQkJCSAgICAgICAoYWhjX2xlMzJ0b2goc2NiLT5zZ19saXN0W2ldLmxlbikgPj4gMjQKKwkJCQkgICAgICAgICYgU0dfSElHSF9BRERSX0JJVFMpLAorCQkJCSAgICAgICBhaGNfbGUzMnRvaChzY2ItPnNnX2xpc3RbaV0uYWRkciksCisJCQkJICAgICAgIGFoY19sZTMydG9oKHNjYi0+c2dfbGlzdFtpXS5sZW4pCisJCQkJICAgICAgICYgQUhDX1NHX0xFTl9NQVNLKTsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBTZXQgdGhpcyBhbmQgaXQgd2lsbCB0YWtlIGVmZmVjdCB3aGVuIHRoZQorCQkgKiB0YXJnZXQgZG9lcyBhIGNvbW1hbmQgY29tcGxldGUuCisJCSAqLworCQlhaGNfZnJlZXplX2RldnEoYWhjLCBzY2IpOworCQlpZiAoKHNjYi0+ZmxhZ3MgJiBTQ0JfU0VOU0UpID09IDApIHsKKwkJCWFoY19zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX0RBVEFfUlVOX0VSUik7CisJCX0gZWxzZSB7CisJCQlzY2ItPmZsYWdzICY9IH5TQ0JfU0VOU0U7CisJCQlhaGNfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9BVVRPU0VOU0VfRkFJTCk7CisJCX0KKwkJYWhjX2ZyZWV6ZV9zY2Ioc2NiKTsKKworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCQkvKgorCQkJICogQ2xlYXIgdGhlIGNoYW5uZWwgaW4gY2FzZSB3ZSByZXR1cm4KKwkJCSAqIHRvIGRhdGEgcGhhc2UgbGF0ZXIuCisJCQkgKi8KKwkJCWFoY19vdXRiKGFoYywgU1hGUkNUTDAsCisJCQkJIGFoY19pbmIoYWhjLCBTWEZSQ1RMMCkgfCBDTFJTVENOVHxDTFJDSE4pOworCQkJYWhjX291dGIoYWhjLCBTWEZSQ1RMMCwKKwkJCQkgYWhjX2luYihhaGMsIFNYRlJDVEwwKSB8IENMUlNUQ05UfENMUkNITik7CisJCX0KKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDXzM5QklUX0FERFJFU1NJTkcpICE9IDApIHsKKwkJCXVfaW50IGRzY29tbWFuZDE7CisKKwkJCS8qIEVuc3VyZSBISEFERFIgaXMgMCBmb3IgZnV0dXJlIERNQSBvcGVyYXRpb25zLiAqLworCQkJZHNjb21tYW5kMSA9IGFoY19pbmIoYWhjLCBEU0NPTU1BTkQxKTsKKwkJCWFoY19vdXRiKGFoYywgRFNDT01NQU5EMSwgZHNjb21tYW5kMSB8IEhBRERMRFNFTDApOworCQkJYWhjX291dGIoYWhjLCBIQUREUiwgMCk7CisJCQlhaGNfb3V0YihhaGMsIERTQ09NTUFORDEsIGRzY29tbWFuZDEpOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIE1LTVNHX0ZBSUxFRDoKKwl7CisJCXVfaW50IHNjYmluZGV4OworCisJCXByaW50ZigiJXM6JWM6JWQ6JWQ6IEF0dGVtcHQgdG8gaXNzdWUgbWVzc2FnZSBmYWlsZWRcbiIsCisJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLmNoYW5uZWwsIGRldmluZm8udGFyZ2V0LAorCQkgICAgICAgZGV2aW5mby5sdW4pOworCQlzY2JpbmRleCA9IGFoY19pbmIoYWhjLCBTQ0JfVEFHKTsKKwkJc2NiID0gYWhjX2xvb2t1cF9zY2IoYWhjLCBzY2JpbmRleCk7CisJCWlmIChzY2IgIT0gTlVMTAorCQkgJiYgKHNjYi0+ZmxhZ3MgJiBTQ0JfUkVDT1ZFUllfU0NCKSAhPSAwKQorCQkJLyoKKwkJCSAqIEVuc3VyZSB0aGF0IHdlIGRpZG4ndCBwdXQgYSBzZWNvbmQgaW5zdGFuY2Ugb2YgdGhpcworCQkJICogU0NCIGludG8gdGhlIFFJTkZJRk8uCisJCQkgKi8KKwkJCWFoY19zZWFyY2hfcWluZmlmbyhhaGMsIFNDQl9HRVRfVEFSR0VUKGFoYywgc2NiKSwKKwkJCQkJICAgU0NCX0dFVF9DSEFOTkVMKGFoYywgc2NiKSwKKwkJCQkJICAgU0NCX0dFVF9MVU4oc2NiKSwgc2NiLT5oc2NiLT50YWcsCisJCQkJCSAgIFJPTEVfSU5JVElBVE9SLCAvKnN0YXR1cyovMCwKKwkJCQkJICAgU0VBUkNIX1JFTU9WRSk7CisJCWJyZWFrOworCX0KKwljYXNlIE5PX0ZSRUVfU0NCOgorCXsKKwkJcHJpbnRmKCIlczogTm8gZnJlZSBvciBkaXNjb25uZWN0ZWQgU0NCc1xuIiwgYWhjX25hbWUoYWhjKSk7CisJCWFoY19kdW1wX2NhcmRfc3RhdGUoYWhjKTsKKwkJcGFuaWMoImZvciBzYWZldHkiKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgU0NCX01JU01BVENIOgorCXsKKwkJdV9pbnQgc2NicHRyOworCisJCXNjYnB0ciA9IGFoY19pbmIoYWhjLCBTQ0JQVFIpOworCQlwcmludGYoIkJvZ3VzIFRBRyBhZnRlciBETUEuICBTQ0JQVFIgJWQsIHRhZyAlZCwgb3VyIHRhZyAlZFxuIiwKKwkJICAgICAgIHNjYnB0ciwgYWhjX2luYihhaGMsIEFSR18xKSwKKwkJICAgICAgIGFoYy0+c2NiX2RhdGEtPmhzY2JzW3NjYnB0cl0udGFnKTsKKwkJYWhjX2R1bXBfY2FyZF9zdGF0ZShhaGMpOworCQlwYW5pYygiZm9yIHNhZnRleSIpOworCQlicmVhazsKKwl9CisJY2FzZSBPVVRfT0ZfUkFOR0U6CisJeworCQlwcmludGYoIiVzOiBCVFQgY2FsY3VsYXRpb24gb3V0IG9mIHJhbmdlXG4iLCBhaGNfbmFtZShhaGMpKTsKKwkJcHJpbnRmKCJTQVZFRF9TQ1NJSUQgPT0gMHgleCwgU0FWRURfTFVOID09IDB4JXgsICIKKwkJICAgICAgICJBUkdfMSA9PSAweCV4IEFDQ1VNID0gMHgleFxuIiwKKwkJICAgICAgIGFoY19pbmIoYWhjLCBTQVZFRF9TQ1NJSUQpLCBhaGNfaW5iKGFoYywgU0FWRURfTFVOKSwKKwkJICAgICAgIGFoY19pbmIoYWhjLCBBUkdfMSksIGFoY19pbmIoYWhjLCBBQ0NVTSkpOworCQlwcmludGYoIlNFUV9GTEFHUyA9PSAweCV4LCBTQ0JQVFIgPT0gMHgleCwgQlRUID09IDB4JXgsICIKKwkJICAgICAgICJTSU5ERVggPT0gMHgleFxuLCBBID09IDB4JXhcbiIsCisJCSAgICAgICBhaGNfaW5iKGFoYywgU0VRX0ZMQUdTKSwgYWhjX2luYihhaGMsIFNDQlBUUiksCisJCSAgICAgICBhaGNfaW5kZXhfYnVzeV90Y2woYWhjLAorCQkJICAgIEJVSUxEX1RDTChhaGNfaW5iKGFoYywgU0FWRURfU0NTSUlEKSwKKwkJCQkgICAgICBhaGNfaW5iKGFoYywgU0FWRURfTFVOKSkpLAorCQkgICAgICAgYWhjX2luYihhaGMsIFNJTkRFWCksCisJCSAgICAgICBhaGNfaW5iKGFoYywgQUNDVU0pKTsKKwkJcHJpbnRmKCJTQ1NJSUQgPT0gMHgleCwgU0NCX1NDU0lJRCA9PSAweCV4LCBTQ0JfTFVOID09IDB4JXgsICIKKwkJICAgICAgICJTQ0JfVEFHID09IDB4JXgsIFNDQl9DT05UUk9MID09IDB4JXhcbiIsCisJCSAgICAgICBhaGNfaW5iKGFoYywgU0NTSUlEKSwgYWhjX2luYihhaGMsIFNDQl9TQ1NJSUQpLAorCQkgICAgICAgYWhjX2luYihhaGMsIFNDQl9MVU4pLCBhaGNfaW5iKGFoYywgU0NCX1RBRyksCisJCSAgICAgICBhaGNfaW5iKGFoYywgU0NCX0NPTlRST0wpKTsKKwkJcHJpbnRmKCJTQ1NJQlVTTCA9PSAweCV4LCBTQ1NJU0lHSSA9PSAweCV4XG4iLAorCQkgICAgICAgYWhjX2luYihhaGMsIFNDU0lCVVNMKSwgYWhjX2luYihhaGMsIFNDU0lTSUdJKSk7CisJCWFoY19kdW1wX2NhcmRfc3RhdGUoYWhjKTsKKwkJcGFuaWMoImZvciBzYWZldHkiKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByaW50ZigiYWhjX2ludHI6IHNlcWludCwgIgorCQkgICAgICAgImludHN0YXQgPT0gMHgleCwgc2NzaXNpZ2kgPSAweCV4XG4iLAorCQkgICAgICAgaW50c3RhdCwgYWhjX2luYihhaGMsIFNDU0lTSUdJKSk7CisJCWJyZWFrOworCX0KK3VucGF1c2U6CisJLyoKKwkgKiAgVGhlIHNlcXVlbmNlciBpcyBwYXVzZWQgaW1tZWRpYXRlbHkgb24KKwkgKiAgYSBTRVFJTlQsIHNvIHdlIHNob3VsZCByZXN0YXJ0IGl0IHdoZW4KKwkgKiAgd2UncmUgZG9uZS4KKwkgKi8KKwlhaGNfdW5wYXVzZShhaGMpOworfQorCit2b2lkCithaGNfaGFuZGxlX3Njc2lpbnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCBpbnRzdGF0KQoreworCXVfaW50CXNjYl9pbmRleDsKKwl1X2ludAlzdGF0dXMwOworCXVfaW50CXN0YXR1czsKKwlzdHJ1Y3QJc2NiICpzY2I7CisJY2hhcgljdXJfY2hhbm5lbDsKKwljaGFyCWludHJfY2hhbm5lbDsKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSAhPSAwCisJICYmICgoYWhjX2luYihhaGMsIFNCTEtDVEwpICYgU0VMQlVTQikgIT0gMCkpCisJCWN1cl9jaGFubmVsID0gJ0InOworCWVsc2UKKwkJY3VyX2NoYW5uZWwgPSAnQSc7CisJaW50cl9jaGFubmVsID0gY3VyX2NoYW5uZWw7CisKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKQorCQlzdGF0dXMwID0gYWhjX2luYihhaGMsIFNTVEFUMCkgJiBJT0VSUjsKKwllbHNlCisJCXN0YXR1czAgPSAwOworCXN0YXR1cyA9IGFoY19pbmIoYWhjLCBTU1RBVDEpICYgKFNFTFRPfFNDU0lSU1RJfEJVU0ZSRUV8U0NTSVBFUlIpOworCWlmIChzdGF0dXMgPT0gMCAmJiBzdGF0dXMwID09IDApIHsKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pICE9IDApIHsKKwkJCS8qIFRyeSB0aGUgb3RoZXIgY2hhbm5lbCAqLworCQkgCWFoY19vdXRiKGFoYywgU0JMS0NUTCwgYWhjX2luYihhaGMsIFNCTEtDVEwpIF4gU0VMQlVTQik7CisJCQlzdGF0dXMgPSBhaGNfaW5iKGFoYywgU1NUQVQxKQorCQkJICAgICAgICYgKFNFTFRPfFNDU0lSU1RJfEJVU0ZSRUV8U0NTSVBFUlIpOworCQkJaW50cl9jaGFubmVsID0gKGN1cl9jaGFubmVsID09ICdBJykgPyAnQicgOiAnQSc7CisJCX0KKwkJaWYgKHN0YXR1cyA9PSAwKSB7CisJCQlwcmludGYoIiVzOiBTcHVyaW91cyBTQ1NJIGludGVycnVwdFxuIiwgYWhjX25hbWUoYWhjKSk7CisJCQlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSU0NTSUlOVCk7CisJCQlhaGNfdW5wYXVzZShhaGMpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogTWFrZSBzdXJlIHRoZSBzZXF1ZW5jZXIgaXMgaW4gYSBzYWZlIGxvY2F0aW9uLiAqLworCWFoY19jbGVhcl9jcml0aWNhbF9zZWN0aW9uKGFoYyk7CisKKwlzY2JfaW5kZXggPSBhaGNfaW5iKGFoYywgU0NCX1RBRyk7CisJc2NiID0gYWhjX2xvb2t1cF9zY2IoYWhjLCBzY2JfaW5kZXgpOworCWlmIChzY2IgIT0gTlVMTAorCSAmJiAoYWhjX2luYihhaGMsIFNFUV9GTEFHUykgJiBOT1RfSURFTlRJRklFRCkgIT0gMCkKKwkJc2NiID0gTlVMTDsKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDAKKwkgJiYgKHN0YXR1czAgJiBJT0VSUikgIT0gMCkgeworCQlpbnQgbm93X2x2ZDsKKworCQlub3dfbHZkID0gYWhjX2luYihhaGMsIFNCTEtDVEwpICYgRU5BQjQwOworCQlwcmludGYoIiVzOiBUcmFuc2NlaXZlciBTdGF0ZSBIYXMgQ2hhbmdlZCB0byAlcyBtb2RlXG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgbm93X2x2ZCA/ICJMVkQiIDogIlNFIik7CisJCWFoY19vdXRiKGFoYywgQ0xSU0lOVDAsIENMUklPRVJSKTsKKwkJLyoKKwkJICogV2hlbiB0cmFuc2l0aW9uaW5nIHRvIFNFIG1vZGUsIHRoZSByZXNldCBsaW5lCisJCSAqIGdsaXRjaGVzLCB0cmlnZ2VyaW5nIGFuIGFyYml0cmF0aW9uIGJ1ZyBpbiBzb21lCisJCSAqIFVsdHJhMiBjb250cm9sbGVycy4gIFRoaXMgYnVnIGlzIGNsZWFyZWQgd2hlbiB3ZQorCQkgKiBhc3NlcnQgdGhlIHJlc2V0IGxpbmUuICBTaW5jZSBhIHJlc2V0IGdsaXRjaCBoYXMKKwkJICogYWxyZWFkeSBvY2N1cnJlZCB3aXRoIHRoaXMgdHJhbnNpdGlvbiBhbmQgYQorCQkgKiB0cmFuc2NlaXZlciBzdGF0ZSBjaGFuZ2UgaXMgaGFuZGxlZCBqdXN0IGxpa2UKKwkJICogYSBidXMgcmVzZXQgYW55d2F5LCBhc3NlcnRpbmcgdGhlIHJlc2V0IGxpbmUKKwkJICogb3Vyc2VsdmVzIGlzIHNhZmUuCisJCSAqLworCQlhaGNfcmVzZXRfY2hhbm5lbChhaGMsIGludHJfY2hhbm5lbCwKKwkJCQkgLypJbml0aWF0ZSBSZXNldCovbm93X2x2ZCA9PSAwKTsKKwl9IGVsc2UgaWYgKChzdGF0dXMgJiBTQ1NJUlNUSSkgIT0gMCkgeworCQlwcmludGYoIiVzOiBTb21lb25lIHJlc2V0IGNoYW5uZWwgJWNcbiIsCisJCQlhaGNfbmFtZShhaGMpLCBpbnRyX2NoYW5uZWwpOworCQlpZiAoaW50cl9jaGFubmVsICE9IGN1cl9jaGFubmVsKQorCQkgCWFoY19vdXRiKGFoYywgU0JMS0NUTCwgYWhjX2luYihhaGMsIFNCTEtDVEwpIF4gU0VMQlVTQik7CisJCWFoY19yZXNldF9jaGFubmVsKGFoYywgaW50cl9jaGFubmVsLCAvKkluaXRpYXRlIFJlc2V0Ki9GQUxTRSk7CisJfSBlbHNlIGlmICgoc3RhdHVzICYgU0NTSVBFUlIpICE9IDApIHsKKwkJLyoKKwkJICogRGV0ZXJtaW5lIHRoZSBidXMgcGhhc2UgYW5kIHF1ZXVlIGFuIGFwcHJvcHJpYXRlIG1lc3NhZ2UuCisJCSAqIFNDU0lQRVJSIGlzIGxhdGNoZWQgdHJ1ZSBhcyBzb29uIGFzIGEgcGFyaXR5IGVycm9yCisJCSAqIG9jY3Vycy4gIElmIHRoZSBzZXF1ZW5jZXIgYWNrZWQgdGhlIHRyYW5zZmVyIHRoYXQKKwkJICogY2F1c2VkIHRoZSBwYXJpdHkgZXJyb3IgYW5kIHRoZSBjdXJyZW50bHkgcHJlc2VudGVkCisJCSAqIHRyYW5zZmVyIG9uIHRoZSBidXMgaGFzIGNvcnJlY3QgcGFyaXR5LCBTQ1NJUEVSUiB3aWxsCisJCSAqIGJlIGNsZWFyZWQgYnkgQ0xSU0NTSVBFUlIuICBVc2UgdGhpcyB0byBkZXRlcm1pbmUgaWYKKwkJICogd2Ugc2hvdWxkIGxvb2sgYXQgdGhlIGxhc3QgcGhhc2UgdGhlIHNlcXVlbmNlciByZWNvcmRlZCwKKwkJICogb3IgdGhlIGN1cnJlbnQgcGhhc2UgcHJlc2VudGVkIG9uIHRoZSBidXMuCisJCSAqLworCQlzdHJ1Y3QJYWhjX2RldmluZm8gZGV2aW5mbzsKKwkJdV9pbnQJbWVzZ19vdXQ7CisJCXVfaW50CWN1cnBoYXNlOworCQl1X2ludAllcnJvcnBoYXNlOworCQl1X2ludAlsYXN0cGhhc2U7CisJCXVfaW50CXNjc2lyYXRlOworCQl1X2ludAlpOworCQl1X2ludAlzc3RhdDI7CisJCWludAlzaWxlbnQ7CisKKwkJbGFzdHBoYXNlID0gYWhjX2luYihhaGMsIExBU1RQSEFTRSk7CisJCWN1cnBoYXNlID0gYWhjX2luYihhaGMsIFNDU0lTSUdJKSAmIFBIQVNFX01BU0s7CisJCXNzdGF0MiA9IGFoY19pbmIoYWhjLCBTU1RBVDIpOworCQlhaGNfb3V0YihhaGMsIENMUlNJTlQxLCBDTFJTQ1NJUEVSUik7CisJCS8qCisJCSAqIEZvciBhbGwgcGhhc2VzIHNhdmUgREFUQSwgdGhlIHNlcXVlbmNlciB3b24ndAorCQkgKiBhdXRvbWF0aWNhbGx5IGFjayBhIGJ5dGUgdGhhdCBoYXMgYSBwYXJpdHkgZXJyb3IKKwkJICogaW4gaXQuICBTbyB0aGUgb25seSB3YXkgdGhhdCB0aGUgY3VycmVudCBwaGFzZQorCQkgKiBjb3VsZCBiZSAnZGF0YS1pbicgaXMgaWYgdGhlIHBhcml0eSBlcnJvciBpcyBmb3IKKwkJICogYW4gYWxyZWFkeSBhY2tlZCBieXRlIGluIHRoZSBkYXRhIHBoYXNlLiAgRHVyaW5nCisJCSAqIHN5bmNocm9ub3VzIGRhdGEtaW4gdHJhbnNmZXJzLCB3ZSBtYXkgYWN0dWFsbHkKKwkJICogYWNrIGJ5dGVzIGJlZm9yZSBsYXRjaGluZyB0aGUgY3VycmVudCBwaGFzZSBpbgorCQkgKiBMQVNUUEhBU0UsIGxlYWRpbmcgdG8gdGhlIGRpc2NyZXBhbmN5IGJldHdlZW4KKwkJICogY3VycGhhc2UgYW5kIGxhc3RwaGFzZS4KKwkJICovCisJCWlmICgoYWhjX2luYihhaGMsIFNTVEFUMSkgJiBTQ1NJUEVSUikgIT0gMAorCQkgfHwgY3VycGhhc2UgPT0gUF9EQVRBSU4gfHwgY3VycGhhc2UgPT0gUF9EQVRBSU5fRFQpCisJCQllcnJvcnBoYXNlID0gY3VycGhhc2U7CisJCWVsc2UKKwkJCWVycm9ycGhhc2UgPSBsYXN0cGhhc2U7CisKKwkJZm9yIChpID0gMDsgaSA8IG51bV9waGFzZXM7IGkrKykgeworCQkJaWYgKGVycm9ycGhhc2UgPT0gYWhjX3BoYXNlX3RhYmxlW2ldLnBoYXNlKQorCQkJCWJyZWFrOworCQl9CisJCW1lc2dfb3V0ID0gYWhjX3BoYXNlX3RhYmxlW2ldLm1lc2dfb3V0OworCQlzaWxlbnQgPSBGQUxTRTsKKwkJaWYgKHNjYiAhPSBOVUxMKSB7CisJCQlpZiAoU0NCX0lTX1NJTEVOVChzY2IpKQorCQkJCXNpbGVudCA9IFRSVUU7CisJCQllbHNlCisJCQkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOworCQkJc2NiLT5mbGFncyB8PSBTQ0JfVFJBTlNNSVNTSU9OX0VSUk9SOworCQl9IGVsc2UKKwkJCXByaW50ZigiJXM6JWM6JWQ6ICIsIGFoY19uYW1lKGFoYyksIGludHJfY2hhbm5lbCwKKwkJCSAgICAgICBTQ1NJSURfVEFSR0VUKGFoYywgYWhjX2luYihhaGMsIFNBVkVEX1NDU0lJRCkpKTsKKwkJc2NzaXJhdGUgPSBhaGNfaW5iKGFoYywgU0NTSVJBVEUpOworCQlpZiAoc2lsZW50ID09IEZBTFNFKSB7CisJCQlwcmludGYoInBhcml0eSBlcnJvciBkZXRlY3RlZCAlcy4gIgorCQkJICAgICAgICJTRVFBRERSKDB4JXgpIFNDU0lSQVRFKDB4JXgpXG4iLAorCQkJICAgICAgIGFoY19waGFzZV90YWJsZVtpXS5waGFzZW1zZywKKwkJCSAgICAgICBhaGNfaW53KGFoYywgU0VRQUREUjApLAorCQkJICAgICAgIHNjc2lyYXRlKTsKKwkJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgIT0gMCkgeworCQkJCWlmICgoc3N0YXQyICYgQ1JDVkFMRVJSKSAhPSAwKQorCQkJCQlwcmludGYoIlx0Q1JDIFZhbHVlIE1pc21hdGNoXG4iKTsKKwkJCQlpZiAoKHNzdGF0MiAmIENSQ0VOREVSUikgIT0gMCkKKwkJCQkJcHJpbnRmKCJcdE5vIHRlcm1pbmFsIENSQyBwYWNrZXQgIgorCQkJCQkgICAgICAgInJlY2V2aWVkXG4iKTsKKwkJCQlpZiAoKHNzdGF0MiAmIENSQ1JFUUVSUikgIT0gMCkKKwkJCQkJcHJpbnRmKCJcdElsbGVnYWwgQ1JDIHBhY2tldCAiCisJCQkJCSAgICAgICAicmVxdWVzdFxuIik7CisJCQkJaWYgKChzc3RhdDIgJiBEVUFMX0VER0VfRVJSKSAhPSAwKQorCQkJCQlwcmludGYoIlx0VW5leHBlY3RlZCAlc0RUIERhdGEgUGhhc2VcbiIsCisJCQkJCSAgICAgICAoc2NzaXJhdGUgJiBTSU5HTEVfRURHRSkKKwkJCQkJICAgICA/ICIiIDogIm5vbi0iKTsKKwkJCX0KKwkJfQorCisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgIT0gMAorCQkgJiYgKHNzdGF0MiAmIERVQUxfRURHRV9FUlIpICE9IDApIHsKKwkJCS8qCisJCQkgKiBUaGlzIGVycm9yIGFwcGxpZXMgcmVnYXJkbGVzcyBvZgorCQkJICogZGF0YSBkaXJlY3Rpb24sIHNvIGlnbm9yZSB0aGUgdmFsdWUKKwkJCSAqIGluIHRoZSBwaGFzZSB0YWJsZS4KKwkJCSAqLworCQkJbWVzZ19vdXQgPSBNU0dfSU5JVElBVE9SX0RFVF9FUlI7CisJCX0KKworCQkvKgorCQkgKiBXZSd2ZSBzZXQgdGhlIGhhcmR3YXJlIHRvIGFzc2VydCBBVE4gaWYgd2UgICAKKwkJICogZ2V0IGEgcGFyaXR5IGVycm9yIG9uICJpbiIgcGhhc2VzLCBzbyBhbGwgd2UgIAorCQkgKiBuZWVkIHRvIGRvIGlzIHN0dWZmIHRoZSBtZXNzYWdlIGJ1ZmZlciB3aXRoCisJCSAqIHRoZSBhcHByb3ByaWF0ZSBtZXNzYWdlLiAgIkluIiBwaGFzZXMgaGF2ZSBzZXQKKwkJICogbWVzZ19vdXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gTVNHX05PUC4KKwkJICovCisJCWlmIChtZXNnX291dCAhPSBNU0dfTk9PUCkgeworCQkJaWYgKGFoYy0+bXNnX3R5cGUgIT0gTVNHX1RZUEVfTk9ORSkKKwkJCQlhaGMtPnNlbmRfbXNnX3BlcnJvciA9IFRSVUU7CisJCQllbHNlCisJCQkJYWhjX291dGIoYWhjLCBNU0dfT1VULCBtZXNnX291dCk7CisJCX0KKwkJLyoKKwkJICogRm9yY2UgYSByZW5lZ290aWF0aW9uIHdpdGggdGhpcyB0YXJnZXQganVzdCBpbgorCQkgKiBjYXNlIHdlIGFyZSBvdXQgb2Ygc3luYyBmb3Igc29tZSBleHRlcm5hbCByZWFzb24KKwkJICogdW5rbm93biAob3IgdW5yZXBvcnRlZCkgYnkgdGhlIHRhcmdldC4KKwkJICovCisJCWFoY19mZXRjaF9kZXZpbmZvKGFoYywgJmRldmluZm8pOworCQlhaGNfZm9yY2VfcmVuZWdvdGlhdGlvbihhaGMsICZkZXZpbmZvKTsKKworCQlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSU0NTSUlOVCk7CisJCWFoY191bnBhdXNlKGFoYyk7CisJfSBlbHNlIGlmICgoc3RhdHVzICYgU0VMVE8pICE9IDApIHsKKwkJdV9pbnQJc2NicHRyOworCisJCS8qIFN0b3AgdGhlIHNlbGVjdGlvbiAqLworCQlhaGNfb3V0YihhaGMsIFNDU0lTRVEsIDApOworCisJCS8qIE5vIG1vcmUgcGVuZGluZyBtZXNzYWdlcyAqLworCQlhaGNfY2xlYXJfbXNnX3N0YXRlKGFoYyk7CisKKwkJLyogQ2xlYXIgaW50ZXJydXB0IHN0YXRlICovCisJCWFoY19vdXRiKGFoYywgU0lNT0RFMSwgYWhjX2luYihhaGMsIFNJTU9ERTEpICYgfkVOQlVTRlJFRSk7CisJCWFoY19vdXRiKGFoYywgQ0xSU0lOVDEsIENMUlNFTFRJTUVPfENMUkJVU0ZSRUV8Q0xSU0NTSVBFUlIpOworCisJCS8qCisJCSAqIEFsdGhvdWdoIHRoZSBkcml2ZXIgZG9lcyBub3QgY2FyZSBhYm91dCB0aGUKKwkJICogJ1NlbGVjdGlvbiBpbiBQcm9ncmVzcycgc3RhdHVzIGJpdCwgdGhlIGJ1c3kKKwkJICogTEVEIGRvZXMuICBTRUxJTkdPIGlzIG9ubHkgY2xlYXJlZCBieSBhIHN1Y2Vzc2Z1bGwKKwkJICogc2VsZWN0aW9uLCBzbyB3ZSBtdXN0IG1hbnVhbGx5IGNsZWFyIGl0IHRvIGluc3VyZQorCQkgKiB0aGUgTEVEIHR1cm5zIG9mZiBqdXN0IGluY2FzZSBubyBmdXR1cmUgc3VjY2Vzc2Z1bAorCQkgKiBzZWxlY3Rpb25zIG9jY3VyIChlLmcuIG5vIGRldmljZXMgb24gdGhlIGJ1cykuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIENMUlNJTlQwLCBDTFJTRUxJTkdPKTsKKworCQlzY2JwdHIgPSBhaGNfaW5iKGFoYywgV0FJVElOR19TQ0JIKTsKKwkJYWhjX291dGIoYWhjLCBTQ0JQVFIsIHNjYnB0cik7CisJCXNjYl9pbmRleCA9IGFoY19pbmIoYWhjLCBTQ0JfVEFHKTsKKworCQlzY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIHNjYl9pbmRleCk7CisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJcHJpbnRmKCIlczogYWhjX2ludHIgLSByZWZlcmVuY2VkIHNjYiBub3QgIgorCQkJICAgICAgICJ2YWxpZCBkdXJpbmcgU0VMVE8gc2NiKCVkLCAlZClcbiIsCisJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgc2NicHRyLCBzY2JfaW5kZXgpOworCQkJYWhjX2R1bXBfY2FyZF9zdGF0ZShhaGMpOworCQl9IGVsc2UgeworCQkJc3RydWN0IGFoY19kZXZpbmZvIGRldmluZm87CisjaWZkZWYgQUhDX0RFQlVHCisJCQlpZiAoKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX1NFTFRPKSAhPSAwKSB7CisJCQkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOworCQkJCXByaW50ZigiU2F3IFNlbGVjdGlvbiBUaW1lb3V0IGZvciBTQ0IgMHgleFxuIiwKKwkJCQkgICAgICAgc2NiX2luZGV4KTsKKwkJCX0KKyNlbmRpZgorCQkJLyoKKwkJCSAqIEZvcmNlIGEgcmVuZWdvdGlhdGlvbiB3aXRoIHRoaXMgdGFyZ2V0IGp1c3QgaW4KKwkJCSAqIGNhc2UgdGhlIGNhYmxlIHdhcyBwdWxsZWQgYW5kIHdpbGwgbGF0ZXIgYmUKKwkJCSAqIHJlLWF0dGFjaGVkLiAgVGhlIHRhcmdldCBtYXkgZm9yZ2V0IGl0cyBuZWdvdGlhdGlvbgorCQkJICogc2V0dGluZ3Mgd2l0aCB1cyBzaG91bGQgaXQgYXR0ZW1wdCB0byByZXNlbGVjdAorCQkJICogZHVyaW5nIHRoZSBpbnRlcnJ1cHRpb24uICBUaGUgdGFyZ2V0IHdpbGwgbm90IGlzc3VlCisJCQkgKiBhIHVuaXQgYXR0ZW50aW9uIGluIHRoaXMgY2FzZSwgc28gd2UgbXVzdCBhbHdheXMKKwkJCSAqIHJlbmVnb3RpYXRlLgorCQkJICovCisJCQlhaGNfc2NiX2RldmluZm8oYWhjLCAmZGV2aW5mbywgc2NiKTsKKwkJCWFoY19mb3JjZV9yZW5lZ290aWF0aW9uKGFoYywgJmRldmluZm8pOworCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fU0VMX1RJTUVPVVQpOworCQkJYWhjX2ZyZWV6ZV9kZXZxKGFoYywgc2NiKTsKKwkJfQorCQlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSU0NTSUlOVCk7CisJCWFoY19yZXN0YXJ0KGFoYyk7CisJfSBlbHNlIGlmICgoc3RhdHVzICYgQlVTRlJFRSkgIT0gMAorCQkmJiAoYWhjX2luYihhaGMsIFNJTU9ERTEpICYgRU5CVVNGUkVFKSAhPSAwKSB7CisJCXN0cnVjdAlhaGNfZGV2aW5mbyBkZXZpbmZvOworCQl1X2ludAlsYXN0cGhhc2U7CisJCXVfaW50CXNhdmVkX3Njc2lpZDsKKwkJdV9pbnQJc2F2ZWRfbHVuOworCQl1X2ludAl0YXJnZXQ7CisJCXVfaW50CWluaXRpYXRvcl9yb2xlX2lkOworCQljaGFyCWNoYW5uZWw7CisJCWludAlwcmludGVycm9yOworCisJCS8qCisJCSAqIENsZWFyIG91ciBzZWxlY3Rpb24gaGFyZHdhcmUgYXMgc29vbiBhcyBwb3NzaWJsZS4KKwkJICogV2UgbWF5IGhhdmUgYW4gZW50cnkgaW4gdGhlIHdhaXRpbmcgUSBmb3IgdGhpcyB0YXJnZXQsCisJCSAqIHRoYXQgaXMgYWZmZWN0ZWQgYnkgdGhpcyBidXNmcmVlIGFuZCB3ZSBkb24ndCB3YW50IHRvCisJCSAqIGdvIGFib3V0IHNlbGVjdGluZyB0aGUgdGFyZ2V0IHdoaWxlIHdlIGhhbmRsZSB0aGUgZXZlbnQuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIFNDU0lTRVEsCisJCQkgYWhjX2luYihhaGMsIFNDU0lTRVEpICYgKEVOU0VMSXxFTlJTRUxJfEVOQVVUT0FUTlApKTsKKworCQkvKgorCQkgKiBEaXNhYmxlIGJ1c2ZyZWUgaW50ZXJydXB0cyBhbmQgY2xlYXIgdGhlIGJ1c2ZyZWUKKwkJICogaW50ZXJydXB0IHN0YXR1cy4gIFdlIGRvIHRoaXMgaGVyZSBzbyB0aGF0IHNldmVyYWwKKwkJICogYnVzIHRyYW5zYWN0aW9ucyBvY2N1ciBwcmlvciB0byBjbGVhcmluZyB0aGUgU0NTSUlOVAorCQkgKiBsYXRjaC4gIEl0IGNhbiB0YWtlIGEgYml0IGZvciB0aGUgY2xlYXJpbmcgdG8gdGFrZSBlZmZlY3QuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIFNJTU9ERTEsIGFoY19pbmIoYWhjLCBTSU1PREUxKSAmIH5FTkJVU0ZSRUUpOworCQlhaGNfb3V0YihhaGMsIENMUlNJTlQxLCBDTFJCVVNGUkVFfENMUlNDU0lQRVJSKTsKKworCQkvKgorCQkgKiBMb29rIGF0IHdoYXQgcGhhc2Ugd2Ugd2VyZSBsYXN0IGluLgorCQkgKiBJZiBpdHMgbWVzc2FnZSBvdXQsIGNoYW5jZXMgYXJlIHByZXR0eSBnb29kCisJCSAqIHRoYXQgdGhlIGJ1c2ZyZWUgd2FzIGluIHJlc3BvbnNlIHRvIG9uZSBvZgorCQkgKiBvdXIgYWJvcnQgcmVxdWVzdHMuCisJCSAqLworCQlsYXN0cGhhc2UgPSBhaGNfaW5iKGFoYywgTEFTVFBIQVNFKTsKKwkJc2F2ZWRfc2NzaWlkID0gYWhjX2luYihhaGMsIFNBVkVEX1NDU0lJRCk7CisJCXNhdmVkX2x1biA9IGFoY19pbmIoYWhjLCBTQVZFRF9MVU4pOworCQl0YXJnZXQgPSBTQ1NJSURfVEFSR0VUKGFoYywgc2F2ZWRfc2NzaWlkKTsKKwkJaW5pdGlhdG9yX3JvbGVfaWQgPSBTQ1NJSURfT1VSX0lEKHNhdmVkX3Njc2lpZCk7CisJCWNoYW5uZWwgPSBTQ1NJSURfQ0hBTk5FTChhaGMsIHNhdmVkX3Njc2lpZCk7CisJCWFoY19jb21waWxlX2RldmluZm8oJmRldmluZm8sIGluaXRpYXRvcl9yb2xlX2lkLAorCQkJCSAgICB0YXJnZXQsIHNhdmVkX2x1biwgY2hhbm5lbCwgUk9MRV9JTklUSUFUT1IpOworCQlwcmludGVycm9yID0gMTsKKworCQlpZiAobGFzdHBoYXNlID09IFBfTUVTR09VVCkgeworCQkJdV9pbnQgdGFnOworCisJCQl0YWcgPSBTQ0JfTElTVF9OVUxMOworCQkJaWYgKGFoY19zZW50X21zZyhhaGMsIEFIQ01TR18xQiwgTVNHX0FCT1JUX1RBRywgVFJVRSkKKwkJCSB8fCBhaGNfc2VudF9tc2coYWhjLCBBSENNU0dfMUIsIE1TR19BQk9SVCwgVFJVRSkpIHsKKwkJCQlpZiAoYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4IC0gMV0KKwkJCQkgPT0gTVNHX0FCT1JUX1RBRykKKwkJCQkJdGFnID0gc2NiLT5oc2NiLT50YWc7CisJCQkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOworCQkJCXByaW50ZigiU0NCICVkIC0gQWJvcnQlcyBDb21wbGV0ZWQuXG4iLAorCQkJCSAgICAgICBzY2ItPmhzY2ItPnRhZywgdGFnID09IFNDQl9MSVNUX05VTEwgPworCQkJCSAgICAgICAiIiA6ICIgVGFnIik7CisJCQkJYWhjX2Fib3J0X3NjYnMoYWhjLCB0YXJnZXQsIGNoYW5uZWwsCisJCQkJCSAgICAgICBzYXZlZF9sdW4sIHRhZywKKwkJCQkJICAgICAgIFJPTEVfSU5JVElBVE9SLAorCQkJCQkgICAgICAgQ0FNX1JFUV9BQk9SVEVEKTsKKwkJCQlwcmludGVycm9yID0gMDsKKwkJCX0gZWxzZSBpZiAoYWhjX3NlbnRfbXNnKGFoYywgQUhDTVNHXzFCLAorCQkJCQkJTVNHX0JVU19ERVZfUkVTRVQsIFRSVUUpKSB7CisjaWZkZWYgX19GcmVlQlNEX18KKwkJCQkvKgorCQkJCSAqIERvbid0IG1hcmsgdGhlIHVzZXIncyByZXF1ZXN0IGZvciB0aGlzIEJEUgorCQkJCSAqIGFzIGNvbXBsZXRpbmcgd2l0aCBDQU1fQkRSX1NFTlQuICBDQU0zCisJCQkJICogc3BlY2lmaWVzIENBTV9SRVFfQ01QLgorCQkJCSAqLworCQkJCWlmIChzY2IgIT0gTlVMTAorCQkJCSAmJiBzY2ItPmlvX2N0eC0+Y2NiX2guZnVuY19jb2RlPT0gWFBUX1JFU0VUX0RFVgorCQkJCSAmJiBhaGNfbWF0Y2hfc2NiKGFoYywgc2NiLCB0YXJnZXQsIGNoYW5uZWwsCisJCQkJCQkgIENBTV9MVU5fV0lMRENBUkQsCisJCQkJCQkgIFNDQl9MSVNUX05VTEwsCisJCQkJCQkgIFJPTEVfSU5JVElBVE9SKSkgeworCQkJCQlhaGNfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9SRVFfQ01QKTsKKwkJCQl9CisjZW5kaWYKKwkJCQlhaGNfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLAorCQkJCQkJICAgIGluaXRpYXRvcl9yb2xlX2lkLAorCQkJCQkJICAgIHRhcmdldCwKKwkJCQkJCSAgICBDQU1fTFVOX1dJTERDQVJELAorCQkJCQkJICAgIGNoYW5uZWwsCisJCQkJCQkgICAgUk9MRV9JTklUSUFUT1IpOworCQkJCWFoY19oYW5kbGVfZGV2cmVzZXQoYWhjLCAmZGV2aW5mbywKKwkJCQkJCSAgICBDQU1fQkRSX1NFTlQsCisJCQkJCQkgICAgIkJ1cyBEZXZpY2UgUmVzZXQiLAorCQkJCQkJICAgIC8qdmVyYm9zZV9sZXZlbCovMCk7CisJCQkJcHJpbnRlcnJvciA9IDA7CisJCQl9IGVsc2UgaWYgKGFoY19zZW50X21zZyhhaGMsIEFIQ01TR19FWFQsCisJCQkJCQlNU0dfRVhUX1BQUiwgRkFMU0UpKSB7CisJCQkJc3RydWN0IGFoY19pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQkJCXN0cnVjdCBhaGNfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisKKwkJCQkvKgorCQkJCSAqIFBQUiBSZWplY3RlZC4gIFRyeSBub24tcHByIG5lZ290aWF0aW9uCisJCQkJICogYW5kIHJldHJ5IGNvbW1hbmQuCisJCQkJICovCisJCQkJdGluZm8gPSBhaGNfZmV0Y2hfdHJhbnNpbmZvKGFoYywKKwkJCQkJCQkgICAgZGV2aW5mby5jaGFubmVsLAorCQkJCQkJCSAgICBkZXZpbmZvLm91cl9zY3NpaWQsCisJCQkJCQkJICAgIGRldmluZm8udGFyZ2V0LAorCQkJCQkJCSAgICAmdHN0YXRlKTsKKwkJCQl0aW5mby0+Y3Vyci50cmFuc3BvcnRfdmVyc2lvbiA9IDI7CisJCQkJdGluZm8tPmdvYWwudHJhbnNwb3J0X3ZlcnNpb24gPSAyOworCQkJCXRpbmZvLT5nb2FsLnBwcl9vcHRpb25zID0gMDsKKwkJCQlhaGNfcWluZmlmb19yZXF1ZXVlX3RhaWwoYWhjLCBzY2IpOworCQkJCXByaW50ZXJyb3IgPSAwOworCQkJfSBlbHNlIGlmIChhaGNfc2VudF9tc2coYWhjLCBBSENNU0dfRVhULAorCQkJCQkJTVNHX0VYVF9XRFRSLCBGQUxTRSkpIHsKKwkJCQkvKgorCQkJCSAqIE5lZ290aWF0aW9uIFJlamVjdGVkLiAgR28tbmFycm93IGFuZAorCQkJCSAqIHJldHJ5IGNvbW1hbmQuCisJCQkJICovCisJCQkJYWhjX3NldF93aWR0aChhaGMsICZkZXZpbmZvLAorCQkJCQkgICAgICBNU0dfRVhUX1dEVFJfQlVTXzhfQklULAorCQkJCQkgICAgICBBSENfVFJBTlNfQ1VSfEFIQ19UUkFOU19HT0FMLAorCQkJCQkgICAgICAvKnBhdXNlZCovVFJVRSk7CisJCQkJYWhjX3FpbmZpZm9fcmVxdWV1ZV90YWlsKGFoYywgc2NiKTsKKwkJCQlwcmludGVycm9yID0gMDsKKwkJCX0gZWxzZSBpZiAoYWhjX3NlbnRfbXNnKGFoYywgQUhDTVNHX0VYVCwKKwkJCQkJCU1TR19FWFRfU0RUUiwgRkFMU0UpKSB7CisJCQkJLyoKKwkJCQkgKiBOZWdvdGlhdGlvbiBSZWplY3RlZC4gIEdvLWFzeW5jIGFuZAorCQkJCSAqIHJldHJ5IGNvbW1hbmQuCisJCQkJICovCisJCQkJYWhjX3NldF9zeW5jcmF0ZShhaGMsICZkZXZpbmZvLAorCQkJCQkJLypzeW5jcmF0ZSovTlVMTCwKKwkJCQkJCS8qcGVyaW9kKi8wLCAvKm9mZnNldCovMCwKKwkJCQkJCS8qcHByX29wdGlvbnMqLzAsCisJCQkJCQlBSENfVFJBTlNfQ1VSfEFIQ19UUkFOU19HT0FMLAorCQkJCQkJLypwYXVzZWQqL1RSVUUpOworCQkJCWFoY19xaW5maWZvX3JlcXVldWVfdGFpbChhaGMsIHNjYik7CisJCQkJcHJpbnRlcnJvciA9IDA7CisJCQl9CisJCX0KKwkJaWYgKHByaW50ZXJyb3IgIT0gMCkgeworCQkJdV9pbnQgaTsKKworCQkJaWYgKHNjYiAhPSBOVUxMKSB7CisJCQkJdV9pbnQgdGFnOworCisJCQkJaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiBUQUdfRU5CKSAhPSAwKQorCQkJCQl0YWcgPSBzY2ItPmhzY2ItPnRhZzsKKwkJCQllbHNlCisJCQkJCXRhZyA9IFNDQl9MSVNUX05VTEw7CisJCQkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOworCQkJCWFoY19hYm9ydF9zY2JzKGFoYywgdGFyZ2V0LCBjaGFubmVsLAorCQkJCQkgICAgICAgU0NCX0dFVF9MVU4oc2NiKSwgdGFnLAorCQkJCQkgICAgICAgUk9MRV9JTklUSUFUT1IsCisJCQkJCSAgICAgICBDQU1fVU5FWFBfQlVTRlJFRSk7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogV2UgaGFkIG5vdCBmdWxseSBpZGVudGlmaWVkIHRoaXMgY29ubmVjdGlvbiwKKwkJCQkgKiBzbyB3ZSBjYW5ub3QgYWJvcnQgYW55dGhpbmcuCisJCQkJICovCisJCQkJcHJpbnRmKCIlczogIiwgYWhjX25hbWUoYWhjKSk7CisJCQl9CisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BoYXNlczsgaSsrKSB7CisJCQkJaWYgKGxhc3RwaGFzZSA9PSBhaGNfcGhhc2VfdGFibGVbaV0ucGhhc2UpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGxhc3RwaGFzZSAhPSBQX0JVU0ZSRUUpIHsKKwkJCQkvKgorCQkJCSAqIFJlbmVnb3RpYXRlIHdpdGggdGhpcyBkZXZpY2UgYXQgdGhlCisJCQkJICogbmV4dCBvcG9ydHVuaXR5IGp1c3QgaW4gY2FzZSB0aGlzIGJ1c2ZyZWUKKwkJCQkgKiBpcyBkdWUgdG8gYSBuZWdvdGlhdGlvbiBtaXNtYXRjaCB3aXRoIHRoZQorCQkJCSAqIGRldmljZS4KKwkJCQkgKi8KKwkJCQlhaGNfZm9yY2VfcmVuZWdvdGlhdGlvbihhaGMsICZkZXZpbmZvKTsKKwkJCX0KKwkJCXByaW50ZigiVW5leHBlY3RlZCBidXNmcmVlICVzXG4iCisJCQkgICAgICAgIlNFUUFERFIgPT0gMHgleFxuIiwKKwkJCSAgICAgICBhaGNfcGhhc2VfdGFibGVbaV0ucGhhc2Vtc2csCisJCQkgICAgICAgYWhjX2luYihhaGMsIFNFUUFERFIwKQorCQkJCXwgKGFoY19pbmIoYWhjLCBTRVFBRERSMSkgPDwgOCkpOworCQl9CisJCWFoY19vdXRiKGFoYywgQ0xSSU5ULCBDTFJTQ1NJSU5UKTsKKwkJYWhjX3Jlc3RhcnQoYWhjKTsKKwl9IGVsc2UgeworCQlwcmludGYoIiVzOiBNaXNzaW5nIGNhc2UgaW4gYWhjX2hhbmRsZV9zY3NpaW50LiBzdGF0dXMgPSAleFxuIiwKKwkJICAgICAgIGFoY19uYW1lKGFoYyksIHN0YXR1cyk7CisJCWFoY19vdXRiKGFoYywgQ0xSSU5ULCBDTFJTQ1NJSU5UKTsKKwl9Cit9CisKKy8qCisgKiBGb3JjZSByZW5lZ290aWF0aW9uIHRvIG9jY3VyIHRoZSBuZXh0IHRpbWUgd2UgaW5pdGlhdGUKKyAqIGEgY29tbWFuZCB0byB0aGUgY3VycmVudCBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkCithaGNfZm9yY2VfcmVuZWdvdGlhdGlvbihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbykKK3sKKwlzdHJ1Y3QJYWhjX2luaXRpYXRvcl90aW5mbyAqdGFyZ19pbmZvOworCXN0cnVjdAlhaGNfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisKKwl0YXJnX2luZm8gPSBhaGNfZmV0Y2hfdHJhbnNpbmZvKGFoYywKKwkJCQkJZGV2aW5mby0+Y2hhbm5lbCwKKwkJCQkJZGV2aW5mby0+b3VyX3Njc2lpZCwKKwkJCQkJZGV2aW5mby0+dGFyZ2V0LAorCQkJCQkmdHN0YXRlKTsKKwlhaGNfdXBkYXRlX25lZ19yZXF1ZXN0KGFoYywgZGV2aW5mbywgdHN0YXRlLAorCQkJICAgICAgIHRhcmdfaW5mbywgQUhDX05FR19JRl9OT05fQVNZTkMpOworfQorCisjZGVmaW5lIEFIQ19NQVhfU1RFUFMgMjAwMAordm9pZAorYWhjX2NsZWFyX2NyaXRpY2FsX3NlY3Rpb24oc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWludAlzdGVwcGluZzsKKwlpbnQJc3RlcHM7CisJdV9pbnQJc2ltb2RlMDsKKwl1X2ludAlzaW1vZGUxOworCisJaWYgKGFoYy0+bnVtX2NyaXRpY2FsX3NlY3Rpb25zID09IDApCisJCXJldHVybjsKKworCXN0ZXBwaW5nID0gRkFMU0U7CisJc3RlcHMgPSAwOworCXNpbW9kZTAgPSAwOworCXNpbW9kZTEgPSAwOworCWZvciAoOzspIHsKKwkJc3RydWN0CWNzICpjczsKKwkJdV9pbnQJc2VxYWRkcjsKKwkJdV9pbnQJaTsKKworCQlzZXFhZGRyID0gYWhjX2luYihhaGMsIFNFUUFERFIwKQorCQkJfCAoYWhjX2luYihhaGMsIFNFUUFERFIxKSA8PCA4KTsKKworCQkvKgorCQkgKiBTZXFhZGRyIHJlcHJlc2VudHMgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gdG8gZXhlY3V0ZSwgCisJCSAqIHNvIHdlIGFyZSByZWFsbHkgZXhlY3V0aW5nIHRoZSBpbnN0cnVjdGlvbiBqdXN0CisJCSAqIGJlZm9yZSBpdC4KKwkJICovCisJCWlmIChzZXFhZGRyICE9IDApCisJCQlzZXFhZGRyIC09IDE7CisJCWNzID0gYWhjLT5jcml0aWNhbF9zZWN0aW9uczsKKwkJZm9yIChpID0gMDsgaSA8IGFoYy0+bnVtX2NyaXRpY2FsX3NlY3Rpb25zOyBpKyssIGNzKyspIHsKKwkJCQorCQkJaWYgKGNzLT5iZWdpbiA8IHNlcWFkZHIgJiYgY3MtPmVuZCA+PSBzZXFhZGRyKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gYWhjLT5udW1fY3JpdGljYWxfc2VjdGlvbnMpCisJCQlicmVhazsKKworCQlpZiAoc3RlcHMgPiBBSENfTUFYX1NURVBTKSB7CisJCQlwcmludGYoIiVzOiBJbmZpbml0ZSBsb29wIGluIGNyaXRpY2FsIHNlY3Rpb25cbiIsCisJCQkgICAgICAgYWhjX25hbWUoYWhjKSk7CisJCQlhaGNfZHVtcF9jYXJkX3N0YXRlKGFoYyk7CisJCQlwYW5pYygiY3JpdGljYWwgc2VjdGlvbiBsb29wIik7CisJCX0KKworCQlzdGVwcysrOworCQlpZiAoc3RlcHBpbmcgPT0gRkFMU0UpIHsKKworCQkJLyoKKwkJCSAqIERpc2FibGUgYWxsIGludGVycnVwdCBzb3VyY2VzIHNvIHRoYXQgdGhlCisJCQkgKiBzZXF1ZW5jZXIgd2lsbCBub3QgYmUgc3R1Y2sgYnkgYSBwYXVzaW5nCisJCQkgKiBpbnRlcnJ1cHQgY29uZGl0aW9uIHdoaWxlIHdlIGF0dGVtcHQgdG8KKwkJCSAqIGxlYXZlIGEgY3JpdGljYWwgc2VjdGlvbi4KKwkJCSAqLworCQkJc2ltb2RlMCA9IGFoY19pbmIoYWhjLCBTSU1PREUwKTsKKwkJCWFoY19vdXRiKGFoYywgU0lNT0RFMCwgMCk7CisJCQlzaW1vZGUxID0gYWhjX2luYihhaGMsIFNJTU9ERTEpOworCQkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0RUKSAhPSAwKQorCQkJCS8qCisJCQkJICogT24gRFQgY2xhc3MgY29udHJvbGxlcnMsIHdlCisJCQkJICogdXNlIHRoZSBlbmhhbmNlZCBidXNmcmVlIGxvZ2ljLgorCQkJCSAqIFVuZm9ydHVuYXRlbHkgd2UgY2Fubm90IHJlLWVuYWJsZQorCQkJCSAqIGJ1c2ZyZWUgZGV0ZWN0aW9uIHdpdGhpbiB0aGUKKwkJCQkgKiBjdXJyZW50IGNvbm5lY3Rpb24sIHNvIHdlIG11c3QKKwkJCQkgKiBsZWF2ZSBpdCBvbiB3aGlsZSBzaW5nbGUgc3RlcHBpbmcuCisJCQkJICovCisJCQkJYWhjX291dGIoYWhjLCBTSU1PREUxLCBzaW1vZGUxICYgRU5CVVNGUkVFKTsKKwkJCWVsc2UKKwkJCQlhaGNfb3V0YihhaGMsIFNJTU9ERTEsIDApOworCQkJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUlNDU0lJTlQpOworCQkJYWhjX291dGIoYWhjLCBTRVFDVEwsIGFoYy0+c2VxY3RsIHwgU1RFUCk7CisJCQlzdGVwcGluZyA9IFRSVUU7CisJCX0KKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0RUKSAhPSAwKSB7CisJCQlhaGNfb3V0YihhaGMsIENMUlNJTlQxLCBDTFJCVVNGUkVFKTsKKwkJCWFoY19vdXRiKGFoYywgQ0xSSU5ULCBDTFJTQ1NJSU5UKTsKKwkJfQorCQlhaGNfb3V0YihhaGMsIEhDTlRSTCwgYWhjLT51bnBhdXNlKTsKKwkJd2hpbGUgKCFhaGNfaXNfcGF1c2VkKGFoYykpCisJCQlhaGNfZGVsYXkoMjAwKTsKKwl9CisJaWYgKHN0ZXBwaW5nKSB7CisJCWFoY19vdXRiKGFoYywgU0lNT0RFMCwgc2ltb2RlMCk7CisJCWFoY19vdXRiKGFoYywgU0lNT0RFMSwgc2ltb2RlMSk7CisJCWFoY19vdXRiKGFoYywgU0VRQ1RMLCBhaGMtPnNlcWN0bCk7CisJfQorfQorCisvKgorICogQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0IHN0YXR1cy4KKyAqLwordm9pZAorYWhjX2NsZWFyX2ludHN0YXQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCS8qIENsZWFyIGFueSBpbnRlcnJ1cHQgY29uZGl0aW9ucyB0aGlzIG1heSBoYXZlIGNhdXNlZCAqLworCWFoY19vdXRiKGFoYywgQ0xSU0lOVDEsIENMUlNFTFRJTUVPfENMUkFUTk98Q0xSU0NTSVJTVEkKKwkJCQl8Q0xSQlVTRlJFRXxDTFJTQ1NJUEVSUnxDTFJQSEFTRUNIR3wKKwkJCQlDTFJSRVFJTklUKTsKKwlhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOworCWFoY19vdXRiKGFoYywgQ0xSU0lOVDAsIENMUlNFTERPfENMUlNFTERJfENMUlNFTElOR08pOworIAlhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOworCWFoY19vdXRiKGFoYywgQ0xSSU5ULCBDTFJTQ1NJSU5UKTsKKwlhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZWJ1Z2dpbmcgUm91dGluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEFIQ19ERUJVRwordWludDMyX3QgYWhjX2RlYnVnID0gQUhDX0RFQlVHX09QVFM7CisjZW5kaWYKKwordm9pZAorYWhjX3ByaW50X3NjYihzdHJ1Y3Qgc2NiICpzY2IpCit7CisJaW50IGk7CisKKwlzdHJ1Y3QgaGFyZHdhcmVfc2NiICpoc2NiID0gc2NiLT5oc2NiOworCisJcHJpbnRmKCJzY2I6JXAgY29udHJvbDoweCV4IHNjc2lpZDoweCV4IGx1bjolZCBjZGJfbGVuOiVkXG4iLAorCSAgICAgICAodm9pZCAqKXNjYiwKKwkgICAgICAgaHNjYi0+Y29udHJvbCwKKwkgICAgICAgaHNjYi0+c2NzaWlkLAorCSAgICAgICBoc2NiLT5sdW4sCisJICAgICAgIGhzY2ItPmNkYl9sZW4pOworCXByaW50ZigiU2hhcmVkIERhdGE6ICIpOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaHNjYi0+c2hhcmVkX2RhdGEuY2RiKTsgaSsrKQorCQlwcmludGYoIiUjMDJ4IiwgaHNjYi0+c2hhcmVkX2RhdGEuY2RiW2ldKTsKKwlwcmludGYoIiAgICAgICAgZGF0YXB0cjolI3ggZGF0YWNudDolI3ggc2dwdHI6JSN4IHRhZzolI3hcbiIsCisJCWFoY19sZTMydG9oKGhzY2ItPmRhdGFwdHIpLAorCQlhaGNfbGUzMnRvaChoc2NiLT5kYXRhY250KSwKKwkJYWhjX2xlMzJ0b2goaHNjYi0+c2dwdHIpLAorCQloc2NiLT50YWcpOworCWlmIChzY2ItPnNnX2NvdW50ID4gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgc2NiLT5zZ19jb3VudDsgaSsrKSB7CisJCQlwcmludGYoInNnWyVkXSAtIEFkZHIgMHgleCV4IDogTGVuZ3RoICVkXG4iLAorCQkJICAgICAgIGksCisJCQkgICAgICAgKGFoY19sZTMydG9oKHNjYi0+c2dfbGlzdFtpXS5sZW4pID4+IDI0CisJCQkgICAgICAgICYgU0dfSElHSF9BRERSX0JJVFMpLAorCQkJICAgICAgIGFoY19sZTMydG9oKHNjYi0+c2dfbGlzdFtpXS5hZGRyKSwKKwkJCSAgICAgICBhaGNfbGUzMnRvaChzY2ItPnNnX2xpc3RbaV0ubGVuKSk7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFRyYW5zZmVyIE5lZ290aWF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQWxsb2NhdGUgcGVyIHRhcmdldCBtb2RlIGluc3RhbmNlIChJRCB3ZSByZXNwb25kIHRvIGFzIGEgdGFyZ2V0KQorICogdHJhbnNmZXIgbmVnb3RpYXRpb24gZGF0YSBzdHJ1Y3R1cmVzLgorICovCitzdGF0aWMgc3RydWN0IGFoY190bW9kZV90c3RhdGUgKgorYWhjX2FsbG9jX3RzdGF0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHNjc2lfaWQsIGNoYXIgY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSAqbWFzdGVyX3RzdGF0ZTsKKwlzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCWludCBpOworCisJbWFzdGVyX3RzdGF0ZSA9IGFoYy0+ZW5hYmxlZF90YXJnZXRzW2FoYy0+b3VyX2lkXTsKKwlpZiAoY2hhbm5lbCA9PSAnQicpIHsKKwkJc2NzaV9pZCArPSA4OworCQltYXN0ZXJfdHN0YXRlID0gYWhjLT5lbmFibGVkX3RhcmdldHNbYWhjLT5vdXJfaWRfYiArIDhdOworCX0KKwlpZiAoYWhjLT5lbmFibGVkX3RhcmdldHNbc2NzaV9pZF0gIT0gTlVMTAorCSAmJiBhaGMtPmVuYWJsZWRfdGFyZ2V0c1tzY3NpX2lkXSAhPSBtYXN0ZXJfdHN0YXRlKQorCQlwYW5pYygiJXM6IGFoY19hbGxvY190c3RhdGUgLSBUYXJnZXQgYWxyZWFkeSBhbGxvY2F0ZWQiLAorCQkgICAgICBhaGNfbmFtZShhaGMpKTsKKwl0c3RhdGUgPSAoc3RydWN0IGFoY190bW9kZV90c3RhdGUqKW1hbGxvYyhzaXplb2YoKnRzdGF0ZSksCisJCQkJCQkgICBNX0RFVkJVRiwgTV9OT1dBSVQpOworCWlmICh0c3RhdGUgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKworCS8qCisJICogSWYgd2UgaGF2ZSBhbGxvY2F0ZWQgYSBtYXN0ZXIgdHN0YXRlLCBjb3B5IHVzZXIgc2V0dGluZ3MgZnJvbQorCSAqIHRoZSBtYXN0ZXIgdHN0YXRlICh0YWtlbiBmcm9tIFNSQU0gb3IgdGhlIEVFUFJPTSkgZm9yIHRoaXMKKwkgKiBjaGFubmVsLCBidXQgcmVzZXQgb3VyIGN1cnJlbnQgYW5kIGdvYWwgc2V0dGluZ3MgdG8gYXN5bmMvbmFycm93CisJICogdW50aWwgYW4gaW5pdGlhdG9yIHRhbGtzIHRvIHVzLgorCSAqLworCWlmIChtYXN0ZXJfdHN0YXRlICE9IE5VTEwpIHsKKwkJbWVtY3B5KHRzdGF0ZSwgbWFzdGVyX3RzdGF0ZSwgc2l6ZW9mKCp0c3RhdGUpKTsKKwkJbWVtc2V0KHRzdGF0ZS0+ZW5hYmxlZF9sdW5zLCAwLCBzaXplb2YodHN0YXRlLT5lbmFibGVkX2x1bnMpKTsKKwkJdHN0YXRlLT51bHRyYWVuYiA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBBSENfTlVNX1RBUkdFVFM7IGkrKykgeworCQkJbWVtc2V0KCZ0c3RhdGUtPnRyYW5zaW5mb1tpXS5jdXJyLCAwLAorCQkJICAgICAgc2l6ZW9mKHRzdGF0ZS0+dHJhbnNpbmZvW2ldLmN1cnIpKTsKKwkJCW1lbXNldCgmdHN0YXRlLT50cmFuc2luZm9baV0uZ29hbCwgMCwKKwkJCSAgICAgIHNpemVvZih0c3RhdGUtPnRyYW5zaW5mb1tpXS5nb2FsKSk7CisJCX0KKwl9IGVsc2UKKwkJbWVtc2V0KHRzdGF0ZSwgMCwgc2l6ZW9mKCp0c3RhdGUpKTsKKwlhaGMtPmVuYWJsZWRfdGFyZ2V0c1tzY3NpX2lkXSA9IHRzdGF0ZTsKKwlyZXR1cm4gKHRzdGF0ZSk7Cit9CisKKyNpZmRlZiBBSENfVEFSR0VUX01PREUKKy8qCisgKiBGcmVlIHBlciB0YXJnZXQgbW9kZSBpbnN0YW5jZSAoSUQgd2UgcmVzcG9uZCB0byBhcyBhIHRhcmdldCkKKyAqIHRyYW5zZmVyIG5lZ290aWF0aW9uIGRhdGEgc3RydWN0dXJlcy4KKyAqLworc3RhdGljIHZvaWQKK2FoY19mcmVlX3RzdGF0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHNjc2lfaWQsIGNoYXIgY2hhbm5lbCwgaW50IGZvcmNlKQoreworCXN0cnVjdCBhaGNfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisKKwkvKgorCSAqIERvbid0IGNsZWFuIHVwIG91ciAibWFzdGVyIiB0c3RhdGUuCisJICogSXQgaGFzIG91ciBkZWZhdWx0IHVzZXIgc2V0dGluZ3MuCisJICovCisJaWYgKCgoY2hhbm5lbCA9PSAnQicgJiYgc2NzaV9pZCA9PSBhaGMtPm91cl9pZF9iKQorCSAgfHwgKGNoYW5uZWwgPT0gJ0EnICYmIHNjc2lfaWQgPT0gYWhjLT5vdXJfaWQpKQorCSAmJiBmb3JjZSA9PSBGQUxTRSkKKwkJcmV0dXJuOworCisJaWYgKGNoYW5uZWwgPT0gJ0InKQorCQlzY3NpX2lkICs9IDg7CisJdHN0YXRlID0gYWhjLT5lbmFibGVkX3RhcmdldHNbc2NzaV9pZF07CisJaWYgKHRzdGF0ZSAhPSBOVUxMKQorCQlmcmVlKHRzdGF0ZSwgTV9ERVZCVUYpOworCWFoYy0+ZW5hYmxlZF90YXJnZXRzW3Njc2lfaWRdID0gTlVMTDsKK30KKyNlbmRpZgorCisvKgorICogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBhbiBhY3RpdmUgY29ubmVjdGlvbiB0byBhIHRhcmdldCBvbiB0aGUgYnVzLAorICogdGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgbmVhcmVzdCBzeW5jcmF0ZSB0byB0aGUgaW5wdXQgcGVyaW9kIGxpbWl0ZWQKKyAqIGJ5IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGJ1cyBjb25uZWN0aXZpdHkgb2YgYW5kIHN5bmMgc2V0dGluZ3MgZm9yCisgKiB0aGUgdGFyZ2V0LgorICovCitzdHJ1Y3QgYWhjX3N5bmNyYXRlICoKK2FoY19kZXZsaW1pdGVkX3N5bmNyYXRlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCXN0cnVjdCBhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbywKKwkJCXVfaW50ICpwZXJpb2QsIHVfaW50ICpwcHJfb3B0aW9ucywgcm9sZV90IHJvbGUpCit7CisJc3RydWN0CWFoY190cmFuc2luZm8gKnRyYW5zaW5mbzsKKwl1X2ludAltYXhzeW5jOworCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQlpZiAoKGFoY19pbmIoYWhjLCBTQkxLQ1RMKSAmIEVOQUI0MCkgIT0gMAorCQkgJiYgKGFoY19pbmIoYWhjLCBTU1RBVDIpICYgRVhQX0FDVElWRSkgPT0gMCkgeworCQkJbWF4c3luYyA9IEFIQ19TWU5DUkFURV9EVDsKKwkJfSBlbHNlIHsKKwkJCW1heHN5bmMgPSBBSENfU1lOQ1JBVEVfVUxUUkE7CisJCQkvKiBDYW4ndCBkbyBEVCBvbiBhbiBTRSBidXMgKi8KKwkJCSpwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfRFRfUkVROworCQl9CisJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQSkgIT0gMCkgeworCQltYXhzeW5jID0gQUhDX1NZTkNSQVRFX1VMVFJBOworCX0gZWxzZSB7CisJCW1heHN5bmMgPSBBSENfU1lOQ1JBVEVfRkFTVDsKKwl9CisJLyoKKwkgKiBOZXZlciBhbGxvdyBhIHZhbHVlIGhpZ2hlciB0aGFuIG91ciBjdXJyZW50IGdvYWwKKwkgKiBwZXJpb2Qgb3RoZXJ3aXNlIHdlIG1heSBhbGxvdyBhIHRhcmdldCBpbml0aWF0ZWQKKwkgKiBuZWdvdGlhdGlvbiB0byBnbyBhYm92ZSB0aGUgbGltaXQgYXMgc2V0IGJ5IHRoZQorCSAqIHVzZXIuICBJbiB0aGUgY2FzZSBvZiBhbiBpbml0aWF0b3IgaW5pdGlhdGVkCisJICogc3luYyBuZWdvdGlhdGlvbiwgd2UgbGltaXQgYmFzZWQgb24gdGhlIHVzZXIKKwkgKiBzZXR0aW5nLiAgVGhpcyBhbGxvd3MgdGhlIHN5c3RlbSB0byBzdGlsbCBhY2NlcHQKKwkgKiBpbmNvbWluZyBuZWdvdGlhdGlvbnMgZXZlbiBpZiB0YXJnZXQgaW5pdGlhdGVkCisJICogbmVnb3RpYXRpb24gaXMgbm90IHBlcmZvcm1lZC4KKwkgKi8KKwlpZiAocm9sZSA9PSBST0xFX1RBUkdFVCkKKwkJdHJhbnNpbmZvID0gJnRpbmZvLT51c2VyOworCWVsc2UgCisJCXRyYW5zaW5mbyA9ICZ0aW5mby0+Z29hbDsKKwkqcHByX29wdGlvbnMgJj0gdHJhbnNpbmZvLT5wcHJfb3B0aW9uczsKKwlpZiAodHJhbnNpbmZvLT53aWR0aCA9PSBNU0dfRVhUX1dEVFJfQlVTXzhfQklUKSB7CisJCW1heHN5bmMgPSBNQVgobWF4c3luYywgQUhDX1NZTkNSQVRFX1VMVFJBMik7CisJCSpwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfRFRfUkVROworCX0KKwlpZiAodHJhbnNpbmZvLT5wZXJpb2QgPT0gMCkgeworCQkqcGVyaW9kID0gMDsKKwkJKnBwcl9vcHRpb25zID0gMDsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJKnBlcmlvZCA9IE1BWCgqcGVyaW9kLCB0cmFuc2luZm8tPnBlcmlvZCk7CisJcmV0dXJuIChhaGNfZmluZF9zeW5jcmF0ZShhaGMsIHBlcmlvZCwgcHByX29wdGlvbnMsIG1heHN5bmMpKTsKK30KKworLyoKKyAqIExvb2sgdXAgdGhlIHZhbGlkIHBlcmlvZCB0byBTQ1NJUkFURSBjb252ZXJzaW9uIGluIG91ciB0YWJsZS4KKyAqIFJldHVybiB0aGUgcGVyaW9kIGFuZCBvZmZzZXQgdGhhdCBzaG91bGQgYmUgc2VudCB0byB0aGUgdGFyZ2V0CisgKiBpZiB0aGlzIHdhcyB0aGUgYmVnaW5uaW5nIG9mIGFuIFNEVFIuCisgKi8KK3N0cnVjdCBhaGNfc3luY3JhdGUgKgorYWhjX2ZpbmRfc3luY3JhdGUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCAqcGVyaW9kLAorCQkgIHVfaW50ICpwcHJfb3B0aW9ucywgdV9pbnQgbWF4c3luYykKK3sKKwlzdHJ1Y3QgYWhjX3N5bmNyYXRlICpzeW5jcmF0ZTsKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgPT0gMCkKKwkJKnBwcl9vcHRpb25zICY9IH5NU0dfRVhUX1BQUl9EVF9SRVE7CisKKwkvKiBTa2lwIGFsbCBEVCBvbmx5IGVudHJpZXMgaWYgRFQgaXMgbm90IGF2YWlsYWJsZSAqLworCWlmICgoKnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVRKSA9PSAwCisJICYmIG1heHN5bmMgPCBBSENfU1lOQ1JBVEVfVUxUUkEyKQorCQltYXhzeW5jID0gQUhDX1NZTkNSQVRFX1VMVFJBMjsKKwkKKwlmb3IgKHN5bmNyYXRlID0gJmFoY19zeW5jcmF0ZXNbbWF4c3luY107CisJICAgICBzeW5jcmF0ZS0+cmF0ZSAhPSBOVUxMOworCSAgICAgc3luY3JhdGUrKykgeworCisJCS8qCisJCSAqIFRoZSBVbHRyYTIgdGFibGUgZG9lc24ndCBnbyBhcyBsb3cKKwkJICogYXMgZm9yIHRoZSBGYXN0L1VsdHJhIGNhcmRzLgorCQkgKi8KKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMAorCQkgJiYgKHN5bmNyYXRlLT5zeGZyX3UyID09IDApKQorCQkJYnJlYWs7CisKKwkJaWYgKCpwZXJpb2QgPD0gc3luY3JhdGUtPnBlcmlvZCkgeworCQkJLyoKKwkJCSAqIFdoZW4gcmVzcG9uZGluZyB0byBhIHRhcmdldCB0aGF0IHJlcXVlc3RzCisJCQkgKiBzeW5jLCB0aGUgcmVxdWVzdGVkIHJhdGUgbWF5IGZhbGwgYmV0d2VlbgorCQkJICogdHdvIHJhdGVzIHRoYXQgd2UgY2FuIG91dHB1dCwgYnV0IHN0aWxsIGJlCisJCQkgKiBhIHJhdGUgdGhhdCB3ZSBjYW4gcmVjZWl2ZS4gIEJlY2F1c2Ugb2YgdGhpcywKKwkJCSAqIHdlIHdhbnQgdG8gcmVzcG9uZCB0byB0aGUgdGFyZ2V0IHdpdGgKKwkJCSAqIHRoZSBzYW1lIHJhdGUgdGhhdCBpdCBzZW50IHRvIHVzIGV2ZW4KKwkJCSAqIGlmIHRoZSBwZXJpb2Qgd2UgdXNlIHRvIHNlbmQgZGF0YSB0byBpdAorCQkJICogaXMgbG93ZXIuICBPbmx5IGxvd2VyIHRoZSByZXNwb25zZSBwZXJpb2QKKwkJCSAqIGlmIHdlIG11c3QuCisJCQkgKi8KKwkJCWlmIChzeW5jcmF0ZSA9PSAmYWhjX3N5bmNyYXRlc1ttYXhzeW5jXSkKKwkJCQkqcGVyaW9kID0gc3luY3JhdGUtPnBlcmlvZDsKKworCQkJLyoKKwkJCSAqIEF0IHNvbWUgc3BlZWRzLCB3ZSBvbmx5IHN1cHBvcnQKKwkJCSAqIFNUIHRyYW5zZmVycy4KKwkJCSAqLworCQkgCWlmICgoc3luY3JhdGUtPnN4ZnJfdTIgJiBTVF9TWEZSKSAhPSAwKQorCQkJCSpwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfRFRfUkVROworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoKCpwZXJpb2QgPT0gMCkKKwkgfHwgKHN5bmNyYXRlLT5yYXRlID09IE5VTEwpCisJIHx8ICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDAKKwkgICYmIChzeW5jcmF0ZS0+c3hmcl91MiA9PSAwKSkpIHsKKwkJLyogVXNlIGFzeW5jaHJvbm91cyB0cmFuc2ZlcnMuICovCisJCSpwZXJpb2QgPSAwOworCQlzeW5jcmF0ZSA9IE5VTEw7CisJCSpwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfRFRfUkVROworCX0KKwlyZXR1cm4gKHN5bmNyYXRlKTsKK30KKworLyoKKyAqIENvbnZlcnQgZnJvbSBhbiBlbnRyeSBpbiBvdXIgc3luY3JhdGUgdGFibGUgdG8gdGhlIFNDU0kgZXF1aXZhbGVudAorICogc3luYyAicGVyaW9kIiBmYWN0b3IuCisgKi8KK3VfaW50CithaGNfZmluZF9wZXJpb2Qoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCBzY3NpcmF0ZSwgdV9pbnQgbWF4c3luYykKK3sKKwlzdHJ1Y3QgYWhjX3N5bmNyYXRlICpzeW5jcmF0ZTsKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisJCXNjc2lyYXRlICY9IFNYRlJfVUxUUkEyOworCWVsc2UKKwkJc2NzaXJhdGUgJj0gU1hGUjsKKworCXN5bmNyYXRlID0gJmFoY19zeW5jcmF0ZXNbbWF4c3luY107CisJd2hpbGUgKHN5bmNyYXRlLT5yYXRlICE9IE5VTEwpIHsKKworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCQlpZiAoc3luY3JhdGUtPnN4ZnJfdTIgPT0gMCkKKwkJCQlicmVhazsKKwkJCWVsc2UgaWYgKHNjc2lyYXRlID09IChzeW5jcmF0ZS0+c3hmcl91MiAmIFNYRlJfVUxUUkEyKSkKKwkJCQlyZXR1cm4gKHN5bmNyYXRlLT5wZXJpb2QpOworCQl9IGVsc2UgaWYgKHNjc2lyYXRlID09IChzeW5jcmF0ZS0+c3hmciAmIFNYRlIpKSB7CisJCQkJcmV0dXJuIChzeW5jcmF0ZS0+cGVyaW9kKTsKKwkJfQorCQlzeW5jcmF0ZSsrOworCX0KKwlyZXR1cm4gKDApOyAvKiBhc3luYyAqLworfQorCisvKgorICogVHJ1bmNhdGUgdGhlIGdpdmVuIHN5bmNocm9ub3VzIG9mZnNldCB0byBhIHZhbHVlIHRoZQorICogY3VycmVudCBhZGFwdGVyIHR5cGUgYW5kIHN5bmNyYXRlIGFyZSBjYXBhYmxlIG9mLgorICovCit2b2lkCithaGNfdmFsaWRhdGVfb2Zmc2V0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJICAgIHN0cnVjdCBhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbywKKwkJICAgIHN0cnVjdCBhaGNfc3luY3JhdGUgKnN5bmNyYXRlLAorCQkgICAgdV9pbnQgKm9mZnNldCwgaW50IHdpZGUsIHJvbGVfdCByb2xlKQoreworCXVfaW50IG1heG9mZnNldDsKKworCS8qIExpbWl0IG9mZnNldCB0byB3aGF0IHdlIGNhbiBkbyAqLworCWlmIChzeW5jcmF0ZSA9PSBOVUxMKSB7CisJCW1heG9mZnNldCA9IDA7CisJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJbWF4b2Zmc2V0ID0gTUFYX09GRlNFVF9VTFRSQTI7CisJfSBlbHNlIHsKKwkJaWYgKHdpZGUpCisJCQltYXhvZmZzZXQgPSBNQVhfT0ZGU0VUXzE2QklUOworCQllbHNlCisJCQltYXhvZmZzZXQgPSBNQVhfT0ZGU0VUXzhCSVQ7CisJfQorCSpvZmZzZXQgPSBNSU4oKm9mZnNldCwgbWF4b2Zmc2V0KTsKKwlpZiAodGluZm8gIT0gTlVMTCkgeworCQlpZiAocm9sZSA9PSBST0xFX1RBUkdFVCkKKwkJCSpvZmZzZXQgPSBNSU4oKm9mZnNldCwgdGluZm8tPnVzZXIub2Zmc2V0KTsKKwkJZWxzZQorCQkJKm9mZnNldCA9IE1JTigqb2Zmc2V0LCB0aW5mby0+Z29hbC5vZmZzZXQpOworCX0KK30KKworLyoKKyAqIFRydW5jYXRlIHRoZSBnaXZlbiB0cmFuc2ZlciB3aWR0aCBwYXJhbWV0ZXIgdG8gYSB2YWx1ZSB0aGUKKyAqIGN1cnJlbnQgYWRhcHRlciB0eXBlIGlzIGNhcGFibGUgb2YuCisgKi8KK3ZvaWQKK2FoY192YWxpZGF0ZV93aWR0aChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbywKKwkJICAgdV9pbnQgKmJ1c193aWR0aCwgcm9sZV90IHJvbGUpCit7CisJc3dpdGNoICgqYnVzX3dpZHRoKSB7CisJZGVmYXVsdDoKKwkJaWYgKGFoYy0+ZmVhdHVyZXMgJiBBSENfV0lERSkgeworCQkJLyogUmVzcG9uZCBXaWRlICovCisJCQkqYnVzX3dpZHRoID0gTVNHX0VYVF9XRFRSX0JVU18xNl9CSVQ7CisJCQlicmVhazsKKwkJfQorCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgTVNHX0VYVF9XRFRSX0JVU184X0JJVDoKKwkJKmJ1c193aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQ7CisJCWJyZWFrOworCX0KKwlpZiAodGluZm8gIT0gTlVMTCkgeworCQlpZiAocm9sZSA9PSBST0xFX1RBUkdFVCkKKwkJCSpidXNfd2lkdGggPSBNSU4odGluZm8tPnVzZXIud2lkdGgsICpidXNfd2lkdGgpOworCQllbHNlCisJCQkqYnVzX3dpZHRoID0gTUlOKHRpbmZvLT5nb2FsLndpZHRoLCAqYnVzX3dpZHRoKTsKKwl9Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIGJpdG1hc2sgb2YgdGFyZ2V0cyBmb3Igd2hpY2ggdGhlIGNvbnRyb2xsZXIgc2hvdWxkCisgKiBuZWdvdGlhdGUgd2l0aCBhdCB0aGUgbmV4dCBjb252ZW5pZW50IG9wb3J0dW5pdHkuICBUaGlzIGN1cnJlbnRseQorICogbWVhbnMgdGhlIG5leHQgdGltZSB3ZSBzZW5kIHRoZSBpbml0aWFsIGlkZW50aWZ5IG1lc3NhZ2VzIGZvcgorICogYSBuZXcgdHJhbnNhY3Rpb24uCisgKi8KK2ludAorYWhjX3VwZGF0ZV9uZWdfcmVxdWVzdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJICAgICAgIHN0cnVjdCBhaGNfdG1vZGVfdHN0YXRlICp0c3RhdGUsCisJCSAgICAgICBzdHJ1Y3QgYWhjX2luaXRpYXRvcl90aW5mbyAqdGluZm8sIGFoY19uZWdfdHlwZSBuZWdfdHlwZSkKK3sKKwl1X2ludCBhdXRvX25lZ290aWF0ZV9vcmlnOworCisJYXV0b19uZWdvdGlhdGVfb3JpZyA9IHRzdGF0ZS0+YXV0b19uZWdvdGlhdGU7CisJaWYgKG5lZ190eXBlID09IEFIQ19ORUdfQUxXQVlTKSB7CisJCS8qCisJCSAqIEZvcmNlIG91ciAiY3VycmVudCIgc2V0dGluZ3MgdG8gYmUKKwkJICogdW5rbm93biBzbyB0aGF0IHVubGVzcyBhIGJ1cyByZXNldAorCQkgKiBvY2N1cnMgdGhlIG5lZWQgdG8gcmVuZWdvdGlhdGUgaXMKKwkJICogcmVjb3JkZWQgcGVyc2lzdGVudGx5LgorCQkgKi8KKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1dJREUpICE9IDApCisJCQl0aW5mby0+Y3Vyci53aWR0aCA9IEFIQ19XSURUSF9VTktOT1dOOworCQl0aW5mby0+Y3Vyci5wZXJpb2QgPSBBSENfUEVSSU9EX1VOS05PV047CisJCXRpbmZvLT5jdXJyLm9mZnNldCA9IEFIQ19PRkZTRVRfVU5LTk9XTjsKKwl9CisJaWYgKHRpbmZvLT5jdXJyLnBlcmlvZCAhPSB0aW5mby0+Z29hbC5wZXJpb2QKKwkgfHwgdGluZm8tPmN1cnIud2lkdGggIT0gdGluZm8tPmdvYWwud2lkdGgKKwkgfHwgdGluZm8tPmN1cnIub2Zmc2V0ICE9IHRpbmZvLT5nb2FsLm9mZnNldAorCSB8fCB0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyAhPSB0aW5mby0+Z29hbC5wcHJfb3B0aW9ucworCSB8fCAobmVnX3R5cGUgPT0gQUhDX05FR19JRl9OT05fQVNZTkMKKwkgICYmICh0aW5mby0+Z29hbC5vZmZzZXQgIT0gMAorCSAgIHx8IHRpbmZvLT5nb2FsLndpZHRoICE9IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQKKwkgICB8fCB0aW5mby0+Z29hbC5wcHJfb3B0aW9ucyAhPSAwKSkpCisJCXRzdGF0ZS0+YXV0b19uZWdvdGlhdGUgfD0gZGV2aW5mby0+dGFyZ2V0X21hc2s7CisJZWxzZQorCQl0c3RhdGUtPmF1dG9fbmVnb3RpYXRlICY9IH5kZXZpbmZvLT50YXJnZXRfbWFzazsKKworCXJldHVybiAoYXV0b19uZWdvdGlhdGVfb3JpZyAhPSB0c3RhdGUtPmF1dG9fbmVnb3RpYXRlKTsKK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgdXNlci9nb2FsL2N1cnIgdGFibGVzIG9mIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uCisgKiBwYXJhbWV0ZXJzIGFzIHdlbGwgYXMsIGluIHRoZSBjYXNlIG9mIGEgY3VycmVudCBvciBhY3RpdmUgdXBkYXRlLAorICogYW55IGRhdGEgc3RydWN0dXJlcyBvbiB0aGUgaG9zdCBjb250cm9sbGVyLiAgSW4gdGhlIGNhc2Ugb2YgYW4KKyAqIGFjdGl2ZSB1cGRhdGUsIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGlzIGN1cnJlbnRseSB0YWxraW5nIHRvIHVzIG9uCisgKiB0aGUgYnVzLCBzbyB0aGUgdHJhbnNmZXIgcGFyYW1ldGVyIHVwZGF0ZSBtdXN0IHRha2UgZWZmZWN0CisgKiBpbW1lZGlhdGVseS4KKyAqLwordm9pZAorYWhjX3NldF9zeW5jcmF0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJIHN0cnVjdCBhaGNfc3luY3JhdGUgKnN5bmNyYXRlLCB1X2ludCBwZXJpb2QsCisJCSB1X2ludCBvZmZzZXQsIHVfaW50IHBwcl9vcHRpb25zLCB1X2ludCB0eXBlLCBpbnQgcGF1c2VkKQoreworCXN0cnVjdAlhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QJYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXVfaW50CW9sZF9wZXJpb2Q7CisJdV9pbnQJb2xkX29mZnNldDsKKwl1X2ludAlvbGRfcHByOworCWludAlhY3RpdmU7CisJaW50CXVwZGF0ZV9uZWVkZWQ7CisKKwlhY3RpdmUgPSAodHlwZSAmIEFIQ19UUkFOU19BQ1RJVkUpID09IEFIQ19UUkFOU19BQ1RJVkU7CisJdXBkYXRlX25lZWRlZCA9IDA7CisKKwlpZiAoc3luY3JhdGUgPT0gTlVMTCkgeworCQlwZXJpb2QgPSAwOworCQlvZmZzZXQgPSAwOworCX0KKworCXRpbmZvID0gYWhjX2ZldGNoX3RyYW5zaW5mbyhhaGMsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPm91cl9zY3NpaWQsCisJCQkJICAgIGRldmluZm8tPnRhcmdldCwgJnRzdGF0ZSk7CisKKwlpZiAoKHR5cGUgJiBBSENfVFJBTlNfVVNFUikgIT0gMCkgeworCQl0aW5mby0+dXNlci5wZXJpb2QgPSBwZXJpb2Q7CisJCXRpbmZvLT51c2VyLm9mZnNldCA9IG9mZnNldDsKKwkJdGluZm8tPnVzZXIucHByX29wdGlvbnMgPSBwcHJfb3B0aW9uczsKKwl9CisKKwlpZiAoKHR5cGUgJiBBSENfVFJBTlNfR09BTCkgIT0gMCkgeworCQl0aW5mby0+Z29hbC5wZXJpb2QgPSBwZXJpb2Q7CisJCXRpbmZvLT5nb2FsLm9mZnNldCA9IG9mZnNldDsKKwkJdGluZm8tPmdvYWwucHByX29wdGlvbnMgPSBwcHJfb3B0aW9uczsKKwl9CisKKwlvbGRfcGVyaW9kID0gdGluZm8tPmN1cnIucGVyaW9kOworCW9sZF9vZmZzZXQgPSB0aW5mby0+Y3Vyci5vZmZzZXQ7CisJb2xkX3BwcgkgICA9IHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zOworCisJaWYgKCh0eXBlICYgQUhDX1RSQU5TX0NVUikgIT0gMAorCSAmJiAob2xkX3BlcmlvZCAhPSBwZXJpb2QKKwkgIHx8IG9sZF9vZmZzZXQgIT0gb2Zmc2V0CisJICB8fCBvbGRfcHByICE9IHBwcl9vcHRpb25zKSkgeworCQl1X2ludAlzY3NpcmF0ZTsKKworCQl1cGRhdGVfbmVlZGVkKys7CisJCXNjc2lyYXRlID0gdGluZm8tPnNjc2lyYXRlOworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisKKwkJCXNjc2lyYXRlICY9IH4oU1hGUl9VTFRSQTJ8U0lOR0xFX0VER0V8RU5BQkxFX0NSQyk7CisJCQlpZiAoc3luY3JhdGUgIT0gTlVMTCkgeworCQkJCXNjc2lyYXRlIHw9IHN5bmNyYXRlLT5zeGZyX3UyOworCQkJCWlmICgocHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9EVF9SRVEpICE9IDApCisJCQkJCXNjc2lyYXRlIHw9IEVOQUJMRV9DUkM7CisJCQkJZWxzZQorCQkJCQlzY3NpcmF0ZSB8PSBTSU5HTEVfRURHRTsKKwkJCX0KKwkJfSBlbHNlIHsKKworCQkJc2NzaXJhdGUgJj0gfihTWEZSfFNPRlMpOworCQkJLyoKKwkJCSAqIEVuc3VyZSBVbHRyYSBtb2RlIGlzIHNldCBwcm9wZXJseSBmb3IKKwkJCSAqIHRoaXMgdGFyZ2V0LgorCQkJICovCisJCQl0c3RhdGUtPnVsdHJhZW5iICY9IH5kZXZpbmZvLT50YXJnZXRfbWFzazsKKwkJCWlmIChzeW5jcmF0ZSAhPSBOVUxMKSB7CisJCQkJaWYgKHN5bmNyYXRlLT5zeGZyICYgVUxUUkFfU1hGUikgeworCQkJCQl0c3RhdGUtPnVsdHJhZW5iIHw9CisJCQkJCQlkZXZpbmZvLT50YXJnZXRfbWFzazsKKwkJCQl9CisJCQkJc2NzaXJhdGUgfD0gc3luY3JhdGUtPnN4ZnIgJiBTWEZSOworCQkJCXNjc2lyYXRlIHw9IG9mZnNldCAmIFNPRlM7CisJCQl9CisJCQlpZiAoYWN0aXZlKSB7CisJCQkJdV9pbnQgc3hmcmN0bDA7CisKKwkJCQlzeGZyY3RsMCA9IGFoY19pbmIoYWhjLCBTWEZSQ1RMMCk7CisJCQkJc3hmcmN0bDAgJj0gfkZBU1QyMDsKKwkJCQlpZiAodHN0YXRlLT51bHRyYWVuYiAmIGRldmluZm8tPnRhcmdldF9tYXNrKQorCQkJCQlzeGZyY3RsMCB8PSBGQVNUMjA7CisJCQkJYWhjX291dGIoYWhjLCBTWEZSQ1RMMCwgc3hmcmN0bDApOworCQkJfQorCQl9CisJCWlmIChhY3RpdmUpIHsKKwkJCWFoY19vdXRiKGFoYywgU0NTSVJBVEUsIHNjc2lyYXRlKTsKKwkJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisJCQkJYWhjX291dGIoYWhjLCBTQ1NJT0ZGU0VULCBvZmZzZXQpOworCQl9CisKKwkJdGluZm8tPnNjc2lyYXRlID0gc2NzaXJhdGU7CisJCXRpbmZvLT5jdXJyLnBlcmlvZCA9IHBlcmlvZDsKKwkJdGluZm8tPmN1cnIub2Zmc2V0ID0gb2Zmc2V0OworCQl0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyA9IHBwcl9vcHRpb25zOworCisJCWFoY19zZW5kX2FzeW5jKGFoYywgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAorCQkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIEFDX1RSQU5TRkVSX05FRywgTlVMTCk7CisJCWlmIChib290dmVyYm9zZSkgeworCQkJaWYgKG9mZnNldCAhPSAwKSB7CisJCQkJcHJpbnRmKCIlczogdGFyZ2V0ICVkIHN5bmNocm9ub3VzIGF0ICVzTUh6JXMsICIKKwkJCQkgICAgICAgIm9mZnNldCA9IDB4JXhcbiIsIGFoY19uYW1lKGFoYyksCisJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgc3luY3JhdGUtPnJhdGUsCisJCQkJICAgICAgIChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUSkKKwkJCQkgICAgICAgPyAiIERUIiA6ICIiLCBvZmZzZXQpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGYoIiVzOiB0YXJnZXQgJWQgdXNpbmcgIgorCQkJCSAgICAgICAiYXN5bmNocm9ub3VzIHRyYW5zZmVyc1xuIiwKKwkJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+dGFyZ2V0KTsKKwkJCX0KKwkJfQorCX0KKworCXVwZGF0ZV9uZWVkZWQgKz0gYWhjX3VwZGF0ZV9uZWdfcmVxdWVzdChhaGMsIGRldmluZm8sIHRzdGF0ZSwKKwkJCQkJCXRpbmZvLCBBSENfTkVHX1RPX0dPQUwpOworCisJaWYgKHVwZGF0ZV9uZWVkZWQpCisJCWFoY191cGRhdGVfcGVuZGluZ19zY2JzKGFoYyk7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIHVzZXIvZ29hbC9jdXJyIHRhYmxlcyBvZiB3aWRlIG5lZ290aWF0aW9uCisgKiBwYXJhbWV0ZXJzIGFzIHdlbGwgYXMsIGluIHRoZSBjYXNlIG9mIGEgY3VycmVudCBvciBhY3RpdmUgdXBkYXRlLAorICogYW55IGRhdGEgc3RydWN0dXJlcyBvbiB0aGUgaG9zdCBjb250cm9sbGVyLiAgSW4gdGhlIGNhc2Ugb2YgYW4KKyAqIGFjdGl2ZSB1cGRhdGUsIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGlzIGN1cnJlbnRseSB0YWxraW5nIHRvIHVzIG9uCisgKiB0aGUgYnVzLCBzbyB0aGUgdHJhbnNmZXIgcGFyYW1ldGVyIHVwZGF0ZSBtdXN0IHRha2UgZWZmZWN0CisgKiBpbW1lZGlhdGVseS4KKyAqLwordm9pZAorYWhjX3NldF93aWR0aChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkgICAgICB1X2ludCB3aWR0aCwgdV9pbnQgdHlwZSwgaW50IHBhdXNlZCkKK3sKKwlzdHJ1Y3QJYWhjX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJc3RydWN0CWFoY190bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwl1X2ludAlvbGR3aWR0aDsKKwlpbnQJYWN0aXZlOworCWludAl1cGRhdGVfbmVlZGVkOworCisJYWN0aXZlID0gKHR5cGUgJiBBSENfVFJBTlNfQUNUSVZFKSA9PSBBSENfVFJBTlNfQUNUSVZFOworCXVwZGF0ZV9uZWVkZWQgPSAwOworCXRpbmZvID0gYWhjX2ZldGNoX3RyYW5zaW5mbyhhaGMsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPm91cl9zY3NpaWQsCisJCQkJICAgIGRldmluZm8tPnRhcmdldCwgJnRzdGF0ZSk7CisKKwlpZiAoKHR5cGUgJiBBSENfVFJBTlNfVVNFUikgIT0gMCkKKwkJdGluZm8tPnVzZXIud2lkdGggPSB3aWR0aDsKKworCWlmICgodHlwZSAmIEFIQ19UUkFOU19HT0FMKSAhPSAwKQorCQl0aW5mby0+Z29hbC53aWR0aCA9IHdpZHRoOworCisJb2xkd2lkdGggPSB0aW5mby0+Y3Vyci53aWR0aDsKKwlpZiAoKHR5cGUgJiBBSENfVFJBTlNfQ1VSKSAhPSAwICYmIG9sZHdpZHRoICE9IHdpZHRoKSB7CisJCXVfaW50CXNjc2lyYXRlOworCisJCXVwZGF0ZV9uZWVkZWQrKzsKKwkJc2NzaXJhdGUgPSAgdGluZm8tPnNjc2lyYXRlOworCQlzY3NpcmF0ZSAmPSB+V0lERVhGRVI7CisJCWlmICh3aWR0aCA9PSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVCkKKwkJCXNjc2lyYXRlIHw9IFdJREVYRkVSOworCisJCXRpbmZvLT5zY3NpcmF0ZSA9IHNjc2lyYXRlOworCisJCWlmIChhY3RpdmUpCisJCQlhaGNfb3V0YihhaGMsIFNDU0lSQVRFLCBzY3NpcmF0ZSk7CisKKwkJdGluZm8tPmN1cnIud2lkdGggPSB3aWR0aDsKKworCQlhaGNfc2VuZF9hc3luYyhhaGMsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKKwkJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBBQ19UUkFOU0ZFUl9ORUcsIE5VTEwpOworCQlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJCXByaW50ZigiJXM6IHRhcmdldCAlZCB1c2luZyAlZGJpdCB0cmFuc2ZlcnNcbiIsCisJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+dGFyZ2V0LAorCQkJICAgICAgIDggKiAoMHgwMSA8PCB3aWR0aCkpOworCQl9CisJfQorCisJdXBkYXRlX25lZWRlZCArPSBhaGNfdXBkYXRlX25lZ19yZXF1ZXN0KGFoYywgZGV2aW5mbywgdHN0YXRlLAorCQkJCQkJdGluZm8sIEFIQ19ORUdfVE9fR09BTCk7CisJaWYgKHVwZGF0ZV9uZWVkZWQpCisJCWFoY191cGRhdGVfcGVuZGluZ19zY2JzKGFoYyk7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGFnZ2VkIHF1ZXVpbmcgZm9yIGEgZ2l2ZW4gdGFyZ2V0LgorICovCit2b2lkCithaGNfc2V0X3RhZ3Moc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sCisJICAgICBhaGNfcXVldWVfYWxnIGFsZykKK3sKKyAJYWhjX3BsYXRmb3JtX3NldF90YWdzKGFoYywgZGV2aW5mbywgYWxnKTsKKyAJYWhjX3NlbmRfYXN5bmMoYWhjLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsCisgCQkgICAgICAgZGV2aW5mby0+bHVuLCBBQ19UUkFOU0ZFUl9ORUcsICZhbGcpOworfQorCisvKgorICogV2hlbiB0aGUgdHJhbnNmZXIgc2V0dGluZ3MgZm9yIGEgY29ubmVjdGlvbiBjaGFuZ2UsIHVwZGF0ZSBhbnkKKyAqIGluLXRyYW5zaXQgU0NCcyB0byBjb250YWluIHRoZSBuZXcgZGF0YSBzbyB0aGUgaGFyZHdhcmUgd2lsbAorICogYmUgc2V0IGNvcnJlY3RseSBkdXJpbmcgZnV0dXJlIChyZSlzZWxlY3Rpb25zLgorICovCitzdGF0aWMgdm9pZAorYWhjX3VwZGF0ZV9wZW5kaW5nX3NjYnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXN0cnVjdAlzY2IgKnBlbmRpbmdfc2NiOworCWludAlwZW5kaW5nX3NjYl9jb3VudDsKKwlpbnQJaTsKKwlpbnQJcGF1c2VkOworCXVfaW50CXNhdmVkX3NjYnB0cjsKKworCS8qCisJICogVHJhdmVyc2UgdGhlIHBlbmRpbmcgU0NCIGxpc3QgYW5kIGVuc3VyZSB0aGF0IGFsbCBvZiB0aGUKKwkgKiBTQ0JzIHRoZXJlIGhhdmUgdGhlIHByb3BlciBzZXR0aW5ncy4KKwkgKi8KKwlwZW5kaW5nX3NjYl9jb3VudCA9IDA7CisJTElTVF9GT1JFQUNIKHBlbmRpbmdfc2NiLCAmYWhjLT5wZW5kaW5nX3NjYnMsIHBlbmRpbmdfbGlua3MpIHsKKwkJc3RydWN0IGFoY19kZXZpbmZvIGRldmluZm87CisJCXN0cnVjdCBoYXJkd2FyZV9zY2IgKnBlbmRpbmdfaHNjYjsKKwkJc3RydWN0IGFoY19pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQlzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCisJCWFoY19zY2JfZGV2aW5mbyhhaGMsICZkZXZpbmZvLCBwZW5kaW5nX3NjYik7CisJCXRpbmZvID0gYWhjX2ZldGNoX3RyYW5zaW5mbyhhaGMsIGRldmluZm8uY2hhbm5lbCwKKwkJCQkJICAgIGRldmluZm8ub3VyX3Njc2lpZCwKKwkJCQkJICAgIGRldmluZm8udGFyZ2V0LCAmdHN0YXRlKTsKKwkJcGVuZGluZ19oc2NiID0gcGVuZGluZ19zY2ItPmhzY2I7CisJCXBlbmRpbmdfaHNjYi0+Y29udHJvbCAmPSB+VUxUUkFFTkI7CisJCWlmICgodHN0YXRlLT51bHRyYWVuYiAmIGRldmluZm8udGFyZ2V0X21hc2spICE9IDApCisJCQlwZW5kaW5nX2hzY2ItPmNvbnRyb2wgfD0gVUxUUkFFTkI7CisJCXBlbmRpbmdfaHNjYi0+c2NzaXJhdGUgPSB0aW5mby0+c2NzaXJhdGU7CisJCXBlbmRpbmdfaHNjYi0+c2NzaW9mZnNldCA9IHRpbmZvLT5jdXJyLm9mZnNldDsKKwkJaWYgKCh0c3RhdGUtPmF1dG9fbmVnb3RpYXRlICYgZGV2aW5mby50YXJnZXRfbWFzaykgPT0gMAorCQkgJiYgKHBlbmRpbmdfc2NiLT5mbGFncyAmIFNDQl9BVVRPX05FR09USUFURSkgIT0gMCkgeworCQkJcGVuZGluZ19zY2ItPmZsYWdzICY9IH5TQ0JfQVVUT19ORUdPVElBVEU7CisJCQlwZW5kaW5nX2hzY2ItPmNvbnRyb2wgJj0gfk1LX01FU1NBR0U7CisJCX0KKwkJYWhjX3N5bmNfc2NiKGFoYywgcGVuZGluZ19zY2IsCisJCQkgICAgIEJVU19ETUFTWU5DX1BSRVJFQUR8QlVTX0RNQVNZTkNfUFJFV1JJVEUpOworCQlwZW5kaW5nX3NjYl9jb3VudCsrOworCX0KKworCWlmIChwZW5kaW5nX3NjYl9jb3VudCA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAoYWhjX2lzX3BhdXNlZChhaGMpKSB7CisJCXBhdXNlZCA9IDE7CisJfSBlbHNlIHsKKwkJcGF1c2VkID0gMDsKKwkJYWhjX3BhdXNlKGFoYyk7CisJfQorCisJc2F2ZWRfc2NicHRyID0gYWhjX2luYihhaGMsIFNDQlBUUik7CisJLyogRW5zdXJlIHRoYXQgdGhlIGhzY2JzIGRvd24gb24gdGhlIGNhcmQgbWF0Y2ggdGhlIG5ldyBpbmZvcm1hdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBhaGMtPnNjYl9kYXRhLT5tYXhoc2NiczsgaSsrKSB7CisJCXN0cnVjdAloYXJkd2FyZV9zY2IgKnBlbmRpbmdfaHNjYjsKKwkJdV9pbnQJY29udHJvbDsKKwkJdV9pbnQJc2NiX3RhZzsKKworCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgaSk7CisJCXNjYl90YWcgPSBhaGNfaW5iKGFoYywgU0NCX1RBRyk7CisJCXBlbmRpbmdfc2NiID0gYWhjX2xvb2t1cF9zY2IoYWhjLCBzY2JfdGFnKTsKKwkJaWYgKHBlbmRpbmdfc2NiID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlwZW5kaW5nX2hzY2IgPSBwZW5kaW5nX3NjYi0+aHNjYjsKKwkJY29udHJvbCA9IGFoY19pbmIoYWhjLCBTQ0JfQ09OVFJPTCk7CisJCWNvbnRyb2wgJj0gfihVTFRSQUVOQnxNS19NRVNTQUdFKTsKKwkJY29udHJvbCB8PSBwZW5kaW5nX2hzY2ItPmNvbnRyb2wgJiAoVUxUUkFFTkJ8TUtfTUVTU0FHRSk7CisJCWFoY19vdXRiKGFoYywgU0NCX0NPTlRST0wsIGNvbnRyb2wpOworCQlhaGNfb3V0YihhaGMsIFNDQl9TQ1NJUkFURSwgcGVuZGluZ19oc2NiLT5zY3NpcmF0ZSk7CisJCWFoY19vdXRiKGFoYywgU0NCX1NDU0lPRkZTRVQsIHBlbmRpbmdfaHNjYi0+c2NzaW9mZnNldCk7CisJfQorCWFoY19vdXRiKGFoYywgU0NCUFRSLCBzYXZlZF9zY2JwdHIpOworCisJaWYgKHBhdXNlZCA9PSAwKQorCQlhaGNfdW5wYXVzZShhaGMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQYXRoaW5nIEluZm9ybWF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FoY19mZXRjaF9kZXZpbmZvKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvKQoreworCXVfaW50CXNhdmVkX3Njc2lpZDsKKwlyb2xlX3QJcm9sZTsKKwlpbnQJb3VyX2lkOworCisJaWYgKGFoY19pbmIoYWhjLCBTU1RBVDApICYgVEFSR0VUKQorCQlyb2xlID0gUk9MRV9UQVJHRVQ7CisJZWxzZQorCQlyb2xlID0gUk9MRV9JTklUSUFUT1I7CisKKwlpZiAocm9sZSA9PSBST0xFX1RBUkdFVAorCSAmJiAoYWhjLT5mZWF0dXJlcyAmIEFIQ19NVUxUSV9USUQpICE9IDAKKwkgJiYgKGFoY19pbmIoYWhjLCBTRVFfRkxBR1MpCisgCSAgICYgKENNRFBIQVNFX1BFTkRJTkd8VEFSR19DTURfUEVORElOR3xOT19ESVNDT05ORUNUKSkgIT0gMCkgeworCQkvKiBXZSB3ZXJlIHNlbGVjdGVkLCBzbyBwdWxsIG91ciBpZCBmcm9tIFRBUkdJRElOICovCisJCW91cl9pZCA9IGFoY19pbmIoYWhjLCBUQVJHSURJTikgJiBPSUQ7CisJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisJCW91cl9pZCA9IGFoY19pbmIoYWhjLCBTQ1NJSURfVUxUUkEyKSAmIE9JRDsKKwllbHNlCisJCW91cl9pZCA9IGFoY19pbmIoYWhjLCBTQ1NJSUQpICYgT0lEOworCisJc2F2ZWRfc2NzaWlkID0gYWhjX2luYihhaGMsIFNBVkVEX1NDU0lJRCk7CisJYWhjX2NvbXBpbGVfZGV2aW5mbyhkZXZpbmZvLAorCQkJICAgIG91cl9pZCwKKwkJCSAgICBTQ1NJSURfVEFSR0VUKGFoYywgc2F2ZWRfc2NzaWlkKSwKKwkJCSAgICBhaGNfaW5iKGFoYywgU0FWRURfTFVOKSwKKwkJCSAgICBTQ1NJSURfQ0hBTk5FTChhaGMsIHNhdmVkX3Njc2lpZCksCisJCQkgICAgcm9sZSk7Cit9CisKK3N0cnVjdCBhaGNfcGhhc2VfdGFibGVfZW50cnkqCithaGNfbG9va3VwX3BoYXNlX2VudHJ5KGludCBwaGFzZSkKK3sKKwlzdHJ1Y3QgYWhjX3BoYXNlX3RhYmxlX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgYWhjX3BoYXNlX3RhYmxlX2VudHJ5ICpsYXN0X2VudHJ5OworCisJLyoKKwkgKiBudW1fcGhhc2VzIGRvZXNuJ3QgaW5jbHVkZSB0aGUgZGVmYXVsdCBlbnRyeSB3aGljaAorCSAqIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIHBoYXNlIGRvZXNuJ3QgbWF0Y2guCisJICovCisJbGFzdF9lbnRyeSA9ICZhaGNfcGhhc2VfdGFibGVbbnVtX3BoYXNlc107CisJZm9yIChlbnRyeSA9IGFoY19waGFzZV90YWJsZTsgZW50cnkgPCBsYXN0X2VudHJ5OyBlbnRyeSsrKSB7CisJCWlmIChwaGFzZSA9PSBlbnRyeS0+cGhhc2UpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIChlbnRyeSk7Cit9CisKK3ZvaWQKK2FoY19jb21waWxlX2RldmluZm8oc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLCB1X2ludCBvdXJfaWQsIHVfaW50IHRhcmdldCwKKwkJICAgIHVfaW50IGx1biwgY2hhciBjaGFubmVsLCByb2xlX3Qgcm9sZSkKK3sKKwlkZXZpbmZvLT5vdXJfc2NzaWlkID0gb3VyX2lkOworCWRldmluZm8tPnRhcmdldCA9IHRhcmdldDsKKwlkZXZpbmZvLT5sdW4gPSBsdW47CisJZGV2aW5mby0+dGFyZ2V0X29mZnNldCA9IHRhcmdldDsKKwlkZXZpbmZvLT5jaGFubmVsID0gY2hhbm5lbDsKKwlkZXZpbmZvLT5yb2xlID0gcm9sZTsKKwlpZiAoY2hhbm5lbCA9PSAnQicpCisJCWRldmluZm8tPnRhcmdldF9vZmZzZXQgKz0gODsKKwlkZXZpbmZvLT50YXJnZXRfbWFzayA9ICgweDAxIDw8IGRldmluZm8tPnRhcmdldF9vZmZzZXQpOworfQorCit2b2lkCithaGNfcHJpbnRfZGV2aW5mbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbykKK3sKKwlwcmludGYoIiVzOiVjOiVkOiVkOiAiLCBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLAorCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1bik7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfc2NiX2RldmluZm8oc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sCisJCXN0cnVjdCBzY2IgKnNjYikKK3sKKwlyb2xlX3QJcm9sZTsKKwlpbnQJb3VyX2lkOworCisJb3VyX2lkID0gU0NTSUlEX09VUl9JRChzY2ItPmhzY2ItPnNjc2lpZCk7CisJcm9sZSA9IFJPTEVfSU5JVElBVE9SOworCWlmICgoc2NiLT5mbGFncyAmIFNDQl9UQVJHRVRfU0NCKSAhPSAwKQorCQlyb2xlID0gUk9MRV9UQVJHRVQ7CisJYWhjX2NvbXBpbGVfZGV2aW5mbyhkZXZpbmZvLCBvdXJfaWQsIFNDQl9HRVRfVEFSR0VUKGFoYywgc2NiKSwKKwkJCSAgICBTQ0JfR0VUX0xVTihzY2IpLCBTQ0JfR0VUX0NIQU5ORUwoYWhjLCBzY2IpLCByb2xlKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqIE1lc3NhZ2UgUGhhc2UgUHJvY2Vzc2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FoY19hc3NlcnRfYXRuKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwl1X2ludCBzY3Npc2lnbzsKKworCXNjc2lzaWdvID0gQVROTzsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfRFQpID09IDApCisJCXNjc2lzaWdvIHw9IGFoY19pbmIoYWhjLCBTQ1NJU0lHSSk7CisJYWhjX291dGIoYWhjLCBTQ1NJU0lHTywgc2NzaXNpZ28pOworfQorCisvKgorICogV2hlbiBhbiBpbml0aWF0b3IgdHJhbnNhY3Rpb24gd2l0aCB0aGUgTUtfTUVTU0FHRSBmbGFnIGVpdGhlciByZWNvbm5lY3RzCisgKiBvciBlbnRlcnMgdGhlIGluaXRpYWwgbWVzc2FnZSBvdXQgcGhhc2UsIHdlIGFyZSBpbnRlcnJ1cHRlZC4gIEZpbGwgb3VyCisgKiBvdXRnb2luZyBtZXNzYWdlIGJ1ZmZlciB3aXRoIHRoZSBhcHByb3ByaWF0ZSBtZXNzYWdlIGFuZCBiZWdpbmcgaGFuZGluZworICogdGhlIG1lc3NhZ2UgcGhhc2UocykgbWFudWFsbHkuCisgKi8KK3N0YXRpYyB2b2lkCithaGNfc2V0dXBfaW5pdGlhdG9yX21zZ291dChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJCSAgIHN0cnVjdCBzY2IgKnNjYikKK3sKKwkvKgorCSAqIFRvIGZhY2lsaXRhdGUgYWRkaW5nIG11bHRpcGxlIG1lc3NhZ2VzIHRvZ2V0aGVyLAorCSAqIGVhY2ggcm91dGluZSBzaG91bGQgaW5jcmVtZW50IHRoZSBpbmRleCBhbmQgbGVuCisJICogdmFyaWFibGVzIGluc3RlYWQgb2Ygc2V0dGluZyB0aGVtIGV4cGxpY2l0bHkuCisJICovCisJYWhjLT5tc2dvdXRfaW5kZXggPSAwOworCWFoYy0+bXNnb3V0X2xlbiA9IDA7CisKKwlpZiAoKHNjYi0+ZmxhZ3MgJiBTQ0JfREVWSUNFX1JFU0VUKSA9PSAwCisJICYmIGFoY19pbmIoYWhjLCBNU0dfT1VUKSA9PSBNU0dfSURFTlRJRllGTEFHKSB7CisJCXVfaW50IGlkZW50aWZ5X21zZzsKKworCQlpZGVudGlmeV9tc2cgPSBNU0dfSURFTlRJRllGTEFHIHwgU0NCX0dFVF9MVU4oc2NiKTsKKwkJaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiBESVNDRU5CKSAhPSAwKQorCQkJaWRlbnRpZnlfbXNnIHw9IE1TR19JREVOVElGWV9ESVNDRkxBRzsKKwkJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gaWRlbnRpZnlfbXNnOworCQlhaGMtPm1zZ291dF9sZW4rKzsKKworCQlpZiAoKHNjYi0+aHNjYi0+Y29udHJvbCAmIFRBR19FTkIpICE9IDApIHsKKwkJCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9CisJCQkgICAgc2NiLT5oc2NiLT5jb250cm9sICYgKFRBR19FTkJ8U0NCX1RBR19UWVBFKTsKKwkJCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9IHNjYi0+aHNjYi0+dGFnOworCQkJYWhjLT5tc2dvdXRfbGVuICs9IDI7CisJCX0KKwl9CisKKwlpZiAoc2NiLT5mbGFncyAmIFNDQl9ERVZJQ0VfUkVTRVQpIHsKKwkJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gTVNHX0JVU19ERVZfUkVTRVQ7CisJCWFoYy0+bXNnb3V0X2xlbisrOworCQlhaGNfcHJpbnRfcGF0aChhaGMsIHNjYik7CisJCXByaW50ZigiQnVzIERldmljZSBSZXNldCBNZXNzYWdlIFNlbnRcbiIpOworCQkvKgorCQkgKiBDbGVhciBvdXIgc2VsZWN0aW9uIGhhcmR3YXJlIGluIGFkdmFuY2Ugb2YKKwkJICogdGhlIGJ1c2ZyZWUuICBXZSBtYXkgaGF2ZSBhbiBlbnRyeSBpbiB0aGUgd2FpdGluZworCQkgKiBRIGZvciB0aGlzIHRhcmdldCwgYW5kIHdlIGRvbid0IHdhbnQgdG8gZ28gYWJvdXQKKwkJICogc2VsZWN0aW5nIHdoaWxlIHdlIGhhbmRsZSB0aGUgYnVzZnJlZSBhbmQgYmxvdyBpdAorCQkgKiBhd2F5LgorCQkgKi8KKwkJYWhjX291dGIoYWhjLCBTQ1NJU0VRLCAoYWhjX2luYihhaGMsIFNDU0lTRVEpICYgfkVOU0VMTykpOworCX0gZWxzZSBpZiAoKHNjYi0+ZmxhZ3MgJiBTQ0JfQUJPUlQpICE9IDApIHsKKwkJaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiBUQUdfRU5CKSAhPSAwKQorCQkJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gTVNHX0FCT1JUX1RBRzsKKwkJZWxzZQorCQkJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gTVNHX0FCT1JUOworCQlhaGMtPm1zZ291dF9sZW4rKzsKKwkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOworCQlwcmludGYoIkFib3J0JXMgTWVzc2FnZSBTZW50XG4iLAorCQkgICAgICAgKHNjYi0+aHNjYi0+Y29udHJvbCAmIFRBR19FTkIpICE9IDAgPyAiIFRhZyIgOiAiIik7CisJCS8qCisJCSAqIENsZWFyIG91ciBzZWxlY3Rpb24gaGFyZHdhcmUgaW4gYWR2YW5jZSBvZgorCQkgKiB0aGUgYnVzZnJlZS4gIFdlIG1heSBoYXZlIGFuIGVudHJ5IGluIHRoZSB3YWl0aW5nCisJCSAqIFEgZm9yIHRoaXMgdGFyZ2V0LCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBnbyBhYm91dAorCQkgKiBzZWxlY3Rpbmcgd2hpbGUgd2UgaGFuZGxlIHRoZSBidXNmcmVlIGFuZCBibG93IGl0CisJCSAqIGF3YXkuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIFNDU0lTRVEsIChhaGNfaW5iKGFoYywgU0NTSVNFUSkgJiB+RU5TRUxPKSk7CisJfSBlbHNlIGlmICgoc2NiLT5mbGFncyAmIChTQ0JfQVVUT19ORUdPVElBVEV8U0NCX05FR09USUFURSkpICE9IDApIHsKKwkJYWhjX2J1aWxkX3RyYW5zZmVyX21zZyhhaGMsIGRldmluZm8pOworCX0gZWxzZSB7CisJCXByaW50ZigiYWhjX2ludHI6IEFXQUlUSU5HX01TRyBmb3IgYW4gU0NCIHRoYXQgIgorCQkgICAgICAgImRvZXMgbm90IGhhdmUgYSB3YWl0aW5nIG1lc3NhZ2VcbiIpOworCQlwcmludGYoIlNDU0lJRCA9ICV4LCB0YXJnZXRfbWFzayA9ICV4XG4iLCBzY2ItPmhzY2ItPnNjc2lpZCwKKwkJICAgICAgIGRldmluZm8tPnRhcmdldF9tYXNrKTsKKwkJcGFuaWMoIlNDQiA9ICVkLCBTQ0IgQ29udHJvbCA9ICV4LCBNU0dfT1VUID0gJXggIgorCQkgICAgICAiU0NCIGZsYWdzID0gJXgiLCBzY2ItPmhzY2ItPnRhZywgc2NiLT5oc2NiLT5jb250cm9sLAorCQkgICAgICBhaGNfaW5iKGFoYywgTVNHX09VVCksIHNjYi0+ZmxhZ3MpOworCX0KKworCS8qCisJICogQ2xlYXIgdGhlIE1LX01FU1NBR0UgZmxhZyBmcm9tIHRoZSBTQ0Igc28gd2UgYXJlbid0CisJICogYXNrZWQgdG8gc2VuZCB0aGlzIG1lc3NhZ2UgYWdhaW4uCisJICovCisJYWhjX291dGIoYWhjLCBTQ0JfQ09OVFJPTCwgYWhjX2luYihhaGMsIFNDQl9DT05UUk9MKSAmIH5NS19NRVNTQUdFKTsKKwlzY2ItPmhzY2ItPmNvbnRyb2wgJj0gfk1LX01FU1NBR0U7CisJYWhjLT5tc2dvdXRfaW5kZXggPSAwOworCWFoYy0+bXNnX3R5cGUgPSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHT1VUOworfQorCisvKgorICogQnVpbGQgYW4gYXBwcm9wcmlhdGUgdHJhbnNmZXIgbmVnb3RpYXRpb24gbWVzc2FnZSBmb3IgdGhlCisgKiBjdXJyZW50bHkgYWN0aXZlIHRhcmdldC4KKyAqLworc3RhdGljIHZvaWQKK2FoY19idWlsZF90cmFuc2Zlcl9tc2coc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pCit7CisJLyoKKwkgKiBXZSBuZWVkIHRvIGluaXRpYXRlIHRyYW5zZmVyIG5lZ290aWF0aW9ucy4KKwkgKiBJZiBvdXIgY3VycmVudCBhbmQgZ29hbCBzZXR0aW5ncyBhcmUgaWRlbnRpY2FsLAorCSAqIHdlIHdhbnQgdG8gcmVuZWdvdGlhdGUgZHVlIHRvIGEgY2hlY2sgY29uZGl0aW9uLgorCSAqLworCXN0cnVjdAlhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QJYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXN0cnVjdAlhaGNfc3luY3JhdGUgKnJhdGU7CisJaW50CWRvd2lkZTsKKwlpbnQJZG9zeW5jOworCWludAlkb3BwcjsKKwl1X2ludAlwZXJpb2Q7CisJdV9pbnQJcHByX29wdGlvbnM7CisJdV9pbnQJb2Zmc2V0OworCisJdGluZm8gPSBhaGNfZmV0Y2hfdHJhbnNpbmZvKGFoYywgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+b3VyX3Njc2lpZCwKKwkJCQkgICAgZGV2aW5mby0+dGFyZ2V0LCAmdHN0YXRlKTsKKwkvKgorCSAqIEZpbHRlciBvdXIgcGVyaW9kIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24uCisJICogSWYgd2UgY2FuJ3QgcGVyZm9ybSBEVCB0cmFuc2ZlcnMgb24gdGhpcyBzZWdtZW50IChub3QgaW4gTFZECisJICogbW9kZSBmb3IgaW5zdGFuY2UpLCB0aGVuIG91ciBkZWNpc2lvbiB0byBpc3N1ZSBhIFBQUiBtZXNzYWdlCisJICogbWF5IGNoYW5nZS4KKwkgKi8KKwlwZXJpb2QgPSB0aW5mby0+Z29hbC5wZXJpb2Q7CisJb2Zmc2V0ID0gdGluZm8tPmdvYWwub2Zmc2V0OworCXBwcl9vcHRpb25zID0gdGluZm8tPmdvYWwucHByX29wdGlvbnM7CisJLyogVGFyZ2V0IGluaXRpYXRlZCBQUFIgaXMgbm90IGFsbG93ZWQgaW4gdGhlIFNDU0kgc3BlYyAqLworCWlmIChkZXZpbmZvLT5yb2xlID09IFJPTEVfVEFSR0VUKQorCQlwcHJfb3B0aW9ucyA9IDA7CisJcmF0ZSA9IGFoY19kZXZsaW1pdGVkX3N5bmNyYXRlKGFoYywgdGluZm8sICZwZXJpb2QsCisJCQkJICAgICAgICZwcHJfb3B0aW9ucywgZGV2aW5mby0+cm9sZSk7CisJZG93aWRlID0gdGluZm8tPmN1cnIud2lkdGggIT0gdGluZm8tPmdvYWwud2lkdGg7CisJZG9zeW5jID0gdGluZm8tPmN1cnIub2Zmc2V0ICE9IG9mZnNldCB8fCB0aW5mby0+Y3Vyci5wZXJpb2QgIT0gcGVyaW9kOworCS8qCisJICogT25seSB1c2UgUFBSIGlmIHdlIGhhdmUgb3B0aW9ucyB0aGF0IG5lZWQgaXQsIGV2ZW4gaWYgdGhlIGRldmljZQorCSAqIGNsYWltcyB0byBzdXBwb3J0IGl0LiAgVGhlcmUgbWlnaHQgYmUgYW4gZXhwYW5kZXIgaW4gdGhlIHdheQorCSAqIHRoYXQgZG9lc24ndC4KKwkgKi8KKwlkb3BwciA9IHBwcl9vcHRpb25zICE9IDA7CisKKwlpZiAoIWRvd2lkZSAmJiAhZG9zeW5jICYmICFkb3BwcikgeworCQlkb3dpZGUgPSB0aW5mby0+Z29hbC53aWR0aCAhPSBNU0dfRVhUX1dEVFJfQlVTXzhfQklUOworCQlkb3N5bmMgPSB0aW5mby0+Z29hbC5vZmZzZXQgIT0gMDsKKwl9CisKKwlpZiAoIWRvd2lkZSAmJiAhZG9zeW5jICYmICFkb3BwcikgeworCQkvKgorCQkgKiBGb3JjZSBhc3luYyB3aXRoIGEgV0RUUiBtZXNzYWdlIGlmIHdlIGhhdmUgYSB3aWRlIGJ1cywKKwkJICogb3IganVzdCBpc3N1ZSBhbiBTRFRSIHdpdGggYSAwIG9mZnNldC4KKwkJICovCisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSAhPSAwKQorCQkJZG93aWRlID0gMTsKKwkJZWxzZQorCQkJZG9zeW5jID0gMTsKKworCQlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJCWFoY19wcmludF9kZXZpbmZvKGFoYywgZGV2aW5mbyk7CisJCQlwcmludGYoIkVuc3VyaW5nIGFzeW5jXG4iKTsKKwkJfQorCX0KKworCS8qIFRhcmdldCBpbml0aWF0ZWQgUFBSIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBTQ1NJIHNwZWMgKi8KKwlpZiAoZGV2aW5mby0+cm9sZSA9PSBST0xFX1RBUkdFVCkKKwkJZG9wcHIgPSAwOworCisJLyoKKwkgKiBCb3RoIHRoZSBQUFIgbWVzc2FnZSBhbmQgU0RUUiBtZXNzYWdlIHJlcXVpcmUgdGhlCisJICogZ29hbCBzeW5jcmF0ZSB0byBiZSBsaW1pdGVkIHRvIHdoYXQgdGhlIHRhcmdldCBkZXZpY2UKKwkgKiBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIChiYXNlZCBvbiB3aGV0aGVyIGFuIExWRC0+U0UKKwkgKiBleHBhbmRlciBpcyBvbiB0aGUgYnVzKSwgc28gY29tYmluZSB0aGVzZSB0d28gY2FzZXMuCisJICogUmVnYXJkbGVzcywgZ3VhcmFudGVlIHRoYXQgaWYgd2UgYXJlIHVzaW5nIFdEVFIgYW5kIFNEVFIKKwkgKiBtZXNzYWdlcyB0aGF0IFdEVFIgY29tZXMgZmlyc3QuCisJICovCisJaWYgKGRvcHByIHx8IChkb3N5bmMgJiYgIWRvd2lkZSkpIHsKKworCQlvZmZzZXQgPSB0aW5mby0+Z29hbC5vZmZzZXQ7CisJCWFoY192YWxpZGF0ZV9vZmZzZXQoYWhjLCB0aW5mbywgcmF0ZSwgJm9mZnNldCwKKwkJCQkgICAgZG9wcHIgPyB0aW5mby0+Z29hbC53aWR0aAorCQkJCQkgIDogdGluZm8tPmN1cnIud2lkdGgsCisJCQkJICAgIGRldmluZm8tPnJvbGUpOworCQlpZiAoZG9wcHIpIHsKKwkJCWFoY19jb25zdHJ1Y3RfcHByKGFoYywgZGV2aW5mbywgcGVyaW9kLCBvZmZzZXQsCisJCQkJCSAgdGluZm8tPmdvYWwud2lkdGgsIHBwcl9vcHRpb25zKTsKKwkJfSBlbHNlIHsKKwkJCWFoY19jb25zdHJ1Y3Rfc2R0cihhaGMsIGRldmluZm8sIHBlcmlvZCwgb2Zmc2V0KTsKKwkJfQorCX0gZWxzZSB7CisJCWFoY19jb25zdHJ1Y3Rfd2R0cihhaGMsIGRldmluZm8sIHRpbmZvLT5nb2FsLndpZHRoKTsKKwl9Cit9CisKKy8qCisgKiBCdWlsZCBhIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uIG1lc3NhZ2UgaW4gb3VyIG1lc3NhZ2UKKyAqIGJ1ZmZlciBiYXNlZCBvbiB0aGUgaW5wdXQgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIHZvaWQKK2FoY19jb25zdHJ1Y3Rfc2R0cihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJICAgdV9pbnQgcGVyaW9kLCB1X2ludCBvZmZzZXQpCit7CisJaWYgKG9mZnNldCA9PSAwKQorCQlwZXJpb2QgPSBBSENfQVNZTkNfWEZFUl9QRVJJT0Q7CisJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gTVNHX0VYVEVOREVEOworCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9IE1TR19FWFRfU0RUUl9MRU47CisJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gTVNHX0VYVF9TRFRSOworCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9IHBlcmlvZDsKKwlhaGMtPm1zZ291dF9idWZbYWhjLT5tc2dvdXRfaW5kZXgrK10gPSBvZmZzZXQ7CisJYWhjLT5tc2dvdXRfbGVuICs9IDU7CisJaWYgKGJvb3R2ZXJib3NlKSB7CisJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogU2VuZGluZyBTRFRSIHBlcmlvZCAleCwgb2Zmc2V0ICV4XG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAorCQkgICAgICAgZGV2aW5mby0+bHVuLCBwZXJpb2QsIG9mZnNldCk7CisJfQorfQorCisvKgorICogQnVpbGQgYSB3aWRlIG5lZ290aWF0aW9uIG1lc3NhZ2UgaW4gb3VyIG1lc3NhZ2UKKyAqIGJ1ZmZlciBiYXNlZCBvbiB0aGUgaW5wdXQgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIHZvaWQKK2FoY19jb25zdHJ1Y3Rfd2R0cihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJICAgdV9pbnQgYnVzX3dpZHRoKQoreworCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9IE1TR19FWFRFTkRFRDsKKwlhaGMtPm1zZ291dF9idWZbYWhjLT5tc2dvdXRfaW5kZXgrK10gPSBNU0dfRVhUX1dEVFJfTEVOOworCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9IE1TR19FWFRfV0RUUjsKKwlhaGMtPm1zZ291dF9idWZbYWhjLT5tc2dvdXRfaW5kZXgrK10gPSBidXNfd2lkdGg7CisJYWhjLT5tc2dvdXRfbGVuICs9IDQ7CisJaWYgKGJvb3R2ZXJib3NlKSB7CisJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogU2VuZGluZyBXRFRSICV4XG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAorCQkgICAgICAgZGV2aW5mby0+bHVuLCBidXNfd2lkdGgpOworCX0KK30KKworLyoKKyAqIEJ1aWxkIGEgcGFyYWxsZWwgcHJvdG9jb2wgcmVxdWVzdCBtZXNzYWdlIGluIG91ciBtZXNzYWdlCisgKiBidWZmZXIgYmFzZWQgb24gdGhlIGlucHV0IHBhcmFtZXRlcnMuCisgKi8KK3N0YXRpYyB2b2lkCithaGNfY29uc3RydWN0X3BwcihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJICB1X2ludCBwZXJpb2QsIHVfaW50IG9mZnNldCwgdV9pbnQgYnVzX3dpZHRoLAorCQkgIHVfaW50IHBwcl9vcHRpb25zKQoreworCWlmIChvZmZzZXQgPT0gMCkKKwkJcGVyaW9kID0gQUhDX0FTWU5DX1hGRVJfUEVSSU9EOworCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9IE1TR19FWFRFTkRFRDsKKwlhaGMtPm1zZ291dF9idWZbYWhjLT5tc2dvdXRfaW5kZXgrK10gPSBNU0dfRVhUX1BQUl9MRU47CisJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gTVNHX0VYVF9QUFI7CisJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gcGVyaW9kOworCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9IDA7CisJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gb2Zmc2V0OworCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9IGJ1c193aWR0aDsKKwlhaGMtPm1zZ291dF9idWZbYWhjLT5tc2dvdXRfaW5kZXgrK10gPSBwcHJfb3B0aW9uczsKKwlhaGMtPm1zZ291dF9sZW4gKz0gODsKKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBTZW5kaW5nIFBQUiBidXNfd2lkdGggJXgsIHBlcmlvZCAleCwgIgorCQkgICAgICAgIm9mZnNldCAleCwgcHByX29wdGlvbnMgJXhcbiIsIGFoY19uYW1lKGFoYyksCisJCSAgICAgICBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1biwKKwkJICAgICAgIGJ1c193aWR0aCwgcGVyaW9kLCBvZmZzZXQsIHBwcl9vcHRpb25zKTsKKwl9Cit9CisKKy8qCisgKiBDbGVhciBhbnkgYWN0aXZlIG1lc3NhZ2Ugc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkCithaGNfY2xlYXJfbXNnX3N0YXRlKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlhaGMtPm1zZ291dF9sZW4gPSAwOworCWFoYy0+bXNnaW5faW5kZXggPSAwOworCWFoYy0+bXNnX3R5cGUgPSBNU0dfVFlQRV9OT05FOworCWlmICgoYWhjX2luYihhaGMsIFNDU0lTSUdJKSAmIEFUTkkpICE9IDApIHsKKwkJLyoKKwkJICogVGhlIHRhcmdldCBkaWRuJ3QgY2FyZSB0byByZXNwb25kIHRvIG91cgorCQkgKiBtZXNzYWdlIHJlcXVlc3QsIHNvIGNsZWFyIEFUTi4KKwkJICovCisJCWFoY19vdXRiKGFoYywgQ0xSU0lOVDEsIENMUkFUTk8pOworCX0KKwlhaGNfb3V0YihhaGMsIE1TR19PVVQsIE1TR19OT09QKTsKKwlhaGNfb3V0YihhaGMsIFNFUV9GTEFHUzIsCisJCSBhaGNfaW5iKGFoYywgU0VRX0ZMQUdTMikgJiB+VEFSR0VUX01TR19QRU5ESU5HKTsKK30KKworc3RhdGljIHZvaWQKK2FoY19oYW5kbGVfcHJvdG9fdmlvbGF0aW9uKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlzdHJ1Y3QJYWhjX2RldmluZm8gZGV2aW5mbzsKKwlzdHJ1Y3QJc2NiICpzY2I7CisJdV9pbnQJc2NiaWQ7CisJdV9pbnQJc2VxX2ZsYWdzOworCXVfaW50CWN1cnBoYXNlOworCXVfaW50CWxhc3RwaGFzZTsKKwlpbnQJZm91bmQ7CisKKwlhaGNfZmV0Y2hfZGV2aW5mbyhhaGMsICZkZXZpbmZvKTsKKwlzY2JpZCA9IGFoY19pbmIoYWhjLCBTQ0JfVEFHKTsKKwlzY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIHNjYmlkKTsKKwlzZXFfZmxhZ3MgPSBhaGNfaW5iKGFoYywgU0VRX0ZMQUdTKTsKKwljdXJwaGFzZSA9IGFoY19pbmIoYWhjLCBTQ1NJU0lHSSkgJiBQSEFTRV9NQVNLOworCWxhc3RwaGFzZSA9IGFoY19pbmIoYWhjLCBMQVNUUEhBU0UpOworCWlmICgoc2VxX2ZsYWdzICYgTk9UX0lERU5USUZJRUQpICE9IDApIHsKKworCQkvKgorCQkgKiBUaGUgcmVjb25uZWN0aW5nIHRhcmdldCBlaXRoZXIgZGlkIG5vdCBzZW5kIGFuCisJCSAqIGlkZW50aWZ5IG1lc3NhZ2UsIG9yIGRpZCwgYnV0IHdlIGRpZG4ndCBmaW5kIGFuIFNDQgorCQkgKiB0byBtYXRjaC4KKwkJICovCisJCWFoY19wcmludF9kZXZpbmZvKGFoYywgJmRldmluZm8pOworCQlwcmludGYoIlRhcmdldCBkaWQgbm90IHNlbmQgYW4gSURFTlRJRlkgbWVzc2FnZS4gIgorCQkgICAgICAgIkxBU1RQSEFTRSA9IDB4JXguXG4iLCBsYXN0cGhhc2UpOworCQlzY2IgPSBOVUxMOworCX0gZWxzZSBpZiAoc2NiID09IE5VTEwpIHsKKwkJLyoKKwkJICogV2UgZG9uJ3Qgc2VlbSB0byBoYXZlIGFuIFNDQiBhY3RpdmUgZm9yIHRoaXMKKwkJICogdHJhbnNhY3Rpb24uICBQcmludCBhbiBlcnJvciBhbmQgcmVzZXQgdGhlIGJ1cy4KKwkJICovCisJCWFoY19wcmludF9kZXZpbmZvKGFoYywgJmRldmluZm8pOworCQlwcmludGYoIk5vIFNDQiBmb3VuZCBkdXJpbmcgcHJvdG9jb2wgdmlvbGF0aW9uXG4iKTsKKwkJZ290byBwcm90b192aW9sYXRpb25fcmVzZXQ7CisJfSBlbHNlIHsKKwkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fU0VRVUVOQ0VfRkFJTCk7CisJCWlmICgoc2VxX2ZsYWdzICYgTk9fQ0RCX1NFTlQpICE9IDApIHsKKwkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKKwkJCXByaW50ZigiTm8gb3IgaW5jb21wbGV0ZSBDREIgc2VudCB0byBkZXZpY2UuXG4iKTsKKwkJfSBlbHNlIGlmICgoYWhjX2luYihhaGMsIFNDQl9DT05UUk9MKSAmIFNUQVRVU19SQ1ZEKSA9PSAwKSB7CisJCQkvKgorCQkJICogVGhlIHRhcmdldCBuZXZlciBib3RoZXJlZCB0byBwcm92aWRlIHN0YXR1cyB0bworCQkJICogdXMgcHJpb3IgdG8gY29tcGxldGluZyB0aGUgY29tbWFuZC4gIFNpbmNlIHdlIGRvbid0CisJCQkgKiBrbm93IHRoZSBkaXNwb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQsIHdlIG11c3QgYXR0ZW1wdAorCQkJICogdG8gYWJvcnQgaXQuICBBc3NlcnQgQVROIGFuZCBwcmVwYXJlIHRvIHNlbmQgYW4gYWJvcnQKKwkJCSAqIG1lc3NhZ2UuCisJCQkgKi8KKwkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKKwkJCXByaW50ZigiQ29tcGxldGVkIGNvbW1hbmQgd2l0aG91dCBzdGF0dXMuXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKKwkJCXByaW50ZigiVW5rbm93biBwcm90b2NvbCB2aW9sYXRpb24uXG4iKTsKKwkJCWFoY19kdW1wX2NhcmRfc3RhdGUoYWhjKTsKKwkJfQorCX0KKwlpZiAoKGxhc3RwaGFzZSAmIH5QX0RBVEFJTl9EVCkgPT0gMAorCSB8fCBsYXN0cGhhc2UgPT0gUF9DT01NQU5EKSB7Citwcm90b192aW9sYXRpb25fcmVzZXQ6CisJCS8qCisJCSAqIFRhcmdldCBlaXRoZXIgd2VudCBkaXJlY3RseSB0byBkYXRhL2NvbW1hbmQKKwkJICogcGhhc2Ugb3IgZGlkbid0IHJlc3BvbmQgdG8gb3VyIEFUTi4KKwkJICogVGhlIG9ubHkgc2FmZSB0aGluZyB0byBkbyBpcyB0byBibG93CisJCSAqIGl0IGF3YXkgd2l0aCBhIGJ1cyByZXNldC4KKwkJICovCisJCWZvdW5kID0gYWhjX3Jlc2V0X2NoYW5uZWwoYWhjLCAnQScsIFRSVUUpOworCQlwcmludGYoIiVzOiBJc3N1ZWQgQ2hhbm5lbCAlYyBCdXMgUmVzZXQuICIKKwkJICAgICAgICIlZCBTQ0JzIGFib3J0ZWRcbiIsIGFoY19uYW1lKGFoYyksICdBJywgZm91bmQpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIExlYXZlIHRoZSBzZWxlY3Rpb24gaGFyZHdhcmUgb2ZmIGluIGNhc2UKKwkJICogdGhpcyBhYm9ydCBhdHRlbXB0IHdpbGwgYWZmZWN0IHlldCB0bworCQkgKiBiZSBzZW50IGNvbW1hbmRzLgorCQkgKi8KKwkJYWhjX291dGIoYWhjLCBTQ1NJU0VRLAorCQkJIGFoY19pbmIoYWhjLCBTQ1NJU0VRKSAmIH5FTlNFTE8pOworCQlhaGNfYXNzZXJ0X2F0bihhaGMpOworCQlhaGNfb3V0YihhaGMsIE1TR19PVVQsIEhPU1RfTVNHKTsKKwkJaWYgKHNjYiA9PSBOVUxMKSB7CisJCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsICZkZXZpbmZvKTsKKwkJCWFoYy0+bXNnb3V0X2J1ZlswXSA9IE1TR19BQk9SVF9UQVNLOworCQkJYWhjLT5tc2dvdXRfbGVuID0gMTsKKwkJCWFoYy0+bXNnb3V0X2luZGV4ID0gMDsKKwkJCWFoYy0+bXNnX3R5cGUgPSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHT1VUOworCQl9IGVsc2UgeworCQkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOworCQkJc2NiLT5mbGFncyB8PSBTQ0JfQUJPUlQ7CisJCX0KKwkJcHJpbnRmKCJQcm90b2NvbCB2aW9sYXRpb24gJXMuICBBdHRlbXB0aW5nIHRvIGFib3J0LlxuIiwKKwkJICAgICAgIGFoY19sb29rdXBfcGhhc2VfZW50cnkoY3VycGhhc2UpLT5waGFzZW1zZyk7CisJfQorfQorCisvKgorICogTWFudWFsIG1lc3NhZ2UgbG9vcCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZAorYWhjX2hhbmRsZV9tZXNzYWdlX3BoYXNlKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sgCisJc3RydWN0CWFoY19kZXZpbmZvIGRldmluZm87CisJdV9pbnQJYnVzX3BoYXNlOworCWludAllbmRfc2Vzc2lvbjsKKworCWFoY19mZXRjaF9kZXZpbmZvKGFoYywgJmRldmluZm8pOworCWVuZF9zZXNzaW9uID0gRkFMU0U7CisJYnVzX3BoYXNlID0gYWhjX2luYihhaGMsIFNDU0lTSUdJKSAmIFBIQVNFX01BU0s7CisKK3Jlc3dpdGNoOgorCXN3aXRjaCAoYWhjLT5tc2dfdHlwZSkgeworCWNhc2UgTVNHX1RZUEVfSU5JVElBVE9SX01TR09VVDoKKwl7CisJCWludCBsYXN0Ynl0ZTsKKwkJaW50IHBoYXNlbWlzOworCQlpbnQgbXNnZG9uZTsKKworCQlpZiAoYWhjLT5tc2dvdXRfbGVuID09IDApCisJCQlwYW5pYygiSE9TVF9NU0dfTE9PUCBpbnRlcnJ1cHQgd2l0aCBubyBhY3RpdmUgbWVzc2FnZSIpOworCisjaWZkZWYgQUhDX0RFQlVHCisJCWlmICgoYWhjX2RlYnVnICYgQUhDX1NIT1dfTUVTU0FHRVMpICE9IDApIHsKKwkJCWFoY19wcmludF9kZXZpbmZvKGFoYywgJmRldmluZm8pOworCQkJcHJpbnRmKCJJTklUSUFUT1JfTVNHX09VVCIpOworCQl9CisjZW5kaWYKKwkJcGhhc2VtaXMgPSBidXNfcGhhc2UgIT0gUF9NRVNHT1VUOworCQlpZiAocGhhc2VtaXMpIHsKKyNpZmRlZiBBSENfREVCVUcKKwkJCWlmICgoYWhjX2RlYnVnICYgQUhDX1NIT1dfTUVTU0FHRVMpICE9IDApIHsKKwkJCQlwcmludGYoIiBQSEFTRU1JUyAlc1xuIiwKKwkJCQkgICAgICAgYWhjX2xvb2t1cF9waGFzZV9lbnRyeShidXNfcGhhc2UpCisJCQkJCQkJICAgICAtPnBoYXNlbXNnKTsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKGJ1c19waGFzZSA9PSBQX01FU0dJTikgeworCQkJCS8qCisJCQkJICogQ2hhbmdlIGdlYXJzIGFuZCBzZWUgaWYKKwkJCQkgKiB0aGlzIG1lc3NhZ2VzIGlzIG9mIGludGVyZXN0IHRvCisJCQkJICogdXMgb3Igc2hvdWxkIGJlIHBhc3NlZCBiYWNrIHRvCisJCQkJICogdGhlIHNlcXVlbmNlci4KKwkJCQkgKi8KKwkJCQlhaGNfb3V0YihhaGMsIENMUlNJTlQxLCBDTFJBVE5PKTsKKwkJCQlhaGMtPnNlbmRfbXNnX3BlcnJvciA9IEZBTFNFOworCQkJCWFoYy0+bXNnX3R5cGUgPSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHSU47CisJCQkJYWhjLT5tc2dpbl9pbmRleCA9IDA7CisJCQkJZ290byByZXN3aXRjaDsKKwkJCX0KKwkJCWVuZF9zZXNzaW9uID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGFoYy0+c2VuZF9tc2dfcGVycm9yKSB7CisJCQlhaGNfb3V0YihhaGMsIENMUlNJTlQxLCBDTFJBVE5PKTsKKwkJCWFoY19vdXRiKGFoYywgQ0xSU0lOVDEsIENMUlJFUUlOSVQpOworI2lmZGVmIEFIQ19ERUJVRworCQkJaWYgKChhaGNfZGVidWcgJiBBSENfU0hPV19NRVNTQUdFUykgIT0gMCkKKwkJCQlwcmludGYoIiBieXRlIDB4JXhcbiIsIGFoYy0+c2VuZF9tc2dfcGVycm9yKTsKKyNlbmRpZgorCQkJYWhjX291dGIoYWhjLCBTQ1NJREFUTCwgTVNHX1BBUklUWV9FUlJPUik7CisJCQlicmVhazsKKwkJfQorCisJCW1zZ2RvbmUJPSBhaGMtPm1zZ291dF9pbmRleCA9PSBhaGMtPm1zZ291dF9sZW47CisJCWlmIChtc2dkb25lKSB7CisJCQkvKgorCQkJICogVGhlIHRhcmdldCBoYXMgcmVxdWVzdGVkIGEgcmV0cnkuCisJCQkgKiBSZS1hc3NlcnQgQVROLCByZXNldCBvdXIgbWVzc2FnZSBpbmRleCB0bworCQkJICogMCwgYW5kIHRyeSBhZ2Fpbi4KKwkJCSAqLworCQkJYWhjLT5tc2dvdXRfaW5kZXggPSAwOworCQkJYWhjX2Fzc2VydF9hdG4oYWhjKTsKKwkJfQorCisJCWxhc3RieXRlID0gYWhjLT5tc2dvdXRfaW5kZXggPT0gKGFoYy0+bXNnb3V0X2xlbiAtIDEpOworCQlpZiAobGFzdGJ5dGUpIHsKKwkJCS8qIExhc3QgYnl0ZSBpcyBzaWduaWZpZWQgYnkgZHJvcHBpbmcgQVROICovCisJCQlhaGNfb3V0YihhaGMsIENMUlNJTlQxLCBDTFJBVE5PKTsKKwkJfQorCisJCS8qCisJCSAqIENsZWFyIG91ciBpbnRlcnJ1cHQgc3RhdHVzIGFuZCBwcmVzZW50CisJCSAqIHRoZSBuZXh0IGJ5dGUgb24gdGhlIGJ1cy4KKwkJICovCisJCWFoY19vdXRiKGFoYywgQ0xSU0lOVDEsIENMUlJFUUlOSVQpOworI2lmZGVmIEFIQ19ERUJVRworCQlpZiAoKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX01FU1NBR0VTKSAhPSAwKQorCQkJcHJpbnRmKCIgYnl0ZSAweCV4XG4iLAorCQkJICAgICAgIGFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleF0pOworI2VuZGlmCisJCWFoY19vdXRiKGFoYywgU0NTSURBVEwsIGFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSk7CisJCWJyZWFrOworCX0KKwljYXNlIE1TR19UWVBFX0lOSVRJQVRPUl9NU0dJTjoKKwl7CisJCWludCBwaGFzZW1pczsKKwkJaW50IG1lc3NhZ2VfZG9uZTsKKworI2lmZGVmIEFIQ19ERUJVRworCQlpZiAoKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX01FU1NBR0VTKSAhPSAwKSB7CisJCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsICZkZXZpbmZvKTsKKwkJCXByaW50ZigiSU5JVElBVE9SX01TR19JTiIpOworCQl9CisjZW5kaWYKKwkJcGhhc2VtaXMgPSBidXNfcGhhc2UgIT0gUF9NRVNHSU47CisJCWlmIChwaGFzZW1pcykgeworI2lmZGVmIEFIQ19ERUJVRworCQkJaWYgKChhaGNfZGVidWcgJiBBSENfU0hPV19NRVNTQUdFUykgIT0gMCkgeworCQkJCXByaW50ZigiIFBIQVNFTUlTICVzXG4iLAorCQkJCSAgICAgICBhaGNfbG9va3VwX3BoYXNlX2VudHJ5KGJ1c19waGFzZSkKKwkJCQkJCQkgICAgIC0+cGhhc2Vtc2cpOworCQkJfQorI2VuZGlmCisJCQlhaGMtPm1zZ2luX2luZGV4ID0gMDsKKwkJCWlmIChidXNfcGhhc2UgPT0gUF9NRVNHT1VUCisJCQkgJiYgKGFoYy0+c2VuZF9tc2dfcGVycm9yID09IFRSVUUKKwkJCSAgfHwgKGFoYy0+bXNnb3V0X2xlbiAhPSAwCisJCQkgICAmJiBhaGMtPm1zZ291dF9pbmRleCA9PSAwKSkpIHsKKwkJCQlhaGMtPm1zZ190eXBlID0gTVNHX1RZUEVfSU5JVElBVE9SX01TR09VVDsKKwkJCQlnb3RvIHJlc3dpdGNoOworCQkJfQorCQkJZW5kX3Nlc3Npb24gPSBUUlVFOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBQdWxsIHRoZSBieXRlIGluIHdpdGhvdXQgYWNraW5nIGl0ICovCisJCWFoYy0+bXNnaW5fYnVmW2FoYy0+bXNnaW5faW5kZXhdID0gYWhjX2luYihhaGMsIFNDU0lCVVNMKTsKKyNpZmRlZiBBSENfREVCVUcKKwkJaWYgKChhaGNfZGVidWcgJiBBSENfU0hPV19NRVNTQUdFUykgIT0gMCkKKwkJCXByaW50ZigiIGJ5dGUgMHgleFxuIiwKKwkJCSAgICAgICBhaGMtPm1zZ2luX2J1ZlthaGMtPm1zZ2luX2luZGV4XSk7CisjZW5kaWYKKworCQltZXNzYWdlX2RvbmUgPSBhaGNfcGFyc2VfbXNnKGFoYywgJmRldmluZm8pOworCisJCWlmIChtZXNzYWdlX2RvbmUpIHsKKwkJCS8qCisJCQkgKiBDbGVhciBvdXIgaW5jb21pbmcgbWVzc2FnZSBidWZmZXIgaW4gY2FzZSB0aGVyZQorCQkJICogaXMgYW5vdGhlciBtZXNzYWdlIGZvbGxvd2luZyB0aGlzIG9uZS4KKwkJCSAqLworCQkJYWhjLT5tc2dpbl9pbmRleCA9IDA7CisKKwkJCS8qCisJCQkgKiBJZiB0aGlzIG1lc3NhZ2UgaWxsaWNpdGVkIGEgcmVzcG9uc2UsCisJCQkgKiBhc3NlcnQgQVROIHNvIHRoZSB0YXJnZXQgdGFrZXMgdXMgdG8gdGhlCisJCQkgKiBtZXNzYWdlIG91dCBwaGFzZS4KKwkJCSAqLworCQkJaWYgKGFoYy0+bXNnb3V0X2xlbiAhPSAwKSB7CisjaWZkZWYgQUhDX0RFQlVHCisJCQkJaWYgKChhaGNfZGVidWcgJiBBSENfU0hPV19NRVNTQUdFUykgIT0gMCkgeworCQkJCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsICZkZXZpbmZvKTsKKwkJCQkJcHJpbnRmKCJBc3NlcnRpbmcgQVROIGZvciByZXNwb25zZVxuIik7CisJCQkJfQorI2VuZGlmCisJCQkJYWhjX2Fzc2VydF9hdG4oYWhjKTsKKwkJCX0KKwkJfSBlbHNlIAorCQkJYWhjLT5tc2dpbl9pbmRleCsrOworCisJCWlmIChtZXNzYWdlX2RvbmUgPT0gTVNHTE9PUF9URVJNSU5BVEVEKSB7CisJCQllbmRfc2Vzc2lvbiA9IFRSVUU7CisJCX0gZWxzZSB7CisJCQkvKiBBY2sgdGhlIGJ5dGUgKi8KKwkJCWFoY19vdXRiKGFoYywgQ0xSU0lOVDEsIENMUlJFUUlOSVQpOworCQkJYWhjX2luYihhaGMsIFNDU0lEQVRMKTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBNU0dfVFlQRV9UQVJHRVRfTVNHSU46CisJeworCQlpbnQgbXNnZG9uZTsKKwkJaW50IG1zZ291dF9yZXF1ZXN0OworCisJCWlmIChhaGMtPm1zZ291dF9sZW4gPT0gMCkKKwkJCXBhbmljKCJUYXJnZXQgTVNHSU4gd2l0aCBubyBhY3RpdmUgbWVzc2FnZSIpOworCisJCS8qCisJCSAqIElmIHdlIGludGVycnVwdGVkIGEgbWVzZ291dCBzZXNzaW9uLCB0aGUgaW5pdGlhdG9yCisJCSAqIHdpbGwgbm90IGtub3cgdGhpcyB1bnRpbCBvdXIgZmlyc3QgUkVRLiAgU28sIHdlCisJCSAqIG9ubHkgaG9ub3IgbWVzZ291dCByZXF1ZXN0cyBhZnRlciB3ZSd2ZSBzZW50IG91cgorCQkgKiBmaXJzdCBieXRlLgorCQkgKi8KKwkJaWYgKChhaGNfaW5iKGFoYywgU0NTSVNJR0kpICYgQVROSSkgIT0gMAorCQkgJiYgYWhjLT5tc2dvdXRfaW5kZXggPiAwKQorCQkJbXNnb3V0X3JlcXVlc3QgPSBUUlVFOworCQllbHNlCisJCQltc2dvdXRfcmVxdWVzdCA9IEZBTFNFOworCisJCWlmIChtc2dvdXRfcmVxdWVzdCkgeworCisJCQkvKgorCQkJICogQ2hhbmdlIGdlYXJzIGFuZCBzZWUgaWYKKwkJCSAqIHRoaXMgbWVzc2FnZXMgaXMgb2YgaW50ZXJlc3QgdG8KKwkJCSAqIHVzIG9yIHNob3VsZCBiZSBwYXNzZWQgYmFjayB0bworCQkJICogdGhlIHNlcXVlbmNlci4KKwkJCSAqLworCQkJYWhjLT5tc2dfdHlwZSA9IE1TR19UWVBFX1RBUkdFVF9NU0dPVVQ7CisJCQlhaGNfb3V0YihhaGMsIFNDU0lTSUdPLCBQX01FU0dPVVQgfCBCU1lPKTsKKwkJCWFoYy0+bXNnaW5faW5kZXggPSAwOworCQkJLyogRHVtbXkgcmVhZCB0byBSRVEgZm9yIGZpcnN0IGJ5dGUgKi8KKwkJCWFoY19pbmIoYWhjLCBTQ1NJREFUTCk7CisJCQlhaGNfb3V0YihhaGMsIFNYRlJDVEwwLAorCQkJCSBhaGNfaW5iKGFoYywgU1hGUkNUTDApIHwgU1BJT0VOKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbXNnZG9uZSA9IGFoYy0+bXNnb3V0X2luZGV4ID09IGFoYy0+bXNnb3V0X2xlbjsKKwkJaWYgKG1zZ2RvbmUpIHsKKwkJCWFoY19vdXRiKGFoYywgU1hGUkNUTDAsCisJCQkJIGFoY19pbmIoYWhjLCBTWEZSQ1RMMCkgJiB+U1BJT0VOKTsKKwkJCWVuZF9zZXNzaW9uID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogUHJlc2VudCB0aGUgbmV4dCBieXRlIG9uIHRoZSBidXMuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIFNYRlJDVEwwLCBhaGNfaW5iKGFoYywgU1hGUkNUTDApIHwgU1BJT0VOKTsKKwkJYWhjX291dGIoYWhjLCBTQ1NJREFUTCwgYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTVNHX1RZUEVfVEFSR0VUX01TR09VVDoKKwl7CisJCWludCBsYXN0Ynl0ZTsKKwkJaW50IG1zZ2RvbmU7CisKKwkJLyoKKwkJICogVGhlIGluaXRpYXRvciBzaWduYWxzIHRoYXQgdGhpcyBpcworCQkgKiB0aGUgbGFzdCBieXRlIGJ5IGRyb3BwaW5nIEFUTi4KKwkJICovCisJCWxhc3RieXRlID0gKGFoY19pbmIoYWhjLCBTQ1NJU0lHSSkgJiBBVE5JKSA9PSAwOworCisJCS8qCisJCSAqIFJlYWQgdGhlIGxhdGNoZWQgYnl0ZSwgYnV0IHR1cm4gb2ZmIFNQSU9FTiBmaXJzdAorCQkgKiBzbyB0aGF0IHdlIGRvbid0IGluYWR2ZXJ0ZW50bHkgY2F1c2UgYSBSRVEgZm9yIHRoZQorCQkgKiBuZXh0IGJ5dGUuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIFNYRlJDVEwwLCBhaGNfaW5iKGFoYywgU1hGUkNUTDApICYgflNQSU9FTik7CisJCWFoYy0+bXNnaW5fYnVmW2FoYy0+bXNnaW5faW5kZXhdID0gYWhjX2luYihhaGMsIFNDU0lEQVRMKTsKKwkJbXNnZG9uZSA9IGFoY19wYXJzZV9tc2coYWhjLCAmZGV2aW5mbyk7CisJCWlmIChtc2dkb25lID09IE1TR0xPT1BfVEVSTUlOQVRFRCkgeworCQkJLyoKKwkJCSAqIFRoZSBtZXNzYWdlIGlzICpyZWFsbHkqIGRvbmUgaW4gdGhhdCBpdCBjYXVzZWQKKwkJCSAqIHVzIHRvIGdvIHRvIGJ1cyBmcmVlLiAgVGhlIHNlcXVlbmNlciBoYXMgYWxyZWFkeQorCQkJICogYmVlbiByZXNldCBhdCB0aGlzIHBvaW50LCBzbyBwdWxsIHRoZSBlamVjdGlvbgorCQkJICogaGFuZGxlLgorCQkJICovCisJCQlyZXR1cm47CisJCX0KKwkJCisJCWFoYy0+bXNnaW5faW5kZXgrKzsKKworCQkvKgorCQkgKiBYWFggUmVhZCBzcGVjIGFib3V0IGluaXRpYXRvciBkcm9wcGluZyBBVE4gdG9vIHNvb24KKwkJICogICAgIGFuZCB1c2UgbXNnZG9uZSB0byBkZXRlY3QgaXQuCisJCSAqLworCQlpZiAobXNnZG9uZSA9PSBNU0dMT09QX01TR0NPTVBMRVRFKSB7CisJCQlhaGMtPm1zZ2luX2luZGV4ID0gMDsKKworCQkJLyoKKwkJCSAqIElmIHRoaXMgbWVzc2FnZSBpbGxpY2l0ZWQgYSByZXNwb25zZSwgdHJhbnNpdGlvbgorCQkJICogdG8gdGhlIE1lc3NhZ2UgaW4gcGhhc2UgYW5kIHNlbmQgaXQuCisJCQkgKi8KKwkJCWlmIChhaGMtPm1zZ291dF9sZW4gIT0gMCkgeworCQkJCWFoY19vdXRiKGFoYywgU0NTSVNJR08sIFBfTUVTR0lOIHwgQlNZTyk7CisJCQkJYWhjX291dGIoYWhjLCBTWEZSQ1RMMCwKKwkJCQkJIGFoY19pbmIoYWhjLCBTWEZSQ1RMMCkgfCBTUElPRU4pOworCQkJCWFoYy0+bXNnX3R5cGUgPSBNU0dfVFlQRV9UQVJHRVRfTVNHSU47CisJCQkJYWhjLT5tc2dpbl9pbmRleCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAobGFzdGJ5dGUpCisJCQllbmRfc2Vzc2lvbiA9IFRSVUU7CisJCWVsc2UgeworCQkJLyogQXNrIGZvciB0aGUgbmV4dCBieXRlLiAqLworCQkJYWhjX291dGIoYWhjLCBTWEZSQ1RMMCwKKwkJCQkgYWhjX2luYihhaGMsIFNYRlJDVEwwKSB8IFNQSU9FTik7CisJCX0KKworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcGFuaWMoIlVua25vd24gUkVRSU5JVCBtZXNzYWdlIHR5cGUiKTsKKwl9CisKKwlpZiAoZW5kX3Nlc3Npb24pIHsKKwkJYWhjX2NsZWFyX21zZ19zdGF0ZShhaGMpOworCQlhaGNfb3V0YihhaGMsIFJFVFVSTl8xLCBFWElUX01TR19MT09QKTsKKwl9IGVsc2UKKwkJYWhjX291dGIoYWhjLCBSRVRVUk5fMSwgQ09OVF9NU0dfTE9PUCk7Cit9CisKKy8qCisgKiBTZWUgaWYgd2Ugc2VudCBhIHBhcnRpY3VsYXIgZXh0ZW5kZWQgbWVzc2FnZSB0byB0aGUgdGFyZ2V0LgorICogSWYgImZ1bGwiIGlzIHRydWUsIHJldHVybiB0cnVlIG9ubHkgaWYgdGhlIHRhcmdldCBzYXcgdGhlIGZ1bGwKKyAqIG1lc3NhZ2UuICBJZiAiZnVsbCIgaXMgZmFsc2UsIHJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgc2F3IGF0CisgKiBsZWFzdCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbWVzc2FnZS4KKyAqLworc3RhdGljIGludAorYWhjX3NlbnRfbXNnKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgYWhjX21zZ3R5cGUgdHlwZSwgdV9pbnQgbXNndmFsLCBpbnQgZnVsbCkKK3sKKwlpbnQgZm91bmQ7CisJdV9pbnQgaW5kZXg7CisKKwlmb3VuZCA9IEZBTFNFOworCWluZGV4ID0gMDsKKworCXdoaWxlIChpbmRleCA8IGFoYy0+bXNnb3V0X2xlbikgeworCQlpZiAoYWhjLT5tc2dvdXRfYnVmW2luZGV4XSA9PSBNU0dfRVhURU5ERUQpIHsKKwkJCXVfaW50IGVuZF9pbmRleDsKKworCQkJZW5kX2luZGV4ID0gaW5kZXggKyAxICsgYWhjLT5tc2dvdXRfYnVmW2luZGV4ICsgMV07CisJCQlpZiAoYWhjLT5tc2dvdXRfYnVmW2luZGV4KzJdID09IG1zZ3ZhbAorCQkJICYmIHR5cGUgPT0gQUhDTVNHX0VYVCkgeworCisJCQkJaWYgKGZ1bGwpIHsKKwkJCQkJaWYgKGFoYy0+bXNnb3V0X2luZGV4ID4gZW5kX2luZGV4KQorCQkJCQkJZm91bmQgPSBUUlVFOworCQkJCX0gZWxzZSBpZiAoYWhjLT5tc2dvdXRfaW5kZXggPiBpbmRleCkKKwkJCQkJZm91bmQgPSBUUlVFOworCQkJfQorCQkJaW5kZXggPSBlbmRfaW5kZXg7CisJCX0gZWxzZSBpZiAoYWhjLT5tc2dvdXRfYnVmW2luZGV4XSA+PSBNU0dfU0lNUExFX1RBU0sKKwkJCSYmIGFoYy0+bXNnb3V0X2J1ZltpbmRleF0gPD0gTVNHX0lHTl9XSURFX1JFU0lEVUUpIHsKKworCQkJLyogU2tpcCB0YWcgdHlwZSBhbmQgdGFnIGlkIG9yIHJlc2lkdWUgcGFyYW0qLworCQkJaW5kZXggKz0gMjsKKwkJfSBlbHNlIHsKKwkJCS8qIFNpbmdsZSBieXRlIG1lc3NhZ2UgKi8KKwkJCWlmICh0eXBlID09IEFIQ01TR18xQgorCQkJICYmIGFoYy0+bXNnb3V0X2J1ZltpbmRleF0gPT0gbXNndmFsCisJCQkgJiYgYWhjLT5tc2dvdXRfaW5kZXggPiBpbmRleCkKKwkJCQlmb3VuZCA9IFRSVUU7CisJCQlpbmRleCsrOworCQl9CisKKwkJaWYgKGZvdW5kKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAoZm91bmQpOworfQorCisvKgorICogV2FpdCBmb3IgYSBjb21wbGV0ZSBpbmNvbWluZyBtZXNzYWdlLCBwYXJzZSBpdCwgYW5kIHJlc3BvbmQgYWNjb3JkaW5nbHkuCisgKi8KK3N0YXRpYyBpbnQKK2FoY19wYXJzZV9tc2coc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pCit7CisJc3RydWN0CWFoY19pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCXN0cnVjdAlhaGNfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJaW50CXJlamVjdDsKKwlpbnQJZG9uZTsKKwlpbnQJcmVzcG9uc2U7CisJdV9pbnQJdGFyZ19zY3NpcmF0ZTsKKworCWRvbmUgPSBNU0dMT09QX0lOX1BST0c7CisJcmVzcG9uc2UgPSBGQUxTRTsKKwlyZWplY3QgPSBGQUxTRTsKKwl0aW5mbyA9IGFoY19mZXRjaF90cmFuc2luZm8oYWhjLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT5vdXJfc2NzaWlkLAorCQkJCSAgICBkZXZpbmZvLT50YXJnZXQsICZ0c3RhdGUpOworCXRhcmdfc2NzaXJhdGUgPSB0aW5mby0+c2NzaXJhdGU7CisKKwkvKgorCSAqIFBhcnNlIGFzIG11Y2ggb2YgdGhlIG1lc3NhZ2UgYXMgaXMgYXZhaWxhYmxlLAorCSAqIHJlamVjdGluZyBpdCBpZiB3ZSBkb24ndCBzdXBwb3J0IGl0LiAgV2hlbgorCSAqIHRoZSBlbnRpcmUgbWVzc2FnZSBpcyBhdmFpbGFibGUgYW5kIGhhcyBiZWVuCisJICogaGFuZGxlZCwgcmV0dXJuIE1TR0xPT1BfTVNHQ09NUExFVEUsIGluZGljYXRpbmcKKwkgKiB0aGF0IHdlIGhhdmUgcGFyc2VkIGFuIGVudGlyZSBtZXNzYWdlLgorCSAqCisJICogSW4gdGhlIGNhc2Ugb2YgZXh0ZW5kZWQgbWVzc2FnZXMsIHdlIGFjY2VwdCB0aGUgbGVuZ3RoCisJICogYnl0ZSBvdXRyaWdodCBhbmQgcGVyZm9ybSBtb3JlIGNoZWNraW5nIG9uY2Ugd2Uga25vdyB0aGUKKwkgKiBleHRlbmRlZCBtZXNzYWdlIHR5cGUuCisJICovCisJc3dpdGNoIChhaGMtPm1zZ2luX2J1ZlswXSkgeworCWNhc2UgTVNHX0RJU0NPTk5FQ1Q6CisJY2FzZSBNU0dfU0FWRURBVEFQT0lOVEVSOgorCWNhc2UgTVNHX0NNRENPTVBMRVRFOgorCWNhc2UgTVNHX1JFU1RPUkVQT0lOVEVSUzoKKwljYXNlIE1TR19JR05fV0lERV9SRVNJRFVFOgorCQkvKgorCQkgKiBFbmQgb3VyIG1lc3NhZ2UgbG9vcCBhcyB0aGVzZSBhcmUgbWVzc2FnZXMKKwkJICogdGhlIHNlcXVlbmNlciBoYW5kbGVzIG9uIGl0cyBvd24uCisJCSAqLworCQlkb25lID0gTVNHTE9PUF9URVJNSU5BVEVEOworCQlicmVhazsKKwljYXNlIE1TR19NRVNTQUdFX1JFSkVDVDoKKwkJcmVzcG9uc2UgPSBhaGNfaGFuZGxlX21zZ19yZWplY3QoYWhjLCBkZXZpbmZvKTsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIE1TR19OT09QOgorCQlkb25lID0gTVNHTE9PUF9NU0dDT01QTEVURTsKKwkJYnJlYWs7CisJY2FzZSBNU0dfRVhURU5ERUQ6CisJeworCQkvKiBXYWl0IGZvciBlbm91Z2ggb2YgdGhlIG1lc3NhZ2UgdG8gYmVnaW4gdmFsaWRhdGlvbiAqLworCQlpZiAoYWhjLT5tc2dpbl9pbmRleCA8IDIpCisJCQlicmVhazsKKwkJc3dpdGNoIChhaGMtPm1zZ2luX2J1ZlsyXSkgeworCQljYXNlIE1TR19FWFRfU0RUUjoKKwkJeworCQkJc3RydWN0CSBhaGNfc3luY3JhdGUgKnN5bmNyYXRlOworCQkJdV9pbnQJIHBlcmlvZDsKKwkJCXVfaW50CSBwcHJfb3B0aW9uczsKKwkJCXVfaW50CSBvZmZzZXQ7CisJCQl1X2ludAkgc2F2ZWRfb2Zmc2V0OworCQkJCisJCQlpZiAoYWhjLT5tc2dpbl9idWZbMV0gIT0gTVNHX0VYVF9TRFRSX0xFTikgeworCQkJCXJlamVjdCA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qCisJCQkgKiBXYWl0IHVudGlsIHdlIGhhdmUgYm90aCBhcmdzIGJlZm9yZSB2YWxpZGF0aW5nCisJCQkgKiBhbmQgYWN0aW5nIG9uIHRoaXMgbWVzc2FnZS4KKwkJCSAqCisJCQkgKiBBZGQgb25lIHRvIE1TR19FWFRfU0RUUl9MRU4gdG8gYWNjb3VudCBmb3IKKwkJCSAqIHRoZSBleHRlbmRlZCBtZXNzYWdlIHByZWFtYmxlLgorCQkJICovCisJCQlpZiAoYWhjLT5tc2dpbl9pbmRleCA8IChNU0dfRVhUX1NEVFJfTEVOICsgMSkpCisJCQkJYnJlYWs7CisKKwkJCXBlcmlvZCA9IGFoYy0+bXNnaW5fYnVmWzNdOworCQkJcHByX29wdGlvbnMgPSAwOworCQkJc2F2ZWRfb2Zmc2V0ID0gb2Zmc2V0ID0gYWhjLT5tc2dpbl9idWZbNF07CisJCQlzeW5jcmF0ZSA9IGFoY19kZXZsaW1pdGVkX3N5bmNyYXRlKGFoYywgdGluZm8sICZwZXJpb2QsCisJCQkJCQkJICAgJnBwcl9vcHRpb25zLAorCQkJCQkJCSAgIGRldmluZm8tPnJvbGUpOworCQkJYWhjX3ZhbGlkYXRlX29mZnNldChhaGMsIHRpbmZvLCBzeW5jcmF0ZSwgJm9mZnNldCwKKwkJCQkJICAgIHRhcmdfc2NzaXJhdGUgJiBXSURFWEZFUiwKKwkJCQkJICAgIGRldmluZm8tPnJvbGUpOworCQkJaWYgKGJvb3R2ZXJib3NlKSB7CisJCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBSZWNlaXZlZCAiCisJCQkJICAgICAgICJTRFRSIHBlcmlvZCAleCwgb2Zmc2V0ICV4XG5cdCIKKwkJCQkgICAgICAgIkZpbHRlcmVkIHRvIHBlcmlvZCAleCwgb2Zmc2V0ICV4XG4iLAorCQkJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1biwKKwkJCQkgICAgICAgYWhjLT5tc2dpbl9idWZbM10sIHNhdmVkX29mZnNldCwKKwkJCQkgICAgICAgcGVyaW9kLCBvZmZzZXQpOworCQkJfQorCQkJYWhjX3NldF9zeW5jcmF0ZShhaGMsIGRldmluZm8sIAorCQkJCQkgc3luY3JhdGUsIHBlcmlvZCwKKwkJCQkJIG9mZnNldCwgcHByX29wdGlvbnMsCisJCQkJCSBBSENfVFJBTlNfQUNUSVZFfEFIQ19UUkFOU19HT0FMLAorCQkJCQkgLypwYXVzZWQqL1RSVUUpOworCisJCQkvKgorCQkJICogU2VlIGlmIHdlIGluaXRpYXRlZCBTeW5jIE5lZ290aWF0aW9uCisJCQkgKiBhbmQgZGlkbid0IGhhdmUgdG8gZmFsbCBkb3duIHRvIGFzeW5jCisJCQkgKiB0cmFuc2ZlcnMuCisJCQkgKi8KKwkJCWlmIChhaGNfc2VudF9tc2coYWhjLCBBSENNU0dfRVhULCBNU0dfRVhUX1NEVFIsIFRSVUUpKSB7CisJCQkJLyogV2Ugc3RhcnRlZCBpdCAqLworCQkJCWlmIChzYXZlZF9vZmZzZXQgIT0gb2Zmc2V0KSB7CisJCQkJCS8qIFdlbnQgdG9vIGxvdyAtIGZvcmNlIGFzeW5jICovCisJCQkJCXJlamVjdCA9IFRSVUU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFNlbmQgb3VyIG93biBTRFRSIGluIHJlcGx5CisJCQkJICovCisJCQkJaWYgKGJvb3R2ZXJib3NlCisJCQkJICYmIGRldmluZm8tPnJvbGUgPT0gUk9MRV9JTklUSUFUT1IpIHsKKwkJCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBUYXJnZXQgIgorCQkJCQkgICAgICAgIkluaXRpYXRlZCBTRFRSXG4iLAorCQkJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+Y2hhbm5lbCwKKwkJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKKwkJCQl9CisJCQkJYWhjLT5tc2dvdXRfaW5kZXggPSAwOworCQkJCWFoYy0+bXNnb3V0X2xlbiA9IDA7CisJCQkJYWhjX2NvbnN0cnVjdF9zZHRyKGFoYywgZGV2aW5mbywKKwkJCQkJCSAgIHBlcmlvZCwgb2Zmc2V0KTsKKwkJCQlhaGMtPm1zZ291dF9pbmRleCA9IDA7CisJCQkJcmVzcG9uc2UgPSBUUlVFOworCQkJfQorCQkJZG9uZSA9IE1TR0xPT1BfTVNHQ09NUExFVEU7CisJCQlicmVhazsKKwkJfQorCQljYXNlIE1TR19FWFRfV0RUUjoKKwkJeworCQkJdV9pbnQgYnVzX3dpZHRoOworCQkJdV9pbnQgc2F2ZWRfd2lkdGg7CisJCQl1X2ludCBzZW5kaW5nX3JlcGx5OworCisJCQlzZW5kaW5nX3JlcGx5ID0gRkFMU0U7CisJCQlpZiAoYWhjLT5tc2dpbl9idWZbMV0gIT0gTVNHX0VYVF9XRFRSX0xFTikgeworCQkJCXJlamVjdCA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qCisJCQkgKiBXYWl0IHVudGlsIHdlIGhhdmUgb3VyIGFyZyBiZWZvcmUgdmFsaWRhdGluZworCQkJICogYW5kIGFjdGluZyBvbiB0aGlzIG1lc3NhZ2UuCisJCQkgKgorCQkJICogQWRkIG9uZSB0byBNU0dfRVhUX1dEVFJfTEVOIHRvIGFjY291bnQgZm9yCisJCQkgKiB0aGUgZXh0ZW5kZWQgbWVzc2FnZSBwcmVhbWJsZS4KKwkJCSAqLworCQkJaWYgKGFoYy0+bXNnaW5faW5kZXggPCAoTVNHX0VYVF9XRFRSX0xFTiArIDEpKQorCQkJCWJyZWFrOworCisJCQlidXNfd2lkdGggPSBhaGMtPm1zZ2luX2J1ZlszXTsKKwkJCXNhdmVkX3dpZHRoID0gYnVzX3dpZHRoOworCQkJYWhjX3ZhbGlkYXRlX3dpZHRoKGFoYywgdGluZm8sICZidXNfd2lkdGgsCisJCQkJCSAgIGRldmluZm8tPnJvbGUpOworCQkJaWYgKGJvb3R2ZXJib3NlKSB7CisJCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBSZWNlaXZlZCBXRFRSICIKKwkJCQkgICAgICAgIiV4IGZpbHRlcmVkIHRvICV4XG4iLAorCQkJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1biwKKwkJCQkgICAgICAgc2F2ZWRfd2lkdGgsIGJ1c193aWR0aCk7CisJCQl9CisKKwkJCWlmIChhaGNfc2VudF9tc2coYWhjLCBBSENNU0dfRVhULCBNU0dfRVhUX1dEVFIsIFRSVUUpKSB7CisJCQkJLyoKKwkJCQkgKiBEb24ndCBzZW5kIGEgV0RUUiBiYWNrIHRvIHRoZQorCQkJCSAqIHRhcmdldCwgc2luY2Ugd2UgYXNrZWQgZmlyc3QuCisJCQkJICogSWYgdGhlIHdpZHRoIHdlbnQgaGlnaGVyIHRoYW4gb3VyCisJCQkJICogcmVxdWVzdCwgcmVqZWN0IGl0LgorCQkJCSAqLworCQkJCWlmIChzYXZlZF93aWR0aCA+IGJ1c193aWR0aCkgeworCQkJCQlyZWplY3QgPSBUUlVFOworCQkJCQlwcmludGYoIiglczolYzolZDolZCk6IHJlcXVlc3RlZCAlZEJpdCAiCisJCQkJCSAgICAgICAidHJhbnNmZXJzLiAgUmVqZWN0aW5nLi4uXG4iLAorCQkJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+Y2hhbm5lbCwKKwkJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuLAorCQkJCQkgICAgICAgOCAqICgweDAxIDw8IGJ1c193aWR0aCkpOworCQkJCQlidXNfd2lkdGggPSAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBTZW5kIG91ciBvd24gV0RUUiBpbiByZXBseQorCQkJCSAqLworCQkJCWlmIChib290dmVyYm9zZQorCQkJCSAmJiBkZXZpbmZvLT5yb2xlID09IFJPTEVfSU5JVElBVE9SKSB7CisJCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogVGFyZ2V0ICIKKwkJCQkJICAgICAgICJJbml0aWF0ZWQgV0RUUlxuIiwKKwkJCQkJICAgICAgIGFoY19uYW1lKGFoYyksIGRldmluZm8tPmNoYW5uZWwsCisJCQkJCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1bik7CisJCQkJfQorCQkJCWFoYy0+bXNnb3V0X2luZGV4ID0gMDsKKwkJCQlhaGMtPm1zZ291dF9sZW4gPSAwOworCQkJCWFoY19jb25zdHJ1Y3Rfd2R0cihhaGMsIGRldmluZm8sIGJ1c193aWR0aCk7CisJCQkJYWhjLT5tc2dvdXRfaW5kZXggPSAwOworCQkJCXJlc3BvbnNlID0gVFJVRTsKKwkJCQlzZW5kaW5nX3JlcGx5ID0gVFJVRTsKKwkJCX0KKwkJCS8qCisJCQkgKiBBZnRlciBhIHdpZGUgbWVzc2FnZSwgd2UgYXJlIGFzeW5jLCBidXQKKwkJCSAqIHNvbWUgZGV2aWNlcyBkb24ndCBzZWVtIHRvIGhvbm9yIHRoaXMgcG9ydGlvbgorCQkJICogb2YgdGhlIHNwZWMuICBGb3JjZSBhIHJlbmVnb3RpYXRpb24gb2YgdGhlCisJCQkgKiBzeW5jIGNvbXBvbmVudCBvZiBvdXIgdHJhbnNmZXIgYWdyZWVtZW50IGV2ZW4KKwkJCSAqIGlmIG91ciBnb2FsIGlzIGFzeW5jLiAgQnkgdXBkYXRpbmcgb3VyIHdpZHRoCisJCQkgKiBhZnRlciBmb3JjaW5nIHRoZSBuZWdvdGlhdGlvbiwgd2UgYXZvaWQKKwkJCSAqIHJlbmVnb3RpYXRpbmcgZm9yIHdpZHRoLgorCQkJICovCisJCQlhaGNfdXBkYXRlX25lZ19yZXF1ZXN0KGFoYywgZGV2aW5mbywgdHN0YXRlLAorCQkJCQkgICAgICAgdGluZm8sIEFIQ19ORUdfQUxXQVlTKTsKKwkJCWFoY19zZXRfd2lkdGgoYWhjLCBkZXZpbmZvLCBidXNfd2lkdGgsCisJCQkJICAgICAgQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfR09BTCwKKwkJCQkgICAgICAvKnBhdXNlZCovVFJVRSk7CisJCQlpZiAoc2VuZGluZ19yZXBseSA9PSBGQUxTRSAmJiByZWplY3QgPT0gRkFMU0UpIHsKKworCQkJCS8qCisJCQkJICogV2Ugd2lsbCBhbHdheXMgaGF2ZSBhbiBTRFRSIHRvIHNlbmQuCisJCQkJICovCisJCQkJYWhjLT5tc2dvdXRfaW5kZXggPSAwOworCQkJCWFoYy0+bXNnb3V0X2xlbiA9IDA7CisJCQkJYWhjX2J1aWxkX3RyYW5zZmVyX21zZyhhaGMsIGRldmluZm8pOworCQkJCWFoYy0+bXNnb3V0X2luZGV4ID0gMDsKKwkJCQlyZXNwb25zZSA9IFRSVUU7CisJCQl9CisJCQlkb25lID0gTVNHTE9PUF9NU0dDT01QTEVURTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgTVNHX0VYVF9QUFI6CisJCXsKKwkJCXN0cnVjdAlhaGNfc3luY3JhdGUgKnN5bmNyYXRlOworCQkJdV9pbnQJcGVyaW9kOworCQkJdV9pbnQJb2Zmc2V0OworCQkJdV9pbnQJYnVzX3dpZHRoOworCQkJdV9pbnQJcHByX29wdGlvbnM7CisJCQl1X2ludAlzYXZlZF93aWR0aDsKKwkJCXVfaW50CXNhdmVkX29mZnNldDsKKwkJCXVfaW50CXNhdmVkX3Bwcl9vcHRpb25zOworCisJCQlpZiAoYWhjLT5tc2dpbl9idWZbMV0gIT0gTVNHX0VYVF9QUFJfTEVOKSB7CisJCQkJcmVqZWN0ID0gVFJVRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFdhaXQgdW50aWwgd2UgaGF2ZSBhbGwgYXJncyBiZWZvcmUgdmFsaWRhdGluZworCQkJICogYW5kIGFjdGluZyBvbiB0aGlzIG1lc3NhZ2UuCisJCQkgKgorCQkJICogQWRkIG9uZSB0byBNU0dfRVhUX1BQUl9MRU4gdG8gYWNjb3VudCBmb3IKKwkJCSAqIHRoZSBleHRlbmRlZCBtZXNzYWdlIHByZWFtYmxlLgorCQkJICovCisJCQlpZiAoYWhjLT5tc2dpbl9pbmRleCA8IChNU0dfRVhUX1BQUl9MRU4gKyAxKSkKKwkJCQlicmVhazsKKworCQkJcGVyaW9kID0gYWhjLT5tc2dpbl9idWZbM107CisJCQlvZmZzZXQgPSBhaGMtPm1zZ2luX2J1Zls1XTsKKwkJCWJ1c193aWR0aCA9IGFoYy0+bXNnaW5fYnVmWzZdOworCQkJc2F2ZWRfd2lkdGggPSBidXNfd2lkdGg7CisJCQlwcHJfb3B0aW9ucyA9IGFoYy0+bXNnaW5fYnVmWzddOworCQkJLyoKKwkJCSAqIEFjY29yZGluZyB0byB0aGUgc3BlYywgYSBEVCBvbmx5CisJCQkgKiBwZXJpb2QgZmFjdG9yIHdpdGggbm8gRFQgb3B0aW9uCisJCQkgKiBzZXQgaW1wbGllcyBhc3luYy4KKwkJCSAqLworCQkJaWYgKChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUSkgPT0gMAorCQkJICYmIHBlcmlvZCA9PSA5KQorCQkJCW9mZnNldCA9IDA7CisJCQlzYXZlZF9wcHJfb3B0aW9ucyA9IHBwcl9vcHRpb25zOworCQkJc2F2ZWRfb2Zmc2V0ID0gb2Zmc2V0OworCisJCQkvKgorCQkJICogTWFzayBvdXQgYW55IG9wdGlvbnMgd2UgZG9uJ3Qgc3VwcG9ydAorCQkJICogb24gYW55IGNvbnRyb2xsZXIuICBUcmFuc2ZlciBvcHRpb25zIGFyZQorCQkJICogb25seSBhdmFpbGFibGUgaWYgd2UgYXJlIG5lZ290aWF0aW5nIHdpZGUuCisJCQkgKi8KKwkJCXBwcl9vcHRpb25zICY9IE1TR19FWFRfUFBSX0RUX1JFUTsKKwkJCWlmIChidXNfd2lkdGggPT0gMCkKKwkJCQlwcHJfb3B0aW9ucyA9IDA7CisKKwkJCWFoY192YWxpZGF0ZV93aWR0aChhaGMsIHRpbmZvLCAmYnVzX3dpZHRoLAorCQkJCQkgICBkZXZpbmZvLT5yb2xlKTsKKwkJCXN5bmNyYXRlID0gYWhjX2RldmxpbWl0ZWRfc3luY3JhdGUoYWhjLCB0aW5mbywgJnBlcmlvZCwKKwkJCQkJCQkgICAmcHByX29wdGlvbnMsCisJCQkJCQkJICAgZGV2aW5mby0+cm9sZSk7CisJCQlhaGNfdmFsaWRhdGVfb2Zmc2V0KGFoYywgdGluZm8sIHN5bmNyYXRlLAorCQkJCQkgICAgJm9mZnNldCwgYnVzX3dpZHRoLAorCQkJCQkgICAgZGV2aW5mby0+cm9sZSk7CisKKwkJCWlmIChhaGNfc2VudF9tc2coYWhjLCBBSENNU0dfRVhULCBNU0dfRVhUX1BQUiwgVFJVRSkpIHsKKwkJCQkvKgorCQkJCSAqIElmIHdlIGFyZSB1bmFibGUgdG8gZG8gYW55IG9mIHRoZQorCQkJCSAqIHJlcXVlc3RlZCBvcHRpb25zICh3ZSB3ZW50IHRvbyBsb3cpLAorCQkJCSAqIHRoZW4gd2UnbGwgaGF2ZSB0byByZWplY3QgdGhlIG1lc3NhZ2UuCisJCQkJICovCisJCQkJaWYgKHNhdmVkX3dpZHRoID4gYnVzX3dpZHRoCisJCQkJIHx8IHNhdmVkX29mZnNldCAhPSBvZmZzZXQKKwkJCQkgfHwgc2F2ZWRfcHByX29wdGlvbnMgIT0gcHByX29wdGlvbnMpIHsKKwkJCQkJcmVqZWN0ID0gVFJVRTsKKwkJCQkJcGVyaW9kID0gMDsKKwkJCQkJb2Zmc2V0ID0gMDsKKwkJCQkJYnVzX3dpZHRoID0gMDsKKwkJCQkJcHByX29wdGlvbnMgPSAwOworCQkJCQlzeW5jcmF0ZSA9IE5VTEw7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoZGV2aW5mby0+cm9sZSAhPSBST0xFX1RBUkdFVCkKKwkJCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBUYXJnZXQgIgorCQkJCQkgICAgICAgIkluaXRpYXRlZCBQUFJcbiIsCisJCQkJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOworCQkJCWVsc2UKKwkJCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBJbml0aWF0b3IgIgorCQkJCQkgICAgICAgIkluaXRpYXRlZCBQUFJcbiIsCisJCQkJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOworCQkJCWFoYy0+bXNnb3V0X2luZGV4ID0gMDsKKwkJCQlhaGMtPm1zZ291dF9sZW4gPSAwOworCQkJCWFoY19jb25zdHJ1Y3RfcHByKGFoYywgZGV2aW5mbywgcGVyaW9kLCBvZmZzZXQsCisJCQkJCQkgIGJ1c193aWR0aCwgcHByX29wdGlvbnMpOworCQkJCWFoYy0+bXNnb3V0X2luZGV4ID0gMDsKKwkJCQlyZXNwb25zZSA9IFRSVUU7CisJCQl9CisJCQlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJCQlwcmludGYoIiglczolYzolZDolZCk6IFJlY2VpdmVkIFBQUiB3aWR0aCAleCwgIgorCQkJCSAgICAgICAicGVyaW9kICV4LCBvZmZzZXQgJXgsb3B0aW9ucyAleFxuIgorCQkJCSAgICAgICAiXHRGaWx0ZXJlZCB0byB3aWR0aCAleCwgcGVyaW9kICV4LCAiCisJCQkJICAgICAgICJvZmZzZXQgJXgsIG9wdGlvbnMgJXhcbiIsCisJCQkJICAgICAgIGFoY19uYW1lKGFoYyksIGRldmluZm8tPmNoYW5uZWwsCisJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuLAorCQkJCSAgICAgICBzYXZlZF93aWR0aCwgYWhjLT5tc2dpbl9idWZbM10sCisJCQkJICAgICAgIHNhdmVkX29mZnNldCwgc2F2ZWRfcHByX29wdGlvbnMsCisJCQkJICAgICAgIGJ1c193aWR0aCwgcGVyaW9kLCBvZmZzZXQsIHBwcl9vcHRpb25zKTsKKwkJCX0KKwkJCWFoY19zZXRfd2lkdGgoYWhjLCBkZXZpbmZvLCBidXNfd2lkdGgsCisJCQkJICAgICAgQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfR09BTCwKKwkJCQkgICAgICAvKnBhdXNlZCovVFJVRSk7CisJCQlhaGNfc2V0X3N5bmNyYXRlKGFoYywgZGV2aW5mbywKKwkJCQkJIHN5bmNyYXRlLCBwZXJpb2QsCisJCQkJCSBvZmZzZXQsIHBwcl9vcHRpb25zLAorCQkJCQkgQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfR09BTCwKKwkJCQkJIC8qcGF1c2VkKi9UUlVFKTsKKwkJCWRvbmUgPSBNU0dMT09QX01TR0NPTVBMRVRFOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCS8qIFVua25vd24gZXh0ZW5kZWQgbWVzc2FnZS4gIFJlamVjdCBpdC4gKi8KKwkJCXJlamVjdCA9IFRSVUU7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCisJY2FzZSBNU0dfQlVTX0RFVl9SRVNFVDoKKwkJYWhjX2hhbmRsZV9kZXZyZXNldChhaGMsIGRldmluZm8sCisJCQkJICAgIENBTV9CRFJfU0VOVCwKKwkJCQkgICAgIkJ1cyBEZXZpY2UgUmVzZXQgUmVjZWl2ZWQiLAorCQkJCSAgICAvKnZlcmJvc2VfbGV2ZWwqLzApOworCQlhaGNfcmVzdGFydChhaGMpOworCQlkb25lID0gTVNHTE9PUF9URVJNSU5BVEVEOworCQlicmVhazsKKwljYXNlIE1TR19BQk9SVF9UQUc6CisJY2FzZSBNU0dfQUJPUlQ6CisJY2FzZSBNU0dfQ0xFQVJfUVVFVUU6CisJeworCQlpbnQgdGFnOworCisJCS8qIFRhcmdldCBtb2RlIG1lc3NhZ2VzICovCisJCWlmIChkZXZpbmZvLT5yb2xlICE9IFJPTEVfVEFSR0VUKSB7CisJCQlyZWplY3QgPSBUUlVFOworCQkJYnJlYWs7CisJCX0KKwkJdGFnID0gU0NCX0xJU1RfTlVMTDsKKwkJaWYgKGFoYy0+bXNnaW5fYnVmWzBdID09IE1TR19BQk9SVF9UQUcpCisJCQl0YWcgPSBhaGNfaW5iKGFoYywgSU5JVElBVE9SX1RBRyk7CisJCWFoY19hYm9ydF9zY2JzKGFoYywgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5jaGFubmVsLAorCQkJICAgICAgIGRldmluZm8tPmx1biwgdGFnLCBST0xFX1RBUkdFVCwKKwkJCSAgICAgICBDQU1fUkVRX0FCT1JURUQpOworCisJCXRzdGF0ZSA9IGFoYy0+ZW5hYmxlZF90YXJnZXRzW2RldmluZm8tPm91cl9zY3NpaWRdOworCQlpZiAodHN0YXRlICE9IE5VTEwpIHsKKwkJCXN0cnVjdCBhaGNfdG1vZGVfbHN0YXRlKiBsc3RhdGU7CisKKwkJCWxzdGF0ZSA9IHRzdGF0ZS0+ZW5hYmxlZF9sdW5zW2RldmluZm8tPmx1bl07CisJCQlpZiAobHN0YXRlICE9IE5VTEwpIHsKKwkJCQlhaGNfcXVldWVfbHN0YXRlX2V2ZW50KGFoYywgbHN0YXRlLAorCQkJCQkJICAgICAgIGRldmluZm8tPm91cl9zY3NpaWQsCisJCQkJCQkgICAgICAgYWhjLT5tc2dpbl9idWZbMF0sCisJCQkJCQkgICAgICAgLyphcmcqL3RhZyk7CisJCQkJYWhjX3NlbmRfbHN0YXRlX2V2ZW50cyhhaGMsIGxzdGF0ZSk7CisJCQl9CisJCX0KKwkJYWhjX3Jlc3RhcnQoYWhjKTsKKwkJZG9uZSA9IE1TR0xPT1BfVEVSTUlOQVRFRDsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisJY2FzZSBNU0dfVEVSTV9JT19QUk9DOgorCWRlZmF1bHQ6CisJCXJlamVjdCA9IFRSVUU7CisJCWJyZWFrOworCX0KKworCWlmIChyZWplY3QpIHsKKwkJLyoKKwkJICogU2V0dXAgdG8gcmVqZWN0IHRoZSBtZXNzYWdlLgorCQkgKi8KKwkJYWhjLT5tc2dvdXRfaW5kZXggPSAwOworCQlhaGMtPm1zZ291dF9sZW4gPSAxOworCQlhaGMtPm1zZ291dF9idWZbMF0gPSBNU0dfTUVTU0FHRV9SRUpFQ1Q7CisJCWRvbmUgPSBNU0dMT09QX01TR0NPTVBMRVRFOworCQlyZXNwb25zZSA9IFRSVUU7CisJfQorCisJaWYgKGRvbmUgIT0gTVNHTE9PUF9JTl9QUk9HICYmICFyZXNwb25zZSkKKwkJLyogQ2xlYXIgdGhlIG91dGdvaW5nIG1lc3NhZ2UgYnVmZmVyICovCisJCWFoYy0+bXNnb3V0X2xlbiA9IDA7CisKKwlyZXR1cm4gKGRvbmUpOworfQorCisvKgorICogUHJvY2VzcyBhIG1lc3NhZ2UgcmVqZWN0IG1lc3NhZ2UuCisgKi8KK3N0YXRpYyBpbnQKK2FoY19oYW5kbGVfbXNnX3JlamVjdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbykKK3sKKwkvKgorCSAqIFdoYXQgd2UgY2FyZSBhYm91dCBoZXJlIGlzIGlmIHdlIGhhZCBhbgorCSAqIG91dHN0YW5kaW5nIFNEVFIgb3IgV0RUUiBtZXNzYWdlIGZvciB0aGlzCisJICogdGFyZ2V0LiAgSWYgd2UgZGlkLCB0aGlzIGlzIGEgc2lnbmFsIHRoYXQKKwkgKiB0aGUgdGFyZ2V0IGlzIHJlZnVzaW5nIG5lZ290aWF0aW9uLgorCSAqLworCXN0cnVjdCBzY2IgKnNjYjsKKwlzdHJ1Y3QgYWhjX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJc3RydWN0IGFoY190bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwl1X2ludCBzY2JfaW5kZXg7CisJdV9pbnQgbGFzdF9tc2c7CisJaW50ICAgcmVzcG9uc2UgPSAwOworCisJc2NiX2luZGV4ID0gYWhjX2luYihhaGMsIFNDQl9UQUcpOworCXNjYiA9IGFoY19sb29rdXBfc2NiKGFoYywgc2NiX2luZGV4KTsKKwl0aW5mbyA9IGFoY19mZXRjaF90cmFuc2luZm8oYWhjLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCSAgICBkZXZpbmZvLT5vdXJfc2NzaWlkLAorCQkJCSAgICBkZXZpbmZvLT50YXJnZXQsICZ0c3RhdGUpOworCS8qIE1pZ2h0IGJlIG5lY2Vzc2FyeSAqLworCWxhc3RfbXNnID0gYWhjX2luYihhaGMsIExBU1RfTVNHKTsKKworCWlmIChhaGNfc2VudF9tc2coYWhjLCBBSENNU0dfRVhULCBNU0dfRVhUX1BQUiwgLypmdWxsKi9GQUxTRSkpIHsKKwkJLyoKKwkJICogVGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgdGhlIFBQUiBtZXNzYWdlLgorCQkgKiBBdHRlbXB0IHRvIG5lZ290aWF0ZSBTUEktMiBzdHlsZS4KKwkJICovCisJCWlmIChib290dmVyYm9zZSkgeworCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBQUFIgUmVqZWN0ZWQuICIKKwkJCSAgICAgICAiVHJ5aW5nIFdEVFIvU0RUUlxuIiwKKwkJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKKwkJfQorCQl0aW5mby0+Z29hbC5wcHJfb3B0aW9ucyA9IDA7CisJCXRpbmZvLT5jdXJyLnRyYW5zcG9ydF92ZXJzaW9uID0gMjsKKwkJdGluZm8tPmdvYWwudHJhbnNwb3J0X3ZlcnNpb24gPSAyOworCQlhaGMtPm1zZ291dF9pbmRleCA9IDA7CisJCWFoYy0+bXNnb3V0X2xlbiA9IDA7CisJCWFoY19idWlsZF90cmFuc2Zlcl9tc2coYWhjLCBkZXZpbmZvKTsKKwkJYWhjLT5tc2dvdXRfaW5kZXggPSAwOworCQlyZXNwb25zZSA9IDE7CisJfSBlbHNlIGlmIChhaGNfc2VudF9tc2coYWhjLCBBSENNU0dfRVhULCBNU0dfRVhUX1dEVFIsIC8qZnVsbCovRkFMU0UpKSB7CisKKwkJLyogbm90ZSA4Yml0IHhmZXJzICovCisJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogcmVmdXNlcyBXSURFIG5lZ290aWF0aW9uLiAgVXNpbmcgIgorCQkgICAgICAgIjhiaXQgdHJhbnNmZXJzXG4iLCBhaGNfbmFtZShhaGMpLAorCQkgICAgICAgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOworCQlhaGNfc2V0X3dpZHRoKGFoYywgZGV2aW5mbywgTVNHX0VYVF9XRFRSX0JVU184X0JJVCwKKwkJCSAgICAgIEFIQ19UUkFOU19BQ1RJVkV8QUhDX1RSQU5TX0dPQUwsCisJCQkgICAgICAvKnBhdXNlZCovVFJVRSk7CisJCS8qCisJCSAqIE5vIG5lZWQgdG8gY2xlYXIgdGhlIHN5bmMgcmF0ZS4gIElmIHRoZSB0YXJnZXQKKwkJICogZGlkIG5vdCBhY2NlcHQgdGhlIGNvbW1hbmQsIG91ciBzeW5jcmF0ZSBpcworCQkgKiB1bmFmZmVjdGVkLiAgSWYgdGhlIHRhcmdldCBzdGFydGVkIHRoZSBuZWdvdGlhdGlvbiwKKwkJICogYnV0IHJlamVjdGVkIG91ciByZXNwb25zZSwgd2UgYWxyZWFkeSBjbGVhcmVkIHRoZQorCQkgKiBzeW5jIHJhdGUgYmVmb3JlIHNlbmRpbmcgb3VyIFdEVFIuCisJCSAqLworCQlpZiAodGluZm8tPmdvYWwub2Zmc2V0ICE9IHRpbmZvLT5jdXJyLm9mZnNldCkgeworCisJCQkvKiBTdGFydCB0aGUgc3luYyBuZWdvdGlhdGlvbiAqLworCQkJYWhjLT5tc2dvdXRfaW5kZXggPSAwOworCQkJYWhjLT5tc2dvdXRfbGVuID0gMDsKKwkJCWFoY19idWlsZF90cmFuc2Zlcl9tc2coYWhjLCBkZXZpbmZvKTsKKwkJCWFoYy0+bXNnb3V0X2luZGV4ID0gMDsKKwkJCXJlc3BvbnNlID0gMTsKKwkJfQorCX0gZWxzZSBpZiAoYWhjX3NlbnRfbXNnKGFoYywgQUhDTVNHX0VYVCwgTVNHX0VYVF9TRFRSLCAvKmZ1bGwqL0ZBTFNFKSkgeworCQkvKiBub3RlIGFzeW5jaCB4ZmVycyBhbmQgY2xlYXIgZmxhZyAqLworCQlhaGNfc2V0X3N5bmNyYXRlKGFoYywgZGV2aW5mbywgLypzeW5jcmF0ZSovTlVMTCwgLypwZXJpb2QqLzAsCisJCQkJIC8qb2Zmc2V0Ki8wLCAvKnBwcl9vcHRpb25zKi8wLAorCQkJCSBBSENfVFJBTlNfQUNUSVZFfEFIQ19UUkFOU19HT0FMLAorCQkJCSAvKnBhdXNlZCovVFJVRSk7CisJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogcmVmdXNlcyBzeW5jaHJvbm91cyBuZWdvdGlhdGlvbi4gIgorCQkgICAgICAgIlVzaW5nIGFzeW5jaHJvbm91cyB0cmFuc2ZlcnNcbiIsCisJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOworCX0gZWxzZSBpZiAoKHNjYi0+aHNjYi0+Y29udHJvbCAmIE1TR19TSU1QTEVfVEFTSykgIT0gMCkgeworCQlpbnQgdGFnX3R5cGU7CisJCWludCBtYXNrOworCisJCXRhZ190eXBlID0gKHNjYi0+aHNjYi0+Y29udHJvbCAmIE1TR19TSU1QTEVfVEFTSyk7CisKKwkJaWYgKHRhZ190eXBlID09IE1TR19TSU1QTEVfVEFTSykgeworCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiByZWZ1c2VzIHRhZ2dlZCBjb21tYW5kcy4gICIKKwkJCSAgICAgICAiUGVyZm9ybWluZyBub24tdGFnZ2VkIEkvT1xuIiwgYWhjX25hbWUoYWhjKSwKKwkJCSAgICAgICBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1bik7CisJCQlhaGNfc2V0X3RhZ3MoYWhjLCBkZXZpbmZvLCBBSENfUVVFVUVfTk9ORSk7CisJCQltYXNrID0gfjB4MjM7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiglczolYzolZDolZCk6IHJlZnVzZXMgJXMgdGFnZ2VkIGNvbW1hbmRzLiAgIgorCQkJICAgICAgICJQZXJmb3JtaW5nIHNpbXBsZSBxdWV1ZSB0YWdnZWQgSS9PIG9ubHlcbiIsCisJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAorCQkJICAgICAgIGRldmluZm8tPmx1biwgdGFnX3R5cGUgPT0gTVNHX09SREVSRURfVEFTSworCQkJICAgICAgID8gIm9yZGVyZWQiIDogImhlYWQgb2YgcXVldWUiKTsKKwkJCWFoY19zZXRfdGFncyhhaGMsIGRldmluZm8sIEFIQ19RVUVVRV9CQVNJQyk7CisJCQltYXNrID0gfjB4MDM7CisJCX0KKworCQkvKgorCQkgKiBSZXNlbmQgdGhlIGlkZW50aWZ5IGZvciB0aGlzIENDQiBhcyB0aGUgdGFyZ2V0CisJCSAqIG1heSBiZWxpZXZlIHRoYXQgdGhlIHNlbGVjdGlvbiBpcyBpbnZhbGlkIG90aGVyd2lzZS4KKwkJICovCisJCWFoY19vdXRiKGFoYywgU0NCX0NPTlRST0wsCisJCQkgYWhjX2luYihhaGMsIFNDQl9DT05UUk9MKSAmIG1hc2spOworCSAJc2NiLT5oc2NiLT5jb250cm9sICY9IG1hc2s7CisJCWFoY19zZXRfdHJhbnNhY3Rpb25fdGFnKHNjYiwgLyplbmFibGVkKi9GQUxTRSwKKwkJCQkJLyp0eXBlKi9NU0dfU0lNUExFX1RBU0spOworCQlhaGNfb3V0YihhaGMsIE1TR19PVVQsIE1TR19JREVOVElGWUZMQUcpOworCQlhaGNfYXNzZXJ0X2F0bihhaGMpOworCisJCS8qCisJCSAqIFRoaXMgdHJhbnNhY3Rpb24gaXMgbm93IGF0IHRoZSBoZWFkIG9mCisJCSAqIHRoZSB1bnRhZ2dlZCBxdWV1ZSBmb3IgdGhpcyB0YXJnZXQuCisJCSAqLworCQlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfU0NCX0JUVCkgPT0gMCkgeworCQkJc3RydWN0IHNjYl90YWlscSAqdW50YWdnZWRfcTsKKworCQkJdW50YWdnZWRfcSA9CisJCQkgICAgJihhaGMtPnVudGFnZ2VkX3F1ZXVlc1tkZXZpbmZvLT50YXJnZXRfb2Zmc2V0XSk7CisJCQlUQUlMUV9JTlNFUlRfSEVBRCh1bnRhZ2dlZF9xLCBzY2IsIGxpbmtzLnRxZSk7CisJCQlzY2ItPmZsYWdzIHw9IFNDQl9VTlRBR0dFRFE7CisJCX0KKwkJYWhjX2J1c3lfdGNsKGFoYywgQlVJTERfVENMKHNjYi0+aHNjYi0+c2NzaWlkLCBkZXZpbmZvLT5sdW4pLAorCQkJICAgICBzY2ItPmhzY2ItPnRhZyk7CisKKwkJLyoKKwkJICogUmVxdWV1ZSBhbGwgdGFnZ2VkIGNvbW1hbmRzIGZvciB0aGlzIHRhcmdldAorCQkgKiBjdXJyZW50bHkgaW4gb3VyIHBvc2Vzc2lvbiBzbyB0aGV5IGNhbiBiZQorCQkgKiBjb252ZXJ0ZWQgdG8gdW50YWdnZWQgY29tbWFuZHMuCisJCSAqLworCQlhaGNfc2VhcmNoX3FpbmZpZm8oYWhjLCBTQ0JfR0VUX1RBUkdFVChhaGMsIHNjYiksCisJCQkJICAgU0NCX0dFVF9DSEFOTkVMKGFoYywgc2NiKSwKKwkJCQkgICBTQ0JfR0VUX0xVTihzY2IpLCAvKnRhZyovU0NCX0xJU1RfTlVMTCwKKwkJCQkgICBST0xFX0lOSVRJQVRPUiwgQ0FNX1JFUVVFVUVfUkVRLAorCQkJCSAgIFNFQVJDSF9DT01QTEVURSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogT3RoZXJ3aXNlLCB3ZSBpZ25vcmUgaXQuCisJCSAqLworCQlwcmludGYoIiVzOiVjOiVkOiBNZXNzYWdlIHJlamVjdCBmb3IgJXggLS0gaWdub3JlZFxuIiwKKwkJICAgICAgIGFoY19uYW1lKGFoYyksIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKKwkJICAgICAgIGxhc3RfbXNnKTsKKwl9CisJcmV0dXJuIChyZXNwb25zZSk7Cit9CisKKy8qCisgKiBQcm9jZXNzIGFuIGluZ25vcmUgd2lkZSByZXNpZHVlIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyB2b2lkCithaGNfaGFuZGxlX2lnbl93aWRlX3Jlc2lkdWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pCit7CisJdV9pbnQgc2NiX2luZGV4OworCXN0cnVjdCBzY2IgKnNjYjsKKworCXNjYl9pbmRleCA9IGFoY19pbmIoYWhjLCBTQ0JfVEFHKTsKKwlzY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIHNjYl9pbmRleCk7CisJLyoKKwkgKiBYWFggQWN0dWFsbHkgY2hlY2sgZGF0YSBkaXJlY3Rpb24gaW4gdGhlIHNlcXVlbmNlcj8KKwkgKiBQZXJoYXBzIGFkZCBkYXRhZGlyIHRvIHNvbWUgc3BhcmUgYml0cyBpbiB0aGUgaHNjYj8KKwkgKi8KKwlpZiAoKGFoY19pbmIoYWhjLCBTRVFfRkxBR1MpICYgRFBIQVNFKSA9PSAwCisJIHx8IGFoY19nZXRfdHJhbnNmZXJfZGlyKHNjYikgIT0gQ0FNX0RJUl9JTikgeworCQkvKgorCQkgKiBJZ25vcmUgdGhlIG1lc3NhZ2UgaWYgd2UgaGF2ZW4ndAorCQkgKiBzZWVuIGFuIGFwcHJvcHJpYXRlIGRhdGEgcGhhc2UgeWV0LgorCQkgKi8KKwl9IGVsc2UgeworCQkvKgorCQkgKiBJZiB0aGUgcmVzaWR1YWwgb2NjdXJyZWQgb24gdGhlIGxhc3QKKwkJICogdHJhbnNmZXIgYW5kIHRoZSB0cmFuc2ZlciByZXF1ZXN0IHdhcworCQkgKiBleHBlY3RlZCB0byBlbmQgb24gYW4gb2RkIGNvdW50LCBkbworCQkgKiBub3RoaW5nLiAgT3RoZXJ3aXNlLCBzdWJ0cmFjdCBhIGJ5dGUKKwkJICogYW5kIHVwZGF0ZSB0aGUgcmVzaWR1YWwgY291bnQgYWNjb3JkaW5nbHkuCisJCSAqLworCQl1aW50MzJfdCBzZ3B0cjsKKworCQlzZ3B0ciA9IGFoY19pbmIoYWhjLCBTQ0JfUkVTSURVQUxfU0dQVFIpOworCQlpZiAoKHNncHRyICYgU0dfTElTVF9OVUxMKSAhPSAwCisJCSAmJiAoYWhjX2luYihhaGMsIFNDQl9MVU4pICYgU0NCX1hGRVJMRU5fT0REKSAhPSAwKSB7CisJCQkvKgorCQkJICogSWYgdGhlIHJlc2lkdWFsIG9jY3VycmVkIG9uIHRoZSBsYXN0CisJCQkgKiB0cmFuc2ZlciBhbmQgdGhlIHRyYW5zZmVyIHJlcXVlc3Qgd2FzCisJCQkgKiBleHBlY3RlZCB0byBlbmQgb24gYW4gb2RkIGNvdW50LCBkbworCQkJICogbm90aGluZy4KKwkJCSAqLworCQl9IGVsc2UgeworCQkJc3RydWN0IGFoY19kbWFfc2VnICpzZzsKKwkJCXVpbnQzMl90IGRhdGFfY250OworCQkJdWludDMyX3QgZGF0YV9hZGRyOworCQkJdWludDMyX3Qgc2dsZW47CisKKwkJCS8qIFB1bGwgaW4gYWxsIG9mIHRoZSBzZ3B0ciAqLworCQkJc2dwdHIgPSBhaGNfaW5sKGFoYywgU0NCX1JFU0lEVUFMX1NHUFRSKTsKKwkJCWRhdGFfY250ID0gYWhjX2lubChhaGMsIFNDQl9SRVNJRFVBTF9EQVRBQ05UKTsKKworCQkJaWYgKChzZ3B0ciAmIFNHX0xJU1RfTlVMTCkgIT0gMCkgeworCQkJCS8qCisJCQkJICogVGhlIHJlc2lkdWFsIGRhdGEgY291bnQgaXMgbm90IHVwZGF0ZWQKKwkJCQkgKiBmb3IgdGhlIGNvbW1hbmQgcnVuIHRvIGNvbXBsZXRpb24gY2FzZS4KKwkJCQkgKiBFeHBsaWNpdGx5IHplcm8gdGhlIGNvdW50LgorCQkJCSAqLworCQkJCWRhdGFfY250ICY9IH5BSENfU0dfTEVOX01BU0s7CisJCQl9CisKKwkJCWRhdGFfYWRkciA9IGFoY19pbmwoYWhjLCBTSEFERFIpOworCisJCQlkYXRhX2NudCArPSAxOworCQkJZGF0YV9hZGRyIC09IDE7CisJCQlzZ3B0ciAmPSBTR19QVFJfTUFTSzsKKworCQkJc2cgPSBhaGNfc2dfYnVzX3RvX3ZpcnQoc2NiLCBzZ3B0cik7CisKKwkJCS8qCisJCQkgKiBUaGUgcmVzaWR1YWwgc2cgcHRyIHBvaW50cyB0byB0aGUgbmV4dCBTL0cKKwkJCSAqIHRvIGxvYWQgc28gd2UgbXVzdCBnbyBiYWNrIG9uZS4KKwkJCSAqLworCQkJc2ctLTsKKwkJCXNnbGVuID0gYWhjX2xlMzJ0b2goc2ctPmxlbikgJiBBSENfU0dfTEVOX01BU0s7CisJCQlpZiAoc2cgIT0gc2NiLT5zZ19saXN0CisJCQkgJiYgc2dsZW4gPCAoZGF0YV9jbnQgJiBBSENfU0dfTEVOX01BU0spKSB7CisKKwkJCQlzZy0tOworCQkJCXNnbGVuID0gYWhjX2xlMzJ0b2goc2ctPmxlbik7CisJCQkJLyoKKwkJCQkgKiBQcmVzZXJ2ZSBIaWdoIEFkZHJlc3MgYW5kIFNHX0xJU1QgYml0cworCQkJCSAqIHdoaWxlIHNldHRpbmcgdGhlIGNvdW50IHRvIDEuCisJCQkJICovCisJCQkJZGF0YV9jbnQgPSAxIHwgKHNnbGVuICYgKH5BSENfU0dfTEVOX01BU0spKTsKKwkJCQlkYXRhX2FkZHIgPSBhaGNfbGUzMnRvaChzZy0+YWRkcikKKwkJCQkJICArIChzZ2xlbiAmIEFIQ19TR19MRU5fTUFTSykgLSAxOworCisJCQkJLyoKKwkJCQkgKiBJbmNyZW1lbnQgc2cgc28gaXQgcG9pbnRzIHRvIHRoZQorCQkJCSAqICJuZXh0IiBzZy4KKwkJCQkgKi8KKwkJCQlzZysrOworCQkJCXNncHRyID0gYWhjX3NnX3ZpcnRfdG9fYnVzKHNjYiwgc2cpOworCQkJfQorCQkJYWhjX291dGwoYWhjLCBTQ0JfUkVTSURVQUxfU0dQVFIsIHNncHRyKTsKKwkJCWFoY19vdXRsKGFoYywgU0NCX1JFU0lEVUFMX0RBVEFDTlQsIGRhdGFfY250KTsKKwkJCS8qCisJCQkgKiBUb2dnbGUgdGhlICJvZGRuZXNzIiBvZiB0aGUgdHJhbnNmZXIgbGVuZ3RoCisJCQkgKiB0byBoYW5kbGUgdGhpcyBtaWQtdHJhbnNmZXIgaWdub3JlIHdpZGUKKwkJCSAqIHJlc2lkdWUuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgb2RkbmVzcyBpcworCQkJICogY29ycmVjdCBmb3Igc3Vic2VxdWVudCBkYXRhIHRyYW5zZmVycy4KKwkJCSAqLworCQkJYWhjX291dGIoYWhjLCBTQ0JfTFVOLAorCQkJCSBhaGNfaW5iKGFoYywgU0NCX0xVTikgXiBTQ0JfWEZFUkxFTl9PREQpOworCQl9CisJfQorfQorCisKKy8qCisgKiBSZWluaXRpYWxpemUgdGhlIGRhdGEgcG9pbnRlcnMgZm9yIHRoZSBhY3RpdmUgdHJhbnNmZXIKKyAqIGJhc2VkIG9uIGl0cyBjdXJyZW50IHJlc2lkdWFsLgorICovCitzdGF0aWMgdm9pZAorYWhjX3JlaW5pdGlhbGl6ZV9kYXRhcHRycyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJc3RydWN0CSBzY2IgKnNjYjsKKwlzdHJ1Y3QJIGFoY19kbWFfc2VnICpzZzsKKwl1X2ludAkgc2NiX2luZGV4OworCXVpbnQzMl90IHNncHRyOworCXVpbnQzMl90IHJlc2lkOworCXVpbnQzMl90IGRhdGFwdHI7CisKKwlzY2JfaW5kZXggPSBhaGNfaW5iKGFoYywgU0NCX1RBRyk7CisJc2NiID0gYWhjX2xvb2t1cF9zY2IoYWhjLCBzY2JfaW5kZXgpOworCXNncHRyID0gKGFoY19pbmIoYWhjLCBTQ0JfUkVTSURVQUxfU0dQVFIgKyAzKSA8PCAyNCkKKwkgICAgICB8IChhaGNfaW5iKGFoYywgU0NCX1JFU0lEVUFMX1NHUFRSICsgMikgPDwgMTYpCisJICAgICAgfCAoYWhjX2luYihhaGMsIFNDQl9SRVNJRFVBTF9TR1BUUiArIDEpIDw8IDgpCisJICAgICAgfAlhaGNfaW5iKGFoYywgU0NCX1JFU0lEVUFMX1NHUFRSKTsKKworCXNncHRyICY9IFNHX1BUUl9NQVNLOworCXNnID0gYWhjX3NnX2J1c190b192aXJ0KHNjYiwgc2dwdHIpOworCisJLyogVGhlIHJlc2lkdWFsIHNnX3B0ciBhbHdheXMgcG9pbnRzIHRvIHRoZSBuZXh0IHNnICovCisJc2ctLTsKKworCXJlc2lkID0gKGFoY19pbmIoYWhjLCBTQ0JfUkVTSURVQUxfREFUQUNOVCArIDIpIDw8IDE2KQorCSAgICAgIHwgKGFoY19pbmIoYWhjLCBTQ0JfUkVTSURVQUxfREFUQUNOVCArIDEpIDw8IDgpCisJICAgICAgfCBhaGNfaW5iKGFoYywgU0NCX1JFU0lEVUFMX0RBVEFDTlQpOworCisJZGF0YXB0ciA9IGFoY19sZTMydG9oKHNnLT5hZGRyKQorCQkrIChhaGNfbGUzMnRvaChzZy0+bGVuKSAmIEFIQ19TR19MRU5fTUFTSykKKwkJLSByZXNpZDsKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfMzlCSVRfQUREUkVTU0lORykgIT0gMCkgeworCQl1X2ludCBkc2NvbW1hbmQxOworCisJCWRzY29tbWFuZDEgPSBhaGNfaW5iKGFoYywgRFNDT01NQU5EMSk7CisJCWFoY19vdXRiKGFoYywgRFNDT01NQU5EMSwgZHNjb21tYW5kMSB8IEhBRERMRFNFTDApOworCQlhaGNfb3V0YihhaGMsIEhBRERSLAorCQkJIChhaGNfbGUzMnRvaChzZy0+bGVuKSA+PiAyNCkgJiBTR19ISUdIX0FERFJfQklUUyk7CisJCWFoY19vdXRiKGFoYywgRFNDT01NQU5EMSwgZHNjb21tYW5kMSk7CisJfQorCWFoY19vdXRiKGFoYywgSEFERFIgKyAzLCBkYXRhcHRyID4+IDI0KTsKKwlhaGNfb3V0YihhaGMsIEhBRERSICsgMiwgZGF0YXB0ciA+PiAxNik7CisJYWhjX291dGIoYWhjLCBIQUREUiArIDEsIGRhdGFwdHIgPj4gOCk7CisJYWhjX291dGIoYWhjLCBIQUREUiwgZGF0YXB0cik7CisJYWhjX291dGIoYWhjLCBIQ05UICsgMiwgcmVzaWQgPj4gMTYpOworCWFoY19vdXRiKGFoYywgSENOVCArIDEsIHJlc2lkID4+IDgpOworCWFoY19vdXRiKGFoYywgSENOVCwgcmVzaWQpOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID09IDApIHsKKwkJYWhjX291dGIoYWhjLCBTVENOVCArIDIsIHJlc2lkID4+IDE2KTsKKwkJYWhjX291dGIoYWhjLCBTVENOVCArIDEsIHJlc2lkID4+IDgpOworCQlhaGNfb3V0YihhaGMsIFNUQ05ULCByZXNpZCk7CisJfQorfQorCisvKgorICogSGFuZGxlIHRoZSBlZmZlY3RzIG9mIGlzc3VpbmcgYSBidXMgZGV2aWNlIHJlc2V0IG1lc3NhZ2UuCisgKi8KK3N0YXRpYyB2b2lkCithaGNfaGFuZGxlX2RldnJlc2V0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLAorCQkgICAgY2FtX3N0YXR1cyBzdGF0dXMsIGNoYXIgKm1lc3NhZ2UsIGludCB2ZXJib3NlX2xldmVsKQoreworI2lmZGVmIEFIQ19UQVJHRVRfTU9ERQorCXN0cnVjdCBhaGNfdG1vZGVfdHN0YXRlKiB0c3RhdGU7CisJdV9pbnQgbHVuOworI2VuZGlmCisJaW50IGZvdW5kOworCisJZm91bmQgPSBhaGNfYWJvcnRfc2NicyhhaGMsIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+Y2hhbm5lbCwKKwkJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBTQ0JfTElTVF9OVUxMLCBkZXZpbmZvLT5yb2xlLAorCQkJICAgICAgIHN0YXR1cyk7CisKKyNpZmRlZiBBSENfVEFSR0VUX01PREUKKwkvKgorCSAqIFNlbmQgYW4gaW1tZWRpYXRlIG5vdGlmeSBjY2IgdG8gYWxsIHRhcmdldCBtb3JkIHBlcmlwaGVyYWwKKwkgKiBkcml2ZXJzIGFmZmVjdGVkIGJ5IHRoaXMgYWN0aW9uLgorCSAqLworCXRzdGF0ZSA9IGFoYy0+ZW5hYmxlZF90YXJnZXRzW2RldmluZm8tPm91cl9zY3NpaWRdOworCWlmICh0c3RhdGUgIT0gTlVMTCkgeworCQlmb3IgKGx1biA9IDA7IGx1biA8IEFIQ19OVU1fTFVOUzsgbHVuKyspIHsKKwkJCXN0cnVjdCBhaGNfdG1vZGVfbHN0YXRlKiBsc3RhdGU7CisKKwkJCWxzdGF0ZSA9IHRzdGF0ZS0+ZW5hYmxlZF9sdW5zW2x1bl07CisJCQlpZiAobHN0YXRlID09IE5VTEwpCisJCQkJY29udGludWU7CisKKwkJCWFoY19xdWV1ZV9sc3RhdGVfZXZlbnQoYWhjLCBsc3RhdGUsIGRldmluZm8tPm91cl9zY3NpaWQsCisJCQkJCSAgICAgICBNU0dfQlVTX0RFVl9SRVNFVCwgLyphcmcqLzApOworCQkJYWhjX3NlbmRfbHN0YXRlX2V2ZW50cyhhaGMsIGxzdGF0ZSk7CisJCX0KKwl9CisjZW5kaWYKKworCS8qCisJICogR28gYmFjayB0byBhc3luYy9uYXJyb3cgdHJhbnNmZXJzIGFuZCByZW5lZ290aWF0ZS4KKwkgKi8KKwlhaGNfc2V0X3dpZHRoKGFoYywgZGV2aW5mbywgTVNHX0VYVF9XRFRSX0JVU184X0JJVCwKKwkJICAgICAgQUhDX1RSQU5TX0NVUiwgLypwYXVzZWQqL1RSVUUpOworCWFoY19zZXRfc3luY3JhdGUoYWhjLCBkZXZpbmZvLCAvKnN5bmNyYXRlKi9OVUxMLAorCQkJIC8qcGVyaW9kKi8wLCAvKm9mZnNldCovMCwgLypwcHJfb3B0aW9ucyovMCwKKwkJCSBBSENfVFJBTlNfQ1VSLCAvKnBhdXNlZCovVFJVRSk7CisJCisJYWhjX3NlbmRfYXN5bmMoYWhjLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsCisJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBBQ19TRU5UX0JEUiwgTlVMTCk7CisKKwlpZiAobWVzc2FnZSAhPSBOVUxMCisJICYmICh2ZXJib3NlX2xldmVsIDw9IGJvb3R2ZXJib3NlKSkKKwkJcHJpbnRmKCIlczogJXMgb24gJWM6JWQuICVkIFNDQnMgYWJvcnRlZFxuIiwgYWhjX25hbWUoYWhjKSwKKwkJICAgICAgIG1lc3NhZ2UsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwgZm91bmQpOworfQorCisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCitzdGF0aWMgdm9pZAorYWhjX3NldHVwX3RhcmdldF9tc2dpbihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJICAgICAgIHN0cnVjdCBzY2IgKnNjYikKK3sKKworCS8qICAgICAgICAgICAgICAKKwkgKiBUbyBmYWNpbGl0YXRlIGFkZGluZyBtdWx0aXBsZSBtZXNzYWdlcyB0b2dldGhlciwKKwkgKiBlYWNoIHJvdXRpbmUgc2hvdWxkIGluY3JlbWVudCB0aGUgaW5kZXggYW5kIGxlbgorCSAqIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIHNldHRpbmcgdGhlbSBleHBsaWNpdGx5LgorCSAqLyAgICAgICAgICAgICAKKwlhaGMtPm1zZ291dF9pbmRleCA9IDA7CisJYWhjLT5tc2dvdXRfbGVuID0gMDsKKworCWlmIChzY2IgIT0gTlVMTCAmJiAoc2NiLT5mbGFncyAmIFNDQl9BVVRPX05FR09USUFURSkgIT0gMCkKKwkJYWhjX2J1aWxkX3RyYW5zZmVyX21zZyhhaGMsIGRldmluZm8pOworCWVsc2UKKwkJcGFuaWMoImFoY19pbnRyOiBBV0FJVElORyB0YXJnZXQgbWVzc2FnZSB3aXRoIG5vIG1lc3NhZ2UiKTsKKworCWFoYy0+bXNnb3V0X2luZGV4ID0gMDsKKwlhaGMtPm1zZ190eXBlID0gTVNHX1RZUEVfVEFSR0VUX01TR0lOOworfQorI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJbml0aWFsaXphdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEFsbG9jYXRlIGEgY29udHJvbGxlciBzdHJ1Y3R1cmUgZm9yIGEgbmV3IGRldmljZQorICogYW5kIHBlcmZvcm0gaW5pdGlhbCBpbml0aWFsaXppb24uCisgKi8KK3N0cnVjdCBhaGNfc29mdGMgKgorYWhjX2FsbG9jKHZvaWQgKnBsYXRmb3JtX2FyZywgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgIGFoY19zb2Z0YyAqYWhjOworCWludAlpOworCisjaWZuZGVmCV9fRnJlZUJTRF9fCisJYWhjID0gbWFsbG9jKHNpemVvZigqYWhjKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlpZiAoIWFoYykgeworCQlwcmludGYoImFpYzd4eHg6IGNhbm5vdCBtYWxsb2Mgc29mdGMhXG4iKTsKKwkJZnJlZShuYW1lLCBNX0RFVkJVRik7CisJCXJldHVybiBOVUxMOworCX0KKyNlbHNlCisJYWhjID0gZGV2aWNlX2dldF9zb2Z0YygoZGV2aWNlX3QpcGxhdGZvcm1fYXJnKTsKKyNlbmRpZgorCW1lbXNldChhaGMsIDAsIHNpemVvZigqYWhjKSk7CisJYWhjLT5zZWVwX2NvbmZpZyA9IG1hbGxvYyhzaXplb2YoKmFoYy0+c2VlcF9jb25maWcpLAorCQkJCSAgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlpZiAoYWhjLT5zZWVwX2NvbmZpZyA9PSBOVUxMKSB7CisjaWZuZGVmCV9fRnJlZUJTRF9fCisJCWZyZWUoYWhjLCBNX0RFVkJVRik7CisjZW5kaWYKKwkJZnJlZShuYW1lLCBNX0RFVkJVRik7CisJCXJldHVybiAoTlVMTCk7CisJfQorCUxJU1RfSU5JVCgmYWhjLT5wZW5kaW5nX3NjYnMpOworCS8qIFdlIGRvbid0IGtub3cgb3VyIHVuaXQgbnVtYmVyIHVudGlsIHRoZSBPU00gc2V0cyBpdCAqLworCWFoYy0+bmFtZSA9IG5hbWU7CisJYWhjLT51bml0ID0gLTE7CisJYWhjLT5kZXNjcmlwdGlvbiA9IE5VTEw7CisJYWhjLT5jaGFubmVsID0gJ0EnOworCWFoYy0+Y2hhbm5lbF9iID0gJ0InOworCWFoYy0+Y2hpcCA9IEFIQ19OT05FOworCWFoYy0+ZmVhdHVyZXMgPSBBSENfRkVOT05FOworCWFoYy0+YnVncyA9IEFIQ19CVUdOT05FOworCWFoYy0+ZmxhZ3MgPSBBSENfRk5PTkU7CisJLyoKKwkgKiBEZWZhdWx0IHRvIGFsbCBlcnJvciByZXBvcnRpbmcgZW5hYmxlZCB3aXRoIHRoZQorCSAqIHNlcXVlbmNlciBvcGVyYXRpbmcgYXQgaXRzIGZhc3Rlc3Qgc3BlZWQuCisJICogVGhlIGJ1cyBhdHRhY2ggY29kZSBtYXkgbW9kaWZ5IHRoaXMuCisJICovCisJYWhjLT5zZXFjdGwgPSBGQVNUTU9ERTsKKworCWZvciAoaSA9IDA7IGkgPCBBSENfTlVNX1RBUkdFVFM7IGkrKykKKwkJVEFJTFFfSU5JVCgmYWhjLT51bnRhZ2dlZF9xdWV1ZXNbaV0pOworCWlmIChhaGNfcGxhdGZvcm1fYWxsb2MoYWhjLCBwbGF0Zm9ybV9hcmcpICE9IDApIHsKKwkJYWhjX2ZyZWUoYWhjKTsKKwkJYWhjID0gTlVMTDsKKwl9CisJcmV0dXJuIChhaGMpOworfQorCitpbnQKK2FoY19zb2Z0Y19pbml0KHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKworCS8qIFRoZSBJUlFNUyBiaXQgaXMgb25seSB2YWxpZCBvbiBWTCBhbmQgRUlTQSBjaGlwcyAqLworCWlmICgoYWhjLT5jaGlwICYgQUhDX1BDSSkgPT0gMCkKKwkJYWhjLT51bnBhdXNlID0gYWhjX2luYihhaGMsIEhDTlRSTCkgJiBJUlFNUzsKKwllbHNlCisJCWFoYy0+dW5wYXVzZSA9IDA7CisJYWhjLT5wYXVzZSA9IGFoYy0+dW5wYXVzZSB8IFBBVVNFOyAKKwkvKiBYWFggVGhlIHNoYXJlZCBzY2IgZGF0YSBzdHVmZiBzaG91bGQgYmUgZGVwcmVjYXRlZCAqLworCWlmIChhaGMtPnNjYl9kYXRhID09IE5VTEwpIHsKKwkJYWhjLT5zY2JfZGF0YSA9IG1hbGxvYyhzaXplb2YoKmFoYy0+c2NiX2RhdGEpLAorCQkJCSAgICAgICBNX0RFVkJVRiwgTV9OT1dBSVQpOworCQlpZiAoYWhjLT5zY2JfZGF0YSA9PSBOVUxMKQorCQkJcmV0dXJuIChFTk9NRU0pOworCQltZW1zZXQoYWhjLT5zY2JfZGF0YSwgMCwgc2l6ZW9mKCphaGMtPnNjYl9kYXRhKSk7CisJfQorCisJcmV0dXJuICgwKTsKK30KKwordm9pZAorYWhjX3NvZnRjX2luc2VydChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJc3RydWN0IGFoY19zb2Z0YyAqbGlzdF9haGM7CisKKyNpZiBBSENfUENJX0NPTkZJRyA+IDAKKwkvKgorCSAqIFNlY29uZCBGdW5jdGlvbiBQQ0kgZGV2aWNlcyBuZWVkIHRvIGluaGVyaXQgc29tZQorCSAqIHNldHRpbmdzIGZyb20gZnVuY3Rpb24gMC4KKwkgKi8KKwlpZiAoKGFoYy0+Y2hpcCAmIEFIQ19CVVNfTUFTSykgPT0gQUhDX1BDSQorCSAmJiAoYWhjLT5mZWF0dXJlcyAmIEFIQ19NVUxUSV9GVU5DKSAhPSAwKSB7CisJCVRBSUxRX0ZPUkVBQ0gobGlzdF9haGMsICZhaGNfdGFpbHEsIGxpbmtzKSB7CisJCQlhaGNfZGV2X3NvZnRjX3QgbGlzdF9wY2k7CisJCQlhaGNfZGV2X3NvZnRjX3QgcGNpOworCisJCQlsaXN0X3BjaSA9IGxpc3RfYWhjLT5kZXZfc29mdGM7CisJCQlwY2kgPSBhaGMtPmRldl9zb2Z0YzsKKwkJCWlmIChhaGNfZ2V0X3BjaV9zbG90KGxpc3RfcGNpKSA9PSBhaGNfZ2V0X3BjaV9zbG90KHBjaSkKKwkJCSAmJiBhaGNfZ2V0X3BjaV9idXMobGlzdF9wY2kpID09IGFoY19nZXRfcGNpX2J1cyhwY2kpKSB7CisJCQkJc3RydWN0IGFoY19zb2Z0YyAqbWFzdGVyOworCQkJCXN0cnVjdCBhaGNfc29mdGMgKnNsYXZlOworCisJCQkJaWYgKGFoY19nZXRfcGNpX2Z1bmN0aW9uKGxpc3RfcGNpKSA9PSAwKSB7CisJCQkJCW1hc3RlciA9IGxpc3RfYWhjOworCQkJCQlzbGF2ZSA9IGFoYzsKKwkJCQl9IGVsc2UgeworCQkJCQltYXN0ZXIgPSBhaGM7CisJCQkJCXNsYXZlID0gbGlzdF9haGM7CisJCQkJfQorCQkJCXNsYXZlLT5mbGFncyAmPSB+QUhDX0JJT1NfRU5BQkxFRDsgCisJCQkJc2xhdmUtPmZsYWdzIHw9CisJCQkJICAgIG1hc3Rlci0+ZmxhZ3MgJiBBSENfQklPU19FTkFCTEVEOworCQkJCXNsYXZlLT5mbGFncyAmPSB+QUhDX1BSSU1BUllfQ0hBTk5FTDsgCisJCQkJc2xhdmUtPmZsYWdzIHw9CisJCQkJICAgIG1hc3Rlci0+ZmxhZ3MgJiBBSENfUFJJTUFSWV9DSEFOTkVMOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorI2VuZGlmCisKKwkvKgorCSAqIEluc2VydGlvbiBzb3J0IGludG8gb3VyIGxpc3Qgb2Ygc29mdGNzLgorCSAqLworCWxpc3RfYWhjID0gVEFJTFFfRklSU1QoJmFoY190YWlscSk7CisJd2hpbGUgKGxpc3RfYWhjICE9IE5VTEwKKwkgICAgJiYgYWhjX3NvZnRjX2NvbXAoYWhjLCBsaXN0X2FoYykgPD0gMCkKKwkJbGlzdF9haGMgPSBUQUlMUV9ORVhUKGxpc3RfYWhjLCBsaW5rcyk7CisJaWYgKGxpc3RfYWhjICE9IE5VTEwpCisJCVRBSUxRX0lOU0VSVF9CRUZPUkUobGlzdF9haGMsIGFoYywgbGlua3MpOworCWVsc2UKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJmFoY190YWlscSwgYWhjLCBsaW5rcyk7CisJYWhjLT5pbml0X2xldmVsKys7Cit9CisKKy8qCisgKiBWZXJpZnkgdGhhdCB0aGUgcGFzc2VkIGluIHNvZnRjIHBvaW50ZXIgaXMgZm9yIGEKKyAqIGNvbnRyb2xsZXIgdGhhdCBpcyBzdGlsbCBjb25maWd1cmVkLgorICovCitzdHJ1Y3QgYWhjX3NvZnRjICoKK2FoY19maW5kX3NvZnRjKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlzdHJ1Y3QgYWhjX3NvZnRjICpsaXN0X2FoYzsKKworCVRBSUxRX0ZPUkVBQ0gobGlzdF9haGMsICZhaGNfdGFpbHEsIGxpbmtzKSB7CisJCWlmIChsaXN0X2FoYyA9PSBhaGMpCisJCQlyZXR1cm4gKGFoYyk7CisJfQorCXJldHVybiAoTlVMTCk7Cit9CisKK3ZvaWQKK2FoY19zZXRfdW5pdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCB1bml0KQoreworCWFoYy0+dW5pdCA9IHVuaXQ7Cit9CisKK3ZvaWQKK2FoY19zZXRfbmFtZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGNoYXIgKm5hbWUpCit7CisJaWYgKGFoYy0+bmFtZSAhPSBOVUxMKQorCQlmcmVlKGFoYy0+bmFtZSwgTV9ERVZCVUYpOworCWFoYy0+bmFtZSA9IG5hbWU7Cit9CisKK3ZvaWQKK2FoY19mcmVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlpbnQgaTsKKworCXN3aXRjaCAoYWhjLT5pbml0X2xldmVsKSB7CisJZGVmYXVsdDoKKwljYXNlIDU6CisJCWFoY19zaHV0ZG93bihhaGMpOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgNDoKKwkJYWhjX2RtYW1hcF91bmxvYWQoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsCisJCQkJICBhaGMtPnNoYXJlZF9kYXRhX2RtYW1hcCk7CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSAzOgorCQlhaGNfZG1hbWVtX2ZyZWUoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsIGFoYy0+cW91dGZpZm8sCisJCQkJYWhjLT5zaGFyZWRfZGF0YV9kbWFtYXApOworCQlhaGNfZG1hbWFwX2Rlc3Ryb3koYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsCisJCQkJICAgYWhjLT5zaGFyZWRfZGF0YV9kbWFtYXApOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgMjoKKwkJYWhjX2RtYV90YWdfZGVzdHJveShhaGMsIGFoYy0+c2hhcmVkX2RhdGFfZG1hdCk7CisJY2FzZSAxOgorI2lmbmRlZiBfX2xpbnV4X18KKwkJYWhjX2RtYV90YWdfZGVzdHJveShhaGMsIGFoYy0+YnVmZmVyX2RtYXQpOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgMDoKKwkJYnJlYWs7CisJfQorCisjaWZuZGVmIF9fbGludXhfXworCWFoY19kbWFfdGFnX2Rlc3Ryb3koYWhjLCBhaGMtPnBhcmVudF9kbWF0KTsKKyNlbmRpZgorCWFoY19wbGF0Zm9ybV9mcmVlKGFoYyk7CisJYWhjX2Zpbmlfc2NiZGF0YShhaGMpOworCWZvciAoaSA9IDA7IGkgPCBBSENfTlVNX1RBUkdFVFM7IGkrKykgeworCQlzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCisJCXRzdGF0ZSA9IGFoYy0+ZW5hYmxlZF90YXJnZXRzW2ldOworCQlpZiAodHN0YXRlICE9IE5VTEwpIHsKKyNpZmRlZiBBSENfVEFSR0VUX01PREUKKwkJCWludCBqOworCisJCQlmb3IgKGogPSAwOyBqIDwgQUhDX05VTV9MVU5TOyBqKyspIHsKKwkJCQlzdHJ1Y3QgYWhjX3Rtb2RlX2xzdGF0ZSAqbHN0YXRlOworCisJCQkJbHN0YXRlID0gdHN0YXRlLT5lbmFibGVkX2x1bnNbal07CisJCQkJaWYgKGxzdGF0ZSAhPSBOVUxMKSB7CisJCQkJCXhwdF9mcmVlX3BhdGgobHN0YXRlLT5wYXRoKTsKKwkJCQkJZnJlZShsc3RhdGUsIE1fREVWQlVGKTsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJCWZyZWUodHN0YXRlLCBNX0RFVkJVRik7CisJCX0KKwl9CisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCisJaWYgKGFoYy0+YmxhY2tfaG9sZSAhPSBOVUxMKSB7CisJCXhwdF9mcmVlX3BhdGgoYWhjLT5ibGFja19ob2xlLT5wYXRoKTsKKwkJZnJlZShhaGMtPmJsYWNrX2hvbGUsIE1fREVWQlVGKTsKKwl9CisjZW5kaWYKKwlpZiAoYWhjLT5uYW1lICE9IE5VTEwpCisJCWZyZWUoYWhjLT5uYW1lLCBNX0RFVkJVRik7CisJaWYgKGFoYy0+c2VlcF9jb25maWcgIT0gTlVMTCkKKwkJZnJlZShhaGMtPnNlZXBfY29uZmlnLCBNX0RFVkJVRik7CisjaWZuZGVmIF9fRnJlZUJTRF9fCisJZnJlZShhaGMsIE1fREVWQlVGKTsKKyNlbmRpZgorCXJldHVybjsKK30KKwordm9pZAorYWhjX3NodXRkb3duKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QJYWhjX3NvZnRjICphaGM7CisJaW50CWk7CisKKwlhaGMgPSAoc3RydWN0IGFoY19zb2Z0YyAqKWFyZzsKKworCS8qIFRoaXMgd2lsbCByZXNldCBtb3N0IHJlZ2lzdGVycyB0byAwLCBidXQgbm90IGFsbCAqLworCWFoY19yZXNldChhaGMsIC8qcmVpbml0Ki9GQUxTRSk7CisJYWhjX291dGIoYWhjLCBTQ1NJU0VRLCAwKTsKKwlhaGNfb3V0YihhaGMsIFNYRlJDVEwwLCAwKTsKKwlhaGNfb3V0YihhaGMsIERTUENJU1RBVFVTLCAwKTsKKworCWZvciAoaSA9IFRBUkdfU0NTSVJBVEU7IGkgPCBTQ1NJQ09ORjsgaSsrKQorCQlhaGNfb3V0YihhaGMsIGksIDApOworfQorCisvKgorICogUmVzZXQgdGhlIGNvbnRyb2xsZXIgYW5kIHJlY29yZCBzb21lIGluZm9ybWF0aW9uIGFib3V0IGl0CisgKiB0aGF0IGlzIG9ubHkgYXZhaWxhYmxlIGp1c3QgYWZ0ZXIgYSByZXNldC4gIElmICJyZWluaXQiIGlzCisgKiBub24temVybywgdGhpcyByZXNldCBvY2N1cmVkIGFmdGVyIGluaXRpYWwgY29uZmlndXJhdGlvbgorICogYW5kIHRoZSBjYWxsZXIgcmVxdWVzdHMgdGhhdCB0aGUgY2hpcCBiZSBmdWxseSByZWluaXRpYWxpemVkCisgKiB0byBhIHJ1bmFibGUgc3RhdGUuICBDaGlwIGludGVycnVwdHMgYXJlICpub3QqIGVuYWJsZWQgYWZ0ZXIKKyAqIGEgcmVpbml0aWFsaXphdGlvbi4gIFRoZSBjYWxsZXIgbXVzdCBlbmFibGUgaW50ZXJydXB0cyB2aWEKKyAqIGFoY19pbnRyX2VuYWJsZSgpLgorICovCitpbnQKK2FoY19yZXNldChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCByZWluaXQpCit7CisJdV9pbnQJc2Jsa2N0bDsKKwl1X2ludAlzeGZyY3RsMV9hLCBzeGZyY3RsMV9iOworCWludAllcnJvcjsKKwlpbnQJd2FpdDsKKwkKKwkvKgorCSAqIFByZXNlcnZlIHRoZSB2YWx1ZSBvZiB0aGUgU1hGUkNUTDEgcmVnaXN0ZXIgZm9yIGFsbCBjaGFubmVscy4KKwkgKiBJdCBjb250YWlucyBzZXR0aW5ncyB0aGF0IGFmZmVjdCB0ZXJtaW5hdGlvbiBhbmQgd2UgZG9uJ3Qgd2FudAorCSAqIHRvIGRpc3R1cmIgdGhlIGludGVncml0eSBvZiB0aGUgYnVzLgorCSAqLworCWFoY19wYXVzZShhaGMpOworCWlmICgoYWhjX2luYihhaGMsIEhDTlRSTCkgJiBDSElQUlNUKSAhPSAwKSB7CisJCS8qCisJCSAqIFRoZSBjaGlwIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCBzaW5jZQorCQkgKiBQQ0kvRUlTQS9WTEIgYnVzIHJlc2V0LiAgRG9uJ3QgdHJ1c3QKKwkJICogImxlZnQgb3ZlciBCSU9TIGRhdGEiLgorCQkgKi8KKwkJYWhjLT5mbGFncyB8PSBBSENfTk9fQklPU19JTklUOworCX0KKwlzeGZyY3RsMV9iID0gMDsKKwlpZiAoKGFoYy0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykgPT0gQUhDX0FJQzc3NzApIHsKKwkJdV9pbnQgc2Jsa2N0bDsKKworCQkvKgorCQkgKiBTYXZlIGNoYW5uZWwgQidzIHNldHRpbmdzIGluIGNhc2UgdGhpcyBjaGlwCisJCSAqIGlzIHNldHVwIGZvciBUV0lOIGNoYW5uZWwgb3BlcmF0aW9uLgorCQkgKi8KKwkJc2Jsa2N0bCA9IGFoY19pbmIoYWhjLCBTQkxLQ1RMKTsKKwkJYWhjX291dGIoYWhjLCBTQkxLQ1RMLCBzYmxrY3RsIHwgU0VMQlVTQik7CisJCXN4ZnJjdGwxX2IgPSBhaGNfaW5iKGFoYywgU1hGUkNUTDEpOworCQlhaGNfb3V0YihhaGMsIFNCTEtDVEwsIHNibGtjdGwgJiB+U0VMQlVTQik7CisJfQorCXN4ZnJjdGwxX2EgPSBhaGNfaW5iKGFoYywgU1hGUkNUTDEpOworCisJYWhjX291dGIoYWhjLCBIQ05UUkwsIENISVBSU1QgfCBhaGMtPnBhdXNlKTsKKworCS8qCisJICogRW5zdXJlIHRoYXQgdGhlIHJlc2V0IGhhcyBmaW5pc2hlZC4gIFdlIGRlbGF5IDEwMDB1cworCSAqIHByaW9yIHRvIHJlYWRpbmcgdGhlIHJlZ2lzdGVyIHRvIG1ha2Ugc3VyZSB0aGUgY2hpcAorCSAqIGhhcyBzdWZmaWNpZW50bHkgY29tcGxldGVkIGl0cyByZXNldCB0byBoYW5kbGUgcmVnaXN0ZXIKKwkgKiBhY2Nlc3Nlcy4KKwkgKi8KKwl3YWl0ID0gMTAwMDsKKwlkbyB7CisJCWFoY19kZWxheSgxMDAwKTsKKwl9IHdoaWxlICgtLXdhaXQgJiYgIShhaGNfaW5iKGFoYywgSENOVFJMKSAmIENISVBSU1RBQ0spKTsKKworCWlmICh3YWl0ID09IDApIHsKKwkJcHJpbnRmKCIlczogV0FSTklORyAtIEZhaWxlZCBjaGlwIHJlc2V0ISAgIgorCQkgICAgICAgIlRyeWluZyB0byBpbml0aWFsaXplIGFueXdheS5cbiIsIGFoY19uYW1lKGFoYykpOworCX0KKwlhaGNfb3V0YihhaGMsIEhDTlRSTCwgYWhjLT5wYXVzZSk7CisKKwkvKiBEZXRlcm1pbmUgY2hhbm5lbCBjb25maWd1cmF0aW9uICovCisJc2Jsa2N0bCA9IGFoY19pbmIoYWhjLCBTQkxLQ1RMKSAmIChTRUxCVVNCfFNFTFdJREUpOworCS8qIE5vIFR3aW4gQ2hhbm5lbCBQQ0kgY2FyZHMgKi8KKwlpZiAoKGFoYy0+Y2hpcCAmIEFIQ19QQ0kpICE9IDApCisJCXNibGtjdGwgJj0gflNFTEJVU0I7CisJc3dpdGNoIChzYmxrY3RsKSB7CisJY2FzZSAwOgorCQkvKiBTaW5nbGUgTmFycm93IENoYW5uZWwgKi8KKwkJYnJlYWs7CisJY2FzZSAyOgorCQkvKiBXaWRlIENoYW5uZWwgKi8KKwkJYWhjLT5mZWF0dXJlcyB8PSBBSENfV0lERTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQkvKiBUd2luIENoYW5uZWwgKi8KKwkJYWhjLT5mZWF0dXJlcyB8PSBBSENfVFdJTjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCIgVW5zdXBwb3J0ZWQgYWRhcHRlciB0eXBlLiAgSWdub3JpbmdcbiIpOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qCisJICogUmVsb2FkIHN4ZnJjdGwxLgorCSAqCisJICogV2UgbXVzdCBhbHdheXMgaW5pdGlhbGl6ZSBTVFBXRU4gdG8gMSBiZWZvcmUgd2UKKwkgKiByZXN0b3JlIHRoZSBzYXZlZCB2YWx1ZXMuICBTVFBXRU4gaXMgaW5pdGlhbGl6ZWQKKwkgKiB0byBhIHRyaS1zdGF0ZSBjb25kaXRpb24gd2hpY2ggY2FuIG9ubHkgYmUgY2xlYXJlZAorCSAqIGJ5IHR1cm5pbmcgaXQgb24uCisJICovCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pICE9IDApIHsKKwkJdV9pbnQgc2Jsa2N0bDsKKworCQlzYmxrY3RsID0gYWhjX2luYihhaGMsIFNCTEtDVEwpOworCQlhaGNfb3V0YihhaGMsIFNCTEtDVEwsIHNibGtjdGwgfCBTRUxCVVNCKTsKKwkJYWhjX291dGIoYWhjLCBTWEZSQ1RMMSwgc3hmcmN0bDFfYik7CisJCWFoY19vdXRiKGFoYywgU0JMS0NUTCwgc2Jsa2N0bCAmIH5TRUxCVVNCKTsKKwl9CisJYWhjX291dGIoYWhjLCBTWEZSQ1RMMSwgc3hmcmN0bDFfYSk7CisKKwllcnJvciA9IDA7CisJaWYgKHJlaW5pdCAhPSAwKQorCQkvKgorCQkgKiBJZiBhIHJlY292ZXJ5IGFjdGlvbiBoYXMgZm9yY2VkIGEgY2hpcCByZXNldCwKKwkJICogcmUtaW5pdGlhbGl6ZSB0aGUgY2hpcCB0byBvdXIgbGlraW5nLgorCQkgKi8KKwkJZXJyb3IgPSBhaGMtPmJ1c19jaGlwX2luaXQoYWhjKTsKKyNpZmRlZiBBSENfRFVNUF9TRVEKKwllbHNlIAorCQlhaGNfZHVtcHNlcShhaGMpOworI2VuZGlmCisKKwlyZXR1cm4gKGVycm9yKTsKK30KKworLyoKKyAqIERldGVybWluZSB0aGUgbnVtYmVyIG9mIFNDQnMgYXZhaWxhYmxlIG9uIHRoZSBjb250cm9sbGVyCisgKi8KK2ludAorYWhjX3Byb2JlX3NjYnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKSB7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUhDX1NDQl9NQVg7IGkrKykgeworCisJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBpKTsKKwkJYWhjX291dGIoYWhjLCBTQ0JfQkFTRSwgaSk7CisJCWlmIChhaGNfaW5iKGFoYywgU0NCX0JBU0UpICE9IGkpCisJCQlicmVhazsKKwkJYWhjX291dGIoYWhjLCBTQ0JQVFIsIDApOworCQlpZiAoYWhjX2luYihhaGMsIFNDQl9CQVNFKSAhPSAwKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAoaSk7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfZG1hbWFwX2NiKHZvaWQgKmFyZywgYnVzX2RtYV9zZWdtZW50X3QgKnNlZ3MsIGludCBuc2VnLCBpbnQgZXJyb3IpIAoreworCWRtYV9hZGRyX3QgKmJhZGRyOworCisJYmFkZHIgPSAoZG1hX2FkZHJfdCAqKWFyZzsKKwkqYmFkZHIgPSBzZWdzLT5kc19hZGRyOworfQorCitzdGF0aWMgdm9pZAorYWhjX2J1aWxkX2ZyZWVfc2NiX2xpc3Qoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWludCBzY2JzaXplOworCWludCBpOworCisJc2Nic2l6ZSA9IDMyOworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19MU0NCU19FTkFCTEVEKSAhPSAwKQorCQlzY2JzaXplID0gNjQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWhjLT5zY2JfZGF0YS0+bWF4aHNjYnM7IGkrKykgeworCQlpbnQgajsKKworCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgaSk7CisKKwkJLyoKKwkJICogVG91Y2ggYWxsIFNDQiBieXRlcyB0byBhdm9pZCBwYXJpdHkgZXJyb3JzCisJCSAqIHNob3VsZCBvbmUgb2Ygb3VyIGRlYnVnZ2luZyByb3V0aW5lcyByZWFkCisJCSAqIGFuIG90aGVyd2lzZSB1bmluaXRpYXRsaXplZCBieXRlLgorCQkgKi8KKwkJZm9yIChqID0gMDsgaiA8IHNjYnNpemU7IGorKykKKwkJCWFoY19vdXRiKGFoYywgU0NCX0JBU0UraiwgMHhGRik7CisKKwkJLyogQ2xlYXIgdGhlIGNvbnRyb2wgYnl0ZS4gKi8KKwkJYWhjX291dGIoYWhjLCBTQ0JfQ09OVFJPTCwgMCk7CisKKwkJLyogU2V0IHRoZSBuZXh0IHBvaW50ZXIgKi8KKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKQorCQkJYWhjX291dGIoYWhjLCBTQ0JfTkVYVCwgaSsxKTsKKwkJZWxzZSAKKwkJCWFoY19vdXRiKGFoYywgU0NCX05FWFQsIFNDQl9MSVNUX05VTEwpOworCisJCS8qIE1ha2UgdGhlIHRhZyBudW1iZXIsIFNDU0lJRCwgYW5kIGx1biBpbnZhbGlkICovCisJCWFoY19vdXRiKGFoYywgU0NCX1RBRywgU0NCX0xJU1RfTlVMTCk7CisJCWFoY19vdXRiKGFoYywgU0NCX1NDU0lJRCwgMHhGRik7CisJCWFoY19vdXRiKGFoYywgU0NCX0xVTiwgMHhGRik7CisJfQorCisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKSB7CisJCS8qIFNDQiAwIGhlYWRzIHRoZSBmcmVlIGxpc3QuICovCisJCWFoY19vdXRiKGFoYywgRlJFRV9TQ0JILCAwKTsKKwl9IGVsc2UgeworCQkvKiBObyBmcmVlIGxpc3QuICovCisJCWFoY19vdXRiKGFoYywgRlJFRV9TQ0JILCBTQ0JfTElTVF9OVUxMKTsKKwl9CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgbGFzdCBTQ0IgdGVybWluYXRlcyB0aGUgZnJlZSBsaXN0ICovCisJYWhjX291dGIoYWhjLCBTQ0JQVFIsIGktMSk7CisJYWhjX291dGIoYWhjLCBTQ0JfTkVYVCwgU0NCX0xJU1RfTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQKK2FoY19pbml0X3NjYmRhdGEoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXN0cnVjdCBzY2JfZGF0YSAqc2NiX2RhdGE7CisKKwlzY2JfZGF0YSA9IGFoYy0+c2NiX2RhdGE7CisJU0xJU1RfSU5JVCgmc2NiX2RhdGEtPmZyZWVfc2Nicyk7CisJU0xJU1RfSU5JVCgmc2NiX2RhdGEtPnNnX21hcHMpOworCisJLyogQWxsb2NhdGUgU0NCIHJlc291cmNlcyAqLworCXNjYl9kYXRhLT5zY2JhcnJheSA9CisJICAgIChzdHJ1Y3Qgc2NiICopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NiKSAqIEFIQ19TQ0JfTUFYX0FMTE9DLAorCQkJCSBNX0RFVkJVRiwgTV9OT1dBSVQpOworCWlmIChzY2JfZGF0YS0+c2NiYXJyYXkgPT0gTlVMTCkKKwkJcmV0dXJuIChFTk9NRU0pOworCW1lbXNldChzY2JfZGF0YS0+c2NiYXJyYXksIDAsIHNpemVvZihzdHJ1Y3Qgc2NiKSAqIEFIQ19TQ0JfTUFYX0FMTE9DKTsKKworCS8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGhhcmR3YXJlIFNDQnMgYW5kIGluaXRpYWxpemUgdGhlbSAqLworCisJc2NiX2RhdGEtPm1heGhzY2JzID0gYWhjX3Byb2JlX3NjYnMoYWhjKTsKKwlpZiAoYWhjLT5zY2JfZGF0YS0+bWF4aHNjYnMgPT0gMCkgeworCQlwcmludGYoIiVzOiBObyBTQ0Igc3BhY2UgZm91bmRcbiIsIGFoY19uYW1lKGFoYykpOworCQlyZXR1cm4gKEVOWElPKTsKKwl9CisKKwkvKgorCSAqIENyZWF0ZSBvdXIgRE1BIHRhZ3MuICBUaGVzZSB0YWdzIGRlZmluZSB0aGUga2luZHMgb2YgZGV2aWNlCisJICogYWNjZXNzaWJsZSBtZW1vcnkgYWxsb2NhdGlvbnMgYW5kIG1lbW9yeSBtYXBwaW5ncyB3ZSB3aWxsCisJICogbmVlZCB0byBwZXJmb3JtIGR1cmluZyBub3JtYWwgb3BlcmF0aW9uLgorCSAqCisJICogVW5sZXNzIHdlIG5lZWQgdG8gZnVydGhlciByZXN0cmljdCB0aGUgYWxsb2NhdGlvbiwgd2UgcmVseQorCSAqIG9uIHRoZSByZXN0cmljdGlvbnMgb2YgdGhlIHBhcmVudCBkbWF0LCBoZW5jZSB0aGUgY29tbW9uCisJICogdXNlIG9mIE1BWEFERFIgYW5kIE1BWFNJWkUuCisJICovCisKKwkvKiBETUEgdGFnIGZvciBvdXIgaGFyZHdhcmUgc2NiIHN0cnVjdHVyZXMgKi8KKwlpZiAoYWhjX2RtYV90YWdfY3JlYXRlKGFoYywgYWhjLT5wYXJlbnRfZG1hdCwgLyphbGlnbm1lbnQqLzEsCisJCQkgICAgICAgLypib3VuZGFyeSovQlVTX1NQQUNFX01BWEFERFJfMzJCSVQgKyAxLAorCQkJICAgICAgIC8qbG93YWRkciovQlVTX1NQQUNFX01BWEFERFJfMzJCSVQsCisJCQkgICAgICAgLypoaWdoYWRkciovQlVTX1NQQUNFX01BWEFERFIsCisJCQkgICAgICAgLypmaWx0ZXIqL05VTEwsIC8qZmlsdGVyYXJnKi9OVUxMLAorCQkJICAgICAgIEFIQ19TQ0JfTUFYX0FMTE9DICogc2l6ZW9mKHN0cnVjdCBoYXJkd2FyZV9zY2IpLAorCQkJICAgICAgIC8qbnNlZ21lbnRzKi8xLAorCQkJICAgICAgIC8qbWF4c2Vnc3oqL0JVU19TUEFDRV9NQVhTSVpFXzMyQklULAorCQkJICAgICAgIC8qZmxhZ3MqLzAsICZzY2JfZGF0YS0+aHNjYl9kbWF0KSAhPSAwKSB7CisJCWdvdG8gZXJyb3JfZXhpdDsKKwl9CisKKwlzY2JfZGF0YS0+aW5pdF9sZXZlbCsrOworCisJLyogQWxsb2NhdGlvbiBmb3Igb3VyIGhzY2JzICovCisJaWYgKGFoY19kbWFtZW1fYWxsb2MoYWhjLCBzY2JfZGF0YS0+aHNjYl9kbWF0LAorCQkJICAgICAodm9pZCAqKikmc2NiX2RhdGEtPmhzY2JzLAorCQkJICAgICBCVVNfRE1BX05PV0FJVCwgJnNjYl9kYXRhLT5oc2NiX2RtYW1hcCkgIT0gMCkgeworCQlnb3RvIGVycm9yX2V4aXQ7CisJfQorCisJc2NiX2RhdGEtPmluaXRfbGV2ZWwrKzsKKworCS8qIEFuZCBwZXJtYW5lbnRseSBtYXAgdGhlbSAqLworCWFoY19kbWFtYXBfbG9hZChhaGMsIHNjYl9kYXRhLT5oc2NiX2RtYXQsIHNjYl9kYXRhLT5oc2NiX2RtYW1hcCwKKwkJCXNjYl9kYXRhLT5oc2NicywKKwkJCUFIQ19TQ0JfTUFYX0FMTE9DICogc2l6ZW9mKHN0cnVjdCBoYXJkd2FyZV9zY2IpLAorCQkJYWhjX2RtYW1hcF9jYiwgJnNjYl9kYXRhLT5oc2NiX2J1c2FkZHIsIC8qZmxhZ3MqLzApOworCisJc2NiX2RhdGEtPmluaXRfbGV2ZWwrKzsKKworCS8qIERNQSB0YWcgZm9yIG91ciBzZW5zZSBidWZmZXJzICovCisJaWYgKGFoY19kbWFfdGFnX2NyZWF0ZShhaGMsIGFoYy0+cGFyZW50X2RtYXQsIC8qYWxpZ25tZW50Ki8xLAorCQkJICAgICAgIC8qYm91bmRhcnkqL0JVU19TUEFDRV9NQVhBRERSXzMyQklUICsgMSwKKwkJCSAgICAgICAvKmxvd2FkZHIqL0JVU19TUEFDRV9NQVhBRERSXzMyQklULAorCQkJICAgICAgIC8qaGlnaGFkZHIqL0JVU19TUEFDRV9NQVhBRERSLAorCQkJICAgICAgIC8qZmlsdGVyKi9OVUxMLCAvKmZpbHRlcmFyZyovTlVMTCwKKwkJCSAgICAgICBBSENfU0NCX01BWF9BTExPQyAqIHNpemVvZihzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhKSwKKwkJCSAgICAgICAvKm5zZWdtZW50cyovMSwKKwkJCSAgICAgICAvKm1heHNlZ3N6Ki9CVVNfU1BBQ0VfTUFYU0laRV8zMkJJVCwKKwkJCSAgICAgICAvKmZsYWdzKi8wLCAmc2NiX2RhdGEtPnNlbnNlX2RtYXQpICE9IDApIHsKKwkJZ290byBlcnJvcl9leGl0OworCX0KKworCXNjYl9kYXRhLT5pbml0X2xldmVsKys7CisKKwkvKiBBbGxvY2F0ZSB0aGVtICovCisJaWYgKGFoY19kbWFtZW1fYWxsb2MoYWhjLCBzY2JfZGF0YS0+c2Vuc2VfZG1hdCwKKwkJCSAgICAgKHZvaWQgKiopJnNjYl9kYXRhLT5zZW5zZSwKKwkJCSAgICAgQlVTX0RNQV9OT1dBSVQsICZzY2JfZGF0YS0+c2Vuc2VfZG1hbWFwKSAhPSAwKSB7CisJCWdvdG8gZXJyb3JfZXhpdDsKKwl9CisKKwlzY2JfZGF0YS0+aW5pdF9sZXZlbCsrOworCisJLyogQW5kIHBlcm1hbmVudGx5IG1hcCB0aGVtICovCisJYWhjX2RtYW1hcF9sb2FkKGFoYywgc2NiX2RhdGEtPnNlbnNlX2RtYXQsIHNjYl9kYXRhLT5zZW5zZV9kbWFtYXAsCisJCQlzY2JfZGF0YS0+c2Vuc2UsCisJCQlBSENfU0NCX01BWF9BTExPQyAqIHNpemVvZihzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhKSwKKwkJCWFoY19kbWFtYXBfY2IsICZzY2JfZGF0YS0+c2Vuc2VfYnVzYWRkciwgLypmbGFncyovMCk7CisKKwlzY2JfZGF0YS0+aW5pdF9sZXZlbCsrOworCisJLyogRE1BIHRhZyBmb3Igb3VyIFMvRyBzdHJ1Y3R1cmVzLiAgV2UgYWxsb2NhdGUgaW4gcGFnZSBzaXplZCBjaHVua3MgKi8KKwlpZiAoYWhjX2RtYV90YWdfY3JlYXRlKGFoYywgYWhjLT5wYXJlbnRfZG1hdCwgLyphbGlnbm1lbnQqLzgsCisJCQkgICAgICAgLypib3VuZGFyeSovQlVTX1NQQUNFX01BWEFERFJfMzJCSVQgKyAxLAorCQkJICAgICAgIC8qbG93YWRkciovQlVTX1NQQUNFX01BWEFERFJfMzJCSVQsCisJCQkgICAgICAgLypoaWdoYWRkciovQlVTX1NQQUNFX01BWEFERFIsCisJCQkgICAgICAgLypmaWx0ZXIqL05VTEwsIC8qZmlsdGVyYXJnKi9OVUxMLAorCQkJICAgICAgIFBBR0VfU0laRSwgLypuc2VnbWVudHMqLzEsCisJCQkgICAgICAgLyptYXhzZWdzeiovQlVTX1NQQUNFX01BWFNJWkVfMzJCSVQsCisJCQkgICAgICAgLypmbGFncyovMCwgJnNjYl9kYXRhLT5zZ19kbWF0KSAhPSAwKSB7CisJCWdvdG8gZXJyb3JfZXhpdDsKKwl9CisKKwlzY2JfZGF0YS0+aW5pdF9sZXZlbCsrOworCisJLyogUGVyZm9ybSBpbml0aWFsIENDQiBhbGxvY2F0aW9uICovCisJbWVtc2V0KHNjYl9kYXRhLT5oc2NicywgMCwKKwkgICAgICAgQUhDX1NDQl9NQVhfQUxMT0MgKiBzaXplb2Yoc3RydWN0IGhhcmR3YXJlX3NjYikpOworCWFoY19hbGxvY19zY2JzKGFoYyk7CisKKwlpZiAoc2NiX2RhdGEtPm51bXNjYnMgPT0gMCkgeworCQlwcmludGYoIiVzOiBhaGNfaW5pdF9zY2JkYXRhIC0gIgorCQkgICAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBpbml0aWFsIHNjYnNcbiIsCisJCSAgICAgICBhaGNfbmFtZShhaGMpKTsKKwkJZ290byBlcnJvcl9leGl0OworCX0KKworCS8qCisJICogUmVzZXJ2ZSB0aGUgbmV4dCBxdWV1ZWQgU0NCLgorCSAqLworCWFoYy0+bmV4dF9xdWV1ZWRfc2NiID0gYWhjX2dldF9zY2IoYWhjKTsKKworCS8qCisJICogTm90ZSB0aGF0IHdlIHdlcmUgc3VjY2Vzc2Z1bGwKKwkgKi8KKwlyZXR1cm4gKDApOyAKKworZXJyb3JfZXhpdDoKKworCXJldHVybiAoRU5PTUVNKTsKK30KKworc3RhdGljIHZvaWQKK2FoY19maW5pX3NjYmRhdGEoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXN0cnVjdCBzY2JfZGF0YSAqc2NiX2RhdGE7CisKKwlzY2JfZGF0YSA9IGFoYy0+c2NiX2RhdGE7CisJaWYgKHNjYl9kYXRhID09IE5VTEwpCisJCXJldHVybjsKKworCXN3aXRjaCAoc2NiX2RhdGEtPmluaXRfbGV2ZWwpIHsKKwlkZWZhdWx0OgorCWNhc2UgNzoKKwl7CisJCXN0cnVjdCBzZ19tYXBfbm9kZSAqc2dfbWFwOworCisJCXdoaWxlICgoc2dfbWFwID0gU0xJU1RfRklSU1QoJnNjYl9kYXRhLT5zZ19tYXBzKSkhPSBOVUxMKSB7CisJCQlTTElTVF9SRU1PVkVfSEVBRCgmc2NiX2RhdGEtPnNnX21hcHMsIGxpbmtzKTsKKwkJCWFoY19kbWFtYXBfdW5sb2FkKGFoYywgc2NiX2RhdGEtPnNnX2RtYXQsCisJCQkJCSAgc2dfbWFwLT5zZ19kbWFtYXApOworCQkJYWhjX2RtYW1lbV9mcmVlKGFoYywgc2NiX2RhdGEtPnNnX2RtYXQsCisJCQkJCXNnX21hcC0+c2dfdmFkZHIsCisJCQkJCXNnX21hcC0+c2dfZG1hbWFwKTsKKwkJCWZyZWUoc2dfbWFwLCBNX0RFVkJVRik7CisJCX0KKwkJYWhjX2RtYV90YWdfZGVzdHJveShhaGMsIHNjYl9kYXRhLT5zZ19kbWF0KTsKKwl9CisJY2FzZSA2OgorCQlhaGNfZG1hbWFwX3VubG9hZChhaGMsIHNjYl9kYXRhLT5zZW5zZV9kbWF0LAorCQkJCSAgc2NiX2RhdGEtPnNlbnNlX2RtYW1hcCk7CisJY2FzZSA1OgorCQlhaGNfZG1hbWVtX2ZyZWUoYWhjLCBzY2JfZGF0YS0+c2Vuc2VfZG1hdCwgc2NiX2RhdGEtPnNlbnNlLAorCQkJCXNjYl9kYXRhLT5zZW5zZV9kbWFtYXApOworCQlhaGNfZG1hbWFwX2Rlc3Ryb3koYWhjLCBzY2JfZGF0YS0+c2Vuc2VfZG1hdCwKKwkJCQkgICBzY2JfZGF0YS0+c2Vuc2VfZG1hbWFwKTsKKwljYXNlIDQ6CisJCWFoY19kbWFfdGFnX2Rlc3Ryb3koYWhjLCBzY2JfZGF0YS0+c2Vuc2VfZG1hdCk7CisJY2FzZSAzOgorCQlhaGNfZG1hbWFwX3VubG9hZChhaGMsIHNjYl9kYXRhLT5oc2NiX2RtYXQsCisJCQkJICBzY2JfZGF0YS0+aHNjYl9kbWFtYXApOworCWNhc2UgMjoKKwkJYWhjX2RtYW1lbV9mcmVlKGFoYywgc2NiX2RhdGEtPmhzY2JfZG1hdCwgc2NiX2RhdGEtPmhzY2JzLAorCQkJCXNjYl9kYXRhLT5oc2NiX2RtYW1hcCk7CisJCWFoY19kbWFtYXBfZGVzdHJveShhaGMsIHNjYl9kYXRhLT5oc2NiX2RtYXQsCisJCQkJICAgc2NiX2RhdGEtPmhzY2JfZG1hbWFwKTsKKwljYXNlIDE6CisJCWFoY19kbWFfdGFnX2Rlc3Ryb3koYWhjLCBzY2JfZGF0YS0+aHNjYl9kbWF0KTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQlicmVhazsKKwl9CisJaWYgKHNjYl9kYXRhLT5zY2JhcnJheSAhPSBOVUxMKQorCQlmcmVlKHNjYl9kYXRhLT5zY2JhcnJheSwgTV9ERVZCVUYpOworfQorCit2b2lkCithaGNfYWxsb2Nfc2NicyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJc3RydWN0IHNjYl9kYXRhICpzY2JfZGF0YTsKKwlzdHJ1Y3Qgc2NiICpuZXh0X3NjYjsKKwlzdHJ1Y3Qgc2dfbWFwX25vZGUgKnNnX21hcDsKKwlkbWFfYWRkcl90IHBoeXNhZGRyOworCXN0cnVjdCBhaGNfZG1hX3NlZyAqc2VnczsKKwlpbnQgbmV3Y291bnQ7CisJaW50IGk7CisKKwlzY2JfZGF0YSA9IGFoYy0+c2NiX2RhdGE7CisJaWYgKHNjYl9kYXRhLT5udW1zY2JzID49IEFIQ19TQ0JfTUFYX0FMTE9DKQorCQkvKiBDYW4ndCBhbGxvY2F0ZSBhbnkgbW9yZSAqLworCQlyZXR1cm47CisKKwluZXh0X3NjYiA9ICZzY2JfZGF0YS0+c2NiYXJyYXlbc2NiX2RhdGEtPm51bXNjYnNdOworCisJc2dfbWFwID0gbWFsbG9jKHNpemVvZigqc2dfbWFwKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKworCWlmIChzZ19tYXAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogQWxsb2NhdGUgUy9HIHNwYWNlIGZvciB0aGUgbmV4dCBiYXRjaCBvZiBTQ0JTICovCisJaWYgKGFoY19kbWFtZW1fYWxsb2MoYWhjLCBzY2JfZGF0YS0+c2dfZG1hdCwKKwkJCSAgICAgKHZvaWQgKiopJnNnX21hcC0+c2dfdmFkZHIsCisJCQkgICAgIEJVU19ETUFfTk9XQUlULCAmc2dfbWFwLT5zZ19kbWFtYXApICE9IDApIHsKKwkJZnJlZShzZ19tYXAsIE1fREVWQlVGKTsKKwkJcmV0dXJuOworCX0KKworCVNMSVNUX0lOU0VSVF9IRUFEKCZzY2JfZGF0YS0+c2dfbWFwcywgc2dfbWFwLCBsaW5rcyk7CisKKwlhaGNfZG1hbWFwX2xvYWQoYWhjLCBzY2JfZGF0YS0+c2dfZG1hdCwgc2dfbWFwLT5zZ19kbWFtYXAsCisJCQlzZ19tYXAtPnNnX3ZhZGRyLCBQQUdFX1NJWkUsIGFoY19kbWFtYXBfY2IsCisJCQkmc2dfbWFwLT5zZ19waHlzYWRkciwgLypmbGFncyovMCk7CisKKwlzZWdzID0gc2dfbWFwLT5zZ192YWRkcjsKKwlwaHlzYWRkciA9IHNnX21hcC0+c2dfcGh5c2FkZHI7CisKKwluZXdjb3VudCA9IChQQUdFX1NJWkUgLyAoQUhDX05TRUcgKiBzaXplb2Yoc3RydWN0IGFoY19kbWFfc2VnKSkpOworCW5ld2NvdW50ID0gTUlOKG5ld2NvdW50LCAoQUhDX1NDQl9NQVhfQUxMT0MgLSBzY2JfZGF0YS0+bnVtc2NicykpOworCWZvciAoaSA9IDA7IGkgPCBuZXdjb3VudDsgaSsrKSB7CisJCXN0cnVjdCBzY2JfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisjaWZuZGVmIF9fbGludXhfXworCQlpbnQgZXJyb3I7CisjZW5kaWYKKwkJcGRhdGEgPSAoc3RydWN0IHNjYl9wbGF0Zm9ybV9kYXRhICopbWFsbG9jKHNpemVvZigqcGRhdGEpLAorCQkJCQkJCSAgIE1fREVWQlVGLCBNX05PV0FJVCk7CisJCWlmIChwZGF0YSA9PSBOVUxMKQorCQkJYnJlYWs7CisJCW5leHRfc2NiLT5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7CisJCW5leHRfc2NiLT5zZ19tYXAgPSBzZ19tYXA7CisJCW5leHRfc2NiLT5zZ19saXN0ID0gc2VnczsKKwkJLyoKKwkJICogVGhlIHNlcXVlbmNlciBhbHdheXMgc3RhcnRzIHdpdGggdGhlIHNlY29uZCBlbnRyeS4KKwkJICogVGhlIGZpcnN0IGVudHJ5IGlzIGVtYmVkZGVkIGluIHRoZSBzY2IuCisJCSAqLworCQluZXh0X3NjYi0+c2dfbGlzdF9waHlzID0gcGh5c2FkZHIgKyBzaXplb2Yoc3RydWN0IGFoY19kbWFfc2VnKTsKKwkJbmV4dF9zY2ItPmFoY19zb2Z0YyA9IGFoYzsKKwkJbmV4dF9zY2ItPmZsYWdzID0gU0NCX0ZSRUU7CisjaWZuZGVmIF9fbGludXhfXworCQllcnJvciA9IGFoY19kbWFtYXBfY3JlYXRlKGFoYywgYWhjLT5idWZmZXJfZG1hdCwgLypmbGFncyovMCwKKwkJCQkJICAmbmV4dF9zY2ItPmRtYW1hcCk7CisJCWlmIChlcnJvciAhPSAwKQorCQkJYnJlYWs7CisjZW5kaWYKKwkJbmV4dF9zY2ItPmhzY2IgPSAmc2NiX2RhdGEtPmhzY2JzW3NjYl9kYXRhLT5udW1zY2JzXTsKKwkJbmV4dF9zY2ItPmhzY2ItPnRhZyA9IGFoYy0+c2NiX2RhdGEtPm51bXNjYnM7CisJCVNMSVNUX0lOU0VSVF9IRUFEKCZhaGMtPnNjYl9kYXRhLT5mcmVlX3NjYnMsCisJCQkJICBuZXh0X3NjYiwgbGlua3Muc2xlKTsKKwkJc2VncyArPSBBSENfTlNFRzsKKwkJcGh5c2FkZHIgKz0gKEFIQ19OU0VHICogc2l6ZW9mKHN0cnVjdCBhaGNfZG1hX3NlZykpOworCQluZXh0X3NjYisrOworCQlhaGMtPnNjYl9kYXRhLT5udW1zY2JzKys7CisJfQorfQorCit2b2lkCithaGNfY29udHJvbGxlcl9pbmZvKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgY2hhciAqYnVmKQoreworCWludCBsZW47CisKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVzOiAiLCBhaGNfY2hpcF9uYW1lc1thaGMtPmNoaXAgJiBBSENfQ0hJUElEX01BU0tdKTsKKwlidWYgKz0gbGVuOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSAhPSAwKQorIAkJbGVuID0gc3ByaW50ZihidWYsICJUd2luIENoYW5uZWwsIEEgU0NTSSBJZD0lZCwgIgorCQkJICAgICAgIkIgU0NTSSBJZD0lZCwgcHJpbWFyeSAlYywgIiwKKwkJCSAgICAgIGFoYy0+b3VyX2lkLCBhaGMtPm91cl9pZF9iLAorCQkJICAgICAgKGFoYy0+ZmxhZ3MgJiBBSENfUFJJTUFSWV9DSEFOTkVMKSArICdBJyk7CisJZWxzZSB7CisJCWNvbnN0IGNoYXIgKnNwZWVkOworCQljb25zdCBjaGFyICp0eXBlOworCisJCXNwZWVkID0gIiI7CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQSkgIT0gMCkgeworCQkJc3BlZWQgPSAiVWx0cmEgIjsKKwkJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgIT0gMCkgeworCQkJc3BlZWQgPSAiVWx0cmExNjAgIjsKKwkJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJCXNwZWVkID0gIlVsdHJhMiAiOworCQl9CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSAhPSAwKSB7CisJCQl0eXBlID0gIldpZGUiOworCQl9IGVsc2UgeworCQkJdHlwZSA9ICJTaW5nbGUiOworCQl9CisJCWxlbiA9IHNwcmludGYoYnVmLCAiJXMlcyBDaGFubmVsICVjLCBTQ1NJIElkPSVkLCAiLAorCQkJICAgICAgc3BlZWQsIHR5cGUsIGFoYy0+Y2hhbm5lbCwgYWhjLT5vdXJfaWQpOworCX0KKwlidWYgKz0gbGVuOworCisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKQorCQlzcHJpbnRmKGJ1ZiwgIiVkLyVkIFNDQnMiLAorCQkJYWhjLT5zY2JfZGF0YS0+bWF4aHNjYnMsIEFIQ19NQVhfUVVFVUUpOworCWVsc2UKKwkJc3ByaW50ZihidWYsICIlZCBTQ0JzIiwgYWhjLT5zY2JfZGF0YS0+bWF4aHNjYnMpOworfQorCitpbnQKK2FoY19jaGlwX2luaXQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWludAkgdGVybTsKKwlpbnQJIGVycm9yOworCXVfaW50CSBpOworCXVfaW50CSBzY3NpX2NvbmY7CisJdV9pbnQJIHNjc2lzZXFfdGVtcGxhdGU7CisJdWludDMyX3QgcGh5c2FkZHI7CisKKwlhaGNfb3V0YihhaGMsIFNFUV9GTEFHUywgMCk7CisJYWhjX291dGIoYWhjLCBTRVFfRkxBR1MyLCAwKTsKKworCS8qIFNldCB0aGUgU0NTSSBJZCwgU1hGUkNUTDAsIFNYRlJDVEwxLCBhbmQgU0lNT0RFMSwgZm9yIGJvdGggY2hhbm5lbHMqLworCWlmIChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pIHsKKworCQkvKgorCQkgKiBTZXR1cCBDaGFubmVsIEIgZmlyc3QuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIFNCTEtDVEwsIGFoY19pbmIoYWhjLCBTQkxLQ1RMKSB8IFNFTEJVU0IpOworCQl0ZXJtID0gKGFoYy0+ZmxhZ3MgJiBBSENfVEVSTV9FTkJfQikgIT0gMCA/IFNUUFdFTiA6IDA7CisJCWFoY19vdXRiKGFoYywgU0NTSUlELCBhaGMtPm91cl9pZF9iKTsKKwkJc2NzaV9jb25mID0gYWhjX2luYihhaGMsIFNDU0lDT05GICsgMSk7CisJCWFoY19vdXRiKGFoYywgU1hGUkNUTDEsIChzY3NpX2NvbmYgJiAoRU5TUENIS3xTVElNRVNFTCkpCisJCQkJCXx0ZXJtfGFoYy0+c2VsdGltZV9ifEVOU1RJTUVSfEFDVE5FR0VOKTsKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkKKwkJCWFoY19vdXRiKGFoYywgU0lNT0RFMCwgYWhjX2luYihhaGMsIFNJTU9ERTApfEVOSU9FUlIpOworCQlhaGNfb3V0YihhaGMsIFNJTU9ERTEsIEVOU0VMVElNT3xFTlNDU0lSU1R8RU5TQ1NJUEVSUik7CisJCWFoY19vdXRiKGFoYywgU1hGUkNUTDAsIERGT058U1BJT0VOKTsKKworCQkvKiBTZWxlY3QgQ2hhbm5lbCBBICovCisJCWFoY19vdXRiKGFoYywgU0JMS0NUTCwgYWhjX2luYihhaGMsIFNCTEtDVEwpICYgflNFTEJVU0IpOworCX0KKwl0ZXJtID0gKGFoYy0+ZmxhZ3MgJiBBSENfVEVSTV9FTkJfQSkgIT0gMCA/IFNUUFdFTiA6IDA7CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkKKwkJYWhjX291dGIoYWhjLCBTQ1NJSURfVUxUUkEyLCBhaGMtPm91cl9pZCk7CisJZWxzZQorCQlhaGNfb3V0YihhaGMsIFNDU0lJRCwgYWhjLT5vdXJfaWQpOworCXNjc2lfY29uZiA9IGFoY19pbmIoYWhjLCBTQ1NJQ09ORik7CisJYWhjX291dGIoYWhjLCBTWEZSQ1RMMSwgKHNjc2lfY29uZiAmIChFTlNQQ0hLfFNUSU1FU0VMKSkKKwkJCQl8dGVybXxhaGMtPnNlbHRpbWUKKwkJCQl8RU5TVElNRVJ8QUNUTkVHRU4pOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisJCWFoY19vdXRiKGFoYywgU0lNT0RFMCwgYWhjX2luYihhaGMsIFNJTU9ERTApfEVOSU9FUlIpOworCWFoY19vdXRiKGFoYywgU0lNT0RFMSwgRU5TRUxUSU1PfEVOU0NTSVJTVHxFTlNDU0lQRVJSKTsKKwlhaGNfb3V0YihhaGMsIFNYRlJDVEwwLCBERk9OfFNQSU9FTik7CisKKwkvKiBUaGVyZSBhcmUgbm8gdW50YWdnZWQgU0NCcyBhY3RpdmUgeWV0LiAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWFoY191bmJ1c3lfdGNsKGFoYywgQlVJTERfVENMKGkgPDwgNCwgMCkpOworCQlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfU0NCX0JUVCkgIT0gMCkgeworCQkJaW50IGx1bjsKKworCQkJLyoKKwkJCSAqIFRoZSBTQ0IgYmFzZWQgQlRUIGFsbG93cyBhbiBlbnRyeSBwZXIKKwkJCSAqIHRhcmdldCBhbmQgbHVuIHBhaXIuCisJCQkgKi8KKwkJCWZvciAobHVuID0gMTsgbHVuIDwgQUhDX05VTV9MVU5TOyBsdW4rKykKKwkJCQlhaGNfdW5idXN5X3RjbChhaGMsIEJVSUxEX1RDTChpIDw8IDQsIGx1bikpOworCQl9CisJfQorCisJLyogQWxsIG9mIG91ciBxdWV1ZXMgYXJlIGVtcHR5ICovCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlhaGMtPnFvdXRmaWZvW2ldID0gU0NCX0xJU1RfTlVMTDsKKwlhaGNfc3luY19xb3V0ZmlmbyhhaGMsIEJVU19ETUFTWU5DX1BSRVJFQUQpOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlhaGMtPnFpbmZpZm9baV0gPSBTQ0JfTElTVF9OVUxMOworCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX01VTFRJX1RJRCkgIT0gMCkgeworCQlhaGNfb3V0YihhaGMsIFRBUkdJRCwgMCk7CisJCWFoY19vdXRiKGFoYywgVEFSR0lEICsgMSwgMCk7CisJfQorCisJLyoKKwkgKiBUZWxsIHRoZSBzZXF1ZW5jZXIgd2hlcmUgaXQgY2FuIGZpbmQgb3VyIGFycmF5cyBpbiBtZW1vcnkuCisJICovCisJcGh5c2FkZHIgPSBhaGMtPnNjYl9kYXRhLT5oc2NiX2J1c2FkZHI7CisJYWhjX291dGIoYWhjLCBIU0NCX0FERFIsIHBoeXNhZGRyICYgMHhGRik7CisJYWhjX291dGIoYWhjLCBIU0NCX0FERFIgKyAxLCAocGh5c2FkZHIgPj4gOCkgJiAweEZGKTsKKwlhaGNfb3V0YihhaGMsIEhTQ0JfQUREUiArIDIsIChwaHlzYWRkciA+PiAxNikgJiAweEZGKTsKKwlhaGNfb3V0YihhaGMsIEhTQ0JfQUREUiArIDMsIChwaHlzYWRkciA+PiAyNCkgJiAweEZGKTsKKworCXBoeXNhZGRyID0gYWhjLT5zaGFyZWRfZGF0YV9idXNhZGRyOworCWFoY19vdXRiKGFoYywgU0hBUkVEX0RBVEFfQUREUiwgcGh5c2FkZHIgJiAweEZGKTsKKwlhaGNfb3V0YihhaGMsIFNIQVJFRF9EQVRBX0FERFIgKyAxLCAocGh5c2FkZHIgPj4gOCkgJiAweEZGKTsKKwlhaGNfb3V0YihhaGMsIFNIQVJFRF9EQVRBX0FERFIgKyAyLCAocGh5c2FkZHIgPj4gMTYpICYgMHhGRik7CisJYWhjX291dGIoYWhjLCBTSEFSRURfREFUQV9BRERSICsgMywgKHBoeXNhZGRyID4+IDI0KSAmIDB4RkYpOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBncm91cCBjb2RlIHRvIGNvbW1hbmQgbGVuZ3RoIHRhYmxlLgorCSAqIFRoaXMgb3ZlcnJpZGVzIHRoZSB2YWx1ZXMgaW4gVEFSR19TQ1NJUkFURSwgc28gb25seQorCSAqIHNldHVwIHRoZSB0YWJsZSBhZnRlciB3ZSBoYXZlIHByb2Nlc3NlZCB0aGF0IGluZm9ybWF0aW9uLgorCSAqLworCWFoY19vdXRiKGFoYywgQ01EU0laRV9UQUJMRSwgNSk7CisJYWhjX291dGIoYWhjLCBDTURTSVpFX1RBQkxFICsgMSwgOSk7CisJYWhjX291dGIoYWhjLCBDTURTSVpFX1RBQkxFICsgMiwgOSk7CisJYWhjX291dGIoYWhjLCBDTURTSVpFX1RBQkxFICsgMywgMCk7CisJYWhjX291dGIoYWhjLCBDTURTSVpFX1RBQkxFICsgNCwgMTUpOworCWFoY19vdXRiKGFoYywgQ01EU0laRV9UQUJMRSArIDUsIDExKTsKKwlhaGNfb3V0YihhaGMsIENNRFNJWkVfVEFCTEUgKyA2LCAwKTsKKwlhaGNfb3V0YihhaGMsIENNRFNJWkVfVEFCTEUgKyA3LCAwKTsKKwkJCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0hTX01BSUxCT1gpICE9IDApCisJCWFoY19vdXRiKGFoYywgSFNfTUFJTEJPWCwgMCk7CisKKwkvKiBUZWxsIHRoZSBzZXF1ZW5jZXIgb2Ygb3VyIGluaXRpYWwgcXVldWUgcG9zaXRpb25zICovCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1RBUkdFVE1PREUpICE9IDApIHsKKwkJYWhjLT50cWluZmlmb25leHQgPSAxOworCQlhaGNfb3V0YihhaGMsIEtFUk5FTF9UUUlOUE9TLCBhaGMtPnRxaW5maWZvbmV4dCAtIDEpOworCQlhaGNfb3V0YihhaGMsIFRRSU5QT1MsIGFoYy0+dHFpbmZpZm9uZXh0KTsKKwl9CisJYWhjLT5xaW5maWZvbmV4dCA9IDA7CisJYWhjLT5xb3V0Zmlmb25leHQgPSAwOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19RVUVVRV9SRUdTKSAhPSAwKSB7CisJCWFoY19vdXRiKGFoYywgUU9GRl9DVExTVEEsIFNDQl9RU0laRV8yNTYpOworCQlhaGNfb3V0YihhaGMsIEhOU0NCX1FPRkYsIGFoYy0+cWluZmlmb25leHQpOworCQlhaGNfb3V0YihhaGMsIFNOU0NCX1FPRkYsIGFoYy0+cWluZmlmb25leHQpOworCQlhaGNfb3V0YihhaGMsIFNEU0NCX1FPRkYsIDApOworCX0gZWxzZSB7CisJCWFoY19vdXRiKGFoYywgS0VSTkVMX1FJTlBPUywgYWhjLT5xaW5maWZvbmV4dCk7CisJCWFoY19vdXRiKGFoYywgUUlOUE9TLCBhaGMtPnFpbmZpZm9uZXh0KTsKKwkJYWhjX291dGIoYWhjLCBRT1VUUE9TLCBhaGMtPnFvdXRmaWZvbmV4dCk7CisJfQorCisJLyogV2UgZG9uJ3QgaGF2ZSBhbnkgd2FpdGluZyBzZWxlY3Rpb25zICovCisJYWhjX291dGIoYWhjLCBXQUlUSU5HX1NDQkgsIFNDQl9MSVNUX05VTEwpOworCisJLyogT3VyIGRpc2Nvbm5lY3Rpb24gbGlzdCBpcyBlbXB0eSB0b28gKi8KKwlhaGNfb3V0YihhaGMsIERJU0NPTk5FQ1RFRF9TQ0JILCBTQ0JfTElTVF9OVUxMKTsKKworCS8qIE1lc3NhZ2Ugb3V0IGJ1ZmZlciBzdGFydHMgZW1wdHkgKi8KKwlhaGNfb3V0YihhaGMsIE1TR19PVVQsIE1TR19OT09QKTsKKworCS8qCisJICogU2V0dXAgdGhlIGFsbG93ZWQgU0NTSSBTZXF1ZW5jZXMgYmFzZWQgb24gb3BlcmF0aW9uYWwgbW9kZS4KKwkgKiBJZiB3ZSBhcmUgYSB0YXJnZXQsIHdlJ2xsIGVuYWxiZSBzZWxlY3QgaW4gb3BlcmF0aW9ucyBvbmNlCisJICogd2UndmUgaGFkIGEgbHVuIGVuYWJsZWQuCisJICovCisJc2NzaXNlcV90ZW1wbGF0ZSA9IEVOU0VMT3xFTkFVVE9BVE5PfEVOQVVUT0FUTlA7CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX0lOSVRJQVRPUlJPTEUpICE9IDApCisJCXNjc2lzZXFfdGVtcGxhdGUgfD0gRU5SU0VMSTsKKwlhaGNfb3V0YihhaGMsIFNDU0lTRVFfVEVNUExBVEUsIHNjc2lzZXFfdGVtcGxhdGUpOworCisJLyogSW5pdGlhbGl6ZSBvdXIgbGlzdCBvZiBmcmVlIFNDQnMuICovCisJYWhjX2J1aWxkX2ZyZWVfc2NiX2xpc3QoYWhjKTsKKworCS8qCisJICogVGVsbCB0aGUgc2VxdWVuY2VyIHdoaWNoIFNDQiB3aWxsIGJlIHRoZSBuZXh0IG9uZSBpdCByZWNlaXZlcy4KKwkgKi8KKwlhaGNfb3V0YihhaGMsIE5FWFRfUVVFVUVEX1NDQiwgYWhjLT5uZXh0X3F1ZXVlZF9zY2ItPmhzY2ItPnRhZyk7CisKKwkvKgorCSAqIExvYWQgdGhlIFNlcXVlbmNlciBwcm9ncmFtIGFuZCBFbmFibGUgdGhlIGFkYXB0ZXIKKwkgKiBpbiAiZmFzdCIgbW9kZS4KKwkgKi8KKwlpZiAoYm9vdHZlcmJvc2UpCisJCXByaW50ZigiJXM6IERvd25sb2FkaW5nIFNlcXVlbmNlciBQcm9ncmFtLi4uIiwKKwkJICAgICAgIGFoY19uYW1lKGFoYykpOworCisJZXJyb3IgPSBhaGNfbG9hZHNlcShhaGMpOworCWlmIChlcnJvciAhPSAwKQorCQlyZXR1cm4gKGVycm9yKTsKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJaW50IHdhaXQ7CisKKwkJLyoKKwkJICogV2FpdCBmb3IgdXAgdG8gNTAwbXMgZm9yIG91ciB0cmFuc2NlaXZlcnMKKwkJICogdG8gc2V0dGxlLiAgSWYgdGhlIGFkYXB0ZXIgZG9lcyBub3QgaGF2ZQorCQkgKiBhIGNhYmxlIGF0dGFjaGVkLCB0aGUgdHJhbnNjZWl2ZXJzIG1heQorCQkgKiBuZXZlciBzZXR0bGUsIHNvIGRvbid0IGNvbXBsYWluIGlmIHdlCisJCSAqIGZhaWwgaGVyZS4KKwkJICovCisJCWZvciAod2FpdCA9IDUwMDA7CisJCSAgICAgKGFoY19pbmIoYWhjLCBTQkxLQ1RMKSAmIChFTkFCNDB8RU5BQjIwKSkgPT0gMCAmJiB3YWl0OworCQkgICAgIHdhaXQtLSkKKwkJCWFoY19kZWxheSgxMDApOworCX0KKwlhaGNfcmVzdGFydChhaGMpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBTdGFydCB0aGUgYm9hcmQsIHJlYWR5IGZvciBub3JtYWwgb3BlcmF0aW9uCisgKi8KK2ludAorYWhjX2luaXQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWludAkgbWF4X3Rhcmc7CisJdV9pbnQJIGk7CisJdV9pbnQJIHNjc2lfY29uZjsKKwl1X2ludAkgdWx0cmFlbmI7CisJdV9pbnQJIGRpc2NlbmFibGU7CisJdV9pbnQJIHRhZ2VuYWJsZTsKKwlzaXplX3QJIGRyaXZlcl9kYXRhX3NpemU7CisKKyNpZmRlZiBBSENfREVCVUcKKwlpZiAoKGFoY19kZWJ1ZyAmIEFIQ19ERUJVR19TRVFVRU5DRVIpICE9IDApCisJCWFoYy0+ZmxhZ3MgfD0gQUhDX1NFUVVFTkNFUl9ERUJVRzsKKyNlbmRpZgorCisjaWZkZWYgQUhDX1BSSU5UX1NSQU0KKwlwcmludGYoIlNjcmF0Y2ggUmFtOiIpOworCWZvciAoaSA9IDB4MjA7IGkgPCAweDVmOyBpKyspIHsKKwkJaWYgKCgoaSAlIDgpID09IDApICYmIChpICE9IDApKSB7CisJCQlwcmludGYgKCJcbiAgICAgICAgICAgICAgIik7CisJCX0KKwkJcHJpbnRmICgiIDB4JXgiLCBhaGNfaW5iKGFoYywgaSkpOworCX0KKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfTU9SRV9TUkFNKSAhPSAwKSB7CisJCWZvciAoaSA9IDB4NzA7IGkgPCAweDdmOyBpKyspIHsKKwkJCWlmICgoKGkgJSA4KSA9PSAwKSAmJiAoaSAhPSAwKSkgeworCQkJCXByaW50ZiAoIlxuICAgICAgICAgICAgICAiKTsKKwkJCX0KKwkJCXByaW50ZiAoIiAweCV4IiwgYWhjX2luYihhaGMsIGkpKTsKKwkJfQorCX0KKwlwcmludGYgKCJcbiIpOworCS8qCisJICogUmVhZGluZyB1bmluaXRpYWxpemVkIHNjcmF0Y2ggcmFtIG1heQorCSAqIGdlbmVyYXRlIHBhcml0eSBlcnJvcnMuCisJICovCisJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUlBBUkVSUik7CisJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUkJSS0FEUklOVCk7CisjZW5kaWYKKwltYXhfdGFyZyA9IDE1OworCisJLyoKKwkgKiBBc3N1bWUgd2UgaGF2ZSBhIGJvYXJkIGF0IHRoaXMgc3RhZ2UgYW5kIGl0IGhhcyBiZWVuIHJlc2V0LgorCSAqLworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19VU0VERUZBVUxUUykgIT0gMCkKKwkJYWhjLT5vdXJfaWQgPSBhaGMtPm91cl9pZF9iID0gNzsKKwkKKwkvKgorCSAqIERlZmF1bHQgdG8gYWxsb3dpbmcgaW5pdGlhdG9yIG9wZXJhdGlvbnMuCisJICovCisJYWhjLT5mbGFncyB8PSBBSENfSU5JVElBVE9SUk9MRTsKKworCS8qCisJICogT25seSBhbGxvdyB0YXJnZXQgbW9kZSBmZWF0dXJlcyBpZiB0aGlzIHVuaXQgaGFzIHRoZW0gZW5hYmxlZC4KKwkgKi8KKwlpZiAoKEFIQ19UTU9ERV9FTkFCTEUgJiAoMHgxIDw8IGFoYy0+dW5pdCkpID09IDApCisJCWFoYy0+ZmVhdHVyZXMgJj0gfkFIQ19UQVJHRVRNT0RFOworCisjaWZuZGVmIF9fbGludXhfXworCS8qIERNQSB0YWcgZm9yIG1hcHBpbmcgYnVmZmVycyBpbnRvIGRldmljZSB2aXNpYmxlIHNwYWNlLiAqLworCWlmIChhaGNfZG1hX3RhZ19jcmVhdGUoYWhjLCBhaGMtPnBhcmVudF9kbWF0LCAvKmFsaWdubWVudCovMSwKKwkJCSAgICAgICAvKmJvdW5kYXJ5Ki9CVVNfU1BBQ0VfTUFYQUREUl8zMkJJVCArIDEsCisJCQkgICAgICAgLypsb3dhZGRyKi9haGMtPmZsYWdzICYgQUhDXzM5QklUX0FERFJFU1NJTkcKKwkJCQkJPyAoZG1hX2FkZHJfdCkweDdGRkZGRkZGRkZVTEwKKwkJCQkJOiBCVVNfU1BBQ0VfTUFYQUREUl8zMkJJVCwKKwkJCSAgICAgICAvKmhpZ2hhZGRyKi9CVVNfU1BBQ0VfTUFYQUREUiwKKwkJCSAgICAgICAvKmZpbHRlciovTlVMTCwgLypmaWx0ZXJhcmcqL05VTEwsCisJCQkgICAgICAgLyptYXhzaXplKi8oQUhDX05TRUcgLSAxKSAqIFBBR0VfU0laRSwKKwkJCSAgICAgICAvKm5zZWdtZW50cyovQUhDX05TRUcsCisJCQkgICAgICAgLyptYXhzZWdzeiovQUhDX01BWFRSQU5TRkVSX1NJWkUsCisJCQkgICAgICAgLypmbGFncyovQlVTX0RNQV9BTExPQ05PVywKKwkJCSAgICAgICAmYWhjLT5idWZmZXJfZG1hdCkgIT0gMCkgeworCQlyZXR1cm4gKEVOT01FTSk7CisJfQorI2VuZGlmCisKKwlhaGMtPmluaXRfbGV2ZWwrKzsKKworCS8qCisJICogRE1BIHRhZyBmb3Igb3VyIGNvbW1hbmQgZmlmb3MgYW5kIG90aGVyIGRhdGEgaW4gc3lzdGVtIG1lbW9yeQorCSAqIHRoZSBjYXJkJ3Mgc2VxdWVuY2VyIG11c3QgYmUgYWJsZSB0byBhY2Nlc3MuICBGb3IgaW5pdGlhdG9yCisJICogcm9sZXMsIHdlIG5lZWQgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBxaW5maWZvIGFuZCBxb3V0Zmlmby4KKwkgKiBUaGUgcWluZmlmbyBhbmQgcW91dGZpZm8gYXJlIGNvbXBvc2VkIG9mIDI1NiAxIGJ5dGUgZWxlbWVudHMuIAorCSAqIFdoZW4gcHJvdmlkaW5nIGZvciB0aGUgdGFyZ2V0IG1vZGUgcm9sZSwgd2UgbXVzdCBhZGRpdGlvbmFsbHkKKwkgKiBwcm92aWRlIHNwYWNlIGZvciB0aGUgaW5jb21pbmcgdGFyZ2V0IGNvbW1hbmQgZmlmbyBhbmQgYW4gZXh0cmEKKwkgKiBieXRlIHRvIGRlYWwgd2l0aCBhIGRtYSBidWcgaW4gc29tZSBjaGlwIHZlcnNpb25zLgorCSAqLworCWRyaXZlcl9kYXRhX3NpemUgPSAyICogMjU2ICogc2l6ZW9mKHVpbnQ4X3QpOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UQVJHRVRNT0RFKSAhPSAwKQorCQlkcml2ZXJfZGF0YV9zaXplICs9IEFIQ19UTU9ERV9DTURTICogc2l6ZW9mKHN0cnVjdCB0YXJnZXRfY21kKQorCQkJCSArIC8qRE1BIFdpZGVPZGQgQnVnIEJ1ZmZlciovMTsKKwlpZiAoYWhjX2RtYV90YWdfY3JlYXRlKGFoYywgYWhjLT5wYXJlbnRfZG1hdCwgLyphbGlnbm1lbnQqLzEsCisJCQkgICAgICAgLypib3VuZGFyeSovQlVTX1NQQUNFX01BWEFERFJfMzJCSVQgKyAxLAorCQkJICAgICAgIC8qbG93YWRkciovQlVTX1NQQUNFX01BWEFERFJfMzJCSVQsCisJCQkgICAgICAgLypoaWdoYWRkciovQlVTX1NQQUNFX01BWEFERFIsCisJCQkgICAgICAgLypmaWx0ZXIqL05VTEwsIC8qZmlsdGVyYXJnKi9OVUxMLAorCQkJICAgICAgIGRyaXZlcl9kYXRhX3NpemUsCisJCQkgICAgICAgLypuc2VnbWVudHMqLzEsCisJCQkgICAgICAgLyptYXhzZWdzeiovQlVTX1NQQUNFX01BWFNJWkVfMzJCSVQsCisJCQkgICAgICAgLypmbGFncyovMCwgJmFoYy0+c2hhcmVkX2RhdGFfZG1hdCkgIT0gMCkgeworCQlyZXR1cm4gKEVOT01FTSk7CisJfQorCisJYWhjLT5pbml0X2xldmVsKys7CisKKwkvKiBBbGxvY2F0aW9uIG9mIGRyaXZlciBkYXRhICovCisJaWYgKGFoY19kbWFtZW1fYWxsb2MoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsCisJCQkgICAgICh2b2lkICoqKSZhaGMtPnFvdXRmaWZvLAorCQkJICAgICBCVVNfRE1BX05PV0FJVCwgJmFoYy0+c2hhcmVkX2RhdGFfZG1hbWFwKSAhPSAwKSB7CisJCXJldHVybiAoRU5PTUVNKTsKKwl9CisKKwlhaGMtPmluaXRfbGV2ZWwrKzsKKworCS8qIEFuZCBwZXJtYW5lbnRseSBtYXAgaXQgaW4gKi8KKwlhaGNfZG1hbWFwX2xvYWQoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsIGFoYy0+c2hhcmVkX2RhdGFfZG1hbWFwLAorCQkJYWhjLT5xb3V0ZmlmbywgZHJpdmVyX2RhdGFfc2l6ZSwgYWhjX2RtYW1hcF9jYiwKKwkJCSZhaGMtPnNoYXJlZF9kYXRhX2J1c2FkZHIsIC8qZmxhZ3MqLzApOworCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1RBUkdFVE1PREUpICE9IDApIHsKKwkJYWhjLT50YXJnZXRjbWRzID0gKHN0cnVjdCB0YXJnZXRfY21kICopYWhjLT5xb3V0ZmlmbzsKKwkJYWhjLT5xb3V0ZmlmbyA9ICh1aW50OF90ICopJmFoYy0+dGFyZ2V0Y21kc1tBSENfVE1PREVfQ01EU107CisJCWFoYy0+ZG1hX2J1Z19idWYgPSBhaGMtPnNoYXJlZF9kYXRhX2J1c2FkZHIKKwkJCQkgKyBkcml2ZXJfZGF0YV9zaXplIC0gMTsKKwkJLyogQWxsIHRhcmdldCBjb21tYW5kIGJsb2NrcyBzdGFydCBvdXQgaW52YWxpZC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IEFIQ19UTU9ERV9DTURTOyBpKyspCisJCQlhaGMtPnRhcmdldGNtZHNbaV0uY21kX3ZhbGlkID0gMDsKKwkJYWhjX3N5bmNfdHFpbmZpZm8oYWhjLCBCVVNfRE1BU1lOQ19QUkVSRUFEKTsKKwkJYWhjLT5xb3V0ZmlmbyA9ICh1aW50OF90ICopJmFoYy0+dGFyZ2V0Y21kc1syNTZdOworCX0KKwlhaGMtPnFpbmZpZm8gPSAmYWhjLT5xb3V0Zmlmb1syNTZdOworCisJYWhjLT5pbml0X2xldmVsKys7CisKKwkvKiBBbGxvY2F0ZSBTQ0IgZGF0YSBub3cgdGhhdCBidWZmZXJfZG1hdCBpcyBpbml0aWFsaXplZCAqLworCWlmIChhaGMtPnNjYl9kYXRhLT5tYXhoc2NicyA9PSAwKQorCQlpZiAoYWhjX2luaXRfc2NiZGF0YShhaGMpICE9IDApCisJCQlyZXR1cm4gKEVOT01FTSk7CisKKwkvKgorCSAqIEFsbG9jYXRlIGEgdHN0YXRlIHRvIGhvdXNlIGluZm9ybWF0aW9uIGZvciBvdXIKKwkgKiBpbml0aWF0b3IgcHJlc2VuY2Ugb24gdGhlIGJ1cyBhcyB3ZWxsIGFzIHRoZSB1c2VyCisJICogZGF0YSBmb3IgYW55IHRhcmdldCBtb2RlIGluaXRpYXRvci4KKwkgKi8KKwlpZiAoYWhjX2FsbG9jX3RzdGF0ZShhaGMsIGFoYy0+b3VyX2lkLCAnQScpID09IE5VTEwpIHsKKwkJcHJpbnRmKCIlczogdW5hYmxlIHRvIGFsbG9jYXRlIGFoY190bW9kZV90c3RhdGUuICAiCisJCSAgICAgICAiRmFpbGluZyBhdHRhY2hcbiIsIGFoY19uYW1lKGFoYykpOworCQlyZXR1cm4gKEVOT01FTSk7CisJfQorCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pICE9IDApIHsKKwkJaWYgKGFoY19hbGxvY190c3RhdGUoYWhjLCBhaGMtPm91cl9pZF9iLCAnQicpID09IE5VTEwpIHsKKwkJCXByaW50ZigiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBhaGNfdG1vZGVfdHN0YXRlLiAgIgorCQkJICAgICAgICJGYWlsaW5nIGF0dGFjaFxuIiwgYWhjX25hbWUoYWhjKSk7CisJCQlyZXR1cm4gKEVOT01FTSk7CisJCX0KKwl9CisKKwlpZiAoYWhjLT5zY2JfZGF0YS0+bWF4aHNjYnMgPCBBSENfU0NCX01BWF9BTExPQykgeworCQlhaGMtPmZsYWdzIHw9IEFIQ19QQUdFU0NCUzsKKwl9IGVsc2UgeworCQlhaGMtPmZsYWdzICY9IH5BSENfUEFHRVNDQlM7CisJfQorCisjaWZkZWYgQUhDX0RFQlVHCisJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX01JU0MpIHsKKwkJcHJpbnRmKCIlczogaGFyZHdhcmUgc2NiICV1IGJ5dGVzOyBrZXJuZWwgc2NiICV1IGJ5dGVzOyAiCisJCSAgICAgICAiYWhjX2RtYSAldSBieXRlc1xuIiwKKwkJCWFoY19uYW1lKGFoYyksCisJCQkodV9pbnQpc2l6ZW9mKHN0cnVjdCBoYXJkd2FyZV9zY2IpLAorCQkJKHVfaW50KXNpemVvZihzdHJ1Y3Qgc2NiKSwKKwkJCSh1X2ludClzaXplb2Yoc3RydWN0IGFoY19kbWFfc2VnKSk7CisJfQorI2VuZGlmIC8qIEFIQ19ERUJVRyAqLworCisJLyoKKwkgKiBMb29rIGF0IHRoZSBpbmZvcm1hdGlvbiB0aGF0IGJvYXJkIGluaXRpYWxpemF0aW9uIG9yCisJICogdGhlIGJvYXJkIGJpb3MgaGFzIGxlZnQgdXMuCisJICovCisJaWYgKGFoYy0+ZmVhdHVyZXMgJiBBSENfVFdJTikgeworCQlzY3NpX2NvbmYgPSBhaGNfaW5iKGFoYywgU0NTSUNPTkYgKyAxKTsKKwkJaWYgKChzY3NpX2NvbmYgJiBSRVNFVF9TQ1NJKSAhPSAwCisJCSAmJiAoYWhjLT5mbGFncyAmIEFIQ19JTklUSUFUT1JST0xFKSAhPSAwKQorCQkJYWhjLT5mbGFncyB8PSBBSENfUkVTRVRfQlVTX0I7CisJfQorCisJc2NzaV9jb25mID0gYWhjX2luYihhaGMsIFNDU0lDT05GKTsKKwlpZiAoKHNjc2lfY29uZiAmIFJFU0VUX1NDU0kpICE9IDAKKwkgJiYgKGFoYy0+ZmxhZ3MgJiBBSENfSU5JVElBVE9SUk9MRSkgIT0gMCkKKwkJYWhjLT5mbGFncyB8PSBBSENfUkVTRVRfQlVTX0E7CisKKwl1bHRyYWVuYiA9IDA7CQorCXRhZ2VuYWJsZSA9IEFMTF9UQVJHRVRTX01BU0s7CisKKwkvKiBHcmFiIHRoZSBkaXNjb25uZWN0aW9uIGRpc2FibGUgdGFibGUgYW5kIGludmVydCBpdCBmb3Igb3VyIG5lZWRzICovCisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1VTRURFRkFVTFRTKSAhPSAwKSB7CisJCXByaW50ZigiJXM6IEhvc3QgQWRhcHRlciBCaW9zIGRpc2FibGVkLiAgVXNpbmcgZGVmYXVsdCBTQ1NJICIKKwkJCSJkZXZpY2UgcGFyYW1ldGVyc1xuIiwgYWhjX25hbWUoYWhjKSk7CisJCWFoYy0+ZmxhZ3MgfD0gQUhDX0VYVEVOREVEX1RSQU5TX0F8QUhDX0VYVEVOREVEX1RSQU5TX0J8CisJCQkgICAgICBBSENfVEVSTV9FTkJfQXxBSENfVEVSTV9FTkJfQjsKKwkJZGlzY2VuYWJsZSA9IEFMTF9UQVJHRVRTX01BU0s7CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQSkgIT0gMCkKKwkJCXVsdHJhZW5iID0gQUxMX1RBUkdFVFNfTUFTSzsKKwl9IGVsc2UgeworCQlkaXNjZW5hYmxlID0gfigoYWhjX2luYihhaGMsIERJU0NfRFNCICsgMSkgPDwgOCkKKwkJCSAgIHwgYWhjX2luYihhaGMsIERJU0NfRFNCKSk7CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIChBSENfVUxUUkF8QUhDX1VMVFJBMikpICE9IDApCisJCQl1bHRyYWVuYiA9IChhaGNfaW5iKGFoYywgVUxUUkFfRU5CICsgMSkgPDwgOCkKKwkJCQkgICAgICB8IGFoY19pbmIoYWhjLCBVTFRSQV9FTkIpOworCX0KKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIChBSENfV0lERXxBSENfVFdJTikpID09IDApCisJCW1heF90YXJnID0gNzsKKworCWZvciAoaSA9IDA7IGkgPD0gbWF4X3Rhcmc7IGkrKykgeworCQlzdHJ1Y3QgYWhjX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJCXN0cnVjdCBhaGNfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJCXVfaW50IG91cl9pZDsKKwkJdV9pbnQgdGFyZ2V0X2lkOworCQljaGFyIGNoYW5uZWw7CisKKwkJY2hhbm5lbCA9ICdBJzsKKwkJb3VyX2lkID0gYWhjLT5vdXJfaWQ7CisJCXRhcmdldF9pZCA9IGk7CisJCWlmIChpID4gNyAmJiAoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSAhPSAwKSB7CisJCQljaGFubmVsID0gJ0InOworCQkJb3VyX2lkID0gYWhjLT5vdXJfaWRfYjsKKwkJCXRhcmdldF9pZCA9IGkgJSA4OworCQl9CisJCXRpbmZvID0gYWhjX2ZldGNoX3RyYW5zaW5mbyhhaGMsIGNoYW5uZWwsIG91cl9pZCwKKwkJCQkJICAgIHRhcmdldF9pZCwgJnRzdGF0ZSk7CisJCS8qIERlZmF1bHQgdG8gYXN5bmMgbmFycm93IGFjcm9zcyB0aGUgYm9hcmQgKi8KKwkJbWVtc2V0KHRpbmZvLCAwLCBzaXplb2YoKnRpbmZvKSk7CisJCWlmIChhaGMtPmZsYWdzICYgQUhDX1VTRURFRkFVTFRTKSB7CisJCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfV0lERSkgIT0gMCkKKwkJCQl0aW5mby0+dXNlci53aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfMTZfQklUOworCisJCQkvKgorCQkJICogVGhlc2Ugd2lsbCBiZSB0cnVuY2F0ZWQgd2hlbiB3ZSBkZXRlcm1pbmUgdGhlCisJCQkgKiBjb25uZWN0aW9uIHR5cGUgd2UgaGF2ZSB3aXRoIHRoZSB0YXJnZXQuCisJCQkgKi8KKwkJCXRpbmZvLT51c2VyLnBlcmlvZCA9IGFoY19zeW5jcmF0ZXMtPnBlcmlvZDsKKwkJCXRpbmZvLT51c2VyLm9mZnNldCA9IE1BWF9PRkZTRVQ7CisJCX0gZWxzZSB7CisJCQl1X2ludCBzY3NpcmF0ZTsKKwkJCXVpbnQxNl90IG1hc2s7CisKKwkJCS8qIFRha2UgdGhlIHNldHRpbmdzIGxlZnRvdmVyIGluIHNjcmF0Y2ggUkFNLiAqLworCQkJc2NzaXJhdGUgPSBhaGNfaW5iKGFoYywgVEFSR19TQ1NJUkFURSArIGkpOworCQkJbWFzayA9ICgweDAxIDw8IGkpOworCQkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQkJCXVfaW50IG9mZnNldDsKKwkJCQl1X2ludCBtYXhzeW5jOworCisJCQkJaWYgKChzY3NpcmF0ZSAmIFNPRlMpID09IDB4MEYpIHsKKwkJCQkJLyoKKwkJCQkJICogSGF2ZW4ndCBuZWdvdGlhdGVkIHlldCwKKwkJCQkJICogc28gdGhlIGZvcm1hdCBpcyBkaWZmZXJlbnQuCisJCQkJCSAqLworCQkJCQlzY3NpcmF0ZSA9IChzY3NpcmF0ZSAmIFNYRlIpID4+IDQKKwkJCQkJCSB8ICh1bHRyYWVuYiAmIG1hc2spCisJCQkJCQkgID8gMHgwOCA6IDB4MAorCQkJCQkJIHwgKHNjc2lyYXRlICYgV0lERVhGRVIpOworCQkJCQlvZmZzZXQgPSBNQVhfT0ZGU0VUX1VMVFJBMjsKKwkJCQl9IGVsc2UKKwkJCQkJb2Zmc2V0ID0gYWhjX2luYihhaGMsIFRBUkdfT0ZGU0VUICsgaSk7CisJCQkJaWYgKChzY3NpcmF0ZSAmIH5XSURFWEZFUikgPT0gMCAmJiBvZmZzZXQgIT0gMCkKKwkJCQkJLyogU2V0IHRvIHRoZSBsb3dlc3Qgc3luYyByYXRlLCA1TUh6ICovCisJCQkJCXNjc2lyYXRlIHw9IDB4MWM7CisJCQkJbWF4c3luYyA9IEFIQ19TWU5DUkFURV9VTFRSQTI7CisJCQkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0RUKSAhPSAwKQorCQkJCQltYXhzeW5jID0gQUhDX1NZTkNSQVRFX0RUOworCQkJCXRpbmZvLT51c2VyLnBlcmlvZCA9CisJCQkJICAgIGFoY19maW5kX3BlcmlvZChhaGMsIHNjc2lyYXRlLCBtYXhzeW5jKTsKKwkJCQlpZiAob2Zmc2V0ID09IDApCisJCQkJCXRpbmZvLT51c2VyLnBlcmlvZCA9IDA7CisJCQkJZWxzZQorCQkJCQl0aW5mby0+dXNlci5vZmZzZXQgPSBNQVhfT0ZGU0VUOworCQkJCWlmICgoc2NzaXJhdGUgJiBTWEZSX1VMVFJBMikgPD0gOC8qMTBNSHoqLworCQkJCSAmJiAoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgIT0gMCkKKwkJCQkJdGluZm8tPnVzZXIucHByX29wdGlvbnMgPQorCQkJCQkgICAgTVNHX0VYVF9QUFJfRFRfUkVROworCQkJfSBlbHNlIGlmICgoc2NzaXJhdGUgJiBTT0ZTKSAhPSAwKSB7CisJCQkJaWYgKChzY3NpcmF0ZSAmIFNYRlIpID09IDB4NDAKKwkJCQkgJiYgKHVsdHJhZW5iICYgbWFzaykgIT0gMCkgeworCQkJCQkvKiBUcmVhdCAxME1IeiBhcyBhIG5vbi11bHRyYSBzcGVlZCAqLworCQkJCQlzY3NpcmF0ZSAmPSB+U1hGUjsKKwkJCQkgCXVsdHJhZW5iICY9IH5tYXNrOworCQkJCX0KKwkJCQl0aW5mby0+dXNlci5wZXJpb2QgPSAKKwkJCQkgICAgYWhjX2ZpbmRfcGVyaW9kKGFoYywgc2NzaXJhdGUsCisJCQkJCQkgICAgKHVsdHJhZW5iICYgbWFzaykKKwkJCQkJCSAgID8gQUhDX1NZTkNSQVRFX1VMVFJBCisJCQkJCQkgICA6IEFIQ19TWU5DUkFURV9GQVNUKTsKKwkJCQlpZiAodGluZm8tPnVzZXIucGVyaW9kICE9IDApCisJCQkJCXRpbmZvLT51c2VyLm9mZnNldCA9IE1BWF9PRkZTRVQ7CisJCQl9CisJCQlpZiAodGluZm8tPnVzZXIucGVyaW9kID09IDApCisJCQkJdGluZm8tPnVzZXIub2Zmc2V0ID0gMDsKKwkJCWlmICgoc2NzaXJhdGUgJiBXSURFWEZFUikgIT0gMAorCQkJICYmIChhaGMtPmZlYXR1cmVzICYgQUhDX1dJREUpICE9IDApCisJCQkJdGluZm8tPnVzZXIud2lkdGggPSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVDsKKwkJCXRpbmZvLT51c2VyLnByb3RvY29sX3ZlcnNpb24gPSA0OworCQkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0RUKSAhPSAwKQorCQkJCXRpbmZvLT51c2VyLnRyYW5zcG9ydF92ZXJzaW9uID0gMzsKKwkJCWVsc2UKKwkJCQl0aW5mby0+dXNlci50cmFuc3BvcnRfdmVyc2lvbiA9IDI7CisJCQl0aW5mby0+Z29hbC5wcm90b2NvbF92ZXJzaW9uID0gMjsKKwkJCXRpbmZvLT5nb2FsLnRyYW5zcG9ydF92ZXJzaW9uID0gMjsKKwkJCXRpbmZvLT5jdXJyLnByb3RvY29sX3ZlcnNpb24gPSAyOworCQkJdGluZm8tPmN1cnIudHJhbnNwb3J0X3ZlcnNpb24gPSAyOworCQl9CisJCXRzdGF0ZS0+dWx0cmFlbmIgPSAwOworCX0KKwlhaGMtPnVzZXJfZGlzY2VuYWJsZSA9IGRpc2NlbmFibGU7CisJYWhjLT51c2VyX3RhZ2VuYWJsZSA9IHRhZ2VuYWJsZTsKKworCXJldHVybiAoYWhjLT5idXNfY2hpcF9pbml0KGFoYykpOworfQorCit2b2lkCithaGNfaW50cl9lbmFibGUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBpbnQgZW5hYmxlKQoreworCXVfaW50IGhjbnRybDsKKworCWhjbnRybCA9IGFoY19pbmIoYWhjLCBIQ05UUkwpOworCWhjbnRybCAmPSB+SU5URU47CisJYWhjLT5wYXVzZSAmPSB+SU5URU47CisJYWhjLT51bnBhdXNlICY9IH5JTlRFTjsKKwlpZiAoZW5hYmxlKSB7CisJCWhjbnRybCB8PSBJTlRFTjsKKwkJYWhjLT5wYXVzZSB8PSBJTlRFTjsKKwkJYWhjLT51bnBhdXNlIHw9IElOVEVOOworCX0KKwlhaGNfb3V0YihhaGMsIEhDTlRSTCwgaGNudHJsKTsKK30KKworLyoKKyAqIEVuc3VyZSB0aGF0IHRoZSBjYXJkIGlzIHBhdXNlZCBpbiBhIGxvY2F0aW9uCisgKiBvdXRzaWRlIG9mIGFsbCBjcml0aWNhbCBzZWN0aW9ucyBhbmQgdGhhdCBhbGwKKyAqIHBlbmRpbmcgd29yayBpcyBjb21wbGV0ZWQgcHJpb3IgdG8gcmV0dXJuaW5nLgorICogVGhpcyByb3V0aW5lIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIG91dHNpZGUKKyAqIGFuIGludGVycnVwdCBjb250ZXh0LgorICovCit2b2lkCithaGNfcGF1c2VfYW5kX2ZsdXNod29yayhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJaW50IGludHN0YXQ7CisJaW50IG1heGxvb3BzOworCWludCBwYXVzZWQ7CisKKwltYXhsb29wcyA9IDEwMDA7CisJYWhjLT5mbGFncyB8PSBBSENfQUxMX0lOVEVSUlVQVFM7CisJcGF1c2VkID0gRkFMU0U7CisJZG8geworCQlpZiAocGF1c2VkKQorCQkJYWhjX3VucGF1c2UoYWhjKTsKKwkJYWhjX2ludHIoYWhjKTsKKwkJYWhjX3BhdXNlKGFoYyk7CisJCXBhdXNlZCA9IFRSVUU7CisJCWFoY19vdXRiKGFoYywgU0NTSVNFUSwgYWhjX2luYihhaGMsIFNDU0lTRVEpICYgfkVOU0VMTyk7CisJCWFoY19jbGVhcl9jcml0aWNhbF9zZWN0aW9uKGFoYyk7CisJCWludHN0YXQgPSBhaGNfaW5iKGFoYywgSU5UU1RBVCk7CisJfSB3aGlsZSAoLS1tYXhsb29wcworCSAgICAgICYmIChpbnRzdGF0ICE9IDB4RkYgfHwgKGFoYy0+ZmVhdHVyZXMgJiBBSENfUkVNT1ZBQkxFKSA9PSAwKQorCSAgICAgICYmICgoaW50c3RhdCAmIElOVF9QRU5EKSAhPSAwCisJICAgICAgIHx8IChhaGNfaW5iKGFoYywgU1NUQVQwKSAmIChTRUxET3xTRUxJTkdPKSkgIT0gMCkpOworCWlmIChtYXhsb29wcyA9PSAwKSB7CisJCXByaW50ZigiSW5maW5pdGUgaW50ZXJydXB0IGxvb3AsIElOVFNUQVQgPSAleCIsCisJCSAgICAgICBhaGNfaW5iKGFoYywgSU5UU1RBVCkpOworCX0KKwlhaGNfcGxhdGZvcm1fZmx1c2h3b3JrKGFoYyk7CisJYWhjLT5mbGFncyAmPSB+QUhDX0FMTF9JTlRFUlJVUFRTOworfQorCitpbnQKK2FoY19zdXNwZW5kKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKworCWFoY19wYXVzZV9hbmRfZmx1c2h3b3JrKGFoYyk7CisKKwlpZiAoTElTVF9GSVJTVCgmYWhjLT5wZW5kaW5nX3NjYnMpICE9IE5VTEwpIHsKKwkJYWhjX3VucGF1c2UoYWhjKTsKKwkJcmV0dXJuIChFQlVTWSk7CisJfQorCisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCisJLyoKKwkgKiBYWFggV2hhdCBhYm91dCBBVElPcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHNlcnZpY2VkPworCSAqIFBlcmhhcHMgd2Ugc2hvdWxkIGp1c3QgcmVmdXNlIHRvIGJlIHN1c3BlbmRlZCBpZiB3ZQorCSAqIGFyZSBhY3RpbmcgaW4gYSB0YXJnZXQgcm9sZS4KKwkgKi8KKwlpZiAoYWhjLT5wZW5kaW5nX2RldmljZSAhPSBOVUxMKSB7CisJCWFoY191bnBhdXNlKGFoYyk7CisJCXJldHVybiAoRUJVU1kpOworCX0KKyNlbmRpZgorCWFoY19zaHV0ZG93bihhaGMpOworCXJldHVybiAoMCk7Cit9CisKK2ludAorYWhjX3Jlc3VtZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisKKwlhaGNfcmVzZXQoYWhjLCAvKnJlaW5pdCovVFJVRSk7CisJYWhjX2ludHJfZW5hYmxlKGFoYywgVFJVRSk7IAorCWFoY19yZXN0YXJ0KGFoYyk7CisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEJ1c3kgVGFyZ2V0IFRhYmxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBSZXR1cm4gdGhlIHVudGFnZ2VkIHRyYW5zYWN0aW9uIGlkIGZvciBhIGdpdmVuIHRhcmdldC9jaGFubmVsIGx1bi4KKyAqIE9wdGlvbmFsbHksIGNsZWFyIHRoZSBlbnRyeS4KKyAqLwordV9pbnQKK2FoY19pbmRleF9idXN5X3RjbChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHRjbCkKK3sKKwl1X2ludCBzY2JpZDsKKwl1X2ludCB0YXJnZXRfb2Zmc2V0OworCisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1NDQl9CVFQpICE9IDApIHsKKwkJdV9pbnQgc2F2ZWRfc2NicHRyOworCQkKKwkJc2F2ZWRfc2NicHRyID0gYWhjX2luYihhaGMsIFNDQlBUUik7CisJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBUQ0xfTFVOKHRjbCkpOworCQlzY2JpZCA9IGFoY19pbmIoYWhjLCBTQ0JfNjRfQlRUICsgVENMX1RBUkdFVF9PRkZTRVQodGNsKSk7CisJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBzYXZlZF9zY2JwdHIpOworCX0gZWxzZSB7CisJCXRhcmdldF9vZmZzZXQgPSBUQ0xfVEFSR0VUX09GRlNFVCh0Y2wpOworCQlzY2JpZCA9IGFoY19pbmIoYWhjLCBCVVNZX1RBUkdFVFMgKyB0YXJnZXRfb2Zmc2V0KTsKKwl9CisKKwlyZXR1cm4gKHNjYmlkKTsKK30KKwordm9pZAorYWhjX3VuYnVzeV90Y2woc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCB0Y2wpCit7CisJdV9pbnQgdGFyZ2V0X29mZnNldDsKKworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TQ0JfQlRUKSAhPSAwKSB7CisJCXVfaW50IHNhdmVkX3NjYnB0cjsKKwkJCisJCXNhdmVkX3NjYnB0ciA9IGFoY19pbmIoYWhjLCBTQ0JQVFIpOworCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgVENMX0xVTih0Y2wpKTsKKwkJYWhjX291dGIoYWhjLCBTQ0JfNjRfQlRUK1RDTF9UQVJHRVRfT0ZGU0VUKHRjbCksIFNDQl9MSVNUX05VTEwpOworCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgc2F2ZWRfc2NicHRyKTsKKwl9IGVsc2UgeworCQl0YXJnZXRfb2Zmc2V0ID0gVENMX1RBUkdFVF9PRkZTRVQodGNsKTsKKwkJYWhjX291dGIoYWhjLCBCVVNZX1RBUkdFVFMgKyB0YXJnZXRfb2Zmc2V0LCBTQ0JfTElTVF9OVUxMKTsKKwl9Cit9CisKK3ZvaWQKK2FoY19idXN5X3RjbChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHRjbCwgdV9pbnQgc2NiaWQpCit7CisJdV9pbnQgdGFyZ2V0X29mZnNldDsKKworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TQ0JfQlRUKSAhPSAwKSB7CisJCXVfaW50IHNhdmVkX3NjYnB0cjsKKwkJCisJCXNhdmVkX3NjYnB0ciA9IGFoY19pbmIoYWhjLCBTQ0JQVFIpOworCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgVENMX0xVTih0Y2wpKTsKKwkJYWhjX291dGIoYWhjLCBTQ0JfNjRfQlRUICsgVENMX1RBUkdFVF9PRkZTRVQodGNsKSwgc2NiaWQpOworCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgc2F2ZWRfc2NicHRyKTsKKwl9IGVsc2UgeworCQl0YXJnZXRfb2Zmc2V0ID0gVENMX1RBUkdFVF9PRkZTRVQodGNsKTsKKwkJYWhjX291dGIoYWhjLCBCVVNZX1RBUkdFVFMgKyB0YXJnZXRfb2Zmc2V0LCBzY2JpZCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogU0NCIGFuZCBTQ0IgcXVldWUgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqLworaW50CithaGNfbWF0Y2hfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqc2NiLCBpbnQgdGFyZ2V0LAorCSAgICAgIGNoYXIgY2hhbm5lbCwgaW50IGx1biwgdV9pbnQgdGFnLCByb2xlX3Qgcm9sZSkKK3sKKwlpbnQgdGFyZyA9IFNDQl9HRVRfVEFSR0VUKGFoYywgc2NiKTsKKwljaGFyIGNoYW4gPSBTQ0JfR0VUX0NIQU5ORUwoYWhjLCBzY2IpOworCWludCBzbHVuID0gU0NCX0dFVF9MVU4oc2NiKTsKKwlpbnQgbWF0Y2g7CisKKwltYXRjaCA9ICgoY2hhbiA9PSBjaGFubmVsKSB8fCAoY2hhbm5lbCA9PSBBTExfQ0hBTk5FTFMpKTsKKwlpZiAobWF0Y2ggIT0gMCkKKwkJbWF0Y2ggPSAoKHRhcmcgPT0gdGFyZ2V0KSB8fCAodGFyZ2V0ID09IENBTV9UQVJHRVRfV0lMRENBUkQpKTsKKwlpZiAobWF0Y2ggIT0gMCkKKwkJbWF0Y2ggPSAoKGx1biA9PSBzbHVuKSB8fCAobHVuID09IENBTV9MVU5fV0lMRENBUkQpKTsKKwlpZiAobWF0Y2ggIT0gMCkgeworI2lmZGVmIEFIQ19UQVJHRVRfTU9ERQorCQlpbnQgZ3JvdXA7CisKKwkJZ3JvdXAgPSBYUFRfRkNfR1JPVVAoc2NiLT5pb19jdHgtPmNjYl9oLmZ1bmNfY29kZSk7CisJCWlmIChyb2xlID09IFJPTEVfSU5JVElBVE9SKSB7CisJCQltYXRjaCA9IChncm91cCAhPSBYUFRfRkNfR1JPVVBfVE1PREUpCisJCQkgICAgICAmJiAoKHRhZyA9PSBzY2ItPmhzY2ItPnRhZykKKwkJCSAgICAgICB8fCAodGFnID09IFNDQl9MSVNUX05VTEwpKTsKKwkJfSBlbHNlIGlmIChyb2xlID09IFJPTEVfVEFSR0VUKSB7CisJCQltYXRjaCA9IChncm91cCA9PSBYUFRfRkNfR1JPVVBfVE1PREUpCisJCQkgICAgICAmJiAoKHRhZyA9PSBzY2ItPmlvX2N0eC0+Y3Npby50YWdfaWQpCisJCQkgICAgICAgfHwgKHRhZyA9PSBTQ0JfTElTVF9OVUxMKSk7CisJCX0KKyNlbHNlIC8qICFBSENfVEFSR0VUX01PREUgKi8KKwkJbWF0Y2ggPSAoKHRhZyA9PSBzY2ItPmhzY2ItPnRhZykgfHwgKHRhZyA9PSBTQ0JfTElTVF9OVUxMKSk7CisjZW5kaWYgLyogQUhDX1RBUkdFVF9NT0RFICovCisJfQorCisJcmV0dXJuIG1hdGNoOworfQorCit2b2lkCithaGNfZnJlZXplX2RldnEoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJaW50CXRhcmdldDsKKwljaGFyCWNoYW5uZWw7CisJaW50CWx1bjsKKworCXRhcmdldCA9IFNDQl9HRVRfVEFSR0VUKGFoYywgc2NiKTsKKwlsdW4gPSBTQ0JfR0VUX0xVTihzY2IpOworCWNoYW5uZWwgPSBTQ0JfR0VUX0NIQU5ORUwoYWhjLCBzY2IpOworCQorCWFoY19zZWFyY2hfcWluZmlmbyhhaGMsIHRhcmdldCwgY2hhbm5lbCwgbHVuLAorCQkJICAgLyp0YWcqL1NDQl9MSVNUX05VTEwsIFJPTEVfVU5LTk9XTiwKKwkJCSAgIENBTV9SRVFVRVVFX1JFUSwgU0VBUkNIX0NPTVBMRVRFKTsKKworCWFoY19wbGF0Zm9ybV9mcmVlemVfZGV2cShhaGMsIHNjYik7Cit9CisKK3ZvaWQKK2FoY19xaW5maWZvX3JlcXVldWVfdGFpbChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlzdHJ1Y3Qgc2NiICpwcmV2X3NjYjsKKworCXByZXZfc2NiID0gTlVMTDsKKwlpZiAoYWhjX3FpbmZpZm9fY291bnQoYWhjKSAhPSAwKSB7CisJCXVfaW50IHByZXZfdGFnOworCQl1aW50OF90IHByZXZfcG9zOworCisJCXByZXZfcG9zID0gYWhjLT5xaW5maWZvbmV4dCAtIDE7CisJCXByZXZfdGFnID0gYWhjLT5xaW5maWZvW3ByZXZfcG9zXTsKKwkJcHJldl9zY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIHByZXZfdGFnKTsKKwl9CisJYWhjX3FpbmZpZm9fcmVxdWV1ZShhaGMsIHByZXZfc2NiLCBzY2IpOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19RVUVVRV9SRUdTKSAhPSAwKSB7CisJCWFoY19vdXRiKGFoYywgSE5TQ0JfUU9GRiwgYWhjLT5xaW5maWZvbmV4dCk7CisJfSBlbHNlIHsKKwkJYWhjX291dGIoYWhjLCBLRVJORUxfUUlOUE9TLCBhaGMtPnFpbmZpZm9uZXh0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCithaGNfcWluZmlmb19yZXF1ZXVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqcHJldl9zY2IsCisJCSAgICBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJaWYgKHByZXZfc2NiID09IE5VTEwpIHsKKwkJYWhjX291dGIoYWhjLCBORVhUX1FVRVVFRF9TQ0IsIHNjYi0+aHNjYi0+dGFnKTsKKwl9IGVsc2UgeworCQlwcmV2X3NjYi0+aHNjYi0+bmV4dCA9IHNjYi0+aHNjYi0+dGFnOworCQlhaGNfc3luY19zY2IoYWhjLCBwcmV2X3NjYiwgCisJCQkgICAgIEJVU19ETUFTWU5DX1BSRVJFQUR8QlVTX0RNQVNZTkNfUFJFV1JJVEUpOworCX0KKwlhaGMtPnFpbmZpZm9bYWhjLT5xaW5maWZvbmV4dCsrXSA9IHNjYi0+aHNjYi0+dGFnOworCXNjYi0+aHNjYi0+bmV4dCA9IGFoYy0+bmV4dF9xdWV1ZWRfc2NiLT5oc2NiLT50YWc7CisJYWhjX3N5bmNfc2NiKGFoYywgc2NiLCBCVVNfRE1BU1lOQ19QUkVSRUFEfEJVU19ETUFTWU5DX1BSRVdSSVRFKTsKK30KKworc3RhdGljIGludAorYWhjX3FpbmZpZm9fY291bnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXVpbnQ4X3QgcWlucG9zOworCXVpbnQ4X3QgZGlmZjsKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19RVUVVRV9SRUdTKSAhPSAwKSB7CisJCXFpbnBvcyA9IGFoY19pbmIoYWhjLCBTTlNDQl9RT0ZGKTsKKwkJYWhjX291dGIoYWhjLCBTTlNDQl9RT0ZGLCBxaW5wb3MpOworCX0gZWxzZQorCQlxaW5wb3MgPSBhaGNfaW5iKGFoYywgUUlOUE9TKTsKKwlkaWZmID0gYWhjLT5xaW5maWZvbmV4dCAtIHFpbnBvczsKKwlyZXR1cm4gKGRpZmYpOworfQorCitpbnQKK2FoY19zZWFyY2hfcWluZmlmbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwKKwkJICAgaW50IGx1biwgdV9pbnQgdGFnLCByb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzLAorCQkgICBhaGNfc2VhcmNoX2FjdGlvbiBhY3Rpb24pCit7CisJc3RydWN0CXNjYiAqc2NiOworCXN0cnVjdAlzY2IgKnByZXZfc2NiOworCXVpbnQ4X3QgcWluc3RhcnQ7CisJdWludDhfdCBxaW5wb3M7CisJdWludDhfdCBxaW50YWlsOworCXVpbnQ4X3QgbmV4dDsKKwl1aW50OF90IHByZXY7CisJdWludDhfdCBjdXJzY2JwdHI7CisJaW50CWZvdW5kOworCWludAloYXZlX3FyZWdzOworCisJcWludGFpbCA9IGFoYy0+cWluZmlmb25leHQ7CisJaGF2ZV9xcmVncyA9IChhaGMtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpICE9IDA7CisJaWYgKGhhdmVfcXJlZ3MpIHsKKwkJcWluc3RhcnQgPSBhaGNfaW5iKGFoYywgU05TQ0JfUU9GRik7CisJCWFoY19vdXRiKGFoYywgU05TQ0JfUU9GRiwgcWluc3RhcnQpOworCX0gZWxzZQorCQlxaW5zdGFydCA9IGFoY19pbmIoYWhjLCBRSU5QT1MpOworCXFpbnBvcyA9IHFpbnN0YXJ0OworCWZvdW5kID0gMDsKKwlwcmV2X3NjYiA9IE5VTEw7CisKKwlpZiAoYWN0aW9uID09IFNFQVJDSF9DT01QTEVURSkgeworCQkvKgorCQkgKiBEb24ndCBhdHRlbXB0IHRvIHJ1biBhbnkgcXVldWVkIHVudGFnZ2VkIHRyYW5zYWN0aW9ucworCQkgKiB1bnRpbCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBhYm9ydCBwcm9jZXNzLgorCQkgKi8KKwkJYWhjX2ZyZWV6ZV91bnRhZ2dlZF9xdWV1ZXMoYWhjKTsKKwl9CisKKwkvKgorCSAqIFN0YXJ0IHdpdGggYW4gZW1wdHkgcXVldWUuICBFbnRyaWVzIHRoYXQgYXJlIG5vdCBjaG9zZW4KKwkgKiBmb3IgcmVtb3ZhbCB3aWxsIGJlIHJlLWFkZGVkIHRvIHRoZSBxdWV1ZSBhcyB3ZSBnby4KKwkgKi8KKwlhaGMtPnFpbmZpZm9uZXh0ID0gcWlucG9zOworCWFoY19vdXRiKGFoYywgTkVYVF9RVUVVRURfU0NCLCBhaGMtPm5leHRfcXVldWVkX3NjYi0+aHNjYi0+dGFnKTsKKworCXdoaWxlIChxaW5wb3MgIT0gcWludGFpbCkgeworCQlzY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIGFoYy0+cWluZmlmb1txaW5wb3NdKTsKKwkJaWYgKHNjYiA9PSBOVUxMKSB7CisJCQlwcmludGYoInFpbnBvcyA9ICVkLCBTQ0IgaW5kZXggPSAlZFxuIiwKKwkJCQlxaW5wb3MsIGFoYy0+cWluZmlmb1txaW5wb3NdKTsKKwkJCXBhbmljKCJMb29wIDFcbiIpOworCQl9CisKKwkJaWYgKGFoY19tYXRjaF9zY2IoYWhjLCBzY2IsIHRhcmdldCwgY2hhbm5lbCwgbHVuLCB0YWcsIHJvbGUpKSB7CisJCQkvKgorCQkJICogV2UgZm91bmQgYW4gc2NiIHRoYXQgbmVlZHMgdG8gYmUgYWN0ZWQgb24uCisJCQkgKi8KKwkJCWZvdW5kKys7CisJCQlzd2l0Y2ggKGFjdGlvbikgeworCQkJY2FzZSBTRUFSQ0hfQ09NUExFVEU6CisJCQl7CisJCQkJY2FtX3N0YXR1cyBvc3RhdDsKKwkJCQljYW1fc3RhdHVzIGNzdGF0OworCisJCQkJb3N0YXQgPSBhaGNfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpOworCQkJCWlmIChvc3RhdCA9PSBDQU1fUkVRX0lOUFJPRykKKwkJCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBzdGF0dXMpOworCQkJCWNzdGF0ID0gYWhjX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKTsKKwkJCQlpZiAoY3N0YXQgIT0gQ0FNX1JFUV9DTVApCisJCQkJCWFoY19mcmVlemVfc2NiKHNjYik7CisJCQkJaWYgKChzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkKKwkJCQkJcHJpbnRmKCJJbmFjdGl2ZSBTQ0IgaW4gcWluZmlmb1xuIik7CisJCQkJYWhjX2RvbmUoYWhjLCBzY2IpOworCisJCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJCX0KKwkJCWNhc2UgU0VBUkNIX1JFTU9WRToKKwkJCQlicmVhazsKKwkJCWNhc2UgU0VBUkNIX0NPVU5UOgorCQkJCWFoY19xaW5maWZvX3JlcXVldWUoYWhjLCBwcmV2X3NjYiwgc2NiKTsKKwkJCQlwcmV2X3NjYiA9IHNjYjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWFoY19xaW5maWZvX3JlcXVldWUoYWhjLCBwcmV2X3NjYiwgc2NiKTsKKwkJCXByZXZfc2NiID0gc2NiOworCQl9CisJCXFpbnBvcysrOworCX0KKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19RVUVVRV9SRUdTKSAhPSAwKSB7CisJCWFoY19vdXRiKGFoYywgSE5TQ0JfUU9GRiwgYWhjLT5xaW5maWZvbmV4dCk7CisJfSBlbHNlIHsKKwkJYWhjX291dGIoYWhjLCBLRVJORUxfUUlOUE9TLCBhaGMtPnFpbmZpZm9uZXh0KTsKKwl9CisKKwlpZiAoYWN0aW9uICE9IFNFQVJDSF9DT1VOVAorCSAmJiAoZm91bmQgIT0gMCkKKwkgJiYgKHFpbnN0YXJ0ICE9IGFoYy0+cWluZmlmb25leHQpKSB7CisJCS8qCisJCSAqIFRoZSBzZXF1ZW5jZXIgbWF5IGJlIGluIHRoZSBwcm9jZXNzIG9mIGRtYWluZworCQkgKiBkb3duIHRoZSBTQ0IgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcXVldWUuCisJCSAqIFRoaXMgY291bGQgYmUgcHJvYmxlbWF0aWMgaWYgZWl0aGVyIHRoZSBmaXJzdCwKKwkJICogb3IgdGhlIHNlY29uZCBTQ0IgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZQorCQkgKiAodGhlIGZpcnN0IFNDQiBpbmNsdWRlcyBhIHBvaW50ZXIgdG8gdGhlICJuZXh0IgorCQkgKiBTQ0IgdG8gZG1hKS4gSWYgd2UgaGF2ZSByZW1vdmVkIGFueSBlbnRyaWVzLCBzd2FwCisJCSAqIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBxdWV1ZSB3aXRoIHRoZSBuZXh0IEhTQ0IKKwkJICogc28gdGhlIHNlcXVlbmNlciB3aWxsIG5vdGljZSB0aGF0IE5FWFRfUVVFVUVEX1NDQgorCQkgKiBoYXMgY2hhbmdlZCBkdXJpbmcgaXRzIGRtYSBhdHRlbXB0IGFuZCB3aWxsIHJldHJ5CisJCSAqIHRoZSBETUEuCisJCSAqLworCQlzY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIGFoYy0+cWluZmlmb1txaW5zdGFydF0pOworCisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJcHJpbnRmKCJmb3VuZCA9ICVkLCBxaW5zdGFydCA9ICVkLCBxaW5maWZpb25leHQgPSAlZFxuIiwKKwkJCQlmb3VuZCwgcWluc3RhcnQsIGFoYy0+cWluZmlmb25leHQpOworCQkJcGFuaWMoIkZpcnN0L1NlY29uZCBRaW5maWZvIGZpeHVwXG4iKTsKKwkJfQorCQkvKgorCQkgKiBhaGNfc3dhcF93aXRoX25leHRfaHNjYiBmb3JjZXMgb3VyIG5leHQgcG9pbnRlciB0bworCQkgKiBwb2ludCB0byB0aGUgcmVzZXJ2ZWQgU0NCIGZvciBmdXR1cmUgY29tbWFuZHMuICBTYXZlCisJCSAqIGFuZCByZXN0b3JlIG91ciBvcmlnaW5hbCBuZXh0IHBvaW50ZXIgdG8gbWFpbnRhaW4KKwkJICogcXVldWUgaW50ZWdyaXR5LgorCQkgKi8KKwkJbmV4dCA9IHNjYi0+aHNjYi0+bmV4dDsKKwkJYWhjLT5zY2JfZGF0YS0+c2NiaW5kZXhbc2NiLT5oc2NiLT50YWddID0gTlVMTDsKKwkJYWhjX3N3YXBfd2l0aF9uZXh0X2hzY2IoYWhjLCBzY2IpOworCQlzY2ItPmhzY2ItPm5leHQgPSBuZXh0OworCQlhaGMtPnFpbmZpZm9bcWluc3RhcnRdID0gc2NiLT5oc2NiLT50YWc7CisKKwkJLyogVGVsbCB0aGUgY2FyZCBhYm91dCB0aGUgbmV3IGhlYWQgb2YgdGhlIHFpbmZpZm8uICovCisJCWFoY19vdXRiKGFoYywgTkVYVF9RVUVVRURfU0NCLCBzY2ItPmhzY2ItPnRhZyk7CisKKwkJLyogRml4dXAgdGhlIHRhaWwgIm5leHQiIHBvaW50ZXIuICovCisJCXFpbnRhaWwgPSBhaGMtPnFpbmZpZm9uZXh0IC0gMTsKKwkJc2NiID0gYWhjX2xvb2t1cF9zY2IoYWhjLCBhaGMtPnFpbmZpZm9bcWludGFpbF0pOworCQlzY2ItPmhzY2ItPm5leHQgPSBhaGMtPm5leHRfcXVldWVkX3NjYi0+aHNjYi0+dGFnOworCX0KKworCS8qCisJICogU2VhcmNoIHdhaXRpbmcgZm9yIHNlbGVjdGlvbiBsaXN0LgorCSAqLworCWN1cnNjYnB0ciA9IGFoY19pbmIoYWhjLCBTQ0JQVFIpOworCW5leHQgPSBhaGNfaW5iKGFoYywgV0FJVElOR19TQ0JIKTsgIC8qIFN0YXJ0IGF0IGhlYWQgb2YgbGlzdC4gKi8KKwlwcmV2ID0gU0NCX0xJU1RfTlVMTDsKKworCXdoaWxlIChuZXh0ICE9IFNDQl9MSVNUX05VTEwpIHsKKwkJdWludDhfdCBzY2JfaW5kZXg7CisKKwkJYWhjX291dGIoYWhjLCBTQ0JQVFIsIG5leHQpOworCQlzY2JfaW5kZXggPSBhaGNfaW5iKGFoYywgU0NCX1RBRyk7CisJCWlmIChzY2JfaW5kZXggPj0gYWhjLT5zY2JfZGF0YS0+bnVtc2NicykgeworCQkJcHJpbnRmKCJXYWl0aW5nIExpc3QgaW5jb25zaXN0ZW5jeS4gIgorCQkJICAgICAgICJTQ0IgaW5kZXggPT0gJWQsIHlldCBudW1zY2JzID09ICVkLiIsCisJCQkgICAgICAgc2NiX2luZGV4LCBhaGMtPnNjYl9kYXRhLT5udW1zY2JzKTsKKwkJCWFoY19kdW1wX2NhcmRfc3RhdGUoYWhjKTsKKwkJCXBhbmljKCJmb3Igc2FmZXR5Iik7CisJCX0KKwkJc2NiID0gYWhjX2xvb2t1cF9zY2IoYWhjLCBzY2JfaW5kZXgpOworCQlpZiAoc2NiID09IE5VTEwpIHsKKwkJCXByaW50Zigic2NiX2luZGV4ID0gJWQsIG5leHQgPSAlZFxuIiwKKwkJCQlzY2JfaW5kZXgsIG5leHQpOworCQkJcGFuaWMoIldhaXRpbmcgTGlzdCB0cmF2ZXJzYWxcbiIpOworCQl9CisJCWlmIChhaGNfbWF0Y2hfc2NiKGFoYywgc2NiLCB0YXJnZXQsIGNoYW5uZWwsCisJCQkJICBsdW4sIFNDQl9MSVNUX05VTEwsIHJvbGUpKSB7CisJCQkvKgorCQkJICogV2UgZm91bmQgYW4gc2NiIHRoYXQgbmVlZHMgdG8gYmUgYWN0ZWQgb24uCisJCQkgKi8KKwkJCWZvdW5kKys7CisJCQlzd2l0Y2ggKGFjdGlvbikgeworCQkJY2FzZSBTRUFSQ0hfQ09NUExFVEU6CisJCQl7CisJCQkJY2FtX3N0YXR1cyBvc3RhdDsKKwkJCQljYW1fc3RhdHVzIGNzdGF0OworCisJCQkJb3N0YXQgPSBhaGNfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpOworCQkJCWlmIChvc3RhdCA9PSBDQU1fUkVRX0lOUFJPRykKKwkJCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLAorCQkJCQkJCQkgICBzdGF0dXMpOworCQkJCWNzdGF0ID0gYWhjX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKTsKKwkJCQlpZiAoY3N0YXQgIT0gQ0FNX1JFUV9DTVApCisJCQkJCWFoY19mcmVlemVfc2NiKHNjYik7CisJCQkJaWYgKChzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkKKwkJCQkJcHJpbnRmKCJJbmFjdGl2ZSBTQ0IgaW4gV2FpdGluZyBMaXN0XG4iKTsKKwkJCQlhaGNfZG9uZShhaGMsIHNjYik7CisJCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJCX0KKwkJCWNhc2UgU0VBUkNIX1JFTU9WRToKKwkJCQluZXh0ID0gYWhjX3JlbV93c2NiKGFoYywgbmV4dCwgcHJldik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNFQVJDSF9DT1VOVDoKKwkJCQlwcmV2ID0gbmV4dDsKKwkJCQluZXh0ID0gYWhjX2luYihhaGMsIFNDQl9ORVhUKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCQorCQkJcHJldiA9IG5leHQ7CisJCQluZXh0ID0gYWhjX2luYihhaGMsIFNDQl9ORVhUKTsKKwkJfQorCX0KKwlhaGNfb3V0YihhaGMsIFNDQlBUUiwgY3Vyc2NicHRyKTsKKworCWZvdW5kICs9IGFoY19zZWFyY2hfdW50YWdnZWRfcXVldWVzKGFoYywgLyphaGNfaW9fY3R4X3QqL05VTEwsIHRhcmdldCwKKwkJCQkJICAgIGNoYW5uZWwsIGx1biwgc3RhdHVzLCBhY3Rpb24pOworCisJaWYgKGFjdGlvbiA9PSBTRUFSQ0hfQ09NUExFVEUpCisJCWFoY19yZWxlYXNlX3VudGFnZ2VkX3F1ZXVlcyhhaGMpOworCXJldHVybiAoZm91bmQpOworfQorCitpbnQKK2FoY19zZWFyY2hfdW50YWdnZWRfcXVldWVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgYWhjX2lvX2N0eF90IGN0eCwKKwkJCSAgIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwgaW50IGx1biwgdWludDMyX3Qgc3RhdHVzLAorCQkJICAgYWhjX3NlYXJjaF9hY3Rpb24gYWN0aW9uKQoreworCXN0cnVjdAlzY2IgKnNjYjsKKwlpbnQJbWF4dGFyZ2V0OworCWludAlmb3VuZDsKKwlpbnQJaTsKKworCWlmIChhY3Rpb24gPT0gU0VBUkNIX0NPTVBMRVRFKSB7CisJCS8qCisJCSAqIERvbid0IGF0dGVtcHQgdG8gcnVuIGFueSBxdWV1ZWQgdW50YWdnZWQgdHJhbnNhY3Rpb25zCisJCSAqIHVudGlsIHdlIGFyZSBkb25lIHdpdGggdGhlIGFib3J0IHByb2Nlc3MuCisJCSAqLworCQlhaGNfZnJlZXplX3VudGFnZ2VkX3F1ZXVlcyhhaGMpOworCX0KKworCWZvdW5kID0gMDsKKwlpID0gMDsKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfU0NCX0JUVCkgPT0gMCkgeworCisJCW1heHRhcmdldCA9IDE2OworCQlpZiAodGFyZ2V0ICE9IENBTV9UQVJHRVRfV0lMRENBUkQpIHsKKworCQkJaSA9IHRhcmdldDsKKwkJCWlmIChjaGFubmVsID09ICdCJykKKwkJCQlpICs9IDg7CisJCQltYXh0YXJnZXQgPSBpICsgMTsKKwkJfQorCX0gZWxzZSB7CisJCW1heHRhcmdldCA9IDA7CisJfQorCisJZm9yICg7IGkgPCBtYXh0YXJnZXQ7IGkrKykgeworCQlzdHJ1Y3Qgc2NiX3RhaWxxICp1bnRhZ2dlZF9xOworCQlzdHJ1Y3Qgc2NiICpuZXh0X3NjYjsKKworCQl1bnRhZ2dlZF9xID0gJihhaGMtPnVudGFnZ2VkX3F1ZXVlc1tpXSk7CisJCW5leHRfc2NiID0gVEFJTFFfRklSU1QodW50YWdnZWRfcSk7CisJCXdoaWxlIChuZXh0X3NjYiAhPSBOVUxMKSB7CisKKwkJCXNjYiA9IG5leHRfc2NiOworCQkJbmV4dF9zY2IgPSBUQUlMUV9ORVhUKHNjYiwgbGlua3MudHFlKTsKKworCQkJLyoKKwkJCSAqIFRoZSBoZWFkIG9mIHRoZSBsaXN0IG1heSBiZSB0aGUgY3VycmVudGx5CisJCQkgKiBhY3RpdmUgdW50YWdnZWQgY29tbWFuZCBmb3IgYSBkZXZpY2UuCisJCQkgKiBXZSdyZSBvbmx5IHNlYXJjaGluZyBmb3IgY29tbWFuZHMgdGhhdAorCQkJICogaGF2ZSBub3QgYmVlbiBzdGFydGVkLiAgQSB0cmFuc2FjdGlvbgorCQkJICogbWFya2VkIGFjdGl2ZSBidXQgc3RpbGwgaW4gdGhlIHFpbmZpZm8KKwkJCSAqIGlzIHJlbW92ZWQgYnkgdGhlIHFpbmZpZm8gc2Nhbm5pbmcgY29kZQorCQkJICogYWJvdmUuCisJCQkgKi8KKwkJCWlmICgoc2NiLT5mbGFncyAmIFNDQl9BQ1RJVkUpICE9IDApCisJCQkJY29udGludWU7CisKKwkJCWlmIChhaGNfbWF0Y2hfc2NiKGFoYywgc2NiLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwKKwkJCQkJICBTQ0JfTElTVF9OVUxMLCBST0xFX0lOSVRJQVRPUikgPT0gMAorCQkJIHx8IChjdHggIT0gTlVMTCAmJiBjdHggIT0gc2NiLT5pb19jdHgpKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogV2UgZm91bmQgYW4gc2NiIHRoYXQgbmVlZHMgdG8gYmUgYWN0ZWQgb24uCisJCQkgKi8KKwkJCWZvdW5kKys7CisJCQlzd2l0Y2ggKGFjdGlvbikgeworCQkJY2FzZSBTRUFSQ0hfQ09NUExFVEU6CisJCQl7CisJCQkJY2FtX3N0YXR1cyBvc3RhdDsKKwkJCQljYW1fc3RhdHVzIGNzdGF0OworCisJCQkJb3N0YXQgPSBhaGNfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpOworCQkJCWlmIChvc3RhdCA9PSBDQU1fUkVRX0lOUFJPRykKKwkJCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBzdGF0dXMpOworCQkJCWNzdGF0ID0gYWhjX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKTsKKwkJCQlpZiAoY3N0YXQgIT0gQ0FNX1JFUV9DTVApCisJCQkJCWFoY19mcmVlemVfc2NiKHNjYik7CisJCQkJaWYgKChzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkKKwkJCQkJcHJpbnRmKCJJbmFjdGl2ZSBTQ0IgaW4gdW50YWdnZWRRXG4iKTsKKwkJCQlhaGNfZG9uZShhaGMsIHNjYik7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIFNFQVJDSF9SRU1PVkU6CisJCQkJc2NiLT5mbGFncyAmPSB+U0NCX1VOVEFHR0VEUTsKKwkJCQlUQUlMUV9SRU1PVkUodW50YWdnZWRfcSwgc2NiLCBsaW5rcy50cWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBTRUFSQ0hfQ09VTlQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoYWN0aW9uID09IFNFQVJDSF9DT01QTEVURSkKKwkJYWhjX3JlbGVhc2VfdW50YWdnZWRfcXVldWVzKGFoYyk7CisJcmV0dXJuIChmb3VuZCk7Cit9CisKK2ludAorYWhjX3NlYXJjaF9kaXNjX2xpc3Qoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBpbnQgdGFyZ2V0LCBjaGFyIGNoYW5uZWwsCisJCSAgICAgaW50IGx1biwgdV9pbnQgdGFnLCBpbnQgc3RvcF9vbl9maXJzdCwgaW50IHJlbW92ZSwKKwkJICAgICBpbnQgc2F2ZV9zdGF0ZSkKK3sKKwlzdHJ1Y3QJc2NiICpzY2JwOworCXVfaW50CW5leHQ7CisJdV9pbnQJcHJldjsKKwl1X2ludAljb3VudDsKKwl1X2ludAlhY3RpdmVfc2NiOworCisJY291bnQgPSAwOworCW5leHQgPSBhaGNfaW5iKGFoYywgRElTQ09OTkVDVEVEX1NDQkgpOworCXByZXYgPSBTQ0JfTElTVF9OVUxMOworCisJaWYgKHNhdmVfc3RhdGUpIHsKKwkJLyogcmVzdG9yZSB0aGlzIHdoZW4gd2UncmUgZG9uZSAqLworCQlhY3RpdmVfc2NiID0gYWhjX2luYihhaGMsIFNDQlBUUik7CisJfSBlbHNlCisJCS8qIFNpbGVuY2UgY29tcGlsZXIgKi8KKwkJYWN0aXZlX3NjYiA9IFNDQl9MSVNUX05VTEw7CisKKwl3aGlsZSAobmV4dCAhPSBTQ0JfTElTVF9OVUxMKSB7CisJCXVfaW50IHNjYl9pbmRleDsKKworCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgbmV4dCk7CisJCXNjYl9pbmRleCA9IGFoY19pbmIoYWhjLCBTQ0JfVEFHKTsKKwkJaWYgKHNjYl9pbmRleCA+PSBhaGMtPnNjYl9kYXRhLT5udW1zY2JzKSB7CisJCQlwcmludGYoIkRpc2Nvbm5lY3RlZCBMaXN0IGluY29uc2lzdGVuY3kuICIKKwkJCSAgICAgICAiU0NCIGluZGV4ID09ICVkLCB5ZXQgbnVtc2NicyA9PSAlZC4iLAorCQkJICAgICAgIHNjYl9pbmRleCwgYWhjLT5zY2JfZGF0YS0+bnVtc2Nicyk7CisJCQlhaGNfZHVtcF9jYXJkX3N0YXRlKGFoYyk7CisJCQlwYW5pYygiZm9yIHNhZmV0eSIpOworCQl9CisKKwkJaWYgKG5leHQgPT0gcHJldikgeworCQkJcGFuaWMoIkRpc2Nvbm5lY3RlZCBMaXN0IExvb3AuICIKKwkJCSAgICAgICJjdXIgU0NCUFRSID09ICV4LCBwcmV2IFNDQlBUUiA9PSAleC4iLAorCQkJICAgICAgbmV4dCwgcHJldik7CisJCX0KKwkJc2NicCA9IGFoY19sb29rdXBfc2NiKGFoYywgc2NiX2luZGV4KTsKKwkJaWYgKGFoY19tYXRjaF9zY2IoYWhjLCBzY2JwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwKKwkJCQkgIHRhZywgUk9MRV9JTklUSUFUT1IpKSB7CisJCQljb3VudCsrOworCQkJaWYgKHJlbW92ZSkgeworCQkJCW5leHQgPQorCQkJCSAgICBhaGNfcmVtX3NjYl9mcm9tX2Rpc2NfbGlzdChhaGMsIHByZXYsIG5leHQpOworCQkJfSBlbHNlIHsKKwkJCQlwcmV2ID0gbmV4dDsKKwkJCQluZXh0ID0gYWhjX2luYihhaGMsIFNDQl9ORVhUKTsKKwkJCX0KKwkJCWlmIChzdG9wX29uX2ZpcnN0KQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJcHJldiA9IG5leHQ7CisJCQluZXh0ID0gYWhjX2luYihhaGMsIFNDQl9ORVhUKTsKKwkJfQorCX0KKwlpZiAoc2F2ZV9zdGF0ZSkKKwkJYWhjX291dGIoYWhjLCBTQ0JQVFIsIGFjdGl2ZV9zY2IpOworCXJldHVybiAoY291bnQpOworfQorCisvKgorICogUmVtb3ZlIGFuIFNDQiBmcm9tIHRoZSBvbiBjaGlwIGxpc3Qgb2YgZGlzY29ubmVjdGVkIHRyYW5zYWN0aW9ucy4KKyAqIFRoaXMgaXMgZW1wdHkvdW51c2VkIGlmIHdlIGFyZSBub3QgcGVyZm9ybWluZyBTQ0IgcGFnaW5nLgorICovCitzdGF0aWMgdV9pbnQKK2FoY19yZW1fc2NiX2Zyb21fZGlzY19saXN0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgcHJldiwgdV9pbnQgc2NicHRyKQoreworCXVfaW50IG5leHQ7CisKKwlhaGNfb3V0YihhaGMsIFNDQlBUUiwgc2NicHRyKTsKKwluZXh0ID0gYWhjX2luYihhaGMsIFNDQl9ORVhUKTsKKworCWFoY19vdXRiKGFoYywgU0NCX0NPTlRST0wsIDApOworCisJYWhjX2FkZF9jdXJzY2JfdG9fZnJlZV9saXN0KGFoYyk7CisKKwlpZiAocHJldiAhPSBTQ0JfTElTVF9OVUxMKSB7CisJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBwcmV2KTsKKwkJYWhjX291dGIoYWhjLCBTQ0JfTkVYVCwgbmV4dCk7CisJfSBlbHNlCisJCWFoY19vdXRiKGFoYywgRElTQ09OTkVDVEVEX1NDQkgsIG5leHQpOworCisJcmV0dXJuIChuZXh0KTsKK30KKworLyoKKyAqIEFkZCB0aGUgU0NCIGFzIHNlbGVjdGVkIGJ5IFNDQlBUUiBvbnRvIHRoZSBvbiBjaGlwIGxpc3Qgb2YKKyAqIGZyZWUgaGFyZHdhcmUgU0NCcy4gIFRoaXMgbGlzdCBpcyBlbXB0eS91bnVzZWQgaWYgd2UgYXJlIG5vdAorICogcGVyZm9ybWluZyBTQ0IgcGFnaW5nLgorICovCitzdGF0aWMgdm9pZAorYWhjX2FkZF9jdXJzY2JfdG9fZnJlZV9saXN0KHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwkvKgorCSAqIEludmFsaWRhdGUgdGhlIHRhZyBzbyB0aGF0IG91ciBhYm9ydAorCSAqIHJvdXRpbmVzIGRvbid0IHRoaW5rIGl0J3MgYWN0aXZlLgorCSAqLworCWFoY19vdXRiKGFoYywgU0NCX1RBRywgU0NCX0xJU1RfTlVMTCk7CisKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfUEFHRVNDQlMpICE9IDApIHsKKwkJYWhjX291dGIoYWhjLCBTQ0JfTkVYVCwgYWhjX2luYihhaGMsIEZSRUVfU0NCSCkpOworCQlhaGNfb3V0YihhaGMsIEZSRUVfU0NCSCwgYWhjX2luYihhaGMsIFNDQlBUUikpOworCX0KK30KKworLyoKKyAqIE1hbmlwdWxhdGUgdGhlIHdhaXRpbmcgZm9yIHNlbGVjdGlvbiBsaXN0IGFuZCByZXR1cm4gdGhlCisgKiBzY2IgdGhhdCBmb2xsb3dzIHRoZSBvbmUgdGhhdCB3ZSByZW1vdmUuCisgKi8KK3N0YXRpYyB1X2ludAorYWhjX3JlbV93c2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgc2NicG9zLCB1X2ludCBwcmV2KQoreyAgICAgICAKKwl1X2ludCBjdXJzY2IsIG5leHQ7CisKKwkvKgorCSAqIFNlbGVjdCB0aGUgU0NCIHdlIHdhbnQgdG8gYWJvcnQgYW5kCisJICogcHVsbCB0aGUgbmV4dCBwb2ludGVyIG91dCBvZiBpdC4KKwkgKi8KKwljdXJzY2IgPSBhaGNfaW5iKGFoYywgU0NCUFRSKTsKKwlhaGNfb3V0YihhaGMsIFNDQlBUUiwgc2NicG9zKTsKKwluZXh0ID0gYWhjX2luYihhaGMsIFNDQl9ORVhUKTsKKworCS8qIENsZWFyIHRoZSBuZWNlc3NhcnkgZmllbGRzICovCisJYWhjX291dGIoYWhjLCBTQ0JfQ09OVFJPTCwgMCk7CisKKwlhaGNfYWRkX2N1cnNjYl90b19mcmVlX2xpc3QoYWhjKTsKKworCS8qIHVwZGF0ZSB0aGUgd2FpdGluZyBsaXN0ICovCisJaWYgKHByZXYgPT0gU0NCX0xJU1RfTlVMTCkgeworCQkvKiBGaXJzdCBpbiB0aGUgbGlzdCAqLworCQlhaGNfb3V0YihhaGMsIFdBSVRJTkdfU0NCSCwgbmV4dCk7IAorCisJCS8qCisJCSAqIEVuc3VyZSB3ZSBhcmVuJ3QgYXR0ZW1wdGluZyB0byBwZXJmb3JtCisJCSAqIHNlbGVjdGlvbiBmb3IgdGhpcyBlbnRyeS4KKwkJICovCisJCWFoY19vdXRiKGFoYywgU0NTSVNFUSwgKGFoY19pbmIoYWhjLCBTQ1NJU0VRKSAmIH5FTlNFTE8pKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTZWxlY3QgdGhlIHNjYiB0aGF0IHBvaW50ZWQgdG8gdXMgCisJCSAqIGFuZCB1cGRhdGUgaXRzIG5leHQgcG9pbnRlci4KKwkJICovCisJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBwcmV2KTsKKwkJYWhjX291dGIoYWhjLCBTQ0JfTkVYVCwgbmV4dCk7CisJfQorCisJLyoKKwkgKiBQb2ludCB1cyBiYWNrIGF0IHRoZSBvcmlnaW5hbCBzY2IgcG9zaXRpb24uCisJICovCisJYWhjX291dGIoYWhjLCBTQ0JQVFIsIGN1cnNjYik7CisJcmV0dXJuIG5leHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFcnJvciBIYW5kbGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQWJvcnQgYWxsIFNDQnMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gZGVzY3JpcHRpb24gKHRhcmdldC9jaGFubmVsL2x1bi90YWcpLAorICogc2V0dGluZyB0aGVpciBzdGF0dXMgdG8gdGhlIHBhc3NlZCBpbiBzdGF0dXMgaWYgdGhlIHN0YXR1cyBoYXMgbm90IGFscmVhZHkKKyAqIGJlZW4gbW9kaWZpZWQgZnJvbSBDQU1fUkVRX0lOUFJPRy4gIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgdGhlIHNlcXVlbmNlcgorICogaXMgcGF1c2VkIGJlZm9yZSBpdCBpcyBjYWxsZWQuCisgKi8KK2ludAorYWhjX2Fib3J0X3NjYnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBpbnQgdGFyZ2V0LCBjaGFyIGNoYW5uZWwsCisJICAgICAgIGludCBsdW4sIHVfaW50IHRhZywgcm9sZV90IHJvbGUsIHVpbnQzMl90IHN0YXR1cykKK3sKKwlzdHJ1Y3QJc2NiICpzY2JwOworCXN0cnVjdAlzY2IgKnNjYnBfbmV4dDsKKwl1X2ludAlhY3RpdmVfc2NiOworCWludAlpLCBqOworCWludAltYXh0YXJnZXQ7CisJaW50CW1pbmx1bjsKKwlpbnQJbWF4bHVuOworCisJaW50CWZvdW5kOworCisJLyoKKwkgKiBEb24ndCBhdHRlbXB0IHRvIHJ1biBhbnkgcXVldWVkIHVudGFnZ2VkIHRyYW5zYWN0aW9ucworCSAqIHVudGlsIHdlIGFyZSBkb25lIHdpdGggdGhlIGFib3J0IHByb2Nlc3MuCisJICovCisJYWhjX2ZyZWV6ZV91bnRhZ2dlZF9xdWV1ZXMoYWhjKTsKKworCS8qIHJlc3RvcmUgdGhpcyB3aGVuIHdlJ3JlIGRvbmUgKi8KKwlhY3RpdmVfc2NiID0gYWhjX2luYihhaGMsIFNDQlBUUik7CisKKwlmb3VuZCA9IGFoY19zZWFyY2hfcWluZmlmbyhhaGMsIHRhcmdldCwgY2hhbm5lbCwgbHVuLCBTQ0JfTElTVF9OVUxMLAorCQkJCSAgIHJvbGUsIENBTV9SRVFVRVVFX1JFUSwgU0VBUkNIX0NPTVBMRVRFKTsKKworCS8qCisJICogQ2xlYW4gb3V0IHRoZSBidXN5IHRhcmdldCB0YWJsZSBmb3IgYW55IHVudGFnZ2VkIGNvbW1hbmRzLgorCSAqLworCWkgPSAwOworCW1heHRhcmdldCA9IDE2OworCWlmICh0YXJnZXQgIT0gQ0FNX1RBUkdFVF9XSUxEQ0FSRCkgeworCQlpID0gdGFyZ2V0OworCQlpZiAoY2hhbm5lbCA9PSAnQicpCisJCQlpICs9IDg7CisJCW1heHRhcmdldCA9IGkgKyAxOworCX0KKworCWlmIChsdW4gPT0gQ0FNX0xVTl9XSUxEQ0FSRCkgeworCisJCS8qCisJCSAqIFVubGVzcyB3ZSBhcmUgdXNpbmcgYW4gU0NCIGJhc2VkCisJCSAqIGJ1c3kgdGFyZ2V0cyB0YWJsZSwgdGhlcmUgaXMgb25seQorCQkgKiBvbmUgdGFibGUgZW50cnkgZm9yIGFsbCBsdW5zIG9mCisJCSAqIGEgdGFyZ2V0LgorCQkgKi8KKwkJbWlubHVuID0gMDsKKwkJbWF4bHVuID0gMTsKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1NDQl9CVFQpICE9IDApCisJCQltYXhsdW4gPSBBSENfTlVNX0xVTlM7CisJfSBlbHNlIHsKKwkJbWlubHVuID0gbHVuOworCQltYXhsdW4gPSBsdW4gKyAxOworCX0KKworCWlmIChyb2xlICE9IFJPTEVfVEFSR0VUKSB7CisJCWZvciAoO2kgPCBtYXh0YXJnZXQ7IGkrKykgeworCQkJZm9yIChqID0gbWlubHVuO2ogPCBtYXhsdW47IGorKykgeworCQkJCXVfaW50IHNjYmlkOworCQkJCXVfaW50IHRjbDsKKworCQkJCXRjbCA9IEJVSUxEX1RDTChpIDw8IDQsIGopOworCQkJCXNjYmlkID0gYWhjX2luZGV4X2J1c3lfdGNsKGFoYywgdGNsKTsKKwkJCQlzY2JwID0gYWhjX2xvb2t1cF9zY2IoYWhjLCBzY2JpZCk7CisJCQkJaWYgKHNjYnAgPT0gTlVMTAorCQkJCSB8fCBhaGNfbWF0Y2hfc2NiKGFoYywgc2NicCwgdGFyZ2V0LCBjaGFubmVsLAorCQkJCQkJICBsdW4sIHRhZywgcm9sZSkgPT0gMCkKKwkJCQkJY29udGludWU7CisJCQkJYWhjX3VuYnVzeV90Y2woYWhjLCBCVUlMRF9UQ0woaSA8PCA0LCBqKSk7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBHbyB0aHJvdWdoIHRoZSBkaXNjb25uZWN0ZWQgbGlzdCBhbmQgcmVtb3ZlIGFueSBlbnRyaWVzIHdlCisJCSAqIGhhdmUgcXVldWVkIGZvciBjb21wbGV0aW9uLCAwJ2luZyB0aGVpciBjb250cm9sIGJ5dGUgdG9vLgorCQkgKiBXZSBzYXZlIHRoZSBhY3RpdmUgU0NCIGFuZCByZXN0b3JlIGl0IG91cnNlbHZlcywgc28gdGhlcmUKKwkJICogaXMgbm8gcmVhc29uIGZvciB0aGlzIHNlYXJjaCB0byByZXN0b3JlIGl0IHRvby4KKwkJICovCisJCWFoY19zZWFyY2hfZGlzY19saXN0KGFoYywgdGFyZ2V0LCBjaGFubmVsLCBsdW4sIHRhZywKKwkJCQkgICAgIC8qc3RvcF9vbl9maXJzdCovRkFMU0UsIC8qcmVtb3ZlKi9UUlVFLAorCQkJCSAgICAgLypzYXZlX3N0YXRlKi9GQUxTRSk7CisJfQorCisJLyoKKwkgKiBHbyB0aHJvdWdoIHRoZSBoYXJkd2FyZSBTQ0IgYXJyYXkgbG9va2luZyBmb3IgY29tbWFuZHMgdGhhdAorCSAqIHdlcmUgYWN0aXZlIGJ1dCBub3Qgb24gYW55IGxpc3QuICBJbiBzb21lIGNhc2VzLCB0aGVzZSByZW1uYW50cworCSAqIG1pZ2h0IG5vdCBzdGlsbCBoYXZlIG1hcHBpbmdzIGluIHRoZSBzY2JpbmRleCBhcnJheSAoZS5nLiB1bmV4cGVjdGVkCisJICogYnVzIGZyZWUgd2l0aCB0aGUgc2FtZSBzY2IgcXVldWVkIGZvciBhbiBhYm9ydCkuICBEb24ndCBob2xkIHRoaXMKKwkgKiBhZ2FpbnN0IHRoZW0uCisJICovCisJZm9yIChpID0gMDsgaSA8IGFoYy0+c2NiX2RhdGEtPm1heGhzY2JzOyBpKyspIHsKKwkJdV9pbnQgc2NiaWQ7CisKKwkJYWhjX291dGIoYWhjLCBTQ0JQVFIsIGkpOworCQlzY2JpZCA9IGFoY19pbmIoYWhjLCBTQ0JfVEFHKTsKKwkJc2NicCA9IGFoY19sb29rdXBfc2NiKGFoYywgc2NiaWQpOworCQlpZiAoKHNjYnAgPT0gTlVMTCAmJiBzY2JpZCAhPSBTQ0JfTElTVF9OVUxMKQorCQkgfHwgKHNjYnAgIT0gTlVMTAorCQkgICYmIGFoY19tYXRjaF9zY2IoYWhjLCBzY2JwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgdGFnLCByb2xlKSkpCisJCQlhaGNfYWRkX2N1cnNjYl90b19mcmVlX2xpc3QoYWhjKTsKKwl9CisKKwkvKgorCSAqIEdvIHRocm91Z2ggdGhlIHBlbmRpbmcgQ0NCIGxpc3QgYW5kIGxvb2sgZm9yCisJICogY29tbWFuZHMgZm9yIHRoaXMgdGFyZ2V0IHRoYXQgYXJlIHN0aWxsIGFjdGl2ZS4KKwkgKiBUaGVzZSBhcmUgb3RoZXIgdGFnZ2VkIGNvbW1hbmRzIHRoYXQgd2VyZQorCSAqIGRpc2Nvbm5lY3RlZCB3aGVuIHRoZSByZXNldCBvY2N1cnJlZC4KKwkgKi8KKwlzY2JwX25leHQgPSBMSVNUX0ZJUlNUKCZhaGMtPnBlbmRpbmdfc2Nicyk7CisJd2hpbGUgKHNjYnBfbmV4dCAhPSBOVUxMKSB7CisJCXNjYnAgPSBzY2JwX25leHQ7CisJCXNjYnBfbmV4dCA9IExJU1RfTkVYVChzY2JwLCBwZW5kaW5nX2xpbmtzKTsKKwkJaWYgKGFoY19tYXRjaF9zY2IoYWhjLCBzY2JwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgdGFnLCByb2xlKSkgeworCQkJY2FtX3N0YXR1cyBvc3RhdDsKKworCQkJb3N0YXQgPSBhaGNfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2JwKTsKKwkJCWlmIChvc3RhdCA9PSBDQU1fUkVRX0lOUFJPRykKKwkJCQlhaGNfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2JwLCBzdGF0dXMpOworCQkJaWYgKGFoY19nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYnApICE9IENBTV9SRVFfQ01QKQorCQkJCWFoY19mcmVlemVfc2NiKHNjYnApOworCQkJaWYgKChzY2JwLT5mbGFncyAmIFNDQl9BQ1RJVkUpID09IDApCisJCQkJcHJpbnRmKCJJbmFjdGl2ZSBTQ0Igb24gcGVuZGluZyBsaXN0XG4iKTsKKwkJCWFoY19kb25lKGFoYywgc2NicCk7CisJCQlmb3VuZCsrOworCQl9CisJfQorCWFoY19vdXRiKGFoYywgU0NCUFRSLCBhY3RpdmVfc2NiKTsKKwlhaGNfcGxhdGZvcm1fYWJvcnRfc2NicyhhaGMsIHRhcmdldCwgY2hhbm5lbCwgbHVuLCB0YWcsIHJvbGUsIHN0YXR1cyk7CisJYWhjX3JlbGVhc2VfdW50YWdnZWRfcXVldWVzKGFoYyk7CisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgdm9pZAorYWhjX3Jlc2V0X2N1cnJlbnRfYnVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwl1aW50OF90IHNjc2lzZXE7CisKKwlhaGNfb3V0YihhaGMsIFNJTU9ERTEsIGFoY19pbmIoYWhjLCBTSU1PREUxKSAmIH5FTlNDU0lSU1QpOworCXNjc2lzZXEgPSBhaGNfaW5iKGFoYywgU0NTSVNFUSk7CisJYWhjX291dGIoYWhjLCBTQ1NJU0VRLCBzY3Npc2VxIHwgU0NTSVJTVE8pOworCWFoY19mbHVzaF9kZXZpY2Vfd3JpdGVzKGFoYyk7CisJYWhjX2RlbGF5KEFIQ19CVVNSRVNFVF9ERUxBWSk7CisJLyogVHVybiBvZmYgdGhlIGJ1cyByZXNldCAqLworCWFoY19vdXRiKGFoYywgU0NTSVNFUSwgc2NzaXNlcSAmIH5TQ1NJUlNUTyk7CisKKwlhaGNfY2xlYXJfaW50c3RhdChhaGMpOworCisJLyogUmUtZW5hYmxlIHJlc2V0IGludGVycnVwdHMgKi8KKwlhaGNfb3V0YihhaGMsIFNJTU9ERTEsIGFoY19pbmIoYWhjLCBTSU1PREUxKSB8IEVOU0NTSVJTVCk7Cit9CisKK2ludAorYWhjX3Jlc2V0X2NoYW5uZWwoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBjaGFyIGNoYW5uZWwsIGludCBpbml0aWF0ZV9yZXNldCkKK3sKKwlzdHJ1Y3QJYWhjX2RldmluZm8gZGV2aW5mbzsKKwl1X2ludAlpbml0aWF0b3IsIHRhcmdldCwgbWF4X3Njc2lpZDsKKwl1X2ludAlzYmxrY3RsOworCXVfaW50CXNjc2lzZXE7CisJdV9pbnQJc2ltb2RlMTsKKwlpbnQJZm91bmQ7CisJaW50CXJlc3RhcnRfbmVlZGVkOworCWNoYXIJY3VyX2NoYW5uZWw7CisKKwlhaGMtPnBlbmRpbmdfZGV2aWNlID0gTlVMTDsKKworCWFoY19jb21waWxlX2RldmluZm8oJmRldmluZm8sCisJCQkgICAgQ0FNX1RBUkdFVF9XSUxEQ0FSRCwKKwkJCSAgICBDQU1fVEFSR0VUX1dJTERDQVJELAorCQkJICAgIENBTV9MVU5fV0lMRENBUkQsCisJCQkgICAgY2hhbm5lbCwgUk9MRV9VTktOT1dOKTsKKwlhaGNfcGF1c2UoYWhjKTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgc2VxdWVuY2VyIGlzIGluIGEgc2FmZSBsb2NhdGlvbi4gKi8KKwlhaGNfY2xlYXJfY3JpdGljYWxfc2VjdGlvbihhaGMpOworCisJLyoKKwkgKiBSdW4gb3VyIGNvbW1hbmQgY29tcGxldGUgZmlmb3MgdG8gZW5zdXJlIHRoYXQgd2UgcGVyZm9ybQorCSAqIGNvbXBsZXRpb24gcHJvY2Vzc2luZyBvbiBhbnkgY29tbWFuZHMgdGhhdCAnY29tcGxldGVkJworCSAqIGJlZm9yZSB0aGUgcmVzZXQgb2NjdXJyZWQuCisJICovCisJYWhjX3J1bl9xb3V0ZmlmbyhhaGMpOworI2lmZGVmIEFIQ19UQVJHRVRfTU9ERQorCS8qCisJICogWFhYIC0gSW4gVHdpbiBtb2RlLCB0aGUgdHFpbmZpZm8gbWF5IGhhdmUgY29tbWFuZHMKKwkgKgkgZm9yIGFuIHVuYWZmZWN0ZWQgY2hhbm5lbCBpbiBpdC4gIEhvd2V2ZXIsIGlmCisJICoJIHdlIGhhdmUgcnVuIG91dCBvZiBBVElPIHJlc291cmNlcyB0byBkcmFpbiB0aGF0CisJICoJIHF1ZXVlLCB3ZSBtYXkgbm90IGdldCB0aGVtIGFsbCBvdXQgaGVyZS4gIEZ1cnRoZXIsCisJICoJIHRoZSBibG9ja2VkIHRyYW5zYWN0aW9ucyBmb3IgdGhlIHJlc2V0IGNoYW5uZWwKKwkgKgkgc2hvdWxkIGp1c3QgYmUga2lsbGVkIG9mZiwgaXJyZXNwZWNpdHZlIG9mIHdoZXRoZXIKKwkgKgkgd2UgYXJlIGJsb2NrZWQgb24gQVRJTyByZXNvdXJjZXMuICBXcml0ZSBhIHJvdXRpbmUKKwkgKgkgdG8gY29tcGFjdCB0aGUgdHFpbmZpZm8gYXBwcm9wcmlhdGVseS4KKwkgKi8KKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfVEFSR0VUUk9MRSkgIT0gMCkgeworCQlhaGNfcnVuX3RxaW5maWZvKGFoYywgLypwYXVzZWQqL1RSVUUpOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiBSZXNldCB0aGUgYnVzIGlmIHdlIGFyZSBpbml0aWF0aW5nIHRoaXMgcmVzZXQKKwkgKi8KKwlzYmxrY3RsID0gYWhjX2luYihhaGMsIFNCTEtDVEwpOworCWN1cl9jaGFubmVsID0gJ0EnOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSAhPSAwCisJICYmICgoc2Jsa2N0bCAmIFNFTEJVU0IpICE9IDApKQorCSAgICBjdXJfY2hhbm5lbCA9ICdCJzsKKwlzY3Npc2VxID0gYWhjX2luYihhaGMsIFNDU0lTRVFfVEVNUExBVEUpOworCWlmIChjdXJfY2hhbm5lbCAhPSBjaGFubmVsKSB7CisJCS8qIENhc2UgMTogQ29tbWFuZCBmb3IgYW5vdGhlciBidXMgaXMgYWN0aXZlCisJCSAqIFN0ZWFsdGhpbHkgcmVzZXQgdGhlIG90aGVyIGJ1cyB3aXRob3V0CisJCSAqIHVwc2V0dGluZyB0aGUgY3VycmVudCBidXMuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIFNCTEtDVEwsIHNibGtjdGwgXiBTRUxCVVNCKTsKKwkJc2ltb2RlMSA9IGFoY19pbmIoYWhjLCBTSU1PREUxKSAmIH4oRU5CVVNGUkVFfEVOU0NTSVJTVCk7CisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCisJCS8qCisJCSAqIEJ1cyByZXNldHMgY2xlYXIgRU5TRUxJLCBzbyB3ZSBjYW5ub3QKKwkJICogZGVmZXIgcmUtZW5hYmxpbmcgYnVzIHJlc2V0IGludGVycnVwdHMKKwkJICogaWYgd2UgYXJlIGluIHRhcmdldCBtb2RlLgorCQkgKi8KKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1RBUkdFVFJPTEUpICE9IDApCisJCQlzaW1vZGUxIHw9IEVOU0NTSVJTVDsKKyNlbmRpZgorCQlhaGNfb3V0YihhaGMsIFNJTU9ERTEsIHNpbW9kZTEpOworCQlpZiAoaW5pdGlhdGVfcmVzZXQpCisJCQlhaGNfcmVzZXRfY3VycmVudF9idXMoYWhjKTsKKwkJYWhjX2NsZWFyX2ludHN0YXQoYWhjKTsKKwkJYWhjX291dGIoYWhjLCBTQ1NJU0VRLCBzY3Npc2VxICYgKEVOU0VMSXxFTlJTRUxJfEVOQVVUT0FUTlApKTsKKwkJYWhjX291dGIoYWhjLCBTQkxLQ1RMLCBzYmxrY3RsKTsKKwkJcmVzdGFydF9uZWVkZWQgPSBGQUxTRTsKKwl9IGVsc2UgeworCQkvKiBDYXNlIDI6IEEgY29tbWFuZCBmcm9tIHRoaXMgYnVzIGlzIGFjdGl2ZSBvciB3ZSdyZSBpZGxlICovCisJCXNpbW9kZTEgPSBhaGNfaW5iKGFoYywgU0lNT0RFMSkgJiB+KEVOQlVTRlJFRXxFTlNDU0lSU1QpOworI2lmZGVmIEFIQ19UQVJHRVRfTU9ERQorCQkvKgorCQkgKiBCdXMgcmVzZXRzIGNsZWFyIEVOU0VMSSwgc28gd2UgY2Fubm90CisJCSAqIGRlZmVyIHJlLWVuYWJsaW5nIGJ1cyByZXNldCBpbnRlcnJ1cHRzCisJCSAqIGlmIHdlIGFyZSBpbiB0YXJnZXQgbW9kZS4KKwkJICovCisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19UQVJHRVRST0xFKSAhPSAwKQorCQkJc2ltb2RlMSB8PSBFTlNDU0lSU1Q7CisjZW5kaWYKKwkJYWhjX291dGIoYWhjLCBTSU1PREUxLCBzaW1vZGUxKTsKKwkJaWYgKGluaXRpYXRlX3Jlc2V0KQorCQkJYWhjX3Jlc2V0X2N1cnJlbnRfYnVzKGFoYyk7CisJCWFoY19jbGVhcl9pbnRzdGF0KGFoYyk7CisJCWFoY19vdXRiKGFoYywgU0NTSVNFUSwgc2NzaXNlcSAmIChFTlNFTEl8RU5SU0VMSXxFTkFVVE9BVE5QKSk7CisJCXJlc3RhcnRfbmVlZGVkID0gVFJVRTsKKwl9CisKKwkvKgorCSAqIENsZWFuIHVwIGFsbCB0aGUgc3RhdGUgaW5mb3JtYXRpb24gZm9yIHRoZQorCSAqIHBlbmRpbmcgdHJhbnNhY3Rpb25zIG9uIHRoaXMgYnVzLgorCSAqLworCWZvdW5kID0gYWhjX2Fib3J0X3NjYnMoYWhjLCBDQU1fVEFSR0VUX1dJTERDQVJELCBjaGFubmVsLAorCQkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIFNDQl9MSVNUX05VTEwsCisJCQkgICAgICAgUk9MRV9VTktOT1dOLCBDQU1fU0NTSV9CVVNfUkVTRVQpOworCisJbWF4X3Njc2lpZCA9IChhaGMtPmZlYXR1cmVzICYgQUhDX1dJREUpID8gMTUgOiA3OworCisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCisJLyoKKwkgKiBTZW5kIGFuIGltbWVkaWF0ZSBub3RpZnkgY2NiIHRvIGFsbCB0YXJnZXQgbW9yZSBwZXJpcGhlcmFsCisJICogZHJpdmVycyBhZmZlY3RlZCBieSB0aGlzIGFjdGlvbi4KKwkgKi8KKwlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8PSBtYXhfc2NzaWlkOyB0YXJnZXQrKykgeworCQlzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSogdHN0YXRlOworCQl1X2ludCBsdW47CisKKwkJdHN0YXRlID0gYWhjLT5lbmFibGVkX3RhcmdldHNbdGFyZ2V0XTsKKwkJaWYgKHRzdGF0ZSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWZvciAobHVuID0gMDsgbHVuIDwgQUhDX05VTV9MVU5TOyBsdW4rKykgeworCQkJc3RydWN0IGFoY190bW9kZV9sc3RhdGUqIGxzdGF0ZTsKKworCQkJbHN0YXRlID0gdHN0YXRlLT5lbmFibGVkX2x1bnNbbHVuXTsKKwkJCWlmIChsc3RhdGUgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKworCQkJYWhjX3F1ZXVlX2xzdGF0ZV9ldmVudChhaGMsIGxzdGF0ZSwgQ0FNX1RBUkdFVF9XSUxEQ0FSRCwKKwkJCQkJICAgICAgIEVWRU5UX1RZUEVfQlVTX1JFU0VULCAvKmFyZyovMCk7CisJCQlhaGNfc2VuZF9sc3RhdGVfZXZlbnRzKGFoYywgbHN0YXRlKTsKKwkJfQorCX0KKyNlbmRpZgorCS8qIE5vdGlmeSB0aGUgWFBUIHRoYXQgYSBidXMgcmVzZXQgb2NjdXJyZWQgKi8KKwlhaGNfc2VuZF9hc3luYyhhaGMsIGRldmluZm8uY2hhbm5lbCwgQ0FNX1RBUkdFVF9XSUxEQ0FSRCwKKwkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIEFDX0JVU19SRVNFVCwgTlVMTCk7CisKKwkvKgorCSAqIFJldmVydCB0byBhc3luYy9uYXJyb3cgdHJhbnNmZXJzIHVudGlsIHdlIHJlbmVnb3RpYXRlLgorCSAqLworCWZvciAodGFyZ2V0ID0gMDsgdGFyZ2V0IDw9IG1heF9zY3NpaWQ7IHRhcmdldCsrKSB7CisKKwkJaWYgKGFoYy0+ZW5hYmxlZF90YXJnZXRzW3RhcmdldF0gPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGluaXRpYXRvciA9IDA7IGluaXRpYXRvciA8PSBtYXhfc2NzaWlkOyBpbml0aWF0b3IrKykgeworCQkJc3RydWN0IGFoY19kZXZpbmZvIGRldmluZm87CisKKwkJCWFoY19jb21waWxlX2RldmluZm8oJmRldmluZm8sIHRhcmdldCwgaW5pdGlhdG9yLAorCQkJCQkgICAgQ0FNX0xVTl9XSUxEQ0FSRCwKKwkJCQkJICAgIGNoYW5uZWwsIFJPTEVfVU5LTk9XTik7CisJCQlhaGNfc2V0X3dpZHRoKGFoYywgJmRldmluZm8sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisJCQkJICAgICAgQUhDX1RSQU5TX0NVUiwgLypwYXVzZWQqL1RSVUUpOworCQkJYWhjX3NldF9zeW5jcmF0ZShhaGMsICZkZXZpbmZvLCAvKnN5bmNyYXRlKi9OVUxMLAorCQkJCQkgLypwZXJpb2QqLzAsIC8qb2Zmc2V0Ki8wLAorCQkJCQkgLypwcHJfb3B0aW9ucyovMCwgQUhDX1RSQU5TX0NVUiwKKwkJCQkJIC8qcGF1c2VkKi9UUlVFKTsKKwkJfQorCX0KKworCWlmIChyZXN0YXJ0X25lZWRlZCkKKwkJYWhjX3Jlc3RhcnQoYWhjKTsKKwllbHNlCisJCWFoY191bnBhdXNlKGFoYyk7CisJcmV0dXJuIGZvdW5kOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBSZXNpZHVhbCBQcm9jZXNzaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ2FsY3VsYXRlIHRoZSByZXNpZHVhbCBmb3IgYSBqdXN0IGNvbXBsZXRlZCBTQ0IuCisgKi8KK3ZvaWQKK2FoY19jYWxjX3Jlc2lkdWFsKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqc2NiKQoreworCXN0cnVjdCBoYXJkd2FyZV9zY2IgKmhzY2I7CisJc3RydWN0IHN0YXR1c19wa3QgKnNwa3Q7CisJdWludDMyX3Qgc2dwdHI7CisJdWludDMyX3QgcmVzaWRfc2dwdHI7CisJdWludDMyX3QgcmVzaWQ7CisKKwkvKgorCSAqIDUgY2FzZXMuCisJICogMSkgTm8gcmVzaWR1YWwuCisJICogICAgU0dfUkVTSURfVkFMSUQgY2xlYXIgaW4gc2dwdHIuCisJICogMikgVHJhbnNmZXJsZXNzIGNvbW1hbmQKKwkgKiAzKSBOZXZlciBwZXJmb3JtZWQgYW55IHRyYW5zZmVycy4KKwkgKiAgICBzZ3B0ciBoYXMgU0dfRlVMTF9SRVNJRCBzZXQuCisJICogNCkgTm8gcmVzaWR1YWwgYnV0IHRhcmdldCBkaWQgbm90CisJICogICAgc2F2ZSBkYXRhIHBvaW50ZXJzIGFmdGVyIHRoZQorCSAqICAgIGxhc3QgdHJhbnNmZXIsIHNvIHNncHRyIHdhcworCSAqICAgIG5ldmVyIHVwZGF0ZWQuCisJICogNSkgV2UgaGF2ZSBhIHBhcnRpYWwgcmVzaWR1YWwuCisJICogICAgVXNlIHJlc2lkdWFsX3NncHRyIHRvIGRldGVybWluZQorCSAqICAgIHdoZXJlIHdlIGFyZS4KKwkgKi8KKworCWhzY2IgPSBzY2ItPmhzY2I7CisJc2dwdHIgPSBhaGNfbGUzMnRvaChoc2NiLT5zZ3B0cik7CisJaWYgKChzZ3B0ciAmIFNHX1JFU0lEX1ZBTElEKSA9PSAwKQorCQkvKiBDYXNlIDEgKi8KKwkJcmV0dXJuOworCXNncHRyICY9IH5TR19SRVNJRF9WQUxJRDsKKworCWlmICgoc2dwdHIgJiBTR19MSVNUX05VTEwpICE9IDApCisJCS8qIENhc2UgMiAqLworCQlyZXR1cm47CisKKwlzcGt0ID0gJmhzY2ItPnNoYXJlZF9kYXRhLnN0YXR1czsKKwlyZXNpZF9zZ3B0ciA9IGFoY19sZTMydG9oKHNwa3QtPnJlc2lkdWFsX3NnX3B0cik7CisJaWYgKChzZ3B0ciAmIFNHX0ZVTExfUkVTSUQpICE9IDApIHsKKwkJLyogQ2FzZSAzICovCisJCXJlc2lkID0gYWhjX2dldF90cmFuc2Zlcl9sZW5ndGgoc2NiKTsKKwl9IGVsc2UgaWYgKChyZXNpZF9zZ3B0ciAmIFNHX0xJU1RfTlVMTCkgIT0gMCkgeworCQkvKiBDYXNlIDQgKi8KKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoKHJlc2lkX3NncHRyICYgflNHX1BUUl9NQVNLKSAhPSAwKSB7CisJCXBhbmljKCJCb2d1cyByZXNpZCBzZ3B0ciB2YWx1ZSAweCV4XG4iLCByZXNpZF9zZ3B0cik7CisJfSBlbHNlIHsKKwkJc3RydWN0IGFoY19kbWFfc2VnICpzZzsKKworCQkvKgorCQkgKiBSZW1haW5kZXIgb2YgdGhlIFNHIHdoZXJlIHRoZSB0cmFuc2ZlcgorCQkgKiBzdG9wcGVkLiAgCisJCSAqLworCQlyZXNpZCA9IGFoY19sZTMydG9oKHNwa3QtPnJlc2lkdWFsX2RhdGFjbnQpICYgQUhDX1NHX0xFTl9NQVNLOworCQlzZyA9IGFoY19zZ19idXNfdG9fdmlydChzY2IsIHJlc2lkX3NncHRyICYgU0dfUFRSX01BU0spOworCisJCS8qIFRoZSByZXNpZHVhbCBzZ19wdHIgYWx3YXlzIHBvaW50cyB0byB0aGUgbmV4dCBzZyAqLworCQlzZy0tOworCisJCS8qCisJCSAqIEFkZCB1cCB0aGUgY29udGVudHMgb2YgYWxsIHJlc2lkdWFsCisJCSAqIFNHIHNlZ21lbnRzIHRoYXQgYXJlIGFmdGVyIHRoZSBTRyB3aGVyZQorCQkgKiB0aGUgdHJhbnNmZXIgc3RvcHBlZC4KKwkJICovCisJCXdoaWxlICgoYWhjX2xlMzJ0b2goc2ctPmxlbikgJiBBSENfRE1BX0xBU1RfU0VHKSA9PSAwKSB7CisJCQlzZysrOworCQkJcmVzaWQgKz0gYWhjX2xlMzJ0b2goc2ctPmxlbikgJiBBSENfU0dfTEVOX01BU0s7CisJCX0KKwl9CisJaWYgKChzY2ItPmZsYWdzICYgU0NCX1NFTlNFKSA9PSAwKQorCQlhaGNfc2V0X3Jlc2lkdWFsKHNjYiwgcmVzaWQpOworCWVsc2UKKwkJYWhjX3NldF9zZW5zZV9yZXNpZHVhbChzY2IsIHJlc2lkKTsKKworI2lmZGVmIEFIQ19ERUJVRworCWlmICgoYWhjX2RlYnVnICYgQUhDX1NIT1dfTUlTQykgIT0gMCkgeworCQlhaGNfcHJpbnRfcGF0aChhaGMsIHNjYik7CisJCXByaW50ZigiSGFuZGxlZCAlc1Jlc2lkdWFsIG9mICVkIGJ5dGVzXG4iLAorCQkgICAgICAgKHNjYi0+ZmxhZ3MgJiBTQ0JfU0VOU0UpID8gIlNlbnNlICIgOiAiIiwgcmVzaWQpOworCX0KKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBUYXJnZXQgTW9kZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEFIQ19UQVJHRVRfTU9ERQorLyoKKyAqIEFkZCBhIHRhcmdldCBtb2RlIGV2ZW50IHRvIHRoaXMgbHVuJ3MgcXVldWUKKyAqLworc3RhdGljIHZvaWQKK2FoY19xdWV1ZV9sc3RhdGVfZXZlbnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWhjX3Rtb2RlX2xzdGF0ZSAqbHN0YXRlLAorCQkgICAgICAgdV9pbnQgaW5pdGlhdG9yX2lkLCB1X2ludCBldmVudF90eXBlLCB1X2ludCBldmVudF9hcmcpCit7CisJc3RydWN0IGFoY190bW9kZV9ldmVudCAqZXZlbnQ7CisJaW50IHBlbmRpbmc7CisKKwl4cHRfZnJlZXplX2RldnEobHN0YXRlLT5wYXRoLCAvKmNvdW50Ki8xKTsKKwlpZiAobHN0YXRlLT5ldmVudF93X2lkeCA+PSBsc3RhdGUtPmV2ZW50X3JfaWR4KQorCQlwZW5kaW5nID0gbHN0YXRlLT5ldmVudF93X2lkeCAtIGxzdGF0ZS0+ZXZlbnRfcl9pZHg7CisJZWxzZQorCQlwZW5kaW5nID0gQUhDX1RNT0RFX0VWRU5UX0JVRkZFUl9TSVpFICsgMQorCQkJLSAobHN0YXRlLT5ldmVudF9yX2lkeCAtIGxzdGF0ZS0+ZXZlbnRfd19pZHgpOworCisJaWYgKGV2ZW50X3R5cGUgPT0gRVZFTlRfVFlQRV9CVVNfUkVTRVQKKwkgfHwgZXZlbnRfdHlwZSA9PSBNU0dfQlVTX0RFVl9SRVNFVCkgeworCQkvKgorCQkgKiBBbnkgZWFybGllciBldmVudHMgYXJlIGlycmVsZXZhbnQsIHNvIHJlc2V0IG91ciBidWZmZXIuCisJCSAqIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgYWxsb3dpbmcgdXMgdG8gZGVhbCB3aXRoIHJlc2V0CisJCSAqIGZsb29kcyAoYW4gZXh0ZXJuYWwgZGV2aWNlIGhvbGRpbmcgZG93biB0aGUgcmVzZXQgbGluZSkKKwkJICogd2l0aG91dCBsb3NpbmcgdGhlIGV2ZW50IHRoYXQgaXMgcmVhbGx5IGludGVyZXN0aW5nLgorCQkgKi8KKwkJbHN0YXRlLT5ldmVudF9yX2lkeCA9IDA7CisJCWxzdGF0ZS0+ZXZlbnRfd19pZHggPSAwOworCQl4cHRfcmVsZWFzZV9kZXZxKGxzdGF0ZS0+cGF0aCwgcGVuZGluZywgLypydW5xdWV1ZSovRkFMU0UpOworCX0KKworCWlmIChwZW5kaW5nID09IEFIQ19UTU9ERV9FVkVOVF9CVUZGRVJfU0laRSkgeworCQl4cHRfcHJpbnRfcGF0aChsc3RhdGUtPnBhdGgpOworCQlwcmludGYoImltbWVkaWF0ZSBldmVudCAleDoleCBsb3N0XG4iLAorCQkgICAgICAgbHN0YXRlLT5ldmVudF9idWZmZXJbbHN0YXRlLT5ldmVudF9yX2lkeF0uZXZlbnRfdHlwZSwKKwkJICAgICAgIGxzdGF0ZS0+ZXZlbnRfYnVmZmVyW2xzdGF0ZS0+ZXZlbnRfcl9pZHhdLmV2ZW50X2FyZyk7CisJCWxzdGF0ZS0+ZXZlbnRfcl9pZHgrKzsKKwkJaWYgKGxzdGF0ZS0+ZXZlbnRfcl9pZHggPT0gQUhDX1RNT0RFX0VWRU5UX0JVRkZFUl9TSVpFKQorCQkJbHN0YXRlLT5ldmVudF9yX2lkeCA9IDA7CisJCXhwdF9yZWxlYXNlX2RldnEobHN0YXRlLT5wYXRoLCAvKmNvdW50Ki8xLCAvKnJ1bnF1ZXVlKi9GQUxTRSk7CisJfQorCisJZXZlbnQgPSAmbHN0YXRlLT5ldmVudF9idWZmZXJbbHN0YXRlLT5ldmVudF93X2lkeF07CisJZXZlbnQtPmluaXRpYXRvcl9pZCA9IGluaXRpYXRvcl9pZDsKKwlldmVudC0+ZXZlbnRfdHlwZSA9IGV2ZW50X3R5cGU7CisJZXZlbnQtPmV2ZW50X2FyZyA9IGV2ZW50X2FyZzsKKwlsc3RhdGUtPmV2ZW50X3dfaWR4Kys7CisJaWYgKGxzdGF0ZS0+ZXZlbnRfd19pZHggPT0gQUhDX1RNT0RFX0VWRU5UX0JVRkZFUl9TSVpFKQorCQlsc3RhdGUtPmV2ZW50X3dfaWR4ID0gMDsKK30KKworLyoKKyAqIFNlbmQgYW55IHRhcmdldCBtb2RlIGV2ZW50cyBxdWV1ZWQgdXAgd2FpdGluZworICogZm9yIGltbWVkaWF0ZSBub3RpZnkgcmVzb3VyY2VzLgorICovCit2b2lkCithaGNfc2VuZF9sc3RhdGVfZXZlbnRzKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY190bW9kZV9sc3RhdGUgKmxzdGF0ZSkKK3sKKwlzdHJ1Y3QgY2NiX2hkciAqY2NiaDsKKwlzdHJ1Y3QgY2NiX2ltbWVkX25vdGlmeSAqaW5vdDsKKworCXdoaWxlIChsc3RhdGUtPmV2ZW50X3JfaWR4ICE9IGxzdGF0ZS0+ZXZlbnRfd19pZHgKKwkgICAgJiYgKGNjYmggPSBTTElTVF9GSVJTVCgmbHN0YXRlLT5pbW1lZF9ub3RpZmllcykpICE9IE5VTEwpIHsKKwkJc3RydWN0IGFoY190bW9kZV9ldmVudCAqZXZlbnQ7CisKKwkJZXZlbnQgPSAmbHN0YXRlLT5ldmVudF9idWZmZXJbbHN0YXRlLT5ldmVudF9yX2lkeF07CisJCVNMSVNUX1JFTU9WRV9IRUFEKCZsc3RhdGUtPmltbWVkX25vdGlmaWVzLCBzaW1fbGlua3Muc2xlKTsKKwkJaW5vdCA9IChzdHJ1Y3QgY2NiX2ltbWVkX25vdGlmeSAqKWNjYmg7CisJCXN3aXRjaCAoZXZlbnQtPmV2ZW50X3R5cGUpIHsKKwkJY2FzZSBFVkVOVF9UWVBFX0JVU19SRVNFVDoKKwkJCWNjYmgtPnN0YXR1cyA9IENBTV9TQ1NJX0JVU19SRVNFVHxDQU1fREVWX1FGUlpOOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljY2JoLT5zdGF0dXMgPSBDQU1fTUVTU0FHRV9SRUNWfENBTV9ERVZfUUZSWk47CisJCQlpbm90LT5tZXNzYWdlX2FyZ3NbMF0gPSBldmVudC0+ZXZlbnRfdHlwZTsKKwkJCWlub3QtPm1lc3NhZ2VfYXJnc1sxXSA9IGV2ZW50LT5ldmVudF9hcmc7CisJCQlicmVhazsKKwkJfQorCQlpbm90LT5pbml0aWF0b3JfaWQgPSBldmVudC0+aW5pdGlhdG9yX2lkOworCQlpbm90LT5zZW5zZV9sZW4gPSAwOworCQl4cHRfZG9uZSgodW5pb24gY2NiICopaW5vdCk7CisJCWxzdGF0ZS0+ZXZlbnRfcl9pZHgrKzsKKwkJaWYgKGxzdGF0ZS0+ZXZlbnRfcl9pZHggPT0gQUhDX1RNT0RFX0VWRU5UX0JVRkZFUl9TSVpFKQorCQkJbHN0YXRlLT5ldmVudF9yX2lkeCA9IDA7CisJfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKiBTZXF1ZW5jZXIgUHJvZ3JhbSBQYXRjaGluZy9Eb3dubG9hZCAqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBBSENfRFVNUF9TRVEKK3ZvaWQKK2FoY19kdW1wc2VxKHN0cnVjdCBhaGNfc29mdGMqIGFoYykKK3sKKwlpbnQgaTsKKworCWFoY19vdXRiKGFoYywgU0VRQ1RMLCBQRVJST1JESVN8RkFJTERJU3xGQVNUTU9ERXxMT0FEUkFNKTsKKwlhaGNfb3V0YihhaGMsIFNFUUFERFIwLCAwKTsKKwlhaGNfb3V0YihhaGMsIFNFUUFERFIxLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWhjLT5pbnN0cnVjdGlvbl9yYW1fc2l6ZTsgaSsrKSB7CisJCXVpbnQ4X3QgaW5zX2J5dGVzWzRdOworCisJCWFoY19pbnNiKGFoYywgU0VRUkFNLCBpbnNfYnl0ZXMsIDQpOworCQlwcmludGYoIjB4JTA4eFxuIiwgaW5zX2J5dGVzWzBdIDw8IDI0CisJCQkJIHwgaW5zX2J5dGVzWzFdIDw8IDE2CisJCQkJIHwgaW5zX2J5dGVzWzJdIDw8IDgKKwkJCQkgfCBpbnNfYnl0ZXNbM10pOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50CithaGNfbG9hZHNlcShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJc3RydWN0CWNzIGNzX3RhYmxlW251bV9jcml0aWNhbF9zZWN0aW9uc107CisJdV9pbnQJYmVnaW5fc2V0W251bV9jcml0aWNhbF9zZWN0aW9uc107CisJdV9pbnQJZW5kX3NldFtudW1fY3JpdGljYWxfc2VjdGlvbnNdOworCXN0cnVjdAlwYXRjaCAqY3VyX3BhdGNoOworCXVfaW50CWNzX2NvdW50OworCXVfaW50CWN1cl9jczsKKwl1X2ludAlpOworCXVfaW50CXNraXBfYWRkcjsKKwl1X2ludAlzZ19wcmVmZXRjaF9jbnQ7CisJaW50CWRvd25sb2FkZWQ7CisJdWludDhfdAlkb3dubG9hZF9jb25zdHNbN107CisKKwkvKgorCSAqIFN0YXJ0IG91dCB3aXRoIDAgY3JpdGljYWwgc2VjdGlvbnMKKwkgKiB0aGF0IGFwcGx5IHRvIHRoaXMgZmlybXdhcmUgbG9hZC4KKwkgKi8KKwljc19jb3VudCA9IDA7CisJY3VyX2NzID0gMDsKKwltZW1zZXQoYmVnaW5fc2V0LCAwLCBzaXplb2YoYmVnaW5fc2V0KSk7CisJbWVtc2V0KGVuZF9zZXQsIDAsIHNpemVvZihlbmRfc2V0KSk7CisKKwkvKiBTZXR1cCBkb3dubG9hZGFibGUgY29uc3RhbnQgdGFibGUgKi8KKwlkb3dubG9hZF9jb25zdHNbUU9VVEZJRk9fT0ZGU0VUXSA9IDA7CisJaWYgKGFoYy0+dGFyZ2V0Y21kcyAhPSBOVUxMKQorCQlkb3dubG9hZF9jb25zdHNbUU9VVEZJRk9fT0ZGU0VUXSArPSAzMjsKKwlkb3dubG9hZF9jb25zdHNbUUlORklGT19PRkZTRVRdID0gZG93bmxvYWRfY29uc3RzW1FPVVRGSUZPX09GRlNFVF0gKyAxOworCWRvd25sb2FkX2NvbnN0c1tDQUNIRVNJWkVfTUFTS10gPSBhaGMtPnBjaV9jYWNoZXNpemUgLSAxOworCWRvd25sb2FkX2NvbnN0c1tJTlZFUlRFRF9DQUNIRVNJWkVfTUFTS10gPSB+KGFoYy0+cGNpX2NhY2hlc2l6ZSAtIDEpOworCXNnX3ByZWZldGNoX2NudCA9IGFoYy0+cGNpX2NhY2hlc2l6ZTsKKwlpZiAoc2dfcHJlZmV0Y2hfY250IDwgKDIgKiBzaXplb2Yoc3RydWN0IGFoY19kbWFfc2VnKSkpCisJCXNnX3ByZWZldGNoX2NudCA9IDIgKiBzaXplb2Yoc3RydWN0IGFoY19kbWFfc2VnKTsKKwlkb3dubG9hZF9jb25zdHNbU0dfUFJFRkVUQ0hfQ05UXSA9IHNnX3ByZWZldGNoX2NudDsKKwlkb3dubG9hZF9jb25zdHNbU0dfUFJFRkVUQ0hfQUxJR05fTUFTS10gPSB+KHNnX3ByZWZldGNoX2NudCAtIDEpOworCWRvd25sb2FkX2NvbnN0c1tTR19QUkVGRVRDSF9BRERSX01BU0tdID0gKHNnX3ByZWZldGNoX2NudCAtIDEpOworCisJY3VyX3BhdGNoID0gcGF0Y2hlczsKKwlkb3dubG9hZGVkID0gMDsKKwlza2lwX2FkZHIgPSAwOworCWFoY19vdXRiKGFoYywgU0VRQ1RMLCBQRVJST1JESVN8RkFJTERJU3xGQVNUTU9ERXxMT0FEUkFNKTsKKwlhaGNfb3V0YihhaGMsIFNFUUFERFIwLCAwKTsKKwlhaGNfb3V0YihhaGMsIFNFUUFERFIxLCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc2VxcHJvZykvNDsgaSsrKSB7CisJCWlmIChhaGNfY2hlY2tfcGF0Y2goYWhjLCAmY3VyX3BhdGNoLCBpLCAmc2tpcF9hZGRyKSA9PSAwKSB7CisJCQkvKgorCQkJICogRG9uJ3QgZG93bmxvYWQgdGhpcyBpbnN0cnVjdGlvbiBhcyBpdAorCQkJICogaXMgaW4gYSBwYXRjaCB0aGF0IHdhcyByZW1vdmVkLgorCQkJICovCisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChkb3dubG9hZGVkID09IGFoYy0+aW5zdHJ1Y3Rpb25fcmFtX3NpemUpIHsKKwkJCS8qCisJCQkgKiBXZSdyZSBhYm91dCB0byBleGNlZWQgdGhlIGluc3RydWN0aW9uCisJCQkgKiBzdG9yYWdlIGNhcGFjaXR5IGZvciB0aGlzIGNoaXAuICBGYWlsCisJCQkgKiB0aGUgbG9hZC4KKwkJCSAqLworCQkJcHJpbnRmKCJcbiVzOiBQcm9ncmFtIHRvbyBsYXJnZSBmb3IgaW5zdHJ1Y3Rpb24gbWVtb3J5ICIKKwkJCSAgICAgICAic2l6ZSBvZiAlZCFcbiIsIGFoY19uYW1lKGFoYyksCisJCQkgICAgICAgYWhjLT5pbnN0cnVjdGlvbl9yYW1fc2l6ZSk7CisJCQlyZXR1cm4gKEVOT01FTSk7CisJCX0KKworCQkvKgorCQkgKiBNb3ZlIHRocm91Z2ggdGhlIENTIHRhYmxlIHVudGlsIHdlIGZpbmQgYSBDUworCQkgKiB0aGF0IG1pZ2h0IGFwcGx5IHRvIHRoaXMgaW5zdHJ1Y3Rpb24uCisJCSAqLworCQlmb3IgKDsgY3VyX2NzIDwgbnVtX2NyaXRpY2FsX3NlY3Rpb25zOyBjdXJfY3MrKykgeworCQkJaWYgKGNyaXRpY2FsX3NlY3Rpb25zW2N1cl9jc10uZW5kIDw9IGkpIHsKKwkJCQlpZiAoYmVnaW5fc2V0W2NzX2NvdW50XSA9PSBUUlVFCisJCQkJICYmIGVuZF9zZXRbY3NfY291bnRdID09IEZBTFNFKSB7CisJCQkJCWNzX3RhYmxlW2NzX2NvdW50XS5lbmQgPSBkb3dubG9hZGVkOworCQkJCSAJZW5kX3NldFtjc19jb3VudF0gPSBUUlVFOworCQkJCQljc19jb3VudCsrOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChjcml0aWNhbF9zZWN0aW9uc1tjdXJfY3NdLmJlZ2luIDw9IGkKKwkJCSAmJiBiZWdpbl9zZXRbY3NfY291bnRdID09IEZBTFNFKSB7CisJCQkJY3NfdGFibGVbY3NfY291bnRdLmJlZ2luID0gZG93bmxvYWRlZDsKKwkJCQliZWdpbl9zZXRbY3NfY291bnRdID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWFoY19kb3dubG9hZF9pbnN0cihhaGMsIGksIGRvd25sb2FkX2NvbnN0cyk7CisJCWRvd25sb2FkZWQrKzsKKwl9CisKKwlhaGMtPm51bV9jcml0aWNhbF9zZWN0aW9ucyA9IGNzX2NvdW50OworCWlmIChjc19jb3VudCAhPSAwKSB7CisKKwkJY3NfY291bnQgKj0gc2l6ZW9mKHN0cnVjdCBjcyk7CisJCWFoYy0+Y3JpdGljYWxfc2VjdGlvbnMgPSBtYWxsb2MoY3NfY291bnQsIE1fREVWQlVGLCBNX05PV0FJVCk7CisJCWlmIChhaGMtPmNyaXRpY2FsX3NlY3Rpb25zID09IE5VTEwpCisJCQlwYW5pYygiYWhjX2xvYWRzZXE6IENvdWxkIG5vdCBtYWxsb2MiKTsKKwkJbWVtY3B5KGFoYy0+Y3JpdGljYWxfc2VjdGlvbnMsIGNzX3RhYmxlLCBjc19jb3VudCk7CisJfQorCWFoY19vdXRiKGFoYywgU0VRQ1RMLCBQRVJST1JESVN8RkFJTERJU3xGQVNUTU9ERSk7CisKKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCIgJWQgaW5zdHJ1Y3Rpb25zIGRvd25sb2FkZWRcbiIsIGRvd25sb2FkZWQpOworCQlwcmludGYoIiVzOiBGZWF0dXJlcyAweCV4LCBCdWdzIDB4JXgsIEZsYWdzIDB4JXhcbiIsCisJCSAgICAgICBhaGNfbmFtZShhaGMpLCBhaGMtPmZlYXR1cmVzLCBhaGMtPmJ1Z3MsIGFoYy0+ZmxhZ3MpOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CithaGNfY2hlY2tfcGF0Y2goc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgcGF0Y2ggKipzdGFydF9wYXRjaCwKKwkJdV9pbnQgc3RhcnRfaW5zdHIsIHVfaW50ICpza2lwX2FkZHIpCit7CisJc3RydWN0CXBhdGNoICpjdXJfcGF0Y2g7CisJc3RydWN0CXBhdGNoICpsYXN0X3BhdGNoOworCXVfaW50CW51bV9wYXRjaGVzOworCisJbnVtX3BhdGNoZXMgPSBzaXplb2YocGF0Y2hlcykvc2l6ZW9mKHN0cnVjdCBwYXRjaCk7CisJbGFzdF9wYXRjaCA9ICZwYXRjaGVzW251bV9wYXRjaGVzXTsKKwljdXJfcGF0Y2ggPSAqc3RhcnRfcGF0Y2g7CisKKwl3aGlsZSAoY3VyX3BhdGNoIDwgbGFzdF9wYXRjaCAmJiBzdGFydF9pbnN0ciA9PSBjdXJfcGF0Y2gtPmJlZ2luKSB7CisKKwkJaWYgKGN1cl9wYXRjaC0+cGF0Y2hfZnVuYyhhaGMpID09IDApIHsKKworCQkJLyogU3RhcnQgcmVqZWN0aW5nIGNvZGUgKi8KKwkJCSpza2lwX2FkZHIgPSBzdGFydF9pbnN0ciArIGN1cl9wYXRjaC0+c2tpcF9pbnN0cjsKKwkJCWN1cl9wYXRjaCArPSBjdXJfcGF0Y2gtPnNraXBfcGF0Y2g7CisJCX0gZWxzZSB7CisJCQkvKiBBY2NlcHRlZCB0aGlzIHBhdGNoLiAgQWR2YW5jZSB0byB0aGUgbmV4dAorCQkJICogb25lIGFuZCB3YWl0IGZvciBvdXIgaW50cnVjdGlvbiBwb2ludGVyIHRvCisJCQkgKiBoaXQgdGhpcyBwb2ludC4KKwkJCSAqLworCQkJY3VyX3BhdGNoKys7CisJCX0KKwl9CisKKwkqc3RhcnRfcGF0Y2ggPSBjdXJfcGF0Y2g7CisJaWYgKHN0YXJ0X2luc3RyIDwgKnNraXBfYWRkcikKKwkJLyogU3RpbGwgc2tpcHBpbmcgKi8KKwkJcmV0dXJuICgwKTsKKworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfZG93bmxvYWRfaW5zdHIoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCBpbnN0cnB0ciwgdWludDhfdCAqZGNvbnN0cykKK3sKKwl1bmlvbglpbnNfZm9ybWF0cyBpbnN0cjsKKwlzdHJ1Y3QJaW5zX2Zvcm1hdDEgKmZtdDFfaW5zOworCXN0cnVjdAlpbnNfZm9ybWF0MyAqZm10M19pbnM7CisJdV9pbnQJb3Bjb2RlOworCisJLyoKKwkgKiBUaGUgZmlybXdhcmUgaXMgYWx3YXlzIGNvbXBpbGVkIGludG8gYSBsaXR0bGUgZW5kaWFuIGZvcm1hdC4KKwkgKi8KKwlpbnN0ci5pbnRlZ2VyID0gYWhjX2xlMzJ0b2goKih1aW50MzJfdCopJnNlcXByb2dbaW5zdHJwdHIgKiA0XSk7CisKKwlmbXQxX2lucyA9ICZpbnN0ci5mb3JtYXQxOworCWZtdDNfaW5zID0gTlVMTDsKKworCS8qIFB1bGwgdGhlIG9wY29kZSAqLworCW9wY29kZSA9IGluc3RyLmZvcm1hdDEub3Bjb2RlOworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBBSUNfT1BfSk1QOgorCWNhc2UgQUlDX09QX0pDOgorCWNhc2UgQUlDX09QX0pOQzoKKwljYXNlIEFJQ19PUF9DQUxMOgorCWNhc2UgQUlDX09QX0pORToKKwljYXNlIEFJQ19PUF9KTlo6CisJY2FzZSBBSUNfT1BfSkU6CisJY2FzZSBBSUNfT1BfSlo6CisJeworCQlzdHJ1Y3QgcGF0Y2ggKmN1cl9wYXRjaDsKKwkJaW50IGFkZHJlc3Nfb2Zmc2V0OworCQl1X2ludCBhZGRyZXNzOworCQl1X2ludCBza2lwX2FkZHI7CisJCXVfaW50IGk7CisKKwkJZm10M19pbnMgPSAmaW5zdHIuZm9ybWF0MzsKKwkJYWRkcmVzc19vZmZzZXQgPSAwOworCQlhZGRyZXNzID0gZm10M19pbnMtPmFkZHJlc3M7CisJCWN1cl9wYXRjaCA9IHBhdGNoZXM7CisJCXNraXBfYWRkciA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IGFkZHJlc3M7KSB7CisKKwkJCWFoY19jaGVja19wYXRjaChhaGMsICZjdXJfcGF0Y2gsIGksICZza2lwX2FkZHIpOworCisJCQlpZiAoc2tpcF9hZGRyID4gaSkgeworCQkJCWludCBlbmRfYWRkcjsKKworCQkJCWVuZF9hZGRyID0gTUlOKGFkZHJlc3MsIHNraXBfYWRkcik7CisJCQkJYWRkcmVzc19vZmZzZXQgKz0gZW5kX2FkZHIgLSBpOworCQkJCWkgPSBza2lwX2FkZHI7CisJCQl9IGVsc2UgeworCQkJCWkrKzsKKwkJCX0KKwkJfQorCQlhZGRyZXNzIC09IGFkZHJlc3Nfb2Zmc2V0OworCQlmbXQzX2lucy0+YWRkcmVzcyA9IGFkZHJlc3M7CisJCS8qIEZBTExUSFJPVUdIICovCisJfQorCWNhc2UgQUlDX09QX09SOgorCWNhc2UgQUlDX09QX0FORDoKKwljYXNlIEFJQ19PUF9YT1I6CisJY2FzZSBBSUNfT1BfQUREOgorCWNhc2UgQUlDX09QX0FEQzoKKwljYXNlIEFJQ19PUF9CTU9WOgorCQlpZiAoZm10MV9pbnMtPnBhcml0eSAhPSAwKSB7CisJCQlmbXQxX2lucy0+aW1tZWRpYXRlID0gZGNvbnN0c1tmbXQxX2lucy0+aW1tZWRpYXRlXTsKKwkJfQorCQlmbXQxX2lucy0+cGFyaXR5ID0gMDsKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSA9PSAwCisJCSAmJiBvcGNvZGUgPT0gQUlDX09QX0JNT1YpIHsKKwkJCS8qCisJCQkgKiBCbG9jayBtb3ZlIHdhcyBhZGRlZCBhdCB0aGUgc2FtZSB0aW1lCisJCQkgKiBhcyB0aGUgY29tbWFuZCBjaGFubmVsLiAgVmVyaWZ5IHRoYXQKKwkJCSAqIHRoaXMgaXMgb25seSBhIG1vdmUgb2YgYSBzaW5nbGUgZWxlbWVudAorCQkJICogYW5kIGNvbnZlcnQgdGhlIEJNT1YgdG8gYSBNT1YKKwkJCSAqIChBTkQgd2l0aCBhbiBpbW1lZGlhdGUgb2YgRkYpLgorCQkJICovCisJCQlpZiAoZm10MV9pbnMtPmltbWVkaWF0ZSAhPSAxKQorCQkJCXBhbmljKCIlczogQk1PViBub3Qgc3VwcG9ydGVkXG4iLAorCQkJCSAgICAgIGFoY19uYW1lKGFoYykpOworCQkJZm10MV9pbnMtPm9wY29kZSA9IEFJQ19PUF9BTkQ7CisJCQlmbXQxX2lucy0+aW1tZWRpYXRlID0gMHhmZjsKKwkJfQorCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgQUlDX09QX1JPTDoKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQkJaW50IGksIGNvdW50OworCisJCQkvKiBDYWxjdWxhdGUgb2RkIHBhcml0eSBmb3IgdGhlIGluc3RydWN0aW9uICovCisJCQlmb3IgKGkgPSAwLCBjb3VudCA9IDA7IGkgPCAzMTsgaSsrKSB7CisJCQkJdWludDMyX3QgbWFzazsKKworCQkJCW1hc2sgPSAweDAxIDw8IGk7CisJCQkJaWYgKChpbnN0ci5pbnRlZ2VyICYgbWFzaykgIT0gMCkKKwkJCQkJY291bnQrKzsKKwkJCX0KKwkJCWlmICgoY291bnQgJiAweDAxKSA9PSAwKQorCQkJCWluc3RyLmZvcm1hdDEucGFyaXR5ID0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIENvbXByZXNzIHRoZSBpbnN0cnVjdGlvbiBmb3Igb2xkZXIgc2VxdWVuY2VycyAqLworCQkJaWYgKGZtdDNfaW5zICE9IE5VTEwpIHsKKwkJCQlpbnN0ci5pbnRlZ2VyID0KKwkJCQkJZm10M19pbnMtPmltbWVkaWF0ZQorCQkJCSAgICAgIHwgKGZtdDNfaW5zLT5zb3VyY2UgPDwgOCkKKwkJCQkgICAgICB8IChmbXQzX2lucy0+YWRkcmVzcyA8PCAxNikKKwkJCQkgICAgICB8CShmbXQzX2lucy0+b3Bjb2RlIDw8IDI1KTsKKwkJCX0gZWxzZSB7CisJCQkJaW5zdHIuaW50ZWdlciA9CisJCQkJCWZtdDFfaW5zLT5pbW1lZGlhdGUKKwkJCQkgICAgICB8IChmbXQxX2lucy0+c291cmNlIDw8IDgpCisJCQkJICAgICAgfCAoZm10MV9pbnMtPmRlc3RpbmF0aW9uIDw8IDE2KQorCQkJCSAgICAgIHwJKGZtdDFfaW5zLT5yZXQgPDwgMjQpCisJCQkJICAgICAgfAkoZm10MV9pbnMtPm9wY29kZSA8PCAyNSk7CisJCQl9CisJCX0KKwkJLyogVGhlIHNlcXVlbmNlciBpcyBhIGxpdHRsZSBlbmRpYW4gY3B1ICovCisJCWluc3RyLmludGVnZXIgPSBhaGNfaHRvbGUzMihpbnN0ci5pbnRlZ2VyKTsKKwkJYWhjX291dHNiKGFoYywgU0VRUkFNLCBpbnN0ci5ieXRlcywgNCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXBhbmljKCJVbmtub3duIG9wY29kZSBlbmNvdW50ZXJlZCBpbiBzZXEgcHJvZ3JhbSIpOworCQlicmVhazsKKwl9Cit9CisKK2ludAorYWhjX3ByaW50X3JlZ2lzdGVyKGFoY19yZWdfcGFyc2VfZW50cnlfdCAqdGFibGUsIHVfaW50IG51bV9lbnRyaWVzLAorCQkgICBjb25zdCBjaGFyICpuYW1lLCB1X2ludCBhZGRyZXNzLCB1X2ludCB2YWx1ZSwKKwkJICAgdV9pbnQgKmN1cl9jb2x1bW4sIHVfaW50IHdyYXBfcG9pbnQpCit7CisJaW50CXByaW50ZWQ7CisJdV9pbnQJcHJpbnRlZF9tYXNrOworCisJaWYgKGN1cl9jb2x1bW4gIT0gTlVMTCAmJiAqY3VyX2NvbHVtbiA+PSB3cmFwX3BvaW50KSB7CisJCXByaW50ZigiXG4iKTsKKwkJKmN1cl9jb2x1bW4gPSAwOworCX0KKwlwcmludGVkID0gcHJpbnRmKCIlc1sweCV4XSIsIG5hbWUsIHZhbHVlKTsKKwlpZiAodGFibGUgPT0gTlVMTCkgeworCQlwcmludGVkICs9IHByaW50ZigiICIpOworCQkqY3VyX2NvbHVtbiArPSBwcmludGVkOworCQlyZXR1cm4gKHByaW50ZWQpOworCX0KKwlwcmludGVkX21hc2sgPSAwOworCXdoaWxlIChwcmludGVkX21hc2sgIT0gMHhGRikgeworCQlpbnQgZW50cnk7CisKKwkJZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgbnVtX2VudHJpZXM7IGVudHJ5KyspIHsKKwkJCWlmICgoKHZhbHVlICYgdGFibGVbZW50cnldLm1hc2spCisJCQkgICE9IHRhYmxlW2VudHJ5XS52YWx1ZSkKKwkJCSB8fCAoKHByaW50ZWRfbWFzayAmIHRhYmxlW2VudHJ5XS5tYXNrKQorCQkJICA9PSB0YWJsZVtlbnRyeV0ubWFzaykpCisJCQkJY29udGludWU7CisKKwkJCXByaW50ZWQgKz0gcHJpbnRmKCIlcyVzIiwKKwkJCQkJICBwcmludGVkX21hc2sgPT0gMCA/ICI6KCIgOiAifCIsCisJCQkJCSAgdGFibGVbZW50cnldLm5hbWUpOworCQkJcHJpbnRlZF9tYXNrIHw9IHRhYmxlW2VudHJ5XS5tYXNrOworCQkJCisJCQlicmVhazsKKwkJfQorCQlpZiAoZW50cnkgPj0gbnVtX2VudHJpZXMpCisJCQlicmVhazsKKwl9CisJaWYgKHByaW50ZWRfbWFzayAhPSAwKQorCQlwcmludGVkICs9IHByaW50ZigiKSAiKTsKKwllbHNlCisJCXByaW50ZWQgKz0gcHJpbnRmKCIgIik7CisJaWYgKGN1cl9jb2x1bW4gIT0gTlVMTCkKKwkJKmN1cl9jb2x1bW4gKz0gcHJpbnRlZDsKKwlyZXR1cm4gKHByaW50ZWQpOworfQorCit2b2lkCithaGNfZHVtcF9jYXJkX3N0YXRlKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlzdHJ1Y3QJc2NiICpzY2I7CisJc3RydWN0CXNjYl90YWlscSAqdW50YWdnZWRfcTsKKwl1X2ludAljdXJfY29sOworCWludAlwYXVzZWQ7CisJaW50CXRhcmdldDsKKwlpbnQJbWF4dGFyZ2V0OworCWludAlpOworCXVpbnQ4X3QgbGFzdF9waGFzZTsKKwl1aW50OF90IHFpbnBvczsKKwl1aW50OF90IHFpbnRhaWw7CisJdWludDhfdCBxb3V0cG9zOworCXVpbnQ4X3Qgc2NiX2luZGV4OworCXVpbnQ4X3Qgc2F2ZWRfc2NicHRyOworCisJaWYgKGFoY19pc19wYXVzZWQoYWhjKSkgeworCQlwYXVzZWQgPSAxOworCX0gZWxzZSB7CisJCXBhdXNlZCA9IDA7CisJCWFoY19wYXVzZShhaGMpOworCX0KKworCXNhdmVkX3NjYnB0ciA9IGFoY19pbmIoYWhjLCBTQ0JQVFIpOworCWxhc3RfcGhhc2UgPSBhaGNfaW5iKGFoYywgTEFTVFBIQVNFKTsKKwlwcmludGYoIj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiBEdW1wIENhcmQgU3RhdGUgQmVnaW5zIDw8PDw8PDw8PDw8PDw8PDw8XG4iCisJICAgICAgICIlczogRHVtcGluZyBDYXJkIFN0YXRlICVzLCBhdCBTRVFBRERSIDB4JXhcbiIsCisJICAgICAgIGFoY19uYW1lKGFoYyksIGFoY19sb29rdXBfcGhhc2VfZW50cnkobGFzdF9waGFzZSktPnBoYXNlbXNnLAorCSAgICAgICBhaGNfaW5iKGFoYywgU0VRQUREUjApIHwgKGFoY19pbmIoYWhjLCBTRVFBRERSMSkgPDwgOCkpOworCWlmIChwYXVzZWQpCisJCXByaW50ZigiQ2FyZCB3YXMgcGF1c2VkXG4iKTsKKwlwcmludGYoIkFDQ1VNID0gMHgleCwgU0lOREVYID0gMHgleCwgRElOREVYID0gMHgleCwgQVJHXzIgPSAweCV4XG4iLAorCSAgICAgICBhaGNfaW5iKGFoYywgQUNDVU0pLCBhaGNfaW5iKGFoYywgU0lOREVYKSwgYWhjX2luYihhaGMsIERJTkRFWCksCisJICAgICAgIGFoY19pbmIoYWhjLCBBUkdfMikpOworCXByaW50ZigiSENOVCA9IDB4JXggU0NCUFRSID0gMHgleFxuIiwgYWhjX2luYihhaGMsIEhDTlQpLAorCSAgICAgICBhaGNfaW5iKGFoYywgU0NCUFRSKSk7CisJY3VyX2NvbCA9IDA7CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0RUKSAhPSAwKQorCQlhaGNfc2NzaXBoYXNlX3ByaW50KGFoY19pbmIoYWhjLCBTQ1NJUEhBU0UpLCAmY3VyX2NvbCwgNTApOworCWFoY19zY3Npc2lnaV9wcmludChhaGNfaW5iKGFoYywgU0NTSVNJR0kpLCAmY3VyX2NvbCwgNTApOworCWFoY19lcnJvcl9wcmludChhaGNfaW5iKGFoYywgRVJST1IpLCAmY3VyX2NvbCwgNTApOworCWFoY19zY3NpYnVzbF9wcmludChhaGNfaW5iKGFoYywgU0NTSUJVU0wpLCAmY3VyX2NvbCwgNTApOworCWFoY19sYXN0cGhhc2VfcHJpbnQoYWhjX2luYihhaGMsIExBU1RQSEFTRSksICZjdXJfY29sLCA1MCk7CisJYWhjX3Njc2lzZXFfcHJpbnQoYWhjX2luYihhaGMsIFNDU0lTRVEpLCAmY3VyX2NvbCwgNTApOworCWFoY19zYmxrY3RsX3ByaW50KGFoY19pbmIoYWhjLCBTQkxLQ1RMKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGNfc2NzaXJhdGVfcHJpbnQoYWhjX2luYihhaGMsIFNDU0lSQVRFKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGNfc2VxY3RsX3ByaW50KGFoY19pbmIoYWhjLCBTRVFDVEwpLCAmY3VyX2NvbCwgNTApOworCWFoY19zZXFfZmxhZ3NfcHJpbnQoYWhjX2luYihhaGMsIFNFUV9GTEFHUyksICZjdXJfY29sLCA1MCk7CisJYWhjX3NzdGF0MF9wcmludChhaGNfaW5iKGFoYywgU1NUQVQwKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGNfc3N0YXQxX3ByaW50KGFoY19pbmIoYWhjLCBTU1RBVDEpLCAmY3VyX2NvbCwgNTApOworCWFoY19zc3RhdDJfcHJpbnQoYWhjX2luYihhaGMsIFNTVEFUMiksICZjdXJfY29sLCA1MCk7CisJYWhjX3NzdGF0M19wcmludChhaGNfaW5iKGFoYywgU1NUQVQzKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGNfc2ltb2RlMF9wcmludChhaGNfaW5iKGFoYywgU0lNT0RFMCksICZjdXJfY29sLCA1MCk7CisJYWhjX3NpbW9kZTFfcHJpbnQoYWhjX2luYihhaGMsIFNJTU9ERTEpLCAmY3VyX2NvbCwgNTApOworCWFoY19zeGZyY3RsMF9wcmludChhaGNfaW5iKGFoYywgU1hGUkNUTDApLCAmY3VyX2NvbCwgNTApOworCWFoY19kZmNudHJsX3ByaW50KGFoY19pbmIoYWhjLCBERkNOVFJMKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGNfZGZzdGF0dXNfcHJpbnQoYWhjX2luYihhaGMsIERGU1RBVFVTKSwgJmN1cl9jb2wsIDUwKTsKKwlpZiAoY3VyX2NvbCAhPSAwKQorCQlwcmludGYoIlxuIik7CisJcHJpbnRmKCJTVEFDSzoiKTsKKwlmb3IgKGkgPSAwOyBpIDwgU1RBQ0tfU0laRTsgaSsrKQorCSAgICAgICBwcmludGYoIiAweCV4IiwgYWhjX2luYihhaGMsIFNUQUNLKXwoYWhjX2luYihhaGMsIFNUQUNLKSA8PCA4KSk7CisJcHJpbnRmKCJcblNDQiBjb3VudCA9ICVkXG4iLCBhaGMtPnNjYl9kYXRhLT5udW1zY2JzKTsKKwlwcmludGYoIktlcm5lbCBORVhUUVNDQiA9ICVkXG4iLCBhaGMtPm5leHRfcXVldWVkX3NjYi0+aHNjYi0+dGFnKTsKKwlwcmludGYoIkNhcmQgTkVYVFFTQ0IgPSAlZFxuIiwgYWhjX2luYihhaGMsIE5FWFRfUVVFVUVEX1NDQikpOworCS8qIFFJTkZJRk8gKi8KKwlwcmludGYoIlFJTkZJRk8gZW50cmllczogIik7CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpICE9IDApIHsKKwkJcWlucG9zID0gYWhjX2luYihhaGMsIFNOU0NCX1FPRkYpOworCQlhaGNfb3V0YihhaGMsIFNOU0NCX1FPRkYsIHFpbnBvcyk7CisJfSBlbHNlCisJCXFpbnBvcyA9IGFoY19pbmIoYWhjLCBRSU5QT1MpOworCXFpbnRhaWwgPSBhaGMtPnFpbmZpZm9uZXh0OworCXdoaWxlIChxaW5wb3MgIT0gcWludGFpbCkgeworCQlwcmludGYoIiVkICIsIGFoYy0+cWluZmlmb1txaW5wb3NdKTsKKwkJcWlucG9zKys7CisJfQorCXByaW50ZigiXG4iKTsKKworCXByaW50ZigiV2FpdGluZyBRdWV1ZSBlbnRyaWVzOiAiKTsKKwlzY2JfaW5kZXggPSBhaGNfaW5iKGFoYywgV0FJVElOR19TQ0JIKTsKKwlpID0gMDsKKwl3aGlsZSAoc2NiX2luZGV4ICE9IFNDQl9MSVNUX05VTEwgJiYgaSsrIDwgMjU2KSB7CisJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBzY2JfaW5kZXgpOworCQlwcmludGYoIiVkOiVkICIsIHNjYl9pbmRleCwgYWhjX2luYihhaGMsIFNDQl9UQUcpKTsKKwkJc2NiX2luZGV4ID0gYWhjX2luYihhaGMsIFNDQl9ORVhUKTsKKwl9CisJcHJpbnRmKCJcbiIpOworCisJcHJpbnRmKCJEaXNjb25uZWN0ZWQgUXVldWUgZW50cmllczogIik7CisJc2NiX2luZGV4ID0gYWhjX2luYihhaGMsIERJU0NPTk5FQ1RFRF9TQ0JIKTsKKwlpID0gMDsKKwl3aGlsZSAoc2NiX2luZGV4ICE9IFNDQl9MSVNUX05VTEwgJiYgaSsrIDwgMjU2KSB7CisJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBzY2JfaW5kZXgpOworCQlwcmludGYoIiVkOiVkICIsIHNjYl9pbmRleCwgYWhjX2luYihhaGMsIFNDQl9UQUcpKTsKKwkJc2NiX2luZGV4ID0gYWhjX2luYihhaGMsIFNDQl9ORVhUKTsKKwl9CisJcHJpbnRmKCJcbiIpOworCQkKKwlhaGNfc3luY19xb3V0ZmlmbyhhaGMsIEJVU19ETUFTWU5DX1BPU1RSRUFEKTsKKwlwcmludGYoIlFPVVRGSUZPIGVudHJpZXM6ICIpOworCXFvdXRwb3MgPSBhaGMtPnFvdXRmaWZvbmV4dDsKKwlpID0gMDsKKwl3aGlsZSAoYWhjLT5xb3V0Zmlmb1txb3V0cG9zXSAhPSBTQ0JfTElTVF9OVUxMICYmIGkrKyA8IDI1NikgeworCQlwcmludGYoIiVkICIsIGFoYy0+cW91dGZpZm9bcW91dHBvc10pOworCQlxb3V0cG9zKys7CisJfQorCXByaW50ZigiXG4iKTsKKworCXByaW50ZigiU2VxdWVuY2VyIEZyZWUgU0NCIExpc3Q6ICIpOworCXNjYl9pbmRleCA9IGFoY19pbmIoYWhjLCBGUkVFX1NDQkgpOworCWkgPSAwOworCXdoaWxlIChzY2JfaW5kZXggIT0gU0NCX0xJU1RfTlVMTCAmJiBpKysgPCAyNTYpIHsKKwkJYWhjX291dGIoYWhjLCBTQ0JQVFIsIHNjYl9pbmRleCk7CisJCXByaW50ZigiJWQgIiwgc2NiX2luZGV4KTsKKwkJc2NiX2luZGV4ID0gYWhjX2luYihhaGMsIFNDQl9ORVhUKTsKKwl9CisJcHJpbnRmKCJcbiIpOworCisJcHJpbnRmKCJTZXF1ZW5jZXIgU0NCIEluZm86ICIpOworCWZvciAoaSA9IDA7IGkgPCBhaGMtPnNjYl9kYXRhLT5tYXhoc2NiczsgaSsrKSB7CisJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBpKTsKKwkJY3VyX2NvbCA9IHByaW50ZigiXG4lM2QgIiwgaSk7CisKKwkJYWhjX3NjYl9jb250cm9sX3ByaW50KGFoY19pbmIoYWhjLCBTQ0JfQ09OVFJPTCksICZjdXJfY29sLCA2MCk7CisJCWFoY19zY2Jfc2NzaWlkX3ByaW50KGFoY19pbmIoYWhjLCBTQ0JfU0NTSUlEKSwgJmN1cl9jb2wsIDYwKTsKKwkJYWhjX3NjYl9sdW5fcHJpbnQoYWhjX2luYihhaGMsIFNDQl9MVU4pLCAmY3VyX2NvbCwgNjApOworCQlhaGNfc2NiX3RhZ19wcmludChhaGNfaW5iKGFoYywgU0NCX1RBRyksICZjdXJfY29sLCA2MCk7CisJfQorCXByaW50ZigiXG4iKTsKKworCXByaW50ZigiUGVuZGluZyBsaXN0OiAiKTsKKwlpID0gMDsKKwlMSVNUX0ZPUkVBQ0goc2NiLCAmYWhjLT5wZW5kaW5nX3NjYnMsIHBlbmRpbmdfbGlua3MpIHsKKwkJaWYgKGkrKyA+IDI1NikKKwkJCWJyZWFrOworCQljdXJfY29sID0gcHJpbnRmKCJcbiUzZCAiLCBzY2ItPmhzY2ItPnRhZyk7CisJCWFoY19zY2JfY29udHJvbF9wcmludChzY2ItPmhzY2ItPmNvbnRyb2wsICZjdXJfY29sLCA2MCk7CisJCWFoY19zY2Jfc2NzaWlkX3ByaW50KHNjYi0+aHNjYi0+c2NzaWlkLCAmY3VyX2NvbCwgNjApOworCQlhaGNfc2NiX2x1bl9wcmludChzY2ItPmhzY2ItPmx1biwgJmN1cl9jb2wsIDYwKTsKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSA9PSAwKSB7CisJCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgc2NiLT5oc2NiLT50YWcpOworCQkJcHJpbnRmKCIoIik7CisJCQlhaGNfc2NiX2NvbnRyb2xfcHJpbnQoYWhjX2luYihhaGMsIFNDQl9DT05UUk9MKSwKKwkJCQkJICAgICAgJmN1cl9jb2wsIDYwKTsKKwkJCWFoY19zY2JfdGFnX3ByaW50KGFoY19pbmIoYWhjLCBTQ0JfVEFHKSwgJmN1cl9jb2wsIDYwKTsKKwkJCXByaW50ZigiKSIpOworCQl9CisJfQorCXByaW50ZigiXG4iKTsKKworCXByaW50ZigiS2VybmVsIEZyZWUgU0NCIGxpc3Q6ICIpOworCWkgPSAwOworCVNMSVNUX0ZPUkVBQ0goc2NiLCAmYWhjLT5zY2JfZGF0YS0+ZnJlZV9zY2JzLCBsaW5rcy5zbGUpIHsKKwkJaWYgKGkrKyA+IDI1NikKKwkJCWJyZWFrOworCQlwcmludGYoIiVkICIsIHNjYi0+aHNjYi0+dGFnKTsKKwl9CisJcHJpbnRmKCJcbiIpOworCisJbWF4dGFyZ2V0ID0gKGFoYy0+ZmVhdHVyZXMgJiAoQUhDX1dJREV8QUhDX1RXSU4pKSA/IDE1IDogNzsKKwlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8PSBtYXh0YXJnZXQ7IHRhcmdldCsrKSB7CisJCXVudGFnZ2VkX3EgPSAmYWhjLT51bnRhZ2dlZF9xdWV1ZXNbdGFyZ2V0XTsKKwkJaWYgKFRBSUxRX0ZJUlNUKHVudGFnZ2VkX3EpID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJcHJpbnRmKCJVbnRhZ2dlZCBRKCVkKTogIiwgdGFyZ2V0KTsKKwkJaSA9IDA7CisJCVRBSUxRX0ZPUkVBQ0goc2NiLCB1bnRhZ2dlZF9xLCBsaW5rcy50cWUpIHsKKwkJCWlmIChpKysgPiAyNTYpCisJCQkJYnJlYWs7CisJCQlwcmludGYoIiVkICIsIHNjYi0+aHNjYi0+dGFnKTsKKwkJfQorCQlwcmludGYoIlxuIik7CisJfQorCisJYWhjX3BsYXRmb3JtX2R1bXBfY2FyZF9zdGF0ZShhaGMpOworCXByaW50ZigiXG48PDw8PDw8PDw8PDw8PDw8PCBEdW1wIENhcmQgU3RhdGUgRW5kcyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5cbiIpOworCWFoY19vdXRiKGFoYywgU0NCUFRSLCBzYXZlZF9zY2JwdHIpOworCWlmIChwYXVzZWQgPT0gMCkKKwkJYWhjX3VucGF1c2UoYWhjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogVGFyZ2V0IE1vZGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBBSENfVEFSR0VUX01PREUKK2NhbV9zdGF0dXMKK2FoY19maW5kX3Rtb2RlX2RldnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgY2FtX3NpbSAqc2ltLCB1bmlvbiBjY2IgKmNjYiwKKwkJICAgIHN0cnVjdCBhaGNfdG1vZGVfdHN0YXRlICoqdHN0YXRlLAorCQkgICAgc3RydWN0IGFoY190bW9kZV9sc3RhdGUgKipsc3RhdGUsCisJCSAgICBpbnQgbm90Zm91bmRfZmFpbHVyZSkKK3sKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UQVJHRVRNT0RFKSA9PSAwKQorCQlyZXR1cm4gKENBTV9SRVFfSU5WQUxJRCk7CisKKwkvKgorCSAqIEhhbmRsZSB0aGUgJ2JsYWNrIGhvbGUnIGRldmljZSB0aGF0IHN1Y2tzIHVwCisJICogcmVxdWVzdHMgdG8gdW5hdHRhY2hlZCBsdW5zIG9uIGVuYWJsZWQgdGFyZ2V0cy4KKwkgKi8KKwlpZiAoY2NiLT5jY2JfaC50YXJnZXRfaWQgPT0gQ0FNX1RBUkdFVF9XSUxEQ0FSRAorCSAmJiBjY2ItPmNjYl9oLnRhcmdldF9sdW4gPT0gQ0FNX0xVTl9XSUxEQ0FSRCkgeworCQkqdHN0YXRlID0gTlVMTDsKKwkJKmxzdGF0ZSA9IGFoYy0+YmxhY2tfaG9sZTsKKwl9IGVsc2UgeworCQl1X2ludCBtYXhfaWQ7CisKKwkJbWF4X2lkID0gKGFoYy0+ZmVhdHVyZXMgJiBBSENfV0lERSkgPyAxNSA6IDc7CisJCWlmIChjY2ItPmNjYl9oLnRhcmdldF9pZCA+IG1heF9pZCkKKwkJCXJldHVybiAoQ0FNX1RJRF9JTlZBTElEKTsKKworCQlpZiAoY2NiLT5jY2JfaC50YXJnZXRfbHVuID49IEFIQ19OVU1fTFVOUykKKwkJCXJldHVybiAoQ0FNX0xVTl9JTlZBTElEKTsKKworCQkqdHN0YXRlID0gYWhjLT5lbmFibGVkX3RhcmdldHNbY2NiLT5jY2JfaC50YXJnZXRfaWRdOworCQkqbHN0YXRlID0gTlVMTDsKKwkJaWYgKCp0c3RhdGUgIT0gTlVMTCkKKwkJCSpsc3RhdGUgPQorCQkJICAgICgqdHN0YXRlKS0+ZW5hYmxlZF9sdW5zW2NjYi0+Y2NiX2gudGFyZ2V0X2x1bl07CisJfQorCisJaWYgKG5vdGZvdW5kX2ZhaWx1cmUgIT0gMCAmJiAqbHN0YXRlID09IE5VTEwpCisJCXJldHVybiAoQ0FNX1BBVEhfSU5WQUxJRCk7CisKKwlyZXR1cm4gKENBTV9SRVFfQ01QKTsKK30KKwordm9pZAorYWhjX2hhbmRsZV9lbl9sdW4oc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgY2FtX3NpbSAqc2ltLCB1bmlvbiBjY2IgKmNjYikKK3sKKwlzdHJ1Y3QJICAgYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXN0cnVjdAkgICBhaGNfdG1vZGVfbHN0YXRlICpsc3RhdGU7CisJc3RydWN0CSAgIGNjYl9lbl9sdW4gKmNlbDsKKwljYW1fc3RhdHVzIHN0YXR1czsKKwl1X2xvbmcJICAgczsKKwl1X2ludAkgICB0YXJnZXQ7CisJdV9pbnQJICAgbHVuOworCXVfaW50CSAgIHRhcmdldF9tYXNrOworCXVfaW50CSAgIG91cl9pZDsKKwlpbnQJICAgZXJyb3I7CisJY2hhcgkgICBjaGFubmVsOworCisJc3RhdHVzID0gYWhjX2ZpbmRfdG1vZGVfZGV2cyhhaGMsIHNpbSwgY2NiLCAmdHN0YXRlLCAmbHN0YXRlLAorCQkJCSAgICAgLypub3Rmb3VuZF9mYWlsdXJlKi9GQUxTRSk7CisKKwlpZiAoc3RhdHVzICE9IENBTV9SRVFfQ01QKSB7CisJCWNjYi0+Y2NiX2guc3RhdHVzID0gc3RhdHVzOworCQlyZXR1cm47CisJfQorCisJaWYgKGNhbV9zaW1fYnVzKHNpbSkgPT0gMCkKKwkJb3VyX2lkID0gYWhjLT5vdXJfaWQ7CisJZWxzZQorCQlvdXJfaWQgPSBhaGMtPm91cl9pZF9iOworCisJaWYgKGNjYi0+Y2NiX2gudGFyZ2V0X2lkICE9IG91cl9pZCkgeworCQkvKgorCQkgKiBvdXJfaWQgcmVwcmVzZW50cyBvdXIgaW5pdGlhdG9yIElELCBvcgorCQkgKiB0aGUgSUQgb2YgdGhlIGZpcnN0IHRhcmdldCB0byBoYXZlIGFuCisJCSAqIGVuYWJsZWQgbHVuIGluIHRhcmdldCBtb2RlLiAgVGhlcmUgYXJlCisJCSAqIHR3byBjYXNlcyB0aGF0IG1heSBwcmVjbHVkZSBlbmFibGluZyBhCisJCSAqIHRhcmdldCBpZCBvdGhlciB0aGFuIG91cl9pZC4KKwkJICoKKwkJICogICBvIG91cl9pZCBpcyBmb3IgYW4gYWN0aXZlIGluaXRpYXRvciByb2xlLgorCQkgKiAgICAgU2luY2UgdGhlIGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQKKwkJICogICAgIHJlc2VsZWN0aW9ucyB0byB0aGUgaW5pdGlhdG9yIHJvbGUgYXQKKwkJICogICAgIGFueXRoaW5nIG90aGVyIHRoYW4gb3VyX2lkLCBhbmQgb3VyX2lkCisJCSAqICAgICBpcyB1c2VkIGJ5IHRoZSBoYXJkd2FyZSB0byBpbmRpY2F0ZSB0aGUKKwkJICogICAgIElEIHRvIHVzZSBmb3IgYm90aCBzZWxlY3Qtb3V0IGFuZAorCQkgKiAgICAgcmVzZWxlY3Qtb3V0IG9wZXJhdGlvbnMsIHRoZSBvbmx5IHRhcmdldAorCQkgKiAgICAgSUQgd2UgY2FuIHN1cHBvcnQgaW4gdGhpcyBtb2RlIGlzIG91cl9pZC4KKwkJICoKKwkJICogICBvIFRoZSBNVUxUQVJHSUQgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIGFuZAorCQkgKiAgICAgYSBwcmV2aW91cyB0YXJnZXQgbW9kZSBJRCBoYXMgYmVlbiBlbmFibGVkLgorCQkgKi8KKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX01VTFRJUk9MRSkgIT0gMCkgeworCisJCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfTVVMVElfVElEKSAhPSAwCisJCSAgIAkgJiYgKGFoYy0+ZmxhZ3MgJiBBSENfSU5JVElBVE9SUk9MRSkgIT0gMCkgeworCQkJCS8qCisJCQkJICogT25seSBhbGxvdyBhZGRpdGlvbmFsIHRhcmdldHMgaWYKKwkJCQkgKiB0aGUgaW5pdGlhdG9yIHJvbGUgaXMgZGlzYWJsZWQuCisJCQkJICogVGhlIGhhcmR3YXJlIGNhbm5vdCBoYW5kbGUgYSByZS1zZWxlY3QtaW4KKwkJCQkgKiBvbiB0aGUgaW5pdGlhdG9yIGlkIGR1cmluZyBhIHJlLXNlbGVjdC1vdXQKKwkJCQkgKiBvbiBhIGRpZmZlcmVudCB0YXJnZXQgaWQuCisJCQkJICovCisJCQkJc3RhdHVzID0gQ0FNX1RJRF9JTlZBTElEOworCQkJfSBlbHNlIGlmICgoYWhjLT5mbGFncyAmIEFIQ19JTklUSUFUT1JST0xFKSAhPSAwCisJCQkJfHwgYWhjLT5lbmFibGVkX2x1bnMgPiAwKSB7CisJCQkJLyoKKwkJCQkgKiBPbmx5IGFsbG93IG91ciB0YXJnZXQgaWQgdG8gY2hhbmdlCisJCQkJICogaWYgdGhlIGluaXRpYXRvciByb2xlIGlzIG5vdCBjb25maWd1cmVkCisJCQkJICogYW5kIHRoZXJlIGFyZSBubyBlbmFibGVkIGx1bnMgd2hpY2gKKwkJCQkgKiBhcmUgYXR0YWNoZWQgdG8gdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkCisJCQkJICogc2NzaSBpZC4KKwkJCQkgKi8KKwkJCQlzdGF0dXMgPSBDQU1fVElEX0lOVkFMSUQ7CisJCQl9CisJCX0gZWxzZSBpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfTVVMVElfVElEKSA9PSAwCisJCQkmJiBhaGMtPmVuYWJsZWRfbHVucyA+IDApIHsKKworCQkJc3RhdHVzID0gQ0FNX1RJRF9JTlZBTElEOworCQl9CisJfQorCisJaWYgKHN0YXR1cyAhPSBDQU1fUkVRX0NNUCkgeworCQljY2ItPmNjYl9oLnN0YXR1cyA9IHN0YXR1czsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogV2Ugbm93IGhhdmUgYW4gaWQgdGhhdCBpcyB2YWxpZC4KKwkgKiBJZiB3ZSBhcmVuJ3QgaW4gdGFyZ2V0IG1vZGUsIHN3aXRjaCBtb2Rlcy4KKwkgKi8KKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfVEFSR0VUUk9MRSkgPT0gMAorCSAmJiBjY2ItPmNjYl9oLnRhcmdldF9pZCAhPSBDQU1fVEFSR0VUX1dJTERDQVJEKSB7CisJCXVfbG9uZwkgczsKKwkJYWhjX2ZsYWcgc2F2ZWRfZmxhZ3M7CisKKwkJcHJpbnRmKCJDb25maWd1cmluZyBUYXJnZXQgTW9kZVxuIik7CisJCWFoY19sb2NrKGFoYywgJnMpOworCQlpZiAoTElTVF9GSVJTVCgmYWhjLT5wZW5kaW5nX3NjYnMpICE9IE5VTEwpIHsKKwkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX0JVU1k7CisJCQlhaGNfdW5sb2NrKGFoYywgJnMpOworCQkJcmV0dXJuOworCQl9CisJCXNhdmVkX2ZsYWdzID0gYWhjLT5mbGFnczsKKwkJYWhjLT5mbGFncyB8PSBBSENfVEFSR0VUUk9MRTsKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX01VTFRJUk9MRSkgPT0gMCkKKwkJCWFoYy0+ZmxhZ3MgJj0gfkFIQ19JTklUSUFUT1JST0xFOworCQlhaGNfcGF1c2UoYWhjKTsKKwkJZXJyb3IgPSBhaGNfbG9hZHNlcShhaGMpOworCQlpZiAoZXJyb3IgIT0gMCkgeworCQkJLyoKKwkJCSAqIFJlc3RvcmUgb3JpZ2luYWwgY29uZmlndXJhdGlvbiBhbmQgbm90aWZ5CisJCQkgKiB0aGUgY2FsbGVyIHRoYXQgd2UgY2Fubm90IHN1cHBvcnQgdGFyZ2V0IG1vZGUuCisJCQkgKiBTaW5jZSB0aGUgYWRhcHRlciBzdGFydGVkIG91dCBpbiB0aGlzCisJCQkgKiBjb25maWd1cmF0aW9uLCB0aGUgZmlybXdhcmUgbG9hZCB3aWxsIHN1Y2NlZWQsCisJCQkgKiBzbyB0aGVyZSBpcyBubyBwb2ludCBpbiBjaGVja2luZyBhaGNfbG9hZHNlcSdzCisJCQkgKiByZXR1cm4gdmFsdWUuCisJCQkgKi8KKwkJCWFoYy0+ZmxhZ3MgPSBzYXZlZF9mbGFnczsKKwkJCSh2b2lkKWFoY19sb2Fkc2VxKGFoYyk7CisJCQlhaGNfcmVzdGFydChhaGMpOworCQkJYWhjX3VubG9jayhhaGMsICZzKTsKKwkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX0ZVTkNfTk9UQVZBSUw7CisJCQlyZXR1cm47CisJCX0KKwkJYWhjX3Jlc3RhcnQoYWhjKTsKKwkJYWhjX3VubG9jayhhaGMsICZzKTsKKwl9CisJY2VsID0gJmNjYi0+Y2VsOworCXRhcmdldCA9IGNjYi0+Y2NiX2gudGFyZ2V0X2lkOworCWx1biA9IGNjYi0+Y2NiX2gudGFyZ2V0X2x1bjsKKwljaGFubmVsID0gU0lNX0NIQU5ORUwoYWhjLCBzaW0pOworCXRhcmdldF9tYXNrID0gMHgwMSA8PCB0YXJnZXQ7CisJaWYgKGNoYW5uZWwgPT0gJ0InKQorCQl0YXJnZXRfbWFzayA8PD0gODsKKworCWlmIChjZWwtPmVuYWJsZSAhPSAwKSB7CisJCXVfaW50IHNjc2lzZXE7CisKKwkJLyogQXJlIHdlIGFscmVhZHkgZW5hYmxlZD8/ICovCisJCWlmIChsc3RhdGUgIT0gTlVMTCkgeworCQkJeHB0X3ByaW50X3BhdGgoY2NiLT5jY2JfaC5wYXRoKTsKKwkJCXByaW50ZigiTHVuIGFscmVhZHkgZW5hYmxlZFxuIik7CisJCQljY2ItPmNjYl9oLnN0YXR1cyA9IENBTV9MVU5fQUxSRFlfRU5BOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKGNlbC0+Z3JwNl9sZW4gIT0gMAorCQkgfHwgY2VsLT5ncnA3X2xlbiAhPSAwKSB7CisJCQkvKgorCQkJICogRG9uJ3QgKHlldD8pIHN1cHBvcnQgdmVuZG9yCisJCQkgKiBzcGVjaWZpYyBjb21tYW5kcy4KKwkJCSAqLworCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fUkVRX0lOVkFMSUQ7CisJCQlwcmludGYoIk5vbi16ZXJvIEdyb3VwIENvZGVzXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qCisJCSAqIFNlZW1zIHRvIGJlIG9rYXkuCisJCSAqIFNldHVwIG91ciBkYXRhIHN0cnVjdHVyZXMuCisJCSAqLworCQlpZiAodGFyZ2V0ICE9IENBTV9UQVJHRVRfV0lMRENBUkQgJiYgdHN0YXRlID09IE5VTEwpIHsKKwkJCXRzdGF0ZSA9IGFoY19hbGxvY190c3RhdGUoYWhjLCB0YXJnZXQsIGNoYW5uZWwpOworCQkJaWYgKHRzdGF0ZSA9PSBOVUxMKSB7CisJCQkJeHB0X3ByaW50X3BhdGgoY2NiLT5jY2JfaC5wYXRoKTsKKwkJCQlwcmludGYoIkNvdWxkbid0IGFsbG9jYXRlIHRzdGF0ZVxuIik7CisJCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fUkVTUkNfVU5BVkFJTDsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJbHN0YXRlID0gbWFsbG9jKHNpemVvZigqbHN0YXRlKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwkJaWYgKGxzdGF0ZSA9PSBOVUxMKSB7CisJCQl4cHRfcHJpbnRfcGF0aChjY2ItPmNjYl9oLnBhdGgpOworCQkJcHJpbnRmKCJDb3VsZG4ndCBhbGxvY2F0ZSBsc3RhdGVcbiIpOworCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fUkVTUkNfVU5BVkFJTDsKKwkJCXJldHVybjsKKwkJfQorCQltZW1zZXQobHN0YXRlLCAwLCBzaXplb2YoKmxzdGF0ZSkpOworCQlzdGF0dXMgPSB4cHRfY3JlYXRlX3BhdGgoJmxzdGF0ZS0+cGF0aCwgLypwZXJpcGgqL05VTEwsCisJCQkJCSB4cHRfcGF0aF9wYXRoX2lkKGNjYi0+Y2NiX2gucGF0aCksCisJCQkJCSB4cHRfcGF0aF90YXJnZXRfaWQoY2NiLT5jY2JfaC5wYXRoKSwKKwkJCQkJIHhwdF9wYXRoX2x1bl9pZChjY2ItPmNjYl9oLnBhdGgpKTsKKwkJaWYgKHN0YXR1cyAhPSBDQU1fUkVRX0NNUCkgeworCQkJZnJlZShsc3RhdGUsIE1fREVWQlVGKTsKKwkJCXhwdF9wcmludF9wYXRoKGNjYi0+Y2NiX2gucGF0aCk7CisJCQlwcmludGYoIkNvdWxkbid0IGFsbG9jYXRlIHBhdGhcbiIpOworCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fUkVTUkNfVU5BVkFJTDsKKwkJCXJldHVybjsKKwkJfQorCQlTTElTVF9JTklUKCZsc3RhdGUtPmFjY2VwdF90aW9zKTsKKwkJU0xJU1RfSU5JVCgmbHN0YXRlLT5pbW1lZF9ub3RpZmllcyk7CisJCWFoY19sb2NrKGFoYywgJnMpOworCQlhaGNfcGF1c2UoYWhjKTsKKwkJaWYgKHRhcmdldCAhPSBDQU1fVEFSR0VUX1dJTERDQVJEKSB7CisJCQl0c3RhdGUtPmVuYWJsZWRfbHVuc1tsdW5dID0gbHN0YXRlOworCQkJYWhjLT5lbmFibGVkX2x1bnMrKzsKKworCQkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX01VTFRJX1RJRCkgIT0gMCkgeworCQkJCXVfaW50IHRhcmdpZF9tYXNrOworCisJCQkJdGFyZ2lkX21hc2sgPSBhaGNfaW5iKGFoYywgVEFSR0lEKQorCQkJCQkgICAgfCAoYWhjX2luYihhaGMsIFRBUkdJRCArIDEpIDw8IDgpOworCisJCQkJdGFyZ2lkX21hc2sgfD0gdGFyZ2V0X21hc2s7CisJCQkJYWhjX291dGIoYWhjLCBUQVJHSUQsIHRhcmdpZF9tYXNrKTsKKwkJCQlhaGNfb3V0YihhaGMsIFRBUkdJRCsxLCAodGFyZ2lkX21hc2sgPj4gOCkpOworCQkJCQorCQkJCWFoY191cGRhdGVfc2NzaWlkKGFoYywgdGFyZ2lkX21hc2spOworCQkJfSBlbHNlIHsKKwkJCQl1X2ludCBvdXJfaWQ7CisJCQkJY2hhciAgY2hhbm5lbDsKKworCQkJCWNoYW5uZWwgPSBTSU1fQ0hBTk5FTChhaGMsIHNpbSk7CisJCQkJb3VyX2lkID0gU0lNX1NDU0lfSUQoYWhjLCBzaW0pOworCisJCQkJLyoKKwkJCQkgKiBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiBzZWxlY3Rpb25zCisJCQkJICogYXJlIG5vdCBlbmFibGVkCisJCQkJICovCisJCQkJaWYgKHRhcmdldCAhPSBvdXJfaWQpIHsKKwkJCQkJdV9pbnQgc2Jsa2N0bDsKKwkJCQkJY2hhciAgY3VyX2NoYW5uZWw7CisJCQkJCWludCAgIHN3YXA7CisKKwkJCQkJc2Jsa2N0bCA9IGFoY19pbmIoYWhjLCBTQkxLQ1RMKTsKKwkJCQkJY3VyX2NoYW5uZWwgPSAoc2Jsa2N0bCAmIFNFTEJVU0IpCisJCQkJCQkgICAgPyAnQicgOiAnQSc7CisJCQkJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSA9PSAwKQorCQkJCQkJY3VyX2NoYW5uZWwgPSAnQSc7CisJCQkJCXN3YXAgPSBjdXJfY2hhbm5lbCAhPSBjaGFubmVsOworCQkJCQlpZiAoY2hhbm5lbCA9PSAnQScpCisJCQkJCQlhaGMtPm91cl9pZCA9IHRhcmdldDsKKwkJCQkJZWxzZQorCQkJCQkJYWhjLT5vdXJfaWRfYiA9IHRhcmdldDsKKworCQkJCQlpZiAoc3dhcCkKKwkJCQkJCWFoY19vdXRiKGFoYywgU0JMS0NUTCwKKwkJCQkJCQkgc2Jsa2N0bCBeIFNFTEJVU0IpOworCisJCQkJCWFoY19vdXRiKGFoYywgU0NTSUlELCB0YXJnZXQpOworCisJCQkJCWlmIChzd2FwKQorCQkJCQkJYWhjX291dGIoYWhjLCBTQkxLQ1RMLCBzYmxrY3RsKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZQorCQkJYWhjLT5ibGFja19ob2xlID0gbHN0YXRlOworCQkvKiBBbGxvdyBzZWxlY3QtaW4gb3BlcmF0aW9ucyAqLworCQlpZiAoYWhjLT5ibGFja19ob2xlICE9IE5VTEwgJiYgYWhjLT5lbmFibGVkX2x1bnMgPiAwKSB7CisJCQlzY3Npc2VxID0gYWhjX2luYihhaGMsIFNDU0lTRVFfVEVNUExBVEUpOworCQkJc2NzaXNlcSB8PSBFTlNFTEk7CisJCQlhaGNfb3V0YihhaGMsIFNDU0lTRVFfVEVNUExBVEUsIHNjc2lzZXEpOworCQkJc2NzaXNlcSA9IGFoY19pbmIoYWhjLCBTQ1NJU0VRKTsKKwkJCXNjc2lzZXEgfD0gRU5TRUxJOworCQkJYWhjX291dGIoYWhjLCBTQ1NJU0VRLCBzY3Npc2VxKTsKKwkJfQorCQlhaGNfdW5wYXVzZShhaGMpOworCQlhaGNfdW5sb2NrKGFoYywgJnMpOworCQljY2ItPmNjYl9oLnN0YXR1cyA9IENBTV9SRVFfQ01QOworCQl4cHRfcHJpbnRfcGF0aChjY2ItPmNjYl9oLnBhdGgpOworCQlwcmludGYoIkx1biBub3cgZW5hYmxlZCBmb3IgdGFyZ2V0IG1vZGVcbiIpOworCX0gZWxzZSB7CisJCXN0cnVjdCBzY2IgKnNjYjsKKwkJaW50IGksIGVtcHR5OworCisJCWlmIChsc3RhdGUgPT0gTlVMTCkgeworCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fTFVOX0lOVkFMSUQ7CisJCQlyZXR1cm47CisJCX0KKworCQlhaGNfbG9jayhhaGMsICZzKTsKKwkJCisJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFUV9DTVA7CisJCUxJU1RfRk9SRUFDSChzY2IsICZhaGMtPnBlbmRpbmdfc2NicywgcGVuZGluZ19saW5rcykgeworCQkJc3RydWN0IGNjYl9oZHIgKmNjYmg7CisKKwkJCWNjYmggPSAmc2NiLT5pb19jdHgtPmNjYl9oOworCQkJaWYgKGNjYmgtPmZ1bmNfY29kZSA9PSBYUFRfQ09OVF9UQVJHRVRfSU8KKwkJCSAmJiAheHB0X3BhdGhfY29tcChjY2JoLT5wYXRoLCBjY2ItPmNjYl9oLnBhdGgpKXsKKwkJCQlwcmludGYoIkNUSU8gcGVuZGluZ1xuIik7CisJCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fUkVRX0lOVkFMSUQ7CisJCQkJYWhjX3VubG9jayhhaGMsICZzKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlpZiAoU0xJU1RfRklSU1QoJmxzdGF0ZS0+YWNjZXB0X3Rpb3MpICE9IE5VTEwpIHsKKwkJCXByaW50ZigiQVRJT3MgcGVuZGluZ1xuIik7CisJCQljY2ItPmNjYl9oLnN0YXR1cyA9IENBTV9SRVFfSU5WQUxJRDsKKwkJfQorCisJCWlmIChTTElTVF9GSVJTVCgmbHN0YXRlLT5pbW1lZF9ub3RpZmllcykgIT0gTlVMTCkgeworCQkJcHJpbnRmKCJJTk9UcyBwZW5kaW5nXG4iKTsKKwkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFUV9JTlZBTElEOworCQl9CisKKwkJaWYgKGNjYi0+Y2NiX2guc3RhdHVzICE9IENBTV9SRVFfQ01QKSB7CisJCQlhaGNfdW5sb2NrKGFoYywgJnMpOworCQkJcmV0dXJuOworCQl9CisKKwkJeHB0X3ByaW50X3BhdGgoY2NiLT5jY2JfaC5wYXRoKTsKKwkJcHJpbnRmKCJUYXJnZXQgbW9kZSBkaXNhYmxlZFxuIik7CisJCXhwdF9mcmVlX3BhdGgobHN0YXRlLT5wYXRoKTsKKwkJZnJlZShsc3RhdGUsIE1fREVWQlVGKTsKKworCQlhaGNfcGF1c2UoYWhjKTsKKwkJLyogQ2FuIHdlIGNsZWFuIHVwIHRoZSB0YXJnZXQgdG9vPyAqLworCQlpZiAodGFyZ2V0ICE9IENBTV9UQVJHRVRfV0lMRENBUkQpIHsKKwkJCXRzdGF0ZS0+ZW5hYmxlZF9sdW5zW2x1bl0gPSBOVUxMOworCQkJYWhjLT5lbmFibGVkX2x1bnMtLTsKKwkJCWZvciAoZW1wdHkgPSAxLCBpID0gMDsgaSA8IDg7IGkrKykKKwkJCQlpZiAodHN0YXRlLT5lbmFibGVkX2x1bnNbaV0gIT0gTlVMTCkgeworCQkJCQllbXB0eSA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJaWYgKGVtcHR5KSB7CisJCQkJYWhjX2ZyZWVfdHN0YXRlKGFoYywgdGFyZ2V0LCBjaGFubmVsLAorCQkJCQkJLypmb3JjZSovRkFMU0UpOworCQkJCWlmIChhaGMtPmZlYXR1cmVzICYgQUhDX01VTFRJX1RJRCkgeworCQkJCQl1X2ludCB0YXJnaWRfbWFzazsKKworCQkJCQl0YXJnaWRfbWFzayA9IGFoY19pbmIoYWhjLCBUQVJHSUQpCisJCQkJCQkgICAgfCAoYWhjX2luYihhaGMsIFRBUkdJRCArIDEpCisJCQkJCQkgICAgICAgPDwgOCk7CisKKwkJCQkJdGFyZ2lkX21hc2sgJj0gfnRhcmdldF9tYXNrOworCQkJCQlhaGNfb3V0YihhaGMsIFRBUkdJRCwgdGFyZ2lkX21hc2spOworCQkJCQlhaGNfb3V0YihhaGMsIFRBUkdJRCsxLAorCQkJCQkgCSAodGFyZ2lkX21hc2sgPj4gOCkpOworCQkJCQlhaGNfdXBkYXRlX3Njc2lpZChhaGMsIHRhcmdpZF9tYXNrKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisKKwkJCWFoYy0+YmxhY2tfaG9sZSA9IE5VTEw7CisKKwkJCS8qCisJCQkgKiBXZSBjYW4ndCBhbGxvdyBzZWxlY3Rpb25zIHdpdGhvdXQKKwkJCSAqIG91ciBibGFjayBob2xlIGRldmljZS4KKwkJCSAqLworCQkJZW1wdHkgPSBUUlVFOworCQl9CisJCWlmIChhaGMtPmVuYWJsZWRfbHVucyA9PSAwKSB7CisJCQkvKiBEaXNhbGxvdyBzZWxlY3QtaW4gKi8KKwkJCXVfaW50IHNjc2lzZXE7CisKKwkJCXNjc2lzZXEgPSBhaGNfaW5iKGFoYywgU0NTSVNFUV9URU1QTEFURSk7CisJCQlzY3Npc2VxICY9IH5FTlNFTEk7CisJCQlhaGNfb3V0YihhaGMsIFNDU0lTRVFfVEVNUExBVEUsIHNjc2lzZXEpOworCQkJc2NzaXNlcSA9IGFoY19pbmIoYWhjLCBTQ1NJU0VRKTsKKwkJCXNjc2lzZXEgJj0gfkVOU0VMSTsKKwkJCWFoY19vdXRiKGFoYywgU0NTSVNFUSwgc2NzaXNlcSk7CisKKwkJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19NVUxUSVJPTEUpID09IDApIHsKKwkJCQlwcmludGYoIkNvbmZpZ3VyaW5nIEluaXRpYXRvciBNb2RlXG4iKTsKKwkJCQlhaGMtPmZsYWdzICY9IH5BSENfVEFSR0VUUk9MRTsKKwkJCQlhaGMtPmZsYWdzIHw9IEFIQ19JTklUSUFUT1JST0xFOworCQkJCS8qCisJCQkJICogUmV0dXJuaW5nIHRvIGEgY29uZmlndXJhdGlvbiB0aGF0CisJCQkJICogZml0IHByZXZpb3VzbHkgd2lsbCBhbHdheXMgc3VjY2VlZC4KKwkJCQkgKi8KKwkJCQkodm9pZClhaGNfbG9hZHNlcShhaGMpOworCQkJCWFoY19yZXN0YXJ0KGFoYyk7CisJCQkJLyoKKwkJCQkgKiBVbnBhdXNlZC4gIFRoZSBleHRyYSB1bnBhdXNlCisJCQkJICogdGhhdCBmb2xsb3dzIGlzIGhhcm1sZXNzLgorCQkJCSAqLworCQkJfQorCQl9CisJCWFoY191bnBhdXNlKGFoYyk7CisJCWFoY191bmxvY2soYWhjLCAmcyk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWhjX3VwZGF0ZV9zY3NpaWQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCB0YXJnaWRfbWFzaykKK3sKKwl1X2ludCBzY3NpaWRfbWFzazsKKwl1X2ludCBzY3NpaWQ7CisKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfTVVMVElfVElEKSA9PSAwKQorCQlwYW5pYygiYWhjX3VwZGF0ZV9zY3NpaWQgY2FsbGVkIG9uIG5vbi1tdWx0aXRpZCB1bml0XG4iKTsKKworCS8qCisJICogU2luY2Ugd2Ugd2lsbCByZWx5IG9uIHRoZSBUQVJHSUQgbWFzaworCSAqIGZvciBzZWxlY3Rpb24gZW5hYmxlcywgZW5zdXJlIHRoYXQgT0lECisJICogaW4gU0NTSUlEIGlzIG5vdCBzZXQgdG8gc29tZSBvdGhlciBJRAorCSAqIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBhbGxvdyBzZWxlY3Rpb25zIG9uLgorCSAqLworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisJCXNjc2lpZCA9IGFoY19pbmIoYWhjLCBTQ1NJSURfVUxUUkEyKTsKKwllbHNlCisJCXNjc2lpZCA9IGFoY19pbmIoYWhjLCBTQ1NJSUQpOworCXNjc2lpZF9tYXNrID0gMHgxIDw8IChzY3NpaWQgJiBPSUQpOworCWlmICgodGFyZ2lkX21hc2sgJiBzY3NpaWRfbWFzaykgPT0gMCkgeworCQl1X2ludCBvdXJfaWQ7CisKKwkJLyogZmZzIGNvdW50cyBmcm9tIDEgKi8KKwkJb3VyX2lkID0gZmZzKHRhcmdpZF9tYXNrKTsKKwkJaWYgKG91cl9pZCA9PSAwKQorCQkJb3VyX2lkID0gYWhjLT5vdXJfaWQ7CisJCWVsc2UKKwkJCW91cl9pZC0tOworCQlzY3NpaWQgJj0gVElEOworCQlzY3NpaWQgfD0gb3VyX2lkOworCX0KKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKQorCQlhaGNfb3V0YihhaGMsIFNDU0lJRF9VTFRSQTIsIHNjc2lpZCk7CisJZWxzZQorCQlhaGNfb3V0YihhaGMsIFNDU0lJRCwgc2NzaWlkKTsKK30KKwordm9pZAorYWhjX3J1bl90cWluZmlmbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCBwYXVzZWQpCit7CisJc3RydWN0IHRhcmdldF9jbWQgKmNtZDsKKworCS8qCisJICogSWYgdGhlIGNhcmQgc3VwcG9ydHMgYXV0by1hY2Nlc3MgcGF1c2UsCisJICogd2UgY2FuIGFjY2VzcyB0aGUgY2FyZCBkaXJlY3RseSByZWdhcmRsZXNzCisJICogb2Ygd2hldGhlciBpdCBpcyBwYXVzZWQgb3Igbm90LgorCSAqLworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19BVVRPUEFVU0UpICE9IDApCisJCXBhdXNlZCA9IFRSVUU7CisKKwlhaGNfc3luY190cWluZmlmbyhhaGMsIEJVU19ETUFTWU5DX1BPU1RSRUFEKTsKKwl3aGlsZSAoKGNtZCA9ICZhaGMtPnRhcmdldGNtZHNbYWhjLT50cWluZmlmb25leHRdKS0+Y21kX3ZhbGlkICE9IDApIHsKKworCQkvKgorCQkgKiBPbmx5IGFkdmFuY2UgdGhyb3VnaCB0aGUgcXVldWUgaWYgd2UKKwkJICogaGF2ZSB0aGUgcmVzb3VyY2VzIHRvIHByb2Nlc3MgdGhlIGNvbW1hbmQuCisJCSAqLworCQlpZiAoYWhjX2hhbmRsZV90YXJnZXRfY21kKGFoYywgY21kKSAhPSAwKQorCQkJYnJlYWs7CisKKwkJY21kLT5jbWRfdmFsaWQgPSAwOworCQlhaGNfZG1hbWFwX3N5bmMoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsCisJCQkJYWhjLT5zaGFyZWRfZGF0YV9kbWFtYXAsCisJCQkJYWhjX3RhcmdldGNtZF9vZmZzZXQoYWhjLCBhaGMtPnRxaW5maWZvbmV4dCksCisJCQkJc2l6ZW9mKHN0cnVjdCB0YXJnZXRfY21kKSwKKwkJCQlCVVNfRE1BU1lOQ19QUkVSRUFEKTsKKwkJYWhjLT50cWluZmlmb25leHQrKzsKKworCQkvKgorCQkgKiBMYXppbHkgdXBkYXRlIG91ciBwb3NpdGlvbiBpbiB0aGUgdGFyZ2V0IG1vZGUgaW5jb21pbmcKKwkJICogY29tbWFuZCBxdWV1ZSBhcyBzZWVuIGJ5IHRoZSBzZXF1ZW5jZXIuCisJCSAqLworCQlpZiAoKGFoYy0+dHFpbmZpZm9uZXh0ICYgKEhPU1RfVFFJTlBPUyAtIDEpKSA9PSAxKSB7CisJCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfSFNfTUFJTEJPWCkgIT0gMCkgeworCQkJCXVfaW50IGhzX21haWxib3g7CisKKwkJCQloc19tYWlsYm94ID0gYWhjX2luYihhaGMsIEhTX01BSUxCT1gpOworCQkJCWhzX21haWxib3ggJj0gfkhPU1RfVFFJTlBPUzsKKwkJCQloc19tYWlsYm94IHw9IGFoYy0+dHFpbmZpZm9uZXh0ICYgSE9TVF9UUUlOUE9TOworCQkJCWFoY19vdXRiKGFoYywgSFNfTUFJTEJPWCwgaHNfbWFpbGJveCk7CisJCQl9IGVsc2UgeworCQkJCWlmICghcGF1c2VkKQorCQkJCQlhaGNfcGF1c2UoYWhjKTsJCisJCQkJYWhjX291dGIoYWhjLCBLRVJORUxfVFFJTlBPUywKKwkJCQkJIGFoYy0+dHFpbmZpZm9uZXh0ICYgSE9TVF9UUUlOUE9TKTsKKwkJCQlpZiAoIXBhdXNlZCkKKwkJCQkJYWhjX3VucGF1c2UoYWhjKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGludAorYWhjX2hhbmRsZV90YXJnZXRfY21kKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHRhcmdldF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QJICBhaGNfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJc3RydWN0CSAgYWhjX3Rtb2RlX2xzdGF0ZSAqbHN0YXRlOworCXN0cnVjdAkgIGNjYl9hY2NlcHRfdGlvICphdGlvOworCXVpbnQ4X3QgKmJ5dGU7CisJaW50CSAgaW5pdGlhdG9yOworCWludAkgIHRhcmdldDsKKwlpbnQJICBsdW47CisKKwlpbml0aWF0b3IgPSBTQ1NJSURfVEFSR0VUKGFoYywgY21kLT5zY3NpaWQpOworCXRhcmdldCA9IFNDU0lJRF9PVVJfSUQoY21kLT5zY3NpaWQpOworCWx1biAgICA9IChjbWQtPmlkZW50aWZ5ICYgTVNHX0lERU5USUZZX0xVTk1BU0spOworCisJYnl0ZSA9IGNtZC0+Ynl0ZXM7CisJdHN0YXRlID0gYWhjLT5lbmFibGVkX3RhcmdldHNbdGFyZ2V0XTsKKwlsc3RhdGUgPSBOVUxMOworCWlmICh0c3RhdGUgIT0gTlVMTCkKKwkJbHN0YXRlID0gdHN0YXRlLT5lbmFibGVkX2x1bnNbbHVuXTsKKworCS8qCisJICogQ29tbWFuZHMgZm9yIGRpc2FibGVkIGx1bnMgZ28gdG8gdGhlIGJsYWNrIGhvbGUgZHJpdmVyLgorCSAqLworCWlmIChsc3RhdGUgPT0gTlVMTCkKKwkJbHN0YXRlID0gYWhjLT5ibGFja19ob2xlOworCisJYXRpbyA9IChzdHJ1Y3QgY2NiX2FjY2VwdF90aW8qKVNMSVNUX0ZJUlNUKCZsc3RhdGUtPmFjY2VwdF90aW9zKTsKKwlpZiAoYXRpbyA9PSBOVUxMKSB7CisJCWFoYy0+ZmxhZ3MgfD0gQUhDX1RRSU5GSUZPX0JMT0NLRUQ7CisJCS8qCisJCSAqIFdhaXQgZm9yIG1vcmUgQVRJT3MgZnJvbSB0aGUgcGVyaXBoZXJhbCBkcml2ZXIgZm9yIHRoaXMgbHVuLgorCQkgKi8KKwkJaWYgKGJvb3R2ZXJib3NlKQorCQkJcHJpbnRmKCIlczogQVRJT3MgZXhoYXVzdGVkXG4iLCBhaGNfbmFtZShhaGMpKTsKKwkJcmV0dXJuICgxKTsKKwl9IGVsc2UKKwkJYWhjLT5mbGFncyAmPSB+QUhDX1RRSU5GSUZPX0JMT0NLRUQ7CisjaWYgMAorCXByaW50ZigiSW5jb21pbmcgY29tbWFuZCBmcm9tICVkIGZvciAlZDolZCVzXG4iLAorCSAgICAgICBpbml0aWF0b3IsIHRhcmdldCwgbHVuLAorCSAgICAgICBsc3RhdGUgPT0gYWhjLT5ibGFja19ob2xlID8gIihCbGFjayBIb2xlZCkiIDogIiIpOworI2VuZGlmCisJU0xJU1RfUkVNT1ZFX0hFQUQoJmxzdGF0ZS0+YWNjZXB0X3Rpb3MsIHNpbV9saW5rcy5zbGUpOworCisJaWYgKGxzdGF0ZSA9PSBhaGMtPmJsYWNrX2hvbGUpIHsKKwkJLyogRmlsbCBpbiB0aGUgd2lsZGNhcmRzICovCisJCWF0aW8tPmNjYl9oLnRhcmdldF9pZCA9IHRhcmdldDsKKwkJYXRpby0+Y2NiX2gudGFyZ2V0X2x1biA9IGx1bjsKKwl9CisKKwkvKgorCSAqIFBhY2thZ2UgaXQgdXAgYW5kIHNlbmQgaXQgb2ZmIHRvCisJICogd2hvbWV2ZXIgaGFzIHRoaXMgbHVuIGVuYWJsZWQuCisJICovCisJYXRpby0+c2Vuc2VfbGVuID0gMDsKKwlhdGlvLT5pbml0X2lkID0gaW5pdGlhdG9yOworCWlmIChieXRlWzBdICE9IDB4RkYpIHsKKwkJLyogVGFnIHdhcyBpbmNsdWRlZCAqLworCQlhdGlvLT50YWdfYWN0aW9uID0gKmJ5dGUrKzsKKwkJYXRpby0+dGFnX2lkID0gKmJ5dGUrKzsKKwkJYXRpby0+Y2NiX2guZmxhZ3MgPSBDQU1fVEFHX0FDVElPTl9WQUxJRDsKKwl9IGVsc2UgeworCQlhdGlvLT5jY2JfaC5mbGFncyA9IDA7CisJfQorCWJ5dGUrKzsKKworCS8qIE9rYXkuICBOb3cgZGV0ZXJtaW5lIHRoZSBjZGIgc2l6ZSBiYXNlZCBvbiB0aGUgY29tbWFuZCBjb2RlICovCisJc3dpdGNoICgqYnl0ZSA+PiBDTURfR1JPVVBfQ09ERV9TSElGVCkgeworCWNhc2UgMDoKKwkJYXRpby0+Y2RiX2xlbiA9IDY7CisJCWJyZWFrOworCWNhc2UgMToKKwljYXNlIDI6CisJCWF0aW8tPmNkYl9sZW4gPSAxMDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlhdGlvLT5jZGJfbGVuID0gMTY7CisJCWJyZWFrOworCWNhc2UgNToKKwkJYXRpby0+Y2RiX2xlbiA9IDEyOworCQlicmVhazsKKwljYXNlIDM6CisJZGVmYXVsdDoKKwkJLyogT25seSBjb3B5IHRoZSBvcGNvZGUuICovCisJCWF0aW8tPmNkYl9sZW4gPSAxOworCQlwcmludGYoIlJlc2VydmVkIG9yIFZVIGNvbW1hbmQgY29kZSB0eXBlIGVuY291bnRlcmVkXG4iKTsKKwkJYnJlYWs7CisJfQorCQorCW1lbWNweShhdGlvLT5jZGJfaW8uY2RiX2J5dGVzLCBieXRlLCBhdGlvLT5jZGJfbGVuKTsKKworCWF0aW8tPmNjYl9oLnN0YXR1cyB8PSBDQU1fQ0RCX1JFQ1ZEOworCisJaWYgKChjbWQtPmlkZW50aWZ5ICYgTVNHX0lERU5USUZZX0RJU0NGTEFHKSA9PSAwKSB7CisJCS8qCisJCSAqIFdlIHdlcmVuJ3QgYWxsb3dlZCB0byBkaXNjb25uZWN0LgorCQkgKiBXZSdyZSBoYW5naW5nIG9uIHRoZSBidXMgdW50aWwgYQorCQkgKiBjb250aW51ZSB0YXJnZXQgSS9PIGNvbWVzIGluIHJlc3BvbnNlCisJCSAqIHRvIHRoaXMgYWNjZXB0IHRpby4KKwkJICovCisjaWYgMAorCQlwcmludGYoIlJlY2VpdmVkIEltbWVkaWF0ZSBDb21tYW5kICVkOiVkOiVkIC0gJXBcbiIsCisJCSAgICAgICBpbml0aWF0b3IsIHRhcmdldCwgbHVuLCBhaGMtPnBlbmRpbmdfZGV2aWNlKTsKKyNlbmRpZgorCQlhaGMtPnBlbmRpbmdfZGV2aWNlID0gbHN0YXRlOworCQlhaGNfZnJlZXplX2NjYigodW5pb24gY2NiICopYXRpbyk7CisJCWF0aW8tPmNjYl9oLmZsYWdzIHw9IENBTV9ESVNfRElTQ09OTkVDVDsKKwl9CisJeHB0X2RvbmUoKHVuaW9uIGNjYiopYXRpbyk7CisJcmV0dXJuICgwKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X2lubGluZS5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9pbmxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2M4YTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9pbmxpbmUuaApAQCAtMCwwICsxLDY0OSBAQAorLyoKKyAqIElubGluZSByb3V0aW5lcyBzaGFyZWFibGUgYWNyb3NzIE9TIHBsYXRmb3Jtcy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMjAwMSBKdXN0aW4gVC4gR2liYnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHhfaW5saW5lLmgjNDMgJAorICoKKyAqICRGcmVlQlNEJAorICovCisKKyNpZm5kZWYgX0FJQzdYWFhfSU5MSU5FX0hfCisjZGVmaW5lIF9BSUM3WFhYX0lOTElORV9IXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBTZXF1ZW5jZXIgRXhlY3V0aW9uIENvbnRyb2wgKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX3BhdXNlX2J1Z19maXgoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyBfX2lubGluZSBpbnQgIGFoY19pc19wYXVzZWQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19wYXVzZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX3VucGF1c2Uoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKKworLyoKKyAqIFdvcmsgYXJvdW5kIGFueSBjaGlwIGJ1Z3MgcmVsYXRlZCB0byBoYWx0aW5nIHNlcXVlbmNlciBleGVjdXRpb24uCisgKiBPbiBVbHRyYTIgY29udHJvbGxlcnMsIHdlIG11c3QgY2xlYXIgdGhlIENJT0JVUyBzdHJldGNoIHNpZ25hbCBieQorICogcmVhZGluZyBhIHJlZ2lzdGVyIHRoYXQgd2lsbCBzZXQgdGhpcyBzaWduYWwgYW5kIGRlYXNzZXJ0IGl0LgorICogV2l0aG91dCB0aGlzIHdvcmthcm91bmQsIGlmIHRoZSBjaGlwIGlzIHBhdXNlZCwgYnkgYW4gaW50ZXJydXB0IG9yCisgKiBtYW51YWwgcGF1c2Ugd2hpbGUgYWNjZXNzaW5nIHNjYiByYW0sIGFjY2Vzc2VzIHRvIGNlcnRhaW4gcmVnaXN0ZXJzCisgKiB3aWxsIGhhbmcgdGhlIHN5c3RlbSAoaW5maW5pdGUgcGNpIHJldHJpZXMpLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX3BhdXNlX2J1Z19maXgoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisJCSh2b2lkKWFoY19pbmIoYWhjLCBDQ1NDQkNUTCk7Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc2VxdWVuY2VyIGhhcyBoYWx0ZWQgY29kZSBleGVjdXRpb24uCisgKiBSZXR1cm5zIG5vbi16ZXJvIHN0YXR1cyBpZiB0aGUgc2VxdWVuY2VyIGlzIHN0b3BwZWQuCisgKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK2FoY19pc19wYXVzZWQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoKGFoY19pbmIoYWhjLCBIQ05UUkwpICYgUEFVU0UpICE9IDApOworfQorCisvKgorICogUmVxdWVzdCB0aGF0IHRoZSBzZXF1ZW5jZXIgc3RvcCBhbmQgd2FpdCwgaW5kZWZpbml0ZWx5LCBmb3IgaXQKKyAqIHRvIHN0b3AuICBUaGUgc2VxdWVuY2VyIHdpbGwgb25seSBhY2tub3dsZWRnZSB0aGF0IGl0IGlzIHBhdXNlZAorICogb25jZSBpdCBoYXMgcmVhY2hlZCBhbiBpbnN0cnVjdGlvbiBib3VuZGFyeSBhbmQgUEFVU0VESVMgaXMKKyAqIGNsZWFyZWQgaW4gdGhlIFNFUUNUTCByZWdpc3Rlci4gIFRoZSBzZXF1ZW5jZXIgbWF5IHVzZSBQQVVTRURJUworICogZm9yIGNyaXRpY2FsIHNlY3Rpb25zLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX3BhdXNlKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlhaGNfb3V0YihhaGMsIEhDTlRSTCwgYWhjLT5wYXVzZSk7CisKKwkvKgorCSAqIFNpbmNlIHRoZSBzZXF1ZW5jZXIgY2FuIGRpc2FibGUgcGF1c2luZyBpbiBhIGNyaXRpY2FsIHNlY3Rpb24sIHdlCisJICogbXVzdCBsb29wIHVudGlsIGl0IGFjdHVhbGx5IHN0b3BzLgorCSAqLworCXdoaWxlIChhaGNfaXNfcGF1c2VkKGFoYykgPT0gMCkKKwkJOworCisJYWhjX3BhdXNlX2J1Z19maXgoYWhjKTsKK30KKworLyoKKyAqIEFsbG93IHRoZSBzZXF1ZW5jZXIgdG8gY29udGludWUgcHJvZ3JhbSBleGVjdXRpb24uCisgKiBXZSBjaGVjayBoZXJlIHRvIGVuc3VyZSB0aGF0IG5vIGFkZGl0aW9uYWwgaW50ZXJydXB0CisgKiBzb3VyY2VzIHRoYXQgd291bGQgY2F1c2UgdGhlIHNlcXVlbmNlciB0byBoYWx0IGhhdmUgYmVlbgorICogYXNzZXJ0ZWQuICBJZiwgZm9yIGV4YW1wbGUsIGEgU0NTSSBidXMgcmVzZXQgaXMgZGV0ZWN0ZWQKKyAqIHdoaWxlIHdlIGFyZSBmaWVsZGluZyBhIGRpZmZlcmVudCwgcGF1c2luZywgaW50ZXJydXB0IHR5cGUsCisgKiB3ZSBkb24ndCB3YW50IHRvIHJlbGVhc2UgdGhlIHNlcXVlbmNlciBiZWZvcmUgZ29pbmcgYmFjaworICogaW50byBvdXIgaW50ZXJydXB0IGhhbmRsZXIgYW5kIGRlYWxpbmcgd2l0aCB0aGlzIG5ldworICogY29uZGl0aW9uLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX3VucGF1c2Uoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWlmICgoYWhjX2luYihhaGMsIElOVFNUQVQpICYgKFNDU0lJTlQgfCBTRVFJTlQgfCBCUktBRFJJTlQpKSA9PSAwKQorCQlhaGNfb3V0YihhaGMsIEhDTlRSTCwgYWhjLT51bnBhdXNlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqIFVudGFnZ2VkIFRyYW5zYWN0aW9uIFJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoY19mcmVlemVfdW50YWdnZWRfcXVldWVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGNfcmVsZWFzZV91bnRhZ2dlZF9xdWV1ZXMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKKworLyoKKyAqIEJsb2NrIG91ciBjb21wbGV0aW9uIHJvdXRpbmUgZnJvbSBzdGFydGluZyB0aGUgbmV4dCB1bnRhZ2dlZAorICogdHJhbnNhY3Rpb24gZm9yIHRoaXMgdGFyZ2V0IG9yIHRhcmdldCBsdW4uCisgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfZnJlZXplX3VudGFnZ2VkX3F1ZXVlcyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1NDQl9CVFQpID09IDApCisJCWFoYy0+dW50YWdnZWRfcXVldWVfbG9jaysrOworfQorCisvKgorICogQWxsb3cgdGhlIG5leHQgdW50YWdnZWQgdHJhbnNhY3Rpb24gZm9yIHRoaXMgdGFyZ2V0IG9yIHRhcmdldCBsdW4KKyAqIHRvIGJlIGV4ZWN1dGVkLiAgV2UgdXNlIGEgY291bnRpbmcgc2VtYXBob3JlIHRvIGFsbG93IHRoZSBsb2NrCisgKiB0byBiZSBhY3F1aXJlZCByZWN1cnNpdmVseS4gIE9uY2UgdGhlIGNvdW50IGRyb3BzIHRvIHplcm8sIHRoZQorICogdHJhbnNhY3Rpb24gcXVldWVzIHdpbGwgYmUgcnVuLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX3JlbGVhc2VfdW50YWdnZWRfcXVldWVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfU0NCX0JUVCkgPT0gMCkgeworCQlhaGMtPnVudGFnZ2VkX3F1ZXVlX2xvY2stLTsKKwkJaWYgKGFoYy0+dW50YWdnZWRfcXVldWVfbG9jayA9PSAwKQorCQkJYWhjX3J1bl91bnRhZ2dlZF9xdWV1ZXMoYWhjKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBNZW1vcnkgbWFwcGluZyByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgX19pbmxpbmUgc3RydWN0IGFoY19kbWFfc2VnICoKKwkJCWFoY19zZ19idXNfdG9fdmlydChzdHJ1Y3Qgc2NiICpzY2IsCisJCQkJCSAgIHVpbnQzMl90IHNnX2J1c2FkZHIpOworc3RhdGljIF9faW5saW5lIHVpbnQzMl90CisJCQlhaGNfc2dfdmlydF90b19idXMoc3RydWN0IHNjYiAqc2NiLAorCQkJCQkgICBzdHJ1Y3QgYWhjX2RtYV9zZWcgKnNnKTsKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdAorCQkJYWhjX2hzY2JfYnVzYWRkcihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IGluZGV4KTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoY19zeW5jX3NjYihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJICAgICBzdHJ1Y3Qgc2NiICpzY2IsIGludCBvcCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGNfc3luY19zZ2xpc3Qoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQlzdHJ1Y3Qgc2NiICpzY2IsIGludCBvcCk7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKKwkJCWFoY190YXJnZXRjbWRfb2Zmc2V0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJICAgICB1X2ludCBpbmRleCk7CisKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYWhjX2RtYV9zZWcgKgorYWhjX3NnX2J1c190b192aXJ0KHN0cnVjdCBzY2IgKnNjYiwgdWludDMyX3Qgc2dfYnVzYWRkcikKK3sKKwlpbnQgc2dfaW5kZXg7CisKKwlzZ19pbmRleCA9IChzZ19idXNhZGRyIC0gc2NiLT5zZ19saXN0X3BoeXMpL3NpemVvZihzdHJ1Y3QgYWhjX2RtYV9zZWcpOworCS8qIHNnX2xpc3RfcGh5cyBwb2ludHMgdG8gZW50cnkgMSwgbm90IDAgKi8KKwlzZ19pbmRleCsrOworCisJcmV0dXJuICgmc2NiLT5zZ19saXN0W3NnX2luZGV4XSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdAorYWhjX3NnX3ZpcnRfdG9fYnVzKHN0cnVjdCBzY2IgKnNjYiwgc3RydWN0IGFoY19kbWFfc2VnICpzZykKK3sKKwlpbnQgc2dfaW5kZXg7CisKKwkvKiBzZ19saXN0X3BoeXMgcG9pbnRzIHRvIGVudHJ5IDEsIG5vdCAwICovCisJc2dfaW5kZXggPSBzZyAtICZzY2ItPnNnX2xpc3RbMV07CisKKwlyZXR1cm4gKHNjYi0+c2dfbGlzdF9waHlzICsgKHNnX2luZGV4ICogc2l6ZW9mKCpzY2ItPnNnX2xpc3QpKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdAorYWhjX2hzY2JfYnVzYWRkcihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IGluZGV4KQoreworCXJldHVybiAoYWhjLT5zY2JfZGF0YS0+aHNjYl9idXNhZGRyCisJCSsgKHNpemVvZihzdHJ1Y3QgaGFyZHdhcmVfc2NiKSAqIGluZGV4KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfc3luY19zY2Ioc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IsIGludCBvcCkKK3sKKwlhaGNfZG1hbWFwX3N5bmMoYWhjLCBhaGMtPnNjYl9kYXRhLT5oc2NiX2RtYXQsCisJCQlhaGMtPnNjYl9kYXRhLT5oc2NiX2RtYW1hcCwKKwkJCS8qb2Zmc2V0Ki8oc2NiLT5oc2NiIC0gYWhjLT5oc2NicykgKiBzaXplb2YoKnNjYi0+aHNjYiksCisJCQkvKmxlbiovc2l6ZW9mKCpzY2ItPmhzY2IpLCBvcCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfc3luY19zZ2xpc3Qoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IsIGludCBvcCkKK3sKKwlpZiAoc2NiLT5zZ19jb3VudCA9PSAwKQorCQlyZXR1cm47CisKKwlhaGNfZG1hbWFwX3N5bmMoYWhjLCBhaGMtPnNjYl9kYXRhLT5zZ19kbWF0LCBzY2ItPnNnX21hcC0+c2dfZG1hbWFwLAorCQkJLypvZmZzZXQqLyhzY2ItPnNnX2xpc3QgLSBzY2ItPnNnX21hcC0+c2dfdmFkZHIpCisJCQkJKiBzaXplb2Yoc3RydWN0IGFoY19kbWFfc2VnKSwKKwkJCS8qbGVuKi9zaXplb2Yoc3RydWN0IGFoY19kbWFfc2VnKSAqIHNjYi0+c2dfY291bnQsIG9wKTsKK30KKworc3RhdGljIF9faW5saW5lIHVpbnQzMl90CithaGNfdGFyZ2V0Y21kX29mZnNldChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IGluZGV4KQoreworCXJldHVybiAoKCh1aW50OF90ICopJmFoYy0+dGFyZ2V0Y21kc1tpbmRleF0pIC0gYWhjLT5xb3V0Zmlmbyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZWJ1Z2dpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgX19pbmxpbmUgY2hhciAqYWhjX25hbWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKKworc3RhdGljIF9faW5saW5lIGNoYXIgKgorYWhjX25hbWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoYWhjLT5uYW1lKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1pc2NlbGFuZW91cyBTdXBwb3J0IEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIF9faW5saW5lIHZvaWQJYWhjX3VwZGF0ZV9yZXNpZHVhbChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgICBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIF9faW5saW5lIHN0cnVjdCBhaGNfaW5pdGlhdG9yX3RpbmZvICoKKwkJCWFoY19mZXRjaF90cmFuc2luZm8oc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkgICAgY2hhciBjaGFubmVsLCB1X2ludCBvdXJfaWQsCisJCQkJCSAgICB1X2ludCByZW1vdGVfaWQsCisJCQkJCSAgICBzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSAqKnRzdGF0ZSk7CitzdGF0aWMgX19pbmxpbmUgdWludDE2X3QKKwkJCWFoY19pbncoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCBwb3J0KTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoY19vdXR3KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgcG9ydCwKKwkJCQkgdV9pbnQgdmFsdWUpOworc3RhdGljIF9faW5saW5lIHVpbnQzMl90CisJCQlhaGNfaW5sKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgcG9ydCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGNfb3V0bChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHBvcnQsCisJCQkJIHVpbnQzMl90IHZhbHVlKTsKK3N0YXRpYyBfX2lubGluZSB1aW50NjRfdAorCQkJYWhjX2lucShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHBvcnQpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhjX291dHEoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCBwb3J0LAorCQkJCSB1aW50NjRfdCB2YWx1ZSk7CitzdGF0aWMgX19pbmxpbmUgc3RydWN0IHNjYioKKwkJCWFoY19nZXRfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGNfZnJlZV9zY2Ioc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhjX3N3YXBfd2l0aF9uZXh0X2hzY2Ioc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkJc3RydWN0IHNjYiAqc2NiKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoY19xdWV1ZV9zY2Ioc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIF9faW5saW5lIHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEgKgorCQkJYWhjX2dldF9zZW5zZV9idWYoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkgIHN0cnVjdCBzY2IgKnNjYik7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKKwkJCWFoY19nZXRfc2Vuc2VfYnVmYWRkcihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgICAgIHN0cnVjdCBzY2IgKnNjYik7CisKKy8qCisgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc2VxdWVuY2VyIHJlcG9ydGVkIGEgcmVzaWR1YWwKKyAqIGZvciB0aGlzIFNDQi90cmFuc2FjdGlvbi4KKyAqLworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoY191cGRhdGVfcmVzaWR1YWwoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJdWludDMyX3Qgc2dwdHI7CisKKwlzZ3B0ciA9IGFoY19sZTMydG9oKHNjYi0+aHNjYi0+c2dwdHIpOworCWlmICgoc2dwdHIgJiBTR19SRVNJRF9WQUxJRCkgIT0gMCkKKwkJYWhjX2NhbGNfcmVzaWR1YWwoYWhjLCBzY2IpOworfQorCisvKgorICogUmV0dXJuIHBvaW50ZXJzIHRvIHRoZSB0cmFuc2ZlciBuZWdvdGlhdGlvbiBpbmZvcm1hdGlvbgorICogZm9yIHRoZSBzcGVjaWZpZWQgb3VyX2lkL3JlbW90ZV9pZCBwYWlyLgorICovCitzdGF0aWMgX19pbmxpbmUgc3RydWN0IGFoY19pbml0aWF0b3JfdGluZm8gKgorYWhjX2ZldGNoX3RyYW5zaW5mbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGNoYXIgY2hhbm5lbCwgdV9pbnQgb3VyX2lkLAorCQkgICAgdV9pbnQgcmVtb3RlX2lkLCBzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSAqKnRzdGF0ZSkKK3sKKwkvKgorCSAqIFRyYW5zZmVyIGRhdGEgc3RydWN0dXJlcyBhcmUgc3RvcmVkIGZyb20gdGhlIHBlcnNwZWN0aXZlCisJICogb2YgdGhlIHRhcmdldCByb2xlLiAgU2luY2UgdGhlIHBhcmFtZXRlcnMgZm9yIGEgY29ubmVjdGlvbgorCSAqIGluIHRoZSBpbml0aWF0b3Igcm9sZSB0byBhIGdpdmVuIHRhcmdldCBhcmUgdGhlIHNhbWUgYXMKKwkgKiB3aGVuIHRoZSByb2xlcyBhcmUgcmV2ZXJzZWQsIHdlIHByZXRlbmQgd2UgYXJlIHRoZSB0YXJnZXQuCisJICovCisJaWYgKGNoYW5uZWwgPT0gJ0InKQorCQlvdXJfaWQgKz0gODsKKwkqdHN0YXRlID0gYWhjLT5lbmFibGVkX3RhcmdldHNbb3VyX2lkXTsKKwlyZXR1cm4gKCYoKnRzdGF0ZSktPnRyYW5zaW5mb1tyZW1vdGVfaWRdKTsKK30KKworc3RhdGljIF9faW5saW5lIHVpbnQxNl90CithaGNfaW53KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgcG9ydCkKK3sKKwlyZXR1cm4gKChhaGNfaW5iKGFoYywgcG9ydCsxKSA8PCA4KSB8IGFoY19pbmIoYWhjLCBwb3J0KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfb3V0dyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHBvcnQsIHVfaW50IHZhbHVlKQoreworCWFoY19vdXRiKGFoYywgcG9ydCwgdmFsdWUgJiAweEZGKTsKKwlhaGNfb3V0YihhaGMsIHBvcnQrMSwgKHZhbHVlID4+IDgpICYgMHhGRik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdAorYWhjX2lubChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHBvcnQpCit7CisJcmV0dXJuICgoYWhjX2luYihhaGMsIHBvcnQpKQorCSAgICAgIHwgKGFoY19pbmIoYWhjLCBwb3J0KzEpIDw8IDgpCisJICAgICAgfCAoYWhjX2luYihhaGMsIHBvcnQrMikgPDwgMTYpCisJICAgICAgfCAoYWhjX2luYihhaGMsIHBvcnQrMykgPDwgMjQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoY19vdXRsKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgcG9ydCwgdWludDMyX3QgdmFsdWUpCit7CisJYWhjX291dGIoYWhjLCBwb3J0LCAodmFsdWUpICYgMHhGRik7CisJYWhjX291dGIoYWhjLCBwb3J0KzEsICgodmFsdWUpID4+IDgpICYgMHhGRik7CisJYWhjX291dGIoYWhjLCBwb3J0KzIsICgodmFsdWUpID4+IDE2KSAmIDB4RkYpOworCWFoY19vdXRiKGFoYywgcG9ydCszLCAoKHZhbHVlKSA+PiAyNCkgJiAweEZGKTsKK30KKworc3RhdGljIF9faW5saW5lIHVpbnQ2NF90CithaGNfaW5xKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgcG9ydCkKK3sKKwlyZXR1cm4gKChhaGNfaW5iKGFoYywgcG9ydCkpCisJICAgICAgfCAoYWhjX2luYihhaGMsIHBvcnQrMSkgPDwgOCkKKwkgICAgICB8IChhaGNfaW5iKGFoYywgcG9ydCsyKSA8PCAxNikKKwkgICAgICB8IChhaGNfaW5iKGFoYywgcG9ydCszKSA8PCAyNCkKKwkgICAgICB8ICgoKHVpbnQ2NF90KWFoY19pbmIoYWhjLCBwb3J0KzQpKSA8PCAzMikKKwkgICAgICB8ICgoKHVpbnQ2NF90KWFoY19pbmIoYWhjLCBwb3J0KzUpKSA8PCA0MCkKKwkgICAgICB8ICgoKHVpbnQ2NF90KWFoY19pbmIoYWhjLCBwb3J0KzYpKSA8PCA0OCkKKwkgICAgICB8ICgoKHVpbnQ2NF90KWFoY19pbmIoYWhjLCBwb3J0KzcpKSA8PCA1NikpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX291dHEoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCBwb3J0LCB1aW50NjRfdCB2YWx1ZSkKK3sKKwlhaGNfb3V0YihhaGMsIHBvcnQsIHZhbHVlICYgMHhGRik7CisJYWhjX291dGIoYWhjLCBwb3J0KzEsICh2YWx1ZSA+PiA4KSAmIDB4RkYpOworCWFoY19vdXRiKGFoYywgcG9ydCsyLCAodmFsdWUgPj4gMTYpICYgMHhGRik7CisJYWhjX291dGIoYWhjLCBwb3J0KzMsICh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKKwlhaGNfb3V0YihhaGMsIHBvcnQrNCwgKHZhbHVlID4+IDMyKSAmIDB4RkYpOworCWFoY19vdXRiKGFoYywgcG9ydCs1LCAodmFsdWUgPj4gNDApICYgMHhGRik7CisJYWhjX291dGIoYWhjLCBwb3J0KzYsICh2YWx1ZSA+PiA0OCkgJiAweEZGKTsKKwlhaGNfb3V0YihhaGMsIHBvcnQrNywgKHZhbHVlID4+IDU2KSAmIDB4RkYpOworfQorCisvKgorICogR2V0IGEgZnJlZSBzY2IuIElmIHRoZXJlIGFyZSBub25lLCBzZWUgaWYgd2UgY2FuIGFsbG9jYXRlIGEgbmV3IFNDQi4KKyAqLworc3RhdGljIF9faW5saW5lIHN0cnVjdCBzY2IgKgorYWhjX2dldF9zY2Ioc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXN0cnVjdCBzY2IgKnNjYjsKKworCWlmICgoc2NiID0gU0xJU1RfRklSU1QoJmFoYy0+c2NiX2RhdGEtPmZyZWVfc2NicykpID09IE5VTEwpIHsKKwkJYWhjX2FsbG9jX3NjYnMoYWhjKTsKKwkJc2NiID0gU0xJU1RfRklSU1QoJmFoYy0+c2NiX2RhdGEtPmZyZWVfc2Nicyk7CisJCWlmIChzY2IgPT0gTlVMTCkKKwkJCXJldHVybiAoTlVMTCk7CisJfQorCVNMSVNUX1JFTU9WRV9IRUFEKCZhaGMtPnNjYl9kYXRhLT5mcmVlX3NjYnMsIGxpbmtzLnNsZSk7CisJcmV0dXJuIChzY2IpOworfQorCisvKgorICogUmV0dXJuIGFuIFNDQiByZXNvdXJjZSB0byB0aGUgZnJlZSBsaXN0LgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX2ZyZWVfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqc2NiKQoreyAgICAgICAKKwlzdHJ1Y3QgaGFyZHdhcmVfc2NiICpoc2NiOworCisJaHNjYiA9IHNjYi0+aHNjYjsKKwkvKiBDbGVhbiB1cCBmb3IgdGhlIG5leHQgdXNlciAqLworCWFoYy0+c2NiX2RhdGEtPnNjYmluZGV4W2hzY2ItPnRhZ10gPSBOVUxMOworCXNjYi0+ZmxhZ3MgPSBTQ0JfRlJFRTsKKwloc2NiLT5jb250cm9sID0gMDsKKworCVNMSVNUX0lOU0VSVF9IRUFEKCZhaGMtPnNjYl9kYXRhLT5mcmVlX3NjYnMsIHNjYiwgbGlua3Muc2xlKTsKKworCS8qIE5vdGlmeSB0aGUgT1NNIHRoYXQgYSByZXNvdXJjZSBpcyBub3cgYXZhaWxhYmxlLiAqLworCWFoY19wbGF0Zm9ybV9zY2JfZnJlZShhaGMsIHNjYik7Cit9CisKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3Qgc2NiICoKK2FoY19sb29rdXBfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgdGFnKQoreworCXN0cnVjdCBzY2IqIHNjYjsKKworCXNjYiA9IGFoYy0+c2NiX2RhdGEtPnNjYmluZGV4W3RhZ107CisJaWYgKHNjYiAhPSBOVUxMKQorCQlhaGNfc3luY19zY2IoYWhjLCBzY2IsCisJCQkgICAgIEJVU19ETUFTWU5DX1BPU1RSRUFEfEJVU19ETUFTWU5DX1BPU1RXUklURSk7CisJcmV0dXJuIChzY2IpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX3N3YXBfd2l0aF9uZXh0X2hzY2Ioc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJc3RydWN0IGhhcmR3YXJlX3NjYiAqcV9oc2NiOworCXVfaW50ICBzYXZlZF90YWc7CisKKwkvKgorCSAqIE91ciBxdWV1aW5nIG1ldGhvZCBpcyBhIGJpdCB0cmlja3kuICBUaGUgY2FyZAorCSAqIGtub3dzIGluIGFkdmFuY2Ugd2hpY2ggSFNDQiB0byBkb3dubG9hZCwgYW5kIHdlCisJICogY2FuJ3QgZGlzYXBwb2ludCBpdC4gIFRvIGFjaGlldmUgdGhpcywgdGhlIG5leHQKKwkgKiBTQ0IgdG8gZG93bmxvYWQgaXMgc2F2ZWQgb2ZmIGluIGFoYy0+bmV4dF9xdWV1ZWRfc2NiLgorCSAqIFdoZW4gd2UgYXJlIGNhbGxlZCB0byBxdWV1ZSAiYW4gYXJiaXRyYXJ5IHNjYiIsCisJICogd2UgY29weSB0aGUgY29udGVudHMgb2YgdGhlIGluY29taW5nIEhTQ0IgdG8gdGhlIG9uZQorCSAqIHRoZSBzZXF1ZW5jZXIga25vd3MgYWJvdXQsIHN3YXAgSFNDQiBwb2ludGVycyBhbmQKKwkgKiBmaW5hbGx5IGFzc2lnbiB0aGUgU0NCIHRvIHRoZSB0YWcgaW5kZXhlZCBsb2NhdGlvbgorCSAqIGluIHRoZSBzY2JfYXJyYXkuICBUaGlzIG1ha2VzIHN1cmUgdGhhdCB3ZSBjYW4gc3RpbGwKKwkgKiBsb2NhdGUgdGhlIGNvcnJlY3QgU0NCIGJ5IFNDQl9UQUcuCisJICovCisJcV9oc2NiID0gYWhjLT5uZXh0X3F1ZXVlZF9zY2ItPmhzY2I7CisJc2F2ZWRfdGFnID0gcV9oc2NiLT50YWc7CisJbWVtY3B5KHFfaHNjYiwgc2NiLT5oc2NiLCBzaXplb2YoKnNjYi0+aHNjYikpOworCWlmICgoc2NiLT5mbGFncyAmIFNDQl9DREIzMl9QVFIpICE9IDApIHsKKwkJcV9oc2NiLT5zaGFyZWRfZGF0YS5jZGJfcHRyID0KKwkJICAgIGFoY19odG9sZTMyKGFoY19oc2NiX2J1c2FkZHIoYWhjLCBxX2hzY2ItPnRhZykKKwkJCSAgICAgICsgb2Zmc2V0b2Yoc3RydWN0IGhhcmR3YXJlX3NjYiwgY2RiMzIpKTsKKwl9CisJcV9oc2NiLT50YWcgPSBzYXZlZF90YWc7CisJcV9oc2NiLT5uZXh0ID0gc2NiLT5oc2NiLT50YWc7CisKKwkvKiBOb3cgc3dhcCBIU0NCIHBvaW50ZXJzLiAqLworCWFoYy0+bmV4dF9xdWV1ZWRfc2NiLT5oc2NiID0gc2NiLT5oc2NiOworCXNjYi0+aHNjYiA9IHFfaHNjYjsKKworCS8qIE5vdyBkZWZpbmUgdGhlIG1hcHBpbmcgZnJvbSB0YWcgdG8gU0NCIGluIHRoZSBzY2JpbmRleCAqLworCWFoYy0+c2NiX2RhdGEtPnNjYmluZGV4W3NjYi0+aHNjYi0+dGFnXSA9IHNjYjsKK30KKworLyoKKyAqIFRlbGwgdGhlIHNlcXVlbmNlciBhYm91dCBhIG5ldyB0cmFuc2FjdGlvbiB0byBleGVjdXRlLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX3F1ZXVlX3NjYihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlhaGNfc3dhcF93aXRoX25leHRfaHNjYihhaGMsIHNjYik7CisKKwlpZiAoc2NiLT5oc2NiLT50YWcgPT0gU0NCX0xJU1RfTlVMTAorCSB8fCBzY2ItPmhzY2ItPm5leHQgPT0gU0NCX0xJU1RfTlVMTCkKKwkJcGFuaWMoIkF0dGVtcHQgdG8gcXVldWUgaW52YWxpZCBTQ0IgdGFnICV4OiV4XG4iLAorCQkgICAgICBzY2ItPmhzY2ItPnRhZywgc2NiLT5oc2NiLT5uZXh0KTsKKworCS8qCisJICogU2V0dXAgZGF0YSAib2RkbmVzcyIuCisJICovCisJc2NiLT5oc2NiLT5sdW4gJj0gTElEOworCWlmIChhaGNfZ2V0X3RyYW5zZmVyX2xlbmd0aChzY2IpICYgMHgxKQorCQlzY2ItPmhzY2ItPmx1biB8PSBTQ0JfWEZFUkxFTl9PREQ7CisKKwkvKgorCSAqIEtlZXAgYSBoaXN0b3J5IG9mIFNDQnMgd2UndmUgZG93bmxvYWRlZCBpbiB0aGUgcWluZmlmby4KKwkgKi8KKwlhaGMtPnFpbmZpZm9bYWhjLT5xaW5maWZvbmV4dCsrXSA9IHNjYi0+aHNjYi0+dGFnOworCisJLyoKKwkgKiBNYWtlIHN1cmUgb3VyIGRhdGEgaXMgY29uc2lzdGVudCBmcm9tIHRoZQorCSAqIHBlcnNwZWN0aXZlIG9mIHRoZSBhZGFwdGVyLgorCSAqLworCWFoY19zeW5jX3NjYihhaGMsIHNjYiwgQlVTX0RNQVNZTkNfUFJFUkVBRHxCVVNfRE1BU1lOQ19QUkVXUklURSk7CisKKwkvKiBUZWxsIHRoZSBhZGFwdGVyIGFib3V0IHRoZSBuZXdseSBxdWV1ZWQgU0NCICovCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpICE9IDApIHsKKwkJYWhjX291dGIoYWhjLCBITlNDQl9RT0ZGLCBhaGMtPnFpbmZpZm9uZXh0KTsKKwl9IGVsc2UgeworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQVVUT1BBVVNFKSA9PSAwKQorCQkJYWhjX3BhdXNlKGFoYyk7CisJCWFoY19vdXRiKGFoYywgS0VSTkVMX1FJTlBPUywgYWhjLT5xaW5maWZvbmV4dCk7CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19BVVRPUEFVU0UpID09IDApCisJCQlhaGNfdW5wYXVzZShhaGMpOworCX0KK30KKworc3RhdGljIF9faW5saW5lIHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEgKgorYWhjX2dldF9zZW5zZV9idWYoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJaW50IG9mZnNldDsKKworCW9mZnNldCA9IHNjYiAtIGFoYy0+c2NiX2RhdGEtPnNjYmFycmF5OworCXJldHVybiAoJmFoYy0+c2NiX2RhdGEtPnNlbnNlW29mZnNldF0pOworfQorCitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKK2FoY19nZXRfc2Vuc2VfYnVmYWRkcihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlpbnQgb2Zmc2V0OworCisJb2Zmc2V0ID0gc2NiIC0gYWhjLT5zY2JfZGF0YS0+c2NiYXJyYXk7CisJcmV0dXJuIChhaGMtPnNjYl9kYXRhLT5zZW5zZV9idXNhZGRyCisJICAgICAgKyAob2Zmc2V0ICogc2l6ZW9mKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEpKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBJbnRlcnJ1cHQgUHJvY2Vzc2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGNfc3luY19xb3V0ZmlmbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCBvcCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGNfc3luY190cWluZmlmbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCBvcCk7CitzdGF0aWMgX19pbmxpbmUgdV9pbnQJYWhjX2NoZWNrX2NtZGNtcGx0cXVldWVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgX19pbmxpbmUgaW50CWFoY19pbnRyKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfc3luY19xb3V0ZmlmbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCBvcCkKK3sKKwlhaGNfZG1hbWFwX3N5bmMoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsIGFoYy0+c2hhcmVkX2RhdGFfZG1hbWFwLAorCQkJLypvZmZzZXQqLzAsIC8qbGVuKi8yNTYsIG9wKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoY19zeW5jX3RxaW5maWZvKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgaW50IG9wKQoreworI2lmZGVmIEFIQ19UQVJHRVRfTU9ERQorCWlmICgoYWhjLT5mbGFncyAmIEFIQ19UQVJHRVRST0xFKSAhPSAwKSB7CisJCWFoY19kbWFtYXBfc3luYyhhaGMsIGFoYy0+c2hhcmVkX2RhdGFfZG1hdCwKKwkJCQlhaGMtPnNoYXJlZF9kYXRhX2RtYW1hcCwKKwkJCQlhaGNfdGFyZ2V0Y21kX29mZnNldChhaGMsIDApLAorCQkJCXNpemVvZihzdHJ1Y3QgdGFyZ2V0X2NtZCkgKiBBSENfVE1PREVfQ01EUywKKwkJCQlvcCk7CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBTZWUgaWYgdGhlIGZpcm13YXJlIGhhcyBwb3N0ZWQgYW55IGNvbXBsZXRlZCBjb21tYW5kcworICogaW50byBvdXIgaW4tY29yZSBjb21tYW5kIGNvbXBsZXRlIGZpZm9zLgorICovCisjZGVmaW5lIEFIQ19SVU5fUU9VVEZJRk8gMHgxCisjZGVmaW5lIEFIQ19SVU5fVFFJTkZJRk8gMHgyCitzdGF0aWMgX19pbmxpbmUgdV9pbnQKK2FoY19jaGVja19jbWRjbXBsdHF1ZXVlcyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJdV9pbnQgcmV0dmFsOworCisJcmV0dmFsID0gMDsKKwlhaGNfZG1hbWFwX3N5bmMoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsIGFoYy0+c2hhcmVkX2RhdGFfZG1hbWFwLAorCQkJLypvZmZzZXQqL2FoYy0+cW91dGZpZm9uZXh0LCAvKmxlbiovMSwKKwkJCUJVU19ETUFTWU5DX1BPU1RSRUFEKTsKKwlpZiAoYWhjLT5xb3V0Zmlmb1thaGMtPnFvdXRmaWZvbmV4dF0gIT0gU0NCX0xJU1RfTlVMTCkKKwkJcmV0dmFsIHw9IEFIQ19SVU5fUU9VVEZJRk87CisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1RBUkdFVFJPTEUpICE9IDAKKwkgJiYgKGFoYy0+ZmxhZ3MgJiBBSENfVFFJTkZJRk9fQkxPQ0tFRCkgPT0gMCkgeworCQlhaGNfZG1hbWFwX3N5bmMoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsCisJCQkJYWhjLT5zaGFyZWRfZGF0YV9kbWFtYXAsCisJCQkJYWhjX3RhcmdldGNtZF9vZmZzZXQoYWhjLCBhaGMtPnRxaW5maWZvZm5leHQpLAorCQkJCS8qbGVuKi9zaXplb2Yoc3RydWN0IHRhcmdldF9jbWQpLAorCQkJCUJVU19ETUFTWU5DX1BPU1RSRUFEKTsKKwkJaWYgKGFoYy0+dGFyZ2V0Y21kc1thaGMtPnRxaW5maWZvbmV4dF0uY21kX3ZhbGlkICE9IDApCisJCQlyZXR2YWwgfD0gQUhDX1JVTl9UUUlORklGTzsKKwl9CisjZW5kaWYKKwlyZXR1cm4gKHJldHZhbCk7Cit9CisKKy8qCisgKiBDYXRjaCBhbiBpbnRlcnJ1cHQgZnJvbSB0aGUgYWRhcHRlcgorICovCitzdGF0aWMgX19pbmxpbmUgaW50CithaGNfaW50cihzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJdV9pbnQJaW50c3RhdDsKKworCWlmICgoYWhjLT5wYXVzZSAmIElOVEVOKSA9PSAwKSB7CisJCS8qCisJCSAqIE91ciBpbnRlcnJ1cHQgaXMgbm90IGVuYWJsZWQgb24gdGhlIGNoaXAKKwkJICogYW5kIG1heSBiZSBkaXNhYmxlZCBmb3IgcmUtZW50cmFuY3kgcmVhc29ucywKKwkJICogc28ganVzdCByZXR1cm4uICBUaGlzIGlzIGxpa2VseSBqdXN0IGEgc2hhcmVkCisJCSAqIGludGVycnVwdC4KKwkJICovCisJCXJldHVybiAoMCk7CisJfQorCS8qCisJICogSW5zdGVhZCBvZiBkaXJlY3RseSByZWFkaW5nIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyLAorCSAqIGluZmVyIHRoZSBjYXVzZSBvZiB0aGUgaW50ZXJydXB0IGJ5IGNoZWNraW5nIG91ciBpbi1jb3JlCisJICogY29tcGxldGlvbiBxdWV1ZXMuICBUaGlzIGF2b2lkcyBhIGNvc3RseSBQQ0kgYnVzIHJlYWQgaW4KKwkgKiBtb3N0IGNhc2VzLgorCSAqLworCWlmICgoYWhjLT5mbGFncyAmIChBSENfQUxMX0lOVEVSUlVQVFN8QUhDX0VER0VfSU5URVJSVVBUKSkgPT0gMAorCSAmJiAoYWhjX2NoZWNrX2NtZGNtcGx0cXVldWVzKGFoYykgIT0gMCkpCisJCWludHN0YXQgPSBDTURDTVBMVDsKKwllbHNlIHsKKwkJaW50c3RhdCA9IGFoY19pbmIoYWhjLCBJTlRTVEFUKTsKKwl9CisKKwlpZiAoKGludHN0YXQgJiBJTlRfUEVORCkgPT0gMCkgeworI2lmIEFIQ19QQ0lfQ09ORklHID4gMAorCQlpZiAoYWhjLT51bnNvbGljaXRlZF9pbnRzID4gNTAwKSB7CisJCQlhaGMtPnVuc29saWNpdGVkX2ludHMgPSAwOworCQkJaWYgKChhaGMtPmNoaXAgJiBBSENfUENJKSAhPSAwCisJCQkgJiYgKGFoY19pbmIoYWhjLCBFUlJPUikgJiBQQ0lFUlJTVEFUKSAhPSAwKQorCQkJCWFoYy0+YnVzX2ludHIoYWhjKTsKKwkJfQorI2VuZGlmCisJCWFoYy0+dW5zb2xpY2l0ZWRfaW50cysrOworCQlyZXR1cm4gKDApOworCX0KKwlhaGMtPnVuc29saWNpdGVkX2ludHMgPSAwOworCisJaWYgKGludHN0YXQgJiBDTURDTVBMVCkgeworCQlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSQ01ESU5UKTsKKworCQkvKgorCQkgKiBFbnN1cmUgdGhhdCB0aGUgY2hpcCBzZWVzIHRoYXQgd2UndmUgY2xlYXJlZAorCQkgKiB0aGlzIGludGVycnVwdCBiZWZvcmUgd2Ugd2FsayB0aGUgb3V0cHV0IGZpZm8uCisJCSAqIE90aGVyd2lzZSwgd2UgbWF5LCBkdWUgdG8gcG9zdGVkIGJ1cyB3cml0ZXMsCisJCSAqIGNsZWFyIHRoZSBpbnRlcnJ1cHQgYWZ0ZXIgd2UgZmluaXNoIHRoZSBzY2FuLAorCQkgKiBhbmQgYWZ0ZXIgdGhlIHNlcXVlbmNlciBoYXMgYWRkZWQgbmV3IGVudHJpZXMKKwkJICogYW5kIGFzc2VydGVkIHRoZSBpbnRlcnJ1cHQgYWdhaW4uCisJCSAqLworCQlhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOworCQlhaGNfcnVuX3FvdXRmaWZvKGFoYyk7CisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19UQVJHRVRST0xFKSAhPSAwKQorCQkJYWhjX3J1bl90cWluZmlmbyhhaGMsIC8qcGF1c2VkKi9GQUxTRSk7CisjZW5kaWYKKwl9CisKKwkvKgorCSAqIEhhbmRsZSBzdGF0dXNlcyB0aGF0IG1heSBpbnZhbGlkYXRlIG91ciBjYWNoZWQKKwkgKiBjb3B5IG9mIElOVFNUQVQgc2VwYXJhdGVseS4KKwkgKi8KKwlpZiAoaW50c3RhdCA9PSAweEZGICYmIChhaGMtPmZlYXR1cmVzICYgQUhDX1JFTU9WQUJMRSkgIT0gMCkgeworCQkvKiBIb3QgZWplY3QuICBEbyBub3RoaW5nICovCisJfSBlbHNlIGlmIChpbnRzdGF0ICYgQlJLQURSSU5UKSB7CisJCWFoY19oYW5kbGVfYnJrYWRyaW50KGFoYyk7CisJfSBlbHNlIGlmICgoaW50c3RhdCAmIChTRVFJTlR8U0NTSUlOVCkpICE9IDApIHsKKworCQlhaGNfcGF1c2VfYnVnX2ZpeChhaGMpOworCisJCWlmICgoaW50c3RhdCAmIFNFUUlOVCkgIT0gMCkKKwkJCWFoY19oYW5kbGVfc2VxaW50KGFoYywgaW50c3RhdCk7CisKKwkJaWYgKChpbnRzdGF0ICYgU0NTSUlOVCkgIT0gMCkKKwkJCWFoY19oYW5kbGVfc2NzaWludChhaGMsIGludHN0YXQpOworCX0KKwlyZXR1cm4gKDEpOworfQorCisjZW5kaWYgIC8qIF9BSUM3WFhYX0lOTElORV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxYzZhYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMKQEAgLTAsMCArMSw1MDQzIEBACisvKgorICogQWRhcHRlYyBBSUM3eHh4IGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2xpbnV4L2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMjMjM1ICQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgSm9obiBBeWNvY2sKKyAqICAgVGhlIFVuaXZlcnNpdHkgb2YgQ2FsZ2FyeSBEZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBTb3VyY2VzIGluY2x1ZGUgdGhlIEFkYXB0ZWMgMTc0MCBkcml2ZXIgKGFoYTE3NDAuYyksIHRoZSBVbHRyYXN0b3IgMjRGCisgKiBkcml2ZXIgKHVsdHJhc3Rvci5jKSwgdmFyaW91cyBMaW51eCBrZXJuZWwgc291cmNlLCB0aGUgQWRhcHRlYyBFSVNBCisgKiBjb25maWcgZmlsZSAoIWFkcDc3NzEuY2ZnKSwgdGhlIEFkYXB0ZWMgQUhBLTI3NDBBIFNlcmllcyBVc2VyJ3MgR3VpZGUsCisgKiB0aGUgTGludXggS2VybmVsIEhhY2tlcidzIEd1aWRlLCBXcml0aW5nIGEgU0NTSSBEZXZpY2UgRHJpdmVyIGZvciBMaW51eCwKKyAqIHRoZSBBZGFwdGVjIDE1NDIgZHJpdmVyIChhaGExNTQyLmMpLCB0aGUgQWRhcHRlYyBFSVNBIG92ZXJsYXkgZmlsZQorICogKGFkcDc3NzAub3ZsKSwgdGhlIEFkYXB0ZWMgQUhBLTI3NDAgU2VyaWVzIFRlY2huaWNhbCBSZWZlcmVuY2UgTWFudWFsLAorICogdGhlIEFkYXB0ZWMgQUlDLTc3NzAgRGF0YSBCb29rLCB0aGUgQU5TSSBTQ1NJIHNwZWNpZmljYXRpb24sIHRoZQorICogQU5TSSBTQ1NJLTIgc3BlY2lmaWNhdGlvbiAoZHJhZnQgMTBjKSwgLi4uCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgTW9kaWZpY2F0aW9ucyBieSBEYW5pZWwgTS4gRWlzY2hlbiAoZGVpc2NoZW5AaXdvcmtzLkludGVyV29ya3Mub3JnKToKKyAqCisgKiAgU3Vic3RhbnRpYWxseSBtb2RpZmllZCB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHdpZGUgYW5kIHR3aW4gYnVzCisgKiAgYWRhcHRlcnMsIERNQWluZyBvZiBTQ0JzLCB0YWdnZWQgcXVldWVpbmcsIElSUSBzaGFyaW5nLCBidWcgZml4ZXMsCisgKiAgU0NCIHBhZ2luZywgYW5kIG90aGVyIHJld29yayBvZiB0aGUgY29kZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMDAgSnVzdGluIFQuIEdpYmJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgVGhhbmtzIGFsc28gZ28gdG8gKGluIGFscGhhYmV0aWNhbCBvcmRlcikgdGhlIGZvbGxvd2luZzoKKyAqCisgKiAgICBSb3J5IEJvbHQgICAgIC0gU2VxdWVuY2VyIGJ1ZyBmaXhlcworICogICAgSmF5IEVzdGFicm9vayAtIEluaXRpYWwgREVDIEFscGhhIHN1cHBvcnQKKyAqICAgIERvdWcgTGVkZm9yZCAgLSBNdWNoIG5lZWRlZCBhYm9ydC9yZXNldCBidWcgZml4ZXMKKyAqICAgIEthaSBNYWtpc2FyYSAgLSBETUFpbmcgb2YgU0NCcworICoKKyAqICBBIEJvb3QgdGltZSBvcHRpb24gd2FzIGFsc28gYWRkZWQgZm9yIG5vdCByZXNldHRpbmcgdGhlIHNjc2kgYnVzLgorICoKKyAqICAgIEZvcm06ICBhaWM3eHh4PWV4dGVuZGVkCisgKiAgICAgICAgICAgYWljN3h4eD1ub19yZXNldAorICogICAgICAgICAgIGFpYzd4eHg9dmVyYm9zZQorICoKKyAqICBEYW5pZWwgTS4gRWlzY2hlbiwgZGVpc2NoZW5AaXdvcmtzLkludGVyV29ya3Mub3JnLCAxLzIzLzk3CisgKgorICogIElkOiBhaWM3eHh4LmMsdiA0LjEgMTk5Ny8wNi8xMiAwODoyMzo0MiBkZWFuZyBFeHAKKyAqLworCisvKgorICogRnVydGhlciBkcml2ZXIgbW9kaWZpY2F0aW9ucyBtYWRlIGJ5IERvdWcgTGVkZm9yZCA8ZGxlZGZvcmRAcmVkaGF0LmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OSBEb3VnIExlZGZvcmQKKyAqCisgKiBUaGVzZSBjaGFuZ2VzIGFyZSByZWxlYXNlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNpbmcgdGVybXMgYXMgdGhlIEZyZWVCU0QKKyAqIGRyaXZlciB3cml0dGVuIGJ5IEp1c3RpbiBHaWJicy4gIFBsZWFzZSBzZWUgaGlzIENvcHlyaWdodCBub3RpY2UgYWJvdmUKKyAqIGZvciB0aGUgZXhhY3QgdGVybXMgYW5kIGNvbmRpdGlvbnMgY292ZXJpbmcgbXkgY2hhbmdlcyBhcyB3ZWxsIGFzIHRoZQorICogd2FycmFudHkgc3RhdGVtZW50LgorICoKKyAqIE1vZGlmaWNhdGlvbnMgbWFkZSB0byB0aGUgYWljN3h4eC5jLHYgNC4xIGRyaXZlciBmcm9tIERhbiBFaXNjaGVuIGluY2x1ZGUKKyAqIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG86CisgKgorICogIDE6IEltcG9ydCBvZiB0aGUgbGF0ZXN0IEZyZWVCU0Qgc2VxdWVuY2VyIGNvZGUgZm9yIHRoaXMgZHJpdmVyCisgKiAgMjogTW9kaWZpY2F0aW9uIG9mIGtlcm5lbCBjb2RlIHRvIGFjY29tbW9kYXRlIGRpZmZlcmVudCBzZXF1ZW5jZXIgc2VtYW50aWNzCisgKiAgMzogRXh0ZW5zaXZlIGNoYW5nZXMgdGhyb3VnaG91dCBrZXJuZWwgcG9ydGlvbiBvZiBkcml2ZXIgdG8gaW1wcm92ZQorICogICAgIGFib3J0L3Jlc2V0IHByb2Nlc3NpbmcgYW5kIGVycm9yIGhhbm5kbGluZworICogIDQ6IE90aGVyIHdvcmsgY29udHJpYnV0ZWQgYnkgdmFyaW91cyBwZW9wbGUgb24gdGhlIEludGVybmV0CisgKiAgNTogQ2hhbmdlcyB0byBwcmludGsgaW5mb3JtYXRpb24gYW5kIHZlcmJvc2l0eSBzZWxlY3Rpb24gY29kZQorICogIDY6IEdlbmVyYWwgcmVsaWFiaWxpdHkgcmVsYXRlZCBjaGFuZ2VzLCBlc3BlY2lhbGx5IGluIElSUSBtYW5hZ2VtZW50CisgKiAgNzogTW9kaWZpY2F0aW9ucyB0byB0aGUgZGVmYXVsdCBwcm9iZS9hdHRhY2ggb3JkZXIgZm9yIHN1cHBvcnRlZCBjYXJkcworICogIDg6IFNNUCBmcmllbmRsaW5lc3MgaGFzIGJlZW4gaW1wcm92ZWQKKyAqCisgKi8KKworI2luY2x1ZGUgImFpYzd4eHhfb3NtLmgiCisjaW5jbHVkZSAiYWljN3h4eF9pbmxpbmUuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKworLyoKKyAqIEluY2x1ZGUgYWljbGliLmMgYXMgcGFydCBvZiBvdXIKKyAqICJtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBoYXJkIiB3b3JrIGFyb3VuZC4KKyAqLworI2luY2x1ZGUgImFpY2xpYi5jIgorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgkJLyogX19zZXR1cCAqLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaW5jbHVkZSAic2QuaCIJCQkvKiBGb3IgZ2VvbWV0cnkgZGV0ZWN0aW9uICovCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CQkvKiBGb3IgZmV0Y2hpbmcgc3lzdGVtIG1lbW9yeSBzaXplICovCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CQkvKiBGb3IgYmxvY2tfc2l6ZSgpICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogRm9yIHNzbGVlcC9tc2xlZXAgKi8KKworLyoKKyAqIExvY2sgcHJvdGVjdGluZyBtYW5pcHVsYXRpb24gb2YgdGhlIGFoYyBzb2Z0YyBsaXN0LgorICovCitzcGlubG9ja190IGFoY19saXN0X3NwaW5sb2NrOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisvKiBGb3IgZHluYW1pYyBzZ2xpc3Qgc2l6ZSBjYWxjdWxhdGlvbi4gKi8KK3VfaW50IGFoY19saW51eF9uc2VnOworI2VuZGlmCisKKy8qCisgKiBTZXQgdGhpcyB0byB0aGUgZGVsYXkgaW4gc2Vjb25kcyBhZnRlciBTQ1NJIGJ1cyByZXNldC4KKyAqIE5vdGUsIHdlIGhvbm9yIHRoaXMgb25seSBmb3IgdGhlIGluaXRpYWwgYnVzIHJlc2V0LgorICogVGhlIHNjc2kgZXJyb3IgcmVjb3ZlcnkgY29kZSBwZXJmb3JtcyBpdHMgb3duIGJ1cyBzZXR0bGUKKyAqIGRlbGF5IGhhbmRsaW5nIGZvciBlcnJvciByZWNvdmVyeSBhY3Rpb25zLgorICovCisjaWZkZWYgQ09ORklHX0FJQzdYWFhfUkVTRVRfREVMQVlfTVMKKyNkZWZpbmUgQUlDN1hYWF9SRVNFVF9ERUxBWSBDT05GSUdfQUlDN1hYWF9SRVNFVF9ERUxBWV9NUworI2Vsc2UKKyNkZWZpbmUgQUlDN1hYWF9SRVNFVF9ERUxBWSA1MDAwCisjZW5kaWYKKworLyoKKyAqIENvbnRyb2wgY29sbGVjdGlvbiBvZiBTQ1NJIHRyYW5zZmVyIHN0YXRpc3RpY3MgZm9yIHRoZSAvcHJvYyBmaWxlc3lzdGVtLgorICoKKyAqIE5PVEU6IERvIE5PVCBlbmFibGUgdGhpcyB3aGVuIHJ1bm5pbmcgb24ga2VybmVscyB2ZXJzaW9uIDEuMi54IGFuZCBiZWxvdy4KKyAqIE5PVEU6IFRoaXMgZG9lcyBhZmZlY3QgcGVyZm9ybWFuY2Ugc2luY2UgaXQgaGFzIHRvIG1haW50YWluIHN0YXRpc3RpY3MuCisgKi8KKyNpZmRlZiBDT05GSUdfQUlDN1hYWF9QUk9DX1NUQVRTCisjZGVmaW5lIEFJQzdYWFhfUFJPQ19TVEFUUworI2VuZGlmCisKKy8qCisgKiBUbyBjaGFuZ2UgdGhlIGRlZmF1bHQgbnVtYmVyIG9mIHRhZ2dlZCB0cmFuc2FjdGlvbnMgYWxsb3dlZCBwZXItZGV2aWNlLAorICogYWRkIGEgbGluZSB0byB0aGUgbGlsby5jb25mIGZpbGUgbGlrZToKKyAqIGFwcGVuZD0iYWljN3h4eD12ZXJib3NlLHRhZ19pbmZvOnt7MzIsMzIsMzIsMzJ9LHszMiwzMiwzMiwzMn19IgorICogd2hpY2ggd2lsbCByZXN1bHQgaW4gdGhlIGZpcnN0IGZvdXIgZGV2aWNlcyBvbiB0aGUgZmlyc3QgdHdvCisgKiBjb250cm9sbGVycyBiZWluZyBzZXQgdG8gYSB0YWdnZWQgcXVldWUgZGVwdGggb2YgMzIuCisgKgorICogVGhlIHRhZ19jb21tYW5kcyBpcyBhbiBhcnJheSBvZiAxNiB0byBhbGxvdyBmb3Igd2lkZSBhbmQgdHdpbiBhZGFwdGVycy4KKyAqIFR3aW4gYWRhcHRlcnMgd2lsbCB1c2UgaW5kZXhlcyAwLTcgZm9yIGNoYW5uZWwgMCwgYW5kIGluZGV4ZXMgOC0xNQorICogZm9yIGNoYW5uZWwgMS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgdGFnX2NvbW1hbmRzWzE2XTsJLyogQWxsb3cgZm9yIHdpZGUvdHdpbiBhZGFwdGVycy4gKi8KK30gYWRhcHRlcl90YWdfaW5mb190OworCisvKgorICogTW9kaWZ5IHRoaXMgYXMgeW91IHNlZSBmaXQgZm9yIHlvdXIgc3lzdGVtLgorICoKKyAqIDAJCQl0YWdnZWQgcXVldWluZyBkaXNhYmxlZAorICogMSA8PSBuIDw9IDI1MwluID09IG1heCB0YWdzIGV2ZXIgZGlzcGF0Y2hlZC4KKyAqCisgKiBUaGUgZHJpdmVyIHdpbGwgdGhyb3R0bGUgdGhlIG51bWJlciBvZiBjb21tYW5kcyBkaXNwYXRjaGVkIHRvIGEKKyAqIGRldmljZSBpZiBpdCByZXR1cm5zIHF1ZXVlIGZ1bGwuICBGb3IgZGV2aWNlcyB3aXRoIGEgZml4ZWQgbWF4aW11bQorICogcXVldWUgZGVwdGgsIHRoZSBkcml2ZXIgd2lsbCBldmVudHVhbGx5IGRldGVybWluZSB0aGlzIGRlcHRoIGFuZAorICogbG9jayBpdCBpbiAoYSBjb25zb2xlIG1lc3NhZ2UgaXMgcHJpbnRlZCB0byBpbmRpY2F0ZSB0aGF0IGEgbG9jaworICogaGFzIG9jY3VycmVkKS4gIE9uIHNvbWUgZGV2aWNlcywgcXVldWUgZnVsbCBpcyByZXR1cm5lZCBmb3IgYSB0ZW1wb3JhcnkKKyAqIHJlc291cmNlIHNob3J0YWdlLiAgVGhlc2UgZGV2aWNlcyB3aWxsIHJldHVybiBxdWV1ZSBmdWxsIGF0IHZhcnlpbmcKKyAqIGRlcHRocy4gIFRoZSBkcml2ZXIgd2lsbCB0aHJvdHRsZSBiYWNrIHdoZW4gdGhlIHF1ZXVlIGZ1bGxzIG9jY3VyIGFuZAorICogYXR0ZW1wdCB0byBzbG93bHkgaW5jcmVhc2UgdGhlIGRlcHRoIG92ZXIgdGltZSBhcyB0aGUgZGV2aWNlIHJlY292ZXJzCisgKiBmcm9tIHRoZSByZXNvdXJjZSBzaG9ydGFnZS4KKyAqCisgKiBJbiB0aGlzIGV4YW1wbGUsIHRoZSBmaXJzdCBsaW5lIHdpbGwgZGlzYWJsZSB0YWdnZWQgcXVldWVpbmcgZm9yIGFsbAorICogdGhlIGRldmljZXMgb24gdGhlIGZpcnN0IHByb2JlZCBhaWM3eHh4IGFkYXB0ZXIuCisgKgorICogVGhlIHNlY29uZCBsaW5lIGVuYWJsZXMgdGFnZ2VkIHF1ZXVlaW5nIHdpdGggNCBjb21tYW5kcy9MVU4gZm9yIElEcworICogKDAsIDItMTEsIDEzLTE1KSwgZGlzYWJsZXMgdGFnZ2VkIHF1ZXVlaW5nIGZvciBJRCAxMiwgYW5kIHRlbGxzIHRoZQorICogZHJpdmVyIHRvIGF0dGVtcHQgdG8gdXNlIHVwIHRvIDY0IHRhZ3MgZm9yIElEIDEuCisgKgorICogVGhlIHRoaXJkIGxpbmUgaXMgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IGxpbmUuCisgKgorICogVGhlIGZvdXJ0aCBsaW5lIGRpc2FibGVzIHRhZ2dlZCBxdWV1ZWluZyBmb3IgZGV2aWNlcyAwIGFuZCAzLiAgSXQKKyAqIGVuYWJsZXMgdGFnZ2VkIHF1ZXVlaW5nIGZvciB0aGUgb3RoZXIgSURzLCB3aXRoIDE2IGNvbW1hbmRzL0xVTgorICogZm9yIElEcyAxIGFuZCA0LCAxMjcgY29tbWFuZHMvTFVOIGZvciBJRCA4LCBhbmQgNCBjb21tYW5kcy9MVU4gZm9yCisgKiBJRHMgMiwgNS03LCBhbmQgOS0xNS4KKyAqLworCisvKgorICogTk9URTogVGhlIGJlbG93IHN0cnVjdHVyZSBpcyBmb3IgcmVmZXJlbmNlIG9ubHksIHRoZSBhY3R1YWwgc3RydWN0dXJlCisgKiAgICAgICB0byBtb2RpZnkgaW4gb3JkZXIgdG8gY2hhbmdlIHRoaW5ncyBpcyBqdXN0IGJlbG93IHRoaXMgY29tbWVudCBibG9jay4KK2FkYXB0ZXJfdGFnX2luZm9fdCBhaWM3eHh4X3RhZ19pbmZvW10gPQoreworCXt7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH19LAorCXt7NCwgNjQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDAsIDQsIDQsIDR9fSwKKwl7ezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9fSwKKwl7ezAsIDE2LCA0LCAwLCAxNiwgNCwgNCwgNCwgMTI3LCA0LCA0LCA0LCA0LCA0LCA0LCA0fX0KK307CisqLworCisjaWZkZWYgQ09ORklHX0FJQzdYWFhfQ01EU19QRVJfREVWSUNFCisjZGVmaW5lIEFJQzdYWFhfQ01EU19QRVJfREVWSUNFIENPTkZJR19BSUM3WFhYX0NNRFNfUEVSX0RFVklDRQorI2Vsc2UKKyNkZWZpbmUgQUlDN1hYWF9DTURTX1BFUl9ERVZJQ0UgQUhDX01BWF9RVUVVRQorI2VuZGlmCisKKyNkZWZpbmUgQUlDN1hYWF9DT05GSUdFRF9UQUdfQ09NTUFORFMgewkJCQkJXAorCUFJQzdYWFhfQ01EU19QRVJfREVWSUNFLCBBSUM3WFhYX0NNRFNfUEVSX0RFVklDRSwJCVwKKwlBSUM3WFhYX0NNRFNfUEVSX0RFVklDRSwgQUlDN1hYWF9DTURTX1BFUl9ERVZJQ0UsCQlcCisJQUlDN1hYWF9DTURTX1BFUl9ERVZJQ0UsIEFJQzdYWFhfQ01EU19QRVJfREVWSUNFLAkJXAorCUFJQzdYWFhfQ01EU19QRVJfREVWSUNFLCBBSUM3WFhYX0NNRFNfUEVSX0RFVklDRSwJCVwKKwlBSUM3WFhYX0NNRFNfUEVSX0RFVklDRSwgQUlDN1hYWF9DTURTX1BFUl9ERVZJQ0UsCQlcCisJQUlDN1hYWF9DTURTX1BFUl9ERVZJQ0UsIEFJQzdYWFhfQ01EU19QRVJfREVWSUNFLAkJXAorCUFJQzdYWFhfQ01EU19QRVJfREVWSUNFLCBBSUM3WFhYX0NNRFNfUEVSX0RFVklDRSwJCVwKKwlBSUM3WFhYX0NNRFNfUEVSX0RFVklDRSwgQUlDN1hYWF9DTURTX1BFUl9ERVZJQ0UJCVwKK30KKworLyoKKyAqIEJ5IGRlZmF1bHQsIHVzZSB0aGUgbnVtYmVyIG9mIGNvbW1hbmRzIHNwZWNpZmllZCBieQorICogdGhlIHVzZXJzIGtlcm5lbCBjb25maWd1cmF0aW9uLgorICovCitzdGF0aWMgYWRhcHRlcl90YWdfaW5mb190IGFpYzd4eHhfdGFnX2luZm9bXSA9Cit7CisJe0FJQzdYWFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDN1hYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3WFhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzdYWFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDN1hYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3WFhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzdYWFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDN1hYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3WFhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzdYWFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDN1hYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3WFhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzdYWFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDN1hYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3WFhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzdYWFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfQorfTsKKworLyoKKyAqIERWIG9wdGlvbjoKKyAqCisgKiBwb3NpdGl2ZSB2YWx1ZSA9IERWIEVuYWJsZWQKKyAqIHplcm8JCSAgPSBEViBEaXNhYmxlZAorICogbmVnYXRpdmUgdmFsdWUgPSBEViBEZWZhdWx0IGZvciBhZGFwdGVyIHR5cGUvc2VlcHJvbQorICovCisjaWZkZWYgQ09ORklHX0FJQzdYWFhfRFZfU0VUVElORworI2RlZmluZSBBSUM3WFhYX0NPTkZJR0VEX0RWIENPTkZJR19BSUM3WFhYX0RWX1NFVFRJTkcKKyNlbHNlCisjZGVmaW5lIEFJQzdYWFhfQ09ORklHRURfRFYgLTEKKyNlbmRpZgorCitzdGF0aWMgaW50OF90IGFpYzd4eHhfZHZfc2V0dGluZ3NbXSA9Cit7CisJQUlDN1hYWF9DT05GSUdFRF9EViwKKwlBSUM3WFhYX0NPTkZJR0VEX0RWLAorCUFJQzdYWFhfQ09ORklHRURfRFYsCisJQUlDN1hYWF9DT05GSUdFRF9EViwKKwlBSUM3WFhYX0NPTkZJR0VEX0RWLAorCUFJQzdYWFhfQ09ORklHRURfRFYsCisJQUlDN1hYWF9DT05GSUdFRF9EViwKKwlBSUM3WFhYX0NPTkZJR0VEX0RWLAorCUFJQzdYWFhfQ09ORklHRURfRFYsCisJQUlDN1hYWF9DT05GSUdFRF9EViwKKwlBSUM3WFhYX0NPTkZJR0VEX0RWLAorCUFJQzdYWFhfQ09ORklHRURfRFYsCisJQUlDN1hYWF9DT05GSUdFRF9EViwKKwlBSUM3WFhYX0NPTkZJR0VEX0RWLAorCUFJQzdYWFhfQ09ORklHRURfRFYsCisJQUlDN1hYWF9DT05GSUdFRF9EVgorfTsKKworLyoKKyAqIFRoZXJlIHNob3VsZCBiZSBhIHNwZWNpZmljIHJldHVybiB2YWx1ZSBmb3IgdGhpcyBpbiBzY3NpLmgsIGJ1dAorICogaXQgc2VlbXMgdGhhdCBtb3N0IGRyaXZlcnMgaWdub3JlIGl0LgorICovCisjZGVmaW5lIERJRF9VTkRFUkZMT1cgICBESURfRVJST1IKKwordm9pZAorYWhjX3ByaW50X3BhdGgoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJcHJpbnRrKCIoc2NzaSVkOiVjOiVkOiVkKTogIiwKKwkgICAgICAgYWhjLT5wbGF0Zm9ybV9kYXRhLT5ob3N0LT5ob3N0X25vLAorCSAgICAgICBzY2IgIT0gTlVMTCA/IFNDQl9HRVRfQ0hBTk5FTChhaGMsIHNjYikgOiAnWCcsCisJICAgICAgIHNjYiAhPSBOVUxMID8gU0NCX0dFVF9UQVJHRVQoYWhjLCBzY2IpIDogLTEsCisJICAgICAgIHNjYiAhPSBOVUxMID8gU0NCX0dFVF9MVU4oc2NiKSA6IC0xKTsKK30KKworLyoKKyAqIFhYWCAtIHRoZXNlIG9wdGlvbnMgYXBwbHkgdW5pbGF0ZXJhbGx5IHRvIF9hbGxfIDI3NHgvMjg0eC8yOTR4CisgKiAgICAgICBjYXJkcyBpbiB0aGUgc3lzdGVtLiAgVGhpcyBzaG91bGQgYmUgZml4ZWQuICBFeGNlcHRpb25zIHRvIHRoaXMKKyAqICAgICAgIHJ1bGUgYXJlIG5vdGVkIGluIHRoZSBjb21tZW50cy4KKyAqLworCisvKgorICogU2tpcCB0aGUgc2NzaSBidXMgcmVzZXQuICBOb24gMCBtYWtlIHVzIHNraXAgdGhlIHJlc2V0IGF0IHN0YXJ0dXAuICBUaGlzCisgKiBoYXMgbm8gZWZmZWN0IG9uIGFueSBsYXRlciByZXNldHMgdGhhdCBtaWdodCBvY2N1ciBkdWUgdG8gdGhpbmdzIGxpa2UKKyAqIFNDU0kgYnVzIHRpbWVvdXRzLgorICovCitzdGF0aWMgdWludDMyX3QgYWljN3h4eF9ub19yZXNldDsKKworLyoKKyAqIENlcnRhaW4gUENJIG1vdGhlcmJvYXJkcyB3aWxsIHNjYW4gUENJIGRldmljZXMgZnJvbSBoaWdoZXN0IHRvIGxvd2VzdCwKKyAqIG90aGVycyBzY2FuIGZyb20gbG93ZXN0IHRvIGhpZ2hlc3QsIGFuZCB0aGV5IHRlbmQgdG8gZG8gYWxsIGtpbmRzIG9mCisgKiBzdHJhbmdlIHRoaW5ncyB3aGVuIHRoZXkgY29tZSBpbnRvIGNvbnRhY3Qgd2l0aCBQQ0kgYnJpZGdlIGNoaXBzLiAgVGhlCisgKiBuZXQgcmVzdWx0IG9mIGFsbCB0aGlzIGlzIHRoYXQgdGhlIFBDSSBjYXJkIHRoYXQgaXMgYWN0dWFsbHkgdXNlZCB0byBib290CisgKiB0aGUgbWFjaGluZSBpcyB2ZXJ5IGhhcmQgdG8gZGV0ZWN0LiAgTW9zdCBtb3RoZXJib2FyZHMgZ28gZnJvbSBsb3dlc3QKKyAqIFBDSSBzbG90IG51bWJlciB0byBoaWdoZXN0LCBhbmQgdGhlIGZpcnN0IFNDU0kgY29udHJvbGxlciBmb3VuZCBpcyB0aGUKKyAqIG9uZSB5b3UgYm9vdCBmcm9tLiAgVGhlIG9ubHkgZXhjZXB0aW9ucyB0byB0aGlzIGFyZSB3aGVuIGEgY29udHJvbGxlcgorICogaGFzIGl0cyBCSU9TIGRpc2FibGVkLiAgU28sIHdlIGJ5IGRlZmF1bHQgc29ydCBhbGwgb2Ygb3VyIFNDU0kgY29udHJvbGxlcnMKKyAqIGZyb20gbG93ZXN0IFBDSSBzbG90IG51bWJlciB0byBoaWdoZXN0IFBDSSBzbG90IG51bWJlci4gIFdlIGFsc28gZm9yY2UKKyAqIGFsbCBjb250cm9sbGVycyB3aXRoIHRoZWlyIEJJT1MgZGlzYWJsZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gIFRoaXMKKyAqIHdvcmtzIG9uICphbG1vc3QqIGFsbCBjb21wdXRlcnMuICBXaGVyZSBpdCBkb2Vzbid0IHdvcmssIHdlIGhhdmUgdGhpcworICogb3B0aW9uLiAgU2V0dGluZyB0aGlzIG9wdGlvbiB0byBub24tMCB3aWxsIHJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBzb3J0CisgKiB0byBoaWdoZXN0IGZpcnN0LCB0aGVuIGxvd2VzdCwgYnV0IHdpbGwgc3RpbGwgbGVhdmUgY2FyZHMgd2l0aCB0aGVpciBCSU9TCisgKiBkaXNhYmxlZCBhdCB0aGUgdmVyeSBlbmQuICBUaGF0IHNob3VsZCBmaXggZXZlcnlvbmUgdXAgdW5sZXNzIHRoZXJlIGFyZQorICogcmVhbGx5IHN0cmFuZ2UgY2lydW1zdGFuY2VzLgorICovCitzdGF0aWMgdWludDMyX3QgYWljN3h4eF9yZXZlcnNlX3NjYW47CisKKy8qCisgKiBTaG91bGQgd2UgZm9yY2UgRVhURU5ERUQgdHJhbnNsYXRpb24gb24gYSBjb250cm9sbGVyLgorICogICAgIDAgPT0gVXNlIHdoYXRldmVyIGlzIGluIHRoZSBTRUVQUk9NIG9yIGRlZmF1bHQgdG8gb2ZmCisgKiAgICAgMSA9PSBVc2Ugd2hhdGV2ZXIgaXMgaW4gdGhlIFNFRVBST00gb3IgZGVmYXVsdCB0byBvbgorICovCitzdGF0aWMgdWludDMyX3QgYWljN3h4eF9leHRlbmRlZDsKKworLyoKKyAqIFBDSSBidXMgcGFyaXR5IGNoZWNraW5nIG9mIHRoZSBBZGFwdGVjIGNvbnRyb2xsZXJzLiAgVGhpcyBpcyBzb21ld2hhdAorICogZHViaW91cyBhdCBiZXN0LiAgVG8gbXkga25vd2xlZGdlLCB0aGlzIG9wdGlvbiBoYXMgbmV2ZXIgYWN0dWFsbHkKKyAqIHNvbHZlZCBhIFBDSSBwYXJpdHkgcHJvYmxlbSwgYnV0IG9uIGNlcnRhaW4gbWFjaGluZXMgd2l0aCBicm9rZW4gUENJCisgKiBjaGlwc2V0IGNvbmZpZ3VyYXRpb25zIHdoZXJlIHN0cmF5IFBDSSB0cmFuc2FjdGlvbnMgd2l0aCBiYWQgcGFyaXR5IGFyZQorICogdGhlIG5vcm0gcmF0aGVyIHRoYW4gdGhlIGV4Y2VwdGlvbiwgdGhlIGVycm9yIG1lc3NhZ2VzIGNhbiBiZSBvdmVyd2VsbWluZy4KKyAqIEl0J3MgaW5jbHVkZWQgaW4gdGhlIGRyaXZlciBmb3IgY29tcGxldGVuZXNzLgorICogICAwCSAgID0gU2h1dCBvZmYgUENJIHBhcml0eSBjaGVjaworICogICBub24tMCA9IHJldmVyc2UgcG9sYXJpdHkgcGNpIHBhcml0eSBjaGVja2luZworICovCitzdGF0aWMgdWludDMyX3QgYWljN3h4eF9wY2lfcGFyaXR5ID0gfjA7CisKKy8qCisgKiBDZXJ0YWluIG5ld2VyIG1vdGhlcmJvYXJkcyBoYXZlIHB1dCBuZXcgUENJIGJhc2VkIGRldmljZXMgaW50byB0aGUKKyAqIElPIHNwYWNlcyB0aGF0IHVzZWQgdG8gdHlwaWNhbGx5IGJlIG9jY3VwaWVkIGJ5IFZMQiBvciBFSVNBIGNhcmRzLgorICogVGhpcyBvdmVybGFwIGNhbiBjYXVzZSB0aGVzZSBuZXdlciBtb3RoZXJib2FyZHMgdG8gbG9jayB1cCB3aGVuIHNjYW5uZWQKKyAqIGZvciBvbGRlciBFSVNBIGFuZCBWTEIgZGV2aWNlcy4gIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gbm9uLTAgd2lsbAorICogY2F1c2UgdGhlIGRyaXZlciB0byBza2lwIHNjYW5uaW5nIGZvciBhbnkgVkxCIG9yIEVJU0EgY29udHJvbGxlcnMgYW5kCisgKiBvbmx5IHN1cHBvcnQgdGhlIFBDSSBjb250cm9sbGVycy4gIE5PVEU6IHRoaXMgbWVhbnMgdGhhdCBpZiB0aGUga2VybmVsCisgKiBvcyBjb21waWxlZCB3aXRoIFBDSSBzdXBwb3J0IGRpc2FibGVkLCB0aGVuIHNldHRpbmcgdGhpcyB0byBub24tMAorICogd291bGQgcmVzdWx0IGluIG5ldmVyIGZpbmRpbmcgYW55IGRldmljZXMgOikKKyAqLworI2lmbmRlZiBDT05GSUdfQUlDN1hYWF9QUk9CRV9FSVNBX1ZMCit1aW50MzJfdCBhaWM3eHh4X3Byb2JlX2Vpc2Ffdmw7CisjZWxzZQordWludDMyX3QgYWljN3h4eF9wcm9iZV9laXNhX3ZsID0gfjA7CisjZW5kaWYKKworLyoKKyAqIFRoZXJlIGFyZSBsb3RzIG9mIGJyb2tlbiBjaGlwc2V0cyBpbiB0aGUgd29ybGQuICBTb21lIG9mIHRoZW0gd2lsbAorICogdmlvbGF0ZSB0aGUgUENJIHNwZWMgd2hlbiB3ZSBpc3N1ZSBieXRlIHNpemVkIG1lbW9yeSB3cml0ZXMgdG8gb3VyCisgKiBjb250cm9sbGVyLiAgSS9PIG1hcHBlZCByZWdpc3RlciBhY2Nlc3MsIGlmIGFsbG93ZWQgYnkgdGhlIGdpdmVuCisgKiBwbGF0Zm9ybSwgd2lsbCB3b3JrIGluIGFsbW9zdCBhbGwgY2FzZXMuCisgKi8KK3VpbnQzMl90IGFpYzd4eHhfYWxsb3dfbWVtaW8gPSB+MDsKKworLyoKKyAqIGFpYzd4eHhfZGV0ZWN0KCkgaGFzIGJlZW4gcnVuLCBzbyByZWdpc3RlciBhbGwgZGV2aWNlIGFycml2YWxzCisgKiBpbW1lZGlhdGVseSB3aXRoIHRoZSBzeXN0ZW0gcmF0aGVyIHRoYW4gZGVmZXJyaW5nIHRvIHRoZSBzb3J0ZWQKKyAqIGF0dGFjaG1lbnQgcGVyZm9ybWVkIGJ5IGFpYzd4eHhfZGV0ZWN0KCkuCisgKi8KK2ludCBhaWM3eHh4X2RldGVjdF9jb21wbGV0ZTsKKworLyoKKyAqIFNvIHRoYXQgd2UgY2FuIHNldCBob3cgbG9uZyBlYWNoIGRldmljZSBpcyBnaXZlbiBhcyBhIHNlbGVjdGlvbiB0aW1lb3V0LgorICogVGhlIHRhYmxlIG9mIHZhbHVlcyBnb2VzIGxpa2UgdGhpczoKKyAqICAgMCAtIDI1Nm1zCisgKiAgIDEgLSAxMjhtcworICogICAyIC0gNjRtcworICogICAzIC0gMzJtcworICogV2UgZGVmYXVsdCB0byAyNTZtcyBiZWNhdXNlIHNvbWUgb2xkZXIgZGV2aWNlcyBuZWVkIGEgbG9uZ2VyIHRpbWUKKyAqIHRvIHJlc3BvbmQgdG8gaW5pdGlhbCBzZWxlY3Rpb24uCisgKi8KK3N0YXRpYyB1aW50MzJfdCBhaWM3eHh4X3NlbHRpbWU7CisKKy8qCisgKiBDZXJ0YWluIGRldmljZXMgZG8gbm90IHBlcmZvcm0gYW55IGFnaW5nIG9uIGNvbW1hbmRzLiAgU2hvdWxkIHRoZQorICogZGV2aWNlIGJlIHNhdHVyYXRlZCBieSBjb21tYW5kcyBpbiBvbmUgcG9ydGlvbiBvZiB0aGUgZGlzaywgaXQgaXMKKyAqIHBvc3NpYmxlIGZvciB0cmFuc2FjdGlvbnMgb24gZmFyIGF3YXkgc2VjdG9ycyB0byBuZXZlciBiZSBzZXJ2aWNlZC4KKyAqIFRvIGhhbmRsZSB0aGVzZSBkZXZpY2VzLCB3ZSBjYW4gcGVyaW9kaWNhbGx5IHNlbmQgYW4gb3JkZXJlZCB0YWcgdG8KKyAqIGZvcmNlIGFsbCBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbnMgdG8gYmUgc2VydmljZWQgcHJpb3IgdG8gYSBuZXcKKyAqIHRyYW5zYWN0aW9uLgorICovCit1aW50MzJfdCBhaWM3eHh4X3BlcmlvZGljX290YWc7CisKKy8qCisgKiBNb2R1bGUgaW5mb3JtYXRpb24gYW5kIHNldHRhYmxlIG9wdGlvbnMuCisgKi8KK3N0YXRpYyBjaGFyICphaWM3eHh4ID0gTlVMTDsKKworTU9EVUxFX0FVVEhPUigiTWFpbnRhaW5lcjogSnVzdGluIFQuIEdpYmJzIDxnaWJic0BzY3NpZ3V5LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWRhcHRlYyBBaWM3N1hYLzc4WFggU0NTSSBIb3N0IEJ1cyBBZGFwdGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX1ZFUlNJT04oQUlDN1hYWF9EUklWRVJfVkVSU0lPTik7Cittb2R1bGVfcGFyYW0oYWljN3h4eCwgY2hhcnAsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhhaWM3eHh4LAorInBlcmlvZCBkZWxpbWl0ZWQsIG9wdGlvbnMgc3RyaW5nLlxuIgorIgl2ZXJib3NlCQkJRW5hYmxlIHZlcmJvc2UvZGlhZ25vc3RpYyBsb2dnaW5nXG4iCisiCWFsbG93X21lbWlvCQlBbGxvdyBkZXZpY2UgcmVnaXN0ZXJzIHRvIGJlIG1lbW9yeSBtYXBwZWRcbiIKKyIJZGVidWcJCQlCaXRtYXNrIG9mIGRlYnVnIHZhbHVlcyB0byBlbmFibGVcbiIKKyIJbm9fcHJvYmUJCVRvZ2dsZSBFSVNBL1ZMQiBjb250cm9sbGVyIHByb2JpbmdcbiIKKyIJcHJvYmVfZWlzYV92bAkJVG9nZ2xlIEVJU0EvVkxCIGNvbnRyb2xsZXIgcHJvYmluZ1xuIgorIglub19yZXNldAkJU3VwcmVzcyBpbml0aWFsIGJ1cyByZXNldHNcbiIKKyIJZXh0ZW5kZWQJCUVuYWJsZSBleHRlbmRlZCBnZW9tZXRyeSBvbiBhbGwgY29udHJvbGxlcnNcbiIKKyIJcGVyaW9kaWNfb3RhZwkJU2VuZCBhbiBvcmRlcmVkIHRhZ2dlZCB0cmFuc2FjdGlvblxuIgorIgkJCQlwZXJpb2RpY2FsbHkgdG8gcHJldmVudCB0YWcgc3RhcnZhdGlvbi5cbiIKKyIJCQkJVGhpcyBtYXkgYmUgcmVxdWlyZWQgYnkgc29tZSBvbGRlciBkaXNrXG4iCisiCQkJCWRyaXZlcyBvciBSQUlEIGFycmF5cy5cbiIKKyIJcmV2ZXJzZV9zY2FuCQlTb3J0IFBDSSBkZXZpY2VzIGhpZ2hlc3QgQnVzL1Nsb3QgdG8gbG93ZXN0XG4iCisiCXRhZ19pbmZvOjx0YWdfc3RyPglTZXQgcGVyLXRhcmdldCB0YWcgZGVwdGhcbiIKKyIJZ2xvYmFsX3RhZ19kZXB0aDo8aW50PglHbG9iYWwgdGFnIGRlcHRoIGZvciBldmVyeSB0YXJnZXRcbiIKKyIJCQkJb24gZXZlcnkgYnVzXG4iCisiCWR2Ojxkdl9zZXR0aW5ncz4JU2V0IHBlci1jb250cm9sbGVyIERvbWFpbiBWYWxpZGF0aW9uIFNldHRpbmcuXG4iCisiCXNlbHRpbWU6PGludD4JCVNlbGVjdGlvbiBUaW1lb3V0XG4iCisiCQkJCSgwLzI1Nm1zLDEvMTI4bXMsMi82NG1zLDMvMzJtcylcbiIKKyJcbiIKKyIJU2FtcGxlIC9ldGMvbW9kcHJvYmUuY29uZiBsaW5lOlxuIgorIgkJVG9nZ2xlIEVJU0EvVkxCIHByb2JpbmdcbiIKKyIJCVNldCB0YWcgZGVwdGggb24gQ29udHJvbGxlciAxL1RhcmdldCAxIHRvIDEwIHRhZ3NcbiIKKyIJCVNob3J0ZW4gdGhlIHNlbGVjdGlvbiB0aW1lb3V0IHRvIDEyOG1zXG4iCisiXG4iCisiCW9wdGlvbnMgYWljN3h4eCAnYWljN3h4eD1wcm9iZV9laXNhX3ZsLnRhZ19pbmZvOnt7fS57LjEwfX0uc2VsdGltZToxJ1xuIgorKTsKKworc3RhdGljIHZvaWQgYWhjX2xpbnV4X2hhbmRsZV9zY3NpX3N0YXR1cyhzdHJ1Y3QgYWhjX3NvZnRjICosCisJCQkJCSBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqLAorCQkJCQkgc3RydWN0IHNjYiAqKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkgU2NzaV9DbW5kICpjbWQpOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X2ZpbHRlcl9pbnF1aXJ5KHN0cnVjdCBhaGNfc29mdGMqLCBzdHJ1Y3QgYWhjX2RldmluZm8qKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9zZW1fdGltZW91dCh1X2xvbmcgYXJnKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9mcmVlemVfc2ltcShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X3JlbGVhc2Vfc2ltcSh1X2xvbmcgYXJnKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9kZXZfdGltZWRfdW5mcmVlemUodV9sb25nIGFyZyk7CitzdGF0aWMgaW50ICBhaGNfbGludXhfcXVldWVfcmVjb3ZlcnlfY21kKFNjc2lfQ21uZCAqY21kLCBzY2JfZmxhZyBmbGFnKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9pbml0aWFsaXplX3Njc2lfYnVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgdm9pZCBhaGNfbGludXhfc2l6ZV9uc2VnKHZvaWQpOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X3RocmVhZF9ydW5fY29tcGxldGVfcXVldWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9zdGFydF9kdihzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X2R2X3RpbWVvdXQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK3N0YXRpYyBpbnQgIGFoY19saW51eF9kdl90aHJlYWQodm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBhaGNfbGludXhfa2lsbF9kdl90aHJlYWQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9kdl90YXJnZXQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCB0YXJnZXQpOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X2R2X3RyYW5zaXRpb24oc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCSAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQkJICAgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkgICAgc3RydWN0IGFoY19saW51eF90YXJnZXQgKnRhcmcpOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X2R2X2ZpbGxfY21kKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCQkgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbyk7CitzdGF0aWMgdm9pZCBhaGNfbGludXhfZHZfaW5xKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sCisJCQkgICAgIHN0cnVjdCBhaGNfbGludXhfdGFyZ2V0ICp0YXJnLAorCQkJICAgICB1X2ludCByZXF1ZXN0X2xlbmd0aCk7CitzdGF0aWMgdm9pZCBhaGNfbGludXhfZHZfdHVyKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X2R2X3JlYmQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJICAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgICAgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLAorCQkJICAgICAgc3RydWN0IGFoY19saW51eF90YXJnZXQgKnRhcmcpOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X2R2X3dlYihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkgICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCSAgICAgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLAorCQkJICAgICBzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZyk7CitzdGF0aWMgdm9pZCBhaGNfbGludXhfZHZfcmViKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sCisJCQkgICAgIHN0cnVjdCBhaGNfbGludXhfdGFyZ2V0ICp0YXJnKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9kdl9zdShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJCSAgICBzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZyk7CitzdGF0aWMgaW50IGFoY19saW51eF9mYWxsYmFjayhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkgICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X2R2X2NvbXBsZXRlKFNjc2lfQ21uZCAqY21kKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9nZW5lcmF0ZV9kdl9wYXR0ZXJuKHN0cnVjdCBhaGNfbGludXhfdGFyZ2V0ICp0YXJnKTsKK3N0YXRpYyB1X2ludCBhaGNfbGludXhfdXNlcl90YWdkZXB0aChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHVfaW50IGFoY19saW51eF91c2VyX2R2X3NldHRpbmcoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9kZXZpY2VfcXVldWVfZGVwdGgoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkgc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IGFoY19saW51eF90YXJnZXQqCWFoY19saW51eF9hbGxvY190YXJnZXQoc3RydWN0IGFoY19zb2Z0YyosCisJCQkJCQkgICAgICAgdV9pbnQsIHVfaW50KTsKK3N0YXRpYyB2b2lkCQkJYWhjX2xpbnV4X2ZyZWVfdGFyZ2V0KHN0cnVjdCBhaGNfc29mdGMqLAorCQkJCQkJICAgICAgc3RydWN0IGFoY19saW51eF90YXJnZXQqKTsKK3N0YXRpYyBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSoJYWhjX2xpbnV4X2FsbG9jX2RldmljZShzdHJ1Y3QgYWhjX3NvZnRjKiwKKwkJCQkJCSAgICAgICBzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCosCisJCQkJCQkgICAgICAgdV9pbnQpOworc3RhdGljIHZvaWQJCQlhaGNfbGludXhfZnJlZV9kZXZpY2Uoc3RydWN0IGFoY19zb2Z0YyosCisJCQkJCQkgICAgICBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSopOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X3J1bl9kZXZpY2VfcXVldWUoc3RydWN0IGFoY19zb2Z0YyosCisJCQkJICAgICAgIHN0cnVjdCBhaGNfbGludXhfZGV2aWNlKik7CitzdGF0aWMgdm9pZCBhaGNfbGludXhfc2V0dXBfdGFnX2luZm9fZ2xvYmFsKGNoYXIgKnApOworc3RhdGljIGFpY19vcHRpb25fY2FsbGJhY2tfdCBhaGNfbGludXhfc2V0dXBfdGFnX2luZm87CitzdGF0aWMgYWljX29wdGlvbl9jYWxsYmFja190IGFoY19saW51eF9zZXR1cF9kdjsKK3N0YXRpYyBpbnQgIGFpYzd4eHhfc2V0dXAoY2hhciAqcyk7CitzdGF0aWMgaW50ICBhaGNfbGludXhfbmV4dF91bml0KHZvaWQpOworc3RhdGljIHZvaWQgYWhjX3J1bnFfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHN0cnVjdCBhaGNfY21kICphaGNfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSW5saW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfc2NoZWR1bGVfcnVucShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworc3RhdGljIF9faW5saW5lIHN0cnVjdCBhaGNfbGludXhfZGV2aWNlKgorCQkgICAgIGFoY19saW51eF9nZXRfZGV2aWNlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgY2hhbm5lbCwKKwkJCQkJICB1X2ludCB0YXJnZXQsIHVfaW50IGx1biwgaW50IGFsbG9jKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19zY2hlZHVsZV9jb21wbGV0ZXEoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19saW51eF9jaGVja19kZXZpY2VfcXVldWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkJICBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2KTsKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqCisJCSAgICAgYWhjX2xpbnV4X25leHRfZGV2aWNlX3RvX3J1bihzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX2xpbnV4X3J1bl9kZXZpY2VfcXVldWVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfbGludXhfdW5tYXBfc2NiKHN0cnVjdCBhaGNfc29mdGMqLCBzdHJ1Y3Qgc2NiKik7CisKK3N0YXRpYyBfX2lubGluZSBpbnQgYWhjX2xpbnV4X21hcF9zZWcoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IsCisJCSAJCSAgICAgIHN0cnVjdCBhaGNfZG1hX3NlZyAqc2csCisJCQkJICAgICAgZG1hX2FkZHJfdCBhZGRyLCBidXNfc2l6ZV90IGxlbik7CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfc2NoZWR1bGVfY29tcGxldGVxKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlpZiAoKGFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSENfUlVOX0NNUExUX1FfVElNRVIpID09IDApIHsKKwkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSENfUlVOX0NNUExUX1FfVElNRVI7CisJCWFoYy0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzOworCQlhZGRfdGltZXIoJmFoYy0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxX3RpbWVyKTsKKwl9Cit9CisKKy8qCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIG91ciBsb2NrIGhlbGQuCisgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfc2NoZWR1bGVfcnVucShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJdGFza2xldF9zY2hlZHVsZSgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5ydW5xX3Rhc2tsZXQpOworfQorCitzdGF0aWMgX19pbmxpbmUgc3RydWN0IGFoY19saW51eF9kZXZpY2UqCithaGNfbGludXhfZ2V0X2RldmljZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IGNoYW5uZWwsIHVfaW50IHRhcmdldCwKKwkJICAgICB1X2ludCBsdW4sIGludCBhbGxvYykKK3sKKwlzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZzsKKwlzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2OworCXVfaW50IHRhcmdldF9vZmZzZXQ7CisKKwl0YXJnZXRfb2Zmc2V0ID0gdGFyZ2V0OworCWlmIChjaGFubmVsICE9IDApCisJCXRhcmdldF9vZmZzZXQgKz0gODsKKwl0YXJnID0gYWhjLT5wbGF0Zm9ybV9kYXRhLT50YXJnZXRzW3RhcmdldF9vZmZzZXRdOworCWlmICh0YXJnID09IE5VTEwpIHsKKwkJaWYgKGFsbG9jICE9IDApIHsKKwkJCXRhcmcgPSBhaGNfbGludXhfYWxsb2NfdGFyZ2V0KGFoYywgY2hhbm5lbCwgdGFyZ2V0KTsKKwkJCWlmICh0YXJnID09IE5VTEwpCisJCQkJcmV0dXJuIChOVUxMKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gKE5VTEwpOworCX0KKwlkZXYgPSB0YXJnLT5kZXZpY2VzW2x1bl07CisJaWYgKGRldiA9PSBOVUxMICYmIGFsbG9jICE9IDApCisJCWRldiA9IGFoY19saW51eF9hbGxvY19kZXZpY2UoYWhjLCB0YXJnLCBsdW4pOworCXJldHVybiAoZGV2KTsKK30KKworI2RlZmluZSBBSENfTElOVVhfTUFYX1JFVFVSTkVEX0VSUk9SUyA0CitzdGF0aWMgc3RydWN0IGFoY19jbWQgKgorYWhjX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJc3RydWN0CWFoY19jbWQgKmFjbWQ7CisJdV9sb25nCWRvbmVfZmxhZ3M7CisJaW50CXdpdGhfZXJyb3JzOworCisJd2l0aF9lcnJvcnMgPSAwOworCWFoY19kb25lX2xvY2soYWhjLCAmZG9uZV9mbGFncyk7CisJd2hpbGUgKChhY21kID0gVEFJTFFfRklSU1QoJmFoYy0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxKSkgIT0gTlVMTCkgeworCQlTY3NpX0NtbmQgKmNtZDsKKworCQlpZiAod2l0aF9lcnJvcnMgPiBBSENfTElOVVhfTUFYX1JFVFVSTkVEX0VSUk9SUykgeworCQkJLyoKKwkJCSAqIExpbnV4IHVzZXMgc3RhY2sgcmVjdXJzaW9uIHRvIHJlcXVldWUKKwkJCSAqIGNvbW1hbmRzIHRoYXQgbmVlZCB0byBiZSByZXRyaWVkLiAgQXZvaWQKKwkJCSAqIGJsb3dpbmcgb3V0IHRoZSBzdGFjayBieSAic3Bvb24gZmVlZGluZyIKKwkJCSAqIGNvbW1hbmRzIHRoYXQgY29tcGxldGVkIHdpdGggZXJyb3IgYmFjaworCQkJICogdGhlIG9wZXJhdGluZyBzeXN0ZW0gaW4gY2FzZSB0aGV5IGFyZSBnb2luZworCQkJICogdG8gYmUgcmV0cmllZC4gImljayIKKwkJCSAqLworCQkJYWhjX3NjaGVkdWxlX2NvbXBsZXRlcShhaGMpOworCQkJYnJlYWs7CisJCX0KKwkJVEFJTFFfUkVNT1ZFKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcSwKKwkJCSAgICAgYWNtZCwgYWNtZF9saW5rcy50cWUpOworCQljbWQgPSAmYWNtZF9zY3NpX2NtZChhY21kKTsKKwkJY21kLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwkJaWYgKGFoY19jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpICE9IERJRF9PSworCQkgfHwgKGNtZC0+cmVzdWx0ICYgMHhGRikgIT0gU0NTSV9TVEFUVVNfT0spCisJCQl3aXRoX2Vycm9ycysrOworCisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJfQorCWFoY19kb25lX3VubG9jayhhaGMsICZkb25lX2ZsYWdzKTsKKwlyZXR1cm4gKGFjbWQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX2xpbnV4X2NoZWNrX2RldmljZV9xdWV1ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkgICAgIHN0cnVjdCBhaGNfbGludXhfZGV2aWNlICpkZXYpCit7CisJaWYgKChkZXYtPmZsYWdzICYgQUhDX0RFVl9GUkVFWkVfVElMX0VNUFRZKSAhPSAwCisJICYmIGRldi0+YWN0aXZlID09IDApIHsKKwkJZGV2LT5mbGFncyAmPSB+QUhDX0RFVl9GUkVFWkVfVElMX0VNUFRZOworCQlkZXYtPnFmcm96ZW4tLTsKKwl9CisKKwlpZiAoVEFJTFFfRklSU1QoJmRldi0+YnVzeXEpID09IE5VTEwKKwkgfHwgZGV2LT5vcGVuaW5ncyA9PSAwIHx8IGRldi0+cWZyb3plbiAhPSAwKQorCQlyZXR1cm47CisKKwlhaGNfbGludXhfcnVuX2RldmljZV9xdWV1ZShhaGMsIGRldik7Cit9CisKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqCithaGNfbGludXhfbmV4dF9kZXZpY2VfdG9fcnVuKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwkKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfUkVTT1VSQ0VfU0hPUlRBR0UpICE9IDAKKwkgfHwgKGFoYy0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiAhPSAwCisJICAmJiBBSENfRFZfU0lNUV9GUk9aRU4oYWhjKSA9PSAwKSkKKwkJcmV0dXJuIChOVUxMKTsKKwlyZXR1cm4gKFRBSUxRX0ZJUlNUKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfbGludXhfcnVuX2RldmljZV9xdWV1ZXMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXN0cnVjdCBhaGNfbGludXhfZGV2aWNlICpkZXY7CisKKwl3aGlsZSAoKGRldiA9IGFoY19saW51eF9uZXh0X2RldmljZV90b19ydW4oYWhjKSkgIT0gTlVMTCkgeworCQlUQUlMUV9SRU1PVkUoJmFoYy0+cGxhdGZvcm1fZGF0YS0+ZGV2aWNlX3J1bnEsIGRldiwgbGlua3MpOworCQlkZXYtPmZsYWdzICY9IH5BSENfREVWX09OX1JVTl9MSVNUOworCQlhaGNfbGludXhfY2hlY2tfZGV2aWNlX3F1ZXVlKGFoYywgZGV2KTsKKwl9Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfbGludXhfdW5tYXBfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqc2NiKQoreworCVNjc2lfQ21uZCAqY21kOworCisJY21kID0gc2NiLT5pb19jdHg7CisJYWhjX3N5bmNfc2dsaXN0KGFoYywgc2NiLCBCVVNfRE1BU1lOQ19QT1NUV1JJVEUpOworCWlmIChjbWQtPnVzZV9zZyAhPSAwKSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisKKwkJc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJcGNpX3VubWFwX3NnKGFoYy0+ZGV2X3NvZnRjLCBzZywgY21kLT51c2Vfc2csCisJCQkgICAgIHNjc2lfdG9fcGNpX2RtYV9kaXIoY21kLT5zY19kYXRhX2RpcmVjdGlvbikpOworCX0gZWxzZSBpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4gIT0gMCkgeworCQlwY2lfdW5tYXBfc2luZ2xlKGFoYy0+ZGV2X3NvZnRjLAorCQkJCSBzY2ItPnBsYXRmb3JtX2RhdGEtPmJ1Zl9idXNhZGRyLAorCQkJCSBjbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkgc2NzaV90b19wY2lfZG1hX2RpcihjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisJfQorfQorCitzdGF0aWMgX19pbmxpbmUgaW50CithaGNfbGludXhfbWFwX3NlZyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYiwKKwkJICBzdHJ1Y3QgYWhjX2RtYV9zZWcgKnNnLCBkbWFfYWRkcl90IGFkZHIsIGJ1c19zaXplX3QgbGVuKQoreworCWludAkgY29uc3VtZWQ7CisKKwlpZiAoKHNjYi0+c2dfY291bnQgKyAxKSA+IEFIQ19OU0VHKQorCQlwYW5pYygiVG9vIGZldyBzZWdzIGZvciBkbWEgbWFwcGluZy4gICIKKwkJICAgICAgIkluY3JlYXNlIEFIQ19OU0VHXG4iKTsKKworCWNvbnN1bWVkID0gMTsKKwlzZy0+YWRkciA9IGFoY19odG9sZTMyKGFkZHIgJiAweEZGRkZGRkZGKTsKKwlzY2ItPnBsYXRmb3JtX2RhdGEtPnhmZXJfbGVuICs9IGxlbjsKKworCWlmIChzaXplb2YoZG1hX2FkZHJfdCkgPiA0CisJICYmIChhaGMtPmZsYWdzICYgQUhDXzM5QklUX0FERFJFU1NJTkcpICE9IDApCisJCWxlbiB8PSAoYWRkciA+PiA4KSAmIEFIQ19TR19ISUdIX0FERFJfTUFTSzsKKworCXNnLT5sZW4gPSBhaGNfaHRvbGUzMihsZW4pOworCXJldHVybiAoY29uc3VtZWQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqICBIb3N0IHRlbXBsYXRlIGVudHJ5IHBvaW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAkgICBhaGNfbGludXhfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK3N0YXRpYyBpbnQJICAgYWhjX2xpbnV4X3F1ZXVlKFNjc2lfQ21uZCAqLCB2b2lkICgqKShTY3NpX0NtbmQgKikpOworc3RhdGljIGNvbnN0IGNoYXIgKmFoY19saW51eF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKik7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorc3RhdGljIGludAkgICBhaGNfbGludXhfc2xhdmVfYWxsb2MoU2NzaV9EZXZpY2UgKik7CitzdGF0aWMgaW50CSAgIGFoY19saW51eF9zbGF2ZV9jb25maWd1cmUoU2NzaV9EZXZpY2UgKik7CitzdGF0aWMgdm9pZAkgICBhaGNfbGludXhfc2xhdmVfZGVzdHJveShTY3NpX0RldmljZSAqKTsKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorc3RhdGljIGludAkgICBhaGNfbGludXhfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSosCisJCQkJICAgICAgIHN0cnVjdCBibG9ja19kZXZpY2UqLAorCQkJCSAgICAgICBzZWN0b3JfdCwgaW50W10pOworI2VuZGlmCisjZWxzZQorc3RhdGljIGludAkgICBhaGNfbGludXhfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIHZvaWQJICAgYWhjX2xpbnV4X3NlbGVjdF9xdWV1ZV9kZXB0aChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LAorCQkJCQkJU2NzaV9EZXZpY2UgKnNjc2lfZGV2cyk7CisjaWYgZGVmaW5lZChfX2kzODZfXykKK3N0YXRpYyBpbnQJICAgYWhjX2xpbnV4X2Jpb3NwYXJhbShEaXNrICosIGtkZXZfdCwgaW50W10pOworI2VuZGlmCisjZW5kaWYKK3N0YXRpYyBpbnQJICAgYWhjX2xpbnV4X2J1c19yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50CSAgIGFoY19saW51eF9kZXZfcmVzZXQoU2NzaV9DbW5kICopOworc3RhdGljIGludAkgICBhaGNfbGludXhfYWJvcnQoU2NzaV9DbW5kICopOworCisvKgorICogQ2FsY3VsYXRlIGEgc2FmZSB2YWx1ZSBmb3IgQUhDX05TRUcgKGFzIGV4cHJlc3NlZCB0aHJvdWdoIGFoY19saW51eF9uc2VnKS4KKyAqCisgKiBJbiBwcmUtMi41LlguLi4KKyAqIFRoZSBtaWRsYXllciBhbGxvY2F0ZXMgYW4gUy9HIGFycmF5IGR5bmFtaWNhbGx5IHdoZW4gYSBjb21tYW5kIGlzIGlzc3VlZAorICogdXNpbmcgU0NTSSBtYWxsb2MuICBUaGlzIGFycmF5LCB3aGljaCBpcyBpbiBhbiBPUyBkZXBlbmRlbnQgZm9ybWF0IHRoYXQKKyAqIG11c3QgbGF0ZXIgYmUgY29waWVkIHRvIG91ciBwcml2YXRlIFMvRyBsaXN0LCBpcyBzaXplZCB0byBob3VzZSBqdXN0IHRoZQorICogbnVtYmVyIG9mIHNlZ21lbnRzIG5lZWRlZCBmb3IgdGhlIGN1cnJlbnQgdHJhbnNmZXIuICBTaW5jZSB0aGUgY29kZSB0aGF0CisgKiBzaXplcyB0aGUgU0NTSSBtYWxsb2MgcG9vbCBkb2VzIG5vdCB0YWtlIGludG8gY29uc2lkZXJhdGlvbiBmcmFnbWVudGF0aW9uCisgKiBvZiB0aGUgcG9vbCwgZXhlY3V0aW5nIHRyYW5zYWN0aW9ucyBudW1iZXJpbmcganVzdCBhIGZyYWN0aW9uIG9mIG91cgorICogY29uY3VycmVudCB0cmFuc2FjdGlvbiBsaW1pdCB3aXRoIGxpc3QgbGVuZ3RocyBhcHJvYWNoaW5nIEFIQ19OU0VHIHdpbGwKKyAqIHF1aWNrbHkgZGVwbGVhdCB0aGUgU0NTSSBtYWxsb2MgcG9vbCBvZiB1c2FibGUgc3BhY2UuICBVbmZvcnR1bmF0ZWx5LCB0aGUKKyAqIG1pZC1sYXllciBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgdGhpcyBzY3NpIG1hbGxvYyBmYWlsdXJlcyBmb3IgdGhlIFMvRworICogYXJyYXkgYW5kIHRoZSByZXN1bHQgY2FuIGJlIGEgbG9ja3VwIG9mIHRoZSBJL08gc3Vic3lzdGVtLiAgV2UgdHJ5IHRvIHNpemUKKyAqIG91ciBTL0cgbGlzdCBzbyB0aGF0IGl0IHNhdGlzZmllcyBvdXIgZHJpdmVycyBhbGxvY2F0aW9uIHJlcXVpcmVtZW50cyBpbgorICogYWRkaXRpb24gdG8gYXZvaWRpbmcgZnJhZ21lbnRhdGlvbiBvZiB0aGUgU0NTSSBtYWxsb2MgcG9vbC4KKyAqLworc3RhdGljIHZvaWQKK2FoY19saW51eF9zaXplX25zZWcodm9pZCkKK3sKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwl1X2ludCBjdXJfc2l6ZTsKKwl1X2ludCBiZXN0X3NpemU7CisKKwkvKgorCSAqIFRoZSBTQ1NJIGFsbG9jYXRvciByb3VuZHMgdG8gdGhlIG5lYXJlc3QgNTEyIGJ5dGVzCisJICogYW4gY2Fubm90IGFsbG9jYXRlIGFjcm9zcyBhIHBhZ2UgYm91bmRhcnkuICBPdXIgYWxnb3JpdGhtCisJICogaXMgdG8gc3RhcnQgYXQgMUsgb2Ygc2NzaSBtYWxsb2Mgc3BhY2UgcGVyLWNvbW1hbmQgYW5kCisJICogbG9vcCB0aHJvdWdoIGFsbCBmYWN0b3JzIG9mIHRoZSBQQUdFX1NJWkUgYW5kIHBpY2sgdGhlIGJlc3QuCisJICovCisJYmVzdF9zaXplID0gMDsKKwlmb3IgKGN1cl9zaXplID0gMTAyNDsgY3VyX3NpemUgPD0gUEFHRV9TSVpFOyBjdXJfc2l6ZSAqPSAyKSB7CisJCXVfaW50IG5zZWc7CisKKwkJbnNlZyA9IGN1cl9zaXplIC8gc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCk7CisJCWlmIChuc2VnIDwgQUhDX0xJTlVYX01JTl9OU0VHKQorCQkJY29udGludWU7CisKKwkJaWYgKGJlc3Rfc2l6ZSA9PSAwKSB7CisJCQliZXN0X3NpemUgPSBjdXJfc2l6ZTsKKwkJCWFoY19saW51eF9uc2VnID0gbnNlZzsKKwkJfSBlbHNlIHsKKwkJCXVfaW50IGJlc3RfcmVtOworCQkJdV9pbnQgY3VyX3JlbTsKKworCQkJLyoKKwkJCSAqIENvbXBhcmUgdGhlIHRyYWl0cyBvZiB0aGUgY3VycmVudCAiYmVzdF9zaXplIgorCQkJICogd2l0aCB0aGUgY3VycmVudCBzaXplIHRvIGRldGVybWluZSBpZiB0aGUKKwkJCSAqIGN1cnJlbnQgc2l6ZSBpcyBhIGJldHRlciBzaXplLgorCQkJICovCisJCQliZXN0X3JlbSA9IGJlc3Rfc2l6ZSAlIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpOworCQkJY3VyX3JlbSA9IGN1cl9zaXplICUgc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCk7CisJCQlpZiAoY3VyX3JlbSA8IGJlc3RfcmVtKSB7CisJCQkJYmVzdF9zaXplID0gY3VyX3NpemU7CisJCQkJYWhjX2xpbnV4X25zZWcgPSBuc2VnOworCQkJfQorCQl9CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBUcnkgdG8gZGV0ZWN0IGFuIEFkYXB0ZWMgN1hYWCBjb250cm9sbGVyLgorICovCitzdGF0aWMgaW50CithaGNfbGludXhfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdGVtcGxhdGUpCit7CisJc3RydWN0CWFoY19zb2Z0YyAqYWhjOworCWludCAgICAgZm91bmQgPSAwOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJLyoKKwkgKiBJdCBpcyBhIGJ1ZyB0aGF0IHRoZSB1cHBlciBsYXllciB0YWtlcworCSAqIHRoaXMgbG9jayBqdXN0IHByaW9yIHRvIGNhbGxpbmcgdXMuCisJICovCisJc3Bpbl91bmxvY2tfaXJxKCZpb19yZXF1ZXN0X2xvY2spOworI2VuZGlmCisKKwkvKgorCSAqIFNhbml0eSBjaGVja2luZyBvZiBMaW51eCBTQ1NJIGRhdGEgc3RydWN0dXJlcyBzbworCSAqIHRoYXQgc29tZSBvZiBvdXIgaGFja3NeSF5IXkheSF5IYXNzdW1wdGlvbnMgYXJlbid0CisJICogdmlvbGF0ZWQuCisJICovCisJaWYgKG9mZnNldG9mKHN0cnVjdCBhaGNfY21kX2ludGVybmFsLCBlbmQpCisJICA+IG9mZnNldG9mKHN0cnVjdCBzY3NpX2NtbmQsIGhvc3Rfc2NyaWJibGUpKSB7CisJCXByaW50ZigiYWhjX2xpbnV4X2RldGVjdDogU0NTSSBkYXRhIHN0cnVjdHVyZXMgY2hhbmdlZC5cbiIpOworCQlwcmludGYoImFoY19saW51eF9kZXRlY3Q6IFVuYWJsZSB0byBhdHRhY2hcbiIpOworCQlyZXR1cm4gKDApOworCX0KKwlhaGNfbGludXhfc2l6ZV9uc2VnKCk7CisJLyoKKwkgKiBJZiB3ZSd2ZSBiZWVuIHBhc3NlZCBhbnkgcGFyYW1ldGVycywgcHJvY2VzcyB0aGVtIG5vdy4KKwkgKi8KKwlpZiAoYWljN3h4eCkKKwkJYWljN3h4eF9zZXR1cChhaWM3eHh4KTsKKworCXRlbXBsYXRlLT5wcm9jX25hbWUgPSAiYWljN3h4eCI7CisKKwkvKgorCSAqIEluaXRpYWxpemUgb3VyIHNvZnRjIGxpc3QgbG9jayBwcmlvciB0bworCSAqIHByb2JpbmcgZm9yIGFueSBhZGFwdGVycy4KKwkgKi8KKwlhaGNfbGlzdF9sb2NraW5pdCgpOworCisJZm91bmQgPSBhaGNfbGludXhfcGNpX2luaXQoKTsKKwlpZiAoIWFoY19saW51eF9laXNhX2luaXQoKSkKKwkJZm91bmQrKzsKKwkKKwkvKgorCSAqIFJlZ2lzdGVyIHdpdGggdGhlIFNDU0kgbGF5ZXIgYWxsCisJICogY29udHJvbGxlcnMgd2UndmUgZm91bmQuCisJICovCisJVEFJTFFfRk9SRUFDSChhaGMsICZhaGNfdGFpbHEsIGxpbmtzKSB7CisKKwkJaWYgKGFoY19saW51eF9yZWdpc3Rlcl9ob3N0KGFoYywgdGVtcGxhdGUpID09IDApCisJCQlmb3VuZCsrOworCX0KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXNwaW5fbG9ja19pcnEoJmlvX3JlcXVlc3RfbG9jayk7CisjZW5kaWYKKwlhaWM3eHh4X2RldGVjdF9jb21wbGV0ZSsrOworCisJcmV0dXJuIChmb3VuZCk7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKy8qCisgKiBGcmVlIHRoZSBwYXNzZWQgaW4gU2NzaV9Ib3N0IG1lbW9yeSBzdHJ1Y3R1cmVzIHByaW9yIHRvIHVubG9hZGluZyB0aGUKKyAqIG1vZHVsZS4KKyAqLworaW50CithaGNfbGludXhfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICogaG9zdCkKK3sKKwlzdHJ1Y3QgYWhjX3NvZnRjICphaGM7CisJdV9sb25nIGw7CisKKwlhaGNfbGlzdF9sb2NrKCZsKTsKKwlpZiAoaG9zdCAhPSBOVUxMKSB7CisKKwkJLyoKKwkJICogV2Ugc2hvdWxkIGJlIGFibGUgdG8ganVzdCBwZXJmb3JtCisJCSAqIHRoZSBmcmVlIGRpcmVjdGx5LCBidXQgY2hlY2sgb3VyCisJCSAqIGxpc3QgZm9yIGV4dHJhIHNhbml0eS4KKwkJICovCisJCWFoYyA9IGFoY19maW5kX3NvZnRjKCooc3RydWN0IGFoY19zb2Z0YyAqKilob3N0LT5ob3N0ZGF0YSk7CisJCWlmIChhaGMgIT0gTlVMTCkgeworCQkJdV9sb25nIHM7CisKKwkJCWFoY19sb2NrKGFoYywgJnMpOworCQkJYWhjX2ludHJfZW5hYmxlKGFoYywgRkFMU0UpOworCQkJYWhjX3VubG9jayhhaGMsICZzKTsKKwkJCWFoY19mcmVlKGFoYyk7CisJCX0KKwl9CisJYWhjX2xpc3RfdW5sb2NrKCZsKTsKKwlyZXR1cm4gKDApOworfQorI2VuZGlmCisKKy8qCisgKiBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZHJpdmVyLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCithaGNfbGludXhfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0YXRpYyBjaGFyIGJ1ZmZlcls1MTJdOworCWNoYXIJYWhjX2luZm9bMjU2XTsKKwljaGFyICAgKmJwOworCXN0cnVjdCBhaGNfc29mdGMgKmFoYzsKKworCWJwID0gJmJ1ZmZlclswXTsKKwlhaGMgPSAqKHN0cnVjdCBhaGNfc29mdGMgKiopaG9zdC0+aG9zdGRhdGE7CisJbWVtc2V0KGJwLCAwLCBzaXplb2YoYnVmZmVyKSk7CisJc3RyY3B5KGJwLCAiQWRhcHRlYyBBSUM3WFhYIEVJU0EvVkxCL1BDSSBTQ1NJIEhCQSBEUklWRVIsIFJldiAiKTsKKwlzdHJjYXQoYnAsIEFJQzdYWFhfRFJJVkVSX1ZFUlNJT04pOworCXN0cmNhdChicCwgIlxuIik7CisJc3RyY2F0KGJwLCAiICAgICAgICA8Iik7CisJc3RyY2F0KGJwLCBhaGMtPmRlc2NyaXB0aW9uKTsKKwlzdHJjYXQoYnAsICI+XG4iKTsKKwlzdHJjYXQoYnAsICIgICAgICAgICIpOworCWFoY19jb250cm9sbGVyX2luZm8oYWhjLCBhaGNfaW5mbyk7CisJc3RyY2F0KGJwLCBhaGNfaW5mbyk7CisJc3RyY2F0KGJwLCAiXG4iKTsKKworCXJldHVybiAoYnApOworfQorCisvKgorICogUXVldWUgYW4gU0NCIHRvIHRoZSBjb250cm9sbGVyLgorICovCitzdGF0aWMgaW50CithaGNfbGludXhfcXVldWUoU2NzaV9DbW5kICogY21kLCB2b2lkICgqc2NzaV9kb25lKSAoU2NzaV9DbW5kICopKQoreworCXN0cnVjdAkgYWhjX3NvZnRjICphaGM7CisJc3RydWN0CSBhaGNfbGludXhfZGV2aWNlICpkZXY7CisJdV9sb25nCSBmbGFnczsKKworCWFoYyA9ICooc3RydWN0IGFoY19zb2Z0YyAqKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwkvKgorCSAqIFNhdmUgdGhlIGNhbGxiYWNrIG9uIGNvbXBsZXRpb24gZnVuY3Rpb24uCisJICovCisJY21kLT5zY3NpX2RvbmUgPSBzY3NpX2RvbmU7CisKKwlhaGNfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKGFoYywgJmZsYWdzKTsKKworCS8qCisJICogQ2xvc2UgdGhlIHJhY2Ugb2YgYSBjb21tYW5kIHRoYXQgd2FzIGluIHRoZSBwcm9jZXNzIG9mCisJICogYmVpbmcgcXVldWVkIHRvIHVzIGp1c3QgYXMgb3VyIHNpbXEgd2FzIGZyb3plbi4gIExldAorCSAqIERWIGNvbW1hbmRzIHRocm91Z2ggc28gbG9uZyBhcyB3ZSBhcmUgb25seSBmcm96ZW4gdG8KKwkgKiBwZXJmb3JtIERWLgorCSAqLworCWlmIChhaGMtPnBsYXRmb3JtX2RhdGEtPnFmcm96ZW4gIT0gMAorCSAmJiBBSENfRFZfQ01EKGNtZCkgPT0gMCkgeworCisJCWFoY19jbWRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQsIENBTV9SRVFVRVVFX1JFUSk7CisJCWFoY19saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoYWhjLCBjbWQpOworCQlhaGNfc2NoZWR1bGVfY29tcGxldGVxKGFoYyk7CisJCWFoY19taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGMsICZmbGFncyk7CisJCXJldHVybiAoMCk7CisJfQorCWRldiA9IGFoY19saW51eF9nZXRfZGV2aWNlKGFoYywgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJCQkgICBjbWQtPmRldmljZS0+bHVuLCAvKmFsbG9jKi9UUlVFKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJYWhjX2NtZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCwgQ0FNX1JFU1JDX1VOQVZBSUwpOworCQlhaGNfbGludXhfcXVldWVfY21kX2NvbXBsZXRlKGFoYywgY21kKTsKKwkJYWhjX3NjaGVkdWxlX2NvbXBsZXRlcShhaGMpOworCQlhaGNfbWlkbGF5ZXJfZW50cnlwb2ludF91bmxvY2soYWhjLCAmZmxhZ3MpOworCQlwcmludGYoIiVzOiBhaWM3eHh4X2xpbnV4X3F1ZXVlIC0gVW5hYmxlIHRvIGFsbG9jYXRlIGRldmljZSFcbiIsCisJCSAgICAgICBhaGNfbmFtZShhaGMpKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJY21kLT5yZXN1bHQgPSBDQU1fUkVRX0lOUFJPRyA8PCAxNjsKKwlUQUlMUV9JTlNFUlRfVEFJTCgmZGV2LT5idXN5cSwgKHN0cnVjdCBhaGNfY21kICopY21kLCBhY21kX2xpbmtzLnRxZSk7CisJaWYgKChkZXYtPmZsYWdzICYgQUhDX0RFVl9PTl9SVU5fTElTVCkgPT0gMCkgeworCQlUQUlMUV9JTlNFUlRfVEFJTCgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5kZXZpY2VfcnVucSwgZGV2LCBsaW5rcyk7CisJCWRldi0+ZmxhZ3MgfD0gQUhDX0RFVl9PTl9SVU5fTElTVDsKKwkJYWhjX2xpbnV4X3J1bl9kZXZpY2VfcXVldWVzKGFoYyk7CisJfQorCWFoY19taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGMsICZmbGFncyk7CisJcmV0dXJuICgwKTsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKK3N0YXRpYyBpbnQKK2FoY19saW51eF9zbGF2ZV9hbGxvYyhTY3NpX0RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdAlhaGNfc29mdGMgKmFoYzsKKworCWFoYyA9ICooKHN0cnVjdCBhaGNfc29mdGMgKiopZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSk7CisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoIiVzOiBTbGF2ZSBBbGxvYyAlZFxuIiwgYWhjX25hbWUoYWhjKSwgZGV2aWNlLT5pZCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhjX2xpbnV4X3NsYXZlX2NvbmZpZ3VyZShTY3NpX0RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdAlhaGNfc29mdGMgKmFoYzsKKwlzdHJ1Y3QJYWhjX2xpbnV4X2RldmljZSAqZGV2OworCXVfbG9uZwlmbGFnczsKKworCWFoYyA9ICooKHN0cnVjdCBhaGNfc29mdGMgKiopZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSk7CisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoIiVzOiBTbGF2ZSBDb25maWd1cmUgJWRcbiIsIGFoY19uYW1lKGFoYyksIGRldmljZS0+aWQpOworCWFoY19taWRsYXllcl9lbnRyeXBvaW50X2xvY2soYWhjLCAmZmxhZ3MpOworCS8qCisJICogU2luY2UgTGludXggaGFzIGF0dGFjaGVkIHRvIHRoZSBkZXZpY2UsIGNvbmZpZ3VyZQorCSAqIGl0IHNvIHdlIGRvbid0IGZyZWUgYW5kIGFsbG9jYXRlIHRoZSBkZXZpY2UKKwkgKiBzdHJ1Y3R1cmUgb24gZXZlcnkgY29tbWFuZC4KKwkgKi8KKwlkZXYgPSBhaGNfbGludXhfZ2V0X2RldmljZShhaGMsIGRldmljZS0+Y2hhbm5lbCwKKwkJCQkgICBkZXZpY2UtPmlkLCBkZXZpY2UtPmx1biwKKwkJCQkgICAvKmFsbG9jKi9UUlVFKTsKKwlpZiAoZGV2ICE9IE5VTEwpIHsKKwkJZGV2LT5mbGFncyAmPSB+QUhDX0RFVl9VTkNPTkZJR1VSRUQ7CisJCWRldi0+c2NzaV9kZXZpY2UgPSBkZXZpY2U7CisJCWFoY19saW51eF9kZXZpY2VfcXVldWVfZGVwdGgoYWhjLCBkZXYpOworCX0KKwlhaGNfbWlkbGF5ZXJfZW50cnlwb2ludF91bmxvY2soYWhjLCAmZmxhZ3MpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfc2xhdmVfZGVzdHJveShTY3NpX0RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdAlhaGNfc29mdGMgKmFoYzsKKwlzdHJ1Y3QJYWhjX2xpbnV4X2RldmljZSAqZGV2OworCXVfbG9uZwlmbGFnczsKKworCWFoYyA9ICooKHN0cnVjdCBhaGNfc29mdGMgKiopZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSk7CisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoIiVzOiBTbGF2ZSBEZXN0cm95ICVkXG4iLCBhaGNfbmFtZShhaGMpLCBkZXZpY2UtPmlkKTsKKwlhaGNfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKGFoYywgJmZsYWdzKTsKKwlkZXYgPSBhaGNfbGludXhfZ2V0X2RldmljZShhaGMsIGRldmljZS0+Y2hhbm5lbCwKKwkJCQkgICBkZXZpY2UtPmlkLCBkZXZpY2UtPmx1biwKKwkJCQkJICAgLyphbGxvYyovRkFMU0UpOworCS8qCisJICogRmlsdGVyIG91dCAic2lsbHkiIGRlbGV0aW9ucyBvZiByZWFsIGRldmljZXMgYnkgb25seQorCSAqIGRlbGV0aW5nIGRldmljZXMgdGhhdCBoYXZlIGhhZCBzbGF2ZV9jb25maWd1cmUoKQorCSAqIGNhbGxlZCBvbiB0aGVtLiAgQWxsIG90aGVyIGRldmljZXMgdGhhdCBoYXZlIG5vdAorCSAqIGJlZW4gY29uZmlndXJlZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGVsZXRlZCBieQorCSAqIHRoZSByZWZjb3VudGluZyBwcm9jZXNzLgorCSAqLworCWlmIChkZXYgIT0gTlVMTAorCSAmJiAoZGV2LT5mbGFncyAmIEFIQ19ERVZfU0xBVkVfQ09ORklHVVJFRCkgIT0gMCkgeworCQlkZXYtPmZsYWdzIHw9IEFIQ19ERVZfVU5DT05GSUdVUkVEOworCQlpZiAoVEFJTFFfRU1QVFkoJmRldi0+YnVzeXEpCisJCSAmJiBkZXYtPmFjdGl2ZSA9PSAwCisJIAkgJiYgKGRldi0+ZmxhZ3MgJiBBSENfREVWX1RJTUVSX0FDVElWRSkgPT0gMCkKKwkJCWFoY19saW51eF9mcmVlX2RldmljZShhaGMsIGRldik7CisJfQorCWFoY19taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGMsICZmbGFncyk7Cit9CisjZWxzZQorLyoKKyAqIFNldHMgdGhlIHF1ZXVlIGRlcHRoIGZvciBlYWNoIFNDU0kgZGV2aWNlIGhhbmdpbmcKKyAqIG9mZiB0aGUgaW5wdXQgaG9zdCBhZGFwdGVyLgorICovCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X3NlbGVjdF9xdWV1ZV9kZXB0aChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBTY3NpX0RldmljZSAqc2NzaV9kZXZzKQoreworCVNjc2lfRGV2aWNlICpkZXZpY2U7CisJU2NzaV9EZXZpY2UgKmxkZXY7CisJc3RydWN0CWFoY19zb2Z0YyAqYWhjOworCXVfbG9uZwlmbGFnczsKKworCWFoYyA9ICooKHN0cnVjdCBhaGNfc29mdGMgKiopaG9zdC0+aG9zdGRhdGEpOworCWFoY19sb2NrKGFoYywgJmZsYWdzKTsKKwlmb3IgKGRldmljZSA9IHNjc2lfZGV2czsgZGV2aWNlICE9IE5VTEw7IGRldmljZSA9IGRldmljZS0+bmV4dCkgeworCisJCS8qCisJCSAqIFdhdGNoIG91dCBmb3IgZHVwbGljYXRlIGRldmljZXMuICBUaGlzIHdvcmtzIGFyb3VuZAorCQkgKiBzb21lIHF1aXJrcyBpbiBob3cgdGhlIFNDU0kgc2Nhbm5pbmcgY29kZSBkb2VzIGl0cworCQkgKiBkZXZpY2UgbWFuYWdlbWVudC4KKwkJICovCisJCWZvciAobGRldiA9IHNjc2lfZGV2czsgbGRldiAhPSBkZXZpY2U7IGxkZXYgPSBsZGV2LT5uZXh0KSB7CisJCQlpZiAobGRldi0+aG9zdCA9PSBkZXZpY2UtPmhvc3QKKwkJCSAmJiBsZGV2LT5jaGFubmVsID09IGRldmljZS0+Y2hhbm5lbAorCQkJICYmIGxkZXYtPmlkID09IGRldmljZS0+aWQKKwkJCSAmJiBsZGV2LT5sdW4gPT0gZGV2aWNlLT5sdW4pCisJCQkJYnJlYWs7CisJCX0KKwkJLyogU2tpcCBkdXBsaWNhdGUuICovCisJCWlmIChsZGV2ICE9IGRldmljZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkZXZpY2UtPmhvc3QgPT0gaG9zdCkgeworCQkJc3RydWN0CSBhaGNfbGludXhfZGV2aWNlICpkZXY7CisKKwkJCS8qCisJCQkgKiBTaW5jZSBMaW51eCBoYXMgYXR0YWNoZWQgdG8gdGhlIGRldmljZSwgY29uZmlndXJlCisJCQkgKiBpdCBzbyB3ZSBkb24ndCBmcmVlIGFuZCBhbGxvY2F0ZSB0aGUgZGV2aWNlCisJCQkgKiBzdHJ1Y3R1cmUgb24gZXZlcnkgY29tbWFuZC4KKwkJCSAqLworCQkJZGV2ID0gYWhjX2xpbnV4X2dldF9kZXZpY2UoYWhjLCBkZXZpY2UtPmNoYW5uZWwsCisJCQkJCQkgICBkZXZpY2UtPmlkLCBkZXZpY2UtPmx1biwKKwkJCQkJCSAgIC8qYWxsb2MqL1RSVUUpOworCQkJaWYgKGRldiAhPSBOVUxMKSB7CisJCQkJZGV2LT5mbGFncyAmPSB+QUhDX0RFVl9VTkNPTkZJR1VSRUQ7CisJCQkJZGV2LT5zY3NpX2RldmljZSA9IGRldmljZTsKKwkJCQlhaGNfbGludXhfZGV2aWNlX3F1ZXVlX2RlcHRoKGFoYywgZGV2KTsKKwkJCQlkZXZpY2UtPnF1ZXVlX2RlcHRoID0gZGV2LT5vcGVuaW5ncworCQkJCQkJICAgICsgZGV2LT5hY3RpdmU7CisJCQkJaWYgKChkZXYtPmZsYWdzICYgKEFIQ19ERVZfUV9CQVNJQworCQkJCQkJfCBBSENfREVWX1FfVEFHR0VEKSkgPT0gMCkgeworCQkJCQkvKgorCQkJCQkgKiBXZSBhbGxvdyB0aGUgT1MgdG8gcXVldWUgMiB1bnRhZ2dlZAorCQkJCQkgKiB0cmFuc2FjdGlvbnMgdG8gdXMgYXQgYW55IHRpbWUgZXZlbgorCQkJCQkgKiB0aG91Z2ggd2UgY2FuIG9ubHkgZXhlY3V0ZSB0aGVtCisJCQkJCSAqIHNlcmlhbGx5IG9uIHRoZSBjb250cm9sbGVyL2RldmljZS4KKwkJCQkJICogVGhpcyBzaG91bGQgcmVtb3ZlIHNvbWUgbGF0ZW5jeS4KKwkJCQkJICovCisJCQkJCWRldmljZS0+cXVldWVfZGVwdGggPSAyOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlhaGNfdW5sb2NrKGFoYywgJmZsYWdzKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2kzODZfXykKKy8qCisgKiBSZXR1cm4gdGhlIGRpc2sgZ2VvbWV0cnkgZm9yIHRoZSBnaXZlbiBTQ1NJIGRldmljZS4KKyAqLworc3RhdGljIGludAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKK2FoY19saW51eF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkgICAgc2VjdG9yX3QgY2FwYWNpdHksIGludCBnZW9tW10pCit7CisJdWludDhfdCAqYmg7CisjZWxzZQorYWhjX2xpbnV4X2Jpb3NwYXJhbShEaXNrICpkaXNrLCBrZGV2X3QgZGV2LCBpbnQgZ2VvbVtdKQoreworCXN0cnVjdAlzY3NpX2RldmljZSAqc2RldiA9IGRpc2stPmRldmljZTsKKwl1X2xvbmcJY2FwYWNpdHkgPSBkaXNrLT5jYXBhY2l0eTsKKwlzdHJ1Y3QJYnVmZmVyX2hlYWQgKmJoOworI2VuZGlmCisJaW50CSBoZWFkczsKKwlpbnQJIHNlY3RvcnM7CisJaW50CSBjeWxpbmRlcnM7CisJaW50CSByZXQ7CisJaW50CSBleHRlbmRlZDsKKwlzdHJ1Y3QJIGFoY19zb2Z0YyAqYWhjOworCXVfaW50CSBjaGFubmVsOworCisJYWhjID0gKigoc3RydWN0IGFoY19zb2Z0YyAqKilzZGV2LT5ob3N0LT5ob3N0ZGF0YSk7CisJY2hhbm5lbCA9IHNkZXYtPmNoYW5uZWw7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJYmggPSBzY3NpX2Jpb3NfcHRhYmxlKGJkZXYpOworI2VsaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwxNykKKwliaCA9IGJyZWFkKE1LREVWKE1BSk9SKGRldiksIE1JTk9SKGRldikgJiB+MHhmKSwgMCwgYmxvY2tfc2l6ZShkZXYpKTsKKyNlbHNlCisJYmggPSBicmVhZChNS0RFVihNQUpPUihkZXYpLCBNSU5PUihkZXYpICYgfjB4ZiksIDAsIDEwMjQpOworI2VuZGlmCisKKwlpZiAoYmgpIHsKKwkJcmV0ID0gc2NzaV9wYXJ0c2l6ZShiaCwgY2FwYWNpdHksCisJCQkJICAgICZnZW9tWzJdLCAmZ2VvbVswXSwgJmdlb21bMV0pOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkJa2ZyZWUoYmgpOworI2Vsc2UKKwkJYnJlbHNlKGJoKTsKKyNlbmRpZgorCQlpZiAocmV0ICE9IC0xKQorCQkJcmV0dXJuIChyZXQpOworCX0KKwloZWFkcyA9IDY0OworCXNlY3RvcnMgPSAzMjsKKwljeWxpbmRlcnMgPSBhaWNfc2VjdG9yX2RpdihjYXBhY2l0eSwgaGVhZHMsIHNlY3RvcnMpOworCisJaWYgKGFpYzd4eHhfZXh0ZW5kZWQgIT0gMCkKKwkJZXh0ZW5kZWQgPSAxOworCWVsc2UgaWYgKGNoYW5uZWwgPT0gMCkKKwkJZXh0ZW5kZWQgPSAoYWhjLT5mbGFncyAmIEFIQ19FWFRFTkRFRF9UUkFOU19BKSAhPSAwOworCWVsc2UKKwkJZXh0ZW5kZWQgPSAoYWhjLT5mbGFncyAmIEFIQ19FWFRFTkRFRF9UUkFOU19CKSAhPSAwOworCWlmIChleHRlbmRlZCAmJiBjeWxpbmRlcnMgPj0gMTAyNCkgeworCQloZWFkcyA9IDI1NTsKKwkJc2VjdG9ycyA9IDYzOworCQljeWxpbmRlcnMgPSBhaWNfc2VjdG9yX2RpdihjYXBhY2l0eSwgaGVhZHMsIHNlY3RvcnMpOworCX0KKwlnZW9tWzBdID0gaGVhZHM7CisJZ2VvbVsxXSA9IHNlY3RvcnM7CisJZ2VvbVsyXSA9IGN5bGluZGVyczsKKwlyZXR1cm4gKDApOworfQorI2VuZGlmCisKKy8qCisgKiBBYm9ydCB0aGUgY3VycmVudCBTQ1NJIGNvbW1hbmQocykuCisgKi8KK3N0YXRpYyBpbnQKK2FoY19saW51eF9hYm9ydChTY3NpX0NtbmQgKmNtZCkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGFoY19saW51eF9xdWV1ZV9yZWNvdmVyeV9jbWQoY21kLCBTQ0JfQUJPUlQpOworCWlmIChlcnJvciAhPSAwKQorCQlwcmludGYoImFpYzd4eHhfYWJvcnQgcmV0dXJucyAweCV4XG4iLCBlcnJvcik7CisJcmV0dXJuIChlcnJvcik7Cit9CisKKy8qCisgKiBBdHRlbXB0IHRvIHNlbmQgYSB0YXJnZXQgcmVzZXQgbWVzc2FnZSB0byB0aGUgZGV2aWNlIHRoYXQgdGltZWQgb3V0LgorICovCitzdGF0aWMgaW50CithaGNfbGludXhfZGV2X3Jlc2V0KFNjc2lfQ21uZCAqY21kKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gYWhjX2xpbnV4X3F1ZXVlX3JlY292ZXJ5X2NtZChjbWQsIFNDQl9ERVZJQ0VfUkVTRVQpOworCWlmIChlcnJvciAhPSAwKQorCQlwcmludGYoImFpYzd4eHhfZGV2X3Jlc2V0IHJldHVybnMgMHgleFxuIiwgZXJyb3IpOworCXJldHVybiAoZXJyb3IpOworfQorCisvKgorICogUmVzZXQgdGhlIFNDU0kgYnVzLgorICovCitzdGF0aWMgaW50CithaGNfbGludXhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqY21kKQoreworCXN0cnVjdCBhaGNfc29mdGMgKmFoYzsKKwl1X2xvbmcgczsKKwlpbnQgICAgZm91bmQ7CisKKwlhaGMgPSAqKHN0cnVjdCBhaGNfc29mdGMgKiopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWFoY19taWRsYXllcl9lbnRyeXBvaW50X2xvY2soYWhjLCAmcyk7CisJZm91bmQgPSBhaGNfcmVzZXRfY2hhbm5lbChhaGMsIGNtZC0+ZGV2aWNlLT5jaGFubmVsICsgJ0EnLAorCQkJCSAgLyppbml0aWF0ZSByZXNldCovVFJVRSk7CisJYWhjX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShhaGMpOworCWFoY19taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGMsICZzKTsKKworCWlmIChib290dmVyYm9zZSkKKwkJcHJpbnRmKCIlczogU0NTSSBidXMgcmVzZXQgZGVsaXZlcmVkLiAiCisJCSAgICAgICAiJWQgU0NCcyBhYm9ydGVkLlxuIiwgYWhjX25hbWUoYWhjKSwgZm91bmQpOworCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK1Njc2lfSG9zdF9UZW1wbGF0ZSBhaWM3eHh4X2RyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gImFpYzd4eHgiLAorCS5wcm9jX2luZm8JCT0gYWhjX2xpbnV4X3Byb2NfaW5mbywKKwkuaW5mbwkJCT0gYWhjX2xpbnV4X2luZm8sCisJLnF1ZXVlY29tbWFuZAkJPSBhaGNfbGludXhfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBhaGNfbGludXhfYWJvcnQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gYWhjX2xpbnV4X2Rldl9yZXNldCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBhaGNfbGludXhfYnVzX3Jlc2V0LAorI2lmIGRlZmluZWQoX19pMzg2X18pCisJLmJpb3NfcGFyYW0JCT0gYWhjX2xpbnV4X2Jpb3NwYXJhbSwKKyNlbmRpZgorCS5jYW5fcXVldWUJCT0gQUhDX01BWF9RVUVVRSwKKwkudGhpc19pZAkJPSAtMSwKKwkuY21kX3Blcl9sdW4JCT0gMiwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLnNsYXZlX2FsbG9jCQk9IGFoY19saW51eF9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfY29uZmlndXJlCT0gYWhjX2xpbnV4X3NsYXZlX2NvbmZpZ3VyZSwKKwkuc2xhdmVfZGVzdHJveQkJPSBhaGNfbGludXhfc2xhdmVfZGVzdHJveSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFRhc2tsZXQgSGFuZGxlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBJbiAyLjQuWCBhbmQgYWJvdmUsIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBhIHRhc2tsZXQsCisgKiBzbyB3ZSBtdXN0IHJlLWFjcXVpcmUgb3VyIGxvY2sgcHJpb3IgdG8gZXhlY3V0aW5nIHRoaXMgY29kZS4KKyAqIEluIGFsbCBwcmlvciBrZXJuZWxzLCBhaGNfc2NoZWR1bGVfcnVucSgpIGNhbGxzIHRoaXMgcm91dGluZQorICogZGlyZWN0bHkgYW5kIGFoY19zY2hlZHVsZV9ydW5xKCkgaXMgY2FsbGVkIHdpdGggb3VyIGxvY2sgaGVsZC4KKyAqLworc3RhdGljIHZvaWQKK2FoY19ydW5xX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBhaGNfc29mdGMqIGFoYzsKKwlzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2OworCXVfbG9uZyBmbGFnczsKKworCWFoYyA9IChzdHJ1Y3QgYWhjX3NvZnRjICopZGF0YTsKKwlhaGNfbG9jayhhaGMsICZmbGFncyk7CisJd2hpbGUgKChkZXYgPSBhaGNfbGludXhfbmV4dF9kZXZpY2VfdG9fcnVuKGFoYykpICE9IE5VTEwpIHsKKwkKKwkJVEFJTFFfUkVNT1ZFKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xLCBkZXYsIGxpbmtzKTsKKwkJZGV2LT5mbGFncyAmPSB+QUhDX0RFVl9PTl9SVU5fTElTVDsKKwkJYWhjX2xpbnV4X2NoZWNrX2RldmljZV9xdWV1ZShhaGMsIGRldik7CisJCS8qIFllaWxkIHRvIG91ciBpbnRlcnJ1cHQgaGFuZGxlciAqLworCQlhaGNfdW5sb2NrKGFoYywgJmZsYWdzKTsKKwkJYWhjX2xvY2soYWhjLCAmZmxhZ3MpOworCX0KKwlhaGNfdW5sb2NrKGFoYywgJmZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQlVJTERfU0NTSUlEKGFoYywgY21kKQkJCQkJCSAgICBcCisJKCgoKGNtZCktPmRldmljZS0+aWQgPDwgVElEX1NISUZUKSAmIFRJRCkJCQkgICAgXAorCXwgKCgoY21kKS0+ZGV2aWNlLT5jaGFubmVsID09IDApID8gKGFoYyktPm91cl9pZCA6IChhaGMpLT5vdXJfaWRfYikgXAorCXwgKCgoY21kKS0+ZGV2aWNlLT5jaGFubmVsID09IDApID8gMCA6IFRXSU5fQ0hOTEIpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQnVzIERNQSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CithaGNfZG1hX3RhZ19jcmVhdGUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBidXNfZG1hX3RhZ190IHBhcmVudCwKKwkJICAgYnVzX3NpemVfdCBhbGlnbm1lbnQsIGJ1c19zaXplX3QgYm91bmRhcnksCisJCSAgIGRtYV9hZGRyX3QgbG93YWRkciwgZG1hX2FkZHJfdCBoaWdoYWRkciwKKwkJICAgYnVzX2RtYV9maWx0ZXJfdCAqZmlsdGVyLCB2b2lkICpmaWx0ZXJhcmcsCisJCSAgIGJ1c19zaXplX3QgbWF4c2l6ZSwgaW50IG5zZWdtZW50cywKKwkJICAgYnVzX3NpemVfdCBtYXhzZWdzeiwgaW50IGZsYWdzLCBidXNfZG1hX3RhZ190ICpyZXRfdGFnKQoreworCWJ1c19kbWFfdGFnX3QgZG1hdDsKKworCWRtYXQgPSBtYWxsb2Moc2l6ZW9mKCpkbWF0KSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlpZiAoZG1hdCA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisKKwkvKgorCSAqIExpbnV4IGlzIHZlcnkgc2ltcGxpc3RpYyBhYm91dCBETUEgbWVtb3J5LiAgRm9yIG5vdyBkb24ndAorCSAqIG1haW50YWluIGFsbCBzcGVjaWZpY2F0aW9uIGluZm9ybWF0aW9uLiAgT25jZSBMaW51eCBzdXBwbGllcworCSAqIGJldHRlciBmYWNpbGl0aWVzIGZvciBkb2luZyB0aGVzZSBvcGVyYXRpb25zLCBvciB0aGUKKwkgKiBuZWVkcyBvZiB0aGlzIHBhcnRpY3VsYXIgZHJpdmVyIGNoYW5nZSwgd2UgbWlnaHQgbmVlZCB0byBkbworCSAqIG1vcmUgaGVyZS4KKwkgKi8KKwlkbWF0LT5hbGlnbm1lbnQgPSBhbGlnbm1lbnQ7CisJZG1hdC0+Ym91bmRhcnkgPSBib3VuZGFyeTsKKwlkbWF0LT5tYXhzaXplID0gbWF4c2l6ZTsKKwkqcmV0X3RhZyA9IGRtYXQ7CisJcmV0dXJuICgwKTsKK30KKwordm9pZAorYWhjX2RtYV90YWdfZGVzdHJveShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGJ1c19kbWFfdGFnX3QgZG1hdCkKK3sKKwlmcmVlKGRtYXQsIE1fREVWQlVGKTsKK30KKworaW50CithaGNfZG1hbWVtX2FsbG9jKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgYnVzX2RtYV90YWdfdCBkbWF0LCB2b2lkKiogdmFkZHIsCisJCSBpbnQgZmxhZ3MsIGJ1c19kbWFtYXBfdCAqbWFwcCkKK3sKKwlidXNfZG1hbWFwX3QgbWFwOworCisJbWFwID0gbWFsbG9jKHNpemVvZigqbWFwKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlpZiAobWFwID09IE5VTEwpCisJCXJldHVybiAoRU5PTUVNKTsKKwkvKgorCSAqIEFsdGhvdWdoIHdlIGNhbiBkbWEgZGF0YSBhYm92ZSA0R0IsIG91cgorCSAqICJjb25zaXN0ZW50IiBtZW1vcnkgaXMgYmVsb3cgNEdCIGZvcgorCSAqIHNwYWNlIGVmZmljaWVuY3kgcmVhc29ucyAob25seSBuZWVkIGEgNGJ5dGUKKwkgKiBhZGRyZXNzKS4gIEZvciB0aGlzIHJlYXNvbiwgd2UgaGF2ZSB0byByZXNldAorCSAqIG91ciBkbWEgbWFzayB3aGVuIGRvaW5nIGFsbG9jYXRpb25zLgorCSAqLworCWlmIChhaGMtPmRldl9zb2Z0YyAhPSBOVUxMKQorCQlpZiAocGNpX3NldF9kbWFfbWFzayhhaGMtPmRldl9zb2Z0YywgMHhGRkZGRkZGRikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFpYzd4eHg6IE5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUuXG4iKTsKKwkJCWtmcmVlKG1hcCk7CisJCQlyZXR1cm4gKEVOT0RFVik7CisJCX0KKwkqdmFkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhaGMtPmRldl9zb2Z0YywKKwkJCQkgICAgICBkbWF0LT5tYXhzaXplLCAmbWFwLT5idXNfYWRkcik7CisJaWYgKGFoYy0+ZGV2X3NvZnRjICE9IE5VTEwpCisJCWlmIChwY2lfc2V0X2RtYV9tYXNrKGFoYy0+ZGV2X3NvZnRjLAorCQkJCSAgICAgYWhjLT5wbGF0Zm9ybV9kYXRhLT5od19kbWFfbWFzaykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFpYzd4eHg6IE5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUuXG4iKTsKKwkJCWtmcmVlKG1hcCk7CisJCQlyZXR1cm4gKEVOT0RFVik7CisJCX0KKwlpZiAoKnZhZGRyID09IE5VTEwpCisJCXJldHVybiAoRU5PTUVNKTsKKwkqbWFwcCA9IG1hcDsKKwlyZXR1cm4oMCk7Cit9CisKK3ZvaWQKK2FoY19kbWFtZW1fZnJlZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGJ1c19kbWFfdGFnX3QgZG1hdCwKKwkJdm9pZCogdmFkZHIsIGJ1c19kbWFtYXBfdCBtYXApCit7CisJcGNpX2ZyZWVfY29uc2lzdGVudChhaGMtPmRldl9zb2Z0YywgZG1hdC0+bWF4c2l6ZSwKKwkJCSAgICB2YWRkciwgbWFwLT5idXNfYWRkcik7Cit9CisKK2ludAorYWhjX2RtYW1hcF9sb2FkKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwLAorCQl2b2lkICpidWYsIGJ1c19zaXplX3QgYnVmbGVuLCBidXNfZG1hbWFwX2NhbGxiYWNrX3QgKmNiLAorCQl2b2lkICpjYl9hcmcsIGludCBmbGFncykKK3sKKwkvKgorCSAqIEFzc3VtZSBmb3Igbm93IHRoYXQgdGhpcyB3aWxsIG9ubHkgYmUgdXNlZCBkdXJpbmcKKwkgKiBpbml0aWFsaXphdGlvbiBhbmQgbm90IGZvciBwZXItdHJhbnNhY3Rpb24gYnVmZmVyIG1hcHBpbmcuCisJICovCisJYnVzX2RtYV9zZWdtZW50X3Qgc3RhY2tfc2c7CisKKwlzdGFja19zZy5kc19hZGRyID0gbWFwLT5idXNfYWRkcjsKKwlzdGFja19zZy5kc19sZW4gPSBkbWF0LT5tYXhzaXplOworCWNiKGNiX2FyZywgJnN0YWNrX3NnLCAvKm5zZWcqLzEsIC8qZXJyb3IqLzApOworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK2FoY19kbWFtYXBfZGVzdHJveShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCkKK3sKKwkvKgorCSAqIFRoZSBtYXAgbWF5IGlzIE5VTEwgaW4gb3VyIDwgMi4zLlggaW1wbGVtZW50YXRpb24uCisJICogTm93IGl0J3MgMi42LjUsIGJ1dCBqdXN0IGluIGNhc2UuLi4KKwkgKi8KKwlCVUdfT04obWFwID09IE5VTEwpOworCWZyZWUobWFwLCBNX0RFVkJVRik7Cit9CisKK2ludAorYWhjX2RtYW1hcF91bmxvYWQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXApCit7CisJLyogTm90aGluZyB0byBkbyAqLworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKiogUGxhdGZvcm0gRGVwZW5kZW50IEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ29tcGFyZSAibGVmdCBoYW5kIiBzb2Z0YyB3aXRoICJyaWdodCBoYW5kIiBzb2Z0YywgcmV0dXJuaW5nOgorICogPCAwIC0gbGFoYyBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIHJhaGMKKyAqICAgMCAtIFNvZnRjcyBhcmUgZXF1YWwKKyAqID4gMCAtIGxhaGMgaGFzIGEgaGlnaGVyIHByaW9yaXR5IHRoYW4gcmFoYworICovCitpbnQKK2FoY19zb2Z0Y19jb21wKHN0cnVjdCBhaGNfc29mdGMgKmxhaGMsIHN0cnVjdCBhaGNfc29mdGMgKnJhaGMpCit7CisJaW50CXZhbHVlOworCWludAlydmFsdWU7CisJaW50CWx2YWx1ZTsKKworCS8qCisJICogVW5kZXIgTGludXgsIGNhcmRzIGFyZSBvcmRlcmVkIGFzIGZvbGxvd3M6CisJICoJMSkgVkxCL0VJU0EgQklPUyBlbmFibGVkIGRldmljZXMgc29ydGVkIGJ5IEJJT1MgYWRkcmVzcy4KKwkgKgkyKSBQQ0kgZGV2aWNlcyB3aXRoIEJJT1MgZW5hYmxlZCBzb3J0ZWQgYnkgYnVzL3Nsb3QvZnVuYy4KKwkgKgkzKSBBbGwgcmVtYWluaW5nIFZMQi9FSVNBIGRldmljZXMgc29ydGVkIGJ5IGlvcG9ydC4KKwkgKgk0KSBBbGwgcmVtYWluaW5nIFBDSSBkZXZpY2VzIHNvcnRlZCBieSBidXMvc2xvdC9mdW5jLgorCSAqLworCXZhbHVlID0gKGxhaGMtPmZsYWdzICYgQUhDX0JJT1NfRU5BQkxFRCkKKwkgICAgICAtIChyYWhjLT5mbGFncyAmIEFIQ19CSU9TX0VOQUJMRUQpOworCWlmICh2YWx1ZSAhPSAwKQorCQkvKiBDb250cm9sbGVycyB3aXRoIEJJT1MgZW5hYmxlZCBoYXZlIGEgKmhpZ2hlciogcHJpb3JpdHkgKi8KKwkJcmV0dXJuICh2YWx1ZSk7CisKKwkvKgorCSAqIFNhbWUgQklPUyBzZXR0aW5nLCBub3cgc29ydCBiYXNlZCBvbiBidXMgdHlwZS4KKwkgKiBFSVNBIGFuZCBWTCBjb250cm9sbGVycyBzb3J0IHRvZ2V0aGVyLiAgRUlTQS9WTAorCSAqIGhhdmUgaGlnaGVyIHByaW9yaXR5IHRoYW4gUENJLgorCSAqLworCXJ2YWx1ZSA9IChyYWhjLT5jaGlwICYgQUhDX0JVU19NQVNLKTsKKyAJaWYgKHJ2YWx1ZSA9PSBBSENfVkwpCisJCXJ2YWx1ZSA9IEFIQ19FSVNBOworCWx2YWx1ZSA9IChsYWhjLT5jaGlwICYgQUhDX0JVU19NQVNLKTsKKyAJaWYgKGx2YWx1ZSA9PSBBSENfVkwpCisJCWx2YWx1ZSA9IEFIQ19FSVNBOworCXZhbHVlID0gcnZhbHVlIC0gbHZhbHVlOworCWlmICh2YWx1ZSAhPSAwKQorCQlyZXR1cm4gKHZhbHVlKTsKKworCS8qIFN0aWxsIGVxdWFsLiAgU29ydCBieSBCSU9TIGFkZHJlc3MsIGlvcG9ydCwgb3IgYnVzL3Nsb3QvZnVuYy4gKi8KKwlzd2l0Y2ggKHJ2YWx1ZSkgeworI2lmZGVmIENPTkZJR19QQ0kKKwljYXNlIEFIQ19QQ0k6CisJeworCQljaGFyIHByaW1hcnlfY2hhbm5lbDsKKworCQlpZiAoYWljN3h4eF9yZXZlcnNlX3NjYW4gIT0gMCkKKwkJCXZhbHVlID0gYWhjX2dldF9wY2lfYnVzKGxhaGMtPmRldl9zb2Z0YykKKwkJCSAgICAgIC0gYWhjX2dldF9wY2lfYnVzKHJhaGMtPmRldl9zb2Z0Yyk7CisJCWVsc2UKKwkJCXZhbHVlID0gYWhjX2dldF9wY2lfYnVzKHJhaGMtPmRldl9zb2Z0YykKKwkJCSAgICAgIC0gYWhjX2dldF9wY2lfYnVzKGxhaGMtPmRldl9zb2Z0Yyk7CisJCWlmICh2YWx1ZSAhPSAwKQorCQkJYnJlYWs7CisJCWlmIChhaWM3eHh4X3JldmVyc2Vfc2NhbiAhPSAwKQorCQkJdmFsdWUgPSBhaGNfZ2V0X3BjaV9zbG90KGxhaGMtPmRldl9zb2Z0YykKKwkJCSAgICAgIC0gYWhjX2dldF9wY2lfc2xvdChyYWhjLT5kZXZfc29mdGMpOworCQllbHNlCisJCQl2YWx1ZSA9IGFoY19nZXRfcGNpX3Nsb3QocmFoYy0+ZGV2X3NvZnRjKQorCQkJICAgICAgLSBhaGNfZ2V0X3BjaV9zbG90KGxhaGMtPmRldl9zb2Z0Yyk7CisJCWlmICh2YWx1ZSAhPSAwKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIE9uIG11bHRpLWZ1bmN0aW9uIGRldmljZXMsIHRoZSB1c2VyIGNhbiBjaG9vc2UKKwkJICogdG8gaGF2ZSBmdW5jdGlvbiAxIHByb2JlZCBiZWZvcmUgZnVuY3Rpb24gMC4KKwkJICogR2l2ZSB3aGljaGV2ZXIgY2hhbm5lbCBpcyB0aGUgcHJpbWFyeSBjaGFubmVsCisJCSAqIHRoZSBoaWdoZXN0IHByaW9yaXR5LgorCQkgKi8KKwkJcHJpbWFyeV9jaGFubmVsID0gKGxhaGMtPmZsYWdzICYgQUhDX1BSSU1BUllfQ0hBTk5FTCkgKyAnQSc7CisJCXZhbHVlID0gLTE7CisJCWlmIChsYWhjLT5jaGFubmVsID09IHByaW1hcnlfY2hhbm5lbCkKKwkJCXZhbHVlID0gMTsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisJY2FzZSBBSENfRUlTQToKKwkJaWYgKChyYWhjLT5mbGFncyAmIEFIQ19CSU9TX0VOQUJMRUQpICE9IDApIHsKKwkJCXZhbHVlID0gcmFoYy0+cGxhdGZvcm1fZGF0YS0+Ymlvc19hZGRyZXNzCisJCQkgICAgICAtIGxhaGMtPnBsYXRmb3JtX2RhdGEtPmJpb3NfYWRkcmVzczsgCisJCX0gZWxzZSB7CisJCQl2YWx1ZSA9IHJhaGMtPmJzaC5pb3BvcnQKKwkJCSAgICAgIC0gbGFoYy0+YnNoLmlvcG9ydDsgCisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGFuaWMoImFoY19zb2Z0Y19zb3J0OiBpbnZhbGlkIGJ1cyB0eXBlIik7CisJfQorCXJldHVybiAodmFsdWUpOworfQorCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X3NldHVwX3RhZ19pbmZvX2dsb2JhbChjaGFyICpwKQoreworCWludCB0YWdzLCBpLCBqOworCisJdGFncyA9IHNpbXBsZV9zdHJ0b3VsKHAgKyAxLCBOVUxMLCAwKSAmIDB4ZmY7CisJcHJpbnRmKCJTZXR0aW5nIEdsb2JhbCBUYWdzPSAlZFxuIiwgdGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0VMRU1FTlRTKGFpYzd4eHhfdGFnX2luZm8pOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IEFIQ19OVU1fVEFSR0VUUzsgaisrKSB7CisJCQlhaWM3eHh4X3RhZ19pbmZvW2ldLnRhZ19jb21tYW5kc1tqXSA9IHRhZ3M7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfc2V0dXBfdGFnX2luZm8odV9sb25nIGFyZywgaW50IGluc3RhbmNlLCBpbnQgdGFyZywgaW50MzJfdCB2YWx1ZSkKK3sKKworCWlmICgoaW5zdGFuY2UgPj0gMCkgJiYgKHRhcmcgPj0gMCkKKwkgJiYgKGluc3RhbmNlIDwgTlVNX0VMRU1FTlRTKGFpYzd4eHhfdGFnX2luZm8pKQorCSAmJiAodGFyZyA8IEFIQ19OVU1fVEFSR0VUUykpIHsKKwkJYWljN3h4eF90YWdfaW5mb1tpbnN0YW5jZV0udGFnX2NvbW1hbmRzW3RhcmddID0gdmFsdWUgJiAweGZmOworCQlpZiAoYm9vdHZlcmJvc2UpCisJCQlwcmludGYoInRhZ19pbmZvWyVkOiVkXSA9ICVkXG4iLCBpbnN0YW5jZSwgdGFyZywgdmFsdWUpOworCX0KK30KKworc3RhdGljIHZvaWQKK2FoY19saW51eF9zZXR1cF9kdih1X2xvbmcgYXJnLCBpbnQgaW5zdGFuY2UsIGludCB0YXJnLCBpbnQzMl90IHZhbHVlKQoreworCisJaWYgKChpbnN0YW5jZSA+PSAwKQorCSAmJiAoaW5zdGFuY2UgPCBOVU1fRUxFTUVOVFMoYWljN3h4eF9kdl9zZXR0aW5ncykpKSB7CisJCWFpYzd4eHhfZHZfc2V0dGluZ3NbaW5zdGFuY2VdID0gdmFsdWU7CisJCWlmIChib290dmVyYm9zZSkKKwkJCXByaW50ZigiZHZbJWRdID0gJWRcbiIsIGluc3RhbmNlLCB2YWx1ZSk7CisJfQorfQorCisvKgorICogSGFuZGxlIExpbnV4IGJvb3QgcGFyYW1ldGVycy4gVGhpcyByb3V0aW5lIGFsbG93cyBmb3IgYXNzaWduaW5nIGEgdmFsdWUKKyAqIHRvIGEgcGFyYW1ldGVyIHdpdGggYSAnOicgYmV0d2VlbiB0aGUgcGFyYW1ldGVyIGFuZCB0aGUgdmFsdWUuCisgKiBpZS4gYWljN3h4eD1zdHB3bGV2OjEsZXh0ZW5kZWQKKyAqLworc3RhdGljIGludAorYWljN3h4eF9zZXR1cChjaGFyICpzKQoreworCWludAlpLCBuOworCWNoYXIgICAqcDsKKwljaGFyICAgKmVuZDsKKworCXN0YXRpYyBzdHJ1Y3QgeworCQljb25zdCBjaGFyICpuYW1lOworCQl1aW50MzJfdCAqZmxhZzsKKwl9IG9wdGlvbnNbXSA9IHsKKwkJeyAiZXh0ZW5kZWQiLCAmYWljN3h4eF9leHRlbmRlZCB9LAorCQl7ICJub19yZXNldCIsICZhaWM3eHh4X25vX3Jlc2V0IH0sCisJCXsgInZlcmJvc2UiLCAmYWljN3h4eF92ZXJib3NlIH0sCisJCXsgImFsbG93X21lbWlvIiwgJmFpYzd4eHhfYWxsb3dfbWVtaW99LAorI2lmZGVmIEFIQ19ERUJVRworCQl7ICJkZWJ1ZyIsICZhaGNfZGVidWcgfSwKKyNlbmRpZgorCQl7ICJyZXZlcnNlX3NjYW4iLCAmYWljN3h4eF9yZXZlcnNlX3NjYW4gfSwKKwkJeyAibm9fcHJvYmUiLCAmYWljN3h4eF9wcm9iZV9laXNhX3ZsIH0sCisJCXsgInByb2JlX2Vpc2FfdmwiLCAmYWljN3h4eF9wcm9iZV9laXNhX3ZsIH0sCisJCXsgInBlcmlvZGljX290YWciLCAmYWljN3h4eF9wZXJpb2RpY19vdGFnIH0sCisJCXsgInBjaV9wYXJpdHkiLCAmYWljN3h4eF9wY2lfcGFyaXR5IH0sCisJCXsgInNlbHRpbWUiLCAmYWljN3h4eF9zZWx0aW1lIH0sCisJCXsgInRhZ19pbmZvIiwgTlVMTCB9LAorCQl7ICJnbG9iYWxfdGFnX2RlcHRoIiwgTlVMTCB9LAorCQl7ICJkdiIsIE5VTEwgfQorCX07CisKKwllbmQgPSBzdHJjaHIocywgJ1wwJyk7CisKKwkvKgorCSAqIFhYWCBpYTY0IGdjYyBpc24ndCBzbWFydCBlbm91Z2ggdG8ga25vdyB0aGF0IE5VTV9FTEVNRU5UUworCSAqIHdpbGwgbmV2ZXIgYmUgMCBpbiB0aGlzIGNhc2UuCisJICovCisJbiA9IDA7CisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJnMsICIsLiIpKSAhPSBOVUxMKSB7CisJCWlmICgqcCA9PSAnXDAnKQorCQkJY29udGludWU7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRUxFTUVOVFMob3B0aW9ucyk7IGkrKykgeworCisJCQluID0gc3RybGVuKG9wdGlvbnNbaV0ubmFtZSk7CisJCQlpZiAoc3RybmNtcChvcHRpb25zW2ldLm5hbWUsIHAsIG4pID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPT0gTlVNX0VMRU1FTlRTKG9wdGlvbnMpKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cm5jbXAocCwgImdsb2JhbF90YWdfZGVwdGgiLCBuKSA9PSAwKSB7CisJCQlhaGNfbGludXhfc2V0dXBfdGFnX2luZm9fZ2xvYmFsKHAgKyBuKTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJ0YWdfaW5mbyIsIG4pID09IDApIHsKKwkJCXMgPSBhaWNfcGFyc2VfYnJhY2Vfb3B0aW9uKCJ0YWdfaW5mbyIsIHAgKyBuLCBlbmQsCisJCQkgICAgMiwgYWhjX2xpbnV4X3NldHVwX3RhZ19pbmZvLCAwKTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJkdiIsIG4pID09IDApIHsKKwkJCXMgPSBhaWNfcGFyc2VfYnJhY2Vfb3B0aW9uKCJkdiIsIHAgKyBuLCBlbmQsIDEsCisJCQkgICAgYWhjX2xpbnV4X3NldHVwX2R2LCAwKTsKKwkJfSBlbHNlIGlmIChwW25dID09ICc6JykgeworCQkJKihvcHRpb25zW2ldLmZsYWcpID0gc2ltcGxlX3N0cnRvdWwocCArIG4gKyAxLCBOVUxMLCAwKTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJ2ZXJib3NlIiwgbikgPT0gMCkgeworCQkJKihvcHRpb25zW2ldLmZsYWcpID0gMTsKKwkJfSBlbHNlIHsKKwkJCSoob3B0aW9uc1tpXS5mbGFnKSBePSAweEZGRkZGRkZGOworCQl9CisJfQorCXJldHVybiAxOworfQorCitfX3NldHVwKCJhaWM3eHh4PSIsIGFpYzd4eHhfc2V0dXApOworCit1aW50MzJfdCBhaWM3eHh4X3ZlcmJvc2U7CisKK2ludAorYWhjX2xpbnV4X3JlZ2lzdGVyX2hvc3Qoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBTY3NpX0hvc3RfVGVtcGxhdGUgKnRlbXBsYXRlKQoreworCWNoYXIJIGJ1Zls4MF07CisJc3RydWN0CSBTY3NpX0hvc3QgKmhvc3Q7CisJY2hhcgkqbmV3X25hbWU7CisJdV9sb25nCSBzOworCXVfaW50CSB0YXJnX29mZnNldDsKKworCXRlbXBsYXRlLT5uYW1lID0gYWhjLT5kZXNjcmlwdGlvbjsKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKHRlbXBsYXRlLCBzaXplb2Yoc3RydWN0IGFoY19zb2Z0YyAqKSk7CisJaWYgKGhvc3QgPT0gTlVMTCkKKwkJcmV0dXJuIChFTk9NRU0pOworCisJKigoc3RydWN0IGFoY19zb2Z0YyAqKilob3N0LT5ob3N0ZGF0YSkgPSBhaGM7CisJYWhjX2xvY2soYWhjLCAmcyk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXNjc2lfYXNzaWduX2xvY2soaG9zdCwgJmFoYy0+cGxhdGZvcm1fZGF0YS0+c3Bpbl9sb2NrKTsKKyNlbGlmIEFIQ19TQ1NJX0hBU19IT1NUX0xPQ0sgIT0gMAorCWhvc3QtPmxvY2sgPSAmYWhjLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2s7CisjZW5kaWYKKwlhaGMtPnBsYXRmb3JtX2RhdGEtPmhvc3QgPSBob3N0OworCWhvc3QtPmNhbl9xdWV1ZSA9IEFIQ19NQVhfUVVFVUU7CisJaG9zdC0+Y21kX3Blcl9sdW4gPSAyOworCS8qIFhYWCBObyB3YXkgdG8gY29tbXVuaWNhdGUgdGhlIElEIGZvciBtdWx0aXBsZSBjaGFubmVscyAqLworCWhvc3QtPnRoaXNfaWQgPSBhaGMtPm91cl9pZDsKKwlob3N0LT5pcnEgPSBhaGMtPnBsYXRmb3JtX2RhdGEtPmlycTsKKwlob3N0LT5tYXhfaWQgPSAoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSA/IDE2IDogODsKKwlob3N0LT5tYXhfbHVuID0gQUhDX05VTV9MVU5TOworCWhvc3QtPm1heF9jaGFubmVsID0gKGFoYy0+ZmVhdHVyZXMgJiBBSENfVFdJTikgPyAxIDogMDsKKwlob3N0LT5zZ190YWJsZXNpemUgPSBBSENfTlNFRzsKKwlhaGNfc2V0X3VuaXQoYWhjLCBhaGNfbGludXhfbmV4dF91bml0KCkpOworCXNwcmludGYoYnVmLCAic2NzaSVkIiwgaG9zdC0+aG9zdF9ubyk7CisJbmV3X25hbWUgPSBtYWxsb2Moc3RybGVuKGJ1ZikgKyAxLCBNX0RFVkJVRiwgTV9OT1dBSVQpOworCWlmIChuZXdfbmFtZSAhPSBOVUxMKSB7CisJCXN0cmNweShuZXdfbmFtZSwgYnVmKTsKKwkJYWhjX3NldF9uYW1lKGFoYywgbmV3X25hbWUpOworCX0KKwlob3N0LT51bmlxdWVfaWQgPSBhaGMtPnVuaXQ7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJc2NzaV9zZXRfcGNpX2RldmljZShob3N0LCBhaGMtPmRldl9zb2Z0Yyk7CisjZW5kaWYKKwlhaGNfbGludXhfaW5pdGlhbGl6ZV9zY3NpX2J1cyhhaGMpOworCWFoY191bmxvY2soYWhjLCAmcyk7CisJYWhjLT5wbGF0Zm9ybV9kYXRhLT5kdl9waWQgPSBrZXJuZWxfdGhyZWFkKGFoY19saW51eF9kdl90aHJlYWQsIGFoYywgMCk7CisJYWhjX2xvY2soYWhjLCAmcyk7CisJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YS0+ZHZfcGlkIDwgMCkgeworCQlwcmludGYoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIERWIHRocmVhZCwgZXJyb3I9ICVkXG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgYWhjLT5wbGF0Zm9ybV9kYXRhLT5kdl9waWQpOworCQlyZXR1cm4gKC1haGMtPnBsYXRmb3JtX2RhdGEtPmR2X3BpZCk7CisJfQorCS8qCisJICogSW5pdGlhbGx5IGFsbG9jYXRlICphbGwqIG9mIG91ciBsaW51eCB0YXJnZXQgb2JqZWN0cworCSAqIHNvIHRoYXQgdGhlIERWIHRocmVhZCB3aWxsIHNjYW4gdGhlbSBhbGwgaW4gcGFyYWxsZWwKKwkgKiBqdXN0IGFmdGVyIGRyaXZlciBpbml0aWFsaXphdGlvbi4gIEFueSBkZXZpY2UgdGhhdAorCSAqIGRvZXMgbm90IGV4aXN0IHdpbGwgaGF2ZSBpdHMgdGFyZ2V0IG9iamVjdCBkZXN0cm95ZWQKKwkgKiBieSB0aGUgc2VsZWN0aW9uIHRpbWVvdXQgaGFuZGxlci4gIEluIHRoZSBjYXNlIG9mIGEKKwkgKiBkZXZpY2UgdGhhdCBhcHBlYXJzIGFmdGVyIHRoZSBpbml0aWFsIERWIHNjYW4sIGFzeW5jCisJICogbmVnb3RpYXRpb24gd2lsbCBvY2N1ciBmb3IgdGhlIGZpcnN0IGNvbW1hbmQsIGFuZCBEVgorCSAqIHdpbGwgY29tZW5jZSBzaG91bGQgdGhhdCBmaXJzdCBjb21tYW5kIGJlIHN1Y2Nlc3NmdWwuCisJICovCisJZm9yICh0YXJnX29mZnNldCA9IDA7CisJICAgICB0YXJnX29mZnNldCA8IGhvc3QtPm1heF9pZCAqIChob3N0LT5tYXhfY2hhbm5lbCArIDEpOworCSAgICAgdGFyZ19vZmZzZXQrKykgeworCQl1X2ludCBjaGFubmVsOworCQl1X2ludCB0YXJnZXQ7CisKKwkJY2hhbm5lbCA9IDA7CisJCXRhcmdldCA9IHRhcmdfb2Zmc2V0OworCQlpZiAodGFyZ2V0ID4gNworCQkgJiYgKGFoYy0+ZmVhdHVyZXMgJiBBSENfVFdJTikgIT0gMCkgeworCQkJY2hhbm5lbCA9IDE7CisJCQl0YXJnZXQgJj0gMHg3OworCQl9CisJCS8qCisJCSAqIFNraXAgb3VyIG93biBJRC4gIFNvbWUgQ29tcGFxL0hQIHN0b3JhZ2UgZGV2aWNlcworCQkgKiBoYXZlIGVuY2xvc3VyZSBtYW5hZ2VtZW50IGRldmljZXMgdGhhdCByZXNwb25kIHRvCisJCSAqIHNpbmdsZSBiaXQgc2VsZWN0aW9uIChpLmUuIHNlbGVjdGluZyBvdXJzZWx2ZXMpLgorCQkgKiBJdCBpcyBleHBlY3RlZCB0aGF0IGVpdGhlciBhbiBleHRlcm5hbCBhcHBsaWNhdGlvbgorCQkgKiBvciBhIG1vZGlmaWVkIGtlcm5lbCB3aWxsIGJlIHVzZWQgdG8gcHJvYmUgdGhpcworCQkgKiBJRCBpZiBpdCBpcyBhcHByb3ByaWF0ZS4gIFRvIGFjY29tbW9kYXRlIHRoZXNlCisJCSAqIGluc3RhbGxhdGlvbnMsIGFoY19saW51eF9hbGxvY190YXJnZXQoKSB3aWxsIGFsbG9jYXRlCisJCSAqIGZvciBvdXIgSUQgaWYgYXNrZWQgdG8gZG8gc28uCisJCSAqLworCQlpZiAoKGNoYW5uZWwgPT0gMCAmJiB0YXJnZXQgPT0gYWhjLT5vdXJfaWQpCisJCSB8fCAoY2hhbm5lbCA9PSAxICYmIHRhcmdldCA9PSBhaGMtPm91cl9pZF9iKSkKKwkJCWNvbnRpbnVlOworCisJCWFoY19saW51eF9hbGxvY190YXJnZXQoYWhjLCBjaGFubmVsLCB0YXJnZXQpOworCX0KKwlhaGNfaW50cl9lbmFibGUoYWhjLCBUUlVFKTsKKwlhaGNfbGludXhfc3RhcnRfZHYoYWhjKTsKKwlhaGNfdW5sb2NrKGFoYywgJnMpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXNjc2lfYWRkX2hvc3QoaG9zdCwgKGFoYy0+ZGV2X3NvZnRjID8gJmFoYy0+ZGV2X3NvZnRjLT5kZXYgOiBOVUxMKSk7IC8qIFhYWCBoYW5kbGUgZmFpbHVyZSAqLworCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworI2VuZGlmCisJcmV0dXJuICgwKTsKK30KKwordWludDY0X3QKK2FoY19saW51eF9nZXRfbWVtc2l6ZSh2b2lkKQoreworCXN0cnVjdCBzeXNpbmZvIHNpOworCisJc2lfbWVtaW5mbygmc2kpOworCXJldHVybiAoKHVpbnQ2NF90KXNpLnRvdGFscmFtIDw8IFBBR0VfU0hJRlQpOworfQorCisvKgorICogRmluZCB0aGUgc21hbGxlc3QgYXZhaWxhYmxlIHVuaXQgbnVtYmVyIHRvIHVzZQorICogZm9yIGEgbmV3IGRldmljZS4gIFdlIGRvbid0IGp1c3QgdXNlIGEgc3RhdGljCisgKiBjb3VudCB0byBoYW5kbGUgdGhlICJyZXBlYXRlZCBob3QtKHVuKXBsdWciCisgKiBzY2VuYXJpby4KKyAqLworc3RhdGljIGludAorYWhjX2xpbnV4X25leHRfdW5pdCh2b2lkKQoreworCXN0cnVjdCBhaGNfc29mdGMgKmFoYzsKKwlpbnQgdW5pdDsKKworCXVuaXQgPSAwOworcmV0cnk6CisJVEFJTFFfRk9SRUFDSChhaGMsICZhaGNfdGFpbHEsIGxpbmtzKSB7CisJCWlmIChhaGMtPnVuaXQgPT0gdW5pdCkgeworCQkJdW5pdCsrOworCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwlyZXR1cm4gKHVuaXQpOworfQorCisvKgorICogUGxhY2UgdGhlIFNDU0kgYnVzIGludG8gYSBrbm93biBzdGF0ZSBieSBlaXRoZXIgcmVzZXR0aW5nIGl0LAorICogb3IgZm9yY2luZyB0cmFuc2ZlciBuZWdvdGlhdGlvbnMgb24gdGhlIG5leHQgY29tbWFuZCB0byBhbnkKKyAqIHRhcmdldC4KKyAqLwordm9pZAorYWhjX2xpbnV4X2luaXRpYWxpemVfc2NzaV9idXMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWludCBpOworCWludCBudW10YXJnOworCisJaSA9IDA7CisJbnVtdGFyZyA9IDA7CisKKwlpZiAoYWljN3h4eF9ub19yZXNldCAhPSAwKQorCQlhaGMtPmZsYWdzICY9IH4oQUhDX1JFU0VUX0JVU19BfEFIQ19SRVNFVF9CVVNfQik7CisKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfUkVTRVRfQlVTX0EpICE9IDApCisJCWFoY19yZXNldF9jaGFubmVsKGFoYywgJ0EnLCAvKmluaXRpYXRlX3Jlc2V0Ki9UUlVFKTsKKwllbHNlCisJCW51bXRhcmcgPSAoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSA/IDE2IDogODsKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSAhPSAwKSB7CisKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1JFU0VUX0JVU19CKSAhPSAwKSB7CisJCQlhaGNfcmVzZXRfY2hhbm5lbChhaGMsICdCJywgLyppbml0aWF0ZV9yZXNldCovVFJVRSk7CisJCX0gZWxzZSB7CisJCQlpZiAobnVtdGFyZyA9PSAwKQorCQkJCWkgPSA4OworCQkJbnVtdGFyZyArPSA4OworCQl9CisJfQorCisJLyoKKwkgKiBGb3JjZSBuZWdvdGlhdGlvbiB0byBhc3luYyBmb3IgYWxsIHRhcmdldHMgdGhhdAorCSAqIHdpbGwgbm90IHNlZSBhbiBpbml0aWFsIGJ1cyByZXNldC4KKwkgKi8KKwlmb3IgKDsgaSA8IG51bXRhcmc7IGkrKykgeworCQlzdHJ1Y3QgYWhjX2RldmluZm8gZGV2aW5mbzsKKwkJc3RydWN0IGFoY19pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQlzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCQl1X2ludCBvdXJfaWQ7CisJCXVfaW50IHRhcmdldF9pZDsKKwkJY2hhciBjaGFubmVsOworCisJCWNoYW5uZWwgPSAnQSc7CisJCW91cl9pZCA9IGFoYy0+b3VyX2lkOworCQl0YXJnZXRfaWQgPSBpOworCQlpZiAoaSA+IDcgJiYgKGFoYy0+ZmVhdHVyZXMgJiBBSENfVFdJTikgIT0gMCkgeworCQkJY2hhbm5lbCA9ICdCJzsKKwkJCW91cl9pZCA9IGFoYy0+b3VyX2lkX2I7CisJCQl0YXJnZXRfaWQgPSBpICUgODsKKwkJfQorCQl0aW5mbyA9IGFoY19mZXRjaF90cmFuc2luZm8oYWhjLCBjaGFubmVsLCBvdXJfaWQsCisJCQkJCSAgICB0YXJnZXRfaWQsICZ0c3RhdGUpOworCQlhaGNfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBvdXJfaWQsIHRhcmdldF9pZCwKKwkJCQkgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgY2hhbm5lbCwgUk9MRV9JTklUSUFUT1IpOworCQlhaGNfdXBkYXRlX25lZ19yZXF1ZXN0KGFoYywgJmRldmluZm8sIHRzdGF0ZSwKKwkJCQkgICAgICAgdGluZm8sIEFIQ19ORUdfQUxXQVlTKTsKKwl9CisJLyogR2l2ZSB0aGUgYnVzIHNvbWUgdGltZSB0byByZWNvdmVyICovCisJaWYgKChhaGMtPmZsYWdzICYgKEFIQ19SRVNFVF9CVVNfQXxBSENfUkVTRVRfQlVTX0IpKSAhPSAwKSB7CisJCWFoY19saW51eF9mcmVlemVfc2ltcShhaGMpOworCQlpbml0X3RpbWVyKCZhaGMtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyKTsKKwkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lci5kYXRhID0gKHVfbG9uZylhaGM7CisJCWFoYy0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZXhwaXJlcyA9CisJCSAgICBqaWZmaWVzICsgKEFJQzdYWFhfUkVTRVRfREVMQVkgKiBIWikvMTAwMDsKKwkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lci5mdW5jdGlvbiA9CisJCSAgICBhaGNfbGludXhfcmVsZWFzZV9zaW1xOworCQlhZGRfdGltZXIoJmFoYy0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIpOworCX0KK30KKworaW50CithaGNfcGxhdGZvcm1fYWxsb2Moc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB2b2lkICpwbGF0Zm9ybV9hcmcpCit7CisKKwlhaGMtPnBsYXRmb3JtX2RhdGEgPQorCSAgICBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhaGNfcGxhdGZvcm1fZGF0YSksIE1fREVWQlVGLCBNX05PV0FJVCk7CisJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisJbWVtc2V0KGFoYy0+cGxhdGZvcm1fZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBhaGNfcGxhdGZvcm1fZGF0YSkpOworCVRBSUxRX0lOSVQoJmFoYy0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxKTsKKwlUQUlMUV9JTklUKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xKTsKKwlhaGMtPnBsYXRmb3JtX2RhdGEtPmlycSA9IEFIQ19MSU5VWF9OT0lSUTsKKwlhaGMtPnBsYXRmb3JtX2RhdGEtPmh3X2RtYV9tYXNrID0gMHhGRkZGRkZGRjsKKwlhaGNfbG9ja2luaXQoYWhjKTsKKwlhaGNfZG9uZV9sb2NraW5pdChhaGMpOworCWluaXRfdGltZXIoJmFoYy0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxX3RpbWVyKTsKKwlhaGMtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcV90aW1lci5kYXRhID0gKHVfbG9uZylhaGM7CisJYWhjLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIuZnVuY3Rpb24gPQorCSAgICAoYWhjX2xpbnV4X2NhbGxiYWNrX3QgKilhaGNfbGludXhfdGhyZWFkX3J1bl9jb21wbGV0ZV9xdWV1ZTsKKwlpbml0X01VVEVYX0xPQ0tFRCgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5laF9zZW0pOworCWluaXRfTVVURVhfTE9DS0VEKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmR2X3NlbSk7CisJaW5pdF9NVVRFWF9MT0NLRUQoJmFoYy0+cGxhdGZvcm1fZGF0YS0+ZHZfY21kX3NlbSk7CisJdGFza2xldF9pbml0KCZhaGMtPnBsYXRmb3JtX2RhdGEtPnJ1bnFfdGFza2xldCwgYWhjX3J1bnFfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylhaGMpOworCWFoYy0+c2VsdGltZSA9IChhaWM3eHh4X3NlbHRpbWUgJiAweDMpIDw8IDQ7CisJYWhjLT5zZWx0aW1lX2IgPSAoYWljN3h4eF9zZWx0aW1lICYgMHgzKSA8PCA0OworCWlmIChhaWM3eHh4X3BjaV9wYXJpdHkgPT0gMCkKKwkJYWhjLT5mbGFncyB8PSBBSENfRElTQUJMRV9QQ0lfUEVSUjsKKworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK2FoY19wbGF0Zm9ybV9mcmVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZzsKKwlzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2OworCWludCBpLCBqOworCisJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YSAhPSBOVUxMKSB7CisJCWRlbF90aW1lcl9zeW5jKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcV90aW1lcik7CisJCWFoY19saW51eF9raWxsX2R2X3RocmVhZChhaGMpOworCQl0YXNrbGV0X2tpbGwoJmFoYy0+cGxhdGZvcm1fZGF0YS0+cnVucV90YXNrbGV0KTsKKwkJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdCAhPSBOVUxMKSB7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCQkJc2NzaV9yZW1vdmVfaG9zdChhaGMtPnBsYXRmb3JtX2RhdGEtPmhvc3QpOworI2VuZGlmCisJCQlzY3NpX2hvc3RfcHV0KGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdCk7CisJCX0KKworCQkvKiBkZXN0cm95IGFsbCBvZiB0aGUgZGV2aWNlIGFuZCB0YXJnZXQgb2JqZWN0cyAqLworCQlmb3IgKGkgPSAwOyBpIDwgQUhDX05VTV9UQVJHRVRTOyBpKyspIHsKKwkJCXRhcmcgPSBhaGMtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbaV07CisJCQlpZiAodGFyZyAhPSBOVUxMKSB7CisJCQkJLyogS2VlcCB0YXJnZXQgYXJvdW5kIHRocm91Z2ggdGhlIGxvb3AuICovCisJCQkJdGFyZy0+cmVmY291bnQrKzsKKwkJCQlmb3IgKGogPSAwOyBqIDwgQUhDX05VTV9MVU5TOyBqKyspIHsKKworCQkJCQlpZiAodGFyZy0+ZGV2aWNlc1tqXSA9PSBOVUxMKQorCQkJCQkJY29udGludWU7CisJCQkJCWRldiA9IHRhcmctPmRldmljZXNbal07CisJCQkJCWFoY19saW51eF9mcmVlX2RldmljZShhaGMsIGRldik7CisJCQkJfQorCQkJCS8qCisJCQkJICogRm9yY2libHkgZnJlZSB0aGUgdGFyZ2V0IG5vdyB0aGF0CisJCQkJICogYWxsIGRldmljZXMgYXJlIGdvbmUuCisJCQkJICovCisJCQkJYWhjX2xpbnV4X2ZyZWVfdGFyZ2V0KGFoYywgdGFyZyk7CisgCQkJfQorIAkJfQorCisJCWlmIChhaGMtPnBsYXRmb3JtX2RhdGEtPmlycSAhPSBBSENfTElOVVhfTk9JUlEpCisJCQlmcmVlX2lycShhaGMtPnBsYXRmb3JtX2RhdGEtPmlycSwgYWhjKTsKKwkJaWYgKGFoYy0+dGFnID09IEJVU19TUEFDRV9QSU8KKwkJICYmIGFoYy0+YnNoLmlvcG9ydCAhPSAwKQorCQkJcmVsZWFzZV9yZWdpb24oYWhjLT5ic2guaW9wb3J0LCAyNTYpOworCQlpZiAoYWhjLT50YWcgPT0gQlVTX1NQQUNFX01FTUlPCisJCSAmJiBhaGMtPmJzaC5tYWRkciAhPSBOVUxMKSB7CisJCQlpb3VubWFwKGFoYy0+YnNoLm1hZGRyKTsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbihhaGMtPnBsYXRmb3JtX2RhdGEtPm1lbV9idXNhZGRyLAorCQkJCQkgICAweDEwMDApOworCQl9CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJCS8qCisJCSAqIEluIDIuNCB3ZSBkZXRhY2ggZnJvbSB0aGUgc2NzaSBtaWRsYXllciBiZWZvcmUgdGhlIFBDSQorCQkgKiBsYXllciBpbnZva2VzIG91ciByZW1vdmUgY2FsbGJhY2suICBObyBwZXItaW5zdGFuY2UKKwkJICogZGV0YWNoIGlzIHByb3ZpZGVkLCBzbyB3ZSBtdXN0IHJlYWNoIGluc2lkZSB0aGUgUENJCisJCSAqIHN1YnN5c3RlbSdzIGludGVybmFscyBhbmQgZGV0YWNoIG91ciBkcml2ZXIgbWFudWFsbHkuCisJCSAqLworCQlpZiAoYWhjLT5kZXZfc29mdGMgIT0gTlVMTCkKKwkJCWFoYy0+ZGV2X3NvZnRjLT5kcml2ZXIgPSBOVUxMOworI2VuZGlmCisJCWZyZWUoYWhjLT5wbGF0Zm9ybV9kYXRhLCBNX0RFVkJVRik7CisJfQorfQorCit2b2lkCithaGNfcGxhdGZvcm1fZnJlZXplX2RldnEoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJYWhjX3BsYXRmb3JtX2Fib3J0X3NjYnMoYWhjLCBTQ0JfR0VUX1RBUkdFVChhaGMsIHNjYiksCisJCQkJU0NCX0dFVF9DSEFOTkVMKGFoYywgc2NiKSwKKwkJCQlTQ0JfR0VUX0xVTihzY2IpLCBTQ0JfTElTVF9OVUxMLAorCQkJCVJPTEVfVU5LTk9XTiwgQ0FNX1JFUVVFVUVfUkVRKTsKK30KKwordm9pZAorYWhjX3BsYXRmb3JtX3NldF90YWdzKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLAorCQkgICAgICBhaGNfcXVldWVfYWxnIGFsZykKK3sKKwlzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2OworCWludCB3YXNfcXVldWluZzsKKwlpbnQgbm93X3F1ZXVpbmc7CisKKwlkZXYgPSBhaGNfbGludXhfZ2V0X2RldmljZShhaGMsIGRldmluZm8tPmNoYW5uZWwgLSAnQScsCisJCQkJICAgZGV2aW5mby0+dGFyZ2V0LAorCQkJCSAgIGRldmluZm8tPmx1biwgLyphbGxvYyovRkFMU0UpOworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuOworCXdhc19xdWV1aW5nID0gZGV2LT5mbGFncyAmIChBSENfREVWX1FfQkFTSUN8QUhDX0RFVl9RX1RBR0dFRCk7CisJc3dpdGNoIChhbGcpIHsKKwlkZWZhdWx0OgorCWNhc2UgQUhDX1FVRVVFX05PTkU6CisJCW5vd19xdWV1aW5nID0gMDsKKwkJYnJlYWs7IAorCWNhc2UgQUhDX1FVRVVFX0JBU0lDOgorCQlub3dfcXVldWluZyA9IEFIQ19ERVZfUV9CQVNJQzsKKwkJYnJlYWs7CisJY2FzZSBBSENfUVVFVUVfVEFHR0VEOgorCQlub3dfcXVldWluZyA9IEFIQ19ERVZfUV9UQUdHRUQ7CisJCWJyZWFrOworCX0KKwlpZiAoKGRldi0+ZmxhZ3MgJiBBSENfREVWX0ZSRUVaRV9USUxfRU1QVFkpID09IDAKKwkgJiYgKHdhc19xdWV1aW5nICE9IG5vd19xdWV1aW5nKQorCSAmJiAoZGV2LT5hY3RpdmUgIT0gMCkpIHsKKwkJZGV2LT5mbGFncyB8PSBBSENfREVWX0ZSRUVaRV9USUxfRU1QVFk7CisJCWRldi0+cWZyb3plbisrOworCX0KKworCWRldi0+ZmxhZ3MgJj0gfihBSENfREVWX1FfQkFTSUN8QUhDX0RFVl9RX1RBR0dFRHxBSENfREVWX1BFUklPRElDX09UQUcpOworCWlmIChub3dfcXVldWluZykgeworCQl1X2ludCB1c2VydGFnczsKKworCQl1c2VydGFncyA9IGFoY19saW51eF91c2VyX3RhZ2RlcHRoKGFoYywgZGV2aW5mbyk7CisJCWlmICghd2FzX3F1ZXVpbmcpIHsKKwkJCS8qCisJCQkgKiBTdGFydCBvdXQgYWdyZXNzaXZlbHkgYW5kIGFsbG93IG91cgorCQkJICogZHluYW1pYyBxdWV1ZSBkZXB0aCBhbGdvcml0aG0gdG8gdGFrZQorCQkJICogY2FyZSBvZiB0aGUgcmVzdC4KKwkJCSAqLworCQkJZGV2LT5tYXh0YWdzID0gdXNlcnRhZ3M7CisJCQlkZXYtPm9wZW5pbmdzID0gZGV2LT5tYXh0YWdzIC0gZGV2LT5hY3RpdmU7CisJCX0KKwkJaWYgKGRldi0+bWF4dGFncyA9PSAwKSB7CisJCQkvKgorCQkJICogUXVldWVpbmcgaXMgZGlzYWJsZWQgYnkgdGhlIHVzZXIuCisJCQkgKi8KKwkJCWRldi0+b3BlbmluZ3MgPSAxOworCQl9IGVsc2UgaWYgKGFsZyA9PSBBSENfUVVFVUVfVEFHR0VEKSB7CisJCQlkZXYtPmZsYWdzIHw9IEFIQ19ERVZfUV9UQUdHRUQ7CisJCQlpZiAoYWljN3h4eF9wZXJpb2RpY19vdGFnICE9IDApCisJCQkJZGV2LT5mbGFncyB8PSBBSENfREVWX1BFUklPRElDX09UQUc7CisJCX0gZWxzZQorCQkJZGV2LT5mbGFncyB8PSBBSENfREVWX1FfQkFTSUM7CisJfSBlbHNlIHsKKwkJLyogV2UgY2FuIG9ubHkgaGF2ZSBvbmUgb3BlbmluZy4gKi8KKwkJZGV2LT5tYXh0YWdzID0gMDsKKwkJZGV2LT5vcGVuaW5ncyA9ICAxIC0gZGV2LT5hY3RpdmU7CisJfQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlpZiAoZGV2LT5zY3NpX2RldmljZSAhPSBOVUxMKSB7CisJCXN3aXRjaCAoKGRldi0+ZmxhZ3MgJiAoQUhDX0RFVl9RX0JBU0lDfEFIQ19ERVZfUV9UQUdHRUQpKSkgeworCQljYXNlIEFIQ19ERVZfUV9CQVNJQzoKKwkJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldi0+c2NzaV9kZXZpY2UsCisJCQkJCQlNU0dfU0lNUExFX1RBU0ssCisJCQkJCQlkZXYtPm9wZW5pbmdzICsgZGV2LT5hY3RpdmUpOworCQkJYnJlYWs7CisJCWNhc2UgQUhDX0RFVl9RX1RBR0dFRDoKKwkJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldi0+c2NzaV9kZXZpY2UsCisJCQkJCQlNU0dfT1JERVJFRF9UQVNLLAorCQkJCQkJZGV2LT5vcGVuaW5ncyArIGRldi0+YWN0aXZlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyoKKwkJCSAqIFdlIGFsbG93IHRoZSBPUyB0byBxdWV1ZSAyIHVudGFnZ2VkIHRyYW5zYWN0aW9ucyB0bworCQkJICogdXMgYXQgYW55IHRpbWUgZXZlbiB0aG91Z2ggd2UgY2FuIG9ubHkgZXhlY3V0ZSB0aGVtCisJCQkgKiBzZXJpYWxseSBvbiB0aGUgY29udHJvbGxlci9kZXZpY2UuICBUaGlzIHNob3VsZAorCQkJICogcmVtb3ZlIHNvbWUgbGF0ZW5jeS4KKwkJCSAqLworCQkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2LT5zY3NpX2RldmljZSwKKwkJCQkJCS8qTk9OLVRBR0dFRCovMCwKKwkJCQkJCS8qcXVldWUgZGVwdGgqLzIpOworCQkJYnJlYWs7CisJCX0KKwl9CisjZW5kaWYKK30KKworaW50CithaGNfcGxhdGZvcm1fYWJvcnRfc2NicyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwKKwkJCWludCBsdW4sIHVfaW50IHRhZywgcm9sZV90IHJvbGUsIHVpbnQzMl90IHN0YXR1cykKK3sKKwlpbnQgY2hhbjsKKwlpbnQgbWF4Y2hhbjsKKwlpbnQgdGFyZzsKKwlpbnQgbWF4dGFyZzsKKwlpbnQgY2x1bjsKKwlpbnQgbWF4bHVuOworCWludCBjb3VudDsKKworCWlmICh0YWcgIT0gU0NCX0xJU1RfTlVMTCkKKwkJcmV0dXJuICgwKTsKKworCWNoYW4gPSAwOworCWlmIChjaGFubmVsICE9IEFMTF9DSEFOTkVMUykgeworCQljaGFuID0gY2hhbm5lbCAtICdBJzsKKwkJbWF4Y2hhbiA9IGNoYW4gKyAxOworCX0gZWxzZSB7CisJCW1heGNoYW4gPSAoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSA/IDIgOiAxOworCX0KKwl0YXJnID0gMDsKKwlpZiAodGFyZ2V0ICE9IENBTV9UQVJHRVRfV0lMRENBUkQpIHsKKwkJdGFyZyA9IHRhcmdldDsKKwkJbWF4dGFyZyA9IHRhcmcgKyAxOworCX0gZWxzZSB7CisJCW1heHRhcmcgPSAoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSA/IDE2IDogODsKKwl9CisJY2x1biA9IDA7CisJaWYgKGx1biAhPSBDQU1fTFVOX1dJTERDQVJEKSB7CisJCWNsdW4gPSBsdW47CisJCW1heGx1biA9IGNsdW4gKyAxOworCX0gZWxzZSB7CisJCW1heGx1biA9IEFIQ19OVU1fTFVOUzsKKwl9CisKKwljb3VudCA9IDA7CisJZm9yICg7IGNoYW4gPCBtYXhjaGFuOyBjaGFuKyspIHsKKworCQlmb3IgKDsgdGFyZyA8IG1heHRhcmc7IHRhcmcrKykgeworCisJCQlmb3IgKDsgY2x1biA8IG1heGx1bjsgY2x1bisrKSB7CisJCQkJc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldjsKKwkJCQlzdHJ1Y3QgYWhjX2J1c3lxICpidXN5cTsKKwkJCQlzdHJ1Y3QgYWhjX2NtZCAqYWNtZDsKKworCQkJCWRldiA9IGFoY19saW51eF9nZXRfZGV2aWNlKGFoYywgY2hhbiwKKwkJCQkJCQkgICB0YXJnLCBjbHVuLAorCQkJCQkJCSAgIC8qYWxsb2MqL0ZBTFNFKTsKKwkJCQlpZiAoZGV2ID09IE5VTEwpCisJCQkJCWNvbnRpbnVlOworCisJCQkJYnVzeXEgPSAmZGV2LT5idXN5cTsKKwkJCQl3aGlsZSAoKGFjbWQgPSBUQUlMUV9GSVJTVChidXN5cSkpICE9IE5VTEwpIHsKKwkJCQkJU2NzaV9DbW5kICpjbWQ7CisKKwkJCQkJY21kID0gJmFjbWRfc2NzaV9jbWQoYWNtZCk7CisJCQkJCVRBSUxRX1JFTU9WRShidXN5cSwgYWNtZCwKKwkJCQkJCSAgICAgYWNtZF9saW5rcy50cWUpOworCQkJCQljb3VudCsrOworCQkJCQljbWQtPnJlc3VsdCA9IHN0YXR1cyA8PCAxNjsKKwkJCQkJYWhjX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShhaGMsIGNtZCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIChjb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfdGhyZWFkX3J1bl9jb21wbGV0ZV9xdWV1ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJdV9sb25nIGZsYWdzOworCisJYWhjX2xvY2soYWhjLCAmZmxhZ3MpOworCWRlbF90aW1lcigmYWhjLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIpOworCWFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJj0gfkFIQ19SVU5fQ01QTFRfUV9USU1FUjsKKwlhaGNfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlKGFoYyk7CisJYWhjX3VubG9jayhhaGMsICZmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfc3RhcnRfZHYoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCisJLyoKKwkgKiBGcmVlemUgdGhlIHNpbXEgYW5kIHNpZ25hbCBhaGNfbGludXhfcXVldWUgdG8gbm90IGxldCBhbnkKKwkgKiBtb3JlIGNvbW1hbmRzIHRocm91Z2guCisJICovCisJaWYgKChhaGMtPnBsYXRmb3JtX2RhdGEtPmZsYWdzICYgQUhDX0RWX0FDVElWRSkgPT0gMCkgeworI2lmZGVmIEFIQ19ERUJVRworCQlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpCisJCQlwcmludGYoIiVzOiBXYWtpbmcgRFYgdGhyZWFkXG4iLCBhaGNfbmFtZShhaGMpKTsKKyNlbmRpZgorCisJCWFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgfD0gQUhDX0RWX0FDVElWRTsKKwkJYWhjX2xpbnV4X2ZyZWV6ZV9zaW1xKGFoYyk7CisKKwkJLyogV2FrZSB1cCB0aGUgRFYga3RocmVhZCAqLworCQl1cCgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5kdl9zZW0pOworCX0KK30KKworc3RhdGljIHZvaWQKK2FoY19saW51eF9raWxsX2R2X3RocmVhZChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJdV9sb25nIHM7CisKKwlhaGNfbG9jayhhaGMsICZzKTsKKwlpZiAoYWhjLT5wbGF0Zm9ybV9kYXRhLT5kdl9waWQgIT0gMCkgeworCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmZsYWdzIHw9IEFIQ19EVl9TSFVURE9XTjsKKwkJYWhjX3VubG9jayhhaGMsICZzKTsKKwkJdXAoJmFoYy0+cGxhdGZvcm1fZGF0YS0+ZHZfc2VtKTsKKworCQkvKgorCQkgKiBVc2UgdGhlIGVoX3NlbSBhcyBhbiBpbmRpY2F0b3IgdGhhdCB0aGUKKwkJICogZHYgdGhyZWFkIGlzIGV4aXRpbmcuICBOb3RlIHRoYXQgdGhlIGR2CisJCSAqIHRocmVhZCBtdXN0IHN0aWxsIHJldHVybiBhZnRlciBwZXJmb3JtaW5nCisJCSAqIHRoZSB1cCBvbiBvdXIgc2VtYXBob3JlIGJlZm9yZSBpdCBoYXMKKwkJICogY29tcGxldGVseSBleGl0ZWQgdGhpcyBtb2R1bGUuICBVbmZvcnR1bmF0ZWx5LAorCQkgKiB0aGVyZSBzZWVtcyB0byBiZSBubyBlYXN5IHdheSB0byB3YWl0IGZvciB0aGUKKwkJICogZXhpdCBvZiBhIHRocmVhZCBmb3Igd2hpY2ggeW91IGFyZSBub3QgdGhlCisJCSAqIHBhcmVudCAoZHYgdGhyZWFkcyBhcmUgcGFyZW50ZWQgYnkgaW5pdCkuCisJCSAqIENyb3NzIHlvdXIgZmluZ2Vycy4uLgorCQkgKi8KKwkJZG93bigmYWhjLT5wbGF0Zm9ybV9kYXRhLT5laF9zZW0pOworCisJCS8qCisJCSAqIE1hcmsgdGhlIGR2IHRocmVhZCBhcyBhbHJlYWR5IGRlYWQuICBUaGlzCisJCSAqIGF2b2lkcyBhdHRlbXB0aW5nIHRvIGtpbGwgaXQgYSBzZWNvbmQgdGltZS4KKwkJICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBtdXN0IGtpbGwgdGhlCisJCSAqIERWIHRocmVhZCBiZWZvcmUgY2FsbGluZyBhaGNfZnJlZSgpIGluIHRoZQorCQkgKiBtb2R1bGUgc2h1dGRvd24gY2FzZSB0byBhdm9pZCBib2d1cyBsb2NraW5nCisJCSAqIGluIHRoZSBTQ1NJIG1pZC1sYXllciwgYnV0IHdlIGFoY19mcmVlKCkgaXMKKwkJICogY2FsbGVkIHdpdGhvdXQga2lsbGluZyB0aGUgRFYgdGhyZWFkIGluIHRoZQorCQkgKiBpbnN0YW5jZSBkZXRhY2ggY2FzZSwgc28gYWhjX3BsYXRmb3JtX2ZyZWUoKQorCQkgKiBjYWxscyB1cyBhZ2FpbiB0byB2ZXJpZnkgdGhhdCB0aGUgRFYgdGhyZWFkCisJCSAqIGlzIGRlYWQuCisJCSAqLworCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmR2X3BpZCA9IDA7CisJfSBlbHNlIHsKKwkJYWhjX3VubG9jayhhaGMsICZzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2FoY19saW51eF9kdl90aHJlYWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QJYWhjX3NvZnRjICphaGM7CisJaW50CXRhcmdldDsKKwl1X2xvbmcJczsKKworCWFoYyA9IChzdHJ1Y3QgYWhjX3NvZnRjICopZGF0YTsKKworI2lmZGVmIEFIQ19ERUJVRworCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19EVikKKwkJcHJpbnRmKCJMYXVuY2hpbmcgRFYgVGhyZWFkXG4iKTsKKyNlbmRpZgorCisJLyoKKwkgKiBDb21wbGV0ZSB0aHJlYWQgY3JlYXRpb24uCisJICovCisJbG9ja19rZXJuZWwoKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkvKgorCSAqIERvbid0IGNhcmUgYWJvdXQgYW55IHNpZ25hbHMuCisJICovCisJc2lnaW5pdHNldGludigmY3VycmVudC0+YmxvY2tlZCwgMCk7CisKKwlkYWVtb25pemUoKTsKKwlzcHJpbnRmKGN1cnJlbnQtPmNvbW0sICJhaGNfZHZfJWQiLCBhaGMtPnVuaXQpOworI2Vsc2UKKwlkYWVtb25pemUoImFoY19kdl8lZCIsIGFoYy0+dW5pdCk7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfRlJFRVpFOworI2VuZGlmCisJdW5sb2NrX2tlcm5lbCgpOworCisJd2hpbGUgKDEpIHsKKwkJLyoKKwkJICogVXNlIGRvd25faW50ZXJydXB0aWJsZSgpIHJhdGhlciB0aGFuIGRvd24oKSB0bworCQkgKiBhdm9pZCBpbmNsdXNpb24gaW4gdGhlIGxvYWQgYXZlcmFnZS4KKwkJICovCisJCWRvd25faW50ZXJydXB0aWJsZSgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5kdl9zZW0pOworCisJCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBiZWVuIHNpZ25hbGVkIHRvIGV4aXQgKi8KKwkJYWhjX2xvY2soYWhjLCAmcyk7CisJCWlmICgoYWhjLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmIEFIQ19EVl9TSFVURE9XTikgIT0gMCkgeworCQkJYWhjX3VubG9jayhhaGMsICZzKTsKKwkJCWJyZWFrOworCQl9CisJCWFoY191bmxvY2soYWhjLCAmcyk7CisKKyNpZmRlZiBBSENfREVCVUcKKwkJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX0RWKQorCQkJcHJpbnRmKCIlczogQmVnaW5uaW5nIERvbWFpbiBWYWxpZGF0aW9uXG4iLAorCQkJICAgICAgIGFoY19uYW1lKGFoYykpOworI2VuZGlmCisKKwkJLyoKKwkJICogV2FpdCBmb3IgYW55IHBlbmRpbmcgY29tbWFuZHMgdG8gZHJhaW4gYmVmb3JlIHByb2NlZWRpbmcuCisJCSAqLworCQlhaGNfbG9jayhhaGMsICZzKTsKKwkJd2hpbGUgKExJU1RfRklSU1QoJmFoYy0+cGVuZGluZ19zY2JzKSAhPSBOVUxMKSB7CisJCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmZsYWdzIHw9IEFIQ19EVl9XQUlUX1NJTVFfRU1QVFk7CisJCQlhaGNfdW5sb2NrKGFoYywgJnMpOworCQkJZG93bl9pbnRlcnJ1cHRpYmxlKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmR2X3NlbSk7CisJCQlhaGNfbG9jayhhaGMsICZzKTsKKwkJfQorCisJCS8qCisJCSAqIFdhaXQgZm9yIHRoZSBTSU1RIHRvIGJlIHJlbGVhc2VkIHNvIHRoYXQgRFYgaXMgdGhlCisJCSAqIG9ubHkgcmVhc29uIHRoZSBxdWV1ZSBpcyBmcm96ZW4uCisJCSAqLworCQl3aGlsZSAoQUhDX0RWX1NJTVFfRlJPWkVOKGFoYykgPT0gMCkgeworCQkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSENfRFZfV0FJVF9TSU1RX1JFTEVBU0U7CisJCQlhaGNfdW5sb2NrKGFoYywgJnMpOworCQkJZG93bl9pbnRlcnJ1cHRpYmxlKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmR2X3NlbSk7CisJCQlhaGNfbG9jayhhaGMsICZzKTsKKwkJfQorCQlhaGNfdW5sb2NrKGFoYywgJnMpOworCisJCWZvciAodGFyZ2V0ID0gMDsgdGFyZ2V0IDwgQUhDX05VTV9UQVJHRVRTOyB0YXJnZXQrKykKKwkJCWFoY19saW51eF9kdl90YXJnZXQoYWhjLCB0YXJnZXQpOworCisJCWFoY19sb2NrKGFoYywgJnMpOworCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmZsYWdzICY9IH5BSENfRFZfQUNUSVZFOworCQlhaGNfdW5sb2NrKGFoYywgJnMpOworCisJCS8qCisJCSAqIFJlbGVhc2UgdGhlIFNJTVEgc28gdGhhdCBub3JtYWwgY29tbWFuZHMgYXJlCisJCSAqIGFsbG93ZWQgdG8gY29udGludWUgb24gdGhlIGJ1cy4KKwkJICovCisJCWFoY19saW51eF9yZWxlYXNlX3NpbXEoKHVfbG9uZylhaGMpOworCX0KKwl1cCgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5laF9zZW0pOworCXJldHVybiAoMCk7Cit9CisKKyNkZWZpbmUgQUhDX0xJTlVYX0RWX0lOUV9TSE9SVF9MRU4JMzYKKyNkZWZpbmUgQUhDX0xJTlVYX0RWX0lOUV9MRU4JCTI1NgorI2RlZmluZSBBSENfTElOVVhfRFZfVElNRU9VVAkJKEhaIC8gNCkKKworI2RlZmluZSBBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgbmV3c3RhdGUpIFwKKwlhaGNfc2V0X2R2X3N0YXRlKGFoYywgdGFyZywgbmV3c3RhdGUsIF9fTElORV9fKQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX3NldF9kdl9zdGF0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfbGludXhfdGFyZ2V0ICp0YXJnLAorCQkgYWhjX2R2X3N0YXRlIG5ld3N0YXRlLCB1X2ludCBsaW5lKQoreworCWFoY19kdl9zdGF0ZSBvbGRzdGF0ZTsKKworCW9sZHN0YXRlID0gdGFyZy0+ZHZfc3RhdGU7CisjaWZkZWYgQUhDX0RFQlVHCisJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX0RWKQorCQlwcmludGYoIiVzOiVkOiBHb2luZyBmcm9tIHN0YXRlICVkIHRvIHN0YXRlICVkXG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgbGluZSwgb2xkc3RhdGUsIG5ld3N0YXRlKTsKKyNlbmRpZgorCisJaWYgKG9sZHN0YXRlID09IG5ld3N0YXRlKQorCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeSsrOworCWVsc2UKKwkJdGFyZy0+ZHZfc3RhdGVfcmV0cnkgPSAwOworCXRhcmctPmR2X3N0YXRlID0gbmV3c3RhdGU7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfZHZfdGFyZ2V0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgdGFyZ2V0X29mZnNldCkKK3sKKwlzdHJ1Y3QJIGFoY19kZXZpbmZvIGRldmluZm87CisJc3RydWN0CSBhaGNfbGludXhfdGFyZ2V0ICp0YXJnOworCXN0cnVjdAkgc2NzaV9jbW5kICpjbWQ7CisJc3RydWN0CSBzY3NpX2RldmljZSAqc2NzaV9kZXY7CisJc3RydWN0CSBzY3NpX3NlbnNlX2RhdGEgKnNlbnNlOworCXVpbnQ4X3QgKmJ1ZmZlcjsKKwl1X2xvbmcJIHM7CisJdV9pbnQJIHRpbWVvdXQ7CisJaW50CSBlY2hvX3NpemU7CisKKwlzZW5zZSA9IE5VTEw7CisJYnVmZmVyID0gTlVMTDsKKwllY2hvX3NpemUgPSAwOworCWFoY19sb2NrKGFoYywgJnMpOworCXRhcmcgPSBhaGMtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0X29mZnNldF07CisJaWYgKHRhcmcgPT0gTlVMTCB8fCAodGFyZy0+ZmxhZ3MgJiBBSENfRFZfUkVRVUlSRUQpID09IDApIHsKKwkJYWhjX3VubG9jayhhaGMsICZzKTsKKwkJcmV0dXJuOworCX0KKwlhaGNfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLAorCQkJICAgIHRhcmctPmNoYW5uZWwgPT0gMCA/IGFoYy0+b3VyX2lkIDogYWhjLT5vdXJfaWRfYiwKKwkJCSAgICB0YXJnLT50YXJnZXQsIC8qbHVuKi8wLCB0YXJnLT5jaGFubmVsICsgJ0EnLAorCQkJICAgIFJPTEVfSU5JVElBVE9SKTsKKyNpZmRlZiBBSENfREVCVUcKKwlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJYWhjX3ByaW50X2RldmluZm8oYWhjLCAmZGV2aW5mbyk7CisJCXByaW50ZigiUGVyZm9ybWluZyBEVlxuIik7CisJfQorI2VuZGlmCisKKwlhaGNfdW5sb2NrKGFoYywgJnMpOworCisJY21kID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NzaV9jbW5kKSwgTV9ERVZCVUYsIE1fV0FJVE9LKTsKKwlzY3NpX2RldiA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNjc2lfZGV2aWNlKSwgTV9ERVZCVUYsIE1fV0FJVE9LKTsKKwlzY3NpX2Rldi0+aG9zdCA9IGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdDsKKwlzY3NpX2Rldi0+aWQgPSBkZXZpbmZvLnRhcmdldDsKKwlzY3NpX2Rldi0+bHVuID0gZGV2aW5mby5sdW47CisJc2NzaV9kZXYtPmNoYW5uZWwgPSBkZXZpbmZvLmNoYW5uZWwgLSAnQSc7CisJYWhjLT5wbGF0Zm9ybV9kYXRhLT5kdl9zY3NpX2RldiA9IHNjc2lfZGV2OworCisJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCisJd2hpbGUgKHRhcmctPmR2X3N0YXRlICE9IEFIQ19EVl9TVEFURV9FWElUKSB7CisJCXRpbWVvdXQgPSBBSENfTElOVVhfRFZfVElNRU9VVDsKKwkJc3dpdGNoICh0YXJnLT5kdl9zdGF0ZSkgeworCQljYXNlIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkM6CisJCWNhc2UgQUhDX0RWX1NUQVRFX0lOUV9BU1lOQzoKKwkJY2FzZSBBSENfRFZfU1RBVEVfSU5RX0FTWU5DX1ZFUklGWToKKwkJCS8qCisJCQkgKiBTZXQgdGhpbmdzIHRvIGFzeW5jIG5hcnJvdyB0byByZWR1Y2UgdGhlCisJCQkgKiBjaGFuY2UgdGhhdCB0aGUgSU5RIHdpbGwgZmFpbC4KKwkJCSAqLworCQkJYWhjX2xvY2soYWhjLCAmcyk7CisJCQlhaGNfc2V0X3N5bmNyYXRlKGFoYywgJmRldmluZm8sIE5VTEwsIDAsIDAsIDAsCisJCQkJCSBBSENfVFJBTlNfR09BTCwgLypwYXVzZWQqL0ZBTFNFKTsKKwkJCWFoY19zZXRfd2lkdGgoYWhjLCAmZGV2aW5mbywgTVNHX0VYVF9XRFRSX0JVU184X0JJVCwKKwkJCQkgICAgICBBSENfVFJBTlNfR09BTCwgLypwYXVzZWQqL0ZBTFNFKTsKKwkJCWFoY191bmxvY2soYWhjLCAmcyk7CisJCQl0aW1lb3V0ID0gMTAgKiBIWjsKKwkJCXRhcmctPmZsYWdzICY9IH5BSENfSU5RX1ZBTElEOworCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSBBSENfRFZfU1RBVEVfSU5RX1ZFUklGWToKKwkJeworCQkJdV9pbnQgaW5xX2xlbjsKKworCQkJaWYgKHRhcmctPmR2X3N0YXRlID09IEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpCisJCQkJaW5xX2xlbiA9IEFIQ19MSU5VWF9EVl9JTlFfU0hPUlRfTEVOOworCQkJZWxzZQorCQkJCWlucV9sZW4gPSB0YXJnLT5pbnFfZGF0YS0+YWRkaXRpb25hbF9sZW5ndGggKyA1OworCQkJYWhjX2xpbnV4X2R2X2lucShhaGMsIGNtZCwgJmRldmluZm8sIHRhcmcsIGlucV9sZW4pOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBBSENfRFZfU1RBVEVfVFVSOgorCQljYXNlIEFIQ19EVl9TVEFURV9CVVNZOgorCQkJdGltZW91dCA9IDUgKiBIWjsKKwkJCWFoY19saW51eF9kdl90dXIoYWhjLCBjbWQsICZkZXZpbmZvKTsKKwkJCWJyZWFrOworCQljYXNlIEFIQ19EVl9TVEFURV9SRUJEOgorCQkJYWhjX2xpbnV4X2R2X3JlYmQoYWhjLCBjbWQsICZkZXZpbmZvLCB0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlIEFIQ19EVl9TVEFURV9XRUI6CisJCQlhaGNfbGludXhfZHZfd2ViKGFoYywgY21kLCAmZGV2aW5mbywgdGFyZyk7CisJCQlicmVhazsKKworCQljYXNlIEFIQ19EVl9TVEFURV9SRUI6CisJCQlhaGNfbGludXhfZHZfcmViKGFoYywgY21kLCAmZGV2aW5mbywgdGFyZyk7CisJCQlicmVhazsKKworCQljYXNlIEFIQ19EVl9TVEFURV9TVToKKwkJCWFoY19saW51eF9kdl9zdShhaGMsIGNtZCwgJmRldmluZm8sIHRhcmcpOworCQkJdGltZW91dCA9IDUwICogSFo7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYWhjX3ByaW50X2RldmluZm8oYWhjLCAmZGV2aW5mbyk7CisJCQlwcmludGYoIlVua25vd24gRFYgc3RhdGUgJWRcbiIsIHRhcmctPmR2X3N0YXRlKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogUXVldWUgdGhlIGNvbW1hbmQgYW5kIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlICovCisJCS8qIEFidXNlIGVoX3RpbWVvdXQgaW4gdGhlIHNjc2lfY21uZCBzdHJ1Y3QgZm9yIG91ciBwdXJwb3NlcyAqLworCQlpbml0X3RpbWVyKCZjbWQtPmVoX3RpbWVvdXQpOworI2lmZGVmIEFIQ19ERUJVRworCQlpZiAoKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX01FU1NBR0VTKSAhPSAwKQorCQkJLyoKKwkJCSAqIEFsbCBvZiB0aGUgcHJpbnRmcyBkdXJpbmcgbmVnb3RpYXRpb24KKwkJCSAqIHJlYWxseSBzbG93IGRvd24gdGhlIG5lZ290aWF0aW9uLgorCQkJICogQWRkIGEgYml0IG9mIHRpbWUganVzdCB0byBiZSBzYWZlLgorCQkJICovCisJCQl0aW1lb3V0ICs9IEhaOworI2VuZGlmCisJCXNjc2lfYWRkX3RpbWVyKGNtZCwgdGltZW91dCwgYWhjX2xpbnV4X2R2X3RpbWVvdXQpOworCQkvKgorCQkgKiBJbiAyLjUuWCwgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbCBjYWxscyBmcm9tIHRoZQorCQkgKiAibWlkbGF5ZXIiICh3aGljaCB3ZSBhcmUgZW11bGF0aW5nKSB3aWxsIGhhdmUgdGhlCisJCSAqIGFoYyBob3N0IGxvY2sgaGVsZC4gIEZvciBvdGhlciBrZXJuZWxzLCB0aGUKKwkJICogaW9fcmVxdWVzdF9sb2NrIG11c3QgYmUgaGVsZC4KKwkJICovCisjaWYgQUhDX1NDU0lfSEFTX0hPU1RfTE9DSyAhPSAwCisJCWFoY19sb2NrKGFoYywgJnMpOworI2Vsc2UKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvX3JlcXVlc3RfbG9jaywgcyk7CisjZW5kaWYKKwkJYWhjX2xpbnV4X3F1ZXVlKGNtZCwgYWhjX2xpbnV4X2R2X2NvbXBsZXRlKTsKKyNpZiBBSENfU0NTSV9IQVNfSE9TVF9MT0NLICE9IDAKKwkJYWhjX3VubG9jayhhaGMsICZzKTsKKyNlbHNlCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvX3JlcXVlc3RfbG9jaywgcyk7CisjZW5kaWYKKwkJZG93bl9pbnRlcnJ1cHRpYmxlKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmR2X2NtZF9zZW0pOworCQkvKgorCQkgKiBXYWl0IGZvciB0aGUgU0lNUSB0byBiZSByZWxlYXNlZCBzbyB0aGF0IERWIGlzIHRoZQorCQkgKiBvbmx5IHJlYXNvbiB0aGUgcXVldWUgaXMgZnJvemVuLgorCQkgKi8KKwkJYWhjX2xvY2soYWhjLCAmcyk7CisJCXdoaWxlIChBSENfRFZfU0lNUV9GUk9aRU4oYWhjKSA9PSAwKSB7CisJCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmZsYWdzIHw9IEFIQ19EVl9XQUlUX1NJTVFfUkVMRUFTRTsKKwkJCWFoY191bmxvY2soYWhjLCAmcyk7CisJCQlkb3duX2ludGVycnVwdGlibGUoJmFoYy0+cGxhdGZvcm1fZGF0YS0+ZHZfc2VtKTsKKwkJCWFoY19sb2NrKGFoYywgJnMpOworCQl9CisJCWFoY191bmxvY2soYWhjLCAmcyk7CisKKwkJYWhjX2xpbnV4X2R2X3RyYW5zaXRpb24oYWhjLCBjbWQsICZkZXZpbmZvLCB0YXJnKTsKKwl9CisKK291dDoKKwlpZiAoKHRhcmctPmZsYWdzICYgQUhDX0lOUV9WQUxJRCkgIT0gMAorCSAmJiBhaGNfbGludXhfZ2V0X2RldmljZShhaGMsIGRldmluZm8uY2hhbm5lbCAtICdBJywKKwkJCQkgZGV2aW5mby50YXJnZXQsIGRldmluZm8ubHVuLAorCQkJCSAvKmFsbG9jKi9GQUxTRSkgPT0gTlVMTCkgeworCQkvKgorCQkgKiBUaGUgRFYgc3RhdGUgbWFjaGluZSBmYWlsZWQgdG8gY29uZmlndXJlIHRoaXMgZGV2aWNlLiAgCisJCSAqIFRoaXMgaXMgbm9ybWFsIGlmIERWIGlzIGRpc2FibGVkLiAgU2luY2Ugd2UgaGF2ZSBpbnF1aXJ5CisJCSAqIGRhdGEsIGZpbHRlciBpdCBhbmQgdXNlIHRoZSAib3B0aW1pc3RpYyIgbmVnb3RpYXRpb24KKwkJICogcGFyYW1ldGVycyBmb3VuZCBpbiB0aGUgaW5xdWlyeSBzdHJpbmcuCisJCSAqLworCQlhaGNfbGludXhfZmlsdGVyX2lucXVpcnkoYWhjLCAmZGV2aW5mbyk7CisJCWlmICgodGFyZy0+ZmxhZ3MgJiAoQUhDX0JBU0lDX0RWfEFIQ19FTkhBTkNFRF9EVikpICE9IDApIHsKKwkJCWFoY19wcmludF9kZXZpbmZvKGFoYywgJmRldmluZm8pOworCQkJcHJpbnRmKCJEViBmYWlsZWQgdG8gY29uZmlndXJlIGRldmljZS4gICIKKwkJCSAgICAgICAiUGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0IGFnYWluc3QgIgorCQkJICAgICAgICJ0aGlzIGRyaXZlci5cbiIpOworCQl9CisJfQorCisJaWYgKGNtZCAhPSBOVUxMKQorCQlmcmVlKGNtZCwgTV9ERVZCVUYpOworCisJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YS0+ZHZfc2NzaV9kZXYgIT0gTlVMTCkgeworCQlmcmVlKGFoYy0+cGxhdGZvcm1fZGF0YS0+ZHZfc2NzaV9kZXYsIE1fREVWQlVGKTsKKwkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5kdl9zY3NpX2RldiA9IE5VTEw7CisJfQorCisJYWhjX2xvY2soYWhjLCAmcyk7CisJaWYgKHRhcmctPmR2X2J1ZmZlciAhPSBOVUxMKSB7CisJCWZyZWUodGFyZy0+ZHZfYnVmZmVyLCBNX0RFVkJVRik7CisJCXRhcmctPmR2X2J1ZmZlciA9IE5VTEw7CisJfQorCWlmICh0YXJnLT5kdl9idWZmZXIxICE9IE5VTEwpIHsKKwkJZnJlZSh0YXJnLT5kdl9idWZmZXIxLCBNX0RFVkJVRik7CisJCXRhcmctPmR2X2J1ZmZlcjEgPSBOVUxMOworCX0KKwl0YXJnLT5mbGFncyAmPSB+QUhDX0RWX1JFUVVJUkVEOworCWlmICh0YXJnLT5yZWZjb3VudCA9PSAwKQorCQlhaGNfbGludXhfZnJlZV90YXJnZXQoYWhjLCB0YXJnKTsKKwlhaGNfdW5sb2NrKGFoYywgJnMpOworfQorCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X2R2X3RyYW5zaXRpb24oc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQlzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sCisJCQlzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZykKK3sKKwl1X2ludDMyX3Qgc3RhdHVzOworCisJc3RhdHVzID0gYWljX2Vycm9yX2FjdGlvbihjbWQsIHRhcmctPmlucV9kYXRhLAorCQkJCSAgYWhjX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCksCisJCQkJICBhaGNfY21kX2dldF9zY3NpX3N0YXR1cyhjbWQpKTsKKwkKKyNpZmRlZiBBSENfREVCVUcKKwlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJYWhjX3ByaW50X2RldmluZm8oYWhjLCBkZXZpbmZvKTsKKwkJcHJpbnRmKCJFbnRlcmluZyBhaGNfbGludXhfZHZfdHJhbnNpdGlvbiwgc3RhdGU9ICVkLCAiCisJCSAgICAgICAic3RhdHVzPSAweCV4LCBjbWQtPnJlc3VsdD0gMHgleFxuIiwgdGFyZy0+ZHZfc3RhdGUsCisJCSAgICAgICBzdGF0dXMsIGNtZC0+cmVzdWx0KTsKKwl9CisjZW5kaWYKKworCXN3aXRjaCAodGFyZy0+ZHZfc3RhdGUpIHsKKwljYXNlIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkM6CisJY2FzZSBBSENfRFZfU1RBVEVfSU5RX0FTWU5DOgorCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKKwkJY2FzZSBTU19OT1A6CisJCXsKKwkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCB0YXJnLT5kdl9zdGF0ZSsxKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU1NfSU5RX1JFRlJFU0g6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCQkJYnJlYWs7CisJCWNhc2UgU1NfVFVSOgorCQljYXNlIFNTX1JFVFJZOgorCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKKwkJCWlmIChhaGNfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQorCQkJID09IENBTV9SRVFVRVVFX1JFUSkKKwkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeS0tOworCQkJaWYgKChzdGF0dXMgJiBTU19FUlJNQVNLKSA9PSBFQlVTWSkKKwkJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgQUhDX0RWX1NUQVRFX0JVU1kpOworCQkJaWYgKHRhcmctPmR2X3N0YXRlX3JldHJ5IDwgMTApCisJCQkJYnJlYWs7CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQlkZWZhdWx0OgorCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIEFIQ19EVl9TVEFURV9FWElUKTsKKyNpZmRlZiBBSENfREVCVUcKKwkJCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19EVikgeworCQkJCWFoY19wcmludF9kZXZpbmZvKGFoYywgZGV2aW5mbyk7CisJCQkJcHJpbnRmKCJGYWlsZWQgRFYgaW5xdWlyeSwgc2tpcHBpbmdcbiIpOworCQkJfQorI2VuZGlmCisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEFIQ19EVl9TVEFURV9JTlFfQVNZTkNfVkVSSUZZOgorCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKKwkJY2FzZSBTU19OT1A6CisJCXsKKwkJCXVfaW50IHhwb3J0ZmxhZ3M7CisJCQl1X2ludCBzcGkzZGF0YTsKKworCQkJaWYgKG1lbWNtcCh0YXJnLT5pbnFfZGF0YSwgdGFyZy0+ZHZfYnVmZmVyLAorCQkJCSAgIEFIQ19MSU5VWF9EVl9JTlFfTEVOKSAhPSAwKSB7CisJCQkJLyoKKwkJCQkgKiBJbnF1aXJ5IGRhdGEgbXVzdCBoYXZlIGNoYW5nZWQuCisJCQkJICogVHJ5IGZyb20gdGhlIHRvcCBhZ2Fpbi4KKwkJCQkgKi8KKwkJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJCSBBSENfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIHRhcmctPmR2X3N0YXRlKzEpOworCQkJdGFyZy0+ZmxhZ3MgfD0gQUhDX0lOUV9WQUxJRDsKKwkJCWlmIChhaGNfbGludXhfdXNlcl9kdl9zZXR0aW5nKGFoYykgPT0gMCkKKwkJCQlicmVhazsKKworCQkJeHBvcnRmbGFncyA9IHRhcmctPmlucV9kYXRhLT5mbGFnczsKKwkJCWlmICgoeHBvcnRmbGFncyAmIChTSURfU3luY3xTSURfV0J1czE2KSkgPT0gMCkKKwkJCQlicmVhazsKKworCQkJc3BpM2RhdGEgPSB0YXJnLT5pbnFfZGF0YS0+c3BpM2RhdGE7CisJCQlzd2l0Y2ggKHNwaTNkYXRhICYgU0lEX1NQSV9DTE9DS19EVF9TVCkgeworCQkJZGVmYXVsdDoKKwkJCWNhc2UgU0lEX1NQSV9DTE9DS19TVDoKKwkJCQkvKiBBc3N1bWUgb25seSBiYXNpYyBEViBpcyBzdXBwb3J0ZWQuICovCisJCQkJdGFyZy0+ZmxhZ3MgfD0gQUhDX0JBU0lDX0RWOworCQkJCWJyZWFrOworCQkJY2FzZSBTSURfU1BJX0NMT0NLX0RUOgorCQkJY2FzZSBTSURfU1BJX0NMT0NLX0RUX1NUOgorCQkJCXRhcmctPmZsYWdzIHw9IEFIQ19FTkhBTkNFRF9EVjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU1NfSU5RX1JFRlJFU0g6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCQkJYnJlYWs7CisJCWNhc2UgU1NfVFVSOgorCQljYXNlIFNTX1JFVFJZOgorCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKKwkJCWlmIChhaGNfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQorCQkJID09IENBTV9SRVFVRVVFX1JFUSkKKwkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeS0tOworCisJCQlpZiAoKHN0YXR1cyAmIFNTX0VSUk1BU0spID09IEVCVVNZKQorCQkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfQlVTWSk7CisJCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPCAxMCkKKwkJCQlicmVhazsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWRlZmF1bHQ6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgQUhDX0RWX1NUQVRFX0VYSVQpOworI2lmZGVmIEFIQ19ERUJVRworCQkJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX0RWKSB7CisJCQkJYWhjX3ByaW50X2RldmluZm8oYWhjLCBkZXZpbmZvKTsKKwkJCQlwcmludGYoIkZhaWxlZCBEViBpbnF1aXJ5LCBza2lwcGluZ1xuIik7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgQUhDX0RWX1NUQVRFX0lOUV9WRVJJRlk6CisJCXN3aXRjaCAoc3RhdHVzICYgU1NfTUFTSykgeworCQljYXNlIFNTX05PUDoKKwkJeworCisJCQlpZiAobWVtY21wKHRhcmctPmlucV9kYXRhLCB0YXJnLT5kdl9idWZmZXIsCisJCQkJICAgQUhDX0xJTlVYX0RWX0lOUV9MRU4pID09IDApIHsKKwkJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgQUhDX0RWX1NUQVRFX0VYSVQpOworCQkJCWJyZWFrOworCQkJfQorI2lmZGVmIEFIQ19ERUJVRworCQkJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX0RWKSB7CisJCQkJaW50IGk7CisKKwkJCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsIGRldmluZm8pOworCQkJCXByaW50ZigiSW5xdWlyeSBidWZmZXIgbWlzbWF0Y2g6Iik7CisJCQkJZm9yIChpID0gMDsgaSA8IEFIQ19MSU5VWF9EVl9JTlFfTEVOOyBpKyspIHsKKwkJCQkJaWYgKChpICYgMHhGKSA9PSAwKQorCQkJCQkJcHJpbnRmKCJcbiAgICAgICAgIik7CisJCQkJCXByaW50ZigiMHgleDoweDAleCAiLAorCQkJCQkgICAgICAgKCh1aW50OF90ICopdGFyZy0+aW5xX2RhdGEpW2ldLCAKKwkJCQkJICAgICAgIHRhcmctPmR2X2J1ZmZlcltpXSk7CisJCQkJfQorCQkJCXByaW50ZigiXG4iKTsKKwkJCX0KKyNlbmRpZgorCisJCQlpZiAoYWhjX2xpbnV4X2ZhbGxiYWNrKGFoYywgZGV2aW5mbykgIT0gMCkgeworCQkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfRVhJVCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKgorCQkJICogRG8gbm90IGNvdW50ICJmYWxsaW5nIGJhY2siCisJCQkgKiBhZ2FpbnN0IG91ciByZXRyaWVzLgorCQkJICovCisJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeSA9IDA7CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTU19JTlFfUkVGUkVTSDoKKwkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLAorCQkJCQkgQUhDX0RWX1NUQVRFX0lOUV9TSE9SVF9BU1lOQyk7CisJCQlicmVhazsKKwkJY2FzZSBTU19UVVI6CisJCWNhc2UgU1NfUkVUUlk6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOworCQkJaWYgKGFoY19jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpCisJCQkgPT0gQ0FNX1JFUVVFVUVfUkVRKSB7CisJCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnktLTsKKwkJCX0gZWxzZSBpZiAoKHN0YXR1cyAmIFNTUV9GQUxMQkFDSykgIT0gMCkgeworCQkJCWlmIChhaGNfbGludXhfZmFsbGJhY2soYWhjLCBkZXZpbmZvKSAhPSAwKSB7CisJCQkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLAorCQkJCQkJCSBBSENfRFZfU1RBVEVfRVhJVCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIERvIG5vdCBjb3VudCAiZmFsbGluZyBiYWNrIgorCQkJCSAqIGFnYWluc3Qgb3VyIHJldHJpZXMuCisJCQkJICovCisJCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnkgPSAwOworCQkJfSBlbHNlIGlmICgoc3RhdHVzICYgU1NfRVJSTUFTSykgPT0gRUJVU1kpCisJCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIEFIQ19EVl9TVEFURV9CVVNZKTsKKwkJCWlmICh0YXJnLT5kdl9zdGF0ZV9yZXRyeSA8IDEwKQorCQkJCWJyZWFrOworCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJZGVmYXVsdDoKKwkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfRVhJVCk7CisjaWZkZWYgQUhDX0RFQlVHCisJCQlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsIGRldmluZm8pOworCQkJCXByaW50ZigiRmFpbGVkIERWIGlucXVpcnksIHNraXBwaW5nXG4iKTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFIQ19EVl9TVEFURV9UVVI6CisJCXN3aXRjaCAoc3RhdHVzICYgU1NfTUFTSykgeworCQljYXNlIFNTX05PUDoKKwkJCWlmICgodGFyZy0+ZmxhZ3MgJiBBSENfQkFTSUNfRFYpICE9IDApIHsKKwkJCQlhaGNfbGludXhfZmlsdGVyX2lucXVpcnkoYWhjLCBkZXZpbmZvKTsKKwkJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJCSBBSENfRFZfU1RBVEVfSU5RX1ZFUklGWSk7CisJCQl9IGVsc2UgaWYgKCh0YXJnLT5mbGFncyAmIEFIQ19FTkhBTkNFRF9EVikgIT0gMCkgeworCQkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfUkVCRCk7CisJCQl9IGVsc2UgeworCQkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfRVhJVCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTU19SRVRSWToKKwkJY2FzZSBTU19UVVI6CisJCQlpZiAoKHN0YXR1cyAmIFNTX0VSUk1BU0spID09IEVCVVNZKSB7CisJCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIEFIQ19EVl9TVEFURV9CVVNZKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCB0YXJnLT5kdl9zdGF0ZSk7CisJCQlpZiAoYWhjX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCkKKwkJCSA9PSBDQU1fUkVRVUVVRV9SRVEpIHsKKwkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeS0tOworCQkJfSBlbHNlIGlmICgoc3RhdHVzICYgU1NRX0ZBTExCQUNLKSAhPSAwKSB7CisJCQkJaWYgKGFoY19saW51eF9mYWxsYmFjayhhaGMsIGRldmluZm8pICE9IDApIHsKKwkJCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsCisJCQkJCQkJIEFIQ19EVl9TVEFURV9FWElUKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qCisJCQkJICogRG8gbm90IGNvdW50ICJmYWxsaW5nIGJhY2siCisJCQkJICogYWdhaW5zdCBvdXIgcmV0cmllcy4KKwkJCQkgKi8KKwkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeSA9IDA7CisJCQl9CisJCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPj0gMTApIHsKKyNpZmRlZiBBSENfREVCVUcKKwkJCQlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJCQkJYWhjX3ByaW50X2RldmluZm8oYWhjLCBkZXZpbmZvKTsKKwkJCQkJcHJpbnRmKCJEViBUVVIgcmV0aWVzIGV4aGF1c3RlZFxuIik7CisJCQkJfQorI2VuZGlmCisJCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIEFIQ19EVl9TVEFURV9FWElUKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzdGF0dXMgJiBTU1FfREVMQVkpCisJCQkJc3NsZWVwKDEpOworCisJCQlicmVhazsKKwkJY2FzZSBTU19TVEFSVDoKKwkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfU1UpOworCQkJYnJlYWs7CisJCWNhc2UgU1NfSU5RX1JFRlJFU0g6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgQUhDX0RWX1NUQVRFX0VYSVQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFIQ19EVl9TVEFURV9SRUJEOgorCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKKwkJY2FzZSBTU19OT1A6CisJCXsKKwkJCXVpbnQzMl90IGVjaG9fc2l6ZTsKKworCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIEFIQ19EVl9TVEFURV9XRUIpOworCQkJZWNob19zaXplID0gc2NzaV8zYnRvdWwoJnRhcmctPmR2X2J1ZmZlclsxXSk7CisJCQllY2hvX3NpemUgJj0gMHgxRkZGOworI2lmZGVmIEFIQ19ERUJVRworCQkJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX0RWKSB7CisJCQkJYWhjX3ByaW50X2RldmluZm8oYWhjLCBkZXZpbmZvKTsKKwkJCQlwcmludGYoIkVjaG8gYnVmZmVyIHNpemU9ICVkXG4iLCBlY2hvX3NpemUpOworCQkJfQorI2VuZGlmCisJCQlpZiAoZWNob19zaXplID09IDApIHsKKwkJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgQUhDX0RWX1NUQVRFX0VYSVQpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBHZW5lcmF0ZSB0aGUgYnVmZmVyIHBhdHRlcm4gKi8KKwkJCXRhcmctPmR2X2VjaG9fc2l6ZSA9IGVjaG9fc2l6ZTsKKwkJCWFoY19saW51eF9nZW5lcmF0ZV9kdl9wYXR0ZXJuKHRhcmcpOworCQkJLyoKKwkJCSAqIFNldHVwIGluaXRpYWwgbmVnb3RpYXRpb24gdmFsdWVzLgorCQkJICovCisJCQlhaGNfbGludXhfZmlsdGVyX2lucXVpcnkoYWhjLCBkZXZpbmZvKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU1NfSU5RX1JFRlJFU0g6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCQkJYnJlYWs7CisJCWNhc2UgU1NfUkVUUlk6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOworCQkJaWYgKGFoY19jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpCisJCQkgPT0gQ0FNX1JFUVVFVUVfUkVRKQorCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07CisJCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPD0gMTApCisJCQkJYnJlYWs7CisjaWZkZWYgQUhDX0RFQlVHCisJCQlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsIGRldmluZm8pOworCQkJCXByaW50ZigiRFYgUkVCRCByZXRpZXMgZXhoYXVzdGVkXG4iKTsKKwkJCX0KKyNlbmRpZgorCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSBTU19GQVRBTDoKKwkJZGVmYXVsdDoKKwkJCS8qCisJCQkgKiBTZXR1cCBpbml0aWFsIG5lZ290aWF0aW9uIHZhbHVlcworCQkJICogYW5kIHRyeSBsZXZlbCAxIERWLgorCQkJICovCisJCQlhaGNfbGludXhfZmlsdGVyX2lucXVpcnkoYWhjLCBkZXZpbmZvKTsKKwkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfSU5RX1ZFUklGWSk7CisJCQl0YXJnLT5kdl9lY2hvX3NpemUgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFIQ19EVl9TVEFURV9XRUI6CisJCXN3aXRjaCAoc3RhdHVzICYgU1NfTUFTSykgeworCQljYXNlIFNTX05PUDoKKwkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfUkVCKTsKKwkJCWJyZWFrOworCQljYXNlIFNTX0lOUV9SRUZSRVNIOgorCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsCisJCQkJCSBBSENfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKKwkJCWJyZWFrOworCQljYXNlIFNTX1JFVFJZOgorCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKKwkJCWlmIChhaGNfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQorCQkJID09IENBTV9SRVFVRVVFX1JFUSkgeworCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07CisJCQl9IGVsc2UgaWYgKChzdGF0dXMgJiBTU1FfRkFMTEJBQ0spICE9IDApIHsKKwkJCQlpZiAoYWhjX2xpbnV4X2ZhbGxiYWNrKGFoYywgZGV2aW5mbykgIT0gMCkgeworCQkJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJCQkgQUhDX0RWX1NUQVRFX0VYSVQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBEbyBub3QgY291bnQgImZhbGxpbmcgYmFjayIKKwkJCQkgKiBhZ2FpbnN0IG91ciByZXRyaWVzLgorCQkJCSAqLworCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5ID0gMDsKKwkJCX0KKwkJCWlmICh0YXJnLT5kdl9zdGF0ZV9yZXRyeSA8PSAxMCkKKwkJCQlicmVhazsKKwkJCS8qIEZBTExUSFJPVUdIICovCisjaWZkZWYgQUhDX0RFQlVHCisJCQlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsIGRldmluZm8pOworCQkJCXByaW50ZigiRFYgV0VCIHJldGllcyBleGhhdXN0ZWRcbiIpOworCQkJfQorI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgQUhDX0RWX1NUQVRFX0VYSVQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFIQ19EVl9TVEFURV9SRUI6CisJCXN3aXRjaCAoc3RhdHVzICYgU1NfTUFTSykgeworCQljYXNlIFNTX05PUDoKKwkJCWlmIChtZW1jbXAodGFyZy0+ZHZfYnVmZmVyLCB0YXJnLT5kdl9idWZmZXIxLAorCQkJCSAgIHRhcmctPmR2X2VjaG9fc2l6ZSkgIT0gMCkgeworCQkJCWlmIChhaGNfbGludXhfZmFsbGJhY2soYWhjLCBkZXZpbmZvKSAhPSAwKQorCQkJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJCQkgQUhDX0RWX1NUQVRFX0VYSVQpOworCQkJCWVsc2UKKwkJCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsCisJCQkJCQkJIEFIQ19EVl9TVEFURV9XRUIpOworCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQlpZiAodGFyZy0+ZHZfYnVmZmVyICE9IE5VTEwpIHsKKwkJCQlmcmVlKHRhcmctPmR2X2J1ZmZlciwgTV9ERVZCVUYpOworCQkJCXRhcmctPmR2X2J1ZmZlciA9IE5VTEw7CisJCQl9CisJCQlpZiAodGFyZy0+ZHZfYnVmZmVyMSAhPSBOVUxMKSB7CisJCQkJZnJlZSh0YXJnLT5kdl9idWZmZXIxLCBNX0RFVkJVRik7CisJCQkJdGFyZy0+ZHZfYnVmZmVyMSA9IE5VTEw7CisJCQl9CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgQUhDX0RWX1NUQVRFX0VYSVQpOworCQkJYnJlYWs7CisJCWNhc2UgU1NfSU5RX1JFRlJFU0g6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCQkJYnJlYWs7CisJCWNhc2UgU1NfUkVUUlk6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOworCQkJaWYgKGFoY19jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpCisJCQkgPT0gQ0FNX1JFUVVFVUVfUkVRKSB7CisJCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnktLTsKKwkJCX0gZWxzZSBpZiAoKHN0YXR1cyAmIFNTUV9GQUxMQkFDSykgIT0gMCkgeworCQkJCWlmIChhaGNfbGludXhfZmFsbGJhY2soYWhjLCBkZXZpbmZvKSAhPSAwKSB7CisJCQkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLAorCQkJCQkJCSBBSENfRFZfU1RBVEVfRVhJVCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgQUhDX0RWX1NUQVRFX1dFQik7CisJCQl9CisJCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPD0gMTApIHsKKwkJCQlpZiAoKHN0YXR1cyAmIChTU1FfREVMQVlfUkFORE9NfFNTUV9ERUxBWSkpIT0gMCkKKwkJCQkJbXNsZWVwKGFoYy0+b3VyX2lkKjEwMDAvMTApOworCQkJCWJyZWFrOworCQkJfQorI2lmZGVmIEFIQ19ERUJVRworCQkJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX0RWKSB7CisJCQkJYWhjX3ByaW50X2RldmluZm8oYWhjLCBkZXZpbmZvKTsKKwkJCQlwcmludGYoIkRWIFJFQiByZXRpZXMgZXhoYXVzdGVkXG4iKTsKKwkJCX0KKyNlbmRpZgorCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJZGVmYXVsdDoKKwkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfRVhJVCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUhDX0RWX1NUQVRFX1NVOgorCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKKwkJY2FzZSBTU19OT1A6CisJCWNhc2UgU1NfSU5RX1JFRlJFU0g6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgQUhDX0RWX1NUQVRFX0VYSVQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFIQ19EVl9TVEFURV9CVVNZOgorCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKKwkJY2FzZSBTU19OT1A6CisJCWNhc2UgU1NfSU5RX1JFRlJFU0g6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCQkJYnJlYWs7CisJCWNhc2UgU1NfVFVSOgorCQljYXNlIFNTX1JFVFJZOgorCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKKwkJCWlmIChhaGNfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQorCQkJID09IENBTV9SRVFVRVVFX1JFUSkgeworCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07CisJCQl9IGVsc2UgaWYgKHRhcmctPmR2X3N0YXRlX3JldHJ5IDwgNjApIHsKKwkJCQlpZiAoKHN0YXR1cyAmIFNTUV9ERUxBWSkgIT0gMCkKKwkJCQkJc3NsZWVwKDEpOworCQkJfSBlbHNlIHsKKyNpZmRlZiBBSENfREVCVUcKKwkJCQlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJCQkJYWhjX3ByaW50X2RldmluZm8oYWhjLCBkZXZpbmZvKTsKKwkJCQkJcHJpbnRmKCJEViBCVVNZIHJldGllcyBleGhhdXN0ZWRcbiIpOworCQkJCX0KKyNlbmRpZgorCQkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfRVhJVCk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfRVhJVCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ZigiJXM6IEludmFsaWQgRFYgY29tcGxldGlvbiBzdGF0ZSAlZFxuIiwgYWhjX25hbWUoYWhjKSwKKwkJICAgICAgIHRhcmctPmR2X3N0YXRlKTsKKwkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIEFIQ19EVl9TVEFURV9FWElUKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X2R2X2ZpbGxfY21kKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkgICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pCit7CisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBzY3NpX2NtbmQpKTsKKwljbWQtPmRldmljZSA9IGFoYy0+cGxhdGZvcm1fZGF0YS0+ZHZfc2NzaV9kZXY7CisJY21kLT5zY3NpX2RvbmUgPSBhaGNfbGludXhfZHZfY29tcGxldGU7Cit9CisKKy8qCisgKiBTeW50aGVzaXplIGFuIGlucXVpcnkgY29tbWFuZC4gIE9uIHRoZSByZXR1cm4gdHJpcCwgaXQnbGwgYmUKKyAqIHNuaWZmZWQgYW5kIHRoZSBkZXZpY2UgdHJhbnNmZXIgc2V0dGluZ3Mgc2V0IGZvciB1cy4KKyAqLworc3RhdGljIHZvaWQKK2FoY19saW51eF9kdl9pbnEoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCSBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sIHN0cnVjdCBhaGNfbGludXhfdGFyZ2V0ICp0YXJnLAorCQkgdV9pbnQgcmVxdWVzdF9sZW5ndGgpCit7CisKKyNpZmRlZiBBSENfREVCVUcKKwlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJYWhjX3ByaW50X2RldmluZm8oYWhjLCBkZXZpbmZvKTsKKwkJcHJpbnRmKCJTZW5kaW5nIElOUVxuIik7CisJfQorI2VuZGlmCisJaWYgKHRhcmctPmlucV9kYXRhID09IE5VTEwpCisJCXRhcmctPmlucV9kYXRhID0gbWFsbG9jKEFIQ19MSU5VWF9EVl9JTlFfTEVOLAorCQkJCQlNX0RFVkJVRiwgTV9XQUlUT0spOworCWlmICh0YXJnLT5kdl9zdGF0ZSA+IEFIQ19EVl9TVEFURV9JTlFfQVNZTkMpIHsKKwkJaWYgKHRhcmctPmR2X2J1ZmZlciAhPSBOVUxMKQorCQkJZnJlZSh0YXJnLT5kdl9idWZmZXIsIE1fREVWQlVGKTsKKwkJdGFyZy0+ZHZfYnVmZmVyID0gbWFsbG9jKEFIQ19MSU5VWF9EVl9JTlFfTEVOLAorCQkJCQkgTV9ERVZCVUYsIE1fV0FJVE9LKTsKKwl9CisKKwlhaGNfbGludXhfZHZfZmlsbF9jbWQoYWhjLCBjbWQsIGRldmluZm8pOworCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfUkVBRDsKKwljbWQtPmNtZF9sZW4gPSA2OworCWNtZC0+Y21uZFswXSA9IElOUVVJUlk7CisJY21kLT5jbW5kWzRdID0gcmVxdWVzdF9sZW5ndGg7CisJY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPSByZXF1ZXN0X2xlbmd0aDsKKwlpZiAodGFyZy0+ZHZfc3RhdGUgPiBBSENfRFZfU1RBVEVfSU5RX0FTWU5DKQorCQljbWQtPnJlcXVlc3RfYnVmZmVyID0gdGFyZy0+ZHZfYnVmZmVyOworCWVsc2UKKwkJY21kLT5yZXF1ZXN0X2J1ZmZlciA9IHRhcmctPmlucV9kYXRhOworCW1lbXNldChjbWQtPnJlcXVlc3RfYnVmZmVyLCAwLCBBSENfTElOVVhfRFZfSU5RX0xFTik7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfZHZfdHVyKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvKQoreworCisjaWZkZWYgQUhDX0RFQlVHCisJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX0RWKSB7CisJCWFoY19wcmludF9kZXZpbmZvKGFoYywgZGV2aW5mbyk7CisJCXByaW50ZigiU2VuZGluZyBUVVJcbiIpOworCX0KKyNlbmRpZgorCS8qIERvIGEgVFVSIHRvIGNsZWFyIG91dCBhbnkgbm9uLWZhdGFsIHRyYW5zaXRpb25hbCBzdGF0ZSAqLworCWFoY19saW51eF9kdl9maWxsX2NtZChhaGMsIGNtZCwgZGV2aW5mbyk7CisJY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9IFNDU0lfREFUQV9OT05FOworCWNtZC0+Y21kX2xlbiA9IDY7CisJY21kLT5jbW5kWzBdID0gVEVTVF9VTklUX1JFQURZOworfQorCisjZGVmaW5lIEFIQ19SRUJEX0xFTiA0CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfZHZfcmViZChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywgc3RydWN0IGFoY19saW51eF90YXJnZXQgKnRhcmcpCit7CisKKyNpZmRlZiBBSENfREVCVUcKKwlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJYWhjX3ByaW50X2RldmluZm8oYWhjLCBkZXZpbmZvKTsKKwkJcHJpbnRmKCJTZW5kaW5nIFJFQkRcbiIpOworCX0KKyNlbmRpZgorCWlmICh0YXJnLT5kdl9idWZmZXIgIT0gTlVMTCkKKwkJZnJlZSh0YXJnLT5kdl9idWZmZXIsIE1fREVWQlVGKTsKKwl0YXJnLT5kdl9idWZmZXIgPSBtYWxsb2MoQUhDX1JFQkRfTEVOLCBNX0RFVkJVRiwgTV9XQUlUT0spOworCWFoY19saW51eF9kdl9maWxsX2NtZChhaGMsIGNtZCwgZGV2aW5mbyk7CisJY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9IFNDU0lfREFUQV9SRUFEOworCWNtZC0+Y21kX2xlbiA9IDEwOworCWNtZC0+Y21uZFswXSA9IFJFQURfQlVGRkVSOworCWNtZC0+Y21uZFsxXSA9IDB4MGI7CisJc2NzaV91bHRvM2IoQUhDX1JFQkRfTEVOLCAmY21kLT5jbW5kWzZdKTsKKwljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IEFIQ19SRUJEX0xFTjsKKwljbWQtPnVuZGVyZmxvdyA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCWNtZC0+cmVxdWVzdF9idWZmZXIgPSB0YXJnLT5kdl9idWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfZHZfd2ViKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLCBzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZykKK3sKKworI2lmZGVmIEFIQ19ERUJVRworCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19EVikgeworCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsIGRldmluZm8pOworCQlwcmludGYoIlNlbmRpbmcgV0VCXG4iKTsKKwl9CisjZW5kaWYKKwlhaGNfbGludXhfZHZfZmlsbF9jbWQoYWhjLCBjbWQsIGRldmluZm8pOworCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfV1JJVEU7CisJY21kLT5jbWRfbGVuID0gMTA7CisJY21kLT5jbW5kWzBdID0gV1JJVEVfQlVGRkVSOworCWNtZC0+Y21uZFsxXSA9IDB4MGE7CisJc2NzaV91bHRvM2IodGFyZy0+ZHZfZWNob19zaXplLCAmY21kLT5jbW5kWzZdKTsKKwljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IHRhcmctPmR2X2VjaG9fc2l6ZTsKKwljbWQtPnVuZGVyZmxvdyA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCWNtZC0+cmVxdWVzdF9idWZmZXIgPSB0YXJnLT5kdl9idWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfZHZfcmViKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLCBzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZykKK3sKKworI2lmZGVmIEFIQ19ERUJVRworCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19EVikgeworCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsIGRldmluZm8pOworCQlwcmludGYoIlNlbmRpbmcgUkVCXG4iKTsKKwl9CisjZW5kaWYKKwlhaGNfbGludXhfZHZfZmlsbF9jbWQoYWhjLCBjbWQsIGRldmluZm8pOworCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfUkVBRDsKKwljbWQtPmNtZF9sZW4gPSAxMDsKKwljbWQtPmNtbmRbMF0gPSBSRUFEX0JVRkZFUjsKKwljbWQtPmNtbmRbMV0gPSAweDBhOworCXNjc2lfdWx0bzNiKHRhcmctPmR2X2VjaG9fc2l6ZSwgJmNtZC0+Y21uZFs2XSk7CisJY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPSB0YXJnLT5kdl9lY2hvX3NpemU7CisJY21kLT51bmRlcmZsb3cgPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwljbWQtPnJlcXVlc3RfYnVmZmVyID0gdGFyZy0+ZHZfYnVmZmVyMTsKK30KKworc3RhdGljIHZvaWQKK2FoY19saW51eF9kdl9zdShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLAorCQlzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZykKK3sKKwl1X2ludCBsZTsKKworCWxlID0gU0lEX0lTX1JFTU9WQUJMRSh0YXJnLT5pbnFfZGF0YSkgPyBTU1NfTE9FSiA6IDA7CisKKyNpZmRlZiBBSENfREVCVUcKKwlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJYWhjX3ByaW50X2RldmluZm8oYWhjLCBkZXZpbmZvKTsKKwkJcHJpbnRmKCJTZW5kaW5nIFNVXG4iKTsKKwl9CisjZW5kaWYKKwlhaGNfbGludXhfZHZfZmlsbF9jbWQoYWhjLCBjbWQsIGRldmluZm8pOworCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfTk9ORTsKKwljbWQtPmNtZF9sZW4gPSA2OworCWNtZC0+Y21uZFswXSA9IFNUQVJUX1NUT1BfVU5JVDsKKwljbWQtPmNtbmRbNF0gPSBsZSB8IFNTU19TVEFSVDsKK30KKworc3RhdGljIGludAorYWhjX2xpbnV4X2ZhbGxiYWNrKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvKQoreworCXN0cnVjdAlhaGNfbGludXhfdGFyZ2V0ICp0YXJnOworCXN0cnVjdAlhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QJYWhjX3RyYW5zaW5mbyAqZ29hbDsKKwlzdHJ1Y3QJYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXN0cnVjdAlhaGNfc3luY3JhdGUgKnN5bmNyYXRlOworCXVfbG9uZwlzOworCXVfaW50CXdpZHRoOworCXVfaW50CXBlcmlvZDsKKwl1X2ludAlvZmZzZXQ7CisJdV9pbnQJcHByX29wdGlvbnM7CisJdV9pbnQJY3VyX3NwZWVkOworCXVfaW50CXdpZGVfc3BlZWQ7CisJdV9pbnQJbmFycm93X3NwZWVkOworCXVfaW50CWZhbGxiYWNrX3NwZWVkOworCisjaWZkZWYgQUhDX0RFQlVHCisJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX0RWKSB7CisJCWFoY19wcmludF9kZXZpbmZvKGFoYywgZGV2aW5mbyk7CisJCXByaW50ZigiVHJ5aW5nIHRvIGZhbGxiYWNrXG4iKTsKKwl9CisjZW5kaWYKKwlhaGNfbG9jayhhaGMsICZzKTsKKwl0YXJnID0gYWhjLT5wbGF0Zm9ybV9kYXRhLT50YXJnZXRzW2RldmluZm8tPnRhcmdldF9vZmZzZXRdOworCXRpbmZvID0gYWhjX2ZldGNoX3RyYW5zaW5mbyhhaGMsIGRldmluZm8tPmNoYW5uZWwsCisJCQkJICAgIGRldmluZm8tPm91cl9zY3NpaWQsCisJCQkJICAgIGRldmluZm8tPnRhcmdldCwgJnRzdGF0ZSk7CisJZ29hbCA9ICZ0aW5mby0+Z29hbDsKKwl3aWR0aCA9IGdvYWwtPndpZHRoOworCXBlcmlvZCA9IGdvYWwtPnBlcmlvZDsKKwlvZmZzZXQgPSBnb2FsLT5vZmZzZXQ7CisJcHByX29wdGlvbnMgPSBnb2FsLT5wcHJfb3B0aW9uczsKKwlpZiAob2Zmc2V0ID09IDApCisJCXBlcmlvZCA9IEFIQ19BU1lOQ19YRkVSX1BFUklPRDsKKwlpZiAodGFyZy0+ZHZfbmV4dF9uYXJyb3dfcGVyaW9kID09IDApCisJCXRhcmctPmR2X25leHRfbmFycm93X3BlcmlvZCA9IE1BWChwZXJpb2QsIEFIQ19TWU5DUkFURV9VTFRSQTIpOworCWlmICh0YXJnLT5kdl9uZXh0X3dpZGVfcGVyaW9kID09IDApCisJCXRhcmctPmR2X25leHRfd2lkZV9wZXJpb2QgPSBwZXJpb2Q7CisJaWYgKHRhcmctPmR2X21heF93aWR0aCA9PSAwKQorCQl0YXJnLT5kdl9tYXhfd2lkdGggPSB3aWR0aDsKKwlpZiAodGFyZy0+ZHZfbWF4X3Bwcl9vcHRpb25zID09IDApCisJCXRhcmctPmR2X21heF9wcHJfb3B0aW9ucyA9IHBwcl9vcHRpb25zOworCWlmICh0YXJnLT5kdl9sYXN0X3Bwcl9vcHRpb25zID09IDApCisJCXRhcmctPmR2X2xhc3RfcHByX29wdGlvbnMgPSBwcHJfb3B0aW9uczsKKworCWN1cl9zcGVlZCA9IGFpY19jYWxjX3NwZWVkKHdpZHRoLCBwZXJpb2QsIG9mZnNldCwgQUhDX1NZTkNSQVRFX01JTik7CisJd2lkZV9zcGVlZCA9IGFpY19jYWxjX3NwZWVkKE1TR19FWFRfV0RUUl9CVVNfMTZfQklULAorCQkJCQkgIHRhcmctPmR2X25leHRfd2lkZV9wZXJpb2QsCisJCQkJCSAgTUFYX09GRlNFVCwKKwkJCQkJICBBSENfU1lOQ1JBVEVfTUlOKTsKKwluYXJyb3dfc3BlZWQgPSBhaWNfY2FsY19zcGVlZChNU0dfRVhUX1dEVFJfQlVTXzhfQklULAorCQkJCQkgICAgdGFyZy0+ZHZfbmV4dF9uYXJyb3dfcGVyaW9kLAorCQkJCQkgICAgTUFYX09GRlNFVCwKKwkJCQkJICAgIEFIQ19TWU5DUkFURV9NSU4pOworCWZhbGxiYWNrX3NwZWVkID0gYWljX2NhbGNfc3BlZWQod2lkdGgsIHBlcmlvZCsxLCBvZmZzZXQsCisJCQkJCUFIQ19TWU5DUkFURV9NSU4pOworI2lmZGVmIEFIQ19ERUJVRworCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19EVikgeworCQlwcmludGYoImN1cl9zcGVlZD0gJWQsIHdpZGVfc3BlZWQ9ICVkLCBuYXJyb3dfc3BlZWQ9ICVkLCAiCisJCSAgICAgICAiZmFsbGJhY2tfc3BlZWQ9ICVkXG4iLCBjdXJfc3BlZWQsIHdpZGVfc3BlZWQsCisJCSAgICAgICBuYXJyb3dfc3BlZWQsIGZhbGxiYWNrX3NwZWVkKTsKKwl9CisjZW5kaWYKKworCWlmIChjdXJfc3BlZWQgPiAxNjAwMDApIHsKKwkJLyoKKwkJICogUGFjZWQvRFQvSVVfUkVRIG9ubHkgdHJhbnNmZXIgc3BlZWRzLiAgQWxsIHdlCisJCSAqIGNhbiBkbyBpcyBmYWxsYmFjayBpbiB0ZXJtcyBvZiBzeW5jcmF0ZS4KKwkJICovCisJCXBlcmlvZCsrOworCX0gZWxzZSBpZiAoY3VyX3NwZWVkID4gODAwMDApIHsKKwkJaWYgKChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0lVX1JFUSkgIT0gMCkgeworCQkJLyoKKwkJCSAqIFRyeSB3aXRob3V0IElVX1JFUSBhcyBpdCBtYXkgYmUgY29uZnVzaW5nCisJCQkgKiBhbiBleHBhbmRlci4KKwkJCSAqLworCQkJcHByX29wdGlvbnMgJj0gfk1TR19FWFRfUFBSX0lVX1JFUTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBQYWNlZC9EVCBvbmx5IHRyYW5zZmVyIHNwZWVkcy4gIEFsbCB3ZQorCQkJICogY2FuIGRvIGlzIGZhbGxiYWNrIGluIHRlcm1zIG9mIHN5bmNyYXRlLgorCQkJICovCisJCQlwZXJpb2QrKzsKKwkJCXBwcl9vcHRpb25zID0gdGFyZy0+ZHZfbWF4X3Bwcl9vcHRpb25zOworCQl9CisJfSBlbHNlIGlmIChjdXJfc3BlZWQgPiAzMzAwKSB7CisKKwkJLyoKKwkJICogSW4gdGhpcyByYW5nZSB3ZSB0aGUgZm9sbG93aW5nCisJCSAqIG9wdGlvbnMgb3JkZXJlZCBmcm9tIGhpZ2hlc3QgdG8KKwkJICogbG93ZXN0IGRlc2lyZWFiaWxpdHk6CisJCSAqCisJCSAqIG8gV2lkZS9EVAorCQkgKiBvIFdpZGUvbm9uLURUCisJCSAqIG8gTmFycm93IGF0IGEgcG90ZW50YWxseSBoaWdoZXIgc3luYyByYXRlLgorCQkgKgorCQkgKiBBbGwgbW9kZXMgYXJlIHRlc3RlZCB3aXRoIGFuZCB3aXRob3V0IElVX1JFUQorCQkgKiBzZXQgc2luY2UgdXNpbmcgSVVzIG1heSBjb25mdXNlIGFuIGV4cGFuZGVyLgorCQkgKi8KKwkJaWYgKChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0lVX1JFUSkgIT0gMCkgeworCisJCQlwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfSVVfUkVROworCQl9IGVsc2UgaWYgKChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUSkgIT0gMCkgeworCQkJLyoKKwkJCSAqIFRyeSBnb2luZyBub24tRFQuCisJCQkgKi8KKwkJCXBwcl9vcHRpb25zID0gdGFyZy0+ZHZfbWF4X3Bwcl9vcHRpb25zOworCQkJcHByX29wdGlvbnMgJj0gfk1TR19FWFRfUFBSX0RUX1JFUTsKKwkJfSBlbHNlIGlmICh0YXJnLT5kdl9sYXN0X3Bwcl9vcHRpb25zICE9IDApIHsKKwkJCS8qCisJCQkgKiBUcnkgd2l0aG91dCBRQVMgb3IgYW55IG90aGVyIFBQUiBvcHRpb25zLgorCQkJICogV2UgbWF5IG5lZWQgYSBub24tUFBSIG1lc3NhZ2UgdG8gd29yayB3aXRoCisJCQkgKiBhbiBleHBhbmRlci4gIFdlIGxvb2sgYXQgdGhlICJsYXN0IFBQUiBvcHRpb25zIgorCQkJICogc28gd2Ugd2lsbCBwZXJmb3JtIHRoaXMgZmFsbGJhY2sgZXZlbiBpZiB0aGUKKwkJCSAqIHRhcmdldCByZXNwb25kZWQgdG8gb3VyIFBQUiBuZWdvdGlhdGlvbiB3aXRoCisJCQkgKiBubyBvcHRpb24gYml0cyBzZXQuCisJCQkgKi8KKwkJCXBwcl9vcHRpb25zID0gMDsKKwkJfSBlbHNlIGlmICh3aWR0aCA9PSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVCkgeworCQkJLyoKKwkJCSAqIElmIHRoZSBuZXh0IG5hcnJvdyBzcGVlZCBpcyBncmVhdGVyIHRoYW4KKwkJCSAqIHRoZSBuZXh0IHdpZGUgc3BlZWQsIGZhbGxiYWNrIHRvIG5hcnJvdy4KKwkJCSAqIE90aGVyd2lzZSBmYWxsYmFjayB0byB0aGUgbmV4dCBEVC9XaWRlIHNldHRpbmcuCisJCQkgKiBUaGUgbmFycm93IGFzeW5jIHNwZWVkIHdpbGwgYWx3YXlzIGJlIHNtYWxsZXIKKwkJCSAqIHRoYW4gdGhlIHdpZGUgYXN5bmMgc3BlZWQsIHNvIGhhbmRsZSB0aGlzIGNhc2UKKwkJCSAqIHNwZWNpZmljYWxseS4KKwkJCSAqLworCQkJcHByX29wdGlvbnMgPSB0YXJnLT5kdl9tYXhfcHByX29wdGlvbnM7CisJCQlpZiAobmFycm93X3NwZWVkID4gZmFsbGJhY2tfc3BlZWQKKwkJCSB8fCBwZXJpb2QgPj0gQUhDX0FTWU5DX1hGRVJfUEVSSU9EKSB7CisJCQkJdGFyZy0+ZHZfbmV4dF93aWRlX3BlcmlvZCA9IHBlcmlvZCsxOworCQkJCXdpZHRoID0gTVNHX0VYVF9XRFRSX0JVU184X0JJVDsKKwkJCQlwZXJpb2QgPSB0YXJnLT5kdl9uZXh0X25hcnJvd19wZXJpb2Q7CisJCQl9IGVsc2UgeworCQkJCXBlcmlvZCsrOworCQkJfQorCQl9IGVsc2UgaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1dJREUpICE9IDAKKwkJCSYmIHRhcmctPmR2X21heF93aWR0aCAhPSAwCisJCQkmJiB3aWRlX3NwZWVkID49IGZhbGxiYWNrX3NwZWVkCisJCQkmJiAodGFyZy0+ZHZfbmV4dF93aWRlX3BlcmlvZCA8PSBBSENfQVNZTkNfWEZFUl9QRVJJT0QKKwkJCSB8fCBwZXJpb2QgPj0gQUhDX0FTWU5DX1hGRVJfUEVSSU9EKSkgeworCisJCQkvKgorCQkJICogV2UgYXJlIG5hcnJvdy4gIFRyeSBmYWxsaW5nIGJhY2sKKwkJCSAqIHRvIHRoZSBuZXh0IHdpZGUgc3BlZWQgd2l0aCAKKwkJCSAqIGFsbCBzdXBwb3J0ZWQgcHByIG9wdGlvbnMgc2V0LgorCQkJICovCisJCQl0YXJnLT5kdl9uZXh0X25hcnJvd19wZXJpb2QgPSBwZXJpb2QrMTsKKwkJCXdpZHRoID0gTVNHX0VYVF9XRFRSX0JVU18xNl9CSVQ7CisJCQlwZXJpb2QgPSB0YXJnLT5kdl9uZXh0X3dpZGVfcGVyaW9kOworCQkJcHByX29wdGlvbnMgPSB0YXJnLT5kdl9tYXhfcHByX29wdGlvbnM7CisJCX0gZWxzZSB7CisJCQkvKiBPbmx5IG5hcnJvdyBmYWxsYmFjayBpcyBhbGxvd2VkLiAqLworCQkJcGVyaW9kKys7CisJCQlwcHJfb3B0aW9ucyA9IHRhcmctPmR2X21heF9wcHJfb3B0aW9uczsKKwkJfQorCX0gZWxzZSB7CisJCWFoY191bmxvY2soYWhjLCAmcyk7CisJCXJldHVybiAoLTEpOworCX0KKwlvZmZzZXQgPSBNQVhfT0ZGU0VUOworCXN5bmNyYXRlID0gYWhjX2ZpbmRfc3luY3JhdGUoYWhjLCAmcGVyaW9kLCAmcHByX29wdGlvbnMsCisJCQkJICAgICBBSENfU1lOQ1JBVEVfRFQpOworCWFoY19zZXRfd2lkdGgoYWhjLCBkZXZpbmZvLCB3aWR0aCwgQUhDX1RSQU5TX0dPQUwsIEZBTFNFKTsKKwlpZiAocGVyaW9kID09IDApIHsKKwkJcGVyaW9kID0gMDsKKwkJb2Zmc2V0ID0gMDsKKwkJcHByX29wdGlvbnMgPSAwOworCQlpZiAod2lkdGggPT0gTVNHX0VYVF9XRFRSX0JVU184X0JJVCkKKwkJCXRhcmctPmR2X25leHRfbmFycm93X3BlcmlvZCA9IEFIQ19BU1lOQ19YRkVSX1BFUklPRDsKKwkJZWxzZQorCQkJdGFyZy0+ZHZfbmV4dF93aWRlX3BlcmlvZCA9IEFIQ19BU1lOQ19YRkVSX1BFUklPRDsKKwl9CisJYWhjX3NldF9zeW5jcmF0ZShhaGMsIGRldmluZm8sIHN5bmNyYXRlLCBwZXJpb2QsIG9mZnNldCwKKwkJCSBwcHJfb3B0aW9ucywgQUhDX1RSQU5TX0dPQUwsIEZBTFNFKTsKKwl0YXJnLT5kdl9sYXN0X3Bwcl9vcHRpb25zID0gcHByX29wdGlvbnM7CisJYWhjX3VubG9jayhhaGMsICZzKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X2R2X3RpbWVvdXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdAlhaGNfc29mdGMgKmFoYzsKKwlzdHJ1Y3QJc2NiICpzY2I7CisJdV9sb25nCWZsYWdzOworCisJYWhjID0gKigoc3RydWN0IGFoY19zb2Z0YyAqKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGEpOworCWFoY19sb2NrKGFoYywgJmZsYWdzKTsKKworI2lmZGVmIEFIQ19ERUJVRworCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19EVikgeworCQlwcmludGYoIiVzOiBUaW1lb3V0IHdoaWxlIGRvaW5nIERWIGNvbW1hbmQgJXguXG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgY21kLT5jbW5kWzBdKTsKKwkJYWhjX2R1bXBfY2FyZF9zdGF0ZShhaGMpOworCX0KKyNlbmRpZgorCQorCS8qCisJICogR3VhcmQgYWdhaW5zdCAiZG9uZSByYWNlIi4gIE5vIGFjdGlvbiBpcworCSAqIHJlcXVpcmVkIGlmIHdlIGp1c3QgY29tcGxldGVkLgorCSAqLworCWlmICgoc2NiID0gKHN0cnVjdCBzY2IgKiljbWQtPmhvc3Rfc2NyaWJibGUpID09IE5VTEwpIHsKKwkJYWhjX3VubG9jayhhaGMsICZmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIENvbW1hbmQgaGFzIG5vdCBjb21wbGV0ZWQuICBNYXJrIHRoaXMKKwkgKiBTQ0IgYXMgaGF2aW5nIGZhaWxpbmcgc3RhdHVzIHByaW9yIHRvCisJICogcmVzZXR0aW5nIHRoZSBidXMsIHNvIHdlIGdldCB0aGUgY29ycmVjdAorCSAqIGVycm9yIGNvZGUuCisJICovCisJaWYgKChzY2ItPmZsYWdzICYgU0NCX1NFTlNFKSAhPSAwKQorCQlhaGNfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9BVVRPU0VOU0VfRkFJTCk7CisJZWxzZQorCQlhaGNfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9DTURfVElNRU9VVCk7CisJYWhjX3Jlc2V0X2NoYW5uZWwoYWhjLCBjbWQtPmRldmljZS0+Y2hhbm5lbCArICdBJywgLyppbml0aWF0ZSovVFJVRSk7CisKKwkvKgorCSAqIEFkZCBhIG1pbmltYWwgYnVzIHNldHRsZSBkZWxheSBmb3IgZGV2aWNlcyB0aGF0IGFyZSBzbG93IHRvCisJICogcmVzcG9uZCBhZnRlciBidXMgcmVzZXRzLgorCSAqLworCWFoY19saW51eF9mcmVlemVfc2ltcShhaGMpOworCWluaXRfdGltZXIoJmFoYy0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIpOworCWFoYy0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZGF0YSA9ICh1X2xvbmcpYWhjOworCWFoYy0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWiAvIDI7CisJYWhjLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lci5mdW5jdGlvbiA9CisJICAgIChhaGNfbGludXhfY2FsbGJhY2tfdCAqKWFoY19saW51eF9yZWxlYXNlX3NpbXE7CisJYWRkX3RpbWVyKCZhaGMtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyKTsKKwlpZiAoYWhjX2xpbnV4X25leHRfZGV2aWNlX3RvX3J1bihhaGMpICE9IE5VTEwpCisJCWFoY19zY2hlZHVsZV9ydW5xKGFoYyk7CisJYWhjX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShhaGMpOworCWFoY191bmxvY2soYWhjLCAmZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X2R2X2NvbXBsZXRlKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgYWhjX3NvZnRjICphaGM7CisKKwlhaGMgPSAqKChzdHJ1Y3QgYWhjX3NvZnRjICoqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSk7CisKKwkvKiBEZWxldGUgdGhlIERWIHRpbWVyIGJlZm9yZSBpdCBnb2VzIG9mZiEgKi8KKwlzY3NpX2RlbGV0ZV90aW1lcihjbWQpOworCisjaWZkZWYgQUhDX0RFQlVHCisJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX0RWKQorCQlwcmludGYoIiVzOiVkOiVkOiBDb21tYW5kIGNvbXBsZXRlZCwgc3RhdHVzPSAweCV4XG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsCisJCSAgICAgICBjbWQtPmRldmljZS0+aWQsIGNtZC0+cmVzdWx0KTsKKyNlbmRpZgorCisJLyogV2FrZSB1cCB0aGUgc3RhdGUgbWFjaGluZSAqLworCXVwKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmR2X2NtZF9zZW0pOworfQorCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X2dlbmVyYXRlX2R2X3BhdHRlcm4oc3RydWN0IGFoY19saW51eF90YXJnZXQgKnRhcmcpCit7CisJdWludDE2X3QgYjsKKwl1X2ludAkgaTsKKwl1X2ludAkgajsKKworCWlmICh0YXJnLT5kdl9idWZmZXIgIT0gTlVMTCkKKwkJZnJlZSh0YXJnLT5kdl9idWZmZXIsIE1fREVWQlVGKTsKKwl0YXJnLT5kdl9idWZmZXIgPSBtYWxsb2ModGFyZy0+ZHZfZWNob19zaXplLCBNX0RFVkJVRiwgTV9XQUlUT0spOworCWlmICh0YXJnLT5kdl9idWZmZXIxICE9IE5VTEwpCisJCWZyZWUodGFyZy0+ZHZfYnVmZmVyMSwgTV9ERVZCVUYpOworCXRhcmctPmR2X2J1ZmZlcjEgPSBtYWxsb2ModGFyZy0+ZHZfZWNob19zaXplLCBNX0RFVkJVRiwgTV9XQUlUT0spOworCisJaSA9IDA7CisJYiA9IDB4MDAwMTsKKwlmb3IgKGogPSAwIDsgaSA8IHRhcmctPmR2X2VjaG9fc2l6ZTsgaisrKSB7CisJCWlmIChqIDwgMzIpIHsKKwkJCS8qCisJCQkgKiAzMmJ5dGVzIG9mIHNlcXVlbnRpYWwgbnVtYmVycy4KKwkJCSAqLworCQkJdGFyZy0+ZHZfYnVmZmVyW2krK10gPSBqICYgMHhmZjsKKwkJfSBlbHNlIGlmIChqIDwgNDgpIHsKKwkJCS8qCisJCQkgKiAzMmJ5dGVzIG9mIHJlcGVhdGluZyAweDAwMDAsIDB4ZmZmZi4KKwkJCSAqLworCQkJdGFyZy0+ZHZfYnVmZmVyW2krK10gPSAoaiAmIDB4MDIpID8gMHhmZiA6IDB4MDA7CisJCX0gZWxzZSBpZiAoaiA8IDY0KSB7CisJCQkvKgorCQkJICogMzJieXRlcyBvZiByZXBlYXRpbmcgMHg1NTU1LCAweGFhYWEuCisJCQkgKi8KKwkJCXRhcmctPmR2X2J1ZmZlcltpKytdID0gKGogJiAweDAyKSA/IDB4YWEgOiAweDU1OworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFJlbWFpbmluZyBidWZmZXIgaXMgZmlsbGVkIHdpdGggYSByZXBlYXRpbmcKKwkJCSAqIHBhdHRlciBvZjoKKwkJCSAqCisJCQkgKgkgMHhmZmZmCisJCQkgKgl+MHgwMDAxIDw8IHNoaWZ0ZWQgb25jZSBpbiBlYWNoIGxvb3AuCisJCQkgKi8KKwkJCWlmIChqICYgMHgwMikgeworCQkJCWlmIChqICYgMHgwMSkgeworCQkJCQl0YXJnLT5kdl9idWZmZXJbaSsrXSA9IH4oYiA+PiA4KSAmIDB4ZmY7CisJCQkJCWIgPDw9IDE7CisJCQkJCWlmIChiID09IDB4MDAwMCkKKwkJCQkJCWIgPSAweDAwMDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGFyZy0+ZHZfYnVmZmVyW2krK10gPSAofmIgJiAweGZmKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXRhcmctPmR2X2J1ZmZlcltpKytdID0gMHhmZjsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHVfaW50CithaGNfbGludXhfdXNlcl90YWdkZXB0aChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbykKK3sKKwlzdGF0aWMgaW50IHdhcm5lZF91c2VyOworCXVfaW50IHRhZ3M7CisKKwl0YWdzID0gMDsKKwlpZiAoKGFoYy0+dXNlcl9kaXNjZW5hYmxlICYgZGV2aW5mby0+dGFyZ2V0X21hc2spICE9IDApIHsKKwkJaWYgKGFoYy0+dW5pdCA+PSBOVU1fRUxFTUVOVFMoYWljN3h4eF90YWdfaW5mbykpIHsKKwkJCWlmICh3YXJuZWRfdXNlciA9PSAwKSB7CisKKwkJCQlwcmludGYoS0VSTl9XQVJOSU5HCisiYWljN3h4eDogV0FSTklORzogSW5zdWZmaWNpZW50IHRhZ19pbmZvIGluc3RhbmNlc1xuIgorImFpYzd4eHg6IGZvciBpbnN0YWxsZWQgY29udHJvbGxlcnMuIFVzaW5nIGRlZmF1bHRzXG4iCisiYWljN3h4eDogUGxlYXNlIHVwZGF0ZSB0aGUgYWljN3h4eF90YWdfaW5mbyBhcnJheSBpblxuIgorImFpYzd4eHg6IHRoZSBhaWM3eHh4X29zbS4uYyBzb3VyY2UgZmlsZS5cbiIpOworCQkJCXdhcm5lZF91c2VyKys7CisJCQl9CisJCQl0YWdzID0gQUhDX01BWF9RVUVVRTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXJfdGFnX2luZm9fdCAqdGFnX2luZm87CisKKwkJCXRhZ19pbmZvID0gJmFpYzd4eHhfdGFnX2luZm9bYWhjLT51bml0XTsKKwkJCXRhZ3MgPSB0YWdfaW5mby0+dGFnX2NvbW1hbmRzW2RldmluZm8tPnRhcmdldF9vZmZzZXRdOworCQkJaWYgKHRhZ3MgPiBBSENfTUFYX1FVRVVFKQorCQkJCXRhZ3MgPSBBSENfTUFYX1FVRVVFOworCQl9CisJfQorCXJldHVybiAodGFncyk7Cit9CisKK3N0YXRpYyB1X2ludAorYWhjX2xpbnV4X3VzZXJfZHZfc2V0dGluZyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJc3RhdGljIGludCB3YXJuZWRfdXNlcjsKKwlpbnQgZHY7CisKKwlpZiAoYWhjLT51bml0ID49IE5VTV9FTEVNRU5UUyhhaWM3eHh4X2R2X3NldHRpbmdzKSkgeworCQlpZiAod2FybmVkX3VzZXIgPT0gMCkgeworCisJCQlwcmludGYoS0VSTl9XQVJOSU5HCisiYWljN3h4eDogV0FSTklORzogSW5zdWZmaWNpZW50IGR2IHNldHRpbmdzIGluc3RhbmNlc1xuIgorImFpYzd4eHg6IGZvciBpbnN0YWxsZWQgY29udHJvbGxlcnMuIFVzaW5nIGRlZmF1bHRzXG4iCisiYWljN3h4eDogUGxlYXNlIHVwZGF0ZSB0aGUgYWljN3h4eF9kdl9zZXR0aW5ncyBhcnJheVxuIgorImFpYzd4eHg6IGluIHRoZSBhaWM3eHh4X29zbS5jIHNvdXJjZSBmaWxlLlxuIik7CisJCQl3YXJuZWRfdXNlcisrOworCQl9CisJCWR2ID0gLTE7CisJfSBlbHNlIHsKKworCQlkdiA9IGFpYzd4eHhfZHZfc2V0dGluZ3NbYWhjLT51bml0XTsKKwl9CisKKwlpZiAoZHYgPCAwKSB7CisJCXVfbG9uZyBzOworCisJCS8qCisJCSAqIEFwcGx5IHRoZSBkZWZhdWx0LgorCQkgKi8KKwkJLyoKKwkJICogWFhYIC0gRW5hYmxlIERWIG9uIG5vbi1VMTYwIGNvbnRyb2xsZXJzIG9uY2UgaXQKKwkJICogICAgICAgaGFzIGJlZW4gdGVzdGVkIHRoZXJlLgorCQkgKi8KKwkJYWhjX2xvY2soYWhjLCAmcyk7CisJCWR2ID0gKGFoYy0+ZmVhdHVyZXMgJiBBSENfRFQpOworCQlpZiAoYWhjLT5zZWVwX2NvbmZpZyAhPSAwCisJCSAmJiBhaGMtPnNlZXBfY29uZmlnLT5zaWduYXR1cmUgPj0gQ0ZTSUdOQVRVUkUyKQorCQkJZHYgPSAoYWhjLT5zZWVwX2NvbmZpZy0+YWRhcHRlcl9jb250cm9sICYgQ0ZFTkFCTEVEVik7CisJCWFoY191bmxvY2soYWhjLCAmcyk7CisJfQorCXJldHVybiAoZHYpOworfQorCisvKgorICogRGV0ZXJtaW5lcyB0aGUgcXVldWUgZGVwdGggZm9yIGEgZ2l2ZW4gZGV2aWNlLgorICovCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X2RldmljZV9xdWV1ZV9kZXB0aChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkgICAgIHN0cnVjdCBhaGNfbGludXhfZGV2aWNlICpkZXYpCit7CisJc3RydWN0CWFoY19kZXZpbmZvIGRldmluZm87CisJdV9pbnQJdGFnczsKKworCWFoY19jb21waWxlX2RldmluZm8oJmRldmluZm8sCisJCQkgICAgZGV2LT50YXJnZXQtPmNoYW5uZWwgPT0gMAorCQkJICA/IGFoYy0+b3VyX2lkIDogYWhjLT5vdXJfaWRfYiwKKwkJCSAgICBkZXYtPnRhcmdldC0+dGFyZ2V0LCBkZXYtPmx1biwKKwkJCSAgICBkZXYtPnRhcmdldC0+Y2hhbm5lbCA9PSAwID8gJ0EnIDogJ0InLAorCQkJICAgIFJPTEVfSU5JVElBVE9SKTsKKwl0YWdzID0gYWhjX2xpbnV4X3VzZXJfdGFnZGVwdGgoYWhjLCAmZGV2aW5mbyk7CisJaWYgKHRhZ3MgIT0gMAorCSAmJiBkZXYtPnNjc2lfZGV2aWNlICE9IE5VTEwKKwkgJiYgZGV2LT5zY3NpX2RldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCAhPSAwKSB7CisKKwkJYWhjX3NldF90YWdzKGFoYywgJmRldmluZm8sIEFIQ19RVUVVRV9UQUdHRUQpOworCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsICZkZXZpbmZvKTsKKwkJcHJpbnRmKCJUYWdnZWQgUXVldWluZyBlbmFibGVkLiAgRGVwdGggJWRcbiIsIHRhZ3MpOworCX0gZWxzZSB7CisJCWFoY19zZXRfdGFncyhhaGMsICZkZXZpbmZvLCBBSENfUVVFVUVfTk9ORSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X3J1bl9kZXZpY2VfcXVldWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2KQoreworCXN0cnVjdAkgYWhjX2NtZCAqYWNtZDsKKwlzdHJ1Y3QJIHNjc2lfY21uZCAqY21kOworCXN0cnVjdAkgc2NiICpzY2I7CisJc3RydWN0CSBoYXJkd2FyZV9zY2IgKmhzY2I7CisJc3RydWN0CSBhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QJIGFoY190bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwl1aW50MTZfdCBtYXNrOworCisJaWYgKChkZXYtPmZsYWdzICYgQUhDX0RFVl9PTl9SVU5fTElTVCkgIT0gMCkKKwkJcGFuaWMoInJ1bm5pbmcgZGV2aWNlIG9uIHJ1biBsaXN0Iik7CisKKwl3aGlsZSAoKGFjbWQgPSBUQUlMUV9GSVJTVCgmZGV2LT5idXN5cSkpICE9IE5VTEwKKwkgICAgJiYgZGV2LT5vcGVuaW5ncyA+IDAgJiYgZGV2LT5xZnJvemVuID09IDApIHsKKworCQkvKgorCQkgKiBTY2hlZHVsZSB1cyB0byBydW4gbGF0ZXIuICBUaGUgb25seSByZWFzb24gd2UgYXJlIG5vdAorCQkgKiBydW5uaW5nIGlzIGJlY2F1c2UgdGhlIHdob2xlIGNvbnRyb2xsZXIgUSBpcyBmcm96ZW4uCisJCSAqLworCQlpZiAoYWhjLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuICE9IDAKKwkgCSAmJiBBSENfRFZfU0lNUV9GUk9aRU4oYWhjKSA9PSAwKSB7CisJCQlUQUlMUV9JTlNFUlRfVEFJTCgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5kZXZpY2VfcnVucSwKKwkJCQkJICBkZXYsIGxpbmtzKTsKKwkJCWRldi0+ZmxhZ3MgfD0gQUhDX0RFVl9PTl9SVU5fTElTVDsKKwkJCXJldHVybjsKKwkJfQorCQkvKgorCQkgKiBHZXQgYW4gc2NiIHRvIHVzZS4KKwkJICovCisJCWlmICgoc2NiID0gYWhjX2dldF9zY2IoYWhjKSkgPT0gTlVMTCkgeworCQkJVEFJTFFfSU5TRVJUX1RBSUwoJmFoYy0+cGxhdGZvcm1fZGF0YS0+ZGV2aWNlX3J1bnEsCisJCQkJCSBkZXYsIGxpbmtzKTsKKwkJCWRldi0+ZmxhZ3MgfD0gQUhDX0RFVl9PTl9SVU5fTElTVDsKKwkJCWFoYy0+ZmxhZ3MgfD0gQUhDX1JFU09VUkNFX1NIT1JUQUdFOworCQkJcmV0dXJuOworCQl9CisJCVRBSUxRX1JFTU9WRSgmZGV2LT5idXN5cSwgYWNtZCwgYWNtZF9saW5rcy50cWUpOworCQljbWQgPSAmYWNtZF9zY3NpX2NtZChhY21kKTsKKwkJc2NiLT5pb19jdHggPSBjbWQ7CisJCXNjYi0+cGxhdGZvcm1fZGF0YS0+ZGV2ID0gZGV2OworCQloc2NiID0gc2NiLT5oc2NiOworCQljbWQtPmhvc3Rfc2NyaWJibGUgPSAoY2hhciAqKXNjYjsKKworCQkvKgorCQkgKiBGaWxsIG91dCBiYXNpY3Mgb2YgdGhlIEhTQ0IuCisJCSAqLworCQloc2NiLT5jb250cm9sID0gMDsKKwkJaHNjYi0+c2NzaWlkID0gQlVJTERfU0NTSUlEKGFoYywgY21kKTsKKwkJaHNjYi0+bHVuID0gY21kLT5kZXZpY2UtPmx1bjsKKwkJbWFzayA9IFNDQl9HRVRfVEFSR0VUX01BU0soYWhjLCBzY2IpOworCQl0aW5mbyA9IGFoY19mZXRjaF90cmFuc2luZm8oYWhjLCBTQ0JfR0VUX0NIQU5ORUwoYWhjLCBzY2IpLAorCQkJCQkgICAgU0NCX0dFVF9PVVJfSUQoc2NiKSwKKwkJCQkJICAgIFNDQl9HRVRfVEFSR0VUKGFoYywgc2NiKSwgJnRzdGF0ZSk7CisJCWhzY2ItPnNjc2lyYXRlID0gdGluZm8tPnNjc2lyYXRlOworCQloc2NiLT5zY3Npb2Zmc2V0ID0gdGluZm8tPmN1cnIub2Zmc2V0OworCQlpZiAoKHRzdGF0ZS0+dWx0cmFlbmIgJiBtYXNrKSAhPSAwKQorCQkJaHNjYi0+Y29udHJvbCB8PSBVTFRSQUVOQjsKKworCQlpZiAoKGFoYy0+dXNlcl9kaXNjZW5hYmxlICYgbWFzaykgIT0gMCkKKwkJCWhzY2ItPmNvbnRyb2wgfD0gRElTQ0VOQjsKKworCSAJaWYgKEFIQ19EVl9DTUQoY21kKSAhPSAwKQorCQkJc2NiLT5mbGFncyB8PSBTQ0JfU0lMRU5UOworCisJCWlmICgodHN0YXRlLT5hdXRvX25lZ290aWF0ZSAmIG1hc2spICE9IDApIHsKKwkJCXNjYi0+ZmxhZ3MgfD0gU0NCX0FVVE9fTkVHT1RJQVRFOworCQkJc2NiLT5oc2NiLT5jb250cm9sIHw9IE1LX01FU1NBR0U7CisJCX0KKworCQlpZiAoKGRldi0+ZmxhZ3MgJiAoQUhDX0RFVl9RX1RBR0dFRHxBSENfREVWX1FfQkFTSUMpKSAhPSAwKSB7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCQkJaW50CW1zZ19ieXRlczsKKwkJCXVpbnQ4X3QgdGFnX21zZ3NbMl07CisKKwkJCW1zZ19ieXRlcyA9IHNjc2lfcG9wdWxhdGVfdGFnX21zZyhjbWQsIHRhZ19tc2dzKTsKKwkJCWlmIChtc2dfYnl0ZXMgJiYgdGFnX21zZ3NbMF0gIT0gTVNHX1NJTVBMRV9UQVNLKSB7CisJCQkJaHNjYi0+Y29udHJvbCB8PSB0YWdfbXNnc1swXTsKKwkJCQlpZiAodGFnX21zZ3NbMF0gPT0gTVNHX09SREVSRURfVEFTSykKKwkJCQkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPSAwOworCQkJfSBlbHNlCisjZW5kaWYKKwkJCWlmIChkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZyA9PSBBSENfT1RBR19USFJFU0gKKwkJCSAmJiAoZGV2LT5mbGFncyAmIEFIQ19ERVZfUV9UQUdHRUQpICE9IDApIHsKKwkJCQloc2NiLT5jb250cm9sIHw9IE1TR19PUkRFUkVEX1RBU0s7CisJCQkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPSAwOworCQkJfSBlbHNlIHsKKwkJCQloc2NiLT5jb250cm9sIHw9IE1TR19TSU1QTEVfVEFTSzsKKwkJCX0KKwkJfQorCisJCWhzY2ItPmNkYl9sZW4gPSBjbWQtPmNtZF9sZW47CisJCWlmIChoc2NiLT5jZGJfbGVuIDw9IDEyKSB7CisJCQltZW1jcHkoaHNjYi0+c2hhcmVkX2RhdGEuY2RiLCBjbWQtPmNtbmQsIGhzY2ItPmNkYl9sZW4pOworCQl9IGVsc2UgeworCQkJbWVtY3B5KGhzY2ItPmNkYjMyLCBjbWQtPmNtbmQsIGhzY2ItPmNkYl9sZW4pOworCQkJc2NiLT5mbGFncyB8PSBTQ0JfQ0RCMzJfUFRSOworCQl9CisKKwkJc2NiLT5wbGF0Zm9ybV9kYXRhLT54ZmVyX2xlbiA9IDA7CisJCWFoY19zZXRfcmVzaWR1YWwoc2NiLCAwKTsKKwkJYWhjX3NldF9zZW5zZV9yZXNpZHVhbChzY2IsIDApOworCQlzY2ItPnNnX2NvdW50ID0gMDsKKwkJaWYgKGNtZC0+dXNlX3NnICE9IDApIHsKKwkJCXN0cnVjdAlhaGNfZG1hX3NlZyAqc2c7CisJCQlzdHJ1Y3QJc2NhdHRlcmxpc3QgKmN1cl9zZWc7CisJCQlzdHJ1Y3QJc2NhdHRlcmxpc3QgKmVuZF9zZWc7CisJCQlpbnQJbnNlZzsKKworCQkJY3VyX3NlZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPnJlcXVlc3RfYnVmZmVyOworCQkJbnNlZyA9IHBjaV9tYXBfc2coYWhjLT5kZXZfc29mdGMsIGN1cl9zZWcsIGNtZC0+dXNlX3NnLAorCQkJICAgIHNjc2lfdG9fcGNpX2RtYV9kaXIoY21kLT5zY19kYXRhX2RpcmVjdGlvbikpOworCQkJZW5kX3NlZyA9IGN1cl9zZWcgKyBuc2VnOworCQkJLyogQ29weSB0aGUgc2VnbWVudHMgaW50byB0aGUgU0cgbGlzdC4gKi8KKwkJCXNnID0gc2NiLT5zZ19saXN0OworCQkJLyoKKwkJCSAqIFRoZSBzZ19jb3VudCBtYXkgYmUgbGFyZ2VyIHRoYW4gbnNlZyBpZgorCQkJICogYSB0cmFuc2ZlciBjcm9zc2VzIGEgMzJiaXQgcGFnZS4KKwkJCSAqLyAKKwkJCXdoaWxlIChjdXJfc2VnIDwgZW5kX3NlZykgeworCQkJCWRtYV9hZGRyX3QgYWRkcjsKKwkJCQlidXNfc2l6ZV90IGxlbjsKKwkJCQlpbnQgY29uc3VtZWQ7CisKKwkJCQlhZGRyID0gc2dfZG1hX2FkZHJlc3MoY3VyX3NlZyk7CisJCQkJbGVuID0gc2dfZG1hX2xlbihjdXJfc2VnKTsKKwkJCQljb25zdW1lZCA9IGFoY19saW51eF9tYXBfc2VnKGFoYywgc2NiLAorCQkJCQkJCSAgICAgc2csIGFkZHIsIGxlbik7CisJCQkJc2cgKz0gY29uc3VtZWQ7CisJCQkJc2NiLT5zZ19jb3VudCArPSBjb25zdW1lZDsKKwkJCQljdXJfc2VnKys7CisJCQl9CisJCQlzZy0tOworCQkJc2ctPmxlbiB8PSBhaGNfaHRvbGUzMihBSENfRE1BX0xBU1RfU0VHKTsKKworCQkJLyoKKwkJCSAqIFJlc2V0IHRoZSBzZyBsaXN0IHBvaW50ZXIuCisJCQkgKi8KKwkJCXNjYi0+aHNjYi0+c2dwdHIgPQorCQkJICAgIGFoY19odG9sZTMyKHNjYi0+c2dfbGlzdF9waHlzIHwgU0dfRlVMTF9SRVNJRCk7CisKKwkJCS8qCisJCQkgKiBDb3B5IHRoZSBmaXJzdCBTRyBpbnRvIHRoZSAiY3VycmVudCIKKwkJCSAqIGRhdGEgcG9pbnRlciBhcmVhLgorCQkJICovCisJCQlzY2ItPmhzY2ItPmRhdGFwdHIgPSBzY2ItPnNnX2xpc3QtPmFkZHI7CisJCQlzY2ItPmhzY2ItPmRhdGFjbnQgPSBzY2ItPnNnX2xpc3QtPmxlbjsKKwkJfSBlbHNlIGlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbiAhPSAwKSB7CisJCQlzdHJ1Y3QJIGFoY19kbWFfc2VnICpzZzsKKwkJCWRtYV9hZGRyX3QgYWRkcjsKKworCQkJc2cgPSBzY2ItPnNnX2xpc3Q7CisJCQlhZGRyID0gcGNpX21hcF9zaW5nbGUoYWhjLT5kZXZfc29mdGMsCisJCQkgICAgICAgY21kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCSAgICAgICBjbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCSAgICAgICBzY3NpX3RvX3BjaV9kbWFfZGlyKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKwkJCXNjYi0+cGxhdGZvcm1fZGF0YS0+YnVmX2J1c2FkZHIgPSBhZGRyOworCQkJc2NiLT5zZ19jb3VudCA9IGFoY19saW51eF9tYXBfc2VnKGFoYywgc2NiLAorCQkJCQkJCSAgc2csIGFkZHIsCisJCQkJCQkJICBjbWQtPnJlcXVlc3RfYnVmZmxlbik7CisJCQlzZy0+bGVuIHw9IGFoY19odG9sZTMyKEFIQ19ETUFfTEFTVF9TRUcpOworCisJCQkvKgorCQkJICogUmVzZXQgdGhlIHNnIGxpc3QgcG9pbnRlci4KKwkJCSAqLworCQkJc2NiLT5oc2NiLT5zZ3B0ciA9CisJCQkgICAgYWhjX2h0b2xlMzIoc2NiLT5zZ19saXN0X3BoeXMgfCBTR19GVUxMX1JFU0lEKTsKKworCQkJLyoKKwkJCSAqIENvcHkgdGhlIGZpcnN0IFNHIGludG8gdGhlICJjdXJyZW50IgorCQkJICogZGF0YSBwb2ludGVyIGFyZWEuCisJCQkgKi8KKwkJCXNjYi0+aHNjYi0+ZGF0YXB0ciA9IHNnLT5hZGRyOworCQkJc2NiLT5oc2NiLT5kYXRhY250ID0gc2ctPmxlbjsKKwkJfSBlbHNlIHsKKwkJCXNjYi0+aHNjYi0+c2dwdHIgPSBhaGNfaHRvbGUzMihTR19MSVNUX05VTEwpOworCQkJc2NiLT5oc2NiLT5kYXRhcHRyID0gMDsKKwkJCXNjYi0+aHNjYi0+ZGF0YWNudCA9IDA7CisJCQlzY2ItPnNnX2NvdW50ID0gMDsKKwkJfQorCisJCWFoY19zeW5jX3NnbGlzdChhaGMsIHNjYiwgQlVTX0RNQVNZTkNfUFJFV1JJVEUpOworCQlMSVNUX0lOU0VSVF9IRUFEKCZhaGMtPnBlbmRpbmdfc2Nicywgc2NiLCBwZW5kaW5nX2xpbmtzKTsKKwkJZGV2LT5vcGVuaW5ncy0tOworCQlkZXYtPmFjdGl2ZSsrOworCQlkZXYtPmNvbW1hbmRzX2lzc3VlZCsrOworCQlpZiAoKGRldi0+ZmxhZ3MgJiBBSENfREVWX1BFUklPRElDX09UQUcpICE9IDApCisJCQlkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZysrOworCisJCS8qCisJCSAqIFdlIG9ubHkgYWxsb3cgb25lIHVudGFnZ2VkIHRyYW5zYWN0aW9uCisJCSAqIHBlciB0YXJnZXQgaW4gdGhlIGluaXRpYXRvciByb2xlIHVubGVzcworCQkgKiB3ZSBhcmUgc3RvcmluZyBhIGZ1bGwgYnVzeSB0YXJnZXQgKmx1bioKKwkJICogdGFibGUgaW4gU0NCIHNwYWNlLgorCQkgKi8KKwkJaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiAoVEFSR0VUX1NDQnxUQUdfRU5CKSkgPT0gMAorCQkgJiYgKGFoYy0+ZmVhdHVyZXMgJiBBSENfU0NCX0JUVCkgPT0gMCkgeworCQkJc3RydWN0IHNjYl90YWlscSAqdW50YWdnZWRfcTsKKwkJCWludCB0YXJnZXRfb2Zmc2V0OworCisJCQl0YXJnZXRfb2Zmc2V0ID0gU0NCX0dFVF9UQVJHRVRfT0ZGU0VUKGFoYywgc2NiKTsKKwkJCXVudGFnZ2VkX3EgPSAmKGFoYy0+dW50YWdnZWRfcXVldWVzW3RhcmdldF9vZmZzZXRdKTsKKwkJCVRBSUxRX0lOU0VSVF9UQUlMKHVudGFnZ2VkX3EsIHNjYiwgbGlua3MudHFlKTsKKwkJCXNjYi0+ZmxhZ3MgfD0gU0NCX1VOVEFHR0VEUTsKKwkJCWlmIChUQUlMUV9GSVJTVCh1bnRhZ2dlZF9xKSAhPSBzY2IpCisJCQkJY29udGludWU7CisJCX0KKwkJc2NiLT5mbGFncyB8PSBTQ0JfQUNUSVZFOworCQlhaGNfcXVldWVfc2NiKGFoYywgc2NiKTsKKwl9Cit9CisKKy8qCisgKiBTQ1NJIGNvbnRyb2xsZXIgaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KK2lycXJldHVybl90CithaGNfbGludXhfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdAlhaGNfc29mdGMgKmFoYzsKKwl1X2xvbmcJZmxhZ3M7CisJaW50CW91cnM7CisKKwlhaGMgPSAoc3RydWN0IGFoY19zb2Z0YyAqKSBkZXZfaWQ7CisJYWhjX2xvY2soYWhjLCAmZmxhZ3MpOyAKKwlvdXJzID0gYWhjX2ludHIoYWhjKTsKKwlpZiAoYWhjX2xpbnV4X25leHRfZGV2aWNlX3RvX3J1bihhaGMpICE9IE5VTEwpCisJCWFoY19zY2hlZHVsZV9ydW5xKGFoYyk7CisJYWhjX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShhaGMpOworCWFoY191bmxvY2soYWhjLCAmZmxhZ3MpOworCXJldHVybiBJUlFfUkVUVkFMKG91cnMpOworfQorCit2b2lkCithaGNfcGxhdGZvcm1fZmx1c2h3b3JrKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKworCXdoaWxlIChhaGNfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlKGFoYykgIT0gTlVMTCkKKwkJOworfQorCitzdGF0aWMgc3RydWN0IGFoY19saW51eF90YXJnZXQqCithaGNfbGludXhfYWxsb2NfdGFyZ2V0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgY2hhbm5lbCwgdV9pbnQgdGFyZ2V0KQoreworCXN0cnVjdCBhaGNfbGludXhfdGFyZ2V0ICp0YXJnOworCXVfaW50IHRhcmdldF9vZmZzZXQ7CisKKwl0YXJnZXRfb2Zmc2V0ID0gdGFyZ2V0OworCWlmIChjaGFubmVsICE9IDApCisJCXRhcmdldF9vZmZzZXQgKz0gODsKKworCXRhcmcgPSBtYWxsb2Moc2l6ZW9mKCp0YXJnKSwgTV9ERVZCVUcsIE1fTk9XQUlUKTsKKwlpZiAodGFyZyA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCW1lbXNldCh0YXJnLCAwLCBzaXplb2YoKnRhcmcpKTsKKwl0YXJnLT5jaGFubmVsID0gY2hhbm5lbDsKKwl0YXJnLT50YXJnZXQgPSB0YXJnZXQ7CisJdGFyZy0+YWhjID0gYWhjOworCXRhcmctPmZsYWdzID0gQUhDX0RWX1JFUVVJUkVEOworCWFoYy0+cGxhdGZvcm1fZGF0YS0+dGFyZ2V0c1t0YXJnZXRfb2Zmc2V0XSA9IHRhcmc7CisJcmV0dXJuICh0YXJnKTsKK30KKworc3RhdGljIHZvaWQKK2FoY19saW51eF9mcmVlX3RhcmdldChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfbGludXhfdGFyZ2V0ICp0YXJnKQoreworCXN0cnVjdCBhaGNfZGV2aW5mbyBkZXZpbmZvOworCXN0cnVjdCBhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXVfaW50IG91cl9pZDsKKwl1X2ludCB0YXJnZXRfb2Zmc2V0OworCWNoYXIgY2hhbm5lbDsKKworCS8qCisJICogRm9yY2UgYSBuZWdvdGlhdGlvbiB0byBhc3luYy9uYXJyb3cgb24gYW55CisJICogZnV0dXJlIGNvbW1hbmQgdG8gdGhpcyBkZXZpY2UgdW5sZXNzIGEgYnVzCisJICogcmVzZXQgb2NjdXJzIGJldHdlZW4gbm93IGFuZCB0aGF0IGNvbW1hbmQuCisJICovCisJY2hhbm5lbCA9ICdBJyArIHRhcmctPmNoYW5uZWw7CisJb3VyX2lkID0gYWhjLT5vdXJfaWQ7CisJdGFyZ2V0X29mZnNldCA9IHRhcmctPnRhcmdldDsKKwlpZiAodGFyZy0+Y2hhbm5lbCAhPSAwKSB7CisJCXRhcmdldF9vZmZzZXQgKz0gODsKKwkJb3VyX2lkID0gYWhjLT5vdXJfaWRfYjsKKwl9CisJdGluZm8gPSBhaGNfZmV0Y2hfdHJhbnNpbmZvKGFoYywgY2hhbm5lbCwgb3VyX2lkLAorCQkJCSAgICB0YXJnLT50YXJnZXQsICZ0c3RhdGUpOworCWFoY19jb21waWxlX2RldmluZm8oJmRldmluZm8sIG91cl9pZCwgdGFyZy0+dGFyZ2V0LCBDQU1fTFVOX1dJTERDQVJELAorCQkJICAgIGNoYW5uZWwsIFJPTEVfSU5JVElBVE9SKTsKKwlhaGNfc2V0X3N5bmNyYXRlKGFoYywgJmRldmluZm8sIE5VTEwsIDAsIDAsIDAsCisJCQkgQUhDX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9GQUxTRSk7CisJYWhjX3NldF93aWR0aChhaGMsICZkZXZpbmZvLCBNU0dfRVhUX1dEVFJfQlVTXzhfQklULAorCQkgICAgICBBSENfVFJBTlNfR09BTCwgLypwYXVzZWQqL0ZBTFNFKTsKKwlhaGNfdXBkYXRlX25lZ19yZXF1ZXN0KGFoYywgJmRldmluZm8sIHRzdGF0ZSwgdGluZm8sIEFIQ19ORUdfQUxXQVlTKTsKKwlhaGMtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0X29mZnNldF0gPSBOVUxMOworCWlmICh0YXJnLT5pbnFfZGF0YSAhPSBOVUxMKQorCQlmcmVlKHRhcmctPmlucV9kYXRhLCBNX0RFVkJVRik7CisJaWYgKHRhcmctPmR2X2J1ZmZlciAhPSBOVUxMKQorCQlmcmVlKHRhcmctPmR2X2J1ZmZlciwgTV9ERVZCVUYpOworCWlmICh0YXJnLT5kdl9idWZmZXIxICE9IE5VTEwpCisJCWZyZWUodGFyZy0+ZHZfYnVmZmVyMSwgTV9ERVZCVUYpOworCWZyZWUodGFyZywgTV9ERVZCVUYpOworfQorCitzdGF0aWMgc3RydWN0IGFoY19saW51eF9kZXZpY2UqCithaGNfbGludXhfYWxsb2NfZGV2aWNlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJIHN0cnVjdCBhaGNfbGludXhfdGFyZ2V0ICp0YXJnLCB1X2ludCBsdW4pCit7CisJc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldjsKKworCWRldiA9IG1hbGxvYyhzaXplb2YoKmRldiksIE1fREVWQlVHLCBNX05PV0FJVCk7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCW1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7CisJaW5pdF90aW1lcigmZGV2LT50aW1lcik7CisJVEFJTFFfSU5JVCgmZGV2LT5idXN5cSk7CisJZGV2LT5mbGFncyA9IEFIQ19ERVZfVU5DT05GSUdVUkVEOworCWRldi0+bHVuID0gbHVuOworCWRldi0+dGFyZ2V0ID0gdGFyZzsKKworCS8qCisJICogV2Ugc3RhcnQgb3V0IGxpZmUgdXNpbmcgdW50YWdnZWQKKwkgKiB0cmFuc2FjdGlvbnMgb2Ygd2hpY2ggd2UgYWxsb3cgb25lLgorCSAqLworCWRldi0+b3BlbmluZ3MgPSAxOworCisJLyoKKwkgKiBTZXQgbWF4dGFncyB0byAwLiAgVGhpcyB3aWxsIGJlIGNoYW5nZWQgaWYgd2UKKwkgKiBsYXRlciBkZXRlcm1pbmUgdGhhdCB3ZSBhcmUgZGVhbGluZyB3aXRoCisJICogYSB0YWdnZWQgcXVldWluZyBjYXBhYmxlIGRldmljZS4KKwkgKi8KKwlkZXYtPm1heHRhZ3MgPSAwOworCQorCXRhcmctPnJlZmNvdW50Kys7CisJdGFyZy0+ZGV2aWNlc1tsdW5dID0gZGV2OworCXJldHVybiAoZGV2KTsKK30KKworc3RhdGljIHZvaWQKK19fYWhjX2xpbnV4X2ZyZWVfZGV2aWNlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZzsKKworCXRhcmcgPSBkZXYtPnRhcmdldDsKKwl0YXJnLT5kZXZpY2VzW2Rldi0+bHVuXSA9IE5VTEw7CisJZnJlZShkZXYsIE1fREVWQlVGKTsKKwl0YXJnLT5yZWZjb3VudC0tOworCWlmICh0YXJnLT5yZWZjb3VudCA9PSAwCisJICYmICh0YXJnLT5mbGFncyAmIEFIQ19EVl9SRVFVSVJFRCkgPT0gMCkKKwkJYWhjX2xpbnV4X2ZyZWVfdGFyZ2V0KGFoYywgdGFyZyk7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfZnJlZV9kZXZpY2Uoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2KQoreworCWRlbF90aW1lcl9zeW5jKCZkZXYtPnRpbWVyKTsKKwlfX2FoY19saW51eF9mcmVlX2RldmljZShhaGMsIGRldik7Cit9CisKK3ZvaWQKK2FoY19zZW5kX2FzeW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgY2hhciBjaGFubmVsLAorCSAgICAgICB1X2ludCB0YXJnZXQsIHVfaW50IGx1biwgYWNfY29kZSBjb2RlLCB2b2lkICphcmcpCit7CisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBBQ19UUkFOU0ZFUl9ORUc6CisJeworCQljaGFyCWJ1Zls4MF07CisJCXN0cnVjdAlhaGNfbGludXhfdGFyZ2V0ICp0YXJnOworCQlzdHJ1Y3QJaW5mb19zdHIgaW5mbzsKKwkJc3RydWN0CWFoY19pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQlzdHJ1Y3QJYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCQlpbnQJdGFyZ2V0X29mZnNldDsKKworCQlpbmZvLmJ1ZmZlciA9IGJ1ZjsKKwkJaW5mby5sZW5ndGggPSBzaXplb2YoYnVmKTsKKwkJaW5mby5vZmZzZXQgPSAwOworCQlpbmZvLnBvcyA9IDA7CisJCXRpbmZvID0gYWhjX2ZldGNoX3RyYW5zaW5mbyhhaGMsIGNoYW5uZWwsCisJCQkJCQljaGFubmVsID09ICdBJyA/IGFoYy0+b3VyX2lkCisJCQkJCQkJICAgICAgIDogYWhjLT5vdXJfaWRfYiwKKwkJCQkJCXRhcmdldCwgJnRzdGF0ZSk7CisKKwkJLyoKKwkJICogRG9uJ3QgYm90aGVyIHJlcG9ydGluZyByZXN1bHRzIHdoaWxlCisJCSAqIG5lZ290aWF0aW9ucyBhcmUgc3RpbGwgcGVuZGluZy4KKwkJICovCisJCWlmICh0aW5mby0+Y3Vyci5wZXJpb2QgIT0gdGluZm8tPmdvYWwucGVyaW9kCisJCSB8fCB0aW5mby0+Y3Vyci53aWR0aCAhPSB0aW5mby0+Z29hbC53aWR0aAorCQkgfHwgdGluZm8tPmN1cnIub2Zmc2V0ICE9IHRpbmZvLT5nb2FsLm9mZnNldAorCQkgfHwgdGluZm8tPmN1cnIucHByX29wdGlvbnMgIT0gdGluZm8tPmdvYWwucHByX29wdGlvbnMpCisJCQlpZiAoYm9vdHZlcmJvc2UgPT0gMCkKKwkJCQlicmVhazsKKworCQkvKgorCQkgKiBEb24ndCBib3RoZXIgcmVwb3J0aW5nIHJlc3VsdHMgdGhhdAorCQkgKiBhcmUgaWRlbnRpY2FsIHRvIHRob3NlIGxhc3QgcmVwb3J0ZWQuCisJCSAqLworCQl0YXJnZXRfb2Zmc2V0ID0gdGFyZ2V0OworCQlpZiAoY2hhbm5lbCA9PSAnQicpCisJCQl0YXJnZXRfb2Zmc2V0ICs9IDg7CisJCXRhcmcgPSBhaGMtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0X29mZnNldF07CisJCWlmICh0YXJnID09IE5VTEwpCisJCQlicmVhazsKKwkJaWYgKHRpbmZvLT5jdXJyLnBlcmlvZCA9PSB0YXJnLT5sYXN0X3RpbmZvLnBlcmlvZAorCQkgJiYgdGluZm8tPmN1cnIud2lkdGggPT0gdGFyZy0+bGFzdF90aW5mby53aWR0aAorCQkgJiYgdGluZm8tPmN1cnIub2Zmc2V0ID09IHRhcmctPmxhc3RfdGluZm8ub2Zmc2V0CisJCSAmJiB0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyA9PSB0YXJnLT5sYXN0X3RpbmZvLnBwcl9vcHRpb25zKQorCQkJaWYgKGJvb3R2ZXJib3NlID09IDApCisJCQkJYnJlYWs7CisKKwkJdGFyZy0+bGFzdF90aW5mby5wZXJpb2QgPSB0aW5mby0+Y3Vyci5wZXJpb2Q7CisJCXRhcmctPmxhc3RfdGluZm8ud2lkdGggPSB0aW5mby0+Y3Vyci53aWR0aDsKKwkJdGFyZy0+bGFzdF90aW5mby5vZmZzZXQgPSB0aW5mby0+Y3Vyci5vZmZzZXQ7CisJCXRhcmctPmxhc3RfdGluZm8ucHByX29wdGlvbnMgPSB0aW5mby0+Y3Vyci5wcHJfb3B0aW9uczsKKworCQlwcmludGYoIiglczolYzoiLCBhaGNfbmFtZShhaGMpLCBjaGFubmVsKTsKKwkJaWYgKHRhcmdldCA9PSBDQU1fVEFSR0VUX1dJTERDQVJEKQorCQkJcHJpbnRmKCIqKTogIik7CisJCWVsc2UKKwkJCXByaW50ZigiJWQpOiAiLCB0YXJnZXQpOworCQlhaGNfZm9ybWF0X3RyYW5zaW5mbygmaW5mbywgJnRpbmZvLT5jdXJyKTsKKwkJaWYgKGluZm8ucG9zIDwgaW5mby5sZW5ndGgpCisJCQkqaW5mby5idWZmZXIgPSAnXDAnOworCQllbHNlCisJCQlidWZbaW5mby5sZW5ndGggLSAxXSA9ICdcMCc7CisJCXByaW50ZigiJXMiLCBidWYpOworCQlicmVhazsKKwl9CisgICAgICAgIGNhc2UgQUNfU0VOVF9CRFI6CisJeworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkJV0FSTl9PTihsdW4gIT0gQ0FNX0xVTl9XSUxEQ0FSRCk7CisJCXNjc2lfcmVwb3J0X2RldmljZV9yZXNldChhaGMtPnBsYXRmb3JtX2RhdGEtPmhvc3QsCisJCQkJCSBjaGFubmVsIC0gJ0EnLCB0YXJnZXQpOworI2Vsc2UKKwkJU2NzaV9EZXZpY2UgKnNjc2lfZGV2OworCisJCS8qCisJCSAqIEZpbmQgdGhlIFNDU0kgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisJCSAqIHJlcXVlc3QgYW5kIGluZGljYXRlIHRoYXQgYSBVQSBpcyBleHBlY3RlZC4KKwkJICovCisJCWZvciAoc2NzaV9kZXYgPSBhaGMtPnBsYXRmb3JtX2RhdGEtPmhvc3QtPmhvc3RfcXVldWU7CisJCSAgICAgc2NzaV9kZXYgIT0gTlVMTDsgc2NzaV9kZXYgPSBzY3NpX2Rldi0+bmV4dCkgeworCQkJaWYgKGNoYW5uZWwgLSAnQScgPT0gc2NzaV9kZXYtPmNoYW5uZWwKKwkJCSAmJiB0YXJnZXQgPT0gc2NzaV9kZXYtPmlkCisJCQkgJiYgKGx1biA9PSBDQU1fTFVOX1dJTERDQVJECisJCQkgIHx8IGx1biA9PSBzY3NpX2Rldi0+bHVuKSkgeworCQkJCXNjc2lfZGV2LT53YXNfcmVzZXQgPSAxOworCQkJCXNjc2lfZGV2LT5leHBlY3RpbmdfY2NfdWEgPSAxOworCQkJfQorCQl9CisjZW5kaWYKKwkJYnJlYWs7CisJfQorICAgICAgICBjYXNlIEFDX0JVU19SRVNFVDoKKwkJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdCAhPSBOVUxMKSB7CisJCQlzY3NpX3JlcG9ydF9idXNfcmVzZXQoYWhjLT5wbGF0Zm9ybV9kYXRhLT5ob3N0LAorCQkJCQkgICAgICBjaGFubmVsIC0gJ0EnKTsKKwkJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHBhbmljKCJhaGNfc2VuZF9hc3luYzogVW5leHBlY3RlZCBhc3luYyBldmVudCIpOworICAgICAgICB9Cit9CisKKy8qCisgKiBDYWxscyB0aGUgaGlnaGVyIGxldmVsIHNjc2kgZG9uZSBmdW5jdGlvbiBhbmQgZnJlZXMgdGhlIHNjYi4KKyAqLwordm9pZAorYWhjX2RvbmUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJU2NzaV9DbW5kICpjbWQ7CisJc3RydWN0CSAgIGFoY19saW51eF9kZXZpY2UgKmRldjsKKworCUxJU1RfUkVNT1ZFKHNjYiwgcGVuZGluZ19saW5rcyk7CisJaWYgKChzY2ItPmZsYWdzICYgU0NCX1VOVEFHR0VEUSkgIT0gMCkgeworCQlzdHJ1Y3Qgc2NiX3RhaWxxICp1bnRhZ2dlZF9xOworCQlpbnQgdGFyZ2V0X29mZnNldDsKKworCQl0YXJnZXRfb2Zmc2V0ID0gU0NCX0dFVF9UQVJHRVRfT0ZGU0VUKGFoYywgc2NiKTsKKwkJdW50YWdnZWRfcSA9ICYoYWhjLT51bnRhZ2dlZF9xdWV1ZXNbdGFyZ2V0X29mZnNldF0pOworCQlUQUlMUV9SRU1PVkUodW50YWdnZWRfcSwgc2NiLCBsaW5rcy50cWUpOworCQlhaGNfcnVuX3VudGFnZ2VkX3F1ZXVlKGFoYywgdW50YWdnZWRfcSk7CisJfQorCisJaWYgKChzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkgeworCQlwcmludGYoIlNDQiAlZCBkb25lJ2QgdHdpY2VcbiIsIHNjYi0+aHNjYi0+dGFnKTsKKwkJYWhjX2R1bXBfY2FyZF9zdGF0ZShhaGMpOworCQlwYW5pYygiU3RvcHBpbmcgZm9yIHNhZmV0eSIpOworCX0KKwljbWQgPSBzY2ItPmlvX2N0eDsKKwlkZXYgPSBzY2ItPnBsYXRmb3JtX2RhdGEtPmRldjsKKwlkZXYtPmFjdGl2ZS0tOworCWRldi0+b3BlbmluZ3MrKzsKKwlpZiAoKGNtZC0+cmVzdWx0ICYgKENBTV9ERVZfUUZSWk4gPDwgMTYpKSAhPSAwKSB7CisJCWNtZC0+cmVzdWx0ICY9IH4oQ0FNX0RFVl9RRlJaTiA8PCAxNik7CisJCWRldi0+cWZyb3plbi0tOworCX0KKwlhaGNfbGludXhfdW5tYXBfc2NiKGFoYywgc2NiKTsKKworCS8qCisJICogR3VhcmQgYWdhaW5zdCBzdGFsZSBzZW5zZSBkYXRhLgorCSAqIFRoZSBMaW51eCBtaWQtbGF5ZXIgYXNzdW1lcyB0aGF0IHNlbnNlCisJICogd2FzIHJldHJpZXZlZCBhbnl0aW1lIHRoZSBmaXJzdCBieXRlIG9mCisJICogdGhlIHNlbnNlIGJ1ZmZlciBsb29rcyAic2FuZSIuCisJICovCisJY21kLT5zZW5zZV9idWZmZXJbMF0gPSAwOworCWlmIChhaGNfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9SRVFfSU5QUk9HKSB7CisJCXVpbnQzMl90IGFtb3VudF94ZmVycmVkOworCisJCWFtb3VudF94ZmVycmVkID0KKwkJICAgIGFoY19nZXRfdHJhbnNmZXJfbGVuZ3RoKHNjYikgLSBhaGNfZ2V0X3Jlc2lkdWFsKHNjYik7CisJCWlmICgoc2NiLT5mbGFncyAmIFNDQl9UUkFOU01JU1NJT05fRVJST1IpICE9IDApIHsKKyNpZmRlZiBBSENfREVCVUcKKwkJCWlmICgoYWhjX2RlYnVnICYgQUhDX1NIT1dfTUlTQykgIT0gMCkgeworCQkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKKwkJCQlwcmludGYoIlNldCBDQU1fVU5DT1JfUEFSSVRZXG4iKTsKKwkJCX0KKyNlbmRpZgorCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fVU5DT1JfUEFSSVRZKTsKKyNpZmRlZiBBSENfUkVQT1JUX1VOREVSRkxPV1MKKwkJLyoKKwkJICogVGhpcyBjb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYXMgc29tZQorCQkgKiBjbGllbnRzIG9mIHRoZSBTQ1NJIHN5c3RlbSBkbyBub3QgcHJvcGVybHkKKwkJICogaW5pdGlhbGl6ZSB0aGUgdW5kZXJmbG93IHBhcmFtZXRlci4gIFRoaXMKKwkJICogcmVzdWx0cyBpbiBzcHVyaW91cyB0ZXJtaW5hdGlvbiBvZiBjb21tYW5kcworCQkgKiB0aGF0IGNvbXBsZXRlIGFzIGV4cGVjdGVkIChlLmcuIHVuZGVyZmxvdyBpcworCQkgKiBhbGxvd2VkIGFzIGNvbW1hbmQgY2FuIHJldHVybiB2YXJpYWJsZSBhbW91bnRzCisJCSAqIG9mIGRhdGEuCisJCSAqLworCQl9IGVsc2UgaWYgKGFtb3VudF94ZmVycmVkIDwgc2NiLT5pb19jdHgtPnVuZGVyZmxvdykgeworCQkJdV9pbnQgaTsKKworCQkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOworCQkJcHJpbnRmKCJDREI6Iik7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2NiLT5pb19jdHgtPmNtZF9sZW47IGkrKykKKwkJCQlwcmludGYoIiAweCV4Iiwgc2NiLT5pb19jdHgtPmNtbmRbaV0pOworCQkJcHJpbnRmKCJcbiIpOworCQkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOworCQkJcHJpbnRmKCJTYXcgdW5kZXJmbG93ICglbGQgb2YgJWxkIGJ5dGVzKS4gIgorCQkJICAgICAgICJUcmVhdGVkIGFzIGVycm9yXG4iLAorCQkJCWFoY19nZXRfcmVzaWR1YWwoc2NiKSwKKwkJCQlhaGNfZ2V0X3RyYW5zZmVyX2xlbmd0aChzY2IpKTsKKwkJCWFoY19zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX0RBVEFfUlVOX0VSUik7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCWFoY19zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX1JFUV9DTVApOworCQl9CisJfSBlbHNlIGlmIChhaGNfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9TQ1NJX1NUQVRVU19FUlJPUikgeworCQlhaGNfbGludXhfaGFuZGxlX3Njc2lfc3RhdHVzKGFoYywgZGV2LCBzY2IpOworCX0gZWxzZSBpZiAoYWhjX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSA9PSBDQU1fU0VMX1RJTUVPVVQpIHsKKwkJZGV2LT5mbGFncyB8PSBBSENfREVWX1VOQ09ORklHVVJFRDsKKwkJaWYgKEFIQ19EVl9DTUQoY21kKSA9PSBGQUxTRSkKKwkJCWRldi0+dGFyZ2V0LT5mbGFncyAmPSB+QUhDX0RWX1JFUVVJUkVEOworCX0KKwkvKgorCSAqIFN0YXJ0IERWIGZvciBkZXZpY2VzIHRoYXQgcmVxdWlyZSBpdCBhc3N1bWluZyB0aGUgZmlyc3QgY29tbWFuZAorCSAqIHNlbnQgZG9lcyBub3QgcmVzdWx0IGluIGEgc2VsZWN0aW9uIHRpbWVvdXQuCisJICovCisJaWYgKGFoY19nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgIT0gQ0FNX1NFTF9USU1FT1VUCisJICYmIChkZXYtPnRhcmdldC0+ZmxhZ3MgJiBBSENfRFZfUkVRVUlSRUQpICE9IDApCisJCWFoY19saW51eF9zdGFydF9kdihhaGMpOworCisJaWYgKGRldi0+b3BlbmluZ3MgPT0gMQorCSAmJiBhaGNfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9SRVFfQ01QCisJICYmIGFoY19nZXRfc2NzaV9zdGF0dXMoc2NiKSAhPSBTQ1NJX1NUQVRVU19RVUVVRV9GVUxMKQorCQlkZXYtPnRhZ19zdWNjZXNzX2NvdW50Kys7CisJLyoKKwkgKiBTb21lIGRldmljZXMgZGVhbCB3aXRoIHRlbXBvcmFyeSBpbnRlcm5hbCByZXNvdXJjZQorCSAqIHNob3J0YWdlcyBieSByZXR1cm5pbmcgcXVldWUgZnVsbC4gIFdoZW4gdGhlIHF1ZXVlCisJICogZnVsbCBvY2N1cnJzLCB3ZSB0aHJvdHRsZSBiYWNrLiAgU2xvd2x5IHRyeSB0byBnZXQKKwkgKiBiYWNrIHRvIG91ciBwcmV2aW91cyBxdWV1ZSBkZXB0aC4KKwkgKi8KKwlpZiAoKGRldi0+b3BlbmluZ3MgKyBkZXYtPmFjdGl2ZSkgPCBkZXYtPm1heHRhZ3MKKwkgJiYgZGV2LT50YWdfc3VjY2Vzc19jb3VudCA+IEFIQ19UQUdfU1VDQ0VTU19JTlRFUlZBTCkgeworCQlkZXYtPnRhZ19zdWNjZXNzX2NvdW50ID0gMDsKKwkJZGV2LT5vcGVuaW5ncysrOworCX0KKworCWlmIChkZXYtPmFjdGl2ZSA9PSAwKQorCQlkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZyA9IDA7CisKKwlpZiAoVEFJTFFfRU1QVFkoJmRldi0+YnVzeXEpKSB7CisJCWlmICgoZGV2LT5mbGFncyAmIEFIQ19ERVZfVU5DT05GSUdVUkVEKSAhPSAwCisJCSAmJiBkZXYtPmFjdGl2ZSA9PSAwCisJIAkgJiYgKGRldi0+ZmxhZ3MgJiBBSENfREVWX1RJTUVSX0FDVElWRSkgPT0gMCkKKwkJCWFoY19saW51eF9mcmVlX2RldmljZShhaGMsIGRldik7CisJfSBlbHNlIGlmICgoZGV2LT5mbGFncyAmIEFIQ19ERVZfT05fUlVOX0xJU1QpID09IDApIHsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJmFoYy0+cGxhdGZvcm1fZGF0YS0+ZGV2aWNlX3J1bnEsIGRldiwgbGlua3MpOworCQlkZXYtPmZsYWdzIHw9IEFIQ19ERVZfT05fUlVOX0xJU1Q7CisJfQorCisJaWYgKChzY2ItPmZsYWdzICYgU0NCX1JFQ09WRVJZX1NDQikgIT0gMCkgeworCQlwcmludGYoIlJlY292ZXJ5IFNDQiBjb21wbGV0ZXNcbiIpOworCQlpZiAoYWhjX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSA9PSBDQU1fQkRSX1NFTlQKKwkJIHx8IGFoY19nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgPT0gQ0FNX1JFUV9BQk9SVEVEKQorCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fQ01EX1RJTUVPVVQpOworCQlpZiAoKGFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSENfVVBfRUhfU0VNQVBIT1JFKSAhPSAwKSB7CisJCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmZsYWdzICY9IH5BSENfVVBfRUhfU0VNQVBIT1JFOworCQkJdXAoJmFoYy0+cGxhdGZvcm1fZGF0YS0+ZWhfc2VtKTsKKwkJfQorCX0KKworCWFoY19mcmVlX3NjYihhaGMsIHNjYik7CisJYWhjX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShhaGMsIGNtZCk7CisKKwlpZiAoKGFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSENfRFZfV0FJVF9TSU1RX0VNUFRZKSAhPSAwCisJICYmIExJU1RfRklSU1QoJmFoYy0+cGVuZGluZ19zY2JzKSA9PSBOVUxMKSB7CisJCWFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJj0gfkFIQ19EVl9XQUlUX1NJTVFfRU1QVFk7CisJCXVwKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmR2X3NlbSk7CisJfQorCQkKK30KKworc3RhdGljIHZvaWQKK2FoY19saW51eF9oYW5kbGVfc2NzaV9zdGF0dXMoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJICAgICBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJc3RydWN0CWFoY19kZXZpbmZvIGRldmluZm87CisKKwlhaGNfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLAorCQkJICAgIGFoYy0+b3VyX2lkLAorCQkJICAgIGRldi0+dGFyZ2V0LT50YXJnZXQsIGRldi0+bHVuLAorCQkJICAgIGRldi0+dGFyZ2V0LT5jaGFubmVsID09IDAgPyAnQScgOiAnQicsCisJCQkgICAgUk9MRV9JTklUSUFUT1IpOworCQorCS8qCisJICogV2UgZG9uJ3QgY3VycmVudGx5IHRydXN0IHRoZSBtaWQtbGF5ZXIgdG8KKwkgKiBwcm9wZXJseSBkZWFsIHdpdGggcXVldWUgZnVsbCBvciBidXN5LiAgU28sCisJICogd2hlbiBvbmUgb2NjdXJzLCB3ZSB0ZWxsIHRoZSBtaWQtbGF5ZXIgdG8KKwkgKiB1bmNvbmRpdGlvbmFsbHkgcmVxdWV1ZSB0aGUgY29tbWFuZCB0byB1cworCSAqIHNvIHRoYXQgd2UgY2FuIHJldHJ5IGl0IG91cnNlbHZlcy4gIFdlIGFsc28KKwkgKiBpbXBsZW1lbnQgb3VyIG93biB0aHJvdHRsaW5nIG1lY2hhbmlzbSBzbworCSAqIHdlIGRvbid0IGNsb2JiZXIgdGhlIGRldmljZSB3aXRoIHRvbyBtYW55CisJICogY29tbWFuZHMuCisJICovCisJc3dpdGNoIChhaGNfZ2V0X3Njc2lfc3RhdHVzKHNjYikpIHsKKwlkZWZhdWx0OgorCQlicmVhazsKKwljYXNlIFNDU0lfU1RBVFVTX0NIRUNLX0NPTkQ6CisJY2FzZSBTQ1NJX1NUQVRVU19DTURfVEVSTUlOQVRFRDoKKwl7CisJCVNjc2lfQ21uZCAqY21kOworCisJCS8qCisJCSAqIENvcHkgc2Vuc2UgaW5mb3JtYXRpb24gdG8gdGhlIE9TJ3MgY21kCisJCSAqIHN0cnVjdHVyZSBpZiBpdCBpcyBhdmFpbGFibGUuCisJCSAqLworCQljbWQgPSBzY2ItPmlvX2N0eDsKKwkJaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfU0VOU0UpIHsKKwkJCXVfaW50IHNlbnNlX3NpemU7CisKKwkJCXNlbnNlX3NpemUgPSBNSU4oc2l6ZW9mKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEpCisJCQkJICAgICAgIC0gYWhjX2dldF9zZW5zZV9yZXNpZHVhbChzY2IpLAorCQkJCQkgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisJCQltZW1jcHkoY21kLT5zZW5zZV9idWZmZXIsCisJCQkgICAgICAgYWhjX2dldF9zZW5zZV9idWYoYWhjLCBzY2IpLCBzZW5zZV9zaXplKTsKKwkJCWlmIChzZW5zZV9zaXplIDwgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSkKKwkJCQltZW1zZXQoJmNtZC0+c2Vuc2VfYnVmZmVyW3NlbnNlX3NpemVdLCAwLAorCQkJCSAgICAgICBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpIC0gc2Vuc2Vfc2l6ZSk7CisJCQljbWQtPnJlc3VsdCB8PSAoRFJJVkVSX1NFTlNFIDw8IDI0KTsKKyNpZmRlZiBBSENfREVCVUcKKwkJCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19TRU5TRSkgeworCQkJCWludCBpOworCisJCQkJcHJpbnRmKCJDb3BpZWQgJWQgYnl0ZXMgb2Ygc2Vuc2UgZGF0YToiLAorCQkJCSAgICAgICBzZW5zZV9zaXplKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgc2Vuc2Vfc2l6ZTsgaSsrKSB7CisJCQkJCWlmICgoaSAmIDB4RikgPT0gMCkKKwkJCQkJCXByaW50ZigiXG4iKTsKKwkJCQkJcHJpbnRmKCIweCV4ICIsIGNtZC0+c2Vuc2VfYnVmZmVyW2ldKTsKKwkJCQl9CisJCQkJcHJpbnRmKCJcbiIpOworCQkJfQorI2VuZGlmCisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgU0NTSV9TVEFUVVNfUVVFVUVfRlVMTDoKKwl7CisJCS8qCisJCSAqIEJ5IHRoZSB0aW1lIHRoZSBjb3JlIGRyaXZlciBoYXMgcmV0dXJuZWQgdGhpcworCQkgKiBjb21tYW5kLCBhbGwgb3RoZXIgY29tbWFuZHMgdGhhdCB3ZXJlIHF1ZXVlZAorCQkgKiB0byB1cyBidXQgbm90IHRoZSBkZXZpY2UgaGF2ZSBiZWVuIHJldHVybmVkLgorCQkgKiBUaGlzIGVuc3VyZXMgdGhhdCBkZXYtPmFjdGl2ZSBpcyBlcXVhbCB0bworCQkgKiB0aGUgbnVtYmVyIG9mIGNvbW1hbmRzIGFjdHVhbGx5IHF1ZXVlZCB0bworCQkgKiB0aGUgZGV2aWNlLgorCQkgKi8KKwkJZGV2LT50YWdfc3VjY2Vzc19jb3VudCA9IDA7CisJCWlmIChkZXYtPmFjdGl2ZSAhPSAwKSB7CisJCQkvKgorCQkJICogRHJvcCBvdXIgb3BlbmluZyBjb3VudCB0byB0aGUgbnVtYmVyCisJCQkgKiBvZiBjb21tYW5kcyBjdXJyZW50bHkgb3V0c3RhbmRpbmcuCisJCQkgKi8KKwkJCWRldi0+b3BlbmluZ3MgPSAwOworLyoKKwkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKKwkJCXByaW50ZigiRHJvcHBpbmcgdGFnIGNvdW50IHRvICVkXG4iLCBkZXYtPmFjdGl2ZSk7CisgKi8KKwkJCWlmIChkZXYtPmFjdGl2ZSA9PSBkZXYtPnRhZ3Nfb25fbGFzdF9xdWV1ZWZ1bGwpIHsKKworCQkJCWRldi0+bGFzdF9xdWV1ZWZ1bGxfc2FtZV9jb3VudCsrOworCQkJCS8qCisJCQkJICogSWYgd2UgcmVwZWF0ZWRseSBzZWUgYSBxdWV1ZSBmdWxsCisJCQkJICogYXQgdGhlIHNhbWUgcXVldWUgZGVwdGgsIHRoaXMKKwkJCQkgKiBkZXZpY2UgaGFzIGEgZml4ZWQgbnVtYmVyIG9mIHRhZworCQkJCSAqIHNsb3RzLiAgTG9jayBpbiB0aGlzIHRhZyBkZXB0aAorCQkJCSAqIHNvIHdlIHN0b3Agc2VlaW5nIHF1ZXVlIGZ1bGxzIGZyb20KKwkJCQkgKiB0aGlzIGRldmljZS4KKwkJCQkgKi8KKwkJCQlpZiAoZGV2LT5sYXN0X3F1ZXVlZnVsbF9zYW1lX2NvdW50CisJCQkJID09IEFIQ19MT0NLX1RBR1NfQ09VTlQpIHsKKwkJCQkJZGV2LT5tYXh0YWdzID0gZGV2LT5hY3RpdmU7CisJCQkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKKwkJCQkJcHJpbnRmKCJMb2NraW5nIG1heCB0YWcgY291bnQgYXQgJWRcbiIsCisJCQkJCSAgICAgICBkZXYtPmFjdGl2ZSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlkZXYtPnRhZ3Nfb25fbGFzdF9xdWV1ZWZ1bGwgPSBkZXYtPmFjdGl2ZTsKKwkJCQlkZXYtPmxhc3RfcXVldWVmdWxsX3NhbWVfY291bnQgPSAwOworCQkJfQorCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fUkVRVUVVRV9SRVEpOworCQkJYWhjX3NldF9zY3NpX3N0YXR1cyhzY2IsIFNDU0lfU1RBVFVTX09LKTsKKwkJCWFoY19wbGF0Zm9ybV9zZXRfdGFncyhhaGMsICZkZXZpbmZvLAorCQkJCSAgICAgKGRldi0+ZmxhZ3MgJiBBSENfREVWX1FfQkFTSUMpCisJCQkJICAgPyBBSENfUVVFVUVfQkFTSUMgOiBBSENfUVVFVUVfVEFHR0VEKTsKKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqIERyb3AgZG93biB0byBhIHNpbmdsZSBvcGVuaW5nLCBhbmQgdHJlYXQgdGhpcworCQkgKiBhcyBpZiB0aGUgdGFyZ2V0IHJldHVybmVkIEJVU1kgU0NTSSBzdGF0dXMuCisJCSAqLworCQlkZXYtPm9wZW5pbmdzID0gMTsKKwkJYWhjX3NldF9zY3NpX3N0YXR1cyhzY2IsIFNDU0lfU1RBVFVTX0JVU1kpOworCQlhaGNfcGxhdGZvcm1fc2V0X3RhZ3MoYWhjLCAmZGV2aW5mbywKKwkJCSAgICAgKGRldi0+ZmxhZ3MgJiBBSENfREVWX1FfQkFTSUMpCisJCQkgICA/IEFIQ19RVUVVRV9CQVNJQyA6IEFIQ19RVUVVRV9UQUdHRUQpOworCQkvKiBGQUxMVEhST1VHSCAqLworCX0KKwljYXNlIFNDU0lfU1RBVFVTX0JVU1k6CisJeworCQkvKgorCQkgKiBTZXQgYSBzaG9ydCB0aW1lciB0byBkZWZlciBzZW5kaW5nIGNvbW1hbmRzIGZvcgorCQkgKiBhIGJpdCBzaW5jZSBMaW51eCB3aWxsIG5vdCBkZWxheSBpbiB0aGlzIGNhc2UuCisJCSAqLworCQlpZiAoKGRldi0+ZmxhZ3MgJiBBSENfREVWX1RJTUVSX0FDVElWRSkgIT0gMCkgeworCQkJcHJpbnRmKCIlczolYzolZDogRGV2aWNlIFRpbWVyIHN0aWxsIGFjdGl2ZSBkdXJpbmcgIgorCQkJICAgICAgICJidXN5IHByb2Nlc3NpbmdcbiIsIGFoY19uYW1lKGFoYyksCisJCQkJZGV2LT50YXJnZXQtPmNoYW5uZWwsIGRldi0+dGFyZ2V0LT50YXJnZXQpOworCQkJYnJlYWs7CisJCX0KKwkJZGV2LT5mbGFncyB8PSBBSENfREVWX1RJTUVSX0FDVElWRTsKKwkJZGV2LT5xZnJvemVuKys7CisJCWluaXRfdGltZXIoJmRldi0+dGltZXIpOworCQlkZXYtPnRpbWVyLmRhdGEgPSAodV9sb25nKWRldjsKKwkJZGV2LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIChIWi8yKTsKKwkJZGV2LT50aW1lci5mdW5jdGlvbiA9IGFoY19saW51eF9kZXZfdGltZWRfdW5mcmVlemU7CisJCWFkZF90aW1lcigmZGV2LT50aW1lcik7CisJCWJyZWFrOworCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfcXVldWVfY21kX2NvbXBsZXRlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgU2NzaV9DbW5kICpjbWQpCit7CisJLyoKKwkgKiBUeXBpY2FsbHksIHRoZSBjb21wbGV0ZSBxdWV1ZSBoYXMgdmVyeSBmZXcgZW50cmllcworCSAqIHF1ZXVlZCB0byBpdCBiZWZvcmUgdGhlIHF1ZXVlIGlzIGVtcHRpZWQgYnkKKwkgKiBhaGNfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlLCBzbyBzb3J0aW5nIHRoZSBlbnRyaWVzCisJICogYnkgZ2VuZXJhdGlvbiBudW1iZXIgc2hvdWxkIGJlIGluZXhwZW5zaXZlLgorCSAqIFdlIHBlcmZvcm0gdGhlIHNvcnQgc28gdGhhdCBjb21tYW5kcyB0aGF0IGNvbXBsZXRlCisJICogd2l0aCBhbiBlcnJvciBhcmUgcmV0dW5lZCBpbiB0aGUgb3JkZXIgb3JpZ2lvbmFsbHkKKwkgKiBxdWV1ZWQgdG8gdGhlIGNvbnRyb2xsZXIgc28gdGhhdCBhbnkgc3Vic2VxdWVudCByZXRyaWVzCisJICogYXJlIHBlcmZvcm1lZCBpbiBvcmRlci4gIFRoZSB1bmRlcmx5aW5nIGFoYyByb3V0aW5lcyBkbworCSAqIG5vdCBndWFyYW50ZWUgdGhlIG9yZGVyIHRoYXQgYWJvcnRlZCBjb21tYW5kcyB3aWxsIGJlCisJICogcmV0dXJuZWQgdG8gdXMuCisJICovCisJc3RydWN0IGFoY19jb21wbGV0ZXEgKmNvbXBsZXRlcTsKKwlzdHJ1Y3QgYWhjX2NtZCAqbGlzdF9jbWQ7CisJc3RydWN0IGFoY19jbWQgKmFjbWQ7CisKKwkvKgorCSAqIE1hcCBDQU0gZXJyb3IgY29kZXMgaW50byBMaW51eCBFcnJvciBjb2Rlcy4gIFdlCisJICogYXZvaWQgdGhlIGNvbnZlcnNpb24gc28gdGhhdCB0aGUgRFYgY29kZSBoYXMgdGhlCisJICogZnVsbCBlcnJvciBpbmZvcm1hdGlvbiBhdmFpbGFibGUgd2hlbiBtYWtpbmcKKwkgKiBzdGF0ZSBjaGFuZ2UgZGVjaXNpb25zLgorCSAqLworCWlmIChBSENfRFZfQ01EKGNtZCkgPT0gRkFMU0UpIHsKKwkJdV9pbnQgbmV3X3N0YXR1czsKKworCQlzd2l0Y2ggKGFoY19jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpKSB7CisJCWNhc2UgQ0FNX1JFUV9JTlBST0c6CisJCWNhc2UgQ0FNX1JFUV9DTVA6CisJCWNhc2UgQ0FNX1NDU0lfU1RBVFVTX0VSUk9SOgorCQkJbmV3X3N0YXR1cyA9IERJRF9PSzsKKwkJCWJyZWFrOworCQljYXNlIENBTV9SRVFfQUJPUlRFRDoKKwkJCW5ld19zdGF0dXMgPSBESURfQUJPUlQ7CisJCQlicmVhazsKKwkJY2FzZSBDQU1fQlVTWToKKwkJCW5ld19zdGF0dXMgPSBESURfQlVTX0JVU1k7CisJCQlicmVhazsKKwkJY2FzZSBDQU1fUkVRX0lOVkFMSUQ6CisJCWNhc2UgQ0FNX1BBVEhfSU5WQUxJRDoKKwkJCW5ld19zdGF0dXMgPSBESURfQkFEX1RBUkdFVDsKKwkJCWJyZWFrOworCQljYXNlIENBTV9TRUxfVElNRU9VVDoKKwkJCW5ld19zdGF0dXMgPSBESURfTk9fQ09OTkVDVDsKKwkJCWJyZWFrOworCQljYXNlIENBTV9TQ1NJX0JVU19SRVNFVDoKKwkJY2FzZSBDQU1fQkRSX1NFTlQ6CisJCQluZXdfc3RhdHVzID0gRElEX1JFU0VUOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX1VOQ09SX1BBUklUWToKKwkJCW5ld19zdGF0dXMgPSBESURfUEFSSVRZOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX0NNRF9USU1FT1VUOgorCQkJbmV3X3N0YXR1cyA9IERJRF9USU1FX09VVDsKKwkJCWJyZWFrOworCQljYXNlIENBTV9VQV9BQk9SVDoKKwkJY2FzZSBDQU1fUkVRX0NNUF9FUlI6CisJCWNhc2UgQ0FNX0FVVE9TRU5TRV9GQUlMOgorCQljYXNlIENBTV9OT19IQkE6CisJCWNhc2UgQ0FNX0RBVEFfUlVOX0VSUjoKKwkJY2FzZSBDQU1fVU5FWFBfQlVTRlJFRToKKwkJY2FzZSBDQU1fU0VRVUVOQ0VfRkFJTDoKKwkJY2FzZSBDQU1fQ0NCX0xFTl9FUlI6CisJCWNhc2UgQ0FNX1BST1ZJREVfRkFJTDoKKwkJY2FzZSBDQU1fUkVRX1RFUk1JTzoKKwkJY2FzZSBDQU1fVU5SRUNfSEJBX0VSUk9SOgorCQljYXNlIENBTV9SRVFfVE9PX0JJRzoKKwkJCW5ld19zdGF0dXMgPSBESURfRVJST1I7CisJCQlicmVhazsKKwkJY2FzZSBDQU1fUkVRVUVVRV9SRVE6CisJCQkvKgorCQkJICogSWYgd2Ugd2FudCB0aGUgcmVxdWVzdCByZXF1ZXVlZCwgbWFrZSBzdXJlIHRoZXJlCisJCQkgKiBhcmUgc3VmZmljZW50IHJldHJpZXMuICBJbiB0aGUgb2xkIHNjc2kgZXJyb3IgY29kZSwKKwkJCSAqIHdlIHVzZWQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IGEgcmVzdWx0IGNvZGUgdGhhdAorCQkJICogYnlwYXNzZWQgdGhlIHJldHJ5IGNvdW50LiAgTm93IHdlIG11c3QgdXNlIHRoaXMKKwkJCSAqIGhhY2suICBXZSBhbHNvICJmYWtlIiBhIGNoZWNrIGNvbmRpdGlvbiB3aXRoCisJCQkgKiBhIHNlbnNlIGNvZGUgb2YgQUJPUlRFRCBDT01NQU5ELiAgVGhpcyBzZWVtcyB0bworCQkJICogZXZva2UgYSByZXRyeSBldmVuIGlmIHRoaXMgY29tbWFuZCBpcyBiZWluZyBzZW50CisJCQkgKiB2aWEgdGhlIGVoIHRocmVhZC4gIEljayEgIEljayEgIEljayEKKwkJCSAqLworCQkJaWYgKGNtZC0+cmV0cmllcyA+IDApCisJCQkJY21kLT5yZXRyaWVzLS07CisJCQluZXdfc3RhdHVzID0gRElEX09LOworCQkJYWhjX2NtZF9zZXRfc2NzaV9zdGF0dXMoY21kLCBTQ1NJX1NUQVRVU19DSEVDS19DT05EKTsKKwkJCWNtZC0+cmVzdWx0IHw9IChEUklWRVJfU0VOU0UgPDwgMjQpOworCQkJbWVtc2V0KGNtZC0+c2Vuc2VfYnVmZmVyLCAwLAorCQkJICAgICAgIHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpOworCQkJY21kLT5zZW5zZV9idWZmZXJbMF0gPSBTU0RfRVJSQ09ERV9WQUxJRAorCQkJCQkgICAgIHwgU1NEX0NVUlJFTlRfRVJST1I7CisJCQljbWQtPnNlbnNlX2J1ZmZlclsyXSA9IFNTRF9LRVlfQUJPUlRFRF9DT01NQU5EOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KKwkJCW5ld19zdGF0dXMgPSBESURfRVJST1I7CisJCQlicmVhazsKKwkJfQorCisJCWFoY19jbWRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQsIG5ld19zdGF0dXMpOworCX0KKworCWNvbXBsZXRlcSA9ICZhaGMtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcTsKKwlsaXN0X2NtZCA9IFRBSUxRX0ZJUlNUKGNvbXBsZXRlcSk7CisJYWNtZCA9IChzdHJ1Y3QgYWhjX2NtZCAqKWNtZDsKKwl3aGlsZSAobGlzdF9jbWQgIT0gTlVMTAorCSAgICAmJiBhY21kX3Njc2lfY21kKGxpc3RfY21kKS5zZXJpYWxfbnVtYmVyCisJICAgICA8IGFjbWRfc2NzaV9jbWQoYWNtZCkuc2VyaWFsX251bWJlcikKKwkJbGlzdF9jbWQgPSBUQUlMUV9ORVhUKGxpc3RfY21kLCBhY21kX2xpbmtzLnRxZSk7CisJaWYgKGxpc3RfY21kICE9IE5VTEwpCisJCVRBSUxRX0lOU0VSVF9CRUZPUkUobGlzdF9jbWQsIGFjbWQsIGFjbWRfbGlua3MudHFlKTsKKwllbHNlCisJCVRBSUxRX0lOU0VSVF9UQUlMKGNvbXBsZXRlcSwgYWNtZCwgYWNtZF9saW5rcy50cWUpOworfQorCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X2ZpbHRlcl9pbnF1aXJ5KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvKQoreworCXN0cnVjdAlzY3NpX2lucXVpcnlfZGF0YSAqc2lkOworCXN0cnVjdAlhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QJYWhjX3RyYW5zaW5mbyAqdXNlcjsKKwlzdHJ1Y3QJYWhjX3RyYW5zaW5mbyAqZ29hbDsKKwlzdHJ1Y3QJYWhjX3RyYW5zaW5mbyAqY3VycjsKKwlzdHJ1Y3QJYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXN0cnVjdAlhaGNfc3luY3JhdGUgKnN5bmNyYXRlOworCXN0cnVjdAlhaGNfbGludXhfZGV2aWNlICpkZXY7CisJdV9pbnQJbWF4c3luYzsKKwl1X2ludAl3aWR0aDsKKwl1X2ludAlwZXJpb2Q7CisJdV9pbnQJb2Zmc2V0OworCXVfaW50CXBwcl9vcHRpb25zOworCXVfaW50CXRyYW5zX3ZlcnNpb247CisJdV9pbnQJcHJvdF92ZXJzaW9uOworCisJLyoKKwkgKiBEZXRlcm1pbmUgaWYgdGhpcyBsdW4gYWN0dWFsbHkgZXhpc3RzLiAgSWYgc28sCisJICogaG9sZCBvbiB0byBpdHMgY29ycmVzcG9uZGluZyBkZXZpY2Ugc3RydWN0dXJlLgorCSAqIElmIG5vdCwgbWFrZSBzdXJlIHdlIHJlbGVhc2UgdGhlIGRldmljZSBhbmQKKwkgKiBkb24ndCBib3RoZXIgcHJvY2Vzc2luZyB0aGUgcmVzdCBvZiB0aGlzIGlucXVpcnkKKwkgKiBjb21tYW5kLgorCSAqLworCWRldiA9IGFoY19saW51eF9nZXRfZGV2aWNlKGFoYywgZGV2aW5mby0+Y2hhbm5lbCAtICdBJywKKwkJCQkgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1biwKKwkJCQkgICAvKmFsbG9jKi9UUlVFKTsKKworCXNpZCA9IChzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKilkZXYtPnRhcmdldC0+aW5xX2RhdGE7CisJaWYgKFNJRF9RVUFMKHNpZCkgPT0gU0lEX1FVQUxfTFVfQ09OTkVDVEVEKSB7CisKKwkJZGV2LT5mbGFncyAmPSB+QUhDX0RFVl9VTkNPTkZJR1VSRUQ7CisJfSBlbHNlIHsKKwkJZGV2LT5mbGFncyB8PSBBSENfREVWX1VOQ09ORklHVVJFRDsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogVXBkYXRlIG91ciBub3Rpb24gb2YgdGhpcyBkZXZpY2UncyB0cmFuc2ZlcgorCSAqIG5lZ290aWF0aW9uIGNhcGFiaWxpdGllcy4KKwkgKi8KKwl0aW5mbyA9IGFoY19mZXRjaF90cmFuc2luZm8oYWhjLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCSAgICBkZXZpbmZvLT5vdXJfc2NzaWlkLAorCQkJCSAgICBkZXZpbmZvLT50YXJnZXQsICZ0c3RhdGUpOworCXVzZXIgPSAmdGluZm8tPnVzZXI7CisJZ29hbCA9ICZ0aW5mby0+Z29hbDsKKwljdXJyID0gJnRpbmZvLT5jdXJyOworCXdpZHRoID0gdXNlci0+d2lkdGg7CisJcGVyaW9kID0gdXNlci0+cGVyaW9kOworCW9mZnNldCA9IHVzZXItPm9mZnNldDsKKwlwcHJfb3B0aW9ucyA9IHVzZXItPnBwcl9vcHRpb25zOworCXRyYW5zX3ZlcnNpb24gPSB1c2VyLT50cmFuc3BvcnRfdmVyc2lvbjsKKwlwcm90X3ZlcnNpb24gPSBNSU4odXNlci0+cHJvdG9jb2xfdmVyc2lvbiwgU0lEX0FOU0lfUkVWKHNpZCkpOworCisJLyoKKwkgKiBPbmx5IGF0dGVtcHQgU1BJMy80IG9uY2Ugd2UndmUgdmVyaWZpZWQgdGhhdAorCSAqIHRoZSBkZXZpY2UgY2xhaW1zIHRvIHN1cHBvcnQgU1BJMy80IGZlYXR1cmVzLgorCSAqLworCWlmIChwcm90X3ZlcnNpb24gPCBTQ1NJX1JFVl8yKQorCQl0cmFuc192ZXJzaW9uID0gU0lEX0FOU0lfUkVWKHNpZCk7CisJZWxzZQorCQl0cmFuc192ZXJzaW9uID0gU0NTSV9SRVZfMjsKKworCWlmICgoc2lkLT5mbGFncyAmIFNJRF9XQnVzMTYpID09IDApCisJCXdpZHRoID0gTVNHX0VYVF9XRFRSX0JVU184X0JJVDsKKwlpZiAoKHNpZC0+ZmxhZ3MgJiBTSURfU3luYykgPT0gMCkgeworCQlwZXJpb2QgPSAwOworCQlvZmZzZXQgPSAwOworCQlwcHJfb3B0aW9ucyA9IDA7CisJfQorCWlmICgoc2lkLT5zcGkzZGF0YSAmIFNJRF9TUElfUUFTKSA9PSAwKQorCQlwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfUUFTX1JFUTsKKwlpZiAoKHNpZC0+c3BpM2RhdGEgJiBTSURfU1BJX0NMT0NLX0RUKSA9PSAwKQorCQlwcHJfb3B0aW9ucyAmPSBNU0dfRVhUX1BQUl9RQVNfUkVROworCWlmICgoc2lkLT5zcGkzZGF0YSAmIFNJRF9TUElfSVVTKSA9PSAwKQorCQlwcHJfb3B0aW9ucyAmPSAoTVNHX0VYVF9QUFJfRFRfUkVRCisJCQkgICAgICB8IE1TR19FWFRfUFBSX1FBU19SRVEpOworCisJaWYgKHByb3RfdmVyc2lvbiA+IFNDU0lfUkVWXzIKKwkgJiYgcHByX29wdGlvbnMgIT0gMCkKKwkJdHJhbnNfdmVyc2lvbiA9IHVzZXItPnRyYW5zcG9ydF92ZXJzaW9uOworCisJYWhjX3ZhbGlkYXRlX3dpZHRoKGFoYywgLyp0aW5mbyBsaW1pdCovTlVMTCwgJndpZHRoLCBST0xFX1VOS05PV04pOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisJCW1heHN5bmMgPSBBSENfU1lOQ1JBVEVfRFQ7CisJZWxzZSBpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEpICE9IDApCisJCW1heHN5bmMgPSBBSENfU1lOQ1JBVEVfVUxUUkE7CisJZWxzZQorCQltYXhzeW5jID0gQUhDX1NZTkNSQVRFX0ZBU1Q7CisKKwlzeW5jcmF0ZSA9IGFoY19maW5kX3N5bmNyYXRlKGFoYywgJnBlcmlvZCwgJnBwcl9vcHRpb25zLCBtYXhzeW5jKTsKKwlhaGNfdmFsaWRhdGVfb2Zmc2V0KGFoYywgLyp0aW5mbyBsaW1pdCovTlVMTCwgc3luY3JhdGUsCisJCQkgICAgJm9mZnNldCwgd2lkdGgsIFJPTEVfVU5LTk9XTik7CisJaWYgKG9mZnNldCA9PSAwIHx8IHBlcmlvZCA9PSAwKSB7CisJCXBlcmlvZCA9IDA7CisJCW9mZnNldCA9IDA7CisJCXBwcl9vcHRpb25zID0gMDsKKwl9CisJLyogQXBwbHkgb3VyIGZpbHRlcmVkIHVzZXIgc2V0dGluZ3MuICovCisJY3Vyci0+dHJhbnNwb3J0X3ZlcnNpb24gPSB0cmFuc192ZXJzaW9uOworCWN1cnItPnByb3RvY29sX3ZlcnNpb24gPSBwcm90X3ZlcnNpb247CisJYWhjX3NldF93aWR0aChhaGMsIGRldmluZm8sIHdpZHRoLCBBSENfVFJBTlNfR09BTCwgLypwYXVzZWQqL0ZBTFNFKTsKKwlhaGNfc2V0X3N5bmNyYXRlKGFoYywgZGV2aW5mbywgc3luY3JhdGUsIHBlcmlvZCwKKwkJCSBvZmZzZXQsIHBwcl9vcHRpb25zLCBBSENfVFJBTlNfR09BTCwKKwkJCSAvKnBhdXNlZCovRkFMU0UpOworfQorCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X3NlbV90aW1lb3V0KHVfbG9uZyBhcmcpCit7CisJc3RydWN0CWFoY19zb2Z0YyAqYWhjOworCXVfbG9uZwlzOworCisJYWhjID0gKHN0cnVjdCBhaGNfc29mdGMgKilhcmc7CisKKwlhaGNfbG9jayhhaGMsICZzKTsKKwlpZiAoKGFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSENfVVBfRUhfU0VNQVBIT1JFKSAhPSAwKSB7CisJCWFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJj0gfkFIQ19VUF9FSF9TRU1BUEhPUkU7CisJCXVwKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmVoX3NlbSk7CisJfQorCWFoY191bmxvY2soYWhjLCAmcyk7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfZnJlZXplX3NpbXEoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWFoYy0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbisrOworCWlmIChhaGMtPnBsYXRmb3JtX2RhdGEtPnFmcm96ZW4gPT0gMSkgeworCQlzY3NpX2Jsb2NrX3JlcXVlc3RzKGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdCk7CisKKwkJLyogWFhYIFdoYXQgYWJvdXQgVHdpbiBjaGFubmVscz8gKi8KKwkJYWhjX3BsYXRmb3JtX2Fib3J0X3NjYnMoYWhjLCBDQU1fVEFSR0VUX1dJTERDQVJELCBBTExfQ0hBTk5FTFMsCisJCQkJCUNBTV9MVU5fV0lMRENBUkQsIFNDQl9MSVNUX05VTEwsCisJCQkJCVJPTEVfSU5JVElBVE9SLCBDQU1fUkVRVUVVRV9SRVEpOworCX0KK30KKworc3RhdGljIHZvaWQKK2FoY19saW51eF9yZWxlYXNlX3NpbXEodV9sb25nIGFyZykKK3sKKwlzdHJ1Y3QgYWhjX3NvZnRjICphaGM7CisJdV9sb25nIHM7CisJaW50ICAgIHVuYmxvY2tfcmVxczsKKworCWFoYyA9IChzdHJ1Y3QgYWhjX3NvZnRjICopYXJnOworCisJdW5ibG9ja19yZXFzID0gMDsKKwlhaGNfbG9jayhhaGMsICZzKTsKKwlpZiAoYWhjLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuID4gMCkKKwkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuLS07CisJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiA9PSAwKQorCQl1bmJsb2NrX3JlcXMgPSAxOworCWlmIChBSENfRFZfU0lNUV9GUk9aRU4oYWhjKQorCSAmJiAoKGFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSENfRFZfV0FJVF9TSU1RX1JFTEVBU0UpICE9IDApKSB7CisJCWFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJj0gfkFIQ19EVl9XQUlUX1NJTVFfUkVMRUFTRTsKKwkJdXAoJmFoYy0+cGxhdGZvcm1fZGF0YS0+ZHZfc2VtKTsKKwl9CisJYWhjX3NjaGVkdWxlX3J1bnEoYWhjKTsKKwlhaGNfdW5sb2NrKGFoYywgJnMpOworCS8qCisJICogVGhlcmUgaXMgc3RpbGwgYSByYWNlIGhlcmUuICBUaGUgbWlkLWxheWVyCisJICogc2hvdWxkIGtlZXAgaXRzIG93biBmcmVlemUgY291bnQgYW5kIHVzZQorCSAqIGEgYm90dG9tIGhhbGYgaGFuZGxlciB0byBydW4gdGhlIHF1ZXVlcworCSAqIHNvIHdlIGNhbiB1bmJsb2NrIHdpdGggb3VyIG93biBsb2NrIGhlbGQuCisJICovCisJaWYgKHVuYmxvY2tfcmVxcykKKwkJc2NzaV91bmJsb2NrX3JlcXVlc3RzKGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdCk7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfZGV2X3RpbWVkX3VuZnJlZXplKHVfbG9uZyBhcmcpCit7CisJc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYWhjX3NvZnRjICphaGM7CisJdV9sb25nIHM7CisKKwlkZXYgPSAoc3RydWN0IGFoY19saW51eF9kZXZpY2UgKilhcmc7CisJYWhjID0gZGV2LT50YXJnZXQtPmFoYzsKKwlhaGNfbG9jayhhaGMsICZzKTsKKwlkZXYtPmZsYWdzICY9IH5BSENfREVWX1RJTUVSX0FDVElWRTsKKwlpZiAoZGV2LT5xZnJvemVuID4gMCkKKwkJZGV2LT5xZnJvemVuLS07CisJaWYgKGRldi0+cWZyb3plbiA9PSAwCisJICYmIChkZXYtPmZsYWdzICYgQUhDX0RFVl9PTl9SVU5fTElTVCkgPT0gMCkKKwkJYWhjX2xpbnV4X3J1bl9kZXZpY2VfcXVldWUoYWhjLCBkZXYpOworCWlmIChUQUlMUV9FTVBUWSgmZGV2LT5idXN5cSkKKwkgJiYgZGV2LT5hY3RpdmUgPT0gMCkKKwkJX19haGNfbGludXhfZnJlZV9kZXZpY2UoYWhjLCBkZXYpOworCWFoY191bmxvY2soYWhjLCAmcyk7Cit9CisKK3N0YXRpYyBpbnQKK2FoY19saW51eF9xdWV1ZV9yZWNvdmVyeV9jbWQoU2NzaV9DbW5kICpjbWQsIHNjYl9mbGFnIGZsYWcpCit7CisJc3RydWN0IGFoY19zb2Z0YyAqYWhjOworCXN0cnVjdCBhaGNfY21kICphY21kOworCXN0cnVjdCBhaGNfY21kICpsaXN0X2FjbWQ7CisJc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc2NiICpwZW5kaW5nX3NjYjsKKwl1X2xvbmcgczsKKwl1X2ludCAgc2F2ZWRfc2NicHRyOworCXVfaW50ICBhY3RpdmVfc2NiX2luZGV4OworCXVfaW50ICBsYXN0X3BoYXNlOworCXVfaW50ICBzYXZlZF9zY3NpaWQ7CisJdV9pbnQgIGNkYl9ieXRlOworCWludCAgICByZXR2YWw7CisJaW50ICAgIHdhc19wYXVzZWQ7CisJaW50ICAgIHBhdXNlZDsKKwlpbnQgICAgd2FpdDsKKwlpbnQgICAgZGlzY29ubmVjdGVkOworCisJcGVuZGluZ19zY2IgPSBOVUxMOworCXBhdXNlZCA9IEZBTFNFOworCXdhaXQgPSBGQUxTRTsKKwlhaGMgPSAqKHN0cnVjdCBhaGNfc29mdGMgKiopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWFjbWQgPSAoc3RydWN0IGFoY19jbWQgKiljbWQ7CisKKwlwcmludGYoIiVzOiVkOiVkOiVkOiBBdHRlbXB0aW5nIHRvIHF1ZXVlIGElcyBtZXNzYWdlXG4iLAorCSAgICAgICBhaGNfbmFtZShhaGMpLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwKKwkgICAgICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLAorCSAgICAgICBmbGFnID09IFNDQl9BQk9SVCA/ICJuIEFCT1JUIiA6ICIgVEFSR0VUIFJFU0VUIik7CisKKwlwcmludGYoIkNEQjoiKTsKKwlmb3IgKGNkYl9ieXRlID0gMDsgY2RiX2J5dGUgPCBjbWQtPmNtZF9sZW47IGNkYl9ieXRlKyspCisJCXByaW50ZigiIDB4JXgiLCBjbWQtPmNtbmRbY2RiX2J5dGVdKTsKKwlwcmludGYoIlxuIik7CisKKwkvKgorCSAqIEluIGFsbCB2ZXJzaW9ucyBvZiBMaW51eCwgd2UgaGF2ZSB0byB3b3JrIGFyb3VuZAorCSAqIGEgbWFqb3IgZmxhdyBpbiBob3cgdGhlIG1pZC1sYXllciBpcyBsb2NrZWQgZG93bgorCSAqIGlmIHdlIGFyZSB0byBzbGVlcCBzdWNjZXNzZnVsbHkgaW4gb3VyIGVycm9yIGhhbmRsZXIKKwkgKiB3aGlsZSBhbGxvd2luZyBvdXIgaW50ZXJydXB0IGhhbmRsZXIgdG8gcnVuLiAgU2luY2UKKwkgKiB0aGUgbWlkbGF5ZXIgYWNxdWlyZXMgZWl0aGVyIHRoZSBpb19yZXF1ZXN0X2xvY2sgb3IKKwkgKiBvdXIgbG9jayBwcmlvciB0byBjYWxsaW5nIHVzLCB3ZSBtdXN0IHVzZSB0aGUKKwkgKiBzcGluX3VubG9ja19pcnEoKSBtZXRob2QgZm9yIHVubG9ja2luZyBvdXIgbG9jay4KKwkgKiBUaGlzIHdpbGwgZm9yY2UgaW50ZXJydXB0cyB0byBiZSBlbmFibGVkIG9uIHRoZQorCSAqIGN1cnJlbnQgQ1BVLiAgU2luY2UgdGhlIEVIIHRocmVhZCBzaG91bGQgbm90IGhhdmUKKwkgKiBiZWVuIHJ1bm5pbmcgd2l0aCBDUFUgaW50ZXJydXB0cyBkaXNhYmxlZCBvdGhlciB0aGFuCisJICogYnkgYWNxdWlyaW5nIGVpdGhlciB0aGUgaW9fcmVxdWVzdF9sb2NrIG9yIG91ciBvd24KKwkgKiBsb2NrLCB0aGlzICpzaG91bGQqIGJlIHNhZmUuCisJICovCisJYWhjX21pZGxheWVyX2VudHJ5cG9pbnRfbG9jayhhaGMsICZzKTsKKworCS8qCisJICogRmlyc3QgZGV0ZXJtaW5lIGlmIHdlIGN1cnJlbnRseSBvd24gdGhpcyBjb21tYW5kLgorCSAqIFN0YXJ0IGJ5IHNlYXJjaGluZyB0aGUgZGV2aWNlIHF1ZXVlLiAgSWYgbm90IGZvdW5kCisJICogdGhlcmUsIGNoZWNrIHRoZSBwZW5kaW5nX3NjYiBsaXN0LiAgSWYgbm90IGZvdW5kCisJICogYXQgYWxsLCBhbmQgdGhlIHN5c3RlbSB3YW50ZWQgdXMgdG8ganVzdCBhYm9ydCB0aGUKKwkgKiBjb21tYW5kLCByZXR1cm4gc3VjY2Vzcy4KKwkgKi8KKwlkZXYgPSBhaGNfbGludXhfZ2V0X2RldmljZShhaGMsIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCisJCQkJICAgY21kLT5kZXZpY2UtPmx1biwgLyphbGxvYyovRkFMU0UpOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCS8qCisJCSAqIE5vIHRhcmdldCBkZXZpY2UgZm9yIHRoaXMgY29tbWFuZCBleGlzdHMsCisJCSAqIHNvIHdlIG11c3Qgbm90IHN0aWxsIG93biB0aGUgY29tbWFuZC4KKwkJICovCisJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IElzIG5vdCBhbiBhY3RpdmUgZGV2aWNlXG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4pOworCQlyZXR2YWwgPSBTVUNDRVNTOworCQlnb3RvIG5vX2NtZDsKKwl9CisKKwlUQUlMUV9GT1JFQUNIKGxpc3RfYWNtZCwgJmRldi0+YnVzeXEsIGFjbWRfbGlua3MudHFlKSB7CisJCWlmIChsaXN0X2FjbWQgPT0gYWNtZCkKKwkJCWJyZWFrOworCX0KKworCWlmIChsaXN0X2FjbWQgIT0gTlVMTCkgeworCQlwcmludGYoIiVzOiVkOiVkOiVkOiBDb21tYW5kIGZvdW5kIG9uIGRldmljZSBxdWV1ZVxuIiwKKwkJICAgICAgIGFoY19uYW1lKGFoYyksIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCisJCSAgICAgICBjbWQtPmRldmljZS0+bHVuKTsKKwkJaWYgKGZsYWcgPT0gU0NCX0FCT1JUKSB7CisJCQlUQUlMUV9SRU1PVkUoJmRldi0+YnVzeXEsIGxpc3RfYWNtZCwgYWNtZF9saW5rcy50cWUpOworCQkJY21kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCQlhaGNfbGludXhfcXVldWVfY21kX2NvbXBsZXRlKGFoYywgY21kKTsKKwkJCXJldHZhbCA9IFNVQ0NFU1M7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwlpZiAoKGRldi0+ZmxhZ3MgJiAoQUhDX0RFVl9RX0JBU0lDfEFIQ19ERVZfUV9UQUdHRUQpKSA9PSAwCisJICYmIGFoY19zZWFyY2hfdW50YWdnZWRfcXVldWVzKGFoYywgY21kLCBjbWQtPmRldmljZS0+aWQsCisJCQkJICAgICAgIGNtZC0+ZGV2aWNlLT5jaGFubmVsICsgJ0EnLAorCQkJCSAgICAgICBjbWQtPmRldmljZS0+bHVuLAorCQkJCSAgICAgICBDQU1fUkVRX0FCT1JURUQsIFNFQVJDSF9DT01QTEVURSkgIT0gMCkgeworCQlwcmludGYoIiVzOiVkOiVkOiVkOiBDb21tYW5kIGZvdW5kIG9uIHVudGFnZ2VkIHF1ZXVlXG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4pOworCQlyZXR2YWwgPSBTVUNDRVNTOworCQlnb3RvIGRvbmU7CisJfQorCisJLyoKKwkgKiBTZWUgaWYgd2UgY2FuIGZpbmQgYSBtYXRjaGluZyBjbWQgaW4gdGhlIHBlbmRpbmcgbGlzdC4KKwkgKi8KKwlMSVNUX0ZPUkVBQ0gocGVuZGluZ19zY2IsICZhaGMtPnBlbmRpbmdfc2NicywgcGVuZGluZ19saW5rcykgeworCQlpZiAocGVuZGluZ19zY2ItPmlvX2N0eCA9PSBjbWQpCisJCQlicmVhazsKKwl9CisKKwlpZiAocGVuZGluZ19zY2IgPT0gTlVMTCAmJiBmbGFnID09IFNDQl9ERVZJQ0VfUkVTRVQpIHsKKworCQkvKiBBbnkgU0NCIGZvciB0aGlzIGRldmljZSB3aWxsIGRvIGZvciBhIHRhcmdldCByZXNldCAqLworCQlMSVNUX0ZPUkVBQ0gocGVuZGluZ19zY2IsICZhaGMtPnBlbmRpbmdfc2NicywgcGVuZGluZ19saW5rcykgeworCQkgIAlpZiAoYWhjX21hdGNoX3NjYihhaGMsIHBlbmRpbmdfc2NiLCBjbWQtPmRldmljZS0+aWQsCisJCQkJCSAgY21kLT5kZXZpY2UtPmNoYW5uZWwgKyAnQScsCisJCQkJCSAgQ0FNX0xVTl9XSUxEQ0FSRCwKKwkJCQkJICBTQ0JfTElTVF9OVUxMLCBST0xFX0lOSVRJQVRPUikgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChwZW5kaW5nX3NjYiA9PSBOVUxMKSB7CisJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IENvbW1hbmQgbm90IGZvdW5kXG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4pOworCQlnb3RvIG5vX2NtZDsKKwl9CisKKwlpZiAoKHBlbmRpbmdfc2NiLT5mbGFncyAmIFNDQl9SRUNPVkVSWV9TQ0IpICE9IDApIHsKKwkJLyoKKwkJICogV2UgY2FuJ3QgcXVldWUgdHdvIHJlY292ZXJ5IGFjdGlvbnMgdXNpbmcgdGhlIHNhbWUgU0NCCisJCSAqLworCQlyZXR2YWwgPSBGQUlMRUQ7CisJCWdvdG8gIGRvbmU7CisJfQorCisJLyoKKwkgKiBFbnN1cmUgdGhhdCB0aGUgY2FyZCBkb2Vzbid0IGRvIGFueXRoaW5nCisJICogYmVoaW5kIG91ciBiYWNrIGFuZCB0aGF0IHdlIGRpZG4ndCAianVzdCIgbWlzcworCSAqIGFuIGludGVycnVwdCB0aGF0IHdvdWxkIGFmZmVjdCB0aGlzIGNtZC4KKwkgKi8KKwl3YXNfcGF1c2VkID0gYWhjX2lzX3BhdXNlZChhaGMpOworCWFoY19wYXVzZV9hbmRfZmx1c2h3b3JrKGFoYyk7CisJcGF1c2VkID0gVFJVRTsKKworCWlmICgocGVuZGluZ19zY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkgeworCQlwcmludGYoIiVzOiVkOiVkOiVkOiBDb21tYW5kIGFscmVhZHkgY29tcGxldGVkXG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4pOworCQlnb3RvIG5vX2NtZDsKKwl9CisKKwlwcmludGYoIiVzOiBBdCB0aW1lIG9mIHJlY292ZXJ5LCBjYXJkIHdhcyAlc3BhdXNlZFxuIiwKKwkgICAgICAgYWhjX25hbWUoYWhjKSwgd2FzX3BhdXNlZCA/ICIiIDogIm5vdCAiKTsKKwlhaGNfZHVtcF9jYXJkX3N0YXRlKGFoYyk7CisKKwlkaXNjb25uZWN0ZWQgPSBUUlVFOworCWlmIChmbGFnID09IFNDQl9BQk9SVCkgeworCQlpZiAoYWhjX3NlYXJjaF9xaW5maWZvKGFoYywgY21kLT5kZXZpY2UtPmlkLAorCQkJCSAgICAgICBjbWQtPmRldmljZS0+Y2hhbm5lbCArICdBJywKKwkJCQkgICAgICAgY21kLT5kZXZpY2UtPmx1biwKKwkJCQkgICAgICAgcGVuZGluZ19zY2ItPmhzY2ItPnRhZywKKwkJCQkgICAgICAgUk9MRV9JTklUSUFUT1IsIENBTV9SRVFfQUJPUlRFRCwKKwkJCQkgICAgICAgU0VBUkNIX0NPTVBMRVRFKSA+IDApIHsKKwkJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IENtZCBhYm9ydGVkIGZyb20gUUlORklGT1xuIiwKKwkJCSAgICAgICBhaGNfbmFtZShhaGMpLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwKKwkJCQkJY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKwkJCXJldHZhbCA9IFNVQ0NFU1M7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9IGVsc2UgaWYgKGFoY19zZWFyY2hfcWluZmlmbyhhaGMsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJCQkgICAgICBjbWQtPmRldmljZS0+Y2hhbm5lbCArICdBJywKKwkJCQkgICAgICBjbWQtPmRldmljZS0+bHVuLCBwZW5kaW5nX3NjYi0+aHNjYi0+dGFnLAorCQkJCSAgICAgIFJPTEVfSU5JVElBVE9SLCAvKnN0YXR1cyovMCwKKwkJCQkgICAgICBTRUFSQ0hfQ09VTlQpID4gMCkgeworCQlkaXNjb25uZWN0ZWQgPSBGQUxTRTsKKwl9CisKKwlpZiAoZGlzY29ubmVjdGVkICYmIChhaGNfaW5iKGFoYywgU0VRX0ZMQUdTKSAmIE5PVF9JREVOVElGSUVEKSA9PSAwKSB7CisJCXN0cnVjdCBzY2IgKmJ1c19zY2I7CisKKwkJYnVzX3NjYiA9IGFoY19sb29rdXBfc2NiKGFoYywgYWhjX2luYihhaGMsIFNDQl9UQUcpKTsKKwkJaWYgKGJ1c19zY2IgPT0gcGVuZGluZ19zY2IpCisJCQlkaXNjb25uZWN0ZWQgPSBGQUxTRTsKKwkJZWxzZSBpZiAoZmxhZyAhPSBTQ0JfQUJPUlQKKwkJICAgICAgJiYgYWhjX2luYihhaGMsIFNBVkVEX1NDU0lJRCkgPT0gcGVuZGluZ19zY2ItPmhzY2ItPnNjc2lpZAorCQkgICAgICAmJiBhaGNfaW5iKGFoYywgU0FWRURfTFVOKSA9PSBTQ0JfR0VUX0xVTihwZW5kaW5nX3NjYikpCisJCQlkaXNjb25uZWN0ZWQgPSBGQUxTRTsKKwl9CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQsIHBlbmRpbmdfc2NiIGlzIHRoZSBzY2IgYXNzb2NpYXRlZCB3aXRoIHRoZQorCSAqIHBhc3NlZCBpbiBjb21tYW5kLiAgVGhhdCBjb21tYW5kIGlzIGN1cnJlbnRseSBhY3RpdmUgb24gdGhlCisJICogYnVzLCBpcyBpbiB0aGUgZGlzY29ubmVjdGVkIHN0YXRlLCBvciB3ZSdyZSBob3BpbmcgdG8gZmluZAorCSAqIGEgY29tbWFuZCBmb3IgdGhlIHNhbWUgdGFyZ2V0IGFjdGl2ZSBvbiB0aGUgYnVzIHRvIGFidXNlIHRvCisJICogc2VuZCBhIEJEUi4gIFF1ZXVlIHRoZSBhcHByb3ByaWF0ZSBtZXNzYWdlIGJhc2VkIG9uIHdoaWNoIG9mCisJICogdGhlc2Ugc3RhdGVzIHdlIGFyZSBpbi4KKwkgKi8KKwlsYXN0X3BoYXNlID0gYWhjX2luYihhaGMsIExBU1RQSEFTRSk7CisJc2F2ZWRfc2NicHRyID0gYWhjX2luYihhaGMsIFNDQlBUUik7CisJYWN0aXZlX3NjYl9pbmRleCA9IGFoY19pbmIoYWhjLCBTQ0JfVEFHKTsKKwlzYXZlZF9zY3NpaWQgPSBhaGNfaW5iKGFoYywgU0FWRURfU0NTSUlEKTsKKwlpZiAobGFzdF9waGFzZSAhPSBQX0JVU0ZSRUUKKwkgJiYgKHBlbmRpbmdfc2NiLT5oc2NiLT50YWcgPT0gYWN0aXZlX3NjYl9pbmRleAorCSAgfHwgKGZsYWcgPT0gU0NCX0RFVklDRV9SRVNFVAorCSAgICYmIFNDU0lJRF9UQVJHRVQoYWhjLCBzYXZlZF9zY3NpaWQpID09IGNtZC0+ZGV2aWNlLT5pZCkpKSB7CisKKwkJLyoKKwkJICogV2UncmUgYWN0aXZlIG9uIHRoZSBidXMsIHNvIGFzc2VydCBBVE4KKwkJICogYW5kIGhvcGUgdGhhdCB0aGUgdGFyZ2V0IHJlc3BvbmRzLgorCQkgKi8KKwkJcGVuZGluZ19zY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIGFjdGl2ZV9zY2JfaW5kZXgpOworCQlwZW5kaW5nX3NjYi0+ZmxhZ3MgfD0gU0NCX1JFQ09WRVJZX1NDQnxmbGFnOworCQlhaGNfb3V0YihhaGMsIE1TR19PVVQsIEhPU1RfTVNHKTsKKwkJYWhjX291dGIoYWhjLCBTQ1NJU0lHTywgbGFzdF9waGFzZXxBVE5PKTsKKwkJcHJpbnRmKCIlczolZDolZDolZDogRGV2aWNlIGlzIGFjdGl2ZSwgYXNzZXJ0aW5nIEFUTlxuIiwKKwkJICAgICAgIGFoY19uYW1lKGFoYyksIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCisJCSAgICAgICBjbWQtPmRldmljZS0+bHVuKTsKKwkJd2FpdCA9IFRSVUU7CisJfSBlbHNlIGlmIChkaXNjb25uZWN0ZWQpIHsKKworCQkvKgorCQkgKiBBY3R1YWxseSByZS1xdWV1ZSB0aGlzIFNDQiBpbiBhbiBhdHRlbXB0CisJCSAqIHRvIHNlbGVjdCB0aGUgZGV2aWNlIGJlZm9yZSBpdCByZWNvbm5lY3RzLgorCQkgKiBJbiBlaXRoZXIgY2FzZSAoc2VsZWN0aW9uIG9yIHJlc2VsZWN0aW9uKSwKKwkJICogd2Ugd2lsbCBub3cgaXNzdWUgdGhlIGFwcHJvcHJhdGUgbWVzc2FnZQorCQkgKiB0byB0aGUgdGltZWQtb3V0IGRldmljZS4KKwkJICoKKwkJICogU2V0IHRoZSBNS19NRVNTQUdFIGNvbnRyb2wgYml0IGluZGljYXRpbmcKKwkJICogdGhhdCB3ZSBkZXNpcmUgdG8gc2VuZCBhIG1lc3NhZ2UuICBXZQorCQkgKiBhbHNvIHNldCB0aGUgZGlzY29ubmVjdGVkIGZsYWcgc2luY2UKKwkJICogaW4gdGhlIHBhZ2luZyBjYXNlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZQorCQkgKiB0aGF0IG91ciBTQ0IgY29udHJvbCBieXRlIG1hdGNoZXMgdGhlCisJCSAqIHZlcnNpb24gb24gdGhlIGNhcmQuICBXZSBkb24ndCB3YW50IHRoZQorCQkgKiBzZXF1ZW5jZXIgdG8gYWJvcnQgdGhlIGNvbW1hbmQgdGhpbmtpbmcKKwkJICogYW4gdW5zb2xpY2l0ZWQgcmVzZWxlY3Rpb24gb2NjdXJyZWQuCisJCSAqLworCQlwZW5kaW5nX3NjYi0+aHNjYi0+Y29udHJvbCB8PSBNS19NRVNTQUdFfERJU0NPTk5FQ1RFRDsKKwkJcGVuZGluZ19zY2ItPmZsYWdzIHw9IFNDQl9SRUNPVkVSWV9TQ0J8ZmxhZzsKKworCQkvKgorCQkgKiBSZW1vdmUgYW55IGNhY2hlZCBjb3B5IG9mIHRoaXMgU0NCIGluIHRoZQorCQkgKiBkaXNjb25uZWN0ZWQgbGlzdCBpbiBwcmVwYXJhdGlvbiBmb3IgdGhlCisJCSAqIHF1ZXVpbmcgb2Ygb3VyIGFib3J0IFNDQi4gIFdlIHVzZSB0aGUKKwkJICogc2FtZSBlbGVtZW50IGluIHRoZSBTQ0IsIFNDQl9ORVhULCBmb3IKKwkJICogYm90aCB0aGUgcWluZmlmbyBhbmQgdGhlIGRpc2Nvbm5lY3RlZCBsaXN0LgorCQkgKi8KKwkJYWhjX3NlYXJjaF9kaXNjX2xpc3QoYWhjLCBjbWQtPmRldmljZS0+aWQsCisJCQkJICAgICBjbWQtPmRldmljZS0+Y2hhbm5lbCArICdBJywKKwkJCQkgICAgIGNtZC0+ZGV2aWNlLT5sdW4sIHBlbmRpbmdfc2NiLT5oc2NiLT50YWcsCisJCQkJICAgICAvKnN0b3Bfb25fZmlyc3QqL1RSVUUsCisJCQkJICAgICAvKnJlbW92ZSovVFJVRSwKKwkJCQkgICAgIC8qc2F2ZV9zdGF0ZSovRkFMU0UpOworCisJCS8qCisJCSAqIEluIHRoZSBub24tcGFnaW5nIGNhc2UsIHRoZSBzZXF1ZW5jZXIgd2lsbAorCQkgKiBuZXZlciByZS1yZWZlcmVuY2UgdGhlIGluLWNvcmUgU0NCLgorCQkgKiBUbyBtYWtlIHN1cmUgd2UgYXJlIG5vdGlmaWVkIGR1cmluZworCQkgKiByZXNsZWN0aW9uLCBzZXQgdGhlIE1LX01FU1NBR0UgZmxhZyBpbgorCQkgKiB0aGUgY2FyZCdzIGNvcHkgb2YgdGhlIFNDQi4KKwkJICovCisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19QQUdFU0NCUykgPT0gMCkgeworCQkJYWhjX291dGIoYWhjLCBTQ0JQVFIsIHBlbmRpbmdfc2NiLT5oc2NiLT50YWcpOworCQkJYWhjX291dGIoYWhjLCBTQ0JfQ09OVFJPTCwKKwkJCQkgYWhjX2luYihhaGMsIFNDQl9DT05UUk9MKXxNS19NRVNTQUdFKTsKKwkJfQorCisJCS8qCisJCSAqIENsZWFyIG91dCBhbnkgZW50cmllcyBpbiB0aGUgUUlORklGTyBmaXJzdAorCQkgKiBzbyB3ZSBhcmUgdGhlIG5leHQgU0NCIGZvciB0aGlzIHRhcmdldAorCQkgKiB0byBydW4uCisJCSAqLworCQlhaGNfc2VhcmNoX3FpbmZpZm8oYWhjLCBjbWQtPmRldmljZS0+aWQsCisJCQkJICAgY21kLT5kZXZpY2UtPmNoYW5uZWwgKyAnQScsCisJCQkJICAgY21kLT5kZXZpY2UtPmx1biwgU0NCX0xJU1RfTlVMTCwKKwkJCQkgICBST0xFX0lOSVRJQVRPUiwgQ0FNX1JFUVVFVUVfUkVRLAorCQkJCSAgIFNFQVJDSF9DT01QTEVURSk7CisJCWFoY19xaW5maWZvX3JlcXVldWVfdGFpbChhaGMsIHBlbmRpbmdfc2NiKTsKKwkJYWhjX291dGIoYWhjLCBTQ0JQVFIsIHNhdmVkX3NjYnB0cik7CisJCWFoY19wcmludF9wYXRoKGFoYywgcGVuZGluZ19zY2IpOworCQlwcmludGYoIkRldmljZSBpcyBkaXNjb25uZWN0ZWQsIHJlLXF1ZXVpbmcgU0NCXG4iKTsKKwkJd2FpdCA9IFRSVUU7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIlczolZDolZDolZDogVW5hYmxlIHRvIGRlbGl2ZXIgbWVzc2FnZVxuIiwKKwkJICAgICAgIGFoY19uYW1lKGFoYyksIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCisJCSAgICAgICBjbWQtPmRldmljZS0+bHVuKTsKKwkJcmV0dmFsID0gRkFJTEVEOworCQlnb3RvIGRvbmU7CisJfQorCitub19jbWQ6CisJLyoKKwkgKiBPdXIgYXNzdW1wdGlvbiBpcyB0aGF0IGlmIHdlIGRvbid0IGhhdmUgdGhlIGNvbW1hbmQsIG5vCisJICogcmVjb3ZlcnkgYWN0aW9uIHdhcyByZXF1aXJlZCwgc28gd2UgcmV0dXJuIHN1Y2Nlc3MuICBBZ2FpbiwKKwkgKiB0aGUgc2VtYW50aWNzIG9mIHRoZSBtaWQtbGF5ZXIgcmVjb3ZlcnkgZW5naW5lIGFyZSBub3QKKwkgKiB3ZWxsIGRlZmluZWQsIHNvIHRoaXMgbWF5IGNoYW5nZSBpbiB0aW1lLgorCSAqLworCXJldHZhbCA9IFNVQ0NFU1M7Citkb25lOgorCWlmIChwYXVzZWQpCisJCWFoY191bnBhdXNlKGFoYyk7CisJaWYgKHdhaXQpIHsKKwkJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJCWludCByZXQ7CisKKwkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSENfVVBfRUhfU0VNQVBIT1JFOworCQlzcGluX3VubG9ja19pcnEoJmFoYy0+cGxhdGZvcm1fZGF0YS0+c3Bpbl9sb2NrKTsKKwkJaW5pdF90aW1lcigmdGltZXIpOworCQl0aW1lci5kYXRhID0gKHVfbG9uZylhaGM7CisJCXRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKDUgKiBIWik7CisJCXRpbWVyLmZ1bmN0aW9uID0gYWhjX2xpbnV4X3NlbV90aW1lb3V0OworCQlhZGRfdGltZXIoJnRpbWVyKTsKKwkJcHJpbnRmKCJSZWNvdmVyeSBjb2RlIHNsZWVwaW5nXG4iKTsKKwkJZG93bigmYWhjLT5wbGF0Zm9ybV9kYXRhLT5laF9zZW0pOworCQlwcmludGYoIlJlY292ZXJ5IGNvZGUgYXdha2VcbiIpOworICAgICAgICAJcmV0ID0gZGVsX3RpbWVyX3N5bmMoJnRpbWVyKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlwcmludGYoIlRpbWVyIEV4cGlyZWRcbiIpOworCQkJcmV0dmFsID0gRkFJTEVEOworCQl9CisJCXNwaW5fbG9ja19pcnEoJmFoYy0+cGxhdGZvcm1fZGF0YS0+c3Bpbl9sb2NrKTsKKwl9CisJYWhjX3NjaGVkdWxlX3J1bnEoYWhjKTsKKwlhaGNfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlKGFoYyk7CisJYWhjX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKGFoYywgJnMpOworCXJldHVybiAocmV0dmFsKTsKK30KKwordm9pZAorYWhjX3BsYXRmb3JtX2R1bXBfY2FyZF9zdGF0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldjsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgbWF4Y2hhbm5lbDsKKwlpbnQgdGFyZ2V0OworCWludCBtYXh0YXJnZXQ7CisJaW50IGx1bjsKKwlpbnQgaTsKKworCW1heGNoYW5uZWwgPSAoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSA/IDEgOiAwOworCW1heHRhcmdldCA9IChhaGMtPmZlYXR1cmVzICYgQUhDX1dJREUpID8gMTUgOiA3OworCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPD0gbWF4Y2hhbm5lbDsgY2hhbm5lbCsrKSB7CisKKwkJZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPD1tYXh0YXJnZXQ7IHRhcmdldCsrKSB7CisKKwkJCWZvciAobHVuID0gMDsgbHVuIDwgQUhDX05VTV9MVU5TOyBsdW4rKykgeworCQkJCXN0cnVjdCBhaGNfY21kICphY21kOworCisJCQkJZGV2ID0gYWhjX2xpbnV4X2dldF9kZXZpY2UoYWhjLCBjaGFubmVsLCB0YXJnZXQsCisJCQkJCQkJICAgbHVuLCAvKmFsbG9jKi9GQUxTRSk7CisJCQkJaWYgKGRldiA9PSBOVUxMKQorCQkJCQljb250aW51ZTsKKworCQkJCXByaW50ZigiRGV2USglZDolZDolZCk6ICIsCisJCQkJICAgICAgIGNoYW5uZWwsIHRhcmdldCwgbHVuKTsKKwkJCQlpID0gMDsKKwkJCQlUQUlMUV9GT1JFQUNIKGFjbWQsICZkZXYtPmJ1c3lxLAorCQkJCQkgICAgICBhY21kX2xpbmtzLnRxZSkgeworCQkJCQlpZiAoaSsrID4gQUhDX1NDQl9NQVgpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcHJpbnRmKCIlZCB3YWl0aW5nXG4iLCBpKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYWhjX2xpbnV4X2V4aXQodm9pZCk7CisKK3N0YXRpYyBpbnQgX19pbml0CithaGNfbGludXhfaW5pdCh2b2lkKQoreworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlpbnQgcmMgPSBhaGNfbGludXhfZGV0ZWN0KCZhaWM3eHh4X2RyaXZlcl90ZW1wbGF0ZSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJYWhjX2xpbnV4X2V4aXQoKTsKKwlyZXR1cm4gLUVOT0RFVjsKKyNlbHNlCisJc2NzaV9yZWdpc3Rlcl9tb2R1bGUoTU9EVUxFX1NDU0lfSEEsICZhaWM3eHh4X2RyaXZlcl90ZW1wbGF0ZSk7CisJaWYgKGFpYzd4eHhfZHJpdmVyX3RlbXBsYXRlLnByZXNlbnQgPT0gMCkgeworCQlzY3NpX3VucmVnaXN0ZXJfbW9kdWxlKE1PRFVMRV9TQ1NJX0hBLAorCQkJCSAgICAgICAmYWljN3h4eF9kcml2ZXJfdGVtcGxhdGUpOworCQlyZXR1cm4gKC1FTk9ERVYpOworCX0KKworCXJldHVybiAoMCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FoY19saW51eF9leGl0KHZvaWQpCit7CisJc3RydWN0IGFoY19zb2Z0YyAqYWhjOworCisJLyoKKwkgKiBTaHV0ZG93biBEViB0aHJlYWRzIGJlZm9yZSBnb2luZyBpbnRvIHRoZSBTQ1NJIG1pZC1sYXllci4KKwkgKiBUaGlzIGF2b2lkcyBzaXR1YXRpb25zIHdoZXJlIHRoZSBtaWQtbGF5ZXIgbG9ja3MgdGhlIGVudGlyZQorCSAqIGtlcm5lbCBzbyB0aGF0IHdhaXRpbmcgZm9yIG91ciBEViB0aHJlYWRzIHRvIGV4aXQgbGVhZHMKKwkgKiB0byBkZWFkbG9jay4KKwkgKi8KKwlUQUlMUV9GT1JFQUNIKGFoYywgJmFoY190YWlscSwgbGlua3MpIHsKKworCQlhaGNfbGludXhfa2lsbF9kdl90aHJlYWQoYWhjKTsKKwl9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkvKgorCSAqIEluIDIuNCB3ZSBoYXZlIHRvIHVucmVnaXN0ZXIgZnJvbSB0aGUgUENJIGNvcmUgX2FmdGVyXworCSAqIHVucmVnaXN0ZXJpbmcgZnJvbSB0aGUgc2NzaSBtaWRsYXllciB0byBhdm9pZCBkYW5nbGluZworCSAqIHJlZmVyZW5jZXMuCisJICovCisJc2NzaV91bnJlZ2lzdGVyX21vZHVsZShNT0RVTEVfU0NTSV9IQSwgJmFpYzd4eHhfZHJpdmVyX3RlbXBsYXRlKTsKKyNlbmRpZgorCWFoY19saW51eF9wY2lfZXhpdCgpOworCWFoY19saW51eF9laXNhX2V4aXQoKTsKK30KKworbW9kdWxlX2luaXQoYWhjX2xpbnV4X2luaXQpOworbW9kdWxlX2V4aXQoYWhjX2xpbnV4X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIzYmQ2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmgKQEAgLTAsMCArMSwxMTMwIEBACisvKgorICogQWRhcHRlYyBBSUM3eHh4IGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NCBKb2huIEF5Y29jaworICogICBUaGUgVW5pdmVyc2l0eSBvZiBDYWxnYXJ5IERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9saW51eC9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5oIzE1MSAkCisgKgorICovCisjaWZuZGVmIF9BSUM3WFhYX0xJTlVYX0hfCisjZGVmaW5lIF9BSUM3WFhYX0xJTlVYX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+IC8qIEZvciB0YXNrbGV0IHN1cHBvcnQuICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisvKiBDb3JlIFNDU0kgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQUlDX0xJQl9QUkVGSVggYWhjCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKy8qIE5hbWUgc3BhY2UgY29uZmxpY3Qgd2l0aCBCU0QgcXVldWUgbWFjcm9zICovCisjaWZkZWYgTElTVF9IRUFECisjdW5kZWYgTElTVF9IRUFECisjZW5kaWYKKworI2luY2x1ZGUgImNhbS5oIgorI2luY2x1ZGUgInF1ZXVlLmgiCisjaW5jbHVkZSAic2NzaV9tZXNzYWdlLmgiCisjaW5jbHVkZSAiYWljbGliLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZWJ1Z2dpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ09ORklHX0FJQzdYWFhfREVCVUdfRU5BQkxFCisjaWZkZWYgQ09ORklHX0FJQzdYWFhfREVCVUdfTUFTSworI2RlZmluZSBBSENfREVCVUcgMQorI2RlZmluZSBBSENfREVCVUdfT1BUUyBDT05GSUdfQUlDN1hYWF9ERUJVR19NQVNLCisjZWxzZQorLyoKKyAqIENvbXBpbGUgaW4gZGVidWdnaW5nIGNvZGUsIGJ1dCBkbyBub3QgZW5hYmxlIGFueSBwcmludGZzLgorICovCisjZGVmaW5lIEFIQ19ERUJVRyAxCisjZW5kaWYKKy8qIE5vIGRlYnVnZ2luZyBjb2RlLiAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEZvcndhcmQgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgYWhjX3NvZnRjOwordHlwZWRlZiBzdHJ1Y3QgcGNpX2RldiAqYWhjX2Rldl9zb2Z0Y190OwordHlwZWRlZiBTY3NpX0NtbmQgICAgICAqYWhjX2lvX2N0eF90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBCeXRlIE9yZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBhaGNfaHRvYmUxNih4KQljcHVfdG9fYmUxNih4KQorI2RlZmluZSBhaGNfaHRvYmUzMih4KQljcHVfdG9fYmUzMih4KQorI2RlZmluZSBhaGNfaHRvYmU2NCh4KQljcHVfdG9fYmU2NCh4KQorI2RlZmluZSBhaGNfaHRvbGUxNih4KQljcHVfdG9fbGUxNih4KQorI2RlZmluZSBhaGNfaHRvbGUzMih4KQljcHVfdG9fbGUzMih4KQorI2RlZmluZSBhaGNfaHRvbGU2NCh4KQljcHVfdG9fbGU2NCh4KQorCisjZGVmaW5lIGFoY19iZTE2dG9oKHgpCWJlMTZfdG9fY3B1KHgpCisjZGVmaW5lIGFoY19iZTMydG9oKHgpCWJlMzJfdG9fY3B1KHgpCisjZGVmaW5lIGFoY19iZTY0dG9oKHgpCWJlNjRfdG9fY3B1KHgpCisjZGVmaW5lIGFoY19sZTE2dG9oKHgpCWxlMTZfdG9fY3B1KHgpCisjZGVmaW5lIGFoY19sZTMydG9oKHgpCWxlMzJfdG9fY3B1KHgpCisjZGVmaW5lIGFoY19sZTY0dG9oKHgpCWxlNjRfdG9fY3B1KHgpCisKKyNpZm5kZWYgTElUVExFX0VORElBTgorI2RlZmluZSBMSVRUTEVfRU5ESUFOIDEyMzQKKyNlbmRpZgorCisjaWZuZGVmIEJJR19FTkRJQU4KKyNkZWZpbmUgQklHX0VORElBTiA0MzIxCisjZW5kaWYKKworI2lmbmRlZiBCWVRFX09SREVSCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisjZGVmaW5lIEJZVEVfT1JERVIgQklHX0VORElBTgorI2VuZGlmCisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisjZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTgorI2VuZGlmCisjZW5kaWYgLyogQllURV9PUkRFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBDb25maWd1cmF0aW9uIERhdGEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIHVfaW50IGFpYzd4eHhfbm9fcHJvYmU7CitleHRlcm4gdV9pbnQgYWljN3h4eF9hbGxvd19tZW1pbzsKK2V4dGVybiBpbnQgYWljN3h4eF9kZXRlY3RfY29tcGxldGU7CitleHRlcm4gU2NzaV9Ib3N0X1RlbXBsYXRlIGFpYzd4eHhfZHJpdmVyX3RlbXBsYXRlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQnVzIFNwYWNlL0RNQSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHVpbnQzMl90IGJ1c19zaXplX3Q7CisKK3R5cGVkZWYgZW51bSB7CisJQlVTX1NQQUNFX01FTUlPLAorCUJVU19TUEFDRV9QSU8KK30gYnVzX3NwYWNlX3RhZ190OworCit0eXBlZGVmIHVuaW9uIHsKKwl1X2xvbmcJCSAgaW9wb3J0OworCXZvbGF0aWxlIHVpbnQ4X3QgX19pb21lbSAqbWFkZHI7Cit9IGJ1c19zcGFjZV9oYW5kbGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgYnVzX2RtYV9zZWdtZW50Cit7CisJZG1hX2FkZHJfdAlkc19hZGRyOworCWJ1c19zaXplX3QJZHNfbGVuOworfSBidXNfZG1hX3NlZ21lbnRfdDsKKworc3RydWN0IGFoY19saW51eF9kbWFfdGFnCit7CisJYnVzX3NpemVfdAlhbGlnbm1lbnQ7CisJYnVzX3NpemVfdAlib3VuZGFyeTsKKwlidXNfc2l6ZV90CW1heHNpemU7Cit9OwordHlwZWRlZiBzdHJ1Y3QgYWhjX2xpbnV4X2RtYV90YWcqIGJ1c19kbWFfdGFnX3Q7CisKK3N0cnVjdCBhaGNfbGludXhfZG1hbWFwCit7CisJZG1hX2FkZHJfdAlidXNfYWRkcjsKK307Cit0eXBlZGVmIHN0cnVjdCBhaGNfbGludXhfZG1hbWFwKiBidXNfZG1hbWFwX3Q7CisKK3R5cGVkZWYgaW50IGJ1c19kbWFfZmlsdGVyX3Qodm9pZCosIGRtYV9hZGRyX3QpOwordHlwZWRlZiB2b2lkIGJ1c19kbWFtYXBfY2FsbGJhY2tfdCh2b2lkICosIGJ1c19kbWFfc2VnbWVudF90ICosIGludCwgaW50KTsKKworI2RlZmluZSBCVVNfRE1BX1dBSVRPSwkJMHgwCisjZGVmaW5lIEJVU19ETUFfTk9XQUlUCQkweDEKKyNkZWZpbmUgQlVTX0RNQV9BTExPQ05PVwkweDIKKyNkZWZpbmUgQlVTX0RNQV9MT0FEX1NFR1MJMHg0CS8qCisJCQkJCSAqIEFyZ3VtZW50IGlzIGFuIFMvRyBsaXN0IG5vdAorCQkJCQkgKiBhIHNpbmdsZSBidWZmZXIuCisJCQkJCSAqLworCisjZGVmaW5lIEJVU19TUEFDRV9NQVhBRERSCTB4RkZGRkZGRkYKKyNkZWZpbmUgQlVTX1NQQUNFX01BWEFERFJfMzJCSVQJMHhGRkZGRkZGRgorI2RlZmluZSBCVVNfU1BBQ0VfTUFYU0laRV8zMkJJVAkweEZGRkZGRkZGCisKK2ludAlhaGNfZG1hX3RhZ19jcmVhdGUoc3RydWN0IGFoY19zb2Z0YyAqLCBidXNfZG1hX3RhZ190IC8qcGFyZW50Ki8sCisJCQkgICBidXNfc2l6ZV90IC8qYWxpZ25tZW50Ki8sIGJ1c19zaXplX3QgLypib3VuZGFyeSovLAorCQkJICAgZG1hX2FkZHJfdCAvKmxvd2FkZHIqLywgZG1hX2FkZHJfdCAvKmhpZ2hhZGRyKi8sCisJCQkgICBidXNfZG1hX2ZpbHRlcl90Ki8qZmlsdGVyKi8sIHZvaWQgKi8qZmlsdGVyYXJnKi8sCisJCQkgICBidXNfc2l6ZV90IC8qbWF4c2l6ZSovLCBpbnQgLypuc2VnbWVudHMqLywKKwkJCSAgIGJ1c19zaXplX3QgLyptYXhzZWdzeiovLCBpbnQgLypmbGFncyovLAorCQkJICAgYnVzX2RtYV90YWdfdCAqLypkbWFfdGFncCovKTsKKwordm9pZAlhaGNfZG1hX3RhZ19kZXN0cm95KHN0cnVjdCBhaGNfc29mdGMgKiwgYnVzX2RtYV90YWdfdCAvKnRhZyovKTsKKworaW50CWFoY19kbWFtZW1fYWxsb2Moc3RydWN0IGFoY19zb2Z0YyAqLCBidXNfZG1hX3RhZ190IC8qZG1hdCovLAorCQkJIHZvaWQqKiAvKnZhZGRyKi8sIGludCAvKmZsYWdzKi8sCisJCQkgYnVzX2RtYW1hcF90KiAvKm1hcHAqLyk7CisKK3ZvaWQJYWhjX2RtYW1lbV9mcmVlKHN0cnVjdCBhaGNfc29mdGMgKiwgYnVzX2RtYV90YWdfdCAvKmRtYXQqLywKKwkJCXZvaWQqIC8qdmFkZHIqLywgYnVzX2RtYW1hcF90IC8qbWFwKi8pOworCit2b2lkCWFoY19kbWFtYXBfZGVzdHJveShzdHJ1Y3QgYWhjX3NvZnRjICosIGJ1c19kbWFfdGFnX3QgLyp0YWcqLywKKwkJCSAgIGJ1c19kbWFtYXBfdCAvKm1hcCovKTsKKworaW50CWFoY19kbWFtYXBfbG9hZChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGJ1c19kbWFfdGFnX3QgLypkbWF0Ki8sCisJCQlidXNfZG1hbWFwX3QgLyptYXAqLywgdm9pZCAqIC8qYnVmKi8sCisJCQlidXNfc2l6ZV90IC8qYnVmbGVuKi8sIGJ1c19kbWFtYXBfY2FsbGJhY2tfdCAqLAorCQkJdm9pZCAqLypjYWxsYmFja19hcmcqLywgaW50IC8qZmxhZ3MqLyk7CisKK2ludAlhaGNfZG1hbWFwX3VubG9hZChzdHJ1Y3QgYWhjX3NvZnRjICosIGJ1c19kbWFfdGFnX3QsIGJ1c19kbWFtYXBfdCk7CisKKy8qCisgKiBPcGVyYXRpb25zIHBlcmZvcm1lZCBieSBhaGNfZG1hbWFwX3N5bmMoKS4KKyAqLworI2RlZmluZSBCVVNfRE1BU1lOQ19QUkVSRUFECTB4MDEJLyogcHJlLXJlYWQgc3luY2hyb25pemF0aW9uICovCisjZGVmaW5lIEJVU19ETUFTWU5DX1BPU1RSRUFECTB4MDIJLyogcG9zdC1yZWFkIHN5bmNocm9uaXphdGlvbiAqLworI2RlZmluZSBCVVNfRE1BU1lOQ19QUkVXUklURQkweDA0CS8qIHByZS13cml0ZSBzeW5jaHJvbml6YXRpb24gKi8KKyNkZWZpbmUgQlVTX0RNQVNZTkNfUE9TVFdSSVRFCTB4MDgJLyogcG9zdC13cml0ZSBzeW5jaHJvbml6YXRpb24gKi8KKworLyoKKyAqIFhYWAorICogYWhjX2RtYW1hcF9zeW5jIGlzIG9ubHkgdXNlZCBvbiBidWZmZXJzIGFsbG9jYXRlZCB3aXRoCisgKiB0aGUgcGNpX2FsbG9jX2NvbnNpc3RlbnQoKSBBUEkuICBBbHRob3VnaCBJJ20gbm90IHN1cmUgaG93CisgKiB0aGlzIHdvcmtzIG9uIGFyY2hpdGVjdHVyZXMgd2l0aCBhIHdyaXRlIGJ1ZmZlciwgTGludXggZG9lcworICogbm90IGhhdmUgYW4gQVBJIHRvIHN5bmMgImNvaGVyZW50IiBtZW1vcnkuICBQZXJoYXBzIHdlIG5lZWQKKyAqIHRvIGRvIGFuIG1iKCk/CisgKi8KKyNkZWZpbmUgYWhjX2RtYW1hcF9zeW5jKGFoYywgZG1hX3RhZywgZG1hbWFwLCBvZmZzZXQsIGxlbiwgb3ApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBUaW1lciBEYXRhU3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0IGFoY190aW1lcl90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIENPTkZJR19BSUM3WFhYX1JFR19QUkVUVFlfUFJJTlQKKyNkZWZpbmUgQUlDX0RFQlVHX1JFR0lTVEVSUyAxCisjZWxzZQorI2RlZmluZSBBSUNfREVCVUdfUkVHSVNURVJTIDAKKyNlbmRpZgorI2luY2x1ZGUgImFpYzd4eHguaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFRpbWVyIEZhY2lsaXRpZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgYWhjX3RpbWVyX2luaXQgaW5pdF90aW1lcgorI2RlZmluZSBhaGNfdGltZXJfc3RvcCBkZWxfdGltZXJfc3luYwordHlwZWRlZiB2b2lkIGFoY19saW51eF9jYWxsYmFja190ICh1X2xvbmcpOyAgCitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfdGltZXJfcmVzZXQoYWhjX3RpbWVyX3QgKnRpbWVyLCBpbnQgdXNlYywKKwkJCQkgICAgIGFoY19jYWxsYmFja190ICpmdW5jLCB2b2lkICphcmcpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX3NjYl90aW1lcl9yZXNldChzdHJ1Y3Qgc2NiICpzY2IsIHVfaW50IHVzZWMpOworCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX3RpbWVyX3Jlc2V0KGFoY190aW1lcl90ICp0aW1lciwgaW50IHVzZWMsIGFoY19jYWxsYmFja190ICpmdW5jLCB2b2lkICphcmcpCit7CisJc3RydWN0IGFoY19zb2Z0YyAqYWhjOworCisJYWhjID0gKHN0cnVjdCBhaGNfc29mdGMgKilhcmc7CisJZGVsX3RpbWVyKHRpbWVyKTsKKwl0aW1lci0+ZGF0YSA9ICh1X2xvbmcpYXJnOworCXRpbWVyLT5leHBpcmVzID0gamlmZmllcyArICh1c2VjICogSFopLzEwMDAwMDA7CisJdGltZXItPmZ1bmN0aW9uID0gKGFoY19saW51eF9jYWxsYmFja190KilmdW5jOworCWFkZF90aW1lcih0aW1lcik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfc2NiX3RpbWVyX3Jlc2V0KHN0cnVjdCBzY2IgKnNjYiwgdV9pbnQgdXNlYykKK3sKKwltb2RfdGltZXIoJnNjYi0+aW9fY3R4LT5laF90aW1lb3V0LCBqaWZmaWVzICsgKHVzZWMgKiBIWikvMTAwMDAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTTVAgc3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApIHx8IGRlZmluZWQoU0NTSV9IQVNfSE9TVF9MT0NLKSkKKyNkZWZpbmUgQUhDX1NDU0lfSEFTX0hPU1RfTE9DSyAxCisjZWxzZQorI2RlZmluZSBBSENfU0NTSV9IQVNfSE9TVF9MT0NLIDAKKyNlbmRpZgorCisjZGVmaW5lIEFJQzdYWFhfRFJJVkVSX1ZFUlNJT04gIjYuMi4zNiIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogRnJvbnQgRW5kIFF1ZXVlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBEYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGNhc3QgdGhlIExpbnV4IHN0cnVjdCBzY3NpX2NtbmQgdG8gc29tZXRoaW5nCisgKiB0aGF0IGFsbG93cyB1cyB0byB1c2UgdGhlIHF1ZXVlIG1hY3Jvcy4gIFRoZSBsaW51eCBzdHJ1Y3R1cmUgaGFzCisgKiBwbGVudHkgb2Ygc3BhY2UgdG8gaG9sZCB0aGUgbGlua3MgZmllbGRzIGFzIHJlcXVpcmVkIGJ5IHRoZSBxdWV1ZQorICogbWFjcm9zLCBidXQgdGhlIHF1ZXVlIG1hY29ycyByZXF1aXJlIHRoZW0gdG8gaGF2ZSB0aGUgY29ycmVjdCB0eXBlLgorICovCitzdHJ1Y3QgYWhjX2NtZF9pbnRlcm5hbCB7CisJLyogQXJlYSBvd25lZCBieSB0aGUgTGludXggc2NzaSBsYXllci4gKi8KKwl1aW50OF90CXByaXZhdGVbb2Zmc2V0b2Yoc3RydWN0IHNjc2lfY21uZCwgU0NwLlN0YXR1cyldOworCXVuaW9uIHsKKwkJU1RBSUxRX0VOVFJZKGFoY19jbWQpCXN0ZTsKKwkJTElTVF9FTlRSWShhaGNfY21kKQlsZTsKKwkJVEFJTFFfRU5UUlkoYWhjX2NtZCkJdHFlOworCX0gbGlua3M7CisJdWludDMyX3QJCQllbmQ7Cit9OworCitzdHJ1Y3QgYWhjX2NtZCB7CisJdW5pb24geworCQlzdHJ1Y3QgYWhjX2NtZF9pbnRlcm5hbAlpY21kOworCQlzdHJ1Y3Qgc2NzaV9jbW5kCXNjc2lfY21kOworCX0gdW47Cit9OworCisjZGVmaW5lIGFjbWRfaWNtZChjbWQpICgoY21kKS0+dW4uaWNtZCkKKyNkZWZpbmUgYWNtZF9zY3NpX2NtZChjbWQpICgoY21kKS0+dW4uc2NzaV9jbWQpCisjZGVmaW5lIGFjbWRfbGlua3MgdW4uaWNtZC5saW5rcworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIERldmljZSBEYXRhIFN0cnVjdHVyZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEEgcGVyIHByb2JlZCBkZXZpY2Ugc3RydWN0dXJlIHVzZWQgdG8gZGVhbCB3aXRoIHNvbWUgZXJyb3IgcmVjb3ZlcnkKKyAqIHNjZW5hcmlvcyB0aGF0IHRoZSBMaW51eCBtaWQtbGF5ZXIgY29kZSBqdXN0IGRvZXNuJ3Qga25vdyBob3cgdG8KKyAqIGhhbmRsZS4gIFRoZSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGZvciBhIGRldmljZSBvbmx5IGJlY29tZXMgcGVyc2lzdGVudAorICogYWZ0ZXIgYSBzdWNjZXNzZnVsbHkgY29tcGxldGVkIGlucXVpcnkgY29tbWFuZCB0byB0aGUgdGFyZ2V0IHdoZW4KKyAqIHRoYXQgaW5xdWlyeSBkYXRhIGluZGljYXRlcyBhIGx1biBpcyBwcmVzZW50LgorICovCitUQUlMUV9IRUFEKGFoY19idXN5cSwgYWhjX2NtZCk7Cit0eXBlZGVmIGVudW0geworCUFIQ19ERVZfVU5DT05GSUdVUkVECSA9IDB4MDEsCisJQUhDX0RFVl9GUkVFWkVfVElMX0VNUFRZID0gMHgwMiwgLyogRnJlZXplIHF1ZXVlIHVudGlsIGFjdGl2ZSA9PSAwICovCisJQUhDX0RFVl9USU1FUl9BQ1RJVkUJID0gMHgwNCwgLyogT3VyIHRpbWVyIGlzIGFjdGl2ZSAqLworCUFIQ19ERVZfT05fUlVOX0xJU1QJID0gMHgwOCwgLyogUXVldWVkIHRvIGJlIHJ1biBsYXRlciAqLworCUFIQ19ERVZfUV9CQVNJQwkJID0gMHgxMCwgLyogQWxsb3cgYmFzaWMgZGV2aWNlIHF1ZXVpbmcgKi8KKwlBSENfREVWX1FfVEFHR0VECSA9IDB4MjAsIC8qIEFsbG93IGZ1bGwgU0NTSTIgY29tbWFuZCBxdWV1ZWluZyAqLworCUFIQ19ERVZfUEVSSU9ESUNfT1RBRwkgPSAweDQwLCAvKiBTZW5kIE9UQUcgdG8gcHJldmVudCBzdGFydmF0aW9uICovCisJQUhDX0RFVl9TTEFWRV9DT05GSUdVUkVEID0gMHg4MAkgLyogc2xhdmVfY29uZmlndXJlKCkgaGFzIGJlZW4gY2FsbGVkICovCit9IGFoY19saW51eF9kZXZfZmxhZ3M7CisKK3N0cnVjdCBhaGNfbGludXhfdGFyZ2V0Oworc3RydWN0IGFoY19saW51eF9kZXZpY2UgeworCVRBSUxRX0VOVFJZKGFoY19saW51eF9kZXZpY2UpIGxpbmtzOworCXN0cnVjdAkJYWhjX2J1c3lxIGJ1c3lxOworCisJLyoKKwkgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBjdXJyZW50bHkKKwkgKiBxdWV1ZWQgdG8gdGhlIGRldmljZS4KKwkgKi8KKwlpbnQJCQlhY3RpdmU7CisKKwkvKgorCSAqIFRoZSBjdXJyZW50bHkgYWxsb3dlZCBudW1iZXIgb2YgCisJICogdHJhbnNhY3Rpb25zIHRoYXQgY2FuIGJlIHF1ZXVlZCB0bworCSAqIHRoZSBkZXZpY2UuICBNdXN0IGJlIHNpZ25lZCBmb3IKKwkgKiBjb252ZXJzaW9uIGZyb20gdGFnZ2VkIHRvIHVudGFnZ2VkCisJICogbW9kZSB3aGVyZSB0aGUgZGV2aWNlIG1heSBoYXZlIG1vcmUKKwkgKiB0aGFuIG9uZSBvdXRzdGFuZGluZyBhY3RpdmUgdHJhbnNhY3Rpb24uCisJICovCisJaW50CQkJb3BlbmluZ3M7CisKKwkvKgorCSAqIEEgcG9zaXRpdmUgY291bnQgaW5kaWNhdGVzIHRoYXQgdGhpcworCSAqIGRldmljZSdzIHF1ZXVlIGlzIGhhbHRlZC4KKwkgKi8KKwl1X2ludAkJCXFmcm96ZW47CisJCisJLyoKKwkgKiBDdW11bGF0aXZlIGNvbW1hbmQgY291bnRlci4KKwkgKi8KKwl1X2xvbmcJCQljb21tYW5kc19pc3N1ZWQ7CisKKwkvKgorCSAqIFRoZSBudW1iZXIgb2YgdGFnZ2VkIHRyYW5zYWN0aW9ucyB3aGVuCisJICogcnVubmluZyBhdCBvdXIgY3VycmVudCBvcGVuaW5nIGxldmVsCisJICogdGhhdCBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGJ5CisJICogdGhpcyBkZXZpY2Ugc2luY2UgdGhlIGxhc3QgUVVFVUUgRlVMTC4KKwkgKi8KKwl1X2ludAkJCXRhZ19zdWNjZXNzX2NvdW50OworI2RlZmluZSBBSENfVEFHX1NVQ0NFU1NfSU5URVJWQUwgNTAKKworCWFoY19saW51eF9kZXZfZmxhZ3MJZmxhZ3M7CisKKwkvKgorCSAqIFBlciBkZXZpY2UgdGltZXIuCisJICovCisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisKKwkvKgorCSAqIFRoZSBoaWdoIGxpbWl0IGZvciB0aGUgdGFncyB2YXJpYWJsZS4KKwkgKi8KKwl1X2ludAkJCW1heHRhZ3M7CisKKwkvKgorCSAqIFRoZSBjb21wdXRlZCBudW1iZXIgb2YgdGFncyBvdXRzdGFuZGluZworCSAqIGF0IHRoZSB0aW1lIG9mIHRoZSBsYXN0IFFVRVVFIEZVTEwgZXZlbnQuCisJICovCisJdV9pbnQJCQl0YWdzX29uX2xhc3RfcXVldWVmdWxsOworCisJLyoKKwkgKiBIb3cgbWFueSB0aW1lcyB3ZSBoYXZlIHNlZW4gYSBxdWV1ZSBmdWxsCisJICogd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgdGFncy4gIFRoaXMgaXMgdXNlZAorCSAqIHRvIHN0b3Agb3VyIGFkYXB0aXZlIHF1ZXVlIGRlcHRoIGFsZ29yaXRobQorCSAqIG9uIGRldmljZXMgd2l0aCBhIGZpeGVkIG51bWJlciBvZiB0YWdzLgorCSAqLworCXVfaW50CQkJbGFzdF9xdWV1ZWZ1bGxfc2FtZV9jb3VudDsKKyNkZWZpbmUgQUhDX0xPQ0tfVEFHU19DT1VOVCA1MAorCisJLyoKKwkgKiBIb3cgbWFueSB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIHF1ZXVlZAorCSAqIHdpdGhvdXQgdGhlIGRldmljZSBnb2luZyBpZGxlLiAgV2UgdXNlCisJICogdGhpcyBzdGF0aXN0aWMgdG8gZGV0ZXJtaW5lIHdoZW4gdG8gaXNzdWUKKwkgKiBhbiBvcmRlcmVkIHRhZyB0byBwcmV2ZW50IHRyYW5zYWN0aW9uCisJICogc3RhcnZhdGlvbi4gIFRoaXMgc3RhdGlzdGljIGlzIG9ubHkgdXBkYXRlZAorCSAqIGlmIHRoZSBBSENfREVWX1BFUklPRElDX09UQUcgZmxhZyBpcyBzZXQKKwkgKiBvbiB0aGlzIGRldmljZS4KKwkgKi8KKwl1X2ludAkJCWNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZzsKKyNkZWZpbmUgQUhDX09UQUdfVEhSRVNICTUwMAorCisJaW50CQkJbHVuOworCVNjc2lfRGV2aWNlCSAgICAgICAqc2NzaV9kZXZpY2U7CisJc3RydWN0CQkJYWhjX2xpbnV4X3RhcmdldCAqdGFyZ2V0OworfTsKKwordHlwZWRlZiBlbnVtIHsKKwlBSENfRFZfUkVRVUlSRUQJCSA9IDB4MDEsCisJQUhDX0lOUV9WQUxJRAkJID0gMHgwMiwKKwlBSENfQkFTSUNfRFYJCSA9IDB4MDQsCisJQUhDX0VOSEFOQ0VEX0RWCQkgPSAweDA4Cit9IGFoY19saW51eF90YXJnX2ZsYWdzOworCisvKiBEViBTdGF0ZXMgKi8KK3R5cGVkZWYgZW51bSB7CisJQUhDX0RWX1NUQVRFX0VYSVQgPSAwLAorCUFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMsCisJQUhDX0RWX1NUQVRFX0lOUV9BU1lOQywKKwlBSENfRFZfU1RBVEVfSU5RX0FTWU5DX1ZFUklGWSwKKwlBSENfRFZfU1RBVEVfVFVSLAorCUFIQ19EVl9TVEFURV9SRUJELAorCUFIQ19EVl9TVEFURV9JTlFfVkVSSUZZLAorCUFIQ19EVl9TVEFURV9XRUIsCisJQUhDX0RWX1NUQVRFX1JFQiwKKwlBSENfRFZfU1RBVEVfU1UsCisJQUhDX0RWX1NUQVRFX0JVU1kKK30gYWhjX2R2X3N0YXRlOworCitzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCB7CisJc3RydWN0IGFoY19saW51eF9kZXZpY2UJICpkZXZpY2VzW0FIQ19OVU1fTFVOU107CisJaW50CQkJICBjaGFubmVsOworCWludAkJCSAgdGFyZ2V0OworCWludAkJCSAgcmVmY291bnQ7CisJc3RydWN0IGFoY190cmFuc2luZm8JICBsYXN0X3RpbmZvOworCXN0cnVjdCBhaGNfc29mdGMJICphaGM7CisJYWhjX2xpbnV4X3RhcmdfZmxhZ3MJICBmbGFnczsKKwlzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKmlucV9kYXRhOworCS8qCisJICogVGhlIG5leHQgImZhbGxiYWNrIiBwZXJpb2QgdG8gdXNlIGZvciBuYXJyb3cvd2lkZSB0cmFuc2ZlcnMuCisJICovCisJdWludDhfdAkJCSAgZHZfbmV4dF9uYXJyb3dfcGVyaW9kOworCXVpbnQ4X3QJCQkgIGR2X25leHRfd2lkZV9wZXJpb2Q7CisJdWludDhfdAkJCSAgZHZfbWF4X3dpZHRoOworCXVpbnQ4X3QJCQkgIGR2X21heF9wcHJfb3B0aW9uczsKKwl1aW50OF90CQkJICBkdl9sYXN0X3Bwcl9vcHRpb25zOworCXVfaW50CQkJICBkdl9lY2hvX3NpemU7CisJYWhjX2R2X3N0YXRlCQkgIGR2X3N0YXRlOworCXVfaW50CQkJICBkdl9zdGF0ZV9yZXRyeTsKKwljaGFyCQkJICpkdl9idWZmZXI7CisJY2hhcgkJCSAqZHZfYnVmZmVyMTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKiogRGVmaW5pdGlvbnMgUmVxdWlyZWQgYnkgdGhlIENvcmUgKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogTnVtYmVyIG9mIFNHIHNlZ21lbnRzIHdlIHJlcXVpcmUuICBTbyBsb25nIGFzIHRoZSBTL0cgc2VnbWVudHMgZm9yCisgKiBhIHBhcnRpY3VsYXIgdHJhbnNhY3Rpb24gYXJlIGFsbG9jYXRlZCBpbiBhIHBoeXNpY2FsbHkgY29udGlndW91cworICogbWFubmVyIGFuZCBhcmUgYWxsb2NhdGVkIGJlbG93IDRHQiwgdGhlIG51bWJlciBvZiBTL0cgc2VnbWVudHMgaXMKKyAqIHVucmVzdHJpY3RlZC4KKyAqLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorLyoKKyAqIFdlIGR5bmFtaWNhbGx5IGFkanVzdCB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIGluIHByZS0yLjUga2VybmVscyB0bworICogYXZvaWQgZnJhZ21lbnRhdGlvbiBpc3N1ZXMgaW4gdGhlIFNDU0kgbWlkLWxheWVyJ3MgcHJpdmF0ZSBtZW1vcnkKKyAqIGFsbG9jYXRvci4gIFNlZSBhaWM3eHh4X29zbS5jIGFoY19saW51eF9zaXplX25zZWcoKSBmb3IgZGV0YWlscy4KKyAqLworZXh0ZXJuIHVfaW50IGFoY19saW51eF9uc2VnOworI2RlZmluZQlBSENfTlNFRyBhaGNfbGludXhfbnNlZworI2RlZmluZQlBSENfTElOVVhfTUlOX05TRUcgNjQKKyNlbHNlCisjZGVmaW5lCUFIQ19OU0VHIDEyOAorI2VuZGlmCisKKy8qCisgKiBQZXItU0NCIE9TTSBzdG9yYWdlLgorICovCit0eXBlZGVmIGVudW0geworCUFIQ19VUF9FSF9TRU1BUEhPUkUgPSAweDEKK30gYWhjX2xpbnV4X3NjYl9mbGFnczsKKworc3RydWN0IHNjYl9wbGF0Zm9ybV9kYXRhIHsKKwlzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZQkqZGV2OworCWRtYV9hZGRyX3QJCSBidWZfYnVzYWRkcjsKKwl1aW50MzJfdAkJIHhmZXJfbGVuOworCXVpbnQzMl90CQkgc2Vuc2VfcmVzaWQ7CS8qIEF1dG8tU2Vuc2UgcmVzaWR1YWwgKi8KKwlhaGNfbGludXhfc2NiX2ZsYWdzCSBmbGFnczsKK307CisKKy8qCisgKiBEZWZpbmUgYSBzdHJ1Y3R1cmUgdXNlZCBmb3IgZWFjaCBob3N0IGFkYXB0ZXIuICBBbGwgbWVtYmVycyBhcmUKKyAqIGFsaWduZWQgb24gYSBib3VuZGFyeSA+PSB0aGUgc2l6ZSBvZiB0aGUgbWVtYmVyIHRvIGhvbm9yIHRoZQorICogYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBvZiB0aGUgdmFyaW91cyBwbGF0Zm9ybXMgc3VwcG9ydGVkIGJ5CisgKiB0aGlzIGRyaXZlci4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlBSENfRFZfV0FJVF9TSU1RX0VNUFRZCSA9IDB4MDEsCisJQUhDX0RWX1dBSVRfU0lNUV9SRUxFQVNFID0gMHgwMiwKKwlBSENfRFZfQUNUSVZFCQkgPSAweDA0LAorCUFIQ19EVl9TSFVURE9XTgkJID0gMHgwOCwKKwlBSENfUlVOX0NNUExUX1FfVElNRVIJID0gMHgxMAorfSBhaGNfbGludXhfc29mdGNfZmxhZ3M7CisKK1RBSUxRX0hFQUQoYWhjX2NvbXBsZXRlcSwgYWhjX2NtZCk7CisKK3N0cnVjdCBhaGNfcGxhdGZvcm1fZGF0YSB7CisJLyoKKwkgKiBGaWVsZHMgYWNjZXNzZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KKwkgKi8KKwlzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZ2V0c1tBSENfTlVNX1RBUkdFVFNdOyAKKwlUQUlMUV9IRUFEKCwgYWhjX2xpbnV4X2RldmljZSkgZGV2aWNlX3J1bnE7CisJc3RydWN0IGFoY19jb21wbGV0ZXEJIGNvbXBsZXRlcTsKKworCXNwaW5sb2NrX3QJCSBzcGluX2xvY2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0CSBydW5xX3Rhc2tsZXQ7CisJdV9pbnQJCQkgcWZyb3plbjsKKwlwaWRfdAkJCSBkdl9waWQ7CisJc3RydWN0IHRpbWVyX2xpc3QJIGNvbXBsZXRlcV90aW1lcjsKKwlzdHJ1Y3QgdGltZXJfbGlzdAkgcmVzZXRfdGltZXI7CisJc3RydWN0IHNlbWFwaG9yZQkgZWhfc2VtOworCXN0cnVjdCBzZW1hcGhvcmUJIGR2X3NlbTsKKwlzdHJ1Y3Qgc2VtYXBob3JlCSBkdl9jbWRfc2VtOwkvKiBYWFggVGhpcyBuZWVkcyB0byBiZSBpbgorCQkJCQkJICogdGhlIHRhcmdldCBzdHJ1Y3QKKwkJCQkJCSAqLworCXN0cnVjdCBzY3NpX2RldmljZQkqZHZfc2NzaV9kZXY7CisJc3RydWN0IFNjc2lfSG9zdCAgICAgICAgKmhvc3Q7CQkvKiBwb2ludGVyIHRvIHNjc2kgaG9zdCAqLworI2RlZmluZSBBSENfTElOVVhfTk9JUlEJKCh1aW50MzJfdCl+MCkKKwl1aW50MzJfdAkJIGlycTsJCS8qIElSUSBmb3IgdGhpcyBhZGFwdGVyICovCisJdWludDMyX3QJCSBiaW9zX2FkZHJlc3M7CisJdWludDMyX3QJCSBtZW1fYnVzYWRkcjsJLyogTWVtIEJhc2UgQWRkciAqLworCXVpbnQ2NF90CQkgaHdfZG1hX21hc2s7CisJYWhjX2xpbnV4X3NvZnRjX2ZsYWdzCSBmbGFnczsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBPUyBVdGlsaXR5IFdyYXBwZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIHByaW50ZiBwcmludGsKKyNkZWZpbmUgTV9OT1dBSVQgR0ZQX0FUT01JQworI2RlZmluZSBNX1dBSVRPSyAwCisjZGVmaW5lIG1hbGxvYyhzaXplLCB0eXBlLCBmbGFncykga21hbGxvYyhzaXplLCBmbGFncykKKyNkZWZpbmUgZnJlZShwdHIsIHR5cGUpIGtmcmVlKHB0cikKKworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX2RlbGF5KGxvbmcpOworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoY19kZWxheShsb25nIHVzZWMpCit7CisJLyoKKwkgKiB1ZGVsYXkgb24gTGludXggY2FuIGhhdmUgcHJvYmxlbXMgZm9yCisJICogbXVsdGktbWlsbGlzZWNvbmQgd2FpdHMuICBXYWl0IGF0IG1vc3QKKwkgKiAxMDI0dXMgcGVyIGNhbGwuCisJICovCisJd2hpbGUgKHVzZWMgPiAwKSB7CisJCXVkZWxheSh1c2VjICUgMTAyNCk7CisJCXVzZWMgLT0gMTAyNDsKKwl9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIExvdyBMZXZlbCBJL08gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSB1aW50OF90IGFoY19pbmIoc3RydWN0IGFoY19zb2Z0YyAqIGFoYywgbG9uZyBwb3J0KTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19vdXRiKHN0cnVjdCBhaGNfc29mdGMgKiBhaGMsIGxvbmcgcG9ydCwgdWludDhfdCB2YWwpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX291dHNiKHN0cnVjdCBhaGNfc29mdGMgKiBhaGMsIGxvbmcgcG9ydCwKKwkJCSAgICAgICB1aW50OF90ICosIGludCBjb3VudCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfaW5zYihzdHJ1Y3QgYWhjX3NvZnRjICogYWhjLCBsb25nIHBvcnQsCisJCQkgICAgICAgdWludDhfdCAqLCBpbnQgY291bnQpOworCitzdGF0aWMgX19pbmxpbmUgdWludDhfdAorYWhjX2luYihzdHJ1Y3QgYWhjX3NvZnRjICogYWhjLCBsb25nIHBvcnQpCit7CisJdWludDhfdCB4OworCisJaWYgKGFoYy0+dGFnID09IEJVU19TUEFDRV9NRU1JTykgeworCQl4ID0gcmVhZGIoYWhjLT5ic2gubWFkZHIgKyBwb3J0KTsKKwl9IGVsc2UgeworCQl4ID0gaW5iKGFoYy0+YnNoLmlvcG9ydCArIHBvcnQpOworCX0KKwltYigpOworCXJldHVybiAoeCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfb3V0YihzdHJ1Y3QgYWhjX3NvZnRjICogYWhjLCBsb25nIHBvcnQsIHVpbnQ4X3QgdmFsKQoreworCWlmIChhaGMtPnRhZyA9PSBCVVNfU1BBQ0VfTUVNSU8pIHsKKwkJd3JpdGViKHZhbCwgYWhjLT5ic2gubWFkZHIgKyBwb3J0KTsKKwl9IGVsc2UgeworCQlvdXRiKHZhbCwgYWhjLT5ic2guaW9wb3J0ICsgcG9ydCk7CisJfQorCW1iKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfb3V0c2Ioc3RydWN0IGFoY19zb2Z0YyAqIGFoYywgbG9uZyBwb3J0LCB1aW50OF90ICphcnJheSwgaW50IGNvdW50KQoreworCWludCBpOworCisJLyoKKwkgKiBUaGVyZSBpcyBwcm9iYWJseSBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyB0aGlzIG9uIExpbnV4CisJICogYnV0IHdlIGRvbid0IHVzZSB0aGlzIGZvciBhbnl0aGluZyBzcGVlZCBjcml0aWNhbCBhbmQgdGhpcworCSAqIHNob3VsZCB3b3JrLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlhaGNfb3V0YihhaGMsIHBvcnQsICphcnJheSsrKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoY19pbnNiKHN0cnVjdCBhaGNfc29mdGMgKiBhaGMsIGxvbmcgcG9ydCwgdWludDhfdCAqYXJyYXksIGludCBjb3VudCkKK3sKKwlpbnQgaTsKKworCS8qCisJICogVGhlcmUgaXMgcHJvYmFibHkgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gdGhpcyBvbiBMaW51eAorCSAqIGJ1dCB3ZSBkb24ndCB1c2UgdGhpcyBmb3IgYW55dGhpbmcgc3BlZWQgY3JpdGljYWwgYW5kIHRoaXMKKwkgKiBzaG91bGQgd29yay4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJKmFycmF5KysgPSBhaGNfaW5iKGFoYywgcG9ydCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXRpYWxpemF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQJCWFoY19saW51eF9yZWdpc3Rlcl9ob3N0KHN0cnVjdCBhaGNfc29mdGMgKiwKKwkJCQkJU2NzaV9Ib3N0X1RlbXBsYXRlICopOworCit1aW50NjRfdAlhaGNfbGludXhfZ2V0X21lbXNpemUodm9pZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogUHJldHR5IFByaW50aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgaW5mb19zdHIgeworCWNoYXIgKmJ1ZmZlcjsKKwlpbnQgbGVuZ3RoOworCW9mZl90IG9mZnNldDsKKwlpbnQgcG9zOworfTsKKwordm9pZAlhaGNfZm9ybWF0X3RyYW5zaW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sCisJCQkgICAgIHN0cnVjdCBhaGNfdHJhbnNpbmZvICp0aW5mbyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBMb2NraW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBMb2NrIHByb3RlY3RpbmcgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfbG9ja2luaXQoc3RydWN0IGFoY19zb2Z0YyAqKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19sb2NrKHN0cnVjdCBhaGNfc29mdGMgKiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX3VubG9jayhzdHJ1Y3QgYWhjX3NvZnRjICosIHVuc2lnbmVkIGxvbmcgKmZsYWdzKTsKKworLyogTG9jayBhY3F1aXNpdGlvbiBhbmQgcmVsZWFzZSBvZiB0aGUgYWJvdmUgbG9jayBpbiBtaWRsYXllciBlbnRyeSBwb2ludHMuICovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKHN0cnVjdCBhaGNfc29mdGMgKiwKKwkJCQkJCSAgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKHN0cnVjdCBhaGNfc29mdGMgKiwKKwkJCQkJCSAgICB1bnNpZ25lZCBsb25nICpmbGFncyk7CisKKy8qIExvY2sgaGVsZCBkdXJpbmcgY29tbWFuZCBjb21wZWxldGlvbiB0byB0aGUgdXBwZXIgbGF5ZXIgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19kb25lX2xvY2tpbml0KHN0cnVjdCBhaGNfc29mdGMgKik7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfZG9uZV9sb2NrKHN0cnVjdCBhaGNfc29mdGMgKiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX2RvbmVfdW5sb2NrKHN0cnVjdCBhaGNfc29mdGMgKiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOworCisvKiBMb2NrIGhlbGQgZHVyaW5nIGFoY19saXN0IG1hbmlwdWxhdGlvbiBhbmQgYWhjIHNvZnRjIGZyZWVzICovCitleHRlcm4gc3BpbmxvY2tfdCBhaGNfbGlzdF9zcGlubG9jazsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19saXN0X2xvY2tpbml0KHZvaWQpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX2xpc3RfbG9jayh1bnNpZ25lZCBsb25nICpmbGFncyk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfbGlzdF91bmxvY2sodW5zaWduZWQgbG9uZyAqZmxhZ3MpOworCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX2xvY2tpbml0KHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlzcGluX2xvY2tfaW5pdCgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2spOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX2xvY2soc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1bnNpZ25lZCBsb25nICpmbGFncykKK3sKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2ssICpmbGFncyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfdW5sb2NrKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2ssICpmbGFncyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJLyoKKwkgKiBJbiAyLjUuWCBhbmQgc29tZSAyLjQuWCB2ZXJzaW9ucywgdGhlIG1pZGxheWVyIHRha2VzIG91cgorCSAqIGxvY2sganVzdCBiZWZvcmUgY2FsbGluZyB1cywgc28gd2UgYXZvaWQgbG9ja2luZyBhZ2Fpbi4KKwkgKiBGb3Igb3RoZXIga2VybmVsIHZlcnNpb25zLCB0aGUgaW9fcmVxdWVzdF9sb2NrIGlzIHRha2VuCisJICoganVzdCBiZWZvcmUgb3VyIGVudHJ5IHBvaW50IGlzIGNhbGxlZC4gIEluIHRoaXMgY2FzZSwgd2UKKwkgKiB0cmFkZSB0aGUgaW9fcmVxdWVzdF9sb2NrIGZvciBvdXIgcGVyLXNvZnRjIGxvY2suCisJICovCisjaWYgQUhDX1NDU0lfSEFTX0hPU1RfTE9DSyA9PSAwCisJc3Bpbl91bmxvY2soJmlvX3JlcXVlc3RfbG9jayk7CisJc3Bpbl9sb2NrKCZhaGMtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jayk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoY19taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworI2lmIEFIQ19TQ1NJX0hBU19IT1NUX0xPQ0sgPT0gMAorCXNwaW5fdW5sb2NrKCZhaGMtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jayk7CisJc3Bpbl9sb2NrKCZpb19yZXF1ZXN0X2xvY2spOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfZG9uZV9sb2NraW5pdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJLyoKKwkgKiBJbiAyLjUuWCwgb3VyIG93biBsb2NrIGlzIGhlbGQgZHVyaW5nIGNvbXBsZXRpb25zLgorCSAqIEluIHByZXZpb3VzIHZlcnNpb25zLCB0aGUgaW9fcmVxdWVzdF9sb2NrIGlzIHVzZWQuCisJICogSW4gZWl0aGVyIGNhc2UsIHdlIGNhbid0IGluaXRpYWxpemUgdGhpcyBsb2NrIGFnYWluLgorCSAqLworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX2RvbmVfbG9jayhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworI2lmIEFIQ19TQ1NJX0hBU19IT1NUX0xPQ0sgPT0gMAorCXNwaW5fbG9ja19pcnFzYXZlKCZpb19yZXF1ZXN0X2xvY2ssICpmbGFncyk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoY19kb25lX3VubG9jayhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworI2lmIEFIQ19TQ1NJX0hBU19IT1NUX0xPQ0sgPT0gMAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvX3JlcXVlc3RfbG9jaywgKmZsYWdzKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX2xpc3RfbG9ja2luaXQodm9pZCkKK3sKKwlzcGluX2xvY2tfaW5pdCgmYWhjX2xpc3Rfc3BpbmxvY2spOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX2xpc3RfbG9jayh1bnNpZ25lZCBsb25nICpmbGFncykKK3sKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWhjX2xpc3Rfc3BpbmxvY2ssICpmbGFncyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfbGlzdF91bmxvY2sodW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhjX2xpc3Rfc3BpbmxvY2ssICpmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDSSBEZWZpbml0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogUENJTV94eHg6IG1hc2sgdG8gbG9jYXRlIHN1YmZpZWxkIGluIHJlZ2lzdGVyCisgKiBQQ0lSX3h4eDogY29uZmlnIHJlZ2lzdGVyIG9mZnNldAorICogUENJQ194eHg6IGRldmljZSBjbGFzcworICogUENJU194eHg6IGRldmljZSBzdWJjbGFzcworICogUENJUF94eHg6IGRldmljZSBwcm9ncmFtbWluZyBpbnRlcmZhY2UKKyAqIFBDSVZfeHh4OiBQQ0kgdmVuZG9yIElEIChvbmx5IHJlcXVpcmVkIHRvIGZpeHVwIGFuY2llbnQgZGV2aWNlcykKKyAqIFBDSURfeHh4OiBkZXZpY2UgSUQKKyAqLworI2RlZmluZSBQQ0lSX0RFVlZFTkRPUgkJMHgwMAorI2RlZmluZSBQQ0lSX1ZFTkRPUgkJMHgwMAorI2RlZmluZSBQQ0lSX0RFVklDRQkJMHgwMgorI2RlZmluZSBQQ0lSX0NPTU1BTkQJCTB4MDQKKyNkZWZpbmUgUENJTV9DTURfUE9SVEVOCQkweDAwMDEKKyNkZWZpbmUgUENJTV9DTURfTUVNRU4JCTB4MDAwMgorI2RlZmluZSBQQ0lNX0NNRF9CVVNNQVNURVJFTgkweDAwMDQKKyNkZWZpbmUgUENJTV9DTURfTVdSSUNFTgkweDAwMTAKKyNkZWZpbmUgUENJTV9DTURfUEVSUkVTUEVOCTB4MDA0MAorI2RlZmluZQlQQ0lNX0NNRF9TRVJSRVNQRU4JMHgwMTAwCisjZGVmaW5lIFBDSVJfU1RBVFVTCQkweDA2CisjZGVmaW5lIFBDSVJfUkVWSUQJCTB4MDgKKyNkZWZpbmUgUENJUl9QUk9HSUYJCTB4MDkKKyNkZWZpbmUgUENJUl9TVUJDTEFTUwkJMHgwYQorI2RlZmluZSBQQ0lSX0NMQVNTCQkweDBiCisjZGVmaW5lIFBDSVJfQ0FDSEVMTlNaCQkweDBjCisjZGVmaW5lIFBDSVJfTEFUVElNRVIJCTB4MGQKKyNkZWZpbmUgUENJUl9IRUFERVJUWVBFCQkweDBlCisjZGVmaW5lIFBDSU1fTUZERVYJCTB4ODAKKyNkZWZpbmUgUENJUl9CSVNUCQkweDBmCisjZGVmaW5lIFBDSVJfQ0FQX1BUUgkJMHgzNAorCisvKiBjb25maWcgcmVnaXN0ZXJzIGZvciBoZWFkZXIgdHlwZSAwIGRldmljZXMgKi8KKyNkZWZpbmUgUENJUl9NQVBTCTB4MTAKKyNkZWZpbmUgUENJUl9TVUJWRU5EXzAJMHgyYworI2RlZmluZSBQQ0lSX1NVQkRFVl8wCTB4MmUKKworZXh0ZXJuIHN0cnVjdCBwY2lfZHJpdmVyIGFpYzd4eHhfcGNpX2RyaXZlcjsKKwordHlwZWRlZiBlbnVtCit7CisJQUhDX1BPV0VSX1NUQVRFX0QwLAorCUFIQ19QT1dFUl9TVEFURV9EMSwKKwlBSENfUE9XRVJfU1RBVEVfRDIsCisJQUhDX1BPV0VSX1NUQVRFX0QzCit9IGFoY19wb3dlcl9zdGF0ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogVkwvRUlTQSBSb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApIFwKKyAgJiYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19hbHBoYV9fKSkgXAorICAmJiAoIWRlZmluZWQoQ09ORklHX0VJU0EpKSkKKyNkZWZpbmUgQ09ORklHX0VJU0EKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0VJU0EKK2V4dGVybiB1aW50MzJfdCBhaWM3eHh4X3Byb2JlX2Vpc2Ffdmw7CitpbnQJCQkgYWhjX2xpbnV4X2Vpc2FfaW5pdCh2b2lkKTsKK3ZvaWQJCQkgYWhjX2xpbnV4X2Vpc2FfZXhpdCh2b2lkKTsKK2ludAkJCSBhaWM3NzcwX21hcF9yZWdpc3RlcnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkgICAgICAgdV9pbnQgcG9ydCk7CitpbnQJCQkgYWljNzc3MF9tYXBfaW50KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgaXJxKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludAlhaGNfbGludXhfZWlzYV9pbml0KHZvaWQpIHsKKwlyZXR1cm4gLUVOT0RFVjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZAlhaGNfbGludXhfZWlzYV9leGl0KHZvaWQpIHsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQQ0kgUm91dGluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIENPTkZJR19QQ0kKK2ludAkJCSBhaGNfbGludXhfcGNpX2luaXQodm9pZCk7Cit2b2lkCQkJIGFoY19saW51eF9wY2lfZXhpdCh2b2lkKTsKK2ludAkJCSBhaGNfcGNpX21hcF9yZWdpc3RlcnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK2ludAkJCSBhaGNfcGNpX21hcF9pbnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKKworc3RhdGljIF9faW5saW5lIHVpbnQzMl90IGFoY19wY2lfcmVhZF9jb25maWcoYWhjX2Rldl9zb2Z0Y190IHBjaSwKKwkJCQkJICAgICBpbnQgcmVnLCBpbnQgd2lkdGgpOworCitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKK2FoY19wY2lfcmVhZF9jb25maWcoYWhjX2Rldl9zb2Z0Y190IHBjaSwgaW50IHJlZywgaW50IHdpZHRoKQoreworCXN3aXRjaCAod2lkdGgpIHsKKwljYXNlIDE6CisJeworCQl1aW50OF90IHJldHZhbDsKKworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2ksIHJlZywgJnJldHZhbCk7CisJCXJldHVybiAocmV0dmFsKTsKKwl9CisJY2FzZSAyOgorCXsKKwkJdWludDE2X3QgcmV0dmFsOworCQlwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIHJlZywgJnJldHZhbCk7CisJCXJldHVybiAocmV0dmFsKTsKKwl9CisJY2FzZSA0OgorCXsKKwkJdWludDMyX3QgcmV0dmFsOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpLCByZWcsICZyZXR2YWwpOworCQlyZXR1cm4gKHJldHZhbCk7CisJfQorCWRlZmF1bHQ6CisJCXBhbmljKCJhaGNfcGNpX3JlYWRfY29uZmlnOiBSZWFkIHNpemUgdG9vIGJpZyIpOworCQkvKiBOT1RSRUFDSEVEICovCisJCXJldHVybiAoMCk7CisJfQorfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfcGNpX3dyaXRlX2NvbmZpZyhhaGNfZGV2X3NvZnRjX3QgcGNpLAorCQkJCQkgIGludCByZWcsIHVpbnQzMl90IHZhbHVlLAorCQkJCQkgIGludCB3aWR0aCk7CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfcGNpX3dyaXRlX2NvbmZpZyhhaGNfZGV2X3NvZnRjX3QgcGNpLCBpbnQgcmVnLCB1aW50MzJfdCB2YWx1ZSwgaW50IHdpZHRoKQoreworCXN3aXRjaCAod2lkdGgpIHsKKwljYXNlIDE6CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2ksIHJlZywgdmFsdWUpOworCQlicmVhazsKKwljYXNlIDI6CisJCXBjaV93cml0ZV9jb25maWdfd29yZChwY2ksIHJlZywgdmFsdWUpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpLCByZWcsIHZhbHVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGFuaWMoImFoY19wY2lfd3JpdGVfY29uZmlnOiBXcml0ZSBzaXplIHRvbyBiaWciKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KK30KKworc3RhdGljIF9faW5saW5lIGludCBhaGNfZ2V0X3BjaV9mdW5jdGlvbihhaGNfZGV2X3NvZnRjX3QpOworc3RhdGljIF9faW5saW5lIGludAorYWhjX2dldF9wY2lfZnVuY3Rpb24oYWhjX2Rldl9zb2Z0Y190IHBjaSkKK3sKKwlyZXR1cm4gKFBDSV9GVU5DKHBjaS0+ZGV2Zm4pKTsKK30KKworc3RhdGljIF9faW5saW5lIGludCBhaGNfZ2V0X3BjaV9zbG90KGFoY19kZXZfc29mdGNfdCk7CitzdGF0aWMgX19pbmxpbmUgaW50CithaGNfZ2V0X3BjaV9zbG90KGFoY19kZXZfc29mdGNfdCBwY2kpCit7CisJcmV0dXJuIChQQ0lfU0xPVChwY2ktPmRldmZuKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQgYWhjX2dldF9wY2lfYnVzKGFoY19kZXZfc29mdGNfdCk7CitzdGF0aWMgX19pbmxpbmUgaW50CithaGNfZ2V0X3BjaV9idXMoYWhjX2Rldl9zb2Z0Y190IHBjaSkKK3sKKwlyZXR1cm4gKHBjaS0+YnVzLT5udW1iZXIpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGFoY19saW51eF9wY2lfaW5pdCh2b2lkKSB7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYWhjX2xpbnV4X3BjaV9leGl0KHZvaWQpIHsKK30KKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhzdHJ1Y3QgYWhjX3NvZnRjICopOworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoY19mbHVzaF9kZXZpY2Vfd3JpdGVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwkvKiBYWFggSXMgdGhpcyBzdWZmaWNpZW50IGZvciBhbGwgYXJjaGl0ZWN0dXJlcz8/PyAqLworCWFoY19pbmIoYWhjLCBJTlRTVEFUKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogUHJvYyBGUyBTdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKK2ludAlhaGNfbGludXhfcHJvY19pbmZvKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50LCBpbnQpOworI2Vsc2UKK2ludAlhaGNfbGludXhfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKiwgY2hhciAqLCBjaGFyICoqLAorCQkJICAgIG9mZl90LCBpbnQsIGludCk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBEb21haW4gVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQUhDX0RWX0NNRChjbWQpICgoY21kKS0+c2NzaV9kb25lID09IGFoY19saW51eF9kdl9jb21wbGV0ZSkKKyNkZWZpbmUgQUhDX0RWX1NJTVFfRlJPWkVOKGFoYykJCQkJCVwKKwkoKCgoYWhjKS0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSENfRFZfQUNUSVZFKSAhPSAwKQlcCisJICYmIChhaGMpLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuID09IDEpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBUcmFuc2FjdGlvbiBBY2Nlc3MgV3JhcHBlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19jbWRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhTY3NpX0NtbmQgKiwgdWludDMyX3QpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc3RydWN0IHNjYiAqLCB1aW50MzJfdCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfY21kX3NldF9zY3NpX3N0YXR1cyhTY3NpX0NtbmQgKiwgdWludDMyX3QpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX3NldF9zY3NpX3N0YXR1cyhzdHJ1Y3Qgc2NiICosIHVpbnQzMl90KTsKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdCBhaGNfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoU2NzaV9DbW5kICpjbWQpOworc3RhdGljIF9faW5saW5lIHVpbnQzMl90IGFoY19nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHN0cnVjdCBzY2IgKik7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QgYWhjX2NtZF9nZXRfc2NzaV9zdGF0dXMoU2NzaV9DbW5kICpjbWQpOworc3RhdGljIF9faW5saW5lIHVpbnQzMl90IGFoY19nZXRfc2NzaV9zdGF0dXMoc3RydWN0IHNjYiAqKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19zZXRfdHJhbnNhY3Rpb25fdGFnKHN0cnVjdCBzY2IgKiwgaW50LCB1X2ludCk7CitzdGF0aWMgX19pbmxpbmUgdV9sb25nIGFoY19nZXRfdHJhbnNmZXJfbGVuZ3RoKHN0cnVjdCBzY2IgKik7CitzdGF0aWMgX19pbmxpbmUgaW50IGFoY19nZXRfdHJhbnNmZXJfZGlyKHN0cnVjdCBzY2IgKik7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfc2V0X3Jlc2lkdWFsKHN0cnVjdCBzY2IgKiwgdV9sb25nKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19zZXRfc2Vuc2VfcmVzaWR1YWwoc3RydWN0IHNjYiAqc2NiLCB1X2xvbmcgcmVzaWQpOworc3RhdGljIF9faW5saW5lIHVfbG9uZyBhaGNfZ2V0X3Jlc2lkdWFsKHN0cnVjdCBzY2IgKik7CitzdGF0aWMgX19pbmxpbmUgdV9sb25nIGFoY19nZXRfc2Vuc2VfcmVzaWR1YWwoc3RydWN0IHNjYiAqKTsKK3N0YXRpYyBfX2lubGluZSBpbnQgYWhjX3BlcmZvcm1fYXV0b3NlbnNlKHN0cnVjdCBzY2IgKik7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QgYWhjX2dldF9zZW5zZV9idWZzaXplKHN0cnVjdCBhaGNfc29mdGMgKiwKKwkJCQkJICAgICAgIHN0cnVjdCBzY2IgKik7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfbm90aWZ5X3hmZXJfc2V0dGluZ3NfY2hhbmdlKHN0cnVjdCBhaGNfc29mdGMgKiwKKwkJCQkJCSAgICAgc3RydWN0IGFoY19kZXZpbmZvICopOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX3BsYXRmb3JtX3NjYl9mcmVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJICAgc3RydWN0IHNjYiAqc2NiKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19mcmVlemVfc2NiKHN0cnVjdCBzY2IgKnNjYik7CisKK3N0YXRpYyBfX2lubGluZQordm9pZCBhaGNfY21kX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoU2NzaV9DbW5kICpjbWQsIHVpbnQzMl90IHN0YXR1cykKK3sKKwljbWQtPnJlc3VsdCAmPSB+KENBTV9TVEFUVVNfTUFTSyA8PCAxNik7CisJY21kLT5yZXN1bHQgfD0gc3RhdHVzIDw8IDE2OworfQorCitzdGF0aWMgX19pbmxpbmUKK3ZvaWQgYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc3RydWN0IHNjYiAqc2NiLCB1aW50MzJfdCBzdGF0dXMpCit7CisJYWhjX2NtZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYi0+aW9fY3R4LHN0YXR1cyk7Cit9CisKK3N0YXRpYyBfX2lubGluZQordm9pZCBhaGNfY21kX3NldF9zY3NpX3N0YXR1cyhTY3NpX0NtbmQgKmNtZCwgdWludDMyX3Qgc3RhdHVzKQoreworCWNtZC0+cmVzdWx0ICY9IH4weEZGRkY7CisJY21kLT5yZXN1bHQgfD0gc3RhdHVzOworfQorCitzdGF0aWMgX19pbmxpbmUKK3ZvaWQgYWhjX3NldF9zY3NpX3N0YXR1cyhzdHJ1Y3Qgc2NiICpzY2IsIHVpbnQzMl90IHN0YXR1cykKK3sKKwlhaGNfY21kX3NldF9zY3NpX3N0YXR1cyhzY2ItPmlvX2N0eCwgc3RhdHVzKTsKK30KKworc3RhdGljIF9faW5saW5lCit1aW50MzJfdCBhaGNfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoU2NzaV9DbW5kICpjbWQpCit7CisJcmV0dXJuICgoY21kLT5yZXN1bHQgPj4gMTYpICYgQ0FNX1NUQVRVU19NQVNLKTsKK30KKworc3RhdGljIF9faW5saW5lCit1aW50MzJfdCBhaGNfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzdHJ1Y3Qgc2NiICpzY2IpCit7CisJcmV0dXJuIChhaGNfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLT5pb19jdHgpKTsKK30KKworc3RhdGljIF9faW5saW5lCit1aW50MzJfdCBhaGNfY21kX2dldF9zY3NpX3N0YXR1cyhTY3NpX0NtbmQgKmNtZCkKK3sKKwlyZXR1cm4gKGNtZC0+cmVzdWx0ICYgMHhGRkZGKTsKK30KKworc3RhdGljIF9faW5saW5lCit1aW50MzJfdCBhaGNfZ2V0X3Njc2lfc3RhdHVzKHN0cnVjdCBzY2IgKnNjYikKK3sKKwlyZXR1cm4gKGFoY19jbWRfZ2V0X3Njc2lfc3RhdHVzKHNjYi0+aW9fY3R4KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZQordm9pZCBhaGNfc2V0X3RyYW5zYWN0aW9uX3RhZyhzdHJ1Y3Qgc2NiICpzY2IsIGludCBlbmFibGVkLCB1X2ludCB0eXBlKQoreworCS8qCisJICogTm90aGluZyB0byBkbyBmb3IgbGludXggYXMgdGhlIGluY29taW5nIHRyYW5zYWN0aW9uCisJICogaGFzIG5vIGNvbmNlcHQgb2YgdGFnL25vbiB0YWdnZWQsIGV0Yy4KKwkgKi8KK30KKworc3RhdGljIF9faW5saW5lCit1X2xvbmcgYWhjX2dldF90cmFuc2Zlcl9sZW5ndGgoc3RydWN0IHNjYiAqc2NiKQoreworCXJldHVybiAoc2NiLT5wbGF0Zm9ybV9kYXRhLT54ZmVyX2xlbik7Cit9CisKK3N0YXRpYyBfX2lubGluZQoraW50IGFoY19nZXRfdHJhbnNmZXJfZGlyKHN0cnVjdCBzY2IgKnNjYikKK3sKKwlyZXR1cm4gKHNjYi0+aW9fY3R4LT5zY19kYXRhX2RpcmVjdGlvbik7Cit9CisKK3N0YXRpYyBfX2lubGluZQordm9pZCBhaGNfc2V0X3Jlc2lkdWFsKHN0cnVjdCBzY2IgKnNjYiwgdV9sb25nIHJlc2lkKQoreworCXNjYi0+aW9fY3R4LT5yZXNpZCA9IHJlc2lkOworfQorCitzdGF0aWMgX19pbmxpbmUKK3ZvaWQgYWhjX3NldF9zZW5zZV9yZXNpZHVhbChzdHJ1Y3Qgc2NiICpzY2IsIHVfbG9uZyByZXNpZCkKK3sKKwlzY2ItPnBsYXRmb3JtX2RhdGEtPnNlbnNlX3Jlc2lkID0gcmVzaWQ7Cit9CisKK3N0YXRpYyBfX2lubGluZQordV9sb25nIGFoY19nZXRfcmVzaWR1YWwoc3RydWN0IHNjYiAqc2NiKQoreworCXJldHVybiAoc2NiLT5pb19jdHgtPnJlc2lkKTsKK30KKworc3RhdGljIF9faW5saW5lCit1X2xvbmcgYWhjX2dldF9zZW5zZV9yZXNpZHVhbChzdHJ1Y3Qgc2NiICpzY2IpCit7CisJcmV0dXJuIChzY2ItPnBsYXRmb3JtX2RhdGEtPnNlbnNlX3Jlc2lkKTsKK30KKworc3RhdGljIF9faW5saW5lCitpbnQgYWhjX3BlcmZvcm1fYXV0b3NlbnNlKHN0cnVjdCBzY2IgKnNjYikKK3sKKwkvKgorCSAqIFdlIGFsd2F5cyBwZXJmb3JtIGF1dG9zZW5zZSBpbiBMaW51eC4KKwkgKiBPbiBvdGhlciBwbGF0Zm9ybXMgdGhpcyBpcyBzZXQgb24gYQorCSAqIHBlci10cmFuc2FjdGlvbiBiYXNpcy4KKwkgKi8KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKK2FoY19nZXRfc2Vuc2VfYnVmc2l6ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfbm90aWZ5X3hmZXJfc2V0dGluZ3NfY2hhbmdlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQlzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pCit7CisJLyogTm90aGluZyB0byBkbyBoZXJlIGZvciBsaW51eCAqLworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX3BsYXRmb3JtX3NjYl9mcmVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqc2NiKQoreworCWFoYy0+ZmxhZ3MgJj0gfkFIQ19SRVNPVVJDRV9TSE9SVEFHRTsKK30KKworaW50CWFoY19wbGF0Zm9ybV9hbGxvYyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHZvaWQgKnBsYXRmb3JtX2FyZyk7Cit2b2lkCWFoY19wbGF0Zm9ybV9mcmVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7Cit2b2lkCWFoY19wbGF0Zm9ybV9mcmVlemVfZGV2cShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYik7CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfZnJlZXplX3NjYihzdHJ1Y3Qgc2NiICpzY2IpCit7CisJaWYgKChzY2ItPmlvX2N0eC0+cmVzdWx0ICYgKENBTV9ERVZfUUZSWk4gPDwgMTYpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc2NiLT5pb19jdHgtPnJlc3VsdCB8PSBDQU1fREVWX1FGUlpOIDw8IDE2OworICAgICAgICAgICAgICAgIHNjYi0+cGxhdGZvcm1fZGF0YS0+ZGV2LT5xZnJvemVuKys7CisgICAgICAgIH0KK30KKwordm9pZAlhaGNfcGxhdGZvcm1fc2V0X3RhZ3Moc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJICAgICAgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLCBhaGNfcXVldWVfYWxnKTsKK2ludAlhaGNfcGxhdGZvcm1fYWJvcnRfc2NicyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCB0YXJnZXQsCisJCQkJY2hhciBjaGFubmVsLCBpbnQgbHVuLCB1X2ludCB0YWcsCisJCQkJcm9sZV90IHJvbGUsIHVpbnQzMl90IHN0YXR1cyk7CitpcnFyZXR1cm5fdAorCWFoY19saW51eF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOwordm9pZAlhaGNfcGxhdGZvcm1fZmx1c2h3b3JrKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitpbnQJYWhjX3NvZnRjX2NvbXAoc3RydWN0IGFoY19zb2Z0YyAqLCBzdHJ1Y3QgYWhjX3NvZnRjICopOwordm9pZAlhaGNfZG9uZShzdHJ1Y3QgYWhjX3NvZnRjKiwgc3RydWN0IHNjYiopOwordm9pZAlhaGNfc2VuZF9hc3luYyhzdHJ1Y3QgYWhjX3NvZnRjICosIGNoYXIgY2hhbm5lbCwKKwkJICAgICAgIHVfaW50IHRhcmdldCwgdV9pbnQgbHVuLCBhY19jb2RlLCB2b2lkICopOwordm9pZAlhaGNfcHJpbnRfcGF0aChzdHJ1Y3QgYWhjX3NvZnRjICosIHN0cnVjdCBzY2IgKik7Cit2b2lkCWFoY19wbGF0Zm9ybV9kdW1wX2NhcmRfc3RhdGUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKKworI2lmZGVmIENPTkZJR19QQ0kKKyNkZWZpbmUgQUhDX1BDSV9DT05GSUcgMQorI2Vsc2UKKyNkZWZpbmUgQUhDX1BDSV9DT05GSUcgMAorI2VuZGlmCisjZGVmaW5lIGJvb3R2ZXJib3NlIGFpYzd4eHhfdmVyYm9zZQorZXh0ZXJuIHVfaW50IGFpYzd4eHhfdmVyYm9zZTsKKyNlbmRpZiAvKiBfQUlDN1hYWF9MSU5VWF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc21fcGNpLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbV9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjY2NzRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc21fcGNpLmMKQEAgLTAsMCArMSwzODkgQEAKKy8qCisgKiBMaW51eCBkcml2ZXIgYXR0YWNobWVudCBnbHVlIGZvciBQQ0kgYmFzZWQgY29udHJvbGxlcnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvbGludXgvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc21fcGNpLmMjNDcgJAorICovCisKKyNpbmNsdWRlICJhaWM3eHh4X29zbS5oIgorI2luY2x1ZGUgImFpYzd4eHhfcGNpLmgiCisKK3N0YXRpYyBpbnQJYWhjX2xpbnV4X3BjaV9kZXZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworc3RhdGljIGludAlhaGNfbGludXhfcGNpX3Jlc2VydmVfaW9fcmVnaW9uKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJCXVfbG9uZyAqYmFzZSk7CitzdGF0aWMgaW50CWFoY19saW51eF9wY2lfcmVzZXJ2ZV9tZW1fcmVnaW9uKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJCSB1X2xvbmcgKmJ1c19hZGRyLAorCQkJCQkJIHVpbnQ4X3QgX19pb21lbSAqKm1hZGRyKTsKK3N0YXRpYyB2b2lkCWFoY19saW51eF9wY2lfZGV2X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CisKKy8qIERlZmluZSB0aGUgbWFjcm8gbG9jYWxseSBzaW5jZSBpdCdzIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IGNsYXNzIG9mIGNoaXBzLgorKi8KKyNkZWZpbmUgSUQoeCkJSURfQyh4LCBQQ0lfQ0xBU1NfU1RPUkFHRV9TQ1NJKQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWhjX2xpbnV4X3BjaV9pZF90YWJsZVtdID0geworCS8qIGFpYzc4NTAgYmFzZWQgY29udHJvbGxlcnMgKi8KKwlJRChJRF9BSEFfMjkwMl8wNF8xMF8xNV8yMENfMzBDKSwKKwkvKiBhaWM3ODYwIGJhc2VkIGNvbnRyb2xsZXJzICovCisJSUQoSURfQUhBXzI5MzBDVSksCisJSUQoSURfQUhBXzE0ODBBICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSEFfMjk0MEFVXzAgJiBJRF9ERVZfVkVORE9SX01BU0spLAorCUlEKElEX0FIQV8yOTQwQVVfQ04gJiBJRF9ERVZfVkVORE9SX01BU0spLAorCUlEKElEX0FIQV8yOTMwQ19WQVIgJiBJRF9ERVZfVkVORE9SX01BU0spLAorCS8qIGFpYzc4NzAgYmFzZWQgY29udHJvbGxlcnMgKi8KKwlJRChJRF9BSEFfMjk0MCksCisJSUQoSURfQUhBXzM5NDApLAorCUlEKElEX0FIQV8zOThYKSwKKwlJRChJRF9BSEFfMjk0NCksCisJSUQoSURfQUhBXzM5NDQpLAorCUlEKElEX0FIQV80OTQ0KSwKKwkvKiBhaWM3ODgwIGJhc2VkIGNvbnRyb2xsZXJzICovCisJSUQoSURfQUhBXzI5NDBVICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSEFfMzk0MFUgJiBJRF9ERVZfVkVORE9SX01BU0spLAorCUlEKElEX0FIQV8yOTQ0VSAmIElEX0RFVl9WRU5ET1JfTUFTSyksCisJSUQoSURfQUhBXzM5NDRVICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSEFfMzk4WFUgJiBJRF9ERVZfVkVORE9SX01BU0spLAorCUlEKElEX0FIQV80OTQ0VSAmIElEX0RFVl9WRU5ET1JfTUFTSyksCisJSUQoSURfQUhBXzI5MzBVICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSEFfMjk0MFVfUFJPICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSEFfMjk0MFVfQ04gJiBJRF9ERVZfVkVORE9SX01BU0spLAorCS8qIGFpYzc4OTAgYmFzZWQgY29udHJvbGxlcnMgKi8KKwlJRChJRF9BSEFfMjkzMFUyKSwKKwlJRChJRF9BSEFfMjk0MFUyQiksCisJSUQoSURfQUhBXzI5NDBVMl9PRU0pLAorCUlEKElEX0FIQV8yOTQwVTIpLAorCUlEKElEX0FIQV8yOTUwVTJCKSwKKwlJRDE2KElEX0FJQzc4OTBfQVJPICYgSURfQUlDNzg5NV9BUk9fTUFTSyksCisJSUQoSURfQUFBXzEzMVUyKSwKKwkvKiBhaWM3ODkwIGJhc2VkIGNvbnRyb2xsZXJzICovCisJSUQoSURfQUhBXzI5MTYwKSwKKwlJRChJRF9BSEFfMjkxNjBfQ1BRKSwKKwlJRChJRF9BSEFfMjkxNjBOKSwKKwlJRChJRF9BSEFfMjkxNjBDKSwKKwlJRChJRF9BSEFfMjkxNjBCKSwKKwlJRChJRF9BSEFfMTkxNjBCKSwKKwlJRChJRF9BSUM3ODkyX0FSTyksCisJLyogYWljNzg5MiBiYXNlZCBjb250cm9sbGVycyAqLworCUlEKElEX0FIQV8yOTQwVV9EVUFMKSwKKwlJRChJRF9BSEFfMzk0MEFVKSwKKwlJRChJRF9BSEFfMzk0NEFVKSwKKwlJRChJRF9BSUM3ODk1X0FSTyksCisJSUQoSURfQUhBXzM5NTBVMkJfMCksCisJSUQoSURfQUhBXzM5NTBVMkJfMSksCisJSUQoSURfQUhBXzM5NTBVMkRfMCksCisJSUQoSURfQUhBXzM5NTBVMkRfMSksCisJSUQoSURfQUlDNzg5Nl9BUk8pLAorCS8qIGFpYzc4OTkgYmFzZWQgY29udHJvbGxlcnMgKi8KKwlJRChJRF9BSEFfMzk2MEQpLAorCUlEKElEX0FIQV8zOTYwRF9DUFEpLAorCUlEKElEX0FJQzc4OTlfQVJPKSwKKwkvKiBHZW5lcmljIGNoaXAgcHJvYmVzIGZvciBkZXZpY2VzIHdlIGRvbid0IGtub3cgZXhhY3RseS4gKi8KKwlJRChJRF9BSUM3ODUwICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSUM3ODU1ICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSUM3ODU5ICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSUM3ODYwICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSUM3ODcwICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSUM3ODgwICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKyAJSUQxNihJRF9BSUM3ODkwICYgSURfOTAwNV9HRU5FUklDX01BU0spLAorIAlJRDE2KElEX0FJQzc4OTIgJiBJRF85MDA1X0dFTkVSSUNfTUFTSyksCisJSUQoSURfQUlDNzg5NSAmIElEX0RFVl9WRU5ET1JfTUFTSyksCisJSUQxNihJRF9BSUM3ODk2ICYgSURfOTAwNV9HRU5FUklDX01BU0spLAorCUlEMTYoSURfQUlDNzg5OSAmIElEXzkwMDVfR0VORVJJQ19NQVNLKSwKKwlJRChJRF9BSUM3ODEwICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSUM3ODE1ICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwl7IDAgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFoY19saW51eF9wY2lfaWRfdGFibGUpOworCitzdHJ1Y3QgcGNpX2RyaXZlciBhaWM3eHh4X3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImFpYzd4eHgiLAorCS5wcm9iZQkJPSBhaGNfbGludXhfcGNpX2Rldl9wcm9iZSwKKwkucmVtb3ZlCQk9IGFoY19saW51eF9wY2lfZGV2X3JlbW92ZSwKKwkuaWRfdGFibGUJPSBhaGNfbGludXhfcGNpX2lkX3RhYmxlCit9OworCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X3BjaV9kZXZfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhaGNfc29mdGMgKmFoYzsKKwl1X2xvbmcgbDsKKworCS8qCisJICogV2Ugc2hvdWxkIGJlIGFibGUgdG8ganVzdCBwZXJmb3JtCisJICogdGhlIGZyZWUgZGlyZWN0bHksIGJ1dCBjaGVjayBvdXIKKwkgKiBsaXN0IGZvciBleHRyYSBzYW5pdHkuCisJICovCisJYWhjX2xpc3RfbG9jaygmbCk7CisJYWhjID0gYWhjX2ZpbmRfc29mdGMoKHN0cnVjdCBhaGNfc29mdGMgKilwY2lfZ2V0X2RydmRhdGEocGRldikpOworCWlmIChhaGMgIT0gTlVMTCkgeworCQl1X2xvbmcgczsKKworCQlUQUlMUV9SRU1PVkUoJmFoY190YWlscSwgYWhjLCBsaW5rcyk7CisJCWFoY19saXN0X3VubG9jaygmbCk7CisJCWFoY19sb2NrKGFoYywgJnMpOworCQlhaGNfaW50cl9lbmFibGUoYWhjLCBGQUxTRSk7CisJCWFoY191bmxvY2soYWhjLCAmcyk7CisJCWFoY19mcmVlKGFoYyk7CisJfSBlbHNlCisJCWFoY19saXN0X3VubG9jaygmbCk7Cit9CisKK3N0YXRpYyBpbnQKK2FoY19saW51eF9wY2lfZGV2X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWNoYXIJCSBidWZbODBdOworCWNvbnN0IHVpbnQ2NF90CSBtYXNrXzM5Yml0ID0gMHg3RkZGRkZGRkZGVUxMOworCXN0cnVjdAkJIGFoY19zb2Z0YyAqYWhjOworCWFoY19kZXZfc29mdGNfdAkgcGNpOworCXN0cnVjdAkJIGFoY19wY2lfaWRlbnRpdHkgKmVudHJ5OworCWNoYXIJCSpuYW1lOworCWludAkJIGVycm9yOworCisJLyoKKwkgKiBTb21lIEJJT1NlbiByZXBvcnQgdGhlIHNhbWUgZGV2aWNlIG11bHRpcGxlIHRpbWVzLgorCSAqLworCVRBSUxRX0ZPUkVBQ0goYWhjLCAmYWhjX3RhaWxxLCBsaW5rcykgeworCQlzdHJ1Y3QgcGNpX2RldiAqcHJvYmVkX3BkZXY7CisKKwkJcHJvYmVkX3BkZXYgPSBhaGMtPmRldl9zb2Z0YzsKKwkJaWYgKHByb2JlZF9wZGV2LT5idXMtPm51bWJlciA9PSBwZGV2LT5idXMtPm51bWJlcgorCQkgJiYgcHJvYmVkX3BkZXYtPmRldmZuID09IHBkZXYtPmRldmZuKQorCQkJYnJlYWs7CisJfQorCWlmIChhaGMgIT0gTlVMTCkgeworCQkvKiBTa2lwIGR1cGxpY2F0ZS4gKi8KKwkJcmV0dXJuICgtRU5PREVWKTsKKwl9CisKKwlwY2kgPSBwZGV2OworCWVudHJ5ID0gYWhjX2ZpbmRfcGNpX2RldmljZShwY2kpOworCWlmIChlbnRyeSA9PSBOVUxMKQorCQlyZXR1cm4gKC1FTk9ERVYpOworCisJLyoKKwkgKiBBbGxvY2F0ZSBhIHNvZnRjIGZvciB0aGlzIGNhcmQgYW5kCisJICogc2V0IGl0IHVwIGZvciBhdHRhY2htZW50IGJ5IG91cgorCSAqIGNvbW1vbiBkZXRlY3Qgcm91dGluZS4KKwkgKi8KKwlzcHJpbnRmKGJ1ZiwgImFoY19wY2k6JWQ6JWQ6JWQiLAorCQlhaGNfZ2V0X3BjaV9idXMocGNpKSwKKwkJYWhjX2dldF9wY2lfc2xvdChwY2kpLAorCQlhaGNfZ2V0X3BjaV9mdW5jdGlvbihwY2kpKTsKKwluYW1lID0gbWFsbG9jKHN0cmxlbihidWYpICsgMSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gKC1FTk9NRU0pOworCXN0cmNweShuYW1lLCBidWYpOworCWFoYyA9IGFoY19hbGxvYyhOVUxMLCBuYW1lKTsKKwlpZiAoYWhjID09IE5VTEwpCisJCXJldHVybiAoLUVOT01FTSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7CisJCWFoY19mcmVlKGFoYyk7CisJCXJldHVybiAoLUVOT0RFVik7CisJfQorCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJaWYgKHNpemVvZihkbWFfYWRkcl90KSA+IDQKKwkgJiYgYWhjX2xpbnV4X2dldF9tZW1zaXplKCkgPiAweDgwMDAwMDAwCisJICYmIHBjaV9zZXRfZG1hX21hc2socGRldiwgbWFza18zOWJpdCkgPT0gMCkgeworCQlhaGMtPmZsYWdzIHw9IEFIQ18zOUJJVF9BRERSRVNTSU5HOworCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmh3X2RtYV9tYXNrID0gbWFza18zOWJpdDsKKwl9IGVsc2UgeworCQlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFpYzd4eHg6IE5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUuXG4iKTsKKyAgICAgICAgICAgICAgICAJcmV0dXJuICgtRU5PREVWKTsKKwkJfQorCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmh3X2RtYV9tYXNrID0gRE1BXzMyQklUX01BU0s7CisJfQorCWFoYy0+ZGV2X3NvZnRjID0gcGNpOworCWVycm9yID0gYWhjX3BjaV9jb25maWcoYWhjLCBlbnRyeSk7CisJaWYgKGVycm9yICE9IDApIHsKKwkJYWhjX2ZyZWUoYWhjKTsKKwkJcmV0dXJuICgtZXJyb3IpOworCX0KKwlwY2lfc2V0X2RydmRhdGEocGRldiwgYWhjKTsKKwlpZiAoYWljN3h4eF9kZXRlY3RfY29tcGxldGUpIHsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJCWFoY19saW51eF9yZWdpc3Rlcl9ob3N0KGFoYywgJmFpYzd4eHhfZHJpdmVyX3RlbXBsYXRlKTsKKyNlbHNlCisJCXByaW50ZigiYWljN3h4eDogaWdub3JpbmcgUENJIGRldmljZSBmb3VuZCBhZnRlciAiCisJCSAgICAgICAiaW5pdGlhbGl6YXRpb25cbiIpOworCQlyZXR1cm4gKC1FTk9ERVYpOworI2VuZGlmCisJfQorCXJldHVybiAoMCk7Cit9CisKK2ludAorYWhjX2xpbnV4X3BjaV9pbml0KHZvaWQpCit7CisJLyogVHJhbnNsYXRlIGVycm9yIG9yIHplcm8gcmV0dXJuIGludG8gemVybyBvciBvbmUgKi8KKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZhaWM3eHh4X3BjaV9kcml2ZXIpID8gMCA6IDE7Cit9CisKK3ZvaWQKK2FoY19saW51eF9wY2lfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWljN3h4eF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIGludAorYWhjX2xpbnV4X3BjaV9yZXNlcnZlX2lvX3JlZ2lvbihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfbG9uZyAqYmFzZSkKK3sKKwlpZiAoYWljN3h4eF9hbGxvd19tZW1pbyA9PSAwKQorCQlyZXR1cm4gKEVOT01FTSk7CisKKwkqYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChhaGMtPmRldl9zb2Z0YywgMCk7CisJaWYgKCpiYXNlID09IDApCisJCXJldHVybiAoRU5PTUVNKTsKKwlpZiAocmVxdWVzdF9yZWdpb24oKmJhc2UsIDI1NiwgImFpYzd4eHgiKSA9PSAwKQorCQlyZXR1cm4gKEVOT01FTSk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhjX2xpbnV4X3BjaV9yZXNlcnZlX21lbV9yZWdpb24oc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCSB1X2xvbmcgKmJ1c19hZGRyLAorCQkJCSB1aW50OF90IF9faW9tZW0gKiptYWRkcikKK3sKKwl1X2xvbmcJc3RhcnQ7CisJaW50CWVycm9yOworCisJZXJyb3IgPSAwOworCXN0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGFoYy0+ZGV2X3NvZnRjLCAxKTsKKwlpZiAoc3RhcnQgIT0gMCkgeworCQkqYnVzX2FkZHIgPSBzdGFydDsKKwkJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihzdGFydCwgMHgxMDAwLCAiYWljN3h4eCIpID09IDApCisJCQllcnJvciA9IEVOT01FTTsKKwkJaWYgKGVycm9yID09IDApIHsKKwkJCSptYWRkciA9IGlvcmVtYXBfbm9jYWNoZShzdGFydCwgMjU2KTsKKwkJCWlmICgqbWFkZHIgPT0gTlVMTCkgeworCQkJCWVycm9yID0gRU5PTUVNOworCQkJCXJlbGVhc2VfbWVtX3JlZ2lvbihzdGFydCwgMHgxMDAwKTsKKwkJCX0KKwkJfQorCX0gZWxzZQorCQllcnJvciA9IEVOT01FTTsKKwlyZXR1cm4gKGVycm9yKTsKK30KKworaW50CithaGNfcGNpX21hcF9yZWdpc3RlcnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXVpbnQzMl90IGNvbW1hbmQ7CisJdV9sb25nCSBiYXNlOworCXVpbnQ4X3QJX19pb21lbSAqbWFkZHI7CisJaW50CSBlcnJvcjsKKworCS8qCisJICogSWYgaXRzIGFsbG93ZWQsIHdlIHByZWZlciBtZW1vcnkgbWFwcGVkIGFjY2Vzcy4KKwkgKi8KKwljb21tYW5kID0gYWhjX3BjaV9yZWFkX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywgUENJUl9DT01NQU5ELCA0KTsKKwljb21tYW5kICY9IH4oUENJTV9DTURfUE9SVEVOfFBDSU1fQ01EX01FTUVOKTsKKwliYXNlID0gMDsKKwltYWRkciA9IE5VTEw7CisJZXJyb3IgPSBhaGNfbGludXhfcGNpX3Jlc2VydmVfbWVtX3JlZ2lvbihhaGMsICZiYXNlLCAmbWFkZHIpOworCWlmIChlcnJvciA9PSAwKSB7CisJCWFoYy0+cGxhdGZvcm1fZGF0YS0+bWVtX2J1c2FkZHIgPSBiYXNlOworCQlhaGMtPnRhZyA9IEJVU19TUEFDRV9NRU1JTzsKKwkJYWhjLT5ic2gubWFkZHIgPSBtYWRkcjsKKwkJYWhjX3BjaV93cml0ZV9jb25maWcoYWhjLT5kZXZfc29mdGMsIFBDSVJfQ09NTUFORCwKKwkJCQkgICAgIGNvbW1hbmQgfCBQQ0lNX0NNRF9NRU1FTiwgNCk7CisKKwkJLyoKKwkJICogRG8gYSBxdWljayB0ZXN0IHRvIHNlZSBpZiBtZW1vcnkgbWFwcGVkCisJCSAqIEkvTyBpcyBmdW5jdGlvbmluZyBjb3JyZWN0bHkuCisJCSAqLworCQlpZiAoYWhjX3BjaV90ZXN0X3JlZ2lzdGVyX2FjY2VzcyhhaGMpICE9IDApIHsKKworCQkJcHJpbnRmKCJhaWM3eHh4OiBQQ0kgRGV2aWNlICVkOiVkOiVkICIKKwkJCSAgICAgICAiZmFpbGVkIG1lbW9yeSBtYXBwZWQgdGVzdC4gIFVzaW5nIFBJTy5cbiIsCisJCQkgICAgICAgYWhjX2dldF9wY2lfYnVzKGFoYy0+ZGV2X3NvZnRjKSwKKwkJCSAgICAgICBhaGNfZ2V0X3BjaV9zbG90KGFoYy0+ZGV2X3NvZnRjKSwKKwkJCSAgICAgICBhaGNfZ2V0X3BjaV9mdW5jdGlvbihhaGMtPmRldl9zb2Z0YykpOworCQkJaW91bm1hcChtYWRkcik7CisJCQlyZWxlYXNlX21lbV9yZWdpb24oYWhjLT5wbGF0Zm9ybV9kYXRhLT5tZW1fYnVzYWRkciwKKwkJCQkJICAgMHgxMDAwKTsKKwkJCWFoYy0+YnNoLm1hZGRyID0gTlVMTDsKKwkJCW1hZGRyID0gTlVMTDsKKwkJfSBlbHNlCisJCQljb21tYW5kIHw9IFBDSU1fQ01EX01FTUVOOworCX0gZWxzZSB7CisJCXByaW50ZigiYWljN3h4eDogUENJJWQ6JWQ6JWQgTUVNIHJlZ2lvbiAweCVseCAiCisJCSAgICAgICAidW5hdmFpbGFibGUuIENhbm5vdCBtZW1vcnkgbWFwIGRldmljZS5cbiIsCisJCSAgICAgICBhaGNfZ2V0X3BjaV9idXMoYWhjLT5kZXZfc29mdGMpLAorCQkgICAgICAgYWhjX2dldF9wY2lfc2xvdChhaGMtPmRldl9zb2Z0YyksCisJCSAgICAgICBhaGNfZ2V0X3BjaV9mdW5jdGlvbihhaGMtPmRldl9zb2Z0YyksCisJCSAgICAgICBiYXNlKTsKKwl9CisKKwkvKgorCSAqIFdlIGFsd2F5cyBwcmVmZXIgbWVtb3J5IG1hcHBlZCBhY2Nlc3MuCisJICovCisJaWYgKG1hZGRyID09IE5VTEwpIHsKKworCQllcnJvciA9IGFoY19saW51eF9wY2lfcmVzZXJ2ZV9pb19yZWdpb24oYWhjLCAmYmFzZSk7CisJCWlmIChlcnJvciA9PSAwKSB7CisJCQlhaGMtPnRhZyA9IEJVU19TUEFDRV9QSU87CisJCQlhaGMtPmJzaC5pb3BvcnQgPSBiYXNlOworCQkJY29tbWFuZCB8PSBQQ0lNX0NNRF9QT1JURU47CisJCX0gZWxzZSB7CisJCQlwcmludGYoImFpYzd4eHg6IFBDSSVkOiVkOiVkIElPIHJlZ2lvbiAweCVseFswLi4yNTVdICIKKwkJCSAgICAgICAidW5hdmFpbGFibGUuIENhbm5vdCBtYXAgZGV2aWNlLlxuIiwKKwkJCSAgICAgICBhaGNfZ2V0X3BjaV9idXMoYWhjLT5kZXZfc29mdGMpLAorCQkJICAgICAgIGFoY19nZXRfcGNpX3Nsb3QoYWhjLT5kZXZfc29mdGMpLAorCQkJICAgICAgIGFoY19nZXRfcGNpX2Z1bmN0aW9uKGFoYy0+ZGV2X3NvZnRjKSwKKwkJCSAgICAgICBiYXNlKTsKKwkJfQorCX0KKwlhaGNfcGNpX3dyaXRlX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywgUENJUl9DT01NQU5ELCBjb21tYW5kLCA0KTsKKwlyZXR1cm4gKGVycm9yKTsKK30KKworaW50CithaGNfcGNpX21hcF9pbnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gcmVxdWVzdF9pcnEoYWhjLT5kZXZfc29mdGMtPmlycSwgYWhjX2xpbnV4X2lzciwKKwkJCSAgICBTQV9TSElSUSwgImFpYzd4eHgiLCBhaGMpOworCWlmIChlcnJvciA9PSAwKQorCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmlycSA9IGFoYy0+ZGV2X3NvZnRjLT5pcnE7CisJCisJcmV0dXJuICgtZXJyb3IpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3BjaS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGRjYzk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wY2kuYwpAQCAtMCwwICsxLDI0MDcgQEAKKy8qCisgKiBQcm9kdWN0IHNwZWNpZmljIHByb2JlIGFuZCBhdHRhY2ggcm91dGluZXMgZm9yOgorICogICAgICAzOTQwLCAyOTQwLCBhaWM3ODk1LCBhaWM3ODkwLCBhaWM3ODgwLAorICoJYWljNzg3MCwgYWljNzg2MCBhbmQgYWljNzg1MCBTQ1NJIGNvbnRyb2xsZXJzCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMDEgSnVzdGluIFQuIEdpYmJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4X3BjaS5jIzY5ICQKKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSAiYWljN3h4eF9vc20uaCIKKyNpbmNsdWRlICJhaWM3eHh4X2lubGluZS5oIgorI2luY2x1ZGUgImFpYzd4eHhfOTNjeDYuaCIKKyNlbHNlCisjaW5jbHVkZSA8ZGV2L2FpYzd4eHgvYWljN3h4eF9vc20uaD4KKyNpbmNsdWRlIDxkZXYvYWljN3h4eC9haWM3eHh4X2lubGluZS5oPgorI2luY2x1ZGUgPGRldi9haWM3eHh4L2FpYzd4eHhfOTNjeDYuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYWljN3h4eF9wY2kuaCIKKworc3RhdGljIF9faW5saW5lIHVpbnQ2NF90CithaGNfY29tcG9zZV9pZCh1X2ludCBkZXZpY2UsIHVfaW50IHZlbmRvciwgdV9pbnQgc3ViZGV2aWNlLCB1X2ludCBzdWJ2ZW5kb3IpCit7CisJdWludDY0X3QgaWQ7CisKKwlpZCA9IHN1YnZlbmRvcgorCSAgIHwgKHN1YmRldmljZSA8PCAxNikKKwkgICB8ICgodWludDY0X3QpdmVuZG9yIDw8IDMyKQorCSAgIHwgKCh1aW50NjRfdClkZXZpY2UgPDwgNDgpOworCisJcmV0dXJuIChpZCk7Cit9CisKKyNkZWZpbmUgQUhDX1BDSV9JT0FERFIJUENJUl9NQVBTCS8qIEkvTyBBZGRyZXNzICovCisjZGVmaW5lIEFIQ19QQ0lfTUVNQUREUgkoUENJUl9NQVBTICsgNCkJLyogTWVtIEkvTyBBZGRyZXNzICovCisKKyNkZWZpbmUgREVWSURfOTAwNV9UWVBFKGlkKSAoKGlkKSAmIDB4RikKKyNkZWZpbmUJCURFVklEXzkwMDVfVFlQRV9IQkEJCTB4MAkvKiBTdGFuZGFyZCBDYXJkICovCisjZGVmaW5lCQlERVZJRF85MDA1X1RZUEVfQUFBCQkweDMJLyogUkFJRCBDYXJkICovCisjZGVmaW5lCQlERVZJRF85MDA1X1RZUEVfU0lTTAkJMHg1CS8qIENvbnRhaW5lciBST01CICovCisjZGVmaW5lCQlERVZJRF85MDA1X1RZUEVfTUIJCTB4RgkvKiBPbiBNb3RoZXJib2FyZCAqLworCisjZGVmaW5lIERFVklEXzkwMDVfTUFYUkFURShpZCkgKCgoaWQpICYgMHgzMCkgPj4gNCkKKyNkZWZpbmUJCURFVklEXzkwMDVfTUFYUkFURV9VMTYwCQkweDAKKyNkZWZpbmUJCURFVklEXzkwMDVfTUFYUkFURV9VTFRSQTIJMHgxCisjZGVmaW5lCQlERVZJRF85MDA1X01BWFJBVEVfVUxUUkEJMHgyCisjZGVmaW5lCQlERVZJRF85MDA1X01BWFJBVEVfRkFTVAkJMHgzCisKKyNkZWZpbmUgREVWSURfOTAwNV9NRlVOQyhpZCkgKCgoaWQpICYgMHg0MCkgPj4gNikKKworI2RlZmluZSBERVZJRF85MDA1X0NMQVNTKGlkKSAoKChpZCkgJiAweEZGMDApID4+IDgpCisjZGVmaW5lCQlERVZJRF85MDA1X0NMQVNTX1NQSQkJMHgwCS8qIFBhcmFsbGVsIFNDU0kgKi8KKworI2RlZmluZSBTVUJJRF85MDA1X1RZUEUoaWQpICgoaWQpICYgMHhGKQorI2RlZmluZQkJU1VCSURfOTAwNV9UWVBFX01CCQkweEYJLyogT24gTW90aGVyYm9hcmQgKi8KKyNkZWZpbmUJCVNVQklEXzkwMDVfVFlQRV9DQVJECQkweDAJLyogU3RhbmRhcmQgQ2FyZCAqLworI2RlZmluZQkJU1VCSURfOTAwNV9UWVBFX0xDQ0FSRAkJMHgxCS8qIExvdyBDb3N0IENhcmQgKi8KKyNkZWZpbmUJCVNVQklEXzkwMDVfVFlQRV9SQUlECQkweDMJLyogQ29tYmluZWQgd2l0aCBSYWlkICovCisKKyNkZWZpbmUgU1VCSURfOTAwNV9UWVBFX0tOT1dOKGlkKQkJCVwKKwkgICgoKChpZCkgJiAweEYpID09IFNVQklEXzkwMDVfVFlQRV9NQikJCVwKKwl8fCAoKChpZCkgJiAweEYpID09IFNVQklEXzkwMDVfVFlQRV9DQVJEKQlcCisJfHwgKCgoaWQpICYgMHhGKSA9PSBTVUJJRF85MDA1X1RZUEVfTENDQVJEKQlcCisJfHwgKCgoaWQpICYgMHhGKSA9PSBTVUJJRF85MDA1X1RZUEVfUkFJRCkpCisKKyNkZWZpbmUgU1VCSURfOTAwNV9NQVhSQVRFKGlkKSAoKChpZCkgJiAweDMwKSA+PiA0KQorI2RlZmluZQkJU1VCSURfOTAwNV9NQVhSQVRFX1VMVFJBMgkweDAKKyNkZWZpbmUJCVNVQklEXzkwMDVfTUFYUkFURV9VTFRSQQkweDEKKyNkZWZpbmUJCVNVQklEXzkwMDVfTUFYUkFURV9VMTYwCQkweDIKKyNkZWZpbmUJCVNVQklEXzkwMDVfTUFYUkFURV9SRVNFUlZFRAkweDMKKworI2RlZmluZSBTVUJJRF85MDA1X1NFRVBUWVBFKGlkKQkJCQkJCVwKKwkoKFNVQklEXzkwMDVfVFlQRShpZCkgPT0gU1VCSURfOTAwNV9UWVBFX01CKQkJCVwKKwkgPyAoKGlkKSAmIDB4QzApID4+IDYJCQkJCQlcCisJIDogKChpZCkgJiAweDMwMCkgPj4gOCkKKyNkZWZpbmUJCVNVQklEXzkwMDVfU0VFUFRZUEVfTk9ORQkweDAKKyNkZWZpbmUJCVNVQklEXzkwMDVfU0VFUFRZUEVfMUsJCTB4MQorI2RlZmluZQkJU1VCSURfOTAwNV9TRUVQVFlQRV8yS180SwkweDIKKyNkZWZpbmUJCVNVQklEXzkwMDVfU0VFUFRZUEVfUkVTRVJWRUQJMHgzCisjZGVmaW5lIFNVQklEXzkwMDVfQVVUT1RFUk0oaWQpCQkJCQkJXAorCSgoU1VCSURfOTAwNV9UWVBFKGlkKSA9PSBTVUJJRF85MDA1X1RZUEVfTUIpCQkJXAorCSA/ICgoKGlkKSAmIDB4NDAwKSA+PiAxMCkgPT0gMAkJCQkJXAorCSA6ICgoKGlkKSAmIDB4NDApID4+IDYpID09IDApCisKKyNkZWZpbmUgU1VCSURfOTAwNV9OVU1DSEFOKGlkKQkJCQkJCVwKKwkoKFNVQklEXzkwMDVfVFlQRShpZCkgPT0gU1VCSURfOTAwNV9UWVBFX01CKQkJCVwKKwkgPyAoKGlkKSAmIDB4MzAwKSA+PiA4CQkJCQkJXAorCSA6ICgoaWQpICYgMHhDMDApID4+IDEwKQorCisjZGVmaW5lIFNVQklEXzkwMDVfTEVHQUNZQ09OTihpZCkJCQkJCVwKKwkoKFNVQklEXzkwMDVfVFlQRShpZCkgPT0gU1VCSURfOTAwNV9UWVBFX01CKQkJCVwKKwkgPyAwCQkJCQkJCQlcCisJIDogKChpZCkgJiAweDgwKSA+PiA3KQorCisjZGVmaW5lIFNVQklEXzkwMDVfTUZVTkNFTkIoaWQpCQkJCQkJXAorCSgoU1VCSURfOTAwNV9UWVBFKGlkKSA9PSBTVUJJRF85MDA1X1RZUEVfTUIpCQkJXAorCSA/ICgoaWQpICYgMHg4MDApID4+IDExCQkJCQkJXAorCSA6ICgoaWQpICYgMHgxMDAwKSA+PiAxMikKKy8qCisgKiBJbmZvcm1hdGlvbmFsIG9ubHkuIFNob3VsZCB1c2UgY2hpcCByZWdpc3RlciB0byBiZQorICogY2VydGFpbiwgYnV0IG1heSBiZSB1c2UgaW4gaWRlbnRpZmljYXRpb24gc3RyaW5ncy4KKyAqLworI2RlZmluZSBTVUJJRF85MDA1X0NBUkRfU0NTSVdJRFRIX01BU0sJMHgyMDAwCisjZGVmaW5lIFNVQklEXzkwMDVfQ0FSRF9QQ0lXSURUSF9NQVNLCTB4NDAwMAorI2RlZmluZSBTVUJJRF85MDA1X0NBUkRfU0VESUZGX01BU0sJMHg4MDAwCisKK3N0YXRpYyBhaGNfZGV2aWNlX3NldHVwX3QgYWhjX2FpYzc4NVhfc2V0dXA7CitzdGF0aWMgYWhjX2RldmljZV9zZXR1cF90IGFoY19haWM3ODYwX3NldHVwOworc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYXBhMTQ4MF9zZXR1cDsKK3N0YXRpYyBhaGNfZGV2aWNlX3NldHVwX3QgYWhjX2FpYzc4NzBfc2V0dXA7CitzdGF0aWMgYWhjX2RldmljZV9zZXR1cF90IGFoY19haGEzOTRYX3NldHVwOworc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYWhhNDk0WF9zZXR1cDsKK3N0YXRpYyBhaGNfZGV2aWNlX3NldHVwX3QgYWhjX2FoYTM5OFhfc2V0dXA7CitzdGF0aWMgYWhjX2RldmljZV9zZXR1cF90IGFoY19haWM3ODgwX3NldHVwOworc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYWhhMjk0MFByb19zZXR1cDsKK3N0YXRpYyBhaGNfZGV2aWNlX3NldHVwX3QgYWhjX2FoYTM5NFhVX3NldHVwOworc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYWhhMzk4WFVfc2V0dXA7CitzdGF0aWMgYWhjX2RldmljZV9zZXR1cF90IGFoY19haWM3ODkwX3NldHVwOworc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYWljNzg5Ml9zZXR1cDsKK3N0YXRpYyBhaGNfZGV2aWNlX3NldHVwX3QgYWhjX2FpYzc4OTVfc2V0dXA7CitzdGF0aWMgYWhjX2RldmljZV9zZXR1cF90IGFoY19haWM3ODk2X3NldHVwOworc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYWljNzg5OV9zZXR1cDsKK3N0YXRpYyBhaGNfZGV2aWNlX3NldHVwX3QgYWhjX2FoYTI5MTYwQ19zZXR1cDsKK3N0YXRpYyBhaGNfZGV2aWNlX3NldHVwX3QgYWhjX3JhaWRfc2V0dXA7CitzdGF0aWMgYWhjX2RldmljZV9zZXR1cF90IGFoY19haGEzOTRYWF9zZXR1cDsKK3N0YXRpYyBhaGNfZGV2aWNlX3NldHVwX3QgYWhjX2FoYTQ5NFhYX3NldHVwOworc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYWhhMzk4WFhfc2V0dXA7CisKK3N0cnVjdCBhaGNfcGNpX2lkZW50aXR5IGFoY19wY2lfaWRlbnRfdGFibGUgW10gPQoreworCS8qIGFpYzc4NTAgYmFzZWQgY29udHJvbGxlcnMgKi8KKwl7CisJCUlEX0FIQV8yOTAyXzA0XzEwXzE1XzIwQ18zMEMsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAyOTAyLzA0LzEwLzE1LzIwQy8zMEMgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4NVhfc2V0dXAKKwl9LAorCS8qIGFpYzc4NjAgYmFzZWQgY29udHJvbGxlcnMgKi8KKwl7CisJCUlEX0FIQV8yOTMwQ1UsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAyOTMwQ1UgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4NjBfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzE0ODBBICYgSURfREVWX1ZFTkRPUl9NQVNLLAorCQlJRF9ERVZfVkVORE9SX01BU0ssCisJCSJBZGFwdGVjIDE0ODBBIFVsdHJhIFNDU0kgYWRhcHRlciIsCisJCWFoY19hcGExNDgwX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8yOTQwQVVfMCAmIElEX0RFVl9WRU5ET1JfTUFTSywKKwkJSURfREVWX1ZFTkRPUl9NQVNLLAorCQkiQWRhcHRlYyAyOTQwQSBVbHRyYSBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg2MF9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMjk0MEFVX0NOICYgSURfREVWX1ZFTkRPUl9NQVNLLAorCQlJRF9ERVZfVkVORE9SX01BU0ssCisJCSJBZGFwdGVjIDI5NDBBL0NOIFVsdHJhIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODYwX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8yOTMwQ19WQVIgJiBJRF9ERVZfVkVORE9SX01BU0ssCisJCUlEX0RFVl9WRU5ET1JfTUFTSywKKwkJIkFkYXB0ZWMgMjkzMEMgVWx0cmEgU0NTSSBhZGFwdGVyIChWQVIpIiwKKwkJYWhjX2FpYzc4NjBfc2V0dXAKKwl9LAorCS8qIGFpYzc4NzAgYmFzZWQgY29udHJvbGxlcnMgKi8KKwl7CisJCUlEX0FIQV8yOTQwLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjk0MCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg3MF9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMzk0MCwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDM5NDAgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FoYTM5NFhfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzM5OFgsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAzOThYIFNDU0kgUkFJRCBhZGFwdGVyIiwKKwkJYWhjX2FoYTM5OFhfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzI5NDQsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAyOTQ0IFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODcwX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8zOTQ0LAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMzk0NCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWhhMzk0WF9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfNDk0NCwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDQ5NDQgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FoYTQ5NFhfc2V0dXAKKwl9LAorCS8qIGFpYzc4ODAgYmFzZWQgY29udHJvbGxlcnMgKi8KKwl7CisJCUlEX0FIQV8yOTQwVSAmIElEX0RFVl9WRU5ET1JfTUFTSywKKwkJSURfREVWX1ZFTkRPUl9NQVNLLAorCQkiQWRhcHRlYyAyOTQwIFVsdHJhIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODgwX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8zOTQwVSAmIElEX0RFVl9WRU5ET1JfTUFTSywKKwkJSURfREVWX1ZFTkRPUl9NQVNLLAorCQkiQWRhcHRlYyAzOTQwIFVsdHJhIFNDU0kgYWRhcHRlciIsCisJCWFoY19haGEzOTRYVV9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMjk0NFUgJiBJRF9ERVZfVkVORE9SX01BU0ssCisJCUlEX0RFVl9WRU5ET1JfTUFTSywKKwkJIkFkYXB0ZWMgMjk0NCBVbHRyYSBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg4MF9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMzk0NFUgJiBJRF9ERVZfVkVORE9SX01BU0ssCisJCUlEX0RFVl9WRU5ET1JfTUFTSywKKwkJIkFkYXB0ZWMgMzk0NCBVbHRyYSBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWhhMzk0WFVfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzM5OFhVICYgSURfREVWX1ZFTkRPUl9NQVNLLAorCQlJRF9ERVZfVkVORE9SX01BU0ssCisJCSJBZGFwdGVjIDM5OFggVWx0cmEgU0NTSSBSQUlEIGFkYXB0ZXIiLAorCQlhaGNfYWhhMzk4WFVfc2V0dXAKKwl9LAorCXsKKwkJLyoKKwkJICogWFhYIERvbid0IGtub3cgdGhlIHNsb3QgbnVtYmVycworCQkgKiBzbyB3ZSBjYW4ndCBpZGVudGlmeSBjaGFubmVscworCQkgKi8KKwkJSURfQUhBXzQ5NDRVICYgSURfREVWX1ZFTkRPUl9NQVNLLAorCQlJRF9ERVZfVkVORE9SX01BU0ssCisJCSJBZGFwdGVjIDQ5NDQgVWx0cmEgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4ODBfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzI5MzBVICYgSURfREVWX1ZFTkRPUl9NQVNLLAorCQlJRF9ERVZfVkVORE9SX01BU0ssCisJCSJBZGFwdGVjIDI5MzAgVWx0cmEgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4ODBfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzI5NDBVX1BSTyAmIElEX0RFVl9WRU5ET1JfTUFTSywKKwkJSURfREVWX1ZFTkRPUl9NQVNLLAorCQkiQWRhcHRlYyAyOTQwIFBybyBVbHRyYSBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWhhMjk0MFByb19zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMjk0MFVfQ04gJiBJRF9ERVZfVkVORE9SX01BU0ssCisJCUlEX0RFVl9WRU5ET1JfTUFTSywKKwkJIkFkYXB0ZWMgMjk0MC9DTiBVbHRyYSBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg4MF9zZXR1cAorCX0sCisJLyogSWdub3JlIGFsbCBTSVNMIChBQUMgb24gTUIpIGJhc2VkIGNvbnRyb2xsZXJzLiAqLworCXsKKwkJSURfOTAwNV9TSVNMX0lELAorCQlJRF85MDA1X1NJU0xfTUFTSywKKwkJTlVMTCwKKwkJTlVMTAorCX0sCisJLyogYWljNzg5MCBiYXNlZCBjb250cm9sbGVycyAqLworCXsKKwkJSURfQUhBXzI5MzBVMiwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDI5MzAgVWx0cmEyIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODkwX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8yOTQwVTJCLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjk0MEIgVWx0cmEyIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODkwX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8yOTQwVTJfT0VNLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjk0MCBVbHRyYTIgU0NTSSBhZGFwdGVyIChPRU0pIiwKKwkJYWhjX2FpYzc4OTBfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzI5NDBVMiwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDI5NDAgVWx0cmEyIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODkwX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8yOTUwVTJCLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjk1MCBVbHRyYTIgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4OTBfc2V0dXAKKwl9LAorCXsKKwkJSURfQUlDNzg5MF9BUk8sCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODkwLzkxIFVsdHJhMiBTQ1NJIGFkYXB0ZXIgKEFSTykiLAorCQlhaGNfYWljNzg5MF9zZXR1cAorCX0sCisJeworCQlJRF9BQUFfMTMxVTIsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyBBQUEtMTMxIFVsdHJhMiBSQUlEIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg5MF9zZXR1cAorCX0sCisJLyogYWljNzg5MiBiYXNlZCBjb250cm9sbGVycyAqLworCXsKKwkJSURfQUhBXzI5MTYwLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjkxNjAgVWx0cmExNjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4OTJfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzI5MTYwX0NQUSwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIChDb21wYXEgT0VNKSAyOTE2MCBVbHRyYTE2MCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg5Ml9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMjkxNjBOLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjkxNjBOIFVsdHJhMTYwIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODkyX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8yOTE2MEMsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAyOTE2MEMgVWx0cmExNjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FoYTI5MTYwQ19zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMjkxNjBCLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjkxNjBCIFVsdHJhMTYwIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODkyX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8xOTE2MEIsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAxOTE2MEIgVWx0cmExNjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4OTJfc2V0dXAKKwl9LAorCXsKKwkJSURfQUlDNzg5Ml9BUk8sCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODkyIFVsdHJhMTYwIFNDU0kgYWRhcHRlciAoQVJPKSIsCisJCWFoY19haWM3ODkyX3NldHVwCisJfSwKKwkvKiBhaWM3ODk1IGJhc2VkIGNvbnRyb2xsZXJzICovCQorCXsKKwkJSURfQUhBXzI5NDBVX0RVQUwsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAyOTQwL0RVQUwgVWx0cmEgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4OTVfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzM5NDBBVSwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDM5NDBBIFVsdHJhIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODk1X3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8zOTQ0QVUsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAzOTQ0QSBVbHRyYSBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg5NV9zZXR1cAorCX0sCisJeworCQlJRF9BSUM3ODk1X0FSTywKKwkJSURfQUlDNzg5NV9BUk9fTUFTSywKKwkJIkFkYXB0ZWMgYWljNzg5NSBVbHRyYSBTQ1NJIGFkYXB0ZXIgKEFSTykiLAorCQlhaGNfYWljNzg5NV9zZXR1cAorCX0sCisJLyogYWljNzg5Ni85NyBiYXNlZCBjb250cm9sbGVycyAqLwkKKwl7CisJCUlEX0FIQV8zOTUwVTJCXzAsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAzOTUwQiBVbHRyYTIgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4OTZfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzM5NTBVMkJfMSwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDM5NTBCIFVsdHJhMiBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg5Nl9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMzk1MFUyRF8wLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMzk1MEQgVWx0cmEyIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODk2X3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8zOTUwVTJEXzEsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAzOTUwRCBVbHRyYTIgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4OTZfc2V0dXAKKwl9LAorCXsKKwkJSURfQUlDNzg5Nl9BUk8sCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODk2Lzk3IFVsdHJhMiBTQ1NJIGFkYXB0ZXIgKEFSTykiLAorCQlhaGNfYWljNzg5Nl9zZXR1cAorCX0sCisJLyogYWljNzg5OSBiYXNlZCBjb250cm9sbGVycyAqLwkKKwl7CisJCUlEX0FIQV8zOTYwRCwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDM5NjBEIFVsdHJhMTYwIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODk5X3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8zOTYwRF9DUFEsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAoQ29tcGFxIE9FTSkgMzk2MEQgVWx0cmExNjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4OTlfc2V0dXAKKwl9LAorCXsKKwkJSURfQUlDNzg5OV9BUk8sCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODk5IFVsdHJhMTYwIFNDU0kgYWRhcHRlciAoQVJPKSIsCisJCWFoY19haWM3ODk5X3NldHVwCisJfSwKKwkvKiBHZW5lcmljIGNoaXAgcHJvYmVzIGZvciBkZXZpY2VzIHdlIGRvbid0IGtub3cgJ2V4YWN0bHknICovCisJeworCQlJRF9BSUM3ODUwICYgSURfREVWX1ZFTkRPUl9NQVNLLAorCQlJRF9ERVZfVkVORE9SX01BU0ssCisJCSJBZGFwdGVjIGFpYzc4NTAgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4NVhfc2V0dXAKKwl9LAorCXsKKwkJSURfQUlDNzg1NSAmIElEX0RFVl9WRU5ET1JfTUFTSywKKwkJSURfREVWX1ZFTkRPUl9NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODU1IFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODVYX3NldHVwCisJfSwKKwl7CisJCUlEX0FJQzc4NTkgJiBJRF9ERVZfVkVORE9SX01BU0ssCisJCUlEX0RFVl9WRU5ET1JfTUFTSywKKwkJIkFkYXB0ZWMgYWljNzg1OSBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg2MF9zZXR1cAorCX0sCisJeworCQlJRF9BSUM3ODYwICYgSURfREVWX1ZFTkRPUl9NQVNLLAorCQlJRF9ERVZfVkVORE9SX01BU0ssCisJCSJBZGFwdGVjIGFpYzc4NjAgVWx0cmEgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4NjBfc2V0dXAKKwl9LAorCXsKKwkJSURfQUlDNzg3MCAmIElEX0RFVl9WRU5ET1JfTUFTSywKKwkJSURfREVWX1ZFTkRPUl9NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODcwIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODcwX3NldHVwCisJfSwKKwl7CisJCUlEX0FJQzc4ODAgJiBJRF9ERVZfVkVORE9SX01BU0ssCisJCUlEX0RFVl9WRU5ET1JfTUFTSywKKwkJIkFkYXB0ZWMgYWljNzg4MCBVbHRyYSBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg4MF9zZXR1cAorCX0sCisJeworCQlJRF9BSUM3ODkwICYgSURfOTAwNV9HRU5FUklDX01BU0ssCisJCUlEXzkwMDVfR0VORVJJQ19NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODkwLzkxIFVsdHJhMiBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg5MF9zZXR1cAorCX0sCisJeworCQlJRF9BSUM3ODkyICYgSURfOTAwNV9HRU5FUklDX01BU0ssCisJCUlEXzkwMDVfR0VORVJJQ19NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODkyIFVsdHJhMTYwIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODkyX3NldHVwCisJfSwKKwl7CisJCUlEX0FJQzc4OTUgJiBJRF9ERVZfVkVORE9SX01BU0ssCisJCUlEX0RFVl9WRU5ET1JfTUFTSywKKwkJIkFkYXB0ZWMgYWljNzg5NSBVbHRyYSBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg5NV9zZXR1cAorCX0sCisJeworCQlJRF9BSUM3ODk2ICYgSURfOTAwNV9HRU5FUklDX01BU0ssCisJCUlEXzkwMDVfR0VORVJJQ19NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODk2Lzk3IFVsdHJhMiBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg5Nl9zZXR1cAorCX0sCisJeworCQlJRF9BSUM3ODk5ICYgSURfOTAwNV9HRU5FUklDX01BU0ssCisJCUlEXzkwMDVfR0VORVJJQ19NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODk5IFVsdHJhMTYwIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODk5X3NldHVwCisJfSwKKwl7CisJCUlEX0FJQzc4MTAgJiBJRF9ERVZfVkVORE9SX01BU0ssCisJCUlEX0RFVl9WRU5ET1JfTUFTSywKKwkJIkFkYXB0ZWMgYWljNzgxMCBSQUlEIG1lbW9yeSBjb250cm9sbGVyIiwKKwkJYWhjX3JhaWRfc2V0dXAKKwl9LAorCXsKKwkJSURfQUlDNzgxNSAmIElEX0RFVl9WRU5ET1JfTUFTSywKKwkJSURfREVWX1ZFTkRPUl9NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODE1IFJBSUQgbWVtb3J5IGNvbnRyb2xsZXIiLAorCQlhaGNfcmFpZF9zZXR1cAorCX0KK307CisKK2NvbnN0IHVfaW50IGFoY19udW1fcGNpX2RldnMgPSBOVU1fRUxFTUVOVFMoYWhjX3BjaV9pZGVudF90YWJsZSk7CisJCQorI2RlZmluZSBBSENfMzk0WF9TTE9UX0NIQU5ORUxfQQk0CisjZGVmaW5lIEFIQ18zOTRYX1NMT1RfQ0hBTk5FTF9CCTUKKworI2RlZmluZSBBSENfMzk4WF9TTE9UX0NIQU5ORUxfQQk0CisjZGVmaW5lIEFIQ18zOThYX1NMT1RfQ0hBTk5FTF9CCTgKKyNkZWZpbmUgQUhDXzM5OFhfU0xPVF9DSEFOTkVMX0MJMTIKKworI2RlZmluZSBBSENfNDk0WF9TTE9UX0NIQU5ORUxfQQk0CisjZGVmaW5lIEFIQ180OTRYX1NMT1RfQ0hBTk5FTF9CCTUKKyNkZWZpbmUgQUhDXzQ5NFhfU0xPVF9DSEFOTkVMX0MJNgorI2RlZmluZSBBSENfNDk0WF9TTE9UX0NIQU5ORUxfRAk3CisKKyNkZWZpbmUJREVWQ09ORklHCQkweDQwCisjZGVmaW5lCQlQQ0lFUlJHRU5ESVMJMHg4MDAwMDAwMHVsCisjZGVmaW5lCQlTQ0JTSVpFMzIJMHgwMDAxMDAwMHVsCS8qIGFpYzc4OVggb25seSAqLworI2RlZmluZQkJUkVYVFZBTElECTB4MDAwMDEwMDB1bAkvKiB1bHRyYSBjYXJkcyBvbmx5ICovCisjZGVmaW5lCQlNUE9SVE1PREUJMHgwMDAwMDQwMHVsCS8qIGFpYzc4NzArIG9ubHkgKi8KKyNkZWZpbmUJCVJBTVBTTQkJMHgwMDAwMDIwMHVsCS8qIGFpYzc4NzArIG9ubHkgKi8KKyNkZWZpbmUJCVZPTFNFTlNFCTB4MDAwMDAxMDB1bAorI2RlZmluZQkJUENJNjRCSVQJMHgwMDAwMDA4MHVsCS8qIDY0Qml0IFBDSSBidXMgKFVsdHJhMiBPbmx5KSovCisjZGVmaW5lCQlTQ0JSQU1TRUwJMHgwMDAwMDA4MHVsCisjZGVmaW5lCQlNUkRDRU4JCTB4MDAwMDAwNDB1bAorI2RlZmluZQkJRVhUU0NCVElNRQkweDAwMDAwMDIwdWwJLyogYWljNzg3MCBvbmx5ICovCisjZGVmaW5lCQlFWFRTQ0JQRU4JMHgwMDAwMDAxMHVsCS8qIGFpYzc4NzAgb25seSAqLworI2RlZmluZQkJQkVSUkVOCQkweDAwMDAwMDA4dWwKKyNkZWZpbmUJCURBQ0VOCQkweDAwMDAwMDA0dWwKKyNkZWZpbmUJCVNUUFdMRVZFTAkweDAwMDAwMDAydWwKKyNkZWZpbmUJCURJRkFDVE5FR0VOCTB4MDAwMDAwMDF1bAkvKiBhaWM3ODcwIG9ubHkgKi8KKworI2RlZmluZQlDU0laRV9MQVRUSU1FCQkweDBjCisjZGVmaW5lCQlDQUNIRVNJWkUJMHgwMDAwMDAzZnVsCS8qIG9ubHkgNSBiaXRzICovCisjZGVmaW5lCQlMQVRUSU1FCQkweDAwMDBmZjAwdWwKKworLyogUENJIFNUQVRVUyBkZWZpbml0aW9ucyAqLworI2RlZmluZQlEUEUJMHg4MAorI2RlZmluZSBTU0UJMHg0MAorI2RlZmluZQlSTUEJMHgyMAorI2RlZmluZQlSVEEJMHgxMAorI2RlZmluZSBTVEEJMHgwOAorI2RlZmluZSBEUFIJMHgwMQorCitzdGF0aWMgaW50IGFoY185MDA1X3N1YmRldmluZm9fdmFsaWQodWludDE2X3QgdmVuZG9yLCB1aW50MTZfdCBkZXZpY2UsCisJCQkJICAgICB1aW50MTZfdCBzdWJ2ZW5kb3IsIHVpbnQxNl90IHN1YmRldmljZSk7CitzdGF0aWMgaW50IGFoY19leHRfc2NicmFtX3ByZXNlbnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyB2b2lkIGFoY19zY2JyYW1fY29uZmlnKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgaW50IGVuYWJsZSwKKwkJCQkgIGludCBwY2hlY2ssIGludCBmYXN0LCBpbnQgbGFyZ2UpOworc3RhdGljIHZvaWQgYWhjX3Byb2JlX2V4dF9zY2JyYW0oc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyB2b2lkIGNoZWNrX2V4dHBvcnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCAqc3hmcmN0bDEpOworc3RhdGljIHZvaWQgYWhjX3BhcnNlX3BjaV9lZXByb20oc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCSBzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgKnNjKTsKK3N0YXRpYyB2b2lkIGNvbmZpZ3VyZV90ZXJtaW5hdGlvbihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJICBzdHJ1Y3Qgc2VlcHJvbV9kZXNjcmlwdG9yICpzZCwKKwkJCQkgIHVfaW50IGFkYXB0ZXJfY29udHJvbCwKKwkgCQkJICB1X2ludCAqc3hmcmN0bDEpOworCitzdGF0aWMgdm9pZCBhaGNfbmV3X3Rlcm1fZGV0ZWN0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQlpbnQgKmVuYWJsZVNFQ19sb3csCisJCQkJaW50ICplbmFibGVTRUNfaGlnaCwKKwkJCQlpbnQgKmVuYWJsZVBSSV9sb3csCisJCQkJaW50ICplbmFibGVQUklfaGlnaCwKKwkJCQlpbnQgKmVlcHJvbV9wcmVzZW50KTsKK3N0YXRpYyB2b2lkIGFpYzc4N1hfY2FibGVfZGV0ZWN0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgaW50ICppbnRlcm5hbDUwX3ByZXNlbnQsCisJCQkJIGludCAqaW50ZXJuYWw2OF9wcmVzZW50LAorCQkJCSBpbnQgKmV4dGVybmFsY2FibGVfcHJlc2VudCwKKwkJCQkgaW50ICplZXByb21fcHJlc2VudCk7CitzdGF0aWMgdm9pZCBhaWM3ODVYX2NhYmxlX2RldGVjdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCAqaW50ZXJuYWw1MF9wcmVzZW50LAorCQkJCSBpbnQgKmV4dGVybmFsY2FibGVfcHJlc2VudCwKKwkJCQkgaW50ICplZXByb21fcHJlc2VudCk7CitzdGF0aWMgdm9pZCAgICB3cml0ZV9icmRjdGwoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1aW50OF90IHZhbHVlKTsKK3N0YXRpYyB1aW50OF90IHJlYWRfYnJkY3RsKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgdm9pZCBhaGNfcGNpX2ludHIoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyBpbnQgIGFoY19wY2lfY2hpcF9pbml0KHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgaW50ICBhaGNfcGNpX3N1c3BlbmQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyBpbnQgIGFoY19wY2lfcmVzdW1lKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CisKK3N0YXRpYyBpbnQKK2FoY185MDA1X3N1YmRldmluZm9fdmFsaWQodWludDE2X3QgZGV2aWNlLCB1aW50MTZfdCB2ZW5kb3IsCisJCQkgIHVpbnQxNl90IHN1YmRldmljZSwgdWludDE2X3Qgc3VidmVuZG9yKQoreworCWludCByZXN1bHQ7CisKKwkvKiBEZWZhdWx0IHRvIGludmFsaWQuICovCisJcmVzdWx0ID0gMDsKKwlpZiAodmVuZG9yID09IDB4OTAwNQorCSAmJiBzdWJ2ZW5kb3IgPT0gMHg5MDA1CisgICAgICAgICAmJiBzdWJkZXZpY2UgIT0gZGV2aWNlCisgICAgICAgICAmJiBTVUJJRF85MDA1X1RZUEVfS05PV04oc3ViZGV2aWNlKSAhPSAwKSB7CisKKwkJc3dpdGNoIChTVUJJRF85MDA1X1RZUEUoc3ViZGV2aWNlKSkgeworCQljYXNlIFNVQklEXzkwMDVfVFlQRV9NQjoKKwkJCWJyZWFrOworCQljYXNlIFNVQklEXzkwMDVfVFlQRV9DQVJEOgorCQljYXNlIFNVQklEXzkwMDVfVFlQRV9MQ0NBUkQ6CisJCQkvKgorCQkJICogQ3VycmVudGx5IG9ubHkgdHJ1c3QgQWRhcHRlYyBjYXJkcyB0bworCQkJICogZ2V0IHRoZSBzdWIgZGV2aWNlIGluZm8gY29ycmVjdC4KKwkJCSAqLworCQkJaWYgKERFVklEXzkwMDVfVFlQRShkZXZpY2UpID09IERFVklEXzkwMDVfVFlQRV9IQkEpCisJCQkJcmVzdWx0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFNVQklEXzkwMDVfVFlQRV9SQUlEOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gKHJlc3VsdCk7Cit9CisKK3N0cnVjdCBhaGNfcGNpX2lkZW50aXR5ICoKK2FoY19maW5kX3BjaV9kZXZpY2UoYWhjX2Rldl9zb2Z0Y190IHBjaSkKK3sKKwl1aW50NjRfdCAgZnVsbF9pZDsKKwl1aW50MTZfdCAgZGV2aWNlOworCXVpbnQxNl90ICB2ZW5kb3I7CisJdWludDE2X3QgIHN1YmRldmljZTsKKwl1aW50MTZfdCAgc3VidmVuZG9yOworCXN0cnVjdAkgIGFoY19wY2lfaWRlbnRpdHkgKmVudHJ5OworCXVfaW50CSAgaTsKKworCXZlbmRvciA9IGFoY19wY2lfcmVhZF9jb25maWcocGNpLCBQQ0lSX0RFVlZFTkRPUiwgLypieXRlcyovMik7CisJZGV2aWNlID0gYWhjX3BjaV9yZWFkX2NvbmZpZyhwY2ksIFBDSVJfREVWSUNFLCAvKmJ5dGVzKi8yKTsKKwlzdWJ2ZW5kb3IgPSBhaGNfcGNpX3JlYWRfY29uZmlnKHBjaSwgUENJUl9TVUJWRU5EXzAsIC8qYnl0ZXMqLzIpOworCXN1YmRldmljZSA9IGFoY19wY2lfcmVhZF9jb25maWcocGNpLCBQQ0lSX1NVQkRFVl8wLCAvKmJ5dGVzKi8yKTsKKwlmdWxsX2lkID0gYWhjX2NvbXBvc2VfaWQoZGV2aWNlLCB2ZW5kb3IsIHN1YmRldmljZSwgc3VidmVuZG9yKTsKKworCS8qCisJICogSWYgdGhlIHNlY29uZCBmdW5jdGlvbiBpcyBub3QgaG9va2VkIHVwLCBpZ25vcmUgaXQuCisJICogVW5mb3J0dW5hdGVseSwgbm90IGFsbCBNQiB2ZW5kb3JzIGltcGxlbWVudCB0aGUKKwkgKiBzdWJkZXZpY2UgSUQgYXMgcGVyIHRoZSBBZGFwdGVjIHNwZWMsIHNvIGRvIG91ciBiZXN0CisJICogdG8gc2FuaXR5IGNoZWNrIGl0IHByaW9yIHRvIGFjY2VwdGluZyB0aGUgc3ViZGV2aWNlCisJICogSUQgYXMgdmFsaWQuCisJICovCisJaWYgKGFoY19nZXRfcGNpX2Z1bmN0aW9uKHBjaSkgPiAwCisJICYmIGFoY185MDA1X3N1YmRldmluZm9fdmFsaWQodmVuZG9yLCBkZXZpY2UsIHN1YnZlbmRvciwgc3ViZGV2aWNlKQorCSAmJiBTVUJJRF85MDA1X01GVU5DRU5CKHN1YmRldmljZSkgPT0gMCkKKwkJcmV0dXJuIChOVUxMKTsKKworCWZvciAoaSA9IDA7IGkgPCBhaGNfbnVtX3BjaV9kZXZzOyBpKyspIHsKKwkJZW50cnkgPSAmYWhjX3BjaV9pZGVudF90YWJsZVtpXTsKKwkJaWYgKGVudHJ5LT5mdWxsX2lkID09IChmdWxsX2lkICYgZW50cnktPmlkX21hc2spKSB7CisJCQkvKiBIb25vciBleGNsdXNpb24gZW50cmllcy4gKi8KKwkJCWlmIChlbnRyeS0+bmFtZSA9PSBOVUxMKQorCQkJCXJldHVybiAoTlVMTCk7CisJCQlyZXR1cm4gKGVudHJ5KTsKKwkJfQorCX0KKwlyZXR1cm4gKE5VTEwpOworfQorCitpbnQKK2FoY19wY2lfY29uZmlnKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY19wY2lfaWRlbnRpdHkgKmVudHJ5KQoreworCXVfbG9uZwkgbDsKKwl1X2ludAkgY29tbWFuZDsKKwl1X2ludAkgb3VyX2lkOworCXVfaW50CSBzeGZyY3RsMTsKKwl1X2ludAkgc2NzaXNlcTsKKwl1X2ludAkgZHNjb21tYW5kMDsKKwl1aW50MzJfdCBkZXZjb25maWc7CisJaW50CSBlcnJvcjsKKwl1aW50OF90CSBzYmxrY3RsOworCisJb3VyX2lkID0gMDsKKwllcnJvciA9IGVudHJ5LT5zZXR1cChhaGMpOworCWlmIChlcnJvciAhPSAwKQorCQlyZXR1cm4gKGVycm9yKTsKKwlhaGMtPmNoaXAgfD0gQUhDX1BDSTsKKwlhaGMtPmRlc2NyaXB0aW9uID0gZW50cnktPm5hbWU7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKGFoYy0+ZGV2X3NvZnRjLCBBSENfUE9XRVJfU1RBVEVfRDApOworCisJZXJyb3IgPSBhaGNfcGNpX21hcF9yZWdpc3RlcnMoYWhjKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwkvKgorCSAqIEJlZm9yZSB3ZSBjb250aW51ZSBwcm9iaW5nIHRoZSBjYXJkLCBlbnN1cmUgdGhhdAorCSAqIGl0cyBpbnRlcnJ1cHRzIGFyZSAqZGlzYWJsZWQqLiAgV2UgZG9uJ3Qgd2FudAorCSAqIGEgbWlzc3RlcCB0byBoYW5nIHRoZSBtYWNoaW5lIGluIGFuIGludGVycnVwdAorCSAqIHN0b3JtLgorCSAqLworCWFoY19pbnRyX2VuYWJsZShhaGMsIEZBTFNFKTsKKworCWRldmNvbmZpZyA9IGFoY19wY2lfcmVhZF9jb25maWcoYWhjLT5kZXZfc29mdGMsIERFVkNPTkZJRywgLypieXRlcyovNCk7CisKKwkvKgorCSAqIElmIHdlIG5lZWQgdG8gc3VwcG9ydCBoaWdoIG1lbW9yeSwgZW5hYmxlIGR1YWwKKwkgKiBhZGRyZXNzIGN5Y2xlcy4gIFRoaXMgYml0IG11c3QgYmUgc2V0IHRvIGVuYWJsZQorCSAqIGhpZ2ggYWRkcmVzcyBiaXQgZ2VuZXJhdGlvbiBldmVuIGlmIHdlIGFyZSBvbiBhCisJICogNjRiaXQgYnVzIChQQ0k2NEJJVCBzZXQgaW4gZGV2Y29uZmlnKS4KKwkgKi8KKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfMzlCSVRfQUREUkVTU0lORykgIT0gMCkgeworCisJCWlmIChib290dmVyYm9zZSkKKwkJCXByaW50ZigiJXM6IEVuYWJsaW5nIDM5Qml0IEFkZHJlc3NpbmdcbiIsCisJCQkgICAgICAgYWhjX25hbWUoYWhjKSk7CisJCWRldmNvbmZpZyB8PSBEQUNFTjsKKwl9CisJCisJLyogRW5zdXJlIHRoYXQgcGNpIGVycm9yIGdlbmVyYXRpb24sIGEgdGVzdCBmZWF0dXJlLCBpcyBkaXNhYmxlZC4gKi8KKwlkZXZjb25maWcgfD0gUENJRVJSR0VORElTOworCisJYWhjX3BjaV93cml0ZV9jb25maWcoYWhjLT5kZXZfc29mdGMsIERFVkNPTkZJRywgZGV2Y29uZmlnLCAvKmJ5dGVzKi80KTsKKworCS8qIEVuc3VyZSBidXNtYXN0ZXJpbmcgaXMgZW5hYmxlZCAqLworCWNvbW1hbmQgPSBhaGNfcGNpX3JlYWRfY29uZmlnKGFoYy0+ZGV2X3NvZnRjLCBQQ0lSX0NPTU1BTkQsIC8qYnl0ZXMqLzIpOworCWNvbW1hbmQgfD0gUENJTV9DTURfQlVTTUFTVEVSRU47CisKKwlhaGNfcGNpX3dyaXRlX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywgUENJUl9DT01NQU5ELCBjb21tYW5kLCAvKmJ5dGVzKi8yKTsKKworCS8qIE9uIGFsbCBQQ0kgYWRhcHRlcnMsIHdlIGFsbG93IFNDQiBwYWdpbmcgKi8KKwlhaGMtPmZsYWdzIHw9IEFIQ19QQUdFU0NCUzsKKworCWVycm9yID0gYWhjX3NvZnRjX2luaXQoYWhjKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwkvKgorCSAqIERpc2FibGUgUENJIHBhcml0eSBlcnJvciBjaGVja2luZy4gIFVzZXJzIHR5cGljYWxseQorCSAqIGRvIHRoaXMgdG8gd29yayBhcm91bmQgYnJva2VuIFBDSSBjaGlwc2V0cyB0aGF0IGdldAorCSAqIHRoZSBwYXJpdHkgdGltaW5nIHdyb25nIGFuZCB0aHVzIGdlbmVyYXRlIGxvdHMgb2Ygc3B1cmlvdXMKKwkgKiBlcnJvcnMuICBUaGUgY2hpcCBvbmx5IGFsbG93cyB1cyB0byBkaXNhYmxlICphbGwqIHBhcml0eQorCSAqIGVycm9yIHJlcG9ydGluZyB3aGVuIGRvaW5nIHRoaXMsIHNvIENJTyBidXMsIHNjYiByYW0sIGFuZAorCSAqIHNjcmF0Y2ggcmFtIHBhcml0eSBlcnJvcnMgd2lsbCBiZSBpZ25vcmVkIHRvby4KKwkgKi8KKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfRElTQUJMRV9QQ0lfUEVSUikgIT0gMCkKKwkJYWhjLT5zZXFjdGwgfD0gRkFJTERJUzsKKworCWFoYy0+YnVzX2ludHIgPSBhaGNfcGNpX2ludHI7CisJYWhjLT5idXNfY2hpcF9pbml0ID0gYWhjX3BjaV9jaGlwX2luaXQ7CisJYWhjLT5idXNfc3VzcGVuZCA9IGFoY19wY2lfc3VzcGVuZDsKKwlhaGMtPmJ1c19yZXN1bWUgPSBhaGNfcGNpX3Jlc3VtZTsKKworCS8qIFJlbWViZXIgaG93IHRoZSBjYXJkIHdhcyBzZXR1cCBpbiBjYXNlIHRoZXJlIGlzIG5vIFNFRVBST00gKi8KKwlpZiAoKGFoY19pbmIoYWhjLCBIQ05UUkwpICYgUE9XUkROKSA9PSAwKSB7CisJCWFoY19wYXVzZShhaGMpOworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKQorCQkJb3VyX2lkID0gYWhjX2luYihhaGMsIFNDU0lJRF9VTFRSQTIpICYgT0lEOworCQllbHNlCisJCQlvdXJfaWQgPSBhaGNfaW5iKGFoYywgU0NTSUlEKSAmIE9JRDsKKwkJc3hmcmN0bDEgPSBhaGNfaW5iKGFoYywgU1hGUkNUTDEpICYgU1RQV0VOOworCQlzY3Npc2VxID0gYWhjX2luYihhaGMsIFNDU0lTRVEpOworCX0gZWxzZSB7CisJCXN4ZnJjdGwxID0gU1RQV0VOOworCQlvdXJfaWQgPSA3OworCQlzY3Npc2VxID0gMDsKKwl9CisKKwllcnJvciA9IGFoY19yZXNldChhaGMsIC8qcmVpbml0Ki9GQUxTRSk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoRU5YSU8pOworCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0RUKSAhPSAwKSB7CisJCXVfaW50IHNmdW5jdDsKKworCQkvKiBQZXJmb3JtIEFMVC1Nb2RlIFNldHVwICovCisJCXNmdW5jdCA9IGFoY19pbmIoYWhjLCBTRlVOQ1QpICYgfkFMVF9NT0RFOworCQlhaGNfb3V0YihhaGMsIFNGVU5DVCwgc2Z1bmN0IHwgQUxUX01PREUpOworCQlhaGNfb3V0YihhaGMsIE9QVElPTk1PREUsCisJCQkgT1BUSU9OTU9ERV9ERUZBVUxUU3xBVVRPQUNLRU58QlVTRlJFRVJFVnxFWFBQSEFTRURJUyk7CisJCWFoY19vdXRiKGFoYywgU0ZVTkNULCBzZnVuY3QpOworCisJCS8qIE5vcm1hbCBtb2RlIHNldHVwICovCisJCWFoY19vdXRiKGFoYywgQ1JDQ09OVFJPTDEsIENSQ1ZBTENIS0VOfENSQ0VORENIS0VOfENSQ1JFUUNIS0VOCisJCQkJCSAgfFRBUkdDUkNFTkRFTik7CisJfQorCisJZHNjb21tYW5kMCA9IGFoY19pbmIoYWhjLCBEU0NPTU1BTkQwKTsKKwlkc2NvbW1hbmQwIHw9IE1QQVJDS0VOfENBQ0hFVEhFTjsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisKKwkJLyoKKwkJICogRFBBUkNLRU4gZG9lc24ndCB3b3JrIGNvcnJlY3RseSBvbgorCQkgKiBzb21lIE1CcyBzbyBkb24ndCB1c2UgaXQuCisJCSAqLworCQlkc2NvbW1hbmQwICY9IH5EUEFSQ0tFTjsKKwl9CisKKwkvKgorCSAqIEhhbmRsZSBjaGlwcyB0aGF0IG11c3QgaGF2ZSBjYWNoZSBsaW5lCisJICogc3RyZWFtaW5nIChkaXMvZW4pYWJsZWQuCisJICovCisJaWYgKChhaGMtPmJ1Z3MgJiBBSENfQ0FDSEVUSEVOX0RJU19CVUcpICE9IDApCisJCWRzY29tbWFuZDAgfD0gQ0FDSEVUSEVOOworCisJaWYgKChhaGMtPmJ1Z3MgJiBBSENfQ0FDSEVUSEVOX0JVRykgIT0gMCkKKwkJZHNjb21tYW5kMCAmPSB+Q0FDSEVUSEVOOworCisJYWhjX291dGIoYWhjLCBEU0NPTU1BTkQwLCBkc2NvbW1hbmQwKTsKKworCWFoYy0+cGNpX2NhY2hlc2l6ZSA9CisJICAgIGFoY19wY2lfcmVhZF9jb25maWcoYWhjLT5kZXZfc29mdGMsIENTSVpFX0xBVFRJTUUsCisJCQkJLypieXRlcyovMSkgJiBDQUNIRVNJWkU7CisJYWhjLT5wY2lfY2FjaGVzaXplICo9IDQ7CisKKwlpZiAoKGFoYy0+YnVncyAmIEFIQ19QQ0lfMl8xX1JFVFJZX0JVRykgIT0gMAorCSAmJiBhaGMtPnBjaV9jYWNoZXNpemUgPT0gNCkgeworCisJCWFoY19wY2lfd3JpdGVfY29uZmlnKGFoYy0+ZGV2X3NvZnRjLCBDU0laRV9MQVRUSU1FLAorCQkJCSAgICAgMCwgLypieXRlcyovMSk7CisJCWFoYy0+cGNpX2NhY2hlc2l6ZSA9IDA7CisJfQorCisJLyoKKwkgKiBXZSBjYW5ub3QgcGVyZm9ybSBVTFRSQSBzcGVlZHMgd2l0aG91dCB0aGUgcHJlc2Vuc2UKKwkgKiBvZiB0aGUgZXh0ZXJuYWwgcHJlY2lzaW9uIHJlc2lzdG9yLgorCSAqLworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQSkgIT0gMCkgeworCQl1aW50MzJfdCBkZXZjb25maWc7CisKKwkJZGV2Y29uZmlnID0gYWhjX3BjaV9yZWFkX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywKKwkJCQkJCURFVkNPTkZJRywgLypieXRlcyovNCk7CisJCWlmICgoZGV2Y29uZmlnICYgUkVYVFZBTElEKSA9PSAwKQorCQkJYWhjLT5mZWF0dXJlcyAmPSB+QUhDX1VMVFJBOworCX0KKworCS8qIFNlZSBpZiB3ZSBoYXZlIGEgU0VFUFJPTSBhbmQgcGVyZm9ybSBhdXRvLXRlcm0gKi8KKwljaGVja19leHRwb3J0KGFoYywgJnN4ZnJjdGwxKTsKKworCS8qCisJICogVGFrZSB0aGUgTEVEIG91dCBvZiBkaWFnbm9zdGljIG1vZGUKKwkgKi8KKwlzYmxrY3RsID0gYWhjX2luYihhaGMsIFNCTEtDVEwpOworCWFoY19vdXRiKGFoYywgU0JMS0NUTCwgKHNibGtjdGwgJiB+KERJQUdMRURFTnxESUFHTEVET04pKSk7CisKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCWFoY19vdXRiKGFoYywgREZGX1RIUlNILCBSRF9ERlRIUlNIX01BWHxXUl9ERlRIUlNIX01BWCk7CisJfSBlbHNlIHsKKwkJYWhjX291dGIoYWhjLCBEU1BDSVNUQVRVUywgREZUSFJTSF8xMDApOworCX0KKworCWlmIChhaGMtPmZsYWdzICYgQUhDX1VTRURFRkFVTFRTKSB7CisJCS8qCisJCSAqIFBDSSBBZGFwdGVyIGRlZmF1bHQgc2V0dXAKKwkJICogU2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB0aGUgYWRhcHRlciBkb2VzIG5vdCBoYXZlCisJCSAqIGEgU0VFUFJPTS4KKwkJICovCisJCS8qIFNlZSBpZiBzb21lb25lIGVsc2Ugc2V0IHVzIHVwIGFscmVhZHkgKi8KKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX05PX0JJT1NfSU5JVCkgPT0gMAorCQkgJiYgc2NzaXNlcSAhPSAwKSB7CisJCQlwcmludGYoIiVzOiBVc2luZyBsZWZ0IG92ZXIgQklPUyBzZXR0aW5nc1xuIiwKKwkJCQlhaGNfbmFtZShhaGMpKTsKKwkJCWFoYy0+ZmxhZ3MgJj0gfkFIQ19VU0VERUZBVUxUUzsKKwkJCWFoYy0+ZmxhZ3MgfD0gQUhDX0JJT1NfRU5BQkxFRDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBBc3N1bWUgb25seSBvbmUgY29ubmVjdG9yIGFuZCBhbHdheXMgdHVybgorCQkJICogb24gdGVybWluYXRpb24uCisJCQkgKi8KKyAJCQlvdXJfaWQgPSAweDA3OworCQkJc3hmcmN0bDEgPSBTVFBXRU47CisJCX0KKwkJYWhjX291dGIoYWhjLCBTQ1NJQ09ORiwgb3VyX2lkfEVOU1BDSEt8UkVTRVRfU0NTSSk7CisKKwkJYWhjLT5vdXJfaWQgPSBvdXJfaWQ7CisJfQorCisJLyoKKwkgKiBUYWtlIGEgbG9vayB0byBzZWUgaWYgd2UgaGF2ZSBleHRlcm5hbCBTUkFNLgorCSAqIFdlIGN1cnJlbnRseSBkbyBub3QgYXR0ZW1wdCB0byB1c2UgU1JBTSB0aGF0IGlzCisJICogc2hhcmVkIGFtb25nIG11bHRpcGxlIGNvbnRyb2xsZXJzLgorCSAqLworCWFoY19wcm9iZV9leHRfc2NicmFtKGFoYyk7CisKKwkvKgorCSAqIFJlY29yZCBvdXIgdGVybWluYXRpb24gc2V0dGluZyBmb3IgdGhlCisJICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiByb3V0aW5lLgorCSAqLworCWlmICgoc3hmcmN0bDEgJiBTVFBXRU4pICE9IDApCisJCWFoYy0+ZmxhZ3MgfD0gQUhDX1RFUk1fRU5CX0E7CisKKwkvKgorCSAqIFNhdmUgY2hpcCByZWdpc3RlciBjb25maWd1cmF0aW9uIGRhdGEgZm9yIGNoaXAgcmVzZXRzCisJICogdGhhdCBvY2N1ciBkdXJpbmcgcnVudGltZSBhbmQgcmVzdW1lIGV2ZW50cy4KKwkgKi8KKwlhaGMtPmJ1c19zb2Z0Yy5wY2lfc29mdGMuZGV2Y29uZmlnID0KKwkgICAgYWhjX3BjaV9yZWFkX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywgREVWQ09ORklHLCAvKmJ5dGVzKi80KTsKKwlhaGMtPmJ1c19zb2Z0Yy5wY2lfc29mdGMuY29tbWFuZCA9CisJICAgIGFoY19wY2lfcmVhZF9jb25maWcoYWhjLT5kZXZfc29mdGMsIFBDSVJfQ09NTUFORCwgLypieXRlcyovMSk7CisJYWhjLT5idXNfc29mdGMucGNpX3NvZnRjLmNzaXplX2xhdHRpbWUgPQorCSAgICBhaGNfcGNpX3JlYWRfY29uZmlnKGFoYy0+ZGV2X3NvZnRjLCBDU0laRV9MQVRUSU1FLCAvKmJ5dGVzKi8xKTsKKwlhaGMtPmJ1c19zb2Z0Yy5wY2lfc29mdGMuZHNjb21tYW5kMCA9IGFoY19pbmIoYWhjLCBEU0NPTU1BTkQwKTsKKwlhaGMtPmJ1c19zb2Z0Yy5wY2lfc29mdGMuZHNwY2lzdGF0dXMgPSBhaGNfaW5iKGFoYywgRFNQQ0lTVEFUVVMpOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgIT0gMCkgeworCQl1X2ludCBzZnVuY3Q7CisKKwkJc2Z1bmN0ID0gYWhjX2luYihhaGMsIFNGVU5DVCkgJiB+QUxUX01PREU7CisJCWFoY19vdXRiKGFoYywgU0ZVTkNULCBzZnVuY3QgfCBBTFRfTU9ERSk7CisJCWFoYy0+YnVzX3NvZnRjLnBjaV9zb2Z0Yy5vcHRpb25tb2RlID0gYWhjX2luYihhaGMsIE9QVElPTk1PREUpOworCQlhaGMtPmJ1c19zb2Z0Yy5wY2lfc29mdGMudGFyZ2NyY2NudCA9IGFoY19pbncoYWhjLCBUQVJHQ1JDQ05UKTsKKwkJYWhjX291dGIoYWhjLCBTRlVOQ1QsIHNmdW5jdCk7CisJCWFoYy0+YnVzX3NvZnRjLnBjaV9zb2Z0Yy5jcmNjb250cm9sMSA9CisJCSAgICBhaGNfaW5iKGFoYywgQ1JDQ09OVFJPTDEpOworCX0KKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfTVVMVElfRlVOQykgIT0gMCkKKwkJYWhjLT5idXNfc29mdGMucGNpX3NvZnRjLnNjYmJhZGRyID0gYWhjX2luYihhaGMsIFNDQkJBRERSKTsKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisJCWFoYy0+YnVzX3NvZnRjLnBjaV9zb2Z0Yy5kZmZfdGhyc2ggPSBhaGNfaW5iKGFoYywgREZGX1RIUlNIKTsKKworCS8qIENvcmUgaW5pdGlhbGl6YXRpb24gKi8KKwllcnJvciA9IGFoY19pbml0KGFoYyk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOworCisJLyoKKwkgKiBBbGxvdyBpbnRlcnJ1cHRzIG5vdyB0aGF0IHdlIGFyZSBjb21wbGV0ZWx5IHNldHVwLgorCSAqLworCWVycm9yID0gYWhjX3BjaV9tYXBfaW50KGFoYyk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOworCisJYWhjX2xpc3RfbG9jaygmbCk7CisJLyoKKwkgKiBMaW5rIHRoaXMgc29mdGMgaW4gd2l0aCBhbGwgb3RoZXIgYWhjIGluc3RhbmNlcy4KKwkgKi8KKwlhaGNfc29mdGNfaW5zZXJ0KGFoYyk7CisJYWhjX2xpc3RfdW5sb2NrKCZsKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogVGVzdCBmb3IgdGhlIHByZXNlbnNlIG9mIGV4dGVybmFsIHNyYW0gaW4gYW4KKyAqICJ1bnNoYXJlZCIgY29uZmlndXJhdGlvbi4KKyAqLworc3RhdGljIGludAorYWhjX2V4dF9zY2JyYW1fcHJlc2VudChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJdV9pbnQgY2hpcDsKKwlpbnQgcmFtcHM7CisJaW50IHNpbmdsZV91c2VyOworCXVpbnQzMl90IGRldmNvbmZpZzsKKworCWNoaXAgPSBhaGMtPmNoaXAgJiBBSENfQ0hJUElEX01BU0s7CisJZGV2Y29uZmlnID0gYWhjX3BjaV9yZWFkX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywKKwkJCQkJREVWQ09ORklHLCAvKmJ5dGVzKi80KTsKKwlzaW5nbGVfdXNlciA9IChkZXZjb25maWcgJiBNUE9SVE1PREUpICE9IDA7CisKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKQorCQlyYW1wcyA9IChhaGNfaW5iKGFoYywgRFNDT01NQU5EMCkgJiBSQU1QUykgIT0gMDsKKwllbHNlIGlmIChjaGlwID09IEFIQ19BSUM3ODk1IHx8IGNoaXAgPT0gQUhDX0FJQzc4OTVDKQorCQkvKgorCQkgKiBFeHRlcm5hbCBTQ0JSQU0gYXJiaXRyYXRpb24gaXMgZmxha2V5CisJCSAqIG9uIHRoZXNlIGNoaXBzLiAgVW5mb3J0dW5hdGVseSB0aGlzIG1lYW5zCisJCSAqIHdlIGRvbid0IHVzZSB0aGUgZXh0cmEgU0NCIHJhbSBzcGFjZSBvbiB0aGUKKwkJICogMzk0MEFVVy4KKwkJICovCisJCXJhbXBzID0gMDsKKwllbHNlIGlmIChjaGlwID49IEFIQ19BSUM3ODcwKQorCQlyYW1wcyA9IChkZXZjb25maWcgJiBSQU1QU00pICE9IDA7CisJZWxzZQorCQlyYW1wcyA9IDA7CisKKwlpZiAocmFtcHMgJiYgc2luZ2xlX3VzZXIpCisJCXJldHVybiAoMSk7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIEVuYWJsZSBleHRlcm5hbCBzY2JyYW0uCisgKi8KK3N0YXRpYyB2b2lkCithaGNfc2NicmFtX2NvbmZpZyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCBlbmFibGUsIGludCBwY2hlY2ssCisJCSAgaW50IGZhc3QsIGludCBsYXJnZSkKK3sKKwl1aW50MzJfdCBkZXZjb25maWc7CisKKwlpZiAoYWhjLT5mZWF0dXJlcyAmIEFIQ19NVUxUSV9GVU5DKSB7CisJCS8qCisJCSAqIFNldCB0aGUgU0NCIEJhc2UgYWRkciAoaGlnaGVzdCBhZGRyZXNzIGJpdCkKKwkJICogZGVwZW5kaW5nIG9uIHdoaWNoIGNoYW5uZWwgd2UgYXJlLgorCQkgKi8KKwkJYWhjX291dGIoYWhjLCBTQ0JCQUREUiwgYWhjX2dldF9wY2lfZnVuY3Rpb24oYWhjLT5kZXZfc29mdGMpKTsKKwl9CisKKwlhaGMtPmZsYWdzICY9IH5BSENfTFNDQlNfRU5BQkxFRDsKKwlpZiAobGFyZ2UpCisJCWFoYy0+ZmxhZ3MgfD0gQUhDX0xTQ0JTX0VOQUJMRUQ7CisJZGV2Y29uZmlnID0gYWhjX3BjaV9yZWFkX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywgREVWQ09ORklHLCAvKmJ5dGVzKi80KTsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCXVfaW50IGRzY29tbWFuZDA7CisKKwkJZHNjb21tYW5kMCA9IGFoY19pbmIoYWhjLCBEU0NPTU1BTkQwKTsKKwkJaWYgKGVuYWJsZSkKKwkJCWRzY29tbWFuZDAgJj0gfklOVFNDQlJBTVNFTDsKKwkJZWxzZQorCQkJZHNjb21tYW5kMCB8PSBJTlRTQ0JSQU1TRUw7CisJCWlmIChsYXJnZSkKKwkJCWRzY29tbWFuZDAgJj0gflVTQ0JTSVpFMzI7CisJCWVsc2UKKwkJCWRzY29tbWFuZDAgfD0gVVNDQlNJWkUzMjsKKwkJYWhjX291dGIoYWhjLCBEU0NPTU1BTkQwLCBkc2NvbW1hbmQwKTsKKwl9IGVsc2UgeworCQlpZiAoZmFzdCkKKwkJCWRldmNvbmZpZyAmPSB+RVhUU0NCVElNRTsKKwkJZWxzZQorCQkJZGV2Y29uZmlnIHw9IEVYVFNDQlRJTUU7CisJCWlmIChlbmFibGUpCisJCQlkZXZjb25maWcgJj0gflNDQlJBTVNFTDsKKwkJZWxzZQorCQkJZGV2Y29uZmlnIHw9IFNDQlJBTVNFTDsKKwkJaWYgKGxhcmdlKQorCQkJZGV2Y29uZmlnICY9IH5TQ0JTSVpFMzI7CisJCWVsc2UKKwkJCWRldmNvbmZpZyB8PSBTQ0JTSVpFMzI7CisJfQorCWlmIChwY2hlY2spCisJCWRldmNvbmZpZyB8PSBFWFRTQ0JQRU47CisJZWxzZQorCQlkZXZjb25maWcgJj0gfkVYVFNDQlBFTjsKKworCWFoY19wY2lfd3JpdGVfY29uZmlnKGFoYy0+ZGV2X3NvZnRjLCBERVZDT05GSUcsIGRldmNvbmZpZywgLypieXRlcyovNCk7Cit9CisKKy8qCisgKiBUYWtlIGEgbG9vayB0byBzZWUgaWYgd2UgaGF2ZSBleHRlcm5hbCBTUkFNLgorICogV2UgY3VycmVudGx5IGRvIG5vdCBhdHRlbXB0IHRvIHVzZSBTUkFNIHRoYXQgaXMKKyAqIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBjb250cm9sbGVycy4KKyAqLworc3RhdGljIHZvaWQKK2FoY19wcm9iZV9leHRfc2NicmFtKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlpbnQgbnVtX3NjYnM7CisJaW50IHRlc3RfbnVtX3NjYnM7CisJaW50IGVuYWJsZTsKKwlpbnQgcGNoZWNrOworCWludCBmYXN0OworCWludCBsYXJnZTsKKworCWVuYWJsZSA9IEZBTFNFOworCXBjaGVjayA9IEZBTFNFOworCWZhc3QgPSBGQUxTRTsKKwlsYXJnZSA9IEZBTFNFOworCW51bV9zY2JzID0gMDsKKwkKKwlpZiAoYWhjX2V4dF9zY2JyYW1fcHJlc2VudChhaGMpID09IDApCisJCWdvdG8gZG9uZTsKKworCS8qCisJICogUHJvYmUgZm9yIHRoZSBiZXN0IHBhcmFtZXRlcnMgdG8gdXNlLgorCSAqLworCWFoY19zY2JyYW1fY29uZmlnKGFoYywgLyplbmFibGUqL1RSVUUsIHBjaGVjaywgZmFzdCwgbGFyZ2UpOworCW51bV9zY2JzID0gYWhjX3Byb2JlX3NjYnMoYWhjKTsKKwlpZiAobnVtX3NjYnMgPT0gMCkgeworCQkvKiBUaGUgU1JBTSB3YXNuJ3QgcmVhbGx5IHByZXNlbnQuICovCisJCWdvdG8gZG9uZTsKKwl9CisJZW5hYmxlID0gVFJVRTsKKworCS8qCisJICogQ2xlYXIgYW55IG91dHN0YW5kaW5nIHBhcml0eSBlcnJvcgorCSAqIGFuZCBlbnN1cmUgdGhhdCBwYXJpdHkgZXJyb3IgcmVwb3J0aW5nCisJICogaXMgZW5hYmxlZC4KKwkgKi8KKwlhaGNfb3V0YihhaGMsIFNFUUNUTCwgMCk7CisJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUlBBUkVSUik7CisJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUkJSS0FEUklOVCk7CisKKwkvKiBOb3cgc2VlIGlmIHdlIGNhbiBkbyBwYXJpdHkgKi8KKwlhaGNfc2NicmFtX2NvbmZpZyhhaGMsIGVuYWJsZSwgLypwY2hlY2sqL1RSVUUsIGZhc3QsIGxhcmdlKTsKKwludW1fc2NicyA9IGFoY19wcm9iZV9zY2JzKGFoYyk7CisJaWYgKChhaGNfaW5iKGFoYywgSU5UU1RBVCkgJiBCUktBRFJJTlQpID09IDAKKwkgfHwgKGFoY19pbmIoYWhjLCBFUlJPUikgJiBNUEFSRVJSKSA9PSAwKQorCQlwY2hlY2sgPSBUUlVFOworCisJLyogQ2xlYXIgYW55IHJlc3VsdGluZyBwYXJpdHkgZXJyb3IgKi8KKwlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSUEFSRVJSKTsKKwlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSQlJLQURSSU5UKTsKKworCS8qIE5vdyBzZWUgaWYgd2UgY2FuIGRvIGZhc3QgdGltaW5nICovCisJYWhjX3NjYnJhbV9jb25maWcoYWhjLCBlbmFibGUsIHBjaGVjaywgLypmYXN0Ki9UUlVFLCBsYXJnZSk7CisJdGVzdF9udW1fc2NicyA9IGFoY19wcm9iZV9zY2JzKGFoYyk7CisJaWYgKHRlc3RfbnVtX3NjYnMgPT0gbnVtX3NjYnMKKwkgJiYgKChhaGNfaW5iKGFoYywgSU5UU1RBVCkgJiBCUktBRFJJTlQpID09IDAKKwkgIHx8IChhaGNfaW5iKGFoYywgRVJST1IpICYgTVBBUkVSUikgPT0gMCkpCisJCWZhc3QgPSBUUlVFOworCisJLyoKKwkgKiBTZWUgaWYgd2UgY2FuIHVzZSBsYXJnZSBTQ0JzIGFuZCBzdGlsbCBtYWludGFpbgorCSAqIHRoZSBzYW1lIG92ZXJhbGwgY291bnQgb2YgU0NCcy4KKwkgKi8KKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfTEFSR0VfU0NCUykgIT0gMCkgeworCQlhaGNfc2NicmFtX2NvbmZpZyhhaGMsIGVuYWJsZSwgcGNoZWNrLCBmYXN0LCAvKmxhcmdlKi9UUlVFKTsKKwkJdGVzdF9udW1fc2NicyA9IGFoY19wcm9iZV9zY2JzKGFoYyk7CisJCWlmICh0ZXN0X251bV9zY2JzID49IG51bV9zY2JzKSB7CisJCQlsYXJnZSA9IFRSVUU7CisJCQludW1fc2NicyA9IHRlc3RfbnVtX3NjYnM7CisJIAkJaWYgKG51bV9zY2JzID49IDY0KSB7CisJCQkJLyoKKwkJCQkgKiBXZSBoYXZlIGVub3VnaCBzcGFjZSB0byBtb3ZlIHRoZQorCQkJCSAqICJidXN5IHRhcmdldHMgdGFibGUiIGludG8gU0NCIHNwYWNlCisJCQkJICogYW5kIG1ha2UgaXQgcXVhbGlmeSBhbGwgdGhlIHdheSB0byB0aGUKKwkJCQkgKiBsdW4gbGV2ZWwuCisJCQkJICovCisJCQkJYWhjLT5mbGFncyB8PSBBSENfU0NCX0JUVDsKKwkJCX0KKwkJfQorCX0KK2RvbmU6CisJLyoKKwkgKiBEaXNhYmxlIHBhcml0eSBlcnJvciByZXBvcnRpbmcgdW50aWwgd2UKKwkgKiBjYW4gbG9hZCBpbnN0cnVjdGlvbiByYW0uCisJICovCisJYWhjX291dGIoYWhjLCBTRVFDVEwsIFBFUlJPUkRJU3xGQUlMRElTKTsKKwkvKiBDbGVhciBhbnkgbGF0Y2hlZCBwYXJpdHkgZXJyb3IgKi8KKwlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSUEFSRVJSKTsKKwlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSQlJLQURSSU5UKTsKKwlpZiAoYm9vdHZlcmJvc2UgJiYgZW5hYmxlKSB7CisJCXByaW50ZigiJXM6IEV4dGVybmFsIFNSQU0sICVzIGFjY2VzcyVzLCAlZGJ5dGVzL1NDQlxuIiwKKwkJICAgICAgIGFoY19uYW1lKGFoYyksIGZhc3QgPyAiZmFzdCIgOiAic2xvdyIsIAorCQkgICAgICAgcGNoZWNrID8gIiwgcGFyaXR5IGNoZWNraW5nIGVuYWJsZWQiIDogIiIsCisJCSAgICAgICBsYXJnZSA/IDY0IDogMzIpOworCX0KKwlhaGNfc2NicmFtX2NvbmZpZyhhaGMsIGVuYWJsZSwgcGNoZWNrLCBmYXN0LCBsYXJnZSk7Cit9CisKKy8qCisgKiBQZXJmb3JtIHNvbWUgc2ltcGxlIHRlc3RzIHRoYXQgc2hvdWxkIGNhdGNoIHNpdHVhdGlvbnMgd2hlcmUKKyAqIG91ciByZWdpc3RlcnMgYXJlIGludmFsaWRseSBtYXBwZWQuCisgKi8KK2ludAorYWhjX3BjaV90ZXN0X3JlZ2lzdGVyX2FjY2VzcyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJaW50CSBlcnJvcjsKKwl1X2ludAkgc3RhdHVzMTsKKwl1aW50MzJfdCBjbWQ7CisJdWludDhfdAkgaGNudHJsOworCisJZXJyb3IgPSBFSU87CisKKwkvKgorCSAqIEVuYWJsZSBQQ0kgZXJyb3IgaW50ZXJydXB0IHN0YXR1cywgYnV0IHN1cHByZXNzIE5NSXMKKwkgKiBnZW5lcmF0ZWQgYnkgU0VSUiByYWlzZWQgZHVlIHRvIHRhcmdldCBhYm9ydHMuCisJICovCisJY21kID0gYWhjX3BjaV9yZWFkX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywgUENJUl9DT01NQU5ELCAvKmJ5dGVzKi8yKTsKKwlhaGNfcGNpX3dyaXRlX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywgUENJUl9DT01NQU5ELAorCQkJICAgICBjbWQgJiB+UENJTV9DTURfU0VSUkVTUEVOLCAvKmJ5dGVzKi8yKTsKKworCS8qCisJICogRmlyc3QgYSBzaW1wbGUgdGVzdCB0byBzZWUgaWYgYW55CisJICogcmVnaXN0ZXJzIGNhbiBiZSByZWFkLiAgUmVhZGluZworCSAqIEhDTlRSTCBoYXMgbm8gc2lkZSBlZmZlY3RzIGFuZCBoYXMKKwkgKiBhdCBsZWFzdCBvbmUgYml0IHRoYXQgaXMgZ3VhcmFudGVlZCB0bworCSAqIGJlIHplcm8gc28gaXQgaXMgYSBnb29kIHJlZ2lzdGVyIHRvCisJICogdXNlIGZvciB0aGlzIHRlc3QuCisJICovCisJaGNudHJsID0gYWhjX2luYihhaGMsIEhDTlRSTCk7CisJaWYgKGhjbnRybCA9PSAweEZGKQorCQlnb3RvIGZhaWw7CisKKwkvKgorCSAqIE5leHQgY3JlYXRlIGEgc2l0dWF0aW9uIHdoZXJlIHdyaXRlIGNvbWJpbmluZworCSAqIG9yIHJlYWQgcHJlZmV0Y2hpbmcgY291bGQgYmUgaW5pdGlhdGVkIGJ5IHRoZQorCSAqIENQVSBvciBob3N0IGJyaWRnZS4gIE91ciBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydAorCSAqIGVpdGhlciwgc28gbG9vayBmb3IgZGF0YSBjb3JydXB0aW9uIGFuZC9vciBmbGFnZ2VkCisJICogUENJIGVycm9ycy4gIEZpcnN0IHBhdXNlIHdpdGhvdXQgY2F1c2luZyBhbm90aGVyCisJICogY2hpcCByZXNldC4KKwkgKi8KKwloY250cmwgJj0gfkNISVBSU1Q7CisJYWhjX291dGIoYWhjLCBIQ05UUkwsIGhjbnRybHxQQVVTRSk7CisJd2hpbGUgKGFoY19pc19wYXVzZWQoYWhjKSA9PSAwKQorCQk7CisKKwkvKiBDbGVhciBhbnkgUENJIGVycm9ycyB0aGF0IG9jY3VycmVkIGJlZm9yZSBvdXIgZHJpdmVyIGF0dGFjaGVkLiAqLworCXN0YXR1czEgPSBhaGNfcGNpX3JlYWRfY29uZmlnKGFoYy0+ZGV2X3NvZnRjLAorCQkJCSAgICAgIFBDSVJfU1RBVFVTICsgMSwgLypieXRlcyovMSk7CisJYWhjX3BjaV93cml0ZV9jb25maWcoYWhjLT5kZXZfc29mdGMsIFBDSVJfU1RBVFVTICsgMSwKKwkJCSAgICAgc3RhdHVzMSwgLypieXRlcyovMSk7CisJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUlBBUkVSUik7CisKKwlhaGNfb3V0YihhaGMsIFNFUUNUTCwgUEVSUk9SRElTKTsKKwlhaGNfb3V0YihhaGMsIFNDQlBUUiwgMCk7CisJYWhjX291dGwoYWhjLCBTQ0JfQkFTRSwgMHg1YWE1NTVhYSk7CisJaWYgKGFoY19pbmwoYWhjLCBTQ0JfQkFTRSkgIT0gMHg1YWE1NTVhYSkKKwkJZ290byBmYWlsOworCisJc3RhdHVzMSA9IGFoY19wY2lfcmVhZF9jb25maWcoYWhjLT5kZXZfc29mdGMsCisJCQkJICAgICAgUENJUl9TVEFUVVMgKyAxLCAvKmJ5dGVzKi8xKTsKKwlpZiAoKHN0YXR1czEgJiBTVEEpICE9IDApCisJCWdvdG8gZmFpbDsKKworCWVycm9yID0gMDsKKworZmFpbDoKKwkvKiBTaWxlbnRseSBjbGVhciBhbnkgbGF0Y2hlZCBlcnJvcnMuICovCisJc3RhdHVzMSA9IGFoY19wY2lfcmVhZF9jb25maWcoYWhjLT5kZXZfc29mdGMsCisJCQkJICAgICAgUENJUl9TVEFUVVMgKyAxLCAvKmJ5dGVzKi8xKTsKKwlhaGNfcGNpX3dyaXRlX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywgUENJUl9TVEFUVVMgKyAxLAorCQkJICAgICBzdGF0dXMxLCAvKmJ5dGVzKi8xKTsKKwlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSUEFSRVJSKTsKKwlhaGNfb3V0YihhaGMsIFNFUUNUTCwgUEVSUk9SRElTfEZBSUxESVMpOworCWFoY19wY2lfd3JpdGVfY29uZmlnKGFoYy0+ZGV2X3NvZnRjLCBQQ0lSX0NPTU1BTkQsIGNtZCwgLypieXRlcyovMik7CisJcmV0dXJuIChlcnJvcik7Cit9CisKKy8qCisgKiBDaGVjayB0aGUgZXh0ZXJuYWwgcG9ydCBsb2dpYyBmb3IgYSBzZXJpYWwgZWVwcm9tCisgKiBhbmQgdGVybWluYXRpb24vY2FibGUgZGV0ZWN0aW9uIGNvbnRybHMuCisgKi8KK3N0YXRpYyB2b2lkCitjaGVja19leHRwb3J0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgKnN4ZnJjdGwxKQoreworCXN0cnVjdAlzZWVwcm9tX2Rlc2NyaXB0b3Igc2Q7CisJc3RydWN0CXNlZXByb21fY29uZmlnICpzYzsKKwlpbnQJaGF2ZV9zZWVwcm9tOworCWludAloYXZlX2F1dG90ZXJtOworCisJc2Quc2RfYWhjID0gYWhjOworCXNkLnNkX2NvbnRyb2xfb2Zmc2V0ID0gU0VFQ1RMOwkJCisJc2Quc2Rfc3RhdHVzX29mZnNldCA9IFNFRUNUTDsJCQorCXNkLnNkX2RhdGFvdXRfb2Zmc2V0ID0gU0VFQ1RMOwkJCisJc2MgPSBhaGMtPnNlZXBfY29uZmlnOworCisJLyoKKwkgKiBGb3Igc29tZSBtdWx0aS1jaGFubmVsIGRldmljZXMsIHRoZSBjNDYgaXMgc2ltcGx5IHRvbworCSAqIHNtYWxsIHRvIHdvcmsuICBGb3IgdGhlIG90aGVyIGNvbnRyb2xsZXIgdHlwZXMsIHdlIGNhbgorCSAqIGdldCBvdXIgaW5mb3JtYXRpb24gZnJvbSBlaXRoZXIgU0VFUFJPTSB0eXBlLiAgU2V0IHRoZQorCSAqIHR5cGUgdG8gc3RhcnQgb3VyIHByb2JlIHdpdGggYWNjb3JkaW5nbHkuCisJICovCisJaWYgKGFoYy0+ZmxhZ3MgJiBBSENfTEFSR0VfU0VFUFJPTSkKKwkJc2Quc2RfY2hpcCA9IEM1Nl82NjsKKwllbHNlCisJCXNkLnNkX2NoaXAgPSBDNDY7CisKKwlzZC5zZF9NUyA9IFNFRU1TOworCXNkLnNkX1JEWSA9IFNFRVJEWTsKKwlzZC5zZF9DUyA9IFNFRUNTOworCXNkLnNkX0NLID0gU0VFQ0s7CisJc2Quc2RfRE8gPSBTRUVETzsKKwlzZC5zZF9ESSA9IFNFRURJOworCisJaGF2ZV9zZWVwcm9tID0gYWhjX2FjcXVpcmVfc2VlcHJvbShhaGMsICZzZCk7CisJaWYgKGhhdmVfc2VlcHJvbSkgeworCisJCWlmIChib290dmVyYm9zZSkgCisJCQlwcmludGYoIiVzOiBSZWFkaW5nIFNFRVBST00uLi4iLCBhaGNfbmFtZShhaGMpKTsKKworCQlmb3IgKDs7KSB7CisJCQl1X2ludCBzdGFydF9hZGRyOworCisJCQlzdGFydF9hZGRyID0gMzIgKiAoYWhjLT5jaGFubmVsIC0gJ0EnKTsKKworCQkJaGF2ZV9zZWVwcm9tID0gYWhjX3JlYWRfc2VlcHJvbSgmc2QsICh1aW50MTZfdCAqKXNjLAorCQkJCQkJCXN0YXJ0X2FkZHIsCisJCQkJCQkJc2l6ZW9mKCpzYykvMik7CisKKwkJCWlmIChoYXZlX3NlZXByb20pCisJCQkJaGF2ZV9zZWVwcm9tID0gYWhjX3ZlcmlmeV9ja3N1bShzYyk7CisKKwkJCWlmIChoYXZlX3NlZXByb20gIT0gMCB8fCBzZC5zZF9jaGlwID09IEM1Nl82NikgeworCQkJCWlmIChib290dmVyYm9zZSkgeworCQkJCQlpZiAoaGF2ZV9zZWVwcm9tID09IDApCisJCQkJCQlwcmludGYgKCJjaGVja3N1bSBlcnJvclxuIik7CisJCQkJCWVsc2UKKwkJCQkJCXByaW50ZiAoImRvbmUuXG4iKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlzZC5zZF9jaGlwID0gQzU2XzY2OworCQl9CisJCWFoY19yZWxlYXNlX3NlZXByb20oJnNkKTsKKwl9CisKKwlpZiAoIWhhdmVfc2VlcHJvbSkgeworCQkvKgorCQkgKiBQdWxsIHNjcmF0Y2ggcmFtIHNldHRpbmdzIGFuZCB0cmVhdCB0aGVtIGFzCisJCSAqIGlmIHRoZXkgYXJlIHRoZSBjb250ZW50cyBvZiBhbiBzZWVwcm9tIGlmCisJCSAqIHRoZSAnQURQVCcgc2lnbmF0dXJlIGlzIGZvdW5kIGluIFNDQjIuCisJCSAqIFdlIG1hbnVhbGx5IGNvbXBvc2UgdGhlIGRhdGEgYXMgMTZiaXQgdmFsdWVzCisJCSAqIHRvIGF2b2lkIGVuZGlhbiBpc3N1ZXMuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgMik7CisJCWlmIChhaGNfaW5iKGFoYywgU0NCX0JBU0UpID09ICdBJworCQkgJiYgYWhjX2luYihhaGMsIFNDQl9CQVNFICsgMSkgPT0gJ0QnCisJCSAmJiBhaGNfaW5iKGFoYywgU0NCX0JBU0UgKyAyKSA9PSAnUCcKKwkJICYmIGFoY19pbmIoYWhjLCBTQ0JfQkFTRSArIDMpID09ICdUJykgeworCQkJdWludDE2X3QgKnNjX2RhdGE7CisJCQlpbnQJICBpOworCisJCQlzY19kYXRhID0gKHVpbnQxNl90ICopc2M7CisJCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKywgc2NfZGF0YSsrKSB7CisJCQkJaW50CWo7CisKKwkJCQlqID0gaSAqIDI7CisJCQkJKnNjX2RhdGEgPSBhaGNfaW5iKGFoYywgU1JBTV9CQVNFICsgaikKKwkJCQkJIHwgYWhjX2luYihhaGMsIFNSQU1fQkFTRSArIGogKyAxKSA8PCA4OworCQkJfQorCQkJaGF2ZV9zZWVwcm9tID0gYWhjX3ZlcmlmeV9ja3N1bShzYyk7CisJCQlpZiAoaGF2ZV9zZWVwcm9tKQorCQkJCWFoYy0+ZmxhZ3MgfD0gQUhDX1NDQl9DT05GSUdfVVNFRDsKKwkJfQorCQkvKgorCQkgKiBDbGVhciBhbnkgU0NCIHBhcml0eSBlcnJvcnMgaW4gY2FzZSB0aGlzIGRhdGEgYW5kCisJCSAqIGl0cyBhc3NvY2lhdGVkIHBhcml0eSB3YXMgbm90IGluaXRpYWxpemVkIGJ5IHRoZSBCSU9TCisJCSAqLworCQlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSUEFSRVJSKTsKKwkJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUkJSS0FEUklOVCk7CisJfQorCisJaWYgKCFoYXZlX3NlZXByb20pIHsKKwkJaWYgKGJvb3R2ZXJib3NlKQorCQkJcHJpbnRmKCIlczogTm8gU0VFUFJPTSBhdmFpbGFibGUuXG4iLCBhaGNfbmFtZShhaGMpKTsKKwkJYWhjLT5mbGFncyB8PSBBSENfVVNFREVGQVVMVFM7CisJCWZyZWUoYWhjLT5zZWVwX2NvbmZpZywgTV9ERVZCVUYpOworCQlhaGMtPnNlZXBfY29uZmlnID0gTlVMTDsKKwkJc2MgPSBOVUxMOworCX0gZWxzZSB7CisJCWFoY19wYXJzZV9wY2lfZWVwcm9tKGFoYywgc2MpOworCX0KKworCS8qCisJICogQ2FyZHMgdGhhdCBoYXZlIHRoZSBleHRlcm5hbCBsb2dpYyBuZWNlc3NhcnkgdG8gdGFsayB0bworCSAqIGEgU0VFUFJPTSwgYXJlIGFsbW9zdCBjZXJ0YWluIHRvIGhhdmUgdGhlIHJlbWFpbmluZyBsb2dpYworCSAqIG5lY2Vzc2FyeSBmb3IgYXV0by10ZXJtaW5hdGlvbiBjb250cm9sLiAgVGhpcyBhc3N1bXB0aW9uCisJICogaGFzbid0IGZhaWxlZCB5ZXQuLi4KKwkgKi8KKwloYXZlX2F1dG90ZXJtID0gaGF2ZV9zZWVwcm9tOworCisJLyoKKwkgKiBTb21lIGxvdy1jb3N0IGNoaXBzIGhhdmUgU0VFUFJPTSBhbmQgYXV0by10ZXJtIGNvbnRyb2wgYnVpbHQKKwkgKiBpbiwgaW5zdGVhZCBvZiB1c2luZyBhIEdBTC4gIFRoZXkgY2FuIHRlbGwgdXMgZGlyZWN0bHkKKwkgKiBpZiB0aGUgdGVybWluYXRpb24gbG9naWMgaXMgZW5hYmxlZC4KKwkgKi8KKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfU1BJT0NBUCkgIT0gMCkgeworCQlpZiAoKGFoY19pbmIoYWhjLCBTUElPQ0FQKSAmIFNTUElPQ1BTKSA9PSAwKQorCQkJaGF2ZV9hdXRvdGVybSA9IEZBTFNFOworCX0KKworCWlmIChoYXZlX2F1dG90ZXJtKSB7CisJCWFoYy0+ZmxhZ3MgfD0gQUhDX0hBU19URVJNX0xPR0lDOworCQlhaGNfYWNxdWlyZV9zZWVwcm9tKGFoYywgJnNkKTsKKwkJY29uZmlndXJlX3Rlcm1pbmF0aW9uKGFoYywgJnNkLCBzYy0+YWRhcHRlcl9jb250cm9sLCBzeGZyY3RsMSk7CisJCWFoY19yZWxlYXNlX3NlZXByb20oJnNkKTsKKwl9IGVsc2UgaWYgKGhhdmVfc2VlcHJvbSkgeworCQkqc3hmcmN0bDEgJj0gflNUUFdFTjsKKwkJaWYgKChzYy0+YWRhcHRlcl9jb250cm9sICYgQ0ZTVEVSTSkgIT0gMCkKKwkJCSpzeGZyY3RsMSB8PSBTVFBXRU47CisJCWlmIChib290dmVyYm9zZSkKKwkJCXByaW50ZigiJXM6IExvdyBieXRlIHRlcm1pbmF0aW9uICVzYWJsZWRcbiIsCisJCQkgICAgICAgYWhjX25hbWUoYWhjKSwKKwkJCSAgICAgICAoKnN4ZnJjdGwxICYgU1RQV0VOKSA/ICJlbiIgOiAiZGlzIik7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWhjX3BhcnNlX3BjaV9lZXByb20oc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgKnNjKQoreworCS8qCisJICogUHV0IHRoZSBkYXRhIHdlJ3ZlIGNvbGxlY3RlZCBkb3duIGludG8gU1JBTQorCSAqIHdoZXJlIGFoY19pbml0IHdpbGwgZmluZCBpdC4KKwkgKi8KKwlpbnQJIGk7CisJaW50CSBtYXhfdGFyZyA9IHNjLT5tYXhfdGFyZ2V0cyAmIENGTUFYVEFSRzsKKwl1X2ludAkgc2NzaV9jb25mOworCXVpbnQxNl90IGRpc2NlbmFibGU7CisJdWludDE2X3QgdWx0cmFlbmI7CisKKwlkaXNjZW5hYmxlID0gMDsKKwl1bHRyYWVuYiA9IDA7CisJaWYgKChzYy0+YWRhcHRlcl9jb250cm9sICYgQ0ZVTFRSQUVOKSAhPSAwKSB7CisJCS8qCisJCSAqIERldGVybWluZSBpZiB0aGlzIGFkYXB0ZXIgaGFzIGEgIm5ld3N0eWxlIgorCQkgKiBTRUVQUk9NIGZvcm1hdC4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBtYXhfdGFyZzsgaSsrKSB7CisJCQlpZiAoKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRlNZTkNISVNVTFRSQSkgIT0gMCkgeworCQkJCWFoYy0+ZmxhZ3MgfD0gQUhDX05FV0VFUFJPTV9GTVQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X3Rhcmc7IGkrKykgeworCQl1X2ludCAgICAgc2NzaXJhdGU7CisJCXVpbnQxNl90IHRhcmdldF9tYXNrOworCisJCXRhcmdldF9tYXNrID0gMHgwMSA8PCBpOworCQlpZiAoc2MtPmRldmljZV9mbGFnc1tpXSAmIENGRElTQykKKwkJCWRpc2NlbmFibGUgfD0gdGFyZ2V0X21hc2s7CisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19ORVdFRVBST01fRk1UKSAhPSAwKSB7CisJCQlpZiAoKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRlNZTkNISVNVTFRSQSkgIT0gMCkKKwkJCQl1bHRyYWVuYiB8PSB0YXJnZXRfbWFzazsKKwkJfSBlbHNlIGlmICgoc2MtPmFkYXB0ZXJfY29udHJvbCAmIENGVUxUUkFFTikgIT0gMCkgeworCQkJdWx0cmFlbmIgfD0gdGFyZ2V0X21hc2s7CisJCX0KKwkJaWYgKChzYy0+ZGV2aWNlX2ZsYWdzW2ldICYgQ0ZYRkVSKSA9PSAweDA0CisJCSAmJiAodWx0cmFlbmIgJiB0YXJnZXRfbWFzaykgIT0gMCkgeworCQkJLyogVHJlYXQgMTBNSHogYXMgYSBub24tdWx0cmEgc3BlZWQgKi8KKwkJCXNjLT5kZXZpY2VfZmxhZ3NbaV0gJj0gfkNGWEZFUjsKKwkJIAl1bHRyYWVuYiAmPSB+dGFyZ2V0X21hc2s7CisJCX0KKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQkJdV9pbnQgb2Zmc2V0OworCisJCQlpZiAoc2MtPmRldmljZV9mbGFnc1tpXSAmIENGU1lOQ0gpCisJCQkJb2Zmc2V0ID0gTUFYX09GRlNFVF9VTFRSQTI7CisJCQllbHNlIAorCQkJCW9mZnNldCA9IDA7CisJCQlhaGNfb3V0YihhaGMsIFRBUkdfT0ZGU0VUICsgaSwgb2Zmc2V0KTsKKworCQkJLyoKKwkJCSAqIFRoZSB1bHRyYSBlbmFibGUgYml0cyBjb250YWluIHRoZQorCQkJICogaGlnaCBiaXQgb2YgdGhlIHVsdHJhMiBzeW5jIHJhdGUKKwkJCSAqIGZpZWxkLgorCQkJICovCisJCQlzY3NpcmF0ZSA9IChzYy0+ZGV2aWNlX2ZsYWdzW2ldICYgQ0ZYRkVSKQorCQkJCSB8ICgodWx0cmFlbmIgJiB0YXJnZXRfbWFzaykgPyAweDggOiAweDApOworCQkJaWYgKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRldJREVCKQorCQkJCXNjc2lyYXRlIHw9IFdJREVYRkVSOworCQl9IGVsc2UgeworCQkJc2NzaXJhdGUgPSAoc2MtPmRldmljZV9mbGFnc1tpXSAmIENGWEZFUikgPDwgNDsKKwkJCWlmIChzYy0+ZGV2aWNlX2ZsYWdzW2ldICYgQ0ZTWU5DSCkKKwkJCQlzY3NpcmF0ZSB8PSBTT0ZTOworCQkJaWYgKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRldJREVCKQorCQkJCXNjc2lyYXRlIHw9IFdJREVYRkVSOworCQl9CisJCWFoY19vdXRiKGFoYywgVEFSR19TQ1NJUkFURSArIGksIHNjc2lyYXRlKTsKKwl9CisJYWhjLT5vdXJfaWQgPSBzYy0+YnJ0aW1lX2lkICYgQ0ZTQ1NJSUQ7CisKKwlzY3NpX2NvbmYgPSAoYWhjLT5vdXJfaWQgJiAweDcpOworCWlmIChzYy0+YWRhcHRlcl9jb250cm9sICYgQ0ZTUEFSSVRZKQorCQlzY3NpX2NvbmYgfD0gRU5TUENISzsKKwlpZiAoc2MtPmFkYXB0ZXJfY29udHJvbCAmIENGUkVTRVRCKQorCQlzY3NpX2NvbmYgfD0gUkVTRVRfU0NTSTsKKworCWFoYy0+ZmxhZ3MgfD0gKHNjLT5hZGFwdGVyX2NvbnRyb2wgJiBDRkJPT1RDSEFOKSA+PiBDRkJPT1RDSEFOU0hJRlQ7CisKKwlpZiAoc2MtPmJpb3NfY29udHJvbCAmIENGRVhURU5EKQorCQlhaGMtPmZsYWdzIHw9IEFIQ19FWFRFTkRFRF9UUkFOU19BOworCisJaWYgKHNjLT5iaW9zX2NvbnRyb2wgJiBDRkJJT1NFTikKKwkJYWhjLT5mbGFncyB8PSBBSENfQklPU19FTkFCTEVEOworCWlmIChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBCisJICYmIChhaGMtPmZsYWdzICYgQUhDX05FV0VFUFJPTV9GTVQpID09IDApIHsKKwkJLyogU2hvdWxkIHdlIGVuYWJsZSBVbHRyYSBtb2RlPyAqLworCQlpZiAoIShzYy0+YWRhcHRlcl9jb250cm9sICYgQ0ZVTFRSQUVOKSkKKwkJCS8qIFRyZWF0IHVzIGFzIGEgbm9uLXVsdHJhIGNhcmQgKi8KKwkJCXVsdHJhZW5iID0gMDsKKwl9CisKKwlpZiAoc2MtPnNpZ25hdHVyZSA9PSBDRlNJR05BVFVSRQorCSB8fCBzYy0+c2lnbmF0dXJlID09IENGU0lHTkFUVVJFMikgeworCQl1aW50MzJfdCBkZXZjb25maWc7CisKKwkJLyogSG9ub3IgdGhlIFNUUFdMRVZFTCBzZXR0aW5ncyAqLworCQlkZXZjb25maWcgPSBhaGNfcGNpX3JlYWRfY29uZmlnKGFoYy0+ZGV2X3NvZnRjLAorCQkJCQkJREVWQ09ORklHLCAvKmJ5dGVzKi80KTsKKwkJZGV2Y29uZmlnICY9IH5TVFBXTEVWRUw7CisJCWlmICgoc2MtPmJpb3NfY29udHJvbCAmIENGU1RQV0xFVkVMKSAhPSAwKQorCQkJZGV2Y29uZmlnIHw9IFNUUFdMRVZFTDsKKwkJYWhjX3BjaV93cml0ZV9jb25maWcoYWhjLT5kZXZfc29mdGMsIERFVkNPTkZJRywKKwkJCQkgICAgIGRldmNvbmZpZywgLypieXRlcyovNCk7CisJfQorCS8qIFNldCBTQ1NJQ09ORiBpbmZvICovCisJYWhjX291dGIoYWhjLCBTQ1NJQ09ORiwgc2NzaV9jb25mKTsKKwlhaGNfb3V0YihhaGMsIERJU0NfRFNCLCB+KGRpc2NlbmFibGUgJiAweGZmKSk7CisJYWhjX291dGIoYWhjLCBESVNDX0RTQiArIDEsIH4oKGRpc2NlbmFibGUgPj4gOCkgJiAweGZmKSk7CisJYWhjX291dGIoYWhjLCBVTFRSQV9FTkIsIHVsdHJhZW5iICYgMHhmZik7CisJYWhjX291dGIoYWhjLCBVTFRSQV9FTkIgKyAxLCAodWx0cmFlbmIgPj4gOCkgJiAweGZmKTsKK30KKworc3RhdGljIHZvaWQKK2NvbmZpZ3VyZV90ZXJtaW5hdGlvbihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCSAgICAgIHN0cnVjdCBzZWVwcm9tX2Rlc2NyaXB0b3IgKnNkLAorCQkgICAgICB1X2ludCBhZGFwdGVyX2NvbnRyb2wsCisJCSAgICAgIHVfaW50ICpzeGZyY3RsMSkKK3sKKwl1aW50OF90IGJyZGRhdDsKKwkKKwlicmRkYXQgPSAwOworCisJLyoKKwkgKiBVcGRhdGUgdGhlIHNldHRpbmdzIGluIHN4ZnJjdGwxIHRvIG1hdGNoIHRoZQorCSAqIHRlcm1pbmF0aW9uIHNldHRpbmdzIAorCSAqLworCSpzeGZyY3RsMSA9IDA7CisJCisJLyoKKwkgKiBTRUVDUyBtdXN0IGJlIG9uIGZvciB0aGUgR0FMUyB0byBsYXRjaAorCSAqIHRoZSBkYXRhIHByb3Blcmx5LiAgQmUgc3VyZSB0byBsZWF2ZSBNUworCSAqIG9uIG9yIHdlIHdpbGwgcmVsZWFzZSB0aGUgc2VlcHJvbS4KKwkgKi8KKwlTRUVQUk9NX09VVEIoc2QsIHNkLT5zZF9NUyB8IHNkLT5zZF9DUyk7CisJaWYgKChhZGFwdGVyX2NvbnRyb2wgJiBDRkFVVE9URVJNKSAhPSAwCisJIHx8IChhaGMtPmZlYXR1cmVzICYgQUhDX05FV19URVJNQ1RMKSAhPSAwKSB7CisJCWludCBpbnRlcm5hbDUwX3ByZXNlbnQ7CisJCWludCBpbnRlcm5hbDY4X3ByZXNlbnQ7CisJCWludCBleHRlcm5hbGNhYmxlX3ByZXNlbnQ7CisJCWludCBlZXByb21fcHJlc2VudDsKKwkJaW50IGVuYWJsZVNFQ19sb3c7CisJCWludCBlbmFibGVTRUNfaGlnaDsKKwkJaW50IGVuYWJsZVBSSV9sb3c7CisJCWludCBlbmFibGVQUklfaGlnaDsKKwkJaW50IHN1bTsKKworCQllbmFibGVTRUNfbG93ID0gMDsKKwkJZW5hYmxlU0VDX2hpZ2ggPSAwOworCQllbmFibGVQUklfbG93ID0gMDsKKwkJZW5hYmxlUFJJX2hpZ2ggPSAwOworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfTkVXX1RFUk1DVEwpICE9IDApIHsKKwkJCWFoY19uZXdfdGVybV9kZXRlY3QoYWhjLCAmZW5hYmxlU0VDX2xvdywKKwkJCQkJICAgICZlbmFibGVTRUNfaGlnaCwKKwkJCQkJICAgICZlbmFibGVQUklfbG93LAorCQkJCQkgICAgJmVuYWJsZVBSSV9oaWdoLAorCQkJCQkgICAgJmVlcHJvbV9wcmVzZW50KTsKKwkJCWlmICgoYWRhcHRlcl9jb250cm9sICYgQ0ZTRUFVVE9URVJNKSA9PSAwKSB7CisJCQkJaWYgKGJvb3R2ZXJib3NlKQorCQkJCQlwcmludGYoIiVzOiBNYW51YWwgU0UgVGVybWluYXRpb25cbiIsCisJCQkJCSAgICAgICBhaGNfbmFtZShhaGMpKTsKKwkJCQllbmFibGVTRUNfbG93ID0gKGFkYXB0ZXJfY29udHJvbCAmIENGU0VMT1dURVJNKTsKKwkJCQllbmFibGVTRUNfaGlnaCA9CisJCQkJICAgIChhZGFwdGVyX2NvbnRyb2wgJiBDRlNFSElHSFRFUk0pOworCQkJfQorCQkJaWYgKChhZGFwdGVyX2NvbnRyb2wgJiBDRkFVVE9URVJNKSA9PSAwKSB7CisJCQkJaWYgKGJvb3R2ZXJib3NlKQorCQkJCQlwcmludGYoIiVzOiBNYW51YWwgTFZEIFRlcm1pbmF0aW9uXG4iLAorCQkJCQkgICAgICAgYWhjX25hbWUoYWhjKSk7CisJCQkJZW5hYmxlUFJJX2xvdyA9IChhZGFwdGVyX2NvbnRyb2wgJiBDRlNURVJNKTsKKwkJCQllbmFibGVQUklfaGlnaCA9IChhZGFwdGVyX2NvbnRyb2wgJiBDRldTVEVSTSk7CisJCQl9CisJCQkvKiBNYWtlIHRoZSB0YWJsZSBjYWxjdWxhdGlvbnMgYmVsb3cgaGFwcHkgKi8KKwkJCWludGVybmFsNTBfcHJlc2VudCA9IDA7CisJCQlpbnRlcm5hbDY4X3ByZXNlbnQgPSAxOworCQkJZXh0ZXJuYWxjYWJsZV9wcmVzZW50ID0gMTsKKwkJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19TUElPQ0FQKSAhPSAwKSB7CisJCQlhaWM3ODVYX2NhYmxlX2RldGVjdChhaGMsICZpbnRlcm5hbDUwX3ByZXNlbnQsCisJCQkJCSAgICAgJmV4dGVybmFsY2FibGVfcHJlc2VudCwKKwkJCQkJICAgICAmZWVwcm9tX3ByZXNlbnQpOworCQkJLyogQ2FuIG5ldmVyIHN1cHBvcnQgYSB3aWRlIGNvbm5lY3Rvci4gKi8KKwkJCWludGVybmFsNjhfcHJlc2VudCA9IDA7CisJCX0gZWxzZSB7CisJCQlhaWM3ODdYX2NhYmxlX2RldGVjdChhaGMsICZpbnRlcm5hbDUwX3ByZXNlbnQsCisJCQkJCSAgICAgJmludGVybmFsNjhfcHJlc2VudCwKKwkJCQkJICAgICAmZXh0ZXJuYWxjYWJsZV9wcmVzZW50LAorCQkJCQkgICAgICZlZXByb21fcHJlc2VudCk7CisJCX0KKworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfV0lERSkgPT0gMCkKKwkJCWludGVybmFsNjhfcHJlc2VudCA9IDA7CisKKwkJaWYgKGJvb3R2ZXJib3NlCisJCSAmJiAoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID09IDApIHsKKwkJCXByaW50ZigiJXM6IGludGVybmFsIDUwIGNhYmxlICVzIHByZXNlbnQiLAorCQkJICAgICAgIGFoY19uYW1lKGFoYyksCisJCQkgICAgICAgaW50ZXJuYWw1MF9wcmVzZW50ID8gImlzIjoibm90Iik7CisKKwkJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSAhPSAwKQorCQkJCXByaW50ZigiLCBpbnRlcm5hbCA2OCBjYWJsZSAlcyBwcmVzZW50IiwKKwkJCQkgICAgICAgaW50ZXJuYWw2OF9wcmVzZW50ID8gImlzIjoibm90Iik7CisJCQlwcmludGYoIlxuJXM6IGV4dGVybmFsIGNhYmxlICVzIHByZXNlbnRcbiIsCisJCQkgICAgICAgYWhjX25hbWUoYWhjKSwKKwkJCSAgICAgICBleHRlcm5hbGNhYmxlX3ByZXNlbnQgPyAiaXMiOiJub3QiKTsKKwkJfQorCQlpZiAoYm9vdHZlcmJvc2UpCisJCQlwcmludGYoIiVzOiBCSU9TIGVlcHJvbSAlcyBwcmVzZW50XG4iLAorCQkJICAgICAgIGFoY19uYW1lKGFoYyksIGVlcHJvbV9wcmVzZW50ID8gImlzIiA6ICJub3QiKTsKKworCQlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfSU5UNTBfU1BFRURGTEVYKSAhPSAwKSB7CisJCQkvKgorCQkJICogVGhlIDUwIHBpbiBjb25uZWN0b3IgaXMgYSBzZXBhcmF0ZSBidXMsCisJCQkgKiBzbyBmb3JjZSBpdCB0byBhbHdheXMgYmUgdGVybWluYXRlZC4KKwkJCSAqIEluIHRoZSBmdXR1cmUsIHBlcmZvcm0gY3VycmVudCBzZW5zaW5nCisJCQkgKiB0byBkZXRlcm1pbmUgaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YKKwkJCSAqIGEgcHJvcGVybHkgdGVybWluYXRlZCBidXMuCisJCQkgKi8KKwkJCWludGVybmFsNTBfcHJlc2VudCA9IDA7CisJCX0KKworCQkvKgorCQkgKiBOb3cgc2V0IHRoZSB0ZXJtaW5hdGlvbiBiYXNlZCBvbiB3aGF0CisJCSAqIHdlIGZvdW5kLgorCQkgKiBGbGFzaCBFbmFibGUgPSBCUkREQVQ3CisJCSAqIFNlY29uZGFyeSBIaWdoIFRlcm0gRW5hYmxlID0gQlJEREFUNgorCQkgKiBTZWNvbmRhcnkgTG93IFRlcm0gRW5hYmxlID0gQlJEREFUNSAoNzg5MCkKKwkJICogUHJpbWFyeSBIaWdoIFRlcm0gRW5hYmxlID0gQlJEREFUNCAoNzg5MCkKKwkJICovCisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID09IDAKKwkJICYmIChpbnRlcm5hbDUwX3ByZXNlbnQgIT0gMCkKKwkJICYmIChpbnRlcm5hbDY4X3ByZXNlbnQgIT0gMCkKKwkJICYmIChleHRlcm5hbGNhYmxlX3ByZXNlbnQgIT0gMCkpIHsKKwkJCXByaW50ZigiJXM6IElsbGVnYWwgY2FibGUgY29uZmlndXJhdGlvbiEhLiAiCisJCQkgICAgICAgIk9ubHkgdHdvIGNvbm5lY3RvcnMgb24gdGhlICIKKwkJCSAgICAgICAiYWRhcHRlciBtYXkgYmUgdXNlZCBhdCBhICIKKwkJCSAgICAgICAidGltZSFcbiIsIGFoY19uYW1lKGFoYykpOworCisJCQkvKgorCQkJICogUHJldGVuZCB0aGVyZSBhcmUgbm8gY2FibGVzIGluIHRoZSBob3BlCisJCQkgKiB0aGF0IGhhdmluZyBhbGwgb2YgdGhlIHRlcm1pbmF0aW9uIG9uCisJCQkgKiBnaXZlcyB1cyBhIG1vcmUgc3RhYmxlIGJ1cy4KKwkJCSAqLworCQkgCWludGVybmFsNTBfcHJlc2VudCA9IDA7CisJCQlpbnRlcm5hbDY4X3ByZXNlbnQgPSAwOworCQkJZXh0ZXJuYWxjYWJsZV9wcmVzZW50ID0gMDsKKwkJfQorCisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSAhPSAwCisJCSAmJiAoKGV4dGVybmFsY2FibGVfcHJlc2VudCA9PSAwKQorCQkgIHx8IChpbnRlcm5hbDY4X3ByZXNlbnQgPT0gMCkKKwkJICB8fCAoZW5hYmxlU0VDX2hpZ2ggIT0gMCkpKSB7CisJCQlicmRkYXQgfD0gQlJEREFUNjsKKwkJCWlmIChib290dmVyYm9zZSkgeworCQkJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19JTlQ1MF9TUEVFREZMRVgpICE9IDApCisJCQkJCXByaW50ZigiJXM6IDY4IHBpbiB0ZXJtaW5hdGlvbiAiCisJCQkJCSAgICAgICAiRW5hYmxlZFxuIiwgYWhjX25hbWUoYWhjKSk7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIiVzOiAlc0hpZ2ggYnl0ZSB0ZXJtaW5hdGlvbiAiCisJCQkJCSAgICAgICAiRW5hYmxlZFxuIiwgYWhjX25hbWUoYWhjKSwKKwkJCQkJICAgICAgIGVuYWJsZVNFQ19oaWdoID8gIlNlY29uZGFyeSAiCisJCQkJCQkJICAgICAgOiAiIik7CisJCQl9CisJCX0KKworCQlzdW0gPSBpbnRlcm5hbDUwX3ByZXNlbnQgKyBpbnRlcm5hbDY4X3ByZXNlbnQKKwkJICAgICsgZXh0ZXJuYWxjYWJsZV9wcmVzZW50OworCQlpZiAoc3VtIDwgMiB8fCAoZW5hYmxlU0VDX2xvdyAhPSAwKSkgeworCQkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkKKwkJCQlicmRkYXQgfD0gQlJEREFUNTsKKwkJCWVsc2UKKwkJCQkqc3hmcmN0bDEgfD0gU1RQV0VOOworCQkJaWYgKGJvb3R2ZXJib3NlKSB7CisJCQkJaWYgKChhaGMtPmZsYWdzICYgQUhDX0lOVDUwX1NQRUVERkxFWCkgIT0gMCkKKwkJCQkJcHJpbnRmKCIlczogNTAgcGluIHRlcm1pbmF0aW9uICIKKwkJCQkJICAgICAgICJFbmFibGVkXG4iLCBhaGNfbmFtZShhaGMpKTsKKwkJCQllbHNlCisJCQkJCXByaW50ZigiJXM6ICVzTG93IGJ5dGUgdGVybWluYXRpb24gIgorCQkJCQkgICAgICAgIkVuYWJsZWRcbiIsIGFoY19uYW1lKGFoYyksCisJCQkJCSAgICAgICBlbmFibGVTRUNfbG93ID8gIlNlY29uZGFyeSAiCisJCQkJCQkJICAgICA6ICIiKTsKKwkJCX0KKwkJfQorCisJCWlmIChlbmFibGVQUklfbG93ICE9IDApIHsKKwkJCSpzeGZyY3RsMSB8PSBTVFBXRU47CisJCQlpZiAoYm9vdHZlcmJvc2UpCisJCQkJcHJpbnRmKCIlczogUHJpbWFyeSBMb3cgQnl0ZSB0ZXJtaW5hdGlvbiAiCisJCQkJICAgICAgICJFbmFibGVkXG4iLCBhaGNfbmFtZShhaGMpKTsKKwkJfQorCisJCS8qCisJCSAqIFNldHVwIFNUUFdFTiBiZWZvcmUgc2V0dGluZyB1cCB0aGUgcmVzdCBvZgorCQkgKiB0aGUgdGVybWluYXRpb24gcGVyIHRoZSB0ZWNoIG5vdGUgb24gdGhlIFUxNjAgY2FyZHMuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIFNYRlJDVEwxLCAqc3hmcmN0bDEpOworCisJCWlmIChlbmFibGVQUklfaGlnaCAhPSAwKSB7CisJCQlicmRkYXQgfD0gQlJEREFUNDsKKwkJCWlmIChib290dmVyYm9zZSkKKwkJCQlwcmludGYoIiVzOiBQcmltYXJ5IEhpZ2ggQnl0ZSAiCisJCQkJICAgICAgICJ0ZXJtaW5hdGlvbiBFbmFibGVkXG4iLAorCQkJCSAgICAgICBhaGNfbmFtZShhaGMpKTsKKwkJfQorCQkKKwkJd3JpdGVfYnJkY3RsKGFoYywgYnJkZGF0KTsKKworCX0gZWxzZSB7CisJCWlmICgoYWRhcHRlcl9jb250cm9sICYgQ0ZTVEVSTSkgIT0gMCkgeworCQkJKnN4ZnJjdGwxIHw9IFNUUFdFTjsKKworCQkJaWYgKGJvb3R2ZXJib3NlKQorCQkJCXByaW50ZigiJXM6ICVzTG93IGJ5dGUgdGVybWluYXRpb24gRW5hYmxlZFxuIiwKKwkJCQkgICAgICAgYWhjX25hbWUoYWhjKSwKKwkJCQkgICAgICAgKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSA/ICJQcmltYXJ5ICIKKwkJCQkJCQkJICAgIDogIiIpOworCQl9CisKKwkJaWYgKChhZGFwdGVyX2NvbnRyb2wgJiBDRldTVEVSTSkgIT0gMAorCQkgJiYgKGFoYy0+ZmVhdHVyZXMgJiBBSENfV0lERSkgIT0gMCkgeworCQkJYnJkZGF0IHw9IEJSRERBVDY7CisJCQlpZiAoYm9vdHZlcmJvc2UpCisJCQkJcHJpbnRmKCIlczogJXNIaWdoIGJ5dGUgdGVybWluYXRpb24gRW5hYmxlZFxuIiwKKwkJCQkgICAgICAgYWhjX25hbWUoYWhjKSwKKwkJCQkgICAgICAgKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorCQkJCSAgICAgPyAiU2Vjb25kYXJ5ICIgOiAiIik7CisJCX0KKworCQkvKgorCQkgKiBTZXR1cCBTVFBXRU4gYmVmb3JlIHNldHRpbmcgdXAgdGhlIHJlc3Qgb2YKKwkJICogdGhlIHRlcm1pbmF0aW9uIHBlciB0aGUgdGVjaCBub3RlIG9uIHRoZSBVMTYwIGNhcmRzLgorCQkgKi8KKwkJYWhjX291dGIoYWhjLCBTWEZSQ1RMMSwgKnN4ZnJjdGwxKTsKKworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfV0lERSkgIT0gMCkKKwkJCXdyaXRlX2JyZGN0bChhaGMsIGJyZGRhdCk7CisJfQorCVNFRVBST01fT1VUQihzZCwgc2QtPnNkX01TKTsgLyogQ2xlYXIgQ1MgKi8KK30KKworc3RhdGljIHZvaWQKK2FoY19uZXdfdGVybV9kZXRlY3Qoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBpbnQgKmVuYWJsZVNFQ19sb3csCisJCSAgICBpbnQgKmVuYWJsZVNFQ19oaWdoLCBpbnQgKmVuYWJsZVBSSV9sb3csCisJCSAgICBpbnQgKmVuYWJsZVBSSV9oaWdoLCBpbnQgKmVlcHJvbV9wcmVzZW50KQoreworCXVpbnQ4X3QgYnJkY3RsOworCisJLyoKKwkgKiBCUkREQVQ3ID0gRWVwcm9tCisJICogQlJEREFUNiA9IEVuYWJsZSBTZWNvbmRhcnkgSGlnaCBCeXRlIHRlcm1pbmF0aW9uCisJICogQlJEREFUNSA9IEVuYWJsZSBTZWNvbmRhcnkgTG93IEJ5dGUgdGVybWluYXRpb24KKwkgKiBCUkREQVQ0ID0gRW5hYmxlIFByaW1hcnkgaGlnaCBieXRlIHRlcm1pbmF0aW9uCisJICogQlJEREFUMyA9IEVuYWJsZSBQcmltYXJ5IGxvdyBieXRlIHRlcm1pbmF0aW9uCisJICovCisJYnJkY3RsID0gcmVhZF9icmRjdGwoYWhjKTsKKwkqZWVwcm9tX3ByZXNlbnQgPSBicmRjdGwgJiBCUkREQVQ3OworCSplbmFibGVTRUNfaGlnaCA9IChicmRjdGwgJiBCUkREQVQ2KTsKKwkqZW5hYmxlU0VDX2xvdyA9IChicmRjdGwgJiBCUkREQVQ1KTsKKwkqZW5hYmxlUFJJX2hpZ2ggPSAoYnJkY3RsICYgQlJEREFUNCk7CisJKmVuYWJsZVBSSV9sb3cgPSAoYnJkY3RsICYgQlJEREFUMyk7Cit9CisKK3N0YXRpYyB2b2lkCithaWM3ODdYX2NhYmxlX2RldGVjdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCAqaW50ZXJuYWw1MF9wcmVzZW50LAorCQkgICAgIGludCAqaW50ZXJuYWw2OF9wcmVzZW50LCBpbnQgKmV4dGVybmFsY2FibGVfcHJlc2VudCwKKwkJICAgICBpbnQgKmVlcHJvbV9wcmVzZW50KQoreworCXVpbnQ4X3QgYnJkY3RsOworCisJLyoKKwkgKiBGaXJzdCByZWFkIHRoZSBzdGF0dXMgb2Ygb3VyIGNhYmxlcy4KKwkgKiBTZXQgdGhlIHJvbSBiYW5rIHRvIDAgc2luY2UgdGhlCisJICogYmFuayBzZXR0aW5nIHNlcnZlcyBhcyBhIG11bHRpcGxleG9yCisJICogZm9yIHRoZSBjYWJsZSBkZXRlY3Rpb24gbG9naWMuCisJICogQlJEREFUNSBjb250cm9scyB0aGUgYmFuayBzd2l0Y2guCisJICovCisJd3JpdGVfYnJkY3RsKGFoYywgMCk7CisKKwkvKgorCSAqIE5vdyByZWFkIHRoZSBzdGF0ZSBvZiB0aGUgaW50ZXJuYWwKKwkgKiBjb25uZWN0b3JzLiAgQlJEREFUNiBpcyBJTlQ1MCBhbmQKKwkgKiBCUkREQVQ3IGlzIElOVDY4LgorCSAqLworCWJyZGN0bCA9IHJlYWRfYnJkY3RsKGFoYyk7CisJKmludGVybmFsNTBfcHJlc2VudCA9IChicmRjdGwgJiBCUkREQVQ2KSA/IDAgOiAxOworCSppbnRlcm5hbDY4X3ByZXNlbnQgPSAoYnJkY3RsICYgQlJEREFUNykgPyAwIDogMTsKKworCS8qCisJICogU2V0IHRoZSByb20gYmFuayB0byAxIGFuZCBkZXRlcm1pbmUKKwkgKiB0aGUgb3RoZXIgc2lnbmFscy4KKwkgKi8KKwl3cml0ZV9icmRjdGwoYWhjLCBCUkREQVQ1KTsKKworCS8qCisJICogTm93IHJlYWQgdGhlIHN0YXRlIG9mIHRoZSBleHRlcm5hbAorCSAqIGNvbm5lY3RvcnMuICBCUkREQVQ2IGlzIEVYVDY4IGFuZAorCSAqIEJSRERBVDcgaXMgRVBST01QUy4KKwkgKi8KKwlicmRjdGwgPSByZWFkX2JyZGN0bChhaGMpOworCSpleHRlcm5hbGNhYmxlX3ByZXNlbnQgPSAoYnJkY3RsICYgQlJEREFUNikgPyAwIDogMTsKKwkqZWVwcm9tX3ByZXNlbnQgPSAoYnJkY3RsICYgQlJEREFUNykgPyAxIDogMDsKK30KKworc3RhdGljIHZvaWQKK2FpYzc4NVhfY2FibGVfZGV0ZWN0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgaW50ICppbnRlcm5hbDUwX3ByZXNlbnQsCisJCSAgICAgaW50ICpleHRlcm5hbGNhYmxlX3ByZXNlbnQsIGludCAqZWVwcm9tX3ByZXNlbnQpCit7CisJdWludDhfdCBicmRjdGw7CisJdWludDhfdCBzcGlvY2FwOworCisJc3Bpb2NhcCA9IGFoY19pbmIoYWhjLCBTUElPQ0FQKTsKKwlzcGlvY2FwICY9IH5TT0ZUQ01ERU47CisJc3Bpb2NhcCB8PSBFWFRfQlJEQ1RMOworCWFoY19vdXRiKGFoYywgU1BJT0NBUCwgc3Bpb2NhcCk7CisJYWhjX291dGIoYWhjLCBCUkRDVEwsIEJSRFJXfEJSRENTKTsKKwlhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOworCWFoY19kZWxheSg1MDApOworCWFoY19vdXRiKGFoYywgQlJEQ1RMLCAwKTsKKwlhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOworCWFoY19kZWxheSg1MDApOworCWJyZGN0bCA9IGFoY19pbmIoYWhjLCBCUkRDVEwpOworCSppbnRlcm5hbDUwX3ByZXNlbnQgPSAoYnJkY3RsICYgQlJEREFUNSkgPyAwIDogMTsKKwkqZXh0ZXJuYWxjYWJsZV9wcmVzZW50ID0gKGJyZGN0bCAmIEJSRERBVDYpID8gMCA6IDE7CisJKmVlcHJvbV9wcmVzZW50ID0gKGFoY19pbmIoYWhjLCBTUElPQ0FQKSAmIEVFUFJPTSkgPyAxIDogMDsKK30KKwkKK2ludAorYWhjX2FjcXVpcmVfc2VlcHJvbShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzZWVwcm9tX2Rlc2NyaXB0b3IgKnNkKQoreworCWludCB3YWl0OworCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1NQSU9DQVApICE9IDAKKwkgJiYgKGFoY19pbmIoYWhjLCBTUElPQ0FQKSAmIFNFRVBST00pID09IDApCisJCXJldHVybiAoMCk7CisKKwkvKgorCSAqIFJlcXVlc3QgYWNjZXNzIG9mIHRoZSBtZW1vcnkgcG9ydC4gIFdoZW4gYWNjZXNzIGlzCisJICogZ3JhbnRlZCwgU0VFUkRZIHdpbGwgZ28gaGlnaC4gIFdlIHVzZSBhIDEgc2Vjb25kCisJICogdGltZW91dCB3aGljaCBzaG91bGQgYmUgbmVhciAxIHNlY29uZCBtb3JlIHRoYW4KKwkgKiBpcyBuZWVkZWQuICBSZWFzb246IGFmdGVyIHRoZSBjaGlwIHJlc2V0LCB0aGVyZQorCSAqIHNob3VsZCBiZSBubyBjb250ZW50aW9uLgorCSAqLworCVNFRVBST01fT1VUQihzZCwgc2QtPnNkX01TKTsKKwl3YWl0ID0gMTAwMDsgIC8qIDEgc2Vjb25kIHRpbWVvdXQgaW4gbXNlYyAqLworCXdoaWxlICgtLXdhaXQgJiYgKChTRUVQUk9NX1NUQVRVU19JTkIoc2QpICYgc2QtPnNkX1JEWSkgPT0gMCkpIHsKKwkJYWhjX2RlbGF5KDEwMDApOyAgLyogZGVsYXkgMSBtc2VjICovCisJfQorCWlmICgoU0VFUFJPTV9TVEFUVVNfSU5CKHNkKSAmIHNkLT5zZF9SRFkpID09IDApIHsKKwkJU0VFUFJPTV9PVVRCKHNkLCAwKTsgCisJCXJldHVybiAoMCk7CisJfQorCXJldHVybigxKTsKK30KKwordm9pZAorYWhjX3JlbGVhc2Vfc2VlcHJvbShzdHJ1Y3Qgc2VlcHJvbV9kZXNjcmlwdG9yICpzZCkKK3sKKwkvKiBSZWxlYXNlIGFjY2VzcyB0byB0aGUgbWVtb3J5IHBvcnQgYW5kIHRoZSBzZXJpYWwgRUVQUk9NLiAqLworCVNFRVBST01fT1VUQihzZCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZV9icmRjdGwoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1aW50OF90IHZhbHVlKQoreworCXVpbnQ4X3QgYnJkY3RsOworCisJaWYgKChhaGMtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spID09IEFIQ19BSUM3ODk1KSB7CisJCWJyZGN0bCA9IEJSRFNUQjsKKwkgCWlmIChhaGMtPmNoYW5uZWwgPT0gJ0InKQorCQkJYnJkY3RsIHw9IEJSRENTOworCX0gZWxzZSBpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCWJyZGN0bCA9IDA7CisJfSBlbHNlIHsKKwkJYnJkY3RsID0gQlJEU1RCfEJSRENTOworCX0KKwlhaGNfb3V0YihhaGMsIEJSRENUTCwgYnJkY3RsKTsKKwlhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOworCWJyZGN0bCB8PSB2YWx1ZTsKKwlhaGNfb3V0YihhaGMsIEJSRENUTCwgYnJkY3RsKTsKKwlhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisJCWJyZGN0bCB8PSBCUkRTVEJfVUxUUkEyOworCWVsc2UKKwkJYnJkY3RsICY9IH5CUkRTVEI7CisJYWhjX291dGIoYWhjLCBCUkRDVEwsIGJyZGN0bCk7CisJYWhjX2ZsdXNoX2RldmljZV93cml0ZXMoYWhjKTsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKQorCQlicmRjdGwgPSAwOworCWVsc2UKKwkJYnJkY3RsICY9IH5CUkRDUzsKKwlhaGNfb3V0YihhaGMsIEJSRENUTCwgYnJkY3RsKTsKK30KKworc3RhdGljIHVpbnQ4X3QKK3JlYWRfYnJkY3RsKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwl1aW50OF90IGJyZGN0bDsKKwl1aW50OF90IHZhbHVlOworCisJaWYgKChhaGMtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spID09IEFIQ19BSUM3ODk1KSB7CisJCWJyZGN0bCA9IEJSRFJXOworCSAJaWYgKGFoYy0+Y2hhbm5lbCA9PSAnQicpCisJCQlicmRjdGwgfD0gQlJEQ1M7CisJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJYnJkY3RsID0gQlJEUldfVUxUUkEyOworCX0gZWxzZSB7CisJCWJyZGN0bCA9IEJSRFJXfEJSRENTOworCX0KKwlhaGNfb3V0YihhaGMsIEJSRENUTCwgYnJkY3RsKTsKKwlhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOworCXZhbHVlID0gYWhjX2luYihhaGMsIEJSRENUTCk7CisJYWhjX291dGIoYWhjLCBCUkRDVEwsIDApOworCXJldHVybiAodmFsdWUpOworfQorCitzdGF0aWMgdm9pZAorYWhjX3BjaV9pbnRyKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwl1X2ludCBlcnJvcjsKKwl1X2ludCBzdGF0dXMxOworCisJZXJyb3IgPSBhaGNfaW5iKGFoYywgRVJST1IpOworCWlmICgoZXJyb3IgJiBQQ0lFUlJTVEFUKSA9PSAwKQorCQlyZXR1cm47CisKKwlzdGF0dXMxID0gYWhjX3BjaV9yZWFkX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywKKwkJCQkgICAgICBQQ0lSX1NUQVRVUyArIDEsIC8qYnl0ZXMqLzEpOworCisJcHJpbnRmKCIlczogUENJIGVycm9yIEludGVycnVwdCBhdCBzZXFhZGRyID0gMHgleFxuIiwKKwkgICAgICBhaGNfbmFtZShhaGMpLAorCSAgICAgIGFoY19pbmIoYWhjLCBTRVFBRERSMCkgfCAoYWhjX2luYihhaGMsIFNFUUFERFIxKSA8PCA4KSk7CisKKwlpZiAoc3RhdHVzMSAmIERQRSkgeworCQlhaGMtPnBjaV90YXJnZXRfcGVycl9jb3VudCsrOworCQlwcmludGYoIiVzOiBEYXRhIFBhcml0eSBFcnJvciBEZXRlY3RlZCBkdXJpbmcgYWRkcmVzcyAiCisJCSAgICAgICAib3Igd3JpdGUgZGF0YSBwaGFzZVxuIiwgYWhjX25hbWUoYWhjKSk7CisJfQorCWlmIChzdGF0dXMxICYgU1NFKSB7CisJCXByaW50ZigiJXM6IFNpZ25hbCBTeXN0ZW0gRXJyb3IgRGV0ZWN0ZWRcbiIsIGFoY19uYW1lKGFoYykpOworCX0KKwlpZiAoc3RhdHVzMSAmIFJNQSkgeworCQlwcmludGYoIiVzOiBSZWNlaXZlZCBhIE1hc3RlciBBYm9ydFxuIiwgYWhjX25hbWUoYWhjKSk7CisJfQorCWlmIChzdGF0dXMxICYgUlRBKSB7CisJCXByaW50ZigiJXM6IFJlY2VpdmVkIGEgVGFyZ2V0IEFib3J0XG4iLCBhaGNfbmFtZShhaGMpKTsKKwl9CisJaWYgKHN0YXR1czEgJiBTVEEpIHsKKwkJcHJpbnRmKCIlczogU2lnbmFsZWQgYSBUYXJnZXQgQWJvcnRcbiIsIGFoY19uYW1lKGFoYykpOworCX0KKwlpZiAoc3RhdHVzMSAmIERQUikgeworCQlwcmludGYoIiVzOiBEYXRhIFBhcml0eSBFcnJvciBoYXMgYmVlbiByZXBvcnRlZCB2aWEgUEVSUiNcbiIsCisJCSAgICAgICBhaGNfbmFtZShhaGMpKTsKKwl9CisKKwkvKiBDbGVhciBsYXRjaGVkIGVycm9ycy4gKi8KKwlhaGNfcGNpX3dyaXRlX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywgUENJUl9TVEFUVVMgKyAxLAorCQkJICAgICBzdGF0dXMxLCAvKmJ5dGVzKi8xKTsKKworCWlmICgoc3RhdHVzMSAmIChEUEV8U1NFfFJNQXxSVEF8U1RBfERQUikpID09IDApIHsKKwkJcHJpbnRmKCIlczogTGF0Y2hlZCBQQ0lFUlIgaW50ZXJydXB0IHdpdGggIgorCQkgICAgICAgIm5vIHN0YXR1cyBiaXRzIHNldFxuIiwgYWhjX25hbWUoYWhjKSk7IAorCX0gZWxzZSB7CisJCWFoY19vdXRiKGFoYywgQ0xSSU5ULCBDTFJQQVJFUlIpOworCX0KKworCWlmIChhaGMtPnBjaV90YXJnZXRfcGVycl9jb3VudCA+IEFIQ19QQ0lfVEFSR0VUX1BFUlJfVEhSRVNIKSB7CisJCXByaW50ZigKKyIlczogV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklOR1xuIgorIiVzOiBUb28gbWFueSBQQ0kgcGFyaXR5IGVycm9ycyBvYnNlcnZlZCBhcyBhIHRhcmdldC5cbiIKKyIlczogU29tZSBkZXZpY2Ugb24gdGhpcyBidXMgaXMgZ2VuZXJhdGluZyBiYWQgcGFyaXR5LlxuIgorIiVzOiBUaGlzIGlzIGFuIGVycm9yICpvYnNlcnZlZCBieSosIG5vdCAqZ2VuZXJhdGVkIGJ5KiwgdGhpcyBjb250cm9sbGVyLlxuIgorIiVzOiBQQ0kgcGFyaXR5IGVycm9yIGNoZWNraW5nIGhhcyBiZWVuIGRpc2FibGVkLlxuIgorIiVzOiBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HXG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgYWhjX25hbWUoYWhjKSwgYWhjX25hbWUoYWhjKSwKKwkJICAgICAgIGFoY19uYW1lKGFoYyksIGFoY19uYW1lKGFoYyksIGFoY19uYW1lKGFoYykpOworCQlhaGMtPnNlcWN0bCB8PSBGQUlMRElTOworCQlhaGNfb3V0YihhaGMsIFNFUUNUTCwgYWhjLT5zZXFjdGwpOworCX0KKwlhaGNfdW5wYXVzZShhaGMpOworfQorCitzdGF0aWMgaW50CithaGNfcGNpX2NoaXBfaW5pdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJYWhjX291dGIoYWhjLCBEU0NPTU1BTkQwLCBhaGMtPmJ1c19zb2Z0Yy5wY2lfc29mdGMuZHNjb21tYW5kMCk7CisJYWhjX291dGIoYWhjLCBEU1BDSVNUQVRVUywgYWhjLT5idXNfc29mdGMucGNpX3NvZnRjLmRzcGNpc3RhdHVzKTsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfRFQpICE9IDApIHsKKwkJdV9pbnQgc2Z1bmN0OworCisJCXNmdW5jdCA9IGFoY19pbmIoYWhjLCBTRlVOQ1QpICYgfkFMVF9NT0RFOworCQlhaGNfb3V0YihhaGMsIFNGVU5DVCwgc2Z1bmN0IHwgQUxUX01PREUpOworCQlhaGNfb3V0YihhaGMsIE9QVElPTk1PREUsIGFoYy0+YnVzX3NvZnRjLnBjaV9zb2Z0Yy5vcHRpb25tb2RlKTsKKwkJYWhjX291dHcoYWhjLCBUQVJHQ1JDQ05ULCBhaGMtPmJ1c19zb2Z0Yy5wY2lfc29mdGMudGFyZ2NyY2NudCk7CisJCWFoY19vdXRiKGFoYywgU0ZVTkNULCBzZnVuY3QpOworCQlhaGNfb3V0YihhaGMsIENSQ0NPTlRST0wxLAorCQkJIGFoYy0+YnVzX3NvZnRjLnBjaV9zb2Z0Yy5jcmNjb250cm9sMSk7CisJfQorCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19NVUxUSV9GVU5DKSAhPSAwKQorCQlhaGNfb3V0YihhaGMsIFNDQkJBRERSLCBhaGMtPmJ1c19zb2Z0Yy5wY2lfc29mdGMuc2NiYmFkZHIpOworCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkKKwkJYWhjX291dGIoYWhjLCBERkZfVEhSU0gsIGFoYy0+YnVzX3NvZnRjLnBjaV9zb2Z0Yy5kZmZfdGhyc2gpOworCisJcmV0dXJuIChhaGNfY2hpcF9pbml0KGFoYykpOworfQorCitzdGF0aWMgaW50CithaGNfcGNpX3N1c3BlbmQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoYWhjX3N1c3BlbmQoYWhjKSk7Cit9CisKK3N0YXRpYyBpbnQKK2FoY19wY2lfcmVzdW1lKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUoYWhjLT5kZXZfc29mdGMsIEFIQ19QT1dFUl9TVEFURV9EMCk7CisKKwkvKgorCSAqIFdlIGFzc3VtZSB0aGF0IHRoZSBPUyBoYXMgcmVzdG9yZWQgb3VyIHJlZ2lzdGVyCisJICogbWFwcGluZ3MsIGV0Yy4gIEp1c3QgdXBkYXRlIHRoZSBjb25maWcgc3BhY2UgcmVnaXN0ZXJzCisJICogdGhhdCB0aGUgT1MgZG9lc24ndCBrbm93IGFib3V0IGFuZCByZWx5IG9uIG91ciBjaGlwCisJICogcmVzZXQgaGFuZGxlciB0byBoYW5kbGUgdGhlIHJlc3QuCisJICovCisJYWhjX3BjaV93cml0ZV9jb25maWcoYWhjLT5kZXZfc29mdGMsIERFVkNPTkZJRywgLypieXRlcyovNCwKKwkJCSAgICAgYWhjLT5idXNfc29mdGMucGNpX3NvZnRjLmRldmNvbmZpZyk7CisJYWhjX3BjaV93cml0ZV9jb25maWcoYWhjLT5kZXZfc29mdGMsIFBDSVJfQ09NTUFORCwgLypieXRlcyovMSwKKwkJCSAgICAgYWhjLT5idXNfc29mdGMucGNpX3NvZnRjLmNvbW1hbmQpOworCWFoY19wY2lfd3JpdGVfY29uZmlnKGFoYy0+ZGV2X3NvZnRjLCBDU0laRV9MQVRUSU1FLCAvKmJ5dGVzKi8xLAorCQkJICAgICBhaGMtPmJ1c19zb2Z0Yy5wY2lfc29mdGMuY3NpemVfbGF0dGltZSk7CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX0hBU19URVJNX0xPR0lDKSAhPSAwKSB7CisJCXN0cnVjdAlzZWVwcm9tX2Rlc2NyaXB0b3Igc2Q7CisJCXVfaW50CXN4ZnJjdGwxOworCisJCXNkLnNkX2FoYyA9IGFoYzsKKwkJc2Quc2RfY29udHJvbF9vZmZzZXQgPSBTRUVDVEw7CQkKKwkJc2Quc2Rfc3RhdHVzX29mZnNldCA9IFNFRUNUTDsJCQorCQlzZC5zZF9kYXRhb3V0X29mZnNldCA9IFNFRUNUTDsJCQorCisJCWFoY19hY3F1aXJlX3NlZXByb20oYWhjLCAmc2QpOworCQljb25maWd1cmVfdGVybWluYXRpb24oYWhjLCAmc2QsCisJCQkJICAgICAgYWhjLT5zZWVwX2NvbmZpZy0+YWRhcHRlcl9jb250cm9sLAorCQkJCSAgICAgICZzeGZyY3RsMSk7CisJCWFoY19yZWxlYXNlX3NlZXByb20oJnNkKTsKKwl9CisJcmV0dXJuIChhaGNfcmVzdW1lKGFoYykpOworfQorCitzdGF0aWMgaW50CithaGNfYWljNzg1WF9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJYWhjX2Rldl9zb2Z0Y190IHBjaTsKKwl1aW50OF90IHJldjsKKworCXBjaSA9IGFoYy0+ZGV2X3NvZnRjOworCWFoYy0+Y2hhbm5lbCA9ICdBJzsKKwlhaGMtPmNoaXAgPSBBSENfQUlDNzg1MDsKKwlhaGMtPmZlYXR1cmVzID0gQUhDX0FJQzc4NTBfRkU7CisJYWhjLT5idWdzIHw9IEFIQ19UTU9ERV9XSURFT0REX0JVR3xBSENfQ0FDSEVUSEVOX0JVR3xBSENfUENJX01XSV9CVUc7CisJcmV2ID0gYWhjX3BjaV9yZWFkX2NvbmZpZyhwY2ksIFBDSVJfUkVWSUQsIC8qYnl0ZXMqLzEpOworCWlmIChyZXYgPj0gMSkKKwkJYWhjLT5idWdzIHw9IEFIQ19QQ0lfMl8xX1JFVFJZX0JVRzsKKwlhaGMtPmluc3RydWN0aW9uX3JhbV9zaXplID0gNTEyOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2FoY19haWM3ODYwX3NldHVwKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlhaGNfZGV2X3NvZnRjX3QgcGNpOworCXVpbnQ4X3QgcmV2OworCisJcGNpID0gYWhjLT5kZXZfc29mdGM7CisJYWhjLT5jaGFubmVsID0gJ0EnOworCWFoYy0+Y2hpcCA9IEFIQ19BSUM3ODYwOworCWFoYy0+ZmVhdHVyZXMgPSBBSENfQUlDNzg2MF9GRTsKKwlhaGMtPmJ1Z3MgfD0gQUhDX1RNT0RFX1dJREVPRERfQlVHfEFIQ19DQUNIRVRIRU5fQlVHfEFIQ19QQ0lfTVdJX0JVRzsKKwlyZXYgPSBhaGNfcGNpX3JlYWRfY29uZmlnKHBjaSwgUENJUl9SRVZJRCwgLypieXRlcyovMSk7CisJaWYgKHJldiA+PSAxKQorCQlhaGMtPmJ1Z3MgfD0gQUhDX1BDSV8yXzFfUkVUUllfQlVHOworCWFoYy0+aW5zdHJ1Y3Rpb25fcmFtX3NpemUgPSA1MTI7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhjX2FwYTE0ODBfc2V0dXAoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gYWhjX2FpYzc4NjBfc2V0dXAoYWhjKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisJYWhjLT5mZWF0dXJlcyB8PSBBSENfUkVNT1ZBQkxFOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2FoY19haWM3ODcwX3NldHVwKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKworCWFoYy0+Y2hhbm5lbCA9ICdBJzsKKwlhaGMtPmNoaXAgPSBBSENfQUlDNzg3MDsKKwlhaGMtPmZlYXR1cmVzID0gQUhDX0FJQzc4NzBfRkU7CisJYWhjLT5idWdzIHw9IEFIQ19UTU9ERV9XSURFT0REX0JVR3xBSENfQ0FDSEVUSEVOX0JVR3xBSENfUENJX01XSV9CVUc7CisJYWhjLT5pbnN0cnVjdGlvbl9yYW1fc2l6ZSA9IDUxMjsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CithaGNfYWhhMzk0WF9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBhaGNfYWljNzg3MF9zZXR1cChhaGMpOworCWlmIChlcnJvciA9PSAwKQorCQllcnJvciA9IGFoY19haGEzOTRYWF9zZXR1cChhaGMpOworCXJldHVybiAoZXJyb3IpOworfQorCitzdGF0aWMgaW50CithaGNfYWhhMzk4WF9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBhaGNfYWljNzg3MF9zZXR1cChhaGMpOworCWlmIChlcnJvciA9PSAwKQorCQllcnJvciA9IGFoY19haGEzOThYWF9zZXR1cChhaGMpOworCXJldHVybiAoZXJyb3IpOworfQorCitzdGF0aWMgaW50CithaGNfYWhhNDk0WF9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBhaGNfYWljNzg3MF9zZXR1cChhaGMpOworCWlmIChlcnJvciA9PSAwKQorCQllcnJvciA9IGFoY19haGE0OTRYWF9zZXR1cChhaGMpOworCXJldHVybiAoZXJyb3IpOworfQorCitzdGF0aWMgaW50CithaGNfYWljNzg4MF9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJYWhjX2Rldl9zb2Z0Y190IHBjaTsKKwl1aW50OF90IHJldjsKKworCXBjaSA9IGFoYy0+ZGV2X3NvZnRjOworCWFoYy0+Y2hhbm5lbCA9ICdBJzsKKwlhaGMtPmNoaXAgPSBBSENfQUlDNzg4MDsKKwlhaGMtPmZlYXR1cmVzID0gQUhDX0FJQzc4ODBfRkU7CisJYWhjLT5idWdzIHw9IEFIQ19UTU9ERV9XSURFT0REX0JVRzsKKwlyZXYgPSBhaGNfcGNpX3JlYWRfY29uZmlnKHBjaSwgUENJUl9SRVZJRCwgLypieXRlcyovMSk7CisJaWYgKHJldiA+PSAxKSB7CisJCWFoYy0+YnVncyB8PSBBSENfUENJXzJfMV9SRVRSWV9CVUc7CisJfSBlbHNlIHsKKwkJYWhjLT5idWdzIHw9IEFIQ19DQUNIRVRIRU5fQlVHfEFIQ19QQ0lfTVdJX0JVRzsKKwl9CisJYWhjLT5pbnN0cnVjdGlvbl9yYW1fc2l6ZSA9IDUxMjsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CithaGNfYWhhMjk0MFByb19zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisKKwlhaGMtPmZsYWdzIHw9IEFIQ19JTlQ1MF9TUEVFREZMRVg7CisJcmV0dXJuIChhaGNfYWljNzg4MF9zZXR1cChhaGMpKTsKK30KKworc3RhdGljIGludAorYWhjX2FoYTM5NFhVX3NldHVwKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGFoY19haWM3ODgwX3NldHVwKGFoYyk7CisJaWYgKGVycm9yID09IDApCisJCWVycm9yID0gYWhjX2FoYTM5NFhYX3NldHVwKGFoYyk7CisJcmV0dXJuIChlcnJvcik7Cit9CisKK3N0YXRpYyBpbnQKK2FoY19haGEzOThYVV9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBhaGNfYWljNzg4MF9zZXR1cChhaGMpOworCWlmIChlcnJvciA9PSAwKQorCQllcnJvciA9IGFoY19haGEzOThYWF9zZXR1cChhaGMpOworCXJldHVybiAoZXJyb3IpOworfQorCitzdGF0aWMgaW50CithaGNfYWljNzg5MF9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJYWhjX2Rldl9zb2Z0Y190IHBjaTsKKwl1aW50OF90IHJldjsKKworCXBjaSA9IGFoYy0+ZGV2X3NvZnRjOworCWFoYy0+Y2hhbm5lbCA9ICdBJzsKKwlhaGMtPmNoaXAgPSBBSENfQUlDNzg5MDsKKwlhaGMtPmZlYXR1cmVzID0gQUhDX0FJQzc4OTBfRkU7CisJYWhjLT5mbGFncyB8PSBBSENfTkVXRUVQUk9NX0ZNVDsKKwlyZXYgPSBhaGNfcGNpX3JlYWRfY29uZmlnKHBjaSwgUENJUl9SRVZJRCwgLypieXRlcyovMSk7CisJaWYgKHJldiA9PSAwKQorCQlhaGMtPmJ1Z3MgfD0gQUhDX0FVVE9GTFVTSF9CVUd8QUhDX0NBQ0hFVEhFTl9CVUc7CisJYWhjLT5pbnN0cnVjdGlvbl9yYW1fc2l6ZSA9IDc2ODsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CithaGNfYWljNzg5Ml9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisKKwlhaGMtPmNoYW5uZWwgPSAnQSc7CisJYWhjLT5jaGlwID0gQUhDX0FJQzc4OTI7CisJYWhjLT5mZWF0dXJlcyA9IEFIQ19BSUM3ODkyX0ZFOworCWFoYy0+ZmxhZ3MgfD0gQUhDX05FV0VFUFJPTV9GTVQ7CisJYWhjLT5idWdzIHw9IEFIQ19TQ0JDSEFOX1VQTE9BRF9CVUc7CisJYWhjLT5pbnN0cnVjdGlvbl9yYW1fc2l6ZSA9IDEwMjQ7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhjX2FpYzc4OTVfc2V0dXAoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWFoY19kZXZfc29mdGNfdCBwY2k7CisJdWludDhfdCByZXY7CisKKwlwY2kgPSBhaGMtPmRldl9zb2Z0YzsKKwlhaGMtPmNoYW5uZWwgPSBhaGNfZ2V0X3BjaV9mdW5jdGlvbihwY2kpID09IDEgPyAnQicgOiAnQSc7CisJLyoKKwkgKiBUaGUgJ0MnIHJldmlzaW9uIG9mIHRoZSBhaWM3ODk1IGhhcyBhIGZldyBhZGRpdGlvbmFsIGZlYXR1cmVzLgorCSAqLworCXJldiA9IGFoY19wY2lfcmVhZF9jb25maWcocGNpLCBQQ0lSX1JFVklELCAvKmJ5dGVzKi8xKTsKKwlpZiAocmV2ID49IDQpIHsKKwkJYWhjLT5jaGlwID0gQUhDX0FJQzc4OTVDOworCQlhaGMtPmZlYXR1cmVzID0gQUhDX0FJQzc4OTVDX0ZFOworCX0gZWxzZSAgeworCQl1X2ludCBjb21tYW5kOworCisJCWFoYy0+Y2hpcCA9IEFIQ19BSUM3ODk1OworCQlhaGMtPmZlYXR1cmVzID0gQUhDX0FJQzc4OTVfRkU7CisKKwkJLyoKKwkJICogVGhlIEJJT1MgZGlzYWJsZXMgdGhlIHVzZSBvZiBNV0kgdHJhbnNhY3Rpb25zCisJCSAqIHNpbmNlIGl0IGRvZXMgbm90IGhhdmUgdGhlIE1XSSBidWcgd29yayBhcm91bmQKKwkJICogd2UgaGF2ZS4gIERpc2FibGluZyBNV0kgcmVkdWNlcyBwZXJmb3JtYW5jZSwgc28KKwkJICogdHVybiBpdCBvbiBhZ2Fpbi4KKwkJICovCisJCWNvbW1hbmQgPSBhaGNfcGNpX3JlYWRfY29uZmlnKHBjaSwgUENJUl9DT01NQU5ELCAvKmJ5dGVzKi8xKTsKKwkJY29tbWFuZCB8PSBQQ0lNX0NNRF9NV1JJQ0VOOworCQlhaGNfcGNpX3dyaXRlX2NvbmZpZyhwY2ksIFBDSVJfQ09NTUFORCwgY29tbWFuZCwgLypieXRlcyovMSk7CisJCWFoYy0+YnVncyB8PSBBSENfUENJX01XSV9CVUc7CisJfQorCS8qCisJICogWFhYIERvZXMgQ0FDSEVUSEVOIHJlYWxseSBub3Qgd29yaz8/PyAgV2hhdCBhYm91dCBQQ0kgcmV0cnk/CisJICogb24gQyBsZXZlbCBjaGlwcy4gIE5lZWQgdG8gdGVzdCwgYnV0IGZvciBub3csIHBsYXkgaXQgc2FmZS4KKwkgKi8KKwlhaGMtPmJ1Z3MgfD0gQUhDX1RNT0RFX1dJREVPRERfQlVHfEFIQ19QQ0lfMl8xX1JFVFJZX0JVRworCQkgIHwgIEFIQ19DQUNIRVRIRU5fQlVHOworCisjaWYgMAorCXVpbnQzMl90IGRldmNvbmZpZzsKKworCS8qCisJICogQ2FjaGVzaXplIG11c3QgYWxzbyBiZSB6ZXJvIGR1ZSB0byBzdHJheSBEQUMKKwkgKiBwcm9ibGVtIHdoZW4gc2l0dGluZyBiZWhpbmQgc29tZSBicmlkZ2VzLgorCSAqLworCWFoY19wY2lfd3JpdGVfY29uZmlnKHBjaSwgQ1NJWkVfTEFUVElNRSwgMCwgLypieXRlcyovMSk7CisJZGV2Y29uZmlnID0gYWhjX3BjaV9yZWFkX2NvbmZpZyhwY2ksIERFVkNPTkZJRywgLypieXRlcyovMSk7CisJZGV2Y29uZmlnIHw9IE1SRENFTjsKKwlhaGNfcGNpX3dyaXRlX2NvbmZpZyhwY2ksIERFVkNPTkZJRywgZGV2Y29uZmlnLCAvKmJ5dGVzKi8xKTsKKyNlbmRpZgorCWFoYy0+ZmxhZ3MgfD0gQUhDX05FV0VFUFJPTV9GTVQ7CisJYWhjLT5pbnN0cnVjdGlvbl9yYW1fc2l6ZSA9IDUxMjsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CithaGNfYWljNzg5Nl9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJYWhjX2Rldl9zb2Z0Y190IHBjaTsKKworCXBjaSA9IGFoYy0+ZGV2X3NvZnRjOworCWFoYy0+Y2hhbm5lbCA9IGFoY19nZXRfcGNpX2Z1bmN0aW9uKHBjaSkgPT0gMSA/ICdCJyA6ICdBJzsKKwlhaGMtPmNoaXAgPSBBSENfQUlDNzg5NjsKKwlhaGMtPmZlYXR1cmVzID0gQUhDX0FJQzc4OTZfRkU7CisJYWhjLT5mbGFncyB8PSBBSENfTkVXRUVQUk9NX0ZNVDsKKwlhaGMtPmJ1Z3MgfD0gQUhDX0NBQ0hFVEhFTl9ESVNfQlVHOworCWFoYy0+aW5zdHJ1Y3Rpb25fcmFtX3NpemUgPSA3Njg7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhjX2FpYzc4OTlfc2V0dXAoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWFoY19kZXZfc29mdGNfdCBwY2k7CisKKwlwY2kgPSBhaGMtPmRldl9zb2Z0YzsKKwlhaGMtPmNoYW5uZWwgPSBhaGNfZ2V0X3BjaV9mdW5jdGlvbihwY2kpID09IDEgPyAnQicgOiAnQSc7CisJYWhjLT5jaGlwID0gQUhDX0FJQzc4OTk7CisJYWhjLT5mZWF0dXJlcyA9IEFIQ19BSUM3ODk5X0ZFOworCWFoYy0+ZmxhZ3MgfD0gQUhDX05FV0VFUFJPTV9GTVQ7CisJYWhjLT5idWdzIHw9IEFIQ19TQ0JDSEFOX1VQTE9BRF9CVUc7CisJYWhjLT5pbnN0cnVjdGlvbl9yYW1fc2l6ZSA9IDEwMjQ7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhjX2FoYTI5MTYwQ19zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBhaGNfYWljNzg5OV9zZXR1cChhaGMpOworCWlmIChlcnJvciAhPSAwKQorCQlyZXR1cm4gKGVycm9yKTsKKwlhaGMtPmZlYXR1cmVzIHw9IEFIQ19SRU1PVkFCTEU7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhjX3JhaWRfc2V0dXAoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXByaW50ZigiUkFJRCBmdW5jdGlvbmFsaXR5IHVuc3VwcG9ydGVkXG4iKTsKKwlyZXR1cm4gKEVOWElPKTsKK30KKworc3RhdGljIGludAorYWhjX2FoYTM5NFhYX3NldHVwKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlhaGNfZGV2X3NvZnRjX3QgcGNpOworCisJcGNpID0gYWhjLT5kZXZfc29mdGM7CisJc3dpdGNoIChhaGNfZ2V0X3BjaV9zbG90KHBjaSkpIHsKKwljYXNlIEFIQ18zOTRYX1NMT1RfQ0hBTk5FTF9BOgorCQlhaGMtPmNoYW5uZWwgPSAnQSc7CisJCWJyZWFrOworCWNhc2UgQUhDXzM5NFhfU0xPVF9DSEFOTkVMX0I6CisJCWFoYy0+Y2hhbm5lbCA9ICdCJzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJhZGFwdGVyIGF0IHVuZXhwZWN0ZWQgc2xvdCAlZFxuIgorCQkgICAgICAgInVuYWJsZSB0byBtYXAgdG8gYSBjaGFubmVsXG4iLAorCQkgICAgICAgYWhjX2dldF9wY2lfc2xvdChwY2kpKTsKKwkJYWhjLT5jaGFubmVsID0gJ0EnOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CithaGNfYWhhMzk4WFhfc2V0dXAoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWFoY19kZXZfc29mdGNfdCBwY2k7CisKKwlwY2kgPSBhaGMtPmRldl9zb2Z0YzsKKwlzd2l0Y2ggKGFoY19nZXRfcGNpX3Nsb3QocGNpKSkgeworCWNhc2UgQUhDXzM5OFhfU0xPVF9DSEFOTkVMX0E6CisJCWFoYy0+Y2hhbm5lbCA9ICdBJzsKKwkJYnJlYWs7CisJY2FzZSBBSENfMzk4WF9TTE9UX0NIQU5ORUxfQjoKKwkJYWhjLT5jaGFubmVsID0gJ0InOworCQlicmVhazsKKwljYXNlIEFIQ18zOThYX1NMT1RfQ0hBTk5FTF9DOgorCQlhaGMtPmNoYW5uZWwgPSAnQyc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiYWRhcHRlciBhdCB1bmV4cGVjdGVkIHNsb3QgJWRcbiIKKwkJICAgICAgICJ1bmFibGUgdG8gbWFwIHRvIGEgY2hhbm5lbFxuIiwKKwkJICAgICAgIGFoY19nZXRfcGNpX3Nsb3QocGNpKSk7CisJCWFoYy0+Y2hhbm5lbCA9ICdBJzsKKwkJYnJlYWs7CisJfQorCWFoYy0+ZmxhZ3MgfD0gQUhDX0xBUkdFX1NFRVBST007CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhjX2FoYTQ5NFhYX3NldHVwKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlhaGNfZGV2X3NvZnRjX3QgcGNpOworCisJcGNpID0gYWhjLT5kZXZfc29mdGM7CisJc3dpdGNoIChhaGNfZ2V0X3BjaV9zbG90KHBjaSkpIHsKKwljYXNlIEFIQ180OTRYX1NMT1RfQ0hBTk5FTF9BOgorCQlhaGMtPmNoYW5uZWwgPSAnQSc7CisJCWJyZWFrOworCWNhc2UgQUhDXzQ5NFhfU0xPVF9DSEFOTkVMX0I6CisJCWFoYy0+Y2hhbm5lbCA9ICdCJzsKKwkJYnJlYWs7CisJY2FzZSBBSENfNDk0WF9TTE9UX0NIQU5ORUxfQzoKKwkJYWhjLT5jaGFubmVsID0gJ0MnOworCQlicmVhazsKKwljYXNlIEFIQ180OTRYX1NMT1RfQ0hBTk5FTF9EOgorCQlhaGMtPmNoYW5uZWwgPSAnRCc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiYWRhcHRlciBhdCB1bmV4cGVjdGVkIHNsb3QgJWRcbiIKKwkJICAgICAgICJ1bmFibGUgdG8gbWFwIHRvIGEgY2hhbm5lbFxuIiwKKwkJICAgICAgIGFoY19nZXRfcGNpX3Nsb3QocGNpKSk7CisJCWFoYy0+Y2hhbm5lbCA9ICdBJzsKKwl9CisJYWhjLT5mbGFncyB8PSBBSENfTEFSR0VfU0VFUFJPTTsKKwlyZXR1cm4gKDApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wY2kuaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyN2ZjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcGNpLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBBZGFwdGVjIEFJQzd4eHggZGV2aWNlIGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkJAorICoKKyAqLworI2lmbmRlZiBfQUlDN1hYWF9QQ0lfSF8KKyNkZWZpbmUgX0FJQzdYWFhfUENJX0hfCisKKyNkZWZpbmUgSURfQUxMX01BU0sJCQkweEZGRkZGRkZGRkZGRkZGRkZ1bGwKKyNkZWZpbmUgSURfREVWX1ZFTkRPUl9NQVNLCQkweEZGRkZGRkZGMDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfOTAwNV9HRU5FUklDX01BU0sJCTB4RkZGMEZGRkYwMDAwMDAwMHVsbAorI2RlZmluZSBJRF85MDA1X1NJU0xfTUFTSwkJMHgwMDBGRkZGRjAwMDAwMDAwdWxsCisjZGVmaW5lIElEXzkwMDVfU0lTTF9JRAkJCTB4MDAwNTkwMDUwMDAwMDAwMHVsbAorI2RlZmluZSBJRF9BSUM3ODUwCQkJMHg1MDc4OTAwNDAwMDAwMDAwdWxsCisjZGVmaW5lIElEX0FIQV8yOTAyXzA0XzEwXzE1XzIwQ18zMEMJMHg1MDc4OTAwNDc4NTA5MDA0dWxsCisjZGVmaW5lIElEX0FJQzc4NTUJCQkweDU1Nzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUlDNzg1OQkJCTB4Mzg2MDkwMDQwMDAwMDAwMHVsbAorI2RlZmluZSBJRF9BSEFfMjkzMENVCQkJMHgzODYwOTAwNDM4Njk5MDA0dWxsCisjZGVmaW5lIElEX0FJQzc4NjAJCQkweDYwNzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUlDNzg2MEMJCQkweDYwNzg5MDA0Nzg2MDkwMDR1bGwKKyNkZWZpbmUgSURfQUhBXzE0ODBBCQkJMHg2MDc1OTAwNDAwMDAwMDAwdWxsCisjZGVmaW5lIElEX0FIQV8yOTQwQVVfMAkJCTB4NjE3ODkwMDQwMDAwMDAwMHVsbAorI2RlZmluZSBJRF9BSEFfMjk0MEFVXzEJCQkweDYxNzg5MDA0Nzg2MTkwMDR1bGwKKyNkZWZpbmUgSURfQUhBXzI5NDBBVV9DTgkJMHgyMTc4OTAwNDc4MjE5MDA0dWxsCisjZGVmaW5lIElEX0FIQV8yOTMwQ19WQVIJCTB4NjAzODkwMDQzODY4OTAwNHVsbAorCisjZGVmaW5lIElEX0FJQzc4NzAJCQkweDcwNzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUhBXzI5NDAJCQkweDcxNzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUhBXzM5NDAJCQkweDcyNzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUhBXzM5OFgJCQkweDczNzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUhBXzI5NDQJCQkweDc0Nzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUhBXzM5NDQJCQkweDc1Nzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUhBXzQ5NDQJCQkweDc2Nzg5MDA0MDAwMDAwMDB1bGwKKworI2RlZmluZSBJRF9BSUM3ODgwCQkJMHg4MDc4OTAwNDAwMDAwMDAwdWxsCisjZGVmaW5lIElEX0FJQzc4ODBfQgkJCTB4ODA3ODkwMDQ3ODgwOTAwNHVsbAorI2RlZmluZSBJRF9BSEFfMjk0MFUJCQkweDgxNzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUhBXzM5NDBVCQkJMHg4Mjc4OTAwNDAwMDAwMDAwdWxsCisjZGVmaW5lIElEX0FIQV8yOTQ0VQkJCTB4ODQ3ODkwMDQwMDAwMDAwMHVsbAorI2RlZmluZSBJRF9BSEFfMzk0NFUJCQkweDg1Nzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUhBXzM5OFhVCQkJMHg4Mzc4OTAwNDAwMDAwMDAwdWxsCisjZGVmaW5lIElEX0FIQV80OTQ0VQkJCTB4ODY3ODkwMDQwMDAwMDAwMHVsbAorI2RlZmluZSBJRF9BSEFfMjk0MFVCCQkJMHg4MTc4OTAwNDc4ODE5MDA0dWxsCisjZGVmaW5lIElEX0FIQV8yOTMwVQkJCTB4ODg3ODkwMDQ3ODg4OTAwNHVsbAorI2RlZmluZSBJRF9BSEFfMjk0MFVfUFJPCQkweDg3Nzg5MDA0Nzg4NzkwMDR1bGwKKyNkZWZpbmUgSURfQUhBXzI5NDBVX0NOCQkJMHgwMDc4OTAwNDc4MDA5MDA0dWxsCisKKyNkZWZpbmUgSURfQUlDNzg5NQkJCTB4Nzg5NTkwMDQ3ODk1OTAwNHVsbAorI2RlZmluZSBJRF9BSUM3ODk1X0FSTwkJCTB4Nzg5MDkwMDQ3ODkzOTAwNHVsbAorI2RlZmluZSBJRF9BSUM3ODk1X0FST19NQVNLCQkweEZGRjBGRkZGRkZGRkZGRkZ1bGwKKyNkZWZpbmUgSURfQUhBXzI5NDBVX0RVQUwJCTB4Nzg5NTkwMDQ3ODkxOTAwNHVsbAorI2RlZmluZSBJRF9BSEFfMzk0MEFVCQkJMHg3ODk1OTAwNDc4OTI5MDA0dWxsCisjZGVmaW5lIElEX0FIQV8zOTQ0QVUJCQkweDc4OTU5MDA0Nzg5NDkwMDR1bGwKKworI2RlZmluZSBJRF9BSUM3ODkwCQkJMHgwMDFGOTAwNTAwMEY5MDA1dWxsCisjZGVmaW5lIElEX0FJQzc4OTBfQVJPCQkJMHgwMDEzOTAwNTAwMEY5MDA1dWxsCisjZGVmaW5lIElEX0FBQV8xMzFVMgkJCTB4MDAxMzkwMDUwMDAzOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMjkzMFUyCQkJMHgwMDExOTAwNTAxODE5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8yOTQwVTJCCQkJMHgwMDEwOTAwNUExMDA5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8yOTQwVTJfT0VNCQkweDAwMTA5MDA1MjE4MDkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzI5NDBVMgkJCTB4MDAxMDkwMDVBMTgwOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMjk1MFUyQgkJCTB4MDAxMDkwMDVFMTAwOTAwNXVsbAorCisjZGVmaW5lIElEX0FJQzc4OTIJCQkweDAwOEY5MDA1RkZGRjkwMDV1bGwKKyNkZWZpbmUgSURfQUlDNzg5Ml9BUk8JCQkweDAwODM5MDA1RkZGRjkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzI5MTYwCQkJMHgwMDgwOTAwNUUyQTA5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8yOTE2MF9DUFEJCTB4MDA4MDkwMDVFMkEwMEUxMXVsbAorI2RlZmluZSBJRF9BSEFfMjkxNjBOCQkJMHgwMDgwOTAwNTYyQTA5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8yOTE2MEMJCQkweDAwODA5MDA1NjIyMDkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzI5MTYwQgkJCTB4MDA4MDkwMDVFMjIwOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMTkxNjBCCQkJMHgwMDgxOTAwNTYyQTE5MDA1dWxsCisKKyNkZWZpbmUgSURfQUlDNzg5NgkJCTB4MDA1RjkwMDVGRkZGOTAwNXVsbAorI2RlZmluZSBJRF9BSUM3ODk2X0FSTwkJCTB4MDA1MzkwMDVGRkZGOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMzk1MFUyQl8wCQkweDAwNTA5MDA1RkZGRjkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzM5NTBVMkJfMQkJMHgwMDUwOTAwNUY1MDA5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8zOTUwVTJEXzAJCTB4MDA1MTkwMDVGRkZGOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMzk1MFUyRF8xCQkweDAwNTE5MDA1QjUwMDkwMDV1bGwKKworI2RlZmluZSBJRF9BSUM3ODk5CQkJMHgwMENGOTAwNUZGRkY5MDA1dWxsCisjZGVmaW5lIElEX0FJQzc4OTlfQVJPCQkJMHgwMEMzOTAwNUZGRkY5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8zOTYwRAkJCTB4MDBDMDkwMDVGNjIwOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMzk2MERfQ1BRCQkweDAwQzA5MDA1RjYyMDBFMTF1bGwKKworI2RlZmluZSBJRF9BSUM3ODEwCQkJMHgxMDc4OTAwNDAwMDAwMDAwdWxsCisjZGVmaW5lIElEX0FJQzc4MTUJCQkweDc4MTU5MDA0MDAwMDAwMDB1bGwKKworI2VuZGlmIC8qIF9BSUM3WFhYX1BDSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wcm9jLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWU4MGVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wcm9jLmMKQEAgLTAsMCArMSwzODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiBTdHJpbmcgaGFuZGxpbmcgY29kZSBjb3VydGVzeSBvZiBHZXJhcmQgUm91ZGllcidzIDxncm91ZGllckBjbHViLWludGVybmV0LmZyPgorICogc3ltIGRyaXZlci4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9saW51eC9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3Byb2MuYyMyOSAkCisgKi8KKyNpbmNsdWRlICJhaWM3eHh4X29zbS5oIgorI2luY2x1ZGUgImFpYzd4eHhfaW5saW5lLmgiCisjaW5jbHVkZSAiYWljN3h4eF85M2N4Ni5oIgorCitzdGF0aWMgdm9pZAljb3B5X21lbV9pbmZvKHN0cnVjdCBpbmZvX3N0ciAqaW5mbywgY2hhciAqZGF0YSwgaW50IGxlbik7CitzdGF0aWMgaW50CWNvcHlfaW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIGNoYXIgKmZtdCwgLi4uKTsKK3N0YXRpYyB2b2lkCWFoY19kdW1wX3RhcmdldF9zdGF0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJICAgICAgc3RydWN0IGluZm9fc3RyICppbmZvLAorCQkJCSAgICAgIHVfaW50IG91cl9pZCwgY2hhciBjaGFubmVsLAorCQkJCSAgICAgIHVfaW50IHRhcmdldF9pZCwgdV9pbnQgdGFyZ2V0X29mZnNldCk7CitzdGF0aWMgdm9pZAlhaGNfZHVtcF9kZXZpY2Vfc3RhdGUoc3RydWN0IGluZm9fc3RyICppbmZvLAorCQkJCSAgICAgIHN0cnVjdCBhaGNfbGludXhfZGV2aWNlICpkZXYpOworc3RhdGljIGludAlhaGNfcHJvY193cml0ZV9zZWVwcm9tKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkgICAgICAgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKTsKKworc3RhdGljIHZvaWQKK2NvcHlfbWVtX2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCWlmIChpbmZvLT5wb3MgKyBsZW4gPiBpbmZvLT5vZmZzZXQgKyBpbmZvLT5sZW5ndGgpCisJCWxlbiA9IGluZm8tPm9mZnNldCArIGluZm8tPmxlbmd0aCAtIGluZm8tPnBvczsKKworCWlmIChpbmZvLT5wb3MgKyBsZW4gPCBpbmZvLT5vZmZzZXQpIHsKKwkJaW5mby0+cG9zICs9IGxlbjsKKwkJcmV0dXJuOworCX0KKworCWlmIChpbmZvLT5wb3MgPCBpbmZvLT5vZmZzZXQpIHsKKwkJb2ZmX3QgcGFydGlhbDsKKworCQlwYXJ0aWFsID0gaW5mby0+b2Zmc2V0IC0gaW5mby0+cG9zOworCQlkYXRhICs9IHBhcnRpYWw7CisJCWluZm8tPnBvcyArPSBwYXJ0aWFsOworCQlsZW4gIC09IHBhcnRpYWw7CisJfQorCisJaWYgKGxlbiA+IDApIHsKKwkJbWVtY3B5KGluZm8tPmJ1ZmZlciwgZGF0YSwgbGVuKTsKKwkJaW5mby0+cG9zICs9IGxlbjsKKwkJaW5mby0+YnVmZmVyICs9IGxlbjsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2NvcHlfaW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwljaGFyIGJ1ZlsyNTZdOworCWludCBsZW47CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWxlbiA9IHZzcHJpbnRmKGJ1ZiwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwljb3B5X21lbV9pbmZvKGluZm8sIGJ1ZiwgbGVuKTsKKwlyZXR1cm4gKGxlbik7Cit9CisKK3ZvaWQKK2FoY19mb3JtYXRfdHJhbnNpbmZvKHN0cnVjdCBpbmZvX3N0ciAqaW5mbywgc3RydWN0IGFoY190cmFuc2luZm8gKnRpbmZvKQoreworCXVfaW50IHNwZWVkOworCXVfaW50IGZyZXE7CisJdV9pbnQgbWI7CisKKyAgICAgICAgc3BlZWQgPSAzMzAwOworICAgICAgICBmcmVxID0gMDsKKwlpZiAodGluZm8tPm9mZnNldCAhPSAwKSB7CisJCWZyZXEgPSBhaWNfY2FsY19zeW5jc3JhdGUodGluZm8tPnBlcmlvZCk7CisJCXNwZWVkID0gZnJlcTsKKwl9CisJc3BlZWQgKj0gKDB4MDEgPDwgdGluZm8tPndpZHRoKTsKKyAgICAgICAgbWIgPSBzcGVlZCAvIDEwMDA7CisgICAgICAgIGlmIChtYiA+IDApCisJCWNvcHlfaW5mbyhpbmZvLCAiJWQuJTAzZE1CL3MgdHJhbnNmZXJzIiwgbWIsIHNwZWVkICUgMTAwMCk7CisgICAgICAgIGVsc2UKKwkJY29weV9pbmZvKGluZm8sICIlZEtCL3MgdHJhbnNmZXJzIiwgc3BlZWQpOworCisJaWYgKGZyZXEgIT0gMCkgeworCQljb3B5X2luZm8oaW5mbywgIiAoJWQuJTAzZE1IeiVzLCBvZmZzZXQgJWQiLAorCQkJIGZyZXEgLyAxMDAwLCBmcmVxICUgMTAwMCwKKwkJCSAodGluZm8tPnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVRKSAhPSAwCisJCQkgPyAiIERUIiA6ICIiLCB0aW5mby0+b2Zmc2V0KTsKKwl9CisKKwlpZiAodGluZm8tPndpZHRoID4gMCkgeworCQlpZiAoZnJlcSAhPSAwKSB7CisJCQljb3B5X2luZm8oaW5mbywgIiwgIik7CisJCX0gZWxzZSB7CisJCQljb3B5X2luZm8oaW5mbywgIiAoIik7CisJCX0KKwkJY29weV9pbmZvKGluZm8sICIlZGJpdCkiLCA4ICogKDB4MDEgPDwgdGluZm8tPndpZHRoKSk7CisJfSBlbHNlIGlmIChmcmVxICE9IDApIHsKKwkJY29weV9pbmZvKGluZm8sICIpIik7CisJfQorCWNvcHlfaW5mbyhpbmZvLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK2FoY19kdW1wX3RhcmdldF9zdGF0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBpbmZvX3N0ciAqaW5mbywKKwkJICAgICAgdV9pbnQgb3VyX2lkLCBjaGFyIGNoYW5uZWwsIHVfaW50IHRhcmdldF9pZCwKKwkJICAgICAgdV9pbnQgdGFyZ2V0X29mZnNldCkKK3sKKwlzdHJ1Y3QJYWhjX2xpbnV4X3RhcmdldCAqdGFyZzsKKwlzdHJ1Y3QJYWhjX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJc3RydWN0CWFoY190bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwlpbnQJbHVuOworCisJdGluZm8gPSBhaGNfZmV0Y2hfdHJhbnNpbmZvKGFoYywgY2hhbm5lbCwgb3VyX2lkLAorCQkJCSAgICB0YXJnZXRfaWQsICZ0c3RhdGUpOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSAhPSAwKQorCQljb3B5X2luZm8oaW5mbywgIkNoYW5uZWwgJWMgIiwgY2hhbm5lbCk7CisJY29weV9pbmZvKGluZm8sICJUYXJnZXQgJWQgTmVnb3RpYXRpb24gU2V0dGluZ3NcbiIsIHRhcmdldF9pZCk7CisJY29weV9pbmZvKGluZm8sICJcdFVzZXI6ICIpOworCWFoY19mb3JtYXRfdHJhbnNpbmZvKGluZm8sICZ0aW5mby0+dXNlcik7CisJdGFyZyA9IGFoYy0+cGxhdGZvcm1fZGF0YS0+dGFyZ2V0c1t0YXJnZXRfb2Zmc2V0XTsKKwlpZiAodGFyZyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwljb3B5X2luZm8oaW5mbywgIlx0R29hbDogIik7CisJYWhjX2Zvcm1hdF90cmFuc2luZm8oaW5mbywgJnRpbmZvLT5nb2FsKTsKKwljb3B5X2luZm8oaW5mbywgIlx0Q3VycjogIik7CisJYWhjX2Zvcm1hdF90cmFuc2luZm8oaW5mbywgJnRpbmZvLT5jdXJyKTsKKworCWZvciAobHVuID0gMDsgbHVuIDwgQUhDX05VTV9MVU5TOyBsdW4rKykgeworCQlzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2OworCisJCWRldiA9IHRhcmctPmRldmljZXNbbHVuXTsKKworCQlpZiAoZGV2ID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlhaGNfZHVtcF9kZXZpY2Vfc3RhdGUoaW5mbywgZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCithaGNfZHVtcF9kZXZpY2Vfc3RhdGUoc3RydWN0IGluZm9fc3RyICppbmZvLCBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2KQoreworCWNvcHlfaW5mbyhpbmZvLCAiXHRDaGFubmVsICVjIFRhcmdldCAlZCBMdW4gJWQgU2V0dGluZ3NcbiIsCisJCSAgZGV2LT50YXJnZXQtPmNoYW5uZWwgKyAnQScsIGRldi0+dGFyZ2V0LT50YXJnZXQsIGRldi0+bHVuKTsKKworCWNvcHlfaW5mbyhpbmZvLCAiXHRcdENvbW1hbmRzIFF1ZXVlZCAlbGRcbiIsIGRldi0+Y29tbWFuZHNfaXNzdWVkKTsKKwljb3B5X2luZm8oaW5mbywgIlx0XHRDb21tYW5kcyBBY3RpdmUgJWRcbiIsIGRldi0+YWN0aXZlKTsKKwljb3B5X2luZm8oaW5mbywgIlx0XHRDb21tYW5kIE9wZW5pbmdzICVkXG4iLCBkZXYtPm9wZW5pbmdzKTsKKwljb3B5X2luZm8oaW5mbywgIlx0XHRNYXggVGFnZ2VkIE9wZW5pbmdzICVkXG4iLCBkZXYtPm1heHRhZ3MpOworCWNvcHlfaW5mbyhpbmZvLCAiXHRcdERldmljZSBRdWV1ZSBGcm96ZW4gQ291bnQgJWRcbiIsIGRldi0+cWZyb3plbik7Cit9CisKK3N0YXRpYyBpbnQKK2FoY19wcm9jX3dyaXRlX3NlZXByb20oc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCit7CisJc3RydWN0IHNlZXByb21fZGVzY3JpcHRvciBzZDsKKwlpbnQgaGF2ZV9zZWVwcm9tOworCXVfbG9uZyBzOworCWludCBwYXVzZWQ7CisJaW50IHdyaXR0ZW47CisKKwkvKiBEZWZhdWx0IHRvIGZhaWx1cmUuICovCisJd3JpdHRlbiA9IC1FSU5WQUw7CisJYWhjX2xvY2soYWhjLCAmcyk7CisJcGF1c2VkID0gYWhjX2lzX3BhdXNlZChhaGMpOworCWlmICghcGF1c2VkKQorCQlhaGNfcGF1c2UoYWhjKTsKKworCWlmIChsZW5ndGggIT0gc2l6ZW9mKHN0cnVjdCBzZWVwcm9tX2NvbmZpZykpIHsKKwkJcHJpbnRmKCJhaGNfcHJvY193cml0ZV9zZWVwcm9tOiBpbmNvcnJlY3QgYnVmZmVyIHNpemVcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJaGF2ZV9zZWVwcm9tID0gYWhjX3ZlcmlmeV9ja3N1bSgoc3RydWN0IHNlZXByb21fY29uZmlnKilidWZmZXIpOworCWlmIChoYXZlX3NlZXByb20gPT0gMCkgeworCQlwcmludGYoImFoY19wcm9jX3dyaXRlX3NlZXByb206IGNrc3VtIHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJc2Quc2RfYWhjID0gYWhjOworI2lmIEFIQ19QQ0lfQ09ORklHID4gMAorCWlmICgoYWhjLT5jaGlwICYgQUhDX1BDSSkgIT0gMCkgeworCQlzZC5zZF9jb250cm9sX29mZnNldCA9IFNFRUNUTDsKKwkJc2Quc2Rfc3RhdHVzX29mZnNldCA9IFNFRUNUTDsKKwkJc2Quc2RfZGF0YW91dF9vZmZzZXQgPSBTRUVDVEw7CisJCWlmIChhaGMtPmZsYWdzICYgQUhDX0xBUkdFX1NFRVBST00pCisJCQlzZC5zZF9jaGlwID0gQzU2XzY2OworCQllbHNlCisJCQlzZC5zZF9jaGlwID0gQzQ2OworCQlzZC5zZF9NUyA9IFNFRU1TOworCQlzZC5zZF9SRFkgPSBTRUVSRFk7CisJCXNkLnNkX0NTID0gU0VFQ1M7CisJCXNkLnNkX0NLID0gU0VFQ0s7CisJCXNkLnNkX0RPID0gU0VFRE87CisJCXNkLnNkX0RJID0gU0VFREk7CisJCWhhdmVfc2VlcHJvbSA9IGFoY19hY3F1aXJlX3NlZXByb20oYWhjLCAmc2QpOworCX0gZWxzZQorI2VuZGlmCisJaWYgKChhaGMtPmNoaXAgJiBBSENfVkwpICE9IDApIHsKKwkJc2Quc2RfY29udHJvbF9vZmZzZXQgPSBTRUVDVExfMjg0MDsKKwkJc2Quc2Rfc3RhdHVzX29mZnNldCA9IFNUQVRVU18yODQwOworCQlzZC5zZF9kYXRhb3V0X29mZnNldCA9IFNUQVRVU18yODQwOwkJCisJCXNkLnNkX2NoaXAgPSBDNDY7CisJCXNkLnNkX01TID0gMDsKKwkJc2Quc2RfUkRZID0gRUVQUk9NX1RGOworCQlzZC5zZF9DUyA9IENTXzI4NDA7CisJCXNkLnNkX0NLID0gQ0tfMjg0MDsKKwkJc2Quc2RfRE8gPSBET18yODQwOworCQlzZC5zZF9ESSA9IERJXzI4NDA7CisJCWhhdmVfc2VlcHJvbSA9IFRSVUU7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJhaGNfcHJvY193cml0ZV9zZWVwcm9tOiB1bnN1cHBvcnRlZCBhZGFwdGVyIHR5cGVcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCFoYXZlX3NlZXByb20pIHsKKwkJcHJpbnRmKCJhaGNfcHJvY193cml0ZV9zZWVwcm9tOiBObyBTZXJpYWwgRUVQUk9NXG4iKTsKKwkJZ290byBkb25lOworCX0gZWxzZSB7CisJCXVfaW50IHN0YXJ0X2FkZHI7CisKKwkJaWYgKGFoYy0+c2VlcF9jb25maWcgPT0gTlVMTCkgeworCQkJYWhjLT5zZWVwX2NvbmZpZyA9IG1hbGxvYyhzaXplb2YoKmFoYy0+c2VlcF9jb25maWcpLAorCQkJCQkJICBNX0RFVkJVRiwgTV9OT1dBSVQpOworCQkJaWYgKGFoYy0+c2VlcF9jb25maWcgPT0gTlVMTCkgeworCQkJCXByaW50ZigiYWljN3h4eDogVW5hYmxlIHRvIGFsbG9jYXRlIHNlcmlhbCAiCisJCQkJICAgICAgICJlZXByb20gYnVmZmVyLiAgV3JpdGUgZmFpbGluZ1xuIik7CisJCQkJZ290byBkb25lOworCQkJfQorCQl9CisJCXByaW50ZigiYWljN3h4eDogV3JpdGluZyBTZXJpYWwgRUVQUk9NXG4iKTsKKwkJc3RhcnRfYWRkciA9IDMyICogKGFoYy0+Y2hhbm5lbCAtICdBJyk7CisJCWFoY193cml0ZV9zZWVwcm9tKCZzZCwgKHVfaW50MTZfdCAqKWJ1ZmZlciwgc3RhcnRfYWRkciwKKwkJCQkgIHNpemVvZihzdHJ1Y3Qgc2VlcHJvbV9jb25maWcpLzIpOworCQlhaGNfcmVhZF9zZWVwcm9tKCZzZCwgKHVpbnQxNl90ICopYWhjLT5zZWVwX2NvbmZpZywKKwkJCQkgc3RhcnRfYWRkciwgc2l6ZW9mKHN0cnVjdCBzZWVwcm9tX2NvbmZpZykvMik7CisjaWYgQUhDX1BDSV9DT05GSUcgPiAwCisJCWlmICgoYWhjLT5jaGlwICYgQUhDX1ZMKSA9PSAwKQorCQkJYWhjX3JlbGVhc2Vfc2VlcHJvbSgmc2QpOworI2VuZGlmCisJCXdyaXR0ZW4gPSBsZW5ndGg7CisJfQorCitkb25lOgorCWlmICghcGF1c2VkKQorCQlhaGNfdW5wYXVzZShhaGMpOworCWFoY191bmxvY2soYWhjLCAmcyk7CisJcmV0dXJuICh3cml0dGVuKTsKK30KKworLyoKKyAqIFJldHVybiBpbmZvcm1hdGlvbiB0byBoYW5kbGUgL3Byb2Mgc3VwcG9ydCBmb3IgdGhlIGRyaXZlci4KKyAqLworaW50CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCithaGNfbGludXhfcHJvY19pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCSAgICBpbnQgbGVuZ3RoLCBpbnQgaG9zdG5vLCBpbnQgaW5vdXQpCisjZWxzZQorYWhjX2xpbnV4X3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsCisJCSAgICBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBpbm91dCkKKyNlbmRpZgoreworCXN0cnVjdAlhaGNfc29mdGMgKmFoYzsKKwlzdHJ1Y3QJaW5mb19zdHIgaW5mbzsKKwljaGFyCWFoY19pbmZvWzI1Nl07CisJdV9sb25nCXM7CisJdV9pbnQJbWF4X3Rhcmc7CisJdV9pbnQJaTsKKwlpbnQJcmV0dmFsOworCisJcmV0dmFsID0gLUVJTlZBTDsKKwlhaGNfbGlzdF9sb2NrKCZzKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlUQUlMUV9GT1JFQUNIKGFoYywgJmFoY190YWlscSwgbGlua3MpIHsKKwkJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdC0+aG9zdF9ubyA9PSBob3N0bm8pCisJCQlicmVhazsKKwl9CisjZWxzZQorCWFoYyA9IGFoY19maW5kX3NvZnRjKCooc3RydWN0IGFoY19zb2Z0YyAqKilzaG9zdC0+aG9zdGRhdGEpOworI2VuZGlmCisKKwlpZiAoYWhjID09IE5VTEwpCisJCWdvdG8gZG9uZTsKKworCSAvKiBIYXMgZGF0YSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGZpbGU/ICovIAorCWlmIChpbm91dCA9PSBUUlVFKSB7CisJCXJldHZhbCA9IGFoY19wcm9jX3dyaXRlX3NlZXByb20oYWhjLCBidWZmZXIsIGxlbmd0aCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoc3RhcnQpCisJCSpzdGFydCA9IGJ1ZmZlcjsKKworCWluZm8uYnVmZmVyCT0gYnVmZmVyOworCWluZm8ubGVuZ3RoCT0gbGVuZ3RoOworCWluZm8ub2Zmc2V0CT0gb2Zmc2V0OworCWluZm8ucG9zCT0gMDsKKworCWNvcHlfaW5mbygmaW5mbywgIkFkYXB0ZWMgQUlDN3h4eCBkcml2ZXIgdmVyc2lvbjogJXNcbiIsCisJCSAgQUlDN1hYWF9EUklWRVJfVkVSU0lPTik7CisJY29weV9pbmZvKCZpbmZvLCAiJXNcbiIsIGFoYy0+ZGVzY3JpcHRpb24pOworCWFoY19jb250cm9sbGVyX2luZm8oYWhjLCBhaGNfaW5mbyk7CisJY29weV9pbmZvKCZpbmZvLCAiJXNcbiIsIGFoY19pbmZvKTsKKwljb3B5X2luZm8oJmluZm8sICJBbGxvY2F0ZWQgU0NCczogJWQsIFNHIExpc3QgTGVuZ3RoOiAlZFxuXG4iLAorCQkgIGFoYy0+c2NiX2RhdGEtPm51bXNjYnMsIEFIQ19OU0VHKTsKKworCisJaWYgKGFoYy0+c2VlcF9jb25maWcgPT0gTlVMTCkKKwkJY29weV9pbmZvKCZpbmZvLCAiTm8gU2VyaWFsIEVFUFJPTVxuIik7CisJZWxzZSB7CisJCWNvcHlfaW5mbygmaW5mbywgIlNlcmlhbCBFRVBST006XG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZigqYWhjLT5zZWVwX2NvbmZpZykvMjsgaSsrKSB7CisJCQlpZiAoKChpICUgOCkgPT0gMCkgJiYgKGkgIT0gMCkpIHsKKwkJCQljb3B5X2luZm8oJmluZm8sICJcbiIpOworCQkJfQorCQkJY29weV9pbmZvKCZpbmZvLCAiMHglLjR4ICIsCisJCQkJICAoKHVpbnQxNl90KilhaGMtPnNlZXBfY29uZmlnKVtpXSk7CisJCX0KKwkJY29weV9pbmZvKCZpbmZvLCAiXG4iKTsKKwl9CisJY29weV9pbmZvKCZpbmZvLCAiXG4iKTsKKworCW1heF90YXJnID0gMTU7CisJaWYgKChhaGMtPmZlYXR1cmVzICYgKEFIQ19XSURFfEFIQ19UV0lOKSkgPT0gMCkKKwkJbWF4X3RhcmcgPSA3OworCisJZm9yIChpID0gMDsgaSA8PSBtYXhfdGFyZzsgaSsrKSB7CisJCXVfaW50IG91cl9pZDsKKwkJdV9pbnQgdGFyZ2V0X2lkOworCQljaGFyIGNoYW5uZWw7CisKKwkJY2hhbm5lbCA9ICdBJzsKKwkJb3VyX2lkID0gYWhjLT5vdXJfaWQ7CisJCXRhcmdldF9pZCA9IGk7CisJCWlmIChpID4gNyAmJiAoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSAhPSAwKSB7CisJCQljaGFubmVsID0gJ0InOworCQkJb3VyX2lkID0gYWhjLT5vdXJfaWRfYjsKKwkJCXRhcmdldF9pZCA9IGkgJSA4OworCQl9CisKKwkJYWhjX2R1bXBfdGFyZ2V0X3N0YXRlKGFoYywgJmluZm8sIG91cl9pZCwKKwkJCQkgICAgICBjaGFubmVsLCB0YXJnZXRfaWQsIGkpOworCX0KKwlyZXR2YWwgPSBpbmZvLnBvcyA+IGluZm8ub2Zmc2V0ID8gaW5mby5wb3MgLSBpbmZvLm9mZnNldCA6IDA7Citkb25lOgorCWFoY19saXN0X3VubG9jaygmcyk7CisJcmV0dXJuIChyZXR2YWwpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9yZWcuaF9zaGlwcGVkIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9yZWcuaF9zaGlwcGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMTM5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3JlZy5oX3NoaXBwZWQKQEAgLTAsMCArMSwxNzg3IEBACisvKgorICogRE8gTk9UIEVESVQgLSBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKyAqCQkgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZSBmaWxlczoKKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHguc2VxIzU2ICQKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5yZWcjMzkgJAorICovCit0eXBlZGVmIGludCAoYWhjX3JlZ19wcmludF90KSh1X2ludCwgdV9pbnQgKiwgdV9pbnQpOwordHlwZWRlZiBzdHJ1Y3QgYWhjX3JlZ19wYXJzZV9lbnRyeSB7CisJY2hhcgkqbmFtZTsKKwl1aW50OF90CSB2YWx1ZTsKKwl1aW50OF90CSBtYXNrOworfSBhaGNfcmVnX3BhcnNlX2VudHJ5X3Q7CisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lzZXFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2NzaXNlcV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NTSVNFUSIsIDB4MDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3N4ZnJjdGwwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3N4ZnJjdGwwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTWEZSQ1RMMCIsIDB4MDEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3N4ZnJjdGwxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3N4ZnJjdGwxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTWEZSQ1RMMSIsIDB4MDIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lzaWdvX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3Njc2lzaWdvX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJU0lHTyIsIDB4MDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lzaWdpX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3Njc2lzaWdpX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJU0lHSSIsIDB4MDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lyYXRlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3Njc2lyYXRlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJUkFURSIsIDB4MDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lpZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY3NpaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lJRCIsIDB4MDUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lkYXRsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3Njc2lkYXRsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJREFUTCIsIDB4MDYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lkYXRoX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3Njc2lkYXRoX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJREFUSCIsIDB4MDcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3N0Y250X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3N0Y250X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTVENOVCIsIDB4MDgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX29wdGlvbm1vZGVfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfb3B0aW9ubW9kZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1BUSU9OTU9ERSIsIDB4MDgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3RhcmdjcmNjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfdGFyZ2NyY2NudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiVEFSR0NSQ0NOVCIsIDB4MGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2NscnNpbnQwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2NscnNpbnQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTFJTSU5UMCIsIDB4MGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NzdGF0MF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zc3RhdDBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNTVEFUMCIsIDB4MGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2NscnNpbnQxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2NscnNpbnQxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTFJTSU5UMSIsIDB4MGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NzdGF0MV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zc3RhdDFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNTVEFUMSIsIDB4MGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NzdGF0Ml9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zc3RhdDJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNTVEFUMiIsIDB4MGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NzdGF0M19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zc3RhdDNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNTVEFUMyIsIDB4MGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lpZF91bHRyYTJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2NzaWlkX3VsdHJhMl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NTSUlEX1VMVFJBMiIsIDB4MGYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NpbW9kZTBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2ltb2RlMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0lNT0RFMCIsIDB4MTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NpbW9kZTFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2ltb2RlMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0lNT0RFMSIsIDB4MTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lidXNsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3Njc2lidXNsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJQlVTTCIsIDB4MTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lidXNoX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3Njc2lidXNoX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJQlVTSCIsIDB4MTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3N4ZnJjdGwyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3N4ZnJjdGwyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTWEZSQ1RMMiIsIDB4MTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NoYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zaGFkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNIQUREUiIsIDB4MTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlbHRpbWVyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NlbHRpbWVyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRUxUSU1FUiIsIDB4MTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlbGlkX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NlbGlkX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRUxJRCIsIDB4MTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYW1jdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2NhbWN0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NBTUNUTCIsIDB4MWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3RhcmdpZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY190YXJnaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlRBUkdJRCIsIDB4MWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NwaW9jYXBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc3Bpb2NhcF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU1BJT0NBUCIsIDB4MWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2JyZGN0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19icmRjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJSRENUTCIsIDB4MWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlZWN0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zZWVjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFRUNUTCIsIDB4MWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NibGtjdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2Jsa2N0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0JMS0NUTCIsIDB4MWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2J1c3lfdGFyZ2V0c19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19idXN5X3RhcmdldHNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJVU1lfVEFSR0VUUyIsIDB4MjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3VsdHJhX2VuYl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY191bHRyYV9lbmJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlVMVFJBX0VOQiIsIDB4MzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Rpc2NfZHNiX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2Rpc2NfZHNiX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJESVNDX0RTQiIsIDB4MzIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2NtZHNpemVfdGFibGVfdGFpbF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19jbWRzaXplX3RhYmxlX3RhaWxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNRFNJWkVfVEFCTEVfVEFJTCIsIDB4MzQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX213aV9yZXNpZHVhbF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19td2lfcmVzaWR1YWxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk1XSV9SRVNJRFVBTCIsIDB4MzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX25leHRfcXVldWVkX3NjYl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19uZXh0X3F1ZXVlZF9zY2JfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk5FWFRfUVVFVUVEX1NDQiIsIDB4MzksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX21zZ19vdXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfbXNnX291dF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTVNHX09VVCIsIDB4M2EsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RtYXBhcmFtc19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19kbWFwYXJhbXNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRNQVBBUkFNUyIsIDB4M2IsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlcV9mbGFnc19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zZXFfZmxhZ3NfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFUV9GTEFHUyIsIDB4M2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NhdmVkX3Njc2lpZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zYXZlZF9zY3NpaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX1NDU0lJRCIsIDB4M2QsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NhdmVkX2x1bl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zYXZlZF9sdW5fcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX0xVTiIsIDB4M2UsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2xhc3RwaGFzZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19sYXN0cGhhc2VfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxBU1RQSEFTRSIsIDB4M2YsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3dhaXRpbmdfc2NiaF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY193YWl0aW5nX3NjYmhfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIldBSVRJTkdfU0NCSCIsIDB4NDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Rpc2Nvbm5lY3RlZF9zY2JoX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2Rpc2Nvbm5lY3RlZF9zY2JoX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJESVNDT05ORUNURURfU0NCSCIsIDB4NDEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2ZyZWVfc2NiaF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19mcmVlX3NjYmhfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkZSRUVfU0NCSCIsIDB4NDIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2NvbXBsZXRlX3NjYmhfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfY29tcGxldGVfc2NiaF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ09NUExFVEVfU0NCSCIsIDB4NDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2hzY2JfYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19oc2NiX2FkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkhTQ0JfQUREUiIsIDB4NDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NoYXJlZF9kYXRhX2FkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2hhcmVkX2RhdGFfYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0hBUkVEX0RBVEFfQUREUiIsIDB4NDgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2tlcm5lbF9xaW5wb3NfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfa2VybmVsX3FpbnBvc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiS0VSTkVMX1FJTlBPUyIsIDB4NGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3FpbnBvc19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19xaW5wb3NfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlFJTlBPUyIsIDB4NGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3FvdXRwb3NfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfcW91dHBvc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUU9VVFBPUyIsIDB4NGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2tlcm5lbF90cWlucG9zX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2tlcm5lbF90cWlucG9zX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJLRVJORUxfVFFJTlBPUyIsIDB4NGYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3RxaW5wb3NfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfdHFpbnBvc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiVFFJTlBPUyIsIDB4NTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2FyZ18xX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2FyZ18xX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBUkdfMSIsIDB4NTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2FyZ18yX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2FyZ18yX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBUkdfMiIsIDB4NTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2xhc3RfbXNnX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2xhc3RfbXNnX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMQVNUX01TRyIsIDB4NTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lzZXFfdGVtcGxhdGVfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2NzaXNlcV90ZW1wbGF0ZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NTSVNFUV9URU1QTEFURSIsIDB4NTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2hhXzI3NF9iaW9zZ2xvYmFsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2hhXzI3NF9iaW9zZ2xvYmFsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIQV8yNzRfQklPU0dMT0JBTCIsIDB4NTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlcV9mbGFnczJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2VxX2ZsYWdzMl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VRX0ZMQUdTMiIsIDB4NTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2ljb25mX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3Njc2ljb25mX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJQ09ORiIsIDB4NWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2ludGRlZl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19pbnRkZWZfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVERFRiIsIDB4NWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2hvc3Rjb25mX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2hvc3Rjb25mX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIT1NUQ09ORiIsIDB4NWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2hhXzI3NF9iaW9zY3RybF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19oYV8yNzRfYmlvc2N0cmxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkhBXzI3NF9CSU9TQ1RSTCIsIDB4NWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlcWN0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zZXFjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFUUNUTCIsIDB4NjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlcXJhbV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zZXFyYW1fcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFUVJBTSIsIDB4NjEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlcWFkZHIwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NlcWFkZHIwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRVFBRERSMCIsIDB4NjIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlcWFkZHIxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NlcWFkZHIxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRVFBRERSMSIsIDB4NjMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2FjY3VtX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2FjY3VtX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBQ0NVTSIsIDB4NjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NpbmRleF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zaW5kZXhfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNJTkRFWCIsIDB4NjUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RpbmRleF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19kaW5kZXhfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRJTkRFWCIsIDB4NjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2FsbG9uZXNfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfYWxsb25lc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQUxMT05FUyIsIDB4NjksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2FsbHplcm9zX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2FsbHplcm9zX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBTExaRVJPUyIsIDB4NmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX25vbmVfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfbm9uZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTk9ORSIsIDB4NmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2ZsYWdzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2ZsYWdzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJGTEFHUyIsIDB4NmIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NpbmRpcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zaW5kaXJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNJTkRJUiIsIDB4NmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RpbmRpcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19kaW5kaXJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRJTkRJUiIsIDB4NmQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Z1bmN0aW9uMV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19mdW5jdGlvbjFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkZVTkNUSU9OMSIsIDB4NmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3N0YWNrX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3N0YWNrX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTVEFDSyIsIDB4NmYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Rhcmdfb2Zmc2V0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3Rhcmdfb2Zmc2V0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJUQVJHX09GRlNFVCIsIDB4NzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NyYW1fYmFzZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zcmFtX2Jhc2VfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNSQU1fQkFTRSIsIDB4NzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2JjdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfYmN0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQkNUTCIsIDB4ODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RzY29tbWFuZDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfZHNjb21tYW5kMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRFNDT01NQU5EMCIsIDB4ODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2J1c3RpbWVfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfYnVzdGltZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQlVTVElNRSIsIDB4ODUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RzY29tbWFuZDFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfZHNjb21tYW5kMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRFNDT01NQU5EMSIsIDB4ODUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2J1c3NwZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19idXNzcGRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJVU1NQRCIsIDB4ODYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2hzX21haWxib3hfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfaHNfbWFpbGJveF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSFNfTUFJTEJPWCIsIDB4ODYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RzcGNpc3RhdHVzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2RzcGNpc3RhdHVzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJEU1BDSVNUQVRVUyIsIDB4ODYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2hjbnRybF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19oY250cmxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkhDTlRSTCIsIDB4ODcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2hhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2hhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIQUREUiIsIDB4ODgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2hjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfaGNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSENOVCIsIDB4OGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYnB0cl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY2JwdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQlBUUiIsIDB4OTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2ludHN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfaW50c3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UU1RBVCIsIDB4OTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2NscmludF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19jbHJpbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNMUklOVCIsIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Vycm9yX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2Vycm9yX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJFUlJPUiIsIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RmY250cmxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfZGZjbnRybF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZDTlRSTCIsIDB4OTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Rmc3RhdHVzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2Rmc3RhdHVzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERlNUQVRVUyIsIDB4OTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Rmd2FkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfZGZ3YWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZXQUREUiIsIDB4OTUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RmcmFkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfZGZyYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZSQUREUiIsIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RmZGF0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2RmZGF0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERkRBVCIsIDB4OTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYmNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY2JjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQkNOVCIsIDB4OWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3FpbmZpZm9fcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfcWluZmlmb19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUUlORklGTyIsIDB4OWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3FpbmNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19xaW5jbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlFJTkNOVCIsIDB4OWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3FvdXRmaWZvX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3FvdXRmaWZvX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRT1VURklGTyIsIDB4OWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2NyY2NvbnRyb2wxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2NyY2NvbnRyb2wxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDUkNDT05UUk9MMSIsIDB4OWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3FvdXRjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfcW91dGNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUU9VVENOVCIsIDB4OWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lwaGFzZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY3NpcGhhc2VfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lQSEFTRSIsIDB4OWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NmdW5jdF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zZnVuY3RfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNGVU5DVCIsIDB4OWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9iYXNlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYl9iYXNlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfQkFTRSIsIDB4YTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9jZGJfcHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYl9jZGJfcHRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfQ0RCX1BUUiIsIDB4YTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9yZXNpZHVhbF9zZ3B0cl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY2JfcmVzaWR1YWxfc2dwdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9SRVNJRFVBTF9TR1BUUiIsIDB4YTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9zY3NpX3N0YXR1c19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY2Jfc2NzaV9zdGF0dXNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9TQ1NJX1NUQVRVUyIsIDB4YTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl90YXJnZXRfcGhhc2VzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYl90YXJnZXRfcGhhc2VzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfVEFSR0VUX1BIQVNFUyIsIDB4YTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl90YXJnZXRfZGF0YV9kaXJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2NiX3RhcmdldF9kYXRhX2Rpcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1RBUkdFVF9EQVRBX0RJUiIsIDB4YWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl90YXJnZXRfaXRhZ19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY2JfdGFyZ2V0X2l0YWdfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9UQVJHRVRfSVRBRyIsIDB4YWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9kYXRhcHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYl9kYXRhcHRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfREFUQVBUUiIsIDB4YWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9kYXRhY250X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYl9kYXRhY250X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfREFUQUNOVCIsIDB4YjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9zZ3B0cl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY2Jfc2dwdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9TR1BUUiIsIDB4YjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9jb250cm9sX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYl9jb250cm9sX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfQ09OVFJPTCIsIDB4YjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9zY3NpaWRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2NiX3Njc2lpZF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1NDU0lJRCIsIDB4YjksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9sdW5fcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2NiX2x1bl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX0xVTiIsIDB4YmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl90YWdfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2NiX3RhZ19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1RBRyIsIDB4YmIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9jZGJfbGVuX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYl9jZGJfbGVuX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfQ0RCX0xFTiIsIDB4YmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9zY3NpcmF0ZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY2Jfc2NzaXJhdGVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9TQ1NJUkFURSIsIDB4YmQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9zY3Npb2Zmc2V0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYl9zY3Npb2Zmc2V0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfU0NTSU9GRlNFVCIsIDB4YmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9uZXh0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYl9uZXh0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfTkVYVCIsIDB4YmYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl82NF9zcGFyZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY2JfNjRfc3BhcmVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl82NF9TUEFSRSIsIDB4YzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlZWN0bF8yODQwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NlZWN0bF8yODQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRUVDVExfMjg0MCIsIDB4YzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3N0YXR1c18yODQwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3N0YXR1c18yODQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTVEFUVVNfMjg0MCIsIDB4YzEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl82NF9idHRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2NiXzY0X2J0dF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCXzY0X0JUVCIsIDB4ZDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2NjaGFkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfY2NoYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NIQUREUiIsIDB4ZTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2NjaGNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19jY2hjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDSENOVCIsIDB4ZTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Njc2dyYW1fcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfY2NzZ3JhbV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTR1JBTSIsIDB4ZTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Njc2dhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2Njc2dhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NHQUREUiIsIDB4ZWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Njc2djdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfY2NzZ2N0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTR0NUTCIsIDB4ZWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Njc2NicmFtX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2Njc2NicmFtX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQlJBTSIsIDB4ZWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Njc2NiYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19jY3NjYmFkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0NCQUREUiIsIDB4ZWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Njc2NiY3RsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2Njc2NiY3RsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQkNUTCIsIDB4ZWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Njc2NiY250X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2Njc2NiY250X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQkNOVCIsIDB4ZWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYmJhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYmJhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JCQUREUiIsIDB4ZjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Njc2NicHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2Njc2NicHRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQlBUUiIsIDB4ZjEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2huc2NiX3FvZmZfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfaG5zY2JfcW9mZl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSE5TQ0JfUU9GRiIsIDB4ZjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Nuc2NiX3FvZmZfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc25zY2JfcW9mZl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU05TQ0JfUU9GRiIsIDB4ZjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Nkc2NiX3FvZmZfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2RzY2JfcW9mZl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0RTQ0JfUU9GRiIsIDB4ZjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3FvZmZfY3Rsc3RhX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3FvZmZfY3Rsc3RhX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRT0ZGX0NUTFNUQSIsIDB4ZmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RmZl90aHJzaF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19kZmZfdGhyc2hfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGRl9USFJTSCIsIDB4ZmIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NnX2NhY2hlX3NoYWRvd19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zZ19jYWNoZV9zaGFkb3dfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHX0NBQ0hFX1NIQURPVyIsIDB4ZmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NnX2NhY2hlX3ByZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zZ19jYWNoZV9wcmVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHX0NBQ0hFX1BSRSIsIDB4ZmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKworI2RlZmluZQlTQ1NJU0VRICAgICAgICAgCQkweDAwCisjZGVmaW5lCQlURU1PREUgICAgICAgICAgCTB4ODAKKyNkZWZpbmUJCVNDU0lSU1RPICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNYRlJDVEwwICAgICAgICAJCTB4MDEKKyNkZWZpbmUJCURGT04gICAgICAgICAgICAJMHg4MAorI2RlZmluZQkJREZQRVhQICAgICAgICAgIAkweDQwCisjZGVmaW5lCQlGQVNUMjAgICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCUNMUlNUQ05UICAgICAgICAJMHgxMAorI2RlZmluZQkJU1BJT0VOICAgICAgICAgIAkweDA4CisjZGVmaW5lCQlTQ0FNRU4gICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCUNMUkNITiAgICAgICAgICAJMHgwMgorCisjZGVmaW5lCVNYRlJDVEwxICAgICAgICAJCTB4MDIKKyNkZWZpbmUJCVNUSU1FU0VMICAgICAgICAJMHgxOAorI2RlZmluZQkJQklUQlVDS0VUICAgICAgIAkweDgwCisjZGVmaW5lCQlTV1JBUEVOICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUVOU1RJTUVSICAgICAgICAJMHgwNAorI2RlZmluZQkJQUNUTkVHRU4gICAgICAgIAkweDAyCisjZGVmaW5lCQlTVFBXRU4gICAgICAgICAgCTB4MDEKKworI2RlZmluZQlTQ1NJU0lHTyAgICAgICAgCQkweDAzCisjZGVmaW5lCQlDRE8gICAgICAgICAgICAgCTB4ODAKKyNkZWZpbmUJCUlPTyAgICAgICAgICAgICAJMHg0MAorI2RlZmluZQkJTVNHTyAgICAgICAgICAgIAkweDIwCisjZGVmaW5lCQlBVE5PICAgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCVNFTE8gICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJQlNZTyAgICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlSRVFPICAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUFDS08gICAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNDU0lTSUdJICAgICAgICAJCTB4MDMKKyNkZWZpbmUJCVBfREFUQUlOX0RUICAgICAJMHg2MAorI2RlZmluZQkJUF9EQVRBT1VUX0RUICAgIAkweDIwCisjZGVmaW5lCQlBVE5JICAgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCVNFTEkgICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJQlNZSSAgICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlSRVFJICAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUFDS0kgICAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNDU0lSQVRFICAgICAgICAJCTB4MDQKKyNkZWZpbmUJCVNYRlIgICAgICAgICAgICAJMHg3MAorI2RlZmluZQkJU09GUyAgICAgICAgICAgIAkweDBmCisjZGVmaW5lCQlTWEZSX1VMVFJBMiAgICAgCTB4MGYKKyNkZWZpbmUJCVdJREVYRkVSICAgICAgICAJMHg4MAorI2RlZmluZQkJRU5BQkxFX0NSQyAgICAgIAkweDQwCisjZGVmaW5lCQlTSU5HTEVfRURHRSAgICAgCTB4MTAKKworI2RlZmluZQlTQ1NJSUQgICAgICAgICAgCQkweDA1CisjZGVmaW5lCVNDU0lPRkZTRVQgICAgICAJCTB4MDUKKyNkZWZpbmUJCVNPRlNfVUxUUkEyICAgICAJMHg3ZgorCisjZGVmaW5lCVNDU0lEQVRMICAgICAgICAJCTB4MDYKKworI2RlZmluZQlTQ1NJREFUSCAgICAgICAgCQkweDA3CisKKyNkZWZpbmUJU1RDTlQgICAgICAgICAgIAkJMHgwOAorCisjZGVmaW5lCU9QVElPTk1PREUgICAgICAJCTB4MDgKKyNkZWZpbmUJCU9QVElPTk1PREVfREVGQVVMVFMJMHgwMworI2RlZmluZQkJQVVUT1JBVEVFTiAgICAgIAkweDgwCisjZGVmaW5lCQlBVVRPQUNLRU4gICAgICAgCTB4NDAKKyNkZWZpbmUJCUFUTk1HTU5URU4gICAgICAJMHgyMAorI2RlZmluZQkJQlVTRlJFRVJFViAgICAgIAkweDEwCisjZGVmaW5lCQlFWFBQSEFTRURJUyAgICAgCTB4MDgKKyNkZWZpbmUJCVNDU0lEQVRMX0lNR0VOICAJMHgwNAorI2RlZmluZQkJQVVUT19NU0dPVVRfREUgIAkweDAyCisjZGVmaW5lCQlESVNfTVNHSU5fRFVBTEVER0UJMHgwMQorCisjZGVmaW5lCVRBUkdDUkNDTlQgICAgICAJCTB4MGEKKworI2RlZmluZQlDTFJTSU5UMCAgICAgICAgCQkweDBiCisjZGVmaW5lCQlDTFJTRUxETyAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUNMUlNFTERJICAgICAgICAJMHgyMAorI2RlZmluZQkJQ0xSU0VMSU5HTyAgICAgIAkweDEwCisjZGVmaW5lCQlDTFJJT0VSUiAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUNMUlNXUkFQICAgICAgICAJMHgwOAorI2RlZmluZQkJQ0xSU1BJT1JEWSAgICAgIAkweDAyCisKKyNkZWZpbmUJU1NUQVQwICAgICAgICAgIAkJMHgwYgorI2RlZmluZQkJVEFSR0VUICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlTRUxETyAgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVNFTERJICAgICAgICAgICAJMHgyMAorI2RlZmluZQkJU0VMSU5HTyAgICAgICAgIAkweDEwCisjZGVmaW5lCQlTV1JBUCAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUlPRVJSICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJU0RPTkUgICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlTUElPUkRZICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCURNQURPTkUgICAgICAgICAJMHgwMQorCisjZGVmaW5lCUNMUlNJTlQxICAgICAgICAJCTB4MGMKKyNkZWZpbmUJCUNMUlNFTFRJTUVPICAgICAJMHg4MAorI2RlZmluZQkJQ0xSQVROTyAgICAgICAgIAkweDQwCisjZGVmaW5lCQlDTFJTQ1NJUlNUSSAgICAgCTB4MjAKKyNkZWZpbmUJCUNMUkJVU0ZSRUUgICAgICAJMHgwOAorI2RlZmluZQkJQ0xSU0NTSVBFUlIgICAgIAkweDA0CisjZGVmaW5lCQlDTFJQSEFTRUNIRyAgICAgCTB4MDIKKyNkZWZpbmUJCUNMUlJFUUlOSVQgICAgICAJMHgwMQorCisjZGVmaW5lCVNTVEFUMSAgICAgICAgICAJCTB4MGMKKyNkZWZpbmUJCVNFTFRPICAgICAgICAgICAJMHg4MAorI2RlZmluZQkJQVROVEFSRyAgICAgICAgIAkweDQwCisjZGVmaW5lCQlTQ1NJUlNUSSAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVBIQVNFTUlTICAgICAgICAJMHgxMAorI2RlZmluZQkJQlVTRlJFRSAgICAgICAgIAkweDA4CisjZGVmaW5lCQlTQ1NJUEVSUiAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVBIQVNFQ0hHICAgICAgICAJMHgwMgorI2RlZmluZQkJUkVRSU5JVCAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU1NUQVQyICAgICAgICAgIAkJMHgwZAorI2RlZmluZQkJU0ZDTlQgICAgICAgICAgIAkweDFmCisjZGVmaW5lCQlPVkVSUlVOICAgICAgICAgCTB4ODAKKyNkZWZpbmUJCVNIVkFMSUQgICAgICAgICAJMHg0MAorI2RlZmluZQkJRVhQX0FDVElWRSAgICAgIAkweDEwCisjZGVmaW5lCQlDUkNWQUxFUlIgICAgICAgCTB4MDgKKyNkZWZpbmUJCUNSQ0VOREVSUiAgICAgICAJMHgwNAorI2RlZmluZQkJQ1JDUkVRRVJSICAgICAgIAkweDAyCisjZGVmaW5lCQlEVUFMX0VER0VfRVJSICAgCTB4MDEKKworI2RlZmluZQlTU1RBVDMgICAgICAgICAgCQkweDBlCisjZGVmaW5lCQlTQ1NJQ05UICAgICAgICAgCTB4ZjAKKyNkZWZpbmUJCVUyT0ZGQ05UICAgICAgICAJMHg3ZgorI2RlZmluZQkJT0ZGQ05UICAgICAgICAgIAkweDBmCisKKyNkZWZpbmUJU0NTSUlEX1VMVFJBMiAgIAkJMHgwZgorCisjZGVmaW5lCVNJTU9ERTAgICAgICAgICAJCTB4MTAKKyNkZWZpbmUJCUVOU0VMRE8gICAgICAgICAJMHg0MAorI2RlZmluZQkJRU5TRUxESSAgICAgICAgIAkweDIwCisjZGVmaW5lCQlFTlNFTElOR08gICAgICAgCTB4MTAKKyNkZWZpbmUJCUVOSU9FUlIgICAgICAgICAJMHgwOAorI2RlZmluZQkJRU5TV1JBUCAgICAgICAgIAkweDA4CisjZGVmaW5lCQlFTlNET05FICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCUVOU1BJT1JEWSAgICAgICAJMHgwMgorI2RlZmluZQkJRU5ETUFET05FICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0lNT0RFMSAgICAgICAgIAkJMHgxMQorI2RlZmluZQkJRU5TRUxUSU1PICAgICAgIAkweDgwCisjZGVmaW5lCQlFTkFUTlRBUkcgICAgICAgCTB4NDAKKyNkZWZpbmUJCUVOU0NTSVJTVCAgICAgICAJMHgyMAorI2RlZmluZQkJRU5QSEFTRU1JUyAgICAgIAkweDEwCisjZGVmaW5lCQlFTkJVU0ZSRUUgICAgICAgCTB4MDgKKyNkZWZpbmUJCUVOU0NTSVBFUlIgICAgICAJMHgwNAorI2RlZmluZQkJRU5QSEFTRUNIRyAgICAgIAkweDAyCisjZGVmaW5lCQlFTlJFUUlOSVQgICAgICAgCTB4MDEKKworI2RlZmluZQlTQ1NJQlVTTCAgICAgICAgCQkweDEyCisKKyNkZWZpbmUJU0NTSUJVU0ggICAgICAgIAkJMHgxMworCisjZGVmaW5lCVNYRlJDVEwyICAgICAgICAJCTB4MTMKKyNkZWZpbmUJCUFTWU5DX1NFVFVQICAgICAJMHgwNworI2RlZmluZQkJQVVUT1JTVERJUyAgICAgIAkweDEwCisjZGVmaW5lCQlDTURETUFFTiAgICAgICAgCTB4MDgKKworI2RlZmluZQlTSEFERFIgICAgICAgICAgCQkweDE0CisKKyNkZWZpbmUJU0VMVElNRVIgICAgICAgIAkJMHgxOAorI2RlZmluZQlUQVJHSURJTiAgICAgICAgCQkweDE4CisjZGVmaW5lCQlTVEFHRTYgICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVNUQUdFNSAgICAgICAgICAJMHgxMAorI2RlZmluZQkJU1RBR0U0ICAgICAgICAgIAkweDA4CisjZGVmaW5lCQlTVEFHRTMgICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVNUQUdFMiAgICAgICAgICAJMHgwMgorI2RlZmluZQkJU1RBR0UxICAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0VMSUQgICAgICAgICAgIAkJMHgxOQorI2RlZmluZQkJU0VMSURfTUFTSyAgICAgIAkweGYwCisjZGVmaW5lCQlPTkVCSVQgICAgICAgICAgCTB4MDgKKworI2RlZmluZQlTQ0FNQ1RMICAgICAgICAgCQkweDFhCisjZGVmaW5lCQlTQ0FNTFZMICAgICAgICAgCTB4MDMKKyNkZWZpbmUJCUVOU0NBTVNFTE8gICAgICAJMHg4MAorI2RlZmluZQkJQ0xSU0NBTVNFTElEICAgIAkweDQwCisjZGVmaW5lCQlBTFRTVElNICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCURGTFRUSUQgICAgICAgICAJMHgxMAorCisjZGVmaW5lCVRBUkdJRCAgICAgICAgICAJCTB4MWIKKworI2RlZmluZQlTUElPQ0FQICAgICAgICAgCQkweDFiCisjZGVmaW5lCQlTT0ZUMSAgICAgICAgICAgCTB4ODAKKyNkZWZpbmUJCVNPRlQwICAgICAgICAgICAJMHg0MAorI2RlZmluZQkJU09GVENNREVOICAgICAgIAkweDIwCisjZGVmaW5lCQlFWFRfQlJEQ1RMICAgICAgCTB4MTAKKyNkZWZpbmUJCVNFRVBST00gICAgICAgICAJMHgwOAorI2RlZmluZQkJRUVQUk9NICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlST00gICAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCVNTUElPQ1BTICAgICAgICAJMHgwMQorCisjZGVmaW5lCUJSRENUTCAgICAgICAgICAJCTB4MWQKKyNkZWZpbmUJCUJSRERBVDcgICAgICAgICAJMHg4MAorI2RlZmluZQkJQlJEREFUNiAgICAgICAgIAkweDQwCisjZGVmaW5lCQlCUkREQVQ1ICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCUJSRERBVDQgICAgICAgICAJMHgxMAorI2RlZmluZQkJQlJEU1RCICAgICAgICAgIAkweDEwCisjZGVmaW5lCQlCUkREQVQzICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUJSRENTICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJQlJEREFUMiAgICAgICAgIAkweDA0CisjZGVmaW5lCQlCUkRSVyAgICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCUJSRFJXX1VMVFJBMiAgICAJMHgwMgorI2RlZmluZQkJQlJEQ1RMMSAgICAgICAgIAkweDAyCisjZGVmaW5lCQlCUkRDVEwwICAgICAgICAgCTB4MDEKKyNkZWZpbmUJCUJSRFNUQl9VTFRSQTIgICAJMHgwMQorCisjZGVmaW5lCVNFRUNUTCAgICAgICAgICAJCTB4MWUKKyNkZWZpbmUJCUVYVEFSQkFDSyAgICAgICAJMHg4MAorI2RlZmluZQkJRVhUQVJCUkVRICAgICAgIAkweDQwCisjZGVmaW5lCQlTRUVNUyAgICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVNFRVJEWSAgICAgICAgICAJMHgxMAorI2RlZmluZQkJU0VFQ1MgICAgICAgICAgIAkweDA4CisjZGVmaW5lCQlTRUVDSyAgICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVNFRURPICAgICAgICAgICAJMHgwMgorI2RlZmluZQkJU0VFREkgICAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0JMS0NUTCAgICAgICAgIAkJMHgxZgorI2RlZmluZQkJRElBR0xFREVOICAgICAgIAkweDgwCisjZGVmaW5lCQlESUFHTEVET04gICAgICAgCTB4NDAKKyNkZWZpbmUJCUFVVE9GTFVTSERJUyAgICAJMHgyMAorI2RlZmluZQkJRU5BQjQwICAgICAgICAgIAkweDA4CisjZGVmaW5lCQlTRUxCVVNCICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUVOQUIyMCAgICAgICAgICAJMHgwNAorI2RlZmluZQkJU0VMV0lERSAgICAgICAgIAkweDAyCisjZGVmaW5lCQlYQ1ZSICAgICAgICAgICAgCTB4MDEKKworI2RlZmluZQlCVVNZX1RBUkdFVFMgICAgCQkweDIwCisjZGVmaW5lCVRBUkdfU0NTSVJBVEUgICAJCTB4MjAKKworI2RlZmluZQlVTFRSQV9FTkIgICAgICAgCQkweDMwCisjZGVmaW5lCUNNRFNJWkVfVEFCTEUgICAJCTB4MzAKKworI2RlZmluZQlESVNDX0RTQiAgICAgICAgCQkweDMyCisKKyNkZWZpbmUJQ01EU0laRV9UQUJMRV9UQUlMCQkweDM0CisKKyNkZWZpbmUJTVdJX1JFU0lEVUFMICAgIAkJMHgzOAorI2RlZmluZQlUQVJHX0lNTUVESUFURV9TQ0IJCTB4MzgKKworI2RlZmluZQlORVhUX1FVRVVFRF9TQ0IgCQkweDM5CisKKyNkZWZpbmUJTVNHX09VVCAgICAgICAgIAkJMHgzYQorCisjZGVmaW5lCURNQVBBUkFNUyAgICAgICAJCTB4M2IKKyNkZWZpbmUJCVBSRUxPQURFTiAgICAgICAJMHg4MAorI2RlZmluZQkJV0lERU9ERCAgICAgICAgIAkweDQwCisjZGVmaW5lCQlTQ1NJRU4gICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVNETUFFTiAgICAgICAgICAJMHgxMAorI2RlZmluZQkJU0RNQUVOQUNLICAgICAgIAkweDEwCisjZGVmaW5lCQlIRE1BRU4gICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUhETUFFTkFDSyAgICAgICAJMHgwOAorI2RlZmluZQkJRElSRUNUSU9OICAgICAgIAkweDA0CisjZGVmaW5lCQlGSUZPRkxVU0ggICAgICAgCTB4MDIKKyNkZWZpbmUJCUZJRk9SRVNFVCAgICAgICAJMHgwMQorCisjZGVmaW5lCVNFUV9GTEFHUyAgICAgICAJCTB4M2MKKyNkZWZpbmUJCU5PVF9JREVOVElGSUVEICAJMHg4MAorI2RlZmluZQkJTk9fQ0RCX1NFTlQgICAgIAkweDQwCisjZGVmaW5lCQlUQVJHRVRfQ01EX0lTX1RBR0dFRAkweDQwCisjZGVmaW5lCQlEUEhBU0UgICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVRBUkdfQ01EX1BFTkRJTkcJMHgxMAorI2RlZmluZQkJQ01EUEhBU0VfUEVORElORwkweDA4CisjZGVmaW5lCQlEUEhBU0VfUEVORElORyAgCTB4MDQKKyNkZWZpbmUJCVNQSEFTRV9QRU5ESU5HICAJMHgwMgorI2RlZmluZQkJTk9fRElTQ09OTkVDVCAgIAkweDAxCisKKyNkZWZpbmUJU0FWRURfU0NTSUlEICAgIAkJMHgzZAorCisjZGVmaW5lCVNBVkVEX0xVTiAgICAgICAJCTB4M2UKKworI2RlZmluZQlMQVNUUEhBU0UgICAgICAgCQkweDNmCisjZGVmaW5lCQlQX01FU0dJTiAgICAgICAgCTB4ZTAKKyNkZWZpbmUJCVBIQVNFX01BU0sgICAgICAJMHhlMAorI2RlZmluZQkJUF9TVEFUVVMgICAgICAgIAkweGMwCisjZGVmaW5lCQlQX01FU0dPVVQgICAgICAgCTB4YTAKKyNkZWZpbmUJCVBfQ09NTUFORCAgICAgICAJMHg4MAorI2RlZmluZQkJUF9EQVRBSU4gICAgICAgIAkweDQwCisjZGVmaW5lCQlQX0JVU0ZSRUUgICAgICAgCTB4MDEKKyNkZWZpbmUJCVBfREFUQU9VVCAgICAgICAJMHgwMAorI2RlZmluZQkJQ0RJICAgICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlJT0kgICAgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCU1TR0kgICAgICAgICAgICAJMHgyMAorCisjZGVmaW5lCVdBSVRJTkdfU0NCSCAgICAJCTB4NDAKKworI2RlZmluZQlESVNDT05ORUNURURfU0NCSAkJMHg0MQorCisjZGVmaW5lCUZSRUVfU0NCSCAgICAgICAJCTB4NDIKKworI2RlZmluZQlDT01QTEVURV9TQ0JIICAgCQkweDQzCisKKyNkZWZpbmUJSFNDQl9BRERSICAgICAgIAkJMHg0NAorCisjZGVmaW5lCVNIQVJFRF9EQVRBX0FERFIJCTB4NDgKKworI2RlZmluZQlLRVJORUxfUUlOUE9TICAgCQkweDRjCisKKyNkZWZpbmUJUUlOUE9TICAgICAgICAgIAkJMHg0ZAorCisjZGVmaW5lCVFPVVRQT1MgICAgICAgICAJCTB4NGUKKworI2RlZmluZQlLRVJORUxfVFFJTlBPUyAgCQkweDRmCisKKyNkZWZpbmUJVFFJTlBPUyAgICAgICAgIAkJMHg1MAorCisjZGVmaW5lCUFSR18xICAgICAgICAgICAJCTB4NTEKKyNkZWZpbmUJUkVUVVJOXzEgICAgICAgIAkJMHg1MQorI2RlZmluZQkJU0VORF9NU0cgICAgICAgIAkweDgwCisjZGVmaW5lCQlTRU5EX1NFTlNFICAgICAgCTB4NDAKKyNkZWZpbmUJCVNFTkRfUkVKICAgICAgICAJMHgyMAorI2RlZmluZQkJTVNHT1VUX1BIQVNFTUlTIAkweDEwCisjZGVmaW5lCQlFWElUX01TR19MT09QICAgCTB4MDgKKyNkZWZpbmUJCUNPTlRfTVNHX0xPT1AgICAJMHgwNAorI2RlZmluZQkJQ09OVF9UQVJHX1NFU1NJT04JMHgwMgorCisjZGVmaW5lCUFSR18yICAgICAgICAgICAJCTB4NTIKKyNkZWZpbmUJUkVUVVJOXzIgICAgICAgIAkJMHg1MgorCisjZGVmaW5lCUxBU1RfTVNHICAgICAgICAJCTB4NTMKKworI2RlZmluZQlTQ1NJU0VRX1RFTVBMQVRFCQkweDU0CisjZGVmaW5lCQlFTlNFTE8gICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUVOU0VMSSAgICAgICAgICAJMHgyMAorI2RlZmluZQkJRU5SU0VMSSAgICAgICAgIAkweDEwCisjZGVmaW5lCQlFTkFVVE9BVE5PICAgICAgCTB4MDgKKyNkZWZpbmUJCUVOQVVUT0FUTkkgICAgICAJMHgwNAorI2RlZmluZQkJRU5BVVRPQVROUCAgICAgIAkweDAyCisKKyNkZWZpbmUJSEFfMjc0X0JJT1NHTE9CQUwJCTB4NTYKKyNkZWZpbmUJSU5JVElBVE9SX1RBRyAgIAkJMHg1NgorI2RlZmluZQkJSEFfMjc0X0VYVEVOREVEX1RSQU5TCTB4MDEKKworI2RlZmluZQlTRVFfRkxBR1MyICAgICAgCQkweDU3CisjZGVmaW5lCQlUQVJHRVRfTVNHX1BFTkRJTkcJMHgwMgorI2RlZmluZQkJU0NCX0RNQSAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0NTSUNPTkYgICAgICAgIAkJMHg1YQorI2RlZmluZQkJSFdTQ1NJSUQgICAgICAgIAkweDBmCisjZGVmaW5lCQlIU0NTSUlEICAgICAgICAgCTB4MDcKKyNkZWZpbmUJCVRFUk1fRU5CICAgICAgICAJMHg4MAorI2RlZmluZQkJUkVTRVRfU0NTSSAgICAgIAkweDQwCisjZGVmaW5lCQlFTlNQQ0hLICAgICAgICAgCTB4MjAKKworI2RlZmluZQlJTlRERUYgICAgICAgICAgCQkweDVjCisjZGVmaW5lCQlWRUNUT1IgICAgICAgICAgCTB4MGYKKyNkZWZpbmUJCUVER0VfVFJJRyAgICAgICAJMHg4MAorCisjZGVmaW5lCUhPU1RDT05GICAgICAgICAJCTB4NWQKKworI2RlZmluZQlIQV8yNzRfQklPU0NUUkwgCQkweDVmCisjZGVmaW5lCQlCSU9TRElTQUJMRUQgICAgCTB4MzAKKyNkZWZpbmUJCUJJT1NNT0RFICAgICAgICAJMHgzMAorI2RlZmluZQkJQ0hBTk5FTF9CX1BSSU1BUlkJMHgwOAorCisjZGVmaW5lCVNFUUNUTCAgICAgICAgICAJCTB4NjAKKyNkZWZpbmUJCVBFUlJPUkRJUyAgICAgICAJMHg4MAorI2RlZmluZQkJUEFVU0VESVMgICAgICAgIAkweDQwCisjZGVmaW5lCQlGQUlMRElTICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCUZBU1RNT0RFICAgICAgICAJMHgxMAorI2RlZmluZQkJQlJLQURSSU5URU4gICAgIAkweDA4CisjZGVmaW5lCQlTVEVQICAgICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVNFUVJFU0VUICAgICAgICAJMHgwMgorI2RlZmluZQkJTE9BRFJBTSAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0VRUkFNICAgICAgICAgIAkJMHg2MQorCisjZGVmaW5lCVNFUUFERFIwICAgICAgICAJCTB4NjIKKworI2RlZmluZQlTRVFBRERSMSAgICAgICAgCQkweDYzCisjZGVmaW5lCQlTRVFBRERSMV9NQVNLICAgCTB4MDEKKworI2RlZmluZQlBQ0NVTSAgICAgICAgICAgCQkweDY0CisKKyNkZWZpbmUJU0lOREVYICAgICAgICAgIAkJMHg2NQorCisjZGVmaW5lCURJTkRFWCAgICAgICAgICAJCTB4NjYKKworI2RlZmluZQlBTExPTkVTICAgICAgICAgCQkweDY5CisKKyNkZWZpbmUJQUxMWkVST1MgICAgICAgIAkJMHg2YQorCisjZGVmaW5lCU5PTkUgICAgICAgICAgICAJCTB4NmEKKworI2RlZmluZQlGTEFHUyAgICAgICAgICAgCQkweDZiCisjZGVmaW5lCQlaRVJPICAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUNBUlJZICAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNJTkRJUiAgICAgICAgICAJCTB4NmMKKworI2RlZmluZQlESU5ESVIgICAgICAgICAgCQkweDZkCisKKyNkZWZpbmUJRlVOQ1RJT04xICAgICAgIAkJMHg2ZQorCisjZGVmaW5lCVNUQUNLICAgICAgICAgICAJCTB4NmYKKworI2RlZmluZQlUQVJHX09GRlNFVCAgICAgCQkweDcwCisKKyNkZWZpbmUJU1JBTV9CQVNFICAgICAgIAkJMHg3MAorCisjZGVmaW5lCUJDVEwgICAgICAgICAgICAJCTB4ODQKKyNkZWZpbmUJCUFDRSAgICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJRU5BQkxFICAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJRFNDT01NQU5EMCAgICAgIAkJMHg4NAorI2RlZmluZQkJQ0FDSEVUSEVOICAgICAgIAkweDgwCisjZGVmaW5lCQlEUEFSQ0tFTiAgICAgICAgCTB4NDAKKyNkZWZpbmUJCU1QQVJDS0VOICAgICAgICAJMHgyMAorI2RlZmluZQkJRVhUUkVRTENLICAgICAgIAkweDEwCisjZGVmaW5lCQlJTlRTQ0JSQU1TRUwgICAgCTB4MDgKKyNkZWZpbmUJCVJBTVBTICAgICAgICAgICAJMHgwNAorI2RlZmluZQkJVVNDQlNJWkUzMiAgICAgIAkweDAyCisjZGVmaW5lCQlDSU9QQVJDS0VOICAgICAgCTB4MDEKKworI2RlZmluZQlCVVNUSU1FICAgICAgICAgCQkweDg1CisjZGVmaW5lCQlCT0ZGICAgICAgICAgICAgCTB4ZjAKKyNkZWZpbmUJCUJPTiAgICAgICAgICAgICAJMHgwZgorCisjZGVmaW5lCURTQ09NTUFORDEgICAgICAJCTB4ODUKKyNkZWZpbmUJCURTTEFUVCAgICAgICAgICAJMHhmYworI2RlZmluZQkJSEFERExEU0VMMSAgICAgIAkweDAyCisjZGVmaW5lCQlIQURETERTRUwwICAgICAgCTB4MDEKKworI2RlZmluZQlCVVNTUEQgICAgICAgICAgCQkweDg2CisjZGVmaW5lCQlERlRIUlNIICAgICAgICAgCTB4YzAKKyNkZWZpbmUJCURGVEhSU0hfNzUgICAgICAJMHg4MAorI2RlZmluZQkJU1RCT0ZGICAgICAgICAgIAkweDM4CisjZGVmaW5lCQlTVEJPTiAgICAgICAgICAgCTB4MDcKKworI2RlZmluZQlIU19NQUlMQk9YICAgICAgCQkweDg2CisjZGVmaW5lCQlIT1NUX01BSUxCT1ggICAgCTB4ZjAKKyNkZWZpbmUJCUhPU1RfVFFJTlBPUyAgICAJMHg4MAorI2RlZmluZQkJU0VRX01BSUxCT1ggICAgIAkweDBmCisKKyNkZWZpbmUJRFNQQ0lTVEFUVVMgICAgIAkJMHg4NgorI2RlZmluZQkJREZUSFJTSF8xMDAgICAgIAkweGMwCisKKyNkZWZpbmUJSENOVFJMICAgICAgICAgIAkJMHg4NworI2RlZmluZQkJUE9XUkROICAgICAgICAgIAkweDQwCisjZGVmaW5lCQlTV0lOVCAgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCUlSUU1TICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJUEFVU0UgICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlJTlRFTiAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUNISVBSU1QgICAgICAgICAJMHgwMQorI2RlZmluZQkJQ0hJUFJTVEFDSyAgICAgIAkweDAxCisKKyNkZWZpbmUJSEFERFIgICAgICAgICAgIAkJMHg4OAorCisjZGVmaW5lCUhDTlQgICAgICAgICAgICAJCTB4OGMKKworI2RlZmluZQlTQ0JQVFIgICAgICAgICAgCQkweDkwCisKKyNkZWZpbmUJSU5UU1RBVCAgICAgICAgIAkJMHg5MQorI2RlZmluZQkJU0VRSU5UX01BU0sgICAgIAkweGYxCisjZGVmaW5lCQlPVVRfT0ZfUkFOR0UgICAgCTB4ZTEKKyNkZWZpbmUJCU5PX0ZSRUVfU0NCICAgICAJMHhkMQorI2RlZmluZQkJU0NCX01JU01BVENIICAgIAkweGMxCisjZGVmaW5lCQlNSVNTRURfQlVTRlJFRSAgCTB4YjEKKyNkZWZpbmUJCU1LTVNHX0ZBSUxFRCAgICAJMHhhMQorI2RlZmluZQkJREFUQV9PVkVSUlVOICAgIAkweDkxCisjZGVmaW5lCQlQRVJSX0RFVEVDVEVEICAgCTB4ODEKKyNkZWZpbmUJCUJBRF9TVEFUVVMgICAgICAJMHg3MQorI2RlZmluZQkJSE9TVF9NU0dfTE9PUCAgIAkweDYxCisjZGVmaW5lCQlQREFUQV9SRUlOSVQgICAgCTB4NTEKKyNkZWZpbmUJCUlHTl9XSURFX1JFUyAgICAJMHg0MQorI2RlZmluZQkJTk9fTUFUQ0ggICAgICAgIAkweDMxCisjZGVmaW5lCQlQUk9UT19WSU9MQVRJT04gCTB4MjEKKyNkZWZpbmUJCVNFTkRfUkVKRUNUICAgICAJMHgxMQorI2RlZmluZQkJSU5UX1BFTkQgICAgICAgIAkweDBmCisjZGVmaW5lCQlCQURfUEhBU0UgICAgICAgCTB4MDEKKyNkZWZpbmUJCUJSS0FEUklOVCAgICAgICAJMHgwOAorI2RlZmluZQkJU0NTSUlOVCAgICAgICAgIAkweDA0CisjZGVmaW5lCQlDTURDTVBMVCAgICAgICAgCTB4MDIKKyNkZWZpbmUJCVNFUUlOVCAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCUNMUklOVCAgICAgICAgICAJCTB4OTIKKyNkZWZpbmUJCUNMUlBBUkVSUiAgICAgICAJMHgxMAorI2RlZmluZQkJQ0xSQlJLQURSSU5UICAgIAkweDA4CisjZGVmaW5lCQlDTFJTQ1NJSU5UICAgICAgCTB4MDQKKyNkZWZpbmUJCUNMUkNNRElOVCAgICAgICAJMHgwMgorI2RlZmluZQkJQ0xSU0VRSU5UICAgICAgIAkweDAxCisKKyNkZWZpbmUJRVJST1IgICAgICAgICAgIAkJMHg5MgorI2RlZmluZQkJQ0lPUEFSRVJSICAgICAgIAkweDgwCisjZGVmaW5lCQlQQ0lFUlJTVEFUICAgICAgCTB4NDAKKyNkZWZpbmUJCU1QQVJFUlIgICAgICAgICAJMHgyMAorI2RlZmluZQkJRFBBUkVSUiAgICAgICAgIAkweDEwCisjZGVmaW5lCQlTUVBBUkVSUiAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUlMTE9QQ09ERSAgICAgICAJMHgwNAorI2RlZmluZQkJSUxMU0FERFIgICAgICAgIAkweDAyCisjZGVmaW5lCQlJTExIQUREUiAgICAgICAgCTB4MDEKKworI2RlZmluZQlERkNOVFJMICAgICAgICAgCQkweDkzCisKKyNkZWZpbmUJREZTVEFUVVMgICAgICAgIAkJMHg5NAorI2RlZmluZQkJUFJFTE9BRF9BVkFJTCAgIAkweDgwCisjZGVmaW5lCQlERkNBQ0hFVEggICAgICAgCTB4NDAKKyNkZWZpbmUJCUZJRk9RV0RFTVAgICAgICAJMHgyMAorI2RlZmluZQkJTVJFUVBFTkQgICAgICAgIAkweDEwCisjZGVmaW5lCQlIRE9ORSAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCURGVEhSRVNIICAgICAgICAJMHgwNAorI2RlZmluZQkJRklGT0ZVTEwgICAgICAgIAkweDAyCisjZGVmaW5lCQlGSUZPRU1QICAgICAgICAgCTB4MDEKKworI2RlZmluZQlERldBRERSICAgICAgICAgCQkweDk1CisKKyNkZWZpbmUJREZSQUREUiAgICAgICAgIAkJMHg5NworCisjZGVmaW5lCURGREFUICAgICAgICAgICAJCTB4OTkKKworI2RlZmluZQlTQ0JDTlQgICAgICAgICAgCQkweDlhCisjZGVmaW5lCQlTQ0JDTlRfTUFTSyAgICAgCTB4MWYKKyNkZWZpbmUJCVNDQkFVVE8gICAgICAgICAJMHg4MAorCisjZGVmaW5lCVFJTkZJRk8gICAgICAgICAJCTB4OWIKKworI2RlZmluZQlRSU5DTlQgICAgICAgICAgCQkweDljCisKKyNkZWZpbmUJUU9VVEZJRk8gICAgICAgIAkJMHg5ZAorCisjZGVmaW5lCUNSQ0NPTlRST0wxICAgICAJCTB4OWQKKyNkZWZpbmUJCUNSQ09OU0VFTiAgICAgICAJMHg4MAorI2RlZmluZQkJQ1JDVkFMQ0hLRU4gICAgIAkweDQwCisjZGVmaW5lCQlDUkNFTkRDSEtFTiAgICAgCTB4MjAKKyNkZWZpbmUJCUNSQ1JFUUNIS0VOICAgICAJMHgxMAorI2RlZmluZQkJVEFSR0NSQ0VOREVOICAgIAkweDA4CisjZGVmaW5lCQlUQVJHQ1JDQ05URU4gICAgCTB4MDQKKworI2RlZmluZQlRT1VUQ05UICAgICAgICAgCQkweDllCisKKyNkZWZpbmUJU0NTSVBIQVNFICAgICAgIAkJMHg5ZQorI2RlZmluZQkJREFUQV9QSEFTRV9NQVNLIAkweDAzCisjZGVmaW5lCQlTVEFUVVNfUEhBU0UgICAgCTB4MjAKKyNkZWZpbmUJCUNPTU1BTkRfUEhBU0UgICAJMHgxMAorI2RlZmluZQkJTVNHX0lOX1BIQVNFICAgIAkweDA4CisjZGVmaW5lCQlNU0dfT1VUX1BIQVNFICAgCTB4MDQKKyNkZWZpbmUJCURBVEFfSU5fUEhBU0UgICAJMHgwMgorI2RlZmluZQkJREFUQV9PVVRfUEhBU0UgIAkweDAxCisKKyNkZWZpbmUJU0ZVTkNUICAgICAgICAgIAkJMHg5ZgorI2RlZmluZQkJQUxUX01PREUgICAgICAgIAkweDgwCisKKyNkZWZpbmUJU0NCX0JBU0UgICAgICAgIAkJMHhhMAorCisjZGVmaW5lCVNDQl9DREJfUFRSICAgICAJCTB4YTAKKyNkZWZpbmUJU0NCX1JFU0lEVUFMX0RBVEFDTlQJCTB4YTAKKyNkZWZpbmUJU0NCX0NEQl9TVE9SRSAgIAkJMHhhMAorCisjZGVmaW5lCVNDQl9SRVNJRFVBTF9TR1BUUgkJMHhhNAorCisjZGVmaW5lCVNDQl9TQ1NJX1NUQVRVUyAJCTB4YTgKKworI2RlZmluZQlTQ0JfVEFSR0VUX1BIQVNFUwkJMHhhOQorCisjZGVmaW5lCVNDQl9UQVJHRVRfREFUQV9ESVIJCTB4YWEKKworI2RlZmluZQlTQ0JfVEFSR0VUX0lUQUcgCQkweGFiCisKKyNkZWZpbmUJU0NCX0RBVEFQVFIgICAgIAkJMHhhYworCisjZGVmaW5lCVNDQl9EQVRBQ05UICAgICAJCTB4YjAKKyNkZWZpbmUJCVNHX0hJR0hfQUREUl9CSVRTCTB4N2YKKyNkZWZpbmUJCVNHX0xBU1RfU0VHICAgICAJMHg4MAorCisjZGVmaW5lCVNDQl9TR1BUUiAgICAgICAJCTB4YjQKKyNkZWZpbmUJCVNHX1JFU0lEX1ZBTElEICAJMHgwNAorI2RlZmluZQkJU0dfRlVMTF9SRVNJRCAgIAkweDAyCisjZGVmaW5lCQlTR19MSVNUX05VTEwgICAgCTB4MDEKKworI2RlZmluZQlTQ0JfQ09OVFJPTCAgICAgCQkweGI4CisjZGVmaW5lCQlTQ0JfVEFHX1RZUEUgICAgCTB4MDMKKyNkZWZpbmUJCVNUQVRVU19SQ1ZEICAgICAJMHg4MAorI2RlZmluZQkJVEFSR0VUX1NDQiAgICAgIAkweDgwCisjZGVmaW5lCQlESVNDRU5CICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVRBR19FTkIgICAgICAgICAJMHgyMAorI2RlZmluZQkJTUtfTUVTU0FHRSAgICAgIAkweDEwCisjZGVmaW5lCQlVTFRSQUVOQiAgICAgICAgCTB4MDgKKyNkZWZpbmUJCURJU0NPTk5FQ1RFRCAgICAJMHgwNAorCisjZGVmaW5lCVNDQl9TQ1NJSUQgICAgICAJCTB4YjkKKyNkZWZpbmUJCVRJRCAgICAgICAgICAgICAJMHhmMAorI2RlZmluZQkJVFdJTl9USUQgICAgICAgIAkweDcwCisjZGVmaW5lCQlPSUQgICAgICAgICAgICAgCTB4MGYKKyNkZWZpbmUJCVRXSU5fQ0hOTEIgICAgICAJMHg4MAorCisjZGVmaW5lCVNDQl9MVU4gICAgICAgICAJCTB4YmEKKyNkZWZpbmUJCUxJRCAgICAgICAgICAgICAJMHgzZgorI2RlZmluZQkJU0NCX1hGRVJMRU5fT0REIAkweDgwCisKKyNkZWZpbmUJU0NCX1RBRyAgICAgICAgIAkJMHhiYgorCisjZGVmaW5lCVNDQl9DREJfTEVOICAgICAJCTB4YmMKKworI2RlZmluZQlTQ0JfU0NTSVJBVEUgICAgCQkweGJkCisKKyNkZWZpbmUJU0NCX1NDU0lPRkZTRVQgIAkJMHhiZQorCisjZGVmaW5lCVNDQl9ORVhUICAgICAgICAJCTB4YmYKKworI2RlZmluZQlTQ0JfNjRfU1BBUkUgICAgCQkweGMwCisKKyNkZWZpbmUJU0VFQ1RMXzI4NDAgICAgIAkJMHhjMAorI2RlZmluZQkJQ1NfMjg0MCAgICAgICAgIAkweDA0CisjZGVmaW5lCQlDS18yODQwICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCURPXzI4NDAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNUQVRVU18yODQwICAgICAJCTB4YzEKKyNkZWZpbmUJCUJJT1NfU0VMICAgICAgICAJMHg2MAorI2RlZmluZQkJQURTRUwgICAgICAgICAgIAkweDFlCisjZGVmaW5lCQlFRVBST01fVEYgICAgICAgCTB4ODAKKyNkZWZpbmUJCURJXzI4NDAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNDQl82NF9CVFQgICAgICAJCTB4ZDAKKworI2RlZmluZQlDQ0hBRERSICAgICAgICAgCQkweGUwCisKKyNkZWZpbmUJQ0NIQ05UICAgICAgICAgIAkJMHhlOAorCisjZGVmaW5lCUNDU0dSQU0gICAgICAgICAJCTB4ZTkKKworI2RlZmluZQlDQ1NHQUREUiAgICAgICAgCQkweGVhCisKKyNkZWZpbmUJQ0NTR0NUTCAgICAgICAgIAkJMHhlYgorI2RlZmluZQkJQ0NTR0RPTkUgICAgICAgIAkweDgwCisjZGVmaW5lCQlDQ1NHRU4gICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVNHX0ZFVENIX05FRURFRCAJMHgwMgorI2RlZmluZQkJQ0NTR1JFU0VUICAgICAgIAkweDAxCisKKyNkZWZpbmUJQ0NTQ0JSQU0gICAgICAgIAkJMHhlYworCisjZGVmaW5lCUNDU0NCQUREUiAgICAgICAJCTB4ZWQKKworI2RlZmluZQlDQ1NDQkNUTCAgICAgICAgCQkweGVlCisjZGVmaW5lCQlDQ1NDQkRPTkUgICAgICAgCTB4ODAKKyNkZWZpbmUJCUFSUkRPTkUgICAgICAgICAJMHg0MAorI2RlZmluZQkJQ0NBUlJFTiAgICAgICAgIAkweDEwCisjZGVmaW5lCQlDQ1NDQkVOICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUNDU0NCRElSICAgICAgICAJMHgwNAorI2RlZmluZQkJQ0NTQ0JSRVNFVCAgICAgIAkweDAxCisKKyNkZWZpbmUJQ0NTQ0JDTlQgICAgICAgIAkJMHhlZgorCisjZGVmaW5lCVNDQkJBRERSICAgICAgICAJCTB4ZjAKKworI2RlZmluZQlDQ1NDQlBUUiAgICAgICAgCQkweGYxCisKKyNkZWZpbmUJSE5TQ0JfUU9GRiAgICAgIAkJMHhmNAorCisjZGVmaW5lCVNOU0NCX1FPRkYgICAgICAJCTB4ZjYKKworI2RlZmluZQlTRFNDQl9RT0ZGICAgICAgCQkweGY4CisKKyNkZWZpbmUJUU9GRl9DVExTVEEgICAgIAkJMHhmYQorI2RlZmluZQkJU0NCX1FTSVpFICAgICAgIAkweDA3CisjZGVmaW5lCQlTQ0JfUVNJWkVfMjU2ICAgCTB4MDYKKyNkZWZpbmUJCVNDQl9BVkFJTCAgICAgICAJMHg0MAorI2RlZmluZQkJU05TQ0JfUk9MTE9WRVIgIAkweDIwCisjZGVmaW5lCQlTRFNDQl9ST0xMT1ZFUiAgCTB4MTAKKworI2RlZmluZQlERkZfVEhSU0ggICAgICAgCQkweGZiCisjZGVmaW5lCQlXUl9ERlRIUlNIICAgICAgCTB4NzAKKyNkZWZpbmUJCVdSX0RGVEhSU0hfTUFYICAJMHg3MAorI2RlZmluZQkJV1JfREZUSFJTSF85MCAgIAkweDYwCisjZGVmaW5lCQlXUl9ERlRIUlNIXzg1ICAgCTB4NTAKKyNkZWZpbmUJCVdSX0RGVEhSU0hfNzUgICAJMHg0MAorI2RlZmluZQkJV1JfREZUSFJTSF82MyAgIAkweDMwCisjZGVmaW5lCQlXUl9ERlRIUlNIXzUwICAgCTB4MjAKKyNkZWZpbmUJCVdSX0RGVEhSU0hfMjUgICAJMHgxMAorI2RlZmluZQkJUkRfREZUSFJTSCAgICAgIAkweDA3CisjZGVmaW5lCQlSRF9ERlRIUlNIX01BWCAgCTB4MDcKKyNkZWZpbmUJCVJEX0RGVEhSU0hfOTAgICAJMHgwNgorI2RlZmluZQkJUkRfREZUSFJTSF84NSAgIAkweDA1CisjZGVmaW5lCQlSRF9ERlRIUlNIXzc1ICAgCTB4MDQKKyNkZWZpbmUJCVJEX0RGVEhSU0hfNjMgICAJMHgwMworI2RlZmluZQkJUkRfREZUSFJTSF81MCAgIAkweDAyCisjZGVmaW5lCQlSRF9ERlRIUlNIXzI1ICAgCTB4MDEKKyNkZWZpbmUJCVJEX0RGVEhSU0hfTUlOICAJMHgwMAorI2RlZmluZQkJV1JfREZUSFJTSF9NSU4gIAkweDAwCisKKyNkZWZpbmUJU0dfQ0FDSEVfU0hBRE9XIAkJMHhmYworI2RlZmluZQkJU0dfQUREUl9NQVNLICAgIAkweGY4CisjZGVmaW5lCQlMQVNUX1NFRyAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUxBU1RfU0VHX0RPTkUgICAJMHgwMQorCisjZGVmaW5lCVNHX0NBQ0hFX1BSRSAgICAJCTB4ZmMKKworCisjZGVmaW5lCU1BWF9PRkZTRVRfVUxUUkEyCTB4N2YKKyNkZWZpbmUJTUFYX09GRlNFVF8xNkJJVAkweDA4CisjZGVmaW5lCUJVU184X0JJVAkweDAwCisjZGVmaW5lCVRBUkdFVF9DTURfQ01QTFQJMHhmZQorI2RlZmluZQlTVEFUVVNfUVVFVUVfRlVMTAkweDI4CisjZGVmaW5lCVNUQVRVU19CVVNZCTB4MDgKKyNkZWZpbmUJTUFYX09GRlNFVF84QklUCTB4MGYKKyNkZWZpbmUJQlVTXzMyX0JJVAkweDAyCisjZGVmaW5lCUNDU0dBRERSX01BWAkweDgwCisjZGVmaW5lCVRJRF9TSElGVAkweDA0CisjZGVmaW5lCVNDQl9ET1dOTE9BRF9TSVpFXzY0CTB4MzAKKyNkZWZpbmUJSE9TVF9NQUlMQk9YX1NISUZUCTB4MDQKKyNkZWZpbmUJQ01EX0dST1VQX0NPREVfU0hJRlQJMHgwNQorI2RlZmluZQlDQ1NHUkFNX01BWFNFR1MJMHgxMAorI2RlZmluZQlTQ0JfTElTVF9OVUxMCTB4ZmYKKyNkZWZpbmUJU0dfU0laRU9GCTB4MDgKKyNkZWZpbmUJU0NCX0RPV05MT0FEX1NJWkUJMHgyMAorI2RlZmluZQlTRVFfTUFJTEJPWF9TSElGVAkweDAwCisjZGVmaW5lCVRBUkdFVF9EQVRBX0lOCTB4MDEKKyNkZWZpbmUJSE9TVF9NU0cJMHhmZgorI2RlZmluZQlNQVhfT0ZGU0VUCTB4N2YKKyNkZWZpbmUJQlVTXzE2X0JJVAkweDAxCisjZGVmaW5lCVNDQl9VUExPQURfU0laRQkweDIwCisjZGVmaW5lCVNUQUNLX1NJWkUJMHgwNAorCisKKy8qIERvd25sb2FkZWQgQ29uc3RhbnQgRGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUJSU5WRVJURURfQ0FDSEVTSVpFX01BU0sJMHgwMworI2RlZmluZQlTR19QUkVGRVRDSF9BRERSX01BU0sJMHgwNgorI2RlZmluZQlTR19QUkVGRVRDSF9BTElHTl9NQVNLCTB4MDUKKyNkZWZpbmUJUU9VVEZJRk9fT0ZGU0VUCTB4MDAKKyNkZWZpbmUJU0dfUFJFRkVUQ0hfQ05UCTB4MDQKKyNkZWZpbmUJQ0FDSEVTSVpFX01BU0sJMHgwMgorI2RlZmluZQlRSU5GSUZPX09GRlNFVAkweDAxCisjZGVmaW5lCURPV05MT0FEX0NPTlNUX0NPVU5UCTB4MDcKKworCisvKiBFeHBvcnRlZCBMYWJlbHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcmVnX3ByaW50LmNfc2hpcHBlZCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcmVnX3ByaW50LmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzcxMzc3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9yZWdfcHJpbnQuY19zaGlwcGVkCkBAIC0wLDAgKzEsMTY4MSBAQAorLyoKKyAqIERPIE5PVCBFRElUIC0gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisgKgkJIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2UgZmlsZXM6CisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LnNlcSM1NiAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHgucmVnIzM5ICQKKyAqLworCisjaW5jbHVkZSAiYWljN3h4eF9vc20uaCIKKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTQ1NJU0VRX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiU0NTSVJTVE8iLAkJMHgwMSwgMHgwMSB9LAorCXsgIkVOQVVUT0FUTlAiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkVOQVVUT0FUTkkiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkVOQVVUT0FUTk8iLAkJMHgwOCwgMHgwOCB9LAorCXsgIkVOUlNFTEkiLAkJMHgxMCwgMHgxMCB9LAorCXsgIkVOU0VMSSIsCQkweDIwLCAweDIwIH0sCisJeyAiRU5TRUxPIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJURU1PREUiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoY19zY3Npc2VxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTQ1NJU0VRX3BhcnNlX3RhYmxlLCA4LCAiU0NTSVNFUSIsCisJICAgIDB4MDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU1hGUkNUTDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDTFJDSE4iLAkJMHgwMiwgMHgwMiB9LAorCXsgIlNDQU1FTiIsCQkweDA0LCAweDA0IH0sCisJeyAiU1BJT0VOIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJDTFJTVENOVCIsCQkweDEwLCAweDEwIH0sCisJeyAiRkFTVDIwIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJERlBFWFAiLAkJMHg0MCwgMHg0MCB9LAorCXsgIkRGT04iLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoY19zeGZyY3RsMF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU1hGUkNUTDBfcGFyc2VfdGFibGUsIDcsICJTWEZSQ1RMMCIsCisJICAgIDB4MDEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU1hGUkNUTDFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTVFBXRU4iLAkJMHgwMSwgMHgwMSB9LAorCXsgIkFDVE5FR0VOIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJFTlNUSU1FUiIsCQkweDA0LCAweDA0IH0sCisJeyAiRU5TUENISyIsCQkweDIwLCAweDIwIH0sCisJeyAiU1dSQVBFTiIsCQkweDQwLCAweDQwIH0sCisJeyAiQklUQlVDS0VUIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJTVElNRVNFTCIsCQkweDE4LCAweDE4IH0KK307CisKK2ludAorYWhjX3N4ZnJjdGwxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTWEZSQ1RMMV9wYXJzZV90YWJsZSwgNywgIlNYRlJDVEwxIiwKKwkgICAgMHgwMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTQ1NJU0lHT19wYXJzZV90YWJsZVtdID0geworCXsgIkFDS08iLAkJMHgwMSwgMHgwMSB9LAorCXsgIlJFUU8iLAkJMHgwMiwgMHgwMiB9LAorCXsgIkJTWU8iLAkJMHgwNCwgMHgwNCB9LAorCXsgIlNFTE8iLAkJMHgwOCwgMHgwOCB9LAorCXsgIkFUTk8iLAkJMHgxMCwgMHgxMCB9LAorCXsgIk1TR08iLAkJMHgyMCwgMHgyMCB9LAorCXsgIklPTyIsCQkweDQwLCAweDQwIH0sCisJeyAiQ0RPIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJQX0RBVEFPVVQiLAkJMHgwMCwgMHgwMCB9LAorCXsgIlBfREFUQUlOIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJQX0NPTU1BTkQiLAkJMHg4MCwgMHg4MCB9LAorCXsgIlBfTUVTR09VVCIsCQkweGEwLCAweGEwIH0sCisJeyAiUF9TVEFUVVMiLAkJMHhjMCwgMHhjMCB9LAorCXsgIlBIQVNFX01BU0siLAkJMHhlMCwgMHhlMCB9LAorCXsgIlBfTUVTR0lOIiwJCTB4ZTAsIDB4ZTAgfQorfTsKKworaW50CithaGNfc2NzaXNpZ29fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNDU0lTSUdPX3BhcnNlX3RhYmxlLCAxNSwgIlNDU0lTSUdPIiwKKwkgICAgMHgwMywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTQ1NJU0lHSV9wYXJzZV90YWJsZVtdID0geworCXsgIkFDS0kiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlJFUUkiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkJTWUkiLAkJMHgwNCwgMHgwNCB9LAorCXsgIlNFTEkiLAkJMHgwOCwgMHgwOCB9LAorCXsgIkFUTkkiLAkJMHgxMCwgMHgxMCB9LAorCXsgIk1TR0kiLAkJMHgyMCwgMHgyMCB9LAorCXsgIklPSSIsCQkweDQwLCAweDQwIH0sCisJeyAiQ0RJIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJQX0RBVEFPVVQiLAkJMHgwMCwgMHgwMCB9LAorCXsgIlBfREFUQU9VVF9EVCIsCTB4MjAsIDB4MjAgfSwKKwl7ICJQX0RBVEFJTiIsCQkweDQwLCAweDQwIH0sCisJeyAiUF9EQVRBSU5fRFQiLAkweDYwLCAweDYwIH0sCisJeyAiUF9DT01NQU5EIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJQX01FU0dPVVQiLAkJMHhhMCwgMHhhMCB9LAorCXsgIlBfU1RBVFVTIiwJCTB4YzAsIDB4YzAgfSwKKwl7ICJQSEFTRV9NQVNLIiwJCTB4ZTAsIDB4ZTAgfSwKKwl7ICJQX01FU0dJTiIsCQkweGUwLCAweGUwIH0KK307CisKK2ludAorYWhjX3Njc2lzaWdpX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTQ1NJU0lHSV9wYXJzZV90YWJsZSwgMTcsICJTQ1NJU0lHSSIsCisJICAgIDB4MDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0NTSVJBVEVfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTSU5HTEVfRURHRSIsCTB4MTAsIDB4MTAgfSwKKwl7ICJFTkFCTEVfQ1JDIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJXSURFWEZFUiIsCQkweDgwLCAweDgwIH0sCisJeyAiU1hGUl9VTFRSQTIiLAkweDBmLCAweDBmIH0sCisJeyAiU09GUyIsCQkweDBmLCAweDBmIH0sCisJeyAiU1hGUiIsCQkweDcwLCAweDcwIH0KK307CisKK2ludAorYWhjX3Njc2lyYXRlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTQ1NJUkFURV9wYXJzZV90YWJsZSwgNiwgIlNDU0lSQVRFIiwKKwkgICAgMHgwNCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTQ1NJSURfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJUV0lOX0NITkxCIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJPSUQiLAkJMHgwZiwgMHgwZiB9LAorCXsgIlRXSU5fVElEIiwJCTB4NzAsIDB4NzAgfSwKKwl7ICJTT0ZTX1VMVFJBMiIsCTB4N2YsIDB4N2YgfSwKKwl7ICJUSUQiLAkJMHhmMCwgMHhmMCB9Cit9OworCitpbnQKK2FoY19zY3NpaWRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNDU0lJRF9wYXJzZV90YWJsZSwgNSwgIlNDU0lJRCIsCisJICAgIDB4MDUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3Njc2lkYXRsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NTSURBVEwiLAorCSAgICAweDA2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19zY3NpZGF0aF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lEQVRIIiwKKwkgICAgMHgwNywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc3RjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTVENOVCIsCisJICAgIDB4MDgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgT1BUSU9OTU9ERV9wYXJzZV90YWJsZVtdID0geworCXsgIkRJU19NU0dJTl9EVUFMRURHRSIsCTB4MDEsIDB4MDEgfSwKKwl7ICJBVVRPX01TR09VVF9ERSIsCTB4MDIsIDB4MDIgfSwKKwl7ICJTQ1NJREFUTF9JTUdFTiIsCTB4MDQsIDB4MDQgfSwKKwl7ICJFWFBQSEFTRURJUyIsCTB4MDgsIDB4MDggfSwKKwl7ICJCVVNGUkVFUkVWIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJBVE5NR01OVEVOIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJBVVRPQUNLRU4iLAkJMHg0MCwgMHg0MCB9LAorCXsgIkFVVE9SQVRFRU4iLAkJMHg4MCwgMHg4MCB9LAorCXsgIk9QVElPTk1PREVfREVGQVVMVFMiLDB4MDMsIDB4MDMgfQorfTsKKworaW50CithaGNfb3B0aW9ubW9kZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoT1BUSU9OTU9ERV9wYXJzZV90YWJsZSwgOSwgIk9QVElPTk1PREUiLAorCSAgICAweDA4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY190YXJnY3JjY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiVEFSR0NSQ0NOVCIsCisJICAgIDB4MGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgQ0xSU0lOVDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDTFJTUElPUkRZIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJDTFJTV1JBUCIsCQkweDA4LCAweDA4IH0sCisJeyAiQ0xSSU9FUlIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIkNMUlNFTElOR08iLAkJMHgxMCwgMHgxMCB9LAorCXsgIkNMUlNFTERJIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJDTFJTRUxETyIsCQkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhjX2NscnNpbnQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihDTFJTSU5UMF9wYXJzZV90YWJsZSwgNiwgIkNMUlNJTlQwIiwKKwkgICAgMHgwYiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTU1RBVDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJETUFET05FIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJTUElPUkRZIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJTRE9ORSIsCQkweDA0LCAweDA0IH0sCisJeyAiU1dSQVAiLAkJMHgwOCwgMHgwOCB9LAorCXsgIklPRVJSIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJTRUxJTkdPIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJTRUxESSIsCQkweDIwLCAweDIwIH0sCisJeyAiU0VMRE8iLAkJMHg0MCwgMHg0MCB9LAorCXsgIlRBUkdFVCIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhjX3NzdGF0MF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU1NUQVQwX3BhcnNlX3RhYmxlLCA5LCAiU1NUQVQwIiwKKwkgICAgMHgwYiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBDTFJTSU5UMV9wYXJzZV90YWJsZVtdID0geworCXsgIkNMUlJFUUlOSVQiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkNMUlBIQVNFQ0hHIiwJMHgwMiwgMHgwMiB9LAorCXsgIkNMUlNDU0lQRVJSIiwJMHgwNCwgMHgwNCB9LAorCXsgIkNMUkJVU0ZSRUUiLAkJMHgwOCwgMHgwOCB9LAorCXsgIkNMUlNDU0lSU1RJIiwJMHgyMCwgMHgyMCB9LAorCXsgIkNMUkFUTk8iLAkJMHg0MCwgMHg0MCB9LAorCXsgIkNMUlNFTFRJTUVPIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoY19jbHJzaW50MV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoQ0xSU0lOVDFfcGFyc2VfdGFibGUsIDcsICJDTFJTSU5UMSIsCisJICAgIDB4MGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU1NUQVQxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUkVRSU5JVCIsCQkweDAxLCAweDAxIH0sCisJeyAiUEhBU0VDSEciLAkJMHgwMiwgMHgwMiB9LAorCXsgIlNDU0lQRVJSIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJCVVNGUkVFIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJQSEFTRU1JUyIsCQkweDEwLCAweDEwIH0sCisJeyAiU0NTSVJTVEkiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkFUTlRBUkciLAkJMHg0MCwgMHg0MCB9LAorCXsgIlNFTFRPIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGNfc3N0YXQxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTU1RBVDFfcGFyc2VfdGFibGUsIDgsICJTU1RBVDEiLAorCSAgICAweDBjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IFNTVEFUMl9wYXJzZV90YWJsZVtdID0geworCXsgIkRVQUxfRURHRV9FUlIiLAkweDAxLCAweDAxIH0sCisJeyAiQ1JDUkVRRVJSIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJDUkNFTkRFUlIiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkNSQ1ZBTEVSUiIsCQkweDA4LCAweDA4IH0sCisJeyAiRVhQX0FDVElWRSIsCQkweDEwLCAweDEwIH0sCisJeyAiU0hWQUxJRCIsCQkweDQwLCAweDQwIH0sCisJeyAiT1ZFUlJVTiIsCQkweDgwLCAweDgwIH0sCisJeyAiU0ZDTlQiLAkJMHgxZiwgMHgxZiB9Cit9OworCitpbnQKK2FoY19zc3RhdDJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNTVEFUMl9wYXJzZV90YWJsZSwgOCwgIlNTVEFUMiIsCisJICAgIDB4MGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU1NUQVQzX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiT0ZGQ05UIiwJCTB4MGYsIDB4MGYgfSwKKwl7ICJVMk9GRkNOVCIsCQkweDdmLCAweDdmIH0sCisJeyAiU0NTSUNOVCIsCQkweGYwLCAweGYwIH0KK307CisKK2ludAorYWhjX3NzdGF0M19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU1NUQVQzX3BhcnNlX3RhYmxlLCAzLCAiU1NUQVQzIiwKKwkgICAgMHgwZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTQ1NJSURfVUxUUkEyX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiT0lEIiwJCTB4MGYsIDB4MGYgfSwKKwl7ICJUSUQiLAkJMHhmMCwgMHhmMCB9Cit9OworCitpbnQKK2FoY19zY3NpaWRfdWx0cmEyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTQ1NJSURfVUxUUkEyX3BhcnNlX3RhYmxlLCAyLCAiU0NTSUlEX1VMVFJBMiIsCisJICAgIDB4MGYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0lNT0RFMF9wYXJzZV90YWJsZVtdID0geworCXsgIkVORE1BRE9ORSIsCQkweDAxLCAweDAxIH0sCisJeyAiRU5TUElPUkRZIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJFTlNET05FIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJFTlNXUkFQIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJFTklPRVJSIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJFTlNFTElOR08iLAkJMHgxMCwgMHgxMCB9LAorCXsgIkVOU0VMREkiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkVOU0VMRE8iLAkJMHg0MCwgMHg0MCB9Cit9OworCitpbnQKK2FoY19zaW1vZGUwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTSU1PREUwX3BhcnNlX3RhYmxlLCA4LCAiU0lNT0RFMCIsCisJICAgIDB4MTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0lNT0RFMV9wYXJzZV90YWJsZVtdID0geworCXsgIkVOUkVRSU5JVCIsCQkweDAxLCAweDAxIH0sCisJeyAiRU5QSEFTRUNIRyIsCQkweDAyLCAweDAyIH0sCisJeyAiRU5TQ1NJUEVSUiIsCQkweDA0LCAweDA0IH0sCisJeyAiRU5CVVNGUkVFIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJFTlBIQVNFTUlTIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJFTlNDU0lSU1QiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkVOQVROVEFSRyIsCQkweDQwLCAweDQwIH0sCisJeyAiRU5TRUxUSU1PIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGNfc2ltb2RlMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU0lNT0RFMV9wYXJzZV90YWJsZSwgOCwgIlNJTU9ERTEiLAorCSAgICAweDExLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19zY3NpYnVzbF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lCVVNMIiwKKwkgICAgMHgxMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NzaWJ1c2hfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJQlVTSCIsCisJICAgIDB4MTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU1hGUkNUTDJfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDTURETUFFTiIsCQkweDA4LCAweDA4IH0sCisJeyAiQVVUT1JTVERJUyIsCQkweDEwLCAweDEwIH0sCisJeyAiQVNZTkNfU0VUVVAiLAkweDA3LCAweDA3IH0KK307CisKK2ludAorYWhjX3N4ZnJjdGwyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTWEZSQ1RMMl9wYXJzZV90YWJsZSwgMywgIlNYRlJDVEwyIiwKKwkgICAgMHgxMywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2hhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0hBRERSIiwKKwkgICAgMHgxNCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTRUxUSU1FUl9wYXJzZV90YWJsZVtdID0geworCXsgIlNUQUdFMSIsCQkweDAxLCAweDAxIH0sCisJeyAiU1RBR0UyIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJTVEFHRTMiLAkJMHgwNCwgMHgwNCB9LAorCXsgIlNUQUdFNCIsCQkweDA4LCAweDA4IH0sCisJeyAiU1RBR0U1IiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJTVEFHRTYiLAkJMHgyMCwgMHgyMCB9Cit9OworCitpbnQKK2FoY19zZWx0aW1lcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU0VMVElNRVJfcGFyc2VfdGFibGUsIDYsICJTRUxUSU1FUiIsCisJICAgIDB4MTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0VMSURfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJPTkVCSVQiLAkJMHgwOCwgMHgwOCB9LAorCXsgIlNFTElEX01BU0siLAkJMHhmMCwgMHhmMCB9Cit9OworCitpbnQKK2FoY19zZWxpZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU0VMSURfcGFyc2VfdGFibGUsIDIsICJTRUxJRCIsCisJICAgIDB4MTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0NBTUNUTF9wYXJzZV90YWJsZVtdID0geworCXsgIkRGTFRUSUQiLAkJMHgxMCwgMHgxMCB9LAorCXsgIkFMVFNUSU0iLAkJMHgyMCwgMHgyMCB9LAorCXsgIkNMUlNDQU1TRUxJRCIsCTB4NDAsIDB4NDAgfSwKKwl7ICJFTlNDQU1TRUxPIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJTQ0FNTFZMIiwJCTB4MDMsIDB4MDMgfQorfTsKKworaW50CithaGNfc2NhbWN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU0NBTUNUTF9wYXJzZV90YWJsZSwgNSwgIlNDQU1DVEwiLAorCSAgICAweDFhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY190YXJnaWRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJUQVJHSUQiLAorCSAgICAweDFiLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IFNQSU9DQVBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTU1BJT0NQUyIsCQkweDAxLCAweDAxIH0sCisJeyAiUk9NIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJFRVBST00iLAkJMHgwNCwgMHgwNCB9LAorCXsgIlNFRVBST00iLAkJMHgwOCwgMHgwOCB9LAorCXsgIkVYVF9CUkRDVEwiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlNPRlRDTURFTiIsCQkweDIwLCAweDIwIH0sCisJeyAiU09GVDAiLAkJMHg0MCwgMHg0MCB9LAorCXsgIlNPRlQxIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGNfc3Bpb2NhcF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU1BJT0NBUF9wYXJzZV90YWJsZSwgOCwgIlNQSU9DQVAiLAorCSAgICAweDFiLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IEJSRENUTF9wYXJzZV90YWJsZVtdID0geworCXsgIkJSRENUTDAiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkJSRFNUQl9VTFRSQTIiLAkweDAxLCAweDAxIH0sCisJeyAiQlJEQ1RMMSIsCQkweDAyLCAweDAyIH0sCisJeyAiQlJEUldfVUxUUkEyIiwJMHgwMiwgMHgwMiB9LAorCXsgIkJSRFJXIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJCUkREQVQyIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJCUkRDUyIsCQkweDA4LCAweDA4IH0sCisJeyAiQlJEREFUMyIsCQkweDA4LCAweDA4IH0sCisJeyAiQlJEU1RCIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJCUkREQVQ0IiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJCUkREQVQ1IiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJCUkREQVQ2IiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJCUkREQVQ3IiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGNfYnJkY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihCUkRDVExfcGFyc2VfdGFibGUsIDEzLCAiQlJEQ1RMIiwKKwkgICAgMHgxZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTRUVDVExfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTRUVESSIsCQkweDAxLCAweDAxIH0sCisJeyAiU0VFRE8iLAkJMHgwMiwgMHgwMiB9LAorCXsgIlNFRUNLIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJTRUVDUyIsCQkweDA4LCAweDA4IH0sCisJeyAiU0VFUkRZIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJTRUVNUyIsCQkweDIwLCAweDIwIH0sCisJeyAiRVhUQVJCUkVRIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJFWFRBUkJBQ0siLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoY19zZWVjdGxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNFRUNUTF9wYXJzZV90YWJsZSwgOCwgIlNFRUNUTCIsCisJICAgIDB4MWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0JMS0NUTF9wYXJzZV90YWJsZVtdID0geworCXsgIlhDVlIiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlNFTFdJREUiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkVOQUIyMCIsCQkweDA0LCAweDA0IH0sCisJeyAiU0VMQlVTQiIsCQkweDA4LCAweDA4IH0sCisJeyAiRU5BQjQwIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJBVVRPRkxVU0hESVMiLAkweDIwLCAweDIwIH0sCisJeyAiRElBR0xFRE9OIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJESUFHTEVERU4iLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoY19zYmxrY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTQkxLQ1RMX3BhcnNlX3RhYmxlLCA4LCAiU0JMS0NUTCIsCisJICAgIDB4MWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2J1c3lfdGFyZ2V0c19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJVU1lfVEFSR0VUUyIsCisJICAgIDB4MjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3VsdHJhX2VuYl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlVMVFJBX0VOQiIsCisJICAgIDB4MzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2Rpc2NfZHNiX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRElTQ19EU0IiLAorCSAgICAweDMyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19jbWRzaXplX3RhYmxlX3RhaWxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTURTSVpFX1RBQkxFX1RBSUwiLAorCSAgICAweDM0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19td2lfcmVzaWR1YWxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJNV0lfUkVTSURVQUwiLAorCSAgICAweDM4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19uZXh0X3F1ZXVlZF9zY2JfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJORVhUX1FVRVVFRF9TQ0IiLAorCSAgICAweDM5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19tc2dfb3V0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTVNHX09VVCIsCisJICAgIDB4M2EsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgRE1BUEFSQU1TX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRklGT1JFU0VUIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJGSUZPRkxVU0giLAkJMHgwMiwgMHgwMiB9LAorCXsgIkRJUkVDVElPTiIsCQkweDA0LCAweDA0IH0sCisJeyAiSERNQUVOIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJIRE1BRU5BQ0siLAkJMHgwOCwgMHgwOCB9LAorCXsgIlNETUFFTiIsCQkweDEwLCAweDEwIH0sCisJeyAiU0RNQUVOQUNLIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJTQ1NJRU4iLAkJMHgyMCwgMHgyMCB9LAorCXsgIldJREVPREQiLAkJMHg0MCwgMHg0MCB9LAorCXsgIlBSRUxPQURFTiIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhjX2RtYXBhcmFtc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoRE1BUEFSQU1TX3BhcnNlX3RhYmxlLCAxMCwgIkRNQVBBUkFNUyIsCisJICAgIDB4M2IsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0VRX0ZMQUdTX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTk9fRElTQ09OTkVDVCIsCTB4MDEsIDB4MDEgfSwKKwl7ICJTUEhBU0VfUEVORElORyIsCTB4MDIsIDB4MDIgfSwKKwl7ICJEUEhBU0VfUEVORElORyIsCTB4MDQsIDB4MDQgfSwKKwl7ICJDTURQSEFTRV9QRU5ESU5HIiwJMHgwOCwgMHgwOCB9LAorCXsgIlRBUkdfQ01EX1BFTkRJTkciLAkweDEwLCAweDEwIH0sCisJeyAiRFBIQVNFIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJOT19DREJfU0VOVCIsCTB4NDAsIDB4NDAgfSwKKwl7ICJUQVJHRVRfQ01EX0lTX1RBR0dFRCIsMHg0MCwgMHg0MCB9LAorCXsgIk5PVF9JREVOVElGSUVEIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoY19zZXFfZmxhZ3NfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNFUV9GTEFHU19wYXJzZV90YWJsZSwgOSwgIlNFUV9GTEFHUyIsCisJICAgIDB4M2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NhdmVkX3Njc2lpZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX1NDU0lJRCIsCisJICAgIDB4M2QsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NhdmVkX2x1bl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX0xVTiIsCisJICAgIDB4M2UsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgTEFTVFBIQVNFX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTVNHSSIsCQkweDIwLCAweDIwIH0sCisJeyAiSU9JIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJDREkiLAkJMHg4MCwgMHg4MCB9LAorCXsgIlBfREFUQU9VVCIsCQkweDAwLCAweDAwIH0sCisJeyAiUF9CVVNGUkVFIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJQX0RBVEFJTiIsCQkweDQwLCAweDQwIH0sCisJeyAiUF9DT01NQU5EIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJQX01FU0dPVVQiLAkJMHhhMCwgMHhhMCB9LAorCXsgIlBfU1RBVFVTIiwJCTB4YzAsIDB4YzAgfSwKKwl7ICJQSEFTRV9NQVNLIiwJCTB4ZTAsIDB4ZTAgfSwKKwl7ICJQX01FU0dJTiIsCQkweGUwLCAweGUwIH0KK307CisKK2ludAorYWhjX2xhc3RwaGFzZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTEFTVFBIQVNFX3BhcnNlX3RhYmxlLCAxMSwgIkxBU1RQSEFTRSIsCisJICAgIDB4M2YsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3dhaXRpbmdfc2NiaF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIldBSVRJTkdfU0NCSCIsCisJICAgIDB4NDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2Rpc2Nvbm5lY3RlZF9zY2JoX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRElTQ09OTkVDVEVEX1NDQkgiLAorCSAgICAweDQxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19mcmVlX3NjYmhfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJGUkVFX1NDQkgiLAorCSAgICAweDQyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19jb21wbGV0ZV9zY2JoX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ09NUExFVEVfU0NCSCIsCisJICAgIDB4NDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2hzY2JfYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkhTQ0JfQUREUiIsCisJICAgIDB4NDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NoYXJlZF9kYXRhX2FkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTSEFSRURfREFUQV9BRERSIiwKKwkgICAgMHg0OCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfa2VybmVsX3FpbnBvc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIktFUk5FTF9RSU5QT1MiLAorCSAgICAweDRjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19xaW5wb3NfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRSU5QT1MiLAorCSAgICAweDRkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19xb3V0cG9zX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUU9VVFBPUyIsCisJICAgIDB4NGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2tlcm5lbF90cWlucG9zX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiS0VSTkVMX1RRSU5QT1MiLAorCSAgICAweDRmLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY190cWlucG9zX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiVFFJTlBPUyIsCisJICAgIDB4NTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgQVJHXzFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDT05UX1RBUkdfU0VTU0lPTiIsCTB4MDIsIDB4MDIgfSwKKwl7ICJDT05UX01TR19MT09QIiwJMHgwNCwgMHgwNCB9LAorCXsgIkVYSVRfTVNHX0xPT1AiLAkweDA4LCAweDA4IH0sCisJeyAiTVNHT1VUX1BIQVNFTUlTIiwJMHgxMCwgMHgxMCB9LAorCXsgIlNFTkRfUkVKIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTRU5EX1NFTlNFIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJTRU5EX01TRyIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhjX2FyZ18xX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihBUkdfMV9wYXJzZV90YWJsZSwgNywgIkFSR18xIiwKKwkgICAgMHg1MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfYXJnXzJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBUkdfMiIsCisJICAgIDB4NTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2xhc3RfbXNnX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTEFTVF9NU0ciLAorCSAgICAweDUzLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IFNDU0lTRVFfVEVNUExBVEVfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJFTkFVVE9BVE5QIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJFTkFVVE9BVE5JIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJFTkFVVE9BVE5PIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJFTlJTRUxJIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJFTlNFTEkiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkVOU0VMTyIsCQkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhjX3Njc2lzZXFfdGVtcGxhdGVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNDU0lTRVFfVEVNUExBVEVfcGFyc2VfdGFibGUsIDYsICJTQ1NJU0VRX1RFTVBMQVRFIiwKKwkgICAgMHg1NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBIQV8yNzRfQklPU0dMT0JBTF9wYXJzZV90YWJsZVtdID0geworCXsgIkhBXzI3NF9FWFRFTkRFRF9UUkFOUyIsMHgwMSwgMHgwMSB9Cit9OworCitpbnQKK2FoY19oYV8yNzRfYmlvc2dsb2JhbF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoSEFfMjc0X0JJT1NHTE9CQUxfcGFyc2VfdGFibGUsIDEsICJIQV8yNzRfQklPU0dMT0JBTCIsCisJICAgIDB4NTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0VRX0ZMQUdTMl9wYXJzZV90YWJsZVtdID0geworCXsgIlNDQl9ETUEiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlRBUkdFVF9NU0dfUEVORElORyIsCTB4MDIsIDB4MDIgfQorfTsKKworaW50CithaGNfc2VxX2ZsYWdzMl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU0VRX0ZMQUdTMl9wYXJzZV90YWJsZSwgMiwgIlNFUV9GTEFHUzIiLAorCSAgICAweDU3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IFNDU0lDT05GX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRU5TUENISyIsCQkweDIwLCAweDIwIH0sCisJeyAiUkVTRVRfU0NTSSIsCQkweDQwLCAweDQwIH0sCisJeyAiVEVSTV9FTkIiLAkJMHg4MCwgMHg4MCB9LAorCXsgIkhTQ1NJSUQiLAkJMHgwNywgMHgwNyB9LAorCXsgIkhXU0NTSUlEIiwJCTB4MGYsIDB4MGYgfQorfTsKKworaW50CithaGNfc2NzaWNvbmZfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNDU0lDT05GX3BhcnNlX3RhYmxlLCA1LCAiU0NTSUNPTkYiLAorCSAgICAweDVhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IElOVERFRl9wYXJzZV90YWJsZVtdID0geworCXsgIkVER0VfVFJJRyIsCQkweDgwLCAweDgwIH0sCisJeyAiVkVDVE9SIiwJCTB4MGYsIDB4MGYgfQorfTsKKworaW50CithaGNfaW50ZGVmX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihJTlRERUZfcGFyc2VfdGFibGUsIDIsICJJTlRERUYiLAorCSAgICAweDVjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19ob3N0Y29uZl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkhPU1RDT05GIiwKKwkgICAgMHg1ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBIQV8yNzRfQklPU0NUUkxfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDSEFOTkVMX0JfUFJJTUFSWSIsCTB4MDgsIDB4MDggfSwKKwl7ICJCSU9TTU9ERSIsCQkweDMwLCAweDMwIH0sCisJeyAiQklPU0RJU0FCTEVEIiwJMHgzMCwgMHgzMCB9Cit9OworCitpbnQKK2FoY19oYV8yNzRfYmlvc2N0cmxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKEhBXzI3NF9CSU9TQ1RSTF9wYXJzZV90YWJsZSwgMywgIkhBXzI3NF9CSU9TQ1RSTCIsCisJICAgIDB4NWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0VRQ1RMX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTE9BRFJBTSIsCQkweDAxLCAweDAxIH0sCisJeyAiU0VRUkVTRVQiLAkJMHgwMiwgMHgwMiB9LAorCXsgIlNURVAiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkJSS0FEUklOVEVOIiwJMHgwOCwgMHgwOCB9LAorCXsgIkZBU1RNT0RFIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJGQUlMRElTIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJQQVVTRURJUyIsCQkweDQwLCAweDQwIH0sCisJeyAiUEVSUk9SRElTIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGNfc2VxY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTRVFDVExfcGFyc2VfdGFibGUsIDgsICJTRVFDVEwiLAorCSAgICAweDYwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19zZXFyYW1fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRVFSQU0iLAorCSAgICAweDYxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19zZXFhZGRyMF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFUUFERFIwIiwKKwkgICAgMHg2MiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTRVFBRERSMV9wYXJzZV90YWJsZVtdID0geworCXsgIlNFUUFERFIxX01BU0siLAkweDAxLCAweDAxIH0KK307CisKK2ludAorYWhjX3NlcWFkZHIxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTRVFBRERSMV9wYXJzZV90YWJsZSwgMSwgIlNFUUFERFIxIiwKKwkgICAgMHg2MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfYWNjdW1fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBQ0NVTSIsCisJICAgIDB4NjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NpbmRleF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNJTkRFWCIsCisJICAgIDB4NjUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2RpbmRleF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRJTkRFWCIsCisJICAgIDB4NjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2FsbG9uZXNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBTExPTkVTIiwKKwkgICAgMHg2OSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfYWxsemVyb3NfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBTExaRVJPUyIsCisJICAgIDB4NmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX25vbmVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJOT05FIiwKKwkgICAgMHg2YSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBGTEFHU19wYXJzZV90YWJsZVtdID0geworCXsgIkNBUlJZIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJaRVJPIiwJCTB4MDIsIDB4MDIgfQorfTsKKworaW50CithaGNfZmxhZ3NfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKEZMQUdTX3BhcnNlX3RhYmxlLCAyLCAiRkxBR1MiLAorCSAgICAweDZiLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19zaW5kaXJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTSU5ESVIiLAorCSAgICAweDZjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19kaW5kaXJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJESU5ESVIiLAorCSAgICAweDZkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19mdW5jdGlvbjFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJGVU5DVElPTjEiLAorCSAgICAweDZlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19zdGFja19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNUQUNLIiwKKwkgICAgMHg2ZiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfdGFyZ19vZmZzZXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJUQVJHX09GRlNFVCIsCisJICAgIDB4NzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NyYW1fYmFzZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNSQU1fQkFTRSIsCisJICAgIDB4NzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgQkNUTF9wYXJzZV90YWJsZVtdID0geworCXsgIkVOQUJMRSIsCQkweDAxLCAweDAxIH0sCisJeyAiQUNFIiwJCTB4MDgsIDB4MDggfQorfTsKKworaW50CithaGNfYmN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoQkNUTF9wYXJzZV90YWJsZSwgMiwgIkJDVEwiLAorCSAgICAweDg0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IERTQ09NTUFORDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDSU9QQVJDS0VOIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJVU0NCU0laRTMyIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJSQU1QUyIsCQkweDA0LCAweDA0IH0sCisJeyAiSU5UU0NCUkFNU0VMIiwJMHgwOCwgMHgwOCB9LAorCXsgIkVYVFJFUUxDSyIsCQkweDEwLCAweDEwIH0sCisJeyAiTVBBUkNLRU4iLAkJMHgyMCwgMHgyMCB9LAorCXsgIkRQQVJDS0VOIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJDQUNIRVRIRU4iLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoY19kc2NvbW1hbmQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihEU0NPTU1BTkQwX3BhcnNlX3RhYmxlLCA4LCAiRFNDT01NQU5EMCIsCisJICAgIDB4ODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgQlVTVElNRV9wYXJzZV90YWJsZVtdID0geworCXsgIkJPTiIsCQkweDBmLCAweDBmIH0sCisJeyAiQk9GRiIsCQkweGYwLCAweGYwIH0KK307CisKK2ludAorYWhjX2J1c3RpbWVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKEJVU1RJTUVfcGFyc2VfdGFibGUsIDIsICJCVVNUSU1FIiwKKwkgICAgMHg4NSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBEU0NPTU1BTkQxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiSEFERExEU0VMMCIsCQkweDAxLCAweDAxIH0sCisJeyAiSEFERExEU0VMMSIsCQkweDAyLCAweDAyIH0sCisJeyAiRFNMQVRUIiwJCTB4ZmMsIDB4ZmMgfQorfTsKKworaW50CithaGNfZHNjb21tYW5kMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoRFNDT01NQU5EMV9wYXJzZV90YWJsZSwgMywgIkRTQ09NTUFORDEiLAorCSAgICAweDg1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IEJVU1NQRF9wYXJzZV90YWJsZVtdID0geworCXsgIlNUQk9OIiwJCTB4MDcsIDB4MDcgfSwKKwl7ICJTVEJPRkYiLAkJMHgzOCwgMHgzOCB9LAorCXsgIkRGVEhSU0hfNzUiLAkJMHg4MCwgMHg4MCB9LAorCXsgIkRGVEhSU0giLAkJMHhjMCwgMHhjMCB9LAorCXsgIkRGVEhSU0hfMTAwIiwJMHhjMCwgMHhjMCB9Cit9OworCitpbnQKK2FoY19idXNzcGRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKEJVU1NQRF9wYXJzZV90YWJsZSwgNSwgIkJVU1NQRCIsCisJICAgIDB4ODYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgSFNfTUFJTEJPWF9wYXJzZV90YWJsZVtdID0geworCXsgIlNFUV9NQUlMQk9YIiwJMHgwZiwgMHgwZiB9LAorCXsgIkhPU1RfVFFJTlBPUyIsCTB4ODAsIDB4ODAgfSwKKwl7ICJIT1NUX01BSUxCT1giLAkweGYwLCAweGYwIH0KK307CisKK2ludAorYWhjX2hzX21haWxib3hfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKEhTX01BSUxCT1hfcGFyc2VfdGFibGUsIDMsICJIU19NQUlMQk9YIiwKKwkgICAgMHg4NiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBEU1BDSVNUQVRVU19wYXJzZV90YWJsZVtdID0geworCXsgIkRGVEhSU0hfMTAwIiwJMHhjMCwgMHhjMCB9Cit9OworCitpbnQKK2FoY19kc3BjaXN0YXR1c19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoRFNQQ0lTVEFUVVNfcGFyc2VfdGFibGUsIDEsICJEU1BDSVNUQVRVUyIsCisJICAgIDB4ODYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgSENOVFJMX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0hJUFJTVCIsCQkweDAxLCAweDAxIH0sCisJeyAiQ0hJUFJTVEFDSyIsCQkweDAxLCAweDAxIH0sCisJeyAiSU5URU4iLAkJMHgwMiwgMHgwMiB9LAorCXsgIlBBVVNFIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJJUlFNUyIsCQkweDA4LCAweDA4IH0sCisJeyAiU1dJTlQiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlBPV1JETiIsCQkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhjX2hjbnRybF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoSENOVFJMX3BhcnNlX3RhYmxlLCA3LCAiSENOVFJMIiwKKwkgICAgMHg4NywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfaGFkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIQUREUiIsCisJICAgIDB4ODgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2hjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIQ05UIiwKKwkgICAgMHg4YywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NicHRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCUFRSIiwKKwkgICAgMHg5MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBJTlRTVEFUX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiU0VRSU5UIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJDTURDTVBMVCIsCQkweDAyLCAweDAyIH0sCisJeyAiU0NTSUlOVCIsCQkweDA0LCAweDA0IH0sCisJeyAiQlJLQURSSU5UIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJCQURfUEhBU0UiLAkJMHgwMSwgMHgwMSB9LAorCXsgIklOVF9QRU5EIiwJCTB4MGYsIDB4MGYgfSwKKwl7ICJTRU5EX1JFSkVDVCIsCTB4MTEsIDB4MTEgfSwKKwl7ICJQUk9UT19WSU9MQVRJT04iLAkweDIxLCAweDIxIH0sCisJeyAiTk9fTUFUQ0giLAkJMHgzMSwgMHgzMSB9LAorCXsgIklHTl9XSURFX1JFUyIsCTB4NDEsIDB4NDEgfSwKKwl7ICJQREFUQV9SRUlOSVQiLAkweDUxLCAweDUxIH0sCisJeyAiSE9TVF9NU0dfTE9PUCIsCTB4NjEsIDB4NjEgfSwKKwl7ICJCQURfU1RBVFVTIiwJCTB4NzEsIDB4NzEgfSwKKwl7ICJQRVJSX0RFVEVDVEVEIiwJMHg4MSwgMHg4MSB9LAorCXsgIkRBVEFfT1ZFUlJVTiIsCTB4OTEsIDB4OTEgfSwKKwl7ICJNS01TR19GQUlMRUQiLAkweGExLCAweGExIH0sCisJeyAiTUlTU0VEX0JVU0ZSRUUiLAkweGIxLCAweGIxIH0sCisJeyAiU0NCX01JU01BVENIIiwJMHhjMSwgMHhjMSB9LAorCXsgIk5PX0ZSRUVfU0NCIiwJMHhkMSwgMHhkMSB9LAorCXsgIk9VVF9PRl9SQU5HRSIsCTB4ZTEsIDB4ZTEgfSwKKwl7ICJTRVFJTlRfTUFTSyIsCTB4ZjEsIDB4ZjEgfQorfTsKKworaW50CithaGNfaW50c3RhdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoSU5UU1RBVF9wYXJzZV90YWJsZSwgMjEsICJJTlRTVEFUIiwKKwkgICAgMHg5MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBDTFJJTlRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDTFJTRVFJTlQiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkNMUkNNRElOVCIsCQkweDAyLCAweDAyIH0sCisJeyAiQ0xSU0NTSUlOVCIsCQkweDA0LCAweDA0IH0sCisJeyAiQ0xSQlJLQURSSU5UIiwJMHgwOCwgMHgwOCB9LAorCXsgIkNMUlBBUkVSUiIsCQkweDEwLCAweDEwIH0KK307CisKK2ludAorYWhjX2NscmludF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoQ0xSSU5UX3BhcnNlX3RhYmxlLCA1LCAiQ0xSSU5UIiwKKwkgICAgMHg5MiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBFUlJPUl9wYXJzZV90YWJsZVtdID0geworCXsgIklMTEhBRERSIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJJTExTQUREUiIsCQkweDAyLCAweDAyIH0sCisJeyAiSUxMT1BDT0RFIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJTUVBBUkVSUiIsCQkweDA4LCAweDA4IH0sCisJeyAiRFBBUkVSUiIsCQkweDEwLCAweDEwIH0sCisJeyAiTVBBUkVSUiIsCQkweDIwLCAweDIwIH0sCisJeyAiUENJRVJSU1RBVCIsCQkweDQwLCAweDQwIH0sCisJeyAiQ0lPUEFSRVJSIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGNfZXJyb3JfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKEVSUk9SX3BhcnNlX3RhYmxlLCA4LCAiRVJST1IiLAorCSAgICAweDkyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IERGQ05UUkxfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJGSUZPUkVTRVQiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkZJRk9GTFVTSCIsCQkweDAyLCAweDAyIH0sCisJeyAiRElSRUNUSU9OIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJIRE1BRU4iLAkJMHgwOCwgMHgwOCB9LAorCXsgIkhETUFFTkFDSyIsCQkweDA4LCAweDA4IH0sCisJeyAiU0RNQUVOIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJTRE1BRU5BQ0siLAkJMHgxMCwgMHgxMCB9LAorCXsgIlNDU0lFTiIsCQkweDIwLCAweDIwIH0sCisJeyAiV0lERU9ERCIsCQkweDQwLCAweDQwIH0sCisJeyAiUFJFTE9BREVOIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGNfZGZjbnRybF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoREZDTlRSTF9wYXJzZV90YWJsZSwgMTAsICJERkNOVFJMIiwKKwkgICAgMHg5MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBERlNUQVRVU19wYXJzZV90YWJsZVtdID0geworCXsgIkZJRk9FTVAiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkZJRk9GVUxMIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJERlRIUkVTSCIsCQkweDA0LCAweDA0IH0sCisJeyAiSERPTkUiLAkJMHgwOCwgMHgwOCB9LAorCXsgIk1SRVFQRU5EIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJGSUZPUVdERU1QIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJERkNBQ0hFVEgiLAkJMHg0MCwgMHg0MCB9LAorCXsgIlBSRUxPQURfQVZBSUwiLAkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhjX2Rmc3RhdHVzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihERlNUQVRVU19wYXJzZV90YWJsZSwgOCwgIkRGU1RBVFVTIiwKKwkgICAgMHg5NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfZGZ3YWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGV0FERFIiLAorCSAgICAweDk1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19kZnJhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZSQUREUiIsCisJICAgIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2RmZGF0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZEQVQiLAorCSAgICAweDk5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IFNDQkNOVF9wYXJzZV90YWJsZVtdID0geworCXsgIlNDQkFVVE8iLAkJMHg4MCwgMHg4MCB9LAorCXsgIlNDQkNOVF9NQVNLIiwJMHgxZiwgMHgxZiB9Cit9OworCitpbnQKK2FoY19zY2JjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNDQkNOVF9wYXJzZV90YWJsZSwgMiwgIlNDQkNOVCIsCisJICAgIDB4OWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3FpbmZpZm9fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRSU5GSUZPIiwKKwkgICAgMHg5YiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfcWluY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUUlOQ05UIiwKKwkgICAgMHg5YywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfcW91dGZpZm9fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRT1VURklGTyIsCisJICAgIDB4OWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgQ1JDQ09OVFJPTDFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJUQVJHQ1JDQ05URU4iLAkweDA0LCAweDA0IH0sCisJeyAiVEFSR0NSQ0VOREVOIiwJMHgwOCwgMHgwOCB9LAorCXsgIkNSQ1JFUUNIS0VOIiwJMHgxMCwgMHgxMCB9LAorCXsgIkNSQ0VORENIS0VOIiwJMHgyMCwgMHgyMCB9LAorCXsgIkNSQ1ZBTENIS0VOIiwJMHg0MCwgMHg0MCB9LAorCXsgIkNSQ09OU0VFTiIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhjX2NyY2NvbnRyb2wxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihDUkNDT05UUk9MMV9wYXJzZV90YWJsZSwgNiwgIkNSQ0NPTlRST0wxIiwKKwkgICAgMHg5ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfcW91dGNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlFPVVRDTlQiLAorCSAgICAweDllLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IFNDU0lQSEFTRV9wYXJzZV90YWJsZVtdID0geworCXsgIkRBVEFfT1VUX1BIQVNFIiwJMHgwMSwgMHgwMSB9LAorCXsgIkRBVEFfSU5fUEhBU0UiLAkweDAyLCAweDAyIH0sCisJeyAiTVNHX09VVF9QSEFTRSIsCTB4MDQsIDB4MDQgfSwKKwl7ICJNU0dfSU5fUEhBU0UiLAkweDA4LCAweDA4IH0sCisJeyAiQ09NTUFORF9QSEFTRSIsCTB4MTAsIDB4MTAgfSwKKwl7ICJTVEFUVVNfUEhBU0UiLAkweDIwLCAweDIwIH0sCisJeyAiREFUQV9QSEFTRV9NQVNLIiwJMHgwMywgMHgwMyB9Cit9OworCitpbnQKK2FoY19zY3NpcGhhc2VfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNDU0lQSEFTRV9wYXJzZV90YWJsZSwgNywgIlNDU0lQSEFTRSIsCisJICAgIDB4OWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0ZVTkNUX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQUxUX01PREUiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoY19zZnVuY3RfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNGVU5DVF9wYXJzZV90YWJsZSwgMSwgIlNGVU5DVCIsCisJICAgIDB4OWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NjYl9iYXNlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX0JBU0UiLAorCSAgICAweGEwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19zY2JfY2RiX3B0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9DREJfUFRSIiwKKwkgICAgMHhhMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NiX3Jlc2lkdWFsX3NncHRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1JFU0lEVUFMX1NHUFRSIiwKKwkgICAgMHhhNCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NiX3Njc2lfc3RhdHVzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1NDU0lfU1RBVFVTIiwKKwkgICAgMHhhOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NiX3RhcmdldF9waGFzZXNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfVEFSR0VUX1BIQVNFUyIsCisJICAgIDB4YTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NjYl90YXJnZXRfZGF0YV9kaXJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfVEFSR0VUX0RBVEFfRElSIiwKKwkgICAgMHhhYSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NiX3RhcmdldF9pdGFnX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1RBUkdFVF9JVEFHIiwKKwkgICAgMHhhYiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NiX2RhdGFwdHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfREFUQVBUUiIsCisJICAgIDB4YWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0NCX0RBVEFDTlRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTR19MQVNUX1NFRyIsCTB4ODAsIDB4ODAgfSwKKwl7ICJTR19ISUdIX0FERFJfQklUUyIsCTB4N2YsIDB4N2YgfQorfTsKKworaW50CithaGNfc2NiX2RhdGFjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNDQl9EQVRBQ05UX3BhcnNlX3RhYmxlLCAyLCAiU0NCX0RBVEFDTlQiLAorCSAgICAweGIwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IFNDQl9TR1BUUl9wYXJzZV90YWJsZVtdID0geworCXsgIlNHX0xJU1RfTlVMTCIsCTB4MDEsIDB4MDEgfSwKKwl7ICJTR19GVUxMX1JFU0lEIiwJMHgwMiwgMHgwMiB9LAorCXsgIlNHX1JFU0lEX1ZBTElEIiwJMHgwNCwgMHgwNCB9Cit9OworCitpbnQKK2FoY19zY2Jfc2dwdHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNDQl9TR1BUUl9wYXJzZV90YWJsZSwgMywgIlNDQl9TR1BUUiIsCisJICAgIDB4YjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0NCX0NPTlRST0xfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJESVNDT05ORUNURUQiLAkweDA0LCAweDA0IH0sCisJeyAiVUxUUkFFTkIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIk1LX01FU1NBR0UiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlRBR19FTkIiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkRJU0NFTkIiLAkJMHg0MCwgMHg0MCB9LAorCXsgIlRBUkdFVF9TQ0IiLAkJMHg4MCwgMHg4MCB9LAorCXsgIlNUQVRVU19SQ1ZEIiwJMHg4MCwgMHg4MCB9LAorCXsgIlNDQl9UQUdfVFlQRSIsCTB4MDMsIDB4MDMgfQorfTsKKworaW50CithaGNfc2NiX2NvbnRyb2xfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNDQl9DT05UUk9MX3BhcnNlX3RhYmxlLCA4LCAiU0NCX0NPTlRST0wiLAorCSAgICAweGI4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IFNDQl9TQ1NJSURfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJUV0lOX0NITkxCIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJPSUQiLAkJMHgwZiwgMHgwZiB9LAorCXsgIlRXSU5fVElEIiwJCTB4NzAsIDB4NzAgfSwKKwl7ICJUSUQiLAkJMHhmMCwgMHhmMCB9Cit9OworCitpbnQKK2FoY19zY2Jfc2NzaWlkX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTQ0JfU0NTSUlEX3BhcnNlX3RhYmxlLCA0LCAiU0NCX1NDU0lJRCIsCisJICAgIDB4YjksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0NCX0xVTl9wYXJzZV90YWJsZVtdID0geworCXsgIlNDQl9YRkVSTEVOX09ERCIsCTB4ODAsIDB4ODAgfSwKKwl7ICJMSUQiLAkJMHgzZiwgMHgzZiB9Cit9OworCitpbnQKK2FoY19zY2JfbHVuX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTQ0JfTFVOX3BhcnNlX3RhYmxlLCAyLCAiU0NCX0xVTiIsCisJICAgIDB4YmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NjYl90YWdfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfVEFHIiwKKwkgICAgMHhiYiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NiX2NkYl9sZW5fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfQ0RCX0xFTiIsCisJICAgIDB4YmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NjYl9zY3NpcmF0ZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9TQ1NJUkFURSIsCisJICAgIDB4YmQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NjYl9zY3Npb2Zmc2V0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1NDU0lPRkZTRVQiLAorCSAgICAweGJlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19zY2JfbmV4dF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9ORVhUIiwKKwkgICAgMHhiZiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NiXzY0X3NwYXJlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCXzY0X1NQQVJFIiwKKwkgICAgMHhjMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTRUVDVExfMjg0MF9wYXJzZV90YWJsZVtdID0geworCXsgIkRPXzI4NDAiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkNLXzI4NDAiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkNTXzI4NDAiLAkJMHgwNCwgMHgwNCB9Cit9OworCitpbnQKK2FoY19zZWVjdGxfMjg0MF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU0VFQ1RMXzI4NDBfcGFyc2VfdGFibGUsIDMsICJTRUVDVExfMjg0MCIsCisJICAgIDB4YzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU1RBVFVTXzI4NDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJESV8yODQwIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJFRVBST01fVEYiLAkJMHg4MCwgMHg4MCB9LAorCXsgIkFEU0VMIiwJCTB4MWUsIDB4MWUgfSwKKwl7ICJCSU9TX1NFTCIsCQkweDYwLCAweDYwIH0KK307CisKK2ludAorYWhjX3N0YXR1c18yODQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTVEFUVVNfMjg0MF9wYXJzZV90YWJsZSwgNCwgIlNUQVRVU18yODQwIiwKKwkgICAgMHhjMSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NiXzY0X2J0dF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl82NF9CVFQiLAorCSAgICAweGQwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19jY2hhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NIQUREUiIsCisJICAgIDB4ZTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2NjaGNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDSENOVCIsCisJICAgIDB4ZTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2Njc2dyYW1fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NHUkFNIiwKKwkgICAgMHhlOSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfY2NzZ2FkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NHQUREUiIsCisJICAgIDB4ZWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgQ0NTR0NUTF9wYXJzZV90YWJsZVtdID0geworCXsgIkNDU0dSRVNFVCIsCQkweDAxLCAweDAxIH0sCisJeyAiU0dfRkVUQ0hfTkVFREVEIiwJMHgwMiwgMHgwMiB9LAorCXsgIkNDU0dFTiIsCQkweDA4LCAweDA4IH0sCisJeyAiQ0NTR0RPTkUiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoY19jY3NnY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihDQ1NHQ1RMX3BhcnNlX3RhYmxlLCA0LCAiQ0NTR0NUTCIsCisJICAgIDB4ZWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2Njc2NicmFtX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTQ0JSQU0iLAorCSAgICAweGVjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19jY3NjYmFkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQkFERFIiLAorCSAgICAweGVkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IENDU0NCQ1RMX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0NTQ0JSRVNFVCIsCQkweDAxLCAweDAxIH0sCisJeyAiQ0NTQ0JESVIiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkNDU0NCRU4iLAkJMHgwOCwgMHgwOCB9LAorCXsgIkNDQVJSRU4iLAkJMHgxMCwgMHgxMCB9LAorCXsgIkFSUkRPTkUiLAkJMHg0MCwgMHg0MCB9LAorCXsgIkNDU0NCRE9ORSIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhjX2Njc2NiY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihDQ1NDQkNUTF9wYXJzZV90YWJsZSwgNiwgIkNDU0NCQ1RMIiwKKwkgICAgMHhlZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfY2NzY2JjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQkNOVCIsCisJICAgIDB4ZWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NjYmJhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCQkFERFIiLAorCSAgICAweGYwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19jY3NjYnB0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0NCUFRSIiwKKwkgICAgMHhmMSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfaG5zY2JfcW9mZl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkhOU0NCX1FPRkYiLAorCSAgICAweGY0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19zbnNjYl9xb2ZmX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU05TQ0JfUU9GRiIsCisJICAgIDB4ZjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3Nkc2NiX3FvZmZfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRFNDQl9RT0ZGIiwKKwkgICAgMHhmOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBRT0ZGX0NUTFNUQV9wYXJzZV90YWJsZVtdID0geworCXsgIlNEU0NCX1JPTExPVkVSIiwJMHgxMCwgMHgxMCB9LAorCXsgIlNOU0NCX1JPTExPVkVSIiwJMHgyMCwgMHgyMCB9LAorCXsgIlNDQl9BVkFJTCIsCQkweDQwLCAweDQwIH0sCisJeyAiU0NCX1FTSVpFXzI1NiIsCTB4MDYsIDB4MDYgfSwKKwl7ICJTQ0JfUVNJWkUiLAkJMHgwNywgMHgwNyB9Cit9OworCitpbnQKK2FoY19xb2ZmX2N0bHN0YV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoUU9GRl9DVExTVEFfcGFyc2VfdGFibGUsIDUsICJRT0ZGX0NUTFNUQSIsCisJICAgIDB4ZmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgREZGX1RIUlNIX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUkRfREZUSFJTSF9NSU4iLAkweDAwLCAweDAwIH0sCisJeyAiV1JfREZUSFJTSF9NSU4iLAkweDAwLCAweDAwIH0sCisJeyAiUkRfREZUSFJTSF8yNSIsCTB4MDEsIDB4MDEgfSwKKwl7ICJSRF9ERlRIUlNIXzUwIiwJMHgwMiwgMHgwMiB9LAorCXsgIlJEX0RGVEhSU0hfNjMiLAkweDAzLCAweDAzIH0sCisJeyAiUkRfREZUSFJTSF83NSIsCTB4MDQsIDB4MDQgfSwKKwl7ICJSRF9ERlRIUlNIXzg1IiwJMHgwNSwgMHgwNSB9LAorCXsgIlJEX0RGVEhSU0hfOTAiLAkweDA2LCAweDA2IH0sCisJeyAiUkRfREZUSFJTSCIsCQkweDA3LCAweDA3IH0sCisJeyAiUkRfREZUSFJTSF9NQVgiLAkweDA3LCAweDA3IH0sCisJeyAiV1JfREZUSFJTSF8yNSIsCTB4MTAsIDB4MTAgfSwKKwl7ICJXUl9ERlRIUlNIXzUwIiwJMHgyMCwgMHgyMCB9LAorCXsgIldSX0RGVEhSU0hfNjMiLAkweDMwLCAweDMwIH0sCisJeyAiV1JfREZUSFJTSF83NSIsCTB4NDAsIDB4NDAgfSwKKwl7ICJXUl9ERlRIUlNIXzg1IiwJMHg1MCwgMHg1MCB9LAorCXsgIldSX0RGVEhSU0hfOTAiLAkweDYwLCAweDYwIH0sCisJeyAiV1JfREZUSFJTSCIsCQkweDcwLCAweDcwIH0sCisJeyAiV1JfREZUSFJTSF9NQVgiLAkweDcwLCAweDcwIH0KK307CisKK2ludAorYWhjX2RmZl90aHJzaF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoREZGX1RIUlNIX3BhcnNlX3RhYmxlLCAxOCwgIkRGRl9USFJTSCIsCisJICAgIDB4ZmIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0dfQ0FDSEVfU0hBRE9XX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTEFTVF9TRUdfRE9ORSIsCTB4MDEsIDB4MDEgfSwKKwl7ICJMQVNUX1NFRyIsCQkweDAyLCAweDAyIH0sCisJeyAiU0dfQUREUl9NQVNLIiwJMHhmOCwgMHhmOCB9Cit9OworCitpbnQKK2FoY19zZ19jYWNoZV9zaGFkb3dfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNHX0NBQ0hFX1NIQURPV19wYXJzZV90YWJsZSwgMywgIlNHX0NBQ0hFX1NIQURPVyIsCisJICAgIDB4ZmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0dfQ0FDSEVfUFJFX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTEFTVF9TRUdfRE9ORSIsCTB4MDEsIDB4MDEgfSwKKwl7ICJMQVNUX1NFRyIsCQkweDAyLCAweDAyIH0sCisJeyAiU0dfQUREUl9NQVNLIiwJMHhmOCwgMHhmOCB9Cit9OworCitpbnQKK2FoY19zZ19jYWNoZV9wcmVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNHX0NBQ0hFX1BSRV9wYXJzZV90YWJsZSwgMywgIlNHX0NBQ0hFX1BSRSIsCisJICAgIDB4ZmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfc2VxLmhfc2hpcHBlZCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfc2VxLmhfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjQxMTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9zZXEuaF9zaGlwcGVkCkBAIC0wLDAgKzEsMTMwNyBAQAorLyoKKyAqIERPIE5PVCBFRElUIC0gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisgKgkJIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2UgZmlsZXM6CisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LnNlcSM1NiAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHgucmVnIzM5ICQKKyAqLworc3RhdGljIHVpbnQ4X3Qgc2VxcHJvZ1tdID0geworCTB4YjIsIDB4MDAsIDB4MDAsIDB4MDgsCisJMHhmNywgMHgxMSwgMHgyMiwgMHgwOCwKKwkweDAwLCAweDY1LCAweGVjLCAweDU5LAorCTB4ZjcsIDB4MDEsIDB4MDIsIDB4MDgsCisJMHhmZiwgMHg2YSwgMHgyNCwgMHgwOCwKKwkweDQwLCAweDAwLCAweDQwLCAweDY4LAorCTB4MDgsIDB4MWYsIDB4M2UsIDB4MTAsCisJMHg0MCwgMHgwMCwgMHg0MCwgMHg2OCwKKwkweGZmLCAweDQwLCAweDNjLCAweDYwLAorCTB4MDgsIDB4MWYsIDB4M2UsIDB4MTAsCisJMHg2MCwgMHgwYiwgMHg0MiwgMHg2OCwKKwkweDQwLCAweGZhLCAweDEyLCAweDc4LAorCTB4MDEsIDB4NGQsIDB4YzgsIDB4MzAsCisJMHgwMCwgMHg0YywgMHgxMiwgMHg3MCwKKwkweDAxLCAweDM5LCAweGEyLCAweDMwLAorCTB4MDAsIDB4NmEsIDB4YzAsIDB4NWUsCisJMHgwMSwgMHg1MSwgMHgyMCwgMHgzMSwKKwkweDAxLCAweDU3LCAweGFlLCAweDAwLAorCTB4MGQsIDB4NmEsIDB4NzYsIDB4MDAsCisJMHgwMCwgMHg1MSwgMHgxMiwgMHg1ZSwKKwkweDAxLCAweDUxLCAweGM4LCAweDMwLAorCTB4MDAsIDB4MzksIDB4YzgsIDB4NjAsCisJMHgwMCwgMHhiYiwgMHgzMCwgMHg3MCwKKwkweGMxLCAweDZhLCAweGQ4LCAweDVlLAorCTB4MDEsIDB4YmYsIDB4NzIsIDB4MzAsCisJMHgwMSwgMHg0MCwgMHg3ZSwgMHgzMSwKKwkweDAxLCAweDkwLCAweDgwLCAweDMwLAorCTB4MDEsIDB4ZjYsIDB4ZDQsIDB4MzAsCisJMHgwMSwgMHg0ZCwgMHg5YSwgMHgxOCwKKwkweGZlLCAweDU3LCAweGFlLCAweDA4LAorCTB4MDEsIDB4NDAsIDB4MjAsIDB4MzEsCisJMHgwMCwgMHg2NSwgMHhjYywgMHg1OCwKKwkweDYwLCAweDBiLCAweDQwLCAweDc4LAorCTB4MDgsIDB4NmEsIDB4MTgsIDB4MDAsCisJMHgwOCwgMHgxMSwgMHgyMiwgMHgwMCwKKwkweDYwLCAweDBiLCAweDAwLCAweDc4LAorCTB4NDAsIDB4MGIsIDB4ZmEsIDB4NjgsCisJMHg4MCwgMHgwYiwgMHhiNiwgMHg3OCwKKwkweDIwLCAweDZhLCAweDE2LCAweDAwLAorCTB4YTQsIDB4NmEsIDB4MDYsIDB4MDAsCisJMHgwOCwgMHg2YSwgMHg3OCwgMHgwMCwKKwkweDAxLCAweDUwLCAweGM4LCAweDMwLAorCTB4ZTAsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHg0OCwgMHg2YSwgMHhmYywgMHg1ZCwKKwkweDAxLCAweDZhLCAweGRjLCAweDAxLAorCTB4ODgsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHg0OCwgMHg2YSwgMHhmYywgMHg1ZCwKKwkweDAxLCAweDZhLCAweDI2LCAweDAxLAorCTB4ZjAsIDB4MTksIDB4N2EsIDB4MDgsCisJMHgwZiwgMHgxOCwgMHhjOCwgMHgwOCwKKwkweDBmLCAweDBmLCAweGM4LCAweDA4LAorCTB4MGYsIDB4MDUsIDB4YzgsIDB4MDgsCisJMHgwMCwgMHgzZCwgMHg3YSwgMHgwMCwKKwkweDA4LCAweDFmLCAweDZlLCAweDc4LAorCTB4ODAsIDB4M2QsIDB4N2EsIDB4MDAsCisJMHgwMSwgMHgzZCwgMHhkOCwgMHgzMSwKKwkweDAxLCAweDNkLCAweDMyLCAweDMxLAorCTB4MTAsIDB4MDMsIDB4NGUsIDB4NzksCisJMHgwMCwgMHg2NSwgMHhmMiwgMHg1OCwKKwkweDgwLCAweDY2LCAweGFlLCAweDc4LAorCTB4MDEsIDB4NjYsIDB4ZDgsIDB4MzEsCisJMHgwMSwgMHg2NiwgMHgzMiwgMHgzMSwKKwkweDNmLCAweDY2LCAweDdjLCAweDA4LAorCTB4NDAsIDB4NjYsIDB4ODIsIDB4NjgsCisJMHgwMSwgMHgzYywgMHg3OCwgMHgwMCwKKwkweDEwLCAweDAzLCAweDllLCAweDc4LAorCTB4MDAsIDB4NjUsIDB4ZjIsIDB4NTgsCisJMHhlMCwgMHg2NiwgMHhjOCwgMHgxOCwKKwkweDAwLCAweDY1LCAweGFhLCAweDUwLAorCTB4ZGQsIDB4NjYsIDB4YzgsIDB4MTgsCisJMHgwMCwgMHg2NSwgMHhhYSwgMHg0OCwKKwkweDAxLCAweDY2LCAweGQ4LCAweDMxLAorCTB4MDEsIDB4NjYsIDB4MzIsIDB4MzEsCisJMHgxMCwgMHgwMywgMHg0ZSwgMHg3OSwKKwkweDAwLCAweDY1LCAweGYyLCAweDU4LAorCTB4MDEsIDB4NjYsIDB4ZDgsIDB4MzEsCisJMHgwMSwgMHg2NiwgMHgzMiwgMHgzMSwKKwkweDAxLCAweDY2LCAweGFjLCAweDMwLAorCTB4NDAsIDB4M2MsIDB4NzgsIDB4MDAsCisJMHhmZiwgMHg2YSwgMHhkOCwgMHgwMSwKKwkweGZmLCAweDZhLCAweDMyLCAweDAxLAorCTB4MTAsIDB4M2MsIDB4NzgsIDB4MDAsCisJMHgwMiwgMHg1NywgMHg0MCwgMHg2OSwKKwkweDEwLCAweDAzLCAweDNlLCAweDY5LAorCTB4MDAsIDB4NjUsIDB4MjAsIDB4NDEsCisJMHgwMiwgMHg1NywgMHhhZSwgMHgwMCwKKwkweDAwLCAweDY1LCAweDllLCAweDQwLAorCTB4NjEsIDB4NmEsIDB4ZDgsIDB4NWUsCisJMHgwOCwgMHg1MSwgMHgyMCwgMHg3MSwKKwkweDAyLCAweDBiLCAweGIyLCAweDc4LAorCTB4MDAsIDB4NjUsIDB4YWUsIDB4NDAsCisJMHgxYSwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweGYwLCAweDE5LCAweDdhLCAweDA4LAorCTB4MGYsIDB4MGYsIDB4YzgsIDB4MDgsCisJMHgwZiwgMHgwNSwgMHhjOCwgMHgwOCwKKwkweDAwLCAweDNkLCAweDdhLCAweDAwLAorCTB4MDgsIDB4MWYsIDB4YzQsIDB4NzgsCisJMHg4MCwgMHgzZCwgMHg3YSwgMHgwMCwKKwkweDIwLCAweDZhLCAweDE2LCAweDAwLAorCTB4MDAsIDB4NjUsIDB4Y2MsIDB4NDEsCisJMHgwMCwgMHg2NSwgMHhiMiwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDEyLCAweDQwLAorCTB4MjAsIDB4MTEsIDB4ZDIsIDB4NjgsCisJMHgyMCwgMHg2YSwgMHgxOCwgMHgwMCwKKwkweDIwLCAweDExLCAweDIyLCAweDAwLAorCTB4ZjcsIDB4MWYsIDB4Y2EsIDB4MDgsCisJMHg4MCwgMHhiOSwgMHhkOCwgMHg3OCwKKwkweDA4LCAweDY1LCAweGNhLCAweDAwLAorCTB4MDEsIDB4NjUsIDB4M2UsIDB4MzAsCisJMHgwMSwgMHhiOSwgMHgxZSwgMHgzMCwKKwkweDdmLCAweGI5LCAweDBhLCAweDA4LAorCTB4MDEsIDB4YjksIDB4MGEsIDB4MzAsCisJMHgwMSwgMHg1NCwgMHhjYSwgMHgzMCwKKwkweDgwLCAweGI4LCAweGU2LCAweDc4LAorCTB4ODAsIDB4NjUsIDB4Y2EsIDB4MDAsCisJMHgwMSwgMHg2NSwgMHgwMCwgMHgzNCwKKwkweDAxLCAweDU0LCAweDAwLCAweDM0LAorCTB4MDgsIDB4YjgsIDB4ZWUsIDB4NzgsCisJMHgyMCwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweDAyLCAweGJkLCAweDA4LCAweDM0LAorCTB4MDEsIDB4YmQsIDB4MDgsIDB4MzQsCisJMHgwOCwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweDAyLCAweDBiLCAweGY0LCAweDc4LAorCTB4ZjcsIDB4MDEsIDB4MDIsIDB4MDgsCisJMHgwMSwgMHgwNiwgMHhjYywgMHgzNCwKKwkweGIyLCAweDAwLCAweDAwLCAweDA4LAorCTB4MDEsIDB4NDAsIDB4MjAsIDB4MzEsCisJMHgwMSwgMHhiZiwgMHg4MCwgMHgzMCwKKwkweDAxLCAweGI5LCAweDdhLCAweDMwLAorCTB4M2YsIDB4YmEsIDB4N2MsIDB4MDgsCisJMHgwMCwgMHg2NSwgMHhlYSwgMHg1OCwKKwkweDgwLCAweDBiLCAweGM0LCAweDc5LAorCTB4MTIsIDB4MDEsIDB4MDIsIDB4MDAsCisJMHgwMSwgMHhhYiwgMHhhYywgMHgzMCwKKwkweGU0LCAweDZhLCAweDZlLCAweDVkLAorCTB4NDAsIDB4NmEsIDB4MTYsIDB4MDAsCisJMHg4MCwgMHgzZSwgMHg4NCwgMHg1ZCwKKwkweDIwLCAweGI4LCAweDE4LCAweDc5LAorCTB4MjAsIDB4NmEsIDB4ODQsIDB4NWQsCisJMHgwMCwgMHhhYiwgMHg4NCwgMHg1ZCwKKwkweDAxLCAweGE5LCAweDc4LCAweDMwLAorCTB4MTAsIDB4YjgsIDB4MjAsIDB4NzksCisJMHhlNCwgMHg2YSwgMHg2ZSwgMHg1ZCwKKwkweDAwLCAweDY1LCAweGFlLCAweDQwLAorCTB4MTAsIDB4MDMsIDB4M2MsIDB4NjksCisJMHgwOCwgMHgzYywgMHg1YSwgMHg2OSwKKwkweDA0LCAweDNjLCAweDkyLCAweDY5LAorCTB4MDIsIDB4M2MsIDB4OTgsIDB4NjksCisJMHgwMSwgMHgzYywgMHg0NCwgMHg3OSwKKwkweGZmLCAweDZhLCAweDcwLCAweDAwLAorCTB4MDAsIDB4NjUsIDB4YTQsIDB4NTksCisJMHgwMCwgMHg2YSwgMHhjMCwgMHg1ZSwKKwkweGZmLCAweDM4LCAweDMwLCAweDcxLAorCTB4MGQsIDB4NmEsIDB4NzYsIDB4MDAsCisJMHgwMCwgMHgzOCwgMHgxMiwgMHg1ZSwKKwkweDAwLCAweDY1LCAweGVhLCAweDU4LAorCTB4MTIsIDB4MDEsIDB4MDIsIDB4MDAsCisJMHgwMCwgMHg2NSwgMHgxOCwgMHg0MSwKKwkweGE0LCAweDZhLCAweDA2LCAweDAwLAorCTB4MDAsIDB4NjUsIDB4ZjIsIDB4NTgsCisJMHhmZCwgMHg1NywgMHhhZSwgMHgwOCwKKwkweDAwLCAweDY1LCAweGFlLCAweDQwLAorCTB4ZTQsIDB4NmEsIDB4NmUsIDB4NWQsCisJMHgyMCwgMHgzYywgMHg0YSwgMHg3OSwKKwkweDAyLCAweDZhLCAweDg0LCAweDVkLAorCTB4MDQsIDB4NmEsIDB4ODQsIDB4NWQsCisJMHgwMSwgMHgwMywgMHg0YywgMHg2OSwKKwkweGY3LCAweDExLCAweDIyLCAweDA4LAorCTB4ZmYsIDB4NmEsIDB4MjQsIDB4MDgsCisJMHhmZiwgMHg2YSwgMHgwNiwgMHgwOCwKKwkweDAxLCAweDZhLCAweDdlLCAweDAwLAorCTB4MDAsIDB4NjUsIDB4YTQsIDB4NTksCisJMHgwMCwgMHg2NSwgMHgwNCwgMHg0MCwKKwkweDgwLCAweDg2LCAweGM4LCAweDA4LAorCTB4MDEsIDB4NGYsIDB4YzgsIDB4MzAsCisJMHgwMCwgMHg1MCwgMHg2YywgMHg2MSwKKwkweGM0LCAweDZhLCAweDZlLCAweDVkLAorCTB4NDAsIDB4M2MsIDB4NjgsIDB4NzksCisJMHgyOCwgMHg2YSwgMHg4NCwgMHg1ZCwKKwkweDAwLCAweDY1LCAweDRjLCAweDQxLAorCTB4MDgsIDB4NmEsIDB4ODQsIDB4NWQsCisJMHgwMCwgMHg2NSwgMHg0YywgMHg0MSwKKwkweDg0LCAweDZhLCAweDZlLCAweDVkLAorCTB4MDAsIDB4NjUsIDB4ZjIsIDB4NTgsCisJMHgwMSwgMHg2NiwgMHhjOCwgMHgzMCwKKwkweDAxLCAweDY0LCAweGQ4LCAweDMxLAorCTB4MDEsIDB4NjQsIDB4MzIsIDB4MzEsCisJMHg1YiwgMHg2NCwgMHhjOCwgMHgyOCwKKwkweDMwLCAweDY0LCAweGNhLCAweDE4LAorCTB4MDEsIDB4NmMsIDB4YzgsIDB4MzAsCisJMHhmZiwgMHg2NCwgMHg4ZSwgMHg3OSwKKwkweDA4LCAweDAxLCAweDAyLCAweDAwLAorCTB4MDIsIDB4MGIsIDB4ODAsIDB4NzksCisJMHgwMSwgMHg2NCwgMHg4NiwgMHg2MSwKKwkweGY3LCAweDAxLCAweDAyLCAweDA4LAorCTB4MDEsIDB4MDYsIDB4ZDgsIDB4MzEsCisJMHgwMSwgMHgwNiwgMHgzMiwgMHgzMSwKKwkweGZmLCAweDY0LCAweGM4LCAweDE4LAorCTB4ZmYsIDB4NjQsIDB4ODAsIDB4NjksCisJMHhmNywgMHgzYywgMHg3OCwgMHgwOCwKKwkweDAwLCAweDY1LCAweDIwLCAweDQxLAorCTB4NDAsIDB4YWEsIDB4N2UsIDB4MTAsCisJMHgwNCwgMHhhYSwgMHg2ZSwgMHg1ZCwKKwkweDAwLCAweDY1LCAweDU2LCAweDQyLAorCTB4YzQsIDB4NmEsIDB4NmUsIDB4NWQsCisJMHhjMCwgMHg2YSwgMHg3ZSwgMHgwMCwKKwkweDAwLCAweGE4LCAweDg0LCAweDVkLAorCTB4ZTQsIDB4NmEsIDB4MDYsIDB4MDAsCisJMHgwMCwgMHg2YSwgMHg4NCwgMHg1ZCwKKwkweDAwLCAweDY1LCAweDRjLCAweDQxLAorCTB4MTAsIDB4M2MsIDB4YTgsIDB4NjksCisJMHgwMCwgMHhiYiwgMHg4YSwgMHg0NCwKKwkweDE4LCAweDZhLCAweGRhLCAweDAxLAorCTB4MDEsIDB4NjksIDB4ZDgsIDB4MzEsCisJMHgxYywgMHg2YSwgMHhkMCwgMHgwMSwKKwkweDA5LCAweGVlLCAweGRjLCAweDAxLAorCTB4ODAsIDB4ZWUsIDB4YjAsIDB4NzksCisJMHhmZiwgMHg2YSwgMHhkYywgMHgwOSwKKwkweDAxLCAweDkzLCAweDI2LCAweDAxLAorCTB4MDMsIDB4NmEsIDB4MmEsIDB4MDEsCisJMHgwMSwgMHg2OSwgMHgzMiwgMHgzMSwKKwkweDFjLCAweDZhLCAweGUwLCAweDVkLAorCTB4MGEsIDB4OTMsIDB4MjYsIDB4MDEsCisJMHgwMCwgMHg2NSwgMHhhOCwgMHg1ZSwKKwkweDAxLCAweDUwLCAweGEwLCAweDE4LAorCTB4MDIsIDB4NmEsIDB4MjIsIDB4MDUsCisJMHgxYSwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweDgwLCAweDZhLCAweDc0LCAweDAwLAorCTB4NDAsIDB4NmEsIDB4NzgsIDB4MDAsCisJMHg0MCwgMHg2YSwgMHgxNiwgMHgwMCwKKwkweDAwLCAweDY1LCAweGQ4LCAweDVkLAorCTB4MDEsIDB4M2YsIDB4YzgsIDB4MzAsCisJMHhiZiwgMHg2NCwgMHg1NiwgMHg3YSwKKwkweDgwLCAweDY0LCAweDllLCAweDczLAorCTB4YTAsIDB4NjQsIDB4MDAsIDB4NzQsCisJMHhjMCwgMHg2NCwgMHhmNCwgMHg3MywKKwkweGUwLCAweDY0LCAweDMwLCAweDc0LAorCTB4MDEsIDB4NmEsIDB4ZDgsIDB4NWUsCisJMHgwMCwgMHg2NSwgMHhjYywgMHg0MSwKKwkweGY3LCAweDExLCAweDIyLCAweDA4LAorCTB4MDEsIDB4MDYsIDB4ZDQsIDB4MzAsCisJMHhmZiwgMHg2YSwgMHgyNCwgMHgwOCwKKwkweGY3LCAweDAxLCAweDAyLCAweDA4LAorCTB4MDksIDB4MGMsIDB4ZTYsIDB4NzksCisJMHgwOCwgMHgwYywgMHgwNCwgMHg2OCwKKwkweGIxLCAweDZhLCAweGQ4LCAweDVlLAorCTB4ZmYsIDB4NmEsIDB4MjYsIDB4MDksCisJMHgxMiwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweDAyLCAweDZhLCAweDA4LCAweDMwLAorCTB4ZmYsIDB4NmEsIDB4MDgsIDB4MDgsCisJMHhkZiwgMHgwMSwgMHgwMiwgMHgwOCwKKwkweDAxLCAweDZhLCAweDdlLCAweDAwLAorCTB4YzAsIDB4NmEsIDB4NzgsIDB4MDQsCisJMHhmZiwgMHg2YSwgMHhjOCwgMHgwOCwKKwkweDA4LCAweGE0LCAweDQ4LCAweDE5LAorCTB4MDAsIDB4YTUsIDB4NGEsIDB4MjEsCisJMHgwMCwgMHhhNiwgMHg0YywgMHgyMSwKKwkweDAwLCAweGE3LCAweDRlLCAweDI1LAorCTB4MDgsIDB4ZWIsIDB4ZGMsIDB4N2UsCisJMHg4MCwgMHhlYiwgMHgwNiwgMHg3YSwKKwkweGZmLCAweDZhLCAweGQ2LCAweDA5LAorCTB4MDgsIDB4ZWIsIDB4MGEsIDB4NmEsCisJMHhmZiwgMHg2YSwgMHhkNCwgMHgwYywKKwkweDgwLCAweGEzLCAweGRjLCAweDZlLAorCTB4ODgsIDB4ZWIsIDB4MjAsIDB4NzIsCisJMHgwOCwgMHhlYiwgMHhkYywgMHg2ZSwKKwkweDA0LCAweGVhLCAweDI0LCAweGUyLAorCTB4MDgsIDB4ZWUsIDB4ZGMsIDB4NmUsCisJMHgwNCwgMHg2YSwgMHhkMCwgMHg4MSwKKwkweDA1LCAweGE0LCAweGMwLCAweDg5LAorCTB4MDMsIDB4YTUsIDB4YzIsIDB4MzEsCisJMHgwOSwgMHg2YSwgMHhkNiwgMHgwNSwKKwkweDAwLCAweDY1LCAweDA4LCAweDVhLAorCTB4MDYsIDB4YTQsIDB4ZDQsIDB4ODksCisJMHg4MCwgMHg5NCwgMHhkYywgMHg3ZSwKKwkweDA3LCAweGU5LCAweDEwLCAweDMxLAorCTB4MDEsIDB4ZTksIDB4NDYsIDB4MzEsCisJMHgwMCwgMHhhMywgMHhiYSwgMHg1ZSwKKwkweDAwLCAweDY1LCAweGZhLCAweDU5LAorCTB4MDEsIDB4YTQsIDB4Y2EsIDB4MzAsCisJMHg4MCwgMHhhMywgMHgzNCwgMHg3YSwKKwkweDAyLCAweDY1LCAweGNhLCAweDAwLAorCTB4MDEsIDB4NjUsIDB4ZjgsIDB4MzEsCisJMHg4MCwgMHg5MywgMHgyNiwgMHgwMSwKKwkweGZmLCAweDZhLCAweGQ0LCAweDBjLAorCTB4MDEsIDB4OGMsIDB4YzgsIDB4MzAsCisJMHgwMCwgMHg4OCwgMHhjOCwgMHgxOCwKKwkweDAyLCAweDY0LCAweGM4LCAweDg4LAorCTB4ZmYsIDB4NjQsIDB4ZGMsIDB4N2UsCisJMHhmZiwgMHg4ZCwgMHg0YSwgMHg2YSwKKwkweGZmLCAweDhlLCAweDRhLCAweDZhLAorCTB4MDMsIDB4OGMsIDB4ZDQsIDB4OTgsCisJMHgwMCwgMHg2NSwgMHhkYywgMHg1NiwKKwkweDAxLCAweDY0LCAweDcwLCAweDMwLAorCTB4ZmYsIDB4NjQsIDB4YzgsIDB4MTAsCisJMHgwMSwgMHg2NCwgMHhjOCwgMHgxOCwKKwkweDAwLCAweDhjLCAweDE4LCAweDE5LAorCTB4ZmYsIDB4OGQsIDB4MWEsIDB4MjEsCisJMHhmZiwgMHg4ZSwgMHgxYywgMHgyNSwKKwkweGMwLCAweDNjLCAweDVhLCAweDdhLAorCTB4MjEsIDB4NmEsIDB4ZDgsIDB4NWUsCisJMHhhOCwgMHg2YSwgMHg3NiwgMHgwMCwKKwkweDc5LCAweDZhLCAweDc2LCAweDAwLAorCTB4NDAsIDB4M2YsIDB4NjIsIDB4NmEsCisJMHgwNCwgMHgzYiwgMHg3NiwgMHgwMCwKKwkweDA0LCAweDZhLCAweGQ0LCAweDgxLAorCTB4MjAsIDB4M2MsIDB4NmEsIDB4N2EsCisJMHg1MSwgMHg2YSwgMHhkOCwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDgyLCAweDQyLAorCTB4MjAsIDB4M2MsIDB4NzgsIDB4MDAsCisJMHgwMCwgMHhiMywgMHhiYSwgMHg1ZSwKKwkweDA3LCAweGFjLCAweDEwLCAweDMxLAorCTB4MDUsIDB4YjMsIDB4NDYsIDB4MzEsCisJMHg4OCwgMHg2YSwgMHhjYywgMHgwMCwKKwkweGFjLCAweDZhLCAweGVlLCAweDVkLAorCTB4YTMsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHhiMywgMHg2YSwgMHhmMiwgMHg1ZCwKKwkweDAwLCAweDY1LCAweDNhLCAweDVhLAorCTB4ZmQsIDB4YTQsIDB4NDgsIDB4MDksCisJMHgwMywgMHg4YywgMHgxMCwgMHgzMCwKKwkweDAwLCAweDY1LCAweGU2LCAweDVkLAorCTB4MDEsIDB4YTQsIDB4OTQsIDB4N2EsCisJMHgwNCwgMHgzYiwgMHg3NiwgMHgwOCwKKwkweDAxLCAweDNiLCAweDI2LCAweDMxLAorCTB4ODAsIDB4MDIsIDB4MDQsIDB4MDAsCisJMHgxMCwgMHgwYywgMHg4YSwgMHg3YSwKKwkweDAzLCAweDllLCAweDhjLCAweDZhLAorCTB4N2YsIDB4MDIsIDB4MDQsIDB4MDgsCisJMHg5MSwgMHg2YSwgMHhkOCwgMHg1ZSwKKwkweDAwLCAweDY1LCAweGNjLCAweDQxLAorCTB4MDEsIDB4YTQsIDB4Y2EsIDB4MzAsCisJMHg4MCwgMHhhMywgMHg5YSwgMHg3YSwKKwkweDAyLCAweDY1LCAweGNhLCAweDAwLAorCTB4MDEsIDB4NjUsIDB4ZjgsIDB4MzEsCisJMHgwMSwgMHgzYiwgMHgyNiwgMHgzMSwKKwkweDAwLCAweDY1LCAweDBlLCAweDVhLAorCTB4MDEsIDB4ZmMsIDB4YTgsIDB4NmEsCisJMHg4MCwgMHgwYiwgMHg5ZSwgMHg2YSwKKwkweDEwLCAweDBjLCAweDllLCAweDdhLAorCTB4MjAsIDB4OTMsIDB4OWUsIDB4NmEsCisJMHgwMiwgMHg5MywgMHgyNiwgMHgwMSwKKwkweDAyLCAweGZjLCAweGIyLCAweDdhLAorCTB4NDAsIDB4MGQsIDB4YzYsIDB4NmEsCisJMHgwMSwgMHhhNCwgMHg0OCwgMHgwMSwKKwkweDAwLCAweDY1LCAweGM2LCAweDQyLAorCTB4NDAsIDB4MGQsIDB4YjgsIDB4NmEsCisJMHgwMCwgMHg2NSwgMHgwZSwgMHg1YSwKKwkweDAwLCAweDY1LCAweGFhLCAweDQyLAorCTB4ODAsIDB4ZmMsIDB4YzIsIDB4N2EsCisJMHg4MCwgMHhhNCwgMHhjMiwgMHg2YSwKKwkweGZmLCAweGE1LCAweDRhLCAweDE5LAorCTB4ZmYsIDB4YTYsIDB4NGMsIDB4MjEsCisJMHhmZiwgMHhhNywgMHg0ZSwgMHgyMSwKKwkweGY4LCAweGZjLCAweDQ4LCAweDA5LAorCTB4N2YsIDB4YTMsIDB4NDYsIDB4MDksCisJMHgwNCwgMHgzYiwgMHhlMiwgMHg2YSwKKwkweDAyLCAweDkzLCAweDI2LCAweDAxLAorCTB4MDEsIDB4OTQsIDB4YzgsIDB4N2EsCisJMHgwMSwgMHg5NCwgMHhjOCwgMHg3YSwKKwkweDAxLCAweDk0LCAweGM4LCAweDdhLAorCTB4MDEsIDB4OTQsIDB4YzgsIDB4N2EsCisJMHgwMSwgMHg5NCwgMHhjOCwgMHg3YSwKKwkweDAxLCAweGE0LCAweGUwLCAweDdhLAorCTB4MDEsIDB4ZmMsIDB4ZDYsIDB4N2EsCisJMHgwMSwgMHg5NCwgMHhlMiwgMHg2YSwKKwkweDAxLCAweDk0LCAweGUyLCAweDZhLAorCTB4MDEsIDB4OTQsIDB4ZTIsIDB4NmEsCisJMHgwMCwgMHg2NSwgMHg4MiwgMHg0MiwKKwkweDAxLCAweDk0LCAweGUwLCAweDdhLAorCTB4MTAsIDB4OTQsIDB4ZTIsIDB4NmEsCisJMHhkNywgMHg5MywgMHgyNiwgMHgwOSwKKwkweDI4LCAweDkzLCAweGU2LCAweDZhLAorCTB4MDEsIDB4ODUsIDB4MGEsIDB4MDEsCisJMHgwMiwgMHhmYywgMHhlZSwgMHg2YSwKKwkweDAxLCAweDE0LCAweDQ2LCAweDMxLAorCTB4ZmYsIDB4NmEsIDB4MTAsIDB4MDksCisJMHhmZSwgMHg4NSwgMHgwYSwgMHgwOSwKKwkweGZmLCAweDM4LCAweGZjLCAweDZhLAorCTB4ODAsIDB4YTMsIDB4ZmMsIDB4N2EsCisJMHg4MCwgMHgwYiwgMHhmYSwgMHg3YSwKKwkweDA0LCAweDNiLCAweGZjLCAweDdhLAorCTB4YmYsIDB4M2IsIDB4NzYsIDB4MDgsCisJMHgwMSwgMHgzYiwgMHgyNiwgMHgzMSwKKwkweDAwLCAweDY1LCAweDBlLCAweDVhLAorCTB4MDEsIDB4MGIsIDB4MGEsIDB4NmIsCisJMHgxMCwgMHgwYywgMHhmZSwgMHg3YSwKKwkweDA0LCAweDkzLCAweDA4LCAweDZiLAorCTB4MDEsIDB4OTQsIDB4MDYsIDB4N2IsCisJMHgxMCwgMHg5NCwgMHgwOCwgMHg2YiwKKwkweGM3LCAweDkzLCAweDI2LCAweDA5LAorCTB4MDEsIDB4OTksIDB4ZDQsIDB4MzAsCisJMHgzOCwgMHg5MywgMHgwYywgMHg2YiwKKwkweGZmLCAweDA4LCAweDVhLCAweDZiLAorCTB4ZmYsIDB4MDksIDB4NWEsIDB4NmIsCisJMHhmZiwgMHgwYSwgMHg1YSwgMHg2YiwKKwkweGZmLCAweDM4LCAweDI4LCAweDdiLAorCTB4MDQsIDB4MTQsIDB4MTAsIDB4MzEsCisJMHgwMSwgMHgzOCwgMHgxOCwgMHgzMSwKKwkweDAyLCAweDZhLCAweDFhLCAweDMxLAorCTB4ODgsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHgxNCwgMHg2YSwgMHhmNCwgMHg1ZCwKKwkweDAwLCAweDM4LCAweGUwLCAweDVkLAorCTB4ZmYsIDB4NmEsIDB4NzAsIDB4MDgsCisJMHgwMCwgMHg2NSwgMHg1NCwgMHg0MywKKwkweDgwLCAweGEzLCAweDJlLCAweDdiLAorCTB4MDEsIDB4YTQsIDB4NDgsIDB4MDEsCisJMHgwMCwgMHg2NSwgMHg1YSwgMHg0MywKKwkweDA4LCAweGViLCAweDM0LCAweDdiLAorCTB4MDAsIDB4NjUsIDB4MGUsIDB4NWEsCisJMHgwOCwgMHhlYiwgMHgzMCwgMHg2YiwKKwkweDA3LCAweGU5LCAweDEwLCAweDMxLAorCTB4MDEsIDB4ZTksIDB4Y2EsIDB4MzAsCisJMHgwMSwgMHg2NSwgMHg0NiwgMHgzMSwKKwkweDAwLCAweDZhLCAweGJhLCAweDVlLAorCTB4ODgsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHhhNCwgMHg2YSwgMHhmNCwgMHg1ZCwKKwkweDA4LCAweDZhLCAweGUwLCAweDVkLAorCTB4MGQsIDB4OTMsIDB4MjYsIDB4MDEsCisJMHgwMCwgMHg2NSwgMHhhOCwgMHg1ZSwKKwkweDg4LCAweDZhLCAweGNjLCAweDAwLAorCTB4MDAsIDB4NjUsIDB4OGEsIDB4NWUsCisJMHgwMSwgMHg5OSwgMHg0NiwgMHgzMSwKKwkweDAwLCAweGEzLCAweGJhLCAweDVlLAorCTB4MDEsIDB4ODgsIDB4MTAsIDB4MzEsCisJMHgwMCwgMHg2NSwgMHgzYSwgMHg1YSwKKwkweDAwLCAweDY1LCAweGZhLCAweDU5LAorCTB4MDMsIDB4OGMsIDB4MTAsIDB4MzAsCisJMHgwMCwgMHg2NSwgMHhlNiwgMHg1ZCwKKwkweDgwLCAweDBiLCAweDgyLCAweDZhLAorCTB4ODAsIDB4MGIsIDB4NjIsIDB4NmIsCisJMHgwMSwgMHgwYywgMHg1YywgMHg3YiwKKwkweDEwLCAweDBjLCAweDgyLCAweDdhLAorCTB4MDMsIDB4OWUsIDB4ODIsIDB4NmEsCisJMHgwMCwgMHg2NSwgMHgwNCwgMHg1YSwKKwkweDAwLCAweDZhLCAweGJhLCAweDVlLAorCTB4MDEsIDB4YTQsIDB4ODIsIDB4NmIsCisJMHhmZiwgMHgzOCwgMHg3OCwgMHg3YiwKKwkweDAxLCAweDM4LCAweGM4LCAweDMwLAorCTB4MDAsIDB4MDgsIDB4NDAsIDB4MTksCisJMHhmZiwgMHg2YSwgMHhjOCwgMHgwOCwKKwkweDAwLCAweDA5LCAweDQyLCAweDIxLAorCTB4MDAsIDB4MGEsIDB4NDQsIDB4MjEsCisJMHhmZiwgMHg2YSwgMHg3MCwgMHgwOCwKKwkweDAwLCAweDY1LCAweDdhLCAweDQzLAorCTB4MDMsIDB4MDgsIDB4NDAsIDB4MzEsCisJMHgwMywgMHgwOCwgMHg0MCwgMHgzMSwKKwkweDAxLCAweDA4LCAweDQwLCAweDMxLAorCTB4MDEsIDB4MDksIDB4NDIsIDB4MzEsCisJMHgwMSwgMHgwYSwgMHg0NCwgMHgzMSwKKwkweGZkLCAweGI0LCAweDY4LCAweDA5LAorCTB4MTIsIDB4MDEsIDB4MDIsIDB4MDAsCisJMHgxMiwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweDA0LCAweDNjLCAweGNjLCAweDc5LAorCTB4ZmIsIDB4M2MsIDB4NzgsIDB4MDgsCisJMHgwNCwgMHg5MywgMHgyMCwgMHg3OSwKKwkweDAxLCAweDBjLCAweDhlLCAweDZiLAorCTB4ODAsIDB4YmEsIDB4MjAsIDB4NzksCisJMHg4MCwgMHgwNCwgMHgyMCwgMHg3OSwKKwkweGU0LCAweDZhLCAweDZlLCAweDVkLAorCTB4MjMsIDB4NmEsIDB4ODQsIDB4NWQsCisJMHgwMSwgMHg2YSwgMHg4NCwgMHg1ZCwKKwkweDAwLCAweDY1LCAweDIwLCAweDQxLAorCTB4MDAsIDB4NjUsIDB4Y2MsIDB4NDEsCisJMHg4MCwgMHgzYywgMHhhMiwgMHg3YiwKKwkweDIxLCAweDZhLCAweGQ4LCAweDVlLAorCTB4MDEsIDB4YmMsIDB4MTgsIDB4MzEsCisJMHgwMiwgMHg2YSwgMHgxYSwgMHgzMSwKKwkweDAyLCAweDZhLCAweGY4LCAweDAxLAorCTB4MDEsIDB4YmMsIDB4MTAsIDB4MzAsCisJMHgwMiwgMHg2YSwgMHgxMiwgMHgzMCwKKwkweDAxLCAweGJjLCAweDEwLCAweDMwLAorCTB4ZmYsIDB4NmEsIDB4MTIsIDB4MDgsCisJMHhmZiwgMHg2YSwgMHgxNCwgMHgwOCwKKwkweGYzLCAweGJjLCAweGQ0LCAweDE4LAorCTB4YTAsIDB4NmEsIDB4YzgsIDB4NTMsCisJMHgwNCwgMHhhMCwgMHgxMCwgMHgzMSwKKwkweGFjLCAweDZhLCAweDI2LCAweDAxLAorCTB4MDQsIDB4YTAsIDB4MTAsIDB4MzEsCisJMHgwMywgMHgwOCwgMHgxOCwgMHgzMSwKKwkweDg4LCAweDZhLCAweGNjLCAweDAwLAorCTB4YTAsIDB4NmEsIDB4ZjQsIDB4NWQsCisJMHgwMCwgMHhiYywgMHhlMCwgMHg1ZCwKKwkweDNkLCAweDZhLCAweDI2LCAweDAxLAorCTB4MDAsIDB4NjUsIDB4ZTAsIDB4NDMsCisJMHhmZiwgMHg2YSwgMHgxMCwgMHgwOSwKKwkweGE0LCAweDZhLCAweDI2LCAweDAxLAorCTB4MGMsIDB4YTAsIDB4MzIsIDB4MzEsCisJMHgwNSwgMHg2YSwgMHgyNiwgMHgwMSwKKwkweDM1LCAweDZhLCAweDI2LCAweDAxLAorCTB4MGMsIDB4YTAsIDB4MzIsIDB4MzEsCisJMHgzNiwgMHg2YSwgMHgyNiwgMHgwMSwKKwkweDAyLCAweDkzLCAweDI2LCAweDAxLAorCTB4MzUsIDB4NmEsIDB4MjYsIDB4MDEsCisJMHgwMCwgMHg2NSwgMHg5YywgMHg1ZSwKKwkweDAwLCAweDY1LCAweDljLCAweDVlLAorCTB4MDIsIDB4OTMsIDB4MjYsIDB4MDEsCisJMHhiZiwgMHgzYywgMHg3OCwgMHgwOCwKKwkweDA0LCAweDBiLCAweGU2LCAweDZiLAorCTB4MTAsIDB4MGMsIDB4ZTIsIDB4N2IsCisJMHgwMSwgMHgwMywgMHhlNiwgMHg2YiwKKwkweDIwLCAweDkzLCAweGU4LCAweDZiLAorCTB4MDQsIDB4MGIsIDB4ZWUsIDB4NmIsCisJMHg0MCwgMHgzYywgMHg3OCwgMHgwMCwKKwkweGM3LCAweDkzLCAweDI2LCAweDA5LAorCTB4MzgsIDB4OTMsIDB4ZjAsIDB4NmIsCisJMHgwMCwgMHg2NSwgMHhjYywgMHg0MSwKKwkweDgwLCAweDNjLCAweDU2LCAweDZjLAorCTB4MDEsIDB4MDYsIDB4NTAsIDB4MzEsCisJMHg4MCwgMHhiOCwgMHg3MCwgMHgwMSwKKwkweDAwLCAweDY1LCAweGNjLCAweDQxLAorCTB4MTAsIDB4M2YsIDB4MDYsIDB4MDAsCisJMHgxMCwgMHg2YSwgMHgwNiwgMHgwMCwKKwkweDAxLCAweDNhLCAweGNhLCAweDMwLAorCTB4ODAsIDB4NjUsIDB4MWMsIDB4NjQsCisJMHgxMCwgMHhiOCwgMHg0MCwgMHg2YywKKwkweGMwLCAweDNlLCAweGNhLCAweDAwLAorCTB4NDAsIDB4YjgsIDB4MGMsIDB4NmMsCisJMHhiZiwgMHg2NSwgMHhjYSwgMHgwOCwKKwkweDIwLCAweGI4LCAweDIwLCAweDdjLAorCTB4MDEsIDB4NjUsIDB4MGMsIDB4MzAsCisJMHgwMCwgMHg2NSwgMHhkOCwgMHg1ZCwKKwkweGEwLCAweDNmLCAweDI4LCAweDY0LAorCTB4MjMsIDB4YjgsIDB4MGMsIDB4MDgsCisJMHgwMCwgMHg2NSwgMHhkOCwgMHg1ZCwKKwkweGEwLCAweDNmLCAweDI4LCAweDY0LAorCTB4MDAsIDB4YmIsIDB4MjAsIDB4NDQsCisJMHhmZiwgMHg2NSwgMHgyMCwgMHg2NCwKKwkweDAwLCAweDY1LCAweDQwLCAweDQ0LAorCTB4NDAsIDB4NmEsIDB4MTgsIDB4MDAsCisJMHgwMSwgMHg2NSwgMHgwYywgMHgzMCwKKwkweDAwLCAweDY1LCAweGQ4LCAweDVkLAorCTB4YTAsIDB4M2YsIDB4ZmMsIDB4NzMsCisJMHg0MCwgMHg2YSwgMHgxOCwgMHgwMCwKKwkweDAxLCAweDNhLCAweGE2LCAweDMwLAorCTB4MDgsIDB4NmEsIDB4NzQsIDB4MDAsCisJMHgwMCwgMHg2NSwgMHhjYywgMHg0MSwKKwkweDY0LCAweDZhLCAweDY4LCAweDVkLAorCTB4ODAsIDB4NjQsIDB4ZDgsIDB4NmMsCisJMHgwNCwgMHg2NCwgMHg5YSwgMHg3NCwKKwkweDAyLCAweDY0LCAweGFhLCAweDc0LAorCTB4MDAsIDB4NmEsIDB4NjAsIDB4NzQsCisJMHgwMywgMHg2NCwgMHhjOCwgMHg3NCwKKwkweDIzLCAweDY0LCAweDQ4LCAweDc0LAorCTB4MDgsIDB4NjQsIDB4NWMsIDB4NzQsCisJMHg2MSwgMHg2YSwgMHhkOCwgMHg1ZSwKKwkweDAwLCAweDY1LCAweGQ4LCAweDVkLAorCTB4MDgsIDB4NTEsIDB4Y2UsIDB4NzEsCisJMHgwMCwgMHg2NSwgMHg0MCwgMHg0NCwKKwkweDgwLCAweDA0LCAweDVhLCAweDdjLAorCTB4NTEsIDB4NmEsIDB4NWUsIDB4NWQsCisJMHgwMSwgMHg1MSwgMHg1YSwgMHg2NCwKKwkweDAxLCAweGE0LCAweDUyLCAweDdjLAorCTB4ODAsIDB4YmEsIDB4NWMsIDB4NmMsCisJMHg0MSwgMHg2YSwgMHhkOCwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDVjLCAweDQ0LAorCTB4MjEsIDB4NmEsIDB4ZDgsIDB4NWUsCisJMHgwMCwgMHg2NSwgMHg1YywgMHg0NCwKKwkweDA3LCAweDZhLCAweDU0LCAweDVkLAorCTB4MDEsIDB4MDYsIDB4ZDQsIDB4MzAsCisJMHgwMCwgMHg2NSwgMHhjYywgMHg0MSwKKwkweDgwLCAweGI4LCAweDU2LCAweDdjLAorCTB4YzAsIDB4M2MsIDB4NmEsIDB4N2MsCisJMHg4MCwgMHgzYywgMHg1NiwgMHg2YywKKwkweGZmLCAweGE4LCAweDZhLCAweDZjLAorCTB4NDAsIDB4M2MsIDB4NTYsIDB4NmMsCisJMHgxMCwgMHhiOCwgMHg2ZSwgMHg3YywKKwkweGExLCAweDZhLCAweGQ4LCAweDVlLAorCTB4MDEsIDB4YjQsIDB4NzQsIDB4NmMsCisJMHgwMiwgMHhiNCwgMHg3NiwgMHg2YywKKwkweDAxLCAweGE0LCAweDc2LCAweDdjLAorCTB4ZmYsIDB4YTgsIDB4ODYsIDB4N2MsCisJMHgwNCwgMHhiNCwgMHg2OCwgMHgwMSwKKwkweDAxLCAweDZhLCAweDc2LCAweDAwLAorCTB4MDAsIDB4YmIsIDB4MTIsIDB4NWUsCisJMHhmZiwgMHhhOCwgMHg4NiwgMHg3YywKKwkweDcxLCAweDZhLCAweGQ4LCAweDVlLAorCTB4NDAsIDB4NTEsIDB4ODYsIDB4NjQsCisJMHgwMCwgMHg2NSwgMHhiMiwgMHg1ZSwKKwkweDAwLCAweDY1LCAweGRlLCAweDQxLAorCTB4MDAsIDB4YmIsIDB4OGEsIDB4NWMsCisJMHgwMCwgMHg2NSwgMHhkZSwgMHg0MSwKKwkweDAwLCAweDY1LCAweGIyLCAweDVlLAorCTB4MDEsIDB4NjUsIDB4YTIsIDB4MzAsCisJMHgwMSwgMHhmOCwgMHhjOCwgMHgzMCwKKwkweDAxLCAweDRlLCAweGM4LCAweDMwLAorCTB4MDAsIDB4NmEsIDB4YjYsIDB4ZGQsCisJMHgwMCwgMHg1MSwgMHhjOCwgMHg1ZCwKKwkweDAxLCAweDRlLCAweDljLCAweDE4LAorCTB4MDIsIDB4NmEsIDB4MjIsIDB4MDUsCisJMHhjMCwgMHgzYywgMHg1NiwgMHg2YywKKwkweDA0LCAweGI4LCAweDcwLCAweDAxLAorCTB4MDAsIDB4NjUsIDB4ZDQsIDB4NWUsCisJMHgyMCwgMHhiOCwgMHhkZSwgMHg2OSwKKwkweDAxLCAweGJiLCAweGEyLCAweDMwLAorCTB4M2YsIDB4YmEsIDB4N2MsIDB4MDgsCisJMHgwMCwgMHhiOSwgMHhjZSwgMHg1YywKKwkweDAwLCAweDY1LCAweGRlLCAweDQxLAorCTB4MDEsIDB4MDYsIDB4ZDQsIDB4MzAsCisJMHgyMCwgMHgzYywgMHhjYywgMHg3OSwKKwkweDIwLCAweDNjLCAweDVjLCAweDdjLAorCTB4MDEsIDB4YTQsIDB4YjgsIDB4N2MsCisJMHgwMSwgMHhiNCwgMHg2OCwgMHgwMSwKKwkweDAwLCAweDY1LCAweGNjLCAweDQxLAorCTB4MDAsIDB4NjUsIDB4NWMsIDB4NDQsCisJMHgwNCwgMHgxNCwgMHg1OCwgMHgzMSwKKwkweDAxLCAweDA2LCAweGQ0LCAweDMwLAorCTB4MDgsIDB4YTAsIDB4NjAsIDB4MzEsCisJMHhhYywgMHg2YSwgMHhjYywgMHgwMCwKKwkweDE0LCAweDZhLCAweGY0LCAweDVkLAorCTB4MDEsIDB4MDYsIDB4ZDQsIDB4MzAsCisJMHhhMCwgMHg2YSwgMHhlYywgMHg1ZCwKKwkweDAwLCAweDY1LCAweGNjLCAweDQxLAorCTB4ZGYsIDB4M2MsIDB4NzgsIDB4MDgsCisJMHgxMiwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweDAwLCAweDY1LCAweDVjLCAweDQ0LAorCTB4NGMsIDB4NjUsIDB4Y2MsIDB4MjgsCisJMHgwMSwgMHgzZSwgMHgyMCwgMHgzMSwKKwkweGQwLCAweDY2LCAweGNjLCAweDE4LAorCTB4MjAsIDB4NjYsIDB4Y2MsIDB4MTgsCisJMHgwMSwgMHg1MSwgMHhkYSwgMHgzNCwKKwkweDRjLCAweDNkLCAweGNhLCAweDI4LAorCTB4M2YsIDB4NjQsIDB4N2MsIDB4MDgsCisJMHhkMCwgMHg2NSwgMHhjYSwgMHgxOCwKKwkweDAxLCAweDNlLCAweDIwLCAweDMxLAorCTB4MzAsIDB4NjUsIDB4ZDQsIDB4MTgsCisJMHgwMCwgMHg2NSwgMHhlNiwgMHg0YywKKwkweGUxLCAweDZhLCAweDIyLCAweDAxLAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MDgsCisJMHgyMCwgMHg2NSwgMHhkNCwgMHgxOCwKKwkweDAwLCAweDY1LCAweGVlLCAweDU0LAorCTB4ZTEsIDB4NmEsIDB4MjIsIDB4MDEsCisJMHhmZiwgMHg2YSwgMHhkNCwgMHgwOCwKKwkweDIwLCAweDY1LCAweGNhLCAweDE4LAorCTB4ZTAsIDB4NjUsIDB4ZDQsIDB4MTgsCisJMHgwMCwgMHg2NSwgMHhmOCwgMHg0YywKKwkweGUxLCAweDZhLCAweDIyLCAweDAxLAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MDgsCisJMHhkMCwgMHg2NSwgMHhkNCwgMHgxOCwKKwkweDAwLCAweDY1LCAweDAwLCAweDU1LAorCTB4ZTEsIDB4NmEsIDB4MjIsIDB4MDEsCisJMHhmZiwgMHg2YSwgMHhkNCwgMHgwOCwKKwkweDAxLCAweDZjLCAweGEyLCAweDMwLAorCTB4ZmYsIDB4NTEsIDB4MTIsIDB4NzUsCisJMHgwMCwgMHg1MSwgMHg4ZSwgMHg1ZCwKKwkweDAxLCAweDUxLCAweDIwLCAweDMxLAorCTB4MDAsIDB4NjUsIDB4MzQsIDB4NDUsCisJMHgzZiwgMHhiYSwgMHhjOCwgMHgwOCwKKwkweDAwLCAweDNlLCAweDM0LCAweDc1LAorCTB4MDAsIDB4NjUsIDB4YjAsIDB4NWUsCisJMHg4MCwgMHgzYywgMHg3OCwgMHgwMCwKKwkweDAxLCAweDA2LCAweGQ0LCAweDMwLAorCTB4MDAsIDB4NjUsIDB4ZDgsIDB4NWQsCisJMHgwMSwgMHgzYywgMHg3OCwgMHgwMCwKKwkweGUwLCAweDNmLCAweDUwLCAweDY1LAorCTB4MDIsIDB4M2MsIDB4NzgsIDB4MDAsCisJMHgyMCwgMHgxMiwgMHg1MCwgMHg2NSwKKwkweDUxLCAweDZhLCAweDVlLCAweDVkLAorCTB4MDAsIDB4NTEsIDB4OGUsIDB4NWQsCisJMHg1MSwgMHg2YSwgMHg1ZSwgMHg1ZCwKKwkweDAxLCAweDUxLCAweDIwLCAweDMxLAorCTB4MDQsIDB4M2MsIDB4NzgsIDB4MDAsCisJMHgwMSwgMHhiOSwgMHhjOCwgMHgzMCwKKwkweDAwLCAweDNkLCAweDRlLCAweDY1LAorCTB4MDgsIDB4M2MsIDB4NzgsIDB4MDAsCisJMHgzZiwgMHhiYSwgMHhjOCwgMHgwOCwKKwkweDAwLCAweDNlLCAweDRlLCAweDY1LAorCTB4MTAsIDB4M2MsIDB4NzgsIDB4MDAsCisJMHgwNCwgMHhiOCwgMHg0ZSwgMHg3ZCwKKwkweGZiLCAweGI4LCAweDcwLCAweDA5LAorCTB4MjAsIDB4YjgsIDB4NDQsIDB4NmQsCisJMHgwMSwgMHg5MCwgMHhjOCwgMHgzMCwKKwkweGZmLCAweDZhLCAweGEyLCAweDAwLAorCTB4MDAsIDB4M2QsIDB4Y2UsIDB4NWMsCisJMHgwMSwgMHg2NCwgMHgyMCwgMHgzMSwKKwkweGZmLCAweDZhLCAweDc4LCAweDA4LAorCTB4MDAsIDB4NjUsIDB4ZWEsIDB4NTgsCisJMHgxMCwgMHhiOCwgMHg1YywgMHg3YywKKwkweGZmLCAweDZhLCAweDU0LCAweDVkLAorCTB4MDAsIDB4NjUsIDB4NWMsIDB4NDQsCisJMHgwMCwgMHg2NSwgMHhiMCwgMHg1ZSwKKwkweDMxLCAweDZhLCAweGQ4LCAweDVlLAorCTB4MDAsIDB4NjUsIDB4NWMsIDB4NDQsCisJMHgxMCwgMHgzZiwgMHgwNiwgMHgwMCwKKwkweDEwLCAweDZhLCAweDA2LCAweDAwLAorCTB4MDEsIDB4NjUsIDB4NzQsIDB4MzQsCisJMHg4MSwgMHg2YSwgMHhkOCwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDYwLCAweDQ1LAorCTB4MDEsIDB4MDYsIDB4ZDQsIDB4MzAsCisJMHgwMSwgMHgwYywgMHg2MCwgMHg3ZCwKKwkweDA0LCAweDBjLCAweDVhLCAweDZkLAorCTB4ZTAsIDB4MDMsIDB4N2UsIDB4MDgsCisJMHhlMCwgMHgzZiwgMHhjYywgMHg2MSwKKwkweDAxLCAweDY1LCAweGNjLCAweDMwLAorCTB4MDEsIDB4MTIsIDB4ZGEsIDB4MzQsCisJMHgwMSwgMHgwNiwgMHhkNCwgMHgzNCwKKwkweDAxLCAweDAzLCAweDZlLCAweDZkLAorCTB4NDAsIDB4MDMsIDB4Y2MsIDB4MDgsCisJMHgwMSwgMHg2NSwgMHgwNiwgMHgzMCwKKwkweDQwLCAweDY1LCAweGM4LCAweDA4LAorCTB4MDAsIDB4NjYsIDB4N2MsIDB4NzUsCisJMHg0MCwgMHg2NSwgMHg3YywgMHg3ZCwKKwkweDAwLCAweDY1LCAweDdjLCAweDVkLAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MDgsCisJMHhmZiwgMHg2YSwgMHhkNCwgMHgwOCwKKwkweGZmLCAweDZhLCAweGQ0LCAweDA4LAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MGMsCisJMHgwOCwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweDAyLCAweDBiLCAweDg2LCAweDdkLAorCTB4MDEsIDB4NjUsIDB4MGMsIDB4MzAsCisJMHgwMiwgMHgwYiwgMHg4YSwgMHg3ZCwKKwkweGY3LCAweDAxLCAweDAyLCAweDBjLAorCTB4MDEsIDB4NjUsIDB4YzgsIDB4MzAsCisJMHhmZiwgMHg0MSwgMHhhZSwgMHg3NSwKKwkweDAxLCAweDQxLCAweDIwLCAweDMxLAorCTB4ZmYsIDB4NmEsIDB4YTQsIDB4MDAsCisJMHgwMCwgMHg2NSwgMHg5ZSwgMHg0NSwKKwkweGZmLCAweGJmLCAweGFlLCAweDc1LAorCTB4MDEsIDB4OTAsIDB4YTQsIDB4MzAsCisJMHgwMSwgMHhiZiwgMHgyMCwgMHgzMSwKKwkweDAwLCAweGJiLCAweDk4LCAweDY1LAorCTB4ZmYsIDB4NTIsIDB4YWMsIDB4NzUsCisJMHgwMSwgMHhiZiwgMHhjYywgMHgzMCwKKwkweDAxLCAweDkwLCAweGNhLCAweDMwLAorCTB4MDEsIDB4NTIsIDB4MjAsIDB4MzEsCisJMHgwMSwgMHg2NiwgMHg3ZSwgMHgzMSwKKwkweDAxLCAweDY1LCAweDIwLCAweDM1LAorCTB4MDEsIDB4YmYsIDB4ODIsIDB4MzQsCisJMHgwMSwgMHg2NCwgMHhhMiwgMHgzMCwKKwkweDAwLCAweDZhLCAweGMwLCAweDVlLAorCTB4MGQsIDB4NmEsIDB4NzYsIDB4MDAsCisJMHgwMCwgMHg1MSwgMHgxMiwgMHg0NiwKKwkweDAxLCAweDY1LCAweGE0LCAweDMwLAorCTB4ZTAsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHg0OCwgMHg2YSwgMHgwNiwgMHg1ZSwKKwkweDAxLCAweDZhLCAweGQwLCAweDAxLAorCTB4MDEsIDB4NmEsIDB4ZGMsIDB4MDUsCisJMHg4OCwgMHg2YSwgMHhjYywgMHgwMCwKKwkweDQ4LCAweDZhLCAweDA2LCAweDVlLAorCTB4MDEsIDB4NmEsIDB4ZTAsIDB4NWQsCisJMHgwMSwgMHg2YSwgMHgyNiwgMHgwNSwKKwkweDAxLCAweDY1LCAweGQ4LCAweDMxLAorCTB4MDksIDB4ZWUsIDB4ZGMsIDB4MDEsCisJMHg4MCwgMHhlZSwgMHhjYywgMHg3ZCwKKwkweGZmLCAweDZhLCAweGRjLCAweDBkLAorCTB4MDEsIDB4NjUsIDB4MzIsIDB4MzEsCisJMHgwYSwgMHg5MywgMHgyNiwgMHgwMSwKKwkweDAwLCAweDY1LCAweGE4LCAweDQ2LAorCTB4ODEsIDB4NmEsIDB4ZDgsIDB4NWUsCisJMHgwMSwgMHgwYywgMHhkOCwgMHg3ZCwKKwkweDA0LCAweDBjLCAweGQ2LCAweDZkLAorCTB4ZTAsIDB4MDMsIDB4MDYsIDB4MDgsCisJMHhlMCwgMHgwMywgMHg3ZSwgMHgwYywKKwkweDAxLCAweDY1LCAweDE4LCAweDMxLAorCTB4ZmYsIDB4NmEsIDB4MWEsIDB4MDksCisJMHhmZiwgMHg2YSwgMHgxYywgMHgwZCwKKwkweDAxLCAweDhjLCAweDEwLCAweDMwLAorCTB4MDEsIDB4OGQsIDB4MTIsIDB4MzAsCisJMHgwMSwgMHg4ZSwgMHgxNCwgMHgzNCwKKwkweDAxLCAweDZjLCAweGRhLCAweDMwLAorCTB4MDEsIDB4NmMsIDB4ZGEsIDB4MzAsCisJMHgwMSwgMHg2YywgMHhkYSwgMHgzMCwKKwkweDAxLCAweDZjLCAweGRhLCAweDMwLAorCTB4MDEsIDB4NmMsIDB4ZGEsIDB4MzAsCisJMHgwMSwgMHg2YywgMHhkYSwgMHgzMCwKKwkweDAxLCAweDZjLCAweGRhLCAweDMwLAorCTB4MDEsIDB4NmMsIDB4ZGEsIDB4MzQsCisJMHgzZCwgMHg2NCwgMHhhNCwgMHgyOCwKKwkweDU1LCAweDY0LCAweGM4LCAweDI4LAorCTB4MDAsIDB4NjUsIDB4MDYsIDB4NDYsCisJMHgyZSwgMHg2NCwgMHhhNCwgMHgyOCwKKwkweDY2LCAweDY0LCAweGM4LCAweDI4LAorCTB4MDAsIDB4NmMsIDB4ZGEsIDB4MTgsCisJMHgwMSwgMHg1MiwgMHhjOCwgMHgzMCwKKwkweDAwLCAweDZjLCAweGRhLCAweDIwLAorCTB4ZmYsIDB4NmEsIDB4YzgsIDB4MDgsCisJMHgwMCwgMHg2YywgMHhkYSwgMHgyMCwKKwkweDAwLCAweDZjLCAweGRhLCAweDI0LAorCTB4MDEsIDB4NjUsIDB4YzgsIDB4MzAsCisJMHhlMCwgMHg2YSwgMHhjYywgMHgwMCwKKwkweDQ0LCAweDZhLCAweDAyLCAweDVlLAorCTB4MDEsIDB4OTAsIDB4ZTIsIDB4MzEsCisJMHgwNCwgMHgzYiwgMHgyNiwgMHg3ZSwKKwkweDMwLCAweDZhLCAweGQwLCAweDAxLAorCTB4MjAsIDB4NmEsIDB4ZDAsIDB4MDEsCisJMHgxZCwgMHg2YSwgMHhkYywgMHgwMSwKKwkweGRjLCAweGVlLCAweDIyLCAweDY2LAorCTB4MDAsIDB4NjUsIDB4M2UsIDB4NDYsCisJMHgyMCwgMHg2YSwgMHhkMCwgMHgwMSwKKwkweDAxLCAweDZhLCAweGRjLCAweDAxLAorCTB4MjAsIDB4YTAsIDB4ZDgsIDB4MzEsCisJMHgwOSwgMHhlZSwgMHhkYywgMHgwMSwKKwkweDgwLCAweGVlLCAweDJlLCAweDdlLAorCTB4MTEsIDB4NmEsIDB4ZGMsIDB4MDEsCisJMHg1MCwgMHhlZSwgMHgzMiwgMHg2NiwKKwkweDIwLCAweDZhLCAweGQwLCAweDAxLAorCTB4MDksIDB4NmEsIDB4ZGMsIDB4MDEsCisJMHg4OCwgMHhlZSwgMHgzOCwgMHg2NiwKKwkweDE5LCAweDZhLCAweGRjLCAweDAxLAorCTB4ZDgsIDB4ZWUsIDB4M2MsIDB4NjYsCisJMHhmZiwgMHg2YSwgMHhkYywgMHgwOSwKKwkweDE4LCAweGVlLCAweDQwLCAweDZlLAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MGMsCisJMHg4OCwgMHg2YSwgMHhjYywgMHgwMCwKKwkweDQ0LCAweDZhLCAweDAyLCAweDVlLAorCTB4MjAsIDB4NmEsIDB4ZTAsIDB4NWQsCisJMHgwMSwgMHgzYiwgMHgyNiwgMHgzMSwKKwkweDA0LCAweDNiLCAweDVhLCAweDZlLAorCTB4YTAsIDB4NmEsIDB4Y2EsIDB4MDAsCisJMHgyMCwgMHg2NSwgMHhjOCwgMHgxOCwKKwkweDAwLCAweDY1LCAweDk4LCAweDVlLAorCTB4MDAsIDB4NjUsIDB4NTIsIDB4NjYsCisJMHgwYSwgMHg5MywgMHgyNiwgMHgwMSwKKwkweDAwLCAweDY1LCAweGE4LCAweDQ2LAorCTB4YTAsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHhmZiwgMHg2YSwgMHhjOCwgMHgwOCwKKwkweDIwLCAweDk0LCAweDVlLCAweDZlLAorCTB4MTAsIDB4OTQsIDB4NjAsIDB4NmUsCisJMHgwOCwgMHg5NCwgMHg3YSwgMHg2ZSwKKwkweDA4LCAweDk0LCAweDdhLCAweDZlLAorCTB4MDgsIDB4OTQsIDB4N2EsIDB4NmUsCisJMHhmZiwgMHg4YywgMHhjOCwgMHgxMCwKKwkweGMxLCAweDY0LCAweGM4LCAweDE4LAorCTB4ZjgsIDB4NjQsIDB4YzgsIDB4MDgsCisJMHgwMSwgMHg5OSwgMHhkYSwgMHgzMCwKKwkweDAwLCAweDY2LCAweDZlLCAweDY2LAorCTB4YzAsIDB4NjYsIDB4YWEsIDB4NzYsCisJMHg2MCwgMHg2NiwgMHhjOCwgMHgxOCwKKwkweDNkLCAweDY0LCAweGM4LCAweDI4LAorCTB4MDAsIDB4NjUsIDB4NWUsIDB4NDYsCisJMHhmNywgMHg5MywgMHgyNiwgMHgwOSwKKwkweDA4LCAweDkzLCAweDdjLCAweDZlLAorCTB4MDAsIDB4NjIsIDB4YzQsIDB4MTgsCisJMHgwMCwgMHg2NSwgMHhhOCwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDg4LCAweDVlLAorCTB4MDAsIDB4NjUsIDB4ODgsIDB4NWUsCisJMHgwMCwgMHg2NSwgMHg4OCwgMHg1ZSwKKwkweDAxLCAweDk5LCAweGRhLCAweDMwLAorCTB4MDEsIDB4OTksIDB4ZGEsIDB4MzAsCisJMHgwMSwgMHg5OSwgMHhkYSwgMHgzMCwKKwkweDAxLCAweDk5LCAweGRhLCAweDMwLAorCTB4MDEsIDB4OTksIDB4ZGEsIDB4MzAsCisJMHgwMSwgMHg5OSwgMHhkYSwgMHgzMCwKKwkweDAxLCAweDk5LCAweGRhLCAweDMwLAorCTB4MDEsIDB4OTksIDB4ZGEsIDB4MzQsCisJMHgwMSwgMHg2YywgMHgzMiwgMHgzMSwKKwkweDAxLCAweDZjLCAweDMyLCAweDMxLAorCTB4MDEsIDB4NmMsIDB4MzIsIDB4MzEsCisJMHgwMSwgMHg2YywgMHgzMiwgMHgzMSwKKwkweDAxLCAweDZjLCAweDMyLCAweDMxLAorCTB4MDEsIDB4NmMsIDB4MzIsIDB4MzEsCisJMHgwMSwgMHg2YywgMHgzMiwgMHgzMSwKKwkweDAxLCAweDZjLCAweDMyLCAweDM1LAorCTB4MDgsIDB4OTQsIDB4YTgsIDB4N2UsCisJMHhmNywgMHg5MywgMHgyNiwgMHgwOSwKKwkweDA4LCAweDkzLCAweGFjLCAweDZlLAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MGMsCisJMHgwNCwgMHhiOCwgMHhkNCwgMHg2ZSwKKwkweDAxLCAweDQyLCAweDdlLCAweDMxLAorCTB4ZmYsIDB4NmEsIDB4NzYsIDB4MDEsCisJMHgwMSwgMHg5MCwgMHg4NCwgMHgzNCwKKwkweGZmLCAweDZhLCAweDc2LCAweDA1LAorCTB4MDEsIDB4ODUsIDB4MGEsIDB4MDEsCisJMHg3ZiwgMHg2NSwgMHgxMCwgMHgwOSwKKwkweGZlLCAweDg1LCAweDBhLCAweDBkLAorCTB4ZmYsIDB4NDIsIDB4ZDAsIDB4NjYsCisJMHhmZiwgMHg0MSwgMHhjOCwgMHg2NiwKKwkweGQxLCAweDZhLCAweGQ4LCAweDVlLAorCTB4ZmYsIDB4NmEsIDB4Y2EsIDB4MDQsCisJMHgwMSwgMHg0MSwgMHgyMCwgMHgzMSwKKwkweDAxLCAweGJmLCAweDgyLCAweDMwLAorCTB4MDEsIDB4NmEsIDB4NzYsIDB4MDAsCisJMHgwMCwgMHhiYiwgMHgxMiwgMHg0NiwKKwkweDAxLCAweDQyLCAweDIwLCAweDMxLAorCTB4MDEsIDB4YmYsIDB4ODQsIDB4MzQsCisJMHgwMSwgMHg0MSwgMHg3ZSwgMHgzMSwKKwkweDAxLCAweDkwLCAweDgyLCAweDM0LAorCTB4MDEsIDB4NjUsIDB4MjIsIDB4MzEsCisJMHhmZiwgMHg2YSwgMHhkNCwgMHgwOCwKKwkweGZmLCAweDZhLCAweGQ0LCAweDBjCit9OworCit0eXBlZGVmIGludCBhaGNfcGF0Y2hfZnVuY190IChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworc3RhdGljIGFoY19wYXRjaF9mdW5jX3QgYWhjX3BhdGNoMjNfZnVuYzsKKworc3RhdGljIGludAorYWhjX3BhdGNoMjNfZnVuYyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJcmV0dXJuICgoYWhjLT5idWdzICYgQUhDX1NDQkNIQU5fVVBMT0FEX0JVRykgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDIyX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoY19wYXRjaDIyX2Z1bmMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pID09IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gyMV9mdW5jOworCitzdGF0aWMgaW50CithaGNfcGF0Y2gyMV9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpID09IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gyMF9mdW5jOworCitzdGF0aWMgaW50CithaGNfcGF0Y2gyMF9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZlYXR1cmVzICYgQUhDX1dJREUpICE9IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gxOV9mdW5jOworCitzdGF0aWMgaW50CithaGNfcGF0Y2gxOV9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZsYWdzICYgQUhDX1NDQl9CVFQpICE9IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gxOF9mdW5jOworCitzdGF0aWMgaW50CithaGNfcGF0Y2gxOF9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmJ1Z3MgJiBBSENfUENJXzJfMV9SRVRSWV9CVUcpICE9IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gxN19mdW5jOworCitzdGF0aWMgaW50CithaGNfcGF0Y2gxN19mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZsYWdzICYgQUhDX1RNT0RFX1dJREVPRERfQlVHKSAhPSAwKTsKK30KKworc3RhdGljIGFoY19wYXRjaF9mdW5jX3QgYWhjX3BhdGNoMTZfZnVuYzsKKworc3RhdGljIGludAorYWhjX3BhdGNoMTZfZnVuYyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJcmV0dXJuICgoYWhjLT5idWdzICYgQUhDX0FVVE9GTFVTSF9CVUcpICE9IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gxNV9mdW5jOworCitzdGF0aWMgaW50CithaGNfcGF0Y2gxNV9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgPT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDE0X2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoY19wYXRjaDE0X2Z1bmMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoKGFoYy0+YnVncyAmIEFIQ19QQ0lfTVdJX0JVRykgIT0gMCAmJiBhaGMtPnBjaV9jYWNoZXNpemUgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDEzX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoY19wYXRjaDEzX2Z1bmMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoKGFoYy0+ZmxhZ3MgJiBBSENfMzlCSVRfQUREUkVTU0lORykgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDEyX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoY19wYXRjaDEyX2Z1bmMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfSFNfTUFJTEJPWCkgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDExX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoY19wYXRjaDExX2Z1bmMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEpICE9IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gxMF9mdW5jOworCitzdGF0aWMgaW50CithaGNfcGF0Y2gxMF9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZlYXR1cmVzICYgQUhDX01VTFRJX1RJRCkgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDlfZnVuYzsKKworc3RhdGljIGludAorYWhjX3BhdGNoOV9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKTsKK30KKworc3RhdGljIGFoY19wYXRjaF9mdW5jX3QgYWhjX3BhdGNoOF9mdW5jOworCitzdGF0aWMgaW50CithaGNfcGF0Y2g4X2Z1bmMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoKGFoYy0+ZmxhZ3MgJiBBSENfSU5JVElBVE9SUk9MRSkgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDdfZnVuYzsKKworc3RhdGljIGludAorYWhjX3BhdGNoN19mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZsYWdzICYgQUhDX1RBUkdFVFJPTEUpICE9IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2g2X2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoY19wYXRjaDZfZnVuYyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJcmV0dXJuICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgPT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDVfZnVuYzsKKworc3RhdGljIGludAorYWhjX3BhdGNoNV9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZsYWdzICYgQUhDX1NFUVVFTkNFUl9ERUJVRykgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDRfZnVuYzsKKworc3RhdGljIGludAorYWhjX3BhdGNoNF9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKTsKK30KKworc3RhdGljIGFoY19wYXRjaF9mdW5jX3QgYWhjX3BhdGNoM19mdW5jOworCitzdGF0aWMgaW50CithaGNfcGF0Y2gzX2Z1bmMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfUVVFVUVfUkVHUykgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDJfZnVuYzsKKworc3RhdGljIGludAorYWhjX3BhdGNoMl9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pICE9IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gxX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoY19wYXRjaDFfZnVuYyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJcmV0dXJuICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gwX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoY19wYXRjaDBfZnVuYyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHN0cnVjdCBwYXRjaCB7CisJYWhjX3BhdGNoX2Z1bmNfdAkJKnBhdGNoX2Z1bmM7CisJdWludDMyX3QJCSBiZWdpbgkJOjEwLAorCQkJCSBza2lwX2luc3RyCToxMCwKKwkJCQkgc2tpcF9wYXRjaAk6MTI7Cit9IHBhdGNoZXNbXSA9IHsKKwl7IGFoY19wYXRjaDFfZnVuYywgNCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMl9mdW5jLCA2LCAyLCAxIH0sCisJeyBhaGNfcGF0Y2gyX2Z1bmMsIDksIDEsIDEgfSwKKwl7IGFoY19wYXRjaDNfZnVuYywgMTEsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMTIsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDRfZnVuYywgMTUsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMTYsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDVfZnVuYywgMjIsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDNfZnVuYywgMjcsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMjgsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDZfZnVuYywgMzQsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDdfZnVuYywgMzcsIDU0LCAxOSB9LAorCXsgYWhjX3BhdGNoOF9mdW5jLCAzNywgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA0MiwgMywgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0NSwgMywgMSB9LAorCXsgYWhjX3BhdGNoMTBfZnVuYywgNDksIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNTAsIDIsIDMgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgNTAsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNTEsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDJfZnVuYywgNTMsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNTUsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNTYsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNjAsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNjEsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNzEsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNzIsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNzUsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNzYsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNzksIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgODAsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDhfZnVuYywgOTEsIDksIDQgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgOTMsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgOTQsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDJfZnVuYywgOTYsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDJfZnVuYywgMTA1LCA0LCAxIH0sCisJeyBhaGNfcGF0Y2gxX2Z1bmMsIDEwOSwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCAxMTAsIDIsIDMgfSwKKwl7IGFoY19wYXRjaDJfZnVuYywgMTEwLCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDExMSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoN19mdW5jLCAxMTIsIDQsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMTE2LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxMV9mdW5jLCAxMTcsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgMTE5LCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDEyMCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoN19mdW5jLCAxMjEsIDQsIDEgfSwKKwl7IGFoY19wYXRjaDdfZnVuYywgMTMxLCA5NSwgMTEgfSwKKwl7IGFoY19wYXRjaDRfZnVuYywgMTUxLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxX2Z1bmMsIDE2OCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMTJfZnVuYywgMTczLCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDE3NCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCAxODUsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMTg2LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDE5NSwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCAxOTYsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgMjEyLCA2LCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDIxOCwgNiwgMSB9LAorCXsgYWhjX3BhdGNoOF9mdW5jLCAyMjYsIDIwLCAyIH0sCisJeyBhaGNfcGF0Y2gxX2Z1bmMsIDI0MSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMV9mdW5jLCAyNDgsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMjQ5LCAyLCAyIH0sCisJeyBhaGNfcGF0Y2gxMV9mdW5jLCAyNTAsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgMjU4LCAyNywgMyB9LAorCXsgYWhjX3BhdGNoMV9mdW5jLCAyNzQsIDEwLCAyIH0sCisJeyBhaGNfcGF0Y2gxM19mdW5jLCAyNzcsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE0X2Z1bmMsIDI4NSwgMTQsIDEgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgMzAxLCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDMwMiwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCAzMDUsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDEzX2Z1bmMsIDMxMCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCAzMTEsIDIsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMzEzLCA0LCAxIH0sCisJeyBhaGNfcGF0Y2gxNF9mdW5jLCAzMTcsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE1X2Z1bmMsIDMxOSwgMiwgMyB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCAzMTksIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMzIwLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g2X2Z1bmMsIDMyNSwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCAzMjYsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgMzMwLCA0NywgMTEgfSwKKwl7IGFoY19wYXRjaDZfZnVuYywgMzM3LCAyLCA0IH0sCisJeyBhaGNfcGF0Y2g3X2Z1bmMsIDMzNywgMSwgMSB9LAorCXsgYWhjX3BhdGNoOF9mdW5jLCAzMzgsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMzM5LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxNl9mdW5jLCAzNDAsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDZfZnVuYywgMzU2LCA2LCAzIH0sCisJeyBhaGNfcGF0Y2gxNl9mdW5jLCAzNTYsIDUsIDEgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMzYyLCA3LCAxIH0sCisJeyBhaGNfcGF0Y2gxM19mdW5jLCAzNzIsIDUsIDEgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMzc3LCA1MiwgMTcgfSwKKwl7IGFoY19wYXRjaDE0X2Z1bmMsIDM3NywgMSwgMSB9LAorCXsgYWhjX3BhdGNoN19mdW5jLCAzNzksIDIsIDIgfSwKKwl7IGFoY19wYXRjaDE3X2Z1bmMsIDM4MCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCAzODMsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE4X2Z1bmMsIDM5MCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMTRfZnVuYywgMzk1LCA5LCAzIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDM5NiwgMywgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCAzOTksIDMsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNDA3LCA2LCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDQxMywgOSwgMiB9LAorCXsgYWhjX3BhdGNoMTNfZnVuYywgNDEzLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxM19mdW5jLCA0MjIsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDE0X2Z1bmMsIDQyNCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA0MjYsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDI3LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g3X2Z1bmMsIDQyOCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoN19mdW5jLCA0MjksIDEsIDEgfSwKKwl7IGFoY19wYXRjaDhfZnVuYywgNDMwLCAzLCAzIH0sCisJeyBhaGNfcGF0Y2g2X2Z1bmMsIDQzMSwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0MzIsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNDMzLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxNV9mdW5jLCA0MzQsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDEzX2Z1bmMsIDQzNCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMTRfZnVuYywgNDM2LCA5LCA0IH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDQzNiwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA0NDMsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDQ1LCA0LCAzIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDQ0NSwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0NDYsIDMsIDEgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgNDUwLCAyLCAxIH0sCisJeyBhaGNfcGF0Y2g3X2Z1bmMsIDQ1MiwgMTAsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDYyLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g4X2Z1bmMsIDQ2MywgMTE4LCAyMiB9LAorCXsgYWhjX3BhdGNoMV9mdW5jLCA0NjUsIDMsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDY4LCA1LCAzIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDQ2OCwgMiwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0NzAsIDMsIDEgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgNDc1LCAyLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDQ3NywgNiwgMyB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA0NzcsIDIsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDc5LCAzLCAxIH0sCisJeyBhaGNfcGF0Y2gxX2Z1bmMsIDQ4NSwgMiwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0ODcsIDksIDcgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNDg3LCA1LCA2IH0sCisJeyBhaGNfcGF0Y2gxOV9mdW5jLCA0ODcsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDg4LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxOV9mdW5jLCA0OTAsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDkxLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDQ5MiwgNCwgMSB9LAorCXsgYWhjX3BhdGNoNl9mdW5jLCA0OTcsIDMsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNTAwLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g2X2Z1bmMsIDUxMCwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA1MTEsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDIwX2Z1bmMsIDU0OCwgNywgMSB9LAorCXsgYWhjX3BhdGNoM19mdW5jLCA1ODMsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNTg0LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gyMV9mdW5jLCA1ODcsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDhfZnVuYywgNTg5LCAxMDYsIDMzIH0sCisJeyBhaGNfcGF0Y2g0X2Z1bmMsIDU5MSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMV9mdW5jLCA1OTcsIDIsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNTk5LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxX2Z1bmMsIDYwMiwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA2MDMsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNjA0LCAzLCAzIH0sCisJeyBhaGNfcGF0Y2gxNV9mdW5jLCA2MDUsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNjA3LCA0LCAxIH0sCisJeyBhaGNfcGF0Y2gxOV9mdW5jLCA2MTYsIDIsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNjE4LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxOV9mdW5jLCA2MjIsIDEwLCAzIH0sCisJeyBhaGNfcGF0Y2g1X2Z1bmMsIDYyNCwgOCwgMSB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA2MzIsIDksIDIgfSwKKwl7IGFoY19wYXRjaDVfZnVuYywgNjMzLCA4LCAxIH0sCisJeyBhaGNfcGF0Y2g0X2Z1bmMsIDY0MywgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA2NDQsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE5X2Z1bmMsIDY0NSwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA2NDYsIDMsIDIgfSwKKwl7IGFoY19wYXRjaDRfZnVuYywgNjQ4LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g1X2Z1bmMsIDY0OSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoNV9mdW5jLCA2NTIsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDVfZnVuYywgNjU0LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g0X2Z1bmMsIDY1NiwgMiwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA2NTgsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDVfZnVuYywgNjYwLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g1X2Z1bmMsIDY2MywgMSwgMSB9LAorCXsgYWhjX3BhdGNoNV9mdW5jLCA2NjYsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE5X2Z1bmMsIDY3MCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMTlfZnVuYywgNjczLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g0X2Z1bmMsIDY3OSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoNl9mdW5jLCA2ODIsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNjgzLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g3X2Z1bmMsIDY5NSwgMTYsIDEgfSwKKwl7IGFoY19wYXRjaDRfZnVuYywgNzExLCAyMCwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA3MzIsIDQsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNzM2LCA0LCAxIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDc0MCwgNCwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA3NDQsIDMsIDEgfSwKKwl7IGFoY19wYXRjaDZfZnVuYywgNzUwLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gyMl9mdW5jLCA3NTIsIDE0LCAxIH0sCisJeyBhaGNfcGF0Y2g3X2Z1bmMsIDc2NiwgMywgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA3NzgsIDI0LCA4IH0sCisJeyBhaGNfcGF0Y2gxOV9mdW5jLCA3ODIsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNzgzLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxNV9mdW5jLCA3ODgsIDQsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNzkyLCA3LCAzIH0sCisJeyBhaGNfcGF0Y2gyM19mdW5jLCA3OTIsIDUsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNzk3LCAyLCAxIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDgwMiwgNDIsIDMgfSwKKwl7IGFoY19wYXRjaDE4X2Z1bmMsIDgxNCwgMTgsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgODMyLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g0X2Z1bmMsIDg1NiwgMSwgMSB9LAorCXsgYWhjX3BhdGNoNF9mdW5jLCA4NTcsIDMsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgODYwLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxM19mdW5jLCA4NjEsIDMsIDEgfSwKKwl7IGFoY19wYXRjaDRfZnVuYywgODY0LCAxMiwgMSB9Cit9OworCitzdGF0aWMgc3RydWN0IGNzIHsKKwl1aW50MTZfdAliZWdpbjsKKwl1aW50MTZfdAllbmQ7Cit9IGNyaXRpY2FsX3NlY3Rpb25zW10gPSB7CisJeyAxMSwgMTggfSwKKwl7IDIxLCAzMCB9LAorCXsgNzExLCA3MjcgfSwKKwl7IDg1NywgODYwIH0sCisJeyA4NjQsIDg3MCB9LAorCXsgODcyLCA4NzQgfSwKKwl7IDg3NCwgODc2IH0KK307CisKK3N0YXRpYyBjb25zdCBpbnQgbnVtX2NyaXRpY2FsX3NlY3Rpb25zID0gc2l6ZW9mKGNyaXRpY2FsX3NlY3Rpb25zKQorCQkJCSAgICAgICAvIHNpemVvZigqY3JpdGljYWxfc2VjdGlvbnMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOTFmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWNhc20vTWFrZWZpbGUKQEAgLTAsMCArMSw3OCBAQAorUFJPRz0JYWljYXNtCisKKy5TVUZGSVhFUz0gLmwgLnkgLmMgLmgKKworQ1NSQ1M9CWFpY2FzbS5jIGFpY2FzbV9zeW1ib2wuYworWVNSQ1M9CWFpY2FzbV9ncmFtLnkgYWljYXNtX21hY3JvX2dyYW0ueQorTFNSQ1M9CWFpY2FzbV9zY2FuLmwgYWljYXNtX21hY3JvX3NjYW4ubAorCitHRU5IRFJTPQlhaWNkYi5oICQoWVNSQ1M6Lnk9LmgpCitHRU5TUkNTPQkkKFlTUkNTOi55PS5jKSAkKExTUkNTOi5sPS5jKQorCitTUkNTPQkke0NTUkNTfSAke0dFTlNSQ1N9CitMSUJTPQktbGRiCitjbGVhbi1maWxlczo9ICR7R0VOU1JDU30gJHtHRU5IRFJTfSAkKFlTUkNTOi55PS5vdXRwdXQpICQoUFJPRykKKyMgT3ZlcnJpZGUgZGVmYXVsdCBrZXJuZWwgQ0ZMQUdTLiAgVGhpcyBpcyBhIHVzZXJsYW5kIGFwcC4KK0FJQ0FTTV9DRkxBR1M6PSAtSS91c3IvaW5jbHVkZSAtSS4KK1lGTEFHUz0gLWQKKworTk9NQU49CW5vbWFuCisKK2lmbmVxICgkKEhPU1RDQyksKQorQUlDQVNNX0NDPSAkKEhPU1RDQykKK2Vsc2UKK0FJQ0FTTV9DQz0gJChDQykKK2VuZGlmCisKK2lmZGVmIERFQlVHCitDRkxBR1MrPSAtRERFQlVHIC1nCitZRkxBR1MrPSAtdCAtdgorTEZMQUdTPSAtZAorZW5kaWYKKworJChQUk9HKTogICR7R0VOSERSU30gJChTUkNTKQorCSQoQUlDQVNNX0NDKSAkKEFJQ0FTTV9DRkxBR1MpICQoU1JDUykgLW8gJChQUk9HKSAkKExJQlMpCisKK2FpY2RiLmg6CisJQGlmIFsgLWUgIi91c3IvaW5jbHVkZS9kYjQvZGJfMTg1LmgiIF07IHRoZW4JCVwKKwkJZWNobyAiI2luY2x1ZGUgPGRiNC9kYl8xODUuaD4iID4gYWljZGIuaDsJXAorCSBlbGlmIFsgLWUgIi91c3IvaW5jbHVkZS9kYjMvZGJfMTg1LmgiIF07IHRoZW4JCVwKKwkJZWNobyAiI2luY2x1ZGUgPGRiMy9kYl8xODUuaD4iID4gYWljZGIuaDsJXAorCSBlbGlmIFsgLWUgIi91c3IvaW5jbHVkZS9kYjIvZGJfMTg1LmgiIF07IHRoZW4JCVwKKwkJZWNobyAiI2luY2x1ZGUgPGRiMi9kYl8xODUuaD4iID4gYWljZGIuaDsJXAorCSBlbGlmIFsgLWUgIi91c3IvaW5jbHVkZS9kYjEvZGJfMTg1LmgiIF07IHRoZW4JCVwKKwkJZWNobyAiI2luY2x1ZGUgPGRiMS9kYl8xODUuaD4iID4gYWljZGIuaDsJXAorCSBlbGlmIFsgLWUgIi91c3IvaW5jbHVkZS9kYi9kYl8xODUuaCIgXTsgdGhlbgkJXAorCQllY2hvICIjaW5jbHVkZSA8ZGIvZGJfMTg1Lmg+IiA+IGFpY2RiLmg7CVwKKwkgZWxpZiBbIC1lICIvdXNyL2luY2x1ZGUvZGJfMTg1LmgiIF07IHRoZW4JCVwKKwkJZWNobyAiI2luY2x1ZGUgPGRiXzE4NS5oPiIgPiBhaWNkYi5oOwkJXAorCSBlbHNlCQkJCQkJCVwKKwkJZWNobyAiKioqIEluc3RhbGwgZGIgZGV2ZWxvcG1lbnQgbGlicmFyaWVzIjsJXAorCSBmaQorCitjbGVhbjoKKwlybSAtZiAkKGNsZWFuLWZpbGVzKQorCisjIENyZWF0ZSBhIGRlcGVuZGVuY3kgY2hhaW4gaW4gZ2VuZXJhdGVkIGZpbGVzCisjIHRvIGF2b2lkIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMgb2YgdGhlIHNpbmdsZQorIyBydWxlIHRoYXQgYnVpbGRzIHRoZW0gYWxsLgorYWljYXNtX2dyYW0uYzogYWljYXNtX2dyYW0uaAorYWljYXNtX2dyYW0uYyBhaWNhc21fZ3JhbS5oOiBhaWNhc21fZ3JhbS55CisJJChZQUNDKSAkKFlGTEFHUykgLWIgJCg8Oi55PSkgJDwKKwltdiAkKDw6Lnk9KS50YWIuYyAkKDw6Lnk9LmMpCisJbXYgJCg8Oi55PSkudGFiLmggJCg8Oi55PS5oKQorCisjIENyZWF0ZSBhIGRlcGVuZGVuY3kgY2hhaW4gaW4gZ2VuZXJhdGVkIGZpbGVzCisjIHRvIGF2b2lkIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMgb2YgdGhlIHNpbmdsZQorIyBydWxlIHRoYXQgYnVpbGRzIHRoZW0gYWxsLgorYWljYXNtX21hY3JvX2dyYW0uYzogYWljYXNtX21hY3JvX2dyYW0uaAorYWljYXNtX21hY3JvX2dyYW0uYyBhaWNhc21fbWFjcm9fZ3JhbS5oOiBhaWNhc21fbWFjcm9fZ3JhbS55CisJJChZQUNDKSAkKFlGTEFHUykgLWIgJCg8Oi55PSkgLXAgbW0gJDwKKwltdiAkKDw6Lnk9KS50YWIuYyAkKDw6Lnk9LmMpCisJbXYgJCg8Oi55PSkudGFiLmggJCg8Oi55PS5oKQorCithaWNhc21fc2Nhbi5jOiBhaWNhc21fc2Nhbi5sCisJJChMRVgpICQoTEZMQUdTKSAtbyRAICQ8CisKK2FpY2FzbV9tYWNyb19zY2FuLmM6IGFpY2FzbV9tYWNyb19zY2FuLmwKKwkkKExFWCkgJChMRkxBR1MpIC1QbW0gLW8kQCAkPApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNDYzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWNhc20vYWljYXNtLmMKQEAgLTAsMCArMSw4MzUgQEAKKy8qCisgKiBBaWM3eHh4IFNDU0kgaG9zdCBhZGFwdGVyIGZpcm13YXJlIGFzc3NlbWJsZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTgsIDIwMDAsIDIwMDEgSnVzdGluIFQuIEdpYmJzLgorICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyIEFkYXB0ZWMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICoKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljYXNtL2FpY2FzbS5jIzIyICQKKyAqCisgKiAkRnJlZUJTRCQKKyAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8cmVnZXguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5c2V4aXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZiBsaW51eAorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2Vsc2UKKyNpbmNsdWRlIDxtYWNoaW5lL2VuZGlhbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJhaWNhc20uaCIKKyNpbmNsdWRlICJhaWNhc21fc3ltYm9sLmgiCisjaW5jbHVkZSAiYWljYXNtX2luc2Zvcm1hdC5oIgorCit0eXBlZGVmIHN0cnVjdCBwYXRjaCB7CisJU1RBSUxRX0VOVFJZKHBhdGNoKSBsaW5rczsKKwlpbnQJCXBhdGNoX2Z1bmM7CisJdV9pbnQJCWJlZ2luOworCXVfaW50CQlza2lwX2luc3RyOworCXVfaW50CQlza2lwX3BhdGNoOworfSBwYXRjaF90OworCitTVEFJTFFfSEVBRChwYXRjaF9saXN0LCBwYXRjaCkgcGF0Y2hlczsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCk7CitzdGF0aWMgdm9pZCBiYWNrX3BhdGNoKHZvaWQpOworc3RhdGljIHZvaWQgb3V0cHV0X2NvZGUodm9pZCk7CitzdGF0aWMgdm9pZCBvdXRwdXRfbGlzdGluZyhjaGFyICppZmlsZW5hbWUpOworc3RhdGljIHZvaWQgZHVtcF9zY29wZShzY29wZV90ICpzY29wZSk7CitzdGF0aWMgdm9pZCBlbWl0X3BhdGNoKHNjb3BlX3QgKnNjb3BlLCBpbnQgcGF0Y2gpOworc3RhdGljIGludCBjaGVja19wYXRjaChwYXRjaF90ICoqc3RhcnRfcGF0Y2gsIGludCBzdGFydF9pbnN0ciwKKwkJICAgICAgIGludCAqc2tpcF9hZGRyLCBpbnQgKmZ1bmNfdmFscyk7CisKK3N0cnVjdCBwYXRoX2xpc3Qgc2VhcmNoX3BhdGg7CitpbnQgaW5jbHVkZXNfc2VhcmNoX2N1cmRpcjsKK2NoYXIgKmFwcG5hbWU7CitjaGFyICpzdG9ja19pbmNsdWRlX2ZpbGU7CitGSUxFICpvZmlsZTsKK2NoYXIgKm9maWxlbmFtZTsKK2NoYXIgKnJlZ2ZpbGVuYW1lOworRklMRSAqcmVnZmlsZTsKK2NoYXIgKmxpc3RmaWxlbmFtZTsKK0ZJTEUgKmxpc3RmaWxlOworY2hhciAqcmVnZGlhZ2ZpbGVuYW1lOworRklMRSAqcmVnZGlhZ2ZpbGU7CitpbnQgICBzcmNfbW9kZTsKK2ludCAgIGRzdF9tb2RlOworCitzdGF0aWMgU1RBSUxRX0hFQUQoLGluc3RydWN0aW9uKSBzZXFfcHJvZ3JhbTsKK3N0cnVjdCBjc190YWlscSBjc190YWlscTsKK3N0cnVjdCBzY29wZV9saXN0IHNjb3BlX3N0YWNrOworc3ltbGlzdF90IHBhdGNoX2Z1bmN0aW9uczsKKworI2lmIERFQlVHCitleHRlcm4gaW50IHl5X2ZsZXhfZGVidWc7CitleHRlcm4gaW50IG1tX2ZsZXhfZGVidWc7CitleHRlcm4gaW50IHl5ZGVidWc7CitleHRlcm4gaW50IG1tZGVidWc7CisjZW5kaWYKK2V4dGVybiBGSUxFICp5eWluOworZXh0ZXJuIGludCB5eXBhcnNlKHZvaWQpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKTsKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKwlleHRlcm4gaW50IG9wdGluZDsKKwlpbnQgIGNoOworCWludCAgcmV0dmFsOworCWNoYXIgKmlucHV0ZmlsZW5hbWU7CisJc2NvcGVfdCAqc2VudGluYWw7CisKKwlTVEFJTFFfSU5JVCgmcGF0Y2hlcyk7CisJU0xJU1RfSU5JVCgmc2VhcmNoX3BhdGgpOworCVNUQUlMUV9JTklUKCZzZXFfcHJvZ3JhbSk7CisJVEFJTFFfSU5JVCgmY3NfdGFpbHEpOworCVNMSVNUX0lOSVQoJnNjb3BlX3N0YWNrKTsKKworCS8qIFNldCBTZW50aW5hbCBzY29wZSBub2RlICovCisJc2VudGluYWwgPSBzY29wZV9hbGxvYygpOworCXNlbnRpbmFsLT50eXBlID0gU0NPUEVfUk9PVDsKKwkKKwlpbmNsdWRlc19zZWFyY2hfY3VyZGlyID0gMTsKKwlhcHBuYW1lID0gKmFyZ3Y7CisJcmVnZmlsZSA9IE5VTEw7CisJbGlzdGZpbGUgPSBOVUxMOworI2lmIERFQlVHCisJeXlfZmxleF9kZWJ1ZyA9IDA7CisJbW1fZmxleF9kZWJ1ZyA9IDA7CisJeXlkZWJ1ZyA9IDA7CisJbW1kZWJ1ZyA9IDA7CisjZW5kaWYKKwl3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJkOmk6bDpuOm86cDpyOkk6IikpICE9IC0xKSB7CisJCXN3aXRjaChjaCkgeworCQljYXNlICdkJzoKKyNpZiBERUJVRworCQkJaWYgKHN0cmNtcChvcHRhcmcsICJzIikgPT0gMCkgeworCQkJCXl5X2ZsZXhfZGVidWcgPSAxOworCQkJCW1tX2ZsZXhfZGVidWcgPSAxOworCQkJfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAicCIpID09IDApIHsKKwkJCQl5eWRlYnVnID0gMTsKKwkJCQltbWRlYnVnID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIlczogLWQgUmVxdWlyZXMgZWl0aGVyIGFuICIKKwkJCQkJIidzJyBvciAncCcgYXJndW1lbnRcbiIsIGFwcG5hbWUpOworCQkJCXVzYWdlKCk7CisJCQl9CisjZWxzZQorCQkJc3RvcCgiLWQ6IEFzc2VtYmxlciBub3QgYnVpbHQgd2l0aCBkZWJ1Z2dpbmcgIgorCQkJICAgICAiaW5mb3JtYXRpb24iLCBFWF9TT0ZUV0FSRSk7CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCXN0b2NrX2luY2x1ZGVfZmlsZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCS8qIENyZWF0ZSBhIHByb2dyYW0gbGlzdGluZyAqLworCQkJaWYgKChsaXN0ZmlsZSA9IGZvcGVuKG9wdGFyZywgInciKSkgPT0gTlVMTCkgeworCQkJCXBlcnJvcihvcHRhcmcpOworCQkJCXN0b3AoTlVMTCwgRVhfQ0FOVENSRUFUKTsKKwkJCX0KKwkJCWxpc3RmaWxlbmFtZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCS8qIERvbid0IGNvbXBsYWluIGFib3V0IHRoZSAtbm9zdGRpbmMgZGlyZWN0cml2ZSAqLworCQkJaWYgKHN0cmNtcChvcHRhcmcsICJvc3RkaW5jIikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBVbmtub3duIG9wdGlvbiAtJWMlc1xuIiwKKwkJCQkJYXBwbmFtZSwgY2gsIG9wdGFyZyk7CisJCQkJdXNhZ2UoKTsKKwkJCQkvKiBOT1RSRUFDSEVEICovCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnbyc6CisJCQlpZiAoKG9maWxlID0gZm9wZW4ob3B0YXJnLCAidyIpKSA9PSBOVUxMKSB7CisJCQkJcGVycm9yKG9wdGFyZyk7CisJCQkJc3RvcChOVUxMLCBFWF9DQU5UQ1JFQVQpOworCQkJfQorCQkJb2ZpbGVuYW1lID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJLyogQ3JlYXRlIFJlZ2lzdGVyIERpYWdub3N0aWMgInByaW50aW5nIiBGdW5jdGlvbnMgKi8KKwkJCWlmICgocmVnZGlhZ2ZpbGUgPSBmb3BlbihvcHRhcmcsICJ3IikpID09IE5VTEwpIHsKKwkJCQlwZXJyb3Iob3B0YXJnKTsKKwkJCQlzdG9wKE5VTEwsIEVYX0NBTlRDUkVBVCk7CisJCQl9CisJCQlyZWdkaWFnZmlsZW5hbWUgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlpZiAoKHJlZ2ZpbGUgPSBmb3BlbihvcHRhcmcsICJ3IikpID09IE5VTEwpIHsKKwkJCQlwZXJyb3Iob3B0YXJnKTsKKwkJCQlzdG9wKE5VTEwsIEVYX0NBTlRDUkVBVCk7CisJCQl9CisJCQlyZWdmaWxlbmFtZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdJJzoKKwkJeworCQkJcGF0aF9lbnRyeV90IGluY2x1ZGVfZGlyOworCisJCQlpZiAoc3RyY21wKG9wdGFyZywgIi0iKSA9PSAwKSB7CisJCQkJaWYgKGluY2x1ZGVzX3NlYXJjaF9jdXJkaXIgPT0gMCkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBXYXJuaW5nIC0gJy1JLScgIgorCQkJCQkJCSJzcGVjaWZpZWQgbXVsdGlwbGUgIgorCQkJCQkJCSJ0aW1lc1xuIiwgYXBwbmFtZSk7CisJCQkJfQorCQkJCWluY2x1ZGVzX3NlYXJjaF9jdXJkaXIgPSAwOworCQkJCWZvciAoaW5jbHVkZV9kaXIgPSBTTElTVF9GSVJTVCgmc2VhcmNoX3BhdGgpOworCQkJCSAgICAgaW5jbHVkZV9kaXIgIT0gTlVMTDsKKwkJCQkgICAgIGluY2x1ZGVfZGlyID0gU0xJU1RfTkVYVChpbmNsdWRlX2RpciwKKwkJCQkJCQkgICAgICBsaW5rcykpCisJCQkJCS8qCisJCQkJCSAqIEFsbCBlbnRyaWVzIGJlZm9yZSBhICctSS0nIG9ubHkKKwkJCQkJICogYXBwbHkgdG8gaW5jbHVkZXMgc3BlY2lmaWVkIHdpdGgKKwkJCQkJICogcXVvdGVzIGluc3RlYWQgb2YgIjw+Ii4KKwkJCQkJICovCisJCQkJCWluY2x1ZGVfZGlyLT5xdW90ZWRfaW5jbHVkZXNfb25seSA9IDE7CisJCQl9IGVsc2UgeworCQkJCWluY2x1ZGVfZGlyID0KKwkJCQkgICAgKHBhdGhfZW50cnlfdCltYWxsb2Moc2l6ZW9mKCppbmNsdWRlX2RpcikpOworCQkJCWlmIChpbmNsdWRlX2RpciA9PSBOVUxMKSB7CisJCQkJCXBlcnJvcihvcHRhcmcpOworCQkJCQlzdG9wKE5VTEwsIEVYX09TRVJSKTsKKwkJCQl9CisJCQkJaW5jbHVkZV9kaXItPmRpcmVjdG9yeSA9IHN0cmR1cChvcHRhcmcpOworCQkJCWlmIChpbmNsdWRlX2Rpci0+ZGlyZWN0b3J5ID09IE5VTEwpIHsKKwkJCQkJcGVycm9yKG9wdGFyZyk7CisJCQkJCXN0b3AoTlVMTCwgRVhfT1NFUlIpOworCQkJCX0KKwkJCQlpbmNsdWRlX2Rpci0+cXVvdGVkX2luY2x1ZGVzX29ubHkgPSAwOworCQkJCVNMSVNUX0lOU0VSVF9IRUFEKCZzZWFyY2hfcGF0aCwgaW5jbHVkZV9kaXIsCisJCQkJCQkgIGxpbmtzKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgJz8nOgorCQlkZWZhdWx0OgorCQkJdXNhZ2UoKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCX0KKwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChhcmdjICE9IDEpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogTm8gaW5wdXQgZmlsZSBzcGVjaWZpbGVkXG4iLCBhcHBuYW1lKTsKKwkJdXNhZ2UoKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKworCWlmIChyZWdkaWFnZmlsZSAhPSBOVUxMCisJICYmIChyZWdmaWxlID09IE5VTEwgfHwgc3RvY2tfaW5jbHVkZV9maWxlID09IE5VTEwpKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIiVzOiBUaGUgLXAgb3B0aW9uIHJlcXVpcmVzIHRoZSAtciBhbmQgLWkgb3B0aW9ucy5cbiIsCisJCQlhcHBuYW1lKTsKKwkJdXNhZ2UoKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKwlzeW10YWJsZV9vcGVuKCk7CisJaW5wdXRmaWxlbmFtZSA9ICphcmd2OworCWluY2x1ZGVfZmlsZSgqYXJndiwgU09VUkNFX0ZJTEUpOworCXJldHZhbCA9IHl5cGFyc2UoKTsKKwlpZiAocmV0dmFsID09IDApIHsKKwkJaWYgKFNMSVNUX0ZJUlNUKCZzY29wZV9zdGFjaykgPT0gTlVMTAorCQkgfHwgU0xJU1RfRklSU1QoJnNjb3BlX3N0YWNrKS0+dHlwZSAhPSBTQ09QRV9ST09UKSB7CisJCQlzdG9wKCJVbnRlcm1pbmF0ZWQgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiIsIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisKKwkJLyogUHJvY2VzcyBvdXRtb3N0IHNjb3BlICovCisJCXByb2Nlc3Nfc2NvcGUoU0xJU1RfRklSU1QoJnNjb3BlX3N0YWNrKSk7CisJCS8qCisJCSAqIERlY2VuZCB0aGUgdHJlZSBvZiBzY29wZXMgYW5kIGluc2VydC9lbWl0CisJCSAqIHBhdGNoZXMgYXMgYXBwcm9wcmlhdGUuICBXZSBwZXJmb3JtIGEgZGVwdGggZmlyc3QKKwkJICogdHJhbnZlcnNhbCwgcmVjdXJzaXZlbHkgaGFuZGxpbmcgZWFjaCBzY29wZS4KKwkJICovCisJCS8qIHN0YXJ0IGF0IHRoZSByb290IHNjb3BlICovCisJCWR1bXBfc2NvcGUoU0xJU1RfRklSU1QoJnNjb3BlX3N0YWNrKSk7CisKKwkJLyogUGF0Y2ggdXAgZm9yd2FyZCBqdW1wIGFkZHJlc3NlcyAqLworCQliYWNrX3BhdGNoKCk7CisKKwkJaWYgKG9maWxlICE9IE5VTEwpCisJCQlvdXRwdXRfY29kZSgpOworCQlpZiAocmVnZmlsZSAhPSBOVUxMKQorCQkJc3ltdGFibGVfZHVtcChyZWdmaWxlLCByZWdkaWFnZmlsZSk7CisJCWlmIChsaXN0ZmlsZSAhPSBOVUxMKQorCQkJb3V0cHV0X2xpc3RpbmcoaW5wdXRmaWxlbmFtZSk7CisJfQorCisJc3RvcChOVUxMLCAwKTsKKwkvKiBOT1RSRUFDSEVEICovCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK3VzYWdlKCkKK3sKKworCSh2b2lkKWZwcmludGYoc3RkZXJyLAorInVzYWdlOiAlLTE2cyBbLW5vc3RkaW5jXSBbLUktXSBbLUkgZGlyZWN0b3J5XSBbLW8gb3V0cHV0X2ZpbGVdXG4iCisiCVstciByZWdpc3Rlcl9vdXRwdXRfZmlsZSBbLXAgcmVnaXN0ZXJfZGlhZ19maWxlIC1pIGluY2x1ZGVmaWxlXV1cbiIKKyIJWy1sIHByb2dyYW1fbGlzdF9maWxlXVxuIgorIglpbnB1dF9maWxlXG4iLCBhcHBuYW1lKTsKKwlleGl0KEVYX1VTQUdFKTsKK30KKworc3RhdGljIHZvaWQKK2JhY2tfcGF0Y2goKQoreworCXN0cnVjdCBpbnN0cnVjdGlvbiAqY3VyX2luc3RyOworCisJZm9yIChjdXJfaW5zdHIgPSBTVEFJTFFfRklSU1QoJnNlcV9wcm9ncmFtKTsKKwkgICAgIGN1cl9pbnN0ciAhPSBOVUxMOworCSAgICAgY3VyX2luc3RyID0gU1RBSUxRX05FWFQoY3VyX2luc3RyLCBsaW5rcykpIHsKKwkJaWYgKGN1cl9pbnN0ci0+cGF0Y2hfbGFiZWwgIT0gTlVMTCkgeworCQkJc3RydWN0IGluc19mb3JtYXQzICpmM19pbnN0cjsKKwkJCXVfaW50IGFkZHJlc3M7CisKKwkJCWlmIChjdXJfaW5zdHItPnBhdGNoX2xhYmVsLT50eXBlICE9IExBQkVMKSB7CisJCQkJY2hhciBidWZbMjU1XTsKKworCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkJCSAiVW5kZWZpbmVkIGxhYmVsICVzIiwKKwkJCQkJIGN1cl9pbnN0ci0+cGF0Y2hfbGFiZWwtPm5hbWUpOworCQkJCXN0b3AoYnVmLCBFWF9EQVRBRVJSKTsKKwkJCQkvKiBOT1RSRUFDSEVEICovCisJCQl9CisJCQlmM19pbnN0ciA9ICZjdXJfaW5zdHItPmZvcm1hdC5mb3JtYXQzOworCQkJYWRkcmVzcyA9IGYzX2luc3RyLT5hZGRyZXNzOworCQkJYWRkcmVzcyArPSBjdXJfaW5zdHItPnBhdGNoX2xhYmVsLT5pbmZvLmxpbmZvLT5hZGRyZXNzOworCQkJZjNfaW5zdHItPmFkZHJlc3MgPSBhZGRyZXNzOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorb3V0cHV0X2NvZGUoKQoreworCXN0cnVjdCBpbnN0cnVjdGlvbiAqY3VyX2luc3RyOworCXBhdGNoX3QgKmN1cl9wYXRjaDsKKwljcml0aWNhbF9zZWN0aW9uX3QgKmNzOworCXN5bWJvbF9ub2RlX3QgKmN1cl9ub2RlOworCWludCBpbnN0cmNvdW50OworCisJaW5zdHJjb3VudCA9IDA7CisJZnByaW50ZihvZmlsZSwKKyIvKlxuIgorIiAqIERPIE5PVCBFRElUIC0gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkXG4iCisiICoJCSBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlIGZpbGVzOlxuIgorIiAqXG4iCisiJXMgKi9cbiIsIHZlcnNpb25zKTsKKworCWZwcmludGYob2ZpbGUsICJzdGF0aWMgdWludDhfdCBzZXFwcm9nW10gPSB7XG4iKTsKKwlmb3IgKGN1cl9pbnN0ciA9IFNUQUlMUV9GSVJTVCgmc2VxX3Byb2dyYW0pOworCSAgICAgY3VyX2luc3RyICE9IE5VTEw7CisJICAgICBjdXJfaW5zdHIgPSBTVEFJTFFfTkVYVChjdXJfaW5zdHIsIGxpbmtzKSkgeworCisJCWZwcmludGYob2ZpbGUsICIlc1x0MHglMDJ4LCAweCUwMngsIDB4JTAyeCwgMHglMDJ4IiwKKwkJCWN1cl9pbnN0ciA9PSBTVEFJTFFfRklSU1QoJnNlcV9wcm9ncmFtKSA/ICIiIDogIixcbiIsCisjaWYgQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOCisJCQljdXJfaW5zdHItPmZvcm1hdC5ieXRlc1swXSwKKwkJCWN1cl9pbnN0ci0+Zm9ybWF0LmJ5dGVzWzFdLAorCQkJY3VyX2luc3RyLT5mb3JtYXQuYnl0ZXNbMl0sCisJCQljdXJfaW5zdHItPmZvcm1hdC5ieXRlc1szXSk7CisjZWxzZQorCQkJY3VyX2luc3RyLT5mb3JtYXQuYnl0ZXNbM10sCisJCQljdXJfaW5zdHItPmZvcm1hdC5ieXRlc1syXSwKKwkJCWN1cl9pbnN0ci0+Zm9ybWF0LmJ5dGVzWzFdLAorCQkJY3VyX2luc3RyLT5mb3JtYXQuYnl0ZXNbMF0pOworI2VuZGlmCisJCWluc3RyY291bnQrKzsKKwl9CisJZnByaW50ZihvZmlsZSwgIlxufTtcblxuIik7CisKKwlpZiAocGF0Y2hfYXJnX2xpc3QgPT0gTlVMTCkKKwkJc3RvcCgiUGF0Y2ggYXJndW1lbnQgbGlzdCBub3QgZGVmaW5lZCIsCisJCSAgICAgRVhfREFUQUVSUik7CisKKwkvKgorCSAqICBPdXRwdXQgcGF0Y2ggaW5mb3JtYXRpb24uICBQYXRjaCBmdW5jdGlvbnMgZmlyc3QuCisJICovCisJZnByaW50ZihvZmlsZSwKKyJ0eXBlZGVmIGludCAlc3BhdGNoX2Z1bmNfdCAoJXMpO1xuIiwgcHJlZml4LCBwYXRjaF9hcmdfbGlzdCk7CisKKwlmb3IgKGN1cl9ub2RlID0gU0xJU1RfRklSU1QoJnBhdGNoX2Z1bmN0aW9ucyk7CisJICAgICBjdXJfbm9kZSAhPSBOVUxMOworCSAgICAgY3VyX25vZGUgPSBTTElTVF9ORVhUKGN1cl9ub2RlLGxpbmtzKSkgeworCQlmcHJpbnRmKG9maWxlLAorInN0YXRpYyAlc3BhdGNoX2Z1bmNfdCAlc3BhdGNoJWRfZnVuYztcbiIKKyJcbiIKKyJzdGF0aWMgaW50XG4iCisiJXNwYXRjaCVkX2Z1bmMoJXMpXG4iCisie1xuIgorIglyZXR1cm4gKCVzKTtcbiIKKyJ9XG5cbiIsCisJCQlwcmVmaXgsCisJCQlwcmVmaXgsCisJCQljdXJfbm9kZS0+c3ltYm9sLT5pbmZvLmNvbmRpbmZvLT5mdW5jX251bSwKKwkJCXByZWZpeCwKKwkJCWN1cl9ub2RlLT5zeW1ib2wtPmluZm8uY29uZGluZm8tPmZ1bmNfbnVtLAorCQkJcGF0Y2hfYXJnX2xpc3QsCisJCQljdXJfbm9kZS0+c3ltYm9sLT5uYW1lKTsKKwl9CisKKwlmcHJpbnRmKG9maWxlLAorInN0YXRpYyBzdHJ1Y3QgcGF0Y2gge1xuIgorIgklc3BhdGNoX2Z1bmNfdAkJKnBhdGNoX2Z1bmM7XG4iCisiCXVpbnQzMl90CQkgYmVnaW4JCToxMCxcbiIKKyIJCQkJIHNraXBfaW5zdHIJOjEwLFxuIgorIgkJCQkgc2tpcF9wYXRjaAk6MTI7XG4iCisifSBwYXRjaGVzW10gPSB7XG4iLCBwcmVmaXgpOworCisJZm9yIChjdXJfcGF0Y2ggPSBTVEFJTFFfRklSU1QoJnBhdGNoZXMpOworCSAgICAgY3VyX3BhdGNoICE9IE5VTEw7CisJICAgICBjdXJfcGF0Y2ggPSBTVEFJTFFfTkVYVChjdXJfcGF0Y2gsbGlua3MpKSB7CisJCWZwcmludGYob2ZpbGUsICIlc1x0eyAlc3BhdGNoJWRfZnVuYywgJWQsICVkLCAlZCB9IiwKKwkJCWN1cl9wYXRjaCA9PSBTVEFJTFFfRklSU1QoJnBhdGNoZXMpID8gIiIgOiAiLFxuIiwKKwkJCXByZWZpeCwKKwkJCWN1cl9wYXRjaC0+cGF0Y2hfZnVuYywgY3VyX3BhdGNoLT5iZWdpbiwKKwkJCWN1cl9wYXRjaC0+c2tpcF9pbnN0ciwgY3VyX3BhdGNoLT5za2lwX3BhdGNoKTsKKwl9CisKKwlmcHJpbnRmKG9maWxlLCAiXG59O1xuXG4iKTsKKworCWZwcmludGYob2ZpbGUsCisic3RhdGljIHN0cnVjdCBjcyB7XG4iCisiCXVpbnQxNl90CWJlZ2luO1xuIgorIgl1aW50MTZfdAllbmQ7XG4iCisifSBjcml0aWNhbF9zZWN0aW9uc1tdID0ge1xuIik7CisKKwlmb3IgKGNzID0gVEFJTFFfRklSU1QoJmNzX3RhaWxxKTsKKwkgICAgIGNzICE9IE5VTEw7CisJICAgICBjcyA9IFRBSUxRX05FWFQoY3MsIGxpbmtzKSkgeworCQlmcHJpbnRmKG9maWxlLCAiJXNcdHsgJWQsICVkIH0iLAorCQkJY3MgPT0gVEFJTFFfRklSU1QoJmNzX3RhaWxxKSA/ICIiIDogIixcbiIsCisJCQljcy0+YmVnaW5fYWRkciwgY3MtPmVuZF9hZGRyKTsKKwl9CisKKwlmcHJpbnRmKG9maWxlLCAiXG59O1xuXG4iKTsKKworCWZwcmludGYob2ZpbGUsCisic3RhdGljIGNvbnN0IGludCBudW1fY3JpdGljYWxfc2VjdGlvbnMgPSBzaXplb2YoY3JpdGljYWxfc2VjdGlvbnMpXG4iCisiCQkJCSAgICAgICAvIHNpemVvZigqY3JpdGljYWxfc2VjdGlvbnMpO1xuIik7CisKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlZCBpbnN0cnVjdGlvbnMgdXNlZFxuIiwgYXBwbmFtZSwgaW5zdHJjb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX3Njb3BlKHNjb3BlX3QgKnNjb3BlKQoreworCXNjb3BlX3QgKmN1cl9zY29wZTsKKworCS8qCisJICogRW1pdCB0aGUgZmlyc3QgcGF0Y2ggZm9yIHRoaXMgc2NvcGUKKwkgKi8KKwllbWl0X3BhdGNoKHNjb3BlLCAwKTsKKworCS8qCisJICogRHVtcCBlYWNoIHNjb3BlIHdpdGhpbiB0aGlzIG9uZS4KKwkgKi8KKwljdXJfc2NvcGUgPSBUQUlMUV9GSVJTVCgmc2NvcGUtPmlubmVyX3Njb3BlKTsKKworCXdoaWxlIChjdXJfc2NvcGUgIT0gTlVMTCkgeworCisJCWR1bXBfc2NvcGUoY3VyX3Njb3BlKTsKKworCQljdXJfc2NvcGUgPSBUQUlMUV9ORVhUKGN1cl9zY29wZSwgc2NvcGVfbGlua3MpOworCX0KKworCS8qCisJICogRW1pdCB0aGUgc2Vjb25kLCBjbG9zaW5nLCBwYXRjaCBmb3IgdGhpcyBzY29wZQorCSAqLworCWVtaXRfcGF0Y2goc2NvcGUsIDEpOworfQorCit2b2lkCitlbWl0X3BhdGNoKHNjb3BlX3QgKnNjb3BlLCBpbnQgcGF0Y2gpCit7CisJcGF0Y2hfaW5mb190ICpwaW5mbzsKKwlwYXRjaF90ICpuZXdfcGF0Y2g7CisKKwlwaW5mbyA9ICZzY29wZS0+cGF0Y2hlc1twYXRjaF07CisKKwlpZiAocGluZm8tPnNraXBfaW5zdHIgPT0gMCkKKwkJLyogTm8tT3AgcGF0Y2ggKi8KKwkJcmV0dXJuOworCisJbmV3X3BhdGNoID0gKHBhdGNoX3QgKiltYWxsb2Moc2l6ZW9mKCpuZXdfcGF0Y2gpKTsKKworCWlmIChuZXdfcGF0Y2ggPT0gTlVMTCkKKwkJc3RvcCgiQ291bGQgbm90IG1hbGxvYyBwYXRjaCBzdHJ1Y3R1cmUiLCBFWF9PU0VSUik7CisKKwltZW1zZXQobmV3X3BhdGNoLCAwLCBzaXplb2YoKm5ld19wYXRjaCkpOworCisJaWYgKHBhdGNoID09IDApIHsKKwkJbmV3X3BhdGNoLT5wYXRjaF9mdW5jID0gc2NvcGUtPmZ1bmNfbnVtOworCQluZXdfcGF0Y2gtPmJlZ2luID0gc2NvcGUtPmJlZ2luX2FkZHI7CisJfSBlbHNlIHsKKwkJbmV3X3BhdGNoLT5wYXRjaF9mdW5jID0gMDsKKwkJbmV3X3BhdGNoLT5iZWdpbiA9IHNjb3BlLT5lbmRfYWRkcjsKKwl9CisJbmV3X3BhdGNoLT5za2lwX2luc3RyID0gcGluZm8tPnNraXBfaW5zdHI7CisJbmV3X3BhdGNoLT5za2lwX3BhdGNoID0gcGluZm8tPnNraXBfcGF0Y2g7CisJU1RBSUxRX0lOU0VSVF9UQUlMKCZwYXRjaGVzLCBuZXdfcGF0Y2gsIGxpbmtzKTsKK30KKwordm9pZAorb3V0cHV0X2xpc3RpbmcoY2hhciAqaWZpbGVuYW1lKQoreworCWNoYXIgYnVmWzEwMjRdOworCUZJTEUgKmlmaWxlOworCXN0cnVjdCBpbnN0cnVjdGlvbiAqY3VyX2luc3RyOworCXBhdGNoX3QgKmN1cl9wYXRjaDsKKwlzeW1ib2xfbm9kZV90ICpjdXJfZnVuYzsKKwlpbnQgKmZ1bmNfdmFsdWVzOworCWludCBpbnN0cmNvdW50OworCWludCBpbnN0cnB0cjsKKwlpbnQgbGluZTsKKwlpbnQgZnVuY19jb3VudDsKKwlpbnQgc2tpcF9hZGRyOworCisJaW5zdHJjb3VudCA9IDA7CisJaW5zdHJwdHIgPSAwOworCWxpbmUgPSAxOworCXNraXBfYWRkciA9IDA7CisJaWYgKChpZmlsZSA9IGZvcGVuKGlmaWxlbmFtZSwgInIiKSkgPT0gTlVMTCkgeworCQlwZXJyb3IoaWZpbGVuYW1lKTsKKwkJc3RvcChOVUxMLCBFWF9EQVRBRVJSKTsKKwl9CisKKwkvKgorCSAqIERldGVybWluZSB3aGljaCBvcHRpb25zIHRvIGFwcGx5IHRvIHRoaXMgbGlzdGluZy4KKwkgKi8KKwlmb3IgKGZ1bmNfY291bnQgPSAwLCBjdXJfZnVuYyA9IFNMSVNUX0ZJUlNUKCZwYXRjaF9mdW5jdGlvbnMpOworCSAgICBjdXJfZnVuYyAhPSBOVUxMOworCSAgICBjdXJfZnVuYyA9IFNMSVNUX05FWFQoY3VyX2Z1bmMsIGxpbmtzKSkKKwkJZnVuY19jb3VudCsrOworCisJZnVuY192YWx1ZXMgPSBOVUxMOworCWlmIChmdW5jX2NvdW50ICE9IDApIHsKKwkJZnVuY192YWx1ZXMgPSAoaW50ICopbWFsbG9jKGZ1bmNfY291bnQgKiBzaXplb2YoaW50KSk7CisKKwkJaWYgKGZ1bmNfdmFsdWVzID09IE5VTEwpCisJCQlzdG9wKCJDb3VsZCBub3QgbWFsbG9jIiwgRVhfT1NFUlIpOworCQkKKwkJZnVuY192YWx1ZXNbMF0gPSAwOyAvKiBGQUxTRSBmdW5jICovCisJCWZ1bmNfY291bnQtLTsKKworCQkvKgorCQkgKiBBc2sgdGhlIHVzZXIgdG8gZmlsbCBpbiB0aGUgcmV0dXJuIHZhbHVlcyBmb3IKKwkJICogdGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9ucy4KKwkJICovCisJCQorCQkKKwkJZm9yIChjdXJfZnVuYyA9IFNMSVNUX0ZJUlNUKCZwYXRjaF9mdW5jdGlvbnMpOworCQkgICAgIGN1cl9mdW5jICE9IE5VTEwgJiYgU0xJU1RfTkVYVChjdXJfZnVuYywgbGlua3MpICE9IE5VTEw7CisJCSAgICAgY3VyX2Z1bmMgPSBTTElTVF9ORVhUKGN1cl9mdW5jLCBsaW5rcyksIGZ1bmNfY291bnQtLSkgeworCQkJaW50IGlucHV0OworCQkJCisJCQlmcHJpbnRmKHN0ZG91dCwgIlxuKCVzKVxuIiwgY3VyX2Z1bmMtPnN5bWJvbC0+bmFtZSk7CisJCQlmcHJpbnRmKHN0ZG91dCwKKwkJCQkiRW50ZXIgdGhlIHJldHVybiB2YWx1ZSBmb3IgIgorCQkJCSJ0aGlzIGV4cHJlc3Npb25bVC9GXToiKTsKKworCQkJd2hpbGUgKDEpIHsKKworCQkJCWlucHV0ID0gZ2V0Y2hhcigpOworCQkJCWlucHV0ID0gdG91cHBlcihpbnB1dCk7CisKKwkJCQlpZiAoaW5wdXQgPT0gJ1QnKSB7CisJCQkJCWZ1bmNfdmFsdWVzW2Z1bmNfY291bnRdID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIGlmIChpbnB1dCA9PSAnRicpIHsKKwkJCQkJZnVuY192YWx1ZXNbZnVuY19jb3VudF0gPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoaXNhdHR5KGZpbGVubyhzdGRpbikpID09IDApCisJCQkJcHV0Y2hhcihpbnB1dCk7CisJCX0KKwkJZnByaW50ZihzdGRvdXQsICJcblRoYW5rcyFcbiIpOworCX0KKworCS8qIE5vdyBvdXRwdXQgdGhlIGxpc3RpbmcgKi8KKwljdXJfcGF0Y2ggPSBTVEFJTFFfRklSU1QoJnBhdGNoZXMpOworCWZvciAoY3VyX2luc3RyID0gU1RBSUxRX0ZJUlNUKCZzZXFfcHJvZ3JhbSk7CisJICAgICBjdXJfaW5zdHIgIT0gTlVMTDsKKwkgICAgIGN1cl9pbnN0ciA9IFNUQUlMUV9ORVhUKGN1cl9pbnN0ciwgbGlua3MpLCBpbnN0cmNvdW50KyspIHsKKworCQlpZiAoY2hlY2tfcGF0Y2goJmN1cl9wYXRjaCwgaW5zdHJjb3VudCwKKwkJCQkmc2tpcF9hZGRyLCBmdW5jX3ZhbHVlcykgPT0gMCkgeworCQkJLyogRG9uJ3QgY291bnQgdGhpcyBpbnN0cnVjdGlvbiBhcyBpdCBpcyBpbiBhIHBhdGNoCisJCQkgKiB0aGF0IHdhcyByZW1vdmVkLgorCQkJICovCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKwkJfQorCisJCXdoaWxlIChsaW5lIDwgY3VyX2luc3RyLT5zcmNsaW5lKSB7CisJCQlmZ2V0cyhidWYsIHNpemVvZihidWYpLCBpZmlsZSk7CisJCQkJZnByaW50ZihsaXN0ZmlsZSwgIlx0XHQlcyIsIGJ1Zik7CisJCQkJbGluZSsrOworCQl9CisJCWZwcmludGYobGlzdGZpbGUsICIlMDN4ICUwMnglMDJ4JTAyeCUwMngiLCBpbnN0cnB0ciwKKyNpZiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KKwkJCWN1cl9pbnN0ci0+Zm9ybWF0LmJ5dGVzWzBdLAorCQkJY3VyX2luc3RyLT5mb3JtYXQuYnl0ZXNbMV0sCisJCQljdXJfaW5zdHItPmZvcm1hdC5ieXRlc1syXSwKKwkJCWN1cl9pbnN0ci0+Zm9ybWF0LmJ5dGVzWzNdKTsKKyNlbHNlCisJCQljdXJfaW5zdHItPmZvcm1hdC5ieXRlc1szXSwKKwkJCWN1cl9pbnN0ci0+Zm9ybWF0LmJ5dGVzWzJdLAorCQkJY3VyX2luc3RyLT5mb3JtYXQuYnl0ZXNbMV0sCisJCQljdXJfaW5zdHItPmZvcm1hdC5ieXRlc1swXSk7CisjZW5kaWYKKwkJZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgaWZpbGUpOworCQlmcHJpbnRmKGxpc3RmaWxlLCAiXHQlcyIsIGJ1Zik7CisJCWxpbmUrKzsKKwkJaW5zdHJwdHIrKzsKKwl9CisJLyogRHVtcCB0aGUgcmVtYWluZGVyIG9mIHRoZSBmaWxlICovCisJd2hpbGUoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgaWZpbGUpICE9IE5VTEwpCisJCWZwcmludGYobGlzdGZpbGUsICJcdFx0JXMiLCBidWYpOworCisJZmNsb3NlKGlmaWxlKTsKK30KKworc3RhdGljIGludAorY2hlY2tfcGF0Y2gocGF0Y2hfdCAqKnN0YXJ0X3BhdGNoLCBpbnQgc3RhcnRfaW5zdHIsCisJICAgIGludCAqc2tpcF9hZGRyLCBpbnQgKmZ1bmNfdmFscykKK3sKKwlwYXRjaF90ICpjdXJfcGF0Y2g7CisKKwljdXJfcGF0Y2ggPSAqc3RhcnRfcGF0Y2g7CisKKwl3aGlsZSAoY3VyX3BhdGNoICE9IE5VTEwgJiYgc3RhcnRfaW5zdHIgPT0gY3VyX3BhdGNoLT5iZWdpbikgeworCQlpZiAoZnVuY192YWxzW2N1cl9wYXRjaC0+cGF0Y2hfZnVuY10gPT0gMCkgeworCQkJaW50IHNraXA7CisKKwkJCS8qIFN0YXJ0IHJlamVjdGluZyBjb2RlICovCisJCQkqc2tpcF9hZGRyID0gc3RhcnRfaW5zdHIgKyBjdXJfcGF0Y2gtPnNraXBfaW5zdHI7CisJCQlmb3IgKHNraXAgPSBjdXJfcGF0Y2gtPnNraXBfcGF0Y2g7CisJCQkgICAgIHNraXAgPiAwICYmIGN1cl9wYXRjaCAhPSBOVUxMOworCQkJICAgICBza2lwLS0pCisJCQkJY3VyX3BhdGNoID0gU1RBSUxRX05FWFQoY3VyX3BhdGNoLCBsaW5rcyk7CisJCX0gZWxzZSB7CisJCQkvKiBBY2NlcHRlZCB0aGlzIHBhdGNoLiAgQWR2YW5jZSB0byB0aGUgbmV4dAorCQkJICogb25lIGFuZCB3YWl0IGZvciBvdXIgaW50cnVjdGlvbiBwb2ludGVyIHRvCisJCQkgKiBoaXQgdGhpcyBwb2ludC4KKwkJCSAqLworCQkJY3VyX3BhdGNoID0gU1RBSUxRX05FWFQoY3VyX3BhdGNoLCBsaW5rcyk7CisJCX0KKwl9CisKKwkqc3RhcnRfcGF0Y2ggPSBjdXJfcGF0Y2g7CisJaWYgKHN0YXJ0X2luc3RyIDwgKnNraXBfYWRkcikKKwkJLyogU3RpbGwgc2tpcHBpbmcgKi8KKwkJcmV0dXJuICgwKTsKKworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBQcmludCBvdXQgZXJyb3IgaW5mb3JtYXRpb24gaWYgYXBwcm9wcmlhdGUsIGFuZCBjbGVhbiB1cCBiZWZvcmUKKyAqIHRlcm1pbmF0aW5nIHRoZSBwcm9ncmFtLgorICovCit2b2lkCitzdG9wKGNvbnN0IGNoYXIgKnN0cmluZywgaW50IGVycl9jb2RlKQoreworCWlmIChzdHJpbmcgIT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBhcHBuYW1lKTsKKwkJaWYgKHl5ZmlsZW5hbWUgIT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsICJTdG9wcGVkIGF0IGZpbGUgJXMsIGxpbmUgJWQgLSAiLAorCQkJCXl5ZmlsZW5hbWUsIHl5bGluZW5vKTsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBzdHJpbmcpOworCX0KKworCWlmIChvZmlsZSAhPSBOVUxMKSB7CisJCWZjbG9zZShvZmlsZSk7CisJCWlmIChlcnJfY29kZSAhPSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBSZW1vdmluZyAlcyBkdWUgdG8gZXJyb3JcbiIsCisJCQkJYXBwbmFtZSwgb2ZpbGVuYW1lKTsKKwkJCXVubGluayhvZmlsZW5hbWUpOworCQl9CisJfQorCisJaWYgKHJlZ2ZpbGUgIT0gTlVMTCkgeworCQlmY2xvc2UocmVnZmlsZSk7CisJCWlmIChlcnJfY29kZSAhPSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBSZW1vdmluZyAlcyBkdWUgdG8gZXJyb3JcbiIsCisJCQkJYXBwbmFtZSwgcmVnZmlsZW5hbWUpOworCQkJdW5saW5rKHJlZ2ZpbGVuYW1lKTsKKwkJfQorCX0KKworCWlmIChsaXN0ZmlsZSAhPSBOVUxMKSB7CisJCWZjbG9zZShsaXN0ZmlsZSk7CisJCWlmIChlcnJfY29kZSAhPSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBSZW1vdmluZyAlcyBkdWUgdG8gZXJyb3JcbiIsCisJCQkJYXBwbmFtZSwgbGlzdGZpbGVuYW1lKTsKKwkJCXVubGluayhsaXN0ZmlsZW5hbWUpOworCQl9CisJfQorCisJc3ltbGlzdF9mcmVlKCZwYXRjaF9mdW5jdGlvbnMpOworCXN5bXRhYmxlX2Nsb3NlKCk7CisKKwlleGl0KGVycl9jb2RlKTsKK30KKworc3RydWN0IGluc3RydWN0aW9uICoKK3NlcV9hbGxvYygpCit7CisJc3RydWN0IGluc3RydWN0aW9uICpuZXdfaW5zdHI7CisKKwluZXdfaW5zdHIgPSAoc3RydWN0IGluc3RydWN0aW9uICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5zdHJ1Y3Rpb24pKTsKKwlpZiAobmV3X2luc3RyID09IE5VTEwpCisJCXN0b3AoIlVuYWJsZSB0byBtYWxsb2MgaW5zdHJ1Y3Rpb24gb2JqZWN0IiwgRVhfU09GVFdBUkUpOworCW1lbXNldChuZXdfaW5zdHIsIDAsIHNpemVvZigqbmV3X2luc3RyKSk7CisJU1RBSUxRX0lOU0VSVF9UQUlMKCZzZXFfcHJvZ3JhbSwgbmV3X2luc3RyLCBsaW5rcyk7CisJbmV3X2luc3RyLT5zcmNsaW5lID0geXlsaW5lbm87CisJcmV0dXJuIG5ld19pbnN0cjsKK30KKworY3JpdGljYWxfc2VjdGlvbl90ICoKK2NzX2FsbG9jKCkKK3sKKwljcml0aWNhbF9zZWN0aW9uX3QgKm5ld19jczsKKworCW5ld19jcz0gKGNyaXRpY2FsX3NlY3Rpb25fdCAqKW1hbGxvYyhzaXplb2YoY3JpdGljYWxfc2VjdGlvbl90KSk7CisJaWYgKG5ld19jcyA9PSBOVUxMKQorCQlzdG9wKCJVbmFibGUgdG8gbWFsbG9jIGNyaXRpY2FsX3NlY3Rpb24gb2JqZWN0IiwgRVhfU09GVFdBUkUpOworCW1lbXNldChuZXdfY3MsIDAsIHNpemVvZigqbmV3X2NzKSk7CisJCisJVEFJTFFfSU5TRVJUX1RBSUwoJmNzX3RhaWxxLCBuZXdfY3MsIGxpbmtzKTsKKwlyZXR1cm4gbmV3X2NzOworfQorCitzY29wZV90ICoKK3Njb3BlX2FsbG9jKCkKK3sKKwlzY29wZV90ICpuZXdfc2NvcGU7CisKKwluZXdfc2NvcGUgPSAoc2NvcGVfdCAqKW1hbGxvYyhzaXplb2Yoc2NvcGVfdCkpOworCWlmIChuZXdfc2NvcGUgPT0gTlVMTCkKKwkJc3RvcCgiVW5hYmxlIHRvIG1hbGxvYyBzY29wZSBvYmplY3QiLCBFWF9TT0ZUV0FSRSk7CisJbWVtc2V0KG5ld19zY29wZSwgMCwgc2l6ZW9mKCpuZXdfc2NvcGUpKTsKKwlUQUlMUV9JTklUKCZuZXdfc2NvcGUtPmlubmVyX3Njb3BlKTsKKwkKKwlpZiAoU0xJU1RfRklSU1QoJnNjb3BlX3N0YWNrKSAhPSBOVUxMKSB7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZTTElTVF9GSVJTVCgmc2NvcGVfc3RhY2spLT5pbm5lcl9zY29wZSwKKwkJCQkgIG5ld19zY29wZSwgc2NvcGVfbGlua3MpOworCX0KKwkvKiBUaGlzIHBhdGNoIGlzIG5vdyB0aGUgY3VycmVudCBzY29wZSAqLworCVNMSVNUX0lOU0VSVF9IRUFEKCZzY29wZV9zdGFjaywgbmV3X3Njb3BlLCBzY29wZV9zdGFja19saW5rcyk7CisJcmV0dXJuIG5ld19zY29wZTsKK30KKwordm9pZAorcHJvY2Vzc19zY29wZShzY29wZV90ICpzY29wZSkKK3sKKwkvKgorCSAqIFdlIGFyZSAibGVhdmluZyIgdGhpcyBzY29wZS4gIFdlIHNob3VsZCBub3cgaGF2ZQorCSAqIGVub3VnaCBpbmZvcm1hdGlvbiB0byBwcm9jZXNzIHRoZSBsaXN0cyBvZiBzY29wZXMKKwkgKiB3ZSBlbmNhcHN1bGF0ZS4KKwkgKi8KKwlzY29wZV90ICpjdXJfc2NvcGU7CisJdV9pbnQgc2tpcF9wYXRjaF9jb3VudDsKKwl1X2ludCBza2lwX2luc3RyX2NvdW50OworCisJY3VyX3Njb3BlID0gVEFJTFFfTEFTVCgmc2NvcGUtPmlubmVyX3Njb3BlLCBzY29wZV90YWlscSk7CisJc2tpcF9wYXRjaF9jb3VudCA9IDA7CisJc2tpcF9pbnN0cl9jb3VudCA9IDA7CisJd2hpbGUgKGN1cl9zY29wZSAhPSBOVUxMKSB7CisJCXVfaW50IHBhdGNoMF9wYXRjaF9za2lwOworCisJCXBhdGNoMF9wYXRjaF9za2lwID0gMDsKKwkJc3dpdGNoIChjdXJfc2NvcGUtPnR5cGUpIHsKKwkJY2FzZSBTQ09QRV9JRjoKKwkJY2FzZSBTQ09QRV9FTFNFX0lGOgorCQkJaWYgKHNraXBfaW5zdHJfY291bnQgIT0gMCkgeworCQkJCS8qIENyZWF0ZSBhIHRhaWwgcGF0Y2ggKi8KKwkJCQlwYXRjaDBfcGF0Y2hfc2tpcCsrOworCQkJCWN1cl9zY29wZS0+cGF0Y2hlc1sxXS5za2lwX3BhdGNoID0KKwkJCQkgICAgc2tpcF9wYXRjaF9jb3VudCArIDE7CisJCQkJY3VyX3Njb3BlLT5wYXRjaGVzWzFdLnNraXBfaW5zdHIgPQorCQkJCSAgICBza2lwX2luc3RyX2NvdW50OworCQkJfQorCisJCQkvKiBDb3VudCBIZWFkIHBhdGNoICovCisJCQlwYXRjaDBfcGF0Y2hfc2tpcCsrOworCisJCQkvKiBDb3VudCBhbnkgcGF0Y2hlcyBjb250YWluZWQgaW4gb3VyIGlubmVyIHNjb3BlICovCisJCQlwYXRjaDBfcGF0Y2hfc2tpcCArPSBjdXJfc2NvcGUtPmlubmVyX3Njb3BlX3BhdGNoZXM7CisKKwkJCWN1cl9zY29wZS0+cGF0Y2hlc1swXS5za2lwX3BhdGNoID0gcGF0Y2gwX3BhdGNoX3NraXA7CisJCQljdXJfc2NvcGUtPnBhdGNoZXNbMF0uc2tpcF9pbnN0ciA9CisJCQkgICAgY3VyX3Njb3BlLT5lbmRfYWRkciAtIGN1cl9zY29wZS0+YmVnaW5fYWRkcjsKKworCQkJc2tpcF9pbnN0cl9jb3VudCArPSBjdXJfc2NvcGUtPnBhdGNoZXNbMF0uc2tpcF9pbnN0cjsKKworCQkJc2tpcF9wYXRjaF9jb3VudCArPSBwYXRjaDBfcGF0Y2hfc2tpcDsKKwkJCWlmIChjdXJfc2NvcGUtPnR5cGUgPT0gU0NPUEVfSUYpIHsKKwkJCQlzY29wZS0+aW5uZXJfc2NvcGVfcGF0Y2hlcyArPSBza2lwX3BhdGNoX2NvdW50OworCQkJCXNraXBfcGF0Y2hfY291bnQgPSAwOworCQkJICAgICAgICBza2lwX2luc3RyX2NvdW50ID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNDT1BFX0VMU0U6CisJCQkvKiBDb3VudCBhbnkgcGF0Y2hlcyBjb250YWluZWQgaW4gb3VyIGlubnRlciBzY29wZSAqLworCQkJc2tpcF9wYXRjaF9jb3VudCArPSBjdXJfc2NvcGUtPmlubmVyX3Njb3BlX3BhdGNoZXM7CisKKwkJCXNraXBfaW5zdHJfY291bnQgKz0gY3VyX3Njb3BlLT5lbmRfYWRkcgorCQkJCQkgIC0gY3VyX3Njb3BlLT5iZWdpbl9hZGRyOworCQkJYnJlYWs7CisJCWNhc2UgU0NPUEVfUk9PVDoKKwkJCXN0b3AoIlVuZXhwZWN0ZWQgc2NvcGUgdHlwZSBlbmNvdW50ZXJlZCIsIEVYX1NPRlRXQVJFKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCisJCWN1cl9zY29wZSA9IFRBSUxRX1BSRVYoY3VyX3Njb3BlLCBzY29wZV90YWlscSwgc2NvcGVfbGlua3MpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc20uaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTY3OGRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbS5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBBc3NlbWJsZXIgZm9yIHRoZSBzZXF1ZW5jZXIgcHJvZ3JhbSBkb3dubG9hZGVkIHRvIEFpYzd4eHggU0NTSSBob3N0IGFkYXB0ZXJzCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3IEp1c3RpbiBULiBHaWJicy4KKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpY2FzbS9haWNhc20uaCMxNCAkCisgKgorICogJEZyZWVCU0QkCisgKi8KKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgIi4uL3F1ZXVlLmgiCisjZWxzZQorI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFIDEKKyNlbmRpZgorCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBwYXRoX2VudHJ5IHsKKwljaGFyCSpkaXJlY3Rvcnk7CisJaW50CXF1b3RlZF9pbmNsdWRlc19vbmx5OworCVNMSVNUX0VOVFJZKHBhdGhfZW50cnkpIGxpbmtzOworfSAqcGF0aF9lbnRyeV90OworCit0eXBlZGVmIGVudW0geyAgCisJUVVPVEVEX0lOQ0xVREUsCisJQlJBQ0tFVEVEX0lOQ0xVREUsCisJU09VUkNFX0ZJTEUKK30gaW5jbHVkZV90eXBlOworCitTTElTVF9IRUFEKHBhdGhfbGlzdCwgcGF0aF9lbnRyeSk7CisKK2V4dGVybiBzdHJ1Y3QgcGF0aF9saXN0IHNlYXJjaF9wYXRoOworZXh0ZXJuIHN0cnVjdCBjc190YWlscSBjc190YWlscTsKK2V4dGVybiBzdHJ1Y3Qgc2NvcGVfbGlzdCBzY29wZV9zdGFjazsKK2V4dGVybiBzdHJ1Y3Qgc3ltbGlzdCBwYXRjaF9mdW5jdGlvbnM7CitleHRlcm4gaW50IGluY2x1ZGVzX3NlYXJjaF9jdXJkaXI7CQkvKiBGYWxzZSBpZiB3ZSd2ZSBzZWVuIC1JLSAqLworZXh0ZXJuIGNoYXIgKmFwcG5hbWU7CitleHRlcm4gY2hhciAqc3RvY2tfaW5jbHVkZV9maWxlOworZXh0ZXJuIGludCB5eWxpbmVubzsKK2V4dGVybiBjaGFyICp5eWZpbGVuYW1lOworZXh0ZXJuIGNoYXIgKnByZWZpeDsKK2V4dGVybiBjaGFyICpwYXRjaF9hcmdfbGlzdDsKK2V4dGVybiBjaGFyICp2ZXJzaW9uczsKK2V4dGVybiBpbnQgICBzcmNfbW9kZTsKK2V4dGVybiBpbnQgICBkc3RfbW9kZTsKK3N0cnVjdCBzeW1ib2w7CisKK3ZvaWQgc3RvcChjb25zdCBjaGFyICplcnJzdHJpbmcsIGludCBlcnJfY29kZSk7Cit2b2lkIGluY2x1ZGVfZmlsZShjaGFyICpmaWxlX25hbWUsIGluY2x1ZGVfdHlwZSB0eXBlKTsKK3ZvaWQgZXhwYW5kX21hY3JvKHN0cnVjdCBzeW1ib2wgKm1hY3JvX3N5bWJvbCk7CitzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKnNlcV9hbGxvYyh2b2lkKTsKK3N0cnVjdCBjcml0aWNhbF9zZWN0aW9uICpjc19hbGxvYyh2b2lkKTsKK3N0cnVjdCBzY29wZSAqc2NvcGVfYWxsb2Modm9pZCk7Cit2b2lkIHByb2Nlc3Nfc2NvcGUoc3RydWN0IHNjb3BlICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9ncmFtLnkgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWNhc20vYWljYXNtX2dyYW0ueQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2UwNDZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9ncmFtLnkKQEAgLTAsMCArMSwxOTQ1IEBACisleworLyoKKyAqIFBhcnNlciBmb3IgdGhlIEFpYzd4eHggU0NTSSBIb3N0IGFkYXB0ZXIgc2VxdWVuY2VyIGFzc2VtYmxlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTgsIDIwMDAgSnVzdGluIFQuIEdpYmJzLgorICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyIEFkYXB0ZWMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICoKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljYXNtL2FpY2FzbV9ncmFtLnkjMjkgJAorICoKKyAqICRGcmVlQlNEJAorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8cmVnZXguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5c2V4aXRzLmg+CisKKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlICIuLi9xdWV1ZS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvcXVldWUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYWljYXNtLmgiCisjaW5jbHVkZSAiYWljYXNtX3N5bWJvbC5oIgorI2luY2x1ZGUgImFpY2FzbV9pbnNmb3JtYXQuaCIKKworaW50IHl5bGluZW5vOworY2hhciAqeXlmaWxlbmFtZTsKK2NoYXIgc3RvY2tfcHJlZml4W10gPSAiYWljXyI7CitjaGFyICpwcmVmaXggPSBzdG9ja19wcmVmaXg7CitjaGFyICpwYXRjaF9hcmdfbGlzdDsKK2NoYXIgKnZlcnNpb25zOworc3RhdGljIGNoYXIgZXJyYnVmWzI1NV07CitzdGF0aWMgY2hhciByZWdleF9wYXR0ZXJuWzI1NV07CitzdGF0aWMgc3ltYm9sX3QgKmN1cl9zeW1ib2w7CitzdGF0aWMgc3ltYm9sX3QgKmZpZWxkX3N5bWJvbDsKK3N0YXRpYyBzeW1ib2xfdCAqc2NiX29yX3NyYW1fc3ltYm9sOworc3RhdGljIHN5bXR5cGUgY3VyX3N5bXR5cGU7CitzdGF0aWMgc3ltYm9sX3JlZl90IGFjY3VtdWxhdG9yOworc3RhdGljIHN5bWJvbF9yZWZfdCBtb2RlX3B0cjsKK3N0YXRpYyBzeW1ib2xfcmVmX3QgYWxsb25lczsKK3N0YXRpYyBzeW1ib2xfcmVmX3QgYWxsemVyb3M7CitzdGF0aWMgc3ltYm9sX3JlZl90IG5vbmU7CitzdGF0aWMgc3ltYm9sX3JlZl90IHNpbmRleDsKK3N0YXRpYyBpbnQgaW5zdHJ1Y3Rpb25fcHRyOworc3RhdGljIGludCBudW1fc3JhbXM7CitzdGF0aWMgaW50IHNyYW1fb3Jfc2NiX29mZnNldDsKK3N0YXRpYyBpbnQgZG93bmxvYWRfY29uc3RhbnRfY291bnQ7CitzdGF0aWMgaW50IGluX2NyaXRpY2FsX3NlY3Rpb247CitzdGF0aWMgdV9pbnQgZW51bV9pbmNyZW1lbnQ7CitzdGF0aWMgdV9pbnQgZW51bV9uZXh0X3ZhbHVlOworCitzdGF0aWMgdm9pZCBwcm9jZXNzX2ZpZWxkKGludCBmaWVsZF90eXBlLCBzeW1ib2xfdCAqc3ltLCBpbnQgbWFzayk7CitzdGF0aWMgdm9pZCBpbml0aWFsaXplX3N5bWJvbChzeW1ib2xfdCAqc3ltYm9sKTsKK3N0YXRpYyB2b2lkIGFkZF9tYWNyb19hcmcoY29uc3QgY2hhciAqYXJndGV4dCwgaW50IHBvc2l0aW9uKTsKK3N0YXRpYyB2b2lkIGFkZF9tYWNyb19ib2R5KGNvbnN0IGNoYXIgKmJvZHl0ZXh0KTsKK3N0YXRpYyB2b2lkIHByb2Nlc3NfcmVnaXN0ZXIoc3ltYm9sX3QgKipwX3N5bWJvbCk7CitzdGF0aWMgdm9pZCBmb3JtYXRfMV9pbnN0cihpbnQgb3Bjb2RlLCBzeW1ib2xfcmVmX3QgKmRlc3QsCisJCQkgICBleHByZXNzaW9uX3QgKmltbWVkLCBzeW1ib2xfcmVmX3QgKnNyYywgaW50IHJldCk7CitzdGF0aWMgdm9pZCBmb3JtYXRfMl9pbnN0cihpbnQgb3Bjb2RlLCBzeW1ib2xfcmVmX3QgKmRlc3QsCisJCQkgICBleHByZXNzaW9uX3QgKnBsYWNlcywgc3ltYm9sX3JlZl90ICpzcmMsIGludCByZXQpOworc3RhdGljIHZvaWQgZm9ybWF0XzNfaW5zdHIoaW50IG9wY29kZSwgc3ltYm9sX3JlZl90ICpzcmMsCisJCQkgICBleHByZXNzaW9uX3QgKmltbWVkLCBzeW1ib2xfcmVmX3QgKmFkZHJlc3MpOworc3RhdGljIHZvaWQgdGVzdF9yZWFkYWJsZV9zeW1ib2woc3ltYm9sX3QgKnN5bWJvbCk7CitzdGF0aWMgdm9pZCB0ZXN0X3dyaXRhYmxlX3N5bWJvbChzeW1ib2xfdCAqc3ltYm9sKTsKK3N0YXRpYyB2b2lkIHR5cGVfY2hlY2soc3ltYm9sX3QgKnN5bWJvbCwgZXhwcmVzc2lvbl90ICpleHByZXNzaW9uLCBpbnQgYW5kX29wKTsKK3N0YXRpYyB2b2lkIG1ha2VfZXhwcmVzc2lvbihleHByZXNzaW9uX3QgKmltbWVkLCBpbnQgdmFsdWUpOworc3RhdGljIHZvaWQgYWRkX2NvbmRpdGlvbmFsKHN5bWJvbF90ICpzeW1ib2wpOworc3RhdGljIHZvaWQgYWRkX3ZlcnNpb24oY29uc3QgY2hhciAqdmVyc3RyaW5nKTsKK3N0YXRpYyBpbnQgIGlzX2Rvd25sb2FkX2NvbnN0KGV4cHJlc3Npb25fdCAqaW1tZWQpOworCisjZGVmaW5lIFNSQU1fU1lNTkFNRSAiU1JBTV9CQVNFIgorI2RlZmluZSBTQ0JfU1lNTkFNRSAiU0NCX0JBU0UiCislfQorCisldW5pb24geworCXVfaW50CQl2YWx1ZTsKKwljaGFyCQkqc3RyOworCXN5bWJvbF90CSpzeW07CisJc3ltYm9sX3JlZl90CXN5bV9yZWY7CisJZXhwcmVzc2lvbl90CWV4cHJlc3Npb247Cit9CisKKyV0b2tlbiBUX1JFR0lTVEVSCisKKyV0b2tlbiA8dmFsdWU+IFRfQ09OU1QKKworJXRva2VuIFRfRVhQT1JUCisKKyV0b2tlbiBUX0RPV05MT0FECisKKyV0b2tlbiBUX1NDQgorCisldG9rZW4gVF9TUkFNCisKKyV0b2tlbiBUX0FMSUFTCisKKyV0b2tlbiBUX1NJWkUKKworJXRva2VuIFRfRVhQUl9MU0hJRlQKKworJXRva2VuIFRfRVhQUl9SU0hJRlQKKworJXRva2VuIDx2YWx1ZT4gVF9BRERSRVNTCisKKyV0b2tlbiBUX0FDQ0VTU19NT0RFCisKKyV0b2tlbiBUX01PREVTCisKKyV0b2tlbiBUX0RFRklORQorCisldG9rZW4gVF9TRVRfU1JDX01PREUKKworJXRva2VuIFRfU0VUX0RTVF9NT0RFCisKKyV0b2tlbiA8dmFsdWU+IFRfTU9ERQorCisldG9rZW4gVF9CRUdJTl9DUworCisldG9rZW4gVF9FTkRfQ1MKKworJXRva2VuIFRfRklFTEQKKworJXRva2VuIFRfRU5VTQorCisldG9rZW4gVF9NQVNLCisKKyV0b2tlbiA8dmFsdWU+IFRfTlVNQkVSCisKKyV0b2tlbiA8c3RyPiBUX1BBVEggVF9TVFJJTkcgVF9BUkcgVF9NQUNST0JPRFkKKworJXRva2VuIDxzeW0+IFRfQ0VYUFIKKworJXRva2VuIFRfRU9GIFRfSU5DTFVERSBUX1ZFUlNJT04gVF9QUkVGSVggVF9QQVRDSF9BUkdfTElTVAorCisldG9rZW4gPHZhbHVlPiBUX1NIUiBUX1NITCBUX1JPUiBUX1JPTAorCisldG9rZW4gPHZhbHVlPiBUX01WSSBUX01PViBUX0NMUiBUX0JNT1YKKworJXRva2VuIDx2YWx1ZT4gVF9KTVAgVF9KQyBUX0pOQyBUX0pFIFRfSk5FIFRfSk5aIFRfSlogVF9DQUxMCisKKyV0b2tlbiA8dmFsdWU+IFRfQUREIFRfQURDCisKKyV0b2tlbiA8dmFsdWU+IFRfSU5DIFRfREVDCisKKyV0b2tlbiA8dmFsdWU+IFRfU1RDIFRfQ0xDCisKKyV0b2tlbiA8dmFsdWU+IFRfQ01QIFRfTk9UIFRfWE9SCisKKyV0b2tlbiA8dmFsdWU+IFRfVEVTVCBUX0FORAorCisldG9rZW4gPHZhbHVlPiBUX09SCisKKyV0b2tlbiBUX1JFVAorCisldG9rZW4gVF9OT1AKKworJXRva2VuIFRfQUNDVU0gVF9BTExPTkVTIFRfQUxMWkVST1MgVF9OT05FIFRfU0lOREVYIFRfTU9ERV9QVFIKKworJXRva2VuIFRfQQorCisldG9rZW4gPHN5bT4gVF9TWU1CT0wKKworJXRva2VuIFRfTkwKKworJXRva2VuIFRfSUYgVF9FTFNFIFRfRUxTRV9JRiBUX0VORElGCisKKyV0eXBlIDxzeW1fcmVmPiByZWdfc3ltYm9sIGFkZHJlc3MgZGVzdGluYXRpb24gc291cmNlIG9wdF9zb3VyY2UKKworJXR5cGUgPGV4cHJlc3Npb24+IGV4cHJlc3Npb24gaW1tZWRpYXRlIGltbWVkaWF0ZV9vcl9hCisKKyV0eXBlIDx2YWx1ZT4gZXhwb3J0IHJldCBmMV9vcGNvZGUgZjJfb3Bjb2RlIGptcF9qY19qbmNfY2FsbCBqel9qbnogamVfam5lCisKKyV0eXBlIDx2YWx1ZT4gbW9kZV92YWx1ZSBtb2RlX2xpc3QgbWFjcm9fYXJnbGlzdAorCislbGVmdCAnfCcKKyVsZWZ0ICcmJworJWxlZnQgVF9FWFBSX0xTSElGVCBUX0VYUFJfUlNISUZUCislbGVmdCAnKycgJy0nCislbGVmdCAnKicgJy8nCislcmlnaHQgJ34nCislbm9uYXNzb2MgVU1JTlVTCislJQorCitwcm9ncmFtOgorCWluY2x1ZGUKK3wJcHJvZ3JhbSBpbmNsdWRlCit8CXByZWZpeAorfAlwcm9ncmFtIHByZWZpeAorfAlwYXRjaF9hcmdfbGlzdAorfAlwcm9ncmFtIHBhdGNoX2FyZ19saXN0Cit8CXZlcnNpb24KK3wJcHJvZ3JhbSB2ZXJzaW9uCit8CXJlZ2lzdGVyCit8CXByb2dyYW0gcmVnaXN0ZXIKK3wJY29uc3RhbnQKK3wJcHJvZ3JhbSBjb25zdGFudAorfAltYWNyb2RlZm4KK3wJcHJvZ3JhbSBtYWNyb2RlZm4KK3wJc2NyYXRjaF9yYW0KK3wJcHJvZ3JhbSBzY3JhdGNoX3JhbQorfAlzY2IKK3wJcHJvZ3JhbSBzY2IKK3wJbGFiZWwKK3wJcHJvZ3JhbSBsYWJlbAorfAlzZXRfc3JjX21vZGUKK3wJcHJvZ3JhbSBzZXRfc3JjX21vZGUKK3wJc2V0X2RzdF9tb2RlCit8CXByb2dyYW0gc2V0X2RzdF9tb2RlCit8CWNyaXRpY2FsX3NlY3Rpb25fc3RhcnQKK3wJcHJvZ3JhbSBjcml0aWNhbF9zZWN0aW9uX3N0YXJ0Cit8CWNyaXRpY2FsX3NlY3Rpb25fZW5kCit8CXByb2dyYW0gY3JpdGljYWxfc2VjdGlvbl9lbmQKK3wJY29uZGl0aW9uYWwKK3wJcHJvZ3JhbSBjb25kaXRpb25hbAorfAljb2RlCit8CXByb2dyYW0gY29kZQorOworCitpbmNsdWRlOgorCVRfSU5DTFVERSAnPCcgVF9QQVRIICc+JworCXsKKwkJaW5jbHVkZV9maWxlKCQzLCBCUkFDS0VURURfSU5DTFVERSk7CisJfQorfAlUX0lOQ0xVREUgJyInIFRfUEFUSCAnIicKKwl7CisJCWluY2x1ZGVfZmlsZSgkMywgUVVPVEVEX0lOQ0xVREUpOworCX0KKzsKKworcHJlZml4OgorCVRfUFJFRklYICc9JyBUX1NUUklORworCXsKKwkJaWYgKHByZWZpeCAhPSBzdG9ja19wcmVmaXgpCisJCQlzdG9wKCJQcmVmaXggbXVsdGlwbHkgZGVmaW5lZCIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQlwcmVmaXggPSBzdHJkdXAoJDMpOworCQlpZiAocHJlZml4ID09IE5VTEwpCisJCQlzdG9wKCJVbmFibGUgdG8gcmVjb3JkIHByZWZpeCIsIEVYX1NPRlRXQVJFKTsKKwl9Cis7CisKK3BhdGNoX2FyZ19saXN0OgorCVRfUEFUQ0hfQVJHX0xJU1QgJz0nIFRfU1RSSU5HCisJeworCQlpZiAocGF0Y2hfYXJnX2xpc3QgIT0gTlVMTCkKKwkJCXN0b3AoIlBhdGNoIGFyZ3VtZW50IGxpc3QgbXVsdGlwbHkgZGVmaW5lZCIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQlwYXRjaF9hcmdfbGlzdCA9IHN0cmR1cCgkMyk7CisJCWlmIChwYXRjaF9hcmdfbGlzdCA9PSBOVUxMKQorCQkJc3RvcCgiVW5hYmxlIHRvIHJlY29yZCBwYXRjaCBhcmcgbGlzdCIsIEVYX1NPRlRXQVJFKTsKKwl9Cis7CisKK3ZlcnNpb246CisJVF9WRVJTSU9OICc9JyBUX1NUUklORworCXsgYWRkX3ZlcnNpb24oJDMpOyB9Cis7CisKK3JlZ2lzdGVyOgorCVRfUkVHSVNURVIgeyBjdXJfc3ltdHlwZSA9IFJFR0lTVEVSOyB9IHJlZ19kZWZpbml0aW9uCis7CisKK3JlZ19kZWZpbml0aW9uOgorCVRfU1lNQk9MICd7JworCQl7CisJCQlpZiAoJDEtPnR5cGUgIT0gVU5JTklUSUFMSVpFRCkgeworCQkJCXN0b3AoIlJlZ2lzdGVyIG11bHRpcGx5IGRlZmluZWQiLCBFWF9EQVRBRVJSKTsKKwkJCQkvKiBOT1RSRUFDSEVEICovCisJCQl9CisJCQljdXJfc3ltYm9sID0gJDE7IAorCQkJY3VyX3N5bWJvbC0+dHlwZSA9IGN1cl9zeW10eXBlOworCQkJaW5pdGlhbGl6ZV9zeW1ib2woY3VyX3N5bWJvbCk7CisJCX0KKwkJcmVnX2F0dHJpYnV0ZV9saXN0CisJJ30nCisJCXsgICAgICAgICAgICAgICAgICAgIAorCQkJLyoKKwkJCSAqIERlZmF1bHQgdG8gYWxsb3dpbmcgZXZlcnl0aGluZyBpbiBmb3IgcmVnaXN0ZXJzCisJCQkgKiB3aXRoIG5vIGJpdCBvciBtYXNrIGRlZmluaXRpb25zLgorCQkJICovCisJCQlpZiAoY3VyX3N5bWJvbC0+aW5mby5yaW5mby0+dmFsaWRfYml0bWFzayA9PSAwKQorCQkJCWN1cl9zeW1ib2wtPmluZm8ucmluZm8tPnZhbGlkX2JpdG1hc2sgPSAweEZGOworCisJCQlpZiAoY3VyX3N5bWJvbC0+aW5mby5yaW5mby0+c2l6ZSA9PSAwKQorCQkJCWN1cl9zeW1ib2wtPmluZm8ucmluZm8tPnNpemUgPSAxOworCisJCQkvKgorCQkJICogVGhpcyBtaWdodCBiZSB1c2VmdWwgZm9yIHJlZ2lzdGVycyB0b28uCisJCQkgKi8KKwkJCWlmIChjdXJfc3ltYm9sLT50eXBlICE9IFJFR0lTVEVSKSB7CisJCQkJaWYgKGN1cl9zeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3MgPT0gMCkKKwkJCQkJY3VyX3N5bWJvbC0+aW5mby5yaW5mby0+YWRkcmVzcyA9CisJCQkJCSAgICBzcmFtX29yX3NjYl9vZmZzZXQ7CisJCQkJc3JhbV9vcl9zY2Jfb2Zmc2V0ICs9CisJCQkJICAgIGN1cl9zeW1ib2wtPmluZm8ucmluZm8tPnNpemU7CisJCQl9CisJCQljdXJfc3ltYm9sID0gTlVMTDsKKwkJfQorOworCityZWdfYXR0cmlidXRlX2xpc3Q6CisJcmVnX2F0dHJpYnV0ZQorfAlyZWdfYXR0cmlidXRlX2xpc3QgcmVnX2F0dHJpYnV0ZQorOworCityZWdfYXR0cmlidXRlOgkJCisJcmVnX2FkZHJlc3MKK3wJc2l6ZQorfAlhY2Nlc3NfbW9kZQorfAltb2RlcworfAlmaWVsZF9kZWZuCit8CWVudW1fZGVmbgorfAltYXNrX2RlZm4KK3wJYWxpYXMKK3wJYWNjdW11bGF0b3IKK3wJbW9kZV9wb2ludGVyCit8CWFsbG9uZXMKK3wJYWxsemVyb3MKK3wJbm9uZQorfAlzaW5kZXgKKzsKKworcmVnX2FkZHJlc3M6CisJVF9BRERSRVNTIFRfTlVNQkVSCisJeworCQljdXJfc3ltYm9sLT5pbmZvLnJpbmZvLT5hZGRyZXNzID0gJDI7CisJfQorOworCitzaXplOgorCVRfU0laRSBUX05VTUJFUgorCXsKKwkJY3VyX3N5bWJvbC0+aW5mby5yaW5mby0+c2l6ZSA9ICQyOworCQlpZiAoc2NiX29yX3NyYW1fc3ltYm9sICE9IE5VTEwpIHsKKwkJCXVfaW50IG1heF9hZGRyOworCQkJdV9pbnQgc3ltX21heF9hZGRyOworCisJCQltYXhfYWRkciA9IHNjYl9vcl9zcmFtX3N5bWJvbC0+aW5mby5yaW5mby0+YWRkcmVzcworCQkJCSArIHNjYl9vcl9zcmFtX3N5bWJvbC0+aW5mby5yaW5mby0+c2l6ZTsKKwkJCXN5bV9tYXhfYWRkciA9IGN1cl9zeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3MKKwkJCQkgICAgICsgY3VyX3N5bWJvbC0+aW5mby5yaW5mby0+c2l6ZTsKKworCQkJaWYgKHN5bV9tYXhfYWRkciA+IG1heF9hZGRyKQorCQkJCXN0b3AoIlNDQiBvciBTUkFNIHNwYWNlIGV4aGF1c3RlZCIsIEVYX0RBVEFFUlIpOworCQl9CisJfQorOworCithY2Nlc3NfbW9kZToKKwlUX0FDQ0VTU19NT0RFIFRfTU9ERQorCXsKKwkJY3VyX3N5bWJvbC0+aW5mby5yaW5mby0+bW9kZSA9ICQyOworCX0KKzsKKworbW9kZXM6CisJVF9NT0RFUyBtb2RlX2xpc3QKKwl7CisJCWN1cl9zeW1ib2wtPmluZm8ucmluZm8tPm1vZGVzID0gJDI7CisJfQorOworCittb2RlX2xpc3Q6CisJbW9kZV92YWx1ZQorCXsKKwkJJCQgPSAkMTsKKwl9Cit8CW1vZGVfbGlzdCAnLCcgbW9kZV92YWx1ZQorCXsKKwkJJCQgPSAkMSB8ICQzOworCX0KKzsKKworbW9kZV92YWx1ZToKKwlUX05VTUJFUgorCXsKKwkJaWYgKCQxID4gNCkgeworCQkJc3RvcCgiVmFsaWQgcmVnaXN0ZXIgbW9kZXMgcmFuZ2UgYmV0d2VlbiAwIGFuZCA0LiIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisKKwkJJCQgPSAoMHgxIDw8ICQxKTsKKwl9Cit8CVRfU1lNQk9MCisJeworCQlzeW1ib2xfdCAqc3ltYm9sOworCisJCXN5bWJvbCA9ICQxOworCQlpZiAoc3ltYm9sLT50eXBlICE9IENPTlNUKSB7CisJCQlzdG9wKCJPbmx5IFwiY29uc3RcIiBzeW1ib2xzIGFsbG93ZWQgaW4gIgorCQkJICAgICAibW9kZSBkZWZpbml0aW9ucy4iLCBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQlpZiAoc3ltYm9sLT5pbmZvLmNpbmZvLT52YWx1ZSA+IDQpIHsKKwkJCXN0b3AoIlZhbGlkIHJlZ2lzdGVyIG1vZGVzIHJhbmdlIGJldHdlZW4gMCBhbmQgNC4iLAorCQkJICAgICBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQkkJCA9ICgweDEgPDwgc3ltYm9sLT5pbmZvLmNpbmZvLT52YWx1ZSk7CisJfQorOworCitmaWVsZF9kZWZuOgorCVRfRklFTEQKKwkJeworCQkJZmllbGRfc3ltYm9sID0gTlVMTDsKKwkJCWVudW1fbmV4dF92YWx1ZSA9IDA7CisJCQllbnVtX2luY3JlbWVudCA9IDE7CisJCX0KKwkneycgZW51bV9lbnRyeV9saXN0ICd9JworfAlUX0ZJRUxEIFRfU1lNQk9MIGV4cHJlc3Npb24KKwkJeworCQkJcHJvY2Vzc19maWVsZChGSUVMRCwgJDIsICQzLnZhbHVlKTsKKwkJCWZpZWxkX3N5bWJvbCA9ICQyOworCQkJZW51bV9uZXh0X3ZhbHVlID0gMDsKKwkJCWVudW1faW5jcmVtZW50ID0gMHgwMSA8PCAoZmZzKCQzLnZhbHVlKSAtIDEpOworCQl9CisJJ3snIGVudW1fZW50cnlfbGlzdCAnfScKK3wJVF9GSUVMRCBUX1NZTUJPTCBleHByZXNzaW9uCisJeworCQlwcm9jZXNzX2ZpZWxkKEZJRUxELCAkMiwgJDMudmFsdWUpOworCX0KKzsKKworZW51bV9kZWZuOgorCVRfRU5VTQorCQl7CisJCQlmaWVsZF9zeW1ib2wgPSBOVUxMOworCQkJZW51bV9uZXh0X3ZhbHVlID0gMDsKKwkJCWVudW1faW5jcmVtZW50ID0gMTsKKwkJfQorCSd7JyBlbnVtX2VudHJ5X2xpc3QgJ30nCit8CVRfRU5VTSBUX1NZTUJPTCBleHByZXNzaW9uCisJCXsKKwkJCXByb2Nlc3NfZmllbGQoRU5VTSwgJDIsICQzLnZhbHVlKTsKKwkJCWZpZWxkX3N5bWJvbCA9ICQyOworCQkJZW51bV9uZXh0X3ZhbHVlID0gMDsKKwkJCWVudW1faW5jcmVtZW50ID0gMHgwMSA8PCAoZmZzKCQzLnZhbHVlKSAtIDEpOworCQl9CisJJ3snIGVudW1fZW50cnlfbGlzdCAnfScKKzsKKworZW51bV9lbnRyeV9saXN0OgorCWVudW1fZW50cnkKK3wJZW51bV9lbnRyeV9saXN0ICcsJyBlbnVtX2VudHJ5Cis7CisKK2VudW1fZW50cnk6CisJVF9TWU1CT0wKKwl7CisJCXByb2Nlc3NfZmllbGQoRU5VTV9FTlRSWSwgJDEsIGVudW1fbmV4dF92YWx1ZSk7CisJCWVudW1fbmV4dF92YWx1ZSArPSBlbnVtX2luY3JlbWVudDsKKwl9Cit8CVRfU1lNQk9MIGV4cHJlc3Npb24KKwl7CisJCXByb2Nlc3NfZmllbGQoRU5VTV9FTlRSWSwgJDEsICQyLnZhbHVlKTsKKwkJZW51bV9uZXh0X3ZhbHVlID0gJDIudmFsdWUgKyBlbnVtX2luY3JlbWVudDsKKwl9Cis7CisKK21hc2tfZGVmbjoKKwlUX01BU0sgVF9TWU1CT0wgZXhwcmVzc2lvbgorCXsKKwkJcHJvY2Vzc19maWVsZChNQVNLLCAkMiwgJDMudmFsdWUpOworCX0KKzsKKworYWxpYXM6CisJVF9BTElBUwlUX1NZTUJPTAorCXsKKwkJaWYgKCQyLT50eXBlICE9IFVOSU5JVElBTElaRUQpIHsKKwkJCXN0b3AoIlJlLWRlZmluaXRpb24gb2YgcmVnaXN0ZXIgYWxpYXMiLAorCQkJICAgICBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQkkMi0+dHlwZSA9IEFMSUFTOworCQlpbml0aWFsaXplX3N5bWJvbCgkMik7CisJCSQyLT5pbmZvLmFpbmZvLT5wYXJlbnQgPSBjdXJfc3ltYm9sOworCX0KKzsKKworYWNjdW11bGF0b3I6CisJVF9BQ0NVTQorCXsKKwkJaWYgKGFjY3VtdWxhdG9yLnN5bWJvbCAhPSBOVUxMKSB7CisJCQlzdG9wKCJPbmx5IG9uZSBhY2N1bXVsYXRvciBkZWZpbml0aW9uIGFsbG93ZWQiLAorCQkJICAgICBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQlhY2N1bXVsYXRvci5zeW1ib2wgPSBjdXJfc3ltYm9sOworCX0KKzsKKworbW9kZV9wb2ludGVyOgorCVRfTU9ERV9QVFIKKwl7CisJCWlmIChtb2RlX3B0ci5zeW1ib2wgIT0gTlVMTCkgeworCQkJc3RvcCgiT25seSBvbmUgbW9kZSBwb2ludGVyIGRlZmluaXRpb24gYWxsb3dlZCIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCW1vZGVfcHRyLnN5bWJvbCA9IGN1cl9zeW1ib2w7CisJfQorOworCithbGxvbmVzOgorCVRfQUxMT05FUworCXsKKwkJaWYgKGFsbG9uZXMuc3ltYm9sICE9IE5VTEwpIHsKKwkJCXN0b3AoIk9ubHkgb25lIGRlZmluaXRpb24gb2YgYWxsb25lcyBhbGxvd2VkIiwKKwkJCSAgICAgRVhfREFUQUVSUik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJYWxsb25lcy5zeW1ib2wgPSBjdXJfc3ltYm9sOworCX0KKzsKKworYWxsemVyb3M6CisJVF9BTExaRVJPUworCXsKKwkJaWYgKGFsbHplcm9zLnN5bWJvbCAhPSBOVUxMKSB7CisJCQlzdG9wKCJPbmx5IG9uZSBkZWZpbml0aW9uIG9mIGFsbHplcm9zIGFsbG93ZWQiLAorCQkJICAgICBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQlhbGx6ZXJvcy5zeW1ib2wgPSBjdXJfc3ltYm9sOworCX0KKzsKKworbm9uZToKKwlUX05PTkUKKwl7CisJCWlmIChub25lLnN5bWJvbCAhPSBOVUxMKSB7CisJCQlzdG9wKCJPbmx5IG9uZSBkZWZpbml0aW9uIG9mIG5vbmUgYWxsb3dlZCIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCW5vbmUuc3ltYm9sID0gY3VyX3N5bWJvbDsKKwl9Cis7CisKK3NpbmRleDoKKwlUX1NJTkRFWAorCXsKKwkJaWYgKHNpbmRleC5zeW1ib2wgIT0gTlVMTCkgeworCQkJc3RvcCgiT25seSBvbmUgZGVmaW5pdGlvbiBvZiBzaW5kZXggYWxsb3dlZCIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCXNpbmRleC5zeW1ib2wgPSBjdXJfc3ltYm9sOworCX0KKzsKKworZXhwcmVzc2lvbjoKKwlleHByZXNzaW9uICd8JyBleHByZXNzaW9uCisJeworCQkgJCQudmFsdWUgPSAkMS52YWx1ZSB8ICQzLnZhbHVlOworCQkgc3ltbGlzdF9tZXJnZSgmJCQucmVmZXJlbmNlZF9zeW1zLAorCQkJICAgICAgICYkMS5yZWZlcmVuY2VkX3N5bXMsCisJCQkgICAgICAgJiQzLnJlZmVyZW5jZWRfc3ltcyk7CisJfQorfAlleHByZXNzaW9uICcmJyBleHByZXNzaW9uCisJeworCQkkJC52YWx1ZSA9ICQxLnZhbHVlICYgJDMudmFsdWU7CisJCXN5bWxpc3RfbWVyZ2UoJiQkLnJlZmVyZW5jZWRfc3ltcywKKwkJCSAgICAgICAmJDEucmVmZXJlbmNlZF9zeW1zLAorCQkJICAgICAgICYkMy5yZWZlcmVuY2VkX3N5bXMpOworCX0KK3wJZXhwcmVzc2lvbiAnKycgZXhwcmVzc2lvbgorCXsKKwkJJCQudmFsdWUgPSAkMS52YWx1ZSArICQzLnZhbHVlOworCQlzeW1saXN0X21lcmdlKCYkJC5yZWZlcmVuY2VkX3N5bXMsCisJCQkgICAgICAgJiQxLnJlZmVyZW5jZWRfc3ltcywKKwkJCSAgICAgICAmJDMucmVmZXJlbmNlZF9zeW1zKTsKKwl9Cit8CWV4cHJlc3Npb24gJy0nIGV4cHJlc3Npb24KKwl7CisJCSQkLnZhbHVlID0gJDEudmFsdWUgLSAkMy52YWx1ZTsKKwkJc3ltbGlzdF9tZXJnZSgmKCQkLnJlZmVyZW5jZWRfc3ltcyksCisJCQkgICAgICAgJigkMS5yZWZlcmVuY2VkX3N5bXMpLAorCQkJICAgICAgICYoJDMucmVmZXJlbmNlZF9zeW1zKSk7CisJfQorfAlleHByZXNzaW9uICcqJyBleHByZXNzaW9uCisJeworCQkkJC52YWx1ZSA9ICQxLnZhbHVlICogJDMudmFsdWU7CisJCXN5bWxpc3RfbWVyZ2UoJigkJC5yZWZlcmVuY2VkX3N5bXMpLAorCQkJICAgICAgICYoJDEucmVmZXJlbmNlZF9zeW1zKSwKKwkJCSAgICAgICAmKCQzLnJlZmVyZW5jZWRfc3ltcykpOworCX0KK3wJZXhwcmVzc2lvbiAnLycgZXhwcmVzc2lvbgorCXsKKwkJJCQudmFsdWUgPSAkMS52YWx1ZSAvICQzLnZhbHVlOworCQlzeW1saXN0X21lcmdlKCYoJCQucmVmZXJlbmNlZF9zeW1zKSwKKwkJCSAgICAgICAmKCQxLnJlZmVyZW5jZWRfc3ltcyksCisJCQkgICAgICAgJigkMy5yZWZlcmVuY2VkX3N5bXMpKTsKKwl9Cit8IAlleHByZXNzaW9uIFRfRVhQUl9MU0hJRlQgZXhwcmVzc2lvbgorCXsKKwkJJCQudmFsdWUgPSAkMS52YWx1ZSA8PCAkMy52YWx1ZTsKKwkJc3ltbGlzdF9tZXJnZSgmJCQucmVmZXJlbmNlZF9zeW1zLAorCQkJICAgICAgICYkMS5yZWZlcmVuY2VkX3N5bXMsCisJCQkgICAgICAgJiQzLnJlZmVyZW5jZWRfc3ltcyk7CisJfQorfCAJZXhwcmVzc2lvbiBUX0VYUFJfUlNISUZUIGV4cHJlc3Npb24KKwl7CisJCSQkLnZhbHVlID0gJDEudmFsdWUgPj4gJDMudmFsdWU7CisJCXN5bWxpc3RfbWVyZ2UoJiQkLnJlZmVyZW5jZWRfc3ltcywKKwkJCSAgICAgICAmJDEucmVmZXJlbmNlZF9zeW1zLAorCQkJICAgICAgICYkMy5yZWZlcmVuY2VkX3N5bXMpOworCX0KK3wJJygnIGV4cHJlc3Npb24gJyknCisJeworCQkkJCA9ICQyOworCX0KK3wJJ34nIGV4cHJlc3Npb24KKwl7CisJCSQkID0gJDI7CisJCSQkLnZhbHVlID0gKH4kJC52YWx1ZSkgJiAweEZGOworCX0KK3wJJy0nIGV4cHJlc3Npb24gJXByZWMgVU1JTlVTCisJeworCQkkJCA9ICQyOworCQkkJC52YWx1ZSA9IC0kJC52YWx1ZTsKKwl9Cit8CVRfTlVNQkVSCisJeworCQkkJC52YWx1ZSA9ICQxOworCQlTTElTVF9JTklUKCYkJC5yZWZlcmVuY2VkX3N5bXMpOworCX0KK3wJVF9TWU1CT0wKKwl7CisJCXN5bWJvbF90ICpzeW1ib2w7CisKKwkJc3ltYm9sID0gJDE7CisJCXN3aXRjaCAoc3ltYm9sLT50eXBlKSB7CisJCWNhc2UgQUxJQVM6CisJCQlzeW1ib2wgPSAkMS0+aW5mby5haW5mby0+cGFyZW50OworCQljYXNlIFJFR0lTVEVSOgorCQljYXNlIFNDQkxPQzoKKwkJY2FzZSBTUkFNTE9DOgorCQkJJCQudmFsdWUgPSBzeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3M7CisJCQlicmVhazsKKwkJY2FzZSBNQVNLOgorCQljYXNlIEZJRUxEOgorCQljYXNlIEVOVU06CisJCWNhc2UgRU5VTV9FTlRSWToKKwkJCSQkLnZhbHVlID0gc3ltYm9sLT5pbmZvLmZpbmZvLT52YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIERPV05MT0FEX0NPTlNUOgorCQljYXNlIENPTlNUOgorCQkJJCQudmFsdWUgPSBzeW1ib2wtPmluZm8uY2luZm8tPnZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgVU5JTklUSUFMSVpFRDoKKwkJZGVmYXVsdDoKKwkJeworCQkJc25wcmludGYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwKKwkJCQkgIlVuZGVmaW5lZCBzeW1ib2wgJXMgcmVmZXJlbmNlZCIsCisJCQkJIHN5bWJvbC0+bmFtZSk7CisJCQlzdG9wKGVycmJ1ZiwgRVhfREFUQUVSUik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCQlicmVhazsKKwkJfQorCQl9CisJCVNMSVNUX0lOSVQoJiQkLnJlZmVyZW5jZWRfc3ltcyk7CisJCXN5bWxpc3RfYWRkKCYkJC5yZWZlcmVuY2VkX3N5bXMsIHN5bWJvbCwgU1lNTElTVF9JTlNFUlRfSEVBRCk7CisJfQorOworCitjb25zdGFudDoKKwlUX0NPTlNUIFRfU1lNQk9MIGV4cHJlc3Npb24gCisJeworCQlpZiAoJDItPnR5cGUgIT0gVU5JTklUSUFMSVpFRCkgeworCQkJc3RvcCgiUmUtZGVmaW5pdGlvbiBvZiBzeW1ib2wgYXMgYSBjb25zdGFudCIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCSQyLT50eXBlID0gQ09OU1Q7CisJCWluaXRpYWxpemVfc3ltYm9sKCQyKTsKKwkJJDItPmluZm8uY2luZm8tPnZhbHVlID0gJDMudmFsdWU7CisJfQorfAlUX0NPTlNUIFRfU1lNQk9MIFRfRE9XTkxPQUQKKwl7CisJCWlmICgkMSkgeworCQkJc3RvcCgiSW52YWxpZCBkb3dubG9hZGVkIGNvbnN0YW50IGRlY2xhcmF0aW9uIiwKKwkJCSAgICAgRVhfREFUQUVSUik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJaWYgKCQyLT50eXBlICE9IFVOSU5JVElBTElaRUQpIHsKKwkJCXN0b3AoIlJlLWRlZmluaXRpb24gb2Ygc3ltYm9sIGFzIGEgZG93bmxvYWRlZCBjb25zdGFudCIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCSQyLT50eXBlID0gRE9XTkxPQURfQ09OU1Q7CisJCWluaXRpYWxpemVfc3ltYm9sKCQyKTsKKwkJJDItPmluZm8uY2luZm8tPnZhbHVlID0gZG93bmxvYWRfY29uc3RhbnRfY291bnQrKzsKKwl9Cis7CisKK21hY3JvZGVmbl9wcm9sb2d1ZToKKwlUX0RFRklORSBUX1NZTUJPTAorCXsKKwkJaWYgKCQyLT50eXBlICE9IFVOSU5JVElBTElaRUQpIHsKKwkJCXN0b3AoIlJlLWRlZmluaXRpb24gb2Ygc3ltYm9sIGFzIGEgbWFjcm8iLAorCQkJICAgICBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQljdXJfc3ltYm9sID0gJDI7CisJCWN1cl9zeW1ib2wtPnR5cGUgPSBNQUNSTzsKKwkJaW5pdGlhbGl6ZV9zeW1ib2woY3VyX3N5bWJvbCk7CisJfQorOworCittYWNyb2RlZm46CisJbWFjcm9kZWZuX3Byb2xvZ3VlIFRfTUFDUk9CT0RZCisJeworCQlhZGRfbWFjcm9fYm9keSgkMik7CisJfQorfAltYWNyb2RlZm5fcHJvbG9ndWUgJygnIG1hY3JvX2FyZ2xpc3QgJyknIFRfTUFDUk9CT0RZCisJeworCQlhZGRfbWFjcm9fYm9keSgkNSk7CisJCWN1cl9zeW1ib2wtPmluZm8ubWFjcm9pbmZvLT5uYXJnID0gJDM7CisJfQorOworCittYWNyb19hcmdsaXN0OgorCXsKKwkJLyogTWFjcm9zIGNhbiB0YWtlIG5vIGFyZ3VtZW50cyAqLworCQkkJCA9IDA7CisJfQorfAlUX0FSRworCXsKKwkJJCQgPSAxOworCQlhZGRfbWFjcm9fYXJnKCQxLCAwKTsKKwl9Cit8CW1hY3JvX2FyZ2xpc3QgJywnIFRfQVJHCisJeworCQlpZiAoJDEgPT0gMCkgeworCQkJc3RvcCgiQ29tbWEgd2l0aG91dCBwcmVjZWVkaW5nIGFyZ3VtZW50IGluIGFyZyBsaXN0IiwKKwkJCSAgICAgRVhfREFUQUVSUik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJJCQgPSAkMSArIDE7CisJCWFkZF9tYWNyb19hcmcoJDMsICQxKTsKKwl9Cis7CisKK3NjcmF0Y2hfcmFtOgorCVRfU1JBTSAneycKKwkJeworCQkJc25wcmludGYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgIiVzJWQiLCBTUkFNX1NZTU5BTUUsCisJCQkJIG51bV9zcmFtcyk7CisJCQljdXJfc3ltYm9sID0gc3ltdGFibGVfZ2V0KFNSQU1fU1lNTkFNRSk7CisJCQljdXJfc3ltdHlwZSA9IFNSQU1MT0M7CisJCQljdXJfc3ltYm9sLT50eXBlID0gU1JBTUxPQzsKKwkJCWluaXRpYWxpemVfc3ltYm9sKGN1cl9zeW1ib2wpOworCQl9CisJCXJlZ19hZGRyZXNzCisJCXsKKwkJCXNyYW1fb3Jfc2NiX29mZnNldCA9IGN1cl9zeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3M7CisJCX0KKwkJc2l6ZQorCQl7CisJCQlzY2Jfb3Jfc3JhbV9zeW1ib2wgPSBjdXJfc3ltYm9sOworCQl9CisJCXNjYl9vcl9zcmFtX2F0dHJpYnV0ZXMKKwknfScKKwkJeworCQkJY3VyX3N5bWJvbCA9IE5VTEw7CisJCQlzY2Jfb3Jfc3JhbV9zeW1ib2wgPSBOVUxMOworCQl9Cis7CisKK3NjYjoKKwlUX1NDQiAneycKKwkJeworCQkJY3VyX3N5bWJvbCA9IHN5bXRhYmxlX2dldChTQ0JfU1lNTkFNRSk7CisJCQljdXJfc3ltdHlwZSA9IFNDQkxPQzsKKwkJCWlmIChjdXJfc3ltYm9sLT50eXBlICE9IFVOSU5JVElBTElaRUQpIHsKKwkJCQlzdG9wKCJPbmx5IG9uZSBTUkFNIGRlZmluaXRpb24gYWxsb3dlZCIsCisJCQkJICAgICBFWF9TT0ZUV0FSRSk7CisJCQkJLyogTk9UUkVBQ0hFRCAqLworCQkJfQorCQkJY3VyX3N5bWJvbC0+dHlwZSA9IFNDQkxPQzsKKwkJCWluaXRpYWxpemVfc3ltYm9sKGN1cl9zeW1ib2wpOworCQkJLyogNjQgYnl0ZXMgb2YgU0NCIHNwYWNlICovCisJCQljdXJfc3ltYm9sLT5pbmZvLnJpbmZvLT5zaXplID0gNjQ7CisJCX0KKwkJcmVnX2FkZHJlc3MKKwkJeworCQkJc3JhbV9vcl9zY2Jfb2Zmc2V0ID0gY3VyX3N5bWJvbC0+aW5mby5yaW5mby0+YWRkcmVzczsKKwkJfQorCQlzaXplCisJCXsKKwkJCXNjYl9vcl9zcmFtX3N5bWJvbCA9IGN1cl9zeW1ib2w7CisJCX0KKwkJc2NiX29yX3NyYW1fYXR0cmlidXRlcworCSd9JworCQl7CisJCQljdXJfc3ltYm9sID0gTlVMTDsKKwkJCXNjYl9vcl9zcmFtX3N5bWJvbCA9IE5VTEw7CisJCX0KKzsKKworc2NiX29yX3NyYW1fYXR0cmlidXRlczoKKwkvKiBOVUxMIGRlZmluaXRpb24gaXMgb2theSAqLworfAltb2RlcworfAlzY2Jfb3Jfc3JhbV9yZWdfbGlzdAorfAltb2RlcyBzY2Jfb3Jfc3JhbV9yZWdfbGlzdAorOworCitzY2Jfb3Jfc3JhbV9yZWdfbGlzdDoKKwlyZWdfZGVmaW5pdGlvbgorfAlzY2Jfb3Jfc3JhbV9yZWdfbGlzdCByZWdfZGVmaW5pdGlvbgorOworCityZWdfc3ltYm9sOgorCVRfU1lNQk9MCisJeworCQlwcm9jZXNzX3JlZ2lzdGVyKCYkMSk7CisJCSQkLnN5bWJvbCA9ICQxOworCQkkJC5vZmZzZXQgPSAwOworCX0KK3wJVF9TWU1CT0wgJ1snIFRfU1lNQk9MICddJworCXsKKwkJcHJvY2Vzc19yZWdpc3RlcigmJDEpOworCQlpZiAoJDMtPnR5cGUgIT0gQ09OU1QpIHsKKwkJCXN0b3AoInJlZ2lzdGVyIG9mZnNldCBtdXN0IGJlIGEgY29uc3RhbnQiLCBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQlpZiAoKCQzLT5pbmZvLmNpbmZvLT52YWx1ZSArIDEpID4gJDEtPmluZm8ucmluZm8tPnNpemUpIHsKKwkJCXN0b3AoIkFjY2Vzc2luZyBvZmZzZXQgYmV5b25kIHJhbmdlIG9mIHJlZ2lzdGVyIiwKKwkJCSAgICAgRVhfREFUQUVSUik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJJCQuc3ltYm9sID0gJDE7CisJCSQkLm9mZnNldCA9ICQzLT5pbmZvLmNpbmZvLT52YWx1ZTsKKwl9Cit8CVRfU1lNQk9MICdbJyBUX05VTUJFUiAnXScKKwl7CisJCXByb2Nlc3NfcmVnaXN0ZXIoJiQxKTsKKwkJaWYgKCgkMyArIDEpID4gJDEtPmluZm8ucmluZm8tPnNpemUpIHsKKwkJCXN0b3AoIkFjY2Vzc2luZyBvZmZzZXQgYmV5b25kIHJhbmdlIG9mIHJlZ2lzdGVyIiwKKwkJCSAgICAgRVhfREFUQUVSUik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJJCQuc3ltYm9sID0gJDE7CisJCSQkLm9mZnNldCA9ICQzOworCX0KK3wJVF9BCisJeworCQlpZiAoYWNjdW11bGF0b3Iuc3ltYm9sID09IE5VTEwpIHsKKwkJCXN0b3AoIk5vIGFjY3VtdWxhdG9yIGhhcyBiZWVuIGRlZmluZWQiLCBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQkkJC5zeW1ib2wgPSBhY2N1bXVsYXRvci5zeW1ib2w7CisJCSQkLm9mZnNldCA9IDA7CisJfQorOworCitkZXN0aW5hdGlvbjoKKwlyZWdfc3ltYm9sCisJeworCQl0ZXN0X3dyaXRhYmxlX3N5bWJvbCgkMS5zeW1ib2wpOworCQkkJCA9ICQxOworCX0KKzsKKworaW1tZWRpYXRlOgorCWV4cHJlc3Npb24KKwl7ICQkID0gJDE7IH0KKzsKKworaW1tZWRpYXRlX29yX2E6CisJZXhwcmVzc2lvbgorCXsKKwkJaWYgKCQxLnZhbHVlID09IDAgJiYgaXNfZG93bmxvYWRfY29uc3QoJiQxKSA9PSAwKSB7CisJCQlzbnByaW50ZihlcnJidWYsIHNpemVvZihlcnJidWYpLAorCQkJCSAiXG5FeHByZXNzaW9uIGV2YWx1YXRlcyB0byAwIGFuZCB0aHVzICIKKwkJCQkgInJlZmVyZW5jZXMgdGhlIGFjY3VtdWxhdG9yLlxuICIKKwkJCQkgIklmIHRoaXMgaXMgdGhlIGRlc2lyZWQgZWZmZWN0LCB1c2UgJ0EnICIKKwkJCQkgImluc3RlYWQuXG4iKTsKKwkJCXN0b3AoZXJyYnVmLCBFWF9EQVRBRVJSKTsKKwkJfQorCQkkJCA9ICQxOworCX0KK3wJVF9BCisJeworCQlTTElTVF9JTklUKCYkJC5yZWZlcmVuY2VkX3N5bXMpOworCQlzeW1saXN0X2FkZCgmJCQucmVmZXJlbmNlZF9zeW1zLCBhY2N1bXVsYXRvci5zeW1ib2wsCisJCQkgICAgU1lNTElTVF9JTlNFUlRfSEVBRCk7CisJCSQkLnZhbHVlID0gMDsKKwl9Cis7CisKK3NvdXJjZToKKwlyZWdfc3ltYm9sCisJeworCQl0ZXN0X3JlYWRhYmxlX3N5bWJvbCgkMS5zeW1ib2wpOworCQkkJCA9ICQxOworCX0KKzsKKworb3B0X3NvdXJjZToKKwl7CisJCSQkLnN5bWJvbCA9IE5VTEw7CisJCSQkLm9mZnNldCA9IDA7CisJfQorfAknLCcgc291cmNlCisJeyAkJCA9ICQyOyB9Cis7CisKK3JldDoKKwl7ICQkID0gMDsgfQorfAlUX1JFVAorCXsgJCQgPSAxOyB9Cis7CisKK3NldF9zcmNfbW9kZToKKwlUX1NFVF9TUkNfTU9ERSBUX05VTUJFUiAnOycKKwl7CisJCXNyY19tb2RlID0gJDI7CisJfQorOworCitzZXRfZHN0X21vZGU6CisJVF9TRVRfRFNUX01PREUgVF9OVU1CRVIgJzsnCisJeworCQlkc3RfbW9kZSA9ICQyOworCX0KKzsKKworY3JpdGljYWxfc2VjdGlvbl9zdGFydDoKKwlUX0JFR0lOX0NTICc7JworCXsKKwkJY3JpdGljYWxfc2VjdGlvbl90ICpjczsKKworCQlpZiAoaW5fY3JpdGljYWxfc2VjdGlvbiAhPSBGQUxTRSkgeworCQkJc3RvcCgiQ3JpdGljYWwgU2VjdGlvbiB3aXRoaW4gQ3JpdGljYWwgU2VjdGlvbiIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCWNzID0gY3NfYWxsb2MoKTsKKwkJY3MtPmJlZ2luX2FkZHIgPSBpbnN0cnVjdGlvbl9wdHI7CisJCWluX2NyaXRpY2FsX3NlY3Rpb24gPSBUUlVFOworCX0KKzsKKworY3JpdGljYWxfc2VjdGlvbl9lbmQ6CisJVF9FTkRfQ1MgJzsnCisJeworCQljcml0aWNhbF9zZWN0aW9uX3QgKmNzOworCisJCWlmIChpbl9jcml0aWNhbF9zZWN0aW9uID09IEZBTFNFKSB7CisJCQlzdG9wKCJVbmJhbGxhbmNlZCAnZW5kX2NzJyIsIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCWNzID0gVEFJTFFfTEFTVCgmY3NfdGFpbHEsIGNzX3RhaWxxKTsKKwkJY3MtPmVuZF9hZGRyID0gaW5zdHJ1Y3Rpb25fcHRyOworCQlpbl9jcml0aWNhbF9zZWN0aW9uID0gRkFMU0U7CisJfQorOworCitleHBvcnQ6CisJeyAkJCA9IDA7IH0KK3wJVF9FWFBPUlQKKwl7ICQkID0gMTsgfQorOworCitsYWJlbDoKKwlleHBvcnQgVF9TWU1CT0wgJzonCisJeworCQlpZiAoJDItPnR5cGUgIT0gVU5JTklUSUFMSVpFRCkgeworCQkJc3RvcCgiUHJvZ3JhbSBsYWJlbCBtdWx0aXBseSBkZWZpbmVkIiwgRVhfREFUQUVSUik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJJDItPnR5cGUgPSBMQUJFTDsKKwkJaW5pdGlhbGl6ZV9zeW1ib2woJDIpOworCQkkMi0+aW5mby5saW5mby0+YWRkcmVzcyA9IGluc3RydWN0aW9uX3B0cjsKKwkJJDItPmluZm8ubGluZm8tPmV4cG9ydGVkID0gJDE7CisJfQorOworCithZGRyZXNzOgorCVRfU1lNQk9MCisJeworCQkkJC5zeW1ib2wgPSAkMTsKKwkJJCQub2Zmc2V0ID0gMDsKKwl9Cit8CVRfU1lNQk9MICcrJyBUX05VTUJFUgorCXsKKwkJJCQuc3ltYm9sID0gJDE7CisJCSQkLm9mZnNldCA9ICQzOworCX0KK3wJVF9TWU1CT0wgJy0nIFRfTlVNQkVSCisJeworCQkkJC5zeW1ib2wgPSAkMTsKKwkJJCQub2Zmc2V0ID0gLSQzOworCX0KK3wJJy4nCisJeworCQkkJC5zeW1ib2wgPSBOVUxMOworCQkkJC5vZmZzZXQgPSAwOworCX0KK3wJJy4nICcrJyBUX05VTUJFUgorCXsKKwkJJCQuc3ltYm9sID0gTlVMTDsKKwkJJCQub2Zmc2V0ID0gJDM7CisJfQorfAknLicgJy0nIFRfTlVNQkVSCisJeworCQkkJC5zeW1ib2wgPSBOVUxMOworCQkkJC5vZmZzZXQgPSAtJDM7CisJfQorOworCitjb25kaXRpb25hbDoKKwlUX0lGIFRfQ0VYUFIgJ3snCisJeworCQlzY29wZV90ICpuZXdfc2NvcGU7CisKKwkJYWRkX2NvbmRpdGlvbmFsKCQyKTsKKwkJbmV3X3Njb3BlID0gc2NvcGVfYWxsb2MoKTsKKwkJbmV3X3Njb3BlLT50eXBlID0gU0NPUEVfSUY7CisJCW5ld19zY29wZS0+YmVnaW5fYWRkciA9IGluc3RydWN0aW9uX3B0cjsKKwkJbmV3X3Njb3BlLT5mdW5jX251bSA9ICQyLT5pbmZvLmNvbmRpbmZvLT5mdW5jX251bTsKKwl9Cit8CVRfRUxTRSBUX0lGIFRfQ0VYUFIgJ3snCisJeworCQlzY29wZV90ICpuZXdfc2NvcGU7CisJCXNjb3BlX3QgKnNjb3BlX2NvbnRleHQ7CisJCXNjb3BlX3QgKmxhc3Rfc2NvcGU7CisKKwkJLyoKKwkJICogRW5zdXJlIHRoYXQgdGhlIHByZXZpb3VzIHNjb3BlIGlzIGVpdGhlciBhbgorCQkgKiBpZiBvciBhbmQgZWxzZSBpZi4KKwkJICovCisJCXNjb3BlX2NvbnRleHQgPSBTTElTVF9GSVJTVCgmc2NvcGVfc3RhY2spOworCQlsYXN0X3Njb3BlID0gVEFJTFFfTEFTVCgmc2NvcGVfY29udGV4dC0+aW5uZXJfc2NvcGUsCisJCQkJCXNjb3BlX3RhaWxxKTsKKwkJaWYgKGxhc3Rfc2NvcGUgPT0gTlVMTAorCQkgfHwgbGFzdF9zY29wZS0+dHlwZSA9PSBUX0VMU0UpIHsKKworCQkJc3RvcCgiJ2Vsc2UgaWYnIHdpdGhvdXQgbGVhZGluZyAnaWYnIiwgRVhfREFUQUVSUik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJYWRkX2NvbmRpdGlvbmFsKCQzKTsKKwkJbmV3X3Njb3BlID0gc2NvcGVfYWxsb2MoKTsKKwkJbmV3X3Njb3BlLT50eXBlID0gU0NPUEVfRUxTRV9JRjsKKwkJbmV3X3Njb3BlLT5iZWdpbl9hZGRyID0gaW5zdHJ1Y3Rpb25fcHRyOworCQluZXdfc2NvcGUtPmZ1bmNfbnVtID0gJDMtPmluZm8uY29uZGluZm8tPmZ1bmNfbnVtOworCX0KK3wJVF9FTFNFICd7JworCXsKKwkJc2NvcGVfdCAqbmV3X3Njb3BlOworCQlzY29wZV90ICpzY29wZV9jb250ZXh0OworCQlzY29wZV90ICpsYXN0X3Njb3BlOworCisJCS8qCisJCSAqIEVuc3VyZSB0aGF0IHRoZSBwcmV2aW91cyBzY29wZSBpcyBlaXRoZXIgYW4KKwkJICogaWYgb3IgYW5kIGVsc2UgaWYuCisJCSAqLworCQlzY29wZV9jb250ZXh0ID0gU0xJU1RfRklSU1QoJnNjb3BlX3N0YWNrKTsKKwkJbGFzdF9zY29wZSA9IFRBSUxRX0xBU1QoJnNjb3BlX2NvbnRleHQtPmlubmVyX3Njb3BlLAorCQkJCQlzY29wZV90YWlscSk7CisJCWlmIChsYXN0X3Njb3BlID09IE5VTEwKKwkJIHx8IGxhc3Rfc2NvcGUtPnR5cGUgPT0gU0NPUEVfRUxTRSkgeworCisJCQlzdG9wKCInZWxzZScgd2l0aG91dCBsZWFkaW5nICdpZiciLCBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQluZXdfc2NvcGUgPSBzY29wZV9hbGxvYygpOworCQluZXdfc2NvcGUtPnR5cGUgPSBTQ09QRV9FTFNFOworCQluZXdfc2NvcGUtPmJlZ2luX2FkZHIgPSBpbnN0cnVjdGlvbl9wdHI7CisJfQorOworCitjb25kaXRpb25hbDoKKwknfScKKwl7CisJCXNjb3BlX3QgKnNjb3BlX2NvbnRleHQ7CisKKwkJc2NvcGVfY29udGV4dCA9IFNMSVNUX0ZJUlNUKCZzY29wZV9zdGFjayk7CisJCWlmIChzY29wZV9jb250ZXh0LT50eXBlID09IFNDT1BFX1JPT1QpIHsKKwkJCXN0b3AoIlVuZXhwZWN0ZWQgJ30nIGVuY291bnRlcmVkIiwgRVhfREFUQUVSUik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKworCQlzY29wZV9jb250ZXh0LT5lbmRfYWRkciA9IGluc3RydWN0aW9uX3B0cjsKKworCQkvKiBQb3AgdGhlIHNjb3BlICovCisJCVNMSVNUX1JFTU9WRV9IRUFEKCZzY29wZV9zdGFjaywgc2NvcGVfc3RhY2tfbGlua3MpOworCisJCXByb2Nlc3Nfc2NvcGUoc2NvcGVfY29udGV4dCk7CisKKwkJaWYgKFNMSVNUX0ZJUlNUKCZzY29wZV9zdGFjaykgPT0gTlVMTCkgeworCQkJc3RvcCgiVW5leHBlY3RlZCAnfScgZW5jb3VudGVyZWQiLCBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCX0KKzsKKworZjFfb3Bjb2RlOgorCVRfQU5EIHsgJCQgPSBBSUNfT1BfQU5EOyB9Cit8CVRfWE9SIHsgJCQgPSBBSUNfT1BfWE9SOyB9Cit8CVRfQUREIHsgJCQgPSBBSUNfT1BfQUREOyB9Cit8CVRfQURDIHsgJCQgPSBBSUNfT1BfQURDOyB9Cis7CisKK2NvZGU6CisJZjFfb3Bjb2RlIGRlc3RpbmF0aW9uICcsJyBpbW1lZGlhdGVfb3JfYSBvcHRfc291cmNlIHJldCAnOycKKwl7CisJCWZvcm1hdF8xX2luc3RyKCQxLCAmJDIsICYkNCwgJiQ1LCAkNik7CisJfQorOworCitjb2RlOgorCVRfT1IgcmVnX3N5bWJvbCAnLCcgaW1tZWRpYXRlX29yX2Egb3B0X3NvdXJjZSByZXQgJzsnCisJeworCQlmb3JtYXRfMV9pbnN0cihBSUNfT1BfT1IsICYkMiwgJiQ0LCAmJDUsICQ2KTsKKwl9Cis7CisKK2NvZGU6CisJVF9JTkMgZGVzdGluYXRpb24gb3B0X3NvdXJjZSByZXQgJzsnCisJeworCQlleHByZXNzaW9uX3QgaW1tZWQ7CisKKwkJbWFrZV9leHByZXNzaW9uKCZpbW1lZCwgMSk7CisJCWZvcm1hdF8xX2luc3RyKEFJQ19PUF9BREQsICYkMiwgJmltbWVkLCAmJDMsICQ0KTsKKwl9Cis7CisKK2NvZGU6CisJVF9ERUMgZGVzdGluYXRpb24gb3B0X3NvdXJjZSByZXQgJzsnCisJeworCQlleHByZXNzaW9uX3QgaW1tZWQ7CisKKwkJbWFrZV9leHByZXNzaW9uKCZpbW1lZCwgLTEpOworCQlmb3JtYXRfMV9pbnN0cihBSUNfT1BfQURELCAmJDIsICZpbW1lZCwgJiQzLCAkNCk7CisJfQorOworCitjb2RlOgorCVRfQ0xDIHJldCAnOycKKwl7CisJCWV4cHJlc3Npb25fdCBpbW1lZDsKKworCQltYWtlX2V4cHJlc3Npb24oJmltbWVkLCAtMSk7CisJCWZvcm1hdF8xX2luc3RyKEFJQ19PUF9BREQsICZub25lLCAmaW1tZWQsICZhbGx6ZXJvcywgJDIpOworCX0KK3wJVF9DTEMgVF9NVkkgZGVzdGluYXRpb24gJywnIGltbWVkaWF0ZV9vcl9hIHJldCAnOycKKwl7CisJCWZvcm1hdF8xX2luc3RyKEFJQ19PUF9BREQsICYkMywgJiQ1LCAmYWxsemVyb3MsICQ2KTsKKwl9Cis7CisKK2NvZGU6CisJVF9TVEMgcmV0ICc7JworCXsKKwkJZXhwcmVzc2lvbl90IGltbWVkOworCisJCW1ha2VfZXhwcmVzc2lvbigmaW1tZWQsIDEpOworCQlmb3JtYXRfMV9pbnN0cihBSUNfT1BfQURELCAmbm9uZSwgJmltbWVkLCAmYWxsb25lcywgJDIpOworCX0KK3wJVF9TVEMgZGVzdGluYXRpb24gcmV0ICc7JworCXsKKwkJZXhwcmVzc2lvbl90IGltbWVkOworCisJCW1ha2VfZXhwcmVzc2lvbigmaW1tZWQsIDEpOworCQlmb3JtYXRfMV9pbnN0cihBSUNfT1BfQURELCAmJDIsICZpbW1lZCwgJmFsbG9uZXMsICQzKTsKKwl9Cis7CisKK2NvZGU6CisJVF9CTU9WIGRlc3RpbmF0aW9uICcsJyBzb3VyY2UgJywnIGltbWVkaWF0ZSByZXQgJzsnCisJeworCQlmb3JtYXRfMV9pbnN0cihBSUNfT1BfQk1PViwgJiQyLCAmJDYsICYkNCwgJDcpOworCX0KKzsKKworY29kZToKKwlUX01PViBkZXN0aW5hdGlvbiAnLCcgc291cmNlIHJldCAnOycKKwl7CisJCWV4cHJlc3Npb25fdCBpbW1lZDsKKworCQltYWtlX2V4cHJlc3Npb24oJmltbWVkLCAxKTsKKwkJZm9ybWF0XzFfaW5zdHIoQUlDX09QX0JNT1YsICYkMiwgJmltbWVkLCAmJDQsICQ1KTsKKwl9Cis7CisKK2NvZGU6CisJVF9NVkkgZGVzdGluYXRpb24gJywnIGltbWVkaWF0ZSByZXQgJzsnCisJeworCQlpZiAoJDQudmFsdWUgPT0gMAorCQkgJiYgaXNfZG93bmxvYWRfY29uc3QoJiQ0KSA9PSAwKSB7CisJCQlleHByZXNzaW9uX3QgaW1tZWQ7CisKKwkJCS8qCisJCQkgKiBBbGxvdyBtb3ZlIGltbWVkaWF0ZXMgb2YgMCBzbyB0aGF0IG1hY3JvcywKKwkJCSAqIHRoYXQgY2FuJ3Qga25vdyB0aGUgaW1tZWRpYXRlJ3MgdmFsdWUgYW5kCisJCQkgKiBvdGhlcndpc2UgY29tcGVuc2F0ZSwgc3RpbGwgd29yay4KKwkJCSAqLworCQkJbWFrZV9leHByZXNzaW9uKCZpbW1lZCwgMSk7CisJCQlmb3JtYXRfMV9pbnN0cihBSUNfT1BfQk1PViwgJiQyLCAmaW1tZWQsICZhbGx6ZXJvcywgJDUpOworCQl9IGVsc2UgeworCQkJZm9ybWF0XzFfaW5zdHIoQUlDX09QX09SLCAmJDIsICYkNCwgJmFsbHplcm9zLCAkNSk7CisJCX0KKwl9Cis7CisKK2NvZGU6CisJVF9OT1QgZGVzdGluYXRpb24gb3B0X3NvdXJjZSByZXQgJzsnCisJeworCQlleHByZXNzaW9uX3QgaW1tZWQ7CisKKwkJbWFrZV9leHByZXNzaW9uKCZpbW1lZCwgMHhmZik7CisJCWZvcm1hdF8xX2luc3RyKEFJQ19PUF9YT1IsICYkMiwgJmltbWVkLCAmJDMsICQ0KTsKKwl9Cis7CisKK2NvZGU6CisJVF9DTFIgZGVzdGluYXRpb24gcmV0ICc7JworCXsKKwkJZXhwcmVzc2lvbl90IGltbWVkOworCisJCW1ha2VfZXhwcmVzc2lvbigmaW1tZWQsIDB4ZmYpOworCQlmb3JtYXRfMV9pbnN0cihBSUNfT1BfQU5ELCAmJDIsICZpbW1lZCwgJmFsbHplcm9zLCAkMyk7CisJfQorOworCitjb2RlOgorCVRfTk9QIHJldCAnOycKKwl7CisJCWV4cHJlc3Npb25fdCBpbW1lZDsKKworCQltYWtlX2V4cHJlc3Npb24oJmltbWVkLCAweGZmKTsKKwkJZm9ybWF0XzFfaW5zdHIoQUlDX09QX0FORCwgJm5vbmUsICZpbW1lZCwgJmFsbHplcm9zLCAkMik7CisJfQorOworCitjb2RlOgorCVRfUkVUICc7JworCXsKKwkJZXhwcmVzc2lvbl90IGltbWVkOworCisJCW1ha2VfZXhwcmVzc2lvbigmaW1tZWQsIDB4ZmYpOworCQlmb3JtYXRfMV9pbnN0cihBSUNfT1BfQU5ELCAmbm9uZSwgJmltbWVkLCAmYWxsemVyb3MsIFRSVUUpOworCX0KKzsKKworCS8qCisJICogVGhpcyBncmFtbWVyIGRpZmZlcnMgZnJvbSB0aGUgb25lIGluIHRoZSBhaWM3eHh4CisJICogcmVmZXJlbmNlIG1hbnVhbCBzaW5jZSB0aGUgZ3JhbW1lciBsaXN0ZWQgdGhlcmUgaXMKKwkgKiBhbWJpZ3VvdXMgYW5kIGNhdXNlcyBhIHNoaWZ0L3JlZHVjZSBjb25mbGljdC4KKwkgKiBJdCBhbHNvIHNlZW1zIG1vcmUgbG9naWNhbCBhcyB0aGUgImltbWVkaWF0ZSIKKwkgKiBhcmd1bWVudCBpcyBsaXN0ZWQgYXMgdGhlIHNlY29uZCBhcmcgbGlrZSB0aGUKKwkgKiBvdGhlciBmb3JtYXRzLgorCSAqLworCitmMl9vcGNvZGU6CisJVF9TSEwgeyAkJCA9IEFJQ19PUF9TSEw7IH0KK3wJVF9TSFIgeyAkJCA9IEFJQ19PUF9TSFI7IH0KK3wJVF9ST0wgeyAkJCA9IEFJQ19PUF9ST0w7IH0KK3wJVF9ST1IgeyAkJCA9IEFJQ19PUF9ST1I7IH0KKzsKKworY29kZToKKwlmMl9vcGNvZGUgZGVzdGluYXRpb24gJywnIGV4cHJlc3Npb24gb3B0X3NvdXJjZSByZXQgJzsnCisJeworCQlmb3JtYXRfMl9pbnN0cigkMSwgJiQyLCAmJDQsICYkNSwgJDYpOworCX0KKzsKKworam1wX2pjX2puY19jYWxsOgorCVRfSk1QCXsgJCQgPSBBSUNfT1BfSk1QOyB9Cit8CVRfSkMJeyAkJCA9IEFJQ19PUF9KQzsgfQorfAlUX0pOQwl7ICQkID0gQUlDX09QX0pOQzsgfQorfAlUX0NBTEwJeyAkJCA9IEFJQ19PUF9DQUxMOyB9Cis7CisKK2p6X2puejoKKwlUX0paCXsgJCQgPSBBSUNfT1BfSlo7IH0KK3wJVF9KTloJeyAkJCA9IEFJQ19PUF9KTlo7IH0KKzsKKworamVfam5lOgorCVRfSkUJeyAkJCA9IEFJQ19PUF9KRTsgfQorfAlUX0pORQl7ICQkID0gQUlDX09QX0pORTsgfQorOworCitjb2RlOgorCWptcF9qY19qbmNfY2FsbCBhZGRyZXNzICc7JworCXsKKwkJZXhwcmVzc2lvbl90IGltbWVkOworCisJCW1ha2VfZXhwcmVzc2lvbigmaW1tZWQsIDApOworCQlmb3JtYXRfM19pbnN0cigkMSwgJnNpbmRleCwgJmltbWVkLCAmJDIpOworCX0KKzsKKworY29kZToKKwlUX09SIHJlZ19zeW1ib2wgJywnIGltbWVkaWF0ZSBqbXBfamNfam5jX2NhbGwgYWRkcmVzcyAnOycKKwl7CisJCWZvcm1hdF8zX2luc3RyKCQ1LCAmJDIsICYkNCwgJiQ2KTsKKwl9Cis7CisKK2NvZGU6CisJVF9URVNUIHNvdXJjZSAnLCcgaW1tZWRpYXRlX29yX2Eganpfam56IGFkZHJlc3MgJzsnCisJeworCQlmb3JtYXRfM19pbnN0cigkNSwgJiQyLCAmJDQsICYkNik7CisJfQorOworCitjb2RlOgorCVRfQ01QIHNvdXJjZSAnLCcgaW1tZWRpYXRlX29yX2EgamVfam5lIGFkZHJlc3MgJzsnCisJeworCQlmb3JtYXRfM19pbnN0cigkNSwgJiQyLCAmJDQsICYkNik7CisJfQorOworCitjb2RlOgorCVRfTU9WIHNvdXJjZSBqbXBfamNfam5jX2NhbGwgYWRkcmVzcyAnOycKKwl7CisJCWV4cHJlc3Npb25fdCBpbW1lZDsKKworCQltYWtlX2V4cHJlc3Npb24oJmltbWVkLCAwKTsKKwkJZm9ybWF0XzNfaW5zdHIoJDMsICYkMiwgJmltbWVkLCAmJDQpOworCX0KKzsKKworY29kZToKKwlUX01WSSBpbW1lZGlhdGUgam1wX2pjX2puY19jYWxsIGFkZHJlc3MgJzsnCisJeworCQlmb3JtYXRfM19pbnN0cigkMywgJmFsbHplcm9zLCAmJDIsICYkNCk7CisJfQorOworCislJQorCitzdGF0aWMgdm9pZAorcHJvY2Vzc19maWVsZChpbnQgZmllbGRfdHlwZSwgc3ltYm9sX3QgKnN5bSwgaW50IHZhbHVlKQoreworCS8qCisJICogQWRkIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHRvIGl0cworCSAqIHN5bWJvbCBsaXN0LCBpZiBpdCBhbHJlYWR5IGV4aXN0cywKKwkgKiB3YXJuIGlmIHdlIGFyZSBzZXR0aW5nIGl0IHRvIGEKKwkgKiBkaWZmZXJlbnQgdmFsdWUsIG9yIGluIHRoZSBiaXQgdG8KKwkgKiB0aGUgImFsbG93ZWQgYml0cyIgb2YgdGhpcyByZWdpc3Rlci4KKwkgKi8KKwlpZiAoc3ltLT50eXBlID09IFVOSU5JVElBTElaRUQpIHsKKwkJc3ltLT50eXBlID0gZmllbGRfdHlwZTsKKwkJaW5pdGlhbGl6ZV9zeW1ib2woc3ltKTsKKwkJc3ltLT5pbmZvLmZpbmZvLT52YWx1ZSA9IHZhbHVlOworCQlpZiAoZmllbGRfdHlwZSAhPSBFTlVNX0VOVFJZKSB7CisJCQlpZiAoZmllbGRfdHlwZSAhPSBNQVNLICYmIHZhbHVlID09IDApIHsKKwkJCQlzdG9wKCJFbXB0eSBGaWVsZCwgb3IgRW51bSIsIEVYX0RBVEFFUlIpOworCQkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJCX0KKwkJCXN5bS0+aW5mby5maW5mby0+dmFsdWUgPSB2YWx1ZTsKKwkJCXN5bS0+aW5mby5maW5mby0+bWFzayA9IHZhbHVlOworCQl9IGVsc2UgaWYgKGZpZWxkX3N5bWJvbCAhPSBOVUxMKSB7CisJCQlzeW0tPmluZm8uZmluZm8tPm1hc2sgPSBmaWVsZF9zeW1ib2wtPmluZm8uZmluZm8tPnZhbHVlOworCQl9IGVsc2UgeworCQkJc3ltLT5pbmZvLmZpbmZvLT5tYXNrID0gMHhGRjsKKwkJfQorCX0gZWxzZSBpZiAoc3ltLT50eXBlICE9IGZpZWxkX3R5cGUpIHsKKwkJc3RvcCgiRmllbGQgZGVmaW5pdGlvbiBtaXJyb3JzIGEgZGVmaW5pdGlvbiBvZiB0aGUgc2FtZSAiCisJCSAgICAgIiBuYW1lLCBidXQgYSBkaWZmZXJlbnQgdHlwZSIsIEVYX0RBVEFFUlIpOworCQkvKiBOT1RSRUFDSEVEICovCisJfSBlbHNlIGlmICh2YWx1ZSAhPSBzeW0tPmluZm8uZmluZm8tPnZhbHVlKSB7CisJCXN0b3AoIkZpZWxkIHJlZGVmaW5lZCB3aXRoIGEgY29uZmxpY3RpbmcgdmFsdWUiLCBFWF9EQVRBRVJSKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKwkvKiBGYWlsIGlmIHRoaXMgc3ltYm9sIGlzIGFscmVhZHkgbGlzdGVkICovCisJaWYgKHN5bWxpc3Rfc2VhcmNoKCYoc3ltLT5pbmZvLmZpbmZvLT5zeW1yZWZzKSwKKwkJCSAgIGN1cl9zeW1ib2wtPm5hbWUpICE9IE5VTEwpIHsKKwkJc3RvcCgiRmllbGQgZGVmaW5lZCBtdWx0aXBsZSB0aW1lcyBmb3IgcmVnaXN0ZXIiLCBFWF9EQVRBRVJSKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKwlzeW1saXN0X2FkZCgmKHN5bS0+aW5mby5maW5mby0+c3ltcmVmcyksIGN1cl9zeW1ib2wsCisJCSAgICBTWU1MSVNUX0lOU0VSVF9IRUFEKTsKKwljdXJfc3ltYm9sLT5pbmZvLnJpbmZvLT52YWxpZF9iaXRtYXNrIHw9IHN5bS0+aW5mby5maW5mby0+bWFzazsKKwljdXJfc3ltYm9sLT5pbmZvLnJpbmZvLT50eXBlY2hlY2tfbWFza3MgPSBUUlVFOworCXN5bWxpc3RfYWRkKCYoY3VyX3N5bWJvbC0+aW5mby5yaW5mby0+ZmllbGRzKSwgc3ltLCBTWU1MSVNUX1NPUlQpOworfQorCitzdGF0aWMgdm9pZAoraW5pdGlhbGl6ZV9zeW1ib2woc3ltYm9sX3QgKnN5bWJvbCkKK3sKKwlzd2l0Y2ggKHN5bWJvbC0+dHlwZSkgeworCWNhc2UgVU5JTklUSUFMSVpFRDoKKwkJc3RvcCgiQ2FsbCB0byBpbml0aWFsaXplX3N5bWJvbCB3aXRoIHR5cGUgZmllbGQgdW5zZXQiLAorCQkgICAgIEVYX1NPRlRXQVJFKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCQlicmVhazsKKwljYXNlIFJFR0lTVEVSOgorCWNhc2UgU1JBTUxPQzoKKwljYXNlIFNDQkxPQzoKKwkJc3ltYm9sLT5pbmZvLnJpbmZvID0KKwkJICAgIChzdHJ1Y3QgcmVnX2luZm8gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWdfaW5mbykpOworCQlpZiAoc3ltYm9sLT5pbmZvLnJpbmZvID09IE5VTEwpIHsKKwkJCXN0b3AoIkNhbid0IGNyZWF0ZSByZWdpc3RlciBpbmZvIiwgRVhfU09GVFdBUkUpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCW1lbXNldChzeW1ib2wtPmluZm8ucmluZm8sIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHJlZ19pbmZvKSk7CisJCVNMSVNUX0lOSVQoJihzeW1ib2wtPmluZm8ucmluZm8tPmZpZWxkcykpOworCQkvKgorCQkgKiBEZWZhdWx0IHRvIGFsbG93aW5nIGFjY2VzcyBpbiBhbGwgcmVnaXN0ZXIgbW9kZXMKKwkJICogb3IgdG8gdGhlIG1vZGUgc3BlY2lmaWVkIGJ5IHRoZSBTQ0Igb3IgU1JBTSBzcGFjZQorCQkgKiB3ZSBhcmUgaW4uCisJCSAqLworCQlpZiAoc2NiX29yX3NyYW1fc3ltYm9sICE9IE5VTEwpCisJCQlzeW1ib2wtPmluZm8ucmluZm8tPm1vZGVzID0KKwkJCSAgICBzY2Jfb3Jfc3JhbV9zeW1ib2wtPmluZm8ucmluZm8tPm1vZGVzOworCQllbHNlCisJCQlzeW1ib2wtPmluZm8ucmluZm8tPm1vZGVzID0gfjA7CisJCWJyZWFrOworCWNhc2UgQUxJQVM6CisJCXN5bWJvbC0+aW5mby5haW5mbyA9CisJCSAgICAoc3RydWN0IGFsaWFzX2luZm8gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBhbGlhc19pbmZvKSk7CisJCWlmIChzeW1ib2wtPmluZm8uYWluZm8gPT0gTlVMTCkgeworCQkJc3RvcCgiQ2FuJ3QgY3JlYXRlIGFsaWFzIGluZm8iLCBFWF9TT0ZUV0FSRSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJbWVtc2V0KHN5bWJvbC0+aW5mby5haW5mbywgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgYWxpYXNfaW5mbykpOworCQlicmVhazsKKwljYXNlIE1BU0s6CisJY2FzZSBGSUVMRDoKKwljYXNlIEVOVU06CisJY2FzZSBFTlVNX0VOVFJZOgorCQlzeW1ib2wtPmluZm8uZmluZm8gPQorCQkgICAgKHN0cnVjdCBmaWVsZF9pbmZvICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZmllbGRfaW5mbykpOworCQlpZiAoc3ltYm9sLT5pbmZvLmZpbmZvID09IE5VTEwpIHsKKwkJCXN0b3AoIkNhbid0IGNyZWF0ZSBmaWVsZCBpbmZvIiwgRVhfU09GVFdBUkUpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCW1lbXNldChzeW1ib2wtPmluZm8uZmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgZmllbGRfaW5mbykpOworCQlTTElTVF9JTklUKCYoc3ltYm9sLT5pbmZvLmZpbmZvLT5zeW1yZWZzKSk7CisJCWJyZWFrOworCWNhc2UgQ09OU1Q6CisJY2FzZSBET1dOTE9BRF9DT05TVDoKKwkJc3ltYm9sLT5pbmZvLmNpbmZvID0KKwkJICAgIChzdHJ1Y3QgY29uc3RfaW5mbyAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGNvbnN0X2luZm8pKTsKKwkJaWYgKHN5bWJvbC0+aW5mby5jaW5mbyA9PSBOVUxMKSB7CisJCQlzdG9wKCJDYW4ndCBjcmVhdGUgYWxpYXMgaW5mbyIsIEVYX1NPRlRXQVJFKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQltZW1zZXQoc3ltYm9sLT5pbmZvLmNpbmZvLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb25zdF9pbmZvKSk7CisJCWJyZWFrOworCWNhc2UgTEFCRUw6CisJCXN5bWJvbC0+aW5mby5saW5mbyA9CisJCSAgICAoc3RydWN0IGxhYmVsX2luZm8gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBsYWJlbF9pbmZvKSk7CisJCWlmIChzeW1ib2wtPmluZm8ubGluZm8gPT0gTlVMTCkgeworCQkJc3RvcCgiQ2FuJ3QgY3JlYXRlIGxhYmVsIGluZm8iLCBFWF9TT0ZUV0FSRSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJbWVtc2V0KHN5bWJvbC0+aW5mby5saW5mbywgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgbGFiZWxfaW5mbykpOworCQlicmVhazsKKwljYXNlIENPTkRJVElPTkFMOgorCQlzeW1ib2wtPmluZm8uY29uZGluZm8gPQorCQkgICAgKHN0cnVjdCBjb25kX2luZm8gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb25kX2luZm8pKTsKKwkJaWYgKHN5bWJvbC0+aW5mby5jb25kaW5mbyA9PSBOVUxMKSB7CisJCQlzdG9wKCJDYW4ndCBjcmVhdGUgY29uZGl0aW9uYWwgaW5mbyIsIEVYX1NPRlRXQVJFKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQltZW1zZXQoc3ltYm9sLT5pbmZvLmNvbmRpbmZvLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb25kX2luZm8pKTsKKwkJYnJlYWs7CisJY2FzZSBNQUNSTzoKKwkJc3ltYm9sLT5pbmZvLm1hY3JvaW5mbyA9IAorCQkgICAgKHN0cnVjdCBtYWNyb19pbmZvICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWFjcm9faW5mbykpOworCQlpZiAoc3ltYm9sLT5pbmZvLm1hY3JvaW5mbyA9PSBOVUxMKSB7CisJCQlzdG9wKCJDYW4ndCBjcmVhdGUgbWFjcm8gaW5mbyIsIEVYX1NPRlRXQVJFKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQltZW1zZXQoc3ltYm9sLT5pbmZvLm1hY3JvaW5mbywgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgbWFjcm9faW5mbykpOworCQlTVEFJTFFfSU5JVCgmc3ltYm9sLT5pbmZvLm1hY3JvaW5mby0+YXJncyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0b3AoIkNhbGwgdG8gaW5pdGlhbGl6ZV9zeW1ib2wgd2l0aCBpbnZhbGlkIHN5bWJvbCB0eXBlIiwKKwkJICAgICBFWF9TT0ZUV0FSRSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWRkX21hY3JvX2FyZyhjb25zdCBjaGFyICphcmd0ZXh0LCBpbnQgYXJnbnVtKQoreworCXN0cnVjdCBtYWNyb19hcmcgKm1hcmc7CisJaW50IGk7CisJaW50IHJldHZhbDsKKwkJCisKKwlpZiAoY3VyX3N5bWJvbCA9PSBOVUxMIHx8IGN1cl9zeW1ib2wtPnR5cGUgIT0gTUFDUk8pIHsKKwkJc3RvcCgiSW52YWxpZCBjdXJyZW50IHN5bWJvbCBmb3IgYWRkaW5nIG1hY3JvIGFyZyIsCisJCSAgICAgRVhfU09GVFdBUkUpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCisJbWFyZyA9IChzdHJ1Y3QgbWFjcm9fYXJnICopbWFsbG9jKHNpemVvZigqbWFyZykpOworCWlmIChtYXJnID09IE5VTEwpIHsKKwkJc3RvcCgiQ2FuJ3QgY3JlYXRlIG1hY3JvX2FyZyBzdHJ1Y3R1cmUiLCBFWF9TT0ZUV0FSRSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisJbWFyZy0+cmVwbGFjZW1lbnRfdGV4dCA9IE5VTEw7CisJcmV0dmFsID0gc25wcmludGYocmVnZXhfcGF0dGVybiwgc2l6ZW9mKHJlZ2V4X3BhdHRlcm4pLAorCQkJICAiW14tL0EtWmEtejAtOV9dKCVzKShbXi0vQS1aYS16MC05X118JCkiLAorCQkJICBhcmd0ZXh0KTsKKwlpZiAocmV0dmFsID49IHNpemVvZihyZWdleF9wYXR0ZXJuKSkgeworCQlzdG9wKCJSZWdleCB0ZXh0IGJ1ZmZlciB0b28gc21hbGwgZm9yIGFyZyIsCisJCSAgICAgRVhfU09GVFdBUkUpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCXJldHZhbCA9IHJlZ2NvbXAoJm1hcmctPmFyZ19yZWdleCwgcmVnZXhfcGF0dGVybiwgUkVHX0VYVEVOREVEKTsKKwlpZiAocmV0dmFsICE9IDApIHsKKwkJc3RvcCgiUmVnZXggY29tcGlsYXRpb24gZmFpbGVkIiwgRVhfU09GVFdBUkUpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCVNUQUlMUV9JTlNFUlRfVEFJTCgmY3VyX3N5bWJvbC0+aW5mby5tYWNyb2luZm8tPmFyZ3MsIG1hcmcsIGxpbmtzKTsKK30KKworc3RhdGljIHZvaWQKK2FkZF9tYWNyb19ib2R5KGNvbnN0IGNoYXIgKmJvZHl0ZXh0KQoreworCWlmIChjdXJfc3ltYm9sID09IE5VTEwgfHwgY3VyX3N5bWJvbC0+dHlwZSAhPSBNQUNSTykgeworCQlzdG9wKCJJbnZhbGlkIGN1cnJlbnQgc3ltYm9sIGZvciBhZGRpbmcgbWFjcm8gYXJnIiwKKwkJICAgICBFWF9TT0ZUV0FSRSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisJY3VyX3N5bWJvbC0+aW5mby5tYWNyb2luZm8tPmJvZHkgPSBzdHJkdXAoYm9keXRleHQpOworCWlmIChjdXJfc3ltYm9sLT5pbmZvLm1hY3JvaW5mby0+Ym9keSA9PSBOVUxMKSB7CisJCXN0b3AoIkNhbid0IGR1cGxpY2F0ZSBtYWNybyBib2R5IHRleHQiLCBFWF9TT0ZUV0FSRSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX3JlZ2lzdGVyKHN5bWJvbF90ICoqcF9zeW1ib2wpCit7CisJc3ltYm9sX3QgKnN5bWJvbCA9ICpwX3N5bWJvbDsKKworCWlmIChzeW1ib2wtPnR5cGUgPT0gVU5JTklUSUFMSVpFRCkgeworCQlzbnByaW50ZihlcnJidWYsIHNpemVvZihlcnJidWYpLCAiVW5kZWZpbmVkIHJlZ2lzdGVyICVzIiwKKwkJCSBzeW1ib2wtPm5hbWUpOworCQlzdG9wKGVycmJ1ZiwgRVhfREFUQUVSUik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9IGVsc2UgaWYgKHN5bWJvbC0+dHlwZSA9PSBBTElBUykgeworCQkqcF9zeW1ib2wgPSBzeW1ib2wtPmluZm8uYWluZm8tPnBhcmVudDsKKwl9IGVsc2UgaWYgKChzeW1ib2wtPnR5cGUgIT0gUkVHSVNURVIpCisJCSYmIChzeW1ib2wtPnR5cGUgIT0gU0NCTE9DKQorCQkmJiAoc3ltYm9sLT50eXBlICE9IFNSQU1MT0MpKSB7CisJCXNucHJpbnRmKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksCisJCQkgIlNwZWNpZmllZCBzeW1ib2wgJXMgaXMgbm90IGEgcmVnaXN0ZXIiLAorCQkJIHN5bWJvbC0+bmFtZSk7CisJCXN0b3AoZXJyYnVmLCBFWF9EQVRBRVJSKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitmb3JtYXRfMV9pbnN0cihpbnQgb3Bjb2RlLCBzeW1ib2xfcmVmX3QgKmRlc3QsIGV4cHJlc3Npb25fdCAqaW1tZWQsCisJICAgICAgIHN5bWJvbF9yZWZfdCAqc3JjLCBpbnQgcmV0KQoreworCXN0cnVjdCBpbnN0cnVjdGlvbiAqaW5zdHI7CisJc3RydWN0IGluc19mb3JtYXQxICpmMV9pbnN0cjsKKworCWlmIChzcmMtPnN5bWJvbCA9PSBOVUxMKQorCQlzcmMgPSBkZXN0OworCisJLyogVGVzdCByZWdpc3RlciBwZXJtaXNzaW9ucyAqLworCXRlc3Rfd3JpdGFibGVfc3ltYm9sKGRlc3QtPnN5bWJvbCk7CisJdGVzdF9yZWFkYWJsZV9zeW1ib2woc3JjLT5zeW1ib2wpOworCisJLyogRW5zdXJlIHRoYXQgaW1tZWRpYXRlIG1ha2VzIHNlbnNlIGZvciB0aGlzIGRlc3RpbmF0aW9uICovCisJdHlwZV9jaGVjayhkZXN0LT5zeW1ib2wsIGltbWVkLCBvcGNvZGUpOworCisJLyogQWxsb2NhdGUgc2VxdWVuY2VyIHNwYWNlIGZvciB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGZpbGwgaXQgb3V0ICovCisJaW5zdHIgPSBzZXFfYWxsb2MoKTsKKwlmMV9pbnN0ciA9ICZpbnN0ci0+Zm9ybWF0LmZvcm1hdDE7CisJZjFfaW5zdHItPnJldCA9IHJldCA/IDEgOiAwOworCWYxX2luc3RyLT5vcGNvZGUgPSBvcGNvZGU7CisJZjFfaW5zdHItPmRlc3RpbmF0aW9uID0gZGVzdC0+c3ltYm9sLT5pbmZvLnJpbmZvLT5hZGRyZXNzCisJCQkgICAgICArIGRlc3QtPm9mZnNldDsKKwlmMV9pbnN0ci0+c291cmNlID0gc3JjLT5zeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3MKKwkJCSArIHNyYy0+b2Zmc2V0OworCWYxX2luc3RyLT5pbW1lZGlhdGUgPSBpbW1lZC0+dmFsdWU7CisKKwlpZiAoaXNfZG93bmxvYWRfY29uc3QoaW1tZWQpKQorCQlmMV9pbnN0ci0+cGFyaXR5ID0gMTsKKwllbHNlIGlmIChkZXN0LT5zeW1ib2wgPT0gbW9kZV9wdHIuc3ltYm9sKSB7CisJCXVfaW50IHNyY192YWx1ZTsKKwkJdV9pbnQgZHN0X3ZhbHVlOworCisJCS8qCisJCSAqIEF0dGVtcHQgdG8gdXBkYXRlIG1vZGUgaW5mb3JtYXRpb24gaWYKKwkJICogd2UgYXJlIG9wZXJhdGluZyBvbiB0aGUgbW9kZSByZWdpc3Rlci4KKwkJICovCisJCWlmIChzcmMtPnN5bWJvbCA9PSBhbGxvbmVzLnN5bWJvbCkKKwkJCXNyY192YWx1ZSA9IDB4RkY7CisJCWVsc2UgaWYgKHNyYy0+c3ltYm9sID09IGFsbHplcm9zLnN5bWJvbCkKKwkJCXNyY192YWx1ZSA9IDA7CisJCWVsc2UgaWYgKHNyYy0+c3ltYm9sID09IG1vZGVfcHRyLnN5bWJvbCkKKwkJCXNyY192YWx1ZSA9IChkc3RfbW9kZSA8PCA0KSB8IHNyY19tb2RlOworCQllbHNlCisJCQlnb3RvIGNhbnRfdXBkYXRlOworCisJCXN3aXRjaCAob3Bjb2RlKSB7CisJCWNhc2UgQUlDX09QX0FORDoKKwkJCWRzdF92YWx1ZSA9IHNyY192YWx1ZSAmIGltbWVkLT52YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIEFJQ19PUF9YT1I6CisJCQlkc3RfdmFsdWUgPSBzcmNfdmFsdWUgXiBpbW1lZC0+dmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBBSUNfT1BfQUREOgorCQkJZHN0X3ZhbHVlID0gKHNyY192YWx1ZSArIGltbWVkLT52YWx1ZSkgJiAweEZGOworCQkJYnJlYWs7CisJCWNhc2UgQUlDX09QX09SOgorCQkJZHN0X3ZhbHVlID0gc3JjX3ZhbHVlIHwgaW1tZWQtPnZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgQUlDX09QX0JNT1Y6CisJCQlkc3RfdmFsdWUgPSBzcmNfdmFsdWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gY2FudF91cGRhdGU7CisJCX0KKwkJc3JjX21vZGUgPSBkc3RfdmFsdWUgJiAweEY7CisJCWRzdF9tb2RlID0gKGRzdF92YWx1ZSA+PiA0KSAmIDB4RjsKKwl9CisKK2NhbnRfdXBkYXRlOgorCXN5bWxpc3RfZnJlZSgmaW1tZWQtPnJlZmVyZW5jZWRfc3ltcyk7CisJaW5zdHJ1Y3Rpb25fcHRyKys7Cit9CisKK3N0YXRpYyB2b2lkCitmb3JtYXRfMl9pbnN0cihpbnQgb3Bjb2RlLCBzeW1ib2xfcmVmX3QgKmRlc3QsIGV4cHJlc3Npb25fdCAqcGxhY2VzLAorCSAgICAgICBzeW1ib2xfcmVmX3QgKnNyYywgaW50IHJldCkKK3sKKwlzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKmluc3RyOworCXN0cnVjdCBpbnNfZm9ybWF0MiAqZjJfaW5zdHI7CisJdWludDhfdCBzaGlmdF9jb250cm9sOworCisJaWYgKHNyYy0+c3ltYm9sID09IE5VTEwpCisJCXNyYyA9IGRlc3Q7CisKKwkvKiBUZXN0IHJlZ2lzdGVyIHBlcm1pc3Npb25zICovCisJdGVzdF93cml0YWJsZV9zeW1ib2woZGVzdC0+c3ltYm9sKTsKKwl0ZXN0X3JlYWRhYmxlX3N5bWJvbChzcmMtPnN5bWJvbCk7CisKKwkvKiBBbGxvY2F0ZSBzZXF1ZW5jZXIgc3BhY2UgZm9yIHRoZSBpbnN0cnVjdGlvbiBhbmQgZmlsbCBpdCBvdXQgKi8KKwlpbnN0ciA9IHNlcV9hbGxvYygpOworCWYyX2luc3RyID0gJmluc3RyLT5mb3JtYXQuZm9ybWF0MjsKKwlmMl9pbnN0ci0+cmV0ID0gcmV0ID8gMSA6IDA7CisJZjJfaW5zdHItPm9wY29kZSA9IEFJQ19PUF9ST0w7CisJZjJfaW5zdHItPmRlc3RpbmF0aW9uID0gZGVzdC0+c3ltYm9sLT5pbmZvLnJpbmZvLT5hZGRyZXNzCisJCQkgICAgICArIGRlc3QtPm9mZnNldDsKKwlmMl9pbnN0ci0+c291cmNlID0gc3JjLT5zeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3MKKwkJCSArIHNyYy0+b2Zmc2V0OworCWlmIChwbGFjZXMtPnZhbHVlID4gOCB8fCBwbGFjZXMtPnZhbHVlIDw9IDApIHsKKwkJc3RvcCgiaWxsZWdhbCBzaGlmdCB2YWx1ZSIsIEVYX0RBVEFFUlIpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBBSUNfT1BfU0hMOgorCQlpZiAocGxhY2VzLT52YWx1ZSA9PSA4KQorCQkJc2hpZnRfY29udHJvbCA9IDB4ZjA7CisJCWVsc2UKKwkJCXNoaWZ0X2NvbnRyb2wgPSAocGxhY2VzLT52YWx1ZSA8PCA0KSB8IHBsYWNlcy0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgQUlDX09QX1NIUjoKKwkJaWYgKHBsYWNlcy0+dmFsdWUgPT0gOCkgeworCQkJc2hpZnRfY29udHJvbCA9IDB4Zjg7CisJCX0gZWxzZSB7CisJCQlzaGlmdF9jb250cm9sID0gKHBsYWNlcy0+dmFsdWUgPDwgNCkKKwkJCQkgICAgICB8ICg4IC0gcGxhY2VzLT52YWx1ZSkKKwkJCQkgICAgICB8IDB4MDg7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBSUNfT1BfUk9MOgorCQlzaGlmdF9jb250cm9sID0gcGxhY2VzLT52YWx1ZSAmIDB4NzsKKwkJYnJlYWs7CisJY2FzZSBBSUNfT1BfUk9SOgorCQlzaGlmdF9jb250cm9sID0gKDggLSBwbGFjZXMtPnZhbHVlKSB8IDB4MDg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNoaWZ0X2NvbnRyb2wgPSAwOyAvKiBRdWlldCBDb21waWxlciAqLworCQlzdG9wKCJJbnZhbGlkIHNoaWZ0IG9wZXJhdGlvbiBzcGVjaWZpZWQiLCBFWF9TT0ZUV0FSRSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwkJYnJlYWs7CisJfTsKKwlmMl9pbnN0ci0+c2hpZnRfY29udHJvbCA9IHNoaWZ0X2NvbnRyb2w7CisJc3ltbGlzdF9mcmVlKCZwbGFjZXMtPnJlZmVyZW5jZWRfc3ltcyk7CisJaW5zdHJ1Y3Rpb25fcHRyKys7Cit9CisKK3N0YXRpYyB2b2lkCitmb3JtYXRfM19pbnN0cihpbnQgb3Bjb2RlLCBzeW1ib2xfcmVmX3QgKnNyYywKKwkgICAgICAgZXhwcmVzc2lvbl90ICppbW1lZCwgc3ltYm9sX3JlZl90ICphZGRyZXNzKQoreworCXN0cnVjdCBpbnN0cnVjdGlvbiAqaW5zdHI7CisJc3RydWN0IGluc19mb3JtYXQzICpmM19pbnN0cjsKKwlpbnQgYWRkcjsKKworCS8qIFRlc3QgcmVnaXN0ZXIgcGVybWlzc2lvbnMgKi8KKwl0ZXN0X3JlYWRhYmxlX3N5bWJvbChzcmMtPnN5bWJvbCk7CisKKwkvKiBFbnN1cmUgdGhhdCBpbW1lZGlhdGUgbWFrZXMgc2Vuc2UgZm9yIHRoaXMgc291cmNlICovCisJdHlwZV9jaGVjayhzcmMtPnN5bWJvbCwgaW1tZWQsIG9wY29kZSk7CisKKwkvKiBBbGxvY2F0ZSBzZXF1ZW5jZXIgc3BhY2UgZm9yIHRoZSBpbnN0cnVjdGlvbiBhbmQgZmlsbCBpdCBvdXQgKi8KKwlpbnN0ciA9IHNlcV9hbGxvYygpOworCWYzX2luc3RyID0gJmluc3RyLT5mb3JtYXQuZm9ybWF0MzsKKwlpZiAoYWRkcmVzcy0+c3ltYm9sID09IE5VTEwpIHsKKwkJLyogJ2RvdCcgcmVmZXJyZW5jZS4gIFVzZSB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBwb2ludGVyICovCisJCWFkZHIgPSBpbnN0cnVjdGlvbl9wdHIgKyBhZGRyZXNzLT5vZmZzZXQ7CisJfSBlbHNlIGlmIChhZGRyZXNzLT5zeW1ib2wtPnR5cGUgPT0gVU5JTklUSUFMSVpFRCkgeworCQkvKiBmb3J3YXJkIHJlZmVyZW5jZSAqLworCQlhZGRyID0gYWRkcmVzcy0+b2Zmc2V0OworCQlpbnN0ci0+cGF0Y2hfbGFiZWwgPSBhZGRyZXNzLT5zeW1ib2w7CisJfSBlbHNlCisJCWFkZHIgPSBhZGRyZXNzLT5zeW1ib2wtPmluZm8ubGluZm8tPmFkZHJlc3MgKyBhZGRyZXNzLT5vZmZzZXQ7CisJZjNfaW5zdHItPm9wY29kZSA9IG9wY29kZTsKKwlmM19pbnN0ci0+YWRkcmVzcyA9IGFkZHI7CisJZjNfaW5zdHItPnNvdXJjZSA9IHNyYy0+c3ltYm9sLT5pbmZvLnJpbmZvLT5hZGRyZXNzCisJCQkgKyBzcmMtPm9mZnNldDsKKwlmM19pbnN0ci0+aW1tZWRpYXRlID0gaW1tZWQtPnZhbHVlOworCisJaWYgKGlzX2Rvd25sb2FkX2NvbnN0KGltbWVkKSkKKwkJZjNfaW5zdHItPnBhcml0eSA9IDE7CisKKwlzeW1saXN0X2ZyZWUoJmltbWVkLT5yZWZlcmVuY2VkX3N5bXMpOworCWluc3RydWN0aW9uX3B0cisrOworfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkYWJsZV9zeW1ib2woc3ltYm9sX3QgKnN5bWJvbCkKK3sKKwkKKwlpZiAoKHN5bWJvbC0+aW5mby5yaW5mby0+bW9kZXMgJiAoMHgxIDw8IHNyY19tb2RlKSkgPT0gMCkgeworCQlzbnByaW50ZihlcnJidWYsIHNpemVvZihlcnJidWYpLAorCQkJIlJlZ2lzdGVyICVzIHVuYXZhaWxhYmxlIGluIHNvdXJjZSByZWcgbW9kZSAlZCIsCisJCQlzeW1ib2wtPm5hbWUsIHNyY19tb2RlKTsKKwkJc3RvcChlcnJidWYsIEVYX0RBVEFFUlIpOworCX0KKworCWlmIChzeW1ib2wtPmluZm8ucmluZm8tPm1vZGUgPT0gV08pIHsKKwkJc3RvcCgiV3JpdGUgT25seSByZWdpc3RlciBzcGVjaWZpZWQgYXMgc291cmNlIiwKKwkJICAgICBFWF9EQVRBRVJSKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfd3JpdGFibGVfc3ltYm9sKHN5bWJvbF90ICpzeW1ib2wpCit7CisJCisJaWYgKChzeW1ib2wtPmluZm8ucmluZm8tPm1vZGVzICYgKDB4MSA8PCBkc3RfbW9kZSkpID09IDApIHsKKwkJc25wcmludGYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwKKwkJCSJSZWdpc3RlciAlcyB1bmF2YWlsYWJsZSBpbiBkZXN0aW5hdGlvbiByZWcgbW9kZSAlZCIsCisJCQlzeW1ib2wtPm5hbWUsIGRzdF9tb2RlKTsKKwkJc3RvcChlcnJidWYsIEVYX0RBVEFFUlIpOworCX0KKworCWlmIChzeW1ib2wtPmluZm8ucmluZm8tPm1vZGUgPT0gUk8pIHsKKwkJc3RvcCgiUmVhZCBPbmx5IHJlZ2lzdGVyIHNwZWNpZmllZCBhcyBkZXN0aW5hdGlvbiIsCisJCSAgICAgRVhfREFUQUVSUik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9Cit9CisKK3N0YXRpYyB2b2lkCit0eXBlX2NoZWNrKHN5bWJvbF90ICpzeW1ib2wsIGV4cHJlc3Npb25fdCAqZXhwcmVzc2lvbiwgaW50IG9wY29kZSkKK3sKKwlzeW1ib2xfbm9kZV90ICpub2RlOworCWludCBhbmRfb3A7CisKKwlhbmRfb3AgPSBGQUxTRTsKKwlpZiAob3Bjb2RlID09IEFJQ19PUF9BTkQgfHwgb3Bjb2RlID09IEFJQ19PUF9KTlogfHwgQUlDX09QX0paKQorCQlhbmRfb3AgPSBUUlVFOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCB3ZSBhcmVuJ3QgYXR0ZW1wdGluZyB0byB3cml0ZSBzb21ldGhpbmcKKwkgKiB0aGF0IGhhc24ndCBiZWVuIGRlZmluZWQuICBJZiB0aGlzIGlzIGFuIGFuZCBvcGVyYXRpb24sCisJICogdGhpcyBpcyBhIG1hc2ssIHNvICJ1bmRlZmluZWQiIGJpdHMgYXJlIG9rYXkuCisJICovCisJaWYgKGFuZF9vcCA9PSBGQUxTRQorCSAmJiAoZXhwcmVzc2lvbi0+dmFsdWUgJiB+c3ltYm9sLT5pbmZvLnJpbmZvLT52YWxpZF9iaXRtYXNrKSAhPSAwKSB7CisJCXNucHJpbnRmKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksCisJCQkgIkludmFsaWQgYml0KHMpIDB4JXggaW4gaW1tZWRpYXRlIHdyaXR0ZW4gdG8gJXMiLAorCQkJIGV4cHJlc3Npb24tPnZhbHVlICYgfnN5bWJvbC0+aW5mby5yaW5mby0+dmFsaWRfYml0bWFzaywKKwkJCSBzeW1ib2wtPm5hbWUpOworCQlzdG9wKGVycmJ1ZiwgRVhfREFUQUVSUik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisKKwkvKgorCSAqIE5vdyBtYWtlIHN1cmUgdGhhdCBhbGwgb2YgdGhlIHN5bWJvbHMgcmVmZXJlbmNlZCBieSB0aGUKKwkgKiBleHByZXNzaW9uIGFyZSBkZWZpbmVkIGZvciB0aGlzIHJlZ2lzdGVyLgorCSAqLworCWlmIChzeW1ib2wtPmluZm8ucmluZm8tPnR5cGVjaGVja19tYXNrcyAhPSBGQUxTRSkgeworCQlmb3Iobm9kZSA9IGV4cHJlc3Npb24tPnJlZmVyZW5jZWRfc3ltcy5zbGhfZmlyc3Q7CisJCSAgICBub2RlICE9IE5VTEw7CisJCSAgICBub2RlID0gbm9kZS0+bGlua3Muc2xlX25leHQpIHsKKwkJCWlmICgobm9kZS0+c3ltYm9sLT50eXBlID09IE1BU0sKKwkJCSAgfHwgbm9kZS0+c3ltYm9sLT50eXBlID09IEZJRUxECisJCQkgIHx8IG5vZGUtPnN5bWJvbC0+dHlwZSA9PSBFTlVNCisJCQkgIHx8IG5vZGUtPnN5bWJvbC0+dHlwZSA9PSBFTlVNX0VOVFJZKQorCQkJICYmIHN5bWxpc3Rfc2VhcmNoKCZub2RlLT5zeW1ib2wtPmluZm8uZmluZm8tPnN5bXJlZnMsCisJCQkJCSAgIHN5bWJvbC0+bmFtZSkgPT0gTlVMTCkgeworCQkJCXNucHJpbnRmKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksCisJCQkJCSAiSW52YWxpZCBmaWVsZCBvciBtYXNrICVzICIKKwkJCQkJICJmb3IgcmVnaXN0ZXIgJXMiLAorCQkJCQkgbm9kZS0+c3ltYm9sLT5uYW1lLCBzeW1ib2wtPm5hbWUpOworCQkJCXN0b3AoZXJyYnVmLCBFWF9EQVRBRVJSKTsKKwkJCQkvKiBOT1RSRUFDSEVEICovCisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCittYWtlX2V4cHJlc3Npb24oZXhwcmVzc2lvbl90ICppbW1lZCwgaW50IHZhbHVlKQoreworCVNMSVNUX0lOSVQoJmltbWVkLT5yZWZlcmVuY2VkX3N5bXMpOworCWltbWVkLT52YWx1ZSA9IHZhbHVlICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQKK2FkZF9jb25kaXRpb25hbChzeW1ib2xfdCAqc3ltYm9sKQoreworCXN0YXRpYyBpbnQgbnVtZnVuY3M7CisKKwlpZiAobnVtZnVuY3MgPT0gMCkgeworCQkvKiBhZGQgYSBzcGVjaWFsIGNvbmRpdGlvbmFsLCAiMCIgKi8KKwkJc3ltYm9sX3QgKmZhbHNlX2Z1bmM7CisKKwkJZmFsc2VfZnVuYyA9IHN5bXRhYmxlX2dldCgiMCIpOworCQlpZiAoZmFsc2VfZnVuYy0+dHlwZSAhPSBVTklOSVRJQUxJWkVEKSB7CisJCQlzdG9wKCJDb25kaXRpb25hbCBleHByZXNzaW9uICcwJyAiCisJCQkgICAgICJjb25mbGljdHMgd2l0aCBhIHN5bWJvbCIsIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCWZhbHNlX2Z1bmMtPnR5cGUgPSBDT05ESVRJT05BTDsKKwkJaW5pdGlhbGl6ZV9zeW1ib2woZmFsc2VfZnVuYyk7CisJCWZhbHNlX2Z1bmMtPmluZm8uY29uZGluZm8tPmZ1bmNfbnVtID0gbnVtZnVuY3MrKzsKKwkJc3ltbGlzdF9hZGQoJnBhdGNoX2Z1bmN0aW9ucywgZmFsc2VfZnVuYywgU1lNTElTVF9JTlNFUlRfSEVBRCk7CisJfQorCisJLyogVGhpcyBjb25kaXRpb24gaGFzIG9jY3VycmVkIGJlZm9yZSAqLworCWlmIChzeW1ib2wtPnR5cGUgPT0gQ09ORElUSU9OQUwpCisJCXJldHVybjsKKworCWlmIChzeW1ib2wtPnR5cGUgIT0gVU5JTklUSUFMSVpFRCkgeworCQlzdG9wKCJDb25kaXRpb25hbCBleHByZXNzaW9uIGNvbmZsaWN0cyB3aXRoIGEgc3ltYm9sIiwKKwkJICAgICBFWF9EQVRBRVJSKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKworCXN5bWJvbC0+dHlwZSA9IENPTkRJVElPTkFMOworCWluaXRpYWxpemVfc3ltYm9sKHN5bWJvbCk7CisJc3ltYm9sLT5pbmZvLmNvbmRpbmZvLT5mdW5jX251bSA9IG51bWZ1bmNzKys7CisJc3ltbGlzdF9hZGQoJnBhdGNoX2Z1bmN0aW9ucywgc3ltYm9sLCBTWU1MSVNUX0lOU0VSVF9IRUFEKTsKK30KKworc3RhdGljIHZvaWQKK2FkZF92ZXJzaW9uKGNvbnN0IGNoYXIgKnZlcnN0cmluZykKK3sKKwljb25zdCBjaGFyIHByZWZpeFtdID0gIiAqICI7CisJaW50IG5ld2xlbjsKKwlpbnQgb2xkbGVuOworCisJbmV3bGVuID0gc3RybGVuKHZlcnN0cmluZykgKyBzdHJsZW4ocHJlZml4KTsKKwlvbGRsZW4gPSAwOworCWlmICh2ZXJzaW9ucyAhPSBOVUxMKQorCQlvbGRsZW4gPSBzdHJsZW4odmVyc2lvbnMpOworCXZlcnNpb25zID0gcmVhbGxvYyh2ZXJzaW9ucywgbmV3bGVuICsgb2xkbGVuICsgMik7CisJaWYgKHZlcnNpb25zID09IE5VTEwpCisJCXN0b3AoIkNhbid0IGFsbG9jYXRlIHZlcnNpb24gc3RyaW5nIiwgRVhfU09GVFdBUkUpOworCXN0cmNweSgmdmVyc2lvbnNbb2xkbGVuXSwgcHJlZml4KTsKKwlzdHJjcHkoJnZlcnNpb25zW29sZGxlbiArIHN0cmxlbihwcmVmaXgpXSwgdmVyc3RyaW5nKTsKKwl2ZXJzaW9uc1tuZXdsZW4gKyBvbGRsZW5dID0gJ1xuJzsKKwl2ZXJzaW9uc1tuZXdsZW4gKyBvbGRsZW4gKyAxXSA9ICdcMCc7Cit9CisKK3ZvaWQKK3l5ZXJyb3IoY29uc3QgY2hhciAqc3RyaW5nKQoreworCXN0b3Aoc3RyaW5nLCBFWF9EQVRBRVJSKTsKK30KKworc3RhdGljIGludAoraXNfZG93bmxvYWRfY29uc3QoZXhwcmVzc2lvbl90ICppbW1lZCkKK3sKKwlpZiAoKGltbWVkLT5yZWZlcmVuY2VkX3N5bXMuc2xoX2ZpcnN0ICE9IE5VTEwpCisJICYmIChpbW1lZC0+cmVmZXJlbmNlZF9zeW1zLnNsaF9maXJzdC0+c3ltYm9sLT50eXBlID09IERPV05MT0FEX0NPTlNUKSkKKwkJcmV0dXJuIChUUlVFKTsKKworCXJldHVybiAoRkFMU0UpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9pbnNmb3JtYXQuaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21faW5zZm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4MGYwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21faW5zZm9ybWF0LmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBJbnN0cnVjdGlvbiBmb3JtYXRzIGZvciB0aGUgc2VxdWVuY2VyIHByb2dyYW0gZG93bmxvYWRlZCB0bworICogQWljN3h4eCBTQ1NJIGhvc3QgYWRhcHRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTgsIDIwMDAgSnVzdGluIFQuIEdpYmJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICoKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljYXNtL2FpY2FzbV9pbnNmb3JtYXQuaCMxMSAkCisgKgorICogJEZyZWVCU0QkCisgKi8KKworc3RydWN0IGluc19mb3JtYXQxIHsKKyNpZiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KKwl1aW50MzJfdAlpbW1lZGlhdGUJOiA4LAorCQkJc291cmNlCQk6IDksCisJCQlkZXN0aW5hdGlvbgk6IDksCisJCQlyZXQJCTogMSwKKwkJCW9wY29kZQkJOiA0LAorCQkJcGFyaXR5CQk6IDE7CisjZWxzZQorCXVpbnQzMl90CXBhcml0eQkJOiAxLAorCQkJb3Bjb2RlCQk6IDQsCisJCQlyZXQJCTogMSwKKwkJCWRlc3RpbmF0aW9uCTogOSwKKwkJCXNvdXJjZQkJOiA5LAorCQkJaW1tZWRpYXRlCTogODsKKyNlbmRpZgorfTsKKworc3RydWN0IGluc19mb3JtYXQyIHsKKyNpZiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KKwl1aW50MzJfdAlzaGlmdF9jb250cm9sCTogOCwKKwkJCXNvdXJjZQkJOiA5LAorCQkJZGVzdGluYXRpb24JOiA5LAorCQkJcmV0CQk6IDEsCisJCQlvcGNvZGUJCTogNCwKKwkJCXBhcml0eQkJOiAxOworI2Vsc2UKKwl1aW50MzJfdAlwYXJpdHkJCTogMSwKKwkJCW9wY29kZQkJOiA0LAorCQkJcmV0CQk6IDEsCisJCQlkZXN0aW5hdGlvbgk6IDksCisJCQlzb3VyY2UJCTogOSwKKwkJCXNoaWZ0X2NvbnRyb2wJOiA4OworI2VuZGlmCit9OworCitzdHJ1Y3QgaW5zX2Zvcm1hdDMgeworI2lmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTgorCXVpbnQzMl90CWltbWVkaWF0ZQk6IDgsCisJCQlzb3VyY2UJCTogOSwKKwkJCWFkZHJlc3MJCTogMTAsCisJCQlvcGNvZGUJCTogNCwKKwkJCXBhcml0eQkJOiAxOworI2Vsc2UKKwl1aW50MzJfdAlwYXJpdHkJCTogMSwKKwkJCW9wY29kZQkJOiA0LAorCQkJYWRkcmVzcwkJOiAxMCwKKwkJCXNvdXJjZQkJOiA5LAorCQkJaW1tZWRpYXRlCTogODsKKyNlbmRpZgorfTsKKwordW5pb24gaW5zX2Zvcm1hdHMgeworCQlzdHJ1Y3QgaW5zX2Zvcm1hdDEgZm9ybWF0MTsKKwkJc3RydWN0IGluc19mb3JtYXQyIGZvcm1hdDI7CisJCXN0cnVjdCBpbnNfZm9ybWF0MyBmb3JtYXQzOworCQl1aW50OF90CQkgICBieXRlc1s0XTsKKwkJdWludDMyX3QJICAgaW50ZWdlcjsKK307CitzdHJ1Y3QgaW5zdHJ1Y3Rpb24geworCXVuaW9uCWluc19mb3JtYXRzIGZvcm1hdDsKKwl1X2ludAlzcmNsaW5lOworCXN0cnVjdCBzeW1ib2wgKnBhdGNoX2xhYmVsOworCVNUQUlMUV9FTlRSWShpbnN0cnVjdGlvbikgbGlua3M7Cit9OworCisjZGVmaW5lCUFJQ19PUF9PUgkweDAKKyNkZWZpbmUJQUlDX09QX0FORAkweDEKKyNkZWZpbmUgQUlDX09QX1hPUgkweDIKKyNkZWZpbmUJQUlDX09QX0FERAkweDMKKyNkZWZpbmUJQUlDX09QX0FEQwkweDQKKyNkZWZpbmUJQUlDX09QX1JPTAkweDUKKyNkZWZpbmUJQUlDX09QX0JNT1YJMHg2CisKKyNkZWZpbmUJQUlDX09QX0pNUAkweDgKKyNkZWZpbmUgQUlDX09QX0pDCTB4OQorI2RlZmluZSBBSUNfT1BfSk5DCTB4YQorI2RlZmluZSBBSUNfT1BfQ0FMTAkweGIKKyNkZWZpbmUJQUlDX09QX0pORQkweGMKKyNkZWZpbmUJQUlDX09QX0pOWgkweGQKKyNkZWZpbmUJQUlDX09QX0pFCTB4ZQorI2RlZmluZQlBSUNfT1BfSloJMHhmCisKKy8qIFBzZXVkbyBPcHMgKi8KKyNkZWZpbmUJQUlDX09QX1NITAkweDEwCisjZGVmaW5lCUFJQ19PUF9TSFIJMHgyMAorI2RlZmluZQlBSUNfT1BfUk9SCTB4MzAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fbWFjcm9fZ3JhbS55IGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9tYWNyb19ncmFtLnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM5Zjc2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fbWFjcm9fZ3JhbS55CkBAIC0wLDAgKzEsMTY0IEBACisleworLyoKKyAqIFN1Yi1wYXJzZXIgZm9yIG1hY3JvIGludm9jYXRpb24gaW4gdGhlIEFpYzd4eHggU0NTSQorICogSG9zdCBhZGFwdGVyIHNlcXVlbmNlciBhc3NlbWJsZXIuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEFkYXB0ZWMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICoKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljYXNtL2FpY2FzbV9tYWNyb19ncmFtLnkjNSAkCisgKgorICogJEZyZWVCU0QkCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxyZWdleC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzZXhpdHMuaD4KKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgIi4uL3F1ZXVlLmgiCisjZWxzZQorI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJhaWNhc20uaCIKKyNpbmNsdWRlICJhaWNhc21fc3ltYm9sLmgiCisjaW5jbHVkZSAiYWljYXNtX2luc2Zvcm1hdC5oIgorCitzdGF0aWMgc3ltYm9sX3QgKm1hY3JvX3N5bWJvbDsKKworc3RhdGljIHZvaWQgYWRkX21hY3JvX2FyZyhjb25zdCBjaGFyICphcmd0ZXh0LCBpbnQgcG9zaXRpb24pOworCislfQorCisldW5pb24geworCWludAkJdmFsdWU7CisJY2hhcgkJKnN0cjsKKwlzeW1ib2xfdAkqc3ltOworfQorCisKKyV0b2tlbiA8c3RyPiBUX0FSRworCisldG9rZW4gPHN5bT4gVF9TWU1CT0wKKworJXR5cGUgPHZhbHVlPiBtYWNyb19hcmdsaXN0CisKKyUlCisKK21hY3JvY2FsbDoKKwlUX1NZTUJPTCAnKCcKKwl7CisJCW1hY3JvX3N5bWJvbCA9ICQxOworCX0KKwltYWNyb19hcmdsaXN0ICcpJworCXsKKwkJaWYgKG1hY3JvX3N5bWJvbC0+aW5mby5tYWNyb2luZm8tPm5hcmcgIT0gJDQpIHsKKwkJCXByaW50ZigiTmFyZyA9PSAlZCIsIG1hY3JvX3N5bWJvbC0+aW5mby5tYWNyb2luZm8tPm5hcmcpOworCQkJc3RvcCgiVG9vIGZldyBhcmd1bWVudHMgZm9yIG1hY3JvIGludm9jYXRpb24iLAorCQkJICAgICBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQltYWNyb19zeW1ib2wgPSBOVUxMOworCQlZWUFDQ0VQVDsKKwl9Cis7CisKK21hY3JvX2FyZ2xpc3Q6CisJeworCQkvKiBNYWNyb3MgY2FuIHRha2UgMCBhcmd1bWVudHMgKi8KKwkJJCQgPSAwOworCX0KK3wJVF9BUkcKKwl7CisJCSQkID0gMTsKKwkJYWRkX21hY3JvX2FyZygkMSwgMSk7CisJfQorfAltYWNyb19hcmdsaXN0ICcsJyBUX0FSRworCXsKKwkJaWYgKCQxID09IDApIHsKKwkJCXN0b3AoIkNvbW1hIHdpdGhvdXQgcHJlY2VlZGluZyBhcmd1bWVudCBpbiBhcmcgbGlzdCIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCSQkID0gJDEgKyAxOworCQlhZGRfbWFjcm9fYXJnKCQzLCAkJCk7CisJfQorOworCislJQorCitzdGF0aWMgdm9pZAorYWRkX21hY3JvX2FyZyhjb25zdCBjaGFyICphcmd0ZXh0LCBpbnQgYXJnbnVtKQoreworCXN0cnVjdCBtYWNyb19hcmcgKm1hcmc7CisJaW50IGk7CisKKwlpZiAobWFjcm9fc3ltYm9sID09IE5VTEwgfHwgbWFjcm9fc3ltYm9sLT50eXBlICE9IE1BQ1JPKSB7CisJCXN0b3AoIkludmFsaWQgY3VycmVudCBzeW1ib2wgZm9yIGFkZGluZyBtYWNybyBhcmciLAorCQkgICAgIEVYX1NPRlRXQVJFKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKwkvKgorCSAqIE1hY3JvIEludm9jYXRpb24uICBGaW5kIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudCBhbmQgZmlsbAorCSAqIGluIHRoZSByZXBsYWNlIG1lbnQgdGV4dCBmb3IgdGhpcyBjYWxsLgorCSAqLworCWkgPSAwOworCVNUQUlMUV9GT1JFQUNIKG1hcmcsICZtYWNyb19zeW1ib2wtPmluZm8ubWFjcm9pbmZvLT5hcmdzLCBsaW5rcykgeworCQlpKys7CisJCWlmIChpID09IGFyZ251bSkKKwkJCWJyZWFrOworCX0KKwlpZiAobWFyZyA9PSBOVUxMKSB7CisJCXN0b3AoIlRvbyBtYW55IGFyZ3VtZW50cyBmb3IgbWFjcm8gaW52b2NhdGlvbiIsIEVYX0RBVEFFUlIpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCW1hcmctPnJlcGxhY2VtZW50X3RleHQgPSBzdHJkdXAoYXJndGV4dCk7CisJaWYgKG1hcmctPnJlcGxhY2VtZW50X3RleHQgPT0gTlVMTCkgeworCQlzdG9wKCJVbmFibGUgdG8gcmVwbGljYXRlIHJlcGxhY2VtZW50IHRleHQiLCBFWF9TT0ZUV0FSRSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9Cit9CisKK3ZvaWQKK21tZXJyb3IoY29uc3QgY2hhciAqc3RyaW5nKQoreworCXN0b3Aoc3RyaW5nLCBFWF9EQVRBRVJSKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fbWFjcm9fc2Nhbi5sIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9tYWNyb19zY2FuLmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2ZTcwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fbWFjcm9fc2Nhbi5sCkBAIC0wLDAgKzEsMTU2IEBACisleworLyoKKyAqIFN1Yi1MZXhpY2FsIEFuYWx5emVyIGZvciBtYWNybyBpbnZva2F0aW9uIGluIAorICogdGhlIEFpYzd4eHggU0NTSSBIb3N0IGFkYXB0ZXIgc2VxdWVuY2VyIGFzc2VtYmxlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWNhc20vYWljYXNtX21hY3JvX3NjYW4ubCM4ICQKKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXNleGl0cy5oPgorI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgIi4uL3F1ZXVlLmgiCisjZWxzZQorI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJhaWNhc20uaCIKKyNpbmNsdWRlICJhaWNhc21fc3ltYm9sLmgiCisjaW5jbHVkZSAiYWljYXNtX21hY3JvX2dyYW0uaCIKKworI2RlZmluZSBNQVhfU1RSX0NPTlNUIDQwOTYKK3N0YXRpYyBjaGFyIHN0cmluZ19idWZbTUFYX1NUUl9DT05TVF07CitzdGF0aWMgY2hhciAqc3RyaW5nX2J1Zl9wdHI7CitzdGF0aWMgaW50ICBwYXJyZW5fY291bnQ7CitzdGF0aWMgY2hhciBidWZbMjU1XTsKKyV9CisKK1dPUkQJCVtBLVphLXpfXVstQS1aYS16XzAtOV0qCitTUEFDRQkJWyBcdF0rCitNQ0FSRwkJW14oKSwgXHRdKworCisleCBBUkdMSVNUCisKKyUlCitcbgkJCXsKKwkJCQkrK3l5bGluZW5vOworCQkJfQorXHIJCQk7Cis8QVJHTElTVD57U1BBQ0V9CTsKKzxBUkdMSVNUPlwoCQl7CisJCQkJcGFycmVuX2NvdW50Kys7CisJCQkJaWYgKHBhcnJlbl9jb3VudCA9PSAxKSB7CisJCQkJCXN0cmluZ19idWZfcHRyID0gc3RyaW5nX2J1ZjsKKwkJCQkJcmV0dXJuICgnKCcpOworCQkJCX0KKwkJCQkqc3RyaW5nX2J1Zl9wdHIrKyA9ICcoJzsKKwkJCX0KKzxBUkdMSVNUPlwpCQl7CisJCQkJaWYgKHBhcnJlbl9jb3VudCA9PSAxKSB7CisJCQkJCWlmIChzdHJpbmdfYnVmX3B0ciAhPSBzdHJpbmdfYnVmKSB7CisJCQkJCQkvKgorCQkJCQkJICogUmV0dXJuIGFuIGFyZ3VtZW50IGFuZAorCQkJCQkJICogcmVzY2FuIHRoaXMgcGFycmVuIHNvIHdlCisJCQkJCQkgKiBjYW4gcmV0dXJuIGl0IGFzIHdlbGwuCisJCQkJCQkgKi8KKwkJCQkJCSpzdHJpbmdfYnVmX3B0ciA9ICdcMCc7CisJCQkJCQltbWx2YWwuc3RyID0gc3RyaW5nX2J1ZjsKKwkJCQkJCXN0cmluZ19idWZfcHRyID0gc3RyaW5nX2J1ZjsKKwkJCQkJCXVucHV0KCcpJyk7CisJCQkJCQlyZXR1cm4gVF9BUkc7CisJCQkJCX0KKwkJCQkJQkVHSU4gSU5JVElBTDsKKwkJCQkJcmV0dXJuICgnKScpOworCQkJCX0KKwkJCQlwYXJyZW5fY291bnQtLTsKKwkJCQkqc3RyaW5nX2J1Zl9wdHIrKyA9ICcpJzsKKwkJCX0KKzxBUkdMSVNUPntNQ0FSR30JeworCQkJCWNoYXIgKnlwdHI7CisKKwkJCQl5cHRyID0gbW10ZXh0OworCQkJCXdoaWxlICgqeXB0cikKKwkJCQkJKnN0cmluZ19idWZfcHRyKysgPSAqeXB0cisrOworCQkJfQorPEFSR0xJU1Q+XCwJCXsKKwkJCQlpZiAoc3RyaW5nX2J1Zl9wdHIgIT0gc3RyaW5nX2J1ZikgeworCQkJCQkvKgorCQkJCQkgKiBSZXR1cm4gYW4gYXJndW1lbnQgYW5kCisJCQkJCSAqIHJlc2NhbiB0aGlzIGNvbW1hIHNvIHdlCisJCQkJCSAqIGNhbiByZXR1cm4gaXQgYXMgd2VsbC4KKwkJCQkJICovCisJCQkJCSpzdHJpbmdfYnVmX3B0ciA9ICdcMCc7CisJCQkJCW1tbHZhbC5zdHIgPSBzdHJpbmdfYnVmOworCQkJCQlzdHJpbmdfYnVmX3B0ciA9IHN0cmluZ19idWY7CisJCQkJCXVucHV0KCcsJyk7CisJCQkJCXJldHVybiBUX0FSRzsKKwkJCQl9CisJCQkJcmV0dXJuICcsJzsKKwkJCX0KK3tXT1JEfVsoXQkJeworCQkJCS8qIE1heSBiZSBhIHN5bWJvbCBvciBhIG1hY3JvIGludm9jYXRpb24uICovCisJCQkJbW1sdmFsLnN5bSA9IHN5bXRhYmxlX2dldChtbXRleHQpOworCQkJCWlmIChtbWx2YWwuc3ltLT50eXBlICE9IE1BQ1JPKSB7CisJCQkJCXN0b3AoIkV4cGVjdGluZyBNYWNybyBOYW1lIiwKKwkJCQkJICAgICBFWF9EQVRBRVJSKTsKKwkJCQl9CisJCQkJdW5wdXQoJygnKTsKKwkJCQlwYXJyZW5fY291bnQgPSAwOworCQkJCUJFR0lOIEFSR0xJU1Q7CisJCQkJcmV0dXJuIFRfU1lNQk9MOworCQkJfQorLgkJCXsgCisJCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkludmFsaWQgY2hhcmFjdGVyICIKKwkJCQkJICInJWMnIiwgbW10ZXh0WzBdKTsKKwkJCQlzdG9wKGJ1ZiwgRVhfREFUQUVSUik7CisJCQl9CislJQorCitpbnQKK21td3JhcCgpCit7CisJc3RvcCgiRU9GIGVuY291bnRlcmVkIGluIG1hY3JvIGNhbGwiLCBFWF9EQVRBRVJSKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fc2Nhbi5sIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9zY2FuLmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjMGIyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fc2Nhbi5sCkBAIC0wLDAgKzEsNjA3IEBACisleworLyoKKyAqIExleGljYWwgQW5hbHl6ZXIgZm9yIHRoZSBBaWM3eHh4IFNDU0kgSG9zdCBhZGFwdGVyIHNlcXVlbmNlciBhc3NlbWJsZXIuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk4LCAyMDAwIEp1c3RpbiBULiBHaWJicy4KKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpY2FzbS9haWNhc21fc2Nhbi5sIzE5ICQKKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXNleGl0cy5oPgorI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgIi4uL3F1ZXVlLmgiCisjZWxzZQorI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJhaWNhc20uaCIKKyNpbmNsdWRlICJhaWNhc21fc3ltYm9sLmgiCisjaW5jbHVkZSAiYWljYXNtX2dyYW0uaCIKKworLyogVGhpcyBpcyB1c2VkIGZvciBtYWNybyBib2R5IGNhcHR1cmUgdG9vLCBzbyBlcnIgb24gdGhlIGxhcmdlIHNpemUuICovCisjZGVmaW5lIE1BWF9TVFJfQ09OU1QgNDA5Ngorc3RhdGljIGNoYXIgc3RyaW5nX2J1ZltNQVhfU1RSX0NPTlNUXTsKK3N0YXRpYyBjaGFyICpzdHJpbmdfYnVmX3B0cjsKK3N0YXRpYyBpbnQgIHBhcnJlbl9jb3VudDsKK3N0YXRpYyBpbnQgIHF1b3RlX2NvdW50Oworc3RhdGljIGNoYXIgYnVmWzI1NV07CislfQorCitQQVRICQkoWy9dKlstQS1aYS16MC05Xy5dKSsKK1dPUkQJCVtBLVphLXpfXVstQS1aYS16XzAtOV0qCitTUEFDRQkJWyBcdF0rCitNQ0FSRwkJW14oKSwgXHRdKworTUJPRFkJCSgoXFxbXlxuXSkqW15cblxcXSopKworCisleCBDT01NRU5UCisleCBDRVhQUgorJXggSU5DTFVERQorJXggU1RSSU5HCisleCBNQUNST0RFRgorJXggTUFDUk9BUkdMSVNUCisleCBNQUNST0NBTExBUkdTCisleCBNQUNST0JPRFkKKworJSUKK1xuCQkJeyArK3l5bGluZW5vOyB9CitccgkJCTsKKyIvKiIJCQl7IEJFR0lOIENPTU1FTlQ7ICAvKiBFbnRlciBjb21tZW50IGVhdGluZyBzdGF0ZSAqLyB9Cis8Q09NTUVOVD4iLyoiCQl7IGZwcmludGYoc3RkZXJyLCAiV2FybmluZyEgQ29tbWVudCB3aXRoaW4gY29tbWVudC4iKTsgfQorPENPTU1FTlQ+XG4JCXsgKyt5eWxpbmVubzsgfQorPENPTU1FTlQ+W14qL1xuXSoJOworPENPTU1FTlQ+IioiK1teKi9cbl0qCTsKKzxDT01NRU5UPiIvIitbXiovXG5dKgk7Cis8Q09NTUVOVD4iKiIrIi8iCXsgQkVHSU4gSU5JVElBTDsgfQoraWZbIFx0XSpcKAkJeworCQkJCXN0cmluZ19idWZfcHRyID0gc3RyaW5nX2J1ZjsKKwkJCQlwYXJyZW5fY291bnQgPSAxOworCQkJCUJFR0lOIENFWFBSOworCQkJCXJldHVybiBUX0lGOworCQkJfQorPENFWFBSPlwoCQl7CSpzdHJpbmdfYnVmX3B0cisrID0gJygnOyBwYXJyZW5fY291bnQrKzsgfQorPENFWFBSPlwpCQl7CisJCQkJcGFycmVuX2NvdW50LS07CisJCQkJaWYgKHBhcnJlbl9jb3VudCA9PSAwKSB7CisJCQkJCS8qIEFsbCBkb25lICovCisJCQkJCUJFR0lOIElOSVRJQUw7CisJCQkJCSpzdHJpbmdfYnVmX3B0ciA9ICdcMCc7CisJCQkJCXl5bHZhbC5zeW0gPSBzeW10YWJsZV9nZXQoc3RyaW5nX2J1Zik7CisJCQkJCXJldHVybiBUX0NFWFBSOworCQkJCX0gZWxzZSB7CisJCQkJCSpzdHJpbmdfYnVmX3B0cisrID0gJyknOworCQkJCX0KKwkJCX0KKzxDRVhQUj5cbgkJeyArK3l5bGluZW5vOyB9Cis8Q0VYUFI+XHIJCTsKKzxDRVhQUj5bXigpXG5dKwl7CisJCQkJY2hhciAqeXB0cjsKKworCQkJCXlwdHIgPSB5eXRleHQ7CisJCQkJd2hpbGUgKCp5cHRyICE9ICdcMCcpIHsKKwkJCQkJLyogUmVtb3ZlIGR1cGxpY2F0ZSBzcGFjZXMgKi8KKwkJCQkJaWYgKCp5cHRyID09ICdcdCcpCisJCQkJCQkqeXB0ciA9ICcgJzsKKwkJCQkJaWYgKCp5cHRyID09ICcgJworCQkJCQkgJiYgc3RyaW5nX2J1Zl9wdHIgIT0gc3RyaW5nX2J1ZgorCQkJCQkgJiYgc3RyaW5nX2J1Zl9wdHJbLTFdID09ICcgJykKKwkJCQkJCXlwdHIrKzsKKwkJCQkJZWxzZSAKKwkJCQkJCSpzdHJpbmdfYnVmX3B0cisrID0gKnlwdHIrKzsKKwkJCQl9CisJCQl9CisKK1ZFUlNJT04JCQl7IHJldHVybiBUX1ZFUlNJT047IH0KK1BSRUZJWAkJCXsgcmV0dXJuIFRfUFJFRklYOyB9CitQQVRDSF9BUkdfTElTVAkJeyByZXR1cm4gVF9QQVRDSF9BUkdfTElTVDsgfQorXCIJCQl7CisJCQkJc3RyaW5nX2J1Zl9wdHIgPSBzdHJpbmdfYnVmOworCQkJCUJFR0lOIFNUUklORzsKKwkJCX0KKzxTVFJJTkc+W14iXSsJCXsKKwkJCQljaGFyICp5cHRyOworCisJCQkJeXB0ciA9IHl5dGV4dDsKKwkJCQl3aGlsZSAoKnlwdHIpCisJCQkJCSpzdHJpbmdfYnVmX3B0cisrID0gKnlwdHIrKzsKKwkJCX0KKzxTVFJJTkc+XCIJCXsKKwkJCQkvKiBBbGwgZG9uZSAqLworCQkJCUJFR0lOIElOSVRJQUw7CisJCQkJKnN0cmluZ19idWZfcHRyID0gJ1wwJzsKKwkJCQl5eWx2YWwuc3RyID0gc3RyaW5nX2J1ZjsKKwkJCQlyZXR1cm4gVF9TVFJJTkc7CisJCQl9Cit7U1BBQ0V9CQkJIDsKKworCS8qIFJlZ2lzdGVyL1NDQi9TUkFNIGRlZmluaXRpb24ga2V5d29yZHMgKi8KK2V4cG9ydAkJCXsgcmV0dXJuIFRfRVhQT1JUOyB9CityZWdpc3RlcgkJeyByZXR1cm4gVF9SRUdJU1RFUjsgfQorY29uc3QJCQl7IHl5bHZhbC52YWx1ZSA9IEZBTFNFOyByZXR1cm4gVF9DT05TVDsgfQorZG93bmxvYWQJCXsgcmV0dXJuIFRfRE9XTkxPQUQ7IH0KK2FkZHJlc3MJCQl7IHJldHVybiBUX0FERFJFU1M7IH0KK2FjY2Vzc19tb2RlCQl7IHJldHVybiBUX0FDQ0VTU19NT0RFOyB9Cittb2RlcwkJCXsgcmV0dXJuIFRfTU9ERVM7IH0KK1JXfFJPfFdPCQl7CisJCQkJIGlmIChzdHJjbXAoeXl0ZXh0LCAiUlciKSA9PSAwKQorCQkJCQl5eWx2YWwudmFsdWUgPSBSVzsKKwkJCQkgZWxzZSBpZiAoc3RyY21wKHl5dGV4dCwgIlJPIikgPT0gMCkKKwkJCQkJeXlsdmFsLnZhbHVlID0gUk87CisJCQkJIGVsc2UKKwkJCQkJeXlsdmFsLnZhbHVlID0gV087CisJCQkJIHJldHVybiBUX01PREU7CisJCQl9CitCRUdJTl9DUklUSUNBTAkJeyByZXR1cm4gVF9CRUdJTl9DUzsgfQorRU5EX0NSSVRJQ0FMCQl7IHJldHVybiBUX0VORF9DUzsgfQorU0VUX1NSQ19NT0RFCQl7IHJldHVybiBUX1NFVF9TUkNfTU9ERTsgfQorU0VUX0RTVF9NT0RFCQl7IHJldHVybiBUX1NFVF9EU1RfTU9ERTsgfQorZmllbGQJCQl7IHJldHVybiBUX0ZJRUxEOyB9CitlbnVtCQkJeyByZXR1cm4gVF9FTlVNOyB9CittYXNrCQkJeyByZXR1cm4gVF9NQVNLOyB9CithbGlhcwkJCXsgcmV0dXJuIFRfQUxJQVM7IH0KK3NpemUJCQl7IHJldHVybiBUX1NJWkU7IH0KK3NjYgkJCXsgcmV0dXJuIFRfU0NCOyB9CitzY3JhdGNoX3JhbQkJeyByZXR1cm4gVF9TUkFNOyB9CithY2N1bXVsYXRvcgkJeyByZXR1cm4gVF9BQ0NVTTsgfQorbW9kZV9wb2ludGVyCQl7IHJldHVybiBUX01PREVfUFRSOyB9CithbGxvbmVzCQkJeyByZXR1cm4gVF9BTExPTkVTOyB9CithbGx6ZXJvcwkJeyByZXR1cm4gVF9BTExaRVJPUzsgfQorbm9uZQkJCXsgcmV0dXJuIFRfTk9ORTsgfQorc2luZGV4CQkJeyByZXR1cm4gVF9TSU5ERVg7IH0KK0EJCQl7IHJldHVybiBUX0E7IH0KKworCS8qIE9wY29kZXMgKi8KK3NobAkJCXsgcmV0dXJuIFRfU0hMOyB9CitzaHIJCQl7IHJldHVybiBUX1NIUjsgfQorcm9yCQkJeyByZXR1cm4gVF9ST1I7IH0KK3JvbAkJCXsgcmV0dXJuIFRfUk9MOyB9CittdmkJCQl7IHJldHVybiBUX01WSTsgfQorbW92CQkJeyByZXR1cm4gVF9NT1Y7IH0KK2NscgkJCXsgcmV0dXJuIFRfQ0xSOyB9CitqbXAJCQl7IHJldHVybiBUX0pNUDsgfQoramMJCQl7IHJldHVybiBUX0pDOwl9CitqbmMJCQl7IHJldHVybiBUX0pOQzsJfQoramUJCQl7IHJldHVybiBUX0pFOwl9CitqbmUJCQl7IHJldHVybiBUX0pORTsJfQoranoJCQl7IHJldHVybiBUX0paOwl9CitqbnoJCQl7IHJldHVybiBUX0pOWjsJfQorY2FsbAkJCXsgcmV0dXJuIFRfQ0FMTDsgfQorYWRkCQkJeyByZXR1cm4gVF9BREQ7IH0KK2FkYwkJCXsgcmV0dXJuIFRfQURDOyB9CitibW92CQkJeyByZXR1cm4gVF9CTU9WOyB9CitpbmMJCQl7IHJldHVybiBUX0lOQzsgfQorZGVjCQkJeyByZXR1cm4gVF9ERUM7IH0KK3N0YwkJCXsgcmV0dXJuIFRfU1RDOwl9CitjbGMJCQl7IHJldHVybiBUX0NMQzsgfQorY21wCQkJeyByZXR1cm4gVF9DTVA7CX0KK25vdAkJCXsgcmV0dXJuIFRfTk9UOwl9Cit4b3IJCQl7IHJldHVybiBUX1hPUjsJfQordGVzdAkJCXsgcmV0dXJuIFRfVEVTVDt9CithbmQJCQl7IHJldHVybiBUX0FORDsJfQorb3IJCQl7IHJldHVybiBUX09SOwl9CityZXQJCQl7IHJldHVybiBUX1JFVDsgfQorbm9wCQkJeyByZXR1cm4gVF9OT1A7IH0KK2Vsc2UJCQl7IHJldHVybiBUX0VMU0U7IH0KKworCS8qIEFsbG93ZWQgU3ltYm9scyAqLworXDxcPAkJCXsgcmV0dXJuIFRfRVhQUl9MU0hJRlQ7IH0KK1w+XD4JCQl7IHJldHVybiBUX0VYUFJfUlNISUZUOyB9CitbLSssOigpfnwmLiJ7fTs8PltcXS8qIT1dIHsgcmV0dXJuIHl5dGV4dFswXTsgfQorCisJLyogTnVtYmVyIHByb2Nlc3NpbmcgKi8KKzBbMC03XSoJCQl7CisJCQkJeXlsdmFsLnZhbHVlID0gc3RydG9sKHl5dGV4dCwgTlVMTCwgOCk7CisJCQkJcmV0dXJuIFRfTlVNQkVSOworCQkJfQorCiswW3hYXVswLTlhLWZBLUZdKwl7CisJCQkJeXlsdmFsLnZhbHVlID0gc3RydG91bCh5eXRleHQgKyAyLCBOVUxMLCAxNik7CisJCQkJcmV0dXJuIFRfTlVNQkVSOworCQkJfQorCitbMS05XVswLTldKgkJeworCQkJCXl5bHZhbC52YWx1ZSA9IHN0cnRvbCh5eXRleHQsIE5VTEwsIDEwKTsKKwkJCQlyZXR1cm4gVF9OVU1CRVI7CisJCQl9CisJLyogSW5jbHVkZSBGaWxlcyAqLworI2luY2x1ZGV7U1BBQ0V9CQl7CisJCQkJQkVHSU4gSU5DTFVERTsKKwkJCQlxdW90ZV9jb3VudCA9IDA7CisJCQkJcmV0dXJuIFRfSU5DTFVERTsKKwkJCX0KKzxJTkNMVURFPls8XQkJeyByZXR1cm4geXl0ZXh0WzBdOyB9Cis8SU5DTFVERT5bPl0JCXsgQkVHSU4gSU5JVElBTDsgcmV0dXJuIHl5dGV4dFswXTsgfQorPElOQ0xVREU+W1wiXQkJeworCQkJCWlmIChxdW90ZV9jb3VudCAhPSAwKQorCQkJCQlCRUdJTiBJTklUSUFMOworCQkJCXF1b3RlX2NvdW50Kys7CisJCQkJcmV0dXJuIHl5dGV4dFswXTsKKwkJCX0KKzxJTkNMVURFPntQQVRIfQkJeworCQkJCWNoYXIgKnlwdHI7CisKKwkJCQl5cHRyID0geXl0ZXh0OworCQkJCXN0cmluZ19idWZfcHRyID0gc3RyaW5nX2J1ZjsKKwkJCQl3aGlsZSAoKnlwdHIpCisJCQkJCSpzdHJpbmdfYnVmX3B0cisrID0gKnlwdHIrKzsKKwkJCQl5eWx2YWwuc3RyID0gc3RyaW5nX2J1ZjsKKwkJCQkqc3RyaW5nX2J1Zl9wdHIgPSAnXDAnOworCQkJCXJldHVybiBUX1BBVEg7CisJCQl9Cis8SU5DTFVERT4uCQl7IHN0b3AoIkludmFsaWQgaW5jbHVkZSBsaW5lIiwgRVhfREFUQUVSUik7IH0KKyNkZWZpbmV7U1BBQ0V9CQl7CisJCQkJQkVHSU4gTUFDUk9ERUY7CisJCQkJcmV0dXJuIFRfREVGSU5FOworCQkJfQorPE1BQ1JPREVGPntXT1JEfXtTUEFDRX0JeyAKKwkJCQljaGFyICp5cHRyOworCisJCQkJLyogU3RyaXAgc3BhY2UgYW5kIHJldHVybiBhcyBhIG5vcm1hbCBzeW1ib2wgKi8KKwkJCQl5cHRyID0geXl0ZXh0OworCQkJCXdoaWxlICgqeXB0ciAhPSAnICcgJiYgKnlwdHIgIT0gJ1x0JykKKwkJCQkJeXB0cisrOworCQkJCSp5cHRyID0gJ1wwJzsKKwkJCQl5eWx2YWwuc3ltID0gc3ltdGFibGVfZ2V0KHl5dGV4dCk7CisJCQkJc3RyaW5nX2J1Zl9wdHIgPSBzdHJpbmdfYnVmOworCQkJCUJFR0lOIE1BQ1JPQk9EWTsKKwkJCQlyZXR1cm4gVF9TWU1CT0w7CisJCQl9Cis8TUFDUk9ERUY+e1dPUkR9XCgJeworCQkJCS8qCisJCQkJICogV2Ugc3RvcmUgdGhlIHN5bWJvbCB3aXRoIGl0cyBvcGVuaW5nCisJCQkJICogcGFycmVuIHNvIHdlIGNhbiBkaWZmZXJlbnRpYXRlIG1hY3JvcworCQkJCSAqIHRoYXQgdGFrZSBhcmdzIGZyb20gbWFjcm9zIHdpdGggdGhlCisJCQkJICogc2FtZSBuYW1lIHRoYXQgZG8gbm90IHRha2UgYXJncyBhcworCQkJCSAqIGlzIGFsbG93ZWQgaW4gQy4KKwkJCQkgKi8KKwkJCQlCRUdJTiBNQUNST0FSR0xJU1Q7CisJCQkJeXlsdmFsLnN5bSA9IHN5bXRhYmxlX2dldCh5eXRleHQpOworCQkJCXVucHV0KCcoJyk7CisJCQkJcmV0dXJuIFRfU1lNQk9MOworCQkJfQorPE1BQ1JPQVJHTElTVD57V09SRH0JeworCQkJCXl5bHZhbC5zdHIgPSB5eXRleHQ7CisJCQkJcmV0dXJuIFRfQVJHOworCQkJfQorPE1BQ1JPQVJHTElTVD57U1BBQ0V9ICAgOworPE1BQ1JPQVJHTElTVD5bKCxdCXsKKwkJCQlyZXR1cm4geXl0ZXh0WzBdOworCQkJfQorPE1BQ1JPQVJHTElTVD5bKV0JeworCQkJCXN0cmluZ19idWZfcHRyID0gc3RyaW5nX2J1ZjsKKwkJCQlCRUdJTiBNQUNST0JPRFk7CisJCQkJcmV0dXJuICcpJzsKKwkJCX0KKzxNQUNST0FSR0xJU1Q+LgkJeworCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJJbnZhbGlkIGNoYXJhY3RlciAiCisJCQkJCSAiJyVjJyBpbiBtYWNybyBhcmd1bWVudCBsaXN0IiwKKwkJCQkJIHl5dGV4dFswXSk7CisJCQkJc3RvcChidWYsIEVYX0RBVEFFUlIpOworCQkJfQorPE1BQ1JPQ0FMTEFSR1M+e1NQQUNFfSAgOworPE1BQ1JPQ0FMTEFSR1M+XCgJeworCQkJCXBhcnJlbl9jb3VudCsrOworCQkJCWlmIChwYXJyZW5fY291bnQgPT0gMSkKKwkJCQkJcmV0dXJuICgnKCcpOworCQkJCSpzdHJpbmdfYnVmX3B0cisrID0gJygnOworCQkJfQorPE1BQ1JPQ0FMTEFSR1M+XCkJeworCQkJCXBhcnJlbl9jb3VudC0tOworCQkJCWlmIChwYXJyZW5fY291bnQgPT0gMCkgeworCQkJCQlCRUdJTiBJTklUSUFMOworCQkJCQlyZXR1cm4gKCcpJyk7CisJCQkJfQorCQkJCSpzdHJpbmdfYnVmX3B0cisrID0gJyknOworCQkJfQorPE1BQ1JPQ0FMTEFSR1M+e01DQVJHfQl7CisJCQkJY2hhciAqeXB0cjsKKworCQkJCXlwdHIgPSB5eXRleHQ7CisJCQkJd2hpbGUgKCp5cHRyKQorCQkJCQkqc3RyaW5nX2J1Zl9wdHIrKyA9ICp5cHRyKys7CisJCQl9Cis8TUFDUk9DQUxMQVJHUz5cLAl7CisJCQkJaWYgKHN0cmluZ19idWZfcHRyICE9IHN0cmluZ19idWYpIHsKKwkJCQkJLyoKKwkJCQkJICogUmV0dXJuIGFuIGFyZ3VtZW50IGFuZAorCQkJCQkgKiByZXNjYW4gdGhpcyBjb21tYSBzbyB3ZQorCQkJCQkgKiBjYW4gcmV0dXJuIGl0IGFzIHdlbGwuCisJCQkJCSAqLworCQkJCQkqc3RyaW5nX2J1Zl9wdHIgPSAnXDAnOworCQkJCQl5eWx2YWwuc3RyID0gc3RyaW5nX2J1ZjsKKwkJCQkJc3RyaW5nX2J1Zl9wdHIgPSBzdHJpbmdfYnVmOworCQkJCQl1bnB1dCgnLCcpOworCQkJCQlyZXR1cm4gVF9BUkc7CisJCQkJfQorCQkJCXJldHVybiAnLCc7CisJCQl9Cis8TUFDUk9CT0RZPlxcXG4JCXsKKwkJCQkvKiBFYXQgZXNjYXBlZCBuZXdsaW5lcy4gKi8KKwkJCQkrK3l5bGluZW5vOworCQkJfQorPE1BQ1JPQk9EWT5ccgkJOworPE1BQ1JPQk9EWT5cbgkJeworCQkJCS8qIE1hY3JvcyBlbmQgb24gdGhlIGZpcnN0IHVuZXNjYXBlZCBuZXdsaW5lLiAqLworCQkJCUJFR0lOIElOSVRJQUw7CisJCQkJKnN0cmluZ19idWZfcHRyID0gJ1wwJzsKKwkJCQl5eWx2YWwuc3RyID0gc3RyaW5nX2J1ZjsKKwkJCQkrK3l5bGluZW5vOworCQkJCXJldHVybiBUX01BQ1JPQk9EWTsKKwkJCX0KKzxNQUNST0JPRFk+e01CT0RZfQl7CisJCQkJY2hhciAqeXB0cjsKKwkJCQljaGFyIGM7CisKKwkJCQl5cHRyID0geXl0ZXh0OworCQkJCXdoaWxlIChjID0gKnlwdHIrKykgeworCQkJCQkvKgorCQkJCQkgKiBTdHJpcCBjYXJyaWFnZSByZXR1cm5zLgorCQkJCQkgKi8KKwkJCQkJaWYgKGMgPT0gJ1xyJykKKwkJCQkJCWNvbnRpbnVlOworCQkJCQkqc3RyaW5nX2J1Zl9wdHIrKyA9IGM7CisJCQkJfQorCQkJfQore1dPUkR9XCgJCXsKKwkJCQljaGFyICp5cHRyOworCQkJCWNoYXIgKnljb3B5OworCisJCQkJLyogTWF5IGJlIGEgc3ltYm9sIG9yIGEgbWFjcm8gaW52b2NhdGlvbi4gKi8KKwkJCQl5eWx2YWwuc3ltID0gc3ltdGFibGVfZ2V0KHl5dGV4dCk7CisJCQkJaWYgKHl5bHZhbC5zeW0tPnR5cGUgPT0gTUFDUk8pIHsKKwkJCQkJWVlfQlVGRkVSX1NUQVRFIG9sZF9zdGF0ZTsKKwkJCQkJWVlfQlVGRkVSX1NUQVRFIHRlbXBfc3RhdGU7CisKKwkJCQkJeWNvcHkgPSBzdHJkdXAoeXl0ZXh0KTsKKwkJCQkJeXB0ciA9IHljb3B5ICsgeXlsZW5nOworCQkJCQl3aGlsZSAoeXB0ciA+IHljb3B5KQorCQkJCQkJdW5wdXQoKi0teXB0cik7CisJCQkJCW9sZF9zdGF0ZSA9IFlZX0NVUlJFTlRfQlVGRkVSOworCQkJCQl0ZW1wX3N0YXRlID0KKwkJCQkJICAgIHl5X2NyZWF0ZV9idWZmZXIoc3RkaW4sCisJCQkJCQkJICAgICBZWV9CVUZfU0laRSk7CisJCQkJCXl5X3N3aXRjaF90b19idWZmZXIodGVtcF9zdGF0ZSk7CisJCQkJCW1tX3N3aXRjaF90b19idWZmZXIob2xkX3N0YXRlKTsKKwkJCQkJbW1wYXJzZSgpOworCQkJCQltbV9zd2l0Y2hfdG9fYnVmZmVyKHRlbXBfc3RhdGUpOworCQkJCQl5eV9zd2l0Y2hfdG9fYnVmZmVyKG9sZF9zdGF0ZSk7CisJCQkJCW1tX2RlbGV0ZV9idWZmZXIodGVtcF9zdGF0ZSk7CisJCQkJCWV4cGFuZF9tYWNybyh5eWx2YWwuc3ltKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoeXlsdmFsLnN5bS0+dHlwZSA9PSBVTklOSVRJQUxJWkVEKSB7CisJCQkJCQkvKiBUcnkgd2l0aG91dCB0aGUgJygnICovCisJCQkJCQlzeW1ib2xfZGVsZXRlKHl5bHZhbC5zeW0pOworCQkJCQkJeXl0ZXh0W3l5bGVuZy0xXSA9ICdcMCc7CisJCQkJCQl5eWx2YWwuc3ltID0KKwkJCQkJCSAgICBzeW10YWJsZV9nZXQoeXl0ZXh0KTsKKwkJCQkJfQorCQkJCQl1bnB1dCgnKCcpOworCQkJCQlyZXR1cm4gVF9TWU1CT0w7CisJCQkJfQorCQkJfQore1dPUkR9CQkJeworCQkJCXl5bHZhbC5zeW0gPSBzeW10YWJsZV9nZXQoeXl0ZXh0KTsKKwkJCQlpZiAoeXlsdmFsLnN5bS0+dHlwZSA9PSBNQUNSTykgeworCQkJCQlleHBhbmRfbWFjcm8oeXlsdmFsLnN5bSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIFRfU1lNQk9MOworCQkJCX0KKwkJCX0KKy4JCQl7IAorCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJJbnZhbGlkIGNoYXJhY3RlciAiCisJCQkJCSAiJyVjJyIsIHl5dGV4dFswXSk7CisJCQkJc3RvcChidWYsIEVYX0RBVEFFUlIpOworCQkJfQorJSUKKwordHlwZWRlZiBzdHJ1Y3QgaW5jbHVkZSB7CisgICAgICAgIFlZX0JVRkZFUl9TVEFURSAgYnVmZmVyOworICAgICAgICBpbnQgICAgICAgICAgICAgIGxpbmVubzsKKyAgICAgICAgY2hhciAgICAgICAgICAgICpmaWxlbmFtZTsKKwlTTElTVF9FTlRSWShpbmNsdWRlKSBsaW5rczsKK31pbmNsdWRlX3Q7CisKK1NMSVNUX0hFQUQoLCBpbmNsdWRlKSBpbmNsdWRlX3N0YWNrOworCit2b2lkCitpbmNsdWRlX2ZpbGUoY2hhciAqZmlsZV9uYW1lLCBpbmNsdWRlX3R5cGUgdHlwZSkKK3sKKwlGSUxFICpuZXdmaWxlOworCWluY2x1ZGVfdCAqaW5jbHVkZTsKKworCW5ld2ZpbGUgPSBOVUxMOworCS8qIFRyeSB0aGUgY3VycmVudCBkaXJlY3RvcnkgZmlyc3QgKi8KKwlpZiAoaW5jbHVkZXNfc2VhcmNoX2N1cmRpciAhPSAwIHx8IHR5cGUgPT0gU09VUkNFX0ZJTEUpCisJCW5ld2ZpbGUgPSBmb3BlbihmaWxlX25hbWUsICJyIik7CisKKwlpZiAobmV3ZmlsZSA9PSBOVUxMICYmIHR5cGUgIT0gU09VUkNFX0ZJTEUpIHsKKyAgICAgICAgICAgICAgICBwYXRoX2VudHJ5X3QgaW5jbHVkZV9kaXI7CisgICAgICAgICAgICAgICAgZm9yIChpbmNsdWRlX2RpciA9IHNlYXJjaF9wYXRoLnNsaF9maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlyICE9IE5VTEw7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9kaXIgPSBpbmNsdWRlX2Rpci0+bGlua3Muc2xlX25leHQpIHsKKwkJCWNoYXIgZnVsbG5hbWVbUEFUSF9NQVhdOworCisJCQlpZiAoKGluY2x1ZGVfZGlyLT5xdW90ZWRfaW5jbHVkZXNfb25seSA9PSBUUlVFKQorCQkJICYmICh0eXBlICE9IFFVT1RFRF9JTkNMVURFKSkKKwkJCQljb250aW51ZTsKKworCQkJc25wcmludGYoZnVsbG5hbWUsIHNpemVvZihmdWxsbmFtZSksCisJCQkJICIlcy8lcyIsIGluY2x1ZGVfZGlyLT5kaXJlY3RvcnksIGZpbGVfbmFtZSk7CisKKwkJCWlmICgobmV3ZmlsZSA9IGZvcGVuKGZ1bGxuYW1lLCAiciIpKSAhPSBOVUxMKQorCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisJaWYgKG5ld2ZpbGUgPT0gTlVMTCkgeworCQlwZXJyb3IoZmlsZV9uYW1lKTsKKwkJc3RvcCgiVW5hYmxlIHRvIG9wZW4gaW5wdXQgZmlsZSIsIEVYX1NPRlRXQVJFKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKworCWlmICh0eXBlICE9IFNPVVJDRV9GSUxFKSB7CisJCWluY2x1ZGUgPSAoaW5jbHVkZV90ICopbWFsbG9jKHNpemVvZihpbmNsdWRlX3QpKTsKKwkJaWYgKGluY2x1ZGUgPT0gTlVMTCkgeworCQkJc3RvcCgiVW5hYmxlIHRvIGFsbG9jYXRlIGluY2x1ZGUgc3RhY2sgZW50cnkiLAorCQkJICAgICBFWF9TT0ZUV0FSRSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJaW5jbHVkZS0+YnVmZmVyID0gWVlfQ1VSUkVOVF9CVUZGRVI7CisJCWluY2x1ZGUtPmxpbmVubyA9IHl5bGluZW5vOworCQlpbmNsdWRlLT5maWxlbmFtZSA9IHl5ZmlsZW5hbWU7CisJCVNMSVNUX0lOU0VSVF9IRUFEKCZpbmNsdWRlX3N0YWNrLCBpbmNsdWRlLCBsaW5rcyk7CisJfQorCXl5X3N3aXRjaF90b19idWZmZXIoeXlfY3JlYXRlX2J1ZmZlcihuZXdmaWxlLCBZWV9CVUZfU0laRSkpOworCXl5bGluZW5vID0gMTsKKwl5eWZpbGVuYW1lID0gc3RyZHVwKGZpbGVfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIG5leHRfc3Vic3RpdHV0aW9uKHN0cnVjdCBzeW1ib2wgKm1hY19zeW1ib2wsIGNvbnN0IGNoYXIgKmJvZHlfcG9zLAorCQkJICAgICAgY29uc3QgY2hhciAqKm5leHRfbWF0Y2gsCisJCQkgICAgICBzdHJ1Y3QgbWFjcm9fYXJnICoqbWF0Y2hfbWFyZywgcmVnbWF0Y2hfdCAqbWF0Y2gpOworCit2b2lkCitleHBhbmRfbWFjcm8oc3RydWN0IHN5bWJvbCAqbWFjcm9fc3ltYm9sKQoreworCXN0cnVjdCBtYWNyb19hcmcgKm1hcmc7CisJc3RydWN0IG1hY3JvX2FyZyAqbWF0Y2hfbWFyZzsKKwljb25zdCBjaGFyICpib2R5X2hlYWQ7CisJY29uc3QgY2hhciAqYm9keV9wb3M7CisJY29uc3QgY2hhciAqbmV4dF9tYXRjaDsKKworCS8qCisJICogRHVlIHRvIHRoZSBuYXR1cmUgb2YgdW5wdXQsIHdlIG11c3Qgd29yaworCSAqIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSBtYWNybyBib2R5IHBlcmZvcm1pbmcKKwkgKiBhbnkgZXhwYW5zaW9ucy4KKwkgKi8KKwlib2R5X2hlYWQgPSBtYWNyb19zeW1ib2wtPmluZm8ubWFjcm9pbmZvLT5ib2R5OworCWJvZHlfcG9zID0gYm9keV9oZWFkICsgc3RybGVuKGJvZHlfaGVhZCk7CisJd2hpbGUgKGJvZHlfcG9zID4gYm9keV9oZWFkKSB7CisJCXJlZ21hdGNoX3QgbWF0Y2g7CisKKwkJbmV4dF9tYXRjaCA9IGJvZHlfaGVhZDsKKwkJbWF0Y2hfbWFyZyA9IE5VTEw7CisJCW5leHRfc3Vic3RpdHV0aW9uKG1hY3JvX3N5bWJvbCwgYm9keV9wb3MsICZuZXh0X21hdGNoLAorCQkJCSAgJm1hdGNoX21hcmcsICZtYXRjaCk7CisKKwkJLyogUHV0IGJhY2sgZXZlcnl0aGluZyB1cCB1bnRpbCB0aGUgcmVwbGFjZW1lbnQuICovCisJCXdoaWxlIChib2R5X3BvcyA+IG5leHRfbWF0Y2gpCisJCQl1bnB1dCgqLS1ib2R5X3Bvcyk7CisKKwkJLyogUGVyZm9ybSB0aGUgcmVwbGFjZW1lbnQuICovCisJCWlmIChtYXRjaF9tYXJnICE9IE5VTEwpIHsKKwkJCWNvbnN0IGNoYXIgKnN0cnA7CisKKwkJCW5leHRfbWF0Y2ggPSBtYXRjaF9tYXJnLT5yZXBsYWNlbWVudF90ZXh0OworCQkJc3RycCA9IG5leHRfbWF0Y2ggKyBzdHJsZW4obmV4dF9tYXRjaCk7CisJCQl3aGlsZSAoc3RycCA+IG5leHRfbWF0Y2gpCisJCQkJdW5wdXQoKi0tc3RycCk7CisKKwkJCS8qIFNraXAgcGFzdCB0aGUgdW5leHBhbmRlZCBtYWNybyBhcmcuICovCisJCQlib2R5X3BvcyAtPSBtYXRjaC5ybV9lbyAtIG1hdGNoLnJtX3NvOworCQl9CisJfQorCisJLyogQ2xlYW51cCByZXBsYWNlbWVudCB0ZXh0LiAqLworCVNUQUlMUV9GT1JFQUNIKG1hcmcsICZtYWNyb19zeW1ib2wtPmluZm8ubWFjcm9pbmZvLT5hcmdzLCBsaW5rcykgeworCQlmcmVlKG1hcmctPnJlcGxhY2VtZW50X3RleHQpOworCX0KK30KKworLyoKKyAqIEZpbmQgdGhlIG5leHQgc3Vic3RpdHV0aW9uIGluIHRoZSBtYWNybyB3b3JraW5nIGJhY2t3YXJkcyBmcm9tCisgKiBib2R5X3BvcyB1bnRpbCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtYWNybyBidWZmZXIuICBuZXh0X21hdGNoCisgKiBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbWFjcm8gYnVmZmVyIHByaW9yCisgKiB0byBjYWxsaW5nIHRoaXMgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQKK25leHRfc3Vic3RpdHV0aW9uKHN0cnVjdCBzeW1ib2wgKm1hY19zeW1ib2wsIGNvbnN0IGNoYXIgKmJvZHlfcG9zLAorCQkgIGNvbnN0IGNoYXIgKipuZXh0X21hdGNoLCBzdHJ1Y3QgbWFjcm9fYXJnICoqbWF0Y2hfbWFyZywKKwkJICByZWdtYXRjaF90ICptYXRjaCkKK3sKKwlyZWdtYXRjaF90CSAgbWF0Y2hlc1syXTsKKwlzdHJ1Y3QgbWFjcm9fYXJnICptYXJnOworCWNvbnN0IGNoYXIJICpzZWFyY2hfcG9zOworCWludAkJICByZXR2YWw7CisKKwlkbyB7CisJCXNlYXJjaF9wb3MgPSAqbmV4dF9tYXRjaDsKKworCQlTVEFJTFFfRk9SRUFDSChtYXJnLCAmbWFjX3N5bWJvbC0+aW5mby5tYWNyb2luZm8tPmFyZ3MsIGxpbmtzKSB7CisKKwkJCXJldHZhbCA9IHJlZ2V4ZWMoJm1hcmctPmFyZ19yZWdleCwgc2VhcmNoX3BvcywgMiwKKwkJCQkJIG1hdGNoZXMsIDApOworCQkJaWYgKHJldHZhbCA9PSAwCisJCQkgJiYgKG1hdGNoZXNbMV0ucm1fZW8gKyBzZWFyY2hfcG9zKSA8PSBib2R5X3BvcworCQkJICYmIChtYXRjaGVzWzFdLnJtX2VvICsgc2VhcmNoX3BvcykgPiAqbmV4dF9tYXRjaCkgeworCQkJCSptYXRjaCA9IG1hdGNoZXNbMV07CisJCQkJKm5leHRfbWF0Y2ggPSBtYXRjaC0+cm1fZW8gKyBzZWFyY2hfcG9zOworCQkJCSptYXRjaF9tYXJnID0gbWFyZzsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKHNlYXJjaF9wb3MgIT0gKm5leHRfbWF0Y2gpOworfQorCitpbnQKK3l5d3JhcCgpCit7CisJaW5jbHVkZV90ICppbmNsdWRlOworCisJeXlfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUik7CisJKHZvaWQpZmNsb3NlKHl5aW4pOworCWlmICh5eWZpbGVuYW1lICE9IE5VTEwpCisJCWZyZWUoeXlmaWxlbmFtZSk7CisJeXlmaWxlbmFtZSA9IE5VTEw7CisJaW5jbHVkZSA9IGluY2x1ZGVfc3RhY2suc2xoX2ZpcnN0OworCWlmIChpbmNsdWRlICE9IE5VTEwpIHsKKwkJeXlfc3dpdGNoX3RvX2J1ZmZlcihpbmNsdWRlLT5idWZmZXIpOworCQl5eWxpbmVubyA9IGluY2x1ZGUtPmxpbmVubzsKKwkJeXlmaWxlbmFtZSA9IGluY2x1ZGUtPmZpbGVuYW1lOworCQlTTElTVF9SRU1PVkVfSEVBRCgmaW5jbHVkZV9zdGFjaywgbGlua3MpOworCQlmcmVlKGluY2x1ZGUpOworCQlyZXR1cm4gKDApOworCX0KKwlyZXR1cm4gKDEpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9zeW1ib2wuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fc3ltYm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmNDQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fc3ltYm9sLmMKQEAgLTAsMCArMSw2NzcgQEAKKy8qCisgKiBBaWM3eHh4IFNDU0kgaG9zdCBhZGFwdGVyIGZpcm13YXJlIGFzc3NlbWJsZXIgc3ltYm9sIHRhYmxlIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3IEp1c3RpbiBULiBHaWJicy4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpY2FzbS9haWNhc21fc3ltYm9sLmMjMjQgJAorICoKKyAqICRGcmVlQlNEJAorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgImFpY2RiLmgiCisjZWxzZQorI2luY2x1ZGUgPGRiLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8cmVnZXguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5c2V4aXRzLmg+CisKKyNpbmNsdWRlICJhaWNhc21fc3ltYm9sLmgiCisjaW5jbHVkZSAiYWljYXNtLmgiCisKK3N0YXRpYyBEQiAqc3ltdGFibGU7CisKK3N5bWJvbF90ICoKK3N5bWJvbF9jcmVhdGUoY2hhciAqbmFtZSkKK3sKKwlzeW1ib2xfdCAqbmV3X3N5bWJvbDsKKworCW5ld19zeW1ib2wgPSAoc3ltYm9sX3QgKiltYWxsb2Moc2l6ZW9mKHN5bWJvbF90KSk7CisJaWYgKG5ld19zeW1ib2wgPT0gTlVMTCkgeworCQlwZXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgbmV3IHN5bWJvbCIpOworCQlleGl0KEVYX1NPRlRXQVJFKTsKKwl9CisJbWVtc2V0KG5ld19zeW1ib2wsIDAsIHNpemVvZigqbmV3X3N5bWJvbCkpOworCW5ld19zeW1ib2wtPm5hbWUgPSBzdHJkdXAobmFtZSk7CisJaWYgKG5ld19zeW1ib2wtPm5hbWUgPT0gTlVMTCkKKwkJIHN0b3AoIlVuYWJsZSB0byBzdHJkdXAgc3ltYm9sIG5hbWUiLCBFWF9TT0ZUV0FSRSk7CisJbmV3X3N5bWJvbC0+dHlwZSA9IFVOSU5JVElBTElaRUQ7CisJcmV0dXJuIChuZXdfc3ltYm9sKTsKK30KKwordm9pZAorc3ltYm9sX2RlbGV0ZShzeW1ib2xfdCAqc3ltYm9sKQoreworCWlmIChzeW10YWJsZSAhPSBOVUxMKSB7CisJCURCVAkga2V5OworCisJCWtleS5kYXRhID0gc3ltYm9sLT5uYW1lOworCQlrZXkuc2l6ZSA9IHN0cmxlbihzeW1ib2wtPm5hbWUpOworCQlzeW10YWJsZS0+ZGVsKHN5bXRhYmxlLCAma2V5LCAvKmZsYWdzKi8wKTsKKwl9CisJc3dpdGNoKHN5bWJvbC0+dHlwZSkgeworCWNhc2UgU0NCTE9DOgorCWNhc2UgU1JBTUxPQzoKKwljYXNlIFJFR0lTVEVSOgorCQlpZiAoc3ltYm9sLT5pbmZvLnJpbmZvICE9IE5VTEwpCisJCQlmcmVlKHN5bWJvbC0+aW5mby5yaW5mbyk7CisJCWJyZWFrOworCWNhc2UgQUxJQVM6CisJCWlmIChzeW1ib2wtPmluZm8uYWluZm8gIT0gTlVMTCkKKwkJCWZyZWUoc3ltYm9sLT5pbmZvLmFpbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBNQVNLOgorCWNhc2UgRklFTEQ6CisJY2FzZSBFTlVNOgorCWNhc2UgRU5VTV9FTlRSWToKKwkJaWYgKHN5bWJvbC0+aW5mby5maW5mbyAhPSBOVUxMKSB7CisJCQlzeW1saXN0X2ZyZWUoJnN5bWJvbC0+aW5mby5maW5mby0+c3ltcmVmcyk7CisJCQlmcmVlKHN5bWJvbC0+aW5mby5maW5mbyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBET1dOTE9BRF9DT05TVDoKKwljYXNlIENPTlNUOgorCQlpZiAoc3ltYm9sLT5pbmZvLmNpbmZvICE9IE5VTEwpCisJCQlmcmVlKHN5bWJvbC0+aW5mby5jaW5mbyk7CisJCWJyZWFrOworCWNhc2UgTEFCRUw6CisJCWlmIChzeW1ib2wtPmluZm8ubGluZm8gIT0gTlVMTCkKKwkJCWZyZWUoc3ltYm9sLT5pbmZvLmxpbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBVTklOSVRJQUxJWkVEOgorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlmcmVlKHN5bWJvbC0+bmFtZSk7CisJZnJlZShzeW1ib2wpOworfQorCit2b2lkCitzeW10YWJsZV9vcGVuKCkKK3sKKwlzeW10YWJsZSA9IGRib3BlbigvKmZpbGVuYW1lKi9OVUxMLAorCQkJICBPX0NSRUFUIHwgT19OT05CTE9DSyB8IE9fUkRXUiwgLyptb2RlKi8wLCBEQl9IQVNILAorCQkJICAvKm9wZW5pbmZvKi9OVUxMKTsKKworCWlmIChzeW10YWJsZSA9PSBOVUxMKSB7CisJCXBlcnJvcigiU3ltYm9sIHRhYmxlIGNyZWF0aW9uIGZhaWxlZCIpOworCQlleGl0KEVYX1NPRlRXQVJFKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KK30KKwordm9pZAorc3ltdGFibGVfY2xvc2UoKQoreworCWlmIChzeW10YWJsZSAhPSBOVUxMKSB7CisJCURCVAkga2V5OworCQlEQlQJIGRhdGE7CisKKwkJd2hpbGUgKHN5bXRhYmxlLT5zZXEoc3ltdGFibGUsICZrZXksICZkYXRhLCBSX0ZJUlNUKSA9PSAwKSB7CisJCQlzeW1ib2xfdCAqc3RvcmVkX3B0cjsKKworCQkJbWVtY3B5KCZzdG9yZWRfcHRyLCBkYXRhLmRhdGEsIHNpemVvZihzdG9yZWRfcHRyKSk7CisJCQlzeW1ib2xfZGVsZXRlKHN0b3JlZF9wdHIpOworCQl9CisJCXN5bXRhYmxlLT5jbG9zZShzeW10YWJsZSk7CisJfQorfQorCisvKgorICogVGhlIHNlbWFudGljcyBvZiBnZXQgaXMgdG8gcmV0dXJuIGFuIHVuaW5pdGlhbGl6ZWQgc3ltYm9sIGVudHJ5CisgKiBpZiBhIGxvb2t1cCBmYWlscy4KKyAqLworc3ltYm9sX3QgKgorc3ltdGFibGVfZ2V0KGNoYXIgKm5hbWUpCit7CisJc3ltYm9sX3QgKnN0b3JlZF9wdHI7CisJREJUCSAga2V5OworCURCVAkgIGRhdGE7CisJaW50CSAgcmV0dmFsOworCisJa2V5LmRhdGEgPSAodm9pZCAqKW5hbWU7CisJa2V5LnNpemUgPSBzdHJsZW4obmFtZSk7CisKKwlpZiAoKHJldHZhbCA9IHN5bXRhYmxlLT5nZXQoc3ltdGFibGUsICZrZXksICZkYXRhLCAvKmZsYWdzKi8wKSkgIT0gMCkgeworCQlpZiAocmV0dmFsID09IC0xKSB7CisJCQlwZXJyb3IoIlN5bWJvbCB0YWJsZSBnZXQgb3BlcmF0aW9uIGZhaWxlZCIpOworCQkJZXhpdChFWF9TT0ZUV0FSRSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0gZWxzZSBpZiAocmV0dmFsID09IDEpIHsKKwkJCS8qIFN5bWJvbCB3YXNuJ3QgZm91bmQsIHNvIGNyZWF0ZSBhIG5ldyBvbmUgKi8KKwkJCXN5bWJvbF90ICpuZXdfc3ltYm9sOworCisJCQluZXdfc3ltYm9sID0gc3ltYm9sX2NyZWF0ZShuYW1lKTsKKwkJCWRhdGEuZGF0YSA9ICZuZXdfc3ltYm9sOworCQkJZGF0YS5zaXplID0gc2l6ZW9mKG5ld19zeW1ib2wpOworCQkJaWYgKHN5bXRhYmxlLT5wdXQoc3ltdGFibGUsICZrZXksICZkYXRhLAorCQkJCQkgIC8qZmxhZ3MqLzApICE9MCkgeworCQkJCXBlcnJvcigiU3ltdGFibGUgcHV0IGZhaWxlZCIpOworCQkJCWV4aXQoRVhfU09GVFdBUkUpOworCQkJfQorCQkJcmV0dXJuIChuZXdfc3ltYm9sKTsKKwkJfSBlbHNlIHsKKwkJCXBlcnJvcigiVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgZnJvbSBkYiBnZXQgcm91dGluZSIpOworCQkJZXhpdChFWF9TT0ZUV0FSRSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwl9CisJbWVtY3B5KCZzdG9yZWRfcHRyLCBkYXRhLmRhdGEsIHNpemVvZihzdG9yZWRfcHRyKSk7CisJcmV0dXJuIChzdG9yZWRfcHRyKTsKK30KKworc3ltYm9sX25vZGVfdCAqCitzeW1saXN0X3NlYXJjaChzeW1saXN0X3QgKnN5bWxpc3QsIGNoYXIgKnN5bW5hbWUpCit7CisJc3ltYm9sX25vZGVfdCAqY3Vybm9kZTsKKworCWN1cm5vZGUgPSBTTElTVF9GSVJTVChzeW1saXN0KTsKKwl3aGlsZShjdXJub2RlICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChzeW1uYW1lLCBjdXJub2RlLT5zeW1ib2wtPm5hbWUpID09IDApCisJCQlicmVhazsKKwkJY3Vybm9kZSA9IFNMSVNUX05FWFQoY3Vybm9kZSwgbGlua3MpOworCX0KKwlyZXR1cm4gKGN1cm5vZGUpOworfQorCit2b2lkCitzeW1saXN0X2FkZChzeW1saXN0X3QgKnN5bWxpc3QsIHN5bWJvbF90ICpzeW1ib2wsIGludCBob3cpCit7CisJc3ltYm9sX25vZGVfdCAqbmV3bm9kZTsKKworCW5ld25vZGUgPSAoc3ltYm9sX25vZGVfdCAqKW1hbGxvYyhzaXplb2Yoc3ltYm9sX25vZGVfdCkpOworCWlmIChuZXdub2RlID09IE5VTEwpIHsKKwkJc3RvcCgic3ltbGlzdF9hZGQ6IFVuYWJsZSB0byBtYWxsb2Mgc3ltYm9sX25vZGUiLCBFWF9TT0ZUV0FSRSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisJbmV3bm9kZS0+c3ltYm9sID0gc3ltYm9sOworCWlmIChob3cgPT0gU1lNTElTVF9TT1JUKSB7CisJCXN5bWJvbF9ub2RlX3QgKmN1cm5vZGU7CisJCWludCBmaWVsZDsKKworCQlmaWVsZCA9IEZBTFNFOworCQlzd2l0Y2goc3ltYm9sLT50eXBlKSB7CisJCWNhc2UgUkVHSVNURVI6CisJCWNhc2UgU0NCTE9DOgorCQljYXNlIFNSQU1MT0M6CisJCQlicmVhazsKKwkJY2FzZSBGSUVMRDoKKwkJY2FzZSBNQVNLOgorCQljYXNlIEVOVU06CisJCWNhc2UgRU5VTV9FTlRSWToKKwkJCWZpZWxkID0gVFJVRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3RvcCgic3ltbGlzdF9hZGQ6IEludmFsaWQgc3ltYm9sIHR5cGUgZm9yIHNvcnRpbmciLAorCQkJICAgICBFWF9TT0ZUV0FSRSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKworCQljdXJub2RlID0gU0xJU1RfRklSU1Qoc3ltbGlzdCk7CisJCWlmIChjdXJub2RlID09IE5VTEwKKwkJIHx8IChmaWVsZAorCQkgICYmIChjdXJub2RlLT5zeW1ib2wtPnR5cGUgPiBuZXdub2RlLT5zeW1ib2wtPnR5cGUKKwkJICAgfHwgKGN1cm5vZGUtPnN5bWJvbC0+dHlwZSA9PSBuZXdub2RlLT5zeW1ib2wtPnR5cGUKKwkJICAgICYmIChjdXJub2RlLT5zeW1ib2wtPmluZm8uZmluZm8tPnZhbHVlID4KKwkJCW5ld25vZGUtPnN5bWJvbC0+aW5mby5maW5mby0+dmFsdWUpKSkpCisJCSB8fCAoIWZpZWxkICYmIChjdXJub2RlLT5zeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3MgPgorCQkgICAgICAgICAgICAgICBuZXdub2RlLT5zeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3MpKSkgeworCQkJU0xJU1RfSU5TRVJUX0hFQUQoc3ltbGlzdCwgbmV3bm9kZSwgbGlua3MpOworCQkJcmV0dXJuOworCQl9CisKKwkJd2hpbGUgKDEpIHsKKwkJCWlmIChTTElTVF9ORVhUKGN1cm5vZGUsIGxpbmtzKSA9PSBOVUxMKSB7CisJCQkJU0xJU1RfSU5TRVJUX0FGVEVSKGN1cm5vZGUsIG5ld25vZGUsCisJCQkJCQkgICBsaW5rcyk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXN5bWJvbF90ICpjdXJzeW1ib2w7CisKKwkJCQljdXJzeW1ib2wgPSBTTElTVF9ORVhUKGN1cm5vZGUsIGxpbmtzKS0+c3ltYm9sOworCQkJCWlmICgoZmllbGQKKwkJICAJCSAgJiYgKGN1cnN5bWJvbC0+dHlwZSA+IHN5bWJvbC0+dHlwZQorCQkJCSAgIHx8IChjdXJzeW1ib2wtPnR5cGUgPT0gc3ltYm9sLT50eXBlCisJCQkJICAgICYmIChjdXJzeW1ib2wtPmluZm8uZmluZm8tPnZhbHVlID4KKwkJCQkJc3ltYm9sLT5pbmZvLmZpbmZvLT52YWx1ZSkpKSkKKwkJCQkgfHwgKCFmaWVsZAorCQkJCSAgICYmIChjdXJzeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3MgPgorCQkJCSAgICAgICBzeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3MpKSkgeworCQkJCQlTTElTVF9JTlNFUlRfQUZURVIoY3Vybm9kZSwgbmV3bm9kZSwKKwkJCQkJCQkgICBsaW5rcyk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWN1cm5vZGUgPSBTTElTVF9ORVhUKGN1cm5vZGUsIGxpbmtzKTsKKwkJfQorCX0gZWxzZSB7CisJCVNMSVNUX0lOU0VSVF9IRUFEKHN5bWxpc3QsIG5ld25vZGUsIGxpbmtzKTsKKwl9Cit9CisKK3ZvaWQKK3N5bWxpc3RfZnJlZShzeW1saXN0X3QgKnN5bWxpc3QpCit7CisJc3ltYm9sX25vZGVfdCAqbm9kZTEsICpub2RlMjsKKworCW5vZGUxID0gU0xJU1RfRklSU1Qoc3ltbGlzdCk7CisJd2hpbGUgKG5vZGUxICE9IE5VTEwpIHsKKwkJbm9kZTIgPSBTTElTVF9ORVhUKG5vZGUxLCBsaW5rcyk7CisJCWZyZWUobm9kZTEpOworCQlub2RlMSA9IG5vZGUyOworCX0KKwlTTElTVF9JTklUKHN5bWxpc3QpOworfQorCit2b2lkCitzeW1saXN0X21lcmdlKHN5bWxpc3RfdCAqc3ltbGlzdF9kZXN0LCBzeW1saXN0X3QgKnN5bWxpc3Rfc3JjMSwKKwkgICAgICBzeW1saXN0X3QgKnN5bWxpc3Rfc3JjMikKK3sKKwlzeW1ib2xfbm9kZV90ICpub2RlOworCisJKnN5bWxpc3RfZGVzdCA9ICpzeW1saXN0X3NyYzE7CisJd2hpbGUoKG5vZGUgPSBTTElTVF9GSVJTVChzeW1saXN0X3NyYzIpKSAhPSBOVUxMKSB7CisJCVNMSVNUX1JFTU9WRV9IRUFEKHN5bWxpc3Rfc3JjMiwgbGlua3MpOworCQlTTElTVF9JTlNFUlRfSEVBRChzeW1saXN0X2Rlc3QsIG5vZGUsIGxpbmtzKTsKKwl9CisKKwkvKiBUaGVzZSBhcmUgbm93IGVtcHR5ICovCisJU0xJU1RfSU5JVChzeW1saXN0X3NyYzEpOworCVNMSVNUX0lOSVQoc3ltbGlzdF9zcmMyKTsKK30KKwordm9pZAorYWljX3ByaW50X2ZpbGVfcHJvbG9ndWUoRklMRSAqb2ZpbGUpCit7CisKKwlpZiAob2ZpbGUgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZnByaW50ZihvZmlsZSwKKyIvKlxuIgorIiAqIERPIE5PVCBFRElUIC0gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkXG4iCisiICoJCSBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlIGZpbGVzOlxuIgorIiAqXG4iCisiJXMgKi9cbiIsCisJCXZlcnNpb25zKTsKK30KKwordm9pZAorYWljX3ByaW50X2luY2x1ZGUoRklMRSAqZGZpbGUsIGNoYXIgKmluY2x1ZGVfZmlsZSkKK3sKKworCWlmIChkZmlsZSA9PSBOVUxMKQorCQlyZXR1cm47CisJZnByaW50ZihkZmlsZSwgIlxuI2luY2x1ZGUgXCIlc1wiXG5cbiIsIGluY2x1ZGVfZmlsZSk7Cit9CisKK3ZvaWQKK2FpY19wcmludF9yZWdfZHVtcF90eXBlcyhGSUxFICpvZmlsZSkKK3sKKwlpZiAob2ZpbGUgPT0gTlVMTCkKKwkJcmV0dXJuOworCQkKKwlmcHJpbnRmKG9maWxlLAorInR5cGVkZWYgaW50ICglc3JlZ19wcmludF90KSh1X2ludCwgdV9pbnQgKiwgdV9pbnQpO1xuIgorInR5cGVkZWYgc3RydWN0ICVzcmVnX3BhcnNlX2VudHJ5IHtcbiIKKyIJY2hhcgkqbmFtZTtcbiIKKyIJdWludDhfdAkgdmFsdWU7XG4iCisiCXVpbnQ4X3QJIG1hc2s7XG4iCisifSAlc3JlZ19wYXJzZV9lbnRyeV90O1xuIgorIlxuIiwKKwkJcHJlZml4LCBwcmVmaXgsIHByZWZpeCk7Cit9CisKK3N0YXRpYyB2b2lkCithaWNfcHJpbnRfcmVnX2R1bXBfc3RhcnQoRklMRSAqZGZpbGUsIHN5bWJvbF9ub2RlX3QgKnJlZ25vZGUpCit7CisJaWYgKGRmaWxlID09IE5VTEwpCisJCXJldHVybjsKKworCWZwcmludGYoZGZpbGUsCisic3RhdGljICVzcmVnX3BhcnNlX2VudHJ5X3QgJXNfcGFyc2VfdGFibGVbXSA9IHtcbiIsCisJCXByZWZpeCwKKwkJcmVnbm9kZS0+c3ltYm9sLT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2FpY19wcmludF9yZWdfZHVtcF9lbmQoRklMRSAqb2ZpbGUsIEZJTEUgKmRmaWxlLAorCQkgICAgICAgc3ltYm9sX25vZGVfdCAqcmVnbm9kZSwgdV9pbnQgbnVtX2VudHJpZXMpCit7CisJY2hhciAqbG93ZXJfbmFtZTsKKwljaGFyICpsZXR0ZXI7CisKKwlsb3dlcl9uYW1lID0gc3RyZHVwKHJlZ25vZGUtPnN5bWJvbC0+bmFtZSk7CisJaWYgKGxvd2VyX25hbWUgPT0gTlVMTCkKKwkJIHN0b3AoIlVuYWJsZSB0byBzdHJkdXAgc3ltYm9sIG5hbWUiLCBFWF9TT0ZUV0FSRSk7CisJCisJZm9yIChsZXR0ZXIgPSBsb3dlcl9uYW1lOyAqbGV0dGVyICE9ICdcMCc7IGxldHRlcisrKQorCQkqbGV0dGVyID0gdG9sb3dlcigqbGV0dGVyKTsKKworCWlmIChkZmlsZSAhPSBOVUxMKSB7CisJCWlmIChudW1fZW50cmllcyAhPSAwKQorCQkJZnByaW50ZihkZmlsZSwKKyJcbiIKKyJ9O1xuIgorIlxuIik7CisKKwkJZnByaW50ZihkZmlsZSwKKyJpbnRcbiIKKyIlcyVzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcClcbiIKKyJ7XG4iCisiCXJldHVybiAoJXNwcmludF9yZWdpc3RlciglcyVzLCAlZCwgXCIlc1wiLFxuIgorIgkgICAgMHglMDJ4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpO1xuIgorIn1cbiIKKyJcbiIsCisJCQlwcmVmaXgsCisJCQlsb3dlcl9uYW1lLAorCQkJcHJlZml4LAorCQkJbnVtX2VudHJpZXMgIT0gMCA/IHJlZ25vZGUtPnN5bWJvbC0+bmFtZSA6ICJOVUxMIiwKKwkJCW51bV9lbnRyaWVzICE9IDAgPyAiX3BhcnNlX3RhYmxlIiA6ICIiLAorCQkJbnVtX2VudHJpZXMsCisJCQlyZWdub2RlLT5zeW1ib2wtPm5hbWUsCisJCQlyZWdub2RlLT5zeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3MpOworCX0KKworCWZwcmludGYob2ZpbGUsCisiI2lmIEFJQ19ERUJVR19SRUdJU1RFUlNcbiIKKyIlc3JlZ19wcmludF90ICVzJXNfcHJpbnQ7XG4iCisiI2Vsc2VcbiIKKyIjZGVmaW5lICVzJXNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFxcXG4iCisiICAgICVzcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgXCIlc1wiLCAweCUwMngsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKVxuIgorIiNlbmRpZlxuIgorIlxuIiwKKwkJcHJlZml4LAorCQlwcmVmaXgsCisJCWxvd2VyX25hbWUsCisJCXByZWZpeCwKKwkJbG93ZXJfbmFtZSwKKwkJcHJlZml4LAorCQlyZWdub2RlLT5zeW1ib2wtPm5hbWUsCisJCXJlZ25vZGUtPnN5bWJvbC0+aW5mby5yaW5mby0+YWRkcmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkCithaWNfcHJpbnRfcmVnX2R1bXBfZW50cnkoRklMRSAqZGZpbGUsIHN5bWJvbF9ub2RlX3QgKmN1cm5vZGUpCit7CisJaW50IG51bV90YWJzOworCisJaWYgKGRmaWxlID09IE5VTEwpCisJCXJldHVybjsKKworCWZwcmludGYoZGZpbGUsCisiCXsgXCIlc1wiLCIsCisJCWN1cm5vZGUtPnN5bWJvbC0+bmFtZSk7CisKKwludW1fdGFicyA9IDMgLSAoc3RybGVuKGN1cm5vZGUtPnN5bWJvbC0+bmFtZSkgKyA1KSAvIDg7CisKKwl3aGlsZSAobnVtX3RhYnMtLSA+IDApCisJCWZwdXRjKCdcdCcsIGRmaWxlKTsKKwlmcHJpbnRmKGRmaWxlLCAiMHglMDJ4LCAweCUwMnggfSIsCisJCWN1cm5vZGUtPnN5bWJvbC0+aW5mby5maW5mby0+dmFsdWUsCisJCWN1cm5vZGUtPnN5bWJvbC0+aW5mby5maW5mby0+bWFzayk7Cit9CisKK3ZvaWQKK3N5bXRhYmxlX2R1bXAoRklMRSAqb2ZpbGUsIEZJTEUgKmRmaWxlKQoreworCS8qCisJICogU29ydCB0aGUgcmVnaXN0ZXJzIGJ5IGFkZHJlc3Mgd2l0aCBhIHNpbXBsZSBpbnNlcnRpb24gc29ydC4KKwkgKiBQdXQgYml0bWFza3MgbmV4dCB0byB0aGUgZmlyc3QgcmVnaXN0ZXIgdGhhdCBkZWZpbmVzIHRoZW0uCisJICogUHV0IGNvbnN0YW50cyBhdCB0aGUgZW5kLgorCSAqLworCXN5bWxpc3RfdAkgcmVnaXN0ZXJzOworCXN5bWxpc3RfdAkgbWFza3M7CisJc3ltbGlzdF90CSBjb25zdGFudHM7CisJc3ltbGlzdF90CSBkb3dubG9hZF9jb25zdGFudHM7CisJc3ltbGlzdF90CSBhbGlhc2VzOworCXN5bWxpc3RfdAkgZXhwb3J0ZWRfbGFiZWxzOworCXN5bWJvbF9ub2RlX3QJKmN1cm5vZGU7CisJc3ltYm9sX25vZGVfdAkqcmVnbm9kZTsKKwlEQlQJCSBrZXk7CisJREJUCQkgZGF0YTsKKwlpbnQJCSBmbGFnOworCXVfaW50CQkgaTsKKworCWlmIChzeW10YWJsZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlTTElTVF9JTklUKCZyZWdpc3RlcnMpOworCVNMSVNUX0lOSVQoJm1hc2tzKTsKKwlTTElTVF9JTklUKCZjb25zdGFudHMpOworCVNMSVNUX0lOSVQoJmRvd25sb2FkX2NvbnN0YW50cyk7CisJU0xJU1RfSU5JVCgmYWxpYXNlcyk7CisJU0xJU1RfSU5JVCgmZXhwb3J0ZWRfbGFiZWxzKTsKKwlmbGFnID0gUl9GSVJTVDsKKwl3aGlsZSAoc3ltdGFibGUtPnNlcShzeW10YWJsZSwgJmtleSwgJmRhdGEsIGZsYWcpID09IDApIHsKKwkJc3ltYm9sX3QgKmN1cnN5bTsKKworCQltZW1jcHkoJmN1cnN5bSwgZGF0YS5kYXRhLCBzaXplb2YoY3Vyc3ltKSk7CisJCXN3aXRjaChjdXJzeW0tPnR5cGUpIHsKKwkJY2FzZSBSRUdJU1RFUjoKKwkJY2FzZSBTQ0JMT0M6CisJCWNhc2UgU1JBTUxPQzoKKwkJCXN5bWxpc3RfYWRkKCZyZWdpc3RlcnMsIGN1cnN5bSwgU1lNTElTVF9TT1JUKTsKKwkJCWJyZWFrOworCQljYXNlIE1BU0s6CisJCWNhc2UgRklFTEQ6CisJCWNhc2UgRU5VTToKKwkJY2FzZSBFTlVNX0VOVFJZOgorCQkJc3ltbGlzdF9hZGQoJm1hc2tzLCBjdXJzeW0sIFNZTUxJU1RfU09SVCk7CisJCQlicmVhazsKKwkJY2FzZSBDT05TVDoKKwkJCXN5bWxpc3RfYWRkKCZjb25zdGFudHMsIGN1cnN5bSwKKwkJCQkgICAgU1lNTElTVF9JTlNFUlRfSEVBRCk7CisJCQlicmVhazsKKwkJY2FzZSBET1dOTE9BRF9DT05TVDoKKwkJCXN5bWxpc3RfYWRkKCZkb3dubG9hZF9jb25zdGFudHMsIGN1cnN5bSwKKwkJCQkgICAgU1lNTElTVF9JTlNFUlRfSEVBRCk7CisJCQlicmVhazsKKwkJY2FzZSBBTElBUzoKKwkJCXN5bWxpc3RfYWRkKCZhbGlhc2VzLCBjdXJzeW0sCisJCQkJICAgIFNZTUxJU1RfSU5TRVJUX0hFQUQpOworCQkJYnJlYWs7CisJCWNhc2UgTEFCRUw6CisJCQlpZiAoY3Vyc3ltLT5pbmZvLmxpbmZvLT5leHBvcnRlZCA9PSAwKQorCQkJCWJyZWFrOworCQkJc3ltbGlzdF9hZGQoJmV4cG9ydGVkX2xhYmVscywgY3Vyc3ltLAorCQkJCSAgICBTWU1MSVNUX0lOU0VSVF9IRUFEKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJZmxhZyA9IFJfTkVYVDsKKwl9CisKKwkvKiBSZWdpc3RlciBkaWFub3N0aWMgZnVuY3Rpb25zL2RlY2xhcmF0aW9ucyBmaXJzdC4gKi8KKwlhaWNfcHJpbnRfZmlsZV9wcm9sb2d1ZShvZmlsZSk7CisJYWljX3ByaW50X3JlZ19kdW1wX3R5cGVzKG9maWxlKTsKKwlhaWNfcHJpbnRfZmlsZV9wcm9sb2d1ZShkZmlsZSk7CisJYWljX3ByaW50X2luY2x1ZGUoZGZpbGUsIHN0b2NrX2luY2x1ZGVfZmlsZSk7CisJU0xJU1RfRk9SRUFDSChjdXJub2RlLCAmcmVnaXN0ZXJzLCBsaW5rcykgeworCisJCXN3aXRjaChjdXJub2RlLT5zeW1ib2wtPnR5cGUpIHsKKwkJY2FzZSBSRUdJU1RFUjoKKwkJY2FzZSBTQ0JMT0M6CisJCWNhc2UgU1JBTUxPQzoKKwkJeworCQkJc3ltbGlzdF90CSpmaWVsZHM7CisJCQlzeW1ib2xfbm9kZV90CSpmaWVsZG5vZGU7CisJCQlpbnQJCSBudW1fZW50cmllczsKKworCQkJbnVtX2VudHJpZXMgPSAwOworCQkJZmllbGRzID0gJmN1cm5vZGUtPnN5bWJvbC0+aW5mby5yaW5mby0+ZmllbGRzOworCQkJU0xJU1RfRk9SRUFDSChmaWVsZG5vZGUsIGZpZWxkcywgbGlua3MpIHsKKwkJCQlpZiAobnVtX2VudHJpZXMgPT0gMCkKKwkJCQkJYWljX3ByaW50X3JlZ19kdW1wX3N0YXJ0KGRmaWxlLAorCQkJCQkJCQkgY3Vybm9kZSk7CisJCQkJZWxzZSBpZiAoZGZpbGUgIT0gTlVMTCkKKwkJCQkJZnB1dHMoIixcbiIsIGRmaWxlKTsKKwkJCQludW1fZW50cmllcysrOworCQkJCWFpY19wcmludF9yZWdfZHVtcF9lbnRyeShkZmlsZSwgZmllbGRub2RlKTsKKwkJCX0KKwkJCWFpY19wcmludF9yZWdfZHVtcF9lbmQob2ZpbGUsIGRmaWxlLAorCQkJCQkgICAgICAgY3Vybm9kZSwgbnVtX2VudHJpZXMpOworCQl9CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIEZvbGQgaW4gdGhlIG1hc2tzIGFuZCBiaXRzICovCisJd2hpbGUgKFNMSVNUX0ZJUlNUKCZtYXNrcykgIT0gTlVMTCkgeworCQljaGFyICpyZWduYW1lOworCisJCWN1cm5vZGUgPSBTTElTVF9GSVJTVCgmbWFza3MpOworCQlTTElTVF9SRU1PVkVfSEVBRCgmbWFza3MsIGxpbmtzKTsKKworCQlyZWdub2RlID0gU0xJU1RfRklSU1QoJmN1cm5vZGUtPnN5bWJvbC0+aW5mby5maW5mby0+c3ltcmVmcyk7CisJCXJlZ25hbWUgPSByZWdub2RlLT5zeW1ib2wtPm5hbWU7CisJCXJlZ25vZGUgPSBzeW1saXN0X3NlYXJjaCgmcmVnaXN0ZXJzLCByZWduYW1lKTsKKwkJU0xJU1RfSU5TRVJUX0FGVEVSKHJlZ25vZGUsIGN1cm5vZGUsIGxpbmtzKTsKKwl9CisKKwkvKiBBZGQgdGhlIGFsaWFzZXMgKi8KKwl3aGlsZSAoU0xJU1RfRklSU1QoJmFsaWFzZXMpICE9IE5VTEwpIHsKKwkJY2hhciAqcmVnbmFtZTsKKworCQljdXJub2RlID0gU0xJU1RfRklSU1QoJmFsaWFzZXMpOworCQlTTElTVF9SRU1PVkVfSEVBRCgmYWxpYXNlcywgbGlua3MpOworCisJCXJlZ25hbWUgPSBjdXJub2RlLT5zeW1ib2wtPmluZm8uYWluZm8tPnBhcmVudC0+bmFtZTsKKwkJcmVnbm9kZSA9IHN5bWxpc3Rfc2VhcmNoKCZyZWdpc3RlcnMsIHJlZ25hbWUpOworCQlTTElTVF9JTlNFUlRfQUZURVIocmVnbm9kZSwgY3Vybm9kZSwgbGlua3MpOworCX0KKworCS8qIE91dHB1dCBnZW5lcmF0ZWQgI2RlZmluZXMuICovCisJd2hpbGUgKFNMSVNUX0ZJUlNUKCZyZWdpc3RlcnMpICE9IE5VTEwpIHsKKwkJc3ltYm9sX25vZGVfdCAqY3Vybm9kZTsKKwkJdV9pbnQgdmFsdWU7CisJCWNoYXIgKnRhYl9zdHI7CisJCWNoYXIgKnRhYl9zdHIyOworCisJCWN1cm5vZGUgPSBTTElTVF9GSVJTVCgmcmVnaXN0ZXJzKTsKKwkJU0xJU1RfUkVNT1ZFX0hFQUQoJnJlZ2lzdGVycywgbGlua3MpOworCQlzd2l0Y2goY3Vybm9kZS0+c3ltYm9sLT50eXBlKSB7CisJCWNhc2UgUkVHSVNURVI6CisJCWNhc2UgU0NCTE9DOgorCQljYXNlIFNSQU1MT0M6CisJCQlmcHJpbnRmKG9maWxlLCAiXG4iKTsKKwkJCXZhbHVlID0gY3Vybm9kZS0+c3ltYm9sLT5pbmZvLnJpbmZvLT5hZGRyZXNzOworCQkJdGFiX3N0ciA9ICJcdCI7CisJCQl0YWJfc3RyMiA9ICJcdFx0IjsKKwkJCWJyZWFrOworCQljYXNlIEFMSUFTOgorCQl7CisJCQlzeW1ib2xfdCAqcGFyZW50OworCisJCQlwYXJlbnQgPSBjdXJub2RlLT5zeW1ib2wtPmluZm8uYWluZm8tPnBhcmVudDsKKwkJCXZhbHVlID0gcGFyZW50LT5pbmZvLnJpbmZvLT5hZGRyZXNzOworCQkJdGFiX3N0ciA9ICJcdCI7CisJCQl0YWJfc3RyMiA9ICJcdFx0IjsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgTUFTSzoKKwkJY2FzZSBGSUVMRDoKKwkJY2FzZSBFTlVNOgorCQljYXNlIEVOVU1fRU5UUlk6CisJCQl2YWx1ZSA9IGN1cm5vZGUtPnN5bWJvbC0+aW5mby5maW5mby0+dmFsdWU7CisJCQl0YWJfc3RyID0gIlx0XHQiOworCQkJdGFiX3N0cjIgPSAiXHQiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl2YWx1ZSA9IDA7IC8qIFF1aWV0IGNvbXBpbGVyICovCisJCQl0YWJfc3RyID0gTlVMTDsKKwkJCXRhYl9zdHIyID0gTlVMTDsKKwkJCXN0b3AoInN5bXRhYmxlX2R1bXA6IEludmFsaWQgc3ltYm9sIHR5cGUgIgorCQkJICAgICAiZW5jb3VudGVyZWQiLCBFWF9TT0ZUV0FSRSk7CisJCQlicmVhazsKKwkJfQorCQlmcHJpbnRmKG9maWxlLCAiI2RlZmluZSVzJS0xNnMlczB4JTAyeFxuIiwKKwkJCXRhYl9zdHIsIGN1cm5vZGUtPnN5bWJvbC0+bmFtZSwgdGFiX3N0cjIsCisJCQl2YWx1ZSk7CisJCWZyZWUoY3Vybm9kZSk7CisJfQorCWZwcmludGYob2ZpbGUsICJcblxuIik7CisKKwl3aGlsZSAoU0xJU1RfRklSU1QoJmNvbnN0YW50cykgIT0gTlVMTCkgeworCQlzeW1ib2xfbm9kZV90ICpjdXJub2RlOworCisJCWN1cm5vZGUgPSBTTElTVF9GSVJTVCgmY29uc3RhbnRzKTsKKwkJU0xJU1RfUkVNT1ZFX0hFQUQoJmNvbnN0YW50cywgbGlua3MpOworCQlmcHJpbnRmKG9maWxlLCAiI2RlZmluZVx0JS04c1x0MHglMDJ4XG4iLAorCQkJY3Vybm9kZS0+c3ltYm9sLT5uYW1lLAorCQkJY3Vybm9kZS0+c3ltYm9sLT5pbmZvLmNpbmZvLT52YWx1ZSk7CisJCWZyZWUoY3Vybm9kZSk7CisJfQorCisJCisJZnByaW50ZihvZmlsZSwgIlxuXG4vKiBEb3dubG9hZGVkIENvbnN0YW50IERlZmluaXRpb25zICovXG4iKTsKKworCWZvciAoaSA9IDA7IFNMSVNUX0ZJUlNUKCZkb3dubG9hZF9jb25zdGFudHMpICE9IE5VTEw7IGkrKykgeworCQlzeW1ib2xfbm9kZV90ICpjdXJub2RlOworCisJCWN1cm5vZGUgPSBTTElTVF9GSVJTVCgmZG93bmxvYWRfY29uc3RhbnRzKTsKKwkJU0xJU1RfUkVNT1ZFX0hFQUQoJmRvd25sb2FkX2NvbnN0YW50cywgbGlua3MpOworCQlmcHJpbnRmKG9maWxlLCAiI2RlZmluZVx0JS04c1x0MHglMDJ4XG4iLAorCQkJY3Vybm9kZS0+c3ltYm9sLT5uYW1lLAorCQkJY3Vybm9kZS0+c3ltYm9sLT5pbmZvLmNpbmZvLT52YWx1ZSk7CisJCWZyZWUoY3Vybm9kZSk7CisJfQorCWZwcmludGYob2ZpbGUsICIjZGVmaW5lXHRET1dOTE9BRF9DT05TVF9DT1VOVFx0MHglMDJ4XG4iLCBpKTsKKworCWZwcmludGYob2ZpbGUsICJcblxuLyogRXhwb3J0ZWQgTGFiZWxzICovXG4iKTsKKworCXdoaWxlIChTTElTVF9GSVJTVCgmZXhwb3J0ZWRfbGFiZWxzKSAhPSBOVUxMKSB7CisJCXN5bWJvbF9ub2RlX3QgKmN1cm5vZGU7CisKKwkJY3Vybm9kZSA9IFNMSVNUX0ZJUlNUKCZleHBvcnRlZF9sYWJlbHMpOworCQlTTElTVF9SRU1PVkVfSEVBRCgmZXhwb3J0ZWRfbGFiZWxzLCBsaW5rcyk7CisJCWZwcmludGYob2ZpbGUsICIjZGVmaW5lXHRMQUJFTF8lLThzXHQweCUwMnhcbiIsCisJCQljdXJub2RlLT5zeW1ib2wtPm5hbWUsCisJCQljdXJub2RlLT5zeW1ib2wtPmluZm8ubGluZm8tPmFkZHJlc3MpOworCQlmcmVlKGN1cm5vZGUpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9zeW1ib2wuaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fc3ltYm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZjMjJlOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fc3ltYm9sLmgKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBBaWM3eHh4IFNDU0kgaG9zdCBhZGFwdGVyIGZpcm13YXJlIGFzc3NlbWJsZXIgc3ltYm9sIHRhYmxlIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3IEp1c3RpbiBULiBHaWJicy4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpY2FzbS9haWNhc21fc3ltYm9sLmgjMTcgJAorICoKKyAqICRGcmVlQlNEJAorICovCisKKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlICIuLi9xdWV1ZS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvcXVldWUuaD4KKyNlbmRpZgorCit0eXBlZGVmIGVudW0geworCVVOSU5JVElBTElaRUQsCisJUkVHSVNURVIsCisJQUxJQVMsCisJU0NCTE9DLAorCVNSQU1MT0MsCisJRU5VTV9FTlRSWSwKKwlGSUVMRCwKKwlNQVNLLAorCUVOVU0sCisJQ09OU1QsCisJRE9XTkxPQURfQ09OU1QsCisJTEFCRUwsCisJQ09ORElUSU9OQUwsCisJTUFDUk8KK30gc3ltdHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKwlSTyA9IDB4MDEsCisJV08gPSAweDAyLAorCVJXID0gMHgwMworfWFtb2RlX3Q7CisKK3R5cGVkZWYgU0xJU1RfSEVBRChzeW1saXN0LCBzeW1ib2xfbm9kZSkgc3ltbGlzdF90OworCitzdHJ1Y3QgcmVnX2luZm8geworCXVfaW50CSAgYWRkcmVzczsKKwlpbnQJICBzaXplOworCWFtb2RlX3QJICBtb2RlOworCXN5bWxpc3RfdCBmaWVsZHM7CisJdWludDhfdAkgIHZhbGlkX2JpdG1hc2s7CisJdWludDhfdAkgIG1vZGVzOworCWludAkgIHR5cGVjaGVja19tYXNrczsKK307CisKK3N0cnVjdCBmaWVsZF9pbmZvIHsKKwlzeW1saXN0X3Qgc3ltcmVmczsKKwl1aW50OF90CSAgdmFsdWU7CisJdWludDhfdAkgIG1hc2s7Cit9OworCitzdHJ1Y3QgY29uc3RfaW5mbyB7CisJdV9pbnQJdmFsdWU7CisJaW50CWRlZmluZTsKK307CisKK3N0cnVjdCBhbGlhc19pbmZvIHsKKwlzdHJ1Y3Qgc3ltYm9sICpwYXJlbnQ7Cit9OworCitzdHJ1Y3QgbGFiZWxfaW5mbyB7CisJaW50CWFkZHJlc3M7CisJaW50CWV4cG9ydGVkOworfTsKKworc3RydWN0IGNvbmRfaW5mbyB7CisJaW50CWZ1bmNfbnVtOworfTsKKworc3RydWN0IG1hY3JvX2FyZyB7CisJU1RBSUxRX0VOVFJZKG1hY3JvX2FyZykJbGlua3M7CisJcmVnZXhfdAlhcmdfcmVnZXg7CisJY2hhciAgICpyZXBsYWNlbWVudF90ZXh0OworfTsKK1NUQUlMUV9IRUFEKG1hY3JvX2FyZ19saXN0LCBtYWNyb19hcmcpIGFyZ3M7CisKK3N0cnVjdCBtYWNyb19pbmZvIHsKKwlzdHJ1Y3QgbWFjcm9fYXJnX2xpc3QgYXJnczsKKwlpbnQgICBuYXJnOworCWNvbnN0IGNoYXIqIGJvZHk7Cit9OworCit0eXBlZGVmIHN0cnVjdCBleHByZXNzaW9uX2luZm8geworICAgICAgICBzeW1saXN0X3QgICAgICAgcmVmZXJlbmNlZF9zeW1zOworICAgICAgICBpbnQgICAgICAgICAgICAgdmFsdWU7Cit9IGV4cHJlc3Npb25fdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc3ltYm9sIHsKKwljaGFyCSpuYW1lOworCXN5bXR5cGUJdHlwZTsKKwl1bmlvbgl7CisJCXN0cnVjdCByZWdfaW5mbwkgICpyaW5mbzsKKwkJc3RydWN0IGZpZWxkX2luZm8gKmZpbmZvOworCQlzdHJ1Y3QgY29uc3RfaW5mbyAqY2luZm87CisJCXN0cnVjdCBhbGlhc19pbmZvICphaW5mbzsKKwkJc3RydWN0IGxhYmVsX2luZm8gKmxpbmZvOworCQlzdHJ1Y3QgY29uZF9pbmZvICAqY29uZGluZm87CisJCXN0cnVjdCBtYWNyb19pbmZvICptYWNyb2luZm87CisJfWluZm87Cit9IHN5bWJvbF90OworCit0eXBlZGVmIHN0cnVjdCBzeW1ib2xfcmVmIHsKKwlzeW1ib2xfdCAqc3ltYm9sOworCWludAkgb2Zmc2V0OworfSBzeW1ib2xfcmVmX3Q7CisKK3R5cGVkZWYgc3RydWN0IHN5bWJvbF9ub2RlIHsKKwlTTElTVF9FTlRSWShzeW1ib2xfbm9kZSkgbGlua3M7CisJc3ltYm9sX3QgKnN5bWJvbDsKK30gc3ltYm9sX25vZGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgY3JpdGljYWxfc2VjdGlvbiB7CisJVEFJTFFfRU5UUlkoY3JpdGljYWxfc2VjdGlvbikgbGlua3M7CisJaW50IGJlZ2luX2FkZHI7CisJaW50IGVuZF9hZGRyOworfSBjcml0aWNhbF9zZWN0aW9uX3Q7CisKK3R5cGVkZWYgZW51bSB7CisJU0NPUEVfUk9PVCwKKwlTQ09QRV9JRiwKKwlTQ09QRV9FTFNFX0lGLAorCVNDT1BFX0VMU0UKK30gc2NvcGVfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgcGF0Y2hfaW5mbyB7CisJaW50IHNraXBfcGF0Y2g7CisJaW50IHNraXBfaW5zdHI7Cit9IHBhdGNoX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc2NvcGUgeworCVNMSVNUX0VOVFJZKHNjb3BlKSBzY29wZV9zdGFja19saW5rczsKKwlUQUlMUV9FTlRSWShzY29wZSkgc2NvcGVfbGlua3M7CisJVEFJTFFfSEVBRCgsIHNjb3BlKSBpbm5lcl9zY29wZTsKKwlzY29wZV90eXBlIHR5cGU7CisJaW50IGlubmVyX3Njb3BlX3BhdGNoZXM7CisJaW50IGJlZ2luX2FkZHI7CisgICAgICAgIGludCBlbmRfYWRkcjsKKwlwYXRjaF9pbmZvX3QgcGF0Y2hlc1syXTsKKwlpbnQgZnVuY19udW07Cit9IHNjb3BlX3Q7CisKK1RBSUxRX0hFQUQoY3NfdGFpbHEsIGNyaXRpY2FsX3NlY3Rpb24pOworU0xJU1RfSEVBRChzY29wZV9saXN0LCBzY29wZSk7CitUQUlMUV9IRUFEKHNjb3BlX3RhaWxxLCBzY29wZSk7CisKK3ZvaWQJc3ltYm9sX2RlbGV0ZShzeW1ib2xfdCAqc3ltYm9sKTsKKwordm9pZAlzeW10YWJsZV9vcGVuKHZvaWQpOworCit2b2lkCXN5bXRhYmxlX2Nsb3NlKHZvaWQpOworCitzeW1ib2xfdCAqCisJc3ltdGFibGVfZ2V0KGNoYXIgKm5hbWUpOworCitzeW1ib2xfbm9kZV90ICoKKwlzeW1saXN0X3NlYXJjaChzeW1saXN0X3QgKnN5bWxpc3QsIGNoYXIgKnN5bW5hbWUpOworCit2b2lkCisJc3ltbGlzdF9hZGQoc3ltbGlzdF90ICpzeW1saXN0LCBzeW1ib2xfdCAqc3ltYm9sLCBpbnQgaG93KTsKKyNkZWZpbmUgU1lNTElTVF9JTlNFUlRfSEVBRAkweDAwCisjZGVmaW5lIFNZTUxJU1RfU09SVAkJMHgwMQorCit2b2lkCXN5bWxpc3RfZnJlZShzeW1saXN0X3QgKnN5bWxpc3QpOworCit2b2lkCXN5bWxpc3RfbWVyZ2Uoc3ltbGlzdF90ICpzeW1saXN0X2Rlc3QsIHN5bWxpc3RfdCAqc3ltbGlzdF9zcmMxLAorCQkgICAgICBzeW1saXN0X3QgKnN5bWxpc3Rfc3JjMik7Cit2b2lkCXN5bXRhYmxlX2R1bXAoRklMRSAqb2ZpbGUsIEZJTEUgKmRmaWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2xpYi5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliZmQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2xpYi5jCkBAIC0wLDAgKzEsMTQxMiBAQAorLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBhbGwgU0NTSSBkZXZpY2UgdHlwZXMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk4LCAxOTk5IEp1c3RpbiBULiBHaWJicy4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMTk5OCBLZW5uZXRoIEQuIE1lcnJ5LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGltbWVkaWF0ZWx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgKiAyLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9zeXMvY2FtL3Njc2kvc2NzaV9hbGwuYyx2IDEuMzggMjAwMi8wOS8yMyAwNDo1NjozNSBtamFjb2IgRXhwICQKKyAqICRJZCQKKyAqLworCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKy8qIENvcmUgU0NTSSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgImFpY2xpYi5oIgorI2luY2x1ZGUgImNhbS5oIgorCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFICAgMAorI2VuZGlmIC8qIEZBTFNFICovCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAgICAxCisjZW5kaWYgLyogVFJVRSAqLworI2lmbmRlZiBFUkVTVEFSVAorI2RlZmluZSBFUkVTVEFSVCAgICAgICAgLTEgICAgICAgICAgICAgIC8qIHJlc3RhcnQgc3lzY2FsbCAqLworI2VuZGlmCisjaWZuZGVmIEVKVVNUUkVUVVJOCisjZGVmaW5lIEVKVVNUUkVUVVJOICAgICAtMiAgICAgICAgICAgICAgLyogZG9uJ3QgbW9kaWZ5IHJlZ3MsIGp1c3QgcmV0dXJuICovCisjZW5kaWYKKworc3RhdGljIGludAlhc2NlbnRyeWNvbXAoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB2b2lkICptZW1iZXIpOworc3RhdGljIGludAlzZW5zZWVudHJ5Y29tcChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKm1lbWJlcik7CitzdGF0aWMgdm9pZAlmZXRjaHRhYmxlZW50cmllcyhpbnQgc2Vuc2Vfa2V5LCBpbnQgYXNjLCBpbnQgYXNjcSwKKwkJCQkgIHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSAqLAorCQkJCSAgY29uc3Qgc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeSAqKiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBhc2NfdGFibGVfZW50cnkgKiopOworc3RhdGljIHZvaWQgKglzY3NpYnNlYXJjaChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKmJhc2UsIHNpemVfdCBubWVtYiwKKwkJCSAgICBzaXplX3Qgc2l6ZSwKKwkJCSAgICBpbnQgKCpjb21wYXIpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Cit0eXBlZGVmIGludCAoY2FtX3F1aXJrbWF0Y2hfdCkoY2FkZHJfdCwgY2FkZHJfdCk7CitzdGF0aWMgaW50CWNhbV9zdHJtYXRjaChjb25zdCB1X2ludDhfdCAqc3RyLCBjb25zdCB1X2ludDhfdCAqcGF0dGVybiwKKwkJCSAgICAgaW50IHN0cl9sZW4pOworc3RhdGljIGNhZGRyX3QJY2FtX3F1aXJrbWF0Y2goY2FkZHJfdCB0YXJnZXQsIGNhZGRyX3QgcXVpcmtfdGFibGUsCisJCQkgICAgICAgaW50IG51bV9lbnRyaWVzLCBpbnQgZW50cnlfc2l6ZSwKKwkJCSAgICAgICBjYW1fcXVpcmttYXRjaF90ICpjb21wX2Z1bmMpOworCisjZGVmaW5lIFNDU0lfTk9fU0VOU0VfU1RSSU5HUyAxCisjaWYgIWRlZmluZWQoU0NTSV9OT19TRU5TRV9TVFJJTkdTKQorI2RlZmluZSBTU1QoYXNjLCBhc2NxLCBhY3Rpb24sIGRlc2MpIFwKKwlhc2MsIGFzY3EsIGFjdGlvbiwgZGVzYworI2Vsc2UgCitzdGF0aWMgY29uc3QgY2hhciBlbXB0eV9zdHJpbmdbXSA9ICIiOworCisjZGVmaW5lIFNTVChhc2MsIGFzY3EsIGFjdGlvbiwgZGVzYykgXAorCWFzYywgYXNjcSwgYWN0aW9uLCBlbXB0eV9zdHJpbmcKKyNlbmRpZiAKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzZW5zZV9rZXlfdGFibGVfZW50cnkgc2Vuc2Vfa2V5X3RhYmxlW10gPSAKK3sKKwl7IFNTRF9LRVlfTk9fU0VOU0UsIFNTX05PUCwgIk5PIFNFTlNFIiB9LAorCXsgU1NEX0tFWV9SRUNPVkVSRURfRVJST1IsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsICJSRUNPVkVSRUQgRVJST1IiIH0sCisJeworCSAgU1NEX0tFWV9OT1RfUkVBRFksIFNTX1RVUnxTU1FfTUFOWXxTU1FfREVDUkVNRU5UX0NPVU5UfEVCVVNZLAorCSAgIk5PVCBSRUFEWSIKKwl9LAorCXsgU1NEX0tFWV9NRURJVU1fRVJST1IsIFNTX1JERUYsICJNRURJVU0gRVJST1IiIH0sCisJeyBTU0RfS0VZX0hBUkRXQVJFX0VSUk9SLCBTU19SREVGLCAiSEFSRFdBUkUgRkFJTFVSRSIgfSwKKwl7IFNTRF9LRVlfSUxMRUdBTF9SRVFVRVNULCBTU19GQVRBTHxFSU5WQUwsICJJTExFR0FMIFJFUVVFU1QiIH0sCisJeyBTU0RfS0VZX1VOSVRfQVRURU5USU9OLCBTU19GQVRBTHxFTlhJTywgIlVOSVQgQVRURU5USU9OIiB9LAorCXsgU1NEX0tFWV9EQVRBX1BST1RFQ1QsIFNTX0ZBVEFMfEVBQ0NFUywgIkRBVEEgUFJPVEVDVCIgfSwKKwl7IFNTRF9LRVlfQkxBTktfQ0hFQ0ssIFNTX0ZBVEFMfEVOT1NQQywgIkJMQU5LIENIRUNLIiB9LAorCXsgU1NEX0tFWV9WZW5kb3JfU3BlY2lmaWMsIFNTX0ZBVEFMfEVJTywgIlZlbmRvciBTcGVjaWZpYyIgfSwKKwl7IFNTRF9LRVlfQ09QWV9BQk9SVEVELCBTU19GQVRBTHxFSU8sICJDT1BZIEFCT1JURUQiIH0sCisJeyBTU0RfS0VZX0FCT1JURURfQ09NTUFORCwgU1NfUkRFRiwgIkFCT1JURUQgQ09NTUFORCIgfSwKKwl7IFNTRF9LRVlfRVFVQUwsIFNTX05PUCwgIkVRVUFMIiB9LAorCXsgU1NEX0tFWV9WT0xVTUVfT1ZFUkZMT1csIFNTX0ZBVEFMfEVJTywgIlZPTFVNRSBPVkVSRkxPVyIgfSwKKwl7IFNTRF9LRVlfTUlTQ09NUEFSRSwgU1NfTk9QLCAiTUlTQ09NUEFSRSIgfSwKKwl7IFNTRF9LRVlfUkVTRVJWRUQsIFNTX0ZBVEFMfEVJTywgIlJFU0VSVkVEIiB9Cit9OworCitzdGF0aWMgY29uc3QgaW50IHNlbnNlX2tleV90YWJsZV9zaXplID0KKyAgICBzaXplb2Yoc2Vuc2Vfa2V5X3RhYmxlKS9zaXplb2Yoc2Vuc2Vfa2V5X3RhYmxlWzBdKTsKKworc3RhdGljIHN0cnVjdCBhc2NfdGFibGVfZW50cnkgcXVhbnR1bV9maXJlYmFsbF9lbnRyaWVzW10gPSB7CisJe1NTVCgweDA0LCAweDBiLCBTU19TVEFSVHxTU1FfREVDUkVNRU5UX0NPVU5UfEVOWElPLCAKKwkgICAgICJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCBpbml0aWFsaXppbmcgY21kLiByZXF1aXJlZCIpfQorfTsKKworc3RhdGljIHN0cnVjdCBhc2NfdGFibGVfZW50cnkgc29ueV9tb19lbnRyaWVzW10gPSB7CisJe1NTVCgweDA0LCAweDAwLCBTU19TVEFSVHxTU1FfREVDUkVNRU5UX0NPVU5UfEVOWElPLAorCSAgICAgIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIGNhdXNlIG5vdCByZXBvcnRhYmxlIil9Cit9OworCitzdGF0aWMgc3RydWN0IHNjc2lfc2Vuc2VfcXVpcmtfZW50cnkgc2Vuc2VfcXVpcmtfdGFibGVbXSA9IHsKKwl7CisJCS8qCisJCSAqIFRoZSBRdWFudHVtIEZpcmViYWxsIFNUIGFuZCBTRSBsaWtlIHRvIHJldHVybiAweDA0IDB4MGIgd2hlbgorCQkgKiB0aGV5IHJlYWxseSBzaG91bGQgcmV0dXJuIDB4MDQgMHgwMi4gIDB4MDQsMHgwYiBpc24ndAorCQkgKiBkZWZpbmVkIGluIGFueSBTQ1NJIHNwZWMsIGFuZCBpdCBpc24ndCBtZW50aW9uZWQgaW4gdGhlCisJCSAqIGhhcmR3YXJlIG1hbnVhbCBmb3IgdGhlc2UgZHJpdmVzLgorCQkgKi8KKwkJe1RfRElSRUNULCBTSVBfTUVESUFfRklYRUQsICJRVUFOVFVNIiwgIkZJUkVCQUxMIFMqIiwgIioifSwKKwkJLypudW1fc2Vuc2Vfa2V5cyovMCwKKwkJc2l6ZW9mKHF1YW50dW1fZmlyZWJhbGxfZW50cmllcykvc2l6ZW9mKHN0cnVjdCBhc2NfdGFibGVfZW50cnkpLAorCQkvKnNlbnNlIGtleSBlbnRyaWVzKi9OVUxMLAorCQlxdWFudHVtX2ZpcmViYWxsX2VudHJpZXMKKwl9LAorCXsKKwkJLyoKKwkJICogVGhpcyBTb255IE1PIGRyaXZlIGxpa2VzIHRvIHJldHVybiAweDA0LCAweDAwIHdoZW4gaXQKKwkJICogaXNuJ3Qgc3B1biB1cC4KKwkJICovCisJCXtUX0RJUkVDVCwgU0lQX01FRElBX1JFTU9WQUJMRSwgIlNPTlkiLCAiU01PLSoiLCAiKiJ9LAorCQkvKm51bV9zZW5zZV9rZXlzKi8wLAorCQlzaXplb2Yoc29ueV9tb19lbnRyaWVzKS9zaXplb2Yoc3RydWN0IGFzY190YWJsZV9lbnRyeSksCisJCS8qc2Vuc2Uga2V5IGVudHJpZXMqL05VTEwsCisJCXNvbnlfbW9fZW50cmllcworCX0KK307CisKK3N0YXRpYyBjb25zdCBpbnQgc2Vuc2VfcXVpcmtfdGFibGVfc2l6ZSA9CisgICAgc2l6ZW9mKHNlbnNlX3F1aXJrX3RhYmxlKS9zaXplb2Yoc2Vuc2VfcXVpcmtfdGFibGVbMF0pOworCitzdGF0aWMgc3RydWN0IGFzY190YWJsZV9lbnRyeSBhc2NfdGFibGVbXSA9IHsKKy8qCisgKiBGcm9tIEZpbGU6IEFTQy1OVU0uVFhUCisgKiBTQ1NJIEFTQy9BU0NRIEFzc2lnbm1lbnRzCisgKiBOdW1lcmljIFNvcnRlZCBMaXN0aW5nCisgKiBhcyBvZiAgNS8xMi85NworICoKKyAqIEQgLSBESVJFQ1QgQUNDRVNTIERFVklDRSAoU0JDKSAgICAgICAgICAgICAgICAgICAgIGRldmljZSBjb2x1bW4ga2V5CisgKiAuVCAtIFNFUVVFTlRJQUwgQUNDRVNTIERFVklDRSAoU1NDKSAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIC4gTCAtIFBSSU5URVIgREVWSUNFIChTU0MpICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhbmsgPSByZXNlcnZlZAorICogLiAgUCAtIFBST0NFU1NPUiBERVZJQ0UgKFNQQykgICAgICAgICAgICAgICAgICAgICBub3QgYmxhbmsgPSBhbGxvd2VkCisgKiAuICAuVyAtIFdSSVRFIE9OQ0UgUkVBRCBNVUxUSVBMRSBERVZJQ0UgKFNCQykKKyAqIC4gIC4gUiAtIENEIERFVklDRSAoTU1DKQorICogLiAgLiAgUyAtIFNDQU5ORVIgREVWSUNFIChTR0MpCisgKiAuICAuICAuTyAtIE9QVElDQUwgTUVNT1JZIERFVklDRSAoU0JDKQorICogLiAgLiAgLiBNIC0gTUVESUEgQ0hBTkdFUiBERVZJQ0UgKFNNQykKKyAqIC4gIC4gIC4gIEMgLSBDT01NVU5JQ0FUSU9OIERFVklDRSAoU1NDKQorICogLiAgLiAgLiAgLkEgLSBTVE9SQUdFIEFSUkFZIERFVklDRSAoU0NDKQorICogLiAgLiAgLiAgLiBFIC0gRU5DTE9TVVJFIFNFUlZJQ0VTIERFVklDRSAoU0VTKQorICogRFRMUFdSU09NQ0FFICAgICAgICBBU0MgICBBU0NRICBBY3Rpb24gIERlc2NyaXB0aW9uCisgKiAtLS0tLS0tLS0tLS0gICAgICAgIC0tLS0gIC0tLS0gIC0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRFRMUFdSU09NQ0FFICove1NTVCgweDAwLCAweDAwLCBTU19OT1AsCisJCQkiTm8gYWRkaXRpb25hbCBzZW5zZSBpbmZvcm1hdGlvbiIpIH0sCisvKiAgVCAgICBTICAgICAgKi97U1NUKDB4MDAsIDB4MDEsIFNTX1JERUYsCisJCQkiRmlsZW1hcmsgZGV0ZWN0ZWQiKSB9LAorLyogIFQgICAgUyAgICAgICove1NTVCgweDAwLCAweDAyLCBTU19SREVGLAorCQkJIkVuZC1vZi1wYXJ0aXRpb24vbWVkaXVtIGRldGVjdGVkIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHgwMCwgMHgwMywgU1NfUkRFRiwKKwkJCSJTZXRtYXJrIGRldGVjdGVkIikgfSwKKy8qICBUICAgIFMgICAgICAqL3tTU1QoMHgwMCwgMHgwNCwgU1NfUkRFRiwKKwkJCSJCZWdpbm5pbmctb2YtcGFydGl0aW9uL21lZGl1bSBkZXRlY3RlZCIpIH0sCisvKiAgVCAgICBTICAgICAgKi97U1NUKDB4MDAsIDB4MDUsIFNTX1JERUYsCisJCQkiRW5kLW9mLWRhdGEgZGV0ZWN0ZWQiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDAwLCAweDA2LCBTU19SREVGLAorCQkJIkkvTyBwcm9jZXNzIHRlcm1pbmF0ZWQiKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDAwLCAweDExLCBTU19GQVRBTHxFQlVTWSwKKwkJCSJBdWRpbyBwbGF5IG9wZXJhdGlvbiBpbiBwcm9ncmVzcyIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4MDAsIDB4MTIsIFNTX05PUCwKKwkJCSJBdWRpbyBwbGF5IG9wZXJhdGlvbiBwYXVzZWQiKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDAwLCAweDEzLCBTU19OT1AsCisJCQkiQXVkaW8gcGxheSBvcGVyYXRpb24gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4MDAsIDB4MTQsIFNTX1JERUYsCisJCQkiQXVkaW8gcGxheSBvcGVyYXRpb24gc3RvcHBlZCBkdWUgdG8gZXJyb3IiKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDAwLCAweDE1LCBTU19OT1AsCisJCQkiTm8gY3VycmVudCBhdWRpbyBzdGF0dXMgdG8gcmV0dXJuIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgwMCwgMHgxNiwgU1NfRkFUQUx8RUJVU1ksCisJCQkiT3BlcmF0aW9uIGluIHByb2dyZXNzIikgfSwKKy8qIERUTCBXUlNPTSBBRSAqL3tTU1QoMHgwMCwgMHgxNywgU1NfUkRFRiwKKwkJCSJDbGVhbmluZyByZXF1ZXN0ZWQiKSB9LAorLyogRCAgIFcgIE8gICAgICove1NTVCgweDAxLCAweDAwLCBTU19SREVGLAorCQkJIk5vIGluZGV4L3NlY3RvciBzaWduYWwiKSB9LAorLyogRCAgIFdSIE9NICAgICove1NTVCgweDAyLCAweDAwLCBTU19SREVGLAorCQkJIk5vIHNlZWsgY29tcGxldGUiKSB9LAorLyogRFRMIFcgU08gICAgICove1NTVCgweDAzLCAweDAwLCBTU19SREVGLAorCQkJIlBlcmlwaGVyYWwgZGV2aWNlIHdyaXRlIGZhdWx0IikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHgwMywgMHgwMSwgU1NfUkRFRiwKKwkJCSJObyB3cml0ZSBjdXJyZW50IikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHgwMywgMHgwMiwgU1NfUkRFRiwKKwkJCSJFeGNlc3NpdmUgd3JpdGUgZXJyb3JzIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgwNCwgMHgwMCwKKwkJCVNTX1RVUnxTU1FfREVMQVl8U1NRX01BTll8U1NRX0RFQ1JFTUVOVF9DT1VOVHxFSU8sCisJCQkiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgY2F1c2Ugbm90IHJlcG9ydGFibGUiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDA0LCAweDAxLAorCQkJU1NfVFVSfFNTUV9ERUxBWXxTU1FfTUFOWXxTU1FfREVDUkVNRU5UX0NPVU5UfEVCVVNZLAorCQkJIkxvZ2ljYWwgdW5pdCBpcyBpbiBwcm9jZXNzIG9mIGJlY29taW5nIHJlYWR5IikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgwNCwgMHgwMiwgU1NfU1RBUlR8U1NRX0RFQ1JFTUVOVF9DT1VOVHxFTlhJTywKKwkJCSJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCBpbml0aWFsaXppbmcgY21kLiByZXF1aXJlZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MDQsIDB4MDMsIFNTX0ZBVEFMfEVOWElPLAorCQkJIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIG1hbnVhbCBpbnRlcnZlbnRpb24gcmVxdWlyZWQiKX0sCisvKiBEVEwgICAgTyAgICAgKi97U1NUKDB4MDQsIDB4MDQsIFNTX0ZBVEFMfEVCVVNZLAorCQkJIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIGZvcm1hdCBpbiBwcm9ncmVzcyIpIH0sCisvKiBEVCAgVyAgT01DQSAgKi97U1NUKDB4MDQsIDB4MDUsIFNTX0ZBVEFMfEVCVVNZLAorCQkJIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIHJlYnVpbGQgaW4gcHJvZ3Jlc3MiKSB9LAorLyogRFQgIFcgIE9NQ0EgICove1NTVCgweDA0LCAweDA2LCBTU19GQVRBTHxFQlVTWSwKKwkJCSJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCByZWNhbGN1bGF0aW9uIGluIHByb2dyZXNzIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgwNCwgMHgwNywgU1NfRkFUQUx8RUJVU1ksCisJCQkiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgb3BlcmF0aW9uIGluIHByb2dyZXNzIikgfSwKKy8qICAgICAgUiAgICAgICAqL3tTU1QoMHgwNCwgMHgwOCwgU1NfRkFUQUx8RUJVU1ksCisJCQkiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgbG9uZyB3cml0ZSBpbiBwcm9ncmVzcyIpIH0sCisvKiBEVEwgV1JTT01DQUUgKi97U1NUKDB4MDUsIDB4MDAsIFNTX1JERUYsCisJCQkiTG9naWNhbCB1bml0IGRvZXMgbm90IHJlc3BvbmQgdG8gc2VsZWN0aW9uIikgfSwKKy8qIEQgICBXUiBPTSAgICAqL3tTU1QoMHgwNiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJObyByZWZlcmVuY2UgcG9zaXRpb24gZm91bmQiKSB9LAorLyogRFRMIFdSU09NICAgICove1NTVCgweDA3LCAweDAwLCBTU19SREVGLAorCQkJIk11bHRpcGxlIHBlcmlwaGVyYWwgZGV2aWNlcyBzZWxlY3RlZCIpIH0sCisvKiBEVEwgV1JTT01DQUUgKi97U1NUKDB4MDgsIDB4MDAsIFNTX1JERUYsCisJCQkiTG9naWNhbCB1bml0IGNvbW11bmljYXRpb24gZmFpbHVyZSIpIH0sCisvKiBEVEwgV1JTT01DQUUgKi97U1NUKDB4MDgsIDB4MDEsIFNTX1JERUYsCisJCQkiTG9naWNhbCB1bml0IGNvbW11bmljYXRpb24gdGltZS1vdXQiKSB9LAorLyogRFRMIFdSU09NQ0FFICove1NTVCgweDA4LCAweDAyLCBTU19SREVGLAorCQkJIkxvZ2ljYWwgdW5pdCBjb21tdW5pY2F0aW9uIHBhcml0eSBlcnJvciIpIH0sCisvKiBEVCAgIFIgT00gICAgKi97U1NUKDB4MDgsIDB4MDMsIFNTX1JERUYsCisJCQkiTG9naWNhbCB1bml0IGNvbW11bmljYXRpb24gY3JjIGVycm9yICh1bHRyYS1kbWEvMzIpIil9LAorLyogRFQgIFdSIE8gICAgICove1NTVCgweDA5LCAweDAwLCBTU19SREVGLAorCQkJIlRyYWNrIGZvbGxvd2luZyBlcnJvciIpIH0sCisvKiAgICAgV1IgTyAgICAgKi97U1NUKDB4MDksIDB4MDEsIFNTX1JERUYsCisJCQkiVHJhY2tpbmcgc2Vydm8gZmFpbHVyZSIpIH0sCisvKiAgICAgV1IgTyAgICAgKi97U1NUKDB4MDksIDB4MDIsIFNTX1JERUYsCisJCQkiRm9jdXMgc2Vydm8gZmFpbHVyZSIpIH0sCisvKiAgICAgV1IgTyAgICAgKi97U1NUKDB4MDksIDB4MDMsIFNTX1JERUYsCisJCQkiU3BpbmRsZSBzZXJ2byBmYWlsdXJlIikgfSwKKy8qIERUICBXUiBPICAgICAqL3tTU1QoMHgwOSwgMHgwNCwgU1NfUkRFRiwKKwkJCSJIZWFkIHNlbGVjdCBmYXVsdCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MEEsIDB4MDAsIFNTX0ZBVEFMfEVOT1NQQywKKwkJCSJFcnJvciBsb2cgb3ZlcmZsb3ciKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDBCLCAweDAwLCBTU19SREVGLAorCQkJIldhcm5pbmciKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDBCLCAweDAxLCBTU19SREVGLAorCQkJIlNwZWNpZmllZCB0ZW1wZXJhdHVyZSBleGNlZWRlZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MEIsIDB4MDIsIFNTX1JERUYsCisJCQkiRW5jbG9zdXJlIGRlZ3JhZGVkIikgfSwKKy8qICBUICAgUlMgICAgICAqL3tTU1QoMHgwQywgMHgwMCwgU1NfUkRFRiwKKwkJCSJXcml0ZSBlcnJvciIpIH0sCisvKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MEMsIDB4MDEsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiV3JpdGUgZXJyb3IgLSByZWNvdmVyZWQgd2l0aCBhdXRvIHJlYWxsb2NhdGlvbiIpIH0sCisvKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MEMsIDB4MDIsIFNTX1JERUYsCisJCQkiV3JpdGUgZXJyb3IgLSBhdXRvIHJlYWxsb2NhdGlvbiBmYWlsZWQiKSB9LAorLyogRCAgIFcgIE8gICAgICove1NTVCgweDBDLCAweDAzLCBTU19SREVGLAorCQkJIldyaXRlIGVycm9yIC0gcmVjb21tZW5kIHJlYXNzaWdubWVudCIpIH0sCisvKiBEVCAgVyAgTyAgICAgKi97U1NUKDB4MEMsIDB4MDQsIFNTX1JERUYsCisJCQkiQ29tcHJlc3Npb24gY2hlY2sgbWlzY29tcGFyZSBlcnJvciIpIH0sCisvKiBEVCAgVyAgTyAgICAgKi97U1NUKDB4MEMsIDB4MDUsIFNTX1JERUYsCisJCQkiRGF0YSBleHBhbnNpb24gb2NjdXJyZWQgZHVyaW5nIGNvbXByZXNzaW9uIikgfSwKKy8qIERUICBXICBPICAgICAqL3tTU1QoMHgwQywgMHgwNiwgU1NfUkRFRiwKKwkJCSJCbG9jayBub3QgY29tcHJlc3NpYmxlIikgfSwKKy8qICAgICAgUiAgICAgICAqL3tTU1QoMHgwQywgMHgwNywgU1NfUkRFRiwKKwkJCSJXcml0ZSBlcnJvciAtIHJlY292ZXJ5IG5lZWRlZCIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4MEMsIDB4MDgsIFNTX1JERUYsCisJCQkiV3JpdGUgZXJyb3IgLSByZWNvdmVyeSBmYWlsZWQiKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDBDLCAweDA5LCBTU19SREVGLAorCQkJIldyaXRlIGVycm9yIC0gbG9zcyBvZiBzdHJlYW1pbmciKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDBDLCAweDBBLCBTU19SREVGLAorCQkJIldyaXRlIGVycm9yIC0gcGFkZGluZyBibG9ja3MgYWRkZWQiKSB9LAorLyogRCAgIFcgIE8gICAgICove1NTVCgweDEwLCAweDAwLCBTU19SREVGLAorCQkJIklEIENSQyBvciBFQ0MgZXJyb3IiKSB9LAorLyogRFQgIFdSU08gICAgICove1NTVCgweDExLCAweDAwLCBTU19SREVGLAorCQkJIlVucmVjb3ZlcmVkIHJlYWQgZXJyb3IiKSB9LAorLyogRFQgIFcgU08gICAgICove1NTVCgweDExLCAweDAxLCBTU19SREVGLAorCQkJIlJlYWQgcmV0cmllcyBleGhhdXN0ZWQiKSB9LAorLyogRFQgIFcgU08gICAgICove1NTVCgweDExLCAweDAyLCBTU19SREVGLAorCQkJIkVycm9yIHRvbyBsb25nIHRvIGNvcnJlY3QiKSB9LAorLyogRFQgIFcgU08gICAgICove1NTVCgweDExLCAweDAzLCBTU19SREVGLAorCQkJIk11bHRpcGxlIHJlYWQgZXJyb3JzIikgfSwKKy8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxMSwgMHgwNCwgU1NfUkRFRiwKKwkJCSJVbnJlY292ZXJlZCByZWFkIGVycm9yIC0gYXV0byByZWFsbG9jYXRlIGZhaWxlZCIpIH0sCisvKiAgICAgV1IgTyAgICAgKi97U1NUKDB4MTEsIDB4MDUsIFNTX1JERUYsCisJCQkiTC1FQyB1bmNvcnJlY3RhYmxlIGVycm9yIikgfSwKKy8qICAgICBXUiBPICAgICAqL3tTU1QoMHgxMSwgMHgwNiwgU1NfUkRFRiwKKwkJCSJDSVJDIHVucmVjb3ZlcmVkIGVycm9yIikgfSwKKy8qICAgICBXICBPICAgICAqL3tTU1QoMHgxMSwgMHgwNywgU1NfUkRFRiwKKwkJCSJEYXRhIHJlLXN5bmNocm9uaXphdGlvbiBlcnJvciIpIH0sCisvKiAgVCAgICAgICAgICAgKi97U1NUKDB4MTEsIDB4MDgsIFNTX1JERUYsCisJCQkiSW5jb21wbGV0ZSBibG9jayByZWFkIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHgxMSwgMHgwOSwgU1NfUkRFRiwKKwkJCSJObyBnYXAgZm91bmQiKSB9LAorLyogRFQgICAgIE8gICAgICove1NTVCgweDExLCAweDBBLCBTU19SREVGLAorCQkJIk1pc2NvcnJlY3RlZCBlcnJvciIpIH0sCisvKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTEsIDB4MEIsIFNTX1JERUYsCisJCQkiVW5yZWNvdmVyZWQgcmVhZCBlcnJvciAtIHJlY29tbWVuZCByZWFzc2lnbm1lbnQiKSB9LAorLyogRCAgIFcgIE8gICAgICove1NTVCgweDExLCAweDBDLCBTU19SREVGLAorCQkJIlVucmVjb3ZlcmVkIHJlYWQgZXJyb3IgLSByZWNvbW1lbmQgcmV3cml0ZSB0aGUgZGF0YSIpfSwKKy8qIERUICBXUiBPICAgICAqL3tTU1QoMHgxMSwgMHgwRCwgU1NfUkRFRiwKKwkJCSJEZS1jb21wcmVzc2lvbiBDUkMgZXJyb3IiKSB9LAorLyogRFQgIFdSIE8gICAgICove1NTVCgweDExLCAweDBFLCBTU19SREVGLAorCQkJIkNhbm5vdCBkZWNvbXByZXNzIHVzaW5nIGRlY2xhcmVkIGFsZ29yaXRobSIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4MTEsIDB4MEYsIFNTX1JERUYsCisJCQkiRXJyb3IgcmVhZGluZyBVUEMvRUFOIG51bWJlciIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4MTEsIDB4MTAsIFNTX1JERUYsCisJCQkiRXJyb3IgcmVhZGluZyBJU1JDIG51bWJlciIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4MTEsIDB4MTEsIFNTX1JERUYsCisJCQkiUmVhZCBlcnJvciAtIGxvc3Mgb2Ygc3RyZWFtaW5nIikgfSwKKy8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxMiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJBZGRyZXNzIG1hcmsgbm90IGZvdW5kIGZvciBpZCBmaWVsZCIpIH0sCisvKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTMsIDB4MDAsIFNTX1JERUYsCisJCQkiQWRkcmVzcyBtYXJrIG5vdCBmb3VuZCBmb3IgZGF0YSBmaWVsZCIpIH0sCisvKiBEVEwgV1JTTyAgICAgKi97U1NUKDB4MTQsIDB4MDAsIFNTX1JERUYsCisJCQkiUmVjb3JkZWQgZW50aXR5IG5vdCBmb3VuZCIpIH0sCisvKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MTQsIDB4MDEsIFNTX1JERUYsCisJCQkiUmVjb3JkIG5vdCBmb3VuZCIpIH0sCisvKiAgVCAgICAgICAgICAgKi97U1NUKDB4MTQsIDB4MDIsIFNTX1JERUYsCisJCQkiRmlsZW1hcmsgb3Igc2V0bWFyayBub3QgZm91bmQiKSB9LAorLyogIFQgICAgICAgICAgICove1NTVCgweDE0LCAweDAzLCBTU19SREVGLAorCQkJIkVuZC1vZi1kYXRhIG5vdCBmb3VuZCIpIH0sCisvKiAgVCAgICAgICAgICAgKi97U1NUKDB4MTQsIDB4MDQsIFNTX1JERUYsCisJCQkiQmxvY2sgc2VxdWVuY2UgZXJyb3IiKSB9LAorLyogRFQgIFcgIE8gICAgICove1NTVCgweDE0LCAweDA1LCBTU19SREVGLAorCQkJIlJlY29yZCBub3QgZm91bmQgLSByZWNvbW1lbmQgcmVhc3NpZ25tZW50IikgfSwKKy8qIERUICBXICBPICAgICAqL3tTU1QoMHgxNCwgMHgwNiwgU1NfUkRFRiwKKwkJCSJSZWNvcmQgbm90IGZvdW5kIC0gZGF0YSBhdXRvLXJlYWxsb2NhdGVkIikgfSwKKy8qIERUTCBXUlNPTSAgICAqL3tTU1QoMHgxNSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJSYW5kb20gcG9zaXRpb25pbmcgZXJyb3IiKSB9LAorLyogRFRMIFdSU09NICAgICove1NTVCgweDE1LCAweDAxLCBTU19SREVGLAorCQkJIk1lY2hhbmljYWwgcG9zaXRpb25pbmcgZXJyb3IiKSB9LAorLyogRFQgIFdSIE8gICAgICove1NTVCgweDE1LCAweDAyLCBTU19SREVGLAorCQkJIlBvc2l0aW9uaW5nIGVycm9yIGRldGVjdGVkIGJ5IHJlYWQgb2YgbWVkaXVtIikgfSwKKy8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxNiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJEYXRhIHN5bmNocm9uaXphdGlvbiBtYXJrIGVycm9yIikgfSwKKy8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxNiwgMHgwMSwgU1NfUkRFRiwKKwkJCSJEYXRhIHN5bmMgZXJyb3IgLSBkYXRhIHJld3JpdHRlbiIpIH0sCisvKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTYsIDB4MDIsIFNTX1JERUYsCisJCQkiRGF0YSBzeW5jIGVycm9yIC0gcmVjb21tZW5kIHJld3JpdGUiKSB9LAorLyogRCAgIFcgIE8gICAgICove1NTVCgweDE2LCAweDAzLCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAorCQkJIkRhdGEgc3luYyBlcnJvciAtIGRhdGEgYXV0by1yZWFsbG9jYXRlZCIpIH0sCisvKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTYsIDB4MDQsIFNTX1JERUYsCisJCQkiRGF0YSBzeW5jIGVycm9yIC0gcmVjb21tZW5kIHJlYXNzaWdubWVudCIpIH0sCisvKiBEVCAgV1JTTyAgICAgKi97U1NUKDB4MTcsIDB4MDAsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCBubyBlcnJvciBjb3JyZWN0aW9uIGFwcGxpZWQiKSB9LAorLyogRFQgIFdSU08gICAgICove1NTVCgweDE3LCAweDAxLCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAorCQkJIlJlY292ZXJlZCBkYXRhIHdpdGggcmV0cmllcyIpIH0sCisvKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MTcsIDB4MDIsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCBwb3NpdGl2ZSBoZWFkIG9mZnNldCIpIH0sCisvKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MTcsIDB4MDMsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCBuZWdhdGl2ZSBoZWFkIG9mZnNldCIpIH0sCisvKiAgICAgV1IgTyAgICAgKi97U1NUKDB4MTcsIDB4MDQsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCByZXRyaWVzIGFuZC9vciBDSVJDIGFwcGxpZWQiKSB9LAorLyogRCAgIFdSIE8gICAgICove1NTVCgweDE3LCAweDA1LCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAorCQkJIlJlY292ZXJlZCBkYXRhIHVzaW5nIHByZXZpb3VzIHNlY3RvciBpZCIpIH0sCisvKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTcsIDB4MDYsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aG91dCBFQ0MgLSBkYXRhIGF1dG8tcmVhbGxvY2F0ZWQiKSB9LAorLyogRCAgIFcgIE8gICAgICove1NTVCgweDE3LCAweDA3LCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAorCQkJIlJlY292ZXJlZCBkYXRhIHdpdGhvdXQgRUNDIC0gcmVjb21tZW5kIHJlYXNzaWdubWVudCIpfSwKKy8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxNywgMHgwOCwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKKwkJCSJSZWNvdmVyZWQgZGF0YSB3aXRob3V0IEVDQyAtIHJlY29tbWVuZCByZXdyaXRlIikgfSwKKy8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxNywgMHgwOSwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKKwkJCSJSZWNvdmVyZWQgZGF0YSB3aXRob3V0IEVDQyAtIGRhdGEgcmV3cml0dGVuIikgfSwKKy8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxOCwgMHgwMCwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKKwkJCSJSZWNvdmVyZWQgZGF0YSB3aXRoIGVycm9yIGNvcnJlY3Rpb24gYXBwbGllZCIpIH0sCisvKiBEICAgV1IgTyAgICAgKi97U1NUKDB4MTgsIDB4MDEsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCBlcnJvciBjb3JyLiAmIHJldHJpZXMgYXBwbGllZCIpIH0sCisvKiBEICAgV1IgTyAgICAgKi97U1NUKDB4MTgsIDB4MDIsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiUmVjb3ZlcmVkIGRhdGEgLSBkYXRhIGF1dG8tcmVhbGxvY2F0ZWQiKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDE4LCAweDAzLCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAorCQkJIlJlY292ZXJlZCBkYXRhIHdpdGggQ0lSQyIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4MTgsIDB4MDQsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCBMLUVDIikgfSwKKy8qIEQgICBXUiBPICAgICAqL3tTU1QoMHgxOCwgMHgwNSwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKKwkJCSJSZWNvdmVyZWQgZGF0YSAtIHJlY29tbWVuZCByZWFzc2lnbm1lbnQiKSB9LAorLyogRCAgIFdSIE8gICAgICove1NTVCgweDE4LCAweDA2LCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAorCQkJIlJlY292ZXJlZCBkYXRhIC0gcmVjb21tZW5kIHJld3JpdGUiKSB9LAorLyogRCAgIFcgIE8gICAgICove1NTVCgweDE4LCAweDA3LCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAorCQkJIlJlY292ZXJlZCBkYXRhIHdpdGggRUNDIC0gZGF0YSByZXdyaXR0ZW4iKSB9LAorLyogRCAgICAgIE8gICAgICove1NTVCgweDE5LCAweDAwLCBTU19SREVGLAorCQkJIkRlZmVjdCBsaXN0IGVycm9yIikgfSwKKy8qIEQgICAgICBPICAgICAqL3tTU1QoMHgxOSwgMHgwMSwgU1NfUkRFRiwKKwkJCSJEZWZlY3QgbGlzdCBub3QgYXZhaWxhYmxlIikgfSwKKy8qIEQgICAgICBPICAgICAqL3tTU1QoMHgxOSwgMHgwMiwgU1NfUkRFRiwKKwkJCSJEZWZlY3QgbGlzdCBlcnJvciBpbiBwcmltYXJ5IGxpc3QiKSB9LAorLyogRCAgICAgIE8gICAgICove1NTVCgweDE5LCAweDAzLCBTU19SREVGLAorCQkJIkRlZmVjdCBsaXN0IGVycm9yIGluIGdyb3duIGxpc3QiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDFBLCAweDAwLCBTU19SREVGLAorCQkJIlBhcmFtZXRlciBsaXN0IGxlbmd0aCBlcnJvciIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MUIsIDB4MDAsIFNTX1JERUYsCisJCQkiU3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlciBlcnJvciIpIH0sCisvKiBEICAgICAgTyAgICAgKi97U1NUKDB4MUMsIDB4MDAsIFNTX1JERUYsCisJCQkiRGVmZWN0IGxpc3Qgbm90IGZvdW5kIikgfSwKKy8qIEQgICAgICBPICAgICAqL3tTU1QoMHgxQywgMHgwMSwgU1NfUkRFRiwKKwkJCSJQcmltYXJ5IGRlZmVjdCBsaXN0IG5vdCBmb3VuZCIpIH0sCisvKiBEICAgICAgTyAgICAgKi97U1NUKDB4MUMsIDB4MDIsIFNTX1JERUYsCisJCQkiR3Jvd24gZGVmZWN0IGxpc3Qgbm90IGZvdW5kIikgfSwKKy8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxRCwgMHgwMCwgU1NfRkFUQUwsCisJCQkiTWlzY29tcGFyZSBkdXJpbmcgdmVyaWZ5IG9wZXJhdGlvbiIgKX0sCisvKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MUUsIDB4MDAsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiUmVjb3ZlcmVkIGlkIHdpdGggZWNjIGNvcnJlY3Rpb24iKSB9LAorLyogRCAgICAgIE8gICAgICove1NTVCgweDFGLCAweDAwLCBTU19SREVGLAorCQkJIlBhcnRpYWwgZGVmZWN0IGxpc3QgdHJhbnNmZXIiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDIwLCAweDAwLCBTU19GQVRBTHxFSU5WQUwsCisJCQkiSW52YWxpZCBjb21tYW5kIG9wZXJhdGlvbiBjb2RlIikgfSwKKy8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgyMSwgMHgwMCwgU1NfRkFUQUx8RUlOVkFMLAorCQkJIkxvZ2ljYWwgYmxvY2sgYWRkcmVzcyBvdXQgb2YgcmFuZ2UiICl9LAorLyogRFQgIFdSIE9NICAgICove1NTVCgweDIxLCAweDAxLCBTU19GQVRBTHxFSU5WQUwsCisJCQkiSW52YWxpZCBlbGVtZW50IGFkZHJlc3MiKSB9LAorLyogRCAgICAgICAgICAgICove1NTVCgweDIyLCAweDAwLCBTU19GQVRBTHxFSU5WQUwsCisJCQkiSWxsZWdhbCBmdW5jdGlvbiIpIH0sIC8qIERlcHJlY2F0ZWQuIFVzZSAyMCAwMCwgMjQgMDAsIG9yIDI2IDAwIGluc3RlYWQgKi8KKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyNCwgMHgwMCwgU1NfRkFUQUx8RUlOVkFMLAorCQkJIkludmFsaWQgZmllbGQgaW4gQ0RCIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyNSwgMHgwMCwgU1NfRkFUQUx8RU5YSU8sCisJCQkiTG9naWNhbCB1bml0IG5vdCBzdXBwb3J0ZWQiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDI2LCAweDAwLCBTU19GQVRBTHxFSU5WQUwsCisJCQkiSW52YWxpZCBmaWVsZCBpbiBwYXJhbWV0ZXIgbGlzdCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjYsIDB4MDEsIFNTX0ZBVEFMfEVJTlZBTCwKKwkJCSJQYXJhbWV0ZXIgbm90IHN1cHBvcnRlZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjYsIDB4MDIsIFNTX0ZBVEFMfEVJTlZBTCwKKwkJCSJQYXJhbWV0ZXIgdmFsdWUgaW52YWxpZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjYsIDB4MDMsIFNTX0ZBVEFMfEVJTlZBTCwKKwkJCSJUaHJlc2hvbGQgcGFyYW1ldGVycyBub3Qgc3VwcG9ydGVkIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyNiwgMHgwNCwgU1NfRkFUQUx8RUlOVkFMLAorCQkJIkludmFsaWQgcmVsZWFzZSBvZiBhY3RpdmUgcGVyc2lzdGVudCByZXNlcnZhdGlvbiIpIH0sCisvKiBEVCAgVyAgTyAgICAgKi97U1NUKDB4MjcsIDB4MDAsIFNTX0ZBVEFMfEVBQ0NFUywKKwkJCSJXcml0ZSBwcm90ZWN0ZWQiKSB9LAorLyogRFQgIFcgIE8gICAgICove1NTVCgweDI3LCAweDAxLCBTU19GQVRBTHxFQUNDRVMsCisJCQkiSGFyZHdhcmUgd3JpdGUgcHJvdGVjdGVkIikgfSwKKy8qIERUICBXICBPICAgICAqL3tTU1QoMHgyNywgMHgwMiwgU1NfRkFUQUx8RUFDQ0VTLAorCQkJIkxvZ2ljYWwgdW5pdCBzb2Z0d2FyZSB3cml0ZSBwcm90ZWN0ZWQiKSB9LAorLyogIFQgICAgICAgICAgICove1NTVCgweDI3LCAweDAzLCBTU19GQVRBTHxFQUNDRVMsCisJCQkiQXNzb2NpYXRlZCB3cml0ZSBwcm90ZWN0IikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHgyNywgMHgwNCwgU1NfRkFUQUx8RUFDQ0VTLAorCQkJIlBlcnNpc3RlbnQgd3JpdGUgcHJvdGVjdCIpIH0sCisvKiAgVCAgICAgICAgICAgKi97U1NUKDB4MjcsIDB4MDUsIFNTX0ZBVEFMfEVBQ0NFUywKKwkJCSJQZXJtYW5lbnQgd3JpdGUgcHJvdGVjdCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjgsIDB4MDAsIFNTX1JERUYsCisJCQkiTm90IHJlYWR5IHRvIHJlYWR5IGNoYW5nZSwgbWVkaXVtIG1heSBoYXZlIGNoYW5nZWQiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDI4LCAweDAxLCBTU19GQVRBTHxFTlhJTywKKwkJCSJJbXBvcnQgb3IgZXhwb3J0IGVsZW1lbnQgYWNjZXNzZWQiKSB9LAorLyoKKyAqIFhYWCBKR2liYnMgLSBBbGwgb2YgdGhlc2Ugc2hvdWxkIHVzZSB0aGUgc2FtZSBlcnJubywgYnV0IEkgZG9uJ3QgdGhpbmsKKyAqIEVOWElPIGlzIHRoZSBjb3JyZWN0IGNob2ljZS4gIFNob3VsZCB3ZSBib3Jyb3cgZnJvbSB0aGUgbmV0d29ya2luZworICogZXJybm9zPyAgRUNPTk5SRVNFVCBhbnlvbmU/CisgKi8KKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyOSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJQb3dlciBvbiwgcmVzZXQsIG9yIGJ1cyBkZXZpY2UgcmVzZXQgb2NjdXJyZWQiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDI5LCAweDAxLCBTU19SREVGLAorCQkJIlBvd2VyIG9uIG9jY3VycmVkIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyOSwgMHgwMiwgU1NfUkRFRiwKKwkJCSJTY3NpIGJ1cyByZXNldCBvY2N1cnJlZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjksIDB4MDMsIFNTX1JERUYsCisJCQkiQnVzIGRldmljZSByZXNldCBmdW5jdGlvbiBvY2N1cnJlZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjksIDB4MDQsIFNTX1JERUYsCisJCQkiRGV2aWNlIGludGVybmFsIHJlc2V0IikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyOSwgMHgwNSwgU1NfUkRFRiwKKwkJCSJUcmFuc2NlaXZlciBtb2RlIGNoYW5nZWQgdG8gc2luZ2xlLWVuZGVkIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyOSwgMHgwNiwgU1NfUkRFRiwKKwkJCSJUcmFuc2NlaXZlciBtb2RlIGNoYW5nZWQgdG8gTFZEIikgfSwKKy8qIERUTCBXUlNPTUNBRSAqL3tTU1QoMHgyQSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJQYXJhbWV0ZXJzIGNoYW5nZWQiKSB9LAorLyogRFRMIFdSU09NQ0FFICove1NTVCgweDJBLCAweDAxLCBTU19SREVGLAorCQkJIk1vZGUgcGFyYW1ldGVycyBjaGFuZ2VkIikgfSwKKy8qIERUTCBXUlNPTUNBRSAqL3tTU1QoMHgyQSwgMHgwMiwgU1NfUkRFRiwKKwkJCSJMb2cgcGFyYW1ldGVycyBjaGFuZ2VkIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyQSwgMHgwMywgU1NfUkRFRiwKKwkJCSJSZXNlcnZhdGlvbnMgcHJlZW1wdGVkIikgfSwKKy8qIERUTFBXUlNPIEMgICAqL3tTU1QoMHgyQiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJDb3B5IGNhbm5vdCBleGVjdXRlIHNpbmNlIGhvc3QgY2Fubm90IGRpc2Nvbm5lY3QiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDJDLCAweDAwLCBTU19SREVGLAorCQkJIkNvbW1hbmQgc2VxdWVuY2UgZXJyb3IiKSB9LAorLyogICAgICAgUyAgICAgICove1NTVCgweDJDLCAweDAxLCBTU19SREVGLAorCQkJIlRvbyBtYW55IHdpbmRvd3Mgc3BlY2lmaWVkIikgfSwKKy8qICAgICAgIFMgICAgICAqL3tTU1QoMHgyQywgMHgwMiwgU1NfUkRFRiwKKwkJCSJJbnZhbGlkIGNvbWJpbmF0aW9uIG9mIHdpbmRvd3Mgc3BlY2lmaWVkIikgfSwKKy8qICAgICAgUiAgICAgICAqL3tTU1QoMHgyQywgMHgwMywgU1NfUkRFRiwKKwkJCSJDdXJyZW50IHByb2dyYW0gYXJlYSBpcyBub3QgZW1wdHkiKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDJDLCAweDA0LCBTU19SREVGLAorCQkJIkN1cnJlbnQgcHJvZ3JhbSBhcmVhIGlzIGVtcHR5IikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHgyRCwgMHgwMCwgU1NfUkRFRiwKKwkJCSJPdmVyd3JpdGUgZXJyb3Igb24gdXBkYXRlIGluIHBsYWNlIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyRiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJDb21tYW5kcyBjbGVhcmVkIGJ5IGFub3RoZXIgaW5pdGlhdG9yIikgfSwKKy8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzMCwgMHgwMCwgU1NfUkRFRiwKKwkJCSJJbmNvbXBhdGlibGUgbWVkaXVtIGluc3RhbGxlZCIpIH0sCisvKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MzAsIDB4MDEsIFNTX1JERUYsCisJCQkiQ2Fubm90IHJlYWQgbWVkaXVtIC0gdW5rbm93biBmb3JtYXQiKSB9LAorLyogRFQgIFdSIE8gICAgICove1NTVCgweDMwLCAweDAyLCBTU19SREVGLAorCQkJIkNhbm5vdCByZWFkIG1lZGl1bSAtIGluY29tcGF0aWJsZSBmb3JtYXQiKSB9LAorLyogRFQgICAgICAgICAgICove1NTVCgweDMwLCAweDAzLCBTU19SREVGLAorCQkJIkNsZWFuaW5nIGNhcnRyaWRnZSBpbnN0YWxsZWQiKSB9LAorLyogRFQgIFdSIE8gICAgICove1NTVCgweDMwLCAweDA0LCBTU19SREVGLAorCQkJIkNhbm5vdCB3cml0ZSBtZWRpdW0gLSB1bmtub3duIGZvcm1hdCIpIH0sCisvKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MzAsIDB4MDUsIFNTX1JERUYsCisJCQkiQ2Fubm90IHdyaXRlIG1lZGl1bSAtIGluY29tcGF0aWJsZSBmb3JtYXQiKSB9LAorLyogRFQgIFcgIE8gICAgICove1NTVCgweDMwLCAweDA2LCBTU19SREVGLAorCQkJIkNhbm5vdCBmb3JtYXQgbWVkaXVtIC0gaW5jb21wYXRpYmxlIG1lZGl1bSIpIH0sCisvKiBEVEwgV1JTT00gQUUgKi97U1NUKDB4MzAsIDB4MDcsIFNTX1JERUYsCisJCQkiQ2xlYW5pbmcgZmFpbHVyZSIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4MzAsIDB4MDgsIFNTX1JERUYsCisJCQkiQ2Fubm90IHdyaXRlIC0gYXBwbGljYXRpb24gY29kZSBtaXNtYXRjaCIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4MzAsIDB4MDksIFNTX1JERUYsCisJCQkiQ3VycmVudCBzZXNzaW9uIG5vdCBmaXhhdGVkIGZvciBhcHBlbmQiKSB9LAorLyogRFQgIFdSIE8gICAgICove1NTVCgweDMxLCAweDAwLCBTU19SREVGLAorCQkJIk1lZGl1bSBmb3JtYXQgY29ycnVwdGVkIikgfSwKKy8qIEQgTCAgUiBPICAgICAqL3tTU1QoMHgzMSwgMHgwMSwgU1NfUkRFRiwKKwkJCSJGb3JtYXQgY29tbWFuZCBmYWlsZWQiKSB9LAorLyogRCAgIFcgIE8gICAgICove1NTVCgweDMyLCAweDAwLCBTU19SREVGLAorCQkJIk5vIGRlZmVjdCBzcGFyZSBsb2NhdGlvbiBhdmFpbGFibGUiKSB9LAorLyogRCAgIFcgIE8gICAgICove1NTVCgweDMyLCAweDAxLCBTU19SREVGLAorCQkJIkRlZmVjdCBsaXN0IHVwZGF0ZSBmYWlsdXJlIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHgzMywgMHgwMCwgU1NfUkRFRiwKKwkJCSJUYXBlIGxlbmd0aCBlcnJvciIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MzQsIDB4MDAsIFNTX1JERUYsCisJCQkiRW5jbG9zdXJlIGZhaWx1cmUiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDM1LCAweDAwLCBTU19SREVGLAorCQkJIkVuY2xvc3VyZSBzZXJ2aWNlcyBmYWlsdXJlIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgzNSwgMHgwMSwgU1NfUkRFRiwKKwkJCSJVbnN1cHBvcnRlZCBlbmNsb3N1cmUgZnVuY3Rpb24iKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDM1LCAweDAyLCBTU19SREVGLAorCQkJIkVuY2xvc3VyZSBzZXJ2aWNlcyB1bmF2YWlsYWJsZSIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MzUsIDB4MDMsIFNTX1JERUYsCisJCQkiRW5jbG9zdXJlIHNlcnZpY2VzIHRyYW5zZmVyIGZhaWx1cmUiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDM1LCAweDA0LCBTU19SREVGLAorCQkJIkVuY2xvc3VyZSBzZXJ2aWNlcyB0cmFuc2ZlciByZWZ1c2VkIikgfSwKKy8qICAgTCAgICAgICAgICAqL3tTU1QoMHgzNiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJSaWJib24sIGluaywgb3IgdG9uZXIgZmFpbHVyZSIpIH0sCisvKiBEVEwgV1JTT01DQUUgKi97U1NUKDB4MzcsIDB4MDAsIFNTX1JERUYsCisJCQkiUm91bmRlZCBwYXJhbWV0ZXIiKSB9LAorLyogRFRMIFdSU09NQ0FFICove1NTVCgweDM5LCAweDAwLCBTU19SREVGLAorCQkJIlNhdmluZyBwYXJhbWV0ZXJzIG5vdCBzdXBwb3J0ZWQiKSB9LAorLyogRFRMIFdSU09NICAgICove1NTVCgweDNBLCAweDAwLCBTU19OT1AsCisJCQkiTWVkaXVtIG5vdCBwcmVzZW50IikgfSwKKy8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzQSwgMHgwMSwgU1NfTk9QLAorCQkJIk1lZGl1bSBub3QgcHJlc2VudCAtIHRyYXkgY2xvc2VkIikgfSwKKy8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzQSwgMHgwMSwgU1NfTk9QLAorCQkJIk1lZGl1bSBub3QgcHJlc2VudCAtIHRyYXkgb3BlbiIpIH0sCisvKiBEVCAgV1IgT00gICAgKi97U1NUKDB4M0EsIDB4MDMsIFNTX05PUCwKKwkJCSJNZWRpdW0gbm90IHByZXNlbnQgLSBMb2FkYWJsZSIpIH0sCisvKiBEVCAgV1IgT00gICAgKi97U1NUKDB4M0EsIDB4MDQsIFNTX05PUCwKKwkJCSJNZWRpdW0gbm90IHByZXNlbnQgLSBtZWRpdW0gYXV4aWxpYXJ5ICIKKwkJCSJtZW1vcnkgYWNjZXNzaWJsZSIpIH0sCisvKiBEVCAgV1IgT00gICAgKi97U1NUKDB4M0EsIDB4RkYsIFNTX05PUCwgTlVMTCkgfSwvKiBSYW5nZSAweDA1LT4weEZGICovCisvKiAgVEwgICAgICAgICAgKi97U1NUKDB4M0IsIDB4MDAsIFNTX1JERUYsCisJCQkiU2VxdWVudGlhbCBwb3NpdGlvbmluZyBlcnJvciIpIH0sCisvKiAgVCAgICAgICAgICAgKi97U1NUKDB4M0IsIDB4MDEsIFNTX1JERUYsCisJCQkiVGFwZSBwb3NpdGlvbiBlcnJvciBhdCBiZWdpbm5pbmctb2YtbWVkaXVtIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHgzQiwgMHgwMiwgU1NfUkRFRiwKKwkJCSJUYXBlIHBvc2l0aW9uIGVycm9yIGF0IGVuZC1vZi1tZWRpdW0iKSB9LAorLyogICBMICAgICAgICAgICove1NTVCgweDNCLCAweDAzLCBTU19SREVGLAorCQkJIlRhcGUgb3IgZWxlY3Ryb25pYyB2ZXJ0aWNhbCBmb3JtcyB1bml0IG5vdCByZWFkeSIpIH0sCisvKiAgIEwgICAgICAgICAgKi97U1NUKDB4M0IsIDB4MDQsIFNTX1JERUYsCisJCQkiU2xldyBmYWlsdXJlIikgfSwKKy8qICAgTCAgICAgICAgICAqL3tTU1QoMHgzQiwgMHgwNSwgU1NfUkRFRiwKKwkJCSJQYXBlciBqYW0iKSB9LAorLyogICBMICAgICAgICAgICove1NTVCgweDNCLCAweDA2LCBTU19SREVGLAorCQkJIkZhaWxlZCB0byBzZW5zZSB0b3Atb2YtZm9ybSIpIH0sCisvKiAgIEwgICAgICAgICAgKi97U1NUKDB4M0IsIDB4MDcsIFNTX1JERUYsCisJCQkiRmFpbGVkIHRvIHNlbnNlIGJvdHRvbS1vZi1mb3JtIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHgzQiwgMHgwOCwgU1NfUkRFRiwKKwkJCSJSZXBvc2l0aW9uIGVycm9yIikgfSwKKy8qICAgICAgIFMgICAgICAqL3tTU1QoMHgzQiwgMHgwOSwgU1NfUkRFRiwKKwkJCSJSZWFkIHBhc3QgZW5kIG9mIG1lZGl1bSIpIH0sCisvKiAgICAgICBTICAgICAgKi97U1NUKDB4M0IsIDB4MEEsIFNTX1JERUYsCisJCQkiUmVhZCBwYXN0IGJlZ2lubmluZyBvZiBtZWRpdW0iKSB9LAorLyogICAgICAgUyAgICAgICove1NTVCgweDNCLCAweDBCLCBTU19SREVGLAorCQkJIlBvc2l0aW9uIHBhc3QgZW5kIG9mIG1lZGl1bSIpIH0sCisvKiAgVCAgICBTICAgICAgKi97U1NUKDB4M0IsIDB4MEMsIFNTX1JERUYsCisJCQkiUG9zaXRpb24gcGFzdCBiZWdpbm5pbmcgb2YgbWVkaXVtIikgfSwKKy8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzQiwgMHgwRCwgU1NfRkFUQUx8RU5PU1BDLAorCQkJIk1lZGl1bSBkZXN0aW5hdGlvbiBlbGVtZW50IGZ1bGwiKSB9LAorLyogRFQgIFdSIE9NICAgICove1NTVCgweDNCLCAweDBFLCBTU19SREVGLAorCQkJIk1lZGl1bSBzb3VyY2UgZWxlbWVudCBlbXB0eSIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4M0IsIDB4MEYsIFNTX1JERUYsCisJCQkiRW5kIG9mIG1lZGl1bSByZWFjaGVkIikgfSwKKy8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzQiwgMHgxMSwgU1NfUkRFRiwKKwkJCSJNZWRpdW0gbWFnYXppbmUgbm90IGFjY2Vzc2libGUiKSB9LAorLyogRFQgIFdSIE9NICAgICove1NTVCgweDNCLCAweDEyLCBTU19SREVGLAorCQkJIk1lZGl1bSBtYWdhemluZSByZW1vdmVkIikgfSwKKy8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzQiwgMHgxMywgU1NfUkRFRiwKKwkJCSJNZWRpdW0gbWFnYXppbmUgaW5zZXJ0ZWQiKSB9LAorLyogRFQgIFdSIE9NICAgICove1NTVCgweDNCLCAweDE0LCBTU19SREVGLAorCQkJIk1lZGl1bSBtYWdhemluZSBsb2NrZWQiKSB9LAorLyogRFQgIFdSIE9NICAgICove1NTVCgweDNCLCAweDE1LCBTU19SREVGLAorCQkJIk1lZGl1bSBtYWdhemluZSB1bmxvY2tlZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4M0QsIDB4MDAsIFNTX1JERUYsCisJCQkiSW52YWxpZCBiaXRzIGluIGlkZW50aWZ5IG1lc3NhZ2UiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDNFLCAweDAwLCBTU19SREVGLAorCQkJIkxvZ2ljYWwgdW5pdCBoYXMgbm90IHNlbGYtY29uZmlndXJlZCB5ZXQiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDNFLCAweDAxLCBTU19SREVGLAorCQkJIkxvZ2ljYWwgdW5pdCBmYWlsdXJlIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgzRSwgMHgwMiwgU1NfUkRFRiwKKwkJCSJUaW1lb3V0IG9uIGxvZ2ljYWwgdW5pdCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4M0YsIDB4MDAsIFNTX1JERUYsCisJCQkiVGFyZ2V0IG9wZXJhdGluZyBjb25kaXRpb25zIGhhdmUgY2hhbmdlZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4M0YsIDB4MDEsIFNTX1JERUYsCisJCQkiTWljcm9jb2RlIGhhcyBiZWVuIGNoYW5nZWQiKSB9LAorLyogRFRMUFdSU09NQyAgICove1NTVCgweDNGLCAweDAyLCBTU19SREVGLAorCQkJIkNoYW5nZWQgb3BlcmF0aW5nIGRlZmluaXRpb24iKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDNGLCAweDAzLCBTU19JTlFfUkVGUkVTSHxTU1FfREVDUkVNRU5UX0NPVU5ULAorCQkJIklucXVpcnkgZGF0YSBoYXMgY2hhbmdlZCIpIH0sCisvKiBEVCAgV1IgT01DQUUgKi97U1NUKDB4M0YsIDB4MDQsIFNTX1JERUYsCisJCQkiQ29tcG9uZW50IGRldmljZSBhdHRhY2hlZCIpIH0sCisvKiBEVCAgV1IgT01DQUUgKi97U1NUKDB4M0YsIDB4MDUsIFNTX1JERUYsCisJCQkiRGV2aWNlIGlkZW50aWZpZXIgY2hhbmdlZCIpIH0sCisvKiBEVCAgV1IgT01DQUUgKi97U1NUKDB4M0YsIDB4MDYsIFNTX1JERUYsCisJCQkiUmVkdW5kYW5jeSBncm91cCBjcmVhdGVkIG9yIG1vZGlmaWVkIikgfSwKKy8qIERUICBXUiBPTUNBRSAqL3tTU1QoMHgzRiwgMHgwNywgU1NfUkRFRiwKKwkJCSJSZWR1bmRhbmN5IGdyb3VwIGRlbGV0ZWQiKSB9LAorLyogRFQgIFdSIE9NQ0FFICove1NTVCgweDNGLCAweDA4LCBTU19SREVGLAorCQkJIlNwYXJlIGNyZWF0ZWQgb3IgbW9kaWZpZWQiKSB9LAorLyogRFQgIFdSIE9NQ0FFICove1NTVCgweDNGLCAweDA5LCBTU19SREVGLAorCQkJIlNwYXJlIGRlbGV0ZWQiKSB9LAorLyogRFQgIFdSIE9NQ0FFICove1NTVCgweDNGLCAweDBBLCBTU19SREVGLAorCQkJIlZvbHVtZSBzZXQgY3JlYXRlZCBvciBtb2RpZmllZCIpIH0sCisvKiBEVCAgV1IgT01DQUUgKi97U1NUKDB4M0YsIDB4MEIsIFNTX1JERUYsCisJCQkiVm9sdW1lIHNldCBkZWxldGVkIikgfSwKKy8qIERUICBXUiBPTUNBRSAqL3tTU1QoMHgzRiwgMHgwQywgU1NfUkRFRiwKKwkJCSJWb2x1bWUgc2V0IGRlYXNzaWduZWQiKSB9LAorLyogRFQgIFdSIE9NQ0FFICove1NTVCgweDNGLCAweDBELCBTU19SREVGLAorCQkJIlZvbHVtZSBzZXQgcmVhc3NpZ25lZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4M0YsIDB4MEUsIFNTX1JERUYsCisJCQkiUmVwb3J0ZWQgbHVucyBkYXRhIGhhcyBjaGFuZ2VkIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgzRiwgMHgwRiwgU1NfUkVUUll8U1NRX0RFQ1JFTUVOVF9DT1VOVAorCQkJCSB8IFNTUV9ERUxBWV9SQU5ET018RUJVU1ksCisJCQkiRWNobyBidWZmZXIgb3ZlcndyaXR0ZW4iKSB9LAorLyogRFQgIFdSIE9NICAgQiove1NTVCgweDNGLCAweDBGLCBTU19SREVGLCAiTWVkaXVtIExvYWRhYmxlIikgfSwKKy8qIERUICBXUiBPTSAgIEIqL3tTU1QoMHgzRiwgMHgwRiwgU1NfUkRFRiwKKwkJCSJNZWRpdW0gYXV4aWxpYXJ5IG1lbW9yeSBhY2Nlc3NpYmxlIikgfSwKKy8qIEQgICAgICAgICAgICAqL3tTU1QoMHg0MCwgMHgwMCwgU1NfUkRFRiwKKwkJCSJSYW0gZmFpbHVyZSIpIH0sIC8qIGRlcHJlY2F0ZWQgLSB1c2UgNDAgTk4gaW5zdGVhZCAqLworLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQwLCAweDgwLCBTU19SREVGLAorCQkJIkRpYWdub3N0aWMgZmFpbHVyZTogQVNDUSA9IENvbXBvbmVudCBJRCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NDAsIDB4RkYsIFNTX1JERUZ8U1NRX1JBTkdFLAorCQkJTlVMTCkgfSwvKiBSYW5nZSAweDgwLT4weEZGICovCisvKiBEICAgICAgICAgICAgKi97U1NUKDB4NDEsIDB4MDAsIFNTX1JERUYsCisJCQkiRGF0YSBwYXRoIGZhaWx1cmUiKSB9LCAvKiBkZXByZWNhdGVkIC0gdXNlIDQwIE5OIGluc3RlYWQgKi8KKy8qIEQgICAgICAgICAgICAqL3tTU1QoMHg0MiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJQb3dlci1vbiBvciBzZWxmLXRlc3QgZmFpbHVyZSIpIH0sIC8qIGRlcHJlY2F0ZWQgLSB1c2UgNDAgTk4gaW5zdGVhZCAqLworLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQzLCAweDAwLCBTU19SREVGLAorCQkJIk1lc3NhZ2UgZXJyb3IiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ0LCAweDAwLCBTU19SREVGLAorCQkJIkludGVybmFsIHRhcmdldCBmYWlsdXJlIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0NSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJTZWxlY3Qgb3IgcmVzZWxlY3QgZmFpbHVyZSIpIH0sCisvKiBEVExQV1JTT01DICAgKi97U1NUKDB4NDYsIDB4MDAsIFNTX1JERUYsCisJCQkiVW5zdWNjZXNzZnVsIHNvZnQgcmVzZXQiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ3LCAweDAwLCBTU19SREVGfFNTUV9GQUxMQkFDSywKKwkJCSJTQ1NJIHBhcml0eSBlcnJvciIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NDcsIDB4MDEsIFNTX1JERUZ8U1NRX0ZBTExCQUNLLAorCQkJIkRhdGEgUGhhc2UgQ1JDIGVycm9yIGRldGVjdGVkIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0NywgMHgwMiwgU1NfUkRFRnxTU1FfRkFMTEJBQ0ssCisJCQkiU0NTSSBwYXJpdHkgZXJyb3IgZGV0ZWN0ZWQgZHVyaW5nIFNUIGRhdGEgcGhhc2UiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ3LCAweDAzLCBTU19SREVGfFNTUV9GQUxMQkFDSywKKwkJCSJJbmZvcm1hdGlvbiBVbml0IGl1Q1JDIGVycm9yIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0NywgMHgwNCwgU1NfUkRFRnxTU1FfRkFMTEJBQ0ssCisJCQkiQXN5bmNocm9ub3VzIGluZm9ybWF0aW9uIHByb3RlY3Rpb24gZXJyb3IgZGV0ZWN0ZWQiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ3LCAweDA1LCBTU19SREVGfFNTUV9GQUxMQkFDSywKKwkJCSJQcm90b2NvbCBzZXJ2ZXIgQ1JDIGVycm9yIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0OCwgMHgwMCwgU1NfUkRFRnxTU1FfRkFMTEJBQ0ssCisJCQkiSW5pdGlhdG9yIGRldGVjdGVkIGVycm9yIG1lc3NhZ2UgcmVjZWl2ZWQiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ5LCAweDAwLCBTU19SREVGLAorCQkJIkludmFsaWQgbWVzc2FnZSBlcnJvciIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NEEsIDB4MDAsIFNTX1JERUYsCisJCQkiQ29tbWFuZCBwaGFzZSBlcnJvciIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NEIsIDB4MDAsIFNTX1JERUYsCisJCQkiRGF0YSBwaGFzZSBlcnJvciIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NEMsIDB4MDAsIFNTX1JERUYsCisJCQkiTG9naWNhbCB1bml0IGZhaWxlZCBzZWxmLWNvbmZpZ3VyYXRpb24iKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDRELCAweDAwLCBTU19SREVGLAorCQkJIlRhZ2dlZCBvdmVybGFwcGVkIGNvbW1hbmRzOiBBU0NRID0gUXVldWUgdGFnIElEIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0RCwgMHhGRiwgU1NfUkRFRnxTU1FfUkFOR0UsCisJCQlOVUxMKX0sIC8qIFJhbmdlIDB4MDAtPjB4RkYgKi8KKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0RSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJPdmVybGFwcGVkIGNvbW1hbmRzIGF0dGVtcHRlZCIpIH0sCisvKiAgVCAgICAgICAgICAgKi97U1NUKDB4NTAsIDB4MDAsIFNTX1JERUYsCisJCQkiV3JpdGUgYXBwZW5kIGVycm9yIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHg1MCwgMHgwMSwgU1NfUkRFRiwKKwkJCSJXcml0ZSBhcHBlbmQgcG9zaXRpb24gZXJyb3IiKSB9LAorLyogIFQgICAgICAgICAgICove1NTVCgweDUwLCAweDAyLCBTU19SREVGLAorCQkJIlBvc2l0aW9uIGVycm9yIHJlbGF0ZWQgdG8gdGltaW5nIikgfSwKKy8qICBUICAgICBPICAgICAqL3tTU1QoMHg1MSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJFcmFzZSBmYWlsdXJlIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHg1MiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJDYXJ0cmlkZ2UgZmF1bHQiKSB9LAorLyogRFRMIFdSU09NICAgICove1NTVCgweDUzLCAweDAwLCBTU19SREVGLAorCQkJIk1lZGlhIGxvYWQgb3IgZWplY3QgZmFpbGVkIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHg1MywgMHgwMSwgU1NfUkRFRiwKKwkJCSJVbmxvYWQgdGFwZSBmYWlsdXJlIikgfSwKKy8qIERUICBXUiBPTSAgICAqL3tTU1QoMHg1MywgMHgwMiwgU1NfUkRFRiwKKwkJCSJNZWRpdW0gcmVtb3ZhbCBwcmV2ZW50ZWQiKSB9LAorLyogICAgUCAgICAgICAgICove1NTVCgweDU0LCAweDAwLCBTU19SREVGLAorCQkJIlNjc2kgdG8gaG9zdCBzeXN0ZW0gaW50ZXJmYWNlIGZhaWx1cmUiKSB9LAorLyogICAgUCAgICAgICAgICove1NTVCgweDU1LCAweDAwLCBTU19SREVGLAorCQkJIlN5c3RlbSByZXNvdXJjZSBmYWlsdXJlIikgfSwKKy8qIEQgICAgICBPICAgICAqL3tTU1QoMHg1NSwgMHgwMSwgU1NfRkFUQUx8RU5PU1BDLAorCQkJIlN5c3RlbSBidWZmZXIgZnVsbCIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4NTcsIDB4MDAsIFNTX1JERUYsCisJCQkiVW5hYmxlIHRvIHJlY292ZXIgdGFibGUtb2YtY29udGVudHMiKSB9LAorLyogICAgICAgIE8gICAgICove1NTVCgweDU4LCAweDAwLCBTU19SREVGLAorCQkJIkdlbmVyYXRpb24gZG9lcyBub3QgZXhpc3QiKSB9LAorLyogICAgICAgIE8gICAgICove1NTVCgweDU5LCAweDAwLCBTU19SREVGLAorCQkJIlVwZGF0ZWQgYmxvY2sgcmVhZCIpIH0sCisvKiBEVExQV1JTT00gICAgKi97U1NUKDB4NUEsIDB4MDAsIFNTX1JERUYsCisJCQkiT3BlcmF0b3IgcmVxdWVzdCBvciBzdGF0ZSBjaGFuZ2UgaW5wdXQiKSB9LAorLyogRFQgIFdSIE9NICAgICove1NTVCgweDVBLCAweDAxLCBTU19SREVGLAorCQkJIk9wZXJhdG9yIG1lZGl1bSByZW1vdmFsIHJlcXVlc3QiKSB9LAorLyogRFQgIFcgIE8gICAgICove1NTVCgweDVBLCAweDAyLCBTU19SREVGLAorCQkJIk9wZXJhdG9yIHNlbGVjdGVkIHdyaXRlIHByb3RlY3QiKSB9LAorLyogRFQgIFcgIE8gICAgICove1NTVCgweDVBLCAweDAzLCBTU19SREVGLAorCQkJIk9wZXJhdG9yIHNlbGVjdGVkIHdyaXRlIHBlcm1pdCIpIH0sCisvKiBEVExQV1JTT00gICAgKi97U1NUKDB4NUIsIDB4MDAsIFNTX1JERUYsCisJCQkiTG9nIGV4Y2VwdGlvbiIpIH0sCisvKiBEVExQV1JTT00gICAgKi97U1NUKDB4NUIsIDB4MDEsIFNTX1JERUYsCisJCQkiVGhyZXNob2xkIGNvbmRpdGlvbiBtZXQiKSB9LAorLyogRFRMUFdSU09NICAgICove1NTVCgweDVCLCAweDAyLCBTU19SREVGLAorCQkJIkxvZyBjb3VudGVyIGF0IG1heGltdW0iKSB9LAorLyogRFRMUFdSU09NICAgICove1NTVCgweDVCLCAweDAzLCBTU19SREVGLAorCQkJIkxvZyBsaXN0IGNvZGVzIGV4aGF1c3RlZCIpIH0sCisvKiBEICAgICAgTyAgICAgKi97U1NUKDB4NUMsIDB4MDAsIFNTX1JERUYsCisJCQkiUlBMIHN0YXR1cyBjaGFuZ2UiKSB9LAorLyogRCAgICAgIE8gICAgICove1NTVCgweDVDLCAweDAxLCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAorCQkJIlNwaW5kbGVzIHN5bmNocm9uaXplZCIpIH0sCisvKiBEICAgICAgTyAgICAgKi97U1NUKDB4NUMsIDB4MDIsIFNTX1JERUYsCisJCQkiU3BpbmRsZXMgbm90IHN5bmNocm9uaXplZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NUQsIDB4MDAsIFNTX1JERUYsCisJCQkiRmFpbHVyZSBwcmVkaWN0aW9uIHRocmVzaG9sZCBleGNlZWRlZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NUQsIDB4RkYsIFNTX1JERUYsCisJCQkiRmFpbHVyZSBwcmVkaWN0aW9uIHRocmVzaG9sZCBleGNlZWRlZCAoZmFsc2UpIikgfSwKKy8qIERUTFBXUlNPIENBICAqL3tTU1QoMHg1RSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJMb3cgcG93ZXIgY29uZGl0aW9uIG9uIikgfSwKKy8qIERUTFBXUlNPIENBICAqL3tTU1QoMHg1RSwgMHgwMSwgU1NfUkRFRiwKKwkJCSJJZGxlIGNvbmRpdGlvbiBhY3RpdmF0ZWQgYnkgdGltZXIiKSB9LAorLyogRFRMUFdSU08gQ0EgICove1NTVCgweDVFLCAweDAyLCBTU19SREVGLAorCQkJIlN0YW5kYnkgY29uZGl0aW9uIGFjdGl2YXRlZCBieSB0aW1lciIpIH0sCisvKiBEVExQV1JTTyBDQSAgKi97U1NUKDB4NUUsIDB4MDMsIFNTX1JERUYsCisJCQkiSWRsZSBjb25kaXRpb24gYWN0aXZhdGVkIGJ5IGNvbW1hbmQiKSB9LAorLyogRFRMUFdSU08gQ0EgICove1NTVCgweDVFLCAweDA0LCBTU19SREVGLAorCQkJIlN0YW5kYnkgY29uZGl0aW9uIGFjdGl2YXRlZCBieSBjb21tYW5kIikgfSwKKy8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2MCwgMHgwMCwgU1NfUkRFRiwKKwkJCSJMYW1wIGZhaWx1cmUiKSB9LAorLyogICAgICAgUyAgICAgICove1NTVCgweDYxLCAweDAwLCBTU19SREVGLAorCQkJIlZpZGVvIGFjcXVpc2l0aW9uIGVycm9yIikgfSwKKy8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2MSwgMHgwMSwgU1NfUkRFRiwKKwkJCSJVbmFibGUgdG8gYWNxdWlyZSB2aWRlbyIpIH0sCisvKiAgICAgICBTICAgICAgKi97U1NUKDB4NjEsIDB4MDIsIFNTX1JERUYsCisJCQkiT3V0IG9mIGZvY3VzIikgfSwKKy8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2MiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJTY2FuIGhlYWQgcG9zaXRpb25pbmcgZXJyb3IiKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDYzLCAweDAwLCBTU19SREVGLAorCQkJIkVuZCBvZiB1c2VyIGFyZWEgZW5jb3VudGVyZWQgb24gdGhpcyB0cmFjayIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4NjMsIDB4MDEsIFNTX0ZBVEFMfEVOT1NQQywKKwkJCSJQYWNrZXQgZG9lcyBub3QgZml0IGluIGF2YWlsYWJsZSBzcGFjZSIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4NjQsIDB4MDAsIFNTX1JERUYsCisJCQkiSWxsZWdhbCBtb2RlIGZvciB0aGlzIHRyYWNrIikgfSwKKy8qICAgICAgUiAgICAgICAqL3tTU1QoMHg2NCwgMHgwMSwgU1NfUkRFRiwKKwkJCSJJbnZhbGlkIHBhY2tldCBzaXplIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg2NSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJWb2x0YWdlIGZhdWx0IikgfSwKKy8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2NiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJBdXRvbWF0aWMgZG9jdW1lbnQgZmVlZGVyIGNvdmVyIHVwIikgfSwKKy8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2NiwgMHgwMSwgU1NfUkRFRiwKKwkJCSJBdXRvbWF0aWMgZG9jdW1lbnQgZmVlZGVyIGxpZnQgdXAiKSB9LAorLyogICAgICAgUyAgICAgICove1NTVCgweDY2LCAweDAyLCBTU19SREVGLAorCQkJIkRvY3VtZW50IGphbSBpbiBhdXRvbWF0aWMgZG9jdW1lbnQgZmVlZGVyIikgfSwKKy8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2NiwgMHgwMywgU1NfUkRFRiwKKwkJCSJEb2N1bWVudCBtaXNzIGZlZWQgYXV0b21hdGljIGluIGRvY3VtZW50IGZlZWRlciIpIH0sCisvKiAgICAgICAgICAgQSAgKi97U1NUKDB4NjcsIDB4MDAsIFNTX1JERUYsCisJCQkiQ29uZmlndXJhdGlvbiBmYWlsdXJlIikgfSwKKy8qICAgICAgICAgICBBICAqL3tTU1QoMHg2NywgMHgwMSwgU1NfUkRFRiwKKwkJCSJDb25maWd1cmF0aW9uIG9mIGluY2FwYWJsZSBsb2dpY2FsIHVuaXRzIGZhaWxlZCIpIH0sCisvKiAgICAgICAgICAgQSAgKi97U1NUKDB4NjcsIDB4MDIsIFNTX1JERUYsCisJCQkiQWRkIGxvZ2ljYWwgdW5pdCBmYWlsZWQiKSB9LAorLyogICAgICAgICAgIEEgICove1NTVCgweDY3LCAweDAzLCBTU19SREVGLAorCQkJIk1vZGlmaWNhdGlvbiBvZiBsb2dpY2FsIHVuaXQgZmFpbGVkIikgfSwKKy8qICAgICAgICAgICBBICAqL3tTU1QoMHg2NywgMHgwNCwgU1NfUkRFRiwKKwkJCSJFeGNoYW5nZSBvZiBsb2dpY2FsIHVuaXQgZmFpbGVkIikgfSwKKy8qICAgICAgICAgICBBICAqL3tTU1QoMHg2NywgMHgwNSwgU1NfUkRFRiwKKwkJCSJSZW1vdmUgb2YgbG9naWNhbCB1bml0IGZhaWxlZCIpIH0sCisvKiAgICAgICAgICAgQSAgKi97U1NUKDB4NjcsIDB4MDYsIFNTX1JERUYsCisJCQkiQXR0YWNobWVudCBvZiBsb2dpY2FsIHVuaXQgZmFpbGVkIikgfSwKKy8qICAgICAgICAgICBBICAqL3tTU1QoMHg2NywgMHgwNywgU1NfUkRFRiwKKwkJCSJDcmVhdGlvbiBvZiBsb2dpY2FsIHVuaXQgZmFpbGVkIikgfSwKKy8qICAgICAgICAgICBBICAqL3tTU1QoMHg2OCwgMHgwMCwgU1NfUkRFRiwKKwkJCSJMb2dpY2FsIHVuaXQgbm90IGNvbmZpZ3VyZWQiKSB9LAorLyogICAgICAgICAgIEEgICove1NTVCgweDY5LCAweDAwLCBTU19SREVGLAorCQkJIkRhdGEgbG9zcyBvbiBsb2dpY2FsIHVuaXQiKSB9LAorLyogICAgICAgICAgIEEgICove1NTVCgweDY5LCAweDAxLCBTU19SREVGLAorCQkJIk11bHRpcGxlIGxvZ2ljYWwgdW5pdCBmYWlsdXJlcyIpIH0sCisvKiAgICAgICAgICAgQSAgKi97U1NUKDB4NjksIDB4MDIsIFNTX1JERUYsCisJCQkiUGFyaXR5L2RhdGEgbWlzbWF0Y2giKSB9LAorLyogICAgICAgICAgIEEgICove1NTVCgweDZBLCAweDAwLCBTU19SREVGLAorCQkJIkluZm9ybWF0aW9uYWwsIHJlZmVyIHRvIGxvZyIpIH0sCisvKiAgICAgICAgICAgQSAgKi97U1NUKDB4NkIsIDB4MDAsIFNTX1JERUYsCisJCQkiU3RhdGUgY2hhbmdlIGhhcyBvY2N1cnJlZCIpIH0sCisvKiAgICAgICAgICAgQSAgKi97U1NUKDB4NkIsIDB4MDEsIFNTX1JERUYsCisJCQkiUmVkdW5kYW5jeSBsZXZlbCBnb3QgYmV0dGVyIikgfSwKKy8qICAgICAgICAgICBBICAqL3tTU1QoMHg2QiwgMHgwMiwgU1NfUkRFRiwKKwkJCSJSZWR1bmRhbmN5IGxldmVsIGdvdCB3b3JzZSIpIH0sCisvKiAgICAgICAgICAgQSAgKi97U1NUKDB4NkMsIDB4MDAsIFNTX1JERUYsCisJCQkiUmVidWlsZCBmYWlsdXJlIG9jY3VycmVkIikgfSwKKy8qICAgICAgICAgICBBICAqL3tTU1QoMHg2RCwgMHgwMCwgU1NfUkRFRiwKKwkJCSJSZWNhbGN1bGF0ZSBmYWlsdXJlIG9jY3VycmVkIikgfSwKKy8qICAgICAgICAgICBBICAqL3tTU1QoMHg2RSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJDb21tYW5kIHRvIGxvZ2ljYWwgdW5pdCBmYWlsZWQiKSB9LAorLyogIFQgICAgICAgICAgICove1NTVCgweDcwLCAweDAwLCBTU19SREVGLAorCQkJIkRlY29tcHJlc3Npb24gZXhjZXB0aW9uIHNob3J0OiBBU0NRID0gQWxnb3JpdGhtIElEIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHg3MCwgMHhGRiwgU1NfUkRFRnxTU1FfUkFOR0UsCisJCQlOVUxMKSB9LCAvKiBSYW5nZSAweDAwIC0+IDB4RkYgKi8KKy8qICBUICAgICAgICAgICAqL3tTU1QoMHg3MSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJEZWNvbXByZXNzaW9uIGV4Y2VwdGlvbiBsb25nOiBBU0NRID0gQWxnb3JpdGhtIElEIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHg3MSwgMHhGRiwgU1NfUkRFRnxTU1FfUkFOR0UsCisJCQlOVUxMKSB9LCAvKiBSYW5nZSAweDAwIC0+IDB4RkYgKi8JCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4NzIsIDB4MDAsIFNTX1JERUYsCisJCQkiU2Vzc2lvbiBmaXhhdGlvbiBlcnJvciIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4NzIsIDB4MDEsIFNTX1JERUYsCisJCQkiU2Vzc2lvbiBmaXhhdGlvbiBlcnJvciB3cml0aW5nIGxlYWQtaW4iKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDcyLCAweDAyLCBTU19SREVGLAorCQkJIlNlc3Npb24gZml4YXRpb24gZXJyb3Igd3JpdGluZyBsZWFkLW91dCIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4NzIsIDB4MDMsIFNTX1JERUYsCisJCQkiU2Vzc2lvbiBmaXhhdGlvbiBlcnJvciAtIGluY29tcGxldGUgdHJhY2sgaW4gc2Vzc2lvbiIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4NzIsIDB4MDQsIFNTX1JERUYsCisJCQkiRW1wdHkgb3IgcGFydGlhbGx5IHdyaXR0ZW4gcmVzZXJ2ZWQgdHJhY2siKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDczLCAweDAwLCBTU19SREVGLAorCQkJIkNEIGNvbnRyb2wgZXJyb3IiKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDczLCAweDAxLCBTU19SREVGLAorCQkJIlBvd2VyIGNhbGlicmF0aW9uIGFyZWEgYWxtb3N0IGZ1bGwiKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDczLCAweDAyLCBTU19GQVRBTHxFTk9TUEMsCisJCQkiUG93ZXIgY2FsaWJyYXRpb24gYXJlYSBpcyBmdWxsIikgfSwKKy8qICAgICAgUiAgICAgICAqL3tTU1QoMHg3MywgMHgwMywgU1NfUkRFRiwKKwkJCSJQb3dlciBjYWxpYnJhdGlvbiBhcmVhIGVycm9yIikgfSwKKy8qICAgICAgUiAgICAgICAqL3tTU1QoMHg3MywgMHgwNCwgU1NfUkRFRiwKKwkJCSJQcm9ncmFtIG1lbW9yeSBhcmVhIHVwZGF0ZSBmYWlsdXJlIikgfSwKKy8qICAgICAgUiAgICAgICAqL3tTU1QoMHg3MywgMHgwNSwgU1NfUkRFRiwKKwkJCSJwcm9ncmFtIG1lbW9yeSBhcmVhIGlzIGZ1bGwiKSB9Cit9OworCitzdGF0aWMgY29uc3QgaW50IGFzY190YWJsZV9zaXplID0gc2l6ZW9mKGFzY190YWJsZSkvc2l6ZW9mKGFzY190YWJsZVswXSk7CisKK3N0cnVjdCBhc2Nfa2V5Cit7CisJaW50IGFzYzsKKwlpbnQgYXNjcTsKK307CisKK3N0YXRpYyBpbnQKK2FzY2VudHJ5Y29tcChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKm1lbWJlcikKK3sKKwlpbnQgYXNjOworCWludCBhc2NxOworCWNvbnN0IHN0cnVjdCBhc2NfdGFibGVfZW50cnkgKnRhYmxlX2VudHJ5OworCisJYXNjID0gKChjb25zdCBzdHJ1Y3QgYXNjX2tleSAqKWtleSktPmFzYzsKKwlhc2NxID0gKChjb25zdCBzdHJ1Y3QgYXNjX2tleSAqKWtleSktPmFzY3E7CisJdGFibGVfZW50cnkgPSAoY29uc3Qgc3RydWN0IGFzY190YWJsZV9lbnRyeSAqKW1lbWJlcjsKKworCWlmIChhc2MgPj0gdGFibGVfZW50cnktPmFzYykgeworCisJCWlmIChhc2MgPiB0YWJsZV9lbnRyeS0+YXNjKQorCQkJcmV0dXJuICgxKTsKKworCQlpZiAoYXNjcSA8PSB0YWJsZV9lbnRyeS0+YXNjcSkgeworCQkJLyogQ2hlY2sgZm9yIHJhbmdlcyAqLworCQkJaWYgKGFzY3EgPT0gdGFibGVfZW50cnktPmFzY3EKKwkJIAkgfHwgKCh0YWJsZV9lbnRyeS0+YWN0aW9uICYgU1NRX1JBTkdFKSAhPSAwCisJCSAgCSAgICYmIGFzY3EgPj0gKHRhYmxlX2VudHJ5IC0gMSktPmFzY3EpKQorCQkJCXJldHVybiAoMCk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlyZXR1cm4gKDEpOworCX0KKwlyZXR1cm4gKC0xKTsKK30KKworc3RhdGljIGludAorc2Vuc2VlbnRyeWNvbXAoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB2b2lkICptZW1iZXIpCit7CisJaW50IHNlbnNlX2tleTsKKwljb25zdCBzdHJ1Y3Qgc2Vuc2Vfa2V5X3RhYmxlX2VudHJ5ICp0YWJsZV9lbnRyeTsKKworCXNlbnNlX2tleSA9ICooKGNvbnN0IGludCAqKWtleSk7CisJdGFibGVfZW50cnkgPSAoY29uc3Qgc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeSAqKW1lbWJlcjsKKworCWlmIChzZW5zZV9rZXkgPj0gdGFibGVfZW50cnktPnNlbnNlX2tleSkgeworCQlpZiAoc2Vuc2Vfa2V5ID09IHRhYmxlX2VudHJ5LT5zZW5zZV9rZXkpCisJCQlyZXR1cm4gKDApOworCQlyZXR1cm4gKDEpOworCX0KKwlyZXR1cm4gKC0xKTsKK30KKworc3RhdGljIHZvaWQKK2ZldGNodGFibGVlbnRyaWVzKGludCBzZW5zZV9rZXksIGludCBhc2MsIGludCBhc2NxLAorCQkgIHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSAqaW5xX2RhdGEsCisJCSAgY29uc3Qgc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeSAqKnNlbnNlX2VudHJ5LAorCQkgIGNvbnN0IHN0cnVjdCBhc2NfdGFibGVfZW50cnkgKiphc2NfZW50cnkpCit7CisJdm9pZCAqbWF0Y2g7CisJY29uc3Qgc3RydWN0IGFzY190YWJsZV9lbnRyeSAqYXNjX3RhYmxlc1syXTsKKwljb25zdCBzdHJ1Y3Qgc2Vuc2Vfa2V5X3RhYmxlX2VudHJ5ICpzZW5zZV90YWJsZXNbMl07CisJc3RydWN0IGFzY19rZXkgYXNjX2FzY3E7CisJc2l6ZV90IGFzY190YWJsZXNfc2l6ZVsyXTsKKwlzaXplX3Qgc2Vuc2VfdGFibGVzX3NpemVbMl07CisJaW50IG51bV9hc2NfdGFibGVzOworCWludCBudW1fc2Vuc2VfdGFibGVzOworCWludCBpOworCisJLyogRGVmYXVsdCB0byBmYWlsdXJlICovCisJKnNlbnNlX2VudHJ5ID0gTlVMTDsKKwkqYXNjX2VudHJ5ID0gTlVMTDsKKwltYXRjaCA9IE5VTEw7CisJaWYgKGlucV9kYXRhICE9IE5VTEwpCisJCW1hdGNoID0gY2FtX3F1aXJrbWF0Y2goKHZvaWQgKilpbnFfZGF0YSwKKwkJCQkgICAgICAgKHZvaWQgKilzZW5zZV9xdWlya190YWJsZSwKKwkJCQkgICAgICAgc2Vuc2VfcXVpcmtfdGFibGVfc2l6ZSwKKwkJCQkgICAgICAgc2l6ZW9mKCpzZW5zZV9xdWlya190YWJsZSksCisJCQkJICAgICAgIGFpY19pbnF1aXJ5X21hdGNoKTsKKworCWlmIChtYXRjaCAhPSBOVUxMKSB7CisJCXN0cnVjdCBzY3NpX3NlbnNlX3F1aXJrX2VudHJ5ICpxdWlyazsKKworCQlxdWlyayA9IChzdHJ1Y3Qgc2NzaV9zZW5zZV9xdWlya19lbnRyeSAqKW1hdGNoOworCQlhc2NfdGFibGVzWzBdID0gcXVpcmstPmFzY19pbmZvOworCQlhc2NfdGFibGVzX3NpemVbMF0gPSBxdWlyay0+bnVtX2FzY3M7CisJCWFzY190YWJsZXNbMV0gPSBhc2NfdGFibGU7CisJCWFzY190YWJsZXNfc2l6ZVsxXSA9IGFzY190YWJsZV9zaXplOworCQludW1fYXNjX3RhYmxlcyA9IDI7CisJCXNlbnNlX3RhYmxlc1swXSA9IHF1aXJrLT5zZW5zZV9rZXlfaW5mbzsKKwkJc2Vuc2VfdGFibGVzX3NpemVbMF0gPSBxdWlyay0+bnVtX3NlbnNlX2tleXM7CisJCXNlbnNlX3RhYmxlc1sxXSA9IHNlbnNlX2tleV90YWJsZTsKKwkJc2Vuc2VfdGFibGVzX3NpemVbMV0gPSBzZW5zZV9rZXlfdGFibGVfc2l6ZTsKKwkJbnVtX3NlbnNlX3RhYmxlcyA9IDI7CisJfSBlbHNlIHsKKwkJYXNjX3RhYmxlc1swXSA9IGFzY190YWJsZTsKKwkJYXNjX3RhYmxlc19zaXplWzBdID0gYXNjX3RhYmxlX3NpemU7CisJCW51bV9hc2NfdGFibGVzID0gMTsKKwkJc2Vuc2VfdGFibGVzWzBdID0gc2Vuc2Vfa2V5X3RhYmxlOworCQlzZW5zZV90YWJsZXNfc2l6ZVswXSA9IHNlbnNlX2tleV90YWJsZV9zaXplOworCQludW1fc2Vuc2VfdGFibGVzID0gMTsKKwl9CisKKwlhc2NfYXNjcS5hc2MgPSBhc2M7CisJYXNjX2FzY3EuYXNjcSA9IGFzY3E7CisJZm9yIChpID0gMDsgaSA8IG51bV9hc2NfdGFibGVzOyBpKyspIHsKKwkJdm9pZCAqZm91bmRfZW50cnk7CisKKwkJZm91bmRfZW50cnkgPSBzY3NpYnNlYXJjaCgmYXNjX2FzY3EsIGFzY190YWJsZXNbaV0sCisJCQkJCSAgYXNjX3RhYmxlc19zaXplW2ldLAorCQkJCQkgIHNpemVvZigqKmFzY190YWJsZXMpLAorCQkJCQkgIGFzY2VudHJ5Y29tcCk7CisKKwkJaWYgKGZvdW5kX2VudHJ5KSB7CisJCQkqYXNjX2VudHJ5ID0gKHN0cnVjdCBhc2NfdGFibGVfZW50cnkgKilmb3VuZF9lbnRyeTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9zZW5zZV90YWJsZXM7IGkrKykgeworCQl2b2lkICpmb3VuZF9lbnRyeTsKKworCQlmb3VuZF9lbnRyeSA9IHNjc2lic2VhcmNoKCZzZW5zZV9rZXksIHNlbnNlX3RhYmxlc1tpXSwKKwkJCQkJICBzZW5zZV90YWJsZXNfc2l6ZVtpXSwKKwkJCQkJICBzaXplb2YoKipzZW5zZV90YWJsZXMpLAorCQkJCQkgIHNlbnNlZW50cnljb21wKTsKKworCQlpZiAoZm91bmRfZW50cnkpIHsKKwkJCSpzZW5zZV9lbnRyeSA9CisJCQkgICAgKHN0cnVjdCBzZW5zZV9rZXlfdGFibGVfZW50cnkgKilmb3VuZF9lbnRyeTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCAqCitzY3NpYnNlYXJjaChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKmJhc2UsIHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsCisJCSBpbnQgKCpjb21wYXIpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkKK3sKKwljb25zdCB2b2lkICplbnRyeTsKKwl1X2ludCBsOworCXVfaW50IHU7CisJdV9pbnQgbTsKKworCWwgPSAtMTsKKwl1ID0gbm1lbWI7CisJd2hpbGUgKGwgKyAxICE9IHUpIHsKKwkJbSA9IChsICsgdSkgLyAyOworCQllbnRyeSA9IGJhc2UgKyBtICogc2l6ZTsKKwkJaWYgKGNvbXBhcihrZXksIGVudHJ5KSA+IDApCisJCQlsID0gbTsKKwkJZWxzZQorCQkJdSA9IG07CisJfQorCisJZW50cnkgPSBiYXNlICsgdSAqIHNpemU7CisJaWYgKHUgPT0gbm1lbWIKKwkgfHwgY29tcGFyKGtleSwgZW50cnkpICE9IDApCisJCXJldHVybiAoTlVMTCk7CisKKwlyZXR1cm4gKCh2b2lkICopZW50cnkpOworfQorCisvKgorICogQ29tcGFyZSBzdHJpbmcgd2l0aCBwYXR0ZXJuLCByZXR1cm5pbmcgMCBvbiBtYXRjaC4KKyAqIFNob3J0IHBhdHRlcm4gbWF0Y2hlcyB0cmFpbGluZyBibGFua3MgaW4gbmFtZSwKKyAqIHdpbGRjYXJkICcqJyBpbiBwYXR0ZXJuIG1hdGNoZXMgcmVzdCBvZiBuYW1lLAorICogd2lsZGNhcmQgJz8nIG1hdGNoZXMgYSBzaW5nbGUgbm9uLXNwYWNlIGNoYXJhY3Rlci4KKyAqLworc3RhdGljIGludAorY2FtX3N0cm1hdGNoKGNvbnN0IHVpbnQ4X3QgKnN0ciwgY29uc3QgdWludDhfdCAqcGF0dGVybiwgaW50IHN0cl9sZW4pCit7CisKKwl3aGlsZSAoKnBhdHRlcm4gIT0gJ1wwJyYmIHN0cl9sZW4gPiAwKSB7ICAKKworCQlpZiAoKnBhdHRlcm4gPT0gJyonKSB7CisJCQlyZXR1cm4gKDApOworCQl9CisJCWlmICgoKnBhdHRlcm4gIT0gKnN0cikKKwkJICYmICgqcGF0dGVybiAhPSAnPycgfHwgKnN0ciA9PSAnICcpKSB7CisJCQlyZXR1cm4gKDEpOworCQl9CisJCXBhdHRlcm4rKzsKKwkJc3RyKys7CisJCXN0cl9sZW4tLTsKKwl9CisJd2hpbGUgKHN0cl9sZW4gPiAwICYmICpzdHIrKyA9PSAnICcpCisJCXN0cl9sZW4tLTsKKworCXJldHVybiAoc3RyX2xlbik7Cit9CisKK3N0YXRpYyBjYWRkcl90CitjYW1fcXVpcmttYXRjaChjYWRkcl90IHRhcmdldCwgY2FkZHJfdCBxdWlya190YWJsZSwgaW50IG51bV9lbnRyaWVzLAorCSAgICAgICBpbnQgZW50cnlfc2l6ZSwgY2FtX3F1aXJrbWF0Y2hfdCAqY29tcF9mdW5jKQoreworCWZvciAoOyBudW1fZW50cmllcyA+IDA7IG51bV9lbnRyaWVzLS0sIHF1aXJrX3RhYmxlICs9IGVudHJ5X3NpemUpIHsKKwkJaWYgKCgqY29tcF9mdW5jKSh0YXJnZXQsIHF1aXJrX3RhYmxlKSA9PSAwKQorCQkJcmV0dXJuIChxdWlya190YWJsZSk7CisJfQorCXJldHVybiAoTlVMTCk7Cit9CisKK3ZvaWQKK2FpY19zZW5zZV9kZXNjKGludCBzZW5zZV9rZXksIGludCBhc2MsIGludCBhc2NxLAorCSAgICAgICBzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKmlucV9kYXRhLAorCSAgICAgICBjb25zdCBjaGFyICoqc2Vuc2Vfa2V5X2Rlc2MsIGNvbnN0IGNoYXIgKiphc2NfZGVzYykKK3sKKwljb25zdCBzdHJ1Y3QgYXNjX3RhYmxlX2VudHJ5ICphc2NfZW50cnk7CisJY29uc3Qgc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeSAqc2Vuc2VfZW50cnk7CisKKwlmZXRjaHRhYmxlZW50cmllcyhzZW5zZV9rZXksIGFzYywgYXNjcSwKKwkJCSAgaW5xX2RhdGEsCisJCQkgICZzZW5zZV9lbnRyeSwKKwkJCSAgJmFzY19lbnRyeSk7CisKKwkqc2Vuc2Vfa2V5X2Rlc2MgPSBzZW5zZV9lbnRyeS0+ZGVzYzsKKworCWlmIChhc2NfZW50cnkgIT0gTlVMTCkKKwkJKmFzY19kZXNjID0gYXNjX2VudHJ5LT5kZXNjOworCWVsc2UgaWYgKGFzYyA+PSAweDgwICYmIGFzYyA8PSAweGZmKQorCQkqYXNjX2Rlc2MgPSAiVmVuZG9yIFNwZWNpZmljIEFTQyI7CisJZWxzZSBpZiAoYXNjcSA+PSAweDgwICYmIGFzY3EgPD0gMHhmZikKKwkJKmFzY19kZXNjID0gIlZlbmRvciBTcGVjaWZpYyBBU0NRIjsKKwllbHNlCisJCSphc2NfZGVzYyA9ICJSZXNlcnZlZCBBU0MvQVNDUSBwYWlyIjsKK30KKworLyoKKyAqIEdpdmVuIHNlbnNlIGFuZCBkZXZpY2UgdHlwZSBpbmZvcm1hdGlvbiwgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24uCisgKiBJZiB3ZSBkbyBub3QgdW5kZXJzdGFuZCB0aGUgc3BlY2lmaWMgZXJyb3IgYXMgaWRlbnRpZmllZCBieSB0aGUgQVNDL0FTQ1EKKyAqIHBhaXIsIGZhbGwgYmFjayBvbiB0aGUgbW9yZSBnZW5lcmljIGFjdGlvbnMgZGVyaXZlZCBmcm9tIHRoZSBzZW5zZSBrZXkuCisgKi8KK2FpY19zZW5zZV9hY3Rpb24KK2FpY19zZW5zZV9lcnJvcl9hY3Rpb24oc3RydWN0IHNjc2lfc2Vuc2VfZGF0YSAqc2Vuc2VfZGF0YSwKKwkJICAgICAgIHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSAqaW5xX2RhdGEsIHVpbnQzMl90IHNlbnNlX2ZsYWdzKQoreworCWNvbnN0IHN0cnVjdCBhc2NfdGFibGVfZW50cnkgKmFzY19lbnRyeTsKKwljb25zdCBzdHJ1Y3Qgc2Vuc2Vfa2V5X3RhYmxlX2VudHJ5ICpzZW5zZV9lbnRyeTsKKwlpbnQgZXJyb3JfY29kZSwgc2Vuc2Vfa2V5LCBhc2MsIGFzY3E7CisJYWljX3NlbnNlX2FjdGlvbiBhY3Rpb247CisKKwlzY3NpX2V4dHJhY3Rfc2Vuc2Uoc2Vuc2VfZGF0YSwgJmVycm9yX2NvZGUsICZzZW5zZV9rZXksICZhc2MsICZhc2NxKTsKKworCWlmIChlcnJvcl9jb2RlID09IFNTRF9ERUZFUlJFRF9FUlJPUikgeworCQkvKgorCQkgKiBYWFggZHVmYXVsdEBGcmVlQlNELm9yZworCQkgKiBUaGlzIGVycm9yIGRvZXNuJ3QgcmVsYXRlIHRvIHRoZSBjb21tYW5kIGFzc29jaWF0ZWQKKwkJICogd2l0aCB0aGlzIHJlcXVlc3Qgc2Vuc2UuICBBIGRlZmVycmVkIGVycm9yIGlzIGFuIGVycm9yCisJCSAqIGZvciBhIGNvbW1hbmQgdGhhdCBoYXMgYWxyZWFkeSByZXR1cm5lZCBHT09EIHN0YXR1cworCQkgKiAoc2VlIFNDU0kyIDguMi4xNC4yKS4KKwkJICoKKwkJICogQnkgbXkgcmVhZGluZyBvZiB0aGF0IHNlY3Rpb24sIGl0IGxvb2tzIGxpa2UgdGhlIGN1cnJlbnQKKwkJICogY29tbWFuZCBoYXMgYmVlbiBjYW5jZWxsZWQsIHdlIHNob3VsZCBub3cgY2xlYW4gdGhpbmdzIHVwCisJCSAqIChob3BlZnVsbHkgcmVjb3ZlcmluZyBhbnkgbG9zdCBkYXRhKSBhbmQgdGhlbiByZXRyeSB0aGUKKwkJICogY3VycmVudCBjb21tYW5kLiAgVGhlcmUgYXJlIHR3byBlYXN5IGNob2ljZXMsIGJvdGggd3Jvbmc6CisJCSAqCisJCSAqIDEuIERyb3AgdGhyb3VnaCAobGlrZSB3ZSBoYWQgYmVlbiBkb2luZyksIHRodXMgdHJlYXRpbmcKKwkJICogICAgdGhpcyBhcyBpZiB0aGUgZXJyb3Igd2VyZSBmb3IgdGhlIGN1cnJlbnQgY29tbWFuZCBhbmQKKwkJICogICAgcmV0dXJuIGFuZCBzdG9wIHRoZSBjdXJyZW50IGNvbW1hbmQuCisJCSAqIAorCQkgKiAyLiBJc3N1ZSBhIHJldHJ5IChsaWtlIEkgbWFkZSBpdCBkbykgdGh1cyBob3BlZnVsbHkKKwkJICogICAgcmVjb3ZlcmluZyB0aGUgY3VycmVudCB0cmFuc2ZlciwgYW5kIGlnbm9yaW5nIHRoZQorCQkgKiAgICBmYWN0IHRoYXQgd2UndmUgZHJvcHBlZCBhIGNvbW1hbmQuCisJCSAqCisJCSAqIFRoZXNlIHNob3VsZCBwcm9iYWJseSBiZSBoYW5kbGVkIGluIGEgZGV2aWNlIHNwZWNpZmljCisJCSAqIHNlbnNlIGhhbmRsZXIgb3IgcHVudGVkIGJhY2sgdXAgdG8gYSB1c2VyIG1vZGUgZGFlbW9uCisJCSAqLworCQlhY3Rpb24gPSBTU19SRVRSWXxTU1FfREVDUkVNRU5UX0NPVU5UfFNTUV9QUklOVF9TRU5TRTsKKwl9IGVsc2UgeworCQlmZXRjaHRhYmxlZW50cmllcyhzZW5zZV9rZXksIGFzYywgYXNjcSwKKwkJCQkgIGlucV9kYXRhLAorCQkJCSAgJnNlbnNlX2VudHJ5LAorCQkJCSAgJmFzY19lbnRyeSk7CisKKwkJLyoKKwkJICogT3ZlcnJpZGUgdGhlICdObyBhZGRpdGlvbmFsIFNlbnNlJyBlbnRyeSAoMCwwKQorCQkgKiB3aXRoIHRoZSBlcnJvciBhY3Rpb24gb2YgdGhlIHNlbnNlIGtleS4KKwkJICovCisJCWlmIChhc2NfZW50cnkgIT0gTlVMTAorCQkgJiYgKGFzYyAhPSAwIHx8IGFzY3EgIT0gMCkpCisJCQlhY3Rpb24gPSBhc2NfZW50cnktPmFjdGlvbjsKKwkJZWxzZQorCQkJYWN0aW9uID0gc2Vuc2VfZW50cnktPmFjdGlvbjsKKworCQlpZiAoc2Vuc2Vfa2V5ID09IFNTRF9LRVlfUkVDT1ZFUkVEX0VSUk9SKSB7CisJCQkvKgorCQkJICogVGhlIGFjdGlvbiBzdWNjZWVkZWQgYnV0IHRoZSBkZXZpY2Ugd2FudHMKKwkJCSAqIHRoZSB1c2VyIHRvIGtub3cgdGhhdCBzb21lIHJlY292ZXJ5IGFjdGlvbgorCQkJICogd2FzIHJlcXVpcmVkLgorCQkJICovCisJCQlhY3Rpb24gJj0gfihTU19NQVNLfFNTUV9NQVNLfFNTX0VSUk1BU0spOworCQkJYWN0aW9uIHw9IFNTX05PUHxTU1FfUFJJTlRfU0VOU0U7CisJCX0gZWxzZSBpZiAoc2Vuc2Vfa2V5ID09IFNTRF9LRVlfSUxMRUdBTF9SRVFVRVNUKSB7CisJCQlpZiAoKHNlbnNlX2ZsYWdzICYgU0ZfUVVJRVRfSVIpICE9IDApCisJCQkJYWN0aW9uICY9IH5TU1FfUFJJTlRfU0VOU0U7CisJCX0gZWxzZSBpZiAoc2Vuc2Vfa2V5ID09IFNTRF9LRVlfVU5JVF9BVFRFTlRJT04pIHsKKwkJCWlmICgoc2Vuc2VfZmxhZ3MgJiBTRl9SRVRSWV9VQSkgIT0gMAorCQkJICYmIChhY3Rpb24gJiBTU19NQVNLKSA9PSBTU19GQUlMKSB7CisJCQkJYWN0aW9uICY9IH4oU1NfTUFTS3xTU1FfTUFTSyk7CisJCQkJYWN0aW9uIHw9IFNTX1JFVFJZfFNTUV9ERUNSRU1FTlRfQ09VTlR8CisJCQkJCSAgU1NRX1BSSU5UX1NFTlNFOworCQkJfQorCQl9CisJfQorCisJaWYgKChzZW5zZV9mbGFncyAmIFNGX1BSSU5UX0FMV0FZUykgIT0gMCkKKwkJYWN0aW9uIHw9IFNTUV9QUklOVF9TRU5TRTsKKwllbHNlIGlmICgoc2Vuc2VfZmxhZ3MgJiBTRl9OT19QUklOVCkgIT0gMCkKKwkJYWN0aW9uICY9IH5TU1FfUFJJTlRfU0VOU0U7CisKKwlyZXR1cm4gKGFjdGlvbik7Cit9CisKKy8qICAgICAgCisgKiBUcnkgbWFrZSBhcyBnb29kIGEgbWF0Y2ggYXMgcG9zc2libGUgd2l0aAorICogYXZhaWxhYmxlIHN1YiBkcml2ZXJzCisgKi8KK2ludAorYWljX2lucXVpcnlfbWF0Y2goY2FkZHJfdCBpbnFidWZmZXIsIGNhZGRyX3QgdGFibGVfZW50cnkpCit7CisJc3RydWN0IHNjc2lfaW5xdWlyeV9wYXR0ZXJuICplbnRyeTsKKwlzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKmlucTsKKyAKKwllbnRyeSA9IChzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X3BhdHRlcm4gKil0YWJsZV9lbnRyeTsKKwlpbnEgPSAoc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhICopaW5xYnVmZmVyOworCisJaWYgKCgoU0lEX1RZUEUoaW5xKSA9PSBlbnRyeS0+dHlwZSkKKwkgIHx8IChlbnRyeS0+dHlwZSA9PSBUX0FOWSkpCisJICYmIChTSURfSVNfUkVNT1ZBQkxFKGlucSkgPyBlbnRyeS0+bWVkaWFfdHlwZSAmIFNJUF9NRURJQV9SRU1PVkFCTEUKKwkJCQkgICA6IGVudHJ5LT5tZWRpYV90eXBlICYgU0lQX01FRElBX0ZJWEVEKQorCSAmJiAoY2FtX3N0cm1hdGNoKGlucS0+dmVuZG9yLCBlbnRyeS0+dmVuZG9yLCBzaXplb2YoaW5xLT52ZW5kb3IpKSA9PSAwKQorCSAmJiAoY2FtX3N0cm1hdGNoKGlucS0+cHJvZHVjdCwgZW50cnktPnByb2R1Y3QsCisJCQkgIHNpemVvZihpbnEtPnByb2R1Y3QpKSA9PSAwKQorCSAmJiAoY2FtX3N0cm1hdGNoKGlucS0+cmV2aXNpb24sIGVudHJ5LT5yZXZpc2lvbiwKKwkJCSAgc2l6ZW9mKGlucS0+cmV2aXNpb24pKSA9PSAwKSkgeworCQlyZXR1cm4gKDApOworCX0KKyAgICAgICAgcmV0dXJuICgtMSk7Cit9CisKKy8qCisgKiBUYWJsZSBvZiBzeW5jcmF0ZXMgdGhhdCBkb24ndCBmb2xsb3cgdGhlICJkaXZpc2libGUgYnkgNCIKKyAqIHJ1bGUuIFRoaXMgdGFibGUgd2lsbCBiZSBleHBhbmRlZCBpbiBmdXR1cmUgU0NTSSBzcGVjcy4KKyAqLworc3RhdGljIHN0cnVjdCB7CisJdV9pbnQgcGVyaW9kX2ZhY3RvcjsKKwl1X2ludCBwZXJpb2Q7CS8qIGluIDEwMHRocyBvZiBucyAqLworfSBzY3NpX3N5bmNyYXRlc1tdID0geworCXsgMHgwOCwgNjI1IH0sCS8qIEZBU1QtMTYwICovCisJeyAweDA5LCAxMjUwIH0sCS8qIEZBU1QtODAgKi8KKwl7IDB4MGEsIDI1MDAgfSwJLyogRkFTVC00MCA0ME1IeiAqLworCXsgMHgwYiwgMzAzMCB9LAkvKiBGQVNULTQwIDMzTUh6ICovCisJeyAweDBjLCA1MDAwIH0JLyogRkFTVC0yMCAqLworfTsKKworLyoKKyAqIFJldHVybiB0aGUgZnJlcXVlbmN5IGluIGtIeiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbgorICogc3luYyBwZXJpb2QgZmFjdG9yLgorICovCit1X2ludAorYWljX2NhbGNfc3luY3NyYXRlKHVfaW50IHBlcmlvZF9mYWN0b3IpCit7CisJaW50IGk7CisJaW50IG51bV9zeW5jcmF0ZXM7CisKKwludW1fc3luY3JhdGVzID0gc2l6ZW9mKHNjc2lfc3luY3JhdGVzKSAvIHNpemVvZihzY3NpX3N5bmNyYXRlc1swXSk7CisJLyogU2VlIGlmIHRoZSBwZXJpb2QgaXMgaW4gdGhlICJleGNlcHRpb24iIHRhYmxlICovCisJZm9yIChpID0gMDsgaSA8IG51bV9zeW5jcmF0ZXM7IGkrKykgeworCisJCWlmIChwZXJpb2RfZmFjdG9yID09IHNjc2lfc3luY3JhdGVzW2ldLnBlcmlvZF9mYWN0b3IpIHsKKwkJCS8qIFBlcmlvZCBpbiBrSHogKi8KKwkJCXJldHVybiAoMTAwMDAwMDAwIC8gc2NzaV9zeW5jcmF0ZXNbaV0ucGVyaW9kKTsKKwkJfQorCX0KKworCS8qCisJICogV2Fzbid0IGluIHRoZSB0YWJsZSwgc28gdXNlIHRoZSBzdGFuZGFyZAorCSAqIDQgdGltZXMgY29udmVyc2lvbi4KKwkgKi8KKwlyZXR1cm4gKDEwMDAwMDAwIC8gKHBlcmlvZF9mYWN0b3IgKiA0ICogMTApKTsKK30KKworLyoKKyAqIFJldHVybiBzcGVlZCBpbiBLQi9zLgorICovCit1X2ludAorYWljX2NhbGNfc3BlZWQodV9pbnQgd2lkdGgsIHVfaW50IHBlcmlvZCwgdV9pbnQgb2Zmc2V0LCB1X2ludCBtaW5fcmF0ZSkKK3sKKwl1X2ludCBmcmVxOworCisJaWYgKG9mZnNldCAhPSAwICYmIHBlcmlvZCA8IG1pbl9yYXRlKQorCQlmcmVxICA9IGFpY19jYWxjX3N5bmNzcmF0ZShwZXJpb2QpOworCWVsc2UKKwkJLyogUm91Z2hseSAzLjNNQi9zIGZvciBhc3luYyAqLworCQlmcmVxICA9IDMzMDA7CisJZnJlcSA8PD0gd2lkdGg7CisJcmV0dXJuIChmcmVxKTsKK30KKwordWludDMyX3QKK2FpY19lcnJvcl9hY3Rpb24oc3RydWN0IHNjc2lfY21uZCAqY21kLCBzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKmlucV9kYXRhLAorCQkgY2FtX3N0YXR1cyBzdGF0dXMsIHVfaW50IHNjc2lfc3RhdHVzKQoreworCWFpY19zZW5zZV9hY3Rpb24gIGVycl9hY3Rpb247CisJaW50CQkgIHNlbnNlOworCisJc2Vuc2UgID0gKGNtZC0+cmVzdWx0ID4+IDI0KSA9PSBEUklWRVJfU0VOU0U7CisKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgQ0FNX1JFUV9DTVA6CisJCWVycl9hY3Rpb24gPSBTU19OT1A7CisJCWJyZWFrOworCWNhc2UgQ0FNX0FVVE9TRU5TRV9GQUlMOgorCWNhc2UgQ0FNX1NDU0lfU1RBVFVTX0VSUk9SOgorCisJCXN3aXRjaCAoc2NzaV9zdGF0dXMpIHsKKwkJY2FzZSBTQ1NJX1NUQVRVU19PSzoKKwkJY2FzZSBTQ1NJX1NUQVRVU19DT05EX01FVDoKKwkJY2FzZSBTQ1NJX1NUQVRVU19JTlRFUk1FRDoKKwkJY2FzZSBTQ1NJX1NUQVRVU19JTlRFUk1FRF9DT05EX01FVDoKKwkJCWVycl9hY3Rpb24gPSBTU19OT1A7CisJCQlicmVhazsKKwkJY2FzZSBTQ1NJX1NUQVRVU19DTURfVEVSTUlOQVRFRDoKKwkJY2FzZSBTQ1NJX1NUQVRVU19DSEVDS19DT05EOgorCQkJaWYgKHNlbnNlICE9IDApIHsKKwkJCQlzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhICpzZW5zZTsKKworCQkJCXNlbnNlID0gKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEgKikKKwkJCQkgICAgJmNtZC0+c2Vuc2VfYnVmZmVyOworCQkJCWVycl9hY3Rpb24gPQorCQkJCSAgICBhaWNfc2Vuc2VfZXJyb3JfYWN0aW9uKHNlbnNlLCBpbnFfZGF0YSwgMCk7CisKKwkJCX0gZWxzZSB7CisJCQkJZXJyX2FjdGlvbiA9IFNTX1JFVFJZfFNTUV9GQUxMQkFDSworCQkJCQkgICB8IFNTUV9ERUNSRU1FTlRfQ09VTlR8RUlPOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU0NTSV9TVEFUVVNfUVVFVUVfRlVMTDoKKwkJY2FzZSBTQ1NJX1NUQVRVU19CVVNZOgorCQkJZXJyX2FjdGlvbiA9IFNTX1JFVFJZfFNTUV9ERUxBWXxTU1FfTUFOWQorCQkJCSAgIHwgU1NRX0RFQ1JFTUVOVF9DT1VOVHxFQlVTWTsKKwkJCWJyZWFrOworCQljYXNlIFNDU0lfU1RBVFVTX1JFU0VSVl9DT05GTElDVDoKKwkJZGVmYXVsdDoKKwkJCWVycl9hY3Rpb24gPSBTU19GQUlMfEVCVVNZOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDQU1fQ01EX1RJTUVPVVQ6CisJY2FzZSBDQU1fUkVRX0NNUF9FUlI6CisJY2FzZSBDQU1fVU5FWFBfQlVTRlJFRToKKwljYXNlIENBTV9VTkNPUl9QQVJJVFk6CisJY2FzZSBDQU1fREFUQV9SVU5fRVJSOgorCQllcnJfYWN0aW9uID0gU1NfUkVUUll8U1NRX0ZBTExCQUNLfEVJTzsKKwkJYnJlYWs7CisJY2FzZSBDQU1fVUFfQUJPUlQ6CisJY2FzZSBDQU1fVUFfVEVSTUlPOgorCWNhc2UgQ0FNX01TR19SRUpFQ1RfUkVDOgorCWNhc2UgQ0FNX1NFTF9USU1FT1VUOgorCQllcnJfYWN0aW9uID0gU1NfRkFJTHxFSU87CisJCWJyZWFrOworCWNhc2UgQ0FNX1JFUV9JTlZBTElEOgorCWNhc2UgQ0FNX1BBVEhfSU5WQUxJRDoKKwljYXNlIENBTV9ERVZfTk9UX1RIRVJFOgorCWNhc2UgQ0FNX05PX0hCQToKKwljYXNlIENBTV9QUk9WSURFX0ZBSUw6CisJY2FzZSBDQU1fUkVRX1RPT19CSUc6CQkKKwljYXNlIENBTV9SRVNSQ19VTkFWQUlMOgorCWNhc2UgQ0FNX0JVU1k6CisJZGVmYXVsdDoKKwkJLyogcGFuaWM/PyAgVGhlc2Ugc2hvdWxkIG5ldmVyIG9jY3VyIGluIG91ciBhcHBsaWNhdGlvbi4gKi8KKwkJZXJyX2FjdGlvbiA9IFNTX0ZBSUx8RUlPOworCQlicmVhazsKKwljYXNlIENBTV9TQ1NJX0JVU19SRVNFVDoKKwljYXNlIENBTV9CRFJfU0VOVDoJCQorCWNhc2UgQ0FNX1JFUVVFVUVfUkVROgorCQkvKiBVbmNvbmRpdGlvbmFsIHJlcXVldWUgKi8KKwkJZXJyX2FjdGlvbiA9IFNTX1JFVFJZOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKGVycl9hY3Rpb24pOworfQorCitjaGFyICoKK2FpY19wYXJzZV9icmFjZV9vcHRpb24oY2hhciAqb3B0X25hbWUsIGNoYXIgKm9wdF9hcmcsIGNoYXIgKmVuZCwgaW50IGRlcHRoLAorCQkgICAgICAgYWljX29wdGlvbl9jYWxsYmFja190ICpjYWxsYmFjaywgdV9sb25nIGNhbGxiYWNrX2FyZykKK3sKKwljaGFyCSp0b2tfZW5kOworCWNoYXIJKnRva19lbmQyOworCWludCAgICAgIGk7CisJaW50ICAgICAgaW5zdGFuY2U7CisJaW50CSB0YXJnOworCWludAkgZG9uZTsKKwljaGFyCSB0b2tfbGlzdFtdID0geycuJywgJywnLCAneycsICd9JywgJ1wwJ307CisKKwkvKiBBbGwgb3B0aW9ucyB1c2UgYSAnOicgbmFtZS9hcmcgc2VwYXJhdG9yICovCisJaWYgKCpvcHRfYXJnICE9ICc6JykKKwkJcmV0dXJuIChvcHRfYXJnKTsKKwlvcHRfYXJnKys7CisJaW5zdGFuY2UgPSAtMTsKKwl0YXJnID0gLTE7CisJZG9uZSA9IEZBTFNFOworCS8qCisJICogUmVzdG9yZSBzZXBhcmF0b3IgdGhhdCBtYXkgYmUgaW4KKwkgKiB0aGUgbWlkZGxlIG9mIG91ciBvcHRpb24gYXJndW1lbnQuCisJICovCisJdG9rX2VuZCA9IHN0cmNocihvcHRfYXJnLCAnXDAnKTsKKwlpZiAodG9rX2VuZCA8IGVuZCkKKwkJKnRva19lbmQgPSAnLCc7CisJd2hpbGUgKCFkb25lKSB7CisJCXN3aXRjaCAoKm9wdF9hcmcpIHsKKwkJY2FzZSAneyc6CisJCQlpZiAoaW5zdGFuY2UgPT0gLTEpIHsKKwkJCQlpbnN0YW5jZSA9IDA7CisJCQl9IGVsc2UgeworCQkJCWlmIChkZXB0aCA+IDEpIHsKKwkJCQkJaWYgKHRhcmcgPT0gLTEpCisJCQkJCQl0YXJnID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGYoIk1hbGZvcm1lZCBPcHRpb24gJXNcbiIsCisJCQkJCSAgICAgICBvcHRfbmFtZSk7CisJCQkJCWRvbmUgPSBUUlVFOworCQkJCX0KKwkJCX0KKwkJCW9wdF9hcmcrKzsKKwkJCWJyZWFrOworCQljYXNlICd9JzoKKwkJCWlmICh0YXJnICE9IC0xKQorCQkJCXRhcmcgPSAtMTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlICE9IC0xKQorCQkJCWluc3RhbmNlID0gLTE7CisJCQlvcHRfYXJnKys7CisJCQlicmVhazsKKwkJY2FzZSAnLCc6CisJCWNhc2UgJy4nOgorCQkJaWYgKGluc3RhbmNlID09IC0xKQorCQkJCWRvbmUgPSBUUlVFOworCQkJZWxzZSBpZiAodGFyZyA+PSAwKQorCQkJCXRhcmcrKzsKKwkJCWVsc2UgaWYgKGluc3RhbmNlID49IDApCisJCQkJaW5zdGFuY2UrKzsKKwkJCW9wdF9hcmcrKzsKKwkJCWJyZWFrOworCQljYXNlICdcMCc6CisJCQlkb25lID0gVFJVRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdG9rX2VuZCA9IGVuZDsKKwkJCWZvciAoaSA9IDA7IHRva19saXN0W2ldOyBpKyspIHsKKwkJCQl0b2tfZW5kMiA9IHN0cmNocihvcHRfYXJnLCB0b2tfbGlzdFtpXSk7CisJCQkJaWYgKCh0b2tfZW5kMikgJiYgKHRva19lbmQyIDwgdG9rX2VuZCkpCisJCQkJCXRva19lbmQgPSB0b2tfZW5kMjsKKwkJCX0KKwkJCWNhbGxiYWNrKGNhbGxiYWNrX2FyZywgaW5zdGFuY2UsIHRhcmcsCisJCQkJIHNpbXBsZV9zdHJ0b2wob3B0X2FyZywgTlVMTCwgMCkpOworCQkJb3B0X2FyZyA9IHRva19lbmQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gKG9wdF9hcmcpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljbGliLmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWNsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmU2Zjk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljbGliLmgKQEAgLTAsMCArMSwxMDg1IEBACisvKgorICogTGFyZ2VseSB3cml0dGVuIGJ5IEp1bGlhbiBFbGlzY2hlciAoanVsaWFuQHRmcy5jb20pCisgKiBmb3IgVFJXIEZpbmFuY2lhbCBTeXN0ZW1zLgorICoKKyAqIFRSVyBGaW5hbmNpYWwgU3lzdGVtcywgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZWlyIGFncmVlbWVudCB3aXRoIENhcm5lZ2llCisgKiBNZWxsb24gVW5pdmVyc2l0eSwgbWFrZXMgdGhpcyBzb2Z0d2FyZSBhdmFpbGFibGUgdG8gQ01VIHRvIGRpc3RyaWJ1dGUKKyAqIG9yIHVzZSBpbiBhbnkgbWFubmVyIHRoYXQgdGhleSBzZWUgZml0IGFzIGxvbmcgYXMgdGhpcyBtZXNzYWdlIGlzIGtlcHQgd2l0aAorICogdGhlIHNvZnR3YXJlLiBGb3IgdGhpcyByZWFzb24gVEZTIGFsc28gZ3JhbnRzIGFueSBvdGhlciBwZXJzb25zIG9yCisgKiBvcmdhbmlzYXRpb25zIHBlcm1pc3Npb24gdG8gdXNlIG9yIG1vZGlmeSB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFRGUyBzdXBwbGllcyB0aGlzIHNvZnR3YXJlIHRvIGJlIHB1YmxpY2x5IHJlZGlzdHJpYnV0ZWQKKyAqIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgVEZTIGlzIG5vdCByZXNwb25zaWJsZSBmb3IgdGhlIGNvcnJlY3QKKyAqIGZ1bmN0aW9uaW5nIG9mIHRoaXMgc29mdHdhcmUgaW4gYW55IGNpcmN1bXN0YW5jZXMuCisgKgorICogUG9ydGVkIHRvIHJ1biB1bmRlciAzODZCU0QgYnkgSnVsaWFuIEVsaXNjaGVyIChqdWxpYW5AdGZzLmNvbSkgU2VwdCAxOTkyCisgKgorICogJEZyZWVCU0Q6IHNyYy9zeXMvY2FtL3Njc2kvc2NzaV9hbGwuaCx2IDEuMjEgMjAwMi8xMC8wOCAxNzoxMjo0NCBrZW4gRXhwICQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkJAorICovCisKKyNpZm5kZWYJX0FJQ0xJQl9ICisjZGVmaW5lIF9BSUNMSUJfSAorCisvKgorICogTGludXggSW50ZXJydXB0IFN1cHBvcnQuCisgKi8KKyNpZm5kZWYgSVJRX1JFVFZBTAordHlwZWRlZiB2b2lkIGlycXJldHVybl90OworI2RlZmluZQlJUlFfUkVUVkFMKHgpCisjZW5kaWYKKworLyoKKyAqIFNDU0kgY29tbWFuZCBmb3JtYXQKKyAqLworCisvKgorICogRGVmaW5lIGRvbWUgYml0cyB0aGF0IGFyZSBpbiBBTEwgKG9yIGEgbG90IG9mKSBzY3NpIGNvbW1hbmRzCisgKi8KKyNkZWZpbmUgU0NTSV9DVExfTElOSwkJMHgwMQorI2RlZmluZSBTQ1NJX0NUTF9GTEFHCQkweDAyCisjZGVmaW5lIFNDU0lfQ1RMX1ZFTkRPUgkJMHhDMAorI2RlZmluZQlTQ1NJX0NNRF9MVU4JCTB4QTAJLyogdGhlc2UgdHdvIHNob3VsZCBub3QgYmUgbmVlZGVkICovCisjZGVmaW5lCVNDU0lfQ01EX0xVTl9TSElGVAk1CS8qIExVTiBpbiB0aGUgY21kIGlzIG5vIGxvbmdlciBTQ1NJICovCisKKyNkZWZpbmUgU0NTSV9NQVhfQ0RCTEVOCQkxNgkvKiAKKwkJCQkJICogMTYgYnl0ZSBjb21tYW5kcyBhcmUgaW4gdGhlIAorCQkJCQkgKiBTQ1NJLTMgc3BlYyAKKwkJCQkJICovCisvKiA2Ynl0ZSBDREJzIHNwZWNpYWwgY2FzZSAwIGxlbmd0aCB0byBiZSAyNTYgKi8KKyNkZWZpbmUgU0NTSV9DREI2X0xFTihsZW4pCSgobGVuKSA9PSAwID8gMjU2IDogbGVuKQorCisvKgorICogVGhpcyB0eXBlIGRlZmluZXMgYWN0aW9ucyB0byBiZSB0YWtlbiB3aGVuIGEgcGFydGljdWxhciBzZW5zZSBjb2RlIGlzCisgKiByZWNlaXZlZC4gIFJpZ2h0IG5vdywgdGhlc2UgZmxhZ3MgYXJlIG9ubHkgZGVmaW5lZCB0byB0YWtlIHVwIDE2IGJpdHMsCisgKiBidXQgY2FuIGJlIGV4cGFuZGVkIGluIHRoZSBmdXR1cmUgaWYgbmVjZXNzYXJ5LgorICovCit0eXBlZGVmIGVudW0geworCVNTX05PUAkJPSAweDAwMDAwMCwgLyogRG8gbm90aGluZyAqLworCVNTX1JFVFJZCT0gMHgwMTAwMDAsIC8qIFJldHJ5IHRoZSBjb21tYW5kICovCisJU1NfRkFJTAkJPSAweDAyMDAwMCwgLyogQmFpbCBvdXQgKi8KKwlTU19TVEFSVAk9IDB4MDMwMDAwLCAvKiBTZW5kIGEgU3RhcnQgVW5pdCBjb21tYW5kIHRvIHRoZSBkZXZpY2UsCisJCQkJICAgICAqIHRoZW4gcmV0cnkgdGhlIG9yaWdpbmFsIGNvbW1hbmQuCisJCQkJICAgICAqLworCVNTX1RVUgkJPSAweDA0MDAwMCwgLyogU2VuZCBhIFRlc3QgVW5pdCBSZWFkeSBjb21tYW5kIHRvIHRoZQorCQkJCSAgICAgKiBkZXZpY2UsIHRoZW4gcmV0cnkgdGhlIG9yaWdpbmFsIGNvbW1hbmQuCisJCQkJICAgICAqLworCVNTX1JFUVNFTlNFCT0gMHgwNTAwMDAsIC8qIFNlbmQgYSBSZXF1ZXN0U2Vuc2UgY29tbWFuZCB0byB0aGUKKwkJCQkgICAgICogZGV2aWNlLCB0aGVuIHJldHJ5IHRoZSBvcmlnaW5hbCBjb21tYW5kLgorCQkJCSAgICAgKi8KKwlTU19JTlFfUkVGUkVTSAk9IDB4MDYwMDAwLAorCVNTX01BU0sJCT0gMHhmZjAwMDAKK30gYWljX3NlbnNlX2FjdGlvbjsKKwordHlwZWRlZiBlbnVtIHsKKwlTU1FfTk9ORQkJPSAweDAwMDAsCisJU1NRX0RFQ1JFTUVOVF9DT1VOVAk9IDB4MDEwMCwgIC8qIERlY3JlbWVudCB0aGUgcmV0cnkgY291bnQgKi8KKwlTU1FfTUFOWQkJPSAweDAyMDAsICAvKiBzZW5kIGxvdHMgb2YgcmVjb3ZlcnkgY29tbWFuZHMgKi8KKwlTU1FfUkFOR0UJCT0gMHgwNDAwLCAgLyoKKwkJCQkJICAgICogVGhpcyB0YWJsZSBlbnRyeSByZXByZXNlbnRzIHRoZQorCQkJCQkgICAgKiBlbmQgb2YgYSByYW5nZSBvZiBBU0NRcyB0aGF0CisJCQkJCSAgICAqIGhhdmUgaWRlbnRpY2FsIGVycm9yIGFjdGlvbnMKKwkJCQkJICAgICogYW5kIHRleHQuCisJCQkJCSAgICAqLworCVNTUV9QUklOVF9TRU5TRQkJPSAweDA4MDAsCisJU1NRX0RFTEFZCQk9IDB4MTAwMCwgIC8qIERlbGF5IGJlZm9yZSByZXRyeS4gKi8KKwlTU1FfREVMQVlfUkFORE9NCT0gMHgyMDAwLCAgLyogUmFuZG9taXplZCBkZWxheSBiZWZvcmUgcmV0cnkuICovCisJU1NRX0ZBTExCQUNLCQk9IDB4NDAwMCwgIC8qIERvIGEgc3BlZWQgZmFsbGJhY2sgdG8gcmVjb3ZlciAqLworCVNTUV9NQVNLCQk9IDB4ZmYwMAorfSBhaWNfc2Vuc2VfYWN0aW9uX3F1YWxpZmllcjsKKworLyogTWFzayBmb3IgZXJyb3Igc3RhdHVzIHZhbHVlcyAqLworI2RlZmluZSBTU19FUlJNQVNLCTB4ZmYKKworLyogVGhlIGRlZmF1bHQsIHJldHlhYmxlLCBlcnJvciBhY3Rpb24gKi8KKyNkZWZpbmUgU1NfUkRFRgkJU1NfUkVUUll8U1NRX0RFQ1JFTUVOVF9DT1VOVHxTU1FfUFJJTlRfU0VOU0V8RUlPCisKKy8qIFRoZSByZXR5YWJsZSwgZXJyb3IgYWN0aW9uLCB3aXRoIHRhYmxlIHNwZWNpZmllZCBlcnJvciBjb2RlICovCisjZGVmaW5lIFNTX1JFVAkJU1NfUkVUUll8U1NRX0RFQ1JFTUVOVF9DT1VOVHxTU1FfUFJJTlRfU0VOU0UKKworLyogRmF0YWwgZXJyb3IgYWN0aW9uLCB3aXRoIHRhYmxlIHNwZWNpZmllZCBlcnJvciBjb2RlICovCisjZGVmaW5lIFNTX0ZBVEFMCVNTX0ZBSUx8U1NRX1BSSU5UX1NFTlNFCisKK3N0cnVjdCBzY3NpX2dlbmVyaWMKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGVzWzExXTsKK307CisKK3N0cnVjdCBzY3NpX3JlcXVlc3Rfc2Vuc2UKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworCXVpbnQ4X3QgdW51c2VkWzJdOworCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX3Rlc3RfdW5pdF9yZWFkeQoreworCXVpbnQ4X3Qgb3Bjb2RlOworCXVpbnQ4X3QgYnl0ZTI7CisJdWludDhfdCB1bnVzZWRbM107CisJdWludDhfdCBjb250cm9sOworfTsKKworc3RydWN0IHNjc2lfc2VuZF9kaWFnCit7CisJdWludDhfdCBvcGNvZGU7CisJdWludDhfdCBieXRlMjsKKyNkZWZpbmUJU1NEX1VPTAkJMHgwMQorI2RlZmluZQlTU0RfRE9MCQkweDAyCisjZGVmaW5lCVNTRF9TRUxGVEVTVAkweDA0CisjZGVmaW5lCVNTRF9QRgkJMHgxMAorCXVpbnQ4X3QgdW51c2VkWzFdOworCXVpbnQ4X3QgcGFyYW1sZW5bMl07CisJdWludDhfdCBjb250cm9sOworfTsKKworc3RydWN0IHNjc2lfc2Vuc2UKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworCXVpbnQ4X3QgdW51c2VkWzJdOworCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX2lucXVpcnkKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworI2RlZmluZQlTSV9FVlBEIDB4MDEKKwl1aW50OF90IHBhZ2VfY29kZTsKKwl1aW50OF90IHJlc2VydmVkOworCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX21vZGVfc2Vuc2VfNgoreworCXVpbnQ4X3Qgb3Bjb2RlOworCXVpbnQ4X3QgYnl0ZTI7CisjZGVmaW5lCVNNU19EQkQJCQkJMHgwOAorCXVpbnQ4X3QgcGFnZTsKKyNkZWZpbmUJU01TX1BBR0VfQ09ERSAJCQkweDNGCisjZGVmaW5lIFNNU19WRU5ET1JfU1BFQ0lGSUNfUEFHRQkweDAwCisjZGVmaW5lIFNNU19ESVNDT05ORUNUX1JFQ09OTkVDVF9QQUdFCTB4MDIKKyNkZWZpbmUgU01TX1BFUklQSEVSQUxfREVWSUNFX1BBR0UJMHgwOQorI2RlZmluZSBTTVNfQ09OVFJPTF9NT0RFX1BBR0UJCTB4MEEKKyNkZWZpbmUgU01TX0FMTF9QQUdFU19QQUdFCQkweDNGCisjZGVmaW5lCVNNU19QQUdFX0NUUkxfTUFTSwkJMHhDMAorI2RlZmluZQlTTVNfUEFHRV9DVFJMX0NVUlJFTlQgCQkweDAwCisjZGVmaW5lCVNNU19QQUdFX0NUUkxfQ0hBTkdFQUJMRSAJMHg0MAorI2RlZmluZQlTTVNfUEFHRV9DVFJMX0RFRkFVTFQgCQkweDgwCisjZGVmaW5lCVNNU19QQUdFX0NUUkxfU0FWRUQgCQkweEMwCisJdWludDhfdCB1bnVzZWQ7CisJdWludDhfdCBsZW5ndGg7CisJdWludDhfdCBjb250cm9sOworfTsKKworc3RydWN0IHNjc2lfbW9kZV9zZW5zZV8xMAoreworCXVpbnQ4X3Qgb3Bjb2RlOworCXVpbnQ4X3QgYnl0ZTI7CQkvKiBzYW1lIGJpdHMgYXMgc21hbGwgdmVyc2lvbiAqLworCXVpbnQ4X3QgcGFnZTsgCQkvKiBzYW1lIGJpdHMgYXMgc21hbGwgdmVyc2lvbiAqLworCXVpbnQ4X3QgdW51c2VkWzRdOworCXVpbnQ4X3QgbGVuZ3RoWzJdOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX21vZGVfc2VsZWN0XzYKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworI2RlZmluZQlTTVNfU1AJMHgwMQorI2RlZmluZQlTTVNfUEYJMHgxMAorCXVpbnQ4X3QgdW51c2VkWzJdOworCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX21vZGVfc2VsZWN0XzEwCit7CisJdWludDhfdCBvcGNvZGU7CisJdWludDhfdCBieXRlMjsJCS8qIHNhbWUgYml0cyBhcyBzbWFsbCB2ZXJzaW9uICovCisJdWludDhfdCB1bnVzZWRbNV07CisJdWludDhfdCBsZW5ndGhbMl07CisJdWludDhfdCBjb250cm9sOworfTsKKworLyoKKyAqIFdoZW4gc2VuZGluZyBhIG1vZGUgc2VsZWN0IHRvIGEgdGFwZSBkcml2ZSwgdGhlIG1lZGl1bSB0eXBlIG11c3QgYmUgMC4KKyAqLworc3RydWN0IHNjc2lfbW9kZV9oZHJfNgoreworCXVpbnQ4X3QgZGF0YWxlbjsKKwl1aW50OF90IG1lZGl1bV90eXBlOworCXVpbnQ4X3QgZGV2X3NwZWNpZmljOworCXVpbnQ4X3QgYmxvY2tfZGVzY3JfbGVuOworfTsKKworc3RydWN0IHNjc2lfbW9kZV9oZHJfMTAKK3sKKwl1aW50OF90IGRhdGFsZW5bMl07CisJdWludDhfdCBtZWRpdW1fdHlwZTsKKwl1aW50OF90IGRldl9zcGVjaWZpYzsKKwl1aW50OF90IHJlc2VydmVkWzJdOworCXVpbnQ4X3QgYmxvY2tfZGVzY3JfbGVuWzJdOworfTsKKworc3RydWN0IHNjc2lfbW9kZV9ibG9ja19kZXNjcgoreworCXVpbnQ4X3QgZGVuc2l0eV9jb2RlOworCXVpbnQ4X3QgbnVtX2Jsb2Nrc1szXTsKKwl1aW50OF90IHJlc2VydmVkOworCXVpbnQ4X3QgYmxvY2tfbGVuWzNdOworfTsKKworc3RydWN0IHNjc2lfbG9nX3NlbnNlCit7CisJdWludDhfdCBvcGNvZGU7CisJdWludDhfdCBieXRlMjsKKyNkZWZpbmUJU0xTX1NQCQkJCTB4MDEKKyNkZWZpbmUJU0xTX1BQQwkJCQkweDAyCisJdWludDhfdCBwYWdlOworI2RlZmluZQlTTFNfUEFHRV9DT0RFIAkJCTB4M0YKKyNkZWZpbmUJU0xTX0FMTF9QQUdFU19QQUdFCQkweDAwCisjZGVmaW5lCVNMU19PVkVSUlVOX1BBR0UJCTB4MDEKKyNkZWZpbmUJU0xTX0VSUk9SX1dSSVRFX1BBR0UJCTB4MDIKKyNkZWZpbmUJU0xTX0VSUk9SX1JFQURfUEFHRQkJMHgwMworI2RlZmluZQlTTFNfRVJST1JfUkVBRFJFVkVSU0VfUEFHRQkweDA0CisjZGVmaW5lCVNMU19FUlJPUl9WRVJJRllfUEFHRQkJMHgwNQorI2RlZmluZQlTTFNfRVJST1JfTk9OTUVESVVNX1BBR0UJMHgwNgorI2RlZmluZQlTTFNfRVJST1JfTEFTVE5fUEFHRQkJMHgwNworI2RlZmluZQlTTFNfUEFHRV9DVFJMX01BU0sJCTB4QzAKKyNkZWZpbmUJU0xTX1BBR0VfQ1RSTF9USFJFU0hPTEQJCTB4MDAKKyNkZWZpbmUJU0xTX1BBR0VfQ1RSTF9DVU1VTEFUSVZFCTB4NDAKKyNkZWZpbmUJU0xTX1BBR0VfQ1RSTF9USFJFU0hfREVGQVVMVAkweDgwCisjZGVmaW5lCVNMU19QQUdFX0NUUkxfQ1VNVUxfREVGQVVMVAkweEMwCisJdWludDhfdCByZXNlcnZlZFsyXTsKKwl1aW50OF90IHBhcmFtcHRyWzJdOworCXVpbnQ4X3QgbGVuZ3RoWzJdOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX2xvZ19zZWxlY3QKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworLyoJU0xTX1NQCQkJCTB4MDEgKi8KKyNkZWZpbmUJU0xTX1BDUgkJCQkweDAyCisJdWludDhfdCBwYWdlOworLyoJU0xTX1BBR0VfQ1RSTF9NQVNLCQkweEMwICovCisvKglTTFNfUEFHRV9DVFJMX1RIUkVTSE9MRAkJMHgwMCAqLworLyoJU0xTX1BBR0VfQ1RSTF9DVU1VTEFUSVZFCTB4NDAgKi8KKy8qCVNMU19QQUdFX0NUUkxfVEhSRVNIX0RFRkFVTFQJMHg4MCAqLworLyoJU0xTX1BBR0VfQ1RSTF9DVU1VTF9ERUZBVUxUCTB4QzAgKi8KKwl1aW50OF90IHJlc2VydmVkWzRdOworCXVpbnQ4X3QgbGVuZ3RoWzJdOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX2xvZ19oZWFkZXIKK3sKKwl1aW50OF90IHBhZ2U7CisJdWludDhfdCByZXNlcnZlZDsKKwl1aW50OF90IGRhdGFsZW5bMl07Cit9OworCitzdHJ1Y3Qgc2NzaV9sb2dfcGFyYW1faGVhZGVyIHsKKwl1aW50OF90IHBhcmFtX2NvZGVbMl07CisJdWludDhfdCBwYXJhbV9jb250cm9sOworI2RlZmluZQlTTFBfTFAJCQkJMHgwMQorI2RlZmluZQlTTFBfTEJJTgkJCTB4MDIKKyNkZWZpbmUJU0xQX1RNQ19NQVNLCQkJMHgwQworI2RlZmluZQlTTFBfVE1DX0FMV0FZUwkJCTB4MDAKKyNkZWZpbmUJU0xQX1RNQ19FUVVBTAkJCTB4MDQKKyNkZWZpbmUJU0xQX1RNQ19OT1RFUVVBTAkJMHgwOAorI2RlZmluZQlTTFBfVE1DX0dSRUFURVIJCQkweDBDCisjZGVmaW5lCVNMUF9FVEMJCQkJMHgxMAorI2RlZmluZQlTTFBfVFNECQkJCTB4MjAKKyNkZWZpbmUJU0xQX0RTCQkJCTB4NDAKKyNkZWZpbmUJU0xQX0RVCQkJCTB4ODAKKwl1aW50OF90IHBhcmFtX2xlbjsKK307CisKK3N0cnVjdCBzY3NpX2NvbnRyb2xfcGFnZSB7CisJdWludDhfdCBwYWdlX2NvZGU7CisJdWludDhfdCBwYWdlX2xlbmd0aDsKKwl1aW50OF90IHJsZWM7CisjZGVmaW5lIFNDQl9STEVDCQkJMHgwMQkvKlJlcG9ydCBMb2cgRXhjZXB0aW9uIENvbmQqLworCXVpbnQ4X3QgcXVldWVfZmxhZ3M7CisjZGVmaW5lIFNDUF9RVUVVRV9BTEdfTUFTSwkJMHhGMAorI2RlZmluZSBTQ1BfUVVFVUVfQUxHX1JFU1RSSUNURUQJMHgwMAorI2RlZmluZSBTQ1BfUVVFVUVfQUxHX1VOUkVTVFJJQ1RFRAkweDEwCisjZGVmaW5lIFNDUF9RVUVVRV9FUlIJCQkweDAyCS8qUXVldWVkIEkvTyBhYm9ydGVkIGZvciBDQUNzKi8KKyNkZWZpbmUgU0NQX1FVRVVFX0RRVUUJCQkweDAxCS8qUXVldWVkIEkvTyBkaXNhYmxlZCovCisJdWludDhfdCBlY2FfYW5kX2FlbjsKKyNkZWZpbmUgU0NQX0VFQ0EJCQkweDgwCS8qRW5hYmxlIEV4dGVuZGVkIENBKi8KKyNkZWZpbmUgU0NQX1JBRU5QCQkJMHgwNAkvKlJlYWR5IEFFTiBQZXJtaXNzaW9uKi8KKyNkZWZpbmUgU0NQX1VBQUVOUAkJCTB4MDIJLypVQSBBRU4gUGVybWlzc2lvbiovCisjZGVmaW5lIFNDUF9FQUVOUAkJCTB4MDEJLypFcnJvciBBRU4gUGVybWlzc2lvbiovCisJdWludDhfdCByZXNlcnZlZDsKKwl1aW50OF90IGFlbl9ob2xkb2ZmX3BlcmlvZFsyXTsKK307CisKK3N0cnVjdCBzY3NpX3Jlc2VydmUKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworCXVpbnQ4X3QgdW51c2VkWzJdOworCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX3JlbGVhc2UKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworCXVpbnQ4X3QgdW51c2VkWzJdOworCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX3ByZXZlbnQKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworCXVpbnQ4X3QgdW51c2VkWzJdOworCXVpbnQ4X3QgaG93OworCXVpbnQ4X3QgY29udHJvbDsKK307CisjZGVmaW5lCVBSX1BSRVZFTlQgMHgwMQorI2RlZmluZSBQUl9BTExPVyAgIDB4MDAKKworc3RydWN0IHNjc2lfc3luY19jYWNoZQoreworCXVpbnQ4X3Qgb3Bjb2RlOworCXVpbnQ4X3QgYnl0ZTI7CisJdWludDhfdCBiZWdpbl9sYmFbNF07CisJdWludDhfdCByZXNlcnZlZDsKKwl1aW50OF90IGxiX2NvdW50WzJdOworCXVpbnQ4X3QgY29udHJvbDsJCit9OworCisKK3N0cnVjdCBzY3NpX2NoYW5nZWRlZgoreworCXVpbnQ4X3Qgb3Bjb2RlOworCXVpbnQ4X3QgYnl0ZTI7CisJdWludDhfdCB1bnVzZWQxOworCXVpbnQ4X3QgaG93OworCXVpbnQ4X3QgdW51c2VkWzRdOworCXVpbnQ4X3QgZGF0YWxlbjsKKwl1aW50OF90IGNvbnRyb2w7Cit9OworCitzdHJ1Y3Qgc2NzaV9yZWFkX2J1ZmZlcgoreworCXVpbnQ4X3Qgb3Bjb2RlOworCXVpbnQ4X3QgYnl0ZTI7CisjZGVmaW5lCVJXQl9NT0RFCQkweDA3CisjZGVmaW5lCVJXQl9NT0RFX0hEUl9EQVRBCTB4MDAKKyNkZWZpbmUJUldCX01PREVfREFUQQkJMHgwMgorI2RlZmluZQlSV0JfTU9ERV9ET1dOTE9BRAkweDA0CisjZGVmaW5lCVJXQl9NT0RFX0RPV05MT0FEX1NBVkUJMHgwNQorICAgICAgICB1aW50OF90IGJ1ZmZlcl9pZDsKKyAgICAgICAgdWludDhfdCBvZmZzZXRbM107CisgICAgICAgIHVpbnQ4X3QgbGVuZ3RoWzNdOworICAgICAgICB1aW50OF90IGNvbnRyb2w7Cit9OworCitzdHJ1Y3Qgc2NzaV93cml0ZV9idWZmZXIKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworCXVpbnQ4X3QgYnVmZmVyX2lkOworCXVpbnQ4X3Qgb2Zmc2V0WzNdOworCXVpbnQ4X3QgbGVuZ3RoWzNdOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX3J3XzYKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGFkZHJbM107CisvKiBvbmx5IDUgYml0cyBhcmUgdmFsaWQgaW4gdGhlIE1TQiBhZGRyZXNzIGJ5dGUgKi8KKyNkZWZpbmUJU1JXX1RPUEFERFIJMHgxRgorCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX3J3XzEwCit7CisJdWludDhfdCBvcGNvZGU7CisjZGVmaW5lCVNSVzEwX1JFTEFERFIJMHgwMQorI2RlZmluZSBTUlcxMF9GVUEJMHgwOAorI2RlZmluZQlTUlcxMF9EUE8JMHgxMAorCXVpbnQ4X3QgYnl0ZTI7CisJdWludDhfdCBhZGRyWzRdOworCXVpbnQ4X3QgcmVzZXJ2ZWQ7CisJdWludDhfdCBsZW5ndGhbMl07CisJdWludDhfdCBjb250cm9sOworfTsKKworc3RydWN0IHNjc2lfcndfMTIKK3sKKwl1aW50OF90IG9wY29kZTsKKyNkZWZpbmUJU1JXMTJfUkVMQUREUgkweDAxCisjZGVmaW5lIFNSVzEyX0ZVQQkweDA4CisjZGVmaW5lCVNSVzEyX0RQTwkweDEwCisJdWludDhfdCBieXRlMjsKKwl1aW50OF90IGFkZHJbNF07CisJdWludDhfdCBsZW5ndGhbNF07CisJdWludDhfdCByZXNlcnZlZDsKKwl1aW50OF90IGNvbnRyb2w7Cit9OworCitzdHJ1Y3Qgc2NzaV9zdGFydF9zdG9wX3VuaXQKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworI2RlZmluZQlTU1NfSU1NRUQJCTB4MDEKKwl1aW50OF90IHJlc2VydmVkWzJdOworCXVpbnQ4X3QgaG93OworI2RlZmluZQlTU1NfU1RBUlQJCTB4MDEKKyNkZWZpbmUJU1NTX0xPRUoJCTB4MDIKKwl1aW50OF90IGNvbnRyb2w7Cit9OworCisjZGVmaW5lIFNDX1NDU0lfMSAweDAxCisjZGVmaW5lIFNDX1NDU0lfMiAweDAzCisKKy8qCisgKiBPcGNvZGVzCisgKi8KKworI2RlZmluZQlURVNUX1VOSVRfUkVBRFkJCTB4MDAKKyNkZWZpbmUgUkVRVUVTVF9TRU5TRQkJMHgwMworI2RlZmluZQlSRUFEXzYJCQkweDA4CisjZGVmaW5lIFdSSVRFXzYJCQkweDBhCisjZGVmaW5lIElOUVVJUlkJCQkweDEyCisjZGVmaW5lIE1PREVfU0VMRUNUXzYJCTB4MTUKKyNkZWZpbmUgTU9ERV9TRU5TRV82CQkweDFhCisjZGVmaW5lIFNUQVJUX1NUT1BfVU5JVAkJMHgxYgorI2RlZmluZSBTVEFSVF9TVE9QCQkweDFiCisjZGVmaW5lIFJFU0VSVkUgICAgICAJCTB4MTYKKyNkZWZpbmUgUkVMRUFTRSAgICAgIAkJMHgxNworI2RlZmluZQlSRUNFSVZFX0RJQUdOT1NUSUMJMHgxYworI2RlZmluZQlTRU5EX0RJQUdOT1NUSUMJCTB4MWQKKyNkZWZpbmUgUFJFVkVOVF9BTExPVwkJMHgxZQorI2RlZmluZQlSRUFEX0NBUEFDSVRZCQkweDI1CisjZGVmaW5lCVJFQURfMTAJCQkweDI4CisjZGVmaW5lIFdSSVRFXzEwCQkweDJhCisjZGVmaW5lIFBPU0lUSU9OX1RPX0VMRU1FTlQJMHgyYgorI2RlZmluZQlTWU5DSFJPTklaRV9DQUNIRQkweDM1CisjZGVmaW5lCVdSSVRFX0JVRkZFUiAgICAgICAgICAgIDB4M2IKKyNkZWZpbmUJUkVBRF9CVUZGRVIgICAgICAgICAgICAgMHgzYworI2RlZmluZQlDSEFOR0VfREVGSU5JVElPTgkweDQwCisjZGVmaW5lCUxPR19TRUxFQ1QJCTB4NGMKKyNkZWZpbmUJTE9HX1NFTlNFCQkweDRkCisjaWZkZWYgWFhYQ0FNCisjZGVmaW5lCU1PREVfU0VOU0VfMTAJCTB4NUEKKyNlbmRpZgorI2RlZmluZQlNT0RFX1NFTEVDVF8xMAkJMHg1NQorI2RlZmluZSBNT1ZFX01FRElVTSAgICAgCTB4YTUKKyNkZWZpbmUgUkVBRF8xMgkJCTB4YTgKKyNkZWZpbmUgV1JJVEVfMTIJCTB4YWEKKyNkZWZpbmUgUkVBRF9FTEVNRU5UX1NUQVRVUwkweGI4CisKKworLyoKKyAqIERldmljZSBUeXBlcworICovCisjZGVmaW5lIFRfRElSRUNUCTB4MDAKKyNkZWZpbmUgVF9TRVFVRU5USUFMCTB4MDEKKyNkZWZpbmUgVF9QUklOVEVSCTB4MDIKKyNkZWZpbmUgVF9QUk9DRVNTT1IJMHgwMworI2RlZmluZSBUX1dPUk0JCTB4MDQKKyNkZWZpbmUgVF9DRFJPTQkJMHgwNQorI2RlZmluZSBUX1NDQU5ORVIgCTB4MDYKKyNkZWZpbmUgVF9PUFRJQ0FMIAkweDA3CisjZGVmaW5lIFRfQ0hBTkdFUgkweDA4CisjZGVmaW5lIFRfQ09NTQkJMHgwOQorI2RlZmluZSBUX0FTQzAJCTB4MGEKKyNkZWZpbmUgVF9BU0MxCQkweDBiCisjZGVmaW5lCVRfU1RPUkFSUkFZCTB4MGMKKyNkZWZpbmUJVF9FTkNMT1NVUkUJMHgwZAorI2RlZmluZQlUX1JCQwkJMHgwZQorI2RlZmluZQlUX09DUlcJCTB4MGYKKyNkZWZpbmUgVF9OT0RFVklDRQkweDFGCisjZGVmaW5lCVRfQU5ZCQkweEZGCS8qIFVzZWQgaW4gUXVpcmsgdGFibGUgbWF0Y2hlcyAqLworCisjZGVmaW5lIFRfUkVNT1YJCTEKKyNkZWZpbmUJVF9GSVhFRAkJMAorCisvKgorICogVGhpcyBsZW5ndGggaXMgdGhlIGluaXRpYWwgaW5xdWlyeSBsZW5ndGggdXNlZCBieSB0aGUgcHJvYmUgY29kZSwgYXMgICAgCisgKiB3ZWxsIGFzIHRoZSBsZWdudGggbmVjZXNzYXJ5IGZvciBhaWNfcHJpbnRfaW5xdWlyeSgpIHRvIGZ1bmN0aW9uIAorICogY29ycmVjdGx5LiAgSWYgZWl0aGVyIHVzZSByZXF1aXJlcyBhIGRpZmZlcmVudCBsZW5ndGggaW4gdGhlIGZ1dHVyZSwgCisgKiB0aGUgdHdvIHZhbHVlcyBzaG91bGQgYmUgZGUtY291cGxlZC4KKyAqLworI2RlZmluZQlTSE9SVF9JTlFVSVJZX0xFTkdUSAkzNgorCitzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEKK3sKKwl1aW50OF90IGRldmljZTsKKyNkZWZpbmUJU0lEX1RZUEUoaW5xX2RhdGEpICgoaW5xX2RhdGEpLT5kZXZpY2UgJiAweDFmKQorI2RlZmluZQlTSURfUVVBTChpbnFfZGF0YSkgKCgoaW5xX2RhdGEpLT5kZXZpY2UgJiAweEUwKSA+PiA1KQorI2RlZmluZQlTSURfUVVBTF9MVV9DT05ORUNURUQJMHgwMAkvKgorCQkJCQkgKiBUaGUgc3BlY2lmaWVkIHBlcmlwaGVyYWwgZGV2aWNlCisJCQkJCSAqIHR5cGUgaXMgY3VycmVudGx5IGNvbm5lY3RlZCB0bworCQkJCQkgKiBsb2dpY2FsIHVuaXQuICBJZiB0aGUgdGFyZ2V0IGNhbm5vdAorCQkJCQkgKiBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgYSBwaHlzaWNhbAorCQkJCQkgKiBkZXZpY2UgaXMgY3VycmVudGx5IGNvbm5lY3RlZCwgaXQKKwkJCQkJICogc2hhbGwgYWxzbyB1c2UgdGhpcyBwZXJpcGhlcmFsCisJCQkJCSAqIHF1YWxpZmllciB3aGVuIHJldHVybmluZyB0aGUgSU5RVUlSWQorCQkJCQkgKiBkYXRhLiAgVGhpcyBwZXJpcGhlcmFsIHF1YWxpZmllcgorCQkJCQkgKiBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIGRldmljZSBpcworCQkJCQkgKiByZWFkeSBmb3IgYWNjZXNzIGJ5IHRoZSBpbml0aWF0b3IuCisJCQkJCSAqLworI2RlZmluZQlTSURfUVVBTF9MVV9PRkZMSU5FCTB4MDEJLyoKKwkJCQkJICogVGhlIHRhcmdldCBpcyBjYXBhYmxlIG9mIHN1cHBvcnRpbmcKKwkJCQkJICogdGhlIHNwZWNpZmllZCBwZXJpcGhlcmFsIGRldmljZSB0eXBlCisJCQkJCSAqIG9uIHRoaXMgbG9naWNhbCB1bml0OyBob3dldmVyLCB0aGUKKwkJCQkJICogcGh5c2ljYWwgZGV2aWNlIGlzIG5vdCBjdXJyZW50bHkKKwkJCQkJICogY29ubmVjdGVkIHRvIHRoaXMgbG9naWNhbCB1bml0LgorCQkJCQkgKi8KKyNkZWZpbmUgU0lEX1FVQUxfUlNWRAkJMHgwMgorI2RlZmluZQlTSURfUVVBTF9CQURfTFUJCTB4MDMJLyoKKwkJCQkJICogVGhlIHRhcmdldCBpcyBub3QgY2FwYWJsZSBvZgorCQkJCQkgKiBzdXBwb3J0aW5nIGEgcGh5c2ljYWwgZGV2aWNlIG9uCisJCQkJCSAqIHRoaXMgbG9naWNhbCB1bml0LiBGb3IgdGhpcworCQkJCQkgKiBwZXJpcGhlcmFsIHF1YWxpZmllciB0aGUgcGVyaXBoZXJhbAorCQkJCQkgKiBkZXZpY2UgdHlwZSBzaGFsbCBiZSBzZXQgdG8gMUZoIHRvCisJCQkJCSAqIHByb3ZpZGUgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzCisJCQkJCSAqIHZlcnNpb25zIG9mIFNDU0kuIEFsbCBvdGhlcgorCQkJCQkgKiBwZXJpcGhlcmFsIGRldmljZSB0eXBlIHZhbHVlcyBhcmUKKwkJCQkJICogcmVzZXJ2ZWQgZm9yIHRoaXMgcGVyaXBoZXJhbAorCQkJCQkgKiBxdWFsaWZpZXIuCisJCQkJCSAqLworI2RlZmluZQlTSURfUVVBTF9JU19WRU5ET1JfVU5JUVVFKGlucV9kYXRhKSAoKFNJRF9RVUFMKGlucV9kYXRhKSAmIDB4MDgpICE9IDApCisJdWludDhfdCBkZXZfcXVhbDI7CisjZGVmaW5lCVNJRF9RVUFMMgkweDdGCisjZGVmaW5lCVNJRF9JU19SRU1PVkFCTEUoaW5xX2RhdGEpICgoKGlucV9kYXRhKS0+ZGV2X3F1YWwyICYgMHg4MCkgIT0gMCkKKwl1aW50OF90IHZlcnNpb247CisjZGVmaW5lIFNJRF9BTlNJX1JFVihpbnFfZGF0YSkgKChpbnFfZGF0YSktPnZlcnNpb24gJiAweDA3KQorI2RlZmluZQkJU0NTSV9SRVZfMAkJMAorI2RlZmluZQkJU0NTSV9SRVZfQ0NTCQkxCisjZGVmaW5lCQlTQ1NJX1JFVl8yCQkyCisjZGVmaW5lCQlTQ1NJX1JFVl9TUEMJCTMKKyNkZWZpbmUJCVNDU0lfUkVWX1NQQzIJCTQKKworI2RlZmluZSBTSURfRUNNQQkweDM4CisjZGVmaW5lIFNJRF9JU08JCTB4QzAKKwl1aW50OF90IHJlc3BvbnNlX2Zvcm1hdDsKKyNkZWZpbmUgU0lEX0FFTkMJMHg4MAorI2RlZmluZSBTSURfVHJtSU9QCTB4NDAKKwl1aW50OF90IGFkZGl0aW9uYWxfbGVuZ3RoOworCXVpbnQ4X3QgcmVzZXJ2ZWRbMl07CisJdWludDhfdCBmbGFnczsKKyNkZWZpbmUJU0lEX1NmdFJlCTB4MDEKKyNkZWZpbmUJU0lEX0NtZFF1ZQkweDAyCisjZGVmaW5lCVNJRF9MaW5rZWQJMHgwOAorI2RlZmluZQlTSURfU3luYwkweDEwCisjZGVmaW5lCVNJRF9XQnVzMTYJMHgyMAorI2RlZmluZQlTSURfV0J1czMyCTB4NDAKKyNkZWZpbmUJU0lEX1JlbEFkcgkweDgwCisjZGVmaW5lIFNJRF9WRU5ET1JfU0laRSAgIDgKKwljaGFyCSB2ZW5kb3JbU0lEX1ZFTkRPUl9TSVpFXTsKKyNkZWZpbmUgU0lEX1BST0RVQ1RfU0laRSAgMTYKKwljaGFyCSBwcm9kdWN0W1NJRF9QUk9EVUNUX1NJWkVdOworI2RlZmluZSBTSURfUkVWSVNJT05fU0laRSA0CisJY2hhcgkgcmV2aXNpb25bU0lEX1JFVklTSU9OX1NJWkVdOworCS8qCisJICogVGhlIGZvbGxvd2luZyBmaWVsZHMgd2VyZSB0YWtlbiBmcm9tIFNDU0kgUHJpbWFyeSBDb21tYW5kcyAtIDIKKwkgKiAoU1BDLTIpIFJldmlzaW9uIDE0LCBEYXRlZCAxMSBOb3ZlbWJlciAxOTk5CisJICovCisjZGVmaW5lCVNJRF9WRU5ET1JfU1BFQ0lGSUNfMF9TSVpFCTIwCisJdWludDhfdCB2ZW5kb3Jfc3BlY2lmaWMwW1NJRF9WRU5ET1JfU1BFQ0lGSUNfMF9TSVpFXTsKKwkvKgorCSAqIEFuIGV4dGVuc2lvbiBvZiBTQ1NJIFBhcmFsbGVsIFNwZWNpZmljIFZhbHVlcworCSAqLworI2RlZmluZQlTSURfU1BJX0lVUwkJMHgwMQorI2RlZmluZQlTSURfU1BJX1FBUwkJMHgwMgorI2RlZmluZQlTSURfU1BJX0NMT0NLX1NUCTB4MDAKKyNkZWZpbmUJU0lEX1NQSV9DTE9DS19EVAkweDA0CisjZGVmaW5lCVNJRF9TUElfQ0xPQ0tfRFRfU1QJMHgwQworI2RlZmluZQlTSURfU1BJX01BU0sJCTB4MEYKKwl1aW50OF90IHNwaTNkYXRhOworCXVpbnQ4X3QgcmVzZXJ2ZWQyOworCS8qCisJICogVmVyc2lvbiBEZXNjcmlwdG9ycywgc3RvcmVkIDIgYnl0ZSB2YWx1ZXMuCisJICovCisJdWludDhfdCB2ZXJzaW9uMVsyXTsKKwl1aW50OF90IHZlcnNpb24yWzJdOworCXVpbnQ4X3QgdmVyc2lvbjNbMl07CisJdWludDhfdCB2ZXJzaW9uNFsyXTsKKwl1aW50OF90IHZlcnNpb241WzJdOworCXVpbnQ4X3QgdmVyc2lvbjZbMl07CisJdWludDhfdCB2ZXJzaW9uN1syXTsKKwl1aW50OF90IHZlcnNpb244WzJdOworCisJdWludDhfdCByZXNlcnZlZDNbMjJdOworCisjZGVmaW5lCVNJRF9WRU5ET1JfU1BFQ0lGSUNfMV9TSVpFCTE2MAorCXVpbnQ4X3QgdmVuZG9yX3NwZWNpZmljMVtTSURfVkVORE9SX1NQRUNJRklDXzFfU0laRV07Cit9OworCitzdHJ1Y3Qgc2NzaV92cGRfdW5pdF9zZXJpYWxfbnVtYmVyCit7CisJdWludDhfdCBkZXZpY2U7CisJdWludDhfdCBwYWdlX2NvZGU7CisjZGVmaW5lIFNWUERfVU5JVF9TRVJJQUxfTlVNQkVSCTB4ODAKKwl1aW50OF90IHJlc2VydmVkOworCXVpbnQ4X3QgbGVuZ3RoOyAvKiBzZXJpYWwgbnVtYmVyIGxlbmd0aCAqLworI2RlZmluZSBTVlBEX1NFUklBTF9OVU1fU0laRSAyNTEKKwl1aW50OF90IHNlcmlhbF9udW1bU1ZQRF9TRVJJQUxfTlVNX1NJWkVdOworfTsKKworc3RydWN0IHNjc2lfcmVhZF9jYXBhY2l0eQoreworCXVpbnQ4X3Qgb3Bjb2RlOworCXVpbnQ4X3QgYnl0ZTI7CisJdWludDhfdCBhZGRyWzRdOworCXVpbnQ4X3QgdW51c2VkWzNdOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX3JlYWRfY2FwYWNpdHlfZGF0YQoreworCXVpbnQ4X3QgYWRkcls0XTsKKwl1aW50OF90IGxlbmd0aFs0XTsKK307CisKK3N0cnVjdCBzY3NpX3JlcG9ydF9sdW5zCit7CisJdWludDhfdCBvcGNvZGU7CisJdWludDhfdCBieXRlMjsKKwl1aW50OF90IHVudXNlZFszXTsKKwl1aW50OF90IGFkZHJbNF07CisJdWludDhfdCBjb250cm9sOworfTsKKworc3RydWN0IHNjc2lfcmVwb3J0X2x1bnNfZGF0YSB7CisJdWludDhfdCBsZW5ndGhbNF07CS8qIGxlbmd0aCBvZiBMVU4gaW52ZW50b3J5LCBpbiBieXRlcyAqLworCXVpbnQ4X3QgcmVzZXJ2ZWRbNF07CS8qIHVudXNlZCAqLworCS8qCisJICogTFVOIGludmVudG9yeS0gd2Ugb25seSBzdXBwb3J0IHRoZSB0eXBlIHplcm8gZm9ybSBmb3Igbm93LgorCSAqLworCXN0cnVjdCB7CisJCXVpbnQ4X3QgbHVuZGF0YVs4XTsKKwl9IGx1bnNbMV07Cit9OworI2RlZmluZQlSUExfTFVOREFUQV9BVFlQX01BU0sJMHhjMAkvKiBNQlogZm9yIHR5cGUgMCBsdW4gKi8KKyNkZWZpbmUJUlBMX0xVTkRBVEFfVDBMVU4JMQkvKiBAIGx1bmRhdGFbMV0gKi8KKworCitzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhCit7CisJdWludDhfdCBlcnJvcl9jb2RlOworI2RlZmluZQlTU0RfRVJSQ09ERQkJCTB4N0YKKyNkZWZpbmUJCVNTRF9DVVJSRU5UX0VSUk9SCTB4NzAKKyNkZWZpbmUJCVNTRF9ERUZFUlJFRF9FUlJPUgkweDcxCisjZGVmaW5lCVNTRF9FUlJDT0RFX1ZBTElECTB4ODAJCisJdWludDhfdCBzZWdtZW50OworCXVpbnQ4X3QgZmxhZ3M7CisjZGVmaW5lCVNTRF9LRVkJCQkJMHgwRgorI2RlZmluZQkJU1NEX0tFWV9OT19TRU5TRQkweDAwCisjZGVmaW5lCQlTU0RfS0VZX1JFQ09WRVJFRF9FUlJPUgkweDAxCisjZGVmaW5lCQlTU0RfS0VZX05PVF9SRUFEWQkweDAyCisjZGVmaW5lCQlTU0RfS0VZX01FRElVTV9FUlJPUgkweDAzCisjZGVmaW5lCQlTU0RfS0VZX0hBUkRXQVJFX0VSUk9SCTB4MDQKKyNkZWZpbmUJCVNTRF9LRVlfSUxMRUdBTF9SRVFVRVNUCTB4MDUKKyNkZWZpbmUJCVNTRF9LRVlfVU5JVF9BVFRFTlRJT04JMHgwNgorI2RlZmluZQkJU1NEX0tFWV9EQVRBX1BST1RFQ1QJMHgwNworI2RlZmluZQkJU1NEX0tFWV9CTEFOS19DSEVDSwkweDA4CisjZGVmaW5lCQlTU0RfS0VZX1ZlbmRvcl9TcGVjaWZpYwkweDA5CisjZGVmaW5lCQlTU0RfS0VZX0NPUFlfQUJPUlRFRAkweDBhCisjZGVmaW5lCQlTU0RfS0VZX0FCT1JURURfQ09NTUFORAkweDBiCQkKKyNkZWZpbmUJCVNTRF9LRVlfRVFVQUwJCTB4MGMKKyNkZWZpbmUJCVNTRF9LRVlfVk9MVU1FX09WRVJGTE9XCTB4MGQKKyNkZWZpbmUJCVNTRF9LRVlfTUlTQ09NUEFSRQkweDBlCisjZGVmaW5lCQlTU0RfS0VZX1JFU0VSVkVECTB4MGYJCQkKKyNkZWZpbmUJU1NEX0lMSQkJMHgyMAorI2RlZmluZQlTU0RfRU9NCQkweDQwCisjZGVmaW5lCVNTRF9GSUxFTUFSSwkweDgwCisJdWludDhfdCBpbmZvWzRdOworCXVpbnQ4X3QgZXh0cmFfbGVuOworCXVpbnQ4X3QgY21kX3NwZWNfaW5mb1s0XTsKKwl1aW50OF90IGFkZF9zZW5zZV9jb2RlOworCXVpbnQ4X3QgYWRkX3NlbnNlX2NvZGVfcXVhbDsKKwl1aW50OF90IGZydTsKKwl1aW50OF90IHNlbnNlX2tleV9zcGVjWzNdOworI2RlZmluZQlTU0RfU0NTX1ZBTElECQkweDgwCisjZGVmaW5lIFNTRF9GSUVMRFBUUl9DTUQJMHg0MAorI2RlZmluZSBTU0RfQklUUFRSX1ZBTElECTB4MDgKKyNkZWZpbmUgU1NEX0JJVFBUUl9WQUxVRQkweDA3CisjZGVmaW5lIFNTRF9NSU5fU0laRSAxOAorCXVpbnQ4X3QgZXh0cmFfYnl0ZXNbMTRdOworI2RlZmluZSBTU0RfRlVMTF9TSVpFIHNpemVvZihzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhKQorfTsKKworc3RydWN0IHNjc2lfbW9kZV9oZWFkZXJfNgoreworCXVpbnQ4X3QgZGF0YV9sZW5ndGg7CS8qIFNlbnNlIGRhdGEgbGVuZ3RoICovCisJdWludDhfdCBtZWRpdW1fdHlwZTsKKwl1aW50OF90IGRldl9zcGVjOworCXVpbnQ4X3QgYmxrX2Rlc2NfbGVuOworfTsKKworc3RydWN0IHNjc2lfbW9kZV9oZWFkZXJfMTAKK3sKKwl1aW50OF90IGRhdGFfbGVuZ3RoWzJdOy8qIFNlbnNlIGRhdGEgbGVuZ3RoICovCisJdWludDhfdCBtZWRpdW1fdHlwZTsKKwl1aW50OF90IGRldl9zcGVjOworCXVpbnQ4X3QgdW51c2VkWzJdOworCXVpbnQ4X3QgYmxrX2Rlc2NfbGVuWzJdOworfTsKKworc3RydWN0IHNjc2lfbW9kZV9wYWdlX2hlYWRlcgoreworCXVpbnQ4X3QgcGFnZV9jb2RlOworCXVpbnQ4X3QgcGFnZV9sZW5ndGg7Cit9OworCitzdHJ1Y3Qgc2NzaV9tb2RlX2Jsa19kZXNjCit7CisJdWludDhfdCBkZW5zaXR5OworCXVpbnQ4X3QgbmJsb2Nrc1szXTsKKwl1aW50OF90IHJlc2VydmVkOworCXVpbnQ4X3QgYmxrbGVuWzNdOworfTsKKworI2RlZmluZQlTQ1NJX0RFRkFVTFRfREVOU0lUWQkweDAwCS8qIHVzZSAnZGVmYXVsdCcgZGVuc2l0eSAqLworI2RlZmluZQlTQ1NJX1NBTUVfREVOU0lUWQkweDdmCS8qIHVzZSAnc2FtZScgZGVuc2l0eS0gPj0gU0NTSS0yIG9ubHkgKi8KKworCisvKgorICogU3RhdHVzIEJ5dGUKKyAqLworI2RlZmluZQlTQ1NJX1NUQVRVU19PSwkJCTB4MDAKKyNkZWZpbmUJU0NTSV9TVEFUVVNfQ0hFQ0tfQ09ORAkJMHgwMgorI2RlZmluZQlTQ1NJX1NUQVRVU19DT05EX01FVAkJMHgwNAorI2RlZmluZQlTQ1NJX1NUQVRVU19CVVNZCQkweDA4CisjZGVmaW5lIFNDU0lfU1RBVFVTX0lOVEVSTUVECQkweDEwCisjZGVmaW5lIFNDU0lfU1RBVFVTX0lOVEVSTUVEX0NPTkRfTUVUCTB4MTQKKyNkZWZpbmUgU0NTSV9TVEFUVVNfUkVTRVJWX0NPTkZMSUNUCTB4MTgKKyNkZWZpbmUgU0NTSV9TVEFUVVNfQ01EX1RFUk1JTkFURUQJMHgyMgkvKiBPYnNvbGV0ZSBpbiBTQU0tMiAqLworI2RlZmluZSBTQ1NJX1NUQVRVU19RVUVVRV9GVUxMCQkweDI4CisjZGVmaW5lIFNDU0lfU1RBVFVTX0FDQV9BQ1RJVkUJCTB4MzAKKyNkZWZpbmUgU0NTSV9TVEFUVVNfVEFTS19BQk9SVEVECTB4NDAKKworc3RydWN0IHNjc2lfaW5xdWlyeV9wYXR0ZXJuIHsKKwl1aW50OF90ICAgdHlwZTsKKwl1aW50OF90ICAgbWVkaWFfdHlwZTsKKyNkZWZpbmUJU0lQX01FRElBX1JFTU9WQUJMRQkweDAxCisjZGVmaW5lCVNJUF9NRURJQV9GSVhFRAkJMHgwMgorCWNvbnN0IGNoYXIgKnZlbmRvcjsKKwljb25zdCBjaGFyICpwcm9kdWN0OworCWNvbnN0IGNoYXIgKnJldmlzaW9uOworfTsgCisKK3N0cnVjdCBzY3NpX3N0YXRpY19pbnF1aXJ5X3BhdHRlcm4geworCXVpbnQ4X3QgICB0eXBlOworCXVpbnQ4X3QgICBtZWRpYV90eXBlOworCWNoYXIgICAgICAgdmVuZG9yW1NJRF9WRU5ET1JfU0laRSsxXTsKKwljaGFyICAgICAgIHByb2R1Y3RbU0lEX1BST0RVQ1RfU0laRSsxXTsKKwljaGFyICAgICAgIHJldmlzaW9uW1NJRF9SRVZJU0lPTl9TSVpFKzFdOworfTsKKworc3RydWN0IHNjc2lfc2Vuc2VfcXVpcmtfZW50cnkgeworCXN0cnVjdCBzY3NpX2lucXVpcnlfcGF0dGVybglpbnFfcGF0OworCWludAkJCQludW1fc2Vuc2Vfa2V5czsKKwlpbnQJCQkJbnVtX2FzY3M7CisJc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeQkqc2Vuc2Vfa2V5X2luZm87CisJc3RydWN0IGFzY190YWJsZV9lbnRyeQkJKmFzY19pbmZvOworfTsKKworc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeSB7CisJdWludDhfdCAgICBzZW5zZV9rZXk7CisJdWludDMyX3QgICBhY3Rpb247CisJY29uc3QgY2hhciAqZGVzYzsKK307CisKK3N0cnVjdCBhc2NfdGFibGVfZW50cnkgeworCXVpbnQ4X3QgICAgYXNjOworCXVpbnQ4X3QgICAgYXNjcTsKKwl1aW50MzJfdCAgIGFjdGlvbjsKKwljb25zdCBjaGFyICpkZXNjOworfTsKKworc3RydWN0IG9wX3RhYmxlX2VudHJ5IHsKKwl1aW50OF90ICAgIG9wY29kZTsKKwl1aW50MTZfdCAgIG9wbWFzazsKKwljb25zdCBjaGFyICAqZGVzYzsKK307CisKK3N0cnVjdCBzY3NpX29wX3F1aXJrX2VudHJ5IHsKKwlzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X3BhdHRlcm4JaW5xX3BhdDsKKwlpbnQJCQkJbnVtX29wczsKKwlzdHJ1Y3Qgb3BfdGFibGVfZW50cnkJCSpvcF90YWJsZTsKK307CisKK3R5cGVkZWYgZW51bSB7CisJU1NTX0ZMQUdfTk9ORQkJPSAweDAwLAorCVNTU19GTEFHX1BSSU5UX0NPTU1BTkQJPSAweDAxCit9IHNjc2lfc2Vuc2Vfc3RyaW5nX2ZsYWdzOworCitleHRlcm4gY29uc3QgY2hhciAqc2NzaV9zZW5zZV9rZXlfdGV4dFtdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBMYXJnZSBEaXNrIEhhbmRsaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorc3RhdGljIF9faW5saW5lIGludCBhaWNfc2VjdG9yX2Rpdih1X2xvbmcgY2FwYWNpdHksIGludCBoZWFkcywgaW50IHNlY3RvcnMpOworCitzdGF0aWMgX19pbmxpbmUgaW50CithaWNfc2VjdG9yX2Rpdih1X2xvbmcgY2FwYWNpdHksIGludCBoZWFkcywgaW50IHNlY3RvcnMpCit7CisJcmV0dXJuIChjYXBhY2l0eSAvIChoZWFkcyAqIHNlY3RvcnMpKTsKK30KKyNlbHNlCitzdGF0aWMgX19pbmxpbmUgaW50IGFpY19zZWN0b3JfZGl2KHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgaGVhZHMsIGludCBzZWN0b3JzKTsKKworc3RhdGljIF9faW5saW5lIGludAorYWljX3NlY3Rvcl9kaXYoc2VjdG9yX3QgY2FwYWNpdHksIGludCBoZWFkcywgaW50IHNlY3RvcnMpCit7CisJLyogdWdseSwgdWdseSBzZWN0b3JfZGl2IGNhbGxpbmcgY29udmVudGlvbi4uICovCisJc2VjdG9yX2RpdihjYXBhY2l0eSwgKGhlYWRzICogc2VjdG9ycykpOworCXJldHVybiAoaW50KWNhcGFjaXR5OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1vZHVsZSBMaWJyYXJ5IEhhY2sgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogV2hhdCB3ZSdkIGxpa2UgdG8gZG8gaXMgaGF2ZSBhIHNpbmdsZSAic2NzaSBsaWJyYXJ5IiBtb2R1bGUgdGhhdCBib3RoIHRoZQorICogYWljN3h4eCBhbmQgYWljNzl4eCBkcml2ZXJzIGNvdWxkIGxvYWQgYW5kIGRlcGVuZCBvbi4gIEEgY3Vyc29yeSBleGFtaW5hdGlvbgorICogb2YgaW1wbGVtZW50aW5nIG1vZHVsZSBkZXBlbmRlbmNpZXMgaW4gTGludXggKGhhbmRsaW5nIHRoZSBpbnN0YWxsIGFuZAorICogaW5pdHJkIGNhc2VzKSBkb2VzIG5vdCBsb29rIHByb21pc3NpbmcuICBGb3Igbm93LCB3ZSBqdXN0IGR1cGxpY2F0ZSB0aGlzCisgKiBjb2RlIGluIGJvdGggZHJpdmVycyB1c2luZyBhIHNpbXBsZSBzeW1ib2wgcmVuYW1pbmcgc2NoZW1lIHRoYXQgaGlkZXMgdGhpcworICogaGFjayBmcm9tIHRoZSBkcml2ZXJzLgorICovCisjZGVmaW5lIEFJQ19MSUJfRU5UUllfQ09OQ0FUKHgsIHByZWZpeCkJcHJlZml4ICMjIHgKKyNkZWZpbmUJQUlDX0xJQl9FTlRSWV9FWFBBTkQoeCwgcHJlZml4KSBBSUNfTElCX0VOVFJZX0NPTkNBVCh4LCBwcmVmaXgpCisjZGVmaW5lIEFJQ19MSUJfRU5UUlkoeCkJCUFJQ19MSUJfRU5UUllfRVhQQU5EKHgsIEFJQ19MSUJfUFJFRklYKQorCisjZGVmaW5lCWFpY19zZW5zZV9kZXNjCQkJQUlDX0xJQl9FTlRSWShfc2Vuc2VfZGVzYykKKyNkZWZpbmUJYWljX3NlbnNlX2Vycm9yX2FjdGlvbgkJQUlDX0xJQl9FTlRSWShfc2Vuc2VfZXJyb3JfYWN0aW9uKQorI2RlZmluZQlhaWNfZXJyb3JfYWN0aW9uCQlBSUNfTElCX0VOVFJZKF9lcnJvcl9hY3Rpb24pCisjZGVmaW5lCWFpY19vcF9kZXNjCQkJQUlDX0xJQl9FTlRSWShfb3BfZGVzYykKKyNkZWZpbmUJYWljX2NkYl9zdHJpbmcJCQlBSUNfTElCX0VOVFJZKF9jZGJfc3RyaW5nKQorI2RlZmluZSBhaWNfcHJpbnRfaW5xdWlyeQkJQUlDX0xJQl9FTlRSWShfcHJpbnRfaW5xdWlyeSkKKyNkZWZpbmUgYWljX2NhbGNfc3luY3NyYXRlCQlBSUNfTElCX0VOVFJZKF9jYWxjX3N5bmNyYXRlKQorI2RlZmluZQlhaWNfY2FsY19zeW5jcGFyYW0JCUFJQ19MSUJfRU5UUlkoX2NhbGNfc3luY3BhcmFtKQorI2RlZmluZQlhaWNfY2FsY19zcGVlZAkJCUFJQ19MSUJfRU5UUlkoX2NhbGNfc3BlZWQpCisjZGVmaW5lCWFpY19pbnF1aXJ5X21hdGNoCQlBSUNfTElCX0VOVFJZKF9pbnF1aXJ5X21hdGNoKQorI2RlZmluZQlhaWNfc3RhdGljX2lucXVpcnlfbWF0Y2gJQUlDX0xJQl9FTlRSWShfc3RhdGljX2lucXVpcnlfbWF0Y2gpCisjZGVmaW5lCWFpY19wYXJzZV9icmFjZV9vcHRpb24JCUFJQ19MSUJfRU5UUlkoX3BhcnNlX2JyYWNlX29wdGlvbikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAkJCWFpY19zZW5zZV9kZXNjKGludCAvKnNlbnNlX2tleSovLCBpbnQgLyphc2MqLywKKwkJCQkgICAgICAgaW50IC8qYXNjcSovLCBzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEqLAorCQkJCSAgICAgICBjb25zdCBjaGFyKiogLypzZW5zZV9rZXlfZGVzYyovLAorCQkJCSAgICAgICBjb25zdCBjaGFyKiogLyphc2NfZGVzYyovKTsKK2FpY19zZW5zZV9hY3Rpb24JYWljX3NlbnNlX2Vycm9yX2FjdGlvbihzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhKiwKKwkJCQkJICAgICAgIHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSosCisJCQkJCSAgICAgICB1aW50MzJfdCAvKnNlbnNlX2ZsYWdzKi8pOwordWludDMyX3QJCWFpY19lcnJvcl9hY3Rpb24oc3RydWN0IHNjc2lfY21uZCAqLAorCQkJCQkgc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhICosCisJCQkJCSBjYW1fc3RhdHVzLCB1X2ludCk7CisKKyNkZWZpbmUJU0ZfUkVUUllfVUEJMHgwMQorI2RlZmluZSBTRl9OT19QUklOVAkweDAyCisjZGVmaW5lIFNGX1FVSUVUX0lSCTB4MDQJLyogQmUgcXVpZXQgYWJvdXQgSWxsZWdhbCBSZXF1ZXN0IHJlcG9uc2VzICovCisjZGVmaW5lIFNGX1BSSU5UX0FMV0FZUwkweDA4CisKKworY29uc3QgY2hhciAqCWFpY19vcF9kZXNjKHVpbnQxNl90IC8qb3Bjb2RlKi8sIHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSopOworY2hhciAqCQlhaWNfY2RiX3N0cmluZyh1aW50OF90KiAvKmNkYl9wdHIqLywgY2hhciogLypjZGJfc3RyaW5nKi8sCisJCQkgICAgICAgc2l6ZV90IC8qbGVuKi8pOwordm9pZAkJYWljX3ByaW50X2lucXVpcnkoc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhKik7CisKK3VfaW50CQlhaWNfY2FsY19zeW5jc3JhdGUodV9pbnQgLypwZXJpb2RfZmFjdG9yKi8pOwordV9pbnQJCWFpY19jYWxjX3N5bmNwYXJhbSh1X2ludCAvKnBlcmlvZCovKTsKK3VfaW50CQlhaWNfY2FsY19zcGVlZCh1X2ludCB3aWR0aCwgdV9pbnQgcGVyaW9kLCB1X2ludCBvZmZzZXQsCisJCQkgICAgICAgdV9pbnQgbWluX3JhdGUpOworCQoraW50CQlhaWNfaW5xdWlyeV9tYXRjaChjYWRkcl90IC8qaW5xYnVmZmVyKi8sCisJCQkJICBjYWRkcl90IC8qdGFibGVfZW50cnkqLyk7CitpbnQJCWFpY19zdGF0aWNfaW5xdWlyeV9tYXRjaChjYWRkcl90IC8qaW5xYnVmZmVyKi8sCisJCQkJCSBjYWRkcl90IC8qdGFibGVfZW50cnkqLyk7CisKK3R5cGVkZWYgdm9pZCBhaWNfb3B0aW9uX2NhbGxiYWNrX3QodV9sb25nLCBpbnQsIGludCwgaW50MzJfdCk7CitjaGFyICoJCWFpY19wYXJzZV9icmFjZV9vcHRpb24oY2hhciAqb3B0X25hbWUsIGNoYXIgKm9wdF9hcmcsCisJCQkJICAgICAgIGNoYXIgKmVuZCwgaW50IGRlcHRoLAorCQkJCSAgICAgICBhaWNfb3B0aW9uX2NhbGxiYWNrX3QgKiwgdV9sb25nKTsKKworc3RhdGljIF9faW5saW5lIHZvaWQJIHNjc2lfZXh0cmFjdF9zZW5zZShzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhICpzZW5zZSwKKwkJCQkJICAgIGludCAqZXJyb3JfY29kZSwgaW50ICpzZW5zZV9rZXksCisJCQkJCSAgICBpbnQgKmFzYywgaW50ICphc2NxKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCSBzY3NpX3VsdG8yYih1aW50MzJfdCB2YWwsIHVpbnQ4X3QgKmJ5dGVzKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCSBzY3NpX3VsdG8zYih1aW50MzJfdCB2YWwsIHVpbnQ4X3QgKmJ5dGVzKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCSBzY3NpX3VsdG80Yih1aW50MzJfdCB2YWwsIHVpbnQ4X3QgKmJ5dGVzKTsKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdCBzY3NpXzJidG91bCh1aW50OF90ICpieXRlcyk7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3Qgc2NzaV8zYnRvdWwodWludDhfdCAqYnl0ZXMpOworc3RhdGljIF9faW5saW5lIGludDMyX3QJIHNjc2lfM2J0b2wodWludDhfdCAqYnl0ZXMpOworc3RhdGljIF9faW5saW5lIHVpbnQzMl90IHNjc2lfNGJ0b3VsKHVpbnQ4X3QgKmJ5dGVzKTsKKworc3RhdGljIF9faW5saW5lIHZvaWQgc2NzaV9leHRyYWN0X3NlbnNlKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEgKnNlbnNlLAorCQkJCSAgICAgICBpbnQgKmVycm9yX2NvZGUsIGludCAqc2Vuc2Vfa2V5LAorCQkJCSAgICAgICBpbnQgKmFzYywgaW50ICphc2NxKQoreworCSplcnJvcl9jb2RlID0gc2Vuc2UtPmVycm9yX2NvZGUgJiBTU0RfRVJSQ09ERTsKKwkqc2Vuc2Vfa2V5ID0gc2Vuc2UtPmZsYWdzICYgU1NEX0tFWTsKKwkqYXNjID0gKHNlbnNlLT5leHRyYV9sZW4gPj0gNSkgPyBzZW5zZS0+YWRkX3NlbnNlX2NvZGUgOiAwOworCSphc2NxID0gKHNlbnNlLT5leHRyYV9sZW4gPj0gNikgPyBzZW5zZS0+YWRkX3NlbnNlX2NvZGVfcXVhbCA6IDA7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitzY3NpX3VsdG8yYih1aW50MzJfdCB2YWwsIHVpbnQ4X3QgKmJ5dGVzKQoreworCisJYnl0ZXNbMF0gPSAodmFsID4+IDgpICYgMHhmZjsKKwlieXRlc1sxXSA9IHZhbCAmIDB4ZmY7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitzY3NpX3VsdG8zYih1aW50MzJfdCB2YWwsIHVpbnQ4X3QgKmJ5dGVzKQoreworCisJYnl0ZXNbMF0gPSAodmFsID4+IDE2KSAmIDB4ZmY7CisJYnl0ZXNbMV0gPSAodmFsID4+IDgpICYgMHhmZjsKKwlieXRlc1syXSA9IHZhbCAmIDB4ZmY7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitzY3NpX3VsdG80Yih1aW50MzJfdCB2YWwsIHVpbnQ4X3QgKmJ5dGVzKQoreworCisJYnl0ZXNbMF0gPSAodmFsID4+IDI0KSAmIDB4ZmY7CisJYnl0ZXNbMV0gPSAodmFsID4+IDE2KSAmIDB4ZmY7CisJYnl0ZXNbMl0gPSAodmFsID4+IDgpICYgMHhmZjsKKwlieXRlc1szXSA9IHZhbCAmIDB4ZmY7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdAorc2NzaV8yYnRvdWwodWludDhfdCAqYnl0ZXMpCit7CisJdWludDMyX3QgcnY7CisKKwlydiA9IChieXRlc1swXSA8PCA4KSB8CisJICAgICBieXRlc1sxXTsKKwlyZXR1cm4gKHJ2KTsKK30KKworc3RhdGljIF9faW5saW5lIHVpbnQzMl90CitzY3NpXzNidG91bCh1aW50OF90ICpieXRlcykKK3sKKwl1aW50MzJfdCBydjsKKworCXJ2ID0gKGJ5dGVzWzBdIDw8IDE2KSB8CisJICAgICAoYnl0ZXNbMV0gPDwgOCkgfAorCSAgICAgYnl0ZXNbMl07CisJcmV0dXJuIChydik7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQzMl90IAorc2NzaV8zYnRvbCh1aW50OF90ICpieXRlcykKK3sKKwl1aW50MzJfdCByYyA9IHNjc2lfM2J0b3VsKGJ5dGVzKTsKKyAKKwlpZiAocmMgJiAweDAwODAwMDAwKQorCQlyYyB8PSAweGZmMDAwMDAwOworCisJcmV0dXJuIChpbnQzMl90KSByYzsKK30KKworc3RhdGljIF9faW5saW5lIHVpbnQzMl90CitzY3NpXzRidG91bCh1aW50OF90ICpieXRlcykKK3sKKwl1aW50MzJfdCBydjsKKworCXJ2ID0gKGJ5dGVzWzBdIDw8IDI0KSB8CisJICAgICAoYnl0ZXNbMV0gPDwgMTYpIHwKKwkgICAgIChieXRlc1syXSA8PCA4KSB8CisJICAgICBieXRlc1szXTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyogTWFjcm9zIGZvciBnZW5lcmF0aW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgUENJIElEIHRhYmxlcy4gKi8KKworI2RlZmluZSBHRVRJRCh2LCBzKSAodW5zaWduZWQpKCgodikgPj4gKHMpKSAmIDB4RkZGRiA/OiBQQ0lfQU5ZX0lEKQorCisjZGVmaW5lIElEX0MoeCwgYykJCQkJCQlcCit7CQkJCQkJCQlcCisJR0VUSUQoeCwzMiksIEdFVElEKHgsNDgpLCBHRVRJRCh4LDApLCBHRVRJRCh4LDE2KSwJXAorCShjKSA8PCA4LCAweEZGRkYwMCwgMAkJCQkJXAorfQorCisjZGVmaW5lIElEMkMoeCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlJRF9DKHgsIFBDSV9DTEFTU19TVE9SQUdFX1NDU0kpLCBcCisJSURfQyh4LCBQQ0lfQ0xBU1NfU1RPUkFHRV9SQUlEKQorCisjZGVmaW5lIElESVJPQyh4KSAgKCh4KSB8IH5JRF9BTExfSVJPQ19NQVNLKQorCisvKiBHZW5lcmF0ZSBJRHMgZm9yIGFsbCAxNiBwb3NzaWJpbGl0ZXMuCisgKiBUaGUgYXJndW1lbnQgaGFzIGFscmVhZHkgbWFza2VkIG91dAorICogdGhlIDQgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgZGV2aWNlIGlkLgorICogKGUuZy4sIG1hc2s6IElEXzkwMDVfR0VORVJJQ19NQVNLKS4KKyAqLworI2RlZmluZSBJRDE2KHgpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJSUQoeCksICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCUlEKCh4KSB8IDB4MDAwMTAwMDAwMDAwMDAwMHVsbCksIFwKKwlJRCgoeCkgfCAweDAwMDIwMDAwMDAwMDAwMDB1bGwpLCBcCisJSUQoKHgpIHwgMHgwMDAzMDAwMDAwMDAwMDAwdWxsKSwgXAorCUlEKCh4KSB8IDB4MDAwNDAwMDAwMDAwMDAwMHVsbCksIFwKKwlJRCgoeCkgfCAweDAwMDUwMDAwMDAwMDAwMDB1bGwpLCBcCisJSUQoKHgpIHwgMHgwMDA2MDAwMDAwMDAwMDAwdWxsKSwgXAorCUlEKCh4KSB8IDB4MDAwNzAwMDAwMDAwMDAwMHVsbCksIFwKKwlJRCgoeCkgfCAweDAwMDgwMDAwMDAwMDAwMDB1bGwpLCBcCisJSUQoKHgpIHwgMHgwMDA5MDAwMDAwMDAwMDAwdWxsKSwgXAorCUlEKCh4KSB8IDB4MDAwQTAwMDAwMDAwMDAwMHVsbCksIFwKKwlJRCgoeCkgfCAweDAwMEIwMDAwMDAwMDAwMDB1bGwpLCBcCisJSUQoKHgpIHwgMHgwMDBDMDAwMDAwMDAwMDAwdWxsKSwgXAorCUlEKCh4KSB8IDB4MDAwRDAwMDAwMDAwMDAwMHVsbCksIFwKKwlJRCgoeCkgfCAweDAwMEUwMDAwMDAwMDAwMDB1bGwpLCBcCisJSUQoKHgpIHwgMHgwMDBGMDAwMDAwMDAwMDAwdWxsKQorCisjZW5kaWYgLypfQUlDTElCX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2NhbS5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvY2FtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwYmEwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2NhbS5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogRGF0YSBzdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucyBmb3IgdGhlIENBTSBzeXN0ZW0uCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3IEp1c3RpbiBULiBHaWJicy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvbGludXgvZHJpdmVycy9zY3NpL2FpYzd4eHgvY2FtLmgjMTUgJAorICovCisKKyNpZm5kZWYgX0FJQzdYWFhfQ0FNX0gKKyNkZWZpbmUgX0FJQzdYWFhfQ0FNX0ggMQorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZQlDQU1fQlVTX1dJTERDQVJEICgodV9pbnQpfjApCisjZGVmaW5lCUNBTV9UQVJHRVRfV0lMRENBUkQgKCh1X2ludCl+MCkKKyNkZWZpbmUJQ0FNX0xVTl9XSUxEQ0FSRCAoKHVfaW50KX4wKQorCisvKiBDQU0gU3RhdHVzIGZpZWxkIHZhbHVlcyAqLwordHlwZWRlZiBlbnVtIHsKKwlDQU1fUkVRX0lOUFJPRywJCS8qIENDQiByZXF1ZXN0IGlzIGluIHByb2dyZXNzICovCisJQ0FNX1JFUV9DTVAsCQkvKiBDQ0IgcmVxdWVzdCBjb21wbGV0ZWQgd2l0aG91dCBlcnJvciAqLworCUNBTV9SRVFfQUJPUlRFRCwJLyogQ0NCIHJlcXVlc3QgYWJvcnRlZCBieSB0aGUgaG9zdCAqLworCUNBTV9VQV9BQk9SVCwJCS8qIFVuYWJsZSB0byBhYm9ydCBDQ0IgcmVxdWVzdCAqLworCUNBTV9SRVFfQ01QX0VSUiwJLyogQ0NCIHJlcXVlc3QgY29tcGxldGVkIHdpdGggYW4gZXJyb3IgKi8KKwlDQU1fQlVTWSwJCS8qIENBTSBzdWJzeXRlbSBpcyBidXN5ICovCisJQ0FNX1JFUV9JTlZBTElELAkvKiBDQ0IgcmVxdWVzdCB3YXMgaW52YWxpZCAqLworCUNBTV9QQVRIX0lOVkFMSUQsCS8qIFN1cHBsaWVkIFBhdGggSUQgaXMgaW52YWxpZCAqLworCUNBTV9TRUxfVElNRU9VVCwJLyogVGFyZ2V0IFNlbGVjdGlvbiBUaW1lb3V0ICovCisJQ0FNX0NNRF9USU1FT1VULAkvKiBDb21tYW5kIHRpbWVvdXQgKi8KKwlDQU1fU0NTSV9TVEFUVVNfRVJST1IsCS8qIFNDU0kgZXJyb3IsIGxvb2sgYXQgZXJyb3IgY29kZSBpbiBDQ0IgKi8KKwlDQU1fU0NTSV9CVVNfUkVTRVQsCS8qIFNDU0kgQnVzIFJlc2V0IFNlbnQvUmVjZWl2ZWQgKi8KKwlDQU1fVU5DT1JfUEFSSVRZLAkvKiBVbmNvcnJlY3RhYmxlIHBhcml0eSBlcnJvciBvY2N1cnJlZCAqLworCUNBTV9BVVRPU0VOU0VfRkFJTCwJLyogQXV0b3NlbnNlOiByZXF1ZXN0IHNlbnNlIGNtZCBmYWlsICovCisJQ0FNX05PX0hCQSwJCS8qIE5vIEhCQSBEZXRlY3RlZCBFcnJvciAqLworCUNBTV9EQVRBX1JVTl9FUlIsCS8qIERhdGEgT3ZlcnJ1biBlcnJvciAqLworCUNBTV9VTkVYUF9CVVNGUkVFLAkvKiBVbmV4cGVjdGVkIEJ1cyBGcmVlICovCisJQ0FNX1NFUVVFTkNFX0ZBSUwsCS8qIFByb3RvY29sIFZpb2xhdGlvbiAqLworCUNBTV9DQ0JfTEVOX0VSUiwJLyogQ0NCIGxlbmd0aCBzdXBwbGllZCBpcyBpbmFkZXF1YXRlICovCisJQ0FNX1BST1ZJREVfRkFJTCwJLyogVW5hYmxlIHRvIHByb3ZpZGUgcmVxdWVzdGVkIGNhcGFiaWxpdHkgKi8KKwlDQU1fQkRSX1NFTlQsCQkvKiBBIFNDU0kgQkRSIG1zZyB3YXMgc2VudCB0byB0YXJnZXQgKi8KKwlDQU1fUkVRX1RFUk1JTywJCS8qIENDQiByZXF1ZXN0IHRlcm1pbmF0ZWQgYnkgdGhlIGhvc3QgKi8KKwlDQU1fVU5SRUNfSEJBX0VSUk9SLAkvKiBVbnJlY292ZXJhYmxlIEhvc3QgQnVzIEFkYXB0ZXIgRXJyb3IgKi8KKwlDQU1fUkVRX1RPT19CSUcsCS8qIFRoZSByZXF1ZXN0IHdhcyB0b28gbGFyZ2UgZm9yIHRoaXMgaG9zdCAqLworCUNBTV9VQV9URVJNSU8sCQkvKiBVbmFibGUgdG8gdGVybWluYXRlIEkvTyBDQ0IgcmVxdWVzdCAqLworCUNBTV9NU0dfUkVKRUNUX1JFQywJLyogTWVzc2FnZSBSZWplY3QgUmVjZWl2ZWQgKi8KKwlDQU1fREVWX05PVF9USEVSRSwJLyogU0NTSSBEZXZpY2UgTm90IEluc3RhbGxlZC90aGVyZSAqLworCUNBTV9SRVNSQ19VTkFWQUlMLAkvKiBSZXNvdXJjZSBVbmF2YWlsYWJsZSAqLworCS8qCisJICogVGhpcyByZXF1ZXN0IHNob3VsZCBiZSByZXF1ZXVlZCB0byBwcmVzZXJ2ZQorCSAqIHRyYW5zYWN0aW9uIG9yZGVyaW5nLiAgVGhpcyB0eXBpY2FsbHkgb2NjdXJzCisJICogd2hlbiB0aGUgU0lNIHJlY29nbml6ZXMgYW4gZXJyb3IgdGhhdCBzaG91bGQKKwkgKiBmcmVlemUgdGhlIHF1ZXVlIGFuZCBtdXN0IHBsYWNlIGFkZGl0aW9uYWwKKwkgKiByZXF1ZXN0cyBmb3IgdGhlIHRhcmdldCBhdCB0aGUgc2ltIGxldmVsCisJICogYmFjayBpbnRvIHRoZSBYUFQgcXVldWUuCisJICovCisJQ0FNX1JFUVVFVUVfUkVRLAorCUNBTV9ERVZfUUZSWk4JCT0gMHg0MCwKKworCUNBTV9TVEFUVVNfTUFTSwkJPSAweDNGCit9IGNhbV9zdGF0dXM7CisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIGFzeW5jaHJvbm91cyBjYWxsYmFjayBDQ0IgZmllbGRzLgorICovCit0eXBlZGVmIGVudW0geworCUFDX0dFVERFVl9DSEFOR0VECT0gMHg4MDAsLyogR2V0ZGV2IGluZm8gbWlnaHQgaGF2ZSBjaGFuZ2VkICovCisJQUNfSU5RX0NIQU5HRUQJCT0gMHg0MDAsLyogSW5xdWlyeSBpbmZvIG1pZ2h0IGhhdmUgY2hhbmdlZCAqLworCUFDX1RSQU5TRkVSX05FRwkJPSAweDIwMCwvKiBOZXcgdHJhbnNmZXIgc2V0dGluZ3MgaW4gZWZmZWN0ICovCisJQUNfTE9TVF9ERVZJQ0UJCT0gMHgxMDAsLyogQSBkZXZpY2Ugd2VudCBhd2F5ICovCisJQUNfRk9VTkRfREVWSUNFCQk9IDB4MDgwLC8qIEEgbmV3IGRldmljZSB3YXMgZm91bmQgKi8KKwlBQ19QQVRIX0RFUkVHSVNURVJFRAk9IDB4MDQwLC8qIEEgcGF0aCBoYXMgZGUtcmVnaXN0ZXJlZCAqLworCUFDX1BBVEhfUkVHSVNURVJFRAk9IDB4MDIwLC8qIEEgbmV3IHBhdGggaGFzIGJlZW4gcmVnaXN0ZXJlZCAqLworCUFDX1NFTlRfQkRSCQk9IDB4MDEwLC8qIEEgQkRSIG1lc3NhZ2Ugd2FzIHNlbnQgdG8gdGFyZ2V0ICovCisJQUNfU0NTSV9BRU4JCT0gMHgwMDgsLyogQSBTQ1NJIEFFTiBoYXMgYmVlbiByZWNlaXZlZCAqLworCUFDX1VOU09MX1JFU0VMCQk9IDB4MDAyLC8qIFVuc29saWNpdGVkIHJlc2VsZWN0aW9uIG9jY3VycmVkICovCisJQUNfQlVTX1JFU0VUCQk9IDB4MDAxIC8qIEEgU0NTSSBidXMgcmVzZXQgb2NjdXJyZWQgKi8KK30gYWNfY29kZTsKKwordHlwZWRlZiBlbnVtIHsKKwlDQU1fRElSX0lOCQk9IFNDU0lfREFUQV9SRUFELAorCUNBTV9ESVJfT1VUCQk9IFNDU0lfREFUQV9XUklURSwKKwlDQU1fRElSX05PTkUJCT0gU0NTSV9EQVRBX05PTkUKK30gY2NiX2ZsYWdzOworCisjZW5kaWYgLyogX0FJQzdYWFhfQ0FNX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L3F1ZXVlLmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZGY4MDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9xdWV1ZS5oCkBAIC0wLDAgKzEsNTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylxdWV1ZS5oCTguNSAoQmVya2VsZXkpIDgvMjAvOTQKKyAqICRGcmVlQlNEOiBzcmMvc3lzL3N5cy9xdWV1ZS5oLHYgMS4zOCAyMDAwLzA1LzI2IDAyOjA2OjU2IGpha2UgRXhwICQKKyAqLworCisjaWZuZGVmIF9TWVNfUVVFVUVfSF8KKyNkZWZpbmUJX1NZU19RVUVVRV9IXworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgZml2ZSB0eXBlcyBvZiBkYXRhIHN0cnVjdHVyZXM6IHNpbmdseS1saW5rZWQgbGlzdHMsCisgKiBzaW5nbHktbGlua2VkIHRhaWwgcXVldWVzLCBsaXN0cywgdGFpbCBxdWV1ZXMsIGFuZCBjaXJjdWxhciBxdWV1ZXMuCisgKgorICogQSBzaW5nbHktbGlua2VkIGxpc3QgaXMgaGVhZGVkIGJ5IGEgc2luZ2xlIGZvcndhcmQgcG9pbnRlci4gVGhlIGVsZW1lbnRzCisgKiBhcmUgc2luZ2x5IGxpbmtlZCBmb3IgbWluaW11bSBzcGFjZSBhbmQgcG9pbnRlciBtYW5pcHVsYXRpb24gb3ZlcmhlYWQgYXQKKyAqIHRoZSBleHBlbnNlIG9mIE8obikgcmVtb3ZhbCBmb3IgYXJiaXRyYXJ5IGVsZW1lbnRzLiBOZXcgZWxlbWVudHMgY2FuIGJlCisgKiBhZGRlZCB0byB0aGUgbGlzdCBhZnRlciBhbiBleGlzdGluZyBlbGVtZW50IG9yIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LgorICogRWxlbWVudHMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBoZWFkIG9mIHRoZSBsaXN0IHNob3VsZCB1c2UgdGhlIGV4cGxpY2l0CisgKiBtYWNybyBmb3IgdGhpcyBwdXJwb3NlIGZvciBvcHRpbXVtIGVmZmljaWVuY3kuIEEgc2luZ2x5LWxpbmtlZCBsaXN0IG1heQorICogb25seSBiZSB0cmF2ZXJzZWQgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLiAgU2luZ2x5LWxpbmtlZCBsaXN0cyBhcmUgaWRlYWwKKyAqIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsYXJnZSBkYXRhc2V0cyBhbmQgZmV3IG9yIG5vIHJlbW92YWxzIG9yIGZvcgorICogaW1wbGVtZW50aW5nIGEgTElGTyBxdWV1ZS4KKyAqCisgKiBBIHNpbmdseS1saW5rZWQgdGFpbCBxdWV1ZSBpcyBoZWFkZWQgYnkgYSBwYWlyIG9mIHBvaW50ZXJzLCBvbmUgdG8gdGhlCisgKiBoZWFkIG9mIHRoZSBsaXN0IGFuZCB0aGUgb3RoZXIgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QuIFRoZSBlbGVtZW50cyBhcmUKKyAqIHNpbmdseSBsaW5rZWQgZm9yIG1pbmltdW0gc3BhY2UgYW5kIHBvaW50ZXIgbWFuaXB1bGF0aW9uIG92ZXJoZWFkIGF0IHRoZQorICogZXhwZW5zZSBvZiBPKG4pIHJlbW92YWwgZm9yIGFyYml0cmFyeSBlbGVtZW50cy4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZAorICogdG8gdGhlIGxpc3QgYWZ0ZXIgYW4gZXhpc3RpbmcgZWxlbWVudCwgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yIGF0IHRoZQorICogZW5kIG9mIHRoZSBsaXN0LiBFbGVtZW50cyBiZWluZyByZW1vdmVkIGZyb20gdGhlIGhlYWQgb2YgdGhlIHRhaWwgcXVldWUKKyAqIHNob3VsZCB1c2UgdGhlIGV4cGxpY2l0IG1hY3JvIGZvciB0aGlzIHB1cnBvc2UgZm9yIG9wdGltdW0gZWZmaWNpZW5jeS4KKyAqIEEgc2luZ2x5LWxpbmtlZCB0YWlsIHF1ZXVlIG1heSBvbmx5IGJlIHRyYXZlcnNlZCBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uCisgKiBTaW5nbHktbGlua2VkIHRhaWwgcXVldWVzIGFyZSBpZGVhbCBmb3IgYXBwbGljYXRpb25zIHdpdGggbGFyZ2UgZGF0YXNldHMKKyAqIGFuZCBmZXcgb3Igbm8gcmVtb3ZhbHMgb3IgZm9yIGltcGxlbWVudGluZyBhIEZJRk8gcXVldWUuCisgKgorICogQSBsaXN0IGlzIGhlYWRlZCBieSBhIHNpbmdsZSBmb3J3YXJkIHBvaW50ZXIgKG9yIGFuIGFycmF5IG9mIGZvcndhcmQKKyAqIHBvaW50ZXJzIGZvciBhIGhhc2ggdGFibGUgaGVhZGVyKS4gVGhlIGVsZW1lbnRzIGFyZSBkb3VibHkgbGlua2VkCisgKiBzbyB0aGF0IGFuIGFyYml0cmFyeSBlbGVtZW50IGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgYSBuZWVkIHRvCisgKiB0cmF2ZXJzZSB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBiZWZvcmUKKyAqIG9yIGFmdGVyIGFuIGV4aXN0aW5nIGVsZW1lbnQgb3IgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuIEEgbGlzdAorICogbWF5IG9ubHkgYmUgdHJhdmVyc2VkIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbi4KKyAqCisgKiBBIHRhaWwgcXVldWUgaXMgaGVhZGVkIGJ5IGEgcGFpciBvZiBwb2ludGVycywgb25lIHRvIHRoZSBoZWFkIG9mIHRoZQorICogbGlzdCBhbmQgdGhlIG90aGVyIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LiBUaGUgZWxlbWVudHMgYXJlIGRvdWJseQorICogbGlua2VkIHNvIHRoYXQgYW4gYXJiaXRyYXJ5IGVsZW1lbnQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCBhIG5lZWQgdG8KKyAqIHRyYXZlcnNlIHRoZSBsaXN0LiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGJlZm9yZSBvcgorICogYWZ0ZXIgYW4gZXhpc3RpbmcgZWxlbWVudCwgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yIGF0IHRoZSBlbmQgb2YKKyAqIHRoZSBsaXN0LiBBIHRhaWwgcXVldWUgbWF5IGJlIHRyYXZlcnNlZCBpbiBlaXRoZXIgZGlyZWN0aW9uLgorICoKKyAqIEEgY2lyY2xlIHF1ZXVlIGlzIGhlYWRlZCBieSBhIHBhaXIgb2YgcG9pbnRlcnMsIG9uZSB0byB0aGUgaGVhZCBvZiB0aGUKKyAqIGxpc3QgYW5kIHRoZSBvdGhlciB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdC4gVGhlIGVsZW1lbnRzIGFyZSBkb3VibHkKKyAqIGxpbmtlZCBzbyB0aGF0IGFuIGFyYml0cmFyeSBlbGVtZW50IGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgYSBuZWVkIHRvCisgKiB0cmF2ZXJzZSB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBiZWZvcmUgb3IgYWZ0ZXIKKyAqIGFuIGV4aXN0aW5nIGVsZW1lbnQsIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBvciBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICogQSBjaXJjbGUgcXVldWUgbWF5IGJlIHRyYXZlcnNlZCBpbiBlaXRoZXIgZGlyZWN0aW9uLCBidXQgaGFzIGEgbW9yZQorICogY29tcGxleCBlbmQgb2YgbGlzdCBkZXRlY3Rpb24uCisgKgorICogRm9yIGRldGFpbHMgb24gdGhlIHVzZSBvZiB0aGVzZSBtYWNyb3MsIHNlZSB0aGUgcXVldWUoMykgbWFudWFsIHBhZ2UuCisgKgorICoKKyAqCQkJU0xJU1QJTElTVAlTVEFJTFEJVEFJTFEJQ0lSQ0xFUQorICogX0hFQUQJCSsJKwkrCSsJKworICogX0hFQURfSU5JVElBTElaRVIJKwkrCSsJKwkrCisgKiBfRU5UUlkJCSsJKwkrCSsJKworICogX0lOSVQJCSsJKwkrCSsJKworICogX0VNUFRZCQkrCSsJKwkrCSsKKyAqIF9GSVJTVAkJKwkrCSsJKwkrCisgKiBfTkVYVAkJKwkrCSsJKwkrCisgKiBfUFJFVgkJLQktCS0JKwkrCisgKiBfTEFTVAkJLQktCSsJKwkrCisgKiBfRk9SRUFDSAkJKwkrCSsJKwkrCisgKiBfRk9SRUFDSF9SRVZFUlNFCS0JLQktCSsJKworICogX0lOU0VSVF9IRUFECQkrCSsJKwkrCSsKKyAqIF9JTlNFUlRfQkVGT1JFCS0JKwktCSsJKworICogX0lOU0VSVF9BRlRFUgkrCSsJKwkrCSsKKyAqIF9JTlNFUlRfVEFJTAkJLQktCSsJKwkrCisgKiBfUkVNT1ZFX0hFQUQJCSsJLQkrCS0JLQorICogX1JFTU9WRQkJKwkrCSsJKwkrCisgKgorICovCisKKy8qCisgKiBTaW5nbHktbGlua2VkIExpc3QgZGVjbGFyYXRpb25zLgorICovCisjZGVmaW5lCVNMSVNUX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnNsaF9maXJzdDsJLyogZmlyc3QgZWxlbWVudCAqLwkJCVwKK30KKworI2RlZmluZQlTTElTVF9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCisJeyBOVUxMIH0KKyAKKyNkZWZpbmUJU0xJU1RfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzbGVfbmV4dDsJLyogbmV4dCBlbGVtZW50ICovCQkJXAorfQorIAorLyoKKyAqIFNpbmdseS1saW5rZWQgTGlzdCBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUJU0xJU1RfRU1QVFkoaGVhZCkJKChoZWFkKS0+c2xoX2ZpcnN0ID09IE5VTEwpCisKKyNkZWZpbmUJU0xJU1RfRklSU1QoaGVhZCkJKChoZWFkKS0+c2xoX2ZpcnN0KQorCisjZGVmaW5lCVNMSVNUX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJCVwKKwlmb3IgKCh2YXIpID0gU0xJU1RfRklSU1QoKGhlYWQpKTsJCQkJXAorCSAgICAodmFyKTsJCQkJCQkJXAorCSAgICAodmFyKSA9IFNMSVNUX05FWFQoKHZhciksIGZpZWxkKSkKKworI2RlZmluZQlTTElTVF9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJU0xJU1RfRklSU1QoKGhlYWQpKSA9IE5VTEw7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVNMSVNUX0lOU0VSVF9BRlRFUihzbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlTTElTVF9ORVhUKChlbG0pLCBmaWVsZCkgPSBTTElTVF9ORVhUKChzbGlzdGVsbSksIGZpZWxkKTsJXAorCVNMSVNUX05FWFQoKHNsaXN0ZWxtKSwgZmllbGQpID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJU0xJU1RfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlTTElTVF9ORVhUKChlbG0pLCBmaWVsZCkgPSBTTElTVF9GSVJTVCgoaGVhZCkpOwkJCVwKKwlTTElTVF9GSVJTVCgoaGVhZCkpID0gKGVsbSk7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVNMSVNUX05FWFQoZWxtLCBmaWVsZCkJKChlbG0pLT5maWVsZC5zbGVfbmV4dCkKKworI2RlZmluZQlTTElTVF9SRU1PVkUoaGVhZCwgZWxtLCB0eXBlLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoU0xJU1RfRklSU1QoKGhlYWQpKSA9PSAoZWxtKSkgewkJCQlcCisJCVNMSVNUX1JFTU9WRV9IRUFEKChoZWFkKSwgZmllbGQpOwkJCVwKKwl9CQkJCQkJCQlcCisJZWxzZSB7CQkJCQkJCQlcCisJCXN0cnVjdCB0eXBlICpjdXJlbG0gPSBTTElTVF9GSVJTVCgoaGVhZCkpOwkJXAorCQl3aGlsZSAoU0xJU1RfTkVYVChjdXJlbG0sIGZpZWxkKSAhPSAoZWxtKSkJCVwKKwkJCWN1cmVsbSA9IFNMSVNUX05FWFQoY3VyZWxtLCBmaWVsZCk7CQlcCisJCVNMSVNUX05FWFQoY3VyZWxtLCBmaWVsZCkgPQkJCQlcCisJCSAgICBTTElTVF9ORVhUKFNMSVNUX05FWFQoY3VyZWxtLCBmaWVsZCksIGZpZWxkKTsJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJU0xJU1RfUkVNT1ZFX0hFQUQoaGVhZCwgZmllbGQpIGRvIHsJCQkJXAorCVNMSVNUX0ZJUlNUKChoZWFkKSkgPSBTTElTVF9ORVhUKFNMSVNUX0ZJUlNUKChoZWFkKSksIGZpZWxkKTsJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIFNpbmdseS1saW5rZWQgVGFpbCBxdWV1ZSBkZWNsYXJhdGlvbnMuCisgKi8KKyNkZWZpbmUJU1RBSUxRX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnN0cWhfZmlyc3Q7LyogZmlyc3QgZWxlbWVudCAqLwkJCVwKKwlzdHJ1Y3QgdHlwZSAqKnN0cWhfbGFzdDsvKiBhZGRyIG9mIGxhc3QgbmV4dCBlbGVtZW50ICovCQlcCit9CisKKyNkZWZpbmUJU1RBSUxRX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJCVwKKwl7IE5VTEwsICYoaGVhZCkuc3RxaF9maXJzdCB9CisKKyNkZWZpbmUJU1RBSUxRX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc3RxZV9uZXh0OwkvKiBuZXh0IGVsZW1lbnQgKi8JCQlcCit9CisKKy8qCisgKiBTaW5nbHktbGlua2VkIFRhaWwgcXVldWUgZnVuY3Rpb25zLgorICovCisjZGVmaW5lCVNUQUlMUV9FTVBUWShoZWFkKQkoKGhlYWQpLT5zdHFoX2ZpcnN0ID09IE5VTEwpCisKKyNkZWZpbmUJU1RBSUxRX0ZJUlNUKGhlYWQpCSgoaGVhZCktPnN0cWhfZmlyc3QpCisKKyNkZWZpbmUJU1RBSUxRX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJXAorCWZvcigodmFyKSA9IFNUQUlMUV9GSVJTVCgoaGVhZCkpOwkJCQlcCisJICAgKHZhcik7CQkJCQkJCVwKKwkgICAodmFyKSA9IFNUQUlMUV9ORVhUKCh2YXIpLCBmaWVsZCkpCisKKyNkZWZpbmUJU1RBSUxRX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKKwlTVEFJTFFfRklSU1QoKGhlYWQpKSA9IE5VTEw7CQkJCQlcCisJKGhlYWQpLT5zdHFoX2xhc3QgPSAmU1RBSUxRX0ZJUlNUKChoZWFkKSk7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlTVEFJTFFfSU5TRVJUX0FGVEVSKGhlYWQsIHRxZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQlcCisJaWYgKChTVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpID0gU1RBSUxRX05FWFQoKHRxZWxtKSwgZmllbGQpKSA9PSBOVUxMKVwKKwkJKGhlYWQpLT5zdHFoX2xhc3QgPSAmU1RBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCVwKKwlTVEFJTFFfTkVYVCgodHFlbG0pLCBmaWVsZCkgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlTVEFJTFFfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKFNUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkgPSBTVEFJTFFfRklSU1QoKGhlYWQpKSkgPT0gTlVMTCkJXAorCQkoaGVhZCktPnN0cWhfbGFzdCA9ICZTVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpOwkJXAorCVNUQUlMUV9GSVJTVCgoaGVhZCkpID0gKGVsbSk7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVNUQUlMUV9JTlNFUlRfVEFJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCVNUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkgPSBOVUxMOwkJCQlcCisJU1RBSUxRX0xBU1QoKGhlYWQpKSA9IChlbG0pOwkJCQkJXAorCShoZWFkKS0+c3RxaF9sYXN0ID0gJlNUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCk7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlTVEFJTFFfTEFTVChoZWFkKQkoKihoZWFkKS0+c3RxaF9sYXN0KQorCisjZGVmaW5lCVNUQUlMUV9ORVhUKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQuc3RxZV9uZXh0KQorCisjZGVmaW5lCVNUQUlMUV9SRU1PVkUoaGVhZCwgZWxtLCB0eXBlLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoU1RBSUxRX0ZJUlNUKChoZWFkKSkgPT0gKGVsbSkpIHsJCQkJXAorCQlTVEFJTFFfUkVNT1ZFX0hFQUQoaGVhZCwgZmllbGQpOwkJCVwKKwl9CQkJCQkJCQlcCisJZWxzZSB7CQkJCQkJCQlcCisJCXN0cnVjdCB0eXBlICpjdXJlbG0gPSBTVEFJTFFfRklSU1QoKGhlYWQpKTsJCVwKKwkJd2hpbGUgKFNUQUlMUV9ORVhUKGN1cmVsbSwgZmllbGQpICE9IChlbG0pKQkJXAorCQkJY3VyZWxtID0gU1RBSUxRX05FWFQoY3VyZWxtLCBmaWVsZCk7CQlcCisJCWlmICgoU1RBSUxRX05FWFQoY3VyZWxtLCBmaWVsZCkgPQkJCVwKKwkJICAgICBTVEFJTFFfTkVYVChTVEFJTFFfTkVYVChjdXJlbG0sIGZpZWxkKSwgZmllbGQpKSA9PSBOVUxMKVwKKwkJCShoZWFkKS0+c3RxaF9sYXN0ID0gJlNUQUlMUV9ORVhUKChjdXJlbG0pLCBmaWVsZCk7XAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJU1RBSUxRX1JFTU9WRV9IRUFEKGhlYWQsIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoKFNUQUlMUV9GSVJTVCgoaGVhZCkpID0JCQkJCVwKKwkgICAgIFNUQUlMUV9ORVhUKFNUQUlMUV9GSVJTVCgoaGVhZCkpLCBmaWVsZCkpID09IE5VTEwpCQlcCisJCShoZWFkKS0+c3RxaF9sYXN0ID0gJlNUQUlMUV9GSVJTVCgoaGVhZCkpOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlTVEFJTFFfUkVNT1ZFX0hFQURfVU5USUwoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKFNUQUlMUV9GSVJTVCgoaGVhZCkpID0gU1RBSUxRX05FWFQoKGVsbSksIGZpZWxkKSkgPT0gTlVMTCkJXAorCQkoaGVhZCktPnN0cWhfbGFzdCA9ICZTVEFJTFFfRklSU1QoKGhlYWQpKTsJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBMaXN0IGRlY2xhcmF0aW9ucy4KKyAqLworI2RlZmluZQlMSVNUX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKmxoX2ZpcnN0OwkvKiBmaXJzdCBlbGVtZW50ICovCQkJXAorfQorCisjZGVmaW5lCUxJU1RfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCB9CisKKyNkZWZpbmUJTElTVF9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKmxlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKKwlzdHJ1Y3QgdHlwZSAqKmxlX3ByZXY7CS8qIGFkZHJlc3Mgb2YgcHJldmlvdXMgbmV4dCBlbGVtZW50ICovCVwKK30KKworLyoKKyAqIExpc3QgZnVuY3Rpb25zLgorICovCisKKyNkZWZpbmUJTElTVF9FTVBUWShoZWFkKQkoKGhlYWQpLT5saF9maXJzdCA9PSBOVUxMKQorCisjZGVmaW5lCUxJU1RfRklSU1QoaGVhZCkJKChoZWFkKS0+bGhfZmlyc3QpCisKKyNkZWZpbmUJTElTVF9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCQlcCisJZm9yICgodmFyKSA9IExJU1RfRklSU1QoKGhlYWQpKTsJCQkJXAorCSAgICAodmFyKTsJCQkJCQkJXAorCSAgICAodmFyKSA9IExJU1RfTkVYVCgodmFyKSwgZmllbGQpKQorCisjZGVmaW5lCUxJU1RfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCUxJU1RfRklSU1QoKGhlYWQpKSA9IE5VTEw7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCUxJU1RfSU5TRVJUX0FGVEVSKGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKChMSVNUX05FWFQoKGVsbSksIGZpZWxkKSA9IExJU1RfTkVYVCgobGlzdGVsbSksIGZpZWxkKSkgIT0gTlVMTClcCisJCUxJU1RfTkVYVCgobGlzdGVsbSksIGZpZWxkKS0+ZmllbGQubGVfcHJldiA9CQlcCisJCSAgICAmTElTVF9ORVhUKChlbG0pLCBmaWVsZCk7CQkJCVwKKwlMSVNUX05FWFQoKGxpc3RlbG0pLCBmaWVsZCkgPSAoZWxtKTsJCQkJXAorCShlbG0pLT5maWVsZC5sZV9wcmV2ID0gJkxJU1RfTkVYVCgobGlzdGVsbSksIGZpZWxkKTsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJTElTVF9JTlNFUlRfQkVGT1JFKGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLmxlX3ByZXYgPSAobGlzdGVsbSktPmZpZWxkLmxlX3ByZXY7CQlcCisJTElTVF9ORVhUKChlbG0pLCBmaWVsZCkgPSAobGlzdGVsbSk7CQkJCVwKKwkqKGxpc3RlbG0pLT5maWVsZC5sZV9wcmV2ID0gKGVsbSk7CQkJCVwKKwkobGlzdGVsbSktPmZpZWxkLmxlX3ByZXYgPSAmTElTVF9ORVhUKChlbG0pLCBmaWVsZCk7CQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCUxJU1RfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKChMSVNUX05FWFQoKGVsbSksIGZpZWxkKSA9IExJU1RfRklSU1QoKGhlYWQpKSkgIT0gTlVMTCkJXAorCQlMSVNUX0ZJUlNUKChoZWFkKSktPmZpZWxkLmxlX3ByZXYgPSAmTElTVF9ORVhUKChlbG0pLCBmaWVsZCk7XAorCUxJU1RfRklSU1QoKGhlYWQpKSA9IChlbG0pOwkJCQkJXAorCShlbG0pLT5maWVsZC5sZV9wcmV2ID0gJkxJU1RfRklSU1QoKGhlYWQpKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCUxJU1RfTkVYVChlbG0sIGZpZWxkKQkoKGVsbSktPmZpZWxkLmxlX25leHQpCisKKyNkZWZpbmUJTElTVF9SRU1PVkUoZWxtLCBmaWVsZCkgZG8gewkJCQkJXAorCWlmIChMSVNUX05FWFQoKGVsbSksIGZpZWxkKSAhPSBOVUxMKQkJCQlcCisJCUxJU1RfTkVYVCgoZWxtKSwgZmllbGQpLT5maWVsZC5sZV9wcmV2ID0gCQlcCisJCSAgICAoZWxtKS0+ZmllbGQubGVfcHJldjsJCQkJXAorCSooZWxtKS0+ZmllbGQubGVfcHJldiA9IExJU1RfTkVYVCgoZWxtKSwgZmllbGQpOwkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIFRhaWwgcXVldWUgZGVjbGFyYXRpb25zLgorICovCisjZGVmaW5lCVRBSUxRX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnRxaF9maXJzdDsJLyogZmlyc3QgZWxlbWVudCAqLwkJCVwKKwlzdHJ1Y3QgdHlwZSAqKnRxaF9sYXN0OwkvKiBhZGRyIG9mIGxhc3QgbmV4dCBlbGVtZW50ICovCQlcCit9CisKKyNkZWZpbmUJVEFJTFFfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCwgJihoZWFkKS50cWhfZmlyc3QgfQorCisjZGVmaW5lCVRBSUxRX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqdHFlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKKwlzdHJ1Y3QgdHlwZSAqKnRxZV9wcmV2OwkvKiBhZGRyZXNzIG9mIHByZXZpb3VzIG5leHQgZWxlbWVudCAqLwlcCit9CisKKy8qCisgKiBUYWlsIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlUQUlMUV9FTVBUWShoZWFkKQkoKGhlYWQpLT50cWhfZmlyc3QgPT0gTlVMTCkKKworI2RlZmluZQlUQUlMUV9GSVJTVChoZWFkKQkoKGhlYWQpLT50cWhfZmlyc3QpCisKKyNkZWZpbmUJVEFJTFFfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQkJXAorCWZvciAoKHZhcikgPSBUQUlMUV9GSVJTVCgoaGVhZCkpOwkJCQlcCisJICAgICh2YXIpOwkJCQkJCQlcCisJICAgICh2YXIpID0gVEFJTFFfTkVYVCgodmFyKSwgZmllbGQpKQorCisjZGVmaW5lCVRBSUxRX0ZPUkVBQ0hfUkVWRVJTRSh2YXIsIGhlYWQsIGhlYWRuYW1lLCBmaWVsZCkJCVwKKwlmb3IgKCh2YXIpID0gVEFJTFFfTEFTVCgoaGVhZCksIGhlYWRuYW1lKTsJCQlcCisJICAgICh2YXIpOwkJCQkJCQlcCisJICAgICh2YXIpID0gVEFJTFFfUFJFVigodmFyKSwgaGVhZG5hbWUsIGZpZWxkKSkKKworI2RlZmluZQlUQUlMUV9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJVEFJTFFfRklSU1QoKGhlYWQpKSA9IE5VTEw7CQkJCQlcCisJKGhlYWQpLT50cWhfbGFzdCA9ICZUQUlMUV9GSVJTVCgoaGVhZCkpOwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJVEFJTFFfSU5TRVJUX0FGVEVSKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKKwlpZiAoKFRBSUxRX05FWFQoKGVsbSksIGZpZWxkKSA9IFRBSUxRX05FWFQoKGxpc3RlbG0pLCBmaWVsZCkpICE9IE5VTEwpXAorCQlUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCktPmZpZWxkLnRxZV9wcmV2ID0gCQlcCisJCSAgICAmVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gJlRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCVwKKwlUQUlMUV9ORVhUKChsaXN0ZWxtKSwgZmllbGQpID0gKGVsbSk7CQkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAmVEFJTFFfTkVYVCgobGlzdGVsbSksIGZpZWxkKTsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJVEFJTFFfSU5TRVJUX0JFRk9SRShsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC50cWVfcHJldiA9IChsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXY7CQlcCisJVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpID0gKGxpc3RlbG0pOwkJCQlcCisJKihsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAoZWxtKTsJCQkJXAorCShsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAmVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlUQUlMUV9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpID0gVEFJTFFfRklSU1QoKGhlYWQpKSkgIT0gTlVMTCkJXAorCQlUQUlMUV9GSVJTVCgoaGVhZCkpLT5maWVsZC50cWVfcHJldiA9CQkJXAorCQkgICAgJlRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGhlYWQpLT50cWhfbGFzdCA9ICZUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCk7CQlcCisJVEFJTFFfRklSU1QoKGhlYWQpKSA9IChlbG0pOwkJCQkJXAorCShlbG0pLT5maWVsZC50cWVfcHJldiA9ICZUQUlMUV9GSVJTVCgoaGVhZCkpOwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJVEFJTFFfSU5TRVJUX1RBSUwoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkgPSBOVUxMOwkJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gKGhlYWQpLT50cWhfbGFzdDsJCQlcCisJKihoZWFkKS0+dHFoX2xhc3QgPSAoZWxtKTsJCQkJCVwKKwkoaGVhZCktPnRxaF9sYXN0ID0gJlRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVRBSUxRX0xBU1QoaGVhZCwgaGVhZG5hbWUpCQkJCQlcCisJKCooKChzdHJ1Y3QgaGVhZG5hbWUgKikoKGhlYWQpLT50cWhfbGFzdCkpLT50cWhfbGFzdCkpCisKKyNkZWZpbmUJVEFJTFFfTkVYVChlbG0sIGZpZWxkKSAoKGVsbSktPmZpZWxkLnRxZV9uZXh0KQorCisjZGVmaW5lCVRBSUxRX1BSRVYoZWxtLCBoZWFkbmFtZSwgZmllbGQpCQkJCVwKKwkoKigoKHN0cnVjdCBoZWFkbmFtZSAqKSgoZWxtKS0+ZmllbGQudHFlX3ByZXYpKS0+dHFoX2xhc3QpKQorCisjZGVmaW5lCVRBSUxRX1JFTU9WRShoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoKFRBSUxRX05FWFQoKGVsbSksIGZpZWxkKSkgIT0gTlVMTCkJCQkJXAorCQlUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCktPmZpZWxkLnRxZV9wcmV2ID0gCQlcCisJCSAgICAoZWxtKS0+ZmllbGQudHFlX3ByZXY7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCShoZWFkKS0+dHFoX2xhc3QgPSAoZWxtKS0+ZmllbGQudHFlX3ByZXY7CQlcCisJKihlbG0pLT5maWVsZC50cWVfcHJldiA9IFRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBDaXJjdWxhciBxdWV1ZSBkZWNsYXJhdGlvbnMuCisgKi8KKyNkZWZpbmUJQ0lSQ0xFUV9IRUFEKG5hbWUsIHR5cGUpCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKmNxaF9maXJzdDsJCS8qIGZpcnN0IGVsZW1lbnQgKi8JCVwKKwlzdHJ1Y3QgdHlwZSAqY3FoX2xhc3Q7CQkvKiBsYXN0IGVsZW1lbnQgKi8JCVwKK30KKworI2RlZmluZQlDSVJDTEVRX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJCVwKKwl7ICh2b2lkICopJihoZWFkKSwgKHZvaWQgKikmKGhlYWQpIH0KKworI2RlZmluZQlDSVJDTEVRX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqY3FlX25leHQ7CQkvKiBuZXh0IGVsZW1lbnQgKi8JCVwKKwlzdHJ1Y3QgdHlwZSAqY3FlX3ByZXY7CQkvKiBwcmV2aW91cyBlbGVtZW50ICovCQlcCit9CisKKy8qCisgKiBDaXJjdWxhciBxdWV1ZSBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUJQ0lSQ0xFUV9FTVBUWShoZWFkKQkoKGhlYWQpLT5jcWhfZmlyc3QgPT0gKHZvaWQgKikoaGVhZCkpCisKKyNkZWZpbmUJQ0lSQ0xFUV9GSVJTVChoZWFkKQkoKGhlYWQpLT5jcWhfZmlyc3QpCisKKyNkZWZpbmUJQ0lSQ0xFUV9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCVwKKwlmb3IgKCh2YXIpID0gQ0lSQ0xFUV9GSVJTVCgoaGVhZCkpOwkJCQlcCisJICAgICh2YXIpICE9ICh2b2lkICopKGhlYWQpOwkJCQkJXAorCSAgICAodmFyKSA9IENJUkNMRVFfTkVYVCgodmFyKSwgZmllbGQpKQorCisjZGVmaW5lCUNJUkNMRVFfRk9SRUFDSF9SRVZFUlNFKHZhciwgaGVhZCwgZmllbGQpCQkJXAorCWZvciAoKHZhcikgPSBDSVJDTEVRX0xBU1QoKGhlYWQpKTsJCQkJXAorCSAgICAodmFyKSAhPSAodm9pZCAqKShoZWFkKTsJCQkJCVwKKwkgICAgKHZhcikgPSBDSVJDTEVRX1BSRVYoKHZhciksIGZpZWxkKSkKKworI2RlZmluZQlDSVJDTEVRX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKKwlDSVJDTEVRX0ZJUlNUKChoZWFkKSkgPSAodm9pZCAqKShoZWFkKTsJCQkJXAorCUNJUkNMRVFfTEFTVCgoaGVhZCkpID0gKHZvaWQgKikoaGVhZCk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJQ0lSQ0xFUV9JTlNFUlRfQUZURVIoaGVhZCwgbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJXAorCUNJUkNMRVFfTkVYVCgoZWxtKSwgZmllbGQpID0gQ0lSQ0xFUV9ORVhUKChsaXN0ZWxtKSwgZmllbGQpOwlcCisJQ0lSQ0xFUV9QUkVWKChlbG0pLCBmaWVsZCkgPSAobGlzdGVsbSk7CQkJCVwKKwlpZiAoQ0lSQ0xFUV9ORVhUKChsaXN0ZWxtKSwgZmllbGQpID09ICh2b2lkICopKGhlYWQpKQkJXAorCQlDSVJDTEVRX0xBU1QoKGhlYWQpKSA9IChlbG0pOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQlDSVJDTEVRX1BSRVYoQ0lSQ0xFUV9ORVhUKChsaXN0ZWxtKSwgZmllbGQpLCBmaWVsZCkgPSAoZWxtKTtcCisJQ0lSQ0xFUV9ORVhUKChsaXN0ZWxtKSwgZmllbGQpID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJQ0lSQ0xFUV9JTlNFUlRfQkVGT1JFKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKKwlDSVJDTEVRX05FWFQoKGVsbSksIGZpZWxkKSA9IChsaXN0ZWxtKTsJCQkJXAorCUNJUkNMRVFfUFJFVigoZWxtKSwgZmllbGQpID0gQ0lSQ0xFUV9QUkVWKChsaXN0ZWxtKSwgZmllbGQpOwlcCisJaWYgKENJUkNMRVFfUFJFVigobGlzdGVsbSksIGZpZWxkKSA9PSAodm9pZCAqKShoZWFkKSkJCVwKKwkJQ0lSQ0xFUV9GSVJTVCgoaGVhZCkpID0gKGVsbSk7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCUNJUkNMRVFfTkVYVChDSVJDTEVRX1BSRVYoKGxpc3RlbG0pLCBmaWVsZCksIGZpZWxkKSA9IChlbG0pO1wKKwlDSVJDTEVRX1BSRVYoKGxpc3RlbG0pLCBmaWVsZCkgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlDSVJDTEVRX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJQ0lSQ0xFUV9ORVhUKChlbG0pLCBmaWVsZCkgPSBDSVJDTEVRX0ZJUlNUKChoZWFkKSk7CQlcCisJQ0lSQ0xFUV9QUkVWKChlbG0pLCBmaWVsZCkgPSAodm9pZCAqKShoZWFkKTsJCQlcCisJaWYgKENJUkNMRVFfTEFTVCgoaGVhZCkpID09ICh2b2lkICopKGhlYWQpKQkJCVwKKwkJQ0lSQ0xFUV9MQVNUKChoZWFkKSkgPSAoZWxtKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJQ0lSQ0xFUV9QUkVWKENJUkNMRVFfRklSU1QoKGhlYWQpKSwgZmllbGQpID0gKGVsbSk7CVwKKwlDSVJDTEVRX0ZJUlNUKChoZWFkKSkgPSAoZWxtKTsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJQ0lSQ0xFUV9JTlNFUlRfVEFJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCUNJUkNMRVFfTkVYVCgoZWxtKSwgZmllbGQpID0gKHZvaWQgKikoaGVhZCk7CQkJXAorCUNJUkNMRVFfUFJFVigoZWxtKSwgZmllbGQpID0gQ0lSQ0xFUV9MQVNUKChoZWFkKSk7CQlcCisJaWYgKENJUkNMRVFfRklSU1QoKGhlYWQpKSA9PSAodm9pZCAqKShoZWFkKSkJCQlcCisJCUNJUkNMRVFfRklSU1QoKGhlYWQpKSA9IChlbG0pOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQlDSVJDTEVRX05FWFQoQ0lSQ0xFUV9MQVNUKChoZWFkKSksIGZpZWxkKSA9IChlbG0pOwlcCisJQ0lSQ0xFUV9MQVNUKChoZWFkKSkgPSAoZWxtKTsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJQ0lSQ0xFUV9MQVNUKGhlYWQpCSgoaGVhZCktPmNxaF9sYXN0KQorCisjZGVmaW5lCUNJUkNMRVFfTkVYVChlbG0sZmllbGQpCSgoZWxtKS0+ZmllbGQuY3FlX25leHQpCisKKyNkZWZpbmUJQ0lSQ0xFUV9QUkVWKGVsbSxmaWVsZCkJKChlbG0pLT5maWVsZC5jcWVfcHJldikKKworI2RlZmluZQlDSVJDTEVRX1JFTU9WRShoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoQ0lSQ0xFUV9ORVhUKChlbG0pLCBmaWVsZCkgPT0gKHZvaWQgKikoaGVhZCkpCQlcCisJCUNJUkNMRVFfTEFTVCgoaGVhZCkpID0gQ0lSQ0xFUV9QUkVWKChlbG0pLCBmaWVsZCk7CVwKKwllbHNlCQkJCQkJCQlcCisJCUNJUkNMRVFfUFJFVihDSVJDTEVRX05FWFQoKGVsbSksIGZpZWxkKSwgZmllbGQpID0JXAorCQkgICAgQ0lSQ0xFUV9QUkVWKChlbG0pLCBmaWVsZCk7CQkJCVwKKwlpZiAoQ0lSQ0xFUV9QUkVWKChlbG0pLCBmaWVsZCkgPT0gKHZvaWQgKikoaGVhZCkpCQlcCisJCUNJUkNMRVFfRklSU1QoKGhlYWQpKSA9IENJUkNMRVFfTkVYVCgoZWxtKSwgZmllbGQpOwlcCisJZWxzZQkJCQkJCQkJXAorCQlDSVJDTEVRX05FWFQoQ0lSQ0xFUV9QUkVWKChlbG0pLCBmaWVsZCksIGZpZWxkKSA9CVwKKwkJICAgIENJUkNMRVFfTkVYVCgoZWxtKSwgZmllbGQpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZW5kaWYgLyogIV9TWVNfUVVFVUVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L3Njc2lfaXUuaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L3Njc2lfaXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWFmZDNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvc2NzaV9pdS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uCisgKi8KKyNpZm5kZWYJX1NDU0lfU0NTSV9JVV9ICisjZGVmaW5lIF9TQ1NJX1NDU0lfSVVfSCAxCisKK3N0cnVjdCBzY3NpX3N0YXR1c19pdV9oZWFkZXIKK3sKKwl1X2ludDhfdCByZXNlcnZlZFsyXTsKKwl1X2ludDhfdCBmbGFnczsKKyNkZWZpbmUJU0lVX1NOU1ZBTElEIDB4MgorI2RlZmluZQlTSVVfUlNQVkFMSUQgMHgxCisJdV9pbnQ4X3Qgc3RhdHVzOworCXVfaW50OF90IHNlbnNlX2xlbmd0aFs0XTsKKwl1X2ludDhfdCBwa3RfZmFpbHVyZXNfbGVuZ3RoWzRdOworCXVfaW50OF90IHBrdF9mYWlsdXJlc1sxXTsKK307CisKKyNkZWZpbmUgU0lVX1BLVEZBSUxfT0ZGU0VUKHNpdSkgMTIKKyNkZWZpbmUgU0lVX1BLVEZBSUxfQ09ERShzaXUpIChzY3NpXzRidG91bCgoc2l1KS0+cGt0X2ZhaWx1cmVzKSAmIDB4RkYpCisjZGVmaW5lCQlTSVVfUEZDX05PTkUJCQkwCisjZGVmaW5lCQlTSVVfUEZDX0NJVV9GSUVMRFNfSU5WQUxJRAkyCisjZGVmaW5lCQlTSVVfUEZDX1RNRl9OT1RfU1VQUE9SVEVECTQKKyNkZWZpbmUJCVNJVV9QRkNfVE1GX0ZBSUxFRAkJNQorI2RlZmluZQkJU0lVX1BGQ19JTlZBTElEX1RZUEVfQ09ERQk2CisjZGVmaW5lCQlTSVVfUEZDX0lMTEVHQUxfUkVRVUVTVAkJNworI2RlZmluZSBTSVVfU0VOU0VfT0ZGU0VUKHNpdSkJCQkJXAorICAgICgxMiArICgoKHNpdSktPmZsYWdzICYgU0lVX1JTUFZBTElEKQkJXAorCT8gc2NzaV80YnRvdWwoKHNpdSktPnBrdF9mYWlsdXJlc19sZW5ndGgpCVwKKwk6IDApKQorCisjZGVmaW5lCVNJVV9UQVNLTUdNVF9OT05FCQkweDAwCisjZGVmaW5lCVNJVV9UQVNLTUdNVF9BQk9SVF9UQVNLCQkweDAxCisjZGVmaW5lCVNJVV9UQVNLTUdNVF9BQk9SVF9UQVNLX1NFVAkweDAyCisjZGVmaW5lCVNJVV9UQVNLTUdNVF9DTEVBUl9UQVNLX1NFVAkweDA0CisjZGVmaW5lCVNJVV9UQVNLTUdNVF9MVU5fUkVTRVQJCTB4MDgKKyNkZWZpbmUJU0lVX1RBU0tNR01UX1RBUkdFVF9SRVNFVAkweDIwCisjZGVmaW5lCVNJVV9UQVNLTUdNVF9DTEVBUl9BQ0EJCTB4NDAKKyNlbmRpZiAvKl9TQ1NJX1NDU0lfSVVfSCovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9zY3NpX21lc3NhZ2UuaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L3Njc2lfbWVzc2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ODExZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9zY3NpX21lc3NhZ2UuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLgorICogJEZyZWVCU0Q6IHNyYy9zeXMvY2FtL3Njc2kvc2NzaV9tZXNzYWdlLmgsdiAxLjIgMjAwMC8wNS8wMSAyMDoyMToyOSBwZXRlciBFeHAgJAorICovCisKKy8qIE1lc3NhZ2VzICgxIGJ5dGUpICovCQkgICAgIC8qIEkvVCAoTSlhbmRhdG9yeSBvciAoTylwdGlvbmFsICovCisjZGVmaW5lIE1TR19DTURDT01QTEVURQkJMHgwMCAvKiBNL00gKi8KKyNkZWZpbmUgTVNHX1RBU0tfQ09NUExFVEUJMHgwMCAvKiBNL00gKi8gLyogU1BJMyBUZXJtaW5vbG9neSAqLworI2RlZmluZSBNU0dfRVhURU5ERUQJCTB4MDEgLyogTy9PICovCisjZGVmaW5lIE1TR19TQVZFREFUQVBPSU5URVIJMHgwMiAvKiBPL08gKi8KKyNkZWZpbmUgTVNHX1JFU1RPUkVQT0lOVEVSUwkweDAzIC8qIE8vTyAqLworI2RlZmluZSBNU0dfRElTQ09OTkVDVAkJMHgwNCAvKiBPL08gKi8KKyNkZWZpbmUgTVNHX0lOSVRJQVRPUl9ERVRfRVJSCTB4MDUgLyogTS9NICovCisjZGVmaW5lIE1TR19BQk9SVAkJMHgwNiAvKiBPL00gKi8KKyNkZWZpbmUgTVNHX0FCT1JUX1RBU0tfU0VUCTB4MDYgLyogTy9NICovIC8qIFNQSTMgVGVybWlub2xvZ3kgKi8KKyNkZWZpbmUgTVNHX01FU1NBR0VfUkVKRUNUCTB4MDcgLyogTS9NICovCisjZGVmaW5lIE1TR19OT09QCQkweDA4IC8qIE0vTSAqLworI2RlZmluZSBNU0dfUEFSSVRZX0VSUk9SCTB4MDkgLyogTS9NICovCisjZGVmaW5lIE1TR19MSU5LX0NNRF9DT01QTEVURQkweDBhIC8qIE8vTyAqLworI2RlZmluZSBNU0dfTElOS19DTURfQ09NUExFVEVGCTB4MGIgLyogTy9PICovCisjZGVmaW5lIE1TR19CVVNfREVWX1JFU0VUCTB4MGMgLyogTy9NICovCisjZGVmaW5lIE1TR19UQVJHRVRfUkVTRVQJMHgwYyAvKiBPL00gKi8gLyogU1BJMyBUZXJtaW5vbG9neSAqLworI2RlZmluZSBNU0dfQUJPUlRfVEFHCQkweDBkIC8qIE8vTyAqLworI2RlZmluZSBNU0dfQUJPUlRfVEFTSwkJMHgwZCAvKiBPL08gKi8gLyogU1BJMyBUZXJtaW5vbG9neSAqLworI2RlZmluZSBNU0dfQ0xFQVJfUVVFVUUJCTB4MGUgLyogTy9PICovCisjZGVmaW5lIE1TR19DTEVBUl9UQVNLX1NFVAkweDBlIC8qIE8vTyAqLyAvKiBTUEkzIFRlcm1pbm9sb2d5ICovCisjZGVmaW5lIE1TR19JTklUX1JFQ09WRVJZCTB4MGYgLyogTy9PICovIC8qIERlcHJlY2F0ZWQgaW4gU1BJMyAqLworI2RlZmluZSBNU0dfUkVMX1JFQ09WRVJZCTB4MTAgLyogTy9PICovIC8qIERlcHJlY2F0ZWQgaW4gU1BJMyAqLworI2RlZmluZSBNU0dfVEVSTV9JT19QUk9DCTB4MTEgLyogTy9PICovIC8qIERlcHJlY2F0ZWQgaW4gU1BJMyAqLworI2RlZmluZSBNU0dfQ0xFQVJfQUNBCQkweDE2IC8qIE8vTyAqLyAvKiBTUEkzICovCisjZGVmaW5lIE1TR19MT0dJQ0FMX1VOSVRfUkVTRVQJMHgxNyAvKiBPL08gKi8gLyogU1BJMyAqLworI2RlZmluZSBNU0dfUUFTX1JFUVVFU1QJCTB4NTUgLyogTy9PICovIC8qIFNQSTMgKi8KKworLyogTWVzc2FnZXMgKDIgYnl0ZSkgKi8KKyNkZWZpbmUgTVNHX1NJTVBMRV9RX1RBRwkweDIwIC8qIE8vTyAqLworI2RlZmluZSBNU0dfU0lNUExFX1RBU0sJCTB4MjAgLyogTy9PICovIC8qIFNQSTMgVGVybWlub2xvZ3kgKi8KKyNkZWZpbmUgTVNHX0hFQURfT0ZfUV9UQUcJMHgyMSAvKiBPL08gKi8KKyNkZWZpbmUgTVNHX0hFQURfT0ZfUVVFVUVfVEFTSwkweDIxIC8qIE8vTyAqLyAvKiBTUEkzIFRlcm1pbm9sb2d5ICovCisjZGVmaW5lIE1TR19PUkRFUkVEX1FfVEFHCTB4MjIgLyogTy9PICovCisjZGVmaW5lIE1TR19PUkRFUkVEX1RBU0sJMHgyMiAvKiBPL08gKi8gLyogU1BJMyBUZXJtaW5vbG9neSAqLworI2RlZmluZSBNU0dfSUdOX1dJREVfUkVTSURVRQkweDIzIC8qIE8vTyAqLworI2RlZmluZSBNU0dfQUNBX1RBU0sJCTB4MjQgLyogMC8wICovIC8qIFNQSTMgKi8KKworLyogSWRlbnRpZnkgbWVzc2FnZSAqLwkJICAgICAvKiBNL00gKi8JCisjZGVmaW5lIE1TR19JREVOVElGWUZMQUcJMHg4MCAKKyNkZWZpbmUgTVNHX0lERU5USUZZX0RJU0NGTEFHCTB4NDAgCisjZGVmaW5lIE1TR19JREVOVElGWShsdW4sIGRpc2MpCSgoKGRpc2MpID8gMHhjMCA6IE1TR19JREVOVElGWUZMQUcpIHwgKGx1bikpCisjZGVmaW5lIE1TR19JU0lERU5USUZZKG0pCSgobSkgJiBNU0dfSURFTlRJRllGTEFHKQorI2RlZmluZSBNU0dfSURFTlRJRllfTFVOTUFTSwkweDNGIAorCisvKiBFeHRlbmRlZCBtZXNzYWdlcyAob3Bjb2RlIGFuZCBsZW5ndGgpICovCisjZGVmaW5lIE1TR19FWFRfU0RUUgkJMHgwMQorI2RlZmluZSBNU0dfRVhUX1NEVFJfTEVOCTB4MDMKKworI2RlZmluZSBNU0dfRVhUX1dEVFIJCTB4MDMKKyNkZWZpbmUgTVNHX0VYVF9XRFRSX0xFTgkweDAyCisjZGVmaW5lIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQJMHgwMAorI2RlZmluZSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVAkweDAxCisjZGVmaW5lIE1TR19FWFRfV0RUUl9CVVNfMzJfQklUCTB4MDIgLyogRGVwcmVjYXRlZCBpbiBTUEkzICovCisKKyNkZWZpbmUgTVNHX0VYVF9QUFIJCTB4MDQgLyogU1BJMyAqLworI2RlZmluZSBNU0dfRVhUX1BQUl9MRU4JCTB4MDYKKyNkZWZpbmUJTVNHX0VYVF9QUFJfUENPTVBfRU4JMHg4MAorI2RlZmluZQlNU0dfRVhUX1BQUl9SVEkJCTB4NDAKKyNkZWZpbmUJTVNHX0VYVF9QUFJfUkRfU1RSTQkweDIwCisjZGVmaW5lCU1TR19FWFRfUFBSX1dSX0ZMT1cJMHgxMAorI2RlZmluZQlNU0dfRVhUX1BQUl9IT0xEX01DUwkweDA4CisjZGVmaW5lCU1TR19FWFRfUFBSX1FBU19SRVEJMHgwNAorI2RlZmluZQlNU0dfRVhUX1BQUl9EVF9SRVEJMHgwMgorI2RlZmluZSBNU0dfRVhUX1BQUl9JVV9SRVEJMHgwMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmU3YmIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkLmMKQEAgLTAsMCArMSwxMTE3OCBAQAorLyorTSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFkYXB0ZWMgQUlDN3h4eCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgSm9obiBBeWNvY2sKKyAqICAgVGhlIFVuaXZlcnNpdHkgb2YgQ2FsZ2FyeSBEZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBTb3VyY2VzIGluY2x1ZGUgdGhlIEFkYXB0ZWMgMTc0MCBkcml2ZXIgKGFoYTE3NDAuYyksIHRoZSBVbHRyYXN0b3IgMjRGCisgKiBkcml2ZXIgKHVsdHJhc3Rvci5jKSwgdmFyaW91cyBMaW51eCBrZXJuZWwgc291cmNlLCB0aGUgQWRhcHRlYyBFSVNBCisgKiBjb25maWcgZmlsZSAoIWFkcDc3NzEuY2ZnKSwgdGhlIEFkYXB0ZWMgQUhBLTI3NDBBIFNlcmllcyBVc2VyJ3MgR3VpZGUsCisgKiB0aGUgTGludXggS2VybmVsIEhhY2tlcidzIEd1aWRlLCBXcml0aW5nIGEgU0NTSSBEZXZpY2UgRHJpdmVyIGZvciBMaW51eCwKKyAqIHRoZSBBZGFwdGVjIDE1NDIgZHJpdmVyIChhaGExNTQyLmMpLCB0aGUgQWRhcHRlYyBFSVNBIG92ZXJsYXkgZmlsZQorICogKGFkcDc3NzAub3ZsKSwgdGhlIEFkYXB0ZWMgQUhBLTI3NDAgU2VyaWVzIFRlY2huaWNhbCBSZWZlcmVuY2UgTWFudWFsLAorICogdGhlIEFkYXB0ZWMgQUlDLTc3NzAgRGF0YSBCb29rLCB0aGUgQU5TSSBTQ1NJIHNwZWNpZmljYXRpb24sIHRoZQorICogQU5TSSBTQ1NJLTIgc3BlY2lmaWNhdGlvbiAoZHJhZnQgMTBjKSwgLi4uCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgTW9kaWZpY2F0aW9ucyBieSBEYW5pZWwgTS4gRWlzY2hlbiAoZGVpc2NoZW5AaXdvcmtzLkludGVyV29ya3Mub3JnKToKKyAqCisgKiAgU3Vic3RhbnRpYWxseSBtb2RpZmllZCB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHdpZGUgYW5kIHR3aW4gYnVzCisgKiAgYWRhcHRlcnMsIERNQWluZyBvZiBTQ0JzLCB0YWdnZWQgcXVldWVpbmcsIElSUSBzaGFyaW5nLCBidWcgZml4ZXMsCisgKiAgU0NCIHBhZ2luZywgYW5kIG90aGVyIHJld29yayBvZiB0aGUgY29kZS4KKyAqCisgKiAgUGFydHMgb2YgdGhpcyBkcml2ZXIgd2VyZSBhbHNvIGJhc2VkIG9uIHRoZSBGcmVlQlNEIGRyaXZlciBieQorICogIEp1c3RpbiBULiBHaWJicy4gIEhpcyBjb3B5cmlnaHQgZm9sbG93czoKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5NyBKdXN0aW4gR2liYnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgaW1tZWRpYXRlbHkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBXaGVyZSB0aGlzIFNvZnR3YXJlIGlzIGNvbWJpbmVkIHdpdGggc29mdHdhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIAorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYW5kIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIHdvdWxkIHJlcXVpcmUgdGhlIAorICogY29tYmluZWQgd29yayB0byBhbHNvIGJlIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMLCB0aGUgdGVybXMKKyAqIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSB3aWxsIGFwcGx5IGluIGFkZGl0aW9uIHRvIHRob3NlIG9mIHRoZQorICogR1BMIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBhbnkgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UgdGhhdAorICogY29uZmxpY3Qgd2l0aCwgb3IgYXJlIGV4cHJlc3NseSBwcm9oaWJpdGVkIGJ5LCB0aGUgR1BMLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogICAgICAkSWQ6IGFpYzd4eHguYyx2IDEuMTE5IDE5OTcvMDYvMjcgMTk6Mzk6MTggZ2liYnMgRXhwICQKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogIFRoYW5rcyBhbHNvIGdvIHRvIChpbiBhbHBoYWJldGljYWwgb3JkZXIpIHRoZSBmb2xsb3dpbmc6CisgKgorICogICAgUm9yeSBCb2x0ICAgICAtIFNlcXVlbmNlciBidWcgZml4ZXMKKyAqICAgIEpheSBFc3RhYnJvb2sgLSBJbml0aWFsIERFQyBBbHBoYSBzdXBwb3J0CisgKiAgICBEb3VnIExlZGZvcmQgIC0gTXVjaCBuZWVkZWQgYWJvcnQvcmVzZXQgYnVnIGZpeGVzCisgKiAgICBLYWkgTWFraXNhcmEgIC0gRE1BaW5nIG9mIFNDQnMKKyAqCisgKiAgQSBCb290IHRpbWUgb3B0aW9uIHdhcyBhbHNvIGFkZGVkIGZvciBub3QgcmVzZXR0aW5nIHRoZSBzY3NpIGJ1cy4KKyAqCisgKiAgICBGb3JtOiAgYWljN3h4eD1leHRlbmRlZAorICogICAgICAgICAgIGFpYzd4eHg9bm9fcmVzZXQKKyAqICAgICAgICAgICBhaWM3eHh4PXVsdHJhCisgKiAgICAgICAgICAgYWljN3h4eD1pcnFfdHJpZ2dlcjpbMCwxXSAgIyAwIGVkZ2UsIDEgbGV2ZWwKKyAqICAgICAgICAgICBhaWM3eHh4PXZlcmJvc2UKKyAqCisgKiAgRGFuaWVsIE0uIEVpc2NoZW4sIGRlaXNjaGVuQGl3b3Jrcy5JbnRlcldvcmtzLm9yZywgMS8yMy85NworICoKKyAqICAkSWQ6IGFpYzd4eHguYyx2IDQuMSAxOTk3LzA2LzEyIDA4OjIzOjQyIGRlYW5nIEV4cCAkCisgKi1NKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyorTSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRnVydGhlciBkcml2ZXIgbW9kaWZpY2F0aW9ucyBtYWRlIGJ5IERvdWcgTGVkZm9yZCA8ZGxlZGZvcmRAcmVkaGF0LmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OSBEb3VnIExlZGZvcmQKKyAqCisgKiBUaGVzZSBjaGFuZ2VzIGFyZSByZWxlYXNlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNpbmcgdGVybXMgYXMgdGhlIEZyZWVCU0QKKyAqIGRyaXZlciB3cml0dGVuIGJ5IEp1c3RpbiBHaWJicy4gIFBsZWFzZSBzZWUgaGlzIENvcHlyaWdodCBub3RpY2UgYWJvdmUKKyAqIGZvciB0aGUgZXhhY3QgdGVybXMgYW5kIGNvbmRpdGlvbnMgY292ZXJpbmcgbXkgY2hhbmdlcyBhcyB3ZWxsIGFzIHRoZQorICogd2FycmFudHkgc3RhdGVtZW50LgorICoKKyAqIE1vZGlmaWNhdGlvbnMgbWFkZSB0byB0aGUgYWljN3h4eC5jLHYgNC4xIGRyaXZlciBmcm9tIERhbiBFaXNjaGVuIGluY2x1ZGUKKyAqIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG86CisgKgorICogIDE6IEltcG9ydCBvZiB0aGUgbGF0ZXN0IEZyZWVCU0Qgc2VxdWVuY2VyIGNvZGUgZm9yIHRoaXMgZHJpdmVyCisgKiAgMjogTW9kaWZpY2F0aW9uIG9mIGtlcm5lbCBjb2RlIHRvIGFjY29tbW9kYXRlIGRpZmZlcmVudCBzZXF1ZW5jZXIgc2VtYW50aWNzCisgKiAgMzogRXh0ZW5zaXZlIGNoYW5nZXMgdGhyb3VnaG91dCBrZXJuZWwgcG9ydGlvbiBvZiBkcml2ZXIgdG8gaW1wcm92ZQorICogICAgIGFib3J0L3Jlc2V0IHByb2Nlc3NpbmcgYW5kIGVycm9yIGhhbm5kbGluZworICogIDQ6IE90aGVyIHdvcmsgY29udHJpYnV0ZWQgYnkgdmFyaW91cyBwZW9wbGUgb24gdGhlIEludGVybmV0CisgKiAgNTogQ2hhbmdlcyB0byBwcmludGsgaW5mb3JtYXRpb24gYW5kIHZlcmJvc2l0eSBzZWxlY3Rpb24gY29kZQorICogIDY6IEdlbmVyYWwgcmVsaWFiaWxpdHkgcmVsYXRlZCBjaGFuZ2VzLCBlc3BlY2lhbGx5IGluIElSUSBtYW5hZ2VtZW50CisgKiAgNzogTW9kaWZpY2F0aW9ucyB0byB0aGUgZGVmYXVsdCBwcm9iZS9hdHRhY2ggb3JkZXIgZm9yIHN1cHBvcnRlZCBjYXJkcworICogIDg6IFNNUCBmcmllbmRsaW5lc3MgaGFzIGJlZW4gaW1wcm92ZWQKKyAqCisgKiBPdmVyYWxsLCB0aGlzIGRyaXZlciByZXByZXNlbnRzIGEgc2lnbmlmaWNhbnQgZGVwYXJ0dXJlIGZyb20gdGhlIG9mZmljaWFsCisgKiBhaWM3eHh4IGRyaXZlciByZWxlYXNlZCBieSBEYW4gRWlzY2hlbiBpbiB0d28gd2F5cy4gIEZpcnN0LCBpbiB0aGUgY29kZQorICogaXRzZWxmLiAgQSBkaWZmIGJldHdlZW4gdGhlIHR3byB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgaXMgbm93IGEgc2V2ZXJhbAorICogdGhvdXNhbmQgbGluZSBkaWZmLiAgU2Vjb25kLCBpbiBhcHByb2FjaCB0byBzb2x2aW5nIHRoZSBzYW1lIHByb2JsZW0uICBUaGUKKyAqIHByb2JsZW0gaXMgaW1wb3J0aW5nIHRoZSBGcmVlQlNEIGFpYzd4eHggZHJpdmVyIGNvZGUgdG8gbGludXggY2FuIGJlIGEKKyAqIGRpZmZpY3VsdCBhbmQgdGltZSBjb25zdW1pbmcgcHJvY2VzcywgdGhhdCBhbHNvIGNhbiBiZSBlcnJvciBwcm9uZS4gIERhbgorICogRWlzY2hlbidzIG9mZmljaWFsIGRyaXZlciB1c2VzIHRoZSBhcHByb2FjaCB0aGF0IHRoZSBsaW51eCBhbmQgRnJlZUJTRAorICogZHJpdmVycyBzaG91bGQgYmUgYXMgaWRlbnRpY2FsIGFzIHBvc3NpYmxlLiAgVG8gdGhhdCBlbmQsIGhpcyBuZXh0IHZlcnNpb24KKyAqIG9mIHRoaXMgZHJpdmVyIHdpbGwgYmUgdXNpbmcgYSBtaWQtbGF5ZXIgY29kZSBsaWJyYXJ5IHRoYXQgaGUgaXMgZGV2ZWxvcGluZworICogdG8gbW9kZXJhdGUgY29tbXVuaWNhdGlvbnMgYmV0d2VlbiB0aGUgbGludXggbWlkLWxldmVsIFNDU0kgY29kZSBhbmQgdGhlCisgKiBsb3cgbGV2ZWwgRnJlZUJTRCBkcml2ZXIuICBIZSBpbnRlbmRzIHRvIGJlIGFibGUgdG8gZXNzZW50aWFsbHkgZHJvcCB0aGUKKyAqIEZyZWVCU0QgZHJpdmVyIGludG8gdGhlIGxpbnV4IGtlcm5lbCB3aXRoIG9ubHkgYSBmZXcgbWlub3IgdHdlYWtzIHRvIHNvbWUKKyAqIGluY2x1ZGUgZmlsZXMgYW5kIHRoZSBsaWtlIGFuZCBnZXQgdGhpbmdzIHdvcmtpbmcsIG1ha2luZyBmb3IgZmFzdCBlYXN5CisgKiBpbXBvcnRzIG9mIHRoZSBGcmVlQlNEIGNvZGUgaW50byBsaW51eC4KKyAqCisgKiBJIGRpc2FncmVlIHdpdGggRGFuJ3MgYXBwcm9hY2guICBOb3QgdGhhdCBJIGRvbid0IHRoaW5rIGhpcyB3YXkgb2YgZG9pbmcKKyAqIHRoaW5ncyB3b3VsZCBiZSBuaWNlLCBlYXN5IHRvIG1haW50YWluLCBhbmQgY3JlYXRlIGEgbW9yZSB1bmlmb3JtIGRyaXZlcgorICogYmV0d2VlbiBGcmVlQlNEIGFuZCBMaW51eC4gIEkgaGF2ZSBubyBvYmplY3Rpb24gdG8gdGhvc2UgaXNzdWVzLiAgTXkKKyAqIGRpc2FncmVlbWVudCBpcyBvbiB0aGUgbmVlZGVkIGZ1bmN0aW9uYWxpdHkuICBUaGVyZSBzaW1wbHkgYXJlIGNlcnRhaW4KKyAqIHRoaW5ncyB0aGF0IGFyZSBkb25lIGRpZmZlcmVudGx5IGluIEZyZWVCU0QgdGhhbiBsaW51eCB0aGF0IHdpbGwgY2F1c2UKKyAqIHByb2JsZW1zIGZvciB0aGlzIGRyaXZlciByZWdhcmRsZXNzIG9mIGFueSBtaWRkbGUgd2FyZSBEYW4gaW1wbGVtZW50cy4KKyAqIFRoZSBiaWdnZXN0IGV4YW1wbGUgb2YgdGhpcyBhdCB0aGUgbW9tZW50IGlzIGludGVycnVwdCBzZW1hbnRpY3MuICBMaW51eAorICogZG9lc24ndCBwcm92aWRlIHRoZSBzYW1lIHByb3RlY3Rpb24gdGVjaG5pcXVlcyBhcyBGcmVlQlNEIGRvZXMsIG5vciBjYW4KKyAqIHRoZXkgYmUgZWFzaWx5IGltcGxlbWVudGVkIGluIGFueSBtaWRkbGUgd2FyZSBjb2RlIHNpbmNlIHRoZXkgd291bGQgdHJ1bHkKKyAqIGJlbG9uZyBpbiB0aGUga2VybmVsIHByb3BlciBhbmQgd291bGQgZWZmZWN0IGFsbCBkcml2ZXJzLiAgRm9yIHRoZSB0aW1lCisgKiBiZWluZywgSSBzZWUgaXNzdWVzIHN1Y2ggYXMgdGhlc2UgYXMgbWFqb3Igc3R1bWJsaW5nIGJsb2NrcyB0byB0aGUgCisgKiByZWxpYWJpbGl0eSBvZiBjb2RlIGJhc2VkIHVwb24gc3VjaCBtaWRkbGUgd2FyZS4gIFRoZXJlZm9yZSwgSSBjaG9vc2UgdG8KKyAqIHVzZSBhIGRpZmZlcmVudCBhcHByb2FjaCB0byBpbXBvcnRpbmcgdGhlIEZyZWVCU0QgY29kZSB0aGF0IGRvZXNuJ3QKKyAqIGludm9sdmUgYW55IG1pZGRsZSB3YXJlIHR5cGUgY29kZS4gIE15IGFwcHJvYWNoIGlzIHRvIGltcG9ydCB0aGUgc2VxdWVuY2VyCisgKiBjb2RlIGZyb20gRnJlZUJTRCB3aG9sZXNhbGUuICBUaGVuLCB0byBvbmx5IG1ha2UgY2hhbmdlcyBpbiB0aGUga2VybmVsCisgKiBwb3J0aW9uIG9mIHRoZSBkcml2ZXIgYXMgdGhleSBhcmUgbmVlZGVkIGZvciB0aGUgbmV3IHNlcXVlbmNlciBzZW1hbnRpY3MuCisgKiBJbiB0aGlzIHdheSwgdGhlIHBvcnRpb24gb2YgdGhlIGRyaXZlciB0aGF0IHNwZWFrcyB0byB0aGUgcmVzdCBvZiB0aGUKKyAqIGxpbnV4IGtlcm5lbCBpcyBmYWlybHkgc3RhdGljIGFuZCBjYW4gYmUgY2hhbmdlZC9tb2RpZmllZCB0byBzb2x2ZQorICogYW55IHByb2JsZW1zIG9uZSBtaWdodCBlbmNvdW50ZXIgd2l0aG91dCBjb25jZXJuIGZvciB0aGUgRnJlZUJTRCBkcml2ZXIuCisgKgorICogTm90ZTogSWYgdGltZSBhbmQgZXhwZXJpZW5jZSBzaG91bGQgcHJvdmUgbWUgd3JvbmcgdGhhdCB0aGUgbWlkZGxlIHdhcmUKKyAqIGNvZGUgRGFuIHdyaXRlcyBpcyByZWxpYWJsZSBpbiBpdHMgb3BlcmF0aW9uLCB0aGVuIEknbGwgcmV0cmFjdCBteSBhYm92ZQorICogc3RhdGVtZW50cy4gIEJ1dCwgZm9yIHRob3NlIHRoYXQgZG9uJ3Qga25vdywgSSdtIGZyb20gTWlzc291cmkgKGluIHRoZSBVUykKKyAqIGFuZCBvdXIgc3RhdGUgbW90dG8gaXMgIlRoZSBTaG93LU1lIFN0YXRlIi4gIFdlbGwsIGJlZm9yZSBJIHdpbGwgcHV0CisgKiBmYWl0aCBpbnRvIGl0LCB5b3UnbGwgaGF2ZSB0byBzaG93IG1lIHRoYXQgaXQgd29ya3MgOikKKyAqCisgKl9NKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoZSBuZXh0IHRocmVlIGRlZmluZXMgYXJlIHVzZXIgY29uZmlndXJhYmxlLiAgVGhlc2Ugc2hvdWxkIGJlIHRoZSBvbmx5CisgKiBkZWZpbmVzIGEgdXNlciBtaWdodCBuZWVkIHRvIGdldCBpbiBoZXJlIGFuZCBjaGFuZ2UuICBUaGVyZSBhcmUgb3RoZXIKKyAqIGRlZmluZXMgYnVyaWVkIGRlZXBlciBpbiB0aGUgY29kZSwgYnV0IHRob3NlIHJlYWxseSBzaG91bGRuJ3QgbmVlZCB0b3VjaGVkCisgKiB1bmRlciBub3JtYWwgY29uZGl0aW9ucy4KKyAqLworCisvKgorICogQUlDN1hYWF9TVFJJQ1RfUENJX1NFVFVQCisgKiAgIFNob3VsZCB3ZSBhc3N1bWUgdGhlIFBDSSBjb25maWcgb3B0aW9ucyBvbiBvdXIgY29udHJvbGxlcnMgYXJlIHNldCB3aXRoCisgKiAgIHNhbmUgYW5kIHByb3BlciB2YWx1ZXMsIG9yIHNob3VsZCB3ZSBiZSBhbmFsIGFib3V0IG91ciBQQ0kgY29uZmlnCisgKiAgIHJlZ2lzdGVycyBhbmQgZm9yY2UgdGhlbSB0byB3aGF0IHdlIHdhbnQ/ICBUaGUgbWFpbiBhZHZhbnRhZ2UgdG8KKyAqICAgZGVmaW5pbmcgdGhpcyBvcHRpb24gaXMgb24gbm9uLUludGVsIGhhcmR3YXJlIHdoZXJlIHRoZSBCSU9TIG1heSBub3QKKyAqICAgaGF2ZSBiZWVuIHJ1biB0byBzZXQgdGhpbmdzIHVwLCBvciBpZiB5b3UgaGF2ZSBvbmUgb2YgdGhlIEJJT1NsZXNzCisgKiAgIEFkYXB0ZWMgY29udHJvbGxlcnMsIHN1Y2ggYXMgYSAyOTEwLCB0aGF0IGRvbid0IGdldCBzZXQgdXAgYnkgdGhlCisgKiAgIEJJT1MuICBIb3dldmVyLCBrZWVwIGluIG1pbmQgdGhhdCB3ZSByZWFsbHkgZG8gc2V0IHRoZSBtb3N0IGltcG9ydGFudAorICogICBpdGVtcyBpbiB0aGUgZHJpdmVyIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLCB0aGlzIG9ubHkgY29udHJvbHMgc29tZQorICogICBvZiB0aGUgbW9yZSBlc290ZXJpYyBQQ0kgb3B0aW9ucyBvbiB0aGVzZSBjYXJkcy4gIEluIHRoYXQgc2Vuc2UsIEkKKyAqICAgd291bGQgZGVmYXVsdCB0byBsZWF2aW5nIHRoaXMgb2ZmLiAgSG93ZXZlciwgaWYgcGVvcGxlIHdpc2ggdG8gdHJ5CisgKiAgIHRoaW5ncyBib3RoIHdheXMsIHRoYXQgd291bGQgYWxzbyBoZWxwIG1lIHRvIGtub3cgaWYgdGhlcmUgYXJlIHNvbWUKKyAqICAgbWFjaGluZXMgd2hlcmUgaXQgd29ya3Mgb25lIHdheSBidXQgbm90IGFub3RoZXIuCisgKgorICogICAtLSBKdWx5IDcsIDE3OjA5CisgKiAgICAgT0suLi5JIG5lZWQgdGhpcyBvbiBteSBtYWNoaW5lIGZvciB0ZXN0aW5nLCBzbyB0aGUgZGVmYXVsdCBpcyB0bworICogICAgIGxlYXZlIGl0IGRlZmluZWQuCisgKgorICogICAtLSBKdWx5IDcsIDE4OjQ5CisgKiAgICAgSSBuZWVkZWQgaXQgZm9yIHRlc3RpbmcsIGJ1dCBpdCBkaWRuJ3QgbWFrZSBhbnkgZGlmZmVyZW5jZSwgc28gYmFjaworICogICAgIG9mZiBzaGUgZ29lcy4KKyAqCisgKiAgIC0tIEp1bHkgMTYsIDIzOjA0CisgKiAgICAgSSB0dXJuZWQgaXQgYmFjayBvbiB0byB0cnkgYW5kIGNvbXBlbnNhdGUgZm9yIHRoZSAyLjEueCBQQ0kgY29kZQorICogICAgIHdoaWNoIG5vIGxvbmdlciByZWxpZXMgc29sZWx5IG9uIHRoZSBCSU9TIGFuZCBub3cgdHJpZXMgdG8gc2V0CisgKiAgICAgdGhpbmdzIGl0c2VsZi4KKyAqLworCisjZGVmaW5lIEFJQzdYWFhfU1RSSUNUX1BDSV9TRVRVUAorCisvKgorICogQUlDN1hYWF9WRVJCT1NFX0RFQlVHR0lORworICogICBUaGlzIG9wdGlvbiBlbmFibGVzIGEgbG90IG9mIGV4dHJhIHByaW50aygpO3MgaW4gdGhlIGNvZGUsIHN1cnJvdW5kZWQKKyAqICAgYnkgaWYgKGFpYzd4eHhfdmVyYm9zZSAuLi4pIHN0YXRlbWVudHMuICBFeGVjdXRpbmcgYWxsIG9mIHRob3NlIGlmCisgKiAgIHN0YXRlbWVudHMgYW5kIHRoZSBleHRyYSBjaGVja3MgY2FuIGdldCB0byB3aGVyZSBpdCBhY3R1YWxseSBkb2VzIGhhdmUKKyAqICAgYW4gaW1wYWN0IG9uIENQVSB1c2FnZSBhbmQgc3VjaCwgYXMgd2VsbCBhcyBjb2RlIHNpemUuICBEaXNhYmxpbmcgdGhpcworICogICBkZWZpbmUgd2lsbCBrZWVwIHNvbWUgb2YgdGhvc2UgZnJvbSBiZWNvbWluZyBwYXJ0IG9mIHRoZSBjb2RlLgorICoKKyAqICAgTk9URTogIEN1cnJlbnRseSwgdGhpcyBvcHRpb24gaGFzIG5vIHJlYWwgZWZmZWN0LCBJIHdpbGwgYmUgYWRkaW5nIHRoZQorICogICB2YXJpb3VzICNpZmRlZidzIGluIHRoZSBjb2RlIGxhdGVyIHdoZW4gSSd2ZSBkZWNpZGVkIGEgc2VjdGlvbiBpcworICogICBjb21wbGV0ZSBhbmQgbm8gbG9uZ2VyIG5lZWRzIGRlYnVnZ2luZy4gIE9LLi4uYSBsb3Qgb2YgdGhpbmdzIGFyZSBub3cKKyAqICAgc3Vycm91bmRlZCBieSB0aGlzIGRlZmluZSwgc28gdHVybmluZyB0aGlzIG9mZiBkb2VzIGhhdmUgYW4gaW1wYWN0LgorICovCisgCisvKgorICogI2RlZmluZSBBSUM3WFhYX1ZFUkJPU0VfREVCVUdHSU5HCisgKi8KKyAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJhaWM3eHh4X29sZC9haWM3eHh4LmgiCisKKyNpbmNsdWRlICJhaWM3eHh4X29sZC9zZXF1ZW5jZXIuaCIKKyNpbmNsdWRlICJhaWM3eHh4X29sZC9zY3NpX21lc3NhZ2UuaCIKKyNpbmNsdWRlICJhaWM3eHh4X29sZC9haWM3eHh4X3JlZy5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgorCisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4gICAgICAgIC8qIGZvciBrbWFsbG9jKCkgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPiAgICAgICAgLyogZm9yIENPTkZJR19QQ0kgKi8KKworI2RlZmluZSBBSUM3WFhYX0NfVkVSU0lPTiAgIjUuMi42IgorCisjZGVmaW5lIEFMTF9UQVJHRVRTIC0xCisjZGVmaW5lIEFMTF9DSEFOTkVMUyAtMQorI2RlZmluZSBBTExfTFVOUyAtMQorI2RlZmluZSBNQVhfVEFSR0VUUyAgMTYKKyNkZWZpbmUgTUFYX0xVTlMgICAgIDgKKyNpZm5kZWYgVFJVRQorIyAgZGVmaW5lIFRSVUUgMQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjICBkZWZpbmUgRkFMU0UgMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisjICBkZWZpbmUgTU1BUElPCisjZW5kaWYKKworLyoKKyAqIFlvdSBjYW4gdHJ5IHJhaXNpbmcgbWUgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBvciBsb3dlcmluZyBtZSBpZiB5b3UgaGF2ZQorICogZmxha3kgZGV2aWNlcyB0aGF0IGdvIG9mZiB0aGUgc2NzaSBidXMgd2hlbiBoaXQgd2l0aCB0b28gbWFueSB0YWdnZWQKKyAqIGNvbW1hbmRzIChsaWtlIHNvbWUgSUJNIFNDU0ktMyBMVkQgZHJpdmVzKS4KKyAqLworI2RlZmluZSBBSUM3WFhYX0NNRFNfUEVSX0RFVklDRSAzMgorCit0eXBlZGVmIHN0cnVjdAoreworICB1bnNpZ25lZCBjaGFyIHRhZ19jb21tYW5kc1sxNl07ICAgLyogQWxsb3cgZm9yIHdpZGUvdHdpbiBhZGFwdGVycy4gKi8KK30gYWRhcHRlcl90YWdfaW5mb190OworCisvKgorICogTWFrZSBhIGRlZmluZSB0aGF0IHdpbGwgdGVsbCB0aGUgZHJpdmVyIG5vdCB0byB0aGUgZGVmYXVsdCB0YWcgZGVwdGgKKyAqIGV2ZXJ5d2hlcmUuCisgKi8KKyNkZWZpbmUgREVGQVVMVF9UQUdfQ09NTUFORFMgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KKworLyoKKyAqIE1vZGlmeSB0aGlzIGFzIHlvdSBzZWUgZml0IGZvciB5b3VyIHN5c3RlbS4gIEJ5IHNldHRpbmcgdGFnX2NvbW1hbmRzCisgKiB0byAwLCB0aGUgZHJpdmVyIHdpbGwgdXNlIGl0J3Mgb3duIGFsZ29yaXRobSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgKiBudW1iZXIgb2YgY29tbWFuZHMgdG8gdXNlIChzZWUgYWJvdmUpLiAgV2hlbiAyNTUsIHRoZSBkcml2ZXIgd2lsbAorICogbm90IGVuYWJsZSB0YWdnZWQgcXVldWVpbmcgZm9yIHRoYXQgcGFydGljdWxhciBkZXZpY2UuICBXaGVuIHBvc2l0aXZlCisgKiAoPiAwKSBhbmQgKDwgMjU1KSB0aGUgdmFsdWVzIGluIHRoZSBhcnJheSBhcmUgdXNlZCBmb3IgdGhlIHF1ZXVlX2RlcHRoLgorICogTm90ZSB0aGF0IHRoZSBtYXhpbXVtIHZhbHVlIGZvciBhbiBlbnRyeSBpcyAyNTQsIGJ1dCB5b3UncmUgaW5zYW5lIGlmCisgKiB5b3UgdHJ5IHRvIHVzZSB0aGF0IG1hbnkgY29tbWFuZHMgb24gb25lIGRldmljZS4KKyAqCisgKiBJbiB0aGlzIGV4YW1wbGUsIHRoZSBmaXJzdCBsaW5lIHdpbGwgZGlzYWJsZSB0YWdnZWQgcXVldWVpbmcgZm9yIGFsbAorICogdGhlIGRldmljZXMgb24gdGhlIGZpcnN0IHByb2JlZCBhaWM3eHh4IGFkYXB0ZXIuCisgKgorICogVGhlIHNlY29uZCBsaW5lIGVuYWJsZXMgdGFnZ2VkIHF1ZXVlaW5nIHdpdGggNCBjb21tYW5kcy9MVU4gZm9yIElEcworICogKDEsIDItMTEsIDEzLTE1KSwgZGlzYWJsZXMgdGFnZ2VkIHF1ZXVlaW5nIGZvciBJRCAxMiwgYW5kIHRlbGxzIHRoZQorICogZHJpdmVyIHRvIHVzZSBpdHMgb3duIGFsZ29yaXRobSBmb3IgSUQgMS4KKyAqCisgKiBUaGUgdGhpcmQgbGluZSBpcyB0aGUgc2FtZSBhcyB0aGUgZmlyc3QgbGluZS4KKyAqCisgKiBUaGUgZm91cnRoIGxpbmUgZGlzYWJsZXMgdGFnZ2VkIHF1ZXVlaW5nIGZvciBkZXZpY2VzIDAgYW5kIDMuICBJdAorICogZW5hYmxlcyB0YWdnZWQgcXVldWVpbmcgZm9yIHRoZSBvdGhlciBJRHMsIHdpdGggMTYgY29tbWFuZHMvTFVOCisgKiBmb3IgSURzIDEgYW5kIDQsIDEyNyBjb21tYW5kcy9MVU4gZm9yIElEIDgsIGFuZCA0IGNvbW1hbmRzL0xVTiBmb3IKKyAqIElEcyAyLCA1LTcsIGFuZCA5LTE1LgorICovCisKKy8qCisgKiBOT1RFOiBUaGUgYmVsb3cgc3RydWN0dXJlIGlzIGZvciByZWZlcmVuY2Ugb25seSwgdGhlIGFjdHVhbCBzdHJ1Y3R1cmUKKyAqICAgICAgIHRvIG1vZGlmeSBpbiBvcmRlciB0byBjaGFuZ2UgdGhpbmdzIGlzIGZvdW5kIGFmdGVyIHRoaXMgZmFrZSBvbmUuCisgKgorYWRhcHRlcl90YWdfaW5mb190IGFpYzd4eHhfdGFnX2luZm9bXSA9Cit7CisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHt7NCwgMCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgMjU1LCA0LCA0LCA0fX0sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHt7MjU1LCAxNiwgNCwgMjU1LCAxNiwgNCwgNCwgNCwgMTI3LCA0LCA0LCA0LCA0LCA0LCA0LCA0fX0KK307CisqLworCitzdGF0aWMgYWRhcHRlcl90YWdfaW5mb190IGFpYzd4eHhfdGFnX2luZm9bXSA9Cit7CisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30KK307CisKKworLyoKKyAqIERlZmluZSBhbiBhcnJheSBvZiBib2FyZCBuYW1lcyB0aGF0IGNhbiBiZSBpbmRleGVkIGJ5IGFoYV90eXBlLgorICogRG9uJ3QgZm9yZ2V0IHRvIGNoYW5nZSB0aGlzIHdoZW4gY2hhbmdpbmcgdGhlIHR5cGVzIQorICovCitzdGF0aWMgY29uc3QgY2hhciAqYm9hcmRfbmFtZXNbXSA9IHsKKyAgIkFJQy03eHh4IFVua25vd24iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQUlDX05PTkUgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4MTAgSGFyZHdhcmUgUkFJRCBDb250cm9sbGVyIiwgICAgICAgICAgLyogQUlDXzc4MTAgKi8KKyAgIkFkYXB0ZWMgQUlDLTc3NzAgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzc3NzAgKi8KKyAgIkFkYXB0ZWMgQUhBLTI3NFggU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzc3NzEgKi8KKyAgIkFkYXB0ZWMgQUhBLTI4NFggU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzI4NHggKi8KKyAgIkFkYXB0ZWMgQUlDLTc4NTAgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzc4NTAgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4NTUgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzc4NTUgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4NjAgVWx0cmEgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgLyogQUlDXzc4NjAgKi8KKyAgIkFkYXB0ZWMgQUhBLTI5NDBBIFVsdHJhIFNDU0kgaG9zdCBhZGFwdGVyIiwgICAgICAgICAgLyogQUlDXzc4NjEgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4NzAgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzc4NzAgKi8KKyAgIkFkYXB0ZWMgQUhBLTI5NFggU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzc4NzEgKi8KKyAgIkFkYXB0ZWMgQUhBLTM5NFggU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzc4NzIgKi8KKyAgIkFkYXB0ZWMgQUhBLTM5OFggU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzc4NzMgKi8KKyAgIkFkYXB0ZWMgQUhBLTI5NDQgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzc4NzQgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4ODAgVWx0cmEgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgLyogQUlDXzc4ODAgKi8KKyAgIkFkYXB0ZWMgQUhBLTI5NFggVWx0cmEgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgLyogQUlDXzc4ODEgKi8KKyAgIkFkYXB0ZWMgQUhBLTM5NFggVWx0cmEgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgLyogQUlDXzc4ODIgKi8KKyAgIkFkYXB0ZWMgQUhBLTM5OFggVWx0cmEgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgLyogQUlDXzc4ODMgKi8KKyAgIkFkYXB0ZWMgQUhBLTI5NDQgVWx0cmEgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgLyogQUlDXzc4ODQgKi8KKyAgIkFkYXB0ZWMgQUhBLTI5NDBVVyBQcm8gVWx0cmEgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgLyogQUlDXzc4ODcgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4OTUgVWx0cmEgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgLyogQUlDXzc4OTUgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4OTAvMSBVbHRyYTIgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgLyogQUlDXzc4OTAgKi8KKyAgIkFkYXB0ZWMgQUhBLTI5M1ggVWx0cmEyIFNDU0kgaG9zdCBhZGFwdGVyIiwgICAgICAgICAgLyogQUlDXzc4OTAgKi8KKyAgIkFkYXB0ZWMgQUhBLTI5NFggVWx0cmEyIFNDU0kgaG9zdCBhZGFwdGVyIiwgICAgICAgICAgLyogQUlDXzc4OTAgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4OTYvNyBVbHRyYTIgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgLyogQUlDXzc4OTYgKi8KKyAgIkFkYXB0ZWMgQUhBLTM5NFggVWx0cmEyIFNDU0kgaG9zdCBhZGFwdGVyIiwgICAgICAgICAgLyogQUlDXzc4OTcgKi8KKyAgIkFkYXB0ZWMgQUhBLTM5NVggVWx0cmEyIFNDU0kgaG9zdCBhZGFwdGVyIiwgICAgICAgICAgLyogQUlDXzc4OTcgKi8KKyAgIkFkYXB0ZWMgUENNQ0lBIFNDU0kgY29udHJvbGxlciIsICAgICAgICAgICAgICAgICAgICAgLyogY2FyZCBidXMgc3R1ZmYgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4OTIgVWx0cmEgMTYwL20gU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgLyogQUlDXzc4OTIgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4OTkgVWx0cmEgMTYwL20gU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgLyogQUlDXzc4OTkgKi8KK307CisKKy8qCisgKiBUaGVyZSBzaG91bGQgYmUgYSBzcGVjaWZpYyByZXR1cm4gdmFsdWUgZm9yIHRoaXMgaW4gc2NzaS5oLCBidXQKKyAqIGl0IHNlZW1zIHRoYXQgbW9zdCBkcml2ZXJzIGlnbm9yZSBpdC4KKyAqLworI2RlZmluZSBESURfVU5ERVJGTE9XICAgRElEX0VSUk9SCisKKy8qCisgKiAgV2hhdCB3ZSB3YW50IHRvIGRvIGlzIGhhdmUgdGhlIGhpZ2hlciBsZXZlbCBzY3NpIGRyaXZlciByZXF1ZXVlCisgKiAgdGhlIGNvbW1hbmQgdG8gdXMuIFRoZXJlIGlzIG5vIHNwZWNpZmljIGRyaXZlciBzdGF0dXMgZm9yIHRoaXMKKyAqICBjb25kaXRpb24sIGJ1dCB0aGUgaGlnaGVyIGxldmVsIHNjc2kgZHJpdmVyIHdpbGwgcmVxdWV1ZSB0aGUKKyAqICBjb21tYW5kIG9uIGEgRElEX0JVU19CVVNZIGVycm9yLgorICoKKyAqICBVcG9uIGZ1cnRoZXIgaW5zcGVjdGlvbiBhbmQgdGVzdGluZywgaXQgc2VlbXMgdGhhdCBESURfQlVTX0JVU1kKKyAqICB3aWxsICphbHdheXMqIHJldHJ5IHRoZSBjb21tYW5kLiAgV2UgY2FuIGdldCBpbnRvIGFuIGluZmluaXRlIGxvb3AKKyAqICBpZiB0aGlzIGhhcHBlbnMgd2hlbiB3ZSByZWFsbHkgd2FudCBzb21lIHNvcnQgb2YgY291bnRlciB0aGF0CisgKiAgd2lsbCBhdXRvbWF0aWNhbGx5IGFib3J0L3Jlc2V0IHRoZSBjb21tYW5kIGFmdGVyIHNvIG1hbnkgcmV0cmllcy4KKyAqICBVc2luZyBESURfRVJST1Igd2lsbCBkbyBqdXN0IHRoYXQuICAoTWFkZSBieSBhIHN1Z2dlc3Rpb24gYnkKKyAqICBEb3VnIExlZGZvcmQgOC8xLzk2KQorICovCisjZGVmaW5lIERJRF9SRVRSWV9DT01NQU5EIERJRF9FUlJPUgorCisjZGVmaW5lIEhTQ1NJSUQgICAgICAgIDB4MDcKKyNkZWZpbmUgU0NTSV9SRVNFVCAgICAgMHgwNDAKKworLyoKKyAqIEVJU0EvVkwtYnVzIHN0dWZmCisgKi8KKyNkZWZpbmUgTUlOU0xPVCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1BWFNMT1QgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgU0xPVEJBU0UoeCkgICAgICAgICgoeCkgPDwgMTIpCisjZGVmaW5lIEJBU0VfVE9fU0xPVCh4KSAoKHgpID4+IDEyKQorCisvKgorICogU3RhbmRhcmQgRUlTQSBIb3N0IElEIHJlZ3MgIChPZmZzZXQgZnJvbSBzbG90IGJhc2UpCisgKi8KKyNkZWZpbmUgQUhDX0hJRDAgICAgICAgICAgICAgIDB4ODAgICAvKiAwLDE6IG1zYiBvZiBJRDIsIDItNzogSUQxICAgICAgKi8KKyNkZWZpbmUgQUhDX0hJRDEgICAgICAgICAgICAgIDB4ODEgICAvKiAwLTQ6IElEMywgNS03OiBMU0IgSUQyICAgICAgICAgKi8KKyNkZWZpbmUgQUhDX0hJRDIgICAgICAgICAgICAgIDB4ODIgICAvKiBwcm9kdWN0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQUhDX0hJRDMgICAgICAgICAgICAgIDB4ODMgICAvKiBmaXJtd2FyZSByZXZpc2lvbiAgICAgICAgICAgICAgKi8KKworLyoKKyAqIEFJQy03NzcwIEkvTyByYW5nZSB0byByZXNlcnZlIGZvciBhIGNhcmQKKyAqLworI2RlZmluZSBNSU5SRUcgICAgICAgICAgICAgICAgMHhDMDAKKyNkZWZpbmUgTUFYUkVHICAgICAgICAgICAgICAgIDB4Q0ZGCisKKyNkZWZpbmUgSU5UREVGICAgICAgICAgICAgICAgIDB4NUMgICAgICAvKiBJbnRlcnJ1cHQgRGVmaW5pdGlvbiBSZWdpc3RlciAqLworCisvKgorICogQUlDLTc4WDAgUENJIHJlZ2lzdGVycworICovCisjZGVmaW5lICAgICAgICBDTEFTU19QUk9HSUZfUkVWSUQgICAgICAgIDB4MDgKKyNkZWZpbmUgICAgICAgICAgICAgICAgREVWUkVWSUQgICAgICAgIDB4MDAwMDAwRkZ1bAorI2RlZmluZSAgICAgICAgICAgICAgICBQUk9HSU5GQyAgICAgICAgMHgwMDAwRkYwMHVsCisjZGVmaW5lICAgICAgICAgICAgICAgIFNVQkNMQVNTICAgICAgICAweDAwRkYwMDAwdWwKKyNkZWZpbmUgICAgICAgICAgICAgICAgQkFTRUNMQVNTICAgICAgICAweEZGMDAwMDAwdWwKKworI2RlZmluZSAgICAgICAgQ1NJWkVfTEFUVElNRSAgICAgICAgICAgICAgICAweDBDCisjZGVmaW5lICAgICAgICAgICAgICAgIENBQ0hFU0laRSAgICAgICAgMHgwMDAwMDAzRnVsICAgICAgICAvKiBvbmx5IDUgYml0cyAqLworI2RlZmluZSAgICAgICAgICAgICAgICBMQVRUSU1FICAgICAgICAgICAgICAgIDB4MDAwMEZGMDB1bAorCisjZGVmaW5lICAgICAgICBERVZDT05GSUcgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSAgICAgICAgICAgICAgICBTQ0JTSVpFMzIgICAgICAgIDB4MDAwMTAwMDB1bCAgICAgICAgLyogYWljNzg5WCBvbmx5ICovCisjZGVmaW5lICAgICAgICAgICAgICAgIE1QT1JUTU9ERSAgICAgICAgMHgwMDAwMDQwMHVsICAgICAgICAvKiBhaWM3ODcwIG9ubHkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgUkFNUFNNICAgICAgICAgICAweDAwMDAwMjAwdWwgICAgICAgIC8qIGFpYzc4NzAgb25seSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBSQU1QU01fVUxUUkEyICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgICAgICAgICAgICAgICAgVk9MU0VOU0UgICAgICAgICAweDAwMDAwMTAwdWwKKyNkZWZpbmUgICAgICAgICAgICAgICAgU0NCUkFNU0VMICAgICAgICAweDAwMDAwMDgwdWwKKyNkZWZpbmUgICAgICAgICAgICAgICAgU0NCUkFNU0VMX1VMVFJBMiAweDAwMDAwMDA4CisjZGVmaW5lICAgICAgICAgICAgICAgIE1SRENFTiAgICAgICAgICAgMHgwMDAwMDA0MHVsCisjZGVmaW5lICAgICAgICAgICAgICAgIEVYVFNDQlRJTUUgICAgICAgMHgwMDAwMDAyMHVsICAgICAgICAvKiBhaWM3ODcwIG9ubHkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgRVhUU0NCUEVOICAgICAgICAweDAwMDAwMDEwdWwgICAgICAgIC8qIGFpYzc4NzAgb25seSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBCRVJSRU4gICAgICAgICAgIDB4MDAwMDAwMDh1bAorI2RlZmluZSAgICAgICAgICAgICAgICBEQUNFTiAgICAgICAgICAgIDB4MDAwMDAwMDR1bAorI2RlZmluZSAgICAgICAgICAgICAgICBTVFBXTEVWRUwgICAgICAgIDB4MDAwMDAwMDJ1bAorI2RlZmluZSAgICAgICAgICAgICAgICBESUZBQ1RORUdFTiAgICAgIDB4MDAwMDAwMDF1bCAgICAgICAgLyogYWljNzg3MCBvbmx5ICovCisKKyNkZWZpbmUgICAgICAgIFNDQU1DVEwgICAgICAgICAgICAgICAgICAweDFhICAgICAgICAgICAgICAgIC8qIFVsdHJhMiBvbmx5ICAqLworI2RlZmluZSAgICAgICAgQ0NTQ0JCQUREUiAgICAgICAgICAgICAgIDB4ZjAgICAgICAgICAgICAgICAgLyogYWljNzg5NS82LzcgICovCisKKy8qCisgKiBEZWZpbmUgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBTRUVQUk9NcyBvbiBhaWM3eHh4IGFkYXB0ZXJzCisgKiBhbmQgbWFrZSBpdCBhbHNvIHJlcHJlc2VudCB0aGUgYWRkcmVzcyBzaXplIHVzZWQgaW4gYWNjZXNzaW5nCisgKiBpdHMgcmVnaXN0ZXJzLiAgVGhlIDkzQzQ2IGNoaXBzIGhhdmUgMTAyNCBiaXRzIG9yZ2FuaXplZCBpbnRvCisgKiA2NCAxNi1iaXQgd29yZHMsIHdoaWxlIHRoZSA5M0M1NiBjaGlwcyBoYXZlIDIwNDggYml0cyBvcmdhbml6ZWQKKyAqIGludG8gMTI4IDE2LWJpdCB3b3Jkcy4gIFRoZSBDNDYgY2hpcHMgdXNlIDYgYml0cyB0byBhZGRyZXNzCisgKiBlYWNoIHdvcmQsIHdoaWxlIHRoZSBDNTYgYW5kIEM2NiAoNDA5NiBiaXRzKSB1c2UgOCBiaXRzIHRvCisgKiBhZGRyZXNzIGVhY2ggd29yZC4KKyAqLwordHlwZWRlZiBlbnVtIHtDNDYgPSA2LCBDNTZfNjYgPSA4fSBzZWVwcm9tX2NoaXBfdHlwZTsKKworLyoKKyAqCisgKiBEZWZpbmUgdGhlIGZvcm1hdCBvZiB0aGUgU0VFUFJPTSByZWdpc3RlcnMgKDE2IGJpdHMpLgorICoKKyAqLworc3RydWN0IHNlZXByb21fY29uZmlnIHsKKworLyoKKyAqIFNDU0kgSUQgQ29uZmlndXJhdGlvbiBGbGFncworICovCisjZGVmaW5lIENGWEZFUiAgICAgICAgICAgICAgICAweDAwMDcgICAgICAvKiBzeW5jaHJvbm91cyB0cmFuc2ZlciByYXRlICovCisjZGVmaW5lIENGU1lOQ0ggICAgICAgICAgICAgICAweDAwMDggICAgICAvKiBlbmFibGUgc3luY2hyb25vdXMgdHJhbnNmZXIgKi8KKyNkZWZpbmUgQ0ZESVNDICAgICAgICAgICAgICAgIDB4MDAxMCAgICAgIC8qIGVuYWJsZSBkaXNjb25uZWN0aW9uICovCisjZGVmaW5lIENGV0lERUIgICAgICAgICAgICAgICAweDAwMjAgICAgICAvKiB3aWRlIGJ1cyBkZXZpY2UgKHdpZGUgY2FyZCkgKi8KKyNkZWZpbmUgQ0ZTWU5DSElTVUxUUkEgICAgICAgIDB4MDA0MCAgICAgIC8qIENGU1lOQyBpcyBhbiB1bHRyYSBvZmZzZXQgKi8KKyNkZWZpbmUgQ0ZORVdVTFRSQUZPUk1BVCAgICAgIDB4MDA4MCAgICAgIC8qIFVzZSB0aGUgVWx0cmEyIFNFRVBST00gZm9ybWF0ICovCisjZGVmaW5lIENGU1RBUlQgICAgICAgICAgICAgICAweDAxMDAgICAgICAvKiBzZW5kIHN0YXJ0IHVuaXQgU0NTSSBjb21tYW5kICovCisjZGVmaW5lIENGSU5DQklPUyAgICAgICAgICAgICAweDAyMDAgICAgICAvKiBpbmNsdWRlIGluIEJJT1Mgc2NhbiAqLworI2RlZmluZSBDRlJORk9VTkQgICAgICAgICAgICAgMHgwNDAwICAgICAgLyogcmVwb3J0IGV2ZW4gaWYgbm90IGZvdW5kICovCisjZGVmaW5lIENGTVVMVElMVU4gICAgICAgICAgICAweDA4MDAgICAgICAvKiBwcm9iZSBtdWx0IGx1bnMgaW4gQklPUyBzY2FuICovCisjZGVmaW5lIENGV0JDQUNIRVlFUyAgICAgICAgICAweDQwMDAgICAgICAvKiBFbmFibGUgVy1CZWhpbmQgQ2FjaGUgb24gZHJpdmUgKi8KKyNkZWZpbmUgQ0ZXQkNBQ0hFTkMgICAgICAgICAgIDB4YzAwMCAgICAgIC8qIERvbid0IGNoYW5nZSBXLUJlaGluZCBDYWNoZSAqLworLyogVU5VU0VEICAgICAgICAgICAgICAgIDB4MzAwMCAqLworICB1bnNpZ25lZCBzaG9ydCBkZXZpY2VfZmxhZ3NbMTZdOyAgICAgICAgLyogd29yZHMgMC0xNSAqLworCisvKgorICogQklPUyBDb250cm9sIEJpdHMKKyAqLworI2RlZmluZSBDRlNVUFJFTSAgICAgICAgMHgwMDAxICAvKiBzdXBwb3J0IGFsbCByZW1vdmFibGUgZHJpdmVzICovCisjZGVmaW5lIENGU1VQUkVNQiAgICAgICAweDAwMDIgIC8qIHN1cHBvcnQgcmVtb3ZhYmxlIGRyaXZlcyBmb3IgYm9vdCBvbmx5ICovCisjZGVmaW5lIENGQklPU0VOICAgICAgICAweDAwMDQgIC8qIEJJT1MgZW5hYmxlZCAqLworLyogVU5VU0VEICAgICAgICAgICAgICAgIDB4MDAwOCAqLworI2RlZmluZSBDRlNNMkRSViAgICAgICAgMHgwMDEwICAvKiBzdXBwb3J0IG1vcmUgdGhhbiB0d28gZHJpdmVzICovCisjZGVmaW5lIENGMjg0WEVYVEVORCAgICAweDAwMjAgIC8qIGV4dGVuZGVkIHRyYW5zbGF0aW9uICgyODR4IGNhcmRzKSAqLworLyogVU5VU0VEICAgICAgICAgICAgICAgIDB4MDA0MCAqLworI2RlZmluZSBDRkVYVEVORCAgICAgICAgMHgwMDgwICAvKiBleHRlbmRlZCB0cmFuc2xhdGlvbiBlbmFibGVkICovCisvKiBVTlVTRUQgICAgICAgICAgICAgICAgMHhGRjAwICovCisgIHVuc2lnbmVkIHNob3J0IGJpb3NfY29udHJvbDsgIC8qIHdvcmQgMTYgKi8KKworLyoKKyAqIEhvc3QgQWRhcHRlciBDb250cm9sIEJpdHMKKyAqLworI2RlZmluZSBDRkFVVE9URVJNICAgICAgMHgwMDAxICAvKiBQZXJmb3JtIEF1dG8gdGVybWluYXRpb24gKi8KKyNkZWZpbmUgQ0ZVTFRSQUVOICAgICAgIDB4MDAwMiAgLyogVWx0cmEgU0NTSSBzcGVlZCBlbmFibGUgKFVsdHJhIGNhcmRzKSAqLworI2RlZmluZSBDRjI4NFhTRUxUTyAgICAgMHgwMDAzICAvKiBTZWxlY3Rpb24gdGltZW91dCAoMjg0eCBjYXJkcykgKi8KKyNkZWZpbmUgQ0YyODRYRklGTyAgICAgIDB4MDAwQyAgLyogRklGTyBUaHJlc2hvbGQgKDI4NHggY2FyZHMpICovCisjZGVmaW5lIENGU1RFUk0gICAgICAgICAweDAwMDQgIC8qIFNDU0kgbG93IGJ5dGUgdGVybWluYXRpb24gKi8KKyNkZWZpbmUgQ0ZXU1RFUk0gICAgICAgIDB4MDAwOCAgLyogU0NTSSBoaWdoIGJ5dGUgdGVybWluYXRpb24gKHdpZGUgY2FyZCkgKi8KKyNkZWZpbmUgQ0ZTUEFSSVRZICAgICAgIDB4MDAxMCAgLyogU0NTSSBwYXJpdHkgKi8KKyNkZWZpbmUgQ0YyODRYU1RFUk0gICAgIDB4MDAyMCAgLyogU0NTSSBsb3cgYnl0ZSB0ZXJtaW5hdGlvbiAoMjg0eCBjYXJkcykgKi8KKyNkZWZpbmUgQ0ZSRVNFVEIgICAgICAgIDB4MDA0MCAgLyogcmVzZXQgU0NTSSBidXMgYXQgYm9vdCAqLworI2RlZmluZSBDRkJQUklNQVJZICAgICAgMHgwMTAwICAvKiBDaGFubmVsIEIgcHJpbWFyeSBvbiA3ODk1IGNoaXBzZXRzICovCisjZGVmaW5lIENGU0VBVVRPVEVSTSAgICAweDA0MDAgIC8qIGFpYzc4OTAgUGVyZm9ybSBTRSBBdXRvIFRlcm0gKi8KKyNkZWZpbmUgQ0ZMVkRTVEVSTSAgICAgIDB4MDgwMCAgLyogYWljNzg5MCBMVkQgVGVybWluYXRpb24gKi8KKy8qIFVOVVNFRCAgICAgICAgICAgICAgICAweEYyODAgKi8KKyAgdW5zaWduZWQgc2hvcnQgYWRhcHRlcl9jb250cm9sOyAgICAgICAgLyogd29yZCAxNyAqLworCisvKgorICogQnVzIFJlbGVhc2UsIEhvc3QgQWRhcHRlciBJRAorICovCisjZGVmaW5lIENGU0NTSUlEICAgICAgICAweDAwMEYgICAgICAgICAgICAgICAgLyogaG9zdCBhZGFwdGVyIFNDU0kgSUQgKi8KKy8qIFVOVVNFRCAgICAgICAgICAgICAgICAweDAwRjAgKi8KKyNkZWZpbmUgQ0ZCUlRJTUUgICAgICAgIDB4RkYwMCAgICAgICAgICAgICAgICAvKiBidXMgcmVsZWFzZSB0aW1lICovCisgIHVuc2lnbmVkIHNob3J0IGJydGltZV9pZDsgICAgICAgICAgICAgICAgLyogd29yZCAxOCAqLworCisvKgorICogTWF4aW11bSB0YXJnZXRzCisgKi8KKyNkZWZpbmUgQ0ZNQVhUQVJHICAgICAgICAweDAwRkYgICAgICAgIC8qIG1heGltdW0gdGFyZ2V0cyAqLworLyogVU5VU0VEICAgICAgICAgICAgICAgIDB4RkYwMCAqLworICB1bnNpZ25lZCBzaG9ydCBtYXhfdGFyZ2V0czsgICAgICAgICAgICAgICAgLyogd29yZCAxOSAqLworCisgIHVuc2lnbmVkIHNob3J0IHJlc18xWzExXTsgICAgICAgICAgICAgICAgLyogd29yZHMgMjAtMzAgKi8KKyAgdW5zaWduZWQgc2hvcnQgY2hlY2tzdW07ICAgICAgICAgICAgICAgIC8qIHdvcmQgMzEgKi8KK307CisKKyNkZWZpbmUgU0VMQlVTX01BU0sgICAgICAgICAgICAgICAgMHgwYQorI2RlZmluZSAgICAgICAgIFNFTE5BUlJPVyAgICAgICAgMHgwMAorI2RlZmluZSAgICAgICAgIFNFTEJVU0IgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBTSU5HTEVfQlVTICAgICAgICAgICAgICAgIDB4MDAKKworI2RlZmluZSBTQ0JfVEFSR0VUKHNjYikgICAgICAgICBcCisgICAgICAgKCgoc2NiKS0+aHNjYi0+dGFyZ2V0X2NoYW5uZWxfbHVuICYgVElEKSA+PiA0KQorI2RlZmluZSBTQ0JfTFVOKHNjYikgICAgICAgICAgICBcCisgICAgICAgKChzY2IpLT5oc2NiLT50YXJnZXRfY2hhbm5lbF9sdW4gJiBMSUQpCisjZGVmaW5lIFNDQl9JU19TQ1NJQlVTX0Ioc2NiKSAgIFwKKyAgICAgICAoKChzY2IpLT5oc2NiLT50YXJnZXRfY2hhbm5lbF9sdW4gJiBTRUxCVVNCKSAhPSAwKQorCisvKgorICogSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBhIGRhdGEgdHJhbnNmZXIgcGhhc2UsIHJ1biB0aGUgY29tbWFuZAorICogdG8gY29tcGxldGlvbiAtIGl0J3MgZWFzaWVyIHRoYXQgd2F5IC0gbWFraW5nIGEgbm90ZSBvZiB0aGUgZXJyb3IKKyAqIGNvbmRpdGlvbiBpbiB0aGlzIGxvY2F0aW9uLiBUaGlzIHRoZW4gd2lsbCBtb2RpZnkgYSBESURfT0sgc3RhdHVzCisgKiBpbnRvIGFuIGFwcHJvcHJpYXRlIGVycm9yIGZvciB0aGUgaGlnaGVyLWxldmVsIFNDU0kgY29kZS4KKyAqLworI2RlZmluZSBhaWM3eHh4X2Vycm9yKGNtZCkgICAgICAgICgoY21kKS0+U0NwLlN0YXR1cykKKworLyoKKyAqIEtlZXAgdHJhY2sgb2YgdGhlIHRhcmdldHMgcmV0dXJuZWQgc3RhdHVzLgorICovCisjZGVmaW5lIGFpYzd4eHhfc3RhdHVzKGNtZCkgICAgICAgICgoY21kKS0+U0NwLnNlbnRfY29tbWFuZCkKKworLyoKKyAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgU0NTSSBjb21tYW5kcyBzY2Igd2l0aGluIHRoZSBzY2IgYXJyYXkuCisgKi8KKyNkZWZpbmUgYWljN3h4eF9wb3NpdGlvbihjbWQpICAgICAgICAoKGNtZCktPlNDcC5oYXZlX2RhdGFfaW4pCisKKy8qCisgKiBUaGUgc3RvcmVkIERNQSBtYXBwaW5nIGZvciBzaW5nbGUtYnVmZmVyIGRhdGEgdHJhbnNmZXJzLgorICovCisjZGVmaW5lIGFpYzd4eHhfbWFwcGluZyhjbWQpCSAgICAgKChjbWQpLT5TQ3AucGhhc2UpCisKKy8qCisgKiBHZXQgb3V0IHByaXZhdGUgZGF0YSBhcmVhIGZyb20gYSBzY3NpIGNtZCBwb2ludGVyCisgKi8KKyNkZWZpbmUgQUlDX0RFVihjbWQpCSgoc3RydWN0IGFpY19kZXZfZGF0YSAqKShjbWQpLT5kZXZpY2UtPmhvc3RkYXRhKQorCisvKgorICogU28gd2UgY2FuIGtlZXAgdHJhY2sgb2Ygb3VyIGhvc3Qgc3RydWN0cworICovCitzdGF0aWMgc3RydWN0IGFpYzd4eHhfaG9zdCAqZmlyc3RfYWljN3h4eCA9IE5VTEw7CisKKy8qCisgKiBBcyBvZiBMaW51eCAyLjEsIHRoZSBtaWQtbGV2ZWwgU0NTSSBjb2RlIHVzZXMgdmlydHVhbCBhZGRyZXNzZXMKKyAqIGluIHRoZSBzY2F0dGVyLWdhdGhlciBsaXN0cy4gIFdlIG5lZWQgdG8gY29udmVydCB0aGUgdmlydHVhbAorICogYWRkcmVzc2VzIHRvIHBoeXNpY2FsIGFkZHJlc3Nlcy4KKyAqLworc3RydWN0IGh3X3NjYXR0ZXJsaXN0IHsKKyAgdW5zaWduZWQgaW50IGFkZHJlc3M7CisgIHVuc2lnbmVkIGludCBsZW5ndGg7Cit9OworCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgU0cgc2VnbWVudHMgdGhlc2UgY2FyZHMgY2FuIHN1cHBvcnQuCisgKi8KKyNkZWZpbmUgICAgICAgIEFJQzdYWFhfTUFYX1NHIDEyOAorCisvKgorICogVGhlIG1heGltdW0gbnVtYmVyIG9mIFNDQnMgd2UgY291bGQgaGF2ZSBmb3IgQU5ZIHR5cGUKKyAqIG9mIGNhcmQuIERPTidUIEZPUkdFVCBUTyBDSEFOR0UgVEhFIFNDQiBNQVNLIElOIFRIRQorICogU0VRVUVOQ0VSIENPREUgSUYgVEhJUyBJUyBNT0RJRklFRCEKKyAqLworI2RlZmluZSBBSUM3WFhYX01BWFNDQiAgICAgICAgMjU1CisKKworc3RydWN0IGFpYzd4eHhfaHdzY2IgeworLyogLS0tLS0tLS0tLS0tICAgIEJlZ2luIGhhcmR3YXJlIHN1cHBvcnRlZCBmaWVsZHMgICAgLS0tLS0tLS0tLS0tLS0tLSAqLworLyogMCovICB1bnNpZ25lZCBjaGFyIGNvbnRyb2w7CisvKiAxKi8gIHVuc2lnbmVkIGNoYXIgdGFyZ2V0X2NoYW5uZWxfbHVuOyAgICAgICAvKiA0LzEvMyBiaXRzICovCisvKiAyKi8gIHVuc2lnbmVkIGNoYXIgdGFyZ2V0X3N0YXR1czsKKy8qIDMqLyAgdW5zaWduZWQgY2hhciBTR19zZWdtZW50X2NvdW50OworLyogNCovICB1bnNpZ25lZCBpbnQgIFNHX2xpc3RfcG9pbnRlcjsKKy8qIDgqLyAgdW5zaWduZWQgY2hhciByZXNpZHVhbF9TR19zZWdtZW50X2NvdW50OworLyogOSovICB1bnNpZ25lZCBjaGFyIHJlc2lkdWFsX2RhdGFfY291bnRbM107CisvKjEyKi8gIHVuc2lnbmVkIGludCAgZGF0YV9wb2ludGVyOworLyoxNiovICB1bnNpZ25lZCBpbnQgIGRhdGFfY291bnQ7CisvKjIwKi8gIHVuc2lnbmVkIGludCAgU0NTSV9jbWRfcG9pbnRlcjsKKy8qMjQqLyAgdW5zaWduZWQgY2hhciBTQ1NJX2NtZF9sZW5ndGg7CisvKjI1Ki8gIHVuc2lnbmVkIGNoYXIgdGFnOyAgICAgICAgICAvKiBJbmRleCBpbnRvIG91ciBrZXJuZWwgU0NCIGFycmF5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQWxzbyB1c2VkIGFzIHRoZSB0YWcgZm9yIHRhZ2dlZCBJL08KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTQ0JfUElPX1RSQU5TRkVSX1NJWkUgIDI2ICAgLyogYW1vdW50IHdlIG5lZWQgdG8gdXBsb2FkL2Rvd25sb2FkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB2aWEgUElPIHRvIGluaXRpYWxpemUgYSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoyNiovICB1bnNpZ25lZCBjaGFyIG5leHQ7ICAgICAgICAgLyogVXNlZCB0byB0aHJlYWQgU0NCcyBhd2FpdGluZyBzZWxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9yIGRpc2Nvbm5lY3RlZCBkb3duIGluIHRoZSBzZXF1ZW5jZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qMjcqLyAgdW5zaWduZWQgY2hhciBwcmV2OworLyoyOCovICB1bnNpZ25lZCBpbnQgcGFkOyAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFVudXNlZCBieSB0aGUga2VybmVsLCBidXQgd2UgcmVxdWlyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIHBhZGRpbmcgc28gdGhhdCB0aGUgYXJyYXkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGhhcmR3YXJlIFNDQnMgaXMgYWxpZ25lZCBvbiAzMiBieXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBib3VuZGFyaWVzIHNvIHRoZSBzZXF1ZW5jZXIgY2FuIGluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK307CisKK3R5cGVkZWYgZW51bSB7CisgICAgICAgIFNDQl9GUkVFICAgICAgICAgICAgICAgID0gMHgwMDAwLAorICAgICAgICBTQ0JfRFRSX1NDQiAgICAgICAgICAgICA9IDB4MDAwMSwKKyAgICAgICAgU0NCX1dBSVRJTkdRICAgICAgICAgICAgPSAweDAwMDIsCisgICAgICAgIFNDQl9BQ1RJVkUgICAgICAgICAgICAgID0gMHgwMDA0LAorICAgICAgICBTQ0JfU0VOU0UgICAgICAgICAgICAgICA9IDB4MDAwOCwKKyAgICAgICAgU0NCX0FCT1JUICAgICAgICAgICAgICAgPSAweDAwMTAsCisgICAgICAgIFNDQl9ERVZJQ0VfUkVTRVQgICAgICAgID0gMHgwMDIwLAorICAgICAgICBTQ0JfUkVTRVQgICAgICAgICAgICAgICA9IDB4MDA0MCwKKyAgICAgICAgU0NCX1JFQ09WRVJZX1NDQiAgICAgICAgPSAweDAwODAsCisgICAgICAgIFNDQl9NU0dPVVRfUFBSICAgICAgICAgID0gMHgwMTAwLAorICAgICAgICBTQ0JfTVNHT1VUX1NFTlQgICAgICAgICA9IDB4MDIwMCwKKyAgICAgICAgU0NCX01TR09VVF9TRFRSICAgICAgICAgPSAweDA0MDAsCisgICAgICAgIFNDQl9NU0dPVVRfV0RUUiAgICAgICAgID0gMHgwODAwLAorICAgICAgICBTQ0JfTVNHT1VUX0JJVFMgICAgICAgICA9IFNDQl9NU0dPVVRfUFBSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0JfTVNHT1VUX1NFTlQgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0JfTVNHT1VUX1NEVFIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQl9NU0dPVVRfV0RUUiwKKyAgICAgICAgU0NCX1FVRVVFRF9BQk9SVCAgICAgICAgPSAweDEwMDAsCisgICAgICAgIFNDQl9RVUVVRURfRk9SX0RPTkUgICAgID0gMHgyMDAwLAorICAgICAgICBTQ0JfV0FTX0JVU1kgICAgICAgICAgICA9IDB4NDAwMCwKKwlTQ0JfUVVFVUVfRlVMTAkJPSAweDgwMDAKK30gc2NiX2ZsYWdfdHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICAgICAgQUhDX0ZOT05FICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgICAgICAgIEFIQ19QQUdFU0NCUyAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICAgICAgICBBSENfQ0hBTk5FTF9CX1BSSU1BUlkgICAgID0gMHgwMDAwMDAwMiwKKyAgICAgICAgQUhDX1VTRURFRkFVTFRTICAgICAgICAgICA9IDB4MDAwMDAwMDQsCisgICAgICAgIEFIQ19JTkRJUkVDVF9QQUdJTkcgICAgICAgPSAweDAwMDAwMDA4LAorICAgICAgICBBSENfQ0hOTEIgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAyMCwKKyAgICAgICAgQUhDX0NITkxDICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwNDAsCisgICAgICAgIEFIQ19FWFRFTkRfVFJBTlNfQSAgICAgICAgPSAweDAwMDAwMTAwLAorICAgICAgICBBSENfRVhURU5EX1RSQU5TX0IgICAgICAgID0gMHgwMDAwMDIwMCwKKyAgICAgICAgQUhDX1RFUk1fRU5CX0EgICAgICAgICAgICA9IDB4MDAwMDA0MDAsCisgICAgICAgIEFIQ19URVJNX0VOQl9TRV9MT1cgICAgICAgPSAweDAwMDAwNDAwLAorICAgICAgICBBSENfVEVSTV9FTkJfQiAgICAgICAgICAgID0gMHgwMDAwMDgwMCwKKyAgICAgICAgQUhDX1RFUk1fRU5CX1NFX0hJR0ggICAgICA9IDB4MDAwMDA4MDAsCisgICAgICAgIEFIQ19IQU5ETElOR19SRVFJTklUUyAgICAgPSAweDAwMDAxMDAwLAorICAgICAgICBBSENfVEFSR0VUTU9ERSAgICAgICAgICAgID0gMHgwMDAwMjAwMCwKKyAgICAgICAgQUhDX05FV0VFUFJPTV9GTVQgICAgICAgICA9IDB4MDAwMDQwMDAsCisgLyoKKyAgKiAgSGVyZSBlbmRzIHRoZSBGcmVlQlNEIGRlZmluZWQgZmxhZ3MgYW5kIGhlcmUgYmVnaW5zIHRoZSBsaW51eCBkZWZpbmVkCisgICogIGZsYWdzLiAgTk9URTogSSBkaWQgbm90IHByZXNlcnZlIHRoZSBvbGQgZmxhZyBuYW1lIGR1cmluZyB0aGlzIGNoYW5nZQorICAqICBzcGVjaWZpY2FsbHkgdG8gZm9yY2UgbWUgdG8gZXZhbHVhdGUgd2hhdCBmbGFncyB3ZXJlIGJlaW5nIHVzZWQgcHJvcGVybHkKKyAgKiAgYW5kIHdoYXQgZmxhZ3Mgd2VyZW4ndC4gIFRoaXMgd2F5LCBJIGNvdWxkIGNsZWFuIHVwIHRoZSBmbGFnIHVzYWdlIG9uCisgICogIGEgdXNlIGJ5IHVzZSBiYXNpcy4gIERvdWcgTGVkZm9yZAorICAqLworICAgICAgICBBSENfTU9USEVSQk9BUkQgICAgICAgICAgID0gMHgwMDAyMDAwMCwKKyAgICAgICAgQUhDX05PX1NUUFdFTiAgICAgICAgICAgICA9IDB4MDAwNDAwMDAsCisgICAgICAgIEFIQ19SRVNFVF9ERUxBWSAgICAgICAgICAgPSAweDAwMDgwMDAwLAorICAgICAgICBBSENfQV9TQ0FOTkVEICAgICAgICAgICAgID0gMHgwMDEwMDAwMCwKKyAgICAgICAgQUhDX0JfU0NBTk5FRCAgICAgICAgICAgICA9IDB4MDAyMDAwMDAsCisgICAgICAgIEFIQ19NVUxUSV9DSEFOTkVMICAgICAgICAgPSAweDAwNDAwMDAwLAorICAgICAgICBBSENfQklPU19FTkFCTEVEICAgICAgICAgID0gMHgwMDgwMDAwMCwKKyAgICAgICAgQUhDX1NFRVBST01fRk9VTkQgICAgICAgICA9IDB4MDEwMDAwMDAsCisgICAgICAgIEFIQ19URVJNX0VOQl9MVkQgICAgICAgICAgPSAweDAyMDAwMDAwLAorICAgICAgICBBSENfQUJPUlRfUEVORElORyAgICAgICAgID0gMHgwNDAwMDAwMCwKKyAgICAgICAgQUhDX1JFU0VUX1BFTkRJTkcgICAgICAgICA9IDB4MDgwMDAwMDAsCisjZGVmaW5lIEFIQ19JTl9JU1JfQklUICAgICAgICAgICAgICAyOAorICAgICAgICBBSENfSU5fSVNSICAgICAgICAgICAgICAgID0gMHgxMDAwMDAwMCwKKyAgICAgICAgQUhDX0lOX0FCT1JUICAgICAgICAgICAgICA9IDB4MjAwMDAwMDAsCisgICAgICAgIEFIQ19JTl9SRVNFVCAgICAgICAgICAgICAgPSAweDQwMDAwMDAwLAorICAgICAgICBBSENfRVhURVJOQUxfU1JBTSAgICAgICAgID0gMHg4MDAwMDAwMAorfSBhaGNfZmxhZ190eXBlOworCit0eXBlZGVmIGVudW0geworICBBSENfTk9ORSAgICAgICAgICAgICA9IDB4MDAwMCwKKyAgQUhDX0NISVBJRF9NQVNLICAgICAgPSAweDAwZmYsCisgIEFIQ19BSUM3NzcwICAgICAgICAgID0gMHgwMDAxLAorICBBSENfQUlDNzg1MCAgICAgICAgICA9IDB4MDAwMiwKKyAgQUhDX0FJQzc4NjAgICAgICAgICAgPSAweDAwMDMsCisgIEFIQ19BSUM3ODcwICAgICAgICAgID0gMHgwMDA0LAorICBBSENfQUlDNzg4MCAgICAgICAgICA9IDB4MDAwNSwKKyAgQUhDX0FJQzc4OTAgICAgICAgICAgPSAweDAwMDYsCisgIEFIQ19BSUM3ODk1ICAgICAgICAgID0gMHgwMDA3LAorICBBSENfQUlDNzg5NiAgICAgICAgICA9IDB4MDAwOCwKKyAgQUhDX0FJQzc4OTIgICAgICAgICAgPSAweDAwMDksCisgIEFIQ19BSUM3ODk5ICAgICAgICAgID0gMHgwMDBhLAorICBBSENfVkwgICAgICAgICAgICAgICA9IDB4MDEwMCwKKyAgQUhDX0VJU0EgICAgICAgICAgICAgPSAweDAyMDAsCisgIEFIQ19QQ0kgICAgICAgICAgICAgID0gMHgwNDAwLAorfSBhaGNfY2hpcDsKKwordHlwZWRlZiBlbnVtIHsKKyAgQUhDX0ZFTk9ORSAgICAgICAgICAgPSAweDAwMDAsCisgIEFIQ19VTFRSQSAgICAgICAgICAgID0gMHgwMDAxLAorICBBSENfVUxUUkEyICAgICAgICAgICA9IDB4MDAwMiwKKyAgQUhDX1dJREUgICAgICAgICAgICAgPSAweDAwMDQsCisgIEFIQ19UV0lOICAgICAgICAgICAgID0gMHgwMDA4LAorICBBSENfTU9SRV9TUkFNICAgICAgICA9IDB4MDAxMCwKKyAgQUhDX0NNRF9DSEFOICAgICAgICAgPSAweDAwMjAsCisgIEFIQ19RVUVVRV9SRUdTICAgICAgID0gMHgwMDQwLAorICBBSENfU0dfUFJFTE9BRCAgICAgICA9IDB4MDA4MCwKKyAgQUhDX1NQSU9DQVAgICAgICAgICAgPSAweDAxMDAsCisgIEFIQ19VTFRSQTMgICAgICAgICAgID0gMHgwMjAwLAorICBBSENfTkVXX0FVVE9URVJNICAgICA9IDB4MDQwMCwKKyAgQUhDX0FJQzc3NzBfRkUgICAgICAgPSBBSENfRkVOT05FLAorICBBSENfQUlDNzg1MF9GRSAgICAgICA9IEFIQ19TUElPQ0FQLAorICBBSENfQUlDNzg2MF9GRSAgICAgICA9IEFIQ19VTFRSQXxBSENfU1BJT0NBUCwKKyAgQUhDX0FJQzc4NzBfRkUgICAgICAgPSBBSENfRkVOT05FLAorICBBSENfQUlDNzg4MF9GRSAgICAgICA9IEFIQ19VTFRSQSwKKyAgQUhDX0FJQzc4OTBfRkUgICAgICAgPSBBSENfTU9SRV9TUkFNfEFIQ19DTURfQ0hBTnxBSENfVUxUUkEyfAorICAgICAgICAgICAgICAgICAgICAgICAgIEFIQ19RVUVVRV9SRUdTfEFIQ19TR19QUkVMT0FEfEFIQ19ORVdfQVVUT1RFUk0sCisgIEFIQ19BSUM3ODk1X0ZFICAgICAgID0gQUhDX01PUkVfU1JBTXxBSENfQ01EX0NIQU58QUhDX1VMVFJBLAorICBBSENfQUlDNzg5Nl9GRSAgICAgICA9IEFIQ19BSUM3ODkwX0ZFLAorICBBSENfQUlDNzg5Ml9GRSAgICAgICA9IEFIQ19BSUM3ODkwX0ZFfEFIQ19VTFRSQTMsCisgIEFIQ19BSUM3ODk5X0ZFICAgICAgID0gQUhDX0FJQzc4OTBfRkV8QUhDX1VMVFJBMywKK30gYWhjX2ZlYXR1cmU7CisKKyNkZWZpbmUgU0NCX0RNQV9BRERSKHNjYiwgYWRkcikgKCh1bnNpZ25lZCBsb25nKShhZGRyKSArIChzY2IpLT5zY2JfZG1hLT5kbWFfb2Zmc2V0KQorCitzdHJ1Y3QgYWljN3h4eF9zY2JfZG1hIHsKKwl1bnNpZ25lZCBsb25nCSAgICAgICBkbWFfb2Zmc2V0OyAgICAvKiBDb3JyZWN0aW9uIHlvdSBoYXZlIHRvIGFkZAorCQkJCQkgICAgICAgKiB0byB2aXJ0dWFsIGFkZHJlc3MgdG8gZ2V0CisJCQkJCSAgICAgICAqIGRtYSBoYW5kbGUgaW4gdGhpcyByZWdpb24gKi8KKwlkbWFfYWRkcl90CSAgICAgICBkbWFfYWRkcmVzczsgICAvKiBETUEgaGFuZGxlIG9mIHRoZSBzdGFydCwKKwkJCQkJICAgICAgICogZm9yIHVubWFwICovCisJdW5zaWduZWQgaW50CSAgICAgICBkbWFfbGVuOwkgICAgICAvKiBETUEgbGVuZ3RoICovCit9OworCit0eXBlZGVmIGVudW0geworICBBSENfQlVHX05PTkUgICAgICAgICAgICA9IDB4MDAwMCwKKyAgQUhDX0JVR19UTU9ERV9XSURFT0REICAgPSAweDAwMDEsCisgIEFIQ19CVUdfQVVUT0ZMVVNIICAgICAgID0gMHgwMDAyLAorICBBSENfQlVHX0NBQ0hFVEhFTiAgICAgICA9IDB4MDAwNCwKKyAgQUhDX0JVR19DQUNIRVRIRU5fRElTICAgPSAweDAwMDgsCisgIEFIQ19CVUdfUENJXzJfMV9SRVRSWSAgID0gMHgwMDEwLAorICBBSENfQlVHX1BDSV9NV0kgICAgICAgICA9IDB4MDAyMCwKKyAgQUhDX0JVR19TQ0JDSEFOX1VQTE9BRCAgPSAweDAwNDAsCit9IGFoY19idWdzOworCitzdHJ1Y3QgYWljN3h4eF9zY2IgeworICAgICAgICBzdHJ1Y3QgYWljN3h4eF9od3NjYiAgKmhzY2I7ICAgICAgICAgIC8qIGNvcnJlc3BvbmRpbmcgaGFyZHdhcmUgc2NiICovCisgICAgICAgIFNjc2lfQ21uZCAgICAgICAgICAgICAqY21kOyAgICAgICAgICAgICAgLyogU2NzaV9DbW5kIGZvciB0aGlzIHNjYiAqLworICAgICAgICBzdHJ1Y3QgYWljN3h4eF9zY2IgICAgKnFfbmV4dDsgICAgICAgIC8qIG5leHQgc2NiIGluIHF1ZXVlICovCisgICAgICAgIHZvbGF0aWxlIHNjYl9mbGFnX3R5cGUgZmxhZ3M7ICAgICAgICAgLyogY3VycmVudCBzdGF0ZSBvZiBzY2IgKi8KKyAgICAgICAgc3RydWN0IGh3X3NjYXR0ZXJsaXN0ICpzZ19saXN0OyAgICAgICAvKiBTRyBsaXN0IGluIGFkYXB0ZXIgZm9ybWF0ICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgdGFnX2FjdGlvbjsKKyAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICAgICBzZ19jb3VudDsKKyAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICAgICAqc2Vuc2VfY21kOyAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIDYgY2hhcmFjdGVycyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzZW5zZSBjb21tYW5kLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGNoYXIJICAgICAgICpjbW5kOworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHNnX2xlbmd0aDsgLyogV2UgaW5pdCB0aGlzIGR1cmluZyBidWlsZHNjYiBzbyB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZG9uJ3QgaGF2ZSB0byBjYWxjdWxhdGUgYW55dGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGR1cmluZyB1bmRlcmZsb3cvb3ZlcmZsb3cvc3RhdCBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICprbWFsbG9jX3B0cjsKKwlzdHJ1Y3QgYWljN3h4eF9zY2JfZG1hICpzY2JfZG1hOworfTsKKworLyoKKyAqIERlZmluZSBhIGxpbmtlZCBsaXN0IG9mIFNDQnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGFpYzd4eHhfc2NiICpoZWFkOworICBzdHJ1Y3QgYWljN3h4eF9zY2IgKnRhaWw7Cit9IHNjYl9xdWV1ZV90eXBlOworCitzdGF0aWMgc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhciBlcnJubzsKKyAgY29uc3QgY2hhciAqZXJybWVzZzsKK30gaGFyZF9lcnJvcltdID0geworICB7IElMTEhBRERSLCAgIklsbGVnYWwgSG9zdCBBY2Nlc3MiIH0sCisgIHsgSUxMU0FERFIsICAiSWxsZWdhbCBTZXF1ZW5jZXIgQWRkcmVzcyByZWZlcmVuY2VkIiB9LAorICB7IElMTE9QQ09ERSwgIklsbGVnYWwgT3Bjb2RlIGluIHNlcXVlbmNlciBwcm9ncmFtIiB9LAorICB7IFNRUEFSRVJSLCAgIlNlcXVlbmNlciBSYW0gUGFyaXR5IEVycm9yIiB9LAorICB7IERQQVJFUlIsICAgIkRhdGEtUGF0aCBSYW0gUGFyaXR5IEVycm9yIiB9LAorICB7IE1QQVJFUlIsICAgIlNjcmF0Y2ggUmFtL1NDQiBBcnJheSBSYW0gUGFyaXR5IEVycm9yIiB9LAorICB7IFBDSUVSUlNUQVQsIlBDSSBFcnJvciBkZXRlY3RlZCIgfSwKKyAgeyBDSU9QQVJFUlIsICJDSU9CVVMgUGFyaXR5IEVycm9yIiB9Cit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhcgorZ2VuZXJpY19zZW5zZVtdID0geyBSRVFVRVNUX1NFTlNFLCAwLCAwLCAwLCAyNTUsIDAgfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzY2JfcXVldWVfdHlwZSBmcmVlX3NjYnM7ICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTQ0JzIGFzc2lnbmVkIHRvIGZyZWUgc2xvdCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjYXJkIChubyBwYWdpbmcgcmVxdWlyZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdHJ1Y3QgYWljN3h4eF9zY2IgICAqc2NiX2FycmF5W0FJQzdYWFhfTUFYU0NCXTsKKyAgc3RydWN0IGFpYzd4eHhfaHdzY2IgKmhzY2JzOworICB1bnNpZ25lZCBjaGFyICBudW1zY2JzOyAgICAgICAgICAvKiBjdXJyZW50IG51bWJlciBvZiBzY2JzICovCisgIHVuc2lnbmVkIGNoYXIgIG1heGhzY2JzOyAgICAgICAgIC8qIGhhcmR3YXJlIHNjYnMgKi8KKyAgdW5zaWduZWQgY2hhciAgbWF4c2NiczsgICAgICAgICAgLyogbWF4IHNjYnMgaW5jbHVkaW5nIHBhZ2VhYmxlIHNjYnMgKi8KKyAgZG1hX2FkZHJfdAkgaHNjYnNfZG1hOwkgICAvKiBETUEgaGFuZGxlIHRvIGhzY2JzICovCisgIHVuc2lnbmVkIGludCAgIGhzY2JzX2RtYV9sZW47ICAgIC8qIGxlbmd0aCBvZiB0aGUgYWJvdmUgRE1BIGFyZWEgKi8KKyAgdm9pZCAgICAgICAgICAqaHNjYl9rbWFsbG9jX3B0cjsKK30gc2NiX2RhdGFfdHlwZTsKKworc3RydWN0IHRhcmdldF9jbWQgeworICB1bnNpZ25lZCBjaGFyIG1lc2dfYnl0ZXNbNF07CisgIHVuc2lnbmVkIGNoYXIgY29tbWFuZFsyOF07Cit9OworCisjZGVmaW5lIEFIQ19UUkFOU19DVVIgICAgMHgwMDAxCisjZGVmaW5lIEFIQ19UUkFOU19BQ1RJVkUgMHgwMDAyCisjZGVmaW5lIEFIQ19UUkFOU19HT0FMICAgMHgwMDA0CisjZGVmaW5lIEFIQ19UUkFOU19VU0VSICAgMHgwMDA4CisjZGVmaW5lIEFIQ19UUkFOU19RVUlURSAgMHgwMDEwCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGNoYXIgd2lkdGg7CisgIHVuc2lnbmVkIGNoYXIgcGVyaW9kOworICB1bnNpZ25lZCBjaGFyIG9mZnNldDsKKyAgdW5zaWduZWQgY2hhciBvcHRpb25zOworfSB0cmFuc2luZm9fdHlwZTsKKworc3RydWN0IGFpY19kZXZfZGF0YSB7CisgIHZvbGF0aWxlIHNjYl9xdWV1ZV90eXBlICBkZWxheWVkX3NjYnM7CisgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICB0ZW1wX3FfZGVwdGg7CisgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICBtYXhfcV9kZXB0aDsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGFjdGl2ZV9jbWRzOworICAvKgorICAgKiBTdGF0aXN0aWNzIEtlcHQ6CisgICAqCisgICAqIFRvdGFsIFhmZXJzIChjb3VudCBmb3IgZWFjaCBjb21tYW5kIHRoYXQgaGFzIGEgZGF0YSB4ZmVyKSwKKyAgICogYnJva2VuIGRvd24gYnkgcmVhZHMgJiYgd3JpdGVzLgorICAgKgorICAgKiBGdXJ0aGVyIHNvcnRlZCBpbnRvIGEgZmV3IGJpbnMgZm9yIGtlZXBpbmcgdGFicyBvbiBob3cgbWFueSBjb21tYW5kcworICAgKiB3ZSBnZXQgb2YgdmFyaW91cyBzaXplcy4KKyAgICoKKyAgICovCisgIGxvbmcgd190b3RhbDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvdGFsIHdyaXRlcyAqLworICBsb25nIHJfdG90YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0b3RhbCByZWFkcyAqLworICBsb25nIGJhcnJpZXJfdG90YWw7CQkJIC8qIHRvdGFsIG51bSBvZiBSRVFfQkFSUklFUiBjb21tYW5kcyAqLworICBsb25nIG9yZGVyZWRfdG90YWw7CQkJIC8qIEhvdyBtYW55IFJFUV9CQVJSSUVSIGNvbW1hbmRzIHdlCisJCQkJCSAgICB1c2VkIG9yZGVyZWQgdGFncyB0byBzYXRpc2Z5ICovCisgIGxvbmcgd19iaW5zWzZdOyAgICAgICAgICAgICAgICAgICAgICAgLyogYmlubmVkIHdyaXRlICovCisgIGxvbmcgcl9iaW5zWzZdOyAgICAgICAgICAgICAgICAgICAgICAgLyogYmlubmVkIHJlYWRzICovCisgIHRyYW5zaW5mb190eXBlCWN1cjsKKyAgdHJhbnNpbmZvX3R5cGUJZ29hbDsKKyNkZWZpbmUgIEJVU19ERVZJQ0VfUkVTRVRfUEVORElORyAgICAgICAweDAxCisjZGVmaW5lICBERVZJQ0VfUkVTRVRfREVMQVkgICAgICAgICAgICAgMHgwMgorI2RlZmluZSAgREVWSUNFX1BSSU5UX0RUUiAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgIERFVklDRV9XQVNfQlVTWSAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lICBERVZJQ0VfRFRSX1NDQU5ORUQJCTB4MTAKKyNkZWZpbmUgIERFVklDRV9TQ1NJXzMJCQkweDIwCisgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBmbGFnczsKKyAgdW5zaWduZWQgbmVlZHBwcjoxOworICB1bnNpZ25lZCBuZWVkcHByX2NvcHk6MTsKKyAgdW5zaWduZWQgbmVlZHNkdHI6MTsKKyAgdW5zaWduZWQgbmVlZHNkdHJfY29weToxOworICB1bnNpZ25lZCBuZWVkd2R0cjoxOworICB1bnNpZ25lZCBuZWVkd2R0cl9jb3B5OjE7CisgIHVuc2lnbmVkIGR0cl9wZW5kaW5nOjE7CisgIHN0cnVjdCBzY3NpX2RldmljZSAqU0RwdHI7CisgIHN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKy8qCisgKiBEZWZpbmUgYSBzdHJ1Y3R1cmUgdXNlZCBmb3IgZWFjaCBob3N0IGFkYXB0ZXIuICBOb3RlLCBpbiBvcmRlciB0byBhdm9pZAorICogcHJvYmxlbXMgd2l0aCBhcmNoaXRlY3R1cmVzIEkgY2FuJ3QgdGVzdCBvbiAoYmVjYXVzZSBJIGRvbid0IGhhdmUgb25lLAorICogc3VjaCBhcyB0aGUgQWxwaGEgYmFzZWQgc3lzdGVtcykgd2hpY2ggaGFwcGVuIHRvIGdpdmUgZmF1bHRzIGZvcgorICogbm9uLWFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzLCBjYXJlIHdhcyB0YWtlbiB0byBhbGlnbiB0aGlzIHN0cnVjdHVyZQorICogaW4gYSB3YXkgdGhhdCBnYXVyYW50ZWVkIGFsbCBhY2Nlc3NlcyBsYXJnZXIgdGhhbiA4IGJpdHMgd2VyZSBhbGlnbmVkCisgKiBvbiB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICBJdCdzIGFsc28gb3JnYW5pemVkIHRvIHRyeSBhbmQgYmUgbW9yZQorICogY2FjaGUgbGluZSBlZmZpY2llbnQuICBCZSBjYXJlZnVsIHdoZW4gY2hhbmdpbmcgdGhpcyBsZXN0IHlvdSBtaWdodCBodXJ0CisgKiBvdmVyYWxsIHBlcmZvcm1hbmNlIGFuZCBicmluZyBkb3duIHRoZSB3cmF0aCBvZiB0aGUgbWFzc2VzLgorICovCitzdHJ1Y3QgYWljN3h4eF9ob3N0IHsKKyAgLyoKKyAgICogIFRoaXMgaXMgdGhlIGZpcnN0IDY0IGJ5dGVzIGluIHRoZSBob3N0IHN0cnVjdAorICAgKi8KKworICAvKgorICAgKiBXZSBhcmUgZ3JvdXBpbmcgdGhpbmdzIGhlcmUuLi4uZmlyc3QsIGl0ZW1zIHRoYXQgZ2V0IGVpdGhlciByZWFkIG9yCisgICAqIHdyaXR0ZW4gd2l0aCBuZWFybHkgZXZlcnkgaW50ZXJydXB0CisgICAqLworICB2b2xhdGlsZSBsb25nICAgICAgICAgICAgZmxhZ3M7CisgIGFoY19mZWF0dXJlICAgICAgICAgICAgICBmZWF0dXJlczsgICAgICAgICAvKiBjaGlwIGZlYXR1cmVzICovCisgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICBiYXNlOyAgICAgICAgICAgICAvKiBjYXJkIGJhc2UgYWRkcmVzcyAqLworICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICBfX2lvbWVtICptYWRkcjsgICAgICAgICAgICAvKiBtZW1vcnkgbWFwcGVkIGFkZHJlc3MgKi8KKyAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIGlzcl9jb3VudDsgICAgICAgIC8qIEludGVycnVwdCBjb3VudCAqLworICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgc3B1cmlvdXNfaW50OworICBzY2JfZGF0YV90eXBlICAgICAgICAgICAqc2NiX2RhdGE7CisgIHN0cnVjdCBhaWM3eHh4X2NtZF9xdWV1ZSB7CisgICAgU2NzaV9DbW5kICpoZWFkOworICAgIFNjc2lfQ21uZCAqdGFpbDsKKyAgfSBjb21wbGV0ZXE7CisKKyAgLyoKKyAgICogVGhpbmdzIHJlYWQvd3JpdHRlbiBvbiBuZWFybHkgZXZlcnkgZW50cnkgaW50byBhaWM3eHh4X3F1ZXVlKCkKKyAgICovCisgIHZvbGF0aWxlIHNjYl9xdWV1ZV90eXBlICB3YWl0aW5nX3NjYnM7CisgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICB1bnBhdXNlOyAgICAgICAgICAvKiB1bnBhdXNlIHZhbHVlIGZvciBIQ05UUkwgKi8KKyAgdW5zaWduZWQgY2hhciAgICAgICAgICAgIHBhdXNlOyAgICAgICAgICAgIC8qIHBhdXNlIHZhbHVlIGZvciBIQ05UUkwgKi8KKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHFvdXRmaWZvbmV4dDsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGFjdGl2ZXNjYnM7ICAgICAgIC8qIGFjdGl2ZSBzY2JzICovCisgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBtYXhfYWN0aXZlc2NiczsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHFpbmZpZm9uZXh0OworICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAqdW50YWdnZWRfc2NiczsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgKnFvdXRmaWZvOworICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAqcWluZmlmbzsKKworICB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgZGV2X2xhc3RfcXVldWVfZnVsbFtNQVhfVEFSR0VUU107CisgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICBkZXZfbGFzdF9xdWV1ZV9mdWxsX2NvdW50W01BWF9UQVJHRVRTXTsKKyAgdW5zaWduZWQgc2hvcnQJICAgdWx0cmFlbmI7ICAgICAgICAgLyogR2V0cyBkb3dubG9hZGVkIHRvIGNhcmQgYXMgYQorCQkJCQkJYml0bWFwICovCisgIHVuc2lnbmVkIHNob3J0CSAgIGRpc2NlbmFibGU7ICAgICAgIC8qIEdldHMgZG93bmxvYWRlZCB0byBjYXJkIGFzIGEKKwkJCQkJCWJpdG1hcCAqLworICB0cmFuc2luZm9fdHlwZSAgICAgICAgICAgdXNlcltNQVhfVEFSR0VUU107CisKKyAgdW5zaWduZWQgY2hhciAgICAgICAgICAgIG1zZ19idWZbMTNdOyAgICAgIC8qIFRoZSBtZXNzYWdlIGZvciB0aGUgdGFyZ2V0ICovCisgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICBtc2dfdHlwZTsKKyNkZWZpbmUgTVNHX1RZUEVfTk9ORSAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHT1VUICAweDAxCisjZGVmaW5lIE1TR19UWVBFX0lOSVRJQVRPUl9NU0dJTiAgIDB4MDIKKyAgdW5zaWduZWQgY2hhciAgICAgICAgICAgIG1zZ19sZW47ICAgICAgICAgIC8qIExlbmd0aCBvZiBtZXNzYWdlICovCisgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICBtc2dfaW5kZXg7ICAgICAgICAvKiBJbmRleCBpbnRvIG1zZ19idWYgYXJyYXkgKi8KKworCisgIC8qCisgICAqIFdlIHB1dCB0aGUgbGVzcyBmcmVxdWVudGx5IHVzZWQgaG9zdCBzdHJ1Y3R1cmUgaXRlbXMgYWZ0ZXIgdGhlIG1vcmUKKyAgICogZnJlcXVlbnRseSB1c2VkIGl0ZW1zIHRvIHRyeSBhbmQgZWFzZSB0aGUgYnVyZGVuIG9uIHRoZSBjYWNoZSBzdWJzeXN0ZW0uCisgICAqIFRoZXNlIGVudHJpZXMgYXJlIG5vdCAqY29tbW9ubHkqIGFjY2Vzc2VkLCB3aGVyZWFzIHRoZSBwcmVjZWRpbmcgZW50cmllcworICAgKiBhcmUgYWNjZXNzZWQgdmVyeSBvZnRlbi4KKyAgICovCisKKyAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIGlycTsgICAgICAgICAgICAgIC8qIElSUSBmb3IgdGhpcyBhZGFwdGVyICovCisgIGludCAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZTsgICAgICAgICAvKiBhaWM3eHh4IGluc3RhbmNlIG51bWJlciAqLworICBpbnQgICAgICAgICAgICAgICAgICAgICAgc2NzaV9pZDsgICAgICAgICAgLyogaG9zdCBhZGFwdGVyIFNDU0kgSUQgKi8KKyAgaW50ICAgICAgICAgICAgICAgICAgICAgIHNjc2lfaWRfYjsgICAgICAgIC8qIGNoYW5uZWwgQiBmb3IgdHdpbiBhZGFwdGVycyAqLworICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgYmlvc19hZGRyZXNzOworICBpbnQgICAgICAgICAgICAgICAgICAgICAgYm9hcmRfbmFtZV9pbmRleDsKKyAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgIGJpb3NfY29udHJvbDsgICAgIC8qIGJpb3MgY29udHJvbCAtIFNFRVBST00gKi8KKyAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgIGFkYXB0ZXJfY29udHJvbDsgIC8qIGFkYXB0ZXIgY29udHJvbCAtIFNFRVBST00gKi8KKyAgc3RydWN0IHBjaV9kZXYJICAqcGRldjsKKyAgdW5zaWduZWQgY2hhciAgICAgICAgICAgIHBjaV9idXM7CisgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICBwY2lfZGV2aWNlX2ZuOworICBzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgICAgc2M7CisgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICBzY190eXBlOworICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgc2Nfc2l6ZTsKKyAgc3RydWN0IGFpYzd4eHhfaG9zdCAgICAgKm5leHQ7ICAgICAgICAgICAgIC8qIGFsbG93IGZvciBtdWx0aXBsZSBJUlFzICovCisgIHN0cnVjdCBTY3NpX0hvc3QgICAgICAgICpob3N0OyAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIHNjc2kgaG9zdCAqLworICBzdHJ1Y3QgbGlzdF9oZWFkCSAgIGFpY19kZXZzOwkgICAgIC8qIGFsbCBhaWNfZGV2IHN0cnVjdHMgb24gaG9zdCAqLworICBpbnQgICAgICAgICAgICAgICAgICAgICAgaG9zdF9ubzsgICAgICAgICAgLyogU0NTSSBob3N0IG51bWJlciAqLworICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgbWJhc2U7ICAgICAgICAgICAgLyogSS9PIG1lbW9yeSBhZGRyZXNzICovCisgIGFoY19jaGlwICAgICAgICAgICAgICAgICBjaGlwOyAgICAgICAgICAgICAvKiBjaGlwIHR5cGUgKi8KKyAgYWhjX2J1Z3MgICAgICAgICAgICAgICAgIGJ1Z3M7CisgIGRtYV9hZGRyX3QJCSAgIGZpZm9fZG1hOwkgICAgIC8qIERNQSBoYW5kbGUgZm9yIGZpZm8gYXJyYXlzICovCisKK307CisKKy8qCisgKiBWYWxpZCBTQ1NJUkFURSB2YWx1ZXMuIChwLiAzLTE3KQorICogUHJvdmlkZXMgYSBtYXBwaW5nIG9mIHRyYW5zZmVyIHBlcmlvZHMgaW4gbnMvNCB0byB0aGUgcHJvcGVyIHZhbHVlIHRvCisgKiBzdGljayBpbiB0aGUgU0NTSVJBVEUgcmVnIHRvIHVzZSB0aGF0IHRyYW5zZmVyIHJhdGUuCisgKi8KKyNkZWZpbmUgQUhDX1NZTkNSQVRFX1VMVFJBMyAwCisjZGVmaW5lIEFIQ19TWU5DUkFURV9VTFRSQTIgMQorI2RlZmluZSBBSENfU1lOQ1JBVEVfVUxUUkEgIDMKKyNkZWZpbmUgQUhDX1NZTkNSQVRFX0ZBU1QgICA2CisjZGVmaW5lIEFIQ19TWU5DUkFURV9DUkMgMHg0MAorI2RlZmluZSBBSENfU1lOQ1JBVEVfU0UgIDB4MTAKK3N0YXRpYyBzdHJ1Y3QgYWljN3h4eF9zeW5jcmF0ZSB7CisgIC8qIFJhdGVzIGluIFVsdHJhIG1vZGUgaGF2ZSBiaXQgOCBvZiBzeGZyIHNldCAqLworI2RlZmluZSAgICAgICAgICAgICAgICBVTFRSQV9TWEZSIDB4MTAwCisgIGludCBzeGZyX3VsdHJhMjsKKyAgaW50IHN4ZnI7CisgIHVuc2lnbmVkIGNoYXIgcGVyaW9kOworICBjb25zdCBjaGFyICpyYXRlWzJdOworfSBhaWM3eHh4X3N5bmNyYXRlc1tdID0geworICB7IDB4NDIsICAweDAwMCwgICA5LCAgeyI4MC4wIiwgIjE2MC4wIn0gfSwKKyAgeyAweDEzLCAgMHgwMDAsICAxMCwgIHsiNDAuMCIsICI4MC4wIn0gfSwKKyAgeyAweDE0LCAgMHgwMDAsICAxMSwgIHsiMzMuMCIsICI2Ni42In0gfSwKKyAgeyAweDE1LCAgMHgxMDAsICAxMiwgIHsiMjAuMCIsICI0MC4wIn0gfSwKKyAgeyAweDE2LCAgMHgxMTAsICAxNSwgIHsiMTYuMCIsICIzMi4wIn0gfSwKKyAgeyAweDE3LCAgMHgxMjAsICAxOCwgIHsiMTMuNCIsICIyNi44In0gfSwKKyAgeyAweDE4LCAgMHgwMDAsICAyNSwgIHsiMTAuMCIsICIyMC4wIn0gfSwKKyAgeyAweDE5LCAgMHgwMTAsICAzMSwgIHsiOC4wIiwgICIxNi4wIn0gfSwKKyAgeyAweDFhLCAgMHgwMjAsICAzNywgIHsiNi42NyIsICIxMy4zIn0gfSwKKyAgeyAweDFiLCAgMHgwMzAsICA0MywgIHsiNS43IiwgICIxMS40In0gfSwKKyAgeyAweDEwLCAgMHgwNDAsICA1MCwgIHsiNS4wIiwgICIxMC4wIn0gfSwKKyAgeyAweDAwLCAgMHgwNTAsICA1NiwgIHsiNC40IiwgICI4LjgiIH0gfSwKKyAgeyAweDAwLCAgMHgwNjAsICA2MiwgIHsiNC4wIiwgICI4LjAiIH0gfSwKKyAgeyAweDAwLCAgMHgwNzAsICA2OCwgIHsiMy42IiwgICI3LjIiIH0gfSwKKyAgeyAweDAwLCAgMHgwMDAsICAwLCAgIHtOVUxMLCBOVUxMfSAgIH0sCit9OworCisjZGVmaW5lIENUTF9PRl9TQ0Ioc2NiKSAoKChzY2ItPmhzY2IpLT50YXJnZXRfY2hhbm5lbF9sdW4gPj4gMykgJiAweDEpLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCgoc2NiLT5oc2NiKS0+dGFyZ2V0X2NoYW5uZWxfbHVuID4+IDQpICYgMHhmKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKChzY2ItPmhzY2IpLT50YXJnZXRfY2hhbm5lbF9sdW4gJiAweDA3KQorCisjZGVmaW5lIENUTF9PRl9DTUQoY21kKSAoKGNtZC0+ZGV2aWNlLT5jaGFubmVsKSAmIDB4MDEpLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKChjbWQtPmRldmljZS0+aWQpICYgMHgwZiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoY21kLT5kZXZpY2UtPmx1bikgJiAweDA3KQorCisjZGVmaW5lIFRBUkdFVF9JTkRFWChjbWQpICAoKGNtZCktPmRldmljZS0+aWQgfCAoKGNtZCktPmRldmljZS0+Y2hhbm5lbCA8PCAzKSkKKworLyoKKyAqIEEgbmljZSBsaXR0bGUgZGVmaW5lIHRvIG1ha2UgZG9pbmcgb3VyIHByaW50a3MgYSBsaXR0bGUgZWFzaWVyCisgKi8KKworI2RlZmluZSBXQVJOX0xFQUQgS0VSTl9XQVJOSU5HICIoc2NzaSVkOiVkOiVkOiVkKSAiCisjZGVmaW5lIElORk9fTEVBRCBLRVJOX0lORk8gIihzY3NpJWQ6JWQ6JWQ6JWQpICIKKworLyoKKyAqIFhYWCAtIHRoZXNlIG9wdGlvbnMgYXBwbHkgdW5pbGF0ZXJhbGx5IHRvIF9hbGxfIDI3NHgvMjg0eC8yOTR4CisgKiAgICAgICBjYXJkcyBpbiB0aGUgc3lzdGVtLiAgVGhpcyBzaG91bGQgYmUgZml4ZWQuICBFeGNlcHRpb25zIHRvIHRoaXMKKyAqICAgICAgIHJ1bGUgYXJlIG5vdGVkIGluIHRoZSBjb21tZW50cy4KKyAqLworCisvKgorICogVXNlIHRoaXMgYXMgdGhlIGRlZmF1bHQgcXVldWUgZGVwdGggd2hlbiBzZXR0aW5nIHRhZ2dlZCBxdWV1ZWluZyBvbi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBhaWM3eHh4X2RlZmF1bHRfcXVldWVfZGVwdGggPSBBSUM3WFhYX0NNRFNfUEVSX0RFVklDRTsKKworLyoKKyAqIFNraXAgdGhlIHNjc2kgYnVzIHJlc2V0LiAgTm9uIDAgbWFrZSB1cyBza2lwIHRoZSByZXNldCBhdCBzdGFydHVwLiAgVGhpcworICogaGFzIG5vIGVmZmVjdCBvbiBhbnkgbGF0ZXIgcmVzZXRzIHRoYXQgbWlnaHQgb2NjdXIgZHVlIHRvIHRoaW5ncyBsaWtlCisgKiBTQ1NJIGJ1cyB0aW1lb3V0cy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBhaWM3eHh4X25vX3Jlc2V0ID0gMDsKKy8qCisgKiBDZXJ0YWluIFBDSSBtb3RoZXJib2FyZHMgd2lsbCBzY2FuIFBDSSBkZXZpY2VzIGZyb20gaGlnaGVzdCB0byBsb3dlc3QsCisgKiBvdGhlcnMgc2NhbiBmcm9tIGxvd2VzdCB0byBoaWdoZXN0LCBhbmQgdGhleSB0ZW5kIHRvIGRvIGFsbCBraW5kcyBvZgorICogc3RyYW5nZSB0aGluZ3Mgd2hlbiB0aGV5IGNvbWUgaW50byBjb250YWN0IHdpdGggUENJIGJyaWRnZSBjaGlwcy4gIFRoZQorICogbmV0IHJlc3VsdCBvZiBhbGwgdGhpcyBpcyB0aGF0IHRoZSBQQ0kgY2FyZCB0aGF0IGlzIGFjdHVhbGx5IHVzZWQgdG8gYm9vdAorICogdGhlIG1hY2hpbmUgaXMgdmVyeSBoYXJkIHRvIGRldGVjdC4gIE1vc3QgbW90aGVyYm9hcmRzIGdvIGZyb20gbG93ZXN0CisgKiBQQ0kgc2xvdCBudW1iZXIgdG8gaGlnaGVzdCwgYW5kIHRoZSBmaXJzdCBTQ1NJIGNvbnRyb2xsZXIgZm91bmQgaXMgdGhlCisgKiBvbmUgeW91IGJvb3QgZnJvbS4gIFRoZSBvbmx5IGV4Y2VwdGlvbnMgdG8gdGhpcyBhcmUgd2hlbiBhIGNvbnRyb2xsZXIKKyAqIGhhcyBpdHMgQklPUyBkaXNhYmxlZC4gIFNvLCB3ZSBieSBkZWZhdWx0IHNvcnQgYWxsIG9mIG91ciBTQ1NJIGNvbnRyb2xsZXJzCisgKiBmcm9tIGxvd2VzdCBQQ0kgc2xvdCBudW1iZXIgdG8gaGlnaGVzdCBQQ0kgc2xvdCBudW1iZXIuICBXZSBhbHNvIGZvcmNlCisgKiBhbGwgY29udHJvbGxlcnMgd2l0aCB0aGVpciBCSU9TIGRpc2FibGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuICBUaGlzCisgKiB3b3JrcyBvbiAqYWxtb3N0KiBhbGwgY29tcHV0ZXJzLiAgV2hlcmUgaXQgZG9lc24ndCB3b3JrLCB3ZSBoYXZlIHRoaXMKKyAqIG9wdGlvbi4gIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gbm9uLTAgd2lsbCByZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgc29ydAorICogdG8gaGlnaGVzdCBmaXJzdCwgdGhlbiBsb3dlc3QsIGJ1dCB3aWxsIHN0aWxsIGxlYXZlIGNhcmRzIHdpdGggdGhlaXIgQklPUworICogZGlzYWJsZWQgYXQgdGhlIHZlcnkgZW5kLiAgVGhhdCBzaG91bGQgZml4IGV2ZXJ5b25lIHVwIHVubGVzcyB0aGVyZSBhcmUKKyAqIHJlYWxseSBzdHJhbmdlIGNpcnVtc3RhbmNlcy4KKyAqLworc3RhdGljIGludCBhaWM3eHh4X3JldmVyc2Vfc2NhbiA9IDA7CisvKgorICogU2hvdWxkIHdlIGZvcmNlIEVYVEVOREVEIHRyYW5zbGF0aW9uIG9uIGEgY29udHJvbGxlci4KKyAqICAgICAwID09IFVzZSB3aGF0ZXZlciBpcyBpbiB0aGUgU0VFUFJPTSBvciBkZWZhdWx0IHRvIG9mZgorICogICAgIDEgPT0gVXNlIHdoYXRldmVyIGlzIGluIHRoZSBTRUVQUk9NIG9yIGRlZmF1bHQgdG8gb24KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBhaWM3eHh4X2V4dGVuZGVkID0gMDsKKy8qCisgKiBUaGUgSVJRIHRyaWdnZXIgbWV0aG9kIHVzZWQgb24gRUlTQSBjb250cm9sbGVycy4gRG9lcyBub3QgZWZmZWN0IFBDSSBjYXJkcy4KKyAqICAgLTEgPSBVc2UgZGV0ZWN0ZWQgc2V0dGluZ3MuCisgKiAgICAwID0gRm9yY2UgRWRnZSB0cmlnZ2VyZWQgbW9kZS4KKyAqICAgIDEgPSBGb3JjZSBMZXZlbCB0cmlnZ2VyZWQgbW9kZS4KKyAqLworc3RhdGljIGludCBhaWM3eHh4X2lycV90cmlnZ2VyID0gLTE7CisvKgorICogVGhpcyB2YXJpYWJsZSBpcyB1c2VkIHRvIG92ZXJyaWRlIHRoZSB0ZXJtaW5hdGlvbiBzZXR0aW5ncyBvbiBhIGNvbnRyb2xsZXIuCisgKiBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCB1bmRlciBub3JtYWwgY29uZGl0aW9ucy4gIEhvd2V2ZXIsIGluIHRoZSBjYXNlCisgKiB0aGF0IGEgY29udHJvbGxlciBkb2VzIG5vdCBoYXZlIGEgcmVhZGFibGUgU0VFUFJPTSAoc28gdGhhdCB3ZSBjYW4ndAorICogcmVhZCB0aGUgU0VFUFJPTSBzZXR0aW5ncyBkaXJlY3RseSkgYW5kIHRoYXQgYSBjb250cm9sbGVyIGhhcyBhIGJ1Z2dlcmVkCisgKiB2ZXJzaW9uIG9mIHRoZSBjYWJsZSBkZXRlY3Rpb24gbG9naWMsIHRoaXMgY2FuIGJlIHVzZWQgdG8gZm9yY2UgdGhlIAorICogY29ycmVjdCB0ZXJtaW5hdGlvbi4gIEl0IGlzIHByZWZlcmFibGUgdG8gdXNlIHRoZSBtYW51YWwgdGVybWluYXRpb24KKyAqIHNldHRpbmdzIGluIHRoZSBCSU9TIGlmIHBvc3NpYmxlLCBidXQgc29tZSBtb3RoZXJib2FyZCBjb250cm9sbGVycyBzdG9yZQorICogdGhvc2Ugc2V0dGluZ3MgaW4gYSBmb3JtYXQgd2UgY2FuJ3QgcmVhZC4gIEluIG90aGVyIGNhc2VzLCBhdXRvIHRlcm0KKyAqIHNob3VsZCBhbHNvIHdvcmssIGJ1dCB0aGUgY2hpcHNldCB3YXMgcHV0IHRvZ2V0aGVyIHdpdGggbm8gYXV0byB0ZXJtCisgKiBsb2dpYyAoY29tbW9uIG9uIG1vdGhlcmJvYXJkIGNvbnRyb2xsZXJzKS4gIEluIHRob3NlIGNhc2VzLCB3ZSBoYXZlCisgKiAzMiBiaXRzIGhlcmUgdG8gd29yayB3aXRoLiAgVGhhdCdzIGdvb2QgZm9yIDggY29udHJvbGxlcnMvY2hhbm5lbHMuICBUaGUKKyAqIGJpdHMgYXJlIG9yZ2FuaXplZCBhcyA0IGJpdHMgcGVyIGNoYW5uZWwsIHdpdGggc2NzaTAgZ2V0dGluZyB0aGUgbG93ZXN0CisgKiA0IGJpdHMgaW4gdGhlIGludC4gIEEgMSBpbiBhIGJpdCBwb3NpdGlvbiBpbmRpY2F0ZXMgdGhlIHRlcm1pbmF0aW9uIHNldHRpbmcKKyAqIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhhdCBiaXQgc2hvdWxkIGJlIGVuYWJsZWQsIGEgMCBpcyBkaXNhYmxlZC4KKyAqIEl0IGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoaXM6CisgKgorICogICAgMHgwZiA9ICAxMTExLVNpbmdsZSBFbmRlZCBMb3cgQnl0ZSBUZXJtaW5hdGlvbiBvbi9vZmYKKyAqICAgICAgICAgICAgfHxcLVNpbmdsZSBFbmRlZCBIaWdoIEJ5dGUgVGVybWluYXRpb24gb24vb2ZmCisgKiAgICAgICAgICAgIHxcLUxWRCBMb3cgQnl0ZSBUZXJtaW5hdGlvbiBvbi9vZmYKKyAqICAgICAgICAgICAgXC1MVkQgSGlnaCBCeXRlIFRlcm1pbmF0aW9uIG9uL29mZgorICoKKyAqIEZvciBub24tVWx0cmEyIGNvbnRyb2xsZXJzLCB0aGUgdXBwZXIgMiBiaXRzIGFyZSBub3QgaW1wb3J0YW50LiAgU28sIHRvCisgKiBlbmFibGUgYm90aCBoaWdoIGJ5dGUgYW5kIGxvdyBieXRlIHRlcm1pbmF0aW9uIG9uIHNjc2kwLCBJIHdvdWxkIG5lZWQgdG8KKyAqIG1ha2Ugc3VyZSB0aGF0IHRoZSBvdmVycmlkZV90ZXJtIHZhcmlhYmxlIHdhcyBzZXQgdG8gMHgwMyAoYml0cyAwMDExKS4KKyAqIFRvIG1ha2Ugc3VyZSB0aGF0IGFsbCB0ZXJtaW5hdGlvbiBpcyBlbmFibGVkIG9uIGFuIFVsdHJhMiBjb250cm9sbGVyIGF0CisgKiBzY3NpMiBhbmQgb25seSBoaWdoIGJ5dGUgdGVybWluYXRpb24gb24gc2NzaTEgYW5kIGhpZ2ggYW5kIGxvdyBieXRlCisgKiB0ZXJtaW5hdGlvbiBvbiBzY3NpMCwgSSB3b3VsZCBzZXQgb3ZlcnJpZGVfdGVybT0weGYyMyAoYml0cyAxMTExIDAwMTAgMDAxMSkKKyAqCisgKiBGb3IgdGhlIG1vc3QgcGFydCwgdXNlcnMgc2hvdWxkIG5ldmVyIGhhdmUgdG8gdXNlIHRoaXMsIHRoYXQncyB3aHkgSQorICogbGVmdCBpdCBmYWlybHkgY3J5cHRpYyBpbnN0ZWFkIG9mIGVhc3kgdG8gdW5kZXJzdGFuZC4gIElmIHlvdSBuZWVkIGl0LAorICogbW9zdCBsaWtlbHkgc29tZW9uZSB3aWxsIGJlIHRlbGxpbmcgeW91IHdoYXQgeW91cidzIG5lZWRzIHRvIGJlIHNldCB0by4KKyAqLworc3RhdGljIGludCBhaWM3eHh4X292ZXJyaWRlX3Rlcm0gPSAtMTsKKy8qCisgKiBDZXJ0YWluIG1vdGhlcmJvYXJkIGNoaXBzZXQgY29udHJvbGxlcnMgdGVuZCB0byBzY3JldworICogdXAgdGhlIHBvbGFyaXR5IG9mIHRoZSB0ZXJtIGVuYWJsZSBvdXRwdXQgcGluLiAgVXNlIHRoaXMgdmFyaWFibGUKKyAqIHRvIGZvcmNlIHRoZSBjb3JyZWN0IHBvbGFyaXR5IGZvciB5b3VyIHN5c3RlbS4gIFRoaXMgaXMgYSBiaXRmaWVsZCB2YXJpYWJsZQorICogc2ltaWxhciB0byB0aGUgcHJldmlvdXMgb25lLCBidXQgdGhpcyBvbmUgaGFzIG9uZSBiaXQgcGVyIGNoYW5uZWwgaW5zdGVhZAorICogb2YgZm91ci4KKyAqICAgIDAgPSBGb3JjZSB0aGUgc2V0dGluZyB0byBhY3RpdmUgbG93LgorICogICAgMSA9IEZvcmNlIHNldHRpbmcgdG8gYWN0aXZlIGhpZ2guCisgKiBNb3N0IEFkYXB0ZWMgY2FyZHMgYXJlIGFjdGl2ZSBoaWdoLCBzZXZlcmFsIG1vdGhlcmJvYXJkcyBhcmUgYWN0aXZlIGxvdy4KKyAqIFRvIGZvcmNlIGEgMjk0MCBjYXJkIGF0IFNDU0kgMCB0byBhY3RpdmUgaGlnaCBhbmQgYSBtb3RoZXJib2FyZCA3ODk1CisgKiBjb250cm9sbGVyIGF0IHNjc2kxIGFuZCBzY3NpMiB0byBhY3RpdmUgbG93LCBhbmQgYSAyOTEwIGNhcmQgYXQgc2NzaTMKKyAqIHRvIGFjdGl2ZSBoaWdoLCB5b3Ugd291bGQgbmVlZCB0byBzZXQgc3Rwd2xldj0weDkgKGJpdHMgMTAwMSkuCisgKgorICogUGVvcGxlIHNob3VsZG4ndCBuZWVkIHRvIHVzZSB0aGlzLCBidXQgaWYgeW91IGFyZSBleHBlcmllbmNpbmcgbG90cyBvZgorICogU0NTSSB0aW1lb3V0IHByb2JsZW1zLCB0aGlzIG1heSBoZWxwLiAgVGhlcmUgaXMgb25lIHN1cmUgd2F5IHRvIHRlc3Qgd2hhdAorICogdGhpcyBvcHRpb24gbmVlZHMgdG8gYmUuICBVc2luZyBhIGJvb3QgZmxvcHB5IHRvIGJvb3QgdGhlIHN5c3RlbSwgY29uZmlndXJlCisgKiB5b3VyIHN5c3RlbSB0byBlbmFibGUgYWxsIFNDU0kgdGVybWluYXRpb24gKGluIHRoZSBBZGFwdGVjIFNDU0kgQklPUykgYW5kCisgKiBpZiBuZWVkZWQgdGhlbiBhbHNvIHBhc3MgYSB2YWx1ZSB0byBvdmVycmlkZV90ZXJtIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQorICogZHJpdmVyIGlzIGVuYWJsaW5nIFNDU0kgdGVybWluYXRpb24sIHRoZW4gc2V0IHRoaXMgdmFyaWFibGUgdG8gZWl0aGVyIDAKKyAqIG9yIDEuICBXaGVuIHRoZSBkcml2ZXIgYm9vdHMsIG1ha2Ugc3VyZSB0aGVyZSBhcmUgKk5PKiBTQ1NJIGNhYmxlcworICogY29ubmVjdGVkIHRvIHlvdXIgY29udHJvbGxlci4gIElmIGl0IGZpbmRzIGFuZCBpbml0cyB0aGUgY29udHJvbGxlcgorICogd2l0aG91dCBwcm9ibGVtLCB0aGVuIHRoZSBzZXR0aW5nIHlvdSBwYXNzZWQgdG8gc3Rwd2xldiB3YXMgY29ycmVjdC4gIElmCisgKiB0aGUgZHJpdmVyIGdvZXMgaW50byBhIHJlc2V0IGxvb3AgYW5kIGhhbmdzIHRoZSBzeXN0ZW0sIHRoZW4geW91IG5lZWQgdGhlCisgKiBvdGhlciBzZXR0aW5nIGZvciB0aGlzIHZhcmlhYmxlLiAgSWYgbmVpdGhlciBzZXR0aW5nIGxldHMgdGhlIG1hY2hpbmUKKyAqIGJvb3QgdGhlbiB5b3UgaGF2ZSBkZWZpbml0ZSB0ZXJtaW5hdGlvbiBwcm9ibGVtcyB0aGF0IG1heSBub3QgYmUgZml4YWJsZS4KKyAqLworc3RhdGljIGludCBhaWM3eHh4X3N0cHdsZXYgPSAtMTsKKy8qCisgKiBTZXQgdGhpcyB0byBub24tMCBpbiBvcmRlciB0byBmb3JjZSB0aGUgZHJpdmVyIHRvIHBhbmljIHRoZSBrZXJuZWwKKyAqIGFuZCBwcmludCBvdXQgZGVidWdnaW5nIGluZm8gb24gYSBTQ1NJIGFib3J0IG9yIHJlc2V0IGN5Y2xlLgorICovCitzdGF0aWMgaW50IGFpYzd4eHhfcGFuaWNfb25fYWJvcnQgPSAwOworLyoKKyAqIFBDSSBidXMgcGFyaXR5IGNoZWNraW5nIG9mIHRoZSBBZGFwdGVjIGNvbnRyb2xsZXJzLiAgVGhpcyBpcyBzb21ld2hhdAorICogZHViaW91cyBhdCBiZXN0LiAgVG8gbXkga25vd2xlZGdlLCB0aGlzIG9wdGlvbiBoYXMgbmV2ZXIgYWN0dWFsbHkKKyAqIHNvbHZlZCBhIFBDSSBwYXJpdHkgcHJvYmxlbSwgYnV0IG9uIGNlcnRhaW4gbWFjaGluZXMgd2l0aCBicm9rZW4gUENJCisgKiBjaGlwc2V0IGNvbmZpZ3VyYXRpb25zLCBpdCBjYW4gZ2VuZXJhdGUgdG9ucyBvZiBmYWxzZSBlcnJvciBtZXNzYWdlcy4KKyAqIEl0J3MgaW5jbHVkZWQgaW4gdGhlIGRyaXZlciBmb3IgY29tcGxldGVuZXNzLgorICogICAwID0gU2h1dCBvZmYgUENJIHBhcml0eSBjaGVjaworICogIC0xID0gTm9ybWFsIHBvbGFyaXR5IHBjaSBwYXJpdHkgY2hlY2tpbmcKKyAqICAgMSA9IHJldmVyc2UgcG9sYXJpdHkgcGNpIHBhcml0eSBjaGVja2luZworICoKKyAqIE5PVEU6IHlvdSBjYW4ndCBhY3R1YWxseSBwYXNzIC0xIG9uIHRoZSBsaWxvIHByb21wdC4gIFNvLCB0byBzZXQgdGhpcworICogdmFyaWFibGUgdG8gLTEgeW91IHdvdWxkIGFjdHVhbGx5IHdhbnQgdG8gc2ltcGx5IHBhc3MgdGhlIHZhcmlhYmxlCisgKiBuYW1lIHdpdGhvdXQgYSBudW1iZXIuICBUaGF0IHdpbGwgaW52ZXJ0IHRoZSAwIHdoaWNoIHdpbGwgcmVzdWx0IGluCisgKiAtMS4KKyAqLworc3RhdGljIGludCBhaWM3eHh4X3BjaV9wYXJpdHkgPSAwOworLyoKKyAqIFNldCB0aGlzIHRvIGFueSBub24tMCB2YWx1ZSB0byBjYXVzZSB1cyB0byBkdW1wIHRoZSBjb250ZW50cyBvZiBhbGwKKyAqIHRoZSBjYXJkJ3MgcmVnaXN0ZXJzIGluIGEgaGV4IGR1bXAgZm9ybWF0IHRhaWxvcmVkIHRvIGVhY2ggbW9kZWwgb2YKKyAqIGNvbnRyb2xsZXIuCisgKiAKKyAqIE5PVEU6IFRIRSBDT05UUk9MTEVSIElTIExFRlQgSU4gQU4gVU5VU0VBQkxFIFNUQVRFIEJZIFRISVMgT1BUSU9OLgorICogICAgICAgWU9VIENBTk5PVCBCT09UIFVQIFdJVEggVEhJUyBPUFRJT04sIElUIElTIEZPUiBERUJVR0dJTkcgUFVSUE9TRVMKKyAqICAgICAgIE9OTFkKKyAqLworc3RhdGljIGludCBhaWM3eHh4X2R1bXBfY2FyZCA9IDA7CisvKgorICogU2V0IHRoaXMgdG8gYSBub24tMCB2YWx1ZSB0byBtYWtlIHVzIGR1bXAgb3V0IHRoZSAzMiBiaXQgaW5zdHJ1Y3Rpb24KKyAqIHJlZ2lzdGVycyBvbiB0aGUgY2FyZCBhZnRlciBjb21wbGV0aW5nIHRoZSBzZXF1ZW5jZXIgZG93bmxvYWQuICBUaGlzCisgKiBhbGxvd3MgdGhlIGFjdHVhbCBzZXF1ZW5jZXIgZG93bmxvYWQgdG8gYmUgdmVyaWZpZWQuICBJdCBpcyBwb3NzaWJsZQorICogdG8gdXNlIHRoaXMgb3B0aW9uIGFuZCBzdGlsbCBib290IHVwIGFuZCBydW4geW91ciBzeXN0ZW0uICBUaGlzIGlzCisgKiBvbmx5IGludGVuZGVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgKi8KK3N0YXRpYyBpbnQgYWljN3h4eF9kdW1wX3NlcXVlbmNlciA9IDA7CisvKgorICogQ2VydGFpbiBuZXdlciBtb3RoZXJib2FyZHMgaGF2ZSBwdXQgbmV3IFBDSSBiYXNlZCBkZXZpY2VzIGludG8gdGhlCisgKiBJTyBzcGFjZXMgdGhhdCB1c2VkIHRvIHR5cGljYWxseSBiZSBvY2N1cGllZCBieSBWTEIgb3IgRUlTQSBjYXJkcy4KKyAqIFRoaXMgb3ZlcmxhcCBjYW4gY2F1c2UgdGhlc2UgbmV3ZXIgbW90aGVyYm9hcmRzIHRvIGxvY2sgdXAgd2hlbiBzY2FubmVkCisgKiBmb3Igb2xkZXIgRUlTQSBhbmQgVkxCIGRldmljZXMuICBTZXR0aW5nIHRoaXMgb3B0aW9uIHRvIG5vbi0wIHdpbGwKKyAqIGNhdXNlIHRoZSBkcml2ZXIgdG8gc2tpcCBzY2FubmluZyBmb3IgYW55IFZMQiBvciBFSVNBIGNvbnRyb2xsZXJzIGFuZAorICogb25seSBzdXBwb3J0IHRoZSBQQ0kgY29udHJvbGxlcnMuICBOT1RFOiB0aGlzIG1lYW5zIHRoYXQgaWYgdGhlIGtlcm5lbAorICogb3MgY29tcGlsZWQgd2l0aCBQQ0kgc3VwcG9ydCBkaXNhYmxlZCwgdGhlbiBzZXR0aW5nIHRoaXMgdG8gbm9uLTAKKyAqIHdvdWxkIHJlc3VsdCBpbiBuZXZlciBmaW5kaW5nIGFueSBkZXZpY2VzIDopCisgKi8KK3N0YXRpYyBpbnQgYWljN3h4eF9ub19wcm9iZSA9IDA7CisvKgorICogT24gc29tZSBtYWNoaW5lcywgZW5hYmxpbmcgdGhlIGV4dGVybmFsIFNDQiBSQU0gaXNuJ3QgcmVsaWFibGUgeWV0LiAgSQorICogaGF2ZW4ndCBoYWQgdGltZSB0byBtYWtlIHRlc3QgcGF0Y2hlcyBmb3IgdGhpbmdzIGxpa2UgY2hhbmdpbmcgdGhlCisgKiB0aW1pbmcgbW9kZSBvbiB0aGF0IGV4dGVybmFsIFJBTSBlaXRoZXIuICBTb21lIG9mIHRob3NlIGNoYW5nZXMgbWF5CisgKiBmaXggdGhlIHByb2JsZW0uICBVbnRpbCB0aGVuIHRob3VnaCwgd2UgZGVmYXVsdCB0byBleHRlcm5hbCBTQ0IgUkFNCisgKiBvZmYgYW5kIGdpdmUgYSBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIGVuYWJsZSBpdC4KKyAqLworc3RhdGljIGludCBhaWM3eHh4X3NjYnJhbSA9IDA7CisvKgorICogU28gdGhhdCB3ZSBjYW4gc2V0IGhvdyBsb25nIGVhY2ggZGV2aWNlIGlzIGdpdmVuIGFzIGEgc2VsZWN0aW9uIHRpbWVvdXQuCisgKiBUaGUgdGFibGUgb2YgdmFsdWVzIGdvZXMgbGlrZSB0aGlzOgorICogICAwIC0gMjU2bXMKKyAqICAgMSAtIDEyOG1zCisgKiAgIDIgLSA2NG1zCisgKiAgIDMgLSAzMm1zCisgKiBXZSBkZWZhdWx0IHRvIDY0bXMgYmVjYXVzZSBpdCdzIGZhc3QuICBTb21lIG9sZCBTQ1NJLUkgZGV2aWNlcyBuZWVkIGEKKyAqIGxvbmdlciB0aW1lLiAgVGhlIGZpbmFsIHZhbHVlIGhhcyB0byBiZSBsZWZ0IHNoaWZ0ZWQgYnkgMywgaGVuY2UgMHgxMAorICogaXMgdGhlIGZpbmFsIHZhbHVlLgorICovCitzdGF0aWMgaW50IGFpYzd4eHhfc2VsdGltZSA9IDB4MTA7CisvKgorICogU28gdGhhdCBpbnNtb2QgY2FuIGZpbmQgdGhlIHZhcmlhYmxlIGFuZCBtYWtlIGl0IHBvaW50IHRvIHNvbWV0aGluZworICovCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgY2hhciAqIGFpYzd4eHggPSBOVUxMOworbW9kdWxlX3BhcmFtKGFpYzd4eHgsIGNoYXJwLCAwKTsKKyNlbmRpZgorCisjZGVmaW5lIFZFUkJPU0VfTk9STUFMICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFZFUkJPU0VfTkVHT1RJQVRJT04gICAgMHgwMDAxCisjZGVmaW5lIFZFUkJPU0VfU0VRSU5UICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFZFUkJPU0VfU0NTSUlOVCAgICAgICAgMHgwMDA0CisjZGVmaW5lIFZFUkJPU0VfUFJPQkUgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFZFUkJPU0VfUFJPQkUyICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFZFUkJPU0VfTkVHT1RJQVRJT04yICAgMHgwMDIwCisjZGVmaW5lIFZFUkJPU0VfTUlOT1JfRVJST1IgICAgMHgwMDQwCisjZGVmaW5lIFZFUkJPU0VfVFJBQ0lORyAgICAgICAgMHgwMDgwCisjZGVmaW5lIFZFUkJPU0VfQUJPUlQgICAgICAgICAgMHgwZjAwCisjZGVmaW5lIFZFUkJPU0VfQUJPUlRfTUlEICAgICAgMHgwMTAwCisjZGVmaW5lIFZFUkJPU0VfQUJPUlRfRklORCAgICAgMHgwMjAwCisjZGVmaW5lIFZFUkJPU0VfQUJPUlRfUFJPQ0VTUyAgMHgwNDAwCisjZGVmaW5lIFZFUkJPU0VfQUJPUlRfUkVUVVJOICAgMHgwODAwCisjZGVmaW5lIFZFUkJPU0VfUkVTRVQgICAgICAgICAgMHhmMDAwCisjZGVmaW5lIFZFUkJPU0VfUkVTRVRfTUlEICAgICAgMHgxMDAwCisjZGVmaW5lIFZFUkJPU0VfUkVTRVRfRklORCAgICAgMHgyMDAwCisjZGVmaW5lIFZFUkJPU0VfUkVTRVRfUFJPQ0VTUyAgMHg0MDAwCisjZGVmaW5lIFZFUkJPU0VfUkVTRVRfUkVUVVJOICAgMHg4MDAwCitzdGF0aWMgaW50IGFpYzd4eHhfdmVyYm9zZSA9IFZFUkJPU0VfTk9STUFMIHwgVkVSQk9TRV9ORUdPVElBVElPTiB8CisgICAgICAgICAgIFZFUkJPU0VfUFJPQkU7ICAgICAgICAgICAgICAgICAgICAgLyogdmVyYm9zZSBtZXNzYWdlcyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogV2UncmUgZ29pbmcgdG8gc3RhcnQgcHV0dGluZyBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgc28gdGhhdCBvcmRlciBvZgorICogZnVuY3Rpb25zIGlzIG5vIGxvbmdlciBpbXBvcnRhbnQuICBBcyBuZWVkZWQsIHRoZXkgYXJlIGFkZGVkIGhlcmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBhaWM3eHh4X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CitzdGF0aWMgdm9pZCBhaWM3eHh4X3NldF9zeW5jcmF0ZShzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCAKKwkJc3RydWN0IGFpYzd4eHhfc3luY3JhdGUgKnN5bmNyYXRlLCBpbnQgdGFyZ2V0LCBpbnQgY2hhbm5lbCwKKwkJdW5zaWduZWQgaW50IHBlcmlvZCwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgY2hhciBvcHRpb25zLAorCQl1bnNpZ25lZCBpbnQgdHlwZSwgc3RydWN0IGFpY19kZXZfZGF0YSAqYWljX2Rldik7CitzdGF0aWMgdm9pZCBhaWM3eHh4X3NldF93aWR0aChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBpbnQgdGFyZ2V0LCBpbnQgY2hhbm5lbCwKKwkJaW50IGx1biwgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkJc3RydWN0IGFpY19kZXZfZGF0YSAqYWljX2Rldik7CitzdGF0aWMgdm9pZCBhaWM3eHh4X3BhbmljX2Fib3J0KHN0cnVjdCBhaWM3eHh4X2hvc3QgKnAsIFNjc2lfQ21uZCAqY21kKTsKK3N0YXRpYyB2b2lkIGFpYzd4eHhfcHJpbnRfY2FyZChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKTsKK3N0YXRpYyB2b2lkIGFpYzd4eHhfcHJpbnRfc2NyYXRjaF9yYW0oc3RydWN0IGFpYzd4eHhfaG9zdCAqcCk7CitzdGF0aWMgdm9pZCBhaWM3eHh4X3ByaW50X3NlcXVlbmNlcihzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBpbnQgZG93bmxvYWRlZCk7CisjaWZkZWYgQUlDN1hYWF9WRVJCT1NFX0RFQlVHR0lORworc3RhdGljIHZvaWQgYWljN3h4eF9jaGVja19zY2JzKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnAsIGNoYXIgKmJ1ZmZlcik7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdyB1c2VkLiAgVGhleSBoYXBwZW4gdG8gYmUgd3JhcHBlZCBpbiB1c2VsZXNzCisgKiBpbmIvb3V0YiBwb3J0IHJlYWQvd3JpdGVzIGFyb3VuZCB0aGUgcmVhbCByZWFkcyBhbmQgd3JpdGVzIGJlY2F1c2UgaXQKKyAqIHNlZW1zIHRoYXQgY2VydGFpbiB2ZXJ5IGZhc3QgQ1BVcyBoYXZlIGEgcHJvYmxlbSBkZWFsaW5nIHdpdGggdXMgd2hlbgorICogZ29pbmcgYXQgZnVsbCBzcGVlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIKK2FpY19pbmIoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgbG9uZyBwb3J0KQoreworI2lmZGVmIE1NQVBJTworICB1bnNpZ25lZCBjaGFyIHg7CisgIGlmKHAtPm1hZGRyKQorICB7CisgICAgeCA9IHJlYWRiKHAtPm1hZGRyICsgcG9ydCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgeCA9IGluYihwLT5iYXNlICsgcG9ydCk7CisgIH0KKyAgcmV0dXJuKHgpOworI2Vsc2UKKyAgcmV0dXJuKGluYihwLT5iYXNlICsgcG9ydCkpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYWljX291dGIoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgdW5zaWduZWQgY2hhciB2YWwsIGxvbmcgcG9ydCkKK3sKKyNpZmRlZiBNTUFQSU8KKyAgaWYocC0+bWFkZHIpCisgIHsKKyAgICB3cml0ZWIodmFsLCBwLT5tYWRkciArIHBvcnQpOworICAgIG1iKCk7IC8qIGxvY2tlZCBvcGVyYXRpb24gaW4gb3JkZXIgdG8gZm9yY2UgQ1BVIG9yZGVyaW5nICovCisgICAgcmVhZGIocC0+bWFkZHIgKyBIQ05UUkwpOyAvKiBkdW1teSByZWFkIHRvIGZsdXNoIHRoZSBQQ0kgd3JpdGUgKi8KKyAgfQorICBlbHNlCisgIHsKKyAgICBvdXRiKHZhbCwgcC0+YmFzZSArIHBvcnQpOworICAgIG1iKCk7IC8qIGxvY2tlZCBvcGVyYXRpb24gaW4gb3JkZXIgdG8gZm9yY2UgQ1BVIG9yZGVyaW5nICovCisgIH0KKyNlbHNlCisgIG91dGIodmFsLCBwLT5iYXNlICsgcG9ydCk7CisgIG1iKCk7IC8qIGxvY2tlZCBvcGVyYXRpb24gaW4gb3JkZXIgdG8gZm9yY2UgQ1BVIG9yZGVyaW5nICovCisjZW5kaWYKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X3NldHVwCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIEhhbmRsZSBMaW51eCBib290IHBhcmFtZXRlcnMuIFRoaXMgcm91dGluZSBhbGxvd3MgZm9yIGFzc2lnbmluZyBhIHZhbHVlCisgKiAgIHRvIGEgcGFyYW1ldGVyIHdpdGggYSAnOicgYmV0d2VlbiB0aGUgcGFyYW1ldGVyIGFuZCB0aGUgdmFsdWUuCisgKiAgIGllLiBhaWM3eHh4PXVucGF1c2U6MHgwQSxleHRlbmRlZAorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X3NldHVwKGNoYXIgKnMpCit7CisgIGludCAgIGksIG47CisgIGNoYXIgKnA7CisgIGNoYXIgKmVuZDsKKworICBzdGF0aWMgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIHVuc2lnbmVkIGludCAqZmxhZzsKKyAgfSBvcHRpb25zW10gPSB7CisgICAgeyAiZXh0ZW5kZWQiLCAgICAmYWljN3h4eF9leHRlbmRlZCB9LAorICAgIHsgIm5vX3Jlc2V0IiwgICAgJmFpYzd4eHhfbm9fcmVzZXQgfSwKKyAgICB7ICJpcnFfdHJpZ2dlciIsICZhaWM3eHh4X2lycV90cmlnZ2VyIH0sCisgICAgeyAidmVyYm9zZSIsICAgICAmYWljN3h4eF92ZXJib3NlIH0sCisgICAgeyAicmV2ZXJzZV9zY2FuIiwmYWljN3h4eF9yZXZlcnNlX3NjYW4gfSwKKyAgICB7ICJvdmVycmlkZV90ZXJtIiwgJmFpYzd4eHhfb3ZlcnJpZGVfdGVybSB9LAorICAgIHsgInN0cHdsZXYiLCAmYWljN3h4eF9zdHB3bGV2IH0sCisgICAgeyAibm9fcHJvYmUiLCAmYWljN3h4eF9ub19wcm9iZSB9LAorICAgIHsgInBhbmljX29uX2Fib3J0IiwgJmFpYzd4eHhfcGFuaWNfb25fYWJvcnQgfSwKKyAgICB7ICJwY2lfcGFyaXR5IiwgJmFpYzd4eHhfcGNpX3Bhcml0eSB9LAorICAgIHsgImR1bXBfY2FyZCIsICZhaWM3eHh4X2R1bXBfY2FyZCB9LAorICAgIHsgImR1bXBfc2VxdWVuY2VyIiwgJmFpYzd4eHhfZHVtcF9zZXF1ZW5jZXIgfSwKKyAgICB7ICJkZWZhdWx0X3F1ZXVlX2RlcHRoIiwgJmFpYzd4eHhfZGVmYXVsdF9xdWV1ZV9kZXB0aCB9LAorICAgIHsgInNjYnJhbSIsICZhaWM3eHh4X3NjYnJhbSB9LAorICAgIHsgInNlbHRpbWUiLCAmYWljN3h4eF9zZWx0aW1lIH0sCisgICAgeyAidGFnX2luZm8iLCAgICBOVUxMIH0KKyAgfTsKKworICBlbmQgPSBzdHJjaHIocywgJ1wwJyk7CisKKyAgd2hpbGUgKChwID0gc3Ryc2VwKCZzLCAiLC4iKSkgIT0gTlVMTCkKKyAgeworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9wdGlvbnMpOyBpKyspCisgICAgeworICAgICAgbiA9IHN0cmxlbihvcHRpb25zW2ldLm5hbWUpOworICAgICAgaWYgKCFzdHJuY21wKG9wdGlvbnNbaV0ubmFtZSwgcCwgbikpCisgICAgICB7CisgICAgICAgIGlmICghc3RybmNtcChwLCAidGFnX2luZm8iLCBuKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChwW25dID09ICc6JykKKyAgICAgICAgICB7CisgICAgICAgICAgICBjaGFyICpiYXNlOworICAgICAgICAgICAgY2hhciAqdG9rLCAqdG9rX2VuZCwgKnRva19lbmQyOworICAgICAgICAgICAgY2hhciB0b2tfbGlzdFtdID0geyAnLicsICcsJywgJ3snLCAnfScsICdcMCcgfTsKKyAgICAgICAgICAgIGludCBpLCBpbnN0YW5jZSA9IC0xLCBkZXZpY2UgPSAtMTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgZG9uZSA9IEZBTFNFOworCisgICAgICAgICAgICBiYXNlID0gcDsKKyAgICAgICAgICAgIHRvayA9IGJhc2UgKyBuICsgMTsgIC8qIEZvcndhcmQgdXMganVzdCBwYXN0IHRoZSAnOicgKi8KKyAgICAgICAgICAgIHRva19lbmQgPSBzdHJjaHIodG9rLCAnXDAnKTsKKyAgICAgICAgICAgIGlmICh0b2tfZW5kIDwgZW5kKQorICAgICAgICAgICAgICAqdG9rX2VuZCA9ICcsJzsKKyAgICAgICAgICAgIHdoaWxlKCFkb25lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzd2l0Y2goKnRvaykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJ3snOgorICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlID09IC0xKQorICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IDA7CisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXZpY2UgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGRldmljZSA9IDA7CisgICAgICAgICAgICAgICAgICB0b2srKzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ30nOgorICAgICAgICAgICAgICAgICAgaWYgKGRldmljZSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlID0gLTE7CisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbnN0YW5jZSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgPSAtMTsKKyAgICAgICAgICAgICAgICAgIHRvaysrOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnLCc6CisgICAgICAgICAgICAgICAgY2FzZSAnLic6CisgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGV2aWNlID49IDApCisgICAgICAgICAgICAgICAgICAgIGRldmljZSsrOworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5zdGFuY2UgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UrKzsKKyAgICAgICAgICAgICAgICAgIGlmICggKGRldmljZSA+PSBNQVhfVEFSR0VUUykgfHwgCisgICAgICAgICAgICAgICAgICAgICAgIChpbnN0YW5jZSA+PSBBUlJBWV9TSVpFKGFpYzd4eHhfdGFnX2luZm8pKSApCisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgdG9rKys7CisgICAgICAgICAgICAgICAgICBpZiAoIWRvbmUpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJhc2UgPSB0b2s7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgIHRva19lbmQgPSBzdHJjaHIodG9rLCAnXDAnKTsKKyAgICAgICAgICAgICAgICAgIGZvcihpPTA7IHRva19saXN0W2ldOyBpKyspCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRva19lbmQyID0gc3RyY2hyKHRvaywgdG9rX2xpc3RbaV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoICh0b2tfZW5kMikgJiYgKHRva19lbmQyIDwgdG9rX2VuZCkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgdG9rX2VuZCA9IHRva19lbmQyOworICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaWYgKCAoaW5zdGFuY2UgPj0gMCkgJiYgKGRldmljZSA+PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAoaW5zdGFuY2UgPCBBUlJBWV9TSVpFKGFpYzd4eHhfdGFnX2luZm8pKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAoZGV2aWNlIDwgTUFYX1RBUkdFVFMpICkKKyAgICAgICAgICAgICAgICAgICAgYWljN3h4eF90YWdfaW5mb1tpbnN0YW5jZV0udGFnX2NvbW1hbmRzW2RldmljZV0gPQorICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZV9zdHJ0b3VsKHRvaywgTlVMTCwgMCkgJiAweGZmOworICAgICAgICAgICAgICAgICAgdG9rID0gdG9rX2VuZDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSgocCAhPSBiYXNlKSAmJiAocCAhPSBOVUxMKSkKKyAgICAgICAgICAgICAgcCA9IHN0cnNlcCgmcywgIiwuIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBbbl0gPT0gJzonKQorICAgICAgICB7CisgICAgICAgICAgKihvcHRpb25zW2ldLmZsYWcpID0gc2ltcGxlX3N0cnRvdWwocCArIG4gKyAxLCBOVUxMLCAwKTsKKyAgICAgICAgICBpZighc3RybmNtcChwLCAic2VsdGltZSIsIG4pKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICoob3B0aW9uc1tpXS5mbGFnKSA9ICgqKG9wdGlvbnNbaV0uZmxhZykgJSA0KSA8PCAzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc3RybmNtcChwLCAidmVyYm9zZSIsIG4pKQorICAgICAgICB7CisgICAgICAgICAgKihvcHRpb25zW2ldLmZsYWcpID0gMHhmZjI5OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICoob3B0aW9uc1tpXS5mbGFnKSA9IH4oKihvcHRpb25zW2ldLmZsYWcpKTsKKyAgICAgICAgICBpZighc3RybmNtcChwLCAic2VsdGltZSIsIG4pKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICoob3B0aW9uc1tpXS5mbGFnKSA9ICgqKG9wdGlvbnNbaV0uZmxhZykgJSA0KSA8PCAzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworX19zZXR1cCgiYWljN3h4eD0iLCBhaWM3eHh4X3NldHVwKTsKKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBwYXVzZV9zZXF1ZW5jZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUGF1c2UgdGhlIHNlcXVlbmNlciBhbmQgd2FpdCBmb3IgaXQgdG8gYWN0dWFsbHkgc3RvcCAtIHRoaXMKKyAqICAgaXMgaW1wb3J0YW50IHNpbmNlIHRoZSBzZXF1ZW5jZXIgY2FuIGRpc2FibGUgcGF1c2luZyBmb3IgY3JpdGljYWwKKyAqICAgc2VjdGlvbnMuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitwYXVzZV9zZXF1ZW5jZXIoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKyAgYWljX291dGIocCwgcC0+cGF1c2UsIEhDTlRSTCk7CisgIHdoaWxlICgoYWljX2luYihwLCBIQ05UUkwpICYgUEFVU0UpID09IDApCisgIHsKKyAgICA7CisgIH0KKyAgaWYocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICB7CisgICAgYWljX2luYihwLCBDQ1NDQkNUTCk7CisgIH0KK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICB1bnBhdXNlX3NlcXVlbmNlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBVbnBhdXNlIHRoZSBzZXF1ZW5jZXIuIFVucmVtYXJrYWJsZSwgeWV0IGRvbmUgb2Z0ZW4gZW5vdWdoIHRvCisgKiAgIHdhcnJhbnQgYW4gZWFzeSB3YXkgdG8gZG8gaXQuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit1bnBhdXNlX3NlcXVlbmNlcihzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBpbnQgdW5wYXVzZV9hbHdheXMpCit7CisgIGlmICh1bnBhdXNlX2Fsd2F5cyB8fAorICAgICAgKCAhKGFpY19pbmIocCwgSU5UU1RBVCkgJiAoU0NTSUlOVCB8IFNFUUlOVCB8IEJSS0FEUklOVCkpICYmCisgICAgICAgICEocC0+ZmxhZ3MgJiBBSENfSEFORExJTkdfUkVRSU5JVFMpICkgKQorICB7CisgICAgYWljX291dGIocCwgcC0+dW5wYXVzZSwgSENOVFJMKTsKKyAgfQorfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIHJlc3RhcnRfc2VxdWVuY2VyCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFJlc3RhcnQgdGhlIHNlcXVlbmNlciBwcm9ncmFtIGZyb20gYWRkcmVzcyB6ZXJvLiAgVGhpcyBhc3N1bWVzCisgKiAgIHRoYXQgdGhlIHNlcXVlbmNlciBpcyBhbHJlYWR5IHBhdXNlZC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3Jlc3RhcnRfc2VxdWVuY2VyKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisgIGFpY19vdXRiKHAsIDAsIFNFUUFERFIwKTsKKyAgYWljX291dGIocCwgMCwgU0VRQUREUjEpOworICBhaWNfb3V0YihwLCBGQVNUTU9ERSwgU0VRQ1RMKTsKK30KKworLyoKKyAqIFdlIGluY2x1ZGUgdGhlIGFpYzd4eHhfc2VxLmMgZmlsZSBoZXJlIHNvIHRoYXQgdGhlIG90aGVyIGRlZmluZXMgaGF2ZQorICogYWxyZWFkeSBiZWVuIG1hZGUsIGFuZCBzbyB0aGF0IGl0IGNvbWVzIGJlZm9yZSB0aGUgY29kZSB0aGF0IGFjdHVhbGx5CisgKiBkb3dubG9hZHMgdGhlIGluc3RydWN0aW9ucyAoc2luY2Ugd2UgZG9uJ3QgdHlwaWNhbGx5IHVzZSBmdW5jdGlvbgorICogcHJvdG90eXBlLCBvdXIgY29kZSBoYXMgdG8gYmUgb3JkZXJlZCB0aGF0IHdheSwgaXQncyBhIGxlZnQtb3ZlciBmcm9tCisgKiB0aGUgb3JpZ2luYWwgZHJpdmVyIGRheXMuLi4uLkkgc2hvdWxkIGZpeCBpdCBzb21lIHRpbWUgREwpLgorICovCisjaW5jbHVkZSAiYWljN3h4eF9vbGQvYWljN3h4eF9zZXEuYyIKKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2NoZWNrX3BhdGNoCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFNlZSBpZiB0aGUgbmV4dCBwYXRjaCB0byBkb3dubG9hZCBzaG91bGQgYmUgZG93bmxvYWRlZC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorYWljN3h4eF9jaGVja19wYXRjaChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLAorICBzdHJ1Y3Qgc2VxdWVuY2VyX3BhdGNoICoqc3RhcnRfcGF0Y2gsIGludCBzdGFydF9pbnN0ciwgaW50ICpza2lwX2FkZHIpCit7CisgIHN0cnVjdCBzZXF1ZW5jZXJfcGF0Y2ggKmN1cl9wYXRjaDsKKyAgc3RydWN0IHNlcXVlbmNlcl9wYXRjaCAqbGFzdF9wYXRjaDsKKyAgaW50IG51bV9wYXRjaGVzOworCisgIG51bV9wYXRjaGVzID0gc2l6ZW9mKHNlcXVlbmNlcl9wYXRjaGVzKS9zaXplb2Yoc3RydWN0IHNlcXVlbmNlcl9wYXRjaCk7CisgIGxhc3RfcGF0Y2ggPSAmc2VxdWVuY2VyX3BhdGNoZXNbbnVtX3BhdGNoZXNdOworICBjdXJfcGF0Y2ggPSAqc3RhcnRfcGF0Y2g7CisKKyAgd2hpbGUgKChjdXJfcGF0Y2ggPCBsYXN0X3BhdGNoKSAmJiAoc3RhcnRfaW5zdHIgPT0gY3VyX3BhdGNoLT5iZWdpbikpCisgIHsKKyAgICBpZiAoY3VyX3BhdGNoLT5wYXRjaF9mdW5jKHApID09IDApCisgICAgeworICAgICAgLyoKKyAgICAgICAqIFN0YXJ0IHJlamVjdGluZyBjb2RlLgorICAgICAgICovCisgICAgICAqc2tpcF9hZGRyID0gc3RhcnRfaW5zdHIgKyBjdXJfcGF0Y2gtPnNraXBfaW5zdHI7CisgICAgICBjdXJfcGF0Y2ggKz0gY3VyX3BhdGNoLT5za2lwX3BhdGNoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyoKKyAgICAgICAqIEZvdW5kIGFuIE9LIHBhdGNoLiAgQWR2YW5jZSB0aGUgcGF0Y2ggcG9pbnRlciB0byB0aGUgbmV4dCBwYXRjaAorICAgICAgICogYW5kIHdhaXQgZm9yIG91ciBpbnN0cnVjdGlvbiBwb2ludGVyIHRvIGdldCBoZXJlLgorICAgICAgICovCisgICAgICBjdXJfcGF0Y2grKzsKKyAgICB9CisgIH0KKworICAqc3RhcnRfcGF0Y2ggPSBjdXJfcGF0Y2g7CisgIGlmIChzdGFydF9pbnN0ciA8ICpza2lwX2FkZHIpCisgICAgLyoKKyAgICAgKiBTdGlsbCBza2lwcGluZworICAgICAqLworICAgIHJldHVybiAoMCk7CisgIHJldHVybigxKTsKK30KKworCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfZG93bmxvYWRfaW5zdHIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgRmluZCB0aGUgbmV4dCBwYXRjaCB0byBkb3dubG9hZC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfZG93bmxvYWRfaW5zdHIoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgaW50IGluc3RycHRyLAorICB1bnNpZ25lZCBjaGFyICpkY29uc3RzKQoreworICB1bmlvbiBpbnNfZm9ybWF0cyBpbnN0cjsKKyAgc3RydWN0IGluc19mb3JtYXQxICpmbXQxX2luczsKKyAgc3RydWN0IGluc19mb3JtYXQzICpmbXQzX2luczsKKyAgdW5zaWduZWQgY2hhciBvcGNvZGU7CisKKyAgaW5zdHIgPSAqKHVuaW9uIGluc19mb3JtYXRzKikgJnNlcXByb2dbaW5zdHJwdHIgKiA0XTsKKworICBpbnN0ci5pbnRlZ2VyID0gbGUzMl90b19jcHUoaW5zdHIuaW50ZWdlcik7CisgIAorICBmbXQxX2lucyA9ICZpbnN0ci5mb3JtYXQxOworICBmbXQzX2lucyA9IE5VTEw7CisKKyAgLyogUHVsbCB0aGUgb3Bjb2RlICovCisgIG9wY29kZSA9IGluc3RyLmZvcm1hdDEub3Bjb2RlOworICBzd2l0Y2ggKG9wY29kZSkKKyAgeworICAgIGNhc2UgQUlDX09QX0pNUDoKKyAgICBjYXNlIEFJQ19PUF9KQzoKKyAgICBjYXNlIEFJQ19PUF9KTkM6CisgICAgY2FzZSBBSUNfT1BfQ0FMTDoKKyAgICBjYXNlIEFJQ19PUF9KTkU6CisgICAgY2FzZSBBSUNfT1BfSk5aOgorICAgIGNhc2UgQUlDX09QX0pFOgorICAgIGNhc2UgQUlDX09QX0paOgorICAgIHsKKyAgICAgIHN0cnVjdCBzZXF1ZW5jZXJfcGF0Y2ggKmN1cl9wYXRjaDsKKyAgICAgIGludCBhZGRyZXNzX29mZnNldDsKKyAgICAgIHVuc2lnbmVkIGludCBhZGRyZXNzOworICAgICAgaW50IHNraXBfYWRkcjsKKyAgICAgIGludCBpOworCisgICAgICBmbXQzX2lucyA9ICZpbnN0ci5mb3JtYXQzOworICAgICAgYWRkcmVzc19vZmZzZXQgPSAwOworICAgICAgYWRkcmVzcyA9IGZtdDNfaW5zLT5hZGRyZXNzOworICAgICAgY3VyX3BhdGNoID0gc2VxdWVuY2VyX3BhdGNoZXM7CisgICAgICBza2lwX2FkZHIgPSAwOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgYWRkcmVzczspCisgICAgICB7CisgICAgICAgIGFpYzd4eHhfY2hlY2tfcGF0Y2gocCwgJmN1cl9wYXRjaCwgaSwgJnNraXBfYWRkcik7CisgICAgICAgIGlmIChza2lwX2FkZHIgPiBpKQorICAgICAgICB7CisgICAgICAgICAgaW50IGVuZF9hZGRyOworCisgICAgICAgICAgZW5kX2FkZHIgPSBtaW5fdChpbnQsIGFkZHJlc3MsIHNraXBfYWRkcik7CisgICAgICAgICAgYWRkcmVzc19vZmZzZXQgKz0gZW5kX2FkZHIgLSBpOworICAgICAgICAgIGkgPSBza2lwX2FkZHI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICB9CisgICAgICBhZGRyZXNzIC09IGFkZHJlc3Nfb2Zmc2V0OworICAgICAgZm10M19pbnMtPmFkZHJlc3MgPSBhZGRyZXNzOworICAgICAgLyogRmFsbCBUaHJvdWdoIHRvIHRoZSBuZXh0IGNvZGUgc2VjdGlvbiAqLworICAgIH0KKyAgICBjYXNlIEFJQ19PUF9PUjoKKyAgICBjYXNlIEFJQ19PUF9BTkQ6CisgICAgY2FzZSBBSUNfT1BfWE9SOgorICAgIGNhc2UgQUlDX09QX0FERDoKKyAgICBjYXNlIEFJQ19PUF9BREM6CisgICAgY2FzZSBBSUNfT1BfQk1PVjoKKyAgICAgIGlmIChmbXQxX2lucy0+cGFyaXR5ICE9IDApCisgICAgICB7CisgICAgICAgIGZtdDFfaW5zLT5pbW1lZGlhdGUgPSBkY29uc3RzW2ZtdDFfaW5zLT5pbW1lZGlhdGVdOworICAgICAgfQorICAgICAgZm10MV9pbnMtPnBhcml0eSA9IDA7CisgICAgICAvKiBGYWxsIFRocm91Z2ggdG8gdGhlIG5leHQgY29kZSBzZWN0aW9uICovCisgICAgY2FzZSBBSUNfT1BfUk9MOgorICAgICAgaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisgICAgICB7CisgICAgICAgIGludCBpLCBjb3VudDsKKworICAgICAgICAvKiBDYWxjdWxhdGUgb2RkIHBhcml0eSBmb3IgdGhlIGluc3RydWN0aW9uICovCisgICAgICAgIGZvciAoIGk9MCwgY291bnQ9MDsgaSA8IDMxOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICB1bnNpZ25lZCBpbnQgbWFzazsKKworICAgICAgICAgIG1hc2sgPSAweDAxIDw8IGk7CisgICAgICAgICAgaWYgKChpbnN0ci5pbnRlZ2VyICYgbWFzaykgIT0gMCkKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoY291bnQgJiAweDAxKSkKKyAgICAgICAgICBpbnN0ci5mb3JtYXQxLnBhcml0eSA9IDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmIChmbXQzX2lucyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaW5zdHIuaW50ZWdlciA9ICBmbXQzX2lucy0+aW1tZWRpYXRlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGZtdDNfaW5zLT5zb3VyY2UgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZm10M19pbnMtPmFkZHJlc3MgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGZtdDNfaW5zLT5vcGNvZGUgPDwgMjUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGluc3RyLmludGVnZXIgPSAgZm10MV9pbnMtPmltbWVkaWF0ZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChmbXQxX2lucy0+c291cmNlIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGZtdDFfaW5zLT5kZXN0aW5hdGlvbiA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZm10MV9pbnMtPnJldCA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZm10MV9pbnMtPm9wY29kZSA8PCAyNSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGFpY19vdXRiKHAsIChpbnN0ci5pbnRlZ2VyICYgMHhmZiksIFNFUVJBTSk7CisgICAgICBhaWNfb3V0YihwLCAoKGluc3RyLmludGVnZXIgPj4gOCkgJiAweGZmKSwgU0VRUkFNKTsKKyAgICAgIGFpY19vdXRiKHAsICgoaW5zdHIuaW50ZWdlciA+PiAxNikgJiAweGZmKSwgU0VRUkFNKTsKKyAgICAgIGFpY19vdXRiKHAsICgoaW5zdHIuaW50ZWdlciA+PiAyNCkgJiAweGZmKSwgU0VRUkFNKTsKKyAgICAgIHVkZWxheSgxMCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBwYW5pYygiYWljN3h4eDogVW5rbm93biBvcGNvZGUgZW5jb3VudGVyZWQgaW4gc2VxdWVuY2VyIHByb2dyYW0uIik7CisgICAgICBicmVhazsKKyAgfQorfQorCisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9sb2Fkc2VxCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIExvYWQgdGhlIHNlcXVlbmNlciBjb2RlIGludG8gdGhlIGNvbnRyb2xsZXIgbWVtb3J5LgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9sb2Fkc2VxKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisgIHN0cnVjdCBzZXF1ZW5jZXJfcGF0Y2ggKmN1cl9wYXRjaDsKKyAgaW50IGk7CisgIGludCBkb3dubG9hZGVkOworICBpbnQgc2tpcF9hZGRyOworICB1bnNpZ25lZCBjaGFyIGRvd25sb2FkX2NvbnN0c1s0XSA9IHswLCAwLCAwLCAwfTsKKworICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRSkKKyAgeworICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIERvd25sb2FkaW5nIHNlcXVlbmNlciBjb2RlLi4uIiwgcC0+aG9zdF9ubyk7CisgIH0KKyNpZiAwCisgIGRvd25sb2FkX2NvbnN0c1tUTU9ERV9OVU1DTURTXSA9IHAtPm51bV90YXJnZXRjbWRzOworI2VuZGlmCisgIGRvd25sb2FkX2NvbnN0c1tUTU9ERV9OVU1DTURTXSA9IDA7CisgIGN1cl9wYXRjaCA9ICZzZXF1ZW5jZXJfcGF0Y2hlc1swXTsKKyAgZG93bmxvYWRlZCA9IDA7CisgIHNraXBfYWRkciA9IDA7CisKKyAgYWljX291dGIocCwgUEVSUk9SRElTfExPQURSQU18RkFJTERJU3xGQVNUTU9ERSwgU0VRQ1RMKTsKKyAgYWljX291dGIocCwgMCwgU0VRQUREUjApOworICBhaWNfb3V0YihwLCAwLCBTRVFBRERSMSk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzZXFwcm9nKSAvIDQ7ICBpKyspCisgIHsKKyAgICBpZiAoYWljN3h4eF9jaGVja19wYXRjaChwLCAmY3VyX3BhdGNoLCBpLCAmc2tpcF9hZGRyKSA9PSAwKQorICAgIHsKKyAgICAgIC8qIFNraXAgdGhpcyBpbnN0cnVjdGlvbiBmb3IgdGhpcyBjb25maWd1cmF0aW9uLiAqLworICAgICAgY29udGludWU7CisgICAgfQorICAgIGFpYzd4eHhfZG93bmxvYWRfaW5zdHIocCwgaSwgJmRvd25sb2FkX2NvbnN0c1swXSk7CisgICAgZG93bmxvYWRlZCsrOworICB9CisKKyAgYWljX291dGIocCwgMCwgU0VRQUREUjApOworICBhaWNfb3V0YihwLCAwLCBTRVFBRERSMSk7CisgIGFpY19vdXRiKHAsIEZBU1RNT0RFIHwgRkFJTERJUywgU0VRQ1RMKTsKKyAgdW5wYXVzZV9zZXF1ZW5jZXIocCwgVFJVRSk7CisgIG1kZWxheSgxKTsKKyAgcGF1c2Vfc2VxdWVuY2VyKHApOworICBhaWNfb3V0YihwLCBGQVNUTU9ERSwgU0VRQ1RMKTsKKyAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUpCisgIHsKKyAgICBwcmludGsoIiAlZCBpbnN0cnVjdGlvbnMgZG93bmxvYWRlZFxuIiwgZG93bmxvYWRlZCk7CisgIH0KKyAgaWYgKGFpYzd4eHhfZHVtcF9zZXF1ZW5jZXIpCisgICAgYWljN3h4eF9wcmludF9zZXF1ZW5jZXIocCwgZG93bmxvYWRlZCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9wcmludF9zZXF1ZW5jZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUHJpbnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZXF1ZW5jZXIgbWVtb3J5IHRvIHRoZSBzY3JlZW4uCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X3ByaW50X3NlcXVlbmNlcihzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBpbnQgZG93bmxvYWRlZCkKK3sKKyAgaW50IGksIGssIHRlbXA7CisgIAorICBhaWNfb3V0YihwLCBQRVJST1JESVN8TE9BRFJBTXxGQUlMRElTfEZBU1RNT0RFLCBTRVFDVEwpOworICBhaWNfb3V0YihwLCAwLCBTRVFBRERSMCk7CisgIGFpY19vdXRiKHAsIDAsIFNFUUFERFIxKTsKKworICBrID0gMDsKKyAgZm9yIChpPTA7IGkgPCBkb3dubG9hZGVkOyBpKyspCisgIHsKKyAgICBpZiAoIGsgPT0gMCApCisgICAgICBwcmludGsoIiUwM3g6ICIsIGkpOworICAgIHRlbXAgPSBhaWNfaW5iKHAsIFNFUVJBTSk7CisgICAgdGVtcCB8PSAoYWljX2luYihwLCBTRVFSQU0pIDw8IDgpOworICAgIHRlbXAgfD0gKGFpY19pbmIocCwgU0VRUkFNKSA8PCAxNik7CisgICAgdGVtcCB8PSAoYWljX2luYihwLCBTRVFSQU0pIDw8IDI0KTsKKyAgICBwcmludGsoIiUwOHgiLCB0ZW1wKTsKKyAgICBpZiAoICsrayA9PSA4ICkKKyAgICB7CisgICAgICBwcmludGsoIlxuIik7CisgICAgICBrID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgcHJpbnRrKCIgIik7CisgIH0KKyAgYWljX291dGIocCwgMCwgU0VRQUREUjApOworICBhaWNfb3V0YihwLCAwLCBTRVFBRERSMSk7CisgIGFpY19vdXRiKHAsIEZBU1RNT0RFIHwgRkFJTERJUywgU0VRQ1RMKTsKKyAgdW5wYXVzZV9zZXF1ZW5jZXIocCwgVFJVRSk7CisgIG1kZWxheSgxKTsKKyAgcGF1c2Vfc2VxdWVuY2VyKHApOworICBhaWNfb3V0YihwLCBGQVNUTU9ERSwgU0VRQ1RMKTsKKyAgcHJpbnRrKCJcbiIpOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfaW5mbworICoKKyAqIERlc2NyaXB0aW9uOgorICogICBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZHJpdmVyLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY29uc3QgY2hhciAqCithaWM3eHh4X2luZm8oc3RydWN0IFNjc2lfSG9zdCAqZG9vaCkKK3sKKyAgc3RhdGljIGNoYXIgYnVmZmVyWzI1Nl07CisgIGNoYXIgKmJwOworICBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwOworCisgIGJwID0gJmJ1ZmZlclswXTsKKyAgcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopZG9vaC0+aG9zdGRhdGE7CisgIG1lbXNldChicCwgMCwgc2l6ZW9mKGJ1ZmZlcikpOworICBzdHJjcHkoYnAsICJBZGFwdGVjIEFIQTI3NHgvMjg0eC8yOTR4IChFSVNBL1ZMQi9QQ0ktRmFzdCBTQ1NJKSAiKTsKKyAgc3RyY2F0KGJwLCBBSUM3WFhYX0NfVkVSU0lPTik7CisgIHN0cmNhdChicCwgIi8iKTsKKyAgc3RyY2F0KGJwLCBBSUM3WFhYX0hfVkVSU0lPTik7CisgIHN0cmNhdChicCwgIlxuIik7CisgIHN0cmNhdChicCwgIiAgICAgICA8Iik7CisgIHN0cmNhdChicCwgYm9hcmRfbmFtZXNbcC0+Ym9hcmRfbmFtZV9pbmRleF0pOworICBzdHJjYXQoYnAsICI+Iik7CisKKyAgcmV0dXJuKGJwKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2ZpbmRfc3luY3JhdGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgTG9vayB1cCB0aGUgdmFsaWQgcGVyaW9kIHRvIFNDU0lSQVRFIGNvbnZlcnNpb24gaW4gb3VyIHRhYmxlCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgYWljN3h4eF9zeW5jcmF0ZSAqCithaWM3eHh4X2ZpbmRfc3luY3JhdGUoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgdW5zaWduZWQgaW50ICpwZXJpb2QsCisgIHVuc2lnbmVkIGludCBtYXhzeW5jLCB1bnNpZ25lZCBjaGFyICpvcHRpb25zKQoreworICBzdHJ1Y3QgYWljN3h4eF9zeW5jcmF0ZSAqc3luY3JhdGU7CisgIGludCBkb25lID0gRkFMU0U7CisKKyAgc3dpdGNoKCpvcHRpb25zKQorICB7CisgICAgY2FzZSBNU0dfRVhUX1BQUl9PUFRJT05fRFRfQ1JDOgorICAgIGNhc2UgTVNHX0VYVF9QUFJfT1BUSU9OX0RUX1VOSVRTOgorICAgICAgaWYoIShwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTMpKQorICAgICAgeworICAgICAgICAqb3B0aW9ucyA9IDA7CisgICAgICAgIG1heHN5bmMgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIG1heHN5bmMsIEFIQ19TWU5DUkFURV9VTFRSQTIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBNU0dfRVhUX1BQUl9PUFRJT05fRFRfQ1JDX1FVSUNLOgorICAgIGNhc2UgTVNHX0VYVF9QUFJfT1BUSU9OX0RUX1VOSVRTX1FVSUNLOgorICAgICAgaWYoIShwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTMpKQorICAgICAgeworICAgICAgICAqb3B0aW9ucyA9IDA7CisgICAgICAgIG1heHN5bmMgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIG1heHN5bmMsIEFIQ19TWU5DUkFURV9VTFRSQTIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKgorICAgICAgICAgKiB3ZSBkb24ndCBzdXBwb3J0IHRoZSBRdWljayBBcmJpdHJhdGlvbiB2YXJpYW50cyBvZiBkdWFsIGVkZ2UKKyAgICAgICAgICogY2xvY2tpbmcuICBBcyBpdCB0dXJucyBvdXQsIHdlIHdhbnQgdG8gc2VuZCBiYWNrIHRoZQorICAgICAgICAgKiBzYW1lIGJhc2ljIG9wdGlvbiwgYnV0IHdpdGhvdXQgdGhlIFFBIGF0dHJpYnV0ZS4KKyAgICAgICAgICogV2Uga25vdyB0aGF0IHdlIGFyZSByZXNwb25kaW5nIGJlY2F1c2Ugd2Ugd291bGQgbmV2ZXIgc2V0CisgICAgICAgICAqIHRoZXNlIG9wdGlvbnMgb3Vyc2VsZiwgd2Ugd291bGQgb25seSByZXNwb25kIHRvIHRoZW0uCisgICAgICAgICAqLworICAgICAgICBzd2l0Y2goKm9wdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIE1TR19FWFRfUFBSX09QVElPTl9EVF9DUkNfUVVJQ0s6CisgICAgICAgICAgICAqb3B0aW9ucyA9IE1TR19FWFRfUFBSX09QVElPTl9EVF9DUkM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIE1TR19FWFRfUFBSX09QVElPTl9EVF9VTklUU19RVUlDSzoKKyAgICAgICAgICAgICpvcHRpb25zID0gTVNHX0VYVF9QUFJfT1BUSU9OX0RUX1VOSVRTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAqb3B0aW9ucyA9IDA7CisgICAgICBtYXhzeW5jID0gbWF4X3QodW5zaWduZWQgaW50LCBtYXhzeW5jLCBBSENfU1lOQ1JBVEVfVUxUUkEyKTsKKyAgICAgIGJyZWFrOworICB9CisgIHN5bmNyYXRlID0gJmFpYzd4eHhfc3luY3JhdGVzW21heHN5bmNdOworICB3aGlsZSAoIChzeW5jcmF0ZS0+cmF0ZVswXSAhPSBOVUxMKSAmJgorICAgICAgICAgKCEocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSB8fCBzeW5jcmF0ZS0+c3hmcl91bHRyYTIpICkKKyAgeworICAgIGlmICgqcGVyaW9kIDw9IHN5bmNyYXRlLT5wZXJpb2QpIAorICAgIHsKKyAgICAgIHN3aXRjaCgqb3B0aW9ucykKKyAgICAgIHsKKyAgICAgICAgY2FzZSBNU0dfRVhUX1BQUl9PUFRJT05fRFRfQ1JDOgorICAgICAgICBjYXNlIE1TR19FWFRfUFBSX09QVElPTl9EVF9VTklUUzoKKyAgICAgICAgICBpZighKHN5bmNyYXRlLT5zeGZyX3VsdHJhMiAmIEFIQ19TWU5DUkFURV9DUkMpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRvbmUgPSBUUlVFOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIG9vcHMsIHdlIHdlbnQgdG9vIGxvdyBmb3IgdGhlIENSQy9EdWFsRWRnZSBzaWduYWxsaW5nLCBzbworICAgICAgICAgICAgICogY2xlYXIgdGhlIG9wdGlvbnMgYnl0ZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICAqb3B0aW9ucyA9IDA7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogV2UnbGwgYmUgc2VuZGluZyBhIHJlcGx5IHRvIHRoaXMgcGFja2V0IHRvIHNldCB0aGUgb3B0aW9ucworICAgICAgICAgICAgICogcHJvcGVybHksIHNvIHVuaWxhdGVyYWxseSBzZXQgdGhlIHBlcmlvZCBhcyB3ZWxsLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICAqcGVyaW9kID0gc3luY3JhdGUtPnBlcmlvZDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRvbmUgPSBUUlVFOworICAgICAgICAgICAgaWYoc3luY3JhdGUgPT0gJmFpYzd4eHhfc3luY3JhdGVzW21heHN5bmNdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAqcGVyaW9kID0gc3luY3JhdGUtPnBlcmlvZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaWYoIShzeW5jcmF0ZS0+c3hmcl91bHRyYTIgJiBBSENfU1lOQ1JBVEVfQ1JDKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgICAgIGlmKHN5bmNyYXRlID09ICZhaWM3eHh4X3N5bmNyYXRlc1ttYXhzeW5jXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgKnBlcmlvZCA9IHN5bmNyYXRlLT5wZXJpb2Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYoZG9uZSkKKyAgICAgIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHN5bmNyYXRlKys7CisgIH0KKyAgaWYgKCAoKnBlcmlvZCA9PSAwKSB8fCAoc3luY3JhdGUtPnJhdGVbMF0gPT0gTlVMTCkgfHwKKyAgICAgICAoKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgJiYgKHN5bmNyYXRlLT5zeGZyX3VsdHJhMiA9PSAwKSkgKQorICB7CisgICAgLyoKKyAgICAgKiBVc2UgYXN5bmMgdHJhbnNmZXJzIGZvciB0aGlzIHRhcmdldAorICAgICAqLworICAgICpvcHRpb25zID0gMDsKKyAgICAqcGVyaW9kID0gMjU1OworICAgIHN5bmNyYXRlID0gTlVMTDsKKyAgfQorICByZXR1cm4gKHN5bmNyYXRlKTsKK30KKworCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfZmluZF9wZXJpb2QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgTG9vayB1cCB0aGUgdmFsaWQgU0NTSVJBVEUgdG8gcGVyaW9kIGNvbnZlcnNpb24gaW4gb3VyIHRhYmxlCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2FpYzd4eHhfZmluZF9wZXJpb2Qoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgdW5zaWduZWQgaW50IHNjc2lyYXRlLAorICB1bnNpZ25lZCBpbnQgbWF4c3luYykKK3sKKyAgc3RydWN0IGFpYzd4eHhfc3luY3JhdGUgKnN5bmNyYXRlOworCisgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgIHsKKyAgICBzY3NpcmF0ZSAmPSBTWEZSX1VMVFJBMjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzY3NpcmF0ZSAmPSBTWEZSOworICB9CisKKyAgc3luY3JhdGUgPSAmYWljN3h4eF9zeW5jcmF0ZXNbbWF4c3luY107CisgIHdoaWxlIChzeW5jcmF0ZS0+cmF0ZVswXSAhPSBOVUxMKQorICB7CisgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikKKyAgICB7CisgICAgICBpZiAoc3luY3JhdGUtPnN4ZnJfdWx0cmEyID09IDApCisgICAgICAgIGJyZWFrOworICAgICAgZWxzZSBpZiAoc2NzaXJhdGUgPT0gc3luY3JhdGUtPnN4ZnJfdWx0cmEyKQorICAgICAgICByZXR1cm4gKHN5bmNyYXRlLT5wZXJpb2QpOworICAgICAgZWxzZSBpZiAoc2NzaXJhdGUgPT0gKHN5bmNyYXRlLT5zeGZyX3VsdHJhMiAmIH5BSENfU1lOQ1JBVEVfQ1JDKSkKKyAgICAgICAgcmV0dXJuIChzeW5jcmF0ZS0+cGVyaW9kKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2NzaXJhdGUgPT0gKHN5bmNyYXRlLT5zeGZyICYgflVMVFJBX1NYRlIpKQorICAgIHsKKyAgICAgIHJldHVybiAoc3luY3JhdGUtPnBlcmlvZCk7CisgICAgfQorICAgIHN5bmNyYXRlKys7CisgIH0KKyAgcmV0dXJuICgwKTsgLyogYXN5bmMgKi8KK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X3ZhbGlkYXRlX29mZnNldAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTZXQgYSB2YWxpZCBvZmZzZXQgdmFsdWUgZm9yIGEgcGFydGljdWxhciBjYXJkIGluIHVzZSBhbmQgdHJhbnNmZXIKKyAqICAgc2V0dGluZ3MgaW4gdXNlLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF92YWxpZGF0ZV9vZmZzZXQoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwKKyAgc3RydWN0IGFpYzd4eHhfc3luY3JhdGUgKnN5bmNyYXRlLCB1bnNpZ25lZCBpbnQgKm9mZnNldCwgaW50IHdpZGUpCit7CisgIHVuc2lnbmVkIGludCBtYXhvZmZzZXQ7CisKKyAgLyogTGltaXQgb2Zmc2V0IHRvIHdoYXQgdGhlIGNhcmQgKGFuZCBkZXZpY2UpIGNhbiBkbyAqLworICBpZiAoc3luY3JhdGUgPT0gTlVMTCkKKyAgeworICAgIG1heG9mZnNldCA9IDA7CisgIH0KKyAgZWxzZSBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICB7CisgICAgbWF4b2Zmc2V0ID0gTUFYX09GRlNFVF9VTFRSQTI7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKHdpZGUpCisgICAgICBtYXhvZmZzZXQgPSBNQVhfT0ZGU0VUXzE2QklUOworICAgIGVsc2UKKyAgICAgIG1heG9mZnNldCA9IE1BWF9PRkZTRVRfOEJJVDsKKyAgfQorICAqb2Zmc2V0ID0gbWluKCpvZmZzZXQsIG1heG9mZnNldCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9zZXRfc3luY3JhdGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgU2V0IHRoZSBhY3R1YWwgc3luY3JhdGUgZG93biBpbiB0aGUgY2FyZCBhbmQgaW4gb3VyIGhvc3Qgc3RydWN0cworICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9zZXRfc3luY3JhdGUoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgc3RydWN0IGFpYzd4eHhfc3luY3JhdGUgKnN5bmNyYXRlLAorICAgIGludCB0YXJnZXQsIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgcGVyaW9kLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorICAgIHVuc2lnbmVkIGNoYXIgb3B0aW9ucywgdW5zaWduZWQgaW50IHR5cGUsIHN0cnVjdCBhaWNfZGV2X2RhdGEgKmFpY19kZXYpCit7CisgIHVuc2lnbmVkIGNoYXIgdGluZGV4OworICB1bnNpZ25lZCBzaG9ydCB0YXJnZXRfbWFzazsKKyAgdW5zaWduZWQgY2hhciBsdW4sIG9sZF9vcHRpb25zOworICB1bnNpZ25lZCBpbnQgb2xkX3BlcmlvZCwgb2xkX29mZnNldDsKKworICB0aW5kZXggPSB0YXJnZXQgfCAoY2hhbm5lbCA8PCAzKTsKKyAgdGFyZ2V0X21hc2sgPSAweDAxIDw8IHRpbmRleDsKKyAgbHVuID0gYWljX2luYihwLCBTQ0JfVENMKSAmIDB4MDc7CisKKyAgaWYgKHN5bmNyYXRlID09IE5VTEwpCisgIHsKKyAgICBwZXJpb2QgPSAwOworICAgIG9mZnNldCA9IDA7CisgIH0KKworICBvbGRfcGVyaW9kID0gYWljX2Rldi0+Y3VyLnBlcmlvZDsKKyAgb2xkX29mZnNldCA9IGFpY19kZXYtPmN1ci5vZmZzZXQ7CisgIG9sZF9vcHRpb25zID0gYWljX2Rldi0+Y3VyLm9wdGlvbnM7CisKKyAgCisgIGlmICh0eXBlICYgQUhDX1RSQU5TX0NVUikKKyAgeworICAgIHVuc2lnbmVkIGludCBzY3NpcmF0ZTsKKworICAgIHNjc2lyYXRlID0gYWljX2luYihwLCBUQVJHX1NDU0lSQVRFICsgdGluZGV4KTsKKyAgICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgIHsKKyAgICAgIHNjc2lyYXRlICY9IH5TWEZSX1VMVFJBMjsKKyAgICAgIGlmIChzeW5jcmF0ZSAhPSBOVUxMKQorICAgICAgeworICAgICAgICBzd2l0Y2gob3B0aW9ucykKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgTVNHX0VYVF9QUFJfT1BUSU9OX0RUX1VOSVRTOgorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIG1hc2sgb2ZmIHRoZSBDUkMgYml0IGluIHRoZSB4ZmVyIHNldHRpbmdzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHNjc2lyYXRlIHw9IChzeW5jcmF0ZS0+c3hmcl91bHRyYTIgJiB+QUhDX1NZTkNSQVRFX0NSQyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc2NzaXJhdGUgfD0gc3luY3JhdGUtPnN4ZnJfdWx0cmEyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh0eXBlICYgQUhDX1RSQU5TX0FDVElWRSkKKyAgICAgIHsKKyAgICAgICAgYWljX291dGIocCwgb2Zmc2V0LCBTQ1NJT0ZGU0VUKTsKKyAgICAgIH0KKyAgICAgIGFpY19vdXRiKHAsIG9mZnNldCwgVEFSR19PRkZTRVQgKyB0aW5kZXgpOworICAgIH0KKyAgICBlbHNlIC8qIE5vdCBhbiBVbHRyYTIgY29udHJvbGxlciAqLworICAgIHsKKyAgICAgIHNjc2lyYXRlICY9IH4oU1hGUnxTT0ZTKTsKKyAgICAgIHAtPnVsdHJhZW5iICY9IH50YXJnZXRfbWFzazsKKyAgICAgIGlmIChzeW5jcmF0ZSAhPSBOVUxMKQorICAgICAgeworICAgICAgICBpZiAoc3luY3JhdGUtPnN4ZnIgJiBVTFRSQV9TWEZSKQorICAgICAgICB7CisgICAgICAgICAgcC0+dWx0cmFlbmIgfD0gdGFyZ2V0X21hc2s7CisgICAgICAgIH0KKyAgICAgICAgc2NzaXJhdGUgfD0gKHN5bmNyYXRlLT5zeGZyICYgU1hGUik7CisgICAgICAgIHNjc2lyYXRlIHw9IChvZmZzZXQgJiBTT0ZTKTsKKyAgICAgIH0KKyAgICAgIGlmICh0eXBlICYgQUhDX1RSQU5TX0FDVElWRSkKKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBzeGZyY3RsMDsKKworICAgICAgICBzeGZyY3RsMCA9IGFpY19pbmIocCwgU1hGUkNUTDApOworICAgICAgICBzeGZyY3RsMCAmPSB+RkFTVDIwOworICAgICAgICBpZiAocC0+dWx0cmFlbmIgJiB0YXJnZXRfbWFzaykKKyAgICAgICAgICBzeGZyY3RsMCB8PSBGQVNUMjA7CisgICAgICAgIGFpY19vdXRiKHAsIHN4ZnJjdGwwLCBTWEZSQ1RMMCk7CisgICAgICB9CisgICAgICBhaWNfb3V0YihwLCBwLT51bHRyYWVuYiAmIDB4ZmYsIFVMVFJBX0VOQik7CisgICAgICBhaWNfb3V0YihwLCAocC0+dWx0cmFlbmIgPj4gOCkgJiAweGZmLCBVTFRSQV9FTkIgKyAxICk7CisgICAgfQorICAgIGlmICh0eXBlICYgQUhDX1RSQU5TX0FDVElWRSkKKyAgICB7CisgICAgICBhaWNfb3V0YihwLCBzY3NpcmF0ZSwgU0NTSVJBVEUpOworICAgIH0KKyAgICBhaWNfb3V0YihwLCBzY3NpcmF0ZSwgVEFSR19TQ1NJUkFURSArIHRpbmRleCk7CisgICAgYWljX2Rldi0+Y3VyLnBlcmlvZCA9IHBlcmlvZDsKKyAgICBhaWNfZGV2LT5jdXIub2Zmc2V0ID0gb2Zmc2V0OworICAgIGFpY19kZXYtPmN1ci5vcHRpb25zID0gb3B0aW9uczsKKyAgICBpZiAoICEodHlwZSAmIEFIQ19UUkFOU19RVUlURSkgJiYKKyAgICAgICAgIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX05FR09USUFUSU9OKSAmJgorICAgICAgICAgKGFpY19kZXYtPmZsYWdzICYgREVWSUNFX1BSSU5UX0RUUikgKQorICAgIHsKKyAgICAgIGlmIChvZmZzZXQpCisgICAgICB7CisgICAgICAgIGludCByYXRlX21vZCA9IChzY3NpcmF0ZSAmIFdJREVYRkVSKSA/IDEgOiAwOworICAgICAgCisgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlN5bmNocm9ub3VzIGF0ICVzIE1ieXRlL3NlYywgIgorICAgICAgICAgICAgICAgIm9mZnNldCAlZC5cbiIsIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwgbHVuLAorICAgICAgICAgICAgICAgc3luY3JhdGUtPnJhdGVbcmF0ZV9tb2RdLCBvZmZzZXQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwcmludGsoSU5GT19MRUFEICJVc2luZyBhc3luY2hyb25vdXMgdHJhbnNmZXJzLlxuIiwKKyAgICAgICAgICAgICAgIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwgbHVuKTsKKyAgICAgIH0KKyAgICAgIGFpY19kZXYtPmZsYWdzICY9IH5ERVZJQ0VfUFJJTlRfRFRSOworICAgIH0KKyAgfQorCisgIGlmICh0eXBlICYgQUhDX1RSQU5TX0dPQUwpCisgIHsKKyAgICBhaWNfZGV2LT5nb2FsLnBlcmlvZCA9IHBlcmlvZDsKKyAgICBhaWNfZGV2LT5nb2FsLm9mZnNldCA9IG9mZnNldDsKKyAgICBhaWNfZGV2LT5nb2FsLm9wdGlvbnMgPSBvcHRpb25zOworICB9CisKKyAgaWYgKHR5cGUgJiBBSENfVFJBTlNfVVNFUikKKyAgeworICAgIHAtPnVzZXJbdGluZGV4XS5wZXJpb2QgPSBwZXJpb2Q7CisgICAgcC0+dXNlclt0aW5kZXhdLm9mZnNldCA9IG9mZnNldDsKKyAgICBwLT51c2VyW3RpbmRleF0ub3B0aW9ucyA9IG9wdGlvbnM7CisgIH0KK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X3NldF93aWR0aAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTZXQgdGhlIGFjdHVhbCB3aWR0aCBkb3duIGluIHRoZSBjYXJkIGFuZCBpbiBvdXIgaG9zdCBzdHJ1Y3RzCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X3NldF93aWR0aChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBpbnQgdGFyZ2V0LCBpbnQgY2hhbm5lbCwgaW50IGx1biwKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCB0eXBlLCBzdHJ1Y3QgYWljX2Rldl9kYXRhICphaWNfZGV2KQoreworICB1bnNpZ25lZCBjaGFyIHRpbmRleDsKKyAgdW5zaWduZWQgc2hvcnQgdGFyZ2V0X21hc2s7CisgIHVuc2lnbmVkIGludCBvbGRfd2lkdGg7CisKKyAgdGluZGV4ID0gdGFyZ2V0IHwgKGNoYW5uZWwgPDwgMyk7CisgIHRhcmdldF9tYXNrID0gMSA8PCB0aW5kZXg7CisgIAorICBvbGRfd2lkdGggPSBhaWNfZGV2LT5jdXIud2lkdGg7CisKKyAgaWYgKHR5cGUgJiBBSENfVFJBTlNfQ1VSKSAKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgc2NzaXJhdGU7CisKKyAgICBzY3NpcmF0ZSA9IGFpY19pbmIocCwgVEFSR19TQ1NJUkFURSArIHRpbmRleCk7CisKKyAgICBzY3NpcmF0ZSAmPSB+V0lERVhGRVI7CisgICAgaWYgKHdpZHRoID09IE1TR19FWFRfV0RUUl9CVVNfMTZfQklUKQorICAgICAgc2NzaXJhdGUgfD0gV0lERVhGRVI7CisKKyAgICBhaWNfb3V0YihwLCBzY3NpcmF0ZSwgVEFSR19TQ1NJUkFURSArIHRpbmRleCk7CisKKyAgICBpZiAodHlwZSAmIEFIQ19UUkFOU19BQ1RJVkUpCisgICAgICBhaWNfb3V0YihwLCBzY3NpcmF0ZSwgU0NTSVJBVEUpOworCisgICAgYWljX2Rldi0+Y3VyLndpZHRoID0gd2lkdGg7CisKKyAgICBpZiAoICEodHlwZSAmIEFIQ19UUkFOU19RVUlURSkgJiYKKyAgICAgICAgICAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9ORUdPVElBVElPTjIpICYmIAorICAgICAgICAgIChhaWNfZGV2LT5mbGFncyAmIERFVklDRV9QUklOVF9EVFIpICkKKyAgICB7CisgICAgICBwcmludGsoSU5GT19MRUFEICJVc2luZyAlcyB0cmFuc2ZlcnNcbiIsIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwKKyAgICAgICAgbHVuLCAoc2NzaXJhdGUgJiBXSURFWEZFUikgPyAiV2lkZSgxNmJpdCkiIDogIk5hcnJvdyg4Yml0KSIgKTsKKyAgICB9CisgIH0KKworICBpZiAodHlwZSAmIEFIQ19UUkFOU19HT0FMKQorICAgIGFpY19kZXYtPmdvYWwud2lkdGggPSB3aWR0aDsKKyAgaWYgKHR5cGUgJiBBSENfVFJBTlNfVVNFUikKKyAgICBwLT51c2VyW3RpbmRleF0ud2lkdGggPSB3aWR0aDsKKworICBpZiAoYWljX2Rldi0+Z29hbC5vZmZzZXQpCisgIHsKKyAgICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgIHsKKyAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0ID0gTUFYX09GRlNFVF9VTFRSQTI7CisgICAgfQorICAgIGVsc2UgaWYgKHdpZHRoID09IE1TR19FWFRfV0RUUl9CVVNfMTZfQklUKQorICAgIHsKKyAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0ID0gTUFYX09GRlNFVF8xNkJJVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0ID0gTUFYX09GRlNFVF84QklUOworICAgIH0KKyAgfQorfQorICAgICAgCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIHNjYnFfaW5pdAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTQ0IgcXVldWUgaW5pdGlhbGl6YXRpb24uCisgKgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorc2NicV9pbml0KHZvbGF0aWxlIHNjYl9xdWV1ZV90eXBlICpxdWV1ZSkKK3sKKyAgcXVldWUtPmhlYWQgPSBOVUxMOworICBxdWV1ZS0+dGFpbCA9IE5VTEw7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgc2NicV9pbnNlcnRfaGVhZAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBBZGQgYW4gU0NCIHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LgorICoKKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkCitzY2JxX2luc2VydF9oZWFkKHZvbGF0aWxlIHNjYl9xdWV1ZV90eXBlICpxdWV1ZSwgc3RydWN0IGFpYzd4eHhfc2NiICpzY2IpCit7CisgIHNjYi0+cV9uZXh0ID0gcXVldWUtPmhlYWQ7CisgIHF1ZXVlLT5oZWFkID0gc2NiOworICBpZiAocXVldWUtPnRhaWwgPT0gTlVMTCkgICAgICAgLyogSWYgbGlzdCB3YXMgZW1wdHksIHVwZGF0ZSB0YWlsLiAqLworICAgIHF1ZXVlLT50YWlsID0gcXVldWUtPmhlYWQ7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgc2NicV9yZW1vdmVfaGVhZAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBSZW1vdmUgYW4gU0NCIGZyb20gdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisgKgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhaWM3eHh4X3NjYiAqCitzY2JxX3JlbW92ZV9oZWFkKHZvbGF0aWxlIHNjYl9xdWV1ZV90eXBlICpxdWV1ZSkKK3sKKyAgc3RydWN0IGFpYzd4eHhfc2NiICogc2NicDsKKworICBzY2JwID0gcXVldWUtPmhlYWQ7CisgIGlmIChxdWV1ZS0+aGVhZCAhPSBOVUxMKQorICAgIHF1ZXVlLT5oZWFkID0gcXVldWUtPmhlYWQtPnFfbmV4dDsKKyAgaWYgKHF1ZXVlLT5oZWFkID09IE5VTEwpICAgICAgIC8qIElmIGxpc3QgaXMgbm93IGVtcHR5LCB1cGRhdGUgdGFpbC4gKi8KKyAgICBxdWV1ZS0+dGFpbCA9IE5VTEw7CisgIHJldHVybihzY2JwKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBzY2JxX3JlbW92ZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBSZW1vdmVzIGFuIFNDQiBmcm9tIHRoZSBsaXN0LgorICoKKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkCitzY2JxX3JlbW92ZSh2b2xhdGlsZSBzY2JfcXVldWVfdHlwZSAqcXVldWUsIHN0cnVjdCBhaWM3eHh4X3NjYiAqc2NiKQoreworICBpZiAocXVldWUtPmhlYWQgPT0gc2NiKQorICB7CisgICAgLyogQXQgYmVnaW5uaW5nIG9mIHF1ZXVlLCByZW1vdmUgZnJvbSBoZWFkLiAqLworICAgIHNjYnFfcmVtb3ZlX2hlYWQocXVldWUpOworICB9CisgIGVsc2UKKyAgeworICAgIHN0cnVjdCBhaWM3eHh4X3NjYiAqY3Vyc2NiID0gcXVldWUtPmhlYWQ7CisKKyAgICAvKgorICAgICAqIFNlYXJjaCB1bnRpbCB0aGUgbmV4dCBzY2IgaXMgdGhlIG9uZSB3ZSdyZSBsb29raW5nIGZvciwgb3IKKyAgICAgKiB3ZSBydW4gb3V0IG9mIHF1ZXVlLgorICAgICAqLworICAgIHdoaWxlICgoY3Vyc2NiICE9IE5VTEwpICYmIChjdXJzY2ItPnFfbmV4dCAhPSBzY2IpKQorICAgIHsKKyAgICAgIGN1cnNjYiA9IGN1cnNjYi0+cV9uZXh0OworICAgIH0KKyAgICBpZiAoY3Vyc2NiICE9IE5VTEwpCisgICAgeworICAgICAgLyogRm91bmQgaXQuICovCisgICAgICBjdXJzY2ItPnFfbmV4dCA9IHNjYi0+cV9uZXh0OworICAgICAgaWYgKHNjYi0+cV9uZXh0ID09IE5VTEwpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgdGFpbCB3aGVuIHJlbW92aW5nIHRoZSB0YWlsLiAqLworICAgICAgICBxdWV1ZS0+dGFpbCA9IGN1cnNjYjsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBzY2JxX2luc2VydF90YWlsCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIEFkZCBhbiBTQ0IgYXQgdGhlIHRhaWwgb2YgdGhlIGxpc3QuCisgKgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQKK3NjYnFfaW5zZXJ0X3RhaWwodm9sYXRpbGUgc2NiX3F1ZXVlX3R5cGUgKnF1ZXVlLCBzdHJ1Y3QgYWljN3h4eF9zY2IgKnNjYikKK3sKKyAgc2NiLT5xX25leHQgPSBOVUxMOworICBpZiAocXVldWUtPnRhaWwgIT0gTlVMTCkgICAgICAgLyogQWRkIHRoZSBzY2IgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4gKi8KKyAgICBxdWV1ZS0+dGFpbC0+cV9uZXh0ID0gc2NiOworICBxdWV1ZS0+dGFpbCA9IHNjYjsgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSB0YWlsLiAqLworICBpZiAocXVldWUtPmhlYWQgPT0gTlVMTCkgICAgICAgLyogSWYgbGlzdCB3YXMgZW1wdHksIHVwZGF0ZSBoZWFkLiAqLworICAgIHF1ZXVlLT5oZWFkID0gcXVldWUtPnRhaWw7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9tYXRjaF9zY2IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgQ2hlY2tzIHRvIHNlZSBpZiBhbiBzY2IgbWF0Y2hlcyB0aGUgdGFyZ2V0L2NoYW5uZWwgYXMgc3BlY2lmaWVkLgorICogICBJZiB0YXJnZXQgaXMgQUxMX1RBUkdFVFMgKC0xKSwgdGhlbiB3ZSdyZSBsb29raW5nIGZvciBhbnkgZGV2aWNlCisgKiAgIG9uIHRoZSBzcGVjaWZpZWQgY2hhbm5lbDsgdGhpcyBoYXBwZW5zIHdoZW4gYSBjaGFubmVsIGlzIGdvaW5nCisgKiAgIHRvIGJlIHJlc2V0IGFuZCBhbGwgZGV2aWNlcyBvbiB0aGF0IGNoYW5uZWwgbXVzdCBiZSBhYm9ydGVkLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X21hdGNoX3NjYihzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBzdHJ1Y3QgYWljN3h4eF9zY2IgKnNjYiwKKyAgICBpbnQgdGFyZ2V0LCBpbnQgY2hhbm5lbCwgaW50IGx1biwgdW5zaWduZWQgY2hhciB0YWcpCit7CisgIGludCB0YXJnID0gKHNjYi0+aHNjYi0+dGFyZ2V0X2NoYW5uZWxfbHVuID4+IDQpICYgMHgwRjsKKyAgaW50IGNoYW4gPSAoc2NiLT5oc2NiLT50YXJnZXRfY2hhbm5lbF9sdW4gPj4gMykgJiAweDAxOworICBpbnQgc2x1biA9IHNjYi0+aHNjYi0+dGFyZ2V0X2NoYW5uZWxfbHVuICYgMHgwNzsKKyAgaW50IG1hdGNoOworCisgIG1hdGNoID0gKChjaGFuID09IGNoYW5uZWwpIHx8IChjaGFubmVsID09IEFMTF9DSEFOTkVMUykpOworICBpZiAobWF0Y2ggIT0gMCkKKyAgICBtYXRjaCA9ICgodGFyZyA9PSB0YXJnZXQpIHx8ICh0YXJnZXQgPT0gQUxMX1RBUkdFVFMpKTsKKyAgaWYgKG1hdGNoICE9IDApCisgICAgbWF0Y2ggPSAoKGx1biA9PSBzbHVuKSB8fCAobHVuID09IEFMTF9MVU5TKSk7CisgIGlmIChtYXRjaCAhPSAwKQorICAgIG1hdGNoID0gKCh0YWcgPT0gc2NiLT5oc2NiLT50YWcpIHx8ICh0YWcgPT0gU0NCX0xJU1RfTlVMTCkpOworCisgIHJldHVybiAobWF0Y2gpOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfYWRkX2N1cnNjYl90b19mcmVlX2xpc3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgQWRkcyB0aGUgY3VycmVudCBzY2IgKGluIFNDQlBUUikgdG8gdGhlIGxpc3Qgb2YgZnJlZSBTQ0JzLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9hZGRfY3Vyc2NiX3RvX2ZyZWVfbGlzdChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKQoreworICAvKgorICAgKiBJbnZhbGlkYXRlIHRoZSB0YWcgc28gdGhhdCBhaWM3eHh4X2ZpbmRfc2NiIGRvZXNuJ3QgdGhpbmsKKyAgICogaXQncyBhY3RpdmUKKyAgICovCisgIGFpY19vdXRiKHAsIFNDQl9MSVNUX05VTEwsIFNDQl9UQUcpOworICBhaWNfb3V0YihwLCAwLCBTQ0JfQ09OVFJPTCk7CisKKyAgYWljX291dGIocCwgYWljX2luYihwLCBGUkVFX1NDQkgpLCBTQ0JfTkVYVCk7CisgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0NCUFRSKSwgRlJFRV9TQ0JIKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X3JlbV9zY2JfZnJvbV9kaXNjX2xpc3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUmVtb3ZlcyB0aGUgY3VycmVudCBTQ0IgZnJvbSB0aGUgZGlzY29ubmVjdGVkIGxpc3QgYW5kIGFkZHMgaXQKKyAqICAgdG8gdGhlIGZyZWUgbGlzdC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVuc2lnbmVkIGNoYXIKK2FpYzd4eHhfcmVtX3NjYl9mcm9tX2Rpc2NfbGlzdChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCB1bnNpZ25lZCBjaGFyIHNjYnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHByZXYpCit7CisgIHVuc2lnbmVkIGNoYXIgbmV4dDsKKworICBhaWNfb3V0YihwLCBzY2JwdHIsIFNDQlBUUik7CisgIG5leHQgPSBhaWNfaW5iKHAsIFNDQl9ORVhUKTsKKyAgYWljN3h4eF9hZGRfY3Vyc2NiX3RvX2ZyZWVfbGlzdChwKTsKKworICBpZiAocHJldiAhPSBTQ0JfTElTVF9OVUxMKQorICB7CisgICAgYWljX291dGIocCwgcHJldiwgU0NCUFRSKTsKKyAgICBhaWNfb3V0YihwLCBuZXh0LCBTQ0JfTkVYVCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgYWljX291dGIocCwgbmV4dCwgRElTQ09OTkVDVEVEX1NDQkgpOworICB9CisKKyAgcmV0dXJuIG5leHQ7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9idXN5X3RhcmdldAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTZXQgdGhlIHNwZWNpZmllZCB0YXJnZXQgYnVzeS4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkCithaWM3eHh4X2J1c3lfdGFyZ2V0KHN0cnVjdCBhaWM3eHh4X2hvc3QgKnAsIHN0cnVjdCBhaWM3eHh4X3NjYiAqc2NiKQoreworICBwLT51bnRhZ2dlZF9zY2JzW3NjYi0+aHNjYi0+dGFyZ2V0X2NoYW5uZWxfbHVuXSA9IHNjYi0+aHNjYi0+dGFnOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfaW5kZXhfYnVzeV90YXJnZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGJ1c3kgdGFyZ2V0LCBhbmQgb3B0aW9uYWxseSBzZXRzIHRoZQorICogICB0YXJnZXQgaW5hY3RpdmUuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhcgorYWljN3h4eF9pbmRleF9idXN5X3RhcmdldChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCB1bnNpZ25lZCBjaGFyIHRjbCwKKyAgICBpbnQgdW5idXN5KQoreworICB1bnNpZ25lZCBjaGFyIGJ1c3lfc2NiaWQ7CisKKyAgYnVzeV9zY2JpZCA9IHAtPnVudGFnZ2VkX3NjYnNbdGNsXTsKKyAgaWYgKHVuYnVzeSkKKyAgeworICAgIHAtPnVudGFnZ2VkX3NjYnNbdGNsXSA9IFNDQl9MSVNUX05VTEw7CisgIH0KKyAgcmV0dXJuIChidXN5X3NjYmlkKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2ZpbmRfc2NiCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIExvb2sgdGhyb3VnaCB0aGUgU0NCIGFycmF5IG9mIHRoZSBjYXJkIGFuZCBhdHRlbXB0IHRvIGZpbmQgdGhlCisgKiAgIGhhcmR3YXJlIFNDQiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBwYXNzZWQgaW4gU0NCLiAgUmV0dXJuCisgKiAgIFNDQl9MSVNUX05VTEwgaWYgdW5zdWNjZXNzZnVsLiAgVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCB0aGUKKyAqICAgY2FyZCBpcyBhbHJlYWR5IHBhdXNlZC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVuc2lnbmVkIGNoYXIKK2FpYzd4eHhfZmluZF9zY2Ioc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgc3RydWN0IGFpYzd4eHhfc2NiICpzY2IpCit7CisgIHVuc2lnbmVkIGNoYXIgc2F2ZWRfc2NicHRyOworICB1bnNpZ25lZCBjaGFyIGN1cmluZGV4OworCisgIHNhdmVkX3NjYnB0ciA9IGFpY19pbmIocCwgU0NCUFRSKTsKKyAgY3VyaW5kZXggPSAwOworICBmb3IgKGN1cmluZGV4ID0gMDsgY3VyaW5kZXggPCBwLT5zY2JfZGF0YS0+bWF4aHNjYnM7IGN1cmluZGV4KyspCisgIHsKKyAgICBhaWNfb3V0YihwLCBjdXJpbmRleCwgU0NCUFRSKTsKKyAgICBpZiAoYWljX2luYihwLCBTQ0JfVEFHKSA9PSBzY2ItPmhzY2ItPnRhZykKKyAgICB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYWljX291dGIocCwgc2F2ZWRfc2NicHRyLCBTQ0JQVFIpOworICBpZiAoY3VyaW5kZXggPj0gcC0+c2NiX2RhdGEtPm1heGhzY2JzKQorICB7CisgICAgY3VyaW5kZXggPSBTQ0JfTElTVF9OVUxMOworICB9CisKKyAgcmV0dXJuIChjdXJpbmRleCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9hbGxvY2F0ZV9zY2IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgR2V0IGFuIFNDQiBmcm9tIHRoZSBmcmVlIGxpc3Qgb3IgYnkgYWxsb2NhdGluZyBhIG5ldyBvbmUuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2FpYzd4eHhfYWxsb2NhdGVfc2NiKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisgIHN0cnVjdCBhaWM3eHh4X3NjYiAgICpzY2JwID0gTlVMTDsKKyAgaW50IHNjYl9zaXplID0gKHNpemVvZiAoc3RydWN0IGh3X3NjYXR0ZXJsaXN0KSAqIEFJQzdYWFhfTUFYX1NHKSArIDEyICsgNjsKKyAgaW50IGk7CisgIGludCBzdGVwID0gUEFHRV9TSVpFIC8gMTAyNDsKKyAgdW5zaWduZWQgbG9uZyBzY2JfY291bnQgPSAwOworICBzdHJ1Y3QgaHdfc2NhdHRlcmxpc3QgKmhzZ3A7CisgIHN0cnVjdCBhaWM3eHh4X3NjYiAqc2NiX2FwOworICBzdHJ1Y3QgYWljN3h4eF9zY2JfZG1hICpzY2JfZG1hOworICB1bnNpZ25lZCBjaGFyICpidWZzOworCisgIGlmIChwLT5zY2JfZGF0YS0+bnVtc2NicyA8IHAtPnNjYl9kYXRhLT5tYXhzY2JzKQorICB7CisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIG9wdGltYWwgbnVtYmVyIG9mIFNDQnMgdG8gYWxsb2NhdGUuCisgICAgICoKKyAgICAgKiBOT1RFOiBUaGlzIGZvcm11bGEgd29ya3MgYmVjYXVzZSB0aGUgc2l6ZW9mKHNnX2FycmF5KSBpcyBhbHdheXMKKyAgICAgKiAxMDI0LiAgVGhlcmVmb3JlLCBzY2Jfc2l6ZSAqIGkgd291bGQgYWx3YXlzIGJlID4gUEFHRV9TSVpFICoKKyAgICAgKiAoaS9zdGVwKS4gIFRoZSAoaS0xKSBhbGxvd3MgdGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoZSBlcXVhdGlvbgorICAgICAqIHRvIGdyb3cgaW50byB0aGUgcmlnaHQgaGFuZCBzaWRlIHRvIGEgcG9pbnQgb2YgbmVhciBwZXJmZWN0CisgICAgICogZWZmaWNpZW5jeSBzaW5jZSBzY2Jfc2l6ZSAqIChpIC0xKSBpcyBncm93aW5nIHNsaWdodGx5IGZhc3RlcgorICAgICAqIHRoYW4gdGhlIHJpZ2h0IGhhbmQgc2lkZS4gIElmIHRoZSBudW1iZXIgb2YgU0cgYXJyYXkgZWxlbWVudHMKKyAgICAgKiBpcyBjaGFuZ2VkLCB0aGlzIGZ1bmN0aW9uIG1heSBub3QgYmUgbmVhciBzbyBlZmZpY2llbnQgYW55IG1vcmUuCisgICAgICoKKyAgICAgKiBTaW5jZSB0aGUgRE1BJ2FibGUgYnVmZmVycyBhcmUgbm93IGFsbG9jYXRlZCBpbiBhIHNlcGFyYXRlCisgICAgICogY2h1bmsgdGhpcyBhbGdvcml0aG0gaGFzIGJlZW4gbW9kaWZpZWQgdG8gbWF0Y2guICBUaGUgJzEyJworICAgICAqIGFuZCAnNicgZmFjdG9ycyBpbiBzY2Jfc2l6ZSBhcmUgZm9yIHRoZSBETUEnYWJsZSBjb21tYW5kIGJ5dGUKKyAgICAgKiBhbmQgc2Vuc2VidWZmZXJzIHJlc3BlY3RpdmVseS4gIC1EYXZlTQorICAgICAqLworICAgIGZvciAoIGk9c3RlcDs7IGkgKj0gMiApCisgICAgeworICAgICAgaWYgKCAoc2NiX3NpemUgKiAoaS0xKSkgPj0gKCAoUEFHRV9TSVpFICogKGkvc3RlcCkpIC0gNjQgKSApCisgICAgICB7CisgICAgICAgIGkgLz0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHNjYl9jb3VudCA9IG1pbiggKGktMSksIHAtPnNjYl9kYXRhLT5tYXhzY2JzIC0gcC0+c2NiX2RhdGEtPm51bXNjYnMpOworICAgIHNjYl9hcCA9IChzdHJ1Y3QgYWljN3h4eF9zY2IgKilrbWFsbG9jKHNpemVvZiAoc3RydWN0IGFpYzd4eHhfc2NiKSAqIHNjYl9jb3VudAorCQkJCQkgICArIHNpemVvZihzdHJ1Y3QgYWljN3h4eF9zY2JfZG1hKSwgR0ZQX0FUT01JQyk7CisgICAgaWYgKHNjYl9hcCA9PSBOVUxMKQorICAgICAgcmV0dXJuKDApOworICAgIHNjYl9kbWEgPSAoc3RydWN0IGFpYzd4eHhfc2NiX2RtYSAqKSZzY2JfYXBbc2NiX2NvdW50XTsKKyAgICBoc2dwID0gKHN0cnVjdCBod19zY2F0dGVybGlzdCAqKQorICAgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocC0+cGRldiwgc2NiX3NpemUgKiBzY2JfY291bnQsCisJCQkgICAmc2NiX2RtYS0+ZG1hX2FkZHJlc3MpOworICAgIGlmIChoc2dwID09IE5VTEwpCisgICAgeworICAgICAga2ZyZWUoc2NiX2FwKTsKKyAgICAgIHJldHVybigwKTsKKyAgICB9CisgICAgYnVmcyA9ICh1bnNpZ25lZCBjaGFyICopJmhzZ3Bbc2NiX2NvdW50ICogQUlDN1hYWF9NQVhfU0ddOworI2lmZGVmIEFJQzdYWFhfVkVSQk9TRV9ERUJVR0dJTkcKKyAgICBpZiAoYWljN3h4eF92ZXJib3NlID4gMHhmZmZmKQorICAgIHsKKyAgICAgIGlmIChwLT5zY2JfZGF0YS0+bnVtc2NicyA9PSAwKQorCXByaW50ayhJTkZPX0xFQUQgIkFsbG9jYXRpbmcgaW5pdGlhbCAlbGQgU0NCIHN0cnVjdHVyZXMuXG4iLAorCSAgcC0+aG9zdF9ubywgLTEsIC0xLCAtMSwgc2NiX2NvdW50KTsKKyAgICAgIGVsc2UKKwlwcmludGsoSU5GT19MRUFEICJBbGxvY2F0aW5nICVsZCBhZGRpdGlvbmFsIFNDQiBzdHJ1Y3R1cmVzLlxuIiwKKwkgIHAtPmhvc3Rfbm8sIC0xLCAtMSwgLTEsIHNjYl9jb3VudCk7CisgICAgfQorI2VuZGlmCisgICAgbWVtc2V0KHNjYl9hcCwgMCwgc2l6ZW9mIChzdHJ1Y3QgYWljN3h4eF9zY2IpICogc2NiX2NvdW50KTsKKyAgICBzY2JfZG1hLT5kbWFfb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpc2NiX2RtYS0+ZG1hX2FkZHJlc3MKKwkJCSAgLSAodW5zaWduZWQgbG9uZyloc2dwOworICAgIHNjYl9kbWEtPmRtYV9sZW4gPSBzY2Jfc2l6ZSAqIHNjYl9jb3VudDsKKyAgICBmb3IgKGk9MDsgaSA8IHNjYl9jb3VudDsgaSsrKQorICAgIHsKKyAgICAgIHNjYnAgPSAmc2NiX2FwW2ldOworICAgICAgc2NicC0+aHNjYiA9ICZwLT5zY2JfZGF0YS0+aHNjYnNbcC0+c2NiX2RhdGEtPm51bXNjYnNdOworICAgICAgc2NicC0+c2dfbGlzdCA9ICZoc2dwW2kgKiBBSUM3WFhYX01BWF9TR107CisgICAgICBzY2JwLT5zZW5zZV9jbWQgPSBidWZzOworICAgICAgc2NicC0+Y21uZCA9IGJ1ZnMgKyA2OworICAgICAgYnVmcyArPSAxMiArIDY7CisgICAgICBzY2JwLT5zY2JfZG1hID0gc2NiX2RtYTsKKyAgICAgIG1lbXNldChzY2JwLT5oc2NiLCAwLCBzaXplb2Yoc3RydWN0IGFpYzd4eHhfaHdzY2IpKTsKKyAgICAgIHNjYnAtPmhzY2ItPnRhZyA9IHAtPnNjYl9kYXRhLT5udW1zY2JzOworICAgICAgLyoKKyAgICAgICAqIFBsYWNlIGluIHRoZSBzY2IgYXJyYXk7IG5ldmVyIGlzIHJlbW92ZWQKKyAgICAgICAqLworICAgICAgcC0+c2NiX2RhdGEtPnNjYl9hcnJheVtwLT5zY2JfZGF0YS0+bnVtc2NicysrXSA9IHNjYnA7CisgICAgICBzY2JxX2luc2VydF90YWlsKCZwLT5zY2JfZGF0YS0+ZnJlZV9zY2JzLCBzY2JwKTsKKyAgICB9CisgICAgc2NicC0+a21hbGxvY19wdHIgPSBzY2JfYXA7CisgIH0KKyAgcmV0dXJuKHNjYl9jb3VudCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9xdWV1ZV9jbWRfY29tcGxldGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgRHVlIHRvIHJhY2UgY29uZGl0aW9ucyBwcmVzZW50IGluIHRoZSBTQ1NJIHN1YnN5c3RlbSwgaXQgaXMgZWFzaWVyCisgKiAgIHRvIHF1ZXVlIGNvbXBsZXRlZCBjb21tYW5kcywgdGhlbiBjYWxsIHNjc2lfZG9uZSgpIG9uIHRoZW0gd2hlbgorICogICB3ZSdyZSBmaW5pc2hlZC4gIFRoaXMgZnVuY3Rpb24gcXVldWVzIHRoZSBjb21wbGV0ZWQgY29tbWFuZHMuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X3F1ZXVlX2NtZF9jb21wbGV0ZShzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBTY3NpX0NtbmQgKmNtZCkKK3sKKyAgYWljN3h4eF9wb3NpdGlvbihjbWQpID0gU0NCX0xJU1RfTlVMTDsKKyAgY21kLT5ob3N0X3NjcmliYmxlID0gKGNoYXIgKilwLT5jb21wbGV0ZXEuaGVhZDsKKyAgcC0+Y29tcGxldGVxLmhlYWQgPSBjbWQ7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9kb25lX2NtZHNfY29tcGxldGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUHJvY2VzcyB0aGUgY29tcGxldGVkIGNvbW1hbmQgcXVldWUuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X2RvbmVfY21kc19jb21wbGV0ZShzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKQoreworICBTY3NpX0NtbmQgKmNtZDsKKyAgCisgIHdoaWxlIChwLT5jb21wbGV0ZXEuaGVhZCAhPSBOVUxMKQorICB7CisgICAgY21kID0gcC0+Y29tcGxldGVxLmhlYWQ7CisgICAgcC0+Y29tcGxldGVxLmhlYWQgPSAoU2NzaV9DbW5kICopY21kLT5ob3N0X3NjcmliYmxlOworICAgIGNtZC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisgICAgY21kLT5zY3NpX2RvbmUoY21kKTsKKyAgfQorfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfZnJlZV9zY2IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgRnJlZSB0aGUgc2NiIGFuZCBpbnNlcnQgaW50byB0aGUgZnJlZSBzY2IgbGlzdC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfZnJlZV9zY2Ioc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgc3RydWN0IGFpYzd4eHhfc2NiICpzY2IpCit7CisKKyAgc2NiLT5mbGFncyA9IFNDQl9GUkVFOworICBzY2ItPmNtZCA9IE5VTEw7CisgIHNjYi0+c2dfY291bnQgPSAwOworICBzY2ItPnNnX2xlbmd0aCA9IDA7CisgIHNjYi0+dGFnX2FjdGlvbiA9IDA7CisgIHNjYi0+aHNjYi0+Y29udHJvbCA9IDA7CisgIHNjYi0+aHNjYi0+dGFyZ2V0X3N0YXR1cyA9IDA7CisgIHNjYi0+aHNjYi0+dGFyZ2V0X2NoYW5uZWxfbHVuID0gU0NCX0xJU1RfTlVMTDsKKworICBzY2JxX2luc2VydF9oZWFkKCZwLT5zY2JfZGF0YS0+ZnJlZV9zY2JzLCBzY2IpOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfZG9uZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBDYWxscyB0aGUgaGlnaGVyIGxldmVsIHNjc2kgZG9uZSBmdW5jdGlvbiBhbmQgZnJlZXMgdGhlIHNjYi4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfZG9uZShzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBzdHJ1Y3QgYWljN3h4eF9zY2IgKnNjYikKK3sKKyAgU2NzaV9DbW5kICpjbWQgPSBzY2ItPmNtZDsKKyAgc3RydWN0IGFpY19kZXZfZGF0YSAqYWljX2RldiA9IGNtZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKyAgaW50IHRpbmRleCA9IFRBUkdFVF9JTkRFWChjbWQpOworICBzdHJ1Y3QgYWljN3h4eF9zY2IgKnNjYnA7CisgIHVuc2lnbmVkIGNoYXIgcXVldWVfZGVwdGg7CisKKyAgaWYgKGNtZC0+dXNlX3NnID4gMSkKKyAgeworICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisKKyAgICBzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPnJlcXVlc3RfYnVmZmVyOworICAgIHBjaV91bm1hcF9zZyhwLT5wZGV2LCBzZywgY21kLT51c2Vfc2csIHNjc2lfdG9fcGNpX2RtYV9kaXIoY21kLT5zY19kYXRhX2RpcmVjdGlvbikpOworICB9CisgIGVsc2UgaWYgKGNtZC0+cmVxdWVzdF9idWZmbGVuKQorICAgIHBjaV91bm1hcF9zaW5nbGUocC0+cGRldiwgYWljN3h4eF9tYXBwaW5nKGNtZCksCisJCSAgICAgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sCisgICAgICAgICAgICAgICAgICAgICBzY3NpX3RvX3BjaV9kbWFfZGlyKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKyAgaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfU0VOU0UpCisgIHsKKyAgICBwY2lfdW5tYXBfc2luZ2xlKHAtPnBkZXYsCisgICAgICAgICAgICAgICAgICAgICBsZTMyX3RvX2NwdShzY2ItPnNnX2xpc3RbMF0uYWRkcmVzcyksCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKyAgfQorICBpZiAoc2NiLT5mbGFncyAmIFNDQl9SRUNPVkVSWV9TQ0IpCisgIHsKKyAgICBwLT5mbGFncyAmPSB+QUhDX0FCT1JUX1BFTkRJTkc7CisgIH0KKyAgaWYgKHNjYi0+ZmxhZ3MgJiAoU0NCX1JFU0VUfFNDQl9BQk9SVCkpCisgIHsKKyAgICBjbWQtPnJlc3VsdCB8PSAoRElEX1JFU0VUIDw8IDE2KTsKKyAgfQorCisgIGlmICgoc2NiLT5mbGFncyAmIFNDQl9NU0dPVVRfQklUUykgIT0gMCkKKyAgeworICAgIHVuc2lnbmVkIHNob3J0IG1hc2s7CisgICAgaW50IG1lc3NhZ2VfZXJyb3IgPSBGQUxTRTsKKworICAgIG1hc2sgPSAweDAxIDw8IHRpbmRleDsKKyAKKyAgICAvKgorICAgICAqIENoZWNrIHRvIHNlZSBpZiB3ZSBnZXQgYW4gaW52YWxpZCBtZXNzYWdlIG9yIGEgbWVzc2FnZSBlcnJvcgorICAgICAqIGFmdGVyIGZhaWxpbmcgdG8gbmVnb3RpYXRlIGEgd2lkZSBvciBzeW5jIHRyYW5zZmVyIG1lc3NhZ2UuCisgICAgICovCisgICAgaWYgKChzY2ItPmZsYWdzICYgU0NCX1NFTlNFKSAmJiAKKyAgICAgICAgICAoKHNjYi0+Y21kLT5zZW5zZV9idWZmZXJbMTJdID09IDB4NDMpIHx8ICAvKiBJTlZBTElEX01FU1NBR0UgKi8KKyAgICAgICAgICAoc2NiLT5jbWQtPnNlbnNlX2J1ZmZlclsxMl0gPT0gMHg0OSkpKSAvKiBNRVNTQUdFX0VSUk9SICAqLworICAgIHsKKyAgICAgIG1lc3NhZ2VfZXJyb3IgPSBUUlVFOworICAgIH0KKworICAgIGlmIChzY2ItPmZsYWdzICYgU0NCX01TR09VVF9XRFRSKQorICAgIHsKKyAgICAgIGlmIChtZXNzYWdlX2Vycm9yKQorICAgICAgeworICAgICAgICBpZiAoIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX05FR09USUFUSU9OMikgJiYKKyAgICAgICAgICAgICAoYWljX2Rldi0+ZmxhZ3MgJiBERVZJQ0VfUFJJTlRfRFRSKSApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJEZXZpY2UgZmFpbGVkIHRvIGNvbXBsZXRlIFdpZGUgTmVnb3RpYXRpb24gIgorICAgICAgICAgICAgInByb2Nlc3NpbmcgYW5kXG4iLCBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYikpOworICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgInJldHVybmVkIGEgc2Vuc2UgZXJyb3IgY29kZSBmb3IgaW52YWxpZCBtZXNzYWdlLCAiCisgICAgICAgICAgICAiZGlzYWJsaW5nIGZ1dHVyZVxuIiwgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJXaWRlIG5lZ290aWF0aW9uIHRvIHRoaXMgZGV2aWNlLlxuIiwgcC0+aG9zdF9ubywKKyAgICAgICAgICAgIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgICAgIH0KKyAgICAgICAgYWljX2Rldi0+bmVlZHdkdHIgPSBhaWNfZGV2LT5uZWVkd2R0cl9jb3B5ID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfTVNHT1VUX1NEVFIpCisgICAgeworICAgICAgaWYgKG1lc3NhZ2VfZXJyb3IpCisgICAgICB7CisgICAgICAgIGlmICggKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKSAmJgorICAgICAgICAgICAgIChhaWNfZGV2LT5mbGFncyAmIERFVklDRV9QUklOVF9EVFIpICkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIkRldmljZSBmYWlsZWQgdG8gY29tcGxldGUgU3luYyBOZWdvdGlhdGlvbiAiCisgICAgICAgICAgICAicHJvY2Vzc2luZyBhbmRcbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAicmV0dXJuZWQgYSBzZW5zZSBlcnJvciBjb2RlIGZvciBpbnZhbGlkIG1lc3NhZ2UsICIKKyAgICAgICAgICAgICJkaXNhYmxpbmcgZnV0dXJlXG4iLCBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYikpOworICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlN5bmMgbmVnb3RpYXRpb24gdG8gdGhpcyBkZXZpY2UuXG4iLCBwLT5ob3N0X25vLAorICAgICAgICAgICAgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgICAgICBhaWNfZGV2LT5mbGFncyAmPSB+REVWSUNFX1BSSU5UX0RUUjsKKyAgICAgICAgfQorICAgICAgICBhaWNfZGV2LT5uZWVkc2R0ciA9IGFpY19kZXYtPm5lZWRzZHRyX2NvcHkgPSAwOworICAgICAgfQorICAgIH0KKyAgICBpZiAoc2NiLT5mbGFncyAmIFNDQl9NU0dPVVRfUFBSKQorICAgIHsKKyAgICAgIGlmKG1lc3NhZ2VfZXJyb3IpCisgICAgICB7CisgICAgICAgIGlmICggKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKSAmJgorICAgICAgICAgICAgIChhaWNfZGV2LT5mbGFncyAmIERFVklDRV9QUklOVF9EVFIpICkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIkRldmljZSBmYWlsZWQgdG8gY29tcGxldGUgUGFyYWxsZWwgUHJvdG9jb2wgIgorICAgICAgICAgICAgIlJlcXVlc3QgcHJvY2Vzc2luZyBhbmRcbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAicmV0dXJuZWQgYSBzZW5zZSBlcnJvciBjb2RlIGZvciBpbnZhbGlkIG1lc3NhZ2UsICIKKyAgICAgICAgICAgICJkaXNhYmxpbmcgZnV0dXJlXG4iLCBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYikpOworICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlBhcmFsbGVsIFByb3RvY29sIFJlcXVlc3QgbmVnb3RpYXRpb24gdG8gdGhpcyAiCisgICAgICAgICAgICAiZGV2aWNlLlxuIiwgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICAgKiBEaXNhYmxlIFBQUiBuZWdvdGlhdGlvbiBhbmQgcmV2ZXJ0IGJhY2sgdG8gV0RUUiBhbmQgU0RUUiBzZXR1cAorICAgICAgICAgKi8KKyAgICAgICAgYWljX2Rldi0+bmVlZHBwciA9IGFpY19kZXYtPm5lZWRwcHJfY29weSA9IDA7CisgICAgICAgIGFpY19kZXYtPm5lZWRzZHRyID0gYWljX2Rldi0+bmVlZHNkdHJfY29weSA9IDE7CisgICAgICAgIGFpY19kZXYtPm5lZWR3ZHRyID0gYWljX2Rldi0+bmVlZHdkdHJfY29weSA9IDE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcXVldWVfZGVwdGggPSBhaWNfZGV2LT50ZW1wX3FfZGVwdGg7CisgIGlmIChxdWV1ZV9kZXB0aCA+PSBhaWNfZGV2LT5hY3RpdmVfY21kcykKKyAgeworICAgIHNjYnAgPSBzY2JxX3JlbW92ZV9oZWFkKCZhaWNfZGV2LT5kZWxheWVkX3NjYnMpOworICAgIGlmIChzY2JwKQorICAgIHsKKyAgICAgIGlmIChxdWV1ZV9kZXB0aCA9PSAxKQorICAgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBHaXZlIGV4dHJhIHByZWZlcmVuY2UgdG8gdW50YWdnZWQgZGV2aWNlcywgc3VjaCBhcyBDRC1SIGRldmljZXMKKyAgICAgICAgICogVGhpcyBtYWtlcyBpdCBtb3JlIGxpa2VseSB0aGF0IGEgZHJpdmUgKndvbid0KiBzdHVmZiB1cCB3aGlsZQorICAgICAgICAgKiB3YWl0aW5nIG9uIGRhdGEgYXQgYSBjcml0aWNhbCB0aW1lLCBzdWNoIGFzIENELVIgd3JpdGluZyBhbmQKKyAgICAgICAgICogYXVkaW8gQ0QgcmlwcGluZyBvcGVyYXRpb25zLiAgU2hvdWxkIGFsc28gYmVuZWZpdCB0YXBlIGRyaXZlcy4KKyAgICAgICAgICovCisgICAgICAgIHNjYnFfaW5zZXJ0X2hlYWQoJnAtPndhaXRpbmdfc2Nicywgc2NicCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHNjYnFfaW5zZXJ0X3RhaWwoJnAtPndhaXRpbmdfc2Nicywgc2NicCk7CisgICAgICB9CisjaWZkZWYgQUlDN1hYWF9WRVJCT1NFX0RFQlVHR0lORworICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSA+IDB4ZmZmZikKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiTW92aW5nIFNDQiBmcm9tIGRlbGF5ZWQgdG8gd2FpdGluZyBxdWV1ZS5cbiIsCisgICAgICAgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYnApKTsKKyNlbmRpZgorICAgICAgaWYgKHF1ZXVlX2RlcHRoID4gYWljX2Rldi0+YWN0aXZlX2NtZHMpCisgICAgICB7CisgICAgICAgIHNjYnAgPSBzY2JxX3JlbW92ZV9oZWFkKCZhaWNfZGV2LT5kZWxheWVkX3NjYnMpOworICAgICAgICBpZiAoc2NicCkKKyAgICAgICAgICBzY2JxX2luc2VydF90YWlsKCZwLT53YWl0aW5nX3NjYnMsIHNjYnApOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoIShzY2ItPnRhZ19hY3Rpb24pKQorICB7CisgICAgYWljN3h4eF9pbmRleF9idXN5X3RhcmdldChwLCBzY2ItPmhzY2ItPnRhcmdldF9jaGFubmVsX2x1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuYnVzeSAqLyBUUlVFKTsKKyAgICBpZiAoY21kLT5kZXZpY2UtPnNpbXBsZV90YWdzKQorICAgIHsKKyAgICAgIGFpY19kZXYtPnRlbXBfcV9kZXB0aCA9IGFpY19kZXYtPm1heF9xX2RlcHRoOworICAgIH0KKyAgfQorICBpZihzY2ItPmZsYWdzICYgU0NCX0RUUl9TQ0IpCisgIHsKKyAgICBhaWNfZGV2LT5kdHJfcGVuZGluZyA9IDA7CisgIH0KKyAgYWljX2Rldi0+YWN0aXZlX2NtZHMtLTsKKyAgcC0+YWN0aXZlc2Nicy0tOworCisgIGlmICgoc2NiLT5zZ19sZW5ndGggPj0gNTEyKSAmJiAoKChjbWQtPnJlc3VsdCA+PiAxNikgJiAweGYpID09IERJRF9PSykpCisgIHsKKyAgICBsb25nICpwdHI7CisgICAgaW50IHgsIGk7CisKKworICAgIGlmIChycV9kYXRhX2RpcihjbWQtPnJlcXVlc3QpID09IFdSSVRFKQorICAgIHsKKyAgICAgIGFpY19kZXYtPndfdG90YWwrKzsKKyAgICAgIHB0ciA9IGFpY19kZXYtPndfYmluczsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGFpY19kZXYtPnJfdG90YWwrKzsKKyAgICAgIHB0ciA9IGFpY19kZXYtPnJfYmluczsKKyAgICB9CisgICAgaWYoY21kLT5kZXZpY2UtPnNpbXBsZV90YWdzICYmIGNtZC0+cmVxdWVzdC0+ZmxhZ3MgJiBSRVFfSEFSREJBUlJJRVIpCisgICAgeworICAgICAgYWljX2Rldi0+YmFycmllcl90b3RhbCsrOworICAgICAgaWYoc2NiLT50YWdfYWN0aW9uID09IE1TR19PUkRFUkVEX1FfVEFHKQorICAgICAgICBhaWNfZGV2LT5vcmRlcmVkX3RvdGFsKys7CisgICAgfQorICAgIHggPSBzY2ItPnNnX2xlbmd0aDsKKyAgICB4ID4+PSAxMDsKKyAgICBmb3IoaT0wOyBpPDY7IGkrKykKKyAgICB7CisgICAgICB4ID4+PSAyOworICAgICAgaWYoIXgpIHsKKyAgICAgICAgcHRyW2ldKys7CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmKGkgPT0gNiAmJiB4KQorICAgICAgcHRyWzVdKys7CisgIH0KKyAgYWljN3h4eF9mcmVlX3NjYihwLCBzY2IpOworICBhaWM3eHh4X3F1ZXVlX2NtZF9jb21wbGV0ZShwLCBjbWQpOworCit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9ydW5fZG9uZV9xdWV1ZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBDYWxscyB0aGUgYWljN3h4eF9kb25lKCkgZm9yIHRoZSBTY3NpX0NtbmQgb2YgZWFjaCBzY2IgaW4gdGhlCisgKiAgIGFib3J0ZWQgbGlzdCwgYW5kIGFkZHMgZWFjaCBzY2IgdG8gdGhlIGZyZWUgbGlzdC4gIElmIGNvbXBsZXRlCisgKiAgIGlzIFRSVUUsIHdlIGFsc28gcHJvY2VzcyB0aGUgY29tbWFuZHMgY29tcGxldGUgbGlzdC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfcnVuX2RvbmVfcXVldWUoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgLypjb21wbGV0ZSovIGludCBjb21wbGV0ZSkKK3sKKyAgc3RydWN0IGFpYzd4eHhfc2NiICpzY2I7CisgIGludCBpLCBmb3VuZCA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IHAtPnNjYl9kYXRhLT5udW1zY2JzOyBpKyspCisgIHsKKyAgICBzY2IgPSBwLT5zY2JfZGF0YS0+c2NiX2FycmF5W2ldOworICAgIGlmIChzY2ItPmZsYWdzICYgU0NCX1FVRVVFRF9GT1JfRE9ORSkKKyAgICB7CisgICAgICBpZiAoc2NiLT5mbGFncyAmIFNDQl9RVUVVRV9GVUxMKQorICAgICAgeworCXNjYi0+Y21kLT5yZXN1bHQgPSBRVUVVRV9GVUxMIDw8IDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiAoVkVSQk9TRV9BQk9SVF9QUk9DRVNTIHwgVkVSQk9TRV9SRVNFVF9QUk9DRVNTKSkKKyAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJBYm9ydGluZyBzY2IgJWRcbiIsCisgICAgICAgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYiksIHNjYi0+aHNjYi0+dGFnKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2xlYXIgYW55IHJlc2lkdWFsIGluZm9ybWF0aW9uIHNpbmNlIHRoZSBub3JtYWwgYWljN3h4eF9kb25lKCkgcGF0aAorICAgICAgICAgKiBkb2Vzbid0IHRvdWNoIHRoZSByZXNpZHVhbHMuCisgICAgICAgICAqLworICAgICAgICBzY2ItPmhzY2ItPnJlc2lkdWFsX1NHX3NlZ21lbnRfY291bnQgPSAwOworICAgICAgICBzY2ItPmhzY2ItPnJlc2lkdWFsX2RhdGFfY291bnRbMF0gPSAwOworICAgICAgICBzY2ItPmhzY2ItPnJlc2lkdWFsX2RhdGFfY291bnRbMV0gPSAwOworICAgICAgICBzY2ItPmhzY2ItPnJlc2lkdWFsX2RhdGFfY291bnRbMl0gPSAwOworICAgICAgfQorICAgICAgZm91bmQrKzsKKyAgICAgIGFpYzd4eHhfZG9uZShwLCBzY2IpOworICAgIH0KKyAgfQorICBpZiAoYWljN3h4eF92ZXJib3NlICYgKFZFUkJPU0VfQUJPUlRfUkVUVVJOIHwgVkVSQk9TRV9SRVNFVF9SRVRVUk4pKQorICB7CisgICAgcHJpbnRrKElORk9fTEVBRCAiJWQgY29tbWFuZHMgZm91bmQgYW5kIHF1ZXVlZCBmb3IgIgorICAgICAgICAiY29tcGxldGlvbi5cbiIsIHAtPmhvc3Rfbm8sIC0xLCAtMSwgLTEsIGZvdW5kKTsKKyAgfQorICBpZiAoY29tcGxldGUpCisgIHsKKyAgICBhaWM3eHh4X2RvbmVfY21kc19jb21wbGV0ZShwKTsKKyAgfQorfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfYWJvcnRfd2FpdGluZ19zY2IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgTWFuaXB1bGF0ZSB0aGUgd2FpdGluZyBmb3Igc2VsZWN0aW9uIGxpc3QgYW5kIHJldHVybiB0aGUKKyAqICAgc2NiIHRoYXQgZm9sbG93cyB0aGUgb25lIHRoYXQgd2UgcmVtb3ZlLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgY2hhcgorYWljN3h4eF9hYm9ydF93YWl0aW5nX3NjYihzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBzdHJ1Y3QgYWljN3h4eF9zY2IgKnNjYiwKKyAgICB1bnNpZ25lZCBjaGFyIHNjYnBvcywgdW5zaWduZWQgY2hhciBwcmV2KQoreworICB1bnNpZ25lZCBjaGFyIGN1cnNjYiwgbmV4dDsKKworICAvKgorICAgKiBTZWxlY3QgdGhlIFNDQiB3ZSB3YW50IHRvIGFib3J0IGFuZCBwdWxsIHRoZSBuZXh0IHBvaW50ZXIgb3V0IG9mIGl0LgorICAgKi8KKyAgY3Vyc2NiID0gYWljX2luYihwLCBTQ0JQVFIpOworICBhaWNfb3V0YihwLCBzY2Jwb3MsIFNDQlBUUik7CisgIG5leHQgPSBhaWNfaW5iKHAsIFNDQl9ORVhUKTsKKworICBhaWM3eHh4X2FkZF9jdXJzY2JfdG9fZnJlZV9saXN0KHApOworCisgIC8qCisgICAqIFVwZGF0ZSB0aGUgd2FpdGluZyBsaXN0CisgICAqLworICBpZiAocHJldiA9PSBTQ0JfTElTVF9OVUxMKQorICB7CisgICAgLyoKKyAgICAgKiBGaXJzdCBpbiB0aGUgbGlzdAorICAgICAqLworICAgIGFpY19vdXRiKHAsIG5leHQsIFdBSVRJTkdfU0NCSCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyoKKyAgICAgKiBTZWxlY3QgdGhlIHNjYiB0aGF0IHBvaW50ZWQgdG8gdXMgYW5kIHVwZGF0ZSBpdHMgbmV4dCBwb2ludGVyLgorICAgICAqLworICAgIGFpY19vdXRiKHAsIHByZXYsIFNDQlBUUik7CisgICAgYWljX291dGIocCwgbmV4dCwgU0NCX05FWFQpOworICB9CisgIC8qCisgICAqIFBvaW50IHVzIGJhY2sgYXQgdGhlIG9yaWdpbmFsIHNjYiBwb3NpdGlvbiBhbmQgaW5mb3JtIHRoZSBTQ1NJCisgICAqIHN5c3RlbSB0aGF0IHRoZSBjb21tYW5kIGhhcyBiZWVuIGFib3J0ZWQuCisgICAqLworICBhaWNfb3V0YihwLCBjdXJzY2IsIFNDQlBUUik7CisgIHJldHVybiAobmV4dCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9zZWFyY2hfcWluZmlmbworICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTZWFyY2ggdGhlIHF1ZXVlLWluIEZJRk8gZm9yIG1hdGNoaW5nIFNDQnMgYW5kIGNvbmRpdGlvbmFsbHkKKyAqICAgcmVxdWV1ZS4gIFJldHVybnMgdGhlIG51bWJlciBvZiBtYXRjaGluZyBTQ0JzLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X3NlYXJjaF9xaW5maWZvKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnAsIGludCB0YXJnZXQsIGludCBjaGFubmVsLAorICAgIGludCBsdW4sIHVuc2lnbmVkIGNoYXIgdGFnLCBpbnQgZmxhZ3MsIGludCByZXF1ZXVlLAorICAgIHZvbGF0aWxlIHNjYl9xdWV1ZV90eXBlICpxdWV1ZSkKK3sKKyAgaW50ICAgICAgZm91bmQ7CisgIHVuc2lnbmVkIGNoYXIgcWlucG9zLCBxaW50YWlsOworICBzdHJ1Y3QgYWljN3h4eF9zY2IgKnNjYnA7CisKKyAgZm91bmQgPSAwOworICBxaW5wb3MgPSBhaWNfaW5iKHAsIFFJTlBPUyk7CisgIHFpbnRhaWwgPSBwLT5xaW5maWZvbmV4dDsKKworICBwLT5xaW5maWZvbmV4dCA9IHFpbnBvczsKKworICB3aGlsZSAocWlucG9zICE9IHFpbnRhaWwpCisgIHsKKyAgICBzY2JwID0gcC0+c2NiX2RhdGEtPnNjYl9hcnJheVtwLT5xaW5maWZvW3FpbnBvcysrXV07CisgICAgaWYgKGFpYzd4eHhfbWF0Y2hfc2NiKHAsIHNjYnAsIHRhcmdldCwgY2hhbm5lbCwgbHVuLCB0YWcpKQorICAgIHsKKyAgICAgICAvKgorICAgICAgICAqIFdlIGZvdW5kIGFuIHNjYiB0aGF0IG5lZWRzIHRvIGJlIHJlbW92ZWQuCisgICAgICAgICovCisgICAgICAgaWYgKHJlcXVldWUgJiYgKHF1ZXVlICE9IE5VTEwpKQorICAgICAgIHsKKyAgICAgICAgIGlmIChzY2JwLT5mbGFncyAmIFNDQl9XQUlUSU5HUSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgc2NicV9yZW1vdmUocXVldWUsIHNjYnApOworICAgICAgICAgICBzY2JxX3JlbW92ZSgmcC0+d2FpdGluZ19zY2JzLCBzY2JwKTsKKyAgICAgICAgICAgc2NicV9yZW1vdmUoJkFJQ19ERVYoc2NicC0+Y21kKS0+ZGVsYXllZF9zY2JzLCBzY2JwKTsKKyAgICAgICAgICAgQUlDX0RFVihzY2JwLT5jbWQpLT5hY3RpdmVfY21kcysrOworICAgICAgICAgICBwLT5hY3RpdmVzY2JzKys7CisgICAgICAgICB9CisgICAgICAgICBzY2JxX2luc2VydF90YWlsKHF1ZXVlLCBzY2JwKTsKKyAgICAgICAgIEFJQ19ERVYoc2NicC0+Y21kKS0+YWN0aXZlX2NtZHMtLTsKKyAgICAgICAgIHAtPmFjdGl2ZXNjYnMtLTsKKyAgICAgICAgIHNjYnAtPmZsYWdzIHw9IFNDQl9XQUlUSU5HUTsKKyAgICAgICAgIGlmICggIShzY2JwLT50YWdfYWN0aW9uICYgVEFHX0VOQikgKQorICAgICAgICAgeworICAgICAgICAgICBhaWM3eHh4X2luZGV4X2J1c3lfdGFyZ2V0KHAsIHNjYnAtPmhzY2ItPnRhcmdldF9jaGFubmVsX2x1biwKKyAgICAgICAgICAgICBUUlVFKTsKKyAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgZWxzZSBpZiAocmVxdWV1ZSkKKyAgICAgICB7CisgICAgICAgICBwLT5xaW5maWZvW3AtPnFpbmZpZm9uZXh0KytdID0gc2NicC0+aHNjYi0+dGFnOworICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBQcmVzZXJ2ZSBhbnkgU0NCX1JFQ09WRVJZX1NDQiBmbGFncyBvbiB0aGlzIHNjYiB0aGVuIHNldCB0aGUKKyAgICAgICAgICogZmxhZ3Mgd2Ugd2VyZSBjYWxsZWQgd2l0aCwgcHJlc3VtZWFibHkgc28gYWljN3h4eF9ydW5fZG9uZV9xdWV1ZQorICAgICAgICAgKiBjYW4gZmluZCB0aGlzIHNjYgorICAgICAgICAgKi8KKyAgICAgICAgIHNjYnAtPmZsYWdzID0gZmxhZ3MgfCAoc2NicC0+ZmxhZ3MgJiBTQ0JfUkVDT1ZFUllfU0NCKTsKKyAgICAgICAgIGlmIChhaWM3eHh4X2luZGV4X2J1c3lfdGFyZ2V0KHAsIHNjYnAtPmhzY2ItPnRhcmdldF9jaGFubmVsX2x1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKSA9PSBzY2JwLT5oc2NiLT50YWcpCisgICAgICAgICB7CisgICAgICAgICAgIGFpYzd4eHhfaW5kZXhfYnVzeV90YXJnZXQocCwgc2NicC0+aHNjYi0+dGFyZ2V0X2NoYW5uZWxfbHVuLAorICAgICAgICAgICAgIFRSVUUpOworICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBmb3VuZCsrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcC0+cWluZmlmb1twLT5xaW5maWZvbmV4dCsrXSA9IHNjYnAtPmhzY2ItPnRhZzsKKyAgICB9CisgIH0KKyAgLyoKKyAgICogTm93IHRoYXQgd2UndmUgZG9uZSB0aGUgd29yaywgY2xlYXIgb3V0IGFueSBsZWZ0IG92ZXIgY29tbWFuZHMgaW4gdGhlCisgICAqIHFpbmZpZm8gYW5kIHVwZGF0ZSB0aGUgS0VSTkVMX1FJTlBPUyBkb3duIG9uIHRoZSBjYXJkLgorICAgKgorICAgKiAgTk9URTogVGhpcyByb3V0aW5lIGV4cGVjdCB0aGUgc2VxdWVuY2VyIHRvIGFscmVhZHkgYmUgcGF1c2VkIHdoZW4KKyAgICogICAgICAgIGl0IGlzIHJ1bi4uLi5tYWtlIHN1cmUgaXQncyB0aGF0IHdheSEKKyAgICovCisgIHFpbnBvcyA9IHAtPnFpbmZpZm9uZXh0OworICB3aGlsZShxaW5wb3MgIT0gcWludGFpbCkKKyAgeworICAgIHAtPnFpbmZpZm9bcWlucG9zKytdID0gU0NCX0xJU1RfTlVMTDsKKyAgfQorICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfUVVFVUVfUkVHUykKKyAgICBhaWNfb3V0YihwLCBwLT5xaW5maWZvbmV4dCwgSE5TQ0JfUU9GRik7CisgIGVsc2UKKyAgICBhaWNfb3V0YihwLCBwLT5xaW5maWZvbmV4dCwgS0VSTkVMX1FJTlBPUyk7CisKKyAgcmV0dXJuIChmb3VuZCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9zY2Jfb25fcW91dGZpZm8KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgSXMgdGhlIHNjYiB0aGF0IHdhcyBwYXNzZWQgdG8gdXMgY3VycmVudGx5IG9uIHRoZSBxb3V0Zmlmbz8KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorYWljN3h4eF9zY2Jfb25fcW91dGZpZm8oc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgc3RydWN0IGFpYzd4eHhfc2NiICpzY2IpCit7CisgIGludCBpPTA7CisKKyAgd2hpbGUocC0+cW91dGZpZm9bKHAtPnFvdXRmaWZvbmV4dCArIGkpICYgMHhmZiBdICE9IFNDQl9MSVNUX05VTEwpCisgIHsKKyAgICBpZihwLT5xb3V0Zmlmb1socC0+cW91dGZpZm9uZXh0ICsgaSkgJiAweGZmIF0gPT0gc2NiLT5oc2NiLT50YWcpCisgICAgICByZXR1cm4gVFJVRTsKKyAgICBlbHNlCisgICAgICBpKys7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9yZXNldF9kZXZpY2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGhlIGRldmljZSBhdCB0aGUgZ2l2ZW4gdGFyZ2V0L2NoYW5uZWwgaGFzIGJlZW4gcmVzZXQuICBBYm9ydAorICogICBhbGwgYWN0aXZlIGFuZCBxdWV1ZWQgc2NicyBmb3IgdGhhdCB0YXJnZXQvY2hhbm5lbC4gIFRoaXMgZnVuY3Rpb24KKyAqICAgbmVlZCBub3Qgd29ycnkgYWJvdXQgbGlua2VkIG5leHQgcG9pbnRlcnMgYmVjYXVzZSBpZiB3YXMgYSBNU0dfQUJPUlRfVEFHCisgKiAgIHRoZW4gd2UgaGFkIGEgdGFnZ2VkIGNvbW1hbmQgKG5vIGxpbmtlZCBuZXh0KSwgaWYgaXQgd2FzIE1TR19BQk9SVCBvcgorICogICBNU0dfQlVTX0RFVl9SRVNFVCB0aGVuIHRoZSBkZXZpY2Ugd29uJ3Qga25vdyBhYm91dCBhbnkgY29tbWFuZHMgYW55IG1vcmUKKyAqICAgYW5kIG5vIGJ1c3kgY29tbWFuZHMgd2lsbCBleGlzdCwgYW5kIGlmIGl0IHdhcyBhIGJ1cyByZXNldCwgdGhlbiBub3RoaW5nCisgKiAgIGtub3dzIGFib3V0IGFueSBsaW5rZWQgbmV4dCBjb21tYW5kcyBhbnkgbW9yZS4gIEluIGFsbCBjYXNlcywgd2UgZG9uJ3QKKyAqICAgbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgbGlua2VkIG5leHQgb3IgYnVzeSBzY2IsIHdlIGp1c3QgbmVlZCB0byBjbGVhcgorICogICB0aGVtLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9yZXNldF9kZXZpY2Uoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgaW50IHRhcmdldCwgaW50IGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbHVuLCB1bnNpZ25lZCBjaGFyIHRhZykKK3sKKyAgc3RydWN0IGFpYzd4eHhfc2NiICpzY2JwLCAqcHJldl9zY2JwOworICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkOworICB1bnNpZ25lZCBjaGFyIGFjdGl2ZV9zY2IsIHRjbCwgc2NiX3RhZzsKKyAgaW50IGkgPSAwLCBpbml0X2xpc3RzID0gRkFMU0U7CisgIHN0cnVjdCBhaWNfZGV2X2RhdGEgKmFpY19kZXY7CisKKyAgLyoKKyAgICogUmVzdG9yZSB0aGlzIHdoZW4gd2UncmUgZG9uZQorICAgKi8KKyAgYWN0aXZlX3NjYiA9IGFpY19pbmIocCwgU0NCUFRSKTsKKyAgc2NiX3RhZyA9IGFpY19pbmIocCwgU0NCX1RBRyk7CisKKyAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIChWRVJCT1NFX1JFU0VUX1BST0NFU1MgfCBWRVJCT1NFX0FCT1JUX1BST0NFU1MpKQorICB7CisgICAgcHJpbnRrKElORk9fTEVBRCAiUmVzZXQgZGV2aWNlLCBoYXJkd2FyZV9zY2IgJWQsXG4iLAorICAgICAgICAgcC0+aG9zdF9ubywgY2hhbm5lbCwgdGFyZ2V0LCBsdW4sIGFjdGl2ZV9zY2IpOworICAgIHByaW50ayhJTkZPX0xFQUQgIkN1cnJlbnQgc2NiICVkLCBTRVFBRERSIDB4JXgsIExBU1RQSEFTRSAiCisgICAgICAgICAgICIweCV4XG4iLAorICAgICAgICAgcC0+aG9zdF9ubywgY2hhbm5lbCwgdGFyZ2V0LCBsdW4sIHNjYl90YWcsCisgICAgICAgICBhaWNfaW5iKHAsIFNFUUFERFIwKSB8IChhaWNfaW5iKHAsIFNFUUFERFIxKSA8PCA4KSwKKyAgICAgICAgIGFpY19pbmIocCwgTEFTVFBIQVNFKSk7CisgICAgcHJpbnRrKElORk9fTEVBRCAiU0dfQ0FDSEVQVFIgMHgleCwgU0dfQ09VTlQgJWQsIFNDU0lTSUdJIDB4JXhcbiIsCisgICAgICAgICBwLT5ob3N0X25vLCBjaGFubmVsLCB0YXJnZXQsIGx1biwKKyAgICAgICAgIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID8gIGFpY19pbmIocCwgU0dfQ0FDSEVQVFIpIDogMCwKKyAgICAgICAgIGFpY19pbmIocCwgU0dfQ09VTlQpLCBhaWNfaW5iKHAsIFNDU0lTSUdJKSk7CisgICAgcHJpbnRrKElORk9fTEVBRCAiU1NUQVQwIDB4JXgsIFNTVEFUMSAweCV4LCBTU1RBVDIgMHgleFxuIiwKKyAgICAgICAgIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwgbHVuLCBhaWNfaW5iKHAsIFNTVEFUMCksCisgICAgICAgICBhaWNfaW5iKHAsIFNTVEFUMSksIGFpY19pbmIocCwgU1NUQVQyKSk7CisgIH0KKworICAvKgorICAgKiBEZWFsIHdpdGggdGhlIGJ1c3kgdGFyZ2V0IGFuZCBsaW5rZWQgbmV4dCBpc3N1ZXMuCisgICAqLworICBsaXN0X2Zvcl9lYWNoX2VudHJ5KGFpY19kZXYsICZwLT5haWNfZGV2cywgbGlzdCkKKyAgeworICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiAoVkVSQk9TRV9SRVNFVF9QUk9DRVNTIHwgVkVSQk9TRV9BQk9SVF9QUk9DRVNTKSkKKyAgICAgIHByaW50ayhJTkZPX0xFQUQgInByb2Nlc3NpbmcgYWljX2RldiAlcFxuIiwgcC0+aG9zdF9ubywgY2hhbm5lbCwgdGFyZ2V0LAorCQkgICAgbHVuLCBhaWNfZGV2KTsKKyAgICBzZCA9IGFpY19kZXYtPlNEcHRyOworCisgICAgaWYoKHRhcmdldCAhPSBBTExfVEFSR0VUUyAmJiB0YXJnZXQgIT0gc2QtPmlkKSB8fAorICAgICAgIChjaGFubmVsICE9IEFMTF9DSEFOTkVMUyAmJiBjaGFubmVsICE9IHNkLT5jaGFubmVsKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiAoVkVSQk9TRV9BQk9SVF9QUk9DRVNTIHwgVkVSQk9TRV9SRVNFVF9QUk9DRVNTKSkKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiQ2xlYW5pbmcgdXAgc3RhdHVzIGluZm9ybWF0aW9uICIKKyAgICAgICAgICAiYW5kIGRlbGF5ZWRfc2Nicy5cbiIsIHAtPmhvc3Rfbm8sIHNkLT5jaGFubmVsLCBzZC0+aWQsIHNkLT5sdW4pOworICAgIGFpY19kZXYtPmZsYWdzICY9IH5CVVNfREVWSUNFX1JFU0VUX1BFTkRJTkc7CisgICAgaWYgKCB0YWcgPT0gU0NCX0xJU1RfTlVMTCApCisgICAgeworICAgICAgYWljX2Rldi0+ZHRyX3BlbmRpbmcgPSAwOworICAgICAgYWljX2Rldi0+bmVlZHBwciA9IGFpY19kZXYtPm5lZWRwcHJfY29weTsKKyAgICAgIGFpY19kZXYtPm5lZWRzZHRyID0gYWljX2Rldi0+bmVlZHNkdHJfY29weTsKKyAgICAgIGFpY19kZXYtPm5lZWR3ZHRyID0gYWljX2Rldi0+bmVlZHdkdHJfY29weTsKKyAgICAgIGFpY19kZXYtPmZsYWdzID0gREVWSUNFX1BSSU5UX0RUUjsKKyAgICAgIGFpY19kZXYtPnRlbXBfcV9kZXB0aCA9IGFpY19kZXYtPm1heF9xX2RlcHRoOworICAgIH0KKyAgICB0Y2wgPSAoc2QtPmlkIDw8IDQpIHwgKHNkLT5jaGFubmVsIDw8IDMpIHwgc2QtPmx1bjsKKyAgICBpZiAoIChhaWM3eHh4X2luZGV4X2J1c3lfdGFyZ2V0KHAsIHRjbCwgRkFMU0UpID09IHRhZykgfHwKKyAgICAgICAgICh0YWcgPT0gU0NCX0xJU1RfTlVMTCkgKQorICAgICAgYWljN3h4eF9pbmRleF9idXN5X3RhcmdldChwLCB0Y2wsIC8qIHVuYnVzeSAqLyBUUlVFKTsKKyAgICBwcmV2X3NjYnAgPSBOVUxMOyAKKyAgICBzY2JwID0gYWljX2Rldi0+ZGVsYXllZF9zY2JzLmhlYWQ7CisgICAgd2hpbGUgKHNjYnAgIT0gTlVMTCkKKyAgICB7CisgICAgICBwcmV2X3NjYnAgPSBzY2JwOworICAgICAgc2NicCA9IHNjYnAtPnFfbmV4dDsKKyAgICAgIGlmIChhaWM3eHh4X21hdGNoX3NjYihwLCBwcmV2X3NjYnAsIHRhcmdldCwgY2hhbm5lbCwgbHVuLCB0YWcpKQorICAgICAgeworICAgICAgICBzY2JxX3JlbW92ZSgmYWljX2Rldi0+ZGVsYXllZF9zY2JzLCBwcmV2X3NjYnApOworICAgICAgICBpZiAocHJldl9zY2JwLT5mbGFncyAmIFNDQl9XQUlUSU5HUSkKKyAgICAgICAgeworICAgICAgICAgIGFpY19kZXYtPmFjdGl2ZV9jbWRzKys7CisgICAgICAgICAgcC0+YWN0aXZlc2NicysrOworICAgICAgICB9CisgICAgICAgIHByZXZfc2NicC0+ZmxhZ3MgJj0gfihTQ0JfQUNUSVZFIHwgU0NCX1dBSVRJTkdRKTsKKyAgICAgICAgcHJldl9zY2JwLT5mbGFncyB8PSBTQ0JfUkVTRVQgfCBTQ0JfUVVFVUVEX0ZPUl9ET05FOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiAoVkVSQk9TRV9BQk9SVF9QUk9DRVNTIHwgVkVSQk9TRV9SRVNFVF9QUk9DRVNTKSkKKyAgICBwcmludGsoSU5GT19MRUFEICJDbGVhbmluZyBRSU5GSUZPLlxuIiwgcC0+aG9zdF9ubywgY2hhbm5lbCwgdGFyZ2V0LCBsdW4gKTsKKyAgYWljN3h4eF9zZWFyY2hfcWluZmlmbyhwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgdGFnLAorICAgICAgU0NCX1JFU0VUIHwgU0NCX1FVRVVFRF9GT1JfRE9ORSwgLyogcmVxdWV1ZSAqLyBGQUxTRSwgTlVMTCk7CisKKy8qCisgKiAgU2VhcmNoIHRoZSB3YWl0aW5nX3NjYnMgcXVldWUgZm9yIG1hdGNoZXMsIHRoaXMgY2F0Y2hlcyBhbnkgU0NCX1FVRVVFRAorICogIEFCT1JUL1JFU0VUIGNvbW1hbmRzLgorICovCisgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiAoVkVSQk9TRV9BQk9SVF9QUk9DRVNTIHwgVkVSQk9TRV9SRVNFVF9QUk9DRVNTKSkKKyAgICBwcmludGsoSU5GT19MRUFEICJDbGVhbmluZyB3YWl0aW5nX3NjYnMuXG4iLCBwLT5ob3N0X25vLCBjaGFubmVsLAorICAgICAgdGFyZ2V0LCBsdW4gKTsKKyAgeworICAgIHN0cnVjdCBhaWM3eHh4X3NjYiAqc2NicCwgKnByZXZfc2NicDsKKworICAgIHByZXZfc2NicCA9IE5VTEw7IAorICAgIHNjYnAgPSBwLT53YWl0aW5nX3NjYnMuaGVhZDsKKyAgICB3aGlsZSAoc2NicCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHByZXZfc2NicCA9IHNjYnA7CisgICAgICBzY2JwID0gc2NicC0+cV9uZXh0OworICAgICAgaWYgKGFpYzd4eHhfbWF0Y2hfc2NiKHAsIHByZXZfc2NicCwgdGFyZ2V0LCBjaGFubmVsLCBsdW4sIHRhZykpCisgICAgICB7CisgICAgICAgIHNjYnFfcmVtb3ZlKCZwLT53YWl0aW5nX3NjYnMsIHByZXZfc2NicCk7CisgICAgICAgIGlmIChwcmV2X3NjYnAtPmZsYWdzICYgU0NCX1dBSVRJTkdRKQorICAgICAgICB7CisgICAgICAgICAgQUlDX0RFVihwcmV2X3NjYnAtPmNtZCktPmFjdGl2ZV9jbWRzKys7CisgICAgICAgICAgcC0+YWN0aXZlc2NicysrOworICAgICAgICB9CisgICAgICAgIHByZXZfc2NicC0+ZmxhZ3MgJj0gfihTQ0JfQUNUSVZFIHwgU0NCX1dBSVRJTkdRKTsKKyAgICAgICAgcHJldl9zY2JwLT5mbGFncyB8PSBTQ0JfUkVTRVQgfCBTQ0JfUVVFVUVEX0ZPUl9ET05FOworICAgICAgfQorICAgIH0KKyAgfQorCisKKyAgLyoKKyAgICogU2VhcmNoIHdhaXRpbmcgZm9yIHNlbGVjdGlvbiBsaXN0LgorICAgKi8KKyAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIChWRVJCT1NFX0FCT1JUX1BST0NFU1MgfCBWRVJCT1NFX1JFU0VUX1BST0NFU1MpKQorICAgIHByaW50ayhJTkZPX0xFQUQgIkNsZWFuaW5nIHdhaXRpbmcgZm9yIHNlbGVjdGlvbiAiCisgICAgICAibGlzdC5cbiIsIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwgbHVuKTsKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgbmV4dCwgcHJldiwgc2NiX2luZGV4OworCisgICAgbmV4dCA9IGFpY19pbmIocCwgV0FJVElOR19TQ0JIKTsgIC8qIFN0YXJ0IGF0IGhlYWQgb2YgbGlzdC4gKi8KKyAgICBwcmV2ID0gU0NCX0xJU1RfTlVMTDsKKyAgICB3aGlsZSAobmV4dCAhPSBTQ0JfTElTVF9OVUxMKQorICAgIHsKKyAgICAgIGFpY19vdXRiKHAsIG5leHQsIFNDQlBUUik7CisgICAgICBzY2JfaW5kZXggPSBhaWNfaW5iKHAsIFNDQl9UQUcpOworICAgICAgaWYgKHNjYl9pbmRleCA+PSBwLT5zY2JfZGF0YS0+bnVtc2NicykKKyAgICAgIHsKKyAgICAgICAvKgorICAgICAgICAqIE5vIGFpYzd4eHhfdmVyYm9zZSBjaGVjayBoZXJlLi4uLi53ZSB3YW50IHRvIHNlZSB0aGlzIHNpbmNlIGl0CisgICAgICAgICogbWVhbnMgZWl0aGVyIHRoZSBrZXJuZWwgZHJpdmVyIG9yIHRoZSBzZXF1ZW5jZXIgc2NyZXdlZCB0aGluZ3MgdXAKKyAgICAgICAgKi8KKyAgICAgICAgcHJpbnRrKFdBUk5fTEVBRCAiV2FpdGluZyBMaXN0IGluY29uc2lzdGVuY3k7IFNDQiBpbmRleD0lZCwgIgorICAgICAgICAgICJudW1zY2JzPSVkXG4iLCBwLT5ob3N0X25vLCBjaGFubmVsLCB0YXJnZXQsIGx1biwgc2NiX2luZGV4LAorICAgICAgICAgIHAtPnNjYl9kYXRhLT5udW1zY2JzKTsKKyAgICAgICAgbmV4dCA9IGFpY19pbmIocCwgU0NCX05FWFQpOworICAgICAgICBhaWM3eHh4X2FkZF9jdXJzY2JfdG9fZnJlZV9saXN0KHApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBzY2JwID0gcC0+c2NiX2RhdGEtPnNjYl9hcnJheVtzY2JfaW5kZXhdOworICAgICAgICBpZiAoYWljN3h4eF9tYXRjaF9zY2IocCwgc2NicCwgdGFyZ2V0LCBjaGFubmVsLCBsdW4sIHRhZykpCisgICAgICAgIHsKKyAgICAgICAgICBuZXh0ID0gYWljN3h4eF9hYm9ydF93YWl0aW5nX3NjYihwLCBzY2JwLCBuZXh0LCBwcmV2KTsKKyAgICAgICAgICBpZiAoc2NicC0+ZmxhZ3MgJiBTQ0JfV0FJVElOR1EpCisgICAgICAgICAgeworICAgICAgICAgICAgQUlDX0RFVihzY2JwLT5jbWQpLT5hY3RpdmVfY21kcysrOworICAgICAgICAgICAgcC0+YWN0aXZlc2NicysrOworICAgICAgICAgIH0KKyAgICAgICAgICBzY2JwLT5mbGFncyAmPSB+KFNDQl9BQ1RJVkUgfCBTQ0JfV0FJVElOR1EpOworICAgICAgICAgIHNjYnAtPmZsYWdzIHw9IFNDQl9SRVNFVCB8IFNDQl9RVUVVRURfRk9SX0RPTkU7CisgICAgICAgICAgaWYgKHByZXYgPT0gU0NCX0xJU1RfTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhpcyBpcyBlaXRoZXIgdGhlIGZpcnN0IHNjYiBvbiB0aGUgd2FpdGluZyBsaXN0LCBvciB3ZQorICAgICAgICAgICAgICogaGF2ZSBhbHJlYWR5IHlhbmtlZCB0aGUgZmlyc3QgYW5kIGhhdmVuJ3QgbGVmdCBhbnkgYmVoaW5kLgorICAgICAgICAgICAgICogRWl0aGVyIHdheSwgd2UgbmVlZCB0byB0dXJuIG9mZiB0aGUgc2VsZWN0aW9uIGhhcmR3YXJlIGlmCisgICAgICAgICAgICAgKiBpdCBpc24ndCBhbHJlYWR5IG9mZi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQ1NJU0VRKSAmIH5FTlNFTE8sIFNDU0lTRVEpOworICAgICAgICAgICAgYWljX291dGIocCwgQ0xSU0VMVElNRU8sIENMUlNJTlQxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcHJldiA9IG5leHQ7CisgICAgICAgICAgbmV4dCA9IGFpY19pbmIocCwgU0NCX05FWFQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoKKyAgICogR28gdGhyb3VnaCBkaXNjb25uZWN0ZWQgbGlzdCBhbmQgcmVtb3ZlIGFueSBlbnRyaWVzIHdlIGhhdmUgcXVldWVkCisgICAqIGZvciBjb21wbGV0aW9uLCB6ZXJvaW5nIHRoZWlyIGNvbnRyb2wgYnl0ZSB0b28uCisgICAqLworICBpZiAoYWljN3h4eF92ZXJib3NlICYgKFZFUkJPU0VfQUJPUlRfUFJPQ0VTUyB8IFZFUkJPU0VfUkVTRVRfUFJPQ0VTUykpCisgICAgcHJpbnRrKElORk9fTEVBRCAiQ2xlYW5pbmcgZGlzY29ubmVjdGVkIHNjYnMgIgorICAgICAgImxpc3QuXG4iLCBwLT5ob3N0X25vLCBjaGFubmVsLCB0YXJnZXQsIGx1bik7CisgIGlmIChwLT5mbGFncyAmIEFIQ19QQUdFU0NCUykKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgbmV4dCwgcHJldiwgc2NiX2luZGV4OworCisgICAgbmV4dCA9IGFpY19pbmIocCwgRElTQ09OTkVDVEVEX1NDQkgpOworICAgIHByZXYgPSBTQ0JfTElTVF9OVUxMOworICAgIHdoaWxlIChuZXh0ICE9IFNDQl9MSVNUX05VTEwpCisgICAgeworICAgICAgYWljX291dGIocCwgbmV4dCwgU0NCUFRSKTsKKyAgICAgIHNjYl9pbmRleCA9IGFpY19pbmIocCwgU0NCX1RBRyk7CisgICAgICBpZiAoc2NiX2luZGV4ID4gcC0+c2NiX2RhdGEtPm51bXNjYnMpCisgICAgICB7CisgICAgICAgIHByaW50ayhXQVJOX0xFQUQgIkRpc2Nvbm5lY3RlZCBMaXN0IGluY29uc2lzdGVuY3k7IFNDQiBpbmRleD0lZCwgIgorICAgICAgICAgICJudW1zY2JzPSVkXG4iLCBwLT5ob3N0X25vLCBjaGFubmVsLCB0YXJnZXQsIGx1biwgc2NiX2luZGV4LAorICAgICAgICAgIHAtPnNjYl9kYXRhLT5udW1zY2JzKTsKKyAgICAgICAgbmV4dCA9IGFpYzd4eHhfcmVtX3NjYl9mcm9tX2Rpc2NfbGlzdChwLCBuZXh0LCBwcmV2KTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc2NicCA9IHAtPnNjYl9kYXRhLT5zY2JfYXJyYXlbc2NiX2luZGV4XTsKKyAgICAgICAgaWYgKGFpYzd4eHhfbWF0Y2hfc2NiKHAsIHNjYnAsIHRhcmdldCwgY2hhbm5lbCwgbHVuLCB0YWcpKQorICAgICAgICB7CisgICAgICAgICAgbmV4dCA9IGFpYzd4eHhfcmVtX3NjYl9mcm9tX2Rpc2NfbGlzdChwLCBuZXh0LCBwcmV2KTsKKyAgICAgICAgICBpZiAoc2NicC0+ZmxhZ3MgJiBTQ0JfV0FJVElOR1EpCisgICAgICAgICAgeworICAgICAgICAgICAgQUlDX0RFVihzY2JwLT5jbWQpLT5hY3RpdmVfY21kcysrOworICAgICAgICAgICAgcC0+YWN0aXZlc2NicysrOworICAgICAgICAgIH0KKyAgICAgICAgICBzY2JwLT5mbGFncyAmPSB+KFNDQl9BQ1RJVkUgfCBTQ0JfV0FJVElOR1EpOworICAgICAgICAgIHNjYnAtPmZsYWdzIHw9IFNDQl9SRVNFVCB8IFNDQl9RVUVVRURfRk9SX0RPTkU7CisgICAgICAgICAgc2NicC0+aHNjYi0+Y29udHJvbCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcHJldiA9IG5leHQ7CisgICAgICAgICAgbmV4dCA9IGFpY19pbmIocCwgU0NCX05FWFQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoKKyAgICogV2FsayB0aGUgZnJlZSBsaXN0IG1ha2luZyBzdXJlIG5vIGVudHJpZXMgb24gdGhlIGZyZWUgbGlzdCBoYXZlCisgICAqIGEgdmFsaWQgU0NCX1RBRyB2YWx1ZSBvciBTQ0JfQ09OVFJPTCBieXRlLgorICAgKi8KKyAgaWYgKHAtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKQorICB7CisgICAgdW5zaWduZWQgY2hhciBuZXh0OworCisgICAgbmV4dCA9IGFpY19pbmIocCwgRlJFRV9TQ0JIKTsKKyAgICB3aGlsZSAobmV4dCAhPSBTQ0JfTElTVF9OVUxMKQorICAgIHsKKyAgICAgIGFpY19vdXRiKHAsIG5leHQsIFNDQlBUUik7CisgICAgICBpZiAoYWljX2luYihwLCBTQ0JfVEFHKSA8IHAtPnNjYl9kYXRhLT5udW1zY2JzKQorICAgICAgeworICAgICAgICBwcmludGsoV0FSTl9MRUFEICJGcmVlIGxpc3QgaW5jb25zaXN0ZW5jeSEuXG4iLCBwLT5ob3N0X25vLCBjaGFubmVsLAorICAgICAgICAgIHRhcmdldCwgbHVuKTsKKyAgICAgICAgaW5pdF9saXN0cyA9IFRSVUU7CisgICAgICAgIG5leHQgPSBTQ0JfTElTVF9OVUxMOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBhaWNfb3V0YihwLCBTQ0JfTElTVF9OVUxMLCBTQ0JfVEFHKTsKKyAgICAgICAgYWljX291dGIocCwgMCwgU0NCX0NPTlRST0wpOworICAgICAgICBuZXh0ID0gYWljX2luYihwLCBTQ0JfTkVYVCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoKKyAgICogR28gdGhyb3VnaCB0aGUgaGFyZHdhcmUgU0NCIGFycmF5IGxvb2tpbmcgZm9yIGNvbW1hbmRzIHRoYXQKKyAgICogd2VyZSBhY3RpdmUgYnV0IG5vdCBvbiBhbnkgbGlzdC4KKyAgICovCisgIGlmIChpbml0X2xpc3RzKQorICB7CisgICAgYWljX291dGIocCwgU0NCX0xJU1RfTlVMTCwgRlJFRV9TQ0JIKTsKKyAgICBhaWNfb3V0YihwLCBTQ0JfTElTVF9OVUxMLCBXQUlUSU5HX1NDQkgpOworICAgIGFpY19vdXRiKHAsIFNDQl9MSVNUX05VTEwsIERJU0NPTk5FQ1RFRF9TQ0JIKTsKKyAgfQorICBmb3IgKGkgPSBwLT5zY2JfZGF0YS0+bWF4aHNjYnMgLSAxOyBpID49IDA7IGktLSkKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgc2NiaWQ7CisKKyAgICBhaWNfb3V0YihwLCBpLCBTQ0JQVFIpOworICAgIGlmIChpbml0X2xpc3RzKQorICAgIHsKKyAgICAgIGFpY19vdXRiKHAsIFNDQl9MSVNUX05VTEwsIFNDQl9UQUcpOworICAgICAgYWljX291dGIocCwgU0NCX0xJU1RfTlVMTCwgU0NCX05FWFQpOworICAgICAgYWljX291dGIocCwgMCwgU0NCX0NPTlRST0wpOworICAgICAgYWljN3h4eF9hZGRfY3Vyc2NiX3RvX2ZyZWVfbGlzdChwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNjYmlkID0gYWljX2luYihwLCBTQ0JfVEFHKTsKKyAgICAgIGlmIChzY2JpZCA8IHAtPnNjYl9kYXRhLT5udW1zY2JzKQorICAgICAgeworICAgICAgICBzY2JwID0gcC0+c2NiX2RhdGEtPnNjYl9hcnJheVtzY2JpZF07CisgICAgICAgIGlmIChhaWM3eHh4X21hdGNoX3NjYihwLCBzY2JwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgdGFnKSkKKyAgICAgICAgeworICAgICAgICAgIGFpY19vdXRiKHAsIDAsIFNDQl9DT05UUk9MKTsKKyAgICAgICAgICBhaWNfb3V0YihwLCBTQ0JfTElTVF9OVUxMLCBTQ0JfVEFHKTsKKyAgICAgICAgICBhaWM3eHh4X2FkZF9jdXJzY2JfdG9fZnJlZV9saXN0KHApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoKKyAgICogR28gdGhyb3VnaCB0aGUgZW50aXJlIFNDQiBhcnJheSBub3cgYW5kIGxvb2sgZm9yIGNvbW1hbmRzIGZvcgorICAgKiBmb3IgdGhpcyB0YXJnZXQgdGhhdCBhcmUgc3RpbGxhY3RpdmUuICBUaGVzZSBhcmUgb3RoZXIgKG1vc3QgbGlrZWx5CisgICAqIHRhZ2dlZCkgY29tbWFuZHMgdGhhdCB3ZXJlIGRpc2Nvbm5lY3RlZCB3aGVuIHRoZSByZXNldCBvY2N1cnJlZC4KKyAgICogQW55IGNvbW1hbmRzIHdlIGZpbmQgaGVyZSB3ZSBrbm93IHRoaXMgYWJvdXQsIGl0IHdhc24ndCBvbiBhbnkgcXVldWUsCisgICAqIGl0IHdhc24ndCBpbiB0aGUgcWluZmlmbywgaXQgd2Fzbid0IGluIHRoZSBkaXNjb25uZWN0ZWQgb3Igd2FpdGluZworICAgKiBsaXN0cywgc28gaXQgcmVhbGx5IG11c3QgaGF2ZSBiZWVuIGEgcGFnZWQgb3V0IFNDQi4gIEluIHRoYXQgY2FzZSwKKyAgICogd2Ugc2hvdWxkbid0IG5lZWQgdG8gYm90aGVyIHdpdGggdXBkYXRpbmcgYW55IGNvdW50ZXJzLCBqdXN0IG1hcmsKKyAgICogdGhlIGNvcnJlY3QgZmxhZ3MgYW5kIGdvIG9uLgorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHAtPnNjYl9kYXRhLT5udW1zY2JzOyBpKyspCisgIHsKKyAgICBzY2JwID0gcC0+c2NiX2RhdGEtPnNjYl9hcnJheVtpXTsKKyAgICBpZiAoKHNjYnAtPmZsYWdzICYgU0NCX0FDVElWRSkgJiYKKyAgICAgICAgYWljN3h4eF9tYXRjaF9zY2IocCwgc2NicCwgdGFyZ2V0LCBjaGFubmVsLCBsdW4sIHRhZykgJiYKKyAgICAgICAgIWFpYzd4eHhfc2NiX29uX3FvdXRmaWZvKHAsIHNjYnApKQorICAgIHsKKyAgICAgIGlmIChzY2JwLT5mbGFncyAmIFNDQl9XQUlUSU5HUSkKKyAgICAgIHsKKyAgICAgICAgc2NicV9yZW1vdmUoJnAtPndhaXRpbmdfc2Nicywgc2NicCk7CisgICAgICAgIHNjYnFfcmVtb3ZlKCZBSUNfREVWKHNjYnAtPmNtZCktPmRlbGF5ZWRfc2Nicywgc2NicCk7CisgICAgICAgIEFJQ19ERVYoc2NicC0+Y21kKS0+YWN0aXZlX2NtZHMrKzsKKyAgICAgICAgcC0+YWN0aXZlc2NicysrOworICAgICAgfQorICAgICAgc2NicC0+ZmxhZ3MgfD0gU0NCX1JFU0VUIHwgU0NCX1FVRVVFRF9GT1JfRE9ORTsKKyAgICAgIHNjYnAtPmZsYWdzICY9IH4oU0NCX0FDVElWRSB8IFNDQl9XQUlUSU5HUSk7CisgICAgfQorICB9CisKKyAgYWljX291dGIocCwgYWN0aXZlX3NjYiwgU0NCUFRSKTsKK30KKworCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfY2xlYXJfaW50c3RhdAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBDbGVhcnMgdGhlIGludGVycnVwdCBzdGF0dXMuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X2NsZWFyX2ludHN0YXQoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKyAgLyogQ2xlYXIgYW55IGludGVycnVwdCBjb25kaXRpb25zIHRoaXMgbWF5IGhhdmUgY2F1c2VkLiAqLworICBhaWNfb3V0YihwLCBDTFJTRUxETyB8IENMUlNFTERJIHwgQ0xSU0VMSU5HTywgQ0xSU0lOVDApOworICBhaWNfb3V0YihwLCBDTFJTRUxUSU1FTyB8IENMUkFUTk8gfCBDTFJTQ1NJUlNUSSB8IENMUkJVU0ZSRUUgfCBDTFJTQ1NJUEVSUiB8CisgICAgICAgQ0xSUEhBU0VDSEcgfCBDTFJSRVFJTklULCBDTFJTSU5UMSk7CisgIGFpY19vdXRiKHAsIENMUlNDU0lJTlQgfCBDTFJTRVFJTlQgfCBDTFJCUktBRFJJTlQgfCBDTFJQQVJFUlIsIENMUklOVCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9yZXNldF9jdXJyZW50X2J1cworICoKKyAqIERlc2NyaXB0aW9uOgorICogICBSZXNldCB0aGUgY3VycmVudCBTQ1NJIGJ1cy4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfcmVzZXRfY3VycmVudF9idXMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKworICAvKiBEaXNhYmxlIHJlc2V0IGludGVycnVwdHMuICovCisgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0lNT0RFMSkgJiB+RU5TQ1NJUlNULCBTSU1PREUxKTsKKworICAvKiBUdXJuIG9mZiB0aGUgYnVzJyBjdXJyZW50IG9wZXJhdGlvbnMsIGFmdGVyIGFsbCwgd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAqIHZhbGlkIGNvbW1hbmRzIGxlZnQgdG8gY2F1c2UgYSBSU0VMSSBhbmQgU0VMTyBvbmNlIHdlJ3ZlIHRvc3NlZCB0aGUKKyAgICogYnVzIGF3YXkgd2l0aCB0aGlzIHJlc2V0LCBzbyB3ZSBtaWdodCBhcyB3ZWxsIHNodXQgZG93biB0aGUgc2VxdWVuY2VyCisgICAqIHVudGlsIHRoZSBidXMgaXMgcmVzdGFydGVkIGFzIG9wcG9zc2VkIHRvIHNhdmluZyB0aGUgY3VycmVudCBzZXR0aW5ncworICAgKiBhbmQgcmVzdG9yaW5nIHRoZW0gKHdoaWNoIG1ha2VzIG5vIHNlbnNlIHRvIG1lKS4gKi8KKworICAvKiBUdXJuIG9uIHRoZSBidXMgcmVzZXQuICovCisgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0NTSVNFUSkgfCBTQ1NJUlNUTywgU0NTSVNFUSk7CisgIHdoaWxlICggKGFpY19pbmIocCwgU0NTSVNFUSkgJiBTQ1NJUlNUTykgPT0gMCkKKyAgICBtZGVsYXkoNSk7CisKKyAgLyoKKyAgICogU29tZSBvZiB0aGUgbmV3IFVsdHJhMiBjaGlwc2V0cyBuZWVkIGEgbG9uZ2VyIGRlbGF5IGFmdGVyIGEgY2hpcAorICAgKiByZXNldCB0aGFuIGp1c3QgdGhlIGluaXQgc2V0dXAgY3JlYXRlcywgc28gd2UgaGF2ZSB0byBkZWxheSBoZXJlCisgICAqIGJlZm9yZSB3ZSBnbyBpbnRvIGEgcmVzZXQgaW4gb3JkZXIgdG8gbWFrZSB0aGUgY2hpcHMgaGFwcHkuCisgICAqLworICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgIG1kZWxheSgyNTApOworICBlbHNlCisgICAgbWRlbGF5KDUwKTsKKworICAvKiBUdXJuIG9mZiB0aGUgYnVzIHJlc2V0LiAqLworICBhaWNfb3V0YihwLCAwLCBTQ1NJU0VRKTsKKyAgbWRlbGF5KDEwKTsKKworICBhaWM3eHh4X2NsZWFyX2ludHN0YXQocCk7CisgIC8qIFJlLWVuYWJsZSByZXNldCBpbnRlcnJ1cHRzLiAqLworICBhaWNfb3V0YihwLCBhaWNfaW5iKHAsIFNJTU9ERTEpIHwgRU5TQ1NJUlNULCBTSU1PREUxKTsKKworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfcmVzZXRfY2hhbm5lbAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBSZXNldCB0aGUgY2hhbm5lbC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfcmVzZXRfY2hhbm5lbChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBpbnQgY2hhbm5lbCwgaW50IGluaXRpYXRlX3Jlc2V0KQoreworICB1bnNpZ25lZCBsb25nIG9mZnNldF9taW4sIG9mZnNldF9tYXg7CisgIHVuc2lnbmVkIGNoYXIgc2Jsa2N0bDsKKyAgaW50IGN1cl9jaGFubmVsOworCisgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1JFU0VUX1BST0NFU1MpCisgICAgcHJpbnRrKElORk9fTEVBRCAiUmVzZXQgY2hhbm5lbCBjYWxsZWQsICVzIGluaXRpYXRlIHJlc2V0LlxuIiwKKyAgICAgIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIC0xLCAtMSwgKGluaXRpYXRlX3Jlc2V0PT1UUlVFKSA/ICJ3aWxsIiA6ICJ3b24ndCIgKTsKKworCisgIGlmIChjaGFubmVsID09IDEpCisgIHsKKyAgICBvZmZzZXRfbWluID0gODsKKyAgICBvZmZzZXRfbWF4ID0gMTY7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1RXSU4pCisgICAgeworICAgICAgLyogQ2hhbm5lbCBBICovCisgICAgICBvZmZzZXRfbWluID0gMDsKKyAgICAgIG9mZnNldF9tYXggPSA4OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgb2Zmc2V0X21pbiA9IDA7CisgICAgICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfV0lERSkKKyAgICAgIHsKKyAgICAgICAgb2Zmc2V0X21heCA9IDE2OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBvZmZzZXRfbWF4ID0gODsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB3aGlsZSAob2Zmc2V0X21pbiA8IG9mZnNldF9tYXgpCisgIHsKKyAgICAvKgorICAgICAqIFJldmVydCB0byBhc3luYy9uYXJyb3cgdHJhbnNmZXJzIHVudGlsIHdlIHJlbmVnb3RpYXRlLgorICAgICAqLworICAgIGFpY19vdXRiKHAsIDAsIFRBUkdfU0NTSVJBVEUgKyBvZmZzZXRfbWluKTsKKyAgICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgIHsKKyAgICAgIGFpY19vdXRiKHAsIDAsIFRBUkdfT0ZGU0VUICsgb2Zmc2V0X21pbik7CisgICAgfQorICAgIG9mZnNldF9taW4rKzsKKyAgfQorCisgIC8qCisgICAqIFJlc2V0IHRoZSBidXMgYW5kIHVucGF1c2UvcmVzdGFydCB0aGUgY29udHJvbGxlcgorICAgKi8KKyAgc2Jsa2N0bCA9IGFpY19pbmIocCwgU0JMS0NUTCk7CisgIGlmICggKHAtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spID09IEFIQ19BSUM3NzcwICkKKyAgICBjdXJfY2hhbm5lbCA9IChzYmxrY3RsICYgU0VMQlVTQikgPj4gMzsKKyAgZWxzZQorICAgIGN1cl9jaGFubmVsID0gMDsKKyAgaWYgKCAoY3VyX2NoYW5uZWwgIT0gY2hhbm5lbCkgJiYgKHAtPmZlYXR1cmVzICYgQUhDX1RXSU4pICkKKyAgeworICAgIC8qCisgICAgICogQ2FzZSAxOiBDb21tYW5kIGZvciBhbm90aGVyIGJ1cyBpcyBhY3RpdmUKKyAgICAgKi8KKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9SRVNFVF9QUk9DRVNTKQorICAgICAgcHJpbnRrKElORk9fTEVBRCAiU3RlYWx0aGlseSByZXNldHRpbmcgaWRsZSBjaGFubmVsLlxuIiwgcC0+aG9zdF9ubywKKyAgICAgICAgY2hhbm5lbCwgLTEsIC0xKTsKKyAgICAvKgorICAgICAqIFN0ZWFsdGhpbHkgcmVzZXQgdGhlIG90aGVyIGJ1cyB3aXRob3V0IHVwc2V0dGluZyB0aGUgY3VycmVudCBidXMuCisgICAgICovCisgICAgYWljX291dGIocCwgc2Jsa2N0bCBeIFNFTEJVU0IsIFNCTEtDVEwpOworICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0lNT0RFMSkgJiB+RU5CVVNGUkVFLCBTSU1PREUxKTsKKyAgICBpZiAoaW5pdGlhdGVfcmVzZXQpCisgICAgeworICAgICAgYWljN3h4eF9yZXNldF9jdXJyZW50X2J1cyhwKTsKKyAgICB9CisgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQ1NJU0VRKSAmIChFTlNFTEl8RU5SU0VMSXxFTkFVVE9BVE5QKSwgU0NTSVNFUSk7CisgICAgYWljN3h4eF9jbGVhcl9pbnRzdGF0KHApOworICAgIGFpY19vdXRiKHAsIHNibGtjdGwsIFNCTEtDVEwpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qCisgICAgICogQ2FzZSAyOiBBIGNvbW1hbmQgZnJvbSB0aGlzIGJ1cyBpcyBhY3RpdmUgb3Igd2UncmUgaWRsZS4KKyAgICAgKi8KKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9SRVNFVF9QUk9DRVNTKQorICAgICAgcHJpbnRrKElORk9fTEVBRCAiUmVzZXR0aW5nIGN1cnJlbnRseSBhY3RpdmUgY2hhbm5lbC5cbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgIGNoYW5uZWwsIC0xLCAtMSk7CisgICAgYWljX291dGIocCwgYWljX2luYihwLCBTSU1PREUxKSAmIH4oRU5CVVNGUkVFfEVOUkVRSU5JVCksCisgICAgICBTSU1PREUxKTsKKyAgICBwLT5mbGFncyAmPSB+QUhDX0hBTkRMSU5HX1JFUUlOSVRTOworICAgIHAtPm1zZ190eXBlID0gTVNHX1RZUEVfTk9ORTsKKyAgICBwLT5tc2dfbGVuID0gMDsKKyAgICBpZiAoaW5pdGlhdGVfcmVzZXQpCisgICAgeworICAgICAgYWljN3h4eF9yZXNldF9jdXJyZW50X2J1cyhwKTsKKyAgICB9CisgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQ1NJU0VRKSAmIChFTlNFTEl8RU5SU0VMSXxFTkFVVE9BVE5QKSwgU0NTSVNFUSk7CisgICAgYWljN3h4eF9jbGVhcl9pbnRzdGF0KHApOworICB9CisgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1JFU0VUX1JFVFVSTikKKyAgICBwcmludGsoSU5GT19MRUFEICJDaGFubmVsIHJlc2V0XG4iLCBwLT5ob3N0X25vLCBjaGFubmVsLCAtMSwgLTEpOworICAvKgorICAgKiBDbGVhbiB1cCBhbGwgdGhlIHN0YXRlIGluZm9ybWF0aW9uIGZvciB0aGUgcGVuZGluZyB0cmFuc2FjdGlvbnMKKyAgICogb24gdGhpcyBidXMuCisgICAqLworICBhaWM3eHh4X3Jlc2V0X2RldmljZShwLCBBTExfVEFSR0VUUywgY2hhbm5lbCwgQUxMX0xVTlMsIFNDQl9MSVNUX05VTEwpOworCisgIGlmICggIShwLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSApCisgIHsKKyAgICByZXN0YXJ0X3NlcXVlbmNlcihwKTsKKyAgfQorCisgIHJldHVybjsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X3J1bl93YWl0aW5nX3F1ZXVlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTY2FuIHRoZSBhd2FpdGluZ19zY2JzIHF1ZXVlIGRvd25sb2FkaW5nIGFuZCBzdGFydGluZyBhcyBtYW55CisgKiAgIHNjYnMgYXMgd2UgY2FuLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9ydW5fd2FpdGluZ19xdWV1ZXMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKyAgc3RydWN0IGFpYzd4eHhfc2NiICpzY2I7CisgIHN0cnVjdCBhaWNfZGV2X2RhdGEgKmFpY19kZXY7CisgIGludCBzZW50OworCisKKyAgaWYgKHAtPndhaXRpbmdfc2Nicy5oZWFkID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIHNlbnQgPSAwOworCisgIC8qCisgICAqIEZpcnN0IGhhbmRsZSBTQ0JzIHRoYXQgYXJlIHdhaXRpbmcgYnV0IGhhdmUgYmVlbiBhc3NpZ25lZCBhIHNsb3QuCisgICAqLworICB3aGlsZSAoKHNjYiA9IHNjYnFfcmVtb3ZlX2hlYWQoJnAtPndhaXRpbmdfc2NicykpICE9IE5VTEwpCisgIHsKKyAgICBhaWNfZGV2ID0gc2NiLT5jbWQtPmRldmljZS0+aG9zdGRhdGE7CisgICAgaWYgKCAhc2NiLT50YWdfYWN0aW9uICkKKyAgICB7CisgICAgICBhaWNfZGV2LT50ZW1wX3FfZGVwdGggPSAxOworICAgIH0KKyAgICBpZiAoIGFpY19kZXYtPmFjdGl2ZV9jbWRzID49IGFpY19kZXYtPnRlbXBfcV9kZXB0aCkKKyAgICB7CisgICAgICBzY2JxX2luc2VydF90YWlsKCZhaWNfZGV2LT5kZWxheWVkX3NjYnMsIHNjYik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNjYi0+ZmxhZ3MgJj0gflNDQl9XQUlUSU5HUTsKKyAgICAgICAgYWljX2Rldi0+YWN0aXZlX2NtZHMrKzsKKyAgICAgICAgcC0+YWN0aXZlc2NicysrOworICAgICAgICBpZiAoICEoc2NiLT50YWdfYWN0aW9uKSApCisgICAgICAgIHsKKyAgICAgICAgICBhaWM3eHh4X2J1c3lfdGFyZ2V0KHAsIHNjYik7CisgICAgICAgIH0KKyAgICAgICAgcC0+cWluZmlmb1twLT5xaW5maWZvbmV4dCsrXSA9IHNjYi0+aHNjYi0+dGFnOworICAgICAgICBzZW50Kys7CisgICAgfQorICB9CisgIGlmIChzZW50KQorICB7CisgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpCisgICAgICBhaWNfb3V0YihwLCBwLT5xaW5maWZvbmV4dCwgSE5TQ0JfUU9GRik7CisgICAgZWxzZQorICAgIHsKKyAgICAgIHBhdXNlX3NlcXVlbmNlcihwKTsKKyAgICAgIGFpY19vdXRiKHAsIHAtPnFpbmZpZm9uZXh0LCBLRVJORUxfUUlOUE9TKTsKKyAgICAgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIEZBTFNFKTsKKyAgICB9CisgICAgaWYgKHAtPmFjdGl2ZXNjYnMgPiBwLT5tYXhfYWN0aXZlc2NicykKKyAgICAgIHAtPm1heF9hY3RpdmVzY2JzID0gcC0+YWN0aXZlc2NiczsKKyAgfQorfQorCisjaWZkZWYgQ09ORklHX1BDSQorCisjZGVmaW5lICBEUEUgMHg4MAorI2RlZmluZSAgU1NFIDB4NDAKKyNkZWZpbmUgIFJNQSAweDIwCisjZGVmaW5lICBSVEEgMHgxMAorI2RlZmluZSAgU1RBIDB4MDgKKyNkZWZpbmUgIERQUiAweDAxCisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9wY2lfaW50cgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBDaGVjayB0aGUgc2NzaSBjYXJkIGZvciBQQ0kgZXJyb3JzIGFuZCBjbGVhciB0aGUgaW50ZXJydXB0CisgKgorICogICBOT1RFOiBJZiB5b3UgZG9uJ3QgaGF2ZSB0aGlzIGZ1bmN0aW9uIGFuZCBhIDI5NDAgY2FyZCBlbmNvdW50ZXJzCisgKiAgICAgICAgIGEgUENJIGVycm9yIGNvbmRpdGlvbiwgdGhlIG1hY2hpbmUgd2lsbCBlbmQgdXAgbG9ja2VkIGFzIHRoZQorICogICAgICAgICBpbnRlcnJ1cHQgaGFuZGxlciBnZXRzIHNsYW1tZWQgd2l0aCBub24tc3RvcCBQQ0kgZXJyb3IgaW50ZXJydXB0cworICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9wY2lfaW50cihzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKQoreworICB1bnNpZ25lZCBjaGFyIHN0YXR1czE7CisKKyAgcGNpX3JlYWRfY29uZmlnX2J5dGUocC0+cGRldiwgUENJX1NUQVRVUyArIDEsICZzdGF0dXMxKTsKKworICBpZiAoIChzdGF0dXMxICYgRFBFKSAmJiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9NSU5PUl9FUlJPUikgKQorICAgIHByaW50ayhXQVJOX0xFQUQgIkRhdGEgUGFyaXR5IEVycm9yIGR1cmluZyBQQ0kgYWRkcmVzcyBvciBQQ0kgd3JpdGUiCisgICAgICAicGhhc2UuXG4iLCBwLT5ob3N0X25vLCAtMSwgLTEsIC0xKTsKKyAgaWYgKCAoc3RhdHVzMSAmIFNTRSkgJiYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTUlOT1JfRVJST1IpICkKKyAgICBwcmludGsoV0FSTl9MRUFEICJTaWduYWwgU3lzdGVtIEVycm9yIERldGVjdGVkXG4iLCBwLT5ob3N0X25vLAorICAgICAgLTEsIC0xLCAtMSk7CisgIGlmICggKHN0YXR1czEgJiBSTUEpICYmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX01JTk9SX0VSUk9SKSApCisgICAgcHJpbnRrKFdBUk5fTEVBRCAiUmVjZWl2ZWQgYSBQQ0kgTWFzdGVyIEFib3J0XG4iLCBwLT5ob3N0X25vLAorICAgICAgLTEsIC0xLCAtMSk7CisgIGlmICggKHN0YXR1czEgJiBSVEEpICYmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX01JTk9SX0VSUk9SKSApCisgICAgcHJpbnRrKFdBUk5fTEVBRCAiUmVjZWl2ZWQgYSBQQ0kgVGFyZ2V0IEFib3J0XG4iLCBwLT5ob3N0X25vLAorICAgICAgLTEsIC0xLCAtMSk7CisgIGlmICggKHN0YXR1czEgJiBTVEEpICYmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX01JTk9SX0VSUk9SKSApCisgICAgcHJpbnRrKFdBUk5fTEVBRCAiU2lnbmFsZWQgYSBQQ0kgVGFyZ2V0IEFib3J0XG4iLCBwLT5ob3N0X25vLAorICAgICAgLTEsIC0xLCAtMSk7CisgIGlmICggKHN0YXR1czEgJiBEUFIpICYmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX01JTk9SX0VSUk9SKSApCisgICAgcHJpbnRrKFdBUk5fTEVBRCAiRGF0YSBQYXJpdHkgRXJyb3IgaGFzIGJlZW4gcmVwb3J0ZWQgdmlhIFBDSSBwaW4gIgorICAgICAgIlBFUlIjXG4iLCBwLT5ob3N0X25vLCAtMSwgLTEsIC0xKTsKKyAgCisgIHBjaV93cml0ZV9jb25maWdfYnl0ZShwLT5wZGV2LCBQQ0lfU1RBVFVTICsgMSwgc3RhdHVzMSk7CisgIGlmIChzdGF0dXMxICYgKERQUnxSTUF8UlRBKSkKKyAgICBhaWNfb3V0YihwLCAgQ0xSUEFSRVJSLCBDTFJJTlQpOworCisgIGlmICggKGFpYzd4eHhfcGFuaWNfb25fYWJvcnQpICYmIChwLT5zcHVyaW91c19pbnQgPiA1MDApICkKKyAgICBhaWM3eHh4X3BhbmljX2Fib3J0KHAsIE5VTEwpOworCit9CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfY29uc3RydWN0X3BwcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBCdWlsZCB1cCBhIFBhcmFsbGVsIFByb3RvY29sIFJlcXVlc3QgbWVzc2FnZSBmb3IgdXNlIHdpdGggU0NTSS0zCisgKiAgIGRldmljZXMuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X2NvbnN0cnVjdF9wcHIoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgc3RydWN0IGFpYzd4eHhfc2NiICpzY2IpCit7CisgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gTVNHX0VYVEVOREVEOworICBwLT5tc2dfYnVmW3AtPm1zZ19pbmRleCsrXSA9IE1TR19FWFRfUFBSX0xFTjsKKyAgcC0+bXNnX2J1ZltwLT5tc2dfaW5kZXgrK10gPSBNU0dfRVhUX1BQUjsKKyAgcC0+bXNnX2J1ZltwLT5tc2dfaW5kZXgrK10gPSBBSUNfREVWKHNjYi0+Y21kKS0+Z29hbC5wZXJpb2Q7CisgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gMDsKKyAgcC0+bXNnX2J1ZltwLT5tc2dfaW5kZXgrK10gPSBBSUNfREVWKHNjYi0+Y21kKS0+Z29hbC5vZmZzZXQ7CisgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gQUlDX0RFVihzY2ItPmNtZCktPmdvYWwud2lkdGg7CisgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gQUlDX0RFVihzY2ItPmNtZCktPmdvYWwub3B0aW9uczsKKyAgcC0+bXNnX2xlbiArPSA4OworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfY29uc3RydWN0X3NkdHIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgQ29uc3R1Y3RzIGEgc3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlciBtZXNzYWdlIGluIHRoZSBtZXNzYWdlCisgKiAgIGJ1ZmZlciBvbiB0aGUgc2VxdWVuY2VyLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9jb25zdHJ1Y3Rfc2R0cihzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCB1bnNpZ25lZCBjaGFyIHBlcmlvZCwKKyAgICAgICAgdW5zaWduZWQgY2hhciBvZmZzZXQpCit7CisgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gTVNHX0VYVEVOREVEOworICBwLT5tc2dfYnVmW3AtPm1zZ19pbmRleCsrXSA9IE1TR19FWFRfU0RUUl9MRU47CisgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gTVNHX0VYVF9TRFRSOworICBwLT5tc2dfYnVmW3AtPm1zZ19pbmRleCsrXSA9IHBlcmlvZDsKKyAgcC0+bXNnX2J1ZltwLT5tc2dfaW5kZXgrK10gPSBvZmZzZXQ7CisgIHAtPm1zZ19sZW4gKz0gNTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2NvbnN0cnVjdF93ZHRyCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIENvbnN0dWN0cyBhIHdpZGUgZGF0YSB0cmFuc2ZlciBtZXNzYWdlIGluIHRoZSBtZXNzYWdlIGJ1ZmZlcgorICogICBvbiB0aGUgc2VxdWVuY2VyLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9jb25zdHJ1Y3Rfd2R0cihzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCB1bnNpZ25lZCBjaGFyIGJ1c193aWR0aCkKK3sKKyAgcC0+bXNnX2J1ZltwLT5tc2dfaW5kZXgrK10gPSBNU0dfRVhURU5ERUQ7CisgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gTVNHX0VYVF9XRFRSX0xFTjsKKyAgcC0+bXNnX2J1ZltwLT5tc2dfaW5kZXgrK10gPSBNU0dfRVhUX1dEVFI7CisgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gYnVzX3dpZHRoOworICBwLT5tc2dfbGVuICs9IDQ7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9jYWxjX3Jlc2lkdWFsCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIENhbGN1bGF0ZSB0aGUgcmVzaWR1YWwgZGF0YSBub3QgeWV0IHRyYW5zZmVycmVkLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9jYWxjdWxhdGVfcmVzaWR1YWwgKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnAsIHN0cnVjdCBhaWM3eHh4X3NjYiAqc2NiKQoreworICBzdHJ1Y3QgYWljN3h4eF9od3NjYiAqaHNjYjsKKyAgU2NzaV9DbW5kICpjbWQ7CisgIGludCBhY3R1YWwsIGk7CisKKyAgY21kID0gc2NiLT5jbWQ7CisgIGhzY2IgPSBzY2ItPmhzY2I7CisKKyAgLyoKKyAgICogIERvbid0IGRlc3Ryb3kgdmFsaWQgcmVzaWR1YWwgaW5mb3JtYXRpb24gd2l0aAorICAgKiAgcmVzaWR1YWwgY29taW5nIGZyb20gYSBjaGVjayBzZW5zZSBvcGVyYXRpb24uCisgICAqLworICBpZiAoKChzY2ItPmhzY2ItPmNvbnRyb2wgJiBESVNDT05ORUNURUQpID09IDApICYmCisgICAgICAoc2NiLT5mbGFncyAmIFNDQl9TRU5TRSkgPT0gMCkKKyAgeworICAgIC8qCisgICAgICogIFdlIGhhZCBhbiB1bmRlcmZsb3cuIEF0IHRoaXMgdGltZSwgdGhlcmUncyBvbmx5CisgICAgICogIG9uZSBvdGhlciBkcml2ZXIgdGhhdCBib3RoZXJzIHRvIGNoZWNrIGZvciB0aGlzLAorICAgICAqICBhbmQgY21kLT51bmRlcmZsb3cgc2VlbXMgdG8gYmUgc2V0IHJhdGhlciBoYWxmLQorICAgICAqICBoZWFydGVkbHkgaW4gdGhlIGhpZ2hlci1sZXZlbCBTQ1NJIGNvZGUuCisgICAgICovCisgICAgYWN0dWFsID0gc2NiLT5zZ19sZW5ndGg7CisgICAgZm9yIChpPTE7IGkgPCBoc2NiLT5yZXNpZHVhbF9TR19zZWdtZW50X2NvdW50OyBpKyspCisgICAgeworICAgICAgYWN0dWFsIC09IHNjYi0+c2dfbGlzdFtzY2ItPnNnX2NvdW50IC0gaV0ubGVuZ3RoOworICAgIH0KKyAgICBhY3R1YWwgLT0gKGhzY2ItPnJlc2lkdWFsX2RhdGFfY291bnRbMl0gPDwgMTYpIHwKKyAgICAgICAgICAgICAgKGhzY2ItPnJlc2lkdWFsX2RhdGFfY291bnRbMV0gPDwgIDgpIHwKKyAgICAgICAgICAgICAgaHNjYi0+cmVzaWR1YWxfZGF0YV9jb3VudFswXTsKKworICAgIGlmIChhY3R1YWwgPCBjbWQtPnVuZGVyZmxvdykKKyAgICB7CisgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9NSU5PUl9FUlJPUikKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiVW5kZXJmbG93IC0gV2FudGVkICV1LCAlcyAldSwgcmVzaWR1YWwgU0cgIgorICAgICAgICAgICJjb3VudCAlZC5cbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSwgY21kLT51bmRlcmZsb3csCisgICAgICAgICAgKHJxX2RhdGFfZGlyKGNtZC0+cmVxdWVzdCkgPT0gV1JJVEUpID8gIndyb3RlIiA6ICJyZWFkIiwgYWN0dWFsLAorICAgICAgICAgIGhzY2ItPnJlc2lkdWFsX1NHX3NlZ21lbnRfY291bnQpOworICAgICAgICBwcmludGsoSU5GT19MRUFEICJzdGF0dXMgMHgleC5cbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSwKKyAgICAgICAgICBoc2NiLT50YXJnZXRfc3RhdHVzKTsKKyAgICAgIH0KKyAgICAgIC8qCisgICAgICAgKiBJbiAyLjQsIG9ubHkgc2VuZCBiYWNrIHRoZSByZXNpZHVhbCBpbmZvcm1hdGlvbiwgZG9uJ3QgZmxhZyB0aGlzCisgICAgICAgKiBhcyBhbiBlcnJvci4gIEJlZm9yZSAyLjQgd2UgaGFkIHRvIGZsYWcgdGhpcyBhcyBhbiBlcnJvciBiZWNhdXNlCisgICAgICAgKiB0aGUgbWlkIGxheWVyIGRpZG4ndCBjaGVjayByZXNpZHVhbCBkYXRhIGNvdW50cyB0byBzZWUgaWYgdGhlCisgICAgICAgKiBjb21tYW5kIG5lZWRzIHJldHJpZWQuCisgICAgICAgKi8KKyAgICAgIGNtZC0+cmVzaWQgPSBzY2ItPnNnX2xlbmd0aCAtIGFjdHVhbDsKKyAgICAgIGFpYzd4eHhfc3RhdHVzKGNtZCkgPSBoc2NiLT50YXJnZXRfc3RhdHVzOworICAgIH0KKyAgfQorCisgIC8qCisgICAqIENsZWFuIG91dCB0aGUgcmVzaWR1YWwgaW5mb3JtYXRpb24gaW4gdGhlIFNDQiBmb3IgdGhlCisgICAqIG5leHQgY29uc3VtZXIuCisgICAqLworICBoc2NiLT5yZXNpZHVhbF9kYXRhX2NvdW50WzJdID0gMDsKKyAgaHNjYi0+cmVzaWR1YWxfZGF0YV9jb3VudFsxXSA9IDA7CisgIGhzY2ItPnJlc2lkdWFsX2RhdGFfY291bnRbMF0gPSAwOworICBoc2NiLT5yZXNpZHVhbF9TR19zZWdtZW50X2NvdW50ID0gMDsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2hhbmRsZV9kZXZpY2VfcmVzZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgSW50ZXJydXB0IGhhbmRsZXIgZm9yIHNlcXVlbmNlciBpbnRlcnJ1cHRzIChTRVFJTlQpLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9oYW5kbGVfZGV2aWNlX3Jlc2V0KHN0cnVjdCBhaWM3eHh4X2hvc3QgKnAsIGludCB0YXJnZXQsIGludCBjaGFubmVsKQoreworICB1bnNpZ25lZCBjaGFyIHRpbmRleCA9IHRhcmdldDsKKworICB0aW5kZXggfD0gKChjaGFubmVsICYgMHgwMSkgPDwgMyk7CisKKyAgLyoKKyAgICogR28gYmFjayB0byBhc3luYy9uYXJyb3cgdHJhbnNmZXJzIGFuZCByZW5lZ290aWF0ZS4KKyAgICovCisgIGFpY19vdXRiKHAsIDAsIFRBUkdfU0NTSVJBVEUgKyB0aW5kZXgpOworICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgIGFpY19vdXRiKHAsIDAsIFRBUkdfT0ZGU0VUICsgdGluZGV4KTsKKyAgYWljN3h4eF9yZXNldF9kZXZpY2UocCwgdGFyZ2V0LCBjaGFubmVsLCBBTExfTFVOUywgU0NCX0xJU1RfTlVMTCk7CisgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1JFU0VUX1BST0NFU1MpCisgICAgcHJpbnRrKElORk9fTEVBRCAiQnVzIERldmljZSBSZXNldCBkZWxpdmVyZWQuXG4iLCBwLT5ob3N0X25vLCBjaGFubmVsLAorICAgICAgdGFyZ2V0LCAtMSk7CisgIGFpYzd4eHhfcnVuX2RvbmVfcXVldWUocCwgLypjb21wbGV0ZSovIFRSVUUpOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfaGFuZGxlX3NlcWludAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBJbnRlcnJ1cHQgaGFuZGxlciBmb3Igc2VxdWVuY2VyIGludGVycnVwdHMgKFNFUUlOVCkuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X2hhbmRsZV9zZXFpbnQoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgdW5zaWduZWQgY2hhciBpbnRzdGF0KQoreworICBzdHJ1Y3QgYWljN3h4eF9zY2IgKnNjYjsKKyAgc3RydWN0IGFpY19kZXZfZGF0YSAqYWljX2RldjsKKyAgdW5zaWduZWQgc2hvcnQgdGFyZ2V0X21hc2s7CisgIHVuc2lnbmVkIGNoYXIgdGFyZ2V0LCBsdW4sIHRpbmRleDsKKyAgdW5zaWduZWQgY2hhciBxdWV1ZV9mbGFnID0gRkFMU0U7CisgIGNoYXIgY2hhbm5lbDsKKyAgaW50IHJlc3VsdDsKKworICB0YXJnZXQgPSAoKGFpY19pbmIocCwgU0FWRURfVENMKSA+PiA0KSAmIDB4MGYpOworICBpZiAoIChwLT5jaGlwICYgQUhDX0NISVBJRF9NQVNLKSA9PSBBSENfQUlDNzc3MCApCisgICAgY2hhbm5lbCA9IChhaWNfaW5iKHAsIFNCTEtDVEwpICYgU0VMQlVTQikgPj4gMzsKKyAgZWxzZQorICAgIGNoYW5uZWwgPSAwOworICB0aW5kZXggPSB0YXJnZXQgKyAoY2hhbm5lbCA8PCAzKTsKKyAgbHVuID0gYWljX2luYihwLCBTQVZFRF9UQ0wpICYgMHgwNzsKKyAgdGFyZ2V0X21hc2sgPSAoMHgwMSA8PCB0aW5kZXgpOworCisgIC8qCisgICAqIEdvIGFoZWFkIGFuZCBjbGVhciB0aGUgU0VRSU5UIG5vdywgdGhhdCBhdm9pZHMgYW55IGludGVycnVwdCByYWNlCisgICAqIGNvbmRpdGlvbnMgbGF0ZXIgb24gaW4gY2FzZSB3ZSBlbmFibGUgc29tZSBvdGhlciBpbnRlcnJ1cHQuCisgICAqLworICBhaWNfb3V0YihwLCBDTFJTRVFJTlQsIENMUklOVCk7CisgIHN3aXRjaCAoaW50c3RhdCAmIFNFUUlOVF9NQVNLKQorICB7CisgICAgY2FzZSBOT19NQVRDSDoKKyAgICAgIHsKKyAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQ1NJU0VRKSAmIChFTlNFTEl8RU5SU0VMSXxFTkFVVE9BVE5QKSwKKyAgICAgICAgICAgICAgICAgU0NTSVNFUSk7CisgICAgICAgIHByaW50ayhXQVJOX0xFQUQgIk5vIGFjdGl2ZSBTQ0IgZm9yIHJlY29ubmVjdGluZyB0YXJnZXQgLSBJc3N1aW5nICIKKyAgICAgICAgICAgICAgICJCVVMgREVWSUNFIFJFU0VULlxuIiwgcC0+aG9zdF9ubywgY2hhbm5lbCwgdGFyZ2V0LCBsdW4pOworICAgICAgICBwcmludGsoV0FSTl9MRUFEICIgICAgICBTQVZFRF9UQ0w9MHgleCwgQVJHXzE9MHgleCwgU0VRQUREUj0weCV4XG4iLAorICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgY2hhbm5lbCwgdGFyZ2V0LCBsdW4sCisgICAgICAgICAgICAgICBhaWNfaW5iKHAsIFNBVkVEX1RDTCksIGFpY19pbmIocCwgQVJHXzEpLAorICAgICAgICAgICAgICAgKGFpY19pbmIocCwgU0VRQUREUjEpIDw8IDgpIHwgYWljX2luYihwLCBTRVFBRERSMCkpOworICAgICAgICBpZiAoYWljN3h4eF9wYW5pY19vbl9hYm9ydCkKKyAgICAgICAgICBhaWM3eHh4X3BhbmljX2Fib3J0KHAsIE5VTEwpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNFTkRfUkVKRUNUOgorICAgICAgeworICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9NSU5PUl9FUlJPUikKKyAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJSZWplY3RpbmcgdW5rbm93biBtZXNzYWdlICgweCV4KSByZWNlaXZlZCBmcm9tICIKKyAgICAgICAgICAgICJ0YXJnZXQsIFNFUV9GTEFHUz0weCV4XG4iLCBwLT5ob3N0X25vLCBjaGFubmVsLCB0YXJnZXQsIGx1biwKKyAgICAgICAgICAgIGFpY19pbmIocCwgQUNDVU0pLCBhaWNfaW5iKHAsIFNFUV9GTEFHUykpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5PX0lERU5UOgorICAgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgcmVjb25uZWN0aW5nIHRhcmdldCBlaXRoZXIgZGlkIG5vdCBzZW5kIGFuIGlkZW50aWZ5CisgICAgICAgICAqIG1lc3NhZ2UsIG9yIGRpZCwgYnV0IHdlIGRpZG4ndCBmaW5kIGFuIFNDQiB0byBtYXRjaCBhbmQKKyAgICAgICAgICogYmVmb3JlIGl0IGNvdWxkIHJlc3BvbmQgdG8gb3VyIEFUTi9hYm9ydCwgaXQgaGl0IGEgZGF0YXBoYXNlLgorICAgICAgICAgKiBUaGUgb25seSBzYWZlIHRoaW5nIHRvIGRvIGlzIHRvIGJsb3cgaXQgYXdheSB3aXRoIGEgYnVzCisgICAgICAgICAqIHJlc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIChWRVJCT1NFX1NFUUlOVCB8IFZFUkJPU0VfUkVTRVRfTUlEKSkKKyAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJUYXJnZXQgZGlkIG5vdCBzZW5kIGFuIElERU5USUZZIG1lc3NhZ2U7ICIKKyAgICAgICAgICAgICJMQVNUUEhBU0UgMHgleCwgU0FWRURfVENMIDB4JXhcbiIsIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwKKyAgICAgICAgICAgIGx1biwgYWljX2luYihwLCBMQVNUUEhBU0UpLCBhaWNfaW5iKHAsIFNBVkVEX1RDTCkpOworCisgICAgICAgIGFpYzd4eHhfcmVzZXRfY2hhbm5lbChwLCBjaGFubmVsLCAvKmluaXRpYXRlIHJlc2V0Ki8gVFJVRSk7CisgICAgICAgIGFpYzd4eHhfcnVuX2RvbmVfcXVldWUocCwgVFJVRSk7CisKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCQURfUEhBU0U6CisgICAgICBpZiAoYWljX2luYihwLCBMQVNUUEhBU0UpID09IFBfQlVTRlJFRSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfU0VRSU5UKQorICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIk1pc3NlZCBidXNmcmVlLlxuIiwgcC0+aG9zdF9ubywgY2hhbm5lbCwKKyAgICAgICAgICAgIHRhcmdldCwgbHVuKTsKKyAgICAgICAgcmVzdGFydF9zZXF1ZW5jZXIocCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1NFUUlOVCkKKyAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJVbmtub3duIHNjc2kgYnVzIHBoYXNlLCBjb250aW51aW5nXG4iLCBwLT5ob3N0X25vLAorICAgICAgICAgICAgY2hhbm5lbCwgdGFyZ2V0LCBsdW4pOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVYVEVOREVEX01TRzoKKyAgICAgIHsKKyAgICAgICAgcC0+bXNnX3R5cGUgPSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHSU47CisgICAgICAgIHAtPm1zZ19sZW4gPSAwOworICAgICAgICBwLT5tc2dfaW5kZXggPSAwOworCisjaWZkZWYgQUlDN1hYWF9WRVJCT1NFX0RFQlVHR0lORworICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlID4gMHhmZmZmKQorICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIkVuYWJsaW5nIFJFUUlOSVRzIGZvciBNU0dfSU5cbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICAgICAgIGNoYW5uZWwsIHRhcmdldCwgbHVuKTsKKyNlbmRpZgorCisgICAgICAgLyogICAgICAKKyAgICAgICAgKiBUbyBhY3R1YWxseSByZWNlaXZlIHRoZSBtZXNzYWdlLCBzaW1wbHkgdHVybiBvbgorICAgICAgICAqIFJFUUlOSVQgaW50ZXJydXB0cyBhbmQgbGV0IG91ciBpbnRlcnJ1cHQgaGFuZGxlcgorICAgICAgICAqIGRvIHRoZSByZXN0IChSRVFJTklUIHNob3VsZCBhbHJlYWR5IGJlIHRydWUpLgorICAgICAgICAqLworICAgICAgICBwLT5mbGFncyB8PSBBSENfSEFORExJTkdfUkVRSU5JVFM7CisgICAgICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0lNT0RFMSkgfCBFTlJFUUlOSVQsIFNJTU9ERTEpOworCisgICAgICAgLyoKKyAgICAgICAgKiBXZSBkb24ndCB3YW50IHRoZSBzZXF1ZW5jZXIgdW5wYXVzZWQgeWV0IHNvIHdlIHJldHVybiBlYXJseQorICAgICAgICAqLworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICBjYXNlIFJFSkVDVF9NU0c6CisgICAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFdoYXQgd2UgY2FyZSBhYm91dCBoZXJlIGlzIGlmIHdlIGhhZCBhbiBvdXRzdGFuZGluZyBTRFRSCisgICAgICAgICAqIG9yIFdEVFIgbWVzc2FnZSBmb3IgdGhpcyB0YXJnZXQuIElmIHdlIGRpZCwgdGhpcyBpcyBhCisgICAgICAgICAqIHNpZ25hbCB0aGF0IHRoZSB0YXJnZXQgaXMgcmVmdXNpbmcgbmVnb3RpYXRpb24uCisgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBjaGFyIHNjYl9pbmRleDsKKyAgICAgICAgdW5zaWduZWQgY2hhciBsYXN0X21zZzsKKworICAgICAgICBzY2JfaW5kZXggPSBhaWNfaW5iKHAsIFNDQl9UQUcpOworICAgICAgICBzY2IgPSBwLT5zY2JfZGF0YS0+c2NiX2FycmF5W3NjYl9pbmRleF07CisJYWljX2RldiA9IEFJQ19ERVYoc2NiLT5jbWQpOworICAgICAgICBsYXN0X21zZyA9IGFpY19pbmIocCwgTEFTVF9NU0cpOworCisgICAgICAgIGlmICggKGxhc3RfbXNnID09IE1TR19JREVOVElGWUZMQUcpICYmCisgICAgICAgICAgICAgKHNjYi0+dGFnX2FjdGlvbikgJiYKKyAgICAgICAgICAgICEoc2NiLT5mbGFncyAmIFNDQl9NU0dPVVRfQklUUykgKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHNjYi0+dGFnX2FjdGlvbiA9PSBNU0dfT1JERVJFRF9RX1RBRykKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogT0suLi50aGUgZGV2aWNlIHNlZW1zIGFibGUgdG8gYWNjZXB0IHRhZ2dlZCBjb21tYW5kcywgYnV0CisgICAgICAgICAgICAgKiBub3Qgb3JkZXJlZCB0YWcgY29tbWFuZHMsIG9ubHkgc2ltcGxlIHRhZyBjb21tYW5kcy4gIFNvLCB3ZQorICAgICAgICAgICAgICogZGlzYWJsZSBvcmRlcmVkIHRhZyBjb21tYW5kcyBhbmQgZ28gb24gd2l0aCBsaWZlIGp1c3QgbGlrZQorICAgICAgICAgICAgICogbm9ybWFsLgorICAgICAgICAgICAgICovCisJICAgIHNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNjYi0+Y21kLT5kZXZpY2UsIE1TR19TSU1QTEVfVEFHLAorCQkJICAgIHNjYi0+Y21kLT5kZXZpY2UtPnF1ZXVlX2RlcHRoKTsKKyAgICAgICAgICAgIHNjYi0+dGFnX2FjdGlvbiA9IE1TR19TSU1QTEVfUV9UQUc7CisgICAgICAgICAgICBzY2ItPmhzY2ItPmNvbnRyb2wgJj0gflNDQl9UQUdfVFlQRTsKKyAgICAgICAgICAgIHNjYi0+aHNjYi0+Y29udHJvbCB8PSBNU0dfU0lNUExFX1FfVEFHOworICAgICAgICAgICAgYWljX291dGIocCwgc2NiLT5oc2NiLT5jb250cm9sLCBTQ0JfQ09OVFJPTCk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogT0suLndlIHNldCB0aGUgdGFnIHR5cGUgdG8gc2ltcGxlIHRhZyBjb21tYW5kLCBub3cgd2UgcmUtYXNzZXJ0CisgICAgICAgICAgICAgKiBBVE5PIGFuZCBob3BlIHRoaXMgd2lsbCB0YWtlIHVzIGludG8gdGhlIGlkZW50aWZ5IHBoYXNlIGFnYWluCisgICAgICAgICAgICAgKiBzbyB3ZSBjYW4gcmVzZW5kIHRoZSB0YWcgdHlwZSBhbmQgaW5mbyB0byB0aGUgZGV2aWNlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhaWNfb3V0YihwLCBNU0dfSURFTlRJRllGTEFHLCBNU0dfT1VUKTsKKyAgICAgICAgICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0NTSVNJR0kpIHwgQVROTywgU0NTSVNJR08pOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChzY2ItPnRhZ19hY3Rpb24gPT0gTVNHX1NJTVBMRV9RX1RBRykKKyAgICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGk7CisgICAgICAgICAgICBzdHJ1Y3QgYWljN3h4eF9zY2IgKnNjYnA7CisgICAgICAgICAgICBpbnQgb2xkX3ZlcmJvc2U7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSG1tbW0uLi4udGhlIGRldmljZSBpcyBmbGFraW5nIG91dCBvbiB0YWdnZWQgY29tbWFuZHMuCisgICAgICAgICAgICAgKi8KKwkgICAgc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2NiLT5jbWQtPmRldmljZSwgMCAvKiB1bnRhZ2dlZCAqLywKKwkJCSAgICBwLT5ob3N0LT5jbWRfcGVyX2x1bik7CisgICAgICAgICAgICBhaWNfZGV2LT5tYXhfcV9kZXB0aCA9IGFpY19kZXYtPnRlbXBfcV9kZXB0aCA9IDE7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogV2Ugc2V0IHRoaXMgY29tbWFuZCB1cCBhcyBhIGJ1cyBkZXZpY2UgcmVzZXQuICBIb3dldmVyLCB3ZSBoYXZlCisgICAgICAgICAgICAgKiB0byBjbGVhciB0aGUgdGFnIHR5cGUgYXMgaXQncyBjYXVzaW5nIHVzIHByb2JsZW1zLiAgV2Ugc2hvdWxkbnQKKyAgICAgICAgICAgICAqIGhhdmUgdG8gd29ycnkgYWJvdXQgYW55IG90aGVyIGNvbW1hbmRzIGJlaW5nIGFjdGl2ZSwgc2luY2UgaWYKKyAgICAgICAgICAgICAqIHRoZSBkZXZpY2UgaXMgcmVmdXNpbmcgdGFnZ2VkIGNvbW1hbmRzLCB0aGlzIHNob3VsZCBiZSB0aGUKKyAgICAgICAgICAgICAqIGZpcnN0IHRhZ2dlZCBjb21tYW5kIHNlbnQgdG8gdGhlIGRldmljZSwgaG93ZXZlciwgd2UgZG8gaGF2ZQorICAgICAgICAgICAgICogdG8gd29ycnkgYWJvdXQgYW55IG90aGVyIHRhZ2dlZCBjb21tYW5kcyB0aGF0IG1heSBhbHJlYWR5IGJlCisgICAgICAgICAgICAgKiBpbiB0aGUgcWluZmlmby4gIFRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGlzLCBpcyB0byBpc3N1ZSBhIEJEUiwKKyAgICAgICAgICAgICAqIHNlbmQgYWxsIHRoZSBjb21tYW5kcyBiYWNrIHRvIHRoZSBtaWQgbGV2ZWwgY29kZSwgdGhlbiBsZXQgdGhlbQorICAgICAgICAgICAgICogY29tZSBiYWNrIGFuZCBnZXQgcmVidWlsdCBhcyB1bnRhZ2dlZCBjb21tYW5kcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc2NiLT50YWdfYWN0aW9uID0gMDsKKyAgICAgICAgICAgIHNjYi0+aHNjYi0+Y29udHJvbCAmPSB+KFRBR19FTkIgfCBTQ0JfVEFHX1RZUEUpOworICAgICAgICAgICAgYWljX291dGIocCwgIHNjYi0+aHNjYi0+Y29udHJvbCwgU0NCX0NPTlRST0wpOworCisgICAgICAgICAgICBvbGRfdmVyYm9zZSA9IGFpYzd4eHhfdmVyYm9zZTsKKyAgICAgICAgICAgIGFpYzd4eHhfdmVyYm9zZSAmPSB+KFZFUkJPU0VfUkVTRVR8VkVSQk9TRV9BQk9SVCk7CisgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHAtPnNjYl9kYXRhLT5udW1zY2JzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHNjYnAgPSBwLT5zY2JfZGF0YS0+c2NiX2FycmF5W2ldOworICAgICAgICAgICAgICBpZiAoKHNjYnAtPmZsYWdzICYgU0NCX0FDVElWRSkgJiYgKHNjYnAgIT0gc2NiKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhaWM3eHh4X21hdGNoX3NjYihwLCBzY2JwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgaSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgYWljN3h4eF9yZXNldF9kZXZpY2UocCwgdGFyZ2V0LCBjaGFubmVsLCBsdW4sIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYWljN3h4eF9ydW5fZG9uZV9xdWV1ZShwLCBUUlVFKTsKKyAgICAgICAgICAgIGFpYzd4eHhfdmVyYm9zZSA9IG9sZF92ZXJib3NlOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFdhaXQgdW50aWwgYWZ0ZXIgdGhlIGZvciBsb29wIHRvIHNldCB0aGUgYnVzeSBpbmRleCBzaW5jZQorICAgICAgICAgICAgICogYWljN3h4eF9yZXNldF9kZXZpY2Ugd2lsbCBjbGVhciB0aGUgYnVzeSBpbmRleCBkdXJpbmcgaXRzCisgICAgICAgICAgICAgKiBvcGVyYXRpb24uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFpYzd4eHhfYnVzeV90YXJnZXQocCwgc2NiKTsKKyAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIkRldmljZSBpcyByZWZ1c2luZyB0YWdnZWQgY29tbWFuZHMsIHVzaW5nICIKKyAgICAgICAgICAgICAgInVudGFnZ2VkIEkvTy5cbiIsIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwgbHVuKTsKKyAgICAgICAgICAgIGFpY19vdXRiKHAsIE1TR19JREVOVElGWUZMQUcsIE1TR19PVVQpOworICAgICAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQ1NJU0lHSSkgfCBBVE5PLCBTQ1NJU0lHTyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfTVNHT1VUX1BQUikKKyAgICAgICAgeworICAgICAgICAgIC8qCisgICAgICAgICAgICogQXMgcGVyIHRoZSBkcmFmdCBzcGVjcywgYW55IGRldmljZSBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgYW55IG9mCisgICAgICAgICAgICogdGhlIG9wdGlvbiB2YWx1ZXMgb3RoZXIgdGhhbiAwIGFyZSBub3QgYWxsb3dlZCB0byByZWplY3QgdGhlCisgICAgICAgICAgICogUFBSIG1lc3NhZ2UuICBJbnN0ZWFkLCB0aGV5IG11c3QgbmVnb3RpYXRlIG91dCB3aGF0IHRoZXkgZG8KKyAgICAgICAgICAgKiBzdXBwb3J0IGluc3RlYWQgb2YgcmVqZWN0aW5nIG91ciBvZmZlcmluZyBvciBlbHNlIHRoZXkgY2F1c2UKKyAgICAgICAgICAgKiBhIHBhcml0eSBlcnJvciBkdXJpbmcgbXNnX291dCBwaGFzZSB0byBzaWduYWwgdGhhdCB0aGV5IGRvbid0CisgICAgICAgICAgICogbGlrZSBvdXIgc2V0dGluZ3MuCisgICAgICAgICAgICovCisgICAgICAgICAgYWljX2Rldi0+bmVlZHBwciA9IGFpY19kZXYtPm5lZWRwcHJfY29weSA9IDA7CisgICAgICAgICAgYWljN3h4eF9zZXRfd2lkdGgocCwgdGFyZ2V0LCBjaGFubmVsLCBsdW4sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisgICAgICAgICAgICAoQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfQ1VSfEFIQ19UUkFOU19RVUlURSksIGFpY19kZXYpOworICAgICAgICAgIGFpYzd4eHhfc2V0X3N5bmNyYXRlKHAsIE5VTEwsIHRhcmdldCwgY2hhbm5lbCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSENfVFJBTlNfQUNUSVZFfEFIQ19UUkFOU19DVVJ8QUhDX1RSQU5TX1FVSVRFLAorCQkJICAgICAgIGFpY19kZXYpOworICAgICAgICAgIGFpY19kZXYtPmdvYWwub3B0aW9ucyA9IGFpY19kZXYtPmR0cl9wZW5kaW5nID0gMDsKKyAgICAgICAgICBzY2ItPmZsYWdzICY9IH5TQ0JfTVNHT1VUX0JJVFM7CisgICAgICAgICAgaWYoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9ORUdPVElBVElPTjIpCisgICAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiRGV2aWNlIGlzIHJlamVjdGluZyBQUFIgbWVzc2FnZXMsIGZhbGxpbmcgIgorICAgICAgICAgICAgICAiYmFjay5cbiIsIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwgbHVuKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCBhaWNfZGV2LT5nb2FsLndpZHRoICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBhaWNfZGV2LT5uZWVkd2R0ciA9IGFpY19kZXYtPm5lZWR3ZHRyX2NvcHkgPSAxOworICAgICAgICAgICAgYWljX2Rldi0+ZHRyX3BlbmRpbmcgPSAxOworICAgICAgICAgICAgc2NiLT5mbGFncyB8PSBTQ0JfTVNHT1VUX1dEVFI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICggYWljX2Rldi0+Z29hbC5vZmZzZXQgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGFpY19kZXYtPm5lZWRzZHRyID0gYWljX2Rldi0+bmVlZHNkdHJfY29weSA9IDE7CisgICAgICAgICAgICBpZiggIWFpY19kZXYtPmR0cl9wZW5kaW5nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWljX2Rldi0+ZHRyX3BlbmRpbmcgPSAxOworICAgICAgICAgICAgICBzY2ItPmZsYWdzIHw9IFNDQl9NU0dPVVRfU0RUUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCBhaWNfZGV2LT5kdHJfcGVuZGluZyApCisgICAgICAgICAgeworICAgICAgICAgICAgYWljX291dGIocCwgSE9TVF9NU0csIE1TR19PVVQpOworICAgICAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQ1NJU0lHSSkgfCBBVE5PLCBTQ1NJU0lHTyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfTVNHT1VUX1dEVFIpCisgICAgICAgIHsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIG5vdGUgOGJpdCB4ZmVycyBhbmQgY2xlYXIgZmxhZworICAgICAgICAgICAqLworICAgICAgICAgIGFpY19kZXYtPm5lZWR3ZHRyID0gYWljX2Rldi0+bmVlZHdkdHJfY29weSA9IDA7CisgICAgICAgICAgc2NiLT5mbGFncyAmPSB+U0NCX01TR09VVF9CSVRTOworICAgICAgICAgIGFpYzd4eHhfc2V0X3dpZHRoKHAsIHRhcmdldCwgY2hhbm5lbCwgbHVuLCBNU0dfRVhUX1dEVFJfQlVTXzhfQklULAorICAgICAgICAgICAgKEFIQ19UUkFOU19BQ1RJVkV8QUhDX1RSQU5TX0dPQUx8QUhDX1RSQU5TX0NVUiksIGFpY19kZXYpOworICAgICAgICAgIGFpYzd4eHhfc2V0X3N5bmNyYXRlKHAsIE5VTEwsIHRhcmdldCwgY2hhbm5lbCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSENfVFJBTlNfQUNUSVZFfEFIQ19UUkFOU19DVVJ8QUhDX1RSQU5TX1FVSVRFLAorCQkJICAgICAgIGFpY19kZXYpOworICAgICAgICAgIGlmKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIkRldmljZSBpcyByZWplY3RpbmcgV0RUUiBtZXNzYWdlcywgdXNpbmcgIgorICAgICAgICAgICAgICAibmFycm93IHRyYW5zZmVycy5cbiIsIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwgbHVuKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYWljX2Rldi0+bmVlZHNkdHIgPSBhaWNfZGV2LT5uZWVkc2R0cl9jb3B5OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfTVNHT1VUX1NEVFIpCisgICAgICAgIHsKKyAgICAgICAgIC8qCisgICAgICAgICAgKiBub3RlIGFzeW5jaCB4ZmVycyBhbmQgY2xlYXIgZmxhZworICAgICAgICAgICovCisgICAgICAgICAgYWljX2Rldi0+bmVlZHNkdHIgPSBhaWNfZGV2LT5uZWVkc2R0cl9jb3B5ID0gMDsKKyAgICAgICAgICBzY2ItPmZsYWdzICY9IH5TQ0JfTVNHT1VUX0JJVFM7CisgICAgICAgICAgYWljN3h4eF9zZXRfc3luY3JhdGUocCwgTlVMTCwgdGFyZ2V0LCBjaGFubmVsLCAwLCAwLCAwLAorICAgICAgICAgICAgKEFIQ19UUkFOU19DVVJ8QUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfR09BTCksIGFpY19kZXYpOworICAgICAgICAgIGlmKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIkRldmljZSBpcyByZWplY3RpbmcgU0RUUiBtZXNzYWdlcywgdXNpbmcgIgorICAgICAgICAgICAgICAiYXN5bmMgdHJhbnNmZXJzLlxuIiwgcC0+aG9zdF9ubywgY2hhbm5lbCwgdGFyZ2V0LCBsdW4pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1NFUUlOVCkKKyAgICAgICAgeworICAgICAgICAgIC8qCisgICAgICAgICAgICogT3RoZXJ3aXNlLCB3ZSBpZ25vcmUgaXQuCisgICAgICAgICAgICovCisgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiUmVjZWl2ZWQgTUVTU0FHRV9SRUpFQ1QgZm9yIHVua25vd24gY2F1c2UuICAiCisgICAgICAgICAgICAiSWdub3JpbmcuXG4iLCBwLT5ob3N0X25vLCBjaGFubmVsLCB0YXJnZXQsIGx1bik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCQURfU1RBVFVTOgorICAgICAgeworICAgICAgICB1bnNpZ25lZCBjaGFyIHNjYl9pbmRleDsKKyAgICAgICAgc3RydWN0IGFpYzd4eHhfaHdzY2IgKmhzY2I7CisgICAgICAgIFNjc2lfQ21uZCAqY21kOworCisgICAgICAgIC8qIFRoZSBzZXF1ZW5jZXIgd2lsbCBub3RpZnkgdXMgd2hlbiBhIGNvbW1hbmQgaGFzIGFuIGVycm9yIHRoYXQKKyAgICAgICAgICogd291bGQgYmUgb2YgaW50ZXJlc3QgdG8gdGhlIGtlcm5lbC4gIFRoaXMgYWxsb3dzIHVzIHRvIGxlYXZlCisgICAgICAgICAqIHRoZSBzZXF1ZW5jZXIgcnVubmluZyBpbiB0aGUgY29tbW9uIGNhc2Ugb2YgY29tbWFuZCBjb21wbGV0ZXMKKyAgICAgICAgICogd2l0aG91dCBlcnJvci4gIFRoZSBzZXF1ZW5jZXIgd2lsbCBoYXZlIERNQSdkIHRoZSBTQ0IgYmFjaworICAgICAgICAgKiB1cCB0byB1cywgc28gd2UgY2FuIHJlZmVyZW5jZSB0aGUgZHJpdmVycyBTQ0IgYXJyYXkuCisgICAgICAgICAqCisgICAgICAgICAqIFNldCB0aGUgZGVmYXVsdCByZXR1cm4gdmFsdWUgdG8gMCBpbmRpY2F0aW5nIG5vdCB0byBzZW5kCisgICAgICAgICAqIHNlbnNlLiAgVGhlIHNlbnNlIGNvZGUgd2lsbCBjaGFuZ2UgdGhpcyBpZiBuZWVkZWQgYW5kIHRoaXMKKyAgICAgICAgICogcmVkdWNlcyBjb2RlIGR1cGxpY2F0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgYWljX291dGIocCwgMCwgUkVUVVJOXzEpOworICAgICAgICBzY2JfaW5kZXggPSBhaWNfaW5iKHAsIFNDQl9UQUcpOworICAgICAgICBpZiAoc2NiX2luZGV4ID4gcC0+c2NiX2RhdGEtPm51bXNjYnMpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGsoV0FSTl9MRUFEICJJbnZhbGlkIFNDQiBkdXJpbmcgU0VRSU5UIDB4JTAyeCwgU0NCX1RBRyAlZC5cbiIsCisgICAgICAgICAgICBwLT5ob3N0X25vLCBjaGFubmVsLCB0YXJnZXQsIGx1biwgaW50c3RhdCwgc2NiX2luZGV4KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzY2IgPSBwLT5zY2JfZGF0YS0+c2NiX2FycmF5W3NjYl9pbmRleF07CisgICAgICAgIGhzY2IgPSBzY2ItPmhzY2I7CisKKyAgICAgICAgaWYgKCEoc2NiLT5mbGFncyAmIFNDQl9BQ1RJVkUpIHx8IChzY2ItPmNtZCA9PSBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ayhXQVJOX0xFQUQgIkludmFsaWQgU0NCIGR1cmluZyBTRVFJTlQgMHgleCwgc2NiICVkLCBmbGFncyAweCV4LCIKKyAgICAgICAgICAgICIgY21kIDB4JWx4LlxuIiwgcC0+aG9zdF9ubywgY2hhbm5lbCwgdGFyZ2V0LCBsdW4sIGludHN0YXQsCisgICAgICAgICAgICBzY2JfaW5kZXgsIHNjYi0+ZmxhZ3MsICh1bnNpZ25lZCBsb25nKSBzY2ItPmNtZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgY21kID0gc2NiLT5jbWQ7CisJICBhaWNfZGV2ID0gQUlDX0RFVihzY2ItPmNtZCk7CisgICAgICAgICAgaHNjYi0+dGFyZ2V0X3N0YXR1cyA9IGFpY19pbmIocCwgU0NCX1RBUkdFVF9TVEFUVVMpOworICAgICAgICAgIGFpYzd4eHhfc3RhdHVzKGNtZCkgPSBoc2NiLT50YXJnZXRfc3RhdHVzOworCisgICAgICAgICAgY21kLT5yZXN1bHQgPSBoc2NiLT50YXJnZXRfc3RhdHVzOworCisgICAgICAgICAgc3dpdGNoIChzdGF0dXNfYnl0ZShoc2NiLT50YXJnZXRfc3RhdHVzKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEdPT0Q6CisgICAgICAgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1NFUUlOVCkKKyAgICAgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJJbnRlcnJ1cHRlZCBmb3Igc3RhdHVzIG9mIEdPT0Q/Pz9cbiIsCisgICAgICAgICAgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYikpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBDT01NQU5EX1RFUk1JTkFURUQ6CisgICAgICAgICAgICBjYXNlIENIRUNLX0NPTkRJVElPTjoKKyAgICAgICAgICAgICAgaWYgKCAhKHNjYi0+ZmxhZ3MgJiBTQ0JfU0VOU0UpICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2VuZCBhIHNlbnNlIGNvbW1hbmQgdG8gdGhlIHJlcXVlc3RpbmcgdGFyZ2V0LgorICAgICAgICAgICAgICAgICAqIFhYWCAtIHJldmlzaXQgdGhpcyBhbmQgZ2V0IHJpZCBvZiB0aGUgbWVtY29weXMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbWVtY3B5KHNjYi0+c2Vuc2VfY21kLCAmZ2VuZXJpY19zZW5zZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdlbmVyaWNfc2Vuc2UpKTsKKworICAgICAgICAgICAgICAgIHNjYi0+c2Vuc2VfY21kWzFdID0gKGNtZC0+ZGV2aWNlLT5sdW4gPDwgNSk7CisgICAgICAgICAgICAgICAgc2NiLT5zZW5zZV9jbWRbNF0gPSBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpOworCisgICAgICAgICAgICAgICAgc2NiLT5zZ19saXN0WzBdLmxlbmd0aCA9IAorICAgICAgICAgICAgICAgICAgY3B1X3RvX2xlMzIoc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisJCXNjYi0+c2dfbGlzdFswXS5hZGRyZXNzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHAtPnBkZXYsIGNtZC0+c2Vuc2VfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSkpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBYWFggLSBXZSBzaG91bGQgYWxsb3cgZGlzY29ubmVjdGlvbiwgYnV0IGNhbid0IGFzIGl0CisgICAgICAgICAgICAgICAgICogbWlnaHQgYWxsb3cgb3ZlcmxhcHBlZCB0YWdnZWQgY29tbWFuZHMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLyogaHNjYi0+Y29udHJvbCAmPSBESVNDRU5COyAqLworICAgICAgICAgICAgICAgIGhzY2ItPmNvbnRyb2wgPSAwOworICAgICAgICAgICAgICAgIGhzY2ItPnRhcmdldF9zdGF0dXMgPSAwOworICAgICAgICAgICAgICAgIGhzY2ItPlNHX2xpc3RfcG9pbnRlciA9IAorCQkgIGNwdV90b19sZTMyKFNDQl9ETUFfQUREUihzY2IsIHNjYi0+c2dfbGlzdCkpOworICAgICAgICAgICAgICAgIGhzY2ItPlNDU0lfY21kX3BvaW50ZXIgPSAKKyAgICAgICAgICAgICAgICAgIGNwdV90b19sZTMyKFNDQl9ETUFfQUREUihzY2IsIHNjYi0+c2Vuc2VfY21kKSk7CisgICAgICAgICAgICAgICAgaHNjYi0+ZGF0YV9jb3VudCA9IHNjYi0+c2dfbGlzdFswXS5sZW5ndGg7CisgICAgICAgICAgICAgICAgaHNjYi0+ZGF0YV9wb2ludGVyID0gc2NiLT5zZ19saXN0WzBdLmFkZHJlc3M7CisgICAgICAgICAgICAgICAgaHNjYi0+U0NTSV9jbWRfbGVuZ3RoID0gQ09NTUFORF9TSVpFKHNjYi0+c2Vuc2VfY21kWzBdKTsKKyAgICAgICAgICAgICAgICBoc2NiLT5yZXNpZHVhbF9TR19zZWdtZW50X2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBoc2NiLT5yZXNpZHVhbF9kYXRhX2NvdW50WzBdID0gMDsKKyAgICAgICAgICAgICAgICBoc2NiLT5yZXNpZHVhbF9kYXRhX2NvdW50WzFdID0gMDsKKyAgICAgICAgICAgICAgICBoc2NiLT5yZXNpZHVhbF9kYXRhX2NvdW50WzJdID0gMDsKKworICAgICAgICAgICAgICAgIHNjYi0+c2dfY291bnQgPSBoc2NiLT5TR19zZWdtZW50X2NvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBzY2ItPnNnX2xlbmd0aCA9IHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcik7CisgICAgICAgICAgICAgICAgc2NiLT50YWdfYWN0aW9uID0gMDsKKyAgICAgICAgICAgICAgICBzY2ItPmZsYWdzIHw9IFNDQl9TRU5TRTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEVuc3VyZSB0aGUgdGFyZ2V0IGlzIGJ1c3kgc2luY2UgdGhpcyB3aWxsIGJlIGFuCisgICAgICAgICAgICAgICAgICogYW4gdW50YWdnZWQgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBBSUM3WFhYX1ZFUkJPU0VfREVCVUdHSU5HCisgICAgICAgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChzY2ItPmZsYWdzICYgU0NCX01TR09VVF9CSVRTKQorICAgICAgICAgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJSZXF1ZXN0aW5nIFNFTlNFIHdpdGggJXNcbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDVExfT0ZfU0NCKHNjYiksIChzY2ItPmZsYWdzICYgU0NCX01TR09VVF9TRFRSKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0RUUiIgOiAiV0RUUiIpOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJSZXF1ZXN0aW5nIFNFTlNFLCBubyBNU0dcbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDVExfT0ZfU0NCKHNjYikpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIGFpYzd4eHhfYnVzeV90YXJnZXQocCwgc2NiKTsKKyAgICAgICAgICAgICAgICBhaWNfb3V0YihwLCBTRU5EX1NFTlNFLCBSRVRVUk5fMSk7CisgICAgICAgICAgICAgICAgYWljN3h4eF9lcnJvcihjbWQpID0gRElEX09LOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9ICAvKiBmaXJzdCB0aW1lIHNlbnNlLCBubyBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiQ0hFQ0tfQ09ORElUSU9OIG9uIFJFUVVFU1RfU0VOU0UsIHJldHVybmluZyAiCisgICAgICAgICAgICAgICAgICAgICAiYW4gZXJyb3IuXG4iLCBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYikpOworICAgICAgICAgICAgICBhaWM3eHh4X2Vycm9yKGNtZCkgPSBESURfRVJST1I7CisgICAgICAgICAgICAgIHNjYi0+ZmxhZ3MgJj0gflNDQl9TRU5TRTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUVVFVUVfRlVMTDoKKyAgICAgICAgICAgICAgcXVldWVfZmxhZyA9IFRSVUU7ICAgIC8qIE1hcmsgdGhhdCB0aGlzIGlzIGEgUVVFVUVfRlVMTCBhbmQgKi8KKyAgICAgICAgICAgIGNhc2UgQlVTWTogICAgICAgICAgICAgIC8qIGRyb3AgdGhyb3VnaCB0byBoZXJlICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHN0cnVjdCBhaWM3eHh4X3NjYiAqbmV4dF9zY2JwLCAqcHJldl9zY2JwOworICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGFjdGl2ZV9oc2NiLCBuZXh0X2hzY2IsIHByZXZfaHNjYiwgc2NiX2luZGV4OworICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgKiBXZSBoYXZlIHRvIGxvb2sgdGhyZWUgcGxhY2VzIGZvciBxdWV1ZWQgY29tbWFuZHM6CisgICAgICAgICAgICAgICAqICAxOiBwLT53YWl0aW5nX3NjYnMgcXVldWUKKyAgICAgICAgICAgICAgICogIDI6IFFJTkZJRk8KKyAgICAgICAgICAgICAgICogIDM6IFdBSVRJTkdfU0NCUyBsaXN0IG9uIGNhcmQgKGZvciBjb21tYW5kcyB0aGF0IGFyZSBzdGFydGVkCisgICAgICAgICAgICAgICAqICAgICBidXQgaGF2ZW4ndCB5ZXQgbWFkZSBpdCB0byB0aGUgZGV2aWNlKQorCSAgICAgICAqCisJICAgICAgICogT2Ygc3BlY2lhbCBub3RlIGhlcmUgaXMgdGhhdCBjb21tYW5kcyBvbiAyIG9yIDMgYWJvdmUgd2lsbAorCSAgICAgICAqIGhhdmUgYWxyZWFkeSBiZWVuIG1hcmtlZCBhcyBhY3RpdmUsIHdoaWxlIGNvbW1hbmRzIG9uIDEgd2lsbAorCSAgICAgICAqIG5vdC4gIFRoZSBhaWM3eHh4X2RvbmUoKSBmdW5jdGlvbiB3aWxsIHdhbnQgdG8gdW5tYXJrIHRoZW0KKwkgICAgICAgKiBmcm9tIGFjdGl2ZSwgc28gYW55IGNvbW1hbmRzIHdlIHB1bGwgb2ZmIG9mIDEgbmVlZCB0bworCSAgICAgICAqIHVwIHRoZSBhY3RpdmUgY291bnQuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBuZXh0X3NjYnAgPSBwLT53YWl0aW5nX3NjYnMuaGVhZDsKKyAgICAgICAgICAgICAgd2hpbGUgKCBuZXh0X3NjYnAgIT0gTlVMTCApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmV2X3NjYnAgPSBuZXh0X3NjYnA7CisgICAgICAgICAgICAgICAgbmV4dF9zY2JwID0gbmV4dF9zY2JwLT5xX25leHQ7CisgICAgICAgICAgICAgICAgaWYgKCBhaWM3eHh4X21hdGNoX3NjYihwLCBwcmV2X3NjYnAsIHRhcmdldCwgY2hhbm5lbCwgbHVuLAorICAgICAgICAgICAgICAgICAgICAgU0NCX0xJU1RfTlVMTCkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNjYnFfcmVtb3ZlKCZwLT53YWl0aW5nX3NjYnMsIHByZXZfc2NicCk7CisJCSAgc2NiLT5mbGFncyA9IFNDQl9RVUVVRURfRk9SX0RPTkUgfCBTQ0JfUVVFVUVfRlVMTDsKKwkJICBwLT5hY3RpdmVzY2JzKys7CisJCSAgYWljX2Rldi0+YWN0aXZlX2NtZHMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYWljN3h4eF9zZWFyY2hfcWluZmlmbyhwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwKKyAgICAgICAgICAgICAgICBTQ0JfTElTVF9OVUxMLCBTQ0JfUVVFVUVEX0ZPUl9ET05FIHwgU0NCX1FVRVVFX0ZVTEwsCisJICAgICAgIAlGQUxTRSwgTlVMTCk7CisgICAgICAgICAgICAgIG5leHRfc2NicCA9IE5VTEw7CisgICAgICAgICAgICAgIGFjdGl2ZV9oc2NiID0gYWljX2luYihwLCBTQ0JQVFIpOworICAgICAgICAgICAgICBwcmV2X2hzY2IgPSBuZXh0X2hzY2IgPSBzY2JfaW5kZXggPSBTQ0JfTElTVF9OVUxMOworICAgICAgICAgICAgICBuZXh0X2hzY2IgPSBhaWNfaW5iKHAsIFdBSVRJTkdfU0NCSCk7CisgICAgICAgICAgICAgIHdoaWxlIChuZXh0X2hzY2IgIT0gU0NCX0xJU1RfTlVMTCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFpY19vdXRiKHAsIG5leHRfaHNjYiwgU0NCUFRSKTsKKyAgICAgICAgICAgICAgICBzY2JfaW5kZXggPSBhaWNfaW5iKHAsIFNDQl9UQUcpOworICAgICAgICAgICAgICAgIGlmIChzY2JfaW5kZXggPCBwLT5zY2JfZGF0YS0+bnVtc2NicykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBuZXh0X3NjYnAgPSBwLT5zY2JfZGF0YS0+c2NiX2FycmF5W3NjYl9pbmRleF07CisgICAgICAgICAgICAgICAgICBpZiAoYWljN3h4eF9tYXRjaF9zY2IocCwgbmV4dF9zY2JwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwKKyAgICAgICAgICAgICAgICAgICAgICBTQ0JfTElTVF9OVUxMKSApCisgICAgICAgICAgICAgICAgICB7CisJCSAgICBuZXh0X3NjYnAtPmZsYWdzID0gU0NCX1FVRVVFRF9GT1JfRE9ORSB8IFNDQl9RVUVVRV9GVUxMOworICAgICAgICAgICAgICAgICAgICBuZXh0X2hzY2IgPSBhaWNfaW5iKHAsIFNDQl9ORVhUKTsKKyAgICAgICAgICAgICAgICAgICAgYWljX291dGIocCwgMCwgU0NCX0NPTlRST0wpOworICAgICAgICAgICAgICAgICAgICBhaWNfb3V0YihwLCBTQ0JfTElTVF9OVUxMLCBTQ0JfVEFHKTsKKyAgICAgICAgICAgICAgICAgICAgYWljN3h4eF9hZGRfY3Vyc2NiX3RvX2ZyZWVfbGlzdChwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZfaHNjYiA9PSBTQ0JfTElTVF9OVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgLyogV2Ugd2VyZSBmaXJzdCBvbiB0aGUgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgKiBzbyB3ZSBraWxsIHRoZSBzZWxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgKiBoYXJkd2FyZS4gIExldCB0aGUgc2VxdWVuY2VyCisgICAgICAgICAgICAgICAgICAgICAgICogcmUtaW5pdCB0aGUgaGFyZHdhcmUgaXRzZWxmCisgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQ1NJU0VRKSAmIH5FTlNFTE8sIFNDU0lTRVEpOworICAgICAgICAgICAgICAgICAgICAgIGFpY19vdXRiKHAsIENMUlNFTFRJTUVPLCBDTFJTSU5UMSk7CisgICAgICAgICAgICAgICAgICAgICAgYWljX291dGIocCwgbmV4dF9oc2NiLCBXQUlUSU5HX1NDQkgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGFpY19vdXRiKHAsIHByZXZfaHNjYiwgU0NCUFRSKTsKKyAgICAgICAgICAgICAgICAgICAgICBhaWNfb3V0YihwLCBuZXh0X2hzY2IsIFNDQl9ORVhUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmV2X2hzY2IgPSBuZXh0X2hzY2I7CisgICAgICAgICAgICAgICAgICAgIG5leHRfaHNjYiA9IGFpY19pbmIocCwgU0NCX05FWFQpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLyogc2NiX2luZGV4ID49IHAtPnNjYl9kYXRhLT5udW1zY2JzICovCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYWljX291dGIocCwgYWN0aXZlX2hzY2IsIFNDQlBUUik7CisJICAgICAgYWljN3h4eF9ydW5fZG9uZV9xdWV1ZShwLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAKKyNpZmRlZiBBSUM3WFhYX1ZFUkJPU0VfREVCVUdHSU5HCisgICAgICAgICAgICAgIGlmKCAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9NSU5PUl9FUlJPUikgfHwKKyAgICAgICAgICAgICAgICAgIChhaWM3eHh4X3ZlcmJvc2UgPiAweGZmZmYpICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChxdWV1ZV9mbGFnKQorICAgICAgICAgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiUXVldWUgZnVsbCByZWNlaXZlZDsgcXVldWUgZGVwdGggJWQsICIKKyAgICAgICAgICAgICAgICAgICAgImFjdGl2ZSAlZFxuIiwgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpLAorICAgICAgICAgICAgICAgICAgICBhaWNfZGV2LT5tYXhfcV9kZXB0aCwgYWljX2Rldi0+YWN0aXZlX2NtZHMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlRhcmdldCBidXN5XG4iLCBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYikpOworICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgaWYgKHF1ZXVlX2ZsYWcpCisgICAgICAgICAgICAgIHsKKwkJaW50IGRpZmY7CisJCXJlc3VsdCA9IHNjc2lfdHJhY2tfcXVldWVfZnVsbChjbWQtPmRldmljZSwKKwkJCSAgICAgICAJYWljX2Rldi0+YWN0aXZlX2NtZHMpOworCQlpZiAoIHJlc3VsdCA8IDAgKQorCQl7CisgICAgICAgICAgICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9ORUdPVElBVElPTjIpCisgICAgICAgICAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlRhZ2dlZCBDb21tYW5kIFF1ZXVlaW5nIGRpc2FibGVkLlxuIiwKKwkJCXAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisJCSAgZGlmZiA9IGFpY19kZXYtPm1heF9xX2RlcHRoIC0gcC0+aG9zdC0+Y21kX3Blcl9sdW47CisJCSAgYWljX2Rldi0+dGVtcF9xX2RlcHRoID0gMTsKKwkJICBhaWNfZGV2LT5tYXhfcV9kZXB0aCA9IDE7CisJCX0KKwkJZWxzZSBpZiAoIHJlc3VsdCA+IDAgKQorCQl7CisgICAgICAgICAgICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9ORUdPVElBVElPTjIpCisgICAgICAgICAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlF1ZXVlIGRlcHRoIHJlZHVjZWQgdG8gJWRcbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICAgICAgICAgICAgQ1RMX09GX1NDQihzY2IpLCByZXN1bHQpOworCQkgIGRpZmYgPSBhaWNfZGV2LT5tYXhfcV9kZXB0aCAtIHJlc3VsdDsKKwkJICBhaWNfZGV2LT5tYXhfcV9kZXB0aCA9IHJlc3VsdDsKKwkJICAvKiB0ZW1wX3FfZGVwdGggY291bGQgaGF2ZSBiZWVuIGRyb3BwZWQgdG8gMSBmb3IgYW4gdW50YWdnZWQKKwkJICAgKiBjb21tYW5kIHRoYXQgbWlnaHQgYmUgY29taW5nIHVwICovCisJCSAgaWYoYWljX2Rldi0+dGVtcF9xX2RlcHRoID4gcmVzdWx0KQorCQkgICAgYWljX2Rldi0+dGVtcF9xX2RlcHRoID0gcmVzdWx0OworCQl9CisJCS8qIFdlIHNob3VsZCBmcmVlIHVwIHRoZSBubyB1bnVzZWQgU0NCIGVudHJpZXMuICBCdXQsIHRoYXQncworCQkgKiBhIGRpZmZpY3VsdCB0aGluZyB0byBkbyBiZWNhdXNlIHdlIHVzZSBhIGRpcmVjdCBpbmRleGVkCisJCSAqIGFycmF5LCBzbyB3ZSBjYW4ndCBqdXN0IHRha2UgYW55IGVudHJpZXMgYW5kIGZyZWUgdGhlbSwKKwkJICogd2UgKmhhdmUqIHRvIGZyZWUgdGhlIG9uZXMgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXksIGFuZAorCQkgKiB0aGV5IHZlcnkgd2VsbCBjb3VsZCBiZSBpbiB1c2UgcmlnaHQgbm93LCB3aGljaCBtZWFucworCQkgKiBpbiBvcmRlciB0byBkbyB0aGlzIHJpZ2h0LCB3ZSBoYXZlIHRvIGFkZCBhIGRlbGF5ZWQKKwkJICogZnJlZWluZyBtZWNoYW5pc20gdGllZCBpbnRvIHRoZSBzY2JfZnJlZSgpIGNvZGUgYXJlYS4KKwkJICogV2UnbGwgYWRkIHRoYXQgbGF0ZXIuCisJCSAqLworCSAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1NFUUlOVCkKKyAgICAgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJVbmV4cGVjdGVkIHRhcmdldCBzdGF0dXMgMHgleC5cbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICAgICAgICAgICBDVExfT0ZfU0NCKHNjYiksIHNjYi0+aHNjYi0+dGFyZ2V0X3N0YXR1cyk7CisgICAgICAgICAgICAgIGlmICghYWljN3h4eF9lcnJvcihjbWQpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWljN3h4eF9lcnJvcihjbWQpID0gRElEX1JFVFJZX0NPTU1BTkQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSAgLyogZW5kIHN3aXRjaCAqLworICAgICAgICB9ICAvKiBlbmQgZWxzZSBvZiAqLworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFXQUlUSU5HX01TRzoKKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBzY2JfaW5kZXgsIG1zZ19vdXQ7CisKKyAgICAgICAgc2NiX2luZGV4ID0gYWljX2luYihwLCBTQ0JfVEFHKTsKKyAgICAgICAgbXNnX291dCA9IGFpY19pbmIocCwgTVNHX09VVCk7CisgICAgICAgIHNjYiA9IHAtPnNjYl9kYXRhLT5zY2JfYXJyYXlbc2NiX2luZGV4XTsKKwlhaWNfZGV2ID0gQUlDX0RFVihzY2ItPmNtZCk7CisgICAgICAgIHAtPm1zZ19pbmRleCA9IHAtPm1zZ19sZW4gPSAwOworICAgICAgICAvKgorICAgICAgICAgKiBUaGlzIFNDQiBoYWQgYSBNS19NRVNTQUdFIHNldCBpbiBpdHMgY29udHJvbCBieXRlIGluZm9ybWluZworICAgICAgICAgKiB0aGUgc2VxdWVuY2VyIHRoYXQgd2Ugd2FudGVkIHRvIHNlbmQgYSBzcGVjaWFsIG1lc3NhZ2UgdG8KKyAgICAgICAgICogdGhpcyB0YXJnZXQuCisgICAgICAgICAqLworCisgICAgICAgIGlmICggIShzY2ItPmZsYWdzICYgU0NCX0RFVklDRV9SRVNFVCkgJiYKKyAgICAgICAgICAgICAgKG1zZ19vdXQgPT0gTVNHX0lERU5USUZZRkxBRykgJiYKKyAgICAgICAgICAgICAgKHNjYi0+aHNjYi0+Y29udHJvbCAmIFRBR19FTkIpICkKKyAgICAgICAgeworICAgICAgICAgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gc2NiLT50YWdfYWN0aW9uOworICAgICAgICAgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gc2NiLT5oc2NiLT50YWc7CisgICAgICAgICAgcC0+bXNnX2xlbiArPSAyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfREVWSUNFX1JFU0VUKQorICAgICAgICB7CisgICAgICAgICAgcC0+bXNnX2J1ZltwLT5tc2dfaW5kZXgrK10gPSBNU0dfQlVTX0RFVl9SRVNFVDsKKyAgICAgICAgICBwLT5tc2dfbGVuKys7CisgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUkVTRVRfUFJPQ0VTUykKKyAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIkJ1cyBkZXZpY2UgcmVzZXQgbWFpbGVkLlxuIiwKKyAgICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzY2ItPmZsYWdzICYgU0NCX0FCT1JUKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHNjYi0+dGFnX2FjdGlvbikKKyAgICAgICAgICB7CisgICAgICAgICAgICBwLT5tc2dfYnVmW3AtPm1zZ19pbmRleCsrXSA9IE1TR19BQk9SVF9UQUc7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBwLT5tc2dfYnVmW3AtPm1zZ19pbmRleCsrXSA9IE1TR19BQk9SVDsKKyAgICAgICAgICB9CisgICAgICAgICAgcC0+bXNnX2xlbisrOworICAgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX0FCT1JUX1BST0NFU1MpCisgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJBYm9ydCBtZXNzYWdlIG1haWxlZC5cbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICAgIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc2NiLT5mbGFncyAmIFNDQl9NU0dPVVRfUFBSKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlNlbmRpbmcgUFBSICglZC8lZC8lZC8lZCkgbWVzc2FnZS5cbiIsCisgICAgICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpLAorICAgICAgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwucGVyaW9kLAorICAgICAgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwud2lkdGgsCisgICAgICAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5vcHRpb25zKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYWljN3h4eF9jb25zdHJ1Y3RfcHByKHAsIHNjYik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc2NiLT5mbGFncyAmIFNDQl9NU0dPVVRfV0RUUikKKyAgICAgICAgeworICAgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX05FR09USUFUSU9OMikKKyAgICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJTZW5kaW5nIFdEVFIgbWVzc2FnZS5cbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICAgICAgICAgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYWljN3h4eF9jb25zdHJ1Y3Rfd2R0cihwLCBhaWNfZGV2LT5nb2FsLndpZHRoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzY2ItPmZsYWdzICYgU0NCX01TR09VVF9TRFRSKQorICAgICAgICB7CisgICAgICAgICAgdW5zaWduZWQgaW50IG1heF9zeW5jLCBwZXJpb2Q7CisgICAgICAgICAgdW5zaWduZWQgY2hhciBvcHRpb25zID0gMDsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIE5vdyB0aGF0IHRoZSBkZXZpY2UgaXMgc2VsZWN0ZWQsIHVzZSB0aGUgYml0cyBpbiBTQkxLQ1RMIGFuZAorICAgICAgICAgICAqIFNTVEFUMiB0byBkZXRlcm1pbmUgdGhlIG1heCBzeW5jIHJhdGUgZm9yIHRoaXMgZGV2aWNlLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCAoYWljX2luYihwLCBTQkxLQ1RMKSAmIEVOQUI0MCkgJiYKKyAgICAgICAgICAgICAgICAhKGFpY19pbmIocCwgU1NUQVQyKSAmIEVYUF9BQ1RJVkUpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbWF4X3N5bmMgPSBBSENfU1lOQ1JBVEVfVUxUUkEyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtYXhfc3luYyA9IEFIQ19TWU5DUkFURV9VTFRSQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEpCisgICAgICAgICAgeworICAgICAgICAgICAgbWF4X3N5bmMgPSBBSENfU1lOQ1JBVEVfVUxUUkE7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBtYXhfc3luYyA9IEFIQ19TWU5DUkFURV9GQVNUOworICAgICAgICAgIH0KKyAgICAgICAgICBwZXJpb2QgPSBhaWNfZGV2LT5nb2FsLnBlcmlvZDsKKyAgICAgICAgICBhaWM3eHh4X2ZpbmRfc3luY3JhdGUocCwgJnBlcmlvZCwgbWF4X3N5bmMsICZvcHRpb25zKTsKKyAgICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9ORUdPVElBVElPTjIpCisgICAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiU2VuZGluZyBTRFRSICVkLyVkIG1lc3NhZ2UuXG4iLCBwLT5ob3N0X25vLAorICAgICAgICAgICAgICAgICAgIENUTF9PRl9TQ0Ioc2NiKSwgcGVyaW9kLAorICAgICAgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0KTsKKyAgICAgICAgICB9CisgICAgICAgICAgYWljN3h4eF9jb25zdHJ1Y3Rfc2R0cihwLCBwZXJpb2QsIGFpY19kZXYtPmdvYWwub2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgcGFuaWMoImFpYzd4eHg6IEFXQUlUSU5HX01TRyBmb3IgYW4gU0NCIHRoYXQgZG9lcyAiCisgICAgICAgICAgICAgICAgIm5vdCBoYXZlIGEgd2FpdGluZyBtZXNzYWdlLlxuIik7CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgICogV2UndmUgc2V0IGV2ZXJ5dGhpbmcgdXAgdG8gc2VuZCBvdXIgbWVzc2FnZSwgbm93IHRvIGFjdHVhbGx5IGRvCisgICAgICAgICAqIHNvIHdlIG5lZWQgdG8gZW5hYmxlIHJlcWluaXQgaW50ZXJydXB0cyBhbmQgbGV0IHRoZSBpbnRlcnJ1cHQKKyAgICAgICAgICogaGFuZGxlciBkbyB0aGUgcmVzdC4gIFdlIGRvbid0IHdhbnQgdG8gdW5wYXVzZSB0aGUgc2VxdWVuY2VyIHlldAorICAgICAgICAgKiB0aG91Z2ggc28gd2UnbGwgcmV0dXJuIGVhcmx5LiAgV2UgYWxzbyBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICAgICAqIHdlIGNsZWFyIHRoZSBTRVFJTlQgKkJFRk9SRSogd2Ugc2V0IHRoZSBSRVFJTklUIGhhbmRsZXIgYWN0aXZlCisgICAgICAgICAqIG9yIGVsc2UgaXQncyBwb3NzaWJsZSBvbiBWTEIgY2FyZHMgdG8gbG9zZSB0aGUgZmlyc3QgUkVRSU5JVAorICAgICAgICAgKiBpbnRlcnJ1cHQuICBFZGdlIHRyaWdnZXJlZCBFSVNBIGNhcmRzIGNvdWxkIGFsc28gbG9zZSB0aGlzCisgICAgICAgICAqIGludGVycnVwdCwgYWx0aG91Z2ggUENJIGFuZCBsZXZlbCB0cmlnZ2VyZWQgY2FyZHMgc2hvdWxkIG5vdAorICAgICAgICAgKiBoYXZlIHRoaXMgcHJvYmxlbSBzaW5jZSB0aGV5IGNvbnRpbnVhbGx5IGludGVycnVwdCB0aGUga2VybmVsCisgICAgICAgICAqIHVudGlsIHdlIHRha2UgY2FyZSBvZiB0aGUgc2l0dWF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgc2NiLT5mbGFncyB8PSBTQ0JfTVNHT1VUX1NFTlQ7CisgICAgICAgIHAtPm1zZ19pbmRleCA9IDA7CisgICAgICAgIHAtPm1zZ190eXBlID0gTVNHX1RZUEVfSU5JVElBVE9SX01TR09VVDsKKyAgICAgICAgcC0+ZmxhZ3MgfD0gQUhDX0hBTkRMSU5HX1JFUUlOSVRTOworICAgICAgICBhaWNfb3V0YihwLCBhaWNfaW5iKHAsIFNJTU9ERTEpIHwgRU5SRVFJTklULCBTSU1PREUxKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERBVEFfT1ZFUlJVTjoKKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBzY2JfaW5kZXggPSBhaWNfaW5iKHAsIFNDQl9UQUcpOworICAgICAgICB1bnNpZ25lZCBjaGFyIGxhc3RwaGFzZSA9IGFpY19pbmIocCwgTEFTVFBIQVNFKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICAgICAgc2NiID0gKHAtPnNjYl9kYXRhLT5zY2JfYXJyYXlbc2NiX2luZGV4XSk7CisgICAgICAgIC8qCisgICAgICAgICAqIFhYWCAtIFdoYXQgZG8gd2UgcmVhbGx5IHdhbnQgdG8gZG8gb24gYW4gb3ZlcnJ1bj8gIFRoZQorICAgICAgICAgKiAgICAgICBtaWQtbGV2ZWwgU0NTSSBjb2RlIHNob3VsZCBoYW5kbGUgdGhpcywgYnV0IGZvciBub3csCisgICAgICAgICAqICAgICAgIHdlJ2xsIGp1c3QgaW5kaWNhdGUgdGhhdCB0aGUgY29tbWFuZCBzaG91bGQgcmV0cmllZC4KKyAgICAgICAgICogICAgSWYgd2UgcmV0cmlldmVkIHNlbnNlIGluZm8gb24gdGhpcyB0YXJnZXQsIHRoZW4gdGhlIAorICAgICAgICAgKiAgICBiYXNlIFNFTlNFIGluZm8gc2hvdWxkIGhhdmUgYmVlbiBzYXZlZCBwcmlvciB0byB0aGUKKyAgICAgICAgICogICAgb3ZlcnJ1biBlcnJvci4gIEluIHRoYXQgY2FzZSwgd2UgcmV0dXJuIERJRF9PSyBhbmQgbGV0CisgICAgICAgICAqICAgIHRoZSBtaWQgbGV2ZWwgY29kZSBwaWNrIHVwIG9uIHRoZSBzZW5zZSBpbmZvLiAgT3RoZXJ3aXNlCisgICAgICAgICAqICAgIHdlIHJldHVybiBESURfRVJST1Igc28gdGhlIGNvbW1hbmQgd2lsbCBnZXQgcmV0cmllZC4KKyAgICAgICAgICovCisgICAgICAgIGlmICggIShzY2ItPmZsYWdzICYgU0NCX1NFTlNFKSApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGsoV0FSTl9MRUFEICJEYXRhIG92ZXJydW4gZGV0ZWN0ZWQgaW4gJXMgcGhhc2UsIHRhZyAlZDtcbiIsCisgICAgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYiksIAorICAgICAgICAgICAgKGxhc3RwaGFzZSA9PSBQX0RBVEFJTikgPyAiRGF0YS1JbiIgOiAiRGF0YS1PdXQiLCBzY2ItPmhzY2ItPnRhZyk7CisgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiICAlcyBzZWVuIERhdGEgUGhhc2UuIExlbmd0aD0lZCwgTnVtU0dzPSVkLlxuIiwKKyAgICAgICAgICAgIChhaWNfaW5iKHAsIFNFUV9GTEFHUykgJiBEUEhBU0UpID8gIkhhdmUiIDogIkhhdmVuJ3QiLAorICAgICAgICAgICAgc2NiLT5zZ19sZW5ndGgsIHNjYi0+c2dfY291bnQpOworICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiAgUmF3IFNDU0kgQ29tbWFuZDogMHgiKTsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2NiLT5oc2NiLT5TQ1NJX2NtZF9sZW5ndGg7IGkrKykKKyAgICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIiUwMnggIiwgc2NiLT5jbWQtPmNtbmRbaV0pOworICAgICAgICAgIH0KKyAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgICAgaWYoYWljN3h4eF92ZXJib3NlID4gMHhmZmZmKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzY2ItPnNnX2NvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiAgICAgc2dbJWRdIC0gQWRkciAweCV4IDogTGVuZ3RoICVkXG4iLAorICAgICAgICAgICAgICAgICBpLCAKKyAgICAgICAgICAgICAgICAgbGUzMl90b19jcHUoc2NiLT5zZ19saXN0W2ldLmFkZHJlc3MpLAorICAgICAgICAgICAgICAgICBsZTMyX3RvX2NwdShzY2ItPnNnX2xpc3RbaV0ubGVuZ3RoKSApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBhaWM3eHh4X2Vycm9yKHNjYi0+Y21kKSA9IERJRF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiRGF0YSBPdmVycnVuIGR1cmluZyBTRU5EX1NFTlNFIG9wZXJhdGlvbi5cbiIsCisgICAgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYikpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdJREVfUkVTSURVRToKKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciByZXNpZF9zZ2NudCwgaW5kZXg7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgc2NiX2luZGV4ID0gYWljX2luYihwLCBTQ0JfVEFHKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGN1cl9hZGRyLCByZXNpZF9kY250OworICAgICAgICB1bnNpZ25lZCBpbnQgbmF0aXZlX2FkZHIsIG5hdGl2ZV9sZW5ndGgsIHNnX2FkZHI7CisgICAgICAgIGludCBpOworCisgICAgICAgIGlmKHNjYl9pbmRleCA+IHAtPnNjYl9kYXRhLT5udW1zY2JzKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRrKFdBUk5fTEVBRCAiaW52YWxpZCBzY2JfaW5kZXggZHVyaW5nIFdJREVfUkVTSURVRS5cbiIsCisgICAgICAgICAgICBwLT5ob3N0X25vLCAtMSwgLTEsIC0xKTsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIFhYWDogQWRkIGVycm9yIGhhbmRsaW5nIGhlcmUKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzY2IgPSBwLT5zY2JfZGF0YS0+c2NiX2FycmF5W3NjYl9pbmRleF07CisgICAgICAgIGlmKCEoc2NiLT5mbGFncyAmIFNDQl9BQ1RJVkUpIHx8IChzY2ItPmNtZCA9PSBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ayhXQVJOX0xFQUQgImludmFsaWQgc2NiIGR1cmluZyBXSURFX1JFU0lEVUUgZmxhZ3M6MHgleCAiCisgICAgICAgICAgICAgICAgICJzY2ItPmNtZDoweCVseFxuIiwgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpLAorICAgICAgICAgICAgICAgICBzY2ItPmZsYWdzLCAodW5zaWduZWQgbG9uZylzY2ItPmNtZCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9NSU5PUl9FUlJPUikKKyAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJHb3QgV0lERV9SRVNJRFVFIG1lc3NhZ2UsIHBhdGNoaW5nIHVwIGRhdGEgIgorICAgICAgICAgICAgICAgICAicG9pbnRlci5cbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2UgaGF2ZSBhIHZhbGlkIHNjYiB0byB1c2Ugb24gdGhpcyBXSURFX1JFU0lEVUUgbWVzc2FnZSwgc28KKyAgICAgICAgICogd2UgbmVlZCB0byB3YWxrIHRoZSBzZyBsaXN0IGxvb2tpbmcgZm9yIHRoaXMgcGFydGljdWxhciBzZworICAgICAgICAgKiBzZWdtZW50LCB0aGVuIHNlZSBpZiB3ZSBoYXBwZW4gdG8gYmUgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mCisgICAgICAgICAqIHRoZSBzZWdtZW50LiAgSWYgd2UgYXJlLCB0aGVuIHdlIGhhdmUgdG8gYmFjayB0aGluZ3MgdXAgdG8KKyAgICAgICAgICogdGhlIHByZXZpb3VzIHNlZ21lbnQuICBJZiBub3QsIHRoZW4gd2Ugc2ltcGx5IG5lZWQgdG8gcmVtb3ZlCisgICAgICAgICAqIG9uZSBieXRlIGZyb20gdGhpcyBzZWdtZW50cyBhZGRyZXNzIGFuZCBhZGQgb25lIHRvIHRoZSBieXRlCisgICAgICAgICAqIGNvdW50LgorICAgICAgICAgKi8KKyAgICAgICAgY3VyX2FkZHIgPSBhaWNfaW5iKHAsIFNIQUREUikgfCAoYWljX2luYihwLCBTSEFERFIgKyAxKSA8PCA4KSB8CisgICAgICAgICAgKGFpY19pbmIocCwgU0hBRERSICsgMikgPDwgMTYpIHwgKGFpY19pbmIocCwgU0hBRERSICsgMykgPDwgMjQpOworICAgICAgICBzZ19hZGRyID0gYWljX2luYihwLCBTR19DT1VOVCArIDEpIHwgKGFpY19pbmIocCwgU0dfQ09VTlQgKyAyKSA8PCA4KSB8CisgICAgICAgICAgKGFpY19pbmIocCwgU0dfQ09VTlQgKyAzKSA8PCAxNikgfCAoYWljX2luYihwLCBTR19DT1VOVCArIDQpIDw8IDI0KTsKKyAgICAgICAgcmVzaWRfc2djbnQgPSBhaWNfaW5iKHAsIFNDQl9SRVNJRF9TR0NOVCk7CisgICAgICAgIHJlc2lkX2RjbnQgPSBhaWNfaW5iKHAsIFNDQl9SRVNJRF9EQ05UKSB8CisgICAgICAgICAgKGFpY19pbmIocCwgU0NCX1JFU0lEX0RDTlQgKyAxKSA8PCA4KSB8CisgICAgICAgICAgKGFpY19pbmIocCwgU0NCX1JFU0lEX0RDTlQgKyAyKSA8PCAxNik7CisgICAgICAgIGluZGV4ID0gc2NiLT5zZ19jb3VudCAtICgocmVzaWRfc2djbnQpID8gcmVzaWRfc2djbnQgOiAxKTsKKyAgICAgICAgbmF0aXZlX2FkZHIgPSBsZTMyX3RvX2NwdShzY2ItPnNnX2xpc3RbaW5kZXhdLmFkZHJlc3MpOworICAgICAgICBuYXRpdmVfbGVuZ3RoID0gbGUzMl90b19jcHUoc2NiLT5zZ19saXN0W2luZGV4XS5sZW5ndGgpOworICAgICAgICAvKgorICAgICAgICAgKiBJZiByZXNpZF9kY250ID09IG5hdGl2ZV9sZW5ndGgsIHRoZW4gd2UganVzdCBsb2FkZWQgdGhpcyBTRworICAgICAgICAgKiBzZWdtZW50IGFuZCB3ZSBuZWVkIHRvIGJhY2sgaXQgdXAgb25lLi4uCisgICAgICAgICAqLworICAgICAgICBpZihyZXNpZF9kY250ID09IG5hdGl2ZV9sZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICBpZihpbmRleCA9PSAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBPb3BzLCB0aGlzIGlzbid0IHJpZ2h0LCB3ZSBjYW4ndCBiYWNrIHVwIHRvIGJlZm9yZSB0aGUKKyAgICAgICAgICAgICAqIGJlZ2lubmluZy4gIFRoaXMgbXVzdCBiZSBhIGJvZ3VzIG1lc3NhZ2UsIGlnbm9yZSBpdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHJlc2lkX2RjbnQgPSAxOworICAgICAgICAgIHJlc2lkX3NnY250ICs9IDE7CisgICAgICAgICAgbmF0aXZlX2FkZHIgPSBsZTMyX3RvX2NwdShzY2ItPnNnX2xpc3RbaW5kZXggLSAxXS5hZGRyZXNzKTsKKyAgICAgICAgICBuYXRpdmVfbGVuZ3RoID0gbGUzMl90b19jcHUoc2NiLT5zZ19saXN0W2luZGV4IC0gMV0ubGVuZ3RoKTsKKyAgICAgICAgICBjdXJfYWRkciA9IG5hdGl2ZV9hZGRyICsgKG5hdGl2ZV9sZW5ndGggLSAxKTsKKyAgICAgICAgICBzZ19hZGRyIC09IHNpemVvZihzdHJ1Y3QgaHdfc2NhdHRlcmxpc3QpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qCisgICAgICAgICAgICogcmVzaWRfZGNudCAhPSBuYXRpdmVfbGVuZ3RoLCBzbyB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIFNHCisgICAgICAgICAgICogZWxlbWVudC4gIEJhY2sgaXQgdXAgb25lIGJ5dGUgYW5kIGxlYXZlIHRoZSByZXN0IGFsb25lLgorICAgICAgICAgICAqLworICAgICAgICAgIHJlc2lkX2RjbnQgKz0gMTsKKyAgICAgICAgICBjdXJfYWRkciAtPSAxOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKgorICAgICAgICAgKiBPdXRwdXQgdGhlIG5ldyBhZGRyZXNzZXMgYW5kIGNvdW50cyB0byB0aGUgcmlnaHQgcGxhY2VzIG9uIHRoZQorICAgICAgICAgKiBjYXJkLgorICAgICAgICAgKi8KKyAgICAgICAgYWljX291dGIocCwgcmVzaWRfc2djbnQsIFNHX0NPVU5UKTsKKyAgICAgICAgYWljX291dGIocCwgcmVzaWRfc2djbnQsIFNDQl9SRVNJRF9TR0NOVCk7CisgICAgICAgIGFpY19vdXRiKHAsIHNnX2FkZHIgJiAweGZmLCBTR19DT1VOVCArIDEpOworICAgICAgICBhaWNfb3V0YihwLCAoc2dfYWRkciA+PiA4KSAmIDB4ZmYsIFNHX0NPVU5UICsgMik7CisgICAgICAgIGFpY19vdXRiKHAsIChzZ19hZGRyID4+IDE2KSAmIDB4ZmYsIFNHX0NPVU5UICsgMyk7CisgICAgICAgIGFpY19vdXRiKHAsIChzZ19hZGRyID4+IDI0KSAmIDB4ZmYsIFNHX0NPVU5UICsgNCk7CisgICAgICAgIGFpY19vdXRiKHAsIHJlc2lkX2RjbnQgJiAweGZmLCBTQ0JfUkVTSURfRENOVCk7CisgICAgICAgIGFpY19vdXRiKHAsIChyZXNpZF9kY250ID4+IDgpICYgMHhmZiwgU0NCX1JFU0lEX0RDTlQgKyAxKTsKKyAgICAgICAgYWljX291dGIocCwgKHJlc2lkX2RjbnQgPj4gMTYpICYgMHhmZiwgU0NCX1JFU0lEX0RDTlQgKyAyKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgc2VxdWVuY2VyIGFjdHVhbGx5IHdhbnRzIHRvIGZpbmQgdGhlIG5ldyBhZGRyZXNzCisgICAgICAgICAqIGluIHRoZSBTSEFERFIgcmVnaXN0ZXIgc2V0LiAgT24gdGhlIFVsdHJhMiBhbmQgbGF0ZXIgY29udHJvbGxlcnMKKyAgICAgICAgICogdGhpcyByZWdpc3RlciBzZXQgaXMgcmVhZG9ubHkuICBJbiBvcmRlciB0byBnZXQgdGhlIHJpZ2h0IG51bWJlcgorICAgICAgICAgKiBpbnRvIHRoZSByZWdpc3RlciwgeW91IGFjdHVhbGx5IGhhdmUgdG8gZW50ZXIgaXQgaW4gSEFERFIgYW5kIHRoZW4KKyAgICAgICAgICogdXNlIHRoZSBQUkVMT0FERU4gYml0IG9mIERGQ05UUkwgdG8gZHJvcCBpdCB0aHJvdWdoIGZyb20gdGhlCisgICAgICAgICAqIEhBRERSIHJlZ2lzdGVyIHRvIHRoZSBTSEFERFIgcmVnaXN0ZXIuICBPbiBub24tVWx0cmEyIGNvbnRyb2xsZXJzLAorICAgICAgICAgKiB3ZSBzaW1wbHkgd3JpdGUgaXQgZGlyZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgICAgICB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBXZSBtaWdodCBhcyB3ZWxsIGJlIGFjY3VyYXRlIGFuZCBkcm9wIGJvdGggdGhlIHJlc2lkX2RjbnQgYW5kCisgICAgICAgICAgICogY3VyX2FkZHIgaW50byBIQ05UIGFuZCBIQUREUiBhbmQgaGF2ZSBib3RoIG9mIHRoZW0gZHJvcAorICAgICAgICAgICAqIHRocm91Z2ggdG8gdGhlIHNoYWRvdyBsYXllciB0b2dldGhlci4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBhaWNfb3V0YihwLCByZXNpZF9kY250ICYgMHhmZiwgSENOVCk7CisgICAgICAgICAgYWljX291dGIocCwgKHJlc2lkX2RjbnQgPj4gOCkgJiAweGZmLCBIQ05UICsgMSk7CisgICAgICAgICAgYWljX291dGIocCwgKHJlc2lkX2RjbnQgPj4gMTYpICYgMHhmZiwgSENOVCArIDIpOworICAgICAgICAgIGFpY19vdXRiKHAsIGN1cl9hZGRyICYgMHhmZiwgSEFERFIpOworICAgICAgICAgIGFpY19vdXRiKHAsIChjdXJfYWRkciA+PiA4KSAmIDB4ZmYsIEhBRERSICsgMSk7CisgICAgICAgICAgYWljX291dGIocCwgKGN1cl9hZGRyID4+IDE2KSAmIDB4ZmYsIEhBRERSICsgMik7CisgICAgICAgICAgYWljX291dGIocCwgKGN1cl9hZGRyID4+IDI0KSAmIDB4ZmYsIEhBRERSICsgMyk7CisgICAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBETUFQQVJBTVMpIHwgUFJFTE9BREVOLCBERkNOVFJMKTsKKyAgICAgICAgICB1ZGVsYXkoMSk7CisgICAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBETUFQQVJBTVMpICYgfihTQ1NJRU58SERNQUVOKSwgREZDTlRSTCk7CisgICAgICAgICAgaT0wOworICAgICAgICAgIHdoaWxlKCgoYWljX2luYihwLCBERkNOVFJMKSAmIChTQ1NJRU58SERNQUVOKSkgIT0gMCkgJiYgKGkrKyA8IDEwMDApKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHVkZWxheSgxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgYWljX291dGIocCwgY3VyX2FkZHIgJiAweGZmLCBTSEFERFIpOworICAgICAgICAgIGFpY19vdXRiKHAsIChjdXJfYWRkciA+PiA4KSAmIDB4ZmYsIFNIQUREUiArIDEpOworICAgICAgICAgIGFpY19vdXRiKHAsIChjdXJfYWRkciA+PiAxNikgJiAweGZmLCBTSEFERFIgKyAyKTsKKyAgICAgICAgICBhaWNfb3V0YihwLCAoY3VyX2FkZHIgPj4gMjQpICYgMHhmZiwgU0hBRERSICsgMyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTRVFfU0dfRklYVVA6CisgICAgeworICAgICAgdW5zaWduZWQgY2hhciBzY2JfaW5kZXgsIHRtcDsKKyAgICAgIGludCBzZ19hZGRyLCBzZ19sZW5ndGg7CisKKyAgICAgIHNjYl9pbmRleCA9IGFpY19pbmIocCwgU0NCX1RBRyk7CisKKyAgICAgIGlmKHNjYl9pbmRleCA+IHAtPnNjYl9kYXRhLT5udW1zY2JzKQorICAgICAgeworICAgICAgICBwcmludGsoV0FSTl9MRUFEICJpbnZhbGlkIHNjYl9pbmRleCBkdXJpbmcgU0VRX1NHX0ZJWFVQLlxuIiwKKyAgICAgICAgICBwLT5ob3N0X25vLCAtMSwgLTEsIC0xKTsKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiU0NTSVNJR0kgMHgleCwgU0VRQUREUiAweCV4LCBTU1RBVDAgMHgleCwgU1NUQVQxICIKKyAgICAgICAgICAgIjB4JXhcbiIsIHAtPmhvc3Rfbm8sIC0xLCAtMSwgLTEsCisgICAgICAgICAgIGFpY19pbmIocCwgU0NTSVNJR0kpLAorICAgICAgICAgICBhaWNfaW5iKHAsIFNFUUFERFIwKSB8IChhaWNfaW5iKHAsIFNFUUFERFIxKSA8PCA4KSwKKyAgICAgICAgICAgYWljX2luYihwLCBTU1RBVDApLCBhaWNfaW5iKHAsIFNTVEFUMSkpOworICAgICAgICBwcmludGsoSU5GT19MRUFEICJTR19DQUNIRVBUUiAweCV4LCBTU1RBVDIgMHgleCwgU1RDTlQgMHgleFxuIiwKKyAgICAgICAgICAgcC0+aG9zdF9ubywgLTEsIC0xLCAtMSwgYWljX2luYihwLCBTR19DQUNIRVBUUiksCisgICAgICAgICAgIGFpY19pbmIocCwgU1NUQVQyKSwgYWljX2luYihwLCBTVENOVCArIDIpIDw8IDE2IHwKKyAgICAgICAgICAgYWljX2luYihwLCBTVENOVCArIDEpIDw8IDggfCBhaWNfaW5iKHAsIFNUQ05UKSk7CisgICAgICAgIC8qCisgICAgICAgICAqIFhYWDogQWRkIGVycm9yIGhhbmRsaW5nIGhlcmUKKyAgICAgICAgICovCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgc2NiID0gcC0+c2NiX2RhdGEtPnNjYl9hcnJheVtzY2JfaW5kZXhdOworICAgICAgaWYoIShzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgfHwgKHNjYi0+Y21kID09IE5VTEwpKQorICAgICAgeworICAgICAgICBwcmludGsoV0FSTl9MRUFEICJpbnZhbGlkIHNjYiBkdXJpbmcgU0VRX1NHX0ZJWFVQIGZsYWdzOjB4JXggIgorICAgICAgICAgICAgICAgInNjYi0+Y21kOjB4JXBcbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSwKKyAgICAgICAgICAgICAgIHNjYi0+ZmxhZ3MsIHNjYi0+Y21kKTsKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiU0NTSVNJR0kgMHgleCwgU0VRQUREUiAweCV4LCBTU1RBVDAgMHgleCwgU1NUQVQxICIKKyAgICAgICAgICAgIjB4JXhcbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSwKKyAgICAgICAgICAgYWljX2luYihwLCBTQ1NJU0lHSSksCisgICAgICAgICAgIGFpY19pbmIocCwgU0VRQUREUjApIHwgKGFpY19pbmIocCwgU0VRQUREUjEpIDw8IDgpLAorICAgICAgICAgICBhaWNfaW5iKHAsIFNTVEFUMCksIGFpY19pbmIocCwgU1NUQVQxKSk7CisgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlNHX0NBQ0hFUFRSIDB4JXgsIFNTVEFUMiAweCV4LCBTVENOVCAweCV4XG4iLAorICAgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYiksIGFpY19pbmIocCwgU0dfQ0FDSEVQVFIpLAorICAgICAgICAgICBhaWNfaW5iKHAsIFNTVEFUMiksIGFpY19pbmIocCwgU1RDTlQgKyAyKSA8PCAxNiB8CisgICAgICAgICAgIGFpY19pbmIocCwgU1RDTlQgKyAxKSA8PCA4IHwgYWljX2luYihwLCBTVENOVCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTUlOT1JfRVJST1IpCisgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIkZpeGluZyB1cCBTRyBhZGRyZXNzIGZvciBzZXF1ZW5jZXIuXG4iLCBwLT5ob3N0X25vLAorICAgICAgICAgICAgICAgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgIC8qCisgICAgICAgKiBBZHZhbmNlIHRoZSBTRyBwb2ludGVyIHRvIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGxpc3QKKyAgICAgICAqLworICAgICAgdG1wID0gYWljX2luYihwLCBTR19ORVhUKTsKKyAgICAgIHRtcCArPSBTR19TSVpFT0Y7CisgICAgICBhaWNfb3V0YihwLCB0bXAsIFNHX05FWFQpOworICAgICAgaWYoIHRtcCA8IFNHX1NJWkVPRiApCisgICAgICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0dfTkVYVCArIDEpICsgMSwgU0dfTkVYVCArIDEpOworICAgICAgdG1wID0gYWljX2luYihwLCBTR19DT1VOVCkgLSAxOworICAgICAgYWljX291dGIocCwgdG1wLCBTR19DT1VOVCk7CisgICAgICBzZ19hZGRyID0gbGUzMl90b19jcHUoc2NiLT5zZ19saXN0W3NjYi0+c2dfY291bnQgLSB0bXBdLmFkZHJlc3MpOworICAgICAgc2dfbGVuZ3RoID0gbGUzMl90b19jcHUoc2NiLT5zZ19saXN0W3NjYi0+c2dfY291bnQgLSB0bXBdLmxlbmd0aCk7CisgICAgICAvKgorICAgICAgICogTm93IHN0dWZmIHRoZSBlbGVtZW50IHdlIGp1c3QgYWR2YW5jZWQgcGFzdCBkb3duIG9udG8gdGhlCisgICAgICAgKiBjYXJkIHNvIGl0IGNhbiBiZSBzdG9yZWQgaW4gdGhlIHJlc2lkdWFsIGFyZWEuCisgICAgICAgKi8KKyAgICAgIGFpY19vdXRiKHAsIHNnX2FkZHIgJiAweGZmLCBIQUREUik7CisgICAgICBhaWNfb3V0YihwLCAoc2dfYWRkciA+PiA4KSAmIDB4ZmYsIEhBRERSICsgMSk7CisgICAgICBhaWNfb3V0YihwLCAoc2dfYWRkciA+PiAxNikgJiAweGZmLCBIQUREUiArIDIpOworICAgICAgYWljX291dGIocCwgKHNnX2FkZHIgPj4gMjQpICYgMHhmZiwgSEFERFIgKyAzKTsKKyAgICAgIGFpY19vdXRiKHAsIHNnX2xlbmd0aCAmIDB4ZmYsIEhDTlQpOworICAgICAgYWljX291dGIocCwgKHNnX2xlbmd0aCA+PiA4KSAmIDB4ZmYsIEhDTlQgKyAxKTsKKyAgICAgIGFpY19vdXRiKHAsIChzZ19sZW5ndGggPj4gMTYpICYgMHhmZiwgSENOVCArIDIpOworICAgICAgYWljX291dGIocCwgKHRtcCA8PCAyKSB8ICgodG1wID09IDEpID8gTEFTVF9TRUcgOiAwKSwgU0dfQ0FDSEVQVFIpOworICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBETUFQQVJBTVMpLCBERkNOVFJMKTsKKyAgICAgIHdoaWxlKGFpY19pbmIocCwgU1NUQVQwKSAmIFNET05FKSB1ZGVsYXkoMSk7CisgICAgICB3aGlsZShhaWNfaW5iKHAsIERGQ05UUkwpICYgKEhETUFFTnxTQ1NJRU4pKSBhaWNfb3V0YihwLCAwLCBERkNOVFJMKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyNpZmRlZiBBSUM3WFhYX05PVF9ZRVQgCisgICAgY2FzZSBUUkFDRVBPSU5UMjoKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiVHJhY2Vwb2ludCAjMiByZWFjaGVkLlxuIiwgcC0+aG9zdF9ubywKKyAgICAgICAgICAgICAgIGNoYW5uZWwsIHRhcmdldCwgbHVuKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgLyogWFhYIEZpbGwgdGhlc2UgaW4gbGF0ZXIgKi8KKyAgICBjYXNlIE1TR19CVUZGRVJfQlVTWToKKyAgICAgIHByaW50aygiYWljN3h4eDogTWVzc2FnZSBidWZmZXIgYnVzeS5cbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNU0dJTl9QSEFTRU1JUzoKKyAgICAgIHByaW50aygiYWljN3h4eDogTWVzc2FnZS1pbiBwaGFzZW1pcy5cbiIpOworICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgIC8qIHVua25vd24gKi8KKyAgICAgIHByaW50ayhXQVJOX0xFQUQgIlVua25vd24gU0VRSU5ULCBJTlRTVEFUIDB4JXgsIFNDU0lTSUdJIDB4JXguXG4iLAorICAgICAgICAgICAgIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwgbHVuLCBpbnRzdGF0LAorICAgICAgICAgICAgIGFpY19pbmIocCwgU0NTSVNJR0kpKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyoKKyAgICogQ2xlYXIgdGhlIHNlcXVlbmNlciBpbnRlcnJ1cHQgYW5kIHVucGF1c2UgdGhlIHNlcXVlbmNlci4KKyAgICovCisgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIC8qIHVucGF1c2UgYWx3YXlzICovIFRSVUUpOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfcGFyc2VfbXNnCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFBhcnNlcyBpbmNvbWluZyBtZXNzYWdlcyBpbnRvIGFjdGlvbnMgb24gYmVoYWxmIG9mCisgKiAgIGFpYzd4eHhfaGFuZGxlX3JlcWluaXQKKyAqX0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorYWljN3h4eF9wYXJzZV9tc2coc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgc3RydWN0IGFpYzd4eHhfc2NiICpzY2IpCit7CisgIGludCByZWplY3QsIHJlcGx5LCBkb25lOworICB1bnNpZ25lZCBjaGFyIHRhcmdldF9zY3NpcmF0ZSwgdGluZGV4OworICB1bnNpZ25lZCBzaG9ydCB0YXJnZXRfbWFzazsKKyAgdW5zaWduZWQgY2hhciB0YXJnZXQsIGNoYW5uZWwsIGx1bjsKKyAgdW5zaWduZWQgY2hhciBidXNfd2lkdGgsIG5ld19idXNfd2lkdGg7CisgIHVuc2lnbmVkIGNoYXIgdHJhbnNfb3B0aW9ucywgbmV3X3RyYW5zX29wdGlvbnM7CisgIHVuc2lnbmVkIGludCBwZXJpb2QsIG5ld19wZXJpb2QsIG9mZnNldCwgbmV3X29mZnNldCwgbWF4c3luYzsKKyAgc3RydWN0IGFpYzd4eHhfc3luY3JhdGUgKnN5bmNyYXRlOworICBzdHJ1Y3QgYWljX2Rldl9kYXRhICphaWNfZGV2OworCisgIHRhcmdldCA9IHNjYi0+Y21kLT5kZXZpY2UtPmlkOworICBjaGFubmVsID0gc2NiLT5jbWQtPmRldmljZS0+Y2hhbm5lbDsKKyAgbHVuID0gc2NiLT5jbWQtPmRldmljZS0+bHVuOworICByZXBseSA9IHJlamVjdCA9IGRvbmUgPSBGQUxTRTsKKyAgdGluZGV4ID0gVEFSR0VUX0lOREVYKHNjYi0+Y21kKTsKKyAgYWljX2RldiA9IEFJQ19ERVYoc2NiLT5jbWQpOworICB0YXJnZXRfc2NzaXJhdGUgPSBhaWNfaW5iKHAsIFRBUkdfU0NTSVJBVEUgKyB0aW5kZXgpOworICB0YXJnZXRfbWFzayA9ICgweDAxIDw8IHRpbmRleCk7CisKKyAgLyoKKyAgICogUGFyc2UgYXMgbXVjaCBvZiB0aGUgbWVzc2FnZSBhcyBpcyBhdmFpbGFibGUsCisgICAqIHJlamVjdGluZyBpdCBpZiB3ZSBkb24ndCBzdXBwb3J0IGl0LiAgV2hlbgorICAgKiB0aGUgZW50aXJlIG1lc3NhZ2UgaXMgYXZhaWxhYmxlIGFuZCBoYXMgYmVlbgorICAgKiBoYW5kbGVkLCByZXR1cm4gVFJVRSBpbmRpY2F0aW5nIHRoYXQgd2UgaGF2ZQorICAgKiBwYXJzZWQgYW4gZW50aXJlIG1lc3NhZ2UuCisgICAqLworCisgIGlmIChwLT5tc2dfYnVmWzBdICE9IE1TR19FWFRFTkRFRCkKKyAgeworICAgIHJlamVjdCA9IFRSVUU7CisgIH0KKworICAvKgorICAgKiBFdmVuIGlmIHdlIGFyZSBhbiBVbHRyYTMgY2FyZCwgZG9uJ3QgYWxsb3cgVWx0cmEzIHN5bmMgcmF0ZXMgd2hlbgorICAgKiB1c2luZyB0aGUgU0RUUiBtZXNzYWdlcy4gIFdlIG5lZWQgdGhlIFBQUiBtZXNzYWdlcyB0byBlbmFibGUgdGhlCisgICAqIGhpZ2hlciBzcGVlZHMgdGhhdCBpbmNsdWRlIHRoaW5ncyBsaWtlIER1YWwgRWRnZSBjbG9ja2luZy4KKyAgICovCisgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgIHsKKyAgICBpZiAoIChhaWNfaW5iKHAsIFNCTEtDVEwpICYgRU5BQjQwKSAmJgorICAgICAgICAgIShhaWNfaW5iKHAsIFNTVEFUMikgJiBFWFBfQUNUSVZFKSApCisgICAgeworICAgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMykKKyAgICAgICAgbWF4c3luYyA9IEFIQ19TWU5DUkFURV9VTFRSQTM7CisgICAgICBlbHNlCisgICAgICAgIG1heHN5bmMgPSBBSENfU1lOQ1JBVEVfVUxUUkEyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgbWF4c3luYyA9IEFIQ19TWU5DUkFURV9VTFRSQTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEpCisgIHsKKyAgICBtYXhzeW5jID0gQUhDX1NZTkNSQVRFX1VMVFJBOworICB9CisgIGVsc2UKKyAgeworICAgIG1heHN5bmMgPSBBSENfU1lOQ1JBVEVfRkFTVDsKKyAgfQorCisgIC8qCisgICAqIEp1c3QgYWNjZXB0IHRoZSBsZW5ndGggYnl0ZSBvdXRyaWdodCBhbmQgcGVyZm9ybQorICAgKiBtb3JlIGNoZWNraW5nIG9uY2Ugd2Uga25vdyB0aGUgbWVzc2FnZSB0eXBlLgorICAgKi8KKworICBpZiAoICFyZWplY3QgJiYgKHAtPm1zZ19sZW4gPiAyKSApCisgIHsKKyAgICBzd2l0Y2gocC0+bXNnX2J1ZlsyXSkKKyAgICB7CisgICAgICBjYXNlIE1TR19FWFRfU0RUUjoKKyAgICAgIHsKKyAgICAgICAgCisgICAgICAgIGlmIChwLT5tc2dfYnVmWzFdICE9IE1TR19FWFRfU0RUUl9MRU4pCisgICAgICAgIHsKKyAgICAgICAgICByZWplY3QgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHAtPm1zZ19sZW4gPCAoTVNHX0VYVF9TRFRSX0xFTiArIDIpKQorICAgICAgICB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwZXJpb2QgPSBuZXdfcGVyaW9kID0gcC0+bXNnX2J1ZlszXTsKKyAgICAgICAgb2Zmc2V0ID0gbmV3X29mZnNldCA9IHAtPm1zZ19idWZbNF07CisgICAgICAgIHRyYW5zX29wdGlvbnMgPSBuZXdfdHJhbnNfb3B0aW9ucyA9IDA7CisgICAgICAgIGJ1c193aWR0aCA9IG5ld19idXNfd2lkdGggPSB0YXJnZXRfc2NzaXJhdGUgJiBXSURFWEZFUjsKKworICAgICAgICAvKgorICAgICAgICAgKiBJZiBvdXIgY3VycmVudCBtYXggc3luY3JhdGUgaXMgaW4gdGhlIFVsdHJhMyByYW5nZSwgYnVtcCBpdCBiYWNrCisgICAgICAgICAqIGRvd24gdG8gVWx0cmEyIHNpbmNlIHdlIGNhbid0IG5lZ290aWF0ZSBEVCB0cmFuc2ZlcnMgdXNpbmcgU0RUUgorICAgICAgICAgKi8KKyAgICAgICAgaWYobWF4c3luYyA9PSBBSENfU1lOQ1JBVEVfVUxUUkEzKQorICAgICAgICAgIG1heHN5bmMgPSBBSENfU1lOQ1JBVEVfVUxUUkEyOworCisgICAgICAgIC8qCisgICAgICAgICAqIFdlIG1pZ2h0IGhhdmUgYSBkZXZpY2UgdGhhdCBpcyBzdGFydGluZyBuZWdvdGlhdGlvbiB3aXRoIHVzCisgICAgICAgICAqIGJlZm9yZSB3ZSBjYW4gc3RhcnQgdXAgbmVnb3RpYXRpb24gd2l0aCBpdC4uLi5iZSBwcmVwYXJlZCB0bworICAgICAgICAgKiBoYXZlIGEgZGV2aWNlIGFzayBmb3IgYSBoaWdoZXIgc3BlZWQgdGhlbiB3ZSB3YW50IHRvIGdpdmUgaXQKKyAgICAgICAgICogaW4gdGhhdCBjYXNlCisgICAgICAgICAqLworICAgICAgICBpZiAoIChzY2ItPmZsYWdzICYgKFNDQl9NU0dPVVRfU0VOVHxTQ0JfTVNHT1VUX1NEVFIpKSAhPQorICAgICAgICAgICAgIChTQ0JfTVNHT1VUX1NFTlR8U0NCX01TR09VVF9TRFRSKSApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIShhaWNfZGV2LT5mbGFncyAmIERFVklDRV9EVFJfU0NBTk5FRCkpCisgICAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFdlIHNob3VsZG4ndCBnZXQgaGVyZSB1bmxlc3MgdGhpcyBpcyBhIG5hcnJvdyBkcml2ZSwgd2lkZQorICAgICAgICAgICAgICogZGV2aWNlcyBzaG91bGQgdHJpZ2dlciB0aGlzIHNhbWUgc2VjdGlvbiBvZiBjb2RlIGluIHRoZSBXRFRSCisgICAgICAgICAgICAgKiBoYW5kbGVyIGZpcnN0IGluc3RlYWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFpY19kZXYtPmdvYWwud2lkdGggPSBNU0dfRVhUX1dEVFJfQlVTXzhfQklUOworICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5vcHRpb25zID0gMDsKKyAgICAgICAgICAgIGlmKHAtPnVzZXJbdGluZGV4XS5vZmZzZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFpY19kZXYtPm5lZWRzZHRyX2NvcHkgPSAxOworICAgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLnBlcmlvZCA9IG1heF90KHVuc2lnbmVkIGNoYXIsIDEwLHAtPnVzZXJbdGluZGV4XS5wZXJpb2QpOworICAgICAgICAgICAgICBpZihwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLm9mZnNldCA9IE1BWF9PRkZTRVRfVUxUUkEyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0ID0gTUFYX09GRlNFVF84QklUOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFpY19kZXYtPm5lZWRzZHRyX2NvcHkgPSAwOworICAgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLnBlcmlvZCA9IDI1NTsKKyAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5vZmZzZXQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWljX2Rldi0+ZmxhZ3MgfD0gREVWSUNFX0RUUl9TQ0FOTkVEIHwgREVWSUNFX1BSSU5UX0RUUjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoYWljX2Rldi0+bmVlZHNkdHJfY29weSA9PSAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGlzIGlzIGEgcHJlZW1wdGl2ZSBtZXNzYWdlIGZyb20gdGhlIHRhcmdldCwgd2UndmUgYWxyZWFkeQorICAgICAgICAgICAgICogc2Nhbm5lZCB0aGlzIHRhcmdldCBhbmQgc2V0IG91ciBvcHRpb25zIGZvciBpdCwgYW5kIHdlCisgICAgICAgICAgICAgKiBkb24ndCBuZWVkIGEgU0RUUiB3aXRoIHRoaXMgdGFyZ2V0IChmb3Igd2hhdGV2ZXIgcmVhc29uKSwKKyAgICAgICAgICAgICAqIHNvIHJlamVjdCB0aGlzIGluY29taW5nIFNEVFIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmVqZWN0ID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIFRoZSBkZXZpY2UgaXMgc2VuZGluZyB0aGlzIG1lc3NhZ2UgZmlyc3QgYW5kIHdlIGhhdmUgdG8gcmVwbHkgKi8KKyAgICAgICAgICByZXBseSA9IFRSVUU7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlJlY2VpdmVkIHByZS1lbXB0aXZlIFNEVFIgbWVzc2FnZSBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAidGFyZ2V0LlxuIiwgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBWYWxpZGF0ZSB0aGUgdmFsdWVzIHRoZSBkZXZpY2UgcGFzc2VkIHRvIHVzIGFnYWluc3Qgb3VyIFNFRVBST00KKyAgICAgICAgICAgKiBzZXR0aW5ncy4gIFdlIGRvbid0IGhhdmUgdG8gZG8gdGhpcyBpZiB3ZSBhcmVuJ3QgcmVwbHlpbmcgc2luY2UKKyAgICAgICAgICAgKiB0aGUgZGV2aWNlIGlzbid0IGFsbG93ZWQgdG8gc2VuZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIHRoZSBvbmVzCisgICAgICAgICAgICogd2UgZmlyc3Qgc2VudCB0byBpdC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBuZXdfcGVyaW9kID0gbWF4X3QodW5zaWduZWQgaW50LCBwZXJpb2QsIGFpY19kZXYtPmdvYWwucGVyaW9kKTsKKyAgICAgICAgICBuZXdfb2Zmc2V0ID0gbWluX3QodW5zaWduZWQgaW50LCBvZmZzZXQsIGFpY19kZXYtPmdvYWwub2Zmc2V0KTsKKyAgICAgICAgfQorIAorICAgICAgICAvKgorICAgICAgICAgKiBVc2Ugb3VyIG5ld19wZXJpb2QsIG5ld19vZmZzZXQsIGJ1c193aWR0aCwgYW5kIGNhcmQgb3B0aW9ucworICAgICAgICAgKiB0byBkZXRlcm1pbmUgdGhlIGFjdHVhbCBzeW5jcmF0ZSBzZXR0aW5ncworICAgICAgICAgKi8KKyAgICAgICAgc3luY3JhdGUgPSBhaWM3eHh4X2ZpbmRfc3luY3JhdGUocCwgJm5ld19wZXJpb2QsIG1heHN5bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc19vcHRpb25zKTsKKyAgICAgICAgYWljN3h4eF92YWxpZGF0ZV9vZmZzZXQocCwgc3luY3JhdGUsICZuZXdfb2Zmc2V0LCBidXNfd2lkdGgpOworCisgICAgICAgIC8qCisgICAgICAgICAqIERpZCB3ZSBkcm9wIHRvIGFzeW5jPyAgSWYgc28sIHNlbmQgYSByZXBseSByZWdhcmRsZXNzIG9mIHdoZXRoZXIKKyAgICAgICAgICogb3Igbm90IHdlIGluaXRpYXRlZCB0aGlzIG5lZ290aWF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChuZXdfb2Zmc2V0ID09IDApICYmIChuZXdfb2Zmc2V0ICE9IG9mZnNldCkpCisgICAgICAgIHsKKyAgICAgICAgICBhaWNfZGV2LT5uZWVkc2R0cl9jb3B5ID0gMDsKKyAgICAgICAgICByZXBseSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICAqIERpZCB3ZSBzdGFydCB0aGlzLCBpZiBub3QsIG9yIGlmIHdlIHdlbnQgdG9vIGxvdyBhbmQgaGFkIHRvCisgICAgICAgICAqIGdvIGFzeW5jLCB0aGVuIHNlbmQgYW4gU0RUUiBiYWNrIHRvIHRoZSB0YXJnZXQKKyAgICAgICAgICovCisgICAgICAgIGlmKHJlcGx5KQorICAgICAgICB7CisgICAgICAgICAgLyogd2hlbiBzZW5kaW5nIGEgcmVwbHksIG1ha2Ugc3VyZSB0aGF0IHRoZSBnb2FsIHNldHRpbmdzIGFyZQorICAgICAgICAgICAqIHVwZGF0ZWQgYWxvbmcgd2l0aCBjdXJyZW50IGFuZCBhY3RpdmUgc2luY2UgdGhlIGNvZGUgdGhhdAorICAgICAgICAgICAqIHdpbGwgYWN0dWFsbHkgYnVpbGQgdGhlIG1lc3NhZ2UgZm9yIHRoZSBzZXF1ZW5jZXIgdXNlcyB0aGUKKyAgICAgICAgICAgKiBnb2FsIHNldHRpbmdzIGFzIGl0cyBndWlkZWxpbmVzLgorICAgICAgICAgICAqLworICAgICAgICAgIGFpYzd4eHhfc2V0X3N5bmNyYXRlKHAsIHN5bmNyYXRlLCB0YXJnZXQsIGNoYW5uZWwsIG5ld19wZXJpb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X29mZnNldCwgdHJhbnNfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSENfVFJBTlNfR09BTHxBSENfVFJBTlNfQUNUSVZFfEFIQ19UUkFOU19DVVIsCisJCQkgICAgICAgYWljX2Rldik7CisgICAgICAgICAgc2NiLT5mbGFncyAmPSB+U0NCX01TR09VVF9CSVRTOworICAgICAgICAgIHNjYi0+ZmxhZ3MgfD0gU0NCX01TR09VVF9TRFRSOworICAgICAgICAgIGFpY19vdXRiKHAsIEhPU1RfTVNHLCBNU0dfT1VUKTsKKyAgICAgICAgICBhaWNfb3V0YihwLCBhaWNfaW5iKHAsIFNDU0lTSUdPKSB8IEFUTk8sIFNDU0lTSUdPKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBhaWM3eHh4X3NldF9zeW5jcmF0ZShwLCBzeW5jcmF0ZSwgdGFyZ2V0LCBjaGFubmVsLCBuZXdfcGVyaW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19vZmZzZXQsIHRyYW5zX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfQ1VSLCBhaWNfZGV2KTsKKyAgICAgICAgICBhaWNfZGV2LT5uZWVkc2R0ciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZG9uZSA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBNU0dfRVhUX1dEVFI6CisgICAgICB7CisgICAgICAgICAgCisgICAgICAgIGlmIChwLT5tc2dfYnVmWzFdICE9IE1TR19FWFRfV0RUUl9MRU4pCisgICAgICAgIHsKKyAgICAgICAgICByZWplY3QgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHAtPm1zZ19sZW4gPCAoTVNHX0VYVF9XRFRSX0xFTiArIDIpKQorICAgICAgICB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBidXNfd2lkdGggPSBuZXdfYnVzX3dpZHRoID0gcC0+bXNnX2J1ZlszXTsKKworICAgICAgICBpZiAoIChzY2ItPmZsYWdzICYgKFNDQl9NU0dPVVRfU0VOVHxTQ0JfTVNHT1VUX1dEVFIpKSA9PQorICAgICAgICAgICAgIChTQ0JfTVNHT1VUX1NFTlR8U0NCX01TR09VVF9XRFRSKSApCisgICAgICAgIHsKKyAgICAgICAgICBzd2l0Y2goYnVzX3dpZHRoKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlamVjdCA9IFRSVUU7CisgICAgICAgICAgICAgIGlmICggKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKSAmJgorICAgICAgICAgICAgICAgICAgICgoYWljX2Rldi0+ZmxhZ3MgJiBERVZJQ0VfUFJJTlRfRFRSKSB8fAorICAgICAgICAgICAgICAgICAgICAoYWljN3h4eF92ZXJib3NlID4gMHhmZmZmKSkgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiUmVxdWVzdGluZyAlZCBiaXQgdHJhbnNmZXJzLCByZWplY3RpbmcuXG4iLAorICAgICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpLCA4ICogKDB4MDEgPDwgYnVzX3dpZHRoKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLyogV2UgZmFsbCB0aHJvdWdoIG9uIHB1cnBvc2UgKi8KKyAgICAgICAgICAgIGNhc2UgTVNHX0VYVF9XRFRSX0JVU184X0JJVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC53aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQ7CisgICAgICAgICAgICAgIGFpY19kZXYtPm5lZWR3ZHRyX2NvcHkgJj0gfnRhcmdldF9tYXNrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTVNHX0VYVF9XRFRSX0JVU18xNl9CSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBhaWNfZGV2LT5uZWVkd2R0ciA9IDA7CisgICAgICAgICAgYWljN3h4eF9zZXRfd2lkdGgocCwgdGFyZ2V0LCBjaGFubmVsLCBsdW4sIG5ld19idXNfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfQ1VSLCBhaWNfZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoICEoYWljX2Rldi0+ZmxhZ3MgJiBERVZJQ0VfRFRSX1NDQU5ORUQpICkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAqIFdlbGwsIHdlIG5vdyBrbm93IHRoZSBXRFRSIGFuZCBTWU5DIGNhcHMgb2YgdGhpcyBkZXZpY2Ugc2luY2UKKyAgICAgICAgICAgICAqIGl0IGNvbnRhY3RlZCB1cyBmaXJzdCwgbWFyayBpdCBhcyBzdWNoIGFuZCBjb3B5IHRoZSB1c2VyIHN0dWZmCisgICAgICAgICAgICAgKiBvdmVyIHRvIHRoZSBnb2FsIHN0dWZmLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiggKHAtPmZlYXR1cmVzICYgQUhDX1dJREUpICYmIHAtPnVzZXJbdGluZGV4XS53aWR0aCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwud2lkdGggPSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVDsKKyAgICAgICAgICAgICAgYWljX2Rldi0+bmVlZHdkdHJfY29weSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBEZXZpY2VzIHRoYXQgc3VwcG9ydCBEVCB0cmFuc2ZlcnMgZG9uJ3Qgc3RhcnQgV0RUUiByZXF1ZXN0cworICAgICAgICAgICAgICovCisgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLm9wdGlvbnMgPSAwOworCisgICAgICAgICAgICBpZihwLT51c2VyW3RpbmRleF0ub2Zmc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBhaWNfZGV2LT5uZWVkc2R0cl9jb3B5ID0gMTsKKyAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5wZXJpb2QgPSBtYXhfdCh1bnNpZ25lZCBjaGFyLCAxMCwgcC0+dXNlclt0aW5kZXhdLnBlcmlvZCk7CisgICAgICAgICAgICAgIGlmKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0ID0gTUFYX09GRlNFVF9VTFRSQTI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSBpZiggYWljX2Rldi0+Z29hbC53aWR0aCApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLm9mZnNldCA9IE1BWF9PRkZTRVRfMTZCSVQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5vZmZzZXQgPSBNQVhfT0ZGU0VUXzhCSVQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGFpY19kZXYtPm5lZWRzZHRyX2NvcHkgPSAwOworICAgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLnBlcmlvZCA9IDI1NTsKKyAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5vZmZzZXQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBhaWNfZGV2LT5mbGFncyB8PSBERVZJQ0VfRFRSX1NDQU5ORUQgfCBERVZJQ0VfUFJJTlRfRFRSOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChhaWNfZGV2LT5uZWVkd2R0cl9jb3B5ID09IDApCisgICAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoaXMgaXMgYSBwcmVlbXB0aXZlIG1lc3NhZ2UgZnJvbSB0aGUgdGFyZ2V0LCB3ZSd2ZSBhbHJlYWR5CisgICAgICAgICAgICAgKiBzY2FubmVkIHRoaXMgdGFyZ2V0IGFuZCBzZXQgb3VyIG9wdGlvbnMgZm9yIGl0LCBhbmQgd2UKKyAgICAgICAgICAgICAqIGRvbid0IG5lZWQgYSBXRFRSIHdpdGggdGhpcyB0YXJnZXQgKGZvciB3aGF0ZXZlciByZWFzb24pLAorICAgICAgICAgICAgICogc28gcmVqZWN0IHRoaXMgaW5jb21pbmcgV0RUUgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZWplY3QgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogVGhlIGRldmljZSBpcyBzZW5kaW5nIHRoaXMgbWVzc2FnZSBmaXJzdCBhbmQgd2UgaGF2ZSB0byByZXBseSAqLworICAgICAgICAgIHJlcGx5ID0gVFJVRTsKKworICAgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX05FR09USUFUSU9OMikKKyAgICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJSZWNlaXZlZCBwcmUtZW1wdGl2ZSBXRFRSIG1lc3NhZ2UgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgInRhcmdldC5cbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgICAgICAgfQorICAgICAgICAgIHN3aXRjaChidXNfd2lkdGgpCisgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCAocC0+ZmVhdHVyZXMgJiBBSENfV0lERSkgJiYKKyAgICAgICAgICAgICAgICAgICAoYWljX2Rldi0+Z29hbC53aWR0aCA9PSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVCkgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3X2J1c193aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfMTZfQklUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8qIEZhbGwgdGhyb3VnaCBpZiB3ZSBhcmVuJ3QgYSB3aWRlIGNhcmQgKi8KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjYXNlIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFpY19kZXYtPm5lZWR3ZHRyX2NvcHkgPSAwOworICAgICAgICAgICAgICBuZXdfYnVzX3dpZHRoID0gTVNHX0VYVF9XRFRSX0JVU184X0JJVDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHNjYi0+ZmxhZ3MgJj0gflNDQl9NU0dPVVRfQklUUzsKKyAgICAgICAgICBzY2ItPmZsYWdzIHw9IFNDQl9NU0dPVVRfV0RUUjsKKyAgICAgICAgICBhaWNfZGV2LT5uZWVkd2R0ciA9IDA7CisgICAgICAgICAgaWYoYWljX2Rldi0+ZHRyX3BlbmRpbmcgPT0gMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiB0aGVyZSBpcyBubyBvdGhlciBjb21tYW5kIHdpdGggU0NCX0RUUl9TQ0IgYWxyZWFkeSBzZXQgdGhhdCB3aWxsCisgICAgICAgICAgICAgKiB0cmlnZ2VyIHRoZSByZWxlYXNlIG9mIHRoZSBkdHJfcGVuZGluZyBiaXQuICBCb3RoIHNldCB0aGUgYml0CisgICAgICAgICAgICAgKiBhbmQgc2V0IHNjYi0+ZmxhZ3MgfD0gU0NCX0RUUl9TQ0IKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYWljX2Rldi0+ZHRyX3BlbmRpbmcgPSAxOworICAgICAgICAgICAgc2NiLT5mbGFncyB8PSBTQ0JfRFRSX1NDQjsKKyAgICAgICAgICB9CisgICAgICAgICAgYWljX291dGIocCwgSE9TVF9NU0csIE1TR19PVVQpOworICAgICAgICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0NTSVNJR08pIHwgQVROTywgU0NTSVNJR08pOworICAgICAgICAgIC8qIHdoZW4gc2VuZGluZyBhIHJlcGx5LCBtYWtlIHN1cmUgdGhhdCB0aGUgZ29hbCBzZXR0aW5ncyBhcmUKKyAgICAgICAgICAgKiB1cGRhdGVkIGFsb25nIHdpdGggY3VycmVudCBhbmQgYWN0aXZlIHNpbmNlIHRoZSBjb2RlIHRoYXQKKyAgICAgICAgICAgKiB3aWxsIGFjdHVhbGx5IGJ1aWxkIHRoZSBtZXNzYWdlIGZvciB0aGUgc2VxdWVuY2VyIHVzZXMgdGhlCisgICAgICAgICAgICogZ29hbCBzZXR0aW5ncyBhcyBpdHMgZ3VpZGVsaW5lcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBhaWM3eHh4X3NldF93aWR0aChwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgbmV3X2J1c193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUhDX1RSQU5TX0dPQUx8QUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfQ1VSLAorCQkJICBhaWNfZGV2KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyoKKyAgICAgICAgICogQnkgdmlydHVlIG9mIHRoZSBTQ1NJIHNwZWMsIGEgV0RUUiBtZXNzYWdlIG5lZ2F0ZXMgYW55IGV4aXN0aW5nCisgICAgICAgICAqIFNEVFIgbmVnb3RpYXRpb25zLiAgU28sIGV2ZW4gaWYgbmVlZHNkdHIgaXNuJ3QgbWFya2VkIGZvciB0aGlzCisgICAgICAgICAqIGRldmljZSwgd2Ugc3RpbGwgaGF2ZSB0byBkbyBhIG5ldyBTRFRSIG1lc3NhZ2UgaWYgdGhlIGRldmljZQorICAgICAgICAgKiBzdXBwb3J0cyBTRFRSIGF0IGFsbC4gIFRoZXJlZm9yZSwgd2UgY2hlY2sgbmVlZHNkdHJfY29weSBpbnN0ZWFkCisgICAgICAgICAqIG9mIG5lZWRzdHIuCisgICAgICAgICAqLworICAgICAgICBhaWM3eHh4X3NldF9zeW5jcmF0ZShwLCBOVUxMLCB0YXJnZXQsIGNoYW5uZWwsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFIQ19UUkFOU19BQ1RJVkV8QUhDX1RSQU5TX0NVUnxBSENfVFJBTlNfUVVJVEUsCisJCQkgICAgIGFpY19kZXYpOworICAgICAgICBhaWNfZGV2LT5uZWVkc2R0ciA9IGFpY19kZXYtPm5lZWRzZHRyX2NvcHk7CisgICAgICAgIGRvbmUgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgTVNHX0VYVF9QUFI6CisgICAgICB7CisgICAgICAgIAorICAgICAgICBpZiAocC0+bXNnX2J1ZlsxXSAhPSBNU0dfRVhUX1BQUl9MRU4pCisgICAgICAgIHsKKyAgICAgICAgICByZWplY3QgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHAtPm1zZ19sZW4gPCAoTVNHX0VYVF9QUFJfTEVOICsgMikpCisgICAgICAgIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHBlcmlvZCA9IG5ld19wZXJpb2QgPSBwLT5tc2dfYnVmWzNdOworICAgICAgICBvZmZzZXQgPSBuZXdfb2Zmc2V0ID0gcC0+bXNnX2J1Zls1XTsKKyAgICAgICAgYnVzX3dpZHRoID0gbmV3X2J1c193aWR0aCA9IHAtPm1zZ19idWZbNl07CisgICAgICAgIHRyYW5zX29wdGlvbnMgPSBuZXdfdHJhbnNfb3B0aW9ucyA9IHAtPm1zZ19idWZbN10gJiAweGY7CisKKyAgICAgICAgaWYoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9ORUdPVElBVElPTjIpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJQYXJzaW5nIFBQUiBtZXNzYWdlICglZC8lZC8lZC8lZClcbiIsCisgICAgICAgICAgICAgICAgIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSwgcGVyaW9kLCBvZmZzZXQsIGJ1c193aWR0aCwKKyAgICAgICAgICAgICAgICAgdHJhbnNfb3B0aW9ucyk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBXZSBtaWdodCBoYXZlIGEgZGV2aWNlIHRoYXQgaXMgc3RhcnRpbmcgbmVnb3RpYXRpb24gd2l0aCB1cworICAgICAgICAgKiBiZWZvcmUgd2UgY2FuIHN0YXJ0IHVwIG5lZ290aWF0aW9uIHdpdGggaXQuLi4uYmUgcHJlcGFyZWQgdG8KKyAgICAgICAgICogaGF2ZSBhIGRldmljZSBhc2sgZm9yIGEgaGlnaGVyIHNwZWVkIHRoZW4gd2Ugd2FudCB0byBnaXZlIGl0CisgICAgICAgICAqIGluIHRoYXQgY2FzZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCAoc2NiLT5mbGFncyAmIChTQ0JfTVNHT1VUX1NFTlR8U0NCX01TR09VVF9QUFIpKSAhPQorICAgICAgICAgICAgIChTQ0JfTVNHT1VUX1NFTlR8U0NCX01TR09VVF9QUFIpICkKKyAgICAgICAgeyAKKyAgICAgICAgICAvKiBIYXZlIHdlIHNjYW5uZWQgdGhlIGRldmljZSB5ZXQ/ICovCisgICAgICAgICAgaWYgKCEoYWljX2Rldi0+ZmxhZ3MgJiBERVZJQ0VfRFRSX1NDQU5ORUQpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSBkZXZpY2UgaXMgZWxlY3RpbmcgdG8gdXNlIFBQUiBtZXNzYWdlcywgc28gd2Ugd2lsbCB0b28gdW50aWwKKyAgICAgICAgICAgICAqIHdlIGtub3cgYmV0dGVyICovCisgICAgICAgICAgICBhaWNfZGV2LT5uZWVkcHByID0gYWljX2Rldi0+bmVlZHBwcl9jb3B5ID0gMTsKKyAgICAgICAgICAgIGFpY19kZXYtPm5lZWRzZHRyID0gYWljX2Rldi0+bmVlZHNkdHJfY29weSA9IDA7CisgICAgICAgICAgICBhaWNfZGV2LT5uZWVkd2R0ciA9IGFpY19kZXYtPm5lZWR3ZHRyX2NvcHkgPSAwOworICAgICAgICAgIAorICAgICAgICAgICAgLyogV2Uga25vdyB0aGUgZGV2aWNlIGlzIFNDU0ktMyBjb21wbGlhbnQgZHVlIHRvIFBQUiAqLworICAgICAgICAgICAgYWljX2Rldi0+ZmxhZ3MgfD0gREVWSUNFX1NDU0lfMzsKKyAgICAgICAgICAKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBOb3Qgb25seSBpcyB0aGUgZGV2aWNlIHN0YXJ0aW5nIHRoaXMgdXAsIGJ1dCBpdCBhbHNvIGhhc24ndAorICAgICAgICAgICAgICogYmVlbiBzY2FubmVkIHlldCwgc28gdGhpcyB3b3VsZCBsaWtlbHkgYmUgb3VyIFRVUiBvciBvdXIKKyAgICAgICAgICAgICAqIElOUVVJUlkgY29tbWFuZCBhdCBzY2FuIHRpbWUsIHNvIHdlIG5lZWQgdG8gdXNlIHRoZQorICAgICAgICAgICAgICogc2V0dGluZ3MgZnJvbSB0aGUgU0VFUFJPTSBpZiB0aGV5IGV4aXN0ZWQuICBPZiBjb3Vyc2UsIGV2ZW4KKyAgICAgICAgICAgICAqIGlmIHdlIGRpZG4ndCBmaW5kIGEgU0VFUFJPTSwgd2Ugc3R1ZmZlZCBkZWZhdWx0IHZhbHVlcyBpbnRvCisgICAgICAgICAgICAgKiB0aGUgdXNlciBzZXR0aW5ncyBhbnl3YXksIHNvIHVzZSB0aG9zZSBpbiBhbGwgY2FzZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFpY19kZXYtPmdvYWwud2lkdGggPSBwLT51c2VyW3RpbmRleF0ud2lkdGg7CisgICAgICAgICAgICBpZihwLT51c2VyW3RpbmRleF0ub2Zmc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLnBlcmlvZCA9IHAtPnVzZXJbdGluZGV4XS5wZXJpb2Q7CisgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwub3B0aW9ucyA9IHAtPnVzZXJbdGluZGV4XS5vcHRpb25zOworICAgICAgICAgICAgICBpZihwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLm9mZnNldCA9IE1BWF9PRkZTRVRfVUxUUkEyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgaWYoIGFpY19kZXYtPmdvYWwud2lkdGggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgKGJ1c193aWR0aCA9PSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgcC0+ZmVhdHVyZXMgJiBBSENfV0lERSApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLm9mZnNldCA9IE1BWF9PRkZTRVRfMTZCSVQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5vZmZzZXQgPSBNQVhfT0ZGU0VUXzhCSVQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5wZXJpb2QgPSAyNTU7CisgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5vcHRpb25zID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFpY19kZXYtPmZsYWdzIHw9IERFVklDRV9EVFJfU0NBTk5FRCB8IERFVklDRV9QUklOVF9EVFI7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKGFpY19kZXYtPm5lZWRwcHJfY29weSA9PSAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGlzIGlzIGEgcHJlZW1wdGl2ZSBtZXNzYWdlIGZyb20gdGhlIHRhcmdldCwgd2UndmUgYWxyZWFkeQorICAgICAgICAgICAgICogc2Nhbm5lZCB0aGlzIHRhcmdldCBhbmQgc2V0IG91ciBvcHRpb25zIGZvciBpdCwgYW5kIHdlCisgICAgICAgICAgICAgKiBkb24ndCBuZWVkIGEgUFBSIHdpdGggdGhpcyB0YXJnZXQgKGZvciB3aGF0ZXZlciByZWFzb24pLAorICAgICAgICAgICAgICogc28gcmVqZWN0IHRoaXMgaW5jb21pbmcgUFBSCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJlamVjdCA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBUaGUgZGV2aWNlIGlzIHNlbmRpbmcgdGhpcyBtZXNzYWdlIGZpcnN0IGFuZCB3ZSBoYXZlIHRvIHJlcGx5ICovCisgICAgICAgICAgcmVwbHkgPSBUUlVFOworICAgICAgICAgIAorICAgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX05FR09USUFUSU9OMikKKyAgICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJSZWNlaXZlZCBwcmUtZW1wdGl2ZSBQUFIgbWVzc2FnZSBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAidGFyZ2V0LlxuIiwgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChidXNfd2lkdGgpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIE1TR19FWFRfV0RUUl9CVVNfMTZfQklUOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggKGFpY19kZXYtPmdvYWwud2lkdGggPT0gTVNHX0VYVF9XRFRSX0JVU18xNl9CSVQpICYmCisJCQkgICAgcC0+ZmVhdHVyZXMgJiBBSENfV0lERSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9ORUdPVElBVElPTjIpICYmCisgICAgICAgICAgICAgICAgICgoYWljX2Rldi0+ZmxhZ3MgJiBERVZJQ0VfUFJJTlRfRFRSKSB8fAorICAgICAgICAgICAgICAgICAgKGFpYzd4eHhfdmVyYm9zZSA+IDB4ZmZmZikpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVwbHkgPSBUUlVFOworICAgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJSZXF1ZXN0aW5nICVkIGJpdCB0cmFuc2ZlcnMsIHJlamVjdGluZy5cbiIsCisgICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpLCA4ICogKDB4MDEgPDwgYnVzX3dpZHRoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSAvKiBXZSBmYWxsIHRocm91Z2ggb24gcHVycG9zZSAqLworICAgICAgICAgIGNhc2UgTVNHX0VYVF9XRFRSX0JVU184X0JJVDoKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQWNjb3JkaW5nIHRvIHRoZSBzcGVjLCBpZiB3ZSBhcmVuJ3Qgd2lkZSwgd2UgYWxzbyBjYW4ndCBiZQorICAgICAgICAgICAgICogRHVhbCBFZGdlIHNvIGNsZWFyIHRoZSBvcHRpb25zIGJ5dGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbmV3X3RyYW5zX29wdGlvbnMgPSAwOworICAgICAgICAgICAgbmV3X2J1c193aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihyZXBseSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHdoZW4gc2VuZGluZyBhIHJlcGx5LCBtYWtlIHN1cmUgdGhhdCB0aGUgZ29hbCBzZXR0aW5ncyBhcmUKKyAgICAgICAgICAgKiB1cGRhdGVkIGFsb25nIHdpdGggY3VycmVudCBhbmQgYWN0aXZlIHNpbmNlIHRoZSBjb2RlIHRoYXQKKyAgICAgICAgICAgKiB3aWxsIGFjdHVhbGx5IGJ1aWxkIHRoZSBtZXNzYWdlIGZvciB0aGUgc2VxdWVuY2VyIHVzZXMgdGhlCisgICAgICAgICAgICogZ29hbCBzZXR0aW5ncyBhcyBpdHMgZ3VpZGVsaW5lcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBhaWM3eHh4X3NldF93aWR0aChwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgbmV3X2J1c193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSENfVFJBTlNfR09BTHxBSENfVFJBTlNfQUNUSVZFfEFIQ19UUkFOU19DVVIsCisJCQkgICAgYWljX2Rldik7CisgICAgICAgICAgc3luY3JhdGUgPSBhaWM3eHh4X2ZpbmRfc3luY3JhdGUocCwgJm5ld19wZXJpb2QsIG1heHN5bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld190cmFuc19vcHRpb25zKTsKKyAgICAgICAgICBhaWM3eHh4X3ZhbGlkYXRlX29mZnNldChwLCBzeW5jcmF0ZSwgJm5ld19vZmZzZXQsIG5ld19idXNfd2lkdGgpOworICAgICAgICAgIGFpYzd4eHhfc2V0X3N5bmNyYXRlKHAsIHN5bmNyYXRlLCB0YXJnZXQsIGNoYW5uZWwsIG5ld19wZXJpb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X29mZnNldCwgbmV3X3RyYW5zX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhDX1RSQU5TX0dPQUx8QUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfQ1VSLAorCQkJICAgICAgIGFpY19kZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGFpYzd4eHhfc2V0X3dpZHRoKHAsIHRhcmdldCwgY2hhbm5lbCwgbHVuLCBuZXdfYnVzX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFIQ19UUkFOU19BQ1RJVkV8QUhDX1RSQU5TX0NVUiwgYWljX2Rldik7CisgICAgICAgICAgc3luY3JhdGUgPSBhaWM3eHh4X2ZpbmRfc3luY3JhdGUocCwgJm5ld19wZXJpb2QsIG1heHN5bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld190cmFuc19vcHRpb25zKTsKKyAgICAgICAgICBhaWM3eHh4X3ZhbGlkYXRlX29mZnNldChwLCBzeW5jcmF0ZSwgJm5ld19vZmZzZXQsIG5ld19idXNfd2lkdGgpOworICAgICAgICAgIGFpYzd4eHhfc2V0X3N5bmNyYXRlKHAsIHN5bmNyYXRlLCB0YXJnZXQsIGNoYW5uZWwsIG5ld19wZXJpb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X29mZnNldCwgbmV3X3RyYW5zX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfQ1VSLCBhaWNfZGV2KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEFzIGl0IHR1cm5zIG91dCwgaWYgd2UgZG9uJ3QgKmhhdmUqIHRvIGhhdmUgUFBSIG1lc3NhZ2VzLCB0aGVuCisgICAgICAgICAqIGNvbmZpZ3VyZSBvdXJzZWx2ZXMgbm90IHRvIHVzZSB0aGVtIHNpbmNlIHRoYXQgbWFrZXMgc29tZQorICAgICAgICAgKiBleHRlcm5hbCBkcml2ZSBjaGFzc2lzIHdvcmsgKHRob3NlIGNoYXNzaXMgY2FuJ3QgcGFyc2UgUFBSCisgICAgICAgICAqIG1lc3NhZ2VzIGFuZCB0aGV5IG1hbmdsZSB0aGUgU0NTSSBidXMgdW50aWwgeW91IHNlbmQgYSBXRFRSCisgICAgICAgICAqIGFuZCBTRFRSIHRoYXQgdGhleSBjYW4gdW5kZXJzdGFuZCkuCisgICAgICAgICAqLworICAgICAgICBpZihuZXdfdHJhbnNfb3B0aW9ucyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgYWljX2Rldi0+bmVlZHBwciA9IGFpY19kZXYtPm5lZWRwcHJfY29weSA9IDA7CisgICAgICAgICAgaWYobmV3X29mZnNldCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBhaWNfZGV2LT5uZWVkc2R0ciA9IGFpY19kZXYtPm5lZWRzZHRyX2NvcHkgPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobmV3X2J1c193aWR0aCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBhaWNfZGV2LT5uZWVkd2R0ciA9IGFpY19kZXYtPm5lZWR3ZHRyX2NvcHkgPSAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKChuZXdfb2Zmc2V0ID09IDApICYmIChvZmZzZXQgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIE9vcHMsIHRoZSBzeW5jcmF0ZSB3ZW50IHRvIGxvdyBmb3IgdGhpcyBjYXJkIGFuZCB3ZSBmZWxsIG9mZgorICAgICAgICAgICAqIHRvIGFzeW5jIChzaG91bGQgbmV2ZXIgaGFwcGVuIHdpdGggYSBkZXZpY2UgdGhhdCB1c2VzIFBQUgorICAgICAgICAgICAqIG1lc3NhZ2VzLCBidXQgaGF2ZSB0byBiZSBjb21wbGV0ZSkKKyAgICAgICAgICAgKi8KKyAgICAgICAgICByZXBseSA9IFRSVUU7CisgICAgICAgIH0KKworICAgICAgICBpZihyZXBseSkKKyAgICAgICAgeworICAgICAgICAgIHNjYi0+ZmxhZ3MgJj0gflNDQl9NU0dPVVRfQklUUzsKKyAgICAgICAgICBzY2ItPmZsYWdzIHw9IFNDQl9NU0dPVVRfUFBSOworICAgICAgICAgIGFpY19vdXRiKHAsIEhPU1RfTVNHLCBNU0dfT1VUKTsKKyAgICAgICAgICBhaWNfb3V0YihwLCBhaWNfaW5iKHAsIFNDU0lTSUdPKSB8IEFUTk8sIFNDU0lTSUdPKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBhaWNfZGV2LT5uZWVkcHByID0gMDsKKyAgICAgICAgfQorICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgeworICAgICAgICByZWplY3QgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IC8qIGVuZCBvZiBzd2l0Y2gocC0+bXNnX3R5cGUpICovCisgIH0gLyogZW5kIG9mIGlmICghcmVqZWN0ICYmIChwLT5tc2dfbGVuID4gMikpICovCisKKyAgaWYgKCFyZXBseSAmJiByZWplY3QpCisgIHsKKyAgICBhaWNfb3V0YihwLCBNU0dfTUVTU0FHRV9SRUpFQ1QsIE1TR19PVVQpOworICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0NTSVNJR08pIHwgQVROTywgU0NTSVNJR08pOworICAgIGRvbmUgPSBUUlVFOworICB9CisgIHJldHVybihkb25lKTsKK30KKworCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfaGFuZGxlX3JlcWluaXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgSW50ZXJydXB0IGhhbmRsZXIgZm9yIFJFUUlOSVQgaW50ZXJydXB0cyAodXNlZCB0byB0cmFuc2ZlciBtZXNzYWdlcyB0bworICogICAgYW5kIGZyb20gZGV2aWNlcykuCisgKl9GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X2hhbmRsZV9yZXFpbml0KHN0cnVjdCBhaWM3eHh4X2hvc3QgKnAsIHN0cnVjdCBhaWM3eHh4X3NjYiAqc2NiKQoreworICB1bnNpZ25lZCBjaGFyIGxhc3RieXRlOworICB1bnNpZ25lZCBjaGFyIHBoYXNlbWlzOworICBpbnQgZG9uZSA9IEZBTFNFOworCisgIHN3aXRjaChwLT5tc2dfdHlwZSkKKyAgeworICAgIGNhc2UgTVNHX1RZUEVfSU5JVElBVE9SX01TR09VVDoKKyAgICAgIHsKKyAgICAgICAgaWYgKHAtPm1zZ19sZW4gPT0gMCkKKyAgICAgICAgICBwYW5pYygiYWljN3h4eDogUkVRSU5JVCB3aXRoIG5vIGFjdGl2ZSBtZXNzYWdlIVxuIik7CisKKyAgICAgICAgbGFzdGJ5dGUgPSAocC0+bXNnX2luZGV4ID09IChwLT5tc2dfbGVuIC0gMSkpOworICAgICAgICBwaGFzZW1pcyA9ICggYWljX2luYihwLCBTQ1NJU0lHSSkgJiBQSEFTRV9NQVNLKSAhPSBQX01FU0dPVVQ7CisKKyAgICAgICAgaWYgKGxhc3RieXRlIHx8IHBoYXNlbWlzKQorICAgICAgICB7CisgICAgICAgICAgLyogVGltZSB0byBlbmQgdGhlIG1lc3NhZ2UgKi8KKyAgICAgICAgICBwLT5tc2dfbGVuID0gMDsKKyAgICAgICAgICBwLT5tc2dfdHlwZSA9IE1TR19UWVBFX05PTkU7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBOT1RFLVRPLU1ZU0VMRjogSWYgeW91IGNsZWFyIHRoZSBSRVFJTklUIGFmdGVyIHlvdQorICAgICAgICAgICAqIGRpc2FibGUgUkVRSU5JVHMsIHRoZW4gY2FzZXMgb2YgUkVKRUNUX01TRyBzdG9wIHdvcmtpbmcKKyAgICAgICAgICAgKiBhbmQgaGFuZyB0aGUgYnVzCisgICAgICAgICAgICovCisgICAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBTSU1PREUxKSAmIH5FTlJFUUlOSVQsIFNJTU9ERTEpOworICAgICAgICAgIGFpY19vdXRiKHAsIENMUlNDU0lJTlQsIENMUklOVCk7CisgICAgICAgICAgcC0+ZmxhZ3MgJj0gfkFIQ19IQU5ETElOR19SRVFJTklUUzsKKworICAgICAgICAgIGlmIChwaGFzZW1pcyA9PSAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGFpY19vdXRiKHAsIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4XSwgU0lOREVYKTsKKyAgICAgICAgICAgIGFpY19vdXRiKHAsIDAsIFJFVFVSTl8xKTsKKyNpZmRlZiBBSUM3WFhYX1ZFUkJPU0VfREVCVUdHSU5HCisgICAgICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlID4gMHhmZmZmKQorICAgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJDb21wbGV0ZWQgc2VuZGluZyBvZiBSRVFJTklUIG1lc3NhZ2UuXG4iLAorICAgICAgICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyNlbmRpZgorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgYWljX291dGIocCwgTVNHT1VUX1BIQVNFTUlTLCBSRVRVUk5fMSk7CisjaWZkZWYgQUlDN1hYWF9WRVJCT1NFX0RFQlVHR0lORworICAgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSA+IDB4ZmZmZikKKyAgICAgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiUEhBU0VNSVMgd2hpbGUgc2VuZGluZyBSRVFJTklUIG1lc3NhZ2UuXG4iLAorICAgICAgICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyNlbmRpZgorICAgICAgICAgIH0KKyAgICAgICAgICB1bnBhdXNlX3NlcXVlbmNlcihwLCBUUlVFKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIFByZXNlbnQgdGhlIGJ5dGUgb24gdGhlIGJ1cyAoY2xlYXJpbmcgUkVRSU5JVCkgYnV0IGRvbid0CisgICAgICAgICAgICogdW5wYXVzZSB0aGUgc2VxdWVuY2VyLgorICAgICAgICAgICAqLworICAgICAgICAgIGFpY19vdXRiKHAsIENMUlJFUUlOSVQsIENMUlNJTlQxKTsKKyAgICAgICAgICBhaWNfb3V0YihwLCBDTFJTQ1NJSU5ULCBDTFJJTlQpOworICAgICAgICAgIGFpY19vdXRiKHAsICBwLT5tc2dfYnVmW3AtPm1zZ19pbmRleCsrXSwgU0NTSURBVEwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgTVNHX1RZUEVfSU5JVElBVE9SX01TR0lOOgorICAgICAgeworICAgICAgICBwaGFzZW1pcyA9ICggYWljX2luYihwLCBTQ1NJU0lHSSkgJiBQSEFTRV9NQVNLICkgIT0gUF9NRVNHSU47CisKKyAgICAgICAgaWYgKHBoYXNlbWlzID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBwLT5tc2dfbGVuKys7CisgICAgICAgICAgLyogUHVsbCB0aGUgYnl0ZSBpbiB3aXRob3V0IGFja2luZyBpdCAqLworICAgICAgICAgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4XSA9IGFpY19pbmIocCwgU0NTSUJVU0wpOworICAgICAgICAgIGRvbmUgPSBhaWM3eHh4X3BhcnNlX21zZyhwLCBzY2IpOworICAgICAgICAgIC8qIEFjayB0aGUgYnl0ZSAqLworICAgICAgICAgIGFpY19vdXRiKHAsIENMUlJFUUlOSVQsIENMUlNJTlQxKTsKKyAgICAgICAgICBhaWNfb3V0YihwLCBDTFJTQ1NJSU5ULCBDTFJJTlQpOworICAgICAgICAgIGFpY19pbmIocCwgU0NTSURBVEwpOworICAgICAgICAgIHAtPm1zZ19pbmRleCsrOworICAgICAgICB9CisgICAgICAgIGlmIChwaGFzZW1pcyB8fCBkb25lKQorICAgICAgICB7CisjaWZkZWYgQUlDN1hYWF9WRVJCT1NFX0RFQlVHR0lORworICAgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgPiAweGZmZmYpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKHBoYXNlbWlzKQorICAgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJQSEFTRU1JUyB3aGlsZSByZWNlaXZpbmcgUkVRSU5JVCBtZXNzYWdlLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIkNvbXBsZXRlZCByZWNlaXB0IG9mIFJFUUlOSVQgbWVzc2FnZS5cbiIsCisgICAgICAgICAgICAgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYikpOworICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgIC8qIFRpbWUgdG8gZW5kIG91ciBtZXNzYWdlIHNlc3Npb24gKi8KKyAgICAgICAgICBwLT5tc2dfbGVuID0gMDsKKyAgICAgICAgICBwLT5tc2dfdHlwZSA9IE1TR19UWVBFX05PTkU7CisgICAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBTSU1PREUxKSAmIH5FTlJFUUlOSVQsIFNJTU9ERTEpOworICAgICAgICAgIGFpY19vdXRiKHAsIENMUlNDU0lJTlQsIENMUklOVCk7CisgICAgICAgICAgcC0+ZmxhZ3MgJj0gfkFIQ19IQU5ETElOR19SRVFJTklUUzsKKyAgICAgICAgICB1bnBhdXNlX3NlcXVlbmNlcihwLCBUUlVFKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgeworICAgICAgICBwYW5pYygiYWljN3h4eDogVW5rbm93biBSRVFJTklUIG1lc3NhZ2UgdHlwZS5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgfSAvKiBFbmQgb2Ygc3dpdGNoKHAtPm1zZ190eXBlKSAqLworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfaGFuZGxlX3Njc2lpbnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgSW50ZXJydXB0IGhhbmRsZXIgZm9yIFNDU0kgaW50ZXJydXB0cyAoU0NTSUlOVCkuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X2hhbmRsZV9zY3NpaW50KHN0cnVjdCBhaWM3eHh4X2hvc3QgKnAsIHVuc2lnbmVkIGNoYXIgaW50c3RhdCkKK3sKKyAgdW5zaWduZWQgY2hhciBzY2JfaW5kZXg7CisgIHVuc2lnbmVkIGNoYXIgc3RhdHVzOworICBzdHJ1Y3QgYWljN3h4eF9zY2IgKnNjYjsKKyAgc3RydWN0IGFpY19kZXZfZGF0YSAqYWljX2RldjsKKworICBzY2JfaW5kZXggPSBhaWNfaW5iKHAsIFNDQl9UQUcpOworICBzdGF0dXMgPSBhaWNfaW5iKHAsIFNTVEFUMSk7CisKKyAgaWYgKHNjYl9pbmRleCA8IHAtPnNjYl9kYXRhLT5udW1zY2JzKQorICB7CisgICAgc2NiID0gcC0+c2NiX2RhdGEtPnNjYl9hcnJheVtzY2JfaW5kZXhdOworICAgIGlmICgoc2NiLT5mbGFncyAmIFNDQl9BQ1RJVkUpID09IDApCisgICAgeworICAgICAgc2NiID0gTlVMTDsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgc2NiID0gTlVMTDsKKyAgfQorCisKKyAgaWYgKChzdGF0dXMgJiBTQ1NJUlNUSSkgIT0gMCkKKyAgeworICAgIGludCBjaGFubmVsOworCisgICAgaWYgKCAocC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykgPT0gQUhDX0FJQzc3NzAgKQorICAgICAgY2hhbm5lbCA9IChhaWNfaW5iKHAsIFNCTEtDVEwpICYgU0VMQlVTQikgPj4gMzsKKyAgICBlbHNlCisgICAgICBjaGFubmVsID0gMDsKKworICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1JFU0VUKQorICAgICAgcHJpbnRrKFdBUk5fTEVBRCAiU29tZW9uZSBlbHNlIHJlc2V0IHRoZSBjaGFubmVsISFcbiIsCisgICAgICAgICAgIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIC0xLCAtMSk7CisgICAgaWYgKGFpYzd4eHhfcGFuaWNfb25fYWJvcnQpCisgICAgICBhaWM3eHh4X3BhbmljX2Fib3J0KHAsIE5VTEwpOworICAgIC8qCisgICAgICogR28gdGhyb3VnaCBhbmQgYWJvcnQgYWxsIGNvbW1hbmRzIGZvciB0aGUgY2hhbm5lbCwgYnV0IGRvIG5vdAorICAgICAqIHJlc2V0IHRoZSBjaGFubmVsIGFnYWluLgorICAgICAqLworICAgIGFpYzd4eHhfcmVzZXRfY2hhbm5lbChwLCBjaGFubmVsLCAvKiBJbml0aWF0ZSBSZXNldCAqLyBGQUxTRSk7CisgICAgYWljN3h4eF9ydW5fZG9uZV9xdWV1ZShwLCBUUlVFKTsKKyAgICBzY2IgPSBOVUxMOworICB9CisgIGVsc2UgaWYgKCAoKHN0YXR1cyAmIEJVU0ZSRUUpICE9IDApICYmICgoc3RhdHVzICYgU0VMVE8pID09IDApICkKKyAgeworICAgIC8qCisgICAgICogRmlyc3QgbG9vayBhdCB3aGF0IHBoYXNlIHdlIHdlcmUgbGFzdCBpbi4gIElmIGl0J3MgbWVzc2FnZS1vdXQsCisgICAgICogY2hhbmNlcyBhcmUgcHJldHR5IGdvb2QgdGhhdCB0aGUgYnVzIGZyZWUgd2FzIGluIHJlc3BvbnNlIHRvCisgICAgICogb25lIG9mIG91ciBhYm9ydCByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGxhc3RwaGFzZSA9IGFpY19pbmIocCwgTEFTVFBIQVNFKTsKKyAgICB1bnNpZ25lZCBjaGFyIHNhdmVkX3RjbCA9IGFpY19pbmIocCwgU0FWRURfVENMKTsKKyAgICB1bnNpZ25lZCBjaGFyIHRhcmdldCA9IChzYXZlZF90Y2wgPj4gNCkgJiAweDBGOworICAgIGludCBjaGFubmVsOworICAgIGludCBwcmludGVycm9yID0gVFJVRTsKKworICAgIGlmICggKHAtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spID09IEFIQ19BSUM3NzcwICkKKyAgICAgIGNoYW5uZWwgPSAoYWljX2luYihwLCBTQkxLQ1RMKSAmIFNFTEJVU0IpID4+IDM7CisgICAgZWxzZQorICAgICAgY2hhbm5lbCA9IDA7CisKKyAgICBhaWNfb3V0YihwLCBhaWNfaW5iKHAsIFNDU0lTRVEpICYgKEVOU0VMSXxFTlJTRUxJfEVOQVVUT0FUTlApLAorICAgICAgICAgICAgIFNDU0lTRVEpOworICAgIGlmIChsYXN0cGhhc2UgPT0gUF9NRVNHT1VUKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgbWVzc2FnZTsKKworICAgICAgbWVzc2FnZSA9IGFpY19pbmIocCwgU0lOREVYKTsKKworICAgICAgaWYgKChtZXNzYWdlID09IE1TR19BQk9SVCkgfHwgKG1lc3NhZ2UgPT0gTVNHX0FCT1JUX1RBRykpCisgICAgICB7CisgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX0FCT1JUX1BST0NFU1MpCisgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiU0NCICVkIGFib3J0IGRlbGl2ZXJlZC5cbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICBDVExfT0ZfU0NCKHNjYiksIHNjYi0+aHNjYi0+dGFnKTsKKyAgICAgICAgYWljN3h4eF9yZXNldF9kZXZpY2UocCwgdGFyZ2V0LCBjaGFubmVsLCBBTExfTFVOUywKKyAgICAgICAgICAgICAgICAobWVzc2FnZSA9PSBNU0dfQUJPUlQpID8gU0NCX0xJU1RfTlVMTCA6IHNjYi0+aHNjYi0+dGFnICk7CisgICAgICAgIGFpYzd4eHhfcnVuX2RvbmVfcXVldWUocCwgVFJVRSk7CisgICAgICAgIHNjYiA9IE5VTEw7CisgICAgICAgIHByaW50ZXJyb3IgPSAwOworICAgICAgfQorICAgICAgZWxzZSBpZiAobWVzc2FnZSA9PSBNU0dfQlVTX0RFVl9SRVNFVCkKKyAgICAgIHsKKyAgICAgICAgYWljN3h4eF9oYW5kbGVfZGV2aWNlX3Jlc2V0KHAsIHRhcmdldCwgY2hhbm5lbCk7CisgICAgICAgIHNjYiA9IE5VTEw7CisgICAgICAgIHByaW50ZXJyb3IgPSAwOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIChzY2IgIT0gTlVMTCkgJiYgKHNjYi0+ZmxhZ3MgJiBTQ0JfRFRSX1NDQikgKSAKKyAgICB7CisgICAgICAvKgorICAgICAgICogSG1tbS4uLmVycm9yIGR1cmluZyBhIG5lZ290aWF0aW9uIGNvbW1hbmQuICBFaXRoZXIgd2UgaGF2ZSBhCisgICAgICAgKiBib3JrZW4gYnVzLCBvciB0aGUgZGV2aWNlIGRvZXNuJ3QgbGlrZSBvdXIgbmVnb3RpYXRpb24gbWVzc2FnZS4KKyAgICAgICAqIFNpbmNlIHdlIGNoZWNrIHRoZSBJTlFVSVJZIGRhdGEgb2YgYSBkZXZpY2UgYmVmb3JlIHNlbmRpbmcgaXQKKyAgICAgICAqIG5lZ290aWF0aW9uIG1lc3NhZ2VzLCBhc3N1bWUgdGhlIGJ1cyBpcyBib3JrZW4gZm9yIHdoYXRldmVyCisgICAgICAgKiByZWFzb24uICBDb21wbGV0ZSB0aGUgY29tbWFuZC4KKyAgICAgICAqLworICAgICAgcHJpbnRlcnJvciA9IDA7CisgICAgICBhaWM3eHh4X3Jlc2V0X2RldmljZShwLCB0YXJnZXQsIGNoYW5uZWwsIEFMTF9MVU5TLCBzY2ItPmhzY2ItPnRhZyk7CisgICAgICBhaWM3eHh4X3J1bl9kb25lX3F1ZXVlKHAsIFRSVUUpOworICAgICAgc2NiID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHByaW50ZXJyb3IgIT0gMCkKKyAgICB7CisgICAgICBpZiAoc2NiICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdGFnOworCisgICAgICAgIGlmICgoc2NiLT5oc2NiLT5jb250cm9sICYgVEFHX0VOQikgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHRhZyA9IHNjYi0+aHNjYi0+dGFnOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHRhZyA9IFNDQl9MSVNUX05VTEw7CisgICAgICAgIH0KKyAgICAgICAgYWljN3h4eF9yZXNldF9kZXZpY2UocCwgdGFyZ2V0LCBjaGFubmVsLCBBTExfTFVOUywgdGFnKTsKKyAgICAgICAgYWljN3h4eF9ydW5fZG9uZV9xdWV1ZShwLCBUUlVFKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWljN3h4eF9yZXNldF9kZXZpY2UocCwgdGFyZ2V0LCBjaGFubmVsLCBBTExfTFVOUywgU0NCX0xJU1RfTlVMTCk7CisgICAgICAgIGFpYzd4eHhfcnVuX2RvbmVfcXVldWUocCwgVFJVRSk7CisgICAgICB9CisgICAgICBwcmludGsoSU5GT19MRUFEICJVbmV4cGVjdGVkIGJ1c2ZyZWUsIExBU1RQSEFTRSA9IDB4JXgsICIKKyAgICAgICAgICAgICAiU0VRQUREUiA9IDB4JXhcbiIsIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwgLTEsIGxhc3RwaGFzZSwKKyAgICAgICAgICAgICAoYWljX2luYihwLCBTRVFBRERSMSkgPDwgOCkgfCBhaWNfaW5iKHAsIFNFUUFERFIwKSk7CisgICAgICBzY2IgPSBOVUxMOworICAgIH0KKyAgICBhaWNfb3V0YihwLCBNU0dfTk9PUCwgTVNHX09VVCk7CisgICAgYWljX291dGIocCwgYWljX2luYihwLCBTSU1PREUxKSAmIH4oRU5CVVNGUkVFfEVOUkVRSU5JVCksCisgICAgICBTSU1PREUxKTsKKyAgICBwLT5mbGFncyAmPSB+QUhDX0hBTkRMSU5HX1JFUUlOSVRTOworICAgIGFpY19vdXRiKHAsIENMUkJVU0ZSRUUsIENMUlNJTlQxKTsKKyAgICBhaWNfb3V0YihwLCBDTFJTQ1NJSU5ULCBDTFJJTlQpOworICAgIHJlc3RhcnRfc2VxdWVuY2VyKHApOworICAgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIFRSVUUpOworICB9CisgIGVsc2UgaWYgKChzdGF0dXMgJiBTRUxUTykgIT0gMCkKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgc2NicHRyOworICAgIHVuc2lnbmVkIGNoYXIgbmV4dHNjYjsKKyAgICBTY3NpX0NtbmQgKmNtZDsKKworICAgIHNjYnB0ciA9IGFpY19pbmIocCwgV0FJVElOR19TQ0JIKTsKKyAgICBpZiAoc2NicHRyID4gcC0+c2NiX2RhdGEtPm1heGhzY2JzKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBJJ20gc3RpbGwgdHJ5aW5nIHRvIHRyYWNrIGRvd24gZXhhY3RseSBob3cgdGhpcyBoYXBwZW5zLCBidXQgdW50aWwKKyAgICAgICAqIEkgZmluZCBpdCwgdGhpcyBjb2RlIHdpbGwgbWFrZSBzdXJlIHdlIGFyZW4ndCBwYXNzaW5nIGJvZ3VzIHZhbHVlcworICAgICAgICogaW50byB0aGUgU0NCUFRSIHJlZ2lzdGVyLCBldmVuIGlmIHRoYXQgcmVnaXN0ZXIgd2lsbCBqdXN0IHdyYXAKKyAgICAgICAqIHRoaW5ncyBhcm91bmQsIHdlIHN0aWxsIGRvbid0IGxpa2UgaGF2aW5nIG91dCBvZiByYW5nZSB2YXJpYWJsZXMuCisgICAgICAgKgorICAgICAgICogTk9URTogRG9uJ3QgY2hlY2sgdGhlIGFpYzd4eHhfdmVyYm9zZSB2YXJpYWJsZSwgSSB3YW50IHRoaXMgbWVzc2FnZQorICAgICAgICogdG8gYWx3YXlzIGJlIGRpc3BsYXllZC4KKyAgICAgICAqLworICAgICAgcHJpbnRrKElORk9fTEVBRCAiSW52YWxpZCBXQUlUSU5HX1NDQkggdmFsdWUgJWQsIGltcHJvdmlzaW5nLlxuIiwKKyAgICAgICAgICAgICBwLT5ob3N0X25vLCAtMSwgLTEsIC0xLCBzY2JwdHIpOworICAgICAgaWYgKHAtPnNjYl9kYXRhLT5tYXhoc2NicyA+IDQpCisgICAgICAgIHNjYnB0ciAmPSAocC0+c2NiX2RhdGEtPm1heGhzY2JzIC0gMSk7CisgICAgICBlbHNlCisgICAgICAgIHNjYnB0ciAmPSAweDAzOworICAgIH0KKyAgICBhaWNfb3V0YihwLCBzY2JwdHIsIFNDQlBUUik7CisgICAgc2NiX2luZGV4ID0gYWljX2luYihwLCBTQ0JfVEFHKTsKKworICAgIHNjYiA9IE5VTEw7CisgICAgaWYgKHNjYl9pbmRleCA8IHAtPnNjYl9kYXRhLT5udW1zY2JzKQorICAgIHsKKyAgICAgIHNjYiA9IHAtPnNjYl9kYXRhLT5zY2JfYXJyYXlbc2NiX2luZGV4XTsKKyAgICAgIGlmICgoc2NiLT5mbGFncyAmIFNDQl9BQ1RJVkUpID09IDApCisgICAgICB7CisgICAgICAgIHNjYiA9IE5VTEw7CisgICAgICB9CisgICAgfQorICAgIGlmIChzY2IgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGsoV0FSTl9MRUFEICJSZWZlcmVuY2VkIFNDQiAlZCBub3QgdmFsaWQgZHVyaW5nIFNFTFRPLlxuIiwKKyAgICAgICAgICAgICBwLT5ob3N0X25vLCAtMSwgLTEsIC0xLCBzY2JfaW5kZXgpOworICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiICAgICAgICBTQ1NJU0VRID0gMHgleCBTRVFBRERSID0gMHgleCBTU1RBVDAgPSAweCV4ICIKKyAgICAgICAgICAgICAiU1NUQVQxID0gMHgleFxuIiwgYWljX2luYihwLCBTQ1NJU0VRKSwKKyAgICAgICAgICAgICBhaWNfaW5iKHAsIFNFUUFERFIwKSB8IChhaWNfaW5iKHAsIFNFUUFERFIxKSA8PCA4KSwKKyAgICAgICAgICAgICBhaWNfaW5iKHAsIFNTVEFUMCksIGFpY19pbmIocCwgU1NUQVQxKSk7CisgICAgICBpZiAoYWljN3h4eF9wYW5pY19vbl9hYm9ydCkKKyAgICAgICAgYWljN3h4eF9wYW5pY19hYm9ydChwLCBOVUxMKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGNtZCA9IHNjYi0+Y21kOworICAgICAgY21kLT5yZXN1bHQgPSAoRElEX1RJTUVfT1VUIDw8IDE2KTsKKworICAgICAgLyoKKyAgICAgICAqIENsZWFyIG91dCB0aGlzIGhhcmR3YXJlIFNDQgorICAgICAgICovCisgICAgICBhaWNfb3V0YihwLCAwLCBTQ0JfQ09OVFJPTCk7CisKKyAgICAgIC8qCisgICAgICAgKiBDbGVhciBvdXQgYSBmZXcgdmFsdWVzIGluIHRoZSBjYXJkIHRoYXQgYXJlIGluIGFuIHVuZGV0ZXJtaW5lZAorICAgICAgICogc3RhdGUuCisgICAgICAgKi8KKyAgICAgIGFpY19vdXRiKHAsIE1TR19OT09QLCBNU0dfT1VUKTsKKworICAgICAgLyoKKyAgICAgICAqIFNoaWZ0IHRoZSB3YWl0aW5nIGZvciBzZWxlY3Rpb24gcXVldWUgZm9yd2FyZAorICAgICAgICovCisgICAgICBuZXh0c2NiID0gYWljX2luYihwLCBTQ0JfTkVYVCk7CisgICAgICBhaWNfb3V0YihwLCBuZXh0c2NiLCBXQUlUSU5HX1NDQkgpOworCisgICAgICAvKgorICAgICAgICogUHV0IHRoaXMgU0NCIGJhY2sgb24gdGhlIGZyZWUgbGlzdC4KKyAgICAgICAqLworICAgICAgYWljN3h4eF9hZGRfY3Vyc2NiX3RvX2ZyZWVfbGlzdChwKTsKKyNpZmRlZiBBSUM3WFhYX1ZFUkJPU0VfREVCVUdHSU5HCisgICAgICBpZiAoYWljN3h4eF92ZXJib3NlID4gMHhmZmZmKQorICAgICAgICBwcmludGsoSU5GT19MRUFEICJTZWxlY3Rpb24gVGltZW91dC5cbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisjZW5kaWYKKyAgICAgIGlmIChzY2ItPmZsYWdzICYgU0NCX1FVRVVFRF9BQk9SVCkKKyAgICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogV2Uga25vdyB0aGF0IHRoaXMgcGFydGljdWxhciBTQ0IgaGFkIHRvIGJlIHRoZSBxdWV1ZWQgYWJvcnQgc2luY2UKKyAgICAgICAgICogdGhlIGRpc2Nvbm5lY3RlZCBTQ0Igd291bGQgaGF2ZSBnb3R0ZW4gYSByZWNvbm5lY3QgaW5zdGVhZC4KKyAgICAgICAgICogV2hhdCB3ZSBuZWVkIHRvIGRvIHRoZW4gaXMgdG8gbGV0IHRoZSBjb21tYW5kIHRpbWVvdXQgYWdhaW4gc28KKyAgICAgICAgICogd2UgZ2V0IGEgcmVzZXQgc2luY2UgdGhpcyBhYm9ydCBqdXN0IGZhaWxlZC4KKyAgICAgICAgICovCisgICAgICAgIGNtZC0+cmVzdWx0ID0gMDsKKyAgICAgICAgc2NiID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgICAgLyoKKyAgICAgKiBLZWVwIHRoZSBzZXF1ZW5jZXIgZnJvbSB0cnlpbmcgdG8gcmVzdGFydCBhbnkgc2VsZWN0aW9ucworICAgICAqLworICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0NTSVNFUSkgJiB+RU5TRUxPLCBTQ1NJU0VRKTsKKyAgICAvKgorICAgICAqIE1ha2Ugc3VyZSB0aGUgZGF0YSBiaXRzIG9uIHRoZSBidXMgYXJlIHJlbGVhc2VkCisgICAgICogRG9uJ3QgZG8gdGhpcyBvbiA3NzcwIGNoaXBzZXRzLCBpdCBtYWtlcyB0aGVtIGdpdmUgdXMKKyAgICAgKiBhIEJSS0FERFJJTlQgYW5kIGtpbGxzIHRoZSBjYXJkLgorICAgICAqLworICAgIGlmKCAocC0+Y2hpcCAmIH5BSENfQ0hJUElEX01BU0spID09IEFIQ19QQ0kgKQorICAgICAgYWljX291dGIocCwgMCwgU0NTSUJVU0wpOworCisgICAgLyoKKyAgICAgKiBEZWxheSBmb3IgdGhlIHNlbGVjdGlvbiB0aW1lb3V0IGRlbGF5IHBlcmlvZCB0aGVuIHN0b3AgdGhlIHNlbGVjdGlvbgorICAgICAqLworICAgIHVkZWxheSgzMDEpOworICAgIGFpY19vdXRiKHAsIENMUlNFTElOR08sIENMUlNJTlQwKTsKKyAgICAvKgorICAgICAqIENsZWFyIG91dCBhbGwgdGhlIGludGVycnVwdCBzdGF0dXMgYml0cworICAgICAqLworICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0lNT0RFMSkgJiB+KEVOUkVRSU5JVHxFTkJVU0ZSRUUpLCBTSU1PREUxKTsKKyAgICBwLT5mbGFncyAmPSB+QUhDX0hBTkRMSU5HX1JFUUlOSVRTOworICAgIGFpY19vdXRiKHAsIENMUlNFTFRJTUVPIHwgQ0xSQlVTRlJFRSwgQ0xSU0lOVDEpOworICAgIGFpY19vdXRiKHAsIENMUlNDU0lJTlQsIENMUklOVCk7CisgICAgLyoKKyAgICAgKiBSZXN0YXJ0aW5nIHRoZSBzZXF1ZW5jZXIgd2lsbCBzdG9wIHRoZSBzZWxlY3Rpb24gYW5kIG1ha2Ugc3VyZSBkZXZpY2VzCisgICAgICogYXJlIGFsbG93ZWQgdG8gcmVzZWxlY3QgaW4uCisgICAgICovCisgICAgcmVzdGFydF9zZXF1ZW5jZXIocCk7CisgICAgdW5wYXVzZV9zZXF1ZW5jZXIocCwgVFJVRSk7CisgIH0KKyAgZWxzZSBpZiAoc2NiID09IE5VTEwpCisgIHsKKyAgICBwcmludGsoV0FSTl9MRUFEICJhaWM3eHh4X2lzciAtIHJlZmVyZW5jZWQgc2NiIG5vdCB2YWxpZCAiCisgICAgICAgICAgICJkdXJpbmcgc2NzaWludCAweCV4IHNjYiglZClcbiIKKyAgICAgICAgICAgIiAgICAgIFNJTU9ERTAgMHgleCwgU0lNT0RFMSAweCV4LCBTU1RBVDAgMHgleCwgU0VRQUREUiAweCV4XG4iLAorICAgICAgICAgICBwLT5ob3N0X25vLCAtMSwgLTEsIC0xLCBzdGF0dXMsIHNjYl9pbmRleCwgYWljX2luYihwLCBTSU1PREUwKSwKKyAgICAgICAgICAgYWljX2luYihwLCBTSU1PREUxKSwgYWljX2luYihwLCBTU1RBVDApLAorICAgICAgICAgICAoYWljX2luYihwLCBTRVFBRERSMSkgPDwgOCkgfCBhaWNfaW5iKHAsIFNFUUFERFIwKSk7CisgICAgLyoKKyAgICAgKiBUdXJuIG9mZiB0aGUgaW50ZXJydXB0IGFuZCBzZXQgc3RhdHVzIHRvIHplcm8sIHNvIHRoYXQgaXQKKyAgICAgKiBmYWxscyB0aHJvdWdoIHRoZSByZXN0IG9mIHRoZSBTQ1NJSU5UIGNvZGUuCisgICAgICovCisgICAgYWljX291dGIocCwgc3RhdHVzLCBDTFJTSU5UMSk7CisgICAgYWljX291dGIocCwgQ0xSU0NTSUlOVCwgQ0xSSU5UKTsKKyAgICB1bnBhdXNlX3NlcXVlbmNlcihwLCAvKiB1bnBhdXNlIGFsd2F5cyAqLyBUUlVFKTsKKyAgICBzY2IgPSBOVUxMOworICB9CisgIGVsc2UgaWYgKHN0YXR1cyAmIFNDU0lQRVJSKQorICB7CisgICAgLyoKKyAgICAgKiBEZXRlcm1pbmUgdGhlIGJ1cyBwaGFzZSBhbmQgcXVldWUgYW4gYXBwcm9wcmlhdGUgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBjaGFyICAqcGhhc2U7CisgICAgU2NzaV9DbW5kICpjbWQ7CisgICAgdW5zaWduZWQgY2hhciBtZXNnX291dCA9IE1TR19OT09QOworICAgIHVuc2lnbmVkIGNoYXIgbGFzdHBoYXNlID0gYWljX2luYihwLCBMQVNUUEhBU0UpOworICAgIHVuc2lnbmVkIGNoYXIgc3N0YXQyID0gYWljX2luYihwLCBTU1RBVDIpOworCisgICAgY21kID0gc2NiLT5jbWQ7CisgICAgc3dpdGNoIChsYXN0cGhhc2UpCisgICAgeworICAgICAgY2FzZSBQX0RBVEFPVVQ6CisgICAgICAgIHBoYXNlID0gIkRhdGEtT3V0IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBfREFUQUlOOgorICAgICAgICBwaGFzZSA9ICJEYXRhLUluIjsKKyAgICAgICAgbWVzZ19vdXQgPSBNU0dfSU5JVElBVE9SX0RFVF9FUlI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQX0NPTU1BTkQ6CisgICAgICAgIHBoYXNlID0gIkNvbW1hbmQiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUF9NRVNHT1VUOgorICAgICAgICBwaGFzZSA9ICJNZXNzYWdlLU91dCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQX1NUQVRVUzoKKyAgICAgICAgcGhhc2UgPSAiU3RhdHVzIjsKKyAgICAgICAgbWVzZ19vdXQgPSBNU0dfSU5JVElBVE9SX0RFVF9FUlI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQX01FU0dJTjoKKyAgICAgICAgcGhhc2UgPSAiTWVzc2FnZS1JbiI7CisgICAgICAgIG1lc2dfb3V0ID0gTVNHX1BBUklUWV9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBwaGFzZSA9ICJ1bmtub3duIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBIHBhcml0eSBlcnJvciBoYXMgb2NjdXJyZWQgZHVyaW5nIGEgZGF0YQorICAgICAqIHRyYW5zZmVyIHBoYXNlLiBGbGFnIGl0IGFuZCBjb250aW51ZS4KKyAgICAgKi8KKyAgICBpZiggKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMykgJiYgCisgICAgICAgIChhaWNfaW5iKHAsIFNDU0lSQVRFKSAmIEFIQ19TWU5DUkFURV9DUkMpICYmCisgICAgICAgIChsYXN0cGhhc2UgPT0gUF9EQVRBSU4pICkKKyAgICB7CisgICAgICBwcmludGsoV0FSTl9MRUFEICJDUkMgZXJyb3IgZHVyaW5nICVzIHBoYXNlLlxuIiwKKyAgICAgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYiksIHBoYXNlKTsKKyAgICAgIGlmKHNzdGF0MiAmIENSQ1ZBTEVSUikKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKFdBUk5fTEVBRCAiICBDUkMgZXJyb3IgaW4gaW50ZXJtZWRpYXRlIENSQyBwYWNrZXQuXG4iLAorICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgIH0KKyAgICAgIGlmKHNzdGF0MiAmIENSQ0VOREVSUikKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKFdBUk5fTEVBRCAiICBDUkMgZXJyb3IgaW4gZW5kaW5nIENSQyBwYWNrZXQuXG4iLAorICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgIH0KKyAgICAgIGlmKHNzdGF0MiAmIENSQ1JFUUVSUikKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKFdBUk5fTEVBRCAiICBUYXJnZXQgaW5jb3JyZWN0bHkgcmVxdWVzdGVkIGEgQ1JDIHBhY2tldC5cbiIsCisgICAgICAgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYikpOworICAgICAgfQorICAgICAgaWYoc3N0YXQyICYgRFVBTF9FREdFX0VSUk9SKQorICAgICAgeworICAgICAgICBwcmludGsoV0FSTl9MRUFEICIgIER1YWwgRWRnZSB0cmFuc21pc3Npb24gZXJyb3IuXG4iLAorICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggKGxhc3RwaGFzZSA9PSBQX01FU0dPVVQpICYmCisgICAgICAgICAgICAgKHNjYi0+ZmxhZ3MgJiBTQ0JfTVNHT1VUX1BQUikgKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBBcyBwZXIgdGhlIGRyYWZ0IHNwZWNzLCBhbnkgZGV2aWNlIGNhcGFibGUgb2Ygc3VwcG9ydGluZyBhbnkgb2YKKyAgICAgICAqIHRoZSBvcHRpb24gdmFsdWVzIG90aGVyIHRoYW4gMCBhcmUgbm90IGFsbG93ZWQgdG8gcmVqZWN0IHRoZQorICAgICAgICogUFBSIG1lc3NhZ2UuICBJbnN0ZWFkLCB0aGV5IG11c3QgbmVnb3RpYXRlIG91dCB3aGF0IHRoZXkgZG8KKyAgICAgICAqIHN1cHBvcnQgaW5zdGVhZCBvZiByZWplY3Rpbmcgb3VyIG9mZmVyaW5nIG9yIGVsc2UgdGhleSBjYXVzZQorICAgICAgICogYSBwYXJpdHkgZXJyb3IgZHVyaW5nIG1zZ19vdXQgcGhhc2UgdG8gc2lnbmFsIHRoYXQgdGhleSBkb24ndAorICAgICAgICogbGlrZSBvdXIgc2V0dGluZ3MuCisgICAgICAgKi8KKyAgICAgIGFpY19kZXYgPSBBSUNfREVWKHNjYi0+Y21kKTsKKyAgICAgIGFpY19kZXYtPm5lZWRwcHIgPSBhaWNfZGV2LT5uZWVkcHByX2NvcHkgPSAwOworICAgICAgYWljN3h4eF9zZXRfd2lkdGgocCwgc2NiLT5jbWQtPmRldmljZS0+aWQsIHNjYi0+Y21kLT5kZXZpY2UtPmNoYW5uZWwsIHNjYi0+Y21kLT5kZXZpY2UtPmx1biwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAoQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfQ1VSfEFIQ19UUkFOU19RVUlURSksCisJCQlhaWNfZGV2KTsKKyAgICAgIGFpYzd4eHhfc2V0X3N5bmNyYXRlKHAsIE5VTEwsIHNjYi0+Y21kLT5kZXZpY2UtPmlkLCBzY2ItPmNtZC0+ZGV2aWNlLT5jaGFubmVsLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfQ1VSfEFIQ19UUkFOU19RVUlURSwKKwkJCSAgIGFpY19kZXYpOworICAgICAgYWljX2Rldi0+Z29hbC5vcHRpb25zID0gMDsKKyAgICAgIHNjYi0+ZmxhZ3MgJj0gflNDQl9NU0dPVVRfQklUUzsKKyAgICAgIGlmKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKQorICAgICAgeworICAgICAgICBwcmludGsoSU5GT19MRUFEICJwYXJpdHkgZXJyb3IgZHVyaW5nIFBQUiBtZXNzYWdlLCByZXZlcnRpbmcgIgorICAgICAgICAgICAgICAgInRvIFdEVFIvU0RUUlxuIiwgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgIH0KKyAgICAgIGlmICggYWljX2Rldi0+Z29hbC53aWR0aCApCisgICAgICB7CisgICAgICAgIGFpY19kZXYtPm5lZWR3ZHRyID0gYWljX2Rldi0+bmVlZHdkdHJfY29weSA9IDE7CisgICAgICB9CisgICAgICBpZiAoIGFpY19kZXYtPmdvYWwub2Zmc2V0ICkKKyAgICAgIHsKKyAgICAgICAgaWYoIGFpY19kZXYtPmdvYWwucGVyaW9kIDw9IDkgKQorICAgICAgICB7CisgICAgICAgICAgYWljX2Rldi0+Z29hbC5wZXJpb2QgPSAxMDsKKyAgICAgICAgfQorICAgICAgICBhaWNfZGV2LT5uZWVkc2R0ciA9IGFpY19kZXYtPm5lZWRzZHRyX2NvcHkgPSAxOworICAgICAgfQorICAgICAgc2NiID0gTlVMTDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdlJ3ZlIHNldCB0aGUgaGFyZHdhcmUgdG8gYXNzZXJ0IEFUTiBpZiB3ZSBnZXQgYSBwYXJpdHkKKyAgICAgKiBlcnJvciBvbiAiaW4iIHBoYXNlcywgc28gYWxsIHdlIG5lZWQgdG8gZG8gaXMgc3R1ZmYgdGhlCisgICAgICogbWVzc2FnZSBidWZmZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnZS4gICJJbiIgcGhhc2VzCisgICAgICogaGF2ZSBzZXQgbWVzZ19vdXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gTVNHX05PUC4KKyAgICAgKi8KKyAgICBpZiAobWVzZ19vdXQgIT0gTVNHX05PT1ApCisgICAgeworICAgICAgYWljX291dGIocCwgbWVzZ19vdXQsIE1TR19PVVQpOworICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQ1NJU0lHSSkgfCBBVE5PLCBTQ1NJU0lHTyk7CisgICAgICBzY2IgPSBOVUxMOworICAgIH0KKyAgICBhaWNfb3V0YihwLCBDTFJTQ1NJUEVSUiwgQ0xSU0lOVDEpOworICAgIGFpY19vdXRiKHAsIENMUlNDU0lJTlQsIENMUklOVCk7CisgICAgdW5wYXVzZV9zZXF1ZW5jZXIocCwgLyogdW5wYXVzZV9hbHdheXMgKi8gVFJVRSk7CisgIH0KKyAgZWxzZSBpZiAoIChzdGF0dXMgJiBSRVFJTklUKSAmJgorICAgICAgICAgICAgKHAtPmZsYWdzICYgQUhDX0hBTkRMSU5HX1JFUUlOSVRTKSApCisgIHsKKyNpZmRlZiBBSUM3WFhYX1ZFUkJPU0VfREVCVUdHSU5HCisgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSA+IDB4ZmZmZikKKyAgICAgIHByaW50ayhJTkZPX0xFQUQgIkhhbmRsaW5nIFJFUUlOSVQsIFNTVEFUMT0weCV4LlxuIiwgcC0+aG9zdF9ubywKKyAgICAgICAgICAgICBDVExfT0ZfU0NCKHNjYiksIGFpY19pbmIocCwgU1NUQVQxKSk7CisjZW5kaWYKKyAgICBhaWM3eHh4X2hhbmRsZV9yZXFpbml0KHAsIHNjYik7CisgICAgcmV0dXJuOworICB9CisgIGVsc2UKKyAgeworICAgIC8qCisgICAgICogV2UgZG9uJ3Qga25vdyB3aGF0J3MgZ29pbmcgb24uIFR1cm4gb2ZmIHRoZQorICAgICAqIGludGVycnVwdCBzb3VyY2UgYW5kIHRyeSB0byBjb250aW51ZS4KKyAgICAgKi8KKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9TQ1NJSU5UKQorICAgICAgcHJpbnRrKElORk9fTEVBRCAiVW5rbm93biBTQ1NJSU5UIHN0YXR1cywgU1NUQVQxKDB4JXgpLlxuIiwKKyAgICAgICAgcC0+aG9zdF9ubywgLTEsIC0xLCAtMSwgc3RhdHVzKTsKKyAgICBhaWNfb3V0YihwLCBzdGF0dXMsIENMUlNJTlQxKTsKKyAgICBhaWNfb3V0YihwLCBDTFJTQ1NJSU5ULCBDTFJJTlQpOworICAgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIC8qIHVucGF1c2UgYWx3YXlzICovIFRSVUUpOworICAgIHNjYiA9IE5VTEw7CisgIH0KKyAgaWYgKHNjYiAhPSBOVUxMKQorICB7CisgICAgYWljN3h4eF9kb25lKHAsIHNjYik7CisgIH0KK30KKworI2lmZGVmIEFJQzdYWFhfVkVSQk9TRV9ERUJVR0dJTkcKK3N0YXRpYyB2b2lkCithaWM3eHh4X2NoZWNrX3NjYnMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgY2hhciAqYnVmZmVyKQoreworICB1bnNpZ25lZCBjaGFyIHNhdmVkX3NjYnB0ciwgZnJlZV9zY2JoLCBkaXNfc2NiaCwgd2FpdF9zY2JoLCB0ZW1wOworICBpbnQgaSwgYm9ndXMsIGxvc3Q7CisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHNjYl9zdGF0dXNbQUlDN1hYWF9NQVhTQ0JdOworCisjZGVmaW5lIFNDQl9OT19MSVNUIDAKKyNkZWZpbmUgU0NCX0ZSRUVfTElTVCAxCisjZGVmaW5lIFNDQl9XQUlUSU5HX0xJU1QgMgorI2RlZmluZSBTQ0JfRElTQ09OTkVDVEVEX0xJU1QgNAorI2RlZmluZSBTQ0JfQ1VSUkVOVExZX0FDVElWRSA4CisKKyAgLyoKKyAgICogTm90ZSwgdGhlc2UgY2hlY2tzIHdpbGwgZmFpbCBvbiBhIHJlZ3VsYXIgYmFzaXMgb25jZSB0aGUgbWFjaGluZSBtb3ZlcworICAgKiBiZXlvbmQgdGhlIGJ1cyBzY2FuIHBoYXNlLiAgVGhlIHByb2JsZW0gaXMgcmFjZSBjb25kaXRpb25zIGNvbmNlcm5pbmcKKyAgICogdGhlIHNjYnMgYW5kIHdoZXJlIHRoZXkgYXJlIGxpbmtlZCBpbi4gIFdoZW4geW91IGhhdmUgMzAgb3Igc28gY29tbWFuZHMKKyAgICogb3V0c3RhbmRpbmcgb24gdGhlIGJ1cywgYW5kIHJ1biB0aGlzIHR3aWNlIHdpdGggZXZlcnkgaW50ZXJydXB0LCB0aGUKKyAgICogY2hhbmNlcyBnZXQgcHJldHR5IGdvb2QgdGhhdCB5b3UnbGwgY2F0Y2ggdGhlIHNlcXVlbmNlciB3aXRoIGFuIFNDQgorICAgKiBvbmx5IHBhcnRpYWxseSBsaW5rZWQgaW4uICBUaGVyZWZvcmUsIG9uY2Ugd2UgcGFzcyB0aGUgc2NhbiBwaGFzZQorICAgKiBvZiB0aGUgYnVzLCB3ZSByZWFsbHkgc2hvdWxkIGRpc2FibGUgdGhpcyBmdW5jdGlvbi4KKyAgICovCisgIGJvZ3VzID0gRkFMU0U7CisgIG1lbXNldCgmc2NiX3N0YXR1c1swXSwgMCwgc2l6ZW9mKHNjYl9zdGF0dXMpKTsKKyAgcGF1c2Vfc2VxdWVuY2VyKHApOworICBzYXZlZF9zY2JwdHIgPSBhaWNfaW5iKHAsIFNDQlBUUik7CisgIGlmIChzYXZlZF9zY2JwdHIgPj0gcC0+c2NiX2RhdGEtPm1heGhzY2JzKQorICB7CisgICAgcHJpbnRrKCJCb2d1cyBTQ0JQVFIgJWRcbiIsIHNhdmVkX3NjYnB0cik7CisgICAgYm9ndXMgPSBUUlVFOworICB9CisgIHNjYl9zdGF0dXNbc2F2ZWRfc2NicHRyXSA9IFNDQl9DVVJSRU5UTFlfQUNUSVZFOworICBmcmVlX3NjYmggPSBhaWNfaW5iKHAsIEZSRUVfU0NCSCk7CisgIGlmICggKGZyZWVfc2NiaCAhPSBTQ0JfTElTVF9OVUxMKSAmJgorICAgICAgIChmcmVlX3NjYmggPj0gcC0+c2NiX2RhdGEtPm1heGhzY2JzKSApCisgIHsKKyAgICBwcmludGsoIkJvZ3VzIEZSRUVfU0NCSCAlZFxuIiwgZnJlZV9zY2JoKTsKKyAgICBib2d1cyA9IFRSVUU7CisgIH0KKyAgZWxzZQorICB7CisgICAgdGVtcCA9IGZyZWVfc2NiaDsKKyAgICB3aGlsZSggKHRlbXAgIT0gU0NCX0xJU1RfTlVMTCkgJiYgKHRlbXAgPCBwLT5zY2JfZGF0YS0+bWF4aHNjYnMpICkKKyAgICB7CisgICAgICBpZihzY2Jfc3RhdHVzW3RlbXBdICYgMHgwNykKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKCJIU0NCICVkIG9uIG11bHRpcGxlIGxpc3RzLCBzdGF0dXMgMHglMDJ4IiwgdGVtcCwKKyAgICAgICAgICAgICAgIHNjYl9zdGF0dXNbdGVtcF0gfCBTQ0JfRlJFRV9MSVNUKTsKKyAgICAgICAgYm9ndXMgPSBUUlVFOworICAgICAgfQorICAgICAgc2NiX3N0YXR1c1t0ZW1wXSB8PSBTQ0JfRlJFRV9MSVNUOworICAgICAgYWljX291dGIocCwgdGVtcCwgU0NCUFRSKTsKKyAgICAgIHRlbXAgPSBhaWNfaW5iKHAsIFNDQl9ORVhUKTsKKyAgICB9CisgIH0KKworICBkaXNfc2NiaCA9IGFpY19pbmIocCwgRElTQ09OTkVDVEVEX1NDQkgpOworICBpZiAoIChkaXNfc2NiaCAhPSBTQ0JfTElTVF9OVUxMKSAmJgorICAgICAgIChkaXNfc2NiaCA+PSBwLT5zY2JfZGF0YS0+bWF4aHNjYnMpICkKKyAgeworICAgIHByaW50aygiQm9ndXMgRElTQ09OTkVDVEVEX1NDQkggJWRcbiIsIGRpc19zY2JoKTsKKyAgICBib2d1cyA9IFRSVUU7CisgIH0KKyAgZWxzZQorICB7CisgICAgdGVtcCA9IGRpc19zY2JoOworICAgIHdoaWxlKCAodGVtcCAhPSBTQ0JfTElTVF9OVUxMKSAmJiAodGVtcCA8IHAtPnNjYl9kYXRhLT5tYXhoc2NicykgKQorICAgIHsKKyAgICAgIGlmKHNjYl9zdGF0dXNbdGVtcF0gJiAweDA3KQorICAgICAgeworICAgICAgICBwcmludGsoIkhTQ0IgJWQgb24gbXVsdGlwbGUgbGlzdHMsIHN0YXR1cyAweCUwMngiLCB0ZW1wLAorICAgICAgICAgICAgICAgc2NiX3N0YXR1c1t0ZW1wXSB8IFNDQl9ESVNDT05ORUNURURfTElTVCk7CisgICAgICAgIGJvZ3VzID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIHNjYl9zdGF0dXNbdGVtcF0gfD0gU0NCX0RJU0NPTk5FQ1RFRF9MSVNUOworICAgICAgYWljX291dGIocCwgdGVtcCwgU0NCUFRSKTsKKyAgICAgIHRlbXAgPSBhaWNfaW5iKHAsIFNDQl9ORVhUKTsKKyAgICB9CisgIH0KKyAgCisgIHdhaXRfc2NiaCA9IGFpY19pbmIocCwgV0FJVElOR19TQ0JIKTsKKyAgaWYgKCAod2FpdF9zY2JoICE9IFNDQl9MSVNUX05VTEwpICYmCisgICAgICAgKHdhaXRfc2NiaCA+PSBwLT5zY2JfZGF0YS0+bWF4aHNjYnMpICkKKyAgeworICAgIHByaW50aygiQm9ndXMgV0FJVElOR19TQ0JIICVkXG4iLCB3YWl0X3NjYmgpOworICAgIGJvZ3VzID0gVFJVRTsKKyAgfQorICBlbHNlCisgIHsKKyAgICB0ZW1wID0gd2FpdF9zY2JoOworICAgIHdoaWxlKCAodGVtcCAhPSBTQ0JfTElTVF9OVUxMKSAmJiAodGVtcCA8IHAtPnNjYl9kYXRhLT5tYXhoc2NicykgKQorICAgIHsKKyAgICAgIGlmKHNjYl9zdGF0dXNbdGVtcF0gJiAweDA3KQorICAgICAgeworICAgICAgICBwcmludGsoIkhTQ0IgJWQgb24gbXVsdGlwbGUgbGlzdHMsIHN0YXR1cyAweCUwMngiLCB0ZW1wLAorICAgICAgICAgICAgICAgc2NiX3N0YXR1c1t0ZW1wXSB8IFNDQl9XQUlUSU5HX0xJU1QpOworICAgICAgICBib2d1cyA9IFRSVUU7CisgICAgICB9CisgICAgICBzY2Jfc3RhdHVzW3RlbXBdIHw9IFNDQl9XQUlUSU5HX0xJU1Q7CisgICAgICBhaWNfb3V0YihwLCB0ZW1wLCBTQ0JQVFIpOworICAgICAgdGVtcCA9IGFpY19pbmIocCwgU0NCX05FWFQpOworICAgIH0KKyAgfQorCisgIGxvc3Q9MDsKKyAgZm9yKGk9MDsgaSA8IHAtPnNjYl9kYXRhLT5tYXhoc2NiczsgaSsrKQorICB7CisgICAgYWljX291dGIocCwgaSwgU0NCUFRSKTsKKyAgICB0ZW1wID0gYWljX2luYihwLCBTQ0JfTkVYVCk7CisgICAgaWYgKCAoKHRlbXAgIT0gU0NCX0xJU1RfTlVMTCkgJiYKKyAgICAgICAgICAodGVtcCA+PSBwLT5zY2JfZGF0YS0+bWF4aHNjYnMpKSApCisgICAgeworICAgICAgcHJpbnRrKCJIU0NCICVkIGJhZCwgU0NCX05FWFQgaW52YWxpZCglZCkuXG4iLCBpLCB0ZW1wKTsKKyAgICAgIGJvZ3VzID0gVFJVRTsKKyAgICB9CisgICAgaWYgKCB0ZW1wID09IGkgKQorICAgIHsKKyAgICAgIHByaW50aygiSFNDQiAlZCBiYWQsIFNDQl9ORVhUIHBvaW50cyB0byBzZWxmLlxuIiwgaSk7CisgICAgICBib2d1cyA9IFRSVUU7CisgICAgfQorICAgIGlmIChzY2Jfc3RhdHVzW2ldID09IDApCisgICAgICBsb3N0Kys7CisgICAgaWYgKGxvc3QgPiAxKQorICAgIHsKKyAgICAgIHByaW50aygiVG9vIG1hbnkgbG9zdCBzY2JzLlxuIik7CisgICAgICBib2d1cz1UUlVFOworICAgIH0KKyAgfQorICBhaWNfb3V0YihwLCBzYXZlZF9zY2JwdHIsIFNDQlBUUik7CisgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIEZBTFNFKTsKKyAgaWYgKGJvZ3VzKQorICB7CisgICAgcHJpbnRrKCJCb2d1cyBwYXJhbWV0ZXJzIGZvdW5kIGluIGNhcmQgU0NCIGFycmF5IHN0cnVjdHVyZXMuXG4iKTsKKyAgICBwcmludGsoIiVzXG4iLCBidWZmZXIpOworICAgIGFpYzd4eHhfcGFuaWNfYWJvcnQocCwgTlVMTCk7CisgIH0KKyAgcmV0dXJuOworfQorI2VuZGlmCisKKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2hhbmRsZV9jb21tYW5kX2NvbXBsZXRpb25faW50cgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTQ1NJIGNvbW1hbmQgY29tcGxldGlvbiBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfaGFuZGxlX2NvbW1hbmRfY29tcGxldGlvbl9pbnRyKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisgIHN0cnVjdCBhaWM3eHh4X3NjYiAqc2NiID0gTlVMTDsKKyAgc3RydWN0IGFpY19kZXZfZGF0YSAqYWljX2RldjsKKyAgU2NzaV9DbW5kICpjbWQ7CisgIHVuc2lnbmVkIGNoYXIgc2NiX2luZGV4LCB0aW5kZXg7CisKKyNpZmRlZiBBSUM3WFhYX1ZFUkJPU0VfREVCVUdHSU5HCisgIGlmKCAocC0+aXNyX2NvdW50IDwgMTYpICYmIChhaWM3eHh4X3ZlcmJvc2UgPiAweGZmZmYpICkKKyAgICBwcmludGsoSU5GT19MRUFEICJDb21tYW5kIENvbXBsZXRlIEludC5cbiIsIHAtPmhvc3Rfbm8sIC0xLCAtMSwgLTEpOworI2VuZGlmCisgICAgCisgIC8qCisgICAqIFJlYWQgdGhlIElOVFNUQVQgbG9jYXRpb24gYWZ0ZXIgY2xlYXJpbmcgdGhlIENNRElOVCBiaXQuICBUaGlzIGZvcmNlcworICAgKiBhbnkgcG9zdGVkIFBDSSB3cml0ZXMgdG8gZmx1c2ggdG8gbWVtb3J5LiAgR2VyYXJkIFJvdWRpZXIgc3VnZ2VzdGVkCisgICAqIHRoaXMgZml4IHRvIHRoZSBwb3NzaWJsZSByYWNlIG9mIGNsZWFyaW5nIHRoZSBDTURJTlQgYml0IGJ1dCBub3QKKyAgICogaGF2aW5nIGFsbCBjb21tYW5kIGJ5dGVzIGZsdXNoZWQgb250byB0aGUgcW91dGZpZm8uCisgICAqLworICBhaWNfb3V0YihwLCBDTFJDTURJTlQsIENMUklOVCk7CisgIGFpY19pbmIocCwgSU5UU1RBVCk7CisgIC8qCisgICAqIFRoZSBzZXF1ZW5jZXIgd2lsbCBjb250aW51ZSBydW5uaW5nIHdoZW4gaXQKKyAgICogaXNzdWVzIHRoaXMgaW50ZXJydXB0LiBUaGVyZSBtYXkgYmUgPjEgY29tbWFuZHMKKyAgICogZmluaXNoZWQsIHNvIGxvb3AgdW50aWwgd2UndmUgcHJvY2Vzc2VkIHRoZW0gYWxsLgorICAgKi8KKworICB3aGlsZSAocC0+cW91dGZpZm9bcC0+cW91dGZpZm9uZXh0XSAhPSBTQ0JfTElTVF9OVUxMKQorICB7CisgICAgc2NiX2luZGV4ID0gcC0+cW91dGZpZm9bcC0+cW91dGZpZm9uZXh0XTsKKyAgICBwLT5xb3V0Zmlmb1twLT5xb3V0Zmlmb25leHQrK10gPSBTQ0JfTElTVF9OVUxMOworICAgIGlmICggc2NiX2luZGV4ID49IHAtPnNjYl9kYXRhLT5udW1zY2JzICkKKyAgICB7CisgICAgICBwcmludGsoV0FSTl9MRUFEICJDTURDTVBMVCB3aXRoIGludmFsaWQgU0NCIGluZGV4ICVkXG4iLCBwLT5ob3N0X25vLAorICAgICAgICAtMSwgLTEsIC0xLCBzY2JfaW5kZXgpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIHNjYiA9IHAtPnNjYl9kYXRhLT5zY2JfYXJyYXlbc2NiX2luZGV4XTsKKyAgICBpZiAoIShzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgfHwgKHNjYi0+Y21kID09IE5VTEwpKQorICAgIHsKKyAgICAgIHByaW50ayhXQVJOX0xFQUQgIkNNRENNUExUIHdpdGhvdXQgY29tbWFuZCBmb3IgU0NCICVkLCBTQ0IgZmxhZ3MgIgorICAgICAgICAiMHgleCwgY21kIDB4JWx4XG4iLCBwLT5ob3N0X25vLCAtMSwgLTEsIC0xLCBzY2JfaW5kZXgsIHNjYi0+ZmxhZ3MsCisgICAgICAgICh1bnNpZ25lZCBsb25nKSBzY2ItPmNtZCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdGluZGV4ID0gVEFSR0VUX0lOREVYKHNjYi0+Y21kKTsKKyAgICBhaWNfZGV2ID0gQUlDX0RFVihzY2ItPmNtZCk7CisgICAgaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfUVVFVUVEX0FCT1JUKQorICAgIHsKKyAgICAgIHBhdXNlX3NlcXVlbmNlcihwKTsKKyAgICAgIGlmICggKChhaWNfaW5iKHAsIExBU1RQSEFTRSkgJiBQSEFTRV9NQVNLKSAhPSBQX0JVU0ZSRUUpICYmCisgICAgICAgICAgIChhaWNfaW5iKHAsIFNDQl9UQUcpID09IHNjYi0+aHNjYi0+dGFnKSApCisgICAgICB7CisgICAgICAgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIEZBTFNFKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBhaWM3eHh4X3Jlc2V0X2RldmljZShwLCBzY2ItPmNtZC0+ZGV2aWNlLT5pZCwgc2NiLT5jbWQtPmRldmljZS0+Y2hhbm5lbCwKKyAgICAgICAgc2NiLT5jbWQtPmRldmljZS0+bHVuLCBzY2ItPmhzY2ItPnRhZyk7CisgICAgICBzY2ItPmZsYWdzICY9IH4oU0NCX1FVRVVFRF9GT1JfRE9ORSB8IFNDQl9SRVNFVCB8IFNDQl9BQk9SVCB8CisgICAgICAgIFNDQl9RVUVVRURfQUJPUlQpOworICAgICAgdW5wYXVzZV9zZXF1ZW5jZXIocCwgRkFMU0UpOworICAgIH0KKyAgICBlbHNlIGlmIChzY2ItPmZsYWdzICYgU0NCX0FCT1JUKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBXZSBzdGFydGVkIHRvIGFib3J0IHRoaXMsIGJ1dCBpdCBjb21wbGV0ZWQgb24gdXMsIGxldCBpdAorICAgICAgICogdGhyb3VnaCBhcyBzdWNjZXNzZnVsCisgICAgICAgKi8KKyAgICAgIHNjYi0+ZmxhZ3MgJj0gfihTQ0JfQUJPUlR8U0NCX1JFU0VUKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2NiLT5mbGFncyAmIFNDQl9TRU5TRSkKKyAgICB7CisgICAgICBjaGFyICpidWZmZXIgPSAmc2NiLT5jbWQtPnNlbnNlX2J1ZmZlclswXTsKKworICAgICAgaWYgKGJ1ZmZlclsxMl0gPT0gMHg0NyB8fCBidWZmZXJbMTJdID09IDB4NTQpCisgICAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNpZ25hbCB0aGF0IHdlIG5lZWQgdG8gcmUtbmVnb3RpYXRlIHRoaW5ncy4KKyAgICAgICAgICovCisgICAgICAgIGFpY19kZXYtPm5lZWRwcHIgPSBhaWNfZGV2LT5uZWVkcHByX2NvcHk7CisgICAgICAgIGFpY19kZXYtPm5lZWRzZHRyID0gYWljX2Rldi0+bmVlZHNkdHJfY29weTsKKyAgICAgICAgYWljX2Rldi0+bmVlZHdkdHIgPSBhaWNfZGV2LT5uZWVkd2R0cl9jb3B5OworICAgICAgfQorICAgIH0KKyAgICBjbWQgPSBzY2ItPmNtZDsKKyAgICBpZiAoc2NiLT5oc2NiLT5yZXNpZHVhbF9TR19zZWdtZW50X2NvdW50ICE9IDApCisgICAgeworICAgICAgYWljN3h4eF9jYWxjdWxhdGVfcmVzaWR1YWwocCwgc2NiKTsKKyAgICB9CisgICAgY21kLT5yZXN1bHQgfD0gKGFpYzd4eHhfZXJyb3IoY21kKSA8PCAxNik7CisgICAgYWljN3h4eF9kb25lKHAsIHNjYik7CisgIH0KK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2lzcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTQ1NJIGNvbnRyb2xsZXIgaW50ZXJydXB0IGhhbmRsZXIuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwOworICB1bnNpZ25lZCBjaGFyIGludHN0YXQ7CisKKyAgcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopZGV2X2lkOworCisgIC8qCisgICAqIEp1c3QgYSBmZXcgc2FuaXR5IGNoZWNrcy4gIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYW4gaW50IHBlbmRpbmcuCisgICAqIEFsc28sIGlmIFBDSSwgdGhlbiB3ZSBhcmUgZ29pbmcgdG8gY2hlY2sgZm9yIGEgUENJIGJ1cyBlcnJvciBzdGF0dXMKKyAgICogc2hvdWxkIHdlIGdldCB0b28gbWFueSBzcHVyaW91cyBpbnRlcnJ1cHRzLgorICAgKi8KKyAgaWYgKCEoKGludHN0YXQgPSBhaWNfaW5iKHAsIElOVFNUQVQpKSAmIElOVF9QRU5EKSkKKyAgeworI2lmZGVmIENPTkZJR19QQ0kKKyAgICBpZiAoIChwLT5jaGlwICYgQUhDX1BDSSkgJiYgKHAtPnNwdXJpb3VzX2ludCA+IDUwMCkgJiYKKyAgICAgICAgIShwLT5mbGFncyAmIEFIQ19IQU5ETElOR19SRVFJTklUUykgKQorICAgIHsKKyAgICAgIGlmICggYWljX2luYihwLCBFUlJPUikgJiBQQ0lFUlJTVEFUICkKKyAgICAgIHsKKyAgICAgICAgYWljN3h4eF9wY2lfaW50cihwKTsKKyAgICAgIH0KKyAgICAgIHAtPnNwdXJpb3VzX2ludCA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKCAhKHAtPmZsYWdzICYgQUhDX0hBTkRMSU5HX1JFUUlOSVRTKSApCisgICAgeworICAgICAgcC0+c3B1cmlvdXNfaW50Kys7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuOworICB9CisKKyAgcC0+c3B1cmlvdXNfaW50ID0gMDsKKworICAvKgorICAgKiBLZWVwIHRyYWNrIG9mIGludGVycnVwdHMgZm9yIC9wcm9jL3Njc2kKKyAgICovCisgIHAtPmlzcl9jb3VudCsrOworCisjaWZkZWYgQUlDN1hYWF9WRVJCT1NFX0RFQlVHR0lORworICBpZiAoIChwLT5pc3JfY291bnQgPCAxNikgJiYgKGFpYzd4eHhfdmVyYm9zZSA+IDB4ZmZmZikgJiYKKyAgICAgICAoYWljN3h4eF9wYW5pY19vbl9hYm9ydCkgJiYgKHAtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSApCisgICAgYWljN3h4eF9jaGVja19zY2JzKHAsICJCb2d1cyBzZXR0aW5ncyBhdCBzdGFydCBvZiBpbnRlcnJ1cHQuIik7CisjZW5kaWYKKworICAvKgorICAgKiBIYW5kbGUgYWxsIHRoZSBpbnRlcnJ1cHQgc291cmNlcyAtIGVzcGVjaWFsbHkgZm9yIFNDU0kKKyAgICogaW50ZXJydXB0cywgd2Ugd29uJ3QgZ2V0IGEgc2Vjb25kIGNoYW5jZSBhdCB0aGVtLgorICAgKi8KKyAgaWYgKGludHN0YXQgJiBDTURDTVBMVCkKKyAgeworICAgIGFpYzd4eHhfaGFuZGxlX2NvbW1hbmRfY29tcGxldGlvbl9pbnRyKHApOworICB9CisKKyAgaWYgKGludHN0YXQgJiBCUktBRFJJTlQpCisgIHsKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBjaGFyIGVycm5vID0gYWljX2luYihwLCBFUlJPUik7CisKKyAgICBwcmludGsoS0VSTl9FUlIgIihzY3NpJWQpIEJSS0FEUklOVCBlcnJvcigweCV4KTpcbiIsIHAtPmhvc3Rfbm8sIGVycm5vKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShoYXJkX2Vycm9yKTsgaSsrKQorICAgIHsKKyAgICAgIGlmIChlcnJubyAmIGhhcmRfZXJyb3JbaV0uZXJybm8pCisgICAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiICAlc1xuIiwgaGFyZF9lcnJvcltpXS5lcnJtZXNnKTsKKyAgICAgIH0KKyAgICB9CisgICAgcHJpbnRrKEtFUk5fRVJSICIoc2NzaSVkKSAgIFNFUUFERFI9MHgleFxuIiwgcC0+aG9zdF9ubywKKyAgICAgICgoKGFpY19pbmIocCwgU0VRQUREUjEpIDw8IDgpICYgMHgxMDApIHwgYWljX2luYihwLCBTRVFBRERSMCkpKTsKKyAgICBpZiAoYWljN3h4eF9wYW5pY19vbl9hYm9ydCkKKyAgICAgIGFpYzd4eHhfcGFuaWNfYWJvcnQocCwgTlVMTCk7CisjaWZkZWYgQ09ORklHX1BDSQorICAgIGlmIChlcnJubyAmIFBDSUVSUlNUQVQpCisgICAgICBhaWM3eHh4X3BjaV9pbnRyKHApOworI2VuZGlmCisgICAgaWYgKGVycm5vICYgKFNRUEFSRVJSIHwgSUxMT1BDT0RFIHwgSUxMU0FERFIpKQorICAgIHsKKyAgICAgIHBhbmljKCJhaWM3eHh4OiB1bnJlY292ZXJhYmxlIEJSS0FEUklOVC5cbiIpOworICAgIH0KKyAgICBpZiAoZXJybm8gJiBJTExIQUREUikKKyAgICB7CisgICAgICBwcmludGsoS0VSTl9FUlIgIihzY3NpJWQpIEJVRyEgRHJpdmVyIGFjY2Vzc2VkIGNoaXAgd2l0aG91dCBmaXJzdCAiCisgICAgICAgICAgICAgInBhdXNpbmcgY29udHJvbGxlciFcbiIsIHAtPmhvc3Rfbm8pOworICAgIH0KKyNpZmRlZiBBSUM3WFhYX1ZFUkJPU0VfREVCVUdHSU5HCisgICAgaWYgKGVycm5vICYgRFBBUkVSUikKKyAgICB7CisgICAgICBpZiAoYWljX2luYihwLCBETUFQQVJBTVMpICYgRElSRUNUSU9OKQorICAgICAgICBwcmludGsoIihzY3NpJWQpIHdoaWxlIERNQWluZyBTQ0IgZnJvbSBob3N0IHRvIGNhcmQuXG4iLCBwLT5ob3N0X25vKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJpbnRrKCIoc2NzaSVkKSB3aGlsZSBETUFpbmcgU0NCIGZyb20gY2FyZCB0byBob3N0LlxuIiwgcC0+aG9zdF9ubyk7CisgICAgfQorI2VuZGlmCisgICAgYWljX291dGIocCwgQ0xSUEFSRVJSIHwgQ0xSQlJLQURSSU5ULCBDTFJJTlQpOworICAgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIEZBTFNFKTsKKyAgfQorCisgIGlmIChpbnRzdGF0ICYgU0VRSU5UKQorICB7CisgICAgLyoKKyAgICAgKiBSZWFkIHRoZSBDQ1NDQkNUTCByZWdpc3RlciB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgVWx0cmEyIGNhcmRzCisgICAgICovCisgICAgaWYocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgIHsKKyAgICAgIGFpY19pbmIocCwgQ0NTQ0JDVEwpOworICAgIH0KKyAgICBhaWM3eHh4X2hhbmRsZV9zZXFpbnQocCwgaW50c3RhdCk7CisgIH0KKworICBpZiAoaW50c3RhdCAmIFNDU0lJTlQpCisgIHsKKyAgICBhaWM3eHh4X2hhbmRsZV9zY3NpaW50KHAsIGludHN0YXQpOworICB9CisKKyNpZmRlZiBBSUM3WFhYX1ZFUkJPU0VfREVCVUdHSU5HCisgIGlmICggKHAtPmlzcl9jb3VudCA8IDE2KSAmJiAoYWljN3h4eF92ZXJib3NlID4gMHhmZmZmKSAmJgorICAgICAgIChhaWM3eHh4X3BhbmljX29uX2Fib3J0KSAmJiAocC0+ZmxhZ3MgJiBBSENfUEFHRVNDQlMpICkKKyAgICBhaWM3eHh4X2NoZWNrX3NjYnMocCwgIkJvZ3VzIHNldHRpbmdzIGF0IGVuZCBvZiBpbnRlcnJ1cHQuIik7CisjZW5kaWYKKworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGRvX2FpYzd4eHhfaXNyCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFRoaXMgaXMgYSBncm9zcyBoYWNrIHRvIHNvbHZlIGEgcHJvYmxlbSBpbiBsaW51eCBrZXJuZWxzIDIuMS44NSBhbmQKKyAqICAgYWJvdmUuICBQbGVhc2UsIGNoaWxkcmVuLCBkbyBub3QgdHJ5IHRoaXMgYXQgaG9tZSwgYW5kIGlmIHlvdSBldmVyIHNlZQorICogICBhbnl0aGluZyBsaWtlIGl0LCBwbGVhc2UgaW5mb3JtIHRoZSBHcm9zcyBIYWNrIFBvbGljZSBpbW1lZGlhdGVseQorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaXJxcmV0dXJuX3QKK2RvX2FpYzd4eHhfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgIHVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworICBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwOworICAKKyAgcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopZGV2X2lkOworICBpZighcCkKKyAgICByZXR1cm4gSVJRX05PTkU7CisgIHNwaW5fbG9ja19pcnFzYXZlKHAtPmhvc3QtPmhvc3RfbG9jaywgY3B1X2ZsYWdzKTsKKyAgcC0+ZmxhZ3MgfD0gQUhDX0lOX0lTUjsKKyAgZG8KKyAgeworICAgIGFpYzd4eHhfaXNyKGlycSwgZGV2X2lkLCByZWdzKTsKKyAgfSB3aGlsZSAoIChhaWNfaW5iKHAsIElOVFNUQVQpICYgSU5UX1BFTkQpICk7CisgIGFpYzd4eHhfZG9uZV9jbWRzX2NvbXBsZXRlKHApOworICBhaWM3eHh4X3J1bl93YWl0aW5nX3F1ZXVlcyhwKTsKKyAgcC0+ZmxhZ3MgJj0gfkFIQ19JTl9JU1I7CisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUocC0+aG9zdC0+aG9zdF9sb2NrLCBjcHVfZmxhZ3MpOworCisgIHJldHVybiBJUlFfSEFORExFRDsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2luaXRfdHJhbnNpbmZvCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFNldCB1cCB0aGUgaW5pdGlhbCBhaWNfZGV2IHZhbHVlcyBmcm9tIHRoZSBCSU9TIHNldHRpbmdzIGFuZCBmcm9tCisgKiAgIElOUVVJUlkgcmVzdWx0cworICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9pbml0X3RyYW5zaW5mbyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBzdHJ1Y3QgYWljX2Rldl9kYXRhICphaWNfZGV2KQoreworICBTY3NpX0RldmljZSAqc2RwbnQgPSBhaWNfZGV2LT5TRHB0cjsKKyAgdW5zaWduZWQgY2hhciB0aW5kZXg7CisKKyAgdGluZGV4ID0gc2RwbnQtPmlkIHwgKHNkcG50LT5jaGFubmVsIDw8IDMpOworICBpZiAoIShhaWNfZGV2LT5mbGFncyAmIERFVklDRV9EVFJfU0NBTk5FRCkpCisgIHsKKyAgICBhaWNfZGV2LT5mbGFncyB8PSBERVZJQ0VfRFRSX1NDQU5ORUQ7CisKKyAgICBpZiAoIHNkcG50LT53ZHRyICYmIChwLT5mZWF0dXJlcyAmIEFIQ19XSURFKSApCisgICAgeworICAgICAgYWljX2Rldi0+bmVlZHdkdHIgPSBhaWNfZGV2LT5uZWVkd2R0cl9jb3B5ID0gMTsKKyAgICAgIGFpY19kZXYtPmdvYWwud2lkdGggPSBwLT51c2VyW3RpbmRleF0ud2lkdGg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhaWNfZGV2LT5uZWVkd2R0ciA9IGFpY19kZXYtPm5lZWR3ZHRyX2NvcHkgPSAwOworICAgICAgcGF1c2Vfc2VxdWVuY2VyKHApOworICAgICAgYWljN3h4eF9zZXRfd2lkdGgocCwgc2RwbnQtPmlkLCBzZHBudC0+Y2hhbm5lbCwgc2RwbnQtPmx1biwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsIChBSENfVFJBTlNfQUNUSVZFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSENfVFJBTlNfR09BTCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhDX1RSQU5TX0NVUiksIGFpY19kZXYgKTsKKyAgICAgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIEZBTFNFKTsKKyAgICB9CisgICAgaWYgKCBzZHBudC0+c2R0ciAmJiBwLT51c2VyW3RpbmRleF0ub2Zmc2V0ICkKKyAgICB7CisgICAgICBhaWNfZGV2LT5nb2FsLnBlcmlvZCA9IHAtPnVzZXJbdGluZGV4XS5wZXJpb2Q7CisgICAgICBhaWNfZGV2LT5nb2FsLm9wdGlvbnMgPSBwLT51c2VyW3RpbmRleF0ub3B0aW9uczsKKyAgICAgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgICAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0ID0gTUFYX09GRlNFVF9VTFRSQTI7CisgICAgICBlbHNlIGlmIChhaWNfZGV2LT5nb2FsLndpZHRoID09IE1TR19FWFRfV0RUUl9CVVNfMTZfQklUKQorICAgICAgICBhaWNfZGV2LT5nb2FsLm9mZnNldCA9IE1BWF9PRkZTRVRfMTZCSVQ7CisgICAgICBlbHNlCisgICAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0ID0gTUFYX09GRlNFVF84QklUOworICAgICAgaWYgKCBzZHBudC0+cHByICYmIHAtPnVzZXJbdGluZGV4XS5wZXJpb2QgPD0gOSAmJgorICAgICAgICAgICAgIHAtPnVzZXJbdGluZGV4XS5vcHRpb25zICkKKyAgICAgIHsKKyAgICAgICAgYWljX2Rldi0+bmVlZHBwciA9IGFpY19kZXYtPm5lZWRwcHJfY29weSA9IDE7CisgICAgICAgIGFpY19kZXYtPm5lZWRzZHRyID0gYWljX2Rldi0+bmVlZHNkdHJfY29weSA9IDA7CisgICAgICAgIGFpY19kZXYtPm5lZWR3ZHRyID0gYWljX2Rldi0+bmVlZHdkdHJfY29weSA9IDA7CisgICAgICAgIGFpY19kZXYtPmZsYWdzIHw9IERFVklDRV9TQ1NJXzM7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGFpY19kZXYtPm5lZWRzZHRyID0gYWljX2Rldi0+bmVlZHNkdHJfY29weSA9IDE7CisgICAgICAgIGFpY19kZXYtPmdvYWwucGVyaW9kID0gbWF4X3QodW5zaWduZWQgY2hhciwgMTAsIGFpY19kZXYtPmdvYWwucGVyaW9kKTsKKyAgICAgICAgYWljX2Rldi0+Z29hbC5vcHRpb25zID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGFpY19kZXYtPm5lZWRzZHRyID0gYWljX2Rldi0+bmVlZHNkdHJfY29weSA9IDA7CisgICAgICBhaWNfZGV2LT5nb2FsLnBlcmlvZCA9IDI1NTsKKyAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0ID0gMDsKKyAgICAgIGFpY19kZXYtPmdvYWwub3B0aW9ucyA9IDA7CisgICAgfQorICAgIGFpY19kZXYtPmZsYWdzIHw9IERFVklDRV9QUklOVF9EVFI7CisgIH0KK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X3NsYXZlX2FsbG9jCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFNldCB1cCB0aGUgaW5pdGlhbCBhaWNfZGV2IHN0cnVjdCBwb2ludGVycworICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X3NsYXZlX2FsbG9jKFNjc2lfRGV2aWNlICpTRHB0cikKK3sKKyAgc3RydWN0IGFpYzd4eHhfaG9zdCAqcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopU0RwdHItPmhvc3QtPmhvc3RkYXRhOworICBzdHJ1Y3QgYWljX2Rldl9kYXRhICphaWNfZGV2OworCisgIGFpY19kZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWljX2Rldl9kYXRhKSwgR0ZQX0FUT01JQyB8IEdGUF9LRVJORUwpOworICBpZighYWljX2RldikKKyAgICByZXR1cm4gMTsKKyAgLyoKKyAgICogQ2hlY2sgdG8gc2VlIGlmIGNoYW5uZWwgd2FzIHNjYW5uZWQuCisgICAqLworICAKKyAgaWYgKCEocC0+ZmxhZ3MgJiBBSENfQV9TQ0FOTkVEKSAmJiAoU0RwdHItPmNoYW5uZWwgPT0gMCkpCisgIHsKKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICBwcmludGsoSU5GT19MRUFEICJTY2FubmluZyBjaGFubmVsIGZvciBkZXZpY2VzLlxuIiwKKyAgICAgICAgcC0+aG9zdF9ubywgMCwgLTEsIC0xKTsKKyAgICBwLT5mbGFncyB8PSBBSENfQV9TQ0FOTkVEOworICB9CisgIGVsc2UKKyAgeworICAgIGlmICghKHAtPmZsYWdzICYgQUhDX0JfU0NBTk5FRCkgJiYgKFNEcHRyLT5jaGFubmVsID09IDEpKQorICAgIHsKKyAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1BST0JFMikKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiU2Nhbm5pbmcgY2hhbm5lbCBmb3IgZGV2aWNlcy5cbiIsCisgICAgICAgICAgcC0+aG9zdF9ubywgMSwgLTEsIC0xKTsKKyAgICAgIHAtPmZsYWdzIHw9IEFIQ19CX1NDQU5ORUQ7CisgICAgfQorICB9CisKKyAgbWVtc2V0KGFpY19kZXYsIDAsIHNpemVvZihzdHJ1Y3QgYWljX2Rldl9kYXRhKSk7CisgIFNEcHRyLT5ob3N0ZGF0YSA9IGFpY19kZXY7CisgIGFpY19kZXYtPlNEcHRyID0gU0RwdHI7CisgIGFpY19kZXYtPm1heF9xX2RlcHRoID0gMTsKKyAgYWljX2Rldi0+dGVtcF9xX2RlcHRoID0gMTsKKyAgc2NicV9pbml0KCZhaWNfZGV2LT5kZWxheWVkX3NjYnMpOworICBJTklUX0xJU1RfSEVBRCgmYWljX2Rldi0+bGlzdCk7CisgIGxpc3RfYWRkX3RhaWwoJmFpY19kZXYtPmxpc3QsICZwLT5haWNfZGV2cyk7CisgIHJldHVybiAwOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfZGV2aWNlX3F1ZXVlX2RlcHRoCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIERldGVybWluZXMgdGhlIHF1ZXVlIGRlcHRoIGZvciBhIGdpdmVuIGRldmljZS4gIFRoZXJlIGFyZSB0d28gd2F5cworICogICBhIHF1ZXVlIGRlcHRoIGNhbiBiZSBvYnRhaW5lZCBmb3IgYSB0YWdnZWQgcXVldWVpbmcgZGV2aWNlLiAgT25lCisgKiAgIHdheSBpcyB0aGUgZGVmYXVsdCBxdWV1ZSBkZXB0aCB3aGljaCBpcyBkZXRlcm1pbmVkIGJ5IHdoZXRoZXIKKyAqICAgYWljN3h4eF9kZWZhdWx0X3F1ZXVlX2RlcHRoLiAgVGhlIG90aGVyIGlzIGJ5IHRoZSBhaWM3eHh4X3RhZ19pbmZvCisgKiAgIGFycmF5LgorICoKKyAqICAgSWYgdGFnZ2VkIHF1ZXVlaW5nIGlzbid0IHN1cHBvcnRlZCBvbiB0aGUgZGV2aWNlLCB0aGVuIHdlIHNldCB0aGUKKyAqICAgZGVwdGggdG8gcC0+aG9zdC0+aG9zdHQtPmNtZF9wZXJfbHVuIGZvciBpbnRlcm5hbCBkcml2ZXIgcXVldWVpbmcuCisgKiAgIGFzIHRoZSBkZWZhdWx0IHF1ZXVlIGRlcHRoLiAgT3RoZXJ3aXNlLCB3ZSB1c2UgZWl0aGVyIDQgb3IgOCBhcyB0aGUKKyAqICAgZGVmYXVsdCBxdWV1ZSBkZXB0aCAoZGVwZW5kZW50IG9uIHRoZSBudW1iZXIgb2YgaGFyZHdhcmUgU0NCcykuCisgKiAgIFRoZSBvdGhlciB3YXkgd2UgZGV0ZXJtaW5lIHF1ZXVlIGRlcHRoIGlzIHRocm91Z2ggdGhlIHVzZSBvZiB0aGUKKyAqICAgYWljN3h4eF90YWdfaW5mbyBhcnJheSB3aGljaCBpcyBlbmFibGVkIGJ5IGRlZmluaW5nCisgKiAgIEFJQzdYWFhfVEFHR0VEX1FVRVVFSU5HX0JZX0RFVklDRS4gIFRoaXMgYXJyYXkgY2FuIGJlIGluaXRpYWxpemVkCisgKiAgIHdpdGggcXVldWUgZGVwdGhzIGZvciBpbmRpdmlkdWFsIGRldmljZXMuICBJdCBhbHNvIGFsbG93cyB0YWdnZWQKKyAqICAgcXVldWVpbmcgdG8gYmUgW2VufGRpc11hYmxlZCBmb3IgYSBzcGVjaWZpYyBhZGFwdGVyLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9kZXZpY2VfcXVldWVfZGVwdGgoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgU2NzaV9EZXZpY2UgKmRldmljZSkKK3sKKyAgaW50IHRhZ19lbmFibGVkID0gRkFMU0U7CisgIHN0cnVjdCBhaWNfZGV2X2RhdGEgKmFpY19kZXYgPSBkZXZpY2UtPmhvc3RkYXRhOworICB1bnNpZ25lZCBjaGFyIHRpbmRleDsKKworICB0aW5kZXggPSBkZXZpY2UtPmlkIHwgKGRldmljZS0+Y2hhbm5lbCA8PCAzKTsKKworICBpZiAoZGV2aWNlLT5zaW1wbGVfdGFncykKKyAgICByZXR1cm47IC8vIFdlJ3ZlIGFscmVhZHkgZW5hYmxlZCB0aGlzIGRldmljZQorCisgIGlmIChkZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQpCisgIHsKKyAgICB0YWdfZW5hYmxlZCA9IFRSVUU7CisKKyAgICBpZiAoIShwLT5kaXNjZW5hYmxlICYgKDEgPDwgdGluZGV4KSkpCisgICAgeworICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKQorICAgICAgICBwcmludGsoSU5GT19MRUFEICJEaXNjb25uZWN0aW9uIGRpc2FibGVkLCB1bmFibGUgdG8gIgorICAgICAgICAgICAgICJlbmFibGUgdGFnZ2VkIHF1ZXVlaW5nLlxuIiwKKyAgICAgICAgICAgICBwLT5ob3N0X25vLCBkZXZpY2UtPmNoYW5uZWwsIGRldmljZS0+aWQsIGRldmljZS0+bHVuKTsKKyAgICAgIHRhZ19lbmFibGVkID0gRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAocC0+aW5zdGFuY2UgPj0gQVJSQVlfU0laRShhaWM3eHh4X3RhZ19pbmZvKSkKKyAgICAgIHsKKyAgICAgICAgc3RhdGljIGludCBwcmludF93YXJuaW5nID0gVFJVRTsKKyAgICAgICAgaWYocHJpbnRfd2FybmluZykKKyAgICAgICAgeworICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImFpYzd4eHg6IFdBUk5JTkcsIGluc3VmZmljaWVudCB0YWdfaW5mbyBpbnN0YW5jZXMgZm9yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbnN0YWxsZWQgY29udHJvbGxlcnMuXG4iKTsKKyAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJhaWM3eHh4OiBQbGVhc2UgdXBkYXRlIHRoZSBhaWM3eHh4X3RhZ19pbmZvIGFycmF5IGluIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0aGUgYWljN3h4eC5jIHNvdXJjZSBmaWxlLlxuIik7CisgICAgICAgICAgcHJpbnRfd2FybmluZyA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGFpY19kZXYtPm1heF9xX2RlcHRoID0gYWljX2Rldi0+dGVtcF9xX2RlcHRoID0KKwkJYWljN3h4eF9kZWZhdWx0X3F1ZXVlX2RlcHRoOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworCisgICAgICAgIGlmIChhaWM3eHh4X3RhZ19pbmZvW3AtPmluc3RhbmNlXS50YWdfY29tbWFuZHNbdGluZGV4XSA9PSAyNTUpCisgICAgICAgIHsKKyAgICAgICAgICB0YWdfZW5hYmxlZCA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFpYzd4eHhfdGFnX2luZm9bcC0+aW5zdGFuY2VdLnRhZ19jb21tYW5kc1t0aW5kZXhdID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBhaWNfZGV2LT5tYXhfcV9kZXB0aCA9IGFpY19kZXYtPnRlbXBfcV9kZXB0aCA9CisJCSAgYWljN3h4eF9kZWZhdWx0X3F1ZXVlX2RlcHRoOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGFpY19kZXYtPm1heF9xX2RlcHRoID0gYWljX2Rldi0+dGVtcF9xX2RlcHRoID0gCisgICAgICAgICAgICBhaWM3eHh4X3RhZ19pbmZvW3AtPmluc3RhbmNlXS50YWdfY29tbWFuZHNbdGluZGV4XTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAodGFnX2VuYWJsZWQpCisgIHsKKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9ORUdPVElBVElPTjIpCisgICAgeworICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlRhZ2dlZCBxdWV1aW5nIGVuYWJsZWQsIHF1ZXVlIGRlcHRoICVkLlxuIiwKKyAgICAgICAgICAgIHAtPmhvc3Rfbm8sIGRldmljZS0+Y2hhbm5lbCwgZGV2aWNlLT5pZCwKKyAgICAgICAgICAgIGRldmljZS0+bHVuLCBhaWNfZGV2LT5tYXhfcV9kZXB0aCk7CisgICAgfQorICAgIHNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldmljZSwgTVNHX09SREVSRURfVEFHLCBhaWNfZGV2LT5tYXhfcV9kZXB0aCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKQorICAgIHsKKyAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJUYWdnZWQgcXVldWluZyBkaXNhYmxlZCwgcXVldWUgZGVwdGggJWQuXG4iLAorICAgICAgICAgICAgcC0+aG9zdF9ubywgZGV2aWNlLT5jaGFubmVsLCBkZXZpY2UtPmlkLAorICAgICAgICAgICAgZGV2aWNlLT5sdW4sIGRldmljZS0+aG9zdC0+Y21kX3Blcl9sdW4pOworICAgIH0KKyAgICBzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXZpY2UsIDAsIGRldmljZS0+aG9zdC0+Y21kX3Blcl9sdW4pOworICB9CisgIHJldHVybjsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X3NsYXZlX2Rlc3Ryb3kKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgcHJlcGFyZSBmb3IgdGhpcyBkZXZpY2UgdG8gZ28gYXdheQorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9zbGF2ZV9kZXN0cm95KFNjc2lfRGV2aWNlICpTRHB0cikKK3sKKyAgc3RydWN0IGFpY19kZXZfZGF0YSAqYWljX2RldiA9IFNEcHRyLT5ob3N0ZGF0YTsKKworICBsaXN0X2RlbCgmYWljX2Rldi0+bGlzdCk7CisgIFNEcHRyLT5ob3N0ZGF0YSA9IE5VTEw7CisgIGtmcmVlKGFpY19kZXYpOworICByZXR1cm47Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9zbGF2ZV9jb25maWd1cmUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgQ29uZmlndXJlIHRoZSBkZXZpY2Ugd2UgYXJlIGF0dGFjaGluZyB0byB0aGUgY29udHJvbGxlci4gIFRoaXMgaXMKKyAqICAgd2hlcmUgd2UgZ2V0IHRvIGRvIHRoaW5ncyBsaWtlIHNjYW4gdGhlIElOUVVJUlkgZGF0YSwgc2V0IHF1ZXVlCisgKiAgIGRlcHRocywgYWxsb2NhdGUgY29tbWFuZCBzdHJ1Y3RzLCBldGMuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2FpYzd4eHhfc2xhdmVfY29uZmlndXJlKFNjc2lfRGV2aWNlICpTRHB0cikKK3sKKyAgc3RydWN0IGFpYzd4eHhfaG9zdCAqcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopIFNEcHRyLT5ob3N0LT5ob3N0ZGF0YTsKKyAgc3RydWN0IGFpY19kZXZfZGF0YSAqYWljX2RldjsKKyAgaW50IHNjYm51bTsKKworICBhaWNfZGV2ID0gKHN0cnVjdCBhaWNfZGV2X2RhdGEgKilTRHB0ci0+aG9zdGRhdGE7CisKKyAgYWljN3h4eF9pbml0X3RyYW5zaW5mbyhwLCBhaWNfZGV2KTsKKyAgYWljN3h4eF9kZXZpY2VfcXVldWVfZGVwdGgocCwgU0RwdHIpOworICBpZihsaXN0X2VtcHR5KCZhaWNfZGV2LT5saXN0KSkKKyAgICBsaXN0X2FkZF90YWlsKCZhaWNfZGV2LT5saXN0LCAmcC0+YWljX2RldnMpOworCisgIHNjYm51bSA9IDA7CisgIGxpc3RfZm9yX2VhY2hfZW50cnkoYWljX2RldiwgJnAtPmFpY19kZXZzLCBsaXN0KSB7CisgICAgc2NibnVtICs9IGFpY19kZXYtPm1heF9xX2RlcHRoOworICB9CisgIHdoaWxlIChzY2JudW0gPiBwLT5zY2JfZGF0YS0+bnVtc2NicykKKyAgeworICAgIC8qCisgICAgICogUHJlLWFsbG9jYXRlIHRoZSBuZWVkZWQgU0NCcyB0byBnZXQgYXJvdW5kIHRoZSBwb3NzaWJpbGl0eSBvZiBoYXZpbmcKKyAgICAgKiB0byBhbGxvY2F0ZSBzb21lIHdoZW4gbWVtb3J5IGlzIG1vcmUgb3IgbGVzcyBleGhhdXN0ZWQgYW5kIHdlIG5lZWQKKyAgICAgKiB0aGUgU0NCIGluIG9yZGVyIHRvIHBlcmZvcm0gYSBzd2FwIG9wZXJhdGlvbiAocG9zc2libGUgZGVhZGxvY2spCisgICAgICovCisgICAgaWYgKCBhaWM3eHh4X2FsbG9jYXRlX3NjYihwKSA9PSAwICkKKyAgICAgIGJyZWFrOworICB9CisKKworICByZXR1cm4oMCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9wcm9iZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBQcm9iaW5nIGZvciBFSVNBIGJvYXJkczogaXQgbG9va3MgbGlrZSB0aGUgZmlyc3QgdHdvIGJ5dGVzCisgKiAgIGFyZSBhIG1hbnVmYWN0dXJlciBjb2RlIC0gdGhyZWUgY2hhcmFjdGVycywgZml2ZSBiaXRzIGVhY2g6CisgKgorICogICAgICAgICAgICAgICBCWVRFIDAgICBCWVRFIDEgICBCWVRFIDIgICBCWVRFIDMKKyAqICAgICAgICAgICAgICA/MTExMTEyMiAyMjIzMzMzMyBQUFBQUFBQUCBSUlJSUlJSUgorICoKKyAqICAgVGhlIGNoYXJhY3RlcnMgYXJlIGJhc2VsaW5lZCBvZmYgQVNDSUkgJ0AnLCBzbyBhZGQgdGhhdCB2YWx1ZQorICogICB0byBlYWNoIHRvIGdldCB0aGUgcmVhbCBBU0NJSSBjb2RlIGZvciBpdC4gVGhlIG5leHQgdHdvIGJ5dGVzCisgKiAgIGFwcGVhciB0byBiZSBhIHByb2R1Y3QgYW5kIHJldmlzaW9uIG51bWJlciwgcHJvYmFibHkgdmVuZG9yLQorICogICBzcGVjaWZpYy4gVGhpcyBpcyB3aGF0IGlzIGJlaW5nIHNlYXJjaGVkIGZvciBhdCBlYWNoIHBvcnQsCisgKiAgIGFuZCB3aGF0IHNob3VsZCBwcm9iYWJseSBjb3JyZXNwb25kIHRvIHRoZSBJRD0gZmllbGQgaW4gdGhlCisgKiAgIEVDVSdzIC5jZmcgZmlsZSBmb3IgdGhlIGNhcmQgLSBpZiB5b3VyIGNhcmQgaXMgbm90IGRldGVjdGVkLAorICogICBtYWtlIHN1cmUgeW91ciBzaWduYXR1cmUgaXMgbGlzdGVkIGluIHRoZSBhcnJheS4KKyAqCisgKiAgIFRoZSBmb3VydGggYnl0ZSdzIGxvd2VzdCBiaXQgc2VlbXMgdG8gYmUgYW4gZW5hYmxlZC9kaXNhYmxlZAorICogICBmbGFnIChyZXN0IG9mIHRoZSBiaXRzIGFyZSByZXNlcnZlZD8pLgorICoKKyAqIE5PVEU6ICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbmVlZGVkIG9uIEludGVsIGFuZCBBbHBoYSBwbGF0Zm9ybXMsCisgKiAgIHRoZSBvdGhlciBwbGF0Zm9ybXMgd2Ugc3VwcG9ydCBkb24ndCBoYXZlIEVJU0EvVkxCIGJ1c3Nlcy4gIFNvLAorICogICB3ZSAjaWZkZWYgdGhpcyBlbnRpcmUgZnVuY3Rpb24gdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQKKyAqICAgYW4gdW51c2VkIGZ1bmN0aW9uLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2FscGhhX18pCitzdGF0aWMgaW50CithaWM3eHh4X3Byb2JlKGludCBzbG90LCBpbnQgYmFzZSwgYWhjX2ZsYWdfdHlwZSAqZmxhZ3MpCit7CisgIGludCBpOworICB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKKworICBzdGF0aWMgc3RydWN0IHsKKyAgICBpbnQgbjsKKyAgICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtzaXplb2YoYnVmKV07CisgICAgYWhjX2NoaXAgdHlwZTsKKyAgICBpbnQgYmlvc19kaXNhYmxlZDsKKyAgfSBBSUM3eHh4W10gPSB7CisgICAgeyA0LCB7IDB4MDQsIDB4OTAsIDB4NzcsIDB4NzAgfSwKKyAgICAgIEFIQ19BSUM3NzcwfEFIQ19FSVNBLCBGQUxTRSB9LCAgLyogbWIgNzc3MCAgKi8KKyAgICB7IDQsIHsgMHgwNCwgMHg5MCwgMHg3NywgMHg3MSB9LAorICAgICAgQUhDX0FJQzc3NzB8QUhDX0VJU0EsIEZBTFNFIH0sIC8qIGhvc3QgYWRhcHRlciAyNzR4ICovCisgICAgeyA0LCB7IDB4MDQsIDB4OTAsIDB4NzcsIDB4NTYgfSwKKyAgICAgIEFIQ19BSUM3NzcwfEFIQ19WTCwgRkFMU0UgfSwgLyogMjg0eCBCSU9TIGVuYWJsZWQgKi8KKyAgICB7IDQsIHsgMHgwNCwgMHg5MCwgMHg3NywgMHg1NyB9LAorICAgICAgQUhDX0FJQzc3NzB8QUhDX1ZMLCBUUlVFIH0gICAvKiAyODR4IEJJT1MgZGlzYWJsZWQgKi8KKyAgfTsKKworICAvKgorICAgKiBUaGUgVkwtYnVzIGNhcmRzIG5lZWQgdG8gYmUgcHJpbWVkIGJ5CisgICAqIHdyaXRpbmcgYmVmb3JlIGEgc2lnbmF0dXJlIGNoZWNrLgorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihidWYpOyBpKyspCisgIHsKKyAgICBvdXRiKDB4ODAgKyBpLCBiYXNlKTsKKyAgICBidWZbaV0gPSBpbmIoYmFzZSArIGkpOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUlDN3h4eCk7IGkrKykKKyAgeworICAgIC8qCisgICAgICogU2lnbmF0dXJlIG1hdGNoIG9uIGVuYWJsZWQgY2FyZD8KKyAgICAgKi8KKyAgICBpZiAoIW1lbWNtcChidWYsIEFJQzd4eHhbaV0uc2lnbmF0dXJlLCBBSUM3eHh4W2ldLm4pKQorICAgIHsKKyAgICAgIGlmIChpbmIoYmFzZSArIDQpICYgMSkKKyAgICAgIHsKKyAgICAgICAgaWYgKEFJQzd4eHhbaV0uYmlvc19kaXNhYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICpmbGFncyB8PSBBSENfVVNFREVGQVVMVFM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgKmZsYWdzIHw9IEFIQ19CSU9TX0VOQUJMRUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChpKTsKKyAgICAgIH0KKworICAgICAgcHJpbnRrKCJhaWM3eHh4OiA8QWRhcHRlYyA3NzcwIFNDU0kgSG9zdCBBZGFwdGVyPiAiCisgICAgICAgICAgICAgImRpc2FibGVkIGF0IHNsb3QgJWQsIGlnbm9yZWQuXG4iLCBzbG90KTsKKyAgICB9CisgIH0KKworICByZXR1cm4gKC0xKTsKK30KKyNlbmRpZiAvKiAoX19pMzg2X18pIHx8IChfX2FscGhhX18pICovCisKKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICByZWFkXzI4NDBfc2VlcHJvbQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBSZWFkcyB0aGUgMjg0MCBzZXJpYWwgRUVQUk9NIGFuZCByZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bCBhbmQgMCBpZgorICogICBub3Qgc3VjY2Vzc2Z1bC4KKyAqCisgKiAgIFNlZSByZWFkX3NlZXByb20gKGZvciB0aGUgMjk0MCkgZm9yIHRoZSBpbnN0cnVjdGlvbiBzZXQgb2YgdGhlIDkzQzQ2CisgKiAgIGNoaXAuCisgKgorICogICBUaGUgMjg0MCBpbnRlcmZhY2UgdG8gdGhlIDkzQzQ2IHNlcmlhbCBFRVBST00gaXMgdGhyb3VnaCB0aGUKKyAqICAgU1RBVFVTXzI4NDAgYW5kIFNFRUNUTF8yODQwIHJlZ2lzdGVycy4gIFRoZSBDU18yODQwLCBDS18yODQwLCBhbmQKKyAqICAgRE9fMjg0MCBiaXRzIG9mIHRoZSBTRUVDVExfMjg0MCByZWdpc3RlciBhcmUgY29ubmVjdGVkIHRvIHRoZSBjaGlwCisgKiAgIHNlbGVjdCwgY2xvY2ssIGFuZCBkYXRhIG91dCBsaW5lcyByZXNwZWN0aXZlbHkgb2YgdGhlIHNlcmlhbCBFRVBST00uCisgKiAgIFRoZSBESV8yODQwIGJpdCBvZiB0aGUgU1RBVFVTXzI4NDAgaXMgY29ubmVjdGVkIHRvIHRoZSBkYXRhIGluIGxpbmUKKyAqICAgb2YgdGhlIHNlcmlhbCBFRVBST00uICBUaGUgRUVQUk9NX1RGIGJpdCBvZiBTVEFUVVNfMjg0MCByZWdpc3RlciBpcworICogICB1c2VmdWwgaW4gdGhhdCBpdCBnaXZlcyB1cyBhbiA4MDAgbnNlYyB0aW1lci4gIEFmdGVyIGEgcmVhZCBmcm9tIHRoZQorICogICBTRUVDVExfMjg0MCByZWdpc3RlciB0aGUgdGltaW5nIGZsYWcgaXMgY2xlYXJlZCBhbmQgZ29lcyBoaWdoIDgwMCBuc2VjCisgKiAgIGxhdGVyLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CityZWFkXzI4NHhfc2VlcHJvbShzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgKnNjKQoreworICBpbnQgaSA9IDAsIGsgPSAwOworICB1bnNpZ25lZCBjaGFyIHRlbXA7CisgIHVuc2lnbmVkIHNob3J0IGNoZWNrc3VtID0gMDsKKyAgdW5zaWduZWQgc2hvcnQgKnNlZXByb20gPSAodW5zaWduZWQgc2hvcnQgKikgc2M7CisgIHN0cnVjdCBzZWVwcm9tX2NtZCB7CisgICAgdW5zaWduZWQgY2hhciBsZW47CisgICAgdW5zaWduZWQgY2hhciBiaXRzWzNdOworICB9OworICBzdHJ1Y3Qgc2VlcHJvbV9jbWQgc2VlcHJvbV9yZWFkID0gezMsIHsxLCAxLCAwfX07CisKKyNkZWZpbmUgQ0xPQ0tfUFVMU0UocCkgXAorICB3aGlsZSAoKGFpY19pbmIocCwgU1RBVFVTXzI4NDApICYgRUVQUk9NX1RGKSA9PSAwKSAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDsgIC8qIERvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHZvaWQpIGFpY19pbmIocCwgU0VFQ1RMXzI4NDApOworCisgIC8qCisgICAqIFJlYWQgdGhlIGZpcnN0IDMyIHJlZ2lzdGVycyBvZiB0aGUgc2VlcHJvbS4gIEZvciB0aGUgMjg0MCwKKyAgICogdGhlIDkzQzQ2IFNFRVBST00gaXMgYSAxMDI0LWJpdCBkZXZpY2Ugd2l0aCA2NCAxNi1iaXQgcmVnaXN0ZXJzCisgICAqIGJ1dCBvbmx5IHRoZSBmaXJzdCAzMiBhcmUgdXNlZCBieSBBZGFwdGVjIEJJT1MuICBUaGUgbG9vcAorICAgKiB3aWxsIHJhbmdlIGZyb20gMCB0byAzMS4KKyAgICovCisgIGZvciAoayA9IDA7IGsgPCAoc2l6ZW9mKCpzYykgLyAyKTsgaysrKQorICB7CisgICAgLyoKKyAgICAgKiBTZW5kIGNoaXAgc2VsZWN0IGZvciBvbmUgY2xvY2sgY3ljbGUuCisgICAgICovCisgICAgYWljX291dGIocCwgQ0tfMjg0MCB8IENTXzI4NDAsIFNFRUNUTF8yODQwKTsKKyAgICBDTE9DS19QVUxTRShwKTsKKworICAgIC8qCisgICAgICogTm93IHdlJ3JlIHJlYWR5IHRvIHNlbmQgdGhlIHJlYWQgY29tbWFuZCBmb2xsb3dlZCBieSB0aGUKKyAgICAgKiBhZGRyZXNzIG9mIHRoZSAxNi1iaXQgcmVnaXN0ZXIgd2Ugd2FudCB0byByZWFkLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzZWVwcm9tX3JlYWQubGVuOyBpKyspCisgICAgeworICAgICAgdGVtcCA9IENTXzI4NDAgfCBzZWVwcm9tX3JlYWQuYml0c1tpXTsKKyAgICAgIGFpY19vdXRiKHAsIHRlbXAsIFNFRUNUTF8yODQwKTsKKyAgICAgIENMT0NLX1BVTFNFKHApOworICAgICAgdGVtcCA9IHRlbXAgXiBDS18yODQwOworICAgICAgYWljX291dGIocCwgdGVtcCwgU0VFQ1RMXzI4NDApOworICAgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgfQorICAgIC8qCisgICAgICogU2VuZCB0aGUgNiBiaXQgYWRkcmVzcyAoTVNCIGZpcnN0LCBMU0IgbGFzdCkuCisgICAgICovCisgICAgZm9yIChpID0gNTsgaSA+PSAwOyBpLS0pCisgICAgeworICAgICAgdGVtcCA9IGs7CisgICAgICB0ZW1wID0gKHRlbXAgPj4gaSkgJiAxOyAgLyogTWFzayBvdXQgYWxsIGJ1dCBsb3dlciBiaXQuICovCisgICAgICB0ZW1wID0gQ1NfMjg0MCB8IHRlbXA7CisgICAgICBhaWNfb3V0YihwLCB0ZW1wLCBTRUVDVExfMjg0MCk7CisgICAgICBDTE9DS19QVUxTRShwKTsKKyAgICAgIHRlbXAgPSB0ZW1wIF4gQ0tfMjg0MDsKKyAgICAgIGFpY19vdXRiKHAsIHRlbXAsIFNFRUNUTF8yODQwKTsKKyAgICAgIENMT0NLX1BVTFNFKHApOworICAgIH0KKworICAgIC8qCisgICAgICogTm93IHJlYWQgdGhlIDE2IGJpdCByZWdpc3Rlci4gIEFuIGluaXRpYWwgMCBwcmVjZWRlcyB0aGUKKyAgICAgKiByZWdpc3RlciBjb250ZW50cyB3aGljaCBiZWdpbnMgd2l0aCBiaXQgMTUgKE1TQikgYW5kIGVuZHMKKyAgICAgKiB3aXRoIGJpdCAwIChMU0IpLiAgVGhlIGluaXRpYWwgMCB3aWxsIGJlIHNoaWZ0ZWQgb2ZmIHRoZQorICAgICAqIHRvcCBvZiBvdXIgd29yZCBhcyB3ZSBsZXQgdGhlIGxvb3AgcnVuIGZyb20gMCB0byAxNi4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDw9IDE2OyBpKyspCisgICAgeworICAgICAgdGVtcCA9IENTXzI4NDA7CisgICAgICBhaWNfb3V0YihwLCB0ZW1wLCBTRUVDVExfMjg0MCk7CisgICAgICBDTE9DS19QVUxTRShwKTsKKyAgICAgIHRlbXAgPSB0ZW1wIF4gQ0tfMjg0MDsKKyAgICAgIHNlZXByb21ba10gPSAoc2VlcHJvbVtrXSA8PCAxKSB8IChhaWNfaW5iKHAsIFNUQVRVU18yODQwKSAmIERJXzI4NDApOworICAgICAgYWljX291dGIocCwgdGVtcCwgU0VFQ1RMXzI4NDApOworICAgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgfQorICAgIC8qCisgICAgICogVGhlIHNlcmlhbCBFRVBST00gaGFzIGEgY2hlY2tzdW0gaW4gdGhlIGxhc3Qgd29yZC4gIEtlZXAgYQorICAgICAqIHJ1bm5pbmcgY2hlY2tzdW0gZm9yIGFsbCB3b3JkcyByZWFkIGV4Y2VwdCBmb3IgdGhlIGxhc3QKKyAgICAgKiB3b3JkLiAgV2UnbGwgdmVyaWZ5IHRoZSBjaGVja3N1bSBhZnRlciBhbGwgd29yZHMgaGF2ZSBiZWVuCisgICAgICogcmVhZC4KKyAgICAgKi8KKyAgICBpZiAoayA8IChzaXplb2YoKnNjKSAvIDIpIC0gMSkKKyAgICB7CisgICAgICBjaGVja3N1bSA9IGNoZWNrc3VtICsgc2VlcHJvbVtrXTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlc2V0IHRoZSBjaGlwIHNlbGVjdCBmb3IgdGhlIG5leHQgY29tbWFuZCBjeWNsZS4KKyAgICAgKi8KKyAgICBhaWNfb3V0YihwLCAwLCBTRUVDVExfMjg0MCk7CisgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgYWljX291dGIocCwgQ0tfMjg0MCwgU0VFQ1RMXzI4NDApOworICAgIENMT0NLX1BVTFNFKHApOworICAgIGFpY19vdXRiKHAsIDAsIFNFRUNUTF8yODQwKTsKKyAgICBDTE9DS19QVUxTRShwKTsKKyAgfQorCisjaWYgMAorICBwcmludGsoIkNvbXB1dGVkIGNoZWNrc3VtIDB4JXgsIGNoZWNrc3VtIHJlYWQgMHgleFxuIiwgY2hlY2tzdW0sIHNjLT5jaGVja3N1bSk7CisgIHByaW50aygiU2VyaWFsIEVFUFJPTToiKTsKKyAgZm9yIChrID0gMDsgayA8IChzaXplb2YoKnNjKSAvIDIpOyBrKyspCisgIHsKKyAgICBpZiAoKChrICUgOCkgPT0gMCkgJiYgKGsgIT0gMCkpCisgICAgeworICAgICAgcHJpbnRrKCJcbiAgICAgICAgICAgICAgIik7CisgICAgfQorICAgIHByaW50aygiIDB4JXgiLCBzZWVwcm9tW2tdKTsKKyAgfQorICBwcmludGsoIlxuIik7CisjZW5kaWYKKworICBpZiAoY2hlY2tzdW0gIT0gc2MtPmNoZWNrc3VtKQorICB7CisgICAgcHJpbnRrKCJhaWM3eHh4OiBTRUVQUk9NIGNoZWNrc3VtIGVycm9yLCBpZ25vcmluZyBTRUVQUk9NIHNldHRpbmdzLlxuIik7CisgICAgcmV0dXJuICgwKTsKKyAgfQorCisgIHJldHVybiAoMSk7CisjdW5kZWYgQ0xPQ0tfUFVMU0UKK30KKworI2RlZmluZSBDTE9DS19QVUxTRShwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBsaW1pdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcGF1c2Vfc2VxdWVuY2VyKHApOyAgLyogVGhpcyBpcyBqdXN0IHRvIGdlbmVyYXRlIHNvbWUgUENJICovICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHJhZmZpYyBzbyB0aGUgUENJIHJlYWQgaXMgZmx1c2hlZCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXQgc2hvdWxkbid0IGJlIG5lZWRlZCwgYnV0IHNvbWUgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hpcHNldHMgZG8gaW5kZWVkIGFwcGVhciB0byBuZWVkICovICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29tZXRoaW5nIHRvIGZvcmNlIFBDSSByZWFkcyB0byBnZXQgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmx1c2hlZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdWRlbGF5KDEpOyAgICAgICAgICAgLyogRG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKCgoYWljX2luYihwLCBTRUVDVEwpICYgU0VFUkRZKSA9PSAwKSAmJiAoKytsaW1pdCA8IDEwMDApKTsgXAorICB9IHdoaWxlKDApCisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWNxdWlyZV9zZWVwcm9tCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIEFjcXVpcmVzIGFjY2VzcyB0byB0aGUgbWVtb3J5IHBvcnQgb24gUENJIGNvbnRyb2xsZXJzLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithY3F1aXJlX3NlZXByb20oc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKworICAvKgorICAgKiBSZXF1ZXN0IGFjY2VzcyBvZiB0aGUgbWVtb3J5IHBvcnQuICBXaGVuIGFjY2VzcyBpcworICAgKiBncmFudGVkLCBTRUVSRFkgd2lsbCBnbyBoaWdoLiAgV2UgdXNlIGEgMSBzZWNvbmQKKyAgICogdGltZW91dCB3aGljaCBzaG91bGQgYmUgbmVhciAxIHNlY29uZCBtb3JlIHRoYW4KKyAgICogaXMgbmVlZGVkLiAgUmVhc29uOiBhZnRlciB0aGUgNzg3MCBjaGlwIHJlc2V0LCB0aGVyZQorICAgKiBzaG91bGQgYmUgbm8gY29udGVudGlvbi4KKyAgICovCisgIGFpY19vdXRiKHAsIFNFRU1TLCBTRUVDVEwpOworICBDTE9DS19QVUxTRShwKTsKKyAgaWYgKChhaWNfaW5iKHAsIFNFRUNUTCkgJiBTRUVSRFkpID09IDApCisgIHsKKyAgICBhaWNfb3V0YihwLCAwLCBTRUVDVEwpOworICAgIHJldHVybiAoMCk7CisgIH0KKyAgcmV0dXJuICgxKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICByZWxlYXNlX3NlZXByb20KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUmVsZWFzZXMgYWNjZXNzIHRvIHRoZSBtZW1vcnkgcG9ydCBvbiBQQ0kgY29udHJvbGxlcnMuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCityZWxlYXNlX3NlZXByb20oc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKyAgLyoKKyAgICogTWFrZSBzdXJlIHRoZSBTRUVQUk9NIGlzIHJlYWR5IGJlZm9yZSB3ZSByZWxlYXNlIGl0LgorICAgKi8KKyAgQ0xPQ0tfUFVMU0UocCk7CisgIGFpY19vdXRiKHAsIDAsIFNFRUNUTCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgcmVhZF9zZWVwcm9tCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFJlYWRzIHRoZSBzZXJpYWwgRUVQUk9NIGFuZCByZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bCBhbmQgMCBpZgorICogICBub3Qgc3VjY2Vzc2Z1bC4KKyAqCisgKiAgIFRoZSBpbnN0cnVjdGlvbiBzZXQgb2YgdGhlIDkzQzQ2LzU2LzY2IGNoaXBzIGlzIGFzIGZvbGxvd3M6CisgKgorICogICAgICAgICAgICAgICBTdGFydCAgT1AKKyAqICAgICBGdW5jdGlvbiAgIEJpdCAgQ29kZSAgQWRkcmVzcyAgICBEYXRhICAgICBEZXNjcmlwdGlvbgorICogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICBSRUFEICAgICAgICAxICAgIDEwICAgQTUgLSBBMCAgICAgICAgICAgICBSZWFkcyBkYXRhIHN0b3JlZCBpbiBtZW1vcnksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgYXQgc3BlY2lmaWVkIGFkZHJlc3MKKyAqICAgICBFV0VOICAgICAgICAxICAgIDAwICAgMTFYWFhYICAgICAgICAgICAgICBXcml0ZSBlbmFibGUgbXVzdCBwcmVjZWRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIHByb2dyYW1taW5nIG1vZGVzCisgKiAgICAgRVJBU0UgICAgICAgMSAgICAxMSAgIEE1IC0gQTAgICAgICAgICAgICAgRXJhc2UgcmVnaXN0ZXIgQTVBNEEzQTJBMUEwCisgKiAgICAgV1JJVEUgICAgICAgMSAgICAwMSAgIEE1IC0gQTAgICBEMTUgLSBEMCAgV3JpdGVzIHJlZ2lzdGVyCisgKiAgICAgRVJBTCAgICAgICAgMSAgICAwMCAgIDEwWFhYWCAgICAgICAgICAgICAgRXJhc2UgYWxsIHJlZ2lzdGVycworICogICAgIFdSQUwgICAgICAgIDEgICAgMDAgICAwMVhYWFggICAgRDE1IC0gRDAgIFdyaXRlcyB0byBhbGwgcmVnaXN0ZXJzCisgKiAgICAgRVdEUyAgICAgICAgMSAgICAwMCAgIDAwWFhYWCAgICAgICAgICAgICAgRGlzYWJsZXMgYWxsIHByb2dyYW1taW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zCisgKiAgICAgKk5vdGU6IEEgdmFsdWUgb2YgWCBmb3IgYWRkcmVzcyBpcyBhIGRvbid0IGNhcmUgY29uZGl0aW9uLgorICogICAgICpOb3RlOiBUaGUgOTNDNTYgYW5kIDkzQzY2IGhhdmUgOCBhZGRyZXNzIGJpdHMuCisgKiAKKyAqCisgKiAgIFRoZSA5M0M0NiBoYXMgYSBmb3VyIHdpcmUgaW50ZXJmYWNlOiBjbG9jaywgY2hpcCBzZWxlY3QsIGRhdGEgaW4sIGFuZAorICogICBkYXRhIG91dC4gIEluIG9yZGVyIHRvIHBlcmZvcm0gb25lIG9mIHRoZSBhYm92ZSBmdW5jdGlvbnMsIHlvdSBuZWVkCisgKiAgIHRvIGVuYWJsZSB0aGUgY2hpcCBzZWxlY3QgZm9yIGEgY2xvY2sgcGVyaW9kICh0eXBpY2FsbHkgYSBtaW5pbXVtIG9mCisgKiAgIDEgdXNlYywgd2l0aCB0aGUgY2xvY2sgaGlnaCBhbmQgbG93IGEgbWluaW11bSBvZiA3NTAgYW5kIDI1MCBuc2VjCisgKiAgIHJlc3BlY3RpdmVseS4gIFdoaWxlIHRoZSBjaGlwIHNlbGVjdCByZW1haW5zIGhpZ2gsIHlvdSBjYW4gY2xvY2sgaW4KKyAqICAgdGhlIGluc3RydWN0aW9ucyAoYWJvdmUpIHN0YXJ0aW5nIHdpdGggdGhlIHN0YXJ0IGJpdCwgZm9sbG93ZWQgYnkgdGhlCisgKiAgIE9QIGNvZGUsIEFkZHJlc3MsIGFuZCBEYXRhIChpZiBuZWVkZWQpLiAgRm9yIHRoZSBSRUFEIGluc3RydWN0aW9uLCB0aGUKKyAqICAgcmVxdWVzdGVkIDE2LWJpdCByZWdpc3RlciBjb250ZW50cyBpcyByZWFkIGZyb20gdGhlIGRhdGEgb3V0IGxpbmUgYnV0CisgKiAgIGlzIHByZWNlZGVkIGJ5IGFuIGluaXRpYWwgemVybyAobGVhZGluZyAwLCBmb2xsb3dlZCBieSAxNi1iaXRzLCBNU0IKKyAqICAgZmlyc3QpLiAgVGhlIGNsb2NrIGN5Y2xpbmcgZnJvbSBsb3cgdG8gaGlnaCBpbml0aWF0ZXMgdGhlIG5leHQgZGF0YQorICogICBiaXQgdG8gYmUgc2VudCBmcm9tIHRoZSBjaGlwLgorICoKKyAqICAgVGhlIDc4eHggaW50ZXJmYWNlIHRvIHRoZSA5M0M0NiBzZXJpYWwgRUVQUk9NIGlzIHRocm91Z2ggdGhlIFNFRUNUTAorICogICByZWdpc3Rlci4gIEFmdGVyIHN1Y2Nlc3NmdWwgYXJiaXRyYXRpb24gZm9yIHRoZSBtZW1vcnkgcG9ydCwgdGhlCisgKiAgIFNFRUNTIGJpdCBvZiB0aGUgU0VFQ1RMIHJlZ2lzdGVyIGlzIGNvbm5lY3RlZCB0byB0aGUgY2hpcCBzZWxlY3QuCisgKiAgIFRoZSBTRUVDSywgU0VFRE8sIGFuZCBTRUVESSBhcmUgY29ubmVjdGVkIHRvIHRoZSBjbG9jaywgZGF0YSBvdXQsCisgKiAgIGFuZCBkYXRhIGluIGxpbmVzIHJlc3BlY3RpdmVseS4gIFRoZSBTRUVSRFkgYml0IG9mIFNFRUNUTCBpcyB1c2VmdWwKKyAqICAgaW4gdGhhdCBpdCBnaXZlcyB1cyBhbiA4MDAgbnNlYyB0aW1lci4gIEFmdGVyIGEgd3JpdGUgdG8gdGhlIFNFRUNUTAorICogICByZWdpc3RlciwgdGhlIFNFRVJEWSBnb2VzIGhpZ2ggODAwIG5zZWMgbGF0ZXIuICBUaGUgb25lIGV4Y2VwdGlvbgorICogICB0byB0aGlzIGlzIHdoZW4gd2UgZmlyc3QgcmVxdWVzdCBhY2Nlc3MgdG8gdGhlIG1lbW9yeSBwb3J0LiAgVGhlCisgKiAgIFNFRVJEWSBnb2VzIGhpZ2ggdG8gc2lnbmlmeSB0aGF0IGFjY2VzcyBoYXMgYmVlbiBncmFudGVkIGFuZCwgZm9yCisgKiAgIHRoaXMgY2FzZSwgaGFzIG5vIGltcGxpZWQgdGltaW5nLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CityZWFkX3NlZXByb20oc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgaW50IG9mZnNldCwgCisgICAgdW5zaWduZWQgc2hvcnQgKnNjYXJyYXksIHVuc2lnbmVkIGludCBsZW4sIHNlZXByb21fY2hpcF90eXBlIGNoaXApCit7CisgIGludCBpID0gMCwgazsKKyAgdW5zaWduZWQgY2hhciB0ZW1wOworICB1bnNpZ25lZCBzaG9ydCBjaGVja3N1bSA9IDA7CisgIHN0cnVjdCBzZWVwcm9tX2NtZCB7CisgICAgdW5zaWduZWQgY2hhciBsZW47CisgICAgdW5zaWduZWQgY2hhciBiaXRzWzNdOworICB9OworICBzdHJ1Y3Qgc2VlcHJvbV9jbWQgc2VlcHJvbV9yZWFkID0gezMsIHsxLCAxLCAwfX07CisKKyAgLyoKKyAgICogUmVxdWVzdCBhY2Nlc3Mgb2YgdGhlIG1lbW9yeSBwb3J0LgorICAgKi8KKyAgaWYgKGFjcXVpcmVfc2VlcHJvbShwKSA9PSAwKQorICB7CisgICAgcmV0dXJuICgwKTsKKyAgfQorCisgIC8qCisgICAqIFJlYWQgJ2xlbicgcmVnaXN0ZXJzIG9mIHRoZSBzZWVwcm9tLiAgRm9yIHRoZSA3ODcwLCB0aGUgOTNDNDYKKyAgICogU0VFUFJPTSBpcyBhIDEwMjQtYml0IGRldmljZSB3aXRoIDY0IDE2LWJpdCByZWdpc3RlcnMgYnV0IG9ubHkKKyAgICogdGhlIGZpcnN0IDMyIGFyZSB1c2VkIGJ5IEFkYXB0ZWMgQklPUy4gIFNvbWUgYWRhcHRlcnMgdXNlIHRoZQorICAgKiA5M0M1NiBTRUVQUk9NIHdoaWNoIGlzIGEgMjA0OC1iaXQgZGV2aWNlLiAgVGhlIGxvb3Agd2lsbCByYW5nZQorICAgKiBmcm9tIDAgdG8gJ2xlbicgLSAxLgorICAgKi8KKyAgZm9yIChrID0gMDsgayA8IGxlbjsgaysrKQorICB7CisgICAgLyoKKyAgICAgKiBTZW5kIGNoaXAgc2VsZWN0IGZvciBvbmUgY2xvY2sgY3ljbGUuCisgICAgICovCisgICAgYWljX291dGIocCwgU0VFTVMgfCBTRUVDSyB8IFNFRUNTLCBTRUVDVEwpOworICAgIENMT0NLX1BVTFNFKHApOworCisgICAgLyoKKyAgICAgKiBOb3cgd2UncmUgcmVhZHkgdG8gc2VuZCB0aGUgcmVhZCBjb21tYW5kIGZvbGxvd2VkIGJ5IHRoZQorICAgICAqIGFkZHJlc3Mgb2YgdGhlIDE2LWJpdCByZWdpc3RlciB3ZSB3YW50IHRvIHJlYWQuCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IHNlZXByb21fcmVhZC5sZW47IGkrKykKKyAgICB7CisgICAgICB0ZW1wID0gU0VFTVMgfCBTRUVDUyB8IChzZWVwcm9tX3JlYWQuYml0c1tpXSA8PCAxKTsKKyAgICAgIGFpY19vdXRiKHAsIHRlbXAsIFNFRUNUTCk7CisgICAgICBDTE9DS19QVUxTRShwKTsKKyAgICAgIHRlbXAgPSB0ZW1wIF4gU0VFQ0s7CisgICAgICBhaWNfb3V0YihwLCB0ZW1wLCBTRUVDVEwpOworICAgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgfQorICAgIC8qCisgICAgICogU2VuZCB0aGUgNiBvciA4IGJpdCBhZGRyZXNzIChNU0IgZmlyc3QsIExTQiBsYXN0KS4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAoKGludCkgY2hpcCAtIDEpOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICB0ZW1wID0gayArIG9mZnNldDsKKyAgICAgIHRlbXAgPSAodGVtcCA+PiBpKSAmIDE7ICAvKiBNYXNrIG91dCBhbGwgYnV0IGxvd2VyIGJpdC4gKi8KKyAgICAgIHRlbXAgPSBTRUVNUyB8IFNFRUNTIHwgKHRlbXAgPDwgMSk7CisgICAgICBhaWNfb3V0YihwLCB0ZW1wLCBTRUVDVEwpOworICAgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgICB0ZW1wID0gdGVtcCBeIFNFRUNLOworICAgICAgYWljX291dGIocCwgdGVtcCwgU0VFQ1RMKTsKKyAgICAgIENMT0NLX1BVTFNFKHApOworICAgIH0KKworICAgIC8qCisgICAgICogTm93IHJlYWQgdGhlIDE2IGJpdCByZWdpc3Rlci4gIEFuIGluaXRpYWwgMCBwcmVjZWRlcyB0aGUKKyAgICAgKiByZWdpc3RlciBjb250ZW50cyB3aGljaCBiZWdpbnMgd2l0aCBiaXQgMTUgKE1TQikgYW5kIGVuZHMKKyAgICAgKiB3aXRoIGJpdCAwIChMU0IpLiAgVGhlIGluaXRpYWwgMCB3aWxsIGJlIHNoaWZ0ZWQgb2ZmIHRoZQorICAgICAqIHRvcCBvZiBvdXIgd29yZCBhcyB3ZSBsZXQgdGhlIGxvb3AgcnVuIGZyb20gMCB0byAxNi4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDw9IDE2OyBpKyspCisgICAgeworICAgICAgdGVtcCA9IFNFRU1TIHwgU0VFQ1M7CisgICAgICBhaWNfb3V0YihwLCB0ZW1wLCBTRUVDVEwpOworICAgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgICB0ZW1wID0gdGVtcCBeIFNFRUNLOworICAgICAgc2NhcnJheVtrXSA9IChzY2FycmF5W2tdIDw8IDEpIHwgKGFpY19pbmIocCwgU0VFQ1RMKSAmIFNFRURJKTsKKyAgICAgIGFpY19vdXRiKHAsIHRlbXAsIFNFRUNUTCk7CisgICAgICBDTE9DS19QVUxTRShwKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRoZSBzZXJpYWwgRUVQUk9NIHNob3VsZCBoYXZlIGEgY2hlY2tzdW0gaW4gdGhlIGxhc3Qgd29yZC4KKyAgICAgKiBLZWVwIGEgcnVubmluZyBjaGVja3N1bSBmb3IgYWxsIHdvcmRzIHJlYWQgZXhjZXB0IGZvciB0aGUKKyAgICAgKiBsYXN0IHdvcmQuICBXZSdsbCB2ZXJpZnkgdGhlIGNoZWNrc3VtIGFmdGVyIGFsbCB3b3JkcyBoYXZlCisgICAgICogYmVlbiByZWFkLgorICAgICAqLworICAgIGlmIChrIDwgKGxlbiAtIDEpKQorICAgIHsKKyAgICAgIGNoZWNrc3VtID0gY2hlY2tzdW0gKyBzY2FycmF5W2tdOworICAgIH0KKworICAgIC8qCisgICAgICogUmVzZXQgdGhlIGNoaXAgc2VsZWN0IGZvciB0aGUgbmV4dCBjb21tYW5kIGN5Y2xlLgorICAgICAqLworICAgIGFpY19vdXRiKHAsIFNFRU1TLCBTRUVDVEwpOworICAgIENMT0NLX1BVTFNFKHApOworICAgIGFpY19vdXRiKHAsIFNFRU1TIHwgU0VFQ0ssIFNFRUNUTCk7CisgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgYWljX291dGIocCwgU0VFTVMsIFNFRUNUTCk7CisgICAgQ0xPQ0tfUFVMU0UocCk7CisgIH0KKworICAvKgorICAgKiBSZWxlYXNlIGFjY2VzcyB0byB0aGUgbWVtb3J5IHBvcnQgYW5kIHRoZSBzZXJpYWwgRUVQUk9NLgorICAgKi8KKyAgcmVsZWFzZV9zZWVwcm9tKHApOworCisjaWYgMAorICBwcmludGsoIkNvbXB1dGVkIGNoZWNrc3VtIDB4JXgsIGNoZWNrc3VtIHJlYWQgMHgleFxuIiwKKyAgICAgICAgIGNoZWNrc3VtLCBzY2FycmF5W2xlbiAtIDFdKTsKKyAgcHJpbnRrKCJTZXJpYWwgRUVQUk9NOiIpOworICBmb3IgKGsgPSAwOyBrIDwgbGVuOyBrKyspCisgIHsKKyAgICBpZiAoKChrICUgOCkgPT0gMCkgJiYgKGsgIT0gMCkpCisgICAgeworICAgICAgcHJpbnRrKCJcbiAgICAgICAgICAgICAgIik7CisgICAgfQorICAgIHByaW50aygiIDB4JXgiLCBzY2FycmF5W2tdKTsKKyAgfQorICBwcmludGsoIlxuIik7CisjZW5kaWYKKyAgaWYgKCAoY2hlY2tzdW0gIT0gc2NhcnJheVtsZW4gLSAxXSkgfHwgKGNoZWNrc3VtID09IDApICkKKyAgeworICAgIHJldHVybiAoMCk7CisgIH0KKworICByZXR1cm4gKDEpOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIHJlYWRfYnJkY3RsCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFJlYWRzIHRoZSBCUkRDVEwgcmVnaXN0ZXIuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyCityZWFkX2JyZGN0bChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKQoreworICB1bnNpZ25lZCBjaGFyIGJyZGN0bCwgdmFsdWU7CisKKyAgLyoKKyAgICogTWFrZSBzdXJlIHRoZSBTRUVQUk9NIGlzIHJlYWR5IGJlZm9yZSB3ZSBhY2Nlc3MgaXQKKyAgICovCisgIENMT0NLX1BVTFNFKHApOworICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICB7CisgICAgYnJkY3RsID0gQlJEUldfVUxUUkEyOworICAgIGFpY19vdXRiKHAsIGJyZGN0bCwgQlJEQ1RMKTsKKyAgICBDTE9DS19QVUxTRShwKTsKKyAgICB2YWx1ZSA9IGFpY19pbmIocCwgQlJEQ1RMKTsKKyAgICBDTE9DS19QVUxTRShwKTsKKyAgICByZXR1cm4odmFsdWUpOworICB9CisgIGJyZGN0bCA9IEJSRFJXOworICBpZiAoICEoKHAtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spID09IEFIQ19BSUM3ODk1KSB8fAorICAgICAgICAocC0+ZmxhZ3MgJiBBSENfQ0hOTEIpICkKKyAgeworICAgIGJyZGN0bCB8PSBCUkRDUzsKKyAgfQorICBhaWNfb3V0YihwLCBicmRjdGwsIEJSRENUTCk7CisgIENMT0NLX1BVTFNFKHApOworICB2YWx1ZSA9IGFpY19pbmIocCwgQlJEQ1RMKTsKKyAgQ0xPQ0tfUFVMU0UocCk7CisgIGFpY19vdXRiKHAsIDAsIEJSRENUTCk7CisgIENMT0NLX1BVTFNFKHApOworICByZXR1cm4gKHZhbHVlKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICB3cml0ZV9icmRjdGwKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgV3JpdGVzIGEgdmFsdWUgdG8gdGhlIEJSRENUTCByZWdpc3Rlci4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3dyaXRlX2JyZGN0bChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworICB1bnNpZ25lZCBjaGFyIGJyZGN0bDsKKworICAvKgorICAgKiBNYWtlIHN1cmUgdGhlIFNFRVBST00gaXMgcmVhZHkgYmVmb3JlIHdlIGFjY2VzcyBpdAorICAgKi8KKyAgQ0xPQ0tfUFVMU0UocCk7CisgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgIHsKKyAgICBicmRjdGwgPSB2YWx1ZTsKKyAgICBhaWNfb3V0YihwLCBicmRjdGwsIEJSRENUTCk7CisgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgYnJkY3RsIHw9IEJSRFNUQl9VTFRSQTI7CisgICAgYWljX291dGIocCwgYnJkY3RsLCBCUkRDVEwpOworICAgIENMT0NLX1BVTFNFKHApOworICAgIGJyZGN0bCAmPSB+QlJEU1RCX1VMVFJBMjsKKyAgICBhaWNfb3V0YihwLCBicmRjdGwsIEJSRENUTCk7CisgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgcmVhZF9icmRjdGwocCk7CisgICAgQ0xPQ0tfUFVMU0UocCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgYnJkY3RsID0gQlJEU1RCOworICAgIGlmICggISgocC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykgPT0gQUhDX0FJQzc4OTUpIHx8CisgICAgICAgICAgKHAtPmZsYWdzICYgQUhDX0NITkxCKSApCisgICAgeworICAgICAgYnJkY3RsIHw9IEJSRENTOworICAgIH0KKyAgICBicmRjdGwgPSBCUkRTVEIgfCBCUkRDUzsKKyAgICBhaWNfb3V0YihwLCBicmRjdGwsIEJSRENUTCk7CisgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgYnJkY3RsIHw9IHZhbHVlOworICAgIGFpY19vdXRiKHAsIGJyZGN0bCwgQlJEQ1RMKTsKKyAgICBDTE9DS19QVUxTRShwKTsKKyAgICBicmRjdGwgJj0gfkJSRFNUQjsKKyAgICBhaWNfb3V0YihwLCBicmRjdGwsIEJSRENUTCk7CisgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgYnJkY3RsICY9IH5CUkRDUzsKKyAgICBhaWNfb3V0YihwLCBicmRjdGwsIEJSRENUTCk7CisgICAgQ0xPQ0tfUFVMU0UocCk7CisgIH0KK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3ODV4X2NhYmxlX2RldGVjdAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBEZXRlY3QgdGhlIGNhYmxlcyB0aGF0IGFyZSBwcmVzZW50IG9uIGFpYzc4NXggY2xhc3MgY29udHJvbGxlciBjaGlwcworICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljNzg1eF9jYWJsZV9kZXRlY3Qoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgaW50ICppbnRfNTAsCisgICAgaW50ICpleHRfcHJlc2VudCwgaW50ICplZXByb20pCit7CisgIHVuc2lnbmVkIGNoYXIgYnJkY3RsOworCisgIGFpY19vdXRiKHAsIEJSRFJXIHwgQlJEQ1MsIEJSRENUTCk7CisgIENMT0NLX1BVTFNFKHApOworICBhaWNfb3V0YihwLCAwLCBCUkRDVEwpOworICBDTE9DS19QVUxTRShwKTsKKyAgYnJkY3RsID0gYWljX2luYihwLCBCUkRDVEwpOworICBDTE9DS19QVUxTRShwKTsKKyAgKmludF81MCA9ICEoYnJkY3RsICYgQlJEREFUNSk7CisgICpleHRfcHJlc2VudCA9ICEoYnJkY3RsICYgQlJEREFUNik7CisgICplZXByb20gPSAoYWljX2luYihwLCBTUElPQ0FQKSAmIEVFUFJPTSk7Cit9CisKKyN1bmRlZiBDTE9DS19QVUxTRQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzI5NDBfdXdwcm9fY2FibGVfZGV0ZWN0CisgKgorICogRGVzY3JpcHRpb246CisgKiAgIERldGVjdCB0aGUgY2FibGVzIHRoYXQgYXJlIHByZXNlbnQgb24gdGhlIDI5NDAtVVdQcm8gY2FyZHMKKyAqCisgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhlIFNFRVBST00gd2lsbCBoYXZlIGFscmVhZHkgYmVlbiBhY3F1aXJlZAorICogICAgICAgcHJpb3IgdG8gaW52b2NhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljMjk0MF91d3Byb193aWRlX2NhYmxlX2RldGVjdChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBpbnQgKmludF82OCwKKyAgICBpbnQgKmV4dF82OCwgaW50ICplZXByb20pCit7CisgIHVuc2lnbmVkIGNoYXIgYnJkY3RsOworCisgIC8qCisgICAqIEZpcnN0IHJlYWQgdGhlIHN0YXR1cyBvZiBvdXIgY2FibGVzLiAgU2V0IHRoZSByb20gYmFuayB0bworICAgKiAwIHNpbmNlIHRoZSBiYW5rIHNldHRpbmcgc2VydmVzIGFzIGEgbXVsdGlwbGV4b3IgZm9yIHRoZQorICAgKiBjYWJsZSBkZXRlY3Rpb24gbG9naWMuICBCUkREQVQ1IGNvbnRyb2xzIHRoZSBiYW5rIHN3aXRjaC4KKyAgICovCisgIHdyaXRlX2JyZGN0bChwLCAwKTsKKworICAvKgorICAgKiBOb3cgd2UgcmVhZCB0aGUgc3RhdGUgb2YgdGhlIGludGVybmFsIDY4IGNvbm5lY3Rvci4gIEJSRERBVDYKKyAgICogaXMgZG9uJ3QgY2FyZSwgQlJEREFUNyBpcyBpbnRlcm5hbCA2OC4gIFRoZSBjYWJsZSBpcworICAgKiBwcmVzZW50IGlmIHRoZSBiaXQgaXMgMAorICAgKi8KKyAgYnJkY3RsID0gcmVhZF9icmRjdGwocCk7CisgICppbnRfNjggPSAhKGJyZGN0bCAmIEJSRERBVDcpOworCisgIC8qCisgICAqIFNldCB0aGUgYmFuayBiaXQgaW4gYnJkY3RsIGFuZCB0aGVuIHJlYWQgdGhlIGV4dGVybmFsIGNhYmxlIHN0YXRlCisgICAqIGFuZCB0aGUgRUVQUk9NIHN0YXR1cworICAgKi8KKyAgd3JpdGVfYnJkY3RsKHAsIEJSRERBVDUpOworICBicmRjdGwgPSByZWFkX2JyZGN0bChwKTsKKworICAqZXh0XzY4ID0gIShicmRjdGwgJiBCUkREQVQ2KTsKKyAgKmVlcHJvbSA9ICEoYnJkY3RsICYgQlJEREFUNyk7CisKKyAgLyoKKyAgICogV2UncmUgZG9uZSwgdGhlIGNhbGxpbmcgZnVuY3Rpb24gd2lsbCByZWxlYXNlIHRoZSBTRUVQUk9NIGZvciB1cworICAgKi8KK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3ODd4X2NhYmxlX2RldGVjdAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBEZXRlY3QgdGhlIGNhYmxlcyB0aGF0IGFyZSBwcmVzZW50IG9uIGFpYzc4N3ggY2xhc3MgY29udHJvbGxlciBjaGlwcworICoKKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGUgU0VFUFJPTSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIGFjcXVpcmVkCisgKiAgICAgICBwcmlvciB0byBpbnZvY2F0aW9uIG9mIHRoaXMgZnVuY3Rpb24uCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3ODd4X2NhYmxlX2RldGVjdChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBpbnQgKmludF81MCwgaW50ICppbnRfNjgsCisgICAgaW50ICpleHRfcHJlc2VudCwgaW50ICplZXByb20pCit7CisgIHVuc2lnbmVkIGNoYXIgYnJkY3RsOworCisgIC8qCisgICAqIEZpcnN0IHJlYWQgdGhlIHN0YXR1cyBvZiBvdXIgY2FibGVzLiAgU2V0IHRoZSByb20gYmFuayB0bworICAgKiAwIHNpbmNlIHRoZSBiYW5rIHNldHRpbmcgc2VydmVzIGFzIGEgbXVsdGlwbGV4b3IgZm9yIHRoZQorICAgKiBjYWJsZSBkZXRlY3Rpb24gbG9naWMuICBCUkREQVQ1IGNvbnRyb2xzIHRoZSBiYW5rIHN3aXRjaC4KKyAgICovCisgIHdyaXRlX2JyZGN0bChwLCAwKTsKKworICAvKgorICAgKiBOb3cgd2UgcmVhZCB0aGUgc3RhdGUgb2YgdGhlIHR3byBpbnRlcm5hbCBjb25uZWN0b3JzLiAgQlJEREFUNgorICAgKiBpcyBpbnRlcm5hbCA1MCwgQlJEREFUNyBpcyBpbnRlcm5hbCA2OC4gIEZvciBlYWNoLCB0aGUgY2FibGUgaXMKKyAgICogcHJlc2VudCBpZiB0aGUgYml0IGlzIDAKKyAgICovCisgIGJyZGN0bCA9IHJlYWRfYnJkY3RsKHApOworICAqaW50XzUwID0gIShicmRjdGwgJiBCUkREQVQ2KTsKKyAgKmludF82OCA9ICEoYnJkY3RsICYgQlJEREFUNyk7CisKKyAgLyoKKyAgICogU2V0IHRoZSBiYW5rIGJpdCBpbiBicmRjdGwgYW5kIHRoZW4gcmVhZCB0aGUgZXh0ZXJuYWwgY2FibGUgc3RhdGUKKyAgICogYW5kIHRoZSBFRVBST00gc3RhdHVzCisgICAqLworICB3cml0ZV9icmRjdGwocCwgQlJEREFUNSk7CisgIGJyZGN0bCA9IHJlYWRfYnJkY3RsKHApOworCisgICpleHRfcHJlc2VudCA9ICEoYnJkY3RsICYgQlJEREFUNik7CisgICplZXByb20gPSAhKGJyZGN0bCAmIEJSRERBVDcpOworCisgIC8qCisgICAqIFdlJ3JlIGRvbmUsIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIHdpbGwgcmVsZWFzZSB0aGUgU0VFUFJPTSBmb3IgdXMKKyAgICovCit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljNzg3eF91bHRyYTJfdGVybV9kZXRlY3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgRGV0ZWN0IHRoZSB0ZXJtaW5hdGlvbiBzZXR0aW5ncyBwcmVzZW50IG9uIHVsdHJhMiBjbGFzcyBjb250cm9sbGVycworICoKKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGUgU0VFUFJPTSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIGFjcXVpcmVkCisgKiAgICAgICBwcmlvciB0byBpbnZvY2F0aW9uIG9mIHRoaXMgZnVuY3Rpb24uCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X3VsdHJhMl90ZXJtX2RldGVjdChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBpbnQgKmVuYWJsZVNFX2xvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZW5hYmxlU0VfaGlnaCwgaW50ICplbmFibGVMVkRfbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbmFibGVMVkRfaGlnaCwgaW50ICplcHJvbV9wcmVzZW50KQoreworICB1bnNpZ25lZCBjaGFyIGJyZGN0bDsKKworICBicmRjdGwgPSByZWFkX2JyZGN0bChwKTsKKworICAqZXByb21fcHJlc2VudCAgPSAoYnJkY3RsICYgQlJEREFUNyk7CisgICplbmFibGVTRV9oaWdoICA9IChicmRjdGwgJiBCUkREQVQ2KTsKKyAgKmVuYWJsZVNFX2xvdyAgID0gKGJyZGN0bCAmIEJSRERBVDUpOworICAqZW5hYmxlTFZEX2hpZ2ggPSAoYnJkY3RsICYgQlJEREFUNCk7CisgICplbmFibGVMVkRfbG93ICA9IChicmRjdGwgJiBCUkREQVQzKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBjb25maWd1cmVfdGVybWluYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgQ29uZmlndXJlcyB0aGUgdGVybWluYXRpb24gc2V0dGluZ3Mgb24gUENJIGFkYXB0ZXJzIHRoYXQgaGF2ZQorICogICBTRUVQUk9NcyBhdmFpbGFibGUuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitjb25maWd1cmVfdGVybWluYXRpb24oc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKyAgaW50IGludGVybmFsNTBfcHJlc2VudCA9IDA7CisgIGludCBpbnRlcm5hbDY4X3ByZXNlbnQgPSAwOworICBpbnQgZXh0ZXJuYWxfcHJlc2VudCA9IDA7CisgIGludCBlcHJvbV9wcmVzZW50ID0gMDsKKyAgaW50IGVuYWJsZVNFX2xvdyA9IDA7CisgIGludCBlbmFibGVTRV9oaWdoID0gMDsKKyAgaW50IGVuYWJsZUxWRF9sb3cgPSAwOworICBpbnQgZW5hYmxlTFZEX2hpZ2ggPSAwOworICB1bnNpZ25lZCBjaGFyIGJyZGRhdCA9IDA7CisgIHVuc2lnbmVkIGNoYXIgbWF4X3RhcmdldCA9IDA7CisgIHVuc2lnbmVkIGNoYXIgc3hmcmN0bDEgPSBhaWNfaW5iKHAsIFNYRlJDVEwxKTsKKworICBpZiAoYWNxdWlyZV9zZWVwcm9tKHApKQorICB7CisgICAgaWYgKHAtPmZlYXR1cmVzICYgKEFIQ19XSURFfEFIQ19UV0lOKSkKKyAgICAgIG1heF90YXJnZXQgPSAxNjsKKyAgICBlbHNlCisgICAgICBtYXhfdGFyZ2V0ID0gODsKKyAgICBhaWNfb3V0YihwLCBTRUVNUyB8IFNFRUNTLCBTRUVDVEwpOworICAgIHN4ZnJjdGwxICY9IH5TVFBXRU47CisgICAgLyoKKyAgICAgKiBUaGUgdGVybWluYXRpb24vY2FibGUgZGV0ZWN0aW9uIGxvZ2ljIGlzIHNwbGl0IGludG8gdGhyZWUgZGlzdGluY3QKKyAgICAgKiBncm91cHMuICBVbHRyYTIgYW5kIGxhdGVyIGNvbnRyb2xsZXJzLCAyOTQwVVctUHJvIGNvbnRyb2xsZXJzLCBhbmQKKyAgICAgKiBvbGRlciA3ODUwLCA3ODYwLCA3ODcwLCA3ODgwLCBhbmQgNzg5NSBjb250cm9sbGVycy4gIEVhY2ggaGFzIGl0cworICAgICAqIG93biB1bmlxdWUgd2F5IG9mIGRldGVjdGluZyB0aGVpciBjYWJsZXMgYW5kIHdyaXRpbmcgdGhlIHJlc3VsdHMKKyAgICAgKiBiYWNrIHRvIHRoZSBjYXJkLgorICAgICAqLworICAgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgICAgeworICAgICAgLyoKKyAgICAgICAqIEFzIGxvbmcgYXMgdXNlciBoYXNuJ3Qgb3ZlcnJpZGRlbiB0ZXJtIHNldHRpbmdzLCBhbHdheXMgY2hlY2sgdGhlCisgICAgICAgKiBjYWJsZSBkZXRlY3Rpb24gbG9naWMKKyAgICAgICAqLworICAgICAgaWYgKGFpYzd4eHhfb3ZlcnJpZGVfdGVybSA9PSAtMSkKKyAgICAgIHsKKyAgICAgICAgYWljN3h4eF91bHRyYTJfdGVybV9kZXRlY3QocCwgJmVuYWJsZVNFX2xvdywgJmVuYWJsZVNFX2hpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVMVkRfbG93LCAmZW5hYmxlTFZEX2hpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcHJvbV9wcmVzZW50KTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoKKyAgICAgICAqIElmIHRoZSB1c2VyIGlzIG92ZXJyaWRpbmcgc2V0dGluZ3MsIHRoZW4gdGhleSBoYXZlIGJlZW4gcHJlc2VydmVkCisgICAgICAgKiB0byBoZXJlIGFzIGZha2UgYWRhcHRlcl9jb250cm9sIGVudHJpZXMuICBQYXJzZSB0aGVtIGFuZCBhbGxvdworICAgICAgICogdGhlbSB0byBvdmVycmlkZSB0aGUgZGV0ZWN0ZWQgc2V0dGluZ3MgKGlmIHdlIGV2ZW4gZGlkIGRldGVjdGlvbikuCisgICAgICAgKi8KKyAgICAgIGlmICghKHAtPmFkYXB0ZXJfY29udHJvbCAmIENGU0VBVVRPVEVSTSkpCisgICAgICB7CisgICAgICAgIGVuYWJsZVNFX2xvdyA9IChwLT5hZGFwdGVyX2NvbnRyb2wgJiBDRlNURVJNKTsKKyAgICAgICAgZW5hYmxlU0VfaGlnaCA9IChwLT5hZGFwdGVyX2NvbnRyb2wgJiBDRldTVEVSTSk7CisgICAgICB9CisgICAgICBpZiAoIShwLT5hZGFwdGVyX2NvbnRyb2wgJiBDRkFVVE9URVJNKSkKKyAgICAgIHsKKyAgICAgICAgZW5hYmxlTFZEX2xvdyA9IGVuYWJsZUxWRF9oaWdoID0gKHAtPmFkYXB0ZXJfY29udHJvbCAmIENGTFZEU1RFUk0pOworICAgICAgfQorCisgICAgICAvKgorICAgICAgICogTm93IHRha2UgdGhvc2Ugc2V0dGluZ3MgdGhhdCB3ZSBoYXZlIGFuZCB0cmFuc2xhdGUgdGhlbSBpbnRvIHRoZQorICAgICAgICogdmFsdWVzIHRoYXQgbXVzdCBiZSB3cml0dGVuIGludG8gdGhlIHJlZ2lzdGVycy4KKyAgICAgICAqCisgICAgICAgKiBGbGFzaCBFbmFibGUgPSBCUkREQVQ3CisgICAgICAgKiBTZWNvbmRhcnkgSGlnaCBUZXJtIEVuYWJsZSA9IEJSRERBVDYKKyAgICAgICAqIFNlY29uZGFyeSBMb3cgVGVybSBFbmFibGUgPSBCUkREQVQ1CisgICAgICAgKiBMVkQvUHJpbWFyeSBIaWdoIFRlcm0gRW5hYmxlID0gQlJEREFUNAorICAgICAgICogTFZEL1ByaW1hcnkgTG93IFRlcm0gRW5hYmxlID0gU1RQV0VOIGJpdCBpbiBTWEZSQ1RMMQorICAgICAgICovCisgICAgICBpZiAoZW5hYmxlTFZEX2xvdyAhPSAwKQorICAgICAgeworICAgICAgICBzeGZyY3RsMSB8PSBTVFBXRU47CisgICAgICAgIHAtPmZsYWdzIHw9IEFIQ19URVJNX0VOQl9MVkQ7CisgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1BST0JFMikKKyAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBMVkQvUHJpbWFyeSBMb3cgYnl0ZSB0ZXJtaW5hdGlvbiAiCisgICAgICAgICAgICAgICAgICJFbmFibGVkXG4iLCBwLT5ob3N0X25vKTsKKyAgICAgIH0KKyAgICAgICAgICAKKyAgICAgIGlmIChlbmFibGVMVkRfaGlnaCAhPSAwKQorICAgICAgeworICAgICAgICBicmRkYXQgfD0gQlJEREFUNDsKKyAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIExWRC9QcmltYXJ5IEhpZ2ggYnl0ZSB0ZXJtaW5hdGlvbiAiCisgICAgICAgICAgICAgICAgICJFbmFibGVkXG4iLCBwLT5ob3N0X25vKTsKKyAgICAgIH0KKworICAgICAgaWYgKGVuYWJsZVNFX2xvdyAhPSAwKQorICAgICAgeworICAgICAgICBicmRkYXQgfD0gQlJEREFUNTsKKyAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIFNlY29uZGFyeSBMb3cgYnl0ZSB0ZXJtaW5hdGlvbiAiCisgICAgICAgICAgICAgICAgICJFbmFibGVkXG4iLCBwLT5ob3N0X25vKTsKKyAgICAgIH0KKworICAgICAgaWYgKGVuYWJsZVNFX2hpZ2ggIT0gMCkKKyAgICAgIHsKKyAgICAgICAgYnJkZGF0IHw9IEJSRERBVDY7CisgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1BST0JFMikKKyAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBTZWNvbmRhcnkgSGlnaCBieXRlIHRlcm1pbmF0aW9uICIKKyAgICAgICAgICAgICAgICAgIkVuYWJsZWRcbiIsIHAtPmhvc3Rfbm8pOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19ORVdfQVVUT1RFUk0pCisgICAgeworICAgICAgLyoKKyAgICAgICAqIFRoZSA1MCBwaW4gY29ubmVjdG9yIHRlcm1pbmF0aW9uIGlzIGNvbnRyb2xsZWQgYnkgU1RQV0VOIGluIHRoZQorICAgICAgICogU1hGUkNUTDEgcmVnaXN0ZXIuICBTaW5jZSB0aGUgQWRhcHRlYyBkb2NzIHR5cGljYWxseSBzYXkgdGhlCisgICAgICAgKiBjb250cm9sbGVyIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGluIHRoZSBtaWRkbGUgb2YgYSBjYWJsZSBhbmQKKyAgICAgICAqIHRoaXMgaXMgdGhlIG9ubHkgY29ubmVjdGlvbiBvbiB0aGF0IHN0dWIgb2YgdGhlIGJ1cywgdGhlcmUgaXMKKyAgICAgICAqIG5vIG5lZWQgdG8gZXZlbiBjaGVjayBmb3IgbmFycm93IHRlcm1pbmF0aW9uLCBpdCdzIHNpbXBseQorICAgICAgICogYWx3YXlzIG9uLgorICAgICAgICovCisgICAgICBzeGZyY3RsMSB8PSBTVFBXRU47CisgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIE5hcnJvdyBjaGFubmVsIHRlcm1pbmF0aW9uIEVuYWJsZWRcbiIsCisgICAgICAgICAgICAgICBwLT5ob3N0X25vKTsKKworICAgICAgaWYgKHAtPmFkYXB0ZXJfY29udHJvbCAmIENGQVVUT1RFUk0pCisgICAgICB7CisgICAgICAgIGFpYzI5NDBfdXdwcm9fd2lkZV9jYWJsZV9kZXRlY3QocCwgJmludGVybmFsNjhfcHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0ZXJuYWxfcHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXByb21fcHJlc2VudCk7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIENhYmxlcyBwcmVzZW50IChJbnQtNTAgJXMsIEludC02OCAlcywgIgorICAgICAgICAgICAgICAgIkV4dC02OCAlcylcbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICAgICAiRG9uJ3QgQ2FyZSIsCisgICAgICAgICAgICAgICBpbnRlcm5hbDY4X3ByZXNlbnQgPyAiWUVTIiA6ICJOTyIsCisgICAgICAgICAgICAgICBleHRlcm5hbF9wcmVzZW50ID8gIllFUyIgOiAiTk8iKTsKKyAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIEVFUFJPTSAlcyBwcmVzZW50LlxuIiwgcC0+aG9zdF9ubywKKyAgICAgICAgICAgICAgIGVwcm9tX3ByZXNlbnQgPyAiaXMiIDogImlzIG5vdCIpOworICAgICAgICBpZiAoaW50ZXJuYWw2OF9wcmVzZW50ICYmIGV4dGVybmFsX3ByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICBicmRkYXQgPSAwOworICAgICAgICAgIHAtPmZsYWdzICY9IH5BSENfVEVSTV9FTkJfU0VfSElHSDsKKyAgICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBXaWRlIGNoYW5uZWwgdGVybWluYXRpb24gRGlzYWJsZWRcbiIsCisgICAgICAgICAgICAgICAgICAgcC0+aG9zdF9ubyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgYnJkZGF0ID0gQlJEREFUNjsKKyAgICAgICAgICBwLT5mbGFncyB8PSBBSENfVEVSTV9FTkJfU0VfSElHSDsKKyAgICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBXaWRlIGNoYW5uZWwgdGVybWluYXRpb24gRW5hYmxlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBwLT5ob3N0X25vKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgdGVybWluYXRpb24gb2YgdGhlIFdpZGUgY2hhbm5lbCBpcyBkb25lIG1vcmUgbGlrZSBub3JtYWwKKyAgICAgICAgICogdGhvdWdoLCBhbmQgdGhlIHNldHRpbmcgb2YgdGhpcyB0ZXJtaW5hdGlvbiBpcyBkb25lIGJ5IHdyaXRpbmcKKyAgICAgICAgICogZWl0aGVyIGEgMCBvciAxIHRvIEJSRERBVDYgb2YgdGhlIEJSRERBVCByZWdpc3RlcgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHAtPmFkYXB0ZXJfY29udHJvbCAmIENGV1NURVJNKQorICAgICAgICB7CisgICAgICAgICAgYnJkZGF0ID0gQlJEREFUNjsKKyAgICAgICAgICBwLT5mbGFncyB8PSBBSENfVEVSTV9FTkJfU0VfSElHSDsKKyAgICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBXaWRlIGNoYW5uZWwgdGVybWluYXRpb24gRW5hYmxlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBwLT5ob3N0X25vKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBicmRkYXQgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAocC0+YWRhcHRlcl9jb250cm9sICYgQ0ZBVVRPVEVSTSkKKyAgICAgIHsKKyAgICAgICAgaWYgKHAtPmZsYWdzICYgQUhDX01PVEhFUkJPQVJEKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiKHNjc2klZCkgV2FybmluZyAtIGRldGVjdGVkIGF1dG8tdGVybWluYXRpb25cbiIsCisgICAgICAgICAgICAgICAgIHAtPmhvc3Rfbm8pOworICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIFBsZWFzZSB2ZXJpZnkgZHJpdmVyIGRldGVjdGVkIHNldHRpbmdzICIKKyAgICAgICAgICAgICJhcmUgY29ycmVjdC5cbiIsIHAtPmhvc3Rfbm8pOworICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIElmIG5vdCwgdGhlbiBwbGVhc2UgcHJvcGVybHkgc2V0IHRoZSAiCisgICAgICAgICAgICAiZGV2aWNlIHRlcm1pbmF0aW9uXG4iLCBwLT5ob3N0X25vKTsKKyAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBpbiB0aGUgQWRhcHRlYyBTQ1NJIEJJT1MgYnkgaGl0dGluZyAiCisgICAgICAgICAgICAiQ1RSTC1BIHdoZW4gcHJvbXB0ZWRcbiIsIHAtPmhvc3Rfbm8pOworICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIGR1cmluZyBtYWNoaW5lIGJvb3R1cC5cbiIsIHAtPmhvc3Rfbm8pOworICAgICAgICB9CisgICAgICAgIC8qIENvbmZpZ3VyZSBhdXRvIHRlcm1pbmF0aW9uLiAqLworCisgICAgICAgIGlmICggKHAtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spID49IEFIQ19BSUM3ODcwICkKKyAgICAgICAgeworICAgICAgICAgIGFpYzc4N3hfY2FibGVfZGV0ZWN0KHAsICZpbnRlcm5hbDUwX3ByZXNlbnQsICZpbnRlcm5hbDY4X3ByZXNlbnQsCisgICAgICAgICAgICAmZXh0ZXJuYWxfcHJlc2VudCwgJmVwcm9tX3ByZXNlbnQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGFpYzc4NXhfY2FibGVfZGV0ZWN0KHAsICZpbnRlcm5hbDUwX3ByZXNlbnQsICZleHRlcm5hbF9wcmVzZW50LAorICAgICAgICAgICAgJmVwcm9tX3ByZXNlbnQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1heF90YXJnZXQgPD0gOCkKKyAgICAgICAgICBpbnRlcm5hbDY4X3ByZXNlbnQgPSAwOworCisgICAgICAgIGlmIChtYXhfdGFyZ2V0ID4gOCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIENhYmxlcyBwcmVzZW50IChJbnQtNTAgJXMsIEludC02OCAlcywgIgorICAgICAgICAgICAgICAgICAiRXh0LTY4ICVzKVxuIiwgcC0+aG9zdF9ubywKKyAgICAgICAgICAgICAgICAgaW50ZXJuYWw1MF9wcmVzZW50ID8gIllFUyIgOiAiTk8iLAorICAgICAgICAgICAgICAgICBpbnRlcm5hbDY4X3ByZXNlbnQgPyAiWUVTIiA6ICJOTyIsCisgICAgICAgICAgICAgICAgIGV4dGVybmFsX3ByZXNlbnQgPyAiWUVTIiA6ICJOTyIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIENhYmxlcyBwcmVzZW50IChJbnQtNTAgJXMsIEV4dC01MCAlcylcbiIsCisgICAgICAgICAgICAgICAgIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICAgICAgIGludGVybmFsNTBfcHJlc2VudCA/ICJZRVMiIDogIk5PIiwKKyAgICAgICAgICAgICAgICAgZXh0ZXJuYWxfcHJlc2VudCA/ICJZRVMiIDogIk5PIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIEVFUFJPTSAlcyBwcmVzZW50LlxuIiwgcC0+aG9zdF9ubywKKyAgICAgICAgICAgICAgIGVwcm9tX3ByZXNlbnQgPyAiaXMiIDogImlzIG5vdCIpOworCisgICAgICAgIC8qCisgICAgICAgICAqIE5vdyBzZXQgdGhlIHRlcm1pbmF0aW9uIGJhc2VkIG9uIHdoYXQgd2UgZm91bmQuICBCUkREQVQ2CisgICAgICAgICAqIGNvbnRyb2xzIHdpZGUgdGVybWluYXRpb24gZW5hYmxlLgorICAgICAgICAgKiBGbGFzaCBFbmFibGUgPSBCUkREQVQ3CisgICAgICAgICAqIFNFIEhpZ2ggVGVybSBFbmFibGUgPSBCUkREQVQ2CisgICAgICAgICAqLworICAgICAgICBpZiAoaW50ZXJuYWw1MF9wcmVzZW50ICYmIGludGVybmFsNjhfcHJlc2VudCAmJiBleHRlcm5hbF9wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiKHNjc2klZCkgSWxsZWdhbCBjYWJsZSBjb25maWd1cmF0aW9uISEgIE9ubHkgdHdvXG4iLAorICAgICAgICAgICAgICAgICBwLT5ob3N0X25vKTsKKyAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBjb25uZWN0b3JzIG9uIHRoZSBTQ1NJIGNvbnRyb2xsZXIgbWF5IGJlICIKKyAgICAgICAgICAgICAgICAgImluIHVzZSBhdCBhIHRpbWUhXG4iLCBwLT5ob3N0X25vKTsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIEZvcmNlIHRlcm1pbmF0aW9uIChsb3cgYW5kIGhpZ2ggYnl0ZSkgb24uICBUaGlzIGlzIHNhZmVyIHRoYW4KKyAgICAgICAgICAgKiBsZWF2aW5nIGl0IGNvbXBsZXRlbHkgb2ZmLCBlc3BlY2lhbGx5IHNpbmNlIHRoaXMgbWVzc2FnZSBjb21lcworICAgICAgICAgICAqIG1vc3Qgb2Z0ZW4gZnJvbSBtb3RoZXJib2FyZCBjb250cm9sbGVycyB0aGF0IGRvbid0IGV2ZW4gaGF2ZSAzCisgICAgICAgICAgICogY29ubmVjdG9ycywgYnV0IGluc3RlYWQgYXJlIGZhaWxpbmcgdGhlIGNhYmxlIGRldGVjdGlvbi4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpbnRlcm5hbDUwX3ByZXNlbnQgPSBleHRlcm5hbF9wcmVzZW50ID0gMDsKKyAgICAgICAgICBlbmFibGVTRV9oaWdoID0gZW5hYmxlU0VfbG93ID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobWF4X3RhcmdldCA+IDgpICYmCisgICAgICAgICAgICAoKGV4dGVybmFsX3ByZXNlbnQgPT0gMCkgfHwgKGludGVybmFsNjhfcHJlc2VudCA9PSAwKSkgKQorICAgICAgICB7CisgICAgICAgICAgYnJkZGF0IHw9IEJSRERBVDY7CisgICAgICAgICAgcC0+ZmxhZ3MgfD0gQUhDX1RFUk1fRU5CX1NFX0hJR0g7CisgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiKHNjc2klZCkgU0UgSGlnaCBieXRlIHRlcm1pbmF0aW9uIEVuYWJsZWRcbiIsCisgICAgICAgICAgICAgICAgICAgcC0+aG9zdF9ubyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICgoaW50ZXJuYWw1MF9wcmVzZW50ID8gMSA6IDApICsKKyAgICAgICAgICAgICAgKGludGVybmFsNjhfcHJlc2VudCA/IDEgOiAwKSArCisgICAgICAgICAgICAgIChleHRlcm5hbF9wcmVzZW50ICAgPyAxIDogMCkpIDw9IDEgKQorICAgICAgICB7CisgICAgICAgICAgc3hmcmN0bDEgfD0gU1RQV0VOOworICAgICAgICAgIHAtPmZsYWdzIHw9IEFIQ19URVJNX0VOQl9TRV9MT1c7CisgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiKHNjc2klZCkgU0UgTG93IGJ5dGUgdGVybWluYXRpb24gRW5hYmxlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBwLT5ob3N0X25vKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSAvKiBwLT5hZGFwdGVyX2NvbnRyb2wgJiBDRkFVVE9URVJNICovCisgICAgICB7CisgICAgICAgIGlmIChwLT5hZGFwdGVyX2NvbnRyb2wgJiBDRlNURVJNKQorICAgICAgICB7CisgICAgICAgICAgc3hmcmN0bDEgfD0gU1RQV0VOOworICAgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1BST0JFMikKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIFNFIExvdyBieXRlIHRlcm1pbmF0aW9uIEVuYWJsZWRcbiIsCisgICAgICAgICAgICAgICAgICAgcC0+aG9zdF9ubyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocC0+YWRhcHRlcl9jb250cm9sICYgQ0ZXU1RFUk0pCisgICAgICAgIHsKKyAgICAgICAgICBicmRkYXQgfD0gQlJEREFUNjsKKyAgICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBTRSBIaWdoIGJ5dGUgdGVybWluYXRpb24gRW5hYmxlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBwLT5ob3N0X25vKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGFpY19vdXRiKHAsIHN4ZnJjdGwxLCBTWEZSQ1RMMSk7CisgICAgd3JpdGVfYnJkY3RsKHAsIGJyZGRhdCk7CisgICAgcmVsZWFzZV9zZWVwcm9tKHApOworICB9Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgZGV0ZWN0X21heHNjYgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBEZXRlY3RzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBTQ0JzIGZvciB0aGUgY29udHJvbGxlciBhbmQgcmV0dXJucworICogICB0aGUgY291bnQgYW5kIGEgbWFzayBpbiBwIChwLT5tYXhzY2JzLCBwLT5xY250bWFzaykuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitkZXRlY3RfbWF4c2NiKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisgIGludCBpOworCisgIC8qCisgICAqIEl0J3MgcG9zc2libGUgdGhhdCB3ZSd2ZSBhbHJlYWR5IGRvbmUgdGhpcyBmb3IgbXVsdGljaGFubmVsCisgICAqIGFkYXB0ZXJzLgorICAgKi8KKyAgaWYgKHAtPnNjYl9kYXRhLT5tYXhoc2NicyA9PSAwKQorICB7CisgICAgLyoKKyAgICAgKiBXZSBoYXZlbid0IGluaXRpYWxpemVkIHRoZSBTQ0Igc2V0dGluZ3MgeWV0LiAgV2FsayB0aGUgU0NCcyB0bworICAgICAqIGRldGVybWluY2UgaG93IG1hbnkgdGhlcmUgYXJlLgorICAgICAqLworICAgIGFpY19vdXRiKHAsIDAsIEZSRUVfU0NCSCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQUlDN1hYWF9NQVhTQ0I7IGkrKykKKyAgICB7CisgICAgICBhaWNfb3V0YihwLCBpLCBTQ0JQVFIpOworICAgICAgYWljX291dGIocCwgaSwgU0NCX0NPTlRST0wpOworICAgICAgaWYgKGFpY19pbmIocCwgU0NCX0NPTlRST0wpICE9IGkpCisgICAgICAgIGJyZWFrOworICAgICAgYWljX291dGIocCwgMCwgU0NCUFRSKTsKKyAgICAgIGlmIChhaWNfaW5iKHAsIFNDQl9DT05UUk9MKSAhPSAwKQorICAgICAgICBicmVhazsKKworICAgICAgYWljX291dGIocCwgaSwgU0NCUFRSKTsKKyAgICAgIGFpY19vdXRiKHAsIDAsIFNDQl9DT05UUk9MKTsgICAvKiBDbGVhciB0aGUgY29udHJvbCBieXRlLiAqLworICAgICAgYWljX291dGIocCwgaSArIDEsIFNDQl9ORVhUKTsgIC8qIFNldCB0aGUgbmV4dCBwb2ludGVyLiAqLworICAgICAgYWljX291dGIocCwgU0NCX0xJU1RfTlVMTCwgU0NCX1RBRyk7ICAvKiBNYWtlIHRoZSB0YWcgaW52YWxpZC4gKi8KKyAgICAgIGFpY19vdXRiKHAsIFNDQl9MSVNUX05VTEwsIFNDQl9CVVNZVEFSR0VUUyk7ICAvKiBubyBidXN5IHVudGFnZ2VkICovCisgICAgICBhaWNfb3V0YihwLCBTQ0JfTElTVF9OVUxMLCBTQ0JfQlVTWVRBUkdFVFMrMSk7LyogdGFyZ2V0cyBhY3RpdmUgeWV0ICovCisgICAgICBhaWNfb3V0YihwLCBTQ0JfTElTVF9OVUxMLCBTQ0JfQlVTWVRBUkdFVFMrMik7CisgICAgICBhaWNfb3V0YihwLCBTQ0JfTElTVF9OVUxMLCBTQ0JfQlVTWVRBUkdFVFMrMyk7CisgICAgfQorCisgICAgLyogTWFrZSBzdXJlIHRoZSBsYXN0IFNDQiB0ZXJtaW5hdGVzIHRoZSBmcmVlIGxpc3QuICovCisgICAgYWljX291dGIocCwgaSAtIDEsIFNDQlBUUik7CisgICAgYWljX291dGIocCwgU0NCX0xJU1RfTlVMTCwgU0NCX05FWFQpOworCisgICAgLyogRW5zdXJlIHdlIGNsZWFyIHRoZSBmaXJzdCAoMCkgU0NCcyBjb250cm9sIGJ5dGUuICovCisgICAgYWljX291dGIocCwgMCwgU0NCUFRSKTsKKyAgICBhaWNfb3V0YihwLCAwLCBTQ0JfQ09OVFJPTCk7CisKKyAgICBwLT5zY2JfZGF0YS0+bWF4aHNjYnMgPSBpOworICAgIC8qCisgICAgICogVXNlIGRpcmVjdCBpbmRleGluZyBpbnN0ZWFkIGZvciBzcGVlZAorICAgICAqLworICAgIGlmICggaSA9PSBBSUM3WFhYX01BWFNDQiApCisgICAgICBwLT5mbGFncyAmPSB+QUhDX1BBR0VTQ0JTOworICB9CisKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X3JlZ2lzdGVyCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFJlZ2lzdGVyIGEgQWRhcHRlYyBhaWM3eHh4IGNoaXAgU0NTSSBjb250cm9sbGVyIHdpdGggdGhlIGtlcm5lbC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorYWljN3h4eF9yZWdpc3RlcihTY3NpX0hvc3RfVGVtcGxhdGUgKnRlbXBsYXRlLCBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLAorICBpbnQgcmVzZXRfZGVsYXkpCit7CisgIGludCBpLCByZXN1bHQ7CisgIGludCBtYXhfdGFyZ2V0czsKKyAgaW50IGZvdW5kID0gMTsKKyAgdW5zaWduZWQgY2hhciB0ZXJtLCBzY3NpX2NvbmY7CisgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisKKyAgaG9zdCA9IHAtPmhvc3Q7CisKKyAgcC0+c2NiX2RhdGEtPm1heHNjYnMgPSBBSUM3WFhYX01BWFNDQjsKKyAgaG9zdC0+Y2FuX3F1ZXVlID0gQUlDN1hYWF9NQVhTQ0I7CisgIGhvc3QtPmNtZF9wZXJfbHVuID0gMzsKKyAgaG9zdC0+c2dfdGFibGVzaXplID0gQUlDN1hYWF9NQVhfU0c7CisgIGhvc3QtPnRoaXNfaWQgPSBwLT5zY3NpX2lkOworICBob3N0LT5pb19wb3J0ID0gcC0+YmFzZTsKKyAgaG9zdC0+bl9pb19wb3J0ID0gMHhGRjsKKyAgaG9zdC0+YmFzZSA9IHAtPm1iYXNlOworICBob3N0LT5pcnEgPSBwLT5pcnE7CisgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19XSURFKQorICB7CisgICAgaG9zdC0+bWF4X2lkID0gMTY7CisgIH0KKyAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1RXSU4pCisgIHsKKyAgICBob3N0LT5tYXhfY2hhbm5lbCA9IDE7CisgIH0KKworICBwLT5ob3N0ID0gaG9zdDsKKyAgcC0+aG9zdF9ubyA9IGhvc3QtPmhvc3Rfbm87CisgIGhvc3QtPnVuaXF1ZV9pZCA9IHAtPmluc3RhbmNlOworICBwLT5pc3JfY291bnQgPSAwOworICBwLT5uZXh0ID0gTlVMTDsKKyAgcC0+Y29tcGxldGVxLmhlYWQgPSBOVUxMOworICBwLT5jb21wbGV0ZXEudGFpbCA9IE5VTEw7CisgIHNjYnFfaW5pdCgmcC0+c2NiX2RhdGEtPmZyZWVfc2Nicyk7CisgIHNjYnFfaW5pdCgmcC0+d2FpdGluZ19zY2JzKTsKKyAgSU5JVF9MSVNUX0hFQUQoJnAtPmFpY19kZXZzKTsKKworICAvKgorICAgKiBXZSBjdXJyZW50bHkgaGF2ZSBubyBjb21tYW5kcyBvZiBhbnkgdHlwZQorICAgKi8KKyAgcC0+cWluZmlmb25leHQgPSAwOworICBwLT5xb3V0Zmlmb25leHQgPSAwOworCisgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIDwlcz4gZm91bmQgYXQgIiwgcC0+aG9zdF9ubywKKyAgICBib2FyZF9uYW1lc1twLT5ib2FyZF9uYW1lX2luZGV4XSk7CisgIHN3aXRjaChwLT5jaGlwKQorICB7CisgICAgY2FzZSAoQUhDX0FJQzc3NzB8QUhDX0VJU0EpOgorICAgICAgcHJpbnRrKCJFSVNBIHNsb3QgJWRcbiIsIHAtPnBjaV9kZXZpY2VfZm4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAoQUhDX0FJQzc3NzB8QUhDX1ZMKToKKyAgICAgIHByaW50aygiVkxCIHNsb3QgJWRcbiIsIHAtPnBjaV9kZXZpY2VfZm4pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHByaW50aygiUENJICVkLyVkLyVkXG4iLCBwLT5wY2lfYnVzLCBQQ0lfU0xPVChwLT5wY2lfZGV2aWNlX2ZuKSwKKyAgICAgICAgUENJX0ZVTkMocC0+cGNpX2RldmljZV9mbikpOworICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1RXSU4pCisgIHsKKyAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBUd2luIENoYW5uZWwsIEEgU0NTSSBJRCAlZCwgQiBTQ1NJIElEICVkLCAiLAorICAgICAgICAgICBwLT5ob3N0X25vLCBwLT5zY3NpX2lkLCBwLT5zY3NpX2lkX2IpOworICB9CisgIGVsc2UKKyAgeworICAgIGNoYXIgKmNoYW5uZWw7CisKKyAgICBjaGFubmVsID0gIiI7CisKKyAgICBpZiAoKHAtPmZsYWdzICYgQUhDX01VTFRJX0NIQU5ORUwpICE9IDApCisgICAgeworICAgICAgY2hhbm5lbCA9ICIgQSI7CisKKyAgICAgIGlmICggKHAtPmZsYWdzICYgKEFIQ19DSE5MQnxBSENfQ0hOTEMpKSAhPSAwICkKKyAgICAgIHsKKyAgICAgICAgY2hhbm5lbCA9IChwLT5mbGFncyAmIEFIQ19DSE5MQikgPyAiIEIiIDogIiBDIjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1dJREUpCisgICAgeworICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiKHNjc2klZCkgV2lkZSAiLCBwLT5ob3N0X25vKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIE5hcnJvdyAiLCBwLT5ob3N0X25vKTsKKyAgICB9CisgICAgcHJpbnRrKCJDaGFubmVsJXMsIFNDU0kgSUQ9JWQsICIsIGNoYW5uZWwsIHAtPnNjc2lfaWQpOworICB9CisgIGFpY19vdXRiKHAsIDAsIFNFUV9GTEFHUyk7CisKKyAgZGV0ZWN0X21heHNjYihwKTsKKworICBwcmludGsoIiVkLyVkIFNDQnNcbiIsIHAtPnNjYl9kYXRhLT5tYXhoc2NicywgcC0+c2NiX2RhdGEtPm1heHNjYnMpOworICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgIHsKKyAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBCSU9TICVzYWJsZWQsIElPIFBvcnQgMHglbHgsIElSUSAlZFxuIiwKKyAgICAgIHAtPmhvc3Rfbm8sIChwLT5mbGFncyAmIEFIQ19CSU9TX0VOQUJMRUQpID8gImVuIiA6ICJkaXMiLAorICAgICAgcC0+YmFzZSwgcC0+aXJxKTsKKyAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBJTyBNZW1vcnkgYXQgMHglbHgsIE1NQVAgTWVtb3J5IGF0ICVwXG4iLAorICAgICAgcC0+aG9zdF9ubywgcC0+bWJhc2UsIHAtPm1hZGRyKTsKKyAgfQorCisjaWZkZWYgQ09ORklHX1BDSQorICAvKgorICAgKiBOb3cgdGhhdCB3ZSBrbm93IG91ciBpbnN0YW5jZSBudW1iZXIsIHdlIGNhbiBzZXQgdGhlIGZsYWdzIHdlIG5lZWQgdG8KKyAgICogZm9yY2UgdGVybWluYXRpb24gaWYgbmVlZCBiZS4KKyAgICovCisgIGlmIChhaWM3eHh4X3N0cHdsZXYgIT0gLTEpCisgIHsKKyAgICAvKgorICAgICAqIFRoaXMgb3B0aW9uIG9ubHkgYXBwbGllcyB0byBQQ0kgY29udHJvbGxlcnMuCisgICAgICovCisgICAgaWYgKCAocC0+Y2hpcCAmIH5BSENfQ0hJUElEX01BU0spID09IEFIQ19QQ0kpCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciBkZXZjb25maWc7CisKKyAgICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKHAtPnBkZXYsIERFVkNPTkZJRywgJmRldmNvbmZpZyk7CisgICAgICBpZiAoIChhaWM3eHh4X3N0cHdsZXYgPj4gcC0+aW5zdGFuY2UpICYgMHgwMSApCisgICAgICB7CisgICAgICAgIGRldmNvbmZpZyB8PSBTVFBXTEVWRUw7CisgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1BST0JFMikKKyAgICAgICAgICBwcmludGsoIihzY3NpJWQpIEZvcmNlIHNldHRpbmcgU1RQV0xFVkVMIGJpdFxuIiwgcC0+aG9zdF9ubyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGRldmNvbmZpZyAmPSB+U1RQV0xFVkVMOworICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICAgICAgcHJpbnRrKCIoc2NzaSVkKSBGb3JjZSBjbGVhcmluZyBTVFBXTEVWRUwgYml0XG4iLCBwLT5ob3N0X25vKTsKKyAgICAgIH0KKyAgICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShwLT5wZGV2LCBERVZDT05GSUcsIGRldmNvbmZpZyk7CisgICAgfQorICB9CisjZW5kaWYKKworICAvKgorICAgKiBUaGF0IHRvb2sgY2FyZSBvZiBkZXZjb25maWcgYW5kIHN0cHdsZXYsIG5vdyBmb3IgdGhlIGFjdHVhbCB0ZXJtaW5hdGlvbgorICAgKiBzZXR0aW5ncy4KKyAgICovCisgIGlmIChhaWM3eHh4X292ZXJyaWRlX3Rlcm0gIT0gLTEpCisgIHsKKyAgICAvKgorICAgICAqIEFnYWluLCB0aGlzIG9ubHkgYXBwbGllcyB0byBQQ0kgY29udHJvbGxlcnMuICBXZSBkb24ndCBoYXZlIHByb2JsZW1zCisgICAgICogd2l0aCB0aGUgdGVybWluYXRpb24gb24gMjc0eCBjb250cm9sbGVycyB0byB0aGUgYmVzdCBvZiBteSBrbm93bGVkZ2UuCisgICAgICovCisgICAgaWYgKCAocC0+Y2hpcCAmIH5BSENfQ0hJUElEX01BU0spID09IEFIQ19QQ0kpCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciB0ZXJtX292ZXJyaWRlOworCisgICAgICB0ZXJtX292ZXJyaWRlID0gKCAoYWljN3h4eF9vdmVycmlkZV90ZXJtID4+IChwLT5pbnN0YW5jZSAqIDQpKSAmIDB4MGYpOworICAgICAgcC0+YWRhcHRlcl9jb250cm9sICY9IAorICAgICAgICB+KENGU1RFUk18Q0ZXU1RFUk18Q0ZMVkRTVEVSTXxDRkFVVE9URVJNfENGU0VBVVRPVEVSTSk7CisgICAgICBpZiAoIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICYmICh0ZXJtX292ZXJyaWRlICYgMHgwYykgKQorICAgICAgeworICAgICAgICBwLT5hZGFwdGVyX2NvbnRyb2wgfD0gQ0ZMVkRTVEVSTTsKKyAgICAgIH0KKyAgICAgIGlmICh0ZXJtX292ZXJyaWRlICYgMHgwMikKKyAgICAgIHsKKyAgICAgICAgcC0+YWRhcHRlcl9jb250cm9sIHw9IENGV1NURVJNOworICAgICAgfQorICAgICAgaWYgKHRlcm1fb3ZlcnJpZGUgJiAweDAxKQorICAgICAgeworICAgICAgICBwLT5hZGFwdGVyX2NvbnRyb2wgfD0gQ0ZTVEVSTTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoIChwLT5mbGFncyAmIEFIQ19TRUVQUk9NX0ZPVU5EKSB8fCAoYWljN3h4eF9vdmVycmlkZV90ZXJtICE9IC0xKSApCisgIHsKKyAgICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfU1BJT0NBUCkKKyAgICB7CisgICAgICBpZiAoIGFpY19pbmIocCwgU1BJT0NBUCkgJiBTU1BJT0NQUyApCisgICAgICAvKgorICAgICAgICogVXBkYXRlIHRoZSBzZXR0aW5ncyBpbiBzeGZyY3RsMSB0byBtYXRjaCB0aGUgdGVybWluYXRpb24KKyAgICAgICAqIHNldHRpbmdzLgorICAgICAgICovCisgICAgICAgIGNvbmZpZ3VyZV90ZXJtaW5hdGlvbihwKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHAtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spID49IEFIQ19BSUM3ODcwKQorICAgIHsKKyAgICAgIGNvbmZpZ3VyZV90ZXJtaW5hdGlvbihwKTsKKyAgICB9CisgIH0KKworICAvKgorICAgKiBTZXQgdGhlIFNDU0kgSWQsIFNYRlJDVEwwLCBTWEZSQ1RMMSwgYW5kIFNJTU9ERTEsIGZvciBib3RoIGNoYW5uZWxzCisgICAqLworICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVFdJTikKKyAgeworICAgIC8qIFNlbGVjdCBjaGFubmVsIEIgKi8KKyAgICBhaWNfb3V0YihwLCBhaWNfaW5iKHAsIFNCTEtDVEwpIHwgU0VMQlVTQiwgU0JMS0NUTCk7CisKKyAgICBpZiAoKHAtPmZsYWdzICYgQUhDX1NFRVBST01fRk9VTkQpIHx8IChhaWM3eHh4X292ZXJyaWRlX3Rlcm0gIT0gLTEpKQorICAgICAgdGVybSA9IChhaWNfaW5iKHAsIFNYRlJDVEwxKSAmIFNUUFdFTik7CisgICAgZWxzZQorICAgICAgdGVybSA9ICgocC0+ZmxhZ3MgJiBBSENfVEVSTV9FTkJfQikgPyBTVFBXRU4gOiAwKTsKKworICAgIGFpY19vdXRiKHAsIHAtPnNjc2lfaWRfYiwgU0NTSUlEKTsKKyAgICBzY3NpX2NvbmYgPSBhaWNfaW5iKHAsIFNDU0lDT05GICsgMSk7CisgICAgYWljX291dGIocCwgREZPTiB8IFNQSU9FTiwgU1hGUkNUTDApOworICAgIGFpY19vdXRiKHAsIChzY3NpX2NvbmYgJiBFTlNQQ0hLKSB8IGFpYzd4eHhfc2VsdGltZSB8IHRlcm0gfCAKKyAgICAgICAgIEVOU1RJTUVSIHwgQUNUTkVHRU4sIFNYRlJDVEwxKTsKKyAgICBhaWNfb3V0YihwLCAwLCBTSU1PREUwKTsKKyAgICBhaWNfb3V0YihwLCBFTlNFTFRJTU8gfCBFTlNDU0lSU1QgfCBFTlNDU0lQRVJSLCBTSU1PREUxKTsKKyAgICBhaWNfb3V0YihwLCAwLCBTQ1NJUkFURSk7CisKKyAgICAvKiBTZWxlY3QgY2hhbm5lbCBBICovCisgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQkxLQ1RMKSAmIH5TRUxCVVNCLCBTQkxLQ1RMKTsKKyAgfQorCisgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgIHsKKyAgICBhaWNfb3V0YihwLCBwLT5zY3NpX2lkLCBTQ1NJSURfVUxUUkEyKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBhaWNfb3V0YihwLCBwLT5zY3NpX2lkLCBTQ1NJSUQpOworICB9CisgIGlmICgocC0+ZmxhZ3MgJiBBSENfU0VFUFJPTV9GT1VORCkgfHwgKGFpYzd4eHhfb3ZlcnJpZGVfdGVybSAhPSAtMSkpCisgICAgdGVybSA9IChhaWNfaW5iKHAsIFNYRlJDVEwxKSAmIFNUUFdFTik7CisgIGVsc2UKKyAgICB0ZXJtID0gKChwLT5mbGFncyAmIChBSENfVEVSTV9FTkJfQXxBSENfVEVSTV9FTkJfTFZEKSkgPyBTVFBXRU4gOiAwKTsKKyAgc2NzaV9jb25mID0gYWljX2luYihwLCBTQ1NJQ09ORik7CisgIGFpY19vdXRiKHAsIERGT04gfCBTUElPRU4sIFNYRlJDVEwwKTsKKyAgYWljX291dGIocCwgKHNjc2lfY29uZiAmIEVOU1BDSEspIHwgYWljN3h4eF9zZWx0aW1lIHwgdGVybSB8IAorICAgICAgIEVOU1RJTUVSIHwgQUNUTkVHRU4sIFNYRlJDVEwxKTsKKyAgYWljX291dGIocCwgMCwgU0lNT0RFMCk7CisgIC8qCisgICAqIElmIHdlIGFyZSBhIGNhcmRidXMgYWRhcHRlciB0aGVuIGRvbid0IGVuYWJsZSBTQ1NJIHJlc2V0IGRldGVjdGlvbi4KKyAgICogV2Ugc2hvdWxkbid0IGxpa2VseSBiZSBzaGFyaW5nIFNDU0kgYnVzc2VzIHdpdGggc29tZW9uZSBlbHNlLCBhbmQKKyAgICogaWYgd2UgZG9uJ3QgaGF2ZSBhIGNhYmxlIGN1cnJlbnRseSBwbHVnZ2VkIGludG8gdGhlIGNvbnRyb2xsZXIgdGhlbgorICAgKiB3ZSB3b24ndCBoYXZlIGEgcG93ZXIgc291cmNlIGZvciB0aGUgU0NTSSB0ZXJtaW5hdGlvbiwgd2hpY2ggbWVhbnMKKyAgICogd2UnbGwgc2VlIGluZmluaXRlIGluY29taW5nIGJ1cyByZXNldHMuCisgICAqLworICBpZihwLT5mbGFncyAmIEFIQ19OT19TVFBXRU4pCisgICAgYWljX291dGIocCwgRU5TRUxUSU1PIHwgRU5TQ1NJUEVSUiwgU0lNT0RFMSk7CisgIGVsc2UKKyAgICBhaWNfb3V0YihwLCBFTlNFTFRJTU8gfCBFTlNDU0lSU1QgfCBFTlNDU0lQRVJSLCBTSU1PREUxKTsKKyAgYWljX291dGIocCwgMCwgU0NTSVJBVEUpOworICBpZiAoIHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikKKyAgICBhaWNfb3V0YihwLCAwLCBTQ1NJT0ZGU0VUKTsKKworICAvKgorICAgKiBMb29rIGF0IHRoZSBpbmZvcm1hdGlvbiB0aGF0IGJvYXJkIGluaXRpYWxpemF0aW9uIG9yIHRoZSBib2FyZAorICAgKiBCSU9TIGhhcyBsZWZ0IHVzLiBJbiB0aGUgbG93ZXIgZm91ciBiaXRzIG9mIGVhY2ggdGFyZ2V0J3MKKyAgICogc2NyYXRjaCBzcGFjZSBhbnkgdmFsdWUgb3RoZXIgdGhhbiAwIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZAorICAgKiBpbml0aWF0ZSBzeW5jaHJvbm91cyB0cmFuc2ZlcnMuIElmIGl0J3MgemVybywgdGhlIHVzZXIgb3IgdGhlCisgICAqIEJJT1MgaGFzIGRlY2lkZWQgdG8gZGlzYWJsZSBzeW5jaHJvbm91cyBuZWdvdGlhdGlvbiB0byB0aGF0CisgICAqIHRhcmdldCBzbyB3ZSBkb24ndCBhY3RpdmF0ZSB0aGUgbmVlZHNkdHIgZmxhZy4KKyAgICovCisgIGlmICgocC0+ZmVhdHVyZXMgJiAoQUhDX1RXSU58QUhDX1dJREUpKSA9PSAwKQorICB7CisgICAgbWF4X3RhcmdldHMgPSA4OworICB9CisgIGVsc2UKKyAgeworICAgIG1heF90YXJnZXRzID0gMTY7CisgIH0KKworICBpZiAoIShhaWM3eHh4X25vX3Jlc2V0KSkKKyAgeworICAgIC8qCisgICAgICogSWYgd2UgcmVzZXQgdGhlIGJ1cywgdGhlbiBjbGVhciB0aGUgdHJhbnNmZXIgc2V0dGluZ3MsIGVsc2UgbGVhdmUKKyAgICAgKiB0aGVtIGJlLgorICAgICAqLworICAgIGFpY19vdXRiKHAsIDAsIFVMVFJBX0VOQik7CisgICAgYWljX291dGIocCwgMCwgVUxUUkFfRU5CICsgMSk7CisgICAgcC0+dWx0cmFlbmIgPSAwOworICB9CisKKyAgLyoKKyAgICogQWxsb2NhdGUgZW5vdWdoIGhhcmR3YXJlIHNjYnMgdG8gaGFuZGxlIHRoZSBtYXhpbXVtIG51bWJlciBvZgorICAgKiBjb25jdXJyZW50IHRyYW5zYWN0aW9ucyB3ZSBjYW4gaGF2ZS4gIFdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICogdGhlIGFsbG9jYXRlZCBtZW1vcnkgaXMgY29udGlndW91cyBtZW1vcnkuICBUaGUgTGludXgga21hbGxvYworICAgKiByb3V0aW5lIHNob3VsZCBvbmx5IGFsbG9jYXRlIGNvbnRpZ3VvdXMgbWVtb3J5LCBidXQgbm90ZSB0aGF0CisgICAqIHRoaXMgY291bGQgYmUgYSBwcm9ibGVtIGlmIGttYWxsb2MoKSBpcyBjaGFuZ2VkLgorICAgKi8KKyAgeworICAgIHNpemVfdCBhcnJheV9zaXplOworICAgIHVuc2lnbmVkIGludCBoc2NiX3BoeXNhZGRyOworCisgICAgYXJyYXlfc2l6ZSA9IHAtPnNjYl9kYXRhLT5tYXhzY2JzICogc2l6ZW9mKHN0cnVjdCBhaWM3eHh4X2h3c2NiKTsKKyAgICBpZiAocC0+c2NiX2RhdGEtPmhzY2JzID09IE5VTEwpCisgICAgeworICAgICAgLyogcGNpX2FsbG9jX2NvbnNpc3RlbnQgZW5mb3JjZXMgdGhlIGFsaWdubWVudCBhbHJlYWR5IGFuZAorICAgICAgICogY2xlYXJzIHRoZSBhcmVhIGFzIHdlbGwuCisgICAgICAgKi8KKyAgICAgIHAtPnNjYl9kYXRhLT5oc2NicyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHAtPnBkZXYsIGFycmF5X3NpemUsCisJCQkJCQkmcC0+c2NiX2RhdGEtPmhzY2JzX2RtYSk7CisgICAgICAvKiBXZSBoYXZlIHRvIHVzZSBwY2lfZnJlZV9jb25zaXN0ZW50LCBub3Qga2ZyZWUgKi8KKyAgICAgIHAtPnNjYl9kYXRhLT5oc2NiX2ttYWxsb2NfcHRyID0gTlVMTDsKKyAgICAgIHAtPnNjYl9kYXRhLT5oc2Nic19kbWFfbGVuID0gYXJyYXlfc2l6ZTsKKyAgICB9CisgICAgaWYgKHAtPnNjYl9kYXRhLT5oc2NicyA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50aygiKHNjc2klZCkgVW5hYmxlIHRvIGFsbG9jYXRlIGhhcmR3YXJlIFNDQiBhcnJheTsgIgorICAgICAgICAgICAgICJmYWlsaW5nIGRldGVjdGlvbi5cbiIsIHAtPmhvc3Rfbm8pOworICAgICAgYWljX291dGIocCwgMCwgU0lNT0RFMSk7CisgICAgICBwLT5pcnEgPSAwOworICAgICAgcmV0dXJuKDApOworICAgIH0KKworICAgIGhzY2JfcGh5c2FkZHIgPSBwLT5zY2JfZGF0YS0+aHNjYnNfZG1hOworICAgIGFpY19vdXRiKHAsIGhzY2JfcGh5c2FkZHIgJiAweEZGLCBIU0NCX0FERFIpOworICAgIGFpY19vdXRiKHAsIChoc2NiX3BoeXNhZGRyID4+IDgpICYgMHhGRiwgSFNDQl9BRERSICsgMSk7CisgICAgYWljX291dGIocCwgKGhzY2JfcGh5c2FkZHIgPj4gMTYpICYgMHhGRiwgSFNDQl9BRERSICsgMik7CisgICAgYWljX291dGIocCwgKGhzY2JfcGh5c2FkZHIgPj4gMjQpICYgMHhGRiwgSFNDQl9BRERSICsgMyk7CisKKyAgICAvKiBTZXQgdXAgdGhlIGZpZm8gYXJlYXMgYXQgdGhlIHNhbWUgdGltZSAqLworICAgIHAtPnVudGFnZ2VkX3NjYnMgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwLT5wZGV2LCAzKjI1NiwgJnAtPmZpZm9fZG1hKTsKKyAgICBpZiAocC0+dW50YWdnZWRfc2NicyA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50aygiKHNjc2klZCkgVW5hYmxlIHRvIGFsbG9jYXRlIGhhcmR3YXJlIEZJRk8gYXJyYXlzOyAiCisgICAgICAgICAgICAgImZhaWxpbmcgZGV0ZWN0aW9uLlxuIiwgcC0+aG9zdF9ubyk7CisgICAgICBwLT5pcnEgPSAwOworICAgICAgcmV0dXJuKDApOworICAgIH0KKworICAgIHAtPnFvdXRmaWZvID0gcC0+dW50YWdnZWRfc2NicyArIDI1NjsKKyAgICBwLT5xaW5maWZvID0gcC0+cW91dGZpZm8gKyAyNTY7CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgIHsKKyAgICAgIHAtPnVudGFnZ2VkX3NjYnNbaV0gPSBTQ0JfTElTVF9OVUxMOworICAgICAgcC0+cWluZmlmb1tpXSA9IFNDQl9MSVNUX05VTEw7CisgICAgICBwLT5xb3V0Zmlmb1tpXSA9IFNDQl9MSVNUX05VTEw7CisgICAgfQorCisgICAgaHNjYl9waHlzYWRkciA9IHAtPmZpZm9fZG1hOworICAgIGFpY19vdXRiKHAsIGhzY2JfcGh5c2FkZHIgJiAweEZGLCBTQ0JJRF9BRERSKTsKKyAgICBhaWNfb3V0YihwLCAoaHNjYl9waHlzYWRkciA+PiA4KSAmIDB4RkYsIFNDQklEX0FERFIgKyAxKTsKKyAgICBhaWNfb3V0YihwLCAoaHNjYl9waHlzYWRkciA+PiAxNikgJiAweEZGLCBTQ0JJRF9BRERSICsgMik7CisgICAgYWljX291dGIocCwgKGhzY2JfcGh5c2FkZHIgPj4gMjQpICYgMHhGRiwgU0NCSURfQUREUiArIDMpOworICB9CisKKyAgLyogVGhlIFEtRklGT3Mgd2UganVzdCBzZXQgdXAgYXJlIGFsbCBlbXB0eSAqLworICBhaWNfb3V0YihwLCAwLCBRSU5QT1MpOworICBhaWNfb3V0YihwLCAwLCBLRVJORUxfUUlOUE9TKTsKKyAgYWljX291dGIocCwgMCwgUU9VVFBPUyk7CisKKyAgaWYocC0+ZmVhdHVyZXMgJiBBSENfUVVFVUVfUkVHUykKKyAgeworICAgIGFpY19vdXRiKHAsIFNDQl9RU0laRV8yNTYsIFFPRkZfQ1RMU1RBKTsKKyAgICBhaWNfb3V0YihwLCAwLCBTRFNDQl9RT0ZGKTsKKyAgICBhaWNfb3V0YihwLCAwLCBTTlNDQl9RT0ZGKTsKKyAgICBhaWNfb3V0YihwLCAwLCBITlNDQl9RT0ZGKTsKKyAgfQorCisgIC8qCisgICAqIFdlIGRvbid0IGhhdmUgYW55IHdhaXRpbmcgc2VsZWN0aW9ucyBvciBkaXNjb25uZWN0ZWQgU0NCcy4KKyAgICovCisgIGFpY19vdXRiKHAsIFNDQl9MSVNUX05VTEwsIFdBSVRJTkdfU0NCSCk7CisgIGFpY19vdXRiKHAsIFNDQl9MSVNUX05VTEwsIERJU0NPTk5FQ1RFRF9TQ0JIKTsKKworICAvKgorICAgKiBNZXNzYWdlIG91dCBidWZmZXIgc3RhcnRzIGVtcHR5CisgICAqLworICBhaWNfb3V0YihwLCBNU0dfTk9PUCwgTVNHX09VVCk7CisgIGFpY19vdXRiKHAsIE1TR19OT09QLCBMQVNUX01TRyk7CisKKyAgLyoKKyAgICogU2V0IGFsbCB0aGUgb3RoZXIgYXN1bmRyeSBpdGVtcyB0aGF0IGhhdmVuJ3QgYmVlbiBzZXQgeWV0LgorICAgKiBUaGlzIGluY2x1ZGVzIGp1c3QgZHVtcGluZyBpbml0IHZhbHVlcyB0byBhIGxvdCBvZiByZWdpc3RlcnMgc2ltcGx5CisgICAqIHRvIG1ha2Ugc3VyZSB0aGV5J3ZlIGJlZW4gdG91Y2hlZCBhbmQgYXJlIHJlYWR5IGZvciB1c2UgcGFyaXR5IHdpc2UKKyAgICogc3BlYWtpbmcuCisgICAqLworICBhaWNfb3V0YihwLCAwLCBUTU9ERV9DTURBRERSKTsKKyAgYWljX291dGIocCwgMCwgVE1PREVfQ01EQUREUiArIDEpOworICBhaWNfb3V0YihwLCAwLCBUTU9ERV9DTURBRERSICsgMik7CisgIGFpY19vdXRiKHAsIDAsIFRNT0RFX0NNREFERFIgKyAzKTsKKyAgYWljX291dGIocCwgMCwgVE1PREVfQ01EQUREUl9ORVhUKTsKKworICAvKgorICAgKiBMaW5rIHVzIGludG8gdGhlIGxpc3Qgb2YgdmFsaWQgaG9zdHMKKyAgICovCisgIHAtPm5leHQgPSBmaXJzdF9haWM3eHh4OworICBmaXJzdF9haWM3eHh4ID0gcDsKKworICAvKgorICAgKiBBbGxvY2F0ZSB0aGUgZmlyc3Qgc2V0IG9mIHNjYnMgZm9yIHRoaXMgY29udHJvbGxlci4gIFRoaXMgaXMgdG8gc3RyZWFtLQorICAgKiBsaW5lIGNvZGUgZWxzZXdoZXJlIGluIHRoZSBkcml2ZXIuICBJZiB3ZSBoYXZlIHRvIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlCisgICAqIG9mIHNjYnMgaW4gY2VydGFpbiBjb2RlIHNlY3Rpb25zLCBpdCBzbG93cyB0aGluZ3MgZG93bi4gIEhvd2V2ZXIsIGFzCisgICAqIHNvb24gYXMgd2UgcmVnaXN0ZXIgdGhlIElSUSBmb3IgdGhpcyBjYXJkLCB3ZSBjb3VsZCBnZXQgYW4gaW50ZXJydXB0IHRoYXQKKyAgICogaW5jbHVkZXMgcG9zc2libHkgdGhlIFNDU0lfUlNUSSBpbnRlcnJ1cHQuICBJZiB3ZSBjYXRjaCB0aGF0IGludGVycnVwdAorICAgKiB0aGVuIHdlIGFyZSBsaWtlbHkgdG8gc2VnZmF1bHQgaWYgd2UgZG9uJ3QgaGF2ZSBhdCBsZWFzdCBvbmUgY2h1bmsgb2YKKyAgICogU0NCcyBhbGxvY2F0ZWQgb3IgYWRkIGNoZWNrcyBhbGwgdGhyb3VnaCB0aGUgcmVzZXQgY29kZSB0byBtYWtlIHN1cmUKKyAgICogdGhhdCB0aGUgU0NCcyBoYXZlIGJlZW4gYWxsb2NhdGVkIHdoaWNoIGlzIGFuIGludmFsaWQgcnVubmluZyBjb25kaXRpb24KKyAgICogYW5kIHRoZXJlZm9yZSBJIHRoaW5rIGl0J3MgcHJlZmVyYWJsZSB0byBzaW1wbHkgcHJlLWFsbG9jYXRlIHRoZSBmaXJzdAorICAgKiBjaHVuayBvZiBTQ0JzLgorICAgKi8KKyAgYWljN3h4eF9hbGxvY2F0ZV9zY2IocCk7CisKKyAgLyoKKyAgICogTG9hZCB0aGUgc2VxdWVuY2VyIHByb2dyYW0sIHRoZW4gcmUtZW5hYmxlIHRoZSBib2FyZCAtCisgICAqIHJlc2V0dGluZyB0aGUgQUlDLTc3NzAgZGlzYWJsZXMgaXQsIGxlYXZpbmcgdGhlIGxpZ2h0cworICAgKiBvbiB3aXRoIG5vYm9keSBob21lLgorICAgKi8KKyAgYWljN3h4eF9sb2Fkc2VxKHApOworCisgIC8qCisgICAqIE1ha2Ugc3VyZSB0aGUgQVVUT0ZMVVNIRElTIGJpdCBpcyAqbm90KiBzZXQgaW4gdGhlIFNCTEtDVEwgcmVnaXN0ZXIKKyAgICovCisgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0JMS0NUTCkgJiB+QVVUT0ZMVVNIRElTLCBTQkxLQ1RMKTsKKworICBpZiAoIChwLT5jaGlwICYgQUhDX0NISVBJRF9NQVNLKSA9PSBBSENfQUlDNzc3MCApCisgIHsKKyAgICBhaWNfb3V0YihwLCBFTkFCTEUsIEJDVEwpOyAgLyogRW5hYmxlIHRoZSBib2FyZHMgQlVTIGRyaXZlcnMuICovCisgIH0KKworICBpZiAoICEoYWljN3h4eF9ub19yZXNldCkgKQorICB7CisgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1RXSU4pCisgICAgeworICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBSZXNldHRpbmcgY2hhbm5lbCBCXG4iLCBwLT5ob3N0X25vKTsKKyAgICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0JMS0NUTCkgfCBTRUxCVVNCLCBTQkxLQ1RMKTsKKyAgICAgIGFpYzd4eHhfcmVzZXRfY3VycmVudF9idXMocCk7CisgICAgICBhaWNfb3V0YihwLCBhaWNfaW5iKHAsIFNCTEtDVEwpICYgflNFTEJVU0IsIFNCTEtDVEwpOworICAgIH0KKyAgICAvKiBSZXNldCBTQ1NJIGJ1cyBBLiAqLworICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1BST0JFMikKKyAgICB7ICAvKiBJbiBjYXNlIHdlIGFyZSBhIDM5NDAsIDM5ODUsIG9yIDc4OTUsIHByaW50IHRoZSByaWdodCBjaGFubmVsICovCisgICAgICBjaGFyICpjaGFubmVsID0gIiI7CisgICAgICBpZiAocC0+ZmxhZ3MgJiBBSENfTVVMVElfQ0hBTk5FTCkKKyAgICAgIHsKKyAgICAgICAgY2hhbm5lbCA9ICIgQSI7CisgICAgICAgIGlmIChwLT5mbGFncyAmIChBSENfQ0hOTEJ8QUhDX0NITkxDKSkKKyAgICAgICAgICBjaGFubmVsID0gKHAtPmZsYWdzICYgQUhDX0NITkxCKSA/ICIgQiIgOiAiIEMiOworICAgICAgfQorICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiKHNjc2klZCkgUmVzZXR0aW5nIGNoYW5uZWwlc1xuIiwgcC0+aG9zdF9ubywgY2hhbm5lbCk7CisgICAgfQorICAgIAorICAgIGFpYzd4eHhfcmVzZXRfY3VycmVudF9idXMocCk7CisKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoIXJlc2V0X2RlbGF5KQorICAgIHsKKyAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIE5vdCByZXNldHRpbmcgU0NTSSBidXMuICBOb3RlOiBEb24ndCB1c2UgIgorICAgICAgICAgICAgICJ0aGUgbm9fcmVzZXRcbiIsIHAtPmhvc3Rfbm8pOworICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiKHNjc2klZCkgb3B0aW9uIHVubGVzcyB5b3UgaGF2ZSBhIHZlcmlmaWFibGUgbmVlZCAiCisgICAgICAgICAgICAgImZvciBpdC5cbiIsIHAtPmhvc3Rfbm8pOworICAgIH0KKyAgfQorICAKKyAgLyoKKyAgICogUmVnaXN0ZXIgSVJRIHdpdGggdGhlIGtlcm5lbC4gIE9ubHkgYWxsb3cgc2hhcmluZyBJUlFzIHdpdGgKKyAgICogUENJIGRldmljZXMuCisgICAqLworICBpZiAoIShwLT5jaGlwICYgQUhDX1BDSSkpCisgIHsKKyAgICByZXN1bHQgPSAocmVxdWVzdF9pcnEocC0+aXJxLCBkb19haWM3eHh4X2lzciwgMCwgImFpYzd4eHgiLCBwKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmVzdWx0ID0gKHJlcXVlc3RfaXJxKHAtPmlycSwgZG9fYWljN3h4eF9pc3IsIFNBX1NISVJRLAorICAgICAgICAgICAgICAiYWljN3h4eCIsIHApKTsKKyAgICBpZiAocmVzdWx0IDwgMCkKKyAgICB7CisgICAgICByZXN1bHQgPSAocmVxdWVzdF9pcnEocC0+aXJxLCBkb19haWM3eHh4X2lzciwgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisgICAgICAgICAgICAgICJhaWM3eHh4IiwgcCkpOworICAgIH0KKyAgfQorICBpZiAocmVzdWx0IDwgMCkKKyAgeworICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIihzY3NpJWQpIENvdWxkbid0IHJlZ2lzdGVyIElSUSAlZCwgaWdub3JpbmcgIgorICAgICAgICAgICAiY29udHJvbGxlci5cbiIsIHAtPmhvc3Rfbm8sIHAtPmlycSk7CisgICAgYWljX291dGIocCwgMCwgU0lNT0RFMSk7CisgICAgcC0+aXJxID0gMDsKKyAgICByZXR1cm4gKDApOworICB9CisKKyAgaWYoYWljX2luYihwLCBJTlRTVEFUKSAmIElOVF9QRU5EKQorICAgIHByaW50ayhJTkZPX0xFQUQgInNwdXJpb3VzIGludGVycnVwdCBkdXJpbmcgY29uZmlndXJhdGlvbiwgY2xlYXJlZC5cbiIsCisgICAgICBwLT5ob3N0X25vLCAtMSwgLTEgLCAtMSk7CisgIGFpYzd4eHhfY2xlYXJfaW50c3RhdChwKTsKKworICB1bnBhdXNlX3NlcXVlbmNlcihwLCAvKiB1bnBhdXNlX2Fsd2F5cyAqLyBUUlVFKTsKKworICByZXR1cm4gKGZvdW5kKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2NoaXBfcmVzZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUGVyZm9ybSBhIGNoaXAgcmVzZXQgb24gdGhlIGFpYzd4eHggU0NTSSBjb250cm9sbGVyLiAgVGhlIGNvbnRyb2xsZXIKKyAqICAgaXMgcGF1c2VkIHVwb24gcmV0dXJuLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X2NoaXBfcmVzZXQoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKyAgdW5zaWduZWQgY2hhciBzYmxrY3RsOworICBpbnQgd2FpdDsKKworICAvKgorICAgKiBGb3Igc29tZSAyNzR4IGJvYXJkcywgd2UgbXVzdCBjbGVhciB0aGUgQ0hJUFJTVCBiaXQgYW5kIHBhdXNlCisgICAqIHRoZSBzZXF1ZW5jZXIuIEZvciBzb21lIHJlYXNvbiwgdGhpcyBtYWtlcyB0aGUgZHJpdmVyIHdvcmsuCisgICAqLworICBhaWNfb3V0YihwLCBQQVVTRSB8IENISVBSU1QsIEhDTlRSTCk7CisKKyAgLyoKKyAgICogSW4gdGhlIGZ1dHVyZSwgd2UgbWF5IGNhbGwgdGhpcyBmdW5jdGlvbiBhcyBhIGxhc3QgcmVzb3J0IGZvcgorICAgKiBlcnJvciBoYW5kbGluZy4gIExldCdzIGJlIG5pY2UgYW5kIG5vdCBkbyBhbnkgdW5uZWNlc3NhcnkgZGVsYXlzLgorICAgKi8KKyAgd2FpdCA9IDEwMDA7ICAvKiAxIG1zZWMgKDEwMDAgKiAxIG1zZWMpICovCisgIHdoaWxlICgtLXdhaXQgJiYgIShhaWNfaW5iKHAsIEhDTlRSTCkgJiBDSElQUlNUQUNLKSkKKyAgeworICAgIHVkZWxheSgxKTsgIC8qIDEgdXNlYyAqLworICB9CisKKyAgcGF1c2Vfc2VxdWVuY2VyKHApOworCisgIHNibGtjdGwgPSBhaWNfaW5iKHAsIFNCTEtDVEwpICYgKFNFTEJVU0J8U0VMV0lERSk7CisgIGlmIChwLT5jaGlwICYgQUhDX1BDSSkKKyAgICBzYmxrY3RsICY9IH5TRUxCVVNCOworICBzd2l0Y2goIHNibGtjdGwgKQorICB7CisgICAgY2FzZSAwOiAgLyogbm9ybWFsIG5hcnJvdyBjYXJkICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDI6ICAvKiBXaWRlIGNhcmQgKi8KKyAgICAgIHAtPmZlYXR1cmVzIHw9IEFIQ19XSURFOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4OiAgLyogVHdpbiBjYXJkICovCisgICAgICBwLT5mZWF0dXJlcyB8PSBBSENfVFdJTjsKKyAgICAgIHAtPmZsYWdzIHw9IEFIQ19NVUxUSV9DSEFOTkVMOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogLyogaG1tbS4uLndlIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzICovCisgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJhaWM3eHh4OiBVbnN1cHBvcnRlZCBhZGFwdGVyIHR5cGUgJWQsIGlnbm9yaW5nLlxuIiwKKyAgICAgICAgYWljX2luYihwLCBTQkxLQ1RMKSAmIDB4MGEpOworICAgICAgcmV0dXJuKC0xKTsKKyAgfQorICByZXR1cm4oMCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9hbGxvYworICoKKyAqIERlc2NyaXB0aW9uOgorICogICBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIGhvc3Qgc3RydWN0dXJlLiAgUmV0dXJucyBOVUxMIHVwb24gZXJyb3IKKyAqICAgYW5kIGEgcG9pbnRlciB0byBhIGFpYzd4eHhfaG9zdCBzdHJ1Y3QgdXBvbiBzdWNjZXNzLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IGFpYzd4eHhfaG9zdCAqCithaWM3eHh4X2FsbG9jKFNjc2lfSG9zdF9UZW1wbGF0ZSAqc2h0LCBzdHJ1Y3QgYWljN3h4eF9ob3N0ICp0ZW1wKQoreworICBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwID0gTlVMTDsKKyAgc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKworICAvKgorICAgKiBBbGxvY2F0ZSBhIHN0b3JhZ2UgYXJlYSBieSByZWdpc3RlcmluZyB1cyB3aXRoIHRoZSBtaWQtbGV2ZWwKKyAgICogU0NTSSBsYXllci4KKyAgICovCisgIGhvc3QgPSBzY3NpX3JlZ2lzdGVyKHNodCwgc2l6ZW9mKHN0cnVjdCBhaWM3eHh4X2hvc3QpKTsKKworICBpZiAoaG9zdCAhPSBOVUxMKQorICB7CisgICAgcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopIGhvc3QtPmhvc3RkYXRhOworICAgIG1lbXNldChwLCAwLCBzaXplb2Yoc3RydWN0IGFpYzd4eHhfaG9zdCkpOworICAgICpwID0gKnRlbXA7CisgICAgcC0+aG9zdCA9IGhvc3Q7CisKKyAgICBwLT5zY2JfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHNjYl9kYXRhX3R5cGUpLCBHRlBfQVRPTUlDKTsKKyAgICBpZiAocC0+c2NiX2RhdGEgIT0gTlVMTCkKKyAgICB7CisgICAgICBtZW1zZXQocC0+c2NiX2RhdGEsIDAsIHNpemVvZihzY2JfZGF0YV90eXBlKSk7CisgICAgICBzY2JxX2luaXQgKCZwLT5zY2JfZGF0YS0+ZnJlZV9zY2JzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBGb3Igc29tZSByZWFzb24gd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggbWVtb3J5LiAgRnJlZSB0aGUKKyAgICAgICAqIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHRoZSBhaWM3eHh4X2hvc3Qgc3RydWN0LCBhbmQgcmV0dXJuIE5VTEwuCisgICAgICAgKi8KKyAgICAgIHJlbGVhc2VfcmVnaW9uKHAtPmJhc2UsIE1BWFJFRyAtIE1JTlJFRyk7CisgICAgICBzY3NpX3VucmVnaXN0ZXIoaG9zdCk7CisgICAgICByZXR1cm4oTlVMTCk7CisgICAgfQorICAgIHAtPmhvc3Rfbm8gPSBob3N0LT5ob3N0X25vOworICB9CisgIHNjc2lfc2V0X2RldmljZShob3N0LCAmcC0+cGRldi0+ZGV2KTsKKyAgcmV0dXJuIChwKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2ZyZWUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgRnJlZXMgYW5kIHJlbGVhc2VzIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGFuIGluc3RhbmNlIG9mCisgKiAgIHRoZSBkcml2ZXIgKHN0cnVjdCBhaWM3eHh4X2hvc3QgKikuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X2ZyZWUoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKyAgaW50IGk7CisKKyAgLyoKKyAgICogRnJlZSB0aGUgYWxsb2NhdGVkIGhhcmR3YXJlIFNDQiBzcGFjZS4KKyAgICovCisgIGlmIChwLT5zY2JfZGF0YSAhPSBOVUxMKQorICB7CisgICAgc3RydWN0IGFpYzd4eHhfc2NiX2RtYSAqc2NiX2RtYSA9IE5VTEw7CisgICAgaWYgKHAtPnNjYl9kYXRhLT5oc2NicyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQocC0+cGRldiwgcC0+c2NiX2RhdGEtPmhzY2JzX2RtYV9sZW4sCisJCQkgIHAtPnNjYl9kYXRhLT5oc2NicywgcC0+c2NiX2RhdGEtPmhzY2JzX2RtYSk7CisgICAgICBwLT5zY2JfZGF0YS0+aHNjYnMgPSBwLT5zY2JfZGF0YS0+aHNjYl9rbWFsbG9jX3B0ciA9IE5VTEw7CisgICAgfQorICAgIC8qCisgICAgICogRnJlZSB0aGUgZHJpdmVyIFNDQnMuICBUaGVzZSB3ZXJlIGFsbG9jYXRlZCBvbiBhbiBhcy1uZWVkCisgICAgICogYmFzaXMuICBXZSBhbGxvY2F0ZWQgdGhlc2UgaW4gZ3JvdXBzIGRlcGVuZGluZyBvbiBob3cgbWFueQorICAgICAqIHdlIGNvdWxkIGZpdCBpbnRvIGEgZ2l2ZW4gYW1vdW50IG9mIFJBTS4gIFRoZSB0YWlsIFNDQiBmb3IKKyAgICAgKiB0aGVzZSBhbGxvY2F0aW9ucyBoYXMgYSBwb2ludGVyIHRvIHRoZSBhbGxvY2VkIGFyZWEuCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IHAtPnNjYl9kYXRhLT5udW1zY2JzOyBpKyspCisgICAgeworICAgICAgaWYgKHAtPnNjYl9kYXRhLT5zY2JfYXJyYXlbaV0tPnNjYl9kbWEgIT0gc2NiX2RtYSkKKyAgICAgIHsKKwlzY2JfZG1hID0gcC0+c2NiX2RhdGEtPnNjYl9hcnJheVtpXS0+c2NiX2RtYTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHAtPnBkZXYsIHNjYl9kbWEtPmRtYV9sZW4sCisJCQkgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpc2NiX2RtYS0+ZG1hX2FkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNjYl9kbWEtPmRtYV9vZmZzZXQpLAorCQkJICAgIHNjYl9kbWEtPmRtYV9hZGRyZXNzKTsKKyAgICAgIH0KKyAgICAgIGlmIChwLT5zY2JfZGF0YS0+c2NiX2FycmF5W2ldLT5rbWFsbG9jX3B0ciAhPSBOVUxMKQorICAgICAgICBrZnJlZShwLT5zY2JfZGF0YS0+c2NiX2FycmF5W2ldLT5rbWFsbG9jX3B0cik7CisgICAgICBwLT5zY2JfZGF0YS0+c2NiX2FycmF5W2ldID0gTlVMTDsKKyAgICB9CisgIAorICAgIC8qCisgICAgICogRnJlZSB0aGUgU0NCIGRhdGEgYXJlYS4KKyAgICAgKi8KKyAgICBrZnJlZShwLT5zY2JfZGF0YSk7CisgIH0KKworICBwY2lfZnJlZV9jb25zaXN0ZW50KHAtPnBkZXYsIDMqMjU2LCAodm9pZCAqKXAtPnVudGFnZ2VkX3NjYnMsIHAtPmZpZm9fZG1hKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2xvYWRfc2VlcHJvbQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBMb2FkIHRoZSBzZWVwcm9tIGFuZCBjb25maWd1cmUgYWRhcHRlciBhbmQgdGFyZ2V0IHNldHRpbmdzLgorICogICBSZXR1cm5zIDEgaWYgdGhlIGxvYWQgd2FzIHN1Y2Nlc3NmdWwgYW5kIDAgb3RoZXJ3aXNlLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9sb2FkX3NlZXByb20oc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgdW5zaWduZWQgY2hhciAqc3hmcmN0bDEpCit7CisgIGludCBoYXZlX3NlZXByb20gPSAwOworICBpbnQgaSwgbWF4X3RhcmdldHMsIG1hc2s7CisgIHVuc2lnbmVkIGNoYXIgc2NzaXJhdGUsIHNjc2lfY29uZjsKKyAgdW5zaWduZWQgc2hvcnQgc2NhcnJheVsxMjhdOworICBzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgKnNjID0gKHN0cnVjdCBzZWVwcm9tX2NvbmZpZyAqKSBzY2FycmF5OworCisgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1BST0JFMikKKyAgeworICAgIHByaW50ayhLRVJOX0lORk8gImFpYzd4eHg6IExvYWRpbmcgc2VyaWFsIEVFUFJPTS4uLiIpOworICB9CisgIHN3aXRjaCAocC0+Y2hpcCkKKyAgeworICAgIGNhc2UgKEFIQ19BSUM3NzcwfEFIQ19FSVNBKTogIC8qIE5vbmUgb2YgdGhlc2UgYWRhcHRlcnMgaGF2ZSBzZWVwcm9tcy4gKi8KKyAgICAgIGlmIChhaWNfaW5iKHAsIFNDU0lDT05GKSAmIFRFUk1fRU5CKQorICAgICAgICBwLT5mbGFncyB8PSBBSENfVEVSTV9FTkJfQTsKKyAgICAgIGlmICggKHAtPmZlYXR1cmVzICYgQUhDX1RXSU4pICYmIChhaWNfaW5iKHAsIFNDU0lDT05GICsgMSkgJiBURVJNX0VOQikgKQorICAgICAgICBwLT5mbGFncyB8PSBBSENfVEVSTV9FTkJfQjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAoQUhDX0FJQzc3NzB8QUhDX1ZMKToKKyAgICAgIGhhdmVfc2VlcHJvbSA9IHJlYWRfMjg0eF9zZWVwcm9tKHAsIChzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgKikgc2NhcnJheSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBoYXZlX3NlZXByb20gPSByZWFkX3NlZXByb20ocCwgKHAtPmZsYWdzICYgKEFIQ19DSE5MQnxBSENfQ0hOTEMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FycmF5LCBwLT5zY19zaXplLCBwLT5zY190eXBlKTsKKyAgICAgIGlmICghaGF2ZV9zZWVwcm9tKQorICAgICAgeworICAgICAgICBpZihwLT5zY190eXBlID09IEM0NikKKyAgICAgICAgICBoYXZlX3NlZXByb20gPSByZWFkX3NlZXByb20ocCwgKHAtPmZsYWdzICYgKEFIQ19DSE5MQnxBSENfQ0hOTEMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhcnJheSwgcC0+c2Nfc2l6ZSwgQzU2XzY2KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGhhdmVfc2VlcHJvbSA9IHJlYWRfc2VlcHJvbShwLCAocC0+ZmxhZ3MgJiAoQUhDX0NITkxCfEFIQ19DSE5MQykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FycmF5LCBwLT5zY19zaXplLCBDNDYpOworICAgICAgfQorICAgICAgaWYgKCFoYXZlX3NlZXByb20pCisgICAgICB7CisgICAgICAgIHAtPnNjX3NpemUgPSAxMjg7CisgICAgICAgIGhhdmVfc2VlcHJvbSA9IHJlYWRfc2VlcHJvbShwLCA0KihwLT5mbGFncyAmIChBSENfQ0hOTEJ8QUhDX0NITkxDKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FycmF5LCBwLT5zY19zaXplLCBwLT5zY190eXBlKTsKKyAgICAgICAgaWYgKCFoYXZlX3NlZXByb20pCisgICAgICAgIHsKKyAgICAgICAgICBpZihwLT5zY190eXBlID09IEM0NikKKyAgICAgICAgICAgIGhhdmVfc2VlcHJvbSA9IHJlYWRfc2VlcHJvbShwLCA0KihwLT5mbGFncyAmIChBSENfQ0hOTEJ8QUhDX0NITkxDKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhcnJheSwgcC0+c2Nfc2l6ZSwgQzU2XzY2KTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBoYXZlX3NlZXByb20gPSByZWFkX3NlZXByb20ocCwgNCoocC0+ZmxhZ3MgJiAoQUhDX0NITkxCfEFIQ19DSE5MQykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYXJyYXksIHAtPnNjX3NpemUsIEM0Nik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKCFoYXZlX3NlZXByb20pCisgIHsKKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgeworICAgICAgcHJpbnRrKCJcbmFpYzd4eHg6IE5vIFNFRVBST00gYXZhaWxhYmxlLlxuIik7CisgICAgfQorICAgIHAtPmZsYWdzIHw9IEFIQ19ORVdFRVBST01fRk1UOworICAgIGlmIChhaWNfaW5iKHAsIFNDU0lTRVEpID09IDApCisgICAgeworICAgICAgcC0+ZmxhZ3MgfD0gQUhDX1VTRURFRkFVTFRTOworICAgICAgcC0+ZmxhZ3MgJj0gfkFIQ19CSU9TX0VOQUJMRUQ7CisgICAgICBwLT5zY3NpX2lkID0gcC0+c2NzaV9pZF9iID0gNzsKKyAgICAgICpzeGZyY3RsMSB8PSBTVFBXRU47CisgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICB7CisgICAgICAgIHByaW50aygiYWljN3h4eDogVXNpbmcgZGVmYXVsdCB2YWx1ZXMuXG4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgeworICAgICAgcHJpbnRrKCJhaWM3eHh4OiBVc2luZyBsZWZ0b3ZlciBCSU9TIHZhbHVlcy5cbiIpOworICAgIH0KKyAgICBpZiAoICgocC0+Y2hpcCAmIH5BSENfQ0hJUElEX01BU0spID09IEFIQ19QQ0kpICYmICgqc3hmcmN0bDEgJiBTVFBXRU4pICkKKyAgICB7CisgICAgICBwLT5mbGFncyB8PSBBSENfVEVSTV9FTkJfU0VfTE9XIHwgQUhDX1RFUk1fRU5CX1NFX0hJR0g7CisgICAgICBzYy0+YWRhcHRlcl9jb250cm9sICY9IH5DRkFVVE9URVJNOworICAgICAgc2MtPmFkYXB0ZXJfY29udHJvbCB8PSBDRlNURVJNIHwgQ0ZXU1RFUk0gfCBDRkxWRFNURVJNOworICAgIH0KKyAgICBpZiAoYWljN3h4eF9leHRlbmRlZCkKKyAgICAgIHAtPmZsYWdzIHw9IChBSENfRVhURU5EX1RSQU5TX0EgfCBBSENfRVhURU5EX1RSQU5TX0IpOworICAgIGVsc2UKKyAgICAgIHAtPmZsYWdzICY9IH4oQUhDX0VYVEVORF9UUkFOU19BIHwgQUhDX0VYVEVORF9UUkFOU19CKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgeworICAgICAgcHJpbnRrKCJkb25lXG4iKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5vdGUgdGhpbmdzIGluIG91ciBmbGFncworICAgICAqLworICAgIHAtPmZsYWdzIHw9IEFIQ19TRUVQUk9NX0ZPVU5EOworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIHNldHRpbmdzIGluIHN4ZnJjdGwxIHRvIG1hdGNoIHRoZSB0ZXJtaW5hdGlvbiBzZXR0aW5ncy4KKyAgICAgKi8KKyAgICAqc3hmcmN0bDEgPSAwOworCisgICAgLyoKKyAgICAgKiBHZXQgb3VyIFNDU0kgSUQgZnJvbSB0aGUgU0VFUFJPTSBzZXR0aW5nLi4uCisgICAgICovCisgICAgcC0+c2NzaV9pZCA9IChzYy0+YnJ0aW1lX2lkICYgQ0ZTQ1NJSUQpOworCisgICAgLyoKKyAgICAgKiBGaXJzdCBwcm9jZXNzIHRoZSBzZXR0aW5ncyB0aGF0IGFyZSBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgVkxCCisgICAgICogYW5kIFBDSSBhZGFwdGVyIHNlZXByb21zLgorICAgICAqLworICAgIGlmICgocC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykgPT0gQUhDX0FJQzc3NzApCisgICAgeworICAgICAgLyogVkxCIGFkYXB0ZXIgc2VlcHJvbXMgKi8KKyAgICAgIGlmIChzYy0+Ymlvc19jb250cm9sICYgQ0YyODRYRVhURU5EKQorICAgICAgICBwLT5mbGFncyB8PSBBSENfRVhURU5EX1RSQU5TX0E7CisKKyAgICAgIGlmIChzYy0+YWRhcHRlcl9jb250cm9sICYgQ0YyODRYU1RFUk0pCisgICAgICB7CisgICAgICAgICpzeGZyY3RsMSB8PSBTVFBXRU47CisgICAgICAgIHAtPmZsYWdzIHw9IEFIQ19URVJNX0VOQl9TRV9MT1cgfCBBSENfVEVSTV9FTkJfU0VfSElHSDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFBDSSBhZGFwdGVyIHNlZXByb21zICovCisgICAgICBpZiAoc2MtPmJpb3NfY29udHJvbCAmIENGRVhURU5EKQorICAgICAgICBwLT5mbGFncyB8PSBBSENfRVhURU5EX1RSQU5TX0E7CisgICAgICBpZiAoc2MtPmJpb3NfY29udHJvbCAmIENGQklPU0VOKQorICAgICAgICBwLT5mbGFncyB8PSBBSENfQklPU19FTkFCTEVEOworICAgICAgZWxzZQorICAgICAgICBwLT5mbGFncyAmPSB+QUhDX0JJT1NfRU5BQkxFRDsKKworICAgICAgaWYgKHNjLT5hZGFwdGVyX2NvbnRyb2wgJiBDRlNURVJNKQorICAgICAgeworICAgICAgICAqc3hmcmN0bDEgfD0gU1RQV0VOOworICAgICAgICBwLT5mbGFncyB8PSBBSENfVEVSTV9FTkJfU0VfTE9XIHwgQUhDX1RFUk1fRU5CX1NFX0hJR0g7CisgICAgICB9CisgICAgfQorICAgIG1lbWNweSgmcC0+c2MsIHNjLCBzaXplb2Yoc3RydWN0IHNlZXByb21fY29uZmlnKSk7CisgIH0KKworICBwLT5kaXNjZW5hYmxlID0gMDsKKworICAvKgorICAgKiBMaW1pdCB0byAxNiB0YXJnZXRzIGp1c3QgaW4gY2FzZS4gIFRoZSAyODQyIGZvciBvbmUgaXMga25vd24gdG8KKyAgICogYmxvdyB0aGUgbWF4X3RhcmdldHMgc2V0dGluZywgZnV0dXJlIGNhcmRzIG1pZ2h0IGFsc28uCisgICAqLworICBtYXhfdGFyZ2V0cyA9ICgocC0+ZmVhdHVyZXMgJiAoQUhDX1RXSU4gfCBBSENfV0lERSkpID8gMTYgOiA4KTsKKworICBpZiAoaGF2ZV9zZWVwcm9tKQorICB7CisgICAgZm9yIChpID0gMDsgaSA8IG1heF90YXJnZXRzOyBpKyspCisgICAgeworICAgICAgaWYoICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEpICYmCisgICAgICAgICAgIShzYy0+YWRhcHRlcl9jb250cm9sICYgQ0ZVTFRSQUVOKSAmJgorICAgICAgICAgICAoc2MtPmRldmljZV9mbGFnc1tpXSAmIENGU1lOQ0hJU1VMVFJBKSkgfHwKKyAgICAgICAgICAoc2MtPmRldmljZV9mbGFnc1tpXSAmIENGTkVXVUxUUkFGT1JNQVQpICkKKyAgICAgIHsKKyAgICAgICAgcC0+ZmxhZ3MgfD0gQUhDX05FV0VFUFJPTV9GTVQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBtYXhfdGFyZ2V0czsgaSsrKQorICB7CisgICAgbWFzayA9ICgweDAxIDw8IGkpOworICAgIGlmICghaGF2ZV9zZWVwcm9tKQorICAgIHsKKyAgICAgIGlmIChhaWNfaW5iKHAsIFNDU0lTRVEpICE9IDApCisgICAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIE9LLi4udGhlIEJJT1Mgc2V0IHRoaW5ncyB1cCBhbmQgbGVmdCBiZWhpbmQgdGhlIHNldHRpbmdzIHdlIG5lZWQuCisgICAgICAgICAqIEp1c3QgbWFrZSBvdXIgc2MtPmRldmljZV9mbGFnc1tpXSBlbnRyeSBtYXRjaCB3aGF0IHRoZSBjYXJkIGhhcworICAgICAgICAgKiBzZXQgZm9yIHRoaXMgZGV2aWNlLgorICAgICAgICAgKi8KKwlwLT5kaXNjZW5hYmxlID0KKwkgIH4oYWljX2luYihwLCBESVNDX0RTQikgfCAoYWljX2luYihwLCBESVNDX0RTQiArIDEpIDw8IDgpICk7CisgICAgICAgIHAtPnVsdHJhZW5iID0KKyAgICAgICAgICAoYWljX2luYihwLCBVTFRSQV9FTkIpIHwgKGFpY19pbmIocCwgVUxUUkFfRU5CICsgMSkgPDwgOCkgKTsKKwlzYy0+ZGV2aWNlX2ZsYWdzW2ldID0gKHAtPmRpc2NlbmFibGUgJiBtYXNrKSA/IENGRElTQyA6IDA7CisgICAgICAgIGlmIChhaWNfaW5iKHAsIFRBUkdfU0NTSVJBVEUgKyBpKSAmIFdJREVYRkVSKQorICAgICAgICAgIHNjLT5kZXZpY2VfZmxhZ3NbaV0gfD0gQ0ZXSURFQjsKKyAgICAgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikKKyAgICAgICAgeworICAgICAgICAgIGlmIChhaWNfaW5iKHAsIFRBUkdfT0ZGU0VUICsgaSkpCisgICAgICAgICAgeworICAgICAgICAgICAgc2MtPmRldmljZV9mbGFnc1tpXSB8PSBDRlNZTkNIOworICAgICAgICAgICAgc2MtPmRldmljZV9mbGFnc1tpXSB8PSAoYWljX2luYihwLCBUQVJHX1NDU0lSQVRFICsgaSkgJiAweDA3KTsKKyAgICAgICAgICAgIGlmICggKGFpY19pbmIocCwgVEFSR19TQ1NJUkFURSArIGkpICYgMHgxOCkgPT0gMHgxOCApCisgICAgICAgICAgICAgIHNjLT5kZXZpY2VfZmxhZ3NbaV0gfD0gQ0ZTWU5DSElTVUxUUkE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChhaWNfaW5iKHAsIFRBUkdfU0NTSVJBVEUgKyBpKSAmIH5XSURFWEZFUikKKyAgICAgICAgICB7CisgICAgICAgICAgICBzYy0+ZGV2aWNlX2ZsYWdzW2ldIHw9IENGU1lOQ0g7CisgICAgICAgICAgICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEpCisgICAgICAgICAgICAgIHNjLT5kZXZpY2VfZmxhZ3NbaV0gfD0gKChwLT51bHRyYWVuYiAmIG1hc2spID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTWU5DSElTVUxUUkEgOiAwKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQXNzdW1lIHRoZSBCSU9TIGhhcyBOT1QgYmVlbiBydW4gb24gdGhpcyBjYXJkIGFuZCBub3RoaW5nIGJldHdlZW4KKyAgICAgICAgICogdGhlIGNhcmQgYW5kIHRoZSBkZXZpY2VzIGlzIGNvbmZpZ3VyZWQgeWV0LgorICAgICAgICAgKi8KKyAgICAgICAgc2MtPmRldmljZV9mbGFnc1tpXSA9IENGRElTQzsKKyAgICAgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1dJREUpCisgICAgICAgICAgc2MtPmRldmljZV9mbGFnc1tpXSB8PSBDRldJREVCOworICAgICAgICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEzKQorICAgICAgICAgIHNjLT5kZXZpY2VfZmxhZ3NbaV0gfD0gMjsKKyAgICAgICAgZWxzZSBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgICAgICAgIHNjLT5kZXZpY2VfZmxhZ3NbaV0gfD0gMzsKKyAgICAgICAgZWxzZSBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEpCisgICAgICAgICAgc2MtPmRldmljZV9mbGFnc1tpXSB8PSBDRlNZTkNISVNVTFRSQTsKKyAgICAgICAgc2MtPmRldmljZV9mbGFnc1tpXSB8PSBDRlNZTkNIOworICAgICAgICBhaWNfb3V0YihwLCAwLCBUQVJHX1NDU0lSQVRFICsgaSk7CisgICAgICAgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgICAgICAgICAgYWljX291dGIocCwgMCwgVEFSR19PRkZTRVQgKyBpKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRkRJU0MpCisgICAgeworICAgICAgcC0+ZGlzY2VuYWJsZSB8PSBtYXNrOworICAgIH0KKyAgICBpZiAocC0+ZmxhZ3MgJiBBSENfTkVXRUVQUk9NX0ZNVCkKKyAgICB7CisgICAgICBpZiAoICEocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSApCisgICAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEkga25vdyBvZiB0d28gZGlmZmVyZW50IFVsdHJhIEJJT1NlcyB0aGF0IGRvIHRoaXMgZGlmZmVyZW50bHkuCisgICAgICAgICAqIE9uZSBvbiB0aGUgR2lnYWJ5dGUgNkJYVSBtYiB0aGF0IHdhbnRzIGZsYWdzW2ldICYgQ0ZYRkVSIHRvCisgICAgICAgICAqIGJlID09IHRvIDB4MDMgYW5kIFNZTkNISVNVTFRSQSB0byBiZSB0cnVlIHRvIG1lYW4gNDBNQnl0ZS9zCisgICAgICAgICAqIHdoaWxlIG9uIHRoZSBJQk0gTmV0ZmluaXR5IDUwMDAgdGhleSB3YW50IHRoZSBzYW1lIHRoaW5nCisgICAgICAgICAqIHRvIGJlIHNvbWV0aGluZyBlbHNlLCB3aGlsZSBmbGFnc1tpXSAmIENGWEZFUiA9PSAweDAzIGFuZAorICAgICAgICAgKiBTWU5DSElTVUxUUkEgZmFsc2Ugc2hvdWxkIGJlIDQwTUJ5dGUvcy4gIFNvLCB3ZSBzZXQgYm90aCB0bworICAgICAgICAgKiA0ME1CeXRlL3MgYW5kIHRoZSBsb3dlciBzcGVlZHMgYmUgZGFtbmVkLiAgUGVvcGxlIHdpbGwgaGF2ZQorICAgICAgICAgKiB0byBzZWxlY3QgYXJvdW5kIHRoZSBjb252ZXJzZWx5IG1hcHBlZCBsb3dlciBzcGVlZHMgaW4gb3JkZXIKKyAgICAgICAgICogdG8gc2VsZWN0IGxvd2VyIHNwZWVkcyBvbiB0aGVzZSBib2FyZHMuCisgICAgICAgICAqLworICAgICAgICBpZiAoIChzYy0+ZGV2aWNlX2ZsYWdzW2ldICYgQ0ZORVdVTFRSQUZPUk1BVCkgJiYKKyAgICAgICAgICAgICgoc2MtPmRldmljZV9mbGFnc1tpXSAmIENGWEZFUikgPT0gMHgwMykgKQorICAgICAgICB7CisgICAgICAgICAgc2MtPmRldmljZV9mbGFnc1tpXSAmPSB+Q0ZYRkVSOworICAgICAgICAgIHNjLT5kZXZpY2VfZmxhZ3NbaV0gfD0gQ0ZTWU5DSElTVUxUUkE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRlNZTkNISVNVTFRSQSkKKyAgICAgICAgeworICAgICAgICAgIHAtPnVsdHJhZW5iIHw9IG1hc2s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCAhKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRk5FV1VMVFJBRk9STUFUKSAmJgorICAgICAgICAgICAgICAgICAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAmJgorCQkgKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRlNZTkNISVNVTFRSQSkgKQorICAgICAgeworICAgICAgICBwLT51bHRyYWVuYiB8PSBtYXNrOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChzYy0+YWRhcHRlcl9jb250cm9sICYgQ0ZVTFRSQUVOKQorICAgIHsKKyAgICAgIHAtPnVsdHJhZW5iIHw9IG1hc2s7CisgICAgfQorICAgIGlmICggKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRlNZTkNIKSA9PSAwKQorICAgIHsKKyAgICAgIHNjLT5kZXZpY2VfZmxhZ3NbaV0gJj0gfkNGWEZFUjsKKyAgICAgIHAtPnVsdHJhZW5iICY9IH5tYXNrOworICAgICAgcC0+dXNlcltpXS5vZmZzZXQgPSAwOworICAgICAgcC0+dXNlcltpXS5wZXJpb2QgPSAwOworICAgICAgcC0+dXNlcltpXS5vcHRpb25zID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTMpCisgICAgICB7CisgICAgICAgIHAtPnVzZXJbaV0ub2Zmc2V0ID0gTUFYX09GRlNFVF9VTFRSQTI7CisgICAgICAgIGlmKCAoc2MtPmRldmljZV9mbGFnc1tpXSAmIENGWEZFUikgPCAweDAzICkKKyAgICAgICAgeworICAgICAgICAgIHNjc2lyYXRlID0gKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRlhGRVIpOworICAgICAgICAgIHAtPnVzZXJbaV0ub3B0aW9ucyA9IE1TR19FWFRfUFBSX09QVElPTl9EVF9DUkM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgc2NzaXJhdGUgPSAoc2MtPmRldmljZV9mbGFnc1tpXSAmIENGWEZFUikgfAorICAgICAgICAgICAgICAgICAgICAgKChwLT51bHRyYWVuYiAmIG1hc2spID8gMHgxOCA6IDB4MTApOworICAgICAgICAgIHAtPnVzZXJbaV0ub3B0aW9ucyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcC0+dXNlcltpXS5wZXJpb2QgPSBhaWM3eHh4X2ZpbmRfcGVyaW9kKHAsIHNjc2lyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhDX1NZTkNSQVRFX1VMVFJBMyk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgICAgICB7CisgICAgICAgIHAtPnVzZXJbaV0ub2Zmc2V0ID0gTUFYX09GRlNFVF9VTFRSQTI7CisgICAgICAgIHNjc2lyYXRlID0gKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRlhGRVIpIHwKKyAgICAgICAgICAgICAgICAgICAoKHAtPnVsdHJhZW5iICYgbWFzaykgPyAweDE4IDogMHgxMCk7CisgICAgICAgIHAtPnVzZXJbaV0ub3B0aW9ucyA9IDA7CisgICAgICAgIHAtPnVzZXJbaV0ucGVyaW9kID0gYWljN3h4eF9maW5kX3BlcmlvZChwLCBzY3NpcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFIQ19TWU5DUkFURV9VTFRSQTIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBzY3NpcmF0ZSA9IChzYy0+ZGV2aWNlX2ZsYWdzW2ldICYgQ0ZYRkVSKSA8PCA0OworICAgICAgICBwLT51c2VyW2ldLm9wdGlvbnMgPSAwOworICAgICAgICBwLT51c2VyW2ldLm9mZnNldCA9IE1BWF9PRkZTRVRfOEJJVDsKKyAgICAgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBKQorICAgICAgICB7CisgICAgICAgICAgc2hvcnQgdWx0cmFlbmI7CisgICAgICAgICAgdWx0cmFlbmIgPSBhaWNfaW5iKHAsIFVMVFJBX0VOQikgfAorICAgICAgICAgICAgKGFpY19pbmIocCwgVUxUUkFfRU5CICsgMSkgPDwgOCk7CisgICAgICAgICAgcC0+dXNlcltpXS5wZXJpb2QgPSBhaWM3eHh4X2ZpbmRfcGVyaW9kKHAsIHNjc2lyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHAtPnVsdHJhZW5iICYgbWFzaykgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhDX1NZTkNSQVRFX1VMVFJBIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFIQ19TWU5DUkFURV9GQVNUKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgcC0+dXNlcltpXS5wZXJpb2QgPSBhaWM3eHh4X2ZpbmRfcGVyaW9kKHAsIHNjc2lyYXRlLAorCQkJICAJCSAgQUhDX1NZTkNSQVRFX0ZBU1QpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIChzYy0+ZGV2aWNlX2ZsYWdzW2ldICYgQ0ZXSURFQikgJiYgKHAtPmZlYXR1cmVzICYgQUhDX1dJREUpICkKKyAgICB7CisgICAgICBwLT51c2VyW2ldLndpZHRoID0gTVNHX0VYVF9XRFRSX0JVU18xNl9CSVQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwLT51c2VyW2ldLndpZHRoID0gTVNHX0VYVF9XRFRSX0JVU184X0JJVDsKKyAgICB9CisgIH0KKyAgYWljX291dGIocCwgfihwLT5kaXNjZW5hYmxlICYgMHhGRiksIERJU0NfRFNCKTsKKyAgYWljX291dGIocCwgfigocC0+ZGlzY2VuYWJsZSA+PiA4KSAmIDB4RkYpLCBESVNDX0RTQiArIDEpOworCisgIC8qCisgICAqIFdlIHNldCB0aGUgcC0+dWx0cmFlbmIgZnJvbSB0aGUgU0VFUFJPTSB0byBiZWdpbiB3aXRoLCBidXQgbm93IHdlIG1ha2UKKyAgICogaXQgbWF0Y2ggd2hhdCBpcyBhbHJlYWR5IGRvd24gaW4gdGhlIGNhcmQuICBJZiB3ZSBhcmUgZG9pbmcgYSByZXNldAorICAgKiBvbiB0aGUgY2FyZCB0aGVuIHRoaXMgd2lsbCBnZXQgcHV0IGJhY2sgdG8gYSBkZWZhdWx0IHN0YXRlIGFueXdheS4KKyAgICogVGhpcyBhbGxvd3MgdXMgdG8gbm90IGhhdmUgdG8gcHJlLWVtcHRpdmVseSBuZWdvdGlhdGUgd2hlbiB1c2luZyB0aGUKKyAgICogbm9fcmVzZXQgb3B0aW9uLgorICAgKi8KKyAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBKQorICAgIHAtPnVsdHJhZW5iID0gYWljX2luYihwLCBVTFRSQV9FTkIpIHwgKGFpY19pbmIocCwgVUxUUkFfRU5CICsgMSkgPDwgOCk7CisKKyAgCisgIHNjc2lfY29uZiA9IChwLT5zY3NpX2lkICYgSFNDU0lJRCk7CisKKyAgaWYoaGF2ZV9zZWVwcm9tKQorICB7CisgICAgcC0+YWRhcHRlcl9jb250cm9sID0gc2MtPmFkYXB0ZXJfY29udHJvbDsKKyAgICBwLT5iaW9zX2NvbnRyb2wgPSBzYy0+Ymlvc19jb250cm9sOworCisgICAgc3dpdGNoIChwLT5jaGlwICYgQUhDX0NISVBJRF9NQVNLKQorICAgIHsKKyAgICAgIGNhc2UgQUhDX0FJQzc4OTU6CisgICAgICBjYXNlIEFIQ19BSUM3ODk2OgorICAgICAgY2FzZSBBSENfQUlDNzg5OToKKyAgICAgICAgaWYgKHAtPmFkYXB0ZXJfY29udHJvbCAmIENGQlBSSU1BUlkpCisgICAgICAgICAgcC0+ZmxhZ3MgfD0gQUhDX0NIQU5ORUxfQl9QUklNQVJZOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHNjLT5hZGFwdGVyX2NvbnRyb2wgJiBDRlNQQVJJVFkpCisgICAgICBzY3NpX2NvbmYgfD0gRU5TUENISzsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzY3NpX2NvbmYgfD0gRU5TUENISyB8IFJFU0VUX1NDU0k7CisgIH0KKworICAvKgorICAgKiBPbmx5IHNldCB0aGUgU0NTSUNPTkYgYW5kIFNDU0lDT05GICsgMSByZWdpc3RlcnMgaWYgd2UgYXJlIGEgUENJIGNhcmQuCisgICAqIFRoZSAyODQyIGFuZCAyNzQyIGNhcmRzIGFscmVhZHkgaGF2ZSB0aGVzZSByZWdpc3RlcnMgc2V0IGFuZCB3ZSBkb24ndAorICAgKiB3YW50IHRvIG11Y2sgd2l0aCB0aGVtIHNpbmNlIHdlIGRvbid0IHNldCBhbGwgdGhlIGJpdHMgdGhleSBkby4KKyAgICovCisgIGlmICggKHAtPmNoaXAgJiB+QUhDX0NISVBJRF9NQVNLKSA9PSBBSENfUENJICkKKyAgeworICAgIC8qIFNldCB0aGUgaG9zdCBJRCAqLworICAgIGFpY19vdXRiKHAsIHNjc2lfY29uZiwgU0NTSUNPTkYpOworICAgIC8qIEluIGNhc2Ugd2UgYXJlIGEgd2lkZSBjYXJkICovCisgICAgYWljX291dGIocCwgcC0+c2NzaV9pZCwgU0NTSUNPTkYgKyAxKTsKKyAgfQorfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfY29uZmlndXJlX2J1Z3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGFrZSB0aGUgY2FyZCBwYXNzZWQgaW4gYW5kIHNldCB0aGUgYXBwcm9wcmlhdGUgYnVnIGZsYWdzIGJhc2VkIHVwb24KKyAqICAgdGhlIGNhcmQgbW9kZWwuICBBbHNvIG1ha2UgYW55IGNoYW5nZXMgbmVlZGVkIHRvIGRldmljZSByZWdpc3RlcnMgb3IKKyAqICAgUENJIHJlZ2lzdGVycyB3aGlsZSB3ZSBhcmUgaGVyZS4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfY29uZmlndXJlX2J1Z3Moc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKyAgdW5zaWduZWQgc2hvcnQgdG1wX3dvcmQ7CisgCisgIHN3aXRjaChwLT5jaGlwICYgQUhDX0NISVBJRF9NQVNLKQorICB7CisgICAgY2FzZSBBSENfQUlDNzg2MDoKKyAgICAgIHAtPmJ1Z3MgfD0gQUhDX0JVR19QQ0lfMl8xX1JFVFJZOworICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSBBSENfQUlDNzg1MDoKKyAgICBjYXNlIEFIQ19BSUM3ODcwOgorICAgICAgcC0+YnVncyB8PSBBSENfQlVHX1RNT0RFX1dJREVPREQgfCBBSENfQlVHX0NBQ0hFVEhFTiB8IEFIQ19CVUdfUENJX01XSTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUhDX0FJQzc4ODA6CisgICAgICBwLT5idWdzIHw9IEFIQ19CVUdfVE1PREVfV0lERU9ERCB8IEFIQ19CVUdfUENJXzJfMV9SRVRSWSB8CisgICAgICAgICAgICAgICAgIEFIQ19CVUdfQ0FDSEVUSEVOIHwgQUhDX0JVR19QQ0lfTVdJOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBSENfQUlDNzg5MDoKKyAgICAgIHAtPmJ1Z3MgfD0gQUhDX0JVR19BVVRPRkxVU0ggfCBBSENfQlVHX0NBQ0hFVEhFTjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUhDX0FJQzc4OTI6CisgICAgICBwLT5idWdzIHw9IEFIQ19CVUdfU0NCQ0hBTl9VUExPQUQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFIQ19BSUM3ODk1OgorICAgICAgcC0+YnVncyB8PSBBSENfQlVHX1RNT0RFX1dJREVPREQgfCBBSENfQlVHX1BDSV8yXzFfUkVUUlkgfAorICAgICAgICAgICAgICAgICBBSENfQlVHX0NBQ0hFVEhFTiB8IEFIQ19CVUdfUENJX01XSTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUhDX0FJQzc4OTY6CisgICAgICBwLT5idWdzIHw9IEFIQ19CVUdfQ0FDSEVUSEVOX0RJUzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUhDX0FJQzc4OTk6CisgICAgICBwLT5idWdzIHw9IEFIQ19CVUdfU0NCQ0hBTl9VUExPQUQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgYnJlYWs7CisgIH0KKworICAvKgorICAgKiBOb3cgaGFuZGxlIHRoZSBidWdzIHRoYXQgcmVxdWlyZSBQQ0kgcmVnaXN0ZXIgb3IgY2FyZCByZWdpc3RlciB0d2Vha3MKKyAgICovCisgIHBjaV9yZWFkX2NvbmZpZ193b3JkKHAtPnBkZXYsIFBDSV9DT01NQU5ELCAmdG1wX3dvcmQpOworICBpZihwLT5idWdzICYgQUhDX0JVR19QQ0lfTVdJKQorICB7CisgICAgdG1wX3dvcmQgJj0gflBDSV9DT01NQU5EX0lOVkFMSURBVEU7CisgIH0KKyAgZWxzZQorICB7CisgICAgdG1wX3dvcmQgfD0gUENJX0NPTU1BTkRfSU5WQUxJREFURTsKKyAgfQorICBwY2lfd3JpdGVfY29uZmlnX3dvcmQocC0+cGRldiwgUENJX0NPTU1BTkQsIHRtcF93b3JkKTsKKworICBpZihwLT5idWdzICYgQUhDX0JVR19DQUNIRVRIRU4pCisgIHsKKyAgICBhaWNfb3V0YihwLCBhaWNfaW5iKHAsIERTQ09NTUFORDApICYgfkNBQ0hFVEhFTiwgRFNDT01NQU5EMCk7CisgIH0KKyAgZWxzZSBpZiAocC0+YnVncyAmIEFIQ19CVUdfQ0FDSEVUSEVOX0RJUykKKyAgeworICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgRFNDT01NQU5EMCkgfCBDQUNIRVRIRU4sIERTQ09NTUFORDApOworICB9CisKKyAgcmV0dXJuOworfQorCisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9kZXRlY3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVHJ5IHRvIGRldGVjdCBhbmQgcmVnaXN0ZXIgYW4gQWRhcHRlYyA3NzcwIG9yIDc4NzAgU0NTSSBjb250cm9sbGVyLgorICoKKyAqIFhYWCAtIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBjYWxsZWQgYWljN3h4eF9wcm9iZSgpLiAgQSBzZXF1ZW5jZSBvZgorICogICAgICAgcHJvYmUoKSwgYXR0YWNoKCkvZGV0YWNoKCksIGFuZCBpbml0KCkgbWFrZXMgbW9yZSBzZW5zZSB0aGFuCisgKiAgICAgICBvbmUgZG8taXQtYWxsIGZ1bmN0aW9uLiAgVGhpcyBtYXkgYmUgdXNlZnVsIHdoZW4gKGFuZCBpZikgdGhlCisgKiAgICAgICBtaWQtbGV2ZWwgU0NTSSBjb2RlIGlzIG92ZXJoYXVsZWQuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2FpYzd4eHhfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdGVtcGxhdGUpCit7CisgIHN0cnVjdCBhaWM3eHh4X2hvc3QgKnRlbXBfcCA9IE5VTEw7CisgIHN0cnVjdCBhaWM3eHh4X2hvc3QgKmN1cnJlbnRfcCA9IE5VTEw7CisgIHN0cnVjdCBhaWM3eHh4X2hvc3QgKmxpc3RfcCA9IE5VTEw7CisgIGludCBmb3VuZCA9IDA7CisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2FscGhhX18pCisgIGFoY19mbGFnX3R5cGUgZmxhZ3MgPSAwOworICBpbnQgdHlwZTsKKyNlbmRpZgorICB1bnNpZ25lZCBjaGFyIHN4ZnJjdGwxOworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19hbHBoYV9fKQorICB1bnNpZ25lZCBjaGFyIGhjbnRybCwgaG9zdGNvbmY7CisgIHVuc2lnbmVkIGludCBzbG90LCBiYXNlOworI2VuZGlmCisKKyNpZmRlZiBNT0RVTEUKKyAgLyoKKyAgICogSWYgd2UgYXJlIGNhbGxlZCBhcyBhIG1vZHVsZSwgdGhlIGFpYzd4eHggcG9pbnRlciBtYXkgbm90IGJlIG51bGwKKyAgICogYW5kIGl0IHdvdWxkIHBvaW50IHRvIG91ciBib290dXAgc3RyaW5nLCBqdXN0IGxpa2Ugb24gdGhlIGxpbG8KKyAgICogY29tbWFuZCBsaW5lLiAgSUYgbm90IE5VTEwsIHRoZW4gcHJvY2VzcyB0aGlzIGNvbmZpZyBzdHJpbmcgd2l0aAorICAgKiBhaWM3eHh4X3NldHVwCisgICAqLworICBpZihhaWM3eHh4KQorICAgIGFpYzd4eHhfc2V0dXAoYWljN3h4eCk7CisjZW5kaWYKKworICB0ZW1wbGF0ZS0+cHJvY19uYW1lID0gImFpYzd4eHgiOworICB0ZW1wbGF0ZS0+c2dfdGFibGVzaXplID0gQUlDN1hYWF9NQVhfU0c7CisKKworI2lmZGVmIENPTkZJR19QQ0kKKyAgLyoKKyAgICogUENJLWJ1cyBwcm9iZS4KKyAgICovCisgIHsKKyAgICBzdGF0aWMgc3RydWN0CisgICAgeworICAgICAgdW5zaWduZWQgc2hvcnQgICAgICB2ZW5kb3JfaWQ7CisgICAgICB1bnNpZ25lZCBzaG9ydCAgICAgIGRldmljZV9pZDsKKyAgICAgIGFoY19jaGlwICAgICAgICAgICAgY2hpcDsKKyAgICAgIGFoY19mbGFnX3R5cGUgICAgICAgZmxhZ3M7CisgICAgICBhaGNfZmVhdHVyZSAgICAgICAgIGZlYXR1cmVzOworICAgICAgaW50ICAgICAgICAgICAgICAgICBib2FyZF9uYW1lX2luZGV4OworICAgICAgdW5zaWduZWQgc2hvcnQgICAgICBzZWVwcm9tX3NpemU7CisgICAgICB1bnNpZ25lZCBzaG9ydCAgICAgIHNlZXByb21fdHlwZTsKKyAgICB9IGNvbnN0IGFpY19wZGV2c1tdID0geworICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQywgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4MTAsIEFIQ19OT05FLAorICAgICAgIEFIQ19GTk9ORSwgQUhDX0ZFTk9ORSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgMzIsIEM0NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQywgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4NTAsIEFIQ19BSUM3ODUwLAorICAgICAgIEFIQ19QQUdFU0NCUywgQUhDX0FJQzc4NTBfRkUsICAgICAgICAgICAgICAgICAgICAgICAgIDUsCisgICAgICAgMzIsIEM0NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQywgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4NTUsIEFIQ19BSUM3ODUwLAorICAgICAgIEFIQ19QQUdFU0NCUywgQUhDX0FJQzc4NTBfRkUsICAgICAgICAgICAgICAgICAgICAgICAgIDYsCisgICAgICAgMzIsIEM0NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQywgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4MjEsIEFIQ19BSUM3ODYwLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCwKKyAgICAgICBBSENfQUlDNzg2MF9GRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ18zODYwLCBBSENfQUlDNzg2MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfTkVXRUVQUk9NX0ZNVCB8IEFIQ19CSU9TX0VOQUJMRUQsCisgICAgICAgQUhDX0FJQzc4NjBfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywKKyAgICAgICAzMiwgQzQ2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDLCBQQ0lfREVWSUNFX0lEX0FEQVBURUNfMzg2MDIsIEFIQ19BSUM3ODYwLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCwKKyAgICAgICBBSENfQUlDNzg2MF9GRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ18zODYwMiwgQUhDX0FJQzc4NjAsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX05FV0VFUFJPTV9GTVQgfCBBSENfQklPU19FTkFCTEVELAorICAgICAgIEFIQ19BSUM3ODYwX0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsCisgICAgICAgMzIsIEM0NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQywgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4NjAsIEFIQ19BSUM3ODYwLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19NT1RIRVJCT0FSRCwKKyAgICAgICBBSENfQUlDNzg2MF9GRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODYxLCBBSENfQUlDNzg2MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfTkVXRUVQUk9NX0ZNVCB8IEFIQ19CSU9TX0VOQUJMRUQsCisgICAgICAgQUhDX0FJQzc4NjBfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAzMiwgQzQ2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDLCBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg3MCwgQUhDX0FJQzc4NzAsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19NT1RIRVJCT0FSRCwKKyAgICAgICBBSENfQUlDNzg3MF9GRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODcxLCBBSENfQUlDNzg3MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfQklPU19FTkFCTEVELCBBSENfQUlDNzg3MF9GRSwgICAgIDEwLAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODcyLCBBSENfQUlDNzg3MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfQklPU19FTkFCTEVEIHwgQUhDX01VTFRJX0NIQU5ORUwsCisgICAgICAgQUhDX0FJQzc4NzBfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSwKKyAgICAgICAzMiwgQzU2XzY2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDLCBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg3MywgQUhDX0FJQzc4NzAsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19NVUxUSV9DSEFOTkVMLAorICAgICAgIEFIQ19BSUM3ODcwX0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsCisgICAgICAgMzIsIEM1Nl82NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQywgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4NzQsIEFIQ19BSUM3ODcwLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19CSU9TX0VOQUJMRUQsIEFIQ19BSUM3ODcwX0ZFLCAgICAgMTMsCisgICAgICAgMzIsIEM0NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQywgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4ODAsIEFIQ19BSUM3ODgwLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19CSU9TX0VOQUJMRUQgfCBBSENfTU9USEVSQk9BUkQsCisgICAgICAgQUhDX0FJQzc4ODBfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNCwKKyAgICAgICAzMiwgQzQ2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDLCBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg4MSwgQUhDX0FJQzc4ODAsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX0JJT1NfRU5BQkxFRCwgQUhDX0FJQzc4ODBfRkUsICAgICAxNSwKKyAgICAgICAzMiwgQzQ2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDLCBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg4MiwgQUhDX0FJQzc4ODAsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19NVUxUSV9DSEFOTkVMLAorICAgICAgIEFIQ19BSUM3ODgwX0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsCisgICAgICAgMzIsIEM1Nl82NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQywgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4ODMsIEFIQ19BSUM3ODgwLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19CSU9TX0VOQUJMRUQgfCBBSENfTVVMVElfQ0hBTk5FTCwKKyAgICAgICBBSENfQUlDNzg4MF9GRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3LAorICAgICAgIDMyLCBDNTZfNjYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODg0LCBBSENfQUlDNzg4MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfQklPU19FTkFCTEVELCBBSENfQUlDNzg4MF9GRSwgICAgIDE4LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODg1LCBBSENfQUlDNzg4MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfQklPU19FTkFCTEVELCBBSENfQUlDNzg4MF9GRSwgICAgIDE4LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODg2LCBBSENfQUlDNzg4MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfQklPU19FTkFCTEVELCBBSENfQUlDNzg4MF9GRSwgICAgIDE4LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODg3LCBBSENfQUlDNzg4MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfQklPU19FTkFCTEVELCBBSENfQUlDNzg4MF9GRSB8IEFIQ19ORVdfQVVUT1RFUk0sIDE5LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODg4LCBBSENfQUlDNzg4MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfQklPU19FTkFCTEVELCBBSENfQUlDNzg4MF9GRSwgICAgIDE4LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODk1LCBBSENfQUlDNzg5NSwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfTkVXRUVQUk9NX0ZNVCB8IEFIQ19CSU9TX0VOQUJMRUQgfCBBSENfTVVMVElfQ0hBTk5FTCwKKyAgICAgICBBSENfQUlDNzg5NV9GRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwLAorICAgICAgIDMyLCBDNTZfNjYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzc4OTAsIEFIQ19BSUM3ODkwLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCwKKyAgICAgICBBSENfQUlDNzg5MF9GRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxLAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzc4OTBCLCBBSENfQUlDNzg5MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfTkVXRUVQUk9NX0ZNVCB8IEFIQ19CSU9TX0VOQUJMRUQsCisgICAgICAgQUhDX0FJQzc4OTBfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSwKKyAgICAgICAzMiwgQzQ2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgUENJX0RFVklDRV9JRF9BREFQVEVDMl8yOTMwVTIsIEFIQ19BSUM3ODkwLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCwKKyAgICAgICBBSENfQUlDNzg5MF9GRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyLAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzI5NDBVMiwgQUhDX0FJQzc4OTAsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX05FV0VFUFJPTV9GTVQgfCBBSENfQklPU19FTkFCTEVELAorICAgICAgIEFIQ19BSUM3ODkwX0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjMsCisgICAgICAgMzIsIEM0NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfNzg5NiwgQUhDX0FJQzc4OTYsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX05FV0VFUFJPTV9GTVQgfCBBSENfQklPU19FTkFCTEVEIHwgQUhDX01VTFRJX0NIQU5ORUwsCisgICAgICAgQUhDX0FJQzc4OTZfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCwKKyAgICAgICAzMiwgQzU2XzY2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgUENJX0RFVklDRV9JRF9BREFQVEVDMl8zOTQwVTIsIEFIQ19BSUM3ODk2LAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19NVUxUSV9DSEFOTkVMLAorICAgICAgIEFIQ19BSUM3ODk2X0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUsCisgICAgICAgMzIsIEM1Nl82NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfMzk1MFUyRCwgQUhDX0FJQzc4OTYsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX05FV0VFUFJPTV9GTVQgfCBBSENfQklPU19FTkFCTEVEIHwgQUhDX01VTFRJX0NIQU5ORUwsCisgICAgICAgQUhDX0FJQzc4OTZfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKKyAgICAgICAzMiwgQzU2XzY2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDLCBQQ0lfREVWSUNFX0lEX0FEQVBURUNfMTQ4MEEsIEFIQ19BSUM3ODYwLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19OT19TVFBXRU4sCisgICAgICAgQUhDX0FJQzc4NjBfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNywKKyAgICAgICAzMiwgQzQ2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgUENJX0RFVklDRV9JRF9BREFQVEVDMl83ODkyQSwgQUhDX0FJQzc4OTIsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX05FV0VFUFJPTV9GTVQgfCBBSENfQklPU19FTkFCTEVELAorICAgICAgIEFIQ19BSUM3ODkyX0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCisgICAgICAgMzIsIEM0NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfNzg5MkIsIEFIQ19BSUM3ODkyLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCwKKyAgICAgICBBSENfQUlDNzg5Ml9GRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzc4OTJELCBBSENfQUlDNzg5MiwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfTkVXRUVQUk9NX0ZNVCB8IEFIQ19CSU9TX0VOQUJMRUQsCisgICAgICAgQUhDX0FJQzc4OTJfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKKyAgICAgICAzMiwgQzQ2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgUENJX0RFVklDRV9JRF9BREFQVEVDMl83ODkyUCwgQUhDX0FJQzc4OTIsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX05FV0VFUFJPTV9GTVQgfCBBSENfQklPU19FTkFCTEVELAorICAgICAgIEFIQ19BSUM3ODkyX0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCisgICAgICAgMzIsIEM0NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfNzg5OUEsIEFIQ19BSUM3ODk5LAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19NVUxUSV9DSEFOTkVMLAorICAgICAgIEFIQ19BSUM3ODk5X0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCisgICAgICAgMzIsIEM1Nl82NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfNzg5OUIsIEFIQ19BSUM3ODk5LAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19NVUxUSV9DSEFOTkVMLAorICAgICAgIEFIQ19BSUM3ODk5X0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCisgICAgICAgMzIsIEM1Nl82NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfNzg5OUQsIEFIQ19BSUM3ODk5LAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19NVUxUSV9DSEFOTkVMLAorICAgICAgIEFIQ19BSUM3ODk5X0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCisgICAgICAgMzIsIEM1Nl82NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfNzg5OVAsIEFIQ19BSUM3ODk5LAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19NVUxUSV9DSEFOTkVMLAorICAgICAgIEFIQ19BSUM3ODk5X0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCisgICAgICAgMzIsIEM1Nl82NiB9LAorICAgIH07CisKKyAgICB1bnNpZ25lZCBzaG9ydCBjb21tYW5kOworICAgIHVuc2lnbmVkIGludCAgZGV2Y29uZmlnLCBpLCBvbGR2ZXJib3NlOworICAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFpY19wZGV2cyk7IGkrKykKKyAgICB7CisgICAgICBwZGV2ID0gTlVMTDsKKyAgICAgIHdoaWxlICgocGRldiA9IHBjaV9maW5kX2RldmljZShhaWNfcGRldnNbaV0udmVuZG9yX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpY19wZGV2c1tpXS5kZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRldikpKSB7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQljb250aW51ZTsKKyAgICAgICAgaWYgKCBpID09IDAgKSAvKiBXZSBmb3VuZCBvbmUsIGJ1dCBpdCdzIHRoZSA3ODEwIFJBSUQgY29udC4gKi8KKyAgICAgICAgeworICAgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiAoVkVSQk9TRV9QUk9CRXxWRVJCT1NFX1BST0JFMikpCisgICAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiYWljN3h4eDogVGhlIDc4MTAgUkFJRCBjb250cm9sbGVyIGlzIG5vdCAiCisgICAgICAgICAgICAgICJzdXBwb3J0ZWQgYnlcbiIpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICAgdGhpcyBkcml2ZXIsIHdlIGFyZSBpZ25vcmluZyBpdC5cbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggKHRlbXBfcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhaWM3eHh4X2hvc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0FUT01JQykpICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgbWVtc2V0KHRlbXBfcCwgMCwgc2l6ZW9mKHN0cnVjdCBhaWM3eHh4X2hvc3QpKTsKKyAgICAgICAgICB0ZW1wX3AtPmNoaXAgPSBhaWNfcGRldnNbaV0uY2hpcCB8IEFIQ19QQ0k7CisgICAgICAgICAgdGVtcF9wLT5mbGFncyA9IGFpY19wZGV2c1tpXS5mbGFnczsKKyAgICAgICAgICB0ZW1wX3AtPmZlYXR1cmVzID0gYWljX3BkZXZzW2ldLmZlYXR1cmVzOworICAgICAgICAgIHRlbXBfcC0+Ym9hcmRfbmFtZV9pbmRleCA9IGFpY19wZGV2c1tpXS5ib2FyZF9uYW1lX2luZGV4OworICAgICAgICAgIHRlbXBfcC0+c2Nfc2l6ZSA9IGFpY19wZGV2c1tpXS5zZWVwcm9tX3NpemU7CisgICAgICAgICAgdGVtcF9wLT5zY190eXBlID0gYWljX3BkZXZzW2ldLnNlZXByb21fdHlwZTsKKworICAgICAgICAgIC8qCisgICAgICAgICAgICogUmVhZCBzdW5kcnkgaW5mb3JtYXRpb24gZnJvbSBQQ0kgQklPUy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICB0ZW1wX3AtPmlycSA9IHBkZXYtPmlycTsKKyAgICAgICAgICB0ZW1wX3AtPnBkZXYgPSBwZGV2OworICAgICAgICAgIHRlbXBfcC0+cGNpX2J1cyA9IHBkZXYtPmJ1cy0+bnVtYmVyOworICAgICAgICAgIHRlbXBfcC0+cGNpX2RldmljZV9mbiA9IHBkZXYtPmRldmZuOworICAgICAgICAgIHRlbXBfcC0+YmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKyAgICAgICAgICB0ZW1wX3AtPm1iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOworICAgICAgICAgIGN1cnJlbnRfcCA9IGxpc3RfcDsKKwkgIHdoaWxlKGN1cnJlbnRfcCAmJiB0ZW1wX3ApCisJICB7CisJICAgIGlmICggKChjdXJyZW50X3AtPnBjaV9idXMgPT0gdGVtcF9wLT5wY2lfYnVzKSAmJgorCSAgICAgICAgICAoY3VycmVudF9wLT5wY2lfZGV2aWNlX2ZuID09IHRlbXBfcC0+cGNpX2RldmljZV9mbikpIHx8CisgICAgICAgICAgICAgICAgICh0ZW1wX3AtPmJhc2UgJiYgKGN1cnJlbnRfcC0+YmFzZSA9PSB0ZW1wX3AtPmJhc2UpKSB8fAorICAgICAgICAgICAgICAgICAodGVtcF9wLT5tYmFzZSAmJiAoY3VycmVudF9wLT5tYmFzZSA9PSB0ZW1wX3AtPm1iYXNlKSkgKQorCSAgICB7CisgICAgICAgICAgICAgIC8qIGR1cGxpY2F0ZSBQQ0kgZW50cnksIHNraXAgaXQgKi8KKwkgICAgICBrZnJlZSh0ZW1wX3ApOworCSAgICAgIHRlbXBfcCA9IE5VTEw7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICAgIGN1cnJlbnRfcCA9IGN1cnJlbnRfcC0+bmV4dDsKKwkgIH0KKyAgICAgICAgICBpZihwY2lfcmVxdWVzdF9yZWdpb25zKHRlbXBfcC0+cGRldiwgImFpYzd4eHgiKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoImFpYzd4eHg6IDwlcz4gYXQgUENJICVkLyVkLyVkXG4iLCAKKyAgICAgICAgICAgICAgYm9hcmRfbmFtZXNbYWljX3BkZXZzW2ldLmJvYXJkX25hbWVfaW5kZXhdLAorICAgICAgICAgICAgICB0ZW1wX3AtPnBjaV9idXMsCisgICAgICAgICAgICAgIFBDSV9TTE9UKHRlbXBfcC0+cGNpX2RldmljZV9mbiksCisgICAgICAgICAgICAgIFBDSV9GVU5DKHRlbXBfcC0+cGNpX2RldmljZV9mbikpOworICAgICAgICAgICAgcHJpbnRrKCJhaWM3eHh4OiBJL08gcG9ydHMgYWxyZWFkeSBpbiB1c2UsIGlnbm9yaW5nLlxuIik7CisgICAgICAgICAgICBrZnJlZSh0ZW1wX3ApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICAgICAgcHJpbnRrKCJhaWM3eHh4OiA8JXM+IGF0IFBDSSAlZC8lZFxuIiwgCisgICAgICAgICAgICAgIGJvYXJkX25hbWVzW2FpY19wZGV2c1tpXS5ib2FyZF9uYW1lX2luZGV4XSwKKyAgICAgICAgICAgICAgUENJX1NMT1QocGRldi0+ZGV2Zm4pLAorICAgICAgICAgICAgICBQQ0lfRlVOQyhwZGV2LT5kZXZmbikpOworICAgICAgICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7CisgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiYWljN3h4eDogSW5pdGlhbCBQQ0lfQ09NTUFORCB2YWx1ZSB3YXMgMHgleFxuIiwKKyAgICAgICAgICAgICAgKGludCljb21tYW5kKTsKKyAgICAgICAgICB9CisjaWZkZWYgQUlDN1hYWF9TVFJJQ1RfUENJX1NFVFVQCisgICAgICAgICAgY29tbWFuZCB8PSBQQ0lfQ09NTUFORF9TRVJSIHwgUENJX0NPTU1BTkRfUEFSSVRZIHwKKyAgICAgICAgICAgIFBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX0lPOworI2Vsc2UKKyAgICAgICAgICBjb21tYW5kIHw9IFBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX0lPOworI2VuZGlmCisgICAgICAgICAgY29tbWFuZCAmPSB+UENJX0NPTU1BTkRfSU5WQUxJREFURTsKKyAgICAgICAgICBpZiAoYWljN3h4eF9wY2lfcGFyaXR5ID09IDApCisgICAgICAgICAgICBjb21tYW5kICY9IH4oUENJX0NPTU1BTkRfU0VSUiB8IFBDSV9DT01NQU5EX1BBUklUWSk7CisgICAgICAgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBjb21tYW5kKTsKKyNpZmRlZiBBSUM3WFhYX1NUUklDVF9QQ0lfU0VUVVAKKyAgICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgREVWQ09ORklHLCAmZGV2Y29uZmlnKTsKKyAgICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJhaWM3eHh4OiBJbml0aWFsIERFVkNPTkZJRyB2YWx1ZSB3YXMgMHgleFxuIiwgZGV2Y29uZmlnKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGV2Y29uZmlnIHw9IDB4ODAwMDAwNDA7CisgICAgICAgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBERVZDT05GSUcsIGRldmNvbmZpZyk7CisjZW5kaWYgLyogQUlDN1hYWF9TVFJJQ1RfUENJX1NFVFVQICovCisKKyAgICAgICAgICB0ZW1wX3AtPnVucGF1c2UgPSBJTlRFTjsKKyAgICAgICAgICB0ZW1wX3AtPnBhdXNlID0gdGVtcF9wLT51bnBhdXNlIHwgUEFVU0U7CisgICAgICAgICAgaWYgKCAoKHRlbXBfcC0+YmFzZSA9PSAwKSAmJgorICAgICAgICAgICAgICAgICh0ZW1wX3AtPm1iYXNlID09IDApKSB8fAorICAgICAgICAgICAgICAgKHRlbXBfcC0+aXJxID09IDApICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoImFpYzd4eHg6IDwlcz4gYXQgUENJICVkLyVkLyVkXG4iLCAKKyAgICAgICAgICAgICAgYm9hcmRfbmFtZXNbYWljX3BkZXZzW2ldLmJvYXJkX25hbWVfaW5kZXhdLAorICAgICAgICAgICAgICB0ZW1wX3AtPnBjaV9idXMsCisgICAgICAgICAgICAgIFBDSV9TTE9UKHRlbXBfcC0+cGNpX2RldmljZV9mbiksCisgICAgICAgICAgICAgIFBDSV9GVU5DKHRlbXBfcC0+cGNpX2RldmljZV9mbikpOworICAgICAgICAgICAgcHJpbnRrKCJhaWM3eHh4OiBDb250cm9sbGVyIGRpc2FibGVkIGJ5IEJJT1MsIGlnbm9yaW5nLlxuIik7CisgICAgICAgICAgICBnb3RvIHNraXBfcGNpX2NvbnRyb2xsZXI7CisgICAgICAgICAgfQorCisjaWZkZWYgTU1BUElPCisgICAgICAgICAgaWYgKCAhKHRlbXBfcC0+YmFzZSkgfHwgISh0ZW1wX3AtPmZsYWdzICYgQUhDX01VTFRJX0NIQU5ORUwpIHx8CisgICAgICAgICAgICAgICAoKHRlbXBfcC0+Y2hpcCAhPSAoQUhDX0FJQzc4NzAgfCBBSENfUENJKSkgJiYKKyAgICAgICAgICAgICAgICAodGVtcF9wLT5jaGlwICE9IChBSENfQUlDNzg4MCB8IEFIQ19QQ0kpKSkgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXBfcC0+bWFkZHIgPSBpb3JlbWFwX25vY2FjaGUodGVtcF9wLT5tYmFzZSwgMjU2KTsKKyAgICAgICAgICAgIGlmKHRlbXBfcC0+bWFkZHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAqIFdlIG5lZWQgdG8gY2hlY2sgdGhlIEkvTyB3aXRoIHRoZSBNTUFQZWQgYWRkcmVzcy4gIFNvbWUgbWFjaGluZXMKKyAgICAgICAgICAgICAgICogc2ltcGx5IGZhaWwgdG8gd29yayB3aXRoIE1NQVBlZCBJL08gYW5kIGNlcnRhaW4gY29udHJvbGxlcnMuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBpZihhaWNfaW5iKHRlbXBfcCwgSENOVFJMKSA9PSAweGZmKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBPSy4uLi4ud2UgZmFpbGVkIG91ciB0ZXN0Li4uLmdvIGJhY2sgdG8gcHJvZ3JhbW1lZCBJL08KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJhaWM3eHh4OiA8JXM+IGF0IFBDSSAlZC8lZC8lZFxuIiwgCisgICAgICAgICAgICAgICAgICBib2FyZF9uYW1lc1thaWNfcGRldnNbaV0uYm9hcmRfbmFtZV9pbmRleF0sCisgICAgICAgICAgICAgICAgICB0ZW1wX3AtPnBjaV9idXMsCisgICAgICAgICAgICAgICAgICBQQ0lfU0xPVCh0ZW1wX3AtPnBjaV9kZXZpY2VfZm4pLAorICAgICAgICAgICAgICAgICAgUENJX0ZVTkModGVtcF9wLT5wY2lfZGV2aWNlX2ZuKSk7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiYWljN3h4eDogTU1BUGVkIEkvTyBmYWlsZWQsIHJldmVydGluZyB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZ3JhbW1lZCBJL08uXG4iKTsKKyAgICAgICAgICAgICAgICBpb3VubWFwKHRlbXBfcC0+bWFkZHIpOworICAgICAgICAgICAgICAgIHRlbXBfcC0+bWFkZHIgPSBOVUxMOworICAgICAgICAgICAgICAgIGlmKHRlbXBfcC0+YmFzZSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHByaW50aygiYWljN3h4eDogPCVzPiBhdCBQQ0kgJWQvJWQvJWRcbiIsIAorICAgICAgICAgICAgICAgICAgICBib2FyZF9uYW1lc1thaWNfcGRldnNbaV0uYm9hcmRfbmFtZV9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgIHRlbXBfcC0+cGNpX2J1cywKKyAgICAgICAgICAgICAgICAgICAgUENJX1NMT1QodGVtcF9wLT5wY2lfZGV2aWNlX2ZuKSwKKyAgICAgICAgICAgICAgICAgICAgUENJX0ZVTkModGVtcF9wLT5wY2lfZGV2aWNlX2ZuKSk7CisgICAgICAgICAgICAgICAgICBwcmludGsoImFpYzd4eHg6IENvbnRyb2xsZXIgZGlzYWJsZWQgYnkgQklPUywgaWdub3JpbmcuXG4iKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcF9wY2lfY29udHJvbGxlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgIC8qCisgICAgICAgICAgICogV2UgSEFWRSB0byBtYWtlIHN1cmUgdGhlIGZpcnN0IHBhdXNlX3NlcXVlbmNlcigpIGFuZCBhbGwgb3RoZXIKKyAgICAgICAgICAgKiBzdWJzZXF1ZW50IEkvTyB0aGF0IGlzbid0IFBDSSBjb25maWcgc3BhY2UgSS9PIHRha2VzIHBsYWNlCisgICAgICAgICAgICogYWZ0ZXIgdGhlIE1NQVBlZCBJL08gcmVnaW9uIGlzIGNvbmZpZ3VyZWQgYW5kIHRlc3RlZC4gIFRoZQorICAgICAgICAgICAqIHByb2JsZW0gaXMgdGhlIFBvd2VyUEMgYXJjaGl0ZWN0dXJlIHRoYXQgZG9lc24ndCBzdXBwb3J0CisgICAgICAgICAgICogcHJvZ3JhbW1lZCBJL08gYXQgYWxsLCBzbyB3ZSBoYXZlIHRvIGhhdmUgdGhlIE1NQVAgSS9PIHNldCB1cAorICAgICAgICAgICAqIGZvciB0aGlzIHBhdXNlIHRvIGV2ZW4gd29yayBvbiB0aG9zZSBtYWNoaW5lcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBwYXVzZV9zZXF1ZW5jZXIodGVtcF9wKTsKKworICAgICAgICAgIC8qCisgICAgICAgICAgICogQ2xlYXIgb3V0IGFueSBwZW5kaW5nIFBDSSBlcnJvciBzdGF0dXMgbWVzc2FnZXMuICBBbHNvIHNldAorICAgICAgICAgICAqIHZlcmJvc2UgdG8gMCBzbyB0aGF0IHdlIGRvbid0IGVtaXQgc3RyYW5nZSBQQ0kgZXJyb3IgbWVzc2FnZXMKKyAgICAgICAgICAgKiB3aGlsZSBjbGVhbmluZyBvdXQgdGhlIGN1cnJlbnQgc3RhdHVzIGJpdHMuCisgICAgICAgICAgICovCisgICAgICAgICAgb2xkdmVyYm9zZSA9IGFpYzd4eHhfdmVyYm9zZTsKKyAgICAgICAgICBhaWM3eHh4X3ZlcmJvc2UgPSAwOworICAgICAgICAgIGFpYzd4eHhfcGNpX2ludHIodGVtcF9wKTsKKyAgICAgICAgICBhaWM3eHh4X3ZlcmJvc2UgPSBvbGR2ZXJib3NlOworCisgICAgICAgICAgdGVtcF9wLT5iaW9zX2FkZHJlc3MgPSAwOworCisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBSZW1lbWJlciBob3cgdGhlIGNhcmQgd2FzIHNldHVwIGluIGNhc2UgdGhlcmUgaXMgbm8gc2VlcHJvbS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAodGVtcF9wLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgICAgICAgICAgICB0ZW1wX3AtPnNjc2lfaWQgPSBhaWNfaW5iKHRlbXBfcCwgU0NTSUlEX1VMVFJBMikgJiBPSUQ7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdGVtcF9wLT5zY3NpX2lkID0gYWljX2luYih0ZW1wX3AsIFNDU0lJRCkgJiBPSUQ7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBHZXQgY3VycmVudCB0ZXJtaW5hdGlvbiBzZXR0aW5nCisgICAgICAgICAgICovCisgICAgICAgICAgc3hmcmN0bDEgPSBhaWNfaW5iKHRlbXBfcCwgU1hGUkNUTDEpOworCisgICAgICAgICAgaWYgKGFpYzd4eHhfY2hpcF9yZXNldCh0ZW1wX3ApID09IC0xKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gc2tpcF9wY2lfY29udHJvbGxlcjsKKyAgICAgICAgICB9CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBWZXJ5IHF1aWNrbHkgcHV0IHRoZSB0ZXJtIHNldHRpbmcgYmFjayBpbnRvIHRoZSByZWdpc3RlciBzaW5jZQorICAgICAgICAgICAqIHRoZSBjaGlwIHJlc2V0IG1heSBjYXVzZSBvZGQgdGhpbmdzIHRvIGhhcHBlbi4gIFRoaXMgaXMgdG8ga2VlcAorICAgICAgICAgICAqIExWRCBidXNzZXMgd2l0aCBsb3RzIG9mIGRyaXZlcyBmcm9tIGRyYWluaW5nIHRoZSBwb3dlciBvdXQgb2YKKyAgICAgICAgICAgKiB0aGUgZGlmZnNlbnNlIGxpbmUgYmVmb3JlIHdlIGdldCBhcm91bmQgdG8gcnVubmluZyB0aGUKKyAgICAgICAgICAgKiBjb25maWd1cmVfdGVybWluYXRpb24oKSBmdW5jdGlvbi4gIEFsc28gcmVzdG9yZSB0aGUgU1RQV0xFVkVMCisgICAgICAgICAgICogYml0IG9mIERFVkNPTkZJRworICAgICAgICAgICAqLworICAgICAgICAgIGFpY19vdXRiKHRlbXBfcCwgc3hmcmN0bDEsIFNYRlJDVEwxKTsKKyAgICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRlbXBfcC0+cGRldiwgREVWQ09ORklHLCBkZXZjb25maWcpOworICAgICAgICAgIHN4ZnJjdGwxICY9IFNUUFdFTjsKKworICAgICAgICAgIC8qCisgICAgICAgICAgICogV2UgbmVlZCB0byBzZXQgdGhlIENITkw/IGFzc2lnbm1lbnRzIGJlZm9yZSBsb2FkaW5nIHRoZSBTRUVQUk9NCisgICAgICAgICAgICogVGhlIDM5NDAgYW5kIDM5ODUgY2FyZHMgKG9yaWdpbmFsIHN0dWZmLCBub3QgYW55IG9mIHRoZSBsYXRlcgorICAgICAgICAgICAqIHN0dWZmKSBhcmUgNzg3MCBhbmQgNzg4MCBjbGFzcyBjaGlwcy4gIFRoZSBVbHRyYTIgc3R1ZmYgZmFsbHMKKyAgICAgICAgICAgKiB1bmRlciA3ODk2IGFuZCA3ODk3LiAgVGhlIDc4OTUgaXMgaW4gYSBjbGFzcyBieSBpdHNlbGYgOikKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBzd2l0Y2ggKHRlbXBfcC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykKKyAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEFIQ19BSUM3ODcwOiAvKiAzODQwIC8gMzk4NSAqLworICAgICAgICAgICAgY2FzZSBBSENfQUlDNzg4MDogLyogMzg0MCBVVyAvIDM5ODUgVVcgKi8KKyAgICAgICAgICAgICAgaWYodGVtcF9wLT5mbGFncyAmIEFIQ19NVUxUSV9DSEFOTkVMKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoKFBDSV9TTE9UKHRlbXBfcC0+cGNpX2RldmljZV9mbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICB0ZW1wX3AtPmZsYWdzIHw9IEFIQ19DSE5MQjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgIHRlbXBfcC0+ZmxhZ3MgfD0gQUhDX0NITkxCOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgIHRlbXBfcC0+ZmxhZ3MgfD0gQUhDX0NITkxDOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBSENfQUlDNzg5NTogLyogNzg5NSAqLworICAgICAgICAgICAgY2FzZSBBSENfQUlDNzg5NjogLyogNzg5Ni83ICovCisgICAgICAgICAgICBjYXNlIEFIQ19BSUM3ODk5OiAvKiA3ODk5ICovCisgICAgICAgICAgICAgIGlmIChQQ0lfRlVOQyhwZGV2LT5kZXZmbikgIT0gMCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXBfcC0+ZmxhZ3MgfD0gQUhDX0NITkxCOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAqIFRoZSA3ODk1IGlzIHRoZSBvbmx5IGNoaXBzZXQgdGhhdCBzZXRzIHRoZSBTQ0JTSVpFMzIgcGFyYW0KKyAgICAgICAgICAgICAgICogaW4gdGhlIERFVkNPTkZJRyByZWdpc3Rlci4gIFRoZSBVbHRyYTIgY2hpcHNldHMgdXNlCisgICAgICAgICAgICAgICAqIHRoZSBEU0NPTU1BTkQwIHJlZ2lzdGVyIGluc3RlYWQuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBpZiAoKHRlbXBfcC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykgPT0gQUhDX0FJQzc4OTUpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgREVWQ09ORklHLCAmZGV2Y29uZmlnKTsKKyAgICAgICAgICAgICAgICBkZXZjb25maWcgfD0gU0NCU0laRTMyOworICAgICAgICAgICAgICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgREVWQ09ORklHLCBkZXZjb25maWcpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBMb2FkaW5nIG9mIHRoZSBTRUVQUk9NIG5lZWRzIHRvIGNvbWUgYWZ0ZXIgd2UndmUgc2V0IHRoZSBmbGFncworICAgICAgICAgICAqIHRvIGluZGljYXRlIHBvc3NpYmxlIENITkxCIGFuZCBDSE5MQyBhc3NpZ21lbnRzLiAgT3RoZXJ3aXNlLAorICAgICAgICAgICAqIG9uIDM5NHggYW5kIDM5OHggY2FyZHMgd2UnbGwgZW5kIHVwIHJlYWRpbmcgdGhlIHdyb25nIHNldHRpbmdzCisgICAgICAgICAgICogZm9yIGNoYW5uZWxzIEIgYW5kIEMKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBzd2l0Y2ggKHRlbXBfcC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykKKyAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEFIQ19BSUM3ODkyOgorICAgICAgICAgICAgY2FzZSBBSENfQUlDNzg5OToKKyAgICAgICAgICAgICAgYWljX291dGIodGVtcF9wLCAwLCBTQ0FNQ1RMKTsKKyAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICogU3dpdGNoIHRvIHRoZSBhbHQgbW9kZSBvZiB0aGUgY2hpcC4uLgorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgYWljX291dGIodGVtcF9wLCBhaWNfaW5iKHRlbXBfcCwgU0ZVTkNUKSB8IEFMVF9NT0RFLCBTRlVOQ1QpOworICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgKiBTZXQgb3VyIG9wdGlvbnMuLi50aGUgbGFzdCB0d28gaXRlbXMgc2V0IG91ciBDUkMgYWZ0ZXIgeCBieXRlCisJICAgICAgICogY291bnQgaW4gdGFyZ2V0IG1vZGUuLi4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIGFpY19vdXRiKHRlbXBfcCwgQVVUT19NU0dPVVRfREUgfCBESVNfTVNHSU5fRFVBTEVER0UsIE9QVElPTk1PREUpOworCSAgICAgIGFpY19vdXRiKHRlbXBfcCwgMHgwMCwgMHgwYik7CisJICAgICAgYWljX291dGIodGVtcF9wLCAweDEwLCAweDBhKTsKKyAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICogc3dpdGNoIGJhY2sgdG8gbm9ybWFsIG1vZGUuLi4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIGFpY19vdXRiKHRlbXBfcCwgYWljX2luYih0ZW1wX3AsIFNGVU5DVCkgJiB+QUxUX01PREUsIFNGVU5DVCk7CisgICAgICAgICAgICAgIGFpY19vdXRiKHRlbXBfcCwgQ1JDVkFMQ0hLRU4gfCBDUkNFTkRDSEtFTiB8IENSQ1JFUUNIS0VOIHwKKwkJCSAgICAgICBUQVJHQ1JDRU5ERU4gfCBUQVJHQ1JDQ05URU4sCisgICAgICAgICAgICAgICAgICAgICAgIENSQ0NPTlRST0wxKTsKKyAgICAgICAgICAgICAgYWljX291dGIodGVtcF9wLCAoKGFpY19pbmIodGVtcF9wLCBEU0NPTU1BTkQwKSB8IFVTQ0JTSVpFMzIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBBUkNLRU4gfCBDSU9QQVJDS0VOIHwgQ0FDSEVUSEVOKSAmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5EUEFSQ0tFTiksIERTQ09NTUFORDApOworICAgICAgICAgICAgICBhaWM3eHh4X2xvYWRfc2VlcHJvbSh0ZW1wX3AsICZzeGZyY3RsMSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBSENfQUlDNzg5MDoKKyAgICAgICAgICAgIGNhc2UgQUhDX0FJQzc4OTY6CisgICAgICAgICAgICAgIGFpY19vdXRiKHRlbXBfcCwgMCwgU0NBTUNUTCk7CisgICAgICAgICAgICAgIGFpY19vdXRiKHRlbXBfcCwgKGFpY19pbmIodGVtcF9wLCBEU0NPTU1BTkQwKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBQ0hFVEhFTiB8IE1QQVJDS0VOIHwgVVNDQlNJWkUzMiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJT1BBUkNLRU4pICYgfkRQQVJDS0VOLCBEU0NPTU1BTkQwKTsKKyAgICAgICAgICAgICAgYWljN3h4eF9sb2FkX3NlZXByb20odGVtcF9wLCAmc3hmcmN0bDEpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUhDX0FJQzc4NTA6CisgICAgICAgICAgICBjYXNlIEFIQ19BSUM3ODYwOgorICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgKiBTZXQgdGhlIERTQ09NTUFORDAgcmVnaXN0ZXIgb24gdGhlc2UgY2FyZHMgZGlmZmVyZW50IGZyb20KKyAgICAgICAgICAgICAgICogb24gdGhlIDc4OXggY2FyZHMuICBBbHNvLCByZWFkIHRoZSBTRUVQUk9NIGFzIHdlbGwuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBhaWNfb3V0Yih0ZW1wX3AsIChhaWNfaW5iKHRlbXBfcCwgRFNDT01NQU5EMCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRVRIRU4gfCBNUEFSQ0tFTikgJiB+RFBBUkNLRU4sCisgICAgICAgICAgICAgICAgICAgICAgIERTQ09NTUFORDApOworICAgICAgICAgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgYWljN3h4eF9sb2FkX3NlZXByb20odGVtcF9wLCAmc3hmcmN0bDEpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUhDX0FJQzc4ODA6CisgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAqIENoZWNrIHRoZSByZXYgb2YgdGhlIGNoaXBzZXQgYmVmb3JlIHdlIGNoYW5nZSBEU0NPTU1BTkQwCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgREVWQ09ORklHLCAmZGV2Y29uZmlnKTsKKyAgICAgICAgICAgICAgaWYgKChkZXZjb25maWcgJiAweGZmKSA+PSAxKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWljX291dGIodGVtcF9wLCAoYWljX2luYih0ZW1wX3AsIERTQ09NTUFORDApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRVRIRU4gfCBNUEFSQ0tFTikgJiB+RFBBUkNLRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgRFNDT01NQU5EMCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYWljN3h4eF9sb2FkX3NlZXByb20odGVtcF9wLCAmc3hmcmN0bDEpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgCisKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIGFuZCB0aGVuIHdlIG5lZWQgYW5vdGhlciBzd2l0Y2ggYmFzZWQgb24gdGhlIHR5cGUgaW4gb3JkZXIgdG8KKyAgICAgICAgICAgKiBtYWtlIHN1cmUgdGhlIGNoYW5uZWwgQiBwcmltYXJ5IGZsYWcgaXMgc2V0IHByb3Blcmx5IG9uIDc4OTUKKyAgICAgICAgICAgKiBjb250cm9sbGVycy4uLi5BcnJyZ2dnZ2hoaCEhISAgV2UgYWxzbyBoYXZlIHRvIGNhdGNoIHRoZSBmYWN0CisgICAgICAgICAgICogdGhhdCB3aGVuIHlvdSBkaXNhYmxlIHRoZSBCSU9TIG9uIHRoZSA3ODk1IG9uIHRoZSBJbnRlbCBESzQ0MExYCisgICAgICAgICAgICogbW90aGVyYm9hcmQsIGFuZCBwb3NzaWJseSBvdGhlcnMsIGl0IG9ubHkgc2V0cyB0aGUgQklPUyBkaXNhYmxlZAorICAgICAgICAgICAqIGJpdCBvbiB0aGUgQSBjaGFubmVsLi4uSSB0aGluayBJJ20gc3RhcnRpbmcgdG8gbGVhbiB0b3dhcmRzCisgICAgICAgICAgICogZ29pbmcgcG9zdGFsLi4uLgorICAgICAgICAgICAqLworICAgICAgICAgIHN3aXRjaCh0ZW1wX3AtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spCisgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBBSENfQUlDNzg5NToKKyAgICAgICAgICAgIGNhc2UgQUhDX0FJQzc4OTY6CisgICAgICAgICAgICBjYXNlIEFIQ19BSUM3ODk5OgorICAgICAgICAgICAgICBjdXJyZW50X3AgPSBsaXN0X3A7CisgICAgICAgICAgICAgIHdoaWxlKGN1cnJlbnRfcCAhPSBOVUxMKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCAoY3VycmVudF9wLT5wY2lfYnVzID09IHRlbXBfcC0+cGNpX2J1cykgJiYKKyAgICAgICAgICAgICAgICAgICAgIChQQ0lfU0xPVChjdXJyZW50X3AtPnBjaV9kZXZpY2VfZm4pID09CisgICAgICAgICAgICAgICAgICAgICAgUENJX1NMT1QodGVtcF9wLT5wY2lfZGV2aWNlX2ZuKSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICggUENJX0ZVTkMoY3VycmVudF9wLT5wY2lfZGV2aWNlX2ZuKSA9PSAwICkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcF9wLT5mbGFncyB8PSAKKyAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudF9wLT5mbGFncyAmIEFIQ19DSEFOTkVMX0JfUFJJTUFSWSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBfcC0+ZmxhZ3MgJj0gfihBSENfQklPU19FTkFCTEVEfEFIQ19VU0VERUZBVUxUUyk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBfcC0+ZmxhZ3MgfD0KKyAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudF9wLT5mbGFncyAmIChBSENfQklPU19FTkFCTEVEfEFIQ19VU0VERUZBVUxUUykpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3AtPmZsYWdzIHw9CisgICAgICAgICAgICAgICAgICAgICAgKHRlbXBfcC0+ZmxhZ3MgJiBBSENfQ0hBTk5FTF9CX1BSSU1BUlkpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3AtPmZsYWdzICY9IH4oQUhDX0JJT1NfRU5BQkxFRHxBSENfVVNFREVGQVVMVFMpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3AtPmZsYWdzIHw9CisgICAgICAgICAgICAgICAgICAgICAgKHRlbXBfcC0+ZmxhZ3MgJiAoQUhDX0JJT1NfRU5BQkxFRHxBSENfVVNFREVGQVVMVFMpKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VycmVudF9wID0gY3VycmVudF9wLT5uZXh0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBXZSBvbmx5IHN1cHBvcnQgZXh0ZXJuYWwgU0NCIFJBTSBvbiB0aGUgNzg5NS82LzcgY2hpcHNldHMuCisgICAgICAgICAgICogV2UgY291bGQgc3VwcG9ydCBpdCBvbiB0aGUgNzg5MC8xIGVhc3kgZW5vdWdoLCBidXQgSSBkb24ndAorICAgICAgICAgICAqIGtub3cgb2YgYW55IDc4OTAvMSBiYXNlZCBjYXJkcyB0aGF0IGhhdmUgaXQuICBJIGRvIGtub3cKKyAgICAgICAgICAgKiBvZiA3ODk1LzYvNyBjYXJkcyB0aGF0IGhhdmUgaXQgYW5kIHRoZXkgd29yayBwcm9wZXJseS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBzd2l0Y2godGVtcF9wLT5jaGlwICYgQUhDX0NISVBJRF9NQVNLKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBSENfQUlDNzg5NToKKyAgICAgICAgICAgIGNhc2UgQUhDX0FJQzc4OTY6CisgICAgICAgICAgICBjYXNlIEFIQ19BSUM3ODk5OgorICAgICAgICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgREVWQ09ORklHLCAmZGV2Y29uZmlnKTsKKyAgICAgICAgICAgICAgaWYgKHRlbXBfcC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCAoYWljX2luYih0ZW1wX3AsIERTQ09NTUFORDApICYgUkFNUFNNX1VMVFJBMikgJiYKKyAgICAgICAgICAgICAgICAgICAgIChhaWM3eHh4X3NjYnJhbSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGFpY19vdXRiKHRlbXBfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpY19pbmIodGVtcF9wLCBEU0NPTU1BTkQwKSAmIH5TQ0JSQU1TRUxfVUxUUkEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNDT01NQU5EMCk7CisgICAgICAgICAgICAgICAgICB0ZW1wX3AtPmZsYWdzIHw9IEFIQ19FWFRFUk5BTF9TUkFNOworICAgICAgICAgICAgICAgICAgZGV2Y29uZmlnIHw9IEVYVFNDQlBFTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWljX2luYih0ZW1wX3AsIERTQ09NTUFORDApICYgUkFNUFNNX1VMVFJBMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJhaWM3eHh4OiA8JXM+IGF0IFBDSSAlZC8lZC8lZFxuIiwgCisgICAgICAgICAgICAgICAgICAgIGJvYXJkX25hbWVzW2FpY19wZGV2c1tpXS5ib2FyZF9uYW1lX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgdGVtcF9wLT5wY2lfYnVzLAorICAgICAgICAgICAgICAgICAgICBQQ0lfU0xPVCh0ZW1wX3AtPnBjaV9kZXZpY2VfZm4pLAorICAgICAgICAgICAgICAgICAgICBQQ0lfRlVOQyh0ZW1wX3AtPnBjaV9kZXZpY2VfZm4pKTsKKyAgICAgICAgICAgICAgICAgIHByaW50aygiYWljN3h4eDogZXh0ZXJuYWwgU0NCIFJBTSBkZXRlY3RlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgbm90IGVuYWJsZWRcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGRldmNvbmZpZyAmIFJBTVBTTSkgJiYgKGFpYzd4eHhfc2NicmFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkZXZjb25maWcgJj0gflNDQlJBTVNFTDsKKyAgICAgICAgICAgICAgICAgIGRldmNvbmZpZyB8PSBFWFRTQ0JQRU47CisgICAgICAgICAgICAgICAgICB0ZW1wX3AtPmZsYWdzIHw9IEFIQ19FWFRFUk5BTF9TUkFNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXZjb25maWcgJiBSQU1QU00pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiYWljN3h4eDogPCVzPiBhdCBQQ0kgJWQvJWQvJWRcbiIsIAorICAgICAgICAgICAgICAgICAgICBib2FyZF9uYW1lc1thaWNfcGRldnNbaV0uYm9hcmRfbmFtZV9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgIHRlbXBfcC0+cGNpX2J1cywKKyAgICAgICAgICAgICAgICAgICAgUENJX1NMT1QodGVtcF9wLT5wY2lfZGV2aWNlX2ZuKSwKKyAgICAgICAgICAgICAgICAgICAgUENJX0ZVTkModGVtcF9wLT5wY2lfZGV2aWNlX2ZuKSk7CisgICAgICAgICAgICAgICAgICBwcmludGsoImFpYzd4eHg6IGV4dGVybmFsIFNDQiBSQU0gZGV0ZWN0ZWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IG5vdCBlbmFibGVkXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBERVZDT05GSUcsIGRldmNvbmZpZyk7CisgICAgICAgICAgICAgIGlmICggKHRlbXBfcC0+ZmxhZ3MgJiBBSENfRVhURVJOQUxfU1JBTSkgJiYKKyAgICAgICAgICAgICAgICAgICAodGVtcF9wLT5mbGFncyAmIEFIQ19DSE5MQikgKQorICAgICAgICAgICAgICAgIGFpY19vdXRiKHRlbXBfcCwgMSwgQ0NTQ0JCQUREUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qCisgICAgICAgICAgICogVGFrZSB0aGUgTEVEIG91dCBvZiBkaWFnbm9zdGljIG1vZGUKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBhaWNfb3V0Yih0ZW1wX3AsIAorICAgICAgICAgICAgKGFpY19pbmIodGVtcF9wLCBTQkxLQ1RMKSAmIH4oRElBR0xFREVOIHwgRElBR0xFRE9OKSksCisgICAgICAgICAgICBTQkxLQ1RMKTsKKworICAgICAgICAgIC8qCisgICAgICAgICAgICogV2UgZG9uJ3Qga25vdyB3aGVyZSB0aGlzIGlzIHNldCBpbiB0aGUgU0VFUFJPTSBvciBieSB0aGUKKyAgICAgICAgICAgKiBCSU9TLCBzbyB3ZSBkZWZhdWx0IHRvIDEwMCUuICBPbiBVbHRyYTIgY29udHJvbGxlcnMsIHVzZSA3NSUKKyAgICAgICAgICAgKiBpbnN0ZWFkLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmICh0ZW1wX3AtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikKKyAgICAgICAgICB7CisgICAgICAgICAgICBhaWNfb3V0Yih0ZW1wX3AsIFJEX0RGVEhSU0hfTUFYIHwgV1JfREZUSFJTSF9NQVgsIERGRl9USFJTSCk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBhaWNfb3V0Yih0ZW1wX3AsIERGVEhSU0hfMTAwLCBEU1BDSVNUQVRVUyk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBDYWxsIG91ciBmdW5jdGlvbiB0byBmaXh1cCBhbnkgYnVncyB0aGF0IGV4aXN0IG9uIHRoaXMgY2hpcHNldC4KKyAgICAgICAgICAgKiBUaGlzIG1heSBtdWNrIHdpdGggUENJIHNldHRpbmdzIGFuZCBvdGhlciBkZXZpY2Ugc2V0dGluZ3MsIHNvCisgICAgICAgICAgICogbWFrZSBzdXJlIGl0J3MgYWZ0ZXIgYWxsIHRoZSBvdGhlciBQQ0kgYW5kIGRldmljZSByZWdpc3RlcgorICAgICAgICAgICAqIHR3ZWFrcyBzbyBpdCBjYW4gYmFjayBvdXQgYmFkIHNldHRpbmdzIG9uIHNwZWNpZmljIGJyb2tlbiBjYXJkcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBhaWM3eHh4X2NvbmZpZ3VyZV9idWdzKHRlbXBfcCk7CisKKyAgICAgICAgICBpZiAoIGxpc3RfcCA9PSBOVUxMICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBsaXN0X3AgPSBjdXJyZW50X3AgPSB0ZW1wX3A7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBjdXJyZW50X3AgPSBsaXN0X3A7CisgICAgICAgICAgICB3aGlsZShjdXJyZW50X3AtPm5leHQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgY3VycmVudF9wID0gY3VycmVudF9wLT5uZXh0OworICAgICAgICAgICAgY3VycmVudF9wLT5uZXh0ID0gdGVtcF9wOworICAgICAgICAgIH0KKyAgICAgICAgICB0ZW1wX3AtPm5leHQgPSBOVUxMOworICAgICAgICAgIGZvdW5kKys7CisJICBjb250aW51ZTsKK3NraXBfcGNpX2NvbnRyb2xsZXI6CisjaWZkZWYgQ09ORklHX1BDSQorCSAgcGNpX3JlbGVhc2VfcmVnaW9ucyh0ZW1wX3AtPnBkZXYpOworI2VuZGlmCisJICBrZnJlZSh0ZW1wX3ApOworICAgICAgICB9ICAvKiBGb3VuZCBhbiBBZGFwdGVjIFBDSSBkZXZpY2UuICovCisgICAgICAgIGVsc2UgLyogV2VsbCwgd2UgZm91bmQgb25lLCBidXQgd2UgY291bGRuJ3QgZ2V0IGFueSBtZW1vcnkgKi8KKyAgICAgICAgeworICAgICAgICAgIHByaW50aygiYWljN3h4eDogRm91bmQgPCVzPlxuIiwgCisgICAgICAgICAgICBib2FyZF9uYW1lc1thaWNfcGRldnNbaV0uYm9hcmRfbmFtZV9pbmRleF0pOworICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImFpYzd4eHg6IFVuYWJsZSB0byBhbGxvY2F0ZSBkZXZpY2UgbWVtb3J5LCAiCisgICAgICAgICAgICAic2tpcHBpbmcuXG4iKTsKKyAgICAgICAgfQorICAgICAgfSAvKiB3aGlsZShwZGV2PS4uLi4pICovCisgICAgfSAvKiBmb3IgUENJX0RFVklDRVMgKi8KKyAgfQorI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19hbHBoYV9fKQorICAvKgorICAgKiBFSVNBL1ZMLWJ1cyBjYXJkIHNpZ25hdHVyZSBwcm9iZS4KKyAgICovCisgIHNsb3QgPSBNSU5TTE9UOworICB3aGlsZSAoIChzbG90IDw9IE1BWFNMT1QpICYmCisgICAgICAgICAhKGFpYzd4eHhfbm9fcHJvYmUpICkKKyAgeworICAgIGJhc2UgPSBTTE9UQkFTRShzbG90KSArIE1JTlJFRzsKKworICAgIGlmICghcmVxdWVzdF9yZWdpb24oYmFzZSwgTUFYUkVHIC0gTUlOUkVHLCAiYWljN3h4eCIpKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBTb21lIG90aGVyIGRyaXZlciBoYXMgc3Rha2VkIGEKKyAgICAgICAqIGNsYWltIHRvIHRoaXMgaS9vIHJlZ2lvbiBhbHJlYWR5LgorICAgICAgICovCisgICAgICBzbG90Kys7CisgICAgICBjb250aW51ZTsgLyogYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb3IgbG9vcCAqLworICAgIH0KKyAgICBmbGFncyA9IDA7CisgICAgdHlwZSA9IGFpYzd4eHhfcHJvYmUoc2xvdCwgYmFzZSArIEFIQ19ISUQwLCAmZmxhZ3MpOworICAgIGlmICh0eXBlID09IC0xKQorICAgIHsKKyAgICAgIHJlbGVhc2VfcmVnaW9uKGJhc2UsIE1BWFJFRyAtIE1JTlJFRyk7CisgICAgICBzbG90Kys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdGVtcF9wID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFpYzd4eHhfaG9zdCksIEdGUF9BVE9NSUMpOworICAgIGlmICh0ZW1wX3AgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJhaWM3eHh4OiBVbmFibGUgdG8gYWxsb2NhdGUgZGV2aWNlIHNwYWNlLlxuIik7CisgICAgICByZWxlYXNlX3JlZ2lvbihiYXNlLCBNQVhSRUcgLSBNSU5SRUcpOworICAgICAgc2xvdCsrOworICAgICAgY29udGludWU7IC8qIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgd2hpbGUgbG9vcCAqLworICAgIH0KKworICAgIC8qCisgICAgICogUGF1c2UgdGhlIGNhcmQgcHJlc2VydmluZyB0aGUgSVJRIHR5cGUuICBBbGxvdyB0aGUgb3BlcmF0b3IKKyAgICAgKiB0byBvdmVycmlkZSB0aGUgSVJRIHRyaWdnZXIuCisgICAgICovCisgICAgaWYgKGFpYzd4eHhfaXJxX3RyaWdnZXIgPT0gMSkKKyAgICAgIGhjbnRybCA9IElSUU1TOyAgLyogTGV2ZWwgKi8KKyAgICBlbHNlIGlmIChhaWM3eHh4X2lycV90cmlnZ2VyID09IDApCisgICAgICBoY250cmwgPSAwOyAgLyogRWRnZSAqLworICAgIGVsc2UKKyAgICAgIGhjbnRybCA9IGluYihiYXNlICsgSENOVFJMKSAmIElSUU1TOyAgLyogRGVmYXVsdCAqLworICAgIG1lbXNldCh0ZW1wX3AsIDAsIHNpemVvZihzdHJ1Y3QgYWljN3h4eF9ob3N0KSk7CisgICAgdGVtcF9wLT51bnBhdXNlID0gaGNudHJsIHwgSU5URU47CisgICAgdGVtcF9wLT5wYXVzZSA9IGhjbnRybCB8IFBBVVNFIHwgSU5URU47CisgICAgdGVtcF9wLT5iYXNlID0gYmFzZTsKKyAgICB0ZW1wX3AtPm1iYXNlID0gMDsKKyAgICB0ZW1wX3AtPm1hZGRyID0gTlVMTDsKKyAgICB0ZW1wX3AtPnBjaV9idXMgPSAwOworICAgIHRlbXBfcC0+cGNpX2RldmljZV9mbiA9IHNsb3Q7CisgICAgYWljX291dGIodGVtcF9wLCBoY250cmwgfCBQQVVTRSwgSENOVFJMKTsKKyAgICB3aGlsZSggKGFpY19pbmIodGVtcF9wLCBIQ05UUkwpICYgUEFVU0UpID09IDAgKSA7CisgICAgaWYgKGFpYzd4eHhfY2hpcF9yZXNldCh0ZW1wX3ApID09IC0xKQorICAgICAgdGVtcF9wLT5pcnEgPSAwOworICAgIGVsc2UKKyAgICAgIHRlbXBfcC0+aXJxID0gYWljX2luYih0ZW1wX3AsIElOVERFRikgJiAweDBGOworICAgIHRlbXBfcC0+ZmxhZ3MgfD0gQUhDX1BBR0VTQ0JTOworCisgICAgc3dpdGNoICh0ZW1wX3AtPmlycSkKKyAgICB7CisgICAgICBjYXNlIDk6CisgICAgICBjYXNlIDEwOgorICAgICAgY2FzZSAxMToKKyAgICAgIGNhc2UgMTI6CisgICAgICBjYXNlIDE0OgorICAgICAgY2FzZSAxNToKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImFpYzd4eHg6IEhvc3QgYWRhcHRlciB1c2VzIHVuc3VwcG9ydGVkIElSUSAiCisgICAgICAgICAgImxldmVsICVkLCBpZ25vcmluZy5cbiIsIHRlbXBfcC0+aXJxKTsKKyAgICAgICAga2ZyZWUodGVtcF9wKTsKKyAgICAgICAgcmVsZWFzZV9yZWdpb24oYmFzZSwgTUFYUkVHIC0gTUlOUkVHKTsKKyAgICAgICAgc2xvdCsrOworICAgICAgICBjb250aW51ZTsgLyogYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB3aGlsZSBsb29wICovCisgICAgfQorCisgICAgLyoKKyAgICAgKiBXZSBhcmUgY29tbWl0ZWQgbm93LCBldmVyeXRoaW5nIGhhcyBiZWVuIGNoZWNrZWQgYW5kIHRoaXMgY2FyZAorICAgICAqIGhhcyBiZWVuIGZvdW5kLCBub3cgd2UganVzdCBzZXQgaXQgdXAKKyAgICAgKi8KKworICAgIC8qCisgICAgICogSW5zZXJ0IG91ciBuZXcgc3RydWN0IGludG8gdGhlIGxpc3QgYXQgdGhlIGVuZAorICAgICAqLworICAgIGlmIChsaXN0X3AgPT0gTlVMTCkKKyAgICB7CisgICAgICBsaXN0X3AgPSBjdXJyZW50X3AgPSB0ZW1wX3A7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBjdXJyZW50X3AgPSBsaXN0X3A7CisgICAgICB3aGlsZSAoY3VycmVudF9wLT5uZXh0ICE9IE5VTEwpCisgICAgICAgIGN1cnJlbnRfcCA9IGN1cnJlbnRfcC0+bmV4dDsKKyAgICAgIGN1cnJlbnRfcC0+bmV4dCA9IHRlbXBfcDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgY2FzZSAwOgorICAgICAgICB0ZW1wX3AtPmJvYXJkX25hbWVfaW5kZXggPSAyOworICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICAgICAgcHJpbnRrKCJhaWM3eHh4OiA8JXM+IGF0IEVJU0EgJWRcbiIsCisgICAgICAgICAgICAgICBib2FyZF9uYW1lc1syXSwgc2xvdCk7CisgICAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgICBjYXNlIDE6CisgICAgICB7CisgICAgICAgIHRlbXBfcC0+Y2hpcCA9IEFIQ19BSUM3NzcwIHwgQUhDX0VJU0E7CisgICAgICAgIHRlbXBfcC0+ZmVhdHVyZXMgfD0gQUhDX0FJQzc3NzBfRkU7CisgICAgICAgIHRlbXBfcC0+Ymlvc19jb250cm9sID0gYWljX2luYih0ZW1wX3AsIEhBXzI3NF9CSU9TQ1RSTCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBwcmltYXJ5IGNoYW5uZWwgaW5mb3JtYXRpb24uICBSaWdodCBub3cgd2UgZG9uJ3QKKyAgICAgICAgICogZG8gYW55dGhpbmcgd2l0aCB0aGlzLCBidXQgc29tZWRheSB3ZSB3aWxsIGJlIGFibGUgdG8gaW5mb3JtCisgICAgICAgICAqIHRoZSBtaWQtbGV2ZWwgU0NTSSBjb2RlIHdoaWNoIGNoYW5uZWwgaXMgcHJpbWFyeS4KKyAgICAgICAgICovCisgICAgICAgIGlmICh0ZW1wX3AtPmJvYXJkX25hbWVfaW5kZXggPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHRlbXBfcC0+Ym9hcmRfbmFtZV9pbmRleCA9IDM7CisgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICAgICAgcHJpbnRrKCJhaWM3eHh4OiA8JXM+IGF0IEVJU0EgJWRcbiIsCisgICAgICAgICAgICAgICAgIGJvYXJkX25hbWVzWzNdLCBzbG90KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGVtcF9wLT5iaW9zX2NvbnRyb2wgJiBDSEFOTkVMX0JfUFJJTUFSWSkKKyAgICAgICAgeworICAgICAgICAgIHRlbXBfcC0+ZmxhZ3MgfD0gQUhDX0NIQU5ORUxfQl9QUklNQVJZOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh0ZW1wX3AtPmJpb3NfY29udHJvbCAmIEJJT1NNT0RFKSA9PSBCSU9TRElTQUJMRUQpCisgICAgICAgIHsKKyAgICAgICAgICB0ZW1wX3AtPmZsYWdzICY9IH5BSENfQklPU19FTkFCTEVEOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHRlbXBfcC0+ZmxhZ3MgJj0gfkFIQ19VU0VERUZBVUxUUzsKKyAgICAgICAgICB0ZW1wX3AtPmZsYWdzIHw9IEFIQ19CSU9TX0VOQUJMRUQ7CisgICAgICAgICAgaWYgKCAodGVtcF9wLT5iaW9zX2NvbnRyb2wgJiAweDIwKSA9PSAwICkKKyAgICAgICAgICB7CisgICAgICAgICAgICB0ZW1wX3AtPmJpb3NfYWRkcmVzcyA9IDB4Y2MwMDA7CisgICAgICAgICAgICB0ZW1wX3AtPmJpb3NfYWRkcmVzcyArPSAoMHg0MDAwICogKHRlbXBfcC0+Ymlvc19jb250cm9sICYgMHgwNykpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgdGVtcF9wLT5iaW9zX2FkZHJlc3MgPSAweGQwMDAwOworICAgICAgICAgICAgdGVtcF9wLT5iaW9zX2FkZHJlc3MgKz0gKDB4ODAwMCAqICh0ZW1wX3AtPmJpb3NfY29udHJvbCAmIDB4MDYpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGVtcF9wLT5hZGFwdGVyX2NvbnRyb2wgPSBhaWNfaW5iKHRlbXBfcCwgU0NTSUNPTkYpIDw8IDg7CisgICAgICAgIHRlbXBfcC0+YWRhcHRlcl9jb250cm9sIHw9IGFpY19pbmIodGVtcF9wLCBTQ1NJQ09ORiArIDEpOworICAgICAgICBpZiAodGVtcF9wLT5mZWF0dXJlcyAmIEFIQ19XSURFKQorICAgICAgICB7CisgICAgICAgICAgdGVtcF9wLT5zY3NpX2lkID0gdGVtcF9wLT5hZGFwdGVyX2NvbnRyb2wgJiBIV1NDU0lJRDsKKyAgICAgICAgICB0ZW1wX3AtPnNjc2lfaWRfYiA9IHRlbXBfcC0+c2NzaV9pZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB0ZW1wX3AtPnNjc2lfaWQgPSAodGVtcF9wLT5hZGFwdGVyX2NvbnRyb2wgPj4gOCkgJiBIU0NTSUlEOworICAgICAgICAgIHRlbXBfcC0+c2NzaV9pZF9iID0gdGVtcF9wLT5hZGFwdGVyX2NvbnRyb2wgJiBIU0NTSUlEOworICAgICAgICB9CisgICAgICAgIGFpYzd4eHhfbG9hZF9zZWVwcm9tKHRlbXBfcCwgJnN4ZnJjdGwxKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgMjoKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgdGVtcF9wLT5jaGlwID0gQUhDX0FJQzc3NzAgfCBBSENfVkw7CisgICAgICAgIHRlbXBfcC0+ZmVhdHVyZXMgfD0gQUhDX0FJQzc3NzBfRkU7CisgICAgICAgIGlmICh0eXBlID09IDIpCisgICAgICAgICAgdGVtcF9wLT5mbGFncyB8PSBBSENfQklPU19FTkFCTEVEOworICAgICAgICBlbHNlCisgICAgICAgICAgdGVtcF9wLT5mbGFncyAmPSB+QUhDX0JJT1NfRU5BQkxFRDsKKyAgICAgICAgaWYgKGFpY19pbmIodGVtcF9wLCBTQ1NJQ09ORikgJiBURVJNX0VOQikKKyAgICAgICAgICBzeGZyY3RsMSA9IFNUUFdFTjsKKyAgICAgICAgYWljN3h4eF9sb2FkX3NlZXByb20odGVtcF9wLCAmc3hmcmN0bDEpOworICAgICAgICB0ZW1wX3AtPmJvYXJkX25hbWVfaW5kZXggPSA0OworICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICAgICAgcHJpbnRrKCJhaWM3eHh4OiA8JXM+IGF0IFZMQiAlZFxuIiwKKyAgICAgICAgICAgICAgIGJvYXJkX25hbWVzWzJdLCBzbG90KTsKKyAgICAgICAgc3dpdGNoKCBhaWNfaW5iKHRlbXBfcCwgU1RBVFVTXzI4NDApICYgQklPU19TRUwgKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSAweDAwOgorICAgICAgICAgICAgdGVtcF9wLT5iaW9zX2FkZHJlc3MgPSAweGUwMDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAweDIwOgorICAgICAgICAgICAgdGVtcF9wLT5iaW9zX2FkZHJlc3MgPSAweGM4MDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAweDQwOgorICAgICAgICAgICAgdGVtcF9wLT5iaW9zX2FkZHJlc3MgPSAweGQwMDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAweDYwOgorICAgICAgICAgICAgdGVtcF9wLT5iaW9zX2FkZHJlc3MgPSAweGQ4MDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOyAvKiBjYW4ndCBnZXQgaGVyZSAqLworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OiAgLyogV29uJ3QgZ2V0IGhlcmUuICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgeworICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiYWljN3h4eDogQklPUyAlc2FibGVkLCBJTyBQb3J0IDB4JWx4LCBJUlEgJWQgKCVzKVxuIiwKKyAgICAgICAgKHRlbXBfcC0+ZmxhZ3MgJiBBSENfVVNFREVGQVVMVFMpID8gImRpcyIgOiAiZW4iLCB0ZW1wX3AtPmJhc2UsCisgICAgICAgIHRlbXBfcC0+aXJxLAorICAgICAgICAodGVtcF9wLT5wYXVzZSAmIElSUU1TKSA/ICJsZXZlbCBzZW5zaXRpdmUiIDogImVkZ2UgdHJpZ2dlcmVkIik7CisgICAgICBwcmludGsoS0VSTl9JTkZPICJhaWM3eHh4OiBFeHRlbmRlZCB0cmFuc2xhdGlvbiAlc2FibGVkLlxuIiwKKyAgICAgICAgICAgICAodGVtcF9wLT5mbGFncyAmIEFIQ19FWFRFTkRfVFJBTlNfQSkgPyAiZW4iIDogImRpcyIpOworICAgIH0KKworICAgIC8qCisgICAgICogQWxsIHRoZSA3NzcwIGJhc2VkIGNoaXBzZXRzIGhhdmUgdGhpcyBidWcKKyAgICAgKi8KKyAgICB0ZW1wX3AtPmJ1Z3MgfD0gQUhDX0JVR19UTU9ERV9XSURFT0REOworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIEZJRk8gdGhyZXNob2xkIGFuZCB0aGUgYnVzIG9mZiB0aW1lLgorICAgICAqLworICAgIGhvc3Rjb25mID0gYWljX2luYih0ZW1wX3AsIEhPU1RDT05GKTsKKyAgICBhaWNfb3V0Yih0ZW1wX3AsIGhvc3Rjb25mICYgREZUSFJTSCwgQlVTU1BEKTsKKyAgICBhaWNfb3V0Yih0ZW1wX3AsIChob3N0Y29uZiA8PCAyKSAmIEJPRkYsIEJVU1RJTUUpOworICAgIHNsb3QrKzsKKyAgICBmb3VuZCsrOworICB9CisKKyNlbmRpZiAvKiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fYWxwaGFfXykgKi8KKworICAvKgorICAgKiBOb3csIHdlIHJlLW9yZGVyIHRoZSBwcm9iZWQgZGV2aWNlcyBieSBCSU9TIGFkZHJlc3MgYW5kIEJVUyBjbGFzcy4KKyAgICogSW4gZ2VuZXJhbCwgd2UgZm9sbG93IHRoaXMgYWxnb3JpdGhtIHRvIG1ha2UgdGhlIGFkYXB0ZXJzIHNob3cgdXAKKyAgICogaW4gdGhlIHNhbWUgb3JkZXIgdW5kZXIgbGludXggdGhhdCB0aGUgY29tcHV0ZXIgZmluZHMgdGhlbS4KKyAgICogIDE6IEFsbCBWTEIvRUlTQSBjYXJkcyB3aXRoIEJJT1NfRU5BQkxFRCBmaXJzdCwgYWNjb3JkaW5nIHRvIEJJT1MKKyAgICogICAgIGFkZHJlc3MsIGdvaW5nIGZyb20gbG93ZXN0IHRvIGhpZ2hlc3QuCisgICAqICAyOiBBbGwgUENJIGNvbnRyb2xsZXJzIHdpdGggQklPU19FTkFCTEVEIG5leHQsIGFjY29yZGluZyB0byBCSU9TCisgICAqICAgICBhZGRyZXNzLCBnb2luZyBmcm9tIGxvd2VzdCB0byBoaWdoZXN0LgorICAgKiAgMzogUmVtYWluaW5nIFZMQi9FSVNBIGNvbnRyb2xsZXJzIGdvaW5nIGluIHNsb3Qgb3JkZXIuCisgICAqICA0OiBSZW1haW5pbmcgUENJIGNvbnRyb2xsZXJzLCBnb2luZyBpbiBQQ0kgZGV2aWNlIG9yZGVyIChyZXZlcnNhYmxlKQorICAgKi8KKworICB7CisgICAgc3RydWN0IGFpYzd4eHhfaG9zdCAqc29ydF9saXN0WzRdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisgICAgc3RydWN0IGFpYzd4eHhfaG9zdCAqdmxiLCAqcGNpOworICAgIHN0cnVjdCBhaWM3eHh4X2hvc3QgKnByZXZfcDsKKyAgICBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwOworICAgIHVuc2lnbmVkIGNoYXIgbGVmdDsKKworICAgIHByZXZfcCA9IHZsYiA9IHBjaSA9IE5VTEw7CisKKyAgICB0ZW1wX3AgPSBsaXN0X3A7CisgICAgd2hpbGUgKHRlbXBfcCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN3aXRjaCh0ZW1wX3AtPmNoaXAgJiB+QUhDX0NISVBJRF9NQVNLKQorICAgICAgeworICAgICAgICBjYXNlIEFIQ19FSVNBOgorICAgICAgICBjYXNlIEFIQ19WTDoKKyAgICAgICAgeworICAgICAgICAgIHAgPSB0ZW1wX3A7CisgICAgICAgICAgaWYgKHAtPmZsYWdzICYgQUhDX0JJT1NfRU5BQkxFRCkKKyAgICAgICAgICAgIHZsYiA9IHNvcnRfbGlzdFswXTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB2bGIgPSBzb3J0X2xpc3RbMl07CisKKyAgICAgICAgICBpZiAodmxiID09IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgdmxiID0gdGVtcF9wOworICAgICAgICAgICAgdGVtcF9wID0gdGVtcF9wLT5uZXh0OworICAgICAgICAgICAgdmxiLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJlbnRfcCA9IHZsYjsKKyAgICAgICAgICAgIHByZXZfcCA9IE5VTEw7CisgICAgICAgICAgICB3aGlsZSAoIChjdXJyZW50X3AgIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfcC0+Ymlvc19hZGRyZXNzIDwgdGVtcF9wLT5iaW9zX2FkZHJlc3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmV2X3AgPSBjdXJyZW50X3A7CisgICAgICAgICAgICAgIGN1cnJlbnRfcCA9IGN1cnJlbnRfcC0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcmV2X3AgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJldl9wLT5uZXh0ID0gdGVtcF9wOworICAgICAgICAgICAgICB0ZW1wX3AgPSB0ZW1wX3AtPm5leHQ7CisgICAgICAgICAgICAgIHByZXZfcC0+bmV4dC0+bmV4dCA9IGN1cnJlbnRfcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdmxiID0gdGVtcF9wOworICAgICAgICAgICAgICB0ZW1wX3AgPSB0ZW1wX3AtPm5leHQ7CisgICAgICAgICAgICAgIHZsYi0+bmV4dCA9IGN1cnJlbnRfcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgaWYgKHAtPmZsYWdzICYgQUhDX0JJT1NfRU5BQkxFRCkKKyAgICAgICAgICAgIHNvcnRfbGlzdFswXSA9IHZsYjsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzb3J0X2xpc3RbMl0gPSB2bGI7CisgICAgICAgICAgCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogIC8qIEFsbCBQQ0kgY29udHJvbGxlcnMgZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQgKi8KKyAgICAgICAgeworCisgICAgICAgICAgcCA9IHRlbXBfcDsKKyAgICAgICAgICBpZiAocC0+ZmxhZ3MgJiBBSENfQklPU19FTkFCTEVEKSAKKyAgICAgICAgICAgIHBjaSA9IHNvcnRfbGlzdFsxXTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwY2kgPSBzb3J0X2xpc3RbM107CisKKyAgICAgICAgICBpZiAocGNpID09IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgcGNpID0gdGVtcF9wOworICAgICAgICAgICAgdGVtcF9wID0gdGVtcF9wLT5uZXh0OworICAgICAgICAgICAgcGNpLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJlbnRfcCA9IHBjaTsKKyAgICAgICAgICAgIHByZXZfcCA9IE5VTEw7CisgICAgICAgICAgICBpZiAoIWFpYzd4eHhfcmV2ZXJzZV9zY2FuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB3aGlsZSAoIChjdXJyZW50X3AgIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAoIChQQ0lfU0xPVChjdXJyZW50X3AtPnBjaV9kZXZpY2VfZm4pIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50X3AtPnBjaV9idXMgPDwgOCkpIDwgCisgICAgICAgICAgICAgICAgICAgICAgICAoUENJX1NMT1QodGVtcF9wLT5wY2lfZGV2aWNlX2ZuKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAodGVtcF9wLT5wY2lfYnVzIDw8IDgpKSApICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByZXZfcCA9IGN1cnJlbnRfcDsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3AgPSBjdXJyZW50X3AtPm5leHQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgd2hpbGUgKCAoY3VycmVudF9wICE9IE5VTEwpICYmCisgICAgICAgICAgICAgICAgICAgICAgKCAoUENJX1NMT1QoY3VycmVudF9wLT5wY2lfZGV2aWNlX2ZuKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudF9wLT5wY2lfYnVzIDw8IDgpKSA+IAorICAgICAgICAgICAgICAgICAgICAgICAgKFBDSV9TTE9UKHRlbXBfcC0+cGNpX2RldmljZV9mbikgfAorICAgICAgICAgICAgICAgICAgICAgICAgKHRlbXBfcC0+cGNpX2J1cyA8PCA4KSkgKSApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmV2X3AgPSBjdXJyZW50X3A7CisgICAgICAgICAgICAgICAgY3VycmVudF9wID0gY3VycmVudF9wLT5uZXh0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXJlIHdlIGRlYWxpbmcgd2l0aCBhIDc4OTUvNi83Lzkgd2hlcmUgd2UgbmVlZCB0byBzb3J0IHRoZQorICAgICAgICAgICAgICogY2hhbm5lbHMgYXMgd2VsbCwgaWYgc28sIHRoZSBiaW9zX2FkZHJlc3MgdmFsdWVzIHNob3VsZAorICAgICAgICAgICAgICogYmUgdGhlIHNhbWUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCAoY3VycmVudF9wKSAmJiAodGVtcF9wLT5mbGFncyAmIEFIQ19NVUxUSV9DSEFOTkVMKSAmJgorICAgICAgICAgICAgICAgICAodGVtcF9wLT5wY2lfYnVzID09IGN1cnJlbnRfcC0+cGNpX2J1cykgJiYKKyAgICAgICAgICAgICAgICAgKFBDSV9TTE9UKHRlbXBfcC0+cGNpX2RldmljZV9mbikgPT0KKyAgICAgICAgICAgICAgICAgIFBDSV9TTE9UKGN1cnJlbnRfcC0+cGNpX2RldmljZV9mbikpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHRlbXBfcC0+ZmxhZ3MgJiBBSENfQ0hOTEIpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoICEodGVtcF9wLT5mbGFncyAmIEFIQ19DSEFOTkVMX0JfUFJJTUFSWSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHByZXZfcCA9IGN1cnJlbnRfcDsKKyAgICAgICAgICAgICAgICAgIGN1cnJlbnRfcCA9IGN1cnJlbnRfcC0+bmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRlbXBfcC0+ZmxhZ3MgJiBBSENfQ0hBTk5FTF9CX1BSSU1BUlkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcHJldl9wID0gY3VycmVudF9wOworICAgICAgICAgICAgICAgICAgY3VycmVudF9wID0gY3VycmVudF9wLT5uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHByZXZfcCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmV2X3AtPm5leHQgPSB0ZW1wX3A7CisgICAgICAgICAgICAgIHRlbXBfcCA9IHRlbXBfcC0+bmV4dDsKKyAgICAgICAgICAgICAgcHJldl9wLT5uZXh0LT5uZXh0ID0gY3VycmVudF9wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwY2kgPSB0ZW1wX3A7CisgICAgICAgICAgICAgIHRlbXBfcCA9IHRlbXBfcC0+bmV4dDsKKyAgICAgICAgICAgICAgcGNpLT5uZXh0ID0gY3VycmVudF9wOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChwLT5mbGFncyAmIEFIQ19CSU9TX0VOQUJMRUQpCisgICAgICAgICAgICBzb3J0X2xpc3RbMV0gPSBwY2k7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc29ydF9saXN0WzNdID0gcGNpOworCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gIC8qIEVuZCBvZiBzd2l0Y2godGVtcF9wLT50eXBlKSAqLworICAgIH0gLyogRW5kIG9mIHdoaWxlICh0ZW1wX3AgIT0gTlVMTCkgKi8KKyAgICAvKgorICAgICAqIEF0IHRoaXMgcG9pbnQsIHRoZSBjYXJkcyBoYXZlIGJlZW4gYnJva2VuIGludG8gNCBzb3J0ZWQgbGlzdHMsIG5vdworICAgICAqIHdlIHJ1biB0aHJvdWdoIHRoZSBsaXN0cyBpbiBvcmRlciBhbmQgcmVnaXN0ZXIgZWFjaCBjb250cm9sbGVyCisgICAgICovCisgICAgeworICAgICAgaW50IGk7CisgICAgICAKKyAgICAgIGxlZnQgPSBmb3VuZDsKKyAgICAgIGZvciAoaT0wOyBpPEFSUkFZX1NJWkUoc29ydF9saXN0KTsgaSsrKQorICAgICAgeworICAgICAgICB0ZW1wX3AgPSBzb3J0X2xpc3RbaV07CisgICAgICAgIHdoaWxlKHRlbXBfcCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgdGVtcGxhdGUtPm5hbWUgPSBib2FyZF9uYW1lc1t0ZW1wX3AtPmJvYXJkX25hbWVfaW5kZXhdOworICAgICAgICAgIHAgPSBhaWM3eHh4X2FsbG9jKHRlbXBsYXRlLCB0ZW1wX3ApOworICAgICAgICAgIGlmIChwICE9IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgcC0+aW5zdGFuY2UgPSBmb3VuZCAtIGxlZnQ7CisgICAgICAgICAgICBpZiAoYWljN3h4eF9yZWdpc3Rlcih0ZW1wbGF0ZSwgcCwgKC0tbGVmdCkpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZvdW5kLS07CisgICAgICAgICAgICAgIGFpYzd4eHhfcmVsZWFzZShwLT5ob3N0KTsKKyAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHAtPmhvc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYWljN3h4eF9kdW1wX2NhcmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHBhdXNlX3NlcXVlbmNlcihwKTsKKyAgICAgICAgICAgICAgYWljN3h4eF9wcmludF9jYXJkKHApOworICAgICAgICAgICAgICBhaWM3eHh4X3ByaW50X3NjcmF0Y2hfcmFtKHApOworICAgICAgICAgICAgICB1bnBhdXNlX3NlcXVlbmNlcihwLCBUUlVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgY3VycmVudF9wID0gdGVtcF9wOworICAgICAgICAgIHRlbXBfcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopdGVtcF9wLT5uZXh0OworICAgICAgICAgIGtmcmVlKGN1cnJlbnRfcCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIChmb3VuZCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9idWlsZHNjYgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBCdWlsZCBhIFNDQi4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfYnVpbGRzY2Ioc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgU2NzaV9DbW5kICpjbWQsCisgICAgc3RydWN0IGFpYzd4eHhfc2NiICpzY2IpCit7CisgIHVuc2lnbmVkIHNob3J0IG1hc2s7CisgIHN0cnVjdCBhaWM3eHh4X2h3c2NiICpoc2NiOworICBzdHJ1Y3QgYWljX2Rldl9kYXRhICphaWNfZGV2ID0gY21kLT5kZXZpY2UtPmhvc3RkYXRhOworICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcHRyID0gY21kLT5kZXZpY2U7CisgIHVuc2lnbmVkIGNoYXIgdGluZGV4ID0gVEFSR0VUX0lOREVYKGNtZCk7CisgIHN0cnVjdCByZXF1ZXN0ICpyZXEgPSBjbWQtPnJlcXVlc3Q7CisKKyAgbWFzayA9ICgweDAxIDw8IHRpbmRleCk7CisgIGhzY2IgPSBzY2ItPmhzY2I7CisKKyAgLyoKKyAgICogU2V0dXAgdGhlIGNvbnRyb2wgYnl0ZSBpZiB3ZSBuZWVkIG5lZ290aWF0aW9uIGFuZCBoYXZlIG5vdAorICAgKiBhbHJlYWR5IHJlcXVlc3RlZCBpdC4KKyAgICovCisgIGhzY2ItPmNvbnRyb2wgPSAwOworICBzY2ItPnRhZ19hY3Rpb24gPSAwOworCisgIGlmIChwLT5kaXNjZW5hYmxlICYgbWFzaykKKyAgeworICAgIGhzY2ItPmNvbnRyb2wgfD0gRElTQ0VOQjsKKyAgICAvKiBXZSBhbHdheXMgZm9yY2UgVEVTVF9VTklUX1JFQURZIHRvIHVudGFnZ2VkICovCisgICAgaWYgKGNtZC0+Y21uZFswXSAhPSBURVNUX1VOSVRfUkVBRFkgJiYgc2RwdHItPnNpbXBsZV90YWdzKQorICAgIHsKKyAgICAgIGlmIChyZXEtPmZsYWdzICYgUkVRX0hBUkRCQVJSSUVSKQorICAgICAgeworCWlmKHNkcHRyLT5vcmRlcmVkX3RhZ3MpCisJeworICAgICAgICAgIGhzY2ItPmNvbnRyb2wgfD0gTVNHX09SREVSRURfUV9UQUc7CisgICAgICAgICAgc2NiLT50YWdfYWN0aW9uID0gTVNHX09SREVSRURfUV9UQUc7CisJfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBoc2NiLT5jb250cm9sIHw9IE1TR19TSU1QTEVfUV9UQUc7CisgICAgICAgIHNjYi0+dGFnX2FjdGlvbiA9IE1TR19TSU1QTEVfUV9UQUc7CisgICAgICB9CisgICAgfQorICB9CisgIGlmICggIShhaWNfZGV2LT5kdHJfcGVuZGluZykgJiYKKyAgICAgICAgKGFpY19kZXYtPm5lZWRwcHIgfHwgYWljX2Rldi0+bmVlZHdkdHIgfHwgYWljX2Rldi0+bmVlZHNkdHIpICYmCisgICAgICAgIChhaWNfZGV2LT5mbGFncyAmIERFVklDRV9EVFJfU0NBTk5FRCkgKQorICB7CisgICAgYWljX2Rldi0+ZHRyX3BlbmRpbmcgPSAxOworICAgIHNjYi0+dGFnX2FjdGlvbiA9IDA7CisgICAgaHNjYi0+Y29udHJvbCAmPSBESVNDRU5COworICAgIGhzY2ItPmNvbnRyb2wgfD0gTUtfTUVTU0FHRTsKKyAgICBpZihhaWNfZGV2LT5uZWVkcHByKQorICAgIHsKKyAgICAgIHNjYi0+ZmxhZ3MgfD0gU0NCX01TR09VVF9QUFI7CisgICAgfQorICAgIGVsc2UgaWYoYWljX2Rldi0+bmVlZHdkdHIpCisgICAgeworICAgICAgc2NiLT5mbGFncyB8PSBTQ0JfTVNHT1VUX1dEVFI7CisgICAgfQorICAgIGVsc2UgaWYoYWljX2Rldi0+bmVlZHNkdHIpCisgICAgeworICAgICAgc2NiLT5mbGFncyB8PSBTQ0JfTVNHT1VUX1NEVFI7CisgICAgfQorICAgIHNjYi0+ZmxhZ3MgfD0gU0NCX0RUUl9TQ0I7CisgIH0KKyAgaHNjYi0+dGFyZ2V0X2NoYW5uZWxfbHVuID0gKChjbWQtPmRldmljZS0+aWQgPDwgNCkgJiAweEYwKSB8CisgICAgICAgICgoY21kLT5kZXZpY2UtPmNoYW5uZWwgJiAweDAxKSA8PCAzKSB8IChjbWQtPmRldmljZS0+bHVuICYgMHgwNyk7CisKKyAgLyoKKyAgICogVGhlIGludGVycHJldGF0aW9uIG9mIHJlcXVlc3RfYnVmZmVyIGFuZCByZXF1ZXN0X2J1ZmZsZW4KKyAgICogY2hhbmdlcyBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3QgdXNlX3NnIGlzIHplcm87IGEKKyAgICogbm9uLXplcm8gdXNlX3NnIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQorICAgKiBzY2F0dGVyLWdhdGhlciBhcnJheS4KKyAgICovCisKKyAgLyoKKyAgICogWFhYIC0gdGhpcyByZWxpZXMgb24gdGhlIGhvc3QgZGF0YSBiZWluZyBzdG9yZWQgaW4gYQorICAgKiAgICAgICBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKyAgICovCisgIGhzY2ItPlNDU0lfY21kX2xlbmd0aCA9IGNtZC0+Y21kX2xlbjsKKyAgbWVtY3B5KHNjYi0+Y21uZCwgY21kLT5jbW5kLCBjbWQtPmNtZF9sZW4pOworICBoc2NiLT5TQ1NJX2NtZF9wb2ludGVyID0gY3B1X3RvX2xlMzIoU0NCX0RNQV9BRERSKHNjYiwgc2NiLT5jbW5kKSk7CisKKyAgaWYgKGNtZC0+dXNlX3NnKQorICB7CisgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsgIC8qIE11c3QgYmUgbWlkLWxldmVsIFNDU0kgY29kZSBzY2F0dGVybGlzdCAqLworCisgICAgLyoKKyAgICAgKiBXZSBtdXN0IGJ1aWxkIGFuIFNHIGxpc3QgaW4gYWRhcHRlciBmb3JtYXQsIGFzIHRoZSBrZXJuZWwncyBTRyBsaXN0CisgICAgICogY2Fubm90IGJlIHVzZWQgZGlyZWN0bHkgYmVjYXVzZSBvZiBkYXRhIGZpZWxkIHNpemUgKF9fYWxwaGFfXykKKyAgICAgKiBkaWZmZXJlbmNlcyBhbmQgdGhlIGtlcm5lbCBTRyBsaXN0IHVzZXMgdmlydHVhbCBhZGRyZXNzZXMgd2hlcmUKKyAgICAgKiB3ZSBuZWVkIHBoeXNpY2FsIGFkZHJlc3Nlcy4KKyAgICAgKi8KKyAgICBpbnQgaSwgdXNlX3NnOworCisgICAgc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKyAgICBzY2ItPnNnX2xlbmd0aCA9IDA7CisgICAgdXNlX3NnID0gcGNpX21hcF9zZyhwLT5wZGV2LCBzZywgY21kLT51c2Vfc2csIHNjc2lfdG9fcGNpX2RtYV9kaXIoY21kLT5zY19kYXRhX2RpcmVjdGlvbikpOworICAgIC8qCisgICAgICogQ29weSB0aGUgc2VnbWVudHMgaW50byB0aGUgU0cgYXJyYXkuICBOT1RFISEhIC0gV2UgdXNlZCB0bworICAgICAqIGhhdmUgdGhlIGZpcnN0IGVudHJ5IGJvdGggaW4gdGhlIGRhdGFfcG9pbnRlciBhcmVhIGFuZCB0aGUgZmlyc3QKKyAgICAgKiBTRyBlbGVtZW50LiAgVGhhdCBoYXMgY2hhbmdlZCBzb21ld2hhdC4gIFdlIHN0aWxsIGhhdmUgdGhlIGZpcnN0CisgICAgICogZW50cnkgaW4gYm90aCBwbGFjZXMsIGJ1dCBub3cgd2UgZG93bmxvYWQgdGhlIGFkZHJlc3Mgb2YKKyAgICAgKiBzY2ItPnNnX2xpc3RbMV0gaW5zdGVhZCBvZiAwIHRvIHRoZSBzZyBwb2ludGVyIGluIHRoZSBoc2NiLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCB1c2Vfc2c7IGkrKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgbGVuID0gc2dfZG1hX2xlbihzZytpKTsKKyAgICAgIHNjYi0+c2dfbGlzdFtpXS5hZGRyZXNzID0gY3B1X3RvX2xlMzIoc2dfZG1hX2FkZHJlc3Moc2craSkpOworICAgICAgc2NiLT5zZ19saXN0W2ldLmxlbmd0aCA9IGNwdV90b19sZTMyKGxlbik7CisgICAgICBzY2ItPnNnX2xlbmd0aCArPSBsZW47CisgICAgfQorICAgIC8qIENvcHkgdGhlIGZpcnN0IFNHIGludG8gdGhlIGRhdGEgcG9pbnRlciBhcmVhLiAqLworICAgIGhzY2ItPmRhdGFfcG9pbnRlciA9IHNjYi0+c2dfbGlzdFswXS5hZGRyZXNzOworICAgIGhzY2ItPmRhdGFfY291bnQgPSBzY2ItPnNnX2xpc3RbMF0ubGVuZ3RoOworICAgIHNjYi0+c2dfY291bnQgPSBpOworICAgIGhzY2ItPlNHX3NlZ21lbnRfY291bnQgPSBpOworICAgIGhzY2ItPlNHX2xpc3RfcG9pbnRlciA9IGNwdV90b19sZTMyKFNDQl9ETUFfQUREUihzY2IsICZzY2ItPnNnX2xpc3RbMV0pKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4pCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGFkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShwLT5wZGV2LCBjbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCQkgICAgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjc2lfdG9fcGNpX2RtYV9kaXIoY21kLT5zY19kYXRhX2RpcmVjdGlvbikpOworICAgICAgYWljN3h4eF9tYXBwaW5nKGNtZCkgPSBhZGRyZXNzOworICAgICAgc2NiLT5zZ19saXN0WzBdLmFkZHJlc3MgPSBjcHVfdG9fbGUzMihhZGRyZXNzKTsKKyAgICAgIHNjYi0+c2dfbGlzdFswXS5sZW5ndGggPSBjcHVfdG9fbGUzMihjbWQtPnJlcXVlc3RfYnVmZmxlbik7CisgICAgICBzY2ItPnNnX2NvdW50ID0gMTsKKyAgICAgIHNjYi0+c2dfbGVuZ3RoID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisgICAgICBoc2NiLT5TR19zZWdtZW50X2NvdW50ID0gMTsKKyAgICAgIGhzY2ItPlNHX2xpc3RfcG9pbnRlciA9IGNwdV90b19sZTMyKFNDQl9ETUFfQUREUihzY2IsICZzY2ItPnNnX2xpc3RbMF0pKTsKKyAgICAgIGhzY2ItPmRhdGFfY291bnQgPSBzY2ItPnNnX2xpc3RbMF0ubGVuZ3RoOworICAgICAgaHNjYi0+ZGF0YV9wb2ludGVyID0gc2NiLT5zZ19saXN0WzBdLmFkZHJlc3M7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzY2ItPnNnX2NvdW50ID0gMDsKKyAgICAgIHNjYi0+c2dfbGVuZ3RoID0gMDsKKyAgICAgIGhzY2ItPlNHX3NlZ21lbnRfY291bnQgPSAwOworICAgICAgaHNjYi0+U0dfbGlzdF9wb2ludGVyID0gMDsKKyAgICAgIGhzY2ItPmRhdGFfY291bnQgPSAwOworICAgICAgaHNjYi0+ZGF0YV9wb2ludGVyID0gMDsKKyAgICB9CisgIH0KK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X3F1ZXVlCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFF1ZXVlIGEgU0NCIHRvIHRoZSBjb250cm9sbGVyLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X3F1ZXVlKFNjc2lfQ21uZCAqY21kLCB2b2lkICgqZm4pKFNjc2lfQ21uZCAqKSkKK3sKKyAgc3RydWN0IGFpYzd4eHhfaG9zdCAqcDsKKyAgc3RydWN0IGFpYzd4eHhfc2NiICpzY2I7CisgIHN0cnVjdCBhaWNfZGV2X2RhdGEgKmFpY19kZXY7CisKKyAgcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworICBhaWNfZGV2ID0gY21kLT5kZXZpY2UtPmhvc3RkYXRhOyAgCisjaWZkZWYgQUlDN1hYWF9WRVJCT1NFX0RFQlVHR0lORworICBpZiAoYWljX2Rldi0+YWN0aXZlX2NtZHMgPiBhaWNfZGV2LT5tYXhfcV9kZXB0aCkKKyAgeworICAgIHByaW50ayhXQVJOX0xFQUQgIkNvbW1hbmRzIHF1ZXVlZCBleGNlZWRzIHF1ZXVlICIKKyAgICAgICAgICAgImRlcHRoLCBhY3RpdmU9JWRcbiIsCisgICAgICAgICAgIHAtPmhvc3Rfbm8sIENUTF9PRl9DTUQoY21kKSwgCisgICAgICAgICAgIGFpY19kZXYtPmFjdGl2ZV9jbWRzKTsKKyAgfQorI2VuZGlmCisKKyAgc2NiID0gc2NicV9yZW1vdmVfaGVhZCgmcC0+c2NiX2RhdGEtPmZyZWVfc2Nicyk7CisgIGlmIChzY2IgPT0gTlVMTCkKKyAgeworICAgIGFpYzd4eHhfYWxsb2NhdGVfc2NiKHApOworICAgIHNjYiA9IHNjYnFfcmVtb3ZlX2hlYWQoJnAtPnNjYl9kYXRhLT5mcmVlX3NjYnMpOworICAgIGlmKHNjYiA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ayhXQVJOX0xFQUQgIkNvdWxkbid0IGdldCBhIGZyZWUgU0NCLlxuIiwgcC0+aG9zdF9ubywKKyAgICAgICAgICAgICBDVExfT0ZfQ01EKGNtZCkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIHNjYi0+Y21kID0gY21kOworCisgIC8qCisgICAqIE1ha2Ugc3VyZSB0aGUgU2NzaV9DbW5kIHBvaW50ZXIgaXMgc2F2ZWQsIHRoZSBzdHJ1Y3QgaXQgcG9pbnRzIHRvCisgICAqIGlzIHNldCB1cCBwcm9wZXJseSwgYW5kIHRoZSBwYXJpdHkgZXJyb3IgZmxhZyBpcyByZXNldCwgdGhlbiBzZW5kCisgICAqIHRoZSBTQ0IgdG8gdGhlIHNlcXVlbmNlciBhbmQgd2F0Y2ggdGhlIGZ1biBiZWdpbi4KKyAgICovCisgIGFpYzd4eHhfcG9zaXRpb24oY21kKSA9IHNjYi0+aHNjYi0+dGFnOworICBjbWQtPnNjc2lfZG9uZSA9IGZuOworICBjbWQtPnJlc3VsdCA9IERJRF9PSzsKKyAgbWVtc2V0KGNtZC0+c2Vuc2VfYnVmZmVyLCAwLCBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpKTsKKyAgYWljN3h4eF9lcnJvcihjbWQpID0gRElEX09LOworICBhaWM3eHh4X3N0YXR1cyhjbWQpID0gMDsKKyAgY21kLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworICAvKgorICAgKiBDb25zdHJ1Y3QgdGhlIFNDQiBiZWZvcmVoYW5kLCBzbyB0aGUgc2VxdWVuY2VyIGlzCisgICAqIHBhdXNlZCBhIG1pbmltYWwgYW1vdW50IG9mIHRpbWUuCisgICAqLworICBhaWM3eHh4X2J1aWxkc2NiKHAsIGNtZCwgc2NiKTsKKworICBzY2ItPmZsYWdzIHw9IFNDQl9BQ1RJVkUgfCBTQ0JfV0FJVElOR1E7CisKKyAgc2NicV9pbnNlcnRfdGFpbCgmcC0+d2FpdGluZ19zY2JzLCBzY2IpOworICBhaWM3eHh4X3J1bl93YWl0aW5nX3F1ZXVlcyhwKTsKKyAgcmV0dXJuICgwKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2J1c19kZXZpY2VfcmVzZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgQWJvcnQgb3IgcmVzZXQgdGhlIGN1cnJlbnQgU0NTSSBjb21tYW5kKHMpLiAgSWYgdGhlIHNjYiBoYXMgbm90CisgKiAgIHByZXZpb3VzbHkgYmVlbiBhYm9ydGVkLCB0aGVuIHdlIGF0dGVtcHQgdG8gc2VuZCBhIEJVU19ERVZJQ0VfUkVTRVQKKyAqICAgbWVzc2FnZSB0byB0aGUgdGFyZ2V0LiAgSWYgdGhlIHNjYiBoYXMgcHJldmlvdXNseSBiZWVuIHVuc3VjY2Vzc2Z1bGx5CisgKiAgIGFib3J0ZWQsIHRoZW4gd2Ugd2lsbCByZXNldCB0aGUgY2hhbm5lbCBhbmQgaGF2ZSBhbGwgZGV2aWNlcyByZW5lZ290aWF0ZS4KKyAqICAgUmV0dXJucyBhbiBlbnVtZXJhdGVkIHR5cGUgdGhhdCBpbmRpY2F0ZXMgdGhlIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X2J1c19kZXZpY2VfcmVzZXQoU2NzaV9DbW5kICpjbWQpCit7CisgIHN0cnVjdCBhaWM3eHh4X2hvc3QgICpwOworICBzdHJ1Y3QgYWljN3h4eF9zY2IgICAqc2NiOworICBzdHJ1Y3QgYWljN3h4eF9od3NjYiAqaHNjYjsKKyAgaW50IGNoYW5uZWw7CisgIHVuc2lnbmVkIGNoYXIgc2F2ZWRfc2NicHRyLCBsYXN0cGhhc2U7CisgIHVuc2lnbmVkIGNoYXIgaHNjYl9pbmRleDsKKyAgaW50IGRpc2Nvbm5lY3RlZDsKKyAgc3RydWN0IGFpY19kZXZfZGF0YSAqYWljX2RldjsKKworICBpZihjbWQgPT0gTlVMTCkKKyAgeworICAgIHByaW50ayhLRVJOX0VSUiAiYWljN3h4eF9idXNfZGV2aWNlX3Jlc2V0OiBjYWxsZWQgd2l0aCBOVUxMIGNtZCFcbiIpOworICAgIHJldHVybiBGQUlMRUQ7CisgIH0KKyAgcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworICBhaWNfZGV2ID0gQUlDX0RFVihjbWQpOworICBpZihhaWM3eHh4X3Bvc2l0aW9uKGNtZCkgPCBwLT5zY2JfZGF0YS0+bnVtc2NicykKKyAgICBzY2IgPSAocC0+c2NiX2RhdGEtPnNjYl9hcnJheVthaWM3eHh4X3Bvc2l0aW9uKGNtZCldKTsKKyAgZWxzZQorICAgIHJldHVybiBGQUlMRUQ7CisKKyAgaHNjYiA9IHNjYi0+aHNjYjsKKworICBhaWM3eHh4X2lzcihwLT5pcnEsICh2b2lkICopcCwgTlVMTCk7CisgIGFpYzd4eHhfZG9uZV9jbWRzX2NvbXBsZXRlKHApOworICAvKiBJZiB0aGUgY29tbWFuZCB3YXMgYWxyZWFkeSBjb21wbGV0ZSBvciBqdXN0IGNvbXBsZXRlZCwgdGhlbiB3ZSBkaWRuJ3QKKyAgICogZG8gYSByZXNldCwgcmV0dXJuIEZBSUxFRCAqLworICBpZighKHNjYi0+ZmxhZ3MgJiBTQ0JfQUNUSVZFKSkKKyAgICByZXR1cm4gRkFJTEVEOworCisgIHBhdXNlX3NlcXVlbmNlcihwKTsKKyAgbGFzdHBoYXNlID0gYWljX2luYihwLCBMQVNUUEhBU0UpOworICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9SRVNFVF9QUk9DRVNTKQorICB7CisgICAgcHJpbnRrKElORk9fTEVBRCAiQnVzIERldmljZSByZXNldCwgc2NiIGZsYWdzIDB4JXgsICIsCisgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYiksIHNjYi0+ZmxhZ3MpOworICAgIHN3aXRjaCAobGFzdHBoYXNlKQorICAgIHsKKyAgICAgIGNhc2UgUF9EQVRBT1VUOgorICAgICAgICBwcmludGsoIkRhdGEtT3V0IHBoYXNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBfREFUQUlOOgorICAgICAgICBwcmludGsoIkRhdGEtSW4gcGhhc2VcbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUF9DT01NQU5EOgorICAgICAgICBwcmludGsoIkNvbW1hbmQgcGhhc2VcbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUF9NRVNHT1VUOgorICAgICAgICBwcmludGsoIk1lc3NhZ2UtT3V0IHBoYXNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBfU1RBVFVTOgorICAgICAgICBwcmludGsoIlN0YXR1cyBwaGFzZVxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQX01FU0dJTjoKKyAgICAgICAgcHJpbnRrKCJNZXNzYWdlLUluIHBoYXNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgLyoKKyAgICAgICAqIFdlJ3JlIG5vdCBpbiBhIHZhbGlkIHBoYXNlLCBzbyBhc3N1bWUgd2UncmUgaWRsZS4KKyAgICAgICAqLworICAgICAgICBwcmludGsoIndoaWxlIGlkbGUsIExBU1RQSEFTRSA9IDB4JXhcbiIsIGxhc3RwaGFzZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBwcmludGsoSU5GT19MRUFEICJTQ1NJU0lHSSAweCV4LCBTRVFBRERSIDB4JXgsIFNTVEFUMCAweCV4LCBTU1RBVDEgIgorICAgICAgICAgIjB4JXhcbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSwKKyAgICAgICAgIGFpY19pbmIocCwgU0NTSVNJR0kpLAorICAgICAgICAgYWljX2luYihwLCBTRVFBRERSMCkgfCAoYWljX2luYihwLCBTRVFBRERSMSkgPDwgOCksCisgICAgICAgICBhaWNfaW5iKHAsIFNTVEFUMCksIGFpY19pbmIocCwgU1NUQVQxKSk7CisgICAgcHJpbnRrKElORk9fTEVBRCAiU0dfQ0FDSEVQVFIgMHgleCwgU1NUQVQyIDB4JXgsIFNUQ05UIDB4JXhcbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICBDVExfT0ZfU0NCKHNjYiksCisgICAgICAgICAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSA/IGFpY19pbmIocCwgU0dfQ0FDSEVQVFIpIDogMCwKKyAgICAgICAgIGFpY19pbmIocCwgU1NUQVQyKSwKKyAgICAgICAgIGFpY19pbmIocCwgU1RDTlQgKyAyKSA8PCAxNiB8IGFpY19pbmIocCwgU1RDTlQgKyAxKSA8PCA4IHwKKyAgICAgICAgIGFpY19pbmIocCwgU1RDTlQpKTsKKyAgfQorCisgIGNoYW5uZWwgPSBjbWQtPmRldmljZS0+Y2hhbm5lbDsKKworICAgIC8qCisgICAgICogU2VuZCBhIERldmljZSBSZXNldCBNZXNzYWdlOgorICAgICAqIFRoZSB0YXJnZXQgdGhhdCBpcyBob2xkaW5nIHVwIHRoZSBidXMgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcworICAgICAqIHRoZSBvbmUgdGhhdCB0cmlnZ2VyZWQgdGhpcyB0aW1lb3V0IChkaWZmZXJlbnQgY29tbWFuZHMgaGF2ZQorICAgICAqIGRpZmZlcmVudCB0aW1lb3V0IGxlbmd0aHMpLiAgT3VyIHN0cmF0ZWd5IGhlcmUgaXMgdG8gcXVldWUgYW4KKyAgICAgKiBhYm9ydCBtZXNzYWdlIHRvIHRoZSB0aW1lZCBvdXQgdGFyZ2V0IGlmIGl0IGlzIGRpc2Nvbm5lY3RlZC4KKyAgICAgKiBPdGhlcndpc2UsIGlmIHdlIGhhdmUgYW4gYWN0aXZlIHRhcmdldCB3ZSBzdHVmZiB0aGUgbWVzc2FnZSBidWZmZXIKKyAgICAgKiB3aXRoIGFuIGFib3J0IG1lc3NhZ2UgYW5kIGFzc2VydCBBVE4gaW4gdGhlIGhvcGVzIHRoYXQgdGhlIHRhcmdldAorICAgICAqIHdpbGwgbGV0IGdvIG9mIHRoZSBidXMgYW5kIGdvIHRvIHRoZSBtZXNnb3V0IHBoYXNlLiAgSWYgdGhpcworICAgICAqIGZhaWxzLCB3ZSdsbCBnZXQgYW5vdGhlciB0aW1lb3V0IGEgZmV3IHNlY29uZHMgbGF0ZXIgd2hpY2ggd2lsbAorICAgICAqIGF0dGVtcHQgYSBidXMgcmVzZXQuCisgICAgICovCisgIHNhdmVkX3NjYnB0ciA9IGFpY19pbmIocCwgU0NCUFRSKTsKKyAgZGlzY29ubmVjdGVkID0gRkFMU0U7CisKKyAgaWYgKGxhc3RwaGFzZSAhPSBQX0JVU0ZSRUUpCisgIHsKKyAgICBpZiAoYWljX2luYihwLCBTQ0JfVEFHKSA+PSBwLT5zY2JfZGF0YS0+bnVtc2NicykKKyAgICB7CisgICAgICBwcmludGsoV0FSTl9MRUFEICJJbnZhbGlkIFNDQiBJRCAlZCBpcyBhY3RpdmUsICIKKyAgICAgICAgICAgICAiU0NCIGZsYWdzID0gMHgleC5cbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICBDVExfT0ZfQ01EKGNtZCksIHNjYi0+aHNjYi0+dGFnLCBzY2ItPmZsYWdzKTsKKyAgICAgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIEZBTFNFKTsKKyAgICAgIHJldHVybiBGQUlMRUQ7CisgICAgfQorICAgIGlmIChzY2ItPmhzY2ItPnRhZyA9PSBhaWNfaW5iKHAsIFNDQl9UQUcpKQorICAgIHsgCisgICAgICBpZiAoIChsYXN0cGhhc2UgPT0gUF9NRVNHT1VUKSB8fCAobGFzdHBoYXNlID09IFBfTUVTR0lOKSApCisgICAgICB7CisgICAgICAgIHByaW50ayhXQVJOX0xFQUQgIkRldmljZSByZXNldCwgTWVzc2FnZSBidWZmZXIgIgorICAgICAgICAgICAgICAgICJpbiB1c2VcbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgICAgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIEZBTFNFKTsKKwlyZXR1cm4gRkFJTEVEOworICAgICAgfQorCQorICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUkVTRVRfUFJPQ0VTUykKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiRGV2aWNlIHJlc2V0IG1lc3NhZ2UgaW4gIgorICAgICAgICAgICAgICAibWVzc2FnZSBidWZmZXJcbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgICBzY2ItPmZsYWdzIHw9IFNDQl9SRVNFVCB8IFNDQl9ERVZJQ0VfUkVTRVQ7CisgICAgICBhaWM3eHh4X2Vycm9yKGNtZCkgPSBESURfUkVTRVQ7CisgICAgICBhaWNfZGV2LT5mbGFncyB8PSBCVVNfREVWSUNFX1JFU0VUX1BFTkRJTkc7CisgICAgICAvKiBTZW5kIHRoZSBhYm9ydCBtZXNzYWdlIHRvIHRoZSBhY3RpdmUgU0NCLiAqLworICAgICAgYWljX291dGIocCwgSE9TVF9NU0csIE1TR19PVVQpOworICAgICAgYWljX291dGIocCwgbGFzdHBoYXNlIHwgQVROTywgU0NTSVNJR08pOworICAgICAgdW5wYXVzZV9zZXF1ZW5jZXIocCwgRkFMU0UpOworICAgICAgc3Bpbl91bmxvY2tfaXJxKHAtPmhvc3QtPmhvc3RfbG9jayk7CisgICAgICBzc2xlZXAoMSk7CisgICAgICBzcGluX2xvY2tfaXJxKHAtPmhvc3QtPmhvc3RfbG9jayk7CisgICAgICBpZihhaWNfZGV2LT5mbGFncyAmIEJVU19ERVZJQ0VfUkVTRVRfUEVORElORykKKyAgICAgICAgcmV0dXJuIEZBSUxFRDsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFNVQ0NFU1M7CisgICAgfQorICB9IC8qIGlmIChsYXN0X3BoYXNlICE9IFBfQlVTRlJFRSkuLi4uLmluZGljYXRlcyB3ZSBhcmUgaWRsZSBhbmQgY2FuIHdvcmsgKi8KKyAgLyoKKyAgICogU2ltcGx5IHNldCB0aGUgTUtfTUVTU0FHRSBmbGFnIGFuZCB0aGUgU0VRSU5UIGhhbmRsZXIgd2lsbCBkbworICAgKiB0aGUgcmVzdCBvbiBhIHJlY29ubmVjdC9jb25uZWN0LgorICAgKi8KKyAgc2NiLT5oc2NiLT5jb250cm9sIHw9IE1LX01FU1NBR0U7CisgIHNjYi0+ZmxhZ3MgfD0gU0NCX1JFU0VUIHwgU0NCX0RFVklDRV9SRVNFVDsKKyAgYWljX2Rldi0+ZmxhZ3MgfD0gQlVTX0RFVklDRV9SRVNFVF9QRU5ESU5HOworICAvKgorICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIGNvbW1hbmQgaXMgb24gdGhlIHFpbmZpZm8uICBJZiBpdCBpcywgdGhlbiB3ZSB3aWxsCisgICAqIG5vdCBuZWVkIHRvIHF1ZXVlIHRoZSBjb21tYW5kIGFnYWluIHNpbmNlIHRoZSBjYXJkIHNob3VsZCBzdGFydCBpdCBzb29uCisgICAqLworICBpZiAoYWljN3h4eF9zZWFyY2hfcWluZmlmbyhwLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLCBoc2NiLT50YWcsCisJCQkgIDAsIFRSVUUsIE5VTEwpID09IDApCisgIHsKKyAgICBkaXNjb25uZWN0ZWQgPSBUUlVFOworICAgIGlmICgoaHNjYl9pbmRleCA9IGFpYzd4eHhfZmluZF9zY2IocCwgc2NiKSkgIT0gU0NCX0xJU1RfTlVMTCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyIHNjYl9jb250cm9sOworCisgICAgICBhaWNfb3V0YihwLCBoc2NiX2luZGV4LCBTQ0JQVFIpOworICAgICAgc2NiX2NvbnRyb2wgPSBhaWNfaW5iKHAsIFNDQl9DT05UUk9MKTsKKyAgICAgIC8qCisgICAgICAgKiBJZiB0aGUgRElTQ09OTkVDVEVEIGJpdCBpcyBub3Qgc2V0IGluIFNDQl9DT05UUk9MLCB0aGVuIHdlIGFyZQorICAgICAgICogYWN0dWFsbHkgb24gdGhlIHdhaXRpbmcgbGlzdCwgbm90IGRpc2Nvbm5lY3RlZCwgYW5kIHdlIGRvbid0CisgICAgICAgKiBuZWVkIHRvIHJlcXVldWUgdGhlIGNvbW1hbmQuCisgICAgICAgKi8KKyAgICAgIGRpc2Nvbm5lY3RlZCA9IChzY2JfY29udHJvbCAmIERJU0NPTk5FQ1RFRCk7CisgICAgICBhaWNfb3V0YihwLCBzY2JfY29udHJvbCB8IE1LX01FU1NBR0UsIFNDQl9DT05UUk9MKTsKKyAgICB9CisgICAgaWYgKGRpc2Nvbm5lY3RlZCkKKyAgICB7CisgICAgICAvKgorICAgICAgICogQWN0dWFsbHkgcmVxdWV1ZSB0aGlzIFNDQiBpbiBjYXNlIHdlIGNhbiBzZWxlY3QgdGhlCisgICAgICAgKiBkZXZpY2UgYmVmb3JlIGl0IHJlY29ubmVjdHMuICBUaGlzIGNhbiByZXN1bHQgaW4gdGhlIGNvbW1hbmQKKyAgICAgICAqIGJlaW5nIG9uIHRoZSBxaW5maWZvIHR3aWNlLCBidXQgd2UgZG9uJ3QgY2FyZSBiZWNhdXNlIGl0IHdpbGwKKyAgICAgICAqIGFsbCBnZXQgY2xlYW5lZCB1cCBpZi93aGVuIHRoZSByZXNldCB0YWtlcyBwbGFjZS4KKyAgICAgICAqLworICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUkVTRVRfUFJPQ0VTUykKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiUXVldWVpbmcgZGV2aWNlIHJlc2V0IGNvbW1hbmQuXG4iLCBwLT5ob3N0X25vLAorCQkgICAgICBDVExfT0ZfU0NCKHNjYikpOworICAgICAgcC0+cWluZmlmb1twLT5xaW5maWZvbmV4dCsrXSA9IHNjYi0+aHNjYi0+dGFnOworICAgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpCisgICAgICAgIGFpY19vdXRiKHAsIHAtPnFpbmZpZm9uZXh0LCBITlNDQl9RT0ZGKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYWljX291dGIocCwgcC0+cWluZmlmb25leHQsIEtFUk5FTF9RSU5QT1MpOworICAgICAgc2NiLT5mbGFncyB8PSBTQ0JfUVVFVUVEX0FCT1JUOworICAgIH0KKyAgfQorICBhaWNfb3V0YihwLCBzYXZlZF9zY2JwdHIsIFNDQlBUUik7CisgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIEZBTFNFKTsKKyAgc3Bpbl91bmxvY2tfaXJxKHAtPmhvc3QtPmhvc3RfbG9jayk7CisgIG1zbGVlcCgxMDAwLzQpOworICBzcGluX2xvY2tfaXJxKHAtPmhvc3QtPmhvc3RfbG9jayk7CisgIGlmKGFpY19kZXYtPmZsYWdzICYgQlVTX0RFVklDRV9SRVNFVF9QRU5ESU5HKQorICAgIHJldHVybiBGQUlMRUQ7CisgIGVsc2UKKyAgICByZXR1cm4gU1VDQ0VTUzsKK30KKworCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfcGFuaWNfYWJvcnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgQWJvcnQgdGhlIGN1cnJlbnQgU0NTSSBjb21tYW5kKHMpLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9wYW5pY19hYm9ydChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBTY3NpX0NtbmQgKmNtZCkKK3sKKworICBwcmludGsoImFpYzd4eHggZHJpdmVyIHZlcnNpb24gJXNcbiIsIEFJQzdYWFhfQ19WRVJTSU9OKTsKKyAgcHJpbnRrKCJDb250cm9sbGVyIHR5cGU6XG4gICAgJXNcbiIsIGJvYXJkX25hbWVzW3AtPmJvYXJkX25hbWVfaW5kZXhdKTsKKyAgcHJpbnRrKCJwLT5mbGFncz0weCVseCwgcC0+Y2hpcD0weCV4LCBwLT5mZWF0dXJlcz0weCV4LCAiCisgICAgICAgICAic2VxdWVuY2VyICVzIHBhdXNlZFxuIiwKKyAgICAgcC0+ZmxhZ3MsIHAtPmNoaXAsIHAtPmZlYXR1cmVzLAorICAgIChhaWNfaW5iKHAsIEhDTlRSTCkgJiBQQVVTRSkgPyAiaXMiIDogImlzbid0IiApOworICBwYXVzZV9zZXF1ZW5jZXIocCk7CisgIGRpc2FibGVfaXJxKHAtPmlycSk7CisgIGFpYzd4eHhfcHJpbnRfY2FyZChwKTsKKyAgYWljN3h4eF9wcmludF9zY3JhdGNoX3JhbShwKTsKKyAgc3Bpbl91bmxvY2tfaXJxKHAtPmhvc3QtPmhvc3RfbG9jayk7CisgIGZvcig7OykgYmFycmllcigpOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfYWJvcnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgQWJvcnQgdGhlIGN1cnJlbnQgU0NTSSBjb21tYW5kKHMpLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X2Fib3J0KFNjc2lfQ21uZCAqY21kKQoreworICBzdHJ1Y3QgYWljN3h4eF9zY2IgICpzY2IgPSBOVUxMOworICBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwOworICBpbnQgICAgZm91bmQ9MCwgZGlzY29ubmVjdGVkOworICB1bnNpZ25lZCBjaGFyIHNhdmVkX2hzY2JwdHIsIGhzY2JwdHIsIHNjYl9jb250cm9sOworICBzdHJ1Y3QgYWljX2Rldl9kYXRhICphaWNfZGV2OworCisgIGlmKGNtZCA9PSBOVUxMKQorICB7CisgICAgcHJpbnRrKEtFUk5fRVJSICJhaWM3eHh4X2Fib3J0OiBjYWxsZWQgd2l0aCBOVUxMIGNtZCFcbiIpOworICAgIHJldHVybiBGQUlMRUQ7CisgIH0KKyAgcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworICBhaWNfZGV2ID0gQUlDX0RFVihjbWQpOworICBpZihhaWM3eHh4X3Bvc2l0aW9uKGNtZCkgPCBwLT5zY2JfZGF0YS0+bnVtc2NicykKKyAgICBzY2IgPSAocC0+c2NiX2RhdGEtPnNjYl9hcnJheVthaWM3eHh4X3Bvc2l0aW9uKGNtZCldKTsKKyAgZWxzZQorICAgIHJldHVybiBGQUlMRUQ7CisKKyAgYWljN3h4eF9pc3IocC0+aXJxLCAodm9pZCAqKXAsIE5VTEwpOworICBhaWM3eHh4X2RvbmVfY21kc19jb21wbGV0ZShwKTsKKyAgLyogSWYgdGhlIGNvbW1hbmQgd2FzIGFscmVhZHkgY29tcGxldGUgb3IganVzdCBjb21wbGV0ZWQsIHRoZW4gd2UgZGlkbid0CisgICAqIGRvIGEgcmVzZXQsIHJldHVybiBGQUlMRUQgKi8KKyAgaWYoIShzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkpCisgICAgcmV0dXJuIEZBSUxFRDsKKworICBwYXVzZV9zZXF1ZW5jZXIocCk7CisKKyAgLyoKKyAgICogSSBhZGRlZCBhIG5ldyBjb25maWcgb3B0aW9uIHRvIHRoZSBkcml2ZXI6ICJwYW5pY19vbl9hYm9ydCIgdGhhdCB3aWxsCisgICAqIGNhdXNlIHRoZSBkcml2ZXIgdG8gcGFuaWMgYW5kIHRoZSBtYWNoaW5lIHRvIHN0b3Agb24gdGhlIGZpcnN0IGFib3J0CisgICAqIG9yIHJlc2V0IGNhbGwgaW50byB0aGUgZHJpdmVyLiAgQXQgdGhhdCBwb2ludCwgaXQgcHJpbnRzIG91dCBhIGxvdCBvZgorICAgKiB1c2VmdWwgaW5mb3JtYXRpb24gZm9yIG1lIHdoaWNoIEkgY2FuIHRoZW4gdXNlIHRvIHRyeSBhbmQgZGVidWcgdGhlCisgICAqIHByb2JsZW0uICBTaW1wbHkgZW5hYmxlIHRoZSBib290IHRpbWUgcHJvbXB0IGluIG9yZGVyIHRvIGFjdGl2YXRlIHRoaXMKKyAgICogY29kZS4KKyAgICovCisgIGlmIChhaWM3eHh4X3BhbmljX29uX2Fib3J0KQorICAgIGFpYzd4eHhfcGFuaWNfYWJvcnQocCwgY21kKTsKKworICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9BQk9SVCkKKyAgeworICAgIHByaW50ayhJTkZPX0xFQUQgIkFib3J0aW5nIHNjYiAlZCwgZmxhZ3MgMHgleCwgU0VRQUREUiAweCV4LCBMQVNUUEhBU0UgIgorICAgICAgICAgICAiMHgleFxuIiwKKyAgICAgICAgIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSwgc2NiLT5oc2NiLT50YWcsIHNjYi0+ZmxhZ3MsCisgICAgICAgICBhaWNfaW5iKHAsIFNFUUFERFIwKSB8IChhaWNfaW5iKHAsIFNFUUFERFIxKSA8PCA4KSwKKyAgICAgICAgIGFpY19pbmIocCwgTEFTVFBIQVNFKSk7CisgICAgcHJpbnRrKElORk9fTEVBRCAiU0dfQ0FDSEVQVFIgMHgleCwgU0dfQ09VTlQgJWQsIFNDU0lTSUdJIDB4JXhcbiIsCisgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYiksIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID8KKyAgICAgICAgIGFpY19pbmIocCwgU0dfQ0FDSEVQVFIpIDogMCwgYWljX2luYihwLCBTR19DT1VOVCksCisgICAgICAgICBhaWNfaW5iKHAsIFNDU0lTSUdJKSk7CisgICAgcHJpbnRrKElORk9fTEVBRCAiU1NUQVQwIDB4JXgsIFNTVEFUMSAweCV4LCBTU1RBVDIgMHgleFxuIiwKKyAgICAgICAgIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSwgYWljX2luYihwLCBTU1RBVDApLAorICAgICAgICAgYWljX2luYihwLCBTU1RBVDEpLCBhaWNfaW5iKHAsIFNTVEFUMikpOworICB9CisKKyAgaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfV0FJVElOR1EpCisgIHsKKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9BQk9SVF9QUk9DRVNTKSAKKyAgICAgIHByaW50ayhJTkZPX0xFQUQgIlNDQiBmb3VuZCBvbiB3YWl0aW5nIGxpc3QgYW5kICIKKyAgICAgICAgICAiYWJvcnRlZC5cbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgc2NicV9yZW1vdmUoJnAtPndhaXRpbmdfc2Nicywgc2NiKTsKKyAgICBzY2JxX3JlbW92ZSgmYWljX2Rldi0+ZGVsYXllZF9zY2JzLCBzY2IpOworICAgIGFpY19kZXYtPmFjdGl2ZV9jbWRzKys7CisgICAgcC0+YWN0aXZlc2NicysrOworICAgIHNjYi0+ZmxhZ3MgJj0gfihTQ0JfV0FJVElOR1EgfCBTQ0JfQUNUSVZFKTsKKyAgICBzY2ItPmZsYWdzIHw9IFNDQl9BQk9SVCB8IFNDQl9RVUVVRURfRk9SX0RPTkU7CisgICAgZ290byBzdWNjZXNzOworICB9CisKKy8qCisgKiAgV2UganVzdCBjaGVja2VkIHRoZSB3YWl0aW5nX3EsIG5vdyBmb3IgdGhlIFFJTkZJRk8KKyAqLworICBpZiAoICgoZm91bmQgPSBhaWM3eHh4X3NlYXJjaF9xaW5maWZvKHAsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICBjbWQtPmRldmljZS0+bHVuLCBzY2ItPmhzY2ItPnRhZywgU0NCX0FCT1JUIHwgU0NCX1FVRVVFRF9GT1JfRE9ORSwKKyAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBOVUxMKSkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfQUJPUlRfUFJPQ0VTUykpCisgIHsKKyAgICBwcmludGsoSU5GT19MRUFEICJTQ0IgZm91bmQgaW4gUUlORklGTyBhbmQgYWJvcnRlZC5cbiIsIHAtPmhvc3Rfbm8sCisJCSAgICBDVExfT0ZfU0NCKHNjYikpOworICAgIGdvdG8gc3VjY2VzczsKKyAgfQorCisvKgorICogIFFJTkZJRk8sIHdhaXRpbmdxLCBjb21wbGV0ZXEgZG9uZS4gIE5leHQsIGNoZWNrIFdBSVRJTkdfU0NCIGxpc3QgaW4gY2FyZAorICovCisKKyAgc2F2ZWRfaHNjYnB0ciA9IGFpY19pbmIocCwgU0NCUFRSKTsKKyAgaWYgKChoc2NicHRyID0gYWljN3h4eF9maW5kX3NjYihwLCBzY2IpKSAhPSBTQ0JfTElTVF9OVUxMKQorICB7CisgICAgYWljX291dGIocCwgaHNjYnB0ciwgU0NCUFRSKTsKKyAgICBzY2JfY29udHJvbCA9IGFpY19pbmIocCwgU0NCX0NPTlRST0wpOworICAgIGRpc2Nvbm5lY3RlZCA9IHNjYl9jb250cm9sICYgRElTQ09OTkVDVEVEOworICAgIC8qCisgICAgICogSWYgdGhlIERJU0NPTk5FQ1RFRCBiaXQgaXMgbm90IHNldCBpbiBTQ0JfQ09OVFJPTCwgdGhlbiB3ZSBhcmUKKyAgICAgKiBlaXRoZXIgY3VycmVudGx5IGFjdGl2ZSBvciBvbiB0aGUgd2FpdGluZyBsaXN0LgorICAgICAqLworICAgIGlmKCFkaXNjb25uZWN0ZWQgJiYgYWljX2luYihwLCBMQVNUUEhBU0UpID09IFBfQlVTRlJFRSkgeworICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfQUJPUlRfUFJPQ0VTUykKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiU0NCIGZvdW5kIG9uIGhhcmR3YXJlIHdhaXRpbmciCisgICAgICAgICAgIiBsaXN0IGFuZCBhYm9ydGVkLlxuIiwgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgIC8qIElmIHdlIGFyZSB0aGUgb25seSB3YWl0aW5nIGNvbW1hbmQsIHN0b3AgdGhlIHNlbGVjdGlvbiBlbmdpbmUgKi8KKyAgICAgIGlmIChhaWNfaW5iKHAsIFdBSVRJTkdfU0NCSCkgPT0gaHNjYnB0ciAmJiBhaWNfaW5iKHAsIFNDQl9ORVhUKSA9PQorCQkJU0NCX0xJU1RfTlVMTCkKKyAgICAgIHsKKyAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQ1NJU0VRKSAmIH5FTlNFTE8sIFNDU0lTRVEpOworICAgICAgICBhaWNfb3V0YihwLCBDTFJTRUxUSU1FTywgQ0xSU0lOVDEpOworCWFpY19vdXRiKHAsIFNDQl9MSVNUX05VTEwsIFdBSVRJTkdfU0NCSCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisJdW5zaWduZWQgY2hhciBwcmV2LCBuZXh0OworCXByZXYgPSBTQ0JfTElTVF9OVUxMOworCW5leHQgPSBhaWNfaW5iKHAsIFdBSVRJTkdfU0NCSCk7CisJd2hpbGUobmV4dCAhPSBTQ0JfTElTVF9OVUxMKQorCXsKKwkgIGFpY19vdXRiKHAsIG5leHQsIFNDQlBUUik7CisJICBpZiAobmV4dCA9PSBoc2NicHRyKQorCSAgeworCSAgICBuZXh0ID0gYWljX2luYihwLCBTQ0JfTkVYVCk7CisJICAgIGlmIChwcmV2ICE9IFNDQl9MSVNUX05VTEwpCisJICAgIHsKKwkgICAgICBhaWNfb3V0YihwLCBwcmV2LCBTQ0JQVFIpOworCSAgICAgIGFpY19vdXRiKHAsIG5leHQsIFNDQl9ORVhUKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgICAgYWljX291dGIocCwgbmV4dCwgV0FJVElOR19TQ0JIKTsKKwkgICAgYWljX291dGIocCwgaHNjYnB0ciwgU0NCUFRSKTsKKwkgICAgbmV4dCA9IFNDQl9MSVNUX05VTEw7CisJICB9CisJICBlbHNlCisJICB7CisJICAgIHByZXYgPSBuZXh0OworCSAgICBuZXh0ID0gYWljX2luYihwLCBTQ0JfTkVYVCk7CisJICB9CisJfQorICAgICAgfQorICAgICAgYWljX291dGIocCwgU0NCX0xJU1RfTlVMTCwgU0NCX1RBRyk7CisgICAgICBhaWNfb3V0YihwLCAwLCBTQ0JfQ09OVFJPTCk7CisgICAgICBhaWM3eHh4X2FkZF9jdXJzY2JfdG9fZnJlZV9saXN0KHApOworICAgICAgc2NiLT5mbGFncyA9IFNDQl9BQk9SVCB8IFNDQl9RVUVVRURfRk9SX0RPTkU7CisgICAgICBnb3RvIHN1Y2Nlc3M7CisgICAgfQorICAgIGVsc2UgaWYgKCFkaXNjb25uZWN0ZWQpCisgICAgeworICAgICAgLyoKKyAgICAgICAqIFdlIGFyZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBjb21tYW5kCisgICAgICAgKi8KKyAgICAgIGlmKChhaWNfaW5iKHAsIExBU1RQSEFTRSkgPT0gUF9NRVNHSU4pIHx8CisJIChhaWNfaW5iKHAsIExBU1RQSEFTRSkgPT0gUF9NRVNHT1VUKSkKKyAgICAgIHsKKwkvKgorCSAqIE1lc3NhZ2UgYnVmZmVyIGJ1c3ksIHVuYWJsZSB0byBhYm9ydAorCSAqLworCXByaW50ayhJTkZPX0xFQUQgIm1lc3NhZ2UgYnVmZmVyIGJ1c3ksIHVuYWJsZSB0byBhYm9ydC5cbiIsCisJCQkgIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisJdW5wYXVzZV9zZXF1ZW5jZXIocCwgRkFMU0UpOworCXJldHVybiBGQUlMRUQ7CisgICAgICB9CisgICAgICAvKiBGYWxsdGhyb3VnaCB0byBiZWxvdywgc2V0IEFUTk8gYWZ0ZXIgd2Ugc2V0IFNDQl9DT05UUk9MICovCisgICAgfSAKKyAgICBhaWNfb3V0YihwLCAgc2NiX2NvbnRyb2wgfCBNS19NRVNTQUdFLCBTQ0JfQ09OVFJPTCk7CisgICAgaWYoIWRpc2Nvbm5lY3RlZCkKKyAgICB7CisgICAgICBhaWNfb3V0YihwLCBIT1NUX01TRywgTVNHX09VVCk7CisgICAgICBhaWNfb3V0YihwLCBhaWNfaW5iKHAsIFNDU0lTSUdJKSB8IEFUTk8sIFNDU0lTSUdPKTsKKyAgICB9CisgICAgYWljX291dGIocCwgc2F2ZWRfaHNjYnB0ciwgU0NCUFRSKTsKKyAgfSAKKyAgZWxzZQorICB7CisgICAgLyoKKyAgICAgKiBUaGUgc2NiIGlzbid0IGluIHRoZSBjYXJkIGF0IGFsbCBhbmQgaXQgaXMgYWN0aXZlIGFuZCBpdCBpc24ndCBpbgorICAgICAqIGFueSBvZiB0aGUgcXVldWVzLCBzbyBpdCBtdXN0IGJlIGRpc2Nvbm5lY3RlZCBhbmQgcGFnZWQgb3V0LiAgRmFsbAorICAgICAqIHRocm91Z2ggdG8gdGhlIGNvZGUgYmVsb3cuCisgICAgICovCisgICAgZGlzY29ubmVjdGVkID0gMTsKKyAgfQorICAgICAgICAKKyAgcC0+ZmxhZ3MgfD0gQUhDX0FCT1JUX1BFTkRJTkc7CisgIHNjYi0+ZmxhZ3MgfD0gU0NCX1FVRVVFRF9BQk9SVCB8IFNDQl9BQk9SVCB8IFNDQl9SRUNPVkVSWV9TQ0I7CisgIHNjYi0+aHNjYi0+Y29udHJvbCB8PSBNS19NRVNTQUdFOworICBpZihkaXNjb25uZWN0ZWQpCisgIHsKKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9BQk9SVF9QUk9DRVNTKQorICAgICAgcHJpbnRrKElORk9fTEVBRCAiU0NCIGRpc2Nvbm5lY3RlZC4gIFF1ZXVlaW5nIEFib3J0IgorICAgICAgICAiIFNDQi5cbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgcC0+cWluZmlmb1twLT5xaW5maWZvbmV4dCsrXSA9IHNjYi0+aHNjYi0+dGFnOworICAgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19RVUVVRV9SRUdTKQorICAgICAgYWljX291dGIocCwgcC0+cWluZmlmb25leHQsIEhOU0NCX1FPRkYpOworICAgIGVsc2UKKyAgICAgIGFpY19vdXRiKHAsIHAtPnFpbmZpZm9uZXh0LCBLRVJORUxfUUlOUE9TKTsKKyAgfQorICB1bnBhdXNlX3NlcXVlbmNlcihwLCBGQUxTRSk7CisgIHNwaW5fdW5sb2NrX2lycShwLT5ob3N0LT5ob3N0X2xvY2spOworICBtc2xlZXAoMTAwMC80KTsKKyAgc3Bpbl9sb2NrX2lycShwLT5ob3N0LT5ob3N0X2xvY2spOworICBpZiAocC0+ZmxhZ3MgJiBBSENfQUJPUlRfUEVORElORykKKyAgeworICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX0FCT1JUX1JFVFVSTikKKyAgICAgIHByaW50ayhJTkZPX0xFQUQgIkFib3J0IG5ldmVyIGRlbGl2ZXJlZCwgcmV0dXJuaW5nIEZBSUxFRFxuIiwgcC0+aG9zdF9ubywKKwkJICAgIENUTF9PRl9DTUQoY21kKSk7CisgICAgcC0+ZmxhZ3MgJj0gfkFIQ19BQk9SVF9QRU5ESU5HOworICAgIHJldHVybiBGQUlMRUQ7CisgIH0KKyAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfQUJPUlRfUkVUVVJOKQorICAgIHByaW50ayhJTkZPX0xFQUQgIkFib3J0IHN1Y2Nlc3NmdWwuXG4iLCBwLT5ob3N0X25vLCBDVExfT0ZfQ01EKGNtZCkpOworICByZXR1cm4gU1VDQ0VTUzsKKworc3VjY2VzczoKKyAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfQUJPUlRfUkVUVVJOKQorICAgIHByaW50ayhJTkZPX0xFQUQgIkFib3J0IHN1Y2Nlc3NmdWwuXG4iLCBwLT5ob3N0X25vLCBDVExfT0ZfQ01EKGNtZCkpOworICBhaWM3eHh4X3J1bl9kb25lX3F1ZXVlKHAsIFRSVUUpOworICB1bnBhdXNlX3NlcXVlbmNlcihwLCBGQUxTRSk7CisgIHJldHVybiBTVUNDRVNTOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfcmVzZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUmVzZXR0aW5nIHRoZSBidXMgYWx3YXlzIHN1Y2NlZWRzIC0gaXMgaGFzIHRvLCBvdGhlcndpc2UgdGhlCisgKiAgIGtlcm5lbCB3aWxsIHBhbmljISBUcnkgYSBzdXJnaWNhbCB0ZWNobmlxdWUgLSBzZW5kaW5nIGEgQlVTCisgKiAgIERFVklDRSBSRVNFVCBtZXNzYWdlIC0gb24gdGhlIG9mZmVuZGluZyB0YXJnZXQgYmVmb3JlIHB1bGxpbmcKKyAqICAgdGhlIFNDU0kgYnVzIHJlc2V0IGxpbmUuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2FpYzd4eHhfcmVzZXQoU2NzaV9DbW5kICpjbWQpCit7CisgIHN0cnVjdCBhaWM3eHh4X3NjYiAqc2NiOworICBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwOworICBzdHJ1Y3QgYWljX2Rldl9kYXRhICphaWNfZGV2OworCisgIHAgPSAoc3RydWN0IGFpYzd4eHhfaG9zdCAqKSBjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisgIGFpY19kZXYgPSBBSUNfREVWKGNtZCk7CisgIGlmKGFpYzd4eHhfcG9zaXRpb24oY21kKSA8IHAtPnNjYl9kYXRhLT5udW1zY2JzKQorICB7CisgICAgc2NiID0gKHAtPnNjYl9kYXRhLT5zY2JfYXJyYXlbYWljN3h4eF9wb3NpdGlvbihjbWQpXSk7CisgICAgaWYgKHNjYi0+Y21kICE9IGNtZCkKKyAgICAgIHNjYiA9IE5VTEw7CisgIH0KKyAgZWxzZQorICB7CisgICAgc2NiID0gTlVMTDsKKyAgfQorCisgIC8qCisgICAqIEkgYWRkZWQgYSBuZXcgY29uZmlnIG9wdGlvbiB0byB0aGUgZHJpdmVyOiAicGFuaWNfb25fYWJvcnQiIHRoYXQgd2lsbAorICAgKiBjYXVzZSB0aGUgZHJpdmVyIHRvIHBhbmljIGFuZCB0aGUgbWFjaGluZSB0byBzdG9wIG9uIHRoZSBmaXJzdCBhYm9ydAorICAgKiBvciByZXNldCBjYWxsIGludG8gdGhlIGRyaXZlci4gIEF0IHRoYXQgcG9pbnQsIGl0IHByaW50cyBvdXQgYSBsb3Qgb2YKKyAgICogdXNlZnVsIGluZm9ybWF0aW9uIGZvciBtZSB3aGljaCBJIGNhbiB0aGVuIHVzZSB0byB0cnkgYW5kIGRlYnVnIHRoZQorICAgKiBwcm9ibGVtLiAgU2ltcGx5IGVuYWJsZSB0aGUgYm9vdCB0aW1lIHByb21wdCBpbiBvcmRlciB0byBhY3RpdmF0ZSB0aGlzCisgICAqIGNvZGUuCisgICAqLworICBpZiAoYWljN3h4eF9wYW5pY19vbl9hYm9ydCkKKyAgICBhaWM3eHh4X3BhbmljX2Fib3J0KHAsIGNtZCk7CisKKyAgcGF1c2Vfc2VxdWVuY2VyKHApOworCisgIHdoaWxlKChhaWNfaW5iKHAsIElOVFNUQVQpICYgSU5UX1BFTkQpICYmICEocC0+ZmxhZ3MgJiBBSENfSU5fSVNSKSkKKyAgeworICAgIGFpYzd4eHhfaXNyKHAtPmlycSwgcCwgKHZvaWQgKilOVUxMICk7CisgICAgcGF1c2Vfc2VxdWVuY2VyKHApOworICB9CisgIGFpYzd4eHhfZG9uZV9jbWRzX2NvbXBsZXRlKHApOworCisgIGlmKHNjYiAmJiAoc2NiLT5jbWQgPT0gTlVMTCkpCisgIHsKKyAgICAvKgorICAgICAqIFdlIGp1c3QgY29tcGxldGVkIHRoZSBjb21tYW5kIHdoZW4gd2UgcmFuIHRoZSBpc3Igc3R1ZmYsIHNvIHdlIG5vCisgICAgICogbG9uZ2VyIGhhdmUgaXQuCisgICAgICovCisgICAgdW5wYXVzZV9zZXF1ZW5jZXIocCwgRkFMU0UpOworICAgIHJldHVybiBTVUNDRVNTOworICB9CisgICAgCisvKgorICogIEJ5IHRoaXMgcG9pbnQsIHdlIHdhbnQgdG8gYWxyZWFkeSBrbm93IHdoYXQgd2UgYXJlIGdvaW5nIHRvIGRvIGFuZAorICogIG9ubHkgaGF2ZSB0aGUgZm9sbG93aW5nIGNvZGUgaW1wbGVtZW50IG91ciBjb3Vyc2Ugb2YgYWN0aW9uLgorICovCisgIGFpYzd4eHhfcmVzZXRfY2hhbm5lbChwLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwgVFJVRSk7CisgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19UV0lOKQorICB7CisgICAgYWljN3h4eF9yZXNldF9jaGFubmVsKHAsIGNtZC0+ZGV2aWNlLT5jaGFubmVsIF4gMHgwMSwgVFJVRSk7CisgICAgcmVzdGFydF9zZXF1ZW5jZXIocCk7CisgIH0KKyAgYWljX291dGIocCwgIGFpY19pbmIocCwgU0lNT0RFMSkgJiB+KEVOUkVRSU5JVHxFTkJVU0ZSRUUpLCBTSU1PREUxKTsKKyAgYWljN3h4eF9jbGVhcl9pbnRzdGF0KHApOworICBwLT5mbGFncyAmPSB+QUhDX0hBTkRMSU5HX1JFUUlOSVRTOworICBwLT5tc2dfdHlwZSA9IE1TR19UWVBFX05PTkU7CisgIHAtPm1zZ19pbmRleCA9IDA7CisgIHAtPm1zZ19sZW4gPSAwOworICBhaWM3eHh4X3J1bl9kb25lX3F1ZXVlKHAsIFRSVUUpOworICB1bnBhdXNlX3NlcXVlbmNlcihwLCBGQUxTRSk7CisgIHNwaW5fdW5sb2NrX2lycShwLT5ob3N0LT5ob3N0X2xvY2spOworICBzc2xlZXAoMik7CisgIHNwaW5fbG9ja19pcnEocC0+aG9zdC0+aG9zdF9sb2NrKTsKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9iaW9zcGFyYW0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUmV0dXJuIHRoZSBkaXNrIGdlb21ldHJ5IGZvciB0aGUgZ2l2ZW4gU0NTSSBkZXZpY2UuCisgKgorICogTm90ZToKKyAqICAgVGhpcyBmdW5jdGlvbiBpcyBicm9rZW4gZm9yIHRvZGF5J3MgcmVhbGx5IGxhcmdlIGRyaXZlcyBhbmQgbmVlZHMKKyAqICAgZml4ZWQuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2FpYzd4eHhfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJc2VjdG9yX3QgY2FwYWNpdHksIGludCBnZW9tW10pCit7CisgIHNlY3Rvcl90IGhlYWRzLCBzZWN0b3JzLCBjeWxpbmRlcnM7CisgIGludCByZXQ7CisgIHN0cnVjdCBhaWM3eHh4X2hvc3QgKnA7CisgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworICBwID0gKHN0cnVjdCBhaWM3eHh4X2hvc3QgKikgc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisgIGJ1ZiA9IHNjc2lfYmlvc19wdGFibGUoYmRldik7CisKKyAgaWYgKCBidWYgKQorICB7CisgICAgcmV0ID0gc2NzaV9wYXJ0c2l6ZShidWYsIGNhcGFjaXR5LCAmZ2VvbVsyXSwgJmdlb21bMF0sICZnZW9tWzFdKTsKKyAgICBrZnJlZShidWYpOworICAgIGlmICggcmV0ICE9IC0xICkKKyAgICAgIHJldHVybihyZXQpOworICB9CisgIAorICBoZWFkcyA9IDY0OworICBzZWN0b3JzID0gMzI7CisgIGN5bGluZGVycyA9IGNhcGFjaXR5ID4+IDExOworCisgIGlmICgocC0+ZmxhZ3MgJiBBSENfRVhURU5EX1RSQU5TX0EpICYmIChjeWxpbmRlcnMgPiAxMDI0KSkKKyAgeworICAgIGhlYWRzID0gMjU1OworICAgIHNlY3RvcnMgPSA2MzsKKyAgICBjeWxpbmRlcnMgPSBjYXBhY2l0eSA+PiAxNDsKKyAgICBpZihjYXBhY2l0eSA+ICg2NTUzNSAqIGhlYWRzICogc2VjdG9ycykpCisgICAgICBjeWxpbmRlcnMgPSA2NTUzNTsKKyAgICBlbHNlCisgICAgICBjeWxpbmRlcnMgPSAoKHVuc2lnbmVkIGludCljYXBhY2l0eSkgLyAodW5zaWduZWQgaW50KShoZWFkcyAqIHNlY3RvcnMpOworICB9CisKKyAgZ2VvbVswXSA9IChpbnQpaGVhZHM7CisgIGdlb21bMV0gPSAoaW50KXNlY3RvcnM7CisgIGdlb21bMl0gPSAoaW50KWN5bGluZGVyczsKKworICByZXR1cm4gKDApOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfcmVsZWFzZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBGcmVlIHRoZSBwYXNzZWQgaW4gU2NzaV9Ib3N0IG1lbW9yeSBzdHJ1Y3R1cmVzIHByaW9yIHRvIHVubG9hZGluZyB0aGUKKyAqICAgbW9kdWxlLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKyAgc3RydWN0IGFpYzd4eHhfaG9zdCAqcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopIGhvc3QtPmhvc3RkYXRhOworICBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpuZXh0LCAqcHJldjsKKworICBpZihwLT5pcnEpCisgICAgZnJlZV9pcnEocC0+aXJxLCBwKTsKKyNpZmRlZiBNTUFQSU8KKyAgaWYocC0+bWFkZHIpCisgIHsKKyAgICBpb3VubWFwKHAtPm1hZGRyKTsKKyAgfQorI2VuZGlmIC8qIE1NQVBJTyAqLworICBpZighcC0+cGRldikKKyAgICByZWxlYXNlX3JlZ2lvbihwLT5iYXNlLCBNQVhSRUcgLSBNSU5SRUcpOworI2lmZGVmIENPTkZJR19QQ0kKKyAgZWxzZQorICAgIHBjaV9yZWxlYXNlX3JlZ2lvbnMocC0+cGRldik7CisjZW5kaWYKKyAgcHJldiA9IE5VTEw7CisgIG5leHQgPSBmaXJzdF9haWM3eHh4OworICB3aGlsZShuZXh0ICE9IE5VTEwpCisgIHsKKyAgICBpZihuZXh0ID09IHApCisgICAgeworICAgICAgaWYocHJldiA9PSBOVUxMKQorICAgICAgICBmaXJzdF9haWM3eHh4ID0gbmV4dC0+bmV4dDsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJldi0+bmV4dCA9IG5leHQtPm5leHQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwcmV2ID0gbmV4dDsKKyAgICB9CisgICAgbmV4dCA9IG5leHQtPm5leHQ7CisgIH0KKyAgYWljN3h4eF9mcmVlKHApOworICByZXR1cm4oMCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9wcmludF9jYXJkCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFByaW50IG91dCBhbGwgb2YgdGhlIGNvbnRyb2wgcmVnaXN0ZXJzIG9uIHRoZSBjYXJkCisgKgorICogICBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB5ZXQgc2FmZSBmb3IgdXNlIG9uIHRoZSBWTEIgYW5kIEVJU0EKKyAqICAgY29udHJvbGxlcnMsIHNvIGl0IGlzbid0IHVzZWQgb24gdGhvc2UgY29udHJvbGxlcnMgYXQgYWxsLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9wcmludF9jYXJkKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisgIGludCBpLCBqLCBrLCBjaGlwOworICBzdGF0aWMgc3RydWN0IHJlZ2lzdGVyX3JhbmdlcyB7CisgICAgaW50IG51bV9yYW5nZXM7CisgICAgaW50IHJhbmdlX3ZhbFszMl07CisgIH0gY2FyZHNfZHNbXSA9IHsKKyAgICB7IDAsIHswLH0gfSwgLyogbm9uZSAqLworICAgIHsxMCwgezB4MDAsIDB4MDUsIDB4MDgsIDB4MTEsIDB4MTgsIDB4MTksIDB4MWYsIDB4MWYsIDB4NjAsIDB4NjAsIC8qNzc3MSovCisgICAgICAgICAgMHg2MiwgMHg2NiwgMHg4MCwgMHg4ZSwgMHg5MCwgMHg5NSwgMHg5NywgMHg5NywgMHg5YiwgMHg5Zn0gfSwKKyAgICB7IDksIHsweDAwLCAweDA1LCAweDA4LCAweDExLCAweDE4LCAweDFmLCAweDYwLCAweDYwLCAweDYyLCAweDY2LCAvKjc4NTAqLworICAgICAgICAgIDB4ODAsIDB4OGUsIDB4OTAsIDB4OTUsIDB4OTcsIDB4OTcsIDB4OWEsIDB4OWZ9IH0sCisgICAgeyA5LCB7MHgwMCwgMHgwNSwgMHgwOCwgMHgxMSwgMHgxOCwgMHgxZiwgMHg2MCwgMHg2MCwgMHg2MiwgMHg2NiwgLyo3ODYwKi8KKyAgICAgICAgICAweDgwLCAweDhlLCAweDkwLCAweDk1LCAweDk3LCAweDk3LCAweDlhLCAweDlmfSB9LAorICAgIHsxMCwgezB4MDAsIDB4MDUsIDB4MDgsIDB4MTEsIDB4MTgsIDB4MTksIDB4MWMsIDB4MWYsIDB4NjAsIDB4NjAsIC8qNzg3MCovCisgICAgICAgICAgMHg2MiwgMHg2NiwgMHg4MCwgMHg4ZSwgMHg5MCwgMHg5NSwgMHg5NywgMHg5NywgMHg5YSwgMHg5Zn0gfSwKKyAgICB7MTAsIHsweDAwLCAweDA1LCAweDA4LCAweDExLCAweDE4LCAweDFhLCAweDFjLCAweDFmLCAweDYwLCAweDYwLCAvKjc4ODAqLworICAgICAgICAgIDB4NjIsIDB4NjYsIDB4ODAsIDB4OGUsIDB4OTAsIDB4OTUsIDB4OTcsIDB4OTcsIDB4OWEsIDB4OWZ9IH0sCisgICAgezE2LCB7MHgwMCwgMHgwNSwgMHgwOCwgMHgxMSwgMHgxOCwgMHgxZiwgMHg2MCwgMHg2MCwgMHg2MiwgMHg2NiwgLyo3ODkwKi8KKyAgICAgICAgICAweDg0LCAweDhlLCAweDkwLCAweDk1LCAweDk3LCAweDk3LCAweDlhLCAweDlhLCAweDlmLCAweDlmLAorICAgICAgICAgIDB4ZTAsIDB4ZjEsIDB4ZjQsIDB4ZjQsIDB4ZjYsIDB4ZjYsIDB4ZjgsIDB4ZjgsIDB4ZmEsIDB4ZmMsCisgICAgICAgICAgMHhmZSwgMHhmZn0gfSwKKyAgICB7MTIsIHsweDAwLCAweDA1LCAweDA4LCAweDExLCAweDE4LCAweDE5LCAweDFiLCAweDFmLCAweDYwLCAweDYwLCAvKjc4OTUqLworICAgICAgICAgIDB4NjIsIDB4NjYsIDB4ODAsIDB4OGUsIDB4OTAsIDB4OTUsIDB4OTcsIDB4OTcsIDB4OWEsIDB4OWEsCisgICAgICAgICAgMHg5ZiwgMHg5ZiwgMHhlMCwgMHhmMX0gfSwKKyAgICB7MTYsIHsweDAwLCAweDA1LCAweDA4LCAweDExLCAweDE4LCAweDFmLCAweDYwLCAweDYwLCAweDYyLCAweDY2LCAvKjc4OTYqLworICAgICAgICAgIDB4ODQsIDB4OGUsIDB4OTAsIDB4OTUsIDB4OTcsIDB4OTcsIDB4OWEsIDB4OWEsIDB4OWYsIDB4OWYsCisgICAgICAgICAgMHhlMCwgMHhmMSwgMHhmNCwgMHhmNCwgMHhmNiwgMHhmNiwgMHhmOCwgMHhmOCwgMHhmYSwgMHhmYywKKyAgICAgICAgICAweGZlLCAweGZmfSB9LAorICAgIHsxMiwgezB4MDAsIDB4MDUsIDB4MDgsIDB4MTEsIDB4MTgsIDB4MWYsIDB4NjAsIDB4NjAsIDB4NjIsIDB4NjYsIC8qNzg5MiovCisgICAgICAgICAgMHg4NCwgMHg4ZSwgMHg5MCwgMHg5NSwgMHg5NywgMHg5NywgMHg5YSwgMHg5YSwgMHg5YywgMHg5ZiwKKyAgICAgICAgICAweGUwLCAweGYxLCAweGY0LCAweGZjfSB9LAorICAgIHsxMiwgezB4MDAsIDB4MDUsIDB4MDgsIDB4MTEsIDB4MTgsIDB4MWYsIDB4NjAsIDB4NjAsIDB4NjIsIDB4NjYsIC8qNzg5OSovCisgICAgICAgICAgMHg4NCwgMHg4ZSwgMHg5MCwgMHg5NSwgMHg5NywgMHg5NywgMHg5YSwgMHg5YSwgMHg5YywgMHg5ZiwKKyAgICAgICAgICAweGUwLCAweGYxLCAweGY0LCAweGZjfSB9LAorICB9OworICBjaGlwID0gcC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSzsKKyAgcHJpbnRrKCIlcyBhdCAiLAorICAgICAgICAgYm9hcmRfbmFtZXNbcC0+Ym9hcmRfbmFtZV9pbmRleF0pOworICBzd2l0Y2gocC0+Y2hpcCAmIH5BSENfQ0hJUElEX01BU0spCisgIHsKKyAgICBjYXNlIEFIQ19WTDoKKyAgICAgIHByaW50aygiVkxCIFNsb3QgJWQuXG4iLCBwLT5wY2lfZGV2aWNlX2ZuKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUhDX0VJU0E6CisgICAgICBwcmludGsoIkVJU0EgU2xvdCAlZC5cbiIsIHAtPnBjaV9kZXZpY2VfZm4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBSENfUENJOgorICAgIGRlZmF1bHQ6CisgICAgICBwcmludGsoIlBDSSAlZC8lZC8lZC5cbiIsIHAtPnBjaV9idXMsIFBDSV9TTE9UKHAtPnBjaV9kZXZpY2VfZm4pLAorICAgICAgICAgICAgIFBDSV9GVU5DKHAtPnBjaV9kZXZpY2VfZm4pKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyoKKyAgICogdGhlIHJlZ2lzdGVycyBvbiB0aGUgY2FyZC4uLi4KKyAgICovCisgIHByaW50aygiQ2FyZCBEdW1wOlxuIik7CisgIGsgPSAwOworICBmb3IoaT0wOyBpPGNhcmRzX2RzW2NoaXBdLm51bV9yYW5nZXM7IGkrKykKKyAgeworICAgIGZvcihqICA9IGNhcmRzX2RzW2NoaXBdLnJhbmdlX3ZhbFsgaSAqIDIgXTsKKyAgICAgICAgaiA8PSBjYXJkc19kc1tjaGlwXS5yYW5nZV92YWxbIGkgKiAyICsgMSBdIDsKKyAgICAgICAgaisrKQorICAgIHsKKyAgICAgIHByaW50aygiJTAyeDolMDJ4ICIsIGosIGFpY19pbmIocCwgaikpOworICAgICAgaWYoKytrID09IDEzKQorICAgICAgeworICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgIGs9MDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoayAhPSAwKQorICAgIHByaW50aygiXG4iKTsKKworICAvKgorICAgKiBJZiB0aGlzIHdhcyBhbiBVbHRyYTIgY29udHJvbGxlciwgdGhlbiB3ZSBqdXN0IGhvc2VkIHRoZSBjYXJkIGluIHRlcm1zCisgICAqIG9mIHRoZSBRVUVVRSBSRUdTLiAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBhdCBpbml0IHRpbWUgb3IgYnkKKyAgICogdGhlIHBhbmljX2Fib3J0IGZ1bmN0aW9uLCBzbyBpdCdzIHNhZmUgdG8gYXNzdW1lIGEgZ2VuZXJpYyBpbml0IHRpbWUKKyAgICogc2V0dGluZyBoZXJlCisgICAqLworCisgIGlmKHAtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpCisgIHsKKyAgICBhaWNfb3V0YihwLCAwLCBTRFNDQl9RT0ZGKTsKKyAgICBhaWNfb3V0YihwLCAwLCBTTlNDQl9RT0ZGKTsKKyAgICBhaWNfb3V0YihwLCAwLCBITlNDQl9RT0ZGKTsKKyAgfQorCit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9wcmludF9zY3JhdGNoX3JhbQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBQcmludCBvdXQgdGhlIHNjcmF0Y2ggUkFNIHZhbHVlcyBvbiB0aGUgY2FyZC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfcHJpbnRfc2NyYXRjaF9yYW0oc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKyAgaW50IGksIGs7CisKKyAgayA9IDA7CisgIHByaW50aygiU2NyYXRjaCBSQU06XG4iKTsKKyAgZm9yKGkgPSBTUkFNX0JBU0U7IGkgPCBTRVFDVEw7IGkrKykKKyAgeworICAgIHByaW50aygiJTAyeDolMDJ4ICIsIGksIGFpY19pbmIocCwgaSkpOworICAgIGlmKCsrayA9PSAxMykKKyAgICB7CisgICAgICBwcmludGsoIlxuIik7CisgICAgICBrPTA7CisgICAgfQorICB9CisgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19NT1JFX1NSQU0pCisgIHsKKyAgICBmb3IoaSA9IFRBUkdfT0ZGU0VUOyBpIDwgMHg4MDsgaSsrKQorICAgIHsKKyAgICAgIHByaW50aygiJTAyeDolMDJ4ICIsIGksIGFpY19pbmIocCwgaSkpOworICAgICAgaWYoKytrID09IDEzKQorICAgICAgeworICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgIGs9MDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcHJpbnRrKCJcbiIpOworfQorCisKKyNpbmNsdWRlICJhaWM3eHh4X29sZC9haWM3eHh4X3Byb2MuYyIKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX1ZFUlNJT04oQUlDN1hYWF9IX1ZFUlNJT04pOworCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX2luZm8JCT0gYWljN3h4eF9wcm9jX2luZm8sCisJLmRldGVjdAkJCT0gYWljN3h4eF9kZXRlY3QsCisJLnJlbGVhc2UJCT0gYWljN3h4eF9yZWxlYXNlLAorCS5pbmZvCQkJPSBhaWM3eHh4X2luZm8sCQorCS5xdWV1ZWNvbW1hbmQJCT0gYWljN3h4eF9xdWV1ZSwKKwkuc2xhdmVfYWxsb2MJCT0gYWljN3h4eF9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfY29uZmlndXJlCT0gYWljN3h4eF9zbGF2ZV9jb25maWd1cmUsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYWljN3h4eF9zbGF2ZV9kZXN0cm95LAorCS5iaW9zX3BhcmFtCQk9IGFpYzd4eHhfYmlvc3BhcmFtLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gYWljN3h4eF9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIJPSBhaWM3eHh4X2J1c19kZXZpY2VfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IGFpYzd4eHhfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSAyNTUsCisJLnRoaXNfaWQJCT0gLTEsCisJLm1heF9zZWN0b3JzCQk9IDIwNDgsCisJLmNtZF9wZXJfbHVuCQk9IDMsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAorfTsKKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgYWxtb3N0IGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCisgKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKKyAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBmaWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWluZGVudC1sZXZlbDogMgorICogYy1icmFjZS1pbWFnaW5hcnktb2Zmc2V0OiAwCisgKiBjLWJyYWNlLW9mZnNldDogLTIKKyAqIGMtYXJnZGVjbC1pbmRlbnQ6IDIKKyAqIGMtbGFiZWwtb2Zmc2V0OiAtMgorICogYy1jb250aW51ZWQtc3RhdGVtZW50LW9mZnNldDogMgorICogYy1jb250aW51ZWQtYnJhY2Utb2Zmc2V0OiAwCisgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKyAqIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQvYWljN3h4eC5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTE2YzgxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHguaApAQCAtMCwwICsxLDI4IEBACisvKitNKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWRhcHRlYyBBSUM3eHh4IGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NCBKb2huIEF5Y29jaworICogICBUaGUgVW5pdmVyc2l0eSBvZiBDYWxnYXJ5IERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogCisgKiAkSWQ6IGFpYzd4eHguaCx2IDMuMiAxOTk2LzA3LzIzIDAzOjM3OjI2IGRlYW5nIEV4cCAkCisgKi1NKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX2FpYzd4eHhfaAorI2RlZmluZSBfYWljN3h4eF9oCisKKyNkZWZpbmUgQUlDN1hYWF9IX1ZFUlNJT04gICI1LjIuMCIKKworI2VuZGlmIC8qIF9haWM3eHh4X2ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC9haWM3eHh4LnJlZyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC9haWM3eHh4LnJlZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjdiNGJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHgucmVnCkBAIC0wLDAgKzEsMTQwMSBAQAorLyoKKyAqIEFpYzd4eHggcmVnaXN0ZXIgYW5kIHNjcmF0Y2ggcmFtIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NC0xOTk4IEp1c3RpbiBHaWJicy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBpbW1lZGlhdGVseSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorICogMi4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBXaGVyZSB0aGlzIFNvZnR3YXJlIGlzIGNvbWJpbmVkIHdpdGggc29mdHdhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIAorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYW5kIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIHdvdWxkIHJlcXVpcmUgdGhlIAorICogY29tYmluZWQgd29yayB0byBhbHNvIGJlIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMLCB0aGUgdGVybXMKKyAqIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSB3aWxsIGFwcGx5IGluIGFkZGl0aW9uIHRvIHRob3NlIG9mIHRoZQorICogR1BMIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBhbnkgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UgdGhhdAorICogY29uZmxpY3Qgd2l0aCwgb3IgYXJlIGV4cHJlc3NseSBwcm9oaWJpdGVkIGJ5LCB0aGUgR1BMLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJJElkOiBhaWM3eHh4LnJlZyx2IDEuNCAxOTk3LzA2LzI3IDE5OjM4OjM5IGdpYmJzIEV4cCAkCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm9jZXNzZWQgYnkgdGhlIGFpYzd4eHhfYXNtIHV0aWxpdHkgZm9yIHVzZSBpbiBhc3NlbWJsaW5nCisgKiBmaXJtd2FyZSBmb3IgdGhlIGFpYzd4eHggZmFtaWx5IG9mIFNDU0kgaG9zdCBhZGFwdGVycyBhcyB3ZWxsIGFzIHRvIGdlbmVyYXRlCisgKiBhIEMgaGVhZGVyIGZpbGUgZm9yIHVzZSBpbiB0aGUga2VybmVsIHBvcnRpb24gb2YgdGhlIEFpYzd4eHggZHJpdmVyLgorICoKKyAqIEFsbCBwYWdlIG51bWJlcnMgcmVmZXIgdG8gdGhlIEFkYXB0ZWMgQUlDLTc3NzAgRGF0YSBCb29rIGF2YWlsYWJsZSBmcm9tCisgKiBBZGFwdGVjJ3MgVGVjaG5pY2FsIERvY3VtZW50cyBEZXBhcnRtZW50IDEtODAwLTkzNC0yNzY2CisgKi8KKworLyoKKyAqIFNDU0kgU2VxdWVuY2UgQ29udHJvbCAocC4gMy0xMSkuCisgKiBFYWNoIGJpdCwgd2hlbiBzZXQgc3RhcnRzIGEgc3BlY2lmaWMgU0NTSSBzZXF1ZW5jZSBvbiB0aGUgYnVzCisgKi8KK3JlZ2lzdGVyIFNDU0lTRVEgeworCWFkZHJlc3MJCQkweDAwMAorCWFjY2Vzc19tb2RlIFJXCisJYml0CVRFTU9ERQkJMHg4MAorCWJpdAlFTlNFTE8JCTB4NDAKKwliaXQJRU5TRUxJCQkweDIwCisJYml0CUVOUlNFTEkJCTB4MTAKKwliaXQJRU5BVVRPQVROTwkweDA4CisJYml0CUVOQVVUT0FUTkkJMHgwNAorCWJpdAlFTkFVVE9BVE5QCTB4MDIKKwliaXQJU0NTSVJTVE8JMHgwMQorfQorCisvKgorICogU0NTSSBUcmFuc2ZlciBDb250cm9sIDAgUmVnaXN0ZXIgKHBwLiAzLTEzKS4KKyAqIENvbnRyb2xzIHRoZSBTQ1NJIG1vZHVsZSBkYXRhIHBhdGguCisgKi8KK3JlZ2lzdGVyIFNYRlJDVEwwIHsKKwlhZGRyZXNzCQkJMHgwMDEKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlERk9OCQkweDgwCisJYml0CURGUEVYUAkJMHg0MAorCWJpdAlGQVNUMjAJCTB4MjAKKwliaXQJQ0xSU1RDTlQJMHgxMAorCWJpdAlTUElPRU4JCTB4MDgKKwliaXQJU0NBTUVOCQkweDA0CisJYml0CUNMUkNITgkJMHgwMgorfQorCisvKgorICogU0NTSSBUcmFuc2ZlciBDb250cm9sIDEgUmVnaXN0ZXIgKHBwLiAzLTE0LDE1KS4KKyAqIENvbnRyb2xzIHRoZSBTQ1NJIG1vZHVsZSBkYXRhIHBhdGguCisgKi8KK3JlZ2lzdGVyIFNYRlJDVEwxIHsKKwlhZGRyZXNzCQkJMHgwMDIKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlCSVRCVUNLRVQJMHg4MAorCWJpdAlTV1JBUEVOCQkweDQwCisJYml0CUVOU1BDSEsJCTB4MjAKKwltYXNrCVNUSU1FU0VMCTB4MTgKKwliaXQJRU5TVElNRVIJMHgwNAorCWJpdAlBQ1RORUdFTgkweDAyCisJYml0CVNUUFdFTgkJMHgwMQkvKiBQb3dlcmVkIFRlcm1pbmF0aW9uICovCit9CisKKy8qCisgKiBTQ1NJIENvbnRyb2wgU2lnbmFsIFJlYWQgUmVnaXN0ZXIgKHAuIDMtMTUpLgorICogUmVhZHMgdGhlIGFjdHVhbCBzdGF0ZSBvZiB0aGUgU0NTSSBidXMgcGlucworICovCityZWdpc3RlciBTQ1NJU0lHSSB7CisJYWRkcmVzcwkJCTB4MDAzCisJYWNjZXNzX21vZGUgUk8KKwliaXQJQ0RJCQkweDgwCisJYml0CUlPSQkJMHg0MAorCWJpdAlNU0dJCQkweDIwCisJYml0CUFUTkkJCTB4MTAKKwliaXQJU0VMSQkJMHgwOAorCWJpdAlCU1lJCQkweDA0CisJYml0CVJFUUkJCTB4MDIKKwliaXQJQUNLSQkJMHgwMQorLyoKKyAqIFBvc3NpYmxlIHBoYXNlcyBpbiBTQ1NJU0lHSQorICovCisJbWFzawlQSEFTRV9NQVNLCUNESXxJT0l8TVNHSQorCW1hc2sJUF9EQVRBT1VUCTB4MDAKKwltYXNrCVBfREFUQUlOCUlPSQorCW1hc2sJUF9DT01NQU5ECUNESQorCW1hc2sJUF9NRVNHT1VUCUNESXxNU0dJCisJbWFzawlQX1NUQVRVUwlDREl8SU9JCisJbWFzawlQX01FU0dJTglDREl8SU9JfE1TR0kKK30KKworLyoKKyAqIFNDU0kgQ29udHJvbCBTaWduYWwgV3JpdGUgUmVnaXN0ZXIgKHAuIDMtMTYpLgorICogV3JpdGluZyB0byB0aGlzIHJlZ2lzdGVyIG1vZGlmaWVzIHRoZSBjb250cm9sIHNpZ25hbHMgb24gdGhlIGJ1cy4gIE9ubHkKKyAqIHRob3NlIHNpZ25hbHMgdGhhdCBhcmUgYWxsb3dlZCBpbiB0aGUgY3VycmVudCBtb2RlIChJbml0aWF0b3IvVGFyZ2V0KSBhcmUKKyAqIGFzc2VydGVkLgorICovCityZWdpc3RlciBTQ1NJU0lHTyB7CisJYWRkcmVzcwkJCTB4MDAzCisJYWNjZXNzX21vZGUgV08KKwliaXQJQ0RPCQkweDgwCisJYml0CUlPTwkJMHg0MAorCWJpdAlNU0dPCQkweDIwCisJYml0CUFUTk8JCTB4MTAKKwliaXQJU0VMTwkJMHgwOAorCWJpdAlCU1lPCQkweDA0CisJYml0CVJFUU8JCTB4MDIKKwliaXQJQUNLTwkJMHgwMQorLyoKKyAqIFBvc3NpYmxlIHBoYXNlcyB0byB3cml0ZSBpbnRvIFNDU0lTSUcwCisgKi8KKwltYXNrCVBIQVNFX01BU0sJQ0RJfElPSXxNU0dJCisJbWFzawlQX0RBVEFPVVQJMHgwMAorCW1hc2sJUF9EQVRBSU4JSU9JCisJbWFzawlQX0NPTU1BTkQJQ0RJCisJbWFzawlQX01FU0dPVVQJQ0RJfE1TR0kKKwltYXNrCVBfU1RBVFVTCUNESXxJT0kKKwltYXNrCVBfTUVTR0lOCUNESXxJT0l8TVNHSQorfQorCisvKiAKKyAqIFNDU0kgUmF0ZSBDb250cm9sIChwLiAzLTE3KS4KKyAqIENvbnRlbnRzIG9mIHRoaXMgcmVnaXN0ZXIgZGV0ZXJtaW5lIHRoZSBTeW5jaHJvbm91cyBTQ1NJIGRhdGEgdHJhbnNmZXIKKyAqIHJhdGUgYW5kIHRoZSBtYXhpbXVtIHN5bmNocm9ub3VzIFJlcS9BY2sgb2Zmc2V0LiAgQW4gb2Zmc2V0IG9mIDAgaW4gdGhlCisgKiBTT0ZTICgzOjApIGJpdHMgZGlzYWJsZXMgc3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlcnMuICBBbnkgb2Zmc2V0IHZhbHVlCisgKiBncmVhdGVyIHRoYW4gMCBlbmFibGVzIHN5bmNocm9ub3VzIHRyYW5zZmVycy4KKyAqLworcmVnaXN0ZXIgU0NTSVJBVEUgeworCWFkZHJlc3MJCQkweDAwNAorCWFjY2Vzc19tb2RlIFJXCisJYml0CVdJREVYRkVSCTB4ODAJCS8qIFdpZGUgdHJhbnNmZXIgY29udHJvbCAqLworCW1hc2sJU1hGUgkJMHg3MAkJLyogU3luYyB0cmFuc2ZlciByYXRlICovCisJbWFzawlTWEZSX1VMVFJBMgkweDdmCQkvKiBTeW5jIHRyYW5zZmVyIHJhdGUgKi8KKwltYXNrCVNPRlMJCTB4MGYJCS8qIFN5bmMgb2Zmc2V0ICovCit9CisKKy8qCisgKiBTQ1NJIElEIChwLiAzLTE4KS4KKyAqIENvbnRhaW5zIHRoZSBJRCBvZiB0aGUgYm9hcmQgYW5kIHRoZSBjdXJyZW50IHRhcmdldCBvbiB0aGUKKyAqIHNlbGVjdGVkIGNoYW5uZWwuCisgKi8KK3JlZ2lzdGVyIFNDU0lJRAl7CisJYWRkcmVzcwkJCTB4MDA1CisJYWNjZXNzX21vZGUgUlcKKwltYXNrCVRJRAkJMHhmMAkJLyogVGFyZ2V0IElEIG1hc2sgKi8KKwltYXNrCU9JRAkJMHgwZgkJLyogT3VyIElEIG1hc2sgKi8KKwkvKgorCSAqIFNDU0kgTWF4aW11bSBPZmZzZXQgKHAuIDQtNjEgYWljNzg5MC85MSBEYXRhIEJvb2spCisJICogVGhlIGFpYzc4OTAvOTEgYWxsb3cgYW4gb2Zmc2V0IG9mIHVwIHRvIDEyNyB0cmFuc2ZlcnMgaW4gYm90aCB3aWRlCisJICogYW5kIG5hcnJvdyBtb2RlLgorCSAqLworCWFsaWFzCVNDU0lPRkZTRVQKKwltYXNrCVNPRlNfVUxUUkEyCTB4N2YJCS8qIFN5bmMgb2Zmc2V0IFUyIGNoaXBzICovCit9CisKKy8qCisgKiBTQ1NJIExhdGNoZWQgRGF0YSAocC4gMy0xOSkuCisgKiBSZWFkL1dyaXRlIGxhdGNoZXMgdXNlZCB0byB0cmFuc2ZlciBkYXRhIG9uIHRoZSBTQ1NJIGJ1cyBkdXJpbmcKKyAqIEF1dG9tYXRpYyBvciBNYW51YWwgUElPIG1vZGUuICBTQ1NJREFUSCBjYW4gYmUgdXNlZCBmb3IgdGhlCisgKiB1cHBlciBieXRlIG9mIGEgMTZiaXQgd2lkZSBhc3luY2hyb25vdXNlIGRhdGEgcGhhc2UgdHJhbnNmZXIuCisgKi8KK3JlZ2lzdGVyIFNDU0lEQVRMIHsKKwlhZGRyZXNzCQkJMHgwMDYKKwlhY2Nlc3NfbW9kZSBSVworfQorCityZWdpc3RlciBTQ1NJREFUSCB7CisJYWRkcmVzcwkJCTB4MDA3CisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIFNDU0kgVHJhbnNmZXIgQ291bnQgKHBwLiAzLTE5LDIwKQorICogVGhlc2UgcmVnaXN0ZXJzIGNvdW50IGRvd24gdGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZAorICogYWNyb3NzIHRoZSBTQ1NJIGJ1cy4gIFRoZSBjb3VudGVyIGlzIGRlY3JlbWVudGVkIG9ubHkgb25jZQorICogdGhlIGRhdGEgaGFzIGJlZW4gc2FmZWx5IHRyYW5zZmVycmVkLiAgU0RPTkUgaW4gU1NUQVQwIGlzCisgKiBzZXQgd2hlbiBTVENOVCBnb2VzIHRvIDAKKyAqLyAKK3JlZ2lzdGVyIFNUQ05UIHsKKwlhZGRyZXNzCQkJMHgwMDgKKwlzaXplCTMKKwlhY2Nlc3NfbW9kZSBSVworfQorCisvKgorICogT3B0aW9uIE1vZGUgUmVnaXN0ZXIgKEFsdGVybmF0ZSBNb2RlKSAocC4gNS0xOTgpCisgKiBUaGlzIHJlZ2lzdGVyIGlzIHVzZWQgdG8gc2V0IGNlcnRhaW4gb3B0aW9ucyBvbiBVbHRyYTMgYmFzZWQgY2hpcHMuCisgKiBUaGUgY2hpcCBtdXN0IGJlIGluIGFsdGVybmF0ZSBtb2RlIChiaXQgQUxUX01PREUgaW4gU0ZVTkNUIG11c3QgYmUgc2V0KQorICovCityZWdpc3RlciBPUFRJT05NT0RFIHsKKwlhZGRyZXNzCQkJMHgwMDgKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlBVVRPUkFURUVOCTB4ODAKKwliaXQJQVVUT0FDS0VOCTB4NDAKKwliaXQJQVROTUdNTlRFTgkweDIwCisJYml0CUJVU0ZSRUVSRVYJMHgxMAorCWJpdAlFWFBQSEFTRURJUwkweDA4CisJYml0CVNDU0lEQVRMX0lNR0VOCTB4MDQKKwliaXQJQVVUT19NU0dPVVRfREUJMHgwMgorCWJpdAlESVNfTVNHSU5fRFVBTEVER0UJMHgwMQorfQorCisKKy8qCisgKiBDbGVhciBTQ1NJIEludGVycnVwdCAwIChwLiAzLTIwKQorICogV3JpdGluZyBhIDEgdG8gYSBiaXQgY2xlYXJzIHRoZSBhc3NvY2lhdGVkIFNDU0kgSW50ZXJydXB0IGluIFNTVEFUMC4KKyAqLworcmVnaXN0ZXIgQ0xSU0lOVDAgeworCWFkZHJlc3MJCQkweDAwYgorCWFjY2Vzc19tb2RlIFdPCisJYml0CUNMUlNFTERPCTB4NDAKKwliaXQJQ0xSU0VMREkJMHgyMAorCWJpdAlDTFJTRUxJTkdPCTB4MTAKKwliaXQJQ0xSU1dSQVAJMHgwOAorCWJpdAlDTFJTUElPUkRZCTB4MDIKK30KKworLyoKKyAqIFNDU0kgU3RhdHVzIDAgKHAuIDMtMjEpCisgKiBDb250YWlucyBvbmUgc2V0IG9mIFNDU0kgSW50ZXJydXB0IGNvZGVzCisgKiBUaGVzZSBhcmUgbW9zdCBsaWtlbHkgb2YgaW50ZXJlc3QgdG8gdGhlIHNlcXVlbmNlcgorICovCityZWdpc3RlciBTU1RBVDAJeworCWFkZHJlc3MJCQkweDAwYgorCWFjY2Vzc19tb2RlIFJPCisJYml0CVRBUkdFVAkJMHg4MAkvKiBCb2FyZCBhY3RpbmcgYXMgdGFyZ2V0ICovCisJYml0CVNFTERPCQkweDQwCS8qIFNlbGVjdGlvbiBEb25lICovCisJYml0CVNFTERJCQkweDIwCS8qIEJvYXJkIGhhcyBiZWVuIHNlbGVjdGVkICovCisJYml0CVNFTElOR08JCTB4MTAJLyogU2VsZWN0aW9uIEluIFByb2dyZXNzICovCisJYml0CVNXUkFQCQkweDA4CS8qIDI0Yml0IGNvdW50ZXIgd3JhcCAqLworCWJpdAlJT0VSUgkJMHgwOAkvKiBMVkQgVHJhbmNlaXZlciBtb2RlIGNoYW5nZWQgKi8KKwliaXQJU0RPTkUJCTB4MDQJLyogU1RDTlQgPSAweDAwMDAwMCAqLworCWJpdAlTUElPUkRZCQkweDAyCS8qIFNDU0kgUElPIFJlYWR5ICovCisJYml0CURNQURPTkUJCTB4MDEJLyogRE1BIHRyYW5zZmVyIGNvbXBsZXRlZCAqLworfQorCisvKgorICogQ2xlYXIgU0NTSSBJbnRlcnJ1cHQgMSAocC4gMy0yMykKKyAqIFdyaXRpbmcgYSAxIHRvIGEgYml0IGNsZWFycyB0aGUgYXNzb2NpYXRlZCBTQ1NJIEludGVycnVwdCBpbiBTU1RBVDEuCisgKi8KK3JlZ2lzdGVyIENMUlNJTlQxIHsKKwlhZGRyZXNzCQkJMHgwMGMKKwlhY2Nlc3NfbW9kZSBXTworCWJpdAlDTFJTRUxUSU1FTwkweDgwCisJYml0CUNMUkFUTk8JCTB4NDAKKwliaXQJQ0xSU0NTSVJTVEkJMHgyMAorCWJpdAlDTFJCVVNGUkVFCTB4MDgKKwliaXQJQ0xSU0NTSVBFUlIJMHgwNAorCWJpdAlDTFJQSEFTRUNIRwkweDAyCisJYml0CUNMUlJFUUlOSVQJMHgwMQorfQorCisvKgorICogU0NTSSBTdGF0dXMgMSAocC4gMy0yNCkKKyAqLworcmVnaXN0ZXIgU1NUQVQxCXsKKwlhZGRyZXNzCQkJMHgwMGMKKwlhY2Nlc3NfbW9kZSBSTworCWJpdAlTRUxUTwkJMHg4MAorCWJpdAlBVE5UQVJHIAkweDQwCisJYml0CVNDU0lSU1RJCTB4MjAKKwliaXQJUEhBU0VNSVMJMHgxMAorCWJpdAlCVVNGUkVFCQkweDA4CisJYml0CVNDU0lQRVJSCTB4MDQKKwliaXQJUEhBU0VDSEcJMHgwMgorCWJpdAlSRVFJTklUCQkweDAxCit9CisKKy8qCisgKiBTQ1NJIFN0YXR1cyAyIChwcC4gMy0yNSwyNikKKyAqLworcmVnaXN0ZXIgU1NUQVQyIHsKKwlhZGRyZXNzCQkJMHgwMGQKKwlhY2Nlc3NfbW9kZSBSTworCWJpdAlPVkVSUlVOCQkweDgwCisJYml0CVNIVkFMSUQJCTB4NDAKKwliaXQJV0lERV9SRVMJMHgyMAorCWJpdAlFWFBfQUNUSVZFCTB4MTAJLyogU0NTSSBFeHBhbmRlciBBY3RpdmUgKi8KKwliaXQJQ1JDVkFMRVJSCTB4MDgJLyogQ1JDIFZhbHVlIEVycm9yICovCisJYml0CUNSQ0VOREVSUgkweDA0CS8qIENSQyBFbmQgRXJyb3IgKi8KKwliaXQJQ1JDUkVRRVJSCTB4MDIJLyogQ1JDIFJFUSBFcnJvciAqLworCWJpdAlEVUFMX0VER0VfRVJST1IJMHgwMQkvKiBJbnZhbGlkIHBpbnMgZm9yIER1YWwgRWRnZSBwaGFzZSAqLworCW1hc2sJU0ZDTlQJCTB4MWYKK30KKworLyoKKyAqIFNDU0kgU3RhdHVzIDMgKHAuIDMtMjYpCisgKi8KK3JlZ2lzdGVyIFNTVEFUMyB7CisJYWRkcmVzcwkJCTB4MDBlCisJYWNjZXNzX21vZGUgUk8KKwltYXNrCVNDU0lDTlQJCTB4ZjAKKwltYXNrCU9GRkNOVAkJMHgwZgorfQorCisvKgorICogU0NTSSBJRCBmb3IgdGhlIGFpYzc4OTAvOTEgY2hpcHMKKyAqLworcmVnaXN0ZXIgU0NTSUlEX1VMVFJBMiB7CisJYWRkcmVzcwkJCTB4MDBmCisJYWNjZXNzX21vZGUgUlcKKwltYXNrCVRJRAkJMHhmMAkJLyogVGFyZ2V0IElEIG1hc2sgKi8KKwltYXNrCU9JRAkJMHgwZgkJLyogT3VyIElEIG1hc2sgKi8KK30KKworLyoKKyAqIFNDU0kgSW50ZXJydXB0IE1vZGUgMSAocC4gMy0yOCkKKyAqIFNldHRpbmcgYW55IGJpdCB3aWxsIGVuYWJsZSB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgorICogaW4gU0lNT0RFMCB0byBpbnRlcnJ1cHQgdmlhIHRoZSBJUlEgcGluLgorICovCityZWdpc3RlciBTSU1PREUwIHsKKwlhZGRyZXNzCQkJMHgwMTAKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlFTlNFTERPCQkweDQwCisJYml0CUVOU0VMREkJCTB4MjAKKwliaXQJRU5TRUxJTkdPCTB4MTAKKwliaXQJRU5TV1JBUAkJMHgwOAorCWJpdAlFTklPRVJSCQkweDA4CS8qIExWRCBUcmFuY2VpdmVyIG1vZGUgY2hhbmdlcyAqLworCWJpdAlFTlNET05FCQkweDA0CisJYml0CUVOU1BJT1JEWQkweDAyCisJYml0CUVORE1BRE9ORQkweDAxCit9CisKKy8qCisgKiBTQ1NJIEludGVycnVwdCBNb2RlIDEgKHBwLiAzLTI4LDI5KQorICogU2V0dGluZyBhbnkgYml0IHdpbGwgZW5hYmxlIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiBpbiBTSU1PREUxIHRvIGludGVycnVwdCB2aWEgdGhlIElSUSBwaW4uCisgKi8KK3JlZ2lzdGVyIFNJTU9ERTEgeworCWFkZHJlc3MJCQkweDAxMQorCWFjY2Vzc19tb2RlIFJXCisJYml0CUVOU0VMVElNTwkweDgwCisJYml0CUVOQVROVEFSRwkweDQwCisJYml0CUVOU0NTSVJTVAkweDIwCisJYml0CUVOUEhBU0VNSVMJMHgxMAorCWJpdAlFTkJVU0ZSRUUJMHgwOAorCWJpdAlFTlNDU0lQRVJSCTB4MDQKKwliaXQJRU5QSEFTRUNIRwkweDAyCisJYml0CUVOUkVRSU5JVAkweDAxCit9CisKKy8qCisgKiBTQ1NJIERhdGEgQnVzIChIaWdoKSAocC4gMy0yOSkKKyAqIFRoaXMgcmVnaXN0ZXIgcmVhZHMgZGF0YSBvbiB0aGUgU0NTSSBEYXRhIGJ1cyBkaXJlY3RseS4KKyAqLworcmVnaXN0ZXIgU0NTSUJVU0wgeworCWFkZHJlc3MJCQkweDAxMgorCWFjY2Vzc19tb2RlIFJPCit9CisKK3JlZ2lzdGVyIFNDU0lCVVNIIHsKKwlhZGRyZXNzCQkJMHgwMTMKKwlhY2Nlc3NfbW9kZSBSTworfQorCisvKgorICogU0NTSS9Ib3N0IEFkZHJlc3MgKHAuIDMtMzApCisgKiBUaGVzZSByZWdpc3RlcnMgaG9sZCB0aGUgaG9zdCBhZGRyZXNzIGZvciB0aGUgYnl0ZSBhYm91dCB0byBiZQorICogdHJhbnNmZXJyZWQgb24gdGhlIFNDU0kgYnVzLiAgVGhleSBhcmUgY291bnRlZCB1cCBpbiB0aGUgc2FtZQorICogbWFubmVyIGFzIFNUQ05UIGlzIGNvdW50ZWQgZG93bi4gIFNIQUREUiBzaG91bGQgYWx3YXlzIGJlIHVzZWQKKyAqIHRvIGRldGVybWluZSB0aGUgYWRkcmVzcyBvZiB0aGUgbGFzdCBieXRlIHRyYW5zZmVycmVkIHNpbmNlIEhBRERSCisgKiBjYW4gYmUgc2tld2VkIGJ5IHdyaXRlIGFoZWFkLgorICovCityZWdpc3RlciBTSEFERFIgeworCWFkZHJlc3MJCQkweDAxNAorCXNpemUJNAorCWFjY2Vzc19tb2RlIFJPCit9CisKKy8qCisgKiBTZWxlY3Rpb24gVGltZW91dCBUaW1lciAocC4gMy0zMCkKKyAqLworcmVnaXN0ZXIgU0VMVElNRVIgeworCWFkZHJlc3MJCQkweDAxOAorCWFjY2Vzc19tb2RlIFJXCisJYml0CVNUQUdFNgkJMHgyMAorCWJpdAlTVEFHRTUJCTB4MTAKKwliaXQJU1RBR0U0CQkweDA4CisJYml0CVNUQUdFMwkJMHgwNAorCWJpdAlTVEFHRTIJCTB4MDIKKwliaXQJU1RBR0UxCQkweDAxCit9CisKKy8qCisgKiBTZWxlY3Rpb24vUmVzZWxlY3Rpb24gSUQgKHAuIDMtMzEpCisgKiBVcHBlciBmb3VyIGJpdHMgYXJlIHRoZSBkZXZpY2UgaWQuICBUaGUgT05FQklUIGlzIHNldCB3aGVuIHRoZSByZS9zZWxlY3RpbmcKKyAqIGRldmljZSBkaWQgbm90IHNldCBpdHMgb3duIElELgorICovCityZWdpc3RlciBTRUxJRCB7CisJYWRkcmVzcwkJCTB4MDE5CisJYWNjZXNzX21vZGUgUlcKKwltYXNrCVNFTElEX01BU0sJMHhmMAorCWJpdAlPTkVCSVQJCTB4MDgKK30KKworLyoKKyAqIFNlcmlhbCBQb3J0IEkvTyBDYWJhYmlsaXR5IHJlZ2lzdGVyIChwLiA0LTk1IGFpYzc4NjAgRGF0YSBCb29rKQorICogSW5kaWNhdGVzIGlmIGV4dGVybmFsIGxvZ2ljIGhhcyBiZWVuIGF0dGFjaGVkIHRvIHRoZSBjaGlwIHRvCisgKiBwZXJmb3JtIHRoZSB0YXNrcyBvZiBhY2Nlc3NpbmcgYSBzZXJpYWwgZWVwcm9tLCB0ZXN0aW5nIHRlcm1pbmF0aW9uCisgKiBzdHJlbmd0aCwgYW5kIHBlcmZvcm1pbmcgY2FibGUgZGV0ZWN0aW9uLiAgT24gdGhlIGFpYzc4NjAsIG1vc3Qgb2YKKyAqIHRoZXNlIGZlYXR1cmVzIGFyZSBoYW5kbGVkIG9uIGNoaXAsIGJ1dCBvbiB0aGUgYWljNzg1NSBhbiBhdHRhY2hlZAorICogYWljMzgwMCBkb2VzIHRoZSBncnVudCB3b3JrLgorICovCityZWdpc3RlciBTUElPQ0FQIHsKKwlhZGRyZXNzCQkJMHgwMWIKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlTT0ZUMQkJMHg4MAorCWJpdAlTT0ZUMAkJMHg0MAorCWJpdAlTT0ZUQ01ERU4JMHgyMAkKKwliaXQJSEFTX0JSRENUTAkweDEwCS8qIEV4dGVybmFsIEJvYXJkIGNvbnRyb2wgKi8KKwliaXQJU0VFUFJPTQkJMHgwOAkvKiBFeHRlcm5hbCBzZXJpYWwgZWVwcm9tIGxvZ2ljICovCisJYml0CUVFUFJPTQkJMHgwNAkvKiBXcml0YWJsZSBleHRlcm5hbCBCSU9TIFJPTSAqLworCWJpdAlST00JCTB4MDIJLyogTG9naWMgZm9yIGFjY2Vzc2luZyBleHRlcm5hbCBST00gKi8KKwliaXQJU1NQSU9DUFMJMHgwMQkvKiBUZXJtaW5hdGlvbiBhbmQgY2FibGUgZGV0ZWN0aW9uICovCit9CisKKy8qCisgKiBTQ1NJIEJsb2NrIENvbnRyb2wgKHAuIDMtMzIpCisgKiBDb250cm9scyBCdXMgdHlwZSBhbmQgY2hhbm5lbCBzZWxlY3Rpb24uICBJbiBhIHR3aW4gY2hhbm5lbCBjb25maWd1cmF0aW9uCisgKiBhZGRyZXNzZXMgMHgwMC0weDFlIGFyZSBnYXRlZCB0byB0aGUgYXBwcm9wcmlhdGUgY2hhbm5lbCBiYXNlZCBvbiB0aGlzCisgKiByZWdpc3Rlci4gIFNFTFdJREUgYWxsb3dzIGZvciB0aGUgY29leGlzdGVuY2Ugb2YgOGJpdCBhbmQgMTZiaXQgZGV2aWNlcworICogb24gYSB3aWRlIGJ1cy4KKyAqLworcmVnaXN0ZXIgU0JMS0NUTCB7CisJYWRkcmVzcwkJCTB4MDFmCisJYWNjZXNzX21vZGUgUlcKKwliaXQJRElBR0xFREVOCTB4ODAJLyogQWljNzhYMCBvbmx5ICovCisJYml0CURJQUdMRURPTgkweDQwCS8qIEFpYzc4WDAgb25seSAqLworCWJpdAlBVVRPRkxVU0hESVMJMHgyMAorCWJpdAlTRUxCVVNCCQkweDA4CisJYml0CUVOQUI0MAkJMHgwOAkvKiBMVkQgdHJhbnNjZWl2ZXIgYWN0aXZlICovCisJYml0CUVOQUIyMAkJMHgwNAkvKiBTRS9IVkQgdHJhbnNjZWl2ZXIgYWN0aXZlICovCisJYml0CVNFTFdJREUJCTB4MDIKKwliaXQJWENWUgkJMHgwMQkvKiBFeHRlcm5hbCB0cmFuc2NlaXZlciBhY3RpdmUgKi8KK30KKworLyoKKyAqIFNlcXVlbmNlciBDb250cm9sIChwLiAzLTMzKQorICogRXJyb3IgZGV0ZWN0aW9uIG1vZGUgYW5kIHNwZWVkIGNvbmZpZ3VyYXRpb24KKyAqLworcmVnaXN0ZXIgU0VRQ1RMIHsKKwlhZGRyZXNzCQkJMHgwNjAKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlQRVJST1JESVMJMHg4MAorCWJpdAlQQVVTRURJUwkweDQwCisJYml0CUZBSUxESVMJCTB4MjAKKwliaXQJRkFTVE1PREUJMHgxMAorCWJpdAlCUktBRFJJTlRFTgkweDA4CisJYml0CVNURVAJCTB4MDQKKwliaXQJU0VRUkVTRVQJMHgwMgorCWJpdAlMT0FEUkFNCQkweDAxCit9CisKKy8qCisgKiBTZXF1ZW5jZXIgUkFNIERhdGEgKHAuIDMtMzQpCisgKiBTaW5nbGUgYnl0ZSB3aW5kb3cgaW50byB0aGUgU2NyYXRjaCBSYW0gYXJlYSBzdGFydGluZyBhdCB0aGUgYWRkcmVzcworICogc3BlY2lmaWVkIGJ5IFNFUUFERFIwIGFuZCBTRVFBRERSMS4gIFRvIHdyaXRlIGEgZnVsbCB3b3JkLCBzaW1wbHkgd3JpdGUKKyAqIGZvdXIgYnl0ZXMgaW4gc3VjY2Vzc2lvbi4gIFRoZSBTRVFBRERScyB3aWxsIGluY3JlbWVudCBhZnRlciB0aGUgbW9zdAorICogc2lnbmlmaWNhbnQgYnl0ZSBpcyB3cml0dGVuCisgKi8KK3JlZ2lzdGVyIFNFUVJBTSB7CisJYWRkcmVzcwkJCTB4MDYxCisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIFNlcXVlbmNlciBBZGRyZXNzIFJlZ2lzdGVycyAocC4gMy0zNSkKKyAqIE9ubHkgdGhlIGZpcnN0IGJpdCBvZiBTRVFBRERSMSBob2xkcyBhZGRyZXNzaW5nIGluZm9ybWF0aW9uCisgKi8KK3JlZ2lzdGVyIFNFUUFERFIwIHsKKwlhZGRyZXNzCQkJMHgwNjIKKwlhY2Nlc3NfbW9kZSBSVworfQorCityZWdpc3RlciBTRVFBRERSMSB7CisJYWRkcmVzcwkJCTB4MDYzCisJYWNjZXNzX21vZGUgUlcKKwltYXNrCVNFUUFERFIxX01BU0sJMHgwMQorfQorCisvKgorICogQWNjdW11bGF0b3IKKyAqIFdlIGNoZWF0IGJ5IHBhc3NpbmcgYXJndW1lbnRzIGluIHRoZSBBY2N1bXVsYXRvciB1cCB0byB0aGUga2VybmVsIGRyaXZlcgorICovCityZWdpc3RlciBBQ0NVTSB7CisJYWRkcmVzcwkJCTB4MDY0CisJYWNjZXNzX21vZGUgUlcKKwlhY2N1bXVsYXRvcgorfQorCityZWdpc3RlciBTSU5ERVgJeworCWFkZHJlc3MJCQkweDA2NQorCWFjY2Vzc19tb2RlIFJXCisJc2luZGV4Cit9CisKK3JlZ2lzdGVyIERJTkRFWCB7CisJYWRkcmVzcwkJCTB4MDY2CisJYWNjZXNzX21vZGUgUlcKK30KKworcmVnaXN0ZXIgQUxMT05FUyB7CisJYWRkcmVzcwkJCTB4MDY5CisJYWNjZXNzX21vZGUgUk8KKwlhbGxvbmVzCit9CisKK3JlZ2lzdGVyIEFMTFpFUk9TIHsKKwlhZGRyZXNzCQkJMHgwNmEKKwlhY2Nlc3NfbW9kZSBSTworCWFsbHplcm9zCit9CisKK3JlZ2lzdGVyIE5PTkUgeworCWFkZHJlc3MJCQkweDA2YQorCWFjY2Vzc19tb2RlIFdPCisJbm9uZQorfQorCityZWdpc3RlciBGTEFHUyB7CisJYWRkcmVzcwkJCTB4MDZiCisJYWNjZXNzX21vZGUgUk8KKwliaXQJWkVSTwkJMHgwMgorCWJpdAlDQVJSWQkJMHgwMQorfQorCityZWdpc3RlciBTSU5ESVIJeworCWFkZHJlc3MJCQkweDA2YworCWFjY2Vzc19tb2RlIFJPCit9CisKK3JlZ2lzdGVyIERJTkRJUgkgeworCWFkZHJlc3MJCQkweDA2ZAorCWFjY2Vzc19tb2RlIFdPCit9CisKK3JlZ2lzdGVyIEZVTkNUSU9OMSB7CisJYWRkcmVzcwkJCTB4MDZlCisJYWNjZXNzX21vZGUgUlcKK30KKworcmVnaXN0ZXIgU1RBQ0sgeworCWFkZHJlc3MJCQkweDA2ZgorCWFjY2Vzc19tb2RlIFJPCit9CisKKy8qCisgKiBCb2FyZCBDb250cm9sIChwLiAzLTQzKQorICovCityZWdpc3RlciBCQ1RMIHsKKwlhZGRyZXNzCQkJMHgwODQKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlBQ0UJCTB4MDgKKwliaXQJRU5BQkxFCQkweDAxCit9CisKK3JlZ2lzdGVyIERTQ09NTUFORDAgeworCWFkZHJlc3MJCQkweDA4NAorCWFjY2Vzc19tb2RlIFJXCisJYml0CUNBQ0hFVEhFTgkweDgwCisJYml0CURQQVJDS0VOCTB4NDAKKwliaXQJTVBBUkNLRU4JMHgyMAorCWJpdAlFWFRSRVFMQ0sJMHgxMAorCWJpdAlJTlRTQ0JSQU1TRUwJMHgwOAorCWJpdAlSQU1QUwkJMHgwNAorCWJpdAlVU0NCU0laRTMyCTB4MDIKKwliaXQJQ0lPUEFSQ0tFTgkweDAxCit9CisKKy8qCisgKiBPbiB0aGUgYWljNzhYMCBjaGlwcywgQm9hcmQgQ29udHJvbCBpcyByZXBsYWNlZCBieSB0aGUgRFNDb21tYW5kCisgKiByZWdpc3RlciAocC4gNC02NCkKKyAqLworcmVnaXN0ZXIgRFNDT01NQU5EIHsKKwlhZGRyZXNzCQkJMHgwODQKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlDQUNIRVRIRU4JMHg4MAkvKiBDYWNoZSBUaHJlc2hvbGQgZW5hYmxlICovCisJYml0CURQQVJDS0VOCTB4NDAJLyogRGF0YSBQYXJpdHkgQ2hlY2sgRW5hYmxlICovCisJYml0CU1QQVJDS0VOCTB4MjAJLyogTWVtb3J5IFBhcml0eSBDaGVjayBFbmFibGUgKi8KKwliaXQJRVhUUkVRTENLCTB4MTAJLyogRXh0ZXJuYWwgUmVxdWVzdCBMb2NrICovCit9CisKKy8qCisgKiBCdXMgT24vT2ZmIFRpbWUgKHAuIDMtNDQpCisgKi8KK3JlZ2lzdGVyIEJVU1RJTUUgeworCWFkZHJlc3MJCQkweDA4NQorCWFjY2Vzc19tb2RlIFJXCisJbWFzawlCT0ZGCQkweGYwCisJbWFzawlCT04JCTB4MGYKK30KKworLyoKKyAqIEJ1cyBTcGVlZCAocC4gMy00NSkKKyAqLworcmVnaXN0ZXIgQlVTU1BEIHsKKwlhZGRyZXNzCQkJMHgwODYKKwlhY2Nlc3NfbW9kZSBSVworCW1hc2sJREZUSFJTSAkJMHhjMAorCW1hc2sJU1RCT0ZGCQkweDM4CisJbWFzawlTVEJPTgkJMHgwNworCW1hc2sJREZUSFJTSF8xMDAJMHhjMAorfQorCisvKgorICogSG9zdCBDb250cm9sIChwLiAzLTQ3KSBSL1cKKyAqIE92ZXJhbGwgaG9zdCBjb250cm9sIG9mIHRoZSBkZXZpY2UuCisgKi8KK3JlZ2lzdGVyIEhDTlRSTCB7CisJYWRkcmVzcwkJCTB4MDg3CisJYWNjZXNzX21vZGUgUlcKKwliaXQJUE9XUkROCQkweDQwCisJYml0CVNXSU5UCQkweDEwCisJYml0CUlSUU1TCQkweDA4CisJYml0CVBBVVNFCQkweDA0CisJYml0CUlOVEVOCQkweDAyCisJYml0CUNISVBSU1QJCTB4MDEKKwliaXQJQ0hJUFJTVEFDSwkweDAxCit9CisKKy8qCisgKiBIb3N0IEFkZHJlc3MgKHAuIDMtNDgpCisgKiBUaGlzIHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSBieXRlIGFib3V0CisgKiB0byBiZSB0cmFuc2ZlcnJlZCBhY3Jvc3MgdGhlIGhvc3QgYnVzLgorICovCityZWdpc3RlciBIQUREUiB7CisJYWRkcmVzcwkJCTB4MDg4CisJc2l6ZQk0CisJYWNjZXNzX21vZGUgUlcKK30KKworcmVnaXN0ZXIgSENOVCB7CisJYWRkcmVzcwkJCTB4MDhjCisJc2l6ZQkzCisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIFNDQiBQb2ludGVyIChwLiAzLTQ5KQorICogR2F0ZSBvbmUgb2YgdGhlIGZvdXIgU0NCcyBpbnRvIHRoZSBTQ0JBUlJBWSB3aW5kb3cuCisgKi8KK3JlZ2lzdGVyIFNDQlBUUiB7CisJYWRkcmVzcwkJCTB4MDkwCisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIEludGVycnVwdCBTdGF0dXMgKHAuIDMtNTApCisgKiBTdGF0dXMgZm9yIHN5c3RlbSBpbnRlcnJ1cHRzCisgKi8KK3JlZ2lzdGVyIElOVFNUQVQgeworCWFkZHJlc3MJCQkweDA5MQorCWFjY2Vzc19tb2RlIFJXCisJYml0CUJSS0FEUklOVCAweDA4CisJYml0CVNDU0lJTlQJICAweDA0CisJYml0CUNNRENNUExUICAweDAyCisJYml0CVNFUUlOVCAgICAweDAxCisJbWFzawlCQURfUEhBU0UJU0VRSU5UCQkvKiB1bmtub3duIHNjc2kgYnVzIHBoYXNlICovCisJbWFzawlTRU5EX1JFSkVDVAkweDEwfFNFUUlOVAkvKiBzZW5kaW5nIGEgbWVzc2FnZSByZWplY3QgKi8KKwltYXNrCU5PX0lERU5UCTB4MjB8U0VRSU5UCS8qIG5vIElERU5USUZZIGFmdGVyIHJlY29ubmVjdCovCisJbWFzawlOT19NQVRDSAkweDMwfFNFUUlOVAkvKiBubyBjbWQgbWF0Y2ggZm9yIHJlY29ubmVjdCAqLworCW1hc2sJRVhURU5ERURfTVNHCTB4NDB8U0VRSU5UCS8qIEV4dGVuZGVkIG1lc3NhZ2UgcmVjZWl2ZWQgKi8KKwltYXNrCVdJREVfUkVTSURVRQkweDUwfFNFUUlOVAkvKiBuZWVkIGtlcm5lbCB0byBiYWNrIHVwICovCisJCQkJCQkvKiB0aGUgU0cgYXJyYXkgZm9yIHVzICovCisJbWFzawlSRUpFQ1RfTVNHCTB4NjB8U0VRSU5UCS8qIFJlamVjdCBtZXNzYWdlIHJlY2VpdmVkICovCisJbWFzawlCQURfU1RBVFVTCTB4NzB8U0VRSU5UCS8qIEJhZCBzdGF0dXMgZnJvbSB0YXJnZXQgKi8KKwltYXNrCVJFU0lEVUFMCTB4ODB8U0VRSU5UCS8qIFJlc2lkdWFsIGJ5dGUgY291bnQgIT0gMCAqLworCW1hc2sJQVdBSVRJTkdfTVNHCTB4YTB8U0VRSU5UCS8qCisJCQkJCQkgKiBLZXJuZWwgcmVxdWVzdGVkIHRvIHNwZWNpZnkKKwkJCQkJCSAqIGEgbWVzc2FnZSB0byB0aGlzIHRhcmdldAorCQkJCQkJICogKGNvbW1hbmQgd2FzIG51bGwpLCBzbyB0ZWxsCisJCQkJCQkgKiBpdCB0aGF0IGl0IGNhbiBmaWxsIHRoZQorCQkJCQkJICogbWVzc2FnZSBidWZmZXIuCisJCQkJCQkgKi8KKwltYXNrCVNFUV9TR19GSVhVUAkweGIwfFNFUUlOVAkvKiBuZWVkIGhlbHAgd2l0aCBmaXhpbmcgdXAKKwkJCQkJCSAqIHRoZSBzZyBhcnJheSBwb2ludGVyIGFmdGVyCisJCQkJCQkgKiBhIHBoYXNlbWlzIHdpdGggbm8gdmFsaWQKKwkJCQkJCSAqIHNnIGVsZW1lbnRzIGluIHRoZSBzaGFkb3cKKwkJCQkJCSAqIHBpcGVsaW5lLgorCQkJCQkJICovCisJbWFzawlUUkFDRVBPSU5UMgkweGMwfFNFUUlOVAorCW1hc2sJTVNHSU5fUEhBU0VNSVMJMHhkMHxTRVFJTlQJLyoKKwkJCQkJCSAqIFRhcmdldCBjaGFuZ2VkIHBoYXNlIG9uIHVzCisJCQkJCQkgKiB3aGVuIHdlIHdlcmUgZXhwZWN0aW5nCisJCQkJCQkgKiBhbm90aGVyIG1zZ2luIGJ5dGUuCisJCQkJCQkgKi8KKwltYXNrCURBVEFfT1ZFUlJVTgkweGUwfFNFUUlOVAkvKgorCQkJCQkJICogVGFyZ2V0IGF0dGVtcHRlZCB0byB3cml0ZQorCQkJCQkJICogYmV5b25kIHRoZSBib3VuZHMgb2YgaXRzCisJCQkJCQkgKiBjb21tYW5kLgorCQkJCQkJICovCisKKwltYXNrCVNFUUlOVF9NQVNLCTB4ZjB8U0VRSU5UCS8qIFNFUUlOVCBTdGF0dXMgQ29kZXMgKi8KKwltYXNrCUlOVF9QRU5EICAoQlJLQURSSU5UfFNFUUlOVHxTQ1NJSU5UfENNRENNUExUKQorfQorCisvKgorICogSGFyZCBFcnJvciAocC4gMy01MykKKyAqIFJlcG9ydGluZyBvZiBjYXRhc3Ryb3BoaWMgZXJyb3JzLiAgWW91IHVzdWFsbHkgY2Fubm90IHJlY292ZXIgZnJvbQorICogdGhlc2Ugd2l0aG91dCBhIGZ1bGwgYm9hcmQgcmVzZXQuCisgKi8KK3JlZ2lzdGVyIEVSUk9SIHsKKwlhZGRyZXNzCQkJMHgwOTIKKwlhY2Nlc3NfbW9kZSBSTworCWJpdAlDSU9QQVJFUlIJMHg4MAkvKiBVbHRyYTIgb25seSAqLworCWJpdAlQQ0lFUlJTVEFUCTB4NDAJLyogUENJIG9ubHkgKi8KKwliaXQJTVBBUkVSUgkJMHgyMAkvKiBQQ0kgb25seSAqLworCWJpdAlEUEFSRVJSCQkweDEwCS8qIFBDSSBvbmx5ICovCisJYml0CVNRUEFSRVJSCTB4MDgKKwliaXQJSUxMT1BDT0RFCTB4MDQKKwliaXQJSUxMU0FERFIJMHgwMgorCWJpdAlEU0NUTU9VVAkweDAyCS8qIFVsdHJhMyBvbmx5ICovCisJYml0CUlMTEhBRERSCTB4MDEKK30KKworLyoKKyAqIENsZWFyIEludGVycnVwdCBTdGF0dXMgKHAuIDMtNTIpCisgKi8KK3JlZ2lzdGVyIENMUklOVCB7CisJYWRkcmVzcwkJCTB4MDkyCisJYWNjZXNzX21vZGUgV08KKwliaXQJQ0xSUEFSRVJSCTB4MTAJLyogUENJIG9ubHkgKi8KKwliaXQJQ0xSQlJLQURSSU5UCTB4MDgKKwliaXQJQ0xSU0NTSUlOVCAgICAgIDB4MDQKKwliaXQJQ0xSQ01ESU5UIAkweDAyCisJYml0CUNMUlNFUUlOVCAJMHgwMQorfQorCityZWdpc3RlciBERkNOVFJMIHsKKwlhZGRyZXNzCQkJMHgwOTMKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlQUkVMT0FERU4JMHg4MAkvKiBhaWM3ODkwIG9ubHkgKi8KKwliaXQJV0lERU9ERAkJMHg0MAorCWJpdAlTQ1NJRU4JCTB4MjAKKwliaXQJU0RNQUVOCQkweDEwCisJYml0CVNETUFFTkFDSwkweDEwCisJYml0CUhETUFFTgkJMHgwOAorCWJpdAlIRE1BRU5BQ0sJMHgwOAorCWJpdAlESVJFQ1RJT04JMHgwNAorCWJpdAlGSUZPRkxVU0gJMHgwMgorCWJpdAlGSUZPUkVTRVQJMHgwMQorfQorCityZWdpc3RlciBERlNUQVRVUyB7CisJYWRkcmVzcwkJCTB4MDk0CisJYWNjZXNzX21vZGUgUk8KKwliaXQJUFJFTE9BRF9BVkFJTAkweDgwCisJYml0CURXT1JERU1QCTB4MjAKKwliaXQJTVJFUVBFTkQJMHgxMAorCWJpdAlIRE9ORQkJMHgwOAorCWJpdAlERlRIUkVTSAkweDA0CisJYml0CUZJRk9GVUxMCTB4MDIKKwliaXQJRklGT0VNUAkJMHgwMQorfQorCityZWdpc3RlciBERkRBVCB7CisJYWRkcmVzcwkJCTB4MDk5CisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIFNDQiBBdXRvIEluY3JlbWVudCAocC4gMy01OSkKKyAqIEJ5dGUgb2Zmc2V0IGludG8gdGhlIFNDQiBBcnJheSBhbmQgYW4gb3B0aW9uYWwgYml0IHRvIGFsbG93IGF1dG8KKyAqIGluY3JlbWVudGluZyBvZiB0aGUgYWRkcmVzcyBkdXJpbmcgZG93bmxvYWQgYW5kIHVwbG9hZCBvcGVyYXRpb25zCisgKi8KK3JlZ2lzdGVyIFNDQkNOVCB7CisJYWRkcmVzcwkJCTB4MDlhCisJYWNjZXNzX21vZGUgUlcKKwliaXQJU0NCQVVUTwkJMHg4MAorCW1hc2sJU0NCQ05UX01BU0sJMHgxZgorfQorCisvKgorICogUXVldWUgSW4gRklGTyAocC4gMy02MCkKKyAqIElucHV0IHF1ZXVlIGZvciBxdWV1ZWQgU0NCcyAoY29tbWFuZHMgdGhhdCB0aGUgc2VxZW5jZXIgaGFzIHlldCB0byBzdGFydCkKKyAqLworcmVnaXN0ZXIgUUlORklGTyB7CisJYWRkcmVzcwkJCTB4MDliCisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIFF1ZXVlIEluIENvdW50IChwLiAzLTYwKQorICogTnVtYmVyIG9mIHF1ZXVlZCBTQ0JzCisgKi8KK3JlZ2lzdGVyIFFJTkNOVAl7CisJYWRkcmVzcwkJCTB4MDljCisJYWNjZXNzX21vZGUgUk8KK30KKworLyoKKyAqIFNDU0lEQVRMIElNQUdFIFJlZ2lzdGVyIChwLiA1LTEwNCkKKyAqIFdyaXRlIHRvIHRoaXMgcmVnaXN0ZXIgYWxzbyBnbyB0byBTQ1NJREFUTCBidXQgdGhpcyByZWdpc3RlciB3aWxsIHByZXNlcnZlCisgKiB0aGUgZGF0YSBmb3IgbGF0ZXIgcmVhZGluZyBhcyBsb25nIGFzIHRoZSBTQ1NJREFUTF9JTUdFTiBiaXQgaW4gdGhlCisgKiBPUFRJT05NT0RFIHJlZ2lzdGVyIGlzIHNldC4KKyAqLworcmVnaXN0ZXIgU0NTSURBVExfSU1HIHsKKwlhZGRyZXNzCQkJMHgwOWMKKwlhY2Nlc3NfbW9kZSBSVworfQorCisvKgorICogUXVldWUgT3V0IEZJRk8gKHAuIDMtNjEpCisgKiBRdWV1ZSBvZiBTQ0JzIHRoYXQgaGF2ZSBjb21wbGV0ZWQgYW5kIGF3YWl0IHRoZSBob3N0CisgKi8KK3JlZ2lzdGVyIFFPVVRGSUZPIHsKKwlhZGRyZXNzCQkJMHgwOWQKKwlhY2Nlc3NfbW9kZSBXTworfQorCisvKgorICogQ1JDIENvbnRyb2wgMSBSZWdpc3RlciAocC4gNS0xMDUpCisgKiBDb250cm9sIGJpdHMgZm9yIHRoZSBVbHRyYSAxNjAvbSBDUkMgZmFjaWxpdGllcworICovCityZWdpc3RlciBDUkNDT05UUk9MMSB7CisJYWRkcmVzcwkJCTB4MDlkCisJYWNjZXNzX21vZGUgUlcKKwliaXQJQ1JDT05TRUVOCTB4ODAgLyogQ1JDIE9OIFNpbmdsZSBFZGdlIEVOYWJsZSAqLworCWJpdAlDUkNWQUxDSEtFTgkweDQwIC8qIENSQyBWYWx1ZSBDaGVjayBFbmFibGUgKi8KKwliaXQJQ1JDRU5EQ0hLRU4JMHgyMCAvKiBDUkMgRW5kIENoZWNrIEVuYWJsZSAqLworCWJpdAlDUkNSRVFDSEtFTgkweDEwCisJYml0CVRBUkdDUkNFTkRFTgkweDA4IC8qIEVuYWJsZSBFbmQgQ1JDIHRyYW5zZmVyIHdoZW4gdGFyZ2V0ICovCisJYml0CVRBUkdDUkNDTlRFTgkweDA0IC8qIEVuYWJsZSBDUkMgdHJhbnNmZXIgd2hlbiB0YXJnZXQgKi8KK30KKworLyoKKyAqIFF1ZXVlIE91dCBDb3VudCAocC4gMy02MSkKKyAqIE51bWJlciBvZiBxdWV1ZWQgU0NCcyBpbiB0aGUgT3V0IEZJRk8KKyAqLworcmVnaXN0ZXIgUU9VVENOVCB7CisJYWRkcmVzcwkJCTB4MDllCisJYWNjZXNzX21vZGUgUk8KK30KKworLyoKKyAqIFNDU0kgUGhhc2UgUmVnaXN0ZXIgKHAuIDUtMTA2KQorICogQ3VycmVudCBidXMgcGhhc2UKKyAqLworcmVnaXN0ZXIgU0NTSVBIQVNFIHsKKwlhZGRyZXNzCQkJMHgwOWUKKwlhY2Nlc3NfbW9kZSBSTworCWJpdAlTUF9TVEFUVVMJCTB4MjAKKwliaXQJU1BfQ09NTUFORAkJMHgxMAorCWJpdAlTUF9NU0dfSU4JCTB4MDgKKwliaXQJU1BfTVNHX09VVAkJMHgwNAorCWJpdAlTUF9EQVRBX0lOCQkweDAyCisJYml0CVNQX0RBVEFfT1VUCTB4MDEKK30KKworLyoKKyAqIFNwZWNpYWwgRnVuY3Rpb24KKyAqLworcmVnaXN0ZXIgU0ZVTkNUIHsKKwlhZGRyZXNzCQkJMHgwOWYKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlBTFRfTU9ERQkweDgwCit9CisKKy8qCisgKiBTQ0IgRGVmaW5pdGlvbiAocC4gNS00KQorICovCitzY2IgeworCWFkZHJlc3MJCQkweDBhMAorCVNDQl9DT05UUk9MIHsKKwkJc2l6ZQkxCisJCWJpdAlNS19NRVNTQUdFICAgICAgMHg4MAorCQliaXQJRElTQ0VOQiAgICAgICAgIDB4NDAKKwkJYml0CVRBR19FTkIJCTB4MjAKKwkJYml0CURJU0NPTk5FQ1RFRAkweDA0CisJCW1hc2sJU0NCX1RBR19UWVBFCTB4MDMKKwl9CisJU0NCX1RDTCB7CisJCXNpemUJMQorCQliaXQJU0VMQlVTQgkJMHgwOAorCQltYXNrCVRJRAkJMHhmMAorCQltYXNrCUxJRAkJMHgwNworCX0KKwlTQ0JfVEFSR0VUX1NUQVRVUyB7CisJCXNpemUJMQorCX0KKwlTQ0JfU0dDT1VOVCB7CisJCXNpemUJMQorCX0KKwlTQ0JfU0dQVFIgeworCQlzaXplCTQKKwl9CisJU0NCX1JFU0lEX1NHQ05UIHsKKwkJc2l6ZQkxCisJfQorCVNDQl9SRVNJRF9EQ05UCXsKKwkJc2l6ZQkzCisJfQorCVNDQl9EQVRBUFRSIHsKKwkJc2l6ZQk0CisJfQorCVNDQl9EQVRBQ05UIHsKKwkJLyoKKwkJICogUmVhbGx5IG9ubHkgMyBieXRlcywgYnV0IHBhZGRlZCB0byBtYWtlCisJCSAqIHRoZSBrZXJuZWwncyBqb2IgZWFzaWVyLgorCQkgKi8KKwkJc2l6ZQk0CisJfQorCVNDQl9DTURQVFIgeworCQlzaXplCTQKKwl9CisJU0NCX0NNRExFTiB7CisJCXNpemUJMQorCX0KKwlTQ0JfVEFHIHsKKwkJc2l6ZQkxCisJfQorCVNDQl9ORVhUIHsKKwkJc2l6ZQkxCisJfQorCVNDQl9QUkVWIHsKKwkJc2l6ZQkxCisJfQorCVNDQl9CVVNZVEFSR0VUUyB7CisJCXNpemUJNAorCX0KK30KKworY29uc3QJU0dfU0laRU9GCTB4MDgJCS8qIHNpemVvZihzdHJ1Y3QgYWhjX2RtYSkgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFIQS0yODQwLW9ubHkgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworcmVnaXN0ZXIgU0VFQ1RMXzI4NDAgeworCWFkZHJlc3MJCQkweDBjMAorCWFjY2Vzc19tb2RlIFJXCisJYml0CUNTXzI4NDAJCTB4MDQKKwliaXQJQ0tfMjg0MAkJMHgwMgorCWJpdAlET18yODQwCQkweDAxCit9CisKK3JlZ2lzdGVyIFNUQVRVU18yODQwIHsKKwlhZGRyZXNzCQkJMHgwYzEKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlFRVBST01fVEYJMHg4MAorCW1hc2sJQklPU19TRUwJMHg2MAorCW1hc2sJQURTRUwJCTB4MWUKKwliaXQJRElfMjg0MAkJMHgwMQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQUlDLTc4NzAtb25seSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCityZWdpc3RlciBEU1BDSVNUQVRVUyB7CisJYWRkcmVzcwkJCTB4MDg2CisJbWFzawlERlRIUlNIXzEwMAkweGMwCit9CisKK3JlZ2lzdGVyIENDSEFERFIgeworCWFkZHJlc3MJCQkweDBFMAorCXNpemUgOAorfQorCityZWdpc3RlciBDQ0hDTlQgeworCWFkZHJlc3MJCQkweDBFOAorfQorCityZWdpc3RlciBDQ1NHUkFNIHsKKwlhZGRyZXNzCQkJMHgwRTkKK30KKworcmVnaXN0ZXIgQ0NTR0FERFIgeworCWFkZHJlc3MJCQkweDBFQQorfQorCityZWdpc3RlciBDQ1NHQ1RMIHsKKwlhZGRyZXNzCQkJMHgwRUIKKwliaXQJQ0NTR0RPTkUJMHg4MAorCWJpdAlDQ1NHRU4JCTB4MDgKKwliaXQJRkxBRwkJMHgwMgorCWJpdAlDQ1NHUkVTRVQJMHgwMQorfQorCityZWdpc3RlciBDQ1NDQkNOVCB7CisJYWRkcmVzcwkJCTB4RUYKK30KKworcmVnaXN0ZXIgQ0NTQ0JDVEwgeworCWFkZHJlc3MJCQkweDBFRQorCWJpdAlDQ1NDQkRPTkUJMHg4MAorCWJpdAlBUlJET05FCQkweDQwCS8qIFNDQiBBcnJheSBwcmVmZXRjaCBkb25lICovCisJYml0CUNDQVJSRU4JCTB4MTAKKwliaXQJQ0NTQ0JFTgkJMHgwOAorCWJpdAlDQ1NDQkRJUgkweDA0CisJYml0CUNDU0NCUkVTRVQJMHgwMQorfQorCityZWdpc3RlciBDQ1NDQkFERFIgeworCWFkZHJlc3MJCQkweDBFRAorfQorCityZWdpc3RlciBDQ1NDQlJBTSB7CisJYWRkcmVzcwkJCTB4RUMKK30KKworcmVnaXN0ZXIgQ0NTQ0JQVFIgeworCWFkZHJlc3MJCQkweDBGMQorfQorCityZWdpc3RlciBITlNDQl9RT0ZGIHsKKwlhZGRyZXNzCQkJMHgwRjQKK30KKworcmVnaXN0ZXIgSEVTQ0JfUU9GRiB7CisJYWRkcmVzcwkJCTB4MEY1Cit9CisKK3JlZ2lzdGVyIFNOU0NCX1FPRkYgeworCWFkZHJlc3MJCQkweDBGNgorfQorCityZWdpc3RlciBTRVNDQl9RT0ZGIHsKKwlhZGRyZXNzCQkJMHgwRjcKK30KKworcmVnaXN0ZXIgU0RTQ0JfUU9GRiB7CisJYWRkcmVzcwkJCTB4MEY4Cit9CisKK3JlZ2lzdGVyIFFPRkZfQ1RMU1RBIHsKKwlhZGRyZXNzCQkJMHgwRkEKKwliaXQJRVNUQUJMSVNIX1NDQl9BVkFJTAkweDgwCisJYml0CVNDQl9BVkFJTAkweDQwCisJYml0CVNOU0NCX1JPTExPVkVSCTB4MjAKKwliaXQJU0RTQ0JfUk9MTE9WRVIJMHgxMAorCWJpdAlTRVNDQl9ST0xMT1ZFUgkweDA4CisJbWFzawlTQ0JfUVNJWkUJMHgwNworCW1hc2sJU0NCX1FTSVpFXzI1NgkweDA2Cit9CisKK3JlZ2lzdGVyIERGRl9USFJTSCB7CisJYWRkcmVzcwkJCTB4MEZCCisJbWFzawlXUl9ERlRIUlNICTB4NzAKKwltYXNrCVJEX0RGVEhSU0gJMHgwNworCW1hc2sJUkRfREZUSFJTSF9NSU4JMHgwMAorCW1hc2sJUkRfREZUSFJTSF8yNQkweDAxCisJbWFzawlSRF9ERlRIUlNIXzUwCTB4MDIKKwltYXNrCVJEX0RGVEhSU0hfNjMJMHgwMworCW1hc2sJUkRfREZUSFJTSF83NQkweDA0CisJbWFzawlSRF9ERlRIUlNIXzg1CTB4MDUKKwltYXNrCVJEX0RGVEhSU0hfOTAJMHgwNgorCW1hc2sJUkRfREZUSFJTSF9NQVgJMHgwNworCW1hc2sJV1JfREZUSFJTSF9NSU4JMHgwMAorCW1hc2sJV1JfREZUSFJTSF8yNQkweDEwCisJbWFzawlXUl9ERlRIUlNIXzUwCTB4MjAKKwltYXNrCVdSX0RGVEhSU0hfNjMJMHgzMAorCW1hc2sJV1JfREZUSFJTSF83NQkweDQwCisJbWFzawlXUl9ERlRIUlNIXzg1CTB4NTAKKwltYXNrCVdSX0RGVEhSU0hfOTAJMHg2MAorCW1hc2sJV1JfREZUSFJTSF9NQVgJMHg3MAorfQorCityZWdpc3RlciBTR19DQUNIRVBUUiB7CisJYWNjZXNzX21vZGUgUlcKKwlhZGRyZXNzCQkJMHgwZmMKKwltYXNrCVNHX1VTRVJfREFUQQkweGZjCisJYml0CUxBU1RfU0VHCTB4MDIKKwliaXQJTEFTVF9TRUdfRE9ORQkweDAxCit9CisKK3JlZ2lzdGVyIEJSRENUTAl7CisJYWRkcmVzcwkJCTB4MDFkCisJYml0CUJSRERBVDcJCTB4ODAKKwliaXQJQlJEREFUNgkJMHg0MAorCWJpdAlCUkREQVQ1CQkweDIwCisJYml0CUJSRFNUQgkJMHgxMAorCWJpdAlCUkRDUwkJMHgwOAorCWJpdAlCUkRSVwkJMHgwNAorCWJpdAlCUkRDVEwxCQkweDAyCisJYml0CUJSRENUTDAJCTB4MDEKKwkvKiA3ODkwIERlZmluaXRpb25zICovCisJYml0CUJSRERBVDQJCTB4MTAKKwliaXQJQlJEREFUMwkJMHgwOAorCWJpdAlCUkREQVQyCQkweDA0CisJYml0CUJSRFJXX1VMVFJBMgkweDAyCisJYml0CUJSRFNUQl9VTFRSQTIJMHgwMQorfQorCisvKgorICogU2VyaWFsIEVFUFJPTSBDb250cm9sIChwLiA0LTkyIGluIDc4NzAgRGF0YWJvb2spCisgKiBDb250cm9scyB0aGUgcmVhZGluZyBhbmQgd3JpdGluZyBvZiBhbiBleHRlcm5hbCBzZXJpYWwgMS1iaXQKKyAqIEVFUFJPTSBEZXZpY2UuICBJbiBvcmRlciB0byBhY2Nlc3MgdGhlIHNlcmlhbCBFRVBST00sIHlvdSBtdXN0CisgKiBmaXJzdCBzZXQgdGhlIFNFRU1TIGJpdCB0aGF0IGdlbmVyYXRlcyBhIHJlcXVlc3QgdG8gdGhlIG1lbW9yeQorICogcG9ydCBmb3IgYWNjZXNzIHRvIHRoZSBzZXJpYWwgRUVQUk9NIGRldmljZS4gIFdoZW4gdGhlIG1lbW9yeQorICogcG9ydCBpcyBub3QgYnVzeSBzZXJ2aWNpbmcgYW5vdGhlciByZXF1ZXN0LCBpdCByZWNvbmZpZ3VyZXMKKyAqIHRvIGFsbG93IGFjY2VzcyB0byB0aGUgc2VyaWFsIEVFUFJPTS4gIFdoZW4gdGhpcyBoYXBwZW5zLCBTRUVSRFkKKyAqIGdldHMgc2V0IGhpZ2ggdG8gdmVyaWZ5IHRoYXQgdGhlIG1lbW9yeSBwb3J0IGFjY2VzcyBoYXMgYmVlbgorICogZ3JhbnRlZC4gIAorICoKKyAqIEFmdGVyIHN1Y2Nlc3NmdWwgYXJiaXRyYXRpb24gZm9yIHRoZSBtZW1vcnkgcG9ydCwgdGhlIFNFRUNTIGJpdCBvZiAKKyAqIHRoZSBTRUVDVEwgcmVnaXN0ZXIgaXMgY29ubmVjdGVkIHRvIHRoZSBjaGlwIHNlbGVjdC4gIFRoZSBTRUVDSywgCisgKiBTRUVETywgYW5kIFNFRURJIGFyZSBjb25uZWN0ZWQgdG8gdGhlIGNsb2NrLCBkYXRhIG91dCwgYW5kIGRhdGEgaW4gCisgKiBsaW5lcyByZXNwZWN0aXZlbHkuICBUaGUgU0VFUkRZIGJpdCBvZiBTRUVDVEwgaXMgdXNlZnVsIGluIHRoYXQgaXQgCisgKiBnaXZlcyB1cyBhbiA4MDAgbnNlYyB0aW1lci4gIEFmdGVyIGEgd3JpdGUgdG8gdGhlIFNFRUNUTCByZWdpc3RlciwgCisgKiB0aGUgU0VFUkRZIGdvZXMgaGlnaCA4MDAgbnNlYyBsYXRlci4gIFRoZSBvbmUgZXhjZXB0aW9uIHRvIHRoaXMgaXMgCisgKiB3aGVuIHdlIGZpcnN0IHJlcXVlc3QgYWNjZXNzIHRvIHRoZSBtZW1vcnkgcG9ydC4gIFRoZSBTRUVSRFkgZ29lcyAKKyAqIGhpZ2ggdG8gc2lnbmlmeSB0aGF0IGFjY2VzcyBoYXMgYmVlbiBncmFudGVkIGFuZCwgZm9yIHRoaXMgY2FzZSwgaGFzIAorICogbm8gaW1wbGllZCB0aW1pbmcuCisgKgorICogU2VlIDkzY3g2LmMgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBwcm90b2NvbCBuZWNlc3NhcnkgdG8gCisgKiByZWFkIHRoZSBzZXJpYWwgRUVQUk9NLgorICovCityZWdpc3RlciBTRUVDVEwgeworCWFkZHJlc3MJCQkweDAxZQorCWJpdAlFWFRBUkJBQ0sJMHg4MAorCWJpdAlFWFRBUkJSRVEJMHg0MAorCWJpdAlTRUVNUwkJMHgyMAorCWJpdAlTRUVSRFkJCTB4MTAKKwliaXQJU0VFQ1MJCTB4MDgKKwliaXQJU0VFQ0sJCTB4MDQKKwliaXQJU0VFRE8JCTB4MDIKKwliaXQJU0VFREkJCTB4MDEKK30KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2NyYXRjaCBSQU0gT2Zmc2V0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBUaGVzZSBvZmZzZXRzIGFyZSBlaXRoZXIgdG8gdmFsdWVzIHRoYXQgYXJlIGluaXRpYWxpemVkIGJ5IHRoZSBib2FyZCdzCisgKiBCSU9TIG9yIGFyZSBzcGVjaWZpZWQgYnkgdGhlIHNlcXVlbmNlciBjb2RlLgorICoKKyAqIFRoZSBob3N0IGFkYXB0ZXIgY2FyZCAoYXQgbGVhc3QgdGhlIEJJT1MpIHVzZXMgMjAtMmYgZm9yIFNDU0kKKyAqIGRldmljZSBpbmZvcm1hdGlvbiwgMzItMzMgYW5kIDVhLTVmIGFzIHdlbGwuIEFzIGl0IHR1cm5zIG91dCwgdGhlCisgKiBCSU9TIHRyYXNoZXMgMjAtMmYsIHdyaXRpbmcgdGhlIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uIHJlc3VsdHMKKyAqIG9uIHRvcCBvZiB0aGUgQklPUyB2YWx1ZXMsIHNvIHdlIHJlLXVzZSB0aG9zZSBmb3Igb3VyIHBlci10YXJnZXQKKyAqIHNjcmF0Y2hzcGFjZSAoYWN0dWFsbHkgYSB2YWx1ZSB0aGF0IGNhbiBiZSBjb3BpZWQgZGlyZWN0bHkgaW50bworICogU0NTSVJBVEUpLiAgVGhlIGtlcm5lbCBkcml2ZXIgd2lsbCBlbmFibGUgc3luY2hyb25vdXMgbmVnb3RpYXRpb24KKyAqIGZvciBhbGwgdGFyZ2V0cyB0aGF0IGhhdmUgYSB2YWx1ZSBvdGhlciB0aGFuIDAgaW4gdGhlIGxvd2VyIGZvdXIKKyAqIGJpdHMgb2YgdGhlIHRhcmdldCBzY3JhdGNoIHNwYWNlLiAgVGhpcyBzaG91bGQgd29yayByZWdhcmRsZXNzIG9mCisgKiB3aGV0aGVyIHRoZSBiaW9zIGhhcyBiZWVuIGluc3RhbGxlZC4KKyAqLworCitzY3JhdGNoX3JhbSB7CisJYWRkcmVzcwkJCTB4MDIwCisKKwkvKgorCSAqIDEgYnl0ZSBwZXIgdGFyZ2V0IHN0YXJ0aW5nIGF0IHRoaXMgYWRkcmVzcyBmb3IgY29uZmlndXJhdGlvbiB2YWx1ZXMKKwkgKi8KKwlUQVJHX1NDU0lSQVRFIHsKKwkJc2l6ZQkJMTYKKwl9CisJLyoKKwkgKiBCaXQgdmVjdG9yIG9mIHRhcmdldHMgdGhhdCBoYXZlIFVMVFJBIGVuYWJsZWQuCisJICovCisJVUxUUkFfRU5CIHsKKwkJc2l6ZQkJMgorCX0KKwkvKgorCSAqIEJpdCB2ZWN0b3Igb2YgdGFyZ2V0cyB0aGF0IGhhdmUgZGlzY29ubmVjdGlvbiBkaXNhYmxlZC4KKwkgKi8KKwlESVNDX0RTQiB7CisJCXNpemUJCTIKKwl9CisJLyoKKwkgKiBTaW5nbGUgYnl0ZSBidWZmZXIgdXNlZCB0byBkZXNpZ25hdGUgdGhlIHR5cGUgb3IgbWVzc2FnZQorCSAqIHRvIHNlbmQgdG8gYSB0YXJnZXQuCisJICovCisJTVNHX09VVCB7CisJCXNpemUJCTEKKwl9CisJLyogUGFyYW1ldGVycyBmb3IgRE1BIExvZ2ljICovCisJRE1BUEFSQU1TIHsKKwkJc2l6ZQkJMQorCQliaXQJUFJFTE9BREVOCTB4ODAKKwkJYml0CVdJREVPREQJCTB4NDAKKwkJYml0CVNDU0lFTgkJMHgyMAorCQliaXQJU0RNQUVOCQkweDEwCisJCWJpdAlTRE1BRU5BQ0sJMHgxMAorCQliaXQJSERNQUVOCQkweDA4CisJCWJpdAlIRE1BRU5BQ0sJMHgwOAorCQliaXQJRElSRUNUSU9OCTB4MDQKKwkJYml0CUZJRk9GTFVTSAkweDAyCisJCWJpdAlGSUZPUkVTRVQJMHgwMQorCX0KKwlTRVFfRkxBR1MgeworCQlzaXplCQkxCisJCWJpdAlJREVOVElGWV9TRUVOCTB4ODAKKwkJYml0CVNDQlBUUl9WQUxJRAkweDIwCisJCWJpdAlEUEhBU0UJCTB4MTAKKwkJYml0CUFNVEFSR0VUCTB4MDgKKwkJYml0CVdJREVfQlVTCTB4MDIKKwkJYml0CVRXSU5fQlVTCTB4MDEKKwl9CisJLyoKKwkgKiBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgdGhlCisJICogdGFyZ2V0L2NoYW5uZWwvbHVuIG9mIGEKKwkgKiByZWNvbm5lY3RpbmcgdGFyZ2V0CisJICovCisJU0FWRURfVENMIHsKKwkJc2l6ZQkJMQorCX0KKwkvKiBXb3JraW5nIHZhbHVlIG9mIHRoZSBudW1iZXIgb2YgU0cgc2VnbWVudHMgbGVmdCAqLworCVNHX0NPVU5UIHsKKwkJc2l6ZQkJMQorCX0KKwkvKiBXb3JraW5nIHZhbHVlIG9mIFNHIHBvaW50ZXIgKi8KKwlTR19ORVhUCXsKKwkJc2l6ZQkJNAorCX0KKwkvKgorCSAqIFRoZSBsYXN0IGJ1cyBwaGFzZSBhcyBzZWVuIGJ5IHRoZSBzZXF1ZW5jZXIuIAorCSAqLworCUxBU1RQSEFTRSB7CisJCXNpemUJCTEKKwkJYml0CUNESQkJMHg4MAorCQliaXQJSU9JCQkweDQwCisJCWJpdAlNU0dJCQkweDIwCisJCW1hc2sJUEhBU0VfTUFTSwlDREl8SU9JfE1TR0kKKwkJbWFzawlQX0RBVEFPVVQJMHgwMAorCQltYXNrCVBfREFUQUlOCUlPSQorCQltYXNrCVBfQ09NTUFORAlDREkKKwkJbWFzawlQX01FU0dPVVQJQ0RJfE1TR0kKKwkJbWFzawlQX1NUQVRVUwlDREl8SU9JCisJCW1hc2sJUF9NRVNHSU4JQ0RJfElPSXxNU0dJCisJCW1hc2sJUF9CVVNGUkVFCTB4MDEKKwl9CisJLyoKKwkgKiBoZWFkIG9mIGxpc3Qgb2YgU0NCcyBhd2FpdGluZworCSAqIHNlbGVjdGlvbgorCSAqLworCVdBSVRJTkdfU0NCSCB7CisJCXNpemUJCTEKKwl9CisJLyoKKwkgKiBoZWFkIG9mIGxpc3Qgb2YgU0NCcyB0aGF0IGFyZQorCSAqIGRpc2Nvbm5lY3RlZC4gIFVzZWQgZm9yIFNDQgorCSAqIHBhZ2luZy4KKwkgKi8KKwlESVNDT05ORUNURURfU0NCSCB7CisJCXNpemUJCTEKKwl9CisJLyoKKwkgKiBoZWFkIG9mIGxpc3Qgb2YgU0NCcyB0aGF0IGFyZQorCSAqIG5vdCBpbiB1c2UuICBVc2VkIGZvciBTQ0IgcGFnaW5nLgorCSAqLworCUZSRUVfU0NCSCB7CisJCXNpemUJCTEKKwl9CisJLyoKKwkgKiBBZGRyZXNzIG9mIHRoZSBoYXJkd2FyZSBzY2IgYXJyYXkgaW4gdGhlIGhvc3QuCisJICovCisJSFNDQl9BRERSIHsKKwkJc2l6ZQkJNAorCX0KKwkvKgorCSAqIEFkZHJlc3Mgb2YgdGhlIDI1NiBieXRlIGFycmF5IHN0b3JpbmcgdGhlIFNDQklEIG9mIG91dHN0YW5kaW5nCisJICogdW50YWdnZWQgU0NCcyBpbmRleGVkIGJ5IFRDTC4KKwkgKi8KKwlTQ0JJRF9BRERSIHsKKwkJc2l6ZQkJNAorCX0KKwkvKgorCSAqIEFkZHJlc3Mgb2YgdGhlIGFycmF5IG9mIGNvbW1hbmQgZGVzY3JpcHRvcnMgdXNlZCB0byBzdG9yZQorCSAqIGluZm9ybWF0aW9uIGFib3V0IGluY29taW5nIHNlbGVjdGlvbnMuCisJICovCisJVE1PREVfQ01EQUREUiB7CisJCXNpemUJCTQKKwl9CisJS0VSTkVMX1FJTlBPUyB7CisJCXNpemUJCTEKKwl9CisJUUlOUE9TIHsKKwkJc2l6ZQkJMQorCX0KKwlRT1VUUE9TIHsKKwkJc2l6ZQkJMQorCX0KKwkvKgorCSAqIE9mZnNldCBpbnRvIHRoZSBjb21tYW5kIGRlc2NyaXB0b3IgYXJyYXkgZm9yIHRoZSBuZXh0CisJICogYXZhaWxhYmxlIGRlc2NpcHRvciB0byB1c2UuCisJICovCisJVE1PREVfQ01EQUREUl9ORVhUIHsKKwkJc2l6ZQkJMQorCX0KKwlBUkdfMSB7CisJCXNpemUJCTEKKwkJbWFzawlTRU5EX01TRwkweDgwCisJCW1hc2sJU0VORF9TRU5TRQkweDQwCisJCW1hc2sJU0VORF9SRUoJMHgyMAorCQltYXNrCU1TR09VVF9QSEFTRU1JUwkweDEwCisJCWFsaWFzCVJFVFVSTl8xCisJfQorCUFSR18yIHsKKwkJc2l6ZQkJMQorCQlhbGlhcwlSRVRVUk5fMgorCX0KKworCS8qCisJICogU25hcHNob3Qgb2YgTVNHX09VVCB0YWtlbiBhZnRlciBlYWNoIG1lc3NhZ2UgaXMgc2VudC4KKwkgKi8KKwlMQVNUX01TRyB7CisJCXNpemUJCTEKKwl9CisKKwkvKgorCSAqIE51bWJlciBvZiB0aW1lcyB3ZSBoYXZlIGZpbGxlZCB0aGUgQ0NTR1JBTSB3aXRoIHByZWZldGNoZWQKKwkgKiBTRyBlbGVtZW50cy4KKwkgKi8KKwlQUkVGRVRDSF9DTlQgeworCQlzaXplCQkxCisJfQorCisKKwkvKgorCSAqIFRoZXNlIGFyZSByZXNlcnZlZCByZWdpc3RlcnMgaW4gdGhlIGNhcmQncyBzY3JhdGNoIHJhbS4gIFNvbWUgb2YKKwkgKiB0aGUgdmFsdWVzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIEFIQTI3NDIgdGVjaG5pY2FsIHJlZmVyZW5jZSBtYW51YWwKKwkgKiBhbmQgYXJlIGluaXRpYWxpemVkIGJ5IHRoZSBCSU9TIGF0IGJvb3QgdGltZS4KKwkgKi8KKwlTQ1NJQ09ORiB7CisJCWFkZHJlc3MJCTB4MDVhCisJCXNpemUJCTEKKwkJYml0CVRFUk1fRU5CCTB4ODAKKwkJYml0CVJFU0VUX1NDU0kJMHg0MAorCQltYXNrCUhTQ1NJSUQJCTB4MDcJLyogb3VyIFNDU0kgSUQgKi8KKwkJbWFzawlIV1NDU0lJRAkweDBmCS8qIG91ciBTQ1NJIElEIGlmIFdpZGUgQnVzICovCisJfQorCUhPU1RDT05GIHsKKwkJYWRkcmVzcwkJMHgwNWQKKwkJc2l6ZQkJMQorCX0KKwlIQV8yNzRfQklPU0NUUkwJeworCQlhZGRyZXNzCQkweDA1ZgorCQlzaXplCQkxCisJCW1hc2sJQklPU01PREUJCTB4MzAKKwkJbWFzawlCSU9TRElTQUJMRUQJCTB4MzAJCisJCWJpdAlDSEFOTkVMX0JfUFJJTUFSWQkweDA4CisJfQorCS8qCisJICogUGVyIHRhcmdldCBTQ1NJIG9mZnNldCB2YWx1ZXMgZm9yIFVsdHJhMiBjb250cm9sbGVycy4KKwkgKi8KKwlUQVJHX09GRlNFVCB7CisJCWFkZHJlc3MJCTB4MDcwCisJCXNpemUJCTE2CisJfQorfQorCitjb25zdCBTQ0JfTElTVF9OVUxMCTB4ZmYKKworY29uc3QgQ0NTR0FERFJfTUFYCTB4ODAKK2NvbnN0IENDU0dSQU1fTUFYU0VHUwkxNgorCisvKiBPZmZzZXRzIGludG8gdGhlIFNDQklEIGFycmF5IHdoZXJlIGRpZmZlcmVudCBkYXRhIGlzIHN0b3JlZCAqLworY29uc3QgVU5UQUdHRURTQ0JfT0ZGU0VUCTAKK2NvbnN0IFFPVVRGSUZPX09GRlNFVAkJMQorY29uc3QgUUlORklGT19PRkZTRVQJCTIKKworLyogV0RUUiBNZXNzYWdlIHZhbHVlcyAqLworY29uc3QgQlVTXzhfQklUCQkJMHgwMAorY29uc3QgQlVTXzE2X0JJVAkJMHgwMQorY29uc3QgQlVTXzMyX0JJVAkJMHgwMgorCisvKiBPZmZzZXQgbWF4aW11bXMgKi8KK2NvbnN0IE1BWF9PRkZTRVRfOEJJVAkJMHgwZgorY29uc3QgTUFYX09GRlNFVF8xNkJJVAkJMHgwOAorY29uc3QgTUFYX09GRlNFVF9VTFRSQTIJCTB4N2YKK2NvbnN0IEhPU1RfTVNHCQkJMHhmZgorCisvKiBUYXJnZXQgbW9kZSBjb21tYW5kIHByb2Nlc3NpbmcgY29uc3RhbnRzICovCitjb25zdCBDTURfR1JPVVBfQ09ERV9TSElGVAkweDA1Citjb25zdCBDTURfR1JPVVAwX0JZVEVfREVMVEEJLTQKK2NvbnN0IENNRF9HUk9VUDJfQllURV9ERUxUQQktNgorY29uc3QgQ01EX0dST1VQNF9CWVRFX0RFTFRBCTQKK2NvbnN0IENNRF9HUk9VUDVfQllURV9ERUxUQQkxMQorCisvKgorICogRG93bmxvYWRlZCAoa2VybmVsIGluc2VydGVkKSBjb25zdGFudHMKKyAqLworCisvKgorICogTnVtYmVyIG9mIGNvbW1hbmQgZGVzY3JpcHRvcnMgaW4gdGhlIGNvbW1hbmQgZGVzY3JpcHRvciBhcnJheS4KKyAqLworY29uc3QgVE1PREVfTlVNQ01EUwlkb3dubG9hZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHguc2VxIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHguc2VxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZmM0YjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQvYWljN3h4eC5zZXEKQEAgLTAsMCArMSwxNTM5IEBACisvKgorICogQWRhcHRlYyAyNzR4LzI4NHgvMjk0eCBkZXZpY2UgZHJpdmVyIGZpcm13YXJlIGZvciBMaW51eCBhbmQgRnJlZUJTRC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5OSBKdXN0aW4gR2liYnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgaW1tZWRpYXRlbHkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKyAqIDIuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogV2hlcmUgdGhpcyBTb2Z0d2FyZSBpcyBjb21iaW5lZCB3aXRoIHNvZnR3YXJlIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiAKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBhbmQgdGhlIHRlcm1zIG9mIHRoZSBHUEwgd291bGQgcmVxdWlyZSB0aGUgCisgKiBjb21iaW5lZCB3b3JrIHRvIGFsc28gYmUgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwsIHRoZSB0ZXJtcworICogYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlIHdpbGwgYXBwbHkgaW4gYWRkaXRpb24gdG8gdGhvc2Ugb2YgdGhlCisgKiBHUEwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFueSB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSB0aGF0CisgKiBjb25mbGljdCB3aXRoLCBvciBhcmUgZXhwcmVzc2x5IHByb2hpYml0ZWQgYnksIHRoZSBHUEwuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKgkkSWQ6IGFpYzd4eHguc2VxLHYgMS43NyAxOTk4LzA2LzI4IDAyOjU4OjU3IGdpYmJzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgImFpYzd4eHgucmVnIgorI2luY2x1ZGUgInNjc2lfbWVzc2FnZS5oIgorCisvKgorICogQSBmZXcgd29yZHMgb24gdGhlIHdhaXRpbmcgU0NCIGxpc3Q6CisgKiBBZnRlciBzdGFydGluZyB0aGUgc2VsZWN0aW9uIGhhcmR3YXJlLCB3ZSBjaGVjayBmb3IgcmVjb25uZWN0aW5nIHRhcmdldHMKKyAqIGFzIHdlbGwgYXMgZm9yIG91ciBzZWxlY3Rpb24gdG8gY29tcGxldGUganVzdCBpbiBjYXNlIHRoZSByZXNlbGVjdGlvbiB3aW5zCisgKiBidXMgYXJiaXRyYXRpb24uICBUaGUgcHJvYmxlbSB3aXRoIHRoaXMgaXMgdGhhdCB3ZSBtdXN0IGtlZXAgdHJhY2sgb2YgdGhlCisgKiBTQ0IgdGhhdCB3ZSd2ZSBhbHJlYWR5IHB1bGxlZCBmcm9tIHRoZSBRSU5GSUZPIGFuZCBzdGFydGVkIHRoZSBzZWxlY3Rpb24KKyAqIG9uIGp1c3QgaW4gY2FzZSB0aGUgcmVzZWxlY3Rpb24gd2lucyBzbyB0aGF0IHdlIGNhbiByZXRyeSB0aGUgc2VsZWN0aW9uIGF0CisgKiBhIGxhdGVyIHRpbWUuICBUaGlzIHByb2JsZW0gY2Fubm90IGJlIHJlc29sdmVkIGJ5IGhvbGRpbmcgYSBzaW5nbGUgZW50cnkKKyAqIGluIHNjcmF0Y2ggcmFtIHNpbmNlIGEgcmVjb25uZWN0aW5nIHRhcmdldCBjYW4gcmVxdWVzdCBzZW5zZSBhbmQgdGhpcyB3aWxsCisgKiBjcmVhdGUgeWV0IGFub3RoZXIgU0NCIHdhaXRpbmcgZm9yIHNlbGVjdGlvbi4gIFRoZSBzb2x1dGlvbiB1c2VkIGhlcmUgaXMgdG8gCisgKiB1c2UgYnl0ZSAyNyBvZiB0aGUgU0NCIGFzIGEgcHNldWRvLW5leHQgcG9pbnRlciBhbmQgdG8gdGhyZWFkIGEgbGlzdAorICogb2YgU0NCcyB0aGF0IGFyZSBhd2FpdGluZyBzZWxlY3Rpb24uICBTaW5jZSAwLTB4ZmUgYXJlIHZhbGlkIFNDQiBpbmRleGVzLCAKKyAqIFNDQl9MSVNUX05VTEwgaXMgMHhmZiB3aGljaCBpcyBvdXQgb2YgcmFuZ2UuICBBbiBlbnRyeSBpcyBhbHNvIGFkZGVkIHRvCisgKiB0aGlzIGxpc3QgZXZlcnl0aW1lIGEgcmVxdWVzdCBzZW5zZSBvY2N1cnMgb3IgYWZ0ZXIgY29tcGxldGluZyBhIG5vbi10YWdnZWQKKyAqIGNvbW1hbmQgZm9yIHdoaWNoIGEgc2Vjb25kIFNDQiBoYXMgYmVlbiBxdWV1ZWQuICBUaGUgc2VxdWVuY2VyIHdpbGwKKyAqIGF1dG9tYXRpY2FsbHkgY29uc3VtZSB0aGUgZW50cmllcy4KKyAqLworCityZXNldDoKKwljbHIJU0NTSVNJR087CQkvKiBEZS1hc3NlcnQgQlNZICovCisJYW5kCVNYRlJDVEwxLCB+QklUQlVDS0VUOworCS8qIEFsd2F5cyBhbGxvdyByZXNlbGVjdGlvbiAqLworCW12aQlTQ1NJU0VRLCBFTlJTRUxJfEVOQVVUT0FUTlA7CisKKwlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCS8qIEVuc3VyZSB0aGF0IG5vIERNQSBvcGVyYXRpb25zIGFyZSBpbiBwcm9ncmVzcyAqLworCQljbHIJQ0NTR0NUTDsKKwkJY2xyCUNDU0NCQ1RMOworCX0KKworCWNhbGwJY2xlYXJfdGFyZ2V0X3N0YXRlOworcG9sbF9mb3Jfd29yazoKKwlhbmQJU1hGUkNUTDAsIH5TUElPRU47CisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19RVUVVRV9SRUdTKSA9PSAwKSB7CisJCW1vdglBLCBRSU5QT1M7CisJfQorcG9sbF9mb3Jfd29ya19sb29wOgorCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfUVVFVUVfUkVHUykgPT0gMCkgeworCQlhbmQJU0VRQ1RMLCB+UEFVU0VESVM7CisJfQorCXRlc3QJU1NUQVQwLCBTRUxET3xTRUxESQlqbnogc2VsZWN0aW9uOworCXRlc3QJU0NTSVNFUSwgRU5TRUxPCWpueiBwb2xsX2Zvcl93b3JrOworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVFdJTikgIT0gMCkgeworCQkvKgorCQkgKiBUd2luIGNoYW5uZWwgZGV2aWNlcyBjYW5ub3QgaGFuZGxlIHRoaW5ncyBsaWtlIFNFTFRPCisJCSAqIGludGVycnVwdHMgb24gdGhlICJiYWNrZ3JvdW5kIiBjaGFubmVsLiAgU28sIGlmIHdlCisJCSAqIGFyZSBzZWxlY3RpbmcsIGtlZXAgcG9sbGluZyB0aGUgY3VycmVudCBjaGFubmVsIHV0aWwKKwkJICogZWl0aGVyIGEgc2VsZWN0aW9uIG9yIHJlc2VsZWN0aW9uIG9jY3Vycy4KKwkJICovCisJCXhvcglTQkxLQ1RMLFNFTEJVU0I7CS8qIFRvZ2dsZSB0byB0aGUgb3RoZXIgYnVzICovCisJCXRlc3QJU1NUQVQwLCBTRUxET3xTRUxESQlqbnogc2VsZWN0aW9uOworCQl0ZXN0CVNDU0lTRVEsIEVOU0VMTwlqbnogcG9sbF9mb3Jfd29yazsKKwkJeG9yCVNCTEtDVEwsU0VMQlVTQjsJLyogVG9nZ2xlIGJhY2sgKi8KKwl9CisJY21wCVdBSVRJTkdfU0NCSCxTQ0JfTElTVF9OVUxMIGpuZSBzdGFydF93YWl0aW5nOwordGVzdF9xdWV1ZToKKwkvKiBIYXMgdGhlIGRyaXZlciBwb3N0ZWQgYW55IHdvcmsgZm9yIHVzPyAqLworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfUVVFVUVfUkVHUykgIT0gMCkgeworCQl0ZXN0CVFPRkZfQ1RMU1RBLCBTQ0JfQVZBSUwganogcG9sbF9mb3Jfd29ya19sb29wOworCQltb3YJTk9ORSwgU05TQ0JfUU9GRjsKKwkJaW5jCVFJTlBPUzsKKwl9IGVsc2UgeworCQlvcglTRVFDVEwsIFBBVVNFRElTOworCQljbXAJS0VSTkVMX1FJTlBPUywgQSBqZSBwb2xsX2Zvcl93b3JrX2xvb3A7CisJCWluYwlRSU5QT1M7CisJCWFuZAlTRVFDVEwsIH5QQVVTRURJUzsKKwl9CisKKy8qCisgKiBXZSBoYXZlIGF0IGxlYXN0IG9uZSBxdWV1ZWQgU0NCIG5vdyBhbmQgd2UgZG9uJ3QgaGF2ZSBhbnkgCisgKiBTQ0JzIGluIHRoZSBsaXN0IG9mIFNDQnMgYXdhaXRpbmcgc2VsZWN0aW9uLiAgSWYgd2UgaGF2ZQorICogYW55IFNDQnMgYXZhaWxhYmxlIGZvciB1c2UsIHB1bGwgdGhlIHRhZyBmcm9tIHRoZSBRSU5GSUZPCisgKiBhbmQgZ2V0IHRvIHdvcmsgb24gaXQuCisgKi8KKwlpZiAoKHAtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKSB7CisJCW1vdglBTExaRVJPUwljYWxsCWdldF9mcmVlX29yX2Rpc2Nfc2NiOworCX0KKworZGVxdWV1ZV9zY2I6CisJYWRkCUEsIC0xLCBRSU5QT1M7CisJbXZpCVFJTkZJRk9fT0ZGU0VUIGNhbGwgZmV0Y2hfYnl0ZTsKKworCWlmICgocC0+ZmxhZ3MgJiBBSENfUEFHRVNDQlMpID09IDApIHsKKwkJLyogSW4gdGhlIG5vbi1wYWdpbmcgY2FzZSwgdGhlIFNDQklEID09IGhhcmR3YXJlIFNDQiBpbmRleCAqLworCQltb3YJU0NCUFRSLCBSRVRVUk5fMjsKKwl9CitkbWFfcXVldWVkX3NjYjoKKy8qCisgKiBETUEgdGhlIFNDQiBmcm9tIGhvc3QgcmFtIGludG8gdGhlIGN1cnJlbnQgU0NCIGxvY2F0aW9uLgorICovCisJbXZpCURNQVBBUkFNUywgSERNQUVOfERJUkVDVElPTnxGSUZPUkVTRVQ7CisJbW92CVJFVFVSTl8yCSBjYWxsIGRtYV9zY2I7CisKKy8qCisgKiBQcmVzZXQgdGhlIHJlc2lkdWFsIGZpZWxkcyBpbiBjYXNlIHdlIG5ldmVyIGdvIHRocm91Z2ggYSBkYXRhIHBoYXNlLgorICogVGhpcyBpc24ndCBkb25lIGJ5IHRoZSBob3N0IHNvIHdlIGNhbiBhdm9pZCBhIERNQSB0byBjbGVhciB0aGVzZQorICogZmllbGRzIGZvciB0aGUgbm9ybWFsIGNhc2Ugb2YgSS9PIHRoYXQgY29tcGxldGVzIHdpdGhvdXQgdW5kZXJydW4KKyAqIG9yIG92ZXJydW4gY29uZGl0aW9ucy4KKyAqLworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJYm1vdiAgICBTQ0JfUkVTSURfRENOVCwgU0NCX0RBVEFDTlQsIDM7CisJfSBlbHNlIHsKKwkJbW92ICAgICBTQ0JfUkVTSURfRENOVFswXSxTQ0JfREFUQUNOVFswXTsKKwkJbW92ICAgICBTQ0JfUkVTSURfRENOVFsxXSxTQ0JfREFUQUNOVFsxXTsKKwkJbW92ICAgICBTQ0JfUkVTSURfRENOVFsyXSxTQ0JfREFUQUNOVFsyXTsKKwl9CisJbW92ICAgICBTQ0JfUkVTSURfU0dDTlQsIFNDQl9TR0NPVU5UOworCitzdGFydF9zY2I6CisJLyoKKwkgKiBQbGFjZSB1cyBvbiB0aGUgd2FpdGluZyBsaXN0IGluIGNhc2Ugb3VyIHNlbGVjdGlvbgorCSAqIGRvZXNuJ3Qgd2luIGR1cmluZyBidXMgYXJiaXRyYXRpb24uCisJICovCisJbW92CVNDQl9ORVhULFdBSVRJTkdfU0NCSDsKKwltb3YJV0FJVElOR19TQ0JILCBTQ0JQVFI7CitzdGFydF93YWl0aW5nOgorCS8qCisJICogUHVsbCB0aGUgZmlyc3QgZW50cnkgb2ZmIG9mIHRoZSB3YWl0aW5nIFNDQiBsaXN0LgorCSAqLworCW1vdglTQ0JQVFIsIFdBSVRJTkdfU0NCSDsKKwljYWxsCXN0YXJ0X3NlbGVjdGlvbjsKKwlqbXAJcG9sbF9mb3Jfd29yazsKKworc3RhcnRfc2VsZWN0aW9uOgorCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVFdJTikgIT0gMCkgeworCQlhbmQJU0lOREVYLH5TRUxCVVNCLFNCTEtDVEw7LyogQ2xlYXIgY2hhbm5lbCBzZWxlY3QgYml0ICovCisJCWFuZAlBLFNFTEJVU0IsU0NCX1RDTDsJLyogR2V0IG5ldyBjaGFubmVsIGJpdCAqLworCQlvcglTSU5ERVgsQTsKKwkJbW92CVNCTEtDVEwsU0lOREVYOwkJLyogc2VsZWN0IGNoYW5uZWwgKi8KKwl9Citpbml0aWFsaXplX3Njc2lpZDoKKwlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQlhbmQJQSwgVElELCBTQ0JfVENMOwkvKiBHZXQgdGFyZ2V0IElEICovCisJCWFuZAlTQ1NJSURfVUxUUkEyLCBPSUQ7CS8qIENsZWFyIG9sZCB0YXJnZXQgKi8KKwkJb3IJU0NTSUlEX1VMVFJBMiwgQTsKKwl9IGVsc2UgeworCQlhbmQJQSwgVElELCBTQ0JfVENMOwkvKiBHZXQgdGFyZ2V0IElEICovCisJCWFuZAlTQ1NJSUQsIE9JRDsJCS8qIENsZWFyIG9sZCB0YXJnZXQgKi8KKwkJb3IJU0NTSUlELCBBOworCX0KKwltb3YJU0NTSURBVEwsIEFMTFpFUk9TOwkJLyogY2xlYXIgb3V0IHRoZSBsYXRjaGVkICovCisJCQkJCQkvKiBkYXRhIHJlZ2lzdGVyLCB0aGlzICovCisJCQkJCQkvKiBmaXhlcyBhIGJ1ZyBvbiBzb21lICovCisJCQkJCQkvKiBjb250cm9sbGVycyB3aGVyZSB0aGUgKi8KKwkJCQkJCS8qIGxhc3QgYnl0ZSB3cml0dGVuIHRvICovCisJCQkJCQkvKiB0aGlzIHJlZ2lzdGVyIGNhbiBsZWFrICovCisJCQkJCQkvKiBvbnRvIHRoZSBkYXRhIGJ1cyBhdCAqLworCQkJCQkJLyogYmFkIHRpbWVzLCBzdWNoIGFzIGR1cmluZyAqLworCQkJCQkJLyogc2VsZWN0aW9uIHRpbWVvdXRzICovCisJbXZpCVNDU0lTRVEsIEVOU0VMT3xFTkFVVE9BVE5PfEVOUlNFTEl8RU5BVVRPQVROUCByZXQ7CisKKy8qCisgKiBJbml0aWFsaXplIFVsdHJhIG1vZGUgc2V0dGluZyBhbmQgY2xlYXIgdGhlIFNDU0kgY2hhbm5lbC4KKyAqIFNJTkRFWCBzaG91bGQgY29udGFpbiBhbnkgYWRkaXRpb25hbCBiaXQncyB0aGUgY2xpZW50IHdhbnRzCisgKiBzZXQgaW4gU1hGUkNUTDAuCisgKi8KK2luaXRpYWxpemVfY2hhbm5lbDoKKwlvcglTWEZSQ1RMMCwgQ0xSU1RDTlR8Q0xSQ0hOLCBTSU5ERVg7CisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQSkgIT0gMCkgewordWx0cmE6CisJCW12aQlTSU5ERVgsIFVMVFJBX0VOQisxOworCQl0ZXN0CVNBVkVEX1RDTCwgMHg4MAkJam56IHVsdHJhXzI7IC8qIFRhcmdldCBJRCA+IDcgKi8KKwkJZGVjCVNJTkRFWDsKK3VsdHJhXzI6CisJCW1vdiAgICAgRlVOQ1RJT04xLFNBVkVEX1RDTDsKKwkJbW92ICAgICBBLEZVTkNUSU9OMTsKKwkJdGVzdAlTSU5ESVIsIEEJanogbmR4X2R0cjsKKwkJb3IJU1hGUkNUTDAsIEZBU1QyMDsKKwl9IAorLyoKKyAqIEluaXRpYWxpemUgU0NTSVJBVEUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgZm9yIHRoaXMgdGFyZ2V0LgorICogVGhlIFNDU0lSQVRFIHNldHRpbmdzIGZvciBlYWNoIHRhcmdldCBhcmUgc3RvcmVkIGluIGFuIGFycmF5CisgKiBiYXNlZCBhdCBUQVJHX1NDU0lSQVRFLgorICovCituZHhfZHRyOgorCXNocglBLDQsU0FWRURfVENMOworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVFdJTikgIT0gMCkgeworCQl0ZXN0CVNCTEtDVEwsU0VMQlVTQglqeiBuZHhfZHRyXzI7CisJCW9yCVNBVkVEX1RDTCwgU0VMQlVTQjsgCisJCW9yCUEsMHgwODsJCQkvKiBDaGFubmVsIEIgZW50cmllcyBhZGQgOCAqLworbmR4X2R0cl8yOgorCX0KKworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCWFkZAlTSU5ERVgsIFRBUkdfT0ZGU0VULCBBOworCQltb3YJU0NTSU9GRlNFVCwgU0lORElSOworCX0KKworCWFkZAlTSU5ERVgsVEFSR19TQ1NJUkFURSxBOworCW1vdglTQ1NJUkFURSxTSU5ESVIgcmV0OworCisKK3NlbGVjdGlvbjoKKwl0ZXN0CVNTVEFUMCxTRUxETwlqbnogc2VsZWN0X291dDsKKy8qCisgKiBSZXNlbGVjdGlvbiBoYXMgYmVlbiBpbml0aWF0ZWQgYnkgYSB0YXJnZXQuIE1ha2UgYSBub3RlIHRoYXQgd2UndmUgYmVlbgorICogcmVzZWxlY3RlZCwgYnV0IGhhdmVuJ3Qgc2VlbiBhbiBJREVOVElGWSBtZXNzYWdlIGZyb20gdGhlIHRhcmdldCB5ZXQuCisgKi8KK2luaXRpYXRvcl9yZXNlbGVjdDoKKwltdmkJQ0xSU0lOVDAsIENMUlNFTERJOworCS8qIFhYWCB0ZXN0IGZvciBhbmQgaGFuZGxlIE9ORSBCSVQgY29uZGl0aW9uICovCisJYW5kCVNBVkVEX1RDTCwgU0VMSURfTUFTSywgU0VMSUQ7CisJbXZpCUNMUlNJTlQxLENMUkJVU0ZSRUU7CisJb3IJU0lNT0RFMSwgRU5CVVNGUkVFOwkJLyoKKwkJCQkJCSAqIFdlIGFyZW4ndCBleHBlY3RpbmcgYQorCQkJCQkJICogYnVzIGZyZWUsIHNvIGludGVycnVwdAorCQkJCQkJICogdGhlIGtlcm5lbCBkcml2ZXIgaWYgaXQKKwkJCQkJCSAqIGhhcHBlbnMuCisJCQkJCQkgKi8KKwltdmkJU1BJT0VOIGNhbGwJaW5pdGlhbGl6ZV9jaGFubmVsOworCW12aQlNU0dfT1VULCBNU0dfTk9PUDsJCS8qIE5vIG1lc3NhZ2UgdG8gc2VuZCAqLworCWptcAlJVGxvb3A7CisKKy8qCisgKiBBZnRlciB0aGUgc2VsZWN0aW9uLCByZW1vdmUgdGhpcyBTQ0IgZnJvbSB0aGUgIndhaXRpbmcgU0NCIgorICogbGlzdC4gIFRoaXMgaXMgYWNoaWV2ZWQgYnkgc2ltcGx5IG1vdmluZyBvdXIgIm5leHQiIHBvaW50ZXIgaW50bworICogV0FJVElOR19TQ0JILiAgT3VyIG5leHQgcG9pbnRlciB3aWxsIGJlIHNldCB0byBudWxsIHRoZSBuZXh0IHRpbWUgdGhpcworICogU0NCIGlzIHVzZWQsIHNvIGRvbid0IGJvdGhlciB3aXRoIGl0IG5vdy4KKyAqLworc2VsZWN0X291dDoKKwkvKiBUdXJuIG9mZiB0aGUgc2VsZWN0aW9uIGhhcmR3YXJlICovCisJbXZpCVNDU0lTRVEsIEVOUlNFTEl8RU5BVVRPQVROUDsJLyoKKwkJCQkJCSAqIEFUTiBvbiBwYXJpdHkgZXJyb3JzCisJCQkJCQkgKiBmb3IgImluIiBwaGFzZXMKKwkJCQkJCSAqLworCW12aQlDTFJTSU5UMCwgQ0xSU0VMRE87CisJbW92CVNDQlBUUiwgV0FJVElOR19TQ0JIOworCW1vdglXQUlUSU5HX1NDQkgsU0NCX05FWFQ7CisJbW92CVNBVkVEX1RDTCwgU0NCX1RDTDsKKwltdmkJQ0xSU0lOVDEsQ0xSQlVTRlJFRTsKKwlvcglTSU1PREUxLCBFTkJVU0ZSRUU7CQkvKgorCQkJCQkJICogV2UgYXJlbid0IGV4cGVjdGluZyBhCisJCQkJCQkgKiBidXMgZnJlZSwgc28gaW50ZXJydXB0CisJCQkJCQkgKiB0aGUga2VybmVsIGRyaXZlciBpZiBpdAorCQkJCQkJICogaGFwcGVucy4KKwkJCQkJCSAqLworCW12aQlTUElPRU4gY2FsbAlpbml0aWFsaXplX2NoYW5uZWw7CisvKgorICogQXMgc29vbiBhcyB3ZSBnZXQgYSBzdWNjZXNzZnVsIHNlbGVjdGlvbiwgdGhlIHRhcmdldCBzaG91bGQgZ28KKyAqIGludG8gdGhlIG1lc3NhZ2Ugb3V0IHBoYXNlIHNpbmNlIHdlIGhhdmUgQVROIGFzc2VydGVkLgorICovCisJbXZpCU1TR19PVVQsIE1TR19JREVOVElGWUZMQUc7CisJb3IJU0VRX0ZMQUdTLCBJREVOVElGWV9TRUVOOworCisvKgorICogTWFpbiBsb29wIGZvciBpbmZvcm1hdGlvbiB0cmFuc2ZlciBwaGFzZXMuICBXYWl0IGZvciB0aGUgdGFyZ2V0CisgKiB0byBhc3NlcnQgUkVRIGJlZm9yZSBjaGVja2luZyBNU0csIEMvRCBhbmQgSS9PIGZvciB0aGUgYnVzIHBoYXNlLgorICovCitJVGxvb3A6CisJY2FsbAlwaGFzZV9sb2NrOworCisJbW92CUEsIExBU1RQSEFTRTsKKworCXRlc3QJQSwgflBfREFUQUlOCWp6IHBfZGF0YTsKKwljbXAJQSxQX0NPTU1BTkQJamUgcF9jb21tYW5kOworCWNtcAlBLFBfTUVTR09VVAlqZSBwX21lc2dvdXQ7CisJY21wCUEsUF9TVEFUVVMJamUgcF9zdGF0dXM7CisJY21wCUEsUF9NRVNHSU4JamUgcF9tZXNnaW47CisKKwltdmkJSU5UU1RBVCxCQURfUEhBU0U7CS8qIHVua25vd24gcGhhc2UgLSBzaWduYWwgZHJpdmVyICovCisJam1wCUlUbG9vcDsJCQkvKiBUcnkgcmVhZGluZyB0aGUgYnVzIGFnYWluLiAqLworCithd2FpdF9idXNmcmVlOgorCWFuZAlTSU1PREUxLCB+RU5CVVNGUkVFOworCWNhbGwJY2xlYXJfdGFyZ2V0X3N0YXRlOworCW1vdglOT05FLCBTQ1NJREFUTDsJCS8qIEFjayB0aGUgbGFzdCBieXRlICovCisJYW5kCVNYRlJDVEwwLCB+U1BJT0VOOworCXRlc3QJU1NUQVQxLFJFUUlOSVR8QlVTRlJFRQlqeiAuOworCXRlc3QJU1NUQVQxLCBCVVNGUkVFIGpueiBwb2xsX2Zvcl93b3JrOworCW12aQlJTlRTVEFULCBCQURfUEhBU0U7CisJCitjbGVhcl90YXJnZXRfc3RhdGU6CisJLyoKKwkgKiBXZSBhc3N1bWUgdGhhdCB0aGUga2VybmVsIGRyaXZlciBtYXkgcmVzZXQgdXMKKwkgKiBhdCBhbnkgdGltZSwgZXZlbiBpbiB0aGUgbWlkZGxlIG9mIGEgRE1BLCBzbworCSAqIGNsZWFyIERGQ05UUkwgdG9vLgorCSAqLworCWNscglERkNOVFJMOworCisJLyoKKwkgKiBXZSBkb24ndCBrbm93IHRoZSB0YXJnZXQgd2Ugd2lsbCBjb25uZWN0IHRvLAorCSAqIHNvIGRlZmF1bHQgdG8gbmFycm93IHRyYW5zZmVycyB0byBhdm9pZAorCSAqIHBhcml0eSBwcm9ibGVtcy4KKwkgKi8KKwlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQlibW92ICAgIFNDU0lSQVRFLCBBTExaRVJPUywgMjsKKwl9IGVsc2UgeworCQljbHIgICAgIFNDU0lSQVRFOworCQlhbmQgICAgIFNYRlJDVEwwLCB+KEZBU1QyMCk7CisJfQorCW12aQlMQVNUUEhBU0UsIFBfQlVTRlJFRTsKKwkvKiBjbGVhciB0YXJnZXQgc3BlY2lmaWMgZmxhZ3MgKi8KKwljbHIJU0VRX0ZMQUdTIHJldDsKKworCitkYXRhX3BoYXNlX3JlaW5pdDoKKy8qCisgKiBJZiB3ZSByZS1lbnRlciB0aGUgZGF0YSBwaGFzZSBhZnRlciBnb2luZyB0aHJvdWdoIGFub3RoZXIgcGhhc2UsIHRoZQorICogU1RDTlQgbWF5IGhhdmUgYmVlbiBjbGVhcmVkLCBzbyByZXN0b3JlIGl0IGZyb20gdGhlIHJlc2lkdWFsIGZpZWxkLgorICogT24gVWx0cmEyLCB3ZSBoYXZlIHRvIHB1dCBpdCBpbnRvIHRoZSBIQ05UIGZpZWxkIGJlY2F1c2Ugd2UgaGF2ZSB0bworICogZHJvcCB0aGUgZGF0YSBkb3duIGludG8gdGhlIHNoYWRvdyBsYXllciB2aWEgdGhlIHByZWxvYWQgYWJpbGl0eS4KKyAqLworIAlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQlibW92CUhBRERSLCBTSEFERFIsIDQ7CisJCWJtb3YgICAgSENOVCwgU0NCX1JFU0lEX0RDTlQsIDM7CisJfQorCWlmICgocC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykgPT0gQUhDX0FJQzc4OTUpIHsKKwkJYm1vdiAgICBTVENOVCwgU0NCX1JFU0lEX0RDTlQsIDM7CisJfQorCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pID09IDApIHsKKwkJbXZpCURJTkRFWCwgU1RDTlQ7CisJCW12aQlTQ0JfUkVTSURfRENOVAljYWxsIGJjb3B5XzM7CisJfQorCWptcAlkYXRhX3BoYXNlX2xvb3A7CitwX2RhdGE6CisgCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCW12aQlETUFQQVJBTVMsIFBSRUxPQURFTnxTQ1NJRU58SERNQUVOOworCX0gZWxzZSB7CisJCW12aQlETUFQQVJBTVMsIFdJREVPRER8U0NTSUVOfFNETUFFTnxIRE1BRU58RklGT1JFU0VUOworCX0KKwl0ZXN0CUxBU1RQSEFTRSwgSU9JIGpueiAuICsgMjsKKwlvcglETUFQQVJBTVMsIERJUkVDVElPTjsKKwljYWxsCWFzc2VydDsJCS8qCisJCQkJICogRW5zdXJlIGVudGVyaW5nIGEgZGF0YQorCQkJCSAqIHBoYXNlIGlzIG9rYXkgLSBzZWVuIGlkZW50aWZ5LCBldGMuCisJCQkJICovCisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQltdmkJQ0NTR0FERFIsIENDU0dBRERSX01BWDsKKwl9CisKKwl0ZXN0CVNFUV9GTEFHUywgRFBIQVNFCWpueiBkYXRhX3BoYXNlX3JlaW5pdDsKKwlvcglTRVFfRkxBR1MsIERQSEFTRTsJLyogd2UndmUgc2VlbiBhIGRhdGEgcGhhc2UgKi8KKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIERNQSBhZGRyZXNzIGFuZCBjb3VudGVyIGZyb20gdGhlIFNDQi4KKwkgKiBBbHNvIHNldCBTR19DT1VOVCBhbmQgU0dfTkVYVCBpbiBtZW1vcnkgc2luY2Ugd2UgY2Fubm90CisJICogbW9kaWZ5IHRoZSB2YWx1ZXMgaW4gdGhlIFNDQiBpdHNlbGYgdW50aWwgd2Ugc2VlIGEKKwkgKiBzYXZlIGRhdGEgcG9pbnRlcnMgbWVzc2FnZS4KKwkgKi8KKwlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCWJtb3YJSEFERFIsIFNDQl9EQVRBUFRSLCA3OworCQlibW92ICAgIFNHX0NPVU5ULCBTQ0JfU0dDT1VOVCwgNTsKKwkJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID09IDApIHsKKwkJCWJtb3YgICAgU1RDTlQsIEhDTlQsIDM7CisJCX0KKwl9IGVsc2UgeworCQltdmkJRElOREVYLCBIQUREUjsKKwkJbXZpCVNDQl9EQVRBUFRSCWNhbGwgYmNvcHlfNzsKKwkJY2FsbAlzZXRfc3RjbnRfZnJvbV9oY250OworCQltdmkJRElOREVYLCBTR19DT1VOVDsKKwkJbXZpCVNDQl9TR0NPVU5UCWNhbGwgYmNvcHlfNTsKKwl9CitkYXRhX3BoYXNlX2xvb3A6CisJLyogR3VhcmQgYWdhaW5zdCBvdmVycnVucyAqLworCXRlc3QJU0dfQ09VTlQsIDB4ZmYgam56IGRhdGFfcGhhc2VfaW5ib3VuZHM7CisvKgorICogVHVybiBvbiAnQml0IEJ1Y2tldCcgbW9kZSwgc2V0IHRoZSB0cmFuc2ZlciBjb3VudCB0bworICogMTZtZWcgYW5kIGxldCB0aGUgdGFyZ2V0IHJ1biB1bnRpbCBpdCBjaGFuZ2VzIHBoYXNlLgorICogV2hlbiB0aGUgdHJhbnNmZXIgY29tcGxldGVzLCBub3RpZnkgdGhlIGhvc3QgdGhhdCB3ZQorICogaGFkIGFuIG92ZXJydW4uCisgKi8KKwlvcglTWEZSQ1RMMSxCSVRCVUNLRVQ7CisJYW5kCURNQVBBUkFNUywgfihIRE1BRU58U0RNQUVOKTsKKwlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQlibW92CUhDTlQsIEFMTE9ORVMsIDM7CisJfQorCWlmICgocC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykgPT0gQUhDX0FJQzc4OTUpIHsKKwkJYm1vdglTVENOVCwgQUxMT05FUywgMzsKKwl9CisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgPT0gMCkgeworCQltdmkJU1RDTlRbMF0sIDB4RkY7CisJCW12aQlTVENOVFsxXSwgMHhGRjsKKwkJbXZpCVNUQ05UWzJdLCAweEZGOworCX0KKworZGF0YV9waGFzZV9pbmJvdW5kczoKKy8qIElmIHdlIGFyZSB0aGUgbGFzdCBTRyBibG9jaywgdGVsbCB0aGUgaGFyZHdhcmUuICovCisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJc2hsCUEsIDIsIFNHX0NPVU5UOworCQljbXAJU0dfQ09VTlQsMHgwMSBqbmUgZGF0YV9waGFzZV93aWRlb2RkOworCQlvcglBLCBMQVNUX1NFRzsKKwl9IGVsc2UgeworCQljbXAJU0dfQ09VTlQsMHgwMSBqbmUgZGF0YV9waGFzZV93aWRlb2RkOworCQlhbmQJRE1BUEFSQU1TLCB+V0lERU9ERDsKKwl9CitkYXRhX3BoYXNlX3dpZGVvZGQ6CisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsJCisJCW1vdglTR19DQUNIRVBUUiwgQTsKKwkJbW92CURGQ05UUkwsIERNQVBBUkFNUzsgLyogc3RhcnQgdGhlIG9wZXJhdGlvbiAqLworCQl0ZXN0CVNYRlJDVEwxLCBCSVRCVUNLRVQgam56IGRhdGFfcGhhc2Vfb3ZlcnJ1bjsKK3UyX3ByZWxvYWRfd2FpdDoKKwkJdGVzdAlTU1RBVDEsIFBIQVNFTUlTIGpueiB1Ml9waGFzZW1pczsKKwkJdGVzdAlERlNUQVRVUywgUFJFTE9BRF9BVkFJTCBqeiB1Ml9wcmVsb2FkX3dhaXQ7CisJfSBlbHNlIHsKKwkJbW92CURNQVBBUkFNUyAgY2FsbCBkbWE7CitkYXRhX3BoYXNlX2RtYV9kb25lOgorLyogR28gdGVsbCB0aGUgaG9zdCBhYm91dCBhbnkgb3ZlcnJ1bnMgKi8KKwkJdGVzdAlTWEZSQ1RMMSxCSVRCVUNLRVQgam56IGRhdGFfcGhhc2Vfb3ZlcnJ1bjsKKworLyogRXhpdCBpZiB3ZSBoYWQgYW4gdW5kZXJydW4uICBkbWEgY2xlYXJzIFNJTkRFWCBpbiB0aGlzIGNhc2UuICovCisJCXRlc3QJU0lOREVYLDB4ZmYJanogZGF0YV9waGFzZV9maW5pc2g7CisJfQorLyoKKyAqIEFkdmFuY2UgdGhlIHNjYXR0ZXItZ2F0aGVyIHBvaW50ZXJzIAorICovCitzZ19hZHZhbmNlOgorCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCWNtcAlTR19DT1VOVCwgMHgwMQlqZSB1Ml9kYXRhX3BoYXNlX2ZpbmlzaDsKKwl9IGVsc2UgeworCQlkZWMJU0dfQ09VTlQ7CisJCXRlc3QJU0dfQ09VTlQsIDB4ZmYJanogZGF0YV9waGFzZV9maW5pc2g7CisJfQorCisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCisJCS8qCisJCSAqIERvIHdlIGhhdmUgYW55IHByZWZldGNoIGxlZnQ/Pz8KKwkJICovCisJCWNtcAlDQ1NHQUREUiwgQ0NTR0FERFJfTUFYIGpuZSBwcmVmZXRjaF9hdmFpbDsKKworCQkvKgorCQkgKiBGZXRjaCBNSU4oQ0NTR0FERFJfTUFYLCAoU0dfQ09VTlQgKiA4KSkgYnl0ZXMuCisJCSAqLworCQlhZGQJQSwgLShDQ1NHUkFNX01BWFNFR1MgKyAxKSwgU0dfQ09VTlQ7CisJCW12aQlBLCBDQ1NHQUREUl9NQVg7CisJCWpjCS4gKyAyOworCQlzaGwJQSwgMywgU0dfQ09VTlQ7CisJCW1vdglDQ0hDTlQsIEE7CisJCWJtb3YJQ0NIQUREUiwgU0dfTkVYVCwgNDsKKwkJbXZpCUNDU0dDVEwsIENDU0dFTnxDQ1NHUkVTRVQ7CisJCXRlc3QJQ0NTR0NUTCwgQ0NTR0RPTkUganogLjsKKwkJYW5kCUNDU0dDVEwsIH5DQ1NHRU47CisJCXRlc3QJQ0NTR0NUTCwgQ0NTR0VOIGpueiAuOworCQltdmkJQ0NTR0NUTCwgQ0NTR1JFU0VUOworcHJlZmV0Y2hfYXZhaWw6CisJCWJtb3YgCUhBRERSLCBDQ1NHUkFNLCA4OworCQlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgPT0gMCkgeworCQkJYm1vdiAgICBTVENOVCwgSENOVCwgMzsKKwkJfSBlbHNlIHsKKwkJCWRlYwlTR19DT1VOVDsKKwkJfQorCX0gZWxzZSB7CisJCW12aQlESU5ERVgsIEhBRERSOworCQltdmkJU0dfTkVYVAljYWxsIGJjb3B5XzQ7CisKKwkJbXZpCUhDTlRbMF0sU0dfU0laRU9GOworCQljbHIJSENOVFsxXTsKKwkJY2xyCUhDTlRbMl07CisKKwkJb3IJREZDTlRSTCwgSERNQUVOfERJUkVDVElPTnxGSUZPUkVTRVQ7CisKKwkJY2FsbAlkbWFfZmluaXNoOworCisvKgorICogQ29weSBkYXRhIGZyb20gRklGTyBpbnRvIFNDQiBkYXRhIHBvaW50ZXIgYW5kIGRhdGEgY291bnQuCisgKiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgU0cgc2VnbWVudHMgYXJlIG9mIHRoZSBmb3JtOgorICogc3RydWN0IGFoY19kbWFfc2VnIHsKKyAqCXVfaW50MzJfdAlhZGRyOwlmb3VyIGJ5dGVzLCBsaXR0bGUtZW5kaWFuIG9yZGVyCisgKgl1X2ludDMyX3QJbGVuOwlmb3VyIGJ5dGVzLCBsaXR0bGUgZW5kaWFuIG9yZGVyCisgKiB9OworICovCisgCQltdmkJRElOREVYLCBIQUREUjsKKwkJY2FsbAlkZmRhdF9pbl83OworCQljYWxsCXNldF9zdGNudF9mcm9tX2hjbnQ7CisJfQorLyogQWR2YW5jZSB0aGUgU0cgcG9pbnRlciAqLworCWNscglBOwkJLyogYWRkIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcikgKi8KKwlhZGQJU0dfTkVYVFswXSxTR19TSVpFT0Y7CisJYWRjCVNHX05FWFRbMV0sQTsKKworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCWptcAlkYXRhX3BoYXNlX2xvb3A7CisJfSBlbHNlIHsKKwkJdGVzdCAgICBTU1RBVDEsIFJFUUlOSVQganogLjsKKwkJdGVzdAlTU1RBVDEsUEhBU0VNSVMJanogZGF0YV9waGFzZV9sb29wOworCX0KKworCisvKgorICogV2UndmUgbG9hZGVkIGFsbCBvZiBvdXIgc2VnbWVudHMgaW50byB0aGUgcHJlbG9hZCBsYXllci4gIE5vdywgd2Ugc2ltcGx5CisgKiBoYXZlIHRvIHdhaXQgZm9yIGl0IHRvIGZpbmlzaCBvciBmb3IgdXMgdG8gZ2V0IGEgcGhhc2VtaXMuICBBbmQsIHNpbmNlCisgKiB3ZSdsbCBnZXQgYSBwaGFzZW1pcyBpZiB3ZSBkbyBmaW5pc2gsIGFsbCB3ZSByZWFsbHkgbmVlZCB0byBkbyBpcyB3YWl0CisgKiBmb3IgYSBwaGFzZW1pcyB0aGVuIGNoZWNrIGlmIHdlIGRpZCBhY3R1YWxseSBjb21wbGV0ZSBhbGwgdGhlIHNlZ21lbnRzLgorICovCisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKK3UyX2RhdGFfcGhhc2VfZmluaXNoOgorCQl0ZXN0CVNTVEFUMSwgUEhBU0VNSVMgam56IHUyX3BoYXNlbWlzOworCQl0ZXN0CVNHX0NBQ0hFUFRSLCBMQVNUX1NFR19ET05FIGp6IHUyX2RhdGFfcGhhc2VfZmluaXNoOworCQljbHIJU0dfQ09VTlQ7CisJCXRlc3QJU1NUQVQxLCBSRVFJTklUCWp6IC47CisJCXRlc3QJU1NUQVQxLCBQSEFTRU1JUyBqeiBkYXRhX3BoYXNlX2xvb3A7Cit1Ml9waGFzZW1pczoKKwkJY2FsbAl1bHRyYTJfZG1hZmluaXNoOworCQl0ZXN0CVNHX0NBQ0hFUFRSLCBMQVNUX1NFR19ET05FIGpueiBkYXRhX3BoYXNlX2ZpbmlzaDsKKwkJdGVzdAlTU1RBVDIsIFNIVkFMSUQgam56IHUyX2ZpeHVwX3Jlc2lkdWFsOworCQltdmkJSU5UU1RBVCwgU0VRX1NHX0ZJWFVQOworCQlqbXAJZGF0YV9waGFzZV9maW5pc2g7Cit1Ml9maXh1cF9yZXNpZHVhbDoKKwkJc2hyCUFSR18xLCAyLCBTR19DQUNIRVBUUjsKK3UyX3BoYXNlbWlzX2xvb3A6CisJCWFuZAlBLCAweDNmLCBTR19DT1VOVDsKKwkJY21wCUFSR18xLCBBIGplIGRhdGFfcGhhc2VfZmluaXNoOworLyoKKyAqIFN1YnRyYWN0IFNHX1NJWkVPRiBmcm9tIHRoZSBTR19ORVhUIHBvaW50ZXIgYW5kIGFkZCAxIHRvIHRoZSBTR19DT1VOVAorICovCisgCQljbHIJQTsKKwkJYWRkCVNHX05FWFRbMF0sIC1TR19TSVpFT0Y7CisJCWFkYwlTR19ORVhUWzFdLCAweGZmOworCQlpbmMJU0dfQ09VTlQ7CisJCWptcAl1Ml9waGFzZW1pc19sb29wOworCX0KKworZGF0YV9waGFzZV9maW5pc2g6CisvKgorICogQWZ0ZXIgYSBETUEgZmluaXNoZXMsIHNhdmUgdGhlIFNHIGFuZCBTVENOVCByZXNpZHVhbHMgYmFjayBpbnRvIHRoZSBTQ0IKKyAqIFdlIHVzZSBTVENOVCBpbnN0ZWFkIG9mIEhDTlQsIHNpbmNlIGl0J3MgYSByZWZsZWN0aW9uIG9mIGhvdyBtYW55IGJ5dGVzIAorICogd2VyZSB0cmFuc2ZlcnJlZCBvbiB0aGUgU0NTSSAoYXMgb3Bwb3NlZCB0byB0aGUgaG9zdCkgYnVzLgorICovCisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQlibW92ICAgIFNDQl9SRVNJRF9EQ05ULCBTVENOVCwgMzsKKwkJbW92CVNDQl9SRVNJRF9TR0NOVCwgU0dfQ09VTlQ7CisJCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCQlvcglTWEZSQ1RMMCwgQ0xSU1RDTlR8Q0xSQ0hOOworCQl9CisJfSBlbHNlIHsKKwkJbW92CVNDQl9SRVNJRF9EQ05UWzBdLFNUQ05UWzBdOworCQltb3YJU0NCX1JFU0lEX0RDTlRbMV0sU1RDTlRbMV07CisJCW1vdglTQ0JfUkVTSURfRENOVFsyXSxTVENOVFsyXTsKKwkJbW92CVNDQl9SRVNJRF9TR0NOVCwgU0dfQ09VTlQ7CisJfQorCisJam1wCUlUbG9vcDsKKworZGF0YV9waGFzZV9vdmVycnVuOgorLyoKKyAqIFR1cm4gb2ZmIEJJVEJVQ0tFVCBtb2RlIGFuZCBub3RpZnkgdGhlIGhvc3QKKyAqLworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisvKgorICogV2FpdCBmb3IgdGhlIHRhcmdldCB0byBxdWl0IHRyYW5zZmVycmluZyBkYXRhIG9uIHRoZSBTQ1NJIGJ1cworICovCisgCQl0ZXN0CVNTVEFUMSwgUEhBU0VNSVMganogLjsKKwkJY2FsbAl1bHRyYTJfZG1hZmluaXNoOworCX0KKwlhbmQJU1hGUkNUTDEsIH5CSVRCVUNLRVQ7CisJbXZpCUlOVFNUQVQsREFUQV9PVkVSUlVOOworCWptcAlJVGxvb3A7CisKKworCisKKy8qCisgKiBBY3R1YWxseSB0dXJuIG9mZiB0aGUgRE1BIGhhcmR3YXJlLCBzYXZlIG91ciBjdXJyZW50IHBvc2l0aW9uIGludG8gdGhlCisgKiBwcm9wZXIgcmVzaWR1YWwgdmFyaWFibGVzLCB3YWl0IGZvciB0aGUgbmV4dCBSRVEgc2lnbmFsLCB0aGVuIGp1bXAgdG8KKyAqIHRoZSBJVGxvb3AuICBKdW1waW5nIHRvIHRoZSBJVGxvb3AgZW5zdXJlcyB0aGF0IGlmIHdlIGhhcHBlbiB0byBnZXQKKyAqIGJyb3VnaHQgaW50byB0aGUgZGF0YSBwaGFzZSBhZ2FpbiAob3IgYXJlIHN0aWxsIGluIGl0IGFmdGVyIG91ciBsYXN0CisgKiBzZWdtZW50KSB0aGF0IHdlIHdpbGwgcHJvcGVybHkgc2lnbmFsIGFuIG92ZXJydW4gdG8gdGhlIGtlcm5lbC4KKyAqLworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7Cit1bHRyYTJfZG1hZmluaXNoOgorCQl0ZXN0CURGQ05UUkwsIERJUkVDVElPTiBqbnogdWx0cmEyX2RtYWhhbHQ7CisJCWFuZAlERkNOVFJMLCB+U0NTSUVOOworCQl0ZXN0CURGQ05UUkwsIFNDU0lFTiBqbnogLjsKKwkJaWYgKChwLT5idWdzICYgQUhDX0JVR19BVVRPRkxVU0gpICE9IDApIHsKKwkJCW9yCURGQ05UUkwsIEZJRk9GTFVTSDsKKwkJfQordWx0cmEyX2RtYWZpZm9mbHVzaDoKKwkJaWYgKChwLT5idWdzICYgQUhDX0JVR19BVVRPRkxVU0gpICE9IDApIHsKKwkJCS8qCisJCQkgKiBoYXJkd2FyZSBidWcgYWxlcnQhICBUaGlzIG5lZWRsZXNzIHNldCBvZiBqdW1wcworCQkJICogd29ya3MgYXJvdW5kIGEgZ2xpdGNoIGluIHRoZSBzaWxpY29uLiAgV2hlbiB0aGUKKwkJCSAqIFBDSSBETUEgZmlmbyBnb2VzIGVtcHR5LCBidXQgdGhlcmUgaXMgc3RpbGwgU0NTSQorCQkJICogZGF0YSB0byBiZSBmbHVzaGVkIGludG8gdGhlIFBDSSBETUEgZmlmbyAoYW5kIGZyb20KKwkJCSAqIHRoZXJlIG9uIGludG8gbWFpbiBtZW1vcnkpLCB0aGUgRklGT0VNUCBiaXQgd2lsbAorCQkJICogY29tZSBvbiBiZXR3ZWVuIHRoZSB0aW1lIHdoZW4gdGhlIFBDSSBETUEgYnVmZmVyCisJCQkgKiB3ZW50IGVtcHR5IGFuZCB0aGUgbmV4dCBiaXQgb2YgZGF0YSBpcyBjb3BpZWQgZnJvbQorCQkJICogdGhlIFNDU0kgZmlmbyBpbnRvIHRoZSBQQ0kgZmlmby4gIEl0IHNob3VsZCBvbmx5CisJCQkgKiBjb21lIG9uIHdoZW4gYm90aCBGSUZPcyAobWVhbmluZyB0aGUgZW50aXJlIEZJRk8KKwkJCSAqIGNoYWluKSBhcmUgZW10cHkuICBTaW5jZSBpdCBjYW4gdGFrZSB1cCB0byA0IGN5Y2xlcworCQkJICogZm9yIG5ldyBkYXRhIHRvIGJlIGNvcGllZCBmcm9tIHRoZSBTQ1NJIGZpZm8gaW50bworCQkJICogdGhlIFBDSSBmaWZvLCB0ZXN0aW5nIGZvciBGSUZPRU1QIHN0YXR1cyBmb3IgNAorCQkJICogZXh0cmEgdGltZXMgZ2l2ZXMgdGhlIG5lZWRlZCB0aW1lIGZvciBhbnkKKwkJCSAqIHJlbWFpbmluZyBTQ1NJIGZpZm8gZGF0YSB0byBiZSBwdXQgaW4gdGhlIFBDSSBmaWZvCisJCQkgKiBiZWZvcmUgd2UgZGVjbGFyZSBpdCAqdHJ1bHkqIGVtcHR5LgorCQkJICovCisJCQl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGp6IHVsdHJhMl9kbWFmaWZvZmx1c2g7CisJCQl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGp6IHVsdHJhMl9kbWFmaWZvZmx1c2g7CisJCQl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGp6IHVsdHJhMl9kbWFmaWZvZmx1c2g7CisJCQl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGp6IHVsdHJhMl9kbWFmaWZvZmx1c2g7CisJCX0KKwkJdGVzdAlERlNUQVRVUywgRklGT0VNUCBqeiB1bHRyYTJfZG1hZmlmb2ZsdXNoOworCQl0ZXN0CURGU1RBVFVTLCBNUkVRUEVORAlqbnogLjsKK3VsdHJhMl9kbWFoYWx0OgorCQlhbmQgICAgIERGQ05UUkwsIH4oSERNQUVOfFNDU0lFTik7CisJCXRlc3QJREZDTlRSTCwgKEhETUFFTnxTQ1NJRU4pIGpueiAuOworCQlyZXQ7CisJfQorCisvKgorICogQ29tbWFuZCBwaGFzZS4gIFNldCB1cCB0aGUgRE1BIHJlZ2lzdGVycyBhbmQgbGV0ICdlciByaXAuCisgKi8KK3BfY29tbWFuZDoKKwljYWxsCWFzc2VydDsKKworLyoKKyAqIExvYWQgSEFERFIgYW5kIEhDTlQuCisgKi8KKwlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCWJtb3YJSEFERFIsIFNDQl9DTURQVFIsIDU7CisJCWJtb3YJSENOVFsxXSwgQUxMWkVST1MsIDI7CisJCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSA9PSAwKSB7CisJCQlibW92CVNUQ05ULCBIQ05ULCAzOworCQl9CisJfSBlbHNlIHsKKwkJbXZpCURJTkRFWCwgSEFERFI7CisJCW12aQlTQ0JfQ01EUFRSCWNhbGwgYmNvcHlfNTsKKwkJY2xyCUhDTlRbMV07CisJCWNscglIQ05UWzJdOworCQljYWxsCXNldF9zdGNudF9mcm9tX2hjbnQ7CisJfQorCisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID09IDApIHsKKwkJbXZpCShTQ1NJRU58U0RNQUVOfEhETUFFTnxESVJFQ1RJT058RklGT1JFU0VUKSBjYWxsIGRtYTsKKwl9IGVsc2UgeworCQltdmkJREZDTlRSTCwgKFBSRUxPQURFTnxTQ1NJRU58SERNQUVOfERJUkVDVElPTik7CisJCXRlc3QJU1NUQVQwLCBTRE9ORSBqbnogLjsKK3BfY29tbWFuZF9kbWFfbG9vcDoKKwkJdGVzdAlTU1RBVDAsIFNET05FIGpueiBwX2NvbW1hbmRfdWx0cmEyX2RtYV9kb25lOworCQl0ZXN0CVNTVEFUMSxQSEFTRU1JUwlqeiBwX2NvbW1hbmRfZG1hX2xvb3A7CS8qIGllLiB1bmRlcnJ1biAqLworcF9jb21tYW5kX3VsdHJhMl9kbWFfZG9uZToKKwkJdGVzdAlTQ1NJU0lHSSwgUkVRSQlqeiBwX2NvbW1hbmRfdWx0cmEyX3NodXRkb3duOworCQl0ZXN0CVNTVEFUMSwgKFBIQVNFTUlTfFJFUUlOSVQpCWp6IHBfY29tbWFuZF91bHRyYTJfZG1hX2RvbmU7CitwX2NvbW1hbmRfdWx0cmEyX3NodXRkb3duOgorCQlhbmQgICAgIERGQ05UUkwsIH4oSERNQUVOfFNDU0lFTik7CisJCXRlc3QJREZDTlRSTCwgKEhETUFFTnxTQ1NJRU4pIGpueiAuOworCQlvcglTWEZSQ1RMMCwgQ0xSU1RDTlR8Q0xSQ0hOOworCX0KKwlqbXAJSVRsb29wOworCisvKgorICogU3RhdHVzIHBoYXNlLiAgV2FpdCBmb3IgdGhlIGRhdGEgYnl0ZSB0byBhcHBlYXIsIHRoZW4gcmVhZCBpdAorICogYW5kIHN0b3JlIGl0IGludG8gdGhlIFNDQi4KKyAqLworcF9zdGF0dXM6CisJY2FsbAlhc3NlcnQ7CisKKwltb3YJU0NCX1RBUkdFVF9TVEFUVVMsIFNDU0lEQVRMOworCWptcAlJVGxvb3A7CisKKy8qCisgKiBNZXNzYWdlIG91dCBwaGFzZS4gIElmIE1TR19PVVQgaXMgMHg4MCwgYnVpbGQgSSBmdWxsIGluZGVudGlmeSBtZXNzYWdlCisgKiBzZXF1ZW5jZSBhbmQgc2VuZCBpdCB0byB0aGUgdGFyZ2V0LiAgSW4gYWRkaXRpb24sIGlmIHRoZSBNS19NRVNTQUdFIGJpdAorICogaXMgc2V0IGluIHRoZSBTQ0JfQ09OVFJPTCBieXRlLCBpbnRlcnJ1cHQgdGhlIGhvc3QgYW5kIGFsbG93IGl0IHRvIHNlbmQKKyAqIGl0J3Mgb3duIG1lc3NhZ2UuCisgKiAKKyAqIElmIE1TR19PVVQgaXMgPT0gSE9TVF9NU0csIGFsc28gaW50ZXJydXB0IHRoZSBob3N0IGFuZCB0YWtlIGEgbWVzc2FnZS4KKyAqIFRoaXMgaXMgZG9uZSB0byBhbGxvdyB0aGUgaHNvdCB0byBzZW5kIG1lc3NhZ2VzIG91dHNpZGUgb2YgYW4gaWRlbnRpZnkKKyAqIHNlcXVlbmNlIHdoaWxlIHByb3RlY3RpbmcgdGhlIHNlcWVuY2VyIGZyb20gdGVzdGluZyB0aGUgTUtfTUVTU0FHRSBiaXQKKyAqIG9uIGFuIFNDQiB0aGF0IG1pZ2h0IG5vdCBiZSBmb3IgdGhlIGN1cnJlbnQgbmV4dXMuIChGb3IgZXhhbXBsZSwgYQorICogQkRSIG1lc3NhZ2UgaW4gcmVzcG9uY2UgdG8gYSBiYWQgcmVzZWxlY3Rpb24gd291bGQgbGVhdmUgdXMgcG9pbnRlZCB0bworICogYW4gU0NCIHRoYXQgZG9lc24ndCBoYXZlIGFueXRoaW5nIHRvIGRvIHdpdGggdGhlIGN1cnJlbnQgdGFyZ2V0KS4KKyAqIE90aGVyd2lzZSwgdHJlYXQgTVNHX09VVCBhcyBhIDEgYnl0ZSBtZXNzYWdlIHRvIHNlbmQgKGFib3J0LCBhYm9ydCB0YWcsCisgKiBidXMgZGV2aWNlIHJlc2V0KS4KKyAqCisgKiBXaGVuIHRoZXJlIGFyZSBubyBtZXNzYWdlcyB0byBzZW5kLCBNU0dfT1VUIHNob3VsZCBiZSBzZXQgdG8gTVNHX05PT1AsCisgKiBpbiBjYXNlIHRoZSB0YXJnZXQgZGVjaWRlcyB0byBwdXQgdXMgaW4gdGhpcyBwaGFzZSBmb3Igc29tZSBzdHJhbmdlCisgKiByZWFzb24uCisgKi8KK3BfbWVzZ291dF9yZXRyeToKKwlvciAgICAgIFNDU0lTSUdPLEFUTk8sTEFTVFBIQVNFOy8qIHR1cm4gb24gQVROIGZvciB0aGUgcmV0cnkgKi8KK3BfbWVzZ291dDoKKwltb3YJU0lOREVYLCBNU0dfT1VUOworCWNtcAlTSU5ERVgsIE1TR19JREVOVElGWUZMQUcgam5lIHBfbWVzZ291dF9mcm9tX2hvc3Q7CitwX21lc2dvdXRfaWRlbnRpZnk6CisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19XSURFKSAhPSAwKSB7CisJCWFuZAlTSU5ERVgsMHhmLFNDQl9UQ0w7CS8qIGx1biAqLworCX0gZWxzZSB7CisJCWFuZAlTSU5ERVgsMHg3LFNDQl9UQ0w7CS8qIGx1biAqLworCX0KKwlhbmQJQSxESVNDRU5CLFNDQl9DT05UUk9MOwkvKiBtYXNrIG9mZiBkaXNjb25uZWN0IHByaXZsZWRnZSAqLworCW9yCVNJTkRFWCxBOwkJLyogb3IgaW4gZGlzY29ubmVjdCBwcml2bGVkZ2UgKi8KKwlvcglTSU5ERVgsTVNHX0lERU5USUZZRkxBRzsKK3BfbWVzZ291dF9ta19tZXNzYWdlOgorCXRlc3QJU0NCX0NPTlRST0wsTUtfTUVTU0FHRSAganogcF9tZXNnb3V0X3RhZzsKKwltb3YJU0NTSURBVEwsIFNJTkRFWDsJLyogU2VuZCB0aGUgbGFzdCBieXRlICovCisJam1wCXBfbWVzZ291dF9mcm9tX2hvc3QgKyAxOy8qIFNraXAgSE9TVF9NU0cgdGVzdCAqLworLyoKKyAqIFNlbmQgYSB0YWcgbWVzc2FnZSBpZiBUQUdfRU5CIGlzIHNldCBpbiB0aGUgU0NCIGNvbnRyb2wgYmxvY2suCisgKiBVc2UgU0NCX1RBRyAodGhlIHBvc2l0aW9uIGluIHRoZSBrZXJuZWwncyBTQ0IgYXJyYXkpIGFzIHRoZSB0YWcgdmFsdWUuCisgKi8KK3BfbWVzZ291dF90YWc6CisJdGVzdAlTQ0JfQ09OVFJPTCxUQUdfRU5CIGp6ICBwX21lc2dvdXRfb25lYnl0ZTsKKwltb3YJU0NTSURBVEwsIFNJTkRFWDsJLyogU2VuZCB0aGUgaWRlbnRpZnkgbWVzc2FnZSAqLworCWNhbGwJcGhhc2VfbG9jazsKKwljbXAJTEFTVFBIQVNFLCBQX01FU0dPVVQJam5lIHBfbWVzZ291dF9kb25lOworCWFuZAlTQ1NJREFUTCxUQUdfRU5CfFNDQl9UQUdfVFlQRSxTQ0JfQ09OVFJPTDsKKwljYWxsCXBoYXNlX2xvY2s7CisJY21wCUxBU1RQSEFTRSwgUF9NRVNHT1VUCWpuZSBwX21lc2dvdXRfZG9uZTsKKwltb3YJU0NCX1RBRwlqbXAgcF9tZXNnb3V0X29uZWJ5dGU7CisvKgorICogSW50ZXJydXB0IHRoZSBkcml2ZXIsIGFuZCBhbGxvdyBpdCB0byBzZW5kIGEgbWVzc2FnZQorICogaWYgaXQgYXNrcy4KKyAqLworcF9tZXNnb3V0X2Zyb21faG9zdDoKKwljbXAJU0lOREVYLCBIT1NUX01TRwlqbmUgcF9tZXNnb3V0X29uZWJ5dGU7CisJbXZpICAgICBJTlRTVEFULEFXQUlUSU5HX01TRzsKKwlub3A7CisJLyoKKwkgKiBEaWQgdGhlIGhvc3QgZGV0ZWN0IGEgcGhhc2UgY2hhbmdlPworCSAqLworCWNtcAlSRVRVUk5fMSwgTVNHT1VUX1BIQVNFTUlTIGplIHBfbWVzZ291dF9kb25lOworCitwX21lc2dvdXRfb25lYnl0ZToKKwltdmkJQ0xSU0lOVDEsIENMUkFUTk87CisJbW92CVNDU0lEQVRMLCBTSU5ERVg7CisKKy8qCisgKiBJZiB0aGUgbmV4dCBidXMgcGhhc2UgYWZ0ZXIgQVROIGRyb3BzIGlzIGEgbWVzc2FnZSBvdXQsIGl0IG1lYW5zCisgKiB0aGF0IHRoZSB0YXJnZXQgaXMgcmVxdWVzdGluZyB0aGF0IHRoZSBsYXN0IG1lc3NhZ2UocykgYmUgcmVzZW50LgorICovCisJY2FsbAlwaGFzZV9sb2NrOworCWNtcCAgICAgTEFTVFBIQVNFLCBQX01FU0dPVVQgICAgamUgcF9tZXNnb3V0X3JldHJ5OworCitwX21lc2dvdXRfZG9uZToKKwltdmkJQ0xSU0lOVDEsQ0xSQVROTzsJLyogQmUgc3VyZSB0byB0dXJuIEFUTk8gb2ZmICovCisJbW92CUxBU1RfTVNHLCBNU0dfT1VUOworCWNtcAlNU0dfT1VULCBNU0dfSURFTlRJRllGTEFHIGpuZSAuICsgMjsKKwlhbmQJU0NCX0NPTlRST0wsIH5NS19NRVNTQUdFOworCW12aQlNU0dfT1VULCBNU0dfTk9PUDsJLyogTm8gbWVzc2FnZSBsZWZ0ICovCisJam1wCUlUbG9vcDsKKworLyoKKyAqIE1lc3NhZ2UgaW4gcGhhc2UuICBCeXRlcyBhcmUgcmVhZCB1c2luZyBBdXRvbWF0aWMgUElPIG1vZGUuCisgKi8KK3BfbWVzZ2luOgorCW12aQlBQ0NVTQkJY2FsbCBpbmJfZmlyc3Q7CS8qIHJlYWQgdGhlIDFzdCBtZXNzYWdlIGJ5dGUgKi8KKworCXRlc3QJQSxNU0dfSURFTlRJRllGTEFHCWpueiBtZXNnaW5faWRlbnRpZnk7CisJY21wCUEsTVNHX0RJU0NPTk5FQ1QJamUgbWVzZ2luX2Rpc2Nvbm5lY3Q7CisJY21wCUEsTVNHX1NBVkVEQVRBUE9JTlRFUglqZSBtZXNnaW5fc2RwdHJzOworCWNtcAlBTExaRVJPUyxBCQlqZSBtZXNnaW5fY29tcGxldGU7CisJY21wCUEsTVNHX1JFU1RPUkVQT0lOVEVSUwlqZSBtZXNnaW5fcmRwdHJzOworCWNtcAlBLE1TR19FWFRFTkRFRAkJamUgbWVzZ2luX2V4dGVuZGVkOworCWNtcAlBLE1TR19NRVNTQUdFX1JFSkVDVAlqZSBtZXNnaW5fcmVqZWN0OworCWNtcAlBLE1TR19OT09QCQlqZSBtZXNnaW5fZG9uZTsKKwljbXAJQSxNU0dfSUdOX1dJREVfUkVTSURVRQlqZSBtZXNnaW5fd2lkZV9yZXNpZHVlOworCityZWpfbWVzZ2luOgorLyoKKyAqIFdlIGhhdmUgbm8gaWRlYSB3aGF0IHRoaXMgbWVzc2FnZSBpbiBpcywgc28gd2UgaXNzdWUgYSBtZXNzYWdlIHJlamVjdAorICogYW5kIGhvcGUgZm9yIHRoZSBiZXN0LiAgSW4gYW55IGNhc2UsIHJlamVjdGlvbiBzaG91bGQgYmUgYSByYXJlCisgKiBvY2N1cnJlbmNlIC0gc2lnbmFsIHRoZSBkcml2ZXIgd2hlbiBpdCBoYXBwZW5zLgorICovCisJbXZpCUlOVFNUQVQsU0VORF9SRUpFQ1Q7CQkvKiBsZXQgZHJpdmVyIGtub3cgKi8KKworCW12aQlNU0dfTUVTU0FHRV9SRUpFQ1QJY2FsbCBta19tZXNnOworCittZXNnaW5fZG9uZToKKwltb3YJTk9ORSxTQ1NJREFUTDsJCS8qZHVtbXkgcmVhZCBmcm9tIGxhdGNoIHRvIEFDSyovCisJam1wCUlUbG9vcDsKKworCittZXNnaW5fY29tcGxldGU6CisvKgorICogV2UgZ290IGEgImNvbW1hbmQgY29tcGxldGUiIG1lc3NhZ2UsIHNvIHB1dCB0aGUgU0NCX1RBRyBpbnRvIHRoZSBRT1VURklGTywKKyAqIGFuZCB0cmlnZ2VyIGEgY29tcGxldGlvbiBpbnRlcnJ1cHQuICBCZWZvcmUgZG9pbmcgc28sIGNoZWNrIHRvIHNlZSBpZiB0aGVyZQorICogaXMgYSByZXNpZHVhbCBvciB0aGUgc3RhdHVzIGJ5dGUgaXMgc29tZXRoaW5nIG90aGVyIHRoYW4gU1RBVFVTX0dPT0QgKDApLgorICogSW4gZWl0aGVyIG9mIHRoZXNlIGNvbmRpdGlvbnMsIHdlIHVwbG9hZCB0aGUgU0NCIGJhY2sgdG8gdGhlIGhvc3Qgc28gaXQgY2FuCisgKiBwcm9jZXNzIHRoaXMgaW5mb3JtYXRpb24uICBJbiB0aGUgY2FzZSBvZiBhIG5vbiB6ZXJvIHN0YXR1cyBieXRlLCB3ZSAKKyAqIGFkZGl0aW9uYWxseSBpbnRlcnJ1cHQgdGhlIGtlcm5lbCBkcml2ZXIgc3luY2hyb25vdXNseSwgYWxsb3dpbmcgaXQgdG8KKyAqIGRlY2lkZSBpZiBzZW5zZSBzaG91bGQgYmUgcmV0cmlldmVkLiAgSWYgdGhlIGtlcm5lbCBkcml2ZXIgd2lzaGVzIHRvIHJlcXVlc3QKKyAqIHNlbnNlLCBpdCB3aWxsIGZpbGwgdGhlIGtlcm5lbCBTQ0Igd2l0aCBhIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZCBhbmQgc2V0CisgKiBSRVRVUk5fMSB0byBTRU5EX1NFTlNFLiAgSWYgUkVUVVJOXzEgaXMgc2V0IHRvIFNFTkRfU0VOU0Ugd2UgcmVkb3dubG9hZAorICogdGhlIFNDQiwgYW5kIHByb2Nlc3MgaXQgYXMgdGhlIG5leHQgY29tbWFuZCBieSBhZGRpbmcgaXQgdG8gdGhlIHdhaXRpbmcgbGlzdC4KKyAqIElmIHRoZSBrZXJuZWwgZHJpdmVyIGRvZXMgbm90IHdpc2ggdG8gcmVxdWVzdCBzZW5zZSwgaXQgbmVlZCBvbmx5IGNsZWFyCisgKiBSRVRVUk5fMSwgYW5kIHRoZSBjb21tYW5kIGlzIGFsbG93ZWQgdG8gY29tcGxldGUgbm9ybWFsbHkuICBXZSBkb24ndCBib3RoZXIKKyAqIHRvIHBvc3QgdG8gdGhlIFFPVVRGSUZPIGluIHRoZSBlcnJvciBjYXNlcyBzaW5jZSBpdCB3b3VsZCByZXF1aXJlIGV4dHJhCisgKiB3b3JrIGluIHRoZSBrZXJuZWwgZHJpdmVyIHRvIGVuc3VyZSB0aGF0IHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCBiZWZvcmUgdGhlCisgKiBjb21tYW5kIGNvbXBsZXRlIGNvZGUgdHJpZWQgcHJvY2Vzc2luZyBpdC4KKyAqLworCisvKgorICogRmlyc3QgY2hlY2sgZm9yIHJlc2lkdWFscworICovCisJdGVzdAlTQ0JfUkVTSURfU0dDTlQsMHhmZglqbnogdXBsb2FkX3NjYjsKKwl0ZXN0CVNDQl9UQVJHRVRfU1RBVFVTLDB4ZmYJanogY29tcGxldGU7CS8qIEdvb2QgU3RhdHVzPyAqLwordXBsb2FkX3NjYjoKKwltdmkJRE1BUEFSQU1TLCBGSUZPUkVTRVQ7CisJbW92CVNDQl9UQUcJCWNhbGwgZG1hX3NjYjsKK2NoZWNrX3N0YXR1czoKKwl0ZXN0CVNDQl9UQVJHRVRfU1RBVFVTLDB4ZmYJanogY29tcGxldGU7CS8qIEp1c3QgYSByZXNpZHVhbD8gKi8KKwltdmkJSU5UU1RBVCxCQURfU1RBVFVTOwkJCS8qIGxldCBkcml2ZXIga25vdyAqLworCW5vcDsKKwljbXAJUkVUVVJOXzEsIFNFTkRfU0VOU0UJam5lIGNvbXBsZXRlOworCS8qIFRoaXMgU0NCIGJlY29tZXMgdGhlIG5leHQgdG8gZXhlY3V0ZSBhcyBpdCB3aWxsIHJldHJpZXZlIHNlbnNlICovCisJbXZpCURNQVBBUkFNUywgSERNQUVOfERJUkVDVElPTnxGSUZPUkVTRVQ7CisJbW92CVNDQl9UQUcJCWNhbGwgZG1hX3NjYjsKK2FkZF90b193YWl0aW5nX2xpc3Q6CisJbW92CVNDQl9ORVhULFdBSVRJTkdfU0NCSDsKKwltb3YJV0FJVElOR19TQ0JILCBTQ0JQVFI7CisJLyoKKwkgKiBQcmVwYXJlIG91ciBzZWxlY3Rpb24gaGFyZHdhcmUgYmVmb3JlIHRoZSBidXNmcmVlIHNvIHdlIGhhdmUgYQorCSAqIGhpZ2ggcHJvYmFiaWxpdHkgb2Ygd2lubmluZyBhcmJpdHJhdGlvbi4KKwkgKi8KKwljYWxsCXN0YXJ0X3NlbGVjdGlvbjsKKwlqbXAJYXdhaXRfYnVzZnJlZTsKKworY29tcGxldGU6CisJLyogSWYgd2UgYXJlIHVudGFnZ2VkLCBjbGVhciBvdXIgYWRkcmVzcyB1cCBpbiBob3N0IHJhbSAqLworCXRlc3QJU0NCX0NPTlRST0wsIFRBR19FTkIgam56IGNvbXBsZXRlX3Bvc3Q7CisJbW92CUEsIFNBVkVEX1RDTDsKKwltdmkJVU5UQUdHRURTQ0JfT0ZGU0VUIGNhbGwgcG9zdF9ieXRlX3NldHVwOworCW12aQlTQ0JfTElTVF9OVUxMIGNhbGwgcG9zdF9ieXRlOworCitjb21wbGV0ZV9wb3N0OgorCS8qIFBvc3QgdGhlIFNDQiBhbmQgaXNzdWUgYW4gaW50ZXJydXB0ICovCisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19RVUVVRV9SRUdTKSAhPSAwKSB7CisJCW1vdglBLCBTRFNDQl9RT0ZGOworCX0gZWxzZSB7CisJCW1vdglBLCBRT1VUUE9TOworCX0KKwltdmkJUU9VVEZJRk9fT0ZGU0VUIGNhbGwgcG9zdF9ieXRlX3NldHVwOworCW1vdglTQ0JfVEFHIGNhbGwgcG9zdF9ieXRlOworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfUVVFVUVfUkVHUykgPT0gMCkgeworCQlpbmMgCVFPVVRQT1M7CisJfQorCW12aQlJTlRTVEFULENNRENNUExUOworCithZGRfdG9fZnJlZV9saXN0OgorCWNhbGwJYWRkX3NjYl90b19mcmVlX2xpc3Q7CisJam1wCWF3YWl0X2J1c2ZyZWU7CisKKy8qCisgKiBJcyBpdCBhbiBleHRlbmRlZCBtZXNzYWdlPyAgQ29weSB0aGUgbWVzc2FnZSB0byBvdXIgbWVzc2FnZSBidWZmZXIgYW5kCisgKiBub3RpZnkgdGhlIGhvc3QuICBUaGUgaG9zdCB3aWxsIHRlbGwgdXMgd2hldGhlciB0byByZWplY3QgdGhpcyBtZXNzYWdlLAorICogcmVzcG9uZCB0byBpdCB3aXRoIHRoZSBtZXNzYWdlIHRoYXQgdGhlIGhvc3QgcGxhY2VkIGluIG91ciBtZXNzYWdlIGJ1ZmZlciwKKyAqIG9yIHNpbXBseSB0byBkbyBub3RoaW5nLgorICovCittZXNnaW5fZXh0ZW5kZWQ6CisJbXZpCUlOVFNUQVQsRVhURU5ERURfTVNHOwkJLyogbGV0IGRyaXZlciBrbm93ICovCisJam1wCUlUbG9vcDsKKworLyoKKyAqIElzIGl0IGEgZGlzY29ubmVjdCBtZXNzYWdlPyAgU2V0IGEgZmxhZyBpbiB0aGUgU0NCIHRvIHJlbWluZCB1cworICogYW5kIGF3YWl0IHRoZSBidXMgZ29pbmcgZnJlZS4KKyAqLworbWVzZ2luX2Rpc2Nvbm5lY3Q6CisJb3IJU0NCX0NPTlRST0wsRElTQ09OTkVDVEVEOworCWNhbGwJYWRkX3NjYl90b19kaXNjX2xpc3Q7CisJam1wCWF3YWl0X2J1c2ZyZWU7CisKKy8qCisgKiBTYXZlIGRhdGEgcG9pbnRlcnMgbWVzc2FnZToKKyAqIENvcHlpbmcgUkFNIHZhbHVlcyBiYWNrIHRvIFNDQiwgZm9yIFNhdmUgRGF0YSBQb2ludGVycyBtZXNzYWdlLCBidXQKKyAqIG9ubHkgaWYgd2UndmUgYWN0dWFsbHkgYmVlbiBpbnRvIGEgZGF0YSBwaGFzZSB0byBjaGFuZ2UgdGhlbS4gIFRoaXMKKyAqIHByb3RlY3RzIGFnYWluc3QgYm9ndXMgZGF0YSBpbiBzY3JhdGNoIHJhbSBhbmQgdGhlIHJlc2lkdWFsIGNvdW50cworICogc2luY2UgdGhleSBhcmUgb25seSBpbml0aWFsaXplZCB3aGVuIHdlIGdvIGludG8gZGF0YV9pbiBvciBkYXRhX291dC4KKyAqLworbWVzZ2luX3NkcHRyczoKKwl0ZXN0CVNFUV9GTEFHUywgRFBIQVNFCWp6IG1lc2dpbl9kb25lOworCS8qCisJICogVGhlIFNDQiBTR1BUUiBiZWNvbWVzIHRoZSBuZXh0IG9uZSB3ZSdsbCBkb3dubG9hZCwKKwkgKiBhbmQgdGhlIFNDQiBEQVRBUFRSIGJlY29tZXMgdGhlIGN1cnJlbnQgU0hBRERSLgorCSAqIFVzZSB0aGUgcmVzaWR1YWwgbnVtYmVyIHNpbmNlIFNUQ05UIGlzIGNvcnJ1cHRlZCBieQorCSAqIGFueSBtZXNzYWdlIHRyYW5zZmVyLgorCSAqLworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJYm1vdiAgICBTQ0JfU0dDT1VOVCwgU0dfQ09VTlQsIDU7CisJCWJtb3YgICAgU0NCX0RBVEFQVFIsIFNIQUREUiwgNDsKKwkJYm1vdiAgICBTQ0JfREFUQUNOVCwgU0NCX1JFU0lEX0RDTlQsIDM7CisJfSBlbHNlIHsKKwkJbXZpCURJTkRFWCwgU0NCX1NHQ09VTlQ7CisJCW12aQlTR19DT1VOVAljYWxsIGJjb3B5XzU7CisJCW12aQlESU5ERVgsIFNDQl9EQVRBUFRSOworCQltdmkJU0hBRERSCQljYWxsIGJjb3B5XzQ7CisJCW12aQlTQ0JfUkVTSURfRENOVAljYWxsCWJjb3B5XzM7CisJfQorCWptcAltZXNnaW5fZG9uZTsKKworLyoKKyAqIFJlc3RvcmUgcG9pbnRlcnMgbWVzc2FnZT8gIERhdGEgcG9pbnRlcnMgYXJlIHJlY29waWVkIGZyb20gdGhlCisgKiBTQ0IgYW55dGltZSB3ZSBlbnRlciBhIGRhdGEgcGhhc2UgZm9yIHRoZSBmaXJzdCB0aW1lLCBzbyBhbGwKKyAqIHdlIG5lZWQgdG8gZG8gaXMgY2xlYXIgdGhlIERQSEFTRSBmbGFnIGFuZCBsZXQgdGhlIGRhdGEgcGhhc2UKKyAqIGNvZGUgZG8gdGhlIHJlc3QuCisgKi8KK21lc2dpbl9yZHB0cnM6CisJYW5kCVNFUV9GTEFHUywgfkRQSEFTRTsJCS8qCisJCQkJCQkgKiBXZSdsbCByZWxvYWQgdGhlbQorCQkJCQkJICogdGhlIG5leHQgdGltZSB0aHJvdWdoCisJCQkJCQkgKiB0aGUgZGF0YXBoYXNlLgorCQkJCQkJICovCisJam1wCW1lc2dpbl9kb25lOworCisvKgorICogSWRlbnRpZnkgbWVzc2FnZT8gIEZvciBhIHJlY29ubmVjdGluZyB0YXJnZXQsIHRoaXMgdGVsbHMgdXMgdGhlIGx1bgorICogdGhhdCB0aGUgcmVjb25uZWN0aW9uIGlzIGZvciAtIGZpbmQgdGhlIGNvcnJlY3QgU0NCIGFuZCBzd2l0Y2ggdG8gaXQsCisgKiBjbGVhcmluZyB0aGUgImRpc2Nvbm5lY3RlZCIgYml0IHNvIHdlIGRvbid0ICJmaW5kIiBpdCBieSBhY2NpZGVudCBsYXRlci4KKyAqLworbWVzZ2luX2lkZW50aWZ5OgorCQorCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfV0lERSkgIT0gMCkgeworCQlhbmQJQSwweDBmOwkJLyogbHVuIGluIGxvd2VyIGZvdXIgYml0cyAqLworCX0gZWxzZSB7CisJCWFuZAlBLDB4MDc7CQkvKiBsdW4gaW4gbG93ZXIgdGhyZWUgYml0cyAqLworCX0KKwlvciAgICAgIFNBVkVEX1RDTCxBOwkJLyogU0FWRURfVENMIHNob3VsZCBiZSBjb21wbGV0ZSBub3cgKi8KKworCW12aSAgICAgQVJHXzIsIFNDQl9MSVNUX05VTEw7ICAgLyogU0NCSUQgb2YgcHJldiBTQ0IgaW4gZGlzYyBMaXN0ICovCisJY2FsbAlnZXRfdW50YWdnZWRfU0NCSUQ7CisJY21wCUFSR18xLCBTQ0JfTElTVF9OVUxMCWplIHNub29wX3RhZzsKKwlpZiAoKHAtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKSB7CisJCXRlc3QJU0VRX0ZMQUdTLCBTQ0JQVFJfVkFMSUQJanogdXNlX3JldHJpZXZlU0NCOworCX0KKwkvKgorCSAqIElmIHRoZSBTQ0Igd2FzIGZvdW5kIGluIHRoZSBkaXNjb25uZWN0ZWQgbGlzdCAoYXMgaXMKKwkgKiBhbHdheXMgdGhlIGNhc2UgaW4gbm9uLXBhZ2luZyBzY2VuYXJpb3MpLCBTQ0JQVFIgaXMgYWxyZWFkeQorCSAqIHNldCB0byB0aGUgY29ycmVjdCBTQ0IuICBTbywgc2ltcGx5IHNldHVwIHRoZSBTQ0IgYW5kIGdldAorCSAqIG9uIHdpdGggdGhpbmdzLgorCSAqLworCW1vdglTQ0JQVFIJY2FsbCByZW1fc2NiX2Zyb21fZGlzY19saXN0OworCWptcAlzZXR1cF9TQ0I7CisvKgorICogSGVyZSB3ZSAic25vb3AiIHRoZSBidXMgbG9va2luZyBmb3IgYSBTSU1QTEUgUVVFVUUgVEFHIG1lc3NhZ2UuCisgKiBJZiB3ZSBnZXQgb25lLCB3ZSB1c2UgdGhlIHRhZyByZXR1cm5lZCB0byBmaW5kIHRoZSBwcm9wZXIKKyAqIFNDQi4gIFdpdGggU0NCIHBhZ2luZywgdGhpcyByZXF1aXJlcyB1c2luZyBzZWFyY2ggZm9yIGJvdGggdGFnZ2VkCisgKiBhbmQgbm9uLXRhZ2dlZCB0cmFuc2FjdGlvbnMgc2luY2UgdGhlIFNDQiBtYXkgZXhpc3QgaW4gYW55IHNsb3QuCisgKiBJZiB3ZSdyZSBub3QgdXNpbmcgU0NCIHBhZ2luZywgd2UgY2FuIHVzZSB0aGUgdGFnIGFzIHRoZSBkaXJlY3QKKyAqIGluZGV4IHRvIHRoZSBTQ0IuCisgKi8KK3Nub29wX3RhZzoKKwltb3YJTk9ORSxTQ1NJREFUTDsJCS8qIEFDSyBJZGVudGlmeSBNU0cgKi8KK3Nub29wX3RhZ19sb29wOgorCWNhbGwJcGhhc2VfbG9jazsKKwljbXAJTEFTVFBIQVNFLCBQX01FU0dJTglqbmUgbm90X2ZvdW5kOworCWNtcAlTQ1NJQlVTTCxNU0dfU0lNUExFX1FfVEFHIGpuZSBub3RfZm91bmQ7CitnZXRfdGFnOgorCW12aQlBUkdfMQljYWxsIGluYl9uZXh0OwkvKiB0YWcgdmFsdWUgKi8KKwordXNlX3JldHJpZXZlU0NCOgorCWNhbGwJcmV0cmlldmVTQ0I7CitzZXR1cF9TQ0I6CisJbW92CUEsIFNBVkVEX1RDTDsKKwljbXAJU0NCX1RDTCwgQQlqbmUgbm90X2ZvdW5kX2NsZWFudXBfc2NiOworCXRlc3QJU0NCX0NPTlRST0wsRElTQ09OTkVDVEVEIGp6IG5vdF9mb3VuZF9jbGVhbnVwX3NjYjsKKwlhbmQJU0NCX0NPTlRST0wsfkRJU0NPTk5FQ1RFRDsKKwlvcglTRVFfRkxBR1MsSURFTlRJRllfU0VFTjsJICAvKiBtYWtlIG5vdGUgb2YgSURFTlRJRlkgKi8KKwkvKiBTZWUgaWYgdGhlIGhvc3Qgd2FudHMgdG8gc2VuZCBhIG1lc3NhZ2UgdXBvbiByZWNvbm5lY3Rpb24gKi8KKwl0ZXN0CVNDQl9DT05UUk9MLCBNS19NRVNTQUdFIGp6IG1lc2dpbl9kb25lOworCWFuZAlTQ0JfQ09OVFJPTCwgfk1LX01FU1NBR0U7CisJbXZpCUhPU1RfTVNHCWNhbGwgbWtfbWVzZzsKKwlqbXAJbWVzZ2luX2RvbmU7CisKK25vdF9mb3VuZF9jbGVhbnVwX3NjYjoKKwl0ZXN0CVNDQl9DT05UUk9MLCBESVNDT05ORUNURUQganogLiArIDM7CisJY2FsbAlhZGRfc2NiX3RvX2Rpc2NfbGlzdDsKKwlqbXAJbm90X2ZvdW5kOworCWNhbGwJYWRkX3NjYl90b19mcmVlX2xpc3Q7Citub3RfZm91bmQ6CisJbXZpCUlOVFNUQVQsIE5PX01BVENIOworCW12aQlNU0dfQlVTX0RFVl9SRVNFVAljYWxsIG1rX21lc2c7CisJam1wCW1lc2dpbl9kb25lOworCisvKgorICogTWVzc2FnZSByZWplY3Q/ICBMZXQgdGhlIGtlcm5lbCBkcml2ZXIgaGFuZGxlIHRoaXMuICBJZiB3ZSBoYXZlIGFuIAorICogb3V0c3RhbmRpbmcgV0RUUiBvciBTRFRSIG5lZ290aWF0aW9uLCBhc3N1bWUgdGhhdCBpdCdzIGEgcmVzcG9uc2UgZnJvbSAKKyAqIHRoZSB0YXJnZXQgc2VsZWN0aW5nIDhiaXQgb3IgYXN5bmNocm9ub3VzIHRyYW5zZmVyLCBvdGhlcndpc2UganVzdCBpZ25vcmUgCisgKiBpdCBzaW5jZSB3ZSBoYXZlIG5vIGNsdWUgd2hhdCBpdCBwZXJ0YWlucyB0by4KKyAqLworbWVzZ2luX3JlamVjdDoKKwltdmkJSU5UU1RBVCwgUkVKRUNUX01TRzsKKwlqbXAJbWVzZ2luX2RvbmU7CisKKy8qCisgKiBXaWRlIFJlc2lkdWUuICBXZSBoYW5kbGUgdGhlIHNpbXBsZSBjYXNlcywgYnV0IHBhc3Mgb2YgdGhlIG9uZSBoYXJkIGNhc2UKKyAqIHRvIHRoZSBrZXJuZWwgKHdoZW4gdGhlIHJlc2lkdWUgYnl0ZSBoYXBwZW5lZCB0byBjYXVzZSB1cyB0byBhZHZhbmNlIG91cgorICogc2cgZWxlbWVudCBhcnJheSwgc28gd2Uga25vdyBoYXZlIHRvIGJhY2sgdGhhdCBhZHZhbmNlIG91dCkuCisgKi8KK21lc2dpbl93aWRlX3Jlc2lkdWU6CisJbXZpCUFSR18xCWNhbGwgaW5iX25leHQ7IC8qIEFDSyB0aGUgd2lkZV9yZXNpZHVlIGFuZCBnZXQgKi8KKwkJCQkgICAgICAgLyogdGhlIHNpemUgYnl0ZSAqLworLyoKKyAqIEluIG9yZGVyIGZvciB0aGlzIHRvIGJlIHJlbGlhYmxlLCB3ZSBoYXZlIHRvIGRvIGFsbCBzb3J0cyBvZiBob3JyaWJsZQorICogbWFnaWMgaW4gdGVybXMgb2YgcmVzZXR0aW5nIHRoZSBkYXRhZmlmbyBhbmQgcmVsb2FkaW5nIHRoZSBzaGFkb3cgbGF5ZXIKKyAqIHdpdGggdGhlIGNvcnJlY3QgbmV3IHZhbHVlcyAoc28gdGhhdCBhIHN1YnNlcXVlbnQgc2F2ZSBkYXRhIHBvaW50ZXJzCisgKiBtZXNzYWdlIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nKS4gIFdlIGxldCB0aGUga2VybmVsIGRvIHRoYXQgd29yay4KKyAqLworIAltdmkJSU5UU1RBVCwgV0lERV9SRVNJRFVFOworCWptcAltZXNnaW5fZG9uZTsKKwkKKy8qCisgKiBbIEFERCBNT1JFIE1FU1NBR0UgSEFORExJTkcgSEVSRSBdCisgKi8KKworLyoKKyAqIExvY2tpbmcgdGhlIGRyaXZlciBvdXQsIGJ1aWxkIGEgb25lLWJ5dGUgbWVzc2FnZSBwYXNzZWQgaW4gU0lOREVYCisgKiBpZiB0aGVyZSBpcyBubyBhY3RpdmUgbWVzc2FnZSBhbHJlYWR5LiAgU0lOREVYIGlzIHJldHVybmVkIGludGFjdC4KKyAqLworbWtfbWVzZzoKKwlvcglTQ1NJU0lHTyxBVE5PLExBU1RQSEFTRTsvKiB0dXJuIG9uIEFUTk8gKi8KKwltb3YJTVNHX09VVCxTSU5ERVggcmV0OworCisvKgorICogRnVuY3Rpb25zIHRvIHJlYWQgZGF0YSBpbiBBdXRvbWF0aWMgUElPIG1vZGUuCisgKgorICogQWNjb3JkaW5nIHRvIEFkYXB0ZWMncyBkb2N1bWVudGF0aW9uLCBhbiBBQ0sgaXMgbm90IHNlbnQgb24gaW5wdXQgZnJvbQorICogdGhlIHRhcmdldCB1bnRpbCBTQ1NJREFUTCBpcyByZWFkIGZyb20uICBTbyB3ZSB3YWl0IHVudGlsIFNDU0lEQVRMIGlzCisgKiBsYXRjaGVkICh0aGUgdXN1YWwgd2F5KSwgdGhlbiByZWFkIHRoZSBkYXRhIGJ5dGUgZGlyZWN0bHkgb2ZmIHRoZSBidXMKKyAqIHVzaW5nIFNDU0lCVVNMLiAgV2hlbiB3ZSBoYXZlIHB1bGxlZCB0aGUgQVROIGxpbmUsIG9yIHdlIGp1c3Qgd2FudCB0bworICogYWNrbm93bGVkZ2UgdGhlIGJ5dGUsIHRoZW4gd2UgZG8gYSBkdW1teSByZWFkIGZyb20gU0NJU0RBVEwuICBUaGUgU0NTSQorICogc3BlYyBndWFyYW50ZWVzIHRoYXQgdGhlIHRhcmdldCB3aWxsIGhvbGQgdGhlIGRhdGEgYnl0ZSBvbiB0aGUgYnVzIHVudGlsCisgKiB3ZSBzZW5kIG91ciBBQ0suCisgKgorICogVGhlIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IHRoZXNlIGFyZSBjYWxsZWQgaW4gYSBwYXJ0aWN1bGFyIHNlcXVlbmNlLAorICogYW5kIHRoYXQgUkVRIGlzIGFscmVhZHkgc2V0IHdoZW4gaW5iX2ZpcnN0IGlzIGNhbGxlZC4gIGluYl97Zmlyc3QsbmV4dH0KKyAqIHVzZSB0aGUgc2FtZSBjYWxsaW5nIGNvbnZlbnRpb24gYXMgaW5iLgorICovCisKK2luYl9uZXh0OgorCW1vdglOT05FLFNDU0lEQVRMOwkJLypkdW1teSByZWFkIGZyb20gbGF0Y2ggdG8gQUNLKi8KK2luYl9uZXh0X3dhaXQ6CisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIHBhcml0eSBlcnJvciwgd2FpdCBmb3IgdGhlIGtlcm5lbCB0bworCSAqIHNlZSB0aGUgaW50ZXJydXB0IGFuZCBwcmVwYXJlIG91ciBtZXNzYWdlIHJlc3BvbnNlCisJICogYmVmb3JlIGNvbnRpbnVpbmcuCisJICovCisJdGVzdAlTU1RBVDEsIFJFUUlOSVQJanogaW5iX25leHRfd2FpdDsKKwl0ZXN0CVNTVEFUMSwgU0NTSVBFUlIgam56IC47CisJYW5kCUxBU1RQSEFTRSwgUEhBU0VfTUFTSywgU0NTSVNJR0k7CisJY21wCUxBU1RQSEFTRSwgUF9NRVNHSU4gam5lIG1lc2dpbl9waGFzZW1pczsKK2luYl9maXJzdDoKKwltb3YJRElOREVYLFNJTkRFWDsKKwltb3YJRElORElSLFNDU0lCVVNMCXJldDsJCS8qcmVhZCBieXRlIGRpcmVjdGx5IGZyb20gYnVzKi8KK2luYl9sYXN0OgorCW1vdglOT05FLFNDU0lEQVRMIHJldDsJCS8qZHVtbXkgcmVhZCBmcm9tIGxhdGNoIHRvIEFDSyovCisKKwkKK21lc2dpbl9waGFzZW1pczoKKy8qCisgKiBXZSBleHBlY3RlZCB0byByZWNlaXZlIGFub3RoZXIgYnl0ZSwgYnV0IHRoZSB0YXJnZXQgY2hhbmdlZCBwaGFzZQorICovCisJbXZpCUlOVFNUQVQsIE1TR0lOX1BIQVNFTUlTOworCWptcAlJVGxvb3A7CisKKy8qCisgKiBETUEgZGF0YSB0cmFuc2Zlci4gIEhBRERSIGFuZCBIQ05UIG11c3QgYmUgbG9hZGVkIGZpcnN0LCBhbmQKKyAqIFNJTkRFWCBzaG91bGQgY29udGFpbiB0aGUgdmFsdWUgdG8gbG9hZCBERkNOVFJMIHdpdGggLSAweDNkIGZvcgorICogaG9zdC0+c2NzaSwgb3IgMHgzOSBmb3Igc2NzaS0+aG9zdC4gIFRoZSBTQ1NJIGNoYW5uZWwgaXMgY2xlYXJlZAorICogZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCitpZiAoKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgPT0gMCkgeworZG1hOgorCW1vdglERkNOVFJMLFNJTkRFWDsKK2RtYV9sb29wOgorCXRlc3QJU1NUQVQwLERNQURPTkUJam56IGRtYV9kbWFkb25lOworCXRlc3QJU1NUQVQxLFBIQVNFTUlTCWp6IGRtYV9sb29wOwkvKiBpZS4gdW5kZXJydW4gKi8KK2RtYV9waGFzZW1pczoKKwl0ZXN0CVNTVEFUMCxTRE9ORQlqbnogZG1hX2NoZWNrZmlmbzsKKwltb3YJU0lOREVYLEFMTFpFUk9TOwkJLyogTm90aWZ5IGNhbGxlciBvZiBwaGFzZW1pc3MgKi8KKworLyoKKyAqIFdlIHdpbGwgYmUgImRvbmUiIERNQWluZyB3aGVuIHRoZSB0cmFuc2ZlciBjb3VudCBnb2VzIHRvIHplcm8sIG9yCisgKiB0aGUgdGFyZ2V0IGNoYW5nZXMgdGhlIHBoYXNlIChpbiBsaWdodCBvZiB0aGlzLCBpdCBtYWtlcyBzZW5zZSB0aGF0CisgKiB0aGUgRE1BIGNpcmN1aXRyeSBkb2Vzbid0IEFDSyB3aGVuIFBIQVNFTUlTIGlzIGFjdGl2ZSkuICBJZiB3ZSBhcmUKKyAqIGRvaW5nIGEgU0NTSS0+SG9zdCB0cmFuc2ZlciwgdGhlIGRhdGEgRklGTyBzaG91bGQgYmUgZmx1c2hlZCBhdXRvLQorICogbWFnaWNhbGx5IG9uIFNUQ05UPTAgb3IgYSBwaGFzZSBjaGFuZ2UsIHNvIGp1c3Qgd2FpdCBmb3IgRklGTyBlbXB0eQorICogc3RhdHVzLgorICovCitkbWFfY2hlY2tmaWZvOgorCXRlc3QJREZDTlRSTCxESVJFQ1RJT04Jam56IGRtYV9maWZvZW1wdHk7CitkbWFfZmlmb2ZsdXNoOgorCXRlc3QJREZTVEFUVVMsRklGT0VNUAlqeiBkbWFfZmlmb2ZsdXNoOworCitkbWFfZmlmb2VtcHR5OgorCS8qIERvbid0IGNsb2JiZXIgYW4gaW5wcm9ncmVzcyBob3N0IGRhdGEgdHJhbnNmZXIgKi8KKwl0ZXN0CURGU1RBVFVTLCBNUkVRUEVORAlqbnogZG1hX2ZpZm9lbXB0eTsKKy8qCisgKiBOb3cgc2h1dCB0aGUgRE1BIGVuYWJsZXMgb2ZmIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGUgRE1BIGVuYWJsZXMgYXJlIAorICogYWN0dWFsbHkgb2ZmIGZpcnN0IGxlc3Qgd2UgZ2V0IGFuIElMTFNBRERSLgorICovCitkbWFfZG1hZG9uZToKKwljbXAJTEFTVFBIQVNFLCBQX0NPTU1BTkQJamUgZG1hX2F3YWl0X25yZXE7CisJdGVzdAlTQ1NJUkFURSwgMHgwZglqbnogZG1hX3NodXRkb3duOworZG1hX2F3YWl0X25yZXE6CisJdGVzdAlTQ1NJU0lHSSwgUkVRSQlqeiBkbWFfc2h1dGRvd247CisJdGVzdAlTU1RBVDEsIChQSEFTRU1JU3xSRVFJTklUKQlqeiBkbWFfYXdhaXRfbnJlcTsKK2RtYV9zaHV0ZG93bjoKKwlhbmQJREZDTlRSTCwgfihTQ1NJRU58U0RNQUVOfEhETUFFTik7CitkbWFfaGFsdDoKKwkvKgorCSAqIFNvbWUgcmV2aXNpb25zIG9mIHRoZSBhaWM3ODgwIGhhdmUgYSBwcm9ibGVtIHdoZXJlLCBpZiB0aGUKKwkgKiBkYXRhIGZpZm8gaXMgZnVsbCwgYnV0IHRoZSBQQ0kgaW5wdXQgbGF0Y2ggaXMgbm90IGVtcHR5LCAKKwkgKiBIRE1BRU4gY2Fubm90IGJlIGNsZWFyZWQuICBUaGUgZml4IHVzZWQgaGVyZSBpcyB0byBhdHRlbXB0CisJICogdG8gZHJhaW4gdGhlIGRhdGEgZmlmbyB1bnRpbCB0aGVyZSBpcyBzcGFjZSBmb3IgdGhlIGlucHV0CisJICogbGF0Y2ggdG8gZHJhaW4gYW5kIEhETUFFTiBkZS1hc3NlcnRzLgorCSAqLworCWlmICgocC0+YnVncyAmIEFIQ19CVUdfUENJXzJfMV9SRVRSWSkgIT0gMCkgeworCQltb3YJTk9ORSwgREZEQVQ7CisJfQorCXRlc3QJREZDTlRSTCwgKFNDU0lFTnxTRE1BRU58SERNQUVOKSBqbnogZG1hX2hhbHQ7Cit9CityZXR1cm46CisJcmV0OworCisvKgorICogQXNzZXJ0IHRoYXQgaWYgd2UndmUgYmVlbiByZXNlbGVjdGVkLCB0aGVuIHdlJ3ZlIHNlZW4gYW4gSURFTlRJRlkKKyAqIG1lc3NhZ2UuCisgKi8KK2Fzc2VydDoKKwl0ZXN0CVNFUV9GTEFHUyxJREVOVElGWV9TRUVOCWpueiByZXR1cm47CS8qIHNlZW4gSURFTlRJRlk/ICovCisKKwltdmkJSU5UU1RBVCxOT19JREVOVCAJcmV0OwkvKiBubyAtIHRlbGwgdGhlIGtlcm5lbCAqLworCisvKgorICogTG9jYXRlIGEgZGlzY29ubmVjdGVkIFNDQiBlaXRoZXIgYnkgU0FWRURfVENMIChBUkdfMSBpcyBTQ0JfTElTVF9OVUxMKQorICogb3IgYnkgdGhlIFNDQklEIEFSR18xLiAgVGhlIHNlYXJjaCBiZWdpbnMgYXQgdGhlIFNDQiBpbmRleCBwYXNzZWQgaW4KKyAqIHZpYSBTSU5ERVggd2hpY2ggaXMgYW4gU0NCIHRoYXQgbXVzdCBiZSBvbiB0aGUgZGlzY29ubmVjdGVkIGxpc3QuICBJZgorICogdGhlIFNDQiBjYW5ub3QgYmUgZm91bmQsIFNJTkRFWCB3aWxsIGJlIFNDQl9MSVNUX05VTEwsIG90aGVyd2lzZSwgU0NCUFRSCisgKiBpcyBzZXQgdG8gdGhlIHByb3BlciBTQ0IuCisgKi8KK2ZpbmRTQ0I6CisJbW92CVNDQlBUUixTSU5ERVg7CQkJLyogSW5pdGlhbGl6ZSBTQ0JQVFIgKi8KKwljbXAJQVJHXzEsIFNDQl9MSVNUX05VTEwJam5lIGZpbmRTQ0JfYnlfU0NCSUQ7CisJbW92CUEsIFNBVkVEX1RDTDsKKwltdmkJU0NCX1RDTAlqbXAgZmluZFNDQl9sb29wOwkvKiAmU0NCX1RDTCAtPiBTSU5ERVggKi8KK2ZpbmRTQ0JfYnlfU0NCSUQ6CisJbW92CUEsIEFSR18xOwkJCS8qIFRhZyBwYXNzZWQgaW4gQVJHXzEgKi8KKwltdmkJU0NCX1RBRwlqbXAgZmluZFNDQl9sb29wOwkvKiAmU0NCX1RBRyAtPiBTSU5ERVggKi8KK2ZpbmRTQ0JfbmV4dDoKKwltb3YgICAgIEFSR18yLCBTQ0JQVFI7CisJY21wCVNDQl9ORVhULCBTQ0JfTElTVF9OVUxMIGplIG5vdEZvdW5kOworCW1vdglTQ0JQVFIsU0NCX05FWFQ7CisJZGVjCVNJTkRFWDsJCS8qIExhc3QgY29tcGFyaXNvbiBtb3ZlZCB1cyB0b28gZmFyICovCitmaW5kU0NCX2xvb3A6CisJY21wCVNJTkRJUiwgQQlqbmUgZmluZFNDQl9uZXh0OworCW1vdglTSU5ERVgsIFNDQlBUUiAJcmV0Oworbm90Rm91bmQ6CisJbXZpCVNJTkRFWCwgU0NCX0xJU1RfTlVMTAlyZXQ7CisKKy8qCisgKiBSZXRyaWV2ZSBhbiBTQ0IgYnkgU0NCSUQgZmlyc3Qgc2VhcmNoaW5nIHRoZSBkaXNjb25uZWN0ZWQgbGlzdCBmYWxsaW5nCisgKiBiYWNrIHRvIERNQSdpbmcgdGhlIFNDQiBkb3duIGZyb20gdGhlIGhvc3QuICBUaGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0CisgKiBBUkdfMSBpcyB0aGUgU0NCSUQgb2YgaW50ZXJyZXN0IGFuZCB0aGF0IFNJTkRFWCBpcyB0aGUgcG9zaXRpb24gaW4gdGhlCisgKiBkaXNjb25uZWN0ZWQgbGlzdCB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20uICBJZiBTSU5ERVggaXMgU0NCX0xJU1RfTlVMTCwKKyAqIHdlIGdvIGRpcmVjdGx5IHRvIHRoZSBob3N0IGZvciB0aGUgU0NCLgorICovCityZXRyaWV2ZVNDQjoKKwl0ZXN0CVNFUV9GTEFHUywgU0NCUFRSX1ZBTElECWp6IHJldHJpZXZlX2Zyb21faG9zdDsKKwltb3YJU0NCUFRSCWNhbGwgZmluZFNDQjsJLyogQ29udGludWUgdGhlIHNlYXJjaCAqLworCWNtcAlTSU5ERVgsIFNDQl9MSVNUX05VTEwJamUgcmV0cmlldmVfZnJvbV9ob3N0OworCisvKgorICogVGhpcyByb3V0aW5lIGV4cGVjdHMgU0lOREVYIHRvIGNvbnRhaW4gdGhlIGluZGV4IG9mIHRoZSBTQ0IgdG8gYmUKKyAqIHJlbW92ZWQsIFNDQlBUUiB0byBiZSBwb2ludGluZyB0byB0aGF0IFNDQiwgYW5kIEFSR18yIHRvIGJlIHRoZQorICogU0NCSUQgb2YgdGhlIFNDQiBqdXN0IHByZXZpb3VzIHRvIHRoaXMgb25lIGluIHRoZSBsaXN0IG9yIFNDQl9MSVNUX05VTEwKKyAqIGlmIGl0IGlzIGF0IHRoZSBoZWFkLgorICovCityZW1fc2NiX2Zyb21fZGlzY19saXN0OgorLyogUmVtb3ZlIHRoaXMgU0NCIGZyb20gdGhlIGRpc2Nvbm5lY3Rpb24gbGlzdCAqLworCWNtcCAgICAgQVJHXzIsIFNDQl9MSVNUX05VTEwgICAgamUgckhlYWQ7CisJbW92CURJTkRFWCwgU0NCX05FWFQ7CisJbW92CVNDQlBUUiwgQVJHXzI7CisJbW92CVNDQl9ORVhULCBESU5ERVg7CisJbW92CVNDQlBUUiwgU0lOREVYIHJldDsKK3JIZWFkOgorCW1vdglESVNDT05ORUNURURfU0NCSCxTQ0JfTkVYVCByZXQ7CisKK3JldHJpZXZlX2Zyb21faG9zdDoKKy8qCisgKiBXZSBkaWRuJ3QgZmluZCBpdC4gIFB1bGwgYW4gU0NCIGFuZCBETUEgZG93biB0aGUgb25lIHdlIHdhbnQuCisgKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgaW4gdGhlIG5vbi1wYWdpbmcgY2FzZS4KKyAqLworCW1vdglBTExaRVJPUwljYWxsCWdldF9mcmVlX29yX2Rpc2Nfc2NiOworCW12aQlETUFQQVJBTVMsIEhETUFFTnxESVJFQ1RJT058RklGT1JFU0VUOworCS8qIEp1bXAgaW5zdGVhZCBvZiBjYWxsIGFzIHdlIHdhbnQgdG8gcmV0dXJuIGFueXdheSAqLworCW1vdglBUkdfMQlqbXAgZG1hX3NjYjsKKworLyoKKyAqIERldGVybWluZSB3aGV0aGVyIGEgdGFyZ2V0IGlzIHVzaW5nIHRhZ2dlZCBvciBub24tdGFnZ2VkIHRyYW5zYWN0aW9ucworICogYnkgZmlyc3QgbG9va2luZyBmb3IgYSBtYXRjaGluZyB0cmFuc2FjdGlvbiBiYXNlZCBvbiB0aGUgVENMIGFuZCBpZgorICogdGhhdCBmYWlscywgbG9va2luZyB1cCB0aGlzIGRldmljZSBpbiB0aGUgaG9zdCdzIHVudGFnZ2VkIFNDQiBhcnJheS4KKyAqIFRoZSBUQ0wgdG8gc2VhcmNoIGZvciBpcyBhc3N1bWVkIHRvIGJlIGluIFNBVkVEX1RDTC4gIFRoZSB2YWx1ZSBpcworICogcmV0dXJuZWQgaW4gQVJHXzEgKFNDQl9MSVNUX05VTEwgZm9yIHRhZ2dlZCwgU0NCSUQgZm9yIG5vbi10YWdnZWQpLgorICogVGhlIFNDQlBUUl9WQUxJRCBiaXQgaXMgc2V0IGluIFNFUV9GTEFHUyBpZiB3ZSBmb3VuZCB0aGUgaW5mb3JtYXRpb24KKyAqIGluIGFuIFNDQiBpbnN0ZWFkIG9mIGhhdmluZyB0byBnbyB0byB0aGUgaG9zdC4KKyAqLworZ2V0X3VudGFnZ2VkX1NDQklEOgorCWNtcAlESVNDT05ORUNURURfU0NCSCwgU0NCX0xJU1RfTlVMTCBqZSBnZXRfU0NCSURfZnJvbV9ob3N0OworCW12aQlBUkdfMSwgU0NCX0xJU1RfTlVMTDsKKwltb3YJRElTQ09OTkVDVEVEX1NDQkggY2FsbCBmaW5kU0NCOworCWNtcAlTSU5ERVgsIFNDQl9MSVNUX05VTEwJamUgZ2V0X1NDQklEX2Zyb21faG9zdDsKKwlvcglTRVFfRkxBR1MsIFNDQlBUUl9WQUxJRDsvKiBXYXMgaW4gZGlzY29ubmVjdGVkIGxpc3QgKi8KKwl0ZXN0CVNDQl9DT05UUk9MLCBUQUdfRU5CCWpueiAuICsgMjsKKwltb3YJQVJHXzEsIFNDQl9UQUcJcmV0OworCW12aQlBUkdfMSwgU0NCX0xJU1RfTlVMTCByZXQ7CisKKy8qCisgKiBGZXRjaCBhIGJ5dGUgZnJvbSBob3N0IG1lbW9yeSBnaXZlbiBhbiBpbmRleCBvZiAoQSArICgyNTYgKiBTSU5ERVgpKQorICogYW5kIGEgYmFzZSBhZGRyZXNzIG9mIFNDQklEX0FERFIuICBUaGUgYnl0ZSBpcyByZXR1cm5lZCBpbiBSRVRVUk5fMi4KKyAqLworZmV0Y2hfYnl0ZToKKwltb3YJQVJHXzIsIFNJTkRFWDsKKwlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCW12aQlESU5ERVgsIENDSEFERFI7CisJCW12aQlTQ0JJRF9BRERSIGNhbGwgc2V0XzFieXRlX2FkZHI7CisJCW12aQlDQ0hDTlQsIDE7CisJCW12aQlDQ1NHQ1RMLCBDQ1NHRU58Q0NTR1JFU0VUOworCQl0ZXN0CUNDU0dDVEwsIENDU0dET05FIGp6IC47CisJCW12aQlDQ1NHQ1RMLCBDQ1NHUkVTRVQ7CisJCWJtb3YJUkVUVVJOXzIsIENDU0dSQU0sIDEgcmV0OworCX0gZWxzZSB7CisJCW12aQlESU5ERVgsIEhBRERSOworCQltdmkJU0NCSURfQUREUiBjYWxsIHNldF8xYnl0ZV9hZGRyOworCQltdmkJSENOVFswXSwgMTsKKwkJY2xyCUhDTlRbMV07CisJCWNscglIQ05UWzJdOworCQltdmkJREZDTlRSTCwgSERNQUVOfERJUkVDVElPTnxGSUZPUkVTRVQ7CisJCWNhbGwJZG1hX2ZpbmlzaDsKKwkJbW92CVJFVFVSTl8yLCBERkRBVCByZXQ7CisJfQorCisvKgorICogUHJlcGFyZSB0aGUgaGFyZHdhcmUgdG8gcG9zdCBhIGJ5dGUgdG8gaG9zdCBtZW1vcnkgZ2l2ZW4gYW4KKyAqIGluZGV4IG9mIChBICsgKDI1NiAqIFNJTkRFWCkpIGFuZCBhIGJhc2UgYWRkcmVzcyBvZiBTQ0JJRF9BRERSLgorICovCitwb3N0X2J5dGVfc2V0dXA6CisJbW92CUFSR18yLCBTSU5ERVg7CisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQltdmkJRElOREVYLCBDQ0hBRERSOworCQltdmkJU0NCSURfQUREUiBjYWxsCXNldF8xYnl0ZV9hZGRyOworCQltdmkJQ0NIQ05ULCAxOworCQltdmkJQ0NTQ0JDVEwsIENDU0NCUkVTRVQgcmV0OworCX0gZWxzZSB7CisJCW12aQlESU5ERVgsIEhBRERSOworCQltdmkJU0NCSURfQUREUiBjYWxsCXNldF8xYnl0ZV9hZGRyOworCQltdmkJSENOVFswXSwgMTsKKwkJY2xyCUhDTlRbMV07CisJCWNscglIQ05UWzJdOworCQltdmkJREZDTlRSTCwgRklGT1JFU0VUIHJldDsKKwl9CisKK3Bvc3RfYnl0ZToKKwlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCWJtb3YJQ0NTQ0JSQU0sIFNJTkRFWCwgMTsKKwkJb3IJQ0NTQ0JDVEwsIENDU0NCRU58Q0NTQ0JSRVNFVDsKKwkJdGVzdAlDQ1NDQkNUTCwgQ0NTQ0JET05FIGp6IC47CisJCWNscglDQ1NDQkNUTCByZXQ7CisJfSBlbHNlIHsKKwkJbW92CURGREFULCBTSU5ERVg7CisJCW9yCURGQ05UUkwsIEhETUFFTnxGSUZPRkxVU0g7CisJCWptcAlkbWFfZmluaXNoOworCX0KKworZ2V0X1NDQklEX2Zyb21faG9zdDoKKwltb3YJQSwgU0FWRURfVENMOworCW12aQlVTlRBR0dFRFNDQl9PRkZTRVQgY2FsbCBmZXRjaF9ieXRlOworCW1vdglSRVRVUk5fMSwgIFJFVFVSTl8yIHJldDsKKworcGhhc2VfbG9jazogICAgIAorCXRlc3QJU1NUQVQxLCBSRVFJTklUIGp6IHBoYXNlX2xvY2s7CisJdGVzdAlTU1RBVDEsIFNDU0lQRVJSIGpueiBwaGFzZV9sb2NrOworCWFuZAlTQ1NJU0lHTywgUEhBU0VfTUFTSywgU0NTSVNJR0k7CisJYW5kCUxBU1RQSEFTRSwgUEhBU0VfTUFTSywgU0NTSVNJR0kgcmV0OworCitpZiAoKHAtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSA9PSAwKSB7CitzZXRfc3RjbnRfZnJvbV9oY250OgorCW1vdglTVENOVFswXSwgSENOVFswXTsKKwltb3YJU1RDTlRbMV0sIEhDTlRbMV07CisJbW92CVNUQ05UWzJdLCBIQ05UWzJdIHJldDsKKworYmNvcHlfNzoKKwltb3YJRElORElSLCBTSU5ESVI7CisJbW92CURJTkRJUiwgU0lORElSOworYmNvcHlfNToKKwltb3YJRElORElSLCBTSU5ESVI7CitiY29weV80OgorCW1vdglESU5ESVIsIFNJTkRJUjsKK2Jjb3B5XzM6CisJbW92CURJTkRJUiwgU0lORElSOworCW1vdglESU5ESVIsIFNJTkRJUjsKKwltb3YJRElORElSLCBTSU5ESVIgcmV0OworfQorCisvKgorICogU2V0dXAgYWRkciBhc3N1bWluZyB0aGF0IEEgaXMgYW4gaW5kZXggaW50bworICogYW4gYXJyYXkgb2YgMzJieXRlIG9iamVjdHMsIFNJTkRFWCBjb250YWlucworICogdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGF0IGFycmF5LCBhbmQgRElOREVYCisgKiBjb250YWlucyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBsb2NhdGlvbgorICogdG8gc3RvcmUgdGhlIGluZGV4ZWQgYWRkcmVzcy4KKyAqLworc2V0XzMyYnl0ZV9hZGRyOgorCXNocglBUkdfMiwgMywgQTsKKwlzaGwJQSwgNTsKKy8qCisgKiBTZXR1cCBhZGRyIGFzc3VtaW5nIHRoYXQgQSArIChBUkdfMSAqIDI1NikgaXMgYW4KKyAqIGluZGV4IGludG8gYW4gYXJyYXkgb2YgMWJ5dGUgb2JqZWN0cywgU0lOREVYIGNvbnRhaW5zCisgKiB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoYXQgYXJyYXksIGFuZCBESU5ERVggY29udGFpbnMKKyAqIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBjb21wdXRlZAorICogYWRkcmVzcy4KKyAqLworc2V0XzFieXRlX2FkZHI6CisJYWRkCURJTkRJUiwgQSwgU0lORElSOworCW1vdglBLCBBUkdfMjsKKwlhZGMJRElORElSLCBBLCBTSU5ESVI7CisJY2xyCUE7CisJYWRjCURJTkRJUiwgQSwgU0lORElSOworCWFkYwlESU5ESVIsIEEsIFNJTkRJUiByZXQ7CisKKy8qCisgKiBFaXRoZXIgcG9zdCBvciBmZXRjaCBhbmQgU0NCIGZyb20gaG9zdCBtZW1vcnkgYmFzZWQgb24gdGhlCisgKiBESVJFQ1RJT04gYml0IGluIERNQVBBUkFNUy4gVGhlIGhvc3QgU0NCIGluZGV4IGlzIGluIFNJTkRFWC4KKyAqLworZG1hX3NjYjoKKwltb3YJQSwgU0lOREVYOworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJbXZpCURJTkRFWCwgQ0NIQUREUjsKKwkJbXZpCUhTQ0JfQUREUiBjYWxsIHNldF8zMmJ5dGVfYWRkcjsKKwkJbW92CUNDU0NCUFRSLCBTQ0JQVFI7CisJCW12aQlDQ0hDTlQsIDMyOworCQl0ZXN0CURNQVBBUkFNUywgRElSRUNUSU9OIGp6IGRtYV9zY2JfdG9ob3N0OworCQltdmkJQ0NTQ0JDVEwsIENDQVJSRU58Q0NTQ0JFTnxDQ1NDQkRJUnxDQ1NDQlJFU0VUOworCQljbXAJQ0NTQ0JDVEwsIENDU0NCRE9ORXxBUlJET05FfENDQVJSRU58Q0NTQ0JFTnxDQ1NDQkRJUiBqbmUgLjsKKwkJam1wCWRtYV9zY2JfZmluaXNoOworZG1hX3NjYl90b2hvc3Q6CisJCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSA9PSAwKSB7CisJCQltdmkJQ0NTQ0JDVEwsIENDU0NCUkVTRVQ7CisJCQlibW92CUNDU0NCUkFNLCBTQ0JfQ09OVFJPTCwgMzI7CisJCQlvcglDQ1NDQkNUTCwgQ0NTQ0JFTnxDQ1NDQlJFU0VUOworCQkJdGVzdAlDQ1NDQkNUTCwgQ0NTQ0JET05FIGp6IC47CisJCX0KKwkJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJCWlmICgocC0+YnVncyAmIEFIQ19CVUdfU0NCQ0hBTl9VUExPQUQpICE9IDApIHsKKwkJCQltdmkgICAgIENDU0NCQ1RMLCBDQ0FSUkVOfENDU0NCUkVTRVQ7CisJCQkJY21wICAgICBDQ1NDQkNUTCwgQVJSRE9ORXxDQ0FSUkVOIGpuZSAuOworICAgICAgICAgICAgICAgICAgICAgICAgCW12aSAgICAgQ0NIQ05ULCAzMjsKKwkJCQltdmkgICAgIENDU0NCQ1RMLCBDQ1NDQkVOfENDU0NCUkVTRVQ7CisJCQkJY21wICAgICBDQ1NDQkNUTCwgQ0NTQ0JET05FfENDU0NCRU4gam5lIC47CisJCQl9IGVsc2UgeworCQkJCW12aQlDQ1NDQkNUTCwgQ0NBUlJFTnxDQ1NDQkVOfENDU0NCUkVTRVQ7CisJCQkJY21wCUNDU0NCQ1RMLCBDQ1NDQkRPTkV8QVJSRE9ORXxDQ0FSUkVOfENDU0NCRU4gam5lIC47CisJCQl9CisJCX0KK2RtYV9zY2JfZmluaXNoOgorCQljbHIJQ0NTQ0JDVEw7CisJCXRlc3QJQ0NTQ0JDVEwsIENDQVJSRU58Q0NTQ0JFTiBqbnogLjsKKwkJcmV0OworCX0KKwlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSA9PSAwKSB7CisJCW12aQlESU5ERVgsIEhBRERSOworCQltdmkJSFNDQl9BRERSIGNhbGwgc2V0XzMyYnl0ZV9hZGRyOworCQltdmkJSENOVFswXSwgMzI7CisJCWNscglIQ05UWzFdOworCQljbHIJSENOVFsyXTsKKwkJbW92CURGQ05UUkwsIERNQVBBUkFNUzsKKwkJdGVzdAlETUFQQVJBTVMsIERJUkVDVElPTglqbnogZG1hX3NjYl9mcm9taG9zdDsKKwkJLyogRmlsbCBpdCB3aXRoIHRoZSBTQ0IgZGF0YSAqLworY29weV9zY2JfdG9maWZvOgorCQltdmkJU0lOREVYLCBTQ0JfQ09OVFJPTDsKKwkJYWRkCUEsIDMyLCBTSU5ERVg7Citjb3B5X3NjYl90b2ZpZm9fbG9vcDoKKwkJbW92CURGREFULFNJTkRJUjsKKwkJbW92CURGREFULFNJTkRJUjsKKwkJbW92CURGREFULFNJTkRJUjsKKwkJbW92CURGREFULFNJTkRJUjsKKwkJbW92CURGREFULFNJTkRJUjsKKwkJbW92CURGREFULFNJTkRJUjsKKwkJbW92CURGREFULFNJTkRJUjsKKwkJbW92CURGREFULFNJTkRJUjsKKwkJY21wCVNJTkRFWCwgQSBqbmUgY29weV9zY2JfdG9maWZvX2xvb3A7CisJCW9yCURGQ05UUkwsIEhETUFFTnxGSUZPRkxVU0g7CisJCWptcAlkbWFfZmluaXNoOworZG1hX3NjYl9mcm9taG9zdDoKKwkJbXZpCURJTkRFWCwgU0NCX0NPTlRST0w7CisJCWlmICgocC0+YnVncyAmIEFIQ19CVUdfUENJXzJfMV9SRVRSWSkgIT0gMCkgeworCQkJLyoKKwkJCSAqIFNldCB0aGUgQSB0byAtMjQuICBJdCBpdCBoaXRzIDAsIHRoZW4gd2UgbGV0CisJCQkgKiBvdXIgY29kZSBmYWxsIHRocm91Z2ggdG8gZGZkYXRfaW5fOCB0byBjb21wbGV0ZQorCQkJICogdGhlIGxhc3Qgb2YgdGhlIGNvcHkuCisJCQkgKgorCQkJICogQWxzbywgdGhpbmdzIGhhcHBlbiA4IGJ5dGVzIGF0IGEgdGltZSBpbiB0aGlzCisJCQkgKiBjYXNlLCBzbyB3ZSBtYXkgbmVlZCB0byBkcmFpbiB0aGUgZmlmbyBhdCBtb3N0CisJCQkgKiAzIHRpbWVzIHRvIGtlZXAgdGhpbmdzIGZsb3dpbmcKKwkJCSAqLworCQkJbXZpCUEsIC0yNDsKK2RtYV9zY2JfaGFuZ19maWZvOgorCQkJLyogV2FpdCBmb3IgdGhlIGZpcnN0IGJpdCBvZiBkYXRhIHRvIGhpdCB0aGUgZmlmbyAqLworCQkJdGVzdAlERlNUQVRVUywgRklGT0VNUCBqbnogLjsKK2RtYV9zY2JfaGFuZ193YWl0OgorCQkJLyogT0ssIG5vdyB0aGV5J3ZlIHN0YXJ0ZWQgdG8gdHJhbnNmZXIgaW50byB0aGUgZmlmbywKKwkJCSAqIHNvIHdhaXQgZm9yIHRoZW0gdG8gc3RvcCB0cnlpbmcgdG8gdHJhbnNmZXIgYW55CisJCQkgKiBtb3JlIGRhdGEuCisJCQkgKi8KKwkJCXRlc3QJREZTVEFUVVMsIE1SRVFQRU5EIGpueiAuOworCQkJLyoKKwkJCSAqIE9LLCB0aGV5IHN0YXJ0ZWQsIHRoZW4gdGhleSBzdG9wcGVkLCBub3cgc2VlIGlmIHRoZXkKKwkJCSAqIG1hbmFnZWQgdG8gY29tcGxldGUgdGhlIGpvYiBiZWZvcmUgc3RvcHBpbmcuICBUcnkKKwkJCSAqIGl0IG11bHRpcGxlIHRpbWVzIHRvIGdpdmUgdGhlIGNoaXAgYSBmZXcgY3ljbGVzIHRvCisJCQkgKiBzZXQgdGhlIGZsYWcgaWYgaXQgZGlkIGNvbXBsZXRlLgorCQkJICovCisJCQl0ZXN0CURGU1RBVFVTLCBIRE9ORSBqbnogZG1hX3NjYl9oYW5nX2RtYV9kb25lOworCQkJdGVzdAlERlNUQVRVUywgSERPTkUgam56IGRtYV9zY2JfaGFuZ19kbWFfZG9uZTsKKwkJCXRlc3QJREZTVEFUVVMsIEhET05FIGpueiBkbWFfc2NiX2hhbmdfZG1hX2RvbmU7CisJCQkvKgorCQkJICogVG9vIGJhZCwgdGhlIGNoaXAgZGlkbid0IGNvbXBsZXRlIHRoZSBETUEsIGJ1dCB0aGVyZQorCQkJICogYXJlbid0IGFueSBtb3JlIG1lbW9yeSByZXF1ZXN0cyBwZW5kaW5nLCBzbyB0aGF0CisJCQkgKiBtZWFucyBpdCBzdG9wcGVkIHBhcnQgd2F5IHRocm91Z2ggYW5kIGh1bmcuICBUaGF0J3MKKwkJCSAqIG91ciBidWcsIHNvIG5vdyB3ZSBkcmFpbiB3aGF0IGRhdGEgdGhlcmUgaXMgaW4gdGhlCisJCQkgKiBmaWZvIGluIG9yZGVyIHRvIGdldCB0aGluZ3MgZ29pbmcgYWdhaW4uCisJCQkgKi8KK2RtYV9zY2JfaGFuZ19lbXB0eV9maWZvOgorCQkJY2FsbAlkZmRhdF9pbl84OworCQkJYWRkCUEsIDg7CisJCQlhZGQJU0lOREVYLCBBLCBIQ05UOworCQkJLyoKKwkJCSAqIElmIHRoZXJlIGFyZSBhbm90aGVyIDggYnl0ZXMgb2YgZGF0YSB3YWl0aW5nIGluIHRoZQorCQkJICogZmlmbywgdGhlbiB0aGUgY2FycnkgYml0IHdpbGwgYmUgc2V0IGFzIGEgcmVzdWx0CisJCQkgKiBvZiB0aGUgYWJvdmUgYWRkIGNvbW1hbmQgKHVubGVzcyBBIGlzIG5vbi1uZWdhdGl2ZSwKKwkJCSAqIGluIHdoaWNoIGNhc2UgdGhlIGNhcnJ5IGJpdCB3b24ndCBiZSBzZXQpLgorCQkJICovCisJCQlqYwlkbWFfc2NiX2hhbmdfZW1wdHlfZmlmbzsKKwkJCS8qCisJCQkgKiBXZSd2ZSBlbXB0aWVkIHRoZSBmaWZvIG5vdywgYnV0IHdlIHdvdWxkbid0IGhhdmUgZ290CisJCQkgKiBoZXJlIGlmIHRoZSBtZW1vcnkgdHJhbnNmZXIgaGFkbid0IHN0b3BwZWQgcGFydCB3YXkKKwkJCSAqIHRocm91Z2gsIHNvIGdvIGJhY2sgdXAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKKwkJCSAqIGxvb3AgYW5kIHN0YXJ0IG92ZXIuICBXaGVuIGl0IHN1Y2NlZWRzIGluIGdldHRpbmcKKwkJCSAqIGFsbCB0aGUgZGF0YSBkb3duLCBIRE9ORSB3aWxsIGJlIHNldCBhbmQgd2UnbGwKKwkJCSAqIGp1bXAgdG8gdGhlIGNvZGUganVzdCBiZWxvdyBoZXJlLgorCQkJICovCisJCQlqbXAJZG1hX3NjYl9oYW5nX2ZpZm87CitkbWFfc2NiX2hhbmdfZG1hX2RvbmU6CisJCQlhbmQJREZDTlRSTCwgfkhETUFFTjsKKwkJCXRlc3QJREZDTlRSTCwgSERNQUVOIGpueiAuOworCQkJY2FsbAlkZmRhdF9pbl84OworCQkJYWRkCUEsIDg7CisJCQljbXAJQSwgOCBqbmUgLiAtIDI7CisJCQlyZXQ7CisJCX0gZWxzZSB7CisJCQljYWxsCWRtYV9maW5pc2g7CisJCQljYWxsCWRmZGF0X2luXzg7CisJCQljYWxsCWRmZGF0X2luXzg7CisJCQljYWxsCWRmZGF0X2luXzg7CisJCX0KK2RmZGF0X2luXzg6CisJCW1vdglESU5ESVIsREZEQVQ7CitkZmRhdF9pbl83OgorCQltb3YJRElORElSLERGREFUOworCQltb3YJRElORElSLERGREFUOworCQltb3YJRElORElSLERGREFUOworCQltb3YJRElORElSLERGREFUOworCQltb3YJRElORElSLERGREFUOworCQltb3YJRElORElSLERGREFUOworCQltb3YJRElORElSLERGREFUIHJldDsKKwl9CisKKworLyoKKyAqIFdhaXQgZm9yIERNQSBmcm9tIGhvc3QgbWVtb3J5IHRvIGRhdGEgRklGTyB0byBjb21wbGV0ZSwgdGhlbiBkaXNhYmxlCisgKiBETUEgYW5kIHdhaXQgZm9yIGl0IHRvIGFja25vd2xlZGdlIHRoYXQgaXQncyBvZmYuCisgKi8KK2lmICgocC0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pID09IDApIHsKK2RtYV9maW5pc2g6CisJdGVzdAlERlNUQVRVUyxIRE9ORQlqeiBkbWFfZmluaXNoOworCS8qIFR1cm4gb2ZmIERNQSAqLworCWFuZAlERkNOVFJMLCB+SERNQUVOOworCXRlc3QJREZDTlRSTCwgSERNQUVOIGpueiAuOworCXJldDsKK30KKworYWRkX3NjYl90b19mcmVlX2xpc3Q6CisJaWYgKChwLT5mbGFncyAmIEFIQ19QQUdFU0NCUykgIT0gMCkgeworCQltb3YJU0NCX05FWFQsIEZSRUVfU0NCSDsKKwkJbW92CUZSRUVfU0NCSCwgU0NCUFRSOworCX0KKwltdmkJU0NCX1RBRywgU0NCX0xJU1RfTlVMTCByZXQ7CisKK2lmICgocC0+ZmxhZ3MgJiBBSENfUEFHRVNDQlMpICE9IDApIHsKK2dldF9mcmVlX29yX2Rpc2Nfc2NiOgorCWNtcAlGUkVFX1NDQkgsIFNDQl9MSVNUX05VTEwgam5lIGRlcXVldWVfZnJlZV9zY2I7CisJY21wCURJU0NPTk5FQ1RFRF9TQ0JILCBTQ0JfTElTVF9OVUxMIGpuZSBkZXF1ZXVlX2Rpc2Nfc2NiOworcmV0dXJuX2Vycm9yOgorCW12aQlTSU5ERVgsIFNDQl9MSVNUX05VTEwJcmV0OworZGVxdWV1ZV9kaXNjX3NjYjoKKwltb3YJU0NCUFRSLCBESVNDT05ORUNURURfU0NCSDsKK2RtYV91cF9zY2I6CisJbXZpCURNQVBBUkFNUywgRklGT1JFU0VUOworCW1vdglTQ0JfVEFHCQljYWxsIGRtYV9zY2I7Cit1bmxpbmtfZGlzY19zY2I6CisJbW92CURJU0NPTk5FQ1RFRF9TQ0JILCBTQ0JfTkVYVCByZXQ7CitkZXF1ZXVlX2ZyZWVfc2NiOgorCW1vdglTQ0JQVFIsIEZSRUVfU0NCSDsKKwltb3YJRlJFRV9TQ0JILCBTQ0JfTkVYVCByZXQ7Cit9CisKK2FkZF9zY2JfdG9fZGlzY19saXN0OgorLyoKKyAqIExpbmsgdGhpcyBTQ0IgaW50byB0aGUgRElTQ09OTkVDVEVEIGxpc3QuICBUaGlzIGxpc3QgaG9sZHMgdGhlCisgKiBjYW5kaWRhdGVzIGZvciBwYWdpbmcgb3V0IGFuIFNDQiBpZiBvbmUgaXMgbmVlZGVkIGZvciBhIG5ldyBjb21tYW5kLgorICogTW9kaWZ5aW5nIHRoZSBkaXNjb25uZWN0ZWQgbGlzdCBpcyBhIGNyaXRpY2FsKHBhdXNlIGRpc3NhYmxlZCkgc2VjdGlvbi4KKyAqLworCW1vdglTQ0JfTkVYVCwgRElTQ09OTkVDVEVEX1NDQkg7CisJbW92CURJU0NPTk5FQ1RFRF9TQ0JILCBTQ0JQVFIgcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHhfcHJvYy5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHhfcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjMzNDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQvYWljN3h4eF9wcm9jLmMKQEAgLTAsMCArMSwzNzQgQEAKKy8qK00qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZGFwdGVjIEFJQzd4eHggZGV2aWNlIGRyaXZlciBwcm9jIHN1cHBvcnQgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBEZWFuIFcuIEdlaG5lcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBvIE1vZGlmaWVkIGZyb20gdGhlIEVBVEEtRE1BIC9wcm9jIHN1cHBvcnQuCisgKiAgbyBBZGRpdGlvbmFsIHN1cHBvcnQgZm9yIGRldmljZSBibG9jayBzdGF0aXN0aWNzIHByb3ZpZGVkIGJ5CisgKiAgICBNYXR0aGV3IEphY29iLgorICogIG8gQ29ycmVjdGlvbiBvZiBvdmVyZmxvdyBieSBIZWlueiBNYXVlbHNoYWdlbgorICogIG8gQWRpdHRpb25hbCBjb3JyZWN0aW9ucyBieSBEb3VnIExlZGZvcmQKKyAqCisgKiAgRGVhbiBXLiBHZWhuZXJ0LCBkZWFuZ0B0ZWxlcG9ydC5jb20sIDA1LzAxLzk2CisgKgorICogICRJZDogYWljN3h4eF9wcm9jLmMsdiA0LjEgMTk5Ny8wNi85NyAwODoyMzo0MiBkZWFuZyBFeHAgJAorICotTSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2RlZmluZQlCTFMJKCZhaWM3eHh4X2J1ZmZlcltzaXplXSkKKyNkZWZpbmUgSERSQiBcCisiICAgICAgICAgICAgICAgMCAtIDRLICAgNCAtIDE2SyAgIDE2IC0gNjRLICA2NCAtIDI1NksgIDI1NksgLSAxTSAgICAgICAgMU0rIgorCisjaWZkZWYgUFJPQ19ERUJVRworZXh0ZXJuIGludCB2c3ByaW50ZihjaGFyICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisKK3N0YXRpYyB2b2lkCitwcm9jX2RlYnVnKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICB2YV9saXN0IGFwOworICBjaGFyIGJ1ZlsyNTZdOworCisgIHZhX3N0YXJ0KGFwLCBmbXQpOworICB2c3ByaW50ZihidWYsIGZtdCwgYXApOworICBwcmludGsoYnVmKTsKKyAgdmFfZW5kKGFwKTsKK30KKyNlbHNlIC8qIFBST0NfREVCVUcgKi8KKyMgIGRlZmluZSBwcm9jX2RlYnVnKGZtdCwgYXJncy4uLikKKyNlbmRpZiAvKiBQUk9DX0RFQlVHICovCisKK3N0YXRpYyBpbnQgYWljN3h4eF9idWZmZXJfc2l6ZSA9IDA7CitzdGF0aWMgY2hhciAqYWljN3h4eF9idWZmZXIgPSBOVUxMOworCisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9zZXRfaW5mbworICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTZXQgcGFyYW1ldGVycyBmb3IgdGhlIGRyaXZlciBmcm9tIHRoZSAvcHJvYyBmaWxlc3lzdGVtLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X3NldF9pbmZvKGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCwgc3RydWN0IFNjc2lfSG9zdCAqSEJBcHRyKQoreworICBwcm9jX2RlYnVnKCJhaWM3eHh4X3NldF9pbmZvKCk6ICVzXG4iLCBidWZmZXIpOworICByZXR1cm4gKC1FTk9TWVMpOyAgLyogQ3VycmVudGx5IHRoaXMgaXMgYSBuby1vcCAqLworfQorCisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9wcm9jX2luZm8KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUmV0dXJuIGluZm9ybWF0aW9uIHRvIGhhbmRsZSAvcHJvYyBzdXBwb3J0IGZvciB0aGUgZHJpdmVyLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK2FpYzd4eHhfcHJvY19pbmZvICggc3RydWN0IFNjc2lfSG9zdCAqSEJBcHRyLCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCAKKyAgICAgICAgICAgICAgICAgICAgaW50IGlub3V0KQoreworICBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwOworICBzdHJ1Y3QgYWljX2Rldl9kYXRhICphaWNfZGV2OworICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcHRyOworICBpbnQgICAgc2l6ZSA9IDA7CisgIHVuc2lnbmVkIGNoYXIgaTsKKyAgdW5zaWduZWQgY2hhciB0aW5kZXg7CisKKyAgZm9yKHA9Zmlyc3RfYWljN3h4eDsgcCAmJiBwLT5ob3N0ICE9IEhCQXB0cjsgcD1wLT5uZXh0KQorICAgIDsKKworICBpZiAoIXApCisgIHsKKyAgICBzaXplICs9IHNwcmludGYoYnVmZmVyLCAiQ2FuJ3QgZmluZCBhZGFwdGVyIGZvciBob3N0IG51bWJlciAlZFxuIiwgSEJBcHRyLT5ob3N0X25vKTsKKyAgICBpZiAoc2l6ZSA+IGxlbmd0aCkKKyAgICB7CisgICAgICByZXR1cm4gKHNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcmV0dXJuIChsZW5ndGgpOworICAgIH0KKyAgfQorCisgIGlmIChpbm91dCA9PSBUUlVFKSAvKiBIYXMgZGF0YSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGZpbGU/ICovIAorICB7CisgICAgcmV0dXJuIChhaWM3eHh4X3NldF9pbmZvKGJ1ZmZlciwgbGVuZ3RoLCBIQkFwdHIpKTsKKyAgfQorCisgIHAgPSAoc3RydWN0IGFpYzd4eHhfaG9zdCAqKSBIQkFwdHItPmhvc3RkYXRhOworCisgIC8qCisgICAqIEl0IHRha2VzIHJvdWdobHkgMUsgb2Ygc3BhY2UgdG8gaG9sZCBhbGwgcmVsZXZhbnQgY2FyZCBpbmZvLCBub3QKKyAgICogY291bnRpbmcgYW55IHByb2Mgc3RhdHMsIHNvIHdlIHN0YXJ0IG91dCB3aXRoIGEgMS41ayBidWZmZXIgc2l6ZSBhbmQKKyAgICogaWYgcHJvY19zdGF0cyBpcyBkZWZpbmVkLCB0aGVuIHdlIHN3ZWVwIHRoZSBzdGF0cyBzdHJ1Y3R1cmUgdG8gc2VlCisgICAqIGhvdyBtYW55IGRyaXZlcyB3ZSB3aWxsIGJlIHByaW50aW5nIG91dCBmb3IgYW5kIGFkZCAzODQgYnl0ZXMgcGVyCisgICAqIGRldmljZSB3aXRoIGFjdGl2ZSBzdGF0cy4KKyAgICoKKyAgICogSG1tbW0uLi50aGF0IDEuNWsgc2VlbXMgdG8ga2VlcCBncm93aW5nIGFzIGl0ZW1zIGdldCBhZGRlZCBzbyB0aGV5CisgICAqIGNhbiBiZSBlYXNpbHkgdmlld2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuICBTbywgd2UgYnVtcGVkIHRoYXQKKyAgICogMS41ayB0byA0ayBzbyB3ZSBjYW4gcXVpdCBoYXZpbmcgdG8gYnVtcCBpdCBhbGwgdGhlIHRpbWUuCisgICAqLworCisgIHNpemUgPSA0MDk2OworICBsaXN0X2Zvcl9lYWNoX2VudHJ5KGFpY19kZXYsICZwLT5haWNfZGV2cywgbGlzdCkKKyAgICBzaXplICs9IDUxMjsKKyAgaWYgKGFpYzd4eHhfYnVmZmVyX3NpemUgIT0gc2l6ZSkKKyAgeworICAgIGlmIChhaWM3eHh4X2J1ZmZlciAhPSBOVUxMKSAKKyAgICB7CisgICAgICBrZnJlZShhaWM3eHh4X2J1ZmZlcik7CisgICAgICBhaWM3eHh4X2J1ZmZlcl9zaXplID0gMDsKKyAgICB9CisgICAgYWljN3h4eF9idWZmZXIgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworICB9CisgIGlmIChhaWM3eHh4X2J1ZmZlciA9PSBOVUxMKQorICB7CisgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyLCAiQUlDN3h4eCAtIGttYWxsb2MgZXJyb3IgYXQgbGluZSAlZFxuIiwKKyAgICAgICAgX19MSU5FX18pOworICAgIHJldHVybiBzaXplOworICB9CisgIGFpYzd4eHhfYnVmZmVyX3NpemUgPSBzaXplOworCisgIHNpemUgPSAwOworICBzaXplICs9IHNwcmludGYoQkxTLCAiQWRhcHRlYyBBSUM3eHh4IGRyaXZlciB2ZXJzaW9uOiAiKTsKKyAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiVzLyIsIEFJQzdYWFhfQ19WRVJTSU9OKTsKKyAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiVzIiwgQUlDN1hYWF9IX1ZFUlNJT04pOworICBzaXplICs9IHNwcmludGYoQkxTLCAiXG4iKTsKKyAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIkFkYXB0ZXIgQ29uZmlndXJhdGlvbjpcbiIpOworICBzaXplICs9IHNwcmludGYoQkxTLCAiICAgICAgICAgICBTQ1NJIEFkYXB0ZXI6ICVzXG4iLAorICAgICAgYm9hcmRfbmFtZXNbcC0+Ym9hcmRfbmFtZV9pbmRleF0pOworICBpZiAocC0+ZmxhZ3MgJiBBSENfVFdJTikKKyAgICBzaXplICs9IHNwcmludGYoQkxTLCAiICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW4gQ2hhbm5lbCBDb250cm9sbGVyICIpOworICBlbHNlCisgIHsKKyAgICBjaGFyICpjaGFubmVsID0gIiI7CisgICAgY2hhciAqdWx0cmEgPSAiIjsKKyAgICBjaGFyICp3aWRlID0gIk5hcnJvdyAiOworICAgIGlmIChwLT5mbGFncyAmIEFIQ19NVUxUSV9DSEFOTkVMKQorICAgIHsKKyAgICAgIGNoYW5uZWwgPSAiIENoYW5uZWwgQSI7CisgICAgICBpZiAocC0+ZmxhZ3MgJiAoQUhDX0NITkxCfEFIQ19DSE5MQykpCisgICAgICAgIGNoYW5uZWwgPSAocC0+ZmxhZ3MgJiBBSENfQ0hOTEIpID8gIiBDaGFubmVsIEIiIDogIiBDaGFubmVsIEMiOworICAgIH0KKyAgICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfV0lERSkKKyAgICAgIHdpZGUgPSAiV2lkZSAiOworICAgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTMpCisgICAgeworICAgICAgc3dpdGNoKHAtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spCisgICAgICB7CisgICAgICAgIGNhc2UgQUhDX0FJQzc4OTI6CisgICAgICAgIGNhc2UgQUhDX0FJQzc4OTk6CisgICAgICAgICAgdWx0cmEgPSAiVWx0cmEtMTYwL20gTFZEL1NFICI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdWx0cmEgPSAiVWx0cmEtMyBMVkQvU0UgIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgICAgdWx0cmEgPSAiVWx0cmEtMiBMVkQvU0UgIjsKKyAgICBlbHNlIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQSkKKyAgICAgIHVsdHJhID0gIlVsdHJhICI7CisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICVzJXNDb250cm9sbGVyJXMgIiwKKyAgICAgIHVsdHJhLCB3aWRlLCBjaGFubmVsKTsKKyAgfQorICBzd2l0Y2gocC0+Y2hpcCAmIH5BSENfQ0hJUElEX01BU0spCisgIHsKKyAgICBjYXNlIEFIQ19WTDoKKyAgICAgIHNpemUgKz0gc3ByaW50ZihCTFMsICJhdCBWTEIgc2xvdCAlZFxuIiwgcC0+cGNpX2RldmljZV9mbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFIQ19FSVNBOgorICAgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgImF0IEVJU0Egc2xvdCAlZFxuIiwgcC0+cGNpX2RldmljZV9mbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgImF0IFBDSSAlZC8lZC8lZFxuIiwgcC0+cGNpX2J1cywKKyAgICAgICAgUENJX1NMT1QocC0+cGNpX2RldmljZV9mbiksIFBDSV9GVU5DKHAtPnBjaV9kZXZpY2VfZm4pKTsKKyAgICAgIGJyZWFrOworICB9CisgIGlmKCAhKHAtPm1hZGRyKSApCisgIHsKKyAgICBzaXplICs9IHNwcmludGYoQkxTLCAiICAgIFByb2dyYW1tZWQgSS9PIEJhc2U6ICVseFxuIiwgcC0+YmFzZSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgICBQQ0kgTU1BUGVkIEkvTyBCYXNlOiAweCVseFxuIiwgcC0+bWJhc2UpOworICB9CisgIGlmKCAocC0+Y2hpcCAmIChBSENfVkwgfCBBSENfRUlTQSkpICkKKyAgeworICAgIHNpemUgKz0gc3ByaW50ZihCTFMsICIgICAgQklPUyBNZW1vcnkgQWRkcmVzczogMHglMDh4XG4iLCBwLT5iaW9zX2FkZHJlc3MpOworICB9CisgIHNpemUgKz0gc3ByaW50ZihCTFMsICIgQWRhcHRlciBTRUVQUk9NIENvbmZpZzogJXNcbiIsCisgICAgICAgICAgKHAtPmZsYWdzICYgQUhDX1NFRVBST01fRk9VTkQpID8gIlNFRVBST00gZm91bmQgYW5kIHVzZWQuIiA6CisgICAgICAgICAoKHAtPmZsYWdzICYgQUhDX1VTRURFRkFVTFRTKSA/ICJTRUVQUk9NIG5vdCBmb3VuZCwgdXNpbmcgZGVmYXVsdHMuIiA6CisgICAgICAgICAgICJTRUVQUk9NIG5vdCBmb3VuZCwgdXNpbmcgbGVmdG92ZXIgQklPUyB2YWx1ZXMuIikgKTsKKyAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgICAgIEFkYXB0ZWMgU0NTSSBCSU9TOiAlc1xuIiwKKyAgICAgICAgICAocC0+ZmxhZ3MgJiBBSENfQklPU19FTkFCTEVEKSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOworICBzaXplICs9IHNwcmludGYoQkxTLCAiICAgICAgICAgICAgICAgICAgICBJUlE6ICVkXG4iLCBIQkFwdHItPmlycSk7CisgIHNpemUgKz0gc3ByaW50ZihCTFMsICIgICAgICAgICAgICAgICAgICAgU0NCczogQWN0aXZlICVkLCBNYXggQWN0aXZlICVkLFxuIiwKKyAgICAgICAgICAgIHAtPmFjdGl2ZXNjYnMsIHAtPm1heF9hY3RpdmVzY2JzKTsKKyAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0ZWQgJWQsIEhXICVkLCAiCisgICAgICAgICAgICAiUGFnZSAlZFxuIiwgcC0+c2NiX2RhdGEtPm51bXNjYnMsIHAtPnNjYl9kYXRhLT5tYXhoc2NicywKKyAgICAgICAgICAgIHAtPnNjYl9kYXRhLT5tYXhzY2JzKTsKKyAgaWYgKHAtPmZsYWdzICYgQUhDX0VYVEVSTkFMX1NSQU0pCisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgICAgICAgICAgICAgICAgICAgICAgICBVc2luZyBFeHRlcm5hbCBTQ0IgU1JBTVxuIik7CisgIHNpemUgKz0gc3ByaW50ZihCTFMsICIgICAgICAgICAgICAgSW50ZXJydXB0czogJWxkIiwgcC0+aXNyX2NvdW50KTsKKyAgaWYgKHAtPmNoaXAgJiBBSENfRUlTQSkKKyAgeworICAgIHNpemUgKz0gc3ByaW50ZihCTFMsICIgJXNcbiIsCisgICAgICAgIChwLT5wYXVzZSAmIElSUU1TKSA/ICIoTGV2ZWwgU2Vuc2l0aXZlKSIgOiAiKEVkZ2UgVHJpZ2dlcmVkKSIpOworICB9CisgIGVsc2UKKyAgeworICAgIHNpemUgKz0gc3ByaW50ZihCTFMsICJcbiIpOworICB9CisgIHNpemUgKz0gc3ByaW50ZihCTFMsICIgICAgICBCSU9TIENvbnRyb2wgV29yZDogMHglMDR4XG4iLAorICAgICAgICAgICAgcC0+Ymlvc19jb250cm9sKTsKKyAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgIEFkYXB0ZXIgQ29udHJvbCBXb3JkOiAweCUwNHhcbiIsCisgICAgICAgICAgICBwLT5hZGFwdGVyX2NvbnRyb2wpOworICBzaXplICs9IHNwcmludGYoQkxTLCAiICAgRXh0ZW5kZWQgVHJhbnNsYXRpb246ICVzYWJsZWRcbiIsCisgICAgICAocC0+ZmxhZ3MgJiBBSENfRVhURU5EX1RSQU5TX0EpID8gIkVuIiA6ICJEaXMiKTsKKyAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIkRpc2Nvbm5lY3QgRW5hYmxlIEZsYWdzOiAweCUwNHhcbiIsIHAtPmRpc2NlbmFibGUpOworICBpZiAocC0+ZmVhdHVyZXMgJiAoQUhDX1VMVFJBIHwgQUhDX1VMVFJBMikpCisgIHsKKyAgICBzaXplICs9IHNwcmludGYoQkxTLCAiICAgICBVbHRyYSBFbmFibGUgRmxhZ3M6IDB4JTA0eFxuIiwgcC0+dWx0cmFlbmIpOworICB9CisgIHNpemUgKz0gc3ByaW50ZihCTFMsICJEZWZhdWx0IFRhZyBRdWV1ZSBEZXB0aDogJWRcbiIsIGFpYzd4eHhfZGVmYXVsdF9xdWV1ZV9kZXB0aCk7CisgIHNpemUgKz0gc3ByaW50ZihCTFMsICIgICAgVGFnZ2VkIFF1ZXVlIEJ5IERldmljZSBhcnJheSBmb3IgYWljN3h4eCBob3N0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbmNlICVkOlxuIiwgcC0+aW5zdGFuY2UpOworICBzaXplICs9IHNwcmludGYoQkxTLCAiICAgICAgeyIpOworICBmb3IoaT0wOyBpIDwgKE1BWF9UQVJHRVRTIC0gMSk7IGkrKykKKyAgICBzaXplICs9IHNwcmludGYoQkxTLCAiJWQsIixhaWM3eHh4X3RhZ19pbmZvW3AtPmluc3RhbmNlXS50YWdfY29tbWFuZHNbaV0pOworICBzaXplICs9IHNwcmludGYoQkxTLCAiJWR9XG4iLGFpYzd4eHhfdGFnX2luZm9bcC0+aW5zdGFuY2VdLnRhZ19jb21tYW5kc1tpXSk7CisKKyAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIlxuIik7CisgIHNpemUgKz0gc3ByaW50ZihCTFMsICJTdGF0aXN0aWNzOlxuXG4iKTsKKyAgbGlzdF9mb3JfZWFjaF9lbnRyeShhaWNfZGV2LCAmcC0+YWljX2RldnMsIGxpc3QpCisgIHsKKyAgICBzZHB0ciA9IGFpY19kZXYtPlNEcHRyOworICAgIHRpbmRleCA9IHNkcHRyLT5jaGFubmVsIDw8IDMgfCBzZHB0ci0+aWQ7CisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIihzY3NpJWQ6JWQ6JWQ6JWQpXG4iLAorICAgICAgICBwLT5ob3N0X25vLCBzZHB0ci0+Y2hhbm5lbCwgc2RwdHItPmlkLCBzZHB0ci0+bHVuKTsKKyAgICBzaXplICs9IHNwcmludGYoQkxTLCAiICBEZXZpY2UgdXNpbmcgJXMvJXMiLAorICAgICAgICAgIChhaWNfZGV2LT5jdXIud2lkdGggPT0gTVNHX0VYVF9XRFRSX0JVU18xNl9CSVQpID8KKyAgICAgICAgICAiV2lkZSIgOiAiTmFycm93IiwKKyAgICAgICAgICAoYWljX2Rldi0+Y3VyLm9mZnNldCAhPSAwKSA/CisgICAgICAgICAgIlN5bmMgdHJhbnNmZXJzIGF0ICIgOiAiQXN5bmMgdHJhbnNmZXJzLlxuIiApOworICAgIGlmIChhaWNfZGV2LT5jdXIub2Zmc2V0ICE9IDApCisgICAgeworICAgICAgc3RydWN0IGFpYzd4eHhfc3luY3JhdGUgKnN5bmNfcmF0ZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3B0aW9ucyA9IGFpY19kZXYtPmN1ci5vcHRpb25zOworICAgICAgaW50IHBlcmlvZCA9IGFpY19kZXYtPmN1ci5wZXJpb2Q7CisgICAgICBpbnQgcmF0ZSA9IChhaWNfZGV2LT5jdXIud2lkdGggPT0KKyAgICAgICAgICAgICAgICAgIE1TR19FWFRfV0RUUl9CVVNfMTZfQklUKSA/IDEgOiAwOworCisgICAgICBzeW5jX3JhdGUgPSBhaWM3eHh4X2ZpbmRfc3luY3JhdGUocCwgJnBlcmlvZCwgMCwgJm9wdGlvbnMpOworICAgICAgaWYgKHN5bmNfcmF0ZSAhPSBOVUxMKQorICAgICAgeworICAgICAgICBzaXplICs9IHNwcmludGYoQkxTLCAiJXMgTUJ5dGUvc2VjLCBvZmZzZXQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jX3JhdGUtPnJhdGVbcmF0ZV0sCisgICAgICAgICAgICAgICAgICAgICAgICBhaWNfZGV2LT5jdXIub2Zmc2V0ICk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHNpemUgKz0gc3ByaW50ZihCTFMsICIzLjMgTUJ5dGUvc2VjLCBvZmZzZXQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBhaWNfZGV2LT5jdXIub2Zmc2V0ICk7CisgICAgICB9CisgICAgfQorICAgIHNpemUgKz0gc3ByaW50ZihCTFMsICIgIFRyYW5zaW5mbyBzZXR0aW5nczogIik7CisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgImN1cnJlbnQoJWQvJWQvJWQvJWQpLCAiLAorICAgICAgICAgICAgICAgICAgICBhaWNfZGV2LT5jdXIucGVyaW9kLAorICAgICAgICAgICAgICAgICAgICBhaWNfZGV2LT5jdXIub2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBhaWNfZGV2LT5jdXIud2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGFpY19kZXYtPmN1ci5vcHRpb25zKTsKKyAgICBzaXplICs9IHNwcmludGYoQkxTLCAiZ29hbCglZC8lZC8lZC8lZCksICIsCisgICAgICAgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwucGVyaW9kLAorICAgICAgICAgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5vcHRpb25zKTsKKyAgICBzaXplICs9IHNwcmludGYoQkxTLCAidXNlciglZC8lZC8lZC8lZClcbiIsCisgICAgICAgICAgICAgICAgICAgIHAtPnVzZXJbdGluZGV4XS5wZXJpb2QsCisgICAgICAgICAgICAgICAgICAgIHAtPnVzZXJbdGluZGV4XS5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHAtPnVzZXJbdGluZGV4XS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgcC0+dXNlclt0aW5kZXhdLm9wdGlvbnMpOworICAgIGlmKHNkcHRyLT5zaW1wbGVfdGFncykKKyAgICB7CisgICAgICBzaXplICs9IHNwcmludGYoQkxTLCAiICBUYWdnZWQgQ29tbWFuZCBRdWV1ZWluZyBFbmFibGVkLCBPcmRlcmVkIFRhZ3MgJXMsIERlcHRoICVkLyVkXG4iLCBzZHB0ci0+b3JkZXJlZF90YWdzID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIiwgc2RwdHItPnF1ZXVlX2RlcHRoLCBhaWNfZGV2LT5tYXhfcV9kZXB0aCk7CisgICAgfQorICAgIGlmKGFpY19kZXYtPmJhcnJpZXJfdG90YWwpCisgICAgICBzaXplICs9IHNwcmludGYoQkxTLCAiICBUb3RhbCB0cmFuc2ZlcnMgJWxkOlxuICAgICglbGQvJWxkLyVsZC8lbGQgcmVhZHMvd3JpdGVzL1JFUV9CQVJSSUVSL09yZGVyZWQgVGFncylcbiIsCisgICAgICAgIGFpY19kZXYtPnJfdG90YWwrYWljX2Rldi0+d190b3RhbCwgYWljX2Rldi0+cl90b3RhbCwgYWljX2Rldi0+d190b3RhbCwKKyAgICAgICAgYWljX2Rldi0+YmFycmllcl90b3RhbCwgYWljX2Rldi0+b3JkZXJlZF90b3RhbCk7CisgICAgZWxzZQorICAgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgVG90YWwgdHJhbnNmZXJzICVsZDpcbiAgICAoJWxkLyVsZCByZWFkcy93cml0ZXMpXG4iLAorICAgICAgICBhaWNfZGV2LT5yX3RvdGFsK2FpY19kZXYtPndfdG90YWwsIGFpY19kZXYtPnJfdG90YWwsIGFpY19kZXYtPndfdG90YWwpOworICAgIHNpemUgKz0gc3ByaW50ZihCTFMsICIlc1xuIiwgSERSQik7CisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgIFJlYWRzOiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFpY19kZXYtPnJfYmlucyk7IGkrKykKKyAgICB7CisgICAgICBzaXplICs9IHNwcmludGYoQkxTLCAiICUxMGxkIiwgYWljX2Rldi0+cl9iaW5zW2ldKTsKKyAgICB9CisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIlxuIik7CisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgV3JpdGVzOiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFpY19kZXYtPndfYmlucyk7IGkrKykKKyAgICB7CisgICAgICBzaXplICs9IHNwcmludGYoQkxTLCAiICUxMGxkIiwgYWljX2Rldi0+d19iaW5zW2ldKTsKKyAgICB9CisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIlxuIik7CisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIlxuXG4iKTsKKyAgfQorICBpZiAoc2l6ZSA+PSBhaWM3eHh4X2J1ZmZlcl9zaXplKQorICB7CisgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiYWljN3h4eDogT3ZlcmZsb3cgaW4gYWljN3h4eF9wcm9jLmNcbiIpOworICB9CisKKyAgaWYgKG9mZnNldCA+IHNpemUgLSAxKQorICB7CisgICAga2ZyZWUoYWljN3h4eF9idWZmZXIpOworICAgIGFpYzd4eHhfYnVmZmVyID0gTlVMTDsKKyAgICBhaWM3eHh4X2J1ZmZlcl9zaXplID0gbGVuZ3RoID0gMDsKKyAgICAqc3RhcnQgPSBOVUxMOworICB9CisgIGVsc2UKKyAgeworICAgICpzdGFydCA9IGJ1ZmZlcjsKKyAgICBsZW5ndGggPSBtaW5fdChpbnQsIGxlbmd0aCwgc2l6ZSAtIG9mZnNldCk7CisgICAgbWVtY3B5KGJ1ZmZlciwgJmFpYzd4eHhfYnVmZmVyW29mZnNldF0sIGxlbmd0aCk7CisgIH0KKworICByZXR1cm4gKGxlbmd0aCk7Cit9CisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KKyAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQorICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAorICogb2YgdGhlIGZpbGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtaW5kZW50LWxldmVsOiAyCisgKiBjLWJyYWNlLWltYWdpbmFyeS1vZmZzZXQ6IDAKKyAqIGMtYnJhY2Utb2Zmc2V0OiAtMgorICogYy1hcmdkZWNsLWluZGVudDogMgorICogYy1sYWJlbC1vZmZzZXQ6IC0yCisgKiBjLWNvbnRpbnVlZC1zdGF0ZW1lbnQtb2Zmc2V0OiAyCisgKiBjLWNvbnRpbnVlZC1icmFjZS1vZmZzZXQ6IDAKKyAqIGluZGVudC10YWJzLW1vZGU6IG5pbAorICogdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC9haWM3eHh4X3JlZy5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHhfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmMjMzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC9haWM3eHh4X3JlZy5oCkBAIC0wLDAgKzEsNjI5IEBACisvKgorICAqIERPIE5PVCBFRElUIC0gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLgorICAqLworCisjZGVmaW5lCVNDU0lTRVEgICAgICAgICAJCTB4MDAKKyNkZWZpbmUJCVRFTU9ERSAgICAgICAgICAJMHg4MAorI2RlZmluZQkJRU5TRUxPICAgICAgICAgIAkweDQwCisjZGVmaW5lCQlFTlNFTEkgICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCUVOUlNFTEkgICAgICAgICAJMHgxMAorI2RlZmluZQkJRU5BVVRPQVROTyAgICAgIAkweDA4CisjZGVmaW5lCQlFTkFVVE9BVE5JICAgICAgCTB4MDQKKyNkZWZpbmUJCUVOQVVUT0FUTlAgICAgICAJMHgwMgorI2RlZmluZQkJU0NTSVJTVE8gICAgICAgIAkweDAxCisKKyNkZWZpbmUJU1hGUkNUTDAgICAgICAgIAkJMHgwMQorI2RlZmluZQkJREZPTiAgICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlERlBFWFAgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUZBU1QyMCAgICAgICAgICAJMHgyMAorI2RlZmluZQkJQ0xSU1RDTlQgICAgICAgIAkweDEwCisjZGVmaW5lCQlTUElPRU4gICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVNDQU1FTiAgICAgICAgICAJMHgwNAorI2RlZmluZQkJQ0xSQ0hOICAgICAgICAgIAkweDAyCisKKyNkZWZpbmUJU1hGUkNUTDEgICAgICAgIAkJMHgwMgorI2RlZmluZQkJQklUQlVDS0VUICAgICAgIAkweDgwCisjZGVmaW5lCQlTV1JBUEVOICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUVOU1BDSEsgICAgICAgICAJMHgyMAorI2RlZmluZQkJU1RJTUVTRUwgICAgICAgIAkweDE4CisjZGVmaW5lCQlFTlNUSU1FUiAgICAgICAgCTB4MDQKKyNkZWZpbmUJCUFDVE5FR0VOICAgICAgICAJMHgwMgorI2RlZmluZQkJU1RQV0VOICAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0NTSVNJR08gICAgICAgIAkJMHgwMworI2RlZmluZQkJQ0RPICAgICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlJT08gICAgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCU1TR08gICAgICAgICAgICAJMHgyMAorI2RlZmluZQkJQVROTyAgICAgICAgICAgIAkweDEwCisjZGVmaW5lCQlTRUxPICAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUJTWU8gICAgICAgICAgICAJMHgwNAorI2RlZmluZQkJUkVRTyAgICAgICAgICAgIAkweDAyCisjZGVmaW5lCQlBQ0tPICAgICAgICAgICAgCTB4MDEKKworI2RlZmluZQlTQ1NJU0lHSSAgICAgICAgCQkweDAzCisjZGVmaW5lCQlBVE5JICAgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCVNFTEkgICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJQlNZSSAgICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlSRVFJICAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUFDS0kgICAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNDU0lSQVRFICAgICAgICAJCTB4MDQKKyNkZWZpbmUJCVdJREVYRkVSICAgICAgICAJMHg4MAorI2RlZmluZQkJU1hGUl9VTFRSQTIgICAgIAkweDdmCisjZGVmaW5lCQlTWEZSICAgICAgICAgICAgCTB4NzAKKyNkZWZpbmUJCVNPRlMgICAgICAgICAgICAJMHgwZgorCisjZGVmaW5lCVNDU0lJRCAgICAgICAgICAJCTB4MDUKKyNkZWZpbmUJU0NTSU9GRlNFVCAgICAgIAkJMHgwNQorI2RlZmluZQkJU09GU19VTFRSQTIgICAgIAkweDdmCisKKyNkZWZpbmUJU0NTSURBVEwgICAgICAgIAkJMHgwNgorCisjZGVmaW5lCVNDU0lEQVRIICAgICAgICAJCTB4MDcKKworI2RlZmluZQlTVENOVCAgICAgICAgICAgCQkweDA4CisKKyNkZWZpbmUJT1BUSU9OTU9ERSAgICAgIAkJMHgwOAorI2RlZmluZQkJQVVUT1JBVEVFTiAgICAgIAkweDgwCisjZGVmaW5lCQlBVVRPQUNLRU4gICAgICAgCTB4NDAKKyNkZWZpbmUJCUFUTk1HTU5URU4gICAgICAJMHgyMAorI2RlZmluZQkJQlVTRlJFRVJFViAgICAgIAkweDEwCisjZGVmaW5lCQlFWFBQSEFTRURJUyAgICAgCTB4MDgKKyNkZWZpbmUJCVNDU0lEQVRMX0lNR0VOICAJMHgwNAorI2RlZmluZQkJQVVUT19NU0dPVVRfREUgIAkweDAyCisjZGVmaW5lCQlESVNfTVNHSU5fRFVBTEVER0UJMHgwMQorCisjZGVmaW5lCUNMUlNJTlQwICAgICAgICAJCTB4MGIKKyNkZWZpbmUJCUNMUlNFTERPICAgICAgICAJMHg0MAorI2RlZmluZQkJQ0xSU0VMREkgICAgICAgIAkweDIwCisjZGVmaW5lCQlDTFJTRUxJTkdPICAgICAgCTB4MTAKKyNkZWZpbmUJCUNMUlNXUkFQICAgICAgICAJMHgwOAorI2RlZmluZQkJQ0xSU1BJT1JEWSAgICAgIAkweDAyCisKKyNkZWZpbmUJU1NUQVQwICAgICAgICAgIAkJMHgwYgorI2RlZmluZQkJVEFSR0VUICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlTRUxETyAgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVNFTERJICAgICAgICAgICAJMHgyMAorI2RlZmluZQkJU0VMSU5HTyAgICAgICAgIAkweDEwCisjZGVmaW5lCQlJT0VSUiAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVNXUkFQICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJU0RPTkUgICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlTUElPUkRZICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCURNQURPTkUgICAgICAgICAJMHgwMQorCisjZGVmaW5lCUNMUlNJTlQxICAgICAgICAJCTB4MGMKKyNkZWZpbmUJCUNMUlNFTFRJTUVPICAgICAJMHg4MAorI2RlZmluZQkJQ0xSQVROTyAgICAgICAgIAkweDQwCisjZGVmaW5lCQlDTFJTQ1NJUlNUSSAgICAgCTB4MjAKKyNkZWZpbmUJCUNMUkJVU0ZSRUUgICAgICAJMHgwOAorI2RlZmluZQkJQ0xSU0NTSVBFUlIgICAgIAkweDA0CisjZGVmaW5lCQlDTFJQSEFTRUNIRyAgICAgCTB4MDIKKyNkZWZpbmUJCUNMUlJFUUlOSVQgICAgICAJMHgwMQorCisjZGVmaW5lCVNTVEFUMSAgICAgICAgICAJCTB4MGMKKyNkZWZpbmUJCVNFTFRPICAgICAgICAgICAJMHg4MAorI2RlZmluZQkJQVROVEFSRyAgICAgICAgIAkweDQwCisjZGVmaW5lCQlTQ1NJUlNUSSAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVBIQVNFTUlTICAgICAgICAJMHgxMAorI2RlZmluZQkJQlVTRlJFRSAgICAgICAgIAkweDA4CisjZGVmaW5lCQlTQ1NJUEVSUiAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVBIQVNFQ0hHICAgICAgICAJMHgwMgorI2RlZmluZQkJUkVRSU5JVCAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU1NUQVQyICAgICAgICAgIAkJMHgwZAorI2RlZmluZQkJT1ZFUlJVTiAgICAgICAgIAkweDgwCisjZGVmaW5lCQlTSFZBTElEICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVdJREVfUkVTICAgICAgICAJMHgyMAorI2RlZmluZQkJU0ZDTlQgICAgICAgICAgIAkweDFmCisjZGVmaW5lCQlFWFBfQUNUSVZFICAgICAgCTB4MTAKKyNkZWZpbmUJCUNSQ1ZBTEVSUiAgICAgICAJMHgwOAorI2RlZmluZQkJQ1JDRU5ERVJSICAgICAgIAkweDA0CisjZGVmaW5lCQlDUkNSRVFFUlIgICAgICAgCTB4MDIKKyNkZWZpbmUJCURVQUxfRURHRV9FUlJPUiAJMHgwMQorCisjZGVmaW5lCVNTVEFUMyAgICAgICAgICAJCTB4MGUKKyNkZWZpbmUJCVNDU0lDTlQgICAgICAgICAJMHhmMAorI2RlZmluZQkJT0ZGQ05UICAgICAgICAgIAkweDBmCisKKyNkZWZpbmUJU0NTSUlEX1VMVFJBMiAgIAkJMHgwZgorI2RlZmluZQkJT0lEICAgICAgICAgICAgIAkweDBmCisKKyNkZWZpbmUJU0lNT0RFMCAgICAgICAgIAkJMHgxMAorI2RlZmluZQkJRU5TRUxETyAgICAgICAgIAkweDQwCisjZGVmaW5lCQlFTlNFTERJICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCUVOU0VMSU5HTyAgICAgICAJMHgxMAorI2RlZmluZQkJRU5JT0VSUiAgICAgICAgIAkweDA4CisjZGVmaW5lCQlFTlNXUkFQICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUVOU0RPTkUgICAgICAgICAJMHgwNAorI2RlZmluZQkJRU5TUElPUkRZICAgICAgIAkweDAyCisjZGVmaW5lCQlFTkRNQURPTkUgICAgICAgCTB4MDEKKworI2RlZmluZQlTSU1PREUxICAgICAgICAgCQkweDExCisjZGVmaW5lCQlFTlNFTFRJTU8gICAgICAgCTB4ODAKKyNkZWZpbmUJCUVOQVROVEFSRyAgICAgICAJMHg0MAorI2RlZmluZQkJRU5TQ1NJUlNUICAgICAgIAkweDIwCisjZGVmaW5lCQlFTlBIQVNFTUlTICAgICAgCTB4MTAKKyNkZWZpbmUJCUVOQlVTRlJFRSAgICAgICAJMHgwOAorI2RlZmluZQkJRU5TQ1NJUEVSUiAgICAgIAkweDA0CisjZGVmaW5lCQlFTlBIQVNFQ0hHICAgICAgCTB4MDIKKyNkZWZpbmUJCUVOUkVRSU5JVCAgICAgICAJMHgwMQorCisjZGVmaW5lCVNDU0lCVVNMICAgICAgICAJCTB4MTIKKworI2RlZmluZQlTQ1NJQlVTSCAgICAgICAgCQkweDEzCisKKyNkZWZpbmUJU0hBRERSICAgICAgICAgIAkJMHgxNAorCisjZGVmaW5lCVNFTFRJTUVSICAgICAgICAJCTB4MTgKKyNkZWZpbmUJCVNUQUdFNiAgICAgICAgICAJMHgyMAorI2RlZmluZQkJU1RBR0U1ICAgICAgICAgIAkweDEwCisjZGVmaW5lCQlTVEFHRTQgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVNUQUdFMyAgICAgICAgICAJMHgwNAorI2RlZmluZQkJU1RBR0UyICAgICAgICAgIAkweDAyCisjZGVmaW5lCQlTVEFHRTEgICAgICAgICAgCTB4MDEKKworI2RlZmluZQlTRUxJRCAgICAgICAgICAgCQkweDE5CisjZGVmaW5lCQlTRUxJRF9NQVNLICAgICAgCTB4ZjAKKyNkZWZpbmUJCU9ORUJJVCAgICAgICAgICAJMHgwOAorCisjZGVmaW5lCVNQSU9DQVAgICAgICAgICAJCTB4MWIKKyNkZWZpbmUJCVNPRlQxICAgICAgICAgICAJMHg4MAorI2RlZmluZQkJU09GVDAgICAgICAgICAgIAkweDQwCisjZGVmaW5lCQlTT0ZUQ01ERU4gICAgICAgCTB4MjAKKyNkZWZpbmUJCUhBU19CUkRDVEwgICAgICAJMHgxMAorI2RlZmluZQkJU0VFUFJPTSAgICAgICAgIAkweDA4CisjZGVmaW5lCQlFRVBST00gICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVJPTSAgICAgICAgICAgICAJMHgwMgorI2RlZmluZQkJU1NQSU9DUFMgICAgICAgIAkweDAxCisKKyNkZWZpbmUJQlJEQ1RMICAgICAgICAgIAkJMHgxZAorI2RlZmluZQkJQlJEREFUNyAgICAgICAgIAkweDgwCisjZGVmaW5lCQlCUkREQVQ2ICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUJSRERBVDUgICAgICAgICAJMHgyMAorI2RlZmluZQkJQlJEREFUNCAgICAgICAgIAkweDEwCisjZGVmaW5lCQlCUkRTVEIgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCUJSRENTICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJQlJEREFUMyAgICAgICAgIAkweDA4CisjZGVmaW5lCQlCUkREQVQyICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCUJSRFJXICAgICAgICAgICAJMHgwNAorI2RlZmluZQkJQlJEUldfVUxUUkEyICAgIAkweDAyCisjZGVmaW5lCQlCUkRDVEwxICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUJSRFNUQl9VTFRSQTIgICAJMHgwMQorI2RlZmluZQkJQlJEQ1RMMCAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0VFQ1RMICAgICAgICAgIAkJMHgxZQorI2RlZmluZQkJRVhUQVJCQUNLICAgICAgIAkweDgwCisjZGVmaW5lCQlFWFRBUkJSRVEgICAgICAgCTB4NDAKKyNkZWZpbmUJCVNFRU1TICAgICAgICAgICAJMHgyMAorI2RlZmluZQkJU0VFUkRZICAgICAgICAgIAkweDEwCisjZGVmaW5lCQlTRUVDUyAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVNFRUNLICAgICAgICAgICAJMHgwNAorI2RlZmluZQkJU0VFRE8gICAgICAgICAgIAkweDAyCisjZGVmaW5lCQlTRUVESSAgICAgICAgICAgCTB4MDEKKworI2RlZmluZQlTQkxLQ1RMICAgICAgICAgCQkweDFmCisjZGVmaW5lCQlESUFHTEVERU4gICAgICAgCTB4ODAKKyNkZWZpbmUJCURJQUdMRURPTiAgICAgICAJMHg0MAorI2RlZmluZQkJQVVUT0ZMVVNIRElTICAgIAkweDIwCisjZGVmaW5lCQlFTkFCNDAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUVOQUIyMCAgICAgICAgICAJMHgwNAorI2RlZmluZQkJU0VMV0lERSAgICAgICAgIAkweDAyCisjZGVmaW5lCQlYQ1ZSICAgICAgICAgICAgCTB4MDEKKworI2RlZmluZQlTUkFNX0JBU0UgICAgICAgCQkweDIwCisKKyNkZWZpbmUJVEFSR19TQ1NJUkFURSAgIAkJMHgyMAorCisjZGVmaW5lCVVMVFJBX0VOQiAgICAgICAJCTB4MzAKKworI2RlZmluZQlESVNDX0RTQiAgICAgICAgCQkweDMyCisKKyNkZWZpbmUJTVNHX09VVCAgICAgICAgIAkJMHgzNAorCisjZGVmaW5lCURNQVBBUkFNUyAgICAgICAJCTB4MzUKKyNkZWZpbmUJCVBSRUxPQURFTiAgICAgICAJMHg4MAorI2RlZmluZQkJV0lERU9ERCAgICAgICAgIAkweDQwCisjZGVmaW5lCQlTQ1NJRU4gICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVNETUFFTkFDSyAgICAgICAJMHgxMAorI2RlZmluZQkJU0RNQUVOICAgICAgICAgIAkweDEwCisjZGVmaW5lCQlIRE1BRU4gICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUhETUFFTkFDSyAgICAgICAJMHgwOAorI2RlZmluZQkJRElSRUNUSU9OICAgICAgIAkweDA0CisjZGVmaW5lCQlGSUZPRkxVU0ggICAgICAgCTB4MDIKKyNkZWZpbmUJCUZJRk9SRVNFVCAgICAgICAJMHgwMQorCisjZGVmaW5lCVNFUV9GTEFHUyAgICAgICAJCTB4MzYKKyNkZWZpbmUJCUlERU5USUZZX1NFRU4gICAJMHg4MAorI2RlZmluZQkJU0NCUFRSX1ZBTElEICAgIAkweDIwCisjZGVmaW5lCQlEUEhBU0UgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCUFNVEFSR0VUICAgICAgICAJMHgwOAorI2RlZmluZQkJV0lERV9CVVMgICAgICAgIAkweDAyCisjZGVmaW5lCQlUV0lOX0JVUyAgICAgICAgCTB4MDEKKworI2RlZmluZQlTQVZFRF9UQ0wgICAgICAgCQkweDM3CisKKyNkZWZpbmUJU0dfQ09VTlQgICAgICAgIAkJMHgzOAorCisjZGVmaW5lCVNHX05FWFQgICAgICAgICAJCTB4MzkKKworI2RlZmluZQlMQVNUUEhBU0UgICAgICAgCQkweDNkCisjZGVmaW5lCQlQX01FU0dJTiAgICAgICAgCTB4ZTAKKyNkZWZpbmUJCVBIQVNFX01BU0sgICAgICAJMHhlMAorI2RlZmluZQkJUF9TVEFUVVMgICAgICAgIAkweGMwCisjZGVmaW5lCQlQX01FU0dPVVQgICAgICAgCTB4YTAKKyNkZWZpbmUJCVBfQ09NTUFORCAgICAgICAJMHg4MAorI2RlZmluZQkJQ0RJICAgICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlJT0kgICAgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVBfREFUQUlOICAgICAgICAJMHg0MAorI2RlZmluZQkJTVNHSSAgICAgICAgICAgIAkweDIwCisjZGVmaW5lCQlQX0JVU0ZSRUUgICAgICAgCTB4MDEKKyNkZWZpbmUJCVBfREFUQU9VVCAgICAgICAJMHgwMAorCisjZGVmaW5lCVdBSVRJTkdfU0NCSCAgICAJCTB4M2UKKworI2RlZmluZQlESVNDT05ORUNURURfU0NCSAkJMHgzZgorCisjZGVmaW5lCUZSRUVfU0NCSCAgICAgICAJCTB4NDAKKworI2RlZmluZQlIU0NCX0FERFIgICAgICAgCQkweDQxCisKKyNkZWZpbmUJU0NCSURfQUREUiAgICAgIAkJMHg0NQorCisjZGVmaW5lCVRNT0RFX0NNREFERFIgICAJCTB4NDkKKworI2RlZmluZQlLRVJORUxfUUlOUE9TICAgCQkweDRkCisKKyNkZWZpbmUJUUlOUE9TICAgICAgICAgIAkJMHg0ZQorCisjZGVmaW5lCVFPVVRQT1MgICAgICAgICAJCTB4NGYKKworI2RlZmluZQlUTU9ERV9DTURBRERSX05FWFQJCTB4NTAKKworI2RlZmluZQlBUkdfMSAgICAgICAgICAgCQkweDUxCisjZGVmaW5lCVJFVFVSTl8xICAgICAgICAJCTB4NTEKKyNkZWZpbmUJCVNFTkRfTVNHICAgICAgICAJMHg4MAorI2RlZmluZQkJU0VORF9TRU5TRSAgICAgIAkweDQwCisjZGVmaW5lCQlTRU5EX1JFSiAgICAgICAgCTB4MjAKKyNkZWZpbmUJCU1TR09VVF9QSEFTRU1JUyAJMHgxMAorCisjZGVmaW5lCUFSR18yICAgICAgICAgICAJCTB4NTIKKyNkZWZpbmUJUkVUVVJOXzIgICAgICAgIAkJMHg1MgorCisjZGVmaW5lCUxBU1RfTVNHICAgICAgICAJCTB4NTMKKworI2RlZmluZQlQUkVGRVRDSF9DTlQgICAgCQkweDU0CisKKyNkZWZpbmUJU0NTSUNPTkYgICAgICAgIAkJMHg1YQorI2RlZmluZQkJVEVSTV9FTkIgICAgICAgIAkweDgwCisjZGVmaW5lCQlSRVNFVF9TQ1NJICAgICAgCTB4NDAKKyNkZWZpbmUJCUhXU0NTSUlEICAgICAgICAJMHgwZgorI2RlZmluZQkJSFNDU0lJRCAgICAgICAgIAkweDA3CisKKyNkZWZpbmUJSE9TVENPTkYgICAgICAgIAkJMHg1ZAorCisjZGVmaW5lCUhBXzI3NF9CSU9TQ1RSTCAJCTB4NWYKKyNkZWZpbmUJCUJJT1NNT0RFICAgICAgICAJMHgzMAorI2RlZmluZQkJQklPU0RJU0FCTEVEICAgIAkweDMwCisjZGVmaW5lCQlDSEFOTkVMX0JfUFJJTUFSWQkweDA4CisKKyNkZWZpbmUJU0VRQ1RMICAgICAgICAgIAkJMHg2MAorI2RlZmluZQkJUEVSUk9SRElTICAgICAgIAkweDgwCisjZGVmaW5lCQlQQVVTRURJUyAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUZBSUxESVMgICAgICAgICAJMHgyMAorI2RlZmluZQkJRkFTVE1PREUgICAgICAgIAkweDEwCisjZGVmaW5lCQlCUktBRFJJTlRFTiAgICAgCTB4MDgKKyNkZWZpbmUJCVNURVAgICAgICAgICAgICAJMHgwNAorI2RlZmluZQkJU0VRUkVTRVQgICAgICAgIAkweDAyCisjZGVmaW5lCQlMT0FEUkFNICAgICAgICAgCTB4MDEKKworI2RlZmluZQlTRVFSQU0gICAgICAgICAgCQkweDYxCisKKyNkZWZpbmUJU0VRQUREUjAgICAgICAgIAkJMHg2MgorCisjZGVmaW5lCVNFUUFERFIxICAgICAgICAJCTB4NjMKKyNkZWZpbmUJCVNFUUFERFIxX01BU0sgICAJMHgwMQorCisjZGVmaW5lCUFDQ1VNICAgICAgICAgICAJCTB4NjQKKworI2RlZmluZQlTSU5ERVggICAgICAgICAgCQkweDY1CisKKyNkZWZpbmUJRElOREVYICAgICAgICAgIAkJMHg2NgorCisjZGVmaW5lCUFMTE9ORVMgICAgICAgICAJCTB4NjkKKworI2RlZmluZQlBTExaRVJPUyAgICAgICAgCQkweDZhCisKKyNkZWZpbmUJTk9ORSAgICAgICAgICAgIAkJMHg2YQorCisjZGVmaW5lCUZMQUdTICAgICAgICAgICAJCTB4NmIKKyNkZWZpbmUJCVpFUk8gICAgICAgICAgICAJMHgwMgorI2RlZmluZQkJQ0FSUlkgICAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0lORElSICAgICAgICAgIAkJMHg2YworCisjZGVmaW5lCURJTkRJUiAgICAgICAgICAJCTB4NmQKKworI2RlZmluZQlGVU5DVElPTjEgICAgICAgCQkweDZlCisKKyNkZWZpbmUJU1RBQ0sgICAgICAgICAgIAkJMHg2ZgorCisjZGVmaW5lCVRBUkdfT0ZGU0VUICAgICAJCTB4NzAKKworI2RlZmluZQlCQ1RMICAgICAgICAgICAgCQkweDg0CisjZGVmaW5lCQlBQ0UgICAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUVOQUJMRSAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCURTQ09NTUFORDAgICAgICAJCTB4ODQKKyNkZWZpbmUJCUlOVFNDQlJBTVNFTCAgICAJMHgwOAorI2RlZmluZQkJUkFNUFMgICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlVU0NCU0laRTMyICAgICAgCTB4MDIKKyNkZWZpbmUJCUNJT1BBUkNLRU4gICAgICAJMHgwMQorCisjZGVmaW5lCURTQ09NTUFORCAgICAgICAJCTB4ODQKKyNkZWZpbmUJCUNBQ0hFVEhFTiAgICAgICAJMHg4MAorI2RlZmluZQkJRFBBUkNLRU4gICAgICAgIAkweDQwCisjZGVmaW5lCQlNUEFSQ0tFTiAgICAgICAgCTB4MjAKKyNkZWZpbmUJCUVYVFJFUUxDSyAgICAgICAJMHgxMAorCisjZGVmaW5lCUJVU1RJTUUgICAgICAgICAJCTB4ODUKKyNkZWZpbmUJCUJPRkYgICAgICAgICAgICAJMHhmMAorI2RlZmluZQkJQk9OICAgICAgICAgICAgIAkweDBmCisKKyNkZWZpbmUJQlVTU1BEICAgICAgICAgIAkJMHg4NgorI2RlZmluZQkJREZUSFJTSCAgICAgICAgIAkweGMwCisjZGVmaW5lCQlTVEJPRkYgICAgICAgICAgCTB4MzgKKyNkZWZpbmUJCVNUQk9OICAgICAgICAgICAJMHgwNworCisjZGVmaW5lCURTUENJU1RBVFVTICAgICAJCTB4ODYKKyNkZWZpbmUJCURGVEhSU0hfMTAwICAgICAJMHhjMAorCisjZGVmaW5lCUhDTlRSTCAgICAgICAgICAJCTB4ODcKKyNkZWZpbmUJCVBPV1JETiAgICAgICAgICAJMHg0MAorI2RlZmluZQkJU1dJTlQgICAgICAgICAgIAkweDEwCisjZGVmaW5lCQlJUlFNUyAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVBBVVNFICAgICAgICAgICAJMHgwNAorI2RlZmluZQkJSU5URU4gICAgICAgICAgIAkweDAyCisjZGVmaW5lCQlDSElQUlNUICAgICAgICAgCTB4MDEKKyNkZWZpbmUJCUNISVBSU1RBQ0sgICAgICAJMHgwMQorCisjZGVmaW5lCUhBRERSICAgICAgICAgICAJCTB4ODgKKworI2RlZmluZQlIQ05UICAgICAgICAgICAgCQkweDhjCisKKyNkZWZpbmUJU0NCUFRSICAgICAgICAgIAkJMHg5MAorCisjZGVmaW5lCUlOVFNUQVQgICAgICAgICAJCTB4OTEKKyNkZWZpbmUJCVNFUUlOVF9NQVNLICAgICAJMHhmMQorI2RlZmluZQkJREFUQV9PVkVSUlVOICAgIAkweGUxCisjZGVmaW5lCQlNU0dJTl9QSEFTRU1JUyAgCTB4ZDEKKyNkZWZpbmUJCVRSQUNFUE9JTlQyICAgICAJMHhjMQorI2RlZmluZQkJU0VRX1NHX0ZJWFVQICAgIAkweGIxCisjZGVmaW5lCQlBV0FJVElOR19NU0cgICAgCTB4YTEKKyNkZWZpbmUJCVJFU0lEVUFMICAgICAgICAJMHg4MQorI2RlZmluZQkJQkFEX1NUQVRVUyAgICAgIAkweDcxCisjZGVmaW5lCQlSRUpFQ1RfTVNHICAgICAgCTB4NjEKKyNkZWZpbmUJCVdJREVfUkVTSURVRSAgICAJMHg1MQorI2RlZmluZQkJRVhURU5ERURfTVNHICAgIAkweDQxCisjZGVmaW5lCQlOT19NQVRDSCAgICAgICAgCTB4MzEKKyNkZWZpbmUJCU5PX0lERU5UICAgICAgICAJMHgyMQorI2RlZmluZQkJU0VORF9SRUpFQ1QgICAgIAkweDExCisjZGVmaW5lCQlJTlRfUEVORCAgICAgICAgCTB4MGYKKyNkZWZpbmUJCUJSS0FEUklOVCAgICAgICAJMHgwOAorI2RlZmluZQkJU0NTSUlOVCAgICAgICAgIAkweDA0CisjZGVmaW5lCQlDTURDTVBMVCAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUJBRF9QSEFTRSAgICAgICAJMHgwMQorI2RlZmluZQkJU0VRSU5UICAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJQ0xSSU5UICAgICAgICAgIAkJMHg5MgorI2RlZmluZQkJQ0xSUEFSRVJSICAgICAgIAkweDEwCisjZGVmaW5lCQlDTFJCUktBRFJJTlQgICAgCTB4MDgKKyNkZWZpbmUJCUNMUlNDU0lJTlQgICAgICAJMHgwNAorI2RlZmluZQkJQ0xSQ01ESU5UICAgICAgIAkweDAyCisjZGVmaW5lCQlDTFJTRVFJTlQgICAgICAgCTB4MDEKKworI2RlZmluZQlFUlJPUiAgICAgICAgICAgCQkweDkyCisjZGVmaW5lCQlDSU9QQVJFUlIgICAgICAgCTB4ODAKKyNkZWZpbmUJCVBDSUVSUlNUQVQgICAgICAJMHg0MAorI2RlZmluZQkJTVBBUkVSUiAgICAgICAgIAkweDIwCisjZGVmaW5lCQlEUEFSRVJSICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCVNRUEFSRVJSICAgICAgICAJMHgwOAorI2RlZmluZQkJSUxMT1BDT0RFICAgICAgIAkweDA0CisjZGVmaW5lCQlEU0NUTU9VVCAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUlMTFNBRERSICAgICAgICAJMHgwMgorI2RlZmluZQkJSUxMSEFERFIgICAgICAgIAkweDAxCisKKyNkZWZpbmUJREZDTlRSTCAgICAgICAgIAkJMHg5MworCisjZGVmaW5lCURGU1RBVFVTICAgICAgICAJCTB4OTQKKyNkZWZpbmUJCVBSRUxPQURfQVZBSUwgICAJMHg4MAorI2RlZmluZQkJRFdPUkRFTVAgICAgICAgIAkweDIwCisjZGVmaW5lCQlNUkVRUEVORCAgICAgICAgCTB4MTAKKyNkZWZpbmUJCUhET05FICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJREZUSFJFU0ggICAgICAgIAkweDA0CisjZGVmaW5lCQlGSUZPRlVMTCAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUZJRk9FTVAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCURGREFUICAgICAgICAgICAJCTB4OTkKKworI2RlZmluZQlTQ0JDTlQgICAgICAgICAgCQkweDlhCisjZGVmaW5lCQlTQ0JBVVRPICAgICAgICAgCTB4ODAKKyNkZWZpbmUJCVNDQkNOVF9NQVNLICAgICAJMHgxZgorCisjZGVmaW5lCVFJTkZJRk8gICAgICAgICAJCTB4OWIKKworI2RlZmluZQlRSU5DTlQgICAgICAgICAgCQkweDljCisKKyNkZWZpbmUJU0NTSURBVExfSU1HICAgIAkJMHg5YworCisjZGVmaW5lCVFPVVRGSUZPICAgICAgICAJCTB4OWQKKworI2RlZmluZQlDUkNDT05UUk9MMSAgICAgCQkweDlkCisjZGVmaW5lCQlDUkNPTlNFRU4gICAgICAgCTB4ODAKKyNkZWZpbmUJCUNSQ1ZBTENIS0VOICAgICAJMHg0MAorI2RlZmluZQkJQ1JDRU5EQ0hLRU4gICAgIAkweDIwCisjZGVmaW5lCQlDUkNSRVFDSEtFTiAgICAgCTB4MTAKKyNkZWZpbmUJCVRBUkdDUkNFTkRFTiAgICAJMHgwOAorI2RlZmluZQkJVEFSR0NSQ0NOVEVOICAgIAkweDA0CisKKyNkZWZpbmUJU0NTSVBIQVNFICAgICAgIAkJMHg5ZQorI2RlZmluZQkJU1BfU1RBVFVTICAgICAgIAkweDIwCisjZGVmaW5lCQlTUF9DT01NQU5EICAgICAgCTB4MTAKKyNkZWZpbmUJCVNQX01TR19JTiAgICAgICAJMHgwOAorI2RlZmluZQkJU1BfTVNHX09VVCAgICAgIAkweDA0CisjZGVmaW5lCQlTUF9EQVRBX0lOICAgICAgCTB4MDIKKyNkZWZpbmUJCVNQX0RBVEFfT1VUICAgICAJMHgwMQorCisjZGVmaW5lCVFPVVRDTlQgICAgICAgICAJCTB4OWUKKworI2RlZmluZQlTRlVOQ1QgICAgICAgICAgCQkweDlmCisjZGVmaW5lCQlBTFRfTU9ERSAgICAgICAgCTB4ODAKKworI2RlZmluZQlTQ0JfQ09OVFJPTCAgICAgCQkweGEwCisjZGVmaW5lCQlNS19NRVNTQUdFICAgICAgCTB4ODAKKyNkZWZpbmUJCURJU0NFTkIgICAgICAgICAJMHg0MAorI2RlZmluZQkJVEFHX0VOQiAgICAgICAgIAkweDIwCisjZGVmaW5lCQlESVNDT05ORUNURUQgICAgCTB4MDQKKyNkZWZpbmUJCVNDQl9UQUdfVFlQRSAgICAJMHgwMworCisjZGVmaW5lCVNDQl9CQVNFICAgICAgICAJCTB4YTAKKworI2RlZmluZQlTQ0JfVENMICAgICAgICAgCQkweGExCisjZGVmaW5lCQlUSUQgICAgICAgICAgICAgCTB4ZjAKKyNkZWZpbmUJCVNFTEJVU0IgICAgICAgICAJMHgwOAorI2RlZmluZQkJTElEICAgICAgICAgICAgIAkweDA3CisKKyNkZWZpbmUJU0NCX1RBUkdFVF9TVEFUVVMJCTB4YTIKKworI2RlZmluZQlTQ0JfU0dDT1VOVCAgICAgCQkweGEzCisKKyNkZWZpbmUJU0NCX1NHUFRSICAgICAgIAkJMHhhNAorCisjZGVmaW5lCVNDQl9SRVNJRF9TR0NOVCAJCTB4YTgKKworI2RlZmluZQlTQ0JfUkVTSURfRENOVCAgCQkweGE5CisKKyNkZWZpbmUJU0NCX0RBVEFQVFIgICAgIAkJMHhhYworCisjZGVmaW5lCVNDQl9EQVRBQ05UICAgICAJCTB4YjAKKworI2RlZmluZQlTQ0JfQ01EUFRSICAgICAgCQkweGI0CisKKyNkZWZpbmUJU0NCX0NNRExFTiAgICAgIAkJMHhiOAorCisjZGVmaW5lCVNDQl9UQUcgICAgICAgICAJCTB4YjkKKworI2RlZmluZQlTQ0JfTkVYVCAgICAgICAgCQkweGJhCisKKyNkZWZpbmUJU0NCX1BSRVYgICAgICAgIAkJMHhiYgorCisjZGVmaW5lCVNDQl9CVVNZVEFSR0VUUyAJCTB4YmMKKworI2RlZmluZQlTRUVDVExfMjg0MCAgICAgCQkweGMwCisjZGVmaW5lCQlDU18yODQwICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCUNLXzI4NDAgICAgICAgICAJMHgwMgorI2RlZmluZQkJRE9fMjg0MCAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU1RBVFVTXzI4NDAgICAgIAkJMHhjMQorI2RlZmluZQkJRUVQUk9NX1RGICAgICAgIAkweDgwCisjZGVmaW5lCQlCSU9TX1NFTCAgICAgICAgCTB4NjAKKyNkZWZpbmUJCUFEU0VMICAgICAgICAgICAJMHgxZQorI2RlZmluZQkJRElfMjg0MCAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJQ0NIQUREUiAgICAgICAgIAkJMHhlMAorCisjZGVmaW5lCUNDSENOVCAgICAgICAgICAJCTB4ZTgKKworI2RlZmluZQlDQ1NHUkFNICAgICAgICAgCQkweGU5CisKKyNkZWZpbmUJQ0NTR0FERFIgICAgICAgIAkJMHhlYQorCisjZGVmaW5lCUNDU0dDVEwgICAgICAgICAJCTB4ZWIKKyNkZWZpbmUJCUNDU0dET05FICAgICAgICAJMHg4MAorI2RlZmluZQkJQ0NTR0VOICAgICAgICAgIAkweDA4CisjZGVmaW5lCQlGTEFHICAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUNDU0dSRVNFVCAgICAgICAJMHgwMQorCisjZGVmaW5lCUNDU0NCUkFNICAgICAgICAJCTB4ZWMKKworI2RlZmluZQlDQ1NDQkFERFIgICAgICAgCQkweGVkCisKKyNkZWZpbmUJQ0NTQ0JDVEwgICAgICAgIAkJMHhlZQorI2RlZmluZQkJQ0NTQ0JET05FICAgICAgIAkweDgwCisjZGVmaW5lCQlBUlJET05FICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUNDQVJSRU4gICAgICAgICAJMHgxMAorI2RlZmluZQkJQ0NTQ0JFTiAgICAgICAgIAkweDA4CisjZGVmaW5lCQlDQ1NDQkRJUiAgICAgICAgCTB4MDQKKyNkZWZpbmUJCUNDU0NCUkVTRVQgICAgICAJMHgwMQorCisjZGVmaW5lCUNDU0NCQ05UICAgICAgICAJCTB4ZWYKKworI2RlZmluZQlDQ1NDQlBUUiAgICAgICAgCQkweGYxCisKKyNkZWZpbmUJSE5TQ0JfUU9GRiAgICAgIAkJMHhmNAorCisjZGVmaW5lCUhFU0NCX1FPRkYgICAgICAJCTB4ZjUKKworI2RlZmluZQlTTlNDQl9RT0ZGICAgICAgCQkweGY2CisKKyNkZWZpbmUJU0VTQ0JfUU9GRiAgICAgIAkJMHhmNworCisjZGVmaW5lCVNEU0NCX1FPRkYgICAgICAJCTB4ZjgKKworI2RlZmluZQlRT0ZGX0NUTFNUQSAgICAgCQkweGZhCisjZGVmaW5lCQlFU1RBQkxJU0hfU0NCX0FWQUlMCTB4ODAKKyNkZWZpbmUJCVNDQl9BVkFJTCAgICAgICAJMHg0MAorI2RlZmluZQkJU05TQ0JfUk9MTE9WRVIgIAkweDIwCisjZGVmaW5lCQlTRFNDQl9ST0xMT1ZFUiAgCTB4MTAKKyNkZWZpbmUJCVNFU0NCX1JPTExPVkVSICAJMHgwOAorI2RlZmluZQkJU0NCX1FTSVpFICAgICAgIAkweDA3CisjZGVmaW5lCQlTQ0JfUVNJWkVfMjU2ICAgCTB4MDYKKworI2RlZmluZQlERkZfVEhSU0ggICAgICAgCQkweGZiCisjZGVmaW5lCQlXUl9ERlRIUlNIICAgICAgCTB4NzAKKyNkZWZpbmUJCVdSX0RGVEhSU0hfTUFYICAJMHg3MAorI2RlZmluZQkJV1JfREZUSFJTSF85MCAgIAkweDYwCisjZGVmaW5lCQlXUl9ERlRIUlNIXzg1ICAgCTB4NTAKKyNkZWZpbmUJCVdSX0RGVEhSU0hfNzUgICAJMHg0MAorI2RlZmluZQkJV1JfREZUSFJTSF82MyAgIAkweDMwCisjZGVmaW5lCQlXUl9ERlRIUlNIXzUwICAgCTB4MjAKKyNkZWZpbmUJCVdSX0RGVEhSU0hfMjUgICAJMHgxMAorI2RlZmluZQkJUkRfREZUSFJTSF9NQVggIAkweDA3CisjZGVmaW5lCQlSRF9ERlRIUlNIICAgICAgCTB4MDcKKyNkZWZpbmUJCVJEX0RGVEhSU0hfOTAgICAJMHgwNgorI2RlZmluZQkJUkRfREZUSFJTSF84NSAgIAkweDA1CisjZGVmaW5lCQlSRF9ERlRIUlNIXzc1ICAgCTB4MDQKKyNkZWZpbmUJCVJEX0RGVEhSU0hfNjMgICAJMHgwMworI2RlZmluZQkJUkRfREZUSFJTSF81MCAgIAkweDAyCisjZGVmaW5lCQlSRF9ERlRIUlNIXzI1ICAgCTB4MDEKKyNkZWZpbmUJCVdSX0RGVEhSU0hfTUlOICAJMHgwMAorI2RlZmluZQkJUkRfREZUSFJTSF9NSU4gIAkweDAwCisKKyNkZWZpbmUJU0dfQ0FDSEVQVFIgICAgIAkJMHhmYworI2RlZmluZQkJU0dfVVNFUl9EQVRBICAgIAkweGZjCisjZGVmaW5lCQlMQVNUX1NFRyAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUxBU1RfU0VHX0RPTkUgICAJMHgwMQorCisKKyNkZWZpbmUJQ01EX0dST1VQMl9CWVRFX0RFTFRBCTB4ZmEKKyNkZWZpbmUJTUFYX09GRlNFVF84QklUCTB4MGYKKyNkZWZpbmUJQlVTXzE2X0JJVAkweDAxCisjZGVmaW5lCVFJTkZJRk9fT0ZGU0VUCTB4MDIKKyNkZWZpbmUJQ01EX0dST1VQNV9CWVRFX0RFTFRBCTB4MGIKKyNkZWZpbmUJQ01EX0dST1VQX0NPREVfU0hJRlQJMHgwNQorI2RlZmluZQlNQVhfT0ZGU0VUX1VMVFJBMgkweDdmCisjZGVmaW5lCU1BWF9PRkZTRVRfMTZCSVQJMHgwOAorI2RlZmluZQlCVVNfOF9CSVQJMHgwMAorI2RlZmluZQlRT1VURklGT19PRkZTRVQJMHgwMQorI2RlZmluZQlVTlRBR0dFRFNDQl9PRkZTRVQJMHgwMAorI2RlZmluZQlDQ1NHUkFNX01BWFNFR1MJMHgxMAorI2RlZmluZQlTQ0JfTElTVF9OVUxMCTB4ZmYKKyNkZWZpbmUJU0dfU0laRU9GCTB4MDgKKyNkZWZpbmUJQ01EX0dST1VQNF9CWVRFX0RFTFRBCTB4MDQKKyNkZWZpbmUJQ01EX0dST1VQMF9CWVRFX0RFTFRBCTB4ZmMKKyNkZWZpbmUJSE9TVF9NU0cJMHhmZgorI2RlZmluZQlCVVNfMzJfQklUCTB4MDIKKyNkZWZpbmUJQ0NTR0FERFJfTUFYCTB4ODAKKworCisvKiBEb3dubG9hZGVkIENvbnN0YW50IERlZmluaXRpb25zICovCisjZGVmaW5lCVRNT0RFX05VTUNNRFMJMHgwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHhfc2VxLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQvYWljN3h4eF9zZXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWJjMTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHhfc2VxLmMKQEAgLTAsMCArMSw4MTcgQEAKKy8qCisgICogRE8gTk9UIEVESVQgLSBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuCisgICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBzZXFwcm9nW10gPSB7CisJMHhmZiwgMHg2YSwgMHgwNiwgMHgwOCwKKwkweDdmLCAweDAyLCAweDA0LCAweDA4LAorCTB4MTIsIDB4NmEsIDB4MDAsIDB4MDAsCisJMHhmZiwgMHg2YSwgMHhkNiwgMHgwOSwKKwkweGZmLCAweDZhLCAweGRjLCAweDA5LAorCTB4MDAsIDB4NjUsIDB4Y2EsIDB4NTgsCisJMHhmNywgMHgwMSwgMHgwMiwgMHgwOCwKKwkweGZmLCAweDRlLCAweGM4LCAweDA4LAorCTB4YmYsIDB4NjAsIDB4YzAsIDB4MDgsCisJMHg2MCwgMHgwYiwgMHg4NiwgMHg2OCwKKwkweDQwLCAweDAwLCAweDBjLCAweDY4LAorCTB4MDgsIDB4MWYsIDB4M2UsIDB4MTAsCisJMHg2MCwgMHgwYiwgMHg4NiwgMHg2OCwKKwkweDQwLCAweDAwLCAweDBjLCAweDY4LAorCTB4MDgsIDB4MWYsIDB4M2UsIDB4MTAsCisJMHhmZiwgMHgzZSwgMHg0OCwgMHg2MCwKKwkweDQwLCAweGZhLCAweDEwLCAweDc4LAorCTB4ZmYsIDB4ZjYsIDB4ZDQsIDB4MDgsCisJMHgwMSwgMHg0ZSwgMHg5YywgMHgxOCwKKwkweDQwLCAweDYwLCAweGMwLCAweDAwLAorCTB4MDAsIDB4NGQsIDB4MTAsIDB4NzAsCisJMHgwMSwgMHg0ZSwgMHg5YywgMHgxOCwKKwkweGJmLCAweDYwLCAweGMwLCAweDA4LAorCTB4MDAsIDB4NmEsIDB4ODYsIDB4NWMsCisJMHhmZiwgMHg0ZSwgMHhjOCwgMHgxOCwKKwkweDAyLCAweDZhLCAweDcwLCAweDViLAorCTB4ZmYsIDB4NTIsIDB4MjAsIDB4MDksCisJMHgwZCwgMHg2YSwgMHg2YSwgMHgwMCwKKwkweDAwLCAweDUyLCAweGU2LCAweDViLAorCTB4MDMsIDB4YjAsIDB4NTIsIDB4MzEsCisJMHhmZiwgMHhiMCwgMHg1MiwgMHgwOSwKKwkweGZmLCAweGIxLCAweDU0LCAweDA5LAorCTB4ZmYsIDB4YjIsIDB4NTYsIDB4MDksCisJMHhmZiwgMHhhMywgMHg1MCwgMHgwOSwKKwkweGZmLCAweDNlLCAweDc0LCAweDA5LAorCTB4ZmYsIDB4OTAsIDB4N2MsIDB4MDgsCisJMHhmZiwgMHgzZSwgMHgyMCwgMHgwOSwKKwkweDAwLCAweDY1LCAweDRlLCAweDU4LAorCTB4MDAsIDB4NjUsIDB4MGMsIDB4NDAsCisJMHhmNywgMHgxZiwgMHhjYSwgMHgwOCwKKwkweDA4LCAweGExLCAweGM4LCAweDA4LAorCTB4MDAsIDB4NjUsIDB4Y2EsIDB4MDAsCisJMHhmZiwgMHg2NSwgMHgzZSwgMHgwOCwKKwkweGYwLCAweGExLCAweGM4LCAweDA4LAorCTB4MGYsIDB4MGYsIDB4MWUsIDB4MDgsCisJMHgwMCwgMHgwZiwgMHgxZSwgMHgwMCwKKwkweGYwLCAweGExLCAweGM4LCAweDA4LAorCTB4MGYsIDB4MDUsIDB4MGEsIDB4MDgsCisJMHgwMCwgMHgwNSwgMHgwYSwgMHgwMCwKKwkweGZmLCAweDZhLCAweDBjLCAweDA4LAorCTB4NWEsIDB4NmEsIDB4MDAsIDB4MDQsCisJMHgxMiwgMHg2NSwgMHgwMiwgMHgwMCwKKwkweDMxLCAweDZhLCAweGNhLCAweDAwLAorCTB4ODAsIDB4MzcsIDB4NmUsIDB4NjgsCisJMHhmZiwgMHg2NSwgMHhjYSwgMHgxOCwKKwkweGZmLCAweDM3LCAweGRjLCAweDA4LAorCTB4ZmYsIDB4NmUsIDB4YzgsIDB4MDgsCisJMHgwMCwgMHg2YywgMHg3NiwgMHg3OCwKKwkweDIwLCAweDAxLCAweDAyLCAweDAwLAorCTB4NGMsIDB4MzcsIDB4YzgsIDB4MjgsCisJMHgwOCwgMHgxZiwgMHg3ZSwgMHg3OCwKKwkweDA4LCAweDM3LCAweDZlLCAweDAwLAorCTB4MDgsIDB4NjQsIDB4YzgsIDB4MDAsCisJMHg3MCwgMHg2NCwgMHhjYSwgMHgxOCwKKwkweGZmLCAweDZjLCAweDBhLCAweDA4LAorCTB4MjAsIDB4NjQsIDB4Y2EsIDB4MTgsCisJMHhmZiwgMHg2YywgMHgwOCwgMHgwYywKKwkweDQwLCAweDBiLCAweDk2LCAweDY4LAorCTB4MjAsIDB4NmEsIDB4MTYsIDB4MDAsCisJMHhmMCwgMHgxOSwgMHg2ZSwgMHgwOCwKKwkweDA4LCAweDZhLCAweDE4LCAweDAwLAorCTB4MDgsIDB4MTEsIDB4MjIsIDB4MDAsCisJMHgwOCwgMHg2YSwgMHg2NiwgMHg1OCwKKwkweDA4LCAweDZhLCAweDY4LCAweDAwLAorCTB4MDAsIDB4NjUsIDB4YWEsIDB4NDAsCisJMHgxMiwgMHg2YSwgMHgwMCwgMHgwMCwKKwkweDQwLCAweDZhLCAweDE2LCAweDAwLAorCTB4ZmYsIDB4M2UsIDB4MjAsIDB4MDksCisJMHhmZiwgMHhiYSwgMHg3YywgMHgwOCwKKwkweGZmLCAweGExLCAweDZlLCAweDA4LAorCTB4MDgsIDB4NmEsIDB4MTgsIDB4MDAsCisJMHgwOCwgMHgxMSwgMHgyMiwgMHgwMCwKKwkweDA4LCAweDZhLCAweDY2LCAweDU4LAorCTB4ODAsIDB4NmEsIDB4NjgsIDB4MDAsCisJMHg4MCwgMHgzNiwgMHg2YywgMHgwMCwKKwkweDAwLCAweDY1LCAweGJhLCAweDViLAorCTB4ZmYsIDB4M2QsIDB4YzgsIDB4MDgsCisJMHhiZiwgMHg2NCwgMHhlMiwgMHg3OCwKKwkweDgwLCAweDY0LCAweGM4LCAweDcxLAorCTB4YTAsIDB4NjQsIDB4ZjgsIDB4NzEsCisJMHhjMCwgMHg2NCwgMHhmMCwgMHg3MSwKKwkweGUwLCAweDY0LCAweDM4LCAweDcyLAorCTB4MDEsIDB4NmEsIDB4MjIsIDB4MDEsCisJMHgwMCwgMHg2NSwgMHhhYSwgMHg0MCwKKwkweGY3LCAweDExLCAweDIyLCAweDA4LAorCTB4MDAsIDB4NjUsIDB4Y2EsIDB4NTgsCisJMHhmZiwgMHgwNiwgMHhkNCwgMHgwOCwKKwkweGY3LCAweDAxLCAweDAyLCAweDA4LAorCTB4MDksIDB4MGMsIDB4YzQsIDB4NzgsCisJMHgwOCwgMHgwYywgMHgwYywgMHg2OCwKKwkweDAxLCAweDZhLCAweDIyLCAweDAxLAorCTB4ZmYsIDB4NmEsIDB4MjYsIDB4MDksCisJMHgwMiwgMHg2YSwgMHgwOCwgMHgzMCwKKwkweGZmLCAweDZhLCAweDA4LCAweDA4LAorCTB4ZGYsIDB4MDEsIDB4MDIsIDB4MDgsCisJMHgwMSwgMHg2YSwgMHg3YSwgMHgwMCwKKwkweGZmLCAweDZhLCAweDZjLCAweDBjLAorCTB4MDQsIDB4MTQsIDB4MTAsIDB4MzEsCisJMHgwMywgMHhhOSwgMHgxOCwgMHgzMSwKKwkweDAzLCAweGE5LCAweDEwLCAweDMwLAorCTB4MDgsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHhhOSwgMHg2YSwgMHhkMCwgMHg1YiwKKwkweDAwLCAweDY1LCAweDAyLCAweDQxLAorCTB4YTgsIDB4NmEsIDB4NmEsIDB4MDAsCisJMHg3OSwgMHg2YSwgMHg2YSwgMHgwMCwKKwkweDQwLCAweDNkLCAweGVhLCAweDY4LAorCTB4MDQsIDB4MzUsIDB4NmEsIDB4MDAsCisJMHgwMCwgMHg2NSwgMHgyYSwgMHg1YiwKKwkweDgwLCAweDZhLCAweGQ0LCAweDAxLAorCTB4MTAsIDB4MzYsIDB4ZDYsIDB4NjgsCisJMHgxMCwgMHgzNiwgMHg2YywgMHgwMCwKKwkweDA3LCAweGFjLCAweDEwLCAweDMxLAorCTB4MDUsIDB4YTMsIDB4NzAsIDB4MzAsCisJMHgwMywgMHg4YywgMHgxMCwgMHgzMCwKKwkweDg4LCAweDZhLCAweGNjLCAweDAwLAorCTB4YWMsIDB4NmEsIDB4YzgsIDB4NWIsCisJMHgwMCwgMHg2NSwgMHhjMiwgMHg1YiwKKwkweDM4LCAweDZhLCAweGNjLCAweDAwLAorCTB4YTMsIDB4NmEsIDB4Y2MsIDB4NWIsCisJMHhmZiwgMHgzOCwgMHgxMiwgMHg2OSwKKwkweDgwLCAweDAyLCAweDA0LCAweDAwLAorCTB4ZTcsIDB4MzUsIDB4NmEsIDB4MDgsCisJMHgwMywgMHg2OSwgMHgxOCwgMHgzMSwKKwkweDAzLCAweDY5LCAweDEwLCAweDMwLAorCTB4ZmYsIDB4NmEsIDB4MTAsIDB4MDAsCisJMHhmZiwgMHg2YSwgMHgxMiwgMHgwMCwKKwkweGZmLCAweDZhLCAweDE0LCAweDAwLAorCTB4MjIsIDB4MzgsIDB4YzgsIDB4MjgsCisJMHgwMSwgMHgzOCwgMHgxYywgMHg2MSwKKwkweDAyLCAweDY0LCAweGM4LCAweDAwLAorCTB4MDEsIDB4MzgsIDB4MWMsIDB4NjEsCisJMHhiZiwgMHgzNSwgMHg2YSwgMHgwOCwKKwkweGZmLCAweDY0LCAweGY4LCAweDA5LAorCTB4ZmYsIDB4MzUsIDB4MjYsIDB4MDksCisJMHg4MCwgMHgwMiwgMHhhNCwgMHg2OSwKKwkweDEwLCAweDBjLCAweDdhLCAweDY5LAorCTB4ODAsIDB4OTQsIDB4MjIsIDB4NzksCisJMHgwMCwgMHgzNSwgMHgwYSwgMHg1YiwKKwkweDgwLCAweDAyLCAweGE0LCAweDY5LAorCTB4ZmYsIDB4NjUsIDB4OTQsIDB4NzksCisJMHgwMSwgMHgzOCwgMHg3MCwgMHg3MSwKKwkweGZmLCAweDM4LCAweDcwLCAweDE4LAorCTB4ZmYsIDB4MzgsIDB4OTQsIDB4NzksCisJMHg4MCwgMHhlYSwgMHg0YSwgMHg2MSwKKwkweGVmLCAweDM4LCAweGM4LCAweDE4LAorCTB4ODAsIDB4NmEsIDB4YzgsIDB4MDAsCisJMHgwMCwgMHg2NSwgMHgzYywgMHg0OSwKKwkweDMzLCAweDM4LCAweGM4LCAweDI4LAorCTB4ZmYsIDB4NjQsIDB4ZDAsIDB4MDksCisJMHgwNCwgMHgzOSwgMHhjMCwgMHgzMSwKKwkweDA5LCAweDZhLCAweGQ2LCAweDAxLAorCTB4ODAsIDB4ZWIsIDB4NDIsIDB4NzksCisJMHhmNywgMHhlYiwgMHhkNiwgMHgwOSwKKwkweDA4LCAweGViLCAweDQ2LCAweDY5LAorCTB4MDEsIDB4NmEsIDB4ZDYsIDB4MDEsCisJMHgwOCwgMHhlOSwgMHgxMCwgMHgzMSwKKwkweDAzLCAweDhjLCAweDEwLCAweDMwLAorCTB4ZmYsIDB4MzgsIDB4NzAsIDB4MTgsCisJMHg4OCwgMHg2YSwgMHhjYywgMHgwMCwKKwkweDM5LCAweDZhLCAweGNlLCAweDViLAorCTB4MDgsIDB4NmEsIDB4MTgsIDB4MDEsCisJMHhmZiwgMHg2YSwgMHgxYSwgMHgwOSwKKwkweGZmLCAweDZhLCAweDFjLCAweDA5LAorCTB4MGQsIDB4OTMsIDB4MjYsIDB4MDEsCisJMHgwMCwgMHg2NSwgMHg3OCwgMHg1YywKKwkweDg4LCAweDZhLCAweGNjLCAweDAwLAorCTB4MDAsIDB4NjUsIDB4NmEsIDB4NWMsCisJMHgwMCwgMHg2NSwgMHhjMiwgMHg1YiwKKwkweGZmLCAweDZhLCAweGM4LCAweDA4LAorCTB4MDgsIDB4MzksIDB4NzIsIDB4MTgsCisJMHgwMCwgMHgzYSwgMHg3NCwgMHgyMCwKKwkweDAwLCAweDY1LCAweDAyLCAweDQxLAorCTB4MDEsIDB4MGMsIDB4NmMsIDB4NzksCisJMHgxMCwgMHgwYywgMHgwMiwgMHg3OSwKKwkweDEwLCAweDBjLCAweDdhLCAweDY5LAorCTB4MDEsIDB4ZmMsIDB4NzAsIDB4NzksCisJMHhmZiwgMHg2YSwgMHg3MCwgMHgwOCwKKwkweDAxLCAweDBjLCAweDc2LCAweDc5LAorCTB4MTAsIDB4MGMsIDB4MDIsIDB4NzksCisJMHgwMCwgMHg2NSwgMHhhZSwgMHg1OSwKKwkweDAxLCAweGZjLCAweDk0LCAweDY5LAorCTB4NDAsIDB4MGQsIDB4ODQsIDB4NjksCisJMHhiMSwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweDAwLCAweDY1LCAweDk0LCAweDQxLAorCTB4MmUsIDB4ZmMsIDB4YTIsIDB4MjgsCisJMHgzZiwgMHgzOCwgMHhjOCwgMHgwOCwKKwkweDAwLCAweDUxLCAweDk0LCAweDcxLAorCTB4ZmYsIDB4NmEsIDB4YzgsIDB4MDgsCisJMHhmOCwgMHgzOSwgMHg3MiwgMHgxOCwKKwkweGZmLCAweDNhLCAweDc0LCAweDIwLAorCTB4MDEsIDB4MzgsIDB4NzAsIDB4MTgsCisJMHgwMCwgMHg2NSwgMHg4NiwgMHg0MSwKKwkweDAzLCAweDA4LCAweDUyLCAweDMxLAorCTB4ZmYsIDB4MzgsIDB4NTAsIDB4MDksCisJMHgxMiwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweGZmLCAweDA4LCAweDUyLCAweDA5LAorCTB4ZmYsIDB4MDksIDB4NTQsIDB4MDksCisJMHhmZiwgMHgwYSwgMHg1NiwgMHgwOSwKKwkweGZmLCAweDM4LCAweDUwLCAweDA5LAorCTB4MDAsIDB4NjUsIDB4YWEsIDB4NDAsCisJMHgxMCwgMHgwYywgMHhhNCwgMHg3OSwKKwkweDAwLCAweDY1LCAweGFlLCAweDU5LAorCTB4N2YsIDB4MDIsIDB4MDQsIDB4MDgsCisJMHhlMSwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweDAwLCAweDY1LCAweGFhLCAweDQwLAorCTB4MDQsIDB4OTMsIDB4YzIsIDB4NjksCisJMHhkZiwgMHg5MywgMHgyNiwgMHgwOSwKKwkweDIwLCAweDkzLCAweGIyLCAweDY5LAorCTB4MDIsIDB4OTMsIDB4MjYsIDB4MDEsCisJMHgwMSwgMHg5NCwgMHhiNiwgMHg3OSwKKwkweDAxLCAweDk0LCAweGI2LCAweDc5LAorCTB4MDEsIDB4OTQsIDB4YjYsIDB4NzksCisJMHgwMSwgMHg5NCwgMHhiNiwgMHg3OSwKKwkweDAxLCAweDk0LCAweGI2LCAweDc5LAorCTB4MTAsIDB4OTQsIDB4YzAsIDB4NjksCisJMHhkNywgMHg5MywgMHgyNiwgMHgwOSwKKwkweDI4LCAweDkzLCAweGM0LCAweDY5LAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MGMsCisJMHgwMCwgMHg2NSwgMHgyYSwgMHg1YiwKKwkweDA1LCAweGI0LCAweDEwLCAweDMxLAorCTB4MDIsIDB4NmEsIDB4MWEsIDB4MzEsCisJMHgwMywgMHg4YywgMHgxMCwgMHgzMCwKKwkweDg4LCAweDZhLCAweGNjLCAweDAwLAorCTB4YjQsIDB4NmEsIDB4Y2MsIDB4NWIsCisJMHhmZiwgMHg2YSwgMHgxYSwgMHgwOSwKKwkweGZmLCAweDZhLCAweDFjLCAweDA5LAorCTB4MDAsIDB4NjUsIDB4YzIsIDB4NWIsCisJMHgzZCwgMHg2YSwgMHgwYSwgMHg1YiwKKwkweGFjLCAweDZhLCAweDI2LCAweDAxLAorCTB4MDQsIDB4MGIsIDB4ZGUsIDB4NjksCisJMHgwNCwgMHgwYiwgMHhlNCwgMHg2OSwKKwkweDEwLCAweDBjLCAweGUwLCAweDc5LAorCTB4MDIsIDB4MDMsIDB4ZTgsIDB4NzksCisJMHgxMSwgMHgwYywgMHhlNCwgMHg3OSwKKwkweGQ3LCAweDkzLCAweDI2LCAweDA5LAorCTB4MjgsIDB4OTMsIDB4ZWEsIDB4NjksCisJMHgxMiwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweDAwLCAweDY1LCAweGFhLCAweDQwLAorCTB4MDAsIDB4NjUsIDB4MmEsIDB4NWIsCisJMHhmZiwgMHgwNiwgMHg0NCwgMHgwOSwKKwkweDAwLCAweDY1LCAweGFhLCAweDQwLAorCTB4MTAsIDB4M2QsIDB4MDYsIDB4MDAsCisJMHhmZiwgMHgzNCwgMHhjYSwgMHgwOCwKKwkweDgwLCAweDY1LCAweDFjLCAweDYyLAorCTB4MGYsIDB4YTEsIDB4Y2EsIDB4MDgsCisJMHgwNywgMHhhMSwgMHhjYSwgMHgwOCwKKwkweDQwLCAweGEwLCAweGM4LCAweDA4LAorCTB4MDAsIDB4NjUsIDB4Y2EsIDB4MDAsCisJMHg4MCwgMHg2NSwgMHhjYSwgMHgwMCwKKwkweDgwLCAweGEwLCAweDBjLCAweDdhLAorCTB4ZmYsIDB4NjUsIDB4MGMsIDB4MDgsCisJMHgwMCwgMHg2NSwgMHgxZSwgMHg0MiwKKwkweDIwLCAweGEwLCAweDI0LCAweDdhLAorCTB4ZmYsIDB4NjUsIDB4MGMsIDB4MDgsCisJMHgwMCwgMHg2NSwgMHhiYSwgMHg1YiwKKwkweGEwLCAweDNkLCAweDJjLCAweDYyLAorCTB4MjMsIDB4YTAsIDB4MGMsIDB4MDgsCisJMHgwMCwgMHg2NSwgMHhiYSwgMHg1YiwKKwkweGEwLCAweDNkLCAweDJjLCAweDYyLAorCTB4MDAsIDB4YjksIDB4MjQsIDB4NDIsCisJMHhmZiwgMHg2NSwgMHgyNCwgMHg2MiwKKwkweGExLCAweDZhLCAweDIyLCAweDAxLAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MDgsCisJMHgxMCwgMHg1MSwgMHgyYywgMHg3MiwKKwkweDQwLCAweDZhLCAweDE4LCAweDAwLAorCTB4ZmYsIDB4NjUsIDB4MGMsIDB4MDgsCisJMHgwMCwgMHg2NSwgMHhiYSwgMHg1YiwKKwkweGEwLCAweDNkLCAweGY2LCAweDcxLAorCTB4NDAsIDB4NmEsIDB4MTgsIDB4MDAsCisJMHhmZiwgMHgzNCwgMHhhNiwgMHgwOCwKKwkweDgwLCAweDM0LCAweDM0LCAweDYyLAorCTB4N2YsIDB4YTAsIDB4NDAsIDB4MDksCisJMHgwOCwgMHg2YSwgMHg2OCwgMHgwMCwKKwkweDAwLCAweDY1LCAweGFhLCAweDQwLAorCTB4NjQsIDB4NmEsIDB4MDAsIDB4NWIsCisJMHg4MCwgMHg2NCwgMHhhYSwgMHg2YSwKKwkweDA0LCAweDY0LCAweDhjLCAweDcyLAorCTB4MDIsIDB4NjQsIDB4OTIsIDB4NzIsCisJMHgwMCwgMHg2YSwgMHg1NCwgMHg3MiwKKwkweDAzLCAweDY0LCAweGE2LCAweDcyLAorCTB4MDEsIDB4NjQsIDB4ODgsIDB4NzIsCisJMHgwNywgMHg2NCwgMHhlOCwgMHg3MiwKKwkweDA4LCAweDY0LCAweDUwLCAweDcyLAorCTB4MjMsIDB4NjQsIDB4ZWMsIDB4NzIsCisJMHgxMSwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweDA3LCAweDZhLCAweGYyLCAweDVhLAorCTB4ZmYsIDB4MDYsIDB4ZDQsIDB4MDgsCisJMHgwMCwgMHg2NSwgMHhhYSwgMHg0MCwKKwkweGZmLCAweGE4LCAweDU4LCAweDZhLAorCTB4ZmYsIDB4YTIsIDB4NzAsIDB4N2EsCisJMHgwMSwgMHg2YSwgMHg2YSwgMHgwMCwKKwkweDAwLCAweGI5LCAweGU2LCAweDViLAorCTB4ZmYsIDB4YTIsIDB4NzAsIDB4N2EsCisJMHg3MSwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweGZmLCAweDZhLCAweGQ0LCAweDA4LAorCTB4NDAsIDB4NTEsIDB4NzAsIDB4NjIsCisJMHgwZCwgMHg2YSwgMHg2YSwgMHgwMCwKKwkweDAwLCAweGI5LCAweGU2LCAweDViLAorCTB4ZmYsIDB4M2UsIDB4NzQsIDB4MDksCisJMHhmZiwgMHg5MCwgMHg3YywgMHgwOCwKKwkweDAwLCAweDY1LCAweDRlLCAweDU4LAorCTB4MDAsIDB4NjUsIDB4YmMsIDB4NDAsCisJMHgyMCwgMHhhMCwgMHg3OCwgMHg2YSwKKwkweGZmLCAweDM3LCAweGM4LCAweDA4LAorCTB4MDAsIDB4NmEsIDB4OTAsIDB4NWIsCisJMHhmZiwgMHg2YSwgMHhhNiwgMHg1YiwKKwkweGZmLCAweGY4LCAweGM4LCAweDA4LAorCTB4ZmYsIDB4NGYsIDB4YzgsIDB4MDgsCisJMHgwMSwgMHg2YSwgMHg5MCwgMHg1YiwKKwkweDAwLCAweGI5LCAweGE2LCAweDViLAorCTB4MDEsIDB4NGYsIDB4OWUsIDB4MTgsCisJMHgwMiwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweDAwLCAweDY1LCAweDgwLCAweDVjLAorCTB4MDAsIDB4NjUsIDB4YmMsIDB4NDAsCisJMHg0MSwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweDAwLCAweDY1LCAweGFhLCAweDQwLAorCTB4MDQsIDB4YTAsIDB4NDAsIDB4MDEsCisJMHgwMCwgMHg2NSwgMHg5OCwgMHg1YywKKwkweDAwLCAweDY1LCAweGJjLCAweDQwLAorCTB4MTAsIDB4MzYsIDB4NTAsIDB4N2EsCisJMHgwNSwgMHgzOCwgMHg0NiwgMHgzMSwKKwkweDA0LCAweDE0LCAweDU4LCAweDMxLAorCTB4MDMsIDB4YTksIDB4NjAsIDB4MzEsCisJMHhhMywgMHg2YSwgMHhjYywgMHgwMCwKKwkweDM4LCAweDZhLCAweGNjLCAweDViLAorCTB4YWMsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHgxNCwgMHg2YSwgMHhjZSwgMHg1YiwKKwkweGE5LCAweDZhLCAweGQwLCAweDViLAorCTB4MDAsIDB4NjUsIDB4NTAsIDB4NDIsCisJMHhlZiwgMHgzNiwgMHg2YywgMHgwOCwKKwkweDAwLCAweDY1LCAweDUwLCAweDQyLAorCTB4MGYsIDB4NjQsIDB4YzgsIDB4MDgsCisJMHgwNywgMHg2NCwgMHhjOCwgMHgwOCwKKwkweDAwLCAweDM3LCAweDZlLCAweDAwLAorCTB4ZmYsIDB4NmEsIDB4YTQsIDB4MDAsCisJMHgwMCwgMHg2NSwgMHg2MCwgMHg1YiwKKwkweGZmLCAweDUxLCAweGJjLCAweDcyLAorCTB4MjAsIDB4MzYsIDB4YzYsIDB4N2EsCisJMHgwMCwgMHg5MCwgMHg0ZSwgMHg1YiwKKwkweDAwLCAweDY1LCAweGM4LCAweDQyLAorCTB4ZmYsIDB4MDYsIDB4ZDQsIDB4MDgsCisJMHgwMCwgMHg2NSwgMHhiYSwgMHg1YiwKKwkweGUwLCAweDNkLCAweGUyLCAweDYyLAorCTB4MjAsIDB4MTIsIDB4ZTIsIDB4NjIsCisJMHg1MSwgMHg2YSwgMHhmNiwgMHg1YSwKKwkweDAwLCAweDY1LCAweDQ4LCAweDViLAorCTB4ZmYsIDB4MzcsIDB4YzgsIDB4MDgsCisJMHgwMCwgMHhhMSwgMHhkYSwgMHg2MiwKKwkweDA0LCAweGEwLCAweGRhLCAweDdhLAorCTB4ZmIsIDB4YTAsIDB4NDAsIDB4MDksCisJMHg4MCwgMHgzNiwgMHg2YywgMHgwMCwKKwkweDgwLCAweGEwLCAweDUwLCAweDdhLAorCTB4N2YsIDB4YTAsIDB4NDAsIDB4MDksCisJMHhmZiwgMHg2YSwgMHhmMiwgMHg1YSwKKwkweDAwLCAweDY1LCAweDUwLCAweDQyLAorCTB4MDQsIDB4YTAsIDB4ZTAsIDB4N2EsCisJMHgwMCwgMHg2NSwgMHg5OCwgMHg1YywKKwkweDAwLCAweDY1LCAweGUyLCAweDQyLAorCTB4MDAsIDB4NjUsIDB4ODAsIDB4NWMsCisJMHgzMSwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweDBjLCAweDZhLCAweGYyLCAweDVhLAorCTB4MDAsIDB4NjUsIDB4NTAsIDB4NDIsCisJMHg2MSwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweDAwLCAweDY1LCAweDUwLCAweDQyLAorCTB4NTEsIDB4NmEsIDB4ZjYsIDB4NWEsCisJMHg1MSwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweDAwLCAweDY1LCAweDUwLCAweDQyLAorCTB4MTAsIDB4M2QsIDB4MDYsIDB4MDAsCisJMHhmZiwgMHg2NSwgMHg2OCwgMHgwYywKKwkweGZmLCAweDA2LCAweGQ0LCAweDA4LAorCTB4MDEsIDB4MGMsIDB4ZjgsIDB4N2EsCisJMHgwNCwgMHgwYywgMHhmYSwgMHg2YSwKKwkweGUwLCAweDAzLCAweDdhLCAweDA4LAorCTB4ZTAsIDB4M2QsIDB4MDYsIDB4NjMsCisJMHhmZiwgMHg2NSwgMHhjYywgMHgwOCwKKwkweGZmLCAweDEyLCAweGRhLCAweDBjLAorCTB4ZmYsIDB4MDYsIDB4ZDQsIDB4MGMsCisJMHhkMSwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweDAwLCAweDY1LCAweGFhLCAweDQwLAorCTB4ZmYsIDB4NjUsIDB4MjYsIDB4MDksCisJMHgwMSwgMHgwYiwgMHgxYSwgMHg2YiwKKwkweDEwLCAweDBjLCAweDBjLCAweDdiLAorCTB4MDQsIDB4MGIsIDB4MTQsIDB4NmIsCisJMHhmZiwgMHg2YSwgMHhjYSwgMHgwOCwKKwkweDA0LCAweDkzLCAweDE4LCAweDZiLAorCTB4MDEsIDB4OTQsIDB4MTYsIDB4N2IsCisJMHgxMCwgMHg5NCwgMHgxOCwgMHg2YiwKKwkweDgwLCAweDNkLCAweDFlLCAweDczLAorCTB4MGYsIDB4MDQsIDB4MjIsIDB4NmIsCisJMHgwMiwgMHgwMywgMHgyMiwgMHg3YiwKKwkweDExLCAweDBjLCAweDFlLCAweDdiLAorCTB4YzcsIDB4OTMsIDB4MjYsIDB4MDksCisJMHhmZiwgMHg5OSwgMHhkNCwgMHgwOCwKKwkweDM4LCAweDkzLCAweDI0LCAweDZiLAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MGMsCisJMHg4MCwgMHgzNiwgMHgyOCwgMHg2YiwKKwkweDIxLCAweDZhLCAweDIyLCAweDA1LAorCTB4ZmYsIDB4NjUsIDB4MjAsIDB4MDksCisJMHhmZiwgMHg1MSwgMHgzNiwgMHg2MywKKwkweGZmLCAweDM3LCAweGM4LCAweDA4LAorCTB4YTEsIDB4NmEsIDB4NDIsIDB4NDMsCisJMHhmZiwgMHg1MSwgMHhjOCwgMHgwOCwKKwkweGI5LCAweDZhLCAweDQyLCAweDQzLAorCTB4ZmYsIDB4OTAsIDB4YTQsIDB4MDgsCisJMHhmZiwgMHhiYSwgMHg0NiwgMHg3MywKKwkweGZmLCAweGJhLCAweDIwLCAweDA5LAorCTB4ZmYsIDB4NjUsIDB4Y2EsIDB4MTgsCisJMHgwMCwgMHg2YywgMHgzYSwgMHg2MywKKwkweGZmLCAweDkwLCAweGNhLCAweDBjLAorCTB4ZmYsIDB4NmEsIDB4Y2EsIDB4MDQsCisJMHgyMCwgMHgzNiwgMHg1YSwgMHg3YiwKKwkweDAwLCAweDkwLCAweDJlLCAweDViLAorCTB4ZmYsIDB4NjUsIDB4NWEsIDB4NzMsCisJMHhmZiwgMHg1MiwgMHg1OCwgMHg3MywKKwkweGZmLCAweGJhLCAweGNjLCAweDA4LAorCTB4ZmYsIDB4NTIsIDB4MjAsIDB4MDksCisJMHhmZiwgMHg2NiwgMHg3NCwgMHgwOSwKKwkweGZmLCAweDY1LCAweDIwLCAweDBkLAorCTB4ZmYsIDB4YmEsIDB4N2UsIDB4MGMsCisJMHgwMCwgMHg2YSwgMHg4NiwgMHg1YywKKwkweDBkLCAweDZhLCAweDZhLCAweDAwLAorCTB4MDAsIDB4NTEsIDB4ZTYsIDB4NDMsCisJMHhmZiwgMHgzZiwgMHhiNCwgMHg3MywKKwkweGZmLCAweDZhLCAweGEyLCAweDAwLAorCTB4MDAsIDB4M2YsIDB4MmUsIDB4NWIsCisJMHhmZiwgMHg2NSwgMHhiNCwgMHg3MywKKwkweDIwLCAweDM2LCAweDZjLCAweDAwLAorCTB4MjAsIDB4YTAsIDB4NmUsIDB4NmIsCisJMHhmZiwgMHhiOSwgMHhhMiwgMHgwYywKKwkweGZmLCAweDZhLCAweGEyLCAweDA0LAorCTB4ZmYsIDB4NjUsIDB4YTQsIDB4MDgsCisJMHhlMCwgMHg2YSwgMHhjYywgMHgwMCwKKwkweDQ1LCAweDZhLCAweGRhLCAweDViLAorCTB4MDEsIDB4NmEsIDB4ZDAsIDB4MDEsCisJMHgwOSwgMHg2YSwgMHhkNiwgMHgwMSwKKwkweDgwLCAweGViLCAweDdhLCAweDdiLAorCTB4MDEsIDB4NmEsIDB4ZDYsIDB4MDEsCisJMHgwMSwgMHhlOSwgMHhhNCwgMHgzNCwKKwkweDg4LCAweDZhLCAweGNjLCAweDAwLAorCTB4NDUsIDB4NmEsIDB4ZGEsIDB4NWIsCisJMHgwMSwgMHg2YSwgMHgxOCwgMHgwMSwKKwkweGZmLCAweDZhLCAweDFhLCAweDA5LAorCTB4ZmYsIDB4NmEsIDB4MWMsIDB4MDksCisJMHgwZCwgMHg2YSwgMHgyNiwgMHgwMSwKKwkweDAwLCAweDY1LCAweDc4LCAweDVjLAorCTB4ZmYsIDB4OTksIDB4YTQsIDB4MGMsCisJMHhmZiwgMHg2NSwgMHhhNCwgMHgwOCwKKwkweGUwLCAweDZhLCAweGNjLCAweDAwLAorCTB4NDUsIDB4NmEsIDB4ZGEsIDB4NWIsCisJMHgwMSwgMHg2YSwgMHhkMCwgMHgwMSwKKwkweDAxLCAweDZhLCAweGRjLCAweDA1LAorCTB4ODgsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHg0NSwgMHg2YSwgMHhkYSwgMHg1YiwKKwkweDAxLCAweDZhLCAweDE4LCAweDAxLAorCTB4ZmYsIDB4NmEsIDB4MWEsIDB4MDksCisJMHhmZiwgMHg2YSwgMHgxYywgMHgwOSwKKwkweDAxLCAweDZhLCAweDI2LCAweDA1LAorCTB4MDEsIDB4NjUsIDB4ZDgsIDB4MzEsCisJMHgwOSwgMHhlZSwgMHhkYywgMHgwMSwKKwkweDgwLCAweGVlLCAweGFhLCAweDdiLAorCTB4ZmYsIDB4NmEsIDB4ZGMsIDB4MGQsCisJMHhmZiwgMHg2NSwgMHgzMiwgMHgwOSwKKwkweDBhLCAweDkzLCAweDI2LCAweDAxLAorCTB4MDAsIDB4NjUsIDB4NzgsIDB4NDQsCisJMHhmZiwgMHgzNywgMHhjOCwgMHgwOCwKKwkweDAwLCAweDZhLCAweDcwLCAweDViLAorCTB4ZmYsIDB4NTIsIDB4YTIsIDB4MGMsCisJMHgwMSwgMHgwYywgMHhiYSwgMHg3YiwKKwkweDA0LCAweDBjLCAweGJhLCAweDZiLAorCTB4ZTAsIDB4MDMsIDB4MDYsIDB4MDgsCisJMHhlMCwgMHgwMywgMHg3YSwgMHgwYywKKwkweGZmLCAweDhjLCAweDEwLCAweDA4LAorCTB4ZmYsIDB4OGQsIDB4MTIsIDB4MDgsCisJMHhmZiwgMHg4ZSwgMHgxNCwgMHgwYywKKwkweGZmLCAweDZjLCAweGRhLCAweDA4LAorCTB4ZmYsIDB4NmMsIDB4ZGEsIDB4MDgsCisJMHhmZiwgMHg2YywgMHhkYSwgMHgwOCwKKwkweGZmLCAweDZjLCAweGRhLCAweDA4LAorCTB4ZmYsIDB4NmMsIDB4ZGEsIDB4MDgsCisJMHhmZiwgMHg2YywgMHhkYSwgMHgwOCwKKwkweGZmLCAweDZjLCAweGRhLCAweDBjLAorCTB4M2QsIDB4NjQsIDB4YTQsIDB4MjgsCisJMHg1NSwgMHg2NCwgMHhjOCwgMHgyOCwKKwkweDAwLCAweDZjLCAweGRhLCAweDE4LAorCTB4ZmYsIDB4NTIsIDB4YzgsIDB4MDgsCisJMHgwMCwgMHg2YywgMHhkYSwgMHgyMCwKKwkweGZmLCAweDZhLCAweGM4LCAweDA4LAorCTB4MDAsIDB4NmMsIDB4ZGEsIDB4MjAsCisJMHgwMCwgMHg2YywgMHhkYSwgMHgyNCwKKwkweGZmLCAweDY1LCAweGM4LCAweDA4LAorCTB4ZTAsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHg0MSwgMHg2YSwgMHhkNiwgMHg1YiwKKwkweGZmLCAweDkwLCAweGUyLCAweDA5LAorCTB4MjAsIDB4NmEsIDB4ZDAsIDB4MDEsCisJMHgwNCwgMHgzNSwgMHhmOCwgMHg3YiwKKwkweDFkLCAweDZhLCAweGRjLCAweDAxLAorCTB4ZGMsIDB4ZWUsIDB4ZjQsIDB4NjMsCisJMHgwMCwgMHg2NSwgMHgwZSwgMHg0NCwKKwkweDAxLCAweDZhLCAweGRjLCAweDAxLAorCTB4MjAsIDB4YTAsIDB4ZDgsIDB4MzEsCisJMHgwOSwgMHhlZSwgMHhkYywgMHgwMSwKKwkweDgwLCAweGVlLCAweGZlLCAweDdiLAorCTB4MTEsIDB4NmEsIDB4ZGMsIDB4MDEsCisJMHg1MCwgMHhlZSwgMHgwMiwgMHg2NCwKKwkweDIwLCAweDZhLCAweGQwLCAweDAxLAorCTB4MDksIDB4NmEsIDB4ZGMsIDB4MDEsCisJMHg4OCwgMHhlZSwgMHgwOCwgMHg2NCwKKwkweDE5LCAweDZhLCAweGRjLCAweDAxLAorCTB4ZDgsIDB4ZWUsIDB4MGMsIDB4NjQsCisJMHhmZiwgMHg2YSwgMHhkYywgMHgwOSwKKwkweDE4LCAweGVlLCAweDEwLCAweDZjLAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MGMsCisJMHg4OCwgMHg2YSwgMHhjYywgMHgwMCwKKwkweDQxLCAweDZhLCAweGQ2LCAweDViLAorCTB4MjAsIDB4NmEsIDB4MTgsIDB4MDEsCisJMHhmZiwgMHg2YSwgMHgxYSwgMHgwOSwKKwkweGZmLCAweDZhLCAweDFjLCAweDA5LAorCTB4ZmYsIDB4MzUsIDB4MjYsIDB4MDksCisJMHgwNCwgMHgzNSwgMHgzYywgMHg2YywKKwkweGEwLCAweDZhLCAweGNhLCAweDAwLAorCTB4MjAsIDB4NjUsIDB4YzgsIDB4MTgsCisJMHhmZiwgMHg2YywgMHgzMiwgMHgwOSwKKwkweGZmLCAweDZjLCAweDMyLCAweDA5LAorCTB4ZmYsIDB4NmMsIDB4MzIsIDB4MDksCisJMHhmZiwgMHg2YywgMHgzMiwgMHgwOSwKKwkweGZmLCAweDZjLCAweDMyLCAweDA5LAorCTB4ZmYsIDB4NmMsIDB4MzIsIDB4MDksCisJMHhmZiwgMHg2YywgMHgzMiwgMHgwOSwKKwkweGZmLCAweDZjLCAweDMyLCAweDA5LAorCTB4MDAsIDB4NjUsIDB4MjYsIDB4NjQsCisJMHgwYSwgMHg5MywgMHgyNiwgMHgwMSwKKwkweDAwLCAweDY1LCAweDc4LCAweDQ0LAorCTB4YTAsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHhlOCwgMHg2YSwgMHhjOCwgMHgwMCwKKwkweDAxLCAweDk0LCAweDQwLCAweDZjLAorCTB4MTAsIDB4OTQsIDB4NDIsIDB4NmMsCisJMHgwOCwgMHg5NCwgMHg1NCwgMHg2YywKKwkweDA4LCAweDk0LCAweDU0LCAweDZjLAorCTB4MDgsIDB4OTQsIDB4NTQsIDB4NmMsCisJMHgwMCwgMHg2NSwgMHg2OCwgMHg1YywKKwkweDA4LCAweDY0LCAweGM4LCAweDE4LAorCTB4MDAsIDB4OGMsIDB4Y2EsIDB4MTgsCisJMHgwMCwgMHg2NSwgMHg0YSwgMHg0YywKKwkweDAwLCAweDY1LCAweDQwLCAweDQ0LAorCTB4ZjcsIDB4OTMsIDB4MjYsIDB4MDksCisJMHgwOCwgMHg5MywgMHg1NiwgMHg2YywKKwkweDAwLCAweDY1LCAweDY4LCAweDVjLAorCTB4MDgsIDB4NjQsIDB4YzgsIDB4MTgsCisJMHgwOCwgMHg2NCwgMHg1OCwgMHg2NCwKKwkweGZmLCAweDZhLCAweGQ0LCAweDBjLAorCTB4MDAsIDB4NjUsIDB4NzgsIDB4NWMsCisJMHgwMCwgMHg2NSwgMHg2OCwgMHg1YywKKwkweDAwLCAweDY1LCAweDY4LCAweDVjLAorCTB4MDAsIDB4NjUsIDB4NjgsIDB4NWMsCisJMHhmZiwgMHg5OSwgMHhkYSwgMHgwOCwKKwkweGZmLCAweDk5LCAweGRhLCAweDA4LAorCTB4ZmYsIDB4OTksIDB4ZGEsIDB4MDgsCisJMHhmZiwgMHg5OSwgMHhkYSwgMHgwOCwKKwkweGZmLCAweDk5LCAweGRhLCAweDA4LAorCTB4ZmYsIDB4OTksIDB4ZGEsIDB4MDgsCisJMHhmZiwgMHg5OSwgMHhkYSwgMHgwOCwKKwkweGZmLCAweDk5LCAweGRhLCAweDBjLAorCTB4MDgsIDB4OTQsIDB4NzgsIDB4N2MsCisJMHhmNywgMHg5MywgMHgyNiwgMHgwOSwKKwkweDA4LCAweDkzLCAweDdjLCAweDZjLAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MGMsCisJMHhmZiwgMHg0MCwgMHg3NCwgMHgwOSwKKwkweGZmLCAweDkwLCAweDgwLCAweDA4LAorCTB4ZmYsIDB4NmEsIDB4NzIsIDB4MDUsCisJMHhmZiwgMHg0MCwgMHg5NCwgMHg2NCwKKwkweGZmLCAweDNmLCAweDhjLCAweDY0LAorCTB4ZmYsIDB4NmEsIDB4Y2EsIDB4MDQsCisJMHhmZiwgMHgzZiwgMHgyMCwgMHgwOSwKKwkweDAxLCAweDZhLCAweDZhLCAweDAwLAorCTB4MDAsIDB4YjksIDB4ZTYsIDB4NWIsCisJMHhmZiwgMHhiYSwgMHg3ZSwgMHgwYywKKwkweGZmLCAweDQwLCAweDIwLCAweDA5LAorCTB4ZmYsIDB4YmEsIDB4ODAsIDB4MGMsCisJMHhmZiwgMHgzZiwgMHg3NCwgMHgwOSwKKwkweGZmLCAweDkwLCAweDdlLCAweDBjLAorfTsKKworc3RhdGljIGludCBhaWM3eHh4X3BhdGNoMTVfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKTsKKworc3RhdGljIGludAorYWljN3h4eF9wYXRjaDE1X2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKwlyZXR1cm4gKChwLT5idWdzICYgQUhDX0JVR19TQ0JDSEFOX1VQTE9BRCkgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYWljN3h4eF9wYXRjaDE0X2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCk7CisKK3N0YXRpYyBpbnQKK2FpYzd4eHhfcGF0Y2gxNF9mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisJcmV0dXJuICgocC0+YnVncyAmIEFIQ19CVUdfUENJXzJfMV9SRVRSWSkgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYWljN3h4eF9wYXRjaDEzX2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCk7CisKK3N0YXRpYyBpbnQKK2FpYzd4eHhfcGF0Y2gxM19mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisJcmV0dXJuICgocC0+ZmVhdHVyZXMgJiBBSENfV0lERSkgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYWljN3h4eF9wYXRjaDEyX2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCk7CisKK3N0YXRpYyBpbnQKK2FpYzd4eHhfcGF0Y2gxMl9mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisJcmV0dXJuICgocC0+YnVncyAmIEFIQ19CVUdfQVVUT0ZMVVNIKSAhPSAwKTsKK30KKworc3RhdGljIGludCBhaWM3eHh4X3BhdGNoMTFfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKTsKKworc3RhdGljIGludAorYWljN3h4eF9wYXRjaDExX2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKwlyZXR1cm4gKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID09IDApOworfQorCitzdGF0aWMgaW50IGFpYzd4eHhfcGF0Y2gxMF9mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApOworCitzdGF0aWMgaW50CithaWM3eHh4X3BhdGNoMTBfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKQoreworCXJldHVybiAoKHAtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSA9PSAwKTsKK30KKworc3RhdGljIGludCBhaWM3eHh4X3BhdGNoOV9mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApOworCitzdGF0aWMgaW50CithaWM3eHh4X3BhdGNoOV9mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisJcmV0dXJuICgocC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykgPT0gQUhDX0FJQzc4OTUpOworfQorCitzdGF0aWMgaW50IGFpYzd4eHhfcGF0Y2g4X2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCk7CisKK3N0YXRpYyBpbnQKK2FpYzd4eHhfcGF0Y2g4X2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKwlyZXR1cm4gKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQSkgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYWljN3h4eF9wYXRjaDdfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKTsKKworc3RhdGljIGludAorYWljN3h4eF9wYXRjaDdfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKQoreworCXJldHVybiAoKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYWljN3h4eF9wYXRjaDZfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKTsKKworc3RhdGljIGludAorYWljN3h4eF9wYXRjaDZfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKQoreworCXJldHVybiAoKHAtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSA9PSAwKTsKK30KKworc3RhdGljIGludCBhaWM3eHh4X3BhdGNoNV9mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApOworCitzdGF0aWMgaW50CithaWM3eHh4X3BhdGNoNV9mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisJcmV0dXJuICgocC0+ZmxhZ3MgJiBBSENfUEFHRVNDQlMpICE9IDApOworfQorCitzdGF0aWMgaW50IGFpYzd4eHhfcGF0Y2g0X2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCk7CisKK3N0YXRpYyBpbnQKK2FpYzd4eHhfcGF0Y2g0X2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKwlyZXR1cm4gKChwLT5mZWF0dXJlcyAmIEFIQ19RVUVVRV9SRUdTKSAhPSAwKTsKK30KKworc3RhdGljIGludCBhaWM3eHh4X3BhdGNoM19mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApOworCitzdGF0aWMgaW50CithaWM3eHh4X3BhdGNoM19mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisJcmV0dXJuICgocC0+ZmVhdHVyZXMgJiBBSENfVFdJTikgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYWljN3h4eF9wYXRjaDJfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKTsKKworc3RhdGljIGludAorYWljN3h4eF9wYXRjaDJfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKQoreworCXJldHVybiAoKHAtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpID09IDApOworfQorCitzdGF0aWMgaW50IGFpYzd4eHhfcGF0Y2gxX2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCk7CisKK3N0YXRpYyBpbnQKK2FpYzd4eHhfcGF0Y2gxX2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKwlyZXR1cm4gKChwLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYWljN3h4eF9wYXRjaDBfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKTsKKworc3RhdGljIGludAorYWljN3h4eF9wYXRjaDBfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKQoreworCXJldHVybiAoMCk7Cit9CisKK3N0cnVjdCBzZXF1ZW5jZXJfcGF0Y2ggeworCWludAkJKCpwYXRjaF9mdW5jKShzdHJ1Y3QgYWljN3h4eF9ob3N0ICopOworCXVuc2lnbmVkIGludAliZWdpbgkgICA6MTAsCisJCQlza2lwX2luc3RyIDoxMCwKKwkJCXNraXBfcGF0Y2ggOjEyOworfSBzZXF1ZW5jZXJfcGF0Y2hlc1tdID0geworCXsgYWljN3h4eF9wYXRjaDFfZnVuYywgMywgMiwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDJfZnVuYywgNywgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDJfZnVuYywgOCwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDNfZnVuYywgMTEsIDQsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g0X2Z1bmMsIDE2LCAzLCAyIH0sCisJeyBhaWM3eHh4X3BhdGNoMF9mdW5jLCAxOSwgNCwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDVfZnVuYywgMjMsIDEsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g2X2Z1bmMsIDI2LCAxLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoMV9mdW5jLCAyOSwgMSwgMiB9LAorCXsgYWljN3h4eF9wYXRjaDBfZnVuYywgMzAsIDMsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gzX2Z1bmMsIDM5LCA0LCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoN19mdW5jLCA0MywgMywgMiB9LAorCXsgYWljN3h4eF9wYXRjaDBfZnVuYywgNDYsIDMsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g4X2Z1bmMsIDUyLCA3LCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoM19mdW5jLCA2MCwgMywgMSB9LAorCXsgYWljN3h4eF9wYXRjaDdfZnVuYywgNjMsIDIsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g3X2Z1bmMsIDEwMiwgMSwgMiB9LAorCXsgYWljN3h4eF9wYXRjaDBfZnVuYywgMTAzLCAyLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoN19mdW5jLCAxMDcsIDIsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g5X2Z1bmMsIDEwOSwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDEwX2Z1bmMsIDExMCwgMiwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDdfZnVuYywgMTEzLCAxLCAyIH0sCisJeyBhaWM3eHh4X3BhdGNoMF9mdW5jLCAxMTQsIDEsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gxX2Z1bmMsIDExOCwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDFfZnVuYywgMTIxLCAzLCAzIH0sCisJeyBhaWM3eHh4X3BhdGNoMTFfZnVuYywgMTIzLCAxLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoMF9mdW5jLCAxMjQsIDUsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g3X2Z1bmMsIDEzMiwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDlfZnVuYywgMTMzLCAxLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoMTBfZnVuYywgMTM0LCAzLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoN19mdW5jLCAxMzcsIDMsIDIgfSwKKwl7IGFpYzd4eHhfcGF0Y2gwX2Z1bmMsIDE0MCwgMiwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDdfZnVuYywgMTQyLCA1LCAyIH0sCisJeyBhaWM3eHh4X3BhdGNoMF9mdW5jLCAxNDcsIDMsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g3X2Z1bmMsIDE1MCwgMSwgMiB9LAorCXsgYWljN3h4eF9wYXRjaDBfZnVuYywgMTUxLCAyLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoMV9mdW5jLCAxNTMsIDE1LCA0IH0sCisJeyBhaWM3eHh4X3BhdGNoMTFfZnVuYywgMTY2LCAxLCAyIH0sCisJeyBhaWM3eHh4X3BhdGNoMF9mdW5jLCAxNjcsIDEsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gwX2Z1bmMsIDE2OCwgMTAsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g3X2Z1bmMsIDE4MSwgMSwgMiB9LAorCXsgYWljN3h4eF9wYXRjaDBfZnVuYywgMTgyLCAyLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoN19mdW5jLCAxODQsIDE4LCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoMV9mdW5jLCAyMDIsIDMsIDMgfSwKKwl7IGFpYzd4eHhfcGF0Y2g3X2Z1bmMsIDIwNCwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDBfZnVuYywgMjA1LCA0LCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoN19mdW5jLCAyMTAsIDIsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g3X2Z1bmMsIDIxNSwgMTMsIDMgfSwKKwl7IGFpYzd4eHhfcGF0Y2gxMl9mdW5jLCAyMTgsIDEsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gxMl9mdW5jLCAyMTksIDQsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gxX2Z1bmMsIDIyOSwgMywgMyB9LAorCXsgYWljN3h4eF9wYXRjaDExX2Z1bmMsIDIzMSwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDBfZnVuYywgMjMyLCA1LCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoMTFfZnVuYywgMjM3LCAxLCAyIH0sCisJeyBhaWM3eHh4X3BhdGNoMF9mdW5jLCAyMzgsIDksIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gxM19mdW5jLCAyNTQsIDEsIDIgfSwKKwl7IGFpYzd4eHhfcGF0Y2gwX2Z1bmMsIDI1NSwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDRfZnVuYywgMzE2LCAxLCAyIH0sCisJeyBhaWM3eHh4X3BhdGNoMF9mdW5jLCAzMTcsIDEsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gyX2Z1bmMsIDMyMCwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDFfZnVuYywgMzMwLCAzLCAyIH0sCisJeyBhaWM3eHh4X3BhdGNoMF9mdW5jLCAzMzMsIDUsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gxM19mdW5jLCAzNDEsIDEsIDIgfSwKKwl7IGFpYzd4eHhfcGF0Y2gwX2Z1bmMsIDM0MiwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDVfZnVuYywgMzQ3LCAxLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoMTFfZnVuYywgMzg5LCAxNSwgMiB9LAorCXsgYWljN3h4eF9wYXRjaDE0X2Z1bmMsIDQwMiwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDFfZnVuYywgNDQxLCA3LCAyIH0sCisJeyBhaWM3eHh4X3BhdGNoMF9mdW5jLCA0NDgsIDgsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gxX2Z1bmMsIDQ1NywgNCwgMiB9LAorCXsgYWljN3h4eF9wYXRjaDBfZnVuYywgNDYxLCA2LCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoMV9mdW5jLCA0NjcsIDQsIDIgfSwKKwl7IGFpYzd4eHhfcGF0Y2gwX2Z1bmMsIDQ3MSwgMywgMSB9LAorCXsgYWljN3h4eF9wYXRjaDEwX2Z1bmMsIDQ4MSwgMTAsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gxX2Z1bmMsIDUwMCwgMjIsIDUgfSwKKwl7IGFpYzd4eHhfcGF0Y2gxMV9mdW5jLCA1MDgsIDQsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g3X2Z1bmMsIDUxMiwgNywgMyB9LAorCXsgYWljN3h4eF9wYXRjaDE1X2Z1bmMsIDUxMiwgNSwgMiB9LAorCXsgYWljN3h4eF9wYXRjaDBfZnVuYywgNTE3LCAyLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoMTBfZnVuYywgNTIyLCA1MCwgMyB9LAorCXsgYWljN3h4eF9wYXRjaDE0X2Z1bmMsIDU0MywgMTcsIDIgfSwKKwl7IGFpYzd4eHhfcGF0Y2gwX2Z1bmMsIDU2MCwgNCwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDEwX2Z1bmMsIDU3MiwgNCwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDVfZnVuYywgNTc2LCAyLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoNV9mdW5jLCA1NzksIDksIDEgfSwKKworfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC9zY3NpX21lc3NhZ2UuaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC9zY3NpX21lc3NhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzlmODljCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL3Njc2lfbWVzc2FnZS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIE1lc3NhZ2VzICgxIGJ5dGUpICovCQkgICAgIC8qIEkvVCAoTSlhbmRhdG9yeSBvciAoTylwdGlvbmFsICovCisjZGVmaW5lIE1TR19DTURDT01QTEVURQkJMHgwMCAvKiBNL00gKi8KKyNkZWZpbmUgTVNHX0VYVEVOREVECQkweDAxIC8qIE8vTyAqLworI2RlZmluZSBNU0dfU0FWRURBVEFQT0lOVEVSCTB4MDIgLyogTy9PICovCisjZGVmaW5lIE1TR19SRVNUT1JFUE9JTlRFUlMJMHgwMyAvKiBPL08gKi8KKyNkZWZpbmUgTVNHX0RJU0NPTk5FQ1QJCTB4MDQgLyogTy9PICovCisjZGVmaW5lIE1TR19JTklUSUFUT1JfREVUX0VSUgkweDA1IC8qIE0vTSAqLworI2RlZmluZSBNU0dfQUJPUlQJCTB4MDYgLyogTy9NICovCisjZGVmaW5lIE1TR19NRVNTQUdFX1JFSkVDVAkweDA3IC8qIE0vTSAqLworI2RlZmluZSBNU0dfTk9PUAkJMHgwOCAvKiBNL00gKi8KKyNkZWZpbmUgTVNHX1BBUklUWV9FUlJPUgkweDA5IC8qIE0vTSAqLworI2RlZmluZSBNU0dfTElOS19DTURfQ09NUExFVEUJMHgwYSAvKiBPL08gKi8KKyNkZWZpbmUgTVNHX0xJTktfQ01EX0NPTVBMRVRFRgkweDBiIC8qIE8vTyAqLworI2RlZmluZSBNU0dfQlVTX0RFVl9SRVNFVAkweDBjIC8qIE8vTSAqLworI2RlZmluZSBNU0dfQUJPUlRfVEFHCQkweDBkIC8qIE8vTyAqLworI2RlZmluZSBNU0dfQ0xFQVJfUVVFVUUJCTB4MGUgLyogTy9PICovCisjZGVmaW5lIE1TR19JTklUX1JFQ09WRVJZCTB4MGYgLyogTy9PICovCisjZGVmaW5lIE1TR19SRUxfUkVDT1ZFUlkJMHgxMCAvKiBPL08gKi8KKyNkZWZpbmUgTVNHX1RFUk1fSU9fUFJPQwkweDExIC8qIE8vTyAqLworCisvKiBNZXNzYWdlcyAoMiBieXRlKSAqLworI2RlZmluZSBNU0dfU0lNUExFX1FfVEFHCTB4MjAgLyogTy9PICovCisjZGVmaW5lIE1TR19IRUFEX09GX1FfVEFHCTB4MjEgLyogTy9PICovCisjZGVmaW5lIE1TR19PUkRFUkVEX1FfVEFHCTB4MjIgLyogTy9PICovCisjZGVmaW5lIE1TR19JR05fV0lERV9SRVNJRFVFCTB4MjMgLyogTy9PICovCisKKy8qIElkZW50aWZ5IG1lc3NhZ2UgKi8JCSAgICAgLyogTS9NICovCQorI2RlZmluZSBNU0dfSURFTlRJRllGTEFHCTB4ODAgCisjZGVmaW5lIE1TR19JREVOVElGWV9ESVNDRkxBRwkweDQwIAorI2RlZmluZSBNU0dfSURFTlRJRlkobHVuLCBkaXNjKQkoKChkaXNjKSA/IDB4YzAgOiBNU0dfSURFTlRJRllGTEFHKSB8IChsdW4pKQorI2RlZmluZSBNU0dfSVNJREVOVElGWShtKQkoKG0pICYgTVNHX0lERU5USUZZRkxBRykKKworLyogRXh0ZW5kZWQgbWVzc2FnZXMgKG9wY29kZSBhbmQgbGVuZ3RoKSAqLworI2RlZmluZSBNU0dfRVhUX1NEVFIJCTB4MDEKKyNkZWZpbmUgTVNHX0VYVF9TRFRSX0xFTgkweDAzCisKKyNkZWZpbmUgTVNHX0VYVF9XRFRSCQkweDAzCisjZGVmaW5lIE1TR19FWFRfV0RUUl9MRU4JMHgwMgorI2RlZmluZSBNU0dfRVhUX1dEVFJfQlVTXzhfQklUCTB4MDAKKyNkZWZpbmUgTVNHX0VYVF9XRFRSX0JVU18xNl9CSVQJMHgwMQorI2RlZmluZSBNU0dfRVhUX1dEVFJfQlVTXzMyX0JJVAkweDAyCisKKyNkZWZpbmUgTVNHX0VYVF9QUFIgICAgIDB4MDQKKyNkZWZpbmUgTVNHX0VYVF9QUFJfTEVOCTB4MDYKKyNkZWZpbmUgTVNHX0VYVF9QUFJfT1BUSU9OX1NUIDB4MDAKKyNkZWZpbmUgTVNHX0VYVF9QUFJfT1BUSU9OX0RUX0NSQyAweDAyCisjZGVmaW5lIE1TR19FWFRfUFBSX09QVElPTl9EVF9VTklUUyAweDAzCisjZGVmaW5lIE1TR19FWFRfUFBSX09QVElPTl9EVF9DUkNfUVVJQ0sgMHgwNAorI2RlZmluZSBNU0dfRVhUX1BQUl9PUFRJT05fRFRfVU5JVFNfUVVJQ0sgMHgwNQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL3NlcXVlbmNlci5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL3NlcXVlbmNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNjY4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQvc2VxdWVuY2VyLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBJbnN0cnVjdGlvbiBmb3JtYXRzIGZvciB0aGUgc2VxdWVuY2VyIHByb2dyYW0gZG93bmxvYWRlZCB0bworICogQWljN3h4eCBTQ1NJIGhvc3QgYWRhcHRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTggSnVzdGluIFQuIEdpYmJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGltbWVkaWF0ZWx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgKiAyLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFdoZXJlIHRoaXMgU29mdHdhcmUgaXMgY29tYmluZWQgd2l0aCBzb2Z0d2FyZSByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhbmQgdGhlIHRlcm1zIG9mIHRoZSBHUEwgd291bGQgcmVxdWlyZSB0aGUgCisgKiBjb21iaW5lZCB3b3JrIHRvIGFsc28gYmUgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwsIHRoZSB0ZXJtcworICogYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlIHdpbGwgYXBwbHkgaW4gYWRkaXRpb24gdG8gdGhvc2Ugb2YgdGhlCisgKiBHUEwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFueSB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSB0aGF0CisgKiBjb25mbGljdCB3aXRoLCBvciBhcmUgZXhwcmVzc2x5IHByb2hpYml0ZWQgYnksIHRoZSBHUEwuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAgICAgICRJZDogc2VxdWVuY2VyLmgsdiAxLjMgMTk5Ny8wOS8yNyAxOTozNzozMSBnaWJicyBFeHAgJAorICovCisKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKK3N0cnVjdCBpbnNfZm9ybWF0MSB7CisJdW5zaWduZWQgaW50CisJCQlpbW1lZGlhdGUJOiA4LAorCQkJc291cmNlCQk6IDksCisJCQlkZXN0aW5hdGlvbgk6IDksCisJCQlyZXQJCTogMSwKKwkJCW9wY29kZQkJOiA0LAorCQkJcGFyaXR5CQk6IDE7Cit9OworCitzdHJ1Y3QgaW5zX2Zvcm1hdDIgeworCXVuc2lnbmVkIGludAorCQkJc2hpZnRfY29udHJvbAk6IDgsCisJCQlzb3VyY2UJCTogOSwKKwkJCWRlc3RpbmF0aW9uCTogOSwKKwkJCXJldAkJOiAxLAorCQkJb3Bjb2RlCQk6IDQsCisJCQlwYXJpdHkJCTogMTsKK307CisKK3N0cnVjdCBpbnNfZm9ybWF0MyB7CisJdW5zaWduZWQgaW50CisJCQlpbW1lZGlhdGUJOiA4LAorCQkJc291cmNlCQk6IDksCisJCQlhZGRyZXNzCQk6IDEwLAorCQkJb3Bjb2RlCQk6IDQsCisJCQlwYXJpdHkJCTogMTsKK307CisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKK3N0cnVjdCBpbnNfZm9ybWF0MSB7CisJdW5zaWduZWQgaW50CisJCQlwYXJpdHkJCTogMSwKKwkJCW9wY29kZQkJOiA0LAorCQkJcmV0CQk6IDEsCisJCQlkZXN0aW5hdGlvbgk6IDksCisJCQlzb3VyY2UJCTogOSwKKwkJCWltbWVkaWF0ZQk6IDg7Cit9OworCitzdHJ1Y3QgaW5zX2Zvcm1hdDIgeworCXVuc2lnbmVkIGludAorCQkJcGFyaXR5CQk6IDEsCisJCQlvcGNvZGUJCTogNCwKKwkJCXJldAkJOiAxLAorCQkJZGVzdGluYXRpb24JOiA5LAorCQkJc291cmNlCQk6IDksCisJCQlzaGlmdF9jb250cm9sCTogODsKK307CisKK3N0cnVjdCBpbnNfZm9ybWF0MyB7CisJdW5zaWduZWQgaW50CisJCQlwYXJpdHkJCTogMSwKKwkJCW9wY29kZQkJOiA0LAorCQkJYWRkcmVzcwkJOiAxMCwKKwkJCXNvdXJjZQkJOiA5LAorCQkJaW1tZWRpYXRlCTogODsKK307CisjZW5kaWYKKwordW5pb24gaW5zX2Zvcm1hdHMgeworCQlzdHJ1Y3QgaW5zX2Zvcm1hdDEgZm9ybWF0MTsKKwkJc3RydWN0IGluc19mb3JtYXQyIGZvcm1hdDI7CisJCXN0cnVjdCBpbnNfZm9ybWF0MyBmb3JtYXQzOworCQl1bnNpZ25lZCBjaGFyCSAgIGJ5dGVzWzRdOworCQl1bnNpZ25lZCBpbnQJICAgaW50ZWdlcjsKK307CitzdHJ1Y3QgaW5zdHJ1Y3Rpb24geworCXVuaW9uCWluc19mb3JtYXRzIGZvcm1hdDsKKwl1bnNpZ25lZCBpbnQJc3JjbGluZTsKKwlzdHJ1Y3Qgc3ltYm9sICpwYXRjaF9sYWJlbDsKKyAgc3RydWN0IHsKKyAgICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKnN0cWVfbmV4dDsKKyAgfSBsaW5rczsKK307CisKKyNkZWZpbmUJQUlDX09QX09SCTB4MAorI2RlZmluZQlBSUNfT1BfQU5ECTB4MQorI2RlZmluZSBBSUNfT1BfWE9SCTB4MgorI2RlZmluZQlBSUNfT1BfQURECTB4MworI2RlZmluZQlBSUNfT1BfQURDCTB4NAorI2RlZmluZQlBSUNfT1BfUk9MCTB4NQorI2RlZmluZQlBSUNfT1BfQk1PVgkweDYKKworI2RlZmluZQlBSUNfT1BfSk1QCTB4OAorI2RlZmluZSBBSUNfT1BfSkMJMHg5CisjZGVmaW5lIEFJQ19PUF9KTkMJMHhhCisjZGVmaW5lIEFJQ19PUF9DQUxMCTB4YgorI2RlZmluZQlBSUNfT1BfSk5FCTB4YworI2RlZmluZQlBSUNfT1BfSk5aCTB4ZAorI2RlZmluZQlBSUNfT1BfSkUJMHhlCisjZGVmaW5lCUFJQ19PUF9KWgkweGYKKworLyogUHNldWRvIE9wcyAqLworI2RlZmluZQlBSUNfT1BfU0hMCTB4MTAKKyNkZWZpbmUJQUlDX09QX1NIUgkweDIwCisjZGVmaW5lCUFJQ19PUF9ST1IJMHgzMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FtaWdhN3h4LmMgYi9kcml2ZXJzL3Njc2kvYW1pZ2E3eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjEzNTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FtaWdhN3h4LmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBEZXRlY3Rpb24gcm91dGluZSBmb3IgdGhlIE5DUjUzYzcxMCBiYXNlZCBBbWlnYSBTQ1NJIENvbnRyb2xsZXJzIGZvciBMaW51eC4KKyAqCQlBbWlnYSBNYWNyb1N5c3RlbVVTIFdhcnBFbmdpbmUgU0NTSSBjb250cm9sbGVyLgorICoJCUFtaWdhIFRlY2hub2xvZ2llcyBBNDAwMFQgU0NTSSBjb250cm9sbGVyLgorICoJCUFtaWdhIFRlY2hub2xvZ2llcy9ES0IgQTQwOTEgU0NTSSBjb250cm9sbGVyLgorICoKKyAqIFdyaXR0ZW4gMTk5NyBieSBBbGFuIEhvdXJpaGFuZSA8YWxhbmhAZmFpcmxpdGUuZGVtb24uY28udWs+CisgKiBwbHVzIG1vZGlmaWNhdGlvbnMgb2YgdGhlIDUzYzd4eC5jIGRyaXZlciB0byBzdXBwb3J0IHRoZSBBbWlnYS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiNTNjN3h4LmgiCisjaW5jbHVkZSAiYW1pZ2E3eHguaCIKKworCitzdGF0aWMgaW50IGFtaWdhN3h4X3JlZ2lzdGVyX29uZShTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQsCisJCQkJIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKyAgICBsb25nIGxvbmcgb3B0aW9uczsKKyAgICBpbnQgY2xvY2s7CisKKyAgICBpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihhZGRyZXNzLCAweDEwMDAsICJuY3I1M2M3MTAiKSkKKwlyZXR1cm4gMDsKKworICAgIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZyl6X2lvcmVtYXAoYWRkcmVzcywgMHgxMDAwKTsKKyAgICBvcHRpb25zID0gT1BUSU9OX01FTU9SWV9NQVBQRUQgfCBPUFRJT05fREVCVUdfVEVTVDEgfCBPUFRJT05fSU5URkxZIHwKKwkgICAgICBPUFRJT05fU1lOQ0hST05PVVMgfCBPUFRJT05fQUxXQVlTX1NZTkNIUk9OT1VTIHwKKwkgICAgICBPUFRJT05fRElTQ09OTkVDVDsKKyAgICBjbG9jayA9IDUwMDAwMDAwOwkvKiA1MCBNSHogU0NTSSBDbG9jayAqLworICAgIG5jcjUzYzd4eF9pbml0KHRwbnQsIDAsIDcxMCwgYWRkcmVzcywgMCwgSVJRX0FNSUdBX1BPUlRTLCBETUFfTk9ORSwKKwkJICAgb3B0aW9ucywgY2xvY2spOworICAgIHJldHVybiAxOworfQorCisKKyNpZmRlZiBDT05GSUdfWk9SUk8KKworc3RhdGljIHN0cnVjdCB7CisgICAgem9ycm9faWQgaWQ7CisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisgICAgaW50IGFic29sdXRlOwkvKiBvZmZzZXQgaXMgYWJzb2x1dGUgYWRkcmVzcyAqLworfSBhbWlnYTd4eF90YWJsZVtdID0geworICAgIHsgLmlkID0gWk9SUk9fUFJPRF9QSEFTRTVfQkxJWlpBUkRfNjAzRV9QTFVTLCAub2Zmc2V0ID0gMHhmNDAwMDAsCisgICAgICAuYWJzb2x1dGUgPSAxIH0sCisgICAgeyAuaWQgPSBaT1JST19QUk9EX01BQ1JPU1lTVEVNU19XQVJQX0VOR0lORV80MHh4LCAub2Zmc2V0ID0gMHg0MDAwMCB9LAorICAgIHsgLmlkID0gWk9SUk9fUFJPRF9DQk1fQTQwOTFfMSwgLm9mZnNldCA9IDB4ODAwMDAwIH0sCisgICAgeyAuaWQgPSBaT1JST19QUk9EX0NCTV9BNDA5MV8yLCAub2Zmc2V0ID0gMHg4MDAwMDAgfSwKKyAgICB7IC5pZCA9IFpPUlJPX1BST0RfR1ZQX0dGT1JDRV8wNDBfMDYwLCAub2Zmc2V0ID0gMHg0MDAwMCB9LAorICAgIHsgMCB9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbWlnYTd4eF96b3Jyb19kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICp0cG50KQoreworICAgIGludCBudW0gPSAwLCBpOworICAgIHN0cnVjdCB6b3Jyb19kZXYgKnogPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKworICAgIHdoaWxlICgoeiA9IHpvcnJvX2ZpbmRfZGV2aWNlKFpPUlJPX1dJTERDQVJELCB6KSkpIHsKKwlmb3IgKGkgPSAwOyBhbWlnYTd4eF90YWJsZVtpXS5pZDsgaSsrKQorCSAgICBpZiAoei0+aWQgPT0gYW1pZ2E3eHhfdGFibGVbaV0uaWQpCisJCWJyZWFrOworCWlmICghYW1pZ2E3eHhfdGFibGVbaV0uaWQpCisJICAgIGNvbnRpbnVlOworCWlmIChhbWlnYTd4eF90YWJsZVtpXS5hYnNvbHV0ZSkKKwkgICAgYWRkcmVzcyA9IGFtaWdhN3h4X3RhYmxlW2ldLm9mZnNldDsKKwllbHNlCisJICAgIGFkZHJlc3MgPSB6LT5yZXNvdXJjZS5zdGFydCArIGFtaWdhN3h4X3RhYmxlW2ldLm9mZnNldDsKKwludW0gKz0gYW1pZ2E3eHhfcmVnaXN0ZXJfb25lKHRwbnQsIGFkZHJlc3MpOworICAgIH0KKyAgICByZXR1cm4gbnVtOworfQorCisjZW5kaWYgLyogQ09ORklHX1pPUlJPICovCisKKworaW50IF9faW5pdCBhbWlnYTd4eF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICp0cG50KQoreworICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGNhbGxlZCA9IDA7CisgICAgaW50IG51bSA9IDA7CisKKyAgICBpZiAoY2FsbGVkIHx8ICFNQUNIX0lTX0FNSUdBKQorCXJldHVybiAwOworCisgICAgdHBudC0+cHJvY19uYW1lID0gIkFtaWdhN3h4IjsKKworICAgIGlmIChBTUlHQUhXX1BSRVNFTlQoQTQwMDBfU0NTSSkpCisJbnVtICs9IGFtaWdhN3h4X3JlZ2lzdGVyX29uZSh0cG50LCAweGRkMDA0MCk7CisKKyNpZmRlZiBDT05GSUdfWk9SUk8KKyAgICBudW0gKz0gYW1pZ2E3eHhfem9ycm9fZGV0ZWN0KHRwbnQpOworI2VuZGlmCisKKyAgICBjYWxsZWQgPSAxOworICAgIHJldHVybiBudW07Cit9CisKK3N0YXRpYyBpbnQgYW1pZ2E3eHhfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpZiAoc2hvc3QtPmlycSkKKwkJZnJlZV9pcnEoc2hvc3QtPmlycSwgTlVMTCk7CisJaWYgKHNob3N0LT5kbWFfY2hhbm5lbCAhPSAweGZmKQorCQlmcmVlX2RtYShzaG9zdC0+ZG1hX2NoYW5uZWwpOworCWlmIChzaG9zdC0+aW9fcG9ydCAmJiBzaG9zdC0+bl9pb19wb3J0KQorCQlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgc2hvc3QtPm5faW9fcG9ydCk7CisJc2NzaV91bnJlZ2lzdGVyKHNob3N0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLm5hbWUJCQk9ICJBbWlnYSBOQ1I1M2M3MTAgU0NTSSIsCisJLmRldGVjdAkJCT0gYW1pZ2E3eHhfZGV0ZWN0LAorCS5yZWxlYXNlCQk9IGFtaWdhN3h4X3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSBOQ1I1M2M3eHhfcXVldWVfY29tbWFuZCwKKwkuYWJvcnQJCQk9IE5DUjUzYzd4eF9hYm9ydCwKKwkucmVzZXQJCQk9IE5DUjUzYzd4eF9yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IDI0LAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSA2MywKKwkuY21kX3Blcl9sdW4JCT0gMywKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HCit9OworCisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FtaWdhN3h4LmggYi9kcml2ZXJzL3Njc2kvYW1pZ2E3eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2M1NGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FtaWdhN3h4LmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBBTUlHQTdYWF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitpbnQgYW1pZ2E3eHhfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK2NvbnN0IGNoYXIgKk5DUjUzYzd4MF9pbmZvKHZvaWQpOworaW50IE5DUjUzYzd4eF9xdWV1ZV9jb21tYW5kKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKK2ludCBOQ1I1M2M3eHhfYWJvcnQoU2NzaV9DbW5kICopOworaW50IE5DUjUzYzd4MF9yZWxlYXNlIChzdHJ1Y3QgU2NzaV9Ib3N0ICopOworaW50IE5DUjUzYzd4eF9yZXNldChTY3NpX0NtbmQgKiwgdW5zaWduZWQgaW50KTsKK3ZvaWQgTkNSNTNjN3gwX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworCisjaWZuZGVmIENNRF9QRVJfTFVOCisjZGVmaW5lIENNRF9QRVJfTFVOIDMKKyNlbmRpZgorCisjaWZuZGVmIENBTl9RVUVVRQorI2RlZmluZSBDQU5fUVVFVUUgMjQKKyNlbmRpZgorCisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CisKKyNlbmRpZiAvKiBBTUlHQTdYWF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL0tjb25maWcgYi9kcml2ZXJzL3Njc2kvYXJtL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiMzI4NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vS2NvbmZpZwpAQCAtMCwwICsxLDg5IEBACisjCisjIFNDU0kgZHJpdmVyIGNvbmZpZ3VyYXRpb24gZm9yIEFjb3JuCisjCitjb25maWcgU0NTSV9BQ09STlNDU0lfMworCXRyaXN0YXRlICJBY29ybiBTQ1NJIGNhcmQgKGFrYTMwKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9BQ09STiAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBBY29ybiBTQ1NJIGNhcmQgKGFrYTMwKS4gSWYgeW91IGhhdmUgYW4KKwkgIEFjb3JuIHN5c3RlbSB3aXRoIG9uZSBvZiB0aGVzZSwgc2F5IFkuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTQ1NJX0FDT1JOU0NTSV9UQUdHRURfUVVFVUUKKwlib29sICJTdXBwb3J0IFNDU0kgMiBUYWdnZWQgcXVldWVpbmciCisJZGVwZW5kcyBvbiBTQ1NJX0FDT1JOU0NTSV8zCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGFnZ2VkIHF1ZXVpbmcgc3VwcG9ydCBvbiB0aGUgQWNvcm4gU0NTSSBjYXJkLgorCisJICBUaGlzIGlzIGEgZmVhdHVyZSBvZiBTQ1NJLTIgd2hpY2ggaW1wcm92ZXMgcGVyZm9ybWFuY2U6IHRoZSBob3N0CisJICBhZGFwdGVyIGNhbiBzZW5kIHNldmVyYWwgU0NTSSBjb21tYW5kcyB0byBhIGRldmljZSdzIHF1ZXVlIGV2ZW4gaWYKKwkgIHByZXZpb3VzIGNvbW1hbmRzIGhhdmVuJ3QgZmluaXNoZWQgeWV0LiBTb21lIFNDU0kgZGV2aWNlcyBkb24ndAorCSAgaW1wbGVtZW50IHRoaXMgcHJvcGVybHksIHNvIHRoZSBzYWZlIGFuc3dlciBpcyBOLgorCitjb25maWcgU0NTSV9BQ09STlNDU0lfU1lOQworCWJvb2wgIlN1cHBvcnQgU0NTSSAyIFN5bmNocm9ub3VzIFRyYW5zZmVycyIKKwlkZXBlbmRzIG9uIFNDU0lfQUNPUk5TQ1NJXzMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzeW5jaHJvbm91cyB0cmFuc2ZlciBuZWdvdGlhdGlvbiB3aXRoIGFsbAorCSAgdGFyZ2V0cyBvbiB0aGUgQWNvcm4gU0NTSSBjYXJkLgorCisJICBJbiBnZW5lcmFsLCB0aGlzIGltcHJvdmVzIHBlcmZvcm1hbmNlOyBob3dldmVyIHNvbWUgU0NTSSBkZXZpY2VzCisJICBkb24ndCBpbXBsZW1lbnQgaXQgcHJvcGVybHksIHNvIHRoZSBzYWZlIGFuc3dlciBpcyBOLgorCitjb25maWcgU0NTSV9BUlhFU0NTSQorCXRyaXN0YXRlICJBUlhFIFNDU0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfQUNPUk4gJiYgU0NTSQorCWhlbHAKKwkgIEFyb3VuZCAxOTkxLCBBcnhlIFN5c3RlbXMgTGltaXRlZCByZWxlYXNlZCBhIGhpZ2ggZGVuc2l0eSBmbG9wcHkKKwkgIGRpc2MgaW50ZXJmYWNlIGZvciB0aGUgQWNvcm4gQXJjaGltZWRlcyByYW5nZSwgdG8gYWxsb3cgdGhlIHVzZSBvZgorCSAgSEQgZGlzY3MgZnJvbSB0aGUgdGhlbiBuZXcgQTUwMDAgb24gZWFybGllciBtb2RlbHMuIFRoaXMgaW50ZXJmYWNlCisJICB3YXMgZWl0aGVyIHNvbGQgb24gaXRzIG93biBvciB3aXRoIGFuIGludGVncmFsIFNDU0kgY29udHJvbGxlci4KKwkgIFRlY2huaWNhbCBkZXRhaWxzIG9uIHRoaXMgTkNSNTNjOTQtYmFzZWQgZGV2aWNlIGFyZSBhdmFpbGFibGUgYXQKKwkgIDxodHRwOi8vd3d3LmNyeXRvbi5kZW1vbi5jby51ay9hY29ybmJpdHMvc2NzaV9hcnhlLmh0bWw+CisJICBTYXkgWSBoZXJlIHRvIGNvbXBpbGUgaW4gc3VwcG9ydCBmb3IgdGhlIFNDU0kgY29udHJvbGxlci4KKworY29uZmlnIFNDU0lfQ1VNQU5BXzIKKwl0cmlzdGF0ZSAiQ3VtYW5hU0NTSSBJSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9BQ09STiAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBDdW1hbmEgU0NTSSBJSSBjYXJkLiBJZiB5b3UgaGF2ZSBhbgorCSAgQWNvcm4gc3lzdGVtIHdpdGggb25lIG9mIHRoZXNlLCBzYXkgWS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfRUVTT1hTQ1NJCisJdHJpc3RhdGUgIkVFU09YIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX0FDT1JOICYmIFNDU0kKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEVFU09YIFNDU0kgY2FyZC4gSWYgeW91IGhhdmUgYW4gQWNvcm4KKwkgIHN5c3RlbSB3aXRoIG9uZSBvZiB0aGVzZSwgc2F5IFksIG90aGVyd2lzZSBzYXkgTi4KKworY29uZmlnIFNDU0lfUE9XRVJURUNTQ1NJCisJdHJpc3RhdGUgIlBvd2VyVGVjIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX0FDT1JOICYmIFNDU0kKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFBvd2VydGVjIFNDU0kgY2FyZCBvbiBBY29ybiBzeXN0ZW1zLiBJZgorCSAgeW91IGhhdmUgb25lIG9mIHRoZXNlLCBzYXkgWS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29tbWVudCAiVGhlIGZvbGxvd2luZyBkcml2ZXJzIGFyZSBub3QgZnVsbHkgc3VwcG9ydGVkIgorCWRlcGVuZHMgb24gQVJDSF9BQ09STiAmJiBFWFBFUklNRU5UQUwKKworY29uZmlnIFNDU0lfQ1VNQU5BXzEKKwl0cmlzdGF0ZSAiQ3VtYW5hU0NTSSBJIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBBUkNIX0FDT1JOICYmIEVYUEVSSU1FTlRBTCAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBDdW1hbmEgU0NTSSBJIGNhcmQuIElmIHlvdSBoYXZlIGFuCisJICBBY29ybiBzeXN0ZW0gd2l0aCBvbmUgb2YgdGhlc2UsIHNheSBZLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU0NTSV9FQ09TQ1NJCisJdHJpc3RhdGUgIkVjb1Njc2kgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEFSQ0hfQUNPUk4gJiYgRVhQRVJJTUVOVEFMICYmIChBUkNIX0FSQyB8fCBBUkNIX0E1SykgJiYgU0NTSQorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgRWNvU0NTSSBjYXJkIC0tIGEgc21hbGwgY2FyZCB0aGF0IHNpdHMKKwkgIGluIHRoZSBFY29uZXQgc29ja2V0LiBJZiB5b3UgaGF2ZSBhbiBBY29ybiBzeXN0ZW0gd2l0aCBvbmUgb2YgdGhlc2UsCisJICBzYXkgWS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfT0FLMQorCXRyaXN0YXRlICJPYWsgU0NTSSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gQVJDSF9BQ09STiAmJiBFWFBFUklNRU5UQUwgJiYgU0NTSQorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgT2FrIFNDU0kgY2FyZC4gSWYgeW91IGhhdmUgYW4gQWNvcm4KKwkgIHN5c3RlbSB3aXRoIG9uZSBvZiB0aGVzZSwgc2F5IFkuIElmIHVuc3VyZSwgc2F5IE4uCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcm0vTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvYXJtL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZGIxNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXJtL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIGRyaXZlcnMvc2NzaS9hcm0KKyMKKworYWNvcm5zY3NpX21vZC1vYmpzCTo9IGFjb3Juc2NzaS5vIGFjb3Juc2NzaS1pby5vCisKK29iai0kKENPTkZJR19TQ1NJX0FDT1JOU0NTSV8zKQkrPSBhY29ybnNjc2lfbW9kLm8gcXVldWUubyBtc2dxdWV1ZS5vCitvYmotJChDT05GSUdfU0NTSV9BUlhFU0NTSSkJKz0gYXJ4ZXNjc2kubyBmYXMyMTYubyBxdWV1ZS5vIG1zZ3F1ZXVlLm8KK29iai0kKENPTkZJR19TQ1NJX0NVTUFOQV8xKQkrPSBjdW1hbmFfMS5vCitvYmotJChDT05GSUdfU0NTSV9DVU1BTkFfMikJKz0gY3VtYW5hXzIubyBmYXMyMTYubyBxdWV1ZS5vIG1zZ3F1ZXVlLm8KK29iai0kKENPTkZJR19TQ1NJX0VDT1NDU0kpCSs9IGVjb3Njc2kubworb2JqLSQoQ09ORklHX1NDU0lfT0FLMSkJCSs9IG9hay5vCitvYmotJChDT05GSUdfU0NTSV9QT1dFUlRFQ1NDU0kpCSs9IHBvd2VydGVjLm8gZmFzMjE2Lm8gcXVldWUubyBtc2dxdWV1ZS5vCitvYmotJChDT05GSUdfU0NTSV9FRVNPWFNDU0kpCSs9IGVlc294Lm8gZmFzMjE2Lm8gcXVldWUubyBtc2dxdWV1ZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL2Fjb3Juc2NzaS1pby5TIGIvZHJpdmVycy9zY3NpL2FybS9hY29ybnNjc2ktaW8uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzQ2N2U2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FybS9hY29ybnNjc2ktaW8uUwpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Fjb3JuL3Njc2kvYWNvcm5zY3NpLWlvLlM6IEFjb3JuIFNDU0kgY2FyZCBJTworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisKKyNpZiAoSU9fQkFTRSA9PSAoUENJT19CQVNFICYgMHhmZjAwMDAwMCkpCisjZGVmaW5lIEFERFIob2ZmLHJlZykJCQkJCQlcCisJCXRzdAlvZmYsICQweDgwMDAwMDAwCQkJO1wKKwkJbW92CXJlZywgJElPX0JBU0UJCQkJO1wKKwkJb3JyZXEJcmVnLCByZWcsICQoUENJT19CQVNFICYgMHgwMGZmMDAwMCkKKyNlbHNlCisjZGVmaW5lIEFERFIob2ZmLHJlZykJCQkJCQlcCisJCXRzdAlvZmYsICQweDgwMDAwMDAwCQkJO1wKKwkJbW92bmUJcmVnLCAkSU9fQkFTRQkJCQk7XAorCQltb3ZlcQlyZWcsICQoUENJT19CQVNFICYgMHhmZjAwMDAwMCkJCTtcCisJCW9ycmVxCXJlZywgcmVnLCAkKFBDSU9fQkFTRSAmIDB4MDBmZjAwMDApCisjZW5kaWYKKworQCBQdXJwb3NlOiB0cmFuc2ZlciBhIGJsb2NrIG9mIGRhdGEgZnJvbSB0aGUgYWNvcm4gc2NzaSBjYXJkIHRvIG1lbW9yeQorQCBQcm90byAgOiB2b2lkIGFjb3Juc2NzaV9pbih1bnNpZ25lZCBpbnQgYWRkcl9zdGFydCwgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQorQCBSZXR1cm5zOiBub3RoaW5nCisKKwkJLmFsaWduCitFTlRSWShfX2Fjb3Juc2NzaV9pbikKKwkJc3RtZmQJc3AhLCB7cjQgLSByNywgbHJ9CisJCWJpYwlyMCwgcjAsICMzCisJCW1vdglsciwgIzB4ZmYKKwkJb3JyCWxyLCBsciwgIzB4ZmYwMAorYWNvcm5zY3NpX2luMTZscDoKKwkJc3VicwlyMiwgcjIsICMxNgorCQlibWkJYWNvcm5zY3NpX2luOAorCQlsZG1pYQlyMCEsIHtyMywgcjQsIHI1LCByNn0KKwkJYW5kCXIzLCByMywgbHIKKwkJb3JyCXIzLCByMywgcjQsIGxzbCAjMTYKKwkJYW5kIAlyNCwgcjUsIGxyCisJCW9ycglyNCwgcjQsIHI2LCBsc2wgIzE2CisJCWxkbWlhCXIwISwge3I1LCByNiwgcjcsIGlwfQorCQlhbmQJcjUsIHI1LCBscgorCQlvcnIJcjUsIHI1LCByNiwgbHNsICMxNgorCQlhbmQJcjYsIHI3LCBscgorCQlvcnIJcjYsIHI2LCBpcCwgbHNsICMxNgorCQlzdG1pYQlyMSEsIHtyMyAtIHI2fQorCQlibmUJYWNvcm5zY3NpX2luMTZscAorCQlMT0FEUkVHUyhmZCwgc3AhLCB7cjQgLSByNywgcGN9KQorCithY29ybnNjc2lfaW44OglhZGRzCXIyLCByMiwgIzgKKwkJYm1pCWFjb3Juc2NzaV9pbjQKKwkJbGRtaWEJcjAhLCB7cjMsIHI0LCByNSwgcjZ9CisJCWFuZAlyMywgcjMsIGxyCisJCW9ycglyMywgcjMsIHI0LCBsc2wgIzE2CisJCWFuZAlyNCwgcjUsIGxyCisJCW9ycglyNCwgcjQsIHI2LCBsc2wgIzE2CisJCXN0bWlhCXIxISwge3IzIC0gcjR9CisJCUxPQURSRUdTKGVxZmQsIHNwISwge3I0IC0gcjcsIHBjfSkKKwkJc3ViCXIyLCByMiwgIzgKKworYWNvcm5zY3NpX2luNDoJYWRkcwlyMiwgcjIsICM0CisJCWJtaQlhY29ybnNjc2lfaW4yCisJCWxkbWlhCXIwISwge3IzLCByNH0KKwkJYW5kCXIzLCByMywgbHIKKwkJb3JyCXIzLCByMywgcjQsIGxzbCAjMTYKKwkJc3RyCXIzLCBbcjFdLCAjNAorCQlMT0FEUkVHUyhlcWZkLCBzcCEsIHtyNCAtIHI3LCBwY30pCisJCXN1YglyMiwgcjIsICM0CisKK2Fjb3Juc2NzaV9pbjI6CWFkZHMJcjIsIHIyLCAjMgorCQlsZHIJcjMsIFtyMF0sICM0CisJCWFuZAlyMywgcjMsIGxyCisJCXN0cmIJcjMsIFtyMV0sICMxCisJCW1vdglyMywgcjMsIGxzciAjOAorCQlzdHJwbGIJcjMsIFtyMV0sICMxCisJCUxPQURSRUdTKGZkLCBzcCEsIHtyNCAtIHI3LCBwY30pCisKK0AgUHVycG9zZTogdHJhbnNmZXIgYSBibG9jayBvZiBkYXRhIGZyb20gbWVtb3J5IHRvIHRoZSBhY29ybiBzY3NpIGNhcmQKK0AgUHJvdG8gIDogdm9pZCBhY29ybnNjc2lfaW4odW5zaWduZWQgaW50IGFkZHJfc3RhcnQsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkKK0AgUmV0dXJuczogbm90aGluZworCitFTlRSWShfX2Fjb3Juc2NzaV9vdXQpCisJCXN0bWZkCXNwISwge3I0IC0gcjYsIGxyfQorCQliaWMJcjAsIHIwLCAjMworYWNvcm5zY3NpX291dDE2bHA6CisJCXN1YnMJcjIsIHIyLCAjMTYKKwkJYm1pCWFjb3Juc2NzaV9vdXQ4CisJCWxkbWlhCXIxISwge3I0LCByNiwgaXAsIGxyfQorCQltb3YJcjMsIHI0LCBsc2wgIzE2CisJCW9ycglyMywgcjMsIHIzLCBsc3IgIzE2CisJCW1vdglyNCwgcjQsIGxzciAjMTYKKwkJb3JyCXI0LCByNCwgcjQsIGxzbCAjMTYKKwkJbW92CXI1LCByNiwgbHNsICMxNgorCQlvcnIJcjUsIHI1LCByNSwgbHNyICMxNgorCQltb3YJcjYsIHI2LCBsc3IgIzE2CisJCW9ycglyNiwgcjYsIHI2LCBsc2wgIzE2CisJCXN0bWlhCXIwISwge3IzLCByNCwgcjUsIHI2fQorCQltb3YJcjMsIGlwLCBsc2wgIzE2CisJCW9ycglyMywgcjMsIHIzLCBsc3IgIzE2CisJCW1vdglyNCwgaXAsIGxzciAjMTYKKwkJb3JyCXI0LCByNCwgcjQsIGxzbCAjMTYKKwkJbW92CWlwLCBsciwgbHNsICMxNgorCQlvcnIJaXAsIGlwLCBpcCwgbHNyICMxNgorCQltb3YJbHIsIGxyLCBsc3IgIzE2CisJCW9ycglsciwgbHIsIGxyLCBsc2wgIzE2CisJCXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQorCQlibmUJYWNvcm5zY3NpX291dDE2bHAKKwkJTE9BRFJFR1MoZmQsIHNwISwge3I0IC0gcjYsIHBjfSkKKworYWNvcm5zY3NpX291dDg6CWFkZHMJcjIsIHIyLCAjOAorCQlibWkJYWNvcm5zY3NpX291dDQKKwkJbGRtaWEJcjEhLCB7cjQsIHI2fQorCQltb3YJcjMsIHI0LCBsc2wgIzE2CisJCW9ycglyMywgcjMsIHIzLCBsc3IgIzE2CisJCW1vdglyNCwgcjQsIGxzciAjMTYKKwkJb3JyCXI0LCByNCwgcjQsIGxzbCAjMTYKKwkJbW92CXI1LCByNiwgbHNsICMxNgorCQlvcnIJcjUsIHI1LCByNSwgbHNyICMxNgorCQltb3YJcjYsIHI2LCBsc3IgIzE2CisJCW9ycglyNiwgcjYsIHI2LCBsc2wgIzE2CisJCXN0bWlhCXIwISwge3IzLCByNCwgcjUsIHI2fQorCQlMT0FEUkVHUyhlcWZkLCBzcCEsIHtyNCAtIHI2LCBwY30pCisKKwkJc3ViCXIyLCByMiwgIzgKK2Fjb3Juc2NzaV9vdXQ0OglhZGRzCXIyLCByMiwgIzQKKwkJYm1pCWFjb3Juc2NzaV9vdXQyCisJCWxkcglyNCwgW3IxXSwgIzQKKwkJbW92CXIzLCByNCwgbHNsICMxNgorCQlvcnIJcjMsIHIzLCByMywgbHNyICMxNgorCQltb3YJcjQsIHI0LCBsc3IgIzE2CisJCW9ycglyNCwgcjQsIHI0LCBsc2wgIzE2CisJCXN0bWlhCXIwISwge3IzLCByNH0KKwkJTE9BRFJFR1MoZXFmZCwgc3AhLCB7cjQgLSByNiwgcGN9KQorCisJCXN1YglyMiwgcjIsICM0CithY29ybnNjc2lfb3V0MjoJYWRkcwlyMiwgcjIsICMyCisJCWxkcglyMywgW3IxXSwgIzIKKwkJc3RyYglyMywgW3IwXSwgIzEKKwkJbW92CXIzLCByMywgbHNyICM4CisJCXN0cnBsYglyMywgW3IwXSwgIzEKKwkJTE9BRFJFR1MoZmQsIHNwISwge3I0IC0gcjYsIHBjfSkKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9hY29ybnNjc2kuYyBiL2RyaXZlcnMvc2NzaS9hcm0vYWNvcm5zY3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRkZDBiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vYWNvcm5zY3NpLmMKQEAgLTAsMCArMSwzMTMwIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvYWNvcm4vc2NzaS9hY29ybnNjc2kuYworICoKKyAqICBBY29ybiBTQ1NJIDMgZHJpdmVyCisgKiAgQnkgUi5NLktpbmcuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBBYmFuZG9uZWQgdXNpbmcgdGhlIFNlbGVjdCBhbmQgVHJhbnNmZXIgY29tbWFuZCBzaW5jZSB0aGVyZSB3ZXJlCisgKiBzb21lIG5hc3R5IHJhY2VzIGJldHdlZW4gb3VyIHNvZnR3YXJlIGFuZCB0aGUgdGFyZ2V0IGRldmljZXMgdGhhdAorICogd2VyZSBub3QgZWFzeSB0byBzb2x2ZSwgYW5kIHRoZSBkZXZpY2UgZXJyYXRhIGhhZCBhIGxvdCBvZiBlbnRyaWVzCisgKiBmb3IgdGhpcyBjb21tYW5kLCBzb21lIG9mIHRoZW0gcXVpdGUgbmFzdHkuLi4KKyAqCisgKiBDaGFuZ2Vsb2c6CisgKiAgMjYtU2VwLTE5OTcJUk1LCVJlLWppZ2dlZCB0byB1c2UgdGhlIHF1ZXVlIG1vZHVsZS4KKyAqCQkJUmUtY29kZWQgc3RhdGUgbWFjaGluZSB0byBiZSBiYXNlZCBvbiBkcml2ZXIKKyAqCQkJc3RhdGUgbm90IHNjc2kgc3RhdGUuICBTaG91bGQgYmUgZWFzaWVyIHRvIGRlYnVnLgorICoJCQlBZGRlZCBhY29ybnNjc2lfcmVsZWFzZSB0byBjbGVhbiB1cCBwcm9wZXJseS4KKyAqCQkJVXBkYXRlZCBwcm9jL3Njc2kgcmVwb3J0aW5nLgorICogIDA1LU9jdC0xOTk3CVJNSwlJbXBsZW1lbnRlZCB3cml0aW5nIHRvIFNDU0kgZGV2aWNlcy4KKyAqICAwNi1PY3QtMTk5NwlSTUsJQ29ycmVjdGVkIHNtYWxsIChub24tc2VyaW91cykgYnVnIHdpdGggdGhlIGNvbm5lY3QvCisgKgkJCXJlY29ubmVjdCByYWNlIGNvbmRpdGlvbiBjYXVzaW5nIGEgd2FybmluZyBtZXNzYWdlLgorICogIDEyLU9jdC0xOTk3CVJNSwlBZGRlZCBjYXRjaCBmb3IgcmUtZW50ZXJpbmcgaW50ZXJydXB0IHJvdXRpbmUuCisgKiAgMTUtT2N0LTE5OTcJUk1LCUltcHJvdmVkIGhhbmRsaW5nIG9mIGNvbW1hbmRzLgorICogIDI3LUp1bi0xOTk4CVJNSwlDaGFuZ2VkIGFzbS9kZWxheS5oIHRvIGxpbnV4L2RlbGF5LmguCisgKiAgMTMtRGVjLTE5OTgJUk1LCUJldHRlciBhYm9ydCBjb2RlIGFuZCBjb21tYW5kIGhhbmRsaW5nLiAgRXh0cmEgc3RhdGUKKyAqCQkJdHJhbnNpdGlvbnMgYWRkZWQgdG8gYWxsb3cgZG9kZ3kgZGV2aWNlcyB0byB3b3JrLgorICovCisjZGVmaW5lIERFQlVHX05PX1dSSVRFCTEKKyNkZWZpbmUgREVCVUdfUVVFVUVTCTIKKyNkZWZpbmUgREVCVUdfRE1BCTQKKyNkZWZpbmUgREVCVUdfQUJPUlQJOAorI2RlZmluZSBERUJVR19ESVNDT04JMTYKKyNkZWZpbmUgREVCVUdfQ09OTkVDVAkzMgorI2RlZmluZSBERUJVR19QSEFTRVMJNjQKKyNkZWZpbmUgREVCVUdfV1JJVEUJMTI4CisjZGVmaW5lIERFQlVHX0xJTksJMjU2CisjZGVmaW5lIERFQlVHX01FU1NBR0VTCTUxMgorI2RlZmluZSBERUJVR19SRVNFVAkxMDI0CisjZGVmaW5lIERFQlVHX0FMTAkoREVCVUdfUkVTRVR8REVCVUdfTUVTU0FHRVN8REVCVUdfTElOS3xERUJVR19XUklURXxcCisJCQkgREVCVUdfUEhBU0VTfERFQlVHX0NPTk5FQ1R8REVCVUdfRElTQ09OfERFQlVHX0FCT1JUfFwKKwkJCSBERUJVR19ETUF8REVCVUdfUVVFVUVTKQorCisvKiBEUklWRVIgQ09ORklHVVJBVElPTgorICoKKyAqIFNDU0ktSUkgVGFnZ2VkIHF1ZXVlIHN1cHBvcnQuCisgKgorICogSSBkb24ndCBoYXZlIGFueSBTQ1NJIGRldmljZXMgdGhhdCBzdXBwb3J0IGl0LCBzbyBpdCBpcyB0b3RhbGx5IHVudGVzdGVkCisgKiAoZXhjZXB0IHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGRvZXNuJ3QgaW50ZXJmZXJlIHdpdGggYW55IG5vbi10YWdnaW5nCisgKiBkZXZpY2VzKS4gIEl0IGlzIG5vdCBmdWxseSBpbXBsZW1lbnRlZCBlaXRoZXIgLSB3aGF0IGhhcHBlbnMgd2hlbiBhCisgKiB0YWdnaW5nIGRldmljZSByZWNvbm5lY3RzPz8/CisgKgorICogWW91IGNhbiB0ZWxsIGlmIHlvdSBoYXZlIGEgZGV2aWNlIHRoYXQgc3VwcG9ydHMgdGFnZ2VkIHF1ZXVlaW5nIG15CisgKiBjYXRpbmcgKGVnKSAvcHJvYy9zY3NpL2Fjb3Juc2NzaS8wIGFuZCBzZWUgaWYgdGhlIFNDU0kgcmV2aXNpb24gaXMgcmVwb3J0ZWQKKyAqIGFzICcyIFRBRycuCisgKgorICogQWxzbyBub3RlIHRoYXQgQ09ORklHX1NDU0lfQUNPUk5TQ1NJX1RBR0dFRF9RVUVVRSBpcyBub3JtYWxseSBzZXQgaW4gdGhlIGNvbmZpZworICogc2NyaXB0cywgYnV0IGRpc2FibGVkIGhlcmUuICBPbmNlIGRlYnVnZ2VkLCByZW1vdmUgdGhlICN1bmRlZiwgb3RoZXJ3aXNlIHRvIGRlYnVnLAorICogY29tbWVudCBvdXQgdGhlIHVuZGVmLgorICovCisjdW5kZWYgQ09ORklHX1NDU0lfQUNPUk5TQ1NJX1RBR0dFRF9RVUVVRQorLyoKKyAqIFNDU0ktSUkgTGlua2VkIGNvbW1hbmQgc3VwcG9ydC4KKyAqCisgKiBUaGUgaGlnaGVyIGxldmVsIGNvZGUgZG9lc24ndCBzdXBwb3J0IGxpbmtlZCBjb21tYW5kcyB5ZXQsIGFuZCBzbyB0aGUgb3B0aW9uCisgKiBpcyB1bmRlZidkIGhlcmUuCisgKi8KKyN1bmRlZiBDT05GSUdfU0NTSV9BQ09STlNDU0lfTElOSworLyoKKyAqIFNDU0ktSUkgU3luY2hyb25vdXMgdHJhbnNmZXIgc3VwcG9ydC4KKyAqCisgKiBUcmllZCBhbmQgdGVzdGVkLi4uCisgKgorICogU0RUUl9TSVpFCSAgLSBtYXhpbXVtIG51bWJlciBvZiB1bi1hY2tub3dsZWRnZWQgYnl0ZXMgKDAgPSBvZmYsIDEyID0gbWF4KQorICogU0RUUl9QRVJJT0QJICAtIHBlcmlvZCBvZiBSRVEgc2lnbmFsIChtaW49MTI1LCBtYXg9MTAyMCkKKyAqIERFRkFVTFRfUEVSSU9EIC0gZGVmYXVsdCBSRVEgcGVyaW9kLgorICovCisjZGVmaW5lIFNEVFJfU0laRQkxMgorI2RlZmluZSBTRFRSX1BFUklPRAkxMjUKKyNkZWZpbmUgREVGQVVMVF9QRVJJT0QJNTAwCisKKy8qCisgKiBEZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKyAqCisgKiBERUJVRwkgIC0gYml0IG1hc2sgZnJvbSBsaXN0IGFib3ZlCisgKiBERUJVR19UQVJHRVQgICAtIGlzIGRlZmluZWQgdG8gdGhlIHRhcmdldCBudW1iZXIgaWYgeW91IHdhbnQgdG8gZGVidWcKKyAqCQkgICAgYSBzcGVjaWZpYyB0YXJnZXQuIFtvbmx5IHJlY29uL3dyaXRlL2RtYV0uCisgKi8KKyNkZWZpbmUgREVCVUcgKERFQlVHX1JFU0VUfERFQlVHX1dSSVRFfERFQlVHX05PX1dSSVRFKQorLyogb25seSBhbGxvdyB3cml0aW5nIHRvIFNDU0kgZGV2aWNlIDAgKi8KKyNkZWZpbmUgTk9fV1JJVEUgMHhGRQorLyojZGVmaW5lIERFQlVHX1RBUkdFVCAyKi8KKy8qCisgKiBTZWxlY3QgdGltZW91dCB0aW1lIChpbiAxMG1zIHVuaXRzKQorICoKKyAqIFRoaXMgaXMgdGhlIHRpbWVvdXQgdXNlZCBiZXR3ZWVuIHRoZSBzdGFydCBvZiBzZWxlY3Rpb24gYW5kIHRoZSBXRDMzQzkzCisgKiBjaGlwIGRlY2lkaW5nIHRoYXQgdGhlIGRldmljZSBpc24ndCByZXNwb25kaW5nLgorICovCisjZGVmaW5lIFRJTUVPVVRfVElNRSAxMAorLyoKKyAqIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHRvIGhhdmUgdmVyYm9zZSBleHBsYWluYXRpb24gb2YgU0NTSQorICogc3RhdHVzL21lc3NhZ2VzLgorICovCisjdW5kZWYgQ09ORklHX0FDT1JOU0NTSV9DT05TVEFOVFMKKy8qCisgKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIG9uIGJvYXJkIERNQUMgW2Rvbid0IHJlbW92ZSB0aGlzIG9wdGlvbl0KKyAqIElmIG5vdCBzZXQsIHRoZW4gdXNlIFBJTyBtb2RlIChub3QgY3VycmVudGx5IHN1cHBvcnRlZCkuCisgKi8KKyNkZWZpbmUgVVNFX0RNQUMKKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZmRlZiBERUJVR19UQVJHRVQKKyNkZWZpbmUgREJHKGNtZCx4eHguLi4pIFwKKyAgaWYgKGNtZC0+ZGV2aWNlLT5pZCA9PSBERUJVR19UQVJHRVQpIHsgXAorICAgIHh4eDsgXAorICB9CisjZWxzZQorI2RlZmluZSBEQkcoY21kLHh4eC4uLikgeHh4CisjZW5kaWYKKworI2lmbmRlZiBTVFJJTkdJRlkKKyNkZWZpbmUgU1RSSU5HSUZZKHgpICN4CisjZW5kaWYKKyNkZWZpbmUgU1RSeCh4KSBTVFJJTkdJRlkoeCkKKyNkZWZpbmUgTk9fV1JJVEVfU1RSIFNUUngoTk9fV1JJVEUpCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vZWNhcmQuaD4KKworI2luY2x1ZGUgIi4uL3Njc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgImFjb3Juc2NzaS5oIgorI2luY2x1ZGUgIm1zZ3F1ZXVlLmgiCisjaW5jbHVkZSAic2NzaS5oIgorCisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CisKKyNkZWZpbmUgVkVSX01BSk9SIDIKKyNkZWZpbmUgVkVSX01JTk9SIDAKKyNkZWZpbmUgVkVSX1BBVENIIDYKKworI2lmbmRlZiBBQk9SVF9UQUcKKyNkZWZpbmUgQUJPUlRfVEFHIDB4ZAorI2Vsc2UKKyNlcnJvciAiWWlwcGVlISAgQUJPUlQgVEFHIGlzIG5vdyBkZWZpbmVkISAgUmVtb3ZlIHRoaXMgZXJyb3IhIgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU0NTSV9BQ09STlNDU0lfTElOSworI2Vycm9yIFNDU0kyIExJTktlZCBjb21tYW5kcyBub3Qgc3VwcG9ydGVkICh5ZXQpIQorI2VuZGlmCisKKyNpZmRlZiBVU0VfRE1BQworLyoKKyAqIERNQUMgc2V0dXAgcGFyYW1ldGVycworICovIAorI2RlZmluZSBJTklUX0RFVkNPTjAJKERFVkNPTjBfUlFMfERFVkNPTjBfRVhXfERFVkNPTjBfQ01QKQorI2RlZmluZSBJTklUX0RFVkNPTjEJKERFVkNPTjFfQkhMRCkKKyNkZWZpbmUgRE1BQ19SRUFECShNT0RFQ09OX1JFQUQpCisjZGVmaW5lIERNQUNfV1JJVEUJKE1PREVDT05fV1JJVEUpCisjZGVmaW5lIElOSVRfU0JJQ0RNQQkoQ1RSTF9ETUFCVVJTVCkKKworI2RlZmluZSBzY3NpX3hmZXJyZWQJaGF2ZV9kYXRhX2luCisKKy8qCisgKiBTaXplIG9mIG9uLWJvYXJkIERNQSBidWZmZXIKKyAqLworI2RlZmluZSBETUFDX0JVRkZFUl9TSVpFCTY1NTM2CisjZW5kaWYKKworI2RlZmluZSBTVEFUVVNfQlVGRkVSX1RPX1BSSU5UCTI0CisKK3Vuc2lnbmVkIGludCBzZHRyX3BlcmlvZCA9IFNEVFJfUEVSSU9EOwordW5zaWduZWQgaW50IHNkdHJfc2l6ZSAgID0gU0RUUl9TSVpFOworCitzdGF0aWMgdm9pZCBhY29ybnNjc2lfZG9uZShBU19Ib3N0ICpob3N0LCBTY3NpX0NtbmQgKipTQ3BudHAsIHVuc2lnbmVkIGludCByZXN1bHQpOworc3RhdGljIGludCBhY29ybnNjc2lfcmVjb25uZWN0X2ZpbmlzaChBU19Ib3N0ICpob3N0KTsKK3N0YXRpYyB2b2lkIGFjb3Juc2NzaV9kbWFfY2xlYW51cChBU19Ib3N0ICpob3N0KTsKK3N0YXRpYyB2b2lkIGFjb3Juc2NzaV9hYm9ydGNtZChBU19Ib3N0ICpob3N0LCB1bnNpZ25lZCBjaGFyIHRhZyk7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTWlzY2VsbGFuZW91cworICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2JpY19hcm1fd3JpdGUodW5zaWduZWQgaW50IGlvX3BvcnQsIGludCByZWcsIGludCB2YWx1ZSkKK3sKKyAgICBfX3Jhd193cml0ZWIocmVnLCBpb19wb3J0KTsKKyAgICBfX3Jhd193cml0ZWIodmFsdWUsIGlvX3BvcnQgKyA0KTsKK30KKworI2RlZmluZSBzYmljX2FybV93cml0ZW5leHQoaW8sdmFsKSBcCisJX19yYXdfd3JpdGViKCh2YWwpLCAoaW8pICsgNCkKKworc3RhdGljIGlubGluZQoraW50IHNiaWNfYXJtX3JlYWQodW5zaWduZWQgaW50IGlvX3BvcnQsIGludCByZWcpCit7CisgICAgaWYocmVnID09IFNCSUNfQVNSKQorCSAgIHJldHVybiBfX3Jhd19yZWFkbChpb19wb3J0KSAmIDI1NTsKKyAgICBfX3Jhd193cml0ZWIocmVnLCBpb19wb3J0KTsKKyAgICByZXR1cm4gX19yYXdfcmVhZGwoaW9fcG9ydCArIDQpICYgMjU1OworfQorCisjZGVmaW5lIHNiaWNfYXJtX3JlYWRuZXh0KGlvKSBcCisJX19yYXdfcmVhZGIoKGlvKSArIDQpCisKKyNpZmRlZiBVU0VfRE1BQworI2RlZmluZSBkbWFjX3JlYWQoaW9fcG9ydCxyZWcpIFwKKwlpbmIoKGlvX3BvcnQpICsgKHJlZykpCisKKyNkZWZpbmUgZG1hY193cml0ZShpb19wb3J0LHJlZyx2YWx1ZSkgXAorCSh7IG91dGIoKHZhbHVlKSwgKGlvX3BvcnQpICsgKHJlZykpOyB9KQorCisjZGVmaW5lIGRtYWNfY2xlYXJpbnRyKGlvX3BvcnQpIFwKKwkoeyBvdXRiKDAsIChpb19wb3J0KSk7IH0pCisKK3N0YXRpYyBpbmxpbmUKK3Vuc2lnbmVkIGludCBkbWFjX2FkZHJlc3ModW5zaWduZWQgaW50IGlvX3BvcnQpCit7CisgICAgcmV0dXJuIGRtYWNfcmVhZChpb19wb3J0LCBETUFDX1RYQURSSEkpIDw8IDE2IHwKKwkgICBkbWFjX3JlYWQoaW9fcG9ydCwgRE1BQ19UWEFEUk1EKSA8PCA4IHwKKwkgICBkbWFjX3JlYWQoaW9fcG9ydCwgRE1BQ19UWEFEUkxPKTsKK30KKworc3RhdGljCit2b2lkIGFjb3Juc2NzaV9kdW1wZG1hKEFTX0hvc3QgKmhvc3QsIGNoYXIgKndoZXJlKQoreworCXVuc2lnbmVkIGludCBtb2RlLCBhZGRyLCBsZW47CisKKwltb2RlID0gZG1hY19yZWFkKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX01PREVDT04pOworCWFkZHIgPSBkbWFjX2FkZHJlc3MoaG9zdC0+ZG1hLmlvX3BvcnQpOworCWxlbiAgPSBkbWFjX3JlYWQoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfVFhDTlRISSkgPDwgOCB8CisJICAgICAgIGRtYWNfcmVhZChob3N0LT5kbWEuaW9fcG9ydCwgRE1BQ19UWENOVExPKTsKKworCXByaW50aygic2NzaSVkOiAlczogRE1BQyAlMDJ4IEAlMDZ4KyUwNHggbXNrICUwMngsICIsCisJCWhvc3QtPmhvc3QtPmhvc3Rfbm8sIHdoZXJlLAorCQltb2RlLCBhZGRyLCAobGVuICsgMSkgJiAweGZmZmYsCisJCWRtYWNfcmVhZChob3N0LT5kbWEuaW9fcG9ydCwgRE1BQ19NQVNLUkVHKSk7CisKKwlwcmludGsoIkRNQSBAJTA2eCwgIiwgaG9zdC0+ZG1hLnN0YXJ0X2FkZHIpOworCXByaW50aygiQkggQCVwICslMDR4LCAiLCBob3N0LT5zY3NpLlNDcC5wdHIsCisJCWhvc3QtPnNjc2kuU0NwLnRoaXNfcmVzaWR1YWwpOworCXByaW50aygiRFQgQCslMDR4IFNUIEArJTA0eCIsIGhvc3QtPmRtYS50cmFuc2ZlcnJlZCwKKwkJaG9zdC0+c2NzaS5TQ3Auc2NzaV94ZmVycmVkKTsKKwlwcmludGsoIlxuIik7Cit9CisjZW5kaWYKKworc3RhdGljCit1bnNpZ25lZCBsb25nIGFjb3Juc2NzaV9zYmljX3hmY291bnQoQVNfSG9zdCAqaG9zdCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKworICAgIGxlbmd0aCA9IHNiaWNfYXJtX3JlYWQoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1RSQU5TQ05USCkgPDwgMTY7CisgICAgbGVuZ3RoIHw9IHNiaWNfYXJtX3JlYWRuZXh0KGhvc3QtPnNjc2kuaW9fcG9ydCkgPDwgODsKKyAgICBsZW5ndGggfD0gc2JpY19hcm1fcmVhZG5leHQoaG9zdC0+c2NzaS5pb19wb3J0KTsKKworICAgIHJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyBpbnQKK2Fjb3Juc2NzaV9zYmljX3dhaXQoQVNfSG9zdCAqaG9zdCwgaW50IHN0YXRfbWFzaywgaW50IHN0YXQsIGludCB0aW1lb3V0LCBjaGFyICptc2cpCit7CisJaW50IGFzcjsKKworCWRvIHsKKwkJYXNyID0gc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfQVNSKTsKKworCQlpZiAoKGFzciAmIHN0YXRfbWFzaykgPT0gc3RhdCkKKwkJCXJldHVybiAwOworCisJCXVkZWxheSgxKTsKKwl9IHdoaWxlICgtLXRpbWVvdXQpOworCisJcHJpbnRrKCJzY3NpJWQ6IHRpbWVvdXQgd2hpbGUgJXNcbiIsIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIG1zZyk7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYworaW50IGFjb3Juc2NzaV9zYmljX2lzc3VlY21kKEFTX0hvc3QgKmhvc3QsIGludCBjb21tYW5kKQoreworICAgIGlmIChhY29ybnNjc2lfc2JpY193YWl0KGhvc3QsIEFTUl9DSVAsIDAsIDEwMDAsICJpc3N1aW5nIGNvbW1hbmQiKSkKKwlyZXR1cm4gLTE7CisKKyAgICBzYmljX2FybV93cml0ZShob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfQ01ORCwgY29tbWFuZCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2Fjb3Juc2NzaV9jc2RlbGF5KHVuc2lnbmVkIGludCBjcykKK3sKKyAgICB1bnNpZ25lZCBsb25nIHRhcmdldF9qaWZmaWVzLCBmbGFnczsKKworICAgIHRhcmdldF9qaWZmaWVzID0gamlmZmllcyArIDEgKyBjcyAqIEhaIC8gMTAwOworCisgICAgbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CisgICAgbG9jYWxfaXJxX2VuYWJsZSgpOworCisgICAgd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRhcmdldF9qaWZmaWVzKSkgYmFycmllcigpOworCisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMKK3ZvaWQgYWNvcm5zY3NpX3Jlc2V0Y2FyZChBU19Ib3N0ICpob3N0KQoreworICAgIHVuc2lnbmVkIGludCBpLCB0aW1lb3V0OworCisgICAgLyogYXNzZXJ0IHJlc2V0IGxpbmUgKi8KKyAgICBob3N0LT5jYXJkLnBhZ2VfcmVnID0gMHg4MDsKKyAgICBvdXRiKGhvc3QtPmNhcmQucGFnZV9yZWcsIGhvc3QtPmNhcmQuaW9fcGFnZSk7CisKKyAgICAvKiB3YWl0IDMgY3MuICBTQ1NJIHN0YW5kYXJkIHNheXMgMjVtcy4gKi8KKyAgICBhY29ybnNjc2lfY3NkZWxheSgzKTsKKworICAgIGhvc3QtPmNhcmQucGFnZV9yZWcgPSAwOworICAgIG91dGIoaG9zdC0+Y2FyZC5wYWdlX3JlZywgaG9zdC0+Y2FyZC5pb19wYWdlKTsKKworICAgIC8qCisgICAgICogU2hvdWxkIGdldCBhIHJlc2V0IGZyb20gdGhlIGNhcmQKKyAgICAgKi8KKyAgICB0aW1lb3V0ID0gMTAwMDsKKyAgICBkbyB7CisJaWYgKGluYihob3N0LT5jYXJkLmlvX2ludHIpICYgOCkKKwkgICAgYnJlYWs7CisJdWRlbGF5KDEpOworICAgIH0gd2hpbGUgKC0tdGltZW91dCk7CisKKyAgICBpZiAodGltZW91dCA9PSAwKQorCXByaW50aygic2NzaSVkOiB0aW1lb3V0IHdoaWxlIHJlc2V0dGluZyBjYXJkXG4iLAorCQlob3N0LT5ob3N0LT5ob3N0X25vKTsKKworICAgIHNiaWNfYXJtX3JlYWQoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX0FTUik7CisgICAgc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfU1NSKTsKKworICAgIC8qIHNldHVwIHNiaWMgLSBXRDMzQzkzQSAqLworICAgIHNiaWNfYXJtX3dyaXRlKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19PV05JRCwgT1dOSURfRUFGIHwgaG9zdC0+aG9zdC0+dGhpc19pZCk7CisgICAgc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX0NNTkQsIENNTkRfUkVTRVQpOworCisgICAgLyoKKyAgICAgKiBDb21tYW5kIHNob3VsZCBjYXVzZSBhIHJlc2V0IGludGVycnVwdAorICAgICAqLworICAgIHRpbWVvdXQgPSAxMDAwOworICAgIGRvIHsKKwlpZiAoaW5iKGhvc3QtPmNhcmQuaW9faW50cikgJiA4KQorCSAgICBicmVhazsKKwl1ZGVsYXkoMSk7CisgICAgfSB3aGlsZSAoLS10aW1lb3V0KTsKKworICAgIGlmICh0aW1lb3V0ID09IDApCisJcHJpbnRrKCJzY3NpJWQ6IHRpbWVvdXQgd2hpbGUgcmVzZXR0aW5nIGNhcmRcbiIsCisJCWhvc3QtPmhvc3QtPmhvc3Rfbm8pOworCisgICAgc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfQVNSKTsKKyAgICBpZiAoc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfU1NSKSAhPSAweDAxKQorCXByaW50ayhLRVJOX0NSSVQgInNjc2klZDogV0QzM0M5M0EgZGlkbid0IGdpdmUgZW5oYW5jZWQgcmVzZXQgaW50ZXJydXB0XG4iLAorCQlob3N0LT5ob3N0LT5ob3N0X25vKTsKKworICAgIHNiaWNfYXJtX3dyaXRlKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19DVFJMLCBJTklUX1NCSUNETUEgfCBDVFJMX0lESSk7CisgICAgc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1RJTUVPVVQsIFRJTUVPVVRfVElNRSk7CisgICAgc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1NZTkNIVFJBTlNGRVIsIFNZTkNIVFJBTlNGRVJfMkRCQSk7CisgICAgc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1NPVVJDRUlELCBTT1VSQ0VJRF9FUiB8IFNPVVJDRUlEX0RTUCk7CisKKyAgICBob3N0LT5jYXJkLnBhZ2VfcmVnID0gMHg0MDsKKyAgICBvdXRiKGhvc3QtPmNhcmQucGFnZV9yZWcsIGhvc3QtPmNhcmQuaW9fcGFnZSk7CisKKyAgICAvKiBzZXR1cCBkbWFjIC0gdVBDNzEwNzEgKi8KKyAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX0lOSVQsIDApOworI2lmZGVmIFVTRV9ETUFDCisgICAgZG1hY193cml0ZShob3N0LT5kbWEuaW9fcG9ydCwgRE1BQ19JTklULCBJTklUXzhCSVQpOworICAgIGRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfQ0hBTk5FTCwgQ0hBTk5FTF8wKTsKKyAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX0RFVkNPTjAsIElOSVRfREVWQ09OMCk7CisgICAgZG1hY193cml0ZShob3N0LT5kbWEuaW9fcG9ydCwgRE1BQ19ERVZDT04xLCBJTklUX0RFVkNPTjEpOworI2VuZGlmCisKKyAgICBob3N0LT5TQ3BudCA9IE5VTEw7CisgICAgaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX0lETEU7CisgICAgaG9zdC0+c2NzaS5kaXNjb25uZWN0YWJsZSA9IDA7CisKKyAgICBtZW1zZXQoaG9zdC0+YnVzeWx1bnMsIDAsIHNpemVvZihob3N0LT5idXN5bHVucykpOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCWhvc3QtPmRldmljZVtpXS5zeW5jX3N0YXRlID0gU1lOQ19ORUdPQ0lBVEU7CisJaG9zdC0+ZGV2aWNlW2ldLmRpc2Nvbm5lY3Rfb2sgPSAxOworICAgIH0KKworICAgIC8qIHdhaXQgMjUgY3MuICBTQ1NJIHN0YW5kYXJkIHNheXMgMjUwbXMuICovCisgICAgYWNvcm5zY3NpX2NzZGVsYXkoMjUpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXRpbGl0eSByb3V0aW5lcyAoZWcuIGRlYnVnKQorICovCisjaWZkZWYgQ09ORklHX0FDT1JOU0NTSV9DT05TVEFOVFMKK3N0YXRpYyBjaGFyICphY29ybnNjc2lfaW50ZXJydXB0dHlwZVtdID0geworICAicnN0IiwgICJzdWMiLCAgInAvYSIsICAiMyIsCisgICJ0ZXJtIiwgIjUiLAkgICI2IiwJICAiNyIsCisgICJzZXJ2IiwgIjkiLAkgICJhIiwJICAiYiIsCisgICJjIiwJICAiZCIsCSAgImUiLAkgICJmIgorfTsKKworc3RhdGljIHNpZ25lZCBjaGFyIGFjb3Juc2NzaV9tYXBbXSA9IHsKKyAgMCwgIDEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwKKyAtMSwgIDIsIC0xLCAtMSwgIC0xLCAtMSwgIDMsIC0xLCAgIDQsCTUsICA2LAk3LCAgIDgsICA5LCAxMCwgMTEsCisgMTIsIDEzLCAxNCwgLTEsICAtMSwgLTEsIC0xLCAtMSwgICA0LAk1LCAgNiwJNywgICA4LCAgOSwgMTAsIDExLAorIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLAorIDE1LCAxNiwgMTcsIDE4LCAgMTksIC0xLCAtMSwgMjAsICAgNCwJNSwgIDYsCTcsICAgOCwgIDksIDEwLCAxMSwKKyAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwKKyAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwKKyAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwKKyAyMSwgMjIsIC0xLCAtMSwgIC0xLCAyMywgLTEsIC0xLCAgIDQsCTUsICA2LAk3LCAgIDgsICA5LCAxMCwgMTEsCisgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsCisgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsCisgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsCisgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsCisgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsCisgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsCisgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEKK307ICAgICAgCisKK3N0YXRpYyBjaGFyICphY29ybnNjc2lfaW50ZXJydXB0Y29kZVtdID0geworICAgIC8qIDAgKi8KKyAgICAicmVzZXQgLSBub3JtYWwgbW9kZSIsCS8qIDAwICovCisgICAgInJlc2V0IC0gYWR2YW5jZWQgbW9kZSIsCS8qIDAxICovCisKKyAgICAvKiAyICovCisgICAgInNlbCIsCQkJLyogMTEgKi8KKyAgICAic2VsK3hmZXIiLCAJCS8qIDE2ICovCisgICAgImRhdGEtb3V0IiwgCQkvKiAxOCAqLworICAgICJkYXRhLWluIiwJCQkvKiAxOSAqLworICAgICJjbWQiLAkJCS8qIDFBICovCisgICAgInN0YXQiLAkJCS8qIDFCICovCisgICAgIj8/LW91dCIsCQkJLyogMUMgKi8KKyAgICAiPz8taW4iLAkJCS8qIDFEICovCisgICAgIm1zZy1vdXQiLAkJCS8qIDFFICovCisgICAgIm1zZy1pbiIsCQkJLyogMUYgKi8KKworICAgIC8qIDEyICovCisgICAgIi9BQ0sgYXNzZXJ0ZWQiLAkJLyogMjAgKi8KKyAgICAic2F2ZS1kYXRhLXB0ciIsCQkvKiAyMSAqLworICAgICJ7cmV9c2VsIiwJCQkvKiAyMiAqLworCisgICAgLyogMTUgKi8KKyAgICAiaW52IGNtZCIsCQkJLyogNDAgKi8KKyAgICAidW5leHBlY3RlZCBkaXNjb25uZWN0IiwJLyogNDEgKi8KKyAgICAic2VsIHRpbWVvdXQiLAkJLyogNDIgKi8KKyAgICAiUCBlcnIiLAkJCS8qIDQzICovCisgICAgIlAgZXJyK0FUTiIsCQkvKiA0NCAqLworICAgICJiYWQgc3RhdHVzIGJ5dGUiLAkJLyogNDcgKi8KKworICAgIC8qIDIxICovCisgICAgInJlc2VsLCBubyBpZCIsCQkvKiA4MCAqLworICAgICJyZXNlbCIsCQkJLyogODEgKi8KKyAgICAiZGlzY29uIiwJCQkvKiA4NSAqLworfTsKKworc3RhdGljCit2b2lkIHByaW50X3Njc2lfc3RhdHVzKHVuc2lnbmVkIGludCBzc3IpCit7CisgICAgaWYgKGFjb3Juc2NzaV9tYXBbc3NyXSAhPSAtMSkKKwlwcmludGsoIiVzOiVzIiwKKwkJYWNvcm5zY3NpX2ludGVycnVwdHR5cGVbKHNzciA+PiA0KV0sCisJCWFjb3Juc2NzaV9pbnRlcnJ1cHRjb2RlW2Fjb3Juc2NzaV9tYXBbc3NyXV0pOworICAgIGVsc2UKKwlwcmludGsoIiVYOiVYIiwgc3NyID4+IDQsIHNzciAmIDB4MGYpOyAgICAKK30gICAgCisjZW5kaWYKKworc3RhdGljCit2b2lkIHByaW50X3NiaWNfc3RhdHVzKGludCBhc3IsIGludCBzc3IsIGludCBjbWRwaGFzZSkKK3sKKyNpZmRlZiBDT05GSUdfQUNPUk5TQ1NJX0NPTlNUQU5UUworICAgIHByaW50aygic2JpYzogJWMlYyVjJWMlYyVjICIsCisJICAgIGFzciAmIEFTUl9JTlQgPyAnSScgOiAnaScsCisJICAgIGFzciAmIEFTUl9MQ0kgPyAnTCcgOiAnbCcsCisJICAgIGFzciAmIEFTUl9CU1kgPyAnQicgOiAnYicsCisJICAgIGFzciAmIEFTUl9DSVAgPyAnQycgOiAnYycsCisJICAgIGFzciAmIEFTUl9QRSAgPyAnUCcgOiAncCcsCisJICAgIGFzciAmIEFTUl9EQlIgPyAnRCcgOiAnZCcpOworICAgIHByaW50aygic2NzaTogIik7CisgICAgcHJpbnRfc2NzaV9zdGF0dXMoc3NyKTsKKyAgICBwcmludGsoIiBwaCAlMDJYXG4iLCBjbWRwaGFzZSk7CisjZWxzZQorICAgIHByaW50aygic2JpYzogJTAyWCBzY3NpOiAlWDolWCBwaDogJTAyWFxuIiwKKwkgICAgYXNyLCAoc3NyICYgMHhmMCk+PjQsIHNzciAmIDB4MGYsIGNtZHBoYXNlKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYWNvcm5zY3NpX2R1bXBsb2dsaW5lKEFTX0hvc3QgKmhvc3QsIGludCB0YXJnZXQsIGludCBsaW5lKQoreworCXVuc2lnbmVkIGxvbmcgcHJldjsKKwlzaWduZWQgaW50IHB0cjsKKworCXB0ciA9IGhvc3QtPnN0YXR1c19wdHJbdGFyZ2V0XSAtIFNUQVRVU19CVUZGRVJfVE9fUFJJTlQ7CisJaWYgKHB0ciA8IDApCisJCXB0ciArPSBTVEFUVVNfQlVGRkVSX1NJWkU7CisKKwlwcmludGsoIiVjOiAlM3M6IiwgdGFyZ2V0ID09IDggPyAnSCcgOiAnMCcgKyB0YXJnZXQsCisJCWxpbmUgPT0gMCA/ICJwaCIgOiBsaW5lID09IDEgPyAic3NyIiA6ICJpbnQiKTsKKworCXByZXYgPSBob3N0LT5zdGF0dXNbdGFyZ2V0XVtwdHJdLndoZW47CisKKwlmb3IgKDsgcHRyICE9IGhvc3QtPnN0YXR1c19wdHJbdGFyZ2V0XTsgcHRyID0gKHB0ciArIDEpICYgKFNUQVRVU19CVUZGRVJfU0laRSAtIDEpKSB7CisJCXVuc2lnbmVkIGxvbmcgdGltZV9kaWZmOworCisJCWlmICghaG9zdC0+c3RhdHVzW3RhcmdldF1bcHRyXS53aGVuKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChsaW5lKSB7CisJCWNhc2UgMDoKKwkJCXByaW50aygiJWMlMDJYIiwgaG9zdC0+c3RhdHVzW3RhcmdldF1bcHRyXS5pcnEgPyAnLScgOiAnICcsCisJCQkJCSBob3N0LT5zdGF0dXNbdGFyZ2V0XVtwdHJdLnBoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgMToKKwkJCXByaW50aygiICUwMlgiLCBob3N0LT5zdGF0dXNbdGFyZ2V0XVtwdHJdLnNzcik7CisJCQlicmVhazsKKworCQljYXNlIDI6CisJCQl0aW1lX2RpZmYgPSBob3N0LT5zdGF0dXNbdGFyZ2V0XVtwdHJdLndoZW4gLSBwcmV2OworCQkJcHJldiA9IGhvc3QtPnN0YXR1c1t0YXJnZXRdW3B0cl0ud2hlbjsKKwkJCWlmICh0aW1lX2RpZmYgPT0gMCkKKwkJCQlwcmludGsoIj09XiIpOworCQkJZWxzZSBpZiAodGltZV9kaWZmID49IDEwMCkKKwkJCQlwcmludGsoIiAgICIpOworCQkJZWxzZQorCQkJCXByaW50aygiICUwMmxkIiwgdGltZV9kaWZmKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcHJpbnRrKCJcbiIpOworfQorCitzdGF0aWMKK3ZvaWQgYWNvcm5zY3NpX2R1bXBsb2coQVNfSG9zdCAqaG9zdCwgaW50IHRhcmdldCkKK3sKKyAgICBkbyB7CisJYWNvcm5zY3NpX2R1bXBsb2dsaW5lKGhvc3QsIHRhcmdldCwgMCk7CisJYWNvcm5zY3NpX2R1bXBsb2dsaW5lKGhvc3QsIHRhcmdldCwgMSk7CisJYWNvcm5zY3NpX2R1bXBsb2dsaW5lKGhvc3QsIHRhcmdldCwgMik7CisKKwlpZiAodGFyZ2V0ID09IDgpCisJICAgIGJyZWFrOworCisJdGFyZ2V0ID0gODsKKyAgICB9IHdoaWxlICgxKTsKK30KKworc3RhdGljCitjaGFyIGFjb3Juc2NzaV90YXJnZXQoQVNfSG9zdCAqaG9zdCkKK3sKKwlpZiAoaG9zdC0+U0NwbnQpCisJCXJldHVybiAnMCcgKyBob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZDsKKwlyZXR1cm4gJ0gnOworfQorCisvKgorICogUHJvdG90eXBlOiBjbWR0eXBlX3QgYWNvcm5zY3NpX2NtZHR5cGUoaW50IGNvbW1hbmQpCisgKiBQdXJwb3NlICA6IGRpZmZlcmVudGlhdGUgUkVBRCBmcm9tIFdSSVRFIGZyb20gb3RoZXIgY29tbWFuZHMKKyAqIFBhcmFtcyAgIDogY29tbWFuZCAtIGNvbW1hbmQgdG8gaW50ZXJwcmV0CisgKiBSZXR1cm5zICA6IENNRF9SRUFECS0gY29tbWFuZCByZWFkcyBkYXRhLAorICoJICAgICAgQ01EX1dSSVRFIC0gY29tbWFuZCB3cml0ZXMgZGF0YSwKKyAqCSAgICAgIENNRF9NSVNDCS0gZXZlcnl0aGluZyBlbHNlCisgKi8KK3N0YXRpYyBpbmxpbmUKK2NtZHR5cGVfdCBhY29ybnNjc2lfY21kdHlwZShpbnQgY29tbWFuZCkKK3sKKyAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICBjYXNlIFdSSVRFXzY6ICBjYXNlIFdSSVRFXzEwOiAgY2FzZSBXUklURV8xMjoKKwlyZXR1cm4gQ01EX1dSSVRFOworICAgIGNhc2UgUkVBRF82OiAgIGNhc2UgUkVBRF8xMDogICBjYXNlIFJFQURfMTI6CisJcmV0dXJuIENNRF9SRUFEOworICAgIGRlZmF1bHQ6CisJcmV0dXJuIENNRF9NSVNDOworICAgIH0KK30KKworLyoKKyAqIFByb3RvdHlwZTogaW50IGFjb3Juc2NzaV9kYXRhZGlyZWN0aW9uKGludCBjb21tYW5kKQorICogUHVycG9zZSAgOiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gY29tbWFuZHMgdGhhdCBoYXZlIGEgREFUQSBJTiBwaGFzZQorICoJICAgICAgYW5kIGEgREFUQSBPVVQgcGhhc2UKKyAqIFBhcmFtcyAgIDogY29tbWFuZCAtIGNvbW1hbmQgdG8gaW50ZXJwcmV0CisgKiBSZXR1cm5zICA6IERBVEFESVJfT1VUIC0gZGF0YSBvdXQgcGhhc2UgZXhwZWN0ZWQKKyAqCSAgICAgIERBVEFESVJfSU4gIC0gZGF0YSBpbiBwaGFzZSBleHBlY3RlZAorICovCitzdGF0aWMKK2RhdGFkaXJfdCBhY29ybnNjc2lfZGF0YWRpcmVjdGlvbihpbnQgY29tbWFuZCkKK3sKKyAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICBjYXNlIENIQU5HRV9ERUZJTklUSU9OOgljYXNlIENPTVBBUkU6CQljYXNlIENPUFk6CisgICAgY2FzZSBDT1BZX1ZFUklGWToJCWNhc2UgTE9HX1NFTEVDVDoJY2FzZSBNT0RFX1NFTEVDVDoKKyAgICBjYXNlIE1PREVfU0VMRUNUXzEwOgljYXNlIFNFTkRfRElBR05PU1RJQzoJY2FzZSBXUklURV9CVUZGRVI6CisgICAgY2FzZSBGT1JNQVRfVU5JVDoJCWNhc2UgUkVBU1NJR05fQkxPQ0tTOgljYXNlIFJFU0VSVkU6CisgICAgY2FzZSBTRUFSQ0hfRVFVQUw6CQljYXNlIFNFQVJDSF9ISUdIOgljYXNlIFNFQVJDSF9MT1c6CisgICAgY2FzZSBXUklURV82OgkJY2FzZSBXUklURV8xMDoJCWNhc2UgV1JJVEVfVkVSSUZZOgorICAgIGNhc2UgVVBEQVRFX0JMT0NLOgkJY2FzZSBXUklURV9MT05HOgljYXNlIFdSSVRFX1NBTUU6CisgICAgY2FzZSBTRUFSQ0hfSElHSF8xMjoJY2FzZSBTRUFSQ0hfRVFVQUxfMTI6CWNhc2UgU0VBUkNIX0xPV18xMjoKKyAgICBjYXNlIFdSSVRFXzEyOgkJY2FzZSBXUklURV9WRVJJRllfMTI6CWNhc2UgU0VUX1dJTkRPVzoKKyAgICBjYXNlIE1FRElVTV9TQ0FOOgkJY2FzZSBTRU5EX1ZPTFVNRV9UQUc6CWNhc2UgMHhlYToKKwlyZXR1cm4gREFUQURJUl9PVVQ7CisgICAgZGVmYXVsdDoKKwlyZXR1cm4gREFUQURJUl9JTjsKKyAgICB9Cit9CisKKy8qCisgKiBQdXJwb3NlICA6IHByb3ZpZGUgdmFsdWVzIGZvciBzeW5jaHJvbm91cyB0cmFuc2ZlcnMgd2l0aCAzM0M5My4KKyAqIENvcHlyaWdodDogQ29weXJpZ2h0IChjKSAxOTk2IEpvaG4gU2hpZmZsZXR0LCBHZW9Mb2cgQ29uc3VsdGluZworICoJTW9kaWZpZWQgYnkgUnVzc2VsbCBLaW5nIGZvciA4TUh6IFdEMzNDOTNBCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3luY194ZmVyX3RibCB7CisgICAgdW5zaWduZWQgaW50IHBlcmlvZF9uczsKKyAgICB1bnNpZ25lZCBjaGFyIHJlZ192YWx1ZTsKK30gc3luY194ZmVyX3RhYmxlW10gPSB7CisgICAgewkxLCAweDIwIH0sICAgIHsgMjQ5LCAweDIwIH0sCXsgMzc0LCAweDMwIH0sCisgICAgeyA0OTksIDB4NDAgfSwgICAgeyA2MjQsIDB4NTAgfSwJeyA3NDksIDB4NjAgfSwKKyAgICB7IDg3NCwgMHg3MCB9LCAgICB7IDk5OSwgMHgwMCB9LAl7ICAgMCwJICAwIH0KK307CisKKy8qCisgKiBQcm90b3R5cGU6IGludCBhY29ybnNjc2lfZ2V0cGVyaW9kKHVuc2lnbmVkIGNoYXIgc3luY3hmZXIpCisgKiBQdXJwb3NlICA6IHBlcmlvZCBmb3IgdGhlIHN5bmNocm9ub3VzIHRyYW5zZmVyIHNldHRpbmcKKyAqIFBhcmFtcyAgIDogc3luY3hmZXIgU1lOQ1hGRVIgcmVnaXN0ZXIgdmFsdWUKKyAqIFJldHVybnMgIDogcGVyaW9kIGluIG5zLgorICovCitzdGF0aWMKK2ludCBhY29ybnNjc2lfZ2V0cGVyaW9kKHVuc2lnbmVkIGNoYXIgc3luY3hmZXIpCit7CisgICAgaW50IGk7CisKKyAgICBzeW5jeGZlciAmPSAweGYwOworICAgIGlmIChzeW5jeGZlciA9PSAweDEwKQorCXN5bmN4ZmVyID0gMDsKKworICAgIGZvciAoaSA9IDE7IHN5bmNfeGZlcl90YWJsZVtpXS5wZXJpb2RfbnM7IGkrKykKKwlpZiAoc3luY3hmZXIgPT0gc3luY194ZmVyX3RhYmxlW2ldLnJlZ192YWx1ZSkKKwkgICAgcmV0dXJuIHN5bmNfeGZlcl90YWJsZVtpXS5wZXJpb2RfbnM7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm90b3R5cGU6IGludCByb3VuZF9wZXJpb2QodW5zaWduZWQgaW50IHBlcmlvZCkKKyAqIFB1cnBvc2UgIDogcmV0dXJuIGluZGV4IGludG8gYWJvdmUgdGFibGUgZm9yIGEgcmVxdWlyZWQgUkVRIHBlcmlvZAorICogUGFyYW1zICAgOiBwZXJpb2QgLSB0aW1lIChucykgZm9yIFJFUQorICogUmV0dXJucyAgOiB0YWJsZSBpbmRleAorICogQ29weXJpZ2h0OiBDb3B5cmlnaHQgKGMpIDE5OTYgSm9obiBTaGlmZmxldHQsIEdlb0xvZyBDb25zdWx0aW5nCisgKi8KK3N0YXRpYyBpbmxpbmUKK2ludCByb3VuZF9wZXJpb2QodW5zaWduZWQgaW50IHBlcmlvZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDE7IHN5bmNfeGZlcl90YWJsZVtpXS5wZXJpb2RfbnM7IGkrKykgeworCWlmICgocGVyaW9kIDw9IHN5bmNfeGZlcl90YWJsZVtpXS5wZXJpb2RfbnMpICYmCisJICAgIChwZXJpb2QgPiBzeW5jX3hmZXJfdGFibGVbaSAtIDFdLnBlcmlvZF9ucykpCisJICAgIHJldHVybiBpOworICAgIH0KKyAgICByZXR1cm4gNzsKK30KKworLyoKKyAqIFByb3RvdHlwZTogdW5zaWduZWQgY2hhciBjYWxjX3N5bmNfeGZlcih1bnNpZ25lZCBpbnQgcGVyaW9kLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQorICogUHVycG9zZSAgOiBjYWxjdWxhdGUgdmFsdWUgZm9yIDMzYzkzcyBTWU5DIHJlZ2lzdGVyCisgKiBQYXJhbXMgICA6IHBlcmlvZCAtIHRpbWUgKG5zKSBmb3IgUkVRCisgKgkgICAgICBvZmZzZXQgLSBvZmZzZXQgaW4gYnl0ZXMgYmV0d2VlbiBSRVEvQUNLCisgKiBSZXR1cm5zICA6IHZhbHVlIGZvciBTWU5DIHJlZ2lzdGVyCisgKiBDb3B5cmlnaHQ6IENvcHlyaWdodCAoYykgMTk5NiBKb2huIFNoaWZmbGV0dCwgR2VvTG9nIENvbnN1bHRpbmcKKyAqLworc3RhdGljCit1bnNpZ25lZCBjaGFyIGNhbGNfc3luY194ZmVyKHVuc2lnbmVkIGludCBwZXJpb2QsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisgICAgcmV0dXJuIHN5bmNfeGZlcl90YWJsZVtyb3VuZF9wZXJpb2QocGVyaW9kKV0ucmVnX3ZhbHVlIHwKKwkJKChvZmZzZXQgPCBTRFRSX1NJWkUpID8gb2Zmc2V0IDogU0RUUl9TSVpFKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21tYW5kIGZ1bmN0aW9ucworICovCisvKgorICogRnVuY3Rpb246IGFjb3Juc2NzaV9raWNrKEFTX0hvc3QgKmhvc3QpCisgKiBQdXJwb3NlIDoga2ljayBuZXh0IGNvbW1hbmQgdG8gaW50ZXJmYWNlCisgKiBQYXJhbXMgIDogaG9zdCAtIGhvc3QgdG8gc2VuZCBjb21tYW5kIHRvCisgKiBSZXR1cm5zIDogSU5UUl9JRExFIGlmIGlkbGUsIG90aGVyd2lzZSBJTlRSX1BST0NFU1NJTkcKKyAqIE5vdGVzICAgOiBpbnRlcnJ1cHRzIGFyZSBhbHdheXMgZGlzYWJsZWQhCisgKi8KK3N0YXRpYworaW50cl9yZXRfdCBhY29ybnNjc2lfa2ljayhBU19Ib3N0ICpob3N0KQoreworICAgIGludCBmcm9tX3F1ZXVlID0gMDsKKyAgICBTY3NpX0NtbmQgKlNDcG50OworCisgICAgLyogZmlyc3QgY2hlY2sgdG8gc2VlIGlmIGEgY29tbWFuZCBpcyB3YWl0aW5nIHRvIGJlIGV4ZWN1dGVkICovCisgICAgU0NwbnQgPSBob3N0LT5vcmlnU0NwbnQ7CisgICAgaG9zdC0+b3JpZ1NDcG50ID0gTlVMTDsKKworICAgIC8qIHJldHJpZXZlIG5leHQgY29tbWFuZCAqLworICAgIGlmICghU0NwbnQpIHsKKwlTQ3BudCA9IHF1ZXVlX3JlbW92ZV9leGNsdWRlKCZob3N0LT5xdWV1ZXMuaXNzdWUsIGhvc3QtPmJ1c3lsdW5zKTsKKwlpZiAoIVNDcG50KQorCSAgICByZXR1cm4gSU5UUl9JRExFOworCisJZnJvbV9xdWV1ZSA9IDE7CisgICAgfQorCisgICAgaWYgKGhvc3QtPnNjc2kuZGlzY29ubmVjdGFibGUgJiYgaG9zdC0+U0NwbnQpIHsKKwlxdWV1ZV9hZGRfY21kX3RhaWwoJmhvc3QtPnF1ZXVlcy5kaXNjb25uZWN0ZWQsIGhvc3QtPlNDcG50KTsKKwlob3N0LT5zY3NpLmRpc2Nvbm5lY3RhYmxlID0gMDsKKyNpZiAoREVCVUcgJiAoREVCVUdfUVVFVUVTfERFQlVHX0RJU0NPTikpCisJREJHKGhvc3QtPlNDcG50LCBwcmludGsoInNjc2klZC4lYzogbW92ZWQgY29tbWFuZCB0byBkaXNjb25uZWN0ZWQgcXVldWVcbiIsCisJCWhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCkpKTsKKyNlbmRpZgorCWhvc3QtPlNDcG50ID0gTlVMTDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHdlIGhhdmUgYW4gaW50ZXJydXB0IHBlbmRpbmcsIHRoZW4gd2UgbWF5IGhhdmUgYmVlbiByZXNlbGVjdGVkLgorICAgICAqIEluIHRoaXMgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byB3cml0ZSB0byB0aGUgcmVnaXN0ZXJzCisgICAgICovCisgICAgaWYgKCEoc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfQVNSKSAmIChBU1JfSU5UfEFTUl9CU1l8QVNSX0NJUCkpKSB7CisJc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX0RFU1RJRCwgU0NwbnQtPmRldmljZS0+aWQpOworCXNiaWNfYXJtX3dyaXRlKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19DTU5ELCBDTU5EX1NFTFdJVEhBVE4pOworICAgIH0KKworICAgIC8qCisgICAgICogY2xhaW0gaG9zdCBidXN5IC0gYWxsIG9mIHRoZXNlIG11c3QgaGFwcGVuIGF0b21pY2FsbHkgd3J0CisgICAgICogb3VyIGludGVycnVwdCByb3V0aW5lLiAgRmFpbHVyZSBtZWFucyBjb21tYW5kIGxvc3MuCisgICAgICovCisgICAgaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX0NPTk5FQ1RJTkc7CisgICAgaG9zdC0+U0NwbnQgPSBTQ3BudDsKKyAgICBob3N0LT5zY3NpLlNDcCA9IFNDcG50LT5TQ3A7CisgICAgaG9zdC0+ZG1hLnhmZXJfc2V0dXAgPSAwOworICAgIGhvc3QtPmRtYS54ZmVyX3JlcXVpcmVkID0gMDsKKyAgICBob3N0LT5kbWEueGZlcl9kb25lID0gMDsKKworI2lmIChERUJVRyAmIChERUJVR19BQk9SVHxERUJVR19DT05ORUNUKSkKKyAgICBEQkcoU0NwbnQscHJpbnRrKCJzY3NpJWQuJWM6IHN0YXJ0aW5nIGNtZCAlMDJYXG4iLAorCSAgICBob3N0LT5ob3N0LT5ob3N0X25vLCAnMCcgKyBTQ3BudC0+ZGV2aWNlLT5pZCwKKwkgICAgU0NwbnQtPmNtbmRbMF0pKTsKKyNlbmRpZgorCisgICAgaWYgKGZyb21fcXVldWUpIHsKKyNpZmRlZiBDT05GSUdfU0NTSV9BQ09STlNDU0lfVEFHR0VEX1FVRVVFCisJLyoKKwkgKiB0YWdnZWQgcXVldWVpbmcgLSBhbGxvY2F0ZSBhIG5ldyB0YWcgdG8gdGhpcyBjb21tYW5kCisJICovCisJaWYgKFNDcG50LT5kZXZpY2UtPnNpbXBsZV90YWdzKSB7CisJICAgIFNDcG50LT5kZXZpY2UtPmN1cnJlbnRfdGFnICs9IDE7CisJICAgIGlmIChTQ3BudC0+ZGV2aWNlLT5jdXJyZW50X3RhZyA9PSAwKQorCQlTQ3BudC0+ZGV2aWNlLT5jdXJyZW50X3RhZyA9IDE7CisJICAgIFNDcG50LT50YWcgPSBTQ3BudC0+ZGV2aWNlLT5jdXJyZW50X3RhZzsKKwl9IGVsc2UKKyNlbmRpZgorCSAgICBzZXRfYml0KFNDcG50LT5kZXZpY2UtPmlkICogOCArIFNDcG50LT5kZXZpY2UtPmx1biwgaG9zdC0+YnVzeWx1bnMpOworCisJaG9zdC0+c3RhdHMucmVtb3ZlcyArPSAxOworCisJc3dpdGNoIChhY29ybnNjc2lfY21kdHlwZShTQ3BudC0+Y21uZFswXSkpIHsKKwljYXNlIENNRF9XUklURToKKwkgICAgaG9zdC0+c3RhdHMud3JpdGVzICs9IDE7CisJICAgIGJyZWFrOworCWNhc2UgQ01EX1JFQUQ6CisJICAgIGhvc3QtPnN0YXRzLnJlYWRzICs9IDE7CisJICAgIGJyZWFrOworCWNhc2UgQ01EX01JU0M6CisJICAgIGhvc3QtPnN0YXRzLm1pc2NzICs9IDE7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gSU5UUl9QUk9DRVNTSU5HOworfSAgICAKKworLyoKKyAqIEZ1bmN0aW9uOiB2b2lkIGFjb3Juc2NzaV9kb25lKEFTX0hvc3QgKmhvc3QsIFNjc2lfQ21uZCAqKlNDcG50cCwgdW5zaWduZWQgaW50IHJlc3VsdCkKKyAqIFB1cnBvc2UgOiBjb21wbGV0ZSBwcm9jZXNzaW5nIGZvciBjb21tYW5kCisgKiBQYXJhbXMgIDogaG9zdCAgIC0gaW50ZXJmYWNlIHRoYXQgY29tcGxldGVkCisgKgkgICAgIHJlc3VsdCAtIGRyaXZlciBieXRlIG9mIHJlc3VsdAorICovCitzdGF0aWMKK3ZvaWQgYWNvcm5zY3NpX2RvbmUoQVNfSG9zdCAqaG9zdCwgU2NzaV9DbW5kICoqU0NwbnRwLCB1bnNpZ25lZCBpbnQgcmVzdWx0KQoreworICAgIFNjc2lfQ21uZCAqU0NwbnQgPSAqU0NwbnRwOworCisgICAgLyogY2xlYW4gdXAgKi8KKyAgICBzYmljX2FybV93cml0ZShob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfU09VUkNFSUQsIFNPVVJDRUlEX0VSIHwgU09VUkNFSURfRFNQKTsKKworICAgIGhvc3QtPnN0YXRzLmZpbnMgKz0gMTsKKworICAgIGlmIChTQ3BudCkgeworCSpTQ3BudHAgPSBOVUxMOworCisJYWNvcm5zY3NpX2RtYV9jbGVhbnVwKGhvc3QpOworCisJU0NwbnQtPnJlc3VsdCA9IHJlc3VsdCA8PCAxNiB8IGhvc3QtPnNjc2kuU0NwLk1lc3NhZ2UgPDwgOCB8IGhvc3QtPnNjc2kuU0NwLlN0YXR1czsKKworCS8qCisJICogSW4gdGhlb3J5LCB0aGlzIHNob3VsZCBub3QgaGFwcGVuLiAgSW4gcHJhY3RpY2UsIGl0IHNlZW1zIHRvLgorCSAqIE9ubHkgdHJpZ2dlciBhbiBlcnJvciBpZiB0aGUgZGV2aWNlIGF0dGVtcHRzIHRvIHJlcG9ydCBhbGwgaGFwcHkKKwkgKiBidXQgd2l0aCB1bnRyYW5zZmVycmVkIGJ1ZmZlcnMuLi4gIElmIHdlIGRvbid0IGRvIHNvbWV0aGluZywgdGhlbgorCSAqIGRhdGEgbG9zcyB3aWxsIG9jY3VyLiAgU2hvdWxkIHdlIGNoZWNrIFNDcG50LT51bmRlcmZsb3cgaGVyZT8KKwkgKiBJdCBkb2Vzbid0IGFwcGVhciB0byBiZSBzZXQgdG8gc29tZXRoaW5nIG1lYW5pbmdmdWwgYnkgdGhlIGhpZ2hlcgorCSAqIGxldmVscyBhbGwgdGhlIHRpbWUuCisJICovCisJaWYgKHJlc3VsdCA9PSBESURfT0spIHsKKwkJaW50IHhmZXJfd2FybiA9IDA7CisKKwkJaWYgKFNDcG50LT51bmRlcmZsb3cgPT0gMCkgeworCQkJaWYgKGhvc3QtPnNjc2kuU0NwLnB0ciAmJgorCQkJICAgIGFjb3Juc2NzaV9jbWR0eXBlKFNDcG50LT5jbW5kWzBdKSAhPSBDTURfTUlTQykKKwkJCQl4ZmVyX3dhcm4gPSAxOworCQl9IGVsc2UgeworCQkJaWYgKGhvc3QtPnNjc2kuU0NwLnNjc2lfeGZlcnJlZCA8IFNDcG50LT51bmRlcmZsb3cgfHwKKwkJCSAgICBob3N0LT5zY3NpLlNDcC5zY3NpX3hmZXJyZWQgIT0gaG9zdC0+ZG1hLnRyYW5zZmVycmVkKQorCQkJCXhmZXJfd2FybiA9IDE7CisJCX0KKworCQkvKiBBTlNJIHN0YW5kYXJkIHNheXM6IChTQ1NJLTIgUmV2IDEwYyBTZWN0IDUuNi42KQorCQkgKiAgVGFyZ2V0cyB3aGljaCBicmVhayBkYXRhIHRyYW5zZmVycyBpbnRvIG11bHRpcGxlCisJCSAqICBjb25uZWN0aW9ucyBzaGFsbCBlbmQgZWFjaCBzdWNjZXNzZnVsIGNvbm5lY3Rpb24KKwkJICogIChleGNlcHQgcG9zc2libHkgdGhlIGxhc3QpIHdpdGggYSBTQVZFIERBVEEKKwkJICogIFBPSU5URVIgLSBESVNDT05ORUNUIG1lc3NhZ2Ugc2VxdWVuY2UuCisJCSAqCisJCSAqIFRoaXMgbWFrZXMgaXQgZGlmZmljdWx0IHRvIGVuc3VyZSB0aGF0IGEgdHJhbnNmZXIgaGFzCisJCSAqIGNvbXBsZXRlZC4gIElmIHdlIHJlYWNoIHRoZSBlbmQgb2YgYSB0cmFuc2ZlciBkdXJpbmcKKwkJICogdGhlIGNvbW1hbmQsIHRoZW4gd2UgY2FuIG9ubHkgaGF2ZSBmaW5pc2hlZCB0aGUgdHJhbnNmZXIuCisJCSAqIHRoZXJlZm9yZSwgaWYgd2Ugc2VlbSB0byBoYXZlIHNvbWUgZGF0YSByZW1haW5pbmcsIHRoaXMKKwkJICogaXMgbm90IGEgcHJvYmxlbS4KKwkJICovCisJCWlmIChob3N0LT5kbWEueGZlcl9kb25lKQorCQkJeGZlcl93YXJuID0gMDsKKworCQlpZiAoeGZlcl93YXJuKSB7CisJCSAgICBzd2l0Y2ggKHN0YXR1c19ieXRlKFNDcG50LT5yZXN1bHQpKSB7CisJCSAgICBjYXNlIENIRUNLX0NPTkRJVElPTjoKKwkJICAgIGNhc2UgQ09NTUFORF9URVJNSU5BVEVEOgorCQkgICAgY2FzZSBCVVNZOgorCQkgICAgY2FzZSBRVUVVRV9GVUxMOgorCQkgICAgY2FzZSBSRVNFUlZBVElPTl9DT05GTElDVDoKKwkJCWJyZWFrOworCisJCSAgICBkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuSDogaW5jb21wbGV0ZSBkYXRhIHRyYW5zZmVyIGRldGVjdGVkOiByZXN1bHQ9JTA4WCBjb21tYW5kPSIsCisJCQkJaG9zdC0+aG9zdC0+aG9zdF9ubywgU0NwbnQtPnJlc3VsdCk7CisJCQlwcmludF9jb21tYW5kKFNDcG50LT5jbW5kKTsKKwkJCWFjb3Juc2NzaV9kdW1wZG1hKGhvc3QsICJkb25lIik7CisJCSAJYWNvcm5zY3NpX2R1bXBsb2coaG9zdCwgU0NwbnQtPmRldmljZS0+aWQpOworCQkJU0NwbnQtPnJlc3VsdCAmPSAweGZmZmY7CisJCQlTQ3BudC0+cmVzdWx0IHw9IERJRF9FUlJPUiA8PCAxNjsKKwkJICAgIH0KKwkJfQorCX0KKworCWlmICghU0NwbnQtPnNjc2lfZG9uZSkKKwkgICAgcGFuaWMoInNjc2klZC5IOiBudWxsIHNjc2lfZG9uZSBmdW5jdGlvbiBpbiBhY29ybnNjc2lfZG9uZSIsIGhvc3QtPmhvc3QtPmhvc3Rfbm8pOworCisJY2xlYXJfYml0KFNDcG50LT5kZXZpY2UtPmlkICogOCArIFNDcG50LT5kZXZpY2UtPmx1biwgaG9zdC0+YnVzeWx1bnMpOworCisJU0NwbnQtPnNjc2lfZG9uZShTQ3BudCk7CisgICAgfSBlbHNlCisJcHJpbnRrKCJzY3NpJWQ6IG51bGwgY29tbWFuZCBpbiBhY29ybnNjc2lfZG9uZSIsIGhvc3QtPmhvc3QtPmhvc3Rfbm8pOworCisgICAgaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX0lETEU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRE1BIHJvdXRpbmVzCisgKi8KKy8qCisgKiBQdXJwb3NlICA6IHVwZGF0ZSBTQ1NJIERhdGEgUG9pbnRlcgorICogTm90ZXMgICAgOiB0aGlzIHdpbGwgb25seSBiZSBvbmUgU0cgZW50cnkgb3IgbGVzcworICovCitzdGF0aWMKK3ZvaWQgYWNvcm5zY3NpX2RhdGFfdXBkYXRlcHRyKEFTX0hvc3QgKmhvc3QsIFNjc2lfUG9pbnRlciAqU0NwLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworICAgIFNDcC0+cHRyICs9IGxlbmd0aDsKKyAgICBTQ3AtPnRoaXNfcmVzaWR1YWwgLT0gbGVuZ3RoOworCisgICAgaWYgKFNDcC0+dGhpc19yZXNpZHVhbCA9PSAwICYmIG5leHRfU0NwKFNDcCkgPT0gMCkKKwlob3N0LT5kbWEueGZlcl9kb25lID0gMTsKK30KKworLyoKKyAqIFByb3RvdHlwZTogdm9pZCBhY29ybnNjc2lfZGF0YV9yZWFkKEFTX0hvc3QgKmhvc3QsIGNoYXIgKnB0ciwKKyAqCQkJCXVuc2lnbmVkIGludCBzdGFydF9hZGRyLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQorICogUHVycG9zZSAgOiByZWFkIGRhdGEgZnJvbSBETUEgUkFNCisgKiBQYXJhbXMgICA6IGhvc3QgLSBob3N0IHRvIHRyYW5zZmVyIGZyb20KKyAqCSAgICAgIHB0ciAgLSBEUkFNIGFkZHJlc3MKKyAqCSAgICAgIHN0YXJ0X2FkZHIgLSBob3N0IG1lbSBhZGRyZXNzCisgKgkgICAgICBsZW5ndGggLSBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIKKyAqIE5vdGVzICAgIDogdGhpcyB3aWxsIG9ubHkgYmUgb25lIFNHIGVudHJ5IG9yIGxlc3MKKyAqLworc3RhdGljCit2b2lkIGFjb3Juc2NzaV9kYXRhX3JlYWQoQVNfSG9zdCAqaG9zdCwgY2hhciAqcHRyLAorCQkJCSB1bnNpZ25lZCBpbnQgc3RhcnRfYWRkciwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKyAgICBleHRlcm4gdm9pZCBfX2Fjb3Juc2NzaV9pbihpbnQgcG9ydCwgY2hhciAqYnVmLCBpbnQgbGVuKTsKKyAgICB1bnNpZ25lZCBpbnQgcGFnZSwgb2Zmc2V0LCBsZW4gPSBsZW5ndGg7CisKKyAgICBwYWdlID0gKHN0YXJ0X2FkZHIgPj4gMTIpOworICAgIG9mZnNldCA9IHN0YXJ0X2FkZHIgJiAoKDEgPDwgMTIpIC0gMSk7CisKKyAgICBvdXRiKChwYWdlICYgMHgzZikgfCBob3N0LT5jYXJkLnBhZ2VfcmVnLCBob3N0LT5jYXJkLmlvX3BhZ2UpOworCisgICAgd2hpbGUgKGxlbiA+IDApIHsKKwl1bnNpZ25lZCBpbnQgdGhpc19sZW47CisKKwlpZiAobGVuICsgb2Zmc2V0ID4gKDEgPDwgMTIpKQorCSAgICB0aGlzX2xlbiA9ICgxIDw8IDEyKSAtIG9mZnNldDsKKwllbHNlCisJICAgIHRoaXNfbGVuID0gbGVuOworCisJX19hY29ybnNjc2lfaW4oaG9zdC0+Y2FyZC5pb19yYW0gKyAob2Zmc2V0IDw8IDEpLCBwdHIsIHRoaXNfbGVuKTsKKworCW9mZnNldCArPSB0aGlzX2xlbjsKKwlwdHIgKz0gdGhpc19sZW47CisJbGVuIC09IHRoaXNfbGVuOworCisJaWYgKG9mZnNldCA9PSAoMSA8PCAxMikpIHsKKwkgICAgb2Zmc2V0ID0gMDsKKwkgICAgcGFnZSArKzsKKwkgICAgb3V0YigocGFnZSAmIDB4M2YpIHwgaG9zdC0+Y2FyZC5wYWdlX3JlZywgaG9zdC0+Y2FyZC5pb19wYWdlKTsKKwl9CisgICAgfQorICAgIG91dGIoaG9zdC0+Y2FyZC5wYWdlX3JlZywgaG9zdC0+Y2FyZC5pb19wYWdlKTsKK30KKworLyoKKyAqIFByb3RvdHlwZTogdm9pZCBhY29ybnNjc2lfZGF0YV93cml0ZShBU19Ib3N0ICpob3N0LCBjaGFyICpwdHIsCisgKgkJCQl1bnNpZ25lZCBpbnQgc3RhcnRfYWRkciwgdW5zaWduZWQgaW50IGxlbmd0aCkKKyAqIFB1cnBvc2UgIDogd3JpdGUgZGF0YSB0byBETUEgUkFNCisgKiBQYXJhbXMgICA6IGhvc3QgLSBob3N0IHRvIHRyYW5zZmVyIGZyb20KKyAqCSAgICAgIHB0ciAgLSBEUkFNIGFkZHJlc3MKKyAqCSAgICAgIHN0YXJ0X2FkZHIgLSBob3N0IG1lbSBhZGRyZXNzCisgKgkgICAgICBsZW5ndGggLSBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIKKyAqIE5vdGVzICAgIDogdGhpcyB3aWxsIG9ubHkgYmUgb25lIFNHIGVudHJ5IG9yIGxlc3MKKyAqLworc3RhdGljCit2b2lkIGFjb3Juc2NzaV9kYXRhX3dyaXRlKEFTX0hvc3QgKmhvc3QsIGNoYXIgKnB0ciwKKwkJCQkgdW5zaWduZWQgaW50IHN0YXJ0X2FkZHIsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisgICAgZXh0ZXJuIHZvaWQgX19hY29ybnNjc2lfb3V0KGludCBwb3J0LCBjaGFyICpidWYsIGludCBsZW4pOworICAgIHVuc2lnbmVkIGludCBwYWdlLCBvZmZzZXQsIGxlbiA9IGxlbmd0aDsKKworICAgIHBhZ2UgPSAoc3RhcnRfYWRkciA+PiAxMik7CisgICAgb2Zmc2V0ID0gc3RhcnRfYWRkciAmICgoMSA8PCAxMikgLSAxKTsKKworICAgIG91dGIoKHBhZ2UgJiAweDNmKSB8IGhvc3QtPmNhcmQucGFnZV9yZWcsIGhvc3QtPmNhcmQuaW9fcGFnZSk7CisKKyAgICB3aGlsZSAobGVuID4gMCkgeworCXVuc2lnbmVkIGludCB0aGlzX2xlbjsKKworCWlmIChsZW4gKyBvZmZzZXQgPiAoMSA8PCAxMikpCisJICAgIHRoaXNfbGVuID0gKDEgPDwgMTIpIC0gb2Zmc2V0OworCWVsc2UKKwkgICAgdGhpc19sZW4gPSBsZW47CisKKwlfX2Fjb3Juc2NzaV9vdXQoaG9zdC0+Y2FyZC5pb19yYW0gKyAob2Zmc2V0IDw8IDEpLCBwdHIsIHRoaXNfbGVuKTsKKworCW9mZnNldCArPSB0aGlzX2xlbjsKKwlwdHIgKz0gdGhpc19sZW47CisJbGVuIC09IHRoaXNfbGVuOworCisJaWYgKG9mZnNldCA9PSAoMSA8PCAxMikpIHsKKwkgICAgb2Zmc2V0ID0gMDsKKwkgICAgcGFnZSArKzsKKwkgICAgb3V0YigocGFnZSAmIDB4M2YpIHwgaG9zdC0+Y2FyZC5wYWdlX3JlZywgaG9zdC0+Y2FyZC5pb19wYWdlKTsKKwl9CisgICAgfQorICAgIG91dGIoaG9zdC0+Y2FyZC5wYWdlX3JlZywgaG9zdC0+Y2FyZC5pb19wYWdlKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE9uLWJvYXJkIERNQSByb3V0aW5lcworICovCisjaWZkZWYgVVNFX0RNQUMKKy8qCisgKiBQcm90b3R5cGU6IHZvaWQgYWNvcm5zY3NpX2RtYXN0b3AoQVNfSG9zdCAqaG9zdCkKKyAqIFB1cnBvc2UgIDogc3RvcCBhbGwgRE1BCisgKiBQYXJhbXMgICA6IGhvc3QgLSBob3N0IG9uIHdoaWNoIHRvIHN0b3AgRE1BCisgKiBOb3RlcyAgICA6IFRoaXMgaXMgY2FsbGVkIHdoZW4gbGVhdmluZyBEQVRBIElOL09VVCBwaGFzZSwKKyAqCSAgICAgIG9yIHdoZW4gaW50ZXJmYWNlIGlzIFJFU0VUCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgYWNvcm5zY3NpX2RtYV9zdG9wKEFTX0hvc3QgKmhvc3QpCit7CisgICAgZG1hY193cml0ZShob3N0LT5kbWEuaW9fcG9ydCwgRE1BQ19NQVNLUkVHLCBNQVNLX09OKTsKKyAgICBkbWFjX2NsZWFyaW50cihob3N0LT5kbWEuaW9faW50cl9jbGVhcik7CisKKyNpZiAoREVCVUcgJiBERUJVR19ETUEpCisgICAgREJHKGhvc3QtPlNDcG50LCBhY29ybnNjc2lfZHVtcGRtYShob3N0LCAic3RvcCIpKTsKKyNlbmRpZgorfQorCisvKgorICogRnVuY3Rpb246IHZvaWQgYWNvcm5zY3NpX2RtYV9zZXR1cChBU19Ib3N0ICpob3N0LCBkbWFkaXJfdCBkaXJlY3Rpb24pCisgKiBQdXJwb3NlIDogc2V0dXAgRE1BIGNvbnRyb2xsZXIgZm9yIGRhdGEgdHJhbnNmZXIKKyAqIFBhcmFtcyAgOiBob3N0IC0gaG9zdCB0byBzZXR1cAorICoJICAgICBkaXJlY3Rpb24gLSBkYXRhIHRyYW5zZmVyIGRpcmVjdGlvbgorICogTm90ZXMgICA6IFRoaXMgaXMgY2FsbGVkIHdoZW4gZW50ZXJpbmcgREFUQSBJL08gcGhhc2UsIG5vdAorICoJICAgICB3aGlsZSB3ZSdyZSBpbiBhIERBVEEgSS9PIHBoYXNlCisgKi8KK3N0YXRpYwordm9pZCBhY29ybnNjc2lfZG1hX3NldHVwKEFTX0hvc3QgKmhvc3QsIGRtYWRpcl90IGRpcmVjdGlvbikKK3sKKyAgICB1bnNpZ25lZCBpbnQgYWRkcmVzcywgbGVuZ3RoLCBtb2RlOworCisgICAgaG9zdC0+ZG1hLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKKworICAgIGRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfTUFTS1JFRywgTUFTS19PTik7CisKKyAgICBpZiAoZGlyZWN0aW9uID09IERNQV9PVVQpIHsKKyNpZiAoREVCVUcgJiBERUJVR19OT19XUklURSkKKwlpZiAoTk9fV1JJVEUgJiAoMSA8PCBob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZCkpIHsKKwkgICAgcHJpbnRrKEtFUk5fQ1JJVCAic2NzaSVkLiVjOiBJIGNhbid0IGhhbmRsZSBETUFfT1VUIVxuIiwKKwkJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCkpOworCSAgICByZXR1cm47CisJfQorI2VuZGlmCisJbW9kZSA9IERNQUNfV1JJVEU7CisgICAgfSBlbHNlCisJbW9kZSA9IERNQUNfUkVBRDsKKworICAgIC8qCisgICAgICogQWxsb2NhdGUgc29tZSBidWZmZXIgc3BhY2UsIGxpbWl0ZWQgdG8gaGFsZiB0aGUgYnVmZmVyIHNpemUKKyAgICAgKi8KKyAgICBsZW5ndGggPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGhvc3QtPnNjc2kuU0NwLnRoaXNfcmVzaWR1YWwsIERNQUNfQlVGRkVSX1NJWkUgLyAyKTsKKyAgICBpZiAobGVuZ3RoKSB7CisJaG9zdC0+ZG1hLnN0YXJ0X2FkZHIgPSBhZGRyZXNzID0gaG9zdC0+ZG1hLmZyZWVfYWRkcjsKKwlob3N0LT5kbWEuZnJlZV9hZGRyID0gKGhvc3QtPmRtYS5mcmVlX2FkZHIgKyBsZW5ndGgpICYKKwkJCQkoRE1BQ19CVUZGRVJfU0laRSAtIDEpOworCisJLyoKKwkgKiBUcmFuc2ZlciBkYXRhIHRvIERNQSBtZW1vcnkKKwkgKi8KKwlpZiAoZGlyZWN0aW9uID09IERNQV9PVVQpCisJICAgIGFjb3Juc2NzaV9kYXRhX3dyaXRlKGhvc3QsIGhvc3QtPnNjc2kuU0NwLnB0ciwgaG9zdC0+ZG1hLnN0YXJ0X2FkZHIsCisJCQkJbGVuZ3RoKTsKKworCWxlbmd0aCAtPSAxOworCWRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfVFhDTlRMTywgbGVuZ3RoKTsKKwlkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQ05USEksIGxlbmd0aCA+PiA4KTsKKwlkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQURSTE8sIGFkZHJlc3MpOworCWRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfVFhBRFJNRCwgYWRkcmVzcyA+PiA4KTsKKwlkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQURSSEksIDApOworCWRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfTU9ERUNPTiwgbW9kZSk7CisJZG1hY193cml0ZShob3N0LT5kbWEuaW9fcG9ydCwgRE1BQ19NQVNLUkVHLCBNQVNLX09GRik7CisKKyNpZiAoREVCVUcgJiBERUJVR19ETUEpCisJREJHKGhvc3QtPlNDcG50LCBhY29ybnNjc2lfZHVtcGRtYShob3N0LCAic3RydCIpKTsKKyNlbmRpZgorCWhvc3QtPmRtYS54ZmVyX3NldHVwID0gMTsKKyAgICB9Cit9CisKKy8qCisgKiBGdW5jdGlvbjogdm9pZCBhY29ybnNjc2lfZG1hX2NsZWFudXAoQVNfSG9zdCAqaG9zdCkKKyAqIFB1cnBvc2UgOiBlbnN1cmUgdGhhdCBhbGwgRE1BIHRyYW5zZmVycyBhcmUgdXAtdG8tZGF0ZSAmIGhvc3QtPnNjc2kuU0NwIGlzIGNvcnJlY3QKKyAqIFBhcmFtcyAgOiBob3N0IC0gaG9zdCB0byBmaW5pc2gKKyAqIE5vdGVzICAgOiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgY29tbWFuZCBpczoKKyAqCQl0ZXJtaW5hdGluZywgUkVTVE9SRV9QT0lOVEVSUywgU0FWRV9QT0lOVEVSUywgRElTQ09ORUNUCisgKgkgICA6IFRoaXMgbXVzdCBub3QgcmV0dXJuIHVudGlsIGFsbCB0cmFuc2ZlcnMgYXJlIGNvbXBsZXRlZC4KKyAqLworc3RhdGljCit2b2lkIGFjb3Juc2NzaV9kbWFfY2xlYW51cChBU19Ib3N0ICpob3N0KQoreworICAgIGRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfTUFTS1JFRywgTUFTS19PTik7CisgICAgZG1hY19jbGVhcmludHIoaG9zdC0+ZG1hLmlvX2ludHJfY2xlYXIpOworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgYSBwZW5kaW5nIHRyYW5zZmVyCisgICAgICovCisgICAgaWYgKGhvc3QtPmRtYS54ZmVyX3JlcXVpcmVkKSB7CisJaG9zdC0+ZG1hLnhmZXJfcmVxdWlyZWQgPSAwOworCWlmIChob3N0LT5kbWEuZGlyZWN0aW9uID09IERNQV9JTikKKwkgICAgYWNvcm5zY3NpX2RhdGFfcmVhZChob3N0LCBob3N0LT5kbWEueGZlcl9wdHIsCisJCQkJIGhvc3QtPmRtYS54ZmVyX3N0YXJ0LCBob3N0LT5kbWEueGZlcl9sZW5ndGgpOworICAgIH0KKworICAgIC8qCisgICAgICogSGFzIGEgdHJhbnNmZXIgYmVlbiBzZXR1cD8KKyAgICAgKi8KKyAgICBpZiAoaG9zdC0+ZG1hLnhmZXJfc2V0dXApIHsKKwl1bnNpZ25lZCBpbnQgdHJhbnNmZXJyZWQ7CisKKwlob3N0LT5kbWEueGZlcl9zZXR1cCA9IDA7CisKKyNpZiAoREVCVUcgJiBERUJVR19ETUEpCisJREJHKGhvc3QtPlNDcG50LCBhY29ybnNjc2lfZHVtcGRtYShob3N0LCAiY3VwaSIpKTsKKyNlbmRpZgorCisJLyoKKwkgKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIGZyb20gRE1BLgorCSAqLworCXRyYW5zZmVycmVkID0gZG1hY19hZGRyZXNzKGhvc3QtPmRtYS5pb19wb3J0KSAtIGhvc3QtPmRtYS5zdGFydF9hZGRyOworCWhvc3QtPmRtYS50cmFuc2ZlcnJlZCArPSB0cmFuc2ZlcnJlZDsKKworCWlmIChob3N0LT5kbWEuZGlyZWN0aW9uID09IERNQV9JTikKKwkgICAgYWNvcm5zY3NpX2RhdGFfcmVhZChob3N0LCBob3N0LT5zY3NpLlNDcC5wdHIsCisJCQkJIGhvc3QtPmRtYS5zdGFydF9hZGRyLCB0cmFuc2ZlcnJlZCk7CisKKwkvKgorCSAqIFVwZGF0ZSBTQ1NJIHBvaW50ZXJzCisJICovCisJYWNvcm5zY3NpX2RhdGFfdXBkYXRlcHRyKGhvc3QsICZob3N0LT5zY3NpLlNDcCwgdHJhbnNmZXJyZWQpOworI2lmIChERUJVRyAmIERFQlVHX0RNQSkKKwlEQkcoaG9zdC0+U0NwbnQsIGFjb3Juc2NzaV9kdW1wZG1hKGhvc3QsICJjdXBvIikpOworI2VuZGlmCisgICAgfQorfQorCisvKgorICogRnVuY3Rpb246IHZvaWQgYWNvcm5zY3NpX2RtYWNpbnRyKEFTX0hvc3QgKmhvc3QpCisgKiBQdXJwb3NlIDogaGFuZGxlIGludGVycnVwdHMgZnJvbSBETUFDIGRldmljZQorICogUGFyYW1zICA6IGhvc3QgLSBob3N0IHRvIHByb2Nlc3MKKyAqIE5vdGVzICAgOiBJZiByZWFkaW5nLCB3ZSBzY2hlZHVsZSB0aGUgcmVhZCB0byBtYWluIG1lbW9yeSAmCisgKgkgICAgIGFsbG93IHRoZSB0cmFuc2ZlciB0byBjb250aW51ZS4KKyAqCSAgIDogSWYgd3JpdGluZywgd2UgZmlsbCB0aGUgb25ib2FyZCBETUEgbWVtb3J5IGZyb20gbWFpbgorICoJICAgICBtZW1vcnkuCisgKgkgICA6IENhbGxlZCB3aGVuZXZlciBETUFDIGZpbmlzaGVkIGl0J3MgY3VycmVudCB0cmFuc2Zlci4KKyAqLworc3RhdGljCit2b2lkIGFjb3Juc2NzaV9kbWFfaW50cihBU19Ib3N0ICpob3N0KQoreworICAgIHVuc2lnbmVkIGludCBhZGRyZXNzLCBsZW5ndGgsIHRyYW5zZmVycmVkOworCisjaWYgKERFQlVHICYgREVCVUdfRE1BKQorICAgIERCRyhob3N0LT5TQ3BudCwgYWNvcm5zY3NpX2R1bXBkbWEoaG9zdCwgImludGkiKSk7CisjZW5kaWYKKworICAgIGRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfTUFTS1JFRywgTUFTS19PTik7CisgICAgZG1hY19jbGVhcmludHIoaG9zdC0+ZG1hLmlvX2ludHJfY2xlYXIpOworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgYW1vdW50IHRyYW5zZmVycmVkIHZpYSBETUEKKyAgICAgKi8KKyAgICB0cmFuc2ZlcnJlZCA9IGRtYWNfYWRkcmVzcyhob3N0LT5kbWEuaW9fcG9ydCkgLSBob3N0LT5kbWEuc3RhcnRfYWRkcjsKKyAgICBob3N0LT5kbWEudHJhbnNmZXJyZWQgKz0gdHJhbnNmZXJyZWQ7CisKKyAgICAvKgorICAgICAqIFNjaGVkdWxlIERNQSB0cmFuc2ZlciBvZmYgYm9hcmQKKyAgICAgKi8KKyAgICBpZiAoaG9zdC0+ZG1hLmRpcmVjdGlvbiA9PSBETUFfSU4pIHsKKwlob3N0LT5kbWEueGZlcl9zdGFydCA9IGhvc3QtPmRtYS5zdGFydF9hZGRyOworCWhvc3QtPmRtYS54ZmVyX2xlbmd0aCA9IHRyYW5zZmVycmVkOworCWhvc3QtPmRtYS54ZmVyX3B0ciA9IGhvc3QtPnNjc2kuU0NwLnB0cjsKKwlob3N0LT5kbWEueGZlcl9yZXF1aXJlZCA9IDE7CisgICAgfQorCisgICAgYWNvcm5zY3NpX2RhdGFfdXBkYXRlcHRyKGhvc3QsICZob3N0LT5zY3NpLlNDcCwgdHJhbnNmZXJyZWQpOworCisgICAgLyoKKyAgICAgKiBBbGxvY2F0ZSBzb21lIGJ1ZmZlciBzcGFjZSwgbGltaXRlZCB0byBoYWxmIHRoZSBvbi1ib2FyZCBSQU0gc2l6ZQorICAgICAqLworICAgIGxlbmd0aCA9IG1pbl90KHVuc2lnbmVkIGludCwgaG9zdC0+c2NzaS5TQ3AudGhpc19yZXNpZHVhbCwgRE1BQ19CVUZGRVJfU0laRSAvIDIpOworICAgIGlmIChsZW5ndGgpIHsKKwlob3N0LT5kbWEuc3RhcnRfYWRkciA9IGFkZHJlc3MgPSBob3N0LT5kbWEuZnJlZV9hZGRyOworCWhvc3QtPmRtYS5mcmVlX2FkZHIgPSAoaG9zdC0+ZG1hLmZyZWVfYWRkciArIGxlbmd0aCkgJgorCQkJCShETUFDX0JVRkZFUl9TSVpFIC0gMSk7CisKKwkvKgorCSAqIFRyYW5zZmVyIGRhdGEgdG8gRE1BIG1lbW9yeQorCSAqLworCWlmIChob3N0LT5kbWEuZGlyZWN0aW9uID09IERNQV9PVVQpCisJICAgIGFjb3Juc2NzaV9kYXRhX3dyaXRlKGhvc3QsIGhvc3QtPnNjc2kuU0NwLnB0ciwgaG9zdC0+ZG1hLnN0YXJ0X2FkZHIsCisJCQkJbGVuZ3RoKTsKKworCWxlbmd0aCAtPSAxOworCWRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfVFhDTlRMTywgbGVuZ3RoKTsKKwlkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQ05USEksIGxlbmd0aCA+PiA4KTsKKwlkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQURSTE8sIGFkZHJlc3MpOworCWRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfVFhBRFJNRCwgYWRkcmVzcyA+PiA4KTsKKwlkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQURSSEksIDApOworCWRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfTUFTS1JFRywgTUFTS19PRkYpOworCisjaWYgKERFQlVHICYgREVCVUdfRE1BKQorCURCRyhob3N0LT5TQ3BudCwgYWNvcm5zY3NpX2R1bXBkbWEoaG9zdCwgImludG8iKSk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworCWhvc3QtPmRtYS54ZmVyX3NldHVwID0gMDsKKyNpZiAwCisJLyoKKwkgKiBJZiB0aGUgaW50ZXJmYWNlIHN0aWxsIHdhbnRzIG1vcmUsIHRoZW4gdGhpcyBpcyBhbiBlcnJvci4KKwkgKiBXZSBnaXZlIGl0IGFub3RoZXIgYnl0ZSwgYnV0IHdlIGFsc28gYXR0ZW1wdCB0byByYWlzZSBhbgorCSAqIGF0dGVudGlvbiBjb25kaXRpb24uICBXZSBjb250aW51ZSBnaXZpbmcgb25lIGJ5dGUgdW50aWwKKwkgKiB0aGUgZGV2aWNlIHJlY29nbmlzZXMgdGhlIGF0dGVudGlvbi4KKwkgKi8KKwlpZiAoZG1hY19yZWFkKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1NUQVRVUykgJiBTVEFUVVNfUlEwKSB7CisJICAgIGFjb3Juc2NzaV9hYm9ydGNtZChob3N0LCBob3N0LT5TQ3BudC0+dGFnKTsKKworCSAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQ05UTE8sIDApOworCSAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQ05USEksIDApOworCSAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQURSTE8sIDApOworCSAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQURSTUQsIDApOworCSAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQURSSEksIDApOworCSAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX01BU0tSRUcsIE1BU0tfT0ZGKTsKKwl9CisjZW5kaWYKKyAgICB9Cit9CisKKy8qCisgKiBGdW5jdGlvbjogdm9pZCBhY29ybnNjc2lfZG1hX3hmZXIoQVNfSG9zdCAqaG9zdCkKKyAqIFB1cnBvc2UgOiB0cmFuc2ZlciBkYXRhIGJldHdlZW4gQWNvcm5TQ1NJIGFuZCBtZW1vcnkKKyAqIFBhcmFtcyAgOiBob3N0IC0gaG9zdCB0byBwcm9jZXNzCisgKi8KK3N0YXRpYwordm9pZCBhY29ybnNjc2lfZG1hX3hmZXIoQVNfSG9zdCAqaG9zdCkKK3sKKyAgICBob3N0LT5kbWEueGZlcl9yZXF1aXJlZCA9IDA7CisKKyAgICBpZiAoaG9zdC0+ZG1hLmRpcmVjdGlvbiA9PSBETUFfSU4pCisJYWNvcm5zY3NpX2RhdGFfcmVhZChob3N0LCBob3N0LT5kbWEueGZlcl9wdHIsCisJCQkJaG9zdC0+ZG1hLnhmZXJfc3RhcnQsIGhvc3QtPmRtYS54ZmVyX2xlbmd0aCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogdm9pZCBhY29ybnNjc2lfZG1hX2FkanVzdChBU19Ib3N0ICpob3N0KQorICogUHVycG9zZSA6IGFkanVzdCBETUEgcG9pbnRlcnMgJiBjb3VudCBmb3IgYnl0ZXMgdHJhbnNmZXJyZWQgdG8KKyAqCSAgICAgU0JJQyBidXQgbm90IFNDU0kgYnVzLgorICogUGFyYW1zICA6IGhvc3QgLSBob3N0IHRvIGFkanVzdCBETUEgY291bnQgZm9yCisgKi8KK3N0YXRpYwordm9pZCBhY29ybnNjc2lfZG1hX2FkanVzdChBU19Ib3N0ICpob3N0KQoreworICAgIGlmIChob3N0LT5kbWEueGZlcl9zZXR1cCkgeworCXNpZ25lZCBsb25nIHRyYW5zZmVycmVkOworI2lmIChERUJVRyAmIChERUJVR19ETUF8REVCVUdfV1JJVEUpKQorCURCRyhob3N0LT5TQ3BudCwgYWNvcm5zY3NpX2R1bXBkbWEoaG9zdCwgImFkamkiKSk7CisjZW5kaWYKKwkvKgorCSAqIENhbGN1bGF0ZSBjb3JyZWN0IERNQSBhZGRyZXNzIC0gRE1BIGlzIGFoZWFkIG9mIFNDU0kgYnVzIHdoaWxlCisJICogd3JpdGluZy4KKwkgKiAgaG9zdC0+c2NzaS5TQ3Auc2NzaV94ZmVycmVkIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMKKwkgKiAgYWN0dWFsbHkgdHJhbnNmZXJyZWQgdG8vZnJvbSB0aGUgU0NTSSBidXMuCisJICogIGhvc3QtPmRtYS50cmFuc2ZlcnJlZCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkCisJICogIG92ZXIgRE1BIHNpbmNlIGhvc3QtPmRtYS5zdGFydF9hZGRyIHdhcyBsYXN0IHNldC4KKwkgKgorCSAqIHJlYWxfZG1hX2FkZHIgPSBob3N0LT5kbWEuc3RhcnRfYWRkciArIGhvc3QtPnNjc2kuU0NwLnNjc2lfeGZlcnJlZAorCSAqCQkgICAtIGhvc3QtPmRtYS50cmFuc2ZlcnJlZAorCSAqLworCXRyYW5zZmVycmVkID0gaG9zdC0+c2NzaS5TQ3Auc2NzaV94ZmVycmVkIC0gaG9zdC0+ZG1hLnRyYW5zZmVycmVkOworCWlmICh0cmFuc2ZlcnJlZCA8IDApCisJICAgIHByaW50aygic2NzaSVkLiVjOiBBY2shIERNQSB3cml0ZSBjb3JyZWN0aW9uICVsZCA8IDAhXG4iLAorCQkgICAgaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSwgdHJhbnNmZXJyZWQpOworCWVsc2UgaWYgKHRyYW5zZmVycmVkID09IDApCisJICAgIGhvc3QtPmRtYS54ZmVyX3NldHVwID0gMDsKKwllbHNlIHsKKwkgICAgdHJhbnNmZXJyZWQgKz0gaG9zdC0+ZG1hLnN0YXJ0X2FkZHI7CisJICAgIGRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfVFhBRFJMTywgdHJhbnNmZXJyZWQpOworCSAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQURSTUQsIHRyYW5zZmVycmVkID4+IDgpOworCSAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQURSSEksIHRyYW5zZmVycmVkID4+IDE2KTsKKyNpZiAoREVCVUcgJiAoREVCVUdfRE1BfERFQlVHX1dSSVRFKSkKKwkgICAgREJHKGhvc3QtPlNDcG50LCBhY29ybnNjc2lfZHVtcGRtYShob3N0LCAiYWRqbyIpKTsKKyNlbmRpZgorCX0KKyAgICB9Cit9CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERhdGEgSS9PCisgKi8KK3N0YXRpYyBpbnQKK2Fjb3Juc2NzaV93cml0ZV9waW8oQVNfSG9zdCAqaG9zdCwgY2hhciAqYnl0ZXMsIGludCAqcHRyLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgbWF4X3RpbWVvdXQpCit7CisJdW5zaWduZWQgaW50IGFzciwgdGltZW91dCA9IG1heF90aW1lb3V0OworCWludCBteV9wdHIgPSAqcHRyOworCisJd2hpbGUgKG15X3B0ciA8IGxlbikgeworCQlhc3IgPSBzYmljX2FybV9yZWFkKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19BU1IpOworCisJCWlmIChhc3IgJiBBU1JfREJSKSB7CisJCQl0aW1lb3V0ID0gbWF4X3RpbWVvdXQ7CisKKwkJCXNiaWNfYXJtX3dyaXRlKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19EQVRBLCBieXRlc1tteV9wdHIrK10pOworCQl9IGVsc2UgaWYgKGFzciAmIEFTUl9JTlQpCisJCQlicmVhazsKKwkJZWxzZSBpZiAoLS10aW1lb3V0ID09IDApCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCX0KKworCSpwdHIgPSBteV9wdHI7CisKKwlyZXR1cm4gKHRpbWVvdXQgPT0gMCkgPyAtMSA6IDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogdm9pZCBhY29ybnNjc2lfc2VuZGNvbW1hbmQoQVNfSG9zdCAqaG9zdCkKKyAqIFB1cnBvc2UgOiBzZW5kIGEgY29tbWFuZCB0byBhIHRhcmdldAorICogUGFyYW1zICA6IGhvc3QgLSBob3N0IHdoaWNoIGlzIGNvbm5lY3RlZCB0byB0YXJnZXQKKyAqLworc3RhdGljIHZvaWQKK2Fjb3Juc2NzaV9zZW5kY29tbWFuZChBU19Ib3N0ICpob3N0KQoreworICAgIFNjc2lfQ21uZCAqU0NwbnQgPSBob3N0LT5TQ3BudDsKKworICAgIHNiaWNfYXJtX3dyaXRlKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19UUkFOU0NOVEgsIDApOworICAgIHNiaWNfYXJtX3dyaXRlbmV4dChob3N0LT5zY3NpLmlvX3BvcnQsIDApOworICAgIHNiaWNfYXJtX3dyaXRlbmV4dChob3N0LT5zY3NpLmlvX3BvcnQsIFNDcG50LT5jbWRfbGVuIC0gaG9zdC0+c2NzaS5TQ3Auc2VudF9jb21tYW5kKTsKKworICAgIGFjb3Juc2NzaV9zYmljX2lzc3VlY21kKGhvc3QsIENNTkRfWEZFUklORk8pOworCisgICAgaWYgKGFjb3Juc2NzaV93cml0ZV9waW8oaG9zdCwgU0NwbnQtPmNtbmQsCisJKGludCAqKSZob3N0LT5zY3NpLlNDcC5zZW50X2NvbW1hbmQsIFNDcG50LT5jbWRfbGVuLCAxMDAwMDAwKSkKKwlwcmludGsoInNjc2klZDogdGltZW91dCB3aGlsZSBzZW5kaW5nIGNvbW1hbmRcbiIsIGhvc3QtPmhvc3QtPmhvc3Rfbm8pOworCisgICAgaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX0NPTU1BTkQ7Cit9CisKK3N0YXRpYwordm9pZCBhY29ybnNjc2lfc2VuZG1lc3NhZ2UoQVNfSG9zdCAqaG9zdCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgbWVzc2FnZV9sZW5ndGggPSBtc2dxdWV1ZV9tc2dsZW5ndGgoJmhvc3QtPnNjc2kubXNncyk7CisgICAgdW5zaWduZWQgaW50IG1zZ25yOworICAgIHN0cnVjdCBtZXNzYWdlICptc2c7CisKKyNpZiAoREVCVUcgJiBERUJVR19NRVNTQUdFUykKKyAgICBwcmludGsoInNjc2klZC4lYzogc2VuZGluZyBtZXNzYWdlICIsCisJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCkpOworI2VuZGlmCisKKyAgICBzd2l0Y2ggKG1lc3NhZ2VfbGVuZ3RoKSB7CisgICAgY2FzZSAwOgorCWFjb3Juc2NzaV9zYmljX2lzc3VlY21kKGhvc3QsIENNTkRfWEZFUklORk8gfCBDTU5EX1NCVCk7CisKKwlhY29ybnNjc2lfc2JpY193YWl0KGhvc3QsIEFTUl9EQlIsIEFTUl9EQlIsIDEwMDAsICJzZW5kaW5nIG1lc3NhZ2UgMSIpOworCisJc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX0RBVEEsIE5PUCk7CisKKwlob3N0LT5zY3NpLmxhc3RfbWVzc2FnZSA9IE5PUDsKKyNpZiAoREVCVUcgJiBERUJVR19NRVNTQUdFUykKKwlwcmludGsoIk5PUCIpOworI2VuZGlmCisJYnJlYWs7CisKKyAgICBjYXNlIDE6CisJYWNvcm5zY3NpX3NiaWNfaXNzdWVjbWQoaG9zdCwgQ01ORF9YRkVSSU5GTyB8IENNTkRfU0JUKTsKKwltc2cgPSBtc2dxdWV1ZV9nZXRtc2coJmhvc3QtPnNjc2kubXNncywgMCk7CisKKwlhY29ybnNjc2lfc2JpY193YWl0KGhvc3QsIEFTUl9EQlIsIEFTUl9EQlIsIDEwMDAsICJzZW5kaW5nIG1lc3NhZ2UgMiIpOworCisJc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX0RBVEEsIG1zZy0+bXNnWzBdKTsKKworCWhvc3QtPnNjc2kubGFzdF9tZXNzYWdlID0gbXNnLT5tc2dbMF07CisjaWYgKERFQlVHICYgREVCVUdfTUVTU0FHRVMpCisJcHJpbnRfbXNnKG1zZy0+bXNnKTsKKyNlbmRpZgorCWJyZWFrOworCisgICAgZGVmYXVsdDoKKwkvKgorCSAqIEFOU0kgc3RhbmRhcmQgc2F5czogKFNDU0ktMiBSZXYgMTBjIFNlY3QgNS42LjE0KQorCSAqICdXaGVuIGEgdGFyZ2V0IHNlbmRzIHRoaXMgKE1FU1NBR0VfUkVKRUNUKSBtZXNzYWdlLCBpdAorCSAqICBzaGFsbCBjaGFuZ2UgdG8gTUVTU0FHRSBJTiBwaGFzZSBhbmQgc2VuZCB0aGlzIG1lc3NhZ2UKKwkgKiAgcHJpb3IgdG8gcmVxdWVzdGluZyBhZGRpdGlvbmFsIG1lc3NhZ2UgYnl0ZXMgZnJvbSB0aGUKKwkgKiAgaW5pdGlhdG9yLiAgVGhpcyBwcm92aWRlcyBhbiBpbnRlcmxvY2sgc28gdGhhdCB0aGUKKwkgKiAgaW5pdGlhdG9yIGNhbiBkZXRlcm1pbmUgd2hpY2ggbWVzc2FnZSBieXRlIGlzIHJlamVjdGVkLgorCSAqLworCXNiaWNfYXJtX3dyaXRlKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19UUkFOU0NOVEgsIDApOworCXNiaWNfYXJtX3dyaXRlbmV4dChob3N0LT5zY3NpLmlvX3BvcnQsIDApOworCXNiaWNfYXJtX3dyaXRlbmV4dChob3N0LT5zY3NpLmlvX3BvcnQsIG1lc3NhZ2VfbGVuZ3RoKTsKKwlhY29ybnNjc2lfc2JpY19pc3N1ZWNtZChob3N0LCBDTU5EX1hGRVJJTkZPKTsKKworCW1zZ25yID0gMDsKKwl3aGlsZSAoKG1zZyA9IG1zZ3F1ZXVlX2dldG1zZygmaG9zdC0+c2NzaS5tc2dzLCBtc2ducisrKSkgIT0gTlVMTCkgeworCSAgICB1bnNpZ25lZCBpbnQgaTsKKyNpZiAoREVCVUcgJiBERUJVR19NRVNTQUdFUykKKwkgICAgcHJpbnRfbXNnKG1zZyk7CisjZW5kaWYKKwkgICAgaSA9IDA7CisJICAgIGlmIChhY29ybnNjc2lfd3JpdGVfcGlvKGhvc3QsIG1zZy0+bXNnLCAmaSwgbXNnLT5sZW5ndGgsIDEwMDAwMDApKQorCQlwcmludGsoInNjc2klZDogdGltZW91dCB3aGlsZSBzZW5kaW5nIG1lc3NhZ2VcbiIsIGhvc3QtPmhvc3QtPmhvc3Rfbm8pOworCisJICAgIGhvc3QtPnNjc2kubGFzdF9tZXNzYWdlID0gbXNnLT5tc2dbMF07CisJICAgIGlmIChtc2ctPm1zZ1swXSA9PSBFWFRFTkRFRF9NRVNTQUdFKQorCQlob3N0LT5zY3NpLmxhc3RfbWVzc2FnZSB8PSBtc2ctPm1zZ1syXSA8PCA4OworCisJICAgIGlmIChpICE9IG1zZy0+bGVuZ3RoKQorCQlicmVhazsKKwl9CisJYnJlYWs7CisgICAgfQorI2lmIChERUJVRyAmIERFQlVHX01FU1NBR0VTKQorICAgIHByaW50aygiXG4iKTsKKyNlbmRpZgorfQorCisvKgorICogRnVuY3Rpb246IHZvaWQgYWNvcm5zY3NpX3JlYWRzdGF0dXNieXRlKEFTX0hvc3QgKmhvc3QpCisgKiBQdXJwb3NlIDogUmVhZCBzdGF0dXMgYnl0ZSBmcm9tIGNvbm5lY3RlZCB0YXJnZXQKKyAqIFBhcmFtcyAgOiBob3N0IC0gaG9zdCBjb25uZWN0ZWQgdG8gdGFyZ2V0CisgKi8KK3N0YXRpYwordm9pZCBhY29ybnNjc2lfcmVhZHN0YXR1c2J5dGUoQVNfSG9zdCAqaG9zdCkKK3sKKyAgICBhY29ybnNjc2lfc2JpY19pc3N1ZWNtZChob3N0LCBDTU5EX1hGRVJJTkZPfENNTkRfU0JUKTsKKyAgICBhY29ybnNjc2lfc2JpY193YWl0KGhvc3QsIEFTUl9EQlIsIEFTUl9EQlIsIDEwMDAsICJyZWFkaW5nIHN0YXR1cyBieXRlIik7CisgICAgaG9zdC0+c2NzaS5TQ3AuU3RhdHVzID0gc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfREFUQSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogdW5zaWduZWQgY2hhciBhY29ybnNjc2lfcmVhZG1lc3NhZ2VieXRlKEFTX0hvc3QgKmhvc3QpCisgKiBQdXJwb3NlIDogUmVhZCBvbmUgbWVzc2FnZSBieXRlIGZyb20gY29ubmVjdGVkIHRhcmdldAorICogUGFyYW1zICA6IGhvc3QgLSBob3N0IGNvbm5lY3RlZCB0byB0YXJnZXQKKyAqLworc3RhdGljCit1bnNpZ25lZCBjaGFyIGFjb3Juc2NzaV9yZWFkbWVzc2FnZWJ5dGUoQVNfSG9zdCAqaG9zdCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIG1lc3NhZ2U7CisKKyAgICBhY29ybnNjc2lfc2JpY19pc3N1ZWNtZChob3N0LCBDTU5EX1hGRVJJTkZPIHwgQ01ORF9TQlQpOworCisgICAgYWNvcm5zY3NpX3NiaWNfd2FpdChob3N0LCBBU1JfREJSLCBBU1JfREJSLCAxMDAwLCAiZm9yIG1lc3NhZ2UgYnl0ZSIpOworCisgICAgbWVzc2FnZSA9IHNiaWNfYXJtX3JlYWQoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX0RBVEEpOworCisgICAgLyogd2FpdCBmb3IgTVNHSU4tWEZFUi1QQVVTRUQgKi8KKyAgICBhY29ybnNjc2lfc2JpY193YWl0KGhvc3QsIEFTUl9JTlQsIEFTUl9JTlQsIDEwMDAsICJmb3IgaW50ZXJydXB0IGFmdGVyIG1lc3NhZ2UgYnl0ZSIpOworCisgICAgc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfU1NSKTsKKworICAgIHJldHVybiBtZXNzYWdlOworfQorCisvKgorICogRnVuY3Rpb246IHZvaWQgYWNvcm5zY3NpX21lc3NhZ2UoQVNfSG9zdCAqaG9zdCkKKyAqIFB1cnBvc2UgOiBSZWFkIGNvbXBsZXRlIG1lc3NhZ2UgZnJvbSBjb25uZWN0ZWQgdGFyZ2V0ICYgYWN0aW9uIG1lc3NhZ2UKKyAqIFBhcmFtcyAgOiBob3N0IC0gaG9zdCBjb25uZWN0ZWQgdG8gdGFyZ2V0CisgKi8KK3N0YXRpYwordm9pZCBhY29ybnNjc2lfbWVzc2FnZShBU19Ib3N0ICpob3N0KQoreworICAgIHVuc2lnbmVkIGNoYXIgbWVzc2FnZVsxNl07CisgICAgdW5zaWduZWQgaW50IG1zZ2lkeCA9IDAsIG1zZ2xlbiA9IDE7CisKKyAgICBkbyB7CisJbWVzc2FnZVttc2dpZHhdID0gYWNvcm5zY3NpX3JlYWRtZXNzYWdlYnl0ZShob3N0KTsKKworCXN3aXRjaCAobXNnaWR4KSB7CisJY2FzZSAwOgorCSAgICBpZiAobWVzc2FnZVswXSA9PSBFWFRFTkRFRF9NRVNTQUdFIHx8CisJCShtZXNzYWdlWzBdID49IDB4MjAgJiYgbWVzc2FnZVswXSA8PSAweDJmKSkKKwkJbXNnbGVuID0gMjsKKwkgICAgYnJlYWs7CisKKwljYXNlIDE6CisJICAgIGlmIChtZXNzYWdlWzBdID09IEVYVEVOREVEX01FU1NBR0UpCisJCW1zZ2xlbiArPSBtZXNzYWdlW21zZ2lkeF07CisJICAgIGJyZWFrOworCX0KKwltc2dpZHggKz0gMTsKKwlpZiAobXNnaWR4IDwgbXNnbGVuKSB7CisJICAgIGFjb3Juc2NzaV9zYmljX2lzc3VlY21kKGhvc3QsIENNTkRfTkVHQVRFQUNLKTsKKworCSAgICAvKiB3YWl0IGZvciBuZXh0IG1zZy1pbiAqLworCSAgICBhY29ybnNjc2lfc2JpY193YWl0KGhvc3QsIEFTUl9JTlQsIEFTUl9JTlQsIDEwMDAsICJmb3IgaW50ZXJydXB0IGFmdGVyIG5lZ2F0ZSBhY2siKTsKKwkgICAgc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfU1NSKTsKKwl9CisgICAgfSB3aGlsZSAobXNnaWR4IDwgbXNnbGVuKTsKKworI2lmIChERUJVRyAmIERFQlVHX01FU1NBR0VTKQorICAgIHByaW50aygic2NzaSVkLiVjOiBtZXNzYWdlIGluOiAiLAorCSAgICBob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpKTsKKyAgICBwcmludF9tc2cobWVzc2FnZSk7CisgICAgcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKyAgICBpZiAoaG9zdC0+c2NzaS5waGFzZSA9PSBQSEFTRV9SRUNPTk5FQ1RFRCkgeworCS8qCisJICogQU5TSSBzdGFuZGFyZCBzYXlzOiAoU2VjdGlvbiBTQ1NJLTIgUmV2LiAxMGMgU2VjdCA1LjYuMTcpCisJICogJ1doZW5ldmVyIGEgdGFyZ2V0IHJlY29ubmVjdHMgdG8gYW4gaW5pdGlhdG9yIHRvIGNvbnRpbnVlCisJICogIGEgdGFnZ2VkIEkvTyBwcm9jZXNzLCB0aGUgU0lNUExFIFFVRVVFIFRBRyBtZXNzYWdlIHNoYWxsCisJICogIGJlIHNlbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBJREVOVElGWSBtZXNzYWdlLi4uJworCSAqLworCWlmIChtZXNzYWdlWzBdID09IFNJTVBMRV9RVUVVRV9UQUcpCisJICAgIGhvc3QtPnNjc2kucmVjb25uZWN0ZWQudGFnID0gbWVzc2FnZVsxXTsKKwlpZiAoYWNvcm5zY3NpX3JlY29ubmVjdF9maW5pc2goaG9zdCkpCisJICAgIGhvc3QtPnNjc2kucGhhc2UgPSBQSEFTRV9NU0dJTjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1lc3NhZ2VbMF0pIHsKKyAgICBjYXNlIEFCT1JUOgorICAgIGNhc2UgQUJPUlRfVEFHOgorICAgIGNhc2UgQ09NTUFORF9DT01QTEVURToKKwlpZiAoaG9zdC0+c2NzaS5waGFzZSAhPSBQSEFTRV9TVEFUVVNJTikgeworCSAgICBwcmludGsoS0VSTl9FUlIgInNjc2klZC4lYzogY29tbWFuZCBjb21wbGV0ZSBmb2xsb3dpbmcgbm9uLXN0YXR1cyBpbiBwaGFzZT9cbiIsCisJCSAgICBob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpKTsKKwkgICAgYWNvcm5zY3NpX2R1bXBsb2coaG9zdCwgaG9zdC0+U0NwbnQtPmRldmljZS0+aWQpOworCX0KKwlob3N0LT5zY3NpLnBoYXNlID0gUEhBU0VfRE9ORTsKKwlob3N0LT5zY3NpLlNDcC5NZXNzYWdlID0gbWVzc2FnZVswXTsKKwlicmVhazsKKworICAgIGNhc2UgU0FWRV9QT0lOVEVSUzoKKwkvKgorCSAqIEFOU0kgc3RhbmRhcmQgc2F5czogKFNlY3Rpb24gU0NTSS0yIFJldi4gMTBjIFNlY3QgNS42LjIwKQorCSAqICdUaGUgU0FWRSBEQVRBIFBPSU5URVIgbWVzc2FnZSBpcyBzZW50IGZyb20gYSB0YXJnZXQgdG8KKwkgKiAgZGlyZWN0IHRoZSBpbml0aWF0b3IgdG8gY29weSB0aGUgYWN0aXZlIGRhdGEgcG9pbnRlciB0bworCSAqICB0aGUgc2F2ZWQgZGF0YSBwb2ludGVyIGZvciB0aGUgY3VycmVudCBJL08gcHJvY2Vzcy4KKwkgKi8KKwlhY29ybnNjc2lfZG1hX2NsZWFudXAoaG9zdCk7CisJaG9zdC0+U0NwbnQtPlNDcCA9IGhvc3QtPnNjc2kuU0NwOworCWhvc3QtPlNDcG50LT5TQ3Auc2VudF9jb21tYW5kID0gMDsKKwlob3N0LT5zY3NpLnBoYXNlID0gUEhBU0VfTVNHSU47CisJYnJlYWs7CisKKyAgICBjYXNlIFJFU1RPUkVfUE9JTlRFUlM6CisJLyoKKwkgKiBBTlNJIHN0YW5kYXJkIHNheXM6IChTZWN0aW9uIFNDU0ktMiBSZXYuIDEwYyBTZWN0IDUuNi4xOSkKKwkgKiAnVGhlIFJFU1RPUkUgUE9JTlRFUlMgbWVzc2FnZSBpcyBzZW50IGZyb20gYSB0YXJnZXQgdG8KKwkgKiAgZGlyZWN0IHRoZSBpbml0aWF0b3IgdG8gY29weSB0aGUgbW9zdCByZWNlbnRseSBzYXZlZAorCSAqICBjb21tYW5kLCBkYXRhLCBhbmQgc3RhdHVzIHBvaW50ZXJzIGZvciB0aGUgSS9PIHByb2Nlc3MKKwkgKiAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYWN0aXZlIHBvaW50ZXJzLiAgVGhlIGNvbW1hbmQgYW5kCisJICogIHN0YXR1cyBwb2ludGVycyBzaGFsbCBiZSByZXN0b3JlZCB0byB0aGUgYmVnaW5uaW5nIG9mCisJICogIHRoZSBwcmVzZW50IGNvbW1hbmQgYW5kIHN0YXR1cyBhcmVhcy4nCisJICovCisJYWNvcm5zY3NpX2RtYV9jbGVhbnVwKGhvc3QpOworCWhvc3QtPnNjc2kuU0NwID0gaG9zdC0+U0NwbnQtPlNDcDsKKwlob3N0LT5zY3NpLnBoYXNlID0gUEhBU0VfTVNHSU47CisJYnJlYWs7CisKKyAgICBjYXNlIERJU0NPTk5FQ1Q6CisJLyoKKwkgKiBBTlNJIHN0YW5kYXJkIHNheXM6IChTZWN0aW9uIFNDU0ktMiBSZXYuIDEwYyBTZWN0IDYuNC4yKQorCSAqICdPbiB0aG9zZSBvY2Nhc2lvbnMgd2hlbiBhbiBlcnJvciBvciBleGNlcHRpb24gY29uZGl0aW9uIG9jY3VycworCSAqICBhbmQgdGhlIHRhcmdldCBlbGVjdHMgdG8gcmVwZWF0IHRoZSBpbmZvcm1hdGlvbiB0cmFuc2ZlciwgdGhlCisJICogIHRhcmdldCBtYXkgcmVwZWF0IHRoZSB0cmFuc2ZlciBlaXRoZXIgaXNzdWluZyBhIFJFU1RPUkUgUE9JTlRFUlMKKwkgKiAgbWVzc2FnZSBvciBieSBkaXNjb25uZWN0aW5nIHdpdGhvdXQgaXNzdWluZyBhIFNBVkUgUE9JTlRFUlMKKwkgKiAgbWVzc2FnZS4gIFdoZW4gcmVjb25uZWN0aW9uIGlzIGNvbXBsZXRlZCwgdGhlIG1vc3QgcmVjZW50CisJICogIHNhdmVkIHBvaW50ZXIgdmFsdWVzIGFyZSByZXN0b3JlZC4nCisJICovCisJYWNvcm5zY3NpX2RtYV9jbGVhbnVwKGhvc3QpOworCWhvc3QtPnNjc2kucGhhc2UgPSBQSEFTRV9ESVNDT05ORUNUOworCWJyZWFrOworCisgICAgY2FzZSBNRVNTQUdFX1JFSkVDVDoKKyNpZiAwIC8qIHRoaXMgaXNuJ3QgbmVlZGVkIGFueSBtb3JlICovCisJLyoKKwkgKiBJZiB3ZSB3ZXJlIG5lZ29jaWF0aW5nIHN5bmMgdHJhbnNmZXIsIHdlIGRvbid0IHlldCBrbm93IGlmCisJICogdGhpcyBSRUpFQ1QgaXMgZm9yIHRoZSBzeW5jIHRyYW5zZmVyIG9yIGZvciB0aGUgdGFnZ2VkIHF1ZXVlL3dpZGUKKwkgKiB0cmFuc2Zlci4gIFJlLWluaXRpYXRlIHN5bmMgdHJhbnNmZXIgbmVnb2NpYXRpb24gbm93LCBhbmQgaWYKKwkgKiB3ZSBnb3QgYSBSRUpFQ1QgaW4gcmVzcG9uc2UgdG8gU0RUUiwgdGhlbiBpdCdsbCBiZSBzZXQgdG8gRE9ORS4KKwkgKi8KKwlpZiAoaG9zdC0+ZGV2aWNlW2hvc3QtPlNDcG50LT5kZXZpY2UtPmlkXS5zeW5jX3N0YXRlID09IFNZTkNfU0VOVF9SRVFVRVNUKQorCSAgICBob3N0LT5kZXZpY2VbaG9zdC0+U0NwbnQtPmRldmljZS0+aWRdLnN5bmNfc3RhdGUgPSBTWU5DX05FR09DSUFURTsKKyNlbmRpZgorCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGFueSBtZXNzYWdlcyB3YWl0aW5nIHRvIGdvIG91dCwgdGhlbiBhc3NlcnQgQVROIG5vdworCSAqLworCWlmIChtc2dxdWV1ZV9tc2dsZW5ndGgoJmhvc3QtPnNjc2kubXNncykpCisJICAgIGFjb3Juc2NzaV9zYmljX2lzc3VlY21kKGhvc3QsIENNTkRfQVNTRVJUQVROKTsKKworCXN3aXRjaCAoaG9zdC0+c2NzaS5sYXN0X21lc3NhZ2UpIHsKKyNpZmRlZiBDT05GSUdfU0NTSV9BQ09STlNDU0lfVEFHR0VEX1FVRVVFCisJY2FzZSBIRUFEX09GX1FVRVVFX1RBRzoKKwljYXNlIE9SREVSRURfUVVFVUVfVEFHOgorCWNhc2UgU0lNUExFX1FVRVVFX1RBRzoKKwkgICAgLyoKKwkgICAgICogQU5TSSBzdGFuZGFyZCBzYXlzOiAoU2VjdGlvbiBTQ1NJLTIgUmV2LiAxMGMgU2VjdCA1LjYuMTcpCisJICAgICAqICBJZiBhIHRhcmdldCBkb2VzIG5vdCBpbXBsZW1lbnQgdGFnZ2VkIHF1ZXVpbmcgYW5kIGEgcXVldWUgdGFnCisJICAgICAqICBtZXNzYWdlIGlzIHJlY2VpdmVkLCBpdCBzaGFsbCByZXNwb25kIHdpdGggYSBNRVNTQUdFIFJFSkVDVAorCSAgICAgKiAgbWVzc2FnZSBhbmQgYWNjZXB0IHRoZSBJL08gcHJvY2VzcyBhcyBpZiBpdCB3ZXJlIHVudGFnZ2VkLgorCSAgICAgKi8KKwkgICAgcHJpbnRrKEtFUk5fTk9USUNFICJzY3NpJWQuJWM6IGRpc2FibGluZyB0YWdnZWQgcXVldWVpbmdcbiIsCisJCSAgICBob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpKTsKKwkgICAgaG9zdC0+U0NwbnQtPmRldmljZS0+c2ltcGxlX3RhZ3MgPSAwOworCSAgICBzZXRfYml0KGhvc3QtPlNDcG50LT5kZXZpY2UtPmlkICogOCArIGhvc3QtPlNDcG50LT5kZXZpY2UtPmx1biwgaG9zdC0+YnVzeWx1bnMpOworCSAgICBicmVhazsKKyNlbmRpZgorCWNhc2UgRVhURU5ERURfTUVTU0FHRSB8IChFWFRFTkRFRF9TRFRSIDw8IDgpOgorCSAgICAvKgorCSAgICAgKiBUYXJnZXQgY2FuJ3QgaGFuZGxlIHN5bmNocm9ub3VzIHRyYW5zZmVycworCSAgICAgKi8KKwkgICAgcHJpbnRrKEtFUk5fTk9USUNFICJzY3NpJWQuJWM6IFVzaW5nIGFzeW5jaHJvbm91cyB0cmFuc2ZlclxuIiwKKwkJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCkpOworCSAgICBob3N0LT5kZXZpY2VbaG9zdC0+U0NwbnQtPmRldmljZS0+aWRdLnN5bmNfeGZlciA9IFNZTkNIVFJBTlNGRVJfMkRCQTsKKwkgICAgaG9zdC0+ZGV2aWNlW2hvc3QtPlNDcG50LT5kZXZpY2UtPmlkXS5zeW5jX3N0YXRlID0gU1lOQ19BU1lOQ0hST05PVVM7CisJICAgIHNiaWNfYXJtX3dyaXRlKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19TWU5DSFRSQU5TRkVSLCBob3N0LT5kZXZpY2VbaG9zdC0+U0NwbnQtPmRldmljZS0+aWRdLnN5bmNfeGZlcik7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgYnJlYWs7CisJfQorCWJyZWFrOworCisgICAgY2FzZSBRVUVVRV9GVUxMOgorCS8qIFRPRE86IHRhcmdldCBxdWV1ZSBpcyBmdWxsICovCisJYnJlYWs7CisKKyAgICBjYXNlIFNJTVBMRV9RVUVVRV9UQUc6CisJLyogdGFnIHF1ZXVlIHJlY29ubmVjdC4uLiBtZXNzYWdlWzFdID0gcXVldWUgdGFnLiAgUHJpbnQgc29tZXRoaW5nIHRvIGluZGljYXRlIHNvbWV0aGluZyBoYXBwZW5lZCEgKi8KKwlwcmludGsoInNjc2klZC4lYzogcmVjb25uZWN0IHF1ZXVlIHRhZyAlMDJYXG4iLAorCQlob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpLAorCQltZXNzYWdlWzFdKTsKKwlicmVhazsKKworICAgIGNhc2UgRVhURU5ERURfTUVTU0FHRToKKwlzd2l0Y2ggKG1lc3NhZ2VbMl0pIHsKKyNpZmRlZiBDT05GSUdfU0NTSV9BQ09STlNDU0lfU1lOQworCWNhc2UgRVhURU5ERURfU0RUUjoKKwkgICAgaWYgKGhvc3QtPmRldmljZVtob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZF0uc3luY19zdGF0ZSA9PSBTWU5DX1NFTlRfUkVRVUVTVCkgeworCQkvKgorCQkgKiBXZSByZXF1ZXN0ZWQgc3luY2hyb25vdXMgdHJhbnNmZXJzLiAgVGhpcyBpc24ndCBxdWl0ZSByaWdodC4uLgorCQkgKiBXZSBjYW4gb25seSBzYXkgaWYgdGhpcyBzdWNjZWVkZWQgaWYgd2UgcHJvY2VlZCBvbiB0byBleGVjdXRlIHRoZQorCQkgKiBjb21tYW5kIGZyb20gdGhpcyBtZXNzYWdlLiAgSWYgd2UgZ2V0IGEgTUVTU0FHRSBQQVJJVFkgRVJST1IsCisJCSAqIGFuZCB0aGUgdGFyZ2V0IHJldHJpZXMgZmFpbCwgdGhlbiB3ZSBmYWxsYmFjayB0byBhc3luY2hyb25vdXMgbW9kZQorCQkgKi8KKwkJaG9zdC0+ZGV2aWNlW2hvc3QtPlNDcG50LT5kZXZpY2UtPmlkXS5zeW5jX3N0YXRlID0gU1lOQ19DT01QTEVURUQ7CisJCXByaW50ayhLRVJOX05PVElDRSAic2NzaSVkLiVjOiBVc2luZyBzeW5jaHJvbm91cyB0cmFuc2Zlciwgb2Zmc2V0ICVkLCAlZCBuc1xuIiwKKwkJCWhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCksCisJCQltZXNzYWdlWzRdLCBtZXNzYWdlWzNdICogNCk7CisJCWhvc3QtPmRldmljZVtob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZF0uc3luY194ZmVyID0KKwkJCWNhbGNfc3luY194ZmVyKG1lc3NhZ2VbM10gKiA0LCBtZXNzYWdlWzRdKTsKKwkgICAgfSBlbHNlIHsKKwkJdW5zaWduZWQgY2hhciBwZXJpb2QsIGxlbmd0aDsKKwkJLyoKKwkJICogVGFyZ2V0IHJlcXVlc3RlZCBzeW5jaHJvbm91cyB0cmFuc2ZlcnMuICBUaGUgYWdyZWVtZW50IGlzIG9ubHkKKwkJICogdG8gYmUgaW4gb3BlcmF0aW9uIEFGVEVSIHRoZSB0YXJnZXQgbGVhdmVzIG1lc3NhZ2Ugb3V0IHBoYXNlLgorCQkgKi8KKwkJYWNvcm5zY3NpX3NiaWNfaXNzdWVjbWQoaG9zdCwgQ01ORF9BU1NFUlRBVE4pOworCQlwZXJpb2QgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIG1lc3NhZ2VbM10sIHNkdHJfcGVyaW9kIC8gNCk7CisJCWxlbmd0aCA9IG1pbl90KHVuc2lnbmVkIGludCwgbWVzc2FnZVs0XSwgc2R0cl9zaXplKTsKKwkJbXNncXVldWVfYWRkbXNnKCZob3N0LT5zY3NpLm1zZ3MsIDUsIEVYVEVOREVEX01FU1NBR0UsIDMsCisJCQkJIEVYVEVOREVEX1NEVFIsIHBlcmlvZCwgbGVuZ3RoKTsKKwkJaG9zdC0+ZGV2aWNlW2hvc3QtPlNDcG50LT5kZXZpY2UtPmlkXS5zeW5jX3hmZXIgPQorCQkJY2FsY19zeW5jX3hmZXIocGVyaW9kICogNCwgbGVuZ3RoKTsKKwkgICAgfQorCSAgICBzYmljX2FybV93cml0ZShob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfU1lOQ0hUUkFOU0ZFUiwgaG9zdC0+ZGV2aWNlW2hvc3QtPlNDcG50LT5kZXZpY2UtPmlkXS5zeW5jX3hmZXIpOworCSAgICBicmVhazsKKyNlbHNlCisJICAgIC8qIFdlIGRvIG5vdCBhY2NlcHQgc3luY2hyb25vdXMgdHJhbnNmZXJzLiAgUmVzcG9uZCB3aXRoIGEKKwkgICAgICogTUVTU0FHRV9SRUpFQ1QuCisJICAgICAqLworI2VuZGlmCisKKwljYXNlIEVYVEVOREVEX1dEVFI6CisJICAgIC8qIFRoZSBXRDMzQzkzQSBpcyBvbmx5IDgtYml0LiAgV2UgcmVzcG9uZCB3aXRoIGEgTUVTU0FHRV9SRUpFQ1QKKwkgICAgICogdG8gYSB3aWRlIGRhdGEgdHJhbnNmZXIgcmVxdWVzdC4KKwkgICAgICovCisJZGVmYXVsdDoKKwkgICAgYWNvcm5zY3NpX3NiaWNfaXNzdWVjbWQoaG9zdCwgQ01ORF9BU1NFUlRBVE4pOworCSAgICBtc2dxdWV1ZV9mbHVzaCgmaG9zdC0+c2NzaS5tc2dzKTsKKwkgICAgbXNncXVldWVfYWRkbXNnKCZob3N0LT5zY3NpLm1zZ3MsIDEsIE1FU1NBR0VfUkVKRUNUKTsKKwkgICAgYnJlYWs7CisJfQorCWJyZWFrOworCisjaWZkZWYgQ09ORklHX1NDU0lfQUNPUk5TQ1NJX0xJTksKKyAgICBjYXNlIExJTktFRF9DTURfQ09NUExFVEU6CisgICAgY2FzZSBMSU5LRURfRkxHX0NNRF9DT01QTEVURToKKwkvKgorCSAqIFdlIGRvbid0IHN1cHBvcnQgbGlua2VkIGNvbW1hbmRzIHlldAorCSAqLworCWlmICgwKSB7CisjaWYgKERFQlVHICYgREVCVUdfTElOSykKKwkgICAgcHJpbnRrKCJzY3NpJWQuJWM6IGx1biAlZCB0YWcgJWQgbGlua2VkIGNvbW1hbmQgY29tcGxldGVcbiIsCisJCSAgICBob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpLCBob3N0LT5TQ3BudC0+dGFnKTsKKyNlbmRpZgorCSAgICAvKgorCSAgICAgKiBBIGxpbmtlZCBjb21tYW5kIHNob3VsZCBvbmx5IHRlcm1pbmF0ZSB3aXRoIG9uZSBvZiB0aGVzZSBtZXNzYWdlcworCSAgICAgKiBpZiB0aGVyZSBhcmUgbW9yZSBsaW5rZWQgY29tbWFuZHMgYXZhaWxhYmxlLgorCSAgICAgKi8KKwkgICAgaWYgKCFob3N0LT5TQ3BudC0+bmV4dF9saW5rKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZC4lYzogbHVuICVkIHRhZyAlZCBsaW5rZWQgY29tbWFuZCBjb21wbGV0ZSwgYnV0IG5vIG5leHRfbGlua1xuIiwKKwkJCWluc3RhbmNlLT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpLCBob3N0LT5TQ3BudC0+dGFnKTsKKwkJYWNvcm5zY3NpX3NiaWNfaXNzdWVjbWQoaG9zdCwgQ01ORF9BU1NFUlRBVE4pOworCQltc2dxdWV1ZV9hZGRtc2coJmhvc3QtPnNjc2kubXNncywgMSwgQUJPUlQpOworCSAgICB9IGVsc2UgeworCQlTY3NpX0NtbmQgKlNDcG50ID0gaG9zdC0+U0NwbnQ7CisKKwkJYWNvcm5zY3NpX2RtYV9jbGVhbnVwKGhvc3QpOworCisJCWhvc3QtPlNDcG50ID0gaG9zdC0+U0NwbnQtPm5leHRfbGluazsKKwkJaG9zdC0+U0NwbnQtPnRhZyA9IFNDcG50LT50YWc7CisJCVNDcG50LT5yZXN1bHQgPSBESURfT0sgfCBob3N0LT5zY3NpLlNDcC5NZXNzYWdlIDw8IDggfCBob3N0LT5TY3NpLlNDcC5TdGF0dXM7CisJCVNDcG50LT5kb25lKFNDcG50KTsKKworCQkvKiBpbml0aWFsaXNlIGhvc3QtPlNDcG50LT5TQ3AgKi8KKwkgICAgfQorCSAgICBicmVhazsKKwl9CisjZW5kaWYKKworICAgIGRlZmF1bHQ6IC8qIHJlamVjdCBtZXNzYWdlICovCisJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuJWM6IHVucmVjb2duaXNlZCBtZXNzYWdlICUwMlgsIHJlamVjdGluZ1xuIiwKKwkJaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSwKKwkJbWVzc2FnZVswXSk7CisJYWNvcm5zY3NpX3NiaWNfaXNzdWVjbWQoaG9zdCwgQ01ORF9BU1NFUlRBVE4pOworCW1zZ3F1ZXVlX2ZsdXNoKCZob3N0LT5zY3NpLm1zZ3MpOworCW1zZ3F1ZXVlX2FkZG1zZygmaG9zdC0+c2NzaS5tc2dzLCAxLCBNRVNTQUdFX1JFSkVDVCk7CisJaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX01TR0lOOworCWJyZWFrOworICAgIH0KKyAgICBhY29ybnNjc2lfc2JpY19pc3N1ZWNtZChob3N0LCBDTU5EX05FR0FURUFDSyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogaW50IGFjb3Juc2NzaV9idWlsZG1lc3NhZ2VzKEFTX0hvc3QgKmhvc3QpCisgKiBQdXJwb3NlIDogYnVpbGQgdGhlIGNvbm5lY3Rpb24gbWVzc2FnZXMgZm9yIGEgaG9zdAorICogUGFyYW1zICA6IGhvc3QgLSBob3N0IHRvIGFkZCBtZXNzYWdlcyB0bworICovCitzdGF0aWMKK3ZvaWQgYWNvcm5zY3NpX2J1aWxkbWVzc2FnZXMoQVNfSG9zdCAqaG9zdCkKK3sKKyNpZiAwCisgICAgLyogZG9lcyB0aGUgZGV2aWNlIG5lZWQgcmVzZXR0aW5nPyAqLworICAgIGlmIChjbWRfcmVzZXQpIHsKKwltc2dxdWV1ZV9hZGRtc2coJmhvc3QtPnNjc2kubXNncywgMSwgQlVTX0RFVklDRV9SRVNFVCk7CisJcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgbXNncXVldWVfYWRkbXNnKCZob3N0LT5zY3NpLm1zZ3MsIDEsCisJCSAgICAgSURFTlRJRlkoaG9zdC0+ZGV2aWNlW2hvc3QtPlNDcG50LT5kZXZpY2UtPmlkXS5kaXNjb25uZWN0X29rLAorCQkJICAgICBob3N0LT5TQ3BudC0+ZGV2aWNlLT5sdW4pKTsKKworI2lmIDAKKyAgICAvKiBkb2VzIHRoZSBkZXZpY2UgbmVlZCB0aGUgY3VycmVudCBjb21tYW5kIGFib3J0ZWQgKi8KKyAgICBpZiAoY21kX2Fib3J0ZWQpIHsKKwlhY29ybnNjc2lfYWJvcnRjbWQoaG9zdC0+U0NwbnQtPnRhZyk7CisJcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NDU0lfQUNPUk5TQ1NJX1RBR0dFRF9RVUVVRQorICAgIGlmIChob3N0LT5TQ3BudC0+dGFnKSB7CisJdW5zaWduZWQgaW50IHRhZ190eXBlOworCisJaWYgKGhvc3QtPlNDcG50LT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UgfHwKKwkgICAgaG9zdC0+U0NwbnQtPmNtbmRbMF0gPT0gVEVTVF9VTklUX1JFQURZIHx8CisJICAgIGhvc3QtPlNDcG50LT5jbW5kWzBdID09IElOUVVJUlkpCisJICAgIHRhZ190eXBlID0gSEVBRF9PRl9RVUVVRV9UQUc7CisJZWxzZQorCSAgICB0YWdfdHlwZSA9IFNJTVBMRV9RVUVVRV9UQUc7CisJbXNncXVldWVfYWRkbXNnKCZob3N0LT5zY3NpLm1zZ3MsIDIsIHRhZ190eXBlLCBob3N0LT5TQ3BudC0+dGFnKTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TQ1NJX0FDT1JOU0NTSV9TWU5DCisgICAgaWYgKGhvc3QtPmRldmljZVtob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZF0uc3luY19zdGF0ZSA9PSBTWU5DX05FR09DSUFURSkgeworCWhvc3QtPmRldmljZVtob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZF0uc3luY19zdGF0ZSA9IFNZTkNfU0VOVF9SRVFVRVNUOworCW1zZ3F1ZXVlX2FkZG1zZygmaG9zdC0+c2NzaS5tc2dzLCA1LAorCQkJIEVYVEVOREVEX01FU1NBR0UsIDMsIEVYVEVOREVEX1NEVFIsCisJCQkgc2R0cl9wZXJpb2QgLyA0LCBzZHRyX3NpemUpOworICAgIH0KKyNlbmRpZgorfQorCisvKgorICogRnVuY3Rpb246IGludCBhY29ybnNjc2lfc3RhcnR0cmFuc2ZlcihBU19Ib3N0ICpob3N0KQorICogUHVycG9zZSA6IHRyYW5zZmVyIGRhdGEgdG8vZnJvbSBjb25uZWN0ZWQgdGFyZ2V0CisgKiBQYXJhbXMgIDogaG9zdCAtIGhvc3QgdG8gd2hpY2ggdGFyZ2V0IGlzIGNvbm5lY3RlZAorICogUmV0dXJucyA6IDAgaWYgZmFpbHVyZQorICovCitzdGF0aWMKK2ludCBhY29ybnNjc2lfc3RhcnR0cmFuc2ZlcihBU19Ib3N0ICpob3N0KQoreworICAgIGludCByZXNpZHVhbDsKKworICAgIGlmICghaG9zdC0+c2NzaS5TQ3AucHRyIC8qJiYgaG9zdC0+c2NzaS5TQ3AudGhpc19yZXNpZHVhbCovKSB7CisJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuJWM6IG51bGwgYnVmZmVyIHBhc3NlZCB0byBhY29ybnNjc2lfc3RhcnR0cmFuc2ZlclxuIiwKKwkJaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSk7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgcmVzaWR1YWwgPSBob3N0LT5TQ3BudC0+cmVxdWVzdF9idWZmbGVuIC0gaG9zdC0+c2NzaS5TQ3Auc2NzaV94ZmVycmVkOworCisgICAgc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1NZTkNIVFJBTlNGRVIsIGhvc3QtPmRldmljZVtob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZF0uc3luY194ZmVyKTsKKyAgICBzYmljX2FybV93cml0ZW5leHQoaG9zdC0+c2NzaS5pb19wb3J0LCByZXNpZHVhbCA+PiAxNik7CisgICAgc2JpY19hcm1fd3JpdGVuZXh0KGhvc3QtPnNjc2kuaW9fcG9ydCwgcmVzaWR1YWwgPj4gOCk7CisgICAgc2JpY19hcm1fd3JpdGVuZXh0KGhvc3QtPnNjc2kuaW9fcG9ydCwgcmVzaWR1YWwpOworICAgIGFjb3Juc2NzaV9zYmljX2lzc3VlY21kKGhvc3QsIENNTkRfWEZFUklORk8pOworICAgIHJldHVybiAxOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29ubmVjdGlvbiAmIERpc2Nvbm5lY3Rpb24KKyAqLworLyoKKyAqIEZ1bmN0aW9uIDogYWNvcm5zY3NpX3JlY29ubmVjdChBU19Ib3N0ICpob3N0KQorICogUHVycG9zZSAgOiByZWNvbm5lY3QgYSBwcmV2aW91c2x5IGRpc2Nvbm5lY3RlZCBjb21tYW5kCisgKiBQYXJhbXMgICA6IGhvc3QgLSBob3N0IHNwZWNpZmljIGRhdGEKKyAqIFJlbWFya3MgIDogU0NTSSBzcGVjIHNheXM6CisgKgkJJ1RoZSBzZXQgb2YgYWN0aXZlIHBvaW50ZXJzIGlzIHJlc3RvcmVkIGZyb20gdGhlIHNldAorICoJCSBvZiBzYXZlZCBwb2ludGVycyB1cG9uIHJlY29ubmVjdGlvbiBvZiB0aGUgSS9PIHByb2Nlc3MnCisgKi8KK3N0YXRpYworaW50IGFjb3Juc2NzaV9yZWNvbm5lY3QoQVNfSG9zdCAqaG9zdCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0LCBsdW4sIG9rID0gMDsKKworICAgIHRhcmdldCA9IHNiaWNfYXJtX3JlYWQoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1NPVVJDRUlEKTsKKworICAgIGlmICghKHRhcmdldCAmIDgpKQorCXByaW50ayhLRVJOX0VSUiAic2NzaSVkOiBpbnZhbGlkIHNvdXJjZSBpZCBhZnRlciByZXNlbGVjdGlvbiAiCisJCSItIGRldmljZSBmYXVsdD9cbiIsCisJCWhvc3QtPmhvc3QtPmhvc3Rfbm8pOworCisgICAgdGFyZ2V0ICY9IDc7CisKKyAgICBpZiAoaG9zdC0+U0NwbnQgJiYgIWhvc3QtPnNjc2kuZGlzY29ubmVjdGFibGUpIHsKKwlwcmludGsoS0VSTl9FUlIgInNjc2klZC4lZDogcmVjb25uZWN0ZWQgd2hpbGUgY29tbWFuZCBpbiAiCisJCSJwcm9ncmVzcyB0byB0YXJnZXQgJWQ/XG4iLAorCQlob3N0LT5ob3N0LT5ob3N0X25vLCB0YXJnZXQsIGhvc3QtPlNDcG50LT5kZXZpY2UtPmlkKTsKKwlob3N0LT5TQ3BudCA9IE5VTEw7CisgICAgfQorCisgICAgbHVuID0gc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfREFUQSkgJiA3OworCisgICAgaG9zdC0+c2NzaS5yZWNvbm5lY3RlZC50YXJnZXQgPSB0YXJnZXQ7CisgICAgaG9zdC0+c2NzaS5yZWNvbm5lY3RlZC5sdW4gPSBsdW47CisgICAgaG9zdC0+c2NzaS5yZWNvbm5lY3RlZC50YWcgPSAwOworCisgICAgaWYgKGhvc3QtPnNjc2kuZGlzY29ubmVjdGFibGUgJiYgaG9zdC0+U0NwbnQgJiYKKwlob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZCA9PSB0YXJnZXQgJiYgaG9zdC0+U0NwbnQtPmRldmljZS0+bHVuID09IGx1bikKKwlvayA9IDE7CisKKyAgICBpZiAoIW9rICYmIHF1ZXVlX3Byb2JldGd0bHVuKCZob3N0LT5xdWV1ZXMuZGlzY29ubmVjdGVkLCB0YXJnZXQsIGx1bikpCisJb2sgPSAxOworCisgICAgQUREX1NUQVRVUyh0YXJnZXQsIDB4ODEsIGhvc3QtPnNjc2kucGhhc2UsIDApOworCisgICAgaWYgKG9rKSB7CisJaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX1JFQ09OTkVDVEVEOworICAgIH0gZWxzZSB7CisJLyogdGhpcyBkb2Vzbid0IHNlZW0gdG8gd29yayAqLworCXByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiByZXNlbGVjdGVkIHdpdGggbm8gY29tbWFuZCAiCisJCSJ0byByZWNvbm5lY3Qgd2l0aFxuIiwKKwkJaG9zdC0+aG9zdC0+aG9zdF9ubywgJzAnICsgdGFyZ2V0KTsKKwlhY29ybnNjc2lfZHVtcGxvZyhob3N0LCB0YXJnZXQpOworCWFjb3Juc2NzaV9hYm9ydGNtZChob3N0LCAwKTsKKwlpZiAoaG9zdC0+U0NwbnQpIHsKKwkgICAgcXVldWVfYWRkX2NtZF90YWlsKCZob3N0LT5xdWV1ZXMuZGlzY29ubmVjdGVkLCBob3N0LT5TQ3BudCk7CisJICAgIGhvc3QtPlNDcG50ID0gTlVMTDsKKwl9CisgICAgfQorICAgIGFjb3Juc2NzaV9zYmljX2lzc3VlY21kKGhvc3QsIENNTkRfTkVHQVRFQUNLKTsKKyAgICByZXR1cm4gIW9rOworfQorCisvKgorICogRnVuY3Rpb246IGludCBhY29ybnNjc2lfcmVjb25lY3RfZmluaXNoKEFTX0hvc3QgKmhvc3QpCisgKiBQdXJwb3NlIDogZmluaXNoIHJlY29ubmVjdGluZyBhIGNvbW1hbmQKKyAqIFBhcmFtcyAgOiBob3N0IC0gaG9zdCB0byBjb21wbGV0ZQorICogUmV0dXJucyA6IDAgaWYgZmFpbGVkCisgKi8KK3N0YXRpYworaW50IGFjb3Juc2NzaV9yZWNvbm5lY3RfZmluaXNoKEFTX0hvc3QgKmhvc3QpCit7CisgICAgaWYgKGhvc3QtPnNjc2kuZGlzY29ubmVjdGFibGUgJiYgaG9zdC0+U0NwbnQpIHsKKwlob3N0LT5zY3NpLmRpc2Nvbm5lY3RhYmxlID0gMDsKKwlpZiAoaG9zdC0+U0NwbnQtPmRldmljZS0+aWQgID09IGhvc3QtPnNjc2kucmVjb25uZWN0ZWQudGFyZ2V0ICYmCisJICAgIGhvc3QtPlNDcG50LT5kZXZpY2UtPmx1biA9PSBob3N0LT5zY3NpLnJlY29ubmVjdGVkLmx1biAmJgorCSAgICBob3N0LT5TQ3BudC0+dGFnICAgICAgICAgPT0gaG9zdC0+c2NzaS5yZWNvbm5lY3RlZC50YWcpIHsKKyNpZiAoREVCVUcgJiAoREVCVUdfUVVFVUVTfERFQlVHX0RJU0NPTikpCisJICAgIERCRyhob3N0LT5TQ3BudCwgcHJpbnRrKCJzY3NpJWQuJWM6IHJlY29ubmVjdGVkIiwKKwkJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCkpKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJICAgIHF1ZXVlX2FkZF9jbWRfdGFpbCgmaG9zdC0+cXVldWVzLmRpc2Nvbm5lY3RlZCwgaG9zdC0+U0NwbnQpOworI2lmIChERUJVRyAmIChERUJVR19RVUVVRVN8REVCVUdfRElTQ09OKSkKKwkgICAgREJHKGhvc3QtPlNDcG50LCBwcmludGsoInNjc2klZC4lYzogaGFkIHRvIG1vdmUgY29tbWFuZCAiCisJCSAgICAidG8gZGlzY29ubmVjdGVkIHF1ZXVlXG4iLAorCQkgICAgaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSkpOworI2VuZGlmCisJICAgIGhvc3QtPlNDcG50ID0gTlVMTDsKKwl9CisgICAgfQorICAgIGlmICghaG9zdC0+U0NwbnQpIHsKKwlob3N0LT5TQ3BudCA9IHF1ZXVlX3JlbW92ZV90Z3RsdW50YWcoJmhvc3QtPnF1ZXVlcy5kaXNjb25uZWN0ZWQsCisJCQkJaG9zdC0+c2NzaS5yZWNvbm5lY3RlZC50YXJnZXQsCisJCQkJaG9zdC0+c2NzaS5yZWNvbm5lY3RlZC5sdW4sCisJCQkJaG9zdC0+c2NzaS5yZWNvbm5lY3RlZC50YWcpOworI2lmIChERUJVRyAmIChERUJVR19RVUVVRVN8REVCVUdfRElTQ09OKSkKKwlEQkcoaG9zdC0+U0NwbnQsIHByaW50aygic2NzaSVkLiVjOiBoYWQgdG8gZ2V0IGNvbW1hbmQiLAorCQlob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpKSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAoIWhvc3QtPlNDcG50KQorCWFjb3Juc2NzaV9hYm9ydGNtZChob3N0LCBob3N0LT5zY3NpLnJlY29ubmVjdGVkLnRhZyk7CisgICAgZWxzZSB7CisJLyoKKwkgKiBSZXN0b3JlIGRhdGEgcG9pbnRlciBmcm9tIFNBVkVEIHBvaW50ZXJzLgorCSAqLworCWhvc3QtPnNjc2kuU0NwID0gaG9zdC0+U0NwbnQtPlNDcDsKKyNpZiAoREVCVUcgJiAoREVCVUdfUVVFVUVTfERFQlVHX0RJU0NPTikpCisJcHJpbnRrKCIsIGRhdGEgcG9pbnRlcnM6IFslcCwgJVhdIiwKKwkJaG9zdC0+c2NzaS5TQ3AucHRyLCBob3N0LT5zY3NpLlNDcC50aGlzX3Jlc2lkdWFsKTsKKyNlbmRpZgorICAgIH0KKyNpZiAoREVCVUcgJiAoREVCVUdfUVVFVUVTfERFQlVHX0RJU0NPTikpCisgICAgcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKyAgICBob3N0LT5kbWEudHJhbnNmZXJyZWQgPSBob3N0LT5zY3NpLlNDcC5zY3NpX3hmZXJyZWQ7CisKKyAgICByZXR1cm4gaG9zdC0+U0NwbnQgIT0gTlVMTDsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiB2b2lkIGFjb3Juc2NzaV9kaXNjb25uZWN0X3VuZXhwZWN0ZWQoQVNfSG9zdCAqaG9zdCkKKyAqIFB1cnBvc2UgOiBoYW5kbGUgYW4gdW5leHBlY3RlZCBkaXNjb25uZWN0CisgKiBQYXJhbXMgIDogaG9zdCAtIGhvc3Qgb24gd2hpY2ggZGlzY29ubmVjdCBvY2N1cnJlZAorICovCitzdGF0aWMKK3ZvaWQgYWNvcm5zY3NpX2Rpc2Nvbm5lY3RfdW5leHBlY3RlZChBU19Ib3N0ICpob3N0KQoreworICAgIHByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiB1bmV4cGVjdGVkIGRpc2Nvbm5lY3RcbiIsCisJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCkpOworI2lmIChERUJVRyAmIERFQlVHX0FCT1JUKQorICAgIGFjb3Juc2NzaV9kdW1wbG9nKGhvc3QsIDgpOworI2VuZGlmCisKKyAgICBhY29ybnNjc2lfZG9uZShob3N0LCAmaG9zdC0+U0NwbnQsIERJRF9FUlJPUik7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogdm9pZCBhY29ybnNjc2lfYWJvcnRjbWQoQVNfaG9zdCAqaG9zdCwgdW5zaWduZWQgY2hhciB0YWcpCisgKiBQdXJwb3NlIDogYWJvcnQgYSBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbW1hbmQKKyAqIFBhcmFtcyAgOiBob3N0IC0gaG9zdCB3aXRoIGNvbm5lY3RlZCBjb21tYW5kIHRvIGFib3J0CisgKgkgICAgIHRhZyAgLSB0YWcgdG8gYWJvcnQKKyAqLworc3RhdGljCit2b2lkIGFjb3Juc2NzaV9hYm9ydGNtZChBU19Ib3N0ICpob3N0LCB1bnNpZ25lZCBjaGFyIHRhZykKK3sKKyAgICBob3N0LT5zY3NpLnBoYXNlID0gUEhBU0VfQUJPUlRFRDsKKyAgICBzYmljX2FybV93cml0ZShob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfQ01ORCwgQ01ORF9BU1NFUlRBVE4pOworCisgICAgbXNncXVldWVfZmx1c2goJmhvc3QtPnNjc2kubXNncyk7CisjaWZkZWYgQ09ORklHX1NDU0lfQUNPUk5TQ1NJX1RBR0dFRF9RVUVVRQorICAgIGlmICh0YWcpCisJbXNncXVldWVfYWRkbXNnKCZob3N0LT5zY3NpLm1zZ3MsIDIsIEFCT1JUX1RBRywgdGFnKTsKKyAgICBlbHNlCisjZW5kaWYKKwltc2dxdWV1ZV9hZGRtc2coJmhvc3QtPnNjc2kubXNncywgMSwgQUJPUlQpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEludGVycnVwdCByb3V0aW5lcy4KKyAqLworLyoKKyAqIEZ1bmN0aW9uOiBpbnQgYWNvcm5zY3NpX3NiaWNpbnRyKEFTX0hvc3QgKmhvc3QpCisgKiBQdXJwb3NlIDogaGFuZGxlIGludGVycnVwdHMgZnJvbSBTQ1NJIGRldmljZQorICogUGFyYW1zICA6IGhvc3QgLSBob3N0IHRvIHByb2Nlc3MKKyAqIFJldHVybnMgOiBJTlRSX1BST0NFU1MgaWYgZXhwZWN0aW5nIGFub3RoZXIgU0JJQyBpbnRlcnJ1cHQKKyAqCSAgICAgSU5UUl9JRExFIGlmIG5vIGludGVycnVwdAorICoJICAgICBJTlRSX05FWFRfQ09NTUFORCBpZiB3ZSBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcgdGhlIGNvbW1hbmQKKyAqLworc3RhdGljCitpbnRyX3JldF90IGFjb3Juc2NzaV9zYmljaW50cihBU19Ib3N0ICpob3N0LCBpbnQgaW5faXJxKQoreworICAgIHVuc2lnbmVkIGludCBhc3IsIHNzcjsKKworICAgIGFzciA9IHNiaWNfYXJtX3JlYWQoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX0FTUik7CisgICAgaWYgKCEoYXNyICYgQVNSX0lOVCkpCisJcmV0dXJuIElOVFJfSURMRTsKKworICAgIHNzciA9IHNiaWNfYXJtX3JlYWQoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1NTUik7CisKKyNpZiAoREVCVUcgJiBERUJVR19QSEFTRVMpCisgICAgcHJpbnRfc2JpY19zdGF0dXMoYXNyLCBzc3IsIGhvc3QtPnNjc2kucGhhc2UpOworI2VuZGlmCisKKyAgICBBRERfU1RBVFVTKDgsIHNzciwgaG9zdC0+c2NzaS5waGFzZSwgaW5faXJxKTsKKworICAgIGlmIChob3N0LT5TQ3BudCAmJiAhaG9zdC0+c2NzaS5kaXNjb25uZWN0YWJsZSkKKwlBRERfU1RBVFVTKGhvc3QtPlNDcG50LT5kZXZpY2UtPmlkLCBzc3IsIGhvc3QtPnNjc2kucGhhc2UsIGluX2lycSk7CisKKyAgICBzd2l0Y2ggKHNzcikgeworICAgIGNhc2UgMHgwMDoJCQkJLyogcmVzZXQgc3RhdGUgLSBub3QgYWR2YW5jZWQJCQkqLworCXByaW50ayhLRVJOX0VSUiAic2NzaSVkOiByZXNldCBpbiBzdGFuZGFyZCBtb2RlIGJ1dCB3YW50ZWQgYWR2YW5jZWQgbW9kZS5cbiIsCisJCWhvc3QtPmhvc3QtPmhvc3Rfbm8pOworCS8qIHNldHVwIHNiaWMgLSBXRDMzQzkzQSAqLworCXNiaWNfYXJtX3dyaXRlKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19PV05JRCwgT1dOSURfRUFGIHwgaG9zdC0+aG9zdC0+dGhpc19pZCk7CisJc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX0NNTkQsIENNTkRfUkVTRVQpOworCXJldHVybiBJTlRSX0lETEU7CisKKyAgICBjYXNlIDB4MDE6CQkJCS8qIHJlc2V0IHN0YXRlIC0gYWR2YW5jZWQJCQkqLworCXNiaWNfYXJtX3dyaXRlKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19DVFJMLCBJTklUX1NCSUNETUEgfCBDVFJMX0lESSk7CisJc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1RJTUVPVVQsIFRJTUVPVVRfVElNRSk7CisJc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1NZTkNIVFJBTlNGRVIsIFNZTkNIVFJBTlNGRVJfMkRCQSk7CisJc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1NPVVJDRUlELCBTT1VSQ0VJRF9FUiB8IFNPVVJDRUlEX0RTUCk7CisJbXNncXVldWVfZmx1c2goJmhvc3QtPnNjc2kubXNncyk7CisJcmV0dXJuIElOVFJfSURMRTsKKworICAgIGNhc2UgMHg0MToJCQkJLyogdW5leHBlY3RlZCBkaXNjb25uZWN0IGFib3J0ZWQgY29tbWFuZAkqLworCWFjb3Juc2NzaV9kaXNjb25uZWN0X3VuZXhwZWN0ZWQoaG9zdCk7CisJcmV0dXJuIElOVFJfTkVYVF9DT01NQU5EOworICAgIH0KKworICAgIHN3aXRjaCAoaG9zdC0+c2NzaS5waGFzZSkgeworICAgIGNhc2UgUEhBU0VfQ09OTkVDVElORzoJCS8qIFNUQVRFOiBjb21tYW5kIHJlbW92ZWQgZnJvbSBpc3N1ZSBxdWV1ZQkqLworCXN3aXRjaCAoc3NyKSB7CisJY2FzZSAweDExOgkJCS8qIC0+IFBIQVNFX0NPTk5FQ1RFRAkJCQkqLworCSAgICAvKiBCVVMgRlJFRSAtPiBTRUxFQ1RJT04gKi8KKwkgICAgaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX0NPTk5FQ1RFRDsKKwkgICAgbXNncXVldWVfZmx1c2goJmhvc3QtPnNjc2kubXNncyk7CisJICAgIGhvc3QtPmRtYS50cmFuc2ZlcnJlZCA9IGhvc3QtPnNjc2kuU0NwLnNjc2lfeGZlcnJlZDsKKwkgICAgLyogMzNDOTMgZ2l2ZXMgbmV4dCBpbnRlcnJ1cHQgaW5kaWNhdGluZyBidXMgcGhhc2UgKi8KKwkgICAgYXNyID0gc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfQVNSKTsKKwkgICAgaWYgKCEoYXNyICYgQVNSX0lOVCkpCisJCWJyZWFrOworCSAgICBzc3IgPSBzYmljX2FybV9yZWFkKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19TU1IpOworCSAgICBBRERfU1RBVFVTKDgsIHNzciwgaG9zdC0+c2NzaS5waGFzZSwgMSk7CisJICAgIEFERF9TVEFUVVMoaG9zdC0+U0NwbnQtPmRldmljZS0+aWQsIHNzciwgaG9zdC0+c2NzaS5waGFzZSwgMSk7CisJICAgIGdvdG8gY29ubmVjdGVkOworCSAgICAKKwljYXNlIDB4NDI6CQkJLyogc2VsZWN0IHRpbWVkIG91dAkJCQkqLworCQkJCQkvKiAtPiBQSEFTRV9JRExFCQkJCSovCisJICAgIGFjb3Juc2NzaV9kb25lKGhvc3QsICZob3N0LT5TQ3BudCwgRElEX05PX0NPTk5FQ1QpOworCSAgICByZXR1cm4gSU5UUl9ORVhUX0NPTU1BTkQ7CisKKwljYXNlIDB4ODE6CQkJLyogLT4gUEhBU0VfUkVDT05ORUNURUQgb3IgUEhBU0VfQUJPUlRFRAkqLworCSAgICAvKiBCVVMgRlJFRSAtPiBSRVNFTEVDVElPTiAqLworCSAgICBob3N0LT5vcmlnU0NwbnQgPSBob3N0LT5TQ3BudDsKKwkgICAgaG9zdC0+U0NwbnQgPSBOVUxMOworCSAgICBtc2dxdWV1ZV9mbHVzaCgmaG9zdC0+c2NzaS5tc2dzKTsKKwkgICAgYWNvcm5zY3NpX3JlY29ubmVjdChob3N0KTsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBwcmludGsoS0VSTl9FUlIgInNjc2klZC4lYzogUEhBU0VfQ09OTkVDVElORywgU1NSICUwMlg/XG4iLAorCQkgICAgaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSwgc3NyKTsKKwkgICAgYWNvcm5zY3NpX2R1bXBsb2coaG9zdCwgaG9zdC0+U0NwbnQgPyBob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZCA6IDgpOworCSAgICBhY29ybnNjc2lfYWJvcnRjbWQoaG9zdCwgaG9zdC0+U0NwbnQtPnRhZyk7CisJfQorCXJldHVybiBJTlRSX1BST0NFU1NJTkc7CisKKyAgICBjb25uZWN0ZWQ6CisgICAgY2FzZSBQSEFTRV9DT05ORUNURUQ6CQkvKiBTVEFURTogZGV2aWNlIHNlbGVjdGVkIG9rCQkJKi8KKwlzd2l0Y2ggKHNzcikgeworI2lmZGVmIE5PTlNUQU5EQVJECisJY2FzZSAweDhhOgkJCS8qIC0+IFBIQVNFX0NPTU1BTkQsIFBIQVNFX0NPTU1BTkRQQVVTRUQJKi8KKwkgICAgLyogU0VMRUNUSU9OIC0+IENPTU1BTkQgKi8KKwkgICAgYWNvcm5zY3NpX3NlbmRjb21tYW5kKGhvc3QpOworCSAgICBicmVhazsKKworCWNhc2UgMHg4YjoJCQkvKiAtPiBQSEFTRV9TVEFUVVMJCQkJKi8KKwkgICAgLyogU0VMRUNUSU9OIC0+IFNUQVRVUyAqLworCSAgICBhY29ybnNjc2lfcmVhZHN0YXR1c2J5dGUoaG9zdCk7CisJICAgIGhvc3QtPnNjc2kucGhhc2UgPSBQSEFTRV9TVEFUVVNJTjsKKwkgICAgYnJlYWs7CisjZW5kaWYKKworCWNhc2UgMHg4ZToJCQkvKiAtPiBQSEFTRV9NU0dPVVQJCQkJKi8KKwkgICAgLyogU0VMRUNUSU9OIC0+TUVTU0FHRSBPVVQgKi8KKwkgICAgaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX01TR09VVDsKKwkgICAgYWNvcm5zY3NpX2J1aWxkbWVzc2FnZXMoaG9zdCk7CisJICAgIGFjb3Juc2NzaV9zZW5kbWVzc2FnZShob3N0KTsKKwkgICAgYnJlYWs7CisKKwkvKiB0aGVzZSBzaG91bGQgbm90IGhhcHBlbiAqLworCWNhc2UgMHg4NToJCQkvKiB0YXJnZXQgZGlzY29ubmVjdGVkCQkJCSovCisJICAgIGFjb3Juc2NzaV9kb25lKGhvc3QsICZob3N0LT5TQ3BudCwgRElEX0VSUk9SKTsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBwcmludGsoS0VSTl9FUlIgInNjc2klZC4lYzogUEhBU0VfQ09OTkVDVEVELCBTU1IgJTAyWD9cbiIsCisJCSAgICBob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpLCBzc3IpOworCSAgICBhY29ybnNjc2lfZHVtcGxvZyhob3N0LCBob3N0LT5TQ3BudCA/IGhvc3QtPlNDcG50LT5kZXZpY2UtPmlkIDogOCk7CisJICAgIGFjb3Juc2NzaV9hYm9ydGNtZChob3N0LCBob3N0LT5TQ3BudC0+dGFnKTsKKwl9CisJcmV0dXJuIElOVFJfUFJPQ0VTU0lORzsKKworICAgIGNhc2UgUEhBU0VfTVNHT1VUOgkJCS8qIFNUQVRFOiBjb25uZWN0ZWQgJiBzZW50IElERU5USUZZIG1lc3NhZ2UJKi8KKwkvKgorCSAqIFNDU0kgc3RhbmRhcmQgc2F5cyB0aGF0IE1FU1NBR0UgT1VUIHBoYXNlcyBjYW4gYmUgZm9sbG93ZWQgYnkgYQorCSAqIERBVEEgcGhhc2UsIFNUQVRVUyBwaGFzZSwgTUVTU0FHRSBJTiBwaGFzZSBvciBDT01NQU5EIHBoYXNlCisJICovCisJc3dpdGNoIChzc3IpIHsKKwljYXNlIDB4OGE6CQkJLyogLT4gUEhBU0VfQ09NTUFORCwgUEhBU0VfQ09NTUFORFBBVVNFRAkqLworCWNhc2UgMHgxYToJCQkvKiAtPiBQSEFTRV9DT01NQU5ELCBQSEFTRV9DT01NQU5EUEFVU0VECSovCisJICAgIC8qIE1FU1NBR0UgT1VUIC0+IENPTU1BTkQgKi8KKwkgICAgYWNvcm5zY3NpX3NlbmRjb21tYW5kKGhvc3QpOworCSAgICBicmVhazsKKworCWNhc2UgMHg4YjoJCQkvKiAtPiBQSEFTRV9TVEFUVVMJCQkJKi8KKwljYXNlIDB4MWI6CQkJLyogLT4gUEhBU0VfU1RBVFVTCQkJCSovCisJICAgIC8qIE1FU1NBR0UgT1VUIC0+IFNUQVRVUyAqLworCSAgICBhY29ybnNjc2lfcmVhZHN0YXR1c2J5dGUoaG9zdCk7CisJICAgIGhvc3QtPnNjc2kucGhhc2UgPSBQSEFTRV9TVEFUVVNJTjsKKwkgICAgYnJlYWs7CisKKwljYXNlIDB4OGU6CQkJLyogLT4gUEhBU0VfTVNHT1VUCQkJCSovCisJICAgIC8qIE1FU1NBR0VfT1VUKE1FU1NBR0VfSU4pIC0+TUVTU0FHRSBPVVQgKi8KKwkgICAgYWNvcm5zY3NpX3NlbmRtZXNzYWdlKGhvc3QpOworCSAgICBicmVhazsKKworCWNhc2UgMHg0ZjoJCQkvKiAtPiBQSEFTRV9NU0dJTiwgUEhBU0VfRElTQ09OTkVDVAkJKi8KKwljYXNlIDB4MWY6CQkJLyogLT4gUEhBU0VfTVNHSU4sIFBIQVNFX0RJU0NPTk5FQ1QJCSovCisJICAgIC8qIE1FU1NBR0UgT1VUIC0+IE1FU1NBR0UgSU4gKi8KKwkgICAgYWNvcm5zY3NpX21lc3NhZ2UoaG9zdCk7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuJWM6IFBIQVNFX01TR09VVCwgU1NSICUwMlg/XG4iLAorCQkgICAgaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSwgc3NyKTsKKwkgICAgYWNvcm5zY3NpX2R1bXBsb2coaG9zdCwgaG9zdC0+U0NwbnQgPyBob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZCA6IDgpOworCX0KKwlyZXR1cm4gSU5UUl9QUk9DRVNTSU5HOworCisgICAgY2FzZSBQSEFTRV9DT01NQU5EOiAJCS8qIFNUQVRFOiBjb25uZWN0ZWQgJiBjb21tYW5kIHNlbnQJCSovCisJc3dpdGNoIChzc3IpIHsKKwljYXNlIDB4MTg6CQkJLyogLT4gUEhBU0VfREFUQU9VVAkJCQkqLworCSAgICAvKiBDT01NQU5EIC0+IERBVEEgT1VUICovCisJICAgIGlmIChob3N0LT5zY3NpLlNDcC5zZW50X2NvbW1hbmQgIT0gaG9zdC0+U0NwbnQtPmNtZF9sZW4pCisJCWFjb3Juc2NzaV9hYm9ydGNtZChob3N0LCBob3N0LT5TQ3BudC0+dGFnKTsKKwkgICAgYWNvcm5zY3NpX2RtYV9zZXR1cChob3N0LCBETUFfT1VUKTsKKwkgICAgaWYgKCFhY29ybnNjc2lfc3RhcnR0cmFuc2Zlcihob3N0KSkKKwkJYWNvcm5zY3NpX2Fib3J0Y21kKGhvc3QsIGhvc3QtPlNDcG50LT50YWcpOworCSAgICBob3N0LT5zY3NpLnBoYXNlID0gUEhBU0VfREFUQU9VVDsKKwkgICAgcmV0dXJuIElOVFJfSURMRTsKKworCWNhc2UgMHgxOToJCQkvKiAtPiBQSEFTRV9EQVRBSU4JCQkJKi8KKwkgICAgLyogQ09NTUFORCAtPiBEQVRBIElOICovCisJICAgIGlmIChob3N0LT5zY3NpLlNDcC5zZW50X2NvbW1hbmQgIT0gaG9zdC0+U0NwbnQtPmNtZF9sZW4pCisJCWFjb3Juc2NzaV9hYm9ydGNtZChob3N0LCBob3N0LT5TQ3BudC0+dGFnKTsKKwkgICAgYWNvcm5zY3NpX2RtYV9zZXR1cChob3N0LCBETUFfSU4pOworCSAgICBpZiAoIWFjb3Juc2NzaV9zdGFydHRyYW5zZmVyKGhvc3QpKQorCQlhY29ybnNjc2lfYWJvcnRjbWQoaG9zdCwgaG9zdC0+U0NwbnQtPnRhZyk7CisJICAgIGhvc3QtPnNjc2kucGhhc2UgPSBQSEFTRV9EQVRBSU47CisJICAgIHJldHVybiBJTlRSX0lETEU7CisKKwljYXNlIDB4MWI6CQkJLyogLT4gUEhBU0VfU1RBVFVTCQkJCSovCisJICAgIC8qIENPTU1BTkQgLT4gU1RBVFVTICovCisJICAgIGFjb3Juc2NzaV9yZWFkc3RhdHVzYnl0ZShob3N0KTsKKwkgICAgaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX1NUQVRVU0lOOworCSAgICBicmVhazsKKworCWNhc2UgMHgxZToJCQkvKiAtPiBQSEFTRV9NU0dPVVQJCQkJKi8KKwkgICAgLyogQ09NTUFORCAtPiBNRVNTQUdFIE9VVCAqLworCSAgICBhY29ybnNjc2lfc2VuZG1lc3NhZ2UoaG9zdCk7CisJICAgIGJyZWFrOworCisJY2FzZSAweDFmOgkJCS8qIC0+IFBIQVNFX01TR0lOLCBQSEFTRV9ESVNDT05ORUNUCQkqLworCSAgICAvKiBDT01NQU5EIC0+IE1FU1NBR0UgSU4gKi8KKwkgICAgYWNvcm5zY3NpX21lc3NhZ2UoaG9zdCk7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuJWM6IFBIQVNFX0NPTU1BTkQsIFNTUiAlMDJYP1xuIiwKKwkJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCksIHNzcik7CisJICAgIGFjb3Juc2NzaV9kdW1wbG9nKGhvc3QsIGhvc3QtPlNDcG50ID8gaG9zdC0+U0NwbnQtPmRldmljZS0+aWQgOiA4KTsKKwl9CisJcmV0dXJuIElOVFJfUFJPQ0VTU0lORzsKKworICAgIGNhc2UgUEhBU0VfRElTQ09OTkVDVDoJCS8qIFNUQVRFOiBjb25uZWN0ZWQsIHJlY2VpdmVkIERJU0NPTk5FQ1QgbXNnCSovCisJaWYgKHNzciA9PSAweDg1KSB7CQkvKiAtPiBQSEFTRV9JRExFCQkJCSovCisJICAgIGhvc3QtPnNjc2kuZGlzY29ubmVjdGFibGUgPSAxOworCSAgICBob3N0LT5zY3NpLnJlY29ubmVjdGVkLnRhZyA9IDA7CisJICAgIGhvc3QtPnNjc2kucGhhc2UgPSBQSEFTRV9JRExFOworCSAgICBob3N0LT5zdGF0cy5kaXNjb25uZWN0cyArPSAxOworCX0gZWxzZSB7CisJICAgIHByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiBQSEFTRV9ESVNDT05ORUNULCBTU1IgJTAyWCBpbnN0ZWFkIG9mIGRpc2Nvbm5lY3Q/XG4iLAorCQkgICAgaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSwgc3NyKTsKKwkgICAgYWNvcm5zY3NpX2R1bXBsb2coaG9zdCwgaG9zdC0+U0NwbnQgPyBob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZCA6IDgpOworCX0KKwlyZXR1cm4gSU5UUl9ORVhUX0NPTU1BTkQ7CisKKyAgICBjYXNlIFBIQVNFX0lETEU6CQkJLyogU1RBVEU6IGRpc2Nvbm5lY3RlZAkJCQkqLworCWlmIChzc3IgPT0gMHg4MSkJCS8qIC0+IFBIQVNFX1JFQ09OTkVDVEVEIG9yIFBIQVNFX0FCT1JURUQJKi8KKwkgICAgYWNvcm5zY3NpX3JlY29ubmVjdChob3N0KTsKKwllbHNlIHsKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuJWM6IFBIQVNFX0lETEUsIFNTUiAlMDJYIHdoaWxlIGlkbGU/XG4iLAorCQkgICAgaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSwgc3NyKTsKKwkgICAgYWNvcm5zY3NpX2R1bXBsb2coaG9zdCwgaG9zdC0+U0NwbnQgPyBob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZCA6IDgpOworCX0KKwlyZXR1cm4gSU5UUl9QUk9DRVNTSU5HOworCisgICAgY2FzZSBQSEFTRV9SRUNPTk5FQ1RFRDoJCS8qIFNUQVRFOiBkZXZpY2UgcmVjb25uZWN0ZWQgdG8gaW5pdGlhdG9yCSovCisJLyoKKwkgKiBDb21tYW5kIHJlY29ubmVjdGVkIC0gaWYgTUVTR0lOLCBnZXQgbWVzc2FnZSAtIGl0IG1heSBiZQorCSAqIHRoZSB0YWcuICBJZiBub3QsIGdldCBjb21tYW5kIG91dCBvZiBkaXNjb25uZWN0ZWQgcXVldWUKKwkgKi8KKwkvKgorCSAqIElmIHdlIHJlY29ubmVjdGVkIGFuZCB3ZSdyZSBub3QgaW4gTUVTU0FHRSBJTiBwaGFzZSBhZnRlciBJREVOVElGWSwKKwkgKiByZWNvbm5lY3QgSV9UX0wgY29tbWFuZAorCSAqLworCWlmIChzc3IgIT0gMHg4ZiAmJiAhYWNvcm5zY3NpX3JlY29ubmVjdF9maW5pc2goaG9zdCkpCisJICAgIHJldHVybiBJTlRSX0lETEU7CisJQUREX1NUQVRVUyhob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZCwgc3NyLCBob3N0LT5zY3NpLnBoYXNlLCBpbl9pcnEpOworCXN3aXRjaCAoc3NyKSB7CisJY2FzZSAweDg4OgkJCS8qIGRhdGEgb3V0IHBoYXNlCQkJCSovCisJCQkJCS8qIC0+IFBIQVNFX0RBVEFPVVQJCQkJKi8KKwkgICAgLyogTUVTU0FHRSBJTiAtPiBEQVRBIE9VVCAqLworCSAgICBhY29ybnNjc2lfZG1hX3NldHVwKGhvc3QsIERNQV9PVVQpOworCSAgICBpZiAoIWFjb3Juc2NzaV9zdGFydHRyYW5zZmVyKGhvc3QpKQorCQlhY29ybnNjc2lfYWJvcnRjbWQoaG9zdCwgaG9zdC0+U0NwbnQtPnRhZyk7CisJICAgIGhvc3QtPnNjc2kucGhhc2UgPSBQSEFTRV9EQVRBT1VUOworCSAgICByZXR1cm4gSU5UUl9JRExFOworCisJY2FzZSAweDg5OgkJCS8qIGRhdGEgaW4gcGhhc2UJCQkJKi8KKwkJCQkJLyogLT4gUEhBU0VfREFUQUlOCQkJCSovCisJICAgIC8qIE1FU1NBR0UgSU4gLT4gREFUQSBJTiAqLworCSAgICBhY29ybnNjc2lfZG1hX3NldHVwKGhvc3QsIERNQV9JTik7CisJICAgIGlmICghYWNvcm5zY3NpX3N0YXJ0dHJhbnNmZXIoaG9zdCkpCisJCWFjb3Juc2NzaV9hYm9ydGNtZChob3N0LCBob3N0LT5TQ3BudC0+dGFnKTsKKwkgICAgaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX0RBVEFJTjsKKwkgICAgcmV0dXJuIElOVFJfSURMRTsKKworCWNhc2UgMHg4YToJCQkvKiBjb21tYW5kIG91dAkJCQkJKi8KKwkgICAgLyogTUVTU0FHRSBJTiAtPiBDT01NQU5EICovCisJICAgIGFjb3Juc2NzaV9zZW5kY29tbWFuZChob3N0KTsvKiAtPiBQSEFTRV9DT01NQU5ELCBQSEFTRV9DT01NQU5EUEFVU0VECSovCisJICAgIGJyZWFrOworCisJY2FzZSAweDhiOgkJCS8qIHN0YXR1cyBpbgkJCQkJKi8KKwkJCQkJLyogLT4gUEhBU0VfU1RBVFVTSU4JCQkJKi8KKwkgICAgLyogTUVTU0FHRSBJTiAtPiBTVEFUVVMgKi8KKwkgICAgYWNvcm5zY3NpX3JlYWRzdGF0dXNieXRlKGhvc3QpOworCSAgICBob3N0LT5zY3NpLnBoYXNlID0gUEhBU0VfU1RBVFVTSU47CisJICAgIGJyZWFrOworCisJY2FzZSAweDhlOgkJCS8qIG1lc3NhZ2Ugb3V0CQkJCQkqLworCQkJCQkvKiAtPiBQSEFTRV9NU0dPVVQJCQkJKi8KKwkgICAgLyogTUVTU0FHRSBJTiAtPiBNRVNTQUdFIE9VVCAqLworCSAgICBhY29ybnNjc2lfc2VuZG1lc3NhZ2UoaG9zdCk7CisJICAgIGJyZWFrOworCisJY2FzZSAweDhmOgkJCS8qIG1lc3NhZ2UgaW4JCQkJCSovCisJICAgIGFjb3Juc2NzaV9tZXNzYWdlKGhvc3QpOwkvKiAtPiBQSEFTRV9NU0dJTiwgUEhBU0VfRElTQ09OTkVDVAkJKi8KKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBwcmludGsoS0VSTl9FUlIgInNjc2klZC4lYzogUEhBU0VfUkVDT05ORUNURUQsIFNTUiAlMDJYIGFmdGVyIHJlY29ubmVjdD9cbiIsCisJCSAgICBob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpLCBzc3IpOworCSAgICBhY29ybnNjc2lfZHVtcGxvZyhob3N0LCBob3N0LT5TQ3BudCA/IGhvc3QtPlNDcG50LT5kZXZpY2UtPmlkIDogOCk7CisJfQorCXJldHVybiBJTlRSX1BST0NFU1NJTkc7CisKKyAgICBjYXNlIFBIQVNFX0RBVEFJTjoJCQkvKiBTVEFURTogdHJhbnNmZXJyZWQgZGF0YSBpbgkJCSovCisJLyoKKwkgKiBUaGlzIGlzIHNpbXBsZSAtIGlmIHdlIGRpc2Nvbm5lY3QgdGhlbiB0aGUgRE1BIGFkZHJlc3MgJiBjb3VudCBpcworCSAqIGNvcnJlY3QuCisJICovCisJc3dpdGNoIChzc3IpIHsKKwljYXNlIDB4MTk6CQkJLyogLT4gUEhBU0VfREFUQUlOCQkJCSovCisJY2FzZSAweDg5OgkJCS8qIC0+IFBIQVNFX0RBVEFJTgkJCQkqLworCSAgICBhY29ybnNjc2lfYWJvcnRjbWQoaG9zdCwgaG9zdC0+U0NwbnQtPnRhZyk7CisJICAgIHJldHVybiBJTlRSX0lETEU7CisKKwljYXNlIDB4MWI6CQkJLyogLT4gUEhBU0VfU1RBVFVTSU4JCQkJKi8KKwljYXNlIDB4NGI6CQkJLyogLT4gUEhBU0VfU1RBVFVTSU4JCQkJKi8KKwljYXNlIDB4OGI6CQkJLyogLT4gUEhBU0VfU1RBVFVTSU4JCQkJKi8KKwkgICAgLyogREFUQSBJTiAtPiBTVEFUVVMgKi8KKwkgICAgaG9zdC0+c2NzaS5TQ3Auc2NzaV94ZmVycmVkID0gaG9zdC0+U0NwbnQtPnJlcXVlc3RfYnVmZmxlbiAtCisJCQkJCSAgYWNvcm5zY3NpX3NiaWNfeGZjb3VudChob3N0KTsKKwkgICAgYWNvcm5zY3NpX2RtYV9zdG9wKGhvc3QpOworCSAgICBhY29ybnNjc2lfcmVhZHN0YXR1c2J5dGUoaG9zdCk7CisJICAgIGhvc3QtPnNjc2kucGhhc2UgPSBQSEFTRV9TVEFUVVNJTjsKKwkgICAgYnJlYWs7CisKKwljYXNlIDB4MWU6CQkJLyogLT4gUEhBU0VfTVNHT1VUCQkJCSovCisJY2FzZSAweDRlOgkJCS8qIC0+IFBIQVNFX01TR09VVAkJCQkqLworCWNhc2UgMHg4ZToJCQkvKiAtPiBQSEFTRV9NU0dPVVQJCQkJKi8KKwkgICAgLyogREFUQSBJTiAtPiBNRVNTQUdFIE9VVCAqLworCSAgICBob3N0LT5zY3NpLlNDcC5zY3NpX3hmZXJyZWQgPSBob3N0LT5TQ3BudC0+cmVxdWVzdF9idWZmbGVuIC0KKwkJCQkJICBhY29ybnNjc2lfc2JpY194ZmNvdW50KGhvc3QpOworCSAgICBhY29ybnNjc2lfZG1hX3N0b3AoaG9zdCk7CisJICAgIGFjb3Juc2NzaV9zZW5kbWVzc2FnZShob3N0KTsKKwkgICAgYnJlYWs7CisKKwljYXNlIDB4MWY6CQkJLyogbWVzc2FnZSBpbgkJCQkJKi8KKwljYXNlIDB4NGY6CQkJLyogbWVzc2FnZSBpbgkJCQkJKi8KKwljYXNlIDB4OGY6CQkJLyogbWVzc2FnZSBpbgkJCQkJKi8KKwkgICAgLyogREFUQSBJTiAtPiBNRVNTQUdFIElOICovCisJICAgIGhvc3QtPnNjc2kuU0NwLnNjc2lfeGZlcnJlZCA9IGhvc3QtPlNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gLQorCQkJCQkgIGFjb3Juc2NzaV9zYmljX3hmY291bnQoaG9zdCk7CisJICAgIGFjb3Juc2NzaV9kbWFfc3RvcChob3N0KTsKKwkgICAgYWNvcm5zY3NpX21lc3NhZ2UoaG9zdCk7CS8qIC0+IFBIQVNFX01TR0lOLCBQSEFTRV9ESVNDT05ORUNUCQkqLworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIHByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiBQSEFTRV9EQVRBSU4sIFNTUiAlMDJYP1xuIiwKKwkJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCksIHNzcik7CisJICAgIGFjb3Juc2NzaV9kdW1wbG9nKGhvc3QsIGhvc3QtPlNDcG50ID8gaG9zdC0+U0NwbnQtPmRldmljZS0+aWQgOiA4KTsKKwl9CisJcmV0dXJuIElOVFJfUFJPQ0VTU0lORzsKKworICAgIGNhc2UgUEhBU0VfREFUQU9VVDogCQkvKiBTVEFURTogdHJhbnNmZXJyZWQgZGF0YSBvdXQJCQkqLworCS8qCisJICogVGhpcyBpcyBtb3JlIGNvbXBsaWNhdGVkIC0gaWYgd2UgZGlzY29ubmVjdCwgdGhlIERNQSBjb3VsZCBiZSAxMgorCSAqIGJ5dGVzIGFoZWFkIG9mIHVzLiAgV2UgbmVlZCB0byBjb3JyZWN0IHRoaXMuCisJICovCisJc3dpdGNoIChzc3IpIHsKKwljYXNlIDB4MTg6CQkJLyogLT4gUEhBU0VfREFUQU9VVAkJCQkqLworCWNhc2UgMHg4ODoJCQkvKiAtPiBQSEFTRV9EQVRBT1VUCQkJCSovCisJICAgIGFjb3Juc2NzaV9hYm9ydGNtZChob3N0LCBob3N0LT5TQ3BudC0+dGFnKTsKKwkgICAgcmV0dXJuIElOVFJfSURMRTsKKworCWNhc2UgMHgxYjoJCQkvKiAtPiBQSEFTRV9TVEFUVVNJTgkJCQkqLworCWNhc2UgMHg0YjoJCQkvKiAtPiBQSEFTRV9TVEFUVVNJTgkJCQkqLworCWNhc2UgMHg4YjoJCQkvKiAtPiBQSEFTRV9TVEFUVVNJTgkJCQkqLworCSAgICAvKiBEQVRBIE9VVCAtPiBTVEFUVVMgKi8KKwkgICAgaG9zdC0+c2NzaS5TQ3Auc2NzaV94ZmVycmVkID0gaG9zdC0+U0NwbnQtPnJlcXVlc3RfYnVmZmxlbiAtCisJCQkJCSAgYWNvcm5zY3NpX3NiaWNfeGZjb3VudChob3N0KTsKKwkgICAgYWNvcm5zY3NpX2RtYV9zdG9wKGhvc3QpOworCSAgICBhY29ybnNjc2lfZG1hX2FkanVzdChob3N0KTsKKwkgICAgYWNvcm5zY3NpX3JlYWRzdGF0dXNieXRlKGhvc3QpOworCSAgICBob3N0LT5zY3NpLnBoYXNlID0gUEhBU0VfU1RBVFVTSU47CisJICAgIGJyZWFrOworCisJY2FzZSAweDFlOgkJCS8qIC0+IFBIQVNFX01TR09VVAkJCQkqLworCWNhc2UgMHg0ZToJCQkvKiAtPiBQSEFTRV9NU0dPVVQJCQkJKi8KKwljYXNlIDB4OGU6CQkJLyogLT4gUEhBU0VfTVNHT1VUCQkJCSovCisJICAgIC8qIERBVEEgT1VUIC0+IE1FU1NBR0UgT1VUICovCisJICAgIGhvc3QtPnNjc2kuU0NwLnNjc2lfeGZlcnJlZCA9IGhvc3QtPlNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gLQorCQkJCQkgIGFjb3Juc2NzaV9zYmljX3hmY291bnQoaG9zdCk7CisJICAgIGFjb3Juc2NzaV9kbWFfc3RvcChob3N0KTsKKwkgICAgYWNvcm5zY3NpX2RtYV9hZGp1c3QoaG9zdCk7CisJICAgIGFjb3Juc2NzaV9zZW5kbWVzc2FnZShob3N0KTsKKwkgICAgYnJlYWs7CisKKwljYXNlIDB4MWY6CQkJLyogbWVzc2FnZSBpbgkJCQkJKi8KKwljYXNlIDB4NGY6CQkJLyogbWVzc2FnZSBpbgkJCQkJKi8KKwljYXNlIDB4OGY6CQkJLyogbWVzc2FnZSBpbgkJCQkJKi8KKwkgICAgLyogREFUQSBPVVQgLT4gTUVTU0FHRSBJTiAqLworCSAgICBob3N0LT5zY3NpLlNDcC5zY3NpX3hmZXJyZWQgPSBob3N0LT5TQ3BudC0+cmVxdWVzdF9idWZmbGVuIC0KKwkJCQkJICBhY29ybnNjc2lfc2JpY194ZmNvdW50KGhvc3QpOworCSAgICBhY29ybnNjc2lfZG1hX3N0b3AoaG9zdCk7CisJICAgIGFjb3Juc2NzaV9kbWFfYWRqdXN0KGhvc3QpOworCSAgICBhY29ybnNjc2lfbWVzc2FnZShob3N0KTsJLyogLT4gUEhBU0VfTVNHSU4sIFBIQVNFX0RJU0NPTk5FQ1QJCSovCisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuJWM6IFBIQVNFX0RBVEFPVVQsIFNTUiAlMDJYP1xuIiwKKwkJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCksIHNzcik7CisJICAgIGFjb3Juc2NzaV9kdW1wbG9nKGhvc3QsIGhvc3QtPlNDcG50ID8gaG9zdC0+U0NwbnQtPmRldmljZS0+aWQgOiA4KTsKKwl9CisJcmV0dXJuIElOVFJfUFJPQ0VTU0lORzsKKworICAgIGNhc2UgUEhBU0VfU1RBVFVTSU46CQkvKiBTVEFURTogc3RhdHVzIGluIGNvbXBsZXRlCQkJKi8KKwlzd2l0Y2ggKHNzcikgeworCWNhc2UgMHgxZjoJCQkvKiAtPiBQSEFTRV9NU0dJTiwgUEhBU0VfRE9ORSwgUEhBU0VfRElTQ09OTkVDVCAqLworCWNhc2UgMHg4ZjoJCQkvKiAtPiBQSEFTRV9NU0dJTiwgUEhBU0VfRE9ORSwgUEhBU0VfRElTQ09OTkVDVCAqLworCSAgICAvKiBTVEFUVVMgLT4gTUVTU0FHRSBJTiAqLworCSAgICBhY29ybnNjc2lfbWVzc2FnZShob3N0KTsKKwkgICAgYnJlYWs7CisKKwljYXNlIDB4MWU6CQkJLyogLT4gUEhBU0VfTVNHT1VUCQkJCSovCisJY2FzZSAweDhlOgkJCS8qIC0+IFBIQVNFX01TR09VVAkJCQkqLworCSAgICAvKiBTVEFUVVMgLT4gTUVTU0FHRSBPVVQgKi8KKwkgICAgYWNvcm5zY3NpX3NlbmRtZXNzYWdlKGhvc3QpOworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIHByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiBQSEFTRV9TVEFUVVNJTiwgU1NSICUwMlggaW5zdGVhZCBvZiBNRVNTQUdFX0lOP1xuIiwKKwkJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCksIHNzcik7CisJICAgIGFjb3Juc2NzaV9kdW1wbG9nKGhvc3QsIGhvc3QtPlNDcG50ID8gaG9zdC0+U0NwbnQtPmRldmljZS0+aWQgOiA4KTsKKwl9CisJcmV0dXJuIElOVFJfUFJPQ0VTU0lORzsKKworICAgIGNhc2UgUEhBU0VfTVNHSU46CQkJLyogU1RBVEU6IG1lc3NhZ2UgaW4JCQkJKi8KKwlzd2l0Y2ggKHNzcikgeworCWNhc2UgMHgxZToJCQkvKiAtPiBQSEFTRV9NU0dPVVQJCQkJKi8KKwljYXNlIDB4NGU6CQkJLyogLT4gUEhBU0VfTVNHT1VUCQkJCSovCisJY2FzZSAweDhlOgkJCS8qIC0+IFBIQVNFX01TR09VVAkJCQkqLworCSAgICAvKiBNRVNTQUdFIElOIC0+IE1FU1NBR0UgT1VUICovCisJICAgIGFjb3Juc2NzaV9zZW5kbWVzc2FnZShob3N0KTsKKwkgICAgYnJlYWs7CisKKwljYXNlIDB4MWY6CQkJLyogLT4gUEhBU0VfTVNHSU4sIFBIQVNFX0RPTkUsIFBIQVNFX0RJU0NPTk5FQ1QgKi8KKwljYXNlIDB4MmY6CisJY2FzZSAweDRmOgorCWNhc2UgMHg4ZjoKKwkgICAgYWNvcm5zY3NpX21lc3NhZ2UoaG9zdCk7CisJICAgIGJyZWFrOworCisJY2FzZSAweDg1OgorCSAgICBwcmludGsoInNjc2klZC4lYzogc3RyYW5nZSBtZXNzYWdlIGluIGRpc2Nvbm5lY3Rpb25cbiIsCisJCWhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCkpOworCSAgICBhY29ybnNjc2lfZHVtcGxvZyhob3N0LCBob3N0LT5TQ3BudCA/IGhvc3QtPlNDcG50LT5kZXZpY2UtPmlkIDogOCk7CisJICAgIGFjb3Juc2NzaV9kb25lKGhvc3QsICZob3N0LT5TQ3BudCwgRElEX0VSUk9SKTsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBwcmludGsoS0VSTl9FUlIgInNjc2klZC4lYzogUEhBU0VfTVNHSU4sIFNTUiAlMDJYIGFmdGVyIG1lc3NhZ2UgaW4/XG4iLAorCQkgICAgaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSwgc3NyKTsKKwkgICAgYWNvcm5zY3NpX2R1bXBsb2coaG9zdCwgaG9zdC0+U0NwbnQgPyBob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZCA6IDgpOworCX0KKwlyZXR1cm4gSU5UUl9QUk9DRVNTSU5HOworCisgICAgY2FzZSBQSEFTRV9ET05FOgkJCS8qIFNUQVRFOiByZWNlaXZlZCBzdGF0dXMgJiBtZXNzYWdlCQkqLworCXN3aXRjaCAoc3NyKSB7CisJY2FzZSAweDg1OgkJCS8qIC0+IFBIQVNFX0lETEUJCQkJKi8KKwkgICAgYWNvcm5zY3NpX2RvbmUoaG9zdCwgJmhvc3QtPlNDcG50LCBESURfT0spOworCSAgICByZXR1cm4gSU5UUl9ORVhUX0NPTU1BTkQ7CisKKwljYXNlIDB4MWU6CisJY2FzZSAweDhlOgorCSAgICBhY29ybnNjc2lfc2VuZG1lc3NhZ2UoaG9zdCk7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuJWM6IFBIQVNFX0RPTkUsIFNTUiAlMDJYIGluc3RlYWQgb2YgZGlzY29ubmVjdD9cbiIsCisJCSAgICBob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpLCBzc3IpOworCSAgICBhY29ybnNjc2lfZHVtcGxvZyhob3N0LCBob3N0LT5TQ3BudCA/IGhvc3QtPlNDcG50LT5kZXZpY2UtPmlkIDogOCk7CisJfQorCXJldHVybiBJTlRSX1BST0NFU1NJTkc7CisKKyAgICBjYXNlIFBIQVNFX0FCT1JURUQ6CisJc3dpdGNoIChzc3IpIHsKKwljYXNlIDB4ODU6CisJICAgIGlmIChob3N0LT5TQ3BudCkKKwkJYWNvcm5zY3NpX2RvbmUoaG9zdCwgJmhvc3QtPlNDcG50LCBESURfQUJPUlQpOworCSAgICBlbHNlIHsKKwkJY2xlYXJfYml0KGhvc3QtPnNjc2kucmVjb25uZWN0ZWQudGFyZ2V0ICogOCArIGhvc3QtPnNjc2kucmVjb25uZWN0ZWQubHVuLAorCQkJICBob3N0LT5idXN5bHVucyk7CisJCWhvc3QtPnNjc2kucGhhc2UgPSBQSEFTRV9JRExFOworCSAgICB9CisJICAgIHJldHVybiBJTlRSX05FWFRfQ09NTUFORDsKKworCWNhc2UgMHgxZToKKwljYXNlIDB4MmU6CisJY2FzZSAweDRlOgorCWNhc2UgMHg4ZToKKwkgICAgYWNvcm5zY3NpX3NlbmRtZXNzYWdlKGhvc3QpOworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIHByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiBQSEFTRV9BQk9SVEVELCBTU1IgJTAyWD9cbiIsCisJCSAgICBob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpLCBzc3IpOworCSAgICBhY29ybnNjc2lfZHVtcGxvZyhob3N0LCBob3N0LT5TQ3BudCA/IGhvc3QtPlNDcG50LT5kZXZpY2UtPmlkIDogOCk7CisJfQorCXJldHVybiBJTlRSX1BST0NFU1NJTkc7CisKKyAgICBkZWZhdWx0OgorCXByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiB1bmtub3duIGRyaXZlciBwaGFzZSAlZFxuIiwKKwkJaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSwgc3NyKTsKKwlhY29ybnNjc2lfZHVtcGxvZyhob3N0LCBob3N0LT5TQ3BudCA/IGhvc3QtPlNDcG50LT5kZXZpY2UtPmlkIDogOCk7CisgICAgfQorICAgIHJldHVybiBJTlRSX1BST0NFU1NJTkc7Cit9CisKKy8qCisgKiBQcm90b3R5cGU6IHZvaWQgYWNvcm5zY3NpX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKyAqIFB1cnBvc2UgIDogaGFuZGxlIGludGVycnVwdHMgZnJvbSBBY29ybiBTQ1NJIGNhcmQKKyAqIFBhcmFtcyAgIDogaXJxICAgIC0gaW50ZXJydXB0IG51bWJlcgorICoJICAgICAgZGV2X2lkIC0gZGV2aWNlIHNwZWNpZmljIGRhdGEgKEFTX0hvc3Qgc3RydWN0dXJlKQorICoJICAgICAgcmVncyAgIC0gcHJvY2Vzc29yIHJlZ2lzdGVycyB3aGVuIGludGVycnVwdCBvY2N1cnJlZAorICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK2Fjb3Juc2NzaV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgQVNfSG9zdCAqaG9zdCA9IChBU19Ib3N0ICopZGV2X2lkOworICAgIGludHJfcmV0X3QgcmV0OworICAgIGludCBpb3N0YXR1czsKKyAgICBpbnQgaW5faXJxID0gMDsKKworICAgIGRvIHsKKwlyZXQgPSBJTlRSX0lETEU7CisKKwlpb3N0YXR1cyA9IGluYihob3N0LT5jYXJkLmlvX2ludHIpOworCisJaWYgKGlvc3RhdHVzICYgMikgeworCSAgICBhY29ybnNjc2lfZG1hX2ludHIoaG9zdCk7CisJICAgIGlvc3RhdHVzID0gaW5iKGhvc3QtPmNhcmQuaW9faW50cik7CisJfQorCisJaWYgKGlvc3RhdHVzICYgOCkKKwkgICAgcmV0ID0gYWNvcm5zY3NpX3NiaWNpbnRyKGhvc3QsIGluX2lycSk7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgYSB0cmFuc2ZlciBwZW5kaW5nLCBzdGFydCBpdC4KKwkgKiBPbmx5IHN0YXJ0IGl0IGlmIHRoZSBpbnRlcmZhY2UgaGFzIGFscmVhZHkgc3RhcnRlZCB0cmFuc2ZlcnJpbmcKKwkgKiBpdCdzIGRhdGEKKwkgKi8KKwlpZiAoaG9zdC0+ZG1hLnhmZXJfcmVxdWlyZWQpCisJICAgIGFjb3Juc2NzaV9kbWFfeGZlcihob3N0KTsKKworCWlmIChyZXQgPT0gSU5UUl9ORVhUX0NPTU1BTkQpCisJICAgIHJldCA9IGFjb3Juc2NzaV9raWNrKGhvc3QpOworCisJaW5faXJxID0gMTsKKyAgICB9IHdoaWxlIChyZXQgIT0gSU5UUl9JRExFKTsKKworICAgIHJldHVybiBJUlFfSEFORExFRDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEludGVyZmFjZXMgYmV0d2VlbiBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgcmVzdCBvZiBzY3NpIGNvZGUKKyAqLworCisvKgorICogRnVuY3Rpb24gOiBhY29ybnNjc2lfcXVldWVjbWQoU2NzaV9DbW5kICpjbWQsIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpCisgKiBQdXJwb3NlICA6IHF1ZXVlcyBhIFNDU0kgY29tbWFuZAorICogUGFyYW1zICAgOiBjbWQgIC0gU0NTSSBjb21tYW5kCisgKgkgICAgICBkb25lIC0gZnVuY3Rpb24gY2FsbGVkIG9uIGNvbXBsZXRpb24sIHdpdGggcG9pbnRlciB0byBjb21tYW5kIGRlc2NyaXB0b3IKKyAqIFJldHVybnMgIDogMCwgb3IgPCAwIG9uIGVycm9yLgorICovCitpbnQgYWNvcm5zY3NpX3F1ZXVlY21kKFNjc2lfQ21uZCAqU0NwbnQsIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpCit7CisgICAgQVNfSG9zdCAqaG9zdCA9IChBU19Ib3N0ICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKyAgICBpZiAoIWRvbmUpIHsKKwkvKiB0aGVyZSBzaG91bGQgYmUgc29tZSB3YXkgb2YgcmVqZWN0aW5nIGVycm9ycyBsaWtlIHRoaXMgd2l0aG91dCBwYW5pY2luZy4uLiAqLworCXBhbmljKCJzY3NpJWQ6IHF1ZXVlY29tbWFuZCBjYWxsZWQgd2l0aCBOVUxMIGRvbmUgZnVuY3Rpb24gW2NtZD0lcF0iLAorCQlob3N0LT5ob3N0LT5ob3N0X25vLCBTQ3BudCk7CisJcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisjaWYgKERFQlVHICYgREVCVUdfTk9fV1JJVEUpCisgICAgaWYgKGFjb3Juc2NzaV9jbWR0eXBlKFNDcG50LT5jbW5kWzBdKSA9PSBDTURfV1JJVEUgJiYgKE5PX1dSSVRFICYgKDEgPDwgU0NwbnQtPmRldmljZS0+aWQpKSkgeworCXByaW50ayhLRVJOX0NSSVQgInNjc2klZC4lYzogV1JJVEUgYXR0ZW1wdGVkIHdpdGggTk9fV1JJVEUgZmxhZyBzZXRcbiIsCisJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sICcwJyArIFNDcG50LT5kZXZpY2UtPmlkKTsKKwlTQ3BudC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJZG9uZShTQ3BudCk7CisJcmV0dXJuIDA7CisgICAgfQorI2VuZGlmCisKKyAgICBTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKKyAgICBTQ3BudC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisgICAgU0NwbnQtPnJlc3VsdCA9IDA7CisgICAgU0NwbnQtPnRhZyA9IDA7CisgICAgU0NwbnQtPlNDcC5waGFzZSA9IChpbnQpYWNvcm5zY3NpX2RhdGFkaXJlY3Rpb24oU0NwbnQtPmNtbmRbMF0pOworICAgIFNDcG50LT5TQ3Auc2VudF9jb21tYW5kID0gMDsKKyAgICBTQ3BudC0+U0NwLnNjc2lfeGZlcnJlZCA9IDA7CisKKyAgICBpbml0X1NDcChTQ3BudCk7CisKKyAgICBob3N0LT5zdGF0cy5xdWV1ZXMgKz0gMTsKKworICAgIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFxdWV1ZV9hZGRfY21kX29yZGVyZWQoJmhvc3QtPnF1ZXVlcy5pc3N1ZSwgU0NwbnQpKSB7CisJICAgIFNDcG50LT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJICAgIGRvbmUoU0NwbnQpOworCSAgICByZXR1cm4gMDsKKwl9CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChob3N0LT5zY3NpLnBoYXNlID09IFBIQVNFX0lETEUpCisJICAgIGFjb3Juc2NzaV9raWNrKGhvc3QpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm90b3R5cGU6IHZvaWQgYWNvcm5zY3NpX3JlcG9ydHN0YXR1cyhTY3NpX0NtbmQgKipTQ3BudHAxLCBTY3NpX0NtbmQgKipTQ3BudHAyLCBpbnQgcmVzdWx0KQorICogUHVycG9zZSAgOiBwYXNzIGEgcmVzdWx0IHRvICpTQ3BudHAxLCBhbmQgY2hlY2sgaWYgKlNDcG50cDEgPSAqU0NwbnRwMgorICogUGFyYW1zICAgOiBTQ3BudHAxIC0gcG9pbnRlciB0byBjb21tYW5kIHRvIHJldHVybgorICoJICAgICAgU0NwbnRwMiAtIHBvaW50ZXIgdG8gY29tbWFuZCB0byBjaGVjaworICoJICAgICAgcmVzdWx0ICAtIHJlc3VsdCB0byBwYXNzIGJhY2sgdG8gbWlkLWxldmVsIGRvbmUgZnVuY3Rpb24KKyAqIFJldHVybnMgIDogKlNDcG50cDIgPSBOVUxMIGlmICpTQ3BudHAxIGlzIHRoZSBzYW1lIGNvbW1hbmQgc3RydWN0dXJlIGFzICpTQ3BudHAyLgorICovCitzdGF0aWMgaW5saW5lCit2b2lkIGFjb3Juc2NzaV9yZXBvcnRzdGF0dXMoU2NzaV9DbW5kICoqU0NwbnRwMSwgU2NzaV9DbW5kICoqU0NwbnRwMiwgaW50IHJlc3VsdCkKK3sKKyAgICBTY3NpX0NtbmQgKlNDcG50ID0gKlNDcG50cDE7CisKKyAgICBpZiAoU0NwbnQpIHsKKwkqU0NwbnRwMSA9IE5VTEw7CisKKwlTQ3BudC0+cmVzdWx0ID0gcmVzdWx0OworCVNDcG50LT5zY3NpX2RvbmUoU0NwbnQpOworICAgIH0KKworICAgIGlmIChTQ3BudCA9PSAqU0NwbnRwMikKKwkqU0NwbnRwMiA9IE5VTEw7Cit9CisKK2VudW0gcmVzX2Fib3J0IHsgcmVzX25vdF9ydW5uaW5nLCByZXNfc3VjY2VzcywgcmVzX3N1Y2Nlc3NfY2xlYXIsIHJlc19zbm9vemUgfTsKKworLyoKKyAqIFByb3RvdHlwZTogZW51bSByZXMgYWNvcm5zY3NpX2RvX2Fib3J0KFNjc2lfQ21uZCAqU0NwbnQpCisgKiBQdXJwb3NlICA6IGFib3J0IGEgY29tbWFuZCBvbiB0aGlzIGhvc3QKKyAqIFBhcmFtcyAgIDogU0NwbnQgLSBjb21tYW5kIHRvIGFib3J0CisgKiBSZXR1cm5zICA6IG91ciBhYm9ydCBzdGF0dXMKKyAqLworc3RhdGljIGVudW0gcmVzX2Fib3J0CithY29ybnNjc2lfZG9fYWJvcnQoQVNfSG9zdCAqaG9zdCwgU2NzaV9DbW5kICpTQ3BudCkKK3sKKwllbnVtIHJlc19hYm9ydCByZXMgPSByZXNfbm90X3J1bm5pbmc7CisKKwlpZiAocXVldWVfcmVtb3ZlX2NtZCgmaG9zdC0+cXVldWVzLmlzc3VlLCBTQ3BudCkpIHsKKwkJLyoKKwkJICogVGhlIGNvbW1hbmQgd2FzIG9uIHRoZSBpc3N1ZSBxdWV1ZSwgYW5kIGhhcyBub3QgYmVlbgorCQkgKiBpc3N1ZWQgeWV0LiAgV2UgY2FuIHJlbW92ZSB0aGUgY29tbWFuZCBmcm9tIHRoZSBxdWV1ZSwKKwkJICogYW5kIGFja25vd2xlZGdlIHRoZSBhYm9ydC4gIE5laXRoZXIgdGhlIGRldmljZXMgbm9yIHRoZQorCQkgKiBpbnRlcmZhY2Uga25vdyBhYm91dCB0aGUgY29tbWFuZC4KKwkJICovCisvLyNpZiAoREVCVUcgJiBERUJVR19BQk9SVCkKKwkJcHJpbnRrKCJvbiBpc3N1ZSBxdWV1ZSAiKTsKKy8vI2VuZGlmCisJCXJlcyA9IHJlc19zdWNjZXNzOworCX0gZWxzZSBpZiAocXVldWVfcmVtb3ZlX2NtZCgmaG9zdC0+cXVldWVzLmRpc2Nvbm5lY3RlZCwgU0NwbnQpKSB7CisJCS8qCisJCSAqIFRoZSBjb21tYW5kIHdhcyBvbiB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLiAgU2ltcGx5CisJCSAqIGFja25vd2xlZGdlIHRoZSBhYm9ydCBjb25kaXRpb24sIGFuZCB3aGVuIHRoZSB0YXJnZXQKKwkJICogcmVjb25uZWN0cywgd2Ugd2lsbCBnaXZlIGl0IGFuIEFCT1JUIG1lc3NhZ2UuICBUaGUKKwkJICogdGFyZ2V0IHNob3VsZCB0aGVuIGRpc2Nvbm5lY3QsIGFuZCB3ZSB3aWxsIGNsZWFyCisJCSAqIHRoZSBidXN5bHVuIGJpdC4KKwkJICovCisvLyNpZiAoREVCVUcgJiBERUJVR19BQk9SVCkKKwkJcHJpbnRrKCJvbiBkaXNjb25uZWN0ZWQgcXVldWUgIik7CisvLyNlbmRpZgorCQlyZXMgPSByZXNfc3VjY2VzczsKKwl9IGVsc2UgaWYgKGhvc3QtPlNDcG50ID09IFNDcG50KSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKy8vI2lmIChERUJVRyAmIERFQlVHX0FCT1JUKQorCQlwcmludGsoImV4ZWN1dGluZyAiKTsKKy8vI2VuZGlmCisKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlzd2l0Y2ggKGhvc3QtPnNjc2kucGhhc2UpIHsKKwkJLyoKKwkJICogSWYgdGhlIGludGVyZmFjZSBpcyBpZGxlLCBhbmQgdGhlIGNvbW1hbmQgaXMgJ2Rpc2Nvbm5lY3RhYmxlJywKKwkJICogdGhlbiBpdCBpcyB0aGUgc2FtZSBhcyBvbiB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLiAgV2Ugc2ltcGx5CisJCSAqIHJlbW92ZSBhbGwgdHJhY2VzIG9mIHRoZSBjb21tYW5kLiAgV2hlbiB0aGUgdGFyZ2V0IHJlY29ubmVjdHMsCisJCSAqIHdlIHdpbGwgZ2l2ZSBpdCBhbiBBQk9SVCBtZXNzYWdlIHNpbmNlIHRoZSBjb21tYW5kIGNvdWxkIG5vdAorCQkgKiBiZSBmb3VuZC4gIFdoZW4gdGhlIHRhcmdldCBmaW5hbGx5IGRpc2Nvbm5lY3RzLCB3ZSB3aWxsIGNsZWFyCisJCSAqIHRoZSBidXN5bHVuIGJpdC4KKwkJICovCisJCWNhc2UgUEhBU0VfSURMRToKKwkJCWlmIChob3N0LT5zY3NpLmRpc2Nvbm5lY3RhYmxlKSB7CisJCQkJaG9zdC0+c2NzaS5kaXNjb25uZWN0YWJsZSA9IDA7CisJCQkJaG9zdC0+U0NwbnQgPSBOVUxMOworCQkJCXJlcyA9IHJlc19zdWNjZXNzOworCQkJfQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogSWYgdGhlIGNvbW1hbmQgaGFzIGNvbm5lY3RlZCBhbmQgZG9uZSBub3RoaW5nIGZ1cnRoZXIsCisJCSAqIHNpbXBseSBmb3JjZSBhIGRpc2Nvbm5lY3QuICBXZSBhbHNvIG5lZWQgdG8gY2xlYXIgdGhlCisJCSAqIGJ1c3lsdW4gYml0LgorCQkgKi8KKwkJY2FzZSBQSEFTRV9DT05ORUNURUQ6CisJCQlzYmljX2FybV93cml0ZShob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfQ01ORCwgQ01ORF9ESVNDT05ORUNUKTsKKwkJCWhvc3QtPlNDcG50ID0gTlVMTDsKKwkJCXJlcyA9IHJlc19zdWNjZXNzX2NsZWFyOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWFjb3Juc2NzaV9hYm9ydGNtZChob3N0LCBob3N0LT5TQ3BudC0+dGFnKTsKKwkJCXJlcyA9IHJlc19zbm9vemU7CisJCX0KKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0gZWxzZSBpZiAoaG9zdC0+b3JpZ1NDcG50ID09IFNDcG50KSB7CisJCS8qCisJCSAqIFRoZSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgbmV4dCwgYnV0IGEgY29tbWFuZAorCQkgKiBpcyBjdXJyZW50bHkgdXNpbmcgdGhlIGludGVyZmFjZS4gIFRoaXMgaXMgc2ltaWxhciB0bworCQkgKiBiZWluZyBvbiB0aGUgaXNzdWUgcXVldWUsIGV4Y2VwdCB0aGUgYnVzeWx1biBiaXQgaGFzCisJCSAqIGJlZW4gc2V0LgorCQkgKi8KKwkJaG9zdC0+b3JpZ1NDcG50ID0gTlVMTDsKKy8vI2lmIChERUJVRyAmIERFQlVHX0FCT1JUKQorCQlwcmludGsoIndhaXRpbmcgZm9yIGV4ZWN1dGlvbiAiKTsKKy8vI2VuZGlmCisJCXJlcyA9IHJlc19zdWNjZXNzX2NsZWFyOworCX0gZWxzZQorCQlwcmludGsoInVua25vd24gIik7CisKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogUHJvdG90eXBlOiBpbnQgYWNvcm5zY3NpX2Fib3J0KFNjc2lfQ21uZCAqU0NwbnQpCisgKiBQdXJwb3NlICA6IGFib3J0IGEgY29tbWFuZCBvbiB0aGlzIGhvc3QKKyAqIFBhcmFtcyAgIDogU0NwbnQgLSBjb21tYW5kIHRvIGFib3J0CisgKiBSZXR1cm5zICA6IG9uZSBvZiBTQ1NJX0FCT1JUXyBtYWNyb3MKKyAqLworaW50IGFjb3Juc2NzaV9hYm9ydChTY3NpX0NtbmQgKlNDcG50KQoreworCUFTX0hvc3QgKmhvc3QgPSAoQVNfSG9zdCAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlpbnQgcmVzdWx0OworCisJaG9zdC0+c3RhdHMuYWJvcnRzICs9IDE7CisKKyNpZiAoREVCVUcgJiBERUJVR19BQk9SVCkKKwl7CisJCWludCBhc3IsIHNzcjsKKwkJYXNyID0gc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfQVNSKTsKKwkJc3NyID0gc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfU1NSKTsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhY29ybnNjc2lfYWJvcnQ6ICIpOworCQlwcmludF9zYmljX3N0YXR1cyhhc3IsIHNzciwgaG9zdC0+c2NzaS5waGFzZSk7CisJCWFjb3Juc2NzaV9kdW1wbG9nKGhvc3QsIFNDcG50LT5kZXZpY2UtPmlkKTsKKwl9CisjZW5kaWYKKworCXByaW50aygic2NzaSVkOiAiLCBob3N0LT5ob3N0LT5ob3N0X25vKTsKKworCXN3aXRjaCAoYWNvcm5zY3NpX2RvX2Fib3J0KGhvc3QsIFNDcG50KSkgeworCS8qCisJICogV2UgbWFuYWdlZCB0byBmaW5kIHRoZSBjb21tYW5kIGFuZCBjbGVhcmVkIGl0IG91dC4KKwkgKiBXZSBkbyBub3QgZXhwZWN0IHRoZSBjb21tYW5kIHRvIGJlIGV4ZWN1dGluZyBvbiB0aGUKKwkgKiB0YXJnZXQsIGJ1dCB3ZSBoYXZlIHNldCB0aGUgYnVzeWx1biBiaXQuCisJICovCisJY2FzZSByZXNfc3VjY2Vzc19jbGVhcjoKKy8vI2lmIChERUJVRyAmIERFQlVHX0FCT1JUKQorCQlwcmludGsoImNsZWFyICIpOworLy8jZW5kaWYKKwkJY2xlYXJfYml0KFNDcG50LT5kZXZpY2UtPmlkICogOCArIFNDcG50LT5kZXZpY2UtPmx1biwgaG9zdC0+YnVzeWx1bnMpOworCisJLyoKKwkgKiBXZSBmb3VuZCB0aGUgY29tbWFuZCwgYW5kIGNsZWFyZWQgaXQgb3V0LiAgRWl0aGVyCisJICogdGhlIGNvbW1hbmQgaXMgc3RpbGwga25vd24gdG8gYmUgZXhlY3V0aW5nIG9uIHRoZQorCSAqIHRhcmdldCwgb3IgdGhlIGJ1c3lsdW4gYml0IGlzIG5vdCBzZXQuCisJICovCisJY2FzZSByZXNfc3VjY2VzczoKKy8vI2lmIChERUJVRyAmIERFQlVHX0FCT1JUKQorCQlwcmludGsoInN1Y2Nlc3NcbiIpOworLy8jZW5kaWYKKwkJU0NwbnQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKwkJU0NwbnQtPnNjc2lfZG9uZShTQ3BudCk7CisJCXJlc3VsdCA9IFNDU0lfQUJPUlRfU1VDQ0VTUzsKKwkJYnJlYWs7CisKKwkvKgorCSAqIFdlIGRpZCBmaW5kIHRoZSBjb21tYW5kLCBidXQgdW5mb3J0dW5hdGVseSB3ZSBjb3VsZG4ndAorCSAqIHVuaG9vayBpdCBmcm9tIG91cnNlbHZlcy4gIFdhaXQgc29tZSBtb3JlLCBhbmQgaWYgaXQKKwkgKiBzdGlsbCBkb2Vzbid0IGNvbXBsZXRlLCByZXNldCB0aGUgaW50ZXJmYWNlLgorCSAqLworCWNhc2UgcmVzX3Nub296ZToKKy8vI2lmIChERUJVRyAmIERFQlVHX0FCT1JUKQorCQlwcmludGsoInNub296ZVxuIik7CisvLyNlbmRpZgorCQlyZXN1bHQgPSBTQ1NJX0FCT1JUX1NOT09aRTsKKwkJYnJlYWs7CisKKwkvKgorCSAqIFRoZSBjb21tYW5kIGNvdWxkIG5vdCBiZSBmb3VuZCAoZWl0aGVyIGJlY2F1c2UgaXQgY29tcGxldGVkLAorCSAqIG9yIGl0IGdvdCBkcm9wcGVkLgorCSAqLworCWRlZmF1bHQ6CisJY2FzZSByZXNfbm90X3J1bm5pbmc6CisJCWFjb3Juc2NzaV9kdW1wbG9nKGhvc3QsIFNDcG50LT5kZXZpY2UtPmlkKTsKKyNpZiAoREVCVUcgJiBERUJVR19BQk9SVCkKKwkJcmVzdWx0ID0gU0NTSV9BQk9SVF9TTk9PWkU7CisjZWxzZQorCQlyZXN1bHQgPSBTQ1NJX0FCT1JUX05PVF9SVU5OSU5HOworI2VuZGlmCisvLyNpZiAoREVCVUcgJiBERUJVR19BQk9SVCkKKwkJcHJpbnRrKCJub3QgcnVubmluZ1xuIik7CisvLyNlbmRpZgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogUHJvdG90eXBlOiBpbnQgYWNvcm5zY3NpX3Jlc2V0KFNjc2lfQ21uZCAqU0NwbnQsIHVuc2lnbmVkIGludCByZXNldF9mbGFncykKKyAqIFB1cnBvc2UgIDogcmVzZXQgYSBjb21tYW5kIG9uIHRoaXMgaG9zdC9yZXNldCB0aGlzIGhvc3QKKyAqIFBhcmFtcyAgIDogU0NwbnQgIC0gY29tbWFuZCBjYXVzaW5nIHJlc2V0CisgKgkgICAgICByZXN1bHQgLSB3aGF0IHR5cGUgb2YgcmVzZXQgdG8gcGVyZm9ybQorICogUmV0dXJucyAgOiBvbmUgb2YgU0NTSV9SRVNFVF8gbWFjcm9zCisgKi8KK2ludCBhY29ybnNjc2lfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCwgdW5zaWduZWQgaW50IHJlc2V0X2ZsYWdzKQoreworICAgIEFTX0hvc3QgKmhvc3QgPSAoQVNfSG9zdCAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworICAgIFNjc2lfQ21uZCAqU0NwdHI7CisgICAgCisgICAgaG9zdC0+c3RhdHMucmVzZXRzICs9IDE7CisKKyNpZiAoREVCVUcgJiBERUJVR19SRVNFVCkKKyAgICB7CisJaW50IGFzciwgc3NyOworCisJYXNyID0gc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfQVNSKTsKKwlzc3IgPSBzYmljX2FybV9yZWFkKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19TU1IpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiYWNvcm5zY3NpX3Jlc2V0OiAiKTsKKwlwcmludF9zYmljX3N0YXR1cyhhc3IsIHNzciwgaG9zdC0+c2NzaS5waGFzZSk7CisJYWNvcm5zY3NpX2R1bXBsb2coaG9zdCwgU0NwbnQtPmRldmljZS0+aWQpOworICAgIH0KKyNlbmRpZgorCisgICAgYWNvcm5zY3NpX2RtYV9zdG9wKGhvc3QpOworCisgICAgU0NwdHIgPSBob3N0LT5TQ3BudDsKKworICAgIC8qCisgICAgICogZG8gaGFyZCByZXNldC4gIFRoaXMgcmVzZXRzIGFsbCBkZXZpY2VzIG9uIHRoaXMgaG9zdCwgYW5kIHNvIHdlCisgICAgICogbXVzdCBzZXQgdGhlIHJlc2V0IHN0YXR1cyBvbiBhbGwgY29tbWFuZHMuCisgICAgICovCisgICAgYWNvcm5zY3NpX3Jlc2V0Y2FyZChob3N0KTsKKworICAgIC8qCisgICAgICogcmVwb3J0IHJlc2V0IG9uIGNvbW1hbmRzIGN1cnJlbnQgY29ubmVjdGVkL2Rpc2Nvbm5lY3RlZAorICAgICAqLworICAgIGFjb3Juc2NzaV9yZXBvcnRzdGF0dXMoJmhvc3QtPlNDcG50LCAmU0NwdHIsIERJRF9SRVNFVCk7CisKKyAgICB3aGlsZSAoKFNDcHRyID0gcXVldWVfcmVtb3ZlKCZob3N0LT5xdWV1ZXMuZGlzY29ubmVjdGVkKSkgIT0gTlVMTCkKKwlhY29ybnNjc2lfcmVwb3J0c3RhdHVzKCZTQ3B0ciwgJlNDcG50LCBESURfUkVTRVQpOworCisgICAgaWYgKFNDcG50KSB7CisJU0NwbnQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwlTQ3BudC0+c2NzaV9kb25lKFNDcG50KTsKKyAgICB9CisKKyAgICByZXR1cm4gU0NTSV9SRVNFVF9CVVNfUkVTRVQgfCBTQ1NJX1JFU0VUX0hPU1RfUkVTRVQgfCBTQ1NJX1JFU0VUX1NVQ0NFU1M7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogaW5pdGlhbGlzYXRpb24gJiBtaXNjZWxsYW5lb3VzIHN1cHBvcnQKKyAqLworCisvKgorICogRnVuY3Rpb246IGNoYXIgKmFjb3Juc2NzaV9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCisgKiBQdXJwb3NlIDogcmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyBpbnRlcmZhY2UKKyAqIFBhcmFtcyAgOiBob3N0IC0gaG9zdCB0byBnaXZlIGluZm9ybWF0aW9uIG9uCisgKiBSZXR1cm5zIDogYSBjb25zdGFudCBzdHJpbmcKKyAqLworY29uc3QKK2NoYXIgKmFjb3Juc2NzaV9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisgICAgc3RhdGljIGNoYXIgc3RyaW5nWzEwMF0sICpwOworCisgICAgcCA9IHN0cmluZzsKKyAgICAKKyAgICBwICs9IHNwcmludGYoc3RyaW5nLCAiJXMgYXQgcG9ydCAlMDhsWCBpcnEgJWQgdiVkLiVkLiVkIgorI2lmZGVmIENPTkZJR19TQ1NJX0FDT1JOU0NTSV9TWU5DCisgICAgIiBTWU5DIgorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NDU0lfQUNPUk5TQ1NJX1RBR0dFRF9RVUVVRQorICAgICIgVEFHIgorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NDU0lfQUNPUk5TQ1NJX0xJTksKKyAgICAiIExJTksiCisjZW5kaWYKKyNpZiAoREVCVUcgJiBERUJVR19OT19XUklURSkKKyAgICAiIE5PV1JJVEUgKCJOT19XUklURV9TVFIiKSIKKyNlbmRpZgorCQksIGhvc3QtPmhvc3R0LT5uYW1lLCBob3N0LT5pb19wb3J0LCBob3N0LT5pcnEsCisJCVZFUl9NQUpPUiwgVkVSX01JTk9SLCBWRVJfUEFUQ0gpOworICAgIHJldHVybiBzdHJpbmc7Cit9CisKK2ludCBhY29ybnNjc2lfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworICAgIGludCBwb3MsIGJlZ2luID0gMCwgZGV2aWR4OworICAgIFNjc2lfRGV2aWNlICpzY2Q7CisgICAgQVNfSG9zdCAqaG9zdDsKKyAgICBjaGFyICpwID0gYnVmZmVyOworCisgICAgaWYgKGlub3V0ID09IDEpCisJcmV0dXJuIC1FSU5WQUw7CisKKyAgICBob3N0ICA9IChBU19Ib3N0ICopaW5zdGFuY2UtPmhvc3RkYXRhOworICAgIAorICAgIHAgKz0gc3ByaW50ZihwLCAiQWNvcm5TQ1NJIGRyaXZlciB2JWQuJWQuJWQiCisjaWZkZWYgQ09ORklHX1NDU0lfQUNPUk5TQ1NJX1NZTkMKKyAgICAiIFNZTkMiCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0NTSV9BQ09STlNDU0lfVEFHR0VEX1FVRVVFCisgICAgIiBUQUciCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0NTSV9BQ09STlNDU0lfTElOSworICAgICIgTElOSyIKKyNlbmRpZgorI2lmIChERUJVRyAmIERFQlVHX05PX1dSSVRFKQorICAgICIgTk9XUklURSAoIk5PX1dSSVRFX1NUUiIpIgorI2VuZGlmCisJCSJcblxuIiwgVkVSX01BSk9SLCBWRVJfTUlOT1IsIFZFUl9QQVRDSCk7CisKKyAgICBwICs9IHNwcmludGYocCwJIlNCSUM6IFdEMzNDOTNBICBBZGRyZXNzOiAlMDhYICBJUlEgOiAlZFxuIiwKKwkJCWhvc3QtPnNjc2kuaW9fcG9ydCwgaG9zdC0+c2NzaS5pcnEpOworI2lmZGVmIFVTRV9ETUFDCisgICAgcCArPSBzcHJpbnRmKHAsCSJETUFDOiB1UEM3MTA3MSAgQWRkcmVzczogJTA4WCAgSVJRIDogJWRcblxuIiwKKwkJCWhvc3QtPmRtYS5pb19wb3J0LCBob3N0LT5zY3NpLmlycSk7CisjZW5kaWYKKworICAgIHAgKz0gc3ByaW50ZihwLAkiU3RhdGlzdGljczpcbiIKKwkJCSJRdWV1ZWQgY29tbWFuZHM6ICUtMTB1ICAgIElzc3VlZCBjb21tYW5kczogJS0xMHVcbiIKKwkJCSJEb25lIGNvbW1hbmRzICA6ICUtMTB1ICAgIFJlYWRzICAgICAgICAgIDogJS0xMHVcbiIKKwkJCSJXcml0ZXMgICAgICAgICA6ICUtMTB1ICAgIE90aGVycyAgICAgICAgIDogJS0xMHVcbiIKKwkJCSJEaXNjb25uZWN0cyAgICA6ICUtMTB1ICAgIEFib3J0cyAgICAgICAgIDogJS0xMHVcbiIKKwkJCSJSZXNldHMgICAgICAgICA6ICUtMTB1XG5cbkxhc3QgcGhhc2VzOiIsCisJCQlob3N0LT5zdGF0cy5xdWV1ZXMsCQlob3N0LT5zdGF0cy5yZW1vdmVzLAorCQkJaG9zdC0+c3RhdHMuZmlucywJCWhvc3QtPnN0YXRzLnJlYWRzLAorCQkJaG9zdC0+c3RhdHMud3JpdGVzLAkJaG9zdC0+c3RhdHMubWlzY3MsCisJCQlob3N0LT5zdGF0cy5kaXNjb25uZWN0cywJaG9zdC0+c3RhdHMuYWJvcnRzLAorCQkJaG9zdC0+c3RhdHMucmVzZXRzKTsKKworICAgIGZvciAoZGV2aWR4ID0gMDsgZGV2aWR4IDwgOTsgZGV2aWR4ICsrKSB7CisJdW5zaWduZWQgaW50IHN0YXRwdHIsIHByZXY7CisKKwlwICs9IHNwcmludGYocCwgIlxuJWM6IiwgZGV2aWR4ID09IDggPyAnSCcgOiAoJzAnICsgZGV2aWR4KSk7CisJc3RhdHB0ciA9IGhvc3QtPnN0YXR1c19wdHJbZGV2aWR4XSAtIDEwOworCisJaWYgKChzaWduZWQgaW50KXN0YXRwdHIgPCAwKQorCSAgICBzdGF0cHRyICs9IFNUQVRVU19CVUZGRVJfU0laRTsKKworCXByZXYgPSBob3N0LT5zdGF0dXNbZGV2aWR4XVtzdGF0cHRyXS53aGVuOworCisJZm9yICg7IHN0YXRwdHIgIT0gaG9zdC0+c3RhdHVzX3B0cltkZXZpZHhdOyBzdGF0cHRyID0gKHN0YXRwdHIgKyAxKSAmIChTVEFUVVNfQlVGRkVSX1NJWkUgLSAxKSkgeworCSAgICBpZiAoaG9zdC0+c3RhdHVzW2RldmlkeF1bc3RhdHB0cl0ud2hlbikgeworCQlwICs9IHNwcmludGYocCwgIiVjJTAyWDolMDJYKyUybGQiLAorCQkJaG9zdC0+c3RhdHVzW2RldmlkeF1bc3RhdHB0cl0uaXJxID8gJy0nIDogJyAnLAorCQkJaG9zdC0+c3RhdHVzW2RldmlkeF1bc3RhdHB0cl0ucGgsCisJCQlob3N0LT5zdGF0dXNbZGV2aWR4XVtzdGF0cHRyXS5zc3IsCisJCQkoaG9zdC0+c3RhdHVzW2RldmlkeF1bc3RhdHB0cl0ud2hlbiAtIHByZXYpIDwgMTAwID8KKwkJCQkoaG9zdC0+c3RhdHVzW2RldmlkeF1bc3RhdHB0cl0ud2hlbiAtIHByZXYpIDogOTkpOworCQlwcmV2ID0gaG9zdC0+c3RhdHVzW2RldmlkeF1bc3RhdHB0cl0ud2hlbjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBwICs9IHNwcmludGYocCwgIlxuQXR0YWNoZWQgZGV2aWNlczpcbiIpOworCisgICAgc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHNjZCwgaW5zdGFuY2UpIHsKKwlwICs9IHNwcmludGYocCwgIkRldmljZS9MdW4gVGFnZ2VkUSAgICAgIFN5bmNcbiIpOworCXAgKz0gc3ByaW50ZihwLCAiICAgICAlZC8lZCAgICIsIHNjZC0+aWQsIHNjZC0+bHVuKTsKKwlpZiAoc2NkLT50YWdnZWRfc3VwcG9ydGVkKQorCQlwICs9IHNwcmludGYocCwgIiUzc2FibGVkKCUzZCkgIiwKKwkJCSAgICAgc2NkLT5zaW1wbGVfdGFncyA/ICJlbiIgOiAiZGlzIiwKKwkJCSAgICAgc2NkLT5jdXJyZW50X3RhZyk7CisJZWxzZQorCQlwICs9IHNwcmludGYocCwgInVuc3VwcG9ydGVkICAiKTsKKworCWlmIChob3N0LT5kZXZpY2Vbc2NkLT5pZF0uc3luY194ZmVyICYgMTUpCisJCXAgKz0gc3ByaW50ZihwLCAib2Zmc2V0ICVkLCAlZCBuc1xuIiwKKwkJCSAgICAgaG9zdC0+ZGV2aWNlW3NjZC0+aWRdLnN5bmNfeGZlciAmIDE1LAorCQkJICAgICBhY29ybnNjc2lfZ2V0cGVyaW9kKGhvc3QtPmRldmljZVtzY2QtPmlkXS5zeW5jX3hmZXIpKTsKKwllbHNlCisJCXAgKz0gc3ByaW50ZihwLCAiYXN5bmNcbiIpOworCisJcG9zID0gcCAtIGJ1ZmZlcjsKKwlpZiAocG9zICsgYmVnaW4gPCBvZmZzZXQpIHsKKwkgICAgYmVnaW4gKz0gcG9zOworCSAgICBwID0gYnVmZmVyOworCX0KKwlwb3MgPSBwIC0gYnVmZmVyOworCWlmIChwb3MgKyBiZWdpbiA+IG9mZnNldCArIGxlbmd0aCkgeworCSAgICBzY3NpX2RldmljZV9wdXQoc2NkKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIHBvcyA9IHAgLSBidWZmZXI7CisKKyAgICAqc3RhcnQgPSBidWZmZXIgKyAob2Zmc2V0IC0gYmVnaW4pOworICAgIHBvcyAtPSBvZmZzZXQgLSBiZWdpbjsKKworICAgIGlmIChwb3MgPiBsZW5ndGgpCisJcG9zID0gbGVuZ3RoOworCisgICAgcmV0dXJuIHBvczsKK30KKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBhY29ybnNjc2lfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLnByb2NfaW5mbwkJPSBhY29ybnNjc2lfcHJvY19pbmZvLAorCS5uYW1lCQkJPSAiQWNvcm5TQ1NJIiwKKwkuaW5mbwkJCT0gYWNvcm5zY3NpX2luZm8sCisJLnF1ZXVlY29tbWFuZAkJPSBhY29ybnNjc2lfcXVldWVjbWQsCisjd2FybmluZyBmaXhtZQorCS5hYm9ydAkJCT0gYWNvcm5zY3NpX2Fib3J0LAorCS5yZXNldAkJCT0gYWNvcm5zY3NpX3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gMTYsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gMiwKKwkudW5jaGVja2VkX2lzYV9kbWEJPSAwLAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcsCisJLnByb2NfbmFtZQkJPSAiYWNvcm5zY3NpIiwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CithY29ybnNjc2lfcHJvYmUoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYywgY29uc3Qgc3RydWN0IGVjYXJkX2lkICppZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCUFTX0hvc3QgKmFzaG9zdDsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmFjb3Juc2NzaV90ZW1wbGF0ZSwgc2l6ZW9mKEFTX0hvc3QpKTsKKwlpZiAoIWhvc3QpCisJCWdvdG8gb3V0OworCisJYXNob3N0ID0gKEFTX0hvc3QgKilob3N0LT5ob3N0ZGF0YTsKKworCWhvc3QtPmlvX3BvcnQgPSBlY2FyZF9hZGRyZXNzKGVjLCBFQ0FSRF9NRU1DLCAwKTsKKwlob3N0LT5pcnEgPSBlYy0+aXJxOworCisJYXNob3N0LT5ob3N0CQk9IGhvc3Q7CisJYXNob3N0LT5zY3NpLmlvX3BvcnQJPSBpb2FkZHIoaG9zdC0+aW9fcG9ydCArIDB4ODAwKTsKKwlhc2hvc3QtPnNjc2kuaXJxCT0gaG9zdC0+aXJxOworCWFzaG9zdC0+Y2FyZC5pb19pbnRyCT0gUE9EX1NQQUNFKGhvc3QtPmlvX3BvcnQpICsgMHg4MDA7CisJYXNob3N0LT5jYXJkLmlvX3BhZ2UJPSBQT0RfU1BBQ0UoaG9zdC0+aW9fcG9ydCkgKyAweGMwMDsKKwlhc2hvc3QtPmNhcmQuaW9fcmFtCT0gaW9hZGRyKGhvc3QtPmlvX3BvcnQpOworCWFzaG9zdC0+ZG1hLmlvX3BvcnQJPSBob3N0LT5pb19wb3J0ICsgMHhjMDA7CisJYXNob3N0LT5kbWEuaW9faW50cl9jbGVhciA9IFBPRF9TUEFDRShob3N0LT5pb19wb3J0KSArIDB4ODAwOworCisJZWMtPmlycWFkZHIJPSAoY2hhciAqKWlvYWRkcihhc2hvc3QtPmNhcmQuaW9faW50cik7CisJZWMtPmlycW1hc2sJPSAweDBhOworCisJcmV0ID0gLUVCVVNZOworCWlmICghcmVxdWVzdF9yZWdpb24oaG9zdC0+aW9fcG9ydCArIDB4ODAwLCAyLCAiYWNvcm5zY3NpKHNiaWMpIikpCisJCWdvdG8gZXJyXzE7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihhc2hvc3QtPmNhcmQuaW9faW50ciwgMSwgImFjb3Juc2NzaShpbnRyKSIpKQorCQlnb3RvIGVycl8yOworCWlmICghcmVxdWVzdF9yZWdpb24oYXNob3N0LT5jYXJkLmlvX3BhZ2UsIDEsICJhY29ybnNjc2kocGFnZSkiKSkKKwkJZ290byBlcnJfMzsKKyNpZmRlZiBVU0VfRE1BQworCWlmICghcmVxdWVzdF9yZWdpb24oYXNob3N0LT5kbWEuaW9fcG9ydCwgMjU2LCAiYWNvcm5zY3NpKGRtYWMpIikpCisJCWdvdG8gZXJyXzQ7CisjZW5kaWYKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGhvc3QtPmlvX3BvcnQsIDIwNDgsICJhY29ybnNjc2kocmFtKSIpKQorCQlnb3RvIGVycl81OworCisJcmV0ID0gcmVxdWVzdF9pcnEoaG9zdC0+aXJxLCBhY29ybnNjc2lfaW50ciwgU0FfSU5URVJSVVBULCAiYWNvcm5zY3NpIiwgYXNob3N0KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0NSSVQgInNjc2klZDogSVJRJWQgbm90IGZyZWU6ICVkXG4iLAorCQkJaG9zdC0+aG9zdF9ubywgYXNob3N0LT5zY3NpLmlycSwgcmV0KTsKKwkJZ290byBlcnJfNjsKKwl9CisKKwltZW1zZXQoJmFzaG9zdC0+c3RhdHMsIDAsIHNpemVvZiAoYXNob3N0LT5zdGF0cykpOworCXF1ZXVlX2luaXRpYWxpc2UoJmFzaG9zdC0+cXVldWVzLmlzc3VlKTsKKwlxdWV1ZV9pbml0aWFsaXNlKCZhc2hvc3QtPnF1ZXVlcy5kaXNjb25uZWN0ZWQpOworCW1zZ3F1ZXVlX2luaXRpYWxpc2UoJmFzaG9zdC0+c2NzaS5tc2dzKTsKKworCWFjb3Juc2NzaV9yZXNldGNhcmQoYXNob3N0KTsKKworCXJldCA9IHNjc2lfYWRkX2hvc3QoaG9zdCwgJmVjLT5kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyXzc7CisKKwlzY3NpX3NjYW5faG9zdChob3N0KTsKKwlnb3RvIG91dDsKKworIGVycl83OgorCWZyZWVfaXJxKGhvc3QtPmlycSwgYXNob3N0KTsKKyBlcnJfNjoKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCAyMDQ4KTsKKyBlcnJfNToKKyNpZmRlZiBVU0VfRE1BQworCXJlbGVhc2VfcmVnaW9uKGFzaG9zdC0+ZG1hLmlvX3BvcnQsIDI1Nik7CisjZW5kaWYKKyBlcnJfNDoKKwlyZWxlYXNlX3JlZ2lvbihhc2hvc3QtPmNhcmQuaW9fcGFnZSwgMSk7CisgZXJyXzM6CisJcmVsZWFzZV9yZWdpb24oYXNob3N0LT5jYXJkLmlvX2ludHIsIDEpOyAgICAKKyBlcnJfMjoKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0ICsgMHg4MDAsIDIpOworIGVycl8xOgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7Cisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhY29ybnNjc2lfcmVtb3ZlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGVjYXJkX2dldF9kcnZkYXRhKGVjKTsKKwlBU19Ib3N0ICphc2hvc3QgPSAoQVNfSG9zdCAqKWhvc3QtPmhvc3RkYXRhOworCisJZWNhcmRfc2V0X2RydmRhdGEoZWMsIE5VTEwpOworCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CisKKwkvKgorCSAqIFB1dCBjYXJkIGludG8gUkVTRVQgc3RhdGUKKwkgKi8KKwlvdXRiKDB4ODAsIGFzaG9zdC0+Y2FyZC5pb19wYWdlKTsKKworCWZyZWVfaXJxKGhvc3QtPmlycSwgYXNob3N0KTsKKworCXJlbGVhc2VfcmVnaW9uKGhvc3QtPmlvX3BvcnQgKyAweDgwMCwgMik7CisJcmVsZWFzZV9yZWdpb24oYXNob3N0LT5jYXJkLmlvX2ludHIsIDEpOworCXJlbGVhc2VfcmVnaW9uKGFzaG9zdC0+Y2FyZC5pb19wYWdlLCAxKTsKKwlyZWxlYXNlX3JlZ2lvbihhc2hvc3QtPmRtYS5pb19wb3J0LCAyNTYpOworCXJlbGVhc2VfcmVnaW9uKGhvc3QtPmlvX3BvcnQsIDIwNDgpOworCisJbXNncXVldWVfZnJlZSgmYXNob3N0LT5zY3NpLm1zZ3MpOworCXF1ZXVlX2ZyZWUoJmFzaG9zdC0+cXVldWVzLmRpc2Nvbm5lY3RlZCk7CisJcXVldWVfZnJlZSgmYXNob3N0LT5xdWV1ZXMuaXNzdWUpOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWNhcmRfaWQgYWNvcm5zY3NpX2NpZHNbXSA9IHsKKwl7IE1BTlVfQUNPUk4sIFBST0RfQUNPUk5fU0NTSSB9LAorCXsgMHhmZmZmLCAweGZmZmYgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZWNhcmRfZHJpdmVyIGFjb3Juc2NzaV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGFjb3Juc2NzaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFjb3Juc2NzaV9yZW1vdmUpLAorCS5pZF90YWJsZQk9IGFjb3Juc2NzaV9jaWRzLAorCS5kcnYgPSB7CisJCS5uYW1lCQk9ICJhY29ybnNjc2kiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhY29ybnNjc2lfaW5pdCh2b2lkKQoreworCXJldHVybiBlY2FyZF9yZWdpc3Rlcl9kcml2ZXIoJmFjb3Juc2NzaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWNvcm5zY3NpX2V4aXQodm9pZCkKK3sKKwllY2FyZF9yZW1vdmVfZHJpdmVyKCZhY29ybnNjc2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWNvcm5zY3NpX2luaXQpOworbW9kdWxlX2V4aXQoYWNvcm5zY3NpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSdXNzZWxsIEtpbmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWNvcm5TQ1NJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9hY29ybnNjc2kuaCBiL2RyaXZlcnMvc2NzaS9hcm0vYWNvcm5zY3NpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4ODFmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vYWNvcm5zY3NpLmgKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9hY29ybi9zY3NpL2Fjb3Juc2NzaS5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NyBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBBY29ybiBTQ1NJIGRyaXZlcgorICovCisjaWZuZGVmIEFDT1JOU0NTSV9ICisjZGVmaW5lIEFDT1JOU0NTSV9ICisKKy8qIFNCSUMgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNCSUNfT1dOSUQJCTAKKyNkZWZpbmUgT1dOSURfRlMxCQkoMTw8NykKKyNkZWZpbmUgT1dOSURfRlMyCQkoMTw8NikKKyNkZWZpbmUgT1dOSURfRUhQCQkoMTw8NCkKKyNkZWZpbmUgT1dOSURfRUFGCQkoMTw8MykKKworI2RlZmluZSBTQklDX0NUUkwJCTEKKyNkZWZpbmUgQ1RSTF9ETUFNT0RFCQkoMTw8NykKKyNkZWZpbmUgQ1RSTF9ETUFEQkFNT0RFCQkoMTw8NikKKyNkZWZpbmUgQ1RSTF9ETUFCVVJTVAkJKDE8PDUpCisjZGVmaW5lIENUUkxfRE1BUE9MTEVECQkwCisjZGVmaW5lIENUUkxfSEhQCQkoMTw8NCkKKyNkZWZpbmUgQ1RSTF9FREkJCSgxPDwzKQorI2RlZmluZSBDVFJMX0lESQkJKDE8PDIpCisjZGVmaW5lIENUUkxfSEEJCQkoMTw8MSkKKyNkZWZpbmUgQ1RSTF9IU1AJCSgxPDwwKQorCisjZGVmaW5lIFNCSUNfVElNRU9VVAkJMgorI2RlZmluZSBTQklDX1RPVFNFQ1RTCQkzCisjZGVmaW5lIFNCSUNfVE9USEVBRFMJCTQKKyNkZWZpbmUgU0JJQ19UT1RDWUxICQk1CisjZGVmaW5lIFNCSUNfVE9UQ1lMTAkJNgorI2RlZmluZSBTQklDX0xPR0FERFJICQk3CisjZGVmaW5lIFNCSUNfTE9HQUREUk0yCQk4CisjZGVmaW5lIFNCSUNfTE9HQUREUk0xCQk5CisjZGVmaW5lIFNCSUNfTE9HQUREUkwJCTEwCisjZGVmaW5lIFNCSUNfU0VDVE9STlVNCQkxMQorI2RlZmluZSBTQklDX0hFQUROVU0JCTEyCisjZGVmaW5lIFNCSUNfQ1lMSAkJMTMKKyNkZWZpbmUgU0JJQ19DWUxMCQkxNAorI2RlZmluZSBTQklDX1RBUkdFVExVTgkJMTUKKyNkZWZpbmUgVEFSR0VUTFVOX1RMVgkJKDE8PDcpCisjZGVmaW5lIFRBUkdFVExVTl9ET0sJCSgxPDw2KQorCisjZGVmaW5lIFNCSUNfQ01ORFBIQVNFCQkxNgorI2RlZmluZSBTQklDX1NZTkNIVFJBTlNGRVIJMTcKKyNkZWZpbmUgU1lOQ0hUUkFOU0ZFUl9PRjAJMHgwMAorI2RlZmluZSBTWU5DSFRSQU5TRkVSX09GMQkweDAxCisjZGVmaW5lIFNZTkNIVFJBTlNGRVJfT0YyCTB4MDIKKyNkZWZpbmUgU1lOQ0hUUkFOU0ZFUl9PRjMJMHgwMworI2RlZmluZSBTWU5DSFRSQU5TRkVSX09GNAkweDA0CisjZGVmaW5lIFNZTkNIVFJBTlNGRVJfT0Y1CTB4MDUKKyNkZWZpbmUgU1lOQ0hUUkFOU0ZFUl9PRjYJMHgwNgorI2RlZmluZSBTWU5DSFRSQU5TRkVSX09GNwkweDA3CisjZGVmaW5lIFNZTkNIVFJBTlNGRVJfT0Y4CTB4MDgKKyNkZWZpbmUgU1lOQ0hUUkFOU0ZFUl9PRjkJMHgwOQorI2RlZmluZSBTWU5DSFRSQU5TRkVSX09GMTAJMHgwQQorI2RlZmluZSBTWU5DSFRSQU5TRkVSX09GMTEJMHgwQgorI2RlZmluZSBTWU5DSFRSQU5TRkVSX09GMTIJMHgwQworI2RlZmluZSBTWU5DSFRSQU5TRkVSXzhEQkEJMHgwMAorI2RlZmluZSBTWU5DSFRSQU5TRkVSXzJEQkEJMHgyMAorI2RlZmluZSBTWU5DSFRSQU5TRkVSXzNEQkEJMHgzMAorI2RlZmluZSBTWU5DSFRSQU5TRkVSXzREQkEJMHg0MAorI2RlZmluZSBTWU5DSFRSQU5TRkVSXzVEQkEJMHg1MAorI2RlZmluZSBTWU5DSFRSQU5TRkVSXzZEQkEJMHg2MAorI2RlZmluZSBTWU5DSFRSQU5TRkVSXzdEQkEJMHg3MAorCisjZGVmaW5lIFNCSUNfVFJBTlNDTlRICQkxOAorI2RlZmluZSBTQklDX1RSQU5TQ05UTQkJMTkKKyNkZWZpbmUgU0JJQ19UUkFOU0NOVEwJCTIwCisjZGVmaW5lIFNCSUNfREVTVElECQkyMQorI2RlZmluZSBERVNUSURfU0NDCQkoMTw8NykKKyNkZWZpbmUgREVTVElEX0RQRAkJKDE8PDYpCisKKyNkZWZpbmUgU0JJQ19TT1VSQ0VJRAkJMjIKKyNkZWZpbmUgU09VUkNFSURfRVIJCSgxPDw3KQorI2RlZmluZSBTT1VSQ0VJRF9FUwkJKDE8PDYpCisjZGVmaW5lIFNPVVJDRUlEX0RTUAkJKDE8PDUpCisjZGVmaW5lIFNPVVJDRUlEX1NJVgkJKDE8PDQpCisKKyNkZWZpbmUgU0JJQ19TU1IJCTIzCisjZGVmaW5lIFNCSUNfQ01ORAkJMjQKKyNkZWZpbmUgQ01ORF9SRVNFVAkJMHgwMAorI2RlZmluZSBDTU5EX0FCT1JUCQkweDAxCisjZGVmaW5lIENNTkRfQVNTRVJUQVROCQkweDAyCisjZGVmaW5lIENNTkRfTkVHQVRFQUNLCQkweDAzCisjZGVmaW5lIENNTkRfRElTQ09OTkVDVAkJMHgwNAorI2RlZmluZSBDTU5EX1JFU0VMRUNUCQkweDA1CisjZGVmaW5lIENNTkRfU0VMV0lUSEFUTgkJMHgwNgorI2RlZmluZSBDTU5EX1NFTEVDVAkJMHgwNworI2RlZmluZSBDTU5EX1NFTEVDVEFUTlRSQU5TRkVSCTB4MDgKKyNkZWZpbmUgQ01ORF9TRUxFQ1RUUkFOU0ZFUgkweDA5CisjZGVmaW5lIENNTkRfUkVTRUxFQ1RSWERBVEEJMHgwQQorI2RlZmluZSBDTU5EX1JFU0VMRUNUVFhEQVRBCTB4MEIKKyNkZWZpbmUgQ01ORF9XQUlURk9SU0VMUkVDVgkweDBDCisjZGVmaW5lIENNTkRfU0VORFNUQVRDTUQJMHgwRAorI2RlZmluZSBDTU5EX1NFTkRESVNDT05ORUNUCTB4MEUKKyNkZWZpbmUgQ01ORF9TRVRJREkJCTB4MEYKKyNkZWZpbmUgQ01ORF9SRUNFSVZFQ01ECQkweDEwCisjZGVmaW5lIENNTkRfUkVDRUlWRURUQQkJMHgxMQorI2RlZmluZSBDTU5EX1JFQ0VJVkVNU0cJCTB4MTIKKyNkZWZpbmUgQ01ORF9SRUNFSVZFVVNQCQkweDEzCisjZGVmaW5lIENNTkRfU0VORENNRAkJMHgxNAorI2RlZmluZSBDTU5EX1NFTkREQVRBCQkweDE1CisjZGVmaW5lIENNTkRfU0VORE1TRwkJMHgxNgorI2RlZmluZSBDTU5EX1NFTkRVU1AJCTB4MTcKKyNkZWZpbmUgQ01ORF9UUkFOU0xBVEVBRERSCTB4MTgKKyNkZWZpbmUgQ01ORF9YRkVSSU5GTwkJMHgyMAorI2RlZmluZSBDTU5EX1NCVAkJKDE8PDcpCisKKyNkZWZpbmUgU0JJQ19EQVRBCQkyNQorI2RlZmluZSBTQklDX0FTUgkJMjYKKyNkZWZpbmUgQVNSX0lOVAkJCSgxPDw3KQorI2RlZmluZSBBU1JfTENJCQkJKDE8PDYpCisjZGVmaW5lIEFTUl9CU1kJCQkoMTw8NSkKKyNkZWZpbmUgQVNSX0NJUAkJCSgxPDw0KQorI2RlZmluZSBBU1JfUEUJCQkoMTw8MSkKKyNkZWZpbmUgQVNSX0RCUgkJCSgxPDwwKQorCisvKiBETUFDIHJlZ2lzdGVycyAqLworI2RlZmluZSBETUFDX0lOSVQJCTB4MDAKKyNkZWZpbmUgSU5JVF84QklUCQkoMSkKKworI2RlZmluZSBETUFDX0NIQU5ORUwJCTB4ODAKKyNkZWZpbmUgQ0hBTk5FTF8wCQkweDAwCisjZGVmaW5lIENIQU5ORUxfMQkJMHgwMQorI2RlZmluZSBDSEFOTkVMXzIJCTB4MDIKKyNkZWZpbmUgQ0hBTk5FTF8zCQkweDAzCisKKyNkZWZpbmUgRE1BQ19UWENOVExPCQkweDAxCisjZGVmaW5lIERNQUNfVFhDTlRISQkJMHg4MQorI2RlZmluZSBETUFDX1RYQURSTE8JCTB4MDIKKyNkZWZpbmUgRE1BQ19UWEFEUk1ECQkweDgyCisjZGVmaW5lIERNQUNfVFhBRFJISQkJMHgwMworCisjZGVmaW5lIERNQUNfREVWQ09OMAkJMHgwNAorI2RlZmluZSBERVZDT04wX0FLTAkJKDE8PDcpCisjZGVmaW5lIERFVkNPTjBfUlFMCQkoMTw8NikKKyNkZWZpbmUgREVWQ09OMF9FWFcJCSgxPDw1KQorI2RlZmluZSBERVZDT04wX1JPVAkJKDE8PDQpCisjZGVmaW5lIERFVkNPTjBfQ01QCQkoMTw8MykKKyNkZWZpbmUgREVWQ09OMF9ERE1BCQkoMTw8MikKKyNkZWZpbmUgREVWQ09OMF9BSExECQkoMTw8MSkKKyNkZWZpbmUgREVWQ09OMF9NVE0JCSgxPDwwKQorCisjZGVmaW5lIERNQUNfREVWQ09OMQkJMHg4NAorI2RlZmluZSBERVZDT04xX1dFVgkJKDE8PDEpCisjZGVmaW5lIERFVkNPTjFfQkhMRAkJKDE8PDApCisKKyNkZWZpbmUgRE1BQ19NT0RFQ09OCQkweDA1CisjZGVmaW5lIE1PREVDT05fV09FRAkJMHgwMQorI2RlZmluZSBNT0RFQ09OX1ZFUklGWQkJMHgwMAorI2RlZmluZSBNT0RFQ09OX1JFQUQJCTB4MDQKKyNkZWZpbmUgTU9ERUNPTl9XUklURQkJMHgwOAorI2RlZmluZSBNT0RFQ09OX0FVVE9JTklUCTB4MTAKKyNkZWZpbmUgTU9ERUNPTl9BRERSRElSCQkweDIwCisjZGVmaW5lIE1PREVDT05fREVNQU5ECQkweDAwCisjZGVmaW5lIE1PREVDT05fU0lOR0xFCQkweDQwCisjZGVmaW5lIE1PREVDT05fQkxPQ0sJCTB4ODAKKyNkZWZpbmUgTU9ERUNPTl9DQVNDQURFCQkweEMwCisKKyNkZWZpbmUgRE1BQ19TVEFUVVMJCTB4ODUKKyNkZWZpbmUgU1RBVFVTX1RDMAkJKDE8PDApCisjZGVmaW5lIFNUQVRVU19SUTAJCSgxPDw0KQorCisjZGVmaW5lIERNQUNfVEVNUExPCQkweDA2CisjZGVmaW5lIERNQUNfVEVNUEhJCQkweDg2CisjZGVmaW5lIERNQUNfUkVRUkVHCQkweDA3CisjZGVmaW5lIERNQUNfTUFTS1JFRwkJMHg4NworI2RlZmluZSBNQVNLUkVHX00wCQkweDAxCisjZGVmaW5lIE1BU0tSRUdfTTEJCTB4MDIKKyNkZWZpbmUgTUFTS1JFR19NMgkJMHgwNAorI2RlZmluZSBNQVNLUkVHX00zCQkweDA4CisKKy8qIG1pc2NlbGxhbmVvdXMgaW50ZXJuYWwgdmFyaWFibGVzICovCisKKyNkZWZpbmUgUE9EX1NQQUNFKHgpCSgoeCkgKyAweGQwMDAwKQorI2RlZmluZSBNQVNLX09OCQkoTUFTS1JFR19NM3xNQVNLUkVHX00yfE1BU0tSRUdfTTF8TUFTS1JFR19NMCkKKyNkZWZpbmUgTUFTS19PRkYJKE1BU0tSRUdfTTN8TUFTS1JFR19NMnxNQVNLUkVHX00xKQorCisvKgorICogU0NTSSBkcml2ZXIgcGhhc2VzCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgUEhBU0VfSURMRSwJCQkJCS8qIHdlJ3JlIG5vdCBwbGFubmluZyBvbiBkb2luZyBhbnl0aGluZwkgKi8KKyAgICBQSEFTRV9DT05ORUNUSU5HLAkJCQkvKiBjb25uZWN0aW5nIHRvIGEgdGFyZ2V0CQkgKi8KKyAgICBQSEFTRV9DT05ORUNURUQsCQkJCS8qIGNvbm5lY3RlZCB0byBhIHRhcmdldAkJICovCisgICAgUEhBU0VfTVNHT1VULAkJCQkvKiBtZXNzYWdlIG91dCB0byBkZXZpY2UJCSAqLworICAgIFBIQVNFX1JFQ09OTkVDVEVELAkJCQkvKiByZWNvbm5lY3RlZAkJCQkgKi8KKyAgICBQSEFTRV9DT01NQU5EUEFVU0VELAkJCS8qIGNvbW1hbmQgcGFydGx5IHNlbnQJCQkgKi8KKyAgICBQSEFTRV9DT01NQU5ELAkJCQkvKiBjb21tYW5kIGFsbCBzZW50CQkJICovCisgICAgUEhBU0VfREFUQU9VVCwJCQkJLyogZGF0YSBvdXQgdG8gZGV2aWNlCQkJICovCisgICAgUEhBU0VfREFUQUlOLAkJCQkvKiBkYXRhIGluIGZyb20gZGV2aWNlCQkJICovCisgICAgUEhBU0VfU1RBVFVTSU4sCQkJCS8qIHN0YXR1cyBpbiBmcm9tIGRldmljZQkJICovCisgICAgUEhBU0VfTVNHSU4sCQkJCS8qIG1lc3NhZ2UgaW4gZnJvbSBkZXZpY2UJCSAqLworICAgIFBIQVNFX0RPTkUsCQkJCQkvKiBmaW5pc2hlZAkJCQkgKi8KKyAgICBQSEFTRV9BQk9SVEVELAkJCQkvKiBhYm9ydGVkCQkJCSAqLworICAgIFBIQVNFX0RJU0NPTk5FQ1QsCQkJCS8qIGRpc2Nvbm5lY3RpbmcJCQkgKi8KK30gcGhhc2VfdDsKKworLyoKKyAqIEFmdGVyIGludGVycnVwdCwgd2hhdCB0byBkbyBub3cKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBJTlRSX0lETEUsCQkJCQkvKiBub3QgZXhwZWN0aW5nIGFub3RoZXIgSVJRCQkgKi8KKyAgICBJTlRSX05FWFRfQ09NTUFORCwJCQkJLyogc3RhcnQgbmV4dCBjb21tYW5kCQkJICovCisgICAgSU5UUl9QUk9DRVNTSU5HLAkJCQkvKiBpbnRlcnJ1cHQgcm91dGluZSBzdGlsbCBwcm9jZXNzaW5nCSAqLworfSBpbnRyX3JldF90OworCisvKgorICogRE1BIGRpcmVjdGlvbgorICovCit0eXBlZGVmIGVudW0geworICAgIERNQV9PVVQsCQkJCQkvKiBETUEgZnJvbSBtZW1vcnkgdG8gY2hpcAkJKi8KKyAgICBETUFfSU4JCQkJCS8qIERNQSBmcm9tIGNoaXAgdG8gbWVtb3J5CQkqLworfSBkbWFkaXJfdDsKKworLyoKKyAqIFN5bmNocm9ub3VzIHRyYW5zZmVyIHN0YXRlCisgKi8KK3R5cGVkZWYgZW51bSB7CQkJCQkvKiBTeW5jaHJvbm91cyB0cmFuc2ZlciBzdGF0ZQkJKi8KKyAgICBTWU5DX0FTWU5DSFJPTk9VUywJCQkJLyogZG9uJ3QgbmVnb2NpYXRlIHN5bmNocm9ub3VzIHRyYW5zZmVycyovCisgICAgU1lOQ19ORUdPQ0lBVEUsCQkJCS8qIHN0YXJ0IG5lZ29jaWF0aW9uCQkJKi8KKyAgICBTWU5DX1NFTlRfUkVRVUVTVCwJCQkJLyogc2VudCBTRFRSIG1lc3NhZ2UJCQkqLworICAgIFNZTkNfQ09NUExFVEVELAkJCQkvKiByZWNlaXZlZCBTRFRSIHJlcGx5CQkJKi8KK30gc3luY3hmZXJfdDsKKworLyoKKyAqIENvbW1hbmQgdHlwZQorICovCit0eXBlZGVmIGVudW0gewkJCQkJLyogY29tbWFuZCB0eXBlCQkJCSovCisgICAgQ01EX1JFQUQsCQkJCQkvKiBSRUFEXzYsIFJFQURfMTAsIFJFQURfMTIJCSovCisgICAgQ01EX1dSSVRFLAkJCQkJLyogV1JJVEVfNiwgV1JJVEVfMTAsIFdSSVRFXzEyCQkqLworICAgIENNRF9NSVNDLAkJCQkJLyogT3RoZXJzCQkJCSovCit9IGNtZHR5cGVfdDsKKworLyoKKyAqIERhdGEgcGhhc2UgZGlyZWN0aW9uCisgKi8KK3R5cGVkZWYgZW51bSB7CQkJCQkvKiBEYXRhIGRpcmVjdGlvbgkJCSovCisgICAgREFUQURJUl9JTiwJCQkJCS8qIERhdGEgaW4gcGhhc2UgZXhwZWN0ZWQJCSovCisgICAgREFUQURJUl9PVVQJCQkJCS8qIERhdGEgb3V0IHBoYXNlIGV4cGVjdGVkCQkqLworfSBkYXRhZGlyX3Q7CisKKyNpbmNsdWRlICJxdWV1ZS5oIgorI2luY2x1ZGUgIm1zZ3F1ZXVlLmgiCisKKyNkZWZpbmUgU1RBVFVTX0JVRkZFUl9TSVpFCTMyCisvKgorICogVGhpcyBpcyB1c2VkIHRvIGR1bXAgdGhlIHByZXZpb3VzIHN0YXRlcyBvZiB0aGUgU0JJQworICovCitzdHJ1Y3Qgc3RhdHVzX2VudHJ5IHsKKwl1bnNpZ25lZCBsb25nCXdoZW47CisJdW5zaWduZWQgY2hhcglzc3I7CisJdW5zaWduZWQgY2hhcglwaDsKKwl1bnNpZ25lZCBjaGFyCWlycTsKKwl1bnNpZ25lZCBjaGFyCXVudXNlZDsKK307CisKKyNkZWZpbmUgQUREX1NUQVRVUyhfcSxfc3NyLF9waCxfaXJxKSBcCisoewkJCQkJCQkJCVwKKwlob3N0LT5zdGF0dXNbKF9xKV1baG9zdC0+c3RhdHVzX3B0clsoX3EpXV0ud2hlbiA9IGppZmZpZXM7CVwKKwlob3N0LT5zdGF0dXNbKF9xKV1baG9zdC0+c3RhdHVzX3B0clsoX3EpXV0uc3NyICA9IChfc3NyKTsJXAorCWhvc3QtPnN0YXR1c1soX3EpXVtob3N0LT5zdGF0dXNfcHRyWyhfcSldXS5waCAgID0gKF9waCk7CVwKKwlob3N0LT5zdGF0dXNbKF9xKV1baG9zdC0+c3RhdHVzX3B0clsoX3EpXV0uaXJxICA9IChfaXJxKTsJXAorCWhvc3QtPnN0YXR1c19wdHJbKF9xKV0gPSAoaG9zdC0+c3RhdHVzX3B0clsoX3EpXSArIDEpICYgKFNUQVRVU19CVUZGRVJfU0laRSAtIDEpOyBcCit9KQorCisvKgorICogQWNvcm5TQ1NJIGhvc3Qgc3BlY2lmaWMgZGF0YQorICovCit0eXBlZGVmIHN0cnVjdCBhY29ybnNjc2lfaG9zdGRhdGEgeworICAgIC8qIG1pc2NlbGxhbmVvdXMgKi8KKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0CSpob3N0OwkJCS8qIGhvc3QJCQkJCSovCisgICAgU2NzaV9DbW5kCQkqU0NwbnQ7CQkJLyogY3VycmVudGx5IHByb2Nlc3NpbmcgY29tbWFuZAkJKi8KKyAgICBTY3NpX0NtbmQJCSpvcmlnU0NwbnQ7CQkvKiBvcmlnaW5hbCBjb25uZWN0aW5nIGNvbW1hbmQJCSovCisKKyAgICAvKiBkcml2ZXIgaW5mb3JtYXRpb24gKi8KKyAgICBzdHJ1Y3QgeworCXVuc2lnbmVkIGludAlpb19wb3J0OwkJLyogYmFzZSBhZGRyZXNzIG9mIFdEMzNDOTMJCSovCisJdW5zaWduZWQgaW50CWlycTsJCQkvKiBpbnRlcnJ1cHQJCQkJKi8KKwlwaGFzZV90CQlwaGFzZTsJCQkvKiBjdXJyZW50IHBoYXNlCQkJKi8KKworCXN0cnVjdCB7CisJICAgIHVuc2lnbmVkIGNoYXIJdGFyZ2V0OwkJLyogcmVjb25uZWN0ZWQgdGFyZ2V0CQkJKi8KKwkgICAgdW5zaWduZWQgY2hhcglsdW47CQkvKiByZWNvbm5lY3RlZCBsdW4JCQkqLworCSAgICB1bnNpZ25lZCBjaGFyCXRhZzsJCS8qIHJlY29ubmVjdGVkIHRhZwkJCSovCisJfSByZWNvbm5lY3RlZDsKKworCVNjc2lfUG9pbnRlcglTQ3A7CQkJLyogY3VycmVudCBjb21tYW5kcyBkYXRhIHBvaW50ZXIJKi8KKworCU1zZ1F1ZXVlX3QJbXNnczsKKworCXVuc2lnbmVkIHNob3J0CWxhc3RfbWVzc2FnZTsJCS8qIGxhc3QgbWVzc2FnZSB0byBiZSBzZW50CQkqLworCXVuc2lnbmVkIGNoYXIJZGlzY29ubmVjdGFibGU6MTsJLyogdGhpcyBjb21tYW5kIGNhbiBiZSBkaXNjb25uZWN0ZWQJKi8KKyAgICB9IHNjc2k7CisKKyAgICAvKiBzdGF0aXN0aWNzIGluZm9ybWF0aW9uICovCisgICAgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQJcXVldWVzOworCXVuc2lnbmVkIGludAlyZW1vdmVzOworCXVuc2lnbmVkIGludAlmaW5zOworCXVuc2lnbmVkIGludAlyZWFkczsKKwl1bnNpZ25lZCBpbnQJd3JpdGVzOworCXVuc2lnbmVkIGludAltaXNjczsKKwl1bnNpZ25lZCBpbnQJZGlzY29ubmVjdHM7CisJdW5zaWduZWQgaW50CWFib3J0czsKKwl1bnNpZ25lZCBpbnQJcmVzZXRzOworICAgIH0gc3RhdHM7CisKKyAgICAvKiBxdWV1ZSBoYW5kbGluZyAqLworICAgIHN0cnVjdCB7CisJUXVldWVfdAkJaXNzdWU7CQkJLyogaXNzdWUgcXVldWUJCQkJKi8KKwlRdWV1ZV90CQlkaXNjb25uZWN0ZWQ7CQkvKiBkaXNjb25uZWN0ZWQgY29tbWFuZCBxdWV1ZQkJKi8KKyAgICB9IHF1ZXVlczsKKworICAgIC8qIHBlci1kZXZpY2UgaW5mbyAqLworICAgIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhcglzeW5jX3hmZXI7CQkvKiBzeW5jaHJvbm91cyB0cmFuc2ZlciAoU0JJQyB2YWx1ZSkJKi8KKwlzeW5jeGZlcl90CXN5bmNfc3RhdGU7CQkvKiBzeW5jIHhmZXIgbmVnb2NpYXRpb24gc3RhdGUJCSovCisJdW5zaWduZWQgY2hhcglkaXNjb25uZWN0X29rOjE7CS8qIGRldmljZSBjYW4gZGlzY29ubmVjdAkJKi8KKyAgICB9IGRldmljZVs4XTsKKyAgICB1bnNpZ25lZCBsb25nCWJ1c3lsdW5zWzY0IC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXTsvKiBhcnJheSBvZiBiaXRzIGluZGljYXRpbmcgTFVOcyBidXN5CSovCisKKyAgICAvKiBETUEgaW5mbyAqLworICAgIHN0cnVjdCB7CisJdW5zaWduZWQgaW50CWlvX3BvcnQ7CQkvKiBiYXNlIGFkZHJlc3Mgb2YgRE1BIGNvbnRyb2xsZXIJKi8KKwl1bnNpZ25lZCBpbnQJaW9faW50cl9jbGVhcjsJCS8qIGFkZHJlc3Mgb2YgRE1BIGludGVycnVwdCBjbGVhcgkqLworCXVuc2lnbmVkIGludAlmcmVlX2FkZHI7CQkvKiBuZXh0IGZyZWUgYWRkcmVzcwkJCSovCisJdW5zaWduZWQgaW50CXN0YXJ0X2FkZHI7CQkvKiBzdGFydCBhZGRyZXNzIG9mIGN1cnJlbnQgdHJhbnNmZXIJKi8KKwlkbWFkaXJfdAlkaXJlY3Rpb247CQkvKiBkbWEgZGlyZWN0aW9uCQkJKi8KKwl1bnNpZ25lZCBpbnQJdHJhbnNmZXJyZWQ7CQkvKiBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQJCSovCisJdW5zaWduZWQgaW50CXhmZXJfc3RhcnQ7CQkvKiBzY2hlZHVsZWQgRE1BIHRyYW5zZmVyIHN0YXJ0CQkqLworCXVuc2lnbmVkIGludAl4ZmVyX2xlbmd0aDsJCS8qIHNjaGVkdWxlZCBETUEgdHJhbnNmZXIgbGVuZ3RoCSovCisJY2hhcgkJKnhmZXJfcHRyOwkJLyogcG9pbnRlciB0byBhcmVhCQkJKi8KKwl1bnNpZ25lZCBjaGFyCXhmZXJfcmVxdWlyZWQ6MTsJLyogc2V0IGlmIHdlIG5lZWQgdG8gdHJhbnNmZXIgc29tZXRoaW5nCSovCisJdW5zaWduZWQgY2hhcgl4ZmVyX3NldHVwOjE7CQkvKiBzZXQgaWYgRE1BIGlzIHNldHVwCQkJKi8KKwl1bnNpZ25lZCBjaGFyCXhmZXJfZG9uZToxOwkJLyogc2V0IGlmIERNQSByZWFjaGVkIGVuZCBvZiBCSCBsaXN0CSovCisgICAgfSBkbWE7CisKKyAgICAvKiBjYXJkIGluZm8gKi8KKyAgICBzdHJ1Y3QgeworCXVuc2lnbmVkIGludAlpb19pbnRyOwkJLyogYmFzZSBhZGRyZXNzIG9mIGludGVycnVwdCBpZCByZWcJKi8KKwl1bnNpZ25lZCBpbnQJaW9fcGFnZTsJCS8qIGJhc2UgYWRkcmVzcyBvZiBwYWdlIHJlZwkJKi8KKwl1bnNpZ25lZCBpbnQJaW9fcmFtOwkJCS8qIGJhc2UgYWRkcmVzcyBvZiBSQU0gYWNjZXNzCQkqLworCXVuc2lnbmVkIGNoYXIJcGFnZV9yZWc7CQkvKiBjdXJyZW50IHNldHRpbmcgb2YgcGFnZSByZWcJCSovCisgICAgfSBjYXJkOworCisgICAgdW5zaWduZWQgY2hhciBzdGF0dXNfcHRyWzldOworICAgIHN0cnVjdCBzdGF0dXNfZW50cnkgc3RhdHVzWzldW1NUQVRVU19CVUZGRVJfU0laRV07Cit9IEFTX0hvc3Q7CisKKyNlbmRpZiAvKiBBQ09STlNDU0lfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9hcnhlc2NzaS5jIGIvZHJpdmVycy9zY3NpL2FybS9hcnhlc2NzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ODExZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXJtL2FyeGVzY3NpLmMKQEAgLTAsMCArMSwzOTUgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9kcml2ZXJzL3Njc2kvYXJ4ZXNjc2kuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIFJ1c3NlbGwgS2luZywgU3RlZmFuIEhhbnNrZQorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIGV4cGVyaW1lbnRhdGlvbi4gIEhlbmNlLCBpdCBtYXkgaGF2ZSBtYWRlCisgKiBhc3N1bXB0aW9ucyBhYm91dCB0aGUgcGFydGljdWxhciBjYXJkIHRoYXQgSSBoYXZlIGF2YWlsYWJsZSwgYW5kCisgKiBtYXkgbm90IGJlIHJlbGlhYmxlIQorICoKKyAqIENoYW5nZWxvZzoKKyAqICAzMC0wOC0xOTk3CVJNSwkwLjAuMAlDcmVhdGVkLCBSRUFET05MWSB2ZXJzaW9uIGFzIGN1bWFuYV8yLmMKKyAqICAyMi0wMS0xOTk4CVJNSwkwLjAuMQlVcGRhdGVkIHRvIDIuMS44MAorICogIDE1LTA0LTE5OTgJUk1LCTAuMC4xCU9ubHkgZG8gUElPIGlmIEZBUzIxNiB3aWxsIGFsbG93IGl0LgorICogIDExLTA2LTE5OTggCVNICTAuMC4yICAgQ2hhbmdlZCB0byBzdXBwb3J0IEFSWEUgMTYtYml0IFNDU0kgY2FyZAorICoJCQkJZW5hYmxlZCB3cml0aW5nCisgKiAgMDEtMDEtMjAwMAlTSAkwLjEuMCAgIEFkZGVkICpyZWFsKiBwc2V1ZG8gZG1hIHdyaXRpbmcKKyAqCQkJCShhcnhlc2NzaV9wc2V1ZG9fZG1hX3dyaXRlKQorICogIDAyLTA0LTIwMDAJUk1LCTAuMS4xCVVwZGF0ZWQgZm9yIG5ldyBlcnJvciBoYW5kbGluZyBjb2RlLgorICogIDIyLTEwLTIwMDAgIFNICQlVcGRhdGVkIGZvciBuZXcgcmVnaXN0ZXJpbmcgc2NoZW1lLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vZWNhcmQuaD4KKworI2luY2x1ZGUgIi4uL3Njc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgImZhczIxNi5oIgorCitzdHJ1Y3QgYXJ4ZXNjc2lfaW5mbyB7CisJRkFTMjE2X0luZm8JCWluZm87CisJc3RydWN0IGV4cGFuc2lvbl9jYXJkCSplYzsKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworfTsKKworI2RlZmluZSBETUFEQVRBX09GRlNFVAkoMHgyMDApCisKKyNkZWZpbmUgRE1BU1RBVF9PRkZTRVQJKDB4NjAwKQorI2RlZmluZSBETUFTVEFUX0RSUQkoMSA8PCAwKQorCisjZGVmaW5lIENTVEFUVVNfSVJRCSgxIDw8IDApCisKKyNkZWZpbmUgVkVSU0lPTiAiMS4xMCAoMjMvMDEvMjAwMyAyLjUuNTcpIgorCisvKgorICogRnVuY3Rpb246IGludCBhcnhlc2NzaV9kbWFfc2V0dXAoaG9zdCwgU0NwbnQsIGRpcmVjdGlvbiwgbWluX3R5cGUpCisgKiBQdXJwb3NlIDogaW5pdGlhbGlzZXMgRE1BL1BJTworICogUGFyYW1zICA6IGhvc3QgICAgICAtIGhvc3QKKyAqCSAgICAgU0NwbnQgICAgIC0gY29tbWFuZAorICoJICAgICBkaXJlY3Rpb24gLSBETUEgb24gdG8vb2ZmIG9mIGNhcmQKKyAqCSAgICAgbWluX3R5cGUgIC0gbWluaW11bSBETUEgc3VwcG9ydCB0aGF0IHdlIG11c3QgaGF2ZSBmb3IgdGhpcyB0cmFuc2ZlcgorICogUmV0dXJucyA6IDAgaWYgd2Ugc2hvdWxkIG5vdCBzZXQgQ01EX1dJVEhETUEgZm9yIHRyYW5zZmVyIGluZm8gY29tbWFuZAorICovCitzdGF0aWMgZmFzZG1hdHlwZV90Cithcnhlc2NzaV9kbWFfc2V0dXAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgU2NzaV9Qb2ludGVyICpTQ3AsCisJCSAgICAgICBmYXNkbWFkaXJfdCBkaXJlY3Rpb24sIGZhc2RtYXR5cGVfdCBtaW5fdHlwZSkKK3sKKwkvKgorCSAqIFdlIGRvbid0IGRvIHJlYWwgRE1BCisJICovCisJcmV0dXJuIGZhc2RtYV9wc2V1ZG87Cit9CisKK3N0YXRpYyB2b2lkIGFyeGVzY3NpX3BzZXVkb19kbWFfd3JpdGUodW5zaWduZWQgY2hhciAqYWRkciwgdm9pZCBfX2lvbWVtICpiYXNlKQoreworICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKAorICAgICAgICIgICAgICAgICAgICAgICBzdG1kYiAgIHNwISwge3IwLXIxMn1cbiIKKyAgICAgICAiICAgICAgICAgICAgICAgbW92ICAgICByMywgJTBcbiIKKyAgICAgICAiICAgICAgICAgICAgICAgbW92ICAgICByMSwgJTFcbiIKKyAgICAgICAiICAgICAgICAgICAgICAgYWRkICAgICByMiwgcjEsICM1MTJcbiIKKyAgICAgICAiICAgICAgICAgICAgICAgbW92ICAgICByNCwgIzI1NlxuIgorICAgICAgICIubG9vcF8xOiAgICAgICBsZG1pYSAgIHIzISwge3I2LCByOCwgcjEwLCByMTJ9XG4iCisgICAgICAgIiAgICAgICAgICAgICAgIG1vdiAgICAgcjUsIHI2LCBsc2wgIzE2XG4iCisgICAgICAgIiAgICAgICAgICAgICAgIG1vdiAgICAgcjcsIHI4LCBsc2wgIzE2XG4iCisgICAgICAgIi5sb29wXzI6ICAgICAgIGxkcmIgICAgcjAsIFtyMSwgIzE1MzZdXG4iCisgICAgICAgIiAgICAgICAgICAgICAgIHRzdCAgICAgcjAsICMxXG4iCisgICAgICAgIiAgICAgICAgICAgICAgIGJlcSAgICAgLmxvb3BfMlxuIgorICAgICAgICIgICAgICAgICAgICAgICBzdG1pYSAgIHIyLCB7cjUtcjh9XG5cdCIKKyAgICAgICAiICAgICAgICAgICAgICAgbW92ICAgICByOSwgcjEwLCBsc2wgIzE2XG4iCisgICAgICAgIiAgICAgICAgICAgICAgIG1vdiAgICAgcjExLCByMTIsIGxzbCAjMTZcbiIKKyAgICAgICAiLmxvb3BfMzogICAgICAgbGRyYiAgICByMCwgW3IxLCAjMTUzNl1cbiIKKyAgICAgICAiICAgICAgICAgICAgICAgdHN0ICAgICByMCwgIzFcbiIKKyAgICAgICAiICAgICAgICAgICAgICAgYmVxICAgICAubG9vcF8zXG4iCisgICAgICAgIiAgICAgICAgICAgICAgIHN0bWlhICAgcjIsIHtyOS1yMTJ9XG4iCisgICAgICAgIiAgICAgICAgICAgICAgIHN1YnMgICAgcjQsIHI0LCAjMTZcbiIKKyAgICAgICAiICAgICAgICAgICAgICAgYm5lICAgICAubG9vcF8xXG4iCisgICAgICAgIiAgICAgICAgICAgICAgIGxkbWlhICAgc3AhLCB7cjAtcjEyfVxuIgorICAgICAgIDoKKyAgICAgICA6ICJyIiAoYWRkciksICJyIiAoYmFzZSkpOworfQorCisvKgorICogRnVuY3Rpb246IGludCBhcnhlc2NzaV9kbWFfcHNldWRvKGhvc3QsIFNDcG50LCBkaXJlY3Rpb24sIHRyYW5zZmVyKQorICogUHVycG9zZSA6IGhhbmRsZXMgcHNldWRvIERNQQorICogUGFyYW1zICA6IGhvc3QgICAgICAtIGhvc3QKKyAqCSAgICAgU0NwbnQgICAgIC0gY29tbWFuZAorICoJICAgICBkaXJlY3Rpb24gLSBETUEgb24gdG8vb2ZmIG9mIGNhcmQKKyAqCSAgICAgdHJhbnNmZXIgIC0gbWluaW11bSBudW1iZXIgb2YgYnl0ZXMgd2UgZXhwZWN0IHRvIHRyYW5zZmVyCisgKi8KK3N0YXRpYyB2b2lkCithcnhlc2NzaV9kbWFfcHNldWRvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIFNjc2lfUG9pbnRlciAqU0NwLAorCQkgICAgZmFzZG1hZGlyX3QgZGlyZWN0aW9uLCBpbnQgdHJhbnNmZXIpCit7CisJc3RydWN0IGFyeGVzY3NpX2luZm8gKmluZm8gPSAoc3RydWN0IGFyeGVzY3NpX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoLCBlcnJvciA9IDA7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gaW5mby0+aW5mby5zY3NpLmlvX2Jhc2U7CisJdW5zaWduZWQgY2hhciAqYWRkcjsKKworCWxlbmd0aCA9IFNDcC0+dGhpc19yZXNpZHVhbDsKKwlhZGRyID0gU0NwLT5wdHI7CisKKwlpZiAoZGlyZWN0aW9uID09IERNQV9PVVQpIHsKKwkJdW5zaWduZWQgaW50IHdvcmQ7CisJCXdoaWxlIChsZW5ndGggPiAyNTYpIHsKKwkJCWlmIChyZWFkYihiYXNlICsgMHg4MCkgJiBTVEFUX0lOVCkgeworCQkJCWVycm9yID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWFyeGVzY3NpX3BzZXVkb19kbWFfd3JpdGUoYWRkciwgYmFzZSk7CisJCQlhZGRyICs9IDI1NjsKKwkJCWxlbmd0aCAtPSAyNTY7CisJCX0KKworCQlpZiAoIWVycm9yKQorCQkJd2hpbGUgKGxlbmd0aCA+IDApIHsKKwkJCQlpZiAocmVhZGIoYmFzZSArIDB4ODApICYgU1RBVF9JTlQpCisJCQkJCWJyZWFrOworCSAKKwkJCQlpZiAoIShyZWFkYihiYXNlICsgRE1BU1RBVF9PRkZTRVQpICYgRE1BU1RBVF9EUlEpKQorCQkJCQljb250aW51ZTsKKworCQkJCXdvcmQgPSAqYWRkciB8ICooYWRkciArIDEpIDw8IDg7CisKKwkJCQl3cml0ZXcod29yZCwgYmFzZSArIERNQURBVEFfT0ZGU0VUKTsKKwkJCQlpZiAobGVuZ3RoID4gMSkgeworCQkJCQlhZGRyICs9IDI7CisJCQkJCWxlbmd0aCAtPSAyOworCQkJCX0gZWxzZSB7CisJCQkJCWFkZHIgKz0gMTsKKwkJCQkJbGVuZ3RoIC09IDE7CisJCQkJfQorCQkJfQorCX0KKwllbHNlIHsKKwkJaWYgKHRyYW5zZmVyICYmICh0cmFuc2ZlciAmIDI1NSkpIHsKKwkJCXdoaWxlIChsZW5ndGggPj0gMjU2KSB7CisJCQkJaWYgKHJlYWRiKGJhc2UgKyAweDgwKSAmIFNUQVRfSU5UKSB7CisJCQkJCWVycm9yID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCSAgICAKKwkJCQlpZiAoIShyZWFkYihiYXNlICsgRE1BU1RBVF9PRkZTRVQpICYgRE1BU1RBVF9EUlEpKQorCQkJCQljb250aW51ZTsKKworCQkJCXJlYWRzdyhiYXNlICsgRE1BREFUQV9PRkZTRVQsIGFkZHIsIDI1NiA+PiAxKTsKKwkJCQlhZGRyICs9IDI1NjsKKwkJCQlsZW5ndGggLT0gMjU2OworCQkJfQorCQl9CisKKwkJaWYgKCEoZXJyb3IpKQorCQkJd2hpbGUgKGxlbmd0aCA+IDApIHsKKwkJCQl1bnNpZ25lZCBsb25nIHdvcmQ7CisKKwkJCQlpZiAocmVhZGIoYmFzZSArIDB4ODApICYgU1RBVF9JTlQpCisJCQkJCWJyZWFrOworCisJCQkJaWYgKCEocmVhZGIoYmFzZSArIERNQVNUQVRfT0ZGU0VUKSAmIERNQVNUQVRfRFJRKSkKKwkJCQkJY29udGludWU7CisKKwkJCQl3b3JkID0gcmVhZHcoYmFzZSArIERNQURBVEFfT0ZGU0VUKTsKKwkJCQkqYWRkcisrID0gd29yZDsKKwkJCQlpZiAoLS1sZW5ndGggPiAwKSB7CisJCQkJCSphZGRyKysgPSB3b3JkID4+IDg7CisJCQkJCWxlbmd0aCAtLTsKKwkJCQl9CisJCQl9CisJfQorfQorCisvKgorICogRnVuY3Rpb246IGludCBhcnhlc2NzaV9kbWFfc3RvcChob3N0LCBTQ3BudCkKKyAqIFB1cnBvc2UgOiBzdG9wcyBETUEvUElPCisgKiBQYXJhbXMgIDogaG9zdCAgLSBob3N0CisgKgkgICAgIFNDcG50IC0gY29tbWFuZAorICovCitzdGF0aWMgdm9pZCBhcnhlc2NzaV9kbWFfc3RvcChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBTY3NpX1BvaW50ZXIgKlNDcCkKK3sKKwkvKgorCSAqIG5vIERNQSB0byBzdG9wCisJICovCit9CisKKy8qCisgKiBGdW5jdGlvbjogY29uc3QgY2hhciAqYXJ4ZXNjc2lfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICogaG9zdCkKKyAqIFB1cnBvc2UgOiByZXR1cm5zIGEgZGVzY3JpcHRpdmUgc3RyaW5nIGFib3V0IHRoaXMgaW50ZXJmYWNlLAorICogUGFyYW1zICA6IGhvc3QgLSBkcml2ZXIgaG9zdCBzdHJ1Y3R1cmUgdG8gcmV0dXJuIGluZm8gZm9yLgorICogUmV0dXJucyA6IHBvaW50ZXIgdG8gYSBzdGF0aWMgYnVmZmVyIGNvbnRhaW5pbmcgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmFyeGVzY3NpX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgYXJ4ZXNjc2lfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYXJ4ZXNjc2lfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCXN0YXRpYyBjaGFyIHN0cmluZ1sxNTBdOworCisJc3ByaW50ZihzdHJpbmcsICIlcyAoJXMpIGluIHNsb3QgJWQgdiVzIiwKKwkJaG9zdC0+aG9zdHQtPm5hbWUsIGluZm8tPmluZm8uc2NzaS50eXBlLCBpbmZvLT5lYy0+c2xvdF9ubywKKwkJVkVSU0lPTik7CisKKwlyZXR1cm4gc3RyaW5nOworfQorCisvKgorICogRnVuY3Rpb246IGludCBhcnhlc2NzaV9wcm9jX2luZm8oY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKyAqCQkJCQkgaW50IGxlbmd0aCwgaW50IGhvc3Rfbm8sIGludCBpbm91dCkKKyAqIFB1cnBvc2UgOiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRyaXZlciB0byBhIHVzZXIgcHJvY2VzcyBhY2Nlc3NpbmcKKyAqCSAgICAgdGhlIC9wcm9jIGZpbGVzeXN0ZW0uCisgKiBQYXJhbXMgIDogYnVmZmVyIC0gYSBidWZmZXIgdG8gd3JpdGUgaW5mb3JtYXRpb24gdG8KKyAqCSAgICAgc3RhcnQgIC0gYSBwb2ludGVyIGludG8gdGhpcyBidWZmZXIgc2V0IGJ5IHRoaXMgcm91dGluZSB0byB0aGUgc3RhcnQKKyAqCQkgICAgICBvZiB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24uCisgKgkgICAgIG9mZnNldCAtIG9mZnNldCBpbnRvIGluZm9ybWF0aW9uIHRoYXQgd2UgaGF2ZSByZWFkIHVwdG8uCisgKgkgICAgIGxlbmd0aCAtIGxlbmd0aCBvZiBidWZmZXIKKyAqCSAgICAgaG9zdF9ubyAtIGhvc3QgbnVtYmVyIHRvIHJldHVybiBpbmZvcm1hdGlvbiBmb3IKKyAqCSAgICAgaW5vdXQgIC0gMCBmb3IgcmVhZGluZywgMSBmb3Igd3JpdGluZy4KKyAqIFJldHVybnMgOiBsZW5ndGggb2YgZGF0YSB3cml0dGVuIHRvIGJ1ZmZlci4KKyAqLworc3RhdGljIGludAorYXJ4ZXNjc2lfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsCisJCSAgIGludCBpbm91dCkKK3sKKwlzdHJ1Y3QgYXJ4ZXNjc2lfaW5mbyAqaW5mbzsKKwljaGFyICpwID0gYnVmZmVyOworCWludCBwb3M7CisKKwlpbmZvID0gKHN0cnVjdCBhcnhlc2NzaV9pbmZvICopaG9zdC0+aG9zdGRhdGE7CisJaWYgKGlub3V0ID09IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJcCArPSBzcHJpbnRmKHAsICJBUlhFIDE2LWJpdCBTQ1NJIGRyaXZlciB2JXNcbiIsIFZFUlNJT04pOworCXAgKz0gZmFzMjE2X3ByaW50X2hvc3QoJmluZm8tPmluZm8sIHApOworCXAgKz0gZmFzMjE2X3ByaW50X3N0YXRzKCZpbmZvLT5pbmZvLCBwKTsKKwlwICs9IGZhczIxNl9wcmludF9kZXZpY2VzKCZpbmZvLT5pbmZvLCBwKTsKKworCSpzdGFydCA9IGJ1ZmZlciArIG9mZnNldDsKKwlwb3MgPSBwIC0gYnVmZmVyIC0gb2Zmc2V0OworCWlmIChwb3MgPiBsZW5ndGgpCisJCXBvcyA9IGxlbmd0aDsKKworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgYXJ4ZXNjc2lfdGVtcGxhdGUgPSB7CisJLnByb2NfaW5mbwkJCT0gYXJ4ZXNjc2lfcHJvY19pbmZvLAorCS5uYW1lCQkJCT0gIkFSWEUgU0NTSSBjYXJkIiwKKwkuaW5mbwkJCQk9IGFyeGVzY3NpX2luZm8sCisJLnF1ZXVlY29tbWFuZAkJCT0gZmFzMjE2X25vcXVldWVfY29tbWFuZCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCQk9IGZhczIxNl9laF9ob3N0X3Jlc2V0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgkJPSBmYXMyMTZfZWhfYnVzX3Jlc2V0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcgk9IGZhczIxNl9laF9kZXZpY2VfcmVzZXQsCisJLmVoX2Fib3J0X2hhbmRsZXIJCT0gZmFzMjE2X2VoX2Fib3J0LAorCS5jYW5fcXVldWUJCQk9IDAsCisJLnRoaXNfaWQJCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCQk9IERJU0FCTEVfQ0xVU1RFUklORywKKwkucHJvY19uYW1lCQkJPSAiYXJ4ZXNjc2kiLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQKK2FyeGVzY3NpX3Byb2JlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCAqaWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3QgYXJ4ZXNjc2lfaW5mbyAqaW5mbzsKKwl1bnNpZ25lZCBsb25nIHJlc2Jhc2UsIHJlc2xlbjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJaW50IHJldDsKKworCXJldCA9IGVjYXJkX3JlcXVlc3RfcmVzb3VyY2VzKGVjKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJlc2Jhc2UgPSBlY2FyZF9yZXNvdXJjZV9zdGFydChlYywgRUNBUkRfUkVTX01FTUMpOworCXJlc2xlbiA9IGVjYXJkX3Jlc291cmNlX2xlbihlYywgRUNBUkRfUkVTX01FTUMpOworCWJhc2UgPSBpb3JlbWFwKHJlc2Jhc2UsIHJlc2xlbik7CisJaWYgKCFiYXNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3JlZ2lvbjsKKwl9CisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZhcnhlc2NzaV90ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBhcnhlc2NzaV9pbmZvKSk7CisJaWYgKCFob3N0KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3VubWFwOworCX0KKworCWluZm8gPSAoc3RydWN0IGFyeGVzY3NpX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKwlpbmZvLT5lYyA9IGVjOworCWluZm8tPmJhc2UgPSBiYXNlOworCisJaW5mby0+aW5mby5zY3NpLmlvX2Jhc2UJCT0gYmFzZSArIDB4MjAwMDsKKwlpbmZvLT5pbmZvLnNjc2kuaXJxCQk9IE5PX0lSUTsKKwlpbmZvLT5pbmZvLnNjc2kuZG1hCQk9IE5PX0RNQTsKKwlpbmZvLT5pbmZvLnNjc2kuaW9fc2hpZnQJPSA1OworCWluZm8tPmluZm8uaWZjZmcuY2xvY2tyYXRlCT0gMjQ7IC8qIE1IeiAqLworCWluZm8tPmluZm8uaWZjZmcuc2VsZWN0X3RpbWVvdXQgPSAyNTU7CisJaW5mby0+aW5mby5pZmNmZy5hc3luY3BlcmlvZAk9IDIwMDsgLyogbnMgKi8KKwlpbmZvLT5pbmZvLmlmY2ZnLnN5bmNfbWF4X2RlcHRoCT0gMDsKKwlpbmZvLT5pbmZvLmlmY2ZnLmNudGwzCQk9IENOVEwzX0ZBU1RTQ1NJIHwgQ05UTDNfRkFTVENMSzsKKwlpbmZvLT5pbmZvLmlmY2ZnLmRpc2Nvbm5lY3Rfb2sJPSAwOworCWluZm8tPmluZm8uaWZjZmcud2lkZV9tYXhfc2l6ZQk9IDA7CisJaW5mby0+aW5mby5pZmNmZy5jYXBhYmlsaXRpZXMJPSBGQVNDQVBfUFNFVURPRE1BOworCWluZm8tPmluZm8uZG1hLnNldHVwCQk9IGFyeGVzY3NpX2RtYV9zZXR1cDsKKwlpbmZvLT5pbmZvLmRtYS5wc2V1ZG8JCT0gYXJ4ZXNjc2lfZG1hX3BzZXVkbzsKKwlpbmZvLT5pbmZvLmRtYS5zdG9wCQk9IGFyeGVzY3NpX2RtYV9zdG9wOworCQkKKwllYy0+aXJxYWRkciA9IGJhc2U7CisJZWMtPmlycW1hc2sgPSBDU1RBVFVTX0lSUTsKKworCXJldCA9IGZhczIxNl9pbml0KGhvc3QpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CisKKwlyZXQgPSBmYXMyMTZfYWRkKGhvc3QsICZlYy0+ZGV2KTsKKwlpZiAocmV0ID09IDApCisJCWdvdG8gb3V0OworCisJZmFzMjE2X3JlbGVhc2UoaG9zdCk7Cisgb3V0X3VucmVnaXN0ZXI6CisJc2NzaV9ob3N0X3B1dChob3N0KTsKKyBvdXRfdW5tYXA6CisJaW91bm1hcChiYXNlKTsKKyBvdXRfcmVnaW9uOgorCWVjYXJkX3JlbGVhc2VfcmVzb3VyY2VzKGVjKTsKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGFyeGVzY3NpX3JlbW92ZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CisJc3RydWN0IGFyeGVzY3NpX2luZm8gKmluZm8gPSAoc3RydWN0IGFyeGVzY3NpX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKworCWVjYXJkX3NldF9kcnZkYXRhKGVjLCBOVUxMKTsKKwlmYXMyMTZfcmVtb3ZlKGhvc3QpOworCisJaW91bm1hcChpbmZvLT5iYXNlKTsKKworCWZhczIxNl9yZWxlYXNlKGhvc3QpOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisJZWNhcmRfcmVsZWFzZV9yZXNvdXJjZXMoZWMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGVjYXJkX2lkIGFyeGVzY3NpX2NpZHNbXSA9IHsKKwl7IE1BTlVfQVJYRSwgUFJPRF9BUlhFX1NDU0kgfSwKKwl7IDB4ZmZmZiwgMHhmZmZmIH0sCit9OworCitzdGF0aWMgc3RydWN0IGVjYXJkX2RyaXZlciBhcnhlc2NzaV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGFyeGVzY3NpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYXJ4ZXNjc2lfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSBhcnhlc2NzaV9jaWRzLAorCS5kcnYgPSB7CisJCS5uYW1lCQk9ICJhcnhlc2NzaSIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYXJ4ZV9zY3NpX2RyaXZlcih2b2lkKQoreworCXJldHVybiBlY2FyZF9yZWdpc3Rlcl9kcml2ZXIoJmFyeGVzY3NpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2FyeGVfc2NzaV9kcml2ZXIodm9pZCkKK3sKKwllY2FyZF9yZW1vdmVfZHJpdmVyKCZhcnhlc2NzaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbml0X2FyeGVfc2NzaV9kcml2ZXIpOworbW9kdWxlX2V4aXQoZXhpdF9hcnhlX3Njc2lfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiU3RlZmFuIEhhbnNrZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBUlhFU0NTSSBkcml2ZXIgZm9yIEFjb3JuIG1hY2hpbmVzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcm0vY3VtYW5hXzEuYyBiL2RyaXZlcnMvc2NzaS9hcm0vY3VtYW5hXzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzI3MWJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FybS9jdW1hbmFfMS5jCkBAIC0wLDAgKzEsMzU3IEBACisvKgorICogR2VuZXJpYyBHZW5lcmljIE5DUjUzODAgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDE5OTUtMjAwMiwgUnVzc2VsbCBLaW5nCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2VjYXJkLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIi4uL3Njc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CisKKyNkZWZpbmUgQVVUT1NFTlNFCisjZGVmaW5lIFBTRVVET19ETUEKKworI2RlZmluZSBDVU1BTkFTQ1NJX1BVQkxJQ19SRUxFQVNFIDEKKworI2RlZmluZSBOQ1I1MzgwX2ltcGxlbWVudGF0aW9uX2ZpZWxkcwlpbnQgcG9ydCwgY3RybAorI2RlZmluZSBOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKQkJc3RydWN0IFNjc2lfSG9zdCAqX2luc3RhbmNlCisjZGVmaW5lIE5DUjUzODBfc2V0dXAoaW5zdGFuY2UpCQlfaW5zdGFuY2UgPSBpbnN0YW5jZQorI2RlZmluZSBOQ1I1MzgwX3JlYWQocmVnKQkJY3VtYW5hc2NzaV9yZWFkKF9pbnN0YW5jZSwgcmVnKQorI2RlZmluZSBOQ1I1MzgwX3dyaXRlKHJlZywgdmFsdWUpCWN1bWFuYXNjc2lfd3JpdGUoX2luc3RhbmNlLCByZWcsIHZhbHVlKQorI2RlZmluZSBOQ1I1MzgwX2ludHIJCQljdW1hbmFzY3NpX2ludHIKKyNkZWZpbmUgTkNSNTM4MF9xdWV1ZV9jb21tYW5kCQljdW1hbmFzY3NpX3F1ZXVlX2NvbW1hbmQKKyNkZWZpbmUgTkNSNTM4MF9wcm9jX2luZm8JCWN1bWFuYXNjc2lfcHJvY19pbmZvCisKKyNkZWZpbmUgQk9BUkRfTk9STUFMCTAKKyNkZWZpbmUgQk9BUkRfTkNSNTNDNDAwCTEKKworI2luY2x1ZGUgIi4uL05DUjUzODAuaCIKKwordm9pZCBjdW1hbmFzY3NpX3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKQoreworfQorCitjb25zdCBjaGFyICpjdW1hbmFzY3NpX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc3BudCkKK3sKKwlyZXR1cm4gIiI7Cit9CisKKyNpZmRlZiBOT1RfRUZGSUNJRU5UCisjZGVmaW5lIENUUkwocCx2KSAgICAgb3V0YigqY3RybCA9ICh2KSwgKHApIC0gNTc3KQorI2RlZmluZSBTVEFUKHApICAgICAgIGluYigocCkrMSkKKyNkZWZpbmUgSU4ocCkgICAgICAgICBpbmIoKHApKQorI2RlZmluZSBPVVQodixwKSAgICAgIG91dGIoKHYpLCAocCkpCisjZWxzZQorI2RlZmluZSBDVFJMKHAsdikJKHBbLTIzMDhdID0gKCpjdHJsID0gKHYpKSkKKyNkZWZpbmUgU1RBVChwKQkJKHBbNF0pCisjZGVmaW5lIElOKHApCQkoKihwKSkKKyNkZWZpbmUgSU4yKHApCQkoKHVuc2lnbmVkIHNob3J0KSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikocCkpKQorI2RlZmluZSBPVVQodixwKQkoKihwKSA9ICh2KSkKKyNkZWZpbmUgT1VUMih2LHApCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKHApKSA9ICh2KSkKKyNlbmRpZgorI2RlZmluZSBMKHYpCQkoKCh2KTw8MTYpfCgodikgJiAweDAwMDBmZmZmKSkKKyNkZWZpbmUgSCh2KQkJKCgodik+PjE2KXwoKHYpICYgMHhmZmZmMDAwMCkpCisKK3N0YXRpYyBpbmxpbmUgaW50CitOQ1I1MzgwX3B3cml0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgdW5zaWduZWQgY2hhciAqYWRkciwgaW50IGxlbikKK3sKKyAgaW50ICpjdHJsID0gJigoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKilpbnN0YW5jZS0+aG9zdGRhdGEpLT5jdHJsOworICBpbnQgb2xkY3RybCA9ICpjdHJsOworICB1bnNpZ25lZCBsb25nICpsYWRkcjsKKyNpZmRlZiBOT1RfRUZGSUNJRU5UCisgIGludCBpb2Jhc2UgPSBpbnN0YW5jZS0+aW9fcG9ydDsKKyAgaW50IGRtYV9pbyA9IGlvYmFzZSAmIH4oMHgzQzAwMDA+PjIpOworI2Vsc2UKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqaW9iYXNlID0gKHVuc2lnbmVkIGNoYXIgKilpb2FkZHIoaW5zdGFuY2UtPmlvX3BvcnQpOworICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpkbWFfaW8gPSAodW5zaWduZWQgY2hhciAqKSgoaW50KWlvYmFzZSAmIH4weDNDMDAwMCk7CisjZW5kaWYKKworICBpZighbGVuKSByZXR1cm4gMDsKKworICBDVFJMKGlvYmFzZSwgMHgwMik7CisgIGxhZGRyID0gKHVuc2lnbmVkIGxvbmcgKilhZGRyOworICB3aGlsZShsZW4gPj0gMzIpCisgIHsKKyAgICBpbnQgc3RhdHVzOworICAgIHVuc2lnbmVkIGxvbmcgdjsKKyAgICBzdGF0dXMgPSBTVEFUKGlvYmFzZSk7CisgICAgaWYoc3RhdHVzICYgMHg4MCkKKyAgICAgIGdvdG8gZW5kOworICAgIGlmKCEoc3RhdHVzICYgMHg0MCkpCisgICAgICBjb250aW51ZTsKKyAgICB2PSpsYWRkcisrOyBPVVQyKEwodiksZG1hX2lvKTsgT1VUMihIKHYpLGRtYV9pbyk7CisgICAgdj0qbGFkZHIrKzsgT1VUMihMKHYpLGRtYV9pbyk7IE9VVDIoSCh2KSxkbWFfaW8pOworICAgIHY9KmxhZGRyKys7IE9VVDIoTCh2KSxkbWFfaW8pOyBPVVQyKEgodiksZG1hX2lvKTsKKyAgICB2PSpsYWRkcisrOyBPVVQyKEwodiksZG1hX2lvKTsgT1VUMihIKHYpLGRtYV9pbyk7CisgICAgdj0qbGFkZHIrKzsgT1VUMihMKHYpLGRtYV9pbyk7IE9VVDIoSCh2KSxkbWFfaW8pOworICAgIHY9KmxhZGRyKys7IE9VVDIoTCh2KSxkbWFfaW8pOyBPVVQyKEgodiksZG1hX2lvKTsKKyAgICB2PSpsYWRkcisrOyBPVVQyKEwodiksZG1hX2lvKTsgT1VUMihIKHYpLGRtYV9pbyk7CisgICAgdj0qbGFkZHIrKzsgT1VUMihMKHYpLGRtYV9pbyk7IE9VVDIoSCh2KSxkbWFfaW8pOworICAgIGxlbiAtPSAzMjsKKyAgICBpZihsZW4gPT0gMCkKKyAgICAgIGJyZWFrOworICB9CisKKyAgYWRkciA9ICh1bnNpZ25lZCBjaGFyICopbGFkZHI7CisgIENUUkwoaW9iYXNlLCAweDEyKTsKKyAgd2hpbGUobGVuID4gMCkKKyAgeworICAgIGludCBzdGF0dXM7CisgICAgc3RhdHVzID0gU1RBVChpb2Jhc2UpOworICAgIGlmKHN0YXR1cyAmIDB4ODApCisgICAgICBnb3RvIGVuZDsKKyAgICBpZihzdGF0dXMgJiAweDQwKQorICAgIHsKKyAgICAgIE9VVCgqYWRkcisrLCBkbWFfaW8pOworICAgICAgaWYoLS1sZW4gPT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3RhdHVzID0gU1RBVChpb2Jhc2UpOworICAgIGlmKHN0YXR1cyAmIDB4ODApCisgICAgICBnb3RvIGVuZDsKKyAgICBpZihzdGF0dXMgJiAweDQwKQorICAgIHsKKyAgICAgIE9VVCgqYWRkcisrLCBkbWFfaW8pOworICAgICAgaWYoLS1sZW4gPT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CitlbmQ6CisgIENUUkwoaW9iYXNlLCBvbGRjdHJsfDB4NDApOworICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW5saW5lIGludAorTkNSNTM4MF9wcmVhZChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgdW5zaWduZWQgY2hhciAqYWRkciwgaW50IGxlbikKK3sKKyAgaW50ICpjdHJsID0gJigoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKilpbnN0YW5jZS0+aG9zdGRhdGEpLT5jdHJsOworICBpbnQgb2xkY3RybCA9ICpjdHJsOworICB1bnNpZ25lZCBsb25nICpsYWRkcjsKKyNpZmRlZiBOT1RfRUZGSUNJRU5UCisgIGludCBpb2Jhc2UgPSBpbnN0YW5jZS0+aW9fcG9ydDsKKyAgaW50IGRtYV9pbyA9IGlvYmFzZSAmIH4oMHgzQzAwMDA+PjIpOworI2Vsc2UKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqaW9iYXNlID0gKHVuc2lnbmVkIGNoYXIgKilpb2FkZHIoaW5zdGFuY2UtPmlvX3BvcnQpOworICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpkbWFfaW8gPSAodW5zaWduZWQgY2hhciAqKSgoaW50KWlvYmFzZSAmIH4weDNDMDAwMCk7CisjZW5kaWYKKworICBpZighbGVuKSByZXR1cm4gMDsKKworICBDVFJMKGlvYmFzZSwgMHgwMCk7CisgIGxhZGRyID0gKHVuc2lnbmVkIGxvbmcgKilhZGRyOworICB3aGlsZShsZW4gPj0gMzIpCisgIHsKKyAgICBpbnQgc3RhdHVzOworICAgIHN0YXR1cyA9IFNUQVQoaW9iYXNlKTsKKyAgICBpZihzdGF0dXMgJiAweDgwKQorICAgICAgZ290byBlbmQ7CisgICAgaWYoIShzdGF0dXMgJiAweDQwKSkKKyAgICAgIGNvbnRpbnVlOworICAgICpsYWRkcisrID0gSU4yKGRtYV9pbyl8KElOMihkbWFfaW8pPDwxNik7CisgICAgKmxhZGRyKysgPSBJTjIoZG1hX2lvKXwoSU4yKGRtYV9pbyk8PDE2KTsKKyAgICAqbGFkZHIrKyA9IElOMihkbWFfaW8pfChJTjIoZG1hX2lvKTw8MTYpOworICAgICpsYWRkcisrID0gSU4yKGRtYV9pbyl8KElOMihkbWFfaW8pPDwxNik7CisgICAgKmxhZGRyKysgPSBJTjIoZG1hX2lvKXwoSU4yKGRtYV9pbyk8PDE2KTsKKyAgICAqbGFkZHIrKyA9IElOMihkbWFfaW8pfChJTjIoZG1hX2lvKTw8MTYpOworICAgICpsYWRkcisrID0gSU4yKGRtYV9pbyl8KElOMihkbWFfaW8pPDwxNik7CisgICAgKmxhZGRyKysgPSBJTjIoZG1hX2lvKXwoSU4yKGRtYV9pbyk8PDE2KTsKKyAgICBsZW4gLT0gMzI7CisgICAgaWYobGVuID09IDApCisgICAgICBicmVhazsKKyAgfQorCisgIGFkZHIgPSAodW5zaWduZWQgY2hhciAqKWxhZGRyOworICBDVFJMKGlvYmFzZSwgMHgxMCk7CisgIHdoaWxlKGxlbiA+IDApCisgIHsKKyAgICBpbnQgc3RhdHVzOworICAgIHN0YXR1cyA9IFNUQVQoaW9iYXNlKTsKKyAgICBpZihzdGF0dXMgJiAweDgwKQorICAgICAgZ290byBlbmQ7CisgICAgaWYoc3RhdHVzICYgMHg0MCkKKyAgICB7CisgICAgICAqYWRkcisrID0gSU4oZG1hX2lvKTsKKyAgICAgIGlmKC0tbGVuID09IDApCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN0YXR1cyA9IFNUQVQoaW9iYXNlKTsKKyAgICBpZihzdGF0dXMgJiAweDgwKQorICAgICAgZ290byBlbmQ7CisgICAgaWYoc3RhdHVzICYgMHg0MCkKKyAgICB7CisgICAgICAqYWRkcisrID0gSU4oZG1hX2lvKTsKKyAgICAgIGlmKC0tbGVuID09IDApCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorZW5kOgorICBDVFJMKGlvYmFzZSwgb2xkY3RybHwweDQwKTsKKyAgcmV0dXJuIGxlbjsKK30KKworI3VuZGVmIFNUQVQKKyN1bmRlZiBDVFJMCisjdW5kZWYgSU4KKyN1bmRlZiBPVVQKKworI2RlZmluZSBDVFJMKHAsdikgb3V0YigqY3RybCA9ICh2KSwgKHApIC0gNTc3KQorCitzdGF0aWMgY2hhciBjdW1hbmFzY3NpX3JlYWQoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGludCByZWcpCit7CisJdW5zaWduZWQgaW50IGlvYmFzZSA9IGluc3RhbmNlLT5pb19wb3J0OworCWludCBpOworCWludCAqY3RybCA9ICYoKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopaW5zdGFuY2UtPmhvc3RkYXRhKS0+Y3RybDsKKworCUNUUkwoaW9iYXNlLCAwKTsKKwlpID0gaW5iKGlvYmFzZSArIDY0ICsgcmVnKTsKKwlDVFJMKGlvYmFzZSwgMHg0MCk7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgY3VtYW5hc2NzaV93cml0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgaW50IHJlZywgaW50IHZhbHVlKQoreworCWludCBpb2Jhc2UgPSBpbnN0YW5jZS0+aW9fcG9ydDsKKwlpbnQgKmN0cmwgPSAmKChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKWluc3RhbmNlLT5ob3N0ZGF0YSktPmN0cmw7CisKKwlDVFJMKGlvYmFzZSwgMCk7CisJb3V0Yih2YWx1ZSwgaW9iYXNlICsgNjQgKyByZWcpOworCUNUUkwoaW9iYXNlLCAweDQwKTsKK30KKworI3VuZGVmIENUUkwKKworI2luY2x1ZGUgIi4uL05DUjUzODAuYyIKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBjdW1hbmFzY3NpX3RlbXBsYXRlID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSAiQ3VtYW5hIDE2LWJpdCBTQ1NJIiwKKwkuaW5mbwkJCT0gY3VtYW5hc2NzaV9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gY3VtYW5hc2NzaV9xdWV1ZV9jb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gTkNSNTM4MF9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXI9IE5DUjUzODBfZGV2aWNlX3Jlc2V0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IE5DUjUzODBfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSBOQ1I1MzgwX2hvc3RfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSAxNiwKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAyLAorCS51bmNoZWNrZWRfaXNhX2RtYQk9IDAsCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORywKKwkucHJvY19uYW1lCQk9ICJDdW1hbmFTQ1NJLTEiLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQKK2N1bWFuYXNjc2kxX3Byb2JlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCAqaWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmN1bWFuYXNjc2lfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSkpOworCWlmICghaG9zdCkKKwkJZ290byBvdXQ7CisKKyAgICAgICAgaG9zdC0+aW9fcG9ydCA9IGVjYXJkX2FkZHJlc3MoZWMsIEVDQVJEX0lPQywgRUNBUkRfU0xPVykgKyAweDgwMDsKKwlob3N0LT5pcnEgPSBlYy0+aXJxOworCisJTkNSNTM4MF9pbml0KGhvc3QsIDApOworCisJaG9zdC0+bl9pb19wb3J0ID0gMjU1OworCWlmICghKHJlcXVlc3RfcmVnaW9uKGhvc3QtPmlvX3BvcnQsIGhvc3QtPm5faW9fcG9ydCwgIkN1bWFuYVNDU0ktMSIpKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisgICAgICAgICgoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKilob3N0LT5ob3N0ZGF0YSktPmN0cmwgPSAwOworICAgICAgICBvdXRiKDB4MDAsIGhvc3QtPmlvX3BvcnQgLSA1NzcpOworCisJcmV0ID0gcmVxdWVzdF9pcnEoaG9zdC0+aXJxLCBjdW1hbmFzY3NpX2ludHIsIFNBX0lOVEVSUlVQVCwKKwkJCSAgIkN1bWFuYVNDU0ktMSIsIGhvc3QpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKCJzY3NpJWQ6IElSUSVkIG5vdCBmcmVlOiAlZFxuIiwKKwkJICAgIGhvc3QtPmhvc3Rfbm8sIGhvc3QtPmlycSwgcmV0KTsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisKKwlwcmludGsoInNjc2klZDogYXQgcG9ydCAweCUwOGx4IGlycSAlZCIsCisJCWhvc3QtPmhvc3Rfbm8sIGhvc3QtPmlvX3BvcnQsIGhvc3QtPmlycSk7CisJcHJpbnRrKCIgb3B0aW9ucyBDQU5fUVVFVUU9JWQgQ01EX1BFUl9MVU49JWQgcmVsZWFzZT0lZCIsCisJCWhvc3QtPmNhbl9xdWV1ZSwgaG9zdC0+Y21kX3Blcl9sdW4sIENVTUFOQVNDU0lfUFVCTElDX1JFTEVBU0UpOworCXByaW50aygiXG5zY3NpJWQ6IiwgaG9zdC0+aG9zdF9ubyk7CisJTkNSNTM4MF9wcmludF9vcHRpb25zKGhvc3QpOworCXByaW50aygiXG4iKTsKKworCXJldCA9IHNjc2lfYWRkX2hvc3QoaG9zdCwgJmVjLT5kZXYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZyZWVfaXJxOworCisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisJZ290byBvdXQ7CisKKyBvdXRfZnJlZV9pcnE6CisJZnJlZV9pcnEoaG9zdC0+aXJxLCBob3N0KTsKKyBvdXRfcmVsZWFzZToKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQpOworIG91dF9mcmVlOgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7Cisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjdW1hbmFzY3NpMV9yZW1vdmUoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZWNhcmRfZ2V0X2RydmRhdGEoZWMpOworCisJZWNhcmRfc2V0X2RydmRhdGEoZWMsIE5VTEwpOworCisJc2NzaV9yZW1vdmVfaG9zdChob3N0KTsKKwlmcmVlX2lycShob3N0LT5pcnEsIGhvc3QpOworCU5DUjUzODBfZXhpdChob3N0KTsKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQpOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWNhcmRfaWQgY3VtYW5hc2NzaTFfY2lkc1tdID0geworCXsgTUFOVV9DVU1BTkEsIFBST0RfQ1VNQU5BX1NDU0lfMSB9LAorCXsgMHhmZmZmLCAweGZmZmYgfQorfTsKKworc3RhdGljIHN0cnVjdCBlY2FyZF9kcml2ZXIgY3VtYW5hc2NzaTFfZHJpdmVyID0geworCS5wcm9iZQkJPSBjdW1hbmFzY3NpMV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGN1bWFuYXNjc2kxX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gY3VtYW5hc2NzaTFfY2lkcywKKwkuZHJ2ID0geworCQkubmFtZQkJPSAiY3VtYW5hc2NzaTEiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjdW1hbmFzY3NpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZWNhcmRfcmVnaXN0ZXJfZHJpdmVyKCZjdW1hbmFzY3NpMV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY3VtYW5hc2NzaV9leGl0KHZvaWQpCit7CisJZWNhcmRfcmVtb3ZlX2RyaXZlcigmY3VtYW5hc2NzaTFfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY3VtYW5hc2NzaV9pbml0KTsKK21vZHVsZV9leGl0KGN1bWFuYXNjc2lfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQ3VtYW5hIFNDU0ktMSBkcml2ZXIgZm9yIEFjb3JuIG1hY2hpbmVzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL2N1bWFuYV8yLmMgYi9kcml2ZXJzL3Njc2kvYXJtL2N1bWFuYV8yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmMDY0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vY3VtYW5hXzIuYwpAQCAtMCwwICsxLDU1NiBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Fjb3JuL3Njc2kvY3VtYW5hXzIuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNSBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDaGFuZ2Vsb2c6CisgKiAgIDMwLTA4LTE5OTcJUk1LCTAuMC4wCUNyZWF0ZWQsIFJFQURPTkxZIHZlcnNpb24uCisgKiAgIDIyLTAxLTE5OTgJUk1LCTAuMC4xCVVwZGF0ZWQgdG8gMi4xLjgwLgorICogICAxNS0wNC0xOTk4CVJNSwkwLjAuMQlPbmx5IGRvIFBJTyBpZiBGQVMyMTYgd2lsbCBhbGxvdyBpdC4KKyAqICAgMDItMDUtMTk5OAlSTUsJMC4wLjIJVXBkYXRlZCAmIGFkZGVkIERNQSBzdXBwb3J0LgorICogICAyNy0wNi0xOTk4CVJNSwkJQ2hhbmdlZCBhc20vZGVsYXkuaCB0byBsaW51eC9kZWxheS5oCisgKiAgIDE4LTA4LTE5OTgJUk1LCTAuMC4zCUZpeGVkIHN5bmNocm9ub3VzIHRyYW5zZmVyIGRlcHRoLgorICogICAwMi0wNC0yMDAwCVJNSwkwLjAuNAlVcGRhdGVkIGZvciBuZXcgZXJyb3IgaGFuZGxpbmcgY29kZS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2VjYXJkLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKKyNpbmNsdWRlICIuLi9zY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJmYXMyMTYuaCIKKyNpbmNsdWRlICJzY3NpLmgiCisKKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKworI2RlZmluZSBDVU1BTkFTQ1NJMl9TVEFUVVMJCSgweDAwMDApCisjZGVmaW5lIFNUQVRVU19JTlQJCQkoMSA8PCAwKQorI2RlZmluZSBTVEFUVVNfRFJRCQkJKDEgPDwgMSkKKyNkZWZpbmUgU1RBVFVTX0xBVENIRUQJCQkoMSA8PCAzKQorCisjZGVmaW5lIENVTUFOQVNDU0kyX0FMQVRDSAkJKDB4MDAxNCkKKyNkZWZpbmUgQUxBVENIX0VOQV9JTlQJCQkoMykKKyNkZWZpbmUgQUxBVENIX0RJU19JTlQJCQkoMikKKyNkZWZpbmUgQUxBVENIX0VOQV9URVJNCQkJKDUpCisjZGVmaW5lIEFMQVRDSF9ESVNfVEVSTQkJCSg0KQorI2RlZmluZSBBTEFUQ0hfRU5BX0JJVDMyCQkoMTEpCisjZGVmaW5lIEFMQVRDSF9ESVNfQklUMzIJCSgxMCkKKyNkZWZpbmUgQUxBVENIX0VOQV9ETUEJCQkoMTMpCisjZGVmaW5lIEFMQVRDSF9ESVNfRE1BCQkJKDEyKQorI2RlZmluZSBBTEFUQ0hfRE1BX09VVAkJCSgxNSkKKyNkZWZpbmUgQUxBVENIX0RNQV9JTgkJCSgxNCkKKworI2RlZmluZSBDVU1BTkFTQ1NJMl9QU0VVRE9ETUEJCSgweDAyMDApCisKKyNkZWZpbmUgQ1VNQU5BU0NTSTJfRkFTMjE2X09GRlNFVAkoMHgwMzAwKQorI2RlZmluZSBDVU1BTkFTQ1NJMl9GQVMyMTZfU0hJRlQJMgorCisvKgorICogVmVyc2lvbgorICovCisjZGVmaW5lIFZFUlNJT04gIjEuMDAgKDEzLzExLzIwMDIgMi41LjQ3KSIKKworLyoKKyAqIFVzZSB0ZXJtPTAsMSwwLDAsMCB0byB0dXJuIHRlcm1pbmF0b3JzIG9uL29mZgorICovCitzdGF0aWMgaW50IHRlcm1bTUFYX0VDQVJEU10gPSB7IDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEgfTsKKworI2RlZmluZSBOUl9TRwkyNTYKKworc3RydWN0IGN1bWFuYXNjc2kyX2luZm8geworCUZBUzIxNl9JbmZvCQlpbmZvOworCXN0cnVjdCBleHBhbnNpb25fY2FyZAkqZWM7CisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwl1bnNpZ25lZCBpbnQJCXRlcm1zOwkJLyogVGVybWluYXRvciBzdGF0ZQkqLworCXN0cnVjdCBzY2F0dGVybGlzdAlzZ1tOUl9TR107CS8qIFNjYXR0ZXIgRE1BIGxpc3QJKi8KK307CisKKyNkZWZpbmUgQ1NUQVRVU19JUlEJKDEgPDwgMCkKKyNkZWZpbmUgQ1NUQVRVU19EUlEJKDEgPDwgMSkKKworLyogUHJvdG90eXBlOiB2b2lkIGN1bWFuYXNjc2lfMl9pcnFlbmFibGUoZWMsIGlycW5yKQorICogUHVycG9zZSAgOiBFbmFibGUgaW50ZXJydXB0cyBvbiBDdW1hbmEgU0NTSSAyIGNhcmQKKyAqIFBhcmFtcyAgIDogZWMgICAgLSBleHBhbnNpb24gY2FyZCBzdHJ1Y3R1cmUKKyAqICAgICAgICAgIDogaXJxbnIgLSBpbnRlcnJ1cHQgbnVtYmVyCisgKi8KK3N0YXRpYyB2b2lkCitjdW1hbmFzY3NpXzJfaXJxZW5hYmxlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGludCBpcnFucikKK3sKKwlzdHJ1Y3QgY3VtYW5hc2NzaTJfaW5mbyAqaW5mbyA9IGVjLT5pcnFfZGF0YTsKKwl3cml0ZWIoQUxBVENIX0VOQV9JTlQsIGluZm8tPmJhc2UgKyBDVU1BTkFTQ1NJMl9BTEFUQ0gpOworfQorCisvKiBQcm90b3R5cGU6IHZvaWQgY3VtYW5hc2NzaV8yX2lycWRpc2FibGUoZWMsIGlycW5yKQorICogUHVycG9zZSAgOiBEaXNhYmxlIGludGVycnVwdHMgb24gQ3VtYW5hIFNDU0kgMiBjYXJkCisgKiBQYXJhbXMgICA6IGVjICAgIC0gZXhwYW5zaW9uIGNhcmQgc3RydWN0dXJlCisgKiAgICAgICAgICA6IGlycW5yIC0gaW50ZXJydXB0IG51bWJlcgorICovCitzdGF0aWMgdm9pZAorY3VtYW5hc2NzaV8yX2lycWRpc2FibGUoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYywgaW50IGlycW5yKQoreworCXN0cnVjdCBjdW1hbmFzY3NpMl9pbmZvICppbmZvID0gZWMtPmlycV9kYXRhOworCXdyaXRlYihBTEFUQ0hfRElTX0lOVCwgaW5mby0+YmFzZSArIENVTUFOQVNDU0kyX0FMQVRDSCk7Cit9CisKK3N0YXRpYyBjb25zdCBleHBhbnNpb25jYXJkX29wc190IGN1bWFuYXNjc2lfMl9vcHMgPSB7CisJLmlycWVuYWJsZQk9IGN1bWFuYXNjc2lfMl9pcnFlbmFibGUsCisJLmlycWRpc2FibGUJPSBjdW1hbmFzY3NpXzJfaXJxZGlzYWJsZSwKK307CisKKy8qIFByb3RvdHlwZTogdm9pZCBjdW1hbmFzY3NpXzJfdGVybWluYXRvcl9jdGwoaG9zdCwgb25fb2ZmKQorICogUHVycG9zZSAgOiBUdXJuIHRoZSBDdW1hbmEgU0NTSSAyIHRlcm1pbmF0b3JzIG9uIG9yIG9mZgorICogUGFyYW1zICAgOiBob3N0ICAgLSBjYXJkIHRvIHR1cm4gb24vb2ZmCisgKiAgICAgICAgICA6IG9uX29mZiAtICEwIHRvIHR1cm4gb24sIDAgdG8gdHVybiBvZmYKKyAqLworc3RhdGljIHZvaWQKK2N1bWFuYXNjc2lfMl90ZXJtaW5hdG9yX2N0bChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBpbnQgb25fb2ZmKQoreworCXN0cnVjdCBjdW1hbmFzY3NpMl9pbmZvICppbmZvID0gKHN0cnVjdCBjdW1hbmFzY3NpMl9pbmZvICopaG9zdC0+aG9zdGRhdGE7CisKKwlpZiAob25fb2ZmKSB7CisJCWluZm8tPnRlcm1zID0gMTsKKwkJd3JpdGViKEFMQVRDSF9FTkFfVEVSTSwgaW5mby0+YmFzZSArIENVTUFOQVNDU0kyX0FMQVRDSCk7CisJfSBlbHNlIHsKKwkJaW5mby0+dGVybXMgPSAwOworCQl3cml0ZWIoQUxBVENIX0RJU19URVJNLCBpbmZvLT5iYXNlICsgQ1VNQU5BU0NTSTJfQUxBVENIKTsKKwl9Cit9CisKKy8qIFByb3RvdHlwZTogdm9pZCBjdW1hbmFzY3NpXzJfaW50cihpcnEsICpkZXZfaWQsICpyZWdzKQorICogUHVycG9zZSAgOiBoYW5kbGUgaW50ZXJydXB0cyBmcm9tIEN1bWFuYSBTQ1NJIDIgY2FyZAorICogUGFyYW1zICAgOiBpcnEgICAgLSBpbnRlcnJ1cHQgbnVtYmVyCisgKgkgICAgICBkZXZfaWQgLSB1c2VyLWRlZmluZWQgKFNjc2lfSG9zdCBzdHJ1Y3R1cmUpCisgKgkgICAgICByZWdzICAgLSBwcm9jZXNzb3IgcmVnaXN0ZXJzIGF0IGludGVycnVwdAorICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK2N1bWFuYXNjc2lfMl9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGN1bWFuYXNjc2kyX2luZm8gKmluZm8gPSBkZXZfaWQ7CisKKwlyZXR1cm4gZmFzMjE2X2ludHIoJmluZm8tPmluZm8pOworfQorCisvKiBQcm90b3R5cGU6IGZhc2RtYXR5cGVfdCBjdW1hbmFzY3NpXzJfZG1hX3NldHVwKGhvc3QsIFNDcG50LCBkaXJlY3Rpb24sIG1pbl90eXBlKQorICogUHVycG9zZSAgOiBpbml0aWFsaXNlcyBETUEvUElPCisgKiBQYXJhbXMgICA6IGhvc3QgICAgICAtIGhvc3QKKyAqCSAgICAgIFNDcG50ICAgICAtIGNvbW1hbmQKKyAqCSAgICAgIGRpcmVjdGlvbiAtIERNQSBvbiB0by9vZmYgb2YgY2FyZAorICoJICAgICAgbWluX3R5cGUgIC0gbWluaW11bSBETUEgc3VwcG9ydCB0aGF0IHdlIG11c3QgaGF2ZSBmb3IgdGhpcyB0cmFuc2ZlcgorICogUmV0dXJucyAgOiB0eXBlIG9mIHRyYW5zZmVyIHRvIGJlIHBlcmZvcm1lZAorICovCitzdGF0aWMgZmFzZG1hdHlwZV90CitjdW1hbmFzY3NpXzJfZG1hX3NldHVwKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIFNjc2lfUG9pbnRlciAqU0NwLAorCQkgICAgICAgZmFzZG1hZGlyX3QgZGlyZWN0aW9uLCBmYXNkbWF0eXBlX3QgbWluX3R5cGUpCit7CisJc3RydWN0IGN1bWFuYXNjc2kyX2luZm8gKmluZm8gPSAoc3RydWN0IGN1bWFuYXNjc2kyX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBzY3NpX2dldF9kZXZpY2UoaG9zdCk7CisJaW50IGRtYWNoID0gaW5mby0+aW5mby5zY3NpLmRtYTsKKworCXdyaXRlYihBTEFUQ0hfRElTX0RNQSwgaW5mby0+YmFzZSArIENVTUFOQVNDU0kyX0FMQVRDSCk7CisKKwlpZiAoZG1hY2ggIT0gTk9fRE1BICYmCisJICAgIChtaW5fdHlwZSA9PSBmYXNkbWFfcmVhbF9hbGwgfHwgU0NwLT50aGlzX3Jlc2lkdWFsID49IDUxMikpIHsKKwkJaW50IGJ1ZnMsIG1hcF9kaXIsIGRtYV9kaXIsIGFsYXRjaF9kaXI7CisKKwkJYnVmcyA9IGNvcHlfU0NwX3RvX3NnKCZpbmZvLT5zZ1swXSwgU0NwLCBOUl9TRyk7CisKKwkJaWYgKGRpcmVjdGlvbiA9PSBETUFfT1VUKQorCQkJbWFwX2RpciA9IERNQV9UT19ERVZJQ0UsCisJCQlkbWFfZGlyID0gRE1BX01PREVfV1JJVEUsCisJCQlhbGF0Y2hfZGlyID0gQUxBVENIX0RNQV9PVVQ7CisJCWVsc2UKKwkJCW1hcF9kaXIgPSBETUFfRlJPTV9ERVZJQ0UsCisJCQlkbWFfZGlyID0gRE1BX01PREVfUkVBRCwKKwkJCWFsYXRjaF9kaXIgPSBBTEFUQ0hfRE1BX0lOOworCisJCWRtYV9tYXBfc2coZGV2LCBpbmZvLT5zZywgYnVmcyArIDEsIG1hcF9kaXIpOworCisJCWRpc2FibGVfZG1hKGRtYWNoKTsKKwkJc2V0X2RtYV9zZyhkbWFjaCwgaW5mby0+c2csIGJ1ZnMgKyAxKTsKKwkJd3JpdGViKGFsYXRjaF9kaXIsIGluZm8tPmJhc2UgKyBDVU1BTkFTQ1NJMl9BTEFUQ0gpOworCQlzZXRfZG1hX21vZGUoZG1hY2gsIGRtYV9kaXIpOworCQllbmFibGVfZG1hKGRtYWNoKTsKKwkJd3JpdGViKEFMQVRDSF9FTkFfRE1BLCBpbmZvLT5iYXNlICsgQ1VNQU5BU0NTSTJfQUxBVENIKTsKKwkJd3JpdGViKEFMQVRDSF9ESVNfQklUMzIsIGluZm8tPmJhc2UgKyBDVU1BTkFTQ1NJMl9BTEFUQ0gpOworCQlyZXR1cm4gZmFzZG1hX3JlYWxfYWxsOworCX0KKworCS8qCisJICogSWYgd2UncmUgbm90IGRvaW5nIERNQSwKKwkgKiAgd2UnbGwgZG8gcHNldWRvIERNQQorCSAqLworCXJldHVybiBmYXNkbWFfcGlvOworfQorCisvKgorICogUHJvdG90eXBlOiB2b2lkIGN1bWFuYXNjc2lfMl9kbWFfcHNldWRvKGhvc3QsIFNDcG50LCBkaXJlY3Rpb24sIHRyYW5zZmVyKQorICogUHVycG9zZSAgOiBoYW5kbGVzIHBzZXVkbyBETUEKKyAqIFBhcmFtcyAgIDogaG9zdCAgICAgIC0gaG9zdAorICoJICAgICAgU0NwbnQgICAgIC0gY29tbWFuZAorICoJICAgICAgZGlyZWN0aW9uIC0gRE1BIG9uIHRvL29mZiBvZiBjYXJkCisgKgkgICAgICB0cmFuc2ZlciAgLSBtaW5pbXVtIG51bWJlciBvZiBieXRlcyB3ZSBleHBlY3QgdG8gdHJhbnNmZXIKKyAqLworc3RhdGljIHZvaWQKK2N1bWFuYXNjc2lfMl9kbWFfcHNldWRvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIFNjc2lfUG9pbnRlciAqU0NwLAorCQkJZmFzZG1hZGlyX3QgZGlyZWN0aW9uLCBpbnQgdHJhbnNmZXIpCit7CisJc3RydWN0IGN1bWFuYXNjc2kyX2luZm8gKmluZm8gPSAoc3RydWN0IGN1bWFuYXNjc2kyX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgKmFkZHI7CisKKwlsZW5ndGggPSBTQ3AtPnRoaXNfcmVzaWR1YWw7CisJYWRkciA9IFNDcC0+cHRyOworCisJaWYgKGRpcmVjdGlvbiA9PSBETUFfT1VUKQorI2lmIDAKKwkJd2hpbGUgKGxlbmd0aCA+IDEpIHsKKwkJCXVuc2lnbmVkIGxvbmcgd29yZDsKKwkJCXVuc2lnbmVkIGludCBzdGF0dXMgPSByZWFkYihpbmZvLT5iYXNlICsgQ1VNQU5BU0NTSTJfU1RBVFVTKTsKKworCQkJaWYgKHN0YXR1cyAmIFNUQVRVU19JTlQpCisJCQkJZ290byBlbmQ7CisKKwkJCWlmICghKHN0YXR1cyAmIFNUQVRVU19EUlEpKQorCQkJCWNvbnRpbnVlOworCisJCQl3b3JkID0gKmFkZHIgfCAqKGFkZHIgKyAxKSA8PCA4OworCQkJd3JpdGV3KHdvcmQsIGluZm8tPmJhc2UgKyBDVU1BTkFTQ1NJMl9QU0VVRE9ETUEpOworCQkJYWRkciArPSAyOworCQkJbGVuZ3RoIC09IDI7CisJCX0KKyNlbHNlCisJCXByaW50ayAoIlBTRVVET19PVVQ/Pz9cbiIpOworI2VuZGlmCisJZWxzZSB7CisJCWlmICh0cmFuc2ZlciAmJiAodHJhbnNmZXIgJiAyNTUpKSB7CisJCQl3aGlsZSAobGVuZ3RoID49IDI1NikgeworCQkJCXVuc2lnbmVkIGludCBzdGF0dXMgPSByZWFkYihpbmZvLT5iYXNlICsgQ1VNQU5BU0NTSTJfU1RBVFVTKTsKKworCQkJCWlmIChzdGF0dXMgJiBTVEFUVVNfSU5UKQorCQkJCQlyZXR1cm47CisJICAgIAorCQkJCWlmICghKHN0YXR1cyAmIFNUQVRVU19EUlEpKQorCQkJCQljb250aW51ZTsKKworCQkJCXJlYWRzdyhpbmZvLT5iYXNlICsgQ1VNQU5BU0NTSTJfUFNFVURPRE1BLAorCQkJCSAgICAgICBhZGRyLCAyNTYgPj4gMSk7CisJCQkJYWRkciArPSAyNTY7CisJCQkJbGVuZ3RoIC09IDI1NjsKKwkJCX0KKwkJfQorCisJCXdoaWxlIChsZW5ndGggPiAwKSB7CisJCQl1bnNpZ25lZCBsb25nIHdvcmQ7CisJCQl1bnNpZ25lZCBpbnQgc3RhdHVzID0gcmVhZGIoaW5mby0+YmFzZSArIENVTUFOQVNDU0kyX1NUQVRVUyk7CisKKwkJCWlmIChzdGF0dXMgJiBTVEFUVVNfSU5UKQorCQkJCXJldHVybjsKKworCQkJaWYgKCEoc3RhdHVzICYgU1RBVFVTX0RSUSkpCisJCQkJY29udGludWU7CisKKwkJCXdvcmQgPSByZWFkdyhpbmZvLT5iYXNlICsgQ1VNQU5BU0NTSTJfUFNFVURPRE1BKTsKKwkJCSphZGRyKysgPSB3b3JkOworCQkJaWYgKC0tbGVuZ3RoID4gMCkgeworCQkJCSphZGRyKysgPSB3b3JkID4+IDg7CisJCQkJbGVuZ3RoIC0tOworCQkJfQorCQl9CisJfQorfQorCisvKiBQcm90b3R5cGU6IGludCBjdW1hbmFzY3NpXzJfZG1hX3N0b3AoaG9zdCwgU0NwbnQpCisgKiBQdXJwb3NlICA6IHN0b3BzIERNQS9QSU8KKyAqIFBhcmFtcyAgIDogaG9zdCAgLSBob3N0CisgKgkgICAgICBTQ3BudCAtIGNvbW1hbmQKKyAqLworc3RhdGljIHZvaWQKK2N1bWFuYXNjc2lfMl9kbWFfc3RvcChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBTY3NpX1BvaW50ZXIgKlNDcCkKK3sKKwlzdHJ1Y3QgY3VtYW5hc2NzaTJfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgY3VtYW5hc2NzaTJfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCWlmIChpbmZvLT5pbmZvLnNjc2kuZG1hICE9IE5PX0RNQSkgeworCQl3cml0ZWIoQUxBVENIX0RJU19ETUEsIGluZm8tPmJhc2UgKyBDVU1BTkFTQ1NJMl9BTEFUQ0gpOworCQlkaXNhYmxlX2RtYShpbmZvLT5pbmZvLnNjc2kuZG1hKTsKKwl9Cit9CisKKy8qIFByb3RvdHlwZTogY29uc3QgY2hhciAqY3VtYW5hc2NzaV8yX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqIGhvc3QpCisgKiBQdXJwb3NlICA6IHJldHVybnMgYSBkZXNjcmlwdGl2ZSBzdHJpbmcgYWJvdXQgdGhpcyBpbnRlcmZhY2UsCisgKiBQYXJhbXMgICA6IGhvc3QgLSBkcml2ZXIgaG9zdCBzdHJ1Y3R1cmUgdG8gcmV0dXJuIGluZm8gZm9yLgorICogUmV0dXJucyAgOiBwb2ludGVyIHRvIGEgc3RhdGljIGJ1ZmZlciBjb250YWluaW5nIG51bGwgdGVybWluYXRlZCBzdHJpbmcuCisgKi8KK2NvbnN0IGNoYXIgKmN1bWFuYXNjc2lfMl9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RydWN0IGN1bWFuYXNjc2kyX2luZm8gKmluZm8gPSAoc3RydWN0IGN1bWFuYXNjc2kyX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKwlzdGF0aWMgY2hhciBzdHJpbmdbMTUwXTsKKworCXNwcmludGYoc3RyaW5nLCAiJXMgKCVzKSBpbiBzbG90ICVkIHYlcyB0ZXJtaW5hdG9ycyBvJXMiLAorCQlob3N0LT5ob3N0dC0+bmFtZSwgaW5mby0+aW5mby5zY3NpLnR5cGUsIGluZm8tPmVjLT5zbG90X25vLAorCQlWRVJTSU9OLCBpbmZvLT50ZXJtcyA/ICJuIiA6ICJmZiIpOworCisJcmV0dXJuIHN0cmluZzsKK30KKworLyogUHJvdG90eXBlOiBpbnQgY3VtYW5hc2NzaV8yX3NldF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQorICogUHVycG9zZSAgOiBTZXQgYSBkcml2ZXIgc3BlY2lmaWMgZnVuY3Rpb24KKyAqIFBhcmFtcyAgIDogaG9zdCAgIC0gaG9zdCB0byBzZXR1cAorICogICAgICAgICAgOiBidWZmZXIgLSBidWZmZXIgY29udGFpbmluZyBzdHJpbmcgZGVzY3JpYmluZyBvcGVyYXRpb24KKyAqICAgICAgICAgIDogbGVuZ3RoIC0gbGVuZ3RoIG9mIHN0cmluZworICogUmV0dXJucyAgOiAtRUlOVkFMLCBvciAwCisgKi8KK3N0YXRpYyBpbnQKK2N1bWFuYXNjc2lfMl9zZXRfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkKK3sKKwlpbnQgcmV0ID0gbGVuZ3RoOworCisJaWYgKGxlbmd0aCA+PSAxMSAmJiBzdHJjbXAoYnVmZmVyLCAiQ1VNQU5BU0NTSTIiKSA9PSAwKSB7CisJCWJ1ZmZlciArPSAxMTsKKwkJbGVuZ3RoIC09IDExOworCisJCWlmIChsZW5ndGggPj0gNSAmJiBzdHJuY21wKGJ1ZmZlciwgInRlcm09IiwgNSkgPT0gMCkgeworCQkJaWYgKGJ1ZmZlcls1XSA9PSAnMScpCisJCQkJY3VtYW5hc2NzaV8yX3Rlcm1pbmF0b3JfY3RsKGhvc3QsIDEpOworCQkJZWxzZSBpZiAoYnVmZmVyWzVdID09ICcwJykKKwkJCQljdW1hbmFzY3NpXzJfdGVybWluYXRvcl9jdGwoaG9zdCwgMCk7CisJCQllbHNlCisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJfSBlbHNlCisJCQlyZXQgPSAtRUlOVkFMOworCX0gZWxzZQorCQlyZXQgPSAtRUlOVkFMOworCisJcmV0dXJuIHJldDsKK30KKworLyogUHJvdG90eXBlOiBpbnQgY3VtYW5hc2NzaV8yX3Byb2NfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorICoJCQkJCSBpbnQgbGVuZ3RoLCBpbnQgaG9zdF9ubywgaW50IGlub3V0KQorICogUHVycG9zZSAgOiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRyaXZlciB0byBhIHVzZXIgcHJvY2VzcyBhY2Nlc3NpbmcKKyAqCSAgICAgIHRoZSAvcHJvYyBmaWxlc3lzdGVtLgorICogUGFyYW1zICAgOiBidWZmZXIgLSBhIGJ1ZmZlciB0byB3cml0ZSBpbmZvcm1hdGlvbiB0bworICoJICAgICAgc3RhcnQgIC0gYSBwb2ludGVyIGludG8gdGhpcyBidWZmZXIgc2V0IGJ5IHRoaXMgcm91dGluZSB0byB0aGUgc3RhcnQKKyAqCQkgICAgICAgb2YgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uLgorICoJICAgICAgb2Zmc2V0IC0gb2Zmc2V0IGludG8gaW5mb3JtYXRpb24gdGhhdCB3ZSBoYXZlIHJlYWQgdXB0by4KKyAqCSAgICAgIGxlbmd0aCAtIGxlbmd0aCBvZiBidWZmZXIKKyAqCSAgICAgIGhvc3Rfbm8gLSBob3N0IG51bWJlciB0byByZXR1cm4gaW5mb3JtYXRpb24gZm9yCisgKgkgICAgICBpbm91dCAgLSAwIGZvciByZWFkaW5nLCAxIGZvciB3cml0aW5nLgorICogUmV0dXJucyAgOiBsZW5ndGggb2YgZGF0YSB3cml0dGVuIHRvIGJ1ZmZlci4KKyAqLworaW50IGN1bWFuYXNjc2lfMl9wcm9jX2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkgICAgaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworCXN0cnVjdCBjdW1hbmFzY3NpMl9pbmZvICppbmZvOworCWNoYXIgKnAgPSBidWZmZXI7CisJaW50IHBvczsKKworCWlmIChpbm91dCA9PSAxKQorCQlyZXR1cm4gY3VtYW5hc2NzaV8yX3NldF9wcm9jX2luZm8oaG9zdCwgYnVmZmVyLCBsZW5ndGgpOworCisJaW5mbyA9IChzdHJ1Y3QgY3VtYW5hc2NzaTJfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCisJcCArPSBzcHJpbnRmKHAsICJDdW1hbmEgU0NTSSBJSSBkcml2ZXIgdiVzXG4iLCBWRVJTSU9OKTsKKwlwICs9IGZhczIxNl9wcmludF9ob3N0KCZpbmZvLT5pbmZvLCBwKTsKKwlwICs9IHNwcmludGYocCwgIlRlcm0gICAgOiBvJXNcbiIsCisJCQlpbmZvLT50ZXJtcyA/ICJuIiA6ICJmZiIpOworCisJcCArPSBmYXMyMTZfcHJpbnRfc3RhdHMoJmluZm8tPmluZm8sIHApOworCXAgKz0gZmFzMjE2X3ByaW50X2RldmljZXMoJmluZm8tPmluZm8sIHApOworCisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCXBvcyA9IHAgLSBidWZmZXIgLSBvZmZzZXQ7CisJaWYgKHBvcyA+IGxlbmd0aCkKKwkJcG9zID0gbGVuZ3RoOworCisJcmV0dXJuIHBvczsKK30KKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBjdW1hbmFzY3NpMl90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJCT0gVEhJU19NT0RVTEUsCisJLnByb2NfaW5mbwkJCT0gY3VtYW5hc2NzaV8yX3Byb2NfaW5mbywKKwkubmFtZQkJCQk9ICJDdW1hbmEgU0NTSSBJSSIsCisJLmluZm8JCQkJPSBjdW1hbmFzY3NpXzJfaW5mbywKKwkucXVldWVjb21tYW5kCQkJPSBmYXMyMTZfcXVldWVfY29tbWFuZCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCQk9IGZhczIxNl9laF9ob3N0X3Jlc2V0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgkJPSBmYXMyMTZfZWhfYnVzX3Jlc2V0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcgk9IGZhczIxNl9laF9kZXZpY2VfcmVzZXQsCisJLmVoX2Fib3J0X2hhbmRsZXIJCT0gZmFzMjE2X2VoX2Fib3J0LAorCS5jYW5fcXVldWUJCQk9IDEsCisJLnRoaXNfaWQJCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCQk9IERJU0FCTEVfQ0xVU1RFUklORywKKwkucHJvY19uYW1lCQkJPSAiY3VtYW5hc2NzaTIiLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQKK2N1bWFuYXNjc2kyX3Byb2JlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCAqaWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3QgY3VtYW5hc2NzaTJfaW5mbyAqaW5mbzsKKwl1bnNpZ25lZCBsb25nIHJlc2Jhc2UsIHJlc2xlbjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJaW50IHJldDsKKworCXJldCA9IGVjYXJkX3JlcXVlc3RfcmVzb3VyY2VzKGVjKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJlc2Jhc2UgPSBlY2FyZF9yZXNvdXJjZV9zdGFydChlYywgRUNBUkRfUkVTX01FTUMpOworCXJlc2xlbiA9IGVjYXJkX3Jlc291cmNlX2xlbihlYywgRUNBUkRfUkVTX01FTUMpOworCWJhc2UgPSBpb3JlbWFwKHJlc2Jhc2UsIHJlc2xlbik7CisJaWYgKCFiYXNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3JlZ2lvbjsKKwl9CisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZjdW1hbmFzY3NpMl90ZW1wbGF0ZSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGN1bWFuYXNjc2kyX2luZm8pKTsKKwlpZiAoIWhvc3QpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5tYXA7CisJfQorCisJZWNhcmRfc2V0X2RydmRhdGEoZWMsIGhvc3QpOworCisJaW5mbyA9IChzdHJ1Y3QgY3VtYW5hc2NzaTJfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCWluZm8tPmVjCT0gZWM7CisJaW5mby0+YmFzZQk9IGJhc2U7CisKKwljdW1hbmFzY3NpXzJfdGVybWluYXRvcl9jdGwoaG9zdCwgdGVybVtlYy0+c2xvdF9ub10pOworCisJaW5mby0+aW5mby5zY3NpLmlvX2Jhc2UJCT0gYmFzZSArIENVTUFOQVNDU0kyX0ZBUzIxNl9PRkZTRVQ7CisJaW5mby0+aW5mby5zY3NpLmlvX3NoaWZ0CT0gQ1VNQU5BU0NTSTJfRkFTMjE2X1NISUZUOworCWluZm8tPmluZm8uc2NzaS5pcnEJCT0gZWMtPmlycTsKKwlpbmZvLT5pbmZvLnNjc2kuZG1hCQk9IGVjLT5kbWE7CisJaW5mby0+aW5mby5pZmNmZy5jbG9ja3JhdGUJPSA0MDsgLyogTUh6ICovCisJaW5mby0+aW5mby5pZmNmZy5zZWxlY3RfdGltZW91dAk9IDI1NTsKKwlpbmZvLT5pbmZvLmlmY2ZnLmFzeW5jcGVyaW9kCT0gMjAwOyAvKiBucyAqLworCWluZm8tPmluZm8uaWZjZmcuc3luY19tYXhfZGVwdGgJPSA3OworCWluZm8tPmluZm8uaWZjZmcuY250bDMJCT0gQ05UTDNfQlM4IHwgQ05UTDNfRkFTVFNDU0kgfCBDTlRMM19GQVNUQ0xLOworCWluZm8tPmluZm8uaWZjZmcuZGlzY29ubmVjdF9vawk9IDE7CisJaW5mby0+aW5mby5pZmNmZy53aWRlX21heF9zaXplCT0gMDsKKwlpbmZvLT5pbmZvLmlmY2ZnLmNhcGFiaWxpdGllcwk9IEZBU0NBUF9QU0VVRE9ETUE7CisJaW5mby0+aW5mby5kbWEuc2V0dXAJCT0gY3VtYW5hc2NzaV8yX2RtYV9zZXR1cDsKKwlpbmZvLT5pbmZvLmRtYS5wc2V1ZG8JCT0gY3VtYW5hc2NzaV8yX2RtYV9wc2V1ZG87CisJaW5mby0+aW5mby5kbWEuc3RvcAkJPSBjdW1hbmFzY3NpXzJfZG1hX3N0b3A7CisKKwllYy0+aXJxYWRkcgk9IGluZm8tPmJhc2UgKyBDVU1BTkFTQ1NJMl9TVEFUVVM7CisJZWMtPmlycW1hc2sJPSBTVEFUVVNfSU5UOworCWVjLT5pcnFfZGF0YQk9IGluZm87CisJZWMtPm9wcwkJPSAmY3VtYW5hc2NzaV8yX29wczsKKworCXJldCA9IGZhczIxNl9pbml0KGhvc3QpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlyZXQgPSByZXF1ZXN0X2lycShlYy0+aXJxLCBjdW1hbmFzY3NpXzJfaW50ciwKKwkJCSAgU0FfSU5URVJSVVBULCAiY3VtYW5hc2NzaTIiLCBpbmZvKTsKKwlpZiAocmV0KSB7CisJCXByaW50aygic2NzaSVkOiBJUlElZCBub3QgZnJlZTogJWRcbiIsCisJCSAgICAgICBob3N0LT5ob3N0X25vLCBlYy0+aXJxLCByZXQpOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKworCWlmIChpbmZvLT5pbmZvLnNjc2kuZG1hICE9IE5PX0RNQSkgeworCQlpZiAocmVxdWVzdF9kbWEoaW5mby0+aW5mby5zY3NpLmRtYSwgImN1bWFuYXNjc2kyIikpIHsKKwkJCXByaW50aygic2NzaSVkOiBETUElZCBub3QgZnJlZSwgdXNpbmcgUElPXG4iLAorCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIGluZm8tPmluZm8uc2NzaS5kbWEpOworCQkJaW5mby0+aW5mby5zY3NpLmRtYSA9IE5PX0RNQTsKKwkJfSBlbHNlIHsKKwkJCXNldF9kbWFfc3BlZWQoaW5mby0+aW5mby5zY3NpLmRtYSwgMTgwKTsKKwkJCWluZm8tPmluZm8uaWZjZmcuY2FwYWJpbGl0aWVzIHw9IEZBU0NBUF9ETUE7CisJCX0KKwl9CisKKwlyZXQgPSBmYXMyMTZfYWRkKGhvc3QsICZlYy0+ZGV2KTsKKwlpZiAocmV0ID09IDApCisJCWdvdG8gb3V0OworCisJaWYgKGluZm8tPmluZm8uc2NzaS5kbWEgIT0gTk9fRE1BKQorCQlmcmVlX2RtYShpbmZvLT5pbmZvLnNjc2kuZG1hKTsKKwlmcmVlX2lycShlYy0+aXJxLCBob3N0KTsKKworIG91dF9yZWxlYXNlOgorCWZhczIxNl9yZWxlYXNlKGhvc3QpOworCisgb3V0X2ZyZWU6CisJc2NzaV9ob3N0X3B1dChob3N0KTsKKworIG91dF91bm1hcDoKKwlpb3VubWFwKGJhc2UpOworCisgb3V0X3JlZ2lvbjoKKwllY2FyZF9yZWxlYXNlX3Jlc291cmNlcyhlYyk7CisKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGN1bWFuYXNjc2kyX3JlbW92ZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CisJc3RydWN0IGN1bWFuYXNjc2kyX2luZm8gKmluZm8gPSAoc3RydWN0IGN1bWFuYXNjc2kyX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKworCWVjYXJkX3NldF9kcnZkYXRhKGVjLCBOVUxMKTsKKwlmYXMyMTZfcmVtb3ZlKGhvc3QpOworCisJaWYgKGluZm8tPmluZm8uc2NzaS5kbWEgIT0gTk9fRE1BKQorCQlmcmVlX2RtYShpbmZvLT5pbmZvLnNjc2kuZG1hKTsKKwlmcmVlX2lycShlYy0+aXJxLCBpbmZvKTsKKworCWlvdW5tYXAoaW5mby0+YmFzZSk7CisKKwlmYXMyMTZfcmVsZWFzZShob3N0KTsKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworCWVjYXJkX3JlbGVhc2VfcmVzb3VyY2VzKGVjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCBjdW1hbmFzY3NpMl9jaWRzW10gPSB7CisJeyBNQU5VX0NVTUFOQSwgUFJPRF9DVU1BTkFfU0NTSV8yIH0sCisJeyAweGZmZmYsIDB4ZmZmZiB9LAorfTsKKworc3RhdGljIHN0cnVjdCBlY2FyZF9kcml2ZXIgY3VtYW5hc2NzaTJfZHJpdmVyID0geworCS5wcm9iZQkJPSBjdW1hbmFzY3NpMl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGN1bWFuYXNjc2kyX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gY3VtYW5hc2NzaTJfY2lkcywKKwkuZHJ2ID0geworCQkubmFtZQkJPSAiY3VtYW5hc2NzaTIiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjdW1hbmFzY3NpMl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGVjYXJkX3JlZ2lzdGVyX2RyaXZlcigmY3VtYW5hc2NzaTJfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGN1bWFuYXNjc2kyX2V4aXQodm9pZCkKK3sKKwllY2FyZF9yZW1vdmVfZHJpdmVyKCZjdW1hbmFzY3NpMl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChjdW1hbmFzY3NpMl9pbml0KTsKK21vZHVsZV9leGl0KGN1bWFuYXNjc2kyX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSdXNzZWxsIEtpbmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ3VtYW5hIFNDU0ktMiBkcml2ZXIgZm9yIEFjb3JuIG1hY2hpbmVzIik7CitNT0RVTEVfUEFSTSh0ZXJtLCAiMS04aSIpOworTU9EVUxFX1BBUk1fREVTQyh0ZXJtLCAiU0NTSSBidXMgdGVybWluYXRpb24iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcm0vZWNvc2NzaS5jIGIvZHJpdmVycy9zY3NpL2FybS9lY29zY3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzNjQ4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vZWNvc2NzaS5jCkBAIC0wLDAgKzEsMjM5IEBACisjZGVmaW5lIEFVVE9TRU5TRQorLyogI2RlZmluZSBQU0VVRE9fRE1BICovCisKKy8qCisgKiBFY29TQ1NJIEdlbmVyaWMgTkNSNTM4MCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMTk5NSwgUnVzc2VsbCBLaW5nCisgKgorICogQUxQSEEgUkVMRUFTRSAxLgorICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgY29uc3VsdAorICoKKyAqIE5DUiA1MzgwIEZhbWlseQorICogU0NTSSBQcm90b2NvbCBDb250cm9sbGVyCisgKiBEYXRhYm9vaworICoKKyAqIE5DUiBNaWNyb2VsZWN0cm9uaWNzCisgKiAxNjM1IEFlcm9wbGF6YSBEcml2ZQorICogQ29sb3JhZG8gU3ByaW5ncywgQ08gODA5MTYKKyAqIDErICg3MTkpIDU3OC0zNDAwCisgKiAxKyAoODAwKSAzMzQtNTQ1NAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSAiLi4vc2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNkZWZpbmUgTkNSNTM4MF9pbXBsZW1lbnRhdGlvbl9maWVsZHMJaW50IHBvcnQsIGN0cmwKKyNkZWZpbmUgTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCkJCXN0cnVjdCBTY3NpX0hvc3QgKl9pbnN0YW5jZQorI2RlZmluZSBOQ1I1MzgwX3NldHVwKGluc3RhbmNlKQkJX2luc3RhbmNlID0gaW5zdGFuY2UKKworI2RlZmluZSBOQ1I1MzgwX3JlYWQocmVnKQkJZWNvc2NzaV9yZWFkKF9pbnN0YW5jZSwgcmVnKQorI2RlZmluZSBOQ1I1MzgwX3dyaXRlKHJlZywgdmFsdWUpCWVjb3Njc2lfd3JpdGUoX2luc3RhbmNlLCByZWcsIHZhbHVlKQorCisjZGVmaW5lIE5DUjUzODBfaW50cgkJCWVjb3Njc2lfaW50cgorI2RlZmluZSBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQJCWVjb3Njc2lfcXVldWVfY29tbWFuZAorI2RlZmluZSBOQ1I1MzgwX3Byb2NfaW5mbwkJZWNvc2NzaV9wcm9jX2luZm8KKworI2luY2x1ZGUgIi4uL05DUjUzODAuaCIKKworI2RlZmluZSBFQ09TQ1NJX1BVQkxJQ19SRUxFQVNFIDEKKworc3RhdGljIGNoYXIgZWNvc2NzaV9yZWFkKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBpbnQgcmVnKQoreworICBpbnQgaW9iYXNlID0gaW5zdGFuY2UtPmlvX3BvcnQ7CisgIG91dGIocmVnIHwgOCwgaW9iYXNlKTsKKyAgcmV0dXJuIGluYihpb2Jhc2UgKyAxKTsKK30KKworc3RhdGljIHZvaWQgZWNvc2NzaV93cml0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgaW50IHJlZywgaW50IHZhbHVlKQoreworICBpbnQgaW9iYXNlID0gaW5zdGFuY2UtPmlvX3BvcnQ7CisgIG91dGIocmVnIHwgOCwgaW9iYXNlKTsKKyAgb3V0Yih2YWx1ZSwgaW9iYXNlICsgMSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IGVjb3Njc2lfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCisgKgorICogUHVycG9zZSA6IExJTE8gY29tbWFuZCBsaW5lIGluaXRpYWxpemF0aW9uIG9mIHRoZSBvdmVycmlkZXMgYXJyYXksCisgKgorICogSW5wdXRzIDogc3RyIC0gdW51c2VkLCBpbnRzIC0gYXJyYXkgb2YgaW50ZWdlciBwYXJhbWV0ZXJzIHdpdGggaW50c1swXQorICoJZXF1YWwgdG8gdGhlIG51bWJlciBvZiBpbnRzLgorICoKKyAqLworCit2b2lkIGVjb3Njc2lfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCit7Cit9CisKK2NvbnN0IGNoYXIgKiBlY29zY3NpX2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKnNwbnQpCit7CisJcmV0dXJuICIiOworfQorCisjaWYgMAorI2RlZmluZSBTVEFUKHApIGludyhwICsgMTQ0KQorCitzdGF0aWMgaW5saW5lIGludCBOQ1I1MzgwX3B3cml0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCB1bnNpZ25lZCBjaGFyICphZGRyLAorICAgICAgICAgICAgICBpbnQgbGVuKQoreworICBpbnQgaW9iYXNlID0gaG9zdC0+aW9fcG9ydDsKK3ByaW50aygid3JpdGluZyAlcCBsZW4gJWRcbiIsYWRkciwgbGVuKTsKKyAgaWYoIWxlbikgcmV0dXJuIC0xOworCisgIHdoaWxlKDEpCisgIHsKKyAgICBpbnQgc3RhdHVzOworICAgIHdoaWxlKCgoc3RhdHVzID0gU1RBVChpb2Jhc2UpKSAmIDB4MTAwKT09MCk7CisgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgTkNSNTM4MF9wcmVhZChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCB1bnNpZ25lZCBjaGFyICphZGRyLAorICAgICAgICAgICAgICBpbnQgbGVuKQoreworICBpbnQgaW9iYXNlID0gaG9zdC0+aW9fcG9ydDsKKyAgaW50IGlvYmFzZTI9IGhvc3QtPmlvX3BvcnQgKyAweDEwMDsKKyAgdW5zaWduZWQgY2hhciAqc3RhcnQgPSBhZGRyOworICBpbnQgczsKK3ByaW50aygicmVhZGluZyAlcCBsZW4gJWRcbiIsYWRkciwgbGVuKTsKKyAgb3V0YihpbmIoaW9iYXNlICsgMTI4KSwgaW9iYXNlICsgMTM1KTsKKyAgd2hpbGUobGVuID4gMCkKKyAgeworICAgIGludCBzdGF0dXMsYixpLCB0aW1lb3V0OworICAgIHRpbWVvdXQgPSAweDA3RkZGRkZGOworICAgIHdoaWxlKCgoc3RhdHVzID0gU1RBVChpb2Jhc2UpKSAmIDB4MTAwKT09MCkKKyAgICB7CisgICAgICB0aW1lb3V0LS07CisgICAgICBpZihzdGF0dXMgJiAweDIwMCB8fCAhdGltZW91dCkKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKCJzdGF0dXMgPSAlcFxuIixzdGF0dXMpOworICAgICAgICBvdXRiKDAsIGlvYmFzZSArIDEzNSk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgICBpZihsZW4gPj0gMTI4KQorICAgIHsKKyAgICAgIGZvcihpPTA7IGk8NjQ7IGkrKykKKyAgICAgIHsKKyAgICAgICAgYiA9IGludyhpb2Jhc2UgKyAxMzYpOworICAgICAgICAqYWRkcisrID0gYjsKKyAgICAgICAgKmFkZHIrKyA9IGI+Pjg7CisgICAgICB9CisgICAgICBsZW4gLT0gMTI4OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYiA9IGludyhpb2Jhc2UgKyAxMzYpOworICAgICAgKmFkZHIgKysgPSBiOworICAgICAgbGVuIC09IDE7CisgICAgICBpZihsZW4pCisgICAgICAgICphZGRyICsrID0gYj4+ODsKKyAgICAgIGxlbiAtPSAxOworICAgIH0KKyAgfQorICBvdXRiKDAsIGlvYmFzZSArIDEzNSk7CisgIHByaW50aygiZmlyc3QgYnl0ZXMgPSAlMDJYICUwMlggJTAyWCAlMjBYICUwMlggJTAyWCAlMDJYXG4iLCpzdGFydCwgc3RhcnRbMV0sIHN0YXJ0WzJdLCBzdGFydFszXSwgc3RhcnRbNF0sIHN0YXJ0WzVdLCBzdGFydFs2XSk7CisgIHJldHVybiAxOworfQorI2VuZGlmCisjdW5kZWYgU1RBVAorCisjZGVmaW5lIEJPQVJEX05PUk1BTAkwCisjZGVmaW5lIEJPQVJEX05DUjUzQzQwMAkxCisKKyNpbmNsdWRlICIuLi9OQ1I1MzgwLmMiCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZWNvc2NzaV90ZW1wbGF0ZSA9ICB7CisJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiU2VyaWFsIFBvcnQgRWNvU0NTSSBOQ1I1MzgwIiwKKwkucHJvY19uYW1lCT0gImVjb3Njc2kiLAorCS5pbmZvCQk9IGVjb3Njc2lfaW5mbywKKwkucXVldWVjb21tYW5kCT0gZWNvc2NzaV9xdWV1ZV9jb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gTkNSNTM4MF9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXI9IE5DUjUzODBfZGV2aWNlX3Jlc2V0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IE5DUjUzODBfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSBOQ1I1MzgwX2hvc3RfcmVzZXQsCisJLmNhbl9xdWV1ZQk9IDE2LAorCS50aGlzX2lkCT0gNywKKwkuc2dfdGFibGVzaXplCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgk9IDIsCisJLnVzZV9jbHVzdGVyaW5nCT0gRElTQUJMRV9DTFVTVEVSSU5HCit9OworCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKworc3RhdGljIGludCBfX2luaXQgZWNvc2NzaV9pbml0KHZvaWQpCit7CisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKHRwbnQsIHNpemVvZihzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSkpOworCWlmICghaG9zdCkKKwkJcmV0dXJuIDA7CisKKwlob3N0LT5pb19wb3J0ID0gMHg4MGNlODAwMDsKKwlob3N0LT5uX2lvX3BvcnQgPSAxNDQ7CisJaG9zdC0+aXJxID0gSVJRX05PTkU7CisKKwlpZiAoIShyZXF1ZXN0X3JlZ2lvbihob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQsICJlY29zY3NpIikpICkKKwkJZ290byB1bnJlZ2lzdGVyX3Njc2k7CisKKwllY29zY3NpX3dyaXRlKGhvc3QsIE1PREVfUkVHLCAweDIwKTsJCS8qIElzIGl0IHJlYWxseSBTQ1NJPyAqLworCWlmIChlY29zY3NpX3JlYWQoaG9zdCwgTU9ERV9SRUcpICE9IDB4MjApIC8qIFdyaXRlIHRvIGEgcmVnLiAgICAqLworCQlnb3RvIHJlbGVhc2VfcmVnOworCisJZWNvc2NzaV93cml0ZShob3N0LCBNT0RFX1JFRywgMHgwMCApOwkJLyogaXQgYmFjay4JICAgICAgKi8KKwlpZiAoZWNvc2NzaV9yZWFkKGhvc3QsIE1PREVfUkVHKSAhPSAweDAwKQorCQlnb3RvIHJlbGVhc2VfcmVnOworCisJTkNSNTM4MF9pbml0KGhvc3QsIDApOworCisJcHJpbnRrKCJzY3NpJWQ6IGF0IHBvcnQgMHglMDhseCBpcnFzIGRpc2FibGVkIiwgaG9zdC0+aG9zdF9ubywgaG9zdC0+aW9fcG9ydCk7CisJcHJpbnRrKCIgb3B0aW9ucyBDQU5fUVVFVUU9JWQgQ01EX1BFUl9MVU49JWQgcmVsZWFzZT0lZCIsCisJCWhvc3QtPmNhbl9xdWV1ZSwgaG9zdC0+Y21kX3Blcl9sdW4sIEVDT1NDU0lfUFVCTElDX1JFTEVBU0UpOworCXByaW50aygiXG5zY3NpJWQ6IiwgaG9zdC0+aG9zdF9ubyk7CisJTkNSNTM4MF9wcmludF9vcHRpb25zKGhvc3QpOworCXByaW50aygiXG4iKTsKKworCXNjc2lfYWRkX2hvc3QoaG9zdCwgTlVMTCk7IC8qIFhYWCBoYW5kbGUgZmFpbHVyZSAqLworCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCXJldHVybiAwOworCityZWxlYXNlX3JlZzoKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQpOwordW5yZWdpc3Rlcl9zY3NpOgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlY29zY3NpX2V4aXQodm9pZCkKK3sKKwlzY3NpX3JlbW92ZV9ob3N0KGhvc3QpOworCisJaWYgKHNocG50LT5pcnEgIT0gSVJRX05PTkUpCisJCWZyZWVfaXJxKHNocG50LT5pcnEsIE5VTEwpOworCU5DUjUzODBfZXhpdChob3N0KTsKKwlpZiAoc2hwbnQtPmlvX3BvcnQpCisJCXJlbGVhc2VfcmVnaW9uKHNocG50LT5pb19wb3J0LCBzaHBudC0+bl9pb19wb3J0KTsKKworCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KGVjb3Njc2lfaW5pdCk7Cittb2R1bGVfZXhpdChlY29zY3NpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSdXNzZWxsIEtpbmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiRWNvbmV0LVNDU0kgZHJpdmVyIGZvciBBY29ybiBtYWNoaW5lcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL2Vlc294LmMgYi9kcml2ZXJzL3Njc2kvYXJtL2Vlc294LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiN2U1NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vZWVzb3guYwpAQCAtMCwwICsxLDY4MCBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Fjb3JuL3Njc2kvZWVzb3guYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNSBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiBleHBlcmltZW50YXRpb24uICBIZW5jZSwgaXQgbWF5IGhhdmUgbWFkZQorICogIGFzc3VtcHRpb25zIGFib3V0IHRoZSBwYXJ0aWN1bGFyIGNhcmQgdGhhdCBJIGhhdmUgYXZhaWxhYmxlLCBhbmQKKyAqICBtYXkgbm90IGJlIHJlbGlhYmxlIQorICoKKyAqICBDaGFuZ2Vsb2c6CisgKiAgIDAxLTEwLTE5OTcJUk1LCQlDcmVhdGVkLCBSRUFET05MWSB2ZXJzaW9uCisgKiAgIDE1LTAyLTE5OTgJUk1LCQlSRUFEL1dSSVRFIHZlcnNpb24KKyAqCQkJCWFkZGVkIERNQSBzdXBwb3J0IGFuZCBoYXJkd2FyZSBkZWZpbml0aW9ucworICogICAxNC0wMy0xOTk4CVJNSwkJVXBkYXRlZCBETUEgc3VwcG9ydAorICoJCQkJQWRkZWQgdGVybWluYXRvciBjb250cm9sCisgKiAgIDE1LTA0LTE5OTgJUk1LCQlPbmx5IGRvIFBJTyBpZiBGQVMyMTYgd2lsbCBhbGxvdyBpdC4KKyAqICAgMjctMDYtMTk5OAlSTUsJCUNoYW5nZWQgYXNtL2RlbGF5LmggdG8gbGludXgvZGVsYXkuaAorICogICAwMi0wNC0yMDAwCVJNSwkwLjAuMwlGaXhlZCBOT19JUlEvTk9fRE1BIHByb2JsZW0sIHVwZGF0ZWQgZm9yIG5ldworICoJCQkJZXJyb3IgaGFuZGxpbmcgY29kZS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9lY2FyZC5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKKyNpbmNsdWRlICIuLi9zY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJmYXMyMTYuaCIKKyNpbmNsdWRlICJzY3NpLmgiCisKKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKworI2RlZmluZSBFRVNPWF9GQVMyMTZfT0ZGU0VUCTB4MzAwMAorI2RlZmluZSBFRVNPWF9GQVMyMTZfU0hJRlQJNQorCisjZGVmaW5lIEVFU09YX0RNQVNUQVQJCTB4MjgwMAorI2RlZmluZSBFRVNPWF9TVEFUX0lOVFIJCTB4MDEKKyNkZWZpbmUgRUVTT1hfU1RBVF9ETUEJCTB4MDIKKworI2RlZmluZSBFRVNPWF9DT05UUk9MCQkweDI4MDAKKyNkZWZpbmUgRUVTT1hfSU5UUl9FTkFCTEUJMHgwNAorI2RlZmluZSBFRVNPWF9URVJNX0VOQUJMRQkweDAyCisjZGVmaW5lIEVFU09YX1JFU0VUCQkweDAxCisKKyNkZWZpbmUgRUVTT1hfRE1BREFUQQkJMHgzODAwCisKKyNkZWZpbmUgVkVSU0lPTiAiMS4xMCAoMTcvMDEvMjAwMyAyLjUuNTkpIgorCisvKgorICogVXNlIHRlcm09MCwxLDAsMCwwIHRvIHR1cm4gdGVybWluYXRvcnMgb24vb2ZmCisgKi8KK3N0YXRpYyBpbnQgdGVybVtNQVhfRUNBUkRTXSA9IHsgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSB9OworCisjZGVmaW5lIE5SX1NHCTI1NgorCitzdHJ1Y3QgZWVzb3hzY3NpX2luZm8geworCUZBUzIxNl9JbmZvCQlpbmZvOworCXN0cnVjdCBleHBhbnNpb25fY2FyZAkqZWM7CisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwl2b2lkIF9faW9tZW0JCSpjdGxfcG9ydDsKKwl1bnNpZ25lZCBpbnQJCWNvbnRyb2w7CisJc3RydWN0IHNjYXR0ZXJsaXN0CXNnW05SX1NHXTsJLyogU2NhdHRlciBETUEgbGlzdAkqLworfTsKKworLyogUHJvdG90eXBlOiB2b2lkIGVlc294c2NzaV9pcnFlbmFibGUoZWMsIGlycW5yKQorICogUHVycG9zZSAgOiBFbmFibGUgaW50ZXJydXB0cyBvbiBFRVNPWCBTQ1NJIGNhcmQKKyAqIFBhcmFtcyAgIDogZWMgICAgLSBleHBhbnNpb24gY2FyZCBzdHJ1Y3R1cmUKKyAqICAgICAgICAgIDogaXJxbnIgLSBpbnRlcnJ1cHQgbnVtYmVyCisgKi8KK3N0YXRpYyB2b2lkCitlZXNveHNjc2lfaXJxZW5hYmxlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGludCBpcnFucikKK3sKKwlzdHJ1Y3QgZWVzb3hzY3NpX2luZm8gKmluZm8gPSAoc3RydWN0IGVlc294c2NzaV9pbmZvICopZWMtPmlycV9kYXRhOworCisJaW5mby0+Y29udHJvbCB8PSBFRVNPWF9JTlRSX0VOQUJMRTsKKworCXdyaXRlYihpbmZvLT5jb250cm9sLCBpbmZvLT5jdGxfcG9ydCk7Cit9CisKKy8qIFByb3RvdHlwZTogdm9pZCBlZXNveHNjc2lfaXJxZGlzYWJsZShlYywgaXJxbnIpCisgKiBQdXJwb3NlICA6IERpc2FibGUgaW50ZXJydXB0cyBvbiBFRVNPWCBTQ1NJIGNhcmQKKyAqIFBhcmFtcyAgIDogZWMgICAgLSBleHBhbnNpb24gY2FyZCBzdHJ1Y3R1cmUKKyAqICAgICAgICAgIDogaXJxbnIgLSBpbnRlcnJ1cHQgbnVtYmVyCisgKi8KK3N0YXRpYyB2b2lkCitlZXNveHNjc2lfaXJxZGlzYWJsZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjLCBpbnQgaXJxbnIpCit7CisJc3RydWN0IGVlc294c2NzaV9pbmZvICppbmZvID0gKHN0cnVjdCBlZXNveHNjc2lfaW5mbyAqKWVjLT5pcnFfZGF0YTsKKworCWluZm8tPmNvbnRyb2wgJj0gfkVFU09YX0lOVFJfRU5BQkxFOworCisJd3JpdGViKGluZm8tPmNvbnRyb2wsIGluZm8tPmN0bF9wb3J0KTsKK30KKworc3RhdGljIGNvbnN0IGV4cGFuc2lvbmNhcmRfb3BzX3QgZWVzb3hzY3NpX29wcyA9IHsKKwkuaXJxZW5hYmxlCT0gZWVzb3hzY3NpX2lycWVuYWJsZSwKKwkuaXJxZGlzYWJsZQk9IGVlc294c2NzaV9pcnFkaXNhYmxlLAorfTsKKworLyogUHJvdG90eXBlOiB2b2lkIGVlc294c2NzaV90ZXJtaW5hdG9yX2N0bCgqaG9zdCwgb25fb2ZmKQorICogUHVycG9zZSAgOiBUdXJuIHRoZSBFRVNPWCBTQ1NJIHRlcm1pbmF0b3JzIG9uIG9yIG9mZgorICogUGFyYW1zICAgOiBob3N0ICAgLSBjYXJkIHRvIHR1cm4gb24vb2ZmCisgKiAgICAgICAgICA6IG9uX29mZiAtICEwIHRvIHR1cm4gb24sIDAgdG8gdHVybiBvZmYKKyAqLworc3RhdGljIHZvaWQKK2Vlc294c2NzaV90ZXJtaW5hdG9yX2N0bChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBpbnQgb25fb2ZmKQoreworCXN0cnVjdCBlZXNveHNjc2lfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZWVzb3hzY3NpX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJaWYgKG9uX29mZikKKwkJaW5mby0+Y29udHJvbCB8PSBFRVNPWF9URVJNX0VOQUJMRTsKKwllbHNlCisJCWluZm8tPmNvbnRyb2wgJj0gfkVFU09YX1RFUk1fRU5BQkxFOworCisJd3JpdGViKGluZm8tPmNvbnRyb2wsIGluZm8tPmN0bF9wb3J0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworfQorCisvKiBQcm90b3R5cGU6IHZvaWQgZWVzb3hzY3NpX2ludHIoaXJxLCAqZGV2X2lkLCAqcmVncykKKyAqIFB1cnBvc2UgIDogaGFuZGxlIGludGVycnVwdHMgZnJvbSBFRVNPWCBTQ1NJIGNhcmQKKyAqIFBhcmFtcyAgIDogaXJxICAgIC0gaW50ZXJydXB0IG51bWJlcgorICoJICAgICAgZGV2X2lkIC0gdXNlci1kZWZpbmVkIChTY3NpX0hvc3Qgc3RydWN0dXJlKQorICoJICAgICAgcmVncyAgIC0gcHJvY2Vzc29yIHJlZ2lzdGVycyBhdCBpbnRlcnJ1cHQKKyAqLworc3RhdGljIGlycXJldHVybl90CitlZXNveHNjc2lfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBlZXNveHNjc2lfaW5mbyAqaW5mbyA9IGRldl9pZDsKKworCXJldHVybiBmYXMyMTZfaW50cigmaW5mby0+aW5mbyk7Cit9CisKKy8qIFByb3RvdHlwZTogZmFzZG1hdHlwZV90IGVlc294c2NzaV9kbWFfc2V0dXAoaG9zdCwgU0NwbnQsIGRpcmVjdGlvbiwgbWluX3R5cGUpCisgKiBQdXJwb3NlICA6IGluaXRpYWxpc2VzIERNQS9QSU8KKyAqIFBhcmFtcyAgIDogaG9zdCAgICAgIC0gaG9zdAorICoJICAgICAgU0NwbnQgICAgIC0gY29tbWFuZAorICoJICAgICAgZGlyZWN0aW9uIC0gRE1BIG9uIHRvL29mZiBvZiBjYXJkCisgKgkgICAgICBtaW5fdHlwZSAgLSBtaW5pbXVtIERNQSBzdXBwb3J0IHRoYXQgd2UgbXVzdCBoYXZlIGZvciB0aGlzIHRyYW5zZmVyCisgKiBSZXR1cm5zICA6IHR5cGUgb2YgdHJhbnNmZXIgdG8gYmUgcGVyZm9ybWVkCisgKi8KK3N0YXRpYyBmYXNkbWF0eXBlX3QKK2Vlc294c2NzaV9kbWFfc2V0dXAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgU2NzaV9Qb2ludGVyICpTQ3AsCisJCSAgICAgICBmYXNkbWFkaXJfdCBkaXJlY3Rpb24sIGZhc2RtYXR5cGVfdCBtaW5fdHlwZSkKK3sKKwlzdHJ1Y3QgZWVzb3hzY3NpX2luZm8gKmluZm8gPSAoc3RydWN0IGVlc294c2NzaV9pbmZvICopaG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gc2NzaV9nZXRfZGV2aWNlKGhvc3QpOworCWludCBkbWFjaCA9IGluZm8tPmluZm8uc2NzaS5kbWE7CisKKwlpZiAoZG1hY2ggIT0gTk9fRE1BICYmCisJICAgIChtaW5fdHlwZSA9PSBmYXNkbWFfcmVhbF9hbGwgfHwgU0NwLT50aGlzX3Jlc2lkdWFsID49IDUxMikpIHsKKwkJaW50IGJ1ZnMsIG1hcF9kaXIsIGRtYV9kaXI7CisKKwkJYnVmcyA9IGNvcHlfU0NwX3RvX3NnKCZpbmZvLT5zZ1swXSwgU0NwLCBOUl9TRyk7CisKKwkJaWYgKGRpcmVjdGlvbiA9PSBETUFfT1VUKQorCQkJbWFwX2RpciA9IERNQV9UT19ERVZJQ0UsCisJCQlkbWFfZGlyID0gRE1BX01PREVfV1JJVEU7CisJCWVsc2UKKwkJCW1hcF9kaXIgPSBETUFfRlJPTV9ERVZJQ0UsCisJCQlkbWFfZGlyID0gRE1BX01PREVfUkVBRDsKKworCQlkbWFfbWFwX3NnKGRldiwgaW5mby0+c2csIGJ1ZnMgKyAxLCBtYXBfZGlyKTsKKworCQlkaXNhYmxlX2RtYShkbWFjaCk7CisJCXNldF9kbWFfc2coZG1hY2gsIGluZm8tPnNnLCBidWZzICsgMSk7CisJCXNldF9kbWFfbW9kZShkbWFjaCwgZG1hX2Rpcik7CisJCWVuYWJsZV9kbWEoZG1hY2gpOworCQlyZXR1cm4gZmFzZG1hX3JlYWxfYWxsOworCX0KKwkvKgorCSAqIFdlIGRvbid0IGRvIERNQSwgd2Ugb25seSBkbyBzbG93IFBJTworCSAqCisJICogU29tZSBkYXksIHdlIHdpbGwgZG8gUHNldWRvIERNQQorCSAqLworCXJldHVybiBmYXNkbWFfcHNldWRvOworfQorCitzdGF0aWMgdm9pZCBlZXNveHNjc2lfYnVmZmVyX2luKHZvaWQgKmJ1ZiwgaW50IGxlbmd0aCwgdm9pZCBfX2lvbWVtICpiYXNlKQoreworCWNvbnN0IHZvaWQgX19pb21lbSAqcmVnX2ZhcyA9IGJhc2UgKyBFRVNPWF9GQVMyMTZfT0ZGU0VUOworCWNvbnN0IHZvaWQgX19pb21lbSAqcmVnX2RtYXN0YXQgPSBiYXNlICsgRUVTT1hfRE1BU1RBVDsKKwljb25zdCB2b2lkIF9faW9tZW0gKnJlZ19kbWFkYXRhID0gYmFzZSArIEVFU09YX0RNQURBVEE7CisJY29uc3QgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtYXNrID0gMHhmZmZmOworCisJZG8geworCQl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJCS8qCisJCSAqIEludGVycnVwdCByZXF1ZXN0PworCQkgKi8KKwkJc3RhdHVzID0gcmVhZGIocmVnX2ZhcyArIChSRUdfU1RBVCA8PCBFRVNPWF9GQVMyMTZfU0hJRlQpKTsKKwkJaWYgKHN0YXR1cyAmIFNUQVRfSU5UKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogRE1BIHJlcXVlc3QgYWN0aXZlPworCQkgKi8KKwkJc3RhdHVzID0gcmVhZGIocmVnX2RtYXN0YXQpOworCQlpZiAoIShzdGF0dXMgJiBFRVNPWF9TVEFUX0RNQSkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBHZXQgbnVtYmVyIG9mIGJ5dGVzIGluIEZJRk8KKwkJICovCisJCXN0YXR1cyA9IHJlYWRiKHJlZ19mYXMgKyAoUkVHX0NGSVMgPDwgRUVTT1hfRkFTMjE2X1NISUZUKSkgJiBDRklTX0NGOworCQlpZiAoc3RhdHVzID4gMTYpCisJCQlzdGF0dXMgPSAxNjsKKwkJaWYgKHN0YXR1cyA+IGxlbmd0aCkKKwkJCXN0YXR1cyA9IGxlbmd0aDsKKworCQkvKgorCQkgKiBBbGlnbiBidWZmZXIuCisJCSAqLworCQlpZiAoKCh1MzIpYnVmKSAmIDIgJiYgc3RhdHVzID49IDIpIHsKKwkJCSoodTE2ICopYnVmID0gcmVhZGwocmVnX2RtYWRhdGEpOworCQkJYnVmICs9IDI7CisJCQlzdGF0dXMgLT0gMjsKKwkJCWxlbmd0aCAtPSAyOworCQl9CisKKwkJaWYgKHN0YXR1cyA+PSA4KSB7CisJCQl1bnNpZ25lZCBsb25nIGwxLCBsMjsKKworCQkJbDEgPSByZWFkbChyZWdfZG1hZGF0YSkgJiBtYXNrOworCQkJbDEgfD0gcmVhZGwocmVnX2RtYWRhdGEpIDw8IDE2OworCQkJbDIgPSByZWFkbChyZWdfZG1hZGF0YSkgJiBtYXNrOworCQkJbDIgfD0gcmVhZGwocmVnX2RtYWRhdGEpIDw8IDE2OworCQkJKih1MzIgKilidWYgPSBsMTsKKwkJCWJ1ZiArPSA0OworCQkJKih1MzIgKilidWYgPSBsMjsKKwkJCWJ1ZiArPSA0OworCQkJbGVuZ3RoIC09IDg7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzdGF0dXMgPj0gNCkgeworCQkJdW5zaWduZWQgbG9uZyBsMTsKKworCQkJbDEgPSByZWFkbChyZWdfZG1hZGF0YSkgJiBtYXNrOworCQkJbDEgfD0gcmVhZGwocmVnX2RtYWRhdGEpIDw8IDE2OworCisJCQkqKHUzMiAqKWJ1ZiA9IGwxOworCQkJYnVmICs9IDQ7CisJCQlsZW5ndGggLT0gNDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHN0YXR1cyA+PSAyKSB7CisJCQkqKHUxNiAqKWJ1ZiA9IHJlYWRsKHJlZ19kbWFkYXRhKTsKKwkJCWJ1ZiArPSAyOworCQkJbGVuZ3RoIC09IDI7CisJCX0KKwl9IHdoaWxlIChsZW5ndGgpOworfQorCitzdGF0aWMgdm9pZCBlZXNveHNjc2lfYnVmZmVyX291dCh2b2lkICpidWYsIGludCBsZW5ndGgsIHZvaWQgX19pb21lbSAqYmFzZSkKK3sKKwljb25zdCB2b2lkIF9faW9tZW0gKnJlZ19mYXMgPSBiYXNlICsgRUVTT1hfRkFTMjE2X09GRlNFVDsKKwljb25zdCB2b2lkIF9faW9tZW0gKnJlZ19kbWFzdGF0ID0gYmFzZSArIEVFU09YX0RNQVNUQVQ7CisJY29uc3Qgdm9pZCBfX2lvbWVtICpyZWdfZG1hZGF0YSA9IGJhc2UgKyBFRVNPWF9ETUFEQVRBOworCisJZG8geworCQl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJCS8qCisJCSAqIEludGVycnVwdCByZXF1ZXN0PworCQkgKi8KKwkJc3RhdHVzID0gcmVhZGIocmVnX2ZhcyArIChSRUdfU1RBVCA8PCBFRVNPWF9GQVMyMTZfU0hJRlQpKTsKKwkJaWYgKHN0YXR1cyAmIFNUQVRfSU5UKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogRE1BIHJlcXVlc3QgYWN0aXZlPworCQkgKi8KKwkJc3RhdHVzID0gcmVhZGIocmVnX2RtYXN0YXQpOworCQlpZiAoIShzdGF0dXMgJiBFRVNPWF9TVEFUX0RNQSkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBHZXQgbnVtYmVyIG9mIGJ5dGVzIGluIEZJRk8KKwkJICovCisJCXN0YXR1cyA9IHJlYWRiKHJlZ19mYXMgKyAoUkVHX0NGSVMgPDwgRUVTT1hfRkFTMjE2X1NISUZUKSkgJiBDRklTX0NGOworCQlpZiAoc3RhdHVzID4gMTYpCisJCQlzdGF0dXMgPSAxNjsKKwkJc3RhdHVzID0gMTYgLSBzdGF0dXM7CisJCWlmIChzdGF0dXMgPiBsZW5ndGgpCisJCQlzdGF0dXMgPSBsZW5ndGg7CisJCXN0YXR1cyAmPSB+MTsKKworCQkvKgorCQkgKiBBbGlnbiBidWZmZXIuCisJCSAqLworCQlpZiAoKCh1MzIpYnVmKSAmIDIgJiYgc3RhdHVzID49IDIpIHsKKwkJCXdyaXRlbCgqKHUxNiAqKWJ1ZiA8PCAxNiwgcmVnX2RtYWRhdGEpOworCQkJYnVmICs9IDI7CisJCQlzdGF0dXMgLT0gMjsKKwkJCWxlbmd0aCAtPSAyOworCQl9CisKKwkJaWYgKHN0YXR1cyA+PSA4KSB7CisJCQl1bnNpZ25lZCBsb25nIGwxLCBsMjsKKworCQkJbDEgPSAqKHUzMiAqKWJ1ZjsKKwkJCWJ1ZiArPSA0OworCQkJbDIgPSAqKHUzMiAqKWJ1ZjsKKwkJCWJ1ZiArPSA0OworCisJCQl3cml0ZWwobDEgPDwgMTYsIHJlZ19kbWFkYXRhKTsKKwkJCXdyaXRlbChsMSwgcmVnX2RtYWRhdGEpOworCQkJd3JpdGVsKGwyIDw8IDE2LCByZWdfZG1hZGF0YSk7CisJCQl3cml0ZWwobDIsIHJlZ19kbWFkYXRhKTsKKwkJCWxlbmd0aCAtPSA4OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3RhdHVzID49IDQpIHsKKwkJCXVuc2lnbmVkIGxvbmcgbDE7CisKKwkJCWwxID0gKih1MzIgKilidWY7CisJCQlidWYgKz0gNDsKKworCQkJd3JpdGVsKGwxIDw8IDE2LCByZWdfZG1hZGF0YSk7CisJCQl3cml0ZWwobDEsIHJlZ19kbWFkYXRhKTsKKwkJCWxlbmd0aCAtPSA0OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3RhdHVzID49IDIpIHsKKwkJCXdyaXRlbCgqKHUxNiAqKWJ1ZiA8PCAxNiwgcmVnX2RtYWRhdGEpOworCQkJYnVmICs9IDI7CisJCQlsZW5ndGggLT0gMjsKKwkJfQorCX0gd2hpbGUgKGxlbmd0aCk7Cit9CisKK3N0YXRpYyB2b2lkCitlZXNveHNjc2lfZG1hX3BzZXVkbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBTY3NpX1BvaW50ZXIgKlNDcCwKKwkJICAgICBmYXNkbWFkaXJfdCBkaXIsIGludCB0cmFuc2Zlcl9zaXplKQoreworCXN0cnVjdCBlZXNveHNjc2lfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZWVzb3hzY3NpX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKwlpZiAoZGlyID09IERNQV9JTikgeworCQllZXNveHNjc2lfYnVmZmVyX2luKFNDcC0+cHRyLCBTQ3AtPnRoaXNfcmVzaWR1YWwsIGluZm8tPmJhc2UpOworCX0gZWxzZSB7CisJCWVlc294c2NzaV9idWZmZXJfb3V0KFNDcC0+cHRyLCBTQ3AtPnRoaXNfcmVzaWR1YWwsIGluZm8tPmJhc2UpOworCX0KK30KKworLyogUHJvdG90eXBlOiBpbnQgZWVzb3hzY3NpX2RtYV9zdG9wKGhvc3QsIFNDcG50KQorICogUHVycG9zZSAgOiBzdG9wcyBETUEvUElPCisgKiBQYXJhbXMgICA6IGhvc3QgIC0gaG9zdAorICoJICAgICAgU0NwbnQgLSBjb21tYW5kCisgKi8KK3N0YXRpYyB2b2lkCitlZXNveHNjc2lfZG1hX3N0b3Aoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgU2NzaV9Qb2ludGVyICpTQ3ApCit7CisJc3RydWN0IGVlc294c2NzaV9pbmZvICppbmZvID0gKHN0cnVjdCBlZXNveHNjc2lfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCWlmIChpbmZvLT5pbmZvLnNjc2kuZG1hICE9IE5PX0RNQSkKKwkJZGlzYWJsZV9kbWEoaW5mby0+aW5mby5zY3NpLmRtYSk7Cit9CisKKy8qIFByb3RvdHlwZTogY29uc3QgY2hhciAqZWVzb3hzY3NpX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqIGhvc3QpCisgKiBQdXJwb3NlICA6IHJldHVybnMgYSBkZXNjcmlwdGl2ZSBzdHJpbmcgYWJvdXQgdGhpcyBpbnRlcmZhY2UsCisgKiBQYXJhbXMgICA6IGhvc3QgLSBkcml2ZXIgaG9zdCBzdHJ1Y3R1cmUgdG8gcmV0dXJuIGluZm8gZm9yLgorICogUmV0dXJucyAgOiBwb2ludGVyIHRvIGEgc3RhdGljIGJ1ZmZlciBjb250YWluaW5nIG51bGwgdGVybWluYXRlZCBzdHJpbmcuCisgKi8KK2NvbnN0IGNoYXIgKmVlc294c2NzaV9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RydWN0IGVlc294c2NzaV9pbmZvICppbmZvID0gKHN0cnVjdCBlZXNveHNjc2lfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCXN0YXRpYyBjaGFyIHN0cmluZ1sxNTBdOworCisJc3ByaW50ZihzdHJpbmcsICIlcyAoJXMpIGluIHNsb3QgJWQgdiVzIHRlcm1pbmF0b3JzIG8lcyIsCisJCWhvc3QtPmhvc3R0LT5uYW1lLCBpbmZvLT5pbmZvLnNjc2kudHlwZSwgaW5mby0+ZWMtPnNsb3Rfbm8sCisJCVZFUlNJT04sIGluZm8tPmNvbnRyb2wgJiBFRVNPWF9URVJNX0VOQUJMRSA/ICJuIiA6ICJmZiIpOworCisJcmV0dXJuIHN0cmluZzsKK30KKworLyogUHJvdG90eXBlOiBpbnQgZWVzb3hzY3NpX3NldF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQorICogUHVycG9zZSAgOiBTZXQgYSBkcml2ZXIgc3BlY2lmaWMgZnVuY3Rpb24KKyAqIFBhcmFtcyAgIDogaG9zdCAgIC0gaG9zdCB0byBzZXR1cAorICogICAgICAgICAgOiBidWZmZXIgLSBidWZmZXIgY29udGFpbmluZyBzdHJpbmcgZGVzY3JpYmluZyBvcGVyYXRpb24KKyAqICAgICAgICAgIDogbGVuZ3RoIC0gbGVuZ3RoIG9mIHN0cmluZworICogUmV0dXJucyAgOiAtRUlOVkFMLCBvciAwCisgKi8KK3N0YXRpYyBpbnQKK2Vlc294c2NzaV9zZXRfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkKK3sKKwlpbnQgcmV0ID0gbGVuZ3RoOworCisJaWYgKGxlbmd0aCA+PSA5ICYmIHN0cm5jbXAoYnVmZmVyLCAiRUVTT1hTQ1NJIiwgOSkgPT0gMCkgeworCQlidWZmZXIgKz0gOTsKKwkJbGVuZ3RoIC09IDk7CisKKwkJaWYgKGxlbmd0aCA+PSA1ICYmIHN0cm5jbXAoYnVmZmVyLCAidGVybT0iLCA1KSA9PSAwKSB7CisJCQlpZiAoYnVmZmVyWzVdID09ICcxJykKKwkJCQllZXNveHNjc2lfdGVybWluYXRvcl9jdGwoaG9zdCwgMSk7CisJCQllbHNlIGlmIChidWZmZXJbNV0gPT0gJzAnKQorCQkJCWVlc294c2NzaV90ZXJtaW5hdG9yX2N0bChob3N0LCAwKTsKKwkJCWVsc2UKKwkJCQlyZXQgPSAtRUlOVkFMOworCQl9IGVsc2UKKwkJCXJldCA9IC1FSU5WQUw7CisJfSBlbHNlCisJCXJldCA9IC1FSU5WQUw7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBQcm90b3R5cGU6IGludCBlZXNveHNjc2lfcHJvY19pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisgKgkJCQkgICAgICBpbnQgbGVuZ3RoLCBpbnQgaG9zdF9ubywgaW50IGlub3V0KQorICogUHVycG9zZSAgOiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRyaXZlciB0byBhIHVzZXIgcHJvY2VzcyBhY2Nlc3NpbmcKKyAqCSAgICAgIHRoZSAvcHJvYyBmaWxlc3lzdGVtLgorICogUGFyYW1zICAgOiBidWZmZXIgLSBhIGJ1ZmZlciB0byB3cml0ZSBpbmZvcm1hdGlvbiB0bworICoJICAgICAgc3RhcnQgIC0gYSBwb2ludGVyIGludG8gdGhpcyBidWZmZXIgc2V0IGJ5IHRoaXMgcm91dGluZSB0byB0aGUgc3RhcnQKKyAqCQkgICAgICAgb2YgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uLgorICoJICAgICAgb2Zmc2V0IC0gb2Zmc2V0IGludG8gaW5mb3JtYXRpb24gdGhhdCB3ZSBoYXZlIHJlYWQgdXB0by4KKyAqCSAgICAgIGxlbmd0aCAtIGxlbmd0aCBvZiBidWZmZXIKKyAqCSAgICAgIGhvc3Rfbm8gLSBob3N0IG51bWJlciB0byByZXR1cm4gaW5mb3JtYXRpb24gZm9yCisgKgkgICAgICBpbm91dCAgLSAwIGZvciByZWFkaW5nLCAxIGZvciB3cml0aW5nLgorICogUmV0dXJucyAgOiBsZW5ndGggb2YgZGF0YSB3cml0dGVuIHRvIGJ1ZmZlci4KKyAqLworaW50IGVlc294c2NzaV9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCSAgICBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCit7CisJc3RydWN0IGVlc294c2NzaV9pbmZvICppbmZvOworCWNoYXIgKnAgPSBidWZmZXI7CisJaW50IHBvczsKKworCWlmIChpbm91dCA9PSAxKQorCQlyZXR1cm4gZWVzb3hzY3NpX3NldF9wcm9jX2luZm8oaG9zdCwgYnVmZmVyLCBsZW5ndGgpOworCisJaW5mbyA9IChzdHJ1Y3QgZWVzb3hzY3NpX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKworCXAgKz0gc3ByaW50ZihwLCAiRUVTT1ggU0NTSSBkcml2ZXIgdiVzXG4iLCBWRVJTSU9OKTsKKwlwICs9IGZhczIxNl9wcmludF9ob3N0KCZpbmZvLT5pbmZvLCBwKTsKKwlwICs9IHNwcmludGYocCwgIlRlcm0gICAgOiBvJXNcbiIsCisJCQlpbmZvLT5jb250cm9sICYgRUVTT1hfVEVSTV9FTkFCTEUgPyAibiIgOiAiZmYiKTsKKworCXAgKz0gZmFzMjE2X3ByaW50X3N0YXRzKCZpbmZvLT5pbmZvLCBwKTsKKwlwICs9IGZhczIxNl9wcmludF9kZXZpY2VzKCZpbmZvLT5pbmZvLCBwKTsKKworCSpzdGFydCA9IGJ1ZmZlciArIG9mZnNldDsKKwlwb3MgPSBwIC0gYnVmZmVyIC0gb2Zmc2V0OworCWlmIChwb3MgPiBsZW5ndGgpCisJCXBvcyA9IGxlbmd0aDsKKworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVlc294c2NzaV9zaG93X3Rlcm0oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYyA9IEVDQVJEX0RFVihkZXYpOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CisJc3RydWN0IGVlc294c2NzaV9pbmZvICppbmZvID0gKHN0cnVjdCBlZXNveHNjc2lfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGluZm8tPmNvbnRyb2wgJiBFRVNPWF9URVJNX0VOQUJMRSA/IDEgOiAwKTsKK30KKworc3RhdGljIHNzaXplX3QgZWVzb3hzY3NpX3N0b3JlX3Rlcm0oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYyA9IEVDQVJEX0RFVihkZXYpOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CisJc3RydWN0IGVlc294c2NzaV9pbmZvICppbmZvID0gKHN0cnVjdCBlZXNveHNjc2lfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobGVuID4gMSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJaWYgKGJ1ZlswXSAhPSAnMCcpIHsKKwkJCWluZm8tPmNvbnRyb2wgfD0gRUVTT1hfVEVSTV9FTkFCTEU7CisJCX0gZWxzZSB7CisJCQlpbmZvLT5jb250cm9sICY9IH5FRVNPWF9URVJNX0VOQUJMRTsKKwkJfQorCQl3cml0ZWIoaW5mby0+Y29udHJvbCwgaW5mby0+Y3RsX3BvcnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihidXNfdGVybSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIGVlc294c2NzaV9zaG93X3Rlcm0sIGVlc294c2NzaV9zdG9yZV90ZXJtKTsKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBlZXNveF90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJCT0gVEhJU19NT0RVTEUsCisJLnByb2NfaW5mbwkJCT0gZWVzb3hzY3NpX3Byb2NfaW5mbywKKwkubmFtZQkJCQk9ICJFRVNPWCBTQ1NJIiwKKwkuaW5mbwkJCQk9IGVlc294c2NzaV9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCQk9IGZhczIxNl9xdWV1ZV9jb21tYW5kLAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJCT0gZmFzMjE2X2VoX2hvc3RfcmVzZXQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCQk9IGZhczIxNl9laF9idXNfcmVzZXQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyCT0gZmFzMjE2X2VoX2RldmljZV9yZXNldCwKKwkuZWhfYWJvcnRfaGFuZGxlcgkJPSBmYXMyMTZfZWhfYWJvcnQsCisJLmNhbl9xdWV1ZQkJCT0gMSwKKwkudGhpc19pZAkJCT0gNywKKwkuc2dfdGFibGVzaXplCQkJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorCS5wcm9jX25hbWUJCQk9ICJlZXNveCIsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorZWVzb3hzY3NpX3Byb2JlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCAqaWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3QgZWVzb3hzY3NpX2luZm8gKmluZm87CisJdW5zaWduZWQgbG9uZyByZXNiYXNlLCByZXNsZW47CisJdm9pZCBfX2lvbWVtICpiYXNlOworCWludCByZXQ7CisKKwlyZXQgPSBlY2FyZF9yZXF1ZXN0X3Jlc291cmNlcyhlYyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXNiYXNlID0gZWNhcmRfcmVzb3VyY2Vfc3RhcnQoZWMsIEVDQVJEX1JFU19JT0NGQVNUKTsKKwlyZXNsZW4gPSBlY2FyZF9yZXNvdXJjZV9sZW4oZWMsIEVDQVJEX1JFU19JT0NGQVNUKTsKKwliYXNlID0gaW9yZW1hcChyZXNiYXNlLCByZXNsZW4pOworCWlmICghYmFzZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9yZWdpb247CisJfQorCisJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmZWVzb3hfdGVtcGxhdGUsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBlZXNveHNjc2lfaW5mbykpOworCWlmICghaG9zdCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF91bm1hcDsKKwl9CisKKwllY2FyZF9zZXRfZHJ2ZGF0YShlYywgaG9zdCk7CisKKwlpbmZvID0gKHN0cnVjdCBlZXNveHNjc2lfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCWluZm8tPmVjCT0gZWM7CisJaW5mby0+YmFzZQk9IGJhc2U7CisJaW5mby0+Y3RsX3BvcnQJPSBiYXNlICsgRUVTT1hfQ09OVFJPTDsKKwlpbmZvLT5jb250cm9sCT0gdGVybVtlYy0+c2xvdF9ub10gPyBFRVNPWF9URVJNX0VOQUJMRSA6IDA7CisJd3JpdGViKGluZm8tPmNvbnRyb2wsIGluZm8tPmN0bF9wb3J0KTsKKworCWluZm8tPmluZm8uc2NzaS5pb19iYXNlCQk9IGJhc2UgKyBFRVNPWF9GQVMyMTZfT0ZGU0VUOworCWluZm8tPmluZm8uc2NzaS5pb19zaGlmdAk9IEVFU09YX0ZBUzIxNl9TSElGVDsKKwlpbmZvLT5pbmZvLnNjc2kuaXJxCQk9IGVjLT5pcnE7CisJaW5mby0+aW5mby5zY3NpLmRtYQkJPSBlYy0+ZG1hOworCWluZm8tPmluZm8uaWZjZmcuY2xvY2tyYXRlCT0gNDA7IC8qIE1IeiAqLworCWluZm8tPmluZm8uaWZjZmcuc2VsZWN0X3RpbWVvdXQJPSAyNTU7CisJaW5mby0+aW5mby5pZmNmZy5hc3luY3BlcmlvZAk9IDIwMDsgLyogbnMgKi8KKwlpbmZvLT5pbmZvLmlmY2ZnLnN5bmNfbWF4X2RlcHRoCT0gNzsKKwlpbmZvLT5pbmZvLmlmY2ZnLmNudGwzCQk9IENOVEwzX0ZBU1RTQ1NJIHwgQ05UTDNfRkFTVENMSzsKKwlpbmZvLT5pbmZvLmlmY2ZnLmRpc2Nvbm5lY3Rfb2sJPSAxOworCWluZm8tPmluZm8uaWZjZmcud2lkZV9tYXhfc2l6ZQk9IDA7CisJaW5mby0+aW5mby5pZmNmZy5jYXBhYmlsaXRpZXMJPSBGQVNDQVBfUFNFVURPRE1BOworCWluZm8tPmluZm8uZG1hLnNldHVwCQk9IGVlc294c2NzaV9kbWFfc2V0dXA7CisJaW5mby0+aW5mby5kbWEucHNldWRvCQk9IGVlc294c2NzaV9kbWFfcHNldWRvOworCWluZm8tPmluZm8uZG1hLnN0b3AJCT0gZWVzb3hzY3NpX2RtYV9zdG9wOworCisJZWMtPmlycWFkZHIJPSBiYXNlICsgRUVTT1hfRE1BU1RBVDsKKwllYy0+aXJxbWFzawk9IEVFU09YX1NUQVRfSU5UUjsKKwllYy0+aXJxX2RhdGEJPSBpbmZvOworCWVjLT5vcHMJCT0gJmVlc294c2NzaV9vcHM7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmVjLT5kZXYsICZkZXZfYXR0cl9idXNfdGVybSk7CisKKwlyZXQgPSBmYXMyMTZfaW5pdChob3N0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mcmVlOworCisJcmV0ID0gcmVxdWVzdF9pcnEoZWMtPmlycSwgZWVzb3hzY3NpX2ludHIsIDAsICJlZXNveHNjc2kiLCBpbmZvKTsKKwlpZiAocmV0KSB7CisJCXByaW50aygic2NzaSVkOiBJUlElZCBub3QgZnJlZTogJWRcbiIsCisJCSAgICAgICBob3N0LT5ob3N0X25vLCBlYy0+aXJxLCByZXQpOworCQlnb3RvIG91dF9yZW1vdmU7CisJfQorCisJaWYgKGluZm8tPmluZm8uc2NzaS5kbWEgIT0gTk9fRE1BKSB7CisJCWlmIChyZXF1ZXN0X2RtYShpbmZvLT5pbmZvLnNjc2kuZG1hLCAiZWVzb3giKSkgeworCQkJcHJpbnRrKCJzY3NpJWQ6IERNQSVkIG5vdCBmcmVlLCBETUEgZGlzYWJsZWRcbiIsCisJCQkgICAgICAgaG9zdC0+aG9zdF9ubywgaW5mby0+aW5mby5zY3NpLmRtYSk7CisJCQlpbmZvLT5pbmZvLnNjc2kuZG1hID0gTk9fRE1BOworCQl9IGVsc2UgeworCQkJc2V0X2RtYV9zcGVlZChpbmZvLT5pbmZvLnNjc2kuZG1hLCAxODApOworCQkJaW5mby0+aW5mby5pZmNmZy5jYXBhYmlsaXRpZXMgfD0gRkFTQ0FQX0RNQTsKKwkJCWluZm8tPmluZm8uaWZjZmcuY250bDMgfD0gQ05UTDNfQlM4OworCQl9CisJfQorCisJcmV0ID0gZmFzMjE2X2FkZChob3N0LCAmZWMtPmRldik7CisJaWYgKHJldCA9PSAwKQorCQlnb3RvIG91dDsKKworCWlmIChpbmZvLT5pbmZvLnNjc2kuZG1hICE9IE5PX0RNQSkKKwkJZnJlZV9kbWEoaW5mby0+aW5mby5zY3NpLmRtYSk7CisJZnJlZV9pcnEoZWMtPmlycSwgaG9zdCk7CisKKyBvdXRfcmVtb3ZlOgorCWZhczIxNl9yZW1vdmUoaG9zdCk7CisKKyBvdXRfZnJlZToKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmVjLT5kZXYsICZkZXZfYXR0cl9idXNfdGVybSk7CisJc2NzaV9ob3N0X3B1dChob3N0KTsKKworIG91dF91bm1hcDoKKwlpb3VubWFwKGJhc2UpOworCisgb3V0X3JlZ2lvbjoKKwllY2FyZF9yZWxlYXNlX3Jlc291cmNlcyhlYyk7CisKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGVlc294c2NzaV9yZW1vdmUoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZWNhcmRfZ2V0X2RydmRhdGEoZWMpOworCXN0cnVjdCBlZXNveHNjc2lfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZWVzb3hzY3NpX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKworCWVjYXJkX3NldF9kcnZkYXRhKGVjLCBOVUxMKTsKKwlmYXMyMTZfcmVtb3ZlKGhvc3QpOworCisJaWYgKGluZm8tPmluZm8uc2NzaS5kbWEgIT0gTk9fRE1BKQorCQlmcmVlX2RtYShpbmZvLT5pbmZvLnNjc2kuZG1hKTsKKwlmcmVlX2lycShlYy0+aXJxLCBpbmZvKTsKKworCWRldmljZV9yZW1vdmVfZmlsZSgmZWMtPmRldiwgJmRldl9hdHRyX2J1c190ZXJtKTsKKworCWlvdW5tYXAoaW5mby0+YmFzZSk7CisKKwlmYXMyMTZfcmVsZWFzZShob3N0KTsKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworCWVjYXJkX3JlbGVhc2VfcmVzb3VyY2VzKGVjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCBlZXNveHNjc2lfY2lkc1tdID0geworCXsgTUFOVV9FRVNPWCwgUFJPRF9FRVNPWF9TQ1NJMiB9LAorCXsgMHhmZmZmLCAweGZmZmYgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZWNhcmRfZHJpdmVyIGVlc294c2NzaV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGVlc294c2NzaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGVlc294c2NzaV9yZW1vdmUpLAorCS5pZF90YWJsZQk9IGVlc294c2NzaV9jaWRzLAorCS5kcnYgPSB7CisJCS5uYW1lCQk9ICJlZXNveHNjc2kiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlZXNveF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGVjYXJkX3JlZ2lzdGVyX2RyaXZlcigmZWVzb3hzY3NpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlZXNveF9leGl0KHZvaWQpCit7CisJZWNhcmRfcmVtb3ZlX2RyaXZlcigmZWVzb3hzY3NpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGVlc294X2luaXQpOworbW9kdWxlX2V4aXQoZWVzb3hfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlJ1c3NlbGwgS2luZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFRVNPWCAnRmFzdCcgU0NTSSBkcml2ZXIgZm9yIEFjb3JuIG1hY2hpbmVzIik7CitNT0RVTEVfUEFSTSh0ZXJtLCAiMS04aSIpOworTU9EVUxFX1BBUk1fREVTQyh0ZXJtLCAiU0NTSSBidXMgdGVybWluYXRpb24iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcm0vZmFzMjE2LmMgYi9kcml2ZXJzL3Njc2kvYXJtL2ZhczIxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MTFlODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXJtL2ZhczIxNi5jCkBAIC0wLDAgKzEsMzA0MyBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Fjb3JuL3Njc2kvZmFzMjE2LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDMgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBCYXNlZCBvbiBpbmZvcm1hdGlvbiBpbiBxbG9naWNmYXMuYyBieSBUb20gWmVydWNoYSwgTWljaGFlbCBHcmlmZml0aCwgYW5kCisgKiBvdGhlciBzb3VyY2VzLCBpbmNsdWRpbmc6CisgKiAgIHRoZSBBTUQgQW01M0NGOTQgZGF0YSBzaGVldAorICogICB0aGUgQU1EIEFtNTNDOTQgZGF0YSBzaGVldAorICoKKyAqIFRoaXMgaXMgYSBnZW5lcmljIGRyaXZlci4gIFRvIHVzZSBpdCwgaGF2ZSBhIGxvb2sgYXQgY3VtYW5hXzIuYy4gIFlvdQorICogc2hvdWxkIGRlZmluZSB5b3VyIG93biBzdHJ1Y3R1cmUgdGhhdCBvdmVybGF5cyBGQVMyMTZfSW5mbywgZWc6CisgKiBzdHJ1Y3QgbXlfaG9zdF9kYXRhIHsKKyAqICAgIEZBUzIxNl9JbmZvIGluZm87CisgKiAgICAuLi4gbXkgaG9zdCBzcGVjaWZpYyBkYXRhIC4uLgorICogfTsKKyAqCisgKiBDaGFuZ2Vsb2c6CisgKiAgMzAtMDgtMTk5NwlSTUsJQ3JlYXRlZAorICogIDE0LTA5LTE5OTcJUk1LCVN0YXJ0ZWQgZGlzY29ubmVjdCBzdXBwb3J0CisgKiAgMDgtMDItMTk5OAlSTUsJQ29ycmVjdGVkIHJlYWwgRE1BIHN1cHBvcnQKKyAqICAxNS0wMi0xOTk4CVJNSwlTdGFydGVkIHN5bmMgeGZlciBzdXBwb3J0CisgKiAgMDYtMDQtMTk5OAlSTUsJVGlnaHRlbmVkIGNvbmRpdGlvbnMgZm9yIHByaW50aW5nIGluY29tcGxldGUKKyAqCQkJdHJhbnNmZXJzCisgKiAgMDItMDUtMTk5OAlSTUsJQWRkZWQgZXh0cmEgY2hlY2tzIGluIGZhczIxNl9yZXNldAorICogIDI0LTA1LTE5OTgJUk1LCUZpeGVkIHN5bmNocm9ub3VzIHRyYW5zZmVycyB3aXRoIHBlcmlvZCA+PSAyMDBucworICogIDI3LTA2LTE5OTgJUk1LCUNoYW5nZWQgYXNtL2RlbGF5LmggdG8gbGludXgvZGVsYXkuaAorICogIDI2LTA4LTE5OTgJUk1LCUltcHJvdmVkIG1lc3NhZ2Ugc3VwcG9ydCB3cnQgTUVTU0FHRV9SRUpFQ1QKKyAqICAwMi0wNC0yMDAwCVJNSwlDb252ZXJ0ZWQgdG8gdXNlIHRoZSBuZXcgZXJyb3IgaGFuZGxpbmcsIGFuZAorICoJCQlhdXRvbWF0aWNhbGx5IHJlcXVlc3Qgc2Vuc2UgZGF0YSB1cG9uIGNoZWNrCisgKgkJCWNvbmRpdGlvbiBzdGF0dXMgZnJvbSB0YXJnZXRzLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9lY2FyZC5oPgorCisjaW5jbHVkZSAiLi4vc2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiZmFzMjE2LmgiCisjaW5jbHVkZSAic2NzaS5oIgorCisvKiBOT1RFOiBTQ1NJMiBTeW5jaHJvbm91cyB0cmFuc2ZlcnMgKnJlcXVpcmUqIERNQSBhY2NvcmRpbmcgdG8KKyAqICB0aGUgZGF0YSBzaGVldC4gIFRoaXMgcmVzdHJpY3Rpb24gaXMgY3JhenksIGVzcGVjaWFsbHkgd2hlbgorICogIHlvdSBvbmx5IHdhbnQgdG8gc2VuZCAxNiBieXRlcyEgIFdoYXQgd2VyZSB0aGUgZ3V5cyB3aG8KKyAqICBkZXNpZ25lZCB0aGlzIGNoaXAgb24gYXQgdGhhdCB0aW1lPyAgRGlkIHRoZXkgcmVhZCB0aGUgU0NTSTIKKyAqICBzcGVjIGF0IGFsbD8gIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgYXJlIHRha2VuIGZyb20gdGhlIFNDU0kyCisgKiAgc3RhbmRhcmQgKHMycjEwKSBjb25jZXJuaW5nIHRoaXM6CisgKgorICogPiBJTVBMRU1FTlRPUlMgTk9URVM6CisgKiA+ICAgKDEpICBSZS1uZWdvdGlhdGlvbiBhdCBldmVyeSBzZWxlY3Rpb24gaXMgbm90IHJlY29tbWVuZGVkLCBzaW5jZSBhCisgKiA+ICAgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wYWN0IGlzIGxpa2VseS4KKyAqCisgKiA+ICBUaGUgaW1wbGllZCBzeW5jaHJvbm91cyBhZ3JlZW1lbnQgc2hhbGwgcmVtYWluIGluIGVmZmVjdCB1bnRpbCBhIEJVUyBERVZJQ0UKKyAqID4gIFJFU0VUIG1lc3NhZ2UgaXMgcmVjZWl2ZWQsIHVudGlsIGEgaGFyZCByZXNldCBjb25kaXRpb24gb2NjdXJzLCBvciB1bnRpbCBvbmUKKyAqID4gIG9mIHRoZSB0d28gU0NTSSBkZXZpY2VzIGVsZWN0cyB0byBtb2RpZnkgdGhlIGFncmVlbWVudC4gIFRoZSBkZWZhdWx0IGRhdGEKKyAqID4gIHRyYW5zZmVyIG1vZGUgaXMgYXN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXIgbW9kZS4gIFRoZSBkZWZhdWx0IGRhdGEgdHJhbnNmZXIKKyAqID4gIG1vZGUgaXMgZW50ZXJlZCBhdCBwb3dlciBvbiwgYWZ0ZXIgYSBCVVMgREVWSUNFIFJFU0VUIG1lc3NhZ2UsIG9yIGFmdGVyIGEgaGFyZAorICogPiAgcmVzZXQgY29uZGl0aW9uLgorICoKKyAqICBJbiB0b3RhbCwgdGhpcyBtZWFucyB0aGF0IG9uY2UgeW91IGhhdmUgZWxlY3RlZCB0byB1c2Ugc3luY2hyb25vdXMKKyAqICB0cmFuc2ZlcnMsIHlvdSBtdXN0IGFsd2F5cyB1c2UgRE1BLgorICoKKyAqICBJIHdhcyB0aGlua2luZyB0aGF0IHRoaXMgd2FzIGEgZ29vZCBjaGlwIHVudGlsIEkgZm91bmQgdGhpcyByZXN0cmljdGlvbiA7KAorICovCisjZGVmaW5lIFNDU0kyX1NZTkMKKyN1bmRlZiAgU0NTSTJfVEFHCisKKyN1bmRlZiBERUJVR19DT05ORUNUCisjdW5kZWYgREVCVUdfTUVTU0FHRVMKKworI3VuZGVmIENIRUNLX1NUUlVDVFVSRQorCisjZGVmaW5lIExPR19DT05ORUNUCQkoMSA8PCAwKQorI2RlZmluZSBMT0dfQlVTU0VSVklDRQkJKDEgPDwgMSkKKyNkZWZpbmUgTE9HX0ZVTkNUSU9ORE9ORQkoMSA8PCAyKQorI2RlZmluZSBMT0dfTUVTU0FHRVMJCSgxIDw8IDMpCisjZGVmaW5lIExPR19CVUZGRVIJCSgxIDw8IDQpCisjZGVmaW5lIExPR19FUlJPUgkJKDEgPDwgOCkKKworc3RhdGljIGludCBsZXZlbF9tYXNrID0gTE9HX0VSUk9SOworCittb2R1bGVfcGFyYW0obGV2ZWxfbWFzaywgaW50LCAwNjQ0KTsKKworc3RhdGljIGludCBfX2luaXQgZmFzMjE2X2xvZ19zZXR1cChjaGFyICpzdHIpCit7CisJY2hhciAqczsKKworCWxldmVsX21hc2sgPSAwOworCisJd2hpbGUgKChzID0gc3Ryc2VwKCZzdHIsICIsIikpICE9IE5VTEwpIHsKKwkJc3dpdGNoIChzWzBdKSB7CisJCWNhc2UgJ2EnOgorCQkJaWYgKHN0cmNtcChzLCAiYWxsIikgPT0gMCkKKwkJCQlsZXZlbF9tYXNrIHw9IC0xOworCQkJYnJlYWs7CisJCWNhc2UgJ2InOgorCQkJaWYgKHN0cm5jbXAocywgImJ1cyIsIDMpID09IDApCisJCQkJbGV2ZWxfbWFzayB8PSBMT0dfQlVTU0VSVklDRTsKKwkJCWlmIChzdHJuY21wKHMsICJidWYiLCAzKSA9PSAwKQorCQkJCWxldmVsX21hc2sgfD0gTE9HX0JVRkZFUjsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCWxldmVsX21hc2sgfD0gTE9HX0NPTk5FQ1Q7CisJCQlicmVhazsKKwkJY2FzZSAnZSc6CisJCQlsZXZlbF9tYXNrIHw9IExPR19FUlJPUjsKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCWxldmVsX21hc2sgfD0gTE9HX01FU1NBR0VTOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJaWYgKHN0cmNtcChzLCAibm9uZSIpID09IDApCisJCQkJbGV2ZWxfbWFzayA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlsZXZlbF9tYXNrIHw9IExPR19GVU5DVElPTkRPTkU7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiZmFzMjE2X2xvZ2dpbmc9IiwgZmFzMjE2X2xvZ19zZXR1cCk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBmYXMyMTZfcmVhZGIoRkFTMjE2X0luZm8gKmluZm8sIHVuc2lnbmVkIGludCByZWcpCit7CisJdW5zaWduZWQgaW50IG9mZiA9IHJlZyA8PCBpbmZvLT5zY3NpLmlvX3NoaWZ0OworCXJldHVybiByZWFkYihpbmZvLT5zY3NpLmlvX2Jhc2UgKyBvZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmFzMjE2X3dyaXRlYihGQVMyMTZfSW5mbyAqaW5mbywgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgb2ZmID0gcmVnIDw8IGluZm8tPnNjc2kuaW9fc2hpZnQ7CisJd3JpdGViKHZhbCwgaW5mby0+c2NzaS5pb19iYXNlICsgb2ZmKTsKK30KKworc3RhdGljIHZvaWQgZmFzMjE2X2R1bXBzdGF0ZShGQVMyMTZfSW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIGlzLCBzdGF0LCBpbnN0OworCisJaXMgICA9IGZhczIxNl9yZWFkYihpbmZvLCBSRUdfSVMpOworCXN0YXQgPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX1NUQVQpOworCWluc3QgPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0lOU1QpOworCQorCXByaW50aygiRkFTMjE2OiBDVENMPSUwMlggQ1RDTT0lMDJYIENNRD0lMDJYIFNUQVQ9JTAyWCIKKwkgICAgICAgIiBJTlNUPSUwMlggSVM9JTAyWCBDRklTPSUwMlgiLAorCQlmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NUQ0wpLAorCQlmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NUQ00pLAorCQlmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NNRCksICBzdGF0LCBpbnN0LCBpcywKKwkJZmFzMjE2X3JlYWRiKGluZm8sIFJFR19DRklTKSk7CisJcHJpbnRrKCIgQ05UTDE9JTAyWCBDTlRMMj0lMDJYIENOVEwzPSUwMlggQ1RDSD0lMDJYXG4iLAorCQlmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NOVEwxKSwKKwkJZmFzMjE2X3JlYWRiKGluZm8sIFJFR19DTlRMMiksCisJCWZhczIxNl9yZWFkYihpbmZvLCBSRUdfQ05UTDMpLAorCQlmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NUQ0gpKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfU0NwKFNjc2lfUG9pbnRlciAqU0NwLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKnN1ZmZpeCkKK3sKKwlwcmludGsoIiVzcHRyICVwIHRoaXNfcmVzaWR1YWwgMHgleCBidWZmZXIgJXAgYnVmZmVyc19yZXNpZHVhbCAweCV4JXMiLAorCQlwcmVmaXgsIFNDcC0+cHRyLCBTQ3AtPnRoaXNfcmVzaWR1YWwsIFNDcC0+YnVmZmVyLAorCQlTQ3AtPmJ1ZmZlcnNfcmVzaWR1YWwsIHN1ZmZpeCk7Cit9CisKK3N0YXRpYyB2b2lkIGZhczIxNl9kdW1waW5mbyhGQVMyMTZfSW5mbyAqaW5mbykKK3sKKwlzdGF0aWMgaW50IHVzZWQgPSAwOworCWludCBpOworCisJaWYgKHVzZWQrKykKKwkJcmV0dXJuOworCisJcHJpbnRrKCJGQVMyMTZfSW5mbz1cbiIpOworCXByaW50aygiICB7IG1hZ2ljX3N0YXJ0PSVsWCBob3N0PSVwIFNDcG50PSVwIG9yaWdTQ3BudD0lcFxuIiwKKwkJaW5mby0+bWFnaWNfc3RhcnQsIGluZm8tPmhvc3QsIGluZm8tPlNDcG50LAorCQlpbmZvLT5vcmlnU0NwbnQpOworCXByaW50aygiICAgIHNjc2k9eyBpb19zaGlmdD0lWCBpcnE9JVggY2ZnPXsgJVggJVggJVggJVggfVxuIiwKKwkJaW5mby0+c2NzaS5pb19zaGlmdCwgaW5mby0+c2NzaS5pcnEsCisJCWluZm8tPnNjc2kuY2ZnWzBdLCBpbmZvLT5zY3NpLmNmZ1sxXSwgaW5mby0+c2NzaS5jZmdbMl0sCisJCWluZm8tPnNjc2kuY2ZnWzNdKTsKKwlwcmludGsoIiAgICAgICAgICAgdHlwZT0lcCBwaGFzZT0lWFxuIiwKKwkJaW5mby0+c2NzaS50eXBlLCBpbmZvLT5zY3NpLnBoYXNlKTsKKwlwcmludF9TQ3AoJmluZm8tPnNjc2kuU0NwLCAiICAgICAgICAgICBTQ3A9eyAiLCAiIH1cbiIpOworCXByaW50aygiICAgICAgbXNncyBhc3luY19zdHA9JVggZGlzY29ubmVjdGFibGU9JWQgYWJvcnRpbmc9JWQgfVxuIiwKKwkJaW5mby0+c2NzaS5hc3luY19zdHAsCisJCWluZm8tPnNjc2kuZGlzY29ubmVjdGFibGUsIGluZm8tPnNjc2kuYWJvcnRpbmcpOworCXByaW50aygiICAgIHN0YXRzPXsgcXVldWVzPSVYIHJlbW92ZXM9JVggZmlucz0lWCByZWFkcz0lWCB3cml0ZXM9JVggbWlzY3M9JVhcbiIKKwkgICAgICAgIiAgICAgICAgICAgIGRpc2Nvbm5lY3RzPSVYIGFib3J0cz0lWCBidXNfcmVzZXRzPSVYIGhvc3RfcmVzZXRzPSVYfVxuIiwKKwkJaW5mby0+c3RhdHMucXVldWVzLCBpbmZvLT5zdGF0cy5yZW1vdmVzLCBpbmZvLT5zdGF0cy5maW5zLAorCQlpbmZvLT5zdGF0cy5yZWFkcywgaW5mby0+c3RhdHMud3JpdGVzLCBpbmZvLT5zdGF0cy5taXNjcywKKwkJaW5mby0+c3RhdHMuZGlzY29ubmVjdHMsIGluZm8tPnN0YXRzLmFib3J0cywgaW5mby0+c3RhdHMuYnVzX3Jlc2V0cywKKwkJaW5mby0+c3RhdHMuaG9zdF9yZXNldHMpOworCXByaW50aygiICAgIGlmY2ZnPXsgY2xvY2tyYXRlPSVYIHNlbGVjdF90aW1lb3V0PSVYIGFzeW5jcGVyaW9kPSVYIHN5bmNfbWF4X2RlcHRoPSVYIH1cbiIsCisJCWluZm8tPmlmY2ZnLmNsb2NrcmF0ZSwgaW5mby0+aWZjZmcuc2VsZWN0X3RpbWVvdXQsCisJCWluZm8tPmlmY2ZnLmFzeW5jcGVyaW9kLCBpbmZvLT5pZmNmZy5zeW5jX21heF9kZXB0aCk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlwcmludGsoIiAgICBidXN5bHVuc1slZF09JTA4bHggZGV2WyVkXT17IGRpc2Nvbm5lY3Rfb2s9JWQgc3RwPSVYIHNvZj0lWCBzeW5jX3N0YXRlPSVYIH1cbiIsCisJCQlpLCBpbmZvLT5idXN5bHVuc1tpXSwgaSwKKwkJCWluZm8tPmRldmljZVtpXS5kaXNjb25uZWN0X29rLCBpbmZvLT5kZXZpY2VbaV0uc3RwLAorCQkJaW5mby0+ZGV2aWNlW2ldLnNvZiwgaW5mby0+ZGV2aWNlW2ldLnN5bmNfc3RhdGUpOworCX0KKwlwcmludGsoIiAgICBkbWE9eyB0cmFuc2Zlcl90eXBlPSVYIHNldHVwPSVwIHBzZXVkbz0lcCBzdG9wPSVwIH1cbiIsCisJCWluZm8tPmRtYS50cmFuc2Zlcl90eXBlLCBpbmZvLT5kbWEuc2V0dXAsCisJCWluZm8tPmRtYS5wc2V1ZG8sIGluZm8tPmRtYS5zdG9wKTsKKwlwcmludGsoIiAgICBpbnRlcm5hbF9kb25lPSVYIG1hZ2ljX2VuZD0lbFggfVxuIiwKKwkJaW5mby0+aW50ZXJuYWxfZG9uZSwgaW5mby0+bWFnaWNfZW5kKTsKK30KKworI2lmZGVmIENIRUNLX1NUUlVDVFVSRQorc3RhdGljIHZvaWQgX19mYXMyMTZfY2hlY2ttYWdpYyhGQVMyMTZfSW5mbyAqaW5mbywgY29uc3QgY2hhciAqZnVuYykKK3sKKwlpbnQgY29ycnVwdGlvbiA9IDA7CisJaWYgKGluZm8tPm1hZ2ljX3N0YXJ0ICE9IE1BR0lDKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIkZBUzIxNiBFcnJvcjogbWFnaWMgYXQgc3RhcnQgY29ycnVwdGVkXG4iKTsKKwkJY29ycnVwdGlvbisrOworCX0KKwlpZiAoaW5mby0+bWFnaWNfZW5kICE9IE1BR0lDKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIkZBUzIxNiBFcnJvcjogbWFnaWMgYXQgZW5kIGNvcnJ1cHRlZFxuIik7CisJCWNvcnJ1cHRpb24rKzsKKwl9CisJaWYgKGNvcnJ1cHRpb24pIHsKKwkJZmFzMjE2X2R1bXBpbmZvKGluZm8pOworCQlwYW5pYygic2NzaSBtZW1vcnkgc3BhY2UgY29ycnVwdGVkIGluICVzIiwgZnVuYyk7CisJfQorfQorI2RlZmluZSBmYXMyMTZfY2hlY2ttYWdpYyhpbmZvKSBfX2ZhczIxNl9jaGVja21hZ2ljKChpbmZvKSwgX19GVU5DVElPTl9fKQorI2Vsc2UKKyNkZWZpbmUgZmFzMjE2X2NoZWNrbWFnaWMoaW5mbykKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciAqZmFzMjE2X2J1c19waGFzZShpbnQgc3RhdCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqcGhhc2VzW10gPSB7CisJCSJEQVRBIE9VVCIsICJEQVRBIElOIiwKKwkJIkNPTU1BTkQiLCAiU1RBVFVTIiwKKwkJIk1JU0MgT1VUIiwgIk1JU0MgSU4iLAorCQkiTUVTRyBPVVQiLCAiTUVTRyBJTiIKKwl9OworCisJcmV0dXJuIHBoYXNlc1tzdGF0ICYgU1RBVF9CVVNNQVNLXTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmZhczIxNl9kcnZfcGhhc2UoRkFTMjE2X0luZm8gKmluZm8pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKnBoYXNlc1tdID0geworCQlbUEhBU0VfSURMRV0JCT0gImlkbGUiLAorCQlbUEhBU0VfU0VMRUNUSU9OXQk9ICJzZWxlY3Rpb24iLAorCQlbUEhBU0VfQ09NTUFORF0JCT0gImNvbW1hbmQiLAorCQlbUEhBU0VfREFUQU9VVF0JCT0gImRhdGEgb3V0IiwKKwkJW1BIQVNFX0RBVEFJTl0JCT0gImRhdGEgaW4iLAorCQlbUEhBU0VfTVNHSU5dCQk9ICJtZXNzYWdlIGluIiwKKwkJW1BIQVNFX01TR0lOX0RJU0NPTk5FQ1RdPSAiZGlzY29ubmVjdCIsCisJCVtQSEFTRV9NU0dPVVRfRVhQRUNUXQk9ICJleHBlY3QgbWVzc2FnZSBvdXQiLAorCQlbUEhBU0VfTVNHT1VUXQkJPSAibWVzc2FnZSBvdXQiLAorCQlbUEhBU0VfU1RBVFVTXQkJPSAic3RhdHVzIiwKKwkJW1BIQVNFX0RPTkVdCQk9ICJkb25lIiwKKwl9OworCisJaWYgKGluZm8tPnNjc2kucGhhc2UgPCBBUlJBWV9TSVpFKHBoYXNlcykgJiYKKwkgICAgcGhhc2VzW2luZm8tPnNjc2kucGhhc2VdKQorCQlyZXR1cm4gcGhhc2VzW2luZm8tPnNjc2kucGhhc2VdOworCXJldHVybiAiPz8/IjsKK30KKworc3RhdGljIGNoYXIgZmFzMjE2X3RhcmdldChGQVMyMTZfSW5mbyAqaW5mbykKK3sKKwlpZiAoaW5mby0+U0NwbnQpCisJCXJldHVybiAnMCcgKyBpbmZvLT5TQ3BudC0+ZGV2aWNlLT5pZDsKKwllbHNlCisJCXJldHVybiAnSCc7Cit9CisKK3N0YXRpYyB2b2lkCitmYXMyMTZfZG9fbG9nKEZBUzIxNl9JbmZvICppbmZvLCBjaGFyIHRhcmdldCwgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsxMDI0XTsKKworCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFwKTsKKwlwcmludGsoInNjc2klZC4lYzogJXMiLCBpbmZvLT5ob3N0LT5ob3N0X25vLCB0YXJnZXQsIGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkCitmYXMyMTZfbG9nX2NvbW1hbmQoRkFTMjE2X0luZm8gKmluZm8sIGludCBsZXZlbCwgU2NzaV9DbW5kICpTQ3BudCwgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJaWYgKGxldmVsICE9IDAgJiYgIShsZXZlbCAmIGxldmVsX21hc2spKQorCQlyZXR1cm47CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWZhczIxNl9kb19sb2coaW5mbywgJzAnICsgU0NwbnQtPmRldmljZS0+aWQsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJcHJpbnRrKCIgQ0RCOiAiKTsKKwlwcmludF9jb21tYW5kKFNDcG50LT5jbW5kKTsKK30KKworc3RhdGljIHZvaWQKK2ZhczIxNl9sb2dfdGFyZ2V0KEZBUzIxNl9JbmZvICppbmZvLCBpbnQgbGV2ZWwsIGludCB0YXJnZXQsIGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCWlmIChsZXZlbCAhPSAwICYmICEobGV2ZWwgJiBsZXZlbF9tYXNrKSkKKwkJcmV0dXJuOworCisJaWYgKHRhcmdldCA8IDApCisJCXRhcmdldCA9ICdIJzsKKwllbHNlCisJCXRhcmdldCArPSAnMCc7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWZhczIxNl9kb19sb2coaW5mbywgdGFyZ2V0LCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIHZvaWQgZmFzMjE2X2xvZyhGQVMyMTZfSW5mbyAqaW5mbywgaW50IGxldmVsLCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwlpZiAobGV2ZWwgIT0gMCAmJiAhKGxldmVsICYgbGV2ZWxfbWFzaykpCisJCXJldHVybjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJZmFzMjE2X2RvX2xvZyhpbmZvLCBmYXMyMTZfdGFyZ2V0KGluZm8pLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCXByaW50aygiXG4iKTsKK30KKworI2RlZmluZSBQSF9TSVpFCTMyCisKK3N0YXRpYyBzdHJ1Y3QgeyBpbnQgc3RhdCwgc3NyLCBpc3IsIHBoOyB9IHBoX2xpc3RbUEhfU0laRV07CitzdGF0aWMgaW50IHBoX3B0cjsKKworc3RhdGljIHZvaWQgYWRkX2RlYnVnX2xpc3QoaW50IHN0YXQsIGludCBzc3IsIGludCBpc3IsIGludCBwaCkKK3sKKwlwaF9saXN0W3BoX3B0cl0uc3RhdCA9IHN0YXQ7CisJcGhfbGlzdFtwaF9wdHJdLnNzciA9IHNzcjsKKwlwaF9saXN0W3BoX3B0cl0uaXNyID0gaXNyOworCXBoX2xpc3RbcGhfcHRyXS5waCA9IHBoOworCisJcGhfcHRyID0gKHBoX3B0ciArIDEpICYgKFBIX1NJWkUtMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeyBpbnQgY29tbWFuZDsgdm9pZCAqZnJvbTsgfSBjbWRfbGlzdFs4XTsKK3N0YXRpYyBpbnQgY21kX3B0cjsKKworc3RhdGljIHZvaWQgZmFzMjE2X2NtZChGQVMyMTZfSW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNvbW1hbmQpCit7CisJY21kX2xpc3RbY21kX3B0cl0uY29tbWFuZCA9IGNvbW1hbmQ7CisJY21kX2xpc3RbY21kX3B0cl0uZnJvbSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKworCWNtZF9wdHIgPSAoY21kX3B0ciArIDEpICYgNzsKKworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NNRCwgY29tbWFuZCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2RlYnVnX2xpc3Qodm9pZCkKK3sKKwlpbnQgaTsKKworCWkgPSBwaF9wdHI7CisKKwlwcmludGsoS0VSTl9FUlIgIlNDU0kgSVJRIHRyYWlsXG4iKTsKKwlkbyB7CisJCXByaW50aygiICUwMng6JTAyeDolMDJ4OiUxeCIsCisJCQlwaF9saXN0W2ldLnN0YXQsIHBoX2xpc3RbaV0uc3NyLAorCQkJcGhfbGlzdFtpXS5pc3IsIHBoX2xpc3RbaV0ucGgpOworCQlpID0gKGkgKyAxKSAmIChQSF9TSVpFIC0gMSk7CisJCWlmICgoKGkgXiBwaF9wdHIpICYgNykgPT0gMCkKKwkJCXByaW50aygiXG4iKTsKKwl9IHdoaWxlIChpICE9IHBoX3B0cik7CisJaWYgKChpIF4gcGhfcHRyKSAmIDcpCisJCXByaW50aygiXG4iKTsKKworCWkgPSBjbWRfcHRyOworCXByaW50ayhLRVJOX0VSUiAiRkFTMjE2IGNvbW1hbmRzOiAiKTsKKwlkbyB7CisJCXByaW50aygiJTAyeDolcCAiLCBjbWRfbGlzdFtpXS5jb21tYW5kLCBjbWRfbGlzdFtpXS5mcm9tKTsKKwkJaSA9IChpICsgMSkgJiA3OworCX0gd2hpbGUgKGkgIT0gY21kX3B0cik7CisJcHJpbnRrKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBmYXMyMTZfZG9uZShGQVMyMTZfSW5mbyAqaW5mbywgdW5zaWduZWQgaW50IHJlc3VsdCk7CisKKy8qKgorICogZmFzMjE2X2dldF9sYXN0X21zZyAtIHJldHJpdmUgbGFzdCBtZXNzYWdlIGZyb20gdGhlIGxpc3QKKyAqIEBpbmZvOiBpbnRlcmZhY2UgdG8gc2VhcmNoCisgKiBAcG9zOiBjdXJyZW50IGZpZm8gcG9zaXRpb24KKyAqCisgKiBSZXRyaWV2ZSBhIGxhc3QgbWVzc2FnZSBmcm9tIHRoZSBsaXN0LCB1c2luZyBwb3NpdGlvbiBpbiBmaWZvLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0CitmYXMyMTZfZ2V0X2xhc3RfbXNnKEZBUzIxNl9JbmZvICppbmZvLCBpbnQgcG9zKQoreworCXVuc2lnbmVkIHNob3J0IHBhY2tlZF9tc2cgPSBOT1A7CisJc3RydWN0IG1lc3NhZ2UgKm1zZzsKKwlpbnQgbXNnbnIgPSAwOworCisJd2hpbGUgKChtc2cgPSBtc2dxdWV1ZV9nZXRtc2coJmluZm8tPnNjc2kubXNncywgbXNnbnIrKykpICE9IE5VTEwpIHsKKwkJaWYgKHBvcyA+PSBtc2ctPmZpZm8pCisJCQlicmVhazsKKwl9CisKKwlpZiAobXNnKSB7CisJCWlmIChtc2ctPm1zZ1swXSA9PSBFWFRFTkRFRF9NRVNTQUdFKQorCQkJcGFja2VkX21zZyA9IEVYVEVOREVEX01FU1NBR0UgfCBtc2ctPm1zZ1syXSA8PCA4OworCQllbHNlCisJCQlwYWNrZWRfbXNnID0gbXNnLT5tc2dbMF07CisJfQorCisJZmFzMjE2X2xvZyhpbmZvLCBMT0dfTUVTU0FHRVMsCisJCSJNZXNzYWdlOiAlMDR4IGZvdW5kIGF0IHBvc2l0aW9uICUwMnhcbiIsIHBhY2tlZF9tc2csIHBvcyk7CisKKwlyZXR1cm4gcGFja2VkX21zZzsKK30KKworLyoqCisgKiBmYXMyMTZfc3luY3BlcmlvZCAtIGNhbGN1bGF0ZSBTVFAgcmVnaXN0ZXIgdmFsdWUKKyAqIEBpbmZvOiBzdGF0ZSBzdHJ1Y3R1cmUgZm9yIGludGVyZmFjZSBjb25uZWN0ZWQgdG8gZGV2aWNlCisgKiBAbnM6IHBlcmlvZCBpbiBucyAoYmV0d2VlbiBzdWJzZXF1ZW50IGJ5dGVzKQorICoKKyAqIENhbGN1bGF0ZSB2YWx1ZSB0byBiZSBsb2FkZWQgaW50byB0aGUgU1RQIHJlZ2lzdGVyIGZvciBhIGdpdmVuIHBlcmlvZAorICogaW4gbnMuIFJldHVybnMgYSB2YWx1ZSBzdWl0YWJsZSBmb3IgUkVHX1NUUC4KKyAqLworc3RhdGljIGludCBmYXMyMTZfc3luY3BlcmlvZChGQVMyMTZfSW5mbyAqaW5mbywgaW50IG5zKQoreworCWludCB2YWx1ZSA9IChpbmZvLT5pZmNmZy5jbG9ja3JhdGUgKiBucykgLyAxMDAwOworCisJZmFzMjE2X2NoZWNrbWFnaWMoaW5mbyk7CisKKwlpZiAodmFsdWUgPCA0KQorCQl2YWx1ZSA9IDQ7CisJZWxzZSBpZiAodmFsdWUgPiAzNSkKKwkJdmFsdWUgPSAzNTsKKworCXJldHVybiB2YWx1ZSAmIDMxOworfQorCisvKioKKyAqIGZhczIxNl9zZXRfc3luYyAtIHNldHVwIEZBUzIxNiBjaGlwIGZvciBzcGVjaWZpZWQgdHJhbnNmZXIgcGVyaW9kLgorICogQGluZm86IHN0YXRlIHN0cnVjdHVyZSBmb3IgaW50ZXJmYWNlIGNvbm5lY3RlZCB0byBkZXZpY2UKKyAqIEB0YXJnZXQ6IHRhcmdldAorICoKKyAqIENvcnJlY3RseSBzZXR1cCBGQVMyMTYgY2hpcCBmb3Igc3BlY2lmaWVkIHRyYW5zZmVyIHBlcmlvZC4KKyAqIE5vdGVzICAgOiB3ZSBuZWVkIHRvIHN3aXRjaCB0aGUgY2hpcCBvdXQgb2YgRkFTVFNDU0kgbW9kZSBpZiB3ZSBoYXZlCisgKiAgICAgICAgICAgYSB0cmFuc2ZlciBwZXJpb2QgPj0gMjAwbnMgLSBvdGhlcndpc2UgdGhlIGNoaXAgd2lsbCB2aW9sYXRlCisgKiAgICAgICAgICAgdGhlIFNDU0kgdGltaW5ncy4KKyAqLworc3RhdGljIHZvaWQgZmFzMjE2X3NldF9zeW5jKEZBUzIxNl9JbmZvICppbmZvLCBpbnQgdGFyZ2V0KQoreworCXVuc2lnbmVkIGludCBjbnRsMzsKKworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX1NPRiwgaW5mby0+ZGV2aWNlW3RhcmdldF0uc29mKTsKKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19TVFAsIGluZm8tPmRldmljZVt0YXJnZXRdLnN0cCk7CisKKwljbnRsMyA9IGluZm8tPnNjc2kuY2ZnWzJdOworCWlmIChpbmZvLT5kZXZpY2VbdGFyZ2V0XS5wZXJpb2QgPj0gKDIwMCAvIDQpKQorCQljbnRsMyA9IGNudGwzICYgfkNOVEwzX0ZBU1RTQ1NJOworCisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ05UTDMsIGNudGwzKTsKK30KKworLyogU3luY2hyb25vdXMgdHJhbnNmZXIgc3VwcG9ydAorICoKKyAqIE5vdGU6IFRoZSBTQ1NJIElJIHIxMCBzcGVjIHNheXMgKDUuNi4xMik6CisgKgorICogICgyKSAgRHVlIHRvIGhpc3RvcmljYWwgcHJvYmxlbXMgd2l0aCBlYXJseSBob3N0IGFkYXB0ZXJzIHRoYXQgY291bGQKKyAqICBub3QgYWNjZXB0IGFuIFNEVFIgbWVzc2FnZSwgc29tZSB0YXJnZXRzIG1heSBub3QgaW5pdGlhdGUgc3luY2hyb25vdXMKKyAqICBuZWdvdGlhdGlvbiBhZnRlciBhIHBvd2VyIGN5Y2xlIGFzIHJlcXVpcmVkIGJ5IHRoaXMgc3RhbmRhcmQuICBIb3N0CisgKiAgYWRhcHRlcnMgdGhhdCBzdXBwb3J0IHN5bmNocm9ub3VzIG1vZGUgbWF5IGF2b2lkIHRoZSBlbnN1aW5nIGZhaWx1cmUKKyAqICBtb2RlcyB3aGVuIHRoZSB0YXJnZXQgaXMgaW5kZXBlbmRlbnRseSBwb3dlciBjeWNsZWQgYnkgaW5pdGlhdGluZyBhCisgKiAgc3luY2hyb25vdXMgbmVnb3RpYXRpb24gb24gZWFjaCBSRVFVRVNUIFNFTlNFIGFuZCBJTlFVSVJZIGNvbW1hbmQuCisgKiAgVGhpcyBhcHByb2FjaCBpbmNyZWFzZXMgdGhlIFNDU0kgYnVzIG92ZXJoZWFkIGFuZCBpcyBub3QgcmVjb21tZW5kZWQKKyAqICBmb3IgbmV3IGltcGxlbWVudGF0aW9ucy4gIFRoZSBjb3JyZWN0IG1ldGhvZCBpcyB0byByZXNwb25kIHRvIGFuCisgKiAgU0RUUiBtZXNzYWdlIHdpdGggYSBNRVNTQUdFIFJFSkVDVCBtZXNzYWdlIGlmIHRoZSBlaXRoZXIgdGhlCisgKiAgaW5pdGlhdG9yIG9yIHRhcmdldCBkZXZpY2VzIGRvZXMgbm90IHN1cHBvcnQgc3luY2hyb25vdXMgdHJhbnNmZXJzCisgKiAgb3IgZG9lcyBub3Qgd2FudCB0byBuZWdvdGlhdGUgZm9yIHN5bmNocm9ub3VzIHRyYW5zZmVycyBhdCB0aGUgdGltZS4KKyAqICBVc2luZyB0aGUgY29ycmVjdCBtZXRob2QgYXNzdXJlcyBjb21wYXRpYmlsaXR5IHdpdGggd2lkZSBkYXRhCisgKiAgdHJhbnNmZXJzIGFuZCBmdXR1cmUgZW5oYW5jZW1lbnRzLgorICoKKyAqIFdlIHdpbGwgYWx3YXlzIGluaXRpYXRlIGEgc3luY2hyb25vdXMgdHJhbnNmZXIgbmVnb3RpYXRpb24gcmVxdWVzdCBvbgorICogZXZlcnkgSU5RVUlSWSBvciBSRVFVRVNUIFNFTlNFIG1lc3NhZ2UsIHVubGVzcyB0aGUgdGFyZ2V0IGl0c2VsZiBoYXMKKyAqIGF0IHNvbWUgcG9pbnQgcGVyZm9ybWVkIGEgc3luY2hyb25vdXMgdHJhbnNmZXIgbmVnb3RpYXRpb24gcmVxdWVzdCwgb3IKKyAqIHdlIGhhdmUgc3luY2hyb25vdXMgdHJhbnNmZXJzIGRpc2FibGVkIGZvciB0aGlzIGRldmljZS4KKyAqLworCisvKioKKyAqIGZhczIxNl9oYW5kbGVzeW5jIC0gSGFuZGxlIGEgc3luY2hyb25vdXMgdHJhbnNmZXIgbWVzc2FnZQorICogQGluZm86IHN0YXRlIHN0cnVjdHVyZSBmb3IgaW50ZXJmYWNlCisgKiBAbXNnOiBtZXNzYWdlIGZyb20gdGFyZ2V0CisgKgorICogSGFuZGxlIGEgc3luY2hyb25vdXMgdHJhbnNmZXIgbWVzc2FnZSBmcm9tIHRoZSB0YXJnZXQKKyAqLworc3RhdGljIHZvaWQgZmFzMjE2X2hhbmRsZXN5bmMoRkFTMjE2X0luZm8gKmluZm8sIGNoYXIgKm1zZykKK3sKKwlzdHJ1Y3QgZmFzMjE2X2RldmljZSAqZGV2ID0gJmluZm8tPmRldmljZVtpbmZvLT5TQ3BudC0+ZGV2aWNlLT5pZF07CisJZW51bSB7IHN5bmMsIGFzeW5jLCBub25lLCByZWplY3QgfSByZXMgPSBub25lOworCisjaWZkZWYgU0NTSTJfU1lOQworCXN3aXRjaCAobXNnWzBdKSB7CisJY2FzZSBNRVNTQUdFX1JFSkVDVDoKKwkJLyogU3luY2hyb25vdXMgdHJhbnNmZXIgcmVxdWVzdCBmYWlsZWQuCisJCSAqIE5vdGU6IFNDU0kgSUkgcjEwOgorCQkgKgorCQkgKiAgU0NTSSBkZXZpY2VzIHRoYXQgYXJlIGNhcGFibGUgb2Ygc3luY2hyb25vdXMKKwkJICogIGRhdGEgdHJhbnNmZXJzIHNoYWxsIG5vdCByZXNwb25kIHRvIGFuIFNEVFIKKwkJICogIG1lc3NhZ2Ugd2l0aCBhIE1FU1NBR0UgUkVKRUNUIG1lc3NhZ2UuCisJCSAqCisJCSAqIEhlbmNlLCBpZiB3ZSBnZXQgdGhpcyBjb25kaXRpb24sIHdlIGRpc2FibGUKKwkJICogbmVnb3RpYXRpb24gZm9yIHRoaXMgZGV2aWNlLgorCQkgKi8KKwkJaWYgKGRldi0+c3luY19zdGF0ZSA9PSBuZWdfaW5wcm9ncmVzcykgeworCQkJZGV2LT5zeW5jX3N0YXRlID0gbmVnX2ludmFsaWQ7CisJCQlyZXMgPSBhc3luYzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgRVhURU5ERURfTUVTU0FHRToKKwkJc3dpdGNoIChkZXYtPnN5bmNfc3RhdGUpIHsKKwkJLyogV2UgZG9uJ3QgYWNjZXB0IHN5bmNocm9ub3VzIHRyYW5zZmVyIHJlcXVlc3RzLgorCQkgKiBSZXNwb25kIHdpdGggYSBNRVNTQUdFX1JFSkVDVCB0byBwcmV2ZW50IGEKKwkJICogc3luY2hyb25vdXMgdHJhbnNmZXIgYWdyZWVtZW50IGZyb20gYmVpbmcgcmVhY2hlZC4KKwkJICovCisJCWNhc2UgbmVnX2ludmFsaWQ6CisJCQlyZXMgPSByZWplY3Q7CisJCQlicmVhazsKKworCQkvKiBXZSB3ZXJlIG5vdCBuZWdvdGlhdGluZyBhIHN5bmNocm9ub3VzIHRyYW5zZmVyLAorCQkgKiBidXQgdGhlIGRldmljZSBzZW50IHVzIGEgbmVnb3RpYXRpb24gcmVxdWVzdC4KKwkJICogSG9ub3VyIHRoZSByZXF1ZXN0IGJ5IHNlbmRpbmcgYmFjayBhIFNEVFIKKwkJICogbWVzc2FnZSBjb250YWluaW5nIG91ciBjYXBhYmlsaXR5LCBsaW1pdGVkIGJ5CisJCSAqIHRoZSB0YXJnZXRzIGNhcGFiaWxpdHkuCisJCSAqLworCQlkZWZhdWx0OgorCQkJZmFzMjE2X2NtZChpbmZvLCBDTURfU0VUQVROKTsKKwkJCWlmIChtc2dbNF0gPiBpbmZvLT5pZmNmZy5zeW5jX21heF9kZXB0aCkKKwkJCQltc2dbNF0gPSBpbmZvLT5pZmNmZy5zeW5jX21heF9kZXB0aDsKKwkJCWlmIChtc2dbM10gPCAxMDAwIC8gaW5mby0+aWZjZmcuY2xvY2tyYXRlKQorCQkJCW1zZ1szXSA9IDEwMDAgLyBpbmZvLT5pZmNmZy5jbG9ja3JhdGU7CisKKwkJCW1zZ3F1ZXVlX2ZsdXNoKCZpbmZvLT5zY3NpLm1zZ3MpOworCQkJbXNncXVldWVfYWRkbXNnKCZpbmZvLT5zY3NpLm1zZ3MsIDUsCisJCQkJCUVYVEVOREVEX01FU1NBR0UsIDMsIEVYVEVOREVEX1NEVFIsCisJCQkJCW1zZ1szXSwgbXNnWzRdKTsKKwkJCWluZm8tPnNjc2kucGhhc2UgPSBQSEFTRV9NU0dPVVRfRVhQRUNUOworCisJCQkvKiBUaGlzIGlzIHdyb25nLiAgVGhlIGFncmVlbWVudCBpcyBub3QgaW4gZWZmZWN0CisJCQkgKiB1bnRpbCB0aGlzIG1lc3NhZ2UgaXMgYWNjZXB0ZWQgYnkgdGhlIGRldmljZQorCQkJICovCisJCQlkZXYtPnN5bmNfc3RhdGUgPSBuZWdfdGFyZ2NvbXBsZXRlOworCQkJcmVzID0gc3luYzsKKwkJCWJyZWFrOworCisJCS8qIFdlIGluaXRpYXRlZCB0aGUgc3luY2hyb25vdXMgdHJhbnNmZXIgbmVnb3RpYXRpb24sCisJCSAqIGFuZCBoYXZlIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBhIHJlc3BvbnNlIGZyb20gdGhlCisJCSAqIHRhcmdldC4gIFRoZSBzeW5jaHJvbm91cyB0cmFuc2ZlciBhZ3JlZW1lbnQgaGFzIGJlZW4KKwkJICogcmVhY2hlZC4gIE5vdGU6IGlmIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYXJlIG91dCBvZiBvdXIKKwkJICogYm91bmRzLCB3ZSBtdXN0IHJlamVjdCB0aGUgbWVzc2FnZS4KKwkJICovCisJCWNhc2UgbmVnX2lucHJvZ3Jlc3M6CisJCQlyZXMgPSByZWplY3Q7CisJCQlpZiAobXNnWzRdIDw9IGluZm8tPmlmY2ZnLnN5bmNfbWF4X2RlcHRoICYmCisJCQkgICAgbXNnWzNdID49IDEwMDAgLyBpbmZvLT5pZmNmZy5jbG9ja3JhdGUpIHsKKwkJCQlkZXYtPnN5bmNfc3RhdGUgPSBuZWdfY29tcGxldGU7CisJCQkJcmVzID0gc3luYzsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorI2Vsc2UKKwlyZXMgPSByZWplY3Q7CisjZW5kaWYKKworCXN3aXRjaCAocmVzKSB7CisJY2FzZSBzeW5jOgorCQlkZXYtPnBlcmlvZCA9IG1zZ1szXTsKKwkJZGV2LT5zb2YgICAgPSBtc2dbNF07CisJCWRldi0+c3RwICAgID0gZmFzMjE2X3N5bmNwZXJpb2QoaW5mbywgbXNnWzNdICogNCk7CisJCWZhczIxNl9zZXRfc3luYyhpbmZvLCBpbmZvLT5TQ3BudC0+ZGV2aWNlLT5pZCk7CisJCWJyZWFrOworCisJY2FzZSByZWplY3Q6CisJCWZhczIxNl9jbWQoaW5mbywgQ01EX1NFVEFUTik7CisJCW1zZ3F1ZXVlX2ZsdXNoKCZpbmZvLT5zY3NpLm1zZ3MpOworCQltc2dxdWV1ZV9hZGRtc2coJmluZm8tPnNjc2kubXNncywgMSwgTUVTU0FHRV9SRUpFQ1QpOworCQlpbmZvLT5zY3NpLnBoYXNlID0gUEhBU0VfTVNHT1VUX0VYUEVDVDsKKworCWNhc2UgYXN5bmM6CisJCWRldi0+cGVyaW9kID0gaW5mby0+aWZjZmcuYXN5bmNwZXJpb2QgLyA0OworCQlkZXYtPnNvZiAgICA9IDA7CisJCWRldi0+c3RwICAgID0gaW5mby0+c2NzaS5hc3luY19zdHA7CisJCWZhczIxNl9zZXRfc3luYyhpbmZvLCBpbmZvLT5TQ3BudC0+ZGV2aWNlLT5pZCk7CisJCWJyZWFrOworCisJY2FzZSBub25lOgorCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogZmFzMjE2X3VwZGF0ZXB0cnMgLSB1cGRhdGUgZGF0YSBwb2ludGVycyBhZnRlciB0cmFuc2ZlciBzdXNwZW5kZWQvcGF1c2VkCisgKiBAaW5mbzogaW50ZXJmYWNlJ3MgbG9jYWwgcG9pbnRlciB0byB1cGRhdGUKKyAqIEBieXRlc190cmFuc2ZlcnJlZDogbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkCisgKgorICogVXBkYXRlIGRhdGEgcG9pbnRlcnMgYWZ0ZXIgdHJhbnNmZXIgc3VzcGVuZGVkL3BhdXNlZAorICovCitzdGF0aWMgdm9pZCBmYXMyMTZfdXBkYXRlcHRycyhGQVMyMTZfSW5mbyAqaW5mbywgaW50IGJ5dGVzX3RyYW5zZmVycmVkKQoreworCVNjc2lfUG9pbnRlciAqU0NwID0gJmluZm8tPnNjc2kuU0NwOworCisJZmFzMjE2X2NoZWNrbWFnaWMoaW5mbyk7CisKKwlCVUdfT04oYnl0ZXNfdHJhbnNmZXJyZWQgPCAwKTsKKworCWluZm8tPlNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gLT0gYnl0ZXNfdHJhbnNmZXJyZWQ7CisKKwl3aGlsZSAoYnl0ZXNfdHJhbnNmZXJyZWQgIT0gMCkgeworCQlpZiAoU0NwLT50aGlzX3Jlc2lkdWFsID4gYnl0ZXNfdHJhbnNmZXJyZWQpCisJCQlicmVhazsKKwkJLyoKKwkJICogV2UgaGF2ZSB1c2VkIHVwIHRoaXMgYnVmZmVyLiAgTW92ZSBvbiB0byB0aGUKKwkJICogbmV4dCBidWZmZXIuCisJCSAqLworCQlieXRlc190cmFuc2ZlcnJlZCAtPSBTQ3AtPnRoaXNfcmVzaWR1YWw7CisJCWlmICghbmV4dF9TQ3AoU0NwKSAmJiBieXRlc190cmFuc2ZlcnJlZCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkLiVjOiBvdXQgb2YgYnVmZmVyc1xuIiwKKwkJCQlpbmZvLT5ob3N0LT5ob3N0X25vLCAnMCcgKyBpbmZvLT5TQ3BudC0+ZGV2aWNlLT5pZCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlTQ3AtPnRoaXNfcmVzaWR1YWwgLT0gYnl0ZXNfdHJhbnNmZXJyZWQ7CisJaWYgKFNDcC0+dGhpc19yZXNpZHVhbCkKKwkJU0NwLT5wdHIgKz0gYnl0ZXNfdHJhbnNmZXJyZWQ7CisJZWxzZQorCQlTQ3AtPnB0ciA9IE5VTEw7Cit9CisKKy8qKgorICogZmFzMjE2X3BpbyAtIHRyYW5zZmVyIGRhdGEgb2ZmIG9mL29uIHRvIGNhcmQgdXNpbmcgcHJvZ3JhbW1lZCBJTworICogQGluZm86IGludGVyZmFjZSB0byB0cmFuc2ZlciBkYXRhIHRvL2Zyb20KKyAqIEBkaXJlY3Rpb246IGRpcmVjdGlvbiB0byB0cmFuc2ZlciBkYXRhIChETUFfT1VUL0RNQV9JTikKKyAqCisgKiBUcmFuc2ZlciBkYXRhIG9mZiBvZi9vbiB0byBjYXJkIHVzaW5nIHByb2dyYW1tZWQgSU8uCisgKiBOb3RlczogdGhpcyBpcyBpbmNyZWRpYmx5IHNsb3cuCisgKi8KK3N0YXRpYyB2b2lkIGZhczIxNl9waW8oRkFTMjE2X0luZm8gKmluZm8sIGZhc2RtYWRpcl90IGRpcmVjdGlvbikKK3sKKwlTY3NpX1BvaW50ZXIgKlNDcCA9ICZpbmZvLT5zY3NpLlNDcDsKKworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCisJaWYgKGRpcmVjdGlvbiA9PSBETUFfT1VUKQorCQlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19GRiwgZ2V0X25leHRfU0NwX2J5dGUoU0NwKSk7CisJZWxzZQorCQlwdXRfbmV4dF9TQ3BfYnl0ZShTQ3AsIGZhczIxNl9yZWFkYihpbmZvLCBSRUdfRkYpKTsKKworCWlmIChTQ3AtPnRoaXNfcmVzaWR1YWwgPT0gMCkKKwkJbmV4dF9TQ3AoU0NwKTsKK30KKworc3RhdGljIHZvaWQgZmFzMjE2X3NldF9zdGMoRkFTMjE2X0luZm8gKmluZm8sIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfU1RDTCwgbGVuZ3RoKTsKKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19TVENNLCBsZW5ndGggPj4gOCk7CisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfU1RDSCwgbGVuZ3RoID4+IDE2KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBmYXMyMTZfZ2V0X2N0YyhGQVMyMTZfSW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gZmFzMjE2X3JlYWRiKGluZm8sIFJFR19DVENMKSArCisJICAgICAgIChmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NUQ00pIDw8IDgpICsKKwkgICAgICAgKGZhczIxNl9yZWFkYihpbmZvLCBSRUdfQ1RDSCkgPDwgMTYpOworfQorCisvKioKKyAqIGZhczIxNl9jbGVhbnVwdHJhbnNmZXIgLSBjbGVhbiB1cCBhZnRlciBhIHRyYW5zZmVyIGhhcyBjb21wbGV0ZWQuCisgKiBAaW5mbzogaW50ZXJmYWNlIHRvIGNsZWFuIHVwCisgKgorICogVXBkYXRlIHRoZSBkYXRhIHBvaW50ZXJzIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkCisgKiBvbiB0aGUgU0NTSSBidXMuCisgKi8KK3N0YXRpYyB2b2lkIGZhczIxNl9jbGVhbnVwdHJhbnNmZXIoRkFTMjE2X0luZm8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyB0b3RhbCwgcmVzaWR1YWwsIGZpZm87CisJZmFzZG1hdHlwZV90IGRtYXR5cGUgPSBpbmZvLT5kbWEudHJhbnNmZXJfdHlwZTsKKworCWluZm8tPmRtYS50cmFuc2Zlcl90eXBlID0gZmFzZG1hX25vbmU7CisKKwkvKgorCSAqIFBJTyB0cmFuc2ZlcnMgZG8gbm90IG5lZWQgdG8gYmUgY2xlYW5lZCB1cC4KKwkgKi8KKwlpZiAoZG1hdHlwZSA9PSBmYXNkbWFfcGlvIHx8IGRtYXR5cGUgPT0gZmFzZG1hX25vbmUpCisJCXJldHVybjsKKworCWlmIChkbWF0eXBlID09IGZhc2RtYV9yZWFsX2FsbCkKKwkJdG90YWwgPSBpbmZvLT5TQ3BudC0+cmVxdWVzdF9idWZmbGVuOworCWVsc2UKKwkJdG90YWwgPSBpbmZvLT5zY3NpLlNDcC50aGlzX3Jlc2lkdWFsOworCisJcmVzaWR1YWwgPSBmYXMyMTZfZ2V0X2N0YyhpbmZvKTsKKworCWZpZm8gPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NGSVMpICYgQ0ZJU19DRjsKKworCWZhczIxNl9sb2coaW5mbywgTE9HX0JVRkZFUiwgImNsZWFuaW5nIHVwIGZyb20gcHJldmlvdXMgIgorCQkgICAidHJhbnNmZXI6IGxlbmd0aCAweCUwNngsIHJlc2lkdWFsIDB4JXgsIGZpZm8gJWQiLAorCQkgICB0b3RhbCwgcmVzaWR1YWwsIGZpZm8pOworCisJLyoKKwkgKiBJZiB3ZSB3ZXJlIHBlcmZvcm1pbmcgRGF0YS1PdXQsIHRoZSB0cmFuc2ZlciBjb3VudGVyCisJICogY291bnRzIGRvd24gZWFjaCB0aW1lIGEgYnl0ZSBpcyB0cmFuc2ZlcnJlZCBieSB0aGUKKwkgKiBob3N0IHRvIHRoZSBGSUZPLiAgVGhpcyBtZWFucyB3ZSBtdXN0IGluY2x1ZGUgdGhlCisJICogYnl0ZXMgbGVmdCBpbiB0aGUgRklGTyBmcm9tIHRoZSB0cmFuc2ZlciBjb3VudGVyLgorCSAqLworCWlmIChpbmZvLT5zY3NpLnBoYXNlID09IFBIQVNFX0RBVEFPVVQpCisJCXJlc2lkdWFsICs9IGZpZm87CisKKwlmYXMyMTZfdXBkYXRlcHRycyhpbmZvLCB0b3RhbCAtIHJlc2lkdWFsKTsKK30KKworLyoqCisgKiBmYXMyMTZfdHJhbnNmZXIgLSBQZXJmb3JtIGEgRE1BL1BJTyB0cmFuc2ZlciBvZmYgb2Yvb24gdG8gY2FyZAorICogQGluZm86IGludGVyZmFjZSBmcm9tIHdoaWNoIGRldmljZSBkaXNjb25uZWN0ZWQgZnJvbQorICoKKyAqIFN0YXJ0IGEgRE1BL1BJTyB0cmFuc2ZlciBvZmYgb2Yvb24gdG8gY2FyZAorICovCitzdGF0aWMgdm9pZCBmYXMyMTZfdHJhbnNmZXIoRkFTMjE2X0luZm8gKmluZm8pCit7CisJZmFzZG1hZGlyX3QgZGlyZWN0aW9uOworCWZhc2RtYXR5cGVfdCBkbWF0eXBlOworCisJZmFzMjE2X2xvZyhpbmZvLCBMT0dfQlVGRkVSLAorCQkgICAic3RhcnR0cmFuc2ZlcjogYnVmZmVyICVwIGxlbmd0aCAweCUwNnggcmVxbGVuIDB4JTA2eCIsCisJCSAgIGluZm8tPnNjc2kuU0NwLnB0ciwgaW5mby0+c2NzaS5TQ3AudGhpc19yZXNpZHVhbCwKKwkJICAgaW5mby0+U0NwbnQtPnJlcXVlc3RfYnVmZmxlbik7CisKKwlpZiAoIWluZm8tPnNjc2kuU0NwLnB0cikgeworCQlmYXMyMTZfbG9nKGluZm8sIExPR19FUlJPUiwgIm51bGwgYnVmZmVyIHBhc3NlZCB0byAiCisJCQkgICAiZmFzMjE2X3N0YXJ0dHJhbnNmZXIiKTsKKwkJcHJpbnRfU0NwKCZpbmZvLT5zY3NpLlNDcCwgIlNDcDogIiwgIlxuIik7CisJCXByaW50X1NDcCgmaW5mby0+U0NwbnQtPlNDcCwgIkNtbmQgU0NwOiAiLCAiXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSWYgd2UgaGF2ZSBhIHN5bmNocm9ub3VzIHRyYW5zZmVyIGFncmVlbWVudCBpbiBlZmZlY3QsIHdlIG11c3QKKwkgKiB1c2UgRE1BIG1vZGUuICBJZiB3ZSBhcmUgdXNpbmcgYXN5bmNocm9ub3VzIHRyYW5zZmVycywgd2UgbWF5CisJICogdXNlIERNQSBtb2RlIG9yIFBJTyBtb2RlLgorCSAqLworCWlmIChpbmZvLT5kZXZpY2VbaW5mby0+U0NwbnQtPmRldmljZS0+aWRdLnNvZikKKwkJZG1hdHlwZSA9IGZhc2RtYV9yZWFsX2FsbDsKKwllbHNlCisJCWRtYXR5cGUgPSBmYXNkbWFfcGlvOworCisJaWYgKGluZm8tPnNjc2kucGhhc2UgPT0gUEhBU0VfREFUQU9VVCkKKwkJZGlyZWN0aW9uID0gRE1BX09VVDsKKwllbHNlCisJCWRpcmVjdGlvbiA9IERNQV9JTjsKKworCWlmIChpbmZvLT5kbWEuc2V0dXApCisJCWRtYXR5cGUgPSBpbmZvLT5kbWEuc2V0dXAoaW5mby0+aG9zdCwgJmluZm8tPnNjc2kuU0NwLAorCQkJCQkgIGRpcmVjdGlvbiwgZG1hdHlwZSk7CisJaW5mby0+ZG1hLnRyYW5zZmVyX3R5cGUgPSBkbWF0eXBlOworCisJaWYgKGRtYXR5cGUgPT0gZmFzZG1hX3JlYWxfYWxsKQorCQlmYXMyMTZfc2V0X3N0YyhpbmZvLCBpbmZvLT5TQ3BudC0+cmVxdWVzdF9idWZmbGVuKTsKKwllbHNlCisJCWZhczIxNl9zZXRfc3RjKGluZm8sIGluZm8tPnNjc2kuU0NwLnRoaXNfcmVzaWR1YWwpOworCisJc3dpdGNoIChkbWF0eXBlKSB7CisJY2FzZSBmYXNkbWFfcGlvOgorCQlmYXMyMTZfbG9nKGluZm8sIExPR19CVUZGRVIsICJQSU8gdHJhbnNmZXIiKTsKKwkJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfU09GLCAwKTsKKwkJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfU1RQLCBpbmZvLT5zY3NpLmFzeW5jX3N0cCk7CisJCWZhczIxNl9jbWQoaW5mbywgQ01EX1RSQU5TRkVSSU5GTyk7CisJCWZhczIxNl9waW8oaW5mbywgZGlyZWN0aW9uKTsKKwkJYnJlYWs7CisKKwljYXNlIGZhc2RtYV9wc2V1ZG86CisJCWZhczIxNl9sb2coaW5mbywgTE9HX0JVRkZFUiwgInBzZXVkbyB0cmFuc2ZlciIpOworCQlmYXMyMTZfY21kKGluZm8sIENNRF9UUkFOU0ZFUklORk8gfCBDTURfV0lUSERNQSk7CisJCWluZm8tPmRtYS5wc2V1ZG8oaW5mby0+aG9zdCwgJmluZm8tPnNjc2kuU0NwLAorCQkJCSBkaXJlY3Rpb24sIGluZm8tPlNDcG50LT50cmFuc2ZlcnNpemUpOworCQlicmVhazsKKworCWNhc2UgZmFzZG1hX3JlYWxfYmxvY2s6CisJCWZhczIxNl9sb2coaW5mbywgTE9HX0JVRkZFUiwgImJsb2NrIGRtYSB0cmFuc2ZlciIpOworCQlmYXMyMTZfY21kKGluZm8sIENNRF9UUkFOU0ZFUklORk8gfCBDTURfV0lUSERNQSk7CisJCWJyZWFrOworCisJY2FzZSBmYXNkbWFfcmVhbF9hbGw6CisJCWZhczIxNl9sb2coaW5mbywgTE9HX0JVRkZFUiwgInRvdGFsIGRtYSB0cmFuc2ZlciIpOworCQlmYXMyMTZfY21kKGluZm8sIENNRF9UUkFOU0ZFUklORk8gfCBDTURfV0lUSERNQSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZmFzMjE2X2xvZyhpbmZvLCBMT0dfQlVGRkVSIHwgTE9HX0VSUk9SLAorCQkJICAgImludmFsaWQgRkFTMjE2IERNQSB0eXBlIik7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBmYXMyMTZfc3RvcHRyYW5zZmVyIC0gU3RvcCBhIERNQSB0cmFuc2ZlciBvbnRvIC8gb2ZmIG9mIHRoZSBjYXJkCisgKiBAaW5mbzogaW50ZXJmYWNlIGZyb20gd2hpY2ggZGV2aWNlIGRpc2Nvbm5lY3RlZCBmcm9tCisgKgorICogQ2FsbGVkIHdoZW4gd2Ugc3dpdGNoIGF3YXkgZnJvbSBEQVRBIElOIG9yIERBVEEgT1VUIHBoYXNlcy4KKyAqLworc3RhdGljIHZvaWQgZmFzMjE2X3N0b3B0cmFuc2ZlcihGQVMyMTZfSW5mbyAqaW5mbykKK3sKKwlmYXMyMTZfY2hlY2ttYWdpYyhpbmZvKTsKKworCWlmIChpbmZvLT5kbWEudHJhbnNmZXJfdHlwZSA9PSBmYXNkbWFfcmVhbF9hbGwgfHwKKwkgICAgaW5mby0+ZG1hLnRyYW5zZmVyX3R5cGUgPT0gZmFzZG1hX3JlYWxfYmxvY2spCisJCWluZm8tPmRtYS5zdG9wKGluZm8tPmhvc3QsICZpbmZvLT5zY3NpLlNDcCk7CisKKwlmYXMyMTZfY2xlYW51cHRyYW5zZmVyKGluZm8pOworCisJaWYgKGluZm8tPnNjc2kucGhhc2UgPT0gUEhBU0VfREFUQUlOKSB7CisJCXVuc2lnbmVkIGludCBmaWZvOworCisJCS8qCisJCSAqIElmIHdlIHdlcmUgcGVyZm9ybWluZyBEYXRhLUluLCB0aGVuIHRoZSBGSUZPIGNvdW50ZXIKKwkJICogY29udGFpbnMgdGhlIG51bWJlciBvZiBieXRlcyBub3QgdHJhbnNmZXJyZWQgdmlhIERNQQorCQkgKiBmcm9tIHRoZSBvbi1ib2FyZCBGSUZPLiAgUmVhZCB0aGVtIG1hbnVhbGx5LgorCQkgKi8KKwkJZmlmbyA9IGZhczIxNl9yZWFkYihpbmZvLCBSRUdfQ0ZJUykgJiBDRklTX0NGOworCQl3aGlsZSAoZmlmbyAmJiBpbmZvLT5zY3NpLlNDcC5wdHIpIHsKKwkJCSppbmZvLT5zY3NpLlNDcC5wdHIgPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0ZGKTsKKwkJCWZhczIxNl91cGRhdGVwdHJzKGluZm8sIDEpOworCQkJZmlmby0tOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQWZ0ZXIgYSBEYXRhLU91dCBwaGFzZSwgdGhlcmUgbWF5IGJlIHVuc2VudAorCQkgKiBieXRlcyBsZWZ0IGluIHRoZSBGSUZPLiAgRmx1c2ggdGhlbSBvdXQuCisJCSAqLworCQlmYXMyMTZfY21kKGluZm8sIENNRF9GTFVTSEZJRk8pOworCX0KK30KKworc3RhdGljIHZvaWQgZmFzMjE2X2Fib3J0dHJhbnNmZXIoRkFTMjE2X0luZm8gKmluZm8pCit7CisJZmFzMjE2X2NoZWNrbWFnaWMoaW5mbyk7CisKKwlpZiAoaW5mby0+ZG1hLnRyYW5zZmVyX3R5cGUgPT0gZmFzZG1hX3JlYWxfYWxsIHx8CisJICAgIGluZm8tPmRtYS50cmFuc2Zlcl90eXBlID09IGZhc2RtYV9yZWFsX2Jsb2NrKQorCQlpbmZvLT5kbWEuc3RvcChpbmZvLT5ob3N0LCAmaW5mby0+c2NzaS5TQ3ApOworCisJaW5mby0+ZG1hLnRyYW5zZmVyX3R5cGUgPSBmYXNkbWFfbm9uZTsKKwlmYXMyMTZfY21kKGluZm8sIENNRF9GTFVTSEZJRk8pOworfQorCitzdGF0aWMgdm9pZCBmYXMyMTZfa2ljayhGQVMyMTZfSW5mbyAqaW5mbyk7CisKKy8qKgorICogZmFzMjE2X2Rpc2Nvbm5lY3RlZF9pbnRyIC0gaGFuZGxlIGRldmljZSBkaXNjb25uZWN0aW9uCisgKiBAaW5mbzogaW50ZXJmYWNlIGZyb20gd2hpY2ggZGV2aWNlIGRpc2Nvbm5lY3RlZCBmcm9tCisgKgorICogSGFuZGxlIGRldmljZSBkaXNjb25uZWN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGZhczIxNl9kaXNjb25uZWN0X2ludHIoRkFTMjE2X0luZm8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCisJZmFzMjE2X2xvZyhpbmZvLCBMT0dfQ09OTkVDVCwgImRpc2Nvbm5lY3QgcGhhc2U9JTAyeCIsCisJCSAgIGluZm8tPnNjc2kucGhhc2UpOworCisJbXNncXVldWVfZmx1c2goJmluZm8tPnNjc2kubXNncyk7CisKKwlzd2l0Y2ggKGluZm8tPnNjc2kucGhhc2UpIHsKKwljYXNlIFBIQVNFX1NFTEVDVElPTjoJCQkvKiB3aGlsZSBzZWxlY3RpbmcgLSBubyB0YXJnZXQJCSovCisJY2FzZSBQSEFTRV9TRUxTVEVQUzoKKwkJZmFzMjE2X2RvbmUoaW5mbywgRElEX05PX0NPTk5FQ1QpOworCQlicmVhazsKKworCWNhc2UgUEhBU0VfTVNHSU5fRElTQ09OTkVDVDoJCS8qIG1lc3NhZ2UgaW4gLSBkaXNjb25uZWN0aW5nCQkqLworCQlpbmZvLT5zY3NpLmRpc2Nvbm5lY3RhYmxlID0gMTsKKwkJaW5mby0+c2NzaS5waGFzZSA9IFBIQVNFX0lETEU7CisJCWluZm8tPnN0YXRzLmRpc2Nvbm5lY3RzICs9IDE7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJaWYgKGluZm8tPnNjc2kucGhhc2UgPT0gUEhBU0VfSURMRSkKKwkJCWZhczIxNl9raWNrKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIFBIQVNFX0RPTkU6CQkJLyogYXQgZW5kIG9mIGNvbW1hbmQgLSBjb21wbGV0ZQkJKi8KKwkJZmFzMjE2X2RvbmUoaW5mbywgRElEX09LKTsKKwkJYnJlYWs7CisKKwljYXNlIFBIQVNFX01TR09VVDoJCQkvKiBtZXNzYWdlIG91dCAtIHBvc3NpYmxlIEFCT1JUIG1lc3NhZ2UJKi8KKwkJaWYgKGZhczIxNl9nZXRfbGFzdF9tc2coaW5mbywgaW5mby0+c2NzaS5tc2dpbl9maWZvKSA9PSBBQk9SVCkgeworCQkJaW5mby0+c2NzaS5hYm9ydGluZyA9IDA7CisJCQlmYXMyMTZfZG9uZShpbmZvLCBESURfQUJPUlQpOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CQkJCS8qIGh1aD8JCQkJCSovCisJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiB1bmV4cGVjdGVkIGRpc2Nvbm5lY3QgaW4gcGhhc2UgJXNcbiIsCisJCQlpbmZvLT5ob3N0LT5ob3N0X25vLCBmYXMyMTZfdGFyZ2V0KGluZm8pLCBmYXMyMTZfZHJ2X3BoYXNlKGluZm8pKTsKKwkJcHJpbnRfZGVidWdfbGlzdCgpOworCQlmYXMyMTZfc3RvcHRyYW5zZmVyKGluZm8pOworCQlmYXMyMTZfZG9uZShpbmZvLCBESURfRVJST1IpOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogZmFzMjE2X3Jlc2VsZWN0ZWRfaW50ciAtIHN0YXJ0IHJlY29ubmVjdGlvbiBvZiBhIGRldmljZQorICogQGluZm86IGludGVyZmFjZSB3aGljaCB3YXMgcmVzZWxlY3RlZAorICoKKyAqIFN0YXJ0IHJlY29ubmVjdGlvbiBvZiBhIGRldmljZQorICovCitzdGF0aWMgdm9pZAorZmFzMjE2X3Jlc2VsZWN0ZWRfaW50cihGQVMyMTZfSW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgY2ZpcywgaTsKKwl1bnNpZ25lZCBjaGFyIG1zZ1s0XTsKKwl1bnNpZ25lZCBjaGFyIHRhcmdldCwgbHVuLCB0YWc7CisKKwlmYXMyMTZfY2hlY2ttYWdpYyhpbmZvKTsKKworCVdBUk5fT04oaW5mby0+c2NzaS5waGFzZSA9PSBQSEFTRV9TRUxFQ1RJT04gfHwKKwkJaW5mby0+c2NzaS5waGFzZSA9PSBQSEFTRV9TRUxTVEVQUyk7CisKKwljZmlzID0gZmFzMjE2X3JlYWRiKGluZm8sIFJFR19DRklTKTsKKworCWZhczIxNl9sb2coaW5mbywgTE9HX0NPTk5FQ1QsICJyZWNvbm5lY3QgcGhhc2U9JTAyeCBjZmlzPSUwMngiLAorCQkgICBpbmZvLT5zY3NpLnBoYXNlLCBjZmlzKTsKKworCWNmaXMgJj0gQ0ZJU19DRjsKKworCWlmIChjZmlzIDwgMiB8fCBjZmlzID4gNCkgeworCQlwcmludGsoS0VSTl9FUlIgInNjc2klZC5IOiBpbmNvcnJlY3QgbnVtYmVyIG9mIGJ5dGVzIGFmdGVyIHJlc2VsZWN0XG4iLAorCQkJaW5mby0+aG9zdC0+aG9zdF9ubyk7CisJCWdvdG8gYmFkX21lc3NhZ2U7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNmaXM7IGkrKykKKwkJbXNnW2ldID0gZmFzMjE2X3JlYWRiKGluZm8sIFJFR19GRik7CisKKwlpZiAoIShtc2dbMF0gJiAoMSA8PCBpbmZvLT5ob3N0LT50aGlzX2lkKSkgfHwKKwkgICAgIShtc2dbMV0gJiAweDgwKSkKKwkJZ290byBpbml0aWF0b3JfZXJyb3I7CisKKwl0YXJnZXQgPSBtc2dbMF0gJiB+KDEgPDwgaW5mby0+aG9zdC0+dGhpc19pZCk7CisJdGFyZ2V0ID0gZmZzKHRhcmdldCkgLSAxOworCWx1biA9IG1zZ1sxXSAmIDc7CisJdGFnID0gMDsKKworCWlmIChjZmlzID49IDMpIHsKKwkJaWYgKG1zZ1syXSAhPSBTSU1QTEVfUVVFVUVfVEFHKQorCQkJZ290byBpbml0aWF0b3JfZXJyb3I7CisKKwkJdGFnID0gbXNnWzNdOworCX0KKworCS8qIHNldCB1cCBmb3Igc3luY2hyb25vdXMgdHJhbnNmZXJzICovCisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfU0RJRCwgdGFyZ2V0KTsKKwlmYXMyMTZfc2V0X3N5bmMoaW5mbywgdGFyZ2V0KTsKKwltc2dxdWV1ZV9mbHVzaCgmaW5mby0+c2NzaS5tc2dzKTsKKworCWZhczIxNl9sb2coaW5mbywgTE9HX0NPTk5FQ1QsICJSZWNvbm5lY3RlZDogdGFyZ2V0ICUxeCBsdW4gJTF4IHRhZyAlMDJ4IiwKKwkJICAgdGFyZ2V0LCBsdW4sIHRhZyk7CisKKwlpZiAoaW5mby0+c2NzaS5kaXNjb25uZWN0YWJsZSAmJiBpbmZvLT5TQ3BudCkgeworCQlpbmZvLT5zY3NpLmRpc2Nvbm5lY3RhYmxlID0gMDsKKwkJaWYgKGluZm8tPlNDcG50LT5kZXZpY2UtPmlkICA9PSB0YXJnZXQgJiYKKwkJICAgIGluZm8tPlNDcG50LT5kZXZpY2UtPmx1biA9PSBsdW4gJiYKKwkJICAgIGluZm8tPlNDcG50LT50YWcgICAgICAgICA9PSB0YWcpIHsKKwkJCWZhczIxNl9sb2coaW5mbywgTE9HX0NPTk5FQ1QsICJyZWNvbm5lY3RlZCBwcmV2aW91c2x5IGV4ZWN1dGluZyBjb21tYW5kIik7CisJCX0gZWxzZSB7CisJCQlxdWV1ZV9hZGRfY21kX3RhaWwoJmluZm8tPnF1ZXVlcy5kaXNjb25uZWN0ZWQsIGluZm8tPlNDcG50KTsKKwkJCWZhczIxNl9sb2coaW5mbywgTE9HX0NPTk5FQ1QsICJoYWQgdG8gbW92ZSBjb21tYW5kIHRvIGRpc2Nvbm5lY3RlZCBxdWV1ZSIpOworCQkJaW5mby0+U0NwbnQgPSBOVUxMOworCQl9CisJfQorCWlmICghaW5mby0+U0NwbnQpIHsKKwkJaW5mby0+U0NwbnQgPSBxdWV1ZV9yZW1vdmVfdGd0bHVudGFnKCZpbmZvLT5xdWV1ZXMuZGlzY29ubmVjdGVkLAorCQkJCQl0YXJnZXQsIGx1biwgdGFnKTsKKwkJZmFzMjE2X2xvZyhpbmZvLCBMT0dfQ09OTkVDVCwgImhhZCB0byBnZXQgY29tbWFuZCIpOworCX0KKworCWlmIChpbmZvLT5TQ3BudCkgeworCQkvKgorCQkgKiBSZXN0b3JlIGRhdGEgcG9pbnRlciBmcm9tIFNBVkVEIGRhdGEgcG9pbnRlcgorCQkgKi8KKwkJaW5mby0+c2NzaS5TQ3AgPSBpbmZvLT5TQ3BudC0+U0NwOworCisJCWZhczIxNl9sb2coaW5mbywgTE9HX0NPTk5FQ1QsICJkYXRhIHBvaW50ZXJzOiBbJXAsICVYXSIsCisJCQlpbmZvLT5zY3NpLlNDcC5wdHIsIGluZm8tPnNjc2kuU0NwLnRoaXNfcmVzaWR1YWwpOworCQlpbmZvLT5zY3NpLnBoYXNlID0gUEhBU0VfTVNHSU47CisJfSBlbHNlIHsKKwkJLyoKKwkJICogT3VyIGNvbW1hbmQgc3RydWN0dXJlIG5vdCBmb3VuZCAtIGFib3J0IHRoZQorCQkgKiBjb21tYW5kIG9uIHRoZSB0YXJnZXQuICBTaW5jZSB3ZSBoYXZlIG5vCisJCSAqIHJlY29yZCBvZiB0aGlzIGNvbW1hbmQsIHdlIGNhbid0IHNlbmQKKwkJICogYW4gSU5JVElBVE9SIERFVEVDVEVEIEVSUk9SIG1lc3NhZ2UuCisJCSAqLworCQlmYXMyMTZfY21kKGluZm8sIENNRF9TRVRBVE4pOworCisjaWYgMAorCQlpZiAodGFnKQorCQkJbXNncXVldWVfYWRkbXNnKCZpbmZvLT5zY3NpLm1zZ3MsIDIsIEFCT1JUX1RBRywgdGFnKTsKKwkJZWxzZQorI2VuZGlmCisJCQltc2dxdWV1ZV9hZGRtc2coJmluZm8tPnNjc2kubXNncywgMSwgQUJPUlQpOworCQlpbmZvLT5zY3NpLnBoYXNlID0gUEhBU0VfTVNHT1VUX0VYUEVDVDsKKwkJaW5mby0+c2NzaS5hYm9ydGluZyA9IDE7CisJfQorCisJZmFzMjE2X2NtZChpbmZvLCBDTURfTVNHQUNDRVBURUQpOworCXJldHVybjsKKworIGluaXRpYXRvcl9lcnJvcjoKKwlwcmludGsoS0VSTl9FUlIgInNjc2klZC5IOiBlcnJvciBkdXJpbmcgcmVzZWxlY3Rpb246IGJ5dGVzIiwKKwkJaW5mby0+aG9zdC0+aG9zdF9ubyk7CisJZm9yIChpID0gMDsgaSA8IGNmaXM7IGkrKykKKwkJcHJpbnRrKCIgJTAyeCIsIG1zZ1tpXSk7CisJcHJpbnRrKCJcbiIpOworIGJhZF9tZXNzYWdlOgorCWZhczIxNl9jbWQoaW5mbywgQ01EX1NFVEFUTik7CisJbXNncXVldWVfZmx1c2goJmluZm8tPnNjc2kubXNncyk7CisJbXNncXVldWVfYWRkbXNnKCZpbmZvLT5zY3NpLm1zZ3MsIDEsIElOSVRJQVRPUl9FUlJPUik7CisJaW5mby0+c2NzaS5waGFzZSA9IFBIQVNFX01TR09VVF9FWFBFQ1Q7CisJZmFzMjE2X2NtZChpbmZvLCBDTURfTVNHQUNDRVBURUQpOworfQorCitzdGF0aWMgdm9pZCBmYXMyMTZfcGFyc2VfbWVzc2FnZShGQVMyMTZfSW5mbyAqaW5mbywgdW5zaWduZWQgY2hhciAqbWVzc2FnZSwgaW50IG1zZ2xlbikKK3sKKwlpbnQgaTsKKworCXN3aXRjaCAobWVzc2FnZVswXSkgeworCWNhc2UgQ09NTUFORF9DT01QTEVURToKKwkJaWYgKG1zZ2xlbiAhPSAxKQorCQkJZ290byB1bnJlY29nbmlzZWQ7CisKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuJWM6IGNvbW1hbmQgY29tcGxldGUgd2l0aCBubyAiCisJCQkic3RhdHVzIGluIE1FU1NBR0VfSU4/XG4iLAorCQkJaW5mby0+aG9zdC0+aG9zdF9ubywgZmFzMjE2X3RhcmdldChpbmZvKSk7CisJCWJyZWFrOworCisJY2FzZSBTQVZFX1BPSU5URVJTOgorCQlpZiAobXNnbGVuICE9IDEpCisJCQlnb3RvIHVucmVjb2duaXNlZDsKKworCQkvKgorCQkgKiBTYXZlIGN1cnJlbnQgZGF0YSBwb2ludGVyIHRvIFNBVkVEIGRhdGEgcG9pbnRlcgorCQkgKiBTQ1NJIElJIHN0YW5kYXJkIHNheXMgdGhhdCB3ZSBtdXN0IG5vdCBhY2tub3dsZWRnZQorCQkgKiB0aGlzIHVudGlsIHdlIGhhdmUgcmVhbGx5IHNhdmVkIHBvaW50ZXJzLgorCQkgKiBOT1RFOiB3ZSBETyBOT1Qgc2F2ZSB0aGUgY29tbWFuZCBub3Igc3RhdHVzIHBvaW50ZXJzCisJCSAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBTQ1NJIElJIHN0YW5kYXJkLiAgVGhlc2UgYWx3YXlzCisJCSAqIHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGVpciByZXNwZWN0aXZlIGFyZWFzLgorCQkgKi8KKwkJaW5mby0+U0NwbnQtPlNDcCA9IGluZm8tPnNjc2kuU0NwOworCQlpbmZvLT5TQ3BudC0+U0NwLnNlbnRfY29tbWFuZCA9IDA7CisJCWZhczIxNl9sb2coaW5mbywgTE9HX0NPTk5FQ1QgfCBMT0dfTUVTU0FHRVMgfCBMT0dfQlVGRkVSLAorCQkJInNhdmUgZGF0YSBwb2ludGVyczogWyVwLCAlWF0iLAorCQkJaW5mby0+c2NzaS5TQ3AucHRyLCBpbmZvLT5zY3NpLlNDcC50aGlzX3Jlc2lkdWFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFJFU1RPUkVfUE9JTlRFUlM6CisJCWlmIChtc2dsZW4gIT0gMSkKKwkJCWdvdG8gdW5yZWNvZ25pc2VkOworCisJCS8qCisJCSAqIFJlc3RvcmUgY3VycmVudCBkYXRhIHBvaW50ZXIgZnJvbSBTQVZFRCBkYXRhIHBvaW50ZXIKKwkJICovCisJCWluZm8tPnNjc2kuU0NwID0gaW5mby0+U0NwbnQtPlNDcDsKKwkJZmFzMjE2X2xvZyhpbmZvLCBMT0dfQ09OTkVDVCB8IExPR19NRVNTQUdFUyB8IExPR19CVUZGRVIsCisJCQkicmVzdG9yZSBkYXRhIHBvaW50ZXJzOiBbJXAsIDB4JXhdIiwKKwkJCWluZm8tPnNjc2kuU0NwLnB0ciwgaW5mby0+c2NzaS5TQ3AudGhpc19yZXNpZHVhbCk7CisJCWJyZWFrOworCisJY2FzZSBESVNDT05ORUNUOgorCQlpZiAobXNnbGVuICE9IDEpCisJCQlnb3RvIHVucmVjb2duaXNlZDsKKworCQlpbmZvLT5zY3NpLnBoYXNlID0gUEhBU0VfTVNHSU5fRElTQ09OTkVDVDsKKwkJYnJlYWs7CisKKwljYXNlIE1FU1NBR0VfUkVKRUNUOgorCQlpZiAobXNnbGVuICE9IDEpCisJCQlnb3RvIHVucmVjb2duaXNlZDsKKworCQlzd2l0Y2ggKGZhczIxNl9nZXRfbGFzdF9tc2coaW5mbywgaW5mby0+c2NzaS5tc2dpbl9maWZvKSkgeworCQljYXNlIEVYVEVOREVEX01FU1NBR0UgfCBFWFRFTkRFRF9TRFRSIDw8IDg6CisJCQlmYXMyMTZfaGFuZGxlc3luYyhpbmZvLCBtZXNzYWdlKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlmYXMyMTZfbG9nKGluZm8sIDAsICJyZWplY3QsIGxhc3QgbWVzc2FnZSAweCUwNHgiLAorCQkJCWZhczIxNl9nZXRfbGFzdF9tc2coaW5mbywgaW5mby0+c2NzaS5tc2dpbl9maWZvKSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE5PUDoKKwkJYnJlYWs7CisKKwljYXNlIEVYVEVOREVEX01FU1NBR0U6CisJCWlmIChtc2dsZW4gPCAzKQorCQkJZ290byB1bnJlY29nbmlzZWQ7CisKKwkJc3dpdGNoIChtZXNzYWdlWzJdKSB7CisJCWNhc2UgRVhURU5ERURfU0RUUjoJLyogU3luYyB0cmFuc2ZlciBuZWdvdGlhdGlvbiByZXF1ZXN0L3JlcGx5ICovCisJCQlmYXMyMTZfaGFuZGxlc3luYyhpbmZvLCBtZXNzYWdlKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlnb3RvIHVucmVjb2duaXNlZDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWdvdG8gdW5yZWNvZ25pc2VkOworCX0KKwlyZXR1cm47CisKK3VucmVjb2duaXNlZDoKKwlmYXMyMTZfbG9nKGluZm8sIDAsICJ1bnJlY29nbmlzZWQgbWVzc2FnZSwgcmVqZWN0aW5nIik7CisJcHJpbnRrKCJzY3NpJWQuJWM6IG1lc3NhZ2Ugd2FzIiwgaW5mby0+aG9zdC0+aG9zdF9ubywgZmFzMjE2X3RhcmdldChpbmZvKSk7CisJZm9yIChpID0gMDsgaSA8IG1zZ2xlbjsgaSsrKQorCQlwcmludGsoIiVzJTAyWCIsIGkgJiAzMSA/ICIgIiA6ICJcbiAgIiwgbWVzc2FnZVtpXSk7CisJcHJpbnRrKCJcbiIpOworCisJLyoKKwkgKiBTb21ldGhpbmcgc3RyYW5nZSBzZWVtcyB0byBiZSBoYXBwZW5pbmcgaGVyZSAtCisJICogSSBjYW4ndCB1c2UgU0VUQVROIHNpbmNlIHRoZSBjaGlwIGdpdmVzIG1lIGFuCisJICogaW52YWxpZCBjb21tYW5kIGludGVycnVwdCB3aGVuIEkgZG8uICBXZWlyZC4KKwkgKi8KK2ZhczIxNl9jbWQoaW5mbywgQ01EX05PUCk7CitmYXMyMTZfZHVtcHN0YXRlKGluZm8pOworCWZhczIxNl9jbWQoaW5mbywgQ01EX1NFVEFUTik7CisJbXNncXVldWVfZmx1c2goJmluZm8tPnNjc2kubXNncyk7CisJbXNncXVldWVfYWRkbXNnKCZpbmZvLT5zY3NpLm1zZ3MsIDEsIE1FU1NBR0VfUkVKRUNUKTsKKwlpbmZvLT5zY3NpLnBoYXNlID0gUEhBU0VfTVNHT1VUX0VYUEVDVDsKK2ZhczIxNl9kdW1wc3RhdGUoaW5mbyk7Cit9CisKK3N0YXRpYyBpbnQgZmFzMjE2X3dhaXRfY21kKEZBUzIxNl9JbmZvICppbmZvLCBpbnQgY21kKQoreworCWludCB0b3V0OworCWludCBzdGF0OworCisJZmFzMjE2X2NtZChpbmZvLCBjbWQpOworCisJZm9yICh0b3V0ID0gMTAwMDsgdG91dDsgdG91dCAtPSAxKSB7CisJCXN0YXQgPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX1NUQVQpOworCQlpZiAoc3RhdCAmIChTVEFUX0lOVHxTVEFUX1BBUklUWUVSUk9SKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfQorCisJcmV0dXJuIHN0YXQ7Cit9CisKK3N0YXRpYyBpbnQgZmFzMjE2X2dldF9tc2dfYnl0ZShGQVMyMTZfSW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdCA9IGZhczIxNl93YWl0X2NtZChpbmZvLCBDTURfTVNHQUNDRVBURUQpOworCisJaWYgKChzdGF0ICYgU1RBVF9JTlQpID09IDApCisJCWdvdG8gdGltZWRvdXQ7CisKKwlpZiAoKHN0YXQgJiBTVEFUX0JVU01BU0spICE9IFNUQVRfTUVTR0lOKQorCQlnb3RvIHVuZXhwZWN0ZWRfcGhhc2VfY2hhbmdlOworCisJZmFzMjE2X3JlYWRiKGluZm8sIFJFR19JTlNUKTsKKworCXN0YXQgPSBmYXMyMTZfd2FpdF9jbWQoaW5mbywgQ01EX1RSQU5TRkVSSU5GTyk7CisKKwlpZiAoKHN0YXQgJiBTVEFUX0lOVCkgPT0gMCkKKwkJZ290byB0aW1lZG91dDsKKworCWlmIChzdGF0ICYgU1RBVF9QQVJJVFlFUlJPUikKKwkJZ290byBwYXJpdHlfZXJyb3I7CisKKwlpZiAoKHN0YXQgJiBTVEFUX0JVU01BU0spICE9IFNUQVRfTUVTR0lOKQorCQlnb3RvIHVuZXhwZWN0ZWRfcGhhc2VfY2hhbmdlOworCisJZmFzMjE2X3JlYWRiKGluZm8sIFJFR19JTlNUKTsKKworCXJldHVybiBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0ZGKTsKKwordGltZWRvdXQ6CisJZmFzMjE2X2xvZyhpbmZvLCBMT0dfRVJST1IsICJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgbWVzc2FnZSBieXRlIik7CisJcmV0dXJuIC0xOworCit1bmV4cGVjdGVkX3BoYXNlX2NoYW5nZToKKwlmYXMyMTZfbG9nKGluZm8sIExPR19FUlJPUiwgInVuZXhwZWN0ZWQgcGhhc2UgY2hhbmdlOiBzdGF0dXMgPSAlMDJ4Iiwgc3RhdCk7CisJcmV0dXJuIC0yOworCitwYXJpdHlfZXJyb3I6CisJZmFzMjE2X2xvZyhpbmZvLCBMT0dfRVJST1IsICJwYXJpdHkgZXJyb3IgZHVyaW5nIG1lc3NhZ2UgaW4gcGhhc2UiKTsKKwlyZXR1cm4gLTM7Cit9CisKKy8qKgorICogZmFzMjE2X21lc3NhZ2UgLSBoYW5kbGUgYSBmdW5jdGlvbiBkb25lIGludGVycnVwdCBmcm9tIEZBUzIxNiBjaGlwCisgKiBAaW5mbzogaW50ZXJmYWNlIHdoaWNoIGNhdXNlZCBmdW5jdGlvbiBkb25lIGludGVycnVwdAorICoKKyAqIEhhbmRsZSBhIGZ1bmN0aW9uIGRvbmUgaW50ZXJydXB0IGZyb20gRkFTMjE2IGNoaXAKKyAqLworc3RhdGljIHZvaWQgZmFzMjE2X21lc3NhZ2UoRkFTMjE2X0luZm8gKmluZm8pCit7CisJdW5zaWduZWQgY2hhciAqbWVzc2FnZSA9IGluZm8tPnNjc2kubWVzc2FnZTsKKwl1bnNpZ25lZCBpbnQgbXNnbGVuID0gMTsKKwlpbnQgbXNnYnl0ZSA9IDA7CisKKwlmYXMyMTZfY2hlY2ttYWdpYyhpbmZvKTsKKworCW1lc3NhZ2VbMF0gPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0ZGKTsKKworCWlmIChtZXNzYWdlWzBdID09IEVYVEVOREVEX01FU1NBR0UpIHsKKwkJbXNnYnl0ZSA9IGZhczIxNl9nZXRfbXNnX2J5dGUoaW5mbyk7CisKKwkJaWYgKG1zZ2J5dGUgPj0gMCkgeworCQkJbWVzc2FnZVsxXSA9IG1zZ2J5dGU7CisKKwkJCWZvciAobXNnbGVuID0gMjsgbXNnbGVuIDwgbWVzc2FnZVsxXSArIDI7IG1zZ2xlbisrKSB7CisJCQkJbXNnYnl0ZSA9IGZhczIxNl9nZXRfbXNnX2J5dGUoaW5mbyk7CisKKwkJCQlpZiAobXNnYnl0ZSA+PSAwKQorCQkJCQltZXNzYWdlW21zZ2xlbl0gPSBtc2dieXRlOworCQkJCWVsc2UKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAobXNnYnl0ZSA9PSAtMykKKwkJZ290byBwYXJpdHlfZXJyb3I7CisKKyNpZmRlZiBERUJVR19NRVNTQUdFUworCXsKKwkJaW50IGk7CisKKwkJcHJpbnRrKCJzY3NpJWQuJWM6IG1lc3NhZ2UgaW46ICIsCisJCQlpbmZvLT5ob3N0LT5ob3N0X25vLCBmYXMyMTZfdGFyZ2V0KGluZm8pKTsKKwkJZm9yIChpID0gMDsgaSA8IG1zZ2xlbjsgaSsrKQorCQkJcHJpbnRrKCIlMDJYICIsIG1lc3NhZ2VbaV0pOworCQlwcmludGsoIlxuIik7CisJfQorI2VuZGlmCisKKwlmYXMyMTZfcGFyc2VfbWVzc2FnZShpbmZvLCBtZXNzYWdlLCBtc2dsZW4pOworCWZhczIxNl9jbWQoaW5mbywgQ01EX01TR0FDQ0VQVEVEKTsKKwlyZXR1cm47CisKK3Bhcml0eV9lcnJvcjoKKwlmYXMyMTZfY21kKGluZm8sIENNRF9TRVRBVE4pOworCW1zZ3F1ZXVlX2ZsdXNoKCZpbmZvLT5zY3NpLm1zZ3MpOworCW1zZ3F1ZXVlX2FkZG1zZygmaW5mby0+c2NzaS5tc2dzLCAxLCBNU0dfUEFSSVRZX0VSUk9SKTsKKwlpbmZvLT5zY3NpLnBoYXNlID0gUEhBU0VfTVNHT1VUX0VYUEVDVDsKKwlmYXMyMTZfY21kKGluZm8sIENNRF9NU0dBQ0NFUFRFRCk7CisJcmV0dXJuOworfQorCisvKioKKyAqIGZhczIxNl9zZW5kX2NvbW1hbmQgLSBzZW5kIGNvbW1hbmQgYWZ0ZXIgYWxsIG1lc3NhZ2UgYnl0ZXMgaGF2ZSBiZWVuIHNlbnQKKyAqIEBpbmZvOiBpbnRlcmZhY2Ugd2hpY2ggY2F1c2VkIGJ1cyBzZXJ2aWNlCisgKgorICogU2VuZCBhIGNvbW1hbmQgdG8gYSB0YXJnZXQgYWZ0ZXIgYWxsIG1lc3NhZ2UgYnl0ZXMgaGF2ZSBiZWVuIHNlbnQKKyAqLworc3RhdGljIHZvaWQgZmFzMjE2X3NlbmRfY29tbWFuZChGQVMyMTZfSW5mbyAqaW5mbykKK3sKKwlpbnQgaTsKKworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCisJZmFzMjE2X2NtZChpbmZvLCBDTURfTk9QfENNRF9XSVRIRE1BKTsKKwlmYXMyMTZfY21kKGluZm8sIENNRF9GTFVTSEZJRk8pOworCisJLyogbG9hZCBjb21tYW5kICovCisJZm9yIChpID0gaW5mby0+c2NzaS5TQ3Auc2VudF9jb21tYW5kOyBpIDwgaW5mby0+U0NwbnQtPmNtZF9sZW47IGkrKykKKwkJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfRkYsIGluZm8tPlNDcG50LT5jbW5kW2ldKTsKKworCWZhczIxNl9jbWQoaW5mbywgQ01EX1RSQU5TRkVSSU5GTyk7CisKKwlpbmZvLT5zY3NpLnBoYXNlID0gUEhBU0VfQ09NTUFORDsKK30KKworLyoqCisgKiBmYXMyMTZfc2VuZF9tZXNzYWdlb3V0IC0gaGFuZGxlIGJ1cyBzZXJ2aWNlIHRvIHNlbmQgYSBtZXNzYWdlCisgKiBAaW5mbzogaW50ZXJmYWNlIHdoaWNoIGNhdXNlZCBidXMgc2VydmljZQorICoKKyAqIEhhbmRsZSBidXMgc2VydmljZSB0byBzZW5kIGEgbWVzc2FnZS4KKyAqIE5vdGU6IFdlIGRvIG5vdCBhbGxvdyB0aGUgZGV2aWNlIHRvIGNoYW5nZSB0aGUgZGF0YSBkaXJlY3Rpb24hCisgKi8KK3N0YXRpYyB2b2lkIGZhczIxNl9zZW5kX21lc3NhZ2VvdXQoRkFTMjE2X0luZm8gKmluZm8sIGludCBzdGFydCkKK3sKKwl1bnNpZ25lZCBpbnQgdG90X21zZ2xlbiA9IG1zZ3F1ZXVlX21zZ2xlbmd0aCgmaW5mby0+c2NzaS5tc2dzKTsKKworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCisJZmFzMjE2X2NtZChpbmZvLCBDTURfRkxVU0hGSUZPKTsKKworCWlmICh0b3RfbXNnbGVuKSB7CisJCXN0cnVjdCBtZXNzYWdlICptc2c7CisJCWludCBtc2duciA9IDA7CisKKwkJd2hpbGUgKChtc2cgPSBtc2dxdWV1ZV9nZXRtc2coJmluZm8tPnNjc2kubXNncywgbXNnbnIrKykpICE9IE5VTEwpIHsKKwkJCWludCBpOworCisJCQlmb3IgKGkgPSBzdGFydDsgaSA8IG1zZy0+bGVuZ3RoOyBpKyspCisJCQkJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfRkYsIG1zZy0+bXNnW2ldKTsKKworCQkJbXNnLT5maWZvID0gdG90X21zZ2xlbiAtIChmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NGSVMpICYgQ0ZJU19DRik7CisJCQlzdGFydCA9IDA7CisJCX0KKwl9IGVsc2UKKwkJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfRkYsIE5PUCk7CisKKwlmYXMyMTZfY21kKGluZm8sIENNRF9UUkFOU0ZFUklORk8pOworCisJaW5mby0+c2NzaS5waGFzZSA9IFBIQVNFX01TR09VVDsKK30KKworLyoqCisgKiBmYXMyMTZfYnVzc2VydmljZV9pbnRyIC0gaGFuZGxlIGJ1cyBzZXJ2aWNlIGludGVycnVwdCBmcm9tIEZBUzIxNiBjaGlwCisgKiBAaW5mbzogaW50ZXJmYWNlIHdoaWNoIGNhdXNlZCBidXMgc2VydmljZSBpbnRlcnJ1cHQKKyAqIEBzdGF0OiBTdGF0dXMgcmVnaXN0ZXIgY29udGVudHMKKyAqIEBpczogU0NTSSBTdGF0dXMgcmVnaXN0ZXIgY29udGVudHMKKyAqCisgKiBIYW5kbGUgYSBidXMgc2VydmljZSBpbnRlcnJ1cHQgZnJvbSBGQVMyMTYgY2hpcAorICovCitzdGF0aWMgdm9pZCBmYXMyMTZfYnVzc2VydmljZV9pbnRyKEZBUzIxNl9JbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgc3RhdCwgdW5zaWduZWQgaW50IGlzKQoreworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCisJZmFzMjE2X2xvZyhpbmZvLCBMT0dfQlVTU0VSVklDRSwKKwkJICAgImJ1cyBzZXJ2aWNlOiBzdGF0PSUwMnggaXM9JTAyeCBwaGFzZT0lMDJ4IiwKKwkJICAgc3RhdCwgaXMsIGluZm8tPnNjc2kucGhhc2UpOworCisJc3dpdGNoIChpbmZvLT5zY3NpLnBoYXNlKSB7CisJY2FzZSBQSEFTRV9TRUxFQ1RJT046CisJCWlmICgoaXMgJiBJU19CSVRTKSAhPSBJU19NU0dCWVRFU0VOVCkKKwkJCWdvdG8gYmFkX2lzOworCQlicmVhazsKKworCWNhc2UgUEhBU0VfU0VMU1RFUFM6CisJCXN3aXRjaCAoaXMgJiBJU19CSVRTKSB7CisJCWNhc2UgSVNfU0VMQVJCOgorCQljYXNlIElTX01TR0JZVEVTRU5UOgorCQkJZ290byBiYWRfaXM7CisKKwkJY2FzZSBJU19OT1RDT01NQU5EOgorCQljYXNlIElTX0VBUkxZUEhBU0U6CisJCQlpZiAoKHN0YXQgJiBTVEFUX0JVU01BU0spID09IFNUQVRfTUVTR0lOKQorCQkJCWJyZWFrOworCQkJZ290byBiYWRfaXM7CisKKwkJY2FzZSBJU19DT01QTEVURToKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlmYXMyMTZfY21kKGluZm8sIENNRF9OT1ApOworCisjZGVmaW5lIFNUQVRFKHN0LHBoKSAoKHBoKSA8PCAzIHwgKHN0KSkKKwkvKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgbGVnYWwgU0NTSSBzdGF0ZSB0cmFuc2l0aW9ucywKKwkgKiBhcyBkZXNjcmliZWQgYnkgdGhlIFNDU0kgSUkgc3BlYy4KKwkgKi8KKwlzd2l0Y2ggKFNUQVRFKHN0YXQgJiBTVEFUX0JVU01BU0ssIGluZm8tPnNjc2kucGhhc2UpKSB7CisJY2FzZSBTVEFURShTVEFUX0RBVEFJTiwgUEhBU0VfU0VMU1RFUFMpOi8qIFNlbCB3LyBzdGVwcyAtPiBEYXRhIEluICAgICAgKi8KKwljYXNlIFNUQVRFKFNUQVRfREFUQUlOLCBQSEFTRV9NU0dPVVQpOiAgLyogTWVzc2FnZSBPdXQgIC0+IERhdGEgSW4gICAgICAqLworCWNhc2UgU1RBVEUoU1RBVF9EQVRBSU4sIFBIQVNFX0NPTU1BTkQpOiAvKiBDb21tYW5kICAgICAgLT4gRGF0YSBJbiAgICAgICovCisJY2FzZSBTVEFURShTVEFUX0RBVEFJTiwgUEhBU0VfTVNHSU4pOiAgIC8qIE1lc3NhZ2UgSW4gICAtPiBEYXRhIEluICAgICAgKi8KKwkJaW5mby0+c2NzaS5waGFzZSA9IFBIQVNFX0RBVEFJTjsKKwkJZmFzMjE2X3RyYW5zZmVyKGluZm8pOworCQlyZXR1cm47CisKKwljYXNlIFNUQVRFKFNUQVRfREFUQUlOLCBQSEFTRV9EQVRBSU4pOiAgLyogRGF0YSBJbiAgICAgIC0+IERhdGEgSW4gICAgICAqLworCWNhc2UgU1RBVEUoU1RBVF9EQVRBT1VULCBQSEFTRV9EQVRBT1VUKTovKiBEYXRhIE91dCAgICAgLT4gRGF0YSBPdXQgICAgICovCisJCWZhczIxNl9jbGVhbnVwdHJhbnNmZXIoaW5mbyk7CisJCWZhczIxNl90cmFuc2ZlcihpbmZvKTsKKwkJcmV0dXJuOworCisJY2FzZSBTVEFURShTVEFUX0RBVEFPVVQsIFBIQVNFX1NFTFNURVBTKTovKiBTZWwgdy8gc3RlcHMtPiBEYXRhIE91dCAgICAgKi8KKwljYXNlIFNUQVRFKFNUQVRfREFUQU9VVCwgUEhBU0VfTVNHT1VUKTogLyogTWVzc2FnZSBPdXQgIC0+IERhdGEgT3V0ICAgICAqLworCWNhc2UgU1RBVEUoU1RBVF9EQVRBT1VULCBQSEFTRV9DT01NQU5EKTovKiBDb21tYW5kICAgICAgLT4gRGF0YSBPdXQgICAgICovCisJY2FzZSBTVEFURShTVEFUX0RBVEFPVVQsIFBIQVNFX01TR0lOKTogIC8qIE1lc3NhZ2UgSW4gICAtPiBEYXRhIE91dCAgICAgKi8KKwkJZmFzMjE2X2NtZChpbmZvLCBDTURfRkxVU0hGSUZPKTsKKwkJaW5mby0+c2NzaS5waGFzZSA9IFBIQVNFX0RBVEFPVVQ7CisJCWZhczIxNl90cmFuc2ZlcihpbmZvKTsKKwkJcmV0dXJuOworCisJY2FzZSBTVEFURShTVEFUX1NUQVRVUywgUEhBU0VfREFUQU9VVCk6IC8qIERhdGEgT3V0ICAgICAtPiBTdGF0dXMgICAgICAgKi8KKwljYXNlIFNUQVRFKFNUQVRfU1RBVFVTLCBQSEFTRV9EQVRBSU4pOiAgLyogRGF0YSBJbiAgICAgIC0+IFN0YXR1cyAgICAgICAqLworCQlmYXMyMTZfc3RvcHRyYW5zZmVyKGluZm8pOworCWNhc2UgU1RBVEUoU1RBVF9TVEFUVVMsIFBIQVNFX1NFTFNURVBTKTovKiBTZWwgdy8gc3RlcHMgLT4gU3RhdHVzICAgICAgICovCisJY2FzZSBTVEFURShTVEFUX1NUQVRVUywgUEhBU0VfTVNHT1VUKTogIC8qIE1lc3NhZ2UgT3V0ICAtPiBTdGF0dXMgICAgICAgKi8KKwljYXNlIFNUQVRFKFNUQVRfU1RBVFVTLCBQSEFTRV9DT01NQU5EKTogLyogQ29tbWFuZCAgICAgIC0+IFN0YXR1cyAgICAgICAqLworCWNhc2UgU1RBVEUoU1RBVF9TVEFUVVMsIFBIQVNFX01TR0lOKTogICAvKiBNZXNzYWdlIEluICAgLT4gU3RhdHVzICAgICAgICovCisJCWZhczIxNl9jbWQoaW5mbywgQ01EX0lOSVRDTURDT01QTEVURSk7CisJCWluZm8tPnNjc2kucGhhc2UgPSBQSEFTRV9TVEFUVVM7CisJCXJldHVybjsKKworCWNhc2UgU1RBVEUoU1RBVF9NRVNHSU4sIFBIQVNFX0RBVEFPVVQpOiAvKiBEYXRhIE91dCAgICAgLT4gTWVzc2FnZSBJbiAgICovCisJY2FzZSBTVEFURShTVEFUX01FU0dJTiwgUEhBU0VfREFUQUlOKTogIC8qIERhdGEgSW4gICAgICAtPiBNZXNzYWdlIEluICAgKi8KKwkJZmFzMjE2X3N0b3B0cmFuc2ZlcihpbmZvKTsKKwljYXNlIFNUQVRFKFNUQVRfTUVTR0lOLCBQSEFTRV9DT01NQU5EKToJLyogQ29tbWFuZAktPiBNZXNzYWdlIEluCSovCisJY2FzZSBTVEFURShTVEFUX01FU0dJTiwgUEhBU0VfU0VMU1RFUFMpOi8qIFNlbCB3LyBzdGVwcyAtPiBNZXNzYWdlIEluICAgKi8KKwljYXNlIFNUQVRFKFNUQVRfTUVTR0lOLCBQSEFTRV9NU0dPVVQpOiAgLyogTWVzc2FnZSBPdXQgIC0+IE1lc3NhZ2UgSW4gICAqLworCQlpbmZvLT5zY3NpLm1zZ2luX2ZpZm8gPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NGSVMpICYgQ0ZJU19DRjsKKwkJZmFzMjE2X2NtZChpbmZvLCBDTURfRkxVU0hGSUZPKTsKKwkJZmFzMjE2X2NtZChpbmZvLCBDTURfVFJBTlNGRVJJTkZPKTsKKwkJaW5mby0+c2NzaS5waGFzZSA9IFBIQVNFX01TR0lOOworCQlyZXR1cm47CisKKwljYXNlIFNUQVRFKFNUQVRfTUVTR0lOLCBQSEFTRV9NU0dJTik6CisJCWluZm8tPnNjc2kubXNnaW5fZmlmbyA9IGZhczIxNl9yZWFkYihpbmZvLCBSRUdfQ0ZJUykgJiBDRklTX0NGOworCQlmYXMyMTZfY21kKGluZm8sIENNRF9UUkFOU0ZFUklORk8pOworCQlyZXR1cm47CisKKwljYXNlIFNUQVRFKFNUQVRfQ09NTUFORCwgUEhBU0VfTVNHT1VUKTogLyogTWVzc2FnZSBPdXQgIC0+IENvbW1hbmQgICAgICAqLworCWNhc2UgU1RBVEUoU1RBVF9DT01NQU5ELCBQSEFTRV9NU0dJTik6ICAvKiBNZXNzYWdlIEluICAgLT4gQ29tbWFuZCAgICAgICovCisJCWZhczIxNl9zZW5kX2NvbW1hbmQoaW5mbyk7CisJCWluZm8tPnNjc2kucGhhc2UgPSBQSEFTRV9DT01NQU5EOworCQlyZXR1cm47CisKKworCS8qCisJICogU2VsZWN0aW9uICAgIC0+IE1lc3NhZ2UgT3V0CisJICovCisJY2FzZSBTVEFURShTVEFUX01FU0dPVVQsIFBIQVNFX1NFTEVDVElPTik6CisJCWZhczIxNl9zZW5kX21lc3NhZ2VvdXQoaW5mbywgMSk7CisJCXJldHVybjsKKworCS8qCisJICogTWVzc2FnZSBPdXQgIC0+IE1lc3NhZ2UgT3V0CisJICovCisJY2FzZSBTVEFURShTVEFUX01FU0dPVVQsIFBIQVNFX1NFTFNURVBTKToKKwljYXNlIFNUQVRFKFNUQVRfTUVTR09VVCwgUEhBU0VfTVNHT1VUKToKKwkJLyoKKwkJICogSWYgd2UgZ2V0IGFub3RoZXIgbWVzc2FnZSBvdXQgcGhhc2UsIHRoaXMgdXN1YWxseQorCQkgKiBtZWFucyBzb21lIHBhcml0eSBlcnJvciBvY2N1cnJlZC4gIFJlc2VuZCBjb21wbGV0ZQorCQkgKiBzZXQgb2YgbWVzc2FnZXMuICBJZiB3ZSBoYXZlIG1vcmUgdGhhbiBvbmUgYnl0ZSB0bworCQkgKiBzZW5kLCB3ZSBuZWVkIHRvIGFzc2VydCBBVE4gYWdhaW4uCisJCSAqLworCQlpZiAoaW5mby0+ZGV2aWNlW2luZm8tPlNDcG50LT5kZXZpY2UtPmlkXS5wYXJpdHlfY2hlY2spIHsKKwkJCS8qCisJCQkgKiBXZSB3ZXJlIHRlc3RpbmcuLi4gZ29vZCwgdGhlIGRldmljZQorCQkJICogc3VwcG9ydHMgcGFyaXR5IGNoZWNraW5nLgorCQkJICovCisJCQlpbmZvLT5kZXZpY2VbaW5mby0+U0NwbnQtPmRldmljZS0+aWRdLnBhcml0eV9jaGVjayA9IDA7CisJCQlpbmZvLT5kZXZpY2VbaW5mby0+U0NwbnQtPmRldmljZS0+aWRdLnBhcml0eV9lbmFibGVkID0gMTsKKwkJCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NOVEwxLCBpbmZvLT5zY3NpLmNmZ1swXSk7CisJCX0KKworCQlpZiAobXNncXVldWVfbXNnbGVuZ3RoKCZpbmZvLT5zY3NpLm1zZ3MpID4gMSkKKwkJCWZhczIxNl9jbWQoaW5mbywgQ01EX1NFVEFUTik7CisJCS8qRkFMTFRIUk9VR0gqLworCisJLyoKKwkgKiBBbnkgICAgICAgICAgLT4gTWVzc2FnZSBPdXQKKwkgKi8KKwljYXNlIFNUQVRFKFNUQVRfTUVTR09VVCwgUEhBU0VfTVNHT1VUX0VYUEVDVCk6CisJCWZhczIxNl9zZW5kX21lc3NhZ2VvdXQoaW5mbywgMCk7CisJCXJldHVybjsKKworCS8qIEVycm9yIHJlY292ZXJ5IHJ1bGVzLgorCSAqICAgVGhlc2UgZWl0aGVyIGF0dGVtcHQgdG8gYWJvcnQgb3IgcmV0cnkgdGhlIG9wZXJhdGlvbi4KKwkgKiBUT0RPOiB3ZSBuZWVkIG1vcmUgb2YgdGhlc2UKKwkgKi8KKwljYXNlIFNUQVRFKFNUQVRfQ09NTUFORCwgUEhBU0VfQ09NTUFORCk6LyogQ29tbWFuZCAgICAgIC0+IENvbW1hbmQgICAgICAqLworCQkvKiBlcnJvciAtIHdlJ3ZlIHNlbnQgb3V0IGFsbCB0aGUgY29tbWFuZCBieXRlcworCQkgKiB3ZSBoYXZlLgorCQkgKiBOT1RFOiB3ZSBuZWVkIFNBVkUgREFUQSBQT0lOVEVSUy9SRVNUT1JFIERBVEEgUE9JTlRFUlMKKwkJICogdG8gaW5jbHVkZSB0aGUgY29tbWFuZCBieXRlcyBzZW50IGZvciB0aGlzIHRvIHdvcmsKKwkJICogY29ycmVjdGx5LgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuJWM6ICIKKwkJCSJ0YXJnZXQgdHJ5aW5nIHRvIHJlY2VpdmUgbW9yZSBjb21tYW5kIGJ5dGVzXG4iLAorCQkJaW5mby0+aG9zdC0+aG9zdF9ubywgZmFzMjE2X3RhcmdldChpbmZvKSk7CisJCWZhczIxNl9jbWQoaW5mbywgQ01EX1NFVEFUTik7CisJCWZhczIxNl9zZXRfc3RjKGluZm8sIDE1KTsKKwkJZmFzMjE2X2NtZChpbmZvLCBDTURfUEFEQllURVMgfCBDTURfV0lUSERNQSk7CisJCW1zZ3F1ZXVlX2ZsdXNoKCZpbmZvLT5zY3NpLm1zZ3MpOworCQltc2dxdWV1ZV9hZGRtc2coJmluZm8tPnNjc2kubXNncywgMSwgSU5JVElBVE9SX0VSUk9SKTsKKwkJaW5mby0+c2NzaS5waGFzZSA9IFBIQVNFX01TR09VVF9FWFBFQ1Q7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW5mby0+c2NzaS5waGFzZSA9PSBQSEFTRV9NU0dJTl9ESVNDT05ORUNUKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiBkaXNjb25uZWN0IG1lc3NhZ2UgcmVjZWl2ZWQsIGJ1dCBidXMgc2VydmljZSAlcz9cbiIsCisJCQlpbmZvLT5ob3N0LT5ob3N0X25vLCBmYXMyMTZfdGFyZ2V0KGluZm8pLAorCQkJZmFzMjE2X2J1c19waGFzZShzdGF0KSk7CisJCW1zZ3F1ZXVlX2ZsdXNoKCZpbmZvLT5zY3NpLm1zZ3MpOworCQlmYXMyMTZfY21kKGluZm8sIENNRF9TRVRBVE4pOworCQltc2dxdWV1ZV9hZGRtc2coJmluZm8tPnNjc2kubXNncywgMSwgSU5JVElBVE9SX0VSUk9SKTsKKwkJaW5mby0+c2NzaS5waGFzZSA9IFBIQVNFX01TR09VVF9FWFBFQ1Q7CisJCWluZm8tPnNjc2kuYWJvcnRpbmcgPSAxOworCQlmYXMyMTZfY21kKGluZm8sIENNRF9UUkFOU0ZFUklORk8pOworCQlyZXR1cm47CisJfQorCXByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiBidXMgcGhhc2UgJXMgYWZ0ZXIgJXM/XG4iLAorCQlpbmZvLT5ob3N0LT5ob3N0X25vLCBmYXMyMTZfdGFyZ2V0KGluZm8pLAorCQlmYXMyMTZfYnVzX3BoYXNlKHN0YXQpLAorCQlmYXMyMTZfZHJ2X3BoYXNlKGluZm8pKTsKKwlwcmludF9kZWJ1Z19saXN0KCk7CisJcmV0dXJuOworCitiYWRfaXM6CisJZmFzMjE2X2xvZyhpbmZvLCAwLCAiYnVzIHNlcnZpY2UgYXQgc3RlcCAlZD8iLCBpcyAmIElTX0JJVFMpOworCWZhczIxNl9kdW1wc3RhdGUoaW5mbyk7CisJcHJpbnRfZGVidWdfbGlzdCgpOworCisJZmFzMjE2X2RvbmUoaW5mbywgRElEX0VSUk9SKTsKK30KKworLyoqCisgKiBmYXMyMTZfZnVuY2RvbmVfaW50ciAtIGhhbmRsZSBhIGZ1bmN0aW9uIGRvbmUgaW50ZXJydXB0IGZyb20gRkFTMjE2IGNoaXAKKyAqIEBpbmZvOiBpbnRlcmZhY2Ugd2hpY2ggY2F1c2VkIGZ1bmN0aW9uIGRvbmUgaW50ZXJydXB0CisgKiBAc3RhdDogU3RhdHVzIHJlZ2lzdGVyIGNvbnRlbnRzCisgKiBAaXM6IFNDU0kgU3RhdHVzIHJlZ2lzdGVyIGNvbnRlbnRzCisgKgorICogSGFuZGxlIGEgZnVuY3Rpb24gZG9uZSBpbnRlcnJ1cHQgZnJvbSBGQVMyMTYgY2hpcAorICovCitzdGF0aWMgdm9pZCBmYXMyMTZfZnVuY2RvbmVfaW50cihGQVMyMTZfSW5mbyAqaW5mbywgdW5zaWduZWQgaW50IHN0YXQsIHVuc2lnbmVkIGludCBpcykKK3sKKwl1bnNpZ25lZCBpbnQgZmlmb19sZW4gPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NGSVMpICYgQ0ZJU19DRjsKKworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCisJZmFzMjE2X2xvZyhpbmZvLCBMT0dfRlVOQ1RJT05ET05FLAorCQkgICAiZnVuY3Rpb24gZG9uZTogc3RhdD0lMDJ4IGlzPSUwMnggcGhhc2U9JTAyeCIsCisJCSAgIHN0YXQsIGlzLCBpbmZvLT5zY3NpLnBoYXNlKTsKKworCXN3aXRjaCAoaW5mby0+c2NzaS5waGFzZSkgeworCWNhc2UgUEhBU0VfU1RBVFVTOgkJCS8qIHN0YXR1cyBwaGFzZSAtIHJlYWQgc3RhdHVzIGFuZCBtc2cJKi8KKwkJaWYgKGZpZm9fbGVuICE9IDIpIHsKKwkJCWZhczIxNl9sb2coaW5mbywgMCwgIm9kZCBudW1iZXIgb2YgYnl0ZXMgaW4gRklGTzogJWQiLCBmaWZvX2xlbik7CisJCX0KKwkJLyoKKwkJICogUmVhZCBzdGF0dXMgdGhlbiBtZXNzYWdlIGJ5dGUuCisJCSAqLworCQlpbmZvLT5zY3NpLlNDcC5TdGF0dXMgPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0ZGKTsKKwkJaW5mby0+c2NzaS5TQ3AuTWVzc2FnZSA9IGZhczIxNl9yZWFkYihpbmZvLCBSRUdfRkYpOworCQlpbmZvLT5zY3NpLnBoYXNlID0gUEhBU0VfRE9ORTsKKwkJZmFzMjE2X2NtZChpbmZvLCBDTURfTVNHQUNDRVBURUQpOworCQlicmVhazsKKworCWNhc2UgUEhBU0VfSURMRToKKwljYXNlIFBIQVNFX1NFTEVDVElPTjoKKwljYXNlIFBIQVNFX1NFTFNURVBTOgorCQlicmVhazsKKworCWNhc2UgUEhBU0VfTVNHSU46CQkJLyogbWVzc2FnZSBpbiBwaGFzZQkJCSovCisJCWlmICgoc3RhdCAmIFNUQVRfQlVTTUFTSykgPT0gU1RBVF9NRVNHSU4pIHsKKwkJCWluZm8tPnNjc2kubXNnaW5fZmlmbyA9IGZpZm9fbGVuOworCQkJZmFzMjE2X21lc3NhZ2UoaW5mbyk7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJZmFzMjE2X2xvZyhpbmZvLCAwLCAiaW50ZXJuYWwgcGhhc2UgJXMgZm9yIGZ1bmN0aW9uIGRvbmU/IgorCQkJIiAgV2hhdCBkbyBJIGRvIHdpdGggdGhpcz8iLAorCQkJZmFzMjE2X3RhcmdldChpbmZvKSwgZmFzMjE2X2Rydl9waGFzZShpbmZvKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmYXMyMTZfYnVzX3Jlc2V0KEZBUzIxNl9JbmZvICppbmZvKQoreworCW5lZ190IHN5bmNfc3RhdGU7CisJaW50IGk7CisKKwltc2dxdWV1ZV9mbHVzaCgmaW5mby0+c2NzaS5tc2dzKTsKKworCXN5bmNfc3RhdGUgPSBuZWdfaW52YWxpZDsKKworI2lmZGVmIFNDU0kyX1NZTkMKKwlpZiAoaW5mby0+aWZjZmcuY2FwYWJpbGl0aWVzICYgKEZBU0NBUF9ETUF8RkFTQ0FQX1BTRVVET0RNQSkpCisJCXN5bmNfc3RhdGUgPSBuZWdfd2FpdDsKKyNlbmRpZgorCisJaW5mby0+c2NzaS5waGFzZSA9IFBIQVNFX0lETEU7CisJaW5mby0+U0NwbnQgPSBOVUxMOyAvKiBidWchICovCisJbWVtc2V0KCZpbmZvLT5zY3NpLlNDcCwgMCwgc2l6ZW9mKGluZm8tPnNjc2kuU0NwKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWluZm8tPmRldmljZVtpXS5kaXNjb25uZWN0X29rCT0gaW5mby0+aWZjZmcuZGlzY29ubmVjdF9vazsKKwkJaW5mby0+ZGV2aWNlW2ldLnN5bmNfc3RhdGUJPSBzeW5jX3N0YXRlOworCQlpbmZvLT5kZXZpY2VbaV0ucGVyaW9kCQk9IGluZm8tPmlmY2ZnLmFzeW5jcGVyaW9kIC8gNDsKKwkJaW5mby0+ZGV2aWNlW2ldLnN0cAkJPSBpbmZvLT5zY3NpLmFzeW5jX3N0cDsKKwkJaW5mby0+ZGV2aWNlW2ldLnNvZgkJPSAwOworCQlpbmZvLT5kZXZpY2VbaV0ud2lkZV94ZmVyCT0gMDsKKwl9CisKKwlpbmZvLT5yc3RfYnVzX3N0YXR1cyA9IDE7CisJd2FrZV91cCgmaW5mby0+ZWhfd2FpdCk7Cit9CisKKy8qKgorICogZmFzMjE2X2ludHIgLSBoYW5kbGUgaW50ZXJydXB0cyB0byBwcm9ncmVzcyBhIGNvbW1hbmQKKyAqIEBpbmZvOiBpbnRlcmZhY2UgdG8gc2VydmljZQorICoKKyAqIEhhbmRsZSBpbnRlcnJ1cHRzIGZyb20gdGhlIGludGVyZmFjZSB0byBwcm9ncmVzcyBhIGNvbW1hbmQKKyAqLworaXJxcmV0dXJuX3QgZmFzMjE2X2ludHIoRkFTMjE2X0luZm8gKmluZm8pCit7CisJdW5zaWduZWQgY2hhciBpbnN0LCBpcywgc3RhdDsKKwlpbnQgaGFuZGxlZCA9IElSUV9OT05FOworCisJZmFzMjE2X2NoZWNrbWFnaWMoaW5mbyk7CisKKwlzdGF0ID0gZmFzMjE2X3JlYWRiKGluZm8sIFJFR19TVEFUKTsKKwlpcyA9IGZhczIxNl9yZWFkYihpbmZvLCBSRUdfSVMpOworCWluc3QgPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0lOU1QpOworCisJYWRkX2RlYnVnX2xpc3Qoc3RhdCwgaXMsIGluc3QsIGluZm8tPnNjc2kucGhhc2UpOworCisJaWYgKHN0YXQgJiBTVEFUX0lOVCkgeworCQlpZiAoaW5zdCAmIElOU1RfQlVTUkVTRVQpIHsKKwkJCWZhczIxNl9sb2coaW5mbywgMCwgImJ1cyByZXNldCBkZXRlY3RlZCIpOworCQkJZmFzMjE2X2J1c19yZXNldChpbmZvKTsKKwkJCXNjc2lfcmVwb3J0X2J1c19yZXNldChpbmZvLT5ob3N0LCAwKTsKKwkJfSBlbHNlIGlmIChpbnN0ICYgSU5TVF9JTExFR0FMQ01EKSB7CisJCQlmYXMyMTZfbG9nKGluZm8sIExPR19FUlJPUiwgImlsbGVnYWwgY29tbWFuZCBnaXZlblxuIik7CisJCQlmYXMyMTZfZHVtcHN0YXRlKGluZm8pOworCQkJcHJpbnRfZGVidWdfbGlzdCgpOworCQl9IGVsc2UgaWYgKGluc3QgJiBJTlNUX0RJU0NPTk5FQ1QpCisJCQlmYXMyMTZfZGlzY29ubmVjdF9pbnRyKGluZm8pOworCQllbHNlIGlmIChpbnN0ICYgSU5TVF9SRVNFTEVDVEVEKQkvKiByZXNlbGVjdGVkCQkJKi8KKwkJCWZhczIxNl9yZXNlbGVjdGVkX2ludHIoaW5mbyk7CisJCWVsc2UgaWYgKGluc3QgJiBJTlNUX0JVU1NFUlZJQ0UpCS8qIGJ1cyBzZXJ2aWNlIHJlcXVlc3QJCSovCisJCQlmYXMyMTZfYnVzc2VydmljZV9pbnRyKGluZm8sIHN0YXQsIGlzKTsKKwkJZWxzZSBpZiAoaW5zdCAmIElOU1RfRlVOQ0RPTkUpCQkvKiBmdW5jdGlvbiBkb25lCQkqLworCQkJZmFzMjE2X2Z1bmNkb25lX2ludHIoaW5mbywgc3RhdCwgaXMpOworCQllbHNlCisJCSAgICAJZmFzMjE2X2xvZyhpbmZvLCAwLCAidW5rbm93biBpbnRlcnJ1cHQgcmVjZWl2ZWQ6IgorCQkJCSIgcGhhc2UgJXMgaW5zdCAlMDJYIGlzICUwMlggc3RhdCAlMDJYIiwKKwkJCQlmYXMyMTZfZHJ2X3BoYXNlKGluZm8pLCBpbnN0LCBpcywgc3RhdCk7CisJCWhhbmRsZWQgPSBJUlFfSEFORExFRDsKKwl9CisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZmFzMjE2X3N0YXJ0X2NvbW1hbmQoRkFTMjE2X0luZm8gKmluZm8sIFNjc2lfQ21uZCAqU0NwbnQpCit7CisJaW50IHRvdF9tc2dsZW47CisKKwkvKiBmb2xsb3dpbmcgd2hhdCB0aGUgRVNQIGRyaXZlciBzYXlzICovCisJZmFzMjE2X3NldF9zdGMoaW5mbywgMCk7CisJZmFzMjE2X2NtZChpbmZvLCBDTURfTk9QIHwgQ01EX1dJVEhETUEpOworCisJLyogZmx1c2ggRklGTyAqLworCWZhczIxNl9jbWQoaW5mbywgQ01EX0ZMVVNIRklGTyk7CisKKwkvKiBsb2FkIGJ1cy1pZCBhbmQgdGltZW91dCAqLworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX1NESUQsIEJVU0lEKFNDcG50LT5kZXZpY2UtPmlkKSk7CisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfU1RJTSwgaW5mby0+aWZjZmcuc2VsZWN0X3RpbWVvdXQpOworCisJLyogc3luY2hyb25vdXMgdHJhbnNmZXJzICovCisJZmFzMjE2X3NldF9zeW5jKGluZm8sIFNDcG50LT5kZXZpY2UtPmlkKTsKKworCXRvdF9tc2dsZW4gPSBtc2dxdWV1ZV9tc2dsZW5ndGgoJmluZm8tPnNjc2kubXNncyk7CisKKyNpZmRlZiBERUJVR19NRVNTQUdFUworCXsKKwkJc3RydWN0IG1lc3NhZ2UgKm1zZzsKKwkJaW50IG1zZ25yID0gMCwgaTsKKworCQlwcmludGsoInNjc2klZC4lYzogbWVzc2FnZSBvdXQ6ICIsCisJCQlpbmZvLT5ob3N0LT5ob3N0X25vLCAnMCcgKyBTQ3BudC0+ZGV2aWNlLT5pZCk7CisJCXdoaWxlICgobXNnID0gbXNncXVldWVfZ2V0bXNnKCZpbmZvLT5zY3NpLm1zZ3MsIG1zZ25yKyspKSAhPSBOVUxMKSB7CisJCQlwcmludGsoInsgIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbXNnLT5sZW5ndGg7IGkrKykKKwkJCQlwcmludGsoIiUwMnggIiwgbXNnLT5tc2dbaV0pOworCQkJcHJpbnRrKCJ9ICIpOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9CisjZW5kaWYKKworCWlmICh0b3RfbXNnbGVuID09IDEgfHwgdG90X21zZ2xlbiA9PSAzKSB7CisJCS8qCisJCSAqIFdlIGhhdmUgYW4gZWFzeSBtZXNzYWdlIGxlbmd0aCB0byBzZW5kLi4uCisJCSAqLworCQlzdHJ1Y3QgbWVzc2FnZSAqbXNnOworCQlpbnQgbXNnbnIgPSAwLCBpOworCisJCWluZm8tPnNjc2kucGhhc2UgPSBQSEFTRV9TRUxTVEVQUzsKKworCQkvKiBsb2FkIG1lc3NhZ2UgYnl0ZXMgKi8KKwkJd2hpbGUgKChtc2cgPSBtc2dxdWV1ZV9nZXRtc2coJmluZm8tPnNjc2kubXNncywgbXNnbnIrKykpICE9IE5VTEwpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBtc2ctPmxlbmd0aDsgaSsrKQorCQkJCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0ZGLCBtc2ctPm1zZ1tpXSk7CisJCQltc2ctPmZpZm8gPSB0b3RfbXNnbGVuIC0gKGZhczIxNl9yZWFkYihpbmZvLCBSRUdfQ0ZJUykgJiBDRklTX0NGKTsKKwkJfQorCisJCS8qIGxvYWQgY29tbWFuZCAqLworCQlmb3IgKGkgPSAwOyBpIDwgU0NwbnQtPmNtZF9sZW47IGkrKykKKwkJCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0ZGLCBTQ3BudC0+Y21uZFtpXSk7CisKKwkJaWYgKHRvdF9tc2dsZW4gPT0gMSkKKwkJCWZhczIxNl9jbWQoaW5mbywgQ01EX1NFTEVDVEFUTik7CisJCWVsc2UKKwkJCWZhczIxNl9jbWQoaW5mbywgQ01EX1NFTEVDVEFUTjMpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFdlIGhhdmUgYW4gdW51c3VhbCBudW1iZXIgb2YgbWVzc2FnZSBieXRlcyB0byBzZW5kLgorCQkgKiAgTG9hZCBmaXJzdCBieXRlIGludG8gZmlmbywgYW5kIGlzc3VlIFNFTEVDVCB3aXRoIEFUTiBhbmQKKwkJICogIHN0b3Agc3RlcHMuCisJCSAqLworCQlzdHJ1Y3QgbWVzc2FnZSAqbXNnID0gbXNncXVldWVfZ2V0bXNnKCZpbmZvLT5zY3NpLm1zZ3MsIDApOworCisJCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0ZGLCBtc2ctPm1zZ1swXSk7CisJCW1zZy0+ZmlmbyA9IDE7CisKKwkJZmFzMjE2X2NtZChpbmZvLCBDTURfU0VMRUNUQVROU1RPUCk7CisJfQorfQorCisvKgorICogRGVjaWRlIHdoZXRoZXIgd2UgbmVlZCB0byBwZXJmb3JtIGEgcGFyaXR5IHRlc3Qgb24gdGhpcyBkZXZpY2UuCisgKiBDYW4gYWxzbyBiZSB1c2VkIHRvIGZvcmNlIHBhcml0eSBlcnJvciBjb25kaXRpb25zIGR1cmluZyBpbml0aWFsCisgKiBpbmZvcm1hdGlvbiB0cmFuc2ZlciBwaGFzZSAobWVzc2FnZSBvdXQpIGZvciB0ZXN0IHB1cnBvc2VzLgorICovCitzdGF0aWMgaW50IHBhcml0eV90ZXN0KEZBUzIxNl9JbmZvICppbmZvLCBpbnQgdGFyZ2V0KQoreworI2lmIDAKKwlpZiAodGFyZ2V0ID09IDMpIHsKKwkJaW5mby0+ZGV2aWNlW3RhcmdldF0ucGFyaXR5X2NoZWNrID0gMDsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJcmV0dXJuIGluZm8tPmRldmljZVt0YXJnZXRdLnBhcml0eV9jaGVjazsKK30KKworc3RhdGljIHZvaWQgZmFzMjE2X3N0YXJ0X2NvbW1hbmQoRkFTMjE2X0luZm8gKmluZm8sIFNjc2lfQ21uZCAqU0NwbnQpCit7CisJaW50IGRpc2Nvbm5lY3Rfb2s7CisKKwkvKgorCSAqIGNsYWltIGhvc3QgYnVzeQorCSAqLworCWluZm8tPnNjc2kucGhhc2UgPSBQSEFTRV9TRUxFQ1RJT047CisJaW5mby0+c2NzaS5TQ3AgPSBTQ3BudC0+U0NwOworCWluZm8tPlNDcG50ID0gU0NwbnQ7CisJaW5mby0+ZG1hLnRyYW5zZmVyX3R5cGUgPSBmYXNkbWFfbm9uZTsKKworCWlmIChwYXJpdHlfdGVzdChpbmZvLCBTQ3BudC0+ZGV2aWNlLT5pZCkpCisJCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NOVEwxLCBpbmZvLT5zY3NpLmNmZ1swXSB8IENOVEwxX1BURSk7CisJZWxzZQorCQlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19DTlRMMSwgaW5mby0+c2NzaS5jZmdbMF0pOworCisJLyoKKwkgKiBEb24ndCBhbGxvdyByZXF1ZXN0IHNlbnNlIGNvbW1hbmRzIHRvIGRpc2Nvbm5lY3QuCisJICovCisJZGlzY29ubmVjdF9vayA9IFNDcG50LT5jbW5kWzBdICE9IFJFUVVFU1RfU0VOU0UgJiYKKwkJCWluZm8tPmRldmljZVtTQ3BudC0+ZGV2aWNlLT5pZF0uZGlzY29ubmVjdF9vazsKKworCS8qCisJICogYnVpbGQgb3V0Z29pbmcgbWVzc2FnZSBieXRlcworCSAqLworCW1zZ3F1ZXVlX2ZsdXNoKCZpbmZvLT5zY3NpLm1zZ3MpOworCW1zZ3F1ZXVlX2FkZG1zZygmaW5mby0+c2NzaS5tc2dzLCAxLCBJREVOVElGWShkaXNjb25uZWN0X29rLCBTQ3BudC0+ZGV2aWNlLT5sdW4pKTsKKworCS8qCisJICogYWRkIHRhZyBtZXNzYWdlIGlmIHJlcXVpcmVkCisJICovCisJaWYgKFNDcG50LT50YWcpCisJCW1zZ3F1ZXVlX2FkZG1zZygmaW5mby0+c2NzaS5tc2dzLCAyLCBTSU1QTEVfUVVFVUVfVEFHLCBTQ3BudC0+dGFnKTsKKworCWRvIHsKKyNpZmRlZiBTQ1NJMl9TWU5DCisJCWlmICgoaW5mby0+ZGV2aWNlW1NDcG50LT5kZXZpY2UtPmlkXS5zeW5jX3N0YXRlID09IG5lZ193YWl0IHx8CisJCSAgICAgaW5mby0+ZGV2aWNlW1NDcG50LT5kZXZpY2UtPmlkXS5zeW5jX3N0YXRlID09IG5lZ19jb21wbGV0ZSkgJiYKKwkJICAgIChTQ3BudC0+Y21uZFswXSA9PSBSRVFVRVNUX1NFTlNFIHx8CisJCSAgICAgU0NwbnQtPmNtbmRbMF0gPT0gSU5RVUlSWSkpIHsKKwkJCWluZm8tPmRldmljZVtTQ3BudC0+ZGV2aWNlLT5pZF0uc3luY19zdGF0ZSA9IG5lZ19pbnByb2dyZXNzOworCQkJbXNncXVldWVfYWRkbXNnKCZpbmZvLT5zY3NpLm1zZ3MsIDUsCisJCQkJCUVYVEVOREVEX01FU1NBR0UsIDMsIEVYVEVOREVEX1NEVFIsCisJCQkJCTEwMDAgLyBpbmZvLT5pZmNmZy5jbG9ja3JhdGUsCisJCQkJCWluZm8tPmlmY2ZnLnN5bmNfbWF4X2RlcHRoKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwl9IHdoaWxlICgwKTsKKworCV9fZmFzMjE2X3N0YXJ0X2NvbW1hbmQoaW5mbywgU0NwbnQpOworfQorCitzdGF0aWMgdm9pZCBmYXMyMTZfYWxsb2NhdGVfdGFnKEZBUzIxNl9JbmZvICppbmZvLCBTY3NpX0NtbmQgKlNDcG50KQoreworI2lmZGVmIFNDU0kyX1RBRworCS8qCisJICogdGFnZ2VkIHF1ZXVpbmcgLSBhbGxvY2F0ZSBhIG5ldyB0YWcgdG8gdGhpcyBjb21tYW5kCisJICovCisJaWYgKFNDcG50LT5kZXZpY2UtPnNpbXBsZV90YWdzICYmIFNDcG50LT5jbW5kWzBdICE9IFJFUVVFU1RfU0VOU0UgJiYKKwkgICAgU0NwbnQtPmNtbmRbMF0gIT0gSU5RVUlSWSkgeworCSAgICBTQ3BudC0+ZGV2aWNlLT5jdXJyZW50X3RhZyArPSAxOworCQlpZiAoU0NwbnQtPmRldmljZS0+Y3VycmVudF90YWcgPT0gMCkKKwkJICAgIFNDcG50LT5kZXZpY2UtPmN1cnJlbnRfdGFnID0gMTsKKwkJCVNDcG50LT50YWcgPSBTQ3BudC0+ZGV2aWNlLT5jdXJyZW50X3RhZzsKKwl9IGVsc2UKKyNlbmRpZgorCQlzZXRfYml0KFNDcG50LT5kZXZpY2UtPmlkICogOCArIFNDcG50LT5kZXZpY2UtPmx1biwgaW5mby0+YnVzeWx1bnMpOworCisJaW5mby0+c3RhdHMucmVtb3ZlcyArPSAxOworCXN3aXRjaCAoU0NwbnQtPmNtbmRbMF0pIHsKKwljYXNlIFdSSVRFXzY6CisJY2FzZSBXUklURV8xMDoKKwljYXNlIFdSSVRFXzEyOgorCQlpbmZvLT5zdGF0cy53cml0ZXMgKz0gMTsKKwkJYnJlYWs7CisJY2FzZSBSRUFEXzY6CisJY2FzZSBSRUFEXzEwOgorCWNhc2UgUkVBRF8xMjoKKwkJaW5mby0+c3RhdHMucmVhZHMgKz0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaW5mby0+c3RhdHMubWlzY3MgKz0gMTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBmYXMyMTZfZG9fYnVzX2RldmljZV9yZXNldChGQVMyMTZfSW5mbyAqaW5mbywgU2NzaV9DbW5kICpTQ3BudCkKK3sKKwlzdHJ1Y3QgbWVzc2FnZSAqbXNnOworCisJLyoKKwkgKiBjbGFpbSBob3N0IGJ1c3kKKwkgKi8KKwlpbmZvLT5zY3NpLnBoYXNlID0gUEhBU0VfU0VMRUNUSU9OOworCWluZm8tPnNjc2kuU0NwID0gU0NwbnQtPlNDcDsKKwlpbmZvLT5TQ3BudCA9IFNDcG50OworCWluZm8tPmRtYS50cmFuc2Zlcl90eXBlID0gZmFzZG1hX25vbmU7CisKKwlmYXMyMTZfbG9nKGluZm8sIExPR19FUlJPUiwgInNlbmRpbmcgYnVzIGRldmljZSByZXNldCIpOworCisJbXNncXVldWVfZmx1c2goJmluZm8tPnNjc2kubXNncyk7CisJbXNncXVldWVfYWRkbXNnKCZpbmZvLT5zY3NpLm1zZ3MsIDEsIEJVU19ERVZJQ0VfUkVTRVQpOworCisJLyogZm9sbG93aW5nIHdoYXQgdGhlIEVTUCBkcml2ZXIgc2F5cyAqLworCWZhczIxNl9zZXRfc3RjKGluZm8sIDApOworCWZhczIxNl9jbWQoaW5mbywgQ01EX05PUCB8IENNRF9XSVRIRE1BKTsKKworCS8qIGZsdXNoIEZJRk8gKi8KKwlmYXMyMTZfY21kKGluZm8sIENNRF9GTFVTSEZJRk8pOworCisJLyogbG9hZCBidXMtaWQgYW5kIHRpbWVvdXQgKi8KKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19TRElELCBCVVNJRChTQ3BudC0+ZGV2aWNlLT5pZCkpOworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX1NUSU0sIGluZm8tPmlmY2ZnLnNlbGVjdF90aW1lb3V0KTsKKworCS8qIHN5bmNocm9ub3VzIHRyYW5zZmVycyAqLworCWZhczIxNl9zZXRfc3luYyhpbmZvLCBTQ3BudC0+ZGV2aWNlLT5pZCk7CisKKwltc2cgPSBtc2dxdWV1ZV9nZXRtc2coJmluZm8tPnNjc2kubXNncywgMCk7CisKKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19GRiwgQlVTX0RFVklDRV9SRVNFVCk7CisJbXNnLT5maWZvID0gMTsKKworCWZhczIxNl9jbWQoaW5mbywgQ01EX1NFTEVDVEFUTlNUT1ApOworfQorCisvKioKKyAqIGZhczIxNl9raWNrIC0ga2ljayBhIGNvbW1hbmQgdG8gdGhlIGludGVyZmFjZQorICogQGluZm86IG91ciBob3N0IGludGVyZmFjZSB0byBraWNrCisgKgorICogS2ljayBhIGNvbW1hbmQgdG8gdGhlIGludGVyZmFjZSwgaW50ZXJmYWNlIHNob3VsZCBiZSBpZGxlLgorICogTm90ZXM6IEludGVycnVwdHMgYXJlIGFsd2F5cyBkaXNhYmxlZCEKKyAqLworc3RhdGljIHZvaWQgZmFzMjE2X2tpY2soRkFTMjE2X0luZm8gKmluZm8pCit7CisJU2NzaV9DbW5kICpTQ3BudCA9IE5VTEw7CisjZGVmaW5lIFRZUEVfT1RIRVIJMAorI2RlZmluZSBUWVBFX1JFU0VUCTEKKyNkZWZpbmUgVFlQRV9RVUVVRQkyCisJaW50IHdoZXJlX2Zyb20gPSBUWVBFX09USEVSOworCisJZmFzMjE2X2NoZWNrbWFnaWMoaW5mbyk7CisKKwkvKgorCSAqIE9idGFpbiB0aGUgbmV4dCBjb21tYW5kIHRvIHByb2Nlc3MuCisJICovCisJZG8geworCQlpZiAoaW5mby0+cnN0U0NwbnQpIHsKKwkJCVNDcG50ID0gaW5mby0+cnN0U0NwbnQ7CisJCQkvKiBkb24ndCByZW1vdmUgaXQgKi8KKwkJCXdoZXJlX2Zyb20gPSBUWVBFX1JFU0VUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaW5mby0+cmVxU0NwbnQpIHsKKwkJCVNDcG50ID0gaW5mby0+cmVxU0NwbnQ7CisJCQlpbmZvLT5yZXFTQ3BudCA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChpbmZvLT5vcmlnU0NwbnQpIHsKKwkJCVNDcG50ID0gaW5mby0+b3JpZ1NDcG50OworCQkJaW5mby0+b3JpZ1NDcG50ID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogcmV0cmlldmUgbmV4dCBjb21tYW5kICovCisJCWlmICghU0NwbnQpIHsKKwkJCVNDcG50ID0gcXVldWVfcmVtb3ZlX2V4Y2x1ZGUoJmluZm8tPnF1ZXVlcy5pc3N1ZSwKKwkJCQkJCSAgICAgaW5mby0+YnVzeWx1bnMpOworCQkJd2hlcmVfZnJvbSA9IFRZUEVfUVVFVUU7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKDApOworCisJaWYgKCFTQ3BudCkgeworCQkvKgorCQkgKiBubyBjb21tYW5kIHBlbmRpbmcsIHNvIGVuYWJsZSByZXNlbGVjdGlvbi4KKwkJICovCisJCWZhczIxNl9jbWQoaW5mbywgQ01EX0VOQUJMRVNFTCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFdlJ3JlIGdvaW5nIHRvIHN0YXJ0IGEgY29tbWFuZCwgc28gZGlzYWJsZSByZXNlbGVjdGlvbgorCSAqLworCWZhczIxNl9jbWQoaW5mbywgQ01EX0RJU0FCTEVTRUwpOworCisJaWYgKGluZm8tPnNjc2kuZGlzY29ubmVjdGFibGUgJiYgaW5mby0+U0NwbnQpIHsKKwkJZmFzMjE2X2xvZyhpbmZvLCBMT0dfQ09OTkVDVCwKKwkJCSJtb3ZlZCBjb21tYW5kIGZvciAlZCB0byBkaXNjb25uZWN0ZWQgcXVldWUiLAorCQkJaW5mby0+U0NwbnQtPmRldmljZS0+aWQpOworCQlxdWV1ZV9hZGRfY21kX3RhaWwoJmluZm8tPnF1ZXVlcy5kaXNjb25uZWN0ZWQsIGluZm8tPlNDcG50KTsKKwkJaW5mby0+c2NzaS5kaXNjb25uZWN0YWJsZSA9IDA7CisJCWluZm8tPlNDcG50ID0gTlVMTDsKKwl9CisKKwlmYXMyMTZfbG9nX2NvbW1hbmQoaW5mbywgTE9HX0NPTk5FQ1QgfCBMT0dfTUVTU0FHRVMsIFNDcG50LAorCQkJICAgInN0YXJ0aW5nIik7CisKKwlzd2l0Y2ggKHdoZXJlX2Zyb20pIHsKKwljYXNlIFRZUEVfUVVFVUU6CisJCWZhczIxNl9hbGxvY2F0ZV90YWcoaW5mbywgU0NwbnQpOworCWNhc2UgVFlQRV9PVEhFUjoKKwkJZmFzMjE2X3N0YXJ0X2NvbW1hbmQoaW5mbywgU0NwbnQpOworCQlicmVhazsKKwljYXNlIFRZUEVfUkVTRVQ6CisJCWZhczIxNl9kb19idXNfZGV2aWNlX3Jlc2V0KGluZm8sIFNDcG50KTsKKwkJYnJlYWs7CisJfQorCisJZmFzMjE2X2xvZyhpbmZvLCBMT0dfQ09OTkVDVCwgInNlbGVjdDogZGF0YSBwb2ludGVycyBbJXAsICVYXSIsCisJCWluZm8tPnNjc2kuU0NwLnB0ciwgaW5mby0+c2NzaS5TQ3AudGhpc19yZXNpZHVhbCk7CisKKwkvKgorCSAqIHNob3VsZCBub3cgZ2V0IGVpdGhlciBESVNDT05ORUNUIG9yCisJICogKEZVTkNUSU9OIERPTkUgd2l0aCBCVVMgU0VSVklDRSkgaW50ZXJydXB0CisJICovCit9CisKKy8qCisgKiBDbGVhbiB1cCBmcm9tIGlzc3VpbmcgYSBCVVMgREVWSUNFIFJFU0VUIG1lc3NhZ2UgdG8gYSBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkCitmYXMyMTZfZGV2aWNlcmVzZXRfZG9uZShGQVMyMTZfSW5mbyAqaW5mbywgU2NzaV9DbW5kICpTQ3BudCwgdW5zaWduZWQgaW50IHJlc3VsdCkKK3sKKwlmYXMyMTZfbG9nKGluZm8sIExPR19FUlJPUiwgImZhczIxNiBkZXZpY2UgcmVzZXQgY29tcGxldGUiKTsKKworCWluZm8tPnJzdFNDcG50ID0gTlVMTDsKKwlpbmZvLT5yc3RfZGV2X3N0YXR1cyA9IDE7CisJd2FrZV91cCgmaW5mby0+ZWhfd2FpdCk7Cit9CisKKy8qKgorICogZmFzMjE2X3JxX3Nuc19kb25lIC0gRmluaXNoIHByb2Nlc3NpbmcgYXV0b21hdGljIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZAorICogQGluZm86IGludGVyZmFjZSB0aGF0IGNvbXBsZXRlZAorICogQFNDcG50OiBjb21tYW5kIHRoYXQgY29tcGxldGVkCisgKiBAcmVzdWx0OiBkcml2ZXIgYnl0ZSBvZiByZXN1bHQKKyAqCisgKiBGaW5pc2ggcHJvY2Vzc2luZyBhdXRvbWF0aWMgcmVxdWVzdCBzZW5zZSBjb21tYW5kCisgKi8KK3N0YXRpYyB2b2lkCitmYXMyMTZfcnFfc25zX2RvbmUoRkFTMjE2X0luZm8gKmluZm8sIFNjc2lfQ21uZCAqU0NwbnQsIHVuc2lnbmVkIGludCByZXN1bHQpCit7CisJZmFzMjE2X2xvZ190YXJnZXQoaW5mbywgTE9HX0NPTk5FQ1QsIFNDcG50LT5kZXZpY2UtPmlkLAorCQkgICAicmVxdWVzdCBzZW5zZSBjb21wbGV0ZSwgcmVzdWx0PTB4JTA0eCUwMnglMDJ4IiwKKwkJICAgcmVzdWx0LCBTQ3BudC0+U0NwLk1lc3NhZ2UsIFNDcG50LT5TQ3AuU3RhdHVzKTsKKworCWlmIChyZXN1bHQgIT0gRElEX09LIHx8IFNDcG50LT5TQ3AuU3RhdHVzICE9IEdPT0QpCisJCS8qCisJCSAqIFNvbWV0aGluZyB3ZW50IHdyb25nLiAgTWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QKKwkJICogaGF2ZSB2YWxpZCBkYXRhIGluIHRoZSBzZW5zZSBidWZmZXIgdGhhdCBjb3VsZAorCQkgKiBjb25mdXNlIHRoZSBoaWdoZXIgbGV2ZWxzLgorCQkgKi8KKwkJbWVtc2V0KFNDcG50LT5zZW5zZV9idWZmZXIsIDAsIHNpemVvZihTQ3BudC0+c2Vuc2VfYnVmZmVyKSk7CisvL3ByaW50aygic2NzaSVkLiVjOiBzZW5zZSBidWZmZXI6ICIsIGluZm8tPmhvc3QtPmhvc3Rfbm8sICcwJyArIFNDcG50LT5kZXZpY2UtPmlkKTsKKy8veyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHByaW50aygiJTAyeCAiLCBTQ3BudC0+c2Vuc2VfYnVmZmVyW2ldKTsgcHJpbnRrKCJcbiIpOyB9CisJLyoKKwkgKiBOb3RlIHRoYXQgd2UgZG9uJ3Qgc2V0IFNDcG50LT5yZXN1bHQsIHNpbmNlIHRoYXQgc2hvdWxkCisJICogcmVmbGVjdCB0aGUgc3RhdHVzIG9mIHRoZSBjb21tYW5kIHRoYXQgd2Ugd2VyZSBhc2tlZCBieQorCSAqIHRoZSB1cHBlciBsYXllcnMgdG8gcHJvY2Vzcy4gIFRoaXMgd291bGQgaGF2ZSBiZWVuIHNldAorCSAqIGNvcnJlY3RseSBieSBmYXMyMTZfc3RkX2RvbmUuCisJICovCisJU0NwbnQtPnNjc2lfZG9uZShTQ3BudCk7Cit9CisKKy8qKgorICogZmFzMjE2X3N0ZF9kb25lIC0gZmluaXNoIHByb2Nlc3Npbmcgb2Ygc3RhbmRhcmQgY29tbWFuZAorICogQGluZm86IGludGVyZmFjZSB0aGF0IGNvbXBsZXRlZAorICogQFNDcG50OiBjb21tYW5kIHRoYXQgY29tcGxldGVkCisgKiBAcmVzdWx0OiBkcml2ZXIgYnl0ZSBvZiByZXN1bHQKKyAqCisgKiBGaW5pc2ggcHJvY2Vzc2luZyBvZiBzdGFuZGFyZCBjb21tYW5kCisgKi8KK3N0YXRpYyB2b2lkCitmYXMyMTZfc3RkX2RvbmUoRkFTMjE2X0luZm8gKmluZm8sIFNjc2lfQ21uZCAqU0NwbnQsIHVuc2lnbmVkIGludCByZXN1bHQpCit7CisJaW5mby0+c3RhdHMuZmlucyArPSAxOworCisJU0NwbnQtPnJlc3VsdCA9IHJlc3VsdCA8PCAxNiB8IGluZm8tPnNjc2kuU0NwLk1lc3NhZ2UgPDwgOCB8CisJCQlpbmZvLT5zY3NpLlNDcC5TdGF0dXM7CisKKwlmYXMyMTZfbG9nX2NvbW1hbmQoaW5mbywgTE9HX0NPTk5FQ1QsIFNDcG50LAorCQkiY29tbWFuZCBjb21wbGV0ZSwgcmVzdWx0PTB4JTA4eCIsIFNDcG50LT5yZXN1bHQpOworCisJLyoKKwkgKiBJZiB0aGUgZHJpdmVyIGRldGVjdGVkIGFuIGVycm9yLCB3ZSdyZSBhbGwgZG9uZS4KKwkgKi8KKwlpZiAoaG9zdF9ieXRlKFNDcG50LT5yZXN1bHQpICE9IERJRF9PSyB8fAorCSAgICBtc2dfYnl0ZShTQ3BudC0+cmVzdWx0KSAhPSBDT01NQU5EX0NPTVBMRVRFKQorCQlnb3RvIGRvbmU7CisKKwkvKgorCSAqIElmIHRoZSBjb21tYW5kIHJldHVybmVkIENIRUNLX0NPTkRJVElPTiBvciBDT01NQU5EX1RFUk1JTkFURUQKKwkgKiBzdGF0dXMsIHJlcXVlc3QgdGhlIHNlbnNlIGluZm9ybWF0aW9uLgorCSAqLworCWlmIChzdGF0dXNfYnl0ZShTQ3BudC0+cmVzdWx0KSA9PSBDSEVDS19DT05ESVRJT04gfHwKKwkgICAgc3RhdHVzX2J5dGUoU0NwbnQtPnJlc3VsdCkgPT0gQ09NTUFORF9URVJNSU5BVEVEKQorCQlnb3RvIHJlcXVlc3Rfc2Vuc2U7CisKKwkvKgorCSAqIElmIHRoZSBjb21tYW5kIGRpZCBub3QgY29tcGxldGUgd2l0aCBHT09EIHN0YXR1cywKKwkgKiB3ZSBhcmUgYWxsIGRvbmUgaGVyZS4KKwkgKi8KKwlpZiAoc3RhdHVzX2J5dGUoU0NwbnQtPnJlc3VsdCkgIT0gR09PRCkKKwkJZ290byBkb25lOworCisJLyoKKwkgKiBXZSBoYXZlIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgYSBjb21tYW5kLiAgTWFrZSBzdXJlIHRoYXQKKwkgKiB3ZSBkbyBub3QgaGF2ZSBhbnkgYnVmZmVycyBsZWZ0IHRvIHRyYW5zZmVyLiAgVGhlIHdvcmxkCisJICogaXMgbm90IHBlcmZlY3QsIGFuZCB3ZSBzZWVtIHRvIG9jY2FzaW9uYWxseSBoaXQgdGhpcy4KKwkgKiBJdCBjYW4gYmUgaW5kaWNhdGl2ZSBvZiBhIGJ1Z2d5IGRyaXZlciwgdGFyZ2V0IG9yIHRoZSB1cHBlcgorCSAqIGxldmVscyBvZiB0aGUgU0NTSSBjb2RlLgorCSAqLworCWlmIChpbmZvLT5zY3NpLlNDcC5wdHIpIHsKKwkJc3dpdGNoIChTQ3BudC0+Y21uZFswXSkgeworCQljYXNlIElOUVVJUlk6CisJCWNhc2UgU1RBUlRfU1RPUDoKKwkJY2FzZSBNT0RFX1NFTlNFOgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiBpbmNvbXBsZXRlIGRhdGEgdHJhbnNmZXIgIgorCQkJCSJkZXRlY3RlZDogcmVzPSUwOFggcHRyPSVwIGxlbj0lWCBDREI6ICIsCisJCQkJaW5mby0+aG9zdC0+aG9zdF9ubywgJzAnICsgU0NwbnQtPmRldmljZS0+aWQsCisJCQkJU0NwbnQtPnJlc3VsdCwgaW5mby0+c2NzaS5TQ3AucHRyLAorCQkJCWluZm8tPnNjc2kuU0NwLnRoaXNfcmVzaWR1YWwpOworCQkJcHJpbnRfY29tbWFuZChTQ3BudC0+Y21uZCk7CisJCQlTQ3BudC0+cmVzdWx0ICY9IH4oMjU1IDw8IDE2KTsKKwkJCVNDcG50LT5yZXN1bHQgfD0gRElEX0JBRF9UQVJHRVQgPDwgMTY7CisJCQlnb3RvIHJlcXVlc3Rfc2Vuc2U7CisJCX0KKwl9CisKK2RvbmU6CisJaWYgKFNDcG50LT5zY3NpX2RvbmUpIHsKKwkJU0NwbnQtPnNjc2lfZG9uZShTQ3BudCk7CisJCXJldHVybjsKKwl9CisKKwlwYW5pYygic2NzaSVkLkg6IG51bGwgc2NzaV9kb25lIGZ1bmN0aW9uIGluIGZhczIxNl9kb25lIiwKKwkJaW5mby0+aG9zdC0+aG9zdF9ubyk7CisKKworcmVxdWVzdF9zZW5zZToKKwlpZiAoU0NwbnQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkKKwkJZ290byBkb25lOworCisJZmFzMjE2X2xvZ190YXJnZXQoaW5mbywgTE9HX0NPTk5FQ1QsIFNDcG50LT5kZXZpY2UtPmlkLAorCQkJICAicmVxdWVzdGluZyBzZW5zZSIpOworCW1lbXNldChTQ3BudC0+Y21uZCwgMCwgc2l6ZW9mIChTQ3BudC0+Y21uZCkpOworCVNDcG50LT5jbW5kWzBdID0gUkVRVUVTVF9TRU5TRTsKKwlTQ3BudC0+Y21uZFsxXSA9IFNDcG50LT5kZXZpY2UtPmx1biA8PCA1OworCVNDcG50LT5jbW5kWzRdID0gc2l6ZW9mKFNDcG50LT5zZW5zZV9idWZmZXIpOworCVNDcG50LT5jbWRfbGVuID0gQ09NTUFORF9TSVpFKFNDcG50LT5jbW5kWzBdKTsKKwlTQ3BudC0+U0NwLmJ1ZmZlciA9IE5VTEw7CisJU0NwbnQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gMDsKKwlTQ3BudC0+U0NwLnB0ciA9IChjaGFyICopU0NwbnQtPnNlbnNlX2J1ZmZlcjsKKwlTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBzaXplb2YoU0NwbnQtPnNlbnNlX2J1ZmZlcik7CisJU0NwbnQtPlNDcC5NZXNzYWdlID0gMDsKKwlTQ3BudC0+U0NwLlN0YXR1cyA9IDA7CisJU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiA9IHNpemVvZihTQ3BudC0+c2Vuc2VfYnVmZmVyKTsKKwlTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfUkVBRDsKKwlTQ3BudC0+dXNlX3NnID0gMDsKKwlTQ3BudC0+dGFnID0gMDsKKwlTQ3BudC0+aG9zdF9zY3JpYmJsZSA9ICh2b2lkICopZmFzMjE2X3JxX3Nuc19kb25lOworCisJLyoKKwkgKiBQbGFjZSB0aGlzIGNvbW1hbmQgaW50byB0aGUgaGlnaCBwcmlvcml0eSAicmVxdWVzdAorCSAqIHNlbnNlIiBzbG90LiAgVGhpcyB3aWxsIGJlIHRoZSB2ZXJ5IG5leHQgY29tbWFuZAorCSAqIGV4ZWN1dGVkLCB1bmxlc3MgYSB0YXJnZXQgY29ubmVjdHMgdG8gdXMuCisJICovCisJaWYgKGluZm8tPnJlcVNDcG50KQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQuJWM6IGxvb3NpbmcgcmVxdWVzdCBjb21tYW5kXG4iLAorCQkJaW5mby0+aG9zdC0+aG9zdF9ubywgJzAnICsgU0NwbnQtPmRldmljZS0+aWQpOworCWluZm8tPnJlcVNDcG50ID0gU0NwbnQ7Cit9CisKKy8qKgorICogZmFzMjE2X2RvbmUgLSBjb21wbGV0ZSBwcm9jZXNzaW5nIGZvciBjdXJyZW50IGNvbW1hbmQKKyAqIEBpbmZvOiBpbnRlcmZhY2UgdGhhdCBjb21wbGV0ZWQKKyAqIEByZXN1bHQ6IGRyaXZlciBieXRlIG9mIHJlc3VsdAorICoKKyAqIENvbXBsZXRlIHByb2Nlc3NpbmcgZm9yIGN1cnJlbnQgY29tbWFuZAorICovCitzdGF0aWMgdm9pZCBmYXMyMTZfZG9uZShGQVMyMTZfSW5mbyAqaW5mbywgdW5zaWduZWQgaW50IHJlc3VsdCkKK3sKKwl2b2lkICgqZm4pKEZBUzIxNl9JbmZvICosIFNjc2lfQ21uZCAqLCB1bnNpZ25lZCBpbnQpOworCVNjc2lfQ21uZCAqU0NwbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCisJaWYgKCFpbmZvLT5TQ3BudCkKKwkJZ290byBub19jb21tYW5kOworCisJU0NwbnQgPSBpbmZvLT5TQ3BudDsKKwlpbmZvLT5TQ3BudCA9IE5VTEw7CisgICAgCWluZm8tPnNjc2kucGhhc2UgPSBQSEFTRV9JRExFOworCisJaWYgKGluZm8tPnNjc2kuYWJvcnRpbmcpIHsKKwkJZmFzMjE2X2xvZyhpbmZvLCAwLCAidW5jYXVnaHQgYWJvcnQgLSByZXR1cm5pbmcgRElEX0FCT1JUIik7CisJCXJlc3VsdCA9IERJRF9BQk9SVDsKKwkJaW5mby0+c2NzaS5hYm9ydGluZyA9IDA7CisJfQorCisJLyoKKwkgKiBTYW5pdHkgY2hlY2sgdGhlIGNvbXBsZXRpb24gLSBpZiB3ZSBoYXZlIHplcm8gYnl0ZXMgbGVmdAorCSAqIHRvIHRyYW5zZmVyLCB3ZSBzaG91bGQgbm90IGhhdmUgYSB2YWxpZCBwb2ludGVyLgorCSAqLworCWlmIChpbmZvLT5zY3NpLlNDcC5wdHIgJiYgaW5mby0+c2NzaS5TQ3AudGhpc19yZXNpZHVhbCA9PSAwKSB7CisJCXByaW50aygic2NzaSVkLiVjOiB6ZXJvIGJ5dGVzIGxlZnQgdG8gdHJhbnNmZXIsIGJ1dCAiCisJCSAgICAgICAiYnVmZmVyIHBvaW50ZXIgc3RpbGwgdmFsaWQ6IHB0cj0lcCBsZW49JTA4eCBDREI6ICIsCisJCSAgICAgICBpbmZvLT5ob3N0LT5ob3N0X25vLCAnMCcgKyBTQ3BudC0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIGluZm8tPnNjc2kuU0NwLnB0ciwgaW5mby0+c2NzaS5TQ3AudGhpc19yZXNpZHVhbCk7CisJCWluZm8tPnNjc2kuU0NwLnB0ciA9IE5VTEw7CisJCXByaW50X2NvbW1hbmQoU0NwbnQtPmNtbmQpOworCX0KKworCS8qCisJICogQ2xlYXIgZG93biB0aGlzIGNvbW1hbmQgYXMgY29tcGxldGVkLiAgSWYgd2UgbmVlZCB0byByZXF1ZXN0CisJICogdGhlIHNlbnNlIGluZm9ybWF0aW9uLCBmYXMyMTZfa2ljayB3aWxsIHJlLWFzc2VydCB0aGUgYnVzeQorCSAqIHN0YXR1cy4KKwkgKi8KKwlpbmZvLT5kZXZpY2VbU0NwbnQtPmRldmljZS0+aWRdLnBhcml0eV9jaGVjayA9IDA7CisJY2xlYXJfYml0KFNDcG50LT5kZXZpY2UtPmlkICogOCArIFNDcG50LT5kZXZpY2UtPmx1biwgaW5mby0+YnVzeWx1bnMpOworCisJZm4gPSAodm9pZCAoKikoRkFTMjE2X0luZm8gKiwgU2NzaV9DbW5kICosIHVuc2lnbmVkIGludCkpU0NwbnQtPmhvc3Rfc2NyaWJibGU7CisJZm4oaW5mbywgU0NwbnQsIHJlc3VsdCk7CisKKwlpZiAoaW5mby0+c2NzaS5pcnEgIT0gTk9fSVJRKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJaWYgKGluZm8tPnNjc2kucGhhc2UgPT0gUEhBU0VfSURMRSkKKwkJCWZhczIxNl9raWNrKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl9CisJcmV0dXJuOworCitub19jb21tYW5kOgorCXBhbmljKCJzY3NpJWQuSDogbnVsbCBjb21tYW5kIGluIGZhczIxNl9kb25lIiwKKwkJaW5mby0+aG9zdC0+aG9zdF9ubyk7Cit9CisKKy8qKgorICogZmFzMjE2X3F1ZXVlX2NvbW1hbmQgLSBxdWV1ZSBhIGNvbW1hbmQgZm9yIGFkYXB0ZXIgdG8gcHJvY2Vzcy4KKyAqIEBTQ3BudDogQ29tbWFuZCB0byBxdWV1ZQorICogQGRvbmU6IGRvbmUgZnVuY3Rpb24gdG8gY2FsbCBvbmNlIGNvbW1hbmQgaXMgY29tcGxldGUKKyAqCisgKiBRdWV1ZSBhIGNvbW1hbmQgZm9yIGFkYXB0ZXIgdG8gcHJvY2Vzcy4KKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgZWxzZSBlcnJvci4KKyAqIE5vdGVzOiBpb19yZXF1ZXN0X2xvY2sgaXMgaGVsZCwgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuCisgKi8KK2ludCBmYXMyMTZfcXVldWVfY29tbWFuZChTY3NpX0NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQoreworCUZBUzIxNl9JbmZvICppbmZvID0gKEZBUzIxNl9JbmZvICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJaW50IHJlc3VsdDsKKworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCisJZmFzMjE2X2xvZ19jb21tYW5kKGluZm8sIExPR19DT05ORUNULCBTQ3BudCwKKwkJCSAgICJyZWNlaXZlZCBjb21tYW5kICglcCkiLCBTQ3BudCk7CisKKwlTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKKwlTQ3BudC0+aG9zdF9zY3JpYmJsZSA9ICh2b2lkICopZmFzMjE2X3N0ZF9kb25lOworCVNDcG50LT5yZXN1bHQgPSAwOworCisJaW5pdF9TQ3AoU0NwbnQpOworCisJaW5mby0+c3RhdHMucXVldWVzICs9IDE7CisJU0NwbnQtPnRhZyA9IDA7CisKKwlzcGluX2xvY2soJmluZm8tPmhvc3RfbG9jayk7CisKKwkvKgorCSAqIEFkZCBjb21tYW5kIGludG8gZXhlY3V0ZSBxdWV1ZSBhbmQgbGV0IGl0IGNvbXBsZXRlIHVuZGVyCisJICogd2hhdGV2ZXIgc2NoZW1lIHdlJ3JlIHVzaW5nLgorCSAqLworCXJlc3VsdCA9ICFxdWV1ZV9hZGRfY21kX29yZGVyZWQoJmluZm8tPnF1ZXVlcy5pc3N1ZSwgU0NwbnQpOworCisJLyoKKwkgKiBJZiB3ZSBzdWNjZXNzZnVsbHkgYWRkZWQgdGhlIGNvbW1hbmQsCisJICoga2ljayB0aGUgaW50ZXJmYWNlIHRvIGdldCBpdCBtb3ZpbmcuCisJICovCisJaWYgKHJlc3VsdCA9PSAwICYmIGluZm8tPnNjc2kucGhhc2UgPT0gUEhBU0VfSURMRSkKKwkJZmFzMjE2X2tpY2soaW5mbyk7CisJc3Bpbl91bmxvY2soJmluZm8tPmhvc3RfbG9jayk7CisKKwlmYXMyMTZfbG9nX3RhcmdldChpbmZvLCBMT0dfQ09OTkVDVCwgLTEsICJxdWV1ZSAlcyIsCisJCXJlc3VsdCA/ICJmYWlsdXJlIiA6ICJzdWNjZXNzIik7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIGZhczIxNl9pbnRlcm5hbF9kb25lIC0gdHJpZ2dlciByZXN0YXJ0IG9mIGEgd2FpdGluZyB0aHJlYWQgaW4gZmFzMjE2X25vcXVldWVfY29tbWFuZAorICogQFNDcG50OiBDb21tYW5kIHRvIHdha2UKKyAqCisgKiBUcmlnZ2VyIHJlc3RhcnQgb2YgYSB3YWl0aW5nIHRocmVhZCBpbiBmYXMyMTZfY29tbWFuZAorICovCitzdGF0aWMgdm9pZCBmYXMyMTZfaW50ZXJuYWxfZG9uZShTY3NpX0NtbmQgKlNDcG50KQoreworCUZBUzIxNl9JbmZvICppbmZvID0gKEZBUzIxNl9JbmZvICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlmYXMyMTZfY2hlY2ttYWdpYyhpbmZvKTsKKworCWluZm8tPmludGVybmFsX2RvbmUgPSAxOworfQorCisvKioKKyAqIGZhczIxNl9ub3F1ZXVlX2NvbW1hbmQgLSBwcm9jZXNzIGEgY29tbWFuZCBmb3IgdGhlIGFkYXB0ZXIuCisgKiBAU0NwbnQ6IENvbW1hbmQgdG8gcXVldWUKKyAqCisgKiBRdWV1ZSBhIGNvbW1hbmQgZm9yIGFkYXB0ZXIgdG8gcHJvY2Vzcy4KKyAqIFJldHVybnM6IHNjc2kgcmVzdWx0IGNvZGUuCisgKiBOb3RlczogaW9fcmVxdWVzdF9sb2NrIGlzIGhlbGQsIGludGVycnVwdHMgYXJlIGRpc2FibGVkLgorICovCitpbnQgZmFzMjE2X25vcXVldWVfY29tbWFuZChTY3NpX0NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQoreworCUZBUzIxNl9JbmZvICppbmZvID0gKEZBUzIxNl9JbmZvICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlmYXMyMTZfY2hlY2ttYWdpYyhpbmZvKTsKKworCS8qCisJICogV2Ugc2hvdWxkIG9ubHkgYmUgdXNpbmcgdGhpcyBpZiB3ZSBkb24ndCBoYXZlIGFuIGludGVycnVwdC4KKwkgKiBQcm92aWRlIHNvbWUgImluY2VudGl2ZSIgdG8gdXNlIHRoZSBxdWV1ZWluZyBjb2RlLgorCSAqLworCUJVR19PTihpbmZvLT5zY3NpLmlycSAhPSBOT19JUlEpOworCisJaW5mby0+aW50ZXJuYWxfZG9uZSA9IDA7CisJZmFzMjE2X3F1ZXVlX2NvbW1hbmQoU0NwbnQsIGZhczIxNl9pbnRlcm5hbF9kb25lKTsKKworCS8qCisJICogVGhpcyB3YXN0ZXMgdGltZSwgc2luY2Ugd2UgY2FuJ3QgcmV0dXJuIHVudGlsIHRoZSBjb21tYW5kIGlzCisJICogY29tcGxldGUuIFdlIGNhbid0IHNsZWVwIGVpdGhlciBzaW5jZSB3ZSBtYXkgZ2V0IHJlLWVudGVyZWQhCisJICogSG93ZXZlciwgd2UgbXVzdCByZS1lbmFibGUgaW50ZXJydXB0cywgb3IgZWxzZSB3ZSdsbCBiZQorCSAqIHdhaXRpbmcgZm9yZXZlci4KKwkgKi8KKwlzcGluX3VubG9ja19pcnEoaW5mby0+aG9zdC0+aG9zdF9sb2NrKTsKKworCXdoaWxlICghaW5mby0+aW50ZXJuYWxfZG9uZSkgeworCQkvKgorCQkgKiBJZiB3ZSBkb24ndCBoYXZlIGFuIElSUSwgdGhlbiB3ZSBtdXN0IHBvbGwgdGhlIGNhcmQgZm9yCisJCSAqIGl0J3MgaW50ZXJydXB0LCBhbmQgdXNlIHRoYXQgdG8gY2FsbCB0aGlzIGRyaXZlcidzCisJCSAqIGludGVycnVwdCByb3V0aW5lLiAgVGhhdCB3YXksIHdlIGtlZXAgdGhlIGNvbW1hbmQKKwkJICogcHJvZ3Jlc3NpbmcuICBNYXliZSB3ZSBjYW4gYWRkIHNvbWUgaW50ZWxpZ2VuY2UgaGVyZQorCQkgKiBhbmQgZ28gdG8gc2xlZXAgaWYgd2Uga25vdyB0aGF0IHRoZSBkZXZpY2UgaXMgZ29pbmcKKwkJICogdG8gYmUgc29tZSB0aW1lIChlZywgZGlzY29ubmVjdGVkKS4KKwkJICovCisJCWlmIChmYXMyMTZfcmVhZGIoaW5mbywgUkVHX1NUQVQpICYgU1RBVF9JTlQpIHsKKwkJCXNwaW5fbG9ja19pcnEoaW5mby0+aG9zdC0+aG9zdF9sb2NrKTsKKwkJCWZhczIxNl9pbnRyKGluZm8pOworCQkJc3Bpbl91bmxvY2tfaXJxKGluZm8tPmhvc3QtPmhvc3RfbG9jayk7CisJCX0KKwl9CisKKwlzcGluX2xvY2tfaXJxKGluZm8tPmhvc3QtPmhvc3RfbG9jayk7CisKKwlkb25lKFNDcG50KTsKKworCXJldHVybiAwOworfQorCisvKgorICogRXJyb3IgaGFuZGxlciB0aW1lb3V0IGZ1bmN0aW9uLiAgSW5kaWNhdGUgdGhhdCB3ZSB0aW1lZCBvdXQsCisgKiBhbmQgd2FrZSB1cCBhbnkgZXJyb3IgaGFuZGxlciBwcm9jZXNzIHNvIGl0IGNhbiBjb250aW51ZS4KKyAqLworc3RhdGljIHZvaWQgZmFzMjE2X2VoX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlGQVMyMTZfSW5mbyAqaW5mbyA9IChGQVMyMTZfSW5mbyAqKWRhdGE7CisKKwlmYXMyMTZfbG9nKGluZm8sIExPR19FUlJPUiwgImVycm9yIGhhbmRsaW5nIHRpbWVkIG91dFxuIik7CisKKwlkZWxfdGltZXIoJmluZm8tPmVoX3RpbWVyKTsKKworCWlmIChpbmZvLT5yc3RfYnVzX3N0YXR1cyA9PSAwKQorCQlpbmZvLT5yc3RfYnVzX3N0YXR1cyA9IC0xOworCWlmIChpbmZvLT5yc3RfZGV2X3N0YXR1cyA9PSAwKQorCQlpbmZvLT5yc3RfZGV2X3N0YXR1cyA9IC0xOworCisJd2FrZV91cCgmaW5mby0+ZWhfd2FpdCk7Cit9CisKK2VudW0gcmVzX2ZpbmQgeworCXJlc19mYWlsZWQsCQkvKiBub3QgZm91bmQJCQkqLworCXJlc19zdWNjZXNzLAkJLyogY29tbWFuZCBvbiBpc3N1ZSBxdWV1ZQkqLworCXJlc19od19hYm9ydAkJLyogY29tbWFuZCBvbiBkaXNjb25uZWN0ZWQgZGV2CSovCit9OworCisvKioKKyAqIGZhczIxNl9kb19hYm9ydCAtIGRlY2lkZSBob3cgdG8gYWJvcnQgYSBjb21tYW5kCisgKiBAU0NwbnQ6IGNvbW1hbmQgdG8gYWJvcnQKKyAqCisgKiBEZWNpZGUgaG93IHRvIGFib3J0IGEgY29tbWFuZC4KKyAqIFJldHVybnM6IGFib3J0IHN0YXR1cworICovCitzdGF0aWMgZW51bSByZXNfZmluZCBmYXMyMTZfZmluZF9jb21tYW5kKEZBUzIxNl9JbmZvICppbmZvLCBTY3NpX0NtbmQgKlNDcG50KQoreworCWVudW0gcmVzX2ZpbmQgcmVzID0gcmVzX2ZhaWxlZDsKKworCWlmIChxdWV1ZV9yZW1vdmVfY21kKCZpbmZvLT5xdWV1ZXMuaXNzdWUsIFNDcG50KSkgeworCQkvKgorCQkgKiBUaGUgY29tbWFuZCB3YXMgb24gdGhlIGlzc3VlIHF1ZXVlLCBhbmQgaGFzIG5vdCBiZWVuCisJCSAqIGlzc3VlZCB5ZXQuICBXZSBjYW4gcmVtb3ZlIHRoZSBjb21tYW5kIGZyb20gdGhlIHF1ZXVlLAorCQkgKiBhbmQgYWNrbm93bGVkZ2UgdGhlIGFib3J0LiAgTmVpdGhlciB0aGUgZGV2aWNlIG5vciB0aGUKKwkJICogaW50ZXJmYWNlIGtub3cgYWJvdXQgdGhlIGNvbW1hbmQuCisJCSAqLworCQlwcmludGsoIm9uIGlzc3VlIHF1ZXVlICIpOworCisJCXJlcyA9IHJlc19zdWNjZXNzOworCX0gZWxzZSBpZiAocXVldWVfcmVtb3ZlX2NtZCgmaW5mby0+cXVldWVzLmRpc2Nvbm5lY3RlZCwgU0NwbnQpKSB7CisJCS8qCisJCSAqIFRoZSBjb21tYW5kIHdhcyBvbiB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLiAgV2UgbXVzdAorCQkgKiByZWNvbm5lY3Qgd2l0aCB0aGUgZGV2aWNlIGlmIHBvc3NpYmxlLCBhbmQgc2VuZCBpdAorCQkgKiBhbiBhYm9ydCBtZXNzYWdlLgorCQkgKi8KKwkJcHJpbnRrKCJvbiBkaXNjb25uZWN0ZWQgcXVldWUgIik7CisKKwkJcmVzID0gcmVzX2h3X2Fib3J0OworCX0gZWxzZSBpZiAoaW5mby0+U0NwbnQgPT0gU0NwbnQpIHsKKwkJcHJpbnRrKCJleGVjdXRpbmcgIik7CisKKwkJc3dpdGNoIChpbmZvLT5zY3NpLnBoYXNlKSB7CisJCS8qCisJCSAqIElmIHRoZSBpbnRlcmZhY2UgaXMgaWRsZSwgYW5kIHRoZSBjb21tYW5kIGlzICdkaXNjb25uZWN0YWJsZScsCisJCSAqIHRoZW4gaXQgaXMgdGhlIHNhbWUgYXMgb24gdGhlIGRpc2Nvbm5lY3RlZCBxdWV1ZS4KKwkJICovCisJCWNhc2UgUEhBU0VfSURMRToKKwkJCWlmIChpbmZvLT5zY3NpLmRpc2Nvbm5lY3RhYmxlKSB7CisJCQkJaW5mby0+c2NzaS5kaXNjb25uZWN0YWJsZSA9IDA7CisJCQkJaW5mby0+U0NwbnQgPSBOVUxMOworCQkJCXJlcyA9IHJlc19od19hYm9ydDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoaW5mby0+b3JpZ1NDcG50ID09IFNDcG50KSB7CisJCS8qCisJCSAqIFRoZSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgbmV4dCwgYnV0IGEgY29tbWFuZAorCQkgKiBpcyBjdXJyZW50bHkgdXNpbmcgdGhlIGludGVyZmFjZS4gIFRoaXMgaXMgc2ltaWxhciB0bworCQkgKiBiZWluZyBvbiB0aGUgaXNzdWUgcXVldWUsIGV4Y2VwdCB0aGUgYnVzeWx1biBiaXQgaGFzCisJCSAqIGJlZW4gc2V0LgorCQkgKi8KKwkJaW5mby0+b3JpZ1NDcG50ID0gTlVMTDsKKwkJY2xlYXJfYml0KFNDcG50LT5kZXZpY2UtPmlkICogOCArIFNDcG50LT5kZXZpY2UtPmx1biwgaW5mby0+YnVzeWx1bnMpOworCQlwcmludGsoIndhaXRpbmcgZm9yIGV4ZWN1dGlvbiAiKTsKKwkJcmVzID0gcmVzX3N1Y2Nlc3M7CisJfSBlbHNlCisJCXByaW50aygidW5rbm93biAiKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogZmFzMjE2X2VoX2Fib3J0IC0gYWJvcnQgdGhpcyBjb21tYW5kCisgKiBAU0NwbnQ6IGNvbW1hbmQgdG8gYWJvcnQKKyAqCisgKiBBYm9ydCB0aGlzIGNvbW1hbmQuCisgKiBSZXR1cm5zOiBGQUlMRUQgaWYgdW5hYmxlIHRvIGFib3J0CisgKiBOb3RlczogaW9fcmVxdWVzdF9sb2NrIGlzIHRha2VuLCBhbmQgaXJxcyBhcmUgZGlzYWJsZWQKKyAqLworaW50IGZhczIxNl9laF9hYm9ydChTY3NpX0NtbmQgKlNDcG50KQoreworCUZBUzIxNl9JbmZvICppbmZvID0gKEZBUzIxNl9JbmZvICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJaW50IHJlc3VsdCA9IEZBSUxFRDsKKworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCisJaW5mby0+c3RhdHMuYWJvcnRzICs9IDE7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQ6IGFib3J0IGNvbW1hbmQgIiwgaW5mby0+aG9zdC0+aG9zdF9ubyk7CisJcHJpbnRfY29tbWFuZChTQ3BudC0+ZGF0YV9jbW5kKTsKKworCXByaW50X2RlYnVnX2xpc3QoKTsKKwlmYXMyMTZfZHVtcHN0YXRlKGluZm8pOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkOiBhYm9ydCAlcCAiLCBpbmZvLT5ob3N0LT5ob3N0X25vLCBTQ3BudCk7CisKKwlzd2l0Y2ggKGZhczIxNl9maW5kX2NvbW1hbmQoaW5mbywgU0NwbnQpKSB7CisJLyoKKwkgKiBXZSBmb3VuZCB0aGUgY29tbWFuZCwgYW5kIGNsZWFyZWQgaXQgb3V0LiAgRWl0aGVyCisJICogdGhlIGNvbW1hbmQgaXMgc3RpbGwga25vd24gdG8gYmUgZXhlY3V0aW5nIG9uIHRoZQorCSAqIHRhcmdldCwgb3IgdGhlIGJ1c3lsdW4gYml0IGlzIG5vdCBzZXQuCisJICovCisJY2FzZSByZXNfc3VjY2VzczoKKwkJcHJpbnRrKCJzdWNjZXNzXG4iKTsKKwkJcmVzdWx0ID0gU1VDQ0VTUzsKKwkJYnJlYWs7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gcmVjb25uZWN0IHRvIHRoZSB0YXJnZXQgYW5kIHNlbmQgaXQgYW4KKwkgKiBBQk9SVCBvciBBQk9SVF9UQUcgbWVzc2FnZS4gIFdlIGNhbiBvbmx5IGRvIHRoaXMKKwkgKiBpZiB0aGUgYnVzIGlzIGZyZWUuCisJICovCisJY2FzZSByZXNfaHdfYWJvcnQ6CisJCQorCisJLyoKKwkgKiBXZSBhcmUgdW5hYmxlIHRvIGFib3J0IHRoZSBjb21tYW5kIGZvciBzb21lIHJlYXNvbi4KKwkgKi8KKwlkZWZhdWx0OgorCWNhc2UgcmVzX2ZhaWxlZDoKKwkJcHJpbnRrKCJmYWlsZWRcbiIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIGZhczIxNl9laF9kZXZpY2VfcmVzZXQgLSBSZXNldCB0aGUgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbW1hbmQKKyAqIEBTQ3BudDogY29tbWFuZCBzcGVjaWZpbmcgZGV2aWNlIHRvIHJlc2V0CisgKgorICogUmVzZXQgdGhlIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21tYW5kLgorICogUmV0dXJuczogRkFJTEVEIGlmIHVuYWJsZSB0byByZXNldC4KKyAqIE5vdGVzOiBXZSB3b24ndCBiZSByZS1lbnRlcmVkLCBzbyB3ZSdsbCBvbmx5IGhhdmUgb25lIGRldmljZQorICogcmVzZXQgb24gdGhlIGdvIGF0IG9uZSB0aW1lLgorICovCitpbnQgZmFzMjE2X2VoX2RldmljZV9yZXNldChTY3NpX0NtbmQgKlNDcG50KQoreworCUZBUzIxNl9JbmZvICppbmZvID0gKEZBUzIxNl9JbmZvICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaSwgcmVzID0gRkFJTEVELCB0YXJnZXQgPSBTQ3BudC0+ZGV2aWNlLT5pZDsKKworCWZhczIxNl9sb2coaW5mbywgTE9HX0VSUk9SLCAiZGV2aWNlIHJlc2V0IGZvciB0YXJnZXQgJWQiLCB0YXJnZXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmhvc3RfbG9jaywgZmxhZ3MpOworCisJZG8geworCQkvKgorCQkgKiBJZiB3ZSBhcmUgY3VycmVudGx5IGNvbm5lY3RlZCB0byBhIGRldmljZSwgYW5kCisJCSAqIGl0IGlzIHRoZSBkZXZpY2Ugd2Ugd2FudCB0byByZXNldCwgdGhlcmUgaXMKKwkJICogbm90aGluZyB3ZSBjYW4gZG8gaGVyZS4gIENoYW5jZXMgYXJlIGl0IGlzIHN0dWNrLAorCQkgKiBhbmQgd2UgbmVlZCBhIGJ1cyByZXNldC4KKwkJICovCisJCWlmIChpbmZvLT5TQ3BudCAmJiAhaW5mby0+c2NzaS5kaXNjb25uZWN0YWJsZSAmJgorCQkgICAgaW5mby0+U0NwbnQtPmRldmljZS0+aWQgPT0gU0NwbnQtPmRldmljZS0+aWQpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBXZSdyZSBnb2luZyB0byBiZSByZXNldHRpbmcgdGhpcyBkZXZpY2UuICBSZW1vdmUKKwkJICogYWxsIHBlbmRpbmcgY29tbWFuZHMgZnJvbSB0aGUgZHJpdmVyLiAgQnkgZG9pbmcKKwkJICogc28sIHdlIGd1YXJhbnRlZSB0aGF0IHdlIHdvbid0IHRvdWNoIHRoZSBjb21tYW5kCisJCSAqIHN0cnVjdHVyZXMgZXhjZXB0IHRvIHByb2Nlc3MgdGhlIHJlc2V0IHJlcXVlc3QuCisJCSAqLworCQlxdWV1ZV9yZW1vdmVfYWxsX3RhcmdldCgmaW5mby0+cXVldWVzLmlzc3VlLCB0YXJnZXQpOworCQlxdWV1ZV9yZW1vdmVfYWxsX3RhcmdldCgmaW5mby0+cXVldWVzLmRpc2Nvbm5lY3RlZCwgdGFyZ2V0KTsKKwkJaWYgKGluZm8tPm9yaWdTQ3BudCAmJiBpbmZvLT5vcmlnU0NwbnQtPmRldmljZS0+aWQgPT0gdGFyZ2V0KQorCQkJaW5mby0+b3JpZ1NDcG50ID0gTlVMTDsKKwkJaWYgKGluZm8tPnJlcVNDcG50ICYmIGluZm8tPnJlcVNDcG50LT5kZXZpY2UtPmlkID09IHRhcmdldCkKKwkJCWluZm8tPnJlcVNDcG50ID0gTlVMTDsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCWNsZWFyX2JpdCh0YXJnZXQgKiA4ICsgaSwgaW5mby0+YnVzeWx1bnMpOworCisJCS8qCisJCSAqIEhpamFjayB0aGlzIFNDU0kgY29tbWFuZCBzdHJ1Y3R1cmUgdG8gc2VuZAorCQkgKiBhIGJ1cyBkZXZpY2UgcmVzZXQgbWVzc2FnZSB0byB0aGlzIGRldmljZS4KKwkJICovCisJCVNDcG50LT5ob3N0X3NjcmliYmxlID0gKHZvaWQgKilmYXMyMTZfZGV2aWNlcmVzZXRfZG9uZTsKKworCQlpbmZvLT5yc3RfZGV2X3N0YXR1cyA9IDA7CisJCWluZm8tPnJzdFNDcG50ID0gU0NwbnQ7CisKKwkJaWYgKGluZm8tPnNjc2kucGhhc2UgPT0gUEhBU0VfSURMRSkKKwkJCWZhczIxNl9raWNrKGluZm8pOworCisJCW1vZF90aW1lcigmaW5mby0+ZWhfdGltZXIsIDMwICogSFopOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCQkvKgorCQkgKiBXYWl0IHVwIHRvIDMwIHNlY29uZHMgZm9yIHRoZSByZXNldCB0byBjb21wbGV0ZS4KKwkJICovCisJCXdhaXRfZXZlbnQoaW5mby0+ZWhfd2FpdCwgaW5mby0+cnN0X2Rldl9zdGF0dXMpOworCisJCWRlbF90aW1lcl9zeW5jKCZpbmZvLT5laF90aW1lcik7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJaW5mby0+cnN0U0NwbnQgPSBOVUxMOworCisJCWlmIChpbmZvLT5yc3RfZGV2X3N0YXR1cyA9PSAxKQorCQkJcmVzID0gU1VDQ0VTUzsKKwl9IHdoaWxlICgwKTsKKworCVNDcG50LT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCWZhczIxNl9sb2coaW5mbywgTE9HX0VSUk9SLCAiZGV2aWNlIHJlc2V0IGNvbXBsZXRlOiAlc1xuIiwKKwkJICAgcmVzID09IFNVQ0NFU1MgPyAic3VjY2VzcyIgOiAiZmFpbGVkIik7CisKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIGZhczIxNl9laF9idXNfcmVzZXQgLSBSZXNldCB0aGUgYnVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWFuZAorICogQFNDcG50OiBjb21tYW5kIHNwZWNpZmluZyBidXMgdG8gcmVzZXQKKyAqCisgKiBSZXNldCB0aGUgYnVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWFuZC4KKyAqIFJldHVybnM6IEZBSUxFRCBpZiB1bmFibGUgdG8gcmVzZXQuCisgKiBOb3RlczogRnVydGhlciBjb21tYW5kcyBhcmUgYmxvY2tlZC4KKyAqLworaW50IGZhczIxNl9laF9idXNfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwlGQVMyMTZfSW5mbyAqaW5mbyA9IChGQVMyMTZfSW5mbyAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJU2NzaV9EZXZpY2UgKlNEcG50OworCisJZmFzMjE2X2NoZWNrbWFnaWMoaW5mbyk7CisJZmFzMjE2X2xvZyhpbmZvLCBMT0dfRVJST1IsICJyZXNldHRpbmcgYnVzIik7CisKKwlpbmZvLT5zdGF0cy5idXNfcmVzZXRzICs9IDE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFN0b3AgYWxsIGFjdGl2aXR5IG9uIHRoaXMgaW50ZXJmYWNlLgorCSAqLworCWZhczIxNl9hYm9ydHRyYW5zZmVyKGluZm8pOworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NOVEwzLCBpbmZvLT5zY3NpLmNmZ1syXSk7CisKKwkvKgorCSAqIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMuCisJICovCisJd2hpbGUgKGZhczIxNl9yZWFkYihpbmZvLCBSRUdfU1RBVCkgJiBTVEFUX0lOVCkKKwkJZmFzMjE2X3JlYWRiKGluZm8sIFJFR19JTlNUKTsKKworCWluZm8tPnJzdF9idXNfc3RhdHVzID0gMDsKKworCS8qCisJICogRm9yIGVhY2ggYXR0YWNoZWQgaGFyZC1yZXNldCBkZXZpY2UsIGNsZWFyIG91dAorCSAqIGFsbCBjb21tYW5kIHN0cnVjdHVyZXMuICBMZWF2ZSB0aGUgcnVubmluZworCSAqIGNvbW1hbmQgaW4gcGxhY2UuCisJICovCisJc2hvc3RfZm9yX2VhY2hfZGV2aWNlKFNEcG50LCBpbmZvLT5ob3N0KSB7CisJCWludCBpOworCisJCWlmIChTRHBudC0+c29mdF9yZXNldCkKKwkJCWNvbnRpbnVlOworCisJCXF1ZXVlX3JlbW92ZV9hbGxfdGFyZ2V0KCZpbmZvLT5xdWV1ZXMuaXNzdWUsIFNEcG50LT5pZCk7CisJCXF1ZXVlX3JlbW92ZV9hbGxfdGFyZ2V0KCZpbmZvLT5xdWV1ZXMuZGlzY29ubmVjdGVkLCBTRHBudC0+aWQpOworCQlpZiAoaW5mby0+b3JpZ1NDcG50ICYmIGluZm8tPm9yaWdTQ3BudC0+ZGV2aWNlLT5pZCA9PSBTRHBudC0+aWQpCisJCQlpbmZvLT5vcmlnU0NwbnQgPSBOVUxMOworCQlpZiAoaW5mby0+cmVxU0NwbnQgJiYgaW5mby0+cmVxU0NwbnQtPmRldmljZS0+aWQgPT0gU0RwbnQtPmlkKQorCQkJaW5mby0+cmVxU0NwbnQgPSBOVUxMOworCQlpbmZvLT5TQ3BudCA9IE5VTEw7CisKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCWNsZWFyX2JpdChTRHBudC0+aWQgKiA4ICsgaSwgaW5mby0+YnVzeWx1bnMpOworCX0KKworCWluZm8tPnNjc2kucGhhc2UgPSBQSEFTRV9JRExFOworCisJLyoKKwkgKiBSZXNldCB0aGUgU0NTSSBidXMuICBEZXZpY2UgY2xlYW51cCBoYXBwZW5zIGluCisJICogdGhlIGludGVycnVwdCBoYW5kbGVyLgorCSAqLworCWZhczIxNl9jbWQoaW5mbywgQ01EX1JFU0VUU0NTSSk7CisKKwltb2RfdGltZXIoJmluZm8tPmVoX3RpbWVyLCBqaWZmaWVzICsgSFopOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmhvc3RfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBXYWl0IG9uZSBzZWNvbmQgZm9yIHRoZSBpbnRlcnJ1cHQuCisJICovCisJd2FpdF9ldmVudChpbmZvLT5laF93YWl0LCBpbmZvLT5yc3RfYnVzX3N0YXR1cyk7CisJZGVsX3RpbWVyX3N5bmMoJmluZm8tPmVoX3RpbWVyKTsKKworCWZhczIxNl9sb2coaW5mbywgTE9HX0VSUk9SLCAiYnVzIHJlc2V0IGNvbXBsZXRlOiAlc1xuIiwKKwkJICAgaW5mby0+cnN0X2J1c19zdGF0dXMgPT0gMSA/ICJzdWNjZXNzIiA6ICJmYWlsZWQiKTsKKworCXJldHVybiBpbmZvLT5yc3RfYnVzX3N0YXR1cyA9PSAxID8gU1VDQ0VTUyA6IEZBSUxFRDsKK30KKworLyoqCisgKiBmYXMyMTZfaW5pdF9jaGlwIC0gSW5pdGlhbGlzZSBGQVMyMTYgc3RhdGUgYWZ0ZXIgcmVzZXQKKyAqIEBpbmZvOiBzdGF0ZSBzdHJ1Y3R1cmUgZm9yIGludGVyZmFjZQorICoKKyAqIEluaXRpYWxpc2UgRkFTMjE2IHN0YXRlIGFmdGVyIHJlc2V0CisgKi8KK3N0YXRpYyB2b2lkIGZhczIxNl9pbml0X2NoaXAoRkFTMjE2X0luZm8gKmluZm8pCit7CisJdW5zaWduZWQgaW50IGNsb2NrID0gKChpbmZvLT5pZmNmZy5jbG9ja3JhdGUgLSAxKSAvIDUgKyAxKSAmIDc7CisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ0xLRiwgY2xvY2spOworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NOVEwxLCBpbmZvLT5zY3NpLmNmZ1swXSk7CisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ05UTDIsIGluZm8tPnNjc2kuY2ZnWzFdKTsKKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19DTlRMMywgaW5mby0+c2NzaS5jZmdbMl0pOworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX1NUSU0sIGluZm8tPmlmY2ZnLnNlbGVjdF90aW1lb3V0KTsKKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19TT0YsIDApOworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX1NUUCwgaW5mby0+c2NzaS5hc3luY19zdHApOworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NOVEwxLCBpbmZvLT5zY3NpLmNmZ1swXSk7Cit9CisKKy8qKgorICogZmFzMjE2X2VoX2hvc3RfcmVzZXQgLSBSZXNldCB0aGUgaG9zdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21tYW5kCisgKiBAU0NwbnQ6IGNvbW1hbmQgc3BlY2lmaW5nIGhvc3QgdG8gcmVzZXQKKyAqCisgKiBSZXNldCB0aGUgaG9zdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21tYW5kLgorICogUmV0dXJuczogRkFJTEVEIGlmIHVuYWJsZSB0byByZXNldC4KKyAqIE5vdGVzOiBpb19yZXF1ZXN0X2xvY2sgaXMgdGFrZW4sIGFuZCBpcnFzIGFyZSBkaXNhYmxlZAorICovCitpbnQgZmFzMjE2X2VoX2hvc3RfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwlGQVMyMTZfSW5mbyAqaW5mbyA9IChGQVMyMTZfSW5mbyAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJZmFzMjE2X2NoZWNrbWFnaWMoaW5mbyk7CisKKwlwcmludGsoInNjc2klZC4lYzogJXM6IHJlc2V0dGluZyBob3N0XG4iLAorCQlpbmZvLT5ob3N0LT5ob3N0X25vLCAnMCcgKyBTQ3BudC0+ZGV2aWNlLT5pZCwgX19GVU5DVElPTl9fKTsKKworCS8qCisJICogUmVzZXQgdGhlIFNDU0kgY2hpcC4KKwkgKi8KKwlmYXMyMTZfY21kKGluZm8sIENNRF9SRVNFVENISVApOworCisJLyoKKwkgKiBVZ2x5IHVnbHkgdWdseSEKKwkgKiBXZSBuZWVkIHRvIHJlbGVhc2UgdGhlIGhvc3RfbG9jayBhbmQgZW5hYmxlCisJICogSVJRcyBpZiB3ZSBzbGVlcCwgYnV0IHdlIG11c3QgcmVsb2NrIGFuZCBkaXNhYmxlCisJICogSVJRcyBhZnRlciB0aGUgc2xlZXAuCisJICovCisJc3Bpbl91bmxvY2tfaXJxKGluZm8tPmhvc3QtPmhvc3RfbG9jayk7CisJbXNsZWVwKDUwICogMTAwMC8xMDApOworCXNwaW5fbG9ja19pcnEoaW5mby0+aG9zdC0+aG9zdF9sb2NrKTsKKworCS8qCisJICogUmVsZWFzZSB0aGUgU0NTSSByZXNldC4KKwkgKi8KKwlmYXMyMTZfY21kKGluZm8sIENNRF9OT1ApOworCisJZmFzMjE2X2luaXRfY2hpcChpbmZvKTsKKworCXJldHVybiBTVUNDRVNTOworfQorCisjZGVmaW5lIFRZUEVfVU5LTk9XTgkwCisjZGVmaW5lIFRZUEVfTkNSNTNDOTAJMQorI2RlZmluZSBUWVBFX05DUjUzQzkwQQkyCisjZGVmaW5lIFRZUEVfTkNSNTNDOXgJMworI2RlZmluZSBUWVBFX0FtNTNDRjk0CTQKKyNkZWZpbmUgVFlQRV9FbUZBUzIxNgk1CisjZGVmaW5lIFRZUEVfUUxGQVMyMTYJNgorCitzdGF0aWMgY2hhciAqY2hpcF90eXBlc1tdID0geworCSJ1bmtub3duIiwKKwkiTlMgTkNSNTNDOTAiLAorCSJOUyBOQ1I1M0M5MEEiLAorCSJOUyBOQ1I1M0M5eCIsCisJIkFNRCBBbTUzQ0Y5NCIsCisJIkVtdWxleCBGQVMyMTYiLAorCSJRTG9naWMgRkFTMjE2IgorfTsKKworc3RhdGljIGludCBmYXMyMTZfZGV0ZWN0X3R5cGUoRkFTMjE2X0luZm8gKmluZm8pCit7CisJaW50IGZhbWlseSwgcmV2OworCisJLyoKKwkgKiBSZXNldCB0aGUgY2hpcC4KKwkgKi8KKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19DTUQsIENNRF9SRVNFVENISVApOworCXVkZWxheSg1MCk7CisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ01ELCBDTURfTk9QKTsKKworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIGNvbnRyb2wgcmVnIDIgaXMgcHJlc2VudC4KKwkgKi8KKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19DTlRMMywgMCk7CisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ05UTDIsIENOVEwyX1MyRkUpOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgdW5hYmxlIHRvIHJlYWQgYmFjayBjb250cm9sIHJlZyAyCisJICogY29ycmVjdGx5LCBpdCBpcyBub3QgcHJlc2VudCwgYW5kIHdlIGhhdmUgYQorCSAqIE5DUjUzQzkwLgorCSAqLworCWlmICgoZmFzMjE2X3JlYWRiKGluZm8sIFJFR19DTlRMMikgJiAofjB4ZTApKSAhPSBDTlRMMl9TMkZFKQorCQlyZXR1cm4gVFlQRV9OQ1I1M0M5MDsKKworCS8qCisJICogTm93LCBjaGVjayBjb250cm9sIHJlZ2lzdGVyIDMKKwkgKi8KKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19DTlRMMiwgMCk7CisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ05UTDMsIDApOworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NOVEwzLCA1KTsKKworCS8qCisJICogSWYgd2UgYXJlIHVuYWJsZSB0byByZWFkIHRoZSByZWdpc3RlciBiYWNrCisJICogY29ycmVjdGx5LCB3ZSBoYXZlIGEgTkNSNTNDOTBBCisJICovCisJaWYgKGZhczIxNl9yZWFkYihpbmZvLCBSRUdfQ05UTDMpICE9IDUpCisJCXJldHVybiBUWVBFX05DUjUzQzkwQTsKKworCS8qCisJICogTm93IHJlYWQgdGhlIElEIGZyb20gdGhlIGNoaXAuCisJICovCisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ05UTDMsIDApOworCisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ05UTDMsIENOVEwzX0FESURDSEspOworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NOVEwzLCAwKTsKKworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NNRCwgQ01EX1JFU0VUQ0hJUCk7CisJdWRlbGF5KDUwKTsKKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19DTUQsIENNRF9XSVRIRE1BIHwgQ01EX05PUCk7CisKKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19DTlRMMiwgQ05UTDJfRU5GKTsKKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19DTUQsIENNRF9SRVNFVENISVApOworCXVkZWxheSg1MCk7CisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ01ELCBDTURfTk9QKTsKKworCXJldiAgICAgPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0lEKTsKKwlmYW1pbHkgID0gcmV2ID4+IDM7CisJcmV2ICAgICY9IDc7CisKKwlzd2l0Y2ggKGZhbWlseSkgeworCWNhc2UgMHgwMToKKwkJaWYgKHJldiA9PSA0KQorCQkJcmV0dXJuIFRZUEVfQW01M0NGOTQ7CisJCWJyZWFrOworCisJY2FzZSAweDAyOgorCQlzd2l0Y2ggKHJldikgeworCQljYXNlIDI6CisJCQlyZXR1cm4gVFlQRV9FbUZBUzIxNjsKKwkJY2FzZSAzOgorCQkJcmV0dXJuIFRZUEVfUUxGQVMyMTY7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcHJpbnRrKCJmYW1pbHkgJXggcmV2ICV4XG4iLCBmYW1pbHksIHJldik7CisJcmV0dXJuIFRZUEVfTkNSNTNDOXg7Cit9CisKKy8qKgorICogZmFzMjE2X3Jlc2V0X3N0YXRlIC0gSW5pdGlhbGlzZSBkcml2ZXIgaW50ZXJuYWwgc3RhdGUKKyAqIEBpbmZvOiBzdGF0ZSB0byBpbml0aWFsaXNlCisgKgorICogSW5pdGlhbGlzZSBkcml2ZXIgaW50ZXJuYWwgc3RhdGUKKyAqLworc3RhdGljIHZvaWQgZmFzMjE2X3Jlc2V0X3N0YXRlKEZBUzIxNl9JbmZvICppbmZvKQoreworCWludCBpOworCisJZmFzMjE2X2NoZWNrbWFnaWMoaW5mbyk7CisKKwlmYXMyMTZfYnVzX3Jlc2V0KGluZm8pOworCisJLyoKKwkgKiBDbGVhciBvdXQgYWxsIHN0YWxlIGluZm8gaW4gb3VyIHN0YXRlIHN0cnVjdHVyZQorCSAqLworCW1lbXNldChpbmZvLT5idXN5bHVucywgMCwgc2l6ZW9mKGluZm8tPmJ1c3lsdW5zKSk7CisJaW5mby0+c2NzaS5kaXNjb25uZWN0YWJsZSA9IDA7CisJaW5mby0+c2NzaS5hYm9ydGluZyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWluZm8tPmRldmljZVtpXS5wYXJpdHlfZW5hYmxlZAk9IDA7CisJCWluZm8tPmRldmljZVtpXS5wYXJpdHlfY2hlY2sJPSAxOworCX0KKworCS8qCisJICogRHJhaW4gYWxsIGNvbW1hbmRzIG9uIGRpc2Nvbm5lY3RlZCBxdWV1ZQorCSAqLworCXdoaWxlIChxdWV1ZV9yZW1vdmUoJmluZm8tPnF1ZXVlcy5kaXNjb25uZWN0ZWQpICE9IE5VTEwpOworCisJLyoKKwkgKiBSZW1vdmUgZXhlY3V0aW5nIGNvbW1hbmRzLgorCSAqLworCWluZm8tPlNDcG50ICAgICA9IE5VTEw7CisJaW5mby0+cmVxU0NwbnQgID0gTlVMTDsKKwlpbmZvLT5yc3RTQ3BudCAgPSBOVUxMOworCWluZm8tPm9yaWdTQ3BudCA9IE5VTEw7Cit9CisKKy8qKgorICogZmFzMjE2X2luaXQgLSBpbml0aWFsaXNlIEZBUy9OQ1IvQU1EIFNDU0kgc3RydWN0dXJlcy4KKyAqIEBob3N0OiBhIGRyaXZlci1zcGVjaWZpYyBmaWxsZWQtb3V0IHN0cnVjdHVyZQorICoKKyAqIEluaXRpYWxpc2UgRkFTL05DUi9BTUQgU0NTSSBzdHJ1Y3R1cmVzLgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzCisgKi8KK2ludCBmYXMyMTZfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCUZBUzIxNl9JbmZvICppbmZvID0gKEZBUzIxNl9JbmZvICopaG9zdC0+aG9zdGRhdGE7CisKKwlpbmZvLT5tYWdpY19zdGFydCAgICA9IE1BR0lDOworCWluZm8tPm1hZ2ljX2VuZCAgICAgID0gTUFHSUM7CisJaW5mby0+aG9zdCAgICAgICAgICAgPSBob3N0OworCWluZm8tPnNjc2kuY2ZnWzBdICAgID0gaG9zdC0+dGhpc19pZCB8IENOVEwxX1BFUkU7CisJaW5mby0+c2NzaS5jZmdbMV0gICAgPSBDTlRMMl9FTkYgfCBDTlRMMl9TMkZFOworCWluZm8tPnNjc2kuY2ZnWzJdICAgID0gaW5mby0+aWZjZmcuY250bDMgfAorCQkJICAgICAgIENOVEwzX0FESURDSEsgfCBDTlRMM19RVEFHIHwgQ05UTDNfRzJDQiB8IENOVEwzX0xCVE07CisJaW5mby0+c2NzaS5hc3luY19zdHAgPSBmYXMyMTZfc3luY3BlcmlvZChpbmZvLCBpbmZvLT5pZmNmZy5hc3luY3BlcmlvZCk7CisKKwlpbmZvLT5yc3RfZGV2X3N0YXR1cyA9IC0xOworCWluZm8tPnJzdF9idXNfc3RhdHVzID0gLTE7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+ZWhfd2FpdCk7CisJaW5pdF90aW1lcigmaW5mby0+ZWhfdGltZXIpOworCWluZm8tPmVoX3RpbWVyLmRhdGEgID0gKHVuc2lnbmVkIGxvbmcpaW5mbzsKKwlpbmZvLT5laF90aW1lci5mdW5jdGlvbiA9IGZhczIxNl9laF90aW1lcjsKKwkKKwlzcGluX2xvY2tfaW5pdCgmaW5mby0+aG9zdF9sb2NrKTsKKworCW1lbXNldCgmaW5mby0+c3RhdHMsIDAsIHNpemVvZihpbmZvLT5zdGF0cykpOworCisJbXNncXVldWVfaW5pdGlhbGlzZSgmaW5mby0+c2NzaS5tc2dzKTsKKworCWlmICghcXVldWVfaW5pdGlhbGlzZSgmaW5mby0+cXVldWVzLmlzc3VlKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIXF1ZXVlX2luaXRpYWxpc2UoJmluZm8tPnF1ZXVlcy5kaXNjb25uZWN0ZWQpKSB7CisJCXF1ZXVlX2ZyZWUoJmluZm8tPnF1ZXVlcy5pc3N1ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGZhczIxNl9hZGQgLSBpbml0aWFsaXNlIEZBUy9OQ1IvQU1EIFNDU0kgaWMuCisgKiBAaG9zdDogYSBkcml2ZXItc3BlY2lmaWMgZmlsbGVkLW91dCBzdHJ1Y3R1cmUKKyAqIEBkZXY6IHBhcmVudCBkZXZpY2UKKyAqCisgKiBJbml0aWFsaXNlIEZBUy9OQ1IvQU1EIFNDU0kgaWMuCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MKKyAqLworaW50IGZhczIxNl9hZGQoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgc3RydWN0IGRldmljZSAqZGV2KQoreworCUZBUzIxNl9JbmZvICppbmZvID0gKEZBUzIxNl9JbmZvICopaG9zdC0+aG9zdGRhdGE7CisJaW50IHR5cGUsIHJldDsKKworCWlmIChpbmZvLT5pZmNmZy5jbG9ja3JhdGUgPD0gMTAgfHwgaW5mby0+aWZjZmcuY2xvY2tyYXRlID4gNDApIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiZmFzMjE2OiBpbnZhbGlkIGNsb2NrIHJhdGUgJXUgTUh6XG4iLAorCQkJaW5mby0+aWZjZmcuY2xvY2tyYXRlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmFzMjE2X3Jlc2V0X3N0YXRlKGluZm8pOworCXR5cGUgPSBmYXMyMTZfZGV0ZWN0X3R5cGUoaW5mbyk7CisJaW5mby0+c2NzaS50eXBlID0gY2hpcF90eXBlc1t0eXBlXTsKKworCXVkZWxheSgzMDApOworCisJLyoKKwkgKiBJbml0aWFsaXNlIHRoZSBjaGlwIGNvcnJlY3RseS4KKwkgKi8KKwlmYXMyMTZfaW5pdF9jaGlwKGluZm8pOworCisJLyoKKwkgKiBSZXNldCB0aGUgU0NTSSBidXMuICBXZSBkb24ndCB3YW50IHRvIHNlZQorCSAqIHRoZSByZXN1bHRpbmcgcmVzZXQgaW50ZXJydXB0LCBzbyBtYXNrIGl0CisJICogb3V0LgorCSAqLworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NOVEwxLCBpbmZvLT5zY3NpLmNmZ1swXSB8IENOVEwxX0RJU1IpOworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NNRCwgQ01EX1JFU0VUU0NTSSk7CisKKwkvKgorCSAqIHNjc2kgc3RhbmRhcmQgc2F5cyB3YWl0IDI1MG1zCisJICovCisJc3Bpbl91bmxvY2tfaXJxKGluZm8tPmhvc3QtPmhvc3RfbG9jayk7CisJbXNsZWVwKDEwMCoxMDAwLzEwMCk7CisJc3Bpbl9sb2NrX2lycShpbmZvLT5ob3N0LT5ob3N0X2xvY2spOworCisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ05UTDEsIGluZm8tPnNjc2kuY2ZnWzBdKTsKKwlmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0lOU1QpOworCisJZmFzMjE2X2NoZWNrbWFnaWMoaW5mbyk7CisKKwlyZXQgPSBzY3NpX2FkZF9ob3N0KGhvc3QsIGRldik7CisJaWYgKHJldCkKKwkJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ01ELCBDTURfUkVTRVRDSElQKTsKKwllbHNlCisJCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBmYXMyMTZfcmVtb3ZlKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJRkFTMjE2X0luZm8gKmluZm8gPSAoRkFTMjE2X0luZm8gKilob3N0LT5ob3N0ZGF0YTsKKworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CisKKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19DTUQsIENNRF9SRVNFVENISVApOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7Cit9CisKKy8qKgorICogZmFzMjE2X3JlbGVhc2UgLSByZWxlYXNlIGFsbCByZXNvdXJjZXMgZm9yIEZBUy9OQ1IvQU1EIFNDU0kgaWMuCisgKiBAaG9zdDogYSBkcml2ZXItc3BlY2lmaWMgZmlsbGVkLW91dCBzdHJ1Y3R1cmUKKyAqCisgKiByZWxlYXNlIGFsbCByZXNvdXJjZXMgYW5kIHB1dCBldmVyeXRoaW5nIHRvIGJlZCBmb3IgRkFTL05DUi9BTUQgU0NTSSBpYy4KKyAqLwordm9pZCBmYXMyMTZfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCUZBUzIxNl9JbmZvICppbmZvID0gKEZBUzIxNl9JbmZvICopaG9zdC0+aG9zdGRhdGE7CisKKwlxdWV1ZV9mcmVlKCZpbmZvLT5xdWV1ZXMuZGlzY29ubmVjdGVkKTsKKwlxdWV1ZV9mcmVlKCZpbmZvLT5xdWV1ZXMuaXNzdWUpOworfQorCitpbnQgZmFzMjE2X3ByaW50X2hvc3QoRkFTMjE2X0luZm8gKmluZm8sIGNoYXIgKmJ1ZmZlcikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWZmZXIsCisJCQkiXG4iCisJCQkiQ2hpcCAgICA6ICVzXG4iCisJCQkiIEFkZHJlc3M6IDB4JXBcbiIKKwkJCSIgSVJRICAgIDogJWRcbiIKKwkJCSIgRE1BICAgIDogJWRcbiIsCisJCQlpbmZvLT5zY3NpLnR5cGUsIGluZm8tPnNjc2kuaW9fYmFzZSwKKwkJCWluZm8tPnNjc2kuaXJxLCBpbmZvLT5zY3NpLmRtYSk7Cit9CisKK2ludCBmYXMyMTZfcHJpbnRfc3RhdHMoRkFTMjE2X0luZm8gKmluZm8sIGNoYXIgKmJ1ZmZlcikKK3sKKwljaGFyICpwID0gYnVmZmVyOworCisJcCArPSBzcHJpbnRmKHAsICJcbiIKKwkJCSJDb21tYW5kIFN0YXRpc3RpY3M6XG4iCisJCQkiIFF1ZXVlZCAgICAgOiAldVxuIgorCQkJIiBJc3N1ZWQgICAgIDogJXVcbiIKKwkJCSIgQ29tcGxldGVkICA6ICV1XG4iCisJCQkiIFJlYWRzICAgICAgOiAldVxuIgorCQkJIiBXcml0ZXMgICAgIDogJXVcbiIKKwkJCSIgT3RoZXJzICAgICA6ICV1XG4iCisJCQkiIERpc2Nvbm5lY3RzOiAldVxuIgorCQkJIiBBYm9ydHMgICAgIDogJXVcbiIKKwkJCSIgQnVzIHJlc2V0cyA6ICV1XG4iCisJCQkiIEhvc3QgcmVzZXRzOiAldVxuIiwKKwkJCWluZm8tPnN0YXRzLnF1ZXVlcywJIGluZm8tPnN0YXRzLnJlbW92ZXMsCisJCQlpbmZvLT5zdGF0cy5maW5zLAkgaW5mby0+c3RhdHMucmVhZHMsCisJCQlpbmZvLT5zdGF0cy53cml0ZXMsCSBpbmZvLT5zdGF0cy5taXNjcywKKwkJCWluZm8tPnN0YXRzLmRpc2Nvbm5lY3RzLCBpbmZvLT5zdGF0cy5hYm9ydHMsCisJCQlpbmZvLT5zdGF0cy5idXNfcmVzZXRzLAkgaW5mby0+c3RhdHMuaG9zdF9yZXNldHMpOworCisJcmV0dXJuIHAgLSBidWZmZXI7Cit9CisKK2ludCBmYXMyMTZfcHJpbnRfZGV2aWNlcyhGQVMyMTZfSW5mbyAqaW5mbywgY2hhciAqYnVmZmVyKQoreworCXN0cnVjdCBmYXMyMTZfZGV2aWNlICpkZXY7CisJU2NzaV9EZXZpY2UgKnNjZDsKKwljaGFyICpwID0gYnVmZmVyOworCisJcCArPSBzcHJpbnRmKHAsICJEZXZpY2UvTHVuIFRhZ2dlZFEgICAgICAgUGFyaXR5ICAgU3luY1xuIik7CisKKwlzaG9zdF9mb3JfZWFjaF9kZXZpY2Uoc2NkLCBpbmZvLT5ob3N0KSB7CisJCWRldiA9ICZpbmZvLT5kZXZpY2Vbc2NkLT5pZF07CisJCXAgKz0gc3ByaW50ZihwLCAiICAgICAlZC8lZCAgICIsIHNjZC0+aWQsIHNjZC0+bHVuKTsKKwkJaWYgKHNjZC0+dGFnZ2VkX3N1cHBvcnRlZCkKKwkJCXAgKz0gc3ByaW50ZihwLCAiJTNzYWJsZWQoJTNkKSAiLAorCQkJCSAgICAgc2NkLT5zaW1wbGVfdGFncyA/ICJlbiIgOiAiZGlzIiwKKwkJCQkgICAgIHNjZC0+Y3VycmVudF90YWcpOworCQllbHNlCisJCQlwICs9IHNwcmludGYocCwgInVuc3VwcG9ydGVkICAgIik7CisKKwkJcCArPSBzcHJpbnRmKHAsICIlM3NhYmxlZCAiLCBkZXYtPnBhcml0eV9lbmFibGVkID8gImVuIiA6ICJkaXMiKTsKKworCQlpZiAoZGV2LT5zb2YpCisJCQlwICs9IHNwcmludGYocCwgIm9mZnNldCAlZCwgJWQgbnNcbiIsCisJCQkJICAgICBkZXYtPnNvZiwgZGV2LT5wZXJpb2QgKiA0KTsKKwkJZWxzZQorCQkJcCArPSBzcHJpbnRmKHAsICJhc3luY1xuIik7CisJfQorCisJcmV0dXJuIHAgLSBidWZmZXI7Cit9CisKK0VYUE9SVF9TWU1CT0woZmFzMjE2X2luaXQpOworRVhQT1JUX1NZTUJPTChmYXMyMTZfYWRkKTsKK0VYUE9SVF9TWU1CT0woZmFzMjE2X3F1ZXVlX2NvbW1hbmQpOworRVhQT1JUX1NZTUJPTChmYXMyMTZfbm9xdWV1ZV9jb21tYW5kKTsKK0VYUE9SVF9TWU1CT0woZmFzMjE2X2ludHIpOworRVhQT1JUX1NZTUJPTChmYXMyMTZfcmVtb3ZlKTsKK0VYUE9SVF9TWU1CT0woZmFzMjE2X3JlbGVhc2UpOworRVhQT1JUX1NZTUJPTChmYXMyMTZfZWhfYWJvcnQpOworRVhQT1JUX1NZTUJPTChmYXMyMTZfZWhfZGV2aWNlX3Jlc2V0KTsKK0VYUE9SVF9TWU1CT0woZmFzMjE2X2VoX2J1c19yZXNldCk7CitFWFBPUlRfU1lNQk9MKGZhczIxNl9laF9ob3N0X3Jlc2V0KTsKK0VYUE9SVF9TWU1CT0woZmFzMjE2X3ByaW50X2hvc3QpOworRVhQT1JUX1NZTUJPTChmYXMyMTZfcHJpbnRfc3RhdHMpOworRVhQT1JUX1NZTUJPTChmYXMyMTZfcHJpbnRfZGV2aWNlcyk7CisKK01PRFVMRV9BVVRIT1IoIlJ1c3NlbGwgS2luZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHZW5lcmljIEZBUzIxNi9OQ1I1M0M5eCBkcml2ZXIgY29yZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9mYXMyMTYuaCBiL2RyaXZlcnMvc2NzaS9hcm0vZmFzMjE2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhMmExMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vZmFzMjE2LmgKQEAgLTAsMCArMSwzOTQgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9hY29ybi9zY3NpL2ZhczIxNi5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIEZBUzIxNiBnZW5lcmljIGRyaXZlcgorICovCisjaWZuZGVmIEZBUzIxNl9ICisjZGVmaW5lIEZBUzIxNl9ICisKKyNpZm5kZWYgTk9fSVJRCisjZGVmaW5lIE5PX0lSUSAyNTUKKyNlbmRpZgorCisjaW5jbHVkZSAicXVldWUuaCIKKyNpbmNsdWRlICJtc2dxdWV1ZS5oIgorCisvKiBGQVMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKworLyogdHJhbnNmZXIgY291bnQgbG93ICovCisjZGVmaW5lIFJFR19DVENMCQkoMCkKKyNkZWZpbmUgUkVHX1NUQ0wJCSgwKQorCisvKiB0cmFuc2ZlciBjb3VudCBtZWRpdW0gKi8KKyNkZWZpbmUgUkVHX0NUQ00JCSgxKQorI2RlZmluZSBSRUdfU1RDTQkJKDEpCisKKy8qIGZpZm8gZGF0YSAqLworI2RlZmluZSBSRUdfRkYJCQkoMikKKworLyogY29tbWFuZCAqLworI2RlZmluZSBSRUdfQ01ECQkJKDMpCisjZGVmaW5lIENNRF9OT1AJCQkweDAwCisjZGVmaW5lIENNRF9GTFVTSEZJRk8JCTB4MDEKKyNkZWZpbmUgQ01EX1JFU0VUQ0hJUAkJMHgwMgorI2RlZmluZSBDTURfUkVTRVRTQ1NJCQkweDAzCisKKyNkZWZpbmUgQ01EX1RSQU5TRkVSSU5GTwkweDEwCisjZGVmaW5lIENNRF9JTklUQ01EQ09NUExFVEUJMHgxMQorI2RlZmluZSBDTURfTVNHQUNDRVBURUQJCTB4MTIKKyNkZWZpbmUgQ01EX1BBREJZVEVTCQkweDE4CisjZGVmaW5lIENNRF9TRVRBVE4JCTB4MWEKKyNkZWZpbmUgQ01EX1JTRVRBVE4JCTB4MWIKKworI2RlZmluZSBDTURfU0VMRUNUV09BVE4JCTB4NDEKKyNkZWZpbmUgQ01EX1NFTEVDVEFUTgkJMHg0MgorI2RlZmluZSBDTURfU0VMRUNUQVROU1RPUAkweDQzCisjZGVmaW5lIENNRF9FTkFCTEVTRUwJCTB4NDQKKyNkZWZpbmUgQ01EX0RJU0FCTEVTRUwJCTB4NDUKKyNkZWZpbmUgQ01EX1NFTEVDVEFUTjMJCTB4NDYKKyNkZWZpbmUgQ01EX1JFU0VMMwkJMHg0NworCisjZGVmaW5lIENNRF9XSVRIRE1BCQkweDgwCisKKy8qIHN0YXR1cyByZWdpc3RlciAocmVhZCkgKi8KKyNkZWZpbmUgUkVHX1NUQVQJCSg0KQorI2RlZmluZSBTVEFUX0lPCQkJKDEgPDwgMCkJCQkvKiBJTyBwaGFzZQkJKi8KKyNkZWZpbmUgU1RBVF9DRAkJCSgxIDw8IDEpCQkJLyogQ0QgcGhhc2UJCSovCisjZGVmaW5lIFNUQVRfTVNHCQkoMSA8PCAyKQkJCS8qIE1TRyBwaGFzZQkJKi8KKyNkZWZpbmUgU1RBVF9UUkFOU0ZFUkRPTkUJKDEgPDwgMykJCQkvKiBUcmFuc2ZlciBjb21wbGV0ZWQJKi8KKyNkZWZpbmUgU1RBVF9UUkFOU0ZFUkNOVFoJKDEgPDwgNCkJCQkvKiBUcmFuc2ZlciBjb3VudGVyIGlzIHplcm8gKi8KKyNkZWZpbmUgU1RBVF9QQVJJVFlFUlJPUgkoMSA8PCA1KQkJCS8qIFBhcml0eSBlcnJvcgkJKi8KKyNkZWZpbmUgU1RBVF9SRUFMQkFECQkoMSA8PCA2KQkJCS8qIFNvbWV0aGluZyBiYWQJKi8KKyNkZWZpbmUgU1RBVF9JTlQJCSgxIDw8IDcpCQkJLyogSW50ZXJydXB0CQkqLworCisjZGVmaW5lIFNUQVRfQlVTTUFTSwkJKFNUQVRfTVNHfFNUQVRfQ0R8U1RBVF9JTykKKyNkZWZpbmUgU1RBVF9EQVRBT1VUCQkoMCkJCQkJLyogRGF0YSBvdXQJCSovCisjZGVmaW5lIFNUQVRfREFUQUlOCQkoU1RBVF9JTykJCQkvKiBEYXRhIGluCQkqLworI2RlZmluZSBTVEFUX0NPTU1BTkQJCShTVEFUX0NEKQkJCS8qIENvbW1hbmQgb3V0CQkqLworI2RlZmluZSBTVEFUX1NUQVRVUwkJKFNUQVRfQ0R8U1RBVF9JTykJCS8qIFN0YXR1cyBJbgkJKi8KKyNkZWZpbmUgU1RBVF9NRVNHT1VUCQkoU1RBVF9NU0d8U1RBVF9DRCkJCS8qIE1lc3NhZ2Ugb3V0CQkqLworI2RlZmluZSBTVEFUX01FU0dJTgkJKFNUQVRfTVNHfFNUQVRfQ0R8U1RBVF9JTykJLyogTWVzc2FnZSBJbgkJKi8KKworLyogYnVzIElEIGZvciBzZWxlY3QgLyByZXNlbGVjdCAqLworI2RlZmluZSBSRUdfU0RJRAkJKDQpCisjZGVmaW5lIEJVU0lEKHRhcmdldCkJCSgodGFyZ2V0KSAmIDcpCisKKy8qIEludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKHJlYWQpICovCisjZGVmaW5lIFJFR19JTlNUCQkoNSkKKyNkZWZpbmUgSU5TVF9TRUxXT0FUTgkJKDEgPDwgMCkJCQkvKiBTZWxlY3Qgdy9vIEFUTgkqLworI2RlZmluZSBJTlNUX1NFTEFUTgkJKDEgPDwgMSkJCQkvKiBTZWxlY3Qgdy9BVE4JCSovCisjZGVmaW5lIElOU1RfUkVTRUxFQ1RFRAkJKDEgPDwgMikJCQkvKiBSZXNlbGVjdGVkCQkqLworI2RlZmluZSBJTlNUX0ZVTkNET05FCQkoMSA8PCAzKQkJCS8qIEZ1bmN0aW9uIGRvbmUJKi8KKyNkZWZpbmUgSU5TVF9CVVNTRVJWSUNFCQkoMSA8PCA0KQkJCS8qIEJ1cyBzZXJ2aWNlCQkqLworI2RlZmluZSBJTlNUX0RJU0NPTk5FQ1QJCSgxIDw8IDUpCQkJLyogRGlzY29ubmVjdAkJKi8KKyNkZWZpbmUgSU5TVF9JTExFR0FMQ01ECQkoMSA8PCA2KQkJCS8qIElsbGVnYWwgY29tbWFuZAkqLworI2RlZmluZSBJTlNUX0JVU1JFU0VUCQkoMSA8PCA3KQkJCS8qIFNDU0kgQnVzIHJlc2V0CSovCisKKy8qIFRpbWVvdXQgcmVnaXN0ZXIgKHdyaXRlKSAqLworI2RlZmluZSBSRUdfU1RJTQkJKDUpCisKKy8qIFNlcXVlbmNlIHN0ZXAgcmVnaXN0ZXIgKHJlYWQpICovCisjZGVmaW5lIFJFR19JUwkJCSg2KQorI2RlZmluZSBJU19CSVRTCQkJMHgwNworI2RlZmluZSBJU19TRUxBUkIJCTB4MDAJCQkJLyogU2VsZWN0ICYgQXJiIG9rCSovCisjZGVmaW5lIElTX01TR0JZVEVTRU5UCQkweDAxCQkJCS8qIE9uZSBieXRlIG1lc3NhZ2Ugc2VudCovCisjZGVmaW5lIElTX05PVENPTU1BTkQJCTB4MDIJCQkJLyogTm90IGluIGNvbW1hbmQgc3RhdGUJKi8KKyNkZWZpbmUgSVNfRUFSTFlQSEFTRQkJMHgwMwkJCQkvKiBFYXJseSBwaGFzZSBjaGFuZ2UJKi8KKyNkZWZpbmUgSVNfQ09NUExFVEUJCTB4MDQJCQkJLyogQ29tbWFuZCBvawkJKi8KKyNkZWZpbmUgSVNfU09GCQkJMHgwOAkJCQkvKiBTeW5jIG9mZiBmbGFnCSovCisKKy8qIFRyYW5zZmVyIHBlcmlvZCBzdGVwICh3cml0ZSkgKi8KKyNkZWZpbmUgUkVHX1NUUAkJCSg2KQorCisvKiBTeW5jaHJvbm91cyBPZmZzZXQgKHdyaXRlKSAqLworI2RlZmluZSBSRUdfU09GCQkJKDcpCisKKy8qIEZpZm8gc3RhdGUgcmVnaXN0ZXIgKHJlYWQpICovCisjZGVmaW5lIFJFR19DRklTCQkoNykKKyNkZWZpbmUgQ0ZJU19DRgkJCTB4MWYJCQkJLyogTnVtIGJ5dGVzIGluIEZJRk8JKi8KKyNkZWZpbmUgQ0ZJU19JUwkJCTB4ZTAJCQkJLyogU3RlcAkJCSovCisKKy8qIGNvbmZpZyByZWdpc3RlciAxICovCisjZGVmaW5lIFJFR19DTlRMMQkJKDgpCisjZGVmaW5lIENOVEwxX0NJRAkJKDcgPDwgMCkJCQkvKiBDaGlwIElECQkJKi8KKyNkZWZpbmUgQ05UTDFfU1RFCQkoMSA8PCAzKQkJCS8qIFNlbGYgdGVzdCBlbmFibGUJCSovCisjZGVmaW5lIENOVEwxX1BFUkUJCSgxIDw8IDQpCQkJLyogUGFyaXR5IGVuYWJsZSByZXBvcnRpbmcgZW4uCSovCisjZGVmaW5lIENOVEwxX1BURQkJKDEgPDwgNSkJCQkvKiBQYXJpdHkgdGVzdCBlbmFibGUJCSovCisjZGVmaW5lIENOVEwxX0RJU1IJCSgxIDw8IDYpCQkJLyogRGlzYWJsZSBJcnEgb24gU0NTSSByZXNldAkqLworI2RlZmluZSBDTlRMMV9FVE0JCSgxIDw8IDcpCQkJLyogRXh0ZW5kZWQgVGltaW5nIE1vZGUJCSovCisKKy8qIENsb2NrIGNvbnZlcnNpb24gZmFjdG9yIChyZWFkKSAqLworI2RlZmluZSBSRUdfQ0xLRgkJKDkpCisjZGVmaW5lIENMS0ZfRjM3TUhaCQkweDAwCQkJCS8qIDM1LjAxIC0gNDAgTUh6CQkqLworI2RlZmluZSBDTEtGX0YxME1IWgkJMHgwMgkJCQkvKiAxMCBNSHoJCQkqLworI2RlZmluZSBDTEtGX0YxMk1IWgkJMHgwMwkJCQkvKiAxMC4wMSAtIDE1IE1IegkJKi8KKyNkZWZpbmUgQ0xLRl9GMTdNSFoJCTB4MDQJCQkJLyogMTUuMDEgLSAyMCBNSHoJCSovCisjZGVmaW5lIENMS0ZfRjIyTUhaCQkweDA1CQkJCS8qIDIwLjAxIC0gMjUgTUh6CQkqLworI2RlZmluZSBDTEtGX0YyN01IWgkJMHgwNgkJCQkvKiAyNS4wMSAtIDMwIE1IegkJKi8KKyNkZWZpbmUgQ0xLRl9GMzJNSFoJCTB4MDcJCQkJLyogMzAuMDEgLSAzNSBNSHoJCSovCisKKy8qIENoaXAgdGVzdCByZWdpc3RlciAod3JpdGUpICovCisjZGVmaW5lIFJFR19GVE0JCQkoMTApCisjZGVmaW5lIFRFU1RfRlRNCQkweDAxCQkJCS8qIEZvcmNlIHRhcmdldCBtb2RlCQkqLworI2RlZmluZSBURVNUX0ZJTQkJMHgwMgkJCQkvKiBGb3JjZSBpbml0aWF0b3IgbW9kZQkJKi8KKyNkZWZpbmUgVEVTVF9GSEkJCTB4MDQJCQkJLyogRm9yY2UgaGlnaCBpbXBlZGFuY2UgbW9kZQkqLworCisvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIDIgKHJlYWQvd3JpdGUpICovCisjZGVmaW5lIFJFR19DTlRMMgkJKDExKQorI2RlZmluZSBDTlRMMl9QR0RQCQkoMSA8PCAwKQkJCS8qIFBhc3MgVGgvR2VuZXJhdGUgRGF0YSBQYXJpdHkJKi8KKyNkZWZpbmUgQ05UTDJfUEdSUAkJKDEgPDwgMSkJCQkvKiBQYXNzIFRoL0dlbmVyYXRlIFJlZyBQYXJpdHkJKi8KKyNkZWZpbmUgQ05UTDJfQUNEUEUJCSgxIDw8IDIpCQkJLyogQWJvcnQgb24gQ21kL0RhdGEgUGFyaXR5IEVycgkqLworI2RlZmluZSBDTlRMMl9TMkZFCQkoMSA8PCAzKQkJCS8qIFNDU0kyIEZlYXR1cmVzIEVuYWJsZQkqLworI2RlZmluZSBDTlRMMl9UU0RSCQkoMSA8PCA0KQkJCS8qIFRyaXN0YXRlIERSRVEJCSovCisjZGVmaW5lIENOVEwyX1NCTwkJKDEgPDwgNSkJCQkvKiBTZWxlY3QgQnl0ZSBPcmRlcgkJKi8KKyNkZWZpbmUgQ05UTDJfRU5GCQkoMSA8PCA2KQkJCS8qIEVuYWJsZSBmZWF0dXJlcwkJKi8KKyNkZWZpbmUgQ05UTDJfREFFCQkoMSA8PCA3KQkJCS8qIERhdGEgQWxpZ25tZW50IEVuYWJsZQkqLworCisvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIDMgKHJlYWQvd3JpdGUpICovCisjZGVmaW5lIFJFR19DTlRMMwkJKDEyKQorI2RlZmluZSBDTlRMM19CUzgJCSgxIDw8IDApCQkJLyogQnVyc3Qgc2l6ZSA4CQkJKi8KKyNkZWZpbmUgQ05UTDNfTURNCQkoMSA8PCAxKQkJCS8qIE1vZGlmeSBETUEgbW9kZQkJKi8KKyNkZWZpbmUgQ05UTDNfTEJUTQkJKDEgPDwgMikJCQkvKiBMYXN0IEJ5dGUgVHJhbnNmZXIgbW9kZQkqLworI2RlZmluZSBDTlRMM19GQVNUQ0xLCQkoMSA8PCAzKQkJCS8qIEZhc3QgU0NTSSBjbG9ja2luZwkJKi8KKyNkZWZpbmUgQ05UTDNfRkFTVFNDU0kJCSgxIDw8IDQpCQkJLyogRmFzdCBTQ1NJCQkJKi8KKyNkZWZpbmUgQ05UTDNfRzJDQgkJKDEgPDwgNSkJCQkvKiBHcm91cDIgU0NTSSBzdXBwb3J0CQkqLworI2RlZmluZSBDTlRMM19RVEFHCQkoMSA8PCA2KQkJCS8qIEVuYWJsZSAzIGJ5dGUgbXNncwkJKi8KKyNkZWZpbmUgQ05UTDNfQURJRENISwkJKDEgPDwgNykJCQkvKiBBZGRpdGlvbmFsIElEIGNoZWNrCQkqLworCisvKiBIaWdoIHRyYW5zZmVyIGNvdW50IChyZWFkL3dyaXRlKSAqLworI2RlZmluZSBSRUdfQ1RDSAkJKDE0KQorI2RlZmluZSBSRUdfU1RDSAkJKDE0KQorCisvKiBJRCByZWdpc3RlciAocmVhZCBvbmx5KSAqLworI2RlZmluZSBSRUdfSUQJCQkoMTQpCisKKy8qIERhdGEgYWxpZ25tZW50ICovCisjZGVmaW5lIFJFR19EQUwJCQkoMTUpCisKK3R5cGVkZWYgZW51bSB7CisJUEhBU0VfSURMRSwJCQkJCS8qIHdlJ3JlIG5vdCBwbGFubmluZyBvbiBkb2luZyBhbnl0aGluZwkqLworCVBIQVNFX1NFTEVDVElPTiwJCQkJLyogc2VsZWN0aW5nIGEgZGV2aWNlCQkJKi8KKwlQSEFTRV9TRUxTVEVQUywJCQkJCS8qIHNlbGVjdGlvbiB3aXRoIGNvbW1hbmQgc3RlcHMJCSovCisJUEhBU0VfQ09NTUFORCwJCQkJCS8qIGNvbW1hbmQgc2VudAkJCQkqLworCVBIQVNFX01FU1NBR0VTRU5ULAkJCQkvKiBzZWxlY3RlZCwgYW5kIHdlJ3JlIHNlbmRpbmcgY21kCSovCisJUEhBU0VfREFUQU9VVCwJCQkJCS8qIGRhdGEgb3V0IHRvIGRldmljZQkJCSovCisJUEhBU0VfREFUQUlOLAkJCQkJLyogZGF0YSBpbiBmcm9tIGRldmljZQkJCSovCisJUEhBU0VfTVNHSU4sCQkJCQkvKiBtZXNzYWdlIGluIGZyb20gZGV2aWNlCQkqLworCVBIQVNFX01TR0lOX0RJU0NPTk5FQ1QsCQkJCS8qIGRpc2Nvbm5lY3RpbmcgZnJvbSBidXMJCSovCisJUEhBU0VfTVNHT1VULAkJCQkJLyogYWZ0ZXIgbWVzc2FnZSBvdXQgcGhhc2UJCSovCisJUEhBU0VfTVNHT1VUX0VYUEVDVCwJCQkJLyogZXhwZWN0aW5nIG1lc3NhZ2Ugb3V0CQkqLworCVBIQVNFX1NUQVRVUywJCQkJCS8qIHN0YXR1cyBmcm9tIGRldmljZQkJCSovCisJUEhBU0VfRE9ORQkJCQkJLyogQ29tbWFuZCBjb21wbGV0ZQkJCSovCit9IHBoYXNlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisJRE1BX09VVCwJCQkJCS8qIERNQSBmcm9tIG1lbW9yeSB0byBjaGlwCQkqLworCURNQV9JTgkJCQkJCS8qIERNQSBmcm9tIGNoaXAgdG8gbWVtb3J5CQkqLworfSBmYXNkbWFkaXJfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlmYXNkbWFfbm9uZSwJCQkJCS8qIE5vIGRtYQkJCQkqLworCWZhc2RtYV9waW8sCQkJCQkvKiBQSU8gbW9kZQkJCQkqLworCWZhc2RtYV9wc2V1ZG8sCQkJCQkvKiBQc2V1ZG8gRE1BCQkJCSovCisJZmFzZG1hX3JlYWxfYmxvY2ssCQkJCS8qIFJlYWwgRE1BLCBvbiBibG9jayBieSBibG9jayBiYXNpcwkqLworCWZhc2RtYV9yZWFsX2FsbAkJCQkJLyogUmVhbCBETUEsIG9uIHJlcXVlc3QgYnkgcmVxdWVzdAkqLworfSBmYXNkbWF0eXBlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisJbmVnX3dhaXQsCQkJCQkvKiBOZWdvY2lhdGUgd2l0aCBkZXZpY2UJCSovCisJbmVnX2lucHJvZ3Jlc3MsCQkJCQkvKiBOZWdvY2lhdGlvbiBzZW50CQkJKi8KKwluZWdfY29tcGxldGUsCQkJCQkvKiBOZWdvY2lhdGlvbiBjb21wbGV0ZQkJCSovCisJbmVnX3Rhcmdjb21wbGV0ZSwJCQkJLyogVGFyZ2V0IGNvbXBsZXRlZCBuZWdvY2lhdGlvbgkJKi8KKwluZWdfaW52YWxpZAkJCQkJLyogTmVnb2NpYXRpb24gbm90IHN1cHBvcnRlZAkJKi8KK30gbmVnX3Q7CisKKyNkZWZpbmUgTUFHSUMJMHg0NDEyOTZiZFVMCisjZGVmaW5lIE5SX01TR1MJOAorCisjZGVmaW5lIEZBU0NBUF9ETUEJCSgxIDw8IDApCisjZGVmaW5lIEZBU0NBUF9QU0VVRE9ETUEJKDEgPDwgMSkKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcJCW1hZ2ljX3N0YXJ0OworCXNwaW5sb2NrX3QJCWhvc3RfbG9jazsKKwlzdHJ1Y3QgU2NzaV9Ib3N0CSpob3N0OwkJCS8qIGhvc3QJCQkJCSovCisJU2NzaV9DbW5kCQkqU0NwbnQ7CQkJLyogY3VycmVudGx5IHByb2Nlc3NpbmcgY29tbWFuZAkJKi8KKwlTY3NpX0NtbmQJCSpvcmlnU0NwbnQ7CQkvKiBvcmlnaW5hbCBjb25uZWN0aW5nIGNvbW1hbmQJCSovCisJU2NzaV9DbW5kCQkqcmVxU0NwbnQ7CQkvKiByZXF1ZXN0IHNlbnNlIGNvbW1hbmQJCSovCisJU2NzaV9DbW5kCQkqcnN0U0NwbnQ7CQkvKiByZXNldCBjb21tYW5kCQkJKi8KKwlTY3NpX0NtbmQJCSpwZW5kaW5nX1NDcG50WzhdOwkvKiBwZXItZGV2aWNlIHBlbmRpbmcgY29tbWFuZHMJCSovCisJaW50CQkJbmV4dF9wZW5kaW5nOwkJLyogbmV4dCBwZW5kaW5nIGRldmljZQkJCSovCisKKwkvKgorCSAqIEVycm9yIHJlY292ZXJ5CisJICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJZWhfd2FpdDsKKwlzdHJ1Y3QgdGltZXJfbGlzdAllaF90aW1lcjsKKwl1bnNpZ25lZCBpbnQJCXJzdF9kZXZfc3RhdHVzOworCXVuc2lnbmVkIGludAkJcnN0X2J1c19zdGF0dXM7CisKKwkvKiBkcml2ZXIgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgeworCQlwaGFzZV90CQlwaGFzZTsJCQkvKiBjdXJyZW50IHBoYXNlCQkJKi8KKwkJdm9pZCBfX2lvbWVtCSppb19iYXNlOwkJLyogaW9tZW0gYmFzZSBvZiBGQVMyMTYJCQkqLworCQl1bnNpZ25lZCBpbnQJaW9fc2hpZnQ7CQkvKiBzaGlmdCB0byBhZGp1c3QgcmVnIG9mZnNldHMgYnkJKi8KKwkJdW5zaWduZWQgY2hhcgljZmdbNF07CQkJLyogY29uZmlndXJhdGlvbiByZWdpc3RlcnMJCSovCisJCWNvbnN0IGNoYXIJKnR5cGU7CQkJLyogY2hpcCB0eXBlCQkJCSovCisJCXVuc2lnbmVkIGludAlpcnE7CQkJLyogaW50ZXJydXB0CQkJCSovCisJCWludAkJZG1hOwkJCS8qIGRtYSBjaGFubmVsCQkJCSovCisKKwkJU2NzaV9Qb2ludGVyCVNDcDsJCQkvKiBjdXJyZW50IGNvbW1hbmRzIGRhdGEgcG9pbnRlcgkqLworCisJCU1zZ1F1ZXVlX3QJbXNnczsJCQkvKiBtZXNzYWdlIHF1ZXVlIGZvciBjb25uZWN0ZWQgZGV2aWNlCSovCisKKwkJdW5zaWduZWQgaW50CWFzeW5jX3N0cDsJCS8qIEFzeW5jIHRyYW5zZmVyIFNUUCB2YWx1ZQkJKi8KKwkJdW5zaWduZWQgY2hhcgltc2dpbl9maWZvOwkJLyogYnl0ZXMgaW4gZmlmbyBhdCB0aW1lIG9mIG1lc3NhZ2UgaW4JKi8KKwkJdW5zaWduZWQgY2hhcgltZXNzYWdlWzI1Nl07CQkvKiBsYXN0IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBkZXZpY2UJKi8KKworCQl1bnNpZ25lZCBjaGFyCWRpc2Nvbm5lY3RhYmxlOjE7CS8qIHRoaXMgY29tbWFuZCBjYW4gYmUgZGlzY29ubmVjdGVkCSovCisJCXVuc2lnbmVkIGNoYXIJYWJvcnRpbmc6MTsJCS8qIGFib3J0aW5nIGNvbW1hbmQJCQkqLworCX0gc2NzaTsKKworCS8qIHN0YXRpc3RpY3MgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQJcXVldWVzOworCQl1bnNpZ25lZCBpbnQJcmVtb3ZlczsKKwkJdW5zaWduZWQgaW50CWZpbnM7CisJCXVuc2lnbmVkIGludAlyZWFkczsKKwkJdW5zaWduZWQgaW50CXdyaXRlczsKKwkJdW5zaWduZWQgaW50CW1pc2NzOworCQl1bnNpZ25lZCBpbnQJZGlzY29ubmVjdHM7CisJCXVuc2lnbmVkIGludAlhYm9ydHM7CisJCXVuc2lnbmVkIGludAlidXNfcmVzZXRzOworCQl1bnNpZ25lZCBpbnQJaG9zdF9yZXNldHM7CisJfSBzdGF0czsKKworCS8qIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyCWNsb2NrcmF0ZTsJCS8qIGNsb2NrIHJhdGUgb2YgRkFTIGRldmljZSAoTUh6KQkqLworCQl1bnNpZ25lZCBjaGFyCXNlbGVjdF90aW1lb3V0OwkJLyogdGltZW91dCAoUjUpCQkJCSovCisJCXVuc2lnbmVkIGNoYXIJc3luY19tYXhfZGVwdGg7CQkvKiBTeW5jaHJvbm91cyB4ZmVyIG1heCBmaWZvIGRlcHRoCSovCisJCXVuc2lnbmVkIGNoYXIJd2lkZV9tYXhfc2l6ZTsJCS8qIE1heGltdW0gd2lkZSB0cmFuc2ZlciBzaXplCQkqLworCQl1bnNpZ25lZCBjaGFyCWNudGwzOwkJCS8qIENvbnRyb2wgUmVnIDMJCQkqLworCQl1bnNpZ25lZCBpbnQJYXN5bmNwZXJpb2Q7CQkvKiBBc3luYyB0cmFuc2ZlciBwZXJpb2QgKG5zKQkJKi8KKwkJdW5zaWduZWQgaW50CWNhcGFiaWxpdGllczsJCS8qIGRyaXZlciBjYXBhYmlsaXRpZXMJCQkqLworCQl1bnNpZ25lZCBpbnQJZGlzY29ubmVjdF9vazoxOwkvKiBEaXNjb25uZWN0cyBhbGxvd2VkPwkJCSovCisJfSBpZmNmZzsKKworCS8qIHF1ZXVlIGhhbmRsaW5nICovCisJc3RydWN0IHsKKwkgICAgCVF1ZXVlX3QJCWlzc3VlOwkJCS8qIGlzc3VlIHF1ZXVlCQkJCSovCisgICAgCQlRdWV1ZV90CQlkaXNjb25uZWN0ZWQ7CQkvKiBkaXNjb25uZWN0ZWQgY29tbWFuZCBxdWV1ZQkJKi8KKwl9IHF1ZXVlczsKKworCS8qIHBlci1kZXZpY2UgaW5mbyAqLworCXN0cnVjdCBmYXMyMTZfZGV2aWNlIHsKKwkJdW5zaWduZWQgY2hhcglkaXNjb25uZWN0X29rOjE7CS8qIGRldmljZSBjYW4gZGlzY29ubmVjdAkJKi8KKwkJdW5zaWduZWQgY2hhcglwYXJpdHlfZW5hYmxlZDoxOwkvKiBwYXJpdHkgY2hlY2tpbmcgZW5hYmxlZAkJKi8KKwkJdW5zaWduZWQgY2hhcglwYXJpdHlfY2hlY2s6MTsJCS8qIG5lZWQgdG8gY2hlY2sgcGFyaXR5IGNoZWNraW5nCSovCisJCXVuc2lnbmVkIGNoYXIJcGVyaW9kOwkJCS8qIHN5bmMgeGZlciBwZXJpb2QgaW4gKCo0bnMpCQkqLworCQl1bnNpZ25lZCBjaGFyCXN0cDsJCQkvKiBzeW5jaHJvbm91cyB0cmFuc2ZlciBwZXJpb2QJCSovCisJCXVuc2lnbmVkIGNoYXIJc29mOwkJCS8qIHN5bmNocm9ub3VzIG9mZnNldCByZWdpc3RlcgkJKi8KKwkJdW5zaWduZWQgY2hhcgl3aWRlX3hmZXI7CQkvKiBjdXJyZW50bHkgbmVnb2NpYXRlZCB3aWRlIHRyYW5zZmVyCSovCisJCW5lZ190CQlzeW5jX3N0YXRlOwkJLyogc3luY2hyb25vdXMgdHJhbnNmZXIgbW9kZQkJKi8KKwkJbmVnX3QJCXdpZGVfc3RhdGU7CQkvKiB3aWRlIHRyYW5zZmVyIG1vZGUJCQkqLworCX0gZGV2aWNlWzhdOworCXVuc2lnbmVkIGxvbmcJYnVzeWx1bnNbNjQvc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXTsvKiBhcnJheSBvZiBiaXRzIGluZGljYXRpbmcgTFVOcyBidXN5CSovCisKKwkvKiBkbWEgKi8KKwlzdHJ1Y3QgeworCQlmYXNkbWF0eXBlX3QJdHJhbnNmZXJfdHlwZTsJCS8qIGN1cnJlbnQgdHlwZSBvZiBETUEgdHJhbnNmZXIJCSovCisJCWZhc2RtYXR5cGVfdAkoKnNldHVwKSAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgU2NzaV9Qb2ludGVyICpTQ3AsIGZhc2RtYWRpcl90IGRpcmVjdGlvbiwgZmFzZG1hdHlwZV90IG1pbl9kbWEpOworCQl2b2lkCQkoKnBzZXVkbykoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgU2NzaV9Qb2ludGVyICpTQ3AsIGZhc2RtYWRpcl90IGRpcmVjdGlvbiwgaW50IHRyYW5zZmVyKTsKKwkJdm9pZAkJKCpzdG9wKSAgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIFNjc2lfUG9pbnRlciAqU0NwKTsKKwl9IGRtYTsKKworCS8qIG1pc2NlbGxhbmVvdXMgKi8KKwlpbnQJCQlpbnRlcm5hbF9kb25lOwkJLyogZmxhZyB0byBpbmRpY2F0ZSByZXF1ZXN0IGRvbmUgKi8KKwl1bnNpZ25lZCBsb25nCQltYWdpY19lbmQ7Cit9IEZBUzIxNl9JbmZvOworCisvKiBGdW5jdGlvbjogaW50IGZhczIxNl9pbml0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKKyAqIFB1cnBvc2UgOiBpbml0aWFsaXNlIEZBUy9OQ1IvQU1EIFNDU0kgc3RydWN0dXJlcy4KKyAqIFBhcmFtcyAgOiBpbnN0YW5jZSAtIGEgZHJpdmVyLXNwZWNpZmljIGZpbGxlZC1vdXQgc3RydWN0dXJlCisgKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzCisgKi8KK2V4dGVybiBpbnQgZmFzMjE2X2luaXQgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKTsKKworLyogRnVuY3Rpb246IGludCBmYXMyMTZfYWRkIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgc3RydWN0IGRldmljZSAqZGV2KQorICogUHVycG9zZSA6IGluaXRpYWxpc2UgRkFTL05DUi9BTUQgU0NTSSBpYy4KKyAqIFBhcmFtcyAgOiBpbnN0YW5jZSAtIGEgZHJpdmVyLXNwZWNpZmljIGZpbGxlZC1vdXQgc3RydWN0dXJlCisgKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzCisgKi8KK2V4dGVybiBpbnQgZmFzMjE2X2FkZCAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIHN0cnVjdCBkZXZpY2UgKmRldik7CisKKy8qIEZ1bmN0aW9uOiBpbnQgZmFzMjE2X3F1ZXVlX2NvbW1hbmQgKFNjc2lfQ21uZCAqU0NwbnQsIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpCisgKiBQdXJwb3NlIDogcXVldWUgYSBjb21tYW5kIGZvciBhZGFwdGVyIHRvIHByb2Nlc3MuCisgKiBQYXJhbXMgIDogU0NwbnQgLSBDb21tYW5kIHRvIHF1ZXVlCisgKgkgICAgIGRvbmUgIC0gZG9uZSBmdW5jdGlvbiB0byBjYWxsIG9uY2UgY29tbWFuZCBpcyBjb21wbGV0ZQorICogUmV0dXJucyA6IDAgLSBzdWNjZXNzLCBlbHNlIGVycm9yCisgKi8KK2V4dGVybiBpbnQgZmFzMjE2X3F1ZXVlX2NvbW1hbmQgKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKKworLyogRnVuY3Rpb246IGludCBmYXMyMTZfbm9xdWV1ZV9jb21tYW5kIChTY3NpX0NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQorICogUHVycG9zZSA6IHF1ZXVlIGEgY29tbWFuZCBmb3IgYWRhcHRlciB0byBwcm9jZXNzLCBhbmQgcHJvY2VzcyBpdCB0byBjb21wbGV0aW9uLgorICogUGFyYW1zICA6IFNDcG50IC0gQ29tbWFuZCB0byBxdWV1ZQorICoJICAgICBkb25lICAtIGRvbmUgZnVuY3Rpb24gdG8gY2FsbCBvbmNlIGNvbW1hbmQgaXMgY29tcGxldGUKKyAqIFJldHVybnMgOiAwIC0gc3VjY2VzcywgZWxzZSBlcnJvcgorICovCitleHRlcm4gaW50IGZhczIxNl9ub3F1ZXVlX2NvbW1hbmQgKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKKworLyogRnVuY3Rpb246IGlycXJldHVybl90IGZhczIxNl9pbnRyIChGQVMyMTZfSW5mbyAqaW5mbykKKyAqIFB1cnBvc2UgOiBoYW5kbGUgaW50ZXJydXB0cyBmcm9tIHRoZSBpbnRlcmZhY2UgdG8gcHJvZ3Jlc3MgYSBjb21tYW5kCisgKiBQYXJhbXMgIDogaW5mbyAtIGludGVyZmFjZSB0byBzZXJ2aWNlCisgKi8KK2V4dGVybiBpcnFyZXR1cm5fdCBmYXMyMTZfaW50ciAoRkFTMjE2X0luZm8gKmluZm8pOworCitleHRlcm4gdm9pZCBmYXMyMTZfcmVtb3ZlIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSk7CisKKy8qIEZ1bmN0aW9uOiB2b2lkIGZhczIxNl9yZWxlYXNlIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKKyAqIFB1cnBvc2UgOiByZWxlYXNlIGFsbCByZXNvdXJjZXMgYW5kIHB1dCBldmVyeXRoaW5nIHRvIGJlZCBmb3IgRkFTL05DUi9BTUQgU0NTSSBpYy4KKyAqIFBhcmFtcyAgOiBpbnN0YW5jZSAtIGEgZHJpdmVyLXNwZWNpZmljIGZpbGxlZC1vdXQgc3RydWN0dXJlCisgKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzCisgKi8KK2V4dGVybiB2b2lkIGZhczIxNl9yZWxlYXNlIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSk7CisKK2V4dGVybiBpbnQgZmFzMjE2X3ByaW50X2hvc3QoRkFTMjE2X0luZm8gKmluZm8sIGNoYXIgKmJ1ZmZlcik7CitleHRlcm4gaW50IGZhczIxNl9wcmludF9zdGF0cyhGQVMyMTZfSW5mbyAqaW5mbywgY2hhciAqYnVmZmVyKTsKK2V4dGVybiBpbnQgZmFzMjE2X3ByaW50X2RldmljZXMoRkFTMjE2X0luZm8gKmluZm8sIGNoYXIgKmJ1ZmZlcik7CisKKy8qIEZ1bmN0aW9uOiBpbnQgZmFzMjE2X2VoX2Fib3J0KFNjc2lfQ21uZCAqU0NwbnQpCisgKiBQdXJwb3NlIDogYWJvcnQgdGhpcyBjb21tYW5kCisgKiBQYXJhbXMgIDogU0NwbnQgLSBjb21tYW5kIHRvIGFib3J0CisgKiBSZXR1cm5zIDogRkFJTEVEIGlmIHVuYWJsZSB0byBhYm9ydAorICovCitleHRlcm4gaW50IGZhczIxNl9laF9hYm9ydChTY3NpX0NtbmQgKlNDcG50KTsKKworLyogRnVuY3Rpb246IGludCBmYXMyMTZfZWhfZGV2aWNlX3Jlc2V0KFNjc2lfQ21uZCAqU0NwbnQpCisgKiBQdXJwb3NlIDogUmVzZXQgdGhlIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21tYW5kCisgKiBQYXJhbXMgIDogU0NwbnQgLSBjb21tYW5kIHNwZWNpZmluZyBkZXZpY2UgdG8gcmVzZXQKKyAqIFJldHVybnMgOiBGQUlMRUQgaWYgdW5hYmxlIHRvIHJlc2V0CisgKi8KK2V4dGVybiBpbnQgZmFzMjE2X2VoX2RldmljZV9yZXNldChTY3NpX0NtbmQgKlNDcG50KTsKKworLyogRnVuY3Rpb246IGludCBmYXMyMTZfZWhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqU0NwbnQpCisgKiBQdXJwb3NlIDogUmVzZXQgdGhlIGNvbXBsZXRlIGJ1cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21tYW5kCisgKiBQYXJhbXMgIDogU0NwbnQgLSBjb21tYW5kIHNwZWNpZmluZyBidXMgdG8gcmVzZXQKKyAqIFJldHVybnMgOiBGQUlMRUQgaWYgdW5hYmxlIHRvIHJlc2V0CisgKi8KK2V4dGVybiBpbnQgZmFzMjE2X2VoX2J1c19yZXNldChTY3NpX0NtbmQgKlNDcG50KTsKKworLyogRnVuY3Rpb246IGludCBmYXMyMTZfZWhfaG9zdF9yZXNldChTY3NpX0NtbmQgKlNDcG50KQorICogUHVycG9zZSA6IFJlc2V0IHRoZSBob3N0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbW1hbmQKKyAqIFBhcmFtcyAgOiBTQ3BudCAtIGNvbW1hbmQgc3BlY2lmaW5nIGhvc3QgdG8gcmVzZXQKKyAqIFJldHVybnMgOiBGQUlMRUQgaWYgdW5hYmxlIHRvIHJlc2V0CisgKi8KK2V4dGVybiBpbnQgZmFzMjE2X2VoX2hvc3RfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCk7CisKKyNlbmRpZiAvKiBGQVMyMTZfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9tc2dxdWV1ZS5jIGIvZHJpdmVycy9zY3NpL2FybS9tc2dxdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOTVjNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXJtL21zZ3F1ZXVlLmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9hY29ybi9zY3NpL21zZ3F1ZXVlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTE5OTggUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgbWVzc2FnZSBxdWV1ZSBoYW5kbGluZworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSAibXNncXVldWUuaCIKKworLyoKKyAqIEZ1bmN0aW9uOiBzdHJ1Y3QgbXNncXVldWVfZW50cnkgKm1xZV9hbGxvYyhNc2dRdWV1ZV90ICptc2dxKQorICogUHVycG9zZSA6IEFsbG9jYXRlIGEgbWVzc2FnZSBxdWV1ZSBlbnRyeQorICogUGFyYW1zICA6IG1zZ3EgLSBtZXNzYWdlIHF1ZXVlIHRvIGNsYWltIGVudHJ5IGZvcgorICogUmV0dXJucyA6IG1lc3NhZ2UgcXVldWUgZW50cnkgb3IgTlVMTC4KKyAqLworc3RhdGljIHN0cnVjdCBtc2dxdWV1ZV9lbnRyeSAqbXFlX2FsbG9jKE1zZ1F1ZXVlX3QgKm1zZ3EpCit7CisJc3RydWN0IG1zZ3F1ZXVlX2VudHJ5ICptcTsKKworCWlmICgobXEgPSBtc2dxLT5mcmVlKSAhPSBOVUxMKQorCQltc2dxLT5mcmVlID0gbXEtPm5leHQ7CisKKwlyZXR1cm4gbXE7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogdm9pZCBtcWVfZnJlZShNc2dRdWV1ZV90ICptc2dxLCBzdHJ1Y3QgbXNncXVldWVfZW50cnkgKm1xKQorICogUHVycG9zZSA6IGZyZWUgYSBtZXNzYWdlIHF1ZXVlIGVudHJ5CisgKiBQYXJhbXMgIDogbXNncSAtIG1lc3NhZ2UgcXVldWUgdG8gZnJlZSBlbnRyeSBmcm9tCisgKgkgICAgIG1xICAgLSBtZXNzYWdlIHF1ZXVlIGVudHJ5IHRvIGZyZWUKKyAqLworc3RhdGljIHZvaWQgbXFlX2ZyZWUoTXNnUXVldWVfdCAqbXNncSwgc3RydWN0IG1zZ3F1ZXVlX2VudHJ5ICptcSkKK3sKKwlpZiAobXEpIHsKKwkJbXEtPm5leHQgPSBtc2dxLT5mcmVlOworCQltc2dxLT5mcmVlID0gbXE7CisJfQorfQorCisvKgorICogRnVuY3Rpb246IHZvaWQgbXNncXVldWVfaW5pdGlhbGlzZShNc2dRdWV1ZV90ICptc2dxKQorICogUHVycG9zZSA6IGluaXRpYWxpc2UgYSBtZXNzYWdlIHF1ZXVlCisgKiBQYXJhbXMgIDogbXNncSAtIHF1ZXVlIHRvIGluaXRpYWxpc2UKKyAqLwordm9pZCBtc2dxdWV1ZV9pbml0aWFsaXNlKE1zZ1F1ZXVlX3QgKm1zZ3EpCit7CisJaW50IGk7CisKKwltc2dxLT5xZSA9IE5VTEw7CisJbXNncS0+ZnJlZSA9ICZtc2dxLT5lbnRyaWVzWzBdOworCisJZm9yIChpID0gMDsgaSA8IE5SX01FU1NBR0VTOyBpKyspCisJCW1zZ3EtPmVudHJpZXNbaV0ubmV4dCA9ICZtc2dxLT5lbnRyaWVzW2kgKyAxXTsKKworCW1zZ3EtPmVudHJpZXNbTlJfTUVTU0FHRVMgLSAxXS5uZXh0ID0gTlVMTDsKK30KKworCisvKgorICogRnVuY3Rpb246IHZvaWQgbXNncXVldWVfZnJlZShNc2dRdWV1ZV90ICptc2dxKQorICogUHVycG9zZSA6IGZyZWUgYSBxdWV1ZQorICogUGFyYW1zICA6IG1zZ3EgLSBxdWV1ZSB0byBmcmVlCisgKi8KK3ZvaWQgbXNncXVldWVfZnJlZShNc2dRdWV1ZV90ICptc2dxKQoreworfQorCisvKgorICogRnVuY3Rpb246IGludCBtc2dxdWV1ZV9tc2dsZW5ndGgoTXNnUXVldWVfdCAqbXNncSkKKyAqIFB1cnBvc2UgOiBjYWxjdWxhdGUgdGhlIHRvdGFsIGxlbmd0aCBvZiBhbGwgbWVzc2FnZXMgb24gdGhlIG1lc3NhZ2UgcXVldWUKKyAqIFBhcmFtcyAgOiBtc2dxIC0gcXVldWUgdG8gZXhhbWluZQorICogUmV0dXJucyA6IG51bWJlciBvZiBieXRlcyBvZiBtZXNzYWdlcyBpbiBxdWV1ZQorICovCitpbnQgbXNncXVldWVfbXNnbGVuZ3RoKE1zZ1F1ZXVlX3QgKm1zZ3EpCit7CisJc3RydWN0IG1zZ3F1ZXVlX2VudHJ5ICptcSA9IG1zZ3EtPnFlOworCWludCBsZW5ndGggPSAwOworCisJZm9yIChtcSA9IG1zZ3EtPnFlOyBtcTsgbXEgPSBtcS0+bmV4dCkKKwkJbGVuZ3RoICs9IG1xLT5tc2cubGVuZ3RoOworCisJcmV0dXJuIGxlbmd0aDsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiBzdHJ1Y3QgbWVzc2FnZSAqbXNncXVldWVfZ2V0bXNnKE1zZ1F1ZXVlX3QgKm1zZ3EsIGludCBtc2dubykKKyAqIFB1cnBvc2UgOiByZXR1cm4gYSBtZXNzYWdlCisgKiBQYXJhbXMgIDogbXNncSAgIC0gcXVldWUgdG8gb2J0YWluIG1lc3NhZ2UgZnJvbQorICoJICAgOiBtc2dubyAgLSBtZXNzYWdlIG51bWJlcgorICogUmV0dXJucyA6IHBvaW50ZXIgdG8gbWVzc2FnZSBzdHJpbmcsIG9yIE5VTEwKKyAqLworc3RydWN0IG1lc3NhZ2UgKm1zZ3F1ZXVlX2dldG1zZyhNc2dRdWV1ZV90ICptc2dxLCBpbnQgbXNnbm8pCit7CisJc3RydWN0IG1zZ3F1ZXVlX2VudHJ5ICptcTsKKworCWZvciAobXEgPSBtc2dxLT5xZTsgbXEgJiYgbXNnbm87IG1xID0gbXEtPm5leHQsIG1zZ25vLS0pOworCisJcmV0dXJuIG1xID8gJm1xLT5tc2cgOiBOVUxMOworfQorCisvKgorICogRnVuY3Rpb246IGludCBtc2dxdWV1ZV9hZGRtc2coTXNnUXVldWVfdCAqbXNncSwgaW50IGxlbmd0aCwgLi4uKQorICogUHVycG9zZSA6IGFkZCBhIG1lc3NhZ2Ugb250byBhIG1lc3NhZ2UgcXVldWUKKyAqIFBhcmFtcyAgOiBtc2dxICAgLSBxdWV1ZSB0byBhZGQgbWVzc2FnZSBvbgorICoJICAgICBsZW5ndGggLSBsZW5ndGggb2YgbWVzc2FnZQorICoJICAgICAuLi4gICAgLSBtZXNzYWdlIGJ5dGVzCisgKiBSZXR1cm5zIDogIT0gMCBpZiBzdWNjZXNzZnVsCisgKi8KK2ludCBtc2dxdWV1ZV9hZGRtc2coTXNnUXVldWVfdCAqbXNncSwgaW50IGxlbmd0aCwgLi4uKQoreworCXN0cnVjdCBtc2dxdWV1ZV9lbnRyeSAqbXEgPSBtcWVfYWxsb2MobXNncSk7CisJdmFfbGlzdCBhcDsKKworCWlmIChtcSkgeworCQlzdHJ1Y3QgbXNncXVldWVfZW50cnkgKiptcXA7CisJCWludCBpOworCisJCXZhX3N0YXJ0KGFwLCBsZW5ndGgpOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCQltcS0+bXNnLm1zZ1tpXSA9IHZhX2FyZyhhcCwgdW5zaWduZWQgaW50KTsKKwkJdmFfZW5kKGFwKTsKKworCQltcS0+bXNnLmxlbmd0aCA9IGxlbmd0aDsKKwkJbXEtPm1zZy5maWZvID0gMDsKKwkJbXEtPm5leHQgPSBOVUxMOworCisJCW1xcCA9ICZtc2dxLT5xZTsKKwkJd2hpbGUgKCptcXApCisJCQltcXAgPSAmKCptcXApLT5uZXh0OworCisJCSptcXAgPSBtcTsKKwl9CisKKwlyZXR1cm4gbXEgIT0gTlVMTDsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiB2b2lkIG1zZ3F1ZXVlX2ZsdXNoKE1zZ1F1ZXVlX3QgKm1zZ3EpCisgKiBQdXJwb3NlIDogZmx1c2ggYWxsIG1lc3NhZ2VzIGZyb20gbWVzc2FnZSBxdWV1ZQorICogUGFyYW1zICA6IG1zZ3EgLSBxdWV1ZSB0byBmbHVzaAorICovCit2b2lkIG1zZ3F1ZXVlX2ZsdXNoKE1zZ1F1ZXVlX3QgKm1zZ3EpCit7CisJc3RydWN0IG1zZ3F1ZXVlX2VudHJ5ICptcSwgKm1xbmV4dDsKKworCWZvciAobXEgPSBtc2dxLT5xZTsgbXE7IG1xID0gbXFuZXh0KSB7CisJCW1xbmV4dCA9IG1xLT5uZXh0OworCQltcWVfZnJlZShtc2dxLCBtcSk7CisJfQorCW1zZ3EtPnFlID0gTlVMTDsKK30KKworRVhQT1JUX1NZTUJPTChtc2dxdWV1ZV9pbml0aWFsaXNlKTsKK0VYUE9SVF9TWU1CT0wobXNncXVldWVfZnJlZSk7CitFWFBPUlRfU1lNQk9MKG1zZ3F1ZXVlX21zZ2xlbmd0aCk7CitFWFBPUlRfU1lNQk9MKG1zZ3F1ZXVlX2dldG1zZyk7CitFWFBPUlRfU1lNQk9MKG1zZ3F1ZXVlX2FkZG1zZyk7CitFWFBPUlRfU1lNQk9MKG1zZ3F1ZXVlX2ZsdXNoKTsKKworTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLaW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNDU0kgbWVzc2FnZSBxdWV1ZSBoYW5kbGluZyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9tc2dxdWV1ZS5oIGIvZHJpdmVycy9zY3NpL2FybS9tc2dxdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYzczMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXJtL21zZ3F1ZXVlLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Fjb3JuL3Njc2kvbXNncXVldWUuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTcgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgbWVzc2FnZSBxdWV1ZSBoYW5kbGluZworICovCisjaWZuZGVmIE1TR1FVRVVFX0gKKyNkZWZpbmUgTVNHUVVFVUVfSAorCitzdHJ1Y3QgbWVzc2FnZSB7CisgICAgY2hhciBtc2dbOF07CisgICAgaW50IGxlbmd0aDsKKyAgICBpbnQgZmlmbzsKK307CisKK3N0cnVjdCBtc2dxdWV1ZV9lbnRyeSB7CisgICAgc3RydWN0IG1lc3NhZ2UgbXNnOworICAgIHN0cnVjdCBtc2dxdWV1ZV9lbnRyeSAqbmV4dDsKK307CisKKyNkZWZpbmUgTlJfTUVTU0FHRVMgNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc3RydWN0IG1zZ3F1ZXVlX2VudHJ5ICpxZTsKKyAgICBzdHJ1Y3QgbXNncXVldWVfZW50cnkgKmZyZWU7CisgICAgc3RydWN0IG1zZ3F1ZXVlX2VudHJ5IGVudHJpZXNbTlJfTUVTU0FHRVNdOworfSBNc2dRdWV1ZV90OworCisvKgorICogRnVuY3Rpb246IHZvaWQgbXNncXVldWVfaW5pdGlhbGlzZShNc2dRdWV1ZV90ICptc2dxKQorICogUHVycG9zZSA6IGluaXRpYWxpc2UgYSBtZXNzYWdlIHF1ZXVlCisgKiBQYXJhbXMgIDogbXNncSAtIHF1ZXVlIHRvIGluaXRpYWxpc2UKKyAqLworZXh0ZXJuIHZvaWQgbXNncXVldWVfaW5pdGlhbGlzZShNc2dRdWV1ZV90ICptc2dxKTsKKworLyoKKyAqIEZ1bmN0aW9uOiB2b2lkIG1zZ3F1ZXVlX2ZyZWUoTXNnUXVldWVfdCAqbXNncSkKKyAqIFB1cnBvc2UgOiBmcmVlIGEgcXVldWUKKyAqIFBhcmFtcyAgOiBtc2dxIC0gcXVldWUgdG8gZnJlZQorICovCitleHRlcm4gdm9pZCBtc2dxdWV1ZV9mcmVlKE1zZ1F1ZXVlX3QgKm1zZ3EpOworCisvKgorICogRnVuY3Rpb246IGludCBtc2dxdWV1ZV9tc2dsZW5ndGgoTXNnUXVldWVfdCAqbXNncSkKKyAqIFB1cnBvc2UgOiBjYWxjdWxhdGUgdGhlIHRvdGFsIGxlbmd0aCBvZiBhbGwgbWVzc2FnZXMgb24gdGhlIG1lc3NhZ2UgcXVldWUKKyAqIFBhcmFtcyAgOiBtc2dxIC0gcXVldWUgdG8gZXhhbWluZQorICogUmV0dXJucyA6IG51bWJlciBvZiBieXRlcyBvZiBtZXNzYWdlcyBpbiBxdWV1ZQorICovCitleHRlcm4gaW50IG1zZ3F1ZXVlX21zZ2xlbmd0aChNc2dRdWV1ZV90ICptc2dxKTsKKworLyoKKyAqIEZ1bmN0aW9uOiBzdHJ1Y3QgbWVzc2FnZSAqbXNncXVldWVfZ2V0bXNnKE1zZ1F1ZXVlX3QgKm1zZ3EsIGludCBtc2dubykKKyAqIFB1cnBvc2UgOiByZXR1cm4gYSBtZXNzYWdlICYgaXRzIGxlbmd0aAorICogUGFyYW1zICA6IG1zZ3EgICAtIHF1ZXVlIHRvIG9idGFpbiBtZXNzYWdlIGZyb20KKyAqICAgICAgICAgOiBtc2dubyAgLSBtZXNzYWdlIG51bWJlcgorICogUmV0dXJucyA6IHBvaW50ZXIgdG8gbWVzc2FnZSBzdHJpbmcsIG9yIE5VTEwKKyAqLworZXh0ZXJuIHN0cnVjdCBtZXNzYWdlICptc2dxdWV1ZV9nZXRtc2coTXNnUXVldWVfdCAqbXNncSwgaW50IG1zZ25vKTsKKworLyoKKyAqIEZ1bmN0aW9uOiBpbnQgbXNncXVldWVfYWRkbXNnKE1zZ1F1ZXVlX3QgKm1zZ3EsIGludCBsZW5ndGgsIC4uLikKKyAqIFB1cnBvc2UgOiBhZGQgYSBtZXNzYWdlIG9udG8gYSBtZXNzYWdlIHF1ZXVlCisgKiBQYXJhbXMgIDogbXNncSAgIC0gcXVldWUgdG8gYWRkIG1lc3NhZ2Ugb24KKyAqCSAgICAgbGVuZ3RoIC0gbGVuZ3RoIG9mIG1lc3NhZ2UKKyAqCSAgICAgLi4uICAgIC0gbWVzc2FnZSBieXRlcworICogUmV0dXJucyA6ICE9IDAgaWYgc3VjY2Vzc2Z1bAorICovCitleHRlcm4gaW50IG1zZ3F1ZXVlX2FkZG1zZyhNc2dRdWV1ZV90ICptc2dxLCBpbnQgbGVuZ3RoLCAuLi4pOworCisvKgorICogRnVuY3Rpb246IHZvaWQgbXNncXVldWVfZmx1c2goTXNnUXVldWVfdCAqbXNncSkKKyAqIFB1cnBvc2UgOiBmbHVzaCBhbGwgbWVzc2FnZXMgZnJvbSBtZXNzYWdlIHF1ZXVlCisgKiBQYXJhbXMgIDogbXNncSAtIHF1ZXVlIHRvIGZsdXNoCisgKi8KK2V4dGVybiB2b2lkIG1zZ3F1ZXVlX2ZsdXNoKE1zZ1F1ZXVlX3QgKm1zZ3EpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcm0vb2FrLmMgYi9kcml2ZXJzL3Njc2kvYXJtL29hay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjU1NGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXJtL29hay5jCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogT2FrIEdlbmVyaWMgTkNSNTM4MCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMTk5NS0yMDAyLCBSdXNzZWxsIEtpbmcKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9lY2FyZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIi4uL3Njc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjZGVmaW5lIEFVVE9TRU5TRQorLyojZGVmaW5lIFBTRVVET19ETUEqLworCisjZGVmaW5lIE9BS1NDU0lfUFVCTElDX1JFTEVBU0UgMQorCisjZGVmaW5lIE5DUjUzODBfcmVhZChyZWcpCQlvYWtzY3NpX3JlYWQoX2luc3RhbmNlLCByZWcpCisjZGVmaW5lIE5DUjUzODBfd3JpdGUocmVnLCB2YWx1ZSkJb2Frc2NzaV93cml0ZShfaW5zdGFuY2UsIHJlZywgdmFsdWUpCisjZGVmaW5lIE5DUjUzODBfaW50cgkJCW9ha3Njc2lfaW50cgorI2RlZmluZSBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQJCW9ha3Njc2lfcXVldWVfY29tbWFuZAorI2RlZmluZSBOQ1I1MzgwX3Byb2NfaW5mbwkJb2Frc2NzaV9wcm9jX2luZm8KKworI2RlZmluZSBOQ1I1MzgwX2ltcGxlbWVudGF0aW9uX2ZpZWxkcwlpbnQgcG9ydCwgY3RybAorI2RlZmluZSBOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKQkJc3RydWN0IFNjc2lfSG9zdCAqX2luc3RhbmNlCisjZGVmaW5lIE5DUjUzODBfc2V0dXAoaW5zdGFuY2UpCQlfaW5zdGFuY2UgPSBpbnN0YW5jZQorCisjZGVmaW5lIEJPQVJEX05PUk1BTAkwCisjZGVmaW5lIEJPQVJEX05DUjUzQzQwMAkxCisKKyNpbmNsdWRlICIuLi9OQ1I1MzgwLmgiCisKKyN1bmRlZiBTVEFSVF9ETUFfSU5JVElBVE9SX1JFQ0VJVkVfUkVHCisjZGVmaW5lIFNUQVJUX0RNQV9JTklUSUFUT1JfUkVDRUlWRV9SRUcgKDcgKyAxMjgpCisKK2NvbnN0IGNoYXIgKiBvYWtzY3NpX2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKnNwbnQpCit7CisJcmV0dXJuICIiOworfQorCisjZGVmaW5lIFNUQVQocCkgICBpbncocCArIDE0NCkKK2V4dGVybiB2b2lkIGluc3diKGludCBmcm9tLCB2b2lkICp0bywgaW50IGxlbik7CisKK3N0YXRpYyBpbmxpbmUgaW50IE5DUjUzODBfcHdyaXRlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCB1bnNpZ25lZCBjaGFyICphZGRyLAorICAgICAgICAgICAgICBpbnQgbGVuKQoreworICBpbnQgaW9iYXNlID0gaW5zdGFuY2UtPmlvX3BvcnQ7CitwcmludGsoIndyaXRpbmcgJXAgbGVuICVkXG4iLGFkZHIsIGxlbik7CisgIGlmKCFsZW4pIHJldHVybiAtMTsKKworICB3aGlsZSgxKQorICB7CisgICAgaW50IHN0YXR1czsKKyAgICB3aGlsZSgoKHN0YXR1cyA9IFNUQVQoaW9iYXNlKSkgJiAweDEwMCk9PTApOworICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IE5DUjUzODBfcHJlYWQoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIHVuc2lnbmVkIGNoYXIgKmFkZHIsCisgICAgICAgICAgICAgIGludCBsZW4pCit7CisgIGludCBpb2Jhc2UgPSBpbnN0YW5jZS0+aW9fcG9ydDsKK3ByaW50aygicmVhZGluZyAlcCBsZW4gJWRcbiIsIGFkZHIsIGxlbik7CisgIHdoaWxlKGxlbiA+IDApCisgIHsKKyAgICBpbnQgc3RhdHVzLCB0aW1lb3V0OworICAgIHVuc2lnbmVkIGxvbmcgYjsKKyAgICAKKyAgICB0aW1lb3V0ID0gMHgwMUZGRkZGRjsKKyAgICAKKyAgICB3aGlsZSgoKHN0YXR1cyA9IFNUQVQoaW9iYXNlKSkgJiAweDEwMCk9PTApCisgICAgeworICAgICAgdGltZW91dC0tOworICAgICAgaWYoc3RhdHVzICYgMHgyMDAgfHwgIXRpbWVvdXQpCisgICAgICB7CisgICAgICAgIHByaW50aygic3RhdHVzID0gJTA4WFxuIixzdGF0dXMpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYobGVuID49IDEyOCkKKyAgICB7CisgICAgICBpbnN3Yihpb2Jhc2UgKyAxMzYsIGFkZHIsIDEyOCk7CisgICAgICBhZGRyICs9IDEyODsKKyAgICAgIGxlbiAtPSAxMjg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBiID0gKHVuc2lnbmVkIGxvbmcpIGludyhpb2Jhc2UgKyAxMzYpOworICAgICAgKmFkZHIgKysgPSBiOworICAgICAgbGVuIC09IDE7CisgICAgICBpZihsZW4pCisgICAgICAgICphZGRyICsrID0gYj4+ODsKKyAgICAgIGxlbiAtPSAxOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworI2RlZmluZSBvYWtzY3NpX3JlYWQoaW5zdGFuY2UscmVnKQkoaW5iKChpbnN0YW5jZSktPmlvX3BvcnQgKyAocmVnKSkpCisjZGVmaW5lIG9ha3Njc2lfd3JpdGUoaW5zdGFuY2UscmVnLHZhbCkJKG91dGIoKHZhbCksIChpbnN0YW5jZSktPmlvX3BvcnQgKyAocmVnKSkpCisKKyN1bmRlZiBTVEFUCisKKyNpbmNsdWRlICIuLi9OQ1I1MzgwLmMiCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgb2Frc2NzaV90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkucHJvY19pbmZvCQk9IG9ha3Njc2lfcHJvY19pbmZvLAorCS5uYW1lCQkJPSAiT2FrIDE2LWJpdCBTQ1NJIiwKKwkuaW5mbwkJCT0gb2Frc2NzaV9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gb2Frc2NzaV9xdWV1ZV9jb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gTkNSNTM4MF9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXI9IE5DUjUzODBfZGV2aWNlX3Jlc2V0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IE5DUjUzODBfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSBOQ1I1MzgwX2hvc3RfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSAxNiwKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAyLAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcsCisJLnByb2NfbmFtZQkJPSAib2Frc2NzaSIsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorb2Frc2NzaV9wcm9iZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjLCBjb25zdCBzdHJ1Y3QgZWNhcmRfaWQgKmlkKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZvYWtzY3NpX3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEpKTsKKwlpZiAoIWhvc3QpCisJCWdvdG8gb3V0OworCisJaG9zdC0+aW9fcG9ydCA9IGVjYXJkX2FkZHJlc3MoZWMsIEVDQVJEX01FTUMsIDApOworCWhvc3QtPmlycSA9IElSUV9OT05FOworCWhvc3QtPm5faW9fcG9ydCA9IDI1NTsKKworCXJldCA9IC1FQlVTWTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uIChob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQsICJPYWsgU0NTSSIpKQorCQlnb3RvIHVucmVnOworCisJTkNSNTM4MF9pbml0KGhvc3QsIDApOworCisJcHJpbnRrKCJzY3NpJWQ6IGF0IHBvcnQgMHglMDhseCBpcnFzIGRpc2FibGVkIiwKKwkJaG9zdC0+aG9zdF9ubywgaG9zdC0+aW9fcG9ydCk7CisJcHJpbnRrKCIgb3B0aW9ucyBDQU5fUVVFVUU9JWQgIENNRF9QRVJfTFVOPSVkIHJlbGVhc2U9JWQiLAorCQlob3N0LT5jYW5fcXVldWUsIGhvc3QtPmNtZF9wZXJfbHVuLCBPQUtTQ1NJX1BVQkxJQ19SRUxFQVNFKTsKKwlwcmludGsoIlxuc2NzaSVkOiIsIGhvc3QtPmhvc3Rfbm8pOworCU5DUjUzODBfcHJpbnRfb3B0aW9ucyhob3N0KTsKKwlwcmludGsoIlxuIik7CisKKwlyZXQgPSBzY3NpX2FkZF9ob3N0KGhvc3QsICZlYy0+ZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9yZWxlYXNlOworCisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisJZ290byBvdXQ7CisKKyBvdXRfcmVsZWFzZToKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQpOworIHVucmVnOgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7Cisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBvYWtzY3NpX3JlbW92ZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CisKKwllY2FyZF9zZXRfZHJ2ZGF0YShlYywgTlVMTCk7CisJc2NzaV9yZW1vdmVfaG9zdChob3N0KTsKKworCU5DUjUzODBfZXhpdChob3N0KTsKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQpOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWNhcmRfaWQgb2Frc2NzaV9jaWRzW10gPSB7CisJeyBNQU5VX09BSywgUFJPRF9PQUtfU0NTSSB9LAorCXsgMHhmZmZmLCAweGZmZmYgfQorfTsKKworc3RhdGljIHN0cnVjdCBlY2FyZF9kcml2ZXIgb2Frc2NzaV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG9ha3Njc2lfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChvYWtzY3NpX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gb2Frc2NzaV9jaWRzLAorCS5kcnYgPSB7CisJCS5uYW1lCQk9ICJvYWtzY3NpIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgb2Frc2NzaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGVjYXJkX3JlZ2lzdGVyX2RyaXZlcigmb2Frc2NzaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb2Frc2NzaV9leGl0KHZvaWQpCit7CisJZWNhcmRfcmVtb3ZlX2RyaXZlcigmb2Frc2NzaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChvYWtzY3NpX2luaXQpOworbW9kdWxlX2V4aXQob2Frc2NzaV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLaW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk9hayBTQ1NJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL3Bvd2VydGVjLmMgYi9kcml2ZXJzL3Njc2kvYXJtL3Bvd2VydGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmMjNiZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vcG93ZXJ0ZWMuYwpAQCAtMCwwICsxLDQ3MiBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Fjb3JuL3Njc2kvcG93ZXJ0ZWMuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNSBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vZWNhcmQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworI2luY2x1ZGUgIi4uL3Njc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgImZhczIxNi5oIgorI2luY2x1ZGUgInNjc2kuaCIKKworI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgorCisjZGVmaW5lIFBPV0VSVEVDX0ZBUzIxNl9PRkZTRVQJMHgzMDAwCisjZGVmaW5lIFBPV0VSVEVDX0ZBUzIxNl9TSElGVAk2CisKKyNkZWZpbmUgUE9XRVJURUNfSU5UUl9TVEFUVVMJMHgyMDAwCisjZGVmaW5lIFBPV0VSVEVDX0lOVFJfQklUCTB4ODAKKworI2RlZmluZSBQT1dFUlRFQ19SRVNFVF9DT05UUk9MCTB4MTAxOAorI2RlZmluZSBQT1dFUlRFQ19SRVNFVF9CSVQJMQorCisjZGVmaW5lIFBPV0VSVEVDX1RFUk1fQ09OVFJPTAkweDIwMTgKKyNkZWZpbmUgUE9XRVJURUNfVEVSTV9FTkFCTEUJMQorCisjZGVmaW5lIFBPV0VSVEVDX0lOVFJfQ09OVFJPTAkweDEwMWMKKyNkZWZpbmUgUE9XRVJURUNfSU5UUl9FTkFCTEUJMQorI2RlZmluZSBQT1dFUlRFQ19JTlRSX0RJU0FCTEUJMAorCisjZGVmaW5lIFZFUlNJT04JIjEuMTAgKDE5LzAxLzIwMDMgMi41LjU5KSIKKworLyoKKyAqIFVzZSB0ZXJtPTAsMSwwLDAsMCB0byB0dXJuIHRlcm1pbmF0b3JzIG9uL29mZi4KKyAqIE9uZSBlbnRyeSBwZXIgc2xvdC4KKyAqLworc3RhdGljIGludCB0ZXJtW01BWF9FQ0FSRFNdID0geyAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIH07CisKKyNkZWZpbmUgTlJfU0cJMjU2CisKK3N0cnVjdCBwb3dlcnRlY19pbmZvIHsKKwlGQVMyMTZfSW5mbwkJaW5mbzsKKwlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQJKmVjOworCXZvaWQgX19pb21lbQkJKmJhc2U7CisJdW5zaWduZWQgaW50CQl0ZXJtX2N0bDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJc2dbTlJfU0ddOworfTsKKworLyogUHJvdG90eXBlOiB2b2lkIHBvd2VydGVjc2NzaV9pcnFlbmFibGUoZWMsIGlycW5yKQorICogUHVycG9zZSAgOiBFbmFibGUgaW50ZXJydXB0cyBvbiBQb3dlcnRlYyBTQ1NJIGNhcmQKKyAqIFBhcmFtcyAgIDogZWMgICAgLSBleHBhbnNpb24gY2FyZCBzdHJ1Y3R1cmUKKyAqICAgICAgICAgIDogaXJxbnIgLSBpbnRlcnJ1cHQgbnVtYmVyCisgKi8KK3N0YXRpYyB2b2lkCitwb3dlcnRlY3Njc2lfaXJxZW5hYmxlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGludCBpcnFucikKK3sKKwlzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqaW5mbyA9IGVjLT5pcnFfZGF0YTsKKwl3cml0ZWIoUE9XRVJURUNfSU5UUl9FTkFCTEUsIGluZm8tPmJhc2UgKyBQT1dFUlRFQ19JTlRSX0NPTlRST0wpOworfQorCisvKiBQcm90b3R5cGU6IHZvaWQgcG93ZXJ0ZWNzY3NpX2lycWRpc2FibGUoZWMsIGlycW5yKQorICogUHVycG9zZSAgOiBEaXNhYmxlIGludGVycnVwdHMgb24gUG93ZXJ0ZWMgU0NTSSBjYXJkCisgKiBQYXJhbXMgICA6IGVjICAgIC0gZXhwYW5zaW9uIGNhcmQgc3RydWN0dXJlCisgKiAgICAgICAgICA6IGlycW5yIC0gaW50ZXJydXB0IG51bWJlcgorICovCitzdGF0aWMgdm9pZAorcG93ZXJ0ZWNzY3NpX2lycWRpc2FibGUoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYywgaW50IGlycW5yKQoreworCXN0cnVjdCBwb3dlcnRlY19pbmZvICppbmZvID0gZWMtPmlycV9kYXRhOworCXdyaXRlYihQT1dFUlRFQ19JTlRSX0RJU0FCTEUsIGluZm8tPmJhc2UgKyBQT1dFUlRFQ19JTlRSX0NPTlRST0wpOworfQorCitzdGF0aWMgY29uc3QgZXhwYW5zaW9uY2FyZF9vcHNfdCBwb3dlcnRlY3Njc2lfb3BzID0geworCS5pcnFlbmFibGUJPSBwb3dlcnRlY3Njc2lfaXJxZW5hYmxlLAorCS5pcnFkaXNhYmxlCT0gcG93ZXJ0ZWNzY3NpX2lycWRpc2FibGUsCit9OworCisvKiBQcm90b3R5cGU6IHZvaWQgcG93ZXJ0ZWNzY3NpX3Rlcm1pbmF0b3JfY3RsKGhvc3QsIG9uX29mZikKKyAqIFB1cnBvc2UgIDogVHVybiB0aGUgUG93ZXJ0ZWMgU0NTSSB0ZXJtaW5hdG9ycyBvbiBvciBvZmYKKyAqIFBhcmFtcyAgIDogaG9zdCAgIC0gY2FyZCB0byB0dXJuIG9uL29mZgorICogICAgICAgICAgOiBvbl9vZmYgLSAhMCB0byB0dXJuIG9uLCAwIHRvIHR1cm4gb2ZmCisgKi8KK3N0YXRpYyB2b2lkCitwb3dlcnRlY3Njc2lfdGVybWluYXRvcl9jdGwoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgaW50IG9uX29mZikKK3sKKwlzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCisJaW5mby0+dGVybV9jdGwgPSBvbl9vZmYgPyBQT1dFUlRFQ19URVJNX0VOQUJMRSA6IDA7CisJd3JpdGViKGluZm8tPnRlcm1fY3RsLCBpbmZvLT5iYXNlICsgUE9XRVJURUNfVEVSTV9DT05UUk9MKTsKK30KKworLyogUHJvdG90eXBlOiB2b2lkIHBvd2VydGVjc2NzaV9pbnRyKGlycSwgKmRldl9pZCwgKnJlZ3MpCisgKiBQdXJwb3NlICA6IGhhbmRsZSBpbnRlcnJ1cHRzIGZyb20gUG93ZXJ0ZWMgU0NTSSBjYXJkCisgKiBQYXJhbXMgICA6IGlycSAgICAtIGludGVycnVwdCBudW1iZXIKKyAqCSAgICAgIGRldl9pZCAtIHVzZXItZGVmaW5lZCAoU2NzaV9Ib3N0IHN0cnVjdHVyZSkKKyAqCSAgICAgIHJlZ3MgICAtIHByb2Nlc3NvciByZWdpc3RlcnMgYXQgaW50ZXJydXB0CisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorcG93ZXJ0ZWNzY3NpX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqaW5mbyA9IGRldl9pZDsKKworCXJldHVybiBmYXMyMTZfaW50cigmaW5mby0+aW5mbyk7Cit9CisKKy8qIFByb3RvdHlwZTogZmFzZG1hdHlwZV90IHBvd2VydGVjc2NzaV9kbWFfc2V0dXAoaG9zdCwgU0NwbnQsIGRpcmVjdGlvbiwgbWluX3R5cGUpCisgKiBQdXJwb3NlICA6IGluaXRpYWxpc2VzIERNQS9QSU8KKyAqIFBhcmFtcyAgIDogaG9zdCAgICAgIC0gaG9zdAorICoJICAgICAgU0NwbnQgICAgIC0gY29tbWFuZAorICoJICAgICAgZGlyZWN0aW9uIC0gRE1BIG9uIHRvL29mZiBvZiBjYXJkCisgKgkgICAgICBtaW5fdHlwZSAgLSBtaW5pbXVtIERNQSBzdXBwb3J0IHRoYXQgd2UgbXVzdCBoYXZlIGZvciB0aGlzIHRyYW5zZmVyCisgKiBSZXR1cm5zICA6IHR5cGUgb2YgdHJhbnNmZXIgdG8gYmUgcGVyZm9ybWVkCisgKi8KK3N0YXRpYyBmYXNkbWF0eXBlX3QKK3Bvd2VydGVjc2NzaV9kbWFfc2V0dXAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgU2NzaV9Qb2ludGVyICpTQ3AsCisJCSAgICAgICBmYXNkbWFkaXJfdCBkaXJlY3Rpb24sIGZhc2RtYXR5cGVfdCBtaW5fdHlwZSkKK3sKKwlzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHNjc2lfZ2V0X2RldmljZShob3N0KTsKKwlpbnQgZG1hY2ggPSBpbmZvLT5pbmZvLnNjc2kuZG1hOworCisJaWYgKGluZm8tPmluZm8uaWZjZmcuY2FwYWJpbGl0aWVzICYgRkFTQ0FQX0RNQSAmJgorCSAgICBtaW5fdHlwZSA9PSBmYXNkbWFfcmVhbF9hbGwpIHsKKwkJaW50IGJ1ZnMsIG1hcF9kaXIsIGRtYV9kaXI7CisKKwkJYnVmcyA9IGNvcHlfU0NwX3RvX3NnKCZpbmZvLT5zZ1swXSwgU0NwLCBOUl9TRyk7CisKKwkJaWYgKGRpcmVjdGlvbiA9PSBETUFfT1VUKQorCQkJbWFwX2RpciA9IERNQV9UT19ERVZJQ0UsCisJCQlkbWFfZGlyID0gRE1BX01PREVfV1JJVEU7CisJCWVsc2UKKwkJCW1hcF9kaXIgPSBETUFfRlJPTV9ERVZJQ0UsCisJCQlkbWFfZGlyID0gRE1BX01PREVfUkVBRDsKKworCQlkbWFfbWFwX3NnKGRldiwgaW5mby0+c2csIGJ1ZnMgKyAxLCBtYXBfZGlyKTsKKworCQlkaXNhYmxlX2RtYShkbWFjaCk7CisJCXNldF9kbWFfc2coZG1hY2gsIGluZm8tPnNnLCBidWZzICsgMSk7CisJCXNldF9kbWFfbW9kZShkbWFjaCwgZG1hX2Rpcik7CisJCWVuYWJsZV9kbWEoZG1hY2gpOworCQlyZXR1cm4gZmFzZG1hX3JlYWxfYWxsOworCX0KKworCS8qCisJICogSWYgd2UncmUgbm90IGRvaW5nIERNQSwKKwkgKiAgd2UnbGwgZG8gc2xvdyBQSU8KKwkgKi8KKwlyZXR1cm4gZmFzZG1hX3BpbzsKK30KKworLyogUHJvdG90eXBlOiBpbnQgcG93ZXJ0ZWNzY3NpX2RtYV9zdG9wKGhvc3QsIFNDcG50KQorICogUHVycG9zZSAgOiBzdG9wcyBETUEvUElPCisgKiBQYXJhbXMgICA6IGhvc3QgIC0gaG9zdAorICoJICAgICAgU0NwbnQgLSBjb21tYW5kCisgKi8KK3N0YXRpYyB2b2lkCitwb3dlcnRlY3Njc2lfZG1hX3N0b3Aoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgU2NzaV9Qb2ludGVyICpTQ3ApCit7CisJc3RydWN0IHBvd2VydGVjX2luZm8gKmluZm8gPSAoc3RydWN0IHBvd2VydGVjX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKwlpZiAoaW5mby0+aW5mby5zY3NpLmRtYSAhPSBOT19ETUEpCisJCWRpc2FibGVfZG1hKGluZm8tPmluZm8uc2NzaS5kbWEpOworfQorCisvKiBQcm90b3R5cGU6IGNvbnN0IGNoYXIgKnBvd2VydGVjc2NzaV9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKiBob3N0KQorICogUHVycG9zZSAgOiByZXR1cm5zIGEgZGVzY3JpcHRpdmUgc3RyaW5nIGFib3V0IHRoaXMgaW50ZXJmYWNlLAorICogUGFyYW1zICAgOiBob3N0IC0gZHJpdmVyIGhvc3Qgc3RydWN0dXJlIHRvIHJldHVybiBpbmZvIGZvci4KKyAqIFJldHVybnMgIDogcG9pbnRlciB0byBhIHN0YXRpYyBidWZmZXIgY29udGFpbmluZyBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nLgorICovCitjb25zdCBjaGFyICpwb3dlcnRlY3Njc2lfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0cnVjdCBwb3dlcnRlY19pbmZvICppbmZvID0gKHN0cnVjdCBwb3dlcnRlY19pbmZvICopaG9zdC0+aG9zdGRhdGE7CisJc3RhdGljIGNoYXIgc3RyaW5nWzE1MF07CisKKwlzcHJpbnRmKHN0cmluZywgIiVzICglcykgaW4gc2xvdCAlZCB2JXMgdGVybWluYXRvcnMgbyVzIiwKKwkJaG9zdC0+aG9zdHQtPm5hbWUsIGluZm8tPmluZm8uc2NzaS50eXBlLCBpbmZvLT5lYy0+c2xvdF9ubywKKwkJVkVSU0lPTiwgaW5mby0+dGVybV9jdGwgPyAibiIgOiAiZmYiKTsKKworCXJldHVybiBzdHJpbmc7Cit9CisKKy8qIFByb3RvdHlwZTogaW50IHBvd2VydGVjc2NzaV9zZXRfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkKKyAqIFB1cnBvc2UgIDogU2V0IGEgZHJpdmVyIHNwZWNpZmljIGZ1bmN0aW9uCisgKiBQYXJhbXMgICA6IGhvc3QgICAtIGhvc3QgdG8gc2V0dXAKKyAqICAgICAgICAgIDogYnVmZmVyIC0gYnVmZmVyIGNvbnRhaW5pbmcgc3RyaW5nIGRlc2NyaWJpbmcgb3BlcmF0aW9uCisgKiAgICAgICAgICA6IGxlbmd0aCAtIGxlbmd0aCBvZiBzdHJpbmcKKyAqIFJldHVybnMgIDogLUVJTlZBTCwgb3IgMAorICovCitzdGF0aWMgaW50Citwb3dlcnRlY3Njc2lfc2V0X3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCit7CisJaW50IHJldCA9IGxlbmd0aDsKKworCWlmIChsZW5ndGggPj0gMTIgJiYgc3RybmNtcChidWZmZXIsICJQT1dFUlRFQ1NDU0kiLCAxMikgPT0gMCkgeworCQlidWZmZXIgKz0gMTI7CisJCWxlbmd0aCAtPSAxMjsKKworCQlpZiAobGVuZ3RoID49IDUgJiYgc3RybmNtcChidWZmZXIsICJ0ZXJtPSIsIDUpID09IDApIHsKKwkJCWlmIChidWZmZXJbNV0gPT0gJzEnKQorCQkJCXBvd2VydGVjc2NzaV90ZXJtaW5hdG9yX2N0bChob3N0LCAxKTsKKwkJCWVsc2UgaWYgKGJ1ZmZlcls1XSA9PSAnMCcpCisJCQkJcG93ZXJ0ZWNzY3NpX3Rlcm1pbmF0b3JfY3RsKGhvc3QsIDApOworCQkJZWxzZQorCQkJCXJldCA9IC1FSU5WQUw7CisJCX0gZWxzZQorCQkJcmV0ID0gLUVJTlZBTDsKKwl9IGVsc2UKKwkJcmV0ID0gLUVJTlZBTDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFByb3RvdHlwZTogaW50IHBvd2VydGVjc2NzaV9wcm9jX2luZm8oY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKyAqCQkJCQlpbnQgbGVuZ3RoLCBpbnQgaG9zdF9ubywgaW50IGlub3V0KQorICogUHVycG9zZSAgOiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRyaXZlciB0byBhIHVzZXIgcHJvY2VzcyBhY2Nlc3NpbmcKKyAqCSAgICAgIHRoZSAvcHJvYyBmaWxlc3lzdGVtLgorICogUGFyYW1zICAgOiBidWZmZXIgIC0gYSBidWZmZXIgdG8gd3JpdGUgaW5mb3JtYXRpb24gdG8KKyAqCSAgICAgIHN0YXJ0ICAgLSBhIHBvaW50ZXIgaW50byB0aGlzIGJ1ZmZlciBzZXQgYnkgdGhpcyByb3V0aW5lIHRvIHRoZSBzdGFydAorICoJCSAgICAgICAgb2YgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uLgorICoJICAgICAgb2Zmc2V0ICAtIG9mZnNldCBpbnRvIGluZm9ybWF0aW9uIHRoYXQgd2UgaGF2ZSByZWFkIHVwdG8uCisgKgkgICAgICBsZW5ndGggIC0gbGVuZ3RoIG9mIGJ1ZmZlcgorICoJICAgICAgaW5vdXQgICAtIDAgZm9yIHJlYWRpbmcsIDEgZm9yIHdyaXRpbmcuCisgKiBSZXR1cm5zICA6IGxlbmd0aCBvZiBkYXRhIHdyaXR0ZW4gdG8gYnVmZmVyLgorICovCitpbnQgcG93ZXJ0ZWNzY3NpX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJICAgIGludCBsZW5ndGgsIGludCBpbm91dCkKK3sKKwlzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqaW5mbzsKKwljaGFyICpwID0gYnVmZmVyOworCWludCBwb3M7CisKKwlpZiAoaW5vdXQgPT0gMSkKKwkJcmV0dXJuIHBvd2VydGVjc2NzaV9zZXRfcHJvY19pbmZvKGhvc3QsIGJ1ZmZlciwgbGVuZ3RoKTsKKworCWluZm8gPSAoc3RydWN0IHBvd2VydGVjX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKworCXAgKz0gc3ByaW50ZihwLCAiUG93ZXJUZWMgU0NTSSBkcml2ZXIgdiVzXG4iLCBWRVJTSU9OKTsKKwlwICs9IGZhczIxNl9wcmludF9ob3N0KCZpbmZvLT5pbmZvLCBwKTsKKwlwICs9IHNwcmludGYocCwgIlRlcm0gICAgOiBvJXNcbiIsCisJCQlpbmZvLT50ZXJtX2N0bCA/ICJuIiA6ICJmZiIpOworCisJcCArPSBmYXMyMTZfcHJpbnRfc3RhdHMoJmluZm8tPmluZm8sIHApOworCXAgKz0gZmFzMjE2X3ByaW50X2RldmljZXMoJmluZm8tPmluZm8sIHApOworCisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCXBvcyA9IHAgLSBidWZmZXIgLSBvZmZzZXQ7CisJaWYgKHBvcyA+IGxlbmd0aCkKKwkJcG9zID0gbGVuZ3RoOworCisJcmV0dXJuIHBvczsKK30KKworc3RhdGljIHNzaXplX3QgcG93ZXJ0ZWNzY3NpX3Nob3dfdGVybShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjID0gRUNBUkRfREVWKGRldik7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGVjYXJkX2dldF9kcnZkYXRhKGVjKTsKKwlzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGluZm8tPnRlcm1fY3RsID8gMSA6IDApOworfQorCitzdGF0aWMgc3NpemVfdAorcG93ZXJ0ZWNzY3NpX3N0b3JlX3Rlcm0oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYyA9IEVDQVJEX0RFVihkZXYpOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CisKKwlpZiAobGVuID4gMSkKKwkJcG93ZXJ0ZWNzY3NpX3Rlcm1pbmF0b3JfY3RsKGhvc3QsIGJ1ZlswXSAhPSAnMCcpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGJ1c190ZXJtLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgcG93ZXJ0ZWNzY3NpX3Nob3dfdGVybSwgcG93ZXJ0ZWNzY3NpX3N0b3JlX3Rlcm0pOworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIHBvd2VydGVjc2NzaV90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJCT0gVEhJU19NT0RVTEUsCisJLnByb2NfaW5mbwkJCT0gcG93ZXJ0ZWNzY3NpX3Byb2NfaW5mbywKKwkubmFtZQkJCQk9ICJQb3dlclRlYyBTQ1NJIiwKKwkuaW5mbwkJCQk9IHBvd2VydGVjc2NzaV9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCQk9IGZhczIxNl9xdWV1ZV9jb21tYW5kLAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJCT0gZmFzMjE2X2VoX2hvc3RfcmVzZXQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCQk9IGZhczIxNl9laF9idXNfcmVzZXQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyCT0gZmFzMjE2X2VoX2RldmljZV9yZXNldCwKKwkuZWhfYWJvcnRfaGFuZGxlcgkJPSBmYXMyMTZfZWhfYWJvcnQsCisKKwkuY2FuX3F1ZXVlCQkJPSA4LAorCS50aGlzX2lkCQkJPSA3LAorCS5zZ190YWJsZXNpemUJCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCQk9IDIsCisJLnVzZV9jbHVzdGVyaW5nCQkJPSBFTkFCTEVfQ0xVU1RFUklORywKKwkucHJvY19uYW1lCQkJPSAicG93ZXJ0ZWMiLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQKK3Bvd2VydGVjc2NzaV9wcm9iZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjLCBjb25zdCBzdHJ1Y3QgZWNhcmRfaWQgKmlkKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IHBvd2VydGVjX2luZm8gKmluZm87CisJdW5zaWduZWQgbG9uZyByZXNiYXNlLCByZXNsZW47CisJdm9pZCBfX2lvbWVtICpiYXNlOworCWludCByZXQ7CisKKwlyZXQgPSBlY2FyZF9yZXF1ZXN0X3Jlc291cmNlcyhlYyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXNiYXNlID0gZWNhcmRfcmVzb3VyY2Vfc3RhcnQoZWMsIEVDQVJEX1JFU19JT0NGQVNUKTsKKwlyZXNsZW4gPSBlY2FyZF9yZXNvdXJjZV9sZW4oZWMsIEVDQVJEX1JFU19JT0NGQVNUKTsKKwliYXNlID0gaW9yZW1hcChyZXNiYXNlLCByZXNsZW4pOworCWlmICghYmFzZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9yZWdpb247CisJfQorCisJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmcG93ZXJ0ZWNzY3NpX3RlbXBsYXRlLAorCQkJICAgICAgIHNpemVvZiAoc3RydWN0IHBvd2VydGVjX2luZm8pKTsKKwlpZiAoIWhvc3QpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5tYXA7CisJfQorCisJZWNhcmRfc2V0X2RydmRhdGEoZWMsIGhvc3QpOworCisJaW5mbyA9IChzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCWluZm8tPmJhc2UgPSBiYXNlOworCXBvd2VydGVjc2NzaV90ZXJtaW5hdG9yX2N0bChob3N0LCB0ZXJtW2VjLT5zbG90X25vXSk7CisKKwlpbmZvLT5pbmZvLnNjc2kuaW9fYmFzZQkJPSBiYXNlICsgUE9XRVJURUNfRkFTMjE2X09GRlNFVDsKKwlpbmZvLT5pbmZvLnNjc2kuaW9fc2hpZnQJPSBQT1dFUlRFQ19GQVMyMTZfU0hJRlQ7CisJaW5mby0+aW5mby5zY3NpLmlycQkJPSBlYy0+aXJxOworCWluZm8tPmluZm8uc2NzaS5kbWEJCT0gZWMtPmRtYTsKKwlpbmZvLT5pbmZvLmlmY2ZnLmNsb2NrcmF0ZQk9IDQwOyAvKiBNSHogKi8KKwlpbmZvLT5pbmZvLmlmY2ZnLnNlbGVjdF90aW1lb3V0CT0gMjU1OworCWluZm8tPmluZm8uaWZjZmcuYXN5bmNwZXJpb2QJPSAyMDA7IC8qIG5zICovCisJaW5mby0+aW5mby5pZmNmZy5zeW5jX21heF9kZXB0aAk9IDc7CisJaW5mby0+aW5mby5pZmNmZy5jbnRsMwkJPSBDTlRMM19CUzggfCBDTlRMM19GQVNUU0NTSSB8IENOVEwzX0ZBU1RDTEs7CisJaW5mby0+aW5mby5pZmNmZy5kaXNjb25uZWN0X29rCT0gMTsKKwlpbmZvLT5pbmZvLmlmY2ZnLndpZGVfbWF4X3NpemUJPSAwOworCWluZm8tPmluZm8uaWZjZmcuY2FwYWJpbGl0aWVzCT0gMDsKKwlpbmZvLT5pbmZvLmRtYS5zZXR1cAkJPSBwb3dlcnRlY3Njc2lfZG1hX3NldHVwOworCWluZm8tPmluZm8uZG1hLnBzZXVkbwkJPSBOVUxMOworCWluZm8tPmluZm8uZG1hLnN0b3AJCT0gcG93ZXJ0ZWNzY3NpX2RtYV9zdG9wOworCisJZWMtPmlycWFkZHIJPSBiYXNlICsgUE9XRVJURUNfSU5UUl9TVEFUVVM7CisJZWMtPmlycW1hc2sJPSBQT1dFUlRFQ19JTlRSX0JJVDsKKwllYy0+aXJxX2RhdGEJPSBpbmZvOworCWVjLT5vcHMJCT0gJnBvd2VydGVjc2NzaV9vcHM7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmVjLT5kZXYsICZkZXZfYXR0cl9idXNfdGVybSk7CisKKwlyZXQgPSBmYXMyMTZfaW5pdChob3N0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mcmVlOworCisJcmV0ID0gcmVxdWVzdF9pcnEoZWMtPmlycSwgcG93ZXJ0ZWNzY3NpX2ludHIsCisJCQkgIFNBX0lOVEVSUlVQVCwgInBvd2VydGVjIiwgaW5mbyk7CisJaWYgKHJldCkgeworCQlwcmludGsoInNjc2klZDogSVJRJWQgbm90IGZyZWU6ICVkXG4iLAorCQkgICAgICAgaG9zdC0+aG9zdF9ubywgZWMtPmlycSwgcmV0KTsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisKKwlpZiAoaW5mby0+aW5mby5zY3NpLmRtYSAhPSBOT19ETUEpIHsKKwkJaWYgKHJlcXVlc3RfZG1hKGluZm8tPmluZm8uc2NzaS5kbWEsICJwb3dlcnRlYyIpKSB7CisJCQlwcmludGsoInNjc2klZDogRE1BJWQgbm90IGZyZWUsIHVzaW5nIFBJT1xuIiwKKwkJCSAgICAgICBob3N0LT5ob3N0X25vLCBpbmZvLT5pbmZvLnNjc2kuZG1hKTsKKwkJCWluZm8tPmluZm8uc2NzaS5kbWEgPSBOT19ETUE7CisJCX0gZWxzZSB7CisJCQlzZXRfZG1hX3NwZWVkKGluZm8tPmluZm8uc2NzaS5kbWEsIDE4MCk7CisJCQlpbmZvLT5pbmZvLmlmY2ZnLmNhcGFiaWxpdGllcyB8PSBGQVNDQVBfRE1BOworCQl9CisJfQorCisJcmV0ID0gZmFzMjE2X2FkZChob3N0LCAmZWMtPmRldik7CisJaWYgKHJldCA9PSAwKQorCQlnb3RvIG91dDsKKworCWlmIChpbmZvLT5pbmZvLnNjc2kuZG1hICE9IE5PX0RNQSkKKwkJZnJlZV9kbWEoaW5mby0+aW5mby5zY3NpLmRtYSk7CisJZnJlZV9pcnEoZWMtPmlycSwgaG9zdCk7CisKKyBvdXRfcmVsZWFzZToKKwlmYXMyMTZfcmVsZWFzZShob3N0KTsKKworIG91dF9mcmVlOgorCWRldmljZV9yZW1vdmVfZmlsZSgmZWMtPmRldiwgJmRldl9hdHRyX2J1c190ZXJtKTsKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworCisgb3V0X3VubWFwOgorCWlvdW5tYXAoYmFzZSk7CisKKyBvdXRfcmVnaW9uOgorCWVjYXJkX3JlbGVhc2VfcmVzb3VyY2VzKGVjKTsKKworIG91dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcG93ZXJ0ZWNzY3NpX3JlbW92ZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CisJc3RydWN0IHBvd2VydGVjX2luZm8gKmluZm8gPSAoc3RydWN0IHBvd2VydGVjX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKworCWVjYXJkX3NldF9kcnZkYXRhKGVjLCBOVUxMKTsKKwlmYXMyMTZfcmVtb3ZlKGhvc3QpOworCisJZGV2aWNlX3JlbW92ZV9maWxlKCZlYy0+ZGV2LCAmZGV2X2F0dHJfYnVzX3Rlcm0pOworCisJaWYgKGluZm8tPmluZm8uc2NzaS5kbWEgIT0gTk9fRE1BKQorCQlmcmVlX2RtYShpbmZvLT5pbmZvLnNjc2kuZG1hKTsKKwlmcmVlX2lycShlYy0+aXJxLCBpbmZvKTsKKworCWlvdW5tYXAoaW5mby0+YmFzZSk7CisKKwlmYXMyMTZfcmVsZWFzZShob3N0KTsKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworCWVjYXJkX3JlbGVhc2VfcmVzb3VyY2VzKGVjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCBwb3dlcnRlY3Njc2lfY2lkc1tdID0geworCXsgTUFOVV9BTFNZU1RFTVMsIFBST0RfQUxTWVNfU0NTSUFUQVBJIH0sCisJeyAweGZmZmYsIDB4ZmZmZiB9LAorfTsKKworc3RhdGljIHN0cnVjdCBlY2FyZF9kcml2ZXIgcG93ZXJ0ZWNzY3NpX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcG93ZXJ0ZWNzY3NpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocG93ZXJ0ZWNzY3NpX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gcG93ZXJ0ZWNzY3NpX2NpZHMsCisJLmRydiA9IHsKKwkJLm5hbWUJCT0gInBvd2VydGVjc2NzaSIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBvd2VydGVjc2NzaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGVjYXJkX3JlZ2lzdGVyX2RyaXZlcigmcG93ZXJ0ZWNzY3NpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwb3dlcnRlY3Njc2lfZXhpdCh2b2lkKQoreworCWVjYXJkX3JlbW92ZV9kcml2ZXIoJnBvd2VydGVjc2NzaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwb3dlcnRlY3Njc2lfaW5pdCk7Cittb2R1bGVfZXhpdChwb3dlcnRlY3Njc2lfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlJ1c3NlbGwgS2luZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQb3dlcnRlYyBTQ1NJIGRyaXZlciIpOworTU9EVUxFX1BBUk0odGVybSwgIjEtOGkiKTsKK01PRFVMRV9QQVJNX0RFU0ModGVybSwgIlNDU0kgYnVzIHRlcm1pbmF0aW9uIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL3F1ZXVlLmMgYi9kcml2ZXJzL3Njc2kvYXJtL3F1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZkMTU5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vcXVldWUuYwpAQCAtMCwwICsxLDMxOSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Fjb3JuL3Njc2kvcXVldWUuYzogcXVldWUgaGFuZGxpbmcgcHJpbWl0aXZlcworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDaGFuZ2Vsb2c6CisgKiAgIDE1LVNlcC0xOTk3IFJNSwlDcmVhdGVkLgorICogICAxMS1PY3QtMTk5NyBSTUsJQ29ycmVjdGVkIHByb2JsZW0gd2l0aCBxdWV1ZV9yZW1vdmVfZXhjbHVkZQorICoJCQlub3QgdXBkYXRpbmcgaW50ZXJuYWwgbGlua2VkIGxpc3QgcHJvcGVybHkKKyAqCQkJKHdhcyBjYXVzaW5nIGNvbW1hbmRzIHRvIGdvIG1pc3NpbmcpLgorICogICAzMC1BdWctMjAwMCBSTUsJVXNlIExpbnV4IGxpc3QgaGFuZGxpbmcgYW5kIHNwaW5sb2NrcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgIi4uL3Njc2kuaCIKKworI2RlZmluZSBERUJVRworCit0eXBlZGVmIHN0cnVjdCBxdWV1ZV9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCAgIGxpc3Q7CisJU2NzaV9DbW5kCSAgICpTQ3BudDsKKyNpZmRlZiBERUJVRworCXVuc2lnbmVkIGxvbmcJICAgbWFnaWM7CisjZW5kaWYKK30gUUVfdDsKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIFFVRVVFX01BR0lDX0ZSRUUJMHhmN2UxYzlhMworI2RlZmluZSBRVUVVRV9NQUdJQ19VU0VECTB4ZjdlMWNjMzMKKworI2RlZmluZSBTRVRfTUFHSUMocSxtKQkoKHEpLT5tYWdpYyA9IChtKSkKKyNkZWZpbmUgQkFEX01BR0lDKHEsbSkJKChxKS0+bWFnaWMgIT0gKG0pKQorI2Vsc2UKKyNkZWZpbmUgU0VUX01BR0lDKHEsbSkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBCQURfTUFHSUMocSxtKQkoMCkKKyNlbmRpZgorCisjaW5jbHVkZSAicXVldWUuaCIKKworI2RlZmluZSBOUl9RRQkzMgorCisvKgorICogRnVuY3Rpb246IHZvaWQgcXVldWVfaW5pdGlhbGlzZSAoUXVldWVfdCAqcXVldWUpCisgKiBQdXJwb3NlIDogaW5pdGlhbGlzZSBhIHF1ZXVlCisgKiBQYXJhbXMgIDogcXVldWUgLSBxdWV1ZSB0byBpbml0aWFsaXNlCisgKi8KK2ludCBxdWV1ZV9pbml0aWFsaXNlIChRdWV1ZV90ICpxdWV1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgbnF1ZXVlcyA9IE5SX1FFOworCVFFX3QgKnE7CisKKwlzcGluX2xvY2tfaW5pdCgmcXVldWUtPnF1ZXVlX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZxdWV1ZS0+aGVhZCk7CisJSU5JVF9MSVNUX0hFQUQoJnF1ZXVlLT5mcmVlKTsKKworCS8qCisJICogSWYgbGlmZSB3YXMgZWFzaWVyLCB0aGVuIFNDcG50IHdvdWxkIGhhdmUgYQorCSAqIGhvc3QtYXZhaWxhYmxlIGxpc3QgaGVhZCwgYW5kIHdlIHdvdWxkbid0CisJICogbmVlZCB0byBrZWVwIGZyZWUgbGlzdHMgb3IgYWxsb2NhdGUgdGhpcworCSAqIG1lbW9yeS4KKwkgKi8KKwlxdWV1ZS0+YWxsb2MgPSBxID0ga21hbGxvYyhzaXplb2YoUUVfdCkgKiBucXVldWVzLCBHRlBfS0VSTkVMKTsKKwlpZiAocSkgeworCQlmb3IgKDsgbnF1ZXVlczsgcSsrLCBucXVldWVzLS0pIHsKKwkJCVNFVF9NQUdJQyhxLCBRVUVVRV9NQUdJQ19GUkVFKTsKKwkJCXEtPlNDcG50ID0gTlVMTDsKKwkJCWxpc3RfYWRkKCZxLT5saXN0LCAmcXVldWUtPmZyZWUpOworCQl9CisJfQorCisJcmV0dXJuIHF1ZXVlLT5hbGxvYyAhPSBOVUxMOworfQorCisvKgorICogRnVuY3Rpb246IHZvaWQgcXVldWVfZnJlZSAoUXVldWVfdCAqcXVldWUpCisgKiBQdXJwb3NlIDogZnJlZSBhIHF1ZXVlCisgKiBQYXJhbXMgIDogcXVldWUgLSBxdWV1ZSB0byBmcmVlCisgKi8KK3ZvaWQgcXVldWVfZnJlZSAoUXVldWVfdCAqcXVldWUpCit7CisJaWYgKCFsaXN0X2VtcHR5KCZxdWV1ZS0+aGVhZCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImZyZWVpbmcgbm9uLWVtcHR5IHF1ZXVlICVwXG4iLCBxdWV1ZSk7CisJaWYgKHF1ZXVlLT5hbGxvYykKKwkJa2ZyZWUocXVldWUtPmFsbG9jKTsKK30KKyAgICAgCisKKy8qCisgKiBGdW5jdGlvbjogaW50IHF1ZXVlX2FkZF9jbWQoUXVldWVfdCAqcXVldWUsIFNjc2lfQ21uZCAqU0NwbnQsIGludCBoZWFkKQorICogUHVycG9zZSA6IEFkZCBhIG5ldyBjb21tYW5kIG9udG8gYSBxdWV1ZSwgYWRkaW5nIFJFUVVFU1RfU0VOU0UgdG8gaGVhZC4KKyAqIFBhcmFtcyAgOiBxdWV1ZSAtIGRlc3RpbmF0aW9uIHF1ZXVlCisgKgkgICAgIFNDcG50IC0gY29tbWFuZCB0byBhZGQKKyAqCSAgICAgaGVhZCAgLSBhZGQgY29tbWFuZCB0byBoZWFkIG9mIHF1ZXVlCisgKiBSZXR1cm5zIDogMCBvbiBlcnJvciwgITAgb24gc3VjY2VzcworICovCitpbnQgX19xdWV1ZV9hZGQoUXVldWVfdCAqcXVldWUsIFNjc2lfQ21uZCAqU0NwbnQsIGludCBoZWFkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKwlRRV90ICpxOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJaWYgKGxpc3RfZW1wdHkoJnF1ZXVlLT5mcmVlKSkKKwkJZ290byBlbXB0eTsKKworCWwgPSBxdWV1ZS0+ZnJlZS5uZXh0OworCWxpc3RfZGVsKGwpOworCisJcSA9IGxpc3RfZW50cnkobCwgUUVfdCwgbGlzdCk7CisJaWYgKEJBRF9NQUdJQyhxLCBRVUVVRV9NQUdJQ19GUkVFKSkKKwkJQlVHKCk7CisKKwlTRVRfTUFHSUMocSwgUVVFVUVfTUFHSUNfVVNFRCk7CisJcS0+U0NwbnQgPSBTQ3BudDsKKworCWlmIChoZWFkKQorCQlsaXN0X2FkZChsLCAmcXVldWUtPmhlYWQpOworCWVsc2UKKwkJbGlzdF9hZGRfdGFpbChsLCAmcXVldWUtPmhlYWQpOworCisJcmV0ID0gMTsKK2VtcHR5OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIFNjc2lfQ21uZCAqX19xdWV1ZV9yZW1vdmUoUXVldWVfdCAqcXVldWUsIHN0cnVjdCBsaXN0X2hlYWQgKmVudCkKK3sKKwlRRV90ICpxOworCisJLyoKKwkgKiBNb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSAidXNlZCIgbGlzdCBvbnRvIHRoZSAiZnJlZSIgbGlzdAorCSAqLworCWxpc3RfZGVsKGVudCk7CisJcSA9IGxpc3RfZW50cnkoZW50LCBRRV90LCBsaXN0KTsKKwlpZiAoQkFEX01BR0lDKHEsIFFVRVVFX01BR0lDX1VTRUQpKQorCQlCVUcoKTsKKworCVNFVF9NQUdJQyhxLCBRVUVVRV9NQUdJQ19GUkVFKTsKKwlsaXN0X2FkZChlbnQsICZxdWV1ZS0+ZnJlZSk7CisKKwlyZXR1cm4gcS0+U0NwbnQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogU2NzaV9DbW5kICpxdWV1ZV9yZW1vdmVfZXhjbHVkZSAocXVldWUsIGV4Y2x1ZGUpCisgKiBQdXJwb3NlIDogcmVtb3ZlIGEgU0NTSSBjb21tYW5kIGZyb20gYSBxdWV1ZQorICogUGFyYW1zICA6IHF1ZXVlICAgLSBxdWV1ZSB0byByZW1vdmUgY29tbWFuZCBmcm9tCisgKgkgICAgIGV4Y2x1ZGUgLSBiaXQgYXJyYXkgb2YgdGFyZ2V0Jmx1biB3aGljaCBpcyBidXN5CisgKiBSZXR1cm5zIDogU2NzaV9DbW5kIGlmIHN1Y2Nlc3NmdWwgKGFuZCBhIHJlZmVyZW5jZSksIG9yIE5VTEwgaWYgbm8gY29tbWFuZCBhdmFpbGFibGUKKyAqLworU2NzaV9DbW5kICpxdWV1ZV9yZW1vdmVfZXhjbHVkZShRdWV1ZV90ICpxdWV1ZSwgdW5zaWduZWQgbG9uZyAqZXhjbHVkZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJU2NzaV9DbW5kICpTQ3BudCA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoKGwsICZxdWV1ZS0+aGVhZCkgeworCQlRRV90ICpxID0gbGlzdF9lbnRyeShsLCBRRV90LCBsaXN0KTsKKwkJaWYgKCF0ZXN0X2JpdChxLT5TQ3BudC0+ZGV2aWNlLT5pZCAqIDggKyBxLT5TQ3BudC0+ZGV2aWNlLT5sdW4sIGV4Y2x1ZGUpKSB7CisJCQlTQ3BudCA9IF9fcXVldWVfcmVtb3ZlKHF1ZXVlLCBsKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gU0NwbnQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogU2NzaV9DbW5kICpxdWV1ZV9yZW1vdmUgKHF1ZXVlKQorICogUHVycG9zZSA6IHJlbW92ZXMgZmlyc3QgU0NTSSBjb21tYW5kIGZyb20gYSBxdWV1ZQorICogUGFyYW1zICA6IHF1ZXVlICAgLSBxdWV1ZSB0byByZW1vdmUgY29tbWFuZCBmcm9tCisgKiBSZXR1cm5zIDogU2NzaV9DbW5kIGlmIHN1Y2Nlc3NmdWwgKGFuZCBhIHJlZmVyZW5jZSksIG9yIE5VTEwgaWYgbm8gY29tbWFuZCBhdmFpbGFibGUKKyAqLworU2NzaV9DbW5kICpxdWV1ZV9yZW1vdmUoUXVldWVfdCAqcXVldWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlTY3NpX0NtbmQgKlNDcG50ID0gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCWlmICghbGlzdF9lbXB0eSgmcXVldWUtPmhlYWQpKQorCQlTQ3BudCA9IF9fcXVldWVfcmVtb3ZlKHF1ZXVlLCBxdWV1ZS0+aGVhZC5uZXh0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIFNDcG50OworfQorCisvKgorICogRnVuY3Rpb246IFNjc2lfQ21uZCAqcXVldWVfcmVtb3ZlX3RndGx1bnRhZyAocXVldWUsIHRhcmdldCwgbHVuLCB0YWcpCisgKiBQdXJwb3NlIDogcmVtb3ZlIGEgU0NTSSBjb21tYW5kIGZyb20gdGhlIHF1ZXVlIGZvciBhIHNwZWNpZmllZCB0YXJnZXQvbHVuL3RhZworICogUGFyYW1zICA6IHF1ZXVlICAtIHF1ZXVlIHRvIHJlbW92ZSBjb21tYW5kIGZyb20KKyAqCSAgICAgdGFyZ2V0IC0gdGFyZ2V0IHRoYXQgd2Ugd2FudAorICoJICAgICBsdW4gICAgLSBsdW4gb24gZGV2aWNlCisgKgkgICAgIHRhZyAgICAtIHRhZyBvbiBkZXZpY2UKKyAqIFJldHVybnMgOiBTY3NpX0NtbmQgaWYgc3VjY2Vzc2Z1bCwgb3IgTlVMTCBpZiBubyBjb21tYW5kIHNhdGlzZmllcyByZXF1aXJlbWVudHMKKyAqLworU2NzaV9DbW5kICpxdWV1ZV9yZW1vdmVfdGd0bHVudGFnIChRdWV1ZV90ICpxdWV1ZSwgaW50IHRhcmdldCwgaW50IGx1biwgaW50IHRhZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJU2NzaV9DbW5kICpTQ3BudCA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoKGwsICZxdWV1ZS0+aGVhZCkgeworCQlRRV90ICpxID0gbGlzdF9lbnRyeShsLCBRRV90LCBsaXN0KTsKKwkJaWYgKHEtPlNDcG50LT5kZXZpY2UtPmlkID09IHRhcmdldCAmJiBxLT5TQ3BudC0+ZGV2aWNlLT5sdW4gPT0gbHVuICYmCisJCSAgICBxLT5TQ3BudC0+dGFnID09IHRhZykgeworCQkJU0NwbnQgPSBfX3F1ZXVlX3JlbW92ZShxdWV1ZSwgbCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIFNDcG50OworfQorCisvKgorICogRnVuY3Rpb246IHF1ZXVlX3JlbW92ZV9hbGxfdGFyZ2V0KHF1ZXVlLCB0YXJnZXQpCisgKiBQdXJwb3NlIDogcmVtb3ZlIGFsbCBTQ1NJIGNvbW1hbmRzIGZyb20gdGhlIHF1ZXVlIGZvciBhIHNwZWNpZmllZCB0YXJnZXQKKyAqIFBhcmFtcyAgOiBxdWV1ZSAgLSBxdWV1ZSB0byByZW1vdmUgY29tbWFuZCBmcm9tCisgKiAgICAgICAgICAgdGFyZ2V0IC0gdGFyZ2V0IGRldmljZSBpZAorICogUmV0dXJucyA6IG5vdGhpbmcKKyAqLwordm9pZCBxdWV1ZV9yZW1vdmVfYWxsX3RhcmdldChRdWV1ZV90ICpxdWV1ZSwgaW50IHRhcmdldCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoKGwsICZxdWV1ZS0+aGVhZCkgeworCQlRRV90ICpxID0gbGlzdF9lbnRyeShsLCBRRV90LCBsaXN0KTsKKwkJaWYgKHEtPlNDcG50LT5kZXZpY2UtPmlkID09IHRhcmdldCkKKwkJCV9fcXVldWVfcmVtb3ZlKHF1ZXVlLCBsKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiBpbnQgcXVldWVfcHJvYmV0Z3RsdW4gKHF1ZXVlLCB0YXJnZXQsIGx1bikKKyAqIFB1cnBvc2UgOiBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIGNvbW1hbmQgaW4gdGhlIHF1ZXVlIGZvciB0aGUgc3BlY2lmaWVkCisgKgkgICAgIHRhcmdldC9sdW4uCisgKiBQYXJhbXMgIDogcXVldWUgIC0gcXVldWUgdG8gbG9vayBpbgorICoJICAgICB0YXJnZXQgLSB0YXJnZXQgd2Ugd2FudCB0byBwcm9iZQorICoJICAgICBsdW4gICAgLSBsdW4gb24gdGFyZ2V0CisgKiBSZXR1cm5zIDogMCBpZiBub3QgZm91bmQsICE9IDAgaWYgZm91bmQKKyAqLworaW50IHF1ZXVlX3Byb2JldGd0bHVuIChRdWV1ZV90ICpxdWV1ZSwgaW50IHRhcmdldCwgaW50IGx1bikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJaW50IGZvdW5kID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2gobCwgJnF1ZXVlLT5oZWFkKSB7CisJCVFFX3QgKnEgPSBsaXN0X2VudHJ5KGwsIFFFX3QsIGxpc3QpOworCQlpZiAocS0+U0NwbnQtPmRldmljZS0+aWQgPT0gdGFyZ2V0ICYmIHEtPlNDcG50LT5kZXZpY2UtPmx1biA9PSBsdW4pIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZm91bmQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogaW50IHF1ZXVlX3JlbW92ZV9jbWQoUXVldWVfdCAqcXVldWUsIFNjc2lfQ21uZCAqU0NwbnQpCisgKiBQdXJwb3NlIDogcmVtb3ZlIGEgc3BlY2lmaWMgY29tbWFuZCBmcm9tIHRoZSBxdWV1ZXMKKyAqIFBhcmFtcyAgOiBxdWV1ZSAtIHF1ZXVlIHRvIGxvb2sgaW4KKyAqCSAgICAgU0NwbnQgLSBjb21tYW5kIHRvIGZpbmQKKyAqIFJldHVybnMgOiAwIGlmIG5vdCBmb3VuZAorICovCitpbnQgcXVldWVfcmVtb3ZlX2NtZChRdWV1ZV90ICpxdWV1ZSwgU2NzaV9DbW5kICpTQ3BudCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJaW50IGZvdW5kID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2gobCwgJnF1ZXVlLT5oZWFkKSB7CisJCVFFX3QgKnEgPSBsaXN0X2VudHJ5KGwsIFFFX3QsIGxpc3QpOworCQlpZiAocS0+U0NwbnQgPT0gU0NwbnQpIHsKKwkJCV9fcXVldWVfcmVtb3ZlKHF1ZXVlLCBsKTsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZm91bmQ7Cit9CisKK0VYUE9SVF9TWU1CT0wocXVldWVfaW5pdGlhbGlzZSk7CitFWFBPUlRfU1lNQk9MKHF1ZXVlX2ZyZWUpOworRVhQT1JUX1NZTUJPTChfX3F1ZXVlX2FkZCk7CitFWFBPUlRfU1lNQk9MKHF1ZXVlX3JlbW92ZSk7CitFWFBPUlRfU1lNQk9MKHF1ZXVlX3JlbW92ZV9leGNsdWRlKTsKK0VYUE9SVF9TWU1CT0wocXVldWVfcmVtb3ZlX3RndGx1bnRhZyk7CitFWFBPUlRfU1lNQk9MKHF1ZXVlX3JlbW92ZV9jbWQpOworRVhQT1JUX1NZTUJPTChxdWV1ZV9yZW1vdmVfYWxsX3RhcmdldCk7CitFWFBPUlRfU1lNQk9MKHF1ZXVlX3Byb2JldGd0bHVuKTsKKworTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLaW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNDU0kgY29tbWFuZCBxdWV1ZWluZyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9xdWV1ZS5oIGIvZHJpdmVycy9zY3NpL2FybS9xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOWRlYzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXJtL3F1ZXVlLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9hY29ybi9zY3NpL3F1ZXVlLmg6IHF1ZXVlIGhhbmRsaW5nCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NyBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaWZuZGVmIFFVRVVFX0gKKyNkZWZpbmUgUVVFVUVfSAorCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCXN0cnVjdCBsaXN0X2hlYWQgZnJlZTsKKwlzcGlubG9ja190IHF1ZXVlX2xvY2s7CisJdm9pZCAqYWxsb2M7CQkJLyogc3RhcnQgb2YgYWxsb2NhdGVkIG1lbSAqLworfSBRdWV1ZV90OworCisvKgorICogRnVuY3Rpb246IHZvaWQgcXVldWVfaW5pdGlhbGlzZSAoUXVldWVfdCAqcXVldWUpCisgKiBQdXJwb3NlIDogaW5pdGlhbGlzZSBhIHF1ZXVlCisgKiBQYXJhbXMgIDogcXVldWUgLSBxdWV1ZSB0byBpbml0aWFsaXNlCisgKi8KK2V4dGVybiBpbnQgcXVldWVfaW5pdGlhbGlzZSAoUXVldWVfdCAqcXVldWUpOworCisvKgorICogRnVuY3Rpb246IHZvaWQgcXVldWVfZnJlZSAoUXVldWVfdCAqcXVldWUpCisgKiBQdXJwb3NlIDogZnJlZSBhIHF1ZXVlCisgKiBQYXJhbXMgIDogcXVldWUgLSBxdWV1ZSB0byBmcmVlCisgKi8KK2V4dGVybiB2b2lkIHF1ZXVlX2ZyZWUgKFF1ZXVlX3QgKnF1ZXVlKTsKKworLyoKKyAqIEZ1bmN0aW9uOiBTY3NpX0NtbmQgKnF1ZXVlX3JlbW92ZSAocXVldWUpCisgKiBQdXJwb3NlIDogcmVtb3ZlcyBmaXJzdCBTQ1NJIGNvbW1hbmQgZnJvbSBhIHF1ZXVlCisgKiBQYXJhbXMgIDogcXVldWUgICAtIHF1ZXVlIHRvIHJlbW92ZSBjb21tYW5kIGZyb20KKyAqIFJldHVybnMgOiBTY3NpX0NtbmQgaWYgc3VjY2Vzc2Z1bCAoYW5kIGEgcmVmZXJlbmNlKSwgb3IgTlVMTCBpZiBubyBjb21tYW5kIGF2YWlsYWJsZQorICovCitleHRlcm4gU2NzaV9DbW5kICpxdWV1ZV9yZW1vdmUgKFF1ZXVlX3QgKnF1ZXVlKTsKKworLyoKKyAqIEZ1bmN0aW9uOiBTY3NpX0NtbmQgKnF1ZXVlX3JlbW92ZV9leGNsdWRlX3JlZiAocXVldWUsIGV4Y2x1ZGUpCisgKiBQdXJwb3NlIDogcmVtb3ZlIGEgU0NTSSBjb21tYW5kIGZyb20gYSBxdWV1ZQorICogUGFyYW1zICA6IHF1ZXVlICAgLSBxdWV1ZSB0byByZW1vdmUgY29tbWFuZCBmcm9tCisgKgkgICAgIGV4Y2x1ZGUgLSBhcnJheSBvZiBidXN5IExVTnMKKyAqIFJldHVybnMgOiBTY3NpX0NtbmQgaWYgc3VjY2Vzc2Z1bCAoYW5kIGEgcmVmZXJlbmNlKSwgb3IgTlVMTCBpZiBubyBjb21tYW5kIGF2YWlsYWJsZQorICovCitleHRlcm4gU2NzaV9DbW5kICpxdWV1ZV9yZW1vdmVfZXhjbHVkZSAoUXVldWVfdCAqcXVldWUsIHVuc2lnbmVkIGxvbmcgKmV4Y2x1ZGUpOworCisjZGVmaW5lIHF1ZXVlX2FkZF9jbWRfb3JkZXJlZChxdWV1ZSxTQ3BudCkgXAorCV9fcXVldWVfYWRkKHF1ZXVlLFNDcG50LChTQ3BudCktPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkKKyNkZWZpbmUgcXVldWVfYWRkX2NtZF90YWlsKHF1ZXVlLFNDcG50KSBcCisJX19xdWV1ZV9hZGQocXVldWUsU0NwbnQsMCkKKy8qCisgKiBGdW5jdGlvbjogaW50IF9fcXVldWVfYWRkKFF1ZXVlX3QgKnF1ZXVlLCBTY3NpX0NtbmQgKlNDcG50LCBpbnQgaGVhZCkKKyAqIFB1cnBvc2UgOiBBZGQgYSBuZXcgY29tbWFuZCBvbnRvIGEgcXVldWUKKyAqIFBhcmFtcyAgOiBxdWV1ZSAtIGRlc3RpbmF0aW9uIHF1ZXVlCisgKgkgICAgIFNDcG50IC0gY29tbWFuZCB0byBhZGQKKyAqCSAgICAgaGVhZCAgLSBhZGQgY29tbWFuZCB0byBoZWFkIG9mIHF1ZXVlCisgKiBSZXR1cm5zIDogMCBvbiBlcnJvciwgITAgb24gc3VjY2VzcworICovCitleHRlcm4gaW50IF9fcXVldWVfYWRkKFF1ZXVlX3QgKnF1ZXVlLCBTY3NpX0NtbmQgKlNDcG50LCBpbnQgaGVhZCk7CisKKy8qCisgKiBGdW5jdGlvbjogU2NzaV9DbW5kICpxdWV1ZV9yZW1vdmVfdGd0bHVudGFnIChxdWV1ZSwgdGFyZ2V0LCBsdW4sIHRhZykKKyAqIFB1cnBvc2UgOiByZW1vdmUgYSBTQ1NJIGNvbW1hbmQgZnJvbSB0aGUgcXVldWUgZm9yIGEgc3BlY2lmaWVkIHRhcmdldC9sdW4vdGFnCisgKiBQYXJhbXMgIDogcXVldWUgIC0gcXVldWUgdG8gcmVtb3ZlIGNvbW1hbmQgZnJvbQorICoJICAgICB0YXJnZXQgLSB0YXJnZXQgdGhhdCB3ZSB3YW50CisgKgkgICAgIGx1biAgICAtIGx1biBvbiBkZXZpY2UKKyAqCSAgICAgdGFnICAgIC0gdGFnIG9uIGRldmljZQorICogUmV0dXJucyA6IFNjc2lfQ21uZCBpZiBzdWNjZXNzZnVsLCBvciBOVUxMIGlmIG5vIGNvbW1hbmQgc2F0aXNmaWVzIHJlcXVpcmVtZW50cworICovCitleHRlcm4gU2NzaV9DbW5kICpxdWV1ZV9yZW1vdmVfdGd0bHVudGFnIChRdWV1ZV90ICpxdWV1ZSwgaW50IHRhcmdldCwgaW50IGx1biwgaW50IHRhZyk7CisKKy8qCisgKiBGdW5jdGlvbjogcXVldWVfcmVtb3ZlX2FsbF90YXJnZXQocXVldWUsIHRhcmdldCkKKyAqIFB1cnBvc2UgOiByZW1vdmUgYWxsIFNDU0kgY29tbWFuZHMgZnJvbSB0aGUgcXVldWUgZm9yIGEgc3BlY2lmaWVkIHRhcmdldAorICogUGFyYW1zICA6IHF1ZXVlICAtIHF1ZXVlIHRvIHJlbW92ZSBjb21tYW5kIGZyb20KKyAqICAgICAgICAgICB0YXJnZXQgLSB0YXJnZXQgZGV2aWNlIGlkCisgKiBSZXR1cm5zIDogbm90aGluZworICovCitleHRlcm4gdm9pZCBxdWV1ZV9yZW1vdmVfYWxsX3RhcmdldChRdWV1ZV90ICpxdWV1ZSwgaW50IHRhcmdldCk7CisKKy8qCisgKiBGdW5jdGlvbjogaW50IHF1ZXVlX3Byb2JldGd0bHVuIChxdWV1ZSwgdGFyZ2V0LCBsdW4pCisgKiBQdXJwb3NlIDogY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSBjb21tYW5kIGluIHRoZSBxdWV1ZSBmb3IgdGhlIHNwZWNpZmllZAorICoJICAgICB0YXJnZXQvbHVuLgorICogUGFyYW1zICA6IHF1ZXVlICAtIHF1ZXVlIHRvIGxvb2sgaW4KKyAqCSAgICAgdGFyZ2V0IC0gdGFyZ2V0IHdlIHdhbnQgdG8gcHJvYmUKKyAqCSAgICAgbHVuICAgIC0gbHVuIG9uIHRhcmdldAorICogUmV0dXJucyA6IDAgaWYgbm90IGZvdW5kLCAhPSAwIGlmIGZvdW5kCisgKi8KK2V4dGVybiBpbnQgcXVldWVfcHJvYmV0Z3RsdW4gKFF1ZXVlX3QgKnF1ZXVlLCBpbnQgdGFyZ2V0LCBpbnQgbHVuKTsKKworLyoKKyAqIEZ1bmN0aW9uOiBpbnQgcXVldWVfcmVtb3ZlX2NtZCAoUXVldWVfdCAqcXVldWUsIFNjc2lfQ21uZCAqU0NwbnQpCisgKiBQdXJwb3NlIDogcmVtb3ZlIGEgc3BlY2lmaWMgY29tbWFuZCBmcm9tIHRoZSBxdWV1ZXMKKyAqIFBhcmFtcyAgOiBxdWV1ZSAtIHF1ZXVlIHRvIGxvb2sgaW4KKyAqCSAgICAgU0NwbnQgLSBjb21tYW5kIHRvIGZpbmQKKyAqIFJldHVybnMgOiAwIGlmIG5vdCBmb3VuZAorICovCitpbnQgcXVldWVfcmVtb3ZlX2NtZChRdWV1ZV90ICpxdWV1ZSwgU2NzaV9DbW5kICpTQ3BudCk7CisKKyNlbmRpZiAvKiBRVUVVRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL3Njc2kuaCBiL2RyaXZlcnMvc2NzaS9hcm0vc2NzaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMWIzZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXJtL3Njc2kuaApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Fjb3JuL3Njc2kvc2NzaS5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMiBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDb21tb25seSB1c2VkIHNjc2kgZHJpdmVyIGZ1bmN0aW9ucy4KKyAqLworCisjZGVmaW5lIEJFTFRfQU5EX0JSQUNFUworCisvKgorICogVGhlIHNjYXR0ZXItZ2F0aGVyIGxpc3QgaGFuZGxpbmcuICBUaGlzIGNvbnRhaW5zIGFsbAorICogdGhlIHl1Y2t5IHN0dWZmIHRoYXQgbmVlZHMgdG8gYmUgZml4ZWQgcHJvcGVybHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvcHlfU0NwX3RvX3NnKHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIFNjc2lfUG9pbnRlciAqU0NwLCBpbnQgbWF4KQoreworCWludCBidWZzID0gU0NwLT5idWZmZXJzX3Jlc2lkdWFsOworCisJQlVHX09OKGJ1ZnMgKyAxID4gbWF4KTsKKworCXNnLT5wYWdlICAgPSB2aXJ0X3RvX3BhZ2UoU0NwLT5wdHIpOworCXNnLT5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShTQ3AtPnB0cik7CisJc2ctPmxlbmd0aCA9IFNDcC0+dGhpc19yZXNpZHVhbDsKKworCWlmIChidWZzKQorCQltZW1jcHkoc2cgKyAxLCBTQ3AtPmJ1ZmZlciArIDEsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSAqIGJ1ZnMpOworCXJldHVybiBidWZzICsgMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmV4dF9TQ3AoU2NzaV9Qb2ludGVyICpTQ3ApCit7CisJaW50IHJldCA9IFNDcC0+YnVmZmVyc19yZXNpZHVhbDsKKwlpZiAocmV0KSB7CisJCVNDcC0+YnVmZmVyKys7CisJCVNDcC0+YnVmZmVyc19yZXNpZHVhbC0tOworCQlTQ3AtPnB0ciA9IChjaGFyICopCisJCQkgKHBhZ2VfYWRkcmVzcyhTQ3AtPmJ1ZmZlci0+cGFnZSkgKworCQkJICBTQ3AtPmJ1ZmZlci0+b2Zmc2V0KTsKKwkJU0NwLT50aGlzX3Jlc2lkdWFsID0gU0NwLT5idWZmZXItPmxlbmd0aDsKKwl9IGVsc2UgeworCQlTQ3AtPnB0ciA9IE5VTEw7CisJCVNDcC0+dGhpc19yZXNpZHVhbCA9IDA7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBnZXRfbmV4dF9TQ3BfYnl0ZShTY3NpX1BvaW50ZXIgKlNDcCkKK3sKKwljaGFyIGMgPSAqU0NwLT5wdHI7CisKKwlTQ3AtPnB0ciArPSAxOworCVNDcC0+dGhpc19yZXNpZHVhbCAtPSAxOworCisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfbmV4dF9TQ3BfYnl0ZShTY3NpX1BvaW50ZXIgKlNDcCwgdW5zaWduZWQgY2hhciBjKQoreworCSpTQ3AtPnB0ciA9IGM7CisJU0NwLT5wdHIgKz0gMTsKKwlTQ3AtPnRoaXNfcmVzaWR1YWwgLT0gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfU0NwKFNjc2lfQ21uZCAqU0NwbnQpCit7CisJbWVtc2V0KCZTQ3BudC0+U0NwLCAwLCBzaXplb2Yoc3RydWN0IHNjc2lfcG9pbnRlcikpOworCisJaWYgKFNDcG50LT51c2Vfc2cpIHsKKwkJdW5zaWduZWQgbG9uZyBsZW4gPSAwOworCQlpbnQgYnVmOworCisJCVNDcG50LT5TQ3AuYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBTQ3BudC0+YnVmZmVyOworCQlTQ3BudC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSBTQ3BudC0+dXNlX3NnIC0gMTsKKwkJU0NwbnQtPlNDcC5wdHIgPSAoY2hhciAqKQorCQkJIChwYWdlX2FkZHJlc3MoU0NwbnQtPlNDcC5idWZmZXItPnBhZ2UpICsKKwkJCSAgU0NwbnQtPlNDcC5idWZmZXItPm9mZnNldCk7CisJCVNDcG50LT5TQ3AudGhpc19yZXNpZHVhbCA9IFNDcG50LT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisKKyNpZmRlZiBCRUxUX0FORF9CUkFDRVMKKwkJLyoKKwkJICogQ2FsY3VsYXRlIGNvcnJlY3QgYnVmZmVyIGxlbmd0aC4gIFNvbWUgY29tbWFuZHMKKwkJICogY29tZSBpbiB3aXRoIHRoZSB3cm9uZyByZXF1ZXN0X2J1ZmZsZW4uCisJCSAqLworCQlmb3IgKGJ1ZiA9IDA7IGJ1ZiA8PSBTQ3BudC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw7IGJ1ZisrKQorCQkJbGVuICs9IFNDcG50LT5TQ3AuYnVmZmVyW2J1Zl0ubGVuZ3RoOworCisJCWlmIChTQ3BudC0+cmVxdWVzdF9idWZmbGVuICE9IGxlbikKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZC4lYzogYmFkIHJlcXVlc3QgYnVmZmVyICIKKwkJCSAgICAgICAibGVuZ3RoICVkLCBzaG91bGQgYmUgJWxkXG4iLCBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLAorCQkJICAgICAgICcwJyArIFNDcG50LT5kZXZpY2UtPmlkLCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuLCBsZW4pOworCQlTQ3BudC0+cmVxdWVzdF9idWZmbGVuID0gbGVuOworI2VuZGlmCisJfSBlbHNlIHsKKwkJU0NwbnQtPlNDcC5wdHIgPSAodW5zaWduZWQgY2hhciAqKVNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwkJU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKwl9CisKKwkvKgorCSAqIElmIHRoZSB1cHBlciBTQ1NJIGxheWVycyBwYXNzIGEgYnVmZmVyLCBidXQgemVybyBsZW5ndGgsCisJICogd2UgYXJlbid0IGludGVyZXN0ZWQgaW4gdGhlIGJ1ZmZlciBwb2ludGVyLgorCSAqLworCWlmIChTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwgPT0gMCAmJiBTQ3BudC0+U0NwLnB0cikgeworI2lmIDAgLy9kZWYgQkVMVF9BTkRfQlJBQ0VTCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZC4lYzogemVybyBsZW5ndGggYnVmZmVyIHBhc3NlZCBmb3IgIgorCQkgICAgICAgImNvbW1hbmQgIiwgU0NwbnQtPmhvc3QtPmhvc3Rfbm8sICcwJyArIFNDcG50LT50YXJnZXQpOworCQlwcmludF9jb21tYW5kKFNDcG50LT5jbW5kKTsKKyNlbmRpZgorCQlTQ3BudC0+U0NwLnB0ciA9IE5VTEw7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2F0YV9waWl4LmMgYi9kcml2ZXJzL3Njc2kvYXRhX3BpaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTE5NzI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2F0YV9waWl4LmMKQEAgLTAsMCArMSw2OTAgQEAKKy8qCisKKyAgICBhdGFfcGlpeC5jIC0gSW50ZWwgUEFUQS9TQVRBIGNvbnRyb2xsZXJzCisKKyAgICBNYWludGFpbmVkIGJ5OiAgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorICAgIAkJICAgIFBsZWFzZSBBTFdBWVMgY29weSBsaW51eC1pZGVAdmdlci5rZXJuZWwub3JnCisJCSAgICBvbiBlbWFpbHMuCisKKworCUNvcHlyaWdodCAyMDAzLTIwMDQgUmVkIEhhdCBJbmMKKwlDb3B5cmlnaHQgMjAwMy0yMDA0IEplZmYgR2FyemlrCisKKworCUNvcHlyaWdodCBoZWFkZXIgZnJvbSBwaWl4LmM6CisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMTk5OSBBbmRyemVqIEtyenlzenRvZm93aWN6LCBBdXRob3IgYW5kIE1haW50YWluZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCBBbmRyZSBIZWRyaWNrIDxhbmRyZUBsaW51eC1pZGUub3JnPgorICAgIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0IEluYyA8YWxhbkByZWRoYXQuY29tPgorCisgICAgTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CisKKyNkZWZpbmUgRFJWX05BTUUJImF0YV9waWl4IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wMyIKKworZW51bSB7CisJUElJWF9JT0NGRwkJPSAweDU0LCAvKiBJREUgSS9PIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKwlJQ0g1X1BNUgkJPSAweDkwLCAvKiBwb3J0IG1hcHBpbmcgcmVnaXN0ZXIgKi8KKwlJQ0g1X1BDUwkJPSAweDkyLAkvKiBwb3J0IGNvbnRyb2wgYW5kIHN0YXR1cyAqLworCisJUElJWF9GTEFHX0FIQ0kJCT0gKDEgPDwgMjgpLCAvKiBBSENJIHBvc3NpYmxlICovCisJUElJWF9GTEFHX0NIRUNLSU5UUgk9ICgxIDw8IDI5KSwgLyogbWFrZSBzdXJlIFBDSSBJTlR4IGVuYWJsZWQgKi8KKwlQSUlYX0ZMQUdfQ09NQklORUQJPSAoMSA8PCAzMCksIC8qIGNvbWJpbmVkIG1vZGUgcG9zc2libGUgKi8KKworCS8qIGNvbWJpbmVkIG1vZGUuICBpZiBzZXQsIFBBVEEgaXMgY2hhbm5lbCAwLgorCSAqIGlmIGNsZWFyLCBQQVRBIGlzIGNoYW5uZWwgMS4KKwkgKi8KKwlQSUlYX0NPTUJfUEFUQV9QMAk9ICgxIDw8IDEpLAorCVBJSVhfQ09NQgkJPSAoMSA8PCAyKSwgLyogY29tYmluZWQgbW9kZSBlbmFibGVkPyAqLworCisJUElJWF9QT1JUX1BSRVNFTlQJPSAoMSA8PCAwKSwKKwlQSUlYX1BPUlRfRU5BQkxFRAk9ICgxIDw8IDQpLAorCisJUElJWF84MENfUFJJCQk9ICgxIDw8IDUpIHwgKDEgPDwgNCksCisJUElJWF84MENfU0VDCQk9ICgxIDw8IDcpIHwgKDEgPDwgNiksCisKKwlpY2g1X3BhdGEJCT0gMCwKKwlpY2g1X3NhdGEJCT0gMSwKKwlwaWl4NF9wYXRhCQk9IDIsCisJaWNoNl9zYXRhCQk9IDMsCisJaWNoNl9zYXRhX3JtCQk9IDQsCisJaWNoN19zYXRhCQk9IDUsCit9OworCitzdGF0aWMgaW50IHBpaXhfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKKworc3RhdGljIHZvaWQgcGlpeF9wYXRhX3BoeV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIHBpaXhfc2F0YV9waHlfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgdm9pZCBwaWl4X3NldF9waW9tb2RlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldik7CitzdGF0aWMgdm9pZCBwaWl4X3NldF9kbWFtb2RlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5fbW9kdWxlX2luaXQgPSAxOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGlpeF9wY2lfdGJsW10gPSB7CisjaWZkZWYgQVRBX0VOQUJMRV9QQVRBCisJeyAweDgwODYsIDB4NzExMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgcGlpeDRfcGF0YSB9LAorCXsgMHg4MDg2LCAweDI0ZGIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDVfcGF0YSB9LAorCXsgMHg4MDg2LCAweDI1YTIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDVfcGF0YSB9LAorI2VuZGlmCisKKwkvKiBOT1RFOiBUaGUgZm9sbG93aW5nIFBDSSBpZHMgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUKKwkgKiBsaXN0IGluIGRyaXZlcnMvcGNpL3F1aXJrcy5jLgorCSAqLworCisJeyAweDgwODYsIDB4MjRkMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNV9zYXRhIH0sCisJeyAweDgwODYsIDB4MjRkZiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNV9zYXRhIH0sCisJeyAweDgwODYsIDB4MjVhMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNV9zYXRhIH0sCisJeyAweDgwODYsIDB4MjViMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNV9zYXRhIH0sCisJeyAweDgwODYsIDB4MjY1MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNl9zYXRhIH0sCisJeyAweDgwODYsIDB4MjY1MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNl9zYXRhX3JtIH0sCisJeyAweDgwODYsIDB4MjY1MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNl9zYXRhX3JtIH0sCisJeyAweDgwODYsIDB4MjdjMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoN19zYXRhIH0sCisJeyAweDgwODYsIDB4MjdjNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoN19zYXRhIH0sCisKKwl7IH0JLyogdGVybWluYXRlIGxpc3QgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBwaWl4X3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQkJPSBwaWl4X3BjaV90YmwsCisJLnByb2JlCQkJPSBwaWl4X2luaXRfb25lLAorCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKK307CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgcGlpeF9zaHQgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pb2N0bAkJCT0gYXRhX3Njc2lfaW9jdGwsCisJLnF1ZXVlY29tbWFuZAkJPSBhdGFfc2NzaV9xdWV1ZWNtZCwKKwkuZWhfc3RyYXRlZ3lfaGFuZGxlcgk9IGF0YV9zY3NpX2Vycm9yLAorCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKKwkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCisJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKKwkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAorCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAorCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAorCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAorCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCisJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAorCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5vcmRlcmVkX2ZsdXNoCQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgcGlpeF9wYXRhX29wcyA9IHsKKwkucG9ydF9kaXNhYmxlCQk9IGF0YV9wb3J0X2Rpc2FibGUsCisJLnNldF9waW9tb2RlCQk9IHBpaXhfc2V0X3Bpb21vZGUsCisJLnNldF9kbWFtb2RlCQk9IHBpaXhfc2V0X2RtYW1vZGUsCisKKwkudGZfbG9hZAkJPSBhdGFfdGZfbG9hZCwKKwkudGZfcmVhZAkJPSBhdGFfdGZfcmVhZCwKKwkuY2hlY2tfc3RhdHVzCQk9IGF0YV9jaGVja19zdGF0dXMsCisJLmV4ZWNfY29tbWFuZAkJPSBhdGFfZXhlY19jb21tYW5kLAorCS5kZXZfc2VsZWN0CQk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKKworCS5waHlfcmVzZXQJCT0gcGlpeF9wYXRhX3BoeV9yZXNldCwKKworCS5ibWRtYV9zZXR1cAkJPSBhdGFfYm1kbWFfc2V0dXAsCisJLmJtZG1hX3N0YXJ0CQk9IGF0YV9ibWRtYV9zdGFydCwKKwkuYm1kbWFfc3RvcAkJPSBhdGFfYm1kbWFfc3RvcCwKKwkuYm1kbWFfc3RhdHVzCQk9IGF0YV9ibWRtYV9zdGF0dXMsCisJLnFjX3ByZXAJCT0gYXRhX3FjX3ByZXAsCisJLnFjX2lzc3VlCQk9IGF0YV9xY19pc3N1ZV9wcm90LAorCisJLmVuZ190aW1lb3V0CQk9IGF0YV9lbmdfdGltZW91dCwKKworCS5pcnFfaGFuZGxlcgkJPSBhdGFfaW50ZXJydXB0LAorCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKKworCS5wb3J0X3N0YXJ0CQk9IGF0YV9wb3J0X3N0YXJ0LAorCS5wb3J0X3N0b3AJCT0gYXRhX3BvcnRfc3RvcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBwaWl4X3NhdGFfb3BzID0geworCS5wb3J0X2Rpc2FibGUJCT0gYXRhX3BvcnRfZGlzYWJsZSwKKworCS50Zl9sb2FkCQk9IGF0YV90Zl9sb2FkLAorCS50Zl9yZWFkCQk9IGF0YV90Zl9yZWFkLAorCS5jaGVja19zdGF0dXMJCT0gYXRhX2NoZWNrX3N0YXR1cywKKwkuZXhlY19jb21tYW5kCQk9IGF0YV9leGVjX2NvbW1hbmQsCisJLmRldl9zZWxlY3QJCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAorCisJLnBoeV9yZXNldAkJPSBwaWl4X3NhdGFfcGh5X3Jlc2V0LAorCisJLmJtZG1hX3NldHVwCQk9IGF0YV9ibWRtYV9zZXR1cCwKKwkuYm1kbWFfc3RhcnQJCT0gYXRhX2JtZG1hX3N0YXJ0LAorCS5ibWRtYV9zdG9wCQk9IGF0YV9ibWRtYV9zdG9wLAorCS5ibWRtYV9zdGF0dXMJCT0gYXRhX2JtZG1hX3N0YXR1cywKKwkucWNfcHJlcAkJPSBhdGFfcWNfcHJlcCwKKwkucWNfaXNzdWUJCT0gYXRhX3FjX2lzc3VlX3Byb3QsCisKKwkuZW5nX3RpbWVvdXQJCT0gYXRhX2VuZ190aW1lb3V0LAorCisJLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCisJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAorCisJLnBvcnRfc3RhcnQJCT0gYXRhX3BvcnRfc3RhcnQsCisJLnBvcnRfc3RvcAkJPSBhdGFfcG9ydF9zdG9wLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIHBpaXhfcG9ydF9pbmZvW10gPSB7CisJLyogaWNoNV9wYXRhICovCisJeworCQkuc2h0CQk9ICZwaWl4X3NodCwKKwkJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCB8CisJCQkJICBQSUlYX0ZMQUdfQ0hFQ0tJTlRSLAorCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW8wLTQgKi8KKyNpZiAwCisJCS5td2RtYV9tYXNrCT0gMHgwNiwgLyogbXdkbWExLTIgKi8KKyNlbHNlCisJCS5td2RtYV9tYXNrCT0gMHgwMCwgLyogbXdkbWEgYnJva2VuICovCisjZW5kaWYKKwkJLnVkbWFfbWFzawk9IDB4M2YsIC8qIHVkbWEwLTUgKi8KKwkJLnBvcnRfb3BzCT0gJnBpaXhfcGF0YV9vcHMsCisJfSwKKworCS8qIGljaDVfc2F0YSAqLworCXsKKwkJLnNodAkJPSAmcGlpeF9zaHQsCisJCS5ob3N0X2ZsYWdzCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX1NSU1QgfAorCQkJCSAgUElJWF9GTEFHX0NPTUJJTkVEIHwgUElJWF9GTEFHX0NIRUNLSU5UUiwKKwkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCisJCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KKwkJLnVkbWFfbWFzawk9IDB4N2YsCS8qIHVkbWEwLTYgKi8KKwkJLnBvcnRfb3BzCT0gJnBpaXhfc2F0YV9vcHMsCisJfSwKKworCS8qIHBpaXg0X3BhdGEgKi8KKwl7CisJCS5zaHQJCT0gJnBpaXhfc2h0LAorCQkuaG9zdF9mbGFncwk9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAorCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW8wLTQgKi8KKyNpZiAwCisJCS5td2RtYV9tYXNrCT0gMHgwNiwgLyogbXdkbWExLTIgKi8KKyNlbHNlCisJCS5td2RtYV9tYXNrCT0gMHgwMCwgLyogbXdkbWEgYnJva2VuICovCisjZW5kaWYKKwkJLnVkbWFfbWFzawk9IEFUQV9VRE1BX01BU0tfNDBDLAorCQkucG9ydF9vcHMJPSAmcGlpeF9wYXRhX29wcywKKwl9LAorCisJLyogaWNoNl9zYXRhICovCisJeworCQkuc2h0CQk9ICZwaWl4X3NodCwKKwkJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfU1JTVCB8CisJCQkJICBQSUlYX0ZMQUdfQ09NQklORUQgfCBQSUlYX0ZMQUdfQ0hFQ0tJTlRSIHwKKwkJCQkgIEFUQV9GTEFHX1NMQVZFX1BPU1MsCisJCS5waW9fbWFzawk9IDB4MWYsCS8qIHBpbzAtNCAqLworCQkubXdkbWFfbWFzawk9IDB4MDcsIC8qIG13ZG1hMC0yICovCisJCS51ZG1hX21hc2sJPSAweDdmLAkvKiB1ZG1hMC02ICovCisJCS5wb3J0X29wcwk9ICZwaWl4X3NhdGFfb3BzLAorCX0sCisKKwkvKiBpY2g2X3NhdGFfcm0gKi8KKwl7CisJCS5zaHQJCT0gJnBpaXhfc2h0LAorCQkuaG9zdF9mbGFncwk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19TUlNUIHwKKwkJCQkgIFBJSVhfRkxBR19DT01CSU5FRCB8IFBJSVhfRkxBR19DSEVDS0lOVFIgfAorCQkJCSAgQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IFBJSVhfRkxBR19BSENJLAorCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW8wLTQgKi8KKwkJLm13ZG1hX21hc2sJPSAweDA3LCAvKiBtd2RtYTAtMiAqLworCQkudWRtYV9tYXNrCT0gMHg3ZiwJLyogdWRtYTAtNiAqLworCQkucG9ydF9vcHMJPSAmcGlpeF9zYXRhX29wcywKKwl9LAorCisJLyogaWNoN19zYXRhICovCisJeworCQkuc2h0CQk9ICZwaWl4X3NodCwKKwkJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfU1JTVCB8CisJCQkJICBQSUlYX0ZMQUdfQ09NQklORUQgfCBQSUlYX0ZMQUdfQ0hFQ0tJTlRSIHwKKwkJCQkgIEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBQSUlYX0ZMQUdfQUhDSSwKKwkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCisJCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KKwkJLnVkbWFfbWFzawk9IDB4N2YsCS8qIHVkbWEwLTYgKi8KKwkJLnBvcnRfb3BzCT0gJnBpaXhfc2F0YV9vcHMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2JpdHMgcGlpeF9lbmFibGVfYml0c1tdID0geworCXsgMHg0MVUsIDFVLCAweDgwVUwsIDB4ODBVTCB9LAkvKiBwb3J0IDAgKi8KKwl7IDB4NDNVLCAxVSwgMHg4MFVMLCAweDgwVUwgfSwJLyogcG9ydCAxICovCit9OworCitNT0RVTEVfQVVUSE9SKCJBbmRyZSBIZWRyaWNrLCBBbGFuIENveCwgQW5kcnplaiBLcnp5c3p0b2Zvd2ljeiwgSmVmZiBHYXJ6aWsiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0NTSSBsb3ctbGV2ZWwgZHJpdmVyIGZvciBJbnRlbCBQSUlYL0lDSCBBVEEgY29udHJvbGxlcnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwaWl4X3BjaV90YmwpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCisvKioKKyAqCXBpaXhfcGF0YV9jYmxfZGV0ZWN0IC0gUHJvYmUgaG9zdCBjb250cm9sbGVyIGNhYmxlIGRldGVjdCBpbmZvCisgKglAYXA6IFBvcnQgZm9yIHdoaWNoIGNhYmxlIGRldGVjdCBpbmZvIGlzIGRlc2lyZWQKKyAqCisgKglSZWFkIDgwYyBjYWJsZSBpbmRpY2F0b3IgZnJvbSBBVEEgUENJIGRldmljZSdzIFBDSSBjb25maWcKKyAqCXJlZ2lzdGVyLiAgVGhpcyByZWdpc3RlciBpcyBub3JtYWxseSBzZXQgYnkgZmlybXdhcmUgKEJJT1MpLgorICoKKyAqCUxPQ0tJTkc6CisgKglOb25lIChpbmhlcml0ZWQgZnJvbSBjYWxsZXIpLgorICovCitzdGF0aWMgdm9pZCBwaWl4X3BhdGFfY2JsX2RldGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdF9zZXQtPmRldik7CisJdTggdG1wLCBtYXNrOworCisJLyogbm8gODBjIHN1cHBvcnQgaW4gaG9zdCBjb250cm9sbGVyPyAqLworCWlmICgoYXAtPnVkbWFfbWFzayAmIH5BVEFfVURNQV9NQVNLXzQwQykgPT0gMCkKKwkJZ290byBjYmw0MDsKKworCS8qIGNoZWNrIEJJT1MgY2FibGUgZGV0ZWN0IHJlc3VsdHMgKi8KKwltYXNrID0gYXAtPmhhcmRfcG9ydF9ubyA9PSAwID8gUElJWF84MENfUFJJIDogUElJWF84MENfU0VDOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBJSVhfSU9DRkcsICZ0bXApOworCWlmICgodG1wICYgbWFzaykgPT0gMCkKKwkJZ290byBjYmw0MDsKKworCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE4MDsKKwlyZXR1cm47CisKK2NibDQwOgorCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKKwlhcC0+dWRtYV9tYXNrICY9IEFUQV9VRE1BX01BU0tfNDBDOworfQorCisvKioKKyAqCXBpaXhfcGF0YV9waHlfcmVzZXQgLSBQcm9iZSBzcGVjaWZpZWQgcG9ydCBvbiBQQVRBIGhvc3QgY29udHJvbGxlcgorICoJQGFwOiBQb3J0IHRvIHByb2JlCisgKgorICoJUHJvYmUgUEFUQSBwaHkuCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUgKGluaGVyaXRlZCBmcm9tIGNhbGxlcikuCisgKi8KKworc3RhdGljIHZvaWQgcGlpeF9wYXRhX3BoeV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdF9zZXQtPmRldik7CisKKwlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZwaWl4X2VuYWJsZV9iaXRzW2FwLT5oYXJkX3BvcnRfbm9dKSkgeworCQlhdGFfcG9ydF9kaXNhYmxlKGFwKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYXRhJXU6IHBvcnQgZGlzYWJsZWQuIGlnbm9yaW5nLlxuIiwgYXAtPmlkKTsKKwkJcmV0dXJuOworCX0KKworCXBpaXhfcGF0YV9jYmxfZGV0ZWN0KGFwKTsKKworCWF0YV9wb3J0X3Byb2JlKGFwKTsKKworCWF0YV9idXNfcmVzZXQoYXApOworfQorCisvKioKKyAqCXBpaXhfc2F0YV9wcm9iZSAtIFByb2JlIFBDSSBkZXZpY2UgZm9yIHByZXNlbnQgU0FUQSBkZXZpY2VzCisgKglAYXA6IFBvcnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBQQ0kgZGV2aWNlIHdlIHdpc2ggdG8gcHJvYmUKKyAqCisgKglSZWFkcyBTQVRBIFBDSSBkZXZpY2UncyBQQ0kgY29uZmlnIHJlZ2lzdGVyIFBvcnQgQ29uZmlndXJhdGlvbgorICoJYW5kIFN0YXR1cyAoUENTKSB0byBkZXRlcm1pbmUgcG9ydCBhbmQgZGV2aWNlIGF2YWlsYWJpbGl0eS4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZSAoaW5oZXJpdGVkIGZyb20gY2FsbGVyKS4KKyAqCisgKglSRVRVUk5TOgorICoJTm9uLXplcm8gaWYgZGV2aWNlIGRldGVjdGVkLCB6ZXJvIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBwaWl4X3NhdGFfcHJvYmUgKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0X3NldC0+ZGV2KTsKKwlpbnQgY29tYmluZWQgPSAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfU0xBVkVfUE9TUyk7CisJaW50IG9yaWdfbWFzaywgbWFzaywgaTsKKwl1OCBwY3M7CisKKwltYXNrID0gKFBJSVhfUE9SVF9QUkVTRU5UIDw8IGFwLT5oYXJkX3BvcnRfbm8pIHwKKwkgICAgICAgKFBJSVhfUE9SVF9FTkFCTEVEIDw8IGFwLT5oYXJkX3BvcnRfbm8pOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgSUNINV9QQ1MsICZwY3MpOworCW9yaWdfbWFzayA9IChpbnQpIHBjcyAmIDB4ZmY7CisKKwkvKiBUT0RPOiB0aGlzIGlzIHZhZ3VlbHkgd3JvbmcgZm9yIElDSDYgY29tYmluZWQgbW9kZSwKKwkgKiB3aGVyZSBvbmx5IHR3byBvZiB0aGUgZm91ciBTQVRBIHBvcnRzIGFyZSBtYXBwZWQKKwkgKiBvbnRvIGEgc2luZ2xlIEFUQSBjaGFubmVsLiAgSXQgaXMgYWxzbyB2YWd1ZWx5IGluYWNjdXJhdGUKKwkgKiBmb3IgSUNINSwgd2hpY2ggaGFzIG9ubHkgdHdvIHBvcnRzLiAgSG93ZXZlciwgdGhpcyBpcyBvaywKKwkgKiBhcyBmdXJ0aGVyIGRldmljZSBwcmVzZW5jZSBkZXRlY3Rpb24gY29kZSB3aWxsIGhhbmRsZQorCSAqIGFueSBmYWxzZSBwb3NpdGl2ZXMgcHJvZHVjZWQgaGVyZS4KKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJbWFzayA9IChQSUlYX1BPUlRfUFJFU0VOVCA8PCBpKSB8IChQSUlYX1BPUlRfRU5BQkxFRCA8PCBpKTsKKworCQlpZiAoKG9yaWdfbWFzayAmIG1hc2spID09IG1hc2spCisJCQlpZiAoY29tYmluZWQgfHwgKGkgPT0gYXAtPmhhcmRfcG9ydF9ubykpCisJCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJcGlpeF9zYXRhX3BoeV9yZXNldCAtIFByb2JlIHNwZWNpZmllZCBwb3J0IG9uIFNBVEEgaG9zdCBjb250cm9sbGVyCisgKglAYXA6IFBvcnQgdG8gcHJvYmUKKyAqCisgKglQcm9iZSBTQVRBIHBoeS4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZSAoaW5oZXJpdGVkIGZyb20gY2FsbGVyKS4KKyAqLworCitzdGF0aWMgdm9pZCBwaWl4X3NhdGFfcGh5X3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJaWYgKCFwaWl4X3NhdGFfcHJvYmUoYXApKSB7CisJCWF0YV9wb3J0X2Rpc2FibGUoYXApOworCQlwcmludGsoS0VSTl9JTkZPICJhdGEldTogU0FUQSBwb3J0IGhhcyBubyBkZXZpY2UuXG4iLCBhcC0+aWQpOworCQlyZXR1cm47CisJfQorCisJYXAtPmNibCA9IEFUQV9DQkxfU0FUQTsKKworCWF0YV9wb3J0X3Byb2JlKGFwKTsKKworCWF0YV9idXNfcmVzZXQoYXApOworfQorCisvKioKKyAqCXBpaXhfc2V0X3Bpb21vZGUgLSBJbml0aWFsaXplIGhvc3QgY29udHJvbGxlciBQQVRBIFBJTyB0aW1pbmdzCisgKglAYXA6IFBvcnQgd2hvc2UgdGltaW5ncyB3ZSBhcmUgY29uZmlndXJpbmcKKyAqCUBhZGV2OiB1bQorICoJQHBpbzogUElPIG1vZGUsIDAgLSA0CisgKgorICoJU2V0IFBJTyBtb2RlIGZvciBkZXZpY2UsIGluIGhvc3QgY29udHJvbGxlciBQQ0kgY29uZmlnIHNwYWNlLgorICoKKyAqCUxPQ0tJTkc6CisgKglOb25lIChpbmhlcml0ZWQgZnJvbSBjYWxsZXIpLgorICovCisKK3N0YXRpYyB2b2lkIHBpaXhfc2V0X3Bpb21vZGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQoreworCXVuc2lnbmVkIGludCBwaW8JPSBhZGV2LT5waW9fbW9kZSAtIFhGRVJfUElPXzA7CisJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoYXAtPmhvc3Rfc2V0LT5kZXYpOworCXVuc2lnbmVkIGludCBpc19zbGF2ZQk9IChhZGV2LT5kZXZubyAhPSAwKTsKKwl1bnNpZ25lZCBpbnQgbWFzdGVyX3BvcnQ9IGFwLT5oYXJkX3BvcnRfbm8gPyAweDQyIDogMHg0MDsKKwl1bnNpZ25lZCBpbnQgc2xhdmVfcG9ydAk9IDB4NDQ7CisJdTE2IG1hc3Rlcl9kYXRhOworCXU4IHNsYXZlX2RhdGE7CisKKwlzdGF0aWMgY29uc3QJIC8qIElTUCAgUlRDICovCisJdTggdGltaW5nc1tdWzJdCT0geyB7IDAsIDAgfSwKKwkJCSAgICB7IDAsIDAgfSwKKwkJCSAgICB7IDEsIDAgfSwKKwkJCSAgICB7IDIsIDEgfSwKKwkJCSAgICB7IDIsIDMgfSwgfTsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgbWFzdGVyX3BvcnQsICZtYXN0ZXJfZGF0YSk7CisJaWYgKGlzX3NsYXZlKSB7CisJCW1hc3Rlcl9kYXRhIHw9IDB4NDAwMDsKKwkJLyogZW5hYmxlIFBQRSwgSUUgYW5kIFRJTUUgKi8KKwkJbWFzdGVyX2RhdGEgfD0gMHgwMDcwOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIHNsYXZlX3BvcnQsICZzbGF2ZV9kYXRhKTsKKwkJc2xhdmVfZGF0YSAmPSAoYXAtPmhhcmRfcG9ydF9ubyA/IDB4MGYgOiAweGYwKTsKKwkJc2xhdmVfZGF0YSB8PQorCQkJKHRpbWluZ3NbcGlvXVswXSA8PCAyKSB8CisJCQkodGltaW5nc1twaW9dWzFdIDw8IChhcC0+aGFyZF9wb3J0X25vID8gNCA6IDApKTsKKwl9IGVsc2UgeworCQltYXN0ZXJfZGF0YSAmPSAweGNjZjg7CisJCS8qIGVuYWJsZSBQUEUsIElFIGFuZCBUSU1FICovCisJCW1hc3Rlcl9kYXRhIHw9IDB4MDAwNzsKKwkJbWFzdGVyX2RhdGEgfD0KKwkJCSh0aW1pbmdzW3Bpb11bMF0gPDwgMTIpIHwKKwkJCSh0aW1pbmdzW3Bpb11bMV0gPDwgOCk7CisJfQorCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIG1hc3Rlcl9wb3J0LCBtYXN0ZXJfZGF0YSk7CisJaWYgKGlzX3NsYXZlKQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBzbGF2ZV9wb3J0LCBzbGF2ZV9kYXRhKTsKK30KKworLyoqCisgKglwaWl4X3NldF9kbWFtb2RlIC0gSW5pdGlhbGl6ZSBob3N0IGNvbnRyb2xsZXIgUEFUQSBQSU8gdGltaW5ncworICoJQGFwOiBQb3J0IHdob3NlIHRpbWluZ3Mgd2UgYXJlIGNvbmZpZ3VyaW5nCisgKglAYWRldjogdW0KKyAqCUB1ZG1hOiB1ZG1hIG1vZGUsIDAgLSA2CisgKgorICoJU2V0IFVETUEgbW9kZSBmb3IgZGV2aWNlLCBpbiBob3N0IGNvbnRyb2xsZXIgUENJIGNvbmZpZyBzcGFjZS4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZSAoaW5oZXJpdGVkIGZyb20gY2FsbGVyKS4KKyAqLworCitzdGF0aWMgdm9pZCBwaWl4X3NldF9kbWFtb2RlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKK3sKKwl1bnNpZ25lZCBpbnQgdWRtYQk9IGFkZXYtPmRtYV9tb2RlOyAvKiBGSVhNRTogTVdETUEgdG9vICovCisJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoYXAtPmhvc3Rfc2V0LT5kZXYpOworCXU4IG1hc2xhdmUJCT0gYXAtPmhhcmRfcG9ydF9ubyA/IDB4NDIgOiAweDQwOworCXU4IHNwZWVkCQk9IHVkbWE7CisJdW5zaWduZWQgaW50IGRyaXZlX2RuCT0gKGFwLT5oYXJkX3BvcnRfbm8gPyAyIDogMCkgKyBhZGV2LT5kZXZubzsKKwlpbnQgYV9zcGVlZAkJPSAzIDw8IChkcml2ZV9kbiAqIDQpOworCWludCB1X2ZsYWcJCT0gMSA8PCBkcml2ZV9kbjsKKwlpbnQgdl9mbGFnCQk9IDB4MDEgPDwgZHJpdmVfZG47CisJaW50IHdfZmxhZwkJPSAweDEwIDw8IGRyaXZlX2RuOworCWludCB1X3NwZWVkCQk9IDA7CisJaW50CQkJc2l0cmU7CisJdTE2CQkJcmVnNDA0MiwgcmVnNGE7CisJdTgJCQlyZWc0OCwgcmVnNTQsIHJlZzU1OworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBtYXNsYXZlLCAmcmVnNDA0Mik7CisJRFBSSU5USygicmVnNDA0MiA9IDB4JTA0eFxuIiwgcmVnNDA0Mik7CisJc2l0cmUgPSAocmVnNDA0MiAmIDB4NDAwMCkgPyAxIDogMDsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDgsICZyZWc0OCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCAweDRhLCAmcmVnNGEpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1NCwgJnJlZzU0KTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTUsICZyZWc1NSk7CisKKwlzd2l0Y2goc3BlZWQpIHsKKwkJY2FzZSBYRkVSX1VETUFfNDoKKwkJY2FzZSBYRkVSX1VETUFfMjoJdV9zcGVlZCA9IDIgPDwgKGRyaXZlX2RuICogNCk7IGJyZWFrOworCQljYXNlIFhGRVJfVURNQV82OgorCQljYXNlIFhGRVJfVURNQV81OgorCQljYXNlIFhGRVJfVURNQV8zOgorCQljYXNlIFhGRVJfVURNQV8xOgl1X3NwZWVkID0gMSA8PCAoZHJpdmVfZG4gKiA0KTsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzA6CXVfc3BlZWQgPSAwIDw8IChkcml2ZV9kbiAqIDQpOyBicmVhazsKKwkJY2FzZSBYRkVSX01XX0RNQV8yOgorCQljYXNlIFhGRVJfTVdfRE1BXzE6CWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCQlyZXR1cm47CisJfQorCisJaWYgKHNwZWVkID49IFhGRVJfVURNQV8wKSB7CisJCWlmICghKHJlZzQ4ICYgdV9mbGFnKSkKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDgsIHJlZzQ4IHwgdV9mbGFnKTsKKwkJaWYgKHNwZWVkID09IFhGRVJfVURNQV81KSB7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU1LCAodTgpIHJlZzU1fHdfZmxhZyk7CisJCX0gZWxzZSB7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU1LCAodTgpIHJlZzU1ICYgfndfZmxhZyk7CisJCX0KKwkJaWYgKChyZWc0YSAmIGFfc3BlZWQpICE9IHVfc3BlZWQpCisJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDRhLCAocmVnNGEgJiB+YV9zcGVlZCkgfCB1X3NwZWVkKTsKKwkJaWYgKHNwZWVkID4gWEZFUl9VRE1BXzIpIHsKKwkJCWlmICghKHJlZzU0ICYgdl9mbGFnKSkKKwkJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU0LCByZWc1NCB8IHZfZmxhZyk7CisJCX0gZWxzZQorCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1NCwgcmVnNTQgJiB+dl9mbGFnKTsKKwl9IGVsc2UgeworCQlpZiAocmVnNDggJiB1X2ZsYWcpCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQ4LCByZWc0OCAmIH51X2ZsYWcpOworCQlpZiAocmVnNGEgJiBhX3NwZWVkKQorCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg0YSwgcmVnNGEgJiB+YV9zcGVlZCk7CisJCWlmIChyZWc1NCAmIHZfZmxhZykKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTQsIHJlZzU0ICYgfnZfZmxhZyk7CisJCWlmIChyZWc1NSAmIHdfZmxhZykKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTUsICh1OCkgcmVnNTUgJiB+d19mbGFnKTsKKwl9Cit9CisKKy8qIG1vdmUgdG8gUENJIGxheWVyLCBpbnRlZ3JhdGUgdy8gTVNJIHN0dWZmICovCitzdGF0aWMgdm9pZCBwY2lfZW5hYmxlX2ludHgoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTE2IHBjaV9jb21tYW5kOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZwY2lfY29tbWFuZCk7CisJaWYgKHBjaV9jb21tYW5kICYgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKSB7CisJCXBjaV9jb21tYW5kICY9IH5QQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEU7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NvbW1hbmQpOworCX0KK30KKworI2RlZmluZSBBSENJX1BDSV9CQVIgNQorI2RlZmluZSBBSENJX0dMT0JBTF9DVEwgMHgwNAorI2RlZmluZSBBSENJX0VOQUJMRSAoMSA8PCAzMSkKK3N0YXRpYyBpbnQgcGlpeF9kaXNhYmxlX2FoY2koc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdm9pZCAqbW1pbzsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdTMyIHRtcDsKKwlpbnQgcmMgPSAwOworCisJLyogQlVHOiBwY2lfZW5hYmxlX2RldmljZSBoYXMgbm90IHlldCBiZWVuIGNhbGxlZC4gIFRoaXMKKwkgKiB3b3JrcyBiZWNhdXNlIHRoaXMgZGV2aWNlIGlzIHVzdWFsbHkgc2V0IHVwIGJ5IEJJT1MuCisJICovCisKKwlhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIEFIQ0lfUENJX0JBUik7CisJaWYgKCFhZGRyIHx8ICFwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIEFIQ0lfUENJX0JBUikpCisJCXJldHVybiAwOworCQorCW1taW8gPSBpb3JlbWFwKGFkZHIsIDY0KTsKKwlpZiAoIW1taW8pCisJCXJldHVybiAtRU5PTUVNOworCQorCXRtcCA9IHJlYWRsKG1taW8gKyBBSENJX0dMT0JBTF9DVEwpOworCWlmICh0bXAgJiBBSENJX0VOQUJMRSkgeworCQl0bXAgJj0gfkFIQ0lfRU5BQkxFOworCQl3cml0ZWwodG1wLCBtbWlvICsgQUhDSV9HTE9CQUxfQ1RMKTsKKworCQl0bXAgPSByZWFkbChtbWlvICsgQUhDSV9HTE9CQUxfQ1RMKTsKKwkJaWYgKHRtcCAmIEFIQ0lfRU5BQkxFKQorCQkJcmMgPSAtRUlPOworCX0KKwkKKwlpb3VubWFwKG1taW8pOworCXJldHVybiByYzsKK30KKworLyoqCisgKglwaWl4X2luaXRfb25lIC0gUmVnaXN0ZXIgUElJWCBBVEEgUENJIGRldmljZSB3aXRoIGtlcm5lbCBzZXJ2aWNlcworICoJQHBkZXY6IFBDSSBkZXZpY2UgdG8gcmVnaXN0ZXIKKyAqCUBlbnQ6IEVudHJ5IGluIHBpaXhfcGNpX3RibCBtYXRjaGluZyB3aXRoIEBwZGV2CisgKgorICoJQ2FsbGVkIGZyb20ga2VybmVsIFBDSSBsYXllci4gIFdlIHByb2JlIGZvciBjb21iaW5lZCBtb2RlIChzaWdoKSwKKyAqCWFuZCB0aGVuIGhhbmQgb3ZlciBjb250cm9sIHRvIGxpYmF0YSwgZm9yIGl0IHRvIGRvIHRoZSByZXN0LgorICoKKyAqCUxPQ0tJTkc6CisgKglJbmhlcml0ZWQgZnJvbSBQQ0kgbGF5ZXIgKG1heSBzbGVlcCkuCisgKgorICoJUkVUVVJOUzoKKyAqCVplcm8gb24gc3VjY2Vzcywgb3IgLUVSUk5PIHZhbHVlLgorICovCisKK3N0YXRpYyBpbnQgcGlpeF9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mb1syXTsKKwl1bnNpZ25lZCBpbnQgY29tYmluZWQgPSAwLCBuX3BvcnRzID0gMTsKKwl1bnNpZ25lZCBpbnQgcGF0YV9jaGFuID0gMCwgc2F0YV9jaGFuID0gMDsKKworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCisJLyogbm8gaG90cGx1Z2dpbmcgc3VwcG9ydCAoRklYTUUpICovCisJaWYgKCFpbl9tb2R1bGVfaW5pdCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwb3J0X2luZm9bMF0gPSAmcGlpeF9wb3J0X2luZm9bZW50LT5kcml2ZXJfZGF0YV07CisJcG9ydF9pbmZvWzFdID0gTlVMTDsKKworCWlmIChwb3J0X2luZm9bMF0tPmhvc3RfZmxhZ3MgJiBQSUlYX0ZMQUdfQUhDSSkgeworCQlpbnQgcmMgPSBwaWl4X2Rpc2FibGVfYWhjaShwZGV2KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KKworCWlmIChwb3J0X2luZm9bMF0tPmhvc3RfZmxhZ3MgJiBQSUlYX0ZMQUdfQ09NQklORUQpIHsKKwkJdTggdG1wOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBJQ0g1X1BNUiwgJnRtcCk7CisKKwkJaWYgKHRtcCAmIFBJSVhfQ09NQikgeworCQkJY29tYmluZWQgPSAxOworCQkJaWYgKHRtcCAmIFBJSVhfQ09NQl9QQVRBX1AwKQorCQkJCXNhdGFfY2hhbiA9IDE7CisJCQllbHNlCisJCQkJcGF0YV9jaGFuID0gMTsKKwkJfQorCX0KKworCS8qIE9uIElDSDUsIHNvbWUgQklPU2VuIGRpc2FibGUgdGhlIGludGVycnVwdCB1c2luZyB0aGUKKwkgKiBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUgYml0IGFkZGVkIGluIFBDSSAyLjMuCisJICogT24gSUNINiwgdGhpcyBiaXQgaGFzIHRoZSBzYW1lIGVmZmVjdCwgYnV0IG9ubHkgd2hlbgorCSAqIE1TSSBpcyBkaXNhYmxlZCAoYW5kIGl0IGlzIGRpc2FibGVkLCBhcyB3ZSBkb24ndCB1c2UKKwkgKiBtZXNzYWdlLXNpZ25hbGxlZCBpbnRlcnJ1cHRzIGN1cnJlbnRseSkuCisJICovCisJaWYgKHBvcnRfaW5mb1swXS0+aG9zdF9mbGFncyAmIFBJSVhfRkxBR19DSEVDS0lOVFIpCisJCXBjaV9lbmFibGVfaW50eChwZGV2KTsKKworCWlmIChjb21iaW5lZCkgeworCQlwb3J0X2luZm9bc2F0YV9jaGFuXSA9ICZwaWl4X3BvcnRfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXTsKKwkJcG9ydF9pbmZvW3NhdGFfY2hhbl0tPmhvc3RfZmxhZ3MgfD0gQVRBX0ZMQUdfU0xBVkVfUE9TUzsKKwkJcG9ydF9pbmZvW3BhdGFfY2hhbl0gPSAmcGlpeF9wb3J0X2luZm9baWNoNV9wYXRhXTsKKwkJbl9wb3J0cysrOworCisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogY29tYmluZWQgbW9kZSBkZXRlY3RlZFxuIik7CisJfQorCisJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcG9ydF9pbmZvLCBuX3BvcnRzKTsKK30KKworLyoqCisgKglwaWl4X2luaXQgLQorICoKKyAqCUxPQ0tJTkc6CisgKgorICoJUkVUVVJOUzoKKyAqCisgKi8KKworc3RhdGljIGludCBfX2luaXQgcGlpeF9pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJRFBSSU5USygicGNpX21vZHVsZV9pbml0XG4iKTsKKwlyYyA9IHBjaV9tb2R1bGVfaW5pdCgmcGlpeF9wY2lfZHJpdmVyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWluX21vZHVsZV9pbml0ID0gMDsKKworCURQUklOVEsoImRvbmVcbiIpOworCXJldHVybiAwOworfQorCisvKioKKyAqCXBpaXhfZXhpdCAtCisgKgorICoJTE9DS0lORzoKKyAqCisgKi8KKworc3RhdGljIHZvaWQgX19leGl0IHBpaXhfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcGlpeF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGlpeF9pbml0KTsKK21vZHVsZV9leGl0KHBpaXhfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hdGFyaV9OQ1I1MzgwLmMgYi9kcml2ZXJzL3Njc2kvYXRhcmlfTkNSNTM4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMWU3OGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXRhcmlfTkNSNTM4MC5jCkBAIC0wLDAgKzEsMjk4NiBAQAorLyogCisgKiBOQ1IgNTM4MCBnZW5lcmljIGRyaXZlciByb3V0aW5lcy4gIFRoZXNlIHNob3VsZCBtYWtlIGl0ICp0cml2aWFsKgorICogCXRvIGltcGxlbWVudCA1MzgwIFNDU0kgZHJpdmVycyB1bmRlciBMaW51eCB3aXRoIGEgbm9uLXRyYW50b3IKKyAqCWFyY2hpdGVjdHVyZS4KKyAqCisgKglOb3RlIHRoYXQgdGhlc2Ugcm91dGluZXMgYWxzbyB3b3JrIHdpdGggTlI1M2M0MDAgZmFtaWx5IGNoaXBzLgorICoKKyAqIENvcHlyaWdodCAxOTkzLCBEcmV3IEVja2hhcmR0CisgKglWaXNpb25hcnkgQ29tcHV0aW5nIAorICoJKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyAqIAlkcmV3QGNvbG9yYWRvLmVkdQorICoJKzEgKDMwMykgNjY2LTU4MzYKKyAqCisgKiBESVNUUklCVVRJT04gUkVMRUFTRSA2LiAKKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKgorICogTkNSIDUzODAgRmFtaWx5CisgKiBTQ1NJIFByb3RvY29sIENvbnRyb2xsZXIKKyAqIERhdGFib29rCisgKgorICogTkNSIE1pY3JvZWxlY3Ryb25pY3MKKyAqIDE2MzUgQWVyb3BsYXphIERyaXZlCisgKiBDb2xvcmFkbyBTcHJpbmdzLCBDTyA4MDkxNgorICogMSsgKDcxOSkgNTc4LTM0MDAKKyAqIDErICg4MDApIDMzNC01NDU0CisgKi8KKworLyoKKyAqICsrcm9tYW46IFRvIHBvcnQgdGhlIDUzODAgZHJpdmVyIHRvIHRoZSBBdGFyaSwgSSBoYWQgdG8gZG8gc29tZSBjaGFuZ2VzIGluCisgKiB0aGlzIGZpbGUsIHRvbzoKKyAqCisgKiAgLSBTb21lIG9mIHRoZSBkZWJ1ZyBzdGF0ZW1lbnRzIHdlcmUgaW5jb3JyZWN0ICh1bmRlZmluZWQgdmFyaWFibGVzIGFuZCB0aGUKKyAqICAgIGxpa2UpLiBJIGZpeGVkIHRoYXQuCisgKgorICogIC0gSW4gaW5mb3JtYXRpb25fdHJhbnNmZXIoKSwgSSB0aGluayBhICNpZmRlZiB3YXMgd3JvbmcuIExvb2tpbmcgYXQgdGhlCisgKiAgICBwb3NzaWJsZSBETUEgdHJhbnNmZXIgc2l6ZSBzaG91bGQgYWxzbyBoYXBwZW4gZm9yIFJFQUxfRE1BLiBJIGFkZGVkIHRoaXMKKyAqICAgIGluIHRoZSAjaWYgc3RhdGVtZW50LgorICoKKyAqICAtIFdoZW4gdXNpbmcgcmVhbCBETUEsIGluZm9ybWF0aW9uX3RyYW5zZmVyKCkgc2hvdWxkIHJldHVybiBpbiBhIERBVEFPVVQKKyAqICAgIHBoYXNlIGFmdGVyIHN0YXJ0aW5nIHRoZSBETUEuIEl0IGhhcyBub3RoaW5nIG1vcmUgdG8gZG8uCisgKgorICogIC0gVGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgc2hvdWxkIHJ1biBtYWluIGFmdGVyIGVuZCBvZiBETUEsIHRvbyAobm90CisgKiAgICBvbmx5IGFmdGVyIFJFU0VMRUNUSU9OIGludGVycnVwdHMpLiBBZGRpdGlvbmFsbHksIGl0IHNob3VsZCBfbm90XyB0ZXN0CisgKiAgICBmb3IgbW9yZSBpbnRlcnJ1cHRzIGFmdGVyIHJ1bm5pbmcgbWFpbiwgc2luY2UgYSBETUEgcHJvY2VzcyBtYXkgaGF2ZQorICogICAgYmVlbiBzdGFydGVkIGFuZCBpbnRlcnJ1cHRzIGFyZSB0dXJuZWQgb24gbm93LiBUaGUgbmV3IGludCBjb3VsZCBoYXBwZW4KKyAqICAgIGluc2lkZSB0aGUgZXhlY3V0aW9uIG9mIE5DUjUzODBfaW50cigpLCBsZWFkaW5nIHRvIHJlY3Vyc2l2ZQorICogICAgY2FsbHMuCisgKgorICogIC0gSSd2ZSBhZGRlZCBhIGZ1bmN0aW9uIG1lcmdlX2NvbnRpZ3VvdXNfYnVmZmVycygpIHRoYXQgdHJpZXMgdG8KKyAqICAgIG1lcmdlIHNjYXR0ZXItZ2F0aGVyIGJ1ZmZlcnMgdGhhdCBhcmUgbG9jYXRlZCBhdCBjb250aWd1b3VzCisgKiAgICBwaHlzaWNhbCBhZGRyZXNzZXMgYW5kIGNhbiBiZSBwcm9jZXNzZWQgd2l0aCB0aGUgc2FtZSBETUEgc2V0dXAuCisgKiAgICBTaW5jZSBtb3N0IHNjYXR0ZXItZ2F0aGVyIG9wZXJhdGlvbnMgd29yayBvbiBhIHBhZ2UgKDRLKSBvZgorICogICAgNCBidWZmZXJzICgxSyksIGluIG1vcmUgdGhhbiA5MCUgb2YgYWxsIGNhc2VzIHRocmVlIGludGVycnVwdHMgYW5kCisgKiAgICBETUEgc2V0dXAgYWN0aW9ucyBhcmUgc2F2ZWQuCisgKgorICogLSBJJ3ZlIGRlbGV0ZWQgYWxsIHRoZSBzdHVmZiBmb3IgQVVUT1BST0JFX0lSUSwgUkVBTF9ETUFfUE9MTCwgUFNFVURPX0RNQQorICogICAgYW5kIFVTTEVFUCwgYmVjYXVzZSB0aGVzZSB3ZXJlIG1lc3NpbmcgdXAgcmVhZGFiaWxpdHkgYW5kIHdpbGwgbmV2ZXIgYmUKKyAqICAgIG5lZWRlZCBmb3IgQXRhcmkgU0NTSS4KKyAqIAorICogLSBJJ3ZlIHJldmlzZWQgdGhlIE5DUjUzODBfbWFpbigpIGNhbGxpbmcgc2NoZW1lIChyZWxheCB0aGUgJ21haW5fcnVubmluZycKKyAqICAgc3R1ZmYpLCBhbmQgJ21haW4nIGlzIGV4ZWN1dGVkIGluIGEgYm90dG9tIGhhbGYgaWYgYXdva2VuIGJ5IGFuCisgKiAgIGludGVycnVwdC4KKyAqCisgKiAtIFRoZSBjb2RlIHdhcyBxdWl0ZSBjbHV0dGVyZWQgdXAgYnkgIiNpZiAoTkRFQlVHICYgTkRFQlVHXyopIHByaW50ay4uLiIKKyAqICAgY29uc3RydWN0cy4gSW4gbXkgZXllcywgdGhpcyBtYWRlIHRoZSBzb3VyY2UgcmF0aGVyIHVucmVhZGFibGUsIHNvIEkKKyAqICAgZmluYWxseSByZXBsYWNlZCB0aGF0IGJ5IHRoZSAqX1BSSU5USygpIG1hY3Jvcy4KKyAqCisgKi8KKworLyoKKyAqIEZ1cnRoZXIgZGV2ZWxvcG1lbnQgLyB0ZXN0aW5nIHRoYXQgc2hvdWxkIGJlIGRvbmUgOiAKKyAqIDEuICBUZXN0IGxpbmtlZCBjb21tYW5kIGhhbmRsaW5nIGNvZGUgYWZ0ZXIgRXJpYyBpcyByZWFkeSB3aXRoIAorICogICAgIHRoZSBoaWdoIGxldmVsIGNvZGUuCisgKi8KKworI2lmIChOREVCVUcgJiBOREVCVUdfTElTVFMpCisjZGVmaW5lIExJU1QoeCx5KSBcCisgIHsgcHJpbnRrKCJMSU5FOiVkICAgQWRkaW5nICVwIHRvICVwXG4iLCBfX0xJTkVfXywgKHZvaWQqKSh4KSwgKHZvaWQqKSh5KSk7IFwKKyAgICBpZiAoKHgpPT0oeSkpIHVkZWxheSg1KTsgfQorI2RlZmluZSBSRU1PVkUodyx4LHkseikgXAorICB7IHByaW50aygiTElORTolZCAgIFJlbW92aW5nOiAlcC0+JXAgICVwLT4lcCBcbiIsIF9fTElORV9fLCBcCisJICAgKHZvaWQqKSh3KSwgKHZvaWQqKSh4KSwgKHZvaWQqKSh5KSwgKHZvaWQqKSh6KSk7IFwKKyAgICBpZiAoKHgpPT0oeSkpIHVkZWxheSg1KTsgfQorI2Vsc2UKKyNkZWZpbmUgTElTVCh4LHkpCisjZGVmaW5lIFJFTU9WRSh3LHgseSx6KQorI2VuZGlmCisKKyNpZm5kZWYgbm90eWV0CisjdW5kZWYgTElOS0VECisjZW5kaWYKKworLyoKKyAqIERlc2lnbgorICogSXNzdWVzIDoKKyAqCisgKiBUaGUgb3RoZXIgTGludXggU0NTSSBkcml2ZXJzIHdlcmUgd3JpdHRlbiB3aGVuIExpbnV4IHdhcyBJbnRlbCBQQy1vbmx5LAorICogYW5kIHNwZWNpZmljYWxseSBmb3IgZWFjaCBib2FyZCByYXRoZXIgdGhhbiBlYWNoIGNoaXAuICBUaGlzIG1ha2VzIHRoZWlyCisgKiBhZGFwdGF0aW9uIHRvIHBsYXRmb3JtcyBsaWtlIHRoZSBNYWMgKFNvbWUgb2Ygd2hpY2ggdXNlIE5DUjUzODAncykKKyAqIG1vcmUgZGlmZmljdWx0IHRoYW4gaXQgaGFzIHRvIGJlLgorICoKKyAqIEFsc28sIG1hbnkgb2YgdGhlIFNDU0kgZHJpdmVycyB3ZXJlIHdyaXR0ZW4gYmVmb3JlIHRoZSBjb21tYW5kIHF1ZXVpbmcKKyAqIHJvdXRpbmVzIHdlcmUgaW1wbGVtZW50ZWQsIG1lYW5pbmcgdGhlaXIgaW1wbGVtZW50YXRpb25zIG9mIHF1ZXVlZCAKKyAqIGNvbW1hbmRzIHdlcmUgaGFja2VkIG9uIHJhdGhlciB0aGFuIGRlc2lnbmVkIGluIGZyb20gdGhlIHN0YXJ0LgorICoKKyAqIFdoZW4gSSBkZXNpZ25lZCB0aGUgTGludXggU0NTSSBkcml2ZXJzIEkgZmlndXJlZCB0aGF0IAorICogd2hpbGUgaGF2aW5nIHR3byBkaWZmZXJlbnQgU0NTSSBib2FyZHMgaW4gYSBzeXN0ZW0gbWlnaHQgYmUgdXNlZnVsCisgKiBmb3IgZGVidWdnaW5nIHRoaW5ncywgdHdvIG9mIHRoZSBzYW1lIHR5cGUgd291bGRuJ3QgYmUgdXNlZC4KKyAqIFdlbGwsIEkgd2FzIHdyb25nIGFuZCBhIG51bWJlciBvZiB1c2VycyBoYXZlIG1haWxlZCBtZSBhYm91dCBydW5uaW5nCisgKiBtdWx0aXBsZSBoaWdoLXBlcmZvcm1hbmNlIFNDU0kgYm9hcmRzIGluIGEgc2VydmVyLgorICoKKyAqIEZpbmFsbHksIHdoZW4gSSBnZXQgcXVlc3Rpb25zIGZyb20gdXNlcnMsIEkgaGF2ZSBubyBpZGVhIHdoYXQgCisgKiByZXZpc2lvbiBvZiBteSBkcml2ZXIgdGhleSBhcmUgcnVubmluZy4KKyAqCisgKiBUaGlzIGRyaXZlciBhdHRlbXB0cyB0byBhZGRyZXNzIHRoZXNlIHByb2JsZW1zIDoKKyAqIFRoaXMgaXMgYSBnZW5lcmljIDUzODAgZHJpdmVyLiAgVG8gdXNlIGl0IG9uIGEgZGlmZmVyZW50IHBsYXRmb3JtLCAKKyAqIG9uZSBzaW1wbHkgd3JpdGVzIGFwcHJvcHJpYXRlIHN5c3RlbSBzcGVjaWZpYyBtYWNyb3MgKGllLCBkYXRhCisgKiB0cmFuc2ZlciAtIHNvbWUgUEMncyB3aWxsIHVzZSB0aGUgSS9PIGJ1cywgNjhLJ3MgbXVzdCB1c2UgCisgKiBtZW1vcnkgbWFwcGVkKSBhbmQgZHJvcHMgdGhpcyBmaWxlIGluIHRoZWlyICdDJyB3cmFwcGVyLgorICoKKyAqIEFzIGZhciBhcyBjb21tYW5kIHF1ZXVlaW5nLCB0d28gcXVldWVzIGFyZSBtYWludGFpbmVkIGZvciAKKyAqIGVhY2ggNTM4MCBpbiB0aGUgc3lzdGVtIC0gY29tbWFuZHMgdGhhdCBoYXZlbid0IGJlZW4gaXNzdWVkIHlldCwKKyAqIGFuZCBjb21tYW5kcyB0aGF0IGFyZSBjdXJyZW50bHkgZXhlY3V0aW5nLiAgVGhpcyBtZWFucyB0aGF0IGFuIAorICogdW5saW1pdGVkIG51bWJlciBvZiBjb21tYW5kcyBtYXkgYmUgcXVldWVkLCBsZXR0aW5nIAorICogbW9yZSBjb21tYW5kcyBwcm9wYWdhdGUgZnJvbSB0aGUgaGlnaGVyIGRyaXZlciBsZXZlbHMgZ2l2aW5nIGhpZ2hlciAKKyAqIHRocm91Z2hwdXQuICBOb3RlIHRoYXQgYm90aCBJX1RfTCBhbmQgSV9UX0xfUSBuZXh1c2VzIGFyZSBzdXBwb3J0ZWQsIAorICogYWxsb3dpbmcgbXVsdGlwbGUgY29tbWFuZHMgdG8gcHJvcGFnYXRlIGFsbCB0aGUgd2F5IHRvIGEgU0NTSS1JSSBkZXZpY2UgCisgKiB3aGlsZSBhIGNvbW1hbmQgaXMgYWxyZWFkeSBleGVjdXRpbmcuCisgKgorICogVG8gc29sdmUgdGhlIG11bHRpcGxlLWJvYXJkcy1pbi10aGUtc2FtZS1zeXN0ZW0gcHJvYmxlbSwgCisgKiB0aGVyZSBpcyBhIHNlcGFyYXRlIGluc3RhbmNlIHN0cnVjdHVyZSBmb3IgZWFjaCBpbnN0YW5jZQorICogb2YgYSA1MzgwIGluIHRoZSBzeXN0ZW0uICBTbywgbXVsdGlwbGUgTkNSNTM4MCBkcml2ZXJzIHdpbGwKKyAqIGJlIGFibGUgdG8gY29leGlzdCB3aXRoIGFwcHJvcHJpYXRlIGNoYW5nZXMgdG8gdGhlIGhpZ2ggbGV2ZWwKKyAqIFNDU0kgY29kZS4gIAorICoKKyAqIEEgTkNSNTM4MF9QVUJMSUNfUkVWSVNJT04gbWFjcm8gaXMgcHJvdmlkZWQsIHdpdGggdGhlIHJlbGVhc2UKKyAqIG51bWJlciAodXBkYXRlZCBmb3IgZWFjaCBwdWJsaWMgcmVsZWFzZSkgcHJpbnRlZCBieSB0aGUgCisgKiBOQ1I1MzgwX3ByaW50X29wdGlvbnMgY29tbWFuZCwgd2hpY2ggc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSAKKyAqIHdyYXBwZXIgZGV0ZWN0IGZ1bmN0aW9uLCBzbyB0aGF0IEkga25vdyB3aGF0IHJlbGVhc2Ugb2YgdGhlIGRyaXZlcgorICogdXNlcnMgYXJlIHVzaW5nLgorICoKKyAqIElzc3VlcyBzcGVjaWZpYyB0byB0aGUgTkNSNTM4MCA6IAorICoKKyAqIFdoZW4gdXNlZCBpbiBhIFBJTyBvciBwc2V1ZG8tZG1hIG1vZGUsIHRoZSBOQ1I1MzgwIGlzIGEgYnJhaW5kZWFkIAorICogcGllY2Ugb2YgaGFyZHdhcmUgdGhhdCByZXF1aXJlcyB5b3UgdG8gc2l0IGluIGEgbG9vcCBwb2xsaW5nIGZvciAKKyAqIHRoZSBSRVEgc2lnbmFsIGFzIGxvbmcgYXMgeW91IGFyZSBjb25uZWN0ZWQuICBTb21lIGRldmljZXMgYXJlIAorICogYnJhaW4gZGVhZCAoaWUsIG1hbnkgVEVYRUwgQ0QgUk9NIGRyaXZlcykgYW5kIHdvbid0IGRpc2Nvbm5lY3QgCisgKiB3aGlsZSBkb2luZyBsb25nIHNlZWsgb3BlcmF0aW9ucy4KKyAqIAorICogVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgaXMgdG8ga2VlcCB0cmFjayBvZiBkZXZpY2VzIHRoYXQgaGF2ZQorICogZGlzY29ubmVjdGVkLiAgSWYgdGhlIGRldmljZSBoYXNuJ3QgZGlzY29ubmVjdGVkLCBmb3IgY29tbWFuZHMgdGhhdAorICogc2hvdWxkIGRpc2Nvbm5lY3QsIHdlIGRvIHNvbWV0aGluZyBsaWtlIAorICoKKyAqIHdoaWxlICghUkVRIGlzIGFzc2VydGVkKSB7IHNsZWVwIGZvciBOIHVzZWNzOyBwb2xsIGZvciBNIHVzZWNzIH0KKyAqIAorICogU29tZSB0d2Vha2luZyBvZiBOIGFuZCBNIG5lZWRzIHRvIGJlIGRvbmUuICBBbiBhbGdvcml0aG0gYmFzZWQgCisgKiBvbiAidGltZSB0byBkYXRhIiB3b3VsZCBnaXZlIHRoZSBiZXN0IHJlc3VsdHMgYXMgbG9uZyBhcyBzaG9ydCB0aW1lCisgKiB0byBkYXRhcyAoaWUsIG9uIHRoZSBzYW1lIHRyYWNrKSB3ZXJlIGNvbnNpZGVyZWQsIGhvd2V2ZXIgdGhlc2UgCisgKiBicm9rZW4gZGV2aWNlcyBhcmUgdGhlIGV4Y2VwdGlvbiByYXRoZXIgdGhhbiB0aGUgcnVsZSBhbmQgSSdkIHJhdGhlcgorICogc3BlbmQgbXkgdGltZSBvcHRpbWl6aW5nIGZvciB0aGUgbm9ybWFsIGNhc2UuCisgKgorICogQXJjaGl0ZWN0dXJlIDoKKyAqCisgKiBBdCB0aGUgaGVhcnQgb2YgdGhlIGRlc2lnbiBpcyBhIGNvcm91dGluZSwgTkNSNTM4MF9tYWluLAorICogd2hpY2ggaXMgc3RhcnRlZCB3aGVuIG5vdCBydW5uaW5nIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwKKyAqIHRpbWVyLCBhbmQgcXVldWUgY29tbWFuZCBmdW5jdGlvbi4gIEl0IGF0dGVtcHRzIHRvIGVzdGFibGlzaAorICogSV9UX0wgb3IgSV9UX0xfUSBuZXh1c2VzIGJ5IHJlbW92aW5nIHRoZSBjb21tYW5kcyBmcm9tIHRoZSAKKyAqIGlzc3VlIHF1ZXVlIGFuZCBjYWxsaW5nIE5DUjUzODBfc2VsZWN0KCkgaWYgYSBuZXh1cyAKKyAqIGlzIG5vdCBlc3RhYmxpc2hlZC4gCisgKgorICogT25jZSBhIG5leHVzIGlzIGVzdGFibGlzaGVkLCB0aGUgTkNSNTM4MF9pbmZvcm1hdGlvbl90cmFuc2ZlcigpCisgKiBwaGFzZSBnb2VzIHRocm91Z2ggdGhlIHZhcmlvdXMgcGhhc2VzIGFzIGluc3RydWN0ZWQgYnkgdGhlIHRhcmdldC4KKyAqIGlmIHRoZSB0YXJnZXQgZ29lcyBpbnRvIE1TRyBJTiBhbmQgc2VuZHMgYSBESVNDT05ORUNUIG1lc3NhZ2UsCisgKiB0aGUgY29tbWFuZCBzdHJ1Y3R1cmUgaXMgcGxhY2VkIGludG8gdGhlIHBlciBpbnN0YW5jZSBkaXNjb25uZWN0ZWQKKyAqIHF1ZXVlLCBhbmQgTkNSNTM4MF9tYWluIHRyaWVzIHRvIGZpbmQgbW9yZSB3b3JrLiAgSWYgVVNMRUVQCisgKiB3YXMgZGVmaW5lZCwgYW5kIHRoZSB0YXJnZXQgaXMgaWRsZSBmb3IgdG9vIGxvbmcsIHRoZSBzeXN0ZW0KKyAqIHdpbGwgdHJ5IHRvIHNsZWVwLgorICoKKyAqIElmIGEgY29tbWFuZCBoYXMgZGlzY29ubmVjdGVkLCBldmVudHVhbGx5IGFuIGludGVycnVwdCB3aWxsIHRyaWdnZXIsCisgKiBjYWxsaW5nIE5DUjUzODBfaW50cigpICB3aGljaCB3aWxsIGluIHR1cm4gY2FsbCBOQ1I1MzgwX3Jlc2VsZWN0CisgKiB0byByZWVzdGFibGlzaCBhIG5leHVzLiAgVGhpcyB3aWxsIHJ1biBtYWluIGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBPbiBjb21tYW5kIHRlcm1pbmF0aW9uLCB0aGUgZG9uZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhcyAKKyAqIGFwcHJvcHJpYXRlLgorICoKKyAqIFNDU0kgcG9pbnRlcnMgYXJlIG1haW50YWluZWQgaW4gdGhlIFNDcCBmaWVsZCBvZiBTQ1NJIGNvbW1hbmQgCisgKiBzdHJ1Y3R1cmVzLCBiZWluZyBpbml0aWFsaXplZCBhZnRlciB0aGUgY29tbWFuZCBpcyBjb25uZWN0ZWQKKyAqIGluIE5DUjUzODBfc2VsZWN0LCBhbmQgc2V0IGFzIGFwcHJvcHJpYXRlIGluIE5DUjUzODBfaW5mb3JtYXRpb25fdHJhbnNmZXIuCisgKiBOb3RlIHRoYXQgaW4gdmlvbGF0aW9uIG9mIHRoZSBzdGFuZGFyZCwgYW4gaW1wbGljaXQgU0FWRSBQT0lOVEVSUyBvcGVyYXRpb24KKyAqIGlzIGRvbmUsIHNpbmNlIHNvbWUgQlJPS0VOIGRpc2tzIGZhaWwgdG8gaXNzdWUgYW4gZXhwbGljaXQgU0FWRSBQT0lOVEVSUy4KKyAqLworCisvKgorICogVXNpbmcgdGhpcyBmaWxlIDoKKyAqIFRoaXMgZmlsZSBhIHNrZWxldG9uIExpbnV4IFNDU0kgZHJpdmVyIGZvciB0aGUgTkNSIDUzODAgc2VyaWVzCisgKiBvZiBjaGlwcy4gIFRvIHVzZSBpdCwgeW91IHdyaXRlIGFuIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBmdW5jdGlvbnMgCisgKiBhbmQgbWFjcm9zIGFuZCBpbmNsdWRlIHRoaXMgZmlsZSBpbiB5b3VyIGRyaXZlci4KKyAqCisgKiBUaGVzZSBtYWNyb3MgY29udHJvbCBvcHRpb25zIDogCisgKiBBVVRPU0VOU0UgLSBpZiBkZWZpbmVkLCBSRVFVRVNUIFNFTlNFIHdpbGwgYmUgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkKKyAqCWZvciBjb21tYW5kcyB0aGF0IHJldHVybiB3aXRoIGEgQ0hFQ0sgQ09ORElUSU9OIHN0YXR1cy4gCisgKgorICogTElOS0VEIC0gaWYgZGVmaW5lZCwgbGlua2VkIGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQuCisgKgorICogUkVBTF9ETUEgLSBpZiBkZWZpbmVkLCBSRUFMIERNQSBpcyB1c2VkIGR1cmluZyB0aGUgZGF0YSB0cmFuc2ZlciBwaGFzZXMuCisgKgorICogU1VQUE9SVF9UQUdTIC0gaWYgZGVmaW5lZCwgU0NTSS0yIHRhZ2dlZCBxdWV1aW5nIGlzIHVzZWQgd2hlcmUgcG9zc2libGUKKyAqCisgKiBUaGVzZSBtYWNyb3MgTVVTVCBiZSBkZWZpbmVkIDoKKyAqIAorICogTkNSNTM4MF9yZWFkKHJlZ2lzdGVyKSAgLSByZWFkIGZyb20gdGhlIHNwZWNpZmllZCByZWdpc3RlcgorICoKKyAqIE5DUjUzODBfd3JpdGUocmVnaXN0ZXIsIHZhbHVlKSAtIHdyaXRlIHRvIHRoZSBzcGVjaWZpYyByZWdpc3RlciAKKyAqCisgKiBFaXRoZXIgcmVhbCBETUEgKm9yKiBwc2V1ZG8gRE1BIG1heSBiZSBpbXBsZW1lbnRlZAorICogUkVBTCBmdW5jdGlvbnMgOiAKKyAqIE5DUjUzODBfUkVBTF9ETUEgc2hvdWxkIGJlIGRlZmluZWQgaWYgcmVhbCBETUEgaXMgdG8gYmUgdXNlZC4KKyAqIE5vdGUgdGhhdCB0aGUgRE1BIHNldHVwIGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgCisgKgl0aGF0IHRoZXkgd2VyZSBhYmxlIHRvIHByb2dyYW0gdGhlIGNvbnRyb2xsZXIgZm9yLgorICoKKyAqIEFsc28gbm90ZSB0aGF0IGdlbmVyaWMgaTM4Ni9QQyB2ZXJzaW9ucyBvZiB0aGVzZSBtYWNyb3MgYXJlIAorICoJYXZhaWxhYmxlIGFzIE5DUjUzODBfaTM4Nl9kbWFfd3JpdGVfc2V0dXAsCisgKglOQ1I1MzgwX2kzODZfZG1hX3JlYWRfc2V0dXAsIGFuZCBOQ1I1MzgwX2kzODZfZG1hX3Jlc2lkdWFsLgorICoKKyAqIE5DUjUzODBfZG1hX3dyaXRlX3NldHVwKGluc3RhbmNlLCBzcmMsIGNvdW50KSAtIGluaXRpYWxpemUKKyAqIE5DUjUzODBfZG1hX3JlYWRfc2V0dXAoaW5zdGFuY2UsIGRzdCwgY291bnQpIC0gaW5pdGlhbGl6ZQorICogTkNSNTM4MF9kbWFfcmVzaWR1YWwoaW5zdGFuY2UpOyAtIHJlc2lkdWFsIGNvdW50CisgKgorICogUFNFVURPIGZ1bmN0aW9ucyA6CisgKiBOQ1I1MzgwX3B3cml0ZShpbnN0YW5jZSwgc3JjLCBjb3VudCkKKyAqIE5DUjUzODBfcHJlYWQoaW5zdGFuY2UsIGRzdCwgY291bnQpOworICoKKyAqIElmIG5vdGhpbmcgc3BlY2lmaWMgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbiBuZWVkcyBkb2luZyAoaWUsIHdpdGggZXh0ZXJuYWwKKyAqIGhhcmR3YXJlKSwgeW91IG11c3QgYWxzbyBkZWZpbmUgCisgKiAgCisgKiBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQKKyAqIE5DUjUzODBfcmVzZXQKKyAqIE5DUjUzODBfYWJvcnQKKyAqIE5DUjUzODBfcHJvY19pbmZvCisgKgorICogdG8gYmUgdGhlIGdsb2JhbCBlbnRyeSBwb2ludHMgaW50byB0aGUgc3BlY2lmaWMgZHJpdmVyLCBpZSAKKyAqICNkZWZpbmUgTkNSNTM4MF9xdWV1ZV9jb21tYW5kIHQxMjhfcXVldWVfY29tbWFuZC4KKyAqCisgKiBJZiB0aGlzIGlzIG5vdCBkb25lLCB0aGUgcm91dGluZXMgd2lsbCBiZSBkZWZpbmVkIGFzIHN0YXRpYyBmdW5jdGlvbnMKKyAqIHdpdGggdGhlIE5DUjUzODAqIG5hbWVzIGFuZCB0aGUgdXNlciBtdXN0IHByb3ZpZGUgYSBnbG9iYWxseQorICogYWNjZXNzaWJsZSB3cmFwcGVyIGZ1bmN0aW9uLgorICoKKyAqIFRoZSBnZW5lcmljIGRyaXZlciBpcyBpbml0aWFsaXplZCBieSBjYWxsaW5nIE5DUjUzODBfaW5pdChpbnN0YW5jZSksCisgKiBhZnRlciBzZXR0aW5nIHRoZSBhcHByb3ByaWF0ZSBob3N0IHNwZWNpZmljIGZpZWxkcyBhbmQgSUQuICBJZiB0aGUgCisgKiBkcml2ZXIgd2lzaGVzIHRvIGF1dG9wcm9iZSBmb3IgYW4gSVJRIGxpbmUsIHRoZSBOQ1I1MzgwX3Byb2JlX2lycShpbnN0YW5jZSwKKyAqIHBvc3NpYmxlKSBmdW5jdGlvbiBtYXkgYmUgdXNlZC4gIEJlZm9yZSB0aGUgc3BlY2lmaWMgZHJpdmVyIGluaXRpYWxpemF0aW9uCisgKiBjb2RlIGZpbmlzaGVzLCBOQ1I1MzgwX3ByaW50X29wdGlvbnMgc2hvdWxkIGJlIGNhbGxlZC4KKyAqLworCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqZmlyc3RfaW5zdGFuY2UgPSBOVUxMOworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSAqdGhlX3RlbXBsYXRlID0gTlVMTDsKKworLyogTWFjcm9zIGVhc2UgbGlmZS4uLiA6LSkgKi8KKyNkZWZpbmUJU0VUVVBfSE9TVERBVEEoaW4pCQkJCVwKKyAgICBzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPQkJCVwKKwkoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKikoaW4pLT5ob3N0ZGF0YQorI2RlZmluZQlIT1NUREFUQShpbikgKChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKShpbiktPmhvc3RkYXRhKQorCisjZGVmaW5lCU5FWFQoY21kKQkoKFNjc2lfQ21uZCAqKSgoY21kKS0+aG9zdF9zY3JpYmJsZSkpCisjZGVmaW5lCU5FWFRBRERSKGNtZCkJKChTY3NpX0NtbmQgKiopJigoY21kKS0+aG9zdF9zY3JpYmJsZSkpCisKKyNkZWZpbmUJSE9TVE5PCQlpbnN0YW5jZS0+aG9zdF9ubworI2RlZmluZQlIX05PKGNtZCkJKGNtZCktPmRldmljZS0+aG9zdC0+aG9zdF9ubworCisjaWZkZWYgU1VQUE9SVF9UQUdTCisKKy8qCisgKiBGdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHRhZ2dlZCBxdWV1aW5nCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogKytyb21hbiAoMDEvOTYpOiBOb3cgSSd2ZSBpbXBsZW1lbnRlZCBTQ1NJLTIgdGFnZ2VkIHF1ZXVpbmcuIFNvbWUgbm90ZXM6CisgKgorICogVXNpbmcgY29uc2VjdXRpdmUgbnVtYmVycyBmb3IgdGhlIHRhZ3MgaXMgbm8gZ29vZCBpZGVhIGluIG15IGV5ZXMuIFRoZXJlCisgKiBjb3VsZCBiZSB3cm9uZyByZS11c2luZ3MgaWYgdGhlIGNvdW50ZXIgKDggYml0ISkgd3JhcHMgYW5kIHNvbWUgZWFybHkKKyAqIGNvbW1hbmQgaGFzIGJlZW4gcHJlZW1wdGVkIGZvciBhIGxvbmcgdGltZS4gTXkgc29sdXRpb246IGEgYml0ZmllbGQgZm9yCisgKiByZW1lbWJlcmluZyB1c2VkIHRhZ3MuCisgKgorICogVGhlcmUncyBhbHNvIHRoZSBwcm9ibGVtIHRoYXQgZWFjaCB0YXJnZXQgaGFzIGEgY2VydGFpbiBxdWV1ZSBzaXplLCBidXQgd2UKKyAqIGNhbm5vdCBrbm93IGl0IGluIGFkdmFuY2UgOi0oIFdlIGp1c3Qgc2VlIGEgUVVFVUVfRlVMTCBzdGF0dXMgYmVpbmcKKyAqIHJldHVybmVkLiBTbywgaW4gdGhpcyBjYXNlLCB0aGUgZHJpdmVyIGludGVybmFsIHF1ZXVlIHNpemUgYXNzdW1wdGlvbiBpcworICogcmVkdWNlZCB0byB0aGUgbnVtYmVyIG9mIGFjdGl2ZSB0YWdzIGlmIFFVRVVFX0ZVTEwgaXMgcmV0dXJuZWQgYnkgdGhlCisgKiB0YXJnZXQuIFRoZSBjb21tYW5kIGlzIHJldHVybmVkIHRvIHRoZSBtaWQtbGV2ZWwsIGJ1dCB3aXRoIHN0YXR1cyBjaGFuZ2VkCisgKiB0byBCVVNZLCBzaW5jZSAtLWFzIEkndmUgc2Vlbi0tIHRoZSBtaWQtbGV2ZWwgY2FuJ3QgaGFuZGxlIFFVRVVFX0ZVTEwKKyAqIGNvcnJlY3RseS4KKyAqCisgKiBXZSdyZSBhbHNvIG5vdCBhbGxvd2VkIHJ1bm5pbmcgdGFnZ2VkIGNvbW1hbmRzIGFzIGxvbmcgYXMgYW4gdW50YWdnZWQKKyAqIGNvbW1hbmQgaXMgYWN0aXZlLiBBbmQgUkVRVUVTVCBTRU5TRSBjb21tYW5kcyBhZnRlciBhIGNvbnRpbmdlbnQgYWxsZWdpYW5jZQorICogY29uZGl0aW9uIF9tdXN0XyBiZSB1bnRhZ2dlZC4gVG8ga2VlcCB0cmFjayB3aGV0aGVyIGFuIHVudGFnZ2VkIGNvbW1hbmQgaGFzCisgKiBiZWVuIGlzc3VlZCwgdGhlIGhvc3QtPmJ1c3kgYXJyYXkgaXMgc3RpbGwgZW1wbG95ZWQsIGFzIGl0IGlzIHdpdGhvdXQKKyAqIHN1cHBvcnQgZm9yIHRhZ2dlZCBxdWV1aW5nLgorICoKKyAqIE9uZSBjb3VsZCBzdXNwZWN0IHRoYXQgdGhlcmUgYXJlIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9ucyBiZXR3ZWVuCisgKiBpc19sdW5fYnVzeSgpLCBjbWRfZ2V0X3RhZygpIGFuZCBjbWRfZnJlZV90YWcoKS4gQnV0IEkgdGhpbmsgdGhpcyBpc24ndCB0aGUKKyAqIGNhc2U6IGlzX2x1bl9idXN5KCkgYW5kIGNtZF9nZXRfdGFnKCkgYXJlIGJvdGggY2FsbGVkIGZyb20gTkNSNTM4MF9tYWluKCksCisgKiB3aGljaCBhbHJlYWR5IGd1YXJhbnRlZWQgdG8gYmUgcnVubmluZyBhdCBtb3N0IG9uY2UuIEl0IGlzIGFsc28gdGhlIG9ubHkKKyAqIHBsYWNlIHdoZXJlIHRhZ3MvTFVOcyBhcmUgYWxsb2NhdGVkLiBTbyBubyBvdGhlciBhbGxvY2F0aW9uIGNhbiBzbGlwCisgKiBiZXR3ZWVuIHRoYXQgcGFpciwgdGhlcmUgY291bGQgb25seSBoYXBwZW4gYSByZXNlbGVjdGlvbiwgd2hpY2ggY2FuIGZyZWUgYQorICogdGFnLCBidXQgdGhhdCBkb2Vzbid0IGh1cnQuIE9ubHkgdGhlIHNlcXVlbmNlIGluIGNtZF9mcmVlX3RhZygpIGJlY29tZXMKKyAqIGltcG9ydGFudDogdGhlIHRhZyBiaXQgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSAnbnJfYWxsb2NhdGVkJyBpcyBkZWNyZWFzZWQuCisgKi8KKworLyogLTEgZm9yIFRBR19OT05FIGlzIG5vdCBwb3NzaWJsZSB3aXRoIHVuc2lnbmVkIGNoYXIgY21kLT50YWcgKi8KKyN1bmRlZiBUQUdfTk9ORQorI2RlZmluZSBUQUdfTk9ORSAweGZmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBERUNMQVJFX0JJVE1BUChhbGxvY2F0ZWQsIE1BWF9UQUdTKTsKKyAgICBpbnQJCW5yX2FsbG9jYXRlZDsKKyAgICBpbnQJCXF1ZXVlX3NpemU7Cit9IFRBR19BTExPQzsKKworc3RhdGljIFRBR19BTExPQyBUYWdBbGxvY1s4XVs4XTsgLyogOCB0YXJnZXRzIGFuZCA4IExVTnMgKi8KKworCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF90YWdzKCB2b2lkICkKK3sKKyAgICBpbnQgdGFyZ2V0LCBsdW47CisgICAgVEFHX0FMTE9DICp0YTsKKyAgICAKKyAgICBpZiAoIXNldHVwX3VzZV90YWdnZWRfcXVldWluZykKKwlyZXR1cm47CisgICAgCisgICAgZm9yKCB0YXJnZXQgPSAwOyB0YXJnZXQgPCA4OyArK3RhcmdldCApIHsKKwlmb3IoIGx1biA9IDA7IGx1biA8IDg7ICsrbHVuICkgeworCSAgICB0YSA9ICZUYWdBbGxvY1t0YXJnZXRdW2x1bl07CisJICAgIGJpdG1hcF96ZXJvKHRhLT5hbGxvY2F0ZWQsIE1BWF9UQUdTKTsKKwkgICAgdGEtPm5yX2FsbG9jYXRlZCA9IDA7CisJICAgIC8qIEF0IHRoZSBiZWdpbm5pbmcsIGFzc3VtZSB0aGUgbWF4aW11bSBxdWV1ZSBzaXplIHdlIGNvdWxkCisJICAgICAqIHN1cHBvcnQgKE1BWF9UQUdTKS4gVGhpcyB2YWx1ZSB3aWxsIGJlIGRlY3JlYXNlZCBpZiB0aGUgdGFyZ2V0CisJICAgICAqIHJldHVybnMgUVVFVUVfRlVMTCBzdGF0dXMuCisJICAgICAqLworCSAgICB0YS0+cXVldWVfc2l6ZSA9IE1BWF9UQUdTOworCX0KKyAgICB9Cit9CisKKworLyogQ2hlY2sgaWYgd2UgY2FuIGlzc3VlIGEgY29tbWFuZCB0byB0aGlzIExVTjogRmlyc3Qgc2VlIGlmIHRoZSBMVU4gaXMgbWFya2VkCisgKiBidXN5IGJ5IGFuIHVudGFnZ2VkIGNvbW1hbmQuIElmIHRoZSBjb21tYW5kIHNob3VsZCB1c2UgdGFnZ2VkIHF1ZXVpbmcsIGFsc28KKyAqIGNoZWNrIHRoYXQgdGhlcmUgaXMgYSBmcmVlIHRhZyBhbmQgdGhlIHRhcmdldCdzIHF1ZXVlIHdvbid0IG92ZXJmbG93LiBUaGlzCisgKiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCB0byBhdm9pZCByYWNlCisgKiBjb25kaXRpb25zLgorICovIAorCitzdGF0aWMgaW50IGlzX2x1bl9idXN5KCBTY3NpX0NtbmQgKmNtZCwgaW50IHNob3VsZF9iZV90YWdnZWQgKQoreworICAgIFNFVFVQX0hPU1REQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KTsKKworICAgIGlmIChob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICYgKDEgPDwgY21kLT5kZXZpY2UtPmx1bikpCisJcmV0dXJuKCAxICk7CisgICAgaWYgKCFzaG91bGRfYmVfdGFnZ2VkIHx8CisJIXNldHVwX3VzZV90YWdnZWRfcXVldWluZyB8fCAhY21kLT5kZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQpCisJcmV0dXJuKCAwICk7CisgICAgaWYgKFRhZ0FsbG9jW2NtZC0+ZGV2aWNlLT5pZF1bY21kLT5kZXZpY2UtPmx1bl0ubnJfYWxsb2NhdGVkID49CisJVGFnQWxsb2NbY21kLT5kZXZpY2UtPmlkXVtjbWQtPmRldmljZS0+bHVuXS5xdWV1ZV9zaXplICkgeworCVRBR19QUklOVEsoICJzY3NpJWQ6IHRhcmdldCAlZCBsdW4gJWQ6IG5vIGZyZWUgdGFnc1xuIiwKKwkJICAgIEhfTk8oY21kKSwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuICk7CisJcmV0dXJuKCAxICk7CisgICAgfQorICAgIHJldHVybiggMCApOworfQorCisKKy8qIEFsbG9jYXRlIGEgdGFnIGZvciBhIGNvbW1hbmQgKHRoZXJlIGFyZSBubyBjaGVja3MgYW55bW9yZSwgY2hlY2tfbHVuX2J1c3koKQorICogbXVzdCBiZSBjYWxsZWQgYmVmb3JlISksIG9yIHJlc2VydmUgdGhlIExVTiBpbiAnYnVzeScgaWYgdGhlIGNvbW1hbmQgaXMKKyAqIHVudGFnZ2VkLgorICovCisKK3N0YXRpYyB2b2lkIGNtZF9nZXRfdGFnKCBTY3NpX0NtbmQgKmNtZCwgaW50IHNob3VsZF9iZV90YWdnZWQgKQoreworICAgIFNFVFVQX0hPU1REQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KTsKKworICAgIC8qIElmIHdlIG9yIHRoZSB0YXJnZXQgZG9uJ3Qgc3VwcG9ydCB0YWdnZWQgcXVldWluZywgYWxsb2NhdGUgdGhlIExVTiBmb3IKKyAgICAgKiBhbiB1bnRhZ2dlZCBjb21tYW5kLgorICAgICAqLworICAgIGlmICghc2hvdWxkX2JlX3RhZ2dlZCB8fAorCSFzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcgfHwgIWNtZC0+ZGV2aWNlLT50YWdnZWRfc3VwcG9ydGVkKSB7CisJY21kLT50YWcgPSBUQUdfTk9ORTsKKwlob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdIHw9ICgxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCVRBR19QUklOVEsoICJzY3NpJWQ6IHRhcmdldCAlZCBsdW4gJWQgbm93IGFsbG9jYXRlZCBieSB1bnRhZ2dlZCAiCisJCSAgICAiY29tbWFuZFxuIiwgSF9OTyhjbWQpLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4gKTsKKyAgICB9CisgICAgZWxzZSB7CisJVEFHX0FMTE9DICp0YSA9ICZUYWdBbGxvY1tjbWQtPmRldmljZS0+aWRdW2NtZC0+ZGV2aWNlLT5sdW5dOworCisJY21kLT50YWcgPSBmaW5kX2ZpcnN0X3plcm9fYml0KCB0YS0+YWxsb2NhdGVkLCBNQVhfVEFHUyApOworCXNldF9iaXQoIGNtZC0+dGFnLCB0YS0+YWxsb2NhdGVkICk7CisJdGEtPm5yX2FsbG9jYXRlZCsrOworCVRBR19QUklOVEsoICJzY3NpJWQ6IHVzaW5nIHRhZyAlZCBmb3IgdGFyZ2V0ICVkIGx1biAlZCAiCisJCSAgICAiKG5vdyAlZCB0YWdzIGluIHVzZSlcbiIsCisJCSAgICBIX05PKGNtZCksIGNtZC0+dGFnLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sCisJCSAgICB0YS0+bnJfYWxsb2NhdGVkICk7CisgICAgfQorfQorCisKKy8qIE1hcmsgdGhlIHRhZyBvZiBjb21tYW5kICdjbWQnIGFzIGZyZWUsIG9yIGluIGNhc2Ugb2YgYW4gdW50YWdnZWQgY29tbWFuZCwKKyAqIHVubG9jayB0aGUgTFVOLgorICovCisKK3N0YXRpYyB2b2lkIGNtZF9mcmVlX3RhZyggU2NzaV9DbW5kICpjbWQgKQoreworICAgIFNFVFVQX0hPU1REQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KTsKKworICAgIGlmIChjbWQtPnRhZyA9PSBUQUdfTk9ORSkgeworCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCVRBR19QUklOVEsoICJzY3NpJWQ6IHRhcmdldCAlZCBsdW4gJWQgdW50YWdnZWQgY21kIGZpbmlzaGVkXG4iLAorCQkgICAgSF9OTyhjbWQpLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4gKTsKKyAgICB9CisgICAgZWxzZSBpZiAoY21kLT50YWcgPj0gTUFYX1RBR1MpIHsKKwlwcmludGsoS0VSTl9OT1RJQ0UgInNjc2klZDogdHJ5aW5nIHRvIGZyZWUgYmFkIHRhZyAlZCFcbiIsCisJCUhfTk8oY21kKSwgY21kLT50YWcgKTsKKyAgICB9CisgICAgZWxzZSB7CisJVEFHX0FMTE9DICp0YSA9ICZUYWdBbGxvY1tjbWQtPmRldmljZS0+aWRdW2NtZC0+ZGV2aWNlLT5sdW5dOworCWNsZWFyX2JpdCggY21kLT50YWcsIHRhLT5hbGxvY2F0ZWQgKTsKKwl0YS0+bnJfYWxsb2NhdGVkLS07CisJVEFHX1BSSU5USyggInNjc2klZDogZnJlZWQgdGFnICVkIGZvciB0YXJnZXQgJWQgbHVuICVkXG4iLAorCQkgICAgSF9OTyhjbWQpLCBjbWQtPnRhZywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuICk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGZyZWVfYWxsX3RhZ3MoIHZvaWQgKQoreworICAgIGludCB0YXJnZXQsIGx1bjsKKyAgICBUQUdfQUxMT0MgKnRhOworCisgICAgaWYgKCFzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcpCisJcmV0dXJuOworICAgIAorICAgIGZvciggdGFyZ2V0ID0gMDsgdGFyZ2V0IDwgODsgKyt0YXJnZXQgKSB7CisJZm9yKCBsdW4gPSAwOyBsdW4gPCA4OyArK2x1biApIHsKKwkgICAgdGEgPSAmVGFnQWxsb2NbdGFyZ2V0XVtsdW5dOworCSAgICBiaXRtYXBfemVybyh0YS0+YWxsb2NhdGVkLCBNQVhfVEFHUyk7CisJICAgIHRhLT5ucl9hbGxvY2F0ZWQgPSAwOworCX0KKyAgICB9Cit9CisKKyNlbmRpZiAvKiBTVVBQT1JUX1RBR1MgKi8KKworCisvKgorICogRnVuY3Rpb246IHZvaWQgbWVyZ2VfY29udGlndW91c19idWZmZXJzKCBTY3NpX0NtbmQgKmNtZCApCisgKgorICogUHVycG9zZTogVHJ5IHRvIG1lcmdlIHNldmVyYWwgc2NhdHRlci1nYXRoZXIgcmVxdWVzdHMgaW50byBvbmUgRE1BCisgKiAgICB0cmFuc2Zlci4gVGhpcyBpcyBwb3NzaWJsZSBpZiB0aGUgc2NhdHRlciBidWZmZXJzIGxpZSBvbgorICogICAgcGh5c2ljYWwgY29udGlndW91cyBhZGRyZXNzZXMuCisgKgorICogUGFyYW1ldGVyczogU2NzaV9DbW5kICpjbWQKKyAqICAgIFRoZSBjb21tYW5kIHRvIHdvcmsgb24uIFRoZSBmaXJzdCBzY2F0dGVyIGJ1ZmZlcidzIGRhdGEgYXJlCisgKiAgICBhc3N1bWVkIHRvIGJlIGFscmVhZHkgdHJhbnNmZXJlZCBpbnRvIHB0ci90aGlzX3Jlc2lkdWFsLgorICovCisKK3N0YXRpYyB2b2lkIG1lcmdlX2NvbnRpZ3VvdXNfYnVmZmVycyggU2NzaV9DbW5kICpjbWQgKQoreworICAgIHVuc2lnbmVkIGxvbmcgZW5kYWRkcjsKKyNpZiAoTkRFQlVHICYgTkRFQlVHX01FUkdJTkcpCisgICAgdW5zaWduZWQgbG9uZyBvbGRsZW4gPSBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsOworICAgIGludAkJICBjbnQgPSAxOworI2VuZGlmCisKKyAgICBmb3IgKGVuZGFkZHIgPSB2aXJ0X3RvX3BoeXMoY21kLT5TQ3AucHRyICsgY21kLT5TQ3AudGhpc19yZXNpZHVhbCAtIDEpICsgMTsKKwkgY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCAmJgorCSB2aXJ0X3RvX3BoeXMocGFnZV9hZGRyZXNzKGNtZC0+U0NwLmJ1ZmZlclsxXS5wYWdlKSsKKwkJICAgICAgY21kLT5TQ3AuYnVmZmVyWzFdLm9mZnNldCkgPT0gZW5kYWRkcjsgKSB7CisJTUVSX1BSSU5USygiVlRPUCglcCkgPT0gJTA4bHggLT4gbWVyZ2luZ1xuIiwKKwkJICAgY21kLT5TQ3AuYnVmZmVyWzFdLmFkZHJlc3MsIGVuZGFkZHIpOworI2lmIChOREVCVUcgJiBOREVCVUdfTUVSR0lORykKKwkrK2NudDsKKyNlbmRpZgorCSsrY21kLT5TQ3AuYnVmZmVyOworCS0tY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbDsKKwljbWQtPlNDcC50aGlzX3Jlc2lkdWFsICs9IGNtZC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCWVuZGFkZHIgKz0gY21kLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisgICAgfQorI2lmIChOREVCVUcgJiBOREVCVUdfTUVSR0lORykKKyAgICBpZiAob2xkbGVuICE9IGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpCisJTUVSX1BSSU5USygibWVyZ2VkICVkIGJ1ZmZlcnMgZnJvbSAlcCwgbmV3IGxlbmd0aCAlMDh4XG4iLAorCQkgICBjbnQsIGNtZC0+U0NwLnB0ciwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7CisjZW5kaWYKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogdm9pZCBpbml0aWFsaXplX1NDcChTY3NpX0NtbmQgKmNtZCkKKyAqCisgKiBQdXJwb3NlIDogaW5pdGlhbGl6ZSB0aGUgc2F2ZWQgZGF0YSBwb2ludGVycyBmb3IgY21kIHRvIHBvaW50IHRvIHRoZSAKKyAqCXN0YXJ0IG9mIHRoZSBidWZmZXIuCisgKgorICogSW5wdXRzIDogY21kIC0gU2NzaV9DbW5kIHN0cnVjdHVyZSB0byBoYXZlIHBvaW50ZXJzIHJlc2V0LgorICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgaW5pdGlhbGl6ZV9TQ3AoU2NzaV9DbW5kICpjbWQpCit7CisgICAgLyogCisgICAgICogSW5pdGlhbGl6ZSB0aGUgU2NzaSBQb2ludGVyIGZpZWxkIHNvIHRoYXQgYWxsIG9mIHRoZSBjb21tYW5kcyBpbiB0aGUgCisgICAgICogdmFyaW91cyBxdWV1ZXMgYXJlIHZhbGlkLgorICAgICAqLworCisgICAgaWYgKGNtZC0+dXNlX3NnKSB7CisJY21kLT5TQ3AuYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBjbWQtPmJ1ZmZlcjsKKwljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gY21kLT51c2Vfc2cgLSAxOworCWNtZC0+U0NwLnB0ciA9IChjaGFyICopcGFnZV9hZGRyZXNzKGNtZC0+U0NwLmJ1ZmZlci0+cGFnZSkrCisJCSAgICAgICBjbWQtPlNDcC5idWZmZXItPm9mZnNldDsKKwljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gY21kLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJLyogKytyb21hbjogVHJ5IHRvIG1lcmdlIHNvbWUgc2NhdHRlci1idWZmZXJzIGlmIHRoZXkgYXJlIGF0CisJICogY29udGlndW91cyBwaHlzaWNhbCBhZGRyZXNzZXMuCisJICovCisJbWVyZ2VfY29udGlndW91c19idWZmZXJzKCBjbWQgKTsKKyAgICB9IGVsc2UgeworCWNtZC0+U0NwLmJ1ZmZlciA9IE5VTEw7CisJY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IDA7CisJY21kLT5TQ3AucHRyID0gKGNoYXIgKikgY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisgICAgfQorfQorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2lmIE5ERUJVRworc3RhdGljIHN0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciBtYXNrOworICAgIGNvbnN0IGNoYXIgKiBuYW1lO30gCitzaWduYWxzW10gPSB7eyBTUl9EQlAsICJQQVJJVFkifSwgeyBTUl9SU1QsICJSU1QiIH0sIHsgU1JfQlNZLCAiQlNZIiB9LCAKKyAgICB7IFNSX1JFUSwgIlJFUSIgfSwgeyBTUl9NU0csICJNU0ciIH0sIHsgU1JfQ0QsICAiQ0QiIH0sIHsgU1JfSU8sICJJTyIgfSwgCisgICAgeyBTUl9TRUwsICJTRUwiIH0sIHswLCBOVUxMfX0sIAorYmFzcnNbXSA9IHt7QkFTUl9BVE4sICJBVE4ifSwge0JBU1JfQUNLLCAiQUNLIn0sIHswLCBOVUxMfX0sCitpY3JzW10gPSB7e0lDUl9BU1NFUlRfUlNULCAiQVNTRVJUIFJTVCJ9LHtJQ1JfQVNTRVJUX0FDSywgIkFTU0VSVCBBQ0sifSwKKyAgICB7SUNSX0FTU0VSVF9CU1ksICJBU1NFUlQgQlNZIn0sIHtJQ1JfQVNTRVJUX1NFTCwgIkFTU0VSVCBTRUwifSwgCisgICAge0lDUl9BU1NFUlRfQVROLCAiQVNTRVJUIEFUTiJ9LCB7SUNSX0FTU0VSVF9EQVRBLCAiQVNTRVJUIERBVEEifSwgCisgICAgezAsIE5VTEx9fSwKK21yc1tdID0ge3tNUl9CTE9DS19ETUFfTU9ERSwgIk1PREUgQkxPQ0sgRE1BIn0sIHtNUl9UQVJHRVQsICJNT0RFIFRBUkdFVCJ9LCAKKyAgICB7TVJfRU5BQkxFX1BBUl9DSEVDSywgIk1PREUgUEFSSVRZIENIRUNLIn0sIHtNUl9FTkFCTEVfUEFSX0lOVFIsIAorICAgICJNT0RFIFBBUklUWSBJTlRSIn0sIHtNUl9FTkFCTEVfRU9QX0lOVFIsIk1PREUgRU9QIElOVFIifSwKKyAgICB7TVJfTU9OSVRPUl9CU1ksICJNT0RFIE1PTklUT1IgQlNZIn0sCisgICAge01SX0RNQV9NT0RFLCAiTU9ERSBETUEifSwge01SX0FSQklUUkFURSwgIk1PREUgQVJCSVRSQVRJT04ifSwgCisgICAgezAsIE5VTEx9fTsKKworLyoKKyAqIEZ1bmN0aW9uIDogdm9pZCBOQ1I1MzgwX3ByaW50KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQorICoKKyAqIFB1cnBvc2UgOiBwcmludCB0aGUgU0NTSSBidXMgc2lnbmFscyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCisgKgorICogSW5wdXQgOiBpbnN0YW5jZSAtIHdoaWNoIE5DUjUzODAKKyAqLworCitzdGF0aWMgdm9pZCBOQ1I1MzgwX3ByaW50KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKSB7CisgICAgdW5zaWduZWQgY2hhciBzdGF0dXMsIGRhdGEsIGJhc3IsIG1yLCBpY3IsIGk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICBkYXRhID0gTkNSNTM4MF9yZWFkKENVUlJFTlRfU0NTSV9EQVRBX1JFRyk7CisgICAgc3RhdHVzID0gTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpOworICAgIG1yID0gTkNSNTM4MF9yZWFkKE1PREVfUkVHKTsKKyAgICBpY3IgPSBOQ1I1MzgwX3JlYWQoSU5JVElBVE9SX0NPTU1BTkRfUkVHKTsKKyAgICBiYXNyID0gTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRyk7CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIHByaW50aygiU1RBVFVTX1JFRzogJTAyeCAiLCBzdGF0dXMpOworICAgIGZvciAoaSA9IDA7IHNpZ25hbHNbaV0ubWFzayA7ICsraSkgCisJaWYgKHN0YXR1cyAmIHNpZ25hbHNbaV0ubWFzaykKKwkgICAgcHJpbnRrKCIsJXMiLCBzaWduYWxzW2ldLm5hbWUpOworICAgIHByaW50aygiXG5CQVNSOiAlMDJ4ICIsIGJhc3IpOworICAgIGZvciAoaSA9IDA7IGJhc3JzW2ldLm1hc2sgOyArK2kpIAorCWlmIChiYXNyICYgYmFzcnNbaV0ubWFzaykKKwkgICAgcHJpbnRrKCIsJXMiLCBiYXNyc1tpXS5uYW1lKTsKKyAgICBwcmludGsoIlxuSUNSOiAlMDJ4ICIsIGljcik7CisgICAgZm9yIChpID0gMDsgaWNyc1tpXS5tYXNrOyArK2kpIAorCWlmIChpY3IgJiBpY3JzW2ldLm1hc2spCisJICAgIHByaW50aygiLCVzIiwgaWNyc1tpXS5uYW1lKTsKKyAgICBwcmludGsoIlxuTU9ERTogJTAyeCAiLCBtcik7CisgICAgZm9yIChpID0gMDsgbXJzW2ldLm1hc2s7ICsraSkgCisJaWYgKG1yICYgbXJzW2ldLm1hc2spCisJICAgIHByaW50aygiLCVzIiwgbXJzW2ldLm5hbWUpOworICAgIHByaW50aygiXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciB2YWx1ZTsKKyAgICBjb25zdCBjaGFyICpuYW1lOworfSBwaGFzZXNbXSA9IHsKKyAgICB7UEhBU0VfREFUQU9VVCwgIkRBVEFPVVQifSwge1BIQVNFX0RBVEFJTiwgIkRBVEFJTiJ9LCB7UEhBU0VfQ01ET1VULCAiQ01ET1VUIn0sCisgICAge1BIQVNFX1NUQVRJTiwgIlNUQVRJTiJ9LCB7UEhBU0VfTVNHT1VULCAiTVNHT1VUIn0sIHtQSEFTRV9NU0dJTiwgIk1TR0lOIn0sCisgICAge1BIQVNFX1VOS05PV04sICJVTktOT1dOIn19OworCisvKiAKKyAqIEZ1bmN0aW9uIDogdm9pZCBOQ1I1MzgwX3ByaW50X3BoYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQorICoKKyAqIFB1cnBvc2UgOiBwcmludCB0aGUgY3VycmVudCBTQ1NJIHBoYXNlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKyAqCisgKiBJbnB1dCA6IGluc3RhbmNlIC0gd2hpY2ggTkNSNTM4MAorICovCisKK3N0YXRpYyB2b2lkIE5DUjUzODBfcHJpbnRfcGhhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisgICAgdW5zaWduZWQgY2hhciBzdGF0dXM7CisgICAgaW50IGk7CisKKyAgICBzdGF0dXMgPSBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRyk7CisgICAgaWYgKCEoc3RhdHVzICYgU1JfUkVRKSkgCisJcHJpbnRrKEtFUk5fREVCVUcgInNjc2klZDogUkVRIG5vdCBhc3NlcnRlZCwgcGhhc2UgdW5rbm93bi5cbiIsIEhPU1ROTyk7CisgICAgZWxzZSB7CisJZm9yIChpID0gMDsgKHBoYXNlc1tpXS52YWx1ZSAhPSBQSEFTRV9VTktOT1dOKSAmJiAKKwkgICAgKHBoYXNlc1tpXS52YWx1ZSAhPSAoc3RhdHVzICYgUEhBU0VfTUFTSykpOyArK2kpOyAKKwlwcmludGsoS0VSTl9ERUJVRyAic2NzaSVkOiBwaGFzZSAlc1xuIiwgSE9TVE5PLCBwaGFzZXNbaV0ubmFtZSk7CisgICAgfQorfQorCisjZWxzZSAvKiAhTkRFQlVHICovCisKKy8qIGR1bW1pZXMuLi4gKi8KK19faW5saW5lX18gdm9pZCBOQ1I1MzgwX3ByaW50KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKSB7IH07CitfX2lubGluZV9fIHZvaWQgTkNSNTM4MF9wcmludF9waGFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkgeyB9OworCisjZW5kaWYKKworLyoKKyAqICsrcm9tYW46IE5ldyBzY2hlbWUgb2YgY2FsbGluZyBOQ1I1MzgwX21haW4oKQorICogCisgKiBJZiB3ZSdyZSBub3QgaW4gYW4gaW50ZXJydXB0LCB3ZSBjYW4gY2FsbCBvdXIgbWFpbiBkaXJlY3RseSwgaXQgY2Fubm90IGJlCisgKiBhbHJlYWR5IHJ1bm5pbmcuIEVsc2UsIHdlIHF1ZXVlIGl0IG9uIGEgdGFzayBxdWV1ZSwgaWYgbm90ICdtYWluX3J1bm5pbmcnCisgKiB0ZWxscyB1cyB0aGF0IGEgbG93ZXIgbGV2ZWwgaXMgYWxyZWFkeSBleGVjdXRpbmcgaXQuIFRoaXMgd2F5LAorICogJ21haW5fcnVubmluZycgbmVlZHMgbm90IGJlIHByb3RlY3RlZCBpbiBhIHNwZWNpYWwgd2F5LgorICoKKyAqIHF1ZXVlX21haW4oKSBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gZm9yIHB1dHRpbmcgb3VyIG1haW4gb250byB0aGUgdGFzaworICogcXVldWUsIGlmIG1haW5fcnVubmluZyBpcyBmYWxzZS4gSXQgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGZyb20gYQorICogaW50ZXJydXB0IG9yIGJvdHRvbSBoYWxmLgorICovCisKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworc3RhdGljIHZvbGF0aWxlIGludCBtYWluX3J1bm5pbmcgPSAwOworc3RhdGljIERFQ0xBUkVfV09SSyhOQ1I1MzgwX3RxdWV1ZSwgKHZvaWQgKCopKHZvaWQqKSlOQ1I1MzgwX21haW4sIE5VTEwpOworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHF1ZXVlX21haW4odm9pZCkKK3sKKyAgICBpZiAoIW1haW5fcnVubmluZykgeworCS8qIElmIGluIGludGVycnVwdCBhbmQgTkNSNTM4MF9tYWluKCkgbm90IGFscmVhZHkgcnVubmluZywKKwkgICBxdWV1ZSBpdCBvbiB0aGUgJ2ltbWVkaWF0ZScgdGFzayBxdWV1ZSwgdG8gYmUgcHJvY2Vzc2VkCisJICAgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHByb2Nlc3NpbmcgaGFzCisJICAgZmluaXNoZWQuICovCisJc2NoZWR1bGVfd29yaygmTkNSNTM4MF90cXVldWUpOworICAgIH0KKyAgICAvKiBlbHNlOiBub3RoaW5nIHRvIGRvOiB0aGUgcnVubmluZyBOQ1I1MzgwX21haW4oKSB3aWxsIHBpY2sgdXAKKyAgICAgICBhbnkgbmV3bHkgcXVldWVkIGNvbW1hbmQuICovCit9CisKKworc3RhdGljIGlubGluZSB2b2lkIE5DUjUzODBfYWxsX2luaXQgKHZvaWQpCit7CisgICAgc3RhdGljIGludCBkb25lID0gMDsKKyAgICBpZiAoIWRvbmUpIHsKKwlJTklfUFJJTlRLKCJzY3NpIDogTkNSNTM4MF9hbGxfaW5pdCgpXG4iKTsKKwlkb25lID0gMTsKKyAgICB9Cit9CisKKyAKKy8qCisgKiBGdW5jdGlvbiA6IHZvaWQgTkNSNTgzODBfcHJpbnRfb3B0aW9ucyAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCisgKgorICogUHVycG9zZSA6IGNhbGxlZCBieSBwcm9iZSBjb2RlIGluZGljYXRpbmcgdGhlIE5DUjUzODAgZHJpdmVyCisgKgkgICAgIG9wdGlvbnMgdGhhdCB3ZXJlIHNlbGVjdGVkLgorICoKKyAqIElucHV0cyA6IGluc3RhbmNlLCBwb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UuICBVbnVzZWQuCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IE5DUjUzODBfcHJpbnRfb3B0aW9ucyAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisgICAgcHJpbnRrKCIgZ2VuZXJpYyBvcHRpb25zIgorI2lmZGVmIEFVVE9TRU5TRSAKKyAgICAiIEFVVE9TRU5TRSIKKyNlbmRpZgorI2lmZGVmIFJFQUxfRE1BCisgICAgIiBSRUFMIERNQSIKKyNlbmRpZgorI2lmZGVmIFBBUklUWQorICAgICIgUEFSSVRZIgorI2VuZGlmCisjaWZkZWYgU1VQUE9SVF9UQUdTCisgICAgIiBTQ1NJLTIgVEFHR0VEIFFVRVVJTkciCisjZW5kaWYKKyAgICApOworICAgIHByaW50aygiIGdlbmVyaWMgcmVsZWFzZT0lZCIsIE5DUjUzODBfUFVCTElDX1JFTEVBU0UpOworfQorCisvKgorICogRnVuY3Rpb24gOiB2b2lkIE5DUjUzODBfcHJpbnRfc3RhdHVzIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKKyAqCisgKiBQdXJwb3NlIDogcHJpbnQgY29tbWFuZHMgaW4gdGhlIHZhcmlvdXMgcXVldWVzLCBjYWxsZWQgZnJvbQorICoJTkNSNTM4MF9hYm9ydCBhbmQgTkNSNTM4MF9kZWJ1ZyB0byBhaWQgZGVidWdnaW5nLgorICoKKyAqIElucHV0cyA6IGluc3RhbmNlLCBwb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UuICAKKyAqLworCitzdGF0aWMgdm9pZCBOQ1I1MzgwX3ByaW50X3N0YXR1cyAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisgICAgY2hhciAqcHJfYmZyOworICAgIGNoYXIgKnN0YXJ0OworICAgIGludCBsZW47CisKKyAgICBOQ1JfUFJJTlQoTkRFQlVHX0FOWSk7CisgICAgTkNSX1BSSU5UX1BIQVNFKE5ERUJVR19BTlkpOworCisgICAgcHJfYmZyID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9BVE9NSUMpOworICAgIGlmICghcHJfYmZyKSB7CisJcHJpbnRrKCJOQ1I1MzgwX3ByaW50X3N0YXR1czogbm8gbWVtb3J5IGZvciBwcmludCBidWZmZXJcbiIpOworCXJldHVybjsKKyAgICB9CisgICAgbGVuID0gTkNSNTM4MF9wcm9jX2luZm8ocHJfYmZyLCAmc3RhcnQsIDAsIFBBR0VfU0laRSwgSE9TVE5PLCAwKTsKKyAgICBwcl9iZnJbbGVuXSA9IDA7CisgICAgcHJpbnRrKCJcbiVzXG4iLCBwcl9iZnIpOworICAgIGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcHJfYmZyKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIC9wcm9jL3Njc2kvW2R0YyBwYXMxNiB0MTI4IGdlbmVyaWNdL1swLUFTQ19OVU1fQk9BUkRfU1VQUE9SVEVEXQorICoKKyAqICpidWZmZXI6IEkvTyBidWZmZXIKKyAqICoqc3RhcnQ6IGlmIGlub3V0ID09IEZBTFNFIHBvaW50ZXIgaW50byBidWZmZXIgd2hlcmUgdXNlciByZWFkIHNob3VsZCBzdGFydAorICogb2Zmc2V0OiBjdXJyZW50IG9mZnNldAorICogbGVuZ3RoOiBsZW5ndGggb2YgYnVmZmVyCisgKiBob3N0bm86IFNjc2lfSG9zdCBob3N0X25vCisgKiBpbm91dDogVFJVRSAtIHVzZXIgaXMgd3JpdGluZzsgRkFMU0UgLSB1c2VyIGlzIHJlYWRpbmcKKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gb3Igd3JpdHRlbgorKi8KKworI3VuZGVmIFNQUklOVEYKKyNkZWZpbmUgU1BSSU5URihmbXQsYXJncy4uLikgXAorICBkbyB7IGlmIChwb3MgKyBzdHJsZW4oZm10KSArIDIwIC8qIHNsb3AgKi8gPCBidWZmZXIgKyBsZW5ndGgpIFwKKwkgcG9zICs9IHNwcmludGYocG9zLCBmbXQgLCAjIyBhcmdzKTsgfSB3aGlsZSgwKQorc3RhdGljCitjaGFyICpscHJpbnRfU2NzaV9DbW5kIChTY3NpX0NtbmQgKmNtZCwgY2hhciAqcG9zLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpOworCitzdGF0aWMKK2ludCBOQ1I1MzgwX3Byb2NfaW5mbyAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCSAgICAgICBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCit7CisgICAgY2hhciAqcG9zID0gYnVmZmVyOworICAgIHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YTsKKyAgICBTY3NpX0NtbmQgKnB0cjsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIG9mZl90IGJlZ2luID0gMDsKKyNkZWZpbmUgY2hlY2tfb2Zmc2V0KCkJCQkJXAorICAgIGRvIHsJCQkJCVwKKwlpZiAocG9zIC0gYnVmZmVyIDwgb2Zmc2V0IC0gYmVnaW4pIHsJXAorCSAgICBiZWdpbiArPSBwb3MgLSBidWZmZXI7CQlcCisJICAgIHBvcyA9IGJ1ZmZlcjsJCQlcCisJfQkJCQkJXAorICAgIH0gd2hpbGUgKDApCisKKyAgICBob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKWluc3RhbmNlLT5ob3N0ZGF0YTsKKworICAgIGlmIChpbm91dCkgeyAvKiBIYXMgZGF0YSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGZpbGUgPyAqLworCXJldHVybigtRU5PU1lTKTsgIC8qIEN1cnJlbnRseSB0aGlzIGlzIGEgbm8tb3AgKi8KKyAgICB9CisgICAgU1BSSU5URigiTkNSNTM4MCBjb3JlIHJlbGVhc2U9JWQuXG4iLCBOQ1I1MzgwX1BVQkxJQ19SRUxFQVNFKTsKKyAgICBjaGVja19vZmZzZXQoKTsKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgU1BSSU5URigiTkNSNTM4MDogY29yb3V0aW5lIGlzJXMgcnVubmluZy5cbiIsIG1haW5fcnVubmluZyA/ICIiIDogIm4ndCIpOworICAgIGNoZWNrX29mZnNldCgpOworICAgIGlmICghaG9zdGRhdGEtPmNvbm5lY3RlZCkKKwlTUFJJTlRGKCJzY3NpJWQ6IG5vIGN1cnJlbnRseSBjb25uZWN0ZWQgY29tbWFuZFxuIiwgSE9TVE5PKTsKKyAgICBlbHNlCisJcG9zID0gbHByaW50X1Njc2lfQ21uZCAoKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+Y29ubmVjdGVkLAorCQkJCXBvcywgYnVmZmVyLCBsZW5ndGgpOworICAgIFNQUklOVEYoInNjc2klZDogaXNzdWVfcXVldWVcbiIsIEhPU1ROTyk7CisgICAgY2hlY2tfb2Zmc2V0KCk7CisgICAgZm9yIChwdHIgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsgcHRyOyBwdHIgPSBORVhUKHB0cikpIHsKKwlwb3MgPSBscHJpbnRfU2NzaV9DbW5kIChwdHIsIHBvcywgYnVmZmVyLCBsZW5ndGgpOworCWNoZWNrX29mZnNldCgpOworICAgIH0KKworICAgIFNQUklOVEYoInNjc2klZDogZGlzY29ubmVjdGVkX3F1ZXVlXG4iLCBIT1NUTk8pOworICAgIGNoZWNrX29mZnNldCgpOworICAgIGZvciAocHRyID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOyBwdHI7CisJIHB0ciA9IE5FWFQocHRyKSkgeworCXBvcyA9IGxwcmludF9TY3NpX0NtbmQgKHB0ciwgcG9zLCBidWZmZXIsIGxlbmd0aCk7CisJY2hlY2tfb2Zmc2V0KCk7CisgICAgfQorCisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgICpzdGFydCA9IGJ1ZmZlciArIChvZmZzZXQgLSBiZWdpbik7CisgICAgaWYgKHBvcyAtIGJ1ZmZlciA8IG9mZnNldCAtIGJlZ2luKQorCXJldHVybiAwOworICAgIGVsc2UgaWYgKHBvcyAtIGJ1ZmZlciAtIChvZmZzZXQgLSBiZWdpbikgPCBsZW5ndGgpCisJcmV0dXJuIHBvcyAtIGJ1ZmZlciAtIChvZmZzZXQgLSBiZWdpbik7CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworc3RhdGljIGNoYXIgKgorbHByaW50X1Njc2lfQ21uZCAoU2NzaV9DbW5kICpjbWQsIGNoYXIgKnBvcywgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQoreworICAgIGludCBpLCBzOworICAgIHVuc2lnbmVkIGNoYXIgKmNvbW1hbmQ7CisgICAgU1BSSU5URigic2NzaSVkOiBkZXN0aW5hdGlvbiB0YXJnZXQgJWQsIGx1biAlZFxuIiwKKwkgICAgSF9OTyhjbWQpLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworICAgIFNQUklOVEYoIiAgICAgICAgY29tbWFuZCA9ICIpOworICAgIGNvbW1hbmQgPSBjbWQtPmNtbmQ7CisgICAgU1BSSU5URigiJTJkICgweCUwMngpIiwgY29tbWFuZFswXSwgY29tbWFuZFswXSk7CisgICAgZm9yIChpID0gMSwgcyA9IENPTU1BTkRfU0laRShjb21tYW5kWzBdKTsgaSA8IHM7ICsraSkKKwlTUFJJTlRGKCIgJTAyeCIsIGNvbW1hbmRbaV0pOworICAgIFNQUklOVEYoIlxuIik7CisgICAgcmV0dXJuIHBvczsKK30KKworCisvKiAKKyAqIEZ1bmN0aW9uIDogdm9pZCBOQ1I1MzgwX2luaXQgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQorICoKKyAqIFB1cnBvc2UgOiBpbml0aWFsaXplcyAqaW5zdGFuY2UgYW5kIGNvcnJlc3BvbmRpbmcgNTM4MCBjaGlwLgorICoKKyAqIElucHV0cyA6IGluc3RhbmNlIC0gaW5zdGFudGlhdGlvbiBvZiB0aGUgNTM4MCBkcml2ZXIuICAKKyAqCisgKiBOb3RlcyA6IEkgYXNzdW1lIHRoYXQgdGhlIGhvc3QsIGhvc3RubywgYW5kIGlkIGJpdHMgaGF2ZSBiZWVuCisgKiAJc2V0IGNvcnJlY3RseS4gIEkgZG9uJ3QgY2FyZSBhYm91dCB0aGUgaXJxIGFuZCBvdGhlciBmaWVsZHMuIAorICogCisgKi8KKworc3RhdGljIGludCBOQ1I1MzgwX2luaXQgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IGk7CisgICAgU0VUVVBfSE9TVERBVEEoaW5zdGFuY2UpOworCisgICAgTkNSNTM4MF9hbGxfaW5pdCgpOworCisgICAgaG9zdGRhdGEtPmFib3J0ZWQgPSAwOworICAgIGhvc3RkYXRhLT5pZF9tYXNrID0gMSA8PCBpbnN0YW5jZS0+dGhpc19pZDsKKyAgICBob3N0ZGF0YS0+aWRfaGlnaGVyX21hc2sgPSAwOworICAgIGZvciAoaSA9IGhvc3RkYXRhLT5pZF9tYXNrOyBpIDw9IDB4ODA7IGkgPDw9IDEpCisJaWYgKGkgPiBob3N0ZGF0YS0+aWRfbWFzaykKKwkgICAgaG9zdGRhdGEtPmlkX2hpZ2hlcl9tYXNrIHw9IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkKKwlob3N0ZGF0YS0+YnVzeVtpXSA9IDA7CisjaWZkZWYgU1VQUE9SVF9UQUdTCisgICAgaW5pdF90YWdzKCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChSRUFMX0RNQSkKKyAgICBob3N0ZGF0YS0+ZG1hX2xlbiA9IDA7CisjZW5kaWYKKyAgICBob3N0ZGF0YS0+dGFyZ2V0c19wcmVzZW50ID0gMDsKKyAgICBob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKyAgICBob3N0ZGF0YS0+aXNzdWVfcXVldWUgPSBOVUxMOworICAgIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUgPSBOVUxMOworICAgIGhvc3RkYXRhLT5mbGFncyA9IEZMQUdfQ0hFQ0tfTEFTVF9CWVRFX1NFTlQ7CisKKyAgICBpZiAoIXRoZV90ZW1wbGF0ZSkgeworCXRoZV90ZW1wbGF0ZSA9IGluc3RhbmNlLT5ob3N0dDsKKwlmaXJzdF9pbnN0YW5jZSA9IGluc3RhbmNlOworICAgIH0KKwkKKworI2lmbmRlZiBBVVRPU0VOU0UKKyAgICBpZiAoKGluc3RhbmNlLT5jbWRfcGVyX2x1biA+IDEpIHx8IChpbnN0YW5jZS0+Y2FuX3F1ZXVlID4gMSkpCisJIHByaW50aygic2NzaSVkOiBXQVJOSU5HIDogc3VwcG9ydCBmb3IgbXVsdGlwbGUgb3V0c3RhbmRpbmcgY29tbWFuZHMgZW5hYmxlZFxuIgorCSAgICAgICAgIiAgICAgICAgd2l0aG91dCBBVVRPU0VOU0Ugb3B0aW9uLCBjb250aW5nZW50IGFsbGVnaWFuY2UgY29uZGl0aW9ucyBtYXlcbiIKKwkgICAgICAgICIgICAgICAgIGJlIGluY29ycmVjdGx5IGNsZWFyZWQuXG4iLCBIT1NUTk8pOworI2VuZGlmIC8qIGRlZiBBVVRPU0VOU0UgKi8KKworICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisgICAgTkNSNTM4MF93cml0ZShNT0RFX1JFRywgTVJfQkFTRSk7CisgICAgTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIDApOworICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIDApOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIAorICogRnVuY3Rpb24gOiBpbnQgTkNSNTM4MF9xdWV1ZV9jb21tYW5kIChTY3NpX0NtbmQgKmNtZCwgCisgKgl2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKSAKKyAqCisgKiBQdXJwb3NlIDogIGVucXVldWVzIGEgU0NTSSBjb21tYW5kCisgKgorICogSW5wdXRzIDogY21kIC0gU0NTSSBjb21tYW5kLCBkb25lIC0gZnVuY3Rpb24gY2FsbGVkIG9uIGNvbXBsZXRpb24sIHdpdGgKKyAqCWEgcG9pbnRlciB0byB0aGUgY29tbWFuZCBkZXNjcmlwdG9yLgorICogCisgKiBSZXR1cm5zIDogMAorICoKKyAqIFNpZGUgZWZmZWN0cyA6IAorICogICAgICBjbWQgaXMgYWRkZWQgdG8gdGhlIHBlciBpbnN0YW5jZSBpc3N1ZV9xdWV1ZSwgd2l0aCBtaW5vciAKKyAqCXR3aWRkbGluZyBkb25lIHRvIHRoZSBob3N0IHNwZWNpZmljIGZpZWxkcyBvZiBjbWQuICBJZiB0aGUgCisgKgltYWluIGNvcm91dGluZSBpcyBub3QgcnVubmluZywgaXQgaXMgcmVzdGFydGVkLgorICoKKyAqLworCitzdGF0aWMKK2ludCBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQgKFNjc2lfQ21uZCAqY21kLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQoreworICAgIFNFVFVQX0hPU1REQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KTsKKyAgICBTY3NpX0NtbmQgKnRtcDsKKyAgICBpbnQgb2xkdG87CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBleHRlcm4gaW50IHVwZGF0ZV90aW1lb3V0KFNjc2lfQ21uZCAqIFNDc2V0LCBpbnQgdGltZW91dCk7CisKKyNpZiAoTkRFQlVHICYgTkRFQlVHX05PX1dSSVRFKQorICAgIHN3aXRjaCAoY21kLT5jbW5kWzBdKSB7CisgICAgY2FzZSBXUklURV82OgorICAgIGNhc2UgV1JJVEVfMTA6CisJcHJpbnRrKEtFUk5fTk9USUNFICJzY3NpJWQ6IFdSSVRFIGF0dGVtcHRlZCB3aXRoIE5PX1dSSVRFIGRlYnVnZ2luZyBmbGFnIHNldFxuIiwKKwkgICAgICAgSF9OTyhjbWQpKTsKKwljbWQtPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOworCWRvbmUoY21kKTsKKwlyZXR1cm4gMDsKKyAgICB9CisjZW5kaWYgLyogKE5ERUJVRyAmIE5ERUJVR19OT19XUklURSkgKi8KKworCisjaWZkZWYgTkNSNTM4MF9TVEFUUworIyBpZiAwCisgICAgaWYgKCFob3N0ZGF0YS0+Y29ubmVjdGVkICYmICFob3N0ZGF0YS0+aXNzdWVfcXVldWUgJiYKKwkhaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSkgeworCWhvc3RkYXRhLT50aW1lYmFzZSA9IGppZmZpZXM7CisgICAgfQorIyBlbmRpZgorIyBpZmRlZiBOQ1I1MzgwX1NUQVRfTElNSVQKKyAgICBpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPiBOQ1I1MzgwX1NUQVRfTElNSVQpCisjIGVuZGlmCisJc3dpdGNoIChjbWQtPmNtbmRbMF0pCisJeworCSAgICBjYXNlIFdSSVRFOgorCSAgICBjYXNlIFdSSVRFXzY6CisJICAgIGNhc2UgV1JJVEVfMTA6CisJCWhvc3RkYXRhLT50aW1lX3dyaXRlW2NtZC0+ZGV2aWNlLT5pZF0gLT0gKGppZmZpZXMgLSBob3N0ZGF0YS0+dGltZWJhc2UpOworCQlob3N0ZGF0YS0+Ynl0ZXNfd3JpdGVbY21kLT5kZXZpY2UtPmlkXSArPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJaG9zdGRhdGEtPnBlbmRpbmd3Kys7CisJCWJyZWFrOworCSAgICBjYXNlIFJFQUQ6CisJICAgIGNhc2UgUkVBRF82OgorCSAgICBjYXNlIFJFQURfMTA6CisJCWhvc3RkYXRhLT50aW1lX3JlYWRbY21kLT5kZXZpY2UtPmlkXSAtPSAoamlmZmllcyAtIGhvc3RkYXRhLT50aW1lYmFzZSk7CisJCWhvc3RkYXRhLT5ieXRlc19yZWFkW2NtZC0+ZGV2aWNlLT5pZF0gKz0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCWhvc3RkYXRhLT5wZW5kaW5ncisrOworCQlicmVhazsKKwl9CisjZW5kaWYKKworICAgIC8qIAorICAgICAqIFdlIHVzZSB0aGUgaG9zdF9zY3JpYmJsZSBmaWVsZCBhcyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgY29tbWFuZCAgCisgICAgICogaW4gYSBxdWV1ZSAKKyAgICAgKi8KKworICAgIE5FWFQoY21kKSA9IE5VTEw7CisgICAgY21kLT5zY3NpX2RvbmUgPSBkb25lOworCisgICAgY21kLT5yZXN1bHQgPSAwOworCisKKyAgICAvKiAKKyAgICAgKiBJbnNlcnQgdGhlIGNtZCBpbnRvIHRoZSBpc3N1ZSBxdWV1ZS4gTm90ZSB0aGF0IFJFUVVFU1QgU0VOU0UgCisgICAgICogY29tbWFuZHMgYXJlIGFkZGVkIHRvIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBzaW5jZSBhbnkgY29tbWFuZCB3aWxsCisgICAgICogY2xlYXIgdGhlIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb24gdGhhdCBleGlzdHMgYW5kIHRoZSAKKyAgICAgKiBzZW5zZSBkYXRhIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZSB2YWxpZCB3aGlsZSB0aGUgY29uZGl0aW9uIGV4aXN0cy4KKyAgICAgKi8KKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICAvKiArK2d1ZW50aGVyOiBub3cgdGhhdCB0aGUgaXNzdWUgcXVldWUgaXMgYmVpbmcgc2V0IHVwLCB3ZSBjYW4gbG9jayBTVC1ETUEuCisgICAgICogT3RoZXJ3aXNlIGEgcnVubmluZyBOQ1I1MzgwX21haW4gbWF5IHN0ZWFsIHRoZSBsb2NrLgorICAgICAqIExvY2sgYmVmb3JlIGFjdHVhbGx5IGluc2VydGluZyBkdWUgdG8gZmFpcm5lc3MgcmVhc29ucyBleHBsYWluZWQgaW4KKyAgICAgKiBhdGFyaV9zY3NpLmMuIElmIHdlIGluc2VydCBmaXJzdCwgdGhlbiBpdCdzIGltcG9zc2libGUgZm9yIHRoaXMgZHJpdmVyCisgICAgICogdG8gcmVsZWFzZSB0aGUgbG9jay4KKyAgICAgKiBTdG9wIHRpbWVyIGZvciB0aGlzIGNvbW1hbmQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIGxvY2ssIG9yIHRpbWVvdXRzCisgICAgICogbWF5IGhhcHBlbiAoYW5kIHRoZXkgcmVhbGx5IGRvKSwgYW5kIGl0J3Mgbm8gZ29vZCBpZiB0aGUgY29tbWFuZCBkb2Vzbid0CisgICAgICogYXBwZWFyIGluIGFueSBvZiB0aGUgcXVldWVzLgorICAgICAqICsrcm9tYW46IEp1c3QgZGlzYWJsaW5nIHRoZSBOQ1IgaW50ZXJydXB0IGlzbid0IHN1ZmZpY2llbnQgaGVyZSwKKyAgICAgKiBiZWNhdXNlIGFsc28gYSB0aW1lciBpbnQgY2FuIHRyaWdnZXIgYW4gYWJvcnQgb3IgcmVzZXQsIHdoaWNoIHdvdWxkCisgICAgICogYWx0ZXIgcXVldWVzIGFuZCB0b3VjaCB0aGUgbG9jay4KKyAgICAgKi8KKyAgICBpZiAoIUlTX0FfVFQoKSkgeworCW9sZHRvID0gdXBkYXRlX3RpbWVvdXQoY21kLCAwKTsKKwlmYWxjb25fZ2V0X2xvY2soKTsKKwl1cGRhdGVfdGltZW91dChjbWQsIG9sZHRvKTsKKyAgICB9CisgICAgaWYgKCEoaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKSB8fCAoY21kLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpKSB7CisJTElTVChjbWQsIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSk7CisJTkVYVChjbWQpID0gaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOworCWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IGNtZDsKKyAgICB9IGVsc2UgeworCWZvciAodG1wID0gKFNjc2lfQ21uZCAqKWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsKKwkgICAgIE5FWFQodG1wKTsgdG1wID0gTkVYVCh0bXApKQorCSAgICA7CisJTElTVChjbWQsIHRtcCk7CisJTkVYVCh0bXApID0gY21kOworICAgIH0KKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICBRVV9QUklOVEsoInNjc2klZDogY29tbWFuZCBhZGRlZCB0byAlcyBvZiBxdWV1ZVxuIiwgSF9OTyhjbWQpLAorCSAgICAgIChjbWQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkgPyAiaGVhZCIgOiAidGFpbCIpOworCisgICAgLyogSWYgcXVldWVfY29tbWFuZCgpIGlzIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCAocmVhbCBvbmUgb3IgYm90dG9tCisgICAgICogaGFsZiksIHdlIGxldCBxdWV1ZV9tYWluKCkgZG8gdGhlIGpvYiBvZiB0YWtpbmcgY2FyZSBhYm91dCBtYWluLiBJZiBpdAorICAgICAqIGlzIGFscmVhZHkgcnVubmluZywgdGhpcyBpcyBhIG5vLW9wLCBlbHNlIG1haW4gd2lsbCBiZSBxdWV1ZWQuCisgICAgICoKKyAgICAgKiBJZiB3ZSdyZSBub3QgaW4gYW4gaW50ZXJydXB0LCB3ZSBjYW4gY2FsbCBOQ1I1MzgwX21haW4oKQorICAgICAqIHVuY29uZGl0aW9uYWxseSwgYmVjYXVzZSBpdCBjYW5ub3QgYmUgYWxyZWFkeSBydW5uaW5nLgorICAgICAqLworICAgIGlmIChpbl9pbnRlcnJ1cHQoKSB8fCAoKGZsYWdzID4+IDgpICYgNykgPj0gNikKKwlxdWV1ZV9tYWluKCk7CisgICAgZWxzZQorCU5DUjUzODBfbWFpbihOVUxMKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogTkNSNTM4MF9tYWluICh2b2lkKSAKKyAqCisgKiBQdXJwb3NlIDogTkNSNTM4MF9tYWluIGlzIGEgY29yb3V0aW5lIHRoYXQgcnVucyBhcyBsb25nIGFzIG1vcmUgd29yayBjYW4gCisgKgliZSBkb25lIG9uIHRoZSBOQ1I1MzgwIGhvc3QgYWRhcHRlcnMgaW4gYSBzeXN0ZW0uICBCb3RoIAorICoJTkNSNTM4MF9xdWV1ZV9jb21tYW5kKCkgYW5kIE5DUjUzODBfaW50cigpIHdpbGwgdHJ5IHRvIHN0YXJ0IGl0IAorICoJaW4gY2FzZSBpdCBpcyBub3QgcnVubmluZy4KKyAqIAorICogTk9URSA6IE5DUjUzODBfbWFpbiBleGl0cyB3aXRoIGludGVycnVwdHMgKmRpc2FibGVkKiwgdGhlIGNhbGxlciBzaG91bGQgCisgKiAgcmVlbmFibGUgdGhlbS4gIFRoaXMgcHJldmVudHMgcmVlbnRyYW5jeSBhbmQga2VybmVsIHN0YWNrIG92ZXJmbG93LgorICovIAkKKyAgICAKK3N0YXRpYyB2b2lkIE5DUjUzODBfbWFpbiAodm9pZCAqYmwpCit7CisgICAgU2NzaV9DbW5kICp0bXAsICpwcmV2OworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlID0gZmlyc3RfaW5zdGFuY2U7CisgICAgc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKmhvc3RkYXRhID0gSE9TVERBVEEoaW5zdGFuY2UpOworICAgIGludCBkb25lOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgCisgICAgLyoKKyAgICAgKiBXZSBydW4gKHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCkgdW50aWwgd2UncmUgc3VyZSB0aGF0IG5vbmUgb2YgCisgICAgICogdGhlIGhvc3QgYWRhcHRlcnMgaGF2ZSBhbnl0aGluZyB0aGF0IGNhbiBiZSBkb25lLCBhdCB3aGljaCBwb2ludCAKKyAgICAgKiB3ZSBzZXQgbWFpbl9ydW5uaW5nIHRvIDAgYW5kIGV4aXQuCisgICAgICoKKyAgICAgKiBJbnRlcnJ1cHRzIGFyZSBlbmFibGVkIGJlZm9yZSBkb2luZyB2YXJpb3VzIG90aGVyIGludGVybmFsIAorICAgICAqIGluc3RydWN0aW9ucywgYWZ0ZXIgd2UndmUgZGVjaWRlZCB0aGF0IHdlIG5lZWQgdG8gcnVuIHRocm91Z2gKKyAgICAgKiB0aGUgbG9vcCBhZ2Fpbi4KKyAgICAgKgorICAgICAqIHRoaXMgc2hvdWxkIHByZXZlbnQgYW55IHJhY2UgY29uZGl0aW9ucy4KKyAgICAgKiAKKyAgICAgKiArK3JvbWFuOiBKdXN0IGRpc2FibGluZyB0aGUgTkNSIGludGVycnVwdCBpc24ndCBzdWZmaWNpZW50IGhlcmUsCisgICAgICogYmVjYXVzZSBhbHNvIGEgdGltZXIgaW50IGNhbiB0cmlnZ2VyIGFuIGFib3J0IG9yIHJlc2V0LCB3aGljaCBjYW4KKyAgICAgKiBhbHRlciBxdWV1ZXMgYW5kIHRvdWNoIHRoZSBGYWxjb24gbG9jay4KKyAgICAgKi8KKworICAgIC8qIFRlbGwgaW50IGhhbmRsZXJzIG1haW4oKSBpcyBub3cgYWxyZWFkeSBleGVjdXRpbmcuICBOb3RlIHRoYXQKKyAgICAgICBubyByYWNlcyBhcmUgcG9zc2libGUgaGVyZS4gSWYgYW4gaW50IGNvbWVzIGluIGJlZm9yZQorICAgICAgICdtYWluX3J1bm5pbmcnIGlzIHNldCBoZXJlLCBhbmQgcXVldWVzL2V4ZWN1dGVzIG1haW4gdmlhIHRoZQorICAgICAgIHRhc2sgcXVldWUsIGl0IGRvZXNuJ3QgZG8gYW55IGhhcm0sIGp1c3QgdGhpcyBpbnN0YW5jZSBvZiBtYWluCisgICAgICAgd29uJ3QgZmluZCBhbnkgd29yayBsZWZ0IHRvIGRvLiAqLworICAgIGlmIChtYWluX3J1bm5pbmcpCisgICAgCXJldHVybjsKKyAgICBtYWluX3J1bm5pbmcgPSAxOworCisgICAgbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CisgICAgZG8geworCWxvY2FsX2lycV9kaXNhYmxlKCk7IC8qIEZyZWV6ZSByZXF1ZXN0IHF1ZXVlcyAqLworCWRvbmUgPSAxOworCQorCWlmICghaG9zdGRhdGEtPmNvbm5lY3RlZCkgeworCSAgICBNQUlOX1BSSU5USyggInNjc2klZDogbm90IGNvbm5lY3RlZFxuIiwgSE9TVE5PICk7CisJICAgIC8qCisJICAgICAqIFNlYXJjaCB0aHJvdWdoIHRoZSBpc3N1ZV9xdWV1ZSBmb3IgYSBjb21tYW5kIGRlc3RpbmVkCisJICAgICAqIGZvciBhIHRhcmdldCB0aGF0J3Mgbm90IGJ1c3kuCisJICAgICAqLworI2lmIChOREVCVUcgJiBOREVCVUdfTElTVFMpCisJICAgIGZvciAodG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWUsIHByZXYgPSBOVUxMOworCQkgdG1wICYmICh0bXAgIT0gcHJldik7IHByZXYgPSB0bXAsIHRtcCA9IE5FWFQodG1wKSkKKwkJOworCQkvKnByaW50aygiJXAgICIsIHRtcCk7Ki8KKwkgICAgaWYgKCh0bXAgPT0gcHJldikgJiYgdG1wKSBwcmludGsoIiBMT09QXG4iKTsvKiBlbHNlIHByaW50aygiXG4iKTsqLworI2VuZGlmCisJICAgIGZvciAodG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWUsIAorCQkgcHJldiA9IE5VTEw7IHRtcDsgcHJldiA9IHRtcCwgdG1wID0gTkVYVCh0bXApICkgeworCisjaWYgKE5ERUJVRyAmIE5ERUJVR19MSVNUUykKKwkJaWYgKHByZXYgIT0gdG1wKQorCQkgICAgcHJpbnRrKCJNQUlOIHRtcD0lcCAgIHRhcmdldD0lZCAgIGJ1c3k9JWQgbHVuPSVkXG4iLAorCQkJICAgdG1wLCB0bXAtPmRldmljZS0+aWQsIGhvc3RkYXRhLT5idXN5W3RtcC0+ZGV2aWNlLT5pZF0sCisJCQkgICB0bXAtPmRldmljZS0+bHVuKTsKKyNlbmRpZgorCQkvKiAgV2hlbiB3ZSBmaW5kIG9uZSwgcmVtb3ZlIGl0IGZyb20gdGhlIGlzc3VlIHF1ZXVlLiAqLworCQkvKiArK2d1ZW50aGVyOiBwb3NzaWJsZSByYWNlIHdpdGggRmFsY29uIGxvY2tpbmcgKi8KKwkJaWYgKAorI2lmZGVmIFNVUFBPUlRfVEFHUworCQkgICAgIWlzX2x1bl9idXN5KCB0bXAsIHRtcC0+Y21uZFswXSAhPSBSRVFVRVNUX1NFTlNFKQorI2Vsc2UKKwkJICAgICEoaG9zdGRhdGEtPmJ1c3lbdG1wLT5kZXZpY2UtPmlkXSAmICgxIDw8IHRtcC0+ZGV2aWNlLT5sdW4pKQorI2VuZGlmCisJCSAgICApIHsKKwkJICAgIC8qICsrZ3VlbnRoZXI6IGp1c3QgdG8gYmUgc3VyZSwgdGhpcyBtdXN0IGJlIGF0b21pYyAqLworCQkgICAgbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJICAgIGlmIChwcmV2KSB7CisJCSAgICAgICAgUkVNT1ZFKHByZXYsIE5FWFQocHJldiksIHRtcCwgTkVYVCh0bXApKTsKKwkJCU5FWFQocHJldikgPSBORVhUKHRtcCk7CisJCSAgICB9IGVsc2UgeworCQkgICAgICAgIFJFTU9WRSgtMSwgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlLCB0bXAsIE5FWFQodG1wKSk7CisJCQlob3N0ZGF0YS0+aXNzdWVfcXVldWUgPSBORVhUKHRtcCk7CisJCSAgICB9CisJCSAgICBORVhUKHRtcCkgPSBOVUxMOworCQkgICAgZmFsY29uX2RvbnRfcmVsZWFzZSsrOworCQkgICAgCisJCSAgICAvKiByZWVuYWJsZSBpbnRlcnJ1cHRzIGFmdGVyIGZpbmRpbmcgb25lICovCisJCSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCSAgICAKKwkJICAgIC8qIAorCQkgICAgICogQXR0ZW1wdCB0byBlc3RhYmxpc2ggYW4gSV9UX0wgbmV4dXMgaGVyZS4gCisJCSAgICAgKiBPbiBzdWNjZXNzLCBpbnN0YW5jZS0+aG9zdGRhdGEtPmNvbm5lY3RlZCBpcyBzZXQuCisJCSAgICAgKiBPbiBmYWlsdXJlLCB3ZSBtdXN0IGFkZCB0aGUgY29tbWFuZCBiYWNrIHRvIHRoZQorCQkgICAgICogICBpc3N1ZSBxdWV1ZSBzbyB3ZSBjYW4ga2VlcCB0cnlpbmcuCQorCQkgICAgICovCisJCSAgICBNQUlOX1BSSU5USygic2NzaSVkOiBtYWluKCk6IGNvbW1hbmQgZm9yIHRhcmdldCAlZCAiCisJCQkJImx1biAlZCByZW1vdmVkIGZyb20gaXNzdWVfcXVldWVcbiIsCisJCQkJSE9TVE5PLCB0bXAtPmRldmljZS0+aWQsIHRtcC0+ZGV2aWNlLT5sdW4pOworCQkgICAgLyogCisJCSAgICAgKiBSRVFVRVNUIFNFTlNFIGNvbW1hbmRzIGFyZSBpc3N1ZWQgd2l0aG91dCB0YWdnZWQKKwkJICAgICAqIHF1ZXVlaW5nLCBldmVuIG9uIFNDU0ktSUkgZGV2aWNlcyBiZWNhdXNlIHRoZSAKKwkJICAgICAqIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb24gZXhpc3RzIGZvciB0aGUgCisJCSAgICAgKiBlbnRpcmUgdW5pdC4KKwkJICAgICAqLworCQkgICAgLyogKytyb21hbjogLi4uYW5kIHRoZSBzdGFuZGFyZCBhbHNvIHJlcXVpcmVzIHRoYXQKKwkJICAgICAqIFJFUVVFU1QgU0VOU0UgY29tbWFuZCBhcmUgdW50YWdnZWQuCisJCSAgICAgKi8KKwkJICAgIAorI2lmZGVmIFNVUFBPUlRfVEFHUworCQkgICAgY21kX2dldF90YWcoIHRtcCwgdG1wLT5jbW5kWzBdICE9IFJFUVVFU1RfU0VOU0UgKTsKKyNlbmRpZgorCQkgICAgaWYgKCFOQ1I1MzgwX3NlbGVjdChpbnN0YW5jZSwgdG1wLCAKKwkJCSAgICAodG1wLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpID8gVEFHX05PTkUgOiAKKwkJCSAgICBUQUdfTkVYVCkpIHsKKwkJCWZhbGNvbl9kb250X3JlbGVhc2UtLTsKKwkJCS8qIHJlbGVhc2UgaWYgdGFyZ2V0IGRpZCBub3QgcmVzcG9uc2UhICovCisJCQlmYWxjb25fcmVsZWFzZV9sb2NrX2lmX3Bvc3NpYmxlKCBob3N0ZGF0YSApOworCQkJYnJlYWs7CisJCSAgICB9IGVsc2UgeworCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJCUxJU1QodG1wLCBob3N0ZGF0YS0+aXNzdWVfcXVldWUpOworCQkJTkVYVCh0bXApID0gaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOworCQkJaG9zdGRhdGEtPmlzc3VlX3F1ZXVlID0gdG1wOworI2lmZGVmIFNVUFBPUlRfVEFHUworCQkJY21kX2ZyZWVfdGFnKCB0bXAgKTsKKyNlbmRpZgorCQkJZmFsY29uX2RvbnRfcmVsZWFzZS0tOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJTUFJTl9QUklOVEsoInNjc2klZDogbWFpbigpOiBzZWxlY3QoKSBmYWlsZWQsICIKKwkJCQkgICAgInJldHVybmVkIHRvIGlzc3VlX3F1ZXVlXG4iLCBIT1NUTk8pOworCQkJaWYgKGhvc3RkYXRhLT5jb25uZWN0ZWQpCisJCQkgICAgYnJlYWs7CisJCSAgICB9CisJCX0gLyogaWYgdGFyZ2V0L2x1bi90YXJnZXQgcXVldWUgaXMgbm90IGJ1c3kgKi8KKwkgICAgfSAvKiBmb3IgaXNzdWVfcXVldWUgKi8KKwl9IC8qIGlmICghaG9zdGRhdGEtPmNvbm5lY3RlZCkgKi8KKwkJCisJaWYgKGhvc3RkYXRhLT5jb25uZWN0ZWQgCisjaWZkZWYgUkVBTF9ETUEKKwkgICAgJiYgIWhvc3RkYXRhLT5kbWFfbGVuCisjZW5kaWYKKwkgICAgKSB7CisJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkgICAgTUFJTl9QUklOVEsoInNjc2klZDogbWFpbjogcGVyZm9ybWluZyBpbmZvcm1hdGlvbiB0cmFuc2ZlclxuIiwKKwkJCUhPU1ROTyk7CisJICAgIE5DUjUzODBfaW5mb3JtYXRpb25fdHJhbnNmZXIoaW5zdGFuY2UpOworCSAgICBNQUlOX1BSSU5USygic2NzaSVkOiBtYWluOiBkb25lIHNldCBmYWxzZVxuIiwgSE9TVE5PKTsKKwkgICAgZG9uZSA9IDA7CisJfQorICAgIH0gd2hpbGUgKCFkb25lKTsKKworICAgIC8qIEJldHRlciBhbGxvdyBpbnRzIF9hZnRlcl8gJ21haW5fcnVubmluZycgaGFzIGJlZW4gY2xlYXJlZCwgZWxzZQorICAgICAgIGFuIGludGVycnVwdCBjb3VsZCBiZWxpZXZlIHdlJ2xsIHBpY2sgdXAgdGhlIHdvcmsgaXQgbGVmdCBmb3IKKyAgICAgICB1cywgYnV0IHdlIHdvbid0IHNlZSBpdCBhbnltb3JlIGhlcmUuLi4gKi8KKyAgICBtYWluX3J1bm5pbmcgPSAwOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworCisjaWZkZWYgUkVBTF9ETUEKKy8qCisgKiBGdW5jdGlvbiA6IHZvaWQgTkNSNTM4MF9kbWFfY29tcGxldGUgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQorICoKKyAqIFB1cnBvc2UgOiBDYWxsZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIgd2hlbiBETUEgZmluaXNoZXMgb3IgYSBwaGFzZQorICoJbWlzbWF0Y2ggb2NjdXJzICh3aGljaCB3b3VsZCBmaW5pc2ggdGhlIERNQSB0cmFuc2ZlcikuICAKKyAqCisgKiBJbnB1dHMgOiBpbnN0YW5jZSAtIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIE5DUjUzODAuCisgKgorICovCisKK3N0YXRpYyB2b2lkIE5DUjUzODBfZG1hX2NvbXBsZXRlKCBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSApCit7CisgICAgU0VUVVBfSE9TVERBVEEoaW5zdGFuY2UpOworICAgIGludCAgICAgICAgICAgdHJhbnNmZXJlZCwgc2F2ZWRfZGF0YSA9IDAsIG92ZXJydW4gPSAwLCBjbnQsIHRvUElPOworICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBwOworICAgIHZvbGF0aWxlIGludCAgKmNvdW50OworCisgICAgaWYgKCFob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkOiByZWNlaXZlZCBlbmQgb2YgRE1BIGludGVycnVwdCB3aXRoICIKKwkgICAgICAgIm5vIGNvbm5lY3RlZCBjbWRcbiIsIEhPU1ROTyk7CisJcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBpZiAoYXRhcmlfcmVhZF9vdmVycnVucykgeworCXAgPSBob3N0ZGF0YS0+Y29ubmVjdGVkLT5TQ3AucGhhc2U7CisJaWYgKHAgJiBTUl9JTykgeworCSAgICB1ZGVsYXkoMTApOworCSAgICBpZiAoKCgoTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRykpICYKKwkJICAoQkFTUl9QSEFTRV9NQVRDSHxCQVNSX0FDSykpID09CisJCSAoQkFTUl9QSEFTRV9NQVRDSHxCQVNSX0FDSykpKSB7CisJCXNhdmVkX2RhdGEgPSBOQ1I1MzgwX3JlYWQoSU5QVVRfREFUQV9SRUcpOworCQlvdmVycnVuID0gMTsKKwkJRE1BX1BSSU5USygic2NzaSVkOiByZWFkIG92ZXJydW4gaGFuZGxlZFxuIiwgSE9TVE5PKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBETUFfUFJJTlRLKCJzY3NpJWQ6IHJlYWwgRE1BIHRyYW5zZmVyIGNvbXBsZXRlLCBiYXNyIDB4JVgsIHNyIDB4JVhcbiIsCisJICAgICAgIEhPU1ROTywgTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRyksCisJICAgICAgIE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSk7CisKKyAgICAodm9pZCkgTkNSNTM4MF9yZWFkKFJFU0VUX1BBUklUWV9JTlRFUlJVUFRfUkVHKTsKKyAgICBOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKyAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCisgICAgdHJhbnNmZXJlZCA9IGhvc3RkYXRhLT5kbWFfbGVuIC0gTkNSNTM4MF9kbWFfcmVzaWR1YWwoaW5zdGFuY2UpOworICAgIGhvc3RkYXRhLT5kbWFfbGVuID0gMDsKKworICAgIGRhdGEgPSAodW5zaWduZWQgY2hhciAqKikgJihob3N0ZGF0YS0+Y29ubmVjdGVkLT5TQ3AucHRyKTsKKyAgICBjb3VudCA9ICYoaG9zdGRhdGEtPmNvbm5lY3RlZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworICAgICpkYXRhICs9IHRyYW5zZmVyZWQ7CisgICAgKmNvdW50IC09IHRyYW5zZmVyZWQ7CisKKyAgICBpZiAoYXRhcmlfcmVhZF9vdmVycnVucykgeworCWlmICgoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgUEhBU0VfTUFTSykgPT0gcCAmJiAocCAmIFNSX0lPKSkgeworCSAgICBjbnQgPSB0b1BJTyA9IGF0YXJpX3JlYWRfb3ZlcnJ1bnM7CisJICAgIGlmIChvdmVycnVuKSB7CisJCURNQV9QUklOVEsoIkdvdCBhbiBpbnB1dCBvdmVycnVuLCB1c2luZyBzYXZlZCBieXRlXG4iKTsKKwkJKigqZGF0YSkrKyA9IHNhdmVkX2RhdGE7CisJCSgqY291bnQpLS07CisJCWNudC0tOworCQl0b1BJTy0tOworCSAgICB9CisJICAgIERNQV9QUklOVEsoIkRvaW5nICVkLWJ5dGUgUElPIHRvIDB4JTA4bHhcbiIsIGNudCwgKGxvbmcpKmRhdGEpOworCSAgICBOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgJnAsICZjbnQsIGRhdGEpOworCSAgICAqY291bnQgLT0gdG9QSU8gLSBjbnQ7CisJfQorICAgIH0KK30KKyNlbmRpZiAvKiBSRUFMX0RNQSAqLworCisKKy8qCisgKiBGdW5jdGlvbiA6IHZvaWQgTkNSNTM4MF9pbnRyIChpbnQgaXJxKQorICogCisgKiBQdXJwb3NlIDogaGFuZGxlIGludGVycnVwdHMsIHJlZXN0YWJsaXNoaW5nIElfVF9MIG9yIElfVF9MX1EgbmV4dXNlcworICoJZnJvbSB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLCBhbmQgcmVzdGFydGluZyBOQ1I1MzgwX21haW4oKSAKKyAqCWFzIHJlcXVpcmVkLgorICoKKyAqIElucHV0cyA6IGludCBpcnEsIGlycSB0aGF0IGNhdXNlZCB0aGlzIGludGVycnVwdC4KKyAqCisgKi8KKworc3RhdGljIGlycXJldHVybl90IE5DUjUzODBfaW50ciAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSA9IGZpcnN0X2luc3RhbmNlOworICAgIGludCBkb25lID0gMSwgaGFuZGxlZCA9IDA7CisgICAgdW5zaWduZWQgY2hhciBiYXNyOworCisgICAgSU5UX1BSSU5USygic2NzaSVkOiBOQ1I1MzgwIGlycSB0cmlnZ2VyZWRcbiIsIEhPU1ROTyk7CisKKyAgICAvKiBMb29rIGZvciBwZW5kaW5nIGludGVycnVwdHMgKi8KKyAgICBiYXNyID0gTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRyk7CisgICAgSU5UX1BSSU5USygic2NzaSVkOiBCQVNSPSUwMnhcbiIsIEhPU1ROTywgYmFzcik7CisgICAgLyogZGlzcGF0Y2ggdG8gYXBwcm9wcmlhdGUgcm91dGluZSBpZiBmb3VuZCBhbmQgZG9uZT0wICovCisgICAgaWYgKGJhc3IgJiBCQVNSX0lSUSkgeworCU5DUl9QUklOVChOREVCVUdfSU5UUik7CisJaWYgKChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiAoU1JfU0VMfFNSX0lPKSkgPT0gKFNSX1NFTHxTUl9JTykpIHsKKwkgICAgZG9uZSA9IDA7CisJICAgIEVOQUJMRV9JUlEoKTsKKwkgICAgSU5UX1BSSU5USygic2NzaSVkOiBTRUwgaW50ZXJydXB0XG4iLCBIT1NUTk8pOworCSAgICBOQ1I1MzgwX3Jlc2VsZWN0KGluc3RhbmNlKTsKKwkgICAgKHZvaWQpIE5DUjUzODBfcmVhZChSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyk7CisJfQorCWVsc2UgaWYgKGJhc3IgJiBCQVNSX1BBUklUWV9FUlJPUikgeworCSAgICBJTlRfUFJJTlRLKCJzY3NpJWQ6IFBBUklUWSBpbnRlcnJ1cHRcbiIsIEhPU1ROTyk7CisJICAgICh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworCX0KKwllbHNlIGlmICgoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfUlNUKSA9PSBTUl9SU1QpIHsKKwkgICAgSU5UX1BSSU5USygic2NzaSVkOiBSRVNFVCBpbnRlcnJ1cHRcbiIsIEhPU1ROTyk7CisJICAgICh2b2lkKU5DUjUzODBfcmVhZChSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyk7CisJfQorCWVsc2UgeworCSAgICAvKiAgCisJICAgICAqIFRoZSByZXN0IG9mIHRoZSBpbnRlcnJ1cHQgY29uZGl0aW9ucyBjYW4gb2NjdXIgb25seSBkdXJpbmcgYQorCSAgICAgKiBETUEgdHJhbnNmZXIKKwkgICAgICovCisKKyNpZiBkZWZpbmVkKFJFQUxfRE1BKQorCSAgICAvKgorCSAgICAgKiBXZSBzaG91bGQgb25seSBnZXQgUEhBU0UgTUlTTUFUQ0ggYW5kIEVPUCBpbnRlcnJ1cHRzIGlmIHdlIGhhdmUKKwkgICAgICogRE1BIGVuYWJsZWQsIHNvIGRvIGEgc2FuaXR5IGNoZWNrIGJhc2VkIG9uIHRoZSBjdXJyZW50IHNldHRpbmcKKwkgICAgICogb2YgdGhlIE1PREUgcmVnaXN0ZXIuCisJICAgICAqLworCisJICAgIGlmICgoTkNSNTM4MF9yZWFkKE1PREVfUkVHKSAmIE1SX0RNQV9NT0RFKSAmJgorCQkoKGJhc3IgJiBCQVNSX0VORF9ETUFfVFJBTlNGRVIpIHx8IAorCQkgIShiYXNyICYgQkFTUl9QSEFTRV9NQVRDSCkpKSB7CisJCSAgICAKKwkJSU5UX1BSSU5USygic2NzaSVkOiBQSEFTRSBNSVNNIG9yIEVPUCBpbnRlcnJ1cHRcbiIsIEhPU1ROTyk7CisJCU5DUjUzODBfZG1hX2NvbXBsZXRlKCBpbnN0YW5jZSApOworCQlkb25lID0gMDsKKwkJRU5BQkxFX0lSUSgpOworCSAgICB9IGVsc2UKKyNlbmRpZiAvKiBSRUFMX0RNQSAqLworCSAgICB7CisvKiBNUzogSWdub3JlIHVua25vd24gcGhhc2UgbWlzbWF0Y2ggaW50ZXJydXB0cyAoY2F1c2VkIGJ5IEVPUCBpbnRlcnJ1cHQpICovCisJCWlmIChiYXNyICYgQkFTUl9QSEFTRV9NQVRDSCkKKwkJICAgIHByaW50ayhLRVJOX05PVElDRSAic2NzaSVkOiB1bmtub3duIGludGVycnVwdCwgIgorCQkJICAgIkJBU1IgMHgleCwgTVIgMHgleCwgU1IgMHgleFxuIiwKKwkJCSAgIEhPU1ROTywgYmFzciwgTkNSNTM4MF9yZWFkKE1PREVfUkVHKSwKKwkJCSAgIE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSk7CisJCSh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworCSAgICB9CisJfSAvKiBpZiAhKFNFTEVDVElPTiB8fCBQQVJJVFkpICovCisJaGFuZGxlZCA9IDE7CisgICAgfSAvKiBCQVNSICYgSVJRICovCisgICAgZWxzZSB7CisJcHJpbnRrKEtFUk5fTk9USUNFICJzY3NpJWQ6IGludGVycnVwdCB3aXRob3V0IElSUSBiaXQgc2V0IGluIEJBU1IsICIKKwkgICAgICAgIkJBU1IgMHglWCwgTVIgMHglWCwgU1IgMHgleFxuIiwgSE9TVE5PLCBiYXNyLAorCSAgICAgICBOQ1I1MzgwX3JlYWQoTU9ERV9SRUcpLCBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykpOworCSh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworICAgIH0KKyAgICAKKyAgICBpZiAoIWRvbmUpIHsKKwlJTlRfUFJJTlRLKCJzY3NpJWQ6IGluIGludCByb3V0aW5lLCBjYWxsaW5nIG1haW5cbiIsIEhPU1ROTyk7CisJLyogUHV0IGEgY2FsbCB0byBOQ1I1MzgwX21haW4oKSBvbiB0aGUgcXVldWUuLi4gKi8KKwlxdWV1ZV9tYWluKCk7CisgICAgfQorICAgIHJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisjaWZkZWYgTkNSNTM4MF9TVEFUUworc3RhdGljIHZvaWQgY29sbGVjdF9zdGF0cyhzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSogaG9zdGRhdGEsIFNjc2lfQ21uZCogY21kKQoreworIyBpZmRlZiBOQ1I1MzgwX1NUQVRfTElNSVQKKyAgICBpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPiBOQ1I1MzgwX1NUQVRfTElNSVQpCisjIGVuZGlmCisJc3dpdGNoIChjbWQtPmNtbmRbMF0pCisJeworCSAgICBjYXNlIFdSSVRFOgorCSAgICBjYXNlIFdSSVRFXzY6CisJICAgIGNhc2UgV1JJVEVfMTA6CisJCWhvc3RkYXRhLT50aW1lX3dyaXRlW2NtZC0+ZGV2aWNlLT5pZF0gKz0gKGppZmZpZXMgLSBob3N0ZGF0YS0+dGltZWJhc2UpOworCQkvKmhvc3RkYXRhLT5ieXRlc193cml0ZVtjbWQtPmRldmljZS0+aWRdICs9IGNtZC0+cmVxdWVzdF9idWZmbGVuOyovCisJCWhvc3RkYXRhLT5wZW5kaW5ndy0tOworCQlicmVhazsKKwkgICAgY2FzZSBSRUFEOgorCSAgICBjYXNlIFJFQURfNjoKKwkgICAgY2FzZSBSRUFEXzEwOgorCQlob3N0ZGF0YS0+dGltZV9yZWFkW2NtZC0+ZGV2aWNlLT5pZF0gKz0gKGppZmZpZXMgLSBob3N0ZGF0YS0+dGltZWJhc2UpOworCQkvKmhvc3RkYXRhLT5ieXRlc19yZWFkW2NtZC0+ZGV2aWNlLT5pZF0gKz0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47Ki8KKwkJaG9zdGRhdGEtPnBlbmRpbmdyLS07CisJCWJyZWFrOworCX0KK30KKyNlbmRpZgorCisvKiAKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfc2VsZWN0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgU2NzaV9DbW5kICpjbWQsIAorICoJaW50IHRhZyk7CisgKgorICogUHVycG9zZSA6IGVzdGFibGlzaGVzIElfVF9MIG9yIElfVF9MX1EgbmV4dXMgZm9yIG5ldyBvciBleGlzdGluZyBjb21tYW5kLAorICoJaW5jbHVkaW5nIEFSQklUUkFUSU9OLCBTRUxFQ1RJT04sIGFuZCBpbml0aWFsIG1lc3NhZ2Ugb3V0IGZvciAKKyAqCUlERU5USUZZIGFuZCBxdWV1ZSBtZXNzYWdlcy4gCisgKgorICogSW5wdXRzIDogaW5zdGFuY2UgLSBpbnN0YW50aWF0aW9uIG9mIHRoZSA1MzgwIGRyaXZlciBvbiB3aGljaCB0aGlzIAorICogCXRhcmdldCBsaXZlcywgY21kIC0gU0NTSSBjb21tYW5kIHRvIGV4ZWN1dGUsIHRhZyAtIHNldCB0byBUQUdfTkVYVCBmb3IgCisgKgluZXcgdGFnLCBUQUdfTk9ORSBmb3IgdW50YWdnZWQgcXVldWVpbmcsIG90aGVyd2lzZSBzZXQgdG8gdGhlIHRhZyBmb3IgCisgKgl0aGUgY29tbWFuZCB0aGF0IGlzIHByZXNlbnRseSBjb25uZWN0ZWQuCisgKiAKKyAqIFJldHVybnMgOiAtMSBpZiBzZWxlY3Rpb24gY291bGQgbm90IGV4ZWN1dGUgZm9yIHNvbWUgcmVhc29uLAorICoJMCBpZiBzZWxlY3Rpb24gc3VjY2VlZGVkIG9yIGZhaWxlZCBiZWNhdXNlIHRoZSB0YXJnZXQgCisgKiAJZGlkIG5vdCByZXNwb25kLgorICoKKyAqIFNpZGUgZWZmZWN0cyA6IAorICogCUlmIGJ1cyBidXN5LCBhcmJpdHJhdGlvbiBmYWlsZWQsIGV0YywgTkNSNTM4MF9zZWxlY3QoKSB3aWxsIGV4aXQgCisgKgkJd2l0aCByZWdpc3RlcnMgYXMgdGhleSBzaG91bGQgaGF2ZSBiZWVuIG9uIGVudHJ5IC0gaWUKKyAqCQlTRUxFQ1RfRU5BQkxFIHdpbGwgYmUgc2V0IGFwcHJvcHJpYXRlbHksIHRoZSBOQ1I1MzgwCisgKgkJd2lsbCBjZWFzZSB0byBkcml2ZSBhbnkgU0NTSSBidXMgc2lnbmFscy4KKyAqCisgKglJZiBzdWNjZXNzZnVsIDogSV9UX0wgb3IgSV9UX0xfUSBuZXh1cyB3aWxsIGJlIGVzdGFibGlzaGVkLCAKKyAqCQlpbnN0YW5jZS0+Y29ubmVjdGVkIHdpbGwgYmUgc2V0IHRvIGNtZC4gIAorICogCQlTRUxFQ1QgaW50ZXJydXB0IHdpbGwgYmUgZGlzYWJsZWQuCisgKgorICoJSWYgZmFpbGVkIChubyB0YXJnZXQpIDogY21kLT5zY3NpX2RvbmUoKSB3aWxsIGJlIGNhbGxlZCwgYW5kIHRoZSAKKyAqCQljbWQtPnJlc3VsdCBob3N0IGJ5dGUgc2V0IHRvIERJRF9CQURfVEFSR0VULgorICovCisKK3N0YXRpYyBpbnQgTkNSNTM4MF9zZWxlY3QgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBTY3NpX0NtbmQgKmNtZCwgaW50IHRhZykKK3sKKyAgICBTRVRVUF9IT1NUREFUQShpbnN0YW5jZSk7CisgICAgdW5zaWduZWQgY2hhciB0bXBbM10sIHBoYXNlOworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgaW50IGxlbjsKKyAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIGhvc3RkYXRhLT5yZXN0YXJ0X3NlbGVjdCA9IDA7CisgICAgTkNSX1BSSU5UKE5ERUJVR19BUkJJVFJBVElPTik7CisgICAgQVJCX1BSSU5USygic2NzaSVkOiBzdGFydGluZyBhcmJpdHJhdGlvbiwgaWQgPSAlZFxuIiwgSE9TVE5PLAorCSAgICAgICBpbnN0YW5jZS0+dGhpc19pZCk7CisKKyAgICAvKiAKKyAgICAgKiBTZXQgdGhlIHBoYXNlIGJpdHMgdG8gMCwgb3RoZXJ3aXNlIHRoZSBOQ1I1MzgwIHdvbid0IGRyaXZlIHRoZSAKKyAgICAgKiBkYXRhIGJ1cyBkdXJpbmcgU0VMRUNUSU9OLgorICAgICAqLworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIGlmIChob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAtMTsKKyAgICB9CisgICAgTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIDApOworCisKKyAgICAvKiAKKyAgICAgKiBTdGFydCBhcmJpdHJhdGlvbi4KKyAgICAgKi8KKyAgICAKKyAgICBOQ1I1MzgwX3dyaXRlKE9VVFBVVF9EQVRBX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworICAgIE5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0FSQklUUkFURSk7CisKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICAvKiBXYWl0IGZvciBhcmJpdHJhdGlvbiBsb2dpYyB0byBjb21wbGV0ZSAqLworI2lmIE5DUl9USU1FT1VUCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIDIqTkNSX1RJTUVPVVQ7CisKKyAgICAgIHdoaWxlICghKE5DUjUzODBfcmVhZChJTklUSUFUT1JfQ09NTUFORF9SRUcpICYgSUNSX0FSQklUUkFUSU9OX1BST0dSRVNTKQorCSAgICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmICFob3N0ZGF0YS0+Y29ubmVjdGVkKQorCTsKKyAgICAgIGlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKQorICAgICAgeworCXByaW50aygic2NzaSA6IGFyYml0cmF0aW9uIHRpbWVvdXQgYXQgJWRcbiIsIF9fTElORV9fKTsKKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKwlOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJcmV0dXJuIC0xOworICAgICAgfQorICAgIH0KKyNlbHNlIC8qIE5DUl9USU1FT1VUICovCisgICAgd2hpbGUgKCEoTkNSNTM4MF9yZWFkKElOSVRJQVRPUl9DT01NQU5EX1JFRykgJiBJQ1JfQVJCSVRSQVRJT05fUFJPR1JFU1MpCisJICYmICFob3N0ZGF0YS0+Y29ubmVjdGVkKTsKKyNlbmRpZgorCisgICAgQVJCX1BSSU5USygic2NzaSVkOiBhcmJpdHJhdGlvbiBjb21wbGV0ZVxuIiwgSE9TVE5PKTsKKworICAgIGlmIChob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJTkNSNTM4MF93cml0ZShNT0RFX1JFRywgTVJfQkFTRSk7IAorCXJldHVybiAtMTsKKyAgICB9CisgICAgLyogCisgICAgICogVGhlIGFyYml0cmF0aW9uIGRlbGF5IGlzIDIuMnVzLCBidXQgdGhpcyBpcyBhIG1pbmltdW0gYW5kIHRoZXJlIGlzIAorICAgICAqIG5vIG1heGltdW0gc28gd2UgY2FuIHNhZmVseSBzbGVlcCBmb3IgY2VpbCgyLjIpIHVzZWNzIHRvIGFjY29tbW9kYXRlCisgICAgICogdGhlIGludGVncmFsIG5hdHVyZSBvZiB1ZGVsYXkoKS4KKyAgICAgKgorICAgICAqLworCisgICAgdWRlbGF5KDMpOworCisgICAgLyogQ2hlY2sgZm9yIGxvc3QgYXJiaXRyYXRpb24gKi8KKyAgICBpZiAoKE5DUjUzODBfcmVhZChJTklUSUFUT1JfQ09NTUFORF9SRUcpICYgSUNSX0FSQklUUkFUSU9OX0xPU1QpIHx8CisJKE5DUjUzODBfcmVhZChDVVJSRU5UX1NDU0lfREFUQV9SRUcpICYgaG9zdGRhdGEtPmlkX2hpZ2hlcl9tYXNrKSB8fAorCShOQ1I1MzgwX3JlYWQoSU5JVElBVE9SX0NPTU1BTkRfUkVHKSAmIElDUl9BUkJJVFJBVElPTl9MT1NUKSB8fAorCWhvc3RkYXRhLT5jb25uZWN0ZWQpIHsKKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsgCisJQVJCX1BSSU5USygic2NzaSVkOiBsb3N0IGFyYml0cmF0aW9uLCBkZWFzc2VydGluZyBNUl9BUkJJVFJBVEVcbiIsCisJCSAgIEhPU1ROTyk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgICAvKiBhZnRlci9kdXJpbmcgYXJiaXRyYXRpb24sIEJTWSBzaG91bGQgYmUgYXNzZXJ0ZWQuCisJSUJNIERQRVMtMzEwODAgVmVyc2lvbiBTMzFRIHdvcmtzIG5vdyAqLworICAgICAvKiBUbnggdG8gVGhvbWFzX1JvZXNjaEBtMi5tYXVzLmRlIGZvciBmaW5kaW5nIHRoaXMhIChSb21hbikgKi8KKyAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX1NFTCB8CisJCQkJCSBJQ1JfQVNTRVJUX0JTWSApIDsKKyAgICAKKyAgICBpZiAoKE5DUjUzODBfcmVhZChJTklUSUFUT1JfQ09NTUFORF9SRUcpICYgSUNSX0FSQklUUkFUSU9OX0xPU1QpIHx8CisJaG9zdGRhdGEtPmNvbm5lY3RlZCkgeworCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJQVJCX1BSSU5USygic2NzaSVkOiBsb3N0IGFyYml0cmF0aW9uLCBkZWFzc2VydGluZyBJQ1JfQVNTRVJUX1NFTFxuIiwKKwkJICAgSE9TVE5PKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogCisgICAgICogQWdhaW4sIGJ1cyBjbGVhciArIGJ1cyBzZXR0bGUgdGltZSBpcyAxLjJ1cywgaG93ZXZlciwgdGhpcyBpcyAKKyAgICAgKiBhIG1pbmltdW0gc28gd2UnbGwgdWRlbGF5IGNlaWwoMS4yKQorICAgICAqLworCisjaWZkZWYgQ09ORklHX0FUQVJJX1NDU0lfVE9TSElCQV9ERUxBWQorICAgIC8qICsrcm9tYW46IEJ1dCBzb21lIHRhcmdldHMgKHNlZSBhYm92ZSA6LSkgc2VlbSB0byBuZWVkIGEgYml0IG1vcmUuLi4gKi8KKyAgICB1ZGVsYXkoMTUpOworI2Vsc2UKKyAgICB1ZGVsYXkoMik7CisjZW5kaWYKKyAgICAKKyAgICBpZiAoaG9zdGRhdGEtPmNvbm5lY3RlZCkgeworCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIEFSQl9QUklOVEsoInNjc2klZDogd29uIGFyYml0cmF0aW9uXG4iLCBIT1NUTk8pOworCisgICAgLyogCisgICAgICogTm93IHRoYXQgd2UgaGF2ZSB3b24gYXJiaXRyYXRpb24sIHN0YXJ0IFNlbGVjdGlvbiBwcm9jZXNzLCBhc3NlcnRpbmcgCisgICAgICogdGhlIGhvc3QgYW5kIHRhcmdldCBJRCdzIG9uIHRoZSBTQ1NJIGJ1cy4KKyAgICAgKi8KKworICAgIE5DUjUzODBfd3JpdGUoT1VUUFVUX0RBVEFfUkVHLCAoaG9zdGRhdGEtPmlkX21hc2sgfCAoMSA8PCBjbWQtPmRldmljZS0+aWQpKSk7CisKKyAgICAvKiAKKyAgICAgKiBSYWlzZSBBVE4gd2hpbGUgU0VMIGlzIHRydWUgYmVmb3JlIEJTWSBnb2VzIGZhbHNlIGZyb20gYXJiaXRyYXRpb24sCisgICAgICogc2luY2UgdGhpcyBpcyB0aGUgb25seSB3YXkgdG8gZ3VhcmFudGVlIHRoYXQgd2UnbGwgZ2V0IGEgTUVTU0FHRSBPVVQKKyAgICAgKiBwaGFzZSBpbW1lZGlhdGVseSBhZnRlciBzZWxlY3Rpb24uCisgICAgICovCisKKyAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgKElDUl9CQVNFIHwgSUNSX0FTU0VSVF9CU1kgfCAKKwlJQ1JfQVNTRVJUX0RBVEEgfCBJQ1JfQVNTRVJUX0FUTiB8IElDUl9BU1NFUlRfU0VMICkpOworICAgIE5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworCisgICAgLyogCisgICAgICogUmVzZWxlY3QgaW50ZXJydXB0cyBtdXN0IGJlIHR1cm5lZCBvZmYgcHJpb3IgdG8gdGhlIGRyb3BwaW5nIG9mIEJTWSwKKyAgICAgKiBvdGhlcndpc2Ugd2Ugd2lsbCB0cmlnZ2VyIGFuIGludGVycnVwdC4KKyAgICAgKi8KKworICAgIGlmIChob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgMCk7CisKKyAgICAvKgorICAgICAqIFRoZSBpbml0aWF0b3Igc2hhbGwgdGhlbiB3YWl0IGF0IGxlYXN0IHR3byBkZXNrZXcgZGVsYXlzIGFuZCByZWxlYXNlIAorICAgICAqIHRoZSBCU1kgc2lnbmFsLgorICAgICAqLworICAgIHVkZWxheSgxKTsgICAgICAgIC8qIHdpbmdlbCAtLSB3YWl0IHR3byBidXMgZGVza2V3IGRlbGF5ID4yKjQ1bnMgKi8KKworICAgIC8qIFJlc2V0IEJTWSAqLworICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCAoSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0RBVEEgfCAKKwlJQ1JfQVNTRVJUX0FUTiB8IElDUl9BU1NFUlRfU0VMKSk7CisKKyAgICAvKiAKKyAgICAgKiBTb21ldGhpbmcgd2VpcmQgaGFwcGVucyB3aGVuIHdlIGNlYXNlIHRvIGRyaXZlIEJTWSAtIGxvb2tzCisgICAgICogbGlrZSB0aGUgYm9hcmQvY2hpcCBpcyBsZXR0aW5nIHVzIGRvIGFub3RoZXIgcmVhZCBiZWZvcmUgdGhlIAorICAgICAqIGFwcHJvcHJpYXRlIHByb3BhZ2F0aW9uIGRlbGF5IGhhcyBleHBpcmVkLCBhbmQgd2UncmUgY29uZnVzaW5nCisgICAgICogYSBCU1kgc2lnbmFsIGZyb20gb3Vyc2VsdmVzIGFzIHRoZSB0YXJnZXQncyByZXNwb25zZSB0byBTRUxFQ1RJT04uCisgICAgICoKKyAgICAgKiBBIHNtYWxsIGRlbGF5ICh0aGUgJ0MrKycgZnJvbnRlbmQgYnJlYWtzIHRoZSBwaXBlbGluZSB3aXRoIGFuCisgICAgICogdW5uZWNlc3NhcnkganVtcCwgbWFraW5nIGl0IHdvcmsgb24gbXkgMzg2LTMzL1RyYW50b3IgVDEyOCwgdGhlCisgICAgICogdGlnaHRlciAnQycgY29kZSBicmVha3MgYW5kIHJlcXVpcmVzIHRoaXMpIHNvbHZlcyB0aGUgcHJvYmxlbSAtIAorICAgICAqIHRoZSAxIHVzIGRlbGF5IGlzIGFyYml0cmFyeSwgYW5kIG9ubHkgdXNlZCBiZWNhdXNlIHRoaXMgZGVsYXkgd2lsbCAKKyAgICAgKiBiZSB0aGUgc2FtZSBvbiBvdGhlciBwbGF0Zm9ybXMgYW5kIHNpbmNlIGl0IHdvcmtzIGhlcmUsIGl0IHNob3VsZCAKKyAgICAgKiB3b3JrIHRoZXJlLgorICAgICAqCisgICAgICogd2luZ2VsIHN1Z2dlc3RzIHRoYXQgdGhpcyBjb3VsZCBiZSBkdWUgdG8gZmFpbGluZyB0byB3YWl0CisgICAgICogb25lIGRlc2tldyBkZWxheS4KKyAgICAgKi8KKworICAgIHVkZWxheSgxKTsKKworICAgIFNFTF9QUklOVEsoInNjc2klZDogc2VsZWN0aW5nIHRhcmdldCAlZFxuIiwgSE9TVE5PLCBjbWQtPmRldmljZS0+aWQpOworCisgICAgLyogCisgICAgICogVGhlIFNDU0kgc3BlY2lmaWNhdGlvbiBjYWxscyBmb3IgYSAyNTAgbXMgdGltZW91dCBmb3IgdGhlIGFjdHVhbCAKKyAgICAgKiBzZWxlY3Rpb24uCisgICAgICovCisKKyAgICB0aW1lb3V0ID0gamlmZmllcyArIDI1OyAKKworICAgIC8qIAorICAgICAqIFhYWCB2ZXJ5IGludGVyZXN0aW5nIC0gd2UncmUgc2VlaW5nIGEgYm91bmNlIHdoZXJlIHRoZSBCU1kgd2UgCisgICAgICogYXNzZXJ0ZWQgaXMgYmVpbmcgcmVmbGVjdGVkIC8gc3RpbGwgYXNzZXJ0ZWQgKHByb3BhZ2F0aW9uIGRlbGF5PykKKyAgICAgKiBhbmQgaXQncyBkZXRlY3RpbmcgYXMgdHJ1ZS4gIFNpZ2guCisgICAgICovCisKKyNpZiAwCisgICAgLyogKytyb21hbjogSWYgYSB0YXJnZXQgY29uZm9ybWVkIHRvIHRoZSBTQ1NJIHN0YW5kYXJkLCBpdCB3b3VsZG4ndCBhc3NlcnQKKyAgICAgKiBJTyB3aGlsZSBTRUwgaXMgdHJ1ZS4gQnV0IGFnYWluLCB0aGVyZSBhcmUgc29tZSBkaXNrcyBvdXQgdGhlIGluIHRoZQorICAgICAqIHdvcmxkIHRoYXQgZG8gdGhhdCBuZXZlcnRoZWxlc3MuIChTb21lYm9keSBjbGFpbWVkIHRoYXQgdGhpcyBhbm5vdW5jZXMKKyAgICAgKiByZXNlbGVjdGlvbiBjYXBhYmlsaXR5IG9mIHRoZSB0YXJnZXQuKSBTbyB3ZSBiZXR0ZXIgc2tpcCB0aGF0IHRlc3QgYW5kCisgICAgICogb25seSB3YWl0IGZvciBCU1kuLi4gKEZhbW91cyBnZXJtYW4gd29yZHM6IERlciBLbPxnZXJlIGdpYnQgbmFjaCA6LSkKKyAgICAgKi8KKworICAgIHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSAmJiAhKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIAorCShTUl9CU1kgfCBTUl9JTykpKTsKKworICAgIGlmICgoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgKFNSX1NFTCB8IFNSX0lPKSkgPT0gCisJICAgIChTUl9TRUwgfCBTUl9JTykpIHsKKwkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkgICAgTkNSNTM4MF9yZXNlbGVjdChpbnN0YW5jZSk7CisJICAgIHByaW50ayAoS0VSTl9FUlIgInNjc2klZDogcmVzZWxlY3Rpb24gYWZ0ZXIgd29uIGFyYml0cmF0aW9uP1xuIiwKKwkJICAgIEhPU1ROTyk7CisJICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkgICAgcmV0dXJuIC0xOworICAgIH0KKyNlbHNlCisgICAgd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmICEoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfQlNZKSk7CisjZW5kaWYKKworICAgIC8qIAorICAgICAqIE5vIGxlc3MgdGhhbiB0d28gZGVza2V3IGRlbGF5cyBhZnRlciB0aGUgaW5pdGlhdG9yIGRldGVjdHMgdGhlIAorICAgICAqIEJTWSBzaWduYWwgaXMgdHJ1ZSwgaXQgc2hhbGwgcmVsZWFzZSB0aGUgU0VMIHNpZ25hbCBhbmQgbWF5IAorICAgICAqIGNoYW5nZSB0aGUgREFUQSBCVVMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13aW5nZWwKKyAgICAgKi8KKworICAgIHVkZWxheSgxKTsKKworICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQVROKTsKKworICAgIGlmICghKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIFNSX0JTWSkpIHsKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCWlmIChob3N0ZGF0YS0+dGFyZ2V0c19wcmVzZW50ICYgKDEgPDwgY21kLT5kZXZpY2UtPmlkKSkgeworCSAgICBwcmludGsoS0VSTl9FUlIgInNjc2klZDogd2VpcmRuZXNzXG4iLCBIT1NUTk8pOworCSAgICBpZiAoaG9zdGRhdGEtPnJlc3RhcnRfc2VsZWN0KQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIlx0cmVzdGFydCBzZWxlY3RcbiIpOworCSAgICBOQ1JfUFJJTlQoTkRFQlVHX0FOWSk7CisJICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKwljbWQtPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2OworI2lmZGVmIE5DUjUzODBfU1RBVFMKKwljb2xsZWN0X3N0YXRzKGhvc3RkYXRhLCBjbWQpOworI2VuZGlmCisjaWZkZWYgU1VQUE9SVF9UQUdTCisJY21kX2ZyZWVfdGFnKCBjbWQgKTsKKyNlbmRpZgorCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCVNFTF9QUklOVEsoInNjc2klZDogdGFyZ2V0IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gMjUwbXNcbiIsIEhPU1ROTyk7CisJTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCXJldHVybiAwOworICAgIH0gCisKKyAgICBob3N0ZGF0YS0+dGFyZ2V0c19wcmVzZW50IHw9ICgxIDw8IGNtZC0+ZGV2aWNlLT5pZCk7CisKKyAgICAvKgorICAgICAqIFNpbmNlIHdlIGZvbGxvd2VkIHRoZSBTQ1NJIHNwZWMsIGFuZCByYWlzZWQgQVROIHdoaWxlIFNFTCAKKyAgICAgKiB3YXMgdHJ1ZSBidXQgYmVmb3JlIEJTWSB3YXMgZmFsc2UgZHVyaW5nIHNlbGVjdGlvbiwgdGhlIGluZm9ybWF0aW9uCisgICAgICogdHJhbnNmZXIgcGhhc2Ugc2hvdWxkIGJlIGEgTUVTU0FHRSBPVVQgcGhhc2Ugc28gdGhhdCB3ZSBjYW4gc2VuZCB0aGUKKyAgICAgKiBJREVOVElGWSBtZXNzYWdlLgorICAgICAqIAorICAgICAqIElmIFNDU0ktSUkgdGFnZ2VkIHF1ZXVpbmcgaXMgZW5hYmxlZCwgd2UgYWxzbyBzZW5kIGEgU0lNUExFX1FVRVVFX1RBRworICAgICAqIG1lc3NhZ2UgKDIgYnl0ZXMpIHdpdGggYSB0YWcgSUQgdGhhdCB3ZSBpbmNyZW1lbnQgd2l0aCBldmVyeSBjb21tYW5kCisgICAgICogdW50aWwgaXQgd3JhcHMgYmFjayB0byAwLgorICAgICAqCisgICAgICogWFhYIC0gaXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgYXJlIHNvbWUgYnJva2VuIFNDU0ktSUkgZGV2aWNlcywKKyAgICAgKgkgICAgIHdoaWNoIGNsYWltIHRvIHN1cHBvcnQgdGFnZ2VkIHF1ZXVpbmcgYnV0IGZhaWwgd2hlbiBtb3JlIHRoYW4KKyAgICAgKgkgICAgIHNvbWUgbnVtYmVyIG9mIGNvbW1hbmRzIGFyZSBpc3N1ZWQgYXQgb25jZS4KKyAgICAgKi8KKworICAgIC8qIFdhaXQgZm9yIHN0YXJ0IG9mIFJFUS9BQ0sgaGFuZHNoYWtlICovCisgICAgd2hpbGUgKCEoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfUkVRKSk7CisKKyAgICBTRUxfUFJJTlRLKCJzY3NpJWQ6IHRhcmdldCAlZCBzZWxlY3RlZCwgZ29pbmcgaW50byBNRVNTQUdFIE9VVCBwaGFzZS5cbiIsCisJICAgICAgIEhPU1ROTywgY21kLT5kZXZpY2UtPmlkKTsKKyAgICB0bXBbMF0gPSBJREVOVElGWSgxLCBjbWQtPmRldmljZS0+bHVuKTsKKworI2lmZGVmIFNVUFBPUlRfVEFHUworICAgIGlmIChjbWQtPnRhZyAhPSBUQUdfTk9ORSkgeworCXRtcFsxXSA9IGhvc3RkYXRhLT5sYXN0X21lc3NhZ2UgPSBTSU1QTEVfUVVFVUVfVEFHOworCXRtcFsyXSA9IGNtZC0+dGFnOworCWxlbiA9IDM7CisgICAgfSBlbHNlIAorCWxlbiA9IDE7CisjZWxzZQorICAgIGxlbiA9IDE7CisgICAgY21kLT50YWc9MDsKKyNlbmRpZiAvKiBTVVBQT1JUX1RBR1MgKi8KKworICAgIC8qIFNlbmQgbWVzc2FnZShzKSAqLworICAgIGRhdGEgPSB0bXA7CisgICAgcGhhc2UgPSBQSEFTRV9NU0dPVVQ7CisgICAgTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgJmxlbiwgJmRhdGEpOworICAgIFNFTF9QUklOVEsoInNjc2klZDogbmV4dXMgZXN0YWJsaXNoZWQuXG4iLCBIT1NUTk8pOworICAgIC8qIFhYWCBuZWVkIHRvIGhhbmRsZSBlcnJvcnMgaGVyZSAqLworICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBjbWQ7CisjaWZuZGVmIFNVUFBPUlRfVEFHUworICAgIGhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gfD0gKDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisjZW5kaWYgICAgCisKKyAgICBpbml0aWFsaXplX1NDcChjbWQpOworCisKKyAgICByZXR1cm4gMDsKK30KKworLyogCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX3RyYW5zZmVyX3BpbyAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIAorICogICAgICB1bnNpZ25lZCBjaGFyICpwaGFzZSwgaW50ICpjb3VudCwgdW5zaWduZWQgY2hhciAqKmRhdGEpCisgKgorICogUHVycG9zZSA6IHRyYW5zZmVycyBkYXRhIGluIGdpdmVuIHBoYXNlIHVzaW5nIHBvbGxlZCBJL08KKyAqCisgKiBJbnB1dHMgOiBpbnN0YW5jZSAtIGluc3RhbmNlIG9mIGRyaXZlciwgKnBoYXNlIC0gcG9pbnRlciB0byAKKyAqCXdoYXQgcGhhc2UgaXMgZXhwZWN0ZWQsICpjb3VudCAtIHBvaW50ZXIgdG8gbnVtYmVyIG9mIAorICoJYnl0ZXMgdG8gdHJhbnNmZXIsICoqZGF0YSAtIHBvaW50ZXIgdG8gZGF0YSBwb2ludGVyLgorICogCisgKiBSZXR1cm5zIDogLTEgd2hlbiBkaWZmZXJlbnQgcGhhc2UgaXMgZW50ZXJlZCB3aXRob3V0IHRyYW5zZmVycmluZworICoJbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMsIDAgaWYgYWxsIGJ5dGVzIGFyZSB0cmFuc2ZlcmVkIG9yIGV4aXQKKyAqCWlzIGluIHNhbWUgcGhhc2UuCisgKgorICogCUFsc28sICpwaGFzZSwgKmNvdW50LCAqZGF0YSBhcmUgbW9kaWZpZWQgaW4gcGxhY2UuCisgKgorICogWFhYIE5vdGUgOiBoYW5kbGluZyBmb3IgYnVzIGZyZWUgbWF5IGJlIHVzZWZ1bC4KKyAqLworCisvKgorICogTm90ZSA6IHRoaXMgY29kZSBpcyBub3QgYXMgcXVpY2sgYXMgaXQgY291bGQgYmUsIGhvd2V2ZXIgaXQgCisgKiBJUyAxMDAlIHJlbGlhYmxlLCBhbmQgZm9yIHRoZSBhY3R1YWwgZGF0YSB0cmFuc2ZlciB3aGVyZSBzcGVlZAorICogY291bnRzLCB3ZSB3aWxsIGFsd2F5cyBkbyBhIHBzZXVkbyBETUEgb3IgRE1BIHRyYW5zZmVyLgorICovCisKK3N0YXRpYyBpbnQgTkNSNTM4MF90cmFuc2Zlcl9waW8oIHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCAKKwkJCQkgdW5zaWduZWQgY2hhciAqcGhhc2UsIGludCAqY291bnQsCisJCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhKQoreworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgcCA9ICpwaGFzZSwgdG1wOworICAgIHJlZ2lzdGVyIGludCBjID0gKmNvdW50OworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmQgPSAqZGF0YTsKKworICAgIC8qIAorICAgICAqIFRoZSBOQ1I1MzgwIGNoaXAgd2lsbCBvbmx5IGRyaXZlIHRoZSBTQ1NJIGJ1cyB3aGVuIHRoZSAKKyAgICAgKiBwaGFzZSBzcGVjaWZpZWQgaW4gdGhlIGFwcHJvcHJpYXRlIGJpdHMgb2YgdGhlIFRBUkdFVCBDT01NQU5ECisgICAgICogUkVHSVNURVIgbWF0Y2ggdGhlIFNUQVRVUyBSRUdJU1RFUgorICAgICAqLworCisgICAgTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIFBIQVNFX1NSX1RPX1RDUihwKSk7CisKKyAgICBkbyB7CisJLyogCisJICogV2FpdCBmb3IgYXNzZXJ0aW9uIG9mIFJFUSwgYWZ0ZXIgd2hpY2ggdGhlIHBoYXNlIGJpdHMgd2lsbCBiZSAKKwkgKiB2YWxpZCAKKwkgKi8KKwl3aGlsZSAoISgodG1wID0gTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpKSAmIFNSX1JFUSkpOworCisJSFNIX1BSSU5USygic2NzaSVkOiBSRVEgZGV0ZWN0ZWRcbiIsIEhPU1ROTyk7CisKKwkvKiBDaGVjayBmb3IgcGhhc2UgbWlzbWF0Y2ggKi8JCisJaWYgKCh0bXAgJiBQSEFTRV9NQVNLKSAhPSBwKSB7CisJICAgIFBJT19QUklOVEsoInNjc2klZDogcGhhc2UgbWlzbWF0Y2hcbiIsIEhPU1ROTyk7CisJICAgIE5DUl9QUklOVF9QSEFTRShOREVCVUdfUElPKTsKKwkgICAgYnJlYWs7CisJfQorCisJLyogRG8gYWN0dWFsIHRyYW5zZmVyIGZyb20gU0NTSSBidXMgdG8gLyBmcm9tIG1lbW9yeSAqLworCWlmICghKHAgJiBTUl9JTykpIAorCSAgICBOQ1I1MzgwX3dyaXRlKE9VVFBVVF9EQVRBX1JFRywgKmQpOworCWVsc2UgCisJICAgICpkID0gTkNSNTM4MF9yZWFkKENVUlJFTlRfU0NTSV9EQVRBX1JFRyk7CisKKwkrK2Q7CisKKwkvKiAKKwkgKiBUaGUgU0NTSSBzdGFuZGFyZCBzdWdnZXN0cyB0aGF0IGluIE1TR09VVCBwaGFzZSwgdGhlIGluaXRpYXRvcgorCSAqIHNob3VsZCBkcm9wIEFUTiBvbiB0aGUgbGFzdCBieXRlIG9mIHRoZSBtZXNzYWdlIHBoYXNlCisJICogYWZ0ZXIgUkVRIGhhcyBiZWVuIGFzc2VydGVkIGZvciB0aGUgaGFuZHNoYWtlIGJ1dCBiZWZvcmUKKwkgKiB0aGUgaW5pdGlhdG9yIHJhaXNlcyBBQ0suCisJICovCisKKwlpZiAoIShwICYgU1JfSU8pKSB7CisJICAgIGlmICghKChwICYgU1JfTVNHKSAmJiBjID4gMSkpIHsKKwkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgCisJCSAgICBJQ1JfQVNTRVJUX0RBVEEpOworCQlOQ1JfUFJJTlQoTkRFQlVHX1BJTyk7CisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IAorCQkJSUNSX0FTU0VSVF9EQVRBIHwgSUNSX0FTU0VSVF9BQ0spOworCSAgICB9IGVsc2UgeworCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfAorCQkgICAgSUNSX0FTU0VSVF9EQVRBIHwgSUNSX0FTU0VSVF9BVE4pOworCQlOQ1JfUFJJTlQoTkRFQlVHX1BJTyk7CisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IAorCQkgICAgSUNSX0FTU0VSVF9EQVRBIHwgSUNSX0FTU0VSVF9BVE4gfCBJQ1JfQVNTRVJUX0FDSyk7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBOQ1JfUFJJTlQoTkRFQlVHX1BJTyk7CisJICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQUNLKTsKKwl9CisKKwl3aGlsZSAoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfUkVRKTsKKworCUhTSF9QUklOVEsoInNjc2klZDogcmVxIGZhbHNlLCBoYW5kc2hha2UgY29tcGxldGVcbiIsIEhPU1ROTyk7CisKKy8qCisgKiBXZSBoYXZlIHNldmVyYWwgc3BlY2lhbCBjYXNlcyB0byBjb25zaWRlciBkdXJpbmcgUkVRL0FDSyBoYW5kc2hha2luZyA6IAorICogMS4gIFdlIHdlcmUgaW4gTVNHT1VUIHBoYXNlLCBhbmQgd2UgYXJlIG9uIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIAorICoJbWVzc2FnZS4gIEFUTiBtdXN0IGJlIGRyb3BwZWQgYXMgQUNLIGlzIGRyb3BwZWQuCisgKgorICogMi4gIFdlIGFyZSBpbiBhIE1TR0lOIHBoYXNlLCBhbmQgd2UgYXJlIG9uIHRoZSBsYXN0IGJ5dGUgb2YgdGhlICAKKyAqCW1lc3NhZ2UuICBXZSBtdXN0IGV4aXQgd2l0aCBBQ0sgYXNzZXJ0ZWQsIHNvIHRoYXQgdGhlIGNhbGxpbmcKKyAqCWNvZGUgbWF5IHJhaXNlIEFUTiBiZWZvcmUgZHJvcHBpbmcgQUNLIHRvIHJlamVjdCB0aGUgbWVzc2FnZS4KKyAqCisgKiAzLiAgQUNLIGFuZCBBVE4gYXJlIGNsZWFyIGFuZCB0aGUgdGFyZ2V0IG1heSBwcm9jZWVkIGFzIG5vcm1hbC4KKyAqLworCWlmICghKHAgPT0gUEhBU0VfTVNHSU4gJiYgYyA9PSAxKSkgeyAgCisJICAgIGlmIChwID09IFBIQVNFX01TR09VVCAmJiBjID4gMSkKKwkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9BVE4pOworCSAgICBlbHNlCisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJfSAKKyAgICB9IHdoaWxlICgtLWMpOworCisgICAgUElPX1BSSU5USygic2NzaSVkOiByZXNpZHVhbCAlZFxuIiwgSE9TVE5PLCBjKTsKKworICAgICpjb3VudCA9IGM7CisgICAgKmRhdGEgPSBkOworICAgIHRtcCA9IE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKTsKKyAgICAvKiBUaGUgcGhhc2UgcmVhZCBmcm9tIHRoZSBidXMgaXMgdmFsaWQgaWYgZWl0aGVyIFJFUSBpcyAoYWxyZWFkeSkKKyAgICAgKiBhc3NlcnRlZCBvciBpZiBBQ0sgaGFzbid0IGJlZW4gcmVsZWFzZWQgeWV0LiBUaGUgbGF0dGVyIGlzIHRoZSBjYXNlIGlmCisgICAgICogd2UncmUgaW4gTVNHSU4gYW5kIGFsbCB3YW50ZWQgYnl0ZXMgaGF2ZSBiZWVuIHJlY2VpdmVkLiAqLworICAgIGlmICgodG1wICYgU1JfUkVRKSB8fCAocCA9PSBQSEFTRV9NU0dJTiAmJiBjID09IDApKQorCSpwaGFzZSA9IHRtcCAmIFBIQVNFX01BU0s7CisgICAgZWxzZSAKKwkqcGhhc2UgPSBQSEFTRV9VTktOT1dOOworCisgICAgaWYgKCFjIHx8ICgqcGhhc2UgPT0gcCkpCisJcmV0dXJuIDA7CisgICAgZWxzZSAKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IGRvX2Fib3J0IChTY3NpX0hvc3QgKmhvc3QpCisgKiAKKyAqIFB1cnBvc2UgOiBhYm9ydCB0aGUgY3VycmVudGx5IGVzdGFibGlzaGVkIG5leHVzLiAgU2hvdWxkIG9ubHkgYmUgCisgKiAJY2FsbGVkIGZyb20gYSByb3V0aW5lIHdoaWNoIGNhbiBkcm9wIGludG8gYSAKKyAqIAorICogUmV0dXJucyA6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IGRvX2Fib3J0IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KSAKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHRtcCwgKm1zZ3B0ciwgcGhhc2U7CisgICAgaW50IGxlbjsKKworICAgIC8qIFJlcXVlc3QgbWVzc2FnZSBvdXQgcGhhc2UgKi8KKyAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0FUTik7CisKKyAgICAvKiAKKyAgICAgKiBXYWl0IGZvciB0aGUgdGFyZ2V0IHRvIGluZGljYXRlIGEgdmFsaWQgcGhhc2UgYnkgYXNzZXJ0aW5nIAorICAgICAqIFJFUS4gIE9uY2UgdGhpcyBoYXBwZW5zLCB3ZSdsbCBoYXZlIGVpdGhlciBhIE1TR09VVCBwaGFzZSAKKyAgICAgKiBhbmQgY2FuIGltbWVkaWF0ZWx5IHNlbmQgdGhlIEFCT1JUIG1lc3NhZ2UsIG9yIHdlJ2xsIGhhdmUgc29tZSAKKyAgICAgKiBvdGhlciBwaGFzZSBhbmQgd2lsbCBoYXZlIHRvIHNvdXJjZS9zaW5rIGRhdGEuCisgICAgICogCisgICAgICogV2UgcmVhbGx5IGRvbid0IGNhcmUgd2hhdCB2YWx1ZSB3YXMgb24gdGhlIGJ1cyBvciB3aGF0IHZhbHVlCisgICAgICogdGhlIHRhcmdldCBzZWVzLCBzbyB3ZSBqdXN0IGhhbmRzaGFrZS4KKyAgICAgKi8KKyAgICAKKyAgICB3aGlsZSAoISh0bXAgPSBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykpICYgU1JfUkVRKTsKKworICAgIE5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCBQSEFTRV9TUl9UT19UQ1IodG1wKSk7CisKKyAgICBpZiAoKHRtcCAmIFBIQVNFX01BU0spICE9IFBIQVNFX01TR09VVCkgeworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQVROIHwgCisJCSAgICAgIElDUl9BU1NFUlRfQUNLKTsKKwl3aGlsZSAoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfUkVRKTsKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0FUTik7CisgICAgfQorICAgCisgICAgdG1wID0gQUJPUlQ7CisgICAgbXNncHRyID0gJnRtcDsKKyAgICBsZW4gPSAxOworICAgIHBoYXNlID0gUEhBU0VfTVNHT1VUOworICAgIE5DUjUzODBfdHJhbnNmZXJfcGlvIChob3N0LCAmcGhhc2UsICZsZW4sICZtc2dwdHIpOworCisgICAgLyoKKyAgICAgKiBJZiB3ZSBnb3QgaGVyZSwgYW5kIHRoZSBjb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksCisgICAgICogd2UncmUgYWJvdXQgdG8gZ28gaW50byBidXMgZnJlZSBzdGF0ZS4KKyAgICAgKi8KKworICAgIHJldHVybiBsZW4gPyAtMSA6IDA7Cit9CisKKyNpZiBkZWZpbmVkKFJFQUxfRE1BKQorLyogCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX3RyYW5zZmVyX2RtYSAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIAorICogICAgICB1bnNpZ25lZCBjaGFyICpwaGFzZSwgaW50ICpjb3VudCwgdW5zaWduZWQgY2hhciAqKmRhdGEpCisgKgorICogUHVycG9zZSA6IHRyYW5zZmVycyBkYXRhIGluIGdpdmVuIHBoYXNlIHVzaW5nIGVpdGhlciByZWFsCisgKglvciBwc2V1ZG8gRE1BLgorICoKKyAqIElucHV0cyA6IGluc3RhbmNlIC0gaW5zdGFuY2Ugb2YgZHJpdmVyLCAqcGhhc2UgLSBwb2ludGVyIHRvIAorICoJd2hhdCBwaGFzZSBpcyBleHBlY3RlZCwgKmNvdW50IC0gcG9pbnRlciB0byBudW1iZXIgb2YgCisgKglieXRlcyB0byB0cmFuc2ZlciwgKipkYXRhIC0gcG9pbnRlciB0byBkYXRhIHBvaW50ZXIuCisgKiAKKyAqIFJldHVybnMgOiAtMSB3aGVuIGRpZmZlcmVudCBwaGFzZSBpcyBlbnRlcmVkIHdpdGhvdXQgdHJhbnNmZXJyaW5nCisgKgltYXhpbXVtIG51bWJlciBvZiBieXRlcywgMCBpZiBhbGwgYnl0ZXMgb3IgdHJhbnNmZXJlZCBvciBleGl0CisgKglpcyBpbiBzYW1lIHBoYXNlLgorICoKKyAqIAlBbHNvLCAqcGhhc2UsICpjb3VudCwgKmRhdGEgYXJlIG1vZGlmaWVkIGluIHBsYWNlLgorICoKKyAqLworCisKK3N0YXRpYyBpbnQgTkNSNTM4MF90cmFuc2Zlcl9kbWEoIHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCAKKwkJCQkgdW5zaWduZWQgY2hhciAqcGhhc2UsIGludCAqY291bnQsCisJCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhKQoreworICAgIFNFVFVQX0hPU1REQVRBKGluc3RhbmNlKTsKKyAgICByZWdpc3RlciBpbnQgYyA9ICpjb3VudDsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIHAgPSAqcGhhc2U7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqZCA9ICpkYXRhOworICAgIHVuc2lnbmVkIGNoYXIgdG1wOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBpZiAoKHRtcCA9IChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBQSEFTRV9NQVNLKSkgIT0gcCkgeworICAgICAgICAqcGhhc2UgPSB0bXA7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoYXRhcmlfcmVhZF9vdmVycnVucyAmJiAocCAmIFNSX0lPKSkgeworCWMgLT0gYXRhcmlfcmVhZF9vdmVycnVuczsKKyAgICB9CisKKyAgICBETUFfUFJJTlRLKCJzY3NpJWQ6IGluaXRpYWxpemluZyBETUEgZm9yICVzLCAlZCBieXRlcyAlcyAlcFxuIiwKKwkgICAgICAgSE9TVE5PLCAocCAmIFNSX0lPKSA/ICJyZWFkaW5nIiA6ICJ3cml0aW5nIiwKKwkgICAgICAgYywgKHAgJiBTUl9JTykgPyAidG8iIDogImZyb20iLCBkKTsKKworICAgIE5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCBQSEFTRV9TUl9UT19UQ1IocCkpOworCisjaWZkZWYgUkVBTF9ETUEKKyAgICBOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFIHwgTVJfRE1BX01PREUgfCBNUl9FTkFCTEVfRU9QX0lOVFIgfCBNUl9NT05JVE9SX0JTWSk7CisjZW5kaWYgLyogZGVmIFJFQUxfRE1BICAqLworCisgICAgaWYgKElTX0FfVFQoKSkgeworCS8qIE9uIHRoZSBNZWR1c2EsIGl0IGlzIGEgbXVzdCB0byBpbml0aWFsaXplIHRoZSBETUEgYmVmb3JlCisJICogc3RhcnRpbmcgdGhlIE5DUi4gVGhpcyBpcyBhbHNvIHRoZSBjbGVhbmVyIHdheSBmb3IgdGhlIFRULgorCSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlob3N0ZGF0YS0+ZG1hX2xlbiA9IChwICYgU1JfSU8pID8KKwkgICAgTkNSNTM4MF9kbWFfcmVhZF9zZXR1cChpbnN0YW5jZSwgZCwgYykgOiAKKwkgICAgTkNSNTM4MF9kbWFfd3JpdGVfc2V0dXAoaW5zdGFuY2UsIGQsIGMpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICB9CisgICAgCisgICAgaWYgKHAgJiBTUl9JTykKKwlOQ1I1MzgwX3dyaXRlKFNUQVJUX0RNQV9JTklUSUFUT1JfUkVDRUlWRV9SRUcsIDApOworICAgIGVsc2UgeworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfREFUQSk7CisJTkNSNTM4MF93cml0ZShTVEFSVF9ETUFfU0VORF9SRUcsIDApOworICAgIH0KKworICAgIGlmICghSVNfQV9UVCgpKSB7CisJLyogT24gdGhlIEZhbGNvbiwgdGhlIERNQSBzZXR1cCBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIGxhc3QgKi8KKwkvKiBOQ1IgYWNjZXNzLCBlbHNlIHRoZSBETUEgc2V0dXAgZ2V0cyB0cmFzaGVkIQorCSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlob3N0ZGF0YS0+ZG1hX2xlbiA9IChwICYgU1JfSU8pID8KKwkgICAgTkNSNTM4MF9kbWFfcmVhZF9zZXR1cChpbnN0YW5jZSwgZCwgYykgOiAKKwkgICAgTkNSNTM4MF9kbWFfd3JpdGVfc2V0dXAoaW5zdGFuY2UsIGQsIGMpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogZGVmaW5lZChSRUFMX0RNQSkgKi8KKworLyoKKyAqIEZ1bmN0aW9uIDogTkNSNTM4MF9pbmZvcm1hdGlvbl90cmFuc2ZlciAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCisgKgorICogUHVycG9zZSA6IHJ1biB0aHJvdWdoIHRoZSB2YXJpb3VzIFNDU0kgcGhhc2VzIGFuZCBkbyBhcyB0aGUgdGFyZ2V0IAorICogCWRpcmVjdHMgdXMgdG8uICBPcGVyYXRlcyBvbiB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBjb21tYW5kLCAKKyAqCWluc3RhbmNlLT5jb25uZWN0ZWQuCisgKgorICogSW5wdXRzIDogaW5zdGFuY2UsIGluc3RhbmNlIGZvciB3aGljaCB3ZSBhcmUgZG9pbmcgY29tbWFuZHMKKyAqCisgKiBTaWRlIGVmZmVjdHMgOiBTQ1NJIHRoaW5ncyBoYXBwZW4sIHRoZSBkaXNjb25uZWN0ZWQgcXVldWUgd2lsbCBiZSAKKyAqCW1vZGlmaWVkIGlmIGEgY29tbWFuZCBkaXNjb25uZWN0cywgKmluc3RhbmNlLT5jb25uZWN0ZWQgd2lsbAorICoJY2hhbmdlLgorICoKKyAqIFhYWCBOb3RlIDogd2UgbmVlZCB0byB3YXRjaCBmb3IgYnVzIGZyZWUgb3IgYSByZXNldCBjb25kaXRpb24gaGVyZSAKKyAqIAl0byByZWNvdmVyIGZyb20gYW4gdW5leHBlY3RlZCBidXMgZnJlZSBjb25kaXRpb24uCisgKi8KKyAKK3N0YXRpYyB2b2lkIE5DUjUzODBfaW5mb3JtYXRpb25fdHJhbnNmZXIgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworICAgIFNFVFVQX0hPU1REQVRBKGluc3RhbmNlKTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHVuc2lnbmVkIGNoYXIgbXNnb3V0ID0gTk9QOworICAgIGludCBzaW5rID0gMDsKKyAgICBpbnQgbGVuOworI2lmIGRlZmluZWQoUkVBTF9ETUEpCisgICAgaW50IHRyYW5zZmVyc2l6ZTsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgdW5zaWduZWQgY2hhciBwaGFzZSwgdG1wLCBleHRlbmRlZF9tc2dbMTBdLCBvbGRfcGhhc2U9MHhmZjsKKyAgICBTY3NpX0NtbmQgKmNtZCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmNvbm5lY3RlZDsKKworICAgIHdoaWxlICgxKSB7CisJdG1wID0gTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpOworCS8qIFdlIG9ubHkgaGF2ZSBhIHZhbGlkIFNDU0kgcGhhc2Ugd2hlbiBSRVEgaXMgYXNzZXJ0ZWQgKi8KKwlpZiAodG1wICYgU1JfUkVRKSB7CisJICAgIHBoYXNlID0gKHRtcCAmIFBIQVNFX01BU0spOyAKKwkgICAgaWYgKHBoYXNlICE9IG9sZF9waGFzZSkgeworCQlvbGRfcGhhc2UgPSBwaGFzZTsKKwkJTkNSX1BSSU5UX1BIQVNFKE5ERUJVR19JTkZPUk1BVElPTik7CisJICAgIH0KKwkgICAgCisJICAgIGlmIChzaW5rICYmIChwaGFzZSAhPSBQSEFTRV9NU0dPVVQpKSB7CisJCU5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCBQSEFTRV9TUl9UT19UQ1IodG1wKSk7CisKKwkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9BVE4gfCAKKwkJICAgIElDUl9BU1NFUlRfQUNLKTsKKwkJd2hpbGUgKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIFNSX1JFUSk7CisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IAorCQkgICAgSUNSX0FTU0VSVF9BVE4pOworCQlzaW5rID0gMDsKKwkJY29udGludWU7CisJICAgIH0KKworCSAgICBzd2l0Y2ggKHBoYXNlKSB7CisJICAgIGNhc2UgUEhBU0VfREFUQU9VVDoKKyNpZiAoTkRFQlVHICYgTkRFQlVHX05PX0RBVEFPVVQpCisJCXByaW50aygic2NzaSVkOiBOREVCVUdfTk9fREFUQU9VVCBzZXQsIGF0dGVtcHRlZCBEQVRBT1VUICIKKwkJICAgICAgICJhYm9ydGVkXG4iLCBIT1NUTk8pOworCQlzaW5rID0gMTsKKwkJZG9fYWJvcnQoaW5zdGFuY2UpOworCQljbWQtPnJlc3VsdCA9IERJRF9FUlJPUiAgPDwgMTY7CisJCWNtZC0+ZG9uZShjbWQpOworCQlyZXR1cm47CisjZW5kaWYKKwkgICAgY2FzZSBQSEFTRV9EQVRBSU46CisJCS8qIAorCQkgKiBJZiB0aGVyZSBpcyBubyByb29tIGxlZnQgaW4gdGhlIGN1cnJlbnQgYnVmZmVyIGluIHRoZQorCQkgKiBzY2F0dGVyLWdhdGhlciBsaXN0LCBtb3ZlIG9udG8gdGhlIG5leHQgb25lLgorCQkgKi8KKworCQlpZiAoIWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgJiYgY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCkgeworCQkgICAgKytjbWQtPlNDcC5idWZmZXI7CisJCSAgICAtLWNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw7CisJCSAgICBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gY21kLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJCSAgICBjbWQtPlNDcC5wdHIgPSBwYWdlX2FkZHJlc3MoY21kLT5TQ3AuYnVmZmVyLT5wYWdlKSsKKwkJCQkgICBjbWQtPlNDcC5idWZmZXItPm9mZnNldDsKKwkJICAgIC8qICsrcm9tYW46IFRyeSB0byBtZXJnZSBzb21lIHNjYXR0ZXItYnVmZmVycyBpZgorCQkgICAgICogdGhleSBhcmUgYXQgY29udGlndW91cyBwaHlzaWNhbCBhZGRyZXNzZXMuCisJCSAgICAgKi8KKwkJICAgIG1lcmdlX2NvbnRpZ3VvdXNfYnVmZmVycyggY21kICk7CisJCSAgICBJTkZfUFJJTlRLKCJzY3NpJWQ6ICVkIGJ5dGVzIGFuZCAlZCBidWZmZXJzIGxlZnRcbiIsCisJCQkgICAgICAgSE9TVE5PLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsLAorCQkJICAgICAgIGNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpOworCQl9CisKKwkJLyoKKwkJICogVGhlIHByZWZlcnJlZCB0cmFuc2ZlciBtZXRob2QgaXMgZ29pbmcgdG8gYmUgCisJCSAqIFBTRVVETy1ETUEgZm9yIHN5c3RlbXMgdGhhdCBhcmUgc3RyaWN0bHkgUElPLAorCQkgKiBzaW5jZSB3ZSBjYW4gbGV0IHRoZSBoYXJkd2FyZSBkbyB0aGUgaGFuZHNoYWtpbmcuCisJCSAqCisJCSAqIEZvciB0aGlzIHRvIHdvcmssIHdlIG5lZWQgdG8ga25vdyB0aGUgdHJhbnNmZXJzaXplCisJCSAqIGFoZWFkIG9mIHRpbWUsIHNpbmNlIHRoZSBwc2V1ZG8tRE1BIGNvZGUgd2lsbCBzaXQKKwkJICogaW4gYW4gdW5jb25kaXRpb25hbCBsb29wLgorCQkgKi8KKworLyogKytyb21hbjogSSBzdWdnZXN0LCB0aGlzIHNob3VsZCBiZQorICogICAjaWYgZGVmKFJFQUxfRE1BKQorICogaW5zdGVhZCBvZiBsZWF2aW5nIFJFQUxfRE1BIG91dC4KKyAqLworCisjaWYgZGVmaW5lZChSRUFMX0RNQSkKKwkJaWYgKCFjbWQtPmRldmljZS0+Ym9ya2VuICYmCisJCSAgICAodHJhbnNmZXJzaXplID0gTkNSNTM4MF9kbWFfeGZlcl9sZW4oaW5zdGFuY2UsY21kLHBoYXNlKSkgPiAzMSkgeworCQkgICAgbGVuID0gdHJhbnNmZXJzaXplOworCQkgICAgY21kLT5TQ3AucGhhc2UgPSBwaGFzZTsKKwkJICAgIGlmIChOQ1I1MzgwX3RyYW5zZmVyX2RtYShpbnN0YW5jZSwgJnBoYXNlLAorCQkJJmxlbiwgKHVuc2lnbmVkIGNoYXIgKiopICZjbWQtPlNDcC5wdHIpKSB7CisJCQkvKgorCQkJICogSWYgdGhlIHdhdGNoZG9nIHRpbWVyIGZpcmVzLCBhbGwgZnV0dXJlCisJCQkgKiBhY2Nlc3NlcyB0byB0aGlzIGRldmljZSB3aWxsIHVzZSB0aGUKKwkJCSAqIHBvbGxlZC1JTy4gKi8gCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgInNjc2klZDogc3dpdGNoaW5nIHRhcmdldCAlZCAiCisJCQkgICAgICAgImx1biAlZCB0byBzbG93IGhhbmRzaGFrZVxuIiwgSE9TVE5PLAorCQkJICAgICAgIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisJCQljbWQtPmRldmljZS0+Ym9ya2VuID0gMTsKKwkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IAorCQkJICAgIElDUl9BU1NFUlRfQVROKTsKKwkJCXNpbmsgPSAxOworCQkJZG9fYWJvcnQoaW5zdGFuY2UpOworCQkJY21kLT5yZXN1bHQgPSBESURfRVJST1IgIDw8IDE2OworCQkJY21kLT5kb25lKGNtZCk7CisJCQkvKiBYWFggLSBuZWVkIHRvIHNvdXJjZSBvciBzaW5rIGRhdGEgaGVyZSwgYXMgYXBwcm9wcmlhdGUgKi8KKwkJICAgIH0gZWxzZSB7CisjaWZkZWYgUkVBTF9ETUEKKwkJCS8qICsrcm9tYW46IFdoZW4gdXNpbmcgcmVhbCBETUEsCisJCQkgKiBpbmZvcm1hdGlvbl90cmFuc2ZlcigpIHNob3VsZCByZXR1cm4gYWZ0ZXIKKwkJCSAqIHN0YXJ0aW5nIERNQSBzaW5jZSBpdCBoYXMgbm90aGluZyBtb3JlIHRvCisJCQkgKiBkby4KKwkJCSAqLworCQkJcmV0dXJuOworI2Vsc2UJCQkKKwkJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgLT0gdHJhbnNmZXJzaXplIC0gbGVuOworI2VuZGlmCisJCSAgICB9CisJCX0gZWxzZQorI2VuZGlmIC8qIGRlZmluZWQoUkVBTF9ETUEpICovCisJCSAgTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgCisJCSAgICAoaW50ICopICZjbWQtPlNDcC50aGlzX3Jlc2lkdWFsLCAodW5zaWduZWQgY2hhciAqKikKKwkJICAgICZjbWQtPlNDcC5wdHIpOworCQlicmVhazsKKwkgICAgY2FzZSBQSEFTRV9NU0dJTjoKKwkJbGVuID0gMTsKKwkJZGF0YSA9ICZ0bXA7CisJCU5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIDApOyAJLyogZGlzYWJsZSByZXNlbGVjdHMgKi8KKwkJTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgJmxlbiwgJmRhdGEpOworCQljbWQtPlNDcC5NZXNzYWdlID0gdG1wOworCisJCXN3aXRjaCAodG1wKSB7CisJCS8qCisJCSAqIExpbmtpbmcgbGV0cyB1cyByZWR1Y2UgdGhlIHRpbWUgcmVxdWlyZWQgdG8gZ2V0IHRoZSAKKwkJICogbmV4dCBjb21tYW5kIG91dCB0byB0aGUgZGV2aWNlLCBob3BlZnVsbHkgdGhpcyB3aWxsCisJCSAqIG1lYW4gd2UgZG9uJ3Qgd2FzdGUgYW5vdGhlciByZXZvbHV0aW9uIGR1ZSB0byB0aGUgZGVsYXlzCisJCSAqIHJlcXVpcmVkIGJ5IEFSQklUUkFUSU9OIGFuZCBhbm90aGVyIFNFTEVDVElPTi4KKwkJICoKKwkJICogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gcHJvcG9zYWwsIGxvdyBsZXZlbCBkcml2ZXJzCisJCSAqIG1lcmVseSBoYXZlIHRvIHN0YXJ0IHRoZSBuZXh0IGNvbW1hbmQsIHBvaW50ZWQgdG8gYnkgCisJCSAqIG5leHRfbGluaywgZG9uZSgpIGlzIGNhbGxlZCBhcyB3aXRoIHVubGlua2VkIGNvbW1hbmRzLgorCQkgKi8KKyNpZmRlZiBMSU5LRUQKKwkJY2FzZSBMSU5LRURfQ01EX0NPTVBMRVRFOgorCQljYXNlIExJTktFRF9GTEdfQ01EX0NPTVBMRVRFOgorCQkgICAgLyogQWNjZXB0IG1lc3NhZ2UgYnkgY2xlYXJpbmcgQUNLICovCisJCSAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCQkgICAgCisJCSAgICBMTktfUFJJTlRLKCJzY3NpJWQ6IHRhcmdldCAlZCBsdW4gJWQgbGlua2VkIGNvbW1hbmQgIgorCQkJICAgICAgICJjb21wbGV0ZS5cbiIsIEhPU1ROTywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKworCQkgICAgLyogRW5hYmxlIHJlc2VsZWN0IGludGVycnVwdHMgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkJICAgIC8qCisJCSAgICAgKiBTYW5pdHkgY2hlY2sgOiBBIGxpbmtlZCBjb21tYW5kIHNob3VsZCBvbmx5IHRlcm1pbmF0ZQorCQkgICAgICogd2l0aCBvbmUgb2YgdGhlc2UgbWVzc2FnZXMgaWYgdGhlcmUgYXJlIG1vcmUgbGlua2VkCisJCSAgICAgKiBjb21tYW5kcyBhdmFpbGFibGUuCisJCSAgICAgKi8KKworCQkgICAgaWYgKCFjbWQtPm5leHRfbGluaykgeworCQkJIHByaW50ayhLRVJOX05PVElDRSAic2NzaSVkOiB0YXJnZXQgJWQgbHVuICVkICIKKwkJCQkibGlua2VkIGNvbW1hbmQgY29tcGxldGUsIG5vIG5leHRfbGlua1xuIiwKKwkJCQlIT1NUTk8sIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisJCQkgICAgc2luayA9IDE7CisJCQkgICAgZG9fYWJvcnQgKGluc3RhbmNlKTsKKwkJCSAgICByZXR1cm47CisJCSAgICB9CisKKwkJICAgIGluaXRpYWxpemVfU0NwKGNtZC0+bmV4dF9saW5rKTsKKwkJICAgIC8qIFRoZSBuZXh0IGNvbW1hbmQgaXMgc3RpbGwgcGFydCBvZiB0aGlzIHByb2Nlc3M7IGNvcHkgaXQKKwkJICAgICAqIGFuZCBkb24ndCBmcmVlIGl0ISAqLworCQkgICAgY21kLT5uZXh0X2xpbmstPnRhZyA9IGNtZC0+dGFnOworCQkgICAgY21kLT5yZXN1bHQgPSBjbWQtPlNDcC5TdGF0dXMgfCAoY21kLT5TQ3AuTWVzc2FnZSA8PCA4KTsgCisJCSAgICBMTktfUFJJTlRLKCJzY3NpJWQ6IHRhcmdldCAlZCBsdW4gJWQgbGlua2VkIHJlcXVlc3QgIgorCQkJICAgICAgICJkb25lLCBjYWxsaW5nIHNjc2lfZG9uZSgpLlxuIiwKKwkJCSAgICAgICBIT1NUTk8sIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisjaWZkZWYgTkNSNTM4MF9TVEFUUworCQkgICAgY29sbGVjdF9zdGF0cyhob3N0ZGF0YSwgY21kKTsKKyNlbmRpZgorCQkgICAgY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJICAgIGNtZCA9IGhvc3RkYXRhLT5jb25uZWN0ZWQ7CisJCSAgICBicmVhazsKKyNlbmRpZiAvKiBkZWYgTElOS0VEICovCisJCWNhc2UgQUJPUlQ6CisJCWNhc2UgQ09NTUFORF9DT01QTEVURTogCisJCSAgICAvKiBBY2NlcHQgbWVzc2FnZSBieSBjbGVhcmluZyBBQ0sgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCSAgICAvKiArK2d1ZW50aGVyOiBwb3NzaWJsZSByYWNlIHdpdGggRmFsY29uIGxvY2tpbmcgKi8KKwkJICAgIGZhbGNvbl9kb250X3JlbGVhc2UrKzsKKwkJICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQkgICAgUVVfUFJJTlRLKCJzY3NpJWQ6IGNvbW1hbmQgZm9yIHRhcmdldCAlZCwgbHVuICVkICIKKwkJCSAgICAgICJjb21wbGV0ZWRcbiIsIEhPU1ROTywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKwkJICAgIGNtZF9mcmVlX3RhZyggY21kICk7CisJCSAgICBpZiAoc3RhdHVzX2J5dGUoY21kLT5TQ3AuU3RhdHVzKSA9PSBRVUVVRV9GVUxMKSB7CisJCQkvKiBUdXJuIGEgUVVFVUUgRlVMTCBzdGF0dXMgaW50byBCVVNZLCBJIHRoaW5rIHRoZQorCQkJICogbWlkIGxldmVsIGNhbm5vdCBoYW5kbGUgUVVFVUUgRlVMTCA6LSggKFRoZQorCQkJICogY29tbWFuZCBpcyByZXRyaWVkIGFmdGVyIEJVU1kpLiBBbHNvIHVwZGF0ZSBvdXIKKwkJCSAqIHF1ZXVlIHNpemUgdG8gdGhlIG51bWJlciBvZiBjdXJyZW50bHkgaXNzdWVkCisJCQkgKiBjb21tYW5kcyBub3cuCisJCQkgKi8KKwkJCS8qICsrQW5kcmVhczogdGhlIG1pZCBsZXZlbCBjb2RlIGtub3dzIGFib3V0CisJCQkgICBRVUVVRV9GVUxMIG5vdy4gKi8KKwkJCVRBR19BTExPQyAqdGEgPSAmVGFnQWxsb2NbY21kLT5kZXZpY2UtPmlkXVtjbWQtPmRldmljZS0+bHVuXTsKKwkJCVRBR19QUklOVEsoInNjc2klZDogdGFyZ2V0ICVkIGx1biAlZCByZXR1cm5lZCAiCisJCQkJICAgIlFVRVVFX0ZVTEwgYWZ0ZXIgJWQgY29tbWFuZHNcbiIsCisJCQkJICAgSE9TVE5PLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sCisJCQkJICAgdGEtPm5yX2FsbG9jYXRlZCk7CisJCQlpZiAodGEtPnF1ZXVlX3NpemUgPiB0YS0+bnJfYWxsb2NhdGVkKQorCQkJICAgIHRhLT5ucl9hbGxvY2F0ZWQgPSB0YS0+cXVldWVfc2l6ZTsKKwkJICAgIH0KKyNlbHNlCisJCSAgICBob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKyNlbmRpZgorCQkgICAgLyogRW5hYmxlIHJlc2VsZWN0IGludGVycnVwdHMgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKworCQkgICAgLyogCisJCSAgICAgKiBJJ20gbm90IHN1cmUgd2hhdCB0aGUgY29ycmVjdCB0aGluZyB0byBkbyBoZXJlIGlzIDogCisJCSAgICAgKiAKKwkJICAgICAqIElmIHRoZSBjb21tYW5kIHRoYXQganVzdCBleGVjdXRlZCBpcyBOT1QgYSByZXF1ZXN0IAorCQkgICAgICogc2Vuc2UsIHRoZSBvYnZpb3VzIHRoaW5nIHRvIGRvIGlzIHRvIHNldCB0aGUgcmVzdWx0CisJCSAgICAgKiBjb2RlIHRvIHRoZSB2YWx1ZXMgb2YgdGhlIHN0b3JlZCBwYXJhbWV0ZXJzLgorCQkgICAgICogCisJCSAgICAgKiBJZiBpdCB3YXMgYSBSRVFVRVNUIFNFTlNFIGNvbW1hbmQsIHdlIG5lZWQgc29tZSB3YXkgdG8KKwkJICAgICAqIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgZmFpbHVyZSBjb2RlIG9mIHRoZSBvcmlnaW5hbAorCQkgICAgICogYW5kIHRoZSBmYWlsdXJlIGNvZGUgb2YgdGhlIFJFUVVFU1Qgc2Vuc2UgLSB0aGUgb2J2aW91cworCQkgICAgICogY2FzZSBpcyBzdWNjZXNzLCB3aGVyZSB3ZSBmYWxsIHRocm91Z2ggYW5kIGxlYXZlIHRoZQorCQkgICAgICogcmVzdWx0IGNvZGUgdW5jaGFuZ2VkLgorCQkgICAgICogCisJCSAgICAgKiBUaGUgbm9uLW9idmlvdXMgcGxhY2UgaXMgd2hlcmUgdGhlIFJFUVVFU1QgU0VOU0UgZmFpbGVkCisJCSAgICAgKi8KKworCQkgICAgaWYgKGNtZC0+Y21uZFswXSAhPSBSRVFVRVNUX1NFTlNFKSAKKwkJCWNtZC0+cmVzdWx0ID0gY21kLT5TQ3AuU3RhdHVzIHwgKGNtZC0+U0NwLk1lc3NhZ2UgPDwgOCk7IAorCQkgICAgZWxzZSBpZiAoc3RhdHVzX2J5dGUoY21kLT5TQ3AuU3RhdHVzKSAhPSBHT09EKQorCQkJY21kLT5yZXN1bHQgPSAoY21kLT5yZXN1bHQgJiAweDAwZmZmZikgfCAoRElEX0VSUk9SIDw8IDE2KTsKKwkJICAgIAorI2lmZGVmIEFVVE9TRU5TRQorCQkgICAgaWYgKChjbWQtPmNtbmRbMF0gIT0gUkVRVUVTVF9TRU5TRSkgJiYgCisJCQkoc3RhdHVzX2J5dGUoY21kLT5TQ3AuU3RhdHVzKSA9PSBDSEVDS19DT05ESVRJT04pKSB7CisJCQlBU0VOX1BSSU5USygic2NzaSVkOiBwZXJmb3JtaW5nIHJlcXVlc3Qgc2Vuc2VcbiIsCisJCQkJICAgIEhPU1ROTyk7CisJCQljbWQtPmNtbmRbMF0gPSBSRVFVRVNUX1NFTlNFOworCQkJY21kLT5jbW5kWzFdICY9IDB4ZTA7CisJCQljbWQtPmNtbmRbMl0gPSAwOworCQkJY21kLT5jbW5kWzNdID0gMDsKKwkJCWNtZC0+Y21uZFs0XSA9IHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcik7CisJCQljbWQtPmNtbmRbNV0gPSAwOworCQkJY21kLT5jbWRfbGVuID0gQ09NTUFORF9TSVpFKGNtZC0+Y21uZFswXSk7CisKKwkJCWNtZC0+dXNlX3NnID0gMDsKKwkJCS8qIHRoaXMgaXMgaW5pdGlhbGl6ZWQgZnJvbSBpbml0aWFsaXplX1NDcCAKKwkJCWNtZC0+U0NwLmJ1ZmZlciA9IE5VTEw7CisJCQljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gMDsKKwkJCSovCisJCQljbWQtPnJlcXVlc3RfYnVmZmVyID0gKGNoYXIgKikgY21kLT5zZW5zZV9idWZmZXI7CisJCQljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcik7CisKKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCUxJU1QoY21kLGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSk7CisJCQlORVhUKGNtZCkgPSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7CisJCSAgICAgICAgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlID0gKFNjc2lfQ21uZCAqKSBjbWQ7CisJCSAgICAgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJUVVfUFJJTlRLKCJzY3NpJWQ6IFJFUVVFU1QgU0VOU0UgYWRkZWQgdG8gaGVhZCBvZiAiCisJCQkJICAiaXNzdWUgcXVldWVcbiIsIEhfTk8oY21kKSk7CisJCSAgIH0gZWxzZQorI2VuZGlmIC8qIGRlZiBBVVRPU0VOU0UgKi8KKwkJICAgeworI2lmZGVmIE5DUjUzODBfU1RBVFMKKwkJICAgICAgIGNvbGxlY3Rfc3RhdHMoaG9zdGRhdGEsIGNtZCk7CisjZW5kaWYKKwkJICAgICAgIGNtZC0+c2NzaV9kb25lKGNtZCk7CisJCSAgICB9CisKKwkJICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkJICAgIC8qIAorCQkgICAgICogUmVzdG9yZSBwaGFzZSBiaXRzIHRvIDAgc28gYW4gaW50ZXJydXB0ZWQgc2VsZWN0aW9uLCAKKwkJICAgICAqIGFyYml0cmF0aW9uIGNhbiByZXN1bWUuCisJCSAgICAgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCAwKTsKKwkJICAgIAorCQkgICAgd2hpbGUgKChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9CU1kpICYmICFob3N0ZGF0YS0+Y29ubmVjdGVkKQorCQkJYmFycmllcigpOworCisJCSAgICBmYWxjb25fZG9udF9yZWxlYXNlLS07CisJCSAgICAvKiArK3JvbWFuOiBGb3IgRmFsY29uIFNDU0ksIHJlbGVhc2UgdGhlIGxvY2sgb24gdGhlCisJCSAgICAgKiBTVC1ETUEgaGVyZSBpZiBubyBvdGhlciBjb21tYW5kcyBhcmUgd2FpdGluZyBvbiB0aGUKKwkJICAgICAqIGRpc2Nvbm5lY3RlZCBxdWV1ZS4KKwkJICAgICAqLworCQkgICAgZmFsY29uX3JlbGVhc2VfbG9ja19pZl9wb3NzaWJsZSggaG9zdGRhdGEgKTsKKwkJICAgIHJldHVybjsKKwkJY2FzZSBNRVNTQUdFX1JFSkVDVDoKKwkJICAgIC8qIEFjY2VwdCBtZXNzYWdlIGJ5IGNsZWFyaW5nIEFDSyAqLworCQkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJICAgIC8qIEVuYWJsZSByZXNlbGVjdCBpbnRlcnJ1cHRzICovCisJCSAgICBOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJCSAgICBzd2l0Y2ggKGhvc3RkYXRhLT5sYXN0X21lc3NhZ2UpIHsKKwkJICAgIGNhc2UgSEVBRF9PRl9RVUVVRV9UQUc6CisJCSAgICBjYXNlIE9SREVSRURfUVVFVUVfVEFHOgorCQkgICAgY2FzZSBTSU1QTEVfUVVFVUVfVEFHOgorCQkJLyogVGhlIHRhcmdldCBvYnZpb3VzbHkgZG9lc24ndCBzdXBwb3J0IHRhZ2dlZAorCQkJICogcXVldWluZywgZXZlbiB0aG91Z2ggaXQgYW5ub3VuY2VkIHRoaXMgYWJpbGl0eSBpbgorCQkJICogaXRzIElOUVVJUlkgZGF0YSA/IT8gKG1heWJlIG9ubHkgdGhpcyBMVU4/KSBPaywKKwkJCSAqIGNsZWFyICd0YWdnZWRfc3VwcG9ydGVkJyBhbmQgbG9jayB0aGUgTFVOLCBzaW5jZQorCQkJICogdGhlIGNvbW1hbmQgaXMgdHJlYXRlZCBhcyB1bnRhZ2dlZCBmdXJ0aGVyIG9uLgorCQkJICovCisJCQljbWQtPmRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCA9IDA7CisJCQlob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdIHw9ICgxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCQkJY21kLT50YWcgPSBUQUdfTk9ORTsKKwkJCVRBR19QUklOVEsoInNjc2klZDogdGFyZ2V0ICVkIGx1biAlZCByZWplY3RlZCAiCisJCQkJICAgIlFVRVVFX1RBRyBtZXNzYWdlOyB0YWdnZWQgcXVldWluZyAiCisJCQkJICAgImRpc2FibGVkXG4iLAorCQkJCSAgIEhPU1ROTywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKwkJCWJyZWFrOworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCWNhc2UgRElTQ09OTkVDVDoKKwkJICAgIC8qIEFjY2VwdCBtZXNzYWdlIGJ5IGNsZWFyaW5nIEFDSyAqLworCQkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJICAgIGNtZC0+ZGV2aWNlLT5kaXNjb25uZWN0ID0gMTsKKwkJICAgIExJU1QoY21kLGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUpOworCQkgICAgTkVYVChjbWQpID0gaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZTsKKwkJICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQkgICAgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSA9IGNtZDsKKwkJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJICAgIFFVX1BSSU5USygic2NzaSVkOiBjb21tYW5kIGZvciB0YXJnZXQgJWQgbHVuICVkIHdhcyAiCisJCQkgICAgICAibW92ZWQgZnJvbSBjb25uZWN0ZWQgdG8gdGhlICIKKwkJCSAgICAgICJkaXNjb25uZWN0ZWRfcXVldWVcbiIsIEhPU1ROTywgCisJCQkgICAgICBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCQkgICAgLyogCisJCSAgICAgKiBSZXN0b3JlIHBoYXNlIGJpdHMgdG8gMCBzbyBhbiBpbnRlcnJ1cHRlZCBzZWxlY3Rpb24sIAorCQkgICAgICogYXJiaXRyYXRpb24gY2FuIHJlc3VtZS4KKwkJICAgICAqLworCQkgICAgTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIDApOworCisJCSAgICAvKiBFbmFibGUgcmVzZWxlY3QgaW50ZXJydXB0cyAqLworCQkgICAgTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCQkgICAgLyogV2FpdCBmb3IgYnVzIGZyZWUgdG8gYXZvaWQgbmFzdHkgdGltZW91dHMgKi8KKwkJICAgIHdoaWxlICgoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfQlNZKSAmJiAhaG9zdGRhdGEtPmNvbm5lY3RlZCkKKwkJICAgIAliYXJyaWVyKCk7CisJCSAgICByZXR1cm47CisJCS8qIAorCQkgKiBUaGUgU0NTSSBkYXRhIHBvaW50ZXIgaXMgKklNUExJQ0lUTFkqIHNhdmVkIG9uIGEgZGlzY29ubmVjdAorCQkgKiBvcGVyYXRpb24sIGluIHZpb2xhdGlvbiBvZiB0aGUgU0NTSSBzcGVjIHNvIHdlIGNhbiBzYWZlbHkgCisJCSAqIGlnbm9yZSBTQVZFL1JFU1RPUkUgcG9pbnRlcnMgY2FsbHMuCisJCSAqCisJCSAqIFVuZm9ydHVuYXRlbHksIHNvbWUgZGlza3MgdmlvbGF0ZSB0aGUgU0NTSSBzcGVjIGFuZCAKKwkJICogZG9uJ3QgaXNzdWUgdGhlIHJlcXVpcmVkIFNBVkVfUE9JTlRFUlMgbWVzc2FnZSBiZWZvcmUKKwkJICogZGlzY29ubmVjdGluZywgYW5kIHdlIGhhdmUgdG8gYnJlYWsgc3BlYyB0byByZW1haW4gCisJCSAqIGNvbXBhdGlibGUuCisJCSAqLworCQljYXNlIFNBVkVfUE9JTlRFUlM6CisJCWNhc2UgUkVTVE9SRV9QT0lOVEVSUzoKKwkJICAgIC8qIEFjY2VwdCBtZXNzYWdlIGJ5IGNsZWFyaW5nIEFDSyAqLworCQkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJICAgIC8qIEVuYWJsZSByZXNlbGVjdCBpbnRlcnJ1cHRzICovCisJCSAgICBOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJCSAgICBicmVhazsKKwkJY2FzZSBFWFRFTkRFRF9NRVNTQUdFOgorLyogCisgKiBFeHRlbmRlZCBtZXNzYWdlcyBhcmUgc2VudCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdCA6CisgKiBCeXRlIAkKKyAqIDAJCUVYVEVOREVEX01FU1NBR0UgPT0gMQorICogMQkJbGVuZ3RoIChpbmNsdWRlcyBvbmUgYnl0ZSBmb3IgY29kZSwgZG9lc24ndCAKKyAqCQlpbmNsdWRlIGZpcnN0IHR3byBieXRlcykKKyAqIDIgCQljb2RlCisgKiAzLi5sZW5ndGgrMQlhcmd1bWVudHMKKyAqCisgKiBTdGFydCB0aGUgZXh0ZW5kZWQgbWVzc2FnZSBidWZmZXIgd2l0aCB0aGUgRVhURU5ERURfTUVTU0FHRQorICogYnl0ZSwgc2luY2UgcHJpbnRfbXNnKCkgd2FudHMgdGhlIHdob2xlIHRoaW5nLiAgCisgKi8KKwkJICAgIGV4dGVuZGVkX21zZ1swXSA9IEVYVEVOREVEX01FU1NBR0U7CisJCSAgICAvKiBBY2NlcHQgZmlyc3QgYnl0ZSBieSBjbGVhcmluZyBBQ0sgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisKKwkJICAgIEVYVF9QUklOVEsoInNjc2klZDogcmVjZWl2aW5nIGV4dGVuZGVkIG1lc3NhZ2VcbiIsIEhPU1ROTyk7CisKKwkJICAgIGxlbiA9IDI7CisJCSAgICBkYXRhID0gZXh0ZW5kZWRfbXNnICsgMTsKKwkJICAgIHBoYXNlID0gUEhBU0VfTVNHSU47CisJCSAgICBOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgJnBoYXNlLCAmbGVuLCAmZGF0YSk7CisJCSAgICBFWFRfUFJJTlRLKCJzY3NpJWQ6IGxlbmd0aD0lZCwgY29kZT0weCUwMnhcbiIsIEhPU1ROTywKKwkJCSAgICAgICAoaW50KWV4dGVuZGVkX21zZ1sxXSwgKGludClleHRlbmRlZF9tc2dbMl0pOworCisJCSAgICBpZiAoIWxlbiAmJiBleHRlbmRlZF9tc2dbMV0gPD0gCisJCQkoc2l6ZW9mIChleHRlbmRlZF9tc2cpIC0gMSkpIHsKKwkJCS8qIEFjY2VwdCB0aGlyZCBieXRlIGJ5IGNsZWFyaW5nIEFDSyAqLworCQkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJCWxlbiA9IGV4dGVuZGVkX21zZ1sxXSAtIDE7CisJCQlkYXRhID0gZXh0ZW5kZWRfbXNnICsgMzsKKwkJCXBoYXNlID0gUEhBU0VfTVNHSU47CisKKwkJCU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKTsKKwkJCUVYVF9QUklOVEsoInNjc2klZDogbWVzc2FnZSByZWNlaXZlZCwgcmVzaWR1YWwgJWRcbiIsCisJCQkJICAgSE9TVE5PLCBsZW4pOworCisJCQlzd2l0Y2ggKGV4dGVuZGVkX21zZ1syXSkgeworCQkJY2FzZSBFWFRFTkRFRF9TRFRSOgorCQkJY2FzZSBFWFRFTkRFRF9XRFRSOgorCQkJY2FzZSBFWFRFTkRFRF9NT0RJRllfREFUQV9QT0lOVEVSOgorCQkJY2FzZSBFWFRFTkRFRF9FWFRFTkRFRF9JREVOVElGWToKKwkJCSAgICB0bXAgPSAwOworCQkJfQorCQkgICAgfSBlbHNlIGlmIChsZW4pIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAic2NzaSVkOiBlcnJvciByZWNlaXZpbmcgIgorCQkJICAgICAgICJleHRlbmRlZCBtZXNzYWdlXG4iLCBIT1NUTk8pOworCQkJdG1wID0gMDsKKwkJICAgIH0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgInNjc2klZDogZXh0ZW5kZWQgbWVzc2FnZSAiCisJCQkgICAgICAgImNvZGUgJTAyeCBsZW5ndGggJWQgaXMgdG9vIGxvbmdcbiIsCisJCQkgICAgICAgSE9TVE5PLCBleHRlbmRlZF9tc2dbMl0sIGV4dGVuZGVkX21zZ1sxXSk7CisJCQl0bXAgPSAwOworCQkgICAgfQorCQkvKiBGYWxsIHRocm91Z2ggdG8gcmVqZWN0IG1lc3NhZ2UgKi8KKworCQkvKiAKKyAgCQkgKiBJZiB3ZSBnZXQgc29tZXRoaW5nIHdlaXJkIHRoYXQgd2UgYXJlbid0IGV4cGVjdGluZywgCisgCQkgKiByZWplY3QgaXQuCisJCSAqLworCQlkZWZhdWx0OgorCQkgICAgaWYgKCF0bXApIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJzY3NpJWQ6IHJlamVjdGluZyBtZXNzYWdlICIsIEhPU1ROTyk7CisJCQlwcmludF9tc2cgKGV4dGVuZGVkX21zZyk7CisJCQlwcmludGsoIlxuIik7CisJCSAgICB9IGVsc2UgaWYgKHRtcCAhPSBFWFRFTkRFRF9NRVNTQUdFKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgInNjc2klZDogcmVqZWN0aW5nIHVua25vd24gIgorCQkJICAgICAgICJtZXNzYWdlICUwMnggZnJvbSB0YXJnZXQgJWQsIGx1biAlZFxuIiwKKwkJCSAgICAgICBIT1NUTk8sIHRtcCwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKwkJICAgIGVsc2UKKwkJCXByaW50ayhLRVJOX0RFQlVHICJzY3NpJWQ6IHJlamVjdGluZyB1bmtub3duICIKKwkJCSAgICAgICAiZXh0ZW5kZWQgbWVzc2FnZSAiCisJCQkgICAgICAgImNvZGUgJTAyeCwgbGVuZ3RoICVkIGZyb20gdGFyZ2V0ICVkLCBsdW4gJWRcbiIsCisJCQkgICAgICAgSE9TVE5PLCBleHRlbmRlZF9tc2dbMV0sIGV4dGVuZGVkX21zZ1swXSwKKwkJCSAgICAgICBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworICAgCisKKwkJICAgIG1zZ291dCA9IE1FU1NBR0VfUkVKRUNUOworCQkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgCisJCQlJQ1JfQVNTRVJUX0FUTik7CisJCSAgICBicmVhazsKKwkJfSAvKiBzd2l0Y2ggKHRtcCkgKi8KKwkJYnJlYWs7CisJICAgIGNhc2UgUEhBU0VfTVNHT1VUOgorCQlsZW4gPSAxOworCQlkYXRhID0gJm1zZ291dDsKKwkJaG9zdGRhdGEtPmxhc3RfbWVzc2FnZSA9IG1zZ291dDsKKwkJTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgJmxlbiwgJmRhdGEpOworCQlpZiAobXNnb3V0ID09IEFCT1JUKSB7CisjaWZkZWYgU1VQUE9SVF9UQUdTCisJCSAgICBjbWRfZnJlZV90YWcoIGNtZCApOworI2Vsc2UKKwkJICAgIGhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworI2VuZGlmCisJCSAgICBob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKwkJICAgIGNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworI2lmZGVmIE5DUjUzODBfU1RBVFMKKwkJICAgIGNvbGxlY3Rfc3RhdHMoaG9zdGRhdGEsIGNtZCk7CisjZW5kaWYKKwkJICAgIGNtZC0+c2NzaV9kb25lKGNtZCk7CisJCSAgICBOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJCSAgICBmYWxjb25fcmVsZWFzZV9sb2NrX2lmX3Bvc3NpYmxlKCBob3N0ZGF0YSApOworCQkgICAgcmV0dXJuOworCQl9CisJCW1zZ291dCA9IE5PUDsKKwkJYnJlYWs7CisJICAgIGNhc2UgUEhBU0VfQ01ET1VUOgorCQlsZW4gPSBjbWQtPmNtZF9sZW47CisJCWRhdGEgPSBjbWQtPmNtbmQ7CisJCS8qIAorCQkgKiBYWFggZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIG9uIG1hY2hpbmVzIHdpdGggYSAKKwkJICogUFNFVURPLURNQSBhcmNoaXRlY3R1cmUgd2Ugc2hvdWxkIHByb2JhYmx5IAorCQkgKiB1c2UgdGhlIGRtYSB0cmFuc2ZlciBmdW5jdGlvbi4gIAorCQkgKi8KKwkJTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgJmxlbiwgCisJCSAgICAmZGF0YSk7CisJCWJyZWFrOworCSAgICBjYXNlIFBIQVNFX1NUQVRJTjoKKwkJbGVuID0gMTsKKwkJZGF0YSA9ICZ0bXA7CisJCU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKTsKKwkJY21kLT5TQ3AuU3RhdHVzID0gdG1wOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJcHJpbnRrKCJzY3NpJWQ6IHVua25vd24gcGhhc2VcbiIsIEhPU1ROTyk7CisJCU5DUl9QUklOVChOREVCVUdfQU5ZKTsKKwkgICAgfSAvKiBzd2l0Y2gocGhhc2UpICovCisJfSAvKiBpZiAodG1wICogU1JfUkVRKSAqLyAKKyAgICB9IC8qIHdoaWxlICgxKSAqLworfQorCisvKgorICogRnVuY3Rpb24gOiB2b2lkIE5DUjUzODBfcmVzZWxlY3QgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQorICoKKyAqIFB1cnBvc2UgOiBkb2VzIHJlc2VsZWN0aW9uLCBpbml0aWFsaXppbmcgdGhlIGluc3RhbmNlLT5jb25uZWN0ZWQgCisgKglmaWVsZCB0byBwb2ludCB0byB0aGUgU2NzaV9DbW5kIGZvciB3aGljaCB0aGUgSV9UX0wgb3IgSV9UX0xfUSAKKyAqCW5leHVzIGhhcyBiZWVuIHJlZXN0YWJsaXNoZWQsCisgKgkKKyAqIElucHV0cyA6IGluc3RhbmNlIC0gdGhpcyBpbnN0YW5jZSBvZiB0aGUgTkNSNTM4MC4KKyAqCisgKi8KKworCitzdGF0aWMgdm9pZCBOQ1I1MzgwX3Jlc2VsZWN0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKyAgICBTRVRVUF9IT1NUREFUQShpbnN0YW5jZSk7CisgICAgdW5zaWduZWQgY2hhciB0YXJnZXRfbWFzazsKKyAgICB1bnNpZ25lZCBjaGFyIGx1biwgcGhhc2U7CisgICAgaW50IGxlbjsKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKyAgICB1bnNpZ25lZCBjaGFyIHRhZzsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNoYXIgbXNnWzNdOworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgU2NzaV9DbW5kICp0bXAgPSBOVUxMLCAqcHJldjsKKy8qICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7ICovCisKKyAgICAvKgorICAgICAqIERpc2FibGUgYXJiaXRyYXRpb24sIGV0Yy4gc2luY2UgdGhlIGhvc3QgYWRhcHRlciBvYnZpb3VzbHkKKyAgICAgKiBsb3N0LCBhbmQgdGVsbCBhbiBpbnRlcnJ1cHRlZCBOQ1I1MzgwX3NlbGVjdCgpIHRvIHJlc3RhcnQuCisgICAgICovCisKKyAgICBOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKyAgICBob3N0ZGF0YS0+cmVzdGFydF9zZWxlY3QgPSAxOworCisgICAgdGFyZ2V0X21hc2sgPSBOQ1I1MzgwX3JlYWQoQ1VSUkVOVF9TQ1NJX0RBVEFfUkVHKSAmIH4oaG9zdGRhdGEtPmlkX21hc2spOworCisgICAgUlNMX1BSSU5USygic2NzaSVkOiByZXNlbGVjdFxuIiwgSE9TVE5PKTsKKworICAgIC8qIAorICAgICAqIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgZGV0ZWN0ZWQgdGhhdCBvdXIgU0NTSSBJRCBpcyBvbiB0aGUgYnVzLAorICAgICAqIFNFTCBpcyB0cnVlIGFuZCBCU1kgd2FzIGZhbHNlIGZvciBhdCBsZWFzdCBvbmUgYnVzIHNldHRsZSBkZWxheQorICAgICAqICg0MDAgbnMpLgorICAgICAqCisgICAgICogV2UgbXVzdCBhc3NlcnQgQlNZIG91cnNlbHZlcywgdW50aWwgdGhlIHRhcmdldCBkcm9wcyB0aGUgU0VMCisgICAgICogc2lnbmFsLgorICAgICAqLworCisgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9CU1kpOworICAgIAorICAgIHdoaWxlIChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9TRUwpOworICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisKKyAgICAvKgorICAgICAqIFdhaXQgZm9yIHRhcmdldCB0byBnbyBpbnRvIE1TR0lOLgorICAgICAqLworCisgICAgd2hpbGUgKCEoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfUkVRKSk7CisKKyAgICBsZW4gPSAxOworICAgIGRhdGEgPSBtc2c7CisgICAgcGhhc2UgPSBQSEFTRV9NU0dJTjsKKyAgICBOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgJnBoYXNlLCAmbGVuLCAmZGF0YSk7CisKKyAgICBpZiAoIShtc2dbMF0gJiAweDgwKSkgeworCXByaW50ayhLRVJOX0RFQlVHICJzY3NpJWQ6IGV4cGVjdGluZyBJREVOVElGWSBtZXNzYWdlLCBnb3QgIiwgSE9TVE5PKTsKKwlwcmludF9tc2cobXNnKTsKKwlkb19hYm9ydChpbnN0YW5jZSk7CisJcmV0dXJuOworICAgIH0KKyAgICBsdW4gPSAobXNnWzBdICYgMHgwNyk7CisKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKyAgICAvKiBJZiB0aGUgcGhhc2UgaXMgc3RpbGwgTVNHSU4sIHRoZSB0YXJnZXQgd2FudHMgdG8gc2VuZCBzb21lIG1vcmUKKyAgICAgKiBtZXNzYWdlcy4gSW4gY2FzZSBpdCBzdXBwb3J0cyB0YWdnZWQgcXVldWluZywgdGhpcyBpcyBwcm9iYWJseSBhCisgICAgICogU0lNUExFX1FVRVVFX1RBRyBmb3IgdGhlIElfVF9MX1EgbmV4dXMuCisgICAgICovCisgICAgdGFnID0gVEFHX05PTkU7CisgICAgaWYgKHBoYXNlID09IFBIQVNFX01TR0lOICYmIHNldHVwX3VzZV90YWdnZWRfcXVldWluZykgeworCS8qIEFjY2VwdCBwcmV2aW91cyBJREVOVElGWSBtZXNzYWdlIGJ5IGNsZWFyaW5nIEFDSyAqLworCU5DUjUzODBfd3JpdGUoIElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgKTsKKwlsZW4gPSAyOworCWRhdGEgPSBtc2crMTsKKwlpZiAoIU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKSAmJgorCSAgICBtc2dbMV0gPT0gU0lNUExFX1FVRVVFX1RBRykKKwkgICAgdGFnID0gbXNnWzJdOworCVRBR19QUklOVEsoInNjc2klZDogdGFyZ2V0IG1hc2sgJTAyeCwgbHVuICVkIHNlbnQgdGFnICVkIGF0ICIKKwkJICAgInJlc2VsZWN0aW9uXG4iLCBIT1NUTk8sIHRhcmdldF9tYXNrLCBsdW4sIHRhZyk7CisgICAgfQorI2VuZGlmCisgICAgCisgICAgLyogCisgICAgICogRmluZCB0aGUgY29tbWFuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBJX1RfTCBvciBJX1RfTF9RICBuZXh1cyB3ZSAKKyAgICAgKiBqdXN0IHJlZXN0YWJsaXNoZWQsIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLgorICAgICAqLworCisgICAgZm9yICh0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUsIHByZXYgPSBOVUxMOyAKKwkgdG1wOyBwcmV2ID0gdG1wLCB0bXAgPSBORVhUKHRtcCkgKSB7CisJaWYgKCh0YXJnZXRfbWFzayA9PSAoMSA8PCB0bXAtPmRldmljZS0+aWQpKSAmJiAobHVuID09IHRtcC0+ZGV2aWNlLT5sdW4pCisjaWZkZWYgU1VQUE9SVF9UQUdTCisJICAgICYmICh0YWcgPT0gdG1wLT50YWcpIAorI2VuZGlmCisJICAgICkgeworCSAgICAvKiArK2d1ZW50aGVyOiBwcmV2ZW50IHJhY2Ugd2l0aCBmYWxjb25fcmVsZWFzZV9sb2NrICovCisJICAgIGZhbGNvbl9kb250X3JlbGVhc2UrKzsKKwkgICAgaWYgKHByZXYpIHsKKwkJUkVNT1ZFKHByZXYsIE5FWFQocHJldiksIHRtcCwgTkVYVCh0bXApKTsKKwkJTkVYVChwcmV2KSA9IE5FWFQodG1wKTsKKwkgICAgfSBlbHNlIHsKKwkJUkVNT1ZFKC0xLCBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlLCB0bXAsIE5FWFQodG1wKSk7CisJCWhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUgPSBORVhUKHRtcCk7CisJICAgIH0KKwkgICAgTkVYVCh0bXApID0gTlVMTDsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICAKKyAgICBpZiAoIXRtcCkgeworCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZDogd2FybmluZzogdGFyZ2V0IGJpdG1hc2sgJTAyeCBsdW4gJWQgIgorI2lmZGVmIFNVUFBPUlRfVEFHUworCQkidGFnICVkICIKKyNlbmRpZgorCQkibm90IGluIGRpc2Nvbm5lY3RlZF9xdWV1ZS5cbiIsCisJCUhPU1ROTywgdGFyZ2V0X21hc2ssIGx1bgorI2lmZGVmIFNVUFBPUlRfVEFHUworCQksIHRhZworI2VuZGlmCisJCSk7CisJLyogCisJICogU2luY2Ugd2UgaGF2ZSBhbiBlc3RhYmxpc2hlZCBuZXh1cyB0aGF0IHdlIGNhbid0IGRvIGFueXRoaW5nCisJICogd2l0aCwgd2UgbXVzdCBhYm9ydCBpdC4gIAorCSAqLworCWRvX2Fib3J0KGluc3RhbmNlKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogQWNjZXB0IG1lc3NhZ2UgYnkgY2xlYXJpbmcgQUNLICovCisgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKworICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSB0bXA7CisgICAgUlNMX1BSSU5USygic2NzaSVkOiBuZXh1cyBlc3RhYmxpc2hlZCwgdGFyZ2V0ID0gJWQsIGx1biA9ICVkLCB0YWcgPSAlZFxuIiwKKwkgICAgICAgSE9TVE5PLCB0bXAtPmRldmljZS0+aWQsIHRtcC0+ZGV2aWNlLT5sdW4sIHRtcC0+dGFnKTsKKyAgICBmYWxjb25fZG9udF9yZWxlYXNlLS07Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfYWJvcnQgKFNjc2lfQ21uZCAqY21kKQorICoKKyAqIFB1cnBvc2UgOiBhYm9ydCBhIGNvbW1hbmQKKyAqCisgKiBJbnB1dHMgOiBjbWQgLSB0aGUgU2NzaV9DbW5kIHRvIGFib3J0LCBjb2RlIC0gY29kZSB0byBzZXQgdGhlIAorICogCWhvc3QgYnl0ZSBvZiB0aGUgcmVzdWx0IGZpZWxkIHRvLCBpZiB6ZXJvIERJRF9BQk9SVEVEIGlzIAorICoJdXNlZC4KKyAqCisgKiBSZXR1cm5zIDogMCAtIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisgKgorICogWFhYIC0gdGhlcmUgaXMgbm8gd2F5IHRvIGFib3J0IHRoZSBjb21tYW5kIHRoYXQgaXMgY3VycmVudGx5IAorICogCSBjb25uZWN0ZWQsIHlvdSBoYXZlIHRvIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlLiAgSWYgdGhpcyBpcyAKKyAqCSBhIHByb2JsZW0sIHdlIGNvdWxkIGltcGxlbWVudCBsb25nam1wKCkgLyBzZXRqbXAoKSwgc2V0am1wKCkKKyAqIAkgY2FsbGVkIHdoZXJlIHRoZSBsb29wIHN0YXJ0ZWQgaW4gTkNSNTM4MF9tYWluKCkuCisgKi8KKworc3RhdGljCitpbnQgTkNSNTM4MF9hYm9ydCAoU2NzaV9DbW5kICpjbWQpCit7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UgPSBjbWQtPmRldmljZS0+aG9zdDsKKyAgICBTRVRVUF9IT1NUREFUQShpbnN0YW5jZSk7CisgICAgU2NzaV9DbW5kICp0bXAsICoqcHJldjsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgcHJpbnRrKEtFUk5fTk9USUNFICJzY3NpJWQ6IGFib3J0aW5nIGNvbW1hbmRcbiIsIEhPU1ROTyk7CisgICAgcHJpbnRfU2NzaV9DbW5kIChjbWQpOworCisgICAgTkNSNTM4MF9wcmludF9zdGF0dXMgKGluc3RhbmNlKTsKKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICAKKyAgICBpZiAoIUlTX0FfVFQoKSAmJiAhZmFsY29uX2dvdF9sb2NrKQorCXByaW50ayhLRVJOX0VSUiAic2NzaSVkOiAhIUJJTkdPISEgRmFsY29uIGhhcyBubyBsb2NrIGluIE5DUjUzODBfYWJvcnRcbiIsCisJICAgICAgIEhPU1ROTyk7CisKKyAgICBBQlJUX1BSSU5USygic2NzaSVkOiBhYm9ydCBjYWxsZWQgYmFzciAweCUwMngsIHNyIDB4JTAyeFxuIiwgSE9TVE5PLAorCQlOQ1I1MzgwX3JlYWQoQlVTX0FORF9TVEFUVVNfUkVHKSwKKwkJTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpKTsKKworI2lmIDEKKy8qIAorICogQ2FzZSAxIDogSWYgdGhlIGNvbW1hbmQgaXMgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgY29tbWFuZCwgCisgKiB3ZSdsbCBzZXQgdGhlIGFib3J0ZWQgZmxhZyBhbmQgcmV0dXJuIGNvbnRyb2wgc28gdGhhdCAKKyAqIGluZm9ybWF0aW9uIHRyYW5zZmVyIHJvdXRpbmUgY2FuIGV4aXQgY2xlYW5seS4KKyAqLworCisgICAgaWYgKGhvc3RkYXRhLT5jb25uZWN0ZWQgPT0gY21kKSB7CisKKwlBQlJUX1BSSU5USygic2NzaSVkOiBhYm9ydGluZyBjb25uZWN0ZWQgY29tbWFuZFxuIiwgSE9TVE5PKTsKKy8qCisgKiBXZSBzaG91bGQgcGVyZm9ybSBCU1kgY2hlY2tpbmcsIGFuZCBtYWtlIHN1cmUgd2UgaGF2ZW4ndCBzbGlwcGVkCisgKiBpbnRvIEJVUyBGUkVFLgorICovCisKKy8qCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQVNTRVJUX0FUTik7ICovCisvKiAKKyAqIFNpbmNlIHdlIGNhbid0IGNoYW5nZSBwaGFzZXMgdW50aWwgd2UndmUgY29tcGxldGVkIHRoZSBjdXJyZW50IAorICogaGFuZHNoYWtlLCB3ZSBoYXZlIHRvIHNvdXJjZSBvciBzaW5rIGEgYnl0ZSBvZiBkYXRhIGlmIHRoZSBjdXJyZW50CisgKiBwaGFzZSBpcyBub3QgTVNHT1VULgorICovCisKKy8qIAorICogUmV0dXJuIGNvbnRyb2wgdG8gdGhlIGV4ZWN1dGluZyBOQ1IgZHJpdmUgc28gd2UgY2FuIGNsZWFyIHRoZQorICogYWJvcnRlZCBmbGFnIGFuZCBnZXQgYmFjayBpbnRvIG91ciBtYWluIGxvb3AuCisgKi8gCisKKwlpZiAoZG9fYWJvcnQoaW5zdGFuY2UpID09IDApIHsKKwkgIGhvc3RkYXRhLT5hYm9ydGVkID0gMTsKKwkgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCSAgY21kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisjaWZkZWYgU1VQUE9SVF9UQUdTCisJICBjbWRfZnJlZV90YWcoIGNtZCApOworI2Vsc2UKKwkgIGhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworI2VuZGlmCisJICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJICBjbWQtPnNjc2lfZG9uZShjbWQpOworCSAgZmFsY29uX3JlbGVhc2VfbG9ja19pZl9wb3NzaWJsZSggaG9zdGRhdGEgKTsKKwkgIHJldHVybiBTQ1NJX0FCT1JUX1NVQ0NFU1M7CisJfSBlbHNlIHsKKy8qCSAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyAqLworCSAgcHJpbnRrKCJzY3NpJWQ6IGFib3J0IG9mIGNvbm5lY3RlZCBjb21tYW5kIGZhaWxlZCFcbiIsIEhPU1ROTyk7CisJICByZXR1cm4gU0NTSV9BQk9SVF9FUlJPUjsKKwl9IAorICAgfQorI2VuZGlmCisKKy8qIAorICogQ2FzZSAyIDogSWYgdGhlIGNvbW1hbmQgaGFzbid0IGJlZW4gaXNzdWVkIHlldCwgd2Ugc2ltcGx5IHJlbW92ZSBpdCAKKyAqIAkgICAgZnJvbSB0aGUgaXNzdWUgcXVldWUuCisgKi8KKyAgICBmb3IgKHByZXYgPSAoU2NzaV9DbW5kICoqKSAmKGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSksIAorCXRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOworCXRtcDsgcHJldiA9IE5FWFRBRERSKHRtcCksIHRtcCA9IE5FWFQodG1wKSApCisJaWYgKGNtZCA9PSB0bXApIHsKKwkgICAgUkVNT1ZFKDUsICpwcmV2LCB0bXAsIE5FWFQodG1wKSk7CisJICAgICgqcHJldikgPSBORVhUKHRtcCk7CisJICAgIE5FWFQodG1wKSA9IE5VTEw7CisJICAgIHRtcC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworCSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJICAgIEFCUlRfUFJJTlRLKCJzY3NpJWQ6IGFib3J0IHJlbW92ZWQgY29tbWFuZCBmcm9tIGlzc3VlIHF1ZXVlLlxuIiwKKwkJCUhPU1ROTyk7CisJICAgIC8qIFRhZ2dlZCBxdWV1aW5nIG5vdGU6IG5vIHRhZyB0byBmcmVlIGhlcmUsIGhhc24ndCBiZWVuIGFzc2lnbmVkCisJICAgICAqIHlldC4uLiAqLworCSAgICB0bXAtPnNjc2lfZG9uZSh0bXApOworCSAgICBmYWxjb25fcmVsZWFzZV9sb2NrX2lmX3Bvc3NpYmxlKCBob3N0ZGF0YSApOworCSAgICByZXR1cm4gU0NTSV9BQk9SVF9TVUNDRVNTOworCX0KKworLyogCisgKiBDYXNlIDMgOiBJZiBhbnkgY29tbWFuZHMgYXJlIGNvbm5lY3RlZCwgd2UncmUgZ29pbmcgdG8gZmFpbCB0aGUgYWJvcnQKKyAqCSAgICBhbmQgbGV0IHRoZSBoaWdoIGxldmVsIFNDU0kgZHJpdmVyIHJldHJ5IGF0IGEgbGF0ZXIgdGltZSBvciAKKyAqCSAgICBpc3N1ZSBhIHJlc2V0LgorICoKKyAqCSAgICBUaW1lb3V0cywgYW5kIHRoZXJlZm9yZSBhYm9ydGVkIGNvbW1hbmRzLCB3aWxsIGJlIGhpZ2hseSB1bmxpa2VseQorICogICAgICAgICAgYW5kIGhhbmRsaW5nIHRoZW0gY2xlYW5seSBpbiB0aGlzIHNpdHVhdGlvbiB3b3VsZCBtYWtlIHRoZSBjb21tb24KKyAqCSAgICBjYXNlIG9mIG5vcmVzZXRzIGxlc3MgZWZmaWNpZW50LCBhbmQgd291bGQgcG9sbHV0ZSBvdXIgY29kZS4gIFNvLAorICoJICAgIHdlIGZhaWwuCisgKi8KKworICAgIGlmIChob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCUFCUlRfUFJJTlRLKCJzY3NpJWQ6IGFib3J0IGZhaWxlZCwgY29tbWFuZCBjb25uZWN0ZWQuXG4iLCBIT1NUTk8pOworICAgICAgICByZXR1cm4gU0NTSV9BQk9SVF9TTk9PWkU7CisgICAgfQorCisvKgorICogQ2FzZSA0OiBJZiB0aGUgY29tbWFuZCBpcyBjdXJyZW50bHkgZGlzY29ubmVjdGVkIGZyb20gdGhlIGJ1cywgYW5kIAorICogCXRoZXJlIGFyZSBubyBjb25uZWN0ZWQgY29tbWFuZHMsIHdlIHJlY29ubmVjdCB0aGUgSV9UX0wgb3IgCisgKglJX1RfTF9RIG5leHVzIGFzc29jaWF0ZWQgd2l0aCBpdCwgZ28gaW50byBtZXNzYWdlIG91dCwgYW5kIHNlbmQgCisgKiAgICAgIGFuIGFib3J0IG1lc3NhZ2UuCisgKgorICogVGhpcyBjYXNlIGlzIGVzcGVjaWFsbHkgdWdseS4gSW4gb3JkZXIgdG8gcmVlc3RhYmxpc2ggdGhlIG5leHVzLCB3ZQorICogbmVlZCB0byBjYWxsIE5DUjUzODBfc2VsZWN0KCkuICBUaGUgZWFzaWVzdCB3YXkgdG8gaW1wbGVtZW50IHRoaXMgCisgKiBmdW5jdGlvbiB3YXMgdG8gYWJvcnQgaWYgdGhlIGJ1cyB3YXMgYnVzeSwgYW5kIGxldCB0aGUgaW50ZXJydXB0CisgKiBoYW5kbGVyIHRyaWdnZXJlZCBvbiB0aGUgU0VMIGZvciByZXNlbGVjdCB0YWtlIGNhcmUgb2YgbG9zdCBhcmJpdHJhdGlvbnMKKyAqIHdoZXJlIG5lY2Vzc2FyeSwgbWVhbmluZyBpbnRlcnJ1cHRzIG5lZWQgdG8gYmUgZW5hYmxlZC4KKyAqCisgKiBXaGVuIGludGVycnVwdHMgYXJlIGVuYWJsZWQsIHRoZSBxdWV1ZXMgbWF5IGNoYW5nZSAtIHNvIHdlIAorICogY2FuJ3QgcmVtb3ZlIGl0IGZyb20gdGhlIGRpc2Nvbm5lY3RlZCBxdWV1ZSBiZWZvcmUgc2VsZWN0aW5nIGl0CisgKiBiZWNhdXNlIHRoYXQgY291bGQgY2F1c2UgYSBmYWlsdXJlIGluIGhhc2hpbmcgdGhlIG5leHVzIGlmIHRoYXQgCisgKiBkZXZpY2UgcmVzZWxlY3RlZC4KKyAqIAorICogU2luY2UgdGhlIHF1ZXVlcyBtYXkgY2hhbmdlLCB3ZSBjYW4ndCB1c2UgdGhlIHBvaW50ZXJzIGZyb20gd2hlbiB3ZQorICogZmlyc3QgbG9jYXRlIGl0LgorICoKKyAqIFNvLCB3ZSBtdXN0IGZpcnN0IGxvY2F0ZSB0aGUgY29tbWFuZCwgYW5kIGlmIE5DUjUzODBfc2VsZWN0KCkKKyAqIHN1Y2NlZWRzLCB0aGVuIGlzc3VlIHRoZSBhYm9ydCwgcmVsb2NhdGUgdGhlIGNvbW1hbmQgYW5kIHJlbW92ZQorICogaXQgZnJvbSB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLgorICovCisKKyAgICBmb3IgKHRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZTsgdG1wOworCSB0bXAgPSBORVhUKHRtcCkpIAorICAgICAgICBpZiAoY21kID09IHRtcCkgeworICAgICAgICAgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCSAgICBBQlJUX1BSSU5USygic2NzaSVkOiBhYm9ydGluZyBkaXNjb25uZWN0ZWQgY29tbWFuZC5cbiIsIEhPU1ROTyk7CisgIAorICAgICAgICAgICAgaWYgKE5DUjUzODBfc2VsZWN0IChpbnN0YW5jZSwgY21kLCAoaW50KSBjbWQtPnRhZykpIAorCQlyZXR1cm4gU0NTSV9BQk9SVF9CVVNZOworCisJICAgIEFCUlRfUFJJTlRLKCJzY3NpJWQ6IG5leHVzIHJlZXN0YWJsaXNoZWQuXG4iLCBIT1NUTk8pOworCisJICAgIGRvX2Fib3J0IChpbnN0YW5jZSk7CisKKwkgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCSAgICBmb3IgKHByZXYgPSAoU2NzaV9DbW5kICoqKSAmKGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUpLCAKKwkJdG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOworCQl0bXA7IHByZXYgPSBORVhUQUREUih0bXApLCB0bXAgPSBORVhUKHRtcCkgKQorCQkgICAgaWYgKGNtZCA9PSB0bXApIHsKKwkJICAgIFJFTU9WRSg1LCAqcHJldiwgdG1wLCBORVhUKHRtcCkpOworCQkgICAgKnByZXYgPSBORVhUKHRtcCk7CisJCSAgICBORVhUKHRtcCkgPSBOVUxMOworCQkgICAgdG1wLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCSAgICAvKiBXZSBtdXN0IHVubG9jayB0aGUgdGFnL0xVTiBpbW1lZGlhdGVseSBoZXJlLCBzaW5jZSB0aGUKKwkJICAgICAqIHRhcmdldCBnb2VzIHRvIEJVUyBGUkVFIGFuZCBkb2Vzbid0IHNlbmQgdXMgYW5vdGhlcgorCQkgICAgICogbWVzc2FnZSAoQ09NTUFORF9DT01QTEVURSBvciB0aGUgbGlrZSkKKwkJICAgICAqLworI2lmZGVmIFNVUFBPUlRfVEFHUworCQkgICAgY21kX2ZyZWVfdGFnKCB0bXAgKTsKKyNlbHNlCisJCSAgICBob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKyNlbmRpZgorCQkgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkgICAgdG1wLT5zY3NpX2RvbmUodG1wKTsKKwkJICAgIGZhbGNvbl9yZWxlYXNlX2xvY2tfaWZfcG9zc2libGUoIGhvc3RkYXRhICk7CisJCSAgICByZXR1cm4gU0NTSV9BQk9SVF9TVUNDRVNTOworCQl9CisJfQorCisvKgorICogQ2FzZSA1IDogSWYgd2UgcmVhY2hlZCB0aGlzIHBvaW50LCB0aGUgY29tbWFuZCB3YXMgbm90IGZvdW5kIGluIGFueSBvZiAKKyAqCSAgICB0aGUgcXVldWVzLgorICoKKyAqIFdlIHByb2JhYmx5IHJlYWNoZWQgdGhpcyBwb2ludCBiZWNhdXNlIG9mIGFuIHVubGlrZWx5IHJhY2UgY29uZGl0aW9uCisgKiBiZXR3ZWVuIHRoZSBjb21tYW5kIGNvbXBsZXRpbmcgc3VjY2Vzc2Z1bGx5IGFuZCB0aGUgYWJvcnRpb24gY29kZSwKKyAqIHNvIHdlIHdvbid0IHBhbmljLCBidXQgd2Ugd2lsbCBub3RpZnkgdGhlIHVzZXIgaW4gY2FzZSBzb21ldGhpbmcgcmVhbGx5CisgKiBicm9rZS4KKyAqLworCisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIHByaW50ayhLRVJOX0lORk8gInNjc2klZDogd2FybmluZyA6IFNDU0kgY29tbWFuZCBwcm9iYWJseSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4iCisgICAgICAgICAgIEtFUk5fSU5GTyAiICAgICAgICBiZWZvcmUgYWJvcnRpb25cbiIsIEhPU1ROTyk7IAorCisvKiBNYXliZSBpdCBpcyBzdWZmaWNpZW50IGp1c3QgdG8gcmVsZWFzZSB0aGUgU1QtRE1BIGxvY2suLi4gKGlmCisgKiBwb3NzaWJsZSBhdCBhbGwpIEF0IGxlYXN0LCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIGxvY2sgY291bGQgYmUKKyAqIHJlbGVhc2VkIGFmdGVyIHRoZSBhYm9ydCwgaW4gY2FzZSBpdCBpcyBrZXB0IGR1ZSB0byBzb21lIGJ1Zy4KKyAqLworICAgIGZhbGNvbl9yZWxlYXNlX2xvY2tfaWZfcG9zc2libGUoIGhvc3RkYXRhICk7CisKKyAgICByZXR1cm4gU0NTSV9BQk9SVF9OT1RfUlVOTklORzsKK30KKworCisvKiAKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfcmVzZXQgKFNjc2lfQ21uZCAqY21kKQorICogCisgKiBQdXJwb3NlIDogcmVzZXQgdGhlIFNDU0kgYnVzLgorICoKKyAqIFJldHVybnMgOiBTQ1NJX1JFU0VUX1dBS0VVUAorICoKKyAqLyAKKworc3RhdGljIGludCBOQ1I1MzgwX2J1c19yZXNldCggU2NzaV9DbW5kICpjbWQpCit7CisgICAgU0VUVVBfSE9TVERBVEEoY21kLT5kZXZpY2UtPmhvc3QpOworICAgIGludCAgICAgICAgICAgaTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmIDEKKyAgICBTY3NpX0NtbmQgKmNvbm5lY3RlZCwgKmRpc2Nvbm5lY3RlZF9xdWV1ZTsKKyNlbmRpZgorCisgICAgaWYgKCFJU19BX1RUKCkgJiYgIWZhbGNvbl9nb3RfbG9jaykKKwlwcmludGsoS0VSTl9FUlIgInNjc2klZDogISFCSU5HTyEhIEZhbGNvbiBoYXMgbm8gbG9jayBpbiBOQ1I1MzgwX3Jlc2V0XG4iLAorCSAgICAgICBIX05PKGNtZCkgKTsKKworICAgIE5DUjUzODBfcHJpbnRfc3RhdHVzIChjbWQtPmRldmljZS0+aG9zdCk7CisKKyAgICAvKiBnZXQgaW4gcGhhc2UgKi8KKyAgICBOQ1I1MzgwX3dyaXRlKCBUQVJHRVRfQ09NTUFORF9SRUcsCisJCSAgIFBIQVNFX1NSX1RPX1RDUiggTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICkpOworICAgIC8qIGFzc2VydCBSU1QgKi8KKyAgICBOQ1I1MzgwX3dyaXRlKCBJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9SU1QgKTsKKyAgICB1ZGVsYXkgKDQwKTsKKyAgICAvKiByZXNldCBOQ1IgcmVnaXN0ZXJzICovCisgICAgTkNSNTM4MF93cml0ZSggSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSApOworICAgIE5DUjUzODBfd3JpdGUoIE1PREVfUkVHLCBNUl9CQVNFICk7CisgICAgTkNSNTM4MF93cml0ZSggVEFSR0VUX0NPTU1BTkRfUkVHLCAwICk7CisgICAgTkNSNTM4MF93cml0ZSggU0VMRUNUX0VOQUJMRV9SRUcsIDAgKTsKKyAgICAvKiArK3JvbWFuOiByZXNldCBpbnRlcnJ1cHQgY29uZGl0aW9uISBvdGhlcndpc2Ugbm8gaW50ZXJydXB0cyBkb24ndCBnZXQKKyAgICAgKiB0aHJvdWdoIGFueW1vcmUgLi4uICovCisgICAgKHZvaWQpTkNSNTM4MF9yZWFkKCBSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyApOworCisjaWYgMSAvKiBYWFggU2hvdWxkIG5vdyBiZSBkb25lIGJ5IG1pZGxldmVsIGNvZGUsIGJ1dCBpdCdzIGJyb2tlbiBYWFggKi8KKyAgICAgIC8qIFhYWCBzZWUgYmVsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYWCAqLworCisgICAgLyogTVNjaDogb2xkLXN0eWxlIHJlc2V0OiBhY3R1YWxseSBhYm9ydCBhbGwgY29tbWFuZCBwcm9jZXNzaW5nIGhlcmUgKi8KKworICAgIC8qIEFmdGVyIHRoZSByZXNldCwgdGhlcmUgYXJlIG5vIG1vcmUgY29ubmVjdGVkIG9yIGRpc2Nvbm5lY3RlZCBjb21tYW5kcworICAgICAqIGFuZCBubyBidXN5IHVuaXRzOyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHJlLWluc2VydGluZyB0aGUgY29tbWFuZHMKKyAgICAgKiBpbnRvIHRoZSBpc3N1ZV9xdWV1ZSAodmlhIHNjc2lfZG9uZSgpKSwgdGhlIGFib3J0ZWQgY29tbWFuZHMgYXJlCisgICAgICogcmVtZW1iZXJlZCBpbiBsb2NhbCB2YXJpYWJsZXMgZmlyc3QuCisgICAgICovCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIGNvbm5lY3RlZCA9IChTY3NpX0NtbmQgKilob3N0ZGF0YS0+Y29ubmVjdGVkOworICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworICAgIGRpc2Nvbm5lY3RlZF9xdWV1ZSA9IChTY3NpX0NtbmQgKilob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOworICAgIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUgPSBOVUxMOworI2lmZGVmIFNVUFBPUlRfVEFHUworICAgIGZyZWVfYWxsX3RhZ3MoKTsKKyNlbmRpZgorICAgIGZvciggaSA9IDA7IGkgPCA4OyArK2kgKQorCWhvc3RkYXRhLT5idXN5W2ldID0gMDsKKyNpZmRlZiBSRUFMX0RNQQorICAgIGhvc3RkYXRhLT5kbWFfbGVuID0gMDsKKyNlbmRpZgorICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIC8qIEluIG9yZGVyIHRvIHRlbGwgdGhlIG1pZC1sZXZlbCBjb2RlIHdoaWNoIGNvbW1hbmRzIHdlcmUgYWJvcnRlZCwgCisgICAgICogc2V0IHRoZSBjb21tYW5kIHN0YXR1cyB0byBESURfUkVTRVQgYW5kIGNhbGwgc2NzaV9kb25lKCkgISEhCisgICAgICogVGhpcyB1bHRpbWF0ZWx5IGFib3J0cyBwcm9jZXNzaW5nIG9mIHRoZXNlIGNvbW1hbmRzIGluIHRoZSBtaWQtbGV2ZWwuCisgICAgICovCisKKyAgICBpZiAoKGNtZCA9IGNvbm5lY3RlZCkpIHsKKwlBQlJUX1BSSU5USygic2NzaSVkOiByZXNldCBhYm9ydGVkIGEgY29ubmVjdGVkIGNvbW1hbmRcbiIsIEhfTk8oY21kKSk7CisJY21kLT5yZXN1bHQgPSAoY21kLT5yZXN1bHQgJiAweGZmZmYpIHwgKERJRF9SRVNFVCA8PCAxNik7CisJY21kLT5zY3NpX2RvbmUoIGNtZCApOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IChjbWQgPSBkaXNjb25uZWN0ZWRfcXVldWUpOyArK2kpIHsKKwlkaXNjb25uZWN0ZWRfcXVldWUgPSBORVhUKGNtZCk7CisJTkVYVChjbWQpID0gTlVMTDsKKwljbWQtPnJlc3VsdCA9IChjbWQtPnJlc3VsdCAmIDB4ZmZmZikgfCAoRElEX1JFU0VUIDw8IDE2KTsKKwljbWQtPnNjc2lfZG9uZSggY21kICk7CisgICAgfQorICAgIGlmIChpID4gMCkKKwlBQlJUX1BSSU5USygic2NzaTogcmVzZXQgYWJvcnRlZCAlZCBkaXNjb25uZWN0ZWQgY29tbWFuZChzKVxuIiwgaSk7CisKKy8qIFRoZSBGYWxjb24gbG9jayBzaG91bGQgYmUgcmVsZWFzZWQgYWZ0ZXIgYSByZXNldC4uLgorICovCisvKiArK2d1ZW50aGVyOiBtb3ZlZCB0byBhdGFyaV9zY3NpX3Jlc2V0KCksIHRvIHByZXZlbnQgYSByYWNlIGJldHdlZW4KKyAqIHVubG9ja2luZyBhbmQgZW5hYmxpbmcgZG1hIGludGVycnVwdC4KKyAqLworLyogICAgZmFsY29uX3JlbGVhc2VfbG9ja19pZl9wb3NzaWJsZSggaG9zdGRhdGEgKTsqLworCisgICAgLyogc2luY2UgYWxsIGNvbW1hbmRzIGhhdmUgYmVlbiBleHBsaWNpdGx5IHRlcm1pbmF0ZWQsIHdlIG5lZWQgdG8gdGVsbAorICAgICAqIHRoZSBtaWRsZXZlbCBjb2RlIHRoYXQgdGhlIHJlc2V0IHdhcyBTVUNDRVNTRlVMLCBhbmQgdGhlcmUgaXMgbm8gCisgICAgICogbmVlZCB0byAnd2FrZSB1cCcgdGhlIGNvbW1hbmRzIGJ5IGEgcmVxdWVzdF9zZW5zZQorICAgICAqLworICAgIHJldHVybiBTQ1NJX1JFU0VUX1NVQ0NFU1MgfCBTQ1NJX1JFU0VUX0JVU19SRVNFVDsKKyNlbHNlIC8qIDEgKi8KKworICAgIC8qIE1TY2g6IG5ldy1zdHlsZSByZXNldCBoYW5kbGluZzogbGV0IHRoZSBtaWQtbGV2ZWwgZG8gd2hhdCBpdCBjYW4gKi8KKworICAgIC8qICsrZ3VlbnRoZXI6IE1JRC1MRVZFTCBJUyBTVElMTCBCUk9LRU4uCisgICAgICogTWlkLWxldmVsIGlzIHN1cHBvc2VkIHRvIHJlcXVldWUgYWxsIGNvbW1hbmRzIHRoYXQgd2VyZSBhY3RpdmUgb24gdGhlCisgICAgICogdmFyaW91cyBsb3ctbGV2ZWwgcXVldWVzLiBJbiBmYWN0IGl0IGRvZXMgdGhpcywgYnV0IHRoYXQncyBub3QgZW5vdWdoCisgICAgICogYmVjYXVzZSBhbGwgdGhlc2UgY29tbWFuZHMgYXJlIHN1YmplY3QgdG8gdGltZW91dC4gQW5kIGlmIGEgdGltZW91dAorICAgICAqIGhhcHBlbnMgZm9yIGFueSByZW1vdmVkIGNvbW1hbmQsICpfYWJvcnQoKSBpcyBjYWxsZWQgYnV0IGFsbCBxdWV1ZXMKKyAgICAgKiBhcmUgbm93IGVtcHR5LiBBYm9ydCB0aGVuIGdpdmVzIHVwIHRoZSBmYWxjb24gbG9jaywgd2hpY2ggaXMgZmF0YWwsCisgICAgICogc2luY2UgdGhlIG1pZC1sZXZlbCB3aWxsIHF1ZXVlIG1vcmUgY29tbWFuZHMgYW5kIG11c3QgaGF2ZSB0aGUgbG9jaworICAgICAqIChpdCdzIGFsbCBoYXBwZW5pbmcgaW5zaWRlIHRpbWVyIGludGVycnVwdCBoYW5kbGVyISEpLgorICAgICAqIEV2ZW4gd29yc2UsIGFib3J0IHdpbGwgcmV0dXJuIE5PVF9SVU5OSU5HIGZvciBhbGwgdGhvc2UgY29tbWFuZHMgbm90CisgICAgICogb24gYW55IHF1ZXVlLCBzbyB0aGV5IHdvbid0IGJlIHJldHJpZWQgLi4uCisgICAgICoKKyAgICAgKiBDb25jbHVzaW9uOiBlaXRoZXIgc2NzaS5jIGRpc2FibGVzIHRpbWVvdXQgZm9yIGFsbCByZXNldHRlZCBjb21tYW5kcworICAgICAqIGltbWVkaWF0ZWx5LCBvciB3ZSBsb3NlISAgQXMgb2YgbGludXgtMi4wLjIwIGl0IGRvZXNuJ3QuCisgICAgICovCisKKyAgICAvKiBBZnRlciB0aGUgcmVzZXQsIHRoZXJlIGFyZSBubyBtb3JlIGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQgY29tbWFuZHMKKyAgICAgKiBhbmQgbm8gYnVzeSB1bml0czsgc28gY2xlYXIgdGhlIGxvdy1sZXZlbCBzdGF0dXMgaGVyZSB0byBhdm9pZCAKKyAgICAgKiBjb25mbGljdHMgd2hlbiB0aGUgbWlkLWxldmVsIGNvZGUgdHJpZXMgdG8gd2FrZSB1cCB0aGUgYWZmZWN0ZWQgCisgICAgICogY29tbWFuZHMhCisgICAgICovCisKKyAgICBpZiAoaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKQorCUFCUlRfUFJJTlRLKCJzY3NpJWQ6IHJlc2V0IGFib3J0ZWQgaXNzdWVkIGNvbW1hbmQocylcbiIsIEhfTk8oY21kKSk7CisgICAgaWYgKGhvc3RkYXRhLT5jb25uZWN0ZWQpIAorCUFCUlRfUFJJTlRLKCJzY3NpJWQ6IHJlc2V0IGFib3J0ZWQgYSBjb25uZWN0ZWQgY29tbWFuZFxuIiwgSF9OTyhjbWQpKTsKKyAgICBpZiAoaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSkKKwlBQlJUX1BSSU5USygic2NzaSVkOiByZXNldCBhYm9ydGVkIGRpc2Nvbm5lY3RlZCBjb21tYW5kKHMpXG4iLCBIX05PKGNtZCkpOworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IE5VTEw7CisgICAgaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisgICAgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSA9IE5VTEw7CisjaWZkZWYgU1VQUE9SVF9UQUdTCisgICAgZnJlZV9hbGxfdGFncygpOworI2VuZGlmCisgICAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApCisJaG9zdGRhdGEtPmJ1c3lbaV0gPSAwOworI2lmZGVmIFJFQUxfRE1BCisgICAgaG9zdGRhdGEtPmRtYV9sZW4gPSAwOworI2VuZGlmCisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisgICAgLyogd2UgZGlkIG5vIGNvbXBsZXRlIHJlc2V0IG9mIGFsbCBjb21tYW5kcywgc28gYSB3YWtldXAgaXMgcmVxdWlyZWQgKi8KKyAgICByZXR1cm4gU0NTSV9SRVNFVF9XQUtFVVAgfCBTQ1NJX1JFU0VUX0JVU19SRVNFVDsKKyNlbmRpZiAvKiAxICovCit9CisKKy8qIExvY2FsIFZhcmlhYmxlczogKi8KKy8qIHRhYi13aWR0aDogOCAgICAgKi8KKy8qIEVuZDogICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hdGFyaV9kbWFfZW11bC5jIGIvZHJpdmVycy9zY3NpL2F0YXJpX2RtYV9lbXVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAyNjA0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hdGFyaV9kbWFfZW11bC5jCkBAIC0wLDAgKzEsNDY2IEBACisvKgorICogYXRhcmlfZG1hX2VtdWwuYyAtLSBUVCBTQ1NJIERNQSBlbXVsYXRvciBmb3IgdGhlIEhhZGVzLgorICoKKyAqIENvcHlyaWdodCAxOTk3IFdvdXQgS2xhcmVuIDxXLktsYXJlbkBpbnRlci5ubC5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoaXMgY29kZSB3YXMgd3JpdHRlbiB1c2luZyB0aGUgSGFkZXMgVE9TIHNvdXJjZSBjb2RlIGFzIGEKKyAqIHJlZmVyZW5jZS4gVGhpcyBzb3VyY2UgY29kZSBjYW4gYmUgZm91bmQgb24gdGhlIGhvbWUgcGFnZQorICogb2YgTWVkdXNhIENvbXB1dGVyIFN5c3RlbXMuCisgKgorICogVmVyc2lvbiAwLjEsIDE5OTctMDktMjQuCisgKiAKKyAqIFRoaXMgY29kZSBzaG91bGQgYmUgY29uc2lkZXJlZCBleHBlcmltZW50YWwuIEl0IGhhcyBvbmx5IGJlZW4KKyAqIHRlc3RlZCBvbiBhIEhhZGVzIHdpdGggYSA2ODA2MC4gSXQgbWlnaHQgbm90IHdvcmsgb24gYSBIYWRlcworICogd2l0aCBhIDY4MDQwLiBNYWtlIGJhY2t1cHMgb2YgeW91ciBoYXJkIGRyaXZlcyBiZWZvcmUgdXNpbmcKKyAqIHRoaXMgY29kZS4KKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBoYWRlc19kbWFfY3RybAkJKCoodW5zaWduZWQgY2hhciAqKSAweGZmZmY4NzE3KQorI2RlZmluZSBoYWRlc19wc2RtX3JlZwkJKCoodW5zaWduZWQgY2hhciAqKSAweGZmZmY4NzQxKQorCisjZGVmaW5lIFRSQU5TRkVSX1NJWkUJCTE2CisKK3N0cnVjdCBtNjgwNDBfZnJhbWUgeworCXVuc2lnbmVkIGxvbmcgIGVmZmFkZHI7ICAvKiBlZmZlY3RpdmUgYWRkcmVzcyAqLworCXVuc2lnbmVkIHNob3J0IHNzdzsgICAgICAvKiBzcGVjaWFsIHN0YXR1cyB3b3JkICovCisJdW5zaWduZWQgc2hvcnQgd2IzczsgICAgIC8qIHdyaXRlIGJhY2sgMyBzdGF0dXMgKi8KKwl1bnNpZ25lZCBzaG9ydCB3YjJzOyAgICAgLyogd3JpdGUgYmFjayAyIHN0YXR1cyAqLworCXVuc2lnbmVkIHNob3J0IHdiMXM7ICAgICAvKiB3cml0ZSBiYWNrIDEgc3RhdHVzICovCisJdW5zaWduZWQgbG9uZyAgZmFkZHI7ICAgIC8qIGZhdWx0IGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nICB3YjNhOyAgICAgLyogd3JpdGUgYmFjayAzIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nICB3YjNkOyAgICAgLyogd3JpdGUgYmFjayAzIGRhdGEgKi8KKwl1bnNpZ25lZCBsb25nICB3YjJhOyAgICAgLyogd3JpdGUgYmFjayAyIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nICB3YjJkOyAgICAgLyogd3JpdGUgYmFjayAyIGRhdGEgKi8KKwl1bnNpZ25lZCBsb25nICB3YjFhOyAgICAgLyogd3JpdGUgYmFjayAxIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nICB3YjFkcGQwOyAgLyogd3JpdGUgYmFjayAxIGRhdGEvcHVzaCBkYXRhIDAqLworCXVuc2lnbmVkIGxvbmcgIHBkMTsgICAgICAvKiBwdXNoIGRhdGEgMSovCisJdW5zaWduZWQgbG9uZyAgcGQyOyAgICAgIC8qIHB1c2ggZGF0YSAyKi8KKwl1bnNpZ25lZCBsb25nICBwZDM7ICAgICAgLyogcHVzaCBkYXRhIDMqLworfTsKKworc3RhdGljIHZvaWQgd3JpdGViYWNrICh1bnNpZ25lZCBzaG9ydCB3YnMsIHVuc2lnbmVkIGxvbmcgd2JhLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyB3YmQsIHZvaWQgKm9sZF9idXNlcnIpCit7CisJbW1fc2VnbWVudF90IGZzID0gZ2V0X2ZzKCk7CisJc3RhdGljIHZvaWQgKnNhdmVfYnVzZXJyOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZlYy5sCSUldmJyLCUlYTBcblx0IgorCQkJICAgICAgIm1vdmUubAklMCw4KCUlYTApXG5cdCIKKwkJCSAgICAgIDoKKwkJCSAgICAgIDogInIiICgmJmJ1c19lcnJvcikKKwkJCSAgICAgIDogImEwIiApOworCisJc2F2ZV9idXNlcnIgPSBvbGRfYnVzZXJyOworCisJc2V0X2ZzIChNQUtFX01NX1NFRyh3YnMgJiBXQlRNXzA0MCkpOworCisJc3dpdGNoICh3YnMgJiBXQlNJWl8wNDApIHsKKwkgICAgY2FzZSBCQV9TSVpFX0JZVEU6CisJCXB1dF91c2VyICh3YmQgJiAweGZmLCAoY2hhciAqKXdiYSk7CisJCWJyZWFrOworCSAgICBjYXNlIEJBX1NJWkVfV09SRDoKKwkJcHV0X3VzZXIgKHdiZCAmIDB4ZmZmZiwgKHNob3J0ICopd2JhKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgQkFfU0laRV9MT05HOgorCQlwdXRfdXNlciAod2JkLCAoaW50ICopd2JhKTsKKwkJYnJlYWs7CisJfQorCisJc2V0X2ZzIChmcyk7CisJcmV0dXJuOworCitidXNfZXJyb3I6CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbXAubAklMCwyKCUlc3ApXG5cdCIKKwkJCSAgICAgICJiY3MucwkuanVtcF9vbGRcblx0IgorCQkJICAgICAgImNtcC5sCSUxLDIoJSVzcClcblx0IgorCQkJICAgICAgImJscy5zCS5yZXN0b3JlX29sZFxuIgorCQkJIi5qdW1wX29sZDpcblx0IgorCQkJICAgICAgIm1vdmUubAklMiwtKCUlc3ApXG5cdCIKKwkJCSAgICAgICJydHNcbiIKKwkJCSIucmVzdG9yZV9vbGQ6XG5cdCIKKwkJCSAgICAgICJtb3ZlLmwJJSVhMCwtKCUlc3ApXG5cdCIKKwkJCSAgICAgICJtb3ZlYy5sCSUldmJyLCUlYTBcblx0IgorCQkJICAgICAgIm1vdmUubAklMiw4KCUlYTApXG5cdCIKKwkJCSAgICAgICJtb3ZlLmwJKCUlc3ApKywlJWEwXG5cdCIKKwkJCSAgICAgICJydGVcblx0IgorCQkJICAgICAgOgorCQkJICAgICAgOiAiaSIgKHdyaXRlYmFjayksICJpIiAoJiZidXNfZXJyb3IpLAorCQkJICAgICAgICAibSIgKHNhdmVfYnVzZXJyKSApOworfQorCisvKgorICogc3RhdGljIGlubGluZSB2b2lkIHNldF9yZXN0ZGF0YV9yZWcodW5zaWduZWQgY2hhciAqY3VyX2FkZHIpCisgKgorICogU2V0IHRoZSByZXN0IGRhdGEgcmVnaXN0ZXIgaWYgbmVjZXNzYXJ5LgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcmVzdGRhdGFfcmVnKHVuc2lnbmVkIGNoYXIgKmN1cl9hZGRyKQoreworCWlmICgoKGxvbmcpIGN1cl9hZGRyICYgfjMpICE9IDApCisJCXR0X3Njc2lfZG1hLmRtYV9yZXN0ZGF0YSA9CisJCQkqKCh1bnNpZ25lZCBsb25nICopICgobG9uZykgY3VyX2FkZHIgJiB+MykpOworfQorCisvKgorICogdm9pZCBoYWRlc19kbWFfZW11bGF0b3IoaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpmcCkKKyAqIAorICogVGhpcyBjb2RlIGVtdWxhdGVzIFRUIFNDU0kgRE1BIG9uIHRoZSBIYWRlcy4KKyAqIAorICogTm90ZSB0aGUgZm9sbG93aW5nOgorICogCisgKiAxLiBXaGVuIHRoZXJlIGlzIG5vIGJ5dGUgYXZhaWxhYmxlIHRvIHJlYWQgZnJvbSB0aGUgU0NTSSBidXMsIG9yCisgKiAgICB3aGVuIGEgYnl0ZSBjYW5ub3QgeWV0IGJldCB3cml0dGVuIHRvIHRoZSBTQ1NJIGJ1cywgYSBidXMKKyAqICAgIGVycm9yIG9jY3VycyB3aGVuIHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgcHNldWRvIERNQSBkYXRhCisgKiAgICByZWdpc3RlciAoaGFkZXNfcHNkbV9yZWcpLiBXZSBoYXZlIHRvIGNhdGNoIHRoaXMgYnVzIGVycm9yCisgKiAgICBhbmQgdHJ5IGFnYWluIHRvIHJlYWQgb3Igd3JpdGUgdGhlIGJ5dGUuIElmIGFmdGVyIHNldmVyYWwgdHJpZXMKKyAqICAgIHdlIHN0aWxsIGdldCBhIGJ1cyBlcnJvciwgdGhlIGludGVycnVwdCBoYW5kbGVyIGlzIGxlZnQuIFdoZW4KKyAqICAgIHRoZSBieXRlIGNhbiBiZSByZWFkIG9yIHdyaXR0ZW4sIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBpcworICogICAgY2FsbGVkIGFnYWluLgorICogCisgKiAyLiBUaGUgU0NTSSBpbnRlcnJ1cHQgbXVzdCBiZSBkaXNhYmxlZCBpbiB0aGlzIGludGVycnVwdCBoYW5kbGVyLgorICogCisgKiAzLiBJZiB3ZSBzZXQgdGhlIEVPUCBzaWduYWwsIHRoZSBTQ1NJIGNvbnRyb2xsZXIgc3RpbGwgZXhwZWN0cyBvbmUKKyAqICAgIGJ5dGUgdG8gYmUgcmVhZCBvciB3cml0dGVuLiBUaGVyZWZvcmUgdGhlIGxhc3QgYnl0ZSBpcyB0cmFuc2ZlcnJlZAorICogICAgc2VwYXJhdGVseSwgYWZ0ZXIgc2V0dGluZyB0aGUgRU9QIHNpZ25hbC4KKyAqIAorICogNC4gV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGxlZnQsIHRoZSBhZGRyZXNzIHBvaW50ZXIgKHN0YXJ0X2FkZHIpIGlzCisgKiAgICBjb252ZXJ0ZWQgdG8gYSBwaHlzaWNhbCBhZGRyZXNzLiBCZWNhdXNlIGl0IHBvaW50cyBvbmUgYnl0ZQorICogICAgZnVydGhlciB0aGFuIHRoZSBsYXN0IHRyYW5zZmVycmVkIGJ5dGUsIGl0IGNhbiBwb2ludCBvdXRzaWRlIHRoZQorICogICAgY3VycmVudCBwYWdlLiBJZiB2aXJ0X3RvX3BoeXMoKSBpcyBjYWxsZWQgd2l0aCB0aGlzIGFkZHJlc3Mgd2UKKyAqICAgIG1pZ2h0IGdldCBhbiBhY2Nlc3MgZXJyb3IuIFRoZXJlZm9yZSB2aXJ0X3RvX3BoeXMoKSBpcyBjYWxsZWQgd2l0aAorICogICAgc3RhcnRfYWRkciAtIDEgaWYgdGhlIGNvdW50IGhhcyByZWFjaGVkIHplcm8uIFRoZSByZXN1bHQgaXMKKyAqICAgIGluY3JlYXNlZCB3aXRoIG9uZS4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgaGFkZXNfZG1hX2VtdWxhdG9yKGludCBpcnEsIHZvaWQgKmR1bW15LCBzdHJ1Y3QgcHRfcmVncyAqZnApCit7CisJdW5zaWduZWQgbG9uZyBkbWFfYmFzZTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGRtYV9jbnQgYXNtICgiZDMiKTsKKwlzdGF0aWMgbG9uZyBzYXZlX2J1c2VycjsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHNhdmVfc3AgYXNtICgiZDQiKTsKKwlyZWdpc3RlciBpbnQgdHJpZXMgYXNtICgiZDUiKTsKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpzdGFydF9hZGRyIGFzbSAoImEzIiksICplbmRfYWRkciBhc20gKCJhNCIpOworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmVmZl9hZGRyOworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnBzZG1fcmVnOworCXVuc2lnbmVkIGxvbmcgcmVtOworCisJYXRhcmlfZGlzYWJsZV9pcnEoSVJRX1RUX01GUF9TQ1NJKTsKKworCS8qCisJICogUmVhZCB0aGUgZG1hIGFkZHJlc3MgYW5kIGNvdW50IHJlZ2lzdGVycy4KKwkgKi8KKworCWRtYV9iYXNlID0gU0NTSV9ETUFfUkVBRF9QKGRtYV9hZGRyKTsKKwlkbWFfY250ID0gU0NTSV9ETUFfUkVBRF9QKGRtYV9jbnQpOworCisJLyoKKwkgKiBDaGVjayBpZiBETUEgaXMgc3RpbGwgZW5hYmxlZC4KKwkgKi8KKworCWlmICgodHRfc2NzaV9kbWEuZG1hX2N0cmwgJiAyKSA9PSAwKQorCXsKKwkJYXRhcmlfZW5hYmxlX2lycShJUlFfVFRfTUZQX1NDU0kpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGRtYV9jbnQgPT0gMCkKKwl7CisJCXByaW50ayhLRVJOX05PVElDRSAiRE1BIGVtdWxhdGlvbjogY291bnQgaXMgemVyby5cbiIpOworCQl0dF9zY3NpX2RtYS5kbWFfY3RybCAmPSAweGZkOwkvKiBETUEgcmVhZHkuICovCisJCWF0YXJpX2VuYWJsZV9pcnEoSVJRX1RUX01GUF9TQ1NJKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCS8qCisJICogSW5zdGFsbCBuZXcgYnVzIGVycm9yIHJvdXRpbmUuCisJICovCisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmVjLmwJJSV2YnIsJSVhMFxuXHQiCisJCQkgICAgICAibW92ZS5sCTgoJSVhMCksJTBcblx0IgorCQkJICAgICAgIm1vdmUubAklMSw4KCUlYTApXG5cdCIKKwkJCSAgICAgIDogIj0mciIgKHNhdmVfYnVzZXJyKQorCQkJICAgICAgOiAiciIgKCYmc2NzaV9idXNfZXJyb3IpCisJCQkgICAgICA6ICJhMCIgKTsKKworCWhhZGVzX2RtYV9jdHJsICY9IDB4ZmM7CQkvKiBCdXMgZXJyb3IgYW5kIEVPUCBvZmYuICovCisKKwkvKgorCSAqIFNhdmUgdGhlIHN0YWNrIHBvaW50ZXIuCisJICovCisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmUubAklJXNwLCUwXG5cdCIKKwkJCSAgICAgIDogIj0mciIgKHNhdmVfc3ApICk7CisKKwl0cmllcyA9IDEwMDsJCQkvKiBNYXhpbXVtIG51bWJlciBvZiBidXMgZXJyb3JzLiAqLworCXN0YXJ0X2FkZHIgPSBwaHlzX3RvX3ZpcnQoZG1hX2Jhc2UpOworCWVuZF9hZGRyID0gc3RhcnRfYWRkciArIGRtYV9jbnQ7CisKK3Njc2lfbG9vcDoKKwlkbWFfY250LS07CisJcmVtID0gZG1hX2NudCAmIChUUkFOU0ZFUl9TSVpFIC0gMSk7CisJZG1hX2NudCAmPSB+KFRSQU5TRkVSX1NJWkUgLSAxKTsKKwlwc2RtX3JlZyA9ICZoYWRlc19wc2RtX3JlZzsKKworCWlmICh0dF9zY3NpX2RtYS5kbWFfY3RybCAmIDEpCS8qIFJlYWQgb3Igd3JpdGU/ICovCisJeworCQkvKgorCQkgKiBTQ1NJIHdyaXRlLiBBYm9ydCB3aGVuIGNvdW50IGlzIHplcm8uCisJCSAqLworCisJCXN3aXRjaCAocmVtKQorCQl7CisJCWNhc2UgMDoKKwkJCXdoaWxlIChkbWFfY250ID4gMCkKKwkJCXsKKwkJCQlkbWFfY250IC09IFRSQU5TRkVSX1NJWkU7CisKKwkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOworCQljYXNlIDE1OgorCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7CisJCWNhc2UgMTQ6CisJCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKKwkJY2FzZSAxMzoKKwkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOworCQljYXNlIDEyOgorCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7CisJCWNhc2UgMTE6CisJCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKKwkJY2FzZSAxMDoKKwkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOworCQljYXNlIDk6CisJCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKKwkJY2FzZSA4OgorCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7CisJCWNhc2UgNzoKKwkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOworCQljYXNlIDY6CisJCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKKwkJY2FzZSA1OgorCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7CisJCWNhc2UgNDoKKwkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOworCQljYXNlIDM6CisJCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKKwkJY2FzZSAyOgorCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7CisJCWNhc2UgMToKKwkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOworCQkJfQorCQl9CisKKwkJaGFkZXNfZG1hX2N0cmwgfD0gMTsJLyogU2V0IEVPUC4gKi8KKwkJdWRlbGF5KDEwKTsKKwkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsJLyogRHVtbXkgYnl0ZS4gKi8KKwkJdHRfc2NzaV9kbWEuZG1hX2N0cmwgJj0gMHhmZDsJLyogRE1BIHJlYWR5LiAqLworCX0KKwllbHNlCisJeworCQkvKgorCQkgKiBTQ1NJIHJlYWQuIEFib3J0IHdoZW4gY291bnQgaXMgemVyby4KKwkJICovCisKKwkJc3dpdGNoIChyZW0pCisJCXsKKwkJY2FzZSAwOgorCQkJd2hpbGUgKGRtYV9jbnQgPiAwKQorCQkJeworCQkJCWRtYV9jbnQgLT0gVFJBTlNGRVJfU0laRTsKKworCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7CisJCWNhc2UgMTU6CisJCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKKwkJY2FzZSAxNDoKKwkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOworCQljYXNlIDEzOgorCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7CisJCWNhc2UgMTI6CisJCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKKwkJY2FzZSAxMToKKwkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOworCQljYXNlIDEwOgorCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7CisJCWNhc2UgOToKKwkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOworCQljYXNlIDg6CisJCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKKwkJY2FzZSA3OgorCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7CisJCWNhc2UgNjoKKwkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOworCQljYXNlIDU6CisJCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKKwkJY2FzZSA0OgorCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7CisJCWNhc2UgMzoKKwkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOworCQljYXNlIDI6CisJCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKKwkJY2FzZSAxOgorCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7CisJCQl9CisJCX0KKworCQloYWRlc19kbWFfY3RybCB8PSAxOwkvKiBTZXQgRU9QLiAqLworCQl1ZGVsYXkoMTApOworCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOworCQl0dF9zY3NpX2RtYS5kbWFfY3RybCAmPSAweGZkOwkvKiBETUEgcmVhZHkuICovCisKKwkJc2V0X3Jlc3RkYXRhX3JlZyhzdGFydF9hZGRyKTsKKwl9CisKKwlpZiAoc3RhcnRfYWRkciAhPSBlbmRfYWRkcikKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiRE1BIGVtdWxhdGlvbjogRkFUQUw6IENvdW50IGlzIG5vdCB6ZXJvIGF0IGVuZCBvZiB0cmFuc2Zlci5cbiIpOworCisJZG1hX2NudCA9IGVuZF9hZGRyIC0gc3RhcnRfYWRkcjsKKworc2NzaV9lbmQ6CisJZG1hX2Jhc2UgPSAoZG1hX2NudCA9PSAwKSA/IHZpcnRfdG9fcGh5cyhzdGFydF9hZGRyIC0gMSkgKyAxIDogIAorCQkJCSAgICB2aXJ0X3RvX3BoeXMoc3RhcnRfYWRkcik7CisKKwlTQ1NJX0RNQV9XUklURV9QKGRtYV9hZGRyLCBkbWFfYmFzZSk7CisJU0NTSV9ETUFfV1JJVEVfUChkbWFfY250LCBkbWFfY250KTsKKworCS8qCisJICogUmVzdG9yZSBvbGQgYnVzIGVycm9yIHJvdXRpbmUuCisJICovCisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmVjLmwJJSV2YnIsJSVhMFxuXHQiCisJCQkgICAgICAibW92ZS5sCSUwLDgoJSVhMClcblx0IgorCQkJICAgICAgOgorCQkJICAgICAgOiAiciIgKHNhdmVfYnVzZXJyKQorCQkJICAgICAgOiAiYTAiICk7CisKKwlhdGFyaV9lbmFibGVfaXJxKElSUV9UVF9NRlBfU0NTSSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKK3Njc2lfYnVzX2Vycm9yOgorCS8qCisJICogRmlyc3QgY2hlY2sgaWYgdGhlIGJ1cyBlcnJvciBpcyBjYXVzZWQgYnkgb3VyIGNvZGUuCisJICogSWYgbm90LCBjYWxsIHRoZSBvcmlnaW5hbCBoYW5kbGVyLgorCSAqLworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbXAubAklMCwyKCUlc3ApXG5cdCIKKwkJCSAgICAgICJiY3Mucwkub2xkX3ZlY3RvclxuXHQiCisJCQkgICAgICAiY21wLmwJJTEsMiglJXNwKVxuXHQiCisJCQkgICAgICAiYmxzLnMJLnNjc2lfYnVzZXJyXG4iCisJCQkiLm9sZF92ZWN0b3I6XG5cdCIKKwkJCSAgICAgICJtb3ZlLmwJJTIsLSglJXNwKVxuXHQiCisJCQkgICAgICAicnRzXG4iCisJCQkiLnNjc2lfYnVzZXJyOlxuXHQiCisJCQkgICAgICA6CisJCQkgICAgICA6ICJpIiAoJiZzY3NpX2xvb3ApLCAiaSIgKCYmc2NzaV9lbmQpLAorCQkJICAgICAgICAibSIgKHNhdmVfYnVzZXJyKSApOworCisJaWYgKENQVV9JU18wNjApCisJeworCQkvKgorCQkgKiBHZXQgZWZmZWN0aXZlIGFkZHJlc3MgYW5kIHJlc3RvcmUgdGhlIHN0YWNrLgorCQkgKi8KKworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmUubAk4KCUlc3ApLCUwXG5cdCIKKwkJCQkgICAgICAibW92ZS5sCSUxLCUlc3Bcblx0IgorCQkJCSAgICAgIDogIj1hJiIgKGVmZl9hZGRyKQorCQkJCSAgICAgIDogInIiIChzYXZlX3NwKSApOworCX0KKwllbHNlCisJeworCQlyZWdpc3RlciBzdHJ1Y3QgbTY4MDQwX2ZyYW1lICpmcmFtZTsKKworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxlYQk4KCUlc3ApLCUwXG5cdCIKKwkJCQkgICAgICA6ICI9YSYiIChmcmFtZSkgKTsKKworCQlpZiAodHRfc2NzaV9kbWEuZG1hX2N0cmwgJiAxKQorCQl7CisJCQkvKgorCQkJICogQnVzIGVycm9yIHdoaWxlIHdyaXRpbmcuCisJCQkgKi8KKworCQkJaWYgKGZyYW1lLT53YjNzICYgV0JWXzA0MCkKKwkJCXsKKwkJCQlpZiAoZnJhbWUtPndiM2EgPT0gKGxvbmcpICZoYWRlc19wc2RtX3JlZykKKwkJCQkJc3RhcnRfYWRkci0tOworCQkJCWVsc2UKKwkJCQkJd3JpdGViYWNrKGZyYW1lLT53YjNzLCBmcmFtZS0+d2IzYSwKKwkJCQkJCSAgZnJhbWUtPndiM2QsICYmc2NzaV9idXNfZXJyb3IpOworCQkJfQorCisJCQlpZiAoZnJhbWUtPndiMnMgJiBXQlZfMDQwKQorCQkJeworCQkJCWlmIChmcmFtZS0+d2IyYSA9PSAobG9uZykgJmhhZGVzX3BzZG1fcmVnKQorCQkJCQlzdGFydF9hZGRyLS07CisJCQkJZWxzZQorCQkJCQl3cml0ZWJhY2soZnJhbWUtPndiMnMsIGZyYW1lLT53YjJhLAorCQkJCQkJICBmcmFtZS0+d2IyZCwgJiZzY3NpX2J1c19lcnJvcik7CisJCQl9CisKKwkJCWlmIChmcmFtZS0+d2IxcyAmIFdCVl8wNDApCisJCQl7CisJCQkJaWYgKGZyYW1lLT53YjFhID09IChsb25nKSAmaGFkZXNfcHNkbV9yZWcpCisJCQkJCXN0YXJ0X2FkZHItLTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8qCisJCQkgKiBCdXMgZXJyb3Igd2hpbGUgcmVhZGluZy4KKwkJCSAqLworCisJCQlpZiAoZnJhbWUtPndiM3MgJiBXQlZfMDQwKQorCQkJCXdyaXRlYmFjayhmcmFtZS0+d2IzcywgZnJhbWUtPndiM2EsCisJCQkJCSAgZnJhbWUtPndiM2QsICYmc2NzaV9idXNfZXJyb3IpOworCQl9CisKKwkJZWZmX2FkZHIgPSAodW5zaWduZWQgY2hhciAqKSBmcmFtZS0+ZmFkZHI7CisKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZlLmwJJTAsJSVzcFxuXHQiCisJCQkJICAgICAgOgorCQkJCSAgICAgIDogInIiIChzYXZlX3NwKSApOworCX0KKworCWRtYV9jbnQgPSBlbmRfYWRkciAtIHN0YXJ0X2FkZHI7CisKKwlpZiAoZWZmX2FkZHIgPT0gJmhhZGVzX3BzZG1fcmVnKQorCXsKKwkJLyoKKwkJICogQnVzIGVycm9yIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgdGhlIHBzZXVkbworCQkgKiBETUEgcmVnaXN0ZXIuIFRpbWUgb3V0LgorCQkgKi8KKworCQl0cmllcy0tOworCisJCWlmICh0cmllcyA8PSAwKQorCQl7CisJCQlpZiAoKHR0X3Njc2lfZG1hLmRtYV9jdHJsICYgMSkgPT0gMCkJLyogUmVhZCBvciB3cml0ZT8gKi8KKwkJCQlzZXRfcmVzdGRhdGFfcmVnKHN0YXJ0X2FkZHIpOworCisJCQlpZiAoZG1hX2NudCA8PSAxKQorCQkJCXByaW50ayhLRVJOX0NSSVQgIkRNQSBlbXVsYXRpb246IEZhdGFsICIKKwkJCQkgICAgICAgImVycm9yIHdoaWxlICVzIHRoZSBsYXN0IGJ5dGUuXG4iLAorCQkJCSAgICAgICAodHRfc2NzaV9kbWEuZG1hX2N0cmwgJiAxKQorCQkJCSAgICAgICA/ICJ3cml0aW5nIiA6ICJyZWFkaW5nIik7CisKKwkJCWdvdG8gc2NzaV9lbmQ7CisJCX0KKwkJZWxzZQorCQkJZ290byBzY3NpX2xvb3A7CisJfQorCWVsc2UKKwl7CisJCS8qCisJCSAqIEJ1cyBlcnJvciBkdXJpbmcgcHNldWRvIERNQSB0cmFuc2Zlci4KKwkJICogVGVybWluYXRlIHRoZSBETUEgdHJhbnNmZXIuCisJCSAqLworCisJCWhhZGVzX2RtYV9jdHJsIHw9IDM7CS8qIFNldCBFT1AgYW5kIGJ1cyBlcnJvci4gKi8KKwkJaWYgKCh0dF9zY3NpX2RtYS5kbWFfY3RybCAmIDEpID09IDApCS8qIFJlYWQgb3Igd3JpdGU/ICovCisJCQlzZXRfcmVzdGRhdGFfcmVnKHN0YXJ0X2FkZHIpOworCQlnb3RvIHNjc2lfZW5kOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hdGFyaV9zY3NpLmMgYi9kcml2ZXJzL3Njc2kvYXRhcmlfc2NzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOGFkYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXRhcmlfc2NzaS5jCkBAIC0wLDAgKzEsMTE2MyBAQAorLyoKKyAqIGF0YXJpX3Njc2kuYyAtLSBEZXZpY2UgZGVwZW5kZW50IGZ1bmN0aW9ucyBmb3IgdGhlIEF0YXJpIGdlbmVyaWMgU0NTSSBwb3J0CisgKgorICogQ29weXJpZ2h0IDE5OTQgUm9tYW4gSG9kZWsgPFJvbWFuLkhvZGVrQGluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgorICoKKyAqICAgTG9vc2VseSBiYXNlZCBvbiB0aGUgd29yayBvZiBSb2JlcnQgRGUgVnJpZXMnIHRlYW0gYW5kIGFkZGVkOgorICogICAgLSB3b3JraW5nIHJlYWwgRE1BCisgKiAgICAtIEZhbGNvbiBzdXBwb3J0ICh1bnRlc3RlZCB5ZXQhKSAgICsrYmpvZXJuIGZpeGVkIGFuZCBub3cgaXQgd29ya3MKKyAqICAgIC0gbG90cyBvZiBleHRlbnNpb25zIGFuZCBidWcgZml4ZXMuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGVzIGZvciBGYWxjb24gU0NTSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFNpbmNlIHRoZSBGYWxjb24gU0NTSSB1c2VzIHRoZSBTVC1ETUEgY2hpcCwgdGhhdCBpcyBzaGFyZWQgYW1vbmcgICAgICAgKi8KKy8qIHNldmVyYWwgZGV2aWNlIGRyaXZlcnMsIGxvY2tpbmcgYW5kIHVubG9ja2luZyB0aGUgYWNjZXNzIHRvIHRoaXMgICAgICAgKi8KKy8qIGNoaXAgaXMgcmVxdWlyZWQuIEJ1dCBsb2NraW5nIGlzIG5vdCBwb3NzaWJsZSBmcm9tIGFuIGludGVycnVwdCwgICAgICAgKi8KKy8qIHNpbmNlIGl0IHB1dHMgdGhlIHByb2Nlc3MgdG8gc2xlZXAgaWYgdGhlIGxvY2sgaXMgbm90IGF2YWlsYWJsZS4gICAgICAgKi8KKy8qIFRoaXMgcHJldmVudHMgImxhdGUiIGxvY2tpbmcgb2YgdGhlIERNQSBjaGlwLCBpLmUuIGxvY2tpbmcgaXQganVzdCAgICAgKi8KKy8qIGJlZm9yZSB1c2luZyBpdCwgc2luY2UgaW4gY2FzZSBvZiBkaXNjb25uZWN0aW9uLXJlY29ubmVjdGlvbiAgICAgICAgICAgKi8KKy8qIGNvbW1hbmRzLCB0aGUgRE1BIGlzIHN0YXJ0ZWQgZnJvbSB0aGUgcmVzZWxlY3Rpb24gaW50ZXJydXB0LiAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFR3byBwb3NzaWJsZSBzY2hlbWVzIGZvciBTVC1ETUEtbG9ja2luZyB3b3VsZCBiZTogICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxKSBUaGUgbG9jayBpcyB0YWtlbiBmb3IgZWFjaCBjb21tYW5kIHNlcGFyYXRlbHkgYW5kIGRpc2Nvbm5lY3RpbmcgICAgKi8KKy8qICAgICBpcyBmb3JiaWRkZW4gKGkuZS4gY2FuX3F1ZXVlID0gMSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyKSBUaGUgRE1BIGNoaXAgaXMgbG9ja2VkIHdoZW4gdGhlIGZpcnN0IGNvbW1hbmQgY29tZXMgaW4gYW5kICAgICAgICAgKi8KKy8qICAgICByZWxlYXNlZCB3aGVuIHRoZSBsYXN0IGNvbW1hbmQgaXMgZmluaXNoZWQgYW5kIGFsbCBxdWV1ZXMgYXJlICAgICAgKi8KKy8qICAgICBlbXB0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZSBmaXJzdCBhbHRlcm5hdGl2ZSB3b3VsZCByZXN1bHQgaW4gYmFkIHBlcmZvcm1hbmNlLCBzaW5jZSB0aGUgICAgICAgKi8KKy8qIGludGVybGVhdmluZyBvZiBjb21tYW5kcyB3b3VsZCBub3QgYmUgdXNlZC4gVGhlIHNlY29uZCBpcyB1bmZhaXIgdG8gICAgKi8KKy8qIG90aGVyIGRyaXZlcnMgdXNpbmcgdGhlIFNULURNQSwgYmVjYXVzZSB0aGUgcXVldWVzIHdpbGwgc2VsZG9tIGJlICAgICAgKi8KKy8qIHRvdGFsbHkgZW1wdHkgaWYgdGhlcmUgaXMgYSBsb3Qgb2YgZGlzayB0cmFmZmljLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZvciB0aGlzIHJlYXNvbnMgSSBkZWNpZGVkIHRvIGVtcGxveSBhIG1vcmUgZWxhYm9yYXRlIHNjaGVtZTogICAgICAgICAgKi8KKy8qICAtIEZpcnN0LCB3ZSBnaXZlIHVwIHRoZSBsb2NrIGV2ZXJ5IHRpbWUgd2UgY2FuIChmb3IgZmFpcm5lc3MpLCB0aGlzICAgICovCisvKiAgICBtZWFucyBldmVyeSB0aW1lIGEgY29tbWFuZCBmaW5pc2hlcyBhbmQgdGhlcmUgYXJlIG5vIG90aGVyIGNvbW1hbmRzICovCisvKiAgICBvbiB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgLSBJZiB0aGVyZSBhcmUgb3RoZXJzIHdhaXRpbmcgdG8gbG9jayB0aGUgRE1BIGNoaXAsIHdlIHN0b3AgICAgICAgICAgICovCisvKiAgICBpc3N1aW5nIGNvbW1hbmRzLCBpLmUuIG1vdmluZyB0aGVtIG9udG8gdGhlIGlzc3VlIHF1ZXVlLiAgICAgICAgICAgKi8KKy8qICAgIEJlY2F1c2Ugb2YgdGhhdCwgdGhlIGRpc2Nvbm5lY3RlZCBxdWV1ZSB3aWxsIHJ1biBlbXB0eSBpbiBhICAgICAgICAgKi8KKy8qICAgIHdoaWxlLiBJbnN0ZWFkIHdlIGdvIHRvIHNsZWVwIG9uIGEgJ2ZhaXJuZXNzX3F1ZXVlJy4gICAgICAgICAgICAgICAgKi8KKy8qICAtIElmIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCBhbGwgcHJvY2Vzc2VzIHdhaXRpbmcgb24gdGhlIGZhaXJuZXNzICAgICAgKi8KKy8qICAgIHF1ZXVlIHdpbGwgYmUgd29rZW4uIFRoZSBmaXJzdCBvZiB0aGVtIHRyaWVzIHRvIHJlLWxvY2sgdGhlIERNQSwgICAgICovCisvKiAgICB0aGUgb3RoZXJzIHdhaXQgZm9yIHRoZSBmaXJzdCB0byBmaW5pc2ggdGhpcyB0YXNrLiBBZnRlciB0aGF0LCAgICAgICovCisvKiAgICB0aGV5IGNhbiBhbGwgcnVuIG9uIGFuZCBkbyB0aGVpciBjb21tYW5kcy4uLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIHNvdW5kcyBjb21wbGljYXRlZCAoYW5kIGl0IGlzIGl0IDotKCksIGJ1dCBpdCBzZWVtcyB0byBiZSBhICAgICAgICovCisvKiBnb29kIGNvbXByb21pc2UgYmV0d2VlbiBmYWlybmVzcyBhbmQgcGVyZm9ybWFuY2U6IEFzIGxvbmcgYXMgbm8gb25lICAgICAqLworLyogZWxzZSB3YW50cyB0byB3b3JrIHdpdGggdGhlIFNULURNQSBjaGlwLCBTQ1NJIGNhbiBnbyBhbG9uZyBhcyAgICAgICAgICAqLworLyogdXN1YWwuIElmIG5vdyBzb21lb25lIGVsc2UgY29tZXMsIHRoaXMgYmVoYXZpb3VyIGlzIGNoYW5nZWQgdG8gYSAgICAgICAqLworLyogImZhaXJuZXNzIG1vZGUiOiBqdXN0IGFscmVhZHkgaW5pdGlhdGVkIGNvbW1hbmRzIGFyZSBmaW5pc2hlZCBhbmQgICAgICAqLworLyogdGhlbiB0aGUgbG9jayBpcyByZWxlYXNlZC4gVGhlIG90aGVyIG9uZSB3YWl0aW5nIHdpbGwgcHJvYmFibHkgd2luICAgICAqLworLyogdGhlIHJhY2UgZm9yIGxvY2tpbmcgdGhlIERNQSwgc2luY2UgaXQgd2FzIHdhaXRpbmcgZm9yIGxvbmdlci4gQW5kICAgICAqLworLyogYWZ0ZXIgaXQgaGFzIGZpbmlzaGVkLCBTQ1NJIGNhbiBnbyBhaGVhZCBhZ2Fpbi4gRmluYWxseTogSSBob3BlIEkgICAgICAqLworLyogaGF2ZSBub3QgcHJvZHVjZWQgYW55IGRlYWRsb2NrIHBvc3NpYmlsaXRpZXMhICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjZGVmaW5lIE5ERUJVRyAoMCkKKworI2RlZmluZSBOREVCVUdfQUJPUlQJMHg4MDAwMDAKKyNkZWZpbmUgTkRFQlVHX1RBR1MJMHgxMDAwMDAwCisjZGVmaW5lIE5ERUJVR19NRVJHSU5HCTB4MjAwMDAwMAorCisjZGVmaW5lIEFVVE9TRU5TRQorLyogRm9yIHRoZSBBdGFyaSB2ZXJzaW9uLCB1c2Ugb25seSBwb2xsZWQgSU8gb3IgUkVBTF9ETUEgKi8KKyNkZWZpbmUJUkVBTF9ETUEKKy8qIFN1cHBvcnQgdGFnZ2VkIHF1ZXVpbmc/IChvbiBkZXZpY2VzIHRoYXQgYXJlIGFibGUgdG8uLi4gOi0pICovCisjZGVmaW5lCVNVUFBPUlRfVEFHUworI2RlZmluZQlNQVhfVEFHUyAzMgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9udnJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL2F0YXJpaHcuaD4KKyNpbmNsdWRlIDxhc20vYXRhcmlpbnRzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdHJhcHMuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgImF0YXJpX3Njc2kuaCIKKyNpbmNsdWRlICJOQ1I1MzgwLmgiCisjaW5jbHVkZSA8YXNtL2F0YXJpX3N0ZG1hLmg+CisjaW5jbHVkZSA8YXNtL2F0YXJpX3N0cmFtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisKKyNkZWZpbmUJSVNfQV9UVCgpCUFUQVJJSFdfUFJFU0VOVChUVF9TQ1NJKQorCisjZGVmaW5lCVNDU0lfRE1BX1dSSVRFX1AoZWx0LHZhbCkJCQkJXAorCWRvIHsJCQkJCQkJXAorCQl1bnNpZ25lZCBsb25nIHYgPSB2YWw7CQkJCVwKKwkJdHRfc2NzaV9kbWEuZWx0IyNfbG8gPSB2ICYgMHhmZjsJCVwKKwkJdiA+Pj0gODsJCQkJCVwKKwkJdHRfc2NzaV9kbWEuZWx0IyNfbG1kID0gdiAmIDB4ZmY7CQlcCisJCXYgPj49IDg7CQkJCQlcCisJCXR0X3Njc2lfZG1hLmVsdCMjX2htZCA9IHYgJiAweGZmOwkJXAorCQl2ID4+PSA4OwkJCQkJXAorCQl0dF9zY3NpX2RtYS5lbHQjI19oaSA9IHYgJiAweGZmOwkJXAorCX0gd2hpbGUoMCkKKworI2RlZmluZQlTQ1NJX0RNQV9SRUFEX1AoZWx0KQkJCQkJXAorCSgoKCgoKCh1bnNpZ25lZCBsb25nKXR0X3Njc2lfZG1hLmVsdCMjX2hpIDw8IDgpIHwJXAorCSAgICAgKHVuc2lnbmVkIGxvbmcpdHRfc2NzaV9kbWEuZWx0IyNfaG1kKSA8PCA4KSB8CVwKKwkgICAodW5zaWduZWQgbG9uZyl0dF9zY3NpX2RtYS5lbHQjI19sbWQpIDw8IDgpIHwJXAorCSAodW5zaWduZWQgbG9uZyl0dF9zY3NpX2RtYS5lbHQjI19sbykKKworCitzdGF0aWMgaW5saW5lIHZvaWQgU0NTSV9ETUFfU0VUQURSKHVuc2lnbmVkIGxvbmcgYWRyKQoreworCXN0X2RtYS5kbWFfbG8gPSAodW5zaWduZWQgY2hhcilhZHI7CisJTUZQREVMQVkoKTsKKwlhZHIgPj49IDg7CisJc3RfZG1hLmRtYV9tZCA9ICh1bnNpZ25lZCBjaGFyKWFkcjsKKwlNRlBERUxBWSgpOworCWFkciA+Pj0gODsKKwlzdF9kbWEuZG1hX2hpID0gKHVuc2lnbmVkIGNoYXIpYWRyOworCU1GUERFTEFZKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBTQ1NJX0RNQV9HRVRBRFIodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkcjsKKwlhZHIgPSBzdF9kbWEuZG1hX2xvOworCU1GUERFTEFZKCk7CisJYWRyIHw9IChzdF9kbWEuZG1hX21kICYgMHhmZikgPDwgODsKKwlNRlBERUxBWSgpOworCWFkciB8PSAoc3RfZG1hLmRtYV9oaSAmIDB4ZmYpIDw8IDE2OworCU1GUERFTEFZKCk7CisJcmV0dXJuIGFkcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEVOQUJMRV9JUlEodm9pZCkKK3sKKwlpZiAoSVNfQV9UVCgpKQorCQlhdGFyaV9lbmFibGVfaXJxKElSUV9UVF9NRlBfU0NTSSk7CisJZWxzZQorCQlhdGFyaV9lbmFibGVfaXJxKElSUV9NRlBfRlNDU0kpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgRElTQUJMRV9JUlEodm9pZCkKK3sKKwlpZiAoSVNfQV9UVCgpKQorCQlhdGFyaV9kaXNhYmxlX2lycShJUlFfVFRfTUZQX1NDU0kpOworCWVsc2UKKwkJYXRhcmlfZGlzYWJsZV9pcnEoSVJRX01GUF9GU0NTSSk7Cit9CisKKworI2RlZmluZSBIT1NUREFUQV9ETUFMRU4JCSgoKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopIFwKKwkJCQkoYXRhcmlfc2NzaV9ob3N0LT5ob3N0ZGF0YSkpLT5kbWFfbGVuKQorCisvKiBUaW1lIChpbiBqaWZmaWVzKSB0byB3YWl0IGFmdGVyIGEgcmVzZXQ7IHRoZSBTQ1NJIHN0YW5kYXJkIGNhbGxzIGZvciAyNTBtcywKKyAqIHdlIHVzdWFsbHkgZG8gMC41cyB0byBiZSBvbiB0aGUgc2FmZSBzaWRlLiBCdXQgVG9zaGliYSBDRC1ST01zIG9uY2UgbW9yZQorICogbmVlZCB0ZW4gdGltZXMgdGhlIHN0YW5kYXJkIHZhbHVlLi4uICovCisjaWZuZGVmIENPTkZJR19BVEFSSV9TQ1NJX1RPU0hJQkFfREVMQVkKKyNkZWZpbmUJQUZURVJfUkVTRVRfREVMQVkJKEhaLzIpCisjZWxzZQorI2RlZmluZQlBRlRFUl9SRVNFVF9ERUxBWQkoNSpIWi8yKQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgUkVBTF9ETUEKK3N0YXRpYyBpbnQgc2NzaV9kbWFfaXNfaWdub3JlZF9idXNlcnIoIHVuc2lnbmVkIGNoYXIgZG1hX3N0YXQgKTsKK3N0YXRpYyB2b2lkIGF0YXJpX3Njc2lfZmV0Y2hfcmVzdGJ5dGVzKCB2b2lkICk7CitzdGF0aWMgbG9uZyBhdGFyaV9zY3NpX2RtYV9yZXNpZHVhbCggc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UgKTsKK3N0YXRpYyBpbnQgZmFsY29uX2NsYXNzaWZ5X2NtZCggU2NzaV9DbW5kICpjbWQgKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGF0YXJpX2RtYV94ZmVyX2xlbiggdW5zaWduZWQgbG9uZyB3YW50ZWRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3NpX0NtbmQgKmNtZCwgaW50IHdyaXRlX2ZsYWcgKTsKKyNlbmRpZgorc3RhdGljIGlycXJldHVybl90IHNjc2lfdHRfaW50ciggaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpmcCk7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NzaV9mYWxjb25faW50ciggaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpmcCk7CitzdGF0aWMgdm9pZCBmYWxjb25fcmVsZWFzZV9sb2NrX2lmX3Bvc3NpYmxlKCBzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0ZGF0YSApOworc3RhdGljIHZvaWQgZmFsY29uX2dldF9sb2NrKCB2b2lkICk7CisjaWZkZWYgQ09ORklHX0FUQVJJX1NDU0lfUkVTRVRfQk9PVAorc3RhdGljIHZvaWQgYXRhcmlfc2NzaV9yZXNldF9ib290KCB2b2lkICk7CisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF0YXJpX3Njc2lfdHRfcmVnX3JlYWQoIHVuc2lnbmVkIGNoYXIgcmVnICk7CitzdGF0aWMgdm9pZCBhdGFyaV9zY3NpX3R0X3JlZ193cml0ZSggdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsdWUpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXRhcmlfc2NzaV9mYWxjb25fcmVnX3JlYWQoIHVuc2lnbmVkIGNoYXIgcmVnICk7CitzdGF0aWMgdm9pZCBhdGFyaV9zY3NpX2ZhbGNvbl9yZWdfd3JpdGUoIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbHVlICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCBvZiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICphdGFyaV9zY3NpX2hvc3QgPSBOVUxMOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKCphdGFyaV9zY3NpX3JlZ19yZWFkKSggdW5zaWduZWQgY2hhciByZWcgKTsKK3N0YXRpYyB2b2lkICgqYXRhcmlfc2NzaV9yZWdfd3JpdGUpKCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWx1ZSApOworCisjaWZkZWYgUkVBTF9ETUEKK3N0YXRpYyB1bnNpZ25lZCBsb25nCWF0YXJpX2RtYV9yZXNpZHVhbCwgYXRhcmlfZG1hX3N0YXJ0YWRkcjsKK3N0YXRpYyBzaG9ydAkJYXRhcmlfZG1hX2FjdGl2ZTsKKy8qIHBvaW50ZXIgdG8gdGhlIGRyaWJibGUgYnVmZmVyICovCitzdGF0aWMgY2hhcgkJKmF0YXJpX2RtYV9idWZmZXIgPSBOVUxMOworLyogcHJlY2FsY3VsYXRlZCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBkcmliYmxlIGJ1ZmZlciAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcJYXRhcmlfZG1hX3BoeXNfYnVmZmVyOworLyogIT0gMCB0ZWxscyB0aGUgRmFsY29uIGludCBoYW5kbGVyIHRvIGNvcHkgZGF0YSBmcm9tIHRoZSBkcmliYmxlIGJ1ZmZlciAqLworc3RhdGljIGNoYXIJCSphdGFyaV9kbWFfb3JpZ19hZGRyOworLyogc2l6ZSBvZiB0aGUgZHJpYmJsZSBidWZmZXI7IDRrIHNlZW1zIGVub3VnaCwgc2luY2UgdGhlIEZhbGNvbiBjYW5ub3QgdXNlCisgKiBzY2F0dGVyLWdhdGhlciBhbnl3YXksIHNvIG1vc3QgdHJhbnNmZXJzIGFyZSAxMDI0IGJ5dGUgb25seS4gSW4gdGhlIHJhcmUKKyAqIGNhc2VzIHdoZXJlIHJlcXVlc3RzIHRvIHBoeXNpY2FsIGNvbnRpZ3VvdXMgYnVmZmVycyBoYXZlIGJlZW4gbWVyZ2VkLCB0aGlzCisgKiByZXF1ZXN0IGlzIDw9IDRrIChvbmUgcGFnZSkuIFNvIEkgZG9uJ3QgdGhpbmsgd2UgaGF2ZSB0byBzcGxpdCB0cmFuc2ZlcnMKKyAqIGp1c3QgZHVlIHRvIHRoaXMgYnVmZmVyIHNpemUuLi4KKyAqLworI2RlZmluZQlTVFJBTV9CVUZGRVJfU0laRQkoNDA5NikKKy8qIG1hc2sgZm9yIGFkZHJlc3MgYml0cyB0aGF0IGNhbid0IGJlIHVzZWQgd2l0aCB0aGUgU1QtRE1BICovCitzdGF0aWMgdW5zaWduZWQgbG9uZwlhdGFyaV9kbWFfc3RyYW1fbWFzazsKKyNkZWZpbmUgU1RSQU1fQUREUihhKQkoKChhKSAmIGF0YXJpX2RtYV9zdHJhbV9tYXNrKSA9PSAwKQorLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGN1dCBmcm9tIGEgdHJhbnNmZXIgdG8gaGFuZGxlIE5DUiBvdmVycnVucyAqLworc3RhdGljIGludCBhdGFyaV9yZWFkX292ZXJydW5zID0gMDsKKyNlbmRpZgorCitzdGF0aWMgaW50IHNldHVwX2Nhbl9xdWV1ZSA9IC0xOworTU9EVUxFX1BBUk0oc2V0dXBfY2FuX3F1ZXVlLCAiaSIpOworc3RhdGljIGludCBzZXR1cF9jbWRfcGVyX2x1biA9IC0xOworTU9EVUxFX1BBUk0oc2V0dXBfY21kX3Blcl9sdW4sICJpIik7CitzdGF0aWMgaW50IHNldHVwX3NnX3RhYmxlc2l6ZSA9IC0xOworTU9EVUxFX1BBUk0oc2V0dXBfc2dfdGFibGVzaXplLCAiaSIpOworI2lmZGVmIFNVUFBPUlRfVEFHUworc3RhdGljIGludCBzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcgPSAtMTsKK01PRFVMRV9QQVJNKHNldHVwX3VzZV90YWdnZWRfcXVldWluZywgImkiKTsKKyNlbmRpZgorc3RhdGljIGludCBzZXR1cF9ob3N0aWQgPSAtMTsKK01PRFVMRV9QQVJNKHNldHVwX2hvc3RpZCwgImkiKTsKKworCisjaWYgZGVmaW5lZChDT05GSUdfVFRfRE1BX0VNVUwpCisjaW5jbHVkZSAiYXRhcmlfZG1hX2VtdWwuYyIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChSRUFMX0RNQSkKKworc3RhdGljIGludCBzY3NpX2RtYV9pc19pZ25vcmVkX2J1c2VyciggdW5zaWduZWQgY2hhciBkbWFfc3RhdCApCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZwlhZGRyID0gU0NTSV9ETUFfUkVBRF9QKCBkbWFfYWRkciApLCBlbmRfYWRkcjsKKworCWlmIChkbWFfc3RhdCAmIDB4MDEpIHsKKworCQkvKiBBIGJ1cyBlcnJvciBoYXBwZW5zIHdoZW4gRE1BLWluZyBmcm9tIHRoZSBsYXN0IHBhZ2Ugb2YgYQorCQkgKiBwaHlzaWNhbCBtZW1vcnkgY2h1bmsgKERNQSBwcmVmZXRjaCEpLCBidXQgdGhhdCBkb2Vzbid0IGh1cnQuCisJCSAqIENoZWNrIGZvciB0aGlzIGNhc2U6CisJCSAqLworCQkKKwkJZm9yKCBpID0gMDsgaSA8IG02OGtfbnVtX21lbW9yeTsgKytpICkgeworCQkJZW5kX2FkZHIgPSBtNjhrX21lbW9yeVtpXS5hZGRyICsKKwkJCQltNjhrX21lbW9yeVtpXS5zaXplOworCQkJaWYgKGVuZF9hZGRyIDw9IGFkZHIgJiYgYWRkciA8PSBlbmRfYWRkciArIDQpCisJCQkJcmV0dXJuKCAxICk7CisJCX0KKwl9CisJcmV0dXJuKCAwICk7Cit9CisKKworI2lmIDAKKy8qIERlYWQgY29kZS4uLiB3YXNuJ3QgY2FsbGVkIGFueXdheSA6LSkgYW5kIGNhdXNlcyBzb21lIHRyb3VibGUsIGJlY2F1c2UgYXQKKyAqIGVuZC1vZi1ETUEsIGJvdGggU0NTSSBpbnRzIGFyZSB0cmlnZ2VyZWQgc2ltdWx0YW5lb3VzbHksIHNvIHRoZSBOQ1IgaW50IGhhcworICogdG8gY2xlYXIgdGhlIERNQSBpbnQgcGVuZGluZyBiaXQgYmVmb3JlIGl0IGFsbG93cyBvdGhlciBsZXZlbCA2IGludGVycnVwdHMuCisgKi8KK3N0YXRpYyB2b2lkIHNjc2lfZG1hX2J1c2VyciAoaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKwl1bnNpZ25lZCBjaGFyCWRtYV9zdGF0ID0gdHRfc2NzaV9kbWEuZG1hX2N0cmw7CisKKwkvKiBEb24ndCBkbyBhbnl0aGluZyBpZiBhIE5DUiBpbnRlcnJ1cHQgaXMgcGVuZGluZy4gUHJvYmFibHkgaXQncyBqdXN0CisJICogbWFza2VkLi4uICovCisJaWYgKGF0YXJpX2lycV9wZW5kaW5nKCBJUlFfVFRfTUZQX1NDU0kgKSkKKwkJcmV0dXJuOworCQorCXByaW50aygiQmFkIFNDU0kgRE1BIGludGVycnVwdCEgZG1hX2FkZHI9MHglMDhseCBkbWFfc3RhdD0lMDJ4IGRtYV9jbnQ9JTA4bHhcbiIsCisJICAgICAgIFNDU0lfRE1BX1JFQURfUChkbWFfYWRkciksIGRtYV9zdGF0LCBTQ1NJX0RNQV9SRUFEX1AoZG1hX2NudCkpOworCWlmIChkbWFfc3RhdCAmIDB4ODApIHsKKwkJaWYgKCFzY3NpX2RtYV9pc19pZ25vcmVkX2J1c2VyciggZG1hX3N0YXQgKSkKKwkJCXByaW50ayggIlNDU0kgRE1BIGJ1cyBlcnJvciAtLSBiYWQgRE1BIHByb2dyYW1taW5nIVxuIiApOworCX0KKwllbHNlIHsKKwkJLyogVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMgd2UgbmV2ZXIgc2hvdWxkIGdldCB0byB0aGlzIHBvaW50LAorCQkgKiBzaW5jZSBib3RoIGludGVycnVwdHMgYXJlIHRyaWdnZXJlZCBzaW11bHRhbmVvdXNseSBhbmQgdGhlIDUzODAKKwkJICogaW50IGhhcyBoaWdoZXIgcHJpb3JpdHkuIFdoZW4gdGhpcyBpcnEgaXMgaGFuZGxlZCwgdGhhdCBETUEKKwkJICogaW50ZXJydXB0IGlzIGNsZWFyZWQuIFNvIGEgd2FybmluZyBtZXNzYWdlIGlzIHByaW50ZWQgaGVyZS4KKwkJICovCisJCXByaW50ayggIlNDU0kgRE1BIGludHIgPz8gLS0gdGhpcyBzaG91bGRuJ3QgaGFwcGVuIVxuIiApOworCX0KK30KKyNlbmRpZgorCisjZW5kaWYKKworCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NzaV90dF9pbnRyIChpbnQgaXJxLCB2b2lkICpkdW1teSwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworI2lmZGVmIFJFQUxfRE1BCisJaW50IGRtYV9zdGF0OworCisJZG1hX3N0YXQgPSB0dF9zY3NpX2RtYS5kbWFfY3RybDsKKworCUlOVF9QUklOVEsoInNjc2klZDogTkNSNTM4MCBpbnRlcnJ1cHQsIERNQSBzdGF0dXMgPSAlMDJ4XG4iLAorCQkgICBhdGFyaV9zY3NpX2hvc3QtPmhvc3Rfbm8sIGRtYV9zdGF0ICYgMHhmZik7CisKKwkvKiBMb29rIGlmIGl0IHdhcyB0aGUgRE1BIHRoYXQgaGFzIGludGVycnVwdGVkOiBGaXJzdCBwb3NzaWJpbGl0eQorCSAqIGlzIHRoYXQgYSBidXMgZXJyb3Igb2NjdXJyZWQuLi4KKwkgKi8KKwlpZiAoZG1hX3N0YXQgJiAweDgwKSB7CisJCWlmICghc2NzaV9kbWFfaXNfaWdub3JlZF9idXNlcnIoIGRtYV9zdGF0ICkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiU0NTSSBETUEgY2F1c2VkIGJ1cyBlcnJvciBuZWFyIDB4JTA4bHhcbiIsCisJCQkgICAgICAgU0NTSV9ETUFfUkVBRF9QKGRtYV9hZGRyKSk7CisJCQlwcmludGsoS0VSTl9DUklUICJTQ1NJIERNQSBidXMgZXJyb3IgLS0gYmFkIERNQSBwcm9ncmFtbWluZyEiKTsKKwkJfQorCX0KKworCS8qIElmIHRoZSBETUEgaXMgYWN0aXZlIGJ1dCBub3QgZmluaXNoZWQsIHdlIGhhdmUgdGhlIGNhc2UKKwkgKiB0aGF0IHNvbWUgb3RoZXIgNTM4MCBpbnRlcnJ1cHQgb2NjdXJyZWQgd2l0aGluIHRoZSBETUEgdHJhbnNmZXIuCisJICogVGhpcyBtZWFucyB3ZSBoYXZlIHJlc2lkdWFsIGJ5dGVzLCBpZiB0aGUgZGVzaXJlZCBlbmQgYWRkcmVzcworCSAqIGlzIG5vdCB5ZXQgcmVhY2hlZC4gTWF5YmUgd2UgaGF2ZSB0byBmZXRjaCBzb21lIGJ5dGVzIGZyb20gdGhlCisJICogcmVzdCBkYXRhIHJlZ2lzdGVyLCB0b28uIFRoZSByZXNpZHVhbCBtdXN0IGJlIGNhbGN1bGF0ZWQgZnJvbQorCSAqIHRoZSBhZGRyZXNzIHBvaW50ZXIsIG5vdCB0aGUgY291bnRlciByZWdpc3RlciwgYmVjYXVzZSBvbmx5IHRoZQorCSAqIGFkZHIgcmVnIGNvdW50cyBieXRlcyBub3QgeWV0IHdyaXR0ZW4gYW5kIHBlbmRpbmcgaW4gdGhlIHJlc3QKKwkgKiBkYXRhIHJlZyEKKwkgKi8KKwlpZiAoKGRtYV9zdGF0ICYgMHgwMikgJiYgIShkbWFfc3RhdCAmIDB4NDApKSB7CisJCWF0YXJpX2RtYV9yZXNpZHVhbCA9IEhPU1REQVRBX0RNQUxFTiAtIChTQ1NJX0RNQV9SRUFEX1AoIGRtYV9hZGRyICkgLQorCQkJCQkJCQkJCQkJYXRhcmlfZG1hX3N0YXJ0YWRkcik7CisKKwkJRE1BX1BSSU5USygiU0NTSSBETUE6IFRoZXJlIGFyZSAlbGQgcmVzaWR1YWwgYnl0ZXMuXG4iLAorCQkJICAgYXRhcmlfZG1hX3Jlc2lkdWFsKTsKKworCQlpZiAoKHNpZ25lZCBpbnQpYXRhcmlfZG1hX3Jlc2lkdWFsIDwgMCkKKwkJCWF0YXJpX2RtYV9yZXNpZHVhbCA9IDA7CisJCWlmICgoZG1hX3N0YXQgJiAxKSA9PSAwKSB7CisJCQkvKiBBZnRlciByZWFkIG9wZXJhdGlvbnMsIHdlIG1heWJlIGhhdmUgdG8KKwkJCSAgIHRyYW5zcG9ydCBzb21lIHJlc3QgYnl0ZXMgKi8KKwkJCWF0YXJpX3Njc2lfZmV0Y2hfcmVzdGJ5dGVzKCk7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBUaGVyZSBzZWVtcyB0byBiZSBhIG5hc3R5IGJ1ZyBpbiBzb21lIFNDU0ktRE1BL05DUgorCQkJICAgY29tYmluYXRpb25zOiBJZiBhIHRhcmdldCBkaXNjb25uZWN0cyB3aGlsZSBhIHdyaXRlCisJCQkgICBvcGVyYXRpb24gaXMgZ29pbmcgb24sIHRoZSBhZGRyZXNzIHJlZ2lzdGVyIG9mIHRoZQorCQkJICAgRE1BIG1heSBiZSBhIGZldyBieXRlcyBmYXJlciB0aGFuIGl0IGFjdHVhbGx5IHJlYWQuCisJCQkgICBUaGlzIGlzIHByb2JhYmx5IGR1ZSB0byBETUEgcHJlZmV0Y2hpbmcgYW5kIGEgZGVsYXkKKwkJCSAgIGJldHdlZW4gRE1BIGFuZCBOQ1IuICBFeHBlcmltZW50cyBzaG93ZWQgdGhhdCB0aGUKKwkJCSAgIGRtYV9hZGRyIGlzIDkgYnl0ZXMgdG8gaGlnaCwgYnV0IHRoaXMgY291bGQgdmFyeS4KKwkJCSAgIFRoZSBwcm9ibGVtIGlzLCB0aGF0IHRoZSByZXNpZHVhbCBpcyB0aHVzIGNhbGN1bGF0ZWQKKwkJCSAgIHdyb25nIGFuZCB0aGUgbmV4dCB0cmFuc2ZlciB3aWxsIHN0YXJ0IGJlaGluZCB3aGVyZQorCQkJICAgaXQgc2hvdWxkLiAgU28gd2Ugcm91bmQgdXAgdGhlIHJlc2lkdWFsIHRvIHRoZSBuZXh0CisJCQkgICBtdWx0aXBsZSBvZiBhIHNlY3RvciBzaXplLCBpZiBpdCBpc24ndCBhbHJlYWR5IGEKKwkJCSAgIG11bHRpcGxlIGFuZCB0aGUgb3JpZ2luYWxseSBleHBlY3RlZCB0cmFuc2ZlciBzaXplCisJCQkgICB3YXMuICBUaGUgbGF0dGVyIGNvbmRpdGlvbiBpcyB0aGVyZSB0byBlbnN1cmUgdGhhdAorCQkJICAgdGhlIGNvcnJlY3Rpb24gaXMgdGFrZW4gb25seSBmb3IgInJlYWwiIGRhdGEKKwkJCSAgIHRyYW5zZmVycyBhbmQgbm90IGZvciwgZS5nLiwgdGhlIHBhcmFtZXRlcnMgb2Ygc29tZQorCQkJICAgb3RoZXIgY29tbWFuZC4gIFRoZXNlIHNob3VsZG4ndCBkaXNjb25uZWN0IGFueXdheS4KKwkJCSAgICovCisJCQlpZiAoYXRhcmlfZG1hX3Jlc2lkdWFsICYgMHgxZmYpIHsKKwkJCQlETUFfUFJJTlRLKCJTQ1NJIERNQTogRE1BIGJ1ZyBjb3JyZWN0ZWQsICIKKwkJCQkJICAgImRpZmZlcmVuY2UgJWxkIGJ5dGVzXG4iLAorCQkJCQkgICA1MTIgLSAoYXRhcmlfZG1hX3Jlc2lkdWFsICYgMHgxZmYpKTsKKwkJCQlhdGFyaV9kbWFfcmVzaWR1YWwgPSAoYXRhcmlfZG1hX3Jlc2lkdWFsICsgNTExKSAmIH4weDFmZjsKKwkJCX0KKwkJfQorCQl0dF9zY3NpX2RtYS5kbWFfY3RybCA9IDA7CisJfQorCisJLyogSWYgdGhlIERNQSBpcyBmaW5pc2hlZCwgZmV0Y2ggdGhlIHJlc3QgYnl0ZXMgYW5kIHR1cm4gaXQgb2ZmICovCisJaWYgKGRtYV9zdGF0ICYgMHg0MCkgeworCQlhdGFyaV9kbWFfcmVzaWR1YWwgPSAwOworCQlpZiAoKGRtYV9zdGF0ICYgMSkgPT0gMCkKKwkJCWF0YXJpX3Njc2lfZmV0Y2hfcmVzdGJ5dGVzKCk7CisJCXR0X3Njc2lfZG1hLmRtYV9jdHJsID0gMDsKKwl9CisKKyNlbmRpZiAvKiBSRUFMX0RNQSAqLworCQorCU5DUjUzODBfaW50ciAoMCwgMCwgMCk7CisKKyNpZiAwCisJLyogVG8gYmUgc3VyZSB0aGUgaW50IGlzIG5vdCBtYXNrZWQgKi8KKwlhdGFyaV9lbmFibGVfaXJxKCBJUlFfVFRfTUZQX1NDU0kgKTsKKyNlbmRpZgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NzaV9mYWxjb25faW50ciAoaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKyNpZmRlZiBSRUFMX0RNQQorCWludCBkbWFfc3RhdDsKKworCS8qIFR1cm4gb2ZmIERNQSBhbmQgc2VsZWN0IHNlY3RvciBjb3VudGVyIHJlZ2lzdGVyIGJlZm9yZQorCSAqIGFjY2Vzc2luZyB0aGUgc3RhdHVzIHJlZ2lzdGVyIChBdGFyaSByZWNvbW1lbmRhdGlvbiEpCisJICovCisJc3RfZG1hLmRtYV9tb2RlX3N0YXR1cyA9IDB4OTA7CisJZG1hX3N0YXQgPSBzdF9kbWEuZG1hX21vZGVfc3RhdHVzOworCisJLyogQml0IDAgaW5kaWNhdGVzIHNvbWUgZXJyb3IgaW4gdGhlIERNQSBwcm9jZXNzLi4uIGRvbid0IGtub3cKKwkgKiB3aGF0IGhhcHBlbmVkIGV4YWN0bHkgKG5vIGZ1cnRoZXIgZG9jdSkuCisJICovCisJaWYgKCEoZG1hX3N0YXQgJiAweDAxKSkgeworCQkvKiBETUEgZXJyb3IgKi8KKwkJcHJpbnRrKEtFUk5fQ1JJVCAiU0NTSSBETUEgZXJyb3IgbmVhciAweCUwOGx4IVxuIiwgU0NTSV9ETUFfR0VUQURSKCkpOworCX0KKworCS8qIElmIHRoZSBETUEgd2FzIGFjdGl2ZSwgYnV0IG5vdyBiaXQgMSBpcyBub3QgY2xlYXIsIGl0IGlzIHNvbWUKKwkgKiBvdGhlciA1MzgwIGludGVycnVwdCB0aGF0IGZpbmlzaGVzIHRoZSBETUEgdHJhbnNmZXIuIFdlIGhhdmUgdG8KKwkgKiBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiByZXNpZHVhbCBieXRlcyBhbmQgZ2l2ZSBhIHdhcm5pbmcgaWYKKwkgKiBieXRlcyBhcmUgc3R1Y2sgaW4gdGhlIFNULURNQSBmaWZvICh0aGVyZSdzIG5vIHdheSB0byByZWFjaCB0aGVtISkKKwkgKi8KKwlpZiAoYXRhcmlfZG1hX2FjdGl2ZSAmJiAoZG1hX3N0YXQgJiAweDAyKSkgeworCQl1bnNpZ25lZCBsb25nCXRyYW5zZmVycmVkOworCisJCXRyYW5zZmVycmVkID0gU0NTSV9ETUFfR0VUQURSKCkgLSBhdGFyaV9kbWFfc3RhcnRhZGRyOworCQkvKiBUaGUgU1QtRE1BIGFkZHJlc3MgaXMgaW5jcmVtZW50ZWQgaW4gMi1ieXRlIHN0ZXBzLCBidXQgdGhlCisJCSAqIGRhdGEgYXJlIHdyaXR0ZW4gb25seSBpbiAxNi1ieXRlIGNodW5rcy4gSWYgdGhlIG51bWJlciBvZgorCQkgKiB0cmFuc2ZlcnJlZCBieXRlcyBpcyBub3QgZGl2aXNpYmxlIGJ5IDE2LCB0aGUgcmVtYWluZGVyIGlzCisJCSAqIGxvc3Qgc29tZXdoZXJlIGluIG91dGVyIHNwYWNlLgorCQkgKi8KKwkJaWYgKHRyYW5zZmVycmVkICYgMTUpCisJCQlwcmludGsoS0VSTl9FUlIgIlNDU0kgRE1BIGVycm9yOiAlbGQgYnl0ZXMgbG9zdCBpbiAiCisJCQkgICAgICAgIlNULURNQSBmaWZvXG4iLCB0cmFuc2ZlcnJlZCAmIDE1KTsKKworCQlhdGFyaV9kbWFfcmVzaWR1YWwgPSBIT1NUREFUQV9ETUFMRU4gLSB0cmFuc2ZlcnJlZDsKKwkJRE1BX1BSSU5USygiU0NTSSBETUE6IFRoZXJlIGFyZSAlbGQgcmVzaWR1YWwgYnl0ZXMuXG4iLAorCQkJICAgYXRhcmlfZG1hX3Jlc2lkdWFsKTsKKwl9CisJZWxzZQorCQlhdGFyaV9kbWFfcmVzaWR1YWwgPSAwOworCWF0YXJpX2RtYV9hY3RpdmUgPSAwOworCisJaWYgKGF0YXJpX2RtYV9vcmlnX2FkZHIpIHsKKwkJLyogSWYgdGhlIGRyaWJibGUgYnVmZmVyIHdhcyB1c2VkIG9uIGEgcmVhZCBvcGVyYXRpb24sIGNvcHkgdGhlIERNQS1lZAorCQkgKiBkYXRhIHRvIHRoZSBvcmlnaW5hbCBkZXN0aW5hdGlvbiBhZGRyZXNzLgorCQkgKi8KKwkJbWVtY3B5KGF0YXJpX2RtYV9vcmlnX2FkZHIsIHBoeXNfdG9fdmlydChhdGFyaV9kbWFfc3RhcnRhZGRyKSwKKwkJICAgICAgIEhPU1REQVRBX0RNQUxFTiAtIGF0YXJpX2RtYV9yZXNpZHVhbCk7CisJCWF0YXJpX2RtYV9vcmlnX2FkZHIgPSBOVUxMOworCX0KKworI2VuZGlmIC8qIFJFQUxfRE1BICovCisKKwlOQ1I1MzgwX2ludHIgKDAsIDAsIDApOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisjaWZkZWYgUkVBTF9ETUEKK3N0YXRpYyB2b2lkIGF0YXJpX3Njc2lfZmV0Y2hfcmVzdGJ5dGVzKCB2b2lkICkKK3sKKwlpbnQgbnI7CisJY2hhciAqc3JjLCAqZHN0OworCXVuc2lnbmVkIGxvbmcgcGh5c19kc3Q7CisKKwkvKiBmZXRjaCByZXN0IGJ5dGVzIGluIHRoZSBETUEgcmVnaXN0ZXIgKi8KKwlwaHlzX2RzdCA9IFNDU0lfRE1BX1JFQURfUChkbWFfYWRkcik7CisJbnIgPSBwaHlzX2RzdCAmIDM7CisJaWYgKG5yKSB7CisJCS8qIHRoZXJlIGFyZSAnbnInIGJ5dGVzIGxlZnQgZm9yIHRoZSBsYXN0IGxvbmcgYWRkcmVzcworCQkgICBiZWZvcmUgdGhlIERNQSBwb2ludGVyICovCisJCXBoeXNfZHN0IF49IG5yOworCQlETUFfUFJJTlRLKCJTQ1NJIERNQTogdGhlcmUgYXJlICVkIHJlc3QgYnl0ZXMgZm9yIHBoeXMgYWRkciAweCUwOGx4IiwKKwkJCSAgIG5yLCBwaHlzX2RzdCk7CisJCS8qIFRoZSBjb250ZW50IG9mIHRoZSBETUEgcG9pbnRlciBpcyBhIHBoeXNpY2FsIGFkZHJlc3MhICAqLworCQlkc3QgPSBwaHlzX3RvX3ZpcnQocGh5c19kc3QpOworCQlETUFfUFJJTlRLKCIgPSB2aXJ0IGFkZHIgJXBcbiIsIGRzdCk7CisJCWZvciAoc3JjID0gKGNoYXIgKikmdHRfc2NzaV9kbWEuZG1hX3Jlc3RkYXRhOyBuciAhPSAwOyAtLW5yKQorCQkJKmRzdCsrID0gKnNyYysrOworCX0KK30KKyNlbmRpZiAvKiBSRUFMX0RNQSAqLworCisKK3N0YXRpYyBpbnQgZmFsY29uX2dvdF9sb2NrID0gMDsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChmYWxjb25fZmFpcm5lc3Nfd2FpdCk7CitzdGF0aWMgaW50IGZhbGNvbl90cnlpbmdfbG9jayA9IDA7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoZmFsY29uX3RyeV93YWl0KTsKK3N0YXRpYyBpbnQgZmFsY29uX2RvbnRfcmVsZWFzZSA9IDA7CisKKy8qIFRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgdGhlIGxvY2sgb24gdGhlIERNQSBjaGlwIGlmIHRoZXJlIGlzIG5vCisgKiBjb25uZWN0ZWQgY29tbWFuZCBhbmQgdGhlIGRpc2Nvbm5lY3RlZCBxdWV1ZSBpcyBlbXB0eS4gT24KKyAqIHJlbGVhc2luZywgaW5zdGFuY2VzIG9mIGZhbGNvbl9nZXRfbG9jayBhcmUgYXdva2VuLCB0aGF0IHB1dAorICogdGhlbXNlbHZlcyB0byBzbGVlcCBmb3IgZmFpcm5lc3MuIFRoZXkgY2FuIG5vdyB0cnkgdG8gZ2V0IHRoZSBsb2NrCisgKiBhZ2FpbiAoYnV0IG90aGVycyB3YWl0aW5nIGxvbmdlciBtb3JlIHByb2JhYmx5IHdpbGwgd2luKS4KKyAqLworCitzdGF0aWMgdm9pZAorZmFsY29uX3JlbGVhc2VfbG9ja19pZl9wb3NzaWJsZSggc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKiBob3N0ZGF0YSApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCisJaWYgKElTX0FfVFQoKSkgcmV0dXJuOworCQorCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlmIChmYWxjb25fZ290X2xvY2sgJiYKKwkJIWhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUgJiYKKwkJIWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSAmJgorCQkhaG9zdGRhdGEtPmNvbm5lY3RlZCkgeworCisJCWlmIChmYWxjb25fZG9udF9yZWxlYXNlKSB7CisjaWYgMAorCQkJcHJpbnRrKCJXQVJOSU5HOiBMb2NrIHJlbGVhc2Ugbm90IGFsbG93ZWQuIElnbm9yZWRcbiIpOworI2VuZGlmCisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwkJZmFsY29uX2dvdF9sb2NrID0gMDsKKwkJc3RkbWFfcmVsZWFzZSgpOworCQl3YWtlX3VwKCAmZmFsY29uX2ZhaXJuZXNzX3dhaXQgKTsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gbWFuYWdlcyB0aGUgbG9ja2luZyBvZiB0aGUgU1QtRE1BLgorICogSWYgdGhlIERNQSBpc24ndCBsb2NrZWQgYWxyZWFkeSBmb3IgU0NTSSwgaXQgdHJpZXMgdG8gbG9jayBpdCBieQorICogY2FsbGluZyBzdGRtYV9sb2NrKCkuIEJ1dCBpZiB0aGUgRE1BIGlzIGxvY2tlZCBieSB0aGUgU0NTSSBjb2RlIGFuZAorICogdGhlcmUgYXJlIG90aGVyIGRyaXZlcnMgd2FpdGluZyBmb3IgdGhlIGNoaXAsIHdlIGRvIG5vdCBpc3N1ZSB0aGUKKyAqIGNvbW1hbmQgaW1tZWRpYXRlbHkgYnV0IHdhaXQgb24gJ2ZhbGNvbl9mYWlybmVzc19xdWV1ZScuIFdlIHdpbGwgYmUKKyAqIHdha2VkIHVwIHdoZW4gdGhlIERNQSBpcyB1bmxvY2tlZCBieSBzb21lIFNDU0kgaW50ZXJydXB0LiBBZnRlciB0aGF0CisgKiB3ZSB0cnkgdG8gZ2V0IHRoZSBsb2NrIGFnYWluLgorICogQnV0IHdlIG11c3QgYmUgcHJlcGFyZWQgdGhhdCBtb3JlIHRoYW4gb25lIGluc3RhbmNlIG9mCisgKiBmYWxjb25fZ2V0X2xvY2soKSBpcyB3YWl0aW5nIG9uIHRoZSBmYWlybmVzcyBxdWV1ZS4gVGhleSBzaG91bGQgbm90CisgKiB0cnkgYWxsIGF0IG9uY2UgdG8gY2FsbCBzdGRtYV9sb2NrKCksIG9uZSBpcyBlbm91Z2ghIEZvciB0aGF0LCB0aGUKKyAqIGZpcnN0IG9uZSBzZXRzICdmYWxjb25fdHJ5aW5nX2xvY2snLCBvdGhlcnMgdGhhdCBzZWUgdGhhdCB2YXJpYWJsZQorICogc2V0IHdhaXQgb24gdGhlIHF1ZXVlICdmYWxjb25fdHJ5X3dhaXQnLgorICogQ29tcGxpY2F0ZWQsIGNvbXBsaWNhdGVkLi4uLiBTaWdoLi4uCisgKi8KKworc3RhdGljIHZvaWQgZmFsY29uX2dldF9sb2NrKCB2b2lkICkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKElTX0FfVFQoKSkgcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJd2hpbGUoICFpbl9pbnRlcnJ1cHQoKSAmJiBmYWxjb25fZ290X2xvY2sgJiYgc3RkbWFfb3RoZXJzX3dhaXRpbmcoKSApCisJCXNsZWVwX29uKCAmZmFsY29uX2ZhaXJuZXNzX3dhaXQgKTsKKworCXdoaWxlICghZmFsY29uX2dvdF9sb2NrKSB7CisJCWlmIChpbl9pbnRlcnJ1cHQoKSkKKwkJCXBhbmljKCAiRmFsY29uIFNDU0kgaGFzbid0IFNULURNQSBsb2NrIGluIGludGVycnVwdCIgKTsKKwkJaWYgKCFmYWxjb25fdHJ5aW5nX2xvY2spIHsKKwkJCWZhbGNvbl90cnlpbmdfbG9jayA9IDE7CisJCQlzdGRtYV9sb2NrKHNjc2lfZmFsY29uX2ludHIsIE5VTEwpOworCQkJZmFsY29uX2dvdF9sb2NrID0gMTsKKwkJCWZhbGNvbl90cnlpbmdfbG9jayA9IDA7CisJCQl3YWtlX3VwKCAmZmFsY29uX3RyeV93YWl0ICk7CisJCX0KKwkJZWxzZSB7CisJCQlzbGVlcF9vbiggJmZhbGNvbl90cnlfd2FpdCApOworCQl9CisJfQkKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlpZiAoIWZhbGNvbl9nb3RfbG9jaykKKwkJcGFuaWMoIkZhbGNvbiBTQ1NJOiBzb21lb25lIHN0b2xlIHRoZSBsb2NrIDotKFxuIik7Cit9CisKKworLyogVGhpcyBpcyB0aGUgd3JhcHBlciBmdW5jdGlvbiBmb3IgTkNSNTM4MF9xdWV1ZV9jb21tYW5kKCkuIEl0IGp1c3QKKyAqIHRyaWVzIHRvIGdldCB0aGUgbG9jayBvbiB0aGUgU1QtRE1BIChzZWUgYWJvdmUpIGFuZCB0aGVuIGNhbGxzIHRoZQorICogb3JpZ2luYWwgZnVuY3Rpb24uCisgKi8KKworI2lmIDAKK2ludCBhdGFyaV9xdWV1ZV9jb21tYW5kIChTY3NpX0NtbmQgKmNtZCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKK3sKKwkvKiBmYWxjb25fZ2V0X2xvY2soKTsKKwkgKiArK2d1ZW50aGVyOiBtb3ZlZCB0byBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQoKSB0byBwcmV2ZW50CisJICogcmFjZSBjb25kaXRpb24sIHNlZSB0aGVyZSBmb3IgYW4gZXhwbGFuYXRpb24uCisJICovCisJcmV0dXJuKCBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQoIGNtZCwgZG9uZSApICk7Cit9CisjZW5kaWYKKworCitpbnQgYXRhcmlfc2NzaV9kZXRlY3QgKFNjc2lfSG9zdF9UZW1wbGF0ZSAqaG9zdCkKK3sKKwlzdGF0aWMgaW50IGNhbGxlZCA9IDA7CisJc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7CisKKwlpZiAoIU1BQ0hfSVNfQVRBUkkgfHwKKwkgICAgKCFBVEFSSUhXX1BSRVNFTlQoU1RfU0NTSSkgJiYgIUFUQVJJSFdfUFJFU0VOVChUVF9TQ1NJKSkgfHwKKwkgICAgY2FsbGVkKQorCQlyZXR1cm4oIDAgKTsKKworCWhvc3QtPnByb2NfbmFtZSA9ICJBdGFyaSI7CisKKwlhdGFyaV9zY3NpX3JlZ19yZWFkICA9IElTX0FfVFQoKSA/IGF0YXJpX3Njc2lfdHRfcmVnX3JlYWQgOgorCQkJCQkgICBhdGFyaV9zY3NpX2ZhbGNvbl9yZWdfcmVhZDsKKwlhdGFyaV9zY3NpX3JlZ193cml0ZSA9IElTX0FfVFQoKSA/IGF0YXJpX3Njc2lfdHRfcmVnX3dyaXRlIDoKKwkJCQkJICAgYXRhcmlfc2NzaV9mYWxjb25fcmVnX3dyaXRlOworCisJLyogc2V0dXAgdmFyaWFibGVzICovCisJaG9zdC0+Y2FuX3F1ZXVlID0KKwkJKHNldHVwX2Nhbl9xdWV1ZSA+IDApID8gc2V0dXBfY2FuX3F1ZXVlIDoKKwkJSVNfQV9UVCgpID8gQVRBUklfVFRfQ0FOX1FVRVVFIDogQVRBUklfRkFMQ09OX0NBTl9RVUVVRTsKKwlob3N0LT5jbWRfcGVyX2x1biA9CisJCShzZXR1cF9jbWRfcGVyX2x1biA+IDApID8gc2V0dXBfY21kX3Blcl9sdW4gOgorCQlJU19BX1RUKCkgPyBBVEFSSV9UVF9DTURfUEVSX0xVTiA6IEFUQVJJX0ZBTENPTl9DTURfUEVSX0xVTjsKKwkvKiBGb3JjZSBzZ190YWJsZXNpemUgdG8gMCBvbiBhIEZhbGNvbiEgKi8KKwlob3N0LT5zZ190YWJsZXNpemUgPQorCQkhSVNfQV9UVCgpID8gQVRBUklfRkFMQ09OX1NHX1RBQkxFU0laRSA6CisJCShzZXR1cF9zZ190YWJsZXNpemUgPj0gMCkgPyBzZXR1cF9zZ190YWJsZXNpemUgOiBBVEFSSV9UVF9TR19UQUJMRVNJWkU7CisKKwlpZiAoc2V0dXBfaG9zdGlkID49IDApCisJCWhvc3QtPnRoaXNfaWQgPSBzZXR1cF9ob3N0aWQ7CisJZWxzZSB7CisJCS8qIHVzZSA3IGFzIGRlZmF1bHQgKi8KKwkJaG9zdC0+dGhpc19pZCA9IDc7CisJCS8qIFRlc3QgaWYgYSBob3N0IGlkIGlzIHNldCBpbiB0aGUgTlZSYW0gKi8KKwkJaWYgKEFUQVJJSFdfUFJFU0VOVChUVF9DTEspICYmIG52cmFtX2NoZWNrX2NoZWNrc3VtKCkpIHsKKwkJCXVuc2lnbmVkIGNoYXIgYiA9IG52cmFtX3JlYWRfYnl0ZSggMTQgKTsKKwkJCS8qIEFyYml0cmF0aW9uIGVuYWJsZWQ/IChmb3IgVE9TKSBJZiB5ZXMsIHVzZSBjb25maWd1cmVkIGhvc3QgSUQgKi8KKwkJCWlmIChiICYgMHg4MCkKKwkJCQlob3N0LT50aGlzX2lkID0gYiAmIDc7CisJCX0KKwl9CisKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKwlpZiAoc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nIDwgMCkKKwkJc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nID0gREVGQVVMVF9VU0VfVEFHR0VEX1FVRVVJTkc7CisjZW5kaWYKKyNpZmRlZiBSRUFMX0RNQQorCS8qIElmIHJ1bm5pbmcgb24gYSBGYWxjb24gYW5kIGlmIHRoZXJlJ3MgVFQtUmFtIChpLmUuLCBtb3JlIHRoYW4gb25lCisJICogbWVtb3J5IGJsb2NrLCBzaW5jZSB0aGVyZSdzIGFsd2F5cyBTVC1SYW0gaW4gYSBGYWxjb24pLCB0aGVuIGFsbG9jYXRlIGEKKwkgKiBTVFJBTV9CVUZGRVJfU0laRSBieXRlIGRyaWJibGUgYnVmZmVyIGZvciB0cmFuc2ZlcnMgZnJvbS90byBhbHRlcm5hdGl2ZQorCSAqIFJhbS4KKwkgKi8KKwlpZiAoTUFDSF9JU19BVEFSSSAmJiBBVEFSSUhXX1BSRVNFTlQoU1RfU0NTSSkgJiYKKwkgICAgIUFUQVJJSFdfUFJFU0VOVChFWFREX0RNQSkgJiYgbTY4a19udW1fbWVtb3J5ID4gMSkgeworCQlhdGFyaV9kbWFfYnVmZmVyID0gYXRhcmlfc3RyYW1fYWxsb2MoU1RSQU1fQlVGRkVSX1NJWkUsICJTQ1NJIik7CisJCWlmICghYXRhcmlfZG1hX2J1ZmZlcikgeworCQkJcHJpbnRrKCBLRVJOX0VSUiAiYXRhcmlfc2NzaV9kZXRlY3Q6IGNhbid0IGFsbG9jYXRlIFNULVJBTSAiCisJCQkJCSJkb3VibGUgYnVmZmVyXG4iICk7CisJCQlyZXR1cm4oIDAgKTsKKwkJfQorCQlhdGFyaV9kbWFfcGh5c19idWZmZXIgPSB2aXJ0X3RvX3BoeXMoIGF0YXJpX2RtYV9idWZmZXIgKTsKKwkJYXRhcmlfZG1hX29yaWdfYWRkciA9IDA7CisJfQorI2VuZGlmCisJaW5zdGFuY2UgPSBzY3NpX3JlZ2lzdGVyIChob3N0LCBzaXplb2YgKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhKSk7CisJaWYoaW5zdGFuY2UgPT0gTlVMTCkKKwl7CisJCWF0YXJpX3N0cmFtX2ZyZWUoYXRhcmlfZG1hX2J1ZmZlcik7CisJCWF0YXJpX2RtYV9idWZmZXIgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJYXRhcmlfc2NzaV9ob3N0ID0gaW5zdGFuY2U7CisgICAgICAgLyogU2V0IGlycSB0byAwLCB0byBhdm9pZCB0aGF0IHRoZSBtaWQtbGV2ZWwgY29kZSBkaXNhYmxlcyBvdXIgaW50ZXJydXB0CisgICAgICAgICogZHVyaW5nIHF1ZXVlX2NvbW1hbmQgY2FsbHMuIFRoaXMgaXMgY29tcGxldGVseSB1bm5lY2Vzc2FyeSwgYW5kIGV2ZW4KKyAgICAgICAgKiB3b3JzZSBjYXVzZXMgYmFkIHByb2JsZW1zIG9uIHRoZSBGYWxjb24sIHdoZXJlIHRoZSBpbnQgaXMgc2hhcmVkIHdpdGgKKyAgICAgICAgKiBJREUgYW5kIGZsb3BweSEgKi8KKyAgICAgICBpbnN0YW5jZS0+aXJxID0gMDsKKworI2lmZGVmIENPTkZJR19BVEFSSV9TQ1NJX1JFU0VUX0JPT1QKKwlhdGFyaV9zY3NpX3Jlc2V0X2Jvb3QoKTsKKyNlbmRpZgorCU5DUjUzODBfaW5pdCAoaW5zdGFuY2UsIDApOworCisJaWYgKElTX0FfVFQoKSkgeworCisJCS8qIFRoaXMgaW50IGlzIGFjdHVhbGx5ICJwc2V1ZG8tc2xvdyIsIGkuZS4gaXQgYWN0cyBsaWtlIGEgc2xvdworCQkgKiBpbnRlcnJ1cHQgYWZ0ZXIgaGF2aW5nIGNsZWFyZWQgdGhlIHBlbmRpbmcgZmxhZyBmb3IgdGhlIERNQQorCQkgKiBpbnRlcnJ1cHQuICovCisJCWlmIChyZXF1ZXN0X2lycShJUlFfVFRfTUZQX1NDU0ksIHNjc2lfdHRfaW50ciwgSVJRX1RZUEVfU0xPVywKKwkJCQkgIlNDU0kgTkNSNTM4MCIsIHNjc2lfdHRfaW50cikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYXRhcmlfc2NzaV9kZXRlY3Q6IGNhbm5vdCBhbGxvY2F0ZSBpcnEgJWQsIGFib3J0aW5nIixJUlFfVFRfTUZQX1NDU0kpOworCQkJc2NzaV91bnJlZ2lzdGVyKGF0YXJpX3Njc2lfaG9zdCk7CisJCQlhdGFyaV9zdHJhbV9mcmVlKGF0YXJpX2RtYV9idWZmZXIpOworCQkJYXRhcmlfZG1hX2J1ZmZlciA9IDA7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl0dF9tZnAuYWN0aXZlX2VkZ2UgfD0gMHg4MDsJCS8qIFNDU0kgaW50IG9uIEwtPkggKi8KKyNpZmRlZiBSRUFMX0RNQQorCQl0dF9zY3NpX2RtYS5kbWFfY3RybCA9IDA7CisJCWF0YXJpX2RtYV9yZXNpZHVhbCA9IDA7CisjaWZkZWYgQ09ORklHX1RUX0RNQV9FTVVMCisJCWlmIChNQUNIX0lTX0hBREVTKSB7CisJCQlpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fMiwgaGFkZXNfZG1hX2VtdWxhdG9yLAorCQkJCQkgSVJRX1RZUEVfUFJJTywgIkhhZGVzIERNQSBlbXVsYXRvciIsCisJCQkJCSBoYWRlc19kbWFfZW11bGF0b3IpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJhdGFyaV9zY3NpX2RldGVjdDogY2Fubm90IGFsbG9jYXRlIGlycSAlZCwgYWJvcnRpbmcgKE1BQ0hfSVNfSEFERVMpIixJUlFfQVVUT18yKTsKKwkJCQlmcmVlX2lycShJUlFfVFRfTUZQX1NDU0ksIHNjc2lfdHRfaW50cik7CisJCQkJc2NzaV91bnJlZ2lzdGVyKGF0YXJpX3Njc2lfaG9zdCk7CisJCQkJYXRhcmlfc3RyYW1fZnJlZShhdGFyaV9kbWFfYnVmZmVyKTsKKwkJCQlhdGFyaV9kbWFfYnVmZmVyID0gMDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWlmIChNQUNIX0lTX01FRFVTQSB8fCBNQUNIX0lTX0hBREVTKSB7CisJCQkvKiBXaGlsZSB0aGUgcmVhZCBvdmVycnVucyAoZGVzY3JpYmVkIGJ5IERyZXcgRWNraGFyZHQgaW4KKwkJCSAqIE5DUjUzODAuYykgbmV2ZXIgaGFwcGVuZWQgb24gVFRzLCB0aGV5IGRvIGluIGZhY3Qgb24gdGhlIE1lZHVzYQorCQkJICogKFRoaXMgd2FzIHRoZSBjYXVzZSB3aHkgU0NTSSBkaWRuJ3Qgd29yayByaWdodCBmb3Igc28gbG9uZworCQkJICogdGhlcmUuKSBTaW5jZSBoYW5kbGluZyB0aGUgb3ZlcnJ1bnMgc2xvd3MgZG93biBhIGJpdCwgSSB0dXJuZWQKKwkJCSAqIHRoZSAjaWZkZWYncyBpbnRvIGEgcnVudGltZSBjb25kaXRpb24uCisJCQkgKgorCQkJICogSW4gcHJpbmNpcGxlIGl0IHNob3VsZCBiZSBzdWZmaWNpZW50IHRvIGRvIG1heC4gMSBieXRlIHdpdGgKKwkJCSAqIFBJTywgYnV0IHRoZXJlIGlzIGFub3RoZXIgcHJvYmxlbSBvbiB0aGUgTWVkdXNhIHdpdGggdGhlIERNQQorCQkJICogcmVzdCBkYXRhIHJlZ2lzdGVyLiBTbyAnYXRhcmlfcmVhZF9vdmVycnVucycgaXMgY3VycmVudGx5IHNldAorCQkJICogdG8gNCB0byBhdm9pZCBoYXZpbmcgdHJhbnNmZXJzIHRoYXQgYXJlbid0IGEgbXVsdGlwbGUgb2YgNC4gSWYKKwkJCSAqIHRoZSByZXN0IGRhdGEgYnVnIGlzIGZpeGVkLCB0aGlzIGNhbiBiZSBsb3dlcmVkIHRvIDEuCisJCQkgKi8KKwkJCWF0YXJpX3JlYWRfb3ZlcnJ1bnMgPSA0OworCQl9CQkKKyNlbmRpZiAvKlJFQUxfRE1BKi8KKwl9CisJZWxzZSB7IC8qICEgSVNfQV9UVCAqLworCQkKKwkJLyogTm90aGluZyB0byBkbyBmb3IgdGhlIGludGVycnVwdDogdGhlIFNULURNQSBpcyBpbml0aWFsaXplZAorCQkgKiBhbHJlYWR5IGJ5IGF0YXJpX2luaXRfSU5UUygpCisJCSAqLworCisjaWZkZWYgUkVBTF9ETUEKKwkJYXRhcmlfZG1hX3Jlc2lkdWFsID0gMDsKKwkJYXRhcmlfZG1hX2FjdGl2ZSA9IDA7CisJCWF0YXJpX2RtYV9zdHJhbV9tYXNrID0gKEFUQVJJSFdfUFJFU0VOVChFWFREX0RNQSkgPyAweDAwMDAwMDAwCisJCQkJCTogMHhmZjAwMDAwMCk7CisjZW5kaWYKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJzY3NpJWQ6IG9wdGlvbnMgQ0FOX1FVRVVFPSVkIENNRF9QRVJfTFVOPSVkIFNDQVQtR0FUPSVkICIKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKwkJCSJUQUdHRUQtUVVFVUlORz0lcyAiCisjZW5kaWYKKwkJCSJIT1NUSUQ9JWQiLAorCQkJaW5zdGFuY2UtPmhvc3Rfbm8sIGluc3RhbmNlLT5ob3N0dC0+Y2FuX3F1ZXVlLAorCQkJaW5zdGFuY2UtPmhvc3R0LT5jbWRfcGVyX2x1biwKKwkJCWluc3RhbmNlLT5ob3N0dC0+c2dfdGFibGVzaXplLAorI2lmZGVmIFNVUFBPUlRfVEFHUworCQkJc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nID8gInllcyIgOiAibm8iLAorI2VuZGlmCisJCQlpbnN0YW5jZS0+aG9zdHQtPnRoaXNfaWQgKTsKKwlOQ1I1MzgwX3ByaW50X29wdGlvbnMgKGluc3RhbmNlKTsKKwlwcmludGsgKCJcbiIpOworCisJY2FsbGVkID0gMTsKKwlyZXR1cm4oIDEgKTsKK30KKworI2lmZGVmIE1PRFVMRQoraW50IGF0YXJpX3Njc2lfcmVsZWFzZSAoc3RydWN0IFNjc2lfSG9zdCAqc2gpCit7CisJaWYgKElTX0FfVFQoKSkKKwkJZnJlZV9pcnEoSVJRX1RUX01GUF9TQ1NJLCBzY3NpX3R0X2ludHIpOworCWlmIChhdGFyaV9kbWFfYnVmZmVyKQorCQlhdGFyaV9zdHJhbV9mcmVlIChhdGFyaV9kbWFfYnVmZmVyKTsKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCit2b2lkIF9faW5pdCBhdGFyaV9zY3NpX3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKQoreworCS8qIEZvcm1hdCBvZiBhdGFzY3NpIHBhcmFtZXRlciBpczoKKwkgKiAgIGF0YXNjc2k9PGNhbl9xdWV1ZT4sPGNtZF9wZXJfbHVuPiw8c2dfdGFibGVzaXplPiw8aG9zdGlkPiw8dXNlX3RhZ3M+CisJICogRGVmYXVsdHMgZGVwZW5kIG9uIFRUIG9yIEZhbGNvbiwgaG9zdGlkIGRldGVybWluZWQgYXQgcnVuIHRpbWUuCisJICogTmVnYXRpdmUgdmFsdWVzIG1lYW4gZG9uJ3QgY2hhbmdlLgorCSAqLworCQorCWlmIChpbnRzWzBdIDwgMSkgeworCQlwcmludGsoICJhdGFyaV9zY3NpX3NldHVwOiBubyBhcmd1bWVudHMhXG4iICk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW50c1swXSA+PSAxKSB7CisJCWlmIChpbnRzWzFdID4gMCkKKwkJCS8qIG5vIGxpbWl0cyBvbiB0aGlzLCBqdXN0ID4gMCAqLworCQkJc2V0dXBfY2FuX3F1ZXVlID0gaW50c1sxXTsKKwl9CisJaWYgKGludHNbMF0gPj0gMikgeworCQlpZiAoaW50c1syXSA+IDApCisJCQlzZXR1cF9jbWRfcGVyX2x1biA9IGludHNbMl07CisJfQorCWlmIChpbnRzWzBdID49IDMpIHsKKwkJaWYgKGludHNbM10gPj0gMCkgeworCQkJc2V0dXBfc2dfdGFibGVzaXplID0gaW50c1szXTsKKwkJCS8qIE11c3QgYmUgPD0gU0dfQUxMICgyNTUpICovCisJCQlpZiAoc2V0dXBfc2dfdGFibGVzaXplID4gU0dfQUxMKQorCQkJCXNldHVwX3NnX3RhYmxlc2l6ZSA9IFNHX0FMTDsKKwkJfQorCX0KKwlpZiAoaW50c1swXSA+PSA0KSB7CisJCS8qIE11c3QgYmUgYmV0d2VlbiAwIGFuZCA3ICovCisJCWlmIChpbnRzWzRdID49IDAgJiYgaW50c1s0XSA8PSA3KQorCQkJc2V0dXBfaG9zdGlkID0gaW50c1s0XTsKKwkJZWxzZSBpZiAoaW50c1s0XSA+IDcpCisJCQlwcmludGsoICJhdGFyaV9zY3NpX3NldHVwOiBpbnZhbGlkIGhvc3QgSUQgJWQgIVxuIiwgaW50c1s0XSApOworCX0KKyNpZmRlZiBTVVBQT1JUX1RBR1MKKwlpZiAoaW50c1swXSA+PSA1KSB7CisJCWlmIChpbnRzWzVdID49IDApCisJCQlzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcgPSAhIWludHNbNV07CisJfQorI2VuZGlmCit9CisKK2ludCBhdGFyaV9zY3NpX2J1c19yZXNldChTY3NpX0NtbmQgKmNtZCkKK3sKKwlpbnQJCXJ2OworCXN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSA9CisJCShzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCS8qIEZvciBkb2luZyB0aGUgcmVzZXQsIFNDU0kgaW50ZXJydXB0cyBtdXN0IGJlIGRpc2FibGVkIGZpcnN0LAorCSAqIHNpbmNlIHRoZSA1MzgwIHJhaXNlcyBpdHMgSVJRIGxpbmUgd2hpbGUgX1JTVCBpcyBhY3RpdmUgYW5kIHdlCisJICogY2FuJ3QgZGlzYWJsZSBpbnRlcnJ1cHRzIGNvbXBsZXRlbHksIHNpbmNlIHdlIG5lZWQgdGhlIHRpbWVyLgorCSAqLworCS8qIEFuZCBhYm9ydCBhIG1heWJlIGFjdGl2ZSBETUEgdHJhbnNmZXIgKi8KKwlpZiAoSVNfQV9UVCgpKSB7CisJCWF0YXJpX3R1cm5vZmZfaXJxKCBJUlFfVFRfTUZQX1NDU0kgKTsKKyNpZmRlZiBSRUFMX0RNQQorCQl0dF9zY3NpX2RtYS5kbWFfY3RybCA9IDA7CisjZW5kaWYgLyogUkVBTF9ETUEgKi8KKwl9CisJZWxzZSB7CisJCWF0YXJpX3R1cm5vZmZfaXJxKCBJUlFfTUZQX0ZTQ1NJICk7CisjaWZkZWYgUkVBTF9ETUEKKwkJc3RfZG1hLmRtYV9tb2RlX3N0YXR1cyA9IDB4OTA7CisJCWF0YXJpX2RtYV9hY3RpdmUgPSAwOworCQlhdGFyaV9kbWFfb3JpZ19hZGRyID0gTlVMTDsKKyNlbmRpZiAvKiBSRUFMX0RNQSAqLworCX0KKworCXJ2ID0gTkNSNTM4MF9idXNfcmVzZXQoY21kKTsKKworCS8qIFJlLWVuYWJsZSBpbnRzICovCisJaWYgKElTX0FfVFQoKSkgeworCQlhdGFyaV90dXJub25faXJxKCBJUlFfVFRfTUZQX1NDU0kgKTsKKwl9CisJZWxzZSB7CisJCWF0YXJpX3R1cm5vbl9pcnEoIElSUV9NRlBfRlNDU0kgKTsKKwl9CisJaWYgKChydiAmIFNDU0lfUkVTRVRfQUNUSU9OKSA9PSBTQ1NJX1JFU0VUX1NVQ0NFU1MpCisJCWZhbGNvbl9yZWxlYXNlX2xvY2tfaWZfcG9zc2libGUoaG9zdGRhdGEpOworCisJcmV0dXJuKCBydiApOworfQorCisJCisjaWZkZWYgQ09ORklHX0FUQVJJX1NDU0lfUkVTRVRfQk9PVAorc3RhdGljIHZvaWQgX19pbml0IGF0YXJpX3Njc2lfcmVzZXRfYm9vdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZW5kOworCQorCS8qCisJICogRG8gYSBTQ1NJIHJlc2V0IHRvIGNsZWFuIHVwIHRoZSBidXMgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBObyBtZXNzaW5nCisJICogd2l0aCB0aGUgcXVldWVzLCBpbnRlcnJ1cHRzLCBvciBsb2NrcyBuZWNlc3NhcnkgaGVyZS4KKwkgKi8KKworCXByaW50ayggIkF0YXJpIFNDU0k6IHJlc2V0dGluZyB0aGUgU0NTSSBidXMuLi4iICk7CisKKwkvKiBnZXQgaW4gcGhhc2UgKi8KKwlOQ1I1MzgwX3dyaXRlKCBUQVJHRVRfQ09NTUFORF9SRUcsCisJCSAgICAgIFBIQVNFX1NSX1RPX1RDUiggTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICkpOworCisJLyogYXNzZXJ0IFJTVCAqLworCU5DUjUzODBfd3JpdGUoIElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX1JTVCApOworCS8qIFRoZSBtaW4uIHJlc2V0IGhvbGQgdGltZSBpcyAyNXVzLCBzbyA0MHVzIHNob3VsZCBiZSBlbm91Z2ggKi8KKwl1ZGVsYXkoIDUwICk7CisJLyogcmVzZXQgUlNUIGFuZCBpbnRlcnJ1cHQgKi8KKwlOQ1I1MzgwX3dyaXRlKCBJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFICk7CisJTkNSNTM4MF9yZWFkKCBSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyApOworCisJZW5kID0gamlmZmllcyArIEFGVEVSX1JFU0VUX0RFTEFZOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmQpKQorCQliYXJyaWVyKCk7CisKKwlwcmludGsoICIgZG9uZVxuIiApOworfQorI2VuZGlmCisKKworY29uc3QgY2hhciAqIGF0YXJpX3Njc2lfaW5mbyAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwkvKiBhdGFyaV9zY3NpX2RldGVjdCgpIGlzIHZlcmJvc2UgZW5vdWdoLi4uICovCisJc3RhdGljIGNvbnN0IGNoYXIgc3RyaW5nW10gPSAiQXRhcmkgbmF0aXZlIFNDU0kiOworCXJldHVybiBzdHJpbmc7Cit9CisKKworI2lmIGRlZmluZWQoUkVBTF9ETUEpCisKK3Vuc2lnbmVkIGxvbmcgYXRhcmlfc2NzaV9kbWFfc2V0dXAoIHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCB2b2lkICpkYXRhLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgY291bnQsIGludCBkaXIgKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciA9IHZpcnRfdG9fcGh5cyggZGF0YSApOworCisJRE1BX1BSSU5USygic2NzaSVkOiBzZXR0aW5nIHVwIGRtYSwgZGF0YSA9ICVwLCBwaHlzID0gJWx4LCBjb3VudCA9ICVsZCwgIgorCQkgICAiZGlyID0gJWRcbiIsIGluc3RhbmNlLT5ob3N0X25vLCBkYXRhLCBhZGRyLCBjb3VudCwgZGlyKTsKKworCWlmICghSVNfQV9UVCgpICYmICFTVFJBTV9BRERSKGFkZHIpKSB7CisJCS8qIElmIHdlIGhhdmUgYSBub24tRE1BYWJsZSBhZGRyZXNzIG9uIGEgRmFsY29uLCB1c2UgdGhlIGRyaWJibGUKKwkJICogYnVmZmVyOyAnb3JpZ19hZGRyJyAhPSAwIGluIHRoZSByZWFkIGNhc2UgdGVsbHMgdGhlIGludGVycnVwdAorCQkgKiBoYW5kbGVyIHRvIGNvcHkgZGF0YSBmcm9tIHRoZSBkcmliYmxlIGJ1ZmZlciB0byB0aGUgb3JpZ2luYWxseQorCQkgKiB3YW50ZWQgYWRkcmVzcy4KKwkJICovCisJCWlmIChkaXIpCisJCQltZW1jcHkoIGF0YXJpX2RtYV9idWZmZXIsIGRhdGEsIGNvdW50ICk7CisJCWVsc2UKKwkJCWF0YXJpX2RtYV9vcmlnX2FkZHIgPSBkYXRhOworCQlhZGRyID0gYXRhcmlfZG1hX3BoeXNfYnVmZmVyOworCX0KKwkKKwlhdGFyaV9kbWFfc3RhcnRhZGRyID0gYWRkcjsJLyogTmVlZGVkIGZvciBjYWxjdWxhdGluZyByZXNpZHVhbCBsYXRlci4gKi8KKyAgCisJLyogQ2FjaGUgY2xlYW51cCBzdHVmZjogT24gd3JpdGVzLCBwdXNoIGFueSBkaXJ0eSBjYWNoZSBvdXQgYmVmb3JlIHNlbmRpbmcKKwkgKiBpdCB0byB0aGUgcGVyaXBoZXJhbC4gKE11c3QgYmUgZG9uZSBiZWZvcmUgRE1BIHNldHVwLCBzaW5jZSBhdCBsZWFzdAorCSAqIHRoZSBTVC1ETUEgYmVnaW5zIHRvIGZpbGwgaW50ZXJuYWwgYnVmZmVycyByaWdodCBhZnRlciBzZXR1cC4gRm9yCisJICogcmVhZHMsIGludmFsaWRhdGUgYW55IGNhY2hlLCBtYXkgYmUgYWx0ZXJlZCBhZnRlciBETUEgd2l0aG91dCBDUFUKKwkgKiBrbm93bGVkZ2UuCisJICogCisJICogKytyb21hbjogRm9yIHRoZSBNZWR1c2EsIHRoZXJlJ3Mgbm8gbmVlZCBhdCBhbGwgZm9yIHRoYXQgY2FjaGUgc3R1ZmYsCisJICogYmVjYXVzZSB0aGUgaGFyZHdhcmUgZG9lcyBidXMgc25vb3BpbmcgKGZpbmUhKS4KKwkgKi8KKwlkbWFfY2FjaGVfbWFpbnRlbmFuY2UoIGFkZHIsIGNvdW50LCBkaXIgKTsKKworCWlmIChjb3VudCA9PSAwKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIlNDU0kgd2FybmluZzogRE1BIHByb2dyYW1tZWQgZm9yIDAgYnl0ZXMgIVxuIik7CisKKwlpZiAoSVNfQV9UVCgpKSB7CisJCXR0X3Njc2lfZG1hLmRtYV9jdHJsID0gZGlyOworCQlTQ1NJX0RNQV9XUklURV9QKCBkbWFfYWRkciwgYWRkciApOworCQlTQ1NJX0RNQV9XUklURV9QKCBkbWFfY250LCBjb3VudCApOworCQl0dF9zY3NpX2RtYS5kbWFfY3RybCA9IGRpciB8IDI7CisJfQorCWVsc2UgeyAvKiAhIElTX0FfVFQgKi8KKyAgCisJCS8qIHNldCBhZGRyZXNzICovCisJCVNDU0lfRE1BX1NFVEFEUiggYWRkciApOworCisJCS8qIHRvZ2dsZSBkaXJlY3Rpb24gYml0IHRvIGNsZWFyIEZJRk8gYW5kIHNldCBETUEgZGlyZWN0aW9uICovCisJCWRpciA8PD0gODsKKwkJc3RfZG1hLmRtYV9tb2RlX3N0YXR1cyA9IDB4OTAgfCBkaXI7CisJCXN0X2RtYS5kbWFfbW9kZV9zdGF0dXMgPSAweDkwIHwgKGRpciBeIDB4MTAwKTsKKwkJc3RfZG1hLmRtYV9tb2RlX3N0YXR1cyA9IDB4OTAgfCBkaXI7CisJCXVkZWxheSg0MCk7CisJCS8qIE9uIHdyaXRlcywgcm91bmQgdXAgdGhlIHRyYW5zZmVyIGxlbmd0aCB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiA1MTIKKwkJICogKHNlZSBhbHNvIGNvbW1lbnQgYXQgYXRhcmlfZG1hX3hmZXJfbGVuKCkpLiAqLworCQlzdF9kbWEuZmRjX2FjY2VzX3NlY2NvdW50ID0gKGNvdW50ICsgKGRpciA/IDUxMSA6IDApKSA+PiA5OworCQl1ZGVsYXkoNDApOworCQlzdF9kbWEuZG1hX21vZGVfc3RhdHVzID0gMHgxMCB8IGRpcjsKKwkJdWRlbGF5KDQwKTsKKwkJLyogbmVlZCBub3QgcmVzdG9yZSB2YWx1ZSBvZiBkaXIsIG9ubHkgYm9vbGVhbiB2YWx1ZSBpcyB0ZXN0ZWQgKi8KKwkJYXRhcmlfZG1hX2FjdGl2ZSA9IDE7CisJfQorCisJcmV0dXJuKCBjb3VudCApOworfQorCisKK3N0YXRpYyBsb25nIGF0YXJpX3Njc2lfZG1hX3Jlc2lkdWFsKCBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSApCit7CisJcmV0dXJuKCBhdGFyaV9kbWFfcmVzaWR1YWwgKTsKK30KKworCisjZGVmaW5lCUNNRF9TVVJFTFlfQkxPQ0tfTU9ERQkwCisjZGVmaW5lCUNNRF9TVVJFTFlfQllURV9NT0RFCTEKKyNkZWZpbmUJQ01EX01PREVfVU5LTk9XTgkJMgorCitzdGF0aWMgaW50IGZhbGNvbl9jbGFzc2lmeV9jbWQoIFNjc2lfQ21uZCAqY21kICkKK3sKKwl1bnNpZ25lZCBjaGFyIG9wY29kZSA9IGNtZC0+Y21uZFswXTsKKwkKKwlpZiAob3Bjb2RlID09IFJFQURfREVGRUNUX0RBVEEgfHwgb3Bjb2RlID09IFJFQURfTE9ORyB8fAorCQlvcGNvZGUgPT0gUkVBRF9CVUZGRVIpCisJCXJldHVybiggQ01EX1NVUkVMWV9CWVRFX01PREUgKTsKKwllbHNlIGlmIChvcGNvZGUgPT0gUkVBRF82IHx8IG9wY29kZSA9PSBSRUFEXzEwIHx8CisJCSBvcGNvZGUgPT0gMHhhOCAvKiBSRUFEXzEyICovIHx8IG9wY29kZSA9PSBSRUFEX1JFVkVSU0UgfHwKKwkJIG9wY29kZSA9PSBSRUNPVkVSX0JVRkZFUkVEX0RBVEEpIHsKKwkJLyogSW4gY2FzZSBvZiBhIHNlcXVlbnRpYWwtYWNjZXNzIHRhcmdldCAodGFwZSksIHNwZWNpYWwgY2FyZSBpcworCQkgKiBuZWVkZWQgaGVyZTogVGhlIHRyYW5zZmVyIGlzIGJsb2NrLW1vZGUgb25seSBpZiB0aGUgJ2ZpeGVkJyBiaXQgaXMKKwkJICogc2V0ISAqLworCQlpZiAoY21kLT5kZXZpY2UtPnR5cGUgPT0gVFlQRV9UQVBFICYmICEoY21kLT5jbW5kWzFdICYgMSkpCisJCQlyZXR1cm4oIENNRF9TVVJFTFlfQllURV9NT0RFICk7CisJCWVsc2UKKwkJCXJldHVybiggQ01EX1NVUkVMWV9CTE9DS19NT0RFICk7CisJfQorCWVsc2UKKwkJcmV0dXJuKCBDTURfTU9ERV9VTktOT1dOICk7Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgdHJhbnNmZXJyZWQgdmlhCisgKiBETUEuIE9uIHRoZSBUVCwgdGhpcyBpcyBhcmJpdHJhcnksIGJ1dCBvbiB0aGUgRmFsY29uIHdlIGhhdmUgdG8gdXNlIHRoZQorICogU1QtRE1BIGNoaXAuIFRoZXJlIGFyZSBvbmx5IG11bHRpcGxlcyBvZiA1MTIgYnl0ZXMgcG9zc2libGUgYW5kIG1heC4KKyAqIDI1NSo1MTIgYnl0ZXMgOi0oIFRoaXMgbWVhbnMgYWxzbywgdGhhdCBkZWZpbmluZyBSRUFEX09WRVJSVU5TIGlzIG5vdAorICogcG9zc2libGUgb24gdGhlIEZhbGNvbiwgc2luY2UgdGhhdCB3b3VsZCByZXF1aXJlIHRvIHByb2dyYW0gdGhlIERNQSBmb3IKKyAqIG4qNTEyIC0gYXRhcmlfcmVhZF9vdmVycnVuIGJ5dGVzLiBCdXQgaXQgc2VlbXMgdGhhdCB0aGUgRmFsY29uIGRvZXNuJ3QgaGF2ZQorICogdGhlIG92ZXJydW4gcHJvYmxlbSwgc28gdGhpcyBxdWVzdGlvbiBpcyBhY2FkZW1pYyA6LSkKKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhdGFyaV9kbWFfeGZlcl9sZW4oIHVuc2lnbmVkIGxvbmcgd2FudGVkX2xlbiwKKwkJCQkJU2NzaV9DbW5kICpjbWQsCisJCQkJCWludCB3cml0ZV9mbGFnICkKK3sKKwl1bnNpZ25lZCBsb25nCXBvc3NpYmxlX2xlbiwgbGltaXQ7CisjaWZuZGVmIENPTkZJR19UVF9ETUFfRU1VTAorCWlmIChNQUNIX0lTX0hBREVTKQorCQkvKiBIYWRlcyBoYXMgbm8gU0NTSSBETUEgYXQgYWxsIDotKCBBbHdheXMgZm9yY2UgdXNlIG9mIFBJTyAqLworCQlyZXR1cm4oIDAgKTsKKyNlbmRpZgkKKwlpZiAoSVNfQV9UVCgpKQorCQkvKiBUVCBTQ1NJIERNQSBjYW4gdHJhbnNmZXIgYXJiaXRyYXJ5ICNieXRlcyAqLworCQlyZXR1cm4oIHdhbnRlZF9sZW4gKTsKKworCS8qIFNUIERNQSBjaGlwIGlzIHN0dXBpZCAtLSBvbmx5IG11bHRpcGxlcyBvZiA1MTIgYnl0ZXMhIChhbmQgbWF4LgorCSAqIDI1NSo1MTIgYnl0ZXMsIGJ1dCB0aGlzIHNob3VsZCBiZSBlbm91Z2gpCisJICoKKwkgKiArK3JvbWFuOiBBYWFyZ2whIEFub3RoZXIgRmFsY29uLVNDU0kgcHJvYmxlbS4uLiBUaGVyZSBhcmUgc29tZSBjb21tYW5kcworCSAqIHRoYXQgcmV0dXJuIGEgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGNhbm5vdCBiZSBrbm93biBiZWZvcmVoYW5kLiBJbiB0aGlzCisJICogY2FzZSwgdGhlIGdpdmVuIHRyYW5zZmVyIGxlbmd0aCBpcyBhbiAiYWxsb2NhdGlvbiBsZW5ndGgiLiBOb3cgaXQKKwkgKiBjYW4gaGFwcGVuIHRoYXQgdGhpcyBhbGxvY2F0aW9uIGxlbmd0aCBpcyBhIG11bHRpcGxlIG9mIDUxMiBieXRlcyBhbmQKKwkgKiB0aGUgRE1BIGlzIHVzZWQuIEJ1dCBpZiBub3Qgbio1MTIgYnl0ZXMgcmVhbGx5IGFycml2ZSwgc29tZSBpbnB1dCBkYXRhCisJICogd2lsbCBiZSBsb3N0IGluIHRoZSBTVC1ETUEncyBGSUZPIDotKCBUaHVzLCB3ZSBoYXZlIHRvIGRpc3Rpbmd1aXNoCisJICogYmV0d2VlbiBjb21tYW5kcyB0aGF0IGRvIGJsb2NrIHRyYW5zZmVycyBhbmQgdGhvc2UgdGhhdCBkbyBieXRlCisJICogdHJhbnNmZXJzLiBCdXQgdGhpcyBpc24ndCBlYXN5Li4uIHRoZXJlIGFyZSBsb3RzIG9mIHZlbmRvciBzcGVjaWZpYworCSAqIGNvbW1hbmRzLCBhbmQgdGhlIHVzZXIgY2FuIGlzc3VlIGFueSBjb21tYW5kIHZpYSB0aGUKKwkgKiBTQ1NJX0lPQ1RMX1NFTkRfQ09NTUFORC4KKwkgKgorCSAqIFRoZSBzb2x1dGlvbjogV2UgY2xhc3NpZnkgU0NTSSBjb21tYW5kcyBpbiAxKSBzdXJlbHkgYmxvY2stbW9kZSBjbWQucywKKwkgKiAyKSBzdXJlbHkgYnl0ZS1tb2RlIGNtZC5zIGFuZCAzKSBjbWQucyB3aXRoIHVua25vd24gbW9kZS4gSW4gY2FzZSAxKQorCSAqIGFuZCAzKSwgdGhlIHRoaW5nIHRvIGRvIGlzIG9idmlvdXM6IGFsbG93IGFueSBudW1iZXIgb2YgYmxvY2tzIHZpYSBETUEKKwkgKiBvciBub25lLiBJbiBjYXNlIDIpLCB3ZSBhcHBseSBzb21lIGhldXJpc3RpYzogQnl0ZSBtb2RlIGlzIGFzc3VtZWQgaWYKKwkgKiB0aGUgdHJhbnNmZXIgKGFsbG9jYXRpb24pIGxlbmd0aCBpcyA8IDEwMjQsIGhvcGluZyB0aGF0IG5vIGNtZC4gbm90CisJICogZXhwbGljaXRseSBrbm93biBhcyBieXRlIG1vZGUgaGF2ZSBzdWNoIGJpZyBhbGxvY2F0aW9uIGxlbmd0aHMuLi4KKwkgKiBCVFcsIGFsbCB0aGUgZGlzY3Vzc2lvbiBhYm92ZSBhcHBsaWVzIG9ubHkgdG8gcmVhZHMuIERNQSB3cml0ZXMgYXJlCisJICogdW5wcm9ibGVtYXRpYyBhbnl3YXlzLCBzaW5jZSB0aGUgdGFyZ2V0cyBhYm9ydHMgdGhlIHRyYW5zZmVyIGFmdGVyCisJICogcmVjZWl2aW5nIGEgc3VmZmljaWVudCBudW1iZXIgb2YgYnl0ZXMuCisJICoKKwkgKiBBbm90aGVyIHBvaW50OiBJZiB0aGUgdHJhbnNmZXIgaXMgZnJvbS90byBhbiBub24tU1QtUkFNIGFkZHJlc3MsIHdlCisJICogdXNlIHRoZSBkcmliYmxlIGJ1ZmZlciBhbmQgdGh1cyBjYW4gZG8gb25seSBTVFJBTV9CVUZGRVJfU0laRSBieXRlcy4KKwkgKi8KKworCWlmICh3cml0ZV9mbGFnKSB7CisJCS8qIFdyaXRlIG9wZXJhdGlvbiBjYW4gYWx3YXlzIHVzZSB0aGUgRE1BLCBidXQgdGhlIHRyYW5zZmVyIHNpemUgbXVzdAorCQkgKiBiZSByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IG11bHRpcGxlIG9mIDUxMiAoYXRhcmlfZG1hX3NldHVwKCkgZG9lcworCQkgKiB0aGlzKS4KKwkJICovCisJCXBvc3NpYmxlX2xlbiA9IHdhbnRlZF9sZW47CisJfQorCWVsc2UgeworCQkvKiBSZWFkIG9wZXJhdGlvbnM6IGlmIHRoZSB3YW50ZWQgdHJhbnNmZXIgbGVuZ3RoIGlzIG5vdCBhIG11bHRpcGxlIG9mCisJCSAqIDUxMiwgd2UgY2Fubm90IHVzZSBETUEsIHNpbmNlIHRoZSBTVC1ETUEgY2Fubm90IHNwbGl0IHRyYW5zZmVycworCQkgKiAobm8gaW50ZXJydXB0IG9uIERNQSBmaW5pc2hlZCEpCisJCSAqLworCQlpZiAod2FudGVkX2xlbiAmIDB4MWZmKQorCQkJcG9zc2libGVfbGVuID0gMDsKKwkJZWxzZSB7CisJCQkvKiBOb3cgY2xhc3NpZnkgdGhlIGNvbW1hbmQgKHNlZSBhYm92ZSkgYW5kIGRlY2lkZSB3aGV0aGVyIGl0IGlzCisJCQkgKiBhbGxvd2VkIHRvIGRvIERNQSBhdCBhbGwgKi8KKwkJCXN3aXRjaCggZmFsY29uX2NsYXNzaWZ5X2NtZCggY21kICkpIHsKKwkJCSAgY2FzZSBDTURfU1VSRUxZX0JMT0NLX01PREU6CisJCQkJcG9zc2libGVfbGVuID0gd2FudGVkX2xlbjsKKwkJCQlicmVhazsKKwkJCSAgY2FzZSBDTURfU1VSRUxZX0JZVEVfTU9ERToKKwkJCQlwb3NzaWJsZV9sZW4gPSAwOyAvKiBETUEgcHJvaGliaXRlZCAqLworCQkJCWJyZWFrOworCQkJICBjYXNlIENNRF9NT0RFX1VOS05PV046CisJCQkgIGRlZmF1bHQ6CisJCQkJLyogRm9yIHVua25vd24gY29tbWFuZHMgYXNzdW1lIGJsb2NrIHRyYW5zZmVycyBpZiB0aGUgdHJhbnNmZXIKKwkJCQkgKiBzaXplL2FsbG9jYXRpb24gbGVuZ3RoIGlzID49IDEwMjQgKi8KKwkJCQlwb3NzaWJsZV9sZW4gPSAod2FudGVkX2xlbiA8IDEwMjQpID8gMCA6IHdhbnRlZF9sZW47CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJCisJLyogTGFzdCBzdGVwOiBhcHBseSB0aGUgaGFyZCBsaW1pdCBvbiBETUEgdHJhbnNmZXJzICovCisJbGltaXQgPSAoYXRhcmlfZG1hX2J1ZmZlciAmJiAhU1RSQU1fQUREUiggdmlydF90b19waHlzKGNtZC0+U0NwLnB0cikgKSkgPworCQkgICAgU1RSQU1fQlVGRkVSX1NJWkUgOiAyNTUqNTEyOworCWlmIChwb3NzaWJsZV9sZW4gPiBsaW1pdCkKKwkJcG9zc2libGVfbGVuID0gbGltaXQ7CisKKwlpZiAocG9zc2libGVfbGVuICE9IHdhbnRlZF9sZW4pCisJCURNQV9QUklOVEsoIlNvcnJ5LCBtdXN0IGN1dCBETUEgdHJhbnNmZXIgc2l6ZSB0byAlbGQgYnl0ZXMgIgorCQkJICAgImluc3RlYWQgb2YgJWxkXG4iLCBwb3NzaWJsZV9sZW4sIHdhbnRlZF9sZW4pOworCisJcmV0dXJuKCBwb3NzaWJsZV9sZW4gKTsKK30KKworCisjZW5kaWYJLyogUkVBTF9ETUEgKi8KKworCisvKiBOQ1I1MzgwIHJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbnMKKyAqCisgKiBUaGVyZSBhcmUgc2VwYXJhdGUgZnVuY3Rpb25zIGZvciBUVCBhbmQgRmFsY29uLCBiZWNhdXNlIHRoZSBhY2Nlc3MKKyAqIG1ldGhvZHMgYXJlIHF1aXRlIGRpZmZlcmVudC4gVGhlIGNhbGxpbmcgbWFjcm9zIE5DUjUzODBfcmVhZCBhbmQKKyAqIE5DUjUzODBfd3JpdGUgY2FsbCB0aGVzZSBmdW5jdGlvbnMgdmlhIGZ1bmN0aW9uIHBvaW50ZXJzLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF0YXJpX3Njc2lfdHRfcmVnX3JlYWQoIHVuc2lnbmVkIGNoYXIgcmVnICkKK3sKKwlyZXR1cm4oIHR0X3Njc2lfcmVncFtyZWcgKiAyXSApOworfQorCitzdGF0aWMgdm9pZCBhdGFyaV9zY3NpX3R0X3JlZ193cml0ZSggdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsdWUgKQoreworCXR0X3Njc2lfcmVncFtyZWcgKiAyXSA9IHZhbHVlOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhdGFyaV9zY3NpX2ZhbGNvbl9yZWdfcmVhZCggdW5zaWduZWQgY2hhciByZWcgKQoreworCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXM9ICh1X3Nob3J0KSgweDg4ICsgcmVnKTsKKwlyZXR1cm4oICh1X2NoYXIpZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudCApOworfQorCitzdGF0aWMgdm9pZCBhdGFyaV9zY3NpX2ZhbGNvbl9yZWdfd3JpdGUoIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbHVlICkKK3sKKwlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gKHVfc2hvcnQpKDB4ODggKyByZWcpOworCWRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQgPSAodV9zaG9ydCl2YWx1ZTsKK30KKworCisjaW5jbHVkZSAiYXRhcmlfTkNSNTM4MC5jIgorCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19pbmZvCQk9IGF0YXJpX3Njc2lfcHJvY19pbmZvLAorCS5uYW1lCQkJPSAiQXRhcmkgbmF0aXZlIFNDU0kiLAorCS5kZXRlY3QJCQk9IGF0YXJpX3Njc2lfZGV0ZWN0LAorCS5yZWxlYXNlCQk9IGF0YXJpX3Njc2lfcmVsZWFzZSwKKwkuaW5mbwkJCT0gYXRhcmlfc2NzaV9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gYXRhcmlfc2NzaV9xdWV1ZV9jb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gYXRhcmlfc2NzaV9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBhdGFyaV9zY3NpX2J1c19yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IDAsIC8qIGluaXRpYWxpemVkIGF0IHJ1bi10aW1lICovCisJLnRoaXNfaWQJCT0gMCwgLyogaW5pdGlhbGl6ZWQgYXQgcnVuLXRpbWUgKi8KKwkuc2dfdGFibGVzaXplCQk9IDAsIC8qIGluaXRpYWxpemVkIGF0IHJ1bi10aW1lICovCisJLmNtZF9wZXJfbHVuCQk9IDAsIC8qIGluaXRpYWxpemVkIGF0IHJ1bi10aW1lICovCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORworfTsKKworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2F0YXJpX3Njc2kuaCBiL2RyaXZlcnMvc2NzaS9hdGFyaV9zY3NpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MxMjU2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hdGFyaV9zY3NpLmgKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiBhdGFyaV9zY3NpLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRoZSBBdGFyaSBuYXRpdmUgU0NTSSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMTk5NCBSb21hbiBIb2RlayA8Um9tYW4uSG9kZWtAaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+CisgKgorICogKExvb3NlbHkgYmFzZWQgb24gdGhlIHdvcmsgb2YgUm9iZXJ0IERlIFZyaWVzJyB0ZWFtKQorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworCisjaWZuZGVmIEFUQVJJX1NDU0lfSAorI2RlZmluZSBBVEFSSV9TQ1NJX0gKKworLyogKElfSEFWRV9PVkVSUlVOUyBzdHVmZiByZW1vdmVkKSAqLworCisjaWZuZGVmIEFTTQoraW50IGF0YXJpX3Njc2lfZGV0ZWN0IChTY3NpX0hvc3RfVGVtcGxhdGUgKik7Citjb25zdCBjaGFyICphdGFyaV9zY3NpX2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKik7CitpbnQgYXRhcmlfc2NzaV9yZXNldCAoU2NzaV9DbW5kICosIHVuc2lnbmVkIGludCk7CisjaWZkZWYgTU9EVUxFCitpbnQgYXRhcmlfc2NzaV9yZWxlYXNlIChzdHJ1Y3QgU2NzaV9Ib3N0ICopOworI2Vsc2UKKyNkZWZpbmUgYXRhcmlfc2NzaV9yZWxlYXNlIE5VTEwKKyNlbmRpZgorCisvKiBUaGUgdmFsdWVzIGZvciBDTURfUEVSX0xVTiBhbmQgQ0FOX1FVRVVFIGFyZSBzb21laG93IGFyYml0cmFyeS4gSGlnaGVyCisgKiB2YWx1ZXMgc2hvdWxkIHdvcmssIHRvbzsgdHJ5IGl0ISAoYnV0IGNtZF9wZXJfbHVuIGNvc3RzIG1lbW9yeSEpICovCisKKy8qIEJ1dCB0aGVyZSBzZWVtcyB0byBiZSBhIGJ1ZyBzb21ld2hlcmUgdGhhdCByZXF1aXJlcyBDQU5fUVVFVUUgdG8gYmUKKyAqIDIqQ01EX1BFUl9MVU4uIEF0IGxlYXN0IG9uIGEgVFQsIG5vIHNwdXJpb3VzIHRpbWVvdXRzIHNlZW4gc2luY2UKKyAqIGNoYW5nZWQgQ01EX1BFUl9MVU4uLi4gKi8KKworLyogTm90ZTogVGhlIEZhbGNvbiBjdXJyZW50bHkgdXNlcyA4LzEgc2V0dGluZyBkdWUgdG8gdW5zb2x2ZWQgcHJvYmxlbXMgd2l0aAorICogY21kX3Blcl9sdW4gIT0gMSAqLworCisjZGVmaW5lIEFUQVJJX1RUX0NBTl9RVUVVRQkJMTYKKyNkZWZpbmUgQVRBUklfVFRfQ01EX1BFUl9MVU4JCTgKKyNkZWZpbmUgQVRBUklfVFRfU0dfVEFCTEVTSVpFCQlTR19BTEwKKworI2RlZmluZSBBVEFSSV9GQUxDT05fQ0FOX1FVRVVFCQk4CisjZGVmaW5lIEFUQVJJX0ZBTENPTl9DTURfUEVSX0xVTgkxCisjZGVmaW5lIEFUQVJJX0ZBTENPTl9TR19UQUJMRVNJWkUJU0dfTk9ORQorCisjZGVmaW5lCURFRkFVTFRfVVNFX1RBR0dFRF9RVUVVSU5HCTAKKworCisjZGVmaW5lCU5DUjUzODBfaW1wbGVtZW50YXRpb25fZmllbGRzCS8qIG5vbmUgKi8KKworI2RlZmluZSBOQ1I1MzgwX3JlYWQocmVnKQkJICBhdGFyaV9zY3NpX3JlZ19yZWFkKCByZWcgKQorI2RlZmluZSBOQ1I1MzgwX3dyaXRlKHJlZywgdmFsdWUpIGF0YXJpX3Njc2lfcmVnX3dyaXRlKCByZWcsIHZhbHVlICkKKworI2RlZmluZSBOQ1I1MzgwX2ludHIgYXRhcmlfc2NzaV9pbnRyCisjZGVmaW5lIE5DUjUzODBfcXVldWVfY29tbWFuZCBhdGFyaV9zY3NpX3F1ZXVlX2NvbW1hbmQKKyNkZWZpbmUgTkNSNTM4MF9hYm9ydCBhdGFyaV9zY3NpX2Fib3J0CisjZGVmaW5lIE5DUjUzODBfcHJvY19pbmZvIGF0YXJpX3Njc2lfcHJvY19pbmZvCisjZGVmaW5lIE5DUjUzODBfZG1hX3JlYWRfc2V0dXAoaW5zdCxkLGMpIGF0YXJpX3Njc2lfZG1hX3NldHVwIChpbnN0LCBkLCBjLCAwKQorI2RlZmluZSBOQ1I1MzgwX2RtYV93cml0ZV9zZXR1cChpbnN0LGQsYykgYXRhcmlfc2NzaV9kbWFfc2V0dXAgKGluc3QsIGQsIGMsIDEpCisjZGVmaW5lIE5DUjUzODBfZG1hX3Jlc2lkdWFsKGluc3QpIGF0YXJpX3Njc2lfZG1hX3Jlc2lkdWFsKCBpbnN0ICkKKyNkZWZpbmUJTkNSNTM4MF9kbWFfeGZlcl9sZW4oaSxjbWQscGhhc2UpIFwKKwlhdGFyaV9kbWFfeGZlcl9sZW4oY21kLT5TQ3AudGhpc19yZXNpZHVhbCxjbWQsKChwaGFzZSkgJiBTUl9JTykgPyAwIDogMSkKKworLyogRGVidWdnaW5nIHByaW50ayBkZWZpbml0aW9uczoKKyAqCisgKiAgQVJCICAtPiBhcmJpdHJhdGlvbgorICogIEFTRU4gLT4gYXV0by1zZW5zZQorICogIERNQSAgLT4gRE1BCisgKiAgSFNIICAtPiBQSU8gaGFuZHNoYWtlCisgKiAgSU5GICAtPiBpbmZvcm1hdGlvbiB0cmFuc2ZlcgorICogIElOSSAgLT4gaW5pdGlhbGl6YXRpb24KKyAqICBJTlQgIC0+IGludGVycnVwdAorICogIExOSyAgLT4gbGlua2VkIGNvbW1hbmRzCisgKiAgTUFJTiAtPiBOQ1I1MzgwX21haW4oKSBjb250cm9sIGZsb3cKKyAqICBOREFUIC0+IG5vIGRhdGEtb3V0IHBoYXNlCisgKiAgTldSICAtPiBubyB3cml0ZSBjb21tYW5kcworICogIFBJTyAgLT4gUElPIHRyYW5zZmVycworICogIFBETUEgLT4gcHNldWRvIERNQSAodW51c2VkIG9uIEF0YXJpKQorICogIFFVICAgLT4gcXVldWVzCisgKiAgUlNMICAtPiByZXNlbGVjdGlvbnMKKyAqICBTRUwgIC0+IHNlbGVjdGlvbnMKKyAqICBVU0wgIC0+IHVzbGVlcCBjcGRlICh1bnVzZWQgb24gQXRhcmkpCisgKiAgTEJTICAtPiBsYXN0IGJ5dGUgc2VudCAodW51c2VkIG9uIEF0YXJpKQorICogIFJTUyAgLT4gcmVzdGFydGluZyBvZiBzZWxlY3Rpb25zCisgKiAgRVhUICAtPiBleHRlbmRlZCBtZXNzYWdlcworICogIEFCUlQgLT4gYWJvcnRpbmcgYW5kIHJlc2V0dGluZworICogIFRBRyAgLT4gcXVldWUgdGFnIGhhbmRsaW5nCisgKiAgTUVSICAtPiBtZXJnaW5nIG9mIGNvbnNlYy4gYnVmZmVycworICoKKyAqLworCisjaWYgTkRFQlVHICYgTkRFQlVHX0FSQklUUkFUSU9OCisjZGVmaW5lIEFSQl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIEFSQl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX0FVVE9TRU5TRQorI2RlZmluZSBBU0VOX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgQVNFTl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX0RNQQorI2RlZmluZSBETUFfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBETUFfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19IQU5EU0hBS0UKKyNkZWZpbmUgSFNIX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgSFNIX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfSU5GT1JNQVRJT04KKyNkZWZpbmUgSU5GX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgSU5GX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfSU5JVAorI2RlZmluZSBJTklfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBJTklfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19JTlRSCisjZGVmaW5lIElOVF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIElOVF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX0xJTktFRAorI2RlZmluZSBMTktfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBMTktfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19NQUlOCisjZGVmaW5lIE1BSU5fUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBNQUlOX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfTk9fREFUQU9VVAorI2RlZmluZSBOREFUX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgTkRBVF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX05PX1dSSVRFCisjZGVmaW5lIE5XUl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIE5XUl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX1BJTworI2RlZmluZSBQSU9fUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBQSU9fUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19QU0VVRE9fRE1BCisjZGVmaW5lIFBETUFfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBQRE1BX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfUVVFVUVTCisjZGVmaW5lIFFVX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgUVVfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19SRVNFTEVDVElPTgorI2RlZmluZSBSU0xfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBSU0xfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19TRUxFQ1RJT04KKyNkZWZpbmUgU0VMX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgU0VMX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfVVNMRUVQCisjZGVmaW5lIFVTTF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIFVTTF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX0xBU1RfQllURV9TRU5UCisjZGVmaW5lIExCU19QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIExCU19QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX1JFU1RBUlRfU0VMRUNUCisjZGVmaW5lIFJTU19QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIFJTU19QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX0VYVEVOREVECisjZGVmaW5lIEVYVF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIEVYVF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX0FCT1JUCisjZGVmaW5lIEFCUlRfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBBQlJUX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfVEFHUworI2RlZmluZSBUQUdfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBUQUdfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19NRVJHSU5HCisjZGVmaW5lIE1FUl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIE1FUl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKy8qIGNvbmRpdGlvbmFsIG1hY3JvcyBmb3IgTkNSNTM4MF9wcmludF97LHBoYXNlLHN0YXR1c30gKi8KKworI2RlZmluZSBOQ1JfUFJJTlQobWFzaykJXAorCSgoTkRFQlVHICYgKG1hc2spKSA/IE5DUjUzODBfcHJpbnQoaW5zdGFuY2UpIDogKHZvaWQpMCkKKworI2RlZmluZSBOQ1JfUFJJTlRfUEhBU0UobWFzaykgXAorCSgoTkRFQlVHICYgKG1hc2spKSA/IE5DUjUzODBfcHJpbnRfcGhhc2UoaW5zdGFuY2UpIDogKHZvaWQpMCkKKworI2RlZmluZSBOQ1JfUFJJTlRfU1RBVFVTKG1hc2spIFwKKwkoKE5ERUJVRyAmIChtYXNrKSkgPyBOQ1I1MzgwX3ByaW50X3N0YXR1cyhpbnN0YW5jZSkgOiAodm9pZCkwKQorCisKKyNlbmRpZiAvKiBuZGVmIEFTTSAqLworI2VuZGlmIC8qIEFUQVJJX1NDU0lfSCAqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hdHA4NzB1LmMgYi9kcml2ZXJzL3Njc2kvYXRwODcwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1Yjc1ZGRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2F0cDg3MHUuYwpAQCAtMCwwICsxLDM5NzAgQEAKKy8qIAorICogIENvcHlyaWdodCAoQykgMTk5NwlXdSBDaGluZyBDaGVuCisgKiAgMi4xLnggdXBkYXRlIChDKSAxOTk4ICBLcnp5c3p0b2YgRy4gQmFyYW5vd3NraQorICogIDIuNS54IHVwZGF0ZSAoQykgMjAwMiAgUmVkIEhhdCA8YWxhbkByZWRoYXQuY29tPgorICogIDIuNi54IHVwZGF0ZSAoQykgMjAwNCAgUmVkIEhhdCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqIE1hcmNlbG8gVG9zYXR0aSA8bWFyY2Vsb0Bjb25lY3RpdmEuY29tLmJyPiA6IFNNUCBmaXhlcworICoKKyAqIFd1IENoaW5nIENoZW4gOiBOVUxMIHBvaW50ZXIgZml4ZXMgIDIwMDAvMDYvMDIKKyAqCQkgICBzdXBwb3J0IGF0cDg3NiBjaGlwCisgKgkJICAgZW5hYmxlIDMyIGJpdCBmaWZvIHRyYW5zZmVyCisgKgkJICAgc3VwcG9ydCBjZHJvbSAmIHJlbW92ZSBkZXZpY2UgcnVuIHVsdHJhIHNwZWVkCisgKgkJICAgZml4IGRpc2Nvbm5lY3QgYnVnICAyMDAwLzEyLzIxCisgKgkJICAgc3VwcG9ydCBhdHA4ODAgY2hpcCBsdmQgdTE2MCAyMDAxLzA1LzE1CisgKgkJICAgZml4IHByZCB0YWJsZSBidWcgMjAwMS8wOS8xMiAoNy4xKQorICoKKyAqIGF0cDg4NSBzdXBwb3J0IGFkZCBieSBBQ0FSRCBIYW8gUGluZyBMaWFuIDIwMDUvMDEvMDUKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2luY2x1ZGUgImF0cDg3MHUuaCIKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgYXRwODcwdV90ZW1wbGF0ZTsKK3N0YXRpYyB2b2lkIHNlbmRfczg3MChzdHJ1Y3QgYXRwX3VuaXQgKmRldix1bnNpZ25lZCBjaGFyIGMpOworc3RhdGljIHZvaWQgaXM4ODUoc3RydWN0IGF0cF91bml0ICpkZXYsIHVuc2lnbmVkIGludCB3a3BvcnQsdW5zaWduZWQgY2hhciBjKTsKK3N0YXRpYyB2b2lkIHRzY2FtXzg4NSh2b2lkKTsKKworc3RhdGljIGlycXJldHVybl90IGF0cDg3MHVfaW50cl9oYW5kbGUoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHNob3J0IGludCB0bXBjaXAsIGlkOworCXVuc2lnbmVkIGNoYXIgaSwgaiwgYywgdGFyZ2V0X2lkLCBsdW4sY21kcDsKKwl1bnNpZ25lZCBjaGFyICpwcmQ7CisJc3RydWN0IHNjc2lfY21uZCAqd29ya3JlcTsKKwl1bnNpZ25lZCBpbnQgd29ya3BvcnQsIHRtcG9ydCwgdG1wb3J0MTsKKwl1bnNpZ25lZCBsb25nIGFkcmNudCwgazsKKyNpZmRlZiBFRF9EQkdQCisJdW5zaWduZWQgbG9uZyBsOworI2VuZGlmCisJaW50IGVycnN0dXM7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGRldl9pZDsKKwlzdHJ1Y3QgYXRwX3VuaXQgKmRldiA9IChzdHJ1Y3QgYXRwX3VuaXQgKikmaG9zdC0+aG9zdGRhdGE7CisKKwlmb3IgKGMgPSAwOyBjIDwgMjsgYysrKSB7CisJCXRtcG9ydCA9IGRldi0+aW9wb3J0W2NdICsgMHgxZjsKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoKGogJiAweDgwKSAhPSAwKQorCQl7CQkJCisJICAgCQlnb3RvIGNoX3NlbDsKKwkJfQorCQlkZXYtPmluX2ludFtjXSA9IDA7CisJfQorCXJldHVybiBJUlFfTk9ORTsKK2NoX3NlbDoKKyNpZmRlZiBFRF9EQkdQCQorCXByaW50aygiYXRwODcwdV9pbnRyX2hhbmRsZSBlbnRlclxuIik7CisjZW5kaWYJCisJZGV2LT5pbl9pbnRbY10gPSAxOworCWNtZHAgPSBpbmIoZGV2LT5pb3BvcnRbY10gKyAweDEwKTsKKwl3b3JrcG9ydCA9IGRldi0+aW9wb3J0W2NdOworCWlmIChkZXYtPndvcmtpbmdbY10gIT0gMCkgeworCQlpZiAoZGV2LT5kZXZfaWQgPT0gQVRQODg1X0RFVklEKSB7CisJCQl0bXBvcnQxID0gd29ya3BvcnQgKyAweDE2OworCQkJaWYgKChpbmIodG1wb3J0MSkgJiAweDgwKSA9PSAwKQorCQkJCW91dGIoKGluYih0bXBvcnQxKSB8IDB4ODApLCB0bXBvcnQxKTsKKwkJfQkJCisJCXRtcGNpcCA9IGRldi0+cGNpcG9ydFtjXTsKKwkJaWYgKChpbmIodG1wY2lwKSAmIDB4MDgpICE9IDApCisJCXsKKwkJCXRtcGNpcCArPSAweDI7CisJCQlmb3IgKGs9MDsgayA8IDEwMDA7IGsrKykgeworCQkJCWlmICgoaW5iKHRtcGNpcCkgJiAweDA4KSA9PSAwKSB7CisJCQkJCWdvdG8gc3RvcF9kbWE7CisJCQkJfQorCQkJCWlmICgoaW5iKHRtcGNpcCkgJiAweDAxKSA9PSAwKSB7CisJCQkJCWdvdG8gc3RvcF9kbWE7CisJCQkJfQorCQkJfQorCQl9CitzdG9wX2RtYToKKwkJdG1wY2lwID0gZGV2LT5wY2lwb3J0W2NdOworCQlvdXRiKDB4MDAsIHRtcGNpcCk7CisJCXRtcG9ydCAtPSAweDA4OworCQkKKwkJaSA9IGluYih0bXBvcnQpOworCQkKKwkJaWYgKGRldi0+ZGV2X2lkID09IEFUUDg4NV9ERVZJRCkgeworCQkJdG1wY2lwICs9IDI7CisJCQlvdXRiKDB4MDYsIHRtcGNpcCk7CisJCQl0bXBjaXAgLT0gMjsKKwkJfQorCisJCXRtcG9ydCAtPSAweDAyOworCQl0YXJnZXRfaWQgPSBpbmIodG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDI7CisKKwkJLyoKKwkJICoJUmVtYXAgd2lkZSBkZXZpY2VzIG9udG8gaWQgbnVtYmVycworCQkgKi8KKworCQlpZiAoKHRhcmdldF9pZCAmIDB4NDApICE9IDApIHsKKwkJCXRhcmdldF9pZCA9ICh0YXJnZXRfaWQgJiAweDA3KSB8IDB4MDg7CisJCX0gZWxzZSB7CisJCQl0YXJnZXRfaWQgJj0gMHgwNzsKKwkJfQorCisJCWlmICgoaiAmIDB4NDApICE9IDApIHsKKwkJICAgICBpZiAoZGV2LT5sYXN0X2NtZFtjXSA9PSAweGZmKSB7CisJCQlkZXYtPmxhc3RfY21kW2NdID0gdGFyZ2V0X2lkOworCQkgICAgIH0KKwkJICAgICBkZXYtPmxhc3RfY21kW2NdIHw9IDB4NDA7CisJCX0KKwkJaWYgKGRldi0+ZGV2X2lkID09IEFUUDg4NV9ERVZJRCkgCisJCQlkZXYtPnIxZltjXVt0YXJnZXRfaWRdIHw9IGo7CisjaWZkZWYgRURfREJHUAorCQlwcmludGsoImF0cDg3MHVfaW50cl9oYW5kbGUgc3RhdHVzID0gJXhcbiIsaSk7CisjZW5kaWYJCisJCWlmIChpID09IDB4ODUpIHsKKwkJCWlmICgoZGV2LT5sYXN0X2NtZFtjXSAmIDB4ZjApICE9IDB4NDApIHsKKwkJCSAgIGRldi0+bGFzdF9jbWRbY10gPSAweGZmOworCQkJfQorCQkJaWYgKGRldi0+ZGV2X2lkID09IEFUUDg4NV9ERVZJRCkgeworCQkJCXRtcG9ydCAtPSAweDA1OworCQkJCWFkcmNudCA9IDA7CisJCQkJKCh1bnNpZ25lZCBjaGFyICopICZhZHJjbnQpWzJdID0gaW5iKHRtcG9ydCsrKTsKKwkJCQkoKHVuc2lnbmVkIGNoYXIgKikgJmFkcmNudClbMV0gPSBpbmIodG1wb3J0KyspOworCQkJCSgodW5zaWduZWQgY2hhciAqKSAmYWRyY250KVswXSA9IGluYih0bXBvcnQpOworCQkJCWlmIChkZXYtPmlkW2NdW3RhcmdldF9pZF0ubGFzdF9sZW4gIT0gYWRyY250KQorCQkJCXsKKwkJCSAgIAkJayA9IGRldi0+aWRbY11bdGFyZ2V0X2lkXS5sYXN0X2xlbjsKKwkJCSAgIAkJayAtPSBhZHJjbnQ7CisJCQkgICAJCWRldi0+aWRbY11bdGFyZ2V0X2lkXS50cmFuX2xlbiA9IGs7CQkJICAgCisJCQkgICAJZGV2LT5pZFtjXVt0YXJnZXRfaWRdLmxhc3RfbGVuID0gYWRyY250OwkJCSAgIAorCQkJCX0KKyNpZmRlZiBFRF9EQkdQCisJCQkJcHJpbnRrKCJ0bXBvcnQgPSAleCBkZXYtPmlkW2NdW3RhcmdldF9pZF0ubGFzdF9sZW4gPSAlZCBkZXYtPmlkW2NdW3RhcmdldF9pZF0udHJhbl9sZW4gPSAlZFxuIix0bXBvcnQsZGV2LT5pZFtjXVt0YXJnZXRfaWRdLmxhc3RfbGVuLGRldi0+aWRbY11bdGFyZ2V0X2lkXS50cmFuX2xlbik7CisjZW5kaWYJCQorCQkJfQorCisJCQkvKgorCQkJICogICAgICBGbGlwIHdpZGUKKwkJCSAqLwkJCQorCQkJaWYgKGRldi0+d2lkZV9pZFtjXSAhPSAwKSB7CisJCQkJdG1wb3J0ID0gd29ya3BvcnQgKyAweDFiOworCQkJCW91dGIoMHgwMSwgdG1wb3J0KTsKKwkJCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHgwMSkgIT0gMHgwMSkgeworCQkJCQlvdXRiKDB4MDEsIHRtcG9ydCk7CisJCQkJfQorCQkJfQkJCisJCQkvKgorCQkJICoJSXNzdWUgbW9yZSBjb21tYW5kcworCQkJICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZShkZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwkJCSAJCQkgCisJCQlpZiAoKChkZXYtPnF1aGRbY10gIT0gZGV2LT5xdWVuZFtjXSkgfHwgKGRldi0+bGFzdF9jbWRbY10gIT0gMHhmZikpICYmCisJCQkgICAgKGRldi0+aW5fc25kW2NdID09IDApKSB7CisjaWZkZWYgRURfREJHUAorCQkJCXByaW50aygiQ2FsbCBzZW50X3M4NzBcbiIpOworI2VuZGlmCQkJCQorCQkJCXNlbmRfczg3MChkZXYsYyk7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQkvKgorCQkJICoJRG9uZQorCQkJICovCisJCQlkZXYtPmluX2ludFtjXSA9IDA7CisjaWZkZWYgRURfREJHUAorCQkJCXByaW50aygiU3RhdHVzIDB4ODUgcmV0dXJuXG4iKTsKKyNlbmRpZgkJCQkKKwkJCWdvdG8gaGFuZGxlZDsKKwkJfQorCisJCWlmIChpID09IDB4NDApIHsKKwkJICAgICBkZXYtPmxhc3RfY21kW2NdIHw9IDB4NDA7CisJCSAgICAgZGV2LT5pbl9pbnRbY10gPSAwOworCQkgICAgIGdvdG8gaGFuZGxlZDsKKwkJfQorCisJCWlmIChpID09IDB4MjEpIHsKKwkJCWlmICgoZGV2LT5sYXN0X2NtZFtjXSAmIDB4ZjApICE9IDB4NDApIHsKKwkJCSAgIGRldi0+bGFzdF9jbWRbY10gPSAweGZmOworCQkJfQorCQkJdG1wb3J0IC09IDB4MDU7CisJCQlhZHJjbnQgPSAwOworCQkJKCh1bnNpZ25lZCBjaGFyICopICZhZHJjbnQpWzJdID0gaW5iKHRtcG9ydCsrKTsKKwkJCSgodW5zaWduZWQgY2hhciAqKSAmYWRyY250KVsxXSA9IGluYih0bXBvcnQrKyk7CisJCQkoKHVuc2lnbmVkIGNoYXIgKikgJmFkcmNudClbMF0gPSBpbmIodG1wb3J0KTsKKwkJCWsgPSBkZXYtPmlkW2NdW3RhcmdldF9pZF0ubGFzdF9sZW47CisJCQlrIC09IGFkcmNudDsKKwkJCWRldi0+aWRbY11bdGFyZ2V0X2lkXS50cmFuX2xlbiA9IGs7CisJCQlkZXYtPmlkW2NdW3RhcmdldF9pZF0ubGFzdF9sZW4gPSBhZHJjbnQ7CisJCQl0bXBvcnQgLT0gMHgwNDsKKwkJCW91dGIoMHg0MSwgdG1wb3J0KTsKKwkJCXRtcG9ydCArPSAweDA4OworCQkJb3V0YigweDA4LCB0bXBvcnQpOworCQkJZGV2LT5pbl9pbnRbY10gPSAwOworCQkJZ290byBoYW5kbGVkOworCQl9CisKKwkJaWYgKGRldi0+ZGV2X2lkID09IEFUUDg4NV9ERVZJRCkgeworCQkJaWYgKChpID09IDB4NGMpIHx8IChpID09IDB4NGQpIHx8IChpID09IDB4OGMpIHx8IChpID09IDB4OGQpKSB7CisJCSAgIAkJaWYgKChpID09IDB4NGMpIHx8IChpID09IDB4OGMpKSAKKwkJICAgICAgCQkJaT0weDQ4OworCQkgICAJCWVsc2UgCisJCSAgICAgIAkJCWk9MHg0OTsKKwkJICAgCX0JCisJCQkKKwkJfQorCQlpZiAoKGkgPT0gMHg4MCkgfHwgKGkgPT0gMHg4ZikpIHsKKyNpZmRlZiBFRF9EQkdQCisJCQlwcmludGsoS0VSTl9ERUJVRyAiRGV2aWNlIHJlc2VsZWN0XG4iKTsKKyNlbmRpZgkJCQorCQkJbHVuID0gMDsKKwkJCXRtcG9ydCAtPSAweDA3OworCQkJaWYgKGNtZHAgPT0gMHg0NCB8fCBpPT0weDgwKSB7CisJCQkJdG1wb3J0ICs9IDB4MGQ7CisJCQkJbHVuID0gaW5iKHRtcG9ydCkgJiAweDA3OworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKGRldi0+bGFzdF9jbWRbY10gJiAweGYwKSAhPSAweDQwKSB7CisJCQkJICAgZGV2LT5sYXN0X2NtZFtjXSA9IDB4ZmY7CisJCQkJfQorCQkJCWlmIChjbWRwID09IDB4NDEpIHsKKyNpZmRlZiBFRF9EQkdQCisJCQkJCXByaW50aygiY21kcCA9IDB4NDFcbiIpOworI2VuZGlmCQkJCQkJCisJCQkJCXRtcG9ydCArPSAweDAyOworCQkJCQlhZHJjbnQgPSAwOworCQkJCQkoKHVuc2lnbmVkIGNoYXIgKikgJmFkcmNudClbMl0gPSBpbmIodG1wb3J0KyspOworCQkJCQkoKHVuc2lnbmVkIGNoYXIgKikgJmFkcmNudClbMV0gPSBpbmIodG1wb3J0KyspOworCQkJCQkoKHVuc2lnbmVkIGNoYXIgKikgJmFkcmNudClbMF0gPSBpbmIodG1wb3J0KTsKKwkJCQkJayA9IGRldi0+aWRbY11bdGFyZ2V0X2lkXS5sYXN0X2xlbjsKKwkJCQkJayAtPSBhZHJjbnQ7CisJCQkJCWRldi0+aWRbY11bdGFyZ2V0X2lkXS50cmFuX2xlbiA9IGs7CisJCQkJCWRldi0+aWRbY11bdGFyZ2V0X2lkXS5sYXN0X2xlbiA9IGFkcmNudDsKKwkJCQkJdG1wb3J0ICs9IDB4MDQ7CisJCQkJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJCQkJZGV2LT5pbl9pbnRbY10gPSAwOworCQkJCQlnb3RvIGhhbmRsZWQ7CisJCQkJfSBlbHNlIHsKKyNpZmRlZiBFRF9EQkdQCisJCQkJCXByaW50aygiY21kcCAhPSAweDQxXG4iKTsKKyNlbmRpZgkJCQkJCQorCQkJCQlvdXRiKDB4NDYsIHRtcG9ydCk7CisJCQkJCWRldi0+aWRbY11bdGFyZ2V0X2lkXS5kaXJjdCA9IDB4MDA7CisJCQkJCXRtcG9ydCArPSAweDAyOworCQkJCQlvdXRiKDB4MDAsIHRtcG9ydCsrKTsKKwkJCQkJb3V0YigweDAwLCB0bXBvcnQrKyk7CisJCQkJCW91dGIoMHgwMCwgdG1wb3J0KyspOworCQkJCQl0bXBvcnQgKz0gMHgwMzsKKwkJCQkJb3V0YigweDA4LCB0bXBvcnQpOworCQkJCQlkZXYtPmluX2ludFtjXSA9IDA7CisJCQkJCWdvdG8gaGFuZGxlZDsKKwkJCQl9CisJCQl9CisJCQlpZiAoZGV2LT5sYXN0X2NtZFtjXSAhPSAweGZmKSB7CisJCQkgICBkZXYtPmxhc3RfY21kW2NdIHw9IDB4NDA7CisJCQl9CisJCQlpZiAoZGV2LT5kZXZfaWQgPT0gQVRQODg1X0RFVklEKSB7CisJCQkJaiA9IGluYihkZXYtPmJhc2Vwb3J0ICsgMHgyOSkgJiAweGZlOworCQkJCW91dGIoaiwgZGV2LT5iYXNlcG9ydCArIDB4MjkpOworCQkJCXRtcG9ydCA9IHdvcmtwb3J0ICsgMHgxNjsKKwkJCX0gZWxzZSB7CisJCQkJdG1wb3J0ID0gd29ya3BvcnQgKyAweDEwOworCQkJCW91dGIoMHg0NSwgdG1wb3J0KTsKKwkJCQl0bXBvcnQgKz0gMHgwNjsJCQkJCisJCQl9CisJCQkKKwkJCXRhcmdldF9pZCA9IGluYih0bXBvcnQpOworCQkJLyoKKwkJCSAqCVJlbWFwIHdpZGUgaWRlbnRpZmllcnMKKwkJCSAqLworCQkJaWYgKCh0YXJnZXRfaWQgJiAweDEwKSAhPSAwKSB7CisJCQkJdGFyZ2V0X2lkID0gKHRhcmdldF9pZCAmIDB4MDcpIHwgMHgwODsKKwkJCX0gZWxzZSB7CisJCQkJdGFyZ2V0X2lkICY9IDB4MDc7CisJCQl9CisJCQlpZiAoZGV2LT5kZXZfaWQgPT0gQVRQODg1X0RFVklEKSB7CisJCQkJdG1wb3J0ID0gd29ya3BvcnQgKyAweDEwOworCQkJCW91dGIoMHg0NSwgdG1wb3J0KTsKKwkJCX0KKwkJCXdvcmtyZXEgPSBkZXYtPmlkW2NdW3RhcmdldF9pZF0uY3Vycl9yZXE7CisjaWZkZWYgRURfREJHUAkJCQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNoYW5uZWwgPSAlZCBJRCA9ICVkIExVTiA9ICVkIENEQiIsYyx3b3JrcmVxLT5kZXZpY2UtPmlkLHdvcmtyZXEtPmRldmljZS0+bHVuKTsKKwkJCWZvcihsPTA7bDx3b3JrcmVxLT5jbWRfbGVuO2wrKykKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiICV4Iix3b3JrcmVxLT5jbW5kW2xdKTsKKwkJCX0KKyNlbmRpZgkKKwkJCQorCQkJdG1wb3J0ID0gd29ya3BvcnQgKyAweDBmOworCQkJb3V0YihsdW4sIHRtcG9ydCk7CisJCQl0bXBvcnQgKz0gMHgwMjsKKwkJCW91dGIoZGV2LT5pZFtjXVt0YXJnZXRfaWRdLmRldnNwLCB0bXBvcnQrKyk7CisJCQlhZHJjbnQgPSBkZXYtPmlkW2NdW3RhcmdldF9pZF0udHJhbl9sZW47CisJCQlrID0gZGV2LT5pZFtjXVt0YXJnZXRfaWRdLmxhc3RfbGVuOworCisJCQlvdXRiKCgodW5zaWduZWQgY2hhciAqKSAmaylbMl0sIHRtcG9ydCsrKTsKKwkJCW91dGIoKCh1bnNpZ25lZCBjaGFyICopICZrKVsxXSwgdG1wb3J0KyspOworCQkJb3V0YigoKHVuc2lnbmVkIGNoYXIgKikgJmspWzBdLCB0bXBvcnQrKyk7CisjaWZkZWYgRURfREJHUAkJCQorCQkJcHJpbnRrKCJrICV4LCBrWzBdIDB4JXgga1sxXSAweCV4IGtbMl0gMHgleFxuIiwgaywgaW5iKHRtcG9ydC0xKSwgaW5iKHRtcG9ydC0yKSwgaW5iKHRtcG9ydC0zKSk7CisjZW5kaWYJCQkKKwkJCS8qIFJlbWFwIHdpZGUgKi8KKwkJCWogPSB0YXJnZXRfaWQ7CisJCQlpZiAodGFyZ2V0X2lkID4gNykgeworCQkJCWogPSAoaiAmIDB4MDcpIHwgMHg0MDsKKwkJCX0KKwkJCS8qIEFkZCBkaXJlY3Rpb24gKi8KKwkJCWogfD0gZGV2LT5pZFtjXVt0YXJnZXRfaWRdLmRpcmN0OworCQkJb3V0YihqLCB0bXBvcnQrKyk7CisJCQlvdXRiKDB4ODAsdG1wb3J0KTsKKwkJCQorCQkJLyogZW5hYmxlIDMyIGJpdCBmaWZvIHRyYW5zZmVyICovCQorCQkJaWYgKGRldi0+ZGV2X2lkID09IEFUUDg4NV9ERVZJRCkgeworCQkJCXRtcGNpcCA9IGRldi0+cGNpcG9ydFtjXSArIDE7CisJCQkJaT1pbmIodG1wY2lwKSAmIDB4ZjM7CisJCQkJLy9qPXdvcmtyZXEtPmNtbmRbMF07CSAgICAJCSAgICAJCisJCQkJaWYgKCh3b3JrcmVxLT5jbW5kWzBdID09IDB4MDgpIHx8ICh3b3JrcmVxLT5jbW5kWzBdID09IDB4MjgpIHx8ICh3b3JrcmVxLT5jbW5kWzBdID09IDB4MGEpIHx8ICh3b3JrcmVxLT5jbW5kWzBdID09IDB4MmEpKSB7CisJCQkJICAgaSB8PSAweDBjOworCQkJCX0KKwkJCQlvdXRiKGksdG1wY2lwKTsJCSAgICAJCSAgICAJCQorCQkJfSBlbHNlIGlmICgoZGV2LT5kZXZfaWQgPT0gQVRQODgwX0RFVklEMSkgfHwKKwkgICAgCQkgICAgCSAgIChkZXYtPmRldl9pZCA9PSBBVFA4ODBfREVWSUQyKSApIHsKKwkJCQl0bXBvcnQgPSB3b3JrcG9ydCAtIDB4MDU7CisJCQkJaWYgKCh3b3JrcmVxLT5jbW5kWzBdID09IDB4MDgpIHx8ICh3b3JrcmVxLT5jbW5kWzBdID09IDB4MjgpIHx8ICh3b3JrcmVxLT5jbW5kWzBdID09IDB4MGEpIHx8ICh3b3JrcmVxLT5jbW5kWzBdID09IDB4MmEpKSB7CisJCQkJCW91dGIoKHVuc2lnbmVkIGNoYXIpICgoaW5iKHRtcG9ydCkgJiAweDNmKSB8IDB4YzApLCB0bXBvcnQpOworCQkJCX0gZWxzZSB7CisJCQkJCW91dGIoKHVuc2lnbmVkIGNoYXIpIChpbmIodG1wb3J0KSAmIDB4M2YpLCB0bXBvcnQpOworCQkJCX0KKwkJCX0gZWxzZSB7CQkJCQorCQkJCXRtcG9ydCA9IHdvcmtwb3J0ICsgMHgzYTsKKwkJCQlpZiAoKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgwOCkgfHwgKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgyOCkgfHwgKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgwYSkgfHwgKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgyYSkpIHsKKwkJCQkJb3V0YigodW5zaWduZWQgY2hhcikgKChpbmIodG1wb3J0KSAmIDB4ZjMpIHwgMHgwOCksIHRtcG9ydCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJb3V0YigodW5zaWduZWQgY2hhcikgKGluYih0bXBvcnQpICYgMHhmMyksIHRtcG9ydCk7CisJCQkJfQkJCQkJCQkJCQkJCQkJCisJCQl9CQorCQkJdG1wb3J0ID0gd29ya3BvcnQgKyAweDFiOworCQkJaiA9IDA7CisJCQlpZCA9IDE7CisJCQlpZCA9IGlkIDw8IHRhcmdldF9pZDsKKwkJCS8qCisJCQkgKglJcyB0aGlzIGEgd2lkZSBkZXZpY2UKKwkJCSAqLworCQkJaWYgKChpZCAmIGRldi0+d2lkZV9pZFtjXSkgIT0gMCkgeworCQkJCWogfD0gMHgwMTsKKwkJCX0KKwkJCW91dGIoaiwgdG1wb3J0KTsKKwkJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDAxKSAhPSBqKSB7CisJCQkJb3V0YihqLHRtcG9ydCk7CisJCQl9CisJCQlpZiAoZGV2LT5pZFtjXVt0YXJnZXRfaWRdLmxhc3RfbGVuID09IDApIHsKKwkJCQl0bXBvcnQgPSB3b3JrcG9ydCArIDB4MTg7CisJCQkJb3V0YigweDA4LCB0bXBvcnQpOworCQkJCWRldi0+aW5faW50W2NdID0gMDsKKyNpZmRlZiBFRF9EQkdQCisJCQkJcHJpbnRrKCJkZXYtPmlkW2NdW3RhcmdldF9pZF0ubGFzdF9sZW4gPSAwXG4iKTsKKyNlbmRpZgkJCQkJCisJCQkJZ290byBoYW5kbGVkOworCQkJfQorI2lmZGVmIEVEX0RCR1AKKwkJCXByaW50aygidGFyZ2V0X2lkID0gJWQgYWRyY250ID0gJWRcbiIsdGFyZ2V0X2lkLGFkcmNudCk7CisjZW5kaWYJCQkKKwkJCXByZCA9IGRldi0+aWRbY11bdGFyZ2V0X2lkXS5wcmRfcG9zOworCQkJd2hpbGUgKGFkcmNudCAhPSAwKSB7CisJCQkJaWQgPSAoKHVuc2lnbmVkIHNob3J0IGludCAqKXByZClbMl07CisJCQkJaWYgKGlkID09IDApIHsKKwkJCQkJayA9IDB4MTAwMDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJayA9IGlkOworCQkJCX0KKwkJCQlpZiAoayA+IGFkcmNudCkgeworCQkJCQkoKHVuc2lnbmVkIHNob3J0IGludCAqKXByZClbMl0gPSAodW5zaWduZWQgc2hvcnQgaW50KQorCQkJCQkgICAgKGsgLSBhZHJjbnQpOworCQkJCQkoKHVuc2lnbmVkIGxvbmcgKilwcmQpWzBdICs9IGFkcmNudDsKKwkJCQkJYWRyY250ID0gMDsKKwkJCQkJZGV2LT5pZFtjXVt0YXJnZXRfaWRdLnByZF9wb3MgPSBwcmQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJYWRyY250IC09IGs7CisJCQkJCWRldi0+aWRbY11bdGFyZ2V0X2lkXS5wcmRhZGRyICs9IDB4MDg7CisJCQkJCXByZCArPSAweDA4OworCQkJCQlpZiAoYWRyY250ID09IDApIHsKKwkJCQkJCWRldi0+aWRbY11bdGFyZ2V0X2lkXS5wcmRfcG9zID0gcHJkOworCQkJCQl9CisJCQkJfQkJCQkKKwkJCX0KKwkJCXRtcGNpcCA9IGRldi0+cGNpcG9ydFtjXSArIDB4MDQ7CisJCQlvdXRsKGRldi0+aWRbY11bdGFyZ2V0X2lkXS5wcmRhZGRyLCB0bXBjaXApOworI2lmZGVmIEVEX0RCR1AKKwkJCXByaW50aygiZGV2LT5pZFslZF1bJWRdLnByZGFkZHIgMHglOHhcbiIsIGMsIHRhcmdldF9pZCwgZGV2LT5pZFtjXVt0YXJnZXRfaWRdLnByZGFkZHIpOworI2VuZGlmCisJCQlpZiAoZGV2LT5kZXZfaWQgPT0gQVRQODg1X0RFVklEKSB7CisJCQkJdG1wY2lwIC09IDB4MDQ7CisJCQl9IGVsc2UgeworCQkJCXRtcGNpcCAtPSAweDAyOworCQkJCW91dGIoMHgwNiwgdG1wY2lwKTsKKwkJCQlvdXRiKDB4MDAsIHRtcGNpcCk7CisJCQkJdG1wY2lwIC09IDB4MDI7CisJCQl9CisJCQl0bXBvcnQgPSB3b3JrcG9ydCArIDB4MTg7CisJCQkvKgorCQkJICoJQ2hlY2sgdHJhbnNmZXIgZGlyZWN0aW9uCisJCQkgKi8KKwkJCWlmIChkZXYtPmlkW2NdW3RhcmdldF9pZF0uZGlyY3QgIT0gMCkgeworCQkJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJCQlvdXRiKDB4MDEsIHRtcGNpcCk7CisJCQkJZGV2LT5pbl9pbnRbY10gPSAwOworI2lmZGVmIEVEX0RCR1AKKwkJCQlwcmludGsoInN0YXR1cyAweDgwIHJldHVybiBkaXJjdCAhPSAwXG4iKTsKKyNlbmRpZgkJCQkKKwkJCQlnb3RvIGhhbmRsZWQ7CisJCQl9CisJCQlvdXRiKDB4MDgsIHRtcG9ydCk7CisJCQlvdXRiKDB4MDksIHRtcGNpcCk7CisJCQlkZXYtPmluX2ludFtjXSA9IDA7CisjaWZkZWYgRURfREJHUAorCQkJcHJpbnRrKCJzdGF0dXMgMHg4MCByZXR1cm4gZGlyY3QgPSAwXG4iKTsKKyNlbmRpZgkJCQorCQkJZ290byBoYW5kbGVkOworCQl9CisKKwkJLyoKKwkJICoJQ3VycmVudCBzY3NpIHJlcXVlc3Qgb24gdGhpcyB0YXJnZXQKKwkJICovCisKKwkJd29ya3JlcSA9IGRldi0+aWRbY11bdGFyZ2V0X2lkXS5jdXJyX3JlcTsKKworCQlpZiAoaSA9PSAweDQyKSB7CisJCQlpZiAoKGRldi0+bGFzdF9jbWRbY10gJiAweGYwKSAhPSAweDQwKQorCQkJeworCQkJICAgZGV2LT5sYXN0X2NtZFtjXSA9IDB4ZmY7CisJCQl9CisJCQllcnJzdHVzID0gMHgwMjsKKwkJCXdvcmtyZXEtPnJlc3VsdCA9IGVycnN0dXM7CisJCQlnb3RvIGdvXzQyOworCQl9CisJCWlmIChpID09IDB4MTYpIHsKKwkJCWlmICgoZGV2LT5sYXN0X2NtZFtjXSAmIDB4ZjApICE9IDB4NDApIHsKKwkJCSAgIGRldi0+bGFzdF9jbWRbY10gPSAweGZmOworCQkJfQorCQkJZXJyc3R1cyA9IDA7CisJCQl0bXBvcnQgLT0gMHgwODsKKwkJCWVycnN0dXMgPSBpbmIodG1wb3J0KTsKKwkJCWlmICgoKGRldi0+cjFmW2NdW3RhcmdldF9pZF0gJiAweDEwKSAhPSAwKSYmKGRldi0+ZGV2X2lkPT1BVFA4ODVfREVWSUQpKSB7CisJCQkgICBwcmludGsoS0VSTl9XQVJOSU5HICJBRUM2NzE2MiBDUkMgRVJST1IgIVxuIik7CisJCQkgICBlcnJzdHVzID0gMHgwMjsKKwkJCX0KKwkJCXdvcmtyZXEtPnJlc3VsdCA9IGVycnN0dXM7Citnb180MjoKKwkJCWlmIChkZXYtPmRldl9pZCA9PSBBVFA4ODVfREVWSUQpIHsJCQorCQkJCWogPSBpbmIoZGV2LT5iYXNlcG9ydCArIDB4MjkpIHwgMHgwMTsKKwkJCQlvdXRiKGosIGRldi0+YmFzZXBvcnQgKyAweDI5KTsKKwkJCX0KKwkJCS8qCisJCQkgKglDb21wbGV0ZSB0aGUgY29tbWFuZAorCQkJICovCisJCQlpZiAod29ya3JlcS0+dXNlX3NnKSB7CisJCQkJcGNpX3VubWFwX3NnKGRldi0+cGRldiwKKwkJCQkJKHN0cnVjdCBzY2F0dGVybGlzdCAqKXdvcmtyZXEtPmJ1ZmZlciwKKwkJCQkJd29ya3JlcS0+dXNlX3NnLAorCQkJCQl3b3JrcmVxLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCQl9IGVsc2UgaWYgKHdvcmtyZXEtPnJlcXVlc3RfYnVmZmxlbiAmJgorCQkJCQl3b3JrcmVxLT5zY19kYXRhX2RpcmVjdGlvbiAhPSBETUFfTk9ORSkgeworCQkJCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wZGV2LAorCQkJCQl3b3JrcmVxLT5TQ3AuZG1hX2hhbmRsZSwKKwkJCQkJd29ya3JlcS0+cmVxdWVzdF9idWZmbGVuLAorCQkJCQl3b3JrcmVxLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCQl9CQkJCisJCQlzcGluX2xvY2tfaXJxc2F2ZShkZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQkJKCp3b3JrcmVxLT5zY3NpX2RvbmUpICh3b3JrcmVxKTsKKyNpZmRlZiBFRF9EQkdQCisJCQkgICBwcmludGsoIndvcmtyZXEtPnNjc2lfZG9uZVxuIik7CisjZW5kaWYJCisJCQkvKgorCQkJICoJQ2xlYXIgaXQgb2ZmIHRoZSBxdWV1ZQorCQkJICovCisJCQlkZXYtPmlkW2NdW3RhcmdldF9pZF0uY3Vycl9yZXEgPSBOVUxMOworCQkJZGV2LT53b3JraW5nW2NdLS07CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQkvKgorCQkJICogICAgICBUYWtlIGl0IGJhY2sgd2lkZQorCQkJICovCisJCQlpZiAoZGV2LT53aWRlX2lkW2NdICE9IDApIHsKKwkJCQl0bXBvcnQgPSB3b3JrcG9ydCArIDB4MWI7CisJCQkJb3V0YigweDAxLCB0bXBvcnQpOworCQkJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDAxKSAhPSAweDAxKSB7CisJCQkJCW91dGIoMHgwMSwgdG1wb3J0KTsKKwkJCQl9ICAgICAgIAorCQkJfSAKKwkJCS8qCisJCQkgKglJZiB0aGVyZSBpcyBzdHVmZiB0byBzZW5kIGFuZCBub3RoaW5nIGdvaW5nIHRoZW4gc2VuZCBpdAorCQkJICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZShkZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQkJaWYgKCgoZGV2LT5sYXN0X2NtZFtjXSAhPSAweGZmKSB8fCAoZGV2LT5xdWhkW2NdICE9IGRldi0+cXVlbmRbY10pKSAmJgorCQkJICAgIChkZXYtPmluX3NuZFtjXSA9PSAwKSkgeworI2lmZGVmIEVEX0RCR1AKKwkJCSAgIHByaW50aygiQ2FsbCBzZW50X3M4NzAoc2NzaV9kb25lKVxuIik7CisjZW5kaWYJCQkJICAgCisJCQkgICBzZW5kX3M4NzAoZGV2LGMpOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQkJZGV2LT5pbl9pbnRbY10gPSAwOworCQkJZ290byBoYW5kbGVkOworCQl9CisJCWlmICgoZGV2LT5sYXN0X2NtZFtjXSAmIDB4ZjApICE9IDB4NDApIHsKKwkJICAgZGV2LT5sYXN0X2NtZFtjXSA9IDB4ZmY7CisJCX0KKwkJaWYgKGkgPT0gMHg0ZikgeworCQkJaSA9IDB4ODk7CisJCX0KKwkJaSAmPSAweDBmOworCQlpZiAoaSA9PSAweDA5KSB7CisJCQl0bXBjaXAgKz0gNDsKKwkJCW91dGwoZGV2LT5pZFtjXVt0YXJnZXRfaWRdLnByZGFkZHIsIHRtcGNpcCk7CisJCQl0bXBjaXAgPSB0bXBjaXAgLSAyOworCQkJb3V0YigweDA2LCB0bXBjaXApOworCQkJb3V0YigweDAwLCB0bXBjaXApOworCQkJdG1wY2lwID0gdG1wY2lwIC0gMjsKKwkJCXRtcG9ydCA9IHdvcmtwb3J0ICsgMHgxMDsKKwkJCW91dGIoMHg0MSwgdG1wb3J0KTsKKwkJCWlmIChkZXYtPmRldl9pZCA9PSBBVFA4ODVfREVWSUQpIHsKKwkJCQl0bXBvcnQgKz0gMjsKKwkJCQlrID0gZGV2LT5pZFtjXVt0YXJnZXRfaWRdLmxhc3RfbGVuOworCQkJCW91dGIoKHVuc2lnbmVkIGNoYXIpICgoKHVuc2lnbmVkIGNoYXIgKikgKCZrKSlbMl0pLCB0bXBvcnQrKyk7CisJCQkJb3V0YigodW5zaWduZWQgY2hhcikgKCgodW5zaWduZWQgY2hhciAqKSAoJmspKVsxXSksIHRtcG9ydCsrKTsKKwkJCQlvdXRiKCh1bnNpZ25lZCBjaGFyKSAoKCh1bnNpZ25lZCBjaGFyICopICgmaykpWzBdKSwgdG1wb3J0KTsKKwkJCQlkZXYtPmlkW2NdW3RhcmdldF9pZF0uZGlyY3QgPSAweDAwOworCQkJCXRtcG9ydCArPSAweDA0OworCQkJfSBlbHNlIHsKKwkJCQlkZXYtPmlkW2NdW3RhcmdldF9pZF0uZGlyY3QgPSAweDAwOworCQkJCXRtcG9ydCArPSAweDA4OwkJCQkKKwkJCX0KKwkJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJCW91dGIoMHgwOSwgdG1wY2lwKTsKKwkJCWRldi0+aW5faW50W2NdID0gMDsKKwkJCWdvdG8gaGFuZGxlZDsKKwkJfQorCQlpZiAoaSA9PSAweDA4KSB7CisJCQl0bXBjaXAgKz0gNDsKKwkJCW91dGwoZGV2LT5pZFtjXVt0YXJnZXRfaWRdLnByZGFkZHIsIHRtcGNpcCk7CisJCQl0bXBjaXAgPSB0bXBjaXAgLSAyOworCQkJb3V0YigweDA2LCB0bXBjaXApOworCQkJb3V0YigweDAwLCB0bXBjaXApOworCQkJdG1wY2lwID0gdG1wY2lwIC0gMjsKKwkJCXRtcG9ydCA9IHdvcmtwb3J0ICsgMHgxMDsKKwkJCW91dGIoMHg0MSwgdG1wb3J0KTsKKwkJCWlmIChkZXYtPmRldl9pZCA9PSBBVFA4ODVfREVWSUQpIHsJCQorCQkJCXRtcG9ydCArPSAyOworCQkJCWsgPSBkZXYtPmlkW2NdW3RhcmdldF9pZF0ubGFzdF9sZW47CisJCQkJb3V0YigodW5zaWduZWQgY2hhcikgKCgodW5zaWduZWQgY2hhciAqKSAoJmspKVsyXSksIHRtcG9ydCsrKTsKKwkJCQlvdXRiKCh1bnNpZ25lZCBjaGFyKSAoKCh1bnNpZ25lZCBjaGFyICopICgmaykpWzFdKSwgdG1wb3J0KyspOworCQkJCW91dGIoKHVuc2lnbmVkIGNoYXIpICgoKHVuc2lnbmVkIGNoYXIgKikgKCZrKSlbMF0pLCB0bXBvcnQrKyk7CisJCQl9IGVsc2UgeworCQkJCXRtcG9ydCArPSA1OworCQkJfQorCQkJb3V0YigodW5zaWduZWQgY2hhcikgKGluYih0bXBvcnQpIHwgMHgyMCksIHRtcG9ydCk7CisJCQlkZXYtPmlkW2NdW3RhcmdldF9pZF0uZGlyY3QgPSAweDIwOworCQkJdG1wb3J0ICs9IDB4MDM7CisJCQlvdXRiKDB4MDgsIHRtcG9ydCk7CisJCQlvdXRiKDB4MDEsIHRtcGNpcCk7CisJCQlkZXYtPmluX2ludFtjXSA9IDA7CisJCQlnb3RvIGhhbmRsZWQ7CisJCX0KKwkJdG1wb3J0IC09IDB4MDc7CisJCWlmIChpID09IDB4MGEpIHsKKwkJCW91dGIoMHgzMCwgdG1wb3J0KTsKKwkJfSBlbHNlIHsKKwkJCW91dGIoMHg0NiwgdG1wb3J0KTsKKwkJfQorCQlkZXYtPmlkW2NdW3RhcmdldF9pZF0uZGlyY3QgPSAweDAwOworCQl0bXBvcnQgKz0gMHgwMjsKKwkJb3V0YigweDAwLCB0bXBvcnQrKyk7CisJCW91dGIoMHgwMCwgdG1wb3J0KyspOworCQlvdXRiKDB4MDAsIHRtcG9ydCsrKTsKKwkJdG1wb3J0ICs9IDB4MDM7CisJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJZGV2LT5pbl9pbnRbY10gPSAwOworCQlnb3RvIGhhbmRsZWQ7CisJfSBlbHNlIHsKKy8vCQl0bXBvcnQgPSB3b3JrcG9ydCArIDB4MTc7CisvLwkJaW5iKHRtcG9ydCk7CisvLwkJZGV2LT53b3JraW5nW2NdID0gMDsKKwkJZGV2LT5pbl9pbnRbY10gPSAwOworCQlnb3RvIGhhbmRsZWQ7CisJfQorCQoraGFuZGxlZDoKKyNpZmRlZiBFRF9EQkdQCisJcHJpbnRrKCJhdHA4NzB1X2ludHJfaGFuZGxlIGV4aXRcbiIpOworI2VuZGlmCQkJCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorLyoqCisgKglhdHA4NzB1X3F1ZXVlY29tbWFuZAktCVF1ZXVlIFNDU0kgY29tbWFuZAorICoJQHJlcV9wOiByZXF1ZXN0IGJsb2NrCisgKglAZG9uZTogY29tcGxldGlvbiBmdW5jdGlvbgorICoKKyAqCVF1ZXVlIGEgY29tbWFuZCB0byB0aGUgQVRQIHF1ZXVlLiBDYWxsZWQgd2l0aCB0aGUgaG9zdCBsb2NrIGhlbGQuCisgKi8KK3N0YXRpYyBpbnQgYXRwODcwdV9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqIHJlcV9wLCAKKwkJCSB2b2lkICgqZG9uZSkgKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJdW5zaWduZWQgY2hhciBjOworCXVuc2lnbmVkIGludCB0bXBvcnQsbTsJCisJc3RydWN0IGF0cF91bml0ICpkZXY7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKworCWMgPSByZXFfcC0+ZGV2aWNlLT5jaGFubmVsOwkKKwlyZXFfcC0+c2Vuc2VfYnVmZmVyWzBdPTA7CisJcmVxX3AtPnJlc2lkID0gMDsKKwlpZiAocmVxX3AtPmRldmljZS0+Y2hhbm5lbCA+IDEpIHsKKwkJcmVxX3AtPnJlc3VsdCA9IDB4MDAwNDAwMDA7CisJCWRvbmUocmVxX3ApOworI2lmZGVmIEVEX0RCR1AJCQorCQlwcmludGsoImF0cDg3MHVfcXVldWVjb21tYW5kIDogcmVxX3AtPmRldmljZS0+Y2hhbm5lbCA+IDFcbiIpOwkKKyNlbmRpZgkJCQorCQlyZXR1cm4gMDsKKwl9CisKKwlob3N0ID0gcmVxX3AtPmRldmljZS0+aG9zdDsKKwlkZXYgPSAoc3RydWN0IGF0cF91bml0ICopJmhvc3QtPmhvc3RkYXRhOworCQkKKworCQkKKwltID0gMTsKKwltID0gbSA8PCByZXFfcC0+ZGV2aWNlLT5pZDsKKworCS8qCisJICogICAgICBGYWtlIGEgdGltZW91dCBmb3IgbWlzc2luZyB0YXJnZXRzCisJICovCisKKwlpZiAoKG0gJiBkZXYtPmFjdGl2ZV9pZFtjXSkgPT0gMCkgeworCQlyZXFfcC0+cmVzdWx0ID0gMHgwMDA0MDAwMDsKKwkJZG9uZShyZXFfcCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChkb25lKSB7CisJCXJlcV9wLT5zY3NpX2RvbmUgPSBkb25lOworCX0gZWxzZSB7CisjaWZkZWYgRURfREJHUAkJCisJCXByaW50ayggImF0cDg3MHVfcXVldWVjb21tYW5kOiBkb25lIGNhbid0IGJlIE5VTExcbiIpOworI2VuZGlmCQkKKwkJcmVxX3AtPnJlc3VsdCA9IDA7CisJCWRvbmUocmVxX3ApOworCQlyZXR1cm4gMDsKKwl9CisJCisJLyoKKwkgKglDb3VudCBuZXcgY29tbWFuZAorCSAqLworCWRldi0+cXVlbmRbY10rKzsKKwlpZiAoZGV2LT5xdWVuZFtjXSA+PSBxY250KSB7CisJCWRldi0+cXVlbmRbY10gPSAwOworCX0KKwkKKwkvKgorCSAqCUNoZWNrIHF1ZXVlIHN0YXRlCisJICovCisJaWYgKGRldi0+cXVoZFtjXSA9PSBkZXYtPnF1ZW5kW2NdKSB7CisJCWlmIChkZXYtPnF1ZW5kW2NdID09IDApIHsKKwkJCWRldi0+cXVlbmRbY10gPSBxY250OworCQl9CisjaWZkZWYgRURfREJHUAkJCisJCXByaW50aygiYXRwODcwdV9xdWV1ZWNvbW1hbmQgOiBkZXYtPnF1aGRbY10gPT0gZGV2LT5xdWVuZFtjXVxuIik7CisjZW5kaWYJCQorCQlkZXYtPnF1ZW5kW2NdLS07CisJCXJlcV9wLT5yZXN1bHQgPSAweDAwMDIwMDAwOworCQlkb25lKHJlcV9wKTsJCisJCXJldHVybiAwOworCX0KKwlkZXYtPnF1ZXJlcVtjXVtkZXYtPnF1ZW5kW2NdXSA9IHJlcV9wOworCXRtcG9ydCA9IGRldi0+aW9wb3J0W2NdICsgMHgxYzsKKyNpZmRlZiBFRF9EQkdQCQorCXByaW50aygiZGV2LT5pb3BvcnRbY10gPSAleCBpbmIodG1wb3J0KSA9ICV4IGRldi0+aW5faW50WyVkXSA9ICVkIGRldi0+aW5fc25kWyVkXSA9ICVkXG4iLGRldi0+aW9wb3J0W2NdLGluYih0bXBvcnQpLGMsZGV2LT5pbl9pbnRbY10sYyxkZXYtPmluX3NuZFtjXSk7CisjZW5kaWYKKwlpZiAoKGluYih0bXBvcnQpID09IDApICYmIChkZXYtPmluX2ludFtjXSA9PSAwKSAmJiAoZGV2LT5pbl9zbmRbY10gPT0gMCkpIHsKKyNpZmRlZiBFRF9EQkdQCisJCXByaW50aygiQ2FsbCBzZW50X3M4NzAoYXRwODcwdV9xdWV1ZWNvbW1hbmQpXG4iKTsKKyNlbmRpZgkJCisJCXNlbmRfczg3MChkZXYsYyk7CisJfQorI2lmZGVmIEVEX0RCR1AJCisJcHJpbnRrKCJhdHA4NzB1X3F1ZXVlY29tbWFuZCA6IGV4aXRcbiIpOworI2VuZGlmCQorCXJldHVybiAwOworfQorCisvKioKKyAqCXNlbmRfczg3MAktCXNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyCisgKglAaG9zdDogaG9zdAorICoKKyAqCU9uIGVudHJ5IHRoZXJlIGlzIHdvcmsgcXVldWVkIHRvIGJlIGRvbmUuIFdlIG1vdmUgc29tZSBvZiB0aGF0IHdvcmsgdG8gdGhlCisgKgljb250cm9sbGVyIGl0c2VsZi4gCisgKgorICoJQ2FsbGVyIGhvbGRzIHRoZSBob3N0IGxvY2suCisgKi8KK3N0YXRpYyB2b2lkIHNlbmRfczg3MChzdHJ1Y3QgYXRwX3VuaXQgKmRldix1bnNpZ25lZCBjaGFyIGMpCit7CisJdW5zaWduZWQgaW50IHRtcG9ydDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICp3b3JrcmVxOworCXVuc2lnbmVkIGludCBpOy8vLGs7CisJdW5zaWduZWQgY2hhciAgaiwgdGFyZ2V0X2lkOworCXVuc2lnbmVkIGNoYXIgKnByZDsKKwl1bnNpZ25lZCBzaG9ydCBpbnQgdG1wY2lwLCB3OworCXVuc2lnbmVkIGxvbmcgbCwgYnR0bCA9IDA7CisJdW5zaWduZWQgaW50IHdvcmtwb3J0OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dwbnQ7CisJdW5zaWduZWQgbG9uZyAgc2dfY291bnQ7CisKKwlpZiAoZGV2LT5pbl9zbmRbY10gIT0gMCkgeworI2lmZGVmIEVEX0RCR1AJCQorCQlwcmludGsoImNtbmQgaW5fc25kXG4iKTsKKyNlbmRpZgorCQlyZXR1cm47CisJfQorI2lmZGVmIEVEX0RCR1AKKwlwcmludGsoIlNlbnRfczg3MCBlbnRlclxuIik7CisjZW5kaWYKKwlkZXYtPmluX3NuZFtjXSA9IDE7CisJaWYgKChkZXYtPmxhc3RfY21kW2NdICE9IDB4ZmYpICYmICgoZGV2LT5sYXN0X2NtZFtjXSAmIDB4NDApICE9IDApKSB7CisJCWRldi0+bGFzdF9jbWRbY10gJj0gMHgwZjsKKwkJd29ya3JlcSA9IGRldi0+aWRbY11bZGV2LT5sYXN0X2NtZFtjXV0uY3Vycl9yZXE7CisJCWlmICh3b3JrcmVxICE9IE5VTEwpIHsJLyogY2hlY2sgTlVMTCBwb2ludGVyICovCisJCSAgIGdvdG8gY21kX3N1YnA7CisJCX0KKwkJZGV2LT5sYXN0X2NtZFtjXSA9IDB4ZmY7CQorCQlpZiAoZGV2LT5xdWhkW2NdID09IGRldi0+cXVlbmRbY10pIHsKKwkJICAgCWRldi0+aW5fc25kW2NdID0gMDsKKwkJICAgCXJldHVybiA7CisJCX0KKwl9CisJaWYgKChkZXYtPmxhc3RfY21kW2NdICE9IDB4ZmYpICYmIChkZXYtPndvcmtpbmdbY10gIT0gMCkpIHsKKwkgICAgIAlkZXYtPmluX3NuZFtjXSA9IDA7CisJICAgICAJcmV0dXJuIDsKKwl9CisJZGV2LT53b3JraW5nW2NdKys7CisJaiA9IGRldi0+cXVoZFtjXTsKKwlkZXYtPnF1aGRbY10rKzsKKwlpZiAoZGV2LT5xdWhkW2NdID49IHFjbnQpIHsKKwkJZGV2LT5xdWhkW2NdID0gMDsKKwl9CisJd29ya3JlcSA9IGRldi0+cXVlcmVxW2NdW2Rldi0+cXVoZFtjXV07CisJaWYgKGRldi0+aWRbY11bd29ya3JlcS0+ZGV2aWNlLT5pZF0uY3Vycl9yZXEgPT0gMCkgewkKKwkJZGV2LT5pZFtjXVt3b3JrcmVxLT5kZXZpY2UtPmlkXS5jdXJyX3JlcSA9IHdvcmtyZXE7CisJCWRldi0+bGFzdF9jbWRbY10gPSB3b3JrcmVxLT5kZXZpY2UtPmlkOworCQlnb3RvIGNtZF9zdWJwOworCX0JCisJZGV2LT5xdWhkW2NdID0gajsKKwlkZXYtPndvcmtpbmdbY10tLTsKKwlkZXYtPmluX3NuZFtjXSA9IDA7CisJcmV0dXJuOworY21kX3N1YnA6CisJd29ya3BvcnQgPSBkZXYtPmlvcG9ydFtjXTsKKwl0bXBvcnQgPSB3b3JrcG9ydCArIDB4MWY7CisJaWYgKChpbmIodG1wb3J0KSAmIDB4YjApICE9IDApIHsKKwkJZ290byBhYm9ydHNuZDsKKwl9CisJdG1wb3J0ID0gd29ya3BvcnQgKyAweDFjOworCWlmIChpbmIodG1wb3J0KSA9PSAwKSB7CisJCWdvdG8gb2t0b3NlbmQ7CisJfQorYWJvcnRzbmQ6CisjaWZkZWYgRURfREJHUAorCXByaW50aygiQWJvcnQgdG8gU2VuZFxuIik7CisjZW5kaWYKKwlkZXYtPmxhc3RfY21kW2NdIHw9IDB4NDA7CisJZGV2LT5pbl9zbmRbY10gPSAwOworCXJldHVybjsKK29rdG9zZW5kOgorI2lmZGVmIEVEX0RCR1AKKwlwcmludGsoIk9LIHRvIFNlbmRcbiIpOworCXByaW50aygiQ0RCIik7CisJZm9yKGk9MDtpPHdvcmtyZXEtPmNtZF9sZW47aSsrKSB7CisJCXByaW50aygiICV4Iix3b3JrcmVxLT5jbW5kW2ldKTsKKwl9CisJcHJpbnRrKCJcbkNoYW5uZWwgPSAlZCBJRCA9ICVkIExVTiA9ICVkXG4iLGMsd29ya3JlcS0+ZGV2aWNlLT5pZCx3b3JrcmVxLT5kZXZpY2UtPmx1bik7CisjZW5kaWYJCisJaWYgKGRldi0+ZGV2X2lkID09IEFUUDg4NV9ERVZJRCkgeworCQlqID0gaW5iKGRldi0+YmFzZXBvcnQgKyAweDI5KSAmIDB4ZmU7CisJCW91dGIoaiwgZGV2LT5iYXNlcG9ydCArIDB4MjkpOworCQlkZXYtPnIxZltjXVt3b3JrcmVxLT5kZXZpY2UtPmlkXSA9IDA7CisJfQorCQorCWlmICh3b3JrcmVxLT5jbW5kWzBdID09IFJFQURfQ0FQQUNJVFkpIHsKKwkJaWYgKHdvcmtyZXEtPnJlcXVlc3RfYnVmZmxlbiA+IDgpIHsKKwkJCXdvcmtyZXEtPnJlcXVlc3RfYnVmZmxlbiA9IDB4MDg7CisJCX0KKwl9CisJaWYgKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgwMCkgeworCQl3b3JrcmVxLT5yZXF1ZXN0X2J1ZmZsZW4gPSAwOworCX0KKworCXRtcG9ydCA9IHdvcmtwb3J0ICsgMHgxYjsKKwlqID0gMDsKKwl0YXJnZXRfaWQgPSB3b3JrcmVxLT5kZXZpY2UtPmlkOworCisJLyoKKwkgKglXaWRlID8KKwkgKi8KKwl3ID0gMTsKKwl3ID0gdyA8PCB0YXJnZXRfaWQ7CisJaWYgKCh3ICYgZGV2LT53aWRlX2lkW2NdKSAhPSAwKSB7CisJCWogfD0gMHgwMTsKKwl9CisJb3V0YihqLCB0bXBvcnQpOworCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDAxKSAhPSBqKSB7CisJCW91dGIoaix0bXBvcnQpOworI2lmZGVmIEVEX0RCR1AKKwkJcHJpbnRrKCJzZW5kX3M4NzAgd2hpbGUgbG9vcCAxXG4iKTsKKyNlbmRpZgorCX0KKwkvKgorCSAqCVdyaXRlIHRoZSBjb21tYW5kCisJICovCisKKwl0bXBvcnQgPSB3b3JrcG9ydDsKKwlvdXRiKHdvcmtyZXEtPmNtZF9sZW4sIHRtcG9ydCsrKTsKKwlvdXRiKDB4MmMsIHRtcG9ydCsrKTsKKwlpZiAoZGV2LT5kZXZfaWQgPT0gQVRQODg1X0RFVklEKSB7CisJCW91dGIoMHg3ZiwgdG1wb3J0KyspOworCX0gZWxzZSB7CisJCW91dGIoMHhjZiwgdG1wb3J0KyspOyAJCisJfQkKKwlmb3IgKGkgPSAwOyBpIDwgd29ya3JlcS0+Y21kX2xlbjsgaSsrKSB7CisJCW91dGIod29ya3JlcS0+Y21uZFtpXSwgdG1wb3J0KyspOworCX0KKwl0bXBvcnQgPSB3b3JrcG9ydCArIDB4MGY7CisJb3V0Yih3b3JrcmVxLT5kZXZpY2UtPmx1biwgdG1wb3J0KTsKKwl0bXBvcnQgKz0gMHgwMjsKKwkvKgorCSAqCVdyaXRlIHRoZSB0YXJnZXQKKwkgKi8KKwlvdXRiKGRldi0+aWRbY11bdGFyZ2V0X2lkXS5kZXZzcCwgdG1wb3J0KyspOwkgCisjaWZkZWYgRURfREJHUAkKKwlwcmludGsoImRldi0+aWRbJWRdWyVkXS5kZXZzcCA9ICUyeFxuIixjLHRhcmdldF9pZCxkZXYtPmlkW2NdW3RhcmdldF9pZF0uZGV2c3ApOworI2VuZGlmCisJLyoKKwkgKglGaWd1cmUgb3V0IHRoZSB0cmFuc2ZlciBzaXplCisJICovCisJaWYgKHdvcmtyZXEtPnVzZV9zZykgeworI2lmZGVmIEVEX0RCR1AKKwkJcHJpbnRrKCJVc2luZyBTR0xcbiIpOworI2VuZGlmCQkKKwkJbCA9IDA7CisJCQorCQlzZ3BudCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgd29ya3JlcS0+cmVxdWVzdF9idWZmZXI7CisJCXNnX2NvdW50ID0gcGNpX21hcF9zZyhkZXYtPnBkZXYsIHNncG50LCB3b3JrcmVxLT51c2Vfc2csCisJICAgCQkJd29ya3JlcS0+c2NfZGF0YV9kaXJlY3Rpb24pOwkJCisJCQorCQlmb3IgKGkgPSAwOyBpIDwgd29ya3JlcS0+dXNlX3NnOyBpKyspIHsKKwkJCWlmIChzZ3BudFtpXS5sZW5ndGggPT0gMCB8fCB3b3JrcmVxLT51c2Vfc2cgPiBBVFA4NzBVX1NDQVRURVIpIHsKKwkJCQlwYW5pYygiRm9vb29vb29vb2QgZmlnaHQhIik7CisJCQl9CisJCQlsICs9IHNncG50W2ldLmxlbmd0aDsKKwkJfQorI2lmZGVmIEVEX0RCR1AJCQorCQlwcmludGsoICJzZW5kX3M4NzA6IHdvcmtyZXEtPnVzZV9zZyAlZCwgc2dfY291bnQgJWQgbCAlOGxkXG4iLCB3b3JrcmVxLT51c2Vfc2csIHNnX2NvdW50LCBsKTsKKyNlbmRpZgorCX0gZWxzZSBpZih3b3JrcmVxLT5yZXF1ZXN0X2J1ZmZsZW4gJiYgd29ya3JlcS0+c2NfZGF0YV9kaXJlY3Rpb24gIT0gUENJX0RNQV9OT05FKSB7CisjaWZkZWYgRURfREJHUAorCQlwcmludGsoIk5vdCB1c2luZyBTR0xcbiIpOworI2VuZGlmCQkJCQkKKwkJd29ya3JlcS0+U0NwLmRtYV9oYW5kbGUgPSBwY2lfbWFwX3NpbmdsZShkZXYtPnBkZXYsIHdvcmtyZXEtPnJlcXVlc3RfYnVmZmVyLAorCQkJCXdvcmtyZXEtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQl3b3JrcmVxLT5zY19kYXRhX2RpcmVjdGlvbik7CQkKKwkJbCA9IHdvcmtyZXEtPnJlcXVlc3RfYnVmZmxlbjsKKyNpZmRlZiBFRF9EQkdQCQkKKwkJcHJpbnRrKCAic2VuZF9zODcwOiB3b3JrcmVxLT51c2Vfc2cgJWQsIGwgJThsZFxuIiwgd29ya3JlcS0+dXNlX3NnLCBsKTsKKyNlbmRpZgorCX0gZWxzZSBsID0gMDsKKwkvKgorCSAqCVdyaXRlIHRyYW5zZmVyIHNpemUKKwkgKi8KKwlvdXRiKCh1bnNpZ25lZCBjaGFyKSAoKCh1bnNpZ25lZCBjaGFyICopICgmbCkpWzJdKSwgdG1wb3J0KyspOworCW91dGIoKHVuc2lnbmVkIGNoYXIpICgoKHVuc2lnbmVkIGNoYXIgKikgKCZsKSlbMV0pLCB0bXBvcnQrKyk7CisJb3V0YigodW5zaWduZWQgY2hhcikgKCgodW5zaWduZWQgY2hhciAqKSAoJmwpKVswXSksIHRtcG9ydCsrKTsKKwlqID0gdGFyZ2V0X2lkOwkKKwlkZXYtPmlkW2NdW2pdLmxhc3RfbGVuID0gbDsKKwlkZXYtPmlkW2NdW2pdLnRyYW5fbGVuID0gMDsKKyNpZmRlZiBFRF9EQkdQCQorCXByaW50aygiZGV2LT5pZFslMmRdWyUyZF0ubGFzdF9sZW4gPSAlZFxuIixjLGosZGV2LT5pZFtjXVtqXS5sYXN0X2xlbik7CisjZW5kaWYJCisJLyoKKwkgKglGbGlwIHRoZSB3aWRlIGJpdHMKKwkgKi8KKwlpZiAoKGogJiAweDA4KSAhPSAwKSB7CisJCWogPSAoaiAmIDB4MDcpIHwgMHg0MDsKKwl9CisJLyoKKwkgKglDaGVjayB0cmFuc2ZlciBkaXJlY3Rpb24KKwkgKi8KKwlpZiAod29ya3JlcS0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgeworCQlvdXRiKCh1bnNpZ25lZCBjaGFyKSAoaiB8IDB4MjApLCB0bXBvcnQrKyk7CisJfSBlbHNlIHsKKwkJb3V0YihqLCB0bXBvcnQrKyk7CisJfQorCW91dGIoKHVuc2lnbmVkIGNoYXIpIChpbmIodG1wb3J0KSB8IDB4ODApLCB0bXBvcnQpOworCW91dGIoMHg4MCwgdG1wb3J0KTsKKwl0bXBvcnQgPSB3b3JrcG9ydCArIDB4MWM7CisJZGV2LT5pZFtjXVt0YXJnZXRfaWRdLmRpcmN0ID0gMDsKKwlpZiAobCA9PSAwKSB7CisJCWlmIChpbmIodG1wb3J0KSA9PSAwKSB7CisJCQl0bXBvcnQgPSB3b3JrcG9ydCArIDB4MTg7CisjaWZkZWYgRURfREJHUAorCQkJcHJpbnRrKCJjaGFuZ2UgU0NTSV9DTURfUkVHIDB4MDhcbiIpOwkKKyNlbmRpZgkJCQkKKwkJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJfSBlbHNlIHsKKwkJCWRldi0+bGFzdF9jbWRbY10gfD0gMHg0MDsKKwkJfQorCQlkZXYtPmluX3NuZFtjXSA9IDA7CisJCXJldHVybjsKKwl9CisJdG1wY2lwID0gZGV2LT5wY2lwb3J0W2NdOworCXByZCA9IGRldi0+aWRbY11bdGFyZ2V0X2lkXS5wcmRfdGFibGU7CisJZGV2LT5pZFtjXVt0YXJnZXRfaWRdLnByZF9wb3MgPSBwcmQ7CisKKwkvKgorCSAqCU5vdyB3cml0ZSB0aGUgcmVxdWVzdCBsaXN0LiBFaXRoZXIgYXMgc2NhdHRlci9nYXRoZXIgb3IgYXMKKwkgKglhIGxpbmVhciBjaGFpbi4KKwkgKi8KKworCWlmICh3b3JrcmVxLT51c2Vfc2cpIHsKKwkJc2dwbnQgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIHdvcmtyZXEtPnJlcXVlc3RfYnVmZmVyOworCQlpID0gMDsKKwkJZm9yIChqID0gMDsgaiA8IHdvcmtyZXEtPnVzZV9zZzsgaisrKSB7CisJCQlidHRsID0gc2dfZG1hX2FkZHJlc3MoJnNncG50W2pdKTsKKwkJCWw9c2dfZG1hX2xlbigmc2dwbnRbal0pOworI2lmZGVmIEVEX0RCR1AJCQorCQlwcmludGsoIjEuIGJ0dGwgJXgsIGwgJXhcbiIsYnR0bCwgbCk7CisjZW5kaWYJCQkKKwkJd2hpbGUgKGwgPiAweDEwMDAwKSB7CisJCQkJKCgodTE2ICopIChwcmQpKVtpICsgM10pID0gMHgwMDAwOworCQkJCSgoKHUxNiAqKSAocHJkKSlbaSArIDJdKSA9IDB4MDAwMDsKKwkJCQkoKCh1MzIgKikgKHByZCkpW2kgPj4gMV0pID0gY3B1X3RvX2xlMzIoYnR0bCk7CisJCQkJbCAtPSAweDEwMDAwOworCQkJCWJ0dGwgKz0gMHgxMDAwMDsKKwkJCQlpICs9IDB4MDQ7CisJCQl9CisJCQkoKCh1MzIgKikgKHByZCkpW2kgPj4gMV0pID0gY3B1X3RvX2xlMzIoYnR0bCk7CisJCQkoKCh1MTYgKikgKHByZCkpW2kgKyAyXSkgPSBjcHVfdG9fbGUxNihsKTsKKwkJCSgoKHUxNiAqKSAocHJkKSlbaSArIDNdKSA9IDA7CisJCQlpICs9IDB4MDQ7CQkJCisJCX0KKwkJKCgodTE2ICopIChwcmQpKVtpIC0gMV0pID0gY3B1X3RvX2xlMTYoMHg4MDAwKTsJCisjaWZkZWYgRURfREJHUAkJCisJCXByaW50aygicHJkICU0eCAlNHggJTR4ICU0eFxuIiwoKCh1bnNpZ25lZCBzaG9ydCBpbnQgKilwcmQpWzBdKSwoKCh1bnNpZ25lZCBzaG9ydCBpbnQgKilwcmQpWzFdKSwoKCh1bnNpZ25lZCBzaG9ydCBpbnQgKilwcmQpWzJdKSwoKCh1bnNpZ25lZCBzaG9ydCBpbnQgKilwcmQpWzNdKSk7CisJCXByaW50aygiMi4gYnR0bCAleCwgbCAleFxuIixidHRsLCBsKTsKKyNlbmRpZgkJCQorCX0gZWxzZSB7CisJCS8qCisJCSAqCUZvciBhIGxpbmVhciByZXF1ZXN0IHdyaXRlIGEgY2hhaW4gb2YgYmxvY2tzCisJCSAqLyAgICAgICAgCisJCWJ0dGwgPSB3b3JrcmVxLT5TQ3AuZG1hX2hhbmRsZTsKKwkJbCA9IHdvcmtyZXEtPnJlcXVlc3RfYnVmZmxlbjsKKwkJaSA9IDA7CisjaWZkZWYgRURfREJHUAkJCisJCXByaW50aygiMy4gYnR0bCAleCwgbCAleFxuIixidHRsLCBsKTsKKyNlbmRpZgkJCQorCQl3aGlsZSAobCA+IDB4MTAwMDApIHsKKwkJCQkoKCh1MTYgKikgKHByZCkpW2kgKyAzXSkgPSAweDAwMDA7CisJCQkJKCgodTE2ICopIChwcmQpKVtpICsgMl0pID0gMHgwMDAwOworCQkJCSgoKHUzMiAqKSAocHJkKSlbaSA+PiAxXSkgPSBjcHVfdG9fbGUzMihidHRsKTsKKwkJCQlsIC09IDB4MTAwMDA7CisJCQkJYnR0bCArPSAweDEwMDAwOworCQkJCWkgKz0gMHgwNDsKKwkJCX0KKwkJCSgoKHUxNiAqKSAocHJkKSlbaSArIDNdKSA9IGNwdV90b19sZTE2KDB4ODAwMCk7CisJCQkoKCh1MTYgKikgKHByZCkpW2kgKyAyXSkgPSBjcHVfdG9fbGUxNihsKTsKKwkJCSgoKHUzMiAqKSAocHJkKSlbaSA+PiAxXSkgPSBjcHVfdG9fbGUzMihidHRsKTsJCQorI2lmZGVmIEVEX0RCR1AJCQorCQlwcmludGsoInByZCAlNHggJTR4ICU0eCAlNHhcbiIsKCgodW5zaWduZWQgc2hvcnQgaW50ICopcHJkKVswXSksKCgodW5zaWduZWQgc2hvcnQgaW50ICopcHJkKVsxXSksKCgodW5zaWduZWQgc2hvcnQgaW50ICopcHJkKVsyXSksKCgodW5zaWduZWQgc2hvcnQgaW50ICopcHJkKVszXSkpOworCQlwcmludGsoIjQuIGJ0dGwgJXgsIGwgJXhcbiIsYnR0bCwgbCk7CisjZW5kaWYJCQkKKwkJCisJfQorCXRtcGNpcCArPSA0OworI2lmZGVmIEVEX0RCR1AJCQorCXByaW50aygic2VuZF9zODcwOiBwcmRhZGRyXzIgMHglOHggdG1wY2lwICV4IHRhcmdldF9pZCAlZFxuIiwgZGV2LT5pZFtjXVt0YXJnZXRfaWRdLnByZGFkZHIsdG1wY2lwLHRhcmdldF9pZCk7CisjZW5kaWYJCisJb3V0bChkZXYtPmlkW2NdW3RhcmdldF9pZF0ucHJkYWRkciwgdG1wY2lwKTsKKwl0bXBjaXAgPSB0bXBjaXAgLSAyOworCW91dGIoMHgwNiwgdG1wY2lwKTsKKwlvdXRiKDB4MDAsIHRtcGNpcCk7CisJaWYgKGRldi0+ZGV2X2lkID09IEFUUDg4NV9ERVZJRCkgeworCQl0bXBjaXAtLTsKKwkJaj1pbmIodG1wY2lwKSAmIDB4ZjM7CisJCWlmICgod29ya3JlcS0+Y21uZFswXSA9PSAweDA4KSB8fCAod29ya3JlcS0+Y21uZFswXSA9PSAweDI4KSB8fAorCSAgICAJKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgwYSkgfHwgKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgyYSkpIHsKKwkgICAJCWogfD0gMHgwYzsKKwkJfQorCQlvdXRiKGosdG1wY2lwKTsKKwkJdG1wY2lwLS07CSAgICAJCisJfSBlbHNlIGlmICgoZGV2LT5kZXZfaWQgPT0gQVRQODgwX0RFVklEMSkgfHwKKwkgICAgCSAgIChkZXYtPmRldl9pZCA9PSBBVFA4ODBfREVWSUQyKSkgeworCQl0bXBjaXAgPXRtcGNpcCAtMjsJCisJCXRtcG9ydCA9IHdvcmtwb3J0IC0gMHgwNTsKKwkJaWYgKCh3b3JrcmVxLT5jbW5kWzBdID09IDB4MDgpIHx8ICh3b3JrcmVxLT5jbW5kWzBdID09IDB4MjgpIHx8ICh3b3JrcmVxLT5jbW5kWzBdID09IDB4MGEpIHx8ICh3b3JrcmVxLT5jbW5kWzBdID09IDB4MmEpKSB7CisJCQlvdXRiKCh1bnNpZ25lZCBjaGFyKSAoKGluYih0bXBvcnQpICYgMHgzZikgfCAweGMwKSwgdG1wb3J0KTsKKwkJfSBlbHNlIHsKKwkJCW91dGIoKHVuc2lnbmVkIGNoYXIpIChpbmIodG1wb3J0KSAmIDB4M2YpLCB0bXBvcnQpOworCQl9CQkKKwl9IGVsc2UgewkJCisJCXRtcGNpcCA9dG1wY2lwIC0yOworCQl0bXBvcnQgPSB3b3JrcG9ydCArIDB4M2E7CisJCWlmICgod29ya3JlcS0+Y21uZFswXSA9PSAweDA4KSB8fCAod29ya3JlcS0+Y21uZFswXSA9PSAweDI4KSB8fCAod29ya3JlcS0+Y21uZFswXSA9PSAweDBhKSB8fCAod29ya3JlcS0+Y21uZFswXSA9PSAweDJhKSkgeworCQkJb3V0YigoaW5iKHRtcG9ydCkgJiAweGYzKSB8IDB4MDgsIHRtcG9ydCk7CisJCX0gZWxzZSB7CisJCQlvdXRiKGluYih0bXBvcnQpICYgMHhmMywgdG1wb3J0KTsKKwkJfQkJCisJfQkKKwl0bXBvcnQgPSB3b3JrcG9ydCArIDB4MWM7CisKKwlpZih3b3JrcmVxLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CisJCWRldi0+aWRbY11bdGFyZ2V0X2lkXS5kaXJjdCA9IDB4MjA7CisJCWlmIChpbmIodG1wb3J0KSA9PSAwKSB7CisJCQl0bXBvcnQgPSB3b3JrcG9ydCArIDB4MTg7CisJCQlvdXRiKDB4MDgsIHRtcG9ydCk7CisJCQlvdXRiKDB4MDEsIHRtcGNpcCk7CisjaWZkZWYgRURfREJHUAkJCisJCXByaW50ayggInN0YXJ0IERNQSh0byB0YXJnZXQpXG4iKTsKKyNlbmRpZgkJCQkKKwkJfSBlbHNlIHsKKwkJCWRldi0+bGFzdF9jbWRbY10gfD0gMHg0MDsKKwkJfQorCQlkZXYtPmluX3NuZFtjXSA9IDA7CisJCXJldHVybjsKKwl9CisJaWYgKGluYih0bXBvcnQpID09IDApIHsJCQorCQl0bXBvcnQgPSB3b3JrcG9ydCArIDB4MTg7CisJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJb3V0YigweDA5LCB0bXBjaXApOworI2lmZGVmIEVEX0RCR1AJCQorCQlwcmludGsoICJzdGFydCBETUEodG8gaG9zdClcbiIpOworI2VuZGlmCQkJCisJfSBlbHNlIHsKKwkJZGV2LT5sYXN0X2NtZFtjXSB8PSAweDQwOworCX0KKwlkZXYtPmluX3NuZFtjXSA9IDA7CisJcmV0dXJuOworCit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGZ1bl9zY2FtKHN0cnVjdCBhdHBfdW5pdCAqZGV2LCB1bnNpZ25lZCBzaG9ydCBpbnQgKnZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wb3J0OworCXVuc2lnbmVkIHNob3J0IGludCBpLCBrOworCXVuc2lnbmVkIGNoYXIgajsKKworCXRtcG9ydCA9IGRldi0+aW9wb3J0WzBdICsgMHgxYzsKKwlvdXR3KCp2YWwsIHRtcG9ydCk7CitGVU5fRDc6CisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsJLyogc3RhYmxlID49IGJ1cyBzZXR0bGUgZGVsYXkoNDAwIG5zKSAgKi8KKwkJayA9IGludyh0bXBvcnQpOworCQlqID0gKHVuc2lnbmVkIGNoYXIpIChrID4+IDgpOworCQlpZiAoKGsgJiAweDgwMDApICE9IDApIHsJLyogREI3IGFsbCByZWxlYXNlPyAgICAqLworCQkJZ290byBGVU5fRDc7CisJCX0KKwl9CisJKnZhbCB8PSAweDQwMDA7CQkvKiBhc3NlcnQgREI2ICAgICAgICAgICAqLworCW91dHcoKnZhbCwgdG1wb3J0KTsKKwkqdmFsICY9IDB4ZGZmZjsJCS8qIGFzc2VydCBEQjUgICAgICAgICAgICovCisJb3V0dygqdmFsLCB0bXBvcnQpOworRlVOX0Q1OgorCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CS8qIHN0YWJsZSA+PSBidXMgc2V0dGxlIGRlbGF5KDQwMCBucykgKi8KKwkJaWYgKChpbncodG1wb3J0KSAmIDB4MjAwMCkgIT0gMCkgewkvKiBEQjUgYWxsIHJlbGVhc2U/ICAgICAgICovCisJCQlnb3RvIEZVTl9ENTsKKwkJfQorCX0KKwkqdmFsIHw9IDB4ODAwMDsJCS8qIG5vIERCNC0wLCBhc3NlcnQgREI3ICAgICovCisJKnZhbCAmPSAweGUwZmY7CisJb3V0dygqdmFsLCB0bXBvcnQpOworCSp2YWwgJj0gMHhiZmZmOwkJLyogcmVsZWFzZSBEQjYgICAgICAgICAgICAgKi8KKwlvdXR3KCp2YWwsIHRtcG9ydCk7CitGVU5fRDY6CisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsJLyogc3RhYmxlID49IGJ1cyBzZXR0bGUgZGVsYXkoNDAwIG5zKSAgKi8KKwkJaWYgKChpbncodG1wb3J0KSAmIDB4NDAwMCkgIT0gMCkgewkvKiBEQjYgYWxsIHJlbGVhc2U/ICAqLworCQkJZ290byBGVU5fRDY7CisJCX0KKwl9CisKKwlyZXR1cm4gajsKK30KKworc3RhdGljIHZvaWQgdHNjYW0oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKworCXVuc2lnbmVkIGludCB0bXBvcnQ7CisJdW5zaWduZWQgY2hhciBpLCBqLCBrOworCXVuc2lnbmVkIGxvbmcgbjsKKwl1bnNpZ25lZCBzaG9ydCBpbnQgbSwgYXNzaWduaWRfbWFwLCB2YWw7CisJdW5zaWduZWQgY2hhciBtYnVmWzMzXSwgcXVpbnRldFsyXTsKKwlzdHJ1Y3QgYXRwX3VuaXQgKmRldiA9IChzdHJ1Y3QgYXRwX3VuaXQgKikmaG9zdC0+aG9zdGRhdGE7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgZzJxX3RhYls4XSA9IHsKKwkJMHgzOCwgMHgzMSwgMHgzMiwgMHgyYiwgMHgzNCwgMHgyZCwgMHgyZSwgMHgyNworCX07CisKKy8qICBJIGNhbid0IGJlbGlldmUgd2UgbmVlZCB0aGlzIGJlZm9yZSB3ZSd2ZSBldmVuIGRvbmUgYW55dGhpbmcuICBSZW1vdmUgaXQKKyAqICBhbmQgc2VlIGlmIGFueW9uZSBiaXRjaGVzLgorCWZvciAoaSA9IDA7IGkgPCAweDEwOyBpKyspIHsKKwkJdWRlbGF5KDB4ZmZmZik7CisJfQorICovCisKKwl0bXBvcnQgPSBkZXYtPmlvcG9ydFswXSArIDE7CisJb3V0YigweDA4LCB0bXBvcnQrKyk7CisJb3V0YigweDdmLCB0bXBvcnQpOworCXRtcG9ydCA9IGRldi0+aW9wb3J0WzBdICsgMHgxMTsKKwlvdXRiKDB4MjAsIHRtcG9ydCk7CisKKwlpZiAoKGRldi0+c2NhbV9vbiAmIDB4NDApID09IDApIHsKKwkJcmV0dXJuOworCX0KKwltID0gMTsKKwltIDw8PSBkZXYtPmhvc3RfaWRbMF07CisJaiA9IDE2OworCWlmIChkZXYtPmNoaXBfdmVyIDwgNCkgeworCQltIHw9IDB4ZmYwMDsKKwkJaiA9IDg7CisJfQorCWFzc2lnbmlkX21hcCA9IG07CisJdG1wb3J0ID0gZGV2LT5pb3BvcnRbMF0gKyAweDAyOworCW91dGIoMHgwMiwgdG1wb3J0KyspOwkvKiAyKjI9NG1zLDNFSCAyLzMyKjNFPTMuOW1zICovCisJb3V0YigwLCB0bXBvcnQrKyk7CisJb3V0YigwLCB0bXBvcnQrKyk7CisJb3V0YigwLCB0bXBvcnQrKyk7CisJb3V0YigwLCB0bXBvcnQrKyk7CisJb3V0YigwLCB0bXBvcnQrKyk7CisJb3V0YigwLCB0bXBvcnQrKyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisJCW0gPSAxOworCQltID0gbSA8PCBpOworCQlpZiAoKG0gJiBhc3NpZ25pZF9tYXApICE9IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXRtcG9ydCA9IGRldi0+aW9wb3J0WzBdICsgMHgwZjsKKwkJb3V0YigwLCB0bXBvcnQrKyk7CisJCXRtcG9ydCArPSAweDAyOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJb3V0YigwLCB0bXBvcnQrKyk7CisJCW91dGIoMCwgdG1wb3J0KyspOworCQlpZiAoaSA+IDcpIHsKKwkJCWsgPSAoaSAmIDB4MDcpIHwgMHg0MDsKKwkJfSBlbHNlIHsKKwkJCWsgPSBpOworCQl9CisJCW91dGIoaywgdG1wb3J0KyspOworCQl0bXBvcnQgPSBkZXYtPmlvcG9ydFswXSArIDB4MWI7CisJCWlmIChkZXYtPmNoaXBfdmVyID09IDQpIHsKKwkJCW91dGIoMHgwMSwgdG1wb3J0KTsKKwkJfSBlbHNlIHsKKwkJCW91dGIoMHgwMCwgdG1wb3J0KTsKKwkJfQord2FpdF9yZHlvazoKKwkJdG1wb3J0ID0gZGV2LT5pb3BvcnRbMF0gKyAweDE4OworCQlvdXRiKDB4MDksIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCXRtcG9ydCAtPSAweDA4OworCQlrID0gaW5iKHRtcG9ydCk7CisJCWlmIChrICE9IDB4MTYpIHsKKwkJCWlmICgoayA9PSAweDg1KSB8fCAoayA9PSAweDQyKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdG1wb3J0ID0gZGV2LT5pb3BvcnRbMF0gKyAweDEwOworCQkJb3V0YigweDQxLCB0bXBvcnQpOworCQkJZ290byB3YWl0X3JkeW9rOworCQl9CisJCWFzc2lnbmlkX21hcCB8PSBtOworCisJfQorCXRtcG9ydCA9IGRldi0+aW9wb3J0WzBdICsgMHgwMjsKKwlvdXRiKDB4N2YsIHRtcG9ydCk7CisJdG1wb3J0ID0gZGV2LT5pb3BvcnRbMF0gKyAweDFiOworCW91dGIoMHgwMiwgdG1wb3J0KTsKKworCW91dGIoMCwgMHg4MCk7CisKKwl2YWwgPSAweDAwODA7CQkvKiBic3kgICovCisJdG1wb3J0ID0gZGV2LT5pb3BvcnRbMF0gKyAweDFjOworCW91dHcodmFsLCB0bXBvcnQpOworCXZhbCB8PSAweDAwNDA7CQkvKiBzZWwgICovCisJb3V0dyh2YWwsIHRtcG9ydCk7CisJdmFsIHw9IDB4MDAwNDsJCS8qIG1zZyAgKi8KKwlvdXR3KHZhbCwgdG1wb3J0KTsKKwlpbmIoMHg4MCk7CQkvKiAyIGRlc2tldyBkZWxheSg0NW5zKjI9OTBucykgKi8KKwl2YWwgJj0gMHgwMDdmOwkJLyogbm8gYnN5ICAqLworCW91dHcodmFsLCB0bXBvcnQpOworCW1kZWxheSgxMjgpOworCXZhbCAmPSAweDAwZmI7CQkvKiBhZnRlciAxbXMgbm8gbXNnICovCisJb3V0dyh2YWwsIHRtcG9ydCk7Cit3YWl0X25vbXNnOgorCWlmICgoaW5iKHRtcG9ydCkgJiAweDA0KSAhPSAwKSB7CisJCWdvdG8gd2FpdF9ub21zZzsKKwl9CisJb3V0YigxLCAweDgwKTsKKwl1ZGVsYXkoMTAwKTsKKwlmb3IgKG4gPSAwOyBuIDwgMHgzMDAwMDsgbisrKSB7CisJCWlmICgoaW5iKHRtcG9ydCkgJiAweDgwKSAhPSAwKSB7CS8qIGJzeSA/ICovCisJCQlnb3RvIHdhaXRfaW87CisJCX0KKwl9CisJZ290byBUQ01fU1lOQzsKK3dhaXRfaW86CisJZm9yIChuID0gMDsgbiA8IDB4MzAwMDA7IG4rKykgeworCQlpZiAoKGluYih0bXBvcnQpICYgMHg4MSkgPT0gMHgwMDgxKSB7CisJCQlnb3RvIHdhaXRfaW8xOworCQl9CisJfQorCWdvdG8gVENNX1NZTkM7Cit3YWl0X2lvMToKKwlpbmIoMHg4MCk7CisJdmFsIHw9IDB4ODAwMzsJCS8qIGlvLGNkLGRiNyAgKi8KKwlvdXR3KHZhbCwgdG1wb3J0KTsKKwlpbmIoMHg4MCk7CisJdmFsICY9IDB4MDBiZjsJCS8qIG5vIHNlbCAgICAgKi8KKwlvdXR3KHZhbCwgdG1wb3J0KTsKKwlvdXRiKDIsIDB4ODApOworVENNX1NZTkM6CisJdWRlbGF5KDB4ODAwKTsKKwlpZiAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkgewkvKiBic3kgPyAqLworCQlvdXR3KDAsIHRtcG9ydC0tKTsKKwkJb3V0YigwLCB0bXBvcnQpOworCQl0bXBvcnQgPSBkZXYtPmlvcG9ydFswXSArIDB4MTU7CisJCW91dGIoMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDM7CisJCW91dGIoMHgwOSwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAwKQorCQkJY3B1X3JlbGF4KCk7CisJCXRtcG9ydCAtPSAweDA4OworCQlpbmIodG1wb3J0KTsKKwkJcmV0dXJuOworCX0KKwl2YWwgJj0gMHgwMGZmOwkJLyogc3luY2hyb25pemF0aW9uICAqLworCXZhbCB8PSAweDNmMDA7CisJZnVuX3NjYW0oZGV2LCAmdmFsKTsKKwlvdXRiKDMsIDB4ODApOworCXZhbCAmPSAweDAwZmY7CQkvKiBpc29sYXRpb24gICAgICAgICovCisJdmFsIHw9IDB4MjAwMDsKKwlmdW5fc2NhbShkZXYsICZ2YWwpOworCW91dGIoNCwgMHg4MCk7CisJaSA9IDg7CisJaiA9IDA7CitUQ01fSUQ6CisJaWYgKChpbncodG1wb3J0KSAmIDB4MjAwMCkgPT0gMCkgeworCQlnb3RvIFRDTV9JRDsKKwl9CisJb3V0Yig1LCAweDgwKTsKKwl2YWwgJj0gMHgwMGZmOwkJLyogZ2V0IElEX1NUUklORyAqLworCXZhbCB8PSAweDIwMDA7CisJayA9IGZ1bl9zY2FtKGRldiwgJnZhbCk7CisJaWYgKChrICYgMHgwMykgPT0gMCkgeworCQlnb3RvIFRDTV81OworCX0KKwltYnVmW2pdIDw8PSAweDAxOworCW1idWZbal0gJj0gMHhmZTsKKwlpZiAoKGsgJiAweDAyKSAhPSAwKSB7CisJCW1idWZbal0gfD0gMHgwMTsKKwl9CisJaS0tOworCWlmIChpID4gMCkgeworCQlnb3RvIFRDTV9JRDsKKwl9CisJaisrOworCWkgPSA4OworCWdvdG8gVENNX0lEOworCitUQ01fNToJCQkvKiBpc29sYXRpb24gY29tcGxldGUuLiAgKi8KKy8qICAgIG1idWZbMzJdPTA7CisJcHJpbnRrKCIgXG4leCAleCAleCAlc1xuICIsYXNzaWduaWRfbWFwLG1idWZbMF0sbWJ1ZlsxXSwmbWJ1ZlsyXSk7ICovCisJaSA9IDE1OworCWogPSBtYnVmWzBdOworCWlmICgoaiAmIDB4MjApICE9IDApIHsJLyogYml0NT0xOklEIHVwdG8gNyAgICAgICovCisJCWkgPSA3OworCX0KKwlpZiAoKGogJiAweDA2KSA9PSAwKSB7CS8qIElEdmFsaWQ/ICAgICAgICAgICAgICovCisJCWdvdG8gRzJRNTsKKwl9CisJayA9IG1idWZbMV07CitzbWFsbF9pZDoKKwltID0gMTsKKwltIDw8PSBrOworCWlmICgobSAmIGFzc2lnbmlkX21hcCkgPT0gMCkgeworCQlnb3RvIEcyUV9RVUlOOworCX0KKwlpZiAoayA+IDApIHsKKwkJay0tOworCQlnb3RvIHNtYWxsX2lkOworCX0KK0cyUTU6CQkJLyogc3JjaCBmcm9tIG1heCBhY2NlcHRhYmxlIElEIyAgKi8KKwlrID0gaTsJCQkvKiBtYXggYWNjZXB0YWJsZSBJRCMgICAgICAgICAgICAqLworRzJRX0xQOgorCW0gPSAxOworCW0gPDw9IGs7CisJaWYgKChtICYgYXNzaWduaWRfbWFwKSA9PSAwKSB7CisJCWdvdG8gRzJRX1FVSU47CisJfQorCWlmIChrID4gMCkgeworCQlrLS07CisJCWdvdG8gRzJRX0xQOworCX0KK0cyUV9RVUlOOgkJLyogaz1iaW5JRCMsICAgICAgICovCisJYXNzaWduaWRfbWFwIHw9IG07CisJaWYgKGsgPCA4KSB7CisJCXF1aW50ZXRbMF0gPSAweDM4OwkvKiAxc3QgZGZ0IElEPDggICAgKi8KKwl9IGVsc2UgeworCQlxdWludGV0WzBdID0gMHgzMTsJLyogMXN0ICBJRD49OCAgICAgICovCisJfQorCWsgJj0gMHgwNzsKKwlxdWludGV0WzFdID0gZzJxX3RhYltrXTsKKworCXZhbCAmPSAweDAwZmY7CQkvKiBBc3NpZ25JRCAxc3RRdWludGV0LEFIPTAwMXh4eHh4ICAqLworCW0gPSBxdWludGV0WzBdIDw8IDg7CisJdmFsIHw9IG07CisJZnVuX3NjYW0oZGV2LCAmdmFsKTsKKwl2YWwgJj0gMHgwMGZmOwkJLyogQXNzaWduSUQgMm5kUXVpbnRldCxBSD0wMDF4eHh4eCAqLworCW0gPSBxdWludGV0WzFdIDw8IDg7CisJdmFsIHw9IG07CisJZnVuX3NjYW0oZGV2LCAmdmFsKTsKKworCWdvdG8gVENNX1NZTkM7CisKK30KKworc3RhdGljIHZvaWQgaXM4NzAoc3RydWN0IGF0cF91bml0ICpkZXYsIHVuc2lnbmVkIGludCB3a3BvcnQpCit7CisJdW5zaWduZWQgaW50IHRtcG9ydDsKKwl1bnNpZ25lZCBjaGFyIGksIGosIGssIHJtYiwgbjsKKwl1bnNpZ25lZCBzaG9ydCBpbnQgbTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBtYnVmWzUxMl07CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgc2F0bls5XSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNiwgNiB9OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGlucWRbOV0gPSB7IDB4MTIsIDAsIDAsIDAsIDB4MjQsIDAsIDAsIDB4MjQsIDYgfTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBzeW5uWzZdID0geyAweDgwLCAxLCAzLCAxLCAweDE5LCAweDBlIH07CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgc3ludVs2XSA9IHsgMHg4MCwgMSwgMywgMSwgMHgwYywgMHgwZSB9OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHN5bndbNl0gPSB7IDB4ODAsIDEsIDMsIDEsIDB4MGMsIDB4MDcgfTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciB3aWRlWzZdID0geyAweDgwLCAxLCAyLCAzLCAxLCAwIH07CisJCisJdG1wb3J0ID0gd2twb3J0ICsgMHgzYTsKKwlvdXRiKCh1bnNpZ25lZCBjaGFyKSAoaW5iKHRtcG9ydCkgfCAweDEwKSwgdG1wb3J0KTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWlmICgoZGV2LT5jaGlwX3ZlciAhPSA0KSAmJiAoaSA+IDcpKSB7CisJCQlicmVhazsKKwkJfQorCQltID0gMTsKKwkJbSA9IG0gPDwgaTsKKwkJaWYgKChtICYgZGV2LT5hY3RpdmVfaWRbMF0pICE9IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChpID09IGRldi0+aG9zdF9pZFswXSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICAgSUQ6ICUyZCAgSG9zdCBBZGFwdGVyXG4iLCBkZXYtPmhvc3RfaWRbMF0pOworCQkJY29udGludWU7CisJCX0KKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxYjsKKwkJaWYgKGRldi0+Y2hpcF92ZXIgPT0gNCkgeworCQkJb3V0YigweDAxLCB0bXBvcnQpOworCQl9IGVsc2UgeworCQkJb3V0YigweDAwLCB0bXBvcnQpOworCQl9CisJCXRtcG9ydCA9IHdrcG9ydCArIDE7CisJCW91dGIoMHgwOCwgdG1wb3J0KyspOworCQlvdXRiKDB4N2YsIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzBdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blsxXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bMl0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzNdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls0XSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNV0sIHRtcG9ydCsrKTsKKwkJdG1wb3J0ICs9IDB4MDY7CisJCW91dGIoMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDI7CisJCW91dGIoZGV2LT5pZFswXVtpXS5kZXZzcCwgdG1wb3J0KyspOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzZdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls3XSwgdG1wb3J0KyspOworCQlqID0gaTsKKwkJaWYgKChqICYgMHgwOCkgIT0gMCkgeworCQkJaiA9IChqICYgMHgwNykgfCAweDQwOworCQl9CisJCW91dGIoaiwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDM7CisJCW91dGIoc2F0bls4XSwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKworCQl0bXBvcnQgLT0gMHgwODsKKwkJaWYgKGluYih0bXBvcnQpICE9IDB4MTEgJiYgaW5iKHRtcG9ydCkgIT0gMHg4ZSkKKwkJCWNvbnRpbnVlOworCisJCXdoaWxlIChpbmIodG1wb3J0KSAhPSAweDhlKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJZGV2LT5hY3RpdmVfaWRbMF0gfD0gbTsKKworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDEwOworCQlvdXRiKDB4MzAsIHRtcG9ydCk7CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MDQ7CisJCW91dGIoMHgwMCwgdG1wb3J0KTsKKworcGhhc2VfY21kOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDE4OworCQlvdXRiKDB4MDgsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoaiAhPSAweDE2KSB7CisJCQl0bXBvcnQgPSB3a3BvcnQgKyAweDEwOworCQkJb3V0YigweDQxLCB0bXBvcnQpOworCQkJZ290byBwaGFzZV9jbWQ7CisJCX0KK3NlbF9vazoKKwkJdG1wb3J0ID0gd2twb3J0ICsgMzsKKwkJb3V0YihpbnFkWzBdLCB0bXBvcnQrKyk7CisJCW91dGIoaW5xZFsxXSwgdG1wb3J0KyspOworCQlvdXRiKGlucWRbMl0sIHRtcG9ydCsrKTsKKwkJb3V0YihpbnFkWzNdLCB0bXBvcnQrKyk7CisJCW91dGIoaW5xZFs0XSwgdG1wb3J0KyspOworCQlvdXRiKGlucWRbNV0sIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQlvdXRiKDAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDAyOworCQlvdXRiKGRldi0+aWRbMF1baV0uZGV2c3AsIHRtcG9ydCsrKTsKKwkJb3V0YigwLCB0bXBvcnQrKyk7CisJCW91dGIoaW5xZFs2XSwgdG1wb3J0KyspOworCQlvdXRiKGlucWRbN10sIHRtcG9ydCsrKTsKKwkJdG1wb3J0ICs9IDB4MDM7CisJCW91dGIoaW5xZFs4XSwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKwkJCQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaWYgKGluYih0bXBvcnQpICE9IDB4MTEgJiYgaW5iKHRtcG9ydCkgIT0gMHg4ZSkKKwkJCWNvbnRpbnVlOworCisJCXdoaWxlIChpbmIodG1wb3J0KSAhPSAweDhlKQorCQkJY3B1X3JlbGF4KCk7CisJCQkKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxYjsKKwkJaWYgKGRldi0+Y2hpcF92ZXIgPT0gNCkKKwkJCW91dGIoMHgwMCwgdG1wb3J0KTsKKworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDE4OworCQlvdXRiKDB4MDgsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQlqID0gMDsKK3JkX2lucV9kYXRhOgorCQlrID0gaW5iKHRtcG9ydCk7CisJCWlmICgoayAmIDB4MDEpICE9IDApIHsKKwkJCXRtcG9ydCAtPSAweDA2OworCQkJbWJ1ZltqKytdID0gaW5iKHRtcG9ydCk7CisJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCWdvdG8gcmRfaW5xX2RhdGE7CisJCX0KKwkJaWYgKChrICYgMHg4MCkgPT0gMCkgeworCQkJZ290byByZF9pbnFfZGF0YTsKKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoaiA9PSAweDE2KSB7CisJCQlnb3RvIGlucV9vazsKKwkJfQorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDEwOworCQlvdXRiKDB4NDYsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDAyOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJb3V0YigwLCB0bXBvcnQrKyk7CisJCW91dGIoMCwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwMzsKKwkJb3V0YigweDA4LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQkJCisJCXRtcG9ydCAtPSAweDA4OworCQlpZiAoaW5iKHRtcG9ydCkgIT0gMHgxNikgeworCQkJZ290byBzZWxfb2s7CisJCX0KK2lucV9vazoKKwkJbWJ1ZlszNl0gPSAwOworCQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgICBJRDogJTJkICAlc1xuIiwgaSwgJm1idWZbOF0pOworCQlkZXYtPmlkWzBdW2ldLmRldnR5cGUgPSBtYnVmWzBdOworCQlybWIgPSBtYnVmWzFdOworCQluID0gbWJ1Zls3XTsKKwkJaWYgKGRldi0+Y2hpcF92ZXIgIT0gNCkgeworCQkJZ290byBub3Rfd2lkZTsKKwkJfQorCQlpZiAoKG1idWZbN10gJiAweDYwKSA9PSAwKSB7CisJCQlnb3RvIG5vdF93aWRlOworCQl9CisJCWlmICgoZGV2LT5nbG9iYWxfbWFwWzBdICYgMHgyMCkgPT0gMCkgeworCQkJZ290byBub3Rfd2lkZTsKKwkJfQorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDFiOworCQlvdXRiKDB4MDEsIHRtcG9ydCk7CisJCXRtcG9ydCA9IHdrcG9ydCArIDM7CisJCW91dGIoc2F0blswXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bMV0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzJdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blszXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNF0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzVdLCB0bXBvcnQrKyk7CisJCXRtcG9ydCArPSAweDA2OworCQlvdXRiKDAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDAyOworCQlvdXRiKGRldi0+aWRbMF1baV0uZGV2c3AsIHRtcG9ydCsrKTsKKwkJb3V0YigwLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls2XSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bN10sIHRtcG9ydCsrKTsKKwkJdG1wb3J0ICs9IDB4MDM7CisJCW91dGIoc2F0bls4XSwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKwkJCQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaWYgKGluYih0bXBvcnQpICE9IDB4MTEgJiYgaW5iKHRtcG9ydCkgIT0gMHg4ZSkKKwkJCWNvbnRpbnVlOworCisJCXdoaWxlIChpbmIodG1wb3J0KSAhPSAweDhlKQorCQkJY3B1X3JlbGF4KCk7CisJCQkKK3RyeV93aWRlOgorCQlqID0gMDsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxNDsKKwkJb3V0YigweDA1LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNDsKKwkJb3V0YigweDIwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMCkgeworCQkJaWYgKChpbmIodG1wb3J0KSAmIDB4MDEpICE9IDApIHsKKwkJCQl0bXBvcnQgLT0gMHgwNjsKKwkJCQlvdXRiKHdpZGVbaisrXSwgdG1wb3J0KTsKKwkJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCX0KKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCQkKKwkJaiA9IGluYih0bXBvcnQpICYgMHgwZjsKKwkJaWYgKGogPT0gMHgwZikgeworCQkJZ290byB3aWRlcF9pbjsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHdpZGVwX2NtZDsKKwkJfQorCQlpZiAoaiA9PSAweDBlKSB7CisJCQlnb3RvIHRyeV93aWRlOworCQl9CisJCWNvbnRpbnVlOword2lkZXBfb3V0OgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDE4OworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMCkgeworCQkJaWYgKChpbmIodG1wb3J0KSAmIDB4MDEpICE9IDApIHsKKwkJCQl0bXBvcnQgLT0gMHgwNjsKKwkJCQlvdXRiKDAsIHRtcG9ydCk7CisJCQkJdG1wb3J0ICs9IDB4MDY7CisJCQl9CisJCX0KKwkJdG1wb3J0IC09IDB4MDg7CisJCWogPSBpbmIodG1wb3J0KSAmIDB4MGY7CisJCWlmIChqID09IDB4MGYpIHsKKwkJCWdvdG8gd2lkZXBfaW47CisJCX0KKwkJaWYgKGogPT0gMHgwYSkgeworCQkJZ290byB3aWRlcF9jbWQ7CisJCX0KKwkJaWYgKGogPT0gMHgwZSkgeworCQkJZ290byB3aWRlcF9vdXQ7CisJCX0KKwkJY29udGludWU7Cit3aWRlcF9pbjoKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxNDsKKwkJb3V0YigweGZmLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNDsKKwkJb3V0YigweDIwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJayA9IDA7Cit3aWRlcF9pbjE6CisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKChqICYgMHgwMSkgIT0gMCkgeworCQkJdG1wb3J0IC09IDB4MDY7CisJCQltYnVmW2srK10gPSBpbmIodG1wb3J0KTsKKwkJCXRtcG9ydCArPSAweDA2OworCQkJZ290byB3aWRlcF9pbjE7CisJCX0KKwkJaWYgKChqICYgMHg4MCkgPT0gMHgwMCkgeworCQkJZ290byB3aWRlcF9pbjE7CisJCX0KKwkJdG1wb3J0IC09IDB4MDg7CisJCWogPSBpbmIodG1wb3J0KSAmIDB4MGY7CisJCWlmIChqID09IDB4MGYpIHsKKwkJCWdvdG8gd2lkZXBfaW47CisJCX0KKwkJaWYgKGogPT0gMHgwYSkgeworCQkJZ290byB3aWRlcF9jbWQ7CisJCX0KKwkJaWYgKGogPT0gMHgwZSkgeworCQkJZ290byB3aWRlcF9vdXQ7CisJCX0KKwkJY29udGludWU7Cit3aWRlcF9jbWQ6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTA7CisJCW91dGIoMHgzMCwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxNDsKKwkJb3V0YigweDAwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNDsKKwkJb3V0YigweDA4LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJdG1wb3J0IC09IDB4MDg7CisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKGogIT0gMHgxNikgeworCQkJaWYgKGogPT0gMHg0ZSkgeworCQkJCWdvdG8gd2lkZXBfb3V0OworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKG1idWZbMF0gIT0gMHgwMSkgeworCQkJZ290byBub3Rfd2lkZTsKKwkJfQorCQlpZiAobWJ1ZlsxXSAhPSAweDAyKSB7CisJCQlnb3RvIG5vdF93aWRlOworCQl9CisJCWlmIChtYnVmWzJdICE9IDB4MDMpIHsKKwkJCWdvdG8gbm90X3dpZGU7CisJCX0KKwkJaWYgKG1idWZbM10gIT0gMHgwMSkgeworCQkJZ290byBub3Rfd2lkZTsKKwkJfQorCQltID0gMTsKKwkJbSA9IG0gPDwgaTsKKwkJZGV2LT53aWRlX2lkWzBdIHw9IG07Citub3Rfd2lkZToKKwkJaWYgKChkZXYtPmlkWzBdW2ldLmRldnR5cGUgPT0gMHgwMCkgfHwgKGRldi0+aWRbMF1baV0uZGV2dHlwZSA9PSAweDA3KSB8fCAoKGRldi0+aWRbMF1baV0uZGV2dHlwZSA9PSAweDA1KSAmJiAoKG4gJiAweDEwKSAhPSAwKSkpIHsKKwkJCWdvdG8gc2V0X3N5bmM7CisJCX0KKwkJY29udGludWU7CitzZXRfc3luYzoKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxYjsKKwkJaiA9IDA7CisJCWlmICgobSAmIGRldi0+d2lkZV9pZFswXSkgIT0gMCkgeworCQkJaiB8PSAweDAxOworCQl9CisJCW91dGIoaiwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMzsKKwkJb3V0YihzYXRuWzBdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blsxXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bMl0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzNdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls0XSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNV0sIHRtcG9ydCsrKTsKKwkJdG1wb3J0ICs9IDB4MDY7CisJCW91dGIoMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDI7CisJCW91dGIoZGV2LT5pZFswXVtpXS5kZXZzcCwgdG1wb3J0KyspOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzZdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls3XSwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwMzsKKwkJb3V0YihzYXRuWzhdLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQkJCisJCXRtcG9ydCAtPSAweDA4OworCQlpZiAoaW5iKHRtcG9ydCkgIT0gMHgxMSAmJiBpbmIodG1wb3J0KSAhPSAweDhlKQorCQkJY29udGludWU7CisKKwkJd2hpbGUgKGluYih0bXBvcnQpICE9IDB4OGUpCisJCQljcHVfcmVsYXgoKTsKKwkJCQordHJ5X3N5bmM6CisJCWogPSAwOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDE0OworCQlvdXRiKDB4MDYsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA0OworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAwKSB7CisJCQlpZiAoKGluYih0bXBvcnQpICYgMHgwMSkgIT0gMCkgeworCQkJCXRtcG9ydCAtPSAweDA2OworCQkJCWlmICgobSAmIGRldi0+d2lkZV9pZFswXSkgIT0gMCkgeworCQkJCQlvdXRiKHN5bndbaisrXSwgdG1wb3J0KTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoKG0gJiBkZXYtPnVsdHJhX21hcFswXSkgIT0gMCkgeworCQkJCQkJb3V0YihzeW51W2orK10sIHRtcG9ydCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlvdXRiKHN5bm5baisrXSwgdG1wb3J0KTsKKwkJCQkJfQorCQkJCX0KKwkJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCX0KKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCQkKKwkJaiA9IGluYih0bXBvcnQpICYgMHgwZjsKKwkJaWYgKGogPT0gMHgwZikgeworCQkJZ290byBwaGFzZV9pbnM7CisJCX0KKwkJaWYgKGogPT0gMHgwYSkgeworCQkJZ290byBwaGFzZV9jbWRzOworCQl9CisJCWlmIChqID09IDB4MGUpIHsKKwkJCWdvdG8gdHJ5X3N5bmM7CisJCX0KKwkJY29udGludWU7CitwaGFzZV9vdXRzOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDE4OworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkgeworCQkJaWYgKChpbmIodG1wb3J0KSAmIDB4MDEpICE9IDB4MDApIHsKKwkJCQl0bXBvcnQgLT0gMHgwNjsKKwkJCQlvdXRiKDB4MDAsIHRtcG9ydCk7CisJCQkJdG1wb3J0ICs9IDB4MDY7CisJCQl9CisJCX0KKwkJdG1wb3J0IC09IDB4MDg7CisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKGogPT0gMHg4NSkgeworCQkJZ290byB0YXJfZGNvbnM7CisJCX0KKwkJaiAmPSAweDBmOworCQlpZiAoaiA9PSAweDBmKSB7CisJCQlnb3RvIHBoYXNlX2luczsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHBoYXNlX2NtZHM7CisJCX0KKwkJaWYgKGogPT0gMHgwZSkgeworCQkJZ290byBwaGFzZV9vdXRzOworCQl9CisJCWNvbnRpbnVlOworcGhhc2VfaW5zOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDE0OworCQlvdXRiKDB4ZmYsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA0OworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQlrID0gMDsKK3BoYXNlX2luczE6CisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKChqICYgMHgwMSkgIT0gMHgwMCkgeworCQkJdG1wb3J0IC09IDB4MDY7CisJCQltYnVmW2srK10gPSBpbmIodG1wb3J0KTsKKwkJCXRtcG9ydCArPSAweDA2OworCQkJZ290byBwaGFzZV9pbnMxOworCQl9CisJCWlmICgoaiAmIDB4ODApID09IDB4MDApIHsKKwkJCWdvdG8gcGhhc2VfaW5zMTsKKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQkJCisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKGogPT0gMHg4NSkgeworCQkJZ290byB0YXJfZGNvbnM7CisJCX0KKwkJaiAmPSAweDBmOworCQlpZiAoaiA9PSAweDBmKSB7CisJCQlnb3RvIHBoYXNlX2luczsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHBoYXNlX2NtZHM7CisJCX0KKwkJaWYgKGogPT0gMHgwZSkgeworCQkJZ290byBwaGFzZV9vdXRzOworCQl9CisJCWNvbnRpbnVlOworcGhhc2VfY21kczoKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxMDsKKwkJb3V0YigweDMwLCB0bXBvcnQpOwordGFyX2Rjb25zOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDE0OworCQlvdXRiKDB4MDAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA0OworCQlvdXRiKDB4MDgsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQkKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKwkJCQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoaiAhPSAweDE2KSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobWJ1ZlswXSAhPSAweDAxKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobWJ1ZlsxXSAhPSAweDAzKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobWJ1Zls0XSA9PSAweDAwKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobWJ1ZlszXSA+IDB4NjQpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtYnVmWzRdID4gMHgwYykgeworCQkJbWJ1Zls0XSA9IDB4MGM7CisJCX0KKwkJZGV2LT5pZFswXVtpXS5kZXZzcCA9IG1idWZbNF07CisJCWlmICgobWJ1ZlszXSA8IDB4MGQpICYmIChybWIgPT0gMCkpIHsKKwkJCWogPSAweGEwOworCQkJZ290byBzZXRfc3luX29rOworCQl9CisJCWlmIChtYnVmWzNdIDwgMHgxYSkgeworCQkJaiA9IDB4MjA7CisJCQlnb3RvIHNldF9zeW5fb2s7CisJCX0KKwkJaWYgKG1idWZbM10gPCAweDMzKSB7CisJCQlqID0gMHg0MDsKKwkJCWdvdG8gc2V0X3N5bl9vazsKKwkJfQorCQlpZiAobWJ1ZlszXSA8IDB4NGMpIHsKKwkJCWogPSAweDUwOworCQkJZ290byBzZXRfc3luX29rOworCQl9CisJCWogPSAweDYwOworc2V0X3N5bl9vazoKKwkJZGV2LT5pZFswXVtpXS5kZXZzcCA9IChkZXYtPmlkWzBdW2ldLmRldnNwICYgMHgwZikgfCBqOworCX0KKwl0bXBvcnQgPSB3a3BvcnQgKyAweDNhOworCW91dGIoKHVuc2lnbmVkIGNoYXIpIChpbmIodG1wb3J0KSAmIDB4ZWYpLCB0bXBvcnQpOworfQorCitzdGF0aWMgdm9pZCBpczg4MChzdHJ1Y3QgYXRwX3VuaXQgKmRldiwgdW5zaWduZWQgaW50IHdrcG9ydCkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wb3J0OworCXVuc2lnbmVkIGNoYXIgaSwgaiwgaywgcm1iLCBuLCBsdmRtb2RlOworCXVuc2lnbmVkIHNob3J0IGludCBtOworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIG1idWZbNTEyXTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBzYXRuWzldID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCA2LCA2IH07CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgaW5xZFs5XSA9IHsgMHgxMiwgMCwgMCwgMCwgMHgyNCwgMCwgMCwgMHgyNCwgNiB9OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHN5bm5bNl0gPSB7IDB4ODAsIDEsIDMsIDEsIDB4MTksIDB4MGUgfTsKKwl1bnNpZ25lZCBjaGFyIHN5bnVbNl0gPSB7IDB4ODAsIDEsIDMsIDEsIDB4MGEsIDB4MGUgfTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBzeW53WzZdID0geyAweDgwLCAxLCAzLCAxLCAweDE5LCAweDBlIH07CisJdW5zaWduZWQgY2hhciBzeW51d1s2XSA9IHsgMHg4MCwgMSwgMywgMSwgMHgwYSwgMHgwZSB9OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHdpZGVbNl0gPSB7IDB4ODAsIDEsIDIsIDMsIDEsIDAgfTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciB1M1s5XSA9IHsgMHg4MCwgMSwgNiwgNCwgMHgwOSwgMDAsIDB4MGUsIDB4MDEsIDB4MDIgfTsKKworCWx2ZG1vZGUgPSBpbmIod2twb3J0ICsgMHgzZikgJiAweDQwOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJbSA9IDE7CisJCW0gPSBtIDw8IGk7CisJCWlmICgobSAmIGRldi0+YWN0aXZlX2lkWzBdKSAhPSAwKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoaSA9PSBkZXYtPmhvc3RfaWRbMF0pIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiAgICAgICAgIElEOiAlMmQgIEhvc3QgQWRhcHRlclxuIiwgZGV2LT5ob3N0X2lkWzBdKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NWI7CisJCW91dGIoMHgwMSwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg0MTsKKwkJb3V0YigweDA4LCB0bXBvcnQrKyk7CisJCW91dGIoMHg3ZiwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bMF0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzFdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blsyXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bM10sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzRdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls1XSwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwNjsKKwkJb3V0YigwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMjsKKwkJb3V0YihkZXYtPmlkWzBdW2ldLmRldnNwLCB0bXBvcnQrKyk7CisJCW91dGIoMCwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNl0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzddLCB0bXBvcnQrKyk7CisJCWogPSBpOworCQlpZiAoKGogJiAweDA4KSAhPSAwKSB7CisJCQlqID0gKGogJiAweDA3KSB8IDB4NDA7CisJCX0KKwkJb3V0YihqLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMzsKKwkJb3V0YihzYXRuWzhdLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCisJCXRtcG9ydCAtPSAweDA4OworCQlpZiAoaW5iKHRtcG9ydCkgIT0gMHgxMSAmJiBpbmIodG1wb3J0KSAhPSAweDhlKQorCQkJY29udGludWU7CisKKwkJd2hpbGUgKGluYih0bXBvcnQpICE9IDB4OGUpCisJCQljcHVfcmVsYXgoKTsKKwkJCQorCQlkZXYtPmFjdGl2ZV9pZFswXSB8PSBtOworCisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NTA7CisJCW91dGIoMHgzMCwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg1NDsKKwkJb3V0YigweDAwLCB0bXBvcnQpOworCitwaGFzZV9jbWQ6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NTg7CisJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCQorCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCisJCXRtcG9ydCAtPSAweDA4OworCQlqID0gaW5iKHRtcG9ydCk7CisJCWlmIChqICE9IDB4MTYpIHsKKwkJCXRtcG9ydCA9IHdrcG9ydCArIDB4NTA7CisJCQlvdXRiKDB4NDEsIHRtcG9ydCk7CisJCQlnb3RvIHBoYXNlX2NtZDsKKwkJfQorc2VsX29rOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDQzOworCQlvdXRiKGlucWRbMF0sIHRtcG9ydCsrKTsKKwkJb3V0YihpbnFkWzFdLCB0bXBvcnQrKyk7CisJCW91dGIoaW5xZFsyXSwgdG1wb3J0KyspOworCQlvdXRiKGlucWRbM10sIHRtcG9ydCsrKTsKKwkJb3V0YihpbnFkWzRdLCB0bXBvcnQrKyk7CisJCW91dGIoaW5xZFs1XSwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCW91dGIoMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDI7CisJCW91dGIoZGV2LT5pZFswXVtpXS5kZXZzcCwgdG1wb3J0KyspOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJb3V0YihpbnFkWzZdLCB0bXBvcnQrKyk7CisJCW91dGIoaW5xZFs3XSwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwMzsKKwkJb3V0YihpbnFkWzhdLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCQkKKwkJdG1wb3J0IC09IDB4MDg7CisJCWlmIChpbmIodG1wb3J0KSAhPSAweDExICYmIGluYih0bXBvcnQpICE9IDB4OGUpCisJCQljb250aW51ZTsKKworCQl3aGlsZSAoaW5iKHRtcG9ydCkgIT0gMHg4ZSkKKwkJCWNwdV9yZWxheCgpOworCQkJCisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NWI7CisJCW91dGIoMHgwMCwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg1ODsKKwkJb3V0YigweDA4LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJaiA9IDA7CityZF9pbnFfZGF0YToKKwkJayA9IGluYih0bXBvcnQpOworCQlpZiAoKGsgJiAweDAxKSAhPSAwKSB7CisJCQl0bXBvcnQgLT0gMHgwNjsKKwkJCW1idWZbaisrXSA9IGluYih0bXBvcnQpOworCQkJdG1wb3J0ICs9IDB4MDY7CisJCQlnb3RvIHJkX2lucV9kYXRhOworCQl9CisJCWlmICgoayAmIDB4ODApID09IDApIHsKKwkJCWdvdG8gcmRfaW5xX2RhdGE7CisJCX0KKwkJdG1wb3J0IC09IDB4MDg7CisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKGogPT0gMHgxNikgeworCQkJZ290byBpbnFfb2s7CisJCX0KKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg1MDsKKwkJb3V0YigweDQ2LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMjsKKwkJb3V0YigwLCB0bXBvcnQrKyk7CisJCW91dGIoMCwgdG1wb3J0KyspOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJdG1wb3J0ICs9IDB4MDM7CisJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCQkKKwkJdG1wb3J0IC09IDB4MDg7CisJCWlmIChpbmIodG1wb3J0KSAhPSAweDE2KQorCQkJZ290byBzZWxfb2s7CisKK2lucV9vazoKKwkJbWJ1ZlszNl0gPSAwOworCQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgICBJRDogJTJkICAlc1xuIiwgaSwgJm1idWZbOF0pOworCQlkZXYtPmlkWzBdW2ldLmRldnR5cGUgPSBtYnVmWzBdOworCQlybWIgPSBtYnVmWzFdOworCQluID0gbWJ1Zls3XTsKKwkJaWYgKChtYnVmWzddICYgMHg2MCkgPT0gMCkgeworCQkJZ290byBub3Rfd2lkZTsKKwkJfQorCQlpZiAoKGkgPCA4KSAmJiAoKGRldi0+Z2xvYmFsX21hcFswXSAmIDB4MjApID09IDApKSB7CisJCQlnb3RvIG5vdF93aWRlOworCQl9CisJCWlmIChsdmRtb2RlID09IDApIHsKKwkJCWdvdG8gY2hnX3dpZGU7CisJCX0KKwkJaWYgKGRldi0+c3BbMF1baV0gIT0gMHgwNCkJLy8gZm9yY2UgdTIKKwkJeworCQkJZ290byBjaGdfd2lkZTsKKwkJfQorCisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NWI7CisJCW91dGIoMHgwMSwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg0MzsKKwkJb3V0YihzYXRuWzBdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blsxXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bMl0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzNdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls0XSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNV0sIHRtcG9ydCsrKTsKKwkJdG1wb3J0ICs9IDB4MDY7CisJCW91dGIoMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDI7CisJCW91dGIoZGV2LT5pZFswXVtpXS5kZXZzcCwgdG1wb3J0KyspOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzZdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls3XSwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwMzsKKwkJb3V0YihzYXRuWzhdLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCisJCXRtcG9ydCAtPSAweDA4OworCisJCWlmIChpbmIodG1wb3J0KSAhPSAweDExICYmIGluYih0bXBvcnQpICE9IDB4OGUpCisJCQljb250aW51ZTsKKworCQl3aGlsZSAoaW5iKHRtcG9ydCkgIT0gMHg4ZSkKKwkJCWNwdV9yZWxheCgpOworCit0cnlfdTM6CisJCWogPSAwOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDU0OworCQlvdXRiKDB4MDksIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA0OworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAwKSB7CisJCQlpZiAoKGluYih0bXBvcnQpICYgMHgwMSkgIT0gMCkgeworCQkJCXRtcG9ydCAtPSAweDA2OworCQkJCW91dGIodTNbaisrXSwgdG1wb3J0KTsKKwkJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCX0KKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQkJCisJCWogPSBpbmIodG1wb3J0KSAmIDB4MGY7CisJCWlmIChqID09IDB4MGYpIHsKKwkJCWdvdG8gdTNwX2luOworCQl9CisJCWlmIChqID09IDB4MGEpIHsKKwkJCWdvdG8gdTNwX2NtZDsKKwkJfQorCQlpZiAoaiA9PSAweDBlKSB7CisJCQlnb3RvIHRyeV91MzsKKwkJfQorCQljb250aW51ZTsKK3UzcF9vdXQ6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NTg7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAwKSB7CisJCQlpZiAoKGluYih0bXBvcnQpICYgMHgwMSkgIT0gMCkgeworCQkJCXRtcG9ydCAtPSAweDA2OworCQkJCW91dGIoMCwgdG1wb3J0KTsKKwkJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCX0KKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpICYgMHgwZjsKKwkJaWYgKGogPT0gMHgwZikgeworCQkJZ290byB1M3BfaW47CisJCX0KKwkJaWYgKGogPT0gMHgwYSkgeworCQkJZ290byB1M3BfY21kOworCQl9CisJCWlmIChqID09IDB4MGUpIHsKKwkJCWdvdG8gdTNwX291dDsKKwkJfQorCQljb250aW51ZTsKK3UzcF9pbjoKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg1NDsKKwkJb3V0YigweDA5LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNDsKKwkJb3V0YigweDIwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJayA9IDA7Cit1M3BfaW4xOgorCQlqID0gaW5iKHRtcG9ydCk7CisJCWlmICgoaiAmIDB4MDEpICE9IDApIHsKKwkJCXRtcG9ydCAtPSAweDA2OworCQkJbWJ1ZltrKytdID0gaW5iKHRtcG9ydCk7CisJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCWdvdG8gdTNwX2luMTsKKwkJfQorCQlpZiAoKGogJiAweDgwKSA9PSAweDAwKSB7CisJCQlnb3RvIHUzcF9pbjE7CisJCX0KKwkJdG1wb3J0IC09IDB4MDg7CisJCWogPSBpbmIodG1wb3J0KSAmIDB4MGY7CisJCWlmIChqID09IDB4MGYpIHsKKwkJCWdvdG8gdTNwX2luOworCQl9CisJCWlmIChqID09IDB4MGEpIHsKKwkJCWdvdG8gdTNwX2NtZDsKKwkJfQorCQlpZiAoaiA9PSAweDBlKSB7CisJCQlnb3RvIHUzcF9vdXQ7CisJCX0KKwkJY29udGludWU7Cit1M3BfY21kOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDUwOworCQlvdXRiKDB4MzAsIHRtcG9ydCk7CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NTQ7CisJCW91dGIoMHgwMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDQ7CisJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCQorCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQkJCisJCXRtcG9ydCAtPSAweDA4OworCQlqID0gaW5iKHRtcG9ydCk7CisJCWlmIChqICE9IDB4MTYpIHsKKwkJCWlmIChqID09IDB4NGUpIHsKKwkJCQlnb3RvIHUzcF9vdXQ7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobWJ1ZlswXSAhPSAweDAxKSB7CisJCQlnb3RvIGNoZ193aWRlOworCQl9CisJCWlmIChtYnVmWzFdICE9IDB4MDYpIHsKKwkJCWdvdG8gY2hnX3dpZGU7CisJCX0KKwkJaWYgKG1idWZbMl0gIT0gMHgwNCkgeworCQkJZ290byBjaGdfd2lkZTsKKwkJfQorCQlpZiAobWJ1ZlszXSA9PSAweDA5KSB7CisJCQltID0gMTsKKwkJCW0gPSBtIDw8IGk7CisJCQlkZXYtPndpZGVfaWRbMF0gfD0gbTsKKwkJCWRldi0+aWRbMF1baV0uZGV2c3AgPSAweGNlOworCQkJY29udGludWU7CisJCX0KK2NoZ193aWRlOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDViOworCQlvdXRiKDB4MDEsIHRtcG9ydCk7CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NDM7CisJCW91dGIoc2F0blswXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bMV0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzJdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blszXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNF0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzVdLCB0bXBvcnQrKyk7CisJCXRtcG9ydCArPSAweDA2OworCQlvdXRiKDAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDAyOworCQlvdXRiKGRldi0+aWRbMF1baV0uZGV2c3AsIHRtcG9ydCsrKTsKKwkJb3V0YigwLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls2XSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bN10sIHRtcG9ydCsrKTsKKwkJdG1wb3J0ICs9IDB4MDM7CisJCW91dGIoc2F0bls4XSwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKwkJCQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaWYgKGluYih0bXBvcnQpICE9IDB4MTEgJiYgaW5iKHRtcG9ydCkgIT0gMHg4ZSkKKwkJCWNvbnRpbnVlOworCisJCXdoaWxlIChpbmIodG1wb3J0KSAhPSAweDhlKQorCQkJY3B1X3JlbGF4KCk7CisJCQkKK3RyeV93aWRlOgorCQlqID0gMDsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg1NDsKKwkJb3V0YigweDA1LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNDsKKwkJb3V0YigweDIwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMCkgeworCQkJaWYgKChpbmIodG1wb3J0KSAmIDB4MDEpICE9IDApIHsKKwkJCQl0bXBvcnQgLT0gMHgwNjsKKwkJCQlvdXRiKHdpZGVbaisrXSwgdG1wb3J0KTsKKwkJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCX0KKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKwkJCQorCQlqID0gaW5iKHRtcG9ydCkgJiAweDBmOworCQlpZiAoaiA9PSAweDBmKSB7CisJCQlnb3RvIHdpZGVwX2luOworCQl9CisJCWlmIChqID09IDB4MGEpIHsKKwkJCWdvdG8gd2lkZXBfY21kOworCQl9CisJCWlmIChqID09IDB4MGUpIHsKKwkJCWdvdG8gdHJ5X3dpZGU7CisJCX0KKwkJY29udGludWU7Cit3aWRlcF9vdXQ6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NTg7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAwKSB7CisJCQlpZiAoKGluYih0bXBvcnQpICYgMHgwMSkgIT0gMCkgeworCQkJCXRtcG9ydCAtPSAweDA2OworCQkJCW91dGIoMCwgdG1wb3J0KTsKKwkJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCX0KKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpICYgMHgwZjsKKwkJaWYgKGogPT0gMHgwZikgeworCQkJZ290byB3aWRlcF9pbjsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHdpZGVwX2NtZDsKKwkJfQorCQlpZiAoaiA9PSAweDBlKSB7CisJCQlnb3RvIHdpZGVwX291dDsKKwkJfQorCQljb250aW51ZTsKK3dpZGVwX2luOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDU0OworCQlvdXRiKDB4ZmYsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA0OworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQlrID0gMDsKK3dpZGVwX2luMToKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoKGogJiAweDAxKSAhPSAwKSB7CisJCQl0bXBvcnQgLT0gMHgwNjsKKwkJCW1idWZbaysrXSA9IGluYih0bXBvcnQpOworCQkJdG1wb3J0ICs9IDB4MDY7CisJCQlnb3RvIHdpZGVwX2luMTsKKwkJfQorCQlpZiAoKGogJiAweDgwKSA9PSAweDAwKSB7CisJCQlnb3RvIHdpZGVwX2luMTsKKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpICYgMHgwZjsKKwkJaWYgKGogPT0gMHgwZikgeworCQkJZ290byB3aWRlcF9pbjsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHdpZGVwX2NtZDsKKwkJfQorCQlpZiAoaiA9PSAweDBlKSB7CisJCQlnb3RvIHdpZGVwX291dDsKKwkJfQorCQljb250aW51ZTsKK3dpZGVwX2NtZDoKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg1MDsKKwkJb3V0YigweDMwLCB0bXBvcnQpOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDU0OworCQlvdXRiKDB4MDAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA0OworCQlvdXRiKDB4MDgsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJdG1wb3J0IC09IDB4MDg7CisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKGogIT0gMHgxNikgeworCQkJaWYgKGogPT0gMHg0ZSkgeworCQkJCWdvdG8gd2lkZXBfb3V0OworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKG1idWZbMF0gIT0gMHgwMSkgeworCQkJZ290byBub3Rfd2lkZTsKKwkJfQorCQlpZiAobWJ1ZlsxXSAhPSAweDAyKSB7CisJCQlnb3RvIG5vdF93aWRlOworCQl9CisJCWlmIChtYnVmWzJdICE9IDB4MDMpIHsKKwkJCWdvdG8gbm90X3dpZGU7CisJCX0KKwkJaWYgKG1idWZbM10gIT0gMHgwMSkgeworCQkJZ290byBub3Rfd2lkZTsKKwkJfQorCQltID0gMTsKKwkJbSA9IG0gPDwgaTsKKwkJZGV2LT53aWRlX2lkWzBdIHw9IG07Citub3Rfd2lkZToKKwkJaWYgKChkZXYtPmlkWzBdW2ldLmRldnR5cGUgPT0gMHgwMCkgfHwgKGRldi0+aWRbMF1baV0uZGV2dHlwZSA9PSAweDA3KSB8fCAoKGRldi0+aWRbMF1baV0uZGV2dHlwZSA9PSAweDA1KSAmJiAoKG4gJiAweDEwKSAhPSAwKSkpIHsKKwkJCW0gPSAxOworCQkJbSA9IG0gPDwgaTsKKwkJCWlmICgoZGV2LT5hc3luY1swXSAmIG0pICE9IDApIHsKKwkJCQlnb3RvIHNldF9zeW5jOworCQkJfQorCQl9CisJCWNvbnRpbnVlOworc2V0X3N5bmM6CisJCWlmIChkZXYtPnNwWzBdW2ldID09IDB4MDIpIHsKKwkJCXN5bnVbNF0gPSAweDBjOworCQkJc3ludXdbNF0gPSAweDBjOworCQl9IGVsc2UgeworCQkJaWYgKGRldi0+c3BbMF1baV0gPj0gMHgwMykgeworCQkJCXN5bnVbNF0gPSAweDBhOworCQkJCXN5bnV3WzRdID0gMHgwYTsKKwkJCX0KKwkJfQorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDViOworCQlqID0gMDsKKwkJaWYgKChtICYgZGV2LT53aWRlX2lkWzBdKSAhPSAwKSB7CisJCQlqIHw9IDB4MDE7CisJCX0KKwkJb3V0YihqLCB0bXBvcnQpOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDQzOworCQlvdXRiKHNhdG5bMF0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzFdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blsyXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bM10sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzRdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls1XSwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwNjsKKwkJb3V0YigwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMjsKKwkJb3V0YihkZXYtPmlkWzBdW2ldLmRldnNwLCB0bXBvcnQrKyk7CisJCW91dGIoMCwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNl0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzddLCB0bXBvcnQrKyk7CisJCXRtcG9ydCArPSAweDAzOworCQlvdXRiKHNhdG5bOF0sIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJdG1wb3J0IC09IDB4MDg7CisJCWlmICgoaW5iKHRtcG9ydCkgIT0gMHgxMSkgJiYgKGluYih0bXBvcnQpICE9IDB4OGUpKSB7CisJCQljb250aW51ZTsKKwkJfQorCQl3aGlsZSAoaW5iKHRtcG9ydCkgIT0gMHg4ZSkKKwkJCWNwdV9yZWxheCgpOworCit0cnlfc3luYzoKKwkJaiA9IDA7CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NTQ7CisJCW91dGIoMHgwNiwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDQ7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDApIHsKKwkJCWlmICgoaW5iKHRtcG9ydCkgJiAweDAxKSAhPSAwKSB7CisJCQkJdG1wb3J0IC09IDB4MDY7CisJCQkJaWYgKChtICYgZGV2LT53aWRlX2lkWzBdKSAhPSAwKSB7CisJCQkJCWlmICgobSAmIGRldi0+dWx0cmFfbWFwWzBdKSAhPSAwKSB7CisJCQkJCQlvdXRiKHN5bnV3W2orK10sIHRtcG9ydCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlvdXRiKHN5bndbaisrXSwgdG1wb3J0KTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmICgobSAmIGRldi0+dWx0cmFfbWFwWzBdKSAhPSAwKSB7CisJCQkJCQlvdXRiKHN5bnVbaisrXSwgdG1wb3J0KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW91dGIoc3lubltqKytdLCB0bXBvcnQpOworCQkJCQl9CisJCQkJfQorCQkJCXRtcG9ydCArPSAweDA2OworCQkJfQorCQl9CisJCXRtcG9ydCAtPSAweDA4OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJaiA9IGluYih0bXBvcnQpICYgMHgwZjsKKwkJaWYgKGogPT0gMHgwZikgeworCQkJZ290byBwaGFzZV9pbnM7CisJCX0KKwkJaWYgKGogPT0gMHgwYSkgeworCQkJZ290byBwaGFzZV9jbWRzOworCQl9CisJCWlmIChqID09IDB4MGUpIHsKKwkJCWdvdG8gdHJ5X3N5bmM7CisJCX0KKwkJY29udGludWU7CitwaGFzZV9vdXRzOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDU4OworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkgeworCQkJaWYgKChpbmIodG1wb3J0KSAmIDB4MDEpICE9IDB4MDApIHsKKwkJCQl0bXBvcnQgLT0gMHgwNjsKKwkJCQlvdXRiKDB4MDAsIHRtcG9ydCk7CisJCQkJdG1wb3J0ICs9IDB4MDY7CisJCQl9CisJCX0KKwkJdG1wb3J0IC09IDB4MDg7CisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKGogPT0gMHg4NSkgeworCQkJZ290byB0YXJfZGNvbnM7CisJCX0KKwkJaiAmPSAweDBmOworCQlpZiAoaiA9PSAweDBmKSB7CisJCQlnb3RvIHBoYXNlX2luczsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHBoYXNlX2NtZHM7CisJCX0KKwkJaWYgKGogPT0gMHgwZSkgeworCQkJZ290byBwaGFzZV9vdXRzOworCQl9CisJCWNvbnRpbnVlOworcGhhc2VfaW5zOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDU0OworCQlvdXRiKDB4MDYsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA0OworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQlrID0gMDsKK3BoYXNlX2luczE6CisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKChqICYgMHgwMSkgIT0gMHgwMCkgeworCQkJdG1wb3J0IC09IDB4MDY7CisJCQltYnVmW2srK10gPSBpbmIodG1wb3J0KTsKKwkJCXRtcG9ydCArPSAweDA2OworCQkJZ290byBwaGFzZV9pbnMxOworCQl9CisJCWlmICgoaiAmIDB4ODApID09IDB4MDApIHsKKwkJCWdvdG8gcGhhc2VfaW5zMTsKKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKGogPT0gMHg4NSkgeworCQkJZ290byB0YXJfZGNvbnM7CisJCX0KKwkJaiAmPSAweDBmOworCQlpZiAoaiA9PSAweDBmKSB7CisJCQlnb3RvIHBoYXNlX2luczsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHBoYXNlX2NtZHM7CisJCX0KKwkJaWYgKGogPT0gMHgwZSkgeworCQkJZ290byBwaGFzZV9vdXRzOworCQl9CisJCWNvbnRpbnVlOworcGhhc2VfY21kczoKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg1MDsKKwkJb3V0YigweDMwLCB0bXBvcnQpOwordGFyX2Rjb25zOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDU0OworCQlvdXRiKDB4MDAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA0OworCQlvdXRiKDB4MDgsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJdG1wb3J0IC09IDB4MDg7CisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKGogIT0gMHgxNikgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG1idWZbMF0gIT0gMHgwMSkgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG1idWZbMV0gIT0gMHgwMykgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG1idWZbNF0gPT0gMHgwMCkgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG1idWZbM10gPiAweDY0KSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobWJ1Zls0XSA+IDB4MGUpIHsKKwkJCW1idWZbNF0gPSAweDBlOworCQl9CisJCWRldi0+aWRbMF1baV0uZGV2c3AgPSBtYnVmWzRdOworCQlpZiAobWJ1ZlszXSA8IDB4MGMpIHsKKwkJCWogPSAweGIwOworCQkJZ290byBzZXRfc3luX29rOworCQl9CisJCWlmICgobWJ1ZlszXSA8IDB4MGQpICYmIChybWIgPT0gMCkpIHsKKwkJCWogPSAweGEwOworCQkJZ290byBzZXRfc3luX29rOworCQl9CisJCWlmIChtYnVmWzNdIDwgMHgxYSkgeworCQkJaiA9IDB4MjA7CisJCQlnb3RvIHNldF9zeW5fb2s7CisJCX0KKwkJaWYgKG1idWZbM10gPCAweDMzKSB7CisJCQlqID0gMHg0MDsKKwkJCWdvdG8gc2V0X3N5bl9vazsKKwkJfQorCQlpZiAobWJ1ZlszXSA8IDB4NGMpIHsKKwkJCWogPSAweDUwOworCQkJZ290byBzZXRfc3luX29rOworCQl9CisJCWogPSAweDYwOworc2V0X3N5bl9vazoKKwkJZGV2LT5pZFswXVtpXS5kZXZzcCA9IChkZXYtPmlkWzBdW2ldLmRldnNwICYgMHgwZikgfCBqOworCX0KK30KKworc3RhdGljIHZvaWQgYXRwODcwdV9mcmVlX3RhYmxlcyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0cnVjdCBhdHBfdW5pdCAqYXRwX2RldiA9IChzdHJ1Y3QgYXRwX3VuaXQgKikmaG9zdC0+aG9zdGRhdGE7CisJaW50IGosIGs7CisJZm9yIChqPTA7IGogPCAyOyBqKyspIHsKKwkJZm9yIChrID0gMDsgayA8IDE2OyBrKyspIHsKKwkJCWlmICghYXRwX2Rldi0+aWRbal1ba10ucHJkX3RhYmxlKQorCQkJCWNvbnRpbnVlOworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChhdHBfZGV2LT5wZGV2LCAxMDI0LCBhdHBfZGV2LT5pZFtqXVtrXS5wcmRfdGFibGUsIGF0cF9kZXYtPmlkW2pdW2tdLnByZGFkZHIpOworCQkJYXRwX2Rldi0+aWRbal1ba10ucHJkX3RhYmxlID0gTlVMTDsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBhdHA4NzB1X2luaXRfdGFibGVzKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RydWN0IGF0cF91bml0ICphdHBfZGV2ID0gKHN0cnVjdCBhdHBfdW5pdCAqKSZob3N0LT5ob3N0ZGF0YTsKKwlpbnQgYyxrOworCWZvcihjPTA7YyA8IDI7YysrKSB7CisJICAgCWZvcihrPTA7azwxNjtrKyspIHsKKwkgICAJCQlhdHBfZGV2LT5pZFtjXVtrXS5wcmRfdGFibGUgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhdHBfZGV2LT5wZGV2LCAxMDI0LCAmKGF0cF9kZXYtPmlkW2NdW2tdLnByZGFkZHIpKTsKKwkgICAJCQlpZiAoIWF0cF9kZXYtPmlkW2NdW2tdLnByZF90YWJsZSkgeworCSAgIAkJCQlwcmludGsoImF0cDg3MHVfaW5pdF90YWJsZXMgZmFpbFxuIik7CisJCQkJYXRwODcwdV9mcmVlX3RhYmxlcyhob3N0KTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWF0cF9kZXYtPmlkW2NdW2tdLmRldnNwPTB4MjA7CisJCQlhdHBfZGV2LT5pZFtjXVtrXS5kZXZ0eXBlID0gMHg3ZjsKKwkJCWF0cF9kZXYtPmlkW2NdW2tdLmN1cnJfcmVxID0gTlVMTDsJCQkgICAKKwkgICAJfQorCSAgIAkJCQorCSAgIAlhdHBfZGV2LT5hY3RpdmVfaWRbY10gPSAwOworCSAgIAlhdHBfZGV2LT53aWRlX2lkW2NdID0gMDsKKwkgICAJYXRwX2Rldi0+aG9zdF9pZFtjXSA9IDB4MDc7CisJICAgCWF0cF9kZXYtPnF1aGRbY10gPSAwOworCSAgIAlhdHBfZGV2LT5xdWVuZFtjXSA9IDA7CisJICAgCWF0cF9kZXYtPmxhc3RfY21kW2NdID0gMHhmZjsKKwkgICAJYXRwX2Rldi0+aW5fc25kW2NdID0gMDsKKwkgICAJYXRwX2Rldi0+aW5faW50W2NdID0gMDsKKwkgICAJCisJICAgCWZvciAoayA9IDA7IGsgPCBxY250OyBrKyspIHsKKwkgICAJCSAgYXRwX2Rldi0+cXVlcmVxW2NdW2tdID0gTlVMTDsKKwkgICAJfQkgICAJCSAgIAorCSAgIAlmb3IgKGsgPSAwOyBrIDwgMTY7IGsrKykgeworCQkJICAgYXRwX2Rldi0+aWRbY11ba10uY3Vycl9yZXEgPSBOVUxMOworCQkJICAgYXRwX2Rldi0+c3BbY11ba10gPSAweDA0OworCSAgIAl9CQkgICAKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIHJldHVybiBub24temVybyBvbiBkZXRlY3Rpb24gKi8KK3N0YXRpYyBpbnQgYXRwODcwdV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwl1bnNpZ25lZCBjaGFyIGssIG0sIGM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgYmFzZV9pbywgdG1wb3J0LCBlcnJvcixuOworCXVuc2lnbmVkIGNoYXIgaG9zdF9pZDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IE5VTEw7CisJc3RydWN0IGF0cF91bml0IGF0cF9kZXYsICpwOworCXVuc2lnbmVkIGNoYXIgc2V0dXBkYXRhWzJdWzE2XTsKKwlpbnQgY291bnQgPSAwOworCQorCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJcmV0dXJuIC1FSU87CisKKyAgICAgICAgaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4RkZGRkZGRkZVTCkpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJhdHA4NzB1OiB1c2UgMzJiaXQgRE1BIG1hc2suXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImF0cDg3MHU6IERNQSBtYXNrIHJlcXVpcmVkIGJ1dCBub3QgYXZhaWxhYmxlLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIH0KKworCW1lbXNldCgmYXRwX2RldiwgMCwgc2l6ZW9mIGF0cF9kZXYpOworCS8qCisJICogSXQncyBwcm9iYWJseSBlYXNpZXIgdG8gd2VlZCBvdXQgc29tZSByZXZpc2lvbnMgbGlrZQorCSAqIHRoaXMgdGhhbiB2aWEgdGhlIFBDSSBkZXZpY2UgdGFibGUKKwkgKi8KKwlpZiAoZW50LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BUlRPUF9BRUM3NjEwKSB7CisJCWVycm9yID0gcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmYXRwX2Rldi5jaGlwX3Zlcik7CisJCWlmIChhdHBfZGV2LmNoaXBfdmVyIDwgMikKKwkJCXJldHVybiAtRUlPOworCX0KKworCXN3aXRjaCAoZW50LT5kZXZpY2UpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfQVJUT1BfQUVDNzYxMlVXOgorCWNhc2UgUENJX0RFVklDRV9JRF9BUlRPUF9BRUM3NjEyU1VXOgorCWNhc2UgQVRQODgwX0RFVklEMToJCisJY2FzZSBBVFA4ODBfREVWSUQyOgkKKwljYXNlIEFUUDg4NV9ERVZJRDoJCisJCWF0cF9kZXYuY2hpcF92ZXIgPSAweDA0OworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwliYXNlX2lvID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWJhc2VfaW8gJj0gMHhmZmZmZmZmODsKKwkKKwlpZiAoKGVudC0+ZGV2aWNlID09IEFUUDg4MF9ERVZJRDEpfHwoZW50LT5kZXZpY2UgPT0gQVRQODgwX0RFVklEMikpIHsKKwkJZXJyb3IgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZhdHBfZGV2LmNoaXBfdmVyKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDgwKTsvL0pDQzA4MjgwMworCisJCWhvc3RfaWQgPSBpbmIoYmFzZV9pbyArIDB4MzkpOworCQlob3N0X2lkID4+PSAweDA0OworCisJCXByaW50ayhLRVJOX0lORk8gIiAgIEFDQVJEIEFFQy02NzE2MCBQQ0kgVWx0cmEzIExWRCBIb3N0IEFkYXB0ZXI6ICVkIgorCQkJIiAgICBJTzoleCwgSVJROiVkLlxuIiwgY291bnQsIGJhc2VfaW8sIHBkZXYtPmlycSk7CisJCWF0cF9kZXYuaW9wb3J0WzBdID0gYmFzZV9pbyArIDB4NDA7CisJCWF0cF9kZXYucGNpcG9ydFswXSA9IGJhc2VfaW8gKyAweDI4OworCQlhdHBfZGV2LmRldl9pZCA9IGVudC0+ZGV2aWNlOworCQlhdHBfZGV2Lmhvc3RfaWRbMF0gPSBob3N0X2lkOworCisJCXRtcG9ydCA9IGJhc2VfaW8gKyAweDIyOworCQlhdHBfZGV2LnNjYW1fb24gPSBpbmIodG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MTM7CisJCWF0cF9kZXYuZ2xvYmFsX21hcFswXSA9IGluYih0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJYXRwX2Rldi51bHRyYV9tYXBbMF0gPSBpbncodG1wb3J0KTsKKworCQluID0gMHgzZjA5OworbmV4dF9mYmxrXzg4MDoKKwkJaWYgKG4gPj0gMHg0MDAwKQorCQkJZ290byBmbGFzaF9va184ODA7CisKKwkJbSA9IDA7CisJCW91dHcobiwgYmFzZV9pbyArIDB4MzQpOworCQluICs9IDB4MDAwMjsKKwkJaWYgKGluYihiYXNlX2lvICsgMHgzMCkgPT0gMHhmZikKKwkJCWdvdG8gZmxhc2hfb2tfODgwOworCisJCWF0cF9kZXYuc3BbMF1bbSsrXSA9IGluYihiYXNlX2lvICsgMHgzMCk7CisJCWF0cF9kZXYuc3BbMF1bbSsrXSA9IGluYihiYXNlX2lvICsgMHgzMSk7CisJCWF0cF9kZXYuc3BbMF1bbSsrXSA9IGluYihiYXNlX2lvICsgMHgzMik7CisJCWF0cF9kZXYuc3BbMF1bbSsrXSA9IGluYihiYXNlX2lvICsgMHgzMyk7CisJCW91dHcobiwgYmFzZV9pbyArIDB4MzQpOworCQluICs9IDB4MDAwMjsKKwkJYXRwX2Rldi5zcFswXVttKytdID0gaW5iKGJhc2VfaW8gKyAweDMwKTsKKwkJYXRwX2Rldi5zcFswXVttKytdID0gaW5iKGJhc2VfaW8gKyAweDMxKTsKKwkJYXRwX2Rldi5zcFswXVttKytdID0gaW5iKGJhc2VfaW8gKyAweDMyKTsKKwkJYXRwX2Rldi5zcFswXVttKytdID0gaW5iKGJhc2VfaW8gKyAweDMzKTsKKwkJb3V0dyhuLCBiYXNlX2lvICsgMHgzNCk7CisJCW4gKz0gMHgwMDAyOworCQlhdHBfZGV2LnNwWzBdW20rK10gPSBpbmIoYmFzZV9pbyArIDB4MzApOworCQlhdHBfZGV2LnNwWzBdW20rK10gPSBpbmIoYmFzZV9pbyArIDB4MzEpOworCQlhdHBfZGV2LnNwWzBdW20rK10gPSBpbmIoYmFzZV9pbyArIDB4MzIpOworCQlhdHBfZGV2LnNwWzBdW20rK10gPSBpbmIoYmFzZV9pbyArIDB4MzMpOworCQlvdXR3KG4sIGJhc2VfaW8gKyAweDM0KTsKKwkJbiArPSAweDAwMDI7CisJCWF0cF9kZXYuc3BbMF1bbSsrXSA9IGluYihiYXNlX2lvICsgMHgzMCk7CisJCWF0cF9kZXYuc3BbMF1bbSsrXSA9IGluYihiYXNlX2lvICsgMHgzMSk7CisJCWF0cF9kZXYuc3BbMF1bbSsrXSA9IGluYihiYXNlX2lvICsgMHgzMik7CisJCWF0cF9kZXYuc3BbMF1bbSsrXSA9IGluYihiYXNlX2lvICsgMHgzMyk7CisJCW4gKz0gMHgwMDE4OworCQlnb3RvIG5leHRfZmJsa184ODA7CitmbGFzaF9va184ODA6CisJCW91dHcoMCwgYmFzZV9pbyArIDB4MzQpOworCQlhdHBfZGV2LnVsdHJhX21hcFswXSA9IDA7CisJCWF0cF9kZXYuYXN5bmNbMF0gPSAwOworCQlmb3IgKGsgPSAwOyBrIDwgMTY7IGsrKykgeworCQkJbiA9IDE7CisJCQluID0gbiA8PCBrOworCQkJaWYgKGF0cF9kZXYuc3BbMF1ba10gPiAxKSB7CisJCQkJYXRwX2Rldi51bHRyYV9tYXBbMF0gfD0gbjsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGF0cF9kZXYuc3BbMF1ba10gPT0gMCkKKwkJCQkJYXRwX2Rldi5hc3luY1swXSB8PSBuOworIAkJCX0KKwkgCX0KKwkJYXRwX2Rldi5hc3luY1swXSA9IH4oYXRwX2Rldi5hc3luY1swXSk7CisJCW91dGIoYXRwX2Rldi5nbG9iYWxfbWFwWzBdLCBiYXNlX2lvICsgMHgzNSk7CisgCisJCXNocG50ID0gc2NzaV9ob3N0X2FsbG9jKCZhdHA4NzB1X3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IGF0cF91bml0KSk7CisJCWlmICghc2hwbnQpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlwID0gKHN0cnVjdCBhdHBfdW5pdCAqKSZzaHBudC0+aG9zdGRhdGE7CisKKwkJYXRwX2Rldi5ob3N0ID0gc2hwbnQ7CisJCWF0cF9kZXYucGRldiA9IHBkZXY7CisJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBwKTsKKwkJbWVtY3B5KHAsICZhdHBfZGV2LCBzaXplb2YgYXRwX2Rldik7CisJCWlmIChhdHA4NzB1X2luaXRfdGFibGVzKHNocG50KSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIHRhYmxlcyBmb3IgQWNhcmQgY29udHJvbGxlclxuIik7CisJCQlnb3RvIHVucmVnaXN0ZXI7CisJCX0KKworCQlpZiAocmVxdWVzdF9pcnEocGRldi0+aXJxLCBhdHA4NzB1X2ludHJfaGFuZGxlLCBTQV9TSElSUSwgImF0cDg4MGkiLCBzaHBudCkpIHsKKyAJCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBJUlElZCBmb3IgQWNhcmQgY29udHJvbGxlci5cbiIsIHBkZXYtPmlycSk7CisJCQlnb3RvIGZyZWVfdGFibGVzOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoc2hwbnQtPmhvc3RfbG9jaywgZmxhZ3MpOworCQl0bXBvcnQgPSBiYXNlX2lvICsgMHgzODsKKwkJayA9IGluYih0bXBvcnQpICYgMHg4MDsKKwkJb3V0YihrLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMzsKKwkJb3V0YigweDIwLCB0bXBvcnQpOworCQltZGVsYXkoMzIpOworCQlvdXRiKDAsIHRtcG9ydCk7CisJCW1kZWxheSgzMik7CisJCXRtcG9ydCA9IGJhc2VfaW8gKyAweDViOworCQlpbmIodG1wb3J0KTsKKwkJdG1wb3J0IC09IDB4MDQ7CisJCWluYih0bXBvcnQpOworCQl0bXBvcnQgPSBiYXNlX2lvICsgMHg0MDsKKwkJb3V0YigoaG9zdF9pZCB8IDB4MDgpLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgxODsKKwkJb3V0YigwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDApCisJCQltZGVsYXkoMSk7CisJCXRtcG9ydCAtPSAweDA4OworCQlpbmIodG1wb3J0KTsKKwkJdG1wb3J0ID0gYmFzZV9pbyArIDB4NDE7CisJCW91dGIoOCwgdG1wb3J0KyspOworCQlvdXRiKDB4N2YsIHRtcG9ydCk7CisJCXRtcG9ydCA9IGJhc2VfaW8gKyAweDUxOworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisKKwkJdHNjYW0oc2hwbnQpOworCQlpczg4MChwLCBiYXNlX2lvKTsKKwkJdG1wb3J0ID0gYmFzZV9pbyArIDB4Mzg7CisJCW91dGIoMHhiMCwgdG1wb3J0KTsKKwkJc2hwbnQtPm1heF9pZCA9IDE2OworCQlzaHBudC0+dGhpc19pZCA9IGhvc3RfaWQ7CisJCXNocG50LT51bmlxdWVfaWQgPSBiYXNlX2lvOworCQlzaHBudC0+aW9fcG9ydCA9IGJhc2VfaW87CisJCXNocG50LT5uX2lvX3BvcnQgPSAweDYwOwkvKiBOdW1iZXIgb2YgYnl0ZXMgb2YgSS9PIHNwYWNlIHVzZWQgKi8KKwkJc2hwbnQtPmlycSA9IHBkZXYtPmlycTsJCQkKKwl9IGVsc2UgaWYgKGVudC0+ZGV2aWNlID09IEFUUDg4NV9ERVZJRCkgewkKKwkJCXByaW50ayhLRVJOX0lORk8gIiAgIEFDQVJEIEFFQy02NzE2MiBQQ0kgVWx0cmEzIExWRCBIb3N0IEFkYXB0ZXI6ICBJTzoleCwgSVJROiVkLlxuIgorCQkJICAgICAgICwgYmFzZV9pbywgcGRldi0+aXJxKTsKKyAgICAgICAgCQorCQlhdHBfZGV2LnBkZXYgPSBwZGV2OwkKKwkJYXRwX2Rldi5kZXZfaWQgID0gZW50LT5kZXZpY2U7CisJCWF0cF9kZXYuYmFzZXBvcnQgPSBiYXNlX2lvOworCQlhdHBfZGV2LmlvcG9ydFswXSA9IGJhc2VfaW8gKyAweDgwOworCQlhdHBfZGV2LmlvcG9ydFsxXSA9IGJhc2VfaW8gKyAweGMwOworCQlhdHBfZGV2LnBjaXBvcnRbMF0gPSBiYXNlX2lvICsgMHg0MDsKKwkJYXRwX2Rldi5wY2lwb3J0WzFdID0gYmFzZV9pbyArIDB4NTA7CisJCQkJCisJCXNocG50ID0gc2NzaV9ob3N0X2FsbG9jKCZhdHA4NzB1X3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IGF0cF91bml0KSk7CisJCWlmICghc2hwbnQpCisJCQlyZXR1cm4gLUVOT01FTTsKKyAgICAgICAgCQorCQlwID0gKHN0cnVjdCBhdHBfdW5pdCAqKSZzaHBudC0+aG9zdGRhdGE7CisgICAgICAgIAkKKwkJYXRwX2Rldi5ob3N0ID0gc2hwbnQ7CisJCWF0cF9kZXYucGRldiA9IHBkZXY7CisJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBwKTsKKwkJbWVtY3B5KHAsICZhdHBfZGV2LCBzaXplb2Yoc3RydWN0IGF0cF91bml0KSk7CisJCWlmIChhdHA4NzB1X2luaXRfdGFibGVzKHNocG50KSA8IDApCisJCQlnb3RvIHVucmVnaXN0ZXI7CisJCQkKKyNpZmRlZiBFRF9EQkdQCQkKKwlwcmludGsoInJlcXVlc3RfaXJxKCkgc2hwbnQgJXAgaG9zdGRhdGEgJXBcbiIsIHNocG50LCBwKTsKKyNlbmRpZgkgICAgICAgIAorCQlpZiAocmVxdWVzdF9pcnEocGRldi0+aXJxLCBhdHA4NzB1X2ludHJfaGFuZGxlLCBTQV9TSElSUSwgImF0cDg3MHUiLCBzaHBudCkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBJUlEgZm9yIEFjYXJkIGNvbnRyb2xsZXIuXG4iKTsKKwkJCWdvdG8gZnJlZV90YWJsZXM7CisJCX0KKwkJCisJCXNwaW5fbG9ja19pcnFzYXZlKHNocG50LT5ob3N0X2xvY2ssIGZsYWdzKTsgICAgICAgIAkJCQkJCisgICAgICAgIAkJCQorCQljPWluYihiYXNlX2lvICsgMHgyOSk7CisJCW91dGIoKGMgfCAweDA0KSxiYXNlX2lvICsgMHgyOSk7CisgICAgICAgIAkKKwkJbj0weDFmODA7CituZXh0X2ZibGtfODg1OgorCQlpZiAobiA+PSAweDIwMDApIHsKKwkJICAgZ290byBmbGFzaF9va184ODU7CisJCX0KKwkJb3V0dyhuLGJhc2VfaW8gKyAweDNjKTsKKwkJaWYgKGlubChiYXNlX2lvICsgMHgzOCkgPT0gMHhmZmZmZmZmZikgeworCQkgICBnb3RvIGZsYXNoX29rXzg4NTsKKwkJfQorCQlmb3IgKG09MDsgbSA8IDI7IG0rKykgeworCQkgICAgcC0+Z2xvYmFsX21hcFttXT0gMDsKKwkJICAgIGZvciAoaz0wOyBrIDwgNDsgaysrKSB7CisJCQlvdXR3KG4rKyxiYXNlX2lvICsgMHgzYyk7CisJCQkoKHVuc2lnbmVkIGxvbmcgKikmc2V0dXBkYXRhW21dWzBdKVtrXT1pbmwoYmFzZV9pbyArIDB4MzgpOworCQkgICAgfQorCQkgICAgZm9yIChrPTA7IGsgPCA0OyBrKyspIHsKKwkJCW91dHcobisrLGJhc2VfaW8gKyAweDNjKTsKKwkJCSgodW5zaWduZWQgbG9uZyAqKSZwLT5zcFttXVswXSlba109aW5sKGJhc2VfaW8gKyAweDM4KTsKKwkJICAgIH0KKwkJICAgIG4gKz0gODsKKwkJfQorCQlnb3RvIG5leHRfZmJsa184ODU7CitmbGFzaF9va184ODU6CisjaWZkZWYgRURfREJHUAorCQlwcmludGsoICJGbGFzaCBSZWFkIE9LXG4iKTsKKyNlbmRpZgkKKwkJYz1pbmIoYmFzZV9pbyArIDB4MjkpOworCQlvdXRiKChjICYgMHhmYiksYmFzZV9pbyArIDB4MjkpOworCQlmb3IgKGM9MDtjIDwgMjtjKyspIHsKKwkJICAgIHAtPnVsdHJhX21hcFtjXT0wOworCQkgICAgcC0+YXN5bmNbY10gPSAwOworCQkgICAgZm9yIChrPTA7IGsgPCAxNjsgaysrKSB7CisJCQluPTE7CisJCQluID0gbiA8PCBrOworCQkJaWYgKHAtPnNwW2NdW2tdID4gMSkgeworCQkJICAgcC0+dWx0cmFfbWFwW2NdIHw9IG47CisJCQl9IGVsc2UgeworCQkJICAgaWYgKHAtPnNwW2NdW2tdID09IDApIHsKKwkJCSAgICAgIHAtPmFzeW5jW2NdIHw9IG47CisJCQkgICB9CisJCQl9CisJCSAgICB9CisJCSAgICBwLT5hc3luY1tjXSA9IH4ocC0+YXN5bmNbY10pOworCisJCSAgICBpZiAocC0+Z2xvYmFsX21hcFtjXSA9PSAwKSB7CisJCSAgICAgICBrPXNldHVwZGF0YVtjXVsxXTsKKwkJICAgICAgIGlmICgoayAmIDB4NDApICE9IDApCisJCQkgIHAtPmdsb2JhbF9tYXBbY10gfD0gMHgyMDsKKwkJICAgICAgIGsgJj0gMHgwNzsKKwkJICAgICAgIHAtPmdsb2JhbF9tYXBbY10gfD0gazsKKwkJICAgICAgIGlmICgoc2V0dXBkYXRhW2NdWzJdICYgMHgwNCkgIT0gMCkKKwkJCSAgcC0+Z2xvYmFsX21hcFtjXSB8PSAweDA4OworCQkgICAgICAgcC0+aG9zdF9pZFtjXSA9IHNldHVwZGF0YVtjXVswXSAmIDB4MDc7CisJCSAgICB9CisJCX0KKworCQlrID0gaW5iKGJhc2VfaW8gKyAweDI4KSAmIDB4OGY7CisJCWsgfD0gMHgxMDsKKwkJb3V0YihrLCBiYXNlX2lvICsgMHgyOCk7CisJCW91dGIoMHg4MCwgYmFzZV9pbyArIDB4NDEpOworCQlvdXRiKDB4ODAsIGJhc2VfaW8gKyAweDUxKTsKKwkJbWRlbGF5KDEwMCk7CisJCW91dGIoMCwgYmFzZV9pbyArIDB4NDEpOworCQlvdXRiKDAsIGJhc2VfaW8gKyAweDUxKTsKKwkJbWRlbGF5KDEwMDApOworCQlpbmIoYmFzZV9pbyArIDB4OWIpOworCQlpbmIoYmFzZV9pbyArIDB4OTcpOworCQlpbmIoYmFzZV9pbyArIDB4ZGIpOworCQlpbmIoYmFzZV9pbyArIDB4ZDcpOworCQl0bXBvcnQgPSBiYXNlX2lvICsgMHg4MDsKKwkJaz1wLT5ob3N0X2lkWzBdOworCQlpZiAoayA+IDcpCisJCSAgIGsgPSAoayAmIDB4MDcpIHwgMHg0MDsKKwkJayB8PSAweDA4OworCQlvdXRiKGssIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDE4OworCQlvdXRiKDAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAwKQorCQkJY3B1X3JlbGF4KCk7CisJCisJCXRtcG9ydCAtPSAweDA4OworCQlpbmIodG1wb3J0KTsKKwkJdG1wb3J0ID0gYmFzZV9pbyArIDB4ODE7CisJCW91dGIoOCwgdG1wb3J0KyspOworCQlvdXRiKDB4N2YsIHRtcG9ydCk7CisJCXRtcG9ydCA9IGJhc2VfaW8gKyAweDkxOworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisKKwkJdG1wb3J0ID0gYmFzZV9pbyArIDB4YzA7CisJCWs9cC0+aG9zdF9pZFsxXTsKKwkJaWYgKGsgPiA3KQorCQkgICBrID0gKGsgJiAweDA3KSB8IDB4NDA7CisJCWsgfD0gMHgwODsKKwkJb3V0YihrLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgxODsKKwkJb3V0YigwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMCkKKwkJCWNwdV9yZWxheCgpOworCisJCXRtcG9ydCAtPSAweDA4OworCQlpbmIodG1wb3J0KTsKKwkJdG1wb3J0ID0gYmFzZV9pbyArIDB4YzE7CisJCW91dGIoOCwgdG1wb3J0KyspOworCQlvdXRiKDB4N2YsIHRtcG9ydCk7CisJCXRtcG9ydCA9IGJhc2VfaW8gKyAweGQxOworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisKKwkJdHNjYW1fODg1KCk7CisJCXByaW50ayhLRVJOX0lORk8gIiAgIFNjYW5uaW5nIENoYW5uZWwgQSBTQ1NJIERldmljZSAuLi5cbiIpOworCQlpczg4NShwLCBiYXNlX2lvICsgMHg4MCwgMCk7CisJCXByaW50ayhLRVJOX0lORk8gIiAgIFNjYW5uaW5nIENoYW5uZWwgQiBTQ1NJIERldmljZSAuLi5cbiIpOworCQlpczg4NShwLCBiYXNlX2lvICsgMHhjMCwgMSk7CisKKwkJayA9IGluYihiYXNlX2lvICsgMHgyOCkgJiAweGNmOworCQlrIHw9IDB4YzA7CisJCW91dGIoaywgYmFzZV9pbyArIDB4MjgpOworCQlrID0gaW5iKGJhc2VfaW8gKyAweDFmKSB8IDB4ODA7CisJCW91dGIoaywgYmFzZV9pbyArIDB4MWYpOworCQlrID0gaW5iKGJhc2VfaW8gKyAweDI5KSB8IDB4MDE7CisJCW91dGIoaywgYmFzZV9pbyArIDB4MjkpOworI2lmZGVmIEVEX0RCR1AKKwkJLy9wcmludGsoImF0cDg4NTogYXRwX2hvc3RbMF0gMHglcFxuIiwgYXRwX2hvc3RbMF0pOworI2VuZGlmCQkKKwkJc2hwbnQtPm1heF9pZCA9IDE2OworCQlzaHBudC0+bWF4X2x1biA9IChwLT5nbG9iYWxfbWFwWzBdICYgMHgwNykgKyAxOworCQlzaHBudC0+bWF4X2NoYW5uZWwgPSAxOworCQlzaHBudC0+dGhpc19pZCA9IHAtPmhvc3RfaWRbMF07CisJCXNocG50LT51bmlxdWVfaWQgPSBiYXNlX2lvOworCQlzaHBudC0+aW9fcG9ydCA9IGJhc2VfaW87CisJCXNocG50LT5uX2lvX3BvcnQgPSAweGZmOwkvKiBOdW1iZXIgb2YgYnl0ZXMgb2YgSS9PIHNwYWNlIHVzZWQgKi8KKwkJc2hwbnQtPmlycSA9IHBkZXYtPmlycTsKKwkJCQkKKwl9IGVsc2UgeworCQllcnJvciA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDksICZob3N0X2lkKTsKKworCQlwcmludGsoS0VSTl9JTkZPICIgICBBQ0FSRCBBRUMtNjcxWCBQQ0kgVWx0cmEvVyBTQ1NJLTIvMyBIb3N0IEFkYXB0ZXI6ICVkICIKKwkJCSJJTzoleCwgSVJROiVkLlxuIiwgY291bnQsIGJhc2VfaW8sIHBkZXYtPmlycSk7CisKKwkJYXRwX2Rldi5pb3BvcnRbMF0gPSBiYXNlX2lvOworCQlhdHBfZGV2LnBjaXBvcnRbMF0gPSBiYXNlX2lvICsgMHgyMDsKKwkJYXRwX2Rldi5kZXZfaWQgPSBlbnQtPmRldmljZTsKKwkJaG9zdF9pZCAmPSAweDA3OworCQlhdHBfZGV2Lmhvc3RfaWRbMF0gPSBob3N0X2lkOworCQl0bXBvcnQgPSBiYXNlX2lvICsgMHgyMjsKKwkJYXRwX2Rldi5zY2FtX29uID0gaW5iKHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDBiOworCQlhdHBfZGV2Lmdsb2JhbF9tYXBbMF0gPSBpbmIodG1wb3J0KyspOworCQlhdHBfZGV2LnVsdHJhX21hcFswXSA9IGludyh0bXBvcnQpOworCisJCWlmIChhdHBfZGV2LnVsdHJhX21hcFswXSA9PSAwKSB7CisJCQlhdHBfZGV2LnNjYW1fb24gPSAweDAwOworCQkJYXRwX2Rldi5nbG9iYWxfbWFwWzBdID0gMHgyMDsKKwkJCWF0cF9kZXYudWx0cmFfbWFwWzBdID0gMHhmZmZmOworCQl9CisKKwkJc2hwbnQgPSBzY3NpX2hvc3RfYWxsb2MoJmF0cDg3MHVfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgYXRwX3VuaXQpKTsKKwkJaWYgKCFzaHBudCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXAgPSAoc3RydWN0IGF0cF91bml0ICopJnNocG50LT5ob3N0ZGF0YTsKKwkJCisJCWF0cF9kZXYuaG9zdCA9IHNocG50OworCQlhdHBfZGV2LnBkZXYgPSBwZGV2OworCQlwY2lfc2V0X2RydmRhdGEocGRldiwgcCk7CisJCW1lbWNweShwLCAmYXRwX2Rldiwgc2l6ZW9mIGF0cF9kZXYpOworCQlpZiAoYXRwODcwdV9pbml0X3RhYmxlcyhzaHBudCkgPCAwKQorCQkJZ290byB1bnJlZ2lzdGVyOworCisJCWlmIChyZXF1ZXN0X2lycShwZGV2LT5pcnEsIGF0cDg3MHVfaW50cl9oYW5kbGUsIFNBX1NISVJRLCAiYXRwODcwaSIsIHNocG50KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgSVJRJWQgZm9yIEFjYXJkIGNvbnRyb2xsZXIuXG4iLCBwZGV2LT5pcnEpOworCQkJZ290byBmcmVlX3RhYmxlczsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKHNocG50LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJaWYgKGF0cF9kZXYuY2hpcF92ZXIgPiAweDA3KSB7CS8qIGNoZWNrIGlmIGF0cDg3NiBjaGlwIHRoZW4gZW5hYmxlIHRlcm1pbmF0b3IgKi8KKwkJCXRtcG9ydCA9IGJhc2VfaW8gKyAweDNlOworCQkJb3V0YigweDAwLCB0bXBvcnQpOworCQl9CisgCisJCXRtcG9ydCA9IGJhc2VfaW8gKyAweDNhOworCQlrID0gKGluYih0bXBvcnQpICYgMHhmMykgfCAweDEwOworCQlvdXRiKGssIHRtcG9ydCk7CisJCW91dGIoKGsgJiAweGRmKSwgdG1wb3J0KTsKKwkJbWRlbGF5KDMyKTsKKwkJb3V0YihrLCB0bXBvcnQpOworCQltZGVsYXkoMzIpOworCQl0bXBvcnQgPSBiYXNlX2lvOworCQlvdXRiKChob3N0X2lkIHwgMHgwOCksIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDE4OworCQlvdXRiKDAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMCkKKwkJCW1kZWxheSgxKTsKKworCQl0bXBvcnQgLT0gMHgwODsKKwkJaW5iKHRtcG9ydCk7CisJCXRtcG9ydCA9IGJhc2VfaW8gKyAxOworCQlvdXRiKDgsIHRtcG9ydCsrKTsKKwkJb3V0YigweDdmLCB0bXBvcnQpOworCQl0bXBvcnQgPSBiYXNlX2lvICsgMHgxMTsKKwkJb3V0YigweDIwLCB0bXBvcnQpOworCisJCXRzY2FtKHNocG50KTsKKwkJaXM4NzAocCwgYmFzZV9pbyk7CisJCXRtcG9ydCA9IGJhc2VfaW8gKyAweDNhOworCQlvdXRiKChpbmIodG1wb3J0KSAmIDB4ZWYpLCB0bXBvcnQpOworCQl0bXBvcnQrKzsKKwkJb3V0YigoaW5iKHRtcG9ydCkgfCAweDIwKSwgdG1wb3J0KTsKKwkJaWYgKGF0cF9kZXYuY2hpcF92ZXIgPT0gNCkKKwkJCXNocG50LT5tYXhfaWQgPSAxNjsKKwkJZWxzZQkJCisJCQlzaHBudC0+bWF4X2lkID0gNzsKKwkJc2hwbnQtPnRoaXNfaWQgPSBob3N0X2lkOworCQlzaHBudC0+dW5pcXVlX2lkID0gYmFzZV9pbzsKKwkJc2hwbnQtPmlvX3BvcnQgPSBiYXNlX2lvOworCQlzaHBudC0+bl9pb19wb3J0ID0gMHg0MDsJLyogTnVtYmVyIG9mIGJ5dGVzIG9mIEkvTyBzcGFjZSB1c2VkICovCisJCXNocG50LT5pcnEgPSBwZGV2LT5pcnE7CQkKKwl9IAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNocG50LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJaWYoZW50LT5kZXZpY2U9PUFUUDg4NV9ERVZJRCkgeworCQkJaWYoIXJlcXVlc3RfcmVnaW9uKGJhc2VfaW8sIDB4ZmYsICJhdHA4NzB1IikpIC8qIFJlZ2lzdGVyIHRoZSBJTyBwb3J0cyB0aGF0IHdlIHVzZSAqLworCQkJCWdvdG8gcmVxdWVzdF9pb19mYWlsOworCQl9IGVsc2UgaWYoKGVudC0+ZGV2aWNlPT1BVFA4ODBfREVWSUQxKXx8KGVudC0+ZGV2aWNlPT1BVFA4ODBfREVWSUQyKSkgeworCQkJaWYoIXJlcXVlc3RfcmVnaW9uKGJhc2VfaW8sIDB4NjAsICJhdHA4NzB1IikpIC8qIFJlZ2lzdGVyIHRoZSBJTyBwb3J0cyB0aGF0IHdlIHVzZSAqLworCQkJCWdvdG8gcmVxdWVzdF9pb19mYWlsOworCQl9IGVsc2UgeworCQkJaWYoIXJlcXVlc3RfcmVnaW9uKGJhc2VfaW8sIDB4NDAsICJhdHA4NzB1IikpIC8qIFJlZ2lzdGVyIHRoZSBJTyBwb3J0cyB0aGF0IHdlIHVzZSAqLworCQkJCWdvdG8gcmVxdWVzdF9pb19mYWlsOworCQl9CQkJCQorCQljb3VudCsrOworCQlpZiAoc2NzaV9hZGRfaG9zdChzaHBudCwgJnBkZXYtPmRldikpCisJCQlnb3RvIHNjc2lfYWRkX2ZhaWw7CisJCXNjc2lfc2Nhbl9ob3N0KHNocG50KTsKKyNpZmRlZiBFRF9EQkdQCQkJCisJCXByaW50aygiYXRwODcwdV9wcm9iIDogZXhpdFxuIik7CisjZW5kaWYJCQorCQlyZXR1cm4gMDsKKworc2NzaV9hZGRfZmFpbDoKKwlwcmludGsoImF0cDg3MHVfcHJvYjpzY3NpX2FkZF9mYWlsXG4iKTsKKwlpZihlbnQtPmRldmljZT09QVRQODg1X0RFVklEKSB7CisJCXJlbGVhc2VfcmVnaW9uKGJhc2VfaW8sIDB4ZmYpOworCX0gZWxzZSBpZigoZW50LT5kZXZpY2U9PUFUUDg4MF9ERVZJRDEpfHwoZW50LT5kZXZpY2U9PUFUUDg4MF9ERVZJRDIpKSB7CisJCXJlbGVhc2VfcmVnaW9uKGJhc2VfaW8sIDB4NjApOworCX0gZWxzZSB7CisJCXJlbGVhc2VfcmVnaW9uKGJhc2VfaW8sIDB4NDApOworCX0KK3JlcXVlc3RfaW9fZmFpbDoKKwlwcmludGsoImF0cDg3MHVfcHJvYjpyZXF1ZXN0X2lvX2ZhaWxcbiIpOworCWZyZWVfaXJxKHBkZXYtPmlycSwgc2hwbnQpOworZnJlZV90YWJsZXM6CisJcHJpbnRrKCJhdHA4NzB1X3Byb2I6ZnJlZV90YWJsZVxuIik7CisJYXRwODcwdV9mcmVlX3RhYmxlcyhzaHBudCk7Cit1bnJlZ2lzdGVyOgorCXByaW50aygiYXRwODcwdV9wcm9iOnVucmVnaXN0ZXJcbiIpOworCXNjc2lfaG9zdF9wdXQoc2hwbnQpOworCXJldHVybiAtMTsJCQorfQorCisvKiBUaGUgYWJvcnQgY29tbWFuZCBkb2VzIG5vdCBsZWF2ZSB0aGUgZGV2aWNlIGluIGEgY2xlYW4gc3RhdGUgd2hlcmUKKyAgIGl0IGlzIGF2YWlsYWJsZSB0byBiZSB1c2VkIGFnYWluLiAgVW50aWwgdGhpcyBnZXRzIHdvcmtlZCBvdXQsIHdlIHdpbGwKKyAgIGxlYXZlIGl0IGNvbW1lbnRlZCBvdXQuICAqLworCitzdGF0aWMgaW50IGF0cDg3MHVfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KQoreworCXVuc2lnbmVkIGNoYXIgIGosIGssIGM7CisJc3RydWN0IHNjc2lfY21uZCAqd29ya3JlcXU7CisJdW5zaWduZWQgaW50IHRtcG9ydDsKKwlzdHJ1Y3QgYXRwX3VuaXQgKmRldjsJCisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlob3N0ID0gU0NwbnQtPmRldmljZS0+aG9zdDsKKworCWRldiA9IChzdHJ1Y3QgYXRwX3VuaXQgKikmaG9zdC0+aG9zdGRhdGE7CisJYz1TQ3BudC0+ZGV2aWNlLT5jaGFubmVsOworCXByaW50aygiIGF0cDg3MHU6IGFib3J0IENoYW5uZWwgPSAleCBcbiIsIGMpOworCXByaW50aygid29ya2luZz0leCBsYXN0X2NtZD0leCAiLCBkZXYtPndvcmtpbmdbY10sIGRldi0+bGFzdF9jbWRbY10pOworCXByaW50aygiIHF1aGR1PSV4IHF1ZW5kdT0leCAiLCBkZXYtPnF1aGRbY10sIGRldi0+cXVlbmRbY10pOworCXRtcG9ydCA9IGRldi0+aW9wb3J0W2NdOworCWZvciAoaiA9IDA7IGogPCAweDE4OyBqKyspIHsKKwkJcHJpbnRrKCIgciUyeD0lMngiLCBqLCBpbmIodG1wb3J0KyspKTsKKwl9CisJdG1wb3J0ICs9IDB4MDQ7CisJcHJpbnRrKCIgcjFjPSUyeCIsIGluYih0bXBvcnQpKTsKKwl0bXBvcnQgKz0gMHgwMzsKKwlwcmludGsoIiByMWY9JTJ4IGluX3NuZD0lMnggIiwgaW5iKHRtcG9ydCksIGRldi0+aW5fc25kW2NdKTsKKwl0bXBvcnQ9IGRldi0+cGNpcG9ydFtjXTsKKwlwcmludGsoIiBkMDA9JTJ4IiwgaW5iKHRtcG9ydCkpOworCXRtcG9ydCArPSAweDAyOworCXByaW50aygiIGQwMj0lMngiLCBpbmIodG1wb3J0KSk7CisJZm9yKGo9MDtqPDE2O2orKykgeworCSAgIGlmIChkZXYtPmlkW2NdW2pdLmN1cnJfcmVxICE9IE5VTEwpIHsKKwkJd29ya3JlcXUgPSBkZXYtPmlkW2NdW2pdLmN1cnJfcmVxOworCQlwcmludGsoIlxuIHF1ZSBjZGI9ICIpOworCQlmb3IgKGs9MDsgayA8IHdvcmtyZXF1LT5jbWRfbGVuOyBrKyspIHsKKwkJICAgIHByaW50aygiICUyeCAiLHdvcmtyZXF1LT5jbW5kW2tdKTsKKwkJfQorCQlwcmludGsoIiBsYXN0X2xlbnU9ICV4ICIsKHVuc2lnbmVkIGludClkZXYtPmlkW2NdW2pdLmxhc3RfbGVuKTsKKwkgICB9CisJfQorCXJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYXRwODcwdV9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKm5vdHVzZWQpCit7CisJc3RhdGljIGNoYXIgYnVmZmVyWzEyOF07CisKKwlzdHJjcHkoYnVmZmVyLCAiQUNBUkQgQUVDLTY3MTAvNjcxMi82NzE2MCBQQ0kgVWx0cmEvVy9MVkQgU0NTSS0zIEFkYXB0ZXIgRHJpdmVyIFYyLjYrYWMgIik7CisKKwlyZXR1cm4gYnVmZmVyOworfQorCisjZGVmaW5lIEJMUyBidWZmZXIgKyBsZW4gKyBzaXplCitpbnQgYXRwODcwdV9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqSEJBcHRyLCBjaGFyICpidWZmZXIsIAorCQkgICAgICBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworCXN0YXRpYyB1OCBidWZmWzUxMl07CisJaW50IHNpemUgPSAwOworCWludCBsZW4gPSAwOworCW9mZl90IGJlZ2luID0gMDsKKwlvZmZfdCBwb3MgPSAwOworCQorCWlmIChpbm91dCkgCQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAob2Zmc2V0ID09IDApCisJCW1lbXNldChidWZmLCAwLCBzaXplb2YoYnVmZikpOworCXNpemUgKz0gc3ByaW50ZihCTFMsICJBQ0FSRCBBRUMtNjcxWCBEcml2ZXIgVmVyc2lvbjogMi42K2FjXG4iKTsKKwlsZW4gKz0gc2l6ZTsKKwlwb3MgPSBiZWdpbiArIGxlbjsKKwlzaXplID0gMDsKKworCXNpemUgKz0gc3ByaW50ZihCTFMsICJcbiIpOworCXNpemUgKz0gc3ByaW50ZihCTFMsICJBZGFwdGVyIENvbmZpZ3VyYXRpb246XG4iKTsKKwlzaXplICs9IHNwcmludGYoQkxTLCAiICAgICAgICAgICAgICAgQmFzZSBJTzogJSMuNGx4XG4iLCBIQkFwdHItPmlvX3BvcnQpOworCXNpemUgKz0gc3ByaW50ZihCTFMsICIgICAgICAgICAgICAgICAgICAgSVJROiAlZFxuIiwgSEJBcHRyLT5pcnEpOworCWxlbiArPSBzaXplOworCXBvcyA9IGJlZ2luICsgbGVuOworCQorCSpzdGFydCA9IGJ1ZmZlciArIChvZmZzZXQgLSBiZWdpbik7CS8qIFN0YXJ0IG9mIHdhbnRlZCBkYXRhICovCisJbGVuIC09IChvZmZzZXQgLSBiZWdpbik7CS8qIFN0YXJ0IHNsb3AgKi8KKwlpZiAobGVuID4gbGVuZ3RoKSB7CisJCWxlbiA9IGxlbmd0aDsJLyogRW5kaW5nIHNsb3AgKi8KKwl9CisJcmV0dXJuIChsZW4pOworfQorCisKK3N0YXRpYyBpbnQgYXRwODcwdV9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpkaXNrLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsCisJCQlzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICppcCkKK3sKKwlpbnQgaGVhZHMsIHNlY3RvcnMsIGN5bGluZGVyczsKKworCWhlYWRzID0gNjQ7CisJc2VjdG9ycyA9IDMyOworCWN5bGluZGVycyA9ICh1bnNpZ25lZCBsb25nKWNhcGFjaXR5IC8gKGhlYWRzICogc2VjdG9ycyk7CisJaWYgKGN5bGluZGVycyA+IDEwMjQpIHsKKwkJaGVhZHMgPSAyNTU7CisJCXNlY3RvcnMgPSA2MzsKKwkJY3lsaW5kZXJzID0gKHVuc2lnbmVkIGxvbmcpY2FwYWNpdHkgLyAoaGVhZHMgKiBzZWN0b3JzKTsKKwl9CisJaXBbMF0gPSBoZWFkczsKKwlpcFsxXSA9IHNlY3RvcnM7CisJaXBbMl0gPSBjeWxpbmRlcnM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXRwODcwdV9yZW1vdmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorewkKKwlzdHJ1Y3QgYXRwX3VuaXQgKmRldmV4dCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpwc2hvc3QgPSBkZXZleHQtPmhvc3Q7CisJCisJCisJc2NzaV9yZW1vdmVfaG9zdChwc2hvc3QpOworCXByaW50ayhLRVJOX0lORk8gImZyZWVfaXJxIDogJWRcbiIscHNob3N0LT5pcnEpOworCWZyZWVfaXJxKHBzaG9zdC0+aXJxLCBwc2hvc3QpOworCXJlbGVhc2VfcmVnaW9uKHBzaG9zdC0+aW9fcG9ydCwgcHNob3N0LT5uX2lvX3BvcnQpOworCXByaW50ayhLRVJOX0lORk8gImF0cDg3MHVfZnJlZV90YWJsZXMgOiAlcFxuIixwc2hvc3QpOworCWF0cDg3MHVfZnJlZV90YWJsZXMocHNob3N0KTsKKwlwcmludGsoS0VSTl9JTkZPICJzY3NpX2hvc3RfcHV0IDogJXBcbiIscHNob3N0KTsKKwlzY3NpX2hvc3RfcHV0KHBzaG9zdCk7CisJcHJpbnRrKEtFUk5fSU5GTyAicGNpX3NldF9kcnZkYXRhIDogJXBcbiIscGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwkKK30KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgYXRwODcwdV90ZW1wbGF0ZSA9IHsKKyAgICAgLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisgICAgIC5uYW1lICAgICAgICAgICAgICAJPSAiYXRwODcwdSIJCS8qIG5hbWUgKi8sCisgICAgIC5wcm9jX25hbWUJCQk9ICJhdHA4NzB1IiwKKyAgICAgLnByb2NfaW5mbwkJCT0gYXRwODcwdV9wcm9jX2luZm8sCisgICAgIC5pbmZvICAgICAgICAgICAgICAJPSBhdHA4NzB1X2luZm8JCS8qIGluZm8gKi8sCisgICAgIC5xdWV1ZWNvbW1hbmQgICAgICAJPSBhdHA4NzB1X3F1ZXVlY29tbWFuZAkvKiBxdWV1ZWNvbW1hbmQgKi8sCisgICAgIC5laF9hYm9ydF9oYW5kbGVyICAJPSBhdHA4NzB1X2Fib3J0CQkvKiBhYm9ydCAqLywKKyAgICAgLmJpb3NfcGFyYW0gICAgICAgIAk9IGF0cDg3MHVfYmlvc3BhcmFtCS8qIGJpb3NwYXJtICovLAorICAgICAuY2FuX3F1ZXVlICAgICAgICAgCT0gcWNudAkJCS8qIGNhbl9xdWV1ZSAqLywKKyAgICAgLnRoaXNfaWQgICAgICAgICAgIAk9IDcJCQkvKiBTQ1NJIElEICovLAorICAgICAuc2dfdGFibGVzaXplICAgICAgCT0gQVRQODcwVV9TQ0FUVEVSCS8qU0dfQUxMKi8gLypTR19OT05FKi8sCisgICAgIC5jbWRfcGVyX2x1biAgICAgICAJPSBBVFA4NzBVX0NNRExVTgkJLyogY29tbWFuZHMgcGVyIGx1biAqLywKKyAgICAgLnVzZV9jbHVzdGVyaW5nICAgIAk9IEVOQUJMRV9DTFVTVEVSSU5HLAorICAgICAubWF4X3NlY3RvcnMJCT0gQVRQODcwVV9NQVhfU0VDVE9SUywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhdHA4NzB1X2lkX3RhYmxlW10gPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQVJUT1AsIEFUUDg4NV9ERVZJRCkJCQkgIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQVJUT1AsIEFUUDg4MF9ERVZJRDEpCQkJICB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FSVE9QLCBBVFA4ODBfREVWSUQyKQkJCSAgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BUlRPUCwgUENJX0RFVklDRV9JRF9BUlRPUF9BRUM3NjEwKSAgICB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FSVE9QLCBQQ0lfREVWSUNFX0lEX0FSVE9QX0FFQzc2MTJVVykgIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQVJUT1AsIFBDSV9ERVZJQ0VfSURfQVJUT1BfQUVDNzYxMlUpICAgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BUlRPUCwgUENJX0RFVklDRV9JRF9BUlRPUF9BRUM3NjEyUykgICB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FSVE9QLCBQQ0lfREVWSUNFX0lEX0FSVE9QX0FFQzc2MTJEKQkgIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQVJUT1AsIFBDSV9ERVZJQ0VfSURfQVJUT1BfQUVDNzYxMlNVVykgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BUlRPUCwgUENJX0RFVklDRV9JRF9BUlRPUF84MDYwKQkgIH0sCisJeyAwLCB9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGF0cDg3MHVfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYXRwODcwdV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlCT0gYXRwODcwdV9pZF90YWJsZSwKKwkubmFtZQkJPSAiYXRwODcwdSIsCisJLnByb2JlCQk9IGF0cDg3MHVfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhdHA4NzB1X3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdHA4NzB1X2luaXQodm9pZCkKK3sKKyNpZmRlZiBFRF9EQkdQCQorCXByaW50aygiYXRwODcwdV9pbml0OiBFbnRyeVxuIik7CisjZW5kaWYJCisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmF0cDg3MHVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF0cDg3MHVfZXhpdCh2b2lkKQoreworI2lmZGVmIEVEX0RCR1AJCisJcHJpbnRrKCJhdHA4NzB1X2V4aXQ6IEVudHJ5XG4iKTsKKyNlbmRpZgorCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYXRwODcwdV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCB0c2NhbV84ODUodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMHgyOyBpKyspIHsKKwkJbWRlbGF5KDMwMCk7CisJfQorCXJldHVybjsKK30KKworCisKK3N0YXRpYyB2b2lkIGlzODg1KHN0cnVjdCBhdHBfdW5pdCAqZGV2LCB1bnNpZ25lZCBpbnQgd2twb3J0LHVuc2lnbmVkIGNoYXIgYykKK3sKKwl1bnNpZ25lZCBpbnQgdG1wb3J0OworCXVuc2lnbmVkIGNoYXIgaSwgaiwgaywgcm1iLCBuLCBsdmRtb2RlOworCXVuc2lnbmVkIHNob3J0IGludCBtOworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIG1idWZbNTEyXTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBzYXRuWzldID0JezAsIDAsIDAsIDAsIDAsIDAsIDAsIDYsIDZ9OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGlucWRbOV0gPQl7MHgxMiwgMCwgMCwgMCwgMHgyNCwgMCwgMCwgMHgyNCwgNn07CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgc3lubls2XSA9CXsweDgwLCAxLCAzLCAxLCAweDE5LCAweDBlfTsKKwl1bnNpZ25lZCBjaGFyIHN5bnVbNl0gPSAgezB4ODAsIDEsIDMsIDEsIDB4MGEsIDB4MGV9OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHN5bndbNl0gPQl7MHg4MCwgMSwgMywgMSwgMHgxOSwgMHgwZX07CisJdW5zaWduZWQgY2hhciBzeW51d1s2XSA9ICB7MHg4MCwgMSwgMywgMSwgMHgwYSwgMHgwZX07CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgd2lkZVs2XSA9CXsweDgwLCAxLCAyLCAzLCAxLCAwfTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciB1M1s5XSA9IHsgMHg4MCwxLDYsNCwweDA5LDAwLDB4MGUsMHgwMSwweDAyIH07CisKKwlsdmRtb2RlPWluYih3a3BvcnQgKyAweDFiKSA+PiA3OworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJbSA9IDE7CisJCW0gPSBtIDw8IGk7CisJCWlmICgobSAmIGRldi0+YWN0aXZlX2lkW2NdKSAhPSAwKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoaSA9PSBkZXYtPmhvc3RfaWRbY10pIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiAgICAgICAgIElEOiAlMmQgIEhvc3QgQWRhcHRlclxuIiwgZGV2LT5ob3N0X2lkW2NdKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MWI7CisJCW91dGIoMHgwMSwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgwMTsKKwkJb3V0YigweDA4LCB0bXBvcnQrKyk7CisJCW91dGIoMHg3ZiwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bMF0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzFdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blsyXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bM10sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzRdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls1XSwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwNjsKKwkJb3V0YigwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMjsKKwkJb3V0YihkZXYtPmlkW2NdW2ldLmRldnNwLCB0bXBvcnQrKyk7CisJCQorCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzZdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls3XSwgdG1wb3J0KyspOworCQlqID0gaTsKKwkJaWYgKChqICYgMHgwOCkgIT0gMCkgeworCQkJaiA9IChqICYgMHgwNykgfCAweDQwOworCQl9CisJCW91dGIoaiwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDM7CisJCW91dGIoc2F0bls4XSwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKwkJdG1wb3J0IC09IDB4MDg7CisJCWlmICgoaW5iKHRtcG9ydCkgIT0gMHgxMSkgJiYgKGluYih0bXBvcnQpICE9IDB4OGUpKSB7CisJCQljb250aW51ZTsKKwkJfQorCQl3aGlsZSAoaW5iKHRtcG9ydCkgIT0gMHg4ZSkKKwkJCWNwdV9yZWxheCgpOworCQlkZXYtPmFjdGl2ZV9pZFtjXSB8PSBtOworCisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTA7CisJCW91dGIoMHgzMCwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxNDsKKwkJb3V0YigweDAwLCB0bXBvcnQpOworCitwaGFzZV9jbWQ6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTg7CisJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCXRtcG9ydCAtPSAweDA4OworCQlqID0gaW5iKHRtcG9ydCk7CisJCWlmIChqICE9IDB4MTYpIHsKKwkJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTA7CisJCQlvdXRiKDB4NDEsIHRtcG9ydCk7CisJCQlnb3RvIHBoYXNlX2NtZDsKKwkJfQorc2VsX29rOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDAzOworCQlvdXRiKGlucWRbMF0sIHRtcG9ydCsrKTsKKwkJb3V0YihpbnFkWzFdLCB0bXBvcnQrKyk7CisJCW91dGIoaW5xZFsyXSwgdG1wb3J0KyspOworCQlvdXRiKGlucWRbM10sIHRtcG9ydCsrKTsKKwkJb3V0YihpbnFkWzRdLCB0bXBvcnQrKyk7CisJCW91dGIoaW5xZFs1XSwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCW91dGIoMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDI7CisJCW91dGIoZGV2LT5pZFtjXVtpXS5kZXZzcCwgdG1wb3J0KyspOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJb3V0YihpbnFkWzZdLCB0bXBvcnQrKyk7CisJCW91dGIoaW5xZFs3XSwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwMzsKKwkJb3V0YihpbnFkWzhdLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKwkJdG1wb3J0IC09IDB4MDg7CisJCWlmICgoaW5iKHRtcG9ydCkgIT0gMHgxMSkgJiYgKGluYih0bXBvcnQpICE9IDB4OGUpKSB7CisJCQljb250aW51ZTsKKwkJfQorCQl3aGlsZSAoaW5iKHRtcG9ydCkgIT0gMHg4ZSkKKwkJCWNwdV9yZWxheCgpOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDFiOworCQlvdXRiKDB4MDAsIHRtcG9ydCk7CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTg7CisJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCWogPSAwOworcmRfaW5xX2RhdGE6CisJCWsgPSBpbmIodG1wb3J0KTsKKwkJaWYgKChrICYgMHgwMSkgIT0gMCkgeworCQkJdG1wb3J0IC09IDB4MDY7CisJCQltYnVmW2orK10gPSBpbmIodG1wb3J0KTsKKwkJCXRtcG9ydCArPSAweDA2OworCQkJZ290byByZF9pbnFfZGF0YTsKKwkJfQorCQlpZiAoKGsgJiAweDgwKSA9PSAwKSB7CisJCQlnb3RvIHJkX2lucV9kYXRhOworCQl9CisJCXRtcG9ydCAtPSAweDA4OworCQlqID0gaW5iKHRtcG9ydCk7CisJCWlmIChqID09IDB4MTYpIHsKKwkJCWdvdG8gaW5xX29rOworCQl9CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTA7CisJCW91dGIoMHg0NiwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDI7CisJCW91dGIoMCwgdG1wb3J0KyspOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJb3V0YigwLCB0bXBvcnQrKyk7CisJCXRtcG9ydCArPSAweDAzOworCQlvdXRiKDB4MDgsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQl0bXBvcnQgLT0gMHgwODsKKwkJaWYgKGluYih0bXBvcnQpICE9IDB4MTYpIHsKKwkJCWdvdG8gc2VsX29rOworCQl9CitpbnFfb2s6CisJCW1idWZbMzZdID0gMDsKKwkJcHJpbnRrKCBLRVJOX0lORk8iICAgICAgICAgSUQ6ICUyZCAgJXNcbiIsIGksICZtYnVmWzhdKTsKKwkJZGV2LT5pZFtjXVtpXS5kZXZ0eXBlID0gbWJ1ZlswXTsKKwkJcm1iID0gbWJ1ZlsxXTsKKwkJbiA9IG1idWZbN107CisJCWlmICgobWJ1Zls3XSAmIDB4NjApID09IDApIHsKKwkJCWdvdG8gbm90X3dpZGU7CisJCX0KKwkJaWYgKChpIDwgOCkgJiYgKChkZXYtPmdsb2JhbF9tYXBbY10gJiAweDIwKSA9PSAwKSkgeworCQkJZ290byBub3Rfd2lkZTsKKwkJfQorCQlpZiAobHZkbW9kZSA9PSAwKSB7CisJCSAgIGdvdG8gY2hnX3dpZGU7CisJCX0KKwkJaWYgKGRldi0+c3BbY11baV0gIT0gMHgwNCkgewkvLyBmb3JjZSB1MgorCQkgICBnb3RvIGNoZ193aWRlOworCQl9CisKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxYjsKKwkJb3V0YigweDAxLCB0bXBvcnQpOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDAzOworCQlvdXRiKHNhdG5bMF0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzFdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blsyXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bM10sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzRdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls1XSwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwNjsKKwkJb3V0YigwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMjsKKwkJb3V0YihkZXYtPmlkW2NdW2ldLmRldnNwLCB0bXBvcnQrKyk7CisJCW91dGIoMCwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNl0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzddLCB0bXBvcnQrKyk7CisJCXRtcG9ydCArPSAweDAzOworCQlvdXRiKHNhdG5bOF0sIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCXRtcG9ydCAtPSAweDA4OworCQlpZiAoKGluYih0bXBvcnQpICE9IDB4MTEpICYmIChpbmIodG1wb3J0KSAhPSAweDhlKSkgeworCQkJY29udGludWU7CisJCX0KKwkJd2hpbGUgKGluYih0bXBvcnQpICE9IDB4OGUpCisJCQljcHVfcmVsYXgoKTsKK3RyeV91MzoKKwkJaiA9IDA7CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTQ7CisJCW91dGIoMHgwOSwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDQ7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDApIHsKKwkJCWlmICgoaW5iKHRtcG9ydCkgJiAweDAxKSAhPSAwKSB7CisJCQkJdG1wb3J0IC09IDB4MDY7CisJCQkJb3V0Yih1M1tqKytdLCB0bXBvcnQpOworCQkJCXRtcG9ydCArPSAweDA2OworCQkJfQorCQkJY3B1X3JlbGF4KCk7CisJCX0KKwkJdG1wb3J0IC09IDB4MDg7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCWogPSBpbmIodG1wb3J0KSAmIDB4MGY7CisJCWlmIChqID09IDB4MGYpIHsKKwkJCWdvdG8gdTNwX2luOworCQl9CisJCWlmIChqID09IDB4MGEpIHsKKwkJCWdvdG8gdTNwX2NtZDsKKwkJfQorCQlpZiAoaiA9PSAweDBlKSB7CisJCQlnb3RvIHRyeV91MzsKKwkJfQorCQljb250aW51ZTsKK3UzcF9vdXQ6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTg7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAwKSB7CisJCQlpZiAoKGluYih0bXBvcnQpICYgMHgwMSkgIT0gMCkgeworCQkJCXRtcG9ydCAtPSAweDA2OworCQkJCW91dGIoMCwgdG1wb3J0KTsKKwkJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCX0KKwkJCWNwdV9yZWxheCgpOworCQl9CisJCXRtcG9ydCAtPSAweDA4OworCQlqID0gaW5iKHRtcG9ydCkgJiAweDBmOworCQlpZiAoaiA9PSAweDBmKSB7CisJCQlnb3RvIHUzcF9pbjsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHUzcF9jbWQ7CisJCX0KKwkJaWYgKGogPT0gMHgwZSkgeworCQkJZ290byB1M3Bfb3V0OworCQl9CisJCWNvbnRpbnVlOwordTNwX2luOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDE0OworCQlvdXRiKDB4MDksIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA0OworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQlrID0gMDsKK3UzcF9pbjE6CisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKChqICYgMHgwMSkgIT0gMCkgeworCQkJdG1wb3J0IC09IDB4MDY7CisJCQltYnVmW2srK10gPSBpbmIodG1wb3J0KTsKKwkJCXRtcG9ydCArPSAweDA2OworCQkJZ290byB1M3BfaW4xOworCQl9CisJCWlmICgoaiAmIDB4ODApID09IDB4MDApIHsKKwkJCWdvdG8gdTNwX2luMTsKKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpICYgMHgwZjsKKwkJaWYgKGogPT0gMHgwZikgeworCQkJZ290byB1M3BfaW47CisJCX0KKwkJaWYgKGogPT0gMHgwYSkgeworCQkJZ290byB1M3BfY21kOworCQl9CisJCWlmIChqID09IDB4MGUpIHsKKwkJCWdvdG8gdTNwX291dDsKKwkJfQorCQljb250aW51ZTsKK3UzcF9jbWQ6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTA7CisJCW91dGIoMHgzMCwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxNDsKKwkJb3V0YigweDAwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNDsKKwkJb3V0YigweDA4LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApOworCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoaiAhPSAweDE2KSB7CisJCQlpZiAoaiA9PSAweDRlKSB7CisJCQkJZ290byB1M3Bfb3V0OworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKG1idWZbMF0gIT0gMHgwMSkgeworCQkJZ290byBjaGdfd2lkZTsKKwkJfQorCQlpZiAobWJ1ZlsxXSAhPSAweDA2KSB7CisJCQlnb3RvIGNoZ193aWRlOworCQl9CisJCWlmIChtYnVmWzJdICE9IDB4MDQpIHsKKwkJCWdvdG8gY2hnX3dpZGU7CisJCX0KKwkJaWYgKG1idWZbM10gPT0gMHgwOSkgeworCQkJbSA9IDE7CisJCQltID0gbSA8PCBpOworCQkJZGV2LT53aWRlX2lkW2NdIHw9IG07CisJCQlkZXYtPmlkW2NdW2ldLmRldnNwID0gMHhjZTsKKyNpZmRlZiBFRF9EQkdQCQkgICAKKwkJCXByaW50aygiZGV2LT5pZFslMmRdWyUyZF0uZGV2c3AgPSAlMnhcbiIsYyxpLGRldi0+aWRbY11baV0uZGV2c3ApOworI2VuZGlmCisJCQljb250aW51ZTsKKwkJfQorY2hnX3dpZGU6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MWI7CisJCW91dGIoMHgwMSwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgwMzsKKwkJb3V0YihzYXRuWzBdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blsxXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bMl0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzNdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls0XSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNV0sIHRtcG9ydCsrKTsKKwkJdG1wb3J0ICs9IDB4MDY7CisJCW91dGIoMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDI7CisJCW91dGIoZGV2LT5pZFtjXVtpXS5kZXZzcCwgdG1wb3J0KyspOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzZdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls3XSwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwMzsKKwkJb3V0YihzYXRuWzhdLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQl0bXBvcnQgLT0gMHgwODsKKwkJaWYgKChpbmIodG1wb3J0KSAhPSAweDExKSAmJiAoaW5iKHRtcG9ydCkgIT0gMHg4ZSkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXdoaWxlIChpbmIodG1wb3J0KSAhPSAweDhlKQorCQkJY3B1X3JlbGF4KCk7Cit0cnlfd2lkZToKKwkJaiA9IDA7CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTQ7CisJCW91dGIoMHgwNSwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDQ7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDApIHsKKwkJCWlmICgoaW5iKHRtcG9ydCkgJiAweDAxKSAhPSAwKSB7CisJCQkJdG1wb3J0IC09IDB4MDY7CisJCQkJb3V0Yih3aWRlW2orK10sIHRtcG9ydCk7CisJCQkJdG1wb3J0ICs9IDB4MDY7CisJCQl9CisJCQljcHVfcmVsYXgoKTsKKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKwkJaiA9IGluYih0bXBvcnQpICYgMHgwZjsKKwkJaWYgKGogPT0gMHgwZikgeworCQkJZ290byB3aWRlcF9pbjsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHdpZGVwX2NtZDsKKwkJfQorCQlpZiAoaiA9PSAweDBlKSB7CisJCQlnb3RvIHRyeV93aWRlOworCQl9CisJCWNvbnRpbnVlOword2lkZXBfb3V0OgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDE4OworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMCkgeworCQkJaWYgKChpbmIodG1wb3J0KSAmIDB4MDEpICE9IDApIHsKKwkJCQl0bXBvcnQgLT0gMHgwNjsKKwkJCQlvdXRiKDAsIHRtcG9ydCk7CisJCQkJdG1wb3J0ICs9IDB4MDY7CisJCQl9CisJCQljcHVfcmVsYXgoKTsKKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpICYgMHgwZjsKKwkJaWYgKGogPT0gMHgwZikgeworCQkJZ290byB3aWRlcF9pbjsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHdpZGVwX2NtZDsKKwkJfQorCQlpZiAoaiA9PSAweDBlKSB7CisJCQlnb3RvIHdpZGVwX291dDsKKwkJfQorCQljb250aW51ZTsKK3dpZGVwX2luOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDE0OworCQlvdXRiKDB4ZmYsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA0OworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQlrID0gMDsKK3dpZGVwX2luMToKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoKGogJiAweDAxKSAhPSAwKSB7CisJCQl0bXBvcnQgLT0gMHgwNjsKKwkJCW1idWZbaysrXSA9IGluYih0bXBvcnQpOworCQkJdG1wb3J0ICs9IDB4MDY7CisJCQlnb3RvIHdpZGVwX2luMTsKKwkJfQorCQlpZiAoKGogJiAweDgwKSA9PSAweDAwKSB7CisJCQlnb3RvIHdpZGVwX2luMTsKKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpICYgMHgwZjsKKwkJaWYgKGogPT0gMHgwZikgeworCQkJZ290byB3aWRlcF9pbjsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHdpZGVwX2NtZDsKKwkJfQorCQlpZiAoaiA9PSAweDBlKSB7CisJCQlnb3RvIHdpZGVwX291dDsKKwkJfQorCQljb250aW51ZTsKK3dpZGVwX2NtZDoKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxMDsKKwkJb3V0YigweDMwLCB0bXBvcnQpOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDE0OworCQlvdXRiKDB4MDAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA0OworCQlvdXRiKDB4MDgsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoaiAhPSAweDE2KSB7CisJCQlpZiAoaiA9PSAweDRlKSB7CisJCQkJZ290byB3aWRlcF9vdXQ7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobWJ1ZlswXSAhPSAweDAxKSB7CisJCQlnb3RvIG5vdF93aWRlOworCQl9CisJCWlmIChtYnVmWzFdICE9IDB4MDIpIHsKKwkJCWdvdG8gbm90X3dpZGU7CisJCX0KKwkJaWYgKG1idWZbMl0gIT0gMHgwMykgeworCQkJZ290byBub3Rfd2lkZTsKKwkJfQorCQlpZiAobWJ1ZlszXSAhPSAweDAxKSB7CisJCQlnb3RvIG5vdF93aWRlOworCQl9CisJCW0gPSAxOworCQltID0gbSA8PCBpOworCQlkZXYtPndpZGVfaWRbY10gfD0gbTsKK25vdF93aWRlOgorCQlpZiAoKGRldi0+aWRbY11baV0uZGV2dHlwZSA9PSAweDAwKSB8fCAoZGV2LT5pZFtjXVtpXS5kZXZ0eXBlID09IDB4MDcpIHx8CisJCSAgICAoKGRldi0+aWRbY11baV0uZGV2dHlwZSA9PSAweDA1KSAmJiAoKG4gJiAweDEwKSAhPSAwKSkpIHsKKwkJCW0gPSAxOworCQkJbSA9IG0gPDwgaTsKKwkJCWlmICgoZGV2LT5hc3luY1tjXSAmIG0pICE9IDApIHsKKwkJCSAgIGdvdG8gc2V0X3N5bmM7CisJCQl9CisJCX0KKwkJY29udGludWU7CitzZXRfc3luYzoKKwkJaWYgKGRldi0+c3BbY11baV0gPT0gMHgwMikgeworCQkgICBzeW51WzRdPTB4MGM7CisJCSAgIHN5bnV3WzRdPTB4MGM7CisJCX0gZWxzZSB7CisJCSAgIGlmIChkZXYtPnNwW2NdW2ldID49IDB4MDMpIHsKKwkJICAgICAgc3ludVs0XT0weDBhOworCQkgICAgICBzeW51d1s0XT0weDBhOworCQkgICB9CisJCX0KKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxYjsKKwkJaiA9IDA7CisJCWlmICgobSAmIGRldi0+d2lkZV9pZFtjXSkgIT0gMCkgeworCQkJaiB8PSAweDAxOworCQl9CisJCW91dGIoaiwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgwMzsKKwkJb3V0YihzYXRuWzBdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blsxXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bMl0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzNdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls0XSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNV0sIHRtcG9ydCsrKTsKKwkJdG1wb3J0ICs9IDB4MDY7CisJCW91dGIoMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDI7CisJCW91dGIoZGV2LT5pZFtjXVtpXS5kZXZzcCwgdG1wb3J0KyspOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzZdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls3XSwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwMzsKKwkJb3V0YihzYXRuWzhdLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQl0bXBvcnQgLT0gMHgwODsKKwkJaWYgKChpbmIodG1wb3J0KSAhPSAweDExKSAmJiAoaW5iKHRtcG9ydCkgIT0gMHg4ZSkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXdoaWxlIChpbmIodG1wb3J0KSAhPSAweDhlKQorCQkJY3B1X3JlbGF4KCk7Cit0cnlfc3luYzoKKwkJaiA9IDA7CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTQ7CisJCW91dGIoMHgwNiwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDQ7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDApIHsKKwkJCWlmICgoaW5iKHRtcG9ydCkgJiAweDAxKSAhPSAwKSB7CisJCQkJdG1wb3J0IC09IDB4MDY7CisJCQkJaWYgKChtICYgZGV2LT53aWRlX2lkW2NdKSAhPSAwKSB7CisJCQkJCWlmICgobSAmIGRldi0+dWx0cmFfbWFwW2NdKSAhPSAwKSB7CisJCQkJCQlvdXRiKHN5bnV3W2orK10sIHRtcG9ydCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlvdXRiKHN5bndbaisrXSwgdG1wb3J0KTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmICgobSAmIGRldi0+dWx0cmFfbWFwW2NdKSAhPSAwKSB7CisJCQkJCQlvdXRiKHN5bnVbaisrXSwgdG1wb3J0KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW91dGIoc3lubltqKytdLCB0bXBvcnQpOworCQkJCQl9CisJCQkJfQorCQkJCXRtcG9ydCArPSAweDA2OworCQkJfQorCQl9CisJCXRtcG9ydCAtPSAweDA4OworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQlqID0gaW5iKHRtcG9ydCkgJiAweDBmOworCQlpZiAoaiA9PSAweDBmKSB7CisJCQlnb3RvIHBoYXNlX2luczsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHBoYXNlX2NtZHM7CisJCX0KKwkJaWYgKGogPT0gMHgwZSkgeworCQkJZ290byB0cnlfc3luYzsKKwkJfQorCQljb250aW51ZTsKK3BoYXNlX291dHM6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTg7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKSB7CisJCQlpZiAoKGluYih0bXBvcnQpICYgMHgwMSkgIT0gMHgwMCkgeworCQkJCXRtcG9ydCAtPSAweDA2OworCQkJCW91dGIoMHgwMCwgdG1wb3J0KTsKKwkJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCX0KKwkJCWNwdV9yZWxheCgpOworCQl9CisJCXRtcG9ydCAtPSAweDA4OworCQlqID0gaW5iKHRtcG9ydCk7CisJCWlmIChqID09IDB4ODUpIHsKKwkJCWdvdG8gdGFyX2Rjb25zOworCQl9CisJCWogJj0gMHgwZjsKKwkJaWYgKGogPT0gMHgwZikgeworCQkJZ290byBwaGFzZV9pbnM7CisJCX0KKwkJaWYgKGogPT0gMHgwYSkgeworCQkJZ290byBwaGFzZV9jbWRzOworCQl9CisJCWlmIChqID09IDB4MGUpIHsKKwkJCWdvdG8gcGhhc2Vfb3V0czsKKwkJfQorCQljb250aW51ZTsKK3BoYXNlX2luczoKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxNDsKKwkJb3V0YigweDA2LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNDsKKwkJb3V0YigweDIwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJayA9IDA7CitwaGFzZV9pbnMxOgorCQlqID0gaW5iKHRtcG9ydCk7CisJCWlmICgoaiAmIDB4MDEpICE9IDB4MDApIHsKKwkJCXRtcG9ydCAtPSAweDA2OworCQkJbWJ1ZltrKytdID0gaW5iKHRtcG9ydCk7CisJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCWdvdG8gcGhhc2VfaW5zMTsKKwkJfQorCQlpZiAoKGogJiAweDgwKSA9PSAweDAwKSB7CisJCQlnb3RvIHBoYXNlX2luczE7CisJCX0KKwkJdG1wb3J0IC09IDB4MDg7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKTsKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoaiA9PSAweDg1KSB7CisJCQlnb3RvIHRhcl9kY29uczsKKwkJfQorCQlqICY9IDB4MGY7CisJCWlmIChqID09IDB4MGYpIHsKKwkJCWdvdG8gcGhhc2VfaW5zOworCQl9CisJCWlmIChqID09IDB4MGEpIHsKKwkJCWdvdG8gcGhhc2VfY21kczsKKwkJfQorCQlpZiAoaiA9PSAweDBlKSB7CisJCQlnb3RvIHBoYXNlX291dHM7CisJCX0KKwkJY29udGludWU7CitwaGFzZV9jbWRzOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDEwOworCQlvdXRiKDB4MzAsIHRtcG9ydCk7Cit0YXJfZGNvbnM6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTQ7CisJCW91dGIoMHgwMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDQ7CisJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCXRtcG9ydCAtPSAweDA4OworCQlqID0gaW5iKHRtcG9ydCk7CisJCWlmIChqICE9IDB4MTYpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtYnVmWzBdICE9IDB4MDEpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtYnVmWzFdICE9IDB4MDMpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtYnVmWzRdID09IDB4MDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtYnVmWzNdID4gMHg2NCkgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG1idWZbNF0gPiAweDBlKSB7CisJCQltYnVmWzRdID0gMHgwZTsKKwkJfQorCQlkZXYtPmlkW2NdW2ldLmRldnNwID0gbWJ1Zls0XTsKKwkJaWYgKG1idWZbM10gPCAweDBjKXsKKwkJCWogPSAweGIwOworCQkJZ290byBzZXRfc3luX29rOworCQl9CisJCWlmICgobWJ1ZlszXSA8IDB4MGQpICYmIChybWIgPT0gMCkpIHsKKwkJCWogPSAweGEwOworCQkJZ290byBzZXRfc3luX29rOworCQl9CisJCWlmIChtYnVmWzNdIDwgMHgxYSkgeworCQkJaiA9IDB4MjA7CisJCQlnb3RvIHNldF9zeW5fb2s7CisJCX0KKwkJaWYgKG1idWZbM10gPCAweDMzKSB7CisJCQlqID0gMHg0MDsKKwkJCWdvdG8gc2V0X3N5bl9vazsKKwkJfQorCQlpZiAobWJ1ZlszXSA8IDB4NGMpIHsKKwkJCWogPSAweDUwOworCQkJZ290byBzZXRfc3luX29rOworCQl9CisJCWogPSAweDYwOworCSAgICAgIHNldF9zeW5fb2s6CisJCWRldi0+aWRbY11baV0uZGV2c3AgPSAoZGV2LT5pZFtjXVtpXS5kZXZzcCAmIDB4MGYpIHwgajsKKyNpZmRlZiBFRF9EQkdQCQkKKwkJcHJpbnRrKCJkZXYtPmlkWyUyZF1bJTJkXS5kZXZzcCA9ICUyeFxuIixjLGksZGV2LT5pZFtjXVtpXS5kZXZzcCk7CisjZW5kaWYKKwl9CisJdG1wb3J0ID0gd2twb3J0ICsgMHgxNjsKKwlvdXRiKDB4ODAsIHRtcG9ydCk7Cit9CisKK21vZHVsZV9pbml0KGF0cDg3MHVfaW5pdCk7Cittb2R1bGVfZXhpdChhdHA4NzB1X2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXRwODcwdS5oIGIvZHJpdmVycy9zY3NpL2F0cDg3MHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWY0M2FmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2F0cDg3MHUuaApAQCAtMCwwICsxLDY2IEBACisjaWZuZGVmIF9BVFA4NzBVX0gKKyNkZWZpbmUgX0FUUDg3MFVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKworLyogSS9PIFBvcnQgKi8KKworI2RlZmluZSBNQVhfQ0RCIAkxMgorI2RlZmluZSBNQVhfU0VOU0UgCTE0CisjZGVmaW5lIHFjbnQJICAgICAgIAkzMgorI2RlZmluZSBBVFA4NzBVX1NDQVRURVIgCTEyOAorI2RlZmluZSBBVFA4NzBVX0NNRExVTiAgCTEKKworI2RlZmluZSBNQVhfQURBUFRFUgk4CisjZGVmaW5lIE1BWF9TQ1NJX0lECTE2CisjZGVmaW5lIEFUUDg3MFVfTUFYX1NFQ1RPUlMgMTI4CisKKyNkZWZpbmUgQVRQODg1X0RFVklEIDB4ODA4QQorI2RlZmluZSBBVFA4ODBfREVWSUQxIDB4ODA4MAorI2RlZmluZSBBVFA4ODBfREVWSUQyIDB4ODA4MQorCisvLyNkZWZpbmUgRURfREJHUAorCitzdHJ1Y3QgYXRwX3VuaXQKK3sKKwl1bnNpZ25lZCBsb25nIGJhc2Vwb3J0OworCXVuc2lnbmVkIGxvbmcgaW9wb3J0WzJdOworCXVuc2lnbmVkIGxvbmcgcGNpcG9ydFsyXTsKKwl1bnNpZ25lZCBsb25nIGlycTsKKwl1bnNpZ25lZCBjaGFyIGxhc3RfY21kWzJdOworCXVuc2lnbmVkIGNoYXIgaW5fc25kWzJdOworCXVuc2lnbmVkIGNoYXIgaW5faW50WzJdOworCXVuc2lnbmVkIGNoYXIgcXVoZFsyXTsKKwl1bnNpZ25lZCBjaGFyIHF1ZW5kWzJdOworCXVuc2lnbmVkIGNoYXIgZ2xvYmFsX21hcFsyXTsKKwl1bnNpZ25lZCBjaGFyIGNoaXBfdmVyOworCXVuc2lnbmVkIGNoYXIgc2NhbV9vbjsKKwl1bnNpZ25lZCBjaGFyIGhvc3RfaWRbMl07CisJdW5zaWduZWQgaW50IHdvcmtpbmdbMl07CisJdW5zaWduZWQgc2hvcnQgd2lkZV9pZFsyXTsKKwl1bnNpZ25lZCBzaG9ydCBhY3RpdmVfaWRbMl07CisJdW5zaWduZWQgc2hvcnQgdWx0cmFfbWFwWzJdOworCXVuc2lnbmVkIHNob3J0IGFzeW5jWzJdOworCXVuc2lnbmVkIHNob3J0IGRldl9pZDsKKwl1bnNpZ25lZCBjaGFyIHNwWzJdWzE2XTsKKwl1bnNpZ25lZCBjaGFyIHIxZlsyXVsxNl07CQkKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpxdWVyZXFbMl1bcWNudF07CisJc3RydWN0IGF0cF9pZAorCXsKKwkJdW5zaWduZWQgY2hhciBkaXJjdDsKKwkJdW5zaWduZWQgY2hhciBkZXZzcDsKKwkJdW5zaWduZWQgY2hhciBkZXZ0eXBlOworCQl1bnNpZ25lZCBsb25nIHRyYW5fbGVuOworCQl1bnNpZ25lZCBsb25nIGxhc3RfbGVuOworCQl1bnNpZ25lZCBjaGFyICpwcmRfcG9zOworCQl1bnNpZ25lZCBjaGFyICpwcmRfdGFibGU7CisJCWRtYV9hZGRyX3QgcHJkYWRkcjsKKwkJc3RydWN0IHNjc2lfY21uZCAqY3Vycl9yZXE7CisJfSBpZFsyXVsxNl07CisgICAgCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisgICAgCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXVuc2lnbmVkIGludCB1bml0OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmx6MTIzMC5jIGIvZHJpdmVycy9zY3NpL2JsejEyMzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2Q5ZmNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JsejEyMzAuYwpAQCAtMCwwICsxLDM1MiBAQAorLyogYmx6MTIzMC5jOiBEcml2ZXIgZm9yIEJsaXp6YXJkIDEyMzAgU0NTSSBJViBDb250cm9sbGVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKQorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHRoZSBDeWJlclN0b3JtIGRyaXZlciwgaGVuY2UgdGhlIG9jY2FzaW9uYWwKKyAqIHJlZmVyZW5jZSB0byBDeWJlclN0b3JtLgorICovCisKKy8qIFRPRE86CisgKgorICogMSkgRmlndXJlIG91dCBob3cgdG8gbWFrZSBhIGNsZWFuZXIgbWVyZ2Ugd2l0aCB0aGUgc3BhcmMgZHJpdmVyIHdpdGggcmVnYXJkCisgKiAgICB0byB0aGUgY2FjaGVzIGFuZCB0aGUgU3BhcmMgTU1VIG1hcHBpbmcuCisgKiAyKSBNYWtlIGFzIGZldyByb3V0aW5lcyByZXF1aXJlZCBvdXRzaWRlIHRoZSBnZW5lcmljIGRyaXZlci4gQSBsb3Qgb2YgdGhlCisgKiAgICByb3V0aW5lcyBpbiB0aGlzIGZpbGUgdXNlZCB0byBiZSBpbmxpbmUhCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgIk5DUjUzQzl4LmgiCisKKyNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KKworI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKKyNkZWZpbmUgTUtJViAxCisKKy8qIFRoZSBjb250cm9sbGVyIHJlZ2lzdGVycyBjYW4gYmUgZm91bmQgaW4gdGhlIFoyIGNvbmZpZyBhcmVhIGF0IHRoZXNlCisgKiBvZmZzZXRzOgorICovCisjZGVmaW5lIEJMWjEyMzBfRVNQX0FERFIgMHg4MDAwCisjZGVmaW5lIEJMWjEyMzBfRE1BX0FERFIgMHgxMDAwMAorI2RlZmluZSBCTFoxMjMwSUlfRVNQX0FERFIgMHgxMDAwMAorI2RlZmluZSBCTFoxMjMwSUlfRE1BX0FERFIgMHgxMDAyMQorCisKKy8qIFRoZSBCbGl6emFyZCAxMjMwIERNQSBpbnRlcmZhY2UKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqIE9ubHkgdHdvIHRoaW5ncyBjYW4gYmUgcHJvZ3JhbW1lZCBpbiB0aGUgQmxpenphcmQgRE1BOgorICogIDEpIFRoZSBkYXRhIGRpcmVjdGlvbiBpcyBjb250cm9sbGVkIGJ5IHRoZSBzdGF0dXMgb2YgYml0IDMxICgxID0gd3JpdGUpCisgKiAgMikgVGhlIHNvdXJjZS9kZXN0IGFkZHJlc3MgKHdvcmQgYWxpZ25lZCwgc2hpZnRlZCBvbmUgcmlnaHQpIGluIGJpdHMgMzAtMAorICoKKyAqIFByb2dyYW0gRE1BIGJ5IGZpcnN0IGxhdGNoaW5nIHRoZSBoaWdoZXN0IGJ5dGUgb2YgdGhlIGFkZHJlc3MvZGlyZWN0aW9uCisgKiAoaS5lLiBiaXRzIDMxLTI0IG9mIHRoZSBsb25nIHdvcmQgY29uc3RydWN0ZWQgYXMgZGVzY3JpYmVkIGluIHN0ZXBzIDErMgorICogYWJvdmUpLiBUaGVuIHdyaXRlIGVhY2ggYnl0ZSBvZiB0aGUgYWRkcmVzcy9kaXJlY3Rpb24gKHN0YXJ0aW5nIHdpdGggdGhlCisgKiB0b3AgYnl0ZSwgd29ya2luZyBkb3duKSB0byB0aGUgRE1BIGFkZHJlc3MgcmVnaXN0ZXIuCisgKgorICogRmlndXJlIG91dCBpbnRlcnJ1cHQgc3RhdHVzIGJ5IHJlYWRpbmcgdGhlIEVTUCBzdGF0dXMgYnl0ZS4KKyAqLworc3RydWN0IGJsejEyMzBfZG1hX3JlZ2lzdGVycyB7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkbWFfYWRkcjsgCS8qIERNQSBhZGRyZXNzICAgICAgWzB4MDAwMF0gKi8KKwl1bnNpZ25lZCBjaGFyIGRtYXBhZDJbMHg3ZmZmXTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9sYXRjaDsgCS8qIERNQSBsYXRjaCAgICAgICAgWzB4ODAwMF0gKi8KK307CisKK3N0cnVjdCBibHoxMjMwSUlfZG1hX3JlZ2lzdGVycyB7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkbWFfYWRkcjsgCS8qIERNQSBhZGRyZXNzICAgICAgWzB4MDAwMF0gKi8KKwl1bnNpZ25lZCBjaGFyIGRtYXBhZDJbMHhmXTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9sYXRjaDsgCS8qIERNQSBsYXRjaCAgICAgICAgWzB4MDAxMF0gKi8KK307CisKKyNkZWZpbmUgQkxaMTIzMF9ETUFfV1JJVEUgMHg4MDAwMDAwMAorCitzdGF0aWMgaW50ICBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCk7CitzdGF0aWMgaW50ICBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApOworc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpOworc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKTsKKworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlclsxNl07CisJCQkJLyogVGhpcyBpcyB3aGVyZSBhbGwgY29tbWFuZHMgYXJlIHB1dAorCQkJCSAqIGJlZm9yZSB0aGV5IGFyZSB0cmFuc2ZlcnJlZCB0byB0aGUgRVNQIGNoaXAKKwkJCQkgKiB2aWEgUElPLgorCQkJCSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGV0ZWN0aW9uICovCitpbnQgX19pbml0IGJsejEyMzBfZXNwX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQpCit7CisJc3RydWN0IE5DUl9FU1AgKmVzcDsKKwlzdHJ1Y3Qgem9ycm9fZGV2ICp6ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJc3RydWN0IEVTUF9yZWdzICplcmVnczsKKwl1bnNpZ25lZCBsb25nIGJvYXJkOworCisjaWYgTUtJVgorI2RlZmluZSBSRUFMX0JMWjEyMzBfSUQJCVpPUlJPX1BST0RfUEhBU0U1X0JMSVpaQVJEXzEyMzBfSVZfMTI2MAorI2RlZmluZSBSRUFMX0JMWjEyMzBfRVNQX0FERFIJQkxaMTIzMF9FU1BfQUREUgorI2RlZmluZSBSRUFMX0JMWjEyMzBfRE1BX0FERFIJQkxaMTIzMF9ETUFfQUREUgorI2Vsc2UKKyNkZWZpbmUgUkVBTF9CTFoxMjMwX0lECQlaT1JST19QUk9EX1BIQVNFNV9CTElaWkFSRF8xMjMwX0lJX0ZBU1RMQU5FX1ozX0NZQkVSU0NTSV9DWUJFUlNUT1JNMDYwCisjZGVmaW5lIFJFQUxfQkxaMTIzMF9FU1BfQUREUglCTFoxMjMwSUlfRVNQX0FERFIKKyNkZWZpbmUgUkVBTF9CTFoxMjMwX0RNQV9BRERSCUJMWjEyMzBJSV9ETUFfQUREUgorI2VuZGlmCisKKwlpZiAoKHogPSB6b3Jyb19maW5kX2RldmljZShSRUFMX0JMWjEyMzBfSUQsIHopKSkgeworCSAgICBib2FyZCA9IHotPnJlc291cmNlLnN0YXJ0OworCSAgICBpZiAocmVxdWVzdF9tZW1fcmVnaW9uKGJvYXJkK1JFQUxfQkxaMTIzMF9FU1BfQUREUiwKKwkJCQkgICBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSwgIk5DUjUzQzl4IikpIHsKKwkJLyogRG8gc29tZSBtYWdpYyB0byBmaWd1cmUgb3V0IGlmIHRoZSBibGl6emFyZCBpcworCQkgKiBlcXVpcHBlZCB3aXRoIGEgU0NTSSBjb250cm9sbGVyCisJCSAqLworCQlhZGRyZXNzID0gWlRXT19WQUREUihib2FyZCk7CisJCWVyZWdzID0gKHN0cnVjdCBFU1BfcmVncyAqKShhZGRyZXNzICsgUkVBTF9CTFoxMjMwX0VTUF9BRERSKTsKKwkJZXNwID0gZXNwX2FsbG9jYXRlKHRwbnQsICh2b2lkICopYm9hcmQrUkVBTF9CTFoxMjMwX0VTUF9BRERSKTsKKworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmcxLCAoRVNQX0NPTkZJRzFfUEVOQUJMRSB8IDcpKTsKKwkJdWRlbGF5KDUpOworCQlpZihlc3BfcmVhZChlcmVncy0+ZXNwX2NmZzEpICE9IChFU1BfQ09ORklHMV9QRU5BQkxFIHwgNykpCisJCQlnb3RvIGVycl9vdXQ7CisKKwkJLyogRG8gY29tbWFuZCB0cmFuc2ZlciB3aXRoIHByb2dyYW1tZWQgSS9PICovCisJCWVzcC0+ZG9fcGlvX2NtZHMgPSAxOworCisJCS8qIFJlcXVpcmVkIGZ1bmN0aW9ucyAqLworCQllc3AtPmRtYV9ieXRlc19zZW50ID0gJmRtYV9ieXRlc19zZW50OworCQllc3AtPmRtYV9jYW5fdHJhbnNmZXIgPSAmZG1hX2Nhbl90cmFuc2ZlcjsKKwkJZXNwLT5kbWFfZHVtcF9zdGF0ZSA9ICZkbWFfZHVtcF9zdGF0ZTsKKwkJZXNwLT5kbWFfaW5pdF9yZWFkID0gJmRtYV9pbml0X3JlYWQ7CisJCWVzcC0+ZG1hX2luaXRfd3JpdGUgPSAmZG1hX2luaXRfd3JpdGU7CisJCWVzcC0+ZG1hX2ludHNfb2ZmID0gJmRtYV9pbnRzX29mZjsKKwkJZXNwLT5kbWFfaW50c19vbiA9ICZkbWFfaW50c19vbjsKKwkJZXNwLT5kbWFfaXJxX3AgPSAmZG1hX2lycV9wOworCQllc3AtPmRtYV9wb3J0c19wID0gJmRtYV9wb3J0c19wOworCQllc3AtPmRtYV9zZXR1cCA9ICZkbWFfc2V0dXA7CisKKwkJLyogT3B0aW9uYWwgZnVuY3Rpb25zICovCisJCWVzcC0+ZG1hX2JhcnJpZXIgPSAwOworCQllc3AtPmRtYV9kcmFpbiA9IDA7CisJCWVzcC0+ZG1hX2ludmFsaWRhdGUgPSAwOworCQllc3AtPmRtYV9pcnFfZW50cnkgPSAwOworCQllc3AtPmRtYV9pcnFfZXhpdCA9IDA7CisJCWVzcC0+ZG1hX2xlZF9vbiA9IDA7CisJCWVzcC0+ZG1hX2xlZF9vZmYgPSAwOworCQllc3AtPmRtYV9wb2xsID0gMDsKKwkJZXNwLT5kbWFfcmVzZXQgPSAwOworCisJCS8qIFNDU0kgY2hpcCBzcGVlZCAqLworCQllc3AtPmNmcmVxID0gNDAwMDAwMDA7CisKKwkJLyogVGhlIERNQSByZWdpc3RlcnMgb24gdGhlIEJsaXp6YXJkIGFyZSBtYXBwZWQKKwkJICogcmVsYXRpdmUgdG8gdGhlIGRldmljZSAoaS5lLiBpbiB0aGUgc2FtZSBab3JybworCQkgKiBJL08gYmxvY2spLgorCQkgKi8KKwkJZXNwLT5kcmVncyA9ICh2b2lkICopKGFkZHJlc3MgKyBSRUFMX0JMWjEyMzBfRE1BX0FERFIpOworCQorCQkvKiBFU1AgcmVnaXN0ZXIgYmFzZSAqLworCQllc3AtPmVyZWdzID0gZXJlZ3M7CisKKwkJLyogU2V0IHRoZSBjb21tYW5kIGJ1ZmZlciAqLworCQllc3AtPmVzcF9jb21tYW5kID0gY21kX2J1ZmZlcjsKKwkJZXNwLT5lc3BfY29tbWFuZF9kdm1hID0gdmlydF90b19idXMoKHZvaWQgKiljbWRfYnVmZmVyKTsKKworCQllc3AtPmlycSA9IElSUV9BTUlHQV9QT1JUUzsKKwkJZXNwLT5zbG90ID0gYm9hcmQrUkVBTF9CTFoxMjMwX0VTUF9BRERSOworCQlpZiAocmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBlc3BfaW50ciwgU0FfU0hJUlEsCisJCQkJICJCbGl6emFyZCAxMjMwIFNDU0kgSVYiLCBlc3AtPmVob3N0KSkKKwkJCWdvdG8gZXJyX291dDsKKworCQkvKiBGaWd1cmUgb3V0IG91ciBzY3NpIElEIG9uIHRoZSBidXMgKi8KKwkJZXNwLT5zY3NpX2lkID0gNzsKKwkJCisJCS8qIFdlIGRvbid0IGhhdmUgYSBkaWZmZXJlbnRpYWwgU0NTSS1idXMuICovCisJCWVzcC0+ZGlmZiA9IDA7CisKKwkJZXNwX2luaXRpYWxpemUoZXNwKTsKKworCQlwcmludGsoIkVTUDogVG90YWwgb2YgJWQgRVNQIGhvc3RzIGZvdW5kLCAlZCBhY3R1YWxseSBpbiB1c2UuXG4iLCBuZXNwcywgZXNwc19pbl91c2UpOworCQllc3BzX3J1bm5pbmcgPSBlc3BzX2luX3VzZTsKKwkJcmV0dXJuIGVzcHNfaW5fdXNlOworCSAgICB9CisJfQorCXJldHVybiAwOworIAorIGVycl9vdXQ6CisJc2NzaV91bnJlZ2lzdGVyKGVzcC0+ZWhvc3QpOworCWVzcF9kZWFsbG9jYXRlKGVzcCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGJvYXJkK1JFQUxfQkxaMTIzMF9FU1BfQUREUiwKKwkJCSAgIHNpemVvZihzdHJ1Y3QgRVNQX3JlZ3MpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRE1BIEZ1bmN0aW9ucyAqLworc3RhdGljIGludCBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCkKK3sKKwkvKiBTaW5jZSB0aGUgQmxpenphcmQgRE1BIGlzIGZ1bGx5IGRlZGljYXRlZCB0byB0aGUgRVNQIGNoaXAsCisJICogdGhlIG51bWJlciBvZiBieXRlcyBzZW50ICh0byB0aGUgRVNQIGNoaXApIGVxdWFscyB0aGUgbnVtYmVyCisJICogb2YgYnl0ZXMgaW4gdGhlIEZJRk8gLSB0aGVyZSBpcyBubyBidWZmZXJpbmcgaW4gdGhlIERNQSBjb250cm9sbGVyLgorCSAqIFhYWFggRG8gSSByZWFkIHRoaXMgcmlnaHQ/IEl0IGlzIGZyb20gaG9zdCB0byBFU1AsIHJpZ2h0PworCSAqLworCXJldHVybiBmaWZvX2NvdW50OworfQorCitzdGF0aWMgaW50IGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKK3sKKwkvKiBJIGRvbid0IHRoaW5rIHRoZXJlJ3MgYW55IGxpbWl0IG9uIHRoZSBCbGl6emFyZCBETUEuIFNvIHdlIHVzZSB3aGF0CisJICogdGhlIEVTUCBjaGlwIGNhbiBoYW5kbGUgKDI0IGJpdCkuCisJICovCisJdW5zaWduZWQgbG9uZyBzeiA9IHNwLT5TQ3AudGhpc19yZXNpZHVhbDsKKwlpZihzeiA+IDB4MTAwMDAwMCkKKwkJc3ogPSAweDEwMDAwMDA7CisJcmV0dXJuIHN6OworfQorCitzdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCUVTUExPRygoImludHJlcTo8JTA0eD4sIGludGVuYTo8JTA0eD5cbiIsCisJCWN1c3RvbS5pbnRyZXFyLCBjdXN0b20uaW50ZW5hcikpOworfQorCit2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKK3sKKyNpZiBNS0lWCisJc3RydWN0IGJsejEyMzBfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKKwkJKHN0cnVjdCBibHoxMjMwX2RtYV9yZWdpc3RlcnMgKikgKGVzcC0+ZHJlZ3MpOworI2Vsc2UKKwlzdHJ1Y3QgYmx6MTIzMElJX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0gCisJCShzdHJ1Y3QgYmx6MTIzMElJX2RtYV9yZWdpc3RlcnMgKikgKGVzcC0+ZHJlZ3MpOworI2VuZGlmCisKKwljYWNoZV9jbGVhcihhZGRyLCBsZW5ndGgpOworCisJYWRkciA+Pj0gMTsKKwlhZGRyICY9IH4oQkxaMTIzMF9ETUFfV1JJVEUpOworCisJLyogRmlyc3Qgc2V0IGxhdGNoICovCisJZHJlZ3MtPmRtYV9sYXRjaCA9IChhZGRyID4+IDI0KSAmIDB4ZmY7CisKKwkvKiBUaGVuIHB1bXAgdGhlIGFkZHJlc3MgdG8gdGhlIERNQSBhZGRyZXNzIHJlZ2lzdGVyICovCisjaWYgTUtJVgorCWRyZWdzLT5kbWFfYWRkciA9IChhZGRyID4+IDI0KSAmIDB4ZmY7CisjZW5kaWYKKwlkcmVncy0+ZG1hX2FkZHIgPSAoYWRkciA+PiAxNikgJiAweGZmOworCWRyZWdzLT5kbWFfYWRkciA9IChhZGRyID4+ICA4KSAmIDB4ZmY7CisJZHJlZ3MtPmRtYV9hZGRyID0gKGFkZHIgICAgICApICYgMHhmZjsKK30KKwordm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKQoreworI2lmIE1LSVYKKwlzdHJ1Y3QgYmx6MTIzMF9kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAorCQkoc3RydWN0IGJsejEyMzBfZG1hX3JlZ2lzdGVycyAqKSAoZXNwLT5kcmVncyk7CisjZWxzZQorCXN0cnVjdCBibHoxMjMwSUlfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKKwkJKHN0cnVjdCBibHoxMjMwSUlfZG1hX3JlZ2lzdGVycyAqKSAoZXNwLT5kcmVncyk7CisjZW5kaWYKKworCWNhY2hlX3B1c2goYWRkciwgbGVuZ3RoKTsKKworCWFkZHIgPj49IDE7CisJYWRkciB8PSBCTFoxMjMwX0RNQV9XUklURTsKKworCS8qIEZpcnN0IHNldCBsYXRjaCAqLworCWRyZWdzLT5kbWFfbGF0Y2ggPSAoYWRkciA+PiAyNCkgJiAweGZmOworCisJLyogVGhlbiBwdW1wIHRoZSBhZGRyZXNzIHRvIHRoZSBETUEgYWRkcmVzcyByZWdpc3RlciAqLworI2lmIE1LSVYKKwlkcmVncy0+ZG1hX2FkZHIgPSAoYWRkciA+PiAyNCkgJiAweGZmOworI2VuZGlmCisJZHJlZ3MtPmRtYV9hZGRyID0gKGFkZHIgPj4gMTYpICYgMHhmZjsKKwlkcmVncy0+ZG1hX2FkZHIgPSAoYWRkciA+PiAgOCkgJiAweGZmOworCWRyZWdzLT5kbWFfYWRkciA9IChhZGRyICAgICAgKSAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCWRpc2FibGVfaXJxKGVzcC0+aXJxKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2ludHNfb24oc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwllbmFibGVfaXJxKGVzcC0+aXJxKTsKK30KKworc3RhdGljIGludCBkbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlyZXR1cm4gKGVzcF9yZWFkKGVzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpICYgRVNQX1NUQVRfSU5UUik7Cit9CisKK3N0YXRpYyBpbnQgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlyZXR1cm4gKChjdXN0b20uaW50ZW5hcikgJiBJRl9QT1JUUyk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSkKK3sKKwkvKiBPbiB0aGUgU3BhcmMsIERNQV9TVF9XUklURSBtZWFucyAibW92ZSBkYXRhIGZyb20gZGV2aWNlIHRvIG1lbW9yeSIKKwkgKiBzbyB3aGVuICh3cml0ZSkgaXMgdHJ1ZSwgaXQgYWN0dWFsbHkgbWVhbnMgUkVBRCEKKwkgKi8KKwlpZih3cml0ZSl7CisJCWRtYV9pbml0X3JlYWQoZXNwLCBhZGRyLCBjb3VudCk7CisJfSBlbHNlIHsKKwkJZG1hX2luaXRfd3JpdGUoZXNwLCBhZGRyLCBjb3VudCk7CisJfQorfQorCisjZGVmaW5lIEhPU1RTX0MKKworaW50IGJsejEyMzBfZXNwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisjaWZkZWYgTU9EVUxFCisJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpKChzdHJ1Y3QgTkNSX0VTUCAqKWluc3RhbmNlLT5ob3N0ZGF0YSktPmVkZXY7CisJZXNwX2RlYWxsb2NhdGUoKHN0cnVjdCBOQ1JfRVNQICopaW5zdGFuY2UtPmhvc3RkYXRhKTsKKwllc3BfcmVsZWFzZSgpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihhZGRyZXNzLCBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSk7CisJZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBlc3BfaW50cik7CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJlc3AtYmx6MTIzMCIsCisJLnByb2NfaW5mbwkJPSBlc3BfcHJvY19pbmZvLAorCS5uYW1lCQkJPSAiQmxpenphcmQxMjMwIFNDU0kgSVYiLAorCS5kZXRlY3QJCQk9IGJsejEyMzBfZXNwX2RldGVjdCwKKwkuc2xhdmVfYWxsb2MJCT0gZXNwX3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9kZXN0cm95CQk9IGVzcF9zbGF2ZV9kZXN0cm95LAorCS5yZWxlYXNlCQk9IGJsejEyMzBfZXNwX3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSBlc3BfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBlc3BfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZXNwX3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gNywKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORworfTsKKworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JsejIwNjAuYyBiL2RyaXZlcnMvc2NzaS9ibHoyMDYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUyMjFkMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9ibHoyMDYwLmMKQEAgLTAsMCArMSwzMDYgQEAKKy8qIGJsejIwNjAuYzogRHJpdmVyIGZvciBCbGl6emFyZCAyMDYwIFNDU0kgQ29udHJvbGxlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykKKyAqCisgKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiB0aGUgQ3liZXJTdG9ybSBkcml2ZXIsIGhlbmNlIHRoZSBvY2Nhc2lvbmFsCisgKiByZWZlcmVuY2UgdG8gQ3liZXJTdG9ybS4KKyAqLworCisvKiBUT0RPOgorICoKKyAqIDEpIEZpZ3VyZSBvdXQgaG93IHRvIG1ha2UgYSBjbGVhbmVyIG1lcmdlIHdpdGggdGhlIHNwYXJjIGRyaXZlciB3aXRoIHJlZ2FyZAorICogICAgdG8gdGhlIGNhY2hlcyBhbmQgdGhlIFNwYXJjIE1NVSBtYXBwaW5nLgorICogMikgTWFrZSBhcyBmZXcgcm91dGluZXMgcmVxdWlyZWQgb3V0c2lkZSB0aGUgZ2VuZXJpYyBkcml2ZXIuIEEgbG90IG9mIHRoZQorICogICAgcm91dGluZXMgaW4gdGhpcyBmaWxlIHVzZWQgdG8gYmUgaW5saW5lIQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJOQ1I1M0M5eC5oIgorCisjaW5jbHVkZSA8bGludXgvem9ycm8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaW50cy5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CisKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisvKiBUaGUgY29udHJvbGxlciByZWdpc3RlcnMgY2FuIGJlIGZvdW5kIGluIHRoZSBaMiBjb25maWcgYXJlYSBhdCB0aGVzZQorICogb2Zmc2V0czoKKyAqLworI2RlZmluZSBCTFoyMDYwX0VTUF9BRERSIDB4MWZmMDAKKyNkZWZpbmUgQkxaMjA2MF9ETUFfQUREUiAweDFmZmUwCisKKworLyogVGhlIEJsaXp6YXJkIDIwNjAgRE1BIGludGVyZmFjZQorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICogT25seSB0d28gdGhpbmdzIGNhbiBiZSBwcm9ncmFtbWVkIGluIHRoZSBCbGl6emFyZCBETUE6CisgKiAgMSkgVGhlIGRhdGEgZGlyZWN0aW9uIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHN0YXR1cyBvZiBiaXQgMzEgKDEgPSB3cml0ZSkKKyAqICAyKSBUaGUgc291cmNlL2Rlc3QgYWRkcmVzcyAod29yZCBhbGlnbmVkLCBzaGlmdGVkIG9uZSByaWdodCkgaW4gYml0cyAzMC0wCisgKgorICogRmlndXJlIG91dCBpbnRlcnJ1cHQgc3RhdHVzIGJ5IHJlYWRpbmcgdGhlIEVTUCBzdGF0dXMgYnl0ZS4KKyAqLworc3RydWN0IGJsejIwNjBfZG1hX3JlZ2lzdGVycyB7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkbWFfbGVkX2N0cmw7CS8qIERNQSBsZWQgY29udHJvbCAgIFsweDAwMF0gKi8KKwl1bnNpZ25lZCBjaGFyIGRtYXBhZDFbMHgwZl07CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkbWFfYWRkcjA7IAkvKiBETUEgYWRkcmVzcyAoTVNCKSBbMHgwMTBdICovCisJdW5zaWduZWQgY2hhciBkbWFwYWQyWzB4MDNdOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZG1hX2FkZHIxOyAJLyogRE1BIGFkZHJlc3MgICAgICAgWzB4MDE0XSAqLworCXVuc2lnbmVkIGNoYXIgZG1hcGFkM1sweDAzXTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9hZGRyMjsgCS8qIERNQSBhZGRyZXNzICAgICAgIFsweDAxOF0gKi8KKwl1bnNpZ25lZCBjaGFyIGRtYXBhZDRbMHgwM107CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkbWFfYWRkcjM7IAkvKiBETUEgYWRkcmVzcyAoTFNCKSBbMHgwMWNdICovCit9OworCisjZGVmaW5lIEJMWjIwNjBfRE1BX1dSSVRFIDB4ODAwMDAwMDAKKworLyogRE1BIGNvbnRyb2wgYml0cyAqLworI2RlZmluZSBCTFoyMDYwX0RNQV9MRUQgICAgMHgwMgkJLyogSEQgbGVkIGNvbnRyb2wgMSA9IG9mZiAqLworCitzdGF0aWMgaW50ICBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCk7CitzdGF0aWMgaW50ICBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApOworc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpOworc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKTsKKworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlclsxNl07CisJCQkJLyogVGhpcyBpcyB3aGVyZSBhbGwgY29tbWFuZHMgYXJlIHB1dAorCQkJCSAqIGJlZm9yZSB0aGV5IGFyZSB0cmFuc2ZlcnJlZCB0byB0aGUgRVNQIGNoaXAKKwkJCQkgKiB2aWEgUElPLgorCQkJCSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGV0ZWN0aW9uICovCitpbnQgX19pbml0IGJsejIwNjBfZXNwX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQpCit7CisJc3RydWN0IE5DUl9FU1AgKmVzcDsKKwlzdHJ1Y3Qgem9ycm9fZGV2ICp6ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisKKwlpZiAoKHogPSB6b3Jyb19maW5kX2RldmljZShaT1JST19QUk9EX1BIQVNFNV9CTElaWkFSRF8yMDYwLCB6KSkpIHsKKwkgICAgdW5zaWduZWQgbG9uZyBib2FyZCA9IHotPnJlc291cmNlLnN0YXJ0OworCSAgICBpZiAocmVxdWVzdF9tZW1fcmVnaW9uKGJvYXJkK0JMWjIwNjBfRVNQX0FERFIsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBFU1BfcmVncyksICJOQ1I1M0M5eCIpKSB7CisJCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCAodm9pZCAqKWJvYXJkK0JMWjIwNjBfRVNQX0FERFIpOworCisJCS8qIERvIGNvbW1hbmQgdHJhbnNmZXIgd2l0aCBwcm9ncmFtbWVkIEkvTyAqLworCQllc3AtPmRvX3Bpb19jbWRzID0gMTsKKworCQkvKiBSZXF1aXJlZCBmdW5jdGlvbnMgKi8KKwkJZXNwLT5kbWFfYnl0ZXNfc2VudCA9ICZkbWFfYnl0ZXNfc2VudDsKKwkJZXNwLT5kbWFfY2FuX3RyYW5zZmVyID0gJmRtYV9jYW5fdHJhbnNmZXI7CisJCWVzcC0+ZG1hX2R1bXBfc3RhdGUgPSAmZG1hX2R1bXBfc3RhdGU7CisJCWVzcC0+ZG1hX2luaXRfcmVhZCA9ICZkbWFfaW5pdF9yZWFkOworCQllc3AtPmRtYV9pbml0X3dyaXRlID0gJmRtYV9pbml0X3dyaXRlOworCQllc3AtPmRtYV9pbnRzX29mZiA9ICZkbWFfaW50c19vZmY7CisJCWVzcC0+ZG1hX2ludHNfb24gPSAmZG1hX2ludHNfb247CisJCWVzcC0+ZG1hX2lycV9wID0gJmRtYV9pcnFfcDsKKwkJZXNwLT5kbWFfcG9ydHNfcCA9ICZkbWFfcG9ydHNfcDsKKwkJZXNwLT5kbWFfc2V0dXAgPSAmZG1hX3NldHVwOworCisJCS8qIE9wdGlvbmFsIGZ1bmN0aW9ucyAqLworCQllc3AtPmRtYV9iYXJyaWVyID0gMDsKKwkJZXNwLT5kbWFfZHJhaW4gPSAwOworCQllc3AtPmRtYV9pbnZhbGlkYXRlID0gMDsKKwkJZXNwLT5kbWFfaXJxX2VudHJ5ID0gMDsKKwkJZXNwLT5kbWFfaXJxX2V4aXQgPSAwOworCQllc3AtPmRtYV9sZWRfb24gPSAmZG1hX2xlZF9vbjsKKwkJZXNwLT5kbWFfbGVkX29mZiA9ICZkbWFfbGVkX29mZjsKKwkJZXNwLT5kbWFfcG9sbCA9IDA7CisJCWVzcC0+ZG1hX3Jlc2V0ID0gMDsKKworCQkvKiBTQ1NJIGNoaXAgc3BlZWQgKi8KKwkJZXNwLT5jZnJlcSA9IDQwMDAwMDAwOworCisJCS8qIFRoZSBETUEgcmVnaXN0ZXJzIG9uIHRoZSBCbGl6emFyZCBhcmUgbWFwcGVkCisJCSAqIHJlbGF0aXZlIHRvIHRoZSBkZXZpY2UgKGkuZS4gaW4gdGhlIHNhbWUgWm9ycm8KKwkJICogSS9PIGJsb2NrKS4KKwkJICovCisJCWFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylaVFdPX1ZBRERSKGJvYXJkKTsKKwkJZXNwLT5kcmVncyA9ICh2b2lkICopKGFkZHJlc3MgKyBCTFoyMDYwX0RNQV9BRERSKTsKKworCQkvKiBFU1AgcmVnaXN0ZXIgYmFzZSAqLworCQllc3AtPmVyZWdzID0gKHN0cnVjdCBFU1BfcmVncyAqKShhZGRyZXNzICsgQkxaMjA2MF9FU1BfQUREUik7CisJCQorCQkvKiBTZXQgdGhlIGNvbW1hbmQgYnVmZmVyICovCisJCWVzcC0+ZXNwX2NvbW1hbmQgPSBjbWRfYnVmZmVyOworCQllc3AtPmVzcF9jb21tYW5kX2R2bWEgPSB2aXJ0X3RvX2J1cygodm9pZCAqKWNtZF9idWZmZXIpOworCisJCWVzcC0+aXJxID0gSVJRX0FNSUdBX1BPUlRTOworCQlyZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGVzcF9pbnRyLCBTQV9TSElSUSwKKwkJCSAgICAiQmxpenphcmQgMjA2MCBTQ1NJIiwgZXNwLT5laG9zdCk7CisKKwkJLyogRmlndXJlIG91dCBvdXIgc2NzaSBJRCBvbiB0aGUgYnVzICovCisJCWVzcC0+c2NzaV9pZCA9IDc7CisJCQorCQkvKiBXZSBkb24ndCBoYXZlIGEgZGlmZmVyZW50aWFsIFNDU0ktYnVzLiAqLworCQllc3AtPmRpZmYgPSAwOworCisJCWVzcF9pbml0aWFsaXplKGVzcCk7CisKKwkJcHJpbnRrKCJFU1A6IFRvdGFsIG9mICVkIEVTUCBob3N0cyBmb3VuZCwgJWQgYWN0dWFsbHkgaW4gdXNlLlxuIiwgbmVzcHMsIGVzcHNfaW5fdXNlKTsKKwkJZXNwc19ydW5uaW5nID0gZXNwc19pbl91c2U7CisJCXJldHVybiBlc3BzX2luX3VzZTsKKwkgICAgfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRE1BIEZ1bmN0aW9ucyAqLworc3RhdGljIGludCBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCkKK3sKKwkvKiBTaW5jZSB0aGUgQmxpenphcmQgRE1BIGlzIGZ1bGx5IGRlZGljYXRlZCB0byB0aGUgRVNQIGNoaXAsCisJICogdGhlIG51bWJlciBvZiBieXRlcyBzZW50ICh0byB0aGUgRVNQIGNoaXApIGVxdWFscyB0aGUgbnVtYmVyCisJICogb2YgYnl0ZXMgaW4gdGhlIEZJRk8gLSB0aGVyZSBpcyBubyBidWZmZXJpbmcgaW4gdGhlIERNQSBjb250cm9sbGVyLgorCSAqIFhYWFggRG8gSSByZWFkIHRoaXMgcmlnaHQ/IEl0IGlzIGZyb20gaG9zdCB0byBFU1AsIHJpZ2h0PworCSAqLworCXJldHVybiBmaWZvX2NvdW50OworfQorCitzdGF0aWMgaW50IGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKK3sKKwkvKiBJIGRvbid0IHRoaW5rIHRoZXJlJ3MgYW55IGxpbWl0IG9uIHRoZSBCbGl6emFyZCBETUEuIFNvIHdlIHVzZSB3aGF0CisJICogdGhlIEVTUCBjaGlwIGNhbiBoYW5kbGUgKDI0IGJpdCkuCisJICovCisJdW5zaWduZWQgbG9uZyBzeiA9IHNwLT5TQ3AudGhpc19yZXNpZHVhbDsKKwlpZihzeiA+IDB4MTAwMDAwMCkKKwkJc3ogPSAweDEwMDAwMDA7CisJcmV0dXJuIHN6OworfQorCitzdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCUVTUExPRygoImludHJlcTo8JTA0eD4sIGludGVuYTo8JTA0eD5cbiIsCisJCWN1c3RvbS5pbnRyZXFyLCBjdXN0b20uaW50ZW5hcikpOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpCit7CisJc3RydWN0IGJsejIwNjBfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKKwkJKHN0cnVjdCBibHoyMDYwX2RtYV9yZWdpc3RlcnMgKikgKGVzcC0+ZHJlZ3MpOworCisJY2FjaGVfY2xlYXIoYWRkciwgbGVuZ3RoKTsKKworCWFkZHIgPj49IDE7CisJYWRkciAmPSB+KEJMWjIwNjBfRE1BX1dSSVRFKTsKKwlkcmVncy0+ZG1hX2FkZHIzID0gKGFkZHIgICAgICApICYgMHhmZjsKKwlkcmVncy0+ZG1hX2FkZHIyID0gKGFkZHIgPj4gIDgpICYgMHhmZjsKKwlkcmVncy0+ZG1hX2FkZHIxID0gKGFkZHIgPj4gMTYpICYgMHhmZjsKKwlkcmVncy0+ZG1hX2FkZHIwID0gKGFkZHIgPj4gMjQpICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgYmx6MjA2MF9kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAorCQkoc3RydWN0IGJsejIwNjBfZG1hX3JlZ2lzdGVycyAqKSAoZXNwLT5kcmVncyk7CisKKwljYWNoZV9wdXNoKGFkZHIsIGxlbmd0aCk7CisKKwlhZGRyID4+PSAxOworCWFkZHIgfD0gQkxaMjA2MF9ETUFfV1JJVEU7CisJZHJlZ3MtPmRtYV9hZGRyMyA9IChhZGRyICAgICAgKSAmIDB4ZmY7CisJZHJlZ3MtPmRtYV9hZGRyMiA9IChhZGRyID4+ICA4KSAmIDB4ZmY7CisJZHJlZ3MtPmRtYV9hZGRyMSA9IChhZGRyID4+IDE2KSAmIDB4ZmY7CisJZHJlZ3MtPmRtYV9hZGRyMCA9IChhZGRyID4+IDI0KSAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCWRpc2FibGVfaXJxKGVzcC0+aXJxKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2ludHNfb24oc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwllbmFibGVfaXJxKGVzcC0+aXJxKTsKK30KKworc3RhdGljIGludCBkbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlyZXR1cm4gKGVzcF9yZWFkKGVzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpICYgRVNQX1NUQVRfSU5UUik7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJKChzdHJ1Y3QgYmx6MjA2MF9kbWFfcmVnaXN0ZXJzICopIChlc3AtPmRyZWdzKSktPmRtYV9sZWRfY3RybCA9CisJCUJMWjIwNjBfRE1BX0xFRDsKK30KKworc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCSgoc3RydWN0IGJsejIwNjBfZG1hX3JlZ2lzdGVycyAqKSAoZXNwLT5kcmVncykpLT5kbWFfbGVkX2N0cmwgPSAwOworfQorCitzdGF0aWMgaW50IGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJcmV0dXJuICgoY3VzdG9tLmludGVuYXIpICYgSUZfUE9SVFMpOworfQorCitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpCit7CisJLyogT24gdGhlIFNwYXJjLCBETUFfU1RfV1JJVEUgbWVhbnMgIm1vdmUgZGF0YSBmcm9tIGRldmljZSB0byBtZW1vcnkiCisJICogc28gd2hlbiAod3JpdGUpIGlzIHRydWUsIGl0IGFjdHVhbGx5IG1lYW5zIFJFQUQhCisJICovCisJaWYod3JpdGUpeworCQlkbWFfaW5pdF9yZWFkKGVzcCwgYWRkciwgY291bnQpOworCX0gZWxzZSB7CisJCWRtYV9pbml0X3dyaXRlKGVzcCwgYWRkciwgY291bnQpOworCX0KK30KKworI2RlZmluZSBIT1NUU19DCisKK2ludCBibHoyMDYwX2VzcF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworI2lmZGVmIE1PRFVMRQorCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSgoc3RydWN0IE5DUl9FU1AgKilpbnN0YW5jZS0+aG9zdGRhdGEpLT5lZGV2OworCisJZXNwX2RlYWxsb2NhdGUoKHN0cnVjdCBOQ1JfRVNQICopaW5zdGFuY2UtPmhvc3RkYXRhKTsKKwllc3BfcmVsZWFzZSgpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihhZGRyZXNzLCBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSk7CisJZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBlc3BfaW50cik7CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJlc3AtYmx6MjA2MCIsCisJLnByb2NfaW5mbwkJPSBlc3BfcHJvY19pbmZvLAorCS5uYW1lCQkJPSAiQmxpenphcmQyMDYwIFNDU0kiLAorCS5kZXRlY3QJCQk9IGJsejIwNjBfZXNwX2RldGVjdCwKKwkuc2xhdmVfYWxsb2MJCT0gZXNwX3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9kZXN0cm95CQk9IGVzcF9zbGF2ZV9kZXN0cm95LAorCS5yZWxlYXNlCQk9IGJsejIwNjBfZXNwX3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSBlc3BfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBlc3BfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZXNwX3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gNywKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORworfTsKKworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2J2bWU2MDAwLmMgYi9kcml2ZXJzL3Njc2kvYnZtZTYwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWM3ZWQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2J2bWU2MDAwLmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIERldGVjdGlvbiByb3V0aW5lIGZvciB0aGUgTkNSNTNjNzEwIGJhc2VkIEJWTUU2MDAwIFNDU0kgQ29udHJvbGxlcnMgZm9yIExpbnV4LgorICoKKyAqIEJhc2VkIG9uIHdvcmsgYnkgQWxhbiBIb3VyaWhhbmUKKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9idm1lNjAwMGh3Lmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiNTNjN3h4LmgiCisjaW5jbHVkZSAiYnZtZTYwMDAuaCIKKworI2luY2x1ZGU8bGludXgvc3RhdC5oPgorCisKK2ludCBidm1lNjAwMF9zY3NpX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQpCit7CisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgY2FsbGVkID0gMDsKKyAgICBpbnQgY2xvY2s7CisgICAgbG9uZyBsb25nIG9wdGlvbnM7CisKKyAgICBpZiAoY2FsbGVkKQorCXJldHVybiAwOworICAgIGlmICghTUFDSF9JU19CVk1FNjAwMCkKKwlyZXR1cm4gMDsKKworICAgIHRwbnQtPnByb2NfbmFtZSA9ICJCVk1FNjAwMCI7CisKKyAgICBvcHRpb25zID0gT1BUSU9OX01FTU9SWV9NQVBQRUR8T1BUSU9OX0RFQlVHX1RFU1QxfE9QVElPTl9JTlRGTFl8T1BUSU9OX1NZTkNIUk9OT1VTfE9QVElPTl9BTFdBWVNfU1lOQ0hST05PVVN8T1BUSU9OX0RJU0NPTk5FQ1Q7CisKKyAgICBjbG9jayA9IDQwMDAwMDAwOwkvKiA2Nk1IeiBTQ1NJIENsb2NrICovCisKKyAgICBuY3I1M2M3eHhfaW5pdCh0cG50LCAwLCA3MTAsICh1bnNpZ25lZCBsb25nKUJWTUVfTkNSNTNDNzEwX0JBU0UsCisJCQkwLCBCVk1FX0lSUV9TQ1NJLCBETUFfTk9ORSwKKwkJCW9wdGlvbnMsIGNsb2NrKTsKKyAgICBjYWxsZWQgPSAxOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGJ2bWU2MDAwX3Njc2lfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpZiAoc2hvc3QtPmlycSkKKwkJZnJlZV9pcnEoc2hvc3QtPmlycSwgTlVMTCk7CisJaWYgKHNob3N0LT5kbWFfY2hhbm5lbCAhPSAweGZmKQorCQlmcmVlX2RtYShzaG9zdC0+ZG1hX2NoYW5uZWwpOworCWlmIChzaG9zdC0+aW9fcG9ydCAmJiBzaG9zdC0+bl9pb19wb3J0KQorCQlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgc2hvc3QtPm5faW9fcG9ydCk7CisJc2NzaV91bnJlZ2lzdGVyKHNob3N0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLm5hbWUJCQk9ICJCVk1FNjAwMCBOQ1I1M2M3MTAgU0NTSSIsCisJLmRldGVjdAkJCT0gYnZtZTYwMDBfc2NzaV9kZXRlY3QsCisJLnJlbGVhc2UJCT0gYnZtZTYwMDBfc2NzaV9yZWxlYXNlLAorCS5xdWV1ZWNvbW1hbmQJCT0gTkNSNTNjN3h4X3F1ZXVlX2NvbW1hbmQsCisJLmFib3J0CQkJPSBOQ1I1M2M3eHhfYWJvcnQsCisJLnJlc2V0CQkJPSBOQ1I1M2M3eHhfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSAyNCwKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gNjMsCisJLmNtZF9wZXJfbHVuCQk9IDMsCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORworfTsKKworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9idm1lNjAwMC5oIGIvZHJpdmVycy9zY3NpL2J2bWU2MDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliNmJiYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9idm1lNjAwMC5oCkBAIC0wLDAgKzEsMjQgQEAKKyNpZm5kZWYgQlZNRTYwMDBfU0NTSV9ICisjZGVmaW5lIEJWTUU2MDAwX1NDU0lfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworaW50IGJ2bWU2MDAwX3Njc2lfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK2NvbnN0IGNoYXIgKk5DUjUzYzd4MF9pbmZvKHZvaWQpOworaW50IE5DUjUzYzd4eF9xdWV1ZV9jb21tYW5kKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKK2ludCBOQ1I1M2M3eHhfYWJvcnQoU2NzaV9DbW5kICopOworaW50IE5DUjUzYzd4MF9yZWxlYXNlIChzdHJ1Y3QgU2NzaV9Ib3N0ICopOworaW50IE5DUjUzYzd4eF9yZXNldChTY3NpX0NtbmQgKiwgdW5zaWduZWQgaW50KTsKK3ZvaWQgTkNSNTNjN3gwX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworCisjaWZuZGVmIENNRF9QRVJfTFVOCisjZGVmaW5lIENNRF9QRVJfTFVOIDMKKyNlbmRpZgorCisjaWZuZGVmIENBTl9RVUVVRQorI2RlZmluZSBDQU5fUVVFVUUgMjQKKyNlbmRpZgorCisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CisKKyNlbmRpZiAvKiBCVk1FNjAwMF9TQ1NJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jb25zdGFudHMuYyBiL2RyaXZlcnMvc2NzaS9jb25zdGFudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjI1ZmRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2NvbnN0YW50cy5jCkBAIC0wLDAgKzEsMTQ0OCBAQAorLyogCisgKiBBU0NJSSB2YWx1ZXMgZm9yIGEgbnVtYmVyIG9mIHN5bWJvbGljIGNvbnN0YW50cywgcHJpbnRpbmcgZnVuY3Rpb25zLAorICogZXRjLgorICogQWRkaXRpb25zIGZvciBTQ1NJIDIgYW5kIExpbnV4IDIuMi54IGJ5IEQuIEdpbGJlcnQgKDk5MDQyMikKKyAqIEFkZGl0aW9ucyBmb3IgU0NTSSAzKyAoU1BDLTMgVDEwLzE0MTYtRCBSZXYgMDcgMyBNYXkgMjAwMikKKyAqICAgYnkgRC4gR2lsYmVydCBhbmQgYWViICgyMDAyMDYwOSkKKyAqIEFkZGl0aW9ucyBmb3IgU1BDLTMgVDEwLzE0MTYtRCBSZXYgMjEgMjIgU2VwdCAyMDA0LCBELiBHaWxiZXJ0IDIwMDQxMDI1CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3JlcXVlc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KKworCisKKy8qIENvbW1hbmRzIHdpdGggc2VydmljZSBhY3Rpb25zIHRoYXQgY2hhbmdlIHRoZSBjb21tYW5kIG5hbWUgKi8KKyNkZWZpbmUgTUFJTlRFTkFOQ0VfSU4gMHhhMworI2RlZmluZSBNQUlOVEVOQU5DRV9PVVQgMHhhNAorI2RlZmluZSBTRVJWSUNFX0FDVElPTl9JTl8xMiAweGFiCisjZGVmaW5lIFNFUlZJQ0VfQUNUSU9OX09VVF8xMiAweGE5CisjZGVmaW5lIFNFUlZJQ0VfQUNUSU9OX0lOXzE2IDB4OWUKKyNkZWZpbmUgU0VSVklDRV9BQ1RJT05fT1VUXzE2IDB4OWYKKyNkZWZpbmUgVkFSSUFCTEVfTEVOR1RIX0NNRCAweDdmCisKKworCisjaWZkZWYgQ09ORklHX1NDU0lfQ09OU1RBTlRTCitzdGF0aWMgY29uc3QgY2hhciAqIGNkYl9ieXRlMF9uYW1lc1tdID0geworLyogMDAtMDMgKi8gIlRlc3QgVW5pdCBSZWFkeSIsICJSZXplcm8gVW5pdC9SZXdpbmQiLCBOVUxMLCAiUmVxdWVzdCBTZW5zZSIsCisvKiAwNC0wNyAqLyAiRm9ybWF0IFVuaXQvTWVkaXVtIiwgIlJlYWQgQmxvY2sgTGltaXRzIiwgTlVMTCwKKwkgICAgIlJlYXNzc2lnbiBCbG9ja3MiLAorLyogMDgtMGQgKi8gIlJlYWQgKDYpIiwgTlVMTCwgIldyaXRlICg2KSIsICJTZWVrICg2KSIsIE5VTEwsIE5VTEwsCisvKiAwZS0xMiAqLyBOVUxMLCAiUmVhZCBSZXZlcnNlIiwgIldyaXRlIEZpbGVtYXJrcyIsICJTcGFjZSIsICJJbnF1aXJ5IiwgIAorLyogMTMtMTYgKi8gIlZlcmlmeSAoNikiLCAiUmVjb3ZlciBCdWZmZXJlZCBEYXRhIiwgIk1vZGUgU2VsZWN0ICg2KSIsCisJICAgICJSZXNlcnZlICg2KSIsCisvKiAxNy0xYSAqLyAiUmVsZWFzZSAoNikiLCAiQ29weSIsICJFcmFzZSIsICJNb2RlIFNlbnNlICg2KSIsIAorLyogMWItMWQgKi8gIlN0YXJ0L1N0b3AgVW5pdCIsICJSZWNlaXZlIERpYWdub3N0aWMiLCAiU2VuZCBEaWFnbm9zdGljIiwgCisvKiAxZS0xZiAqLyAiUHJldmVudC9BbGxvdyBNZWRpdW0gUmVtb3ZhbCIsIE5VTEwsCisvKiAyMC0yMiAqLyAgTlVMTCwgTlVMTCwgTlVMTCwKKy8qIDIzLTI4ICovICJSZWFkIEZvcm1hdCBDYXBhY2l0aWVzIiwgIlNldCBXaW5kb3ciLAorCSAgICAiUmVhZCBDYXBhY2l0eSAoMTApIiwgTlVMTCwgTlVMTCwgIlJlYWQgKDEwKSIsIAorLyogMjktMmQgKi8gIlJlYWQgR2VuZXJhdGlvbiIsICJXcml0ZSAoMTApIiwgIlNlZWsgKDEwKSIsICJFcmFzZSAoMTApIiwgCisgICAgICAgICAgICAiUmVhZCB1cGRhdGVkIGJsb2NrIiwgCisvKiAyZS0zMSAqLyAiV3JpdGUgVmVyaWZ5ICgxMCkiLCAiVmVyaWZ5ICgxMCkiLCAiU2VhcmNoIEhpZ2giLCAiU2VhcmNoIEVxdWFsIiwgCisvKiAzMi0zNCAqLyAiU2VhcmNoIExvdyIsICJTZXQgTGltaXRzIiwgIlByZWZldGNoL1JlYWQgUG9zaXRpb24iLCAKKy8qIDM1LTM3ICovICJTeW5jaHJvbml6ZSBDYWNoZSAoMTApIiwgIkxvY2svVW5sb2NrIENhY2hlICgxMCkiLAorCSAgICAiUmVhZCBEZWZlY3QgRGF0YSgxMCkiLCAKKy8qIDM4LTNjICovICJNZWRpdW0gU2NhbiIsICJDb21wYXJlIiwgIkNvcHkgVmVyaWZ5IiwgIldyaXRlIEJ1ZmZlciIsIAorICAgICAgICAgICAgIlJlYWQgQnVmZmVyIiwgCisvKiAzZC0zZiAqLyAiVXBkYXRlIEJsb2NrIiwgIlJlYWQgTG9uZyAoMTApIiwgICJXcml0ZSBMb25nICgxMCkiLAorLyogNDAtNDEgKi8gIkNoYW5nZSBEZWZpbml0aW9uIiwgIldyaXRlIFNhbWUgKDEwKSIsCisvKiA0Mi00OCAqLyAiUmVhZCBzdWItY2hhbm5lbCIsICJSZWFkIFRPQy9QTUEvQVRJUCIsICJSZWFkIGRlbnNpdHkgc3VwcG9ydCIsCisgICAgICAgICAgICAiUGxheSBhdWRpbyAoMTApIiwgIkdldCBjb25maWd1cmF0aW9uIiwgIlBsYXkgYXVkaW8gbXNmIiwKKyAgICAgICAgICAgICJQbGF5IGF1ZGlvIHRyYWNrL2luZGV4IiwKKy8qIDQ5LTRmICovICJQbGF5IHRyYWNrIHJlbGF0aXZlICgxMCkiLCAiR2V0IGV2ZW50IHN0YXR1cyBub3RpZmljYXRpb24iLAorICAgICAgICAgICAgIlBhdXNlL3Jlc3VtZSIsICJMb2cgU2VsZWN0IiwgIkxvZyBTZW5zZSIsICJTdG9wIHBsYXkvc2NhbiIsCisgICAgICAgICAgICBOVUxMLAorLyogNTAtNTUgKi8gIlhkd3JpdGUiLCAiWHB3cml0ZSwgUmVhZCBkaXNrIGluZm8iLCAiWGRyZWFkLCBSZWFkIHRyYWNrIGluZm8iLAorICAgICAgICAgICAgIlJlc2VydmUgdHJhY2siLCAiU2VuZCBPUEMgaW5mbyIsICJNb2RlIFNlbGVjdCAoMTApIiwKKy8qIDU2LTViICovICJSZXNlcnZlICgxMCkiLCAiUmVsZWFzZSAoMTApIiwgIlJlcGFpciB0cmFjayIsICJSZWFkIG1hc3RlciBjdWUiLAorICAgICAgICAgICAgIk1vZGUgU2Vuc2UgKDEwKSIsICJDbG9zZSB0cmFjay9zZXNzaW9uIiwKKy8qIDVjLTVmICovICJSZWFkIGJ1ZmZlciBjYXBhY2l0eSIsICJTZW5kIGN1ZSBzaGVldCIsICJQZXJzaXN0ZW50IHJlc2VydmUgaW4iLAorICAgICAgICAgICAgIlBlcnNpc3RlbnQgcmVzZXJ2ZSBvdXQiLAorLyogNjAtNjcgKi8gTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKy8qIDY4LTZmICovIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisvKiA3MC03NyAqLyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorLyogNzgtN2YgKi8gTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgIlZhcmlhYmxlIGxlbmd0aCIsCisvKiA4MC04NCAqLyAiWGR3cml0ZSAoMTYpIiwgIlJlYnVpbGQgKDE2KSIsICJSZWdlbmVyYXRlICgxNikiLCAiRXh0ZW5kZWQgY29weSIsCisgICAgICAgICAgICAiUmVjZWl2ZSBjb3B5IHJlc3VsdHMiLAorLyogODUtODkgKi8gIk1lbW9yeSBFeHBvcnQgSW4gKDE2KSIsICJBY2Nlc3MgY29udHJvbCBpbiIsICJBY2Nlc3MgY29udHJvbCBvdXQiLAorICAgICAgICAgICAgIlJlYWQgKDE2KSIsICJNZW1vcnkgRXhwb3J0IE91dCAoMTYpIiwKKy8qIDhhLThmICovICJXcml0ZSAoMTYpIiwgTlVMTCwgIlJlYWQgYXR0cmlidXRlcyIsICJXcml0ZSBhdHRyaWJ1dGVzIiwKKyAgICAgICAgICAgICJXcml0ZSBhbmQgdmVyaWZ5ICgxNikiLCAiVmVyaWZ5ICgxNikiLAorLyogOTAtOTQgKi8gIlByZS1mZXRjaCAoMTYpIiwgIlN5bmNocm9uaXplIGNhY2hlICgxNikiLAorICAgICAgICAgICAgIkxvY2svdW5sb2NrIGNhY2hlICgxNikiLCAiV3JpdGUgc2FtZSAoMTYpIiwgTlVMTCwKKy8qIDk1LTk5ICovIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisvKiA5YS05ZiAqLyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAiU2VydmljZSBhY3Rpb24gaW4gKDE2KSIsCisgICAgICAgICAgICAiU2VydmljZSBhY3Rpb24gb3V0ICgxNikiLAorLyogYTAtYTUgKi8gIlJlcG9ydCBsdW5zIiwgIkJsYW5rIiwgIlNlbmQgZXZlbnQiLCAiTWFpbnRlbmFuY2UgaW4iLAorICAgICAgICAgICAgIk1haW50ZW5hbmNlIG91dCIsICJNb3ZlIG1lZGl1bS9wbGF5IGF1ZGlvKDEyKSIsCisvKiBhNi1hOSAqLyAiRXhjaGFuZ2UgbWVkaXVtIiwgIk1vdmUgbWVkaXVtIGF0dGFjaGVkIiwgIlJlYWQoMTIpIiwKKyAgICAgICAgICAgICJQbGF5IHRyYWNrIHJlbGF0aXZlKDEyKSIsCisvKiBhYS1hZSAqLyAiV3JpdGUoMTIpIiwgTlVMTCwgIkVyYXNlKDEyKSwgR2V0IFBlcmZvcm1hbmNlIiwKKyAgICAgICAgICAgICJSZWFkIERWRCBzdHJ1Y3R1cmUiLCAiV3JpdGUgYW5kIHZlcmlmeSgxMikiLAorLyogYWYtYjEgKi8gIlZlcmlmeSgxMikiLCAiU2VhcmNoIGRhdGEgaGlnaCgxMikiLCAiU2VhcmNoIGRhdGEgZXF1YWwoMTIpIiwKKy8qIGIyLWI0ICovICJTZWFyY2ggZGF0YSBsb3coMTIpIiwgIlNldCBsaW1pdHMoMTIpIiwKKyAgICAgICAgICAgICJSZWFkIGVsZW1lbnQgc3RhdHVzIGF0dGFjaGVkIiwKKy8qIGI1LWI2ICovICJSZXF1ZXN0IHZvbHVtZSBlbGVtZW50IGFkZHJlc3MiLCAiU2VuZCB2b2x1bWUgdGFnLCBzZXQgc3RyZWFtaW5nIiwKKy8qIGI3LWI5ICovICJSZWFkIGRlZmVjdCBkYXRhKDEyKSIsICJSZWFkIGVsZW1lbnQgc3RhdHVzIiwgIlJlYWQgQ0QgbXNmIiwKKy8qIGJhLWJjICovICJSZWR1bmRhbmN5IGdyb3VwIChpbiksIFNjYW4iLAorICAgICAgICAgICAgIlJlZHVuZGFuY3kgZ3JvdXAgKG91dCksIFNldCBjZC1yb20gc3BlZWQiLCAiU3BhcmUgaW4sIFBsYXkgY2QiLAorLyogYmQtYmYgKi8gIlNwYXJlIG91dCwgTWVjaGFuaXNtIHN0YXR1cyIsICJWb2x1bWUgc2V0IGluLCBSZWFkIGNkIiwKKyAgICAgICAgICAgICJWb2x1bWUgc2V0IG91dCwgU2VuZCBEVkQgc3RydWN0dXJlIiwKK307CisKK3N0cnVjdCB2YWx1ZV9uYW1lX3BhaXIgeworCWludCB2YWx1ZTsKKwljb25zdCBjaGFyICogbmFtZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfbmFtZV9wYWlyIG1haW50X2luX2FycltdID0geworCXsweDUsICJSZXBvcnQgZGV2aWNlIGlkZW50aWZpZXIifSwKKwl7MHhhLCAiUmVwb3J0IHRhcmdldCBwb3J0IGdyb3VwcyJ9LAorCXsweGIsICJSZXBvcnQgYWxpYXNlcyJ9LAorCXsweGMsICJSZXBvcnQgc3VwcG9ydGVkIG9wZXJhdGlvbiBjb2RlcyJ9LAorCXsweGQsICJSZXBvcnQgc3VwcG9ydGVkIHRhc2sgbWFuYWdlbWVudCBmdW5jdGlvbnMifSwKKwl7MHhlLCAiUmVwb3J0IHByaW9yaXR5In0sCit9OworI2RlZmluZSBNQUlOVF9JTl9TWiBcCisgICAgICAgIChpbnQpKHNpemVvZihtYWludF9pbl9hcnIpIC8gc2l6ZW9mKG1haW50X2luX2FyclswXSkpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfbmFtZV9wYWlyIG1haW50X291dF9hcnJbXSA9IHsKKwl7MHg2LCAiU2V0IGRldmljZSBpZGVudGlmaWVyIn0sCisJezB4YSwgIlNldCB0YXJnZXQgcG9ydCBncm91cHMifSwKKwl7MHhiLCAiQ2hhbmdlIGFsaWFzZXMifSwKKwl7MHhlLCAiU2V0IHByaW9yaXR5In0sCit9OworI2RlZmluZSBNQUlOVF9PVVRfU1ogXAorICAgICAgICAoaW50KShzaXplb2YobWFpbnRfb3V0X2FycikgLyBzaXplb2YobWFpbnRfb3V0X2FyclswXSkpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfbmFtZV9wYWlyIHNlcnZfaW4xMl9hcnJbXSA9IHsKKwl7MHgxLCAiUmVhZCBtZWRpYSBzZXJpYWwgbnVtYmVyIn0sCit9OworI2RlZmluZSBTRVJWX0lOMTJfU1ogIFwKKyAgICAgICAgKGludCkoc2l6ZW9mKHNlcnZfaW4xMl9hcnIpIC8gc2l6ZW9mKHNlcnZfaW4xMl9hcnJbMF0pKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX25hbWVfcGFpciBzZXJ2X291dDEyX2FycltdID0geworCXstMSwgImR1bW15IGVudHJ5In0sCit9OworI2RlZmluZSBTRVJWX09VVDEyX1NaIFwKKyAgICAgICAgKGludCkoc2l6ZW9mKHNlcnZfb3V0MTJfYXJyKSAvIHNpemVvZihzZXJ2X2luMTJfYXJyWzBdKSkKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9uYW1lX3BhaXIgc2Vydl9pbjE2X2FycltdID0geworCXsweDEwLCAiUmVhZCBjYXBhY2l0eSgxNikifSwKKwl7MHgxMSwgIlJlYWQgbG9uZygxNikifSwKK307CisjZGVmaW5lIFNFUlZfSU4xNl9TWiAgXAorICAgICAgICAoaW50KShzaXplb2Yoc2Vydl9pbjE2X2FycikgLyBzaXplb2Yoc2Vydl9pbjE2X2FyclswXSkpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfbmFtZV9wYWlyIHNlcnZfb3V0MTZfYXJyW10gPSB7CisJezB4MTEsICJXcml0ZSBsb25nKDE2KSJ9LAorCXsweDFmLCAiTm90aWZ5IGRhdGEgdHJhbnNmZXIgZGV2aWNlKDE2KSJ9LAorfTsKKyNkZWZpbmUgU0VSVl9PVVQxNl9TWiBcCisgICAgICAgIChpbnQpKHNpemVvZihzZXJ2X291dDE2X2FycikgLyBzaXplb2Yoc2Vydl9pbjE2X2FyclswXSkpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfbmFtZV9wYWlyIHZhcmlhYmxlX2xlbmd0aF9hcnJbXSA9IHsKKwl7MHgxLCAiUmVidWlsZCgzMikifSwKKwl7MHgyLCAiUmVnZW5lcmF0ZSgzMikifSwKKwl7MHgzLCAiWGRyZWFkKDMyKSJ9LAorCXsweDQsICJYZHdyaXRlKDMyKSJ9LAorCXsweDUsICJYZHdyaXRlIGV4dGVuZGVkKDMyKSJ9LAorCXsweDYsICJYcHdyaXRlKDMyKSJ9LAorCXsweDcsICJYZHdyaXRlcmVhZCgzMikifSwKKwl7MHg4LCAiWGR3cml0ZSBleHRlbmRlZCg2NCkifSwKKwl7MHg5LCAiUmVhZCgzMikifSwKKwl7MHhhLCAiVmVyaWZ5KDMyKSJ9LAorCXsweGIsICJXcml0ZSgzMikifSwKKwl7MHhjLCAiV3JpdGUgYW4gdmVyaWZ5KDMyKSJ9LAorCXsweGQsICJXcml0ZSBzYW1lKDMyKSJ9LAorCXsweDg4MDEsICJGb3JtYXQgT1NEIn0sCisJezB4ODgwMiwgIkNyZWF0ZSAob3NkKSJ9LAorCXsweDg4MDMsICJMaXN0IChvc2QpIn0sCisJezB4ODgwNSwgIlJlYWQgKG9zZCkifSwKKwl7MHg4ODA2LCAiV3JpdGUgKG9zZCkifSwKKwl7MHg4ODA3LCAiQXBwZW5kIChvc2QpIn0sCisJezB4ODgwOCwgIkZsdXNoIChvc2QpIn0sCisJezB4ODgwYSwgIlJlbW92ZSAob3NkKSJ9LAorCXsweDg4MGIsICJDcmVhdGUgcGFydGl0aW9uIChvc2QpIn0sCisJezB4ODgwYywgIlJlbW92ZSBwYXJ0aXRpb24gKG9zZCkifSwKKwl7MHg4ODBlLCAiR2V0IGF0dHJpYnV0ZXMgKG9zZCkifSwKKwl7MHg4ODBmLCAiU2V0IGF0dHJpYnV0ZXMgKG9zZCkifSwKKwl7MHg4ODEyLCAiQ3JlYXRlIGFuZCB3cml0ZSAob3NkKSJ9LAorCXsweDg4MTUsICJDcmVhdGUgY29sbGVjdGlvbiAob3NkKSJ9LAorCXsweDg4MTYsICJSZW1vdmUgY29sbGVjdGlvbiAob3NkKSJ9LAorCXsweDg4MTcsICJMaXN0IGNvbGxlY3Rpb24gKG9zZCkifSwKKwl7MHg4ODE4LCAiU2V0IGtleSAob3NkKSJ9LAorCXsweDg4MTksICJTZXQgbWFzdGVyIGtleSAob3NkKSJ9LAorCXsweDg4MWEsICJGbHVzaCBjb2xsZWN0aW9uIChvc2QpIn0sCisJezB4ODgxYiwgIkZsdXNoIHBhcnRpdGlvbiAob3NkKSJ9LAorCXsweDg4MWMsICJGbHVzaCBPU0QifSwKKwl7MHg4ZjdlLCAiUGVyZm9ybSBTQ1NJIGNvbW1hbmQgKG9zZCkifSwKKwl7MHg4ZjdmLCAiUGVyZm9ybSB0YXNrIG1hbmFnZW1lbnQgZnVuY3Rpb24gKG9zZCkifSwKK307CisjZGVmaW5lIFZBUklBQkxFX0xFTkdUSF9TWiBcCisgICAgICAgIChpbnQpKHNpemVvZih2YXJpYWJsZV9sZW5ndGhfYXJyKSAvIHNpemVvZih2YXJpYWJsZV9sZW5ndGhfYXJyWzBdKSkKKworc3RhdGljIGNvbnN0IGNoYXIgKiBnZXRfc2FfbmFtZShjb25zdCBzdHJ1Y3QgdmFsdWVfbmFtZV9wYWlyICogYXJyLAorCQkJICAgICAgICBpbnQgYXJyX3N6LCBpbnQgc2VydmljZV9hY3Rpb24pCit7CisJaW50IGs7CisKKwlmb3IgKGsgPSAwOyBrIDwgYXJyX3N6OyArK2ssICsrYXJyKSB7CisJCWlmIChzZXJ2aWNlX2FjdGlvbiA9PSBhcnItPnZhbHVlKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAoayA8IGFycl9zeikgPyBhcnItPm5hbWUgOiBOVUxMOworfQorCisvKiBhdHRlbXB0IHRvIGd1ZXNzIGNkYiBsZW5ndGggaWYgY2RiX2xlbj09MCAuIE5vIHRyYWlsaW5nIGxpbmVmZWVkLiAqLworc3RhdGljIHZvaWQgcHJpbnRfb3Bjb2RlX25hbWUodW5zaWduZWQgY2hhciAqIGNkYnAsIGludCBjZGJfbGVuLAorCQkJICAgICAgaW50IHN0YXJ0X29mX2xpbmUpCit7CisJaW50IHNhLCBsZW4sIGNkYjA7CisJY29uc3QgY2hhciAqIG5hbWU7CisJY29uc3QgY2hhciAqIGxlYWRpbiA9IHN0YXJ0X29mX2xpbmUgPyBLRVJOX0lORk8gOiAiIjsKKworCWNkYjAgPSBjZGJwWzBdOworCXN3aXRjaChjZGIwKSB7CisJY2FzZSBWQVJJQUJMRV9MRU5HVEhfQ01EOgorCQlsZW4gPSBjZGJwWzddICsgODsKKwkJaWYgKGxlbiA8IDEwKSB7CisJCQlwcmludGsoIiVzc2hvcnQgdmFyaWFibGUgbGVuZ3RoIGNvbW1hbmQsICIKKwkJCSAgICAgICAibGVuPSVkIGV4dF9sZW49JWQiLCBsZWFkaW4sIGxlbiwgY2RiX2xlbik7CisJCQlicmVhazsKKwkJfQorCQlzYSA9IChjZGJwWzhdIDw8IDgpICsgY2RicFs5XTsKKwkJbmFtZSA9IGdldF9zYV9uYW1lKG1haW50X2luX2FyciwgTUFJTlRfSU5fU1osIHNhKTsKKwkJaWYgKG5hbWUpIHsKKwkJCXByaW50aygiJXMlcyIsIGxlYWRpbiwgbmFtZSk7CisJCQlpZiAoKGNkYl9sZW4gPiAwKSAmJiAobGVuICE9IGNkYl9sZW4pKQorCQkJCXByaW50aygiLCBpbl9jZGJfbGVuPSVkLCBleHRfbGVuPSVkIiwKKwkJCQkgICAgICAgbGVuLCBjZGJfbGVuKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50aygiJXNjZGJbMF09MHgleCwgc2E9MHgleCIsIGxlYWRpbiwgY2RiMCwgc2EpOworCQkJaWYgKChjZGJfbGVuID4gMCkgJiYgKGxlbiAhPSBjZGJfbGVuKSkKKwkJCQlwcmludGsoIiwgaW5fY2RiX2xlbj0lZCwgZXh0X2xlbj0lZCIsCisJCQkJICAgICAgIGxlbiwgY2RiX2xlbik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBNQUlOVEVOQU5DRV9JTjoKKwkJc2EgPSBjZGJwWzFdICYgMHgxZjsKKwkJbmFtZSA9IGdldF9zYV9uYW1lKG1haW50X2luX2FyciwgTUFJTlRfSU5fU1osIHNhKTsKKwkJaWYgKG5hbWUpCisJCQlwcmludGsoIiVzJXMiLCBsZWFkaW4sIG5hbWUpOworCQllbHNlCisJCQlwcmludGsoIiVzY2RiWzBdPTB4JXgsIHNhPTB4JXgiLCBsZWFkaW4sIGNkYjAsIHNhKTsKKwkJYnJlYWs7CisJY2FzZSBNQUlOVEVOQU5DRV9PVVQ6CisJCXNhID0gY2RicFsxXSAmIDB4MWY7CisJCW5hbWUgPSBnZXRfc2FfbmFtZShtYWludF9vdXRfYXJyLCBNQUlOVF9PVVRfU1osIHNhKTsKKwkJaWYgKG5hbWUpCisJCQlwcmludGsoIiVzJXMiLCBsZWFkaW4sIG5hbWUpOworCQllbHNlCisJCQlwcmludGsoIiVzY2RiWzBdPTB4JXgsIHNhPTB4JXgiLCBsZWFkaW4sIGNkYjAsIHNhKTsKKwkJYnJlYWs7CisJY2FzZSBTRVJWSUNFX0FDVElPTl9JTl8xMjoKKwkJc2EgPSBjZGJwWzFdICYgMHgxZjsKKwkJbmFtZSA9IGdldF9zYV9uYW1lKHNlcnZfaW4xMl9hcnIsIFNFUlZfSU4xMl9TWiwgc2EpOworCQlpZiAobmFtZSkKKwkJCXByaW50aygiJXMlcyIsIGxlYWRpbiwgbmFtZSk7CisJCWVsc2UKKwkJCXByaW50aygiJXNjZGJbMF09MHgleCwgc2E9MHgleCIsIGxlYWRpbiwgY2RiMCwgc2EpOworCQlicmVhazsKKwljYXNlIFNFUlZJQ0VfQUNUSU9OX09VVF8xMjoKKwkJc2EgPSBjZGJwWzFdICYgMHgxZjsKKwkJbmFtZSA9IGdldF9zYV9uYW1lKHNlcnZfb3V0MTJfYXJyLCBTRVJWX09VVDEyX1NaLCBzYSk7CisJCWlmIChuYW1lKQorCQkJcHJpbnRrKCIlcyVzIiwgbGVhZGluLCBuYW1lKTsKKwkJZWxzZQorCQkJcHJpbnRrKCIlc2NkYlswXT0weCV4LCBzYT0weCV4IiwgbGVhZGluLCBjZGIwLCBzYSk7CisJCWJyZWFrOworCWNhc2UgU0VSVklDRV9BQ1RJT05fSU5fMTY6CisJCXNhID0gY2RicFsxXSAmIDB4MWY7CisJCW5hbWUgPSBnZXRfc2FfbmFtZShzZXJ2X2luMTZfYXJyLCBTRVJWX0lOMTZfU1osIHNhKTsKKwkJaWYgKG5hbWUpCisJCQlwcmludGsoIiVzJXMiLCBsZWFkaW4sIG5hbWUpOworCQllbHNlCisJCQlwcmludGsoIiVzY2RiWzBdPTB4JXgsIHNhPTB4JXgiLCBsZWFkaW4sIGNkYjAsIHNhKTsKKwkJYnJlYWs7CisJY2FzZSBTRVJWSUNFX0FDVElPTl9PVVRfMTY6CisJCXNhID0gY2RicFsxXSAmIDB4MWY7CisJCW5hbWUgPSBnZXRfc2FfbmFtZShzZXJ2X291dDE2X2FyciwgU0VSVl9PVVQxNl9TWiwgc2EpOworCQlpZiAobmFtZSkKKwkJCXByaW50aygiJXMlcyIsIGxlYWRpbiwgbmFtZSk7CisJCWVsc2UKKwkJCXByaW50aygiJXNjZGJbMF09MHgleCwgc2E9MHgleCIsIGxlYWRpbiwgY2RiMCwgc2EpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoY2RiMCA8IDB4YzApIHsKKwkJCW5hbWUgPSBjZGJfYnl0ZTBfbmFtZXNbY2RiMF07CisJCQlpZiAobmFtZSkKKwkJCQlwcmludGsoIiVzJXMiLCBsZWFkaW4sIG5hbWUpOworCQkJZWxzZQorCQkJCXByaW50aygiJXNjZGJbMF09MHgleCAocmVzZXJ2ZWQpIiwKKwkJCQkgICAgICAgbGVhZGluLCBjZGIwKTsKKwkJfSBlbHNlCisJCQlwcmludGsoIiVzY2RiWzBdPTB4JXggKHZlbmRvcikiLCBsZWFkaW4sIGNkYjApOworCQlicmVhazsKKwl9Cit9CisKKyNlbHNlIC8qIGlmbmRlZiBDT05GSUdfU0NTSV9DT05TVEFOVFMgKi8KKworc3RhdGljIHZvaWQgcHJpbnRfb3Bjb2RlX25hbWUodW5zaWduZWQgY2hhciAqIGNkYnAsIGludCBjZGJfbGVuLAorCQkJICAgICAgaW50IHN0YXJ0X29mX2xpbmUpCit7CisJaW50IHNhLCBsZW4sIGNkYjA7CisJY29uc3QgY2hhciAqIGxlYWRpbiA9IHN0YXJ0X29mX2xpbmUgPyBLRVJOX0lORk8gOiAiIjsKKworCWNkYjAgPSBjZGJwWzBdOworCXN3aXRjaChjZGIwKSB7CisJY2FzZSBWQVJJQUJMRV9MRU5HVEhfQ01EOgorCQlsZW4gPSBjZGJwWzddICsgODsKKwkJaWYgKGxlbiA8IDEwKSB7CisJCQlwcmludGsoIiVzc2hvcnQgb3Bjb2RlPTB4JXggY29tbWFuZCwgbGVuPSVkICIKKwkJCSAgICAgICAiZXh0X2xlbj0lZCIsIGxlYWRpbiwgY2RiMCwgbGVuLCBjZGJfbGVuKTsKKwkJCWJyZWFrOworCQl9CisJCXNhID0gKGNkYnBbOF0gPDwgOCkgKyBjZGJwWzldOworCQlwcmludGsoIiVzY2RiWzBdPTB4JXgsIHNhPTB4JXgiLCBsZWFkaW4sIGNkYjAsIHNhKTsKKwkJaWYgKGxlbiAhPSBjZGJfbGVuKQorCQkJcHJpbnRrKCIsIGluX2NkYl9sZW49JWQsIGV4dF9sZW49JWQiLCBsZW4sIGNkYl9sZW4pOworCQlicmVhazsKKwljYXNlIE1BSU5URU5BTkNFX0lOOgorCWNhc2UgTUFJTlRFTkFOQ0VfT1VUOgorCWNhc2UgU0VSVklDRV9BQ1RJT05fSU5fMTI6CisJY2FzZSBTRVJWSUNFX0FDVElPTl9PVVRfMTI6CisJY2FzZSBTRVJWSUNFX0FDVElPTl9JTl8xNjoKKwljYXNlIFNFUlZJQ0VfQUNUSU9OX09VVF8xNjoKKwkJc2EgPSBjZGJwWzFdICYgMHgxZjsKKwkJcHJpbnRrKCIlc2NkYlswXT0weCV4LCBzYT0weCV4IiwgbGVhZGluLCBjZGIwLCBzYSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChjZGIwIDwgMHhjMCkKKwkJCXByaW50aygiJXNjZGJbMF09MHgleCIsIGxlYWRpbiwgY2RiMCk7CisJCWVsc2UKKwkJCXByaW50aygiJXNjZGJbMF09MHgleCAodmVuZG9yKSIsIGxlYWRpbiwgY2RiMCk7CisJCWJyZWFrOworCX0KK30KKyNlbmRpZiAgCisKK3ZvaWQgX19zY3NpX3ByaW50X2NvbW1hbmQodW5zaWduZWQgY2hhciAqY29tbWFuZCkKK3sKKwlpbnQgaywgbGVuOworCisJcHJpbnRfb3Bjb2RlX25hbWUoY29tbWFuZCwgMCwgMSk7CisJaWYgKFZBUklBQkxFX0xFTkdUSF9DTUQgPT0gY29tbWFuZFswXSkKKwkJbGVuID0gY29tbWFuZFs3XSArIDg7CisJZWxzZQorCQlsZW4gPSBDT01NQU5EX1NJWkUoY29tbWFuZFswXSk7CisJLyogcHJpbnQgb3V0IGFsbCBieXRlcyBpbiBjZGIgKi8KKwlmb3IgKGsgPSAwOyBrIDwgbGVuOyArK2spIAorCQlwcmludGsoIiAlMDJ4IiwgY29tbWFuZFtrXSk7CisJcHJpbnRrKCJcbiIpOworfQorRVhQT1JUX1NZTUJPTChfX3Njc2lfcHJpbnRfY29tbWFuZCk7CisKKy8qIFRoaXMgZnVuY3Rpb24gKHBlcmhhcHMgd2l0aCB0aGUgYWRkaXRpb24gb2YgcGVyaXBoZXJhbCBkZXZpY2UgdHlwZSkKKyAqIGlzIG1vcmUgYXBwcm9yaWF0ZSB0aGFuIF9fc2NzaV9wcmludF9jb21tYW5kKCkuIFBlcmhhcHMgdGhhdCBzdGF0aWMKKyAqIGNhbiBiZSBkcm9wcGVkIGxhdGVyIGlmIGl0IHJlcGxhY2VzIHRoZSBfX3Njc2lfcHJpbnRfY29tbWFuZCB2ZXJzaW9uLgorICovCitzdGF0aWMgdm9pZCBzY3NpX3ByaW50X2NkYih1bnNpZ25lZCBjaGFyICpjZGIsIGludCBjZGJfbGVuLCBpbnQgc3RhcnRfb2ZfbGluZSkKK3sKKwlpbnQgazsKKworCXByaW50X29wY29kZV9uYW1lKGNkYiwgY2RiX2xlbiwgc3RhcnRfb2ZfbGluZSk7CisJLyogcHJpbnQgb3V0IGFsbCBieXRlcyBpbiBjZGIgKi8KKwlwcmludGsoIjoiKTsKKwlmb3IgKGsgPSAwOyBrIDwgY2RiX2xlbjsgKytrKSAKKwkJcHJpbnRrKCIgJTAyeCIsIGNkYltrXSk7CisJcHJpbnRrKCJcbiIpOworfQorCisvKioKKyAqCisgKglwcmludF9zdGF0dXMgLSBwcmludCBzY3NpIHN0YXR1cyBkZXNjcmlwdGlvbgorICoJQHNjc2lfc3RhdHVzOiBzY3NpIHN0YXR1cyB2YWx1ZQorICoKKyAqCUlmIHRoZSBzdGF0dXMgaXMgcmVjb2duaXplZCwgdGhlIGRlc2NyaXB0aW9uIGlzIHByaW50ZWQuCisgKglPdGhlcndpc2UgIlVua25vd24gc3RhdHVzIiBpcyBvdXRwdXQuIE5vIHRyYWlsaW5nIHNwYWNlLgorICoJSWYgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQsIHRoZW4gcHJpbnQgc3RhdHVzIGluIGhleAorICoJKGUuZy4gIjB4MiIgZm9yIENoZWNrIENvbmRpdGlvbikuCisgKiovCit2b2lkCitzY3NpX3ByaW50X3N0YXR1cyh1bnNpZ25lZCBjaGFyIHNjc2lfc3RhdHVzKSB7CisjaWZkZWYgQ09ORklHX1NDU0lfQ09OU1RBTlRTCisJY29uc3QgY2hhciAqIGNjcDsKKworCXN3aXRjaCAoc2NzaV9zdGF0dXMpIHsKKwljYXNlIDA6ICAgIGNjcCA9ICJHb29kIjsgYnJlYWs7CisJY2FzZSAweDI6ICBjY3AgPSAiQ2hlY2sgQ29uZGl0aW9uIjsgYnJlYWs7CisJY2FzZSAweDQ6ICBjY3AgPSAiQ29uZGl0aW9uIE1ldCI7IGJyZWFrOworCWNhc2UgMHg4OiAgY2NwID0gIkJ1c3kiOyBicmVhazsKKwljYXNlIDB4MTA6IGNjcCA9ICJJbnRlcm1lZGlhdGUiOyBicmVhazsKKwljYXNlIDB4MTQ6IGNjcCA9ICJJbnRlcm1lZGlhdGUtQ29uZGl0aW9uIE1ldCI7IGJyZWFrOworCWNhc2UgMHgxODogY2NwID0gIlJlc2VydmF0aW9uIENvbmZsaWN0IjsgYnJlYWs7CisJY2FzZSAweDIyOiBjY3AgPSAiQ29tbWFuZCBUZXJtaW5hdGVkIjsgYnJlYWs7CS8qIG9ic29sZXRlICovCisJY2FzZSAweDI4OiBjY3AgPSAiVGFzayBzZXQgRnVsbCI7IGJyZWFrOwkvKiB3YXM6IFF1ZXVlIEZ1bGwgKi8KKwljYXNlIDB4MzA6IGNjcCA9ICJBQ0EgQWN0aXZlIjsgYnJlYWs7CisJY2FzZSAweDQwOiBjY3AgPSAiVGFzayBBYm9ydGVkIjsgYnJlYWs7CisJZGVmYXVsdDogICBjY3AgPSAiVW5rbm93biBzdGF0dXMiOworCX0KKwlwcmludGsoS0VSTl9JTkZPICIlcyIsIGNjcCk7CisjZWxzZQorCXByaW50ayhLRVJOX0lORk8gIjB4JTB4Iiwgc2NzaV9zdGF0dXMpOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKHNjc2lfcHJpbnRfc3RhdHVzKTsKKworI2lmZGVmIENPTkZJR19TQ1NJX0NPTlNUQU5UUworCitzdHJ1Y3QgZXJyb3JfaW5mbyB7CisJdW5zaWduZWQgc2hvcnQgY29kZTEyOwkvKiAweDAzMDIgbG9va3MgYmV0dGVyIHRoYW4gMHgwMywweDAyICovCisJY29uc3QgY2hhciAqIHRleHQ7Cit9OworCitzdGF0aWMgc3RydWN0IGVycm9yX2luZm8gYWRkaXRpb25hbFtdID0KK3sKKwl7MHgwMDAwLCAiTm8gYWRkaXRpb25hbCBzZW5zZSBpbmZvcm1hdGlvbiJ9LAorCXsweDAwMDEsICJGaWxlbWFyayBkZXRlY3RlZCJ9LAorCXsweDAwMDIsICJFbmQtb2YtcGFydGl0aW9uL21lZGl1bSBkZXRlY3RlZCJ9LAorCXsweDAwMDMsICJTZXRtYXJrIGRldGVjdGVkIn0sCisJezB4MDAwNCwgIkJlZ2lubmluZy1vZi1wYXJ0aXRpb24vbWVkaXVtIGRldGVjdGVkIn0sCisJezB4MDAwNSwgIkVuZC1vZi1kYXRhIGRldGVjdGVkIn0sCisJezB4MDAwNiwgIkkvTyBwcm9jZXNzIHRlcm1pbmF0ZWQifSwKKwl7MHgwMDExLCAiQXVkaW8gcGxheSBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MifSwKKwl7MHgwMDEyLCAiQXVkaW8gcGxheSBvcGVyYXRpb24gcGF1c2VkIn0sCisJezB4MDAxMywgIkF1ZGlvIHBsYXkgb3BlcmF0aW9uIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQifSwKKwl7MHgwMDE0LCAiQXVkaW8gcGxheSBvcGVyYXRpb24gc3RvcHBlZCBkdWUgdG8gZXJyb3IifSwKKwl7MHgwMDE1LCAiTm8gY3VycmVudCBhdWRpbyBzdGF0dXMgdG8gcmV0dXJuIn0sCisJezB4MDAxNiwgIk9wZXJhdGlvbiBpbiBwcm9ncmVzcyJ9LAorCXsweDAwMTcsICJDbGVhbmluZyByZXF1ZXN0ZWQifSwKKwl7MHgwMDE4LCAiRXJhc2Ugb3BlcmF0aW9uIGluIHByb2dyZXNzIn0sCisJezB4MDAxOSwgIkxvY2F0ZSBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MifSwKKwl7MHgwMDFBLCAiUmV3aW5kIG9wZXJhdGlvbiBpbiBwcm9ncmVzcyJ9LAorCXsweDAwMUIsICJTZXQgY2FwYWNpdHkgb3BlcmF0aW9uIGluIHByb2dyZXNzIn0sCisJezB4MDAxQywgIlZlcmlmeSBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MifSwKKworCXsweDAxMDAsICJObyBpbmRleC9zZWN0b3Igc2lnbmFsIn0sCisKKwl7MHgwMjAwLCAiTm8gc2VlayBjb21wbGV0ZSJ9LAorCisJezB4MDMwMCwgIlBlcmlwaGVyYWwgZGV2aWNlIHdyaXRlIGZhdWx0In0sCisJezB4MDMwMSwgIk5vIHdyaXRlIGN1cnJlbnQifSwKKwl7MHgwMzAyLCAiRXhjZXNzaXZlIHdyaXRlIGVycm9ycyJ9LAorCisJezB4MDQwMCwgIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIGNhdXNlIG5vdCByZXBvcnRhYmxlIn0sCisJezB4MDQwMSwgIkxvZ2ljYWwgdW5pdCBpcyBpbiBwcm9jZXNzIG9mIGJlY29taW5nIHJlYWR5In0sCisJezB4MDQwMiwgIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIGluaXRpYWxpemluZyBjbWQuIHJlcXVpcmVkIn0sCisJezB4MDQwMywgIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIG1hbnVhbCBpbnRlcnZlbnRpb24gcmVxdWlyZWQifSwKKwl7MHgwNDA0LCAiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgZm9ybWF0IGluIHByb2dyZXNzIn0sCisJezB4MDQwNSwgIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIHJlYnVpbGQgaW4gcHJvZ3Jlc3MifSwKKwl7MHgwNDA2LCAiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgcmVjYWxjdWxhdGlvbiBpbiBwcm9ncmVzcyJ9LAorCXsweDA0MDcsICJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MifSwKKwl7MHgwNDA4LCAiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgbG9uZyB3cml0ZSBpbiBwcm9ncmVzcyJ9LAorCXsweDA0MDksICJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCBzZWxmLXRlc3QgaW4gcHJvZ3Jlc3MifSwKKwl7MHgwNDBBLCAiTG9naWNhbCB1bml0IG5vdCBhY2Nlc3NpYmxlLCBhc3ltbWV0cmljIGFjY2VzcyBzdGF0ZSAiCisJICJ0cmFuc2l0aW9uIn0sCisJezB4MDQwQiwgIkxvZ2ljYWwgdW5pdCBub3QgYWNjZXNzaWJsZSwgdGFyZ2V0IHBvcnQgaW4gc3RhbmRieSBzdGF0ZSJ9LAorCXsweDA0MEMsICJMb2dpY2FsIHVuaXQgbm90IGFjY2Vzc2libGUsIHRhcmdldCBwb3J0IGluIHVuYXZhaWxhYmxlICIKKwkgInN0YXRlIn0sCisJezB4MDQxMCwgIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIGF1eGlsaWFyeSBtZW1vcnkgbm90IGFjY2Vzc2libGUifSwKKwl7MHgwNDExLCAiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgbm90aWZ5IChlbmFibGUgc3BpbnVwKSByZXF1aXJlZCJ9LAorCXsweDA0MTIsICJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCBvZmZsaW5lIn0sCisKKwl7MHgwNTAwLCAiTG9naWNhbCB1bml0IGRvZXMgbm90IHJlc3BvbmQgdG8gc2VsZWN0aW9uIn0sCisKKwl7MHgwNjAwLCAiTm8gcmVmZXJlbmNlIHBvc2l0aW9uIGZvdW5kIn0sCisKKwl7MHgwNzAwLCAiTXVsdGlwbGUgcGVyaXBoZXJhbCBkZXZpY2VzIHNlbGVjdGVkIn0sCisKKwl7MHgwODAwLCAiTG9naWNhbCB1bml0IGNvbW11bmljYXRpb24gZmFpbHVyZSJ9LAorCXsweDA4MDEsICJMb2dpY2FsIHVuaXQgY29tbXVuaWNhdGlvbiB0aW1lLW91dCJ9LAorCXsweDA4MDIsICJMb2dpY2FsIHVuaXQgY29tbXVuaWNhdGlvbiBwYXJpdHkgZXJyb3IifSwKKwl7MHgwODAzLCAiTG9naWNhbCB1bml0IGNvbW11bmljYXRpb24gQ1JDIGVycm9yIChVbHRyYS1ETUEvMzIpIn0sCisJezB4MDgwNCwgIlVucmVhY2hhYmxlIGNvcHkgdGFyZ2V0In0sCisKKwl7MHgwOTAwLCAiVHJhY2sgZm9sbG93aW5nIGVycm9yIn0sCisJezB4MDkwMSwgIlRyYWNraW5nIHNlcnZvIGZhaWx1cmUifSwKKwl7MHgwOTAyLCAiRm9jdXMgc2Vydm8gZmFpbHVyZSJ9LAorCXsweDA5MDMsICJTcGluZGxlIHNlcnZvIGZhaWx1cmUifSwKKwl7MHgwOTA0LCAiSGVhZCBzZWxlY3QgZmF1bHQifSwKKworCXsweDBBMDAsICJFcnJvciBsb2cgb3ZlcmZsb3cifSwKKworCXsweDBCMDAsICJXYXJuaW5nIn0sCisJezB4MEIwMSwgIldhcm5pbmcgLSBzcGVjaWZpZWQgdGVtcGVyYXR1cmUgZXhjZWVkZWQifSwKKwl7MHgwQjAyLCAiV2FybmluZyAtIGVuY2xvc3VyZSBkZWdyYWRlZCJ9LAorCisJezB4MEMwMCwgIldyaXRlIGVycm9yIn0sCisJezB4MEMwMSwgIldyaXRlIGVycm9yIC0gcmVjb3ZlcmVkIHdpdGggYXV0byByZWFsbG9jYXRpb24ifSwKKwl7MHgwQzAyLCAiV3JpdGUgZXJyb3IgLSBhdXRvIHJlYWxsb2NhdGlvbiBmYWlsZWQifSwKKwl7MHgwQzAzLCAiV3JpdGUgZXJyb3IgLSByZWNvbW1lbmQgcmVhc3NpZ25tZW50In0sCisJezB4MEMwNCwgIkNvbXByZXNzaW9uIGNoZWNrIG1pc2NvbXBhcmUgZXJyb3IifSwKKwl7MHgwQzA1LCAiRGF0YSBleHBhbnNpb24gb2NjdXJyZWQgZHVyaW5nIGNvbXByZXNzaW9uIn0sCisJezB4MEMwNiwgIkJsb2NrIG5vdCBjb21wcmVzc2libGUifSwKKwl7MHgwQzA3LCAiV3JpdGUgZXJyb3IgLSByZWNvdmVyeSBuZWVkZWQifSwKKwl7MHgwQzA4LCAiV3JpdGUgZXJyb3IgLSByZWNvdmVyeSBmYWlsZWQifSwKKwl7MHgwQzA5LCAiV3JpdGUgZXJyb3IgLSBsb3NzIG9mIHN0cmVhbWluZyJ9LAorCXsweDBDMEEsICJXcml0ZSBlcnJvciAtIHBhZGRpbmcgYmxvY2tzIGFkZGVkIn0sCisJezB4MEMwQiwgIkF1eGlsaWFyeSBtZW1vcnkgd3JpdGUgZXJyb3IifSwKKwl7MHgwQzBDLCAiV3JpdGUgZXJyb3IgLSB1bmV4cGVjdGVkIHVuc29saWNpdGVkIGRhdGEifSwKKwl7MHgwQzBELCAiV3JpdGUgZXJyb3IgLSBub3QgZW5vdWdoIHVuc29saWNpdGVkIGRhdGEifSwKKworCXsweDBEMDAsICJFcnJvciBkZXRlY3RlZCBieSB0aGlyZCBwYXJ0eSB0ZW1wb3JhcnkgaW5pdGlhdG9yIn0sCisJezB4MEQwMSwgIlRoaXJkIHBhcnR5IGRldmljZSBmYWlsdXJlIn0sCisJezB4MEQwMiwgIkNvcHkgdGFyZ2V0IGRldmljZSBub3QgcmVhY2hhYmxlIn0sCisJezB4MEQwMywgIkluY29ycmVjdCBjb3B5IHRhcmdldCBkZXZpY2UgdHlwZSJ9LAorCXsweDBEMDQsICJDb3B5IHRhcmdldCBkZXZpY2UgZGF0YSB1bmRlcnJ1biJ9LAorCXsweDBEMDUsICJDb3B5IHRhcmdldCBkZXZpY2UgZGF0YSBvdmVycnVuIn0sCisKKwl7MHgwRTAwLCAiSW52YWxpZCBpbmZvcm1hdGlvbiB1bml0In0sCisJezB4MEUwMSwgIkluZm9ybWF0aW9uIHVuaXQgdG9vIHNob3J0In0sCisJezB4MEUwMiwgIkluZm9ybWF0aW9uIHVuaXQgdG9vIGxvbmcifSwKKworCXsweDEwMDAsICJJZCBDUkMgb3IgRUNDIGVycm9yIn0sCisJezB4MTAwMSwgIkRhdGEgYmxvY2sgZ3VhcmQgY2hlY2sgZmFpbGVkIn0sCisJezB4MTAwMiwgIkRhdGEgYmxvY2sgYXBwbGljYXRpb24gdGFnIGNoZWNrIGZhaWxlZCJ9LAorCXsweDEwMDMsICJEYXRhIGJsb2NrIHJlZmVyZW5jZSB0YWcgY2hlY2sgZmFpbGVkIn0sCisKKwl7MHgxMTAwLCAiVW5yZWNvdmVyZWQgcmVhZCBlcnJvciJ9LAorCXsweDExMDEsICJSZWFkIHJldHJpZXMgZXhoYXVzdGVkIn0sCisJezB4MTEwMiwgIkVycm9yIHRvbyBsb25nIHRvIGNvcnJlY3QifSwKKwl7MHgxMTAzLCAiTXVsdGlwbGUgcmVhZCBlcnJvcnMifSwKKwl7MHgxMTA0LCAiVW5yZWNvdmVyZWQgcmVhZCBlcnJvciAtIGF1dG8gcmVhbGxvY2F0ZSBmYWlsZWQifSwKKwl7MHgxMTA1LCAiTC1FQyB1bmNvcnJlY3RhYmxlIGVycm9yIn0sCisJezB4MTEwNiwgIkNJUkMgdW5yZWNvdmVyZWQgZXJyb3IifSwKKwl7MHgxMTA3LCAiRGF0YSByZS1zeW5jaHJvbml6YXRpb24gZXJyb3IifSwKKwl7MHgxMTA4LCAiSW5jb21wbGV0ZSBibG9jayByZWFkIn0sCisJezB4MTEwOSwgIk5vIGdhcCBmb3VuZCJ9LAorCXsweDExMEEsICJNaXNjb3JyZWN0ZWQgZXJyb3IifSwKKwl7MHgxMTBCLCAiVW5yZWNvdmVyZWQgcmVhZCBlcnJvciAtIHJlY29tbWVuZCByZWFzc2lnbm1lbnQifSwKKwl7MHgxMTBDLCAiVW5yZWNvdmVyZWQgcmVhZCBlcnJvciAtIHJlY29tbWVuZCByZXdyaXRlIHRoZSBkYXRhIn0sCisJezB4MTEwRCwgIkRlLWNvbXByZXNzaW9uIENSQyBlcnJvciJ9LAorCXsweDExMEUsICJDYW5ub3QgZGVjb21wcmVzcyB1c2luZyBkZWNsYXJlZCBhbGdvcml0aG0ifSwKKwl7MHgxMTBGLCAiRXJyb3IgcmVhZGluZyBVUEMvRUFOIG51bWJlciJ9LAorCXsweDExMTAsICJFcnJvciByZWFkaW5nIElTUkMgbnVtYmVyIn0sCisJezB4MTExMSwgIlJlYWQgZXJyb3IgLSBsb3NzIG9mIHN0cmVhbWluZyJ9LAorCXsweDExMTIsICJBdXhpbGlhcnkgbWVtb3J5IHJlYWQgZXJyb3IifSwKKwl7MHgxMTEzLCAiUmVhZCBlcnJvciAtIGZhaWxlZCByZXRyYW5zbWlzc2lvbiByZXF1ZXN0In0sCisKKwl7MHgxMjAwLCAiQWRkcmVzcyBtYXJrIG5vdCBmb3VuZCBmb3IgaWQgZmllbGQifSwKKworCXsweDEzMDAsICJBZGRyZXNzIG1hcmsgbm90IGZvdW5kIGZvciBkYXRhIGZpZWxkIn0sCisKKwl7MHgxNDAwLCAiUmVjb3JkZWQgZW50aXR5IG5vdCBmb3VuZCJ9LAorCXsweDE0MDEsICJSZWNvcmQgbm90IGZvdW5kIn0sCisJezB4MTQwMiwgIkZpbGVtYXJrIG9yIHNldG1hcmsgbm90IGZvdW5kIn0sCisJezB4MTQwMywgIkVuZC1vZi1kYXRhIG5vdCBmb3VuZCJ9LAorCXsweDE0MDQsICJCbG9jayBzZXF1ZW5jZSBlcnJvciJ9LAorCXsweDE0MDUsICJSZWNvcmQgbm90IGZvdW5kIC0gcmVjb21tZW5kIHJlYXNzaWdubWVudCJ9LAorCXsweDE0MDYsICJSZWNvcmQgbm90IGZvdW5kIC0gZGF0YSBhdXRvLXJlYWxsb2NhdGVkIn0sCisJezB4MTQwNywgIkxvY2F0ZSBvcGVyYXRpb24gZmFpbHVyZSJ9LAorCisJezB4MTUwMCwgIlJhbmRvbSBwb3NpdGlvbmluZyBlcnJvciJ9LAorCXsweDE1MDEsICJNZWNoYW5pY2FsIHBvc2l0aW9uaW5nIGVycm9yIn0sCisJezB4MTUwMiwgIlBvc2l0aW9uaW5nIGVycm9yIGRldGVjdGVkIGJ5IHJlYWQgb2YgbWVkaXVtIn0sCisKKwl7MHgxNjAwLCAiRGF0YSBzeW5jaHJvbml6YXRpb24gbWFyayBlcnJvciJ9LAorCXsweDE2MDEsICJEYXRhIHN5bmMgZXJyb3IgLSBkYXRhIHJld3JpdHRlbiJ9LAorCXsweDE2MDIsICJEYXRhIHN5bmMgZXJyb3IgLSByZWNvbW1lbmQgcmV3cml0ZSJ9LAorCXsweDE2MDMsICJEYXRhIHN5bmMgZXJyb3IgLSBkYXRhIGF1dG8tcmVhbGxvY2F0ZWQifSwKKwl7MHgxNjA0LCAiRGF0YSBzeW5jIGVycm9yIC0gcmVjb21tZW5kIHJlYXNzaWdubWVudCJ9LAorCisJezB4MTcwMCwgIlJlY292ZXJlZCBkYXRhIHdpdGggbm8gZXJyb3IgY29ycmVjdGlvbiBhcHBsaWVkIn0sCisJezB4MTcwMSwgIlJlY292ZXJlZCBkYXRhIHdpdGggcmV0cmllcyJ9LAorCXsweDE3MDIsICJSZWNvdmVyZWQgZGF0YSB3aXRoIHBvc2l0aXZlIGhlYWQgb2Zmc2V0In0sCisJezB4MTcwMywgIlJlY292ZXJlZCBkYXRhIHdpdGggbmVnYXRpdmUgaGVhZCBvZmZzZXQifSwKKwl7MHgxNzA0LCAiUmVjb3ZlcmVkIGRhdGEgd2l0aCByZXRyaWVzIGFuZC9vciBjaXJjIGFwcGxpZWQifSwKKwl7MHgxNzA1LCAiUmVjb3ZlcmVkIGRhdGEgdXNpbmcgcHJldmlvdXMgc2VjdG9yIGlkIn0sCisJezB4MTcwNiwgIlJlY292ZXJlZCBkYXRhIHdpdGhvdXQgRUNDIC0gZGF0YSBhdXRvLXJlYWxsb2NhdGVkIn0sCisJezB4MTcwNywgIlJlY292ZXJlZCBkYXRhIHdpdGhvdXQgRUNDIC0gcmVjb21tZW5kIHJlYXNzaWdubWVudCJ9LAorCXsweDE3MDgsICJSZWNvdmVyZWQgZGF0YSB3aXRob3V0IEVDQyAtIHJlY29tbWVuZCByZXdyaXRlIn0sCisJezB4MTcwOSwgIlJlY292ZXJlZCBkYXRhIHdpdGhvdXQgRUNDIC0gZGF0YSByZXdyaXR0ZW4ifSwKKworCXsweDE4MDAsICJSZWNvdmVyZWQgZGF0YSB3aXRoIGVycm9yIGNvcnJlY3Rpb24gYXBwbGllZCJ9LAorCXsweDE4MDEsICJSZWNvdmVyZWQgZGF0YSB3aXRoIGVycm9yIGNvcnIuICYgcmV0cmllcyBhcHBsaWVkIn0sCisJezB4MTgwMiwgIlJlY292ZXJlZCBkYXRhIC0gZGF0YSBhdXRvLXJlYWxsb2NhdGVkIn0sCisJezB4MTgwMywgIlJlY292ZXJlZCBkYXRhIHdpdGggQ0lSQyJ9LAorCXsweDE4MDQsICJSZWNvdmVyZWQgZGF0YSB3aXRoIEwtRUMifSwKKwl7MHgxODA1LCAiUmVjb3ZlcmVkIGRhdGEgLSByZWNvbW1lbmQgcmVhc3NpZ25tZW50In0sCisJezB4MTgwNiwgIlJlY292ZXJlZCBkYXRhIC0gcmVjb21tZW5kIHJld3JpdGUifSwKKwl7MHgxODA3LCAiUmVjb3ZlcmVkIGRhdGEgd2l0aCBFQ0MgLSBkYXRhIHJld3JpdHRlbiJ9LAorCXsweDE4MDgsICJSZWNvdmVyZWQgZGF0YSB3aXRoIGxpbmtpbmcifSwKKworCXsweDE5MDAsICJEZWZlY3QgbGlzdCBlcnJvciJ9LAorCXsweDE5MDEsICJEZWZlY3QgbGlzdCBub3QgYXZhaWxhYmxlIn0sCisJezB4MTkwMiwgIkRlZmVjdCBsaXN0IGVycm9yIGluIHByaW1hcnkgbGlzdCJ9LAorCXsweDE5MDMsICJEZWZlY3QgbGlzdCBlcnJvciBpbiBncm93biBsaXN0In0sCisKKwl7MHgxQTAwLCAiUGFyYW1ldGVyIGxpc3QgbGVuZ3RoIGVycm9yIn0sCisKKwl7MHgxQjAwLCAiU3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlciBlcnJvciJ9LAorCisJezB4MUMwMCwgIkRlZmVjdCBsaXN0IG5vdCBmb3VuZCJ9LAorCXsweDFDMDEsICJQcmltYXJ5IGRlZmVjdCBsaXN0IG5vdCBmb3VuZCJ9LAorCXsweDFDMDIsICJHcm93biBkZWZlY3QgbGlzdCBub3QgZm91bmQifSwKKworCXsweDFEMDAsICJNaXNjb21wYXJlIGR1cmluZyB2ZXJpZnkgb3BlcmF0aW9uIn0sCisKKwl7MHgxRTAwLCAiUmVjb3ZlcmVkIGlkIHdpdGggRUNDIGNvcnJlY3Rpb24ifSwKKworCXsweDFGMDAsICJQYXJ0aWFsIGRlZmVjdCBsaXN0IHRyYW5zZmVyIn0sCisKKwl7MHgyMDAwLCAiSW52YWxpZCBjb21tYW5kIG9wZXJhdGlvbiBjb2RlIn0sCisJezB4MjAwMSwgIkFjY2VzcyBkZW5pZWQgLSBpbml0aWF0b3IgcGVuZGluZy1lbnJvbGxlZCJ9LAorCXsweDIwMDIsICJBY2Nlc3MgZGVuaWVkIC0gbm8gYWNjZXNzIHJpZ2h0cyJ9LAorCXsweDIwMDMsICJBY2Nlc3MgZGVuaWVkIC0gaW52YWxpZCBtZ210IGlkIGtleSJ9LAorCXsweDIwMDQsICJJbGxlZ2FsIGNvbW1hbmQgd2hpbGUgaW4gd3JpdGUgY2FwYWJsZSBzdGF0ZSJ9LAorCXsweDIwMDUsICJPYnNvbGV0ZSJ9LAorCXsweDIwMDYsICJJbGxlZ2FsIGNvbW1hbmQgd2hpbGUgaW4gZXhwbGljaXQgYWRkcmVzcyBtb2RlIn0sCisJezB4MjAwNywgIklsbGVnYWwgY29tbWFuZCB3aGlsZSBpbiBpbXBsaWNpdCBhZGRyZXNzIG1vZGUifSwKKwl7MHgyMDA4LCAiQWNjZXNzIGRlbmllZCAtIGVucm9sbG1lbnQgY29uZmxpY3QifSwKKwl7MHgyMDA5LCAiQWNjZXNzIGRlbmllZCAtIGludmFsaWQgTFUgaWRlbnRpZmllciJ9LAorCXsweDIwMEEsICJBY2Nlc3MgZGVuaWVkIC0gaW52YWxpZCBwcm94eSB0b2tlbiJ9LAorCXsweDIwMEIsICJBY2Nlc3MgZGVuaWVkIC0gQUNMIExVTiBjb25mbGljdCJ9LAorCisJezB4MjEwMCwgIkxvZ2ljYWwgYmxvY2sgYWRkcmVzcyBvdXQgb2YgcmFuZ2UifSwKKwl7MHgyMTAxLCAiSW52YWxpZCBlbGVtZW50IGFkZHJlc3MifSwKKwl7MHgyMTAyLCAiSW52YWxpZCBhZGRyZXNzIGZvciB3cml0ZSJ9LAorCisJezB4MjIwMCwgIklsbGVnYWwgZnVuY3Rpb24gKHVzZSAyMCAwMCwgMjQgMDAsIG9yIDI2IDAwKSJ9LAorCisJezB4MjQwMCwgIkludmFsaWQgZmllbGQgaW4gY2RiIn0sCisJezB4MjQwMSwgIkNEQiBkZWNyeXB0aW9uIGVycm9yIn0sCisJezB4MjQwNCwgIlNlY3VyaXR5IGF1ZGl0IHZhbHVlIGZyb3plbiJ9LAorCXsweDI0MDUsICJTZWN1cml0eSB3b3JraW5nIGtleSBmcm96ZW4ifSwKKwl7MHgyNDA2LCAiTm9uY2Ugbm90IHVuaXF1ZSJ9LAorCXsweDI0MDcsICJOb25jZSB0aW1lc3RhbXAgb3V0IG9mIHJhbmdlIn0sCisKKwl7MHgyNTAwLCAiTG9naWNhbCB1bml0IG5vdCBzdXBwb3J0ZWQifSwKKworCXsweDI2MDAsICJJbnZhbGlkIGZpZWxkIGluIHBhcmFtZXRlciBsaXN0In0sCisJezB4MjYwMSwgIlBhcmFtZXRlciBub3Qgc3VwcG9ydGVkIn0sCisJezB4MjYwMiwgIlBhcmFtZXRlciB2YWx1ZSBpbnZhbGlkIn0sCisJezB4MjYwMywgIlRocmVzaG9sZCBwYXJhbWV0ZXJzIG5vdCBzdXBwb3J0ZWQifSwKKwl7MHgyNjA0LCAiSW52YWxpZCByZWxlYXNlIG9mIHBlcnNpc3RlbnQgcmVzZXJ2YXRpb24ifSwKKwl7MHgyNjA1LCAiRGF0YSBkZWNyeXB0aW9uIGVycm9yIn0sCisJezB4MjYwNiwgIlRvbyBtYW55IHRhcmdldCBkZXNjcmlwdG9ycyJ9LAorCXsweDI2MDcsICJVbnN1cHBvcnRlZCB0YXJnZXQgZGVzY3JpcHRvciB0eXBlIGNvZGUifSwKKwl7MHgyNjA4LCAiVG9vIG1hbnkgc2VnbWVudCBkZXNjcmlwdG9ycyJ9LAorCXsweDI2MDksICJVbnN1cHBvcnRlZCBzZWdtZW50IGRlc2NyaXB0b3IgdHlwZSBjb2RlIn0sCisJezB4MjYwQSwgIlVuZXhwZWN0ZWQgaW5leGFjdCBzZWdtZW50In0sCisJezB4MjYwQiwgIklubGluZSBkYXRhIGxlbmd0aCBleGNlZWRlZCJ9LAorCXsweDI2MEMsICJJbnZhbGlkIG9wZXJhdGlvbiBmb3IgY29weSBzb3VyY2Ugb3IgZGVzdGluYXRpb24ifSwKKwl7MHgyNjBELCAiQ29weSBzZWdtZW50IGdyYW51bGFyaXR5IHZpb2xhdGlvbiJ9LAorCXsweDI2MEUsICJJbnZhbGlkIHBhcmFtZXRlciB3aGlsZSBwb3J0IGlzIGVuYWJsZWQifSwKKwl7MHgyNjBGLCAiSW52YWxpZCBkYXRhLW91dCBidWZmZXIgaW50ZWdyaXR5In0sCisKKwl7MHgyNzAwLCAiV3JpdGUgcHJvdGVjdGVkIn0sCisJezB4MjcwMSwgIkhhcmR3YXJlIHdyaXRlIHByb3RlY3RlZCJ9LAorCXsweDI3MDIsICJMb2dpY2FsIHVuaXQgc29mdHdhcmUgd3JpdGUgcHJvdGVjdGVkIn0sCisJezB4MjcwMywgIkFzc29jaWF0ZWQgd3JpdGUgcHJvdGVjdCJ9LAorCXsweDI3MDQsICJQZXJzaXN0ZW50IHdyaXRlIHByb3RlY3QifSwKKwl7MHgyNzA1LCAiUGVybWFuZW50IHdyaXRlIHByb3RlY3QifSwKKwl7MHgyNzA2LCAiQ29uZGl0aW9uYWwgd3JpdGUgcHJvdGVjdCJ9LAorCisJezB4MjgwMCwgIk5vdCByZWFkeSB0byByZWFkeSBjaGFuZ2UsIG1lZGl1bSBtYXkgaGF2ZSBjaGFuZ2VkIn0sCisJezB4MjgwMSwgIkltcG9ydCBvciBleHBvcnQgZWxlbWVudCBhY2Nlc3NlZCJ9LAorCisJezB4MjkwMCwgIlBvd2VyIG9uLCByZXNldCwgb3IgYnVzIGRldmljZSByZXNldCBvY2N1cnJlZCJ9LAorCXsweDI5MDEsICJQb3dlciBvbiBvY2N1cnJlZCJ9LAorCXsweDI5MDIsICJTY3NpIGJ1cyByZXNldCBvY2N1cnJlZCJ9LAorCXsweDI5MDMsICJCdXMgZGV2aWNlIHJlc2V0IGZ1bmN0aW9uIG9jY3VycmVkIn0sCisJezB4MjkwNCwgIkRldmljZSBpbnRlcm5hbCByZXNldCJ9LAorCXsweDI5MDUsICJUcmFuc2NlaXZlciBtb2RlIGNoYW5nZWQgdG8gc2luZ2xlLWVuZGVkIn0sCisJezB4MjkwNiwgIlRyYW5zY2VpdmVyIG1vZGUgY2hhbmdlZCB0byBsdmQifSwKKwl7MHgyOTA3LCAiSV9UIG5leHVzIGxvc3Mgb2NjdXJyZWQifSwKKworCXsweDJBMDAsICJQYXJhbWV0ZXJzIGNoYW5nZWQifSwKKwl7MHgyQTAxLCAiTW9kZSBwYXJhbWV0ZXJzIGNoYW5nZWQifSwKKwl7MHgyQTAyLCAiTG9nIHBhcmFtZXRlcnMgY2hhbmdlZCJ9LAorCXsweDJBMDMsICJSZXNlcnZhdGlvbnMgcHJlZW1wdGVkIn0sCisJezB4MkEwNCwgIlJlc2VydmF0aW9ucyByZWxlYXNlZCJ9LAorCXsweDJBMDUsICJSZWdpc3RyYXRpb25zIHByZWVtcHRlZCJ9LAorCXsweDJBMDYsICJBc3ltbWV0cmljIGFjY2VzcyBzdGF0ZSBjaGFuZ2VkIn0sCisJezB4MkEwNywgIkltcGxpY2l0IGFzeW1tZXRyaWMgYWNjZXNzIHN0YXRlIHRyYW5zaXRpb24gZmFpbGVkIn0sCisJezB4MkEwOCwgIlByaW9yaXR5IGNoYW5nZWQifSwKKwl7MHgyQTA5LCAiQ2FwYWNpdHkgZGF0YSBoYXMgY2hhbmdlZCJ9LAorCisJezB4MkIwMCwgIkNvcHkgY2Fubm90IGV4ZWN1dGUgc2luY2UgaG9zdCBjYW5ub3QgZGlzY29ubmVjdCJ9LAorCisJezB4MkMwMCwgIkNvbW1hbmQgc2VxdWVuY2UgZXJyb3IifSwKKwl7MHgyQzAxLCAiVG9vIG1hbnkgd2luZG93cyBzcGVjaWZpZWQifSwKKwl7MHgyQzAyLCAiSW52YWxpZCBjb21iaW5hdGlvbiBvZiB3aW5kb3dzIHNwZWNpZmllZCJ9LAorCXsweDJDMDMsICJDdXJyZW50IHByb2dyYW0gYXJlYSBpcyBub3QgZW1wdHkifSwKKwl7MHgyQzA0LCAiQ3VycmVudCBwcm9ncmFtIGFyZWEgaXMgZW1wdHkifSwKKwl7MHgyQzA1LCAiSWxsZWdhbCBwb3dlciBjb25kaXRpb24gcmVxdWVzdCJ9LAorCXsweDJDMDYsICJQZXJzaXN0ZW50IHByZXZlbnQgY29uZmxpY3QifSwKKwl7MHgyQzA3LCAiUHJldmlvdXMgYnVzeSBzdGF0dXMifSwKKwl7MHgyQzA4LCAiUHJldmlvdXMgdGFzayBzZXQgZnVsbCBzdGF0dXMifSwKKwl7MHgyQzA5LCAiUHJldmlvdXMgcmVzZXJ2YXRpb24gY29uZmxpY3Qgc3RhdHVzIn0sCisJezB4MkMwQSwgIlBhcnRpdGlvbiBvciBjb2xsZWN0aW9uIGNvbnRhaW5zIHVzZXIgb2JqZWN0cyJ9LAorCXsweDJDMEIsICJOb3QgcmVzZXJ2ZWQifSwKKworCXsweDJEMDAsICJPdmVyd3JpdGUgZXJyb3Igb24gdXBkYXRlIGluIHBsYWNlIn0sCisKKwl7MHgyRTAwLCAiSW5zdWZmaWNpZW50IHRpbWUgZm9yIG9wZXJhdGlvbiJ9LAorCisJezB4MkYwMCwgIkNvbW1hbmRzIGNsZWFyZWQgYnkgYW5vdGhlciBpbml0aWF0b3IifSwKKworCXsweDMwMDAsICJJbmNvbXBhdGlibGUgbWVkaXVtIGluc3RhbGxlZCJ9LAorCXsweDMwMDEsICJDYW5ub3QgcmVhZCBtZWRpdW0gLSB1bmtub3duIGZvcm1hdCJ9LAorCXsweDMwMDIsICJDYW5ub3QgcmVhZCBtZWRpdW0gLSBpbmNvbXBhdGlibGUgZm9ybWF0In0sCisJezB4MzAwMywgIkNsZWFuaW5nIGNhcnRyaWRnZSBpbnN0YWxsZWQifSwKKwl7MHgzMDA0LCAiQ2Fubm90IHdyaXRlIG1lZGl1bSAtIHVua25vd24gZm9ybWF0In0sCisJezB4MzAwNSwgIkNhbm5vdCB3cml0ZSBtZWRpdW0gLSBpbmNvbXBhdGlibGUgZm9ybWF0In0sCisJezB4MzAwNiwgIkNhbm5vdCBmb3JtYXQgbWVkaXVtIC0gaW5jb21wYXRpYmxlIG1lZGl1bSJ9LAorCXsweDMwMDcsICJDbGVhbmluZyBmYWlsdXJlIn0sCisJezB4MzAwOCwgIkNhbm5vdCB3cml0ZSAtIGFwcGxpY2F0aW9uIGNvZGUgbWlzbWF0Y2gifSwKKwl7MHgzMDA5LCAiQ3VycmVudCBzZXNzaW9uIG5vdCBmaXhhdGVkIGZvciBhcHBlbmQifSwKKwl7MHgzMDBBLCAiQ2xlYW5pbmcgcmVxdWVzdCByZWplY3RlZCJ9LAorCXsweDMwMEMsICJXT1JNIG1lZGl1bSwgb3ZlcndyaXRlIGF0dGVtcHRlZCJ9LAorCXsweDMwMTAsICJNZWRpdW0gbm90IGZvcm1hdHRlZCJ9LAorCisJezB4MzEwMCwgIk1lZGl1bSBmb3JtYXQgY29ycnVwdGVkIn0sCisJezB4MzEwMSwgIkZvcm1hdCBjb21tYW5kIGZhaWxlZCJ9LAorCXsweDMxMDIsICJab25lZCBmb3JtYXR0aW5nIGZhaWxlZCBkdWUgdG8gc3BhcmUgbGlua2luZyJ9LAorCisJezB4MzIwMCwgIk5vIGRlZmVjdCBzcGFyZSBsb2NhdGlvbiBhdmFpbGFibGUifSwKKwl7MHgzMjAxLCAiRGVmZWN0IGxpc3QgdXBkYXRlIGZhaWx1cmUifSwKKworCXsweDMzMDAsICJUYXBlIGxlbmd0aCBlcnJvciJ9LAorCisJezB4MzQwMCwgIkVuY2xvc3VyZSBmYWlsdXJlIn0sCisKKwl7MHgzNTAwLCAiRW5jbG9zdXJlIHNlcnZpY2VzIGZhaWx1cmUifSwKKwl7MHgzNTAxLCAiVW5zdXBwb3J0ZWQgZW5jbG9zdXJlIGZ1bmN0aW9uIn0sCisJezB4MzUwMiwgIkVuY2xvc3VyZSBzZXJ2aWNlcyB1bmF2YWlsYWJsZSJ9LAorCXsweDM1MDMsICJFbmNsb3N1cmUgc2VydmljZXMgdHJhbnNmZXIgZmFpbHVyZSJ9LAorCXsweDM1MDQsICJFbmNsb3N1cmUgc2VydmljZXMgdHJhbnNmZXIgcmVmdXNlZCJ9LAorCXsweDM1MDUsICJFbmNsb3N1cmUgc2VydmljZXMgY2hlY2tzdW0gZXJyb3IifSwKKworCXsweDM2MDAsICJSaWJib24sIGluaywgb3IgdG9uZXIgZmFpbHVyZSJ9LAorCisJezB4MzcwMCwgIlJvdW5kZWQgcGFyYW1ldGVyIn0sCisKKwl7MHgzODAwLCAiRXZlbnQgc3RhdHVzIG5vdGlmaWNhdGlvbiJ9LAorCXsweDM4MDIsICJFc24gLSBwb3dlciBtYW5hZ2VtZW50IGNsYXNzIGV2ZW50In0sCisJezB4MzgwNCwgIkVzbiAtIG1lZGlhIGNsYXNzIGV2ZW50In0sCisJezB4MzgwNiwgIkVzbiAtIGRldmljZSBidXN5IGNsYXNzIGV2ZW50In0sCisKKwl7MHgzOTAwLCAiU2F2aW5nIHBhcmFtZXRlcnMgbm90IHN1cHBvcnRlZCJ9LAorCisJezB4M0EwMCwgIk1lZGl1bSBub3QgcHJlc2VudCJ9LAorCXsweDNBMDEsICJNZWRpdW0gbm90IHByZXNlbnQgLSB0cmF5IGNsb3NlZCJ9LAorCXsweDNBMDIsICJNZWRpdW0gbm90IHByZXNlbnQgLSB0cmF5IG9wZW4ifSwKKwl7MHgzQTAzLCAiTWVkaXVtIG5vdCBwcmVzZW50IC0gbG9hZGFibGUifSwKKwl7MHgzQTA0LCAiTWVkaXVtIG5vdCBwcmVzZW50IC0gbWVkaXVtIGF1eGlsaWFyeSBtZW1vcnkgYWNjZXNzaWJsZSJ9LAorCisJezB4M0IwMCwgIlNlcXVlbnRpYWwgcG9zaXRpb25pbmcgZXJyb3IifSwKKwl7MHgzQjAxLCAiVGFwZSBwb3NpdGlvbiBlcnJvciBhdCBiZWdpbm5pbmctb2YtbWVkaXVtIn0sCisJezB4M0IwMiwgIlRhcGUgcG9zaXRpb24gZXJyb3IgYXQgZW5kLW9mLW1lZGl1bSJ9LAorCXsweDNCMDMsICJUYXBlIG9yIGVsZWN0cm9uaWMgdmVydGljYWwgZm9ybXMgdW5pdCBub3QgcmVhZHkifSwKKwl7MHgzQjA0LCAiU2xldyBmYWlsdXJlIn0sCisJezB4M0IwNSwgIlBhcGVyIGphbSJ9LAorCXsweDNCMDYsICJGYWlsZWQgdG8gc2Vuc2UgdG9wLW9mLWZvcm0ifSwKKwl7MHgzQjA3LCAiRmFpbGVkIHRvIHNlbnNlIGJvdHRvbS1vZi1mb3JtIn0sCisJezB4M0IwOCwgIlJlcG9zaXRpb24gZXJyb3IifSwKKwl7MHgzQjA5LCAiUmVhZCBwYXN0IGVuZCBvZiBtZWRpdW0ifSwKKwl7MHgzQjBBLCAiUmVhZCBwYXN0IGJlZ2lubmluZyBvZiBtZWRpdW0ifSwKKwl7MHgzQjBCLCAiUG9zaXRpb24gcGFzdCBlbmQgb2YgbWVkaXVtIn0sCisJezB4M0IwQywgIlBvc2l0aW9uIHBhc3QgYmVnaW5uaW5nIG9mIG1lZGl1bSJ9LAorCXsweDNCMEQsICJNZWRpdW0gZGVzdGluYXRpb24gZWxlbWVudCBmdWxsIn0sCisJezB4M0IwRSwgIk1lZGl1bSBzb3VyY2UgZWxlbWVudCBlbXB0eSJ9LAorCXsweDNCMEYsICJFbmQgb2YgbWVkaXVtIHJlYWNoZWQifSwKKwl7MHgzQjExLCAiTWVkaXVtIG1hZ2F6aW5lIG5vdCBhY2Nlc3NpYmxlIn0sCisJezB4M0IxMiwgIk1lZGl1bSBtYWdhemluZSByZW1vdmVkIn0sCisJezB4M0IxMywgIk1lZGl1bSBtYWdhemluZSBpbnNlcnRlZCJ9LAorCXsweDNCMTQsICJNZWRpdW0gbWFnYXppbmUgbG9ja2VkIn0sCisJezB4M0IxNSwgIk1lZGl1bSBtYWdhemluZSB1bmxvY2tlZCJ9LAorCXsweDNCMTYsICJNZWNoYW5pY2FsIHBvc2l0aW9uaW5nIG9yIGNoYW5nZXIgZXJyb3IifSwKKwl7MHgzQjE3LCAiUmVhZCBwYXN0IGVuZCBvZiB1c2VyIG9iamVjdCJ9LAorCisJezB4M0QwMCwgIkludmFsaWQgYml0cyBpbiBpZGVudGlmeSBtZXNzYWdlIn0sCisKKwl7MHgzRTAwLCAiTG9naWNhbCB1bml0IGhhcyBub3Qgc2VsZi1jb25maWd1cmVkIHlldCJ9LAorCXsweDNFMDEsICJMb2dpY2FsIHVuaXQgZmFpbHVyZSJ9LAorCXsweDNFMDIsICJUaW1lb3V0IG9uIGxvZ2ljYWwgdW5pdCJ9LAorCXsweDNFMDMsICJMb2dpY2FsIHVuaXQgZmFpbGVkIHNlbGYtdGVzdCJ9LAorCXsweDNFMDQsICJMb2dpY2FsIHVuaXQgdW5hYmxlIHRvIHVwZGF0ZSBzZWxmLXRlc3QgbG9nIn0sCisKKwl7MHgzRjAwLCAiVGFyZ2V0IG9wZXJhdGluZyBjb25kaXRpb25zIGhhdmUgY2hhbmdlZCJ9LAorCXsweDNGMDEsICJNaWNyb2NvZGUgaGFzIGJlZW4gY2hhbmdlZCJ9LAorCXsweDNGMDIsICJDaGFuZ2VkIG9wZXJhdGluZyBkZWZpbml0aW9uIn0sCisJezB4M0YwMywgIklucXVpcnkgZGF0YSBoYXMgY2hhbmdlZCJ9LAorCXsweDNGMDQsICJDb21wb25lbnQgZGV2aWNlIGF0dGFjaGVkIn0sCisJezB4M0YwNSwgIkRldmljZSBpZGVudGlmaWVyIGNoYW5nZWQifSwKKwl7MHgzRjA2LCAiUmVkdW5kYW5jeSBncm91cCBjcmVhdGVkIG9yIG1vZGlmaWVkIn0sCisJezB4M0YwNywgIlJlZHVuZGFuY3kgZ3JvdXAgZGVsZXRlZCJ9LAorCXsweDNGMDgsICJTcGFyZSBjcmVhdGVkIG9yIG1vZGlmaWVkIn0sCisJezB4M0YwOSwgIlNwYXJlIGRlbGV0ZWQifSwKKwl7MHgzRjBBLCAiVm9sdW1lIHNldCBjcmVhdGVkIG9yIG1vZGlmaWVkIn0sCisJezB4M0YwQiwgIlZvbHVtZSBzZXQgZGVsZXRlZCJ9LAorCXsweDNGMEMsICJWb2x1bWUgc2V0IGRlYXNzaWduZWQifSwKKwl7MHgzRjBELCAiVm9sdW1lIHNldCByZWFzc2lnbmVkIn0sCisJezB4M0YwRSwgIlJlcG9ydGVkIGx1bnMgZGF0YSBoYXMgY2hhbmdlZCJ9LAorCXsweDNGMEYsICJFY2hvIGJ1ZmZlciBvdmVyd3JpdHRlbiJ9LAorCXsweDNGMTAsICJNZWRpdW0gbG9hZGFibGUifSwKKwl7MHgzRjExLCAiTWVkaXVtIGF1eGlsaWFyeSBtZW1vcnkgYWNjZXNzaWJsZSJ9LAorLyoKKyAqCXsweDQwTk4sICJSYW0gZmFpbHVyZSJ9LAorICoJezB4NDBOTiwgIkRpYWdub3N0aWMgZmFpbHVyZSBvbiBjb21wb25lbnQgbm4ifSwKKyAqCXsweDQxTk4sICJEYXRhIHBhdGggZmFpbHVyZSJ9LAorICoJezB4NDJOTiwgIlBvd2VyLW9uIG9yIHNlbGYtdGVzdCBmYWlsdXJlIn0sCisgKi8KKwl7MHg0MzAwLCAiTWVzc2FnZSBlcnJvciJ9LAorCisJezB4NDQwMCwgIkludGVybmFsIHRhcmdldCBmYWlsdXJlIn0sCisKKwl7MHg0NTAwLCAiU2VsZWN0IG9yIHJlc2VsZWN0IGZhaWx1cmUifSwKKworCXsweDQ2MDAsICJVbnN1Y2Nlc3NmdWwgc29mdCByZXNldCJ9LAorCisJezB4NDcwMCwgIlNjc2kgcGFyaXR5IGVycm9yIn0sCisJezB4NDcwMSwgIkRhdGEgcGhhc2UgQ1JDIGVycm9yIGRldGVjdGVkIn0sCisJezB4NDcwMiwgIlNjc2kgcGFyaXR5IGVycm9yIGRldGVjdGVkIGR1cmluZyBzdCBkYXRhIHBoYXNlIn0sCisJezB4NDcwMywgIkluZm9ybWF0aW9uIHVuaXQgQ1JDIGVycm9yIGRldGVjdGVkIn0sCisJezB4NDcwNCwgIkFzeW5jaHJvbm91cyBpbmZvcm1hdGlvbiBwcm90ZWN0aW9uIGVycm9yIGRldGVjdGVkIn0sCisJezB4NDcwNSwgIlByb3RvY29sIHNlcnZpY2UgQ1JDIGVycm9yIn0sCisJezB4NDc3ZiwgIlNvbWUgY29tbWFuZHMgY2xlYXJlZCBieSBpU0NTSSBQcm90b2NvbCBldmVudCJ9LAorCisJezB4NDgwMCwgIkluaXRpYXRvciBkZXRlY3RlZCBlcnJvciBtZXNzYWdlIHJlY2VpdmVkIn0sCisKKwl7MHg0OTAwLCAiSW52YWxpZCBtZXNzYWdlIGVycm9yIn0sCisKKwl7MHg0QTAwLCAiQ29tbWFuZCBwaGFzZSBlcnJvciJ9LAorCisJezB4NEIwMCwgIkRhdGEgcGhhc2UgZXJyb3IifSwKKwl7MHg0QjAxLCAiSW52YWxpZCB0YXJnZXQgcG9ydCB0cmFuc2ZlciB0YWcgcmVjZWl2ZWQifSwKKwl7MHg0QjAyLCAiVG9vIG11Y2ggd3JpdGUgZGF0YSJ9LAorCXsweDRCMDMsICJBY2svbmFrIHRpbWVvdXQifSwKKwl7MHg0QjA0LCAiTmFrIHJlY2VpdmVkIn0sCisJezB4NEIwNSwgIkRhdGEgb2Zmc2V0IGVycm9yIn0sCisJezB4NEIwNiwgIkluaXRpYXRvciByZXNwb25zZSB0aW1lb3V0In0sCisKKwl7MHg0QzAwLCAiTG9naWNhbCB1bml0IGZhaWxlZCBzZWxmLWNvbmZpZ3VyYXRpb24ifSwKKy8qCisgKgl7MHg0RE5OLCAiVGFnZ2VkIG92ZXJsYXBwZWQgY29tbWFuZHMgKG5uID0gcXVldWUgdGFnKSJ9LAorICovCisJezB4NEUwMCwgIk92ZXJsYXBwZWQgY29tbWFuZHMgYXR0ZW1wdGVkIn0sCisKKwl7MHg1MDAwLCAiV3JpdGUgYXBwZW5kIGVycm9yIn0sCisJezB4NTAwMSwgIldyaXRlIGFwcGVuZCBwb3NpdGlvbiBlcnJvciJ9LAorCXsweDUwMDIsICJQb3NpdGlvbiBlcnJvciByZWxhdGVkIHRvIHRpbWluZyJ9LAorCisJezB4NTEwMCwgIkVyYXNlIGZhaWx1cmUifSwKKwl7MHg1MTAxLCAiRXJhc2UgZmFpbHVyZSAtIGluY29tcGxldGUgZXJhc2Ugb3BlcmF0aW9uIGRldGVjdGVkIn0sCisKKwl7MHg1MjAwLCAiQ2FydHJpZGdlIGZhdWx0In0sCisKKwl7MHg1MzAwLCAiTWVkaWEgbG9hZCBvciBlamVjdCBmYWlsZWQifSwKKwl7MHg1MzAxLCAiVW5sb2FkIHRhcGUgZmFpbHVyZSJ9LAorCXsweDUzMDIsICJNZWRpdW0gcmVtb3ZhbCBwcmV2ZW50ZWQifSwKKworCXsweDU0MDAsICJTY3NpIHRvIGhvc3Qgc3lzdGVtIGludGVyZmFjZSBmYWlsdXJlIn0sCisKKwl7MHg1NTAwLCAiU3lzdGVtIHJlc291cmNlIGZhaWx1cmUifSwKKwl7MHg1NTAxLCAiU3lzdGVtIGJ1ZmZlciBmdWxsIn0sCisJezB4NTUwMiwgIkluc3VmZmljaWVudCByZXNlcnZhdGlvbiByZXNvdXJjZXMifSwKKwl7MHg1NTAzLCAiSW5zdWZmaWNpZW50IHJlc291cmNlcyJ9LAorCXsweDU1MDQsICJJbnN1ZmZpY2llbnQgcmVnaXN0cmF0aW9uIHJlc291cmNlcyJ9LAorCXsweDU1MDUsICJJbnN1ZmZpY2llbnQgYWNjZXNzIGNvbnRyb2wgcmVzb3VyY2VzIn0sCisJezB4NTUwNiwgIkF1eGlsaWFyeSBtZW1vcnkgb3V0IG9mIHNwYWNlIn0sCisJezB4NTUwNywgIlF1b3RhIGVycm9yIn0sCisKKwl7MHg1NzAwLCAiVW5hYmxlIHRvIHJlY292ZXIgdGFibGUtb2YtY29udGVudHMifSwKKworCXsweDU4MDAsICJHZW5lcmF0aW9uIGRvZXMgbm90IGV4aXN0In0sCisKKwl7MHg1OTAwLCAiVXBkYXRlZCBibG9jayByZWFkIn0sCisKKwl7MHg1QTAwLCAiT3BlcmF0b3IgcmVxdWVzdCBvciBzdGF0ZSBjaGFuZ2UgaW5wdXQifSwKKwl7MHg1QTAxLCAiT3BlcmF0b3IgbWVkaXVtIHJlbW92YWwgcmVxdWVzdCJ9LAorCXsweDVBMDIsICJPcGVyYXRvciBzZWxlY3RlZCB3cml0ZSBwcm90ZWN0In0sCisJezB4NUEwMywgIk9wZXJhdG9yIHNlbGVjdGVkIHdyaXRlIHBlcm1pdCJ9LAorCisJezB4NUIwMCwgIkxvZyBleGNlcHRpb24ifSwKKwl7MHg1QjAxLCAiVGhyZXNob2xkIGNvbmRpdGlvbiBtZXQifSwKKwl7MHg1QjAyLCAiTG9nIGNvdW50ZXIgYXQgbWF4aW11bSJ9LAorCXsweDVCMDMsICJMb2cgbGlzdCBjb2RlcyBleGhhdXN0ZWQifSwKKworCXsweDVDMDAsICJScGwgc3RhdHVzIGNoYW5nZSJ9LAorCXsweDVDMDEsICJTcGluZGxlcyBzeW5jaHJvbml6ZWQifSwKKwl7MHg1QzAyLCAiU3BpbmRsZXMgbm90IHN5bmNocm9uaXplZCJ9LAorCisJezB4NUQwMCwgIkZhaWx1cmUgcHJlZGljdGlvbiB0aHJlc2hvbGQgZXhjZWVkZWQifSwKKwl7MHg1RDAxLCAiTWVkaWEgZmFpbHVyZSBwcmVkaWN0aW9uIHRocmVzaG9sZCBleGNlZWRlZCJ9LAorCXsweDVEMDIsICJMb2dpY2FsIHVuaXQgZmFpbHVyZSBwcmVkaWN0aW9uIHRocmVzaG9sZCBleGNlZWRlZCJ9LAorCXsweDVEMDMsICJTcGFyZSBhcmVhIGV4aGF1c3Rpb24gcHJlZGljdGlvbiB0aHJlc2hvbGQgZXhjZWVkZWQifSwKKwl7MHg1RDEwLCAiSGFyZHdhcmUgaW1wZW5kaW5nIGZhaWx1cmUgZ2VuZXJhbCBoYXJkIGRyaXZlIGZhaWx1cmUifSwKKwl7MHg1RDExLCAiSGFyZHdhcmUgaW1wZW5kaW5nIGZhaWx1cmUgZHJpdmUgZXJyb3IgcmF0ZSB0b28gaGlnaCJ9LAorCXsweDVEMTIsICJIYXJkd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBkYXRhIGVycm9yIHJhdGUgdG9vIGhpZ2gifSwKKwl7MHg1RDEzLCAiSGFyZHdhcmUgaW1wZW5kaW5nIGZhaWx1cmUgc2VlayBlcnJvciByYXRlIHRvbyBoaWdoIn0sCisJezB4NUQxNCwgIkhhcmR3YXJlIGltcGVuZGluZyBmYWlsdXJlIHRvbyBtYW55IGJsb2NrIHJlYXNzaWducyJ9LAorCXsweDVEMTUsICJIYXJkd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBhY2Nlc3MgdGltZXMgdG9vIGhpZ2gifSwKKwl7MHg1RDE2LCAiSGFyZHdhcmUgaW1wZW5kaW5nIGZhaWx1cmUgc3RhcnQgdW5pdCB0aW1lcyB0b28gaGlnaCJ9LAorCXsweDVEMTcsICJIYXJkd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBjaGFubmVsIHBhcmFtZXRyaWNzIn0sCisJezB4NUQxOCwgIkhhcmR3YXJlIGltcGVuZGluZyBmYWlsdXJlIGNvbnRyb2xsZXIgZGV0ZWN0ZWQifSwKKwl7MHg1RDE5LCAiSGFyZHdhcmUgaW1wZW5kaW5nIGZhaWx1cmUgdGhyb3VnaHB1dCBwZXJmb3JtYW5jZSJ9LAorCXsweDVEMUEsICJIYXJkd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBzZWVrIHRpbWUgcGVyZm9ybWFuY2UifSwKKwl7MHg1RDFCLCAiSGFyZHdhcmUgaW1wZW5kaW5nIGZhaWx1cmUgc3Bpbi11cCByZXRyeSBjb3VudCJ9LAorCXsweDVEMUMsICJIYXJkd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBkcml2ZSBjYWxpYnJhdGlvbiByZXRyeSBjb3VudCJ9LAorCXsweDVEMjAsICJDb250cm9sbGVyIGltcGVuZGluZyBmYWlsdXJlIGdlbmVyYWwgaGFyZCBkcml2ZSBmYWlsdXJlIn0sCisJezB4NUQyMSwgIkNvbnRyb2xsZXIgaW1wZW5kaW5nIGZhaWx1cmUgZHJpdmUgZXJyb3IgcmF0ZSB0b28gaGlnaCJ9LAorCXsweDVEMjIsICJDb250cm9sbGVyIGltcGVuZGluZyBmYWlsdXJlIGRhdGEgZXJyb3IgcmF0ZSB0b28gaGlnaCJ9LAorCXsweDVEMjMsICJDb250cm9sbGVyIGltcGVuZGluZyBmYWlsdXJlIHNlZWsgZXJyb3IgcmF0ZSB0b28gaGlnaCJ9LAorCXsweDVEMjQsICJDb250cm9sbGVyIGltcGVuZGluZyBmYWlsdXJlIHRvbyBtYW55IGJsb2NrIHJlYXNzaWducyJ9LAorCXsweDVEMjUsICJDb250cm9sbGVyIGltcGVuZGluZyBmYWlsdXJlIGFjY2VzcyB0aW1lcyB0b28gaGlnaCJ9LAorCXsweDVEMjYsICJDb250cm9sbGVyIGltcGVuZGluZyBmYWlsdXJlIHN0YXJ0IHVuaXQgdGltZXMgdG9vIGhpZ2gifSwKKwl7MHg1RDI3LCAiQ29udHJvbGxlciBpbXBlbmRpbmcgZmFpbHVyZSBjaGFubmVsIHBhcmFtZXRyaWNzIn0sCisJezB4NUQyOCwgIkNvbnRyb2xsZXIgaW1wZW5kaW5nIGZhaWx1cmUgY29udHJvbGxlciBkZXRlY3RlZCJ9LAorCXsweDVEMjksICJDb250cm9sbGVyIGltcGVuZGluZyBmYWlsdXJlIHRocm91Z2hwdXQgcGVyZm9ybWFuY2UifSwKKwl7MHg1RDJBLCAiQ29udHJvbGxlciBpbXBlbmRpbmcgZmFpbHVyZSBzZWVrIHRpbWUgcGVyZm9ybWFuY2UifSwKKwl7MHg1RDJCLCAiQ29udHJvbGxlciBpbXBlbmRpbmcgZmFpbHVyZSBzcGluLXVwIHJldHJ5IGNvdW50In0sCisJezB4NUQyQywgIkNvbnRyb2xsZXIgaW1wZW5kaW5nIGZhaWx1cmUgZHJpdmUgY2FsaWJyYXRpb24gcmV0cnkgY291bnQifSwKKwl7MHg1RDMwLCAiRGF0YSBjaGFubmVsIGltcGVuZGluZyBmYWlsdXJlIGdlbmVyYWwgaGFyZCBkcml2ZSBmYWlsdXJlIn0sCisJezB4NUQzMSwgIkRhdGEgY2hhbm5lbCBpbXBlbmRpbmcgZmFpbHVyZSBkcml2ZSBlcnJvciByYXRlIHRvbyBoaWdoIn0sCisJezB4NUQzMiwgIkRhdGEgY2hhbm5lbCBpbXBlbmRpbmcgZmFpbHVyZSBkYXRhIGVycm9yIHJhdGUgdG9vIGhpZ2gifSwKKwl7MHg1RDMzLCAiRGF0YSBjaGFubmVsIGltcGVuZGluZyBmYWlsdXJlIHNlZWsgZXJyb3IgcmF0ZSB0b28gaGlnaCJ9LAorCXsweDVEMzQsICJEYXRhIGNoYW5uZWwgaW1wZW5kaW5nIGZhaWx1cmUgdG9vIG1hbnkgYmxvY2sgcmVhc3NpZ25zIn0sCisJezB4NUQzNSwgIkRhdGEgY2hhbm5lbCBpbXBlbmRpbmcgZmFpbHVyZSBhY2Nlc3MgdGltZXMgdG9vIGhpZ2gifSwKKwl7MHg1RDM2LCAiRGF0YSBjaGFubmVsIGltcGVuZGluZyBmYWlsdXJlIHN0YXJ0IHVuaXQgdGltZXMgdG9vIGhpZ2gifSwKKwl7MHg1RDM3LCAiRGF0YSBjaGFubmVsIGltcGVuZGluZyBmYWlsdXJlIGNoYW5uZWwgcGFyYW1ldHJpY3MifSwKKwl7MHg1RDM4LCAiRGF0YSBjaGFubmVsIGltcGVuZGluZyBmYWlsdXJlIGNvbnRyb2xsZXIgZGV0ZWN0ZWQifSwKKwl7MHg1RDM5LCAiRGF0YSBjaGFubmVsIGltcGVuZGluZyBmYWlsdXJlIHRocm91Z2hwdXQgcGVyZm9ybWFuY2UifSwKKwl7MHg1RDNBLCAiRGF0YSBjaGFubmVsIGltcGVuZGluZyBmYWlsdXJlIHNlZWsgdGltZSBwZXJmb3JtYW5jZSJ9LAorCXsweDVEM0IsICJEYXRhIGNoYW5uZWwgaW1wZW5kaW5nIGZhaWx1cmUgc3Bpbi11cCByZXRyeSBjb3VudCJ9LAorCXsweDVEM0MsICJEYXRhIGNoYW5uZWwgaW1wZW5kaW5nIGZhaWx1cmUgZHJpdmUgY2FsaWJyYXRpb24gcmV0cnkgIgorCSAiY291bnQifSwKKwl7MHg1RDQwLCAiU2Vydm8gaW1wZW5kaW5nIGZhaWx1cmUgZ2VuZXJhbCBoYXJkIGRyaXZlIGZhaWx1cmUifSwKKwl7MHg1RDQxLCAiU2Vydm8gaW1wZW5kaW5nIGZhaWx1cmUgZHJpdmUgZXJyb3IgcmF0ZSB0b28gaGlnaCJ9LAorCXsweDVENDIsICJTZXJ2byBpbXBlbmRpbmcgZmFpbHVyZSBkYXRhIGVycm9yIHJhdGUgdG9vIGhpZ2gifSwKKwl7MHg1RDQzLCAiU2Vydm8gaW1wZW5kaW5nIGZhaWx1cmUgc2VlayBlcnJvciByYXRlIHRvbyBoaWdoIn0sCisJezB4NUQ0NCwgIlNlcnZvIGltcGVuZGluZyBmYWlsdXJlIHRvbyBtYW55IGJsb2NrIHJlYXNzaWducyJ9LAorCXsweDVENDUsICJTZXJ2byBpbXBlbmRpbmcgZmFpbHVyZSBhY2Nlc3MgdGltZXMgdG9vIGhpZ2gifSwKKwl7MHg1RDQ2LCAiU2Vydm8gaW1wZW5kaW5nIGZhaWx1cmUgc3RhcnQgdW5pdCB0aW1lcyB0b28gaGlnaCJ9LAorCXsweDVENDcsICJTZXJ2byBpbXBlbmRpbmcgZmFpbHVyZSBjaGFubmVsIHBhcmFtZXRyaWNzIn0sCisJezB4NUQ0OCwgIlNlcnZvIGltcGVuZGluZyBmYWlsdXJlIGNvbnRyb2xsZXIgZGV0ZWN0ZWQifSwKKwl7MHg1RDQ5LCAiU2Vydm8gaW1wZW5kaW5nIGZhaWx1cmUgdGhyb3VnaHB1dCBwZXJmb3JtYW5jZSJ9LAorCXsweDVENEEsICJTZXJ2byBpbXBlbmRpbmcgZmFpbHVyZSBzZWVrIHRpbWUgcGVyZm9ybWFuY2UifSwKKwl7MHg1RDRCLCAiU2Vydm8gaW1wZW5kaW5nIGZhaWx1cmUgc3Bpbi11cCByZXRyeSBjb3VudCJ9LAorCXsweDVENEMsICJTZXJ2byBpbXBlbmRpbmcgZmFpbHVyZSBkcml2ZSBjYWxpYnJhdGlvbiByZXRyeSBjb3VudCJ9LAorCXsweDVENTAsICJTcGluZGxlIGltcGVuZGluZyBmYWlsdXJlIGdlbmVyYWwgaGFyZCBkcml2ZSBmYWlsdXJlIn0sCisJezB4NUQ1MSwgIlNwaW5kbGUgaW1wZW5kaW5nIGZhaWx1cmUgZHJpdmUgZXJyb3IgcmF0ZSB0b28gaGlnaCJ9LAorCXsweDVENTIsICJTcGluZGxlIGltcGVuZGluZyBmYWlsdXJlIGRhdGEgZXJyb3IgcmF0ZSB0b28gaGlnaCJ9LAorCXsweDVENTMsICJTcGluZGxlIGltcGVuZGluZyBmYWlsdXJlIHNlZWsgZXJyb3IgcmF0ZSB0b28gaGlnaCJ9LAorCXsweDVENTQsICJTcGluZGxlIGltcGVuZGluZyBmYWlsdXJlIHRvbyBtYW55IGJsb2NrIHJlYXNzaWducyJ9LAorCXsweDVENTUsICJTcGluZGxlIGltcGVuZGluZyBmYWlsdXJlIGFjY2VzcyB0aW1lcyB0b28gaGlnaCJ9LAorCXsweDVENTYsICJTcGluZGxlIGltcGVuZGluZyBmYWlsdXJlIHN0YXJ0IHVuaXQgdGltZXMgdG9vIGhpZ2gifSwKKwl7MHg1RDU3LCAiU3BpbmRsZSBpbXBlbmRpbmcgZmFpbHVyZSBjaGFubmVsIHBhcmFtZXRyaWNzIn0sCisJezB4NUQ1OCwgIlNwaW5kbGUgaW1wZW5kaW5nIGZhaWx1cmUgY29udHJvbGxlciBkZXRlY3RlZCJ9LAorCXsweDVENTksICJTcGluZGxlIGltcGVuZGluZyBmYWlsdXJlIHRocm91Z2hwdXQgcGVyZm9ybWFuY2UifSwKKwl7MHg1RDVBLCAiU3BpbmRsZSBpbXBlbmRpbmcgZmFpbHVyZSBzZWVrIHRpbWUgcGVyZm9ybWFuY2UifSwKKwl7MHg1RDVCLCAiU3BpbmRsZSBpbXBlbmRpbmcgZmFpbHVyZSBzcGluLXVwIHJldHJ5IGNvdW50In0sCisJezB4NUQ1QywgIlNwaW5kbGUgaW1wZW5kaW5nIGZhaWx1cmUgZHJpdmUgY2FsaWJyYXRpb24gcmV0cnkgY291bnQifSwKKwl7MHg1RDYwLCAiRmlybXdhcmUgaW1wZW5kaW5nIGZhaWx1cmUgZ2VuZXJhbCBoYXJkIGRyaXZlIGZhaWx1cmUifSwKKwl7MHg1RDYxLCAiRmlybXdhcmUgaW1wZW5kaW5nIGZhaWx1cmUgZHJpdmUgZXJyb3IgcmF0ZSB0b28gaGlnaCJ9LAorCXsweDVENjIsICJGaXJtd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBkYXRhIGVycm9yIHJhdGUgdG9vIGhpZ2gifSwKKwl7MHg1RDYzLCAiRmlybXdhcmUgaW1wZW5kaW5nIGZhaWx1cmUgc2VlayBlcnJvciByYXRlIHRvbyBoaWdoIn0sCisJezB4NUQ2NCwgIkZpcm13YXJlIGltcGVuZGluZyBmYWlsdXJlIHRvbyBtYW55IGJsb2NrIHJlYXNzaWducyJ9LAorCXsweDVENjUsICJGaXJtd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBhY2Nlc3MgdGltZXMgdG9vIGhpZ2gifSwKKwl7MHg1RDY2LCAiRmlybXdhcmUgaW1wZW5kaW5nIGZhaWx1cmUgc3RhcnQgdW5pdCB0aW1lcyB0b28gaGlnaCJ9LAorCXsweDVENjcsICJGaXJtd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBjaGFubmVsIHBhcmFtZXRyaWNzIn0sCisJezB4NUQ2OCwgIkZpcm13YXJlIGltcGVuZGluZyBmYWlsdXJlIGNvbnRyb2xsZXIgZGV0ZWN0ZWQifSwKKwl7MHg1RDY5LCAiRmlybXdhcmUgaW1wZW5kaW5nIGZhaWx1cmUgdGhyb3VnaHB1dCBwZXJmb3JtYW5jZSJ9LAorCXsweDVENkEsICJGaXJtd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBzZWVrIHRpbWUgcGVyZm9ybWFuY2UifSwKKwl7MHg1RDZCLCAiRmlybXdhcmUgaW1wZW5kaW5nIGZhaWx1cmUgc3Bpbi11cCByZXRyeSBjb3VudCJ9LAorCXsweDVENkMsICJGaXJtd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBkcml2ZSBjYWxpYnJhdGlvbiByZXRyeSBjb3VudCJ9LAorCXsweDVERkYsICJGYWlsdXJlIHByZWRpY3Rpb24gdGhyZXNob2xkIGV4Y2VlZGVkIChmYWxzZSkifSwKKworCXsweDVFMDAsICJMb3cgcG93ZXIgY29uZGl0aW9uIG9uIn0sCisJezB4NUUwMSwgIklkbGUgY29uZGl0aW9uIGFjdGl2YXRlZCBieSB0aW1lciJ9LAorCXsweDVFMDIsICJTdGFuZGJ5IGNvbmRpdGlvbiBhY3RpdmF0ZWQgYnkgdGltZXIifSwKKwl7MHg1RTAzLCAiSWRsZSBjb25kaXRpb24gYWN0aXZhdGVkIGJ5IGNvbW1hbmQifSwKKwl7MHg1RTA0LCAiU3RhbmRieSBjb25kaXRpb24gYWN0aXZhdGVkIGJ5IGNvbW1hbmQifSwKKwl7MHg1RTQxLCAiUG93ZXIgc3RhdGUgY2hhbmdlIHRvIGFjdGl2ZSJ9LAorCXsweDVFNDIsICJQb3dlciBzdGF0ZSBjaGFuZ2UgdG8gaWRsZSJ9LAorCXsweDVFNDMsICJQb3dlciBzdGF0ZSBjaGFuZ2UgdG8gc3RhbmRieSJ9LAorCXsweDVFNDUsICJQb3dlciBzdGF0ZSBjaGFuZ2UgdG8gc2xlZXAifSwKKwl7MHg1RTQ3LCAiUG93ZXIgc3RhdGUgY2hhbmdlIHRvIGRldmljZSBjb250cm9sIn0sCisKKwl7MHg2MDAwLCAiTGFtcCBmYWlsdXJlIn0sCisKKwl7MHg2MTAwLCAiVmlkZW8gYWNxdWlzaXRpb24gZXJyb3IifSwKKwl7MHg2MTAxLCAiVW5hYmxlIHRvIGFjcXVpcmUgdmlkZW8ifSwKKwl7MHg2MTAyLCAiT3V0IG9mIGZvY3VzIn0sCisKKwl7MHg2MjAwLCAiU2NhbiBoZWFkIHBvc2l0aW9uaW5nIGVycm9yIn0sCisKKwl7MHg2MzAwLCAiRW5kIG9mIHVzZXIgYXJlYSBlbmNvdW50ZXJlZCBvbiB0aGlzIHRyYWNrIn0sCisJezB4NjMwMSwgIlBhY2tldCBkb2VzIG5vdCBmaXQgaW4gYXZhaWxhYmxlIHNwYWNlIn0sCisKKwl7MHg2NDAwLCAiSWxsZWdhbCBtb2RlIGZvciB0aGlzIHRyYWNrIn0sCisJezB4NjQwMSwgIkludmFsaWQgcGFja2V0IHNpemUifSwKKworCXsweDY1MDAsICJWb2x0YWdlIGZhdWx0In0sCisKKwl7MHg2NjAwLCAiQXV0b21hdGljIGRvY3VtZW50IGZlZWRlciBjb3ZlciB1cCJ9LAorCXsweDY2MDEsICJBdXRvbWF0aWMgZG9jdW1lbnQgZmVlZGVyIGxpZnQgdXAifSwKKwl7MHg2NjAyLCAiRG9jdW1lbnQgamFtIGluIGF1dG9tYXRpYyBkb2N1bWVudCBmZWVkZXIifSwKKwl7MHg2NjAzLCAiRG9jdW1lbnQgbWlzcyBmZWVkIGF1dG9tYXRpYyBpbiBkb2N1bWVudCBmZWVkZXIifSwKKworCXsweDY3MDAsICJDb25maWd1cmF0aW9uIGZhaWx1cmUifSwKKwl7MHg2NzAxLCAiQ29uZmlndXJhdGlvbiBvZiBpbmNhcGFibGUgbG9naWNhbCB1bml0cyBmYWlsZWQifSwKKwl7MHg2NzAyLCAiQWRkIGxvZ2ljYWwgdW5pdCBmYWlsZWQifSwKKwl7MHg2NzAzLCAiTW9kaWZpY2F0aW9uIG9mIGxvZ2ljYWwgdW5pdCBmYWlsZWQifSwKKwl7MHg2NzA0LCAiRXhjaGFuZ2Ugb2YgbG9naWNhbCB1bml0IGZhaWxlZCJ9LAorCXsweDY3MDUsICJSZW1vdmUgb2YgbG9naWNhbCB1bml0IGZhaWxlZCJ9LAorCXsweDY3MDYsICJBdHRhY2htZW50IG9mIGxvZ2ljYWwgdW5pdCBmYWlsZWQifSwKKwl7MHg2NzA3LCAiQ3JlYXRpb24gb2YgbG9naWNhbCB1bml0IGZhaWxlZCJ9LAorCXsweDY3MDgsICJBc3NpZ24gZmFpbHVyZSBvY2N1cnJlZCJ9LAorCXsweDY3MDksICJNdWx0aXBseSBhc3NpZ25lZCBsb2dpY2FsIHVuaXQifSwKKwl7MHg2NzBBLCAiU2V0IHRhcmdldCBwb3J0IGdyb3VwcyBjb21tYW5kIGZhaWxlZCJ9LAorCisJezB4NjgwMCwgIkxvZ2ljYWwgdW5pdCBub3QgY29uZmlndXJlZCJ9LAorCisJezB4NjkwMCwgIkRhdGEgbG9zcyBvbiBsb2dpY2FsIHVuaXQifSwKKwl7MHg2OTAxLCAiTXVsdGlwbGUgbG9naWNhbCB1bml0IGZhaWx1cmVzIn0sCisJezB4NjkwMiwgIlBhcml0eS9kYXRhIG1pc21hdGNoIn0sCisKKwl7MHg2QTAwLCAiSW5mb3JtYXRpb25hbCwgcmVmZXIgdG8gbG9nIn0sCisKKwl7MHg2QjAwLCAiU3RhdGUgY2hhbmdlIGhhcyBvY2N1cnJlZCJ9LAorCXsweDZCMDEsICJSZWR1bmRhbmN5IGxldmVsIGdvdCBiZXR0ZXIifSwKKwl7MHg2QjAyLCAiUmVkdW5kYW5jeSBsZXZlbCBnb3Qgd29yc2UifSwKKworCXsweDZDMDAsICJSZWJ1aWxkIGZhaWx1cmUgb2NjdXJyZWQifSwKKworCXsweDZEMDAsICJSZWNhbGN1bGF0ZSBmYWlsdXJlIG9jY3VycmVkIn0sCisKKwl7MHg2RTAwLCAiQ29tbWFuZCB0byBsb2dpY2FsIHVuaXQgZmFpbGVkIn0sCisKKwl7MHg2RjAwLCAiQ29weSBwcm90ZWN0aW9uIGtleSBleGNoYW5nZSBmYWlsdXJlIC0gYXV0aGVudGljYXRpb24gIgorCSAiZmFpbHVyZSJ9LAorCXsweDZGMDEsICJDb3B5IHByb3RlY3Rpb24ga2V5IGV4Y2hhbmdlIGZhaWx1cmUgLSBrZXkgbm90IHByZXNlbnQifSwKKwl7MHg2RjAyLCAiQ29weSBwcm90ZWN0aW9uIGtleSBleGNoYW5nZSBmYWlsdXJlIC0ga2V5IG5vdCBlc3RhYmxpc2hlZCJ9LAorCXsweDZGMDMsICJSZWFkIG9mIHNjcmFtYmxlZCBzZWN0b3Igd2l0aG91dCBhdXRoZW50aWNhdGlvbiJ9LAorCXsweDZGMDQsICJNZWRpYSByZWdpb24gY29kZSBpcyBtaXNtYXRjaGVkIHRvIGxvZ2ljYWwgdW5pdCByZWdpb24ifSwKKwl7MHg2RjA1LCAiRHJpdmUgcmVnaW9uIG11c3QgYmUgcGVybWFuZW50L3JlZ2lvbiByZXNldCBjb3VudCBlcnJvciJ9LAorLyoKKyAqCXsweDcwTk4sICJEZWNvbXByZXNzaW9uIGV4Y2VwdGlvbiBzaG9ydCBhbGdvcml0aG0gaWQgb2Ygbm4ifSwKKyAqLworCXsweDcxMDAsICJEZWNvbXByZXNzaW9uIGV4Y2VwdGlvbiBsb25nIGFsZ29yaXRobSBpZCJ9LAorCisJezB4NzIwMCwgIlNlc3Npb24gZml4YXRpb24gZXJyb3IifSwKKwl7MHg3MjAxLCAiU2Vzc2lvbiBmaXhhdGlvbiBlcnJvciB3cml0aW5nIGxlYWQtaW4ifSwKKwl7MHg3MjAyLCAiU2Vzc2lvbiBmaXhhdGlvbiBlcnJvciB3cml0aW5nIGxlYWQtb3V0In0sCisJezB4NzIwMywgIlNlc3Npb24gZml4YXRpb24gZXJyb3IgLSBpbmNvbXBsZXRlIHRyYWNrIGluIHNlc3Npb24ifSwKKwl7MHg3MjA0LCAiRW1wdHkgb3IgcGFydGlhbGx5IHdyaXR0ZW4gcmVzZXJ2ZWQgdHJhY2sifSwKKwl7MHg3MjA1LCAiTm8gbW9yZSB0cmFjayByZXNlcnZhdGlvbnMgYWxsb3dlZCJ9LAorCisJezB4NzMwMCwgIkNkIGNvbnRyb2wgZXJyb3IifSwKKwl7MHg3MzAxLCAiUG93ZXIgY2FsaWJyYXRpb24gYXJlYSBhbG1vc3QgZnVsbCJ9LAorCXsweDczMDIsICJQb3dlciBjYWxpYnJhdGlvbiBhcmVhIGlzIGZ1bGwifSwKKwl7MHg3MzAzLCAiUG93ZXIgY2FsaWJyYXRpb24gYXJlYSBlcnJvciJ9LAorCXsweDczMDQsICJQcm9ncmFtIG1lbW9yeSBhcmVhIHVwZGF0ZSBmYWlsdXJlIn0sCisJezB4NzMwNSwgIlByb2dyYW0gbWVtb3J5IGFyZWEgaXMgZnVsbCJ9LAorCXsweDczMDYsICJSTUEvUE1BIGlzIGFsbW9zdCBmdWxsIn0sCisJezAsIE5VTEx9Cit9OworCitzdHJ1Y3QgZXJyb3JfaW5mbzIgeworCXVuc2lnbmVkIGNoYXIgY29kZTEsIGNvZGUyX21pbiwgY29kZTJfbWF4OworCWNvbnN0IGNoYXIgKiBmbXQ7Cit9OworCitzdGF0aWMgc3RydWN0IGVycm9yX2luZm8yIGFkZGl0aW9uYWwyW10gPQoreworCXsweDQwLDB4MDAsMHg3ZiwiUmFtIGZhaWx1cmUgKCV4KSJ9LAorCXsweDQwLDB4ODAsMHhmZiwiRGlhZ25vc3RpYyBmYWlsdXJlIG9uIGNvbXBvbmVudCAoJXgpIn0sCisJezB4NDEsMHgwMCwweGZmLCJEYXRhIHBhdGggZmFpbHVyZSAoJXgpIn0sCisJezB4NDIsMHgwMCwweGZmLCJQb3dlci1vbiBvciBzZWxmLXRlc3QgZmFpbHVyZSAoJXgpIn0sCisJezB4NEQsMHgwMCwweGZmLCJUYWdnZWQgb3ZlcmxhcHBlZCBjb21tYW5kcyAocXVldWUgdGFnICV4KSJ9LAorCXsweDcwLDB4MDAsMHhmZiwiRGVjb21wcmVzc2lvbiBleGNlcHRpb24gc2hvcnQgYWxnb3JpdGhtIGlkIG9mICV4In0sCisJezAsIDAsIDAsIE5VTEx9Cit9OworCisvKiBkZXNjcmlwdGlvbiBvZiB0aGUgc2Vuc2Uga2V5IHZhbHVlcyAqLworc3RhdGljIGNvbnN0IGNoYXIgKnNuc3RleHRbXSA9IHsKKwkiTm8gU2Vuc2UiLAkgICAgLyogMDogVGhlcmUgaXMgbm8gc2Vuc2UgaW5mb3JtYXRpb24gKi8KKwkiUmVjb3ZlcmVkIEVycm9yIiwgIC8qIDE6IFRoZSBsYXN0IGNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorCQkJCSAgYnV0IHVzZWQgZXJyb3IgY29ycmVjdGlvbiAqLworCSJOb3QgUmVhZHkiLAkgICAgLyogMjogVGhlIGFkZHJlc3NlZCB0YXJnZXQgaXMgbm90IHJlYWR5ICovCisJIk1lZGl1bSBFcnJvciIsCSAgICAvKiAzOiBEYXRhIGVycm9yIGRldGVjdGVkIG9uIHRoZSBtZWRpdW0gKi8KKwkiSGFyZHdhcmUgRXJyb3IiLCAgIC8qIDQ6IENvbnRyb2xsZXIgb3IgZGV2aWNlIGZhaWx1cmUgKi8KKwkiSWxsZWdhbCBSZXF1ZXN0IiwgIC8qIDU6IEVycm9yIGluIHJlcXVlc3QgKi8KKwkiVW5pdCBBdHRlbnRpb24iLCAgIC8qIDY6IFJlbW92YWJsZSBtZWRpdW0gd2FzIGNoYW5nZWQsIG9yCisJCQkJICB0aGUgdGFyZ2V0IGhhcyBiZWVuIHJlc2V0LCBvciAuLi4gKi8KKwkiRGF0YSBQcm90ZWN0IiwJICAgIC8qIDc6IEFjY2VzcyB0byB0aGUgZGF0YSBpcyBibG9ja2VkICovCisJIkJsYW5rIENoZWNrIiwJICAgIC8qIDg6IFJlYWNoZWQgdW5leHBlY3RlZCB3cml0dGVuIG9yIHVud3JpdHRlbgorCQkJCSAgcmVnaW9uIG9mIHRoZSBtZWRpdW0gKi8KKwkiVmVuZG9yIFNwZWNpZmljKDkpIiwKKwkiQ29weSBBYm9ydGVkIiwJICAgIC8qIEE6IENPUFkgb3IgQ09NUEFSRSB3YXMgYWJvcnRlZCAqLworCSJBYm9ydGVkIENvbW1hbmQiLCAgLyogQjogVGhlIHRhcmdldCBhYm9ydGVkIHRoZSBjb21tYW5kICovCisJIkVxdWFsIiwJICAgIC8qIEM6IEEgU0VBUkNIIERBVEEgY29tbWFuZCBmb3VuZCBkYXRhIGVxdWFsICovCisJIlZvbHVtZSBPdmVyZmxvdyIsICAvKiBEOiBNZWRpdW0gZnVsbCB3aXRoIHN0aWxsIGRhdGEgdG8gYmUgd3JpdHRlbiAqLworCSJNaXNjb21wYXJlIiwJICAgIC8qIEU6IFNvdXJjZSBkYXRhIGFuZCBkYXRhIG9uIHRoZSBtZWRpdW0KKwkJCQkgIGRvIG5vdCBhZ3JlZSAqLworfTsKKyNlbmRpZgorCisvKiBHZXQgc2Vuc2Uga2V5IHN0cmluZyBvciBOVUxMIGlmIG5vdCBhdmFpbGFibGUgKi8KK2NvbnN0IGNoYXIgKgorc2NzaV9zZW5zZV9rZXlfc3RyaW5nKHVuc2lnbmVkIGNoYXIga2V5KSB7CisjaWZkZWYgQ09ORklHX1NDU0lfQ09OU1RBTlRTCisJaWYgKGtleSA8PSAweEUpCisJCXJldHVybiBzbnN0ZXh0W2tleV07CisjZW5kaWYKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9zZW5zZV9rZXlfc3RyaW5nKTsKKworLyoKKyAqIEdldCBhZGRpdGlvbmFsIHNlbnNlIGNvZGUgc3RyaW5nIG9yIE5VTEwgaWYgbm90IGF2YWlsYWJsZS4KKyAqIFRoaXMgc3RyaW5nIG1heSBjb250YWluIGEgIiV4IiBhbmQgc2hvdWxkIGJlIHByaW50ZWQgd2l0aCBhc2NxIGFzIGFyZy4KKyAqLworY29uc3QgY2hhciAqCitzY3NpX2V4dGRfc2Vuc2VfZm9ybWF0KHVuc2lnbmVkIGNoYXIgYXNjLCB1bnNpZ25lZCBjaGFyIGFzY3EpIHsKKyNpZmRlZiBDT05GSUdfU0NTSV9DT05TVEFOVFMKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCBjb2RlID0gKChhc2MgPDwgOCkgfCBhc2NxKTsKKworCWZvciAoaT0wOyBhZGRpdGlvbmFsW2ldLnRleHQ7IGkrKykKKwkJaWYgKGFkZGl0aW9uYWxbaV0uY29kZTEyID09IGNvZGUpCisJCQlyZXR1cm4gYWRkaXRpb25hbFtpXS50ZXh0OworCWZvciAoaT0wOyBhZGRpdGlvbmFsMltpXS5mbXQ7IGkrKykKKwkJaWYgKGFkZGl0aW9uYWwyW2ldLmNvZGUxID09IGFzYyAmJgorCQkgICAgYWRkaXRpb25hbDJbaV0uY29kZTJfbWluID49IGFzY3EgJiYKKwkJICAgIGFkZGl0aW9uYWwyW2ldLmNvZGUyX21heCA8PSBhc2NxKQorCQkJcmV0dXJuIGFkZGl0aW9uYWwyW2ldLmZtdDsKKyNlbmRpZgorCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChzY3NpX2V4dGRfc2Vuc2VfZm9ybWF0KTsKKworLyogUHJpbnQgZXh0ZW5kZWQgc2Vuc2UgaW5mb3JtYXRpb247IG5vIGxlYWRpbiwgbm8gbGluZWZlZWQgKi8KK3N0YXRpYyB2b2lkCitzY3NpX3Nob3dfZXh0ZF9zZW5zZSh1bnNpZ25lZCBjaGFyIGFzYywgdW5zaWduZWQgY2hhciBhc2NxKQoreworCWNvbnN0IGNoYXIgKmV4dGRfc2Vuc2VfZm10ID0gc2NzaV9leHRkX3NlbnNlX2Zvcm1hdChhc2MsIGFzY3EpOworCisJaWYgKGV4dGRfc2Vuc2VfZm10KSB7CisJCWlmIChzdHJzdHIoZXh0ZF9zZW5zZV9mbXQsICIleCIpKSB7CisJCQlwcmludGsoIkFkZGl0aW9uYWwgc2Vuc2U6ICIpOworCQkJcHJpbnRrKGV4dGRfc2Vuc2VfZm10LCBhc2NxKTsKKwkJfSBlbHNlCisJCQlwcmludGsoIkFkZGl0aW9uYWwgc2Vuc2U6ICVzIiwgZXh0ZF9zZW5zZV9mbXQpOworCX0gZWxzZSB7CisJCWlmIChhc2MgPj0gMHg4MCkKKwkJCXByaW50aygiPDx2ZW5kb3I+PiBBU0M9MHgleCBBU0NRPTB4JXgiLCBhc2MsIGFzY3EpOworCQlpZiAoYXNjcSA+PSAweDgwKQorCQkJcHJpbnRrKCJBU0M9MHgleCA8PHZlbmRvcj4+IEFTQ1E9MHgleCIsIGFzYywgYXNjcSk7CisJCWVsc2UKKwkJCXByaW50aygiQVNDPTB4JXggQVNDUT0weCV4IiwgYXNjLCBhc2NxKTsKKwl9Cit9CisKKy8qIFByaW50IHNlbnNlIGluZm9ybWF0aW9uICovCit2b2lkCitfX3Njc2lfcHJpbnRfc2Vuc2UoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2Vuc2VfYnVmZmVyLAorCQkgICBpbnQgc2Vuc2VfbGVuKQoreworCWludCBrLCBudW0sIHJlczsKKwl1bnNpZ25lZCBpbnQgaW5mbzsKKwljb25zdCBjaGFyICplcnJvcjsKKwljb25zdCBjaGFyICpzZW5zZV90eHQ7CisJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaDsKKyAgICAKKwlyZXMgPSBzY3NpX25vcm1hbGl6ZV9zZW5zZShzZW5zZV9idWZmZXIsIHNlbnNlX2xlbiwgJnNzaCk7CisJaWYgKDAgPT0gcmVzKSB7CisJCS8qIHRoaXMgbWF5IGJlIFNDU0ktMSBzZW5zZSBkYXRhICovCisJCW51bSA9IChzZW5zZV9sZW4gPCAzMikgPyBzZW5zZV9sZW4gOiAzMjsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVW5yZWNvZ25pemVkIHNlbnNlIGRhdGEgKGluIGhleCk6Iik7CisJCWZvciAoayA9IDA7IGsgPCBudW07ICsraykgeworCQkJaWYgKDAgPT0gKGsgJSAxNikpIHsKKwkJCQlwcmludGsoIlxuIik7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICAiKTsKKwkJCX0KKwkJCXByaW50aygiJTAyeCAiLCBzZW5zZV9idWZmZXJba10pOworCQl9CisJCXByaW50aygiXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFuIGV4YW1wbGUgb2YgZGVmZXJyZWQgaXMgd2hlbiBhbiBlYXJsaWVyIHdyaXRlIHRvIGRpc2sgY2FjaGUKKwkgKiBzdWNjZWVkZWQsIGJ1dCBub3cgdGhlIGRpc2sgZGlzY292ZXJzIHRoYXQgaXQgY2Fubm90IHdyaXRlIHRoZQorCSAqIGRhdGEgdG8gdGhlIG1hZ25ldGljIG1lZGlhLgorCSAqLworCWVycm9yID0gc2NzaV9zZW5zZV9pc19kZWZlcnJlZCgmc3NoKSA/IAorCQkJIjw8REVGRVJSRUQ+PiIgOiAiQ3VycmVudCI7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIiwgbmFtZSwgZXJyb3IpOworCWlmIChzc2gucmVzcG9uc2VfY29kZSA+PSAweDcyKQorCQlwcmludGsoIiBbZGVzY3JpcHRvcl0iKTsKKworCXNlbnNlX3R4dCA9IHNjc2lfc2Vuc2Vfa2V5X3N0cmluZyhzc2guc2Vuc2Vfa2V5KTsKKwlpZiAoc2Vuc2VfdHh0KQorCQlwcmludGsoIjogc2Vuc2Uga2V5OiAlc1xuIiwgc2Vuc2VfdHh0KTsKKwllbHNlCisJCXByaW50aygiOiBzZW5zZSBrZXk9MHgleFxuIiwgc3NoLnNlbnNlX2tleSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiICAgICIpOworCXNjc2lfc2hvd19leHRkX3NlbnNlKHNzaC5hc2MsIHNzaC5hc2NxKTsKKwlwcmludGsoIlxuIik7CisKKwlpZiAoc3NoLnJlc3BvbnNlX2NvZGUgPCAweDcyKSB7CisJCS8qIG9ubHkgZGVjb2RlIGV4dHJhcyBmb3IgImZpeGVkIiBmb3JtYXQgbm93ICovCisJCWNoYXIgYnVmZls4MF07CisJCWludCBibGVuLCBmaXhlZF92YWxpZDsKKworCQlmaXhlZF92YWxpZCA9IHNlbnNlX2J1ZmZlclswXSAmIDB4ODA7CisJCWluZm8gPSAoKHNlbnNlX2J1ZmZlclszXSA8PCAyNCkgfCAoc2Vuc2VfYnVmZmVyWzRdIDw8IDE2KSB8CisJCQkoc2Vuc2VfYnVmZmVyWzVdIDw8IDgpIHwgc2Vuc2VfYnVmZmVyWzZdKTsKKwkJcmVzID0gMDsKKwkJbWVtc2V0KGJ1ZmYsIDAsIHNpemVvZihidWZmKSk7CisJCWJsZW4gPSBzaXplb2YoYnVmZikgLSAxOworCQlpZiAoZml4ZWRfdmFsaWQpCisJCQlyZXMgKz0gc25wcmludGYoYnVmZiArIHJlcywgYmxlbiAtIHJlcywKKwkJCQkJIkluZm8gZmxkPTB4JXgiLCBpbmZvKTsKKwkJaWYgKHNlbnNlX2J1ZmZlclsyXSAmIDB4ODApIHsKKwkJCS8qIGN1cnJlbnQgY29tbWFuZCBoYXMgcmVhZCBhIGZpbGVtYXJrICovCisJCQlpZiAocmVzID4gMCkKKwkJCQlyZXMgKz0gc25wcmludGYoYnVmZiArIHJlcywgYmxlbiAtIHJlcywgIiwgIik7CisJCQlyZXMgKz0gc25wcmludGYoYnVmZiArIHJlcywgYmxlbiAtIHJlcywgIkZNSyIpOworCQl9CisJCWlmIChzZW5zZV9idWZmZXJbMl0gJiAweDQwKSB7CisJCQkvKiBlbmQtb2YtbWVkaXVtIGNvbmRpdGlvbiBleGlzdHMgKi8KKwkJCWlmIChyZXMgPiAwKQorCQkJCXJlcyArPSBzbnByaW50ZihidWZmICsgcmVzLCBibGVuIC0gcmVzLCAiLCAiKTsKKwkJCXJlcyArPSBzbnByaW50ZihidWZmICsgcmVzLCBibGVuIC0gcmVzLCAiRU9NIik7CisJCX0KKwkJaWYgKHNlbnNlX2J1ZmZlclsyXSAmIDB4MjApIHsKKwkJCS8qIGluY29ycmVjdCBibG9jayBsZW5ndGggcmVxdWVzdGVkICovCisJCQlpZiAocmVzID4gMCkKKwkJCQlyZXMgKz0gc25wcmludGYoYnVmZiArIHJlcywgYmxlbiAtIHJlcywgIiwgIik7CisJCQlyZXMgKz0gc25wcmludGYoYnVmZiArIHJlcywgYmxlbiAtIHJlcywgIklMSSIpOworCQl9CisJCWlmIChyZXMgPiAwKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIGJ1ZmYpOworCX0gZWxzZSBpZiAoc3NoLmFkZGl0aW9uYWxfbGVuZ3RoID4gMCkgeworCQkvKiBkZXNjcmlwdG9yIGZvcm1hdCB3aXRoIHNlbnNlIGRlc2NyaXB0b3JzICovCisJCW51bSA9IDggKyBzc2guYWRkaXRpb25hbF9sZW5ndGg7CisJCW51bSA9IChzZW5zZV9sZW4gPCBudW0pID8gc2Vuc2VfbGVuIDogbnVtOworCQlwcmludGsoS0VSTl9JTkZPICJEZXNjcmlwdG9yIHNlbnNlIGRhdGEgd2l0aCBzZW5zZSAiCisJCSAgICAgICAiZGVzY3JpcHRvcnMgKGluIGhleCk6Iik7CisJCWZvciAoayA9IDA7IGsgPCBudW07ICsraykgeworCQkJaWYgKDAgPT0gKGsgJSAxNikpIHsKKwkJCQlwcmludGsoIlxuIik7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICAiKTsKKwkJCX0KKwkJCXByaW50aygiJTAyeCAiLCBzZW5zZV9idWZmZXJba10pOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKF9fc2NzaV9wcmludF9zZW5zZSk7CisKK3ZvaWQgc2NzaV9wcmludF9zZW5zZShjb25zdCBjaGFyICpkZXZjbGFzcywgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBkZXZjbGFzczsKKworCWlmIChjbWQtPnJlcXVlc3QtPnJxX2Rpc2spCisJCW5hbWUgPSBjbWQtPnJlcXVlc3QtPnJxX2Rpc2stPmRpc2tfbmFtZTsKKwlfX3Njc2lfcHJpbnRfc2Vuc2UobmFtZSwgY21kLT5zZW5zZV9idWZmZXIsIFNDU0lfU0VOU0VfQlVGRkVSU0laRSk7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfcHJpbnRfc2Vuc2UpOworCit2b2lkIHNjc2lfcHJpbnRfcmVxX3NlbnNlKGNvbnN0IGNoYXIgKmRldmNsYXNzLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBkZXZjbGFzczsKKworCWlmIChzcmVxLT5zcl9yZXF1ZXN0LT5ycV9kaXNrKQorCQluYW1lID0gc3JlcS0+c3JfcmVxdWVzdC0+cnFfZGlzay0+ZGlza19uYW1lOworCV9fc2NzaV9wcmludF9zZW5zZShuYW1lLCBzcmVxLT5zcl9zZW5zZV9idWZmZXIsIFNDU0lfU0VOU0VfQlVGRkVSU0laRSk7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfcHJpbnRfcmVxX3NlbnNlKTsKKworI2lmZGVmIENPTkZJR19TQ1NJX0NPTlNUQU5UUworc3RhdGljIGNvbnN0IGNoYXIgKm9uZV9ieXRlX21zZ3NbXSA9IHsKKy8qIDB4MDAgKi8gIkNvbW1hbmQgQ29tcGxldGUiLCBOVUxMLCAiU2F2ZSBQb2ludGVycyIsCisvKiAweDAzICovICJSZXN0b3JlIFBvaW50ZXJzIiwgIkRpc2Nvbm5lY3QiLCAiSW5pdGlhdG9yIEVycm9yIiwgCisvKiAweDA2ICovICJBYm9ydCIsICJNZXNzYWdlIFJlamVjdCIsICJOb3AiLCAiTWVzc2FnZSBQYXJpdHkgRXJyb3IiLAorLyogMHgwYSAqLyAiTGlua2VkIENvbW1hbmQgQ29tcGxldGUiLCAiTGlua2VkIENvbW1hbmQgQ29tcGxldGUgdy9mbGFnIiwKKy8qIDB4MGMgKi8gIkJ1cyBkZXZpY2UgcmVzZXQiLCAiQWJvcnQgVGFnIiwgIkNsZWFyIFF1ZXVlIiwgCisvKiAweDBmICovICJJbml0aWF0ZSBSZWNvdmVyeSIsICJSZWxlYXNlIFJlY292ZXJ5IgorfTsKKyNkZWZpbmUgTk9fT05FX0JZVEVfTVNHUyAoc2l6ZW9mKG9uZV9ieXRlX21zZ3MpICAvIHNpemVvZiAoY29uc3QgY2hhciAqKSkKKworc3RhdGljIGNvbnN0IGNoYXIgKnR3b19ieXRlX21zZ3NbXSA9IHsKKy8qIDB4MjAgKi8gIlNpbXBsZSBRdWV1ZSBUYWciLCAiSGVhZCBvZiBRdWV1ZSBUYWciLCAiT3JkZXJlZCBRdWV1ZSBUYWciCisvKiAweDIzICovICJJZ25vcmUgV2lkZSBSZXNpZHVlIgorfTsKKyNkZWZpbmUgTk9fVFdPX0JZVEVfTVNHUyAoc2l6ZW9mKHR3b19ieXRlX21zZ3MpICAvIHNpemVvZiAoY29uc3QgY2hhciAqKSkKKworc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuZGVkX21zZ3NbXSA9IHsKKy8qIDB4MDAgKi8gIk1vZGlmeSBEYXRhIFBvaW50ZXIiLCAiU3luY2hyb25vdXMgRGF0YSBUcmFuc2ZlciBSZXF1ZXN0IiwKKy8qIDB4MDIgKi8gIlNDU0ktSSBFeHRlbmRlZCBJZGVudGlmeSIsICJXaWRlIERhdGEgVHJhbnNmZXIgUmVxdWVzdCIKK307CisjZGVmaW5lIE5PX0VYVEVOREVEX01TR1MgKHNpemVvZih0d29fYnl0ZV9tc2dzKSAgLyBzaXplb2YgKGNvbnN0IGNoYXIgKikpCisKKworaW50IHNjc2lfcHJpbnRfbXNnIChjb25zdCB1bnNpZ25lZCBjaGFyICptc2cpCit7CisJaW50IGxlbiA9IDAsIGk7CisJaWYgKG1zZ1swXSA9PSBFWFRFTkRFRF9NRVNTQUdFKSB7CisJCWxlbiA9IDMgKyBtc2dbMV07CisJCWlmIChtc2dbMl0gPCBOT19FWFRFTkRFRF9NU0dTKQorCQkJcHJpbnRrICgiJXMgIiwgZXh0ZW5kZWRfbXNnc1ttc2dbMl1dKTsgCisJCWVsc2UgCisJCQlwcmludGsgKCJFeHRlbmRlZCBNZXNzYWdlLCByZXNlcnZlZCBjb2RlICgweCUwMngpICIsCisJCQkJKGludCkgbXNnWzJdKTsKKwkJc3dpdGNoIChtc2dbMl0pIHsKKwkJY2FzZSBFWFRFTkRFRF9NT0RJRllfREFUQV9QT0lOVEVSOgorCQkJcHJpbnRrKCJwb2ludGVyID0gJWQiLCAoaW50KSAobXNnWzNdIDw8IDI0KSB8CisJCQkJKG1zZ1s0XSA8PCAxNikgfCAobXNnWzVdIDw8IDgpIHwgbXNnWzZdKTsKKwkJCWJyZWFrOworCQljYXNlIEVYVEVOREVEX1NEVFI6CisJCQlwcmludGsoInBlcmlvZCA9ICVkIG5zLCBvZmZzZXQgPSAlZCIsCisJCQkJKGludCkgbXNnWzNdICogNCwgKGludCkgbXNnWzRdKTsKKwkJCWJyZWFrOworCQljYXNlIEVYVEVOREVEX1dEVFI6CisJCQlwcmludGsoIndpZHRoID0gMl4lZCBieXRlcyIsIG1zZ1szXSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJZm9yIChpID0gMjsgaSA8IGxlbjsgKytpKSAKKwkJCXByaW50aygiJTAyeCAiLCBtc2dbaV0pOworCQl9CisJLyogSWRlbnRpZnkgKi8KKwl9IGVsc2UgaWYgKG1zZ1swXSAmIDB4ODApIHsKKwkJcHJpbnRrKCJJZGVudGlmeSBkaXNjb25uZWN0ICVzYWxsb3dlZCAlcyAlZCAiLAorCQkJKG1zZ1swXSAmIDB4NDApID8gIiIgOiAibm90ICIsCisJCQkobXNnWzBdICYgMHgyMCkgPyAidGFyZ2V0IHJvdXRpbmUiIDogImx1biIsCisJCQltc2dbMF0gJiAweDcpOworCQlsZW4gPSAxOworCS8qIE5vcm1hbCBPbmUgYnl0ZSAqLworCX0gZWxzZSBpZiAobXNnWzBdIDwgMHgxZikgeworCQlpZiAobXNnWzBdIDwgTk9fT05FX0JZVEVfTVNHUykKKwkJCXByaW50ayhvbmVfYnl0ZV9tc2dzW21zZ1swXV0pOworCQllbHNlCisJCQlwcmludGsoInJlc2VydmVkICglMDJ4KSAiLCBtc2dbMF0pOworCQlsZW4gPSAxOworCS8qIFR3byBieXRlICovCisJfSBlbHNlIGlmIChtc2dbMF0gPD0gMHgyZikgeworCQlpZiAoKG1zZ1swXSAtIDB4MjApIDwgTk9fVFdPX0JZVEVfTVNHUykKKwkJCXByaW50aygiJXMgJTAyeCAiLCB0d29fYnl0ZV9tc2dzW21zZ1swXSAtIDB4MjBdLCAKKwkJCQltc2dbMV0pOworCQllbHNlIAorCQkJcHJpbnRrKCJyZXNlcnZlZCB0d28gYnl0ZSAoJTAyeCAlMDJ4KSAiLCAKKwkJCQltc2dbMF0sIG1zZ1sxXSk7CisJCWxlbiA9IDI7CisJfSBlbHNlIAorCQlwcmludGsoInJlc2VydmVkIik7CisJcmV0dXJuIGxlbjsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9wcmludF9tc2cpOworCisjZWxzZSAgLyogaWZuZGVmIENPTkZJR19TQ1NJX0NPTlNUQU5UUyAqLworCitpbnQgc2NzaV9wcmludF9tc2cgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1zZykKK3sKKwlpbnQgbGVuID0gMCwgaTsKKworCWlmIChtc2dbMF0gPT0gRVhURU5ERURfTUVTU0FHRSkgeworCQlsZW4gPSAzICsgbXNnWzFdOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisJCQlwcmludGsoIiUwMnggIiwgbXNnW2ldKTsKKwkvKiBJZGVudGlmeSAqLworCX0gZWxzZSBpZiAobXNnWzBdICYgMHg4MCkgeworCQlwcmludGsoIiUwMnggIiwgbXNnWzBdKTsKKwkJbGVuID0gMTsKKwkvKiBOb3JtYWwgT25lIGJ5dGUgKi8KKwl9IGVsc2UgaWYgKG1zZ1swXSA8IDB4MWYpIHsKKwkJcHJpbnRrKCIlMDJ4ICIsIG1zZ1swXSk7CisJCWxlbiA9IDE7CisJLyogVHdvIGJ5dGUgKi8KKwl9IGVsc2UgaWYgKG1zZ1swXSA8PSAweDJmKSB7CisJCXByaW50aygiJTAyeCAlMDJ4IiwgbXNnWzBdLCBtc2dbMV0pOworCQlsZW4gPSAyOworCX0gZWxzZSAKKwkJcHJpbnRrKCIlMDJ4ICIsIG1zZ1swXSk7CisJcmV0dXJuIGxlbjsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9wcmludF9tc2cpOworI2VuZGlmIC8qICEgQ09ORklHX1NDU0lfQ09OU1RBTlRTICovCisKK3ZvaWQgc2NzaV9wcmludF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwkvKiBBc3N1bWUgYXBwZW5kZWQgb3V0cHV0IChpLmUuIG5vdCBhdCBzdGFydCBvZiBsaW5lKSAqLworCXByaW50aygic2NzaSVkIDogZGVzdGluYXRpb24gdGFyZ2V0ICVkLCBsdW4gJWRcbiIsIAorCQljbWQtPmRldmljZS0+aG9zdC0+aG9zdF9ubywgCisJCWNtZC0+ZGV2aWNlLT5pZCwgCisJCWNtZC0+ZGV2aWNlLT5sdW4pOworCXByaW50ayhLRVJOX0lORk8gIiAgICAgICAgY29tbWFuZDogIik7CisJc2NzaV9wcmludF9jZGIoY21kLT5jbW5kLCBjbWQtPmNtZF9sZW4sIDApOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3ByaW50X2NvbW1hbmQpOworCisjaWZkZWYgQ09ORklHX1NDU0lfQ09OU1RBTlRTCisKK3N0YXRpYyBjb25zdCBjaGFyICogaG9zdGJ5dGVfdGFibGVbXT17CisiRElEX09LIiwgIkRJRF9OT19DT05ORUNUIiwgIkRJRF9CVVNfQlVTWSIsICJESURfVElNRV9PVVQiLCAiRElEX0JBRF9UQVJHRVQiLCAKKyJESURfQUJPUlQiLCAiRElEX1BBUklUWSIsICJESURfRVJST1IiLCAiRElEX1JFU0VUIiwgIkRJRF9CQURfSU5UUiIsCisiRElEX1BBU1NUSFJPVUdIIiwgIkRJRF9TT0ZUX0VSUk9SIiwgIkRJRF9JTU1fUkVUUlkifTsKKyNkZWZpbmUgTlVNX0hPU1RCWVRFX1NUUlMgKHNpemVvZihob3N0Ynl0ZV90YWJsZSkgLyBzaXplb2YoY29uc3QgY2hhciAqKSkKKwordm9pZCBzY3NpX3ByaW50X2hvc3RieXRlKGludCBzY3NpcmVzdWx0KQoreworCWludCBoYiA9IGhvc3RfYnl0ZShzY3NpcmVzdWx0KTsKKworCXByaW50aygiSG9zdGJ5dGU9MHglMDJ4IiwgaGIpOworCWlmIChoYiA8IE5VTV9IT1NUQllURV9TVFJTKQorCQlwcmludGsoIiglcykgIiwgaG9zdGJ5dGVfdGFibGVbaGJdKTsKKwllbHNlCisJCXByaW50aygiaXMgaW52YWxpZCAiKTsgCit9CisjZWxzZQordm9pZCBzY3NpX3ByaW50X2hvc3RieXRlKGludCBzY3NpcmVzdWx0KQoreworCXByaW50aygiSG9zdGJ5dGU9MHglMDJ4ICIsIGhvc3RfYnl0ZShzY3NpcmVzdWx0KSk7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TQ1NJX0NPTlNUQU5UUworCitzdGF0aWMgY29uc3QgY2hhciAqIGRyaXZlcmJ5dGVfdGFibGVbXT17CisiRFJJVkVSX09LIiwgIkRSSVZFUl9CVVNZIiwgIkRSSVZFUl9TT0ZUIiwgICJEUklWRVJfTUVESUEiLCAiRFJJVkVSX0VSUk9SIiwgCisiRFJJVkVSX0lOVkFMSUQiLCAiRFJJVkVSX1RJTUVPVVQiLCAiRFJJVkVSX0hBUkQiLCAiRFJJVkVSX1NFTlNFIn07CisjZGVmaW5lIE5VTV9EUklWRVJCWVRFX1NUUlMgKHNpemVvZihkcml2ZXJieXRlX3RhYmxlKSAvIHNpemVvZihjb25zdCBjaGFyICopKQorCitzdGF0aWMgY29uc3QgY2hhciAqIGRyaXZlcnN1Z2dlc3RfdGFibGVbXT17IlNVR0dFU1RfT0siLAorIlNVR0dFU1RfUkVUUlkiLCAiU1VHR0VTVF9BQk9SVCIsICJTVUdHRVNUX1JFTUFQIiwgIlNVR0dFU1RfRElFIiwKKyJTVUdHRVNUXzUiLCAiU1VHR0VTVF82IiwgIlNVR0dFU1RfNyIsICJTVUdHRVNUX1NFTlNFIn07CisjZGVmaW5lIE5VTV9TVUdHRVNUX1NUUlMgKHNpemVvZihkcml2ZXJzdWdnZXN0X3RhYmxlKSAvIHNpemVvZihjb25zdCBjaGFyICopKQorCit2b2lkIHNjc2lfcHJpbnRfZHJpdmVyYnl0ZShpbnQgc2NzaXJlc3VsdCkKK3sKKwlpbnQgZHIgPSAoZHJpdmVyX2J5dGUoc2NzaXJlc3VsdCkgJiBEUklWRVJfTUFTSyk7CisJaW50IHN1ID0gKChkcml2ZXJfYnl0ZShzY3NpcmVzdWx0KSAmIFNVR0dFU1RfTUFTSykgPj4gNCk7CisKKwlwcmludGsoIkRyaXZlcmJ5dGU9MHglMDJ4ICIsIGRyaXZlcl9ieXRlKHNjc2lyZXN1bHQpKTsKKwlwcmludGsoIiglcywlcykgIiwKKwkgICAgICAgKGRyIDwgTlVNX0RSSVZFUkJZVEVfU1RSUyA/IGRyaXZlcmJ5dGVfdGFibGVbZHJdIDogImludmFsaWQiKSwKKwkgICAgICAgKHN1IDwgTlVNX1NVR0dFU1RfU1RSUyA/IGRyaXZlcnN1Z2dlc3RfdGFibGVbc3VdIDogImludmFsaWQiKSk7Cit9CisjZWxzZQordm9pZCBzY3NpX3ByaW50X2RyaXZlcmJ5dGUoaW50IHNjc2lyZXN1bHQpCit7CisJcHJpbnRrKCJEcml2ZXJieXRlPTB4JTAyeCAiLCBkcml2ZXJfYnl0ZShzY3NpcmVzdWx0KSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jcHFmY1RTLmggYi9kcml2ZXJzL3Njc2kvY3BxZmNUUy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZTUzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvY3BxZmNUUy5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgQ1BRRkNUU19ICisjZGVmaW5lIENQUUZDVFNfSAorI2luY2x1ZGUgImNwcWZjVFNzdHJ1Y3RzLmgiCisKKy8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcmVxdWlyZWQgYnkgdGhlIExpbnV4IFNDU0kgbGF5ZXJzCitleHRlcm4gaW50IGNwcWZjVFNfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK2V4dGVybiBpbnQgY3BxZmNUU19yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKik7CitleHRlcm4gY29uc3QgY2hhciAqIGNwcWZjVFNfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOworZXh0ZXJuIGludCBjcHFmY1RTX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50KTsKK2V4dGVybiBpbnQgY3BxZmNUU19xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICosIHZvaWQgKCogZG9uZSkoU2NzaV9DbW5kICopKTsKK2V4dGVybiBpbnQgY3BxZmNUU19hYm9ydChTY3NpX0NtbmQgKik7CitleHRlcm4gaW50IGNwcWZjVFNfcmVzZXQoU2NzaV9DbW5kICosIHVuc2lnbmVkIGludCk7CitleHRlcm4gaW50IGNwcWZjVFNfZWhfYWJvcnQoU2NzaV9DbW5kICpDbW5kKTsKK2V4dGVybiBpbnQgY3BxZmNUU19laF9kZXZpY2VfcmVzZXQoU2NzaV9DbW5kICopOworZXh0ZXJuIGludCBjcHFmY1RTX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLAorCQlzZWN0b3JfdCwgaW50W10pOworZXh0ZXJuIGludCBjcHFmY1RTX2lvY3RsKCBTY3NpX0RldmljZSAqU2NzaURldiwgaW50IENtbmQsIHZvaWQgKmFyZyk7CisKKyNlbmRpZiAvKiBDUFFGQ1RTX0ggKi8gCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3BxZmNUU2NoaXAuaCBiL2RyaXZlcnMvc2NzaS9jcHFmY1RTY2hpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YjgzMzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvY3BxZmNUU2NoaXAuaApAQCAtMCwwICsxLDIzOCBAQAorLyogQ29weXJpZ2h0KGMpIDIwMDAsIENvbXBhcSBDb21wdXRlciBDb3Jwb3JhdGlvbiAKKyAqIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlciAKKyAqIDY0LWJpdCwgNjZNSHogUENJIAorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIHRlc3RlZCBvbjoKKyAqIChmcm9udCk6IFtjaGlwXSBUYWNoeW9uIFRTIEhQRkMtNTE2NkEvMS4yICBMMkMxMDkwIC4uLgorICogICAgICAgICAgU1AjIFAyMjVDWENCRklFTDZULCBSZXYgWEMKKyAqICAgICAgICAgIFNQIyAxNjEyOTAtMDAxLCBSZXYgWEQKKyAqIChiYWNrKTogQm9hcmQgTm8uIDAxMDAwOC0wMDEgQS9XIFJldiBYNSwgRkFCIFJFViBYNQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFdyaXR0ZW4gYnkgRG9uIFppbW1lcm1hbgorKi8KKyNpZm5kZWYgQ1BRRkNUU0NISVBfSAorI2RlZmluZSBDUFFGQ1RTQ0hJUF9ICisjaWZuZGVmIFRBQ0hZT05fQ0hJUF9JTkMKKworLy8gRkMtUEggKFBoeXNpY2FsKSBzcGVjaWZpY2F0aW9uIGxldmVscyBmb3IgTG9naW4gcGF5bG9hZHMKKy8vIE5PVEU6IFRoZXNlIGFyZSBOT1Qgc3RyaWN0bHkgY29tcGxpZWQgd2l0aCBieSBhbnkgRkMgdmVuZG9ycworCisjZGVmaW5lIEZDX1BINDIJCQkweDA4CisjZGVmaW5lIEZDX1BINDMJCQkweDA5CisjZGVmaW5lIEZDX1BIMwkJCTB4MjAKKworI2RlZmluZSBUQUNITElURV9UU19SWF9TSVpFICAgICAxMDI0ICAvLyBtYXggaW5ib3VuZCBmcmFtZSBzaXplCisvLyAiSSIgcHJlZml4IGlzIGZvciBJbmNsdWRlCisKKyNkZWZpbmUgSVZFTkRJRCAgICAweDAwICAvLyB3b3JkCisjZGVmaW5lIElERVZJRCAgICAgMHgwMgorI2RlZmluZSBJVExDRkdDTUQgMHgwNAorI2RlZmluZSBJTUVNQkFTRSAgIDB4MTggICAgLy8gVGFjaHlvbgorI2RlZmluZSBJVExNRU1CQVNFICAgMHgxQyAgLy8gVGFjaGxpdGUKKyNkZWZpbmUgSUlPQkFTRUwgICAweDEwICAgIC8vIFRhY2h5b24gSS9PIGJhc2UgYWRkcmVzcywgbG93ZXIgMjU2IGJ5dGVzCisjZGVmaW5lIElJT0JBU0VVICAgMHgxNCAgICAvLyBUYWNoeW9uIEkvTyBiYXNlIGFkZHJlc3MsIHVwcGVyIDI1NiBieXRlcworI2RlZmluZSBJVExJT0JBU0VMICAgMHgxNCAgLy8gVGFjaExpdGUgSS9PIGJhc2UgYWRkcmVzcywgbG93ZXIgMjU2IGJ5dGVzCisjZGVmaW5lIElUTElPQkFTRVUgICAweDE4ICAvLyBUYWNoTGl0ZSBJL08gYmFzZSBhZGRyZXNzLCB1cHBlciAyNTYgYnl0ZXMKKyNkZWZpbmUgSVRMUkFNQkFTRSAgIDB4MjAgIC8vIFRMIG9uLWJvYXJkIFJBTSBzdGFydAorI2RlZmluZSBJU1JPTUJBU0UgIDB4MjQKKyNkZWZpbmUgSVJPTUJBU0UgICAweDMwCisKKyNkZWZpbmUgSUNGR0NNRCAgICAweDA0ICAgIC8vIFBDSSBjb25maWcgLSBQQ0kgY29uZmlnIGFjY2VzcyAod29yZCkKKyNkZWZpbmUgSUNGR1NUQVQgICAweDA2ICAgIC8vIFBDSSBzdGF0dXMgKFIgLSB3b3JkKQorI2RlZmluZSBJUkNUUl9XQ1RSIDB4MUYyICAgLy8gUk9NIGNvbnRyb2wgLyBwcmUtZmV0Y2ggd2FpdCBjb3VudGVyCisjZGVmaW5lIElQQ0lNQ1RSICAgMHgxRjMgICAvLyBQQ0kgbWFzdGVyIGNvbnRyb2wgcmVnaXN0ZXIKKyNkZWZpbmUgSUlOVFBFTkQgICAweDFGRCAgIC8vIEludGVycnVwdCBwZW5kaW5nIChJL08gVXBwZXIgLSBUYWNoeW9uICYgVEwpCisjZGVmaW5lIElJTlRFTiAgICAgMHgxRkUgICAvLyBJbnRlcnJ1cHQgZW5hYmxlICAoSS9PIFVwcGVyIC0gVGFjaHlvbiAmIFRMKQorI2RlZmluZSBJSU5UU1RBVCAgIDB4MUZGICAgLy8gSW50ZXJydXB0IHN0YXR1cyAgKEkvTyBVcHBlciAtIFRhY2h5b24gJiBUTCkKKworI2RlZmluZSBJTVFfQkFTRSAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgSU1RX0xFTkdUSCAgICAgICAgICAweDg0CisjZGVmaW5lIElNUV9DT05TVU1FUl9JTkRFWCAgMHg4OAorI2RlZmluZSBJTVFfUFJPRFVDRVJfSU5ERVggIDB4OEMgICAvLyBUYWNoIGNvcGllcyBpdHMgSU5EWCB0byBiaXRzIDAtNyBvZiB2YWx1ZQorCisvKgorLy8gSU9CQVNFIFVQUEVSCisjZGVmaW5lIFNGU0JRX0JBU0UgICAgICAgICAgICAweDAwICAgLy8gc2luZ2xlLWZyYW1lIHNlcXVlbmNlcworI2RlZmluZSBTRlNCUV9MRU5HVEggICAgICAgICAgMHgwNAorI2RlZmluZSBTRlNCUV9QUk9EVUNFUl9JTkRFWCAgMHgwOAorI2RlZmluZSBTRlNCUV9DT05TVU1FUl9JTkRFWCAgMHgwQyAgIC8vIChSKQorI2RlZmluZSBTRlNfQlVGRkVSX0xFTkdUSCAgICAgMFgxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU0NTSS1GQ1AgaGFyZHdhcmUgYXNzaXN0cworI2RlZmluZSBTRVNUX0JBU0UgICAgICAgICAgICAgMHg0MCAgIC8vIFNTQ0kgRXhjaGFuZ2UgU3RhdGUgVGFibGUKKyNkZWZpbmUgU0VTVF9MRU5HVEggICAgICAgICAgIDB4NDQKKyNkZWZpbmUgU0NTSV9CVUZGRVJfTEVOR1RIICAgIDB4NDgKKyNkZWZpbmUgU0VTVF9MSU5LRURfTElTVCAgICAgIDB4NEMKKworI2RlZmluZSBUQUNIWU9OX015X0lEICAgICAgICAgMHg2QworI2RlZmluZSBUQUNIWU9OX0NPTkZJR1VSQVRJT04gMHg4NCAgIC8vIChSL1cpIHJlc2V0IHZhbCAyCisjZGVmaW5lIFRBQ0hZT05fQ09OVFJPTCAgICAgICAweDg4CisjZGVmaW5lIFRBQ0hZT05fU1RBVFVTICAgICAgICAweDhDICAgLy8gKFIpCisjZGVmaW5lIFRBQ0hZT05fRkxVU0hfU0VTVCAgICAweDkwICAgLy8gKFIvVykKKyNkZWZpbmUgVEFDSFlPTl9FRV9DUkVESVRfVE1SIDB4OTQgICAvLyAoUikKKyNkZWZpbmUgVEFDSFlPTl9CQl9DUkVESVRfVE1SIDB4OTggICAvLyAoUikKKyNkZWZpbmUgVEFDSFlPTl9SQ1ZfRlJBTUVfRVJSIDB4OUMgICAvLyAoUikKKyNkZWZpbmUgRlJBTUVfTUFOQUdFUl9DT05GSUcgIDB4QzAgICAvLyAoUi9XKQorI2RlZmluZSBGUkFNRV9NQU5BR0VSX0NPTlRST0wgMHhDNAorI2RlZmluZSBGUkFNRV9NQU5BR0VSX1NUQVRVUyAgMHhDOCAgIC8vIChSKQorI2RlZmluZSBGUkFNRV9NQU5BR0VSX0VEX1RPViAgMHhDQworI2RlZmluZSBGUkFNRV9NQU5BR0VSX0xJTktfRVJSMSAweEQwICAgLy8gKFIpCisjZGVmaW5lIEZSQU1FX01BTkFHRVJfTElOS19FUlIyIDB4RDQgICAvLyAoUikKKyNkZWZpbmUgRlJBTUVfTUFOQUdFUl9USU1FT1VUMiAgMHhEOCAgIC8vIChXKQorI2RlZmluZSBGUkFNRV9NQU5BR0VSX0JCX0NSRURJVCAweERDICAgLy8gKFIpCisjZGVmaW5lIEZSQU1FX01BTkFHRVJfV1dOX0hJICAgIDB4RTAgICAvLyAoUi9XKQorI2RlZmluZSBGUkFNRV9NQU5BR0VSX1dXTl9MTyAgICAweEU0ICAgLy8gKFIvVykKKyNkZWZpbmUgRlJBTUVfTUFOQUdFUl9SQ1ZfQUxfUEEgMHhFOCAgIC8vIChSKQorI2RlZmluZSBGUkFNRV9NQU5BR0VSX1BSSU1JVElWRSAweEVDICAgLy8ge0syOC41fSBieXRlMSBieXRlMiBieXRlMworKi8KKwkJICAgIAorI2RlZmluZSBUTF9NRU1fRVJRX0JBU0UgICAgICAgICAgICAgICAgICAgIDB4MCAvL0VSUSBCYXNlCisjZGVmaW5lIFRMX0lPX0VSUV9CQVNFICAgICAgICAgICAgICAgICAgICAgMHgwIC8vRVJRIGJhc2UKKworI2RlZmluZSBUTF9NRU1fRVJRX0xFTkdUSCAgICAgICAgICAgICAgICAgIDB4NCAvL0VSUSBMZW5ndGgKKyNkZWZpbmUgVExfSU9fRVJRX0xFTkdUSCAgICAgICAgICAgICAgICAgICAweDQgLy9FUlEgTGVuZ3RoCisKKyNkZWZpbmUgVExfTUVNX0VSUV9QUk9EVUNFUl9JTkRFWCAgICAgICAgICAweDggLy9FUlEgUHJvZHVjZXIgSW5kZXggIHJlZ2lzdGVyCisjZGVmaW5lIFRMX0lPX0VSUV9QUk9EVUNFUl9JTkRFWCAgICAgICAgICAgMHg4IC8vRVJRIFByb2R1Y2VyIEluZGV4ICByZWdpc3RlcgorCisjZGVmaW5lIFRMX01FTV9FUlFfQ09OU1VNRVJfSU5ERVhfQURSIDB4QyAvL0VSUSBDb25zdW1lciBJbmRleCBhZGRyZXNzIHJlZ2lzdGVyCisjZGVmaW5lIFRMX0lPX0VSUV9DT05TVU1FUl9JTkRFWF9BRFIgIDB4QyAvL0VSUSBDb25zdW1lciBJbmRleCBhZGRyZXNzIHJlZ2lzdGVyCisKKyNkZWZpbmUgVExfTUVNX0VSUV9DT05TVU1FUl9JTkRFWCAgICAgMHhDIC8vRVJRIENvbnN1bWVyIEluZGV4IAorI2RlZmluZSBUTF9JT19FUlFfQ09OU1VNRVJfSU5ERVggICAgICAweEMgLy9FUlEgQ29uc3VtZXIgSW5kZXggCisKKyNkZWZpbmUgVExfTUVNX1NGUV9CQVNFICAgICAgICAgICAgICAgMHg1MCAvL1NGUSBCYXNlCisjZGVmaW5lIFRMX0lPX1NGUV9CQVNFICAgICAgICAgICAgICAgIDB4NTAgLy9TRlEgYmFzZQorCisjZGVmaW5lIFRMX01FTV9TRlFfTEVOR1RIICAgICAgICAgICAgIDB4NTQgLy9TRlEgTGVuZ3RoCisjZGVmaW5lIFRMX0lPX1NGUV9MRU5HVEggICAgICAgICAgICAgIDB4NTQgLy9TRlEgTGVuZ3RoCisKKyNkZWZpbmUgVExfTUVNX1NGUV9DT05TVU1FUl9JTkRFWCAgICAgMHg1OCAvL1NGUSBDb25zdW1lciBJbmRleAorI2RlZmluZSBUTF9JT19TRlFfQ09OU1VNRVJfSU5ERVggICAgICAweDU4IC8vU0ZRIENvbnN1bWVyIEluZGV4CisKKyNkZWZpbmUgVExfTUVNX0lNUV9CQVNFICAgICAgICAgICAgICAgMHg4MCAvL0lNUSBCYXNlCisjZGVmaW5lIFRMX0lPX0lNUV9CQVNFICAgICAgICAgICAgICAgIDB4ODAgLy9JTVEgYmFzZQorCisjZGVmaW5lIFRMX01FTV9JTVFfTEVOR1RIICAgICAgICAgICAgIDB4ODQgLy9JTVEgTGVuZ3RoCisjZGVmaW5lIFRMX0lPX0lNUV9MRU5HVEggICAgICAgICAgICAgIDB4ODQgLy9JTVEgTGVuZ3RoCisKKyNkZWZpbmUgVExfTUVNX0lNUV9DT05TVU1FUl9JTkRFWCAgICAgMHg4OCAvL0lNUSBDb25zdW1lciBJbmRleAorI2RlZmluZSBUTF9JT19JTVFfQ09OU1VNRVJfSU5ERVggICAgICAweDg4IC8vSU1RIENvbnN1bWVyIEluZGV4CisKKyNkZWZpbmUgVExfTUVNX0lNUV9QUk9EVUNFUl9JTkRFWF9BRFIgMHg4QyAvL0lNUSBQcm9kdWNlciBJbmRleCBhZGRyZXNzIHJlZ2lzdGVyCisjZGVmaW5lIFRMX0lPX0lNUV9QUk9EVUNFUl9JTkRFWF9BRFIgIDB4OEMgLy9JTVEgUHJvZHVjZXIgSW5kZXggYWRkcmVzcyByZWdpc3RlcgorCisjZGVmaW5lIFRMX01FTV9TRVNUX0JBU0UgICAgICAgICAgICAgIDB4MTQwIC8vU0ZRIEJhc2UKKyNkZWZpbmUgVExfSU9fU0VTVF9CQVNFICAgICAgICAgICAgICAgMHg0MCAvL1NGUSBiYXNlCisKKyNkZWZpbmUgVExfTUVNX1NFU1RfTEVOR1RIICAgICAgICAgICAgMHgxNDQgLy9TRlEgTGVuZ3RoCisjZGVmaW5lIFRMX0lPX1NFU1RfTEVOR1RIICAgICAgICAgICAgIDB4NDQgLy9TRlEgTGVuZ3RoCisKKyNkZWZpbmUgVExfTUVNX1NFU1RfTElOS0VEX0xJU1QgICAgICAgMHgxNEMKKworI2RlZmluZSBUTF9NRU1fU0VTVF9TR19QQUdFICAgICAgICAgICAweDE2OCAgLy8gRXh0ZW5kZWQgU2NhdHRlci9HYXRoZXIgcGFnZSBzaXplCisKKyNkZWZpbmUgVExfTUVNX1RBQ0hfTXlfSUQgICAgICAgICAgICAgMHgxNkMKKyNkZWZpbmUgVExfSU9fVEFDSF9NeV9JRCAgICAgICAgICAgICAgMHg2QyAvL015IEFMX1BBIElECisKKyNkZWZpbmUgVExfTUVNX1RBQ0hfQ09ORklHICAgICAgICAgICAgMHgxODQgLy9UYWNobGl0ZSBDb25maWd1cmF0aW9uIHJlZ2lzdGVyCisjZGVmaW5lIFRMX0lPX0NPTkZJRyAgICAgICAgICAgICAgICAgIDB4ODQgLy9UYWNobGl0ZSBDb25maWd1cmF0aW9uIHJlZ2lzdGVyCisKKyNkZWZpbmUgVExfTUVNX1RBQ0hfQ09OVFJPTCAgICAgICAgICAgMHgxODggLy9UYWNobGl0ZSBDb250cm9sIHJlZ2lzdGVyCisjZGVmaW5lIFRMX0lPX0NUUiAgICAgICAgICAgICAgICAgICAgIDB4ODggLy9UYWNobGl0ZSBDb250cm9sIHJlZ2lzdGVyCisKKyNkZWZpbmUgVExfTUVNX1RBQ0hfU1RBVFVTICAgICAgICAgICAgMHgxOEMgLy9UYWNobGl0ZSBTdGF0dXMgcmVnaXN0ZXIKKyNkZWZpbmUgVExfSU9fU1RBVCAgICAgICAgICAgICAgICAgICAgMHg4QyAvL1RhY2hsaXRlIFN0YXR1cyByZWdpc3RlcgorCisjZGVmaW5lIFRMX01FTV9GTV9DT05GSUcgICAgICAgIDB4MUMwIC8vRnJhbWUgTWFuYWdlciBDb25maWd1cmF0aW9uIHJlZ2lzdGVyCisjZGVmaW5lIFRMX0lPX0ZNX0NPTkZJRyAgICAgICAgIDB4QzAgLy9GcmFtZSBNYW5hZ2VyIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKworI2RlZmluZSBUTF9NRU1fRk1fQ09OVFJPTCAgICAgICAweDFDNCAvL0ZyYW1lIE1hbmFnZXIgQ29udHJvbAorI2RlZmluZSBUTF9JT19GTV9DVEwgICAgICAgICAgICAweEM0IC8vRnJhbWUgTWFuYWdlciBDb250cm9sCisKKyNkZWZpbmUgVExfTUVNX0ZNX1NUQVRVUyAgICAgICAgMHgxQzggLy9GcmFtZSBNYW5hZ2VyIFN0YXR1cworI2RlZmluZSBUTF9JT19GTV9TVEFUICAgICAgICAgICAweEM4IC8vRnJhbWUgTWFuYWdlciBTdGF0dXMKKworI2RlZmluZSBUTF9NRU1fRk1fTElOS19TVEFUMSAgICAweDFEMCAvL0ZyYW1lIE1hbmFnZXIgTGluayBTdGF0dXMgMQorI2RlZmluZSBUTF9JT19GTV9MSU5LX1NUQVQxICAgICAweEQwIC8vRnJhbWUgTWFuYWdlciBMaW5rIFN0YXR1cyAxCisKKyNkZWZpbmUgVExfTUVNX0ZNX0xJTktfU1RBVDIgICAgMHgxRDQgLy9GcmFtZSBNYW5hZ2VyIExpbmsgU3RhdHVzIDIKKyNkZWZpbmUgVExfSU9fRk1fTElOS19TVEFUMiAgICAgMHhENCAvL0ZyYW1lIE1hbmFnZXIgTGluayBTdGF0dXMgMgorCisjZGVmaW5lIFRMX01FTV9GTV9USU1FT1VUMiAgICAgIDB4MUQ4ICAgLy8gKFcpCisKKyNkZWZpbmUgVExfTUVNX0ZNX0JCX0NSRURJVDAgICAgMHgxREMKKworI2RlZmluZSBUTF9NRU1fRk1fV1dOX0hJICAgICAgICAweDFFMCAvL0ZyYW1lIE1hbmFnZXIgV29ybGQgV2lkZSBOYW1lIEhpZ2gKKyNkZWZpbmUgVExfSU9fRk1fV1dOX0hJICAgICAgICAgMHhFMCAvL0ZyYW1lIE1hbmFnZXIgV29ybGQgV2lkZSBOYW1lIEhpZ2gKKworI2RlZmluZSBUTF9NRU1fRk1fV1dOX0xPICAgICAgICAweDFFNCAvL0ZyYW1lIE1hbmFnZXIgV29ybGQgV2lkZSBOYW1lIExPVworI2RlZmluZSBUTF9JT19GTV9XV05fTE8gICAgICAgICAweEU0IC8vRnJhbWUgTWFuYWdlciBXb3JsZCBXaWRlIE5hbWUgTG93CisKKyNkZWZpbmUgVExfTUVNX0ZNX1JDVl9BTF9QQSAgICAgMHgxRTggLy9GcmFtZSBNYW5hZ2VyIEFMX1BBIFJlY2VpdmVkIHJlZ2lzdGVyCisjZGVmaW5lIFRMX0lPX0ZNX0FMUEEgICAgICAgICAgIDB4RTggLy9GcmFtZSBNYW5hZ2VyIEFMX1BBIFJlY2VpdmVkIHJlZ2lzdGVyCisKKyNkZWZpbmUgVExfTUVNX0ZNX0VEX1RPViAgICAgICAgICAgMHgxQ0MKKworI2RlZmluZSBUTF9JT19ST01DVFIgICAgICAgICAgICAweEZBIC8vVEwgUENJIFJPTSBDb250cm9sIFJlZ2lzdGVyCisjZGVmaW5lIFRMX0lPX1BDSU1DVFIgICAgICAgICAgIDB4RkIgLy9UTCBQQ0kgTWFzdGVyIENvbnRyb2wgUmVnaXN0ZXIKKyNkZWZpbmUgVExfSU9fU09GVFJTVCAgICAgICAgICAgMHhGQyAvL1RhY2hsaXRlIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKyNkZWZpbmUgVExfTUVNX1NPRlRSU1QgICAgICAgICAgMHgxRkMgLy9UYWNobGl0ZSBDb25maWd1cmF0aW9uIHJlZ2lzdGVyCisKKy8vIGNvbXBsZXRpb24gbWVzc2FnZSB0eXBlcyAoYml0IDggc2V0IG1lYW5zIEludGVycnVwdCBnZW5lcmF0ZWQpCisvLyBDTV9UeXBlCisjZGVmaW5lIE9VVEJPVU5EX0NPTVBMRVRJT04gICAgICAgIDAKKyNkZWZpbmUgRVJST1JfSURMRV9DT01QTEVUSU9OICAgMHgwMQorI2RlZmluZSBPVVRfSElfUFJJX0NPTVBMRVRJT04gICAweDAxCisjZGVmaW5lIElOQk9VTkRfTUZTX0NPTVBMRVRJT04gIDB4MDIKKyNkZWZpbmUgSU5CT1VORF8wMDBfQ09NUExFVElPTiAgMHgwMworI2RlZmluZSBJTkJPVU5EX1NGU19DT01QTEVUSU9OICAweDA0ICAvLyBUYWNoeW9uICYgVGFjaExpdGUKKyNkZWZpbmUgRVJRX0ZST1pFTl9DT01QTEVUSU9OICAgMHgwNiAgLy8gVGFjaExpdGUKKyNkZWZpbmUgSU5CT1VORF9DMV9USU1FT1VUICAgICAgMHgwNQorI2RlZmluZSBJTkJPVU5EX0JVU0lFRF9GUkFNRSAgICAweDA2CisjZGVmaW5lIFNGU19CVUZfV0FSTiAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgRkNQX0ZST1pFTl9DT01QTEVUSU9OICAgMHgwNyAgLy8gVGFjaExpdGUKKyNkZWZpbmUgTUZTX0JVRl9XQVJOICAgICAgICAgICAgMHgwOAorI2RlZmluZSBJTVFfQlVGX1dBUk4gICAgICAgICAgICAweDA5CisjZGVmaW5lIEZSQU1FX01HUl9JTlRFUlJVUFQgICAgIDB4MEEKKyNkZWZpbmUgUkVBRF9TVEFUVVMgICAgICAgICAgICAgMHgwQgorI2RlZmluZSBJTkJPVU5EX1NDU0lfREFUQV9DT01QTEVUSU9OICAweDBDCisjZGVmaW5lIElOQk9VTkRfRkNQX1hDSEdfQ09NUExFVElPTiAgIDB4MEMgIC8vIFRhY2hMaXRlCisjZGVmaW5lIElOQk9VTkRfU0NTSV9EQVRBX0NPTU1BTkQgICAgIDB4MEQKKyNkZWZpbmUgQkFEX1NDU0lfRlJBTUUgICAgICAgICAgICAgICAgMHgwRQorI2RlZmluZSBJTkJfU0NTSV9TVEFUVVNfQ09NUExFVElPTiAgICAweDBGCisjZGVmaW5lIEJVRkZFUl9QUk9DRVNTRURfQ09NUExFVElPTiAgIDB4MTEKKworLy8gRkMtQUwgKFRhY2h5b24pIExvb3AgUG9ydCBTdGF0ZSBNYWNoaW5lIGRlZnMKKy8vIChsb29wICJVcCIgc3RhdGVzKQorI2RlZmluZSBNT05JVE9SSU5HIDB4MAorI2RlZmluZSBBUkJJVFJBVElORyAweDEKKyNkZWZpbmUgQVJCSVRSQVRfV09OIDB4MgorI2RlZmluZSBPUEVOIDB4MworI2RlZmluZSBPUEVORUQgMHg0CisjZGVmaW5lIFhNSVRURF9DTE9TRSAweDUKKyNkZWZpbmUgUkNWRF9DTE9TRSAweDYKKyNkZWZpbmUgVFJBTlNGRVIgMHg3CisKKy8vIChsb29wICJEb3duIiBzdGF0ZXMpCisjZGVmaW5lIElOSVRJQUxJWklORyAweDgKKyNkZWZpbmUgT19JX0lOSVQgMHg5CisjZGVmaW5lIE9fSV9QUk9UT0NPTCAweGEKKyNkZWZpbmUgT19JX0xJUF9SQ1ZEIDB4YgorI2RlZmluZSBIT1NUX0NPTlRST0wgMHhjCisjZGVmaW5lIExPT1BfRkFJTCAweGQKKy8vIChubyAweGUpCisjZGVmaW5lIE9MRF9QT1JUIDB4ZgorCisKKworI2RlZmluZSBUQUNIWU9OX0NISVBfSU5DCisjZW5kaWYKKyNlbmRpZiAvKiBDUFFGQ1RTQ0hJUF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3BxZmNUU2NvbnRyb2wuYyBiL2RyaXZlcnMvc2NzaS9jcHFmY1RTY29udHJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOTRjNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvY3BxZmNUU2NvbnRyb2wuYwpAQCAtMCwwICsxLDIyMzEgQEAKKy8qIENvcHlyaWdodCAyMDAwLCBDb21wYXEgQ29tcHV0ZXIgQ29ycG9yYXRpb24gCisgKiBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIgCisgKiA2NC1iaXQsIDY2TUh6IFBDSSAKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCB0ZXN0ZWQgb246CisgKiAoZnJvbnQpOiBbY2hpcF0gVGFjaHlvbiBUUyBIUEZDLTUxNjZBLzEuMiAgTDJDMTA5MCAuLi4KKyAqICAgICAgICAgIFNQIyBQMjI1Q1hDQkZJRUw2VCwgUmV2IFhDCisgKiAgICAgICAgICBTUCMgMTYxMjkwLTAwMSwgUmV2IFhECisgKiAoYmFjayk6IEJvYXJkIE5vLiAwMTAwMDgtMDAxIEEvVyBSZXYgWDUsIEZBQiBSRVYgWDUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiBXcml0dGVuIGJ5IERvbiBaaW1tZXJtYW4KKyovCisvKiBUaGVzZSBmdW5jdGlvbnMgY29udHJvbCB0aGUgaG9zdCBidXMgYWRhcHRlciAoSEJBKSBoYXJkd2FyZS4gIFRoZSBtYWluIGNoaXAKKyAgIGNvbnRyb2wgdGFrZXMgcGxhY2UgaW4gdGhlIGludGVycnVwdCBoYW5kbGVyIHdoZXJlIHdlIHByb2Nlc3MgdGhlIElNUSAKKyAgIChJbmJvdW5kIE1lc3NhZ2UgUXVldWUpLiAgVGhlIElNUSBpcyBUYWNoeW9uJ3Mgd2F5IG9mIGNvbW11bmljYXRpbmcgRkMgbGluaworICAgZXZlbnRzIGFuZCBzdGF0ZSBpbmZvcm1hdGlvbiB0byB0aGUgZHJpdmVyLiAgVGhlIFNpbmdsZSBGcmFtZSBRdWV1ZSAoU0ZRKQorICAgYnVmZmVycyBpbmNvbWluZyBGQyBmcmFtZXMgZm9yIHByb2Nlc3NpbmcgYnkgdGhlIGRyaXZlci4gIFJlZmVyZW5jZXMgdG8gCisgICAiVEwvVFMgVUciIGFyZSBmb3I6CisgICAiSFAgSFBGQy01MTAwLzUxNjYgVGFjaHlvbiBUTC9UUyBJQ3MgVXNlciBHdWlkZSIsIEF1Z3VzdCAxNiwgMTk5OSwgMXN0IEVkLgorICAgSGV3bGl0dCBQYWNrYXJkIE1hbnVhbCBQYXJ0IE51bWJlciA1OTY4LTEwODNFLgorKi8KKworI2RlZmluZSBMaW51eFZlcnNpb25Db2RlKHYsIHAsIHMpICgoKHYpPDwxNikrKChwKTw8OCkrKHMpKQorCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+ICAvLyByZXF1ZXN0X3JlZ2lvbigpIHByb3RvdHlwZQorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPiAgLy8gbmVlZCAia2ZyZWUiIGZvciBleHQuIFMvRyBwYWdlcworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4gIC8vIHN0cnVjdCBwdF9yZWdzIGZvciBJUlEgaGFuZGxlciAmIFBvcnQgSS9PCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4gICAvLyBTY3NpX0hvc3QgZGVmaW5pdGlvbiBmb3IgSU5UIGhhbmRsZXIKKyNpbmNsdWRlICJjcHFmY1RTY2hpcC5oIgorI2luY2x1ZGUgImNwcWZjVFNzdHJ1Y3RzLmgiCisKKy8vI2RlZmluZSBJTVFfREVCVUcgMQorCitzdGF0aWMgdm9pZCBmY1BhcnNlTGlua1N0YXR1c0NvdW50ZXJzKFRBQ0hZT04gKiBmY0NoaXApOworc3RhdGljIHZvaWQgQ3BxVHNHZXRTRlFFbnRyeShUQUNIWU9OICogZmNDaGlwLCAKKwkgICAgICBVU0hPUlQgcGksIFVMT05HICogYnVmZnIsIEJPT0xFQU4gVXBkYXRlQ2hpcCk7IAorCitzdGF0aWMgdm9pZCAKK2NwcWZjX2ZyZWVfZG1hX2NvbnNpc3RlbnQoQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSkKK3sKKyAgCS8vIGZyZWUgdXAgdGhlIHByaW1hcnkgRVhDSEFOR0VTIHN0cnVjdCBhbmQgTGluayBRCisJUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworCisJaWYgKGZjQ2hpcC0+RXhjaGFuZ2VzICE9IE5VTEwpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoY3BxZmNIQkFkYXRhLT5QY2lEZXYsIHNpemVvZihGQ19FWENIQU5HRVMpLAorCQkJZmNDaGlwLT5FeGNoYW5nZXMsIGZjQ2hpcC0+ZXhjaF9kbWFfaGFuZGxlKTsKKwlmY0NoaXAtPkV4Y2hhbmdlcyA9IE5VTEw7CisJaWYgKGNwcWZjSEJBZGF0YS0+ZmNMUSAhPSBOVUxMKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGNwcWZjSEJBZGF0YS0+UGNpRGV2LCBzaXplb2YoRkNfTElOS19RVUUpLAorCQkJY3BxZmNIQkFkYXRhLT5mY0xRLCBjcHFmY0hCQWRhdGEtPmZjTFFfZG1hX2hhbmRsZSk7CisJY3BxZmNIQkFkYXRhLT5mY0xRID0gTlVMTDsKK30KKworLy8gTm90ZSBzcGVjaWFsIHJlcXVpcmVtZW50cyBmb3IgUSBhbGlnbm1lbnQhICAoVEwvVFMgVUcgcGcuIDE5MCkKKy8vIFdlIHBsYWNlIGNyaXRpY2FsIGluZGV4IHBvaW50ZXJzIGF0IGVuZCBvZiBRVUUgZWxlbWVudHMgdG8gYXNzaXN0CisvLyBpbiBub24tc3ltYm9saWMgKGkuZS4gbWVtb3J5IGR1bXApIGRlYnVnZ2luZworLy8gb3Bjb2RlIGRlZmluZXMgcGxhY2VtZW50IG9mIFF1ZXVlcyAoZS5nLiBsb2NhbC9leHRlcm5hbCBSQU0pCisKK2ludCBDcHFUc0NyZWF0ZVRhY2hMaXRlUXVlcyggdm9pZCogcEhCQSwgaW50IG9wY29kZSkKK3sKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSA9IChDUFFGQ0hCQSopcEhCQTsKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworCisgIGludCBpU3RhdHVzPTA7CisgIHVuc2lnbmVkIGxvbmcgdWxBZGRyOworICBkbWFfYWRkcl90IEVSUWRtYSwgSU1RZG1hLCBTUFFkbWEsIFNFU1RkbWE7CisgIGludCBpOworCisgIC8vIE5PVEUhIGZjTWVtTWFuYWdlcigpIHdpbGwgcmV0dXJuIHN5c3RlbSB2aXJ0dWFsIGFkZHJlc3Nlcy4KKyAgLy8gU3lzdGVtIChrZXJuZWwpIHZpcnR1YWwgYWRkcmVzc2VzLCB0aG91Z2ggbm9uLXBhZ2VkLCBzdGlsbAorICAvLyBhcmVuJ3QgcGh5c2ljYWwgYWRkcmVzc2VzLiAgQ29udmVydCB0byBQSFlTSUNBTF9BRERSRVNTIGZvciBUYWNoeW9uJ3MKKyAgLy8gRE1BIHVzZS4KKyAgRU5URVIoIkNyZWF0ZVRhY2hMaXRlUXVlcyIpOworCisKKyAgLy8gQWxsb2NhdGUgcHJpbWFyeSBFWENIQU5HRVMgYXJyYXkuLi4KKyAgZmNDaGlwLT5FeGNoYW5nZXMgPSBOVUxMOworICBjcHFmY0hCQWRhdGEtPmZjTFEgPSBOVUxMOworICAKKyAgLyogcHJpbnRrKCJBbGxvY2F0aW5nICV1IGZvciAldSBFeGNoYW5nZXMgIiwgCisJICAoVUxPTkcpc2l6ZW9mKEZDX0VYQ0hBTkdFUyksIFRBQ0hfTUFYX1hJRCk7ICovCisgIGZjQ2hpcC0+RXhjaGFuZ2VzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoY3BxZmNIQkFkYXRhLT5QY2lEZXYsIAorCQkJc2l6ZW9mKEZDX0VYQ0hBTkdFUyksICZmY0NoaXAtPmV4Y2hfZG1hX2hhbmRsZSk7CisgIC8qIHByaW50aygiQCAlcFxuIiwgZmNDaGlwLT5FeGNoYW5nZXMpOyAqLworCisgIGlmKCBmY0NoaXAtPkV4Y2hhbmdlcyA9PSBOVUxMICkgLy8gZmF0YWwgZXJyb3IhIQorICB7CisgICAgcHJpbnRrKCJwY2lfYWxsb2NfY29uc2lzdGVudCBmYWlsdXJlIG9uIEV4Y2hhbmdlczogZmF0YWwgZXJyb3JcbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorICAvLyB6ZXJvIG91dCB0aGUgZW50aXJlIEVYQ0hBTkdFIHNwYWNlCisgIG1lbXNldCggZmNDaGlwLT5FeGNoYW5nZXMsIDAsIHNpemVvZiggRkNfRVhDSEFOR0VTKSk7ICAKKworCisgIC8qIHByaW50aygiQWxsb2NhdGluZyAldSBmb3IgTGlua1EgIiwgKFVMT05HKXNpemVvZihGQ19MSU5LX1FVRSkpOyAqLworICBjcHFmY0hCQWRhdGEtPmZjTFEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChjcHFmY0hCQWRhdGEtPlBjaURldiwKKwkJCQkgc2l6ZW9mKCBGQ19MSU5LX1FVRSksICZjcHFmY0hCQWRhdGEtPmZjTFFfZG1hX2hhbmRsZSk7CisgIC8qIHByaW50aygiQCAlcCAoJXUgZWxlbWVudHMpXG4iLCBjcHFmY0hCQWRhdGEtPmZjTFEsIEZDX0xJTktRX0RFUFRIKTsgKi8KKworICBpZiggY3BxZmNIQkFkYXRhLT5mY0xRID09IE5VTEwgKSAvLyBmYXRhbCBlcnJvciEhCisgIHsKKyAgICBjcHFmY19mcmVlX2RtYV9jb25zaXN0ZW50KGNwcWZjSEJBZGF0YSk7CisgICAgcHJpbnRrKCJwY2lfYWxsb2NfY29uc2lzdGVudCgpIGZhaWx1cmUgb24gZmMgTGluayBRdWU6IGZhdGFsIGVycm9yXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgLy8gemVybyBvdXQgdGhlIGVudGlyZSBFWENIQU5HRSBzcGFjZQorICBtZW1zZXQoIGNwcWZjSEJBZGF0YS0+ZmNMUSwgMCwgc2l6ZW9mKCBGQ19MSU5LX1FVRSkpOyAgCisgIAorICAvLyBWZXJpZnkgdGhhdCBiYXNpYyBUYWNoIEkvTyByZWdpc3RlcnMgYXJlIG5vdCBOVUxMICAKKyAgaWYoICFmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKQorICB7CisgICAgY3BxZmNfZnJlZV9kbWFfY29uc2lzdGVudChjcHFmY0hCQWRhdGEpOworICAgIHByaW50aygiSEJBIGJhc2UgYWRkcmVzcyBOVUxMOiBmYXRhbCBlcnJvclxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKworICAvLyBJbml0aWFsaXplIHRoZSBmY01lbU1hbmFnZXIgbWVtb3J5IHBhaXJzIChzdG9yZXMgYWxsb2NhdGVkL2FsaWduZWQKKyAgLy8gcGFpcnMgZm9yIGZ1dHVyZSBmcmVlaW5nKQorICBtZW1zZXQoIGNwcWZjSEJBZGF0YS0+ZHluYW1pY19tZW0sIDAsIHNpemVvZihjcHFmY0hCQWRhdGEtPmR5bmFtaWNfbWVtKSk7CisgIAorCisgIC8vIEFsbG9jYXRlIFRhY2gncyBFeGNoYW5nZSBSZXF1ZXN0IFF1ZXVlIChlYWNoIEVSUSBlbnRyeSAzMiBieXRlcykKKyAgCisgIGZjQ2hpcC0+RVJRID0gZmNNZW1NYW5hZ2VyKCBjcHFmY0hCQWRhdGEtPlBjaURldiwgCisJCQkmY3BxZmNIQkFkYXRhLT5keW5hbWljX21lbVswXSwgCisJCQlzaXplb2YoIFRhY2hMaXRlRVJRICksIDMyKihFUlFfTEVOKSwgMEwsICZFUlFkbWEpOworICBpZiggIWZjQ2hpcC0+RVJRICkKKyAgeworICAgIGNwcWZjX2ZyZWVfZG1hX2NvbnNpc3RlbnQoY3BxZmNIQkFkYXRhKTsKKyAgICBwcmludGsoInBjaV9hbGxvY19jb25zaXN0ZW50L2FsaWdubWVudCBmYWlsdXJlIG9uIEVSUTogZmF0YWwgZXJyb3JcbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBmY0NoaXAtPkVSUS0+bGVuZ3RoID0gRVJRX0xFTi0xOworICB1bEFkZHIgPSAoVUxPTkcpIEVSUWRtYTsgCisjaWYgQklUU19QRVJfTE9ORyA+IDMyCisgIGlmKCAodWxBZGRyID4+IDMyKSApCisgIHsKKyAgICBjcHFmY19mcmVlX2RtYV9jb25zaXN0ZW50KGNwcWZjSEJBZGF0YSk7CisgICAgcHJpbnRrKCIgRkFUQUwhIEVSUSBwdHIgJXAgZXhjZWVkcyBUYWNoeW9uJ3MgMzItYml0IHJlZ2lzdGVyIHNpemVcbiIsCisJCSAgICAodm9pZCopdWxBZGRyKTsKKyAgICByZXR1cm4gLTE7ICAvLyBmYWlsZWQKKyAgfQorI2VuZGlmCisgIGZjQ2hpcC0+RVJRLT5iYXNlID0gKFVMT05HKXVsQWRkcjsgIC8vIGNvcHkgZm9yIHF1aWNrIHJlZmVyZW5jZQorCisKKyAgLy8gQWxsb2NhdGUgVGFjaCdzIEluYm91bmQgTWVzc2FnZSBRdWV1ZSAoMzIgYnl0ZXMgcGVyIGVudHJ5KQorICAKKyAgZmNDaGlwLT5JTVEgPSBmY01lbU1hbmFnZXIoIGNwcWZjSEJBZGF0YS0+UGNpRGV2LCAKKwkJICAmY3BxZmNIQkFkYXRhLT5keW5hbWljX21lbVswXSwKKwkJICBzaXplb2YoIFRhY2h5b25JTVEgKSwgMzIqKElNUV9MRU4pLCAwTCwgJklNUWRtYSApOworICBpZiggIWZjQ2hpcC0+SU1RICkKKyAgeworICAgIGNwcWZjX2ZyZWVfZG1hX2NvbnNpc3RlbnQoY3BxZmNIQkFkYXRhKTsKKyAgICBwcmludGsoInBjaV9hbGxvY19jb25zaXN0ZW50L2FsaWdubWVudCBmYWlsdXJlIG9uIElNUTogZmF0YWwgZXJyb3JcbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBmY0NoaXAtPklNUS0+bGVuZ3RoID0gSU1RX0xFTi0xOworCisgIHVsQWRkciA9IElNUWRtYTsKKyNpZiBCSVRTX1BFUl9MT05HID4gMzIKKyAgaWYoICh1bEFkZHIgPj4gMzIpICkKKyAgeworICAgIGNwcWZjX2ZyZWVfZG1hX2NvbnNpc3RlbnQoY3BxZmNIQkFkYXRhKTsKKyAgICBwcmludGsoIiBGQVRBTCEgSU1RIHB0ciAlcCBleGNlZWRzIFRhY2h5b24ncyAzMi1iaXQgcmVnaXN0ZXIgc2l6ZVxuIiwKKwkJICAgICh2b2lkKil1bEFkZHIpOworICAgIHJldHVybiAtMTsgIC8vIGZhaWxlZAorICB9CisjZW5kaWYKKyAgZmNDaGlwLT5JTVEtPmJhc2UgPSAoVUxPTkcpdWxBZGRyOyAgLy8gY29weSBmb3IgcXVpY2sgcmVmZXJlbmNlCisKKworICAvLyBBbGxvY2F0ZSBUYWNoJ3MgIFNpbmdsZSBGcmFtZSBRdWV1ZSAoNjQgYnl0ZXMgcGVyIGVudHJ5KQorICBmY0NoaXAtPlNGUSA9IGZjTWVtTWFuYWdlciggY3BxZmNIQkFkYXRhLT5QY2lEZXYsIAorCQkgICZjcHFmY0hCQWRhdGEtPmR5bmFtaWNfbWVtWzBdLAorCQkgIHNpemVvZiggVGFjaExpdGVTRlEgKSwgNjQqKFNGUV9MRU4pLDBMLCAmU1BRZG1hICk7CisgIGlmKCAhZmNDaGlwLT5TRlEgKQorICB7CisgICAgY3BxZmNfZnJlZV9kbWFfY29uc2lzdGVudChjcHFmY0hCQWRhdGEpOworICAgIHByaW50aygicGNpX2FsbG9jX2NvbnNpc3RlbnQvYWxpZ25tZW50IGZhaWx1cmUgb24gU0ZROiBmYXRhbCBlcnJvclxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGZjQ2hpcC0+U0ZRLT5sZW5ndGggPSBTRlFfTEVOLTE7ICAgICAgLy8gaS5lLiBRdWUgbGVuZ3RoIFsjIGVudHJpZXMgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWluLiAzMjsgbWF4LiAgNDA5NiAoMHhmZmZmKV0KKyAgCisgIHVsQWRkciA9IFNQUWRtYTsKKyNpZiBCSVRTX1BFUl9MT05HID4gMzIKKyAgaWYoICh1bEFkZHIgPj4gMzIpICkKKyAgeworICAgIGNwcWZjX2ZyZWVfZG1hX2NvbnNpc3RlbnQoY3BxZmNIQkFkYXRhKTsKKyAgICBwcmludGsoIiBGQVRBTCEgU0ZRIHB0ciAlcCBleGNlZWRzIFRhY2h5b24ncyAzMi1iaXQgcmVnaXN0ZXIgc2l6ZVxuIiwKKwkJICAgICh2b2lkKil1bEFkZHIpOworICAgIHJldHVybiAtMTsgIC8vIGZhaWxlZAorICB9CisjZW5kaWYKKyAgZmNDaGlwLT5TRlEtPmJhc2UgPSAoVUxPTkcpdWxBZGRyOyAgLy8gY29weSBmb3IgcXVpY2sgcmVmZXJlbmNlCisKKworICAvLyBBbGxvY2F0ZSBTQ1NJIEV4Y2hhbmdlIFN0YXRlIFRhYmxlOyBhbGlnbmVkIG5lYXJlc3QgQHNpemVvZgorICAvLyBwb3dlci1vZi0yIGJvdW5kYXJ5CisgIC8vIExJVkUgREFOR0VST1VTTFkhICBBc3N1bWUgdGhlIGJvdW5kYXJ5IGZvciBTRVNUIG1lbSB3aWxsCisgIC8vIGJlIG9uIHBoeXNpY2FsIHBhZ2UgKGUuZy4gNGspIGJvdW5kYXJ5LgorICAvKiBwcmludGsoIkFsbG9jYXRpbmcgJXUgZm9yIFRhY2hTRVNUIGZvciAldSBFeGNoYW5nZXNcbiIsIAorCQkgKFVMT05HKXNpemVvZihUYWNoU0VTVCksIFRBQ0hfU0VTVF9MRU4pOyAqLworICBmY0NoaXAtPlNFU1QgPSBmY01lbU1hbmFnZXIoIGNwcWZjSEJBZGF0YS0+UGNpRGV2LAorCQkgICZjcHFmY0hCQWRhdGEtPmR5bmFtaWNfbWVtWzBdLAorCQkgIHNpemVvZihUYWNoU0VTVCksICA0LCAwTCwgJlNFU1RkbWEgKTsKKy8vCQkgIHNpemVvZihUYWNoU0VTVCksICA2NCpUQUNIX1NFU1RfTEVOLCAwTCApOworICBpZiggIWZjQ2hpcC0+U0VTVCApCisgIHsKKyAgICBjcHFmY19mcmVlX2RtYV9jb25zaXN0ZW50KGNwcWZjSEJBZGF0YSk7CisgICAgcHJpbnRrKCJwY2lfYWxsb2NfY29uc2lzdGVudC9hbGlnbm1lbnQgZmFpbHVyZSBvbiBTRVNUOiBmYXRhbCBlcnJvclxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgZm9yKCBpPTA7IGkgPCBUQUNIX1NFU1RfTEVOOyBpKyspICAvLyBmb3IgZWFjaCBleGNoYW5nZQorICAgICAgZmNDaGlwLT5TRVNULT5zZ1BhZ2VzW2ldID0gTlVMTDsKKworICBmY0NoaXAtPlNFU1QtPmxlbmd0aCA9IFRBQ0hfU0VTVF9MRU47ICAvLyBlLmcuIERPTidUIHN1YnRyYWN0IG9uZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChUTC9UUyBVRywgcGcgMTUzKQorCisgIHVsQWRkciA9IFNFU1RkbWE7IAorI2lmIEJJVFNfUEVSX0xPTkcgPiAzMgorICBpZiggKHVsQWRkciA+PiAzMikgKQorICB7CisgICAgY3BxZmNfZnJlZV9kbWFfY29uc2lzdGVudChjcHFmY0hCQWRhdGEpOworICAgIHByaW50aygiIEZBVEFMISBTRlEgcHRyICVwIGV4Y2VlZHMgVGFjaHlvbidzIDMyLWJpdCByZWdpc3RlciBzaXplXG4iLAorCQkgICAgKHZvaWQqKXVsQWRkcik7CisgICAgcmV0dXJuIC0xOyAgLy8gZmFpbGVkCisgIH0KKyNlbmRpZgorICBmY0NoaXAtPlNFU1QtPmJhc2UgPSAoVUxPTkcpdWxBZGRyOyAgLy8gY29weSBmb3IgcXVpY2sgcmVmZXJlbmNlCisKKworCQkJICAgICAgLy8gTm93IHRoYXQgc3RydWN0dXJlcyBhcmUgZGVmaW5lZCwKKwkJCSAgICAgIC8vIGZpbGwgaW4gVGFjaHlvbiBjaGlwIHJlZ2lzdGVycy4uLgorCisJCQkgICAgICAvLyBFRUVFRUVFRSAgRVhDSEFOR0UgUkVRVUVTVCBRVUVVRQorCisgIHdyaXRlbCggZmNDaGlwLT5FUlEtPmJhc2UsIAorICAgIChmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fRVJRX0JBU0UpKTsKKyAgICAgIAorICB3cml0ZWwoIGZjQ2hpcC0+RVJRLT5sZW5ndGgsCisgICAgKGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9FUlFfTEVOR1RIKSk7CisgICAgIAorCisgIGZjQ2hpcC0+RVJRLT5wcm9kdWNlckluZGV4ID0gMEw7CisgIHdyaXRlbCggZmNDaGlwLT5FUlEtPnByb2R1Y2VySW5kZXgsCisgICAgKGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9FUlFfUFJPRFVDRVJfSU5ERVgpKTsKKyAgICAgIAorCisJCS8vIE5PVEUhIHdyaXRlIGNvbnN1bWVyIGluZGV4IGxhc3QsIHNpbmNlIHRoZSB3cml0ZQorCQkvLyBjYXVzZXMgVGFjaHlvbiB0byBwcm9jZXNzIHRoZSBvdGhlciByZWdpc3RlcnMKKworICB1bEFkZHIgPSAoKHVuc2lnbmVkIGxvbmcpJmZjQ2hpcC0+RVJRLT5jb25zdW1lckluZGV4IC0gCisJCSh1bnNpZ25lZCBsb25nKWZjQ2hpcC0+RVJRKSArICh1bnNpZ25lZCBsb25nKSBFUlFkbWE7CisKKyAgLy8gTk9URSEgVGFjaHlvbiBETUFzIHRvIHRoZSBFUlEgY29uc3VtZXIgSW5kZXggaG9zdAorCQkvLyBhZGRyZXNzOyBtdXN0IGJlIGNvcnJlY3RseSBhbGlnbmVkCisgIHdyaXRlbCggKFVMT05HKXVsQWRkciwKKyAgICAoZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX0VSUV9DT05TVU1FUl9JTkRFWF9BRFIpKTsKKworCisKKwkJCQkgLy8gSUlJSUlJSUlJSUlJSSAgSU5CT1VORCBNRVNTQUdFIFFVRVVFCisJCQkJIC8vIFRlbGwgVGFjaHlvbiB3aGVyZSB0aGUgUXVlIHN0YXJ0cworCisgIC8vIHNldCB0aGUgSG9zdCdzIHBvaW50ZXIgZm9yIFRhY2h5b24gdG8gYWNjZXNzCisKKyAgLyogcHJpbnRrKCIgIGNwcWZjVFM6IHdyaXRpbmcgSU1RIEJBU0UgJVhoICAiLCBmY0NoaXAtPklNUS0+YmFzZSApOyAqLworICB3cml0ZWwoIGZjQ2hpcC0+SU1RLT5iYXNlLCAKKyAgICAoZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgSU1RX0JBU0UpKTsKKworICB3cml0ZWwoIGZjQ2hpcC0+SU1RLT5sZW5ndGgsCisgICAgKGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIElNUV9MRU5HVEgpKTsKKworICB3cml0ZWwoIGZjQ2hpcC0+SU1RLT5jb25zdW1lckluZGV4LAorICAgIChmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBJTVFfQ09OU1VNRVJfSU5ERVgpKTsKKworCisJCS8vIE5PVEU6IFRhY2hMaXRlIERNQXMgdG8gdGhlIHByb2R1Y2VySW5kZXggaG9zdCBhZGRyZXNzCisJCS8vIG11c3QgYmUgY29ycmVjdGx5IGFsaWduZWQgd2l0aCBhZGRyZXNzIGJpdHMgMS0wIGNsZWFyZWQKKyAgICAvLyBXcml0aW5nIHRoZSBCQVNFIHJlZ2lzdGVyIGNsZWFycyB0aGUgUEkgcmVnaXN0ZXIsIHNvIHdyaXRlIGl0IGxhc3QKKyAgdWxBZGRyID0gKCh1bnNpZ25lZCBsb25nKSZmY0NoaXAtPklNUS0+cHJvZHVjZXJJbmRleCAtIAorCQkodW5zaWduZWQgbG9uZylmY0NoaXAtPklNUSkgKyAodW5zaWduZWQgbG9uZykgSU1RZG1hOworCisjaWYgQklUU19QRVJfTE9ORyA+IDMyCisgIGlmKCAodWxBZGRyID4+IDMyKSApCisgIHsKKyAgICBjcHFmY19mcmVlX2RtYV9jb25zaXN0ZW50KGNwcWZjSEJBZGF0YSk7CisgICAgcHJpbnRrKCIgRkFUQUwhIElNUSBwdHIgJXAgZXhjZWVkcyBUYWNoeW9uJ3MgMzItYml0IHJlZ2lzdGVyIHNpemVcbiIsCisJCSAgICAodm9pZCopdWxBZGRyKTsKKyAgICByZXR1cm4gLTE7ICAvLyBmYWlsZWQKKyAgfQorI2VuZGlmCisjaWYgREJHCisgIHByaW50aygiICBQSSAlWGhcbiIsIChVTE9ORyl1bEFkZHIgKTsKKyNlbmRpZgorICB3cml0ZWwoIChVTE9ORyl1bEFkZHIsIAorICAgIChmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBJTVFfUFJPRFVDRVJfSU5ERVgpKTsKKworCisKKwkJCQkgLy8gU1NTU1NTU1NTU1NTU1NTIFNJTkdMRSBGUkFNRSBTRVFVRU5DRQorCQkJCSAvLyBUZWxsIFRhY2hMaXRlIHdoZXJlIHRoZSBRdWUgc3RhcnRzCisKKyAgd3JpdGVsKCBmY0NoaXAtPlNGUS0+YmFzZSwgCisgICAgKGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9TRlFfQkFTRSkpOworCisgIHdyaXRlbCggZmNDaGlwLT5TRlEtPmxlbmd0aCwKKyAgICAoZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX1NGUV9MRU5HVEgpKTsKKworCisgICAgICAgICAvLyB0ZWxsIFRhY2hMaXRlIHdoZXJlIFNFU1QgdGFibGUgaXMgJiBob3cgbG9uZworICB3cml0ZWwoIGZjQ2hpcC0+U0VTVC0+YmFzZSwKKyAgICAoZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX1NFU1RfQkFTRSkpOworCisgIC8qIHByaW50aygiICBjcHFmY1RTOiBTRVNUICVwKHZpcnQpOiBXcm90ZSBiYXNlICVYaCBAICVwXG4iLAorICAgIGZjQ2hpcC0+U0VTVCwgZmNDaGlwLT5TRVNULT5iYXNlLCAKKyAgICBmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fU0VTVF9CQVNFKTsgKi8KKworICB3cml0ZWwoIGZjQ2hpcC0+U0VTVC0+bGVuZ3RoLAorICAgIChmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fU0VTVF9MRU5HVEgpKTsKKyAgICAgIAorICB3cml0ZWwoIChUTF9FWFRfU0dfUEFHRV9DT1VOVC0xKSwKKyAgICAoZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX1NFU1RfU0dfUEFHRSkpOworCisKKyAgTEVBVkUoIkNyZWF0ZVRhY2hMaXRlUXVlcyIpOworCisgIHJldHVybiBpU3RhdHVzOworfQorCisKKworLy8gZnVuY3Rpb24gdG8gcmV0dXJuIFRhY2hMaXRlIHRvIFBvd2VyIE9uIHN0YXRlCisvLyAxc3QgLSByZXNldCB0YWNoeW9uICgnU09GVCcgcmVzZXQpCisvLyBvdGhlcnMgLSBmdXR1cmUKKworaW50IENwcVRzUmVzZXRUYWNoTGl0ZSh2b2lkICpwSEJBLCBpbnQgdHlwZSkKK3sKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSA9IChDUFFGQ0hCQSopcEhCQTsKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworICBVTE9ORyB1bEJ1ZmYsIGk7CisgIGludCByZXRfc3RhdHVzPTA7IC8vIGRlZi4gc3VjY2VzcworCisgIEVOVEVSKCJSZXNldFRhY2giKTsKKyAgCisgIHN3aXRjaCh0eXBlKQorICB7CisKKyAgICBjYXNlIENMRUFSX0ZDUE9SVFM6CisKKyAgICAgIC8vIGluIGNhc2UgaGUgd2FzIHJ1bm5pbmcgcHJldmlvdXNseSwgbWFzayBUYWNoJ3MgaW50ZXJydXB0CisgICAgICB3cml0ZWIoIDAsIChmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBJSU5URU4pKTsKKyAgICAgIAorICAgICAvLyBkZS1hbGxvY2F0ZSBtZW0gZm9yIGFueSBMb2dnZWQgaW4gcG9ydHMKKyAgICAgIC8vIChlLmcuLCBvdXIgbW9kdWxlIGlzIHVubG9hZGluZykKKyAgICAgIC8vIHNlYXJjaCB0aGUgZm9yd2FyZCBsaW5rZWQgbGlzdCwgZGUtYWxsb2NhdGluZworICAgICAgLy8gdGhlIG1lbW9yeSB3ZSBhbGxvY2F0ZWQgd2hlbiB0aGUgcG9ydCB3YXMgaW5pdGlhbGx5IGxvZ2dlZCBpbgorICAgICAgeworICAgICAgICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0ID0gZmNDaGlwLT5mY1BvcnRzLnBOZXh0UG9ydDsKKyAgICAgICAgUEZDX0xPR0dFRElOX1BPUlQgcHRyOworLy8gICAgICAgIHByaW50aygiY2hlY2tpbmcgZm9yIGFsbG9jYXRlZCBMb2dnZWRJblBvcnRzLi4uXG4iKTsKKwkJCQorICAgICAgICB3aGlsZSggcExvZ2dlZEluUG9ydCApCisgICAgICAgIHsKKyAgICAgICAgICBwdHIgPSBwTG9nZ2VkSW5Qb3J0OworICAgICAgICAgIHBMb2dnZWRJblBvcnQgPSBwdHItPnBOZXh0UG9ydDsKKy8vCSAgcHJpbnRrKCJrZnJlZSglcCkgb24gRkMgTG9nZ2VkSW5Qb3J0IHBvcnRfaWQgMHglMDZsWFxuIiwKKy8vCQkJICBwdHIsIHB0ci0+cG9ydF9pZCk7CisgICAgICAgICAga2ZyZWUoIHB0ciApOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyAoY29udGludWUgcmVzZXR0aW5nIGhhcmR3YXJlLi4uKQorCisgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAvLyBSRVNUQVJUIFRhY2h5b24gKHBvd2VyLXVwIHN0YXRlKQorCisgICAgICAvLyBpbiBjYXNlIGhlIHdhcyBydW5uaW5nIHByZXZpb3VzbHksIG1hc2sgVGFjaCdzIGludGVycnVwdAorICAgICAgd3JpdGViKCAwLCAoZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgSUlOVEVOKSk7CisJCQkgICAgICAvLyB0dXJuIE9GRiBsYXNlciAoTk9URTogbGFzZXIgaXMgdHVybmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmYgZHVyaW5nIHJlc2V0LCBiZWNhdXNlIEdQSU80IGlzIGNsZWFyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIDAgYnkgcmVzZXQgYWN0aW9uIC0gc2VlIFRMVU0sIHNlYyA3LjIyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgQ1BRIDY0LWJpdCBIQkFzIGhhdmUgYSAiaGVhbHRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaXJjdWl0IiB3aGljaCBrZWVwcyBsYXNlciBPTiBmb3IgYSBicmllZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyaW9kIGFmdGVyIGl0IGlzIHR1cm5lZCBvZmYgKCA8IDFzKQorICAgICAgCisgICAgICBmY0NoaXAtPkxhc2VyQ29udHJvbCggZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlLCAwKTsKKyAgCisKKworICAgICAgICAgICAgLy8gc29mdCByZXNldCB0aW1pbmcgY29uc3RyYWludHMgcmVxdWlyZToKKyAgICAgICAgICAgIC8vICAgMS4gc2V0IFJTVCB0byAxCisgICAgICAgICAgICAvLyAgIDIuIHJlYWQgU09GVFJTVCByZWdpc3RlciAKKyAgICAgICAgICAgIC8vICAgICAgKDEyOCB0aW1lcyBwZXIgUi4gQ2FsbGlzb24gY29kZSkKKyAgICAgICAgICAgIC8vICAgMy4gY2xlYXIgUENJIGludHMKKyAgICAgICAgICAgIC8vICAgNC4gY2xlYXIgUlNUIHRvIDAKKyAgICAgIHdyaXRlbCggMHhmZjAwMDAwMUwsCisgICAgICAgIChmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fU09GVFJTVCkpOworICAgICAgICAKKyAgICAgIGZvciggaT0wOyBpPDEyODsgaSsrKQorICAgICAgICB1bEJ1ZmYgPSByZWFkbCggZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX1NPRlRSU1QpOworCisgICAgICAgIC8vIGNsZWFyIHRoZSBzb2Z0IHJlc2V0CisgICAgICBmb3IoIGk9MDsgaTw4OyBpKyspCisgIAl3cml0ZWwoIDAsIChmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fU09GVFJTVCkpOworCisgICAgICAgICAgICAgICAKKworCQkJICAgICAgIC8vIGNsZWFyIG91dCBvdXIgY29weSBvZiBUYWNoIHJlZ3MsCisJCQkgICAgICAgLy8gYmVjYXVzZSB0aGV5IG11c3QgYmUgaW52YWxpZCBub3csCisJCQkgICAgICAgLy8gc2luY2UgVGFjaExpdGUgcmVzZXQgYWxsIGhpcyByZWdzLgorICAgICAgQ3BxVHNEZXN0cm95VGFjaExpdGVRdWVzKGNwcWZjSEJBZGF0YSwwKTsgLy8gcmVtb3ZlIEhvc3QtYmFzZWQgUXVlIHN0cnVjdHMKKyAgICAgIGNwcWZjVFNDbGVhckxpbmtTdGF0dXNDb3VudGVycyhmY0NoaXApOyAgLy8gY2xlYXIgb3VyIHMvdyBhY2N1bXVsYXRvcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb3dlciBiaXRzIGdpdmUgR0JJQyBpbmZvCisgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5UWXN0YXR1cy52YWx1ZSA9IAorCSAgICAgICAgICAgICAgcmVhZGwoIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZc3RhdHVzLmFkZHJlc3MgKTsKKyAgICAgIGJyZWFrOworCisvKgorICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgLy8gZnJlZXplIFNDU0kKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IE91dGJvdW5kIGNvbW1hbmQgcXVlIChFUlEpCisgICAgY2FzZSA0OiAgICAgICAgICAgICAgICAgICAvLyB1bmZyZWV6ZSBPU00gKE91dGJvdW5kIFNlcS4gTWFuLikgJ2VyJworICAgIGNhc2UgNTogICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0IHN0YXR1cworCisgICAgYnJlYWs7CisqLworICAgIGRlZmF1bHQ6CisgICAgICByZXRfc3RhdHVzID0gLTE7ICAvLyBpbnZhbGlkIG9wdGlvbiBwYXNzZWQgdG8gUkVTRVQgZnVuY3Rpb24KKyAgICAgIGJyZWFrOworICB9CisgIExFQVZFKCJSZXNldFRhY2giKTsKKyAgcmV0dXJuIHJldF9zdGF0dXM7Cit9CisKKworCisKKworCisvLyAnYWRkckJhc2UnIGlzIElPQmFzZVUgZm9yIGJvdGggVGFjaExpdGUgYW5kIChvbGRlcikgVGFjaHlvbgoraW50IENwcVRzTGFzZXJDb250cm9sKCB2b2lkKiBhZGRyQmFzZSwgaW50IG9wY29kZSApCit7CisgIFVMT05HIGR3QnVmZjsKKworICBkd0J1ZmYgPSByZWFkbCgoYWRkckJhc2UgKyBUTF9NRU1fVEFDSF9DT05UUk9MKSApOyAvLyByZWFkIFRMIENvbnRyb2wgcmVnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGNoYW5nZSBvbmx5IGJpdCA0KQorICBpZiggb3Bjb2RlID09IDEpCisgICAgZHdCdWZmIHw9IH4weGZmZmZmZmVmTDsgLy8gc2V0IC0gT04KKyAgZWxzZQorICAgIGR3QnVmZiAmPSAweGZmZmZmZmVmTDsgIC8vIGNsZWFyIC0gT0ZGCisgIHdyaXRlbCggZHdCdWZmLCAoYWRkckJhc2UgKyBUTF9NRU1fVEFDSF9DT05UUk9MKSk7IC8vIHdyaXRlIFRMIENvbnRyb2wgcmVnCisgIHJldHVybiAwOworfQorCisKKworCisKKy8vIFVzZSBjb250cm9sbGVyJ3MgIk9wdGlvbnMiIGZpZWxkIHRvIGRldGVybWluZSBsb29wYmFjayBtb2RlIChpZiBhbnkpCisvLyAgIGludGVybmFsIGxvb3BiYWNrIChzaWxpY29uIC0gbm8gR0JJQykKKy8vICAgZXh0ZXJuYWwgbG9vcGJhY2sgKEdCSUMgLSBubyBGQyBsb29wKQorLy8gICBubyBsb29wYmFjazogTF9QT1JULCBleHRlcm5hbCBjYWJsZSBmcm9tIEdCSUMgcmVxdWlyZWQKKworaW50IENwcVRzSW5pdGlhbGl6ZUZyYW1lTWFuYWdlciggdm9pZCAqcENoaXAsIGludCBvcGNvZGUpCit7CisgIFBUQUNIWU9OIGZjQ2hpcDsKKyAgaW50IGlTdGF0dXM7CisgIFVMT05HIHd3bkxvLCB3d25IaTsgLy8gZm9yIHJlYWRiYWNrIHZlcmlmaWNhdGlvbgorCisgIEVOVEVSKCJJbml0aWFsaXplRnJhbWVNYW5hZ2VyIik7CisgIGZjQ2hpcCA9IChQVEFDSFlPTilwQ2hpcDsKKyAgaWYoICFmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKSAgIC8vIHVuZGVmaW5lZCBjb250cm9sbGVyPworICAgIHJldHVybiAtMTsKKworICAvLyBUTC9UUyBVRywgcGcuIDE4NAorICAvLyAweDAwNjUgPSAxMDBtcyBmb3IgUlRfVE9WCisgIC8vIDB4MDFmNSA9IDUwMG1zIGZvciBFRF9UT1YKKyAgLy8gMHgwN0QxID0gMjAwMG1zIAorICBmY0NoaXAtPlJlZ2lzdGVycy5lZF90b3YudmFsdWUgPSAweDAwNjUwN0QxOyAKKyAgd3JpdGVsKCBmY0NoaXAtPlJlZ2lzdGVycy5lZF90b3YudmFsdWUsCisgICAgKGZjQ2hpcC0+UmVnaXN0ZXJzLmVkX3Rvdi5hZGRyZXNzKSk7CisgICAgICAKKworICAvLyBTZXQgTFBfVE9WIHRvIHRoZSBGQy1BTDIgc3BlY2lmaWVkIDIgc2Vjcy4KKyAgLy8gVEwvVFMgVUcsIHBnLiAxODUKKyAgd3JpdGVsKCAweDA3ZDAwMDEwLCBmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgK1RMX01FTV9GTV9USU1FT1VUMik7CisKKworICAvLyBOb3cgdHJ5IHRvIHJlYWQgdGhlIFdXTiBmcm9tIHRoZSBhZGFwdGVyJ3MgTlZSQU0KKyAgaVN0YXR1cyA9IENwcVRzUmVhZFdyaXRlV1dOKCBmY0NoaXAsIDEpOyAvLyAnMScgZm9yIFJFQUQKKworICBpZiggaVN0YXR1cyApICAgLy8gTlZSQU0gcmVhZCBmYWlsZWQ/CisgIHsKKyAgICBwcmludGsoIiBXQVJOSU5HISBIQkEgTlZSQU0gV1dOIHJlYWQgZmFpbGVkIC0gbWFrZSBhbGlhc1xuIik7CisgICAgLy8gbWFrZSB1cCBhIFdXTi4gIElmIE5VTEwgb3IgZHVwbGljYXRlZCBvbiBsb29wLCBGQyBsb29wIG1heSBoYW5nIQorCisKKyAgICBmY0NoaXAtPlJlZ2lzdGVycy53d25faGkgPSAoX191MzIpamlmZmllczsKKyAgICBmY0NoaXAtPlJlZ2lzdGVycy53d25faGkgfD0gMHg1MDAwMDAwMEw7CisgICAgZmNDaGlwLT5SZWdpc3RlcnMud3duX2xvID0gMHg0NDU1NjY3N0w7CisgIH0KKworICAKKyAgd3JpdGVsKCBmY0NoaXAtPlJlZ2lzdGVycy53d25faGksIAorCSAgZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX0ZNX1dXTl9ISSk7CisgIAorICB3cml0ZWwoIGZjQ2hpcC0+UmVnaXN0ZXJzLnd3bl9sbywgCisJICBmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fRk1fV1dOX0xPKTsKKwkgIAorCisgIC8vIHJlYWRiYWNrIGZvciB2ZXJpZmljYXRpb246CisgIHd3bkhpID0gcmVhZGwoIGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9GTV9XV05fSEkgKTsgCisgICAgICAgICAgCisgIHd3bkxvID0gcmVhZGwoIGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9GTV9XV05fTE8pOworICAvLyB0ZXN0IGZvciBjb3JyZWN0IGNoaXAgcmVnaXN0ZXIgV1JJVEUvUkVBRAorICBERUJVR19QQ0koIHByaW50aygiICBXV04gJTA4WCUwOFhcbiIsCisgICAgZmNDaGlwLT5SZWdpc3RlcnMud3duX2hpLCBmY0NoaXAtPlJlZ2lzdGVycy53d25fbG8gKSApOworICAgIAorICBpZiggd3duSGkgIT0gZmNDaGlwLT5SZWdpc3RlcnMud3duX2hpIHx8CisgICAgICB3d25MbyAhPSBmY0NoaXAtPlJlZ2lzdGVycy53d25fbG8gKQorICB7CisgICAgcHJpbnRrKCAiY3BxZmNUUzogV29ybGRXaWRlTmFtZSByZWdpc3RlciBsb2FkIGZhaWxlZFxuIik7CisgICAgcmV0dXJuIC0xOyAvLyBGQUlMRUQhCisgIH0KKworCisKKwkJCS8vIHNldCBGcmFtZSBNYW5hZ2VyIEluaXRpYWxpemUgY29tbWFuZAorICBmY0NoaXAtPlJlZ2lzdGVycy5GTWNvbnRyb2wudmFsdWUgPSAweDA2OworCisgIC8vIE5vdGU6IGZvciB0ZXN0L2RlYnVnIHB1cnBvc2VzLCB3ZSBtYXkgdXNlICJIYXJkIiBhZGRyZXNzLAorICAvLyBidXQgd2UgY29tcGxldGVseSBzdXBwb3J0ICJzb2Z0IiBhZGRyZXNzaW5nLCBpbmNsdWRpbmcKKyAgLy8gZHluYW1pY2FsbHkgY2hhbmdpbmcgb3VyIGFkZHJlc3MuCisgIGlmKCBmY0NoaXAtPk9wdGlvbnMuaW50TG9vcGJhY2sgPT0gMSApICAgICAgICAgICAgLy8gaW50ZXJuYWwgbG9vcGJhY2sKKyAgICBmY0NoaXAtPlJlZ2lzdGVycy5GTWNvbmZpZy52YWx1ZSA9IDB4MGYwMDIwODBMOworICBlbHNlIGlmKCBmY0NoaXAtPk9wdGlvbnMuZXh0TG9vcGJhY2sgPT0gMSApICAgICAgICAgICAgLy8gaW50ZXJuYWwgbG9vcGJhY2sKKyAgICBmY0NoaXAtPlJlZ2lzdGVycy5GTWNvbmZpZy52YWx1ZSA9IDB4MGYwMDQwODBMOworICBlbHNlICAgICAgICAgICAgICAgICAgLy8gTF9Qb3J0CisgICAgZmNDaGlwLT5SZWdpc3RlcnMuRk1jb25maWcudmFsdWUgPSAweDU1MDAwMTAwTDsgLy8gaGFyZCBhZGRyZXNzICg1NWggc3RhcnQpCisvLyAgICBmY0NoaXAtPlJlZ2lzdGVycy5GTWNvbmZpZy52YWx1ZSA9IDB4MDEwMDAwODBMOyAvLyBzb2Z0IGFkZHJlc3MgKGNhbid0IHBpY2spCisvLyAgICBmY0NoaXAtPlJlZ2lzdGVycy5GTWNvbmZpZy52YWx1ZSA9IDB4NTUwMDAxMDBMOyAvLyBoYXJkIGFkZHJlc3MgKDU1aCBzdGFydCkKKwkJCisgIC8vIHdyaXRlIGNvbmZpZyB0byBGTQorCisgIGlmKCAhZmNDaGlwLT5PcHRpb25zLmludExvb3BiYWNrICYmICFmY0NoaXAtPk9wdGlvbnMuZXh0TG9vcGJhY2sgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChhbHNvIG5lZWQgTEFTRVIgZm9yIHJlYWwgTE9PUCkKKyAgICBmY0NoaXAtPkxhc2VyQ29udHJvbCggZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlLCAxKTsgLy8gdHVybiBvbiBMQVNFUgorCisgIHdyaXRlbCggZmNDaGlwLT5SZWdpc3RlcnMuRk1jb25maWcudmFsdWUsCisgICAgZmNDaGlwLT5SZWdpc3RlcnMuRk1jb25maWcuYWRkcmVzcyk7CisgICAgCisKKwkJCSAgICAgICAvLyBpc3N1ZSBJTklUSUFMSVpFIGNvbW1hbmQgdG8gRk0gLSBBQ1RJT04hCisgIHdyaXRlbCggZmNDaGlwLT5SZWdpc3RlcnMuRk1jb250cm9sLnZhbHVlLAorICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNY29udHJvbC5hZGRyZXNzKTsKKyAgICAKKyAgTEVBVkUoIkluaXRpYWxpemVGcmFtZU1hbmFnZXIiKTsKKyAgCisgIHJldHVybiAwOworfQorCisKKworCisKKy8vIFRoaXMgImxvb2sgYWhlYWQiIGZ1bmN0aW9uIGV4YW1pbmVzIHRoZSBJTVEgZm9yIG9jY3VycmVuY2Ugb2YKKy8vICJ0eXBlIi4gIFJldHVybnMgMSBpZiBmb3VuZCwgMCBpZiBub3QuCitzdGF0aWMgaW50IFBlZWtJTVFFbnRyeSggUFRBQ0hZT04gZmNDaGlwLCBVTE9ORyB0eXBlKQoreworICBVTE9ORyBDSSA9IGZjQ2hpcC0+SU1RLT5jb25zdW1lckluZGV4OworICBVTE9ORyBQSSA9IGZjQ2hpcC0+SU1RLT5wcm9kdWNlckluZGV4OyAvLyBzbmFwc2hvdCBvZiBJTVEgaW5kZXhlcworICAKKyAgd2hpbGUoIENJICE9IFBJICkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VlZCB3aXRoIHNlYXJjaAorICAgIGlmKCAoKytDSSkgPj0gSU1RX0xFTiApIENJID0gMDsgLy8gcm9sbG92ZXIgY2hlY2sKKyAgICAKKyAgICBzd2l0Y2goIHR5cGUgKQorICAgIHsKKyAgICAgIGNhc2UgRUxTX0xJTFBfRlJBTUU6CisgICAgICB7CisgICAgICAvLyBmaXJzdCwgd2UgbmVlZCB0byBmaW5kIGFuIEluYm91bmQgQ29tcGxldGlvbiBtZXNzYWdlLAorICAgICAgLy8gSWYgd2UgZmluZCBpdCwgY2hlY2sgdGhlIGluY29taW5nIGZyYW1lIHBheWxvYWQgKDFzdCB3b3JkKQorICAgICAgLy8gZm9yIExJTFAgZnJhbWUKKyAgICAgICAgaWYoIChmY0NoaXAtPklNUS0+UUVudHJ5W0NJXS50eXBlICYgMHgxRkYpID09IDB4MTA0ICkKKyAgICAgICAgeyAKKyAgICAgICAgICBUYWNoRkNIRFJfR0NNTkQqIGZjaHM7CisjZXJyb3IgVGhpcyBpcyB0b28gbXVjaCBzdGFjaworICAgICAgICAgIFVMT05HIHVsRmlicmVGcmFtZVsyMDQ4LzRdOyAgLy8gbWF4IERXT1JEUyBpbiBpbmNvbWluZyBGQyBGcmFtZQorCSAgVVNIT1JUIFNGUXBpID0gKFVTSE9SVCkoZmNDaGlwLT5JTVEtPlFFbnRyeVtDSV0ud29yZFswXSAmIDB4MGZmZkwpOworCisJICBDcHFUc0dldFNGUUVudHJ5KCBmY0NoaXAsCisgICAgICAgICAgICBTRlFwaSwgICAgICAgIC8vIFNGUSBwcm9kdWNlciBuZHggICAgICAgICAKKwkgICAgdWxGaWJyZUZyYW1lLCAvLyBjb250aWd1b3VzIGRlc3QuIGJ1ZmZlcgorCSAgICBGQUxTRSk7ICAgICAgIC8vIERPTidUIHVwZGF0ZSBjaGlwLS10aGlzIGlzIGEgImxvb2thaGVhZCIKKyAgICAgICAgICAKKwkgIGZjaHMgPSAoVGFjaEZDSERSX0dDTU5EKikmdWxGaWJyZUZyYW1lOworICAgICAgICAgIGlmKCBmY2hzLT5wbFswXSA9PSBFTFNfTElMUF9GUkFNRSkKKwkgIHsKKyAgICAgICAgICAgIHJldHVybiAxOyAvLyBmb3VuZCB0aGUgTElMUCBmcmFtZSEKKwkgIH0KKwkgIGVsc2UKKwkgIHsKKwkgICAgLy8ga2VlcCBsb29raW5nLi4uCisJICB9CisJfSAgCisgICAgICB9CisgICAgICBicmVhazsKKworICAgICAgY2FzZSBPVVRCT1VORF9DT01QTEVUSU9OOgorICAgICAgICBpZiggKGZjQ2hpcC0+SU1RLT5RRW50cnlbQ0ldLnR5cGUgJiAweDFGRikgPT0gMHgwMCApCisJeworCisgICAgICAgICAgLy8gYW55IE9DTSBlcnJvcnM/CisgICAgICAgICAgaWYoIGZjQ2hpcC0+SU1RLT5RRW50cnlbQ0ldLndvcmRbMl0gJiAweDdhMDAwMDAwTCApCisgICAgICAgICAgICByZXR1cm4gMTsgICAJICAgIC8vIGZvdW5kIE9DTSBlcnJvcgorCX0KKyAgICAgIGJyZWFrOworCisKKyAgICAgIAorICAgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gMDsgLy8gZmFpbGVkIHRvIGZpbmQgInR5cGUiCit9CisKKwkJCQorc3RhdGljIHZvaWQgU2V0VGFjaFRPViggQ1BRRkNIQkEqIGNwcWZjSEJBZGF0YSkKK3sKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOyAKKyAgCisgIC8vIFRML1RTIFVHLCBwZy4gMTg0CisgIC8vIDB4MDA2NSA9IDEwMG1zIGZvciBSVF9UT1YKKyAgLy8gMHgwMWY1ID0gNTAwbXMgZm9yIEVEX1RPVgorICAvLyAweDA3ZDEgPSAyMDAwbXMgZm9yIEVEX1RPVgorCisgIC8vIFNBTk1hcmsgTGV2ZWwgMSByZXF1aXJlcyBhbiAiaW5pdGlhbGl6YXRpb24gYmFja29mZiIKKyAgLy8gKFNlZSAiU0FOTWFyayBUZXN0IFN1aXRlIExldmVsIDEiOgorICAvLyBpbml0aWFsaXphdGlvbl90aW1lb3V0LmZjYWwuU0FOTWFyay0xLmZjKQorICAvLyBXZSBoYXZlIHRvIHVzZSAyc2VjLCAyNHNlYywgdGhlbiAxMjhzZWMgd2hlbiBsb2dpbi8KKyAgLy8gcG9ydCBkaXNjb3ZlcnkgcHJvY2Vzc2VzIGZhaWwgdG8gY29tcGxldGUuCisgIAorICAvLyB3aGVuIHBvcnQgZGlzY292ZXJ5IGNvbXBsZXRlcyAobG9naW5zIGRvbmUpLCB3ZSBzZXQKKyAgLy8gRURfVE9WIHRvIDUwMG1zIC0tIHRoaXMgaXMgdGhlIG5vcm1hbCBvcGVyYXRpb25hbCBjYXNlCisgIC8vIE9uIHRoZSBmaXJzdCBMaW5rIERvd24sIHdlJ2xsIG1vdmUgdG8gMiBzZWNzICg3RDEgbXMpCisgIGlmKCAoZmNDaGlwLT5SZWdpc3RlcnMuZWRfdG92LnZhbHVlICYweEZGRkYpIDw9IDB4MWY1KQorICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLmVkX3Rvdi52YWx1ZSA9IDB4MDA2NTA3RDE7IAorICAKKyAgLy8gSWYgd2UgZ2V0IGFub3RoZXIgTFNUIGFmdGVyIHdlIG1vdmVkIFRPViB0byAyIHNlYywKKyAgLy8gaW5jcmVhc2UgdG8gMjQgc2Vjb25kcyAoNURDMSBtcykgcGVyIFNBTk1hcmshCisgIGVsc2UgaWYoIChmY0NoaXAtPlJlZ2lzdGVycy5lZF90b3YudmFsdWUgJjB4RkZGRikgPD0gMHg3RDEpCisgICAgZmNDaGlwLT5SZWdpc3RlcnMuZWRfdG92LnZhbHVlID0gMHgwMDY1NURDMTsgCisKKyAgLy8gSWYgd2UgZ2V0IHN0aWxsIGFub3RoZXIgTFNULCBzZXQgdGhlIG1heCBUT1YgKFRhY2h5b24KKyAgLy8gaGFzIG9ubHkgMTYgYml0cyBmb3IgbXMgdGltZXIsIHNvIHRoZSBtYXggaXMgNjUuNSBzZWMpCisgIGVsc2UgaWYoIChmY0NoaXAtPlJlZ2lzdGVycy5lZF90b3YudmFsdWUgJjB4RkZGRikgPD0gMHg1REMxKQorICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLmVkX3Rvdi52YWx1ZSA9IDB4MDA2NUZGRkY7IAorCisgIHdyaXRlbCggZmNDaGlwLT5SZWdpc3RlcnMuZWRfdG92LnZhbHVlLAorICAgIChmY0NoaXAtPlJlZ2lzdGVycy5lZF90b3YuYWRkcmVzcykpOworICAvLyBrZWVwIHRoZSBzYW1lIDJzZWMgTFBfVE9WIAorICB3cml0ZWwoIDB4MDdEMDAwMTAsIGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArVExfTUVNX0ZNX1RJTUVPVVQyKTsKK30JCisKKworLy8gVGhlIElNUSBpcyBhbiBhcnJheSB3aXRoIElNUV9MRU4gbGVuZ3RoLCBlYWNoIGVsZW1lbnQgKFFFbnRyeSkKKy8vIHdpdGggZWlnaHQgMzItYml0IHdvcmRzLiAgVGFjaHlvbiBQUk9EVUNFUyBhIFFFbnRyeSB3aXRoIGVhY2gKKy8vIG1lc3NhZ2UgaXQgd2FudHMgdG8gc2VuZCB0byB0aGUgaG9zdC4gIFRoZSBob3N0IENPTlNVTUVTIElNUSBlbnRyaWVzCisKKy8vIFRoaXMgZnVuY3Rpb24gY29waWVzIHRoZSBjdXJyZW50CisvLyAob3Igb2xkZXN0IG5vdC15ZXQtcHJvY2Vzc2VkKSBRRW50cnkgdG8KKy8vIHRoZSBjYWxsZXIsIGNsZWFycy8gcmUtZW5hYmxlcyB0aGUgaW50ZXJydXB0LCBhbmQgdXBkYXRlcyB0aGUKKy8vIChIb3N0KSBDb25zdW1lciBJbmRleC4KKy8vIFJldHVybiB2YWx1ZToKKy8vICAwICAgbWVzc2FnZSBwcm9jZXNzZWQsIG5vbmUgcmVtYWluIChwcm9kdWNlciBhbmQgY29uc3VtZXIKKy8vICAgICAgICBpbmRleGVzIG1hdGNoKQorLy8gIDEgICBtZXNzYWdlIHByb2Nlc3NlZCwgbW9yZSBtZXNzYWdlcyByZW1haW4KKy8vIC0xICAgbm8gbWVzc2FnZSBwcm9jZXNzZWQgLSBub25lIHdlcmUgYXZhaWxhYmxlIHRvIHByb2Nlc3MKKy8vIFJlbWFya3M6CisvLyAgIFRML1RTIFVHIHNwZWNpZmljZXMgdGhhdCB0aGUgZm9sbG93aW5nIGFjdGlvbnMgZm9yCisvLyAgIElOVEFfTCBoYW5kbGluZzoKKy8vICAgMS4gcmVhZCBQQ0kgSW50ZXJydXB0IFN0YXR1cyByZWdpc3RlciAoMHhmZikKKy8vICAgMi4gYWxsIElNUSBtZXNzYWdlcyBzaG91bGQgYmUgcHJvY2Vzc2VkIGJlZm9yZSB3cml0aW5nIHRoZQorLy8gICAgICBJTVEgY29uc3VtZXIgaW5kZXguCisKKworaW50IENwcVRzUHJvY2Vzc0lNUUVudHJ5KHZvaWQgKmhvc3QpCit7CisgIHN0cnVjdCBTY3NpX0hvc3QgKkhvc3RBZGFwdGVyID0gKHN0cnVjdCBTY3NpX0hvc3QgKilob3N0OworICBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhID0gKENQUUZDSEJBICopSG9zdEFkYXB0ZXItPmhvc3RkYXRhOworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7IAorICBGQ19FWENIQU5HRVMgKkV4Y2hhbmdlcyA9IGZjQ2hpcC0+RXhjaGFuZ2VzOworICBpbnQgaVN0YXR1czsKKyAgVVNIT1JUIGksIFJQQ3NldCwgRFBDc2V0OworICBVTE9ORyB4X0lEOworICBVTE9ORyB1bEJ1ZmYsIGR3U3RhdHVzOworICBUYWNoRkNIRFJfR0NNTkQqIGZjaHM7CisjZXJyb3IgVGhpcyBpcyB0b28gbXVjaCBzdGFjaworICBVTE9ORyB1bEZpYnJlRnJhbWVbMjA0OC80XTsgIC8vIG1heCBudW1iZXIgb2YgRFdPUkRTIGluIGluY29taW5nIEZpYnJlIEZyYW1lCisgIFVDSEFSIHVjSW5ib3VuZE1lc3NhZ2VUeXBlOyAgLy8gSW5ib3VuZCBDTSwgZHdvcmQgMyAidHlwZSIgZmllbGQKKworICBFTlRFUigiUHJvY2Vzc0lNUUVudHJ5Iik7CisgICAKKworCQkJCS8vIGNoZWNrIFRhY2hMaXRlJ3MgSU1RIHByb2R1Y2VyIGluZGV4IC0KKwkJCQkvLyBpcyBhIG5ldyBtZXNzYWdlIHdhaXRpbmcgZm9yIHVzPworCQkJCS8vIGVxdWFsIGluZGV4ZXMgbWVhbnMgZW1wdHkgcXVlCisKKyAgaWYoIGZjQ2hpcC0+SU1RLT5wcm9kdWNlckluZGV4ICE9IGZjQ2hpcC0+SU1RLT5jb25zdW1lckluZGV4ICkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBwcm9jZXNzIG1lc3NhZ2UKKworCisjaWZkZWYgSU1RX0RFQlVHCisgICAgcHJpbnRrKCJQSSAlWCwgQ0kgJVggIHR5cGU6ICVYXG4iLCAKKyAgICAgIGZjQ2hpcC0+SU1RLT5wcm9kdWNlckluZGV4LGZjQ2hpcC0+SU1RLT5jb25zdW1lckluZGV4LAorICAgICAgZmNDaGlwLT5JTVEtPlFFbnRyeVtmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleF0udHlwZSk7CisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIC8vIEV4YW1pbmUgQ29tcGxldGlvbiBNZXNzYWdlcyBpbiBJTVEKKyAgICAvLyB3aGF0IENNX1R5cGU/CisgICAgc3dpdGNoKCAoVUNIQVIpKGZjQ2hpcC0+SU1RLT5RRW50cnlbZmNDaGlwLT5JTVEtPmNvbnN1bWVySW5kZXhdLnR5cGUKKyAgICAgICAgICAgICAgICAgICAgJiAweGZmTCkgKQorICAgIHsKKyAgICBjYXNlIE9VVEJPVU5EX0NPTVBMRVRJT046CisKKyAgICAgIC8vIFJlbWFya3M6CisgICAgICAvLyB4X0lEcyAoT1hfSUQsIFJYX0lEKSBhcmUgcGFydGl0aW9uZWQgYnkgU0VTVCBlbnRyaWVzCisgICAgICAvLyAoc3RhcnRpbmcgYXQgMCksIGFuZCBTRlMgZW50cmllcyAoc3RhcnRpbmcgYXQKKyAgICAgIC8vIFNFU1RfTEVOIC0tIG91dHNpZGUgdGhlIFNFU1Qgc3BhY2UpLgorICAgICAgLy8gUHN1ZWRvIGNvZGU6CisgICAgICAvLyB4X0lEIChPWF9JRCBvciBSWF9JRCkgZnJvbSBtZXNzYWdlIGlzIFRyYW5zX0lEIG9yIFNFU1QgaW5kZXgKKyAgICAgIC8vIHJhbmdlIGNoZWNrIC0geF9JRAorICAgICAgLy8gICBpZiB4X0lEIG91dHNpZGUgJ1RyYW5zYWN0aW9ucycgbGVuZ3RoLCBlcnJvciAtIGV4aXQKKyAgICAgIC8vIGlmIGFueSBPQ00gZXJyb3IsIGNvcHkgZXJyb3Igc3RhdHVzIHRvIEV4Y2hhbmdlIHNsb3QKKyAgICAgIC8vIGlmIEZDUCBBU1NJU1QgdHJhbnNhY3Rpb24gKHhfSUQgd2l0aGluIFNFU1QpLAorICAgICAgLy8gICBjYWxsIGZjQ29tcGxldGUgKHRvIEFwcCkKKyAgICAgIC8vIC4uLgorCisKKyAgICAgIHVsQnVmZiA9IGZjQ2hpcC0+SU1RLT5RRW50cnlbZmNDaGlwLT5JTVEtPmNvbnN1bWVySW5kZXhdLndvcmRbMV07CisgICAgICB4X0lEID0gdWxCdWZmICYgMHg3ZmZmTDsgICAgIC8vIGxvd2VyIDE0IGJpdHMgU0VTVF9JbmRleC9UcmFuc19JRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJhbmdlIGNoZWNrIENNIE9YL1JYX0lEIHZhbHVlLi4uCisgICAgICBpZiggeF9JRCA8IFRBQ0hfTUFYX1hJRCApICAgLy8gZG9uJ3QgZ28gYmV5b25kIGFycmF5IHNwYWNlCisgICAgICB7CisKKworCWlmKCB1bEJ1ZmYgJiAweDIwMDAwMDAwTCApIC8vIFJQQyAtUmVzcG9uc2UgUGhhc2UgQ29tcGxldGU/CisgICAgICAgICAgUlBDc2V0ID0gMTsgICAgICAgICAgICAgIC8vIChTRVNUIHRyYW5zYWN0aW9ucyBvbmx5KQorICAgICAgICBlbHNlCisgICAgICAgICAgUlBDc2V0ID0gMDsKKworICAgICAgICBpZiggdWxCdWZmICYgMHg0MDAwMDAwMEwgKSAvLyBEUEMgLURhdGEgUGhhc2UgQ29tcGxldGU/CisgICAgICAgICAgRFBDc2V0ID0gMTsgICAgICAgICAgICAgIC8vIChTRVNUIHRyYW5zYWN0aW9ucyBvbmx5KQorICAgICAgICBlbHNlCisgICAgICAgICAgRFBDc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHN0YXR1cyBmb3IgdGhpcyBPdXRib3VuZCB0cmFuc2FjdGlvbidzIElECisgICAgICAgIGR3U3RhdHVzID0gMEw7CisgICAgICAgIGlmKCB1bEJ1ZmYgJiAweDEwMDAwMDAwTCApIC8vIFNQRT8gKFNFU1QgUHJvZ3JhbW1pbmcgRXJyb3IpCisgICAgICAgICAgICBkd1N0YXR1cyB8PSBTRVNUUFJPR19FUlI7CisKKyAgICAgICAgdWxCdWZmID0gZmNDaGlwLT5JTVEtPlFFbnRyeVtmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleF0ud29yZFsyXTsKKyAgICAgICAgaWYoIHVsQnVmZiAmIDB4N2EwMDAwMDBMICkgLy8gYW55IG90aGVyIGVycnM/CisgICAgICAgIHsKKyAgICAgICAgICBpZiggdWxCdWZmICYgMHg0MDAwMDAwMEwgKQorICAgICAgICAgICAgZHdTdGF0dXMgfD0gSU5WX0VOVFJZOworICAgICAgICAgIGlmKCB1bEJ1ZmYgJiAweDIwMDAwMDAwTCApCisgICAgICAgICAgICBkd1N0YXR1cyB8PSBGUkFNRV9UTzsgICAgICAgIC8vIEZUTworICAgICAgICAgIGlmKCB1bEJ1ZmYgJiAweDEwMDAwMDAwTCApCisgICAgICAgICAgICBkd1N0YXR1cyB8PSBIT1NUUFJPR19FUlI7CisgICAgICAgICAgaWYoIHVsQnVmZiAmIDB4MDgwMDAwMDBMICkKKyAgICAgICAgICAgIGR3U3RhdHVzIHw9IExJTktGQUlMX1RYOworICAgICAgICAgIGlmKCB1bEJ1ZmYgJiAweDAyMDAwMDAwTCApCisgICAgICAgICAgICBkd1N0YXR1cyB8PSBBQk9SVFNFUV9OT1RJRlk7ICAvLyBBU04KKyAgICAgICAgfQorCisJICAKKwlpZiggZHdTdGF0dXMgKSAgICAgICAgICAvLyBhbnkgZXJyb3JzPworICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIE91dGJvdW5kIENvbXBsZXRpb24gc3RhdHVzCisgICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzIHw9IGR3U3RhdHVzOworCisgICAgICAgICAgLy8gaWYgdGhpcyBPdXRib3VuZCBmcmFtZSB3YXMgZm9yIGEgU0VTVCBlbnRyeSwgYXV0b21hdGljYWxseQorICAgICAgICAgIC8vIHJlcXVlIGl0IGluIHRoZSBjYXNlIG9mIExJTktGQUlMIChpdCB3aWxsIHJlc3RhcnQgb24gUERJU0MpCisgICAgICAgICAgaWYoIHhfSUQgPCBUQUNIX1NFU1RfTEVOICkKKyAgICAgICAgICB7CisKKyAgICAgICAgICAgIHByaW50aygiICNPQ00gZXJyb3IgJVhoIHhfSUQgJVgjICIsIAorCQkgICAgZHdTdGF0dXMsIHhfSUQpOworCisJICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVt4X0lEXS50aW1lT3V0ID0gMzAwMDA7IC8vIHNlY29uZHMgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisJICAgIC8vIFdlIFEgQUJUUyBmb3IgZWFjaCBleGNoYW5nZS4KKwkgICAgLy8gTk9URTogV2UgY2FuIGdldCBGUkFNRV9UTyBvbiBiYWQgYWxwYSAoZGV2aWNlIGdvbmUpLiAgU2luY2UKKwkgICAgLy8gYmFkIGFscGEgaXMgcmVwb3J0ZWQgYmVmb3JlIEZSQU1FX1RPLCBleGFtaW5lIHRoZSBzdGF0dXMKKwkgICAgLy8gZmxhZ3MgdG8gc2VlIGlmIHRoZSBkZXZpY2UgaXMgcmVtb3ZlZC4gIElmIHNvLCBET04nVAorCSAgICAvLyBwb3N0IGFuIEFCVFMsIHNpbmNlIGl0IHdpbGwgYmUgdGVybWluYXRlZCBieSB0aGUgYmFkIGFscGEKKwkgICAgLy8gbWVzc2FnZS4KKwkgICAgaWYoIGR3U3RhdHVzICYgRlJBTUVfVE8gKSAvLyBjaGVjayBmb3IgZGV2aWNlIHJlbW92ZWQuLi4KKwkgICAgeworCSAgICAgIGlmKCAhKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVt4X0lEXS5zdGF0dXMgJiBERVZJQ0VfUkVNT1ZFRCkgKQorCSAgICAgIHsgCisJCS8vIHByZXN1bWVzIGRldmljZSBpcyBzdGlsbCB0aGVyZTogc2VuZCBBQlRTLgorICAKKyAgICAgICAgICAgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLCBCTFNfQUJUUywgJnhfSUQpOworCSAgICAgIH0KKwkgICAgfQorCSAgICBlbHNlICAvLyBBYm9ydCBhbGwgb3RoZXIgZXJyb3JzCisJICAgIHsKKyAgICAgICAgICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwgQkxTX0FCVFMsICZ4X0lEKTsKKwkgICAgfQorCisgICAgICAgICAgICAvLyBpZiB0aGUgSFBFIGJpdCBpcyBzZXQsIHdlIGhhdmUgdG8gQ0xvc2UgdGhlIExPT1AKKyAgICAgICAgICAgIC8vIChzZWUgVEwvVFMgVUcsIHBnLiAyMzkpCisKKyAgICAgICAgICAgIGlmKCBkd1N0YXR1cyAmPSBIT1NUUFJPR19FUlIgKQorICAgICAgICAgICAgLy8gc2V0IENMIGJpdCAoc2VlIFRML1RTIFVHLCBwZy4gMTcyKQorICAgICAgICAgICAgICB3cml0ZWwoIDQsIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNY29udHJvbC5hZGRyZXNzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgICAvLyBOT1RFOiB3ZSBkb24ndCBuZWNlc3NhcmlseSBjYXJlIGFib3V0IEFMTCBjb21wbGV0aW9uIG1lc3NhZ2VzLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDU0kgcmVzcC4gY29tcGxldGUgT1IKKyAgICAgICAgaWYoICgoeF9JRCA8IFRBQ0hfU0VTVF9MRU4pICYmIFJQQ3NldCl8fCAKKyAgICAgICAgICAgICAoeF9JRCA+PSBUQUNIX1NFU1RfTEVOKSApICAvLyBub24tU0NTSSBjb21tYW5kCisgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gZXhjaGFuZ2UgZG9uZTsgY29tcGxldGUgdG8gdXBwZXIgbGV2ZWxzIHdpdGggc3RhdHVzCisgICAgICAgICAgICAgIC8vIChpZiBuZWNlc3NhcnkpIGFuZCBmcmVlIHRoZSBleGNoYW5nZSBzbG90CisgICAgICAgICAgICAKKworICAgICAgICAgIGlmKCB4X0lEID49IFRBQ0hfU0VTVF9MRU4gKSAvLyBMaW5rIFNlcnZpY2UgT3V0Ym91bmQgZnJhbWU/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIFJlcXVlc3Qgb3IgUmVwbHkgaGFzIGJlZW4gc2VudAorICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmFsIHdhaXRpbmcgV29ya2VyVGhyZWFkCisKKyAgICAgICAgICAgIHVwKCBjcHFmY0hCQWRhdGEtPlRZT0Jjb21wbGV0ZSk7ICAgLy8gZnJhbWUgaXMgT1VUIG9mIFRhY2gKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV29ya2VyVGhyZWFkIHdpbGwgY29tcGxldGUgWGNobmcKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSAgLy8gWF9JRCBpcyBmb3IgRkNQIGFzc2lzdCAoU0VTVCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIFRCRCAodGFyZ2V0IG1vZGUpCisvLyAgICAgICAgICAgIGZjQ29tcGxldGVFeGNoYW5nZSggZmNDaGlwLCB4X0lEKTsgLy8gVFJFIGNvbXBsZXRlZAorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSAgLy8gRVJST1IgQ09ORElUSU9OISAgYm9ndXMgeF9JRCBpbiBjb21wbGV0aW9uIG1lc3NhZ2UKKyAgICAgIHsKKworICAgICAgICBwcmludGsoIiBQcm9jZXNzSU1RIChPQkNNKSB4X2lkIG91dCBvZiByYW5nZSAlWGhcbiIsIHhfSUQpOworCisgICAgICB9CisKKworCisgICAgICAgICAgLy8gTG9hZCB0aGUgRnJhbWUgTWFuYWdlcidzIGVycm9yIGNvdW50ZXJzLiAgV2UgY2hlY2sgdGhlbSBoZXJlCisgICAgICAgICAgLy8gYmVjYXVzZSBwcmVzdW1hYmx5IHRoZSBsaW5rIGlzIHVwIGFuZCBoZWFsdGh5IGVub3VnaCBmb3IgdGhlCisgICAgICAgICAgLy8gY291bnRlcnMgdG8gYmUgbWVhbmluZ2Z1bCAoaS5lLiwgZG9uJ3QgY2hlY2sgdGhlbSB3aGlsZSBsb29wCisgICAgICAgICAgLy8gaXMgaW5pdGlhbGl6aW5nKS4KKyAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNTGlua1N0YXR1czEudmFsdWUgPSAgICAvLyBnZXQgVEwncyBjb3VudGVyCisgICAgICAgIHJlYWRsKGZjQ2hpcC0+UmVnaXN0ZXJzLkZNTGlua1N0YXR1czEuYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNTGlua1N0YXR1czIudmFsdWUgPSAgICAvLyBnZXQgVEwncyBjb3VudGVyCisgICAgICAgIHJlYWRsKGZjQ2hpcC0+UmVnaXN0ZXJzLkZNTGlua1N0YXR1czIuYWRkcmVzcyk7CisgICAgICAgICAgICAKKworICAgICAgZmNQYXJzZUxpbmtTdGF0dXNDb3VudGVycyggZmNDaGlwKTsgLy8gbG9hZCBpbnRvIDYgcy93IGFjY3VtdWxhdG9ycworICAgIGJyZWFrOworCisKKworICAgIGNhc2UgRVJST1JfSURMRV9DT01QTEVUSU9OOiAgLy8gVGFjaExpdGUgRXJyb3IgSWRsZS4uLgorICAgIAorICAgIC8vIFdlIHVzdWFsbHkgZ2V0IHRoaXMgd2hlbiB0aGUgbGluayBnb2VzIGRvd24gZHVyaW5nIGhlYXZ5IHRyYWZmaWMuCisgICAgLy8gRm9yIG5vdywgcHJlc3VtZSB0aGF0IGlmIFNFU1QgRXhjaGFuZ2VzIGFyZSBvcGVuLCB3ZSB3aWxsCisgICAgLy8gZ2V0IHRoaXMgYXMgb3VyIGN1ZSB0byBJTlZBTElEQVRFIGFsbCBTRVNUIGVudHJpZXMKKyAgICAvLyAoYW5kIHdlIE9XTiBhbGwgdGhlIFNFU1QgZW50cmllcykuCisgICAgLy8gU2VlIFRML1RTIFVHLCBwZy4gNTMKKyAgICAKKyAgICAgIGZvciggeF9JRCA9IDA7IHhfSUQgPCBUQUNIX1NFU1RfTEVOOyB4X0lEKyspCisgICAgICB7CisKKyAgICAgICAgLy8gRG9lcyB0aGlzIFZBTGlkIFNFU1QgZW50cnkgbmVlZCB0byBiZSBpbnZhbGlkYXRlZCBmb3IgQWJvcnQ/CisgICAgICAgIGZjQ2hpcC0+U0VTVC0+dVsgeF9JRF0uSVdFLkhkcl9MZW4gJj0gMHg3RkZGRkZGRjsgCisgICAgICB9CisgICAgICAKKyAgICAgIENwcVRzVW5GcmVlemVUYWNobGl0ZSggZmNDaGlwLCAyKTsgLy8gdW5mcmVlemUgVGFjaHlvbiwgaWYgTGluayBPSworCisgICAgYnJlYWs7CisKKworICAgIGNhc2UgSU5CT1VORF9TRlNfQ09NUExFVElPTjogIC8vMHgwNAorICAgICAgICAgIC8vIE5PVEUhIHdlIG11c3QgcHJvY2VzcyB0aGlzIFNGUSBtZXNzYWdlIHRvIGF2b2lkIFNGUSBmaWxsaW5nCisgICAgICAgICAgLy8gdXAgYW5kIHN0b3BwaW5nIFRhY2hMaXRlLiAgSW5jb21pbmcgY29tbWFuZHMgYXJlIHBsYWNlZCBoZXJlLAorICAgICAgICAgIC8vIGFzIHdlbGwgYXMgJ3Vua25vd24nIGZyYW1lcyAoZS5nLiBMSVAgbG9vcCBwb3NpdGlvbiBkYXRhKQorICAgICAgICAgIC8vIHdyaXRlIHRoaXMgQ00ncyBwcm9kdWNlciBpbmRleCB0byBnbG9iYWwuLi4KKyAgICAgICAgICAvLyBUTC9UUyBVRywgcGcgMjM0OgorICAgICAgICAgIC8vIFR5cGU6IDAgLSByZXNlcnZlZAorICAgICAgICAgIC8vICAgICAgIDEgLSBVbmFzc2lzdGVkIEZDUAorICAgICAgICAgIC8vICAgICAgIDIgLSBCQUQgRkNQCisgICAgICAgICAgLy8gICAgICAgMyAtIFVua293biBGcmFtZQorICAgICAgICAgIC8vICAgICAgIDQtRiByZXNlcnZlZAorCisKKyAgICAgIGZjQ2hpcC0+U0ZRLT5wcm9kdWNlckluZGV4ID0gKFVTSE9SVCkKKyAgICAgICAgKGZjQ2hpcC0+SU1RLT5RRW50cnlbZmNDaGlwLT5JTVEtPmNvbnN1bWVySW5kZXhdLndvcmRbMF0gJiAweDBmZmZMKTsKKworCisgICAgICB1Y0luYm91bmRNZXNzYWdlVHlwZSA9IDA7ICAvLyBkZWZhdWx0IHRvIHVzZWxlc3MgZnJhbWUKKworICAgICAgICAvLyB3ZSBjYW4gb25seSBwcm9jZXNzIHR3byBUeXBlczogMSwgVW5hc3Npc3RlZCBGQ1AsIGFuZCAzLCBVbmtub3duCisgICAgICAgIC8vIEFsc28sIHdlIGFyZW4ndCBpbnRlcmVzdGVkIGluIHByb2Nlc3NpbmcgZnJhbWUgZnJhZ21lbnRzCisgICAgICAgIC8vIHNvIGRvbid0IFF1ZSBhbnl0aGluZyB3aXRoICdMS0YnIGJpdCBzZXQKKyAgICAgIGlmKCAhKGZjQ2hpcC0+SU1RLT5RRW50cnlbZmNDaGlwLT5JTVEtPmNvbnN1bWVySW5kZXhdLndvcmRbMl0gCisgICAgICAgICYgMHg0MDAwMDAwMCkgKSAgLy8gJ0xLRicgbGluayBmYWlsdXJlIGJpdCBjbGVhcj8KKyAgICAgIHsKKyAgICAgICAgdWNJbmJvdW5kTWVzc2FnZVR5cGUgPSAoVUNIQVIpICAvLyBJQ00gRFdvcmQzLCAiVHlwZSIKKyAgICAgICAgKGZjQ2hpcC0+SU1RLT5RRW50cnlbZmNDaGlwLT5JTVEtPmNvbnN1bWVySW5kZXhdLndvcmRbMl0gJiAweDBmTCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisJZmNDaGlwLT5mY1N0YXRzLmxpbmtGYWlsUlgrKzsKKy8vICAgICAgICBwcmludGsoIkxLRiAobGluayBmYWlsdXJlKSBiaXQgc2V0IG9uIGluYm91bmQgbWVzc2FnZVxuIik7CisgICAgICB9CisKKyAgICAgICAgICAvLyBjbGVhcnMgU0ZRIGVudHJ5IGZyb20gVGFjaHlvbiBidWZmZXI7IGNvcGllcyB0byBjb250aWd1b3VzIHVsQnVmZgorICAgICAgQ3BxVHNHZXRTRlFFbnRyeSgKKyAgICAgICAgZmNDaGlwLCAgICAgICAgICAgICAgICAgIC8vIGkuZS4gdGhpcyBEZXZpY2UgT2JqZWN0CisgICAgICAgIChVU0hPUlQpZmNDaGlwLT5TRlEtPnByb2R1Y2VySW5kZXgsICAvLyBTRlEgcHJvZHVjZXIgbmR4ICAgICAgICAgCisgICAgICAgIHVsRmlicmVGcmFtZSwgVFJVRSk7ICAgIC8vIGNvbnRpZ3VvdXMgZGVzdGluYXRpb24gYnVmZmVyLCB1cGRhdGUgY2hpcAorICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIC8vIGFuYWx5emUgdGhlIGluY29taW5nIGZyYW1lIG91dHNpZGUgdGhlIElOVCBoYW5kbGVyLi4uCisgICAgICAgIC8vIChpLmUuLCBXb3JrZXIpCisKKyAgICAgIGlmKCB1Y0luYm91bmRNZXNzYWdlVHlwZSA9PSAxICkKKyAgICAgIHsKKyAgICAgICAgZmNocyA9IChUYWNoRkNIRFJfR0NNTkQqKXVsRmlicmVGcmFtZTsgLy8gY2FzdCB0byBleGFtaW5lIElCIGZyYW1lCisgICAgICAgIC8vIGRvbid0IGZpbGwgdXAgb3VyIFEgd2l0aCBnYXJiYWdlIC0gb25seSBhY2NlcHQgRkNQLUNNTkQgIAorICAgICAgICAvLyBvciBYUkRZIGZyYW1lcworICAgICAgICBpZiggKGZjaHMtPmRfaWQgJiAweEZGMDAwMDAwKSA9PSAweDA2MDAwMDAwICkgLy8gQ01ORAorICAgICAgICB7CisJICAvLyBzb21lb25lIHNlbnQgdXMgYSBTQ1NJIGNvbW1hbmQKKwkgIAorLy8gICAgICAgICAgZmNQdXRTY3NpUXVlKCBjcHFmY0hCQWRhdGEsIAorLy8gICAgICAgICAgICAgICAgICAgICAgICBTRlFfVU5BU1NJU1RFRF9GQ1AsIHVsRmlicmVGcmFtZSk7IAorCX0KKwllbHNlIGlmKCAoKGZjaHMtPmRfaWQgJiAweEZGMDAwMDAwKSA9PSAweDA3MDAwMDAwKSB8fCAvLyBSU1AgKHN0YXR1cykKKyAgICAgICAgICAgIChmY2hzLT5kX2lkICYgMHhGRjAwMDAwMCkgPT0gMHgwNTAwMDAwMCApICAvLyBYUkRZICAKKwl7CisJICBVTE9ORyB4X0lEOworCSAgLy8gVW5mb3J0dW5hdGVseSwgQUJUUyByZXF1aXJlcyBhIEZyZWV6ZSBvbiB0aGUgY2hpcCBzbworCSAgLy8gd2UgY2FuIG1vZGlmeSB0aGUgc2hhcmVkIG1lbW9yeSBTRVNULiAgV2hlbiBmcm96ZW4sCisJICAvLyBhbnkgcmVjZWl2ZWQgRXhjaGFuZ2UgZnJhbWVzIGNhbm5vdCBiZSBwcm9jZXNzZWQgYnkKKwkgIC8vIFRhY2h5b24sIHNvIHRoZXkgd2lsbCBiZSBkdW1wZWQgaW4gaGVyZS4gIEl0IGlzIHRvbworCSAgLy8gY29tcGxleCB0byBhdHRlbXB0IHRoZSByZWNvbnN0cnVjdCB0aGVzZSBmcmFtZXMgaW4KKwkgIC8vIHRoZSBjb3JyZWN0IEV4Y2hhbmdlIGNvbnRleHQsIHNvIHdlIHNpbXBseSBzZWVrIHRvCisJICAvLyBmaW5kIHN0YXR1cyBvciB0cmFuc2ZlciByZWFkeSBmcmFtZXMsIGFuZCBjYXVzZSB0aGUKKwkgIC8vIGV4Y2hhbmdlIHRvIGNvbXBsZXRlIHdpdGggZXJyb3JzIGJlZm9yZSB0aGUgdGltZW91dAorCSAgLy8gZXhwaXJlcy4gIFdlIHVzZSBhIExpbnV4IFNjc2kgQ21uZCByZXN1bHQgY29kZSB0aGF0CisJICAvLyBjYXVzZXMgaW1tZWRpYXRlIHJldHJ5LgorCSAgCisKKwkgIC8vIERvIHdlIGhhdmUgYW4gb3BlbiBleGNoYW5nZSB0aGF0IG1hdGNoZXMgdGhpcyBzX2lkCisJICAvLyBhbmQgb3hfaWQ/CisJICBmb3IoIHhfSUQgPSAwOyB4X0lEIDwgVEFDSF9TRVNUX0xFTjsgeF9JRCsrKQorCSAgeworICAgICAgICAgICAgaWYoIChmY2hzLT5zX2lkICYgMHhGRkZGRkYpID09IAorICAgICAgICAgICAgICAgICAoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW3hfSURdLmZjaHMuZF9pZCAmIDB4RkZGRkZGKSAKKwkJICAgICAgICYmCisgICAgICAgICAgICAgICAgKGZjaHMtPm94X3J4X2lkICYgMHhGRkZGMDAwMCkgPT0gCisgICAgICAgICAgICAgICAgIChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0uZmNocy5veF9yeF9pZCAmIDB4RkZGRjAwMDApICkKKwkgICAgeworICAgIC8vICAgICAgICAgIHByaW50aygiICNSL1ggZnJhbWUgeF9JRCAlMDhYIyAiLCBmY2hzLT5veF9yeF9pZCApOworICAgICAgICAgICAgICAvLyBzaW11bGF0ZSB0aGUgYW50aWNpcGF0ZWQgZXJyb3IgLSBzaW5jZSB0aGUKKwkgICAgICAvLyBTRVNUIHdhcyBmcm96ZW4sIGZyYW1lcyB3ZXJlIGxvc3QuLi4KKyAgICAgICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzIHw9IFNGUV9GUkFNRTsKKyAgICAgICAgICAgICAgCisJICAgICAgLy8gcHJlc3VtZXMgZGV2aWNlIGlzIHN0aWxsIHRoZXJlOiBzZW5kIEFCVFMuCisgICAgICAgICAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsIEJMU19BQlRTLCAmeF9JRCk7CisJICAgICAgYnJlYWs7ICAvLyBkb25lCisJICAgIH0KKwkgIH0KKwl9CisJICAKKyAgICAgIH0KKyAgICAgICAgICAKKyAgICAgIGVsc2UgaWYoIHVjSW5ib3VuZE1lc3NhZ2VUeXBlID09IDMpCisgICAgICB7CisgICAgICAgIC8vIEZDIExpbmsgU2VydmljZSBmcmFtZXMgKGUuZy4gUExPR0ksIEFDQykgY29tZSBpbiBoZXJlLiAgCisgICAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsIFNGUV9VTktOT1dOLCB1bEZpYnJlRnJhbWUpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICB9CisKKyAgICAgIGVsc2UgaWYoIHVjSW5ib3VuZE1lc3NhZ2VUeXBlID09IDIgKSAvLyAiYmFkIEZDUCI/CisgICAgICB7CisjaWZkZWYgSU1RX0RFQlVHCisgICAgICAgIHByaW50aygiQmFkIEZDUCBpbmNvbWluZyBmcmFtZSBkaXNjYXJkZWRcbiIpOworI2VuZGlmCisgICAgICB9CisKKyAgICAgIGVsc2UgLy8gZG9uJ3Qga25vdyB0aGlzIHR5cGUKKyAgICAgIHsKKyNpZmRlZiBJTVFfREVCVUcgCisgICAgICAgIHByaW50aygiSW5jb21pbmcgZnJhbWUgZGlzY2FyZGVkLCB0eXBlOiAlWGhcbiIsIHVjSW5ib3VuZE1lc3NhZ2VUeXBlKTsKKyNlbmRpZgorICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQ2hlY2sgdGhlIEZyYW1lIE1hbmFnZXIncyBlcnJvciBjb3VudGVycy4gIFdlIGNoZWNrIHRoZW0gaGVyZQorICAgICAgICAvLyBiZWNhdXNlIHByZXN1bWFibHkgdGhlIGxpbmsgaXMgdXAgYW5kIGhlYWx0aHkgZW5vdWdoIGZvciB0aGUKKyAgICAgICAgLy8gY291bnRlcnMgdG8gYmUgbWVhbmluZ2Z1bCAoaS5lLiwgZG9uJ3QgY2hlY2sgdGhlbSB3aGlsZSBsb29wCisgICAgICAgIC8vIGlzIGluaXRpYWxpemluZykuCisgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5GTUxpbmtTdGF0dXMxLnZhbHVlID0gICAgLy8gZ2V0IFRMJ3MgY291bnRlcgorICAgICAgICByZWFkbChmY0NoaXAtPlJlZ2lzdGVycy5GTUxpbmtTdGF0dXMxLmFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgCisKKyAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNTGlua1N0YXR1czIudmFsdWUgPSAgICAvLyBnZXQgVEwncyBjb3VudGVyCisgICAgICAgIHJlYWRsKGZjQ2hpcC0+UmVnaXN0ZXJzLkZNTGlua1N0YXR1czIuYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgCisKKyAgICAgIGJyZWFrOworCisKKworCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGdldCB0aGlzIENNIGJlY2F1c2Ugd2UgaXNzdWVkIGEgZnJlZXplCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1hbmQgdG8gc3RvcCBvdXRib3VuZCBmcmFtZXMuICBXZSBpc3N1ZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gZnJlZXplIGNvbW1hbmQgYXQgTGluayBVcCB0aW1lOyB3aGVuIHRoaXMgbWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAvLyBpcyByZWNlaXZlZCwgdGhlIEVSUSBiYXNlIGNhbiBiZSBzd2l0Y2hlZCBhbmQgUERJU0MKKyAgICAgICAgICAgICAgICAgICAgLy8gZnJhbWVzIGNhbiBiZSBzZW50LgorCisgICAgICAKKyAgICBjYXNlIEVSUV9GUk9aRU5fQ09NUExFVElPTjogIC8vIG5vdGU6IGV4cGVjdCBFUlEgZm9sbG93ZWQgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IEZDUCB3aGVuIGZyZWV6aW5nIFRMCisgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5UWXN0YXR1cy52YWx1ZSA9ICAgICAgICAgLy8gcmVhZCB3aGF0J3MgZnJvemVuCisgICAgICAgIHJlYWRsKGZjQ2hpcC0+UmVnaXN0ZXJzLlRZc3RhdHVzLmFkZHJlc3MpOworICAgICAgLy8gKGRvIG5vdGhpbmc7IHdhaXQgZm9yIEZDUCBmcm96ZW4gbWVzc2FnZSkKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkNQX0ZST1pFTl9DT01QTEVUSU9OOgorICAgICAgCisgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5UWXN0YXR1cy52YWx1ZSA9ICAgICAgICAgLy8gcmVhZCB3aGF0J3MgZnJvemVuCisgICAgICAgIHJlYWRsKGZjQ2hpcC0+UmVnaXN0ZXJzLlRZc3RhdHVzLmFkZHJlc3MpOworICAgICAgCisgICAgICAvLyBTaWduYWwgdGhlIGtlcm5lbCB0aHJlYWQgdG8gcHJvY2VlZCB3aXRoIFNFU1QgbW9kaWZpY2F0aW9uCisgICAgICB1cCggY3BxZmNIQkFkYXRhLT5UYWNoRnJvemVuKTsKKworICAgICAgYnJlYWs7CisKKworCisgICAgY2FzZSBJTkJPVU5EX0MxX1RJTUVPVVQ6CisgICAgY2FzZSBNRlNfQlVGX1dBUk46CisgICAgY2FzZSBJTVFfQlVGX1dBUk46CisgICAgYnJlYWs7CisKKworCisKKworICAgICAgICAvLyBJbiBvbGRlciBUYWNoeW9ucywgd2UgJ2NsZWFyJyB0aGUgaW50ZXJuYWwgJ2NvcmUnIGludGVycnVwdCBzdGF0ZQorICAgICAgICAvLyBieSByZWFkaW5nIHRoZSBGTXN0YXR1cyByZWdpc3Rlci4gIEluIG5ld2VyIFRhY2hMaXRlIChUYWNoeW9uKSwKKyAgICAgICAgLy8gd2UgbXVzdCBXUklURSB0aGUgcmVnaXN0ZXIKKyAgICAgICAgLy8gdG8gY2xlYXIgdGhlIGNvbmRpdGlvbiAoVEwvVFMgVUcsIHBnIDE3OSkKKyAgICBjYXNlIEZSQU1FX01HUl9JTlRFUlJVUFQ6CisgICAgeworICAgICAgUEZDX0xPR0dFRElOX1BPUlQgcExvZ2dlZEluUG9ydDsgCisKKyAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLnZhbHVlID0gCisgICAgICAgIHJlYWRsKCBmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy5hZGRyZXNzICk7CisgICAgICAgICAgICAgICAgCisgICAgICAvLyBQUk9CTEVNOiBJdCBpcyBwb3NzaWJsZSwgZXNwZWNpYWxseSB3aXRoICJkdW1iIiBodWJzIHRoYXQKKyAgICAgIC8vIGRvbid0IGF1dG9tYXRpY2FsbHkgTElQIG9uIGJ5LXBhc3Mgb2YgcG9ydHMgdGhhdCBhcmUgZ29pbmcKKyAgICAgIC8vIGF3YXksIGZvciB0aGUgaHViIGJ5LXBhc3MgcHJvY2VzcyB0byBkZXN0cm95IGNyaXRpY2FsIAorICAgICAgLy8gb3JkZXJlZCBzZXRzIG9mIGEgZnJhbWUuICBUaGUgcmVzdWx0IG9mIHRoaXMgaXMgYSBodW5nIExQU00KKyAgICAgIC8vIChMb29wIFBvcnQgU3RhdGUgTWFjaGluZSksIHdoaWNoIG9uIFRhY2h5b24gcmVzdWx0cyBpbiBhCisgICAgICAvLyAoZGVmYXVsdCAyIHNlYykgTG9vcCBTdGF0ZSBUaW1lb3V0IChMU1QpIEZNIG1lc3NhZ2UuICBXZSAKKyAgICAgIC8vIHdhbnQgdG8gYXZvaWQgdGhpcyByZWxhdGl2ZWx5IGh1Z2UgdGltZW91dCBieSBkZXRlY3RpbmcKKyAgICAgIC8vIGxpa2VseSBzY2VuYXJpb3Mgd2hpY2ggd2lsbCByZXN1bHQgaW4gTFNULgorICAgICAgLy8gVG8gZG8gdGhpcywgd2UgY291bGQgZXhhbWluZSBGTXN0YXR1cyBmb3IgTG9zcyBvZiBTeW5jaHJvbml6YXRpb24KKyAgICAgIC8vIGFuZC9vciBFbGFzdGljIFN0b3JlIChFUykgZXJyb3JzLiAgT2YgdGhlc2UsIEVsYXN0aWMgU3RvcmUgaXMgYmV0dGVyCisgICAgICAvLyBiZWNhdXNlIHdlIGdldCB0aGlzIGluZGljYXRpb24gbW9yZSBxdWlja2x5IHRoYW4gdGhlIExPUy4KKyAgICAgIC8vIE5vdCBhbGwgRVMgZXJyb3JzIGFyZSBoYXJtZnVsbCwgc28gd2UgZG9uJ3Qgd2FudCB0byBMSVAgb24gZXZlcnkKKyAgICAgIC8vIEVTLiAgSW5zdGVhZCwgb24gZXZlcnkgRVMsIGRldGVjdCB3aGV0aGVyIG91ciBMUFNNIGluIGluIG9uZQorICAgICAgLy8gb2YgdGhlIExTVCBzdGF0ZXM6IEFSQklUUkFUSU5HLCBPUEVOLCBPUEVORUQsIFhNSVRURUQgQ0xPU0UsCisgICAgICAvLyBvciBSRUNFSVZFRCBDTE9TRS4gIChTZWUgVEwvVFMgVUcsIHBnLiAxODEpCisgICAgICAvLyBJZiBhbnkgb2YgdGhlc2UgTFBTTSBzdGF0ZXMgYXJlIGRldGVjdGVkCisgICAgICAvLyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBMSVAgd2hpbGUgTERuIGlzIG5vdCBzZXQsIAorICAgICAgLy8gc2VuZCBhbiBGTSBpbml0IChMSVAgRjcsRjcgZm9yIGxvb3BzKSEKKyAgICAgIC8vIEl0IGlzIGNyaXRpY2FsIHRvIHRoZSBwaHlzaWNhbCBsaW5rIHN0YWJpbGl0eSBOT1QgdG8gcmVzZXQgKExJUCkKKyAgICAgIC8vIG1vcmUgdGhhbiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeTsgdGhpcyBpcyBhIGJhc2ljIHByZW1pc2Ugb2YgdGhlCisgICAgICAvLyBTQU5NYXJrIGxldmVsIDEgc3BlYy4KKyAgICAgIHsKKwlVTE9ORyBMcHNtID0gKGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLnZhbHVlICYgMHhGMCkgPj40OworCQorCWlmKCAoZmNDaGlwLT5SZWdpc3RlcnMuRk1zdGF0dXMudmFsdWUgJiAweDQwMCkgIC8vIEVsYXN0aWNTdG9yZT8KKyAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgIShmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZSAmIDB4MTAwKSAvLyBOT1QgTERuCisJICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgIShmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZSAmIDB4MTAwMCkpIC8vIE5PVCBMRgorCXsKKwkgIGlmKCAoTHBzbSAhPSAwKSB8fCAvLyBub3QgTU9OSVRPUklORz8gb3IKKwkgICAgICAhKExwc20gJiAweDgpICkvLyBub3QgYWxyZWFkeSBvZmZsaW5lPworCSAgeworCSAgLy8gbm93IGNoZWNrIHRoZSBwYXJ0aWN1bGFyIExTVCBzdGF0ZXMuLi4KKyAgICAgICAgICAgIGlmKCAoTHBzbSA9PSBBUkJJVFJBVElORykgfHwgKExwc20gPT0gT1BFTikgfHwKKwkgICAgICAoTHBzbSA9PSBPUEVORUQpICAgICAgfHwgKExwc20gPT0gWE1JVFREX0NMT1NFKSB8fAorCSAgICAgIChMcHNtID09IFJDVkRfQ0xPU0UpICkKKwkgICAgeworCSAgICAgIC8vIHJlLWluaXQgdGhlIGxvb3AgYmVmb3JlIGl0IGhhbmdzIGl0c2VsZiEKKyAgICAgICAgICAgICAgcHJpbnRrKCIgI3JlcSBGTWluaXQgb24gRS1TOiBMUFNNICVYaCMgIixMcHNtKTsKKworCisJICAgICAgZmNDaGlwLT5mY1N0YXRzLkZNaW5pdHMrKzsKKyAgICAgICAgICAgICAgd3JpdGVsKCA2LCBmY0NoaXAtPlJlZ2lzdGVycy5GTWNvbnRyb2wuYWRkcmVzcyk7IC8vIExJUAorCSAgICB9CisJICB9CisJfQorCWVsc2UgaWYoIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLnZhbHVlICYgMHg0MDAwMCApIC8vIExTVD8KKwl7CisgICAgICAgICAgcHJpbnRrKCIgI3JlcSBGTWluaXQgb24gTFNULCBMUFNNICVYaCMgIixMcHNtKTsKKwkgCisgICAgICAgICAgZmNDaGlwLT5mY1N0YXRzLkZNaW5pdHMrKzsKKyAgICAgICAgICB3cml0ZWwoIDYsIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNY29udHJvbC5hZGRyZXNzKTsgIC8vIExJUAorCX0gIAorICAgICAgfQorCisKKyAgICAgIC8vIGNsZWFyIG9ubHkgdGhlICdpbnRlcnJ1cHRpbmcnIHR5cGUgYml0cyBmb3IgdGhpcyBSRUcgcmVhZAorICAgICAgd3JpdGVsKCAoZmNDaGlwLT5SZWdpc3RlcnMuRk1zdGF0dXMudmFsdWUgJiAweGZmM2ZmZjAwTCksCisgICAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLmFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgLy8gY29weSBmcmFtZSBtYW5hZ2VyIHN0YXR1cyB0byB1bnVzZWQgVUxPTkcgc2xvdAorICAgICAgZmNDaGlwLT5JTVEtPlFFbnRyeVtmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleF0ud29yZFswXSA9CisgICAgICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuRk1zdGF0dXMudmFsdWU7IC8vIChmb3IgZGVidWdnaW5nKQorCisKKyAgICAgICAgICAvLyBMb2FkIHRoZSBGcmFtZSBNYW5hZ2VyJ3MgZXJyb3IgY291bnRlcnMuICBXZSBjaGVjayB0aGVtIGhlcmUKKyAgICAgICAgICAvLyBiZWNhdXNlIHByZXN1bWFibHkgdGhlIGxpbmsgaXMgdXAgYW5kIGhlYWx0aHkgZW5vdWdoIGZvciB0aGUKKyAgICAgICAgICAvLyBjb3VudGVycyB0byBiZSBtZWFuaW5nZnVsIChpLmUuLCBkb24ndCBjaGVjayB0aGVtIHdoaWxlIGxvb3AKKyAgICAgICAgICAvLyBpcyBpbml0aWFsaXppbmcpLgorICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuRk1MaW5rU3RhdHVzMS52YWx1ZSA9ICAgLy8gZ2V0IFRMJ3MgY291bnRlcgorICAgICAgICByZWFkbChmY0NoaXAtPlJlZ2lzdGVycy5GTUxpbmtTdGF0dXMxLmFkZHJlc3MpOworICAgICAgICAgICAgCisgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5GTUxpbmtTdGF0dXMyLnZhbHVlID0gICAvLyBnZXQgVEwncyBjb3VudGVyCisgICAgICAgIHJlYWRsKGZjQ2hpcC0+UmVnaXN0ZXJzLkZNTGlua1N0YXR1czIuYWRkcmVzcyk7CisgICAgICAgICAgCisgICAgICAgICAgLy8gR2V0IEZNIEJCX0NyZWRpdCBaZXJvIFJlZyAtIGRvZXMgbm90IGNsZWFyIG9uIFJFQUQKKyAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNQkJfQ3JlZGl0WmVyby52YWx1ZSA9ICAgLy8gZ2V0IFRMJ3MgY291bnRlcgorICAgICAgICByZWFkbChmY0NoaXAtPlJlZ2lzdGVycy5GTUJCX0NyZWRpdFplcm8uYWRkcmVzcyk7CisgICAgICAgICAgICAKKworCisgICAgICBmY1BhcnNlTGlua1N0YXR1c0NvdW50ZXJzKCBmY0NoaXApOyAvLyBsb2FkIGludG8gNiBzL3cgYWNjdW11bGF0b3JzCisKKworICAgICAgICAgICAgICAgLy8gTElOSyBET1dOCisKKyAgICAgIGlmKCBmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZSAmIDB4MTAwTCApIC8vIExpbmsgRE9XTiBiaXQKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkKKyNpZmRlZiBJTVFfREVCVUcKKyAgICAgICAgcHJpbnRrKCJMaW5rRG5cbiIpOworI2VuZGlmCisgICAgICAgIHByaW50aygiICNMRG4jICIpOworICAgICAgICAKKyAgICAgICAgZmNDaGlwLT5mY1N0YXRzLmxpbmtEb3duKys7CisgICAgICAgIAorCVNldFRhY2hUT1YoIGNwcWZjSEJBZGF0YSk7ICAvLyBtdXN0IHNldCBhY2NvcmRpbmcgdG8gU0FOTWFyaworCisJLy8gQ2hlY2sgdGhlIEVSUSAtIGZvcmNlIGl0IHRvIGJlICJlbXB0eSIgdG8gcHJldmVudCBUYWNoCisJLy8gZnJvbSBzZW5kaW5nIG91dCBmcmFtZXMgYmVmb3JlIHdlIGRvIGxvZ2lucy4KKworCisgIAlpZiggZmNDaGlwLT5FUlEtPnByb2R1Y2VySW5kZXggIT0gZmNDaGlwLT5FUlEtPmNvbnN1bWVySW5kZXgpCisJeworLy8JICBwcmludGsoIiNFUlEgUEkgIT0gQ0kjIik7CisgICAgICAgICAgQ3BxVHNGcmVlemVUYWNobGl0ZSggZmNDaGlwLCAxKTsgLy8gZnJlZXplIEVSUSBvbmx5CSAgCisJICBmY0NoaXAtPkVSUS0+cHJvZHVjZXJJbmRleCA9IGZjQ2hpcC0+RVJRLT5jb25zdW1lckluZGV4ID0gMDsKKyAJICB3cml0ZWwoIGZjQ2hpcC0+RVJRLT5iYXNlLCAKKwkgICAgKGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9FUlFfQkFTRSkpOworICAgICAgICAgIC8vIHJlLXdyaXRpbmcgYmFzZSBmb3JjZXMgRVJRIFBJIHRvIGVxdWFsIENJCisgIAorCX0KKwkJCisJLy8gbGluayBkb3duIHRyYW5zaXRpb24gb2NjdXJyZWQgLS0gcG9ydF9pZHMgY2FuIGNoYW5nZQorICAgICAgICAvLyBvbiBuZXh0IExpbmtVcCwgc28gd2UgbXVzdCBpbnZhbGlkYXRlIGN1cnJlbnQgbG9naW5zCisgICAgICAgIC8vIChhbmQgYW55IEkvTyBpbiBwcm9ncmVzcykgdW50aWwgUERJU0Mgb3IgUExPR0kvUFJMSQorICAgICAgICAvLyBjb21wbGV0ZXMKKyAgICAgICAgeworICAgICAgICAgIHBMb2dnZWRJblBvcnQgPSAmZmNDaGlwLT5mY1BvcnRzOyAKKyAgICAgICAgICB3aGlsZSggcExvZ2dlZEluUG9ydCApIC8vIGZvciBhbGwgcG9ydHMgd2hpY2ggYXJlIGV4cGVjdGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUERJU0MgYWZ0ZXIgdGhlIG5leHQgTElQLCBzZXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2dvdXRUaW1lcgorICAgICAgICAgIHsKKworCSAgICBpZiggcExvZ2dlZEluUG9ydC0+cGRpc2MpIC8vIGV4cGVjdGluZyBQRElTQyB3aXRoaW4gMiBzZWM/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHBMb2dnZWRJblBvcnQtPkxPR09fdGltZXIgPSAzOyAgLy8gd2Ugd2FudCAyIHNlY29uZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgVGltZXIgZ3JhbnVsYXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyAxIHNlY29uZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5kIGFueSBJL08gaW4gcHJvZ3Jlc3MgdW50aWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUERJU0MgcmVjZWl2ZWQuLi4KKyAgICAgICAgICAgIHBMb2dnZWRJblBvcnQtPnBybGkgPSBGQUxTRTsgICAvLyBibG9jayBGQ1AtU0NTSSBjb21tYW5kcworCSAgICAKKyAgICAgICAgICAgIHBMb2dnZWRJblBvcnQgPSBwTG9nZ2VkSW5Qb3J0LT5wTmV4dFBvcnQ7CisgICAgICAgICAgfSAgLy8gLi4uIGFsbCBQcmV2aW91c2x5IGtub3duIHBvcnRzIGNoZWNrZWQKKyAgICAgICAgfQorICAgICAgICAKKwkvLyBzaW5jZSBhbnkgaG90IHBsdWdnaW5nIGRldmljZSBtYXkgTk9UIHN1cHBvcnQgTElMUCBmcmFtZXMKKwkvLyAoc3VjaCBhcyBlYXJseSBUYWNoeW9uIGNoaXBzKSwgY2xlYXIgdGhpcyBmbGFnIGluZGljYXRpbmcKKwkvLyB3ZSBzaG91bGRuJ3QgdXNlIChvdXIgY29weSBvZikgYSBMSUxQIG1hcC4KKwkvLyBJZiB3ZSByZWNlaXZlIGFuIExJTFAgZnJhbWUsIHdlJ2xsIHNldCBpdCBhZ2Fpbi4KKwlmY0NoaXAtPk9wdGlvbnMuTElMUGluID0gMDsgLy8gb3VyIExJTFBtYXAgaXMgaW52YWxpZAorICAgICAgICBjcHFmY0hCQWRhdGEtPlBvcnREaXNjRG9uZSA9IDA7IC8vIG11c3QgcmUtdmFsaWRhdGUgRkMgcG9ydHMhCisKKyAgICAgICAgICAvLyBhbHNvLCB3ZSB3YW50IHRvIGludmFsaWRhdGUgKGkuZS4gSU5JVElBVE9SX0FCT1JUKSBhbnkKKyAgICAgICAgICAvLyBvcGVuIExvZ2luIGV4Y2hhbmdlcywgaW4gY2FzZSB0aGUgTGlua0Rvd24gaGFwcGVuZWQgaW4gdGhlCisgICAgICAgICAgLy8gbWlkZGxlIG9mIGxvZ2lucy4gIEl0J3MgcG9zc2libGUgdGhhdCBzb21lIHBvcnRzIGFscmVhZHkKKyAgICAgICAgICAvLyBBQ0NlcHRlZCBsb2dpbiBjb21tYW5kcyB3aGljaCB3ZSBoYXZlIG5vdCBwcm9jZXNzZWQgYmVmb3JlCisgICAgICAgICAgLy8gYW5vdGhlciBMaW5rRG93biBvY2N1cnJlZC4gIEFueSBhY2NlcHRlZCBMb2dpbiBleGhhbmdlcyBhcmUKKyAgICAgICAgICAvLyBpbnZhbGlkYXRlZCBieSBMaW5rRG93biwgZXZlbiBiZWZvcmUgdGhleSBhcmUgYWNrbm93bGVkZ2VkLgorICAgICAgICAgIC8vIEl0J3MgYWxzbyBwb3NzaWJsZSBmb3IgYSBwb3J0IHRvIGhhdmUgYSBRdWV1ZWQgUmVwbHkgb3IgUmVxdWVzdAorICAgICAgICAgIC8vIGZvciBsb2dpbiB3aGljaCB3YXMgaW50ZXJydXB0ZWQgYnkgTGlua0Rvd247IGl0IG1heSBjb21lIGxhdGVyLAorICAgICAgICAgIC8vIGJ1dCBpdCB3aWxsIGJlIHVuYWNjZXB0YWJsZSB0byB1cy4KKworICAgICAgICAgIC8vIHdlIG11c3Qgc2NhbiB0aGUgZW50aXJlIGV4Y2hhbmdlIHNwYWNlLCBmaW5kIGV2ZXJ5IExvZ2luIHR5cGUKKyAgICAgICAgICAvLyBvcmlnaW5hdGVkIGJ5IHVzLCBhbmQgYWJvcnQgaXQuIFRoaXMgaXMgTk9UIGFuIGFib3J0IGR1ZSB0bworICAgICAgICAgIC8vIHRpbWVvdXQsIHNvIHdlIGRvbid0IGFjdHVhbGx5IHNlbmQgYWJvcnQgdG8gdGhlIG90aGVyIHBvcnQgLQorICAgICAgICAgIC8vIHdlIGp1c3QgY29tcGxldGUgaXQgdG8gZnJlZSB1cCB0aGUgZmNFeGNoYW5nZSBzbG90LgorCisgICAgICAgIGZvciggaT1UQUNIX1NFU1RfTEVOOyBpPCBUQUNIX01BWF9YSUQ7IGkrKykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgIC8vIGxvb2tpbmcgZm9yIEV4dGVuZGVkIExpbmsgU2Vydi5FeGNoYW5nZXMKKyAgICAgICAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW2ldLnR5cGUgPT0gRUxTX1BESVNDIHx8CisgICAgICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS50eXBlID09IEVMU19QTE9HSSB8fAorICAgICAgICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbaV0udHlwZSA9PSBFTFNfUFJMSSApIAorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gQUJPUlQgdGhlIGV4Y2hhbmdlIQorI2lmZGVmIElNUV9ERUJVRworICAgICAgICAgICAgcHJpbnRrKCJPcmlnaW5hdG9yIEFCT1JUIHhfaWQgJVhoLCB0eXBlICVYaCwgcG9ydF9pZCAlWGggb24gTERuXG4iLAorICAgICAgICAgICAgICBpLCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbaV0udHlwZSwKKyAgICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS5mY2hzLmRfaWQpOworI2VuZGlmCisKKyAgICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS5zdGF0dXMgfD0gSU5JVElBVE9SX0FCT1JUOworICAgICAgICAgICAgY3BxZmNUU0NvbXBsZXRlRXhjaGFuZ2UoIGNwcWZjSEJBZGF0YS0+UGNpRGV2LCBmY0NoaXAsIGkpOyAvLyBhYm9ydCBvbiBMRG4KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgfQorCisgICAgICAgICAgICAgLy8gIyMjIyMjIyMjIyMjIyMjIyAgIExJTksgVVAgICAjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgIGlmKCBmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZSAmIDB4MjAwTCApIC8vIExpbmsgVXAgYml0CisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQUxfUEEgY291bGQgaGF2ZSBjaGFuZ2VkCisKKyAgICAgICAgICAvLyBXZSBuZWVkIHRoZSBmb2xsb3dpbmcgY29kZSwgZHVwbGljYXRlZCBmcm9tIExpbmtEbiBjb25kaXRpb24sCisgICAgICAgICAgLy8gYmVjYXVzZSBpdCdzIHBvc3NpYmxlIGZvciB0aGUgVGFjaHlvbiB0byByZS1pbml0aWFsaXplIChoYXJkCisgICAgICAgICAgLy8gcmVzZXQpIHdpdGhvdXQgZXZlciBnZXR0aW5nIGEgTGlua0RuIGluZGljYXRpb24uCisgICAgICAgIHBMb2dnZWRJblBvcnQgPSAmZmNDaGlwLT5mY1BvcnRzOyAKKyAgICAgICAgd2hpbGUoIHBMb2dnZWRJblBvcnQgKSAgIC8vIGZvciBhbGwgcG9ydHMgd2hpY2ggYXJlIGV4cGVjdGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUERJU0MgYWZ0ZXIgdGhlIG5leHQgTElQLCBzZXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2dvdXRUaW1lcgorICAgICAgICB7CisgICAgICAgICAgaWYoIHBMb2dnZWRJblBvcnQtPnBkaXNjKSAvLyBleHBlY3RpbmcgUERJU0Mgd2l0aGluIDIgc2VjPworICAgICAgICAgIHsKKyAgICAgICAgICAgIHBMb2dnZWRJblBvcnQtPkxPR09fdGltZXIgPSAzOyAgLy8gd2Ugd2FudCAyIHNlY29uZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgVGltZXIgZ3JhbnVsYXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyAxIHNlY29uZAorICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbmQgYW55IEkvTyBpbiBwcm9ncmVzcyB1bnRpbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBESVNDIHJlY2VpdmVkLi4uCisKKyAgICAgICAgICB9CisgICAgICAgICAgcExvZ2dlZEluUG9ydCA9IHBMb2dnZWRJblBvcnQtPnBOZXh0UG9ydDsKKyAgICAgICAgfSAgLy8gLi4uIGFsbCBQcmV2aW91c2x5IGtub3duIHBvcnRzIGNoZWNrZWQKKyAKKyAgICAgICAgICAvLyBDcHFUcyBhY3F1aXJlZCBBTF9QQSBpbiByZWdpc3RlciBBTF9QQSAoQUNRX0FMUEEpCisgICAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLnJjdl9hbF9wYS52YWx1ZSA9IAorICAgICAgICAgIHJlYWRsKGZjQ2hpcC0+UmVnaXN0ZXJzLnJjdl9hbF9wYS5hZGRyZXNzKTsKKyAKKwkvLyBOb3csIGlmIG91ciBhY3F1aXJlZCBhZGRyZXNzIGlzIERJRkZFUkVOVCBmcm9tIG91cgorICAgICAgICAvLyBwcmV2aW91cyBvbmUsIHdlIGFyZSBub3QgYWxsb3cgdG8gZG8gUERJU0MgLSB3ZQorICAgICAgICAvLyBtdXN0IGdvIGJhY2sgdG8gUExPR0ksIHdoaWNoIHdpbGwgdGVybWluYXRlIEkvTyBpbgorICAgICAgICAvLyBwcm9ncmVzcyBmb3IgQUxMIGxvZ2dlZCBpbiBGQyBkZXZpY2VzLi4uCisJLy8gKFRoaXMgaXMgaGlnaGx5IHVubGlrZWx5KS4KKworCWlmKCAoZmNDaGlwLT5SZWdpc3RlcnMubXlfYWxfcGEgJiAweEZGKSAhPSAKKwkgICAgKChmY0NoaXAtPlJlZ2lzdGVycy5yY3ZfYWxfcGEudmFsdWUgPj4gMTYpICYweEZGKSApCisJeworCisvLwkgIHByaW50aygiICNvdXIgSEJBIHBvcnRfaWQgY2hhbmdlZCEjICIpOyAvLyBGQyBwb3J0X2lkIGNoYW5nZWQhIQkKKworCSAgcExvZ2dlZEluUG9ydCA9ICZmY0NoaXAtPmZjUG9ydHM7IAorICAgICAgICAgIHdoaWxlKCBwTG9nZ2VkSW5Qb3J0ICkgLy8gZm9yIGFsbCBwb3J0cyB3aGljaCBhcmUgZXhwZWN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQRElTQyBhZnRlciB0aGUgbmV4dCBMSVAsIHNldCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZ291dFRpbWVyCisgICAgICAgICAgeworCSAgICBwTG9nZ2VkSW5Qb3J0LT5wZGlzYyAgPSBGQUxTRTsKKyAgICAgICAgICAgIHBMb2dnZWRJblBvcnQtPnBybGkgPSBGQUxTRTsKKyAgICAgICAgICAgIHBMb2dnZWRJblBvcnQgPSBwTG9nZ2VkSW5Qb3J0LT5wTmV4dFBvcnQ7CisgICAgICAgICAgfSAgLy8gLi4uIGFsbCBQcmV2aW91c2x5IGtub3duIHBvcnRzIGNoZWNrZWQKKworCSAgLy8gd2hlbiB0aGUgcG9ydF9pZCBjaGFuZ2VzLCB3ZSBtdXN0IHRlcm1pbmF0ZQorCSAgLy8gYWxsIG9wZW4gZXhjaGFuZ2VzLgorICAgICAgICAgIGNwcWZjVFNUZXJtaW5hdGVFeGNoYW5nZSggY3BxZmNIQkFkYXRhLCBOVUxMLCBQT1JUSURfQ0hBTkdFRCk7CisKKwl9CisJICAgICAgICAgICAgICAgCisJLy8gUmVwbGFjZSB0aGUgZW50aXJlIDI0LWJpdCBwb3J0X2lkLiAgV2Ugb25seSBrbm93IHRoZQorCS8vIGxvd2VyIDggYml0cyAoYWxwYSkgZnJvbSBUYWNoeW9uOyBpZiBhIEZMT0dJIGlzIGRvbmUsCisJLy8gd2UnbGwgZ2V0IHRoZSB1cHBlciAxNi1iaXRzIGZyb20gdGhlIEZMT0dJIEFDQyBmcmFtZS4KKwkvLyBJZiBzb21lb25lIHBsdWdzIGludG8gRmFicmljIHN3aXRjaCwgd2UnbGwgZG8gRkxPR0kgYW5kCisJLy8gZ2V0IGZ1bGwgMjQtYml0IHBvcnRfaWQ7IHNvbWVvbmUgY291bGQgdGhlbiByZW1vdmUgYW5kCisJLy8gaG90LXBsdWcgdXMgaW50byBhIGR1bWIgaHViLiAgSWYgd2Ugc2VuZCBhIDI0LWJpdCBQTE9HSQorCS8vIHRvIGEgInByaXZhdGUiIGxvb3AgZGV2aWNlLCBpdCBtaWdodCBibG93IHVwLgorCS8vIENvbnNlcXVlbnRseSwgd2UgZm9yY2UgdGhlIHVwcGVyIDE2LWJpdHMgb2YgcG9ydF9pZCB0bworCS8vIGJlIHJlLXNldCBvbiBldmVyeSBMaW5rVXAgdHJhbnNpdGlvbgorICAgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5teV9hbF9wYSA9CisgICAgICAgICAgKGZjQ2hpcC0+UmVnaXN0ZXJzLnJjdl9hbF9wYS52YWx1ZSA+PiAxNikgJiAweEZGOworCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAvLyBjb3B5IGZyYW1lIG1hbmFnZXIgc3RhdHVzIHRvIHVudXNlZCBVTE9ORyBzbG90CisgICAgICAgIGZjQ2hpcC0+SU1RLT5RRW50cnlbZmNDaGlwLT5JTVEtPmNvbnN1bWVySW5kZXhdLndvcmRbMV0gPQorICAgICAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLm15X2FsX3BhOyAvLyAoZm9yIGRlYnVnZ2luZykKKworICAgICAgICAgICAgICAvLyBmb3IgVGFjaExpdGUsIHdlIG5lZWQgdG8gd3JpdGUgdGhlIGFjcXVpcmVkIGFsX3BhCisgICAgICAgICAgICAgIC8vIGJhY2sgaW50byB0aGUgRk1jb25maWcgcmVnaXN0ZXIsIGJlY2F1c2UgYWZ0ZXIKKyAgICAgICAgICAgICAgLy8gZmlyc3QgaW5pdGlhbGl6YXRpb24sIHRoZSBBUSAocHJldi4gYWNxLikgYml0IGdldHMKKyAgICAgICAgICAgICAgLy8gc2V0LCBjYXVzaW5nIFRMIEZNIHRvIHVzZSB0aGUgQUxfUEEgZmllbGQgaW4gRk1jb25maWcuCisgICAgICAgICAgICAgIC8vIChJbiBUYWNoeW9uLCBGTSB3cml0ZXMgdGhlIGFjcXVpcmVkIEFMX1BBIGZvciB1cy4pCisgICAgICAgIHVsQnVmZiA9IHJlYWRsKCBmY0NoaXAtPlJlZ2lzdGVycy5GTWNvbmZpZy5hZGRyZXNzKTsKKyAgICAgICAgdWxCdWZmICY9IDB4MDBmZmZmZmZMOyAgLy8gbWFzayBvdXQgY3VycmVudCBhbF9wYQorICAgICAgICB1bEJ1ZmYgfD0gKCBmY0NoaXAtPlJlZ2lzdGVycy5teV9hbF9wYSA8PCAyNCApOyAvLyBvciBpbiBhY3EuIGFsX3BhCisgICAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNY29uZmlnLnZhbHVlID0gdWxCdWZmOyAvLyBjb3B5IGl0IGJhY2sKKyAgICAgICAgd3JpdGVsKCBmY0NoaXAtPlJlZ2lzdGVycy5GTWNvbmZpZy52YWx1ZSwgIC8vIHB1dCBpbiBUYWNoTGl0ZQorICAgICAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNY29uZmlnLmFkZHJlc3MpOworICAgICAgICAgICAgCisKKyNpZmRlZiBJTVFfREVCVUcKKyAgICAgICAgcHJpbnRrKCIjTFVwICVYaCwgRk1zdGF0IDB4JTA4WCMiLCAKKwkJZmNDaGlwLT5SZWdpc3RlcnMubXlfYWxfcGEsIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLnZhbHVlKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgIC8vIGFsc28gc2V0IHRoZSBXUklURS1PTkxZIE15X0lEIFJlZ2lzdGVyIChmb3IgRmFicmljCisgICAgICAgICAgICAgIC8vIGluaXRpYWxpemF0aW9uKQorICAgICAgICB3cml0ZWwoIGZjQ2hpcC0+UmVnaXN0ZXJzLm15X2FsX3BhLAorICAgICAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArVExfTUVNX1RBQ0hfTXlfSUQpOworICAgICAgICAgIAorCisgICAgICAgIGZjQ2hpcC0+ZmNTdGF0cy5saW5rVXArKzsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IFRMIHN0YXRpc3RpY3MgY291bnRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAod2UgaWdub3JlIHRoZXNlIGVycm9yIGNvdW50ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpbGUgbGluayBpcyBkb3duKQorICAgICAgICB1bEJ1ZmYgPSAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgcmVzZXQgVEwncyBjb3VudGVyCisgICAgICAgICAgICAgICAgIHJlYWRsKCBmY0NoaXAtPlJlZ2lzdGVycy5GTUxpbmtTdGF0dXMxLmFkZHJlc3MpOworICAgICAgICAgIAorICAgICAgICB1bEJ1ZmYgPSAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgcmVzZXQgVEwncyBjb3VudGVyCisgICAgICAgICAgICAgICAgIHJlYWRsKCBmY0NoaXAtPlJlZ2lzdGVycy5GTUxpbmtTdGF0dXMyLmFkZHJlc3MpOworCisgICAgICAgICAgLy8gZm9yIGluaXRpYXRvciwgbmVlZCB0byBzdGFydCB2ZXJpZnlpbmcgcG9ydHMgKGUuZy4gUERJU0MpCisKKworCisgICAgICAgICAKKyAgICAgIAorICAgICAgCisJQ3BxVHNVbkZyZWV6ZVRhY2hsaXRlKCBmY0NoaXAsIDIpOyAvLyB1bmZyZWV6ZSBUYWNobGl0ZSwgaWYgTGluayBPSworCQorCS8vIFRhY2h5b24gY3JlYXRlcyBhbiBpbnRlcmVzdGluZyBwcm9ibGVtIGZvciB1cyBvbiBMSUxQIGZyYW1lcy4KKwkvLyBJbnN0ZWFkIG9mIHdyaXRpbmcgdGhlIGluY29taW5nIExJTFAgZnJhbWUgaW50byB0aGUgU0ZRIGJlZm9yZQorCS8vIGluZGljYXRpbmcgTElOSyBVUCAodGhlIGFjdHVhbCBvcmRlciBvZiBldmVudHMpLCBUYWNoeW9uIHRlbGxzCisJLy8gdXMgTElOSyBVUCwgYW5kIGxhdGVyIHVzIHRoZSBMSUxQLiAgU28gd2UgZGVsYXksIHRoZW4gZXhhbWluZSB0aGUKKwkvLyBJTVEgZm9yIGFuIEluYm91bmQgQ00gKHgwNCk7IGlmIGZvdW5kLCB3ZSBjYW4gc2V0CisJLy8gTElOS0FDVElWRSBhZnRlciBwcm9jZXNzaW5nIHRoZSBMSUxQLiAgT3RoZXJ3aXNlLCBqdXN0IHByb2NlZWQuCisJLy8gU2luY2UgVGFjaHlvbiBpbXBvc2VzIHRoaXMgdGltZSBkZWxheSAoYW5kIGRvZXNuJ3QgdGVsbCB1cworCS8vIHdoYXQgaXQgaXMpLCB3ZSBoYXZlIHRvIGltcG9zZSBhIGRlbGF5IGJlZm9yZSAiUGVla2luZyIgdGhlIElNUQorCS8vIGZvciBUYWNoIGhhcmR3YXJlIChETUEpIGRlbGl2ZXJ5LgorCS8vIFByb2Nlc3NpbmcgTElMUCBpcyByZXF1aXJlZCBieSBTQU5NYXJrCisJdWRlbGF5KCAxMDAwKTsgIC8vIG1pY3Jvc2VjIGRlbGF5IHdhaXRpbmcgZm9yIExJTFAgKGlmIGl0IGNvbWVzKQorICAgICAgICBpZiggUGVla0lNUUVudHJ5KCBmY0NoaXAsIEVMU19MSUxQX0ZSQU1FKSApCisJeyAgLy8gZm91bmQgU0ZRIExJTFAsIHdoaWNoIHdpbGwgcG9zdCBMSU5LQUNUSVZFCSAgCisvLwkgIHByaW50aygic2tpcHBpbmcgTElOS0FDVElWRSBwb3N0XG4iKTsKKworCX0KKwllbHNlCisgICAgICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwgTElOS0FDVElWRSwgdWxGaWJyZUZyYW1lKTsgIAorICAgICAgfQorCisKKworICAgICAgLy8gKioqKioqKiBTZXQgRmFicmljIExvZ2luIGluZGljYXRpb24gKioqKioqKioKKyAgICAgIGlmKCBmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZSAmIDB4MjAwMCApCisgICAgICB7CisJcHJpbnRrKCIgI0ZhYnJpYyMgIik7CisgICAgICAgIGZjQ2hpcC0+T3B0aW9ucy5mYWJyaWMgPSAxOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBmY0NoaXAtPk9wdGlvbnMuZmFicmljID0gMDsKKworICAgICAgCisgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKioqKioqKiBMSVAoRjgseCkgb3IgQkFEIEFMX1BBPyAqKioqKioqKgorICAgICAgaWYoIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLnZhbHVlICYgMHgzMDAwMEwgKQorICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSB0aGUgZXJyb3IgQUxfUEFzCisgICAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLnJjdl9hbF9wYS52YWx1ZSA9IAorICAgICAgICAgIHJlYWRsKGZjQ2hpcC0+UmVnaXN0ZXJzLnJjdl9hbF9wYS5hZGRyZXNzKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmFkIEFMX1BBPworICAgICAgICBpZiggZmNDaGlwLT5SZWdpc3RlcnMuRk1zdGF0dXMudmFsdWUgJiAweDEwMDAwTCApCisgICAgICAgIHsKKyAgICAgICAgICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0OworICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSAiQkFEIiBhbF9wYSBmaWVsZAorICAgICAgICAgIGZjQ2hpcC0+SU1RLT5RRW50cnlbZmNDaGlwLT5JTVEtPmNvbnN1bWVySW5kZXhdLndvcmRbMV0gPQorICAgICAgICAgICAgICAoZmNDaGlwLT5SZWdpc3RlcnMucmN2X2FsX3BhLnZhbHVlICYgMHhmZjAwTCkgPj4gODsKKworCSAgcExvZ2dlZEluUG9ydCA9IGZjRmluZExvZ2dlZEluUG9ydCggZmNDaGlwLAorICAgICAgICAgICAgTlVMTCwgICAgIC8vIERPTidUIHNlYXJjaCBTY3NpIE5leHVzCisgICAgICAgICAgICBmY0NoaXAtPklNUS0+UUVudHJ5W2ZjQ2hpcC0+SU1RLT5jb25zdW1lckluZGV4XS53b3JkWzFdLCAvLyBwb3J0IGlkCisgICAgICAgICAgICBOVUxMLCAgICAgLy8gRE9OJ1Qgc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBGQyBXV04KKyAgICAgICAgICAgIE5VTEwpOyAgICAvLyBET04nVCBjYXJlIGFib3V0IGVuZCBvZiBsaXN0CisgCisJICBpZiggcExvZ2dlZEluUG9ydCApCisJICB7CisgICAgICAgICAgICAvLyBKdXN0IGluIGNhc2Ugd2UgZ290IHRoaXMgQkFEX0FMUEEgYmVjYXVzZSBhIGRldmljZQorCSAgICAvLyBxdWlldGx5IGRpc2FwcGVhcmVkIChjYW4gaGFwcGVuIG9uIG5vbi1tYW5hZ2VkIGh1YnMgc3VjaCAKKwkgICAgLy8gYXMgdGhlIFZpeGVsIFJhcHBvcnQgMTAwMCksCisJICAgIC8vIGRvIGFuIEltcGxpY2l0IExvZ291dC4gIFdlIG5ldmVyIGV4cGVjdCB0aGlzIG9uIGEgTG9nZ2VkCisJICAgIC8vIGluIHBvcnQgKGJ1dCBkbyBleHBlY3QgaXQgb24gcG9ydCBkaXNjb3ZlcnkpLgorCSAgICAvLyAoQXMgYSByZWFzb25hYmxlIGFsdGVybmF0aXZlLCB0aGlzIGNvdWxkIGJlIGNoYW5nZWQgdG8gCisJICAgIC8vIHNpbXBseSBzdGFydCB0aGUgaW1wbGljaXQgbG9nb3V0IHRpbWVyLCBnaXZpbmcgdGhlIGRldmljZQorCSAgICAvLyBzZXZlcmFsIHNlY29uZHMgdG8gImNvbWUgYmFjayIuKQorCSAgICAvLyAKKwkgICAgcHJpbnRrKCIgI0JBRCBhbHBhICVYaCMgIiwKKwkJICAgZmNDaGlwLT5JTVEtPlFFbnRyeVtmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleF0ud29yZFsxXSk7CisgICAgICAgICAgICBjcHFmY1RTSW1wbGljaXRMb2dvdXQoIGNwcWZjSEJBZGF0YSwgcExvZ2dlZEluUG9ydCk7CisJICB9CisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIExJUChmOCx4KT8KKyAgICAgICAgaWYoIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLnZhbHVlICYgMHgyMDAwMEwgKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZGVidWdnaW5nLCBjb3B5IGFsX3BhIGZpZWxkCisgICAgICAgICAgZmNDaGlwLT5JTVEtPlFFbnRyeVtmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleF0ud29yZFsyXSA9CisgICAgICAgICAgICAgIChmY0NoaXAtPlJlZ2lzdGVycy5yY3ZfYWxfcGEudmFsdWUgJiAweGZmTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG90aGVyIHBvcnQncyBhbF9wYQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gKG9uZSB0aGF0IHNlbnQgTElQKEY4LD8pICkKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVsYXN0aWMgc3RvcmUgZXJyCisgICAgICBpZiggZmNDaGlwLT5SZWdpc3RlcnMuRk1zdGF0dXMudmFsdWUgJiAweDQwMEwgKQorICAgICAgeworICAgICAgICAgICAgLy8gZG9uJ3QgY291bnQgZS1zIGlmIGxvb3AgaXMgZG93biEKKyAgICAgICAgaWYoICEoVVNIT1JUKShmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZSAmIDB4ODApICkKKyAgICAgICAgICBmY0NoaXAtPmZjU3RhdHMuZV9zdG9yZXMrKzsKKyAgICAgICAgICAKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisKKworICAgIGNhc2UgSU5CT1VORF9GQ1BfWENIR19DT01QTEVUSU9OOiAgLy8gMHgwQworCisgICAgLy8gUmVtYXJrczoKKyAgICAvLyBPbiBUYWNobGl0ZSBUTC9UUywgd2UgZ2V0IHRoaXMgbWVzc2FnZSB3aGVuIHRoZSBkYXRhIHBoYXNlCisgICAgLy8gb2YgYSBTRVNUIGluYm91bmQgdHJhbnNmZXIgaXMgY29tcGxldGUuICBGb3IgZXhhbXBsZSwgaWYgYSBXUklURSBjb21tYW5kCisgICAgLy8gd2FzIHJlY2VpdmVkIHdpdGggT1hfSUQgMCwgd2UgbWlnaHQgcmVzcG9uZCB3aXRoIFhGRVJfUkRZIHdpdGgKKyAgICAvLyBSWF9JRCA4MDAxLiAgVGhpcyB3b3VsZCBzdGFydCB0aGUgU0VTVCBjb250cm9sbGVkIGRhdGEgcGhhc2VzLiAgV2hlbgorICAgIC8vIGFsbCBkYXRhIGZyYW1lcyBhcmUgcmVjZWl2ZWQsIHdlIGdldCB0aGlzIGluYm91bmQgY29tcGxldGlvbi4gVGhpcyBtZWFucworICAgIC8vIHdlIHNob3VsZCBzZW5kIGEgc3RhdHVzIGZyYW1lIHRvIGNvbXBsZXRlIHRoZSBzdGF0dXMgcGhhc2Ugb2YgdGhlIAorICAgIC8vIEZDUC1TQ1NJIGV4Y2hhbmdlLCB1c2luZyB0aGUgc2FtZSBPWF9JRCxSWF9JRCB0aGF0IHdlIHVzZWQgZm9yIGRhdGEKKyAgICAvLyBmcmFtZXMuCisgICAgLy8gU2VlIE91dGJvdW5kIENNIGRpc2N1c3Npb24gb2YgeF9JRHMKKyAgICAvLyBQc3VlZG8gQ29kZQorICAgIC8vICAgR2V0IFNFU1QgaW5kZXggKHhfSUQpCisgICAgLy8gICAgIHhfSUQgb3V0IG9mIHJhbmdlLCByZXR1cm4gKGVyciBjb25kaXRpb24pCisgICAgLy8gICBzZXQgc3RhdHVzIGJpdHMgZnJvbSAybmQgZHdvcmQKKyAgICAvLyAgIGZyZWUgdHJhbnNhY3Rpb25JRCAmIFNFU1QgZW50cnkKKyAgICAvLyAgIGNhbGwgZmNDb21wbGV0ZSB3aXRoIHRyYW5zYWN0aW9uSUQgJiBzdGF0dXMKKworICAgICAgdWxCdWZmID0gZmNDaGlwLT5JTVEtPlFFbnRyeVtmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleF0ud29yZFswXTsKKyAgICAgIHhfSUQgPSB1bEJ1ZmYgJiAweDdmZmZMOyAgLy8gbG93ZXIgMTQgYml0cyBTRVNUX0luZGV4L1RyYW5zX0lECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChtYXNrIG91dCBNU0IgImRpcmVjdGlvbiIgYml0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSYW5nZSBjaGVjayBDTSBPWC9SWF9JRCB2YWx1ZS4uLgorICAgICAgaWYoIHhfSUQgPCBUQUNIX1NFU1RfTEVOICkgIC8vIGRvbid0IGdvIGJleW9uZCBTRVNUIGFycmF5IHNwYWNlCisgICAgICB7CisKKy8vI2RlZmluZSBGQ1BfQ09NUExFVElPTl9EQkcgMQorI2lmZGVmIEZDUF9DT01QTEVUSU9OX0RCRworICAgICAgICBwcmludGsoIiBGQ1BfQ00geF9JRCAlWGgsIHN0YXR1cyAlWGgsIENtbmQgJXBcbiIsIAorICAgICAgICAgIHhfSUQsIHVsQnVmZiwgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW3hfSURdLkNtbmQpOworI2VuZGlmCisgICAgICAgIGlmKCB1bEJ1ZmYgJiAweDA4MDAwMDAwTCApIC8vIFJQQyAtUmVzcG9uc2UgUGhhc2UgQ29tcGxldGUgLSBvciAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWUgdG8gc2VuZCByZXNwb25zZSBmcmFtZT8KKyAgICAgICAgICBSUENzZXQgPSAxOyAgICAgICAgICAgICAvLyAoU0VTVCB0cmFuc2FjdGlvbikKKyAgICAgICAgZWxzZQorICAgICAgICAgIFJQQ3NldCA9IDA7CisgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBzdGF0dXMgZm9yIHRoaXMgSW5ib3VuZCBTQ1NJIHRyYW5zYWN0aW9uJ3MgSUQKKyAgICAgICAgZHdTdGF0dXMgPSAwTDsKKyAgICAgICAgaWYoIHVsQnVmZiAmIDB4NzAwMDAwMDBMICkgLy8gYW55IGVycnM/CisgICAgICAgIHsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiggdWxCdWZmICYgMHg0MDAwMDAwMEwgKQorICAgICAgICAgICAgZHdTdGF0dXMgfD0gTElOS0ZBSUxfUlg7CisgICAgICAgICAgCisJICBpZiggdWxCdWZmICYgMHgyMDAwMDAwMEwgKQorICAgICAgICAgICAgZHdTdGF0dXMgfD0gQ09VTlRfRVJST1I7CisgICAgICAgICAgCisgICAgICAgICAgaWYoIHVsQnVmZiAmIDB4MTAwMDAwMDBMICkKKyAgICAgICAgICAgIGR3U3RhdHVzIHw9IE9WRVJGTE9XOworICAgICAgICB9CisgICAgICAKKwkKKwkgIC8vIEZDUCB0cmFuc2FjdGlvbiBkb25lIC0gY29weSBzdGF0dXMKKyAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzID0gZHdTdGF0dXM7CisKKworICAgICAgICAvLyBEaWQgdGhlIGV4Y2hhbmdlIGdldCBhbiBGQ1AtUlNQIHJlc3BvbnNlIGZyYW1lPworICAgICAgICAvLyAoTm90ZSB0aGUgbGl0dGxlIGVuZGlhbi9iaWcgZW5kaWFuIEZDIHBheWxvYWQgZGlmZmVyZW5jZSkKKworICAgICAgICBpZiggUlBDc2V0ICkgICAgICAgICAgICAgLy8gU0VTVCB0cmFuc2FjdGlvbiBSZXNwb25zZSBmcmFtZSByZWMnZAorICAgICAgICB7CisgICAgCSAgLy8gY29tcGxldGUgdGhlIGNvbW1hbmQgaW4gb3VyIGRyaXZlci4uLgorICAgICAgICAgIGNwcWZjVFNDb21wbGV0ZUV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEtPlBjaURldixmY0NoaXAsIHhfSUQpOworCisgICAgICAgIH0gIC8vIGVuZCAiUlBDc2V0IgorCQorICAgICAgICBlbHNlICAvLyAoInRhcmdldCIgbG9naWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRhY2hsaXRlIHNheXMgYWxsIGRhdGEgZnJhbWVzIGhhdmUgYmVlbiByZWNlaXZlZCAtIG5vdyBpdCdzIHRpbWUKKyAgICAgICAgICAgIC8vIHRvIGFuYWx5emUgZGF0YSB0cmFuc2ZlciAoc3VjY2Vzc2Z1bD8pLCB0aGVuIHNlbmQgYSByZXNwb25zZSAKKyAgICAgICAgICAgIC8vIGZyYW1lIGZvciB0aGlzIGV4Y2hhbmdlCisKKyAgICAgICAgICB1bEZpYnJlRnJhbWVbMF0gPSB4X0lEOyAvLyBjb3B5IGZvciBsYXRlciByZWZlcmVuY2UKKworICAgICAgICAgIC8vIGlmIHRoaXMgd2FzIGEgVFdFLCB3ZSBoYXZlIHRvIHNlbmQgc2F0dXMgcmVzcG9uc2UKKyAgICAgICAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS50eXBlID09IFNDU0lfVFdFICkKKwkgIHsKKy8vICAgICAgICAgICAgZmNQdXRTY3NpUXVlKCBjcHFmY0hCQWRhdGEsIAorLy8gICAgICAgICAgICAgICAgTkVFRF9GQ1BfUlNQLCB1bEZpYnJlRnJhbWUpOyAgLy8gKHVsRmlicmVGcmFtZSBub3QgdXNlZCBoZXJlKQorCSAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlICAvLyBFUlJPUiBDT05ESVRJT04hICBib2d1cyB4X0lEIGluIGNvbXBsZXRpb24gbWVzc2FnZQorICAgICAgeworICAgICAgICBwcmludGsoIklOIEZDUF9YQ0hHOiBiYWQgeF9JRDogJVhoXG4iLCB4X0lEKTsKKyAgICAgIH0KKworICAgIGJyZWFrOworCisKKworCisgICAgY2FzZSBJTkJPVU5EX1NDU0lfREFUQV9DT01NQU5EOgorICAgIGNhc2UgQkFEX1NDU0lfRlJBTUU6CisgICAgY2FzZSBJTkJfU0NTSV9TVEFUVVNfQ09NUExFVElPTjoKKyAgICBjYXNlIEJVRkZFUl9QUk9DRVNTRURfQ09NUExFVElPTjoKKyAgICBicmVhazsKKyAgICB9CisKKwkJCQkJICAgLy8gVGFjaHlvbiBpcyBwcm9kdWNpbmc7CisJCQkJCSAgIC8vIHdlIGFyZSBjb25zdW1pbmcKKyAgICBmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleCsrOyAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgT1VSIGNvbnN1bWVySW5kZXgKKyAgICBpZiggZmNDaGlwLT5JTVEtPmNvbnN1bWVySW5kZXggPj0gSU1RX0xFTikvLyBjaGVjayBmb3Igcm9sbG92ZXIKKyAgICAgIGZjQ2hpcC0+SU1RLT5jb25zdW1lckluZGV4ID0gMEw7ICAgICAgICAvLyByZXNldCBpdAorCisKKyAgICBpZiggZmNDaGlwLT5JTVEtPnByb2R1Y2VySW5kZXggPT0gZmNDaGlwLT5JTVEtPmNvbnN1bWVySW5kZXggKQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgTWVzc2FnZXMgYXJlIHByb2Nlc3NlZCAtCisgICAgICBpU3RhdHVzID0gMDsgICAgICAgICAgICAgIC8vIG5vIG1vcmUgbWVzc2FnZXMgdG8gcHJvY2VzcworCisgICAgfQorICAgIGVsc2UKKyAgICAgIGlTdGF0dXMgPSAxOyAgICAgICAgICAgICAgLy8gbW9yZSBtZXNzYWdlcyB0byBwcm9jZXNzCisKKyAgICAvLyB1cGRhdGUgVGFjaExpdGUncyBDb25zdW1lckluZGV4Li4uIChjbGVhcnMgSU5UQV9MKQorICAgIC8vIE5PVEU6IGFjY29yZGluZyB0byBUTC9UUyBVRywgdGhlIAorICAgIC8vICJob3N0IG11c3QgcmV0dXJuIGNvbXBsZXRpb24gbWVzc2FnZXMgaW4gc2VxdWVudGlhbCBvcmRlciIuCisgICAgLy8gRG9lcyB0aGlzIG1lYW4gb25lIGF0IGEgdGltZSwgaW4gdGhlIG9yZGVyIHJlY2VpdmVkPyAgV2UKKyAgICAvLyBwcmVzdW1lIHNvLgorCisgICAgd3JpdGVsKCBmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleCwKKyAgICAgIChmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBJTVFfQ09OU1VNRVJfSU5ERVgpKTsKKwkJICAgIAorI2lmIElNUV9ERUJVRworICAgIHByaW50aygiUHJvY2VzcyBJTVE6IHdyaXRpbmcgY29uc3VtZXIgbmR4ICVkXG4gIiwgCisgICAgICBmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleCk7CisgICAgcHJpbnRrKCJQSSAlWCwgQ0kgJVhcbiIsIAorICAgIGZjQ2hpcC0+SU1RLT5wcm9kdWNlckluZGV4LGZjQ2hpcC0+SU1RLT5jb25zdW1lckluZGV4ICk7CisjZW5kaWYKKyAgCisKKworICB9CisgIGVsc2UKKyAgeworICAgLy8gaG1tbS4uLiB3aHkgZGlkIHdlIGdldCBpbnRlcnJ1cHRlZC9jYWxsZWQgd2l0aCBubyBtZXNzYWdlPworICAgIGlTdGF0dXMgPSAtMTsgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIHByb2Nlc3MKKyNpZiBJTVFfREVCVUcKKyAgICBwcmludGsoIlByb2Nlc3MgSU1ROiBubyBtZXNzYWdlIFBJICVYaCAgQ0kgJVhoIiwgCisgICAgICBmY0NoaXAtPklNUS0+cHJvZHVjZXJJbmRleCwKKyAgICAgIGZjQ2hpcC0+SU1RLT5jb25zdW1lckluZGV4KTsKKyNlbmRpZgorICB9CisKKyAgTEVBVkUoIlByb2Nlc3NJTVFFbnRyeSIpOworICAKKyAgcmV0dXJuIGlTdGF0dXM7Cit9CisKKworCisKKworLy8gVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIFRhY2h5b24gYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcKKy8vIG9wdGlvbnMgKG9wY29kZTEpOgorLy8gMSAtIFJFU1RBUlQgVGFjaHlvbiwgc2ltdWxhdGUgcG93ZXIgb24gY29uZGl0aW9uIGJ5IHNodXR0aW5nCisvLyAgICAgZG93biBsYXNlciwgcmVzZXR0aW5nIHRoZSBoYXJkd2FyZSwgZGUtYWxsb2NhdGluZyBhbGwgYnVmZmVyczsKKy8vICAgICBjb250aW51ZQorLy8gMiAtIENvbmZpZyBUYWNoeW9uIC8gUENJIHJlZ2lzdGVyczsKKy8vICAgICBjb250aW51ZQorLy8gMyAtIEFsbG9jYXRpbmcgbWVtb3J5IGFuZCBzZXR0aW5nIFRhY2h5b24gcXVldWVzICh3cml0ZSBUYWNoeW9uIHJlZ3MpOworLy8gICAgIGNvbnRpbnVlCisvLyA0IC0gQ29uZmlnIGZyYW1lIG1hbmFnZXIgcmVnaXN0ZXJzLCBpbml0aWFsaXplLCB0dXJuIG9uIGxhc2VyCisvLworLy8gUmV0dXJuczoKKy8vICAtMSBvbiBmYXRhbCBlcnJvcgorLy8gICAwIG9uIHN1Y2Nlc3MKKworaW50IENwcVRzSW5pdGlhbGl6ZVRhY2hMaXRlKCB2b2lkICpwSEJBLCBpbnQgb3Bjb2RlMSwgaW50IG9wY29kZTIpCit7CisgIENQUUZDSEJBICpjcHFmY0hCQWRhdGEgPSAoQ1BRRkNIQkEqKXBIQkE7CisgIFBUQUNIWU9OIGZjQ2hpcCA9ICZjcHFmY0hCQWRhdGEtPmZjQ2hpcDsKKyAgVUxPTkcgdWxCdWZmOworICBVQ0hBUiBiQnVmZjsKKyAgaW50IGlTdGF0dXM9LTE7ICAvLyBhc3N1bWUgZmFpbHVyZQorCisgIEVOVEVSKCJJbml0aWFsaXplVGFjaExpdGUiKTsKKworICAvLyB2ZXJpZnkgYm9hcmQncyBiYXNlIGFkZHJlc3MgKHNhbml0eSBjaGVjaykKKworICBpZiggIWZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSkgICAgICAgICAgICAgICAgLy8gTlVMTCBhZGRyZXNzIGZvciBjYXJkPworICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRkFUQUwgZXJyb3IhCisKKworCisgIHN3aXRjaCggb3Bjb2RlMSApCisgIHsKKyAgICBjYXNlIDE6ICAgICAgIC8vIHJlc3RvcmUgaGFyZHdhcmUgdG8gcG93ZXItb24gKGhhcmQpIHJlc3RhcnQKKworCisgICAgICBpU3RhdHVzID0gZmNDaGlwLT5SZXNldFRhY2h5b24oIAorCQkgIGNwcWZjSEJBZGF0YSwgb3Bjb2RlMik7IC8vIGxhc2VyIG9mZiwgcmVzZXQgaGFyZHdhcmUKKwkJCQkgICAgICAvLyBkZS1hbGxvY2F0ZSBhbGlnbmVkIGJ1ZmZlcnMKKworCisvKiBUQkQgICAgICAvLyByZXNldCBGQyBsaW5rIFEgKHByb2R1Y2VyIGFuZCBjb25zdW1lciA9IDApCisgICAgICBmY0xpbmtRUmVzZXQoY3BxZmNIQkFkYXRhKTsgCisKKyovCisKKyAgICAgIGlmKCBpU3RhdHVzICkKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI6ICAgICAgIC8vIENvbmZpZyBQQ0kvVGFjaHlvbiByZWdpc3RlcnMKKyAgICAgIC8vIE5PVEU6IEZvciBUYWNoIFRML1RTLCBiaXQgMzEgbXVzdCBiZSBzZXQgdG8gMS4gIEZvciBUUyBjaGlwcywgYSByZWFkCisgICAgICAvLyBvZiBiaXQgMzEgaW5kaWNhdGVzIHN0YXRlIG9mIE02NkVOIHNpZ25hbDsgaWYgMSwgY2hpcCBtYXkgcnVuIGF0IAorICAgICAgLy8gMzMtNjZNSHogIChzZWUgVEwvVFMgVUcsIHBnIDE1OSkKKworICAgICAgdWxCdWZmID0gMHg4MDAwMDAwMDsgIC8vIFRhY2hMaXRlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKworICAgICAgd3JpdGVsKCB1bEJ1ZmYsIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZY29uZmlnLmFkZHJlc3MpOworLy8gICAgICB1bEJ1ZmYgPSAweDAxNDdMOyAgLy8gQ3BxVHMgUENJIENGR0NNRCByZWdpc3RlcgorLy8gICAgICBXcml0ZVBDSUNvbmZpZ3VyYXRpb24oIGZjQ2hpcC0+QmFja3BsYW5lLmJ1cywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNDaGlwLT5CYWNrcGxhbmUuc2xvdCwgVExDRkdDTUQsIHVsQnVmZiwgNCk7CisvLyAgICAgIHVsQnVmZiA9IDB4MEw7ICAvLyB0ZXN0IQorLy8gICAgICBSZWFkUENJQ29uZmlndXJhdGlvbiggZmNDaGlwLT5CYWNrcGxhbmUuYnVzLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBmY0NoaXAtPkJhY2twbGFuZS5zbG90LCBUTENGR0NNRCwgJnVsQnVmZiwgNCk7CisKKyAgICAgIC8vIHJlYWQgYmFjayBmb3IgcmVmZXJlbmNlLi4uCisgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5UWWNvbmZpZy52YWx1ZSA9IAorICAgICAgICAgcmVhZGwoIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZY29uZmlnLmFkZHJlc3MgKTsKKworICAgICAgLy8gd2hhdCBpcyB0aGUgUENJIGJ1cyB3aWR0aD8KKyAgICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKCBjcHFmY0hCQWRhdGEtPlBjaURldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MywgLy8gUENJTUNUUiBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJCdWZmKTsKKyAgICAgIAorICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuUENJTUNUUiA9IGJCdWZmOworCisgICAgICAvLyBzZXQgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBjaGlwIG9uIHRoZSBjaXJjdWl0IGJvYXJkCisKKyAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZc3RhdHVzLnZhbHVlID0KKyAgICAgICAgcmVhZGwoIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZc3RhdHVzLmFkZHJlc3MpOworICAgICAgCisgICAgICB7CisvLyBOb3cgdGhhdCB3ZSBhcmUgc3VwcG9ydGluZyBtdWx0aXBsZSBib2FyZHMsIHdlIG5lZWQgdG8gY2hhbmdlCisvLyB0aGlzIGxvZ2ljIHRvIGNoZWNrIGZvciBQQ0kgdmVuZG9yL2RldmljZSBJRHMuLi4KKy8vIGZvciBub3csIHF1aWNrICYgZGlydHkgaXMgc2ltcGx5IGNoZWNraW5nIENoaXAgcmV2CisJCisJVUxPTkcgUmV2SWQgPSAoZmNDaGlwLT5SZWdpc3RlcnMuVFlzdGF0dXMudmFsdWUgJjB4M0UwKT4+NTsKKwlVQ0hBUiBNaW5vciA9IChVQ0hBUikoUmV2SWQgJiAweDMpOworCVVDSEFSIE1ham9yID0gKFVDSEFSKSgoUmV2SWQgJiAweDFDKSA+PjIpOworICAKKwkvKiBwcmludGsoIiAgSEJBIFRhY2h5b24gUmV2SWQgJWQuJWRcbiIsIE1ham9yLCBNaW5vcik7ICovCisgIAlpZiggKE1ham9yID09IDEpICYmIChNaW5vciA9PSAyKSApCisgICAgICAgIHsKKwkgIHNwcmludGYoIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLk5hbWUsIFNUQUNITElURTY2X1RTMTIpOworCisJfQorCWVsc2UgaWYoIChNYWpvciA9PSAxKSAmJiAoTWlub3IgPT0gMykgKQorICAgICAgICB7CisJICBzcHJpbnRmKCBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5OYW1lLCBTVEFDSExJVEU2Nl9UUzEzKTsKKwl9CisJZWxzZSBpZiggKE1ham9yID09IDIpICYmIChNaW5vciA9PSAxKSApCisgICAgICAgIHsKKwkgIHNwcmludGYoIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLk5hbWUsIFNBR0lMRU5UX1hMMl8yMSk7CisJfQorCWVsc2UKKwkgIHNwcmludGYoIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLk5hbWUsIFNUQUNITElURV9VTktOT1dOKTsKKyAgICAgIH0KKworCisKKyAgICBjYXNlIDM6ICAgICAgIC8vIGFsbG9jYXRlIG1lbSwgc2V0IFRhY2h5b24gUXVlIHJlZ2lzdGVycworICAgICAgaVN0YXR1cyA9IENwcVRzQ3JlYXRlVGFjaExpdGVRdWVzKCBjcHFmY0hCQWRhdGEsIG9wY29kZTIpOworCisgICAgICBpZiggaVN0YXR1cyApCisgICAgICAgIGJyZWFrOworCisgICAgICAvLyBub3cgdGhhdCB0aGUgUXVldWVzIGV4aXN0LCBUYWNoIGNhbiBETUEgdG8gdGhlbSwgc28KKyAgICAgIC8vIHdlIGNhbiBiZWdpbiBwcm9jZXNzaW5nIElOVHMKKyAgICAgIC8vIElOVEVOIHJlZ2lzdGVyIC0gZW5hYmxlIElOVCAoVGFjaExpdGUgaW50ZXJydXB0KQorICAgICAgd3JpdGViKCAweDFGLCBmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBJSU5URU4pOworCisJLy8gRmFsbCB0aHJvdWdoCisgICAgY2FzZSA0OiAgICAgICAvLyBDb25maWcgRmFtZSBNYW5hZ2VyLCBJbml0IExvb3AgQ29tbWFuZCwgbGFzZXIgb24KKworICAgICAgICAgICAgICAgICAvLyBMX1BPUlQgb3IgbG9vcGJhY2sKKyAgICAgICAgICAgICAgICAgLy8gZGVwZW5kaW5nIG9uIE9wdGlvbnMKKyAgICAgIGlTdGF0dXMgPSBDcHFUc0luaXRpYWxpemVGcmFtZU1hbmFnZXIoIGZjQ2hpcCwwICk7CisgICAgICBpZiggaVN0YXR1cyApCisgICAgICB7CisgICAgICAgICAgIC8vIGZhaWxlZCB0byBpbml0aWFsaXplIEZyYW1lIE1hbmFnZXIKKwkgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBMRUFWRSgiSW5pdGlhbGl6ZVRhY2hMaXRlIik7CisgIAorICByZXR1cm4gaVN0YXR1czsKK30KKworCisKKworLy8gRGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHBsYXRmb3JtIG1lbW9yeSBhbGxvY2F0aW9uIChlLmcuIGR5bmFtaWMpLAorLy8gaXQncyBwcm9iYWJseSBiZXN0IHRvIGZyZWUgbWVtb3J5IGluIG9wcG9zaXRlIG9yZGVyIGFzIGl0IHdhcyBhbGxvY2F0ZWQuCisvLyBPcmRlciBvZiBhbGxvY2F0aW9uOiBzZWUgb3RoZXIgZnVuY3Rpb24KKworCitpbnQgQ3BxVHNEZXN0cm95VGFjaExpdGVRdWVzKCB2b2lkICpwSEJBLCBpbnQgb3Bjb2RlKQoreworICBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhID0gKENQUUZDSEJBKilwSEJBOworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisgIFVTSE9SVCBpLCBpU3RhdHVzPTA7CisgIHZvaWQqIHZQdHI7ICAvLyBtZW0gQWxpZ24gbWFuYWdlciBzZXRzIHRoaXMgdG8gdGhlIGZyZWVkIGFkZHJlc3Mgb24gc3VjY2VzcworICB1bnNpZ25lZCBsb25nIHVsUHRyOyAgLy8gZm9yIDY0LWJpdCBwb2ludGVyIGNhc3QgKGUuZy4gQWxwYSBtYWNoaW5lKQorICBGQ19FWENIQU5HRVMgKkV4Y2hhbmdlcyA9IGZjQ2hpcC0+RXhjaGFuZ2VzOworICBQU0dQQUdFUyBqLCBuZXh0OworCisgIEVOVEVSKCJEZXN0cm95VGFjaExpdGVRdWVzIik7CisKKyAgaWYoIGZjQ2hpcC0+U0VTVCApCisgIHsKKyAgICAgICAgICAgICAgICAvLyBzZWFyY2ggb3V0IGFuZCBmcmVlIFBvb2wgZm9yIEV4dGVuZGVkIFMvRyBsaXN0IHBhZ2VzCisKKyAgICBmb3IoIGk9MDsgaSA8IFRBQ0hfU0VTVF9MRU47IGkrKykgIC8vIGZvciBlYWNoIGV4Y2hhbmdlCisgICAgeworICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IGV4dGVuZGVkIFMvRyBwYWdlcyB3ZXJlIGFsbG9jYXRlZCwgbWFwcGVkLCBhbmQKKyAgICAgIC8vIG5vdCBjbGVhcmVkIGR1ZSB0byBlcnJvciBjb25kaXRpb25zIG9yIE8vUyBkcml2ZXIgdGVybWluYXRpb24uCisgICAgICAvLyBNYWtlIHN1cmUgdGhleSdyZSBhbGwgZ29uZS4KKyAgICAgIGlmIChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbaV0uQ21uZCAhPSBOVUxMKSAKKyAgICAgIAljcHFmY19wY2lfdW5tYXAoY3BxZmNIQkFkYXRhLT5QY2lEZXYsIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS5DbW5kLCAKKwkJCWZjQ2hpcCwgaSk7IC8vIHVuZG8gRE1BIG1hcHBpbmdzLgorCisgICAgICBmb3IgKGo9ZmNDaGlwLT5TRVNULT5zZ1BhZ2VzW2ldIDsgaiAhPSBOVUxMIDsgaiA9IG5leHQpIHsKKwkJbmV4dCA9IGotPm5leHQ7CisJCWtmcmVlKGopOworICAgICAgfQorICAgICAgZmNDaGlwLT5TRVNULT5zZ1BhZ2VzW2ldID0gTlVMTDsKKyAgICB9CisgICAgdWxQdHIgPSAodW5zaWduZWQgbG9uZylmY0NoaXAtPlNFU1Q7CisgICAgdlB0ciA9IGZjTWVtTWFuYWdlciggY3BxZmNIQkFkYXRhLT5QY2lEZXYsIAorCQkgICAgJmNwcWZjSEJBZGF0YS0+ZHluYW1pY19tZW1bMF0sCisJCSAgICAwLDAsIChVTE9ORyl1bFB0ciwgTlVMTCApOyAvLyAnZnJlZScgbWVtCisgICAgZmNDaGlwLT5TRVNUID0gMEw7ICAvLyBudWxsIGludmFsaWQgcHRyCisgICAgaWYoICF2UHRyICkKKyAgICB7CisgICAgICBwcmludGsoIlNFU1QgbWVtIG5vdCBmcmVlZFxuIik7CisgICAgICBpU3RhdHVzID0gLTE7CisgICAgfQorICB9CisKKyAgaWYoIGZjQ2hpcC0+U0ZRICkKKyAgeworCisgICAgdWxQdHIgPSAodW5zaWduZWQgbG9uZylmY0NoaXAtPlNGUTsKKyAgICB2UHRyID0gZmNNZW1NYW5hZ2VyKCBjcHFmY0hCQWRhdGEtPlBjaURldiwgCisJCSAgICAmY3BxZmNIQkFkYXRhLT5keW5hbWljX21lbVswXSwKKwkJICAgIDAsMCwgKFVMT05HKXVsUHRyLCBOVUxMICk7IC8vICdmcmVlJyBtZW0KKyAgICBmY0NoaXAtPlNGUSA9IDBMOyAgLy8gbnVsbCBpbnZhbGlkIHB0cgorICAgIGlmKCAhdlB0ciApCisgICAgeworICAgICAgcHJpbnRrKCJTRlEgbWVtIG5vdCBmcmVlZFxuIik7CisgICAgICBpU3RhdHVzID0gLTI7CisgICAgfQorICB9CisKKworICBpZiggZmNDaGlwLT5JTVEgKQorICB7CisgICAgICAvLyBjbGVhciBJbmRleGVzIHRvIHNob3cgZW1wdHkgUXVldWUKKyAgICBmY0NoaXAtPklNUS0+cHJvZHVjZXJJbmRleCA9IDA7CisgICAgZmNDaGlwLT5JTVEtPmNvbnN1bWVySW5kZXggPSAwOworCisgICAgdWxQdHIgPSAodW5zaWduZWQgbG9uZylmY0NoaXAtPklNUTsKKyAgICB2UHRyID0gZmNNZW1NYW5hZ2VyKCBjcHFmY0hCQWRhdGEtPlBjaURldiwgJmNwcWZjSEJBZGF0YS0+ZHluYW1pY19tZW1bMF0sCisJCSAgICAwLDAsIChVTE9ORyl1bFB0ciwgTlVMTCApOyAvLyAnZnJlZScgbWVtCisgICAgZmNDaGlwLT5JTVEgPSAwTDsgIC8vIG51bGwgaW52YWxpZCBwdHIKKyAgICBpZiggIXZQdHIgKQorICAgIHsKKyAgICAgIHByaW50aygiSU1RIG1lbSBub3QgZnJlZWRcbiIpOworICAgICAgaVN0YXR1cyA9IC0zOworICAgIH0KKyAgfQorCisgIGlmKCBmY0NoaXAtPkVSUSApICAgICAgICAgLy8gcmVsZWFzZSBtZW1vcnkgYmxvY2tzIHVzZWQgYnkgdGhlIHF1ZXVlcworICB7CisgICAgdWxQdHIgPSAodW5zaWduZWQgbG9uZylmY0NoaXAtPkVSUTsKKyAgICB2UHRyID0gZmNNZW1NYW5hZ2VyKCBjcHFmY0hCQWRhdGEtPlBjaURldiwgJmNwcWZjSEJBZGF0YS0+ZHluYW1pY19tZW1bMF0sCisJCSAgICAwLDAsIChVTE9ORyl1bFB0ciwgTlVMTCApOyAvLyAnZnJlZScgbWVtCisgICAgZmNDaGlwLT5FUlEgPSAwTDsgIC8vIG51bGwgaW52YWxpZCBwdHIKKyAgICBpZiggIXZQdHIgKQorICAgIHsKKyAgICAgIHByaW50aygiRVJRIG1lbSBub3QgZnJlZWRcbiIpOworICAgICAgaVN0YXR1cyA9IC00OworICAgIH0KKyAgfQorICAgIAorICAvLyBmcmVlIHVwIHRoZSBwcmltYXJ5IEVYQ0hBTkdFUyBzdHJ1Y3QgYW5kIExpbmsgUQorICBjcHFmY19mcmVlX2RtYV9jb25zaXN0ZW50KGNwcWZjSEJBZGF0YSk7CisgIAorICBMRUFWRSgiRGVzdHJveVRhY2hMaXRlUXVlcyIpOworICAKKyAgcmV0dXJuIGlTdGF0dXM7ICAgICAvLyBub24temVybyAoZmFpbGVkKSBpZiBhbnkgbWVtb3J5IG5vdCBmcmVlZAorfQorCisKKworCisKKy8vIFRoZSBTRlEgaXMgYW4gYXJyYXkgd2l0aCBTRlFfTEVOIGxlbmd0aCwgZWFjaCBlbGVtZW50IChRRW50cnkpCisvLyB3aXRoIGVpZ2h0IDMyLWJpdCB3b3Jkcy4gIFRhY2hMaXRlIHBsYWNlcyBpbmNvbWluZyBGQyBmcmFtZXMgKGkuZS4KKy8vIGEgdmFsaWQgRkMgZnJhbWUgd2l0aCBvdXIgQUxfUEEgKSBpbiBjb250aWd1b3VzIFNGUSBlbnRyaWVzCisvLyBhbmQgc2VuZHMgYSBjb21wbGV0aW9uIG1lc3NhZ2UgdGVsbGluZyB0aGUgaG9zdCB3aGVyZSB0aGUgZnJhbWUgaXMKKy8vIGluIHRoZSBxdWUuCisvLyBUaGlzIGZ1bmN0aW9uIGNvcGllcyB0aGUgY3VycmVudCAob3Igb2xkZXN0IG5vdC15ZXQtcHJvY2Vzc2VkKSBRRW50cnkgdG8KKy8vIGEgY2FsbGVyJ3MgY29udGlndW91cyBidWZmZXIgYW5kIHVwZGF0ZXMgdGhlIFRhY2h5b24gY2hpcCdzIGNvbnN1bWVyIGluZGV4CisvLworLy8gTk9URToKKy8vICAgQW4gRkMgZnJhbWUgbWF5IGNvbnN1bWUgb25lIG9yIG1hbnkgU0ZRIGVudHJpZXMuICBXZSBrbm93IHRoZSB0b3RhbAorLy8gICBsZW5ndGggZnJvbSB0aGUgY29tcGxldGlvbiBtZXNzYWdlLiAgVGhlIGNhbGxlciBwYXNzZXMgYSBidWZmZXIgbGFyZ2UKKy8vICAgZW5vdWdoIGZvciB0aGUgY29tcGxldGUgbWVzc2FnZSAobWF4IDJrKS4KKworc3RhdGljIHZvaWQgQ3BxVHNHZXRTRlFFbnRyeSgKKyAgICAgICAgIFBUQUNIWU9OIGZjQ2hpcCwKKyAgICAgICAgIFVTSE9SVCBwcm9kdWNlck5keCwKKyAgICAgICAgIFVMT05HICp1bERlc3RQdHIsICAgICAgICAgICAgLy8gY29udGlndW91cyBkZXN0aW5hdGlvbiBidWZmZXIKKwkgQk9PTEVBTiBVcGRhdGVDaGlwKQoreworICBVTE9ORyB0b3RhbF9ieXRlcz0wOworICBVTE9ORyBjb25zdW1lckluZGV4ID0gZmNDaGlwLT5TRlEtPmNvbnN1bWVySW5kZXg7CisgIAorCQkJCS8vIGNoZWNrIHBhc3NlZCBjb3B5IG9mIFNGUSBwcm9kdWNlciBpbmRleCAtCisJCQkJLy8gaXMgYSBuZXcgbWVzc2FnZSB3YWl0aW5nIGZvciB1cz8KKwkJCQkvLyBlcXVhbCBpbmRleGVzIG1lYW5zIFNGUyBpcyBjb3BpZWQKKworICB3aGlsZSggcHJvZHVjZXJOZHggIT0gY29uc3VtZXJJbmRleCApCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gcHJvY2VzcyBtZXNzYWdlCisgICAgdG90YWxfYnl0ZXMgKz0gNjQ7ICAgLy8gbWFpbnRhaW4gY291bnQgdG8gcHJldmVudCB3cml0aW5nIHBhc3QgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgY29waWVzIG92ZXIgRmlicmUgQ2hhbm5lbCBkZWZpbmVkIGxlbmd0aCEKKyAgICBpZiggdG90YWxfYnl0ZXMgPD0gMjA0OCApCisgICAgeworICAgICAgbWVtY3B5KCB1bERlc3RQdHIsIAorICAgICAgICAgICAgICAmZmNDaGlwLT5TRlEtPlFFbnRyeVtjb25zdW1lckluZGV4XSwKKyAgICAgICAgICAgICAgNjQgKTsgIC8vIGVhY2ggU0ZRIGVudHJ5IGlzIDY0IGJ5dGVzCisgICAgICB1bERlc3RQdHIgKz0gMTY7ICAgLy8gYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgNjQgYnl0ZSBibG9jaworICAgIH0KKwkJICAgICAgICAgLy8gVGFjaHlvbiBpcyBwcm9kdWNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHdlIGFyZSBjb25zdW1pbmcKKworICAgIGlmKCArK2NvbnN1bWVySW5kZXggPj0gU0ZRX0xFTikvLyBjaGVjayBmb3Igcm9sbG92ZXIKKyAgICAgIGNvbnN1bWVySW5kZXggPSAwTDsgICAgICAgIC8vIHJlc2V0IGl0CisgIH0KKworICAvLyBpZiBzcGVjaWZpZWQsIHVwZGF0ZSB0aGUgVGFjaGxpdGUgY2hpcCBDb25zdW1lckluZGV4Li4uCisgIGlmKCBVcGRhdGVDaGlwICkKKyAgeworICAgIGZjQ2hpcC0+U0ZRLT5jb25zdW1lckluZGV4ID0gY29uc3VtZXJJbmRleDsKKyAgICB3cml0ZWwoIGZjQ2hpcC0+U0ZRLT5jb25zdW1lckluZGV4LAorICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuU0ZRY29uc3VtZXJJbmRleC5hZGRyZXNzKTsKKyAgfQorfQorCisKKworLy8gVGFjaExpdGUgcm91dGluZWx5IGZyZWV6ZXMgaXQncyBjb3JlIHF1ZXMgLSBPdXRib3VuZCBGSUZPLCBJbmJvdW5kIEZJRk8sCisvLyBhbmQgRXhjaGFuZ2UgUmVxdWVzdCBRdWV1ZSAoRVJRKSBvbiBlcnJvciByZWNvdmVyIC0gCisvLyAoZS5nLiB3aGVuZXZlciBhIExJUCBvY2N1cnMpLiAgSGVyZQorLy8gd2Ugcm91dGluZWx5IFJFU1VNRSBieSBjbGVhcmluZyB0aGVzZSBiaXRzLCBidXQgb25seSBpZiB0aGUgbG9vcCBpcyB1cAorLy8gdG8gYXZvaWQgRVJST1IgSURMRSBtZXNzYWdlcyBmb3JldmVyLgorCit2b2lkIENwcVRzVW5GcmVlemVUYWNobGl0ZSggdm9pZCAqcENoaXAsIGludCB0eXBlICkKK3sKKyAgUFRBQ0hZT04gZmNDaGlwID0gKFBUQUNIWU9OKXBDaGlwOworICBmY0NoaXAtPlJlZ2lzdGVycy5UWWNvbnRyb2wudmFsdWUgPSAKKyAgICByZWFkbChmY0NoaXAtPlJlZ2lzdGVycy5UWWNvbnRyb2wuYWRkcmVzcyk7CisgICAgICAgICAgICAKKyAgLy8gKGJpdCA0IG9mIHZhbHVlIGlzIEdCSUMgTEFTRVIpCisgIC8vIGlmIHdlICd1bmZyZWV6ZScgdGhlIGNvcmUgbWFjaGluZXMgYmVmb3JlIHRoZSBsb29wIGlzIGhlYWx0aHkKKyAgLy8gKGkuZS4gRkxULCBPUywgTFMgZmFpbHVyZSBiaXRzIHNldCBpbiBGTXN0YXR1cykKKyAgLy8gd2UgY2FuIGdldCAnZXJyb3IgaWRsZScgbWVzc2FnZXMgZm9yZXZlci4gIFZlcmlmeSB0aGF0CisgIC8vIEZNc3RhdHVzIChMaW5rIFN0YXR1cykgaXMgT0sgYmVmb3JlIHVuZnJlZXppbmcuCisKKyAgaWYoICEoZmNDaGlwLT5SZWdpc3RlcnMuRk1zdGF0dXMudmFsdWUgJiAweDA3MDAwMDAwTCkgJiYgLy8gYml0cyBjbGVhcj8KKyAgICAgICEoZmNDaGlwLT5SZWdpc3RlcnMuRk1zdGF0dXMudmFsdWUgJiAweDgwICApKSAgLy8gQWN0aXZlIExQU00/CisgIHsKKyAgICBmY0NoaXAtPlJlZ2lzdGVycy5UWWNvbnRyb2wudmFsdWUgJj0gIH4weDMwMEw7IC8vIGNsZWFyIEZFUSwgRkZBCisgICAgaWYoIHR5cGUgPT0gMSApICAvLyB1bmZyZWV6ZSBFUlEgb25seQorICAgIHsKKy8vICAgICAgcHJpbnRrKCJVbmZyZWV6aW5nIEVSUVxuIik7CisgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5UWWNvbnRyb2wudmFsdWUgfD0gMHgxMDAwMEw7IC8vIHNldCBSRVEKKyAgICB9CisgICAgZWxzZSAgICAgICAgICAgICAvLyB1bmZyZWV6ZSBib3RoIEVSUSBhbmQgRkNQLUFTU0lTVCAoU0VTVCkKKyAgICB7CisvLyAgICAgIHByaW50aygiVW5mcmVlemluZyBFUlEgJiBGQ1AtQVNTSVNUXG4iKTsKKworICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IFJPRiwgUklGLCBSRVEgLSByZXN1bWUgT3V0Ym91bmQgRkNQLCBJbmJuZCBGQ1AsIEVSUQorICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuVFljb250cm9sLnZhbHVlIHw9IDB4NzAwMDBMOyAvLyBzZXQgUk9GLCBSSUYsIFJFUQorICAgIH0KKworICAgIHdyaXRlbCggZmNDaGlwLT5SZWdpc3RlcnMuVFljb250cm9sLnZhbHVlLAorICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuVFljb250cm9sLmFkZHJlc3MpOworICAgICAgICAgICAgICAKKyAgfQorICAgICAgICAgIC8vIHJlYWRiYWNrIGZvciB2ZXJpZnkgKFRhY2hMaXRlIHN0aWxsIGZyb3plbj8pCisgIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZc3RhdHVzLnZhbHVlID0gCisgICAgcmVhZGwoZmNDaGlwLT5SZWdpc3RlcnMuVFlzdGF0dXMuYWRkcmVzcyk7Cit9CisKKworLy8gV2hlbmV2ZXIgYW4gRkMgRXhjaGFuZ2UgQWJvcnQgaXMgcmVxdWlyZWQsIHdlIG11c3QgbWFuaXB1bGF0ZSB0aGUKKy8vIEhvc3QvVGFjaHlvbiBzaGFyZWQgbWVtb3J5IFNFU1QgdGFibGUuICBCZWZvcmUgZG9pbmcgdGhpcywgd2UKKy8vIG11c3QgZnJlZXplIFRhY2h5b24sIHdoaWNoIGZsdXNoZXMgY2VydGFpbiBidWZmZXJzIGFuZCBlbnN1cmUgd2UKKy8vIGNhbiBtYW5pcHVsYXRlIHRoZSBTRVNUIHdpdGhvdXQgY29udGVudGlvbi4KKy8vIFRoaXMgZnJlZXplIGZ1bmN0aW9uIHdpbGwgcmVzdWx0IGluIEZDUCAmIEVSUSBGUk9aRU4gY29tcGxldGlvbgorLy8gbWVzc2FnZXMgKHBlciBhcmd1bWVudCAidHlwZSIpLgorCit2b2lkIENwcVRzRnJlZXplVGFjaGxpdGUoIHZvaWQgKnBDaGlwLCBpbnQgdHlwZSApCit7CisgIFBUQUNIWU9OIGZjQ2hpcCA9IChQVEFDSFlPTilwQ2hpcDsKKyAgZmNDaGlwLT5SZWdpc3RlcnMuVFljb250cm9sLnZhbHVlID0gCisgICAgcmVhZGwoZmNDaGlwLT5SZWdpc3RlcnMuVFljb250cm9sLmFkZHJlc3MpOworICAgIAorICAgICAgICAgICAgICAgICAgICAgLy9zZXQgRkZBLCBGRVEgLSBmcmVlemVzIFNDU0kgYXNzaXN0IGFuZCBFUlEKKyAgaWYoIHR5cGUgPT0gMSkgICAgLy8gZnJlZXplIEVSUSBvbmx5CisgICAgZmNDaGlwLT5SZWdpc3RlcnMuVFljb250cm9sLnZhbHVlIHw9IDB4MTAwTDsgLy8gKGJpdCA0IGlzIGxhc2VyKQorICBlbHNlICAgICAgICAgICAgICAvLyBmcmVlemUgYm90aCBGQ1AgYXNzaXN0cyAoU0VTVCkgYW5kIEVSUQorICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZY29udHJvbC52YWx1ZSB8PSAweDMwMEw7IC8vIChiaXQgNCBpcyBsYXNlcikKKyAgCisgIHdyaXRlbCggZmNDaGlwLT5SZWdpc3RlcnMuVFljb250cm9sLnZhbHVlLAorICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZY29udHJvbC5hZGRyZXNzKTsKKyAgICAgICAgICAgICAgCit9CisKKworCisKKy8vIFRMIGhhcyB0d28gRnJhbWUgTWFuYWdlciBMaW5rIFN0YXR1cyBSZWdpc3RlcnMsIHdpdGggdGhyZWUgOC1iaXQKKy8vIGZpZWxkcyBlYWNoLiBUaGVzZSBlaWdodCBiaXQgY291bnRlcnMgYXJlIGNsZWFyZWQgYWZ0ZXIgZWFjaCByZWFkLAorLy8gc28gd2UgZGVmaW5lIHNpeCAzMi1iaXQgYWNjdW11bGF0b3JzIGZvciB0aGVzZSBUTCBjb3VudGVycy4gVGhpcworLy8gZnVuY3Rpb24gYnJlYWtzIG91dCBlYWNoIDgtYml0IGZpZWxkIGFuZCBhZGRzIHRoZSB2YWx1ZSB0byB0aGUgZXhpc3RpbmcKKy8vIHN1bS4gIChzL3cgY291bnRlcnMgY2xlYXJlZCBpbmRlcGVuZGVudGx5KQorCit2b2lkIGZjUGFyc2VMaW5rU3RhdHVzQ291bnRlcnMoUFRBQ0hZT04gZmNDaGlwKQoreworICBVQ0hBUiBiQnVmZjsKKyAgVUxPTkcgdWxCdWZmOworCisKKy8vIFRoZSBCQjAgdGltZXIgdXN1YWxseSBpbmNyZW1lbnRzIHdoZW4gVEwgaXMgaW5pdGlhbGl6ZWQsIHJlc3VsdGluZworLy8gaW4gYW4gaW5pdGlhbGx5IGJvZ3VzIGNvdW50LiAgSWYgb3VyIG93biBjb3VudGVyIGlzIFpFUk8sIGl0IG1lYW5zIHdlCisvLyBhcmUgcmVhZGluZyB0aGlzIHRoaW5nIGZvciB0aGUgZmlyc3QgdGltZSwgc28gd2UgaWdub3JlIHRoZSBmaXJzdCBjb3VudC4KKy8vIEFsc28sIHJlYWRpbmcgdGhlIHJlZ2lzdGVyIGRvZXMgbm90IGNsZWFyIGl0LCBzbyB3ZSBoYXZlIHRvIGtlZXAgYW4KKy8vIGFkZGl0aW9uYWwgc3RhdGljIGNvdW50ZXIgdG8gZGV0ZWN0IHJvbGxvdmVyICh5dWspLgorCisgIGlmKCBmY0NoaXAtPmZjU3RhdHMubGFzdEJCMHRpbWVyID09IDBMKSAgLy8gVEwgd2FzIHJlc2V0PyAoaWdub3JlIDFzdCB2YWx1ZXMpCisgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBUTCdzIHJlZ2lzdGVyIGNvdW50ZXIgLSB0aGUgImxhc3QiIGNvdW50CisgICAgZmNDaGlwLT5mY1N0YXRzLmxhc3RCQjB0aW1lciA9IAorICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuRk1CQl9DcmVkaXRaZXJvLnZhbHVlICYgMHgwMGZmZmZmZkw7CisgIH0KKyAgZWxzZSAgLy8gc3Vic2VxdWVudCBwYXNzIC0gY2hlY2sgZm9yIHJvbGxvdmVyCisgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICJ0aGlzIiBjb3VudAorICAgIHVsQnVmZiA9IGZjQ2hpcC0+UmVnaXN0ZXJzLkZNQkJfQ3JlZGl0WmVyby52YWx1ZSAmIDB4MDBmZmZmZmZMOworICAgIGlmKCBmY0NoaXAtPmZjU3RhdHMubGFzdEJCMHRpbWVyID4gdWxCdWZmICkgLy8gcm9sbG92ZXIgaGFwcGVuZWQKKyAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdW50ZXIgYWR2YW5jZWQgdG8gbWF4Li4uCisgICAgICBmY0NoaXAtPmZjU3RhdHMuQkIwX1RpbWVyICs9ICgweDAwRkZGRkZGTCAtIGZjQ2hpcC0+ZmNTdGF0cy5sYXN0QkIwdGltZXIpOworICAgICAgZmNDaGlwLT5mY1N0YXRzLkJCMF9UaW1lciArPSB1bEJ1ZmY7ICAvLyBwbHVzIHNvbWUgbW9yZQorCisKKyAgICB9CisgICAgZWxzZSAvLyBubyByb2xsb3ZlciAtLSBtb3JlIGNvdW50cyBvciBubyBjaGFuZ2UKKyAgICB7CisgICAgICBmY0NoaXAtPmZjU3RhdHMuQkIwX1RpbWVyICs9ICAodWxCdWZmIC0gZmNDaGlwLT5mY1N0YXRzLmxhc3RCQjB0aW1lcik7CisKKyAgICB9CisKKyAgICBmY0NoaXAtPmZjU3RhdHMubGFzdEJCMHRpbWVyID0gdWxCdWZmOworICB9CisKKworCisgIGJCdWZmID0gKFVDSEFSKShmY0NoaXAtPlJlZ2lzdGVycy5GTUxpbmtTdGF0dXMxLnZhbHVlID4+IDI0KTsKKyAgZmNDaGlwLT5mY1N0YXRzLkxvc3NvZlNpZ25hbCArPSBiQnVmZjsKKworICBiQnVmZiA9IChVQ0hBUikoZmNDaGlwLT5SZWdpc3RlcnMuRk1MaW5rU3RhdHVzMS52YWx1ZSA+PiAxNik7CisgIGZjQ2hpcC0+ZmNTdGF0cy5CYWRSWENoYXIgKz0gYkJ1ZmY7CisKKyAgYkJ1ZmYgPSAoVUNIQVIpKGZjQ2hpcC0+UmVnaXN0ZXJzLkZNTGlua1N0YXR1czEudmFsdWUgPj4gOCk7CisgIGZjQ2hpcC0+ZmNTdGF0cy5Mb3Nzb2ZTeW5jICs9IGJCdWZmOworCisKKyAgYkJ1ZmYgPSAoVUNIQVIpKGZjQ2hpcC0+UmVnaXN0ZXJzLkZNTGlua1N0YXR1czIudmFsdWUgPj4gMjQpOworICBmY0NoaXAtPmZjU3RhdHMuUnhfRU9GYSArPSBiQnVmZjsKKworICBiQnVmZiA9IChVQ0hBUikoZmNDaGlwLT5SZWdpc3RlcnMuRk1MaW5rU3RhdHVzMi52YWx1ZSA+PiAxNik7CisgIGZjQ2hpcC0+ZmNTdGF0cy5EaXNfRnJtICs9IGJCdWZmOworCisgIGJCdWZmID0gKFVDSEFSKShmY0NoaXAtPlJlZ2lzdGVycy5GTUxpbmtTdGF0dXMyLnZhbHVlID4+IDgpOworICBmY0NoaXAtPmZjU3RhdHMuQmFkX0NSQyArPSBiQnVmZjsKK30KKworCit2b2lkIGNwcWZjVFNDbGVhckxpbmtTdGF0dXNDb3VudGVycyhQVEFDSFlPTiBmY0NoaXApCit7CisgIEVOVEVSKCJDbGVhckxpbmtTdGF0dXNDb3VudGVycyIpOworICBtZW1zZXQoICZmY0NoaXAtPmZjU3RhdHMsIDAsIHNpemVvZiggRkNTVEFUUykpOworICBMRUFWRSgiQ2xlYXJMaW5rU3RhdHVzQ291bnRlcnMiKTsKKworfQorCisKKworCisvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHJlYWRzIHRoZSBJMkMgaGFyZHdhcmUgdG8gZ2V0IHRoZSBhZGFwdGVyJ3MKKy8vIFdvcmxkIFdpZGUgTmFtZSAoV1dOKS4KKy8vIElmIHRoZSBXV04gaXMgIjUwMDgwNWYxZmFkYjQzZTgiIChhcyBwcmludGVkIG9uIHRoZSBjYXJkKSwgdGhlCisvLyBUYWNoeW9uIFdXTl9oaSAoMzItYml0KSByZWdpc3RlciBpcyA1MDA4MDVmMSwgYW5kIFdXTl9sbyByZWdpc3RlcgorLy8gaXMgZmFkYjQzZTguCisvLyBJbiB0aGUgTlZSQU0sIHRoZSBieXRlcyBhcHBlYXIgYXM6CisvLyBbMmRdIC4uCisvLyBbMmVdIC4uIAorLy8gWzJmXSA1MAorLy8gWzMwXSAwOAorLy8gWzMxXSAwNQorLy8gWzMyXSBmMQorLy8gWzMzXSBmYQorLy8gWzM0XSBkYgorLy8gWzM1XSA0MworLy8gWzM2XSBlOAorLy8KKy8vIEluIHRoZSBGaWJyZSBDaGFubmVsIChCaWcgRW5kaWFuKSBmb3JtYXQsIHRoZSBGQy1BTCBMSVNNIGZyYW1lIHdpbGwKKy8vIGJlIGNvcnJlY3RseSBsb2FkZWQgYnkgVGFjaHlvbiBzaWxpY29uLiAgSW4gdGhlIGxvZ2luIHBheWxvYWQsIGJ5dGVzCisvLyBtdXN0IGJlIGNvcnJlY3RseSBzd2FwcGVkIGZvciBCaWcgRW5kaWFuIGZvcm1hdC4KKworaW50IENwcVRzUmVhZFdyaXRlV1dOKCBQVk9JRCBwQ2hpcCwgaW50IFJlYWQpCit7CisgIFBUQUNIWU9OIGZjQ2hpcCA9IChQVEFDSFlPTilwQ2hpcDsKKyNkZWZpbmUgTlZSQU1fU0laRSA1MTIKKyAgdW5zaWduZWQgc2hvcnQgaSwgY291bnQgPSBOVlJBTV9TSVpFOworICBVQ0hBUiBudlJhbVtOVlJBTV9TSVpFXSwgV1dOYnVmWzhdOworICBVTE9ORyB1bEJ1ZmY7CisgIGludCBpU3RhdHVzPS0xOyAgLy8gYXNzdW1lIGZhaWx1cmUKKyAgaW50IFdXTm9mZnNldDsKKworICBFTlRFUigiUmVhZFdyaXRlV1dOIik7CisgIC8vIE5vdyB0cnkgdG8gcmVhZCB0aGUgV1dOIGZyb20gdGhlIGFkYXB0ZXIncyBOVlJBTQorCisgIGlmKCBSZWFkICkgIC8vIFJFQURpbmcgTlZSQU0gV1dOPworICB7CisgICAgdWxCdWZmID0gY3BxZmNUU19SZWFkTlZSQU0oIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZc3RhdHVzLmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5UWWNvbnRyb2wuYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LCAmbnZSYW1bMF0gKTsKKworICAgIGlmKCB1bEJ1ZmYgKSAgIC8vIE5WUkFNIHJlYWQgc3VjY2Vzc2Z1bD8KKyAgICB7CisgICAgICBpU3RhdHVzID0gMDsgLy8gc3VjY2VzcyEKKyAgICAgIAorICAgICAgICAgICAgICAgICAgIC8vIGZvciBlbmdpbmVlcmluZy8gcHJvdG90eXBlIGJvYXJkcywgdGhlIGRhdGEgbWF5IGJlCisgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZCAoR0lHTywgdXN1YWxseSBhbGwgIkZGIik7IHRoaXMgcHJldmVudHMgdGhlCisgICAgICAgICAgICAgICAgICAgLy8gcGFyc2Ugcm91dGluZSBmcm9tIHdvcmtpbmcgY29ycmVjdGx5LCB3aGljaCBtZWFucworICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgd2lsbCBiZSB3cml0dGVuIHRvIG91ciBwYXNzZWQgYnVmZmVyLgorCisgICAgICBXV05vZmZzZXQgPSBjcHFmY1RTX0dldE5WUkFNX2RhdGEoIFdXTmJ1ZiwgbnZSYW0gKTsKKworICAgICAgaWYoICFXV05vZmZzZXQgKSAvLyB1bmluaXRpYWxpemVkIE5WUkFNIC0tIGNvcHkgYnl0ZXMgZGlyZWN0bHkKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKCAiQ0FVVElPTjogQ29weWluZyBOVlJBTSBkYXRhIG9uIGZjQ2hpcFxuIik7CisgICAgICAgIGZvciggaT0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICBXV05idWZbaV0gPSBudlJhbVtpICsweDJmXTsgLy8gZGFuZ2Vyb3VzISBzb21lIGZvcm1hdHMgd29uJ3Qgd29yaworICAgICAgfQorICAgICAgCisgICAgICBmY0NoaXAtPlJlZ2lzdGVycy53d25faGkgPSAwTDsKKyAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLnd3bl9sbyA9IDBMOworICAgICAgZm9yKCBpPTA7IGk8NDsgaSsrKSAgLy8gV1dOIGJ5dGVzIGFyZSBiaWcgZW5kaWFuIGluIE5WUkFNCisgICAgICB7CisgICAgICAgIHVsQnVmZiA9IDBMOworICAgICAgICB1bEJ1ZmYgPSAoVUxPTkcpKFdXTmJ1ZltpXSkgPDwgKDggKiAoMy1pKSk7CisgICAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLnd3bl9oaSB8PSB1bEJ1ZmY7CisgICAgICB9CisgICAgICBmb3IoIGk9MDsgaTw0OyBpKyspICAvLyBXV04gYnl0ZXMgYXJlIGJpZyBlbmRpYW4gaW4gTlZSQU0KKyAgICAgIHsKKyAgICAgICAgdWxCdWZmID0gMEw7CisgICAgICAgIHVsQnVmZiA9IChVTE9ORykoV1dOYnVmW2krNF0pIDw8ICg4ICogKDMtaSkpOworICAgICAgICBmY0NoaXAtPlJlZ2lzdGVycy53d25fbG8gfD0gdWxCdWZmOworICAgICAgfQorICAgIH0gIC8vIGRvbmUgcmVhZGluZworICAgIGVsc2UKKyAgICB7CisKKyAgICAgIHByaW50ayggImNwcWZjVFM6IE5WUkFNIHJlYWQgZmFpbGVkXG4iKTsKKworICAgIH0KKyAgfQorCisgIGVsc2UgIC8vIFdSSVRFCisgIHsKKworICAgIC8vIE5PVEU6IFdSSVRFIG5vdCBzdXBwb3J0ZWQgJiBub3QgdXNlZCBpbiByZWxlYXNlZCBkcml2ZXIuCisKKyAgIAorICAgIHByaW50aygiUmVhZFdyaXRlTlJBTTogY2FuJ3Qgd3JpdGUgTlZSQU07IGFib3J0aW5nIHdyaXRlXG4iKTsKKyAgfQorICAKKyAgTEVBVkUoIlJlYWRXcml0ZVdXTiIpOworICByZXR1cm4gaVN0YXR1czsKK30KKworCisKKworCisvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHJlYWRzIG9yIHdyaXRlcyB0aGUgZW50aXJlICJOVlJBTSIgY29udGVudHMgb2YgCisvLyB0aGUgSTJDIGhhcmR3YXJlIChpLmUuIHRoZSBOTTI0QzAzKS4gIE5vdGUgdGhhdCBIUCdzIDUxMjFBIChUUyA2Nk1oeikKKy8vIGFkYXB0ZXIgZG9lcyBub3QgdXNlIHRoZSBOTTI0QzAzIGNoaXAsIHNvIHRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyBvbgorLy8gQ29tcGFxJ3MgYWRhcHRlcnMuCisKK2ludCBDcHFUc1JlYWRXcml0ZU5WUkFNKCBQVk9JRCBwQ2hpcCwgUFZPSUQgYnVmLCBpbnQgUmVhZCkKK3sKKyAgUFRBQ0hZT04gZmNDaGlwID0gKFBUQUNIWU9OKXBDaGlwOworI2RlZmluZSBOVlJBTV9TSVpFIDUxMgorICBVTE9ORyB1bEJ1ZmY7CisgIFVDSEFSICp1Y1B0ciA9IGJ1ZjsgLy8gY2FzdCBjYWxsZXIncyB2b2lkIHB0ciB0byBVQ0hBUiBhcnJheQorICBpbnQgaVN0YXR1cz0tMTsgIC8vIGFzc3VtZSBmYWlsdXJlCisKKyAgICAgCisgIGlmKCBSZWFkICkgIC8vIFJFQURpbmcgTlZSQU0/CisgIHsKKyAgICB1bEJ1ZmYgPSBjcHFmY1RTX1JlYWROVlJBTSggICAvLyBUUlVFIG9uIHN1Y2Nlc3MKKyAgICAgICAgICAgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5UWXN0YXR1cy5hZGRyZXNzLAorICAgICAgICAgICAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZY29udHJvbC5hZGRyZXNzLAorICAgICAgICAgICAgICAgIDI1NiwgICAgICAgICAgICAvLyBieXRlcyB0byB3cml0ZQorICAgICAgICAgICAgICAgIHVjUHRyICk7ICAgICAgICAvLyBzb3VyY2UgcHRyCisKKworICAgIGlmKCB1bEJ1ZmYgKQorICAgICAgaVN0YXR1cyA9IDA7IC8vIHN1Y2Nlc3MKKyAgICBlbHNlCisgICAgeworI2lmZGVmIERCRworICAgICAgcHJpbnRrKCAiQ0FVVElPTjogTlZSQU0gcmVhZCBmYWlsZWRcbiIpOworI2VuZGlmCisgICAgfQorICB9ICAvLyBkb25lIHJlYWRpbmcKKworICBlbHNlICAvLyBXUklUSU5HIE5WUkFNIAorICB7CisKKyAgICBwcmludGsoImNwcWZjVFM6IFdSSVRFIG9mIEZDIENvbnRyb2xsZXIncyBOVlJBTSBkaXNhYmxlZFxuIik7CisgIH0KKyAgICAKKyAgcmV0dXJuIGlTdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3BxZmNUU2kyYy5jIGIvZHJpdmVycy9zY3NpL2NwcWZjVFNpMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzhhNmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2NwcWZjVFNpMmMuYwpAQCAtMCwwICsxLDQ5MyBAQAorLyogQ29weXJpZ2h0KGMpIDIwMDAsIENvbXBhcSBDb21wdXRlciBDb3Jwb3JhdGlvbiAKKyAqIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlciAKKyAqIDY0LWJpdCwgNjZNSHogUENJIAorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIHRlc3RlZCBvbjoKKyAqIChmcm9udCk6IFtjaGlwXSBUYWNoeW9uIFRTIEhQRkMtNTE2NkEvMS4yICBMMkMxMDkwIC4uLgorICogICAgICAgICAgU1AjIFAyMjVDWENCRklFTDZULCBSZXYgWEMKKyAqICAgICAgICAgIFNQIyAxNjEyOTAtMDAxLCBSZXYgWEQKKyAqIChiYWNrKTogQm9hcmQgTm8uIDAxMDAwOC0wMDEgQS9XIFJldiBYNSwgRkFCIFJFViBYNQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFdyaXR0ZW4gYnkgRG9uIFppbW1lcm1hbgorKi8KKy8vIFRoZXNlIGZ1bmN0aW9ucyBjb250cm9sIHRoZSBOVlJBTSBJMkMgaGFyZHdhcmUgb24gCisvLyBub24taW50ZWxsaWdlbnQgRmlicmUgSG9zdCBBZGFwdGVycy4KKy8vIFRoZSBwcmltYXJ5IHB1cnBvc2UgaXMgdG8gcmVhZCB0aGUgSEJBJ3MgTlZSQU0gdG8gZ2V0IGFkYXB0ZXIncyAKKy8vIG1hbnVmYWN0dXJlZCBXV04gdG8gY29weSBpbnRvIFRhY2h5b24gY2hpcCByZWdpc3RlcnMKKy8vIE9yaWduYWwgc291cmNlIGF1dGhvciB1bmtub3duCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorZW51bSBib29sZWFuIHsgRkFMU0UsIFRSVUUgfSA7CisKKworI2lmbmRlZiBVQ0hBUgordHlwZWRlZiBfX3U4IFVDSEFSOworI2VuZGlmCisjaWZuZGVmIEJPT0xFQU4KK3R5cGVkZWYgX191OCBCT09MRUFOOworI2VuZGlmCisjaWZuZGVmIFVTSE9SVAordHlwZWRlZiBfX3UxNiBVU0hPUlQ7CisjZW5kaWYKKyNpZm5kZWYgVUxPTkcKK3R5cGVkZWYgX191MzIgVUxPTkc7CisjZW5kaWYKKworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPiAgLy8gc3RydWN0IHB0X3JlZ3MgZm9yIElSUSBoYW5kbGVyICYgUG9ydCBJL08KKworI2luY2x1ZGUgImNwcWZjVFNjaGlwLmgiCisKK3N0YXRpYyB2b2lkIHRsX2kyY190eF9ieXRlKCB2b2lkKiBHUElPb3V0LCBVQ0hBUiBkYXRhICk7CisvKnN0YXRpYyBCT09MRUFOIHRsX3dyaXRlX2kyY19wYWdlX3BvcnRpb24oIHZvaWQqIEdQSU9pbiwgdm9pZCogR1BJT291dCwKKyAgVVNIT1JUIHN0YXJ0T2Zmc2V0LCAgLy8gZS5nLiAweDJmIGZvciBXV04gc3RhcnQKKyAgVVNIT1JUIGNvdW50LAorICBVQ0hBUiAqYnVmICk7CisqLworCisvLworLy8gVGFjaGxpdGUgR1BJTzIsIEdQSU8zIChJMkMpIERFRklORVMKKy8vIFRoZSBOVlJBTSBjaGlwIE5NMjRDMDMgZGVmaW5lcyBTQ0wgKHNlcmlhbCBjbG9jaykgYW5kIFNEQSAoc2VyaWFsIGRhdGEpCisvLyBHUElPMiBkcml2ZXMgU0RBLCBhbmQgR1BJTzMgZHJpdmVzIFNDTAorLy8gCisvLyBTaW5jZSBUYWNobGl0ZSBpbnZlcnRzIHRoZSBzdGF0ZSBvZiB0aGUgR1BJTyAwLTMgb3V0cHV0cywgU0VUIHdyaXRlcyAwCisvLyBhbmQgY2xlYXIgd3JpdGVzIDEuIFRoZSBpbnB1dCBsaW5lcyAocmVhZCBpbiBUTCBzdGF0dXMpIGlzIE5PVCBpbnZlcnRlZAorLy8gVGhpcyByZWFsbHkgaGVscHMgY29uZnVzZSB0aGUgY29kZSBhbmQgZGVidWdnaW5nLgorCisjZGVmaW5lIFNFVF9EQVRBX0hJICAweDAKKyNkZWZpbmUgU0VUX0RBVEFfTE8gIDB4OAorI2RlZmluZSBTRVRfQ0xPQ0tfSEkgMHgwCisjZGVmaW5lIFNFVF9DTE9DS19MTyAweDQKKworI2RlZmluZSBTRU5TRV9EQVRBX0hJICAweDgKKyNkZWZpbmUgU0VOU0VfREFUQV9MTyAgMHgwCisjZGVmaW5lIFNFTlNFX0NMT0NLX0hJIDB4NAorI2RlZmluZSBTRU5TRV9DTE9DS19MTyAweDAKKworI2RlZmluZSBTTEFWRV9SRUFEX0FERFJFU1MgICAgMHhBMQorI2RlZmluZSBTTEFWRV9XUklURV9BRERSRVNTICAgMHhBMAorCQkJCQkgICAgICAKKworc3RhdGljIHZvaWQgaTJjX2RlbGF5KFVMT05HIG1zdGltZSk7CitzdGF0aWMgdm9pZCB0bF9pMmNfY2xvY2tfcHVsc2UoIFVDSEFSICwgdm9pZCogR1BJT291dCk7CitzdGF0aWMgVUNIQVIgdGxfcmVhZF9pMmNfZGF0YSggdm9pZCogKTsKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICAgICBOYW1lOiAgIEkyQ19SWF9BQ0sKKy8vCisvLyAgICAgIFRoaXMgcm91dGluZSByZWNlaXZlcyBhbiBhY2tub3dsZWRnZSBvdmVyIHRoZSBJMkMgYnVzLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB0bF9pMmNfcnhfYWNrKCB2b2lkKiBHUElPaW4sIHZvaWQqIEdQSU9vdXQgKQoreworICB1bnNpZ25lZCBsb25nIHZhbHVlOworCisJLy8gZG8gY2xvY2sgcHVsc2UsIGxldCBkYXRhIGxpbmUgZmxvYXQgaGlnaAorICB0bF9pMmNfY2xvY2tfcHVsc2UoIFNFVF9EQVRBX0hJLCBHUElPb3V0ICk7CisKKwkvLyBzbGF2ZSBtdXN0IGRyaXZlIGRhdGEgbG93IGZvciBhY2tub3dsZWRnZQorICB2YWx1ZSA9IHRsX3JlYWRfaTJjX2RhdGEoIEdQSU9pbik7CisgIGlmICh2YWx1ZSAmIFNFTlNFX0RBVEFfSEkgKQorICAgIHJldHVybiggRkFMU0UgKTsKKworICByZXR1cm4oIFRSVUUgKTsKK30KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgICAgIE5hbWU6ICAgUkVBRF9JMkNfUkVHCisvLworLy8gICAgICBUaGlzIHJvdXRpbmUgcmVhZHMgdGhlIEkyQyBjb250cm9sIHJlZ2lzdGVyIHVzaW5nIHRoZSBnbG9iYWwKKy8vICAgICAgSU8gYWRkcmVzcyBzdG9yZWQgaW4gZ3Bpb3JlZy4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgVUNIQVIgdGxfcmVhZF9pMmNfZGF0YSggdm9pZCogZ3Bpb3JlZyApCit7CisgIHJldHVybiggKFVDSEFSKShyZWFkbCggZ3Bpb3JlZyApICYgMHgwOEwpICk7IC8vIEdQSU8zCit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICAgICBOYW1lOiAgIFdSSVRFX0kyQ19SRUcKKy8vCisvLyAgICAgIFRoaXMgcm91dGluZSB3cml0ZXMgdGhlIEkyQyBjb250cm9sIHJlZ2lzdGVyIHVzaW5nIHRoZSBnbG9iYWwKKy8vICAgICAgSU8gYWRkcmVzcyBzdG9yZWQgaW4gZ3Bpb3JlZy4KKy8vICAgICAgSW4gVGFjaGxpdGUsIHdlIGRvbid0IHdhbnQgdG8gbW9kaWZ5IG90aGVyIGJpdHMgaW4gVEwgQ29udHJvbCByZWcuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgdGxfd3JpdGVfaTJjX3JlZyggdm9pZCogZ3Bpb3JlZ09VVCwgVUNIQVIgdmFsdWUgKQoreworICBVTE9ORyAgdGVtcDsKKworCS8vIEZpcnN0IHJlYWQgdGhlIHJlZ2lzdGVyIGFuZCBjbGVhciBvdXQgdGhlIG9sZCBiaXRzCisgIHRlbXAgPSByZWFkbCggZ3Bpb3JlZ09VVCApICYgMHhmZmZmZmZmM0w7CisKKwkvLyBOb3cgb3IgaW4gdGhlIG5ldyBkYXRhIGFuZCBzZW5kIGl0IGJhY2sgb3V0CisgIHdyaXRlbCggdGVtcCB8IHZhbHVlLCBncGlvcmVnT1VUKTsKK30KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgICAgIE5hbWU6ICAgSTJDX1RYX1NUQVJUCisvLworLy8gICAgICBUaGlzIHJvdXRpbmUgdHJhbnNtaXRzIGEgc3RhcnQgY29uZGl0aW9uIG92ZXIgdGhlIEkyQyBidXMuCisvLyAgICAgIDEuIFNldCBTQ0wgKGNsb2NrLCBHUElPMikgSElHSCwgc2V0IFNEQSAoZGF0YSwgR1BJTzMpIEhJR0gsCisvLyAgICAgIHdhaXQgNXVzIHRvIHN0YWJpbGl6ZS4KKy8vICAgICAgMi4gV2l0aCBTQ0wgc3RpbGwgSElHSCwgZHJpdmUgU0RBIGxvdy4gIFRoZSBsb3cgdHJhbnNpdGlvbiBtYXJrcworLy8gICAgICAgICB0aGUgc3RhcnQgY29uZGl0aW9uIHRvIE5NMjRDeHggKHRoZSBjaGlwKQorLy8gICAgICBOT1RFISBJbiBUTCBjb250cm9sIHJlZy4sIG91dHB1dCAxIG1lYW5zIGNoaXAgc2VlcyBMT1cKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdGxfaTJjX3R4X3N0YXJ0KCB2b2lkKiBHUElPaW4sIHZvaWQqIEdQSU9vdXQgKQoreworICB1bnNpZ25lZCBzaG9ydCBpOworICBVTE9ORyB2YWx1ZTsKKworICBpZiAoICEodGxfcmVhZF9pMmNfZGF0YShHUElPaW4pICYgU0VOU0VfREFUQV9ISSkpCisgIHsKKyAgICAvLyBzdGFydCB3aXRoIGNsb2NrIGhpZ2gsIGxldCBkYXRhIGZsb2F0IGhpZ2gKKyAgICB0bF93cml0ZV9pMmNfcmVnKCAgR1BJT291dCwgU0VUX0RBVEFfSEkgfCBTRVRfQ0xPQ0tfSEkgKTsKKworICAgIC8vIGtlZXAgc2VuZGluZyBjbG9jayBwdWxzZXMgaWYgc2xhdmUgaXMgZHJpdmluZyBkYXRhIGxpbmUKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICB7CisgICAgICB0bF9pMmNfY2xvY2tfcHVsc2UoIFNFVF9EQVRBX0hJLCBHUElPb3V0ICk7CisKKyAgICAgIGlmICggdGxfcmVhZF9pMmNfZGF0YShHUElPaW4pICYgU0VOU0VfREFUQV9ISSApCisJYnJlYWs7CisgICAgfQorCisJCS8vIGlmIGhlJ3Mgc3RpbGwgZHJpdmluZyBkYXRhIGxvdyBhZnRlciAxMCBjbG9ja3MsIGFib3J0CisgICAgdmFsdWUgPSB0bF9yZWFkX2kyY19kYXRhKCBHUElPaW4gKTsgLy8gcmVhZCBzdGF0dXMKKyAgICBpZiAoISh2YWx1ZSAmIDB4MDgpICkKKyAgICAgIHJldHVybiggRkFMU0UgKTsKKyAgfQorCisKKwkvLyBUbyBTVEFSVCwgYnJpbmcgZGF0YSBsb3cgd2hpbGUgY2xvY2sgaGlnaAorICB0bF93cml0ZV9pMmNfcmVnKCAgR1BJT291dCwgU0VUX0NMT0NLX0hJIHwgU0VUX0RBVEFfTE8gKTsKKworICBpMmNfZGVsYXkoMCk7CisKKyAgcmV0dXJuKCBUUlVFICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVFggc3RhcnQgc3VjY2Vzc2Z1bAorfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgICAgTmFtZTogICBJMkNfVFhfU1RPUAorLy8KKy8vICAgICAgVGhpcyByb3V0aW5lIHRyYW5zbWl0cyBhIHN0b3AgY29uZGl0aW9uIG92ZXIgdGhlIEkyQyBidXMuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdGxfaTJjX3R4X3N0b3AoIHZvaWQqIEdQSU9pbiwgdm9pZCogR1BJT291dCApCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSAKKyAgeworICAvLyBTZW5kIGNsb2NrIHB1bHNlLCBkcml2ZSBkYXRhIGxpbmUgbG93CisgICAgdGxfaTJjX2Nsb2NrX3B1bHNlKCBTRVRfREFUQV9MTywgR1BJT291dCApOworCisgIC8vIFRvIFNUT1AsIGJyaW5nIGRhdGEgaGlnaCB3aGlsZSBjbG9jayBoaWdoCisgICAgdGxfd3JpdGVfaTJjX3JlZyggIEdQSU9vdXQsIFNFVF9EQVRBX0hJIHwgU0VUX0NMT0NLX0hJICk7CisKKyAgLy8gR2l2ZSB0aGUgZGF0YSBsaW5lIHRpbWUgdG8gZmxvYXQgaGlnaAorICAgIGkyY19kZWxheSgwKTsKKworICAvLyBJZiBzbGF2ZSBpcyBkcml2aW5nIGRhdGEgbGluZSBsb3csIHRoZXJlJ3MgYSBwcm9ibGVtOyByZXRyeQorICAgIGlmICggdGxfcmVhZF9pMmNfZGF0YShHUElPaW4pICYgU0VOU0VfREFUQV9ISSApCisgICAgICByZXR1cm4oIFRSVUUgKTsgIC8vIFRYIFNUT1Agc3VjY2Vzc2Z1bCEKKyAgfQorCisgIHJldHVybiggRkFMU0UgKTsgICAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IKK30KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgICAgIE5hbWU6ICAgSTJDX1RYX3VjaGFyCisvLworLy8gICAgICBUaGlzIHJvdXRpbmUgdHJhbnNtaXRzIGEgYnl0ZSBhY3Jvc3MgdGhlIEkyQyBidXMuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgdGxfaTJjX3R4X2J5dGUoIHZvaWQqIEdQSU9vdXQsIFVDSEFSIGRhdGEgKQoreworICBVQ0hBUiBiaXQ7CisKKyAgZm9yIChiaXQgPSAweDgwOyBiaXQ7IGJpdCA+Pj0gMSkKKyAgeworICAgIGlmKCBkYXRhICYgYml0ICkKKyAgICAgIHRsX2kyY19jbG9ja19wdWxzZSggKFVDSEFSKVNFVF9EQVRBX0hJLCBHUElPb3V0KTsKKyAgICBlbHNlCisgICAgICB0bF9pMmNfY2xvY2tfcHVsc2UoIChVQ0hBUilTRVRfREFUQV9MTywgR1BJT291dCk7CisgIH0gIAorfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgICAgTmFtZTogICBJMkNfUlhfdWNoYXIKKy8vCisvLyAgICAgIFRoaXMgcm91dGluZSByZWNlaXZlcyBhIGJ5dGUgYWNyb3NzIHRoZSBJMkMgYnVzLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyBVQ0hBUiB0bF9pMmNfcnhfYnl0ZSggdm9pZCogR1BJT2luLCB2b2lkKiBHUElPb3V0ICkKK3sKKyAgVUNIQVIgYml0OworICBVQ0hBUiBkYXRhID0gMDsKKworCisgIGZvciAoYml0ID0gMHg4MDsgYml0OyBiaXQgPj49IDEpIHsKKyAgICAvLyBkbyBjbG9jayBwdWxzZSwgbGV0IGRhdGEgbGluZSBmbG9hdCBoaWdoCisgICAgdGxfaTJjX2Nsb2NrX3B1bHNlKCBTRVRfREFUQV9ISSwgR1BJT291dCApOworCisgICAgLy8gcmVhZCBkYXRhIGxpbmUKKyAgICBpZiAoIHRsX3JlYWRfaTJjX2RhdGEoIEdQSU9pbikgJiAweDA4ICkKKyAgICAgIGRhdGEgfD0gYml0OworICB9CisKKyAgcmV0dXJuIChkYXRhKTsKK30KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIHJlYWRfaTJjX252cmFtCisvLyBBcmd1bWVudHM6ICBVQ0hBUiBjb3VudCAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKy8vICAgICAgICAgICAgIFVDSEFSICpidWYgICAgICBhcmVhIHRvIHN0b3JlIHRoZSBieXRlcyByZWFkCisvLyBSZXR1cm5zOiAgICAwIC0gZmFpbGVkCisvLyAgICAgICAgICAgICAxIC0gc3VjY2VzcworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgordW5zaWduZWQgbG9uZyBjcHFmY1RTX1JlYWROVlJBTSggdm9pZCogR1BJT2luLCB2b2lkKiBHUElPb3V0ICwgVVNIT1JUIGNvdW50LAorCVVDSEFSICpidWYgKQoreworICB1bnNpZ25lZCBzaG9ydCBpOworCisgIGlmKCAhKCB0bF9pMmNfdHhfc3RhcnQoR1BJT2luLCBHUElPb3V0KSApKQorICAgIHJldHVybiBGQUxTRTsKKworICAvLyBTZWxlY3QgdGhlIE5WUkFNIGZvciAiZHVtbXkiIHdyaXRlLCB0byBzZXQgdGhlIGFkZHJlc3MKKyAgdGxfaTJjX3R4X2J5dGUoIEdQSU9vdXQgLCBTTEFWRV9XUklURV9BRERSRVNTICk7CisgIGlmICggIXRsX2kyY19yeF9hY2soR1BJT2luLCBHUElPb3V0ICkgKQorICAgIHJldHVybiggRkFMU0UgKTsKKworICAvLyBOb3cgc2VuZCB0aGUgYWRkcmVzcyB3aGVyZSB3ZSB3YW50IHRvIHN0YXJ0IHJlYWRpbmcgIAorICB0bF9pMmNfdHhfYnl0ZSggR1BJT291dCAsIDAgKTsKKyAgaWYgKCAhdGxfaTJjX3J4X2FjayhHUElPaW4sIEdQSU9vdXQgKSApCisgICAgcmV0dXJuKCBGQUxTRSApOworCisgIC8vIFNlbmQgYSByZXBlYXRlZCBzdGFydCBjb25kaXRpb24gYW5kIHNlbGVjdCB0aGUKKyAgLy8gIHNsYXZlIGZvciByZWFkaW5nIG5vdy4KKyAgaWYoIHRsX2kyY190eF9zdGFydChHUElPaW4sIEdQSU9vdXQpICkKKyAgICB0bF9pMmNfdHhfYnl0ZSggR1BJT291dCwgU0xBVkVfUkVBRF9BRERSRVNTICk7CisKKyAgaWYgKCAhdGxfaTJjX3J4X2FjayhHUElPaW4sIEdQSU9vdXQpICkKKyAgICByZXR1cm4oIEZBTFNFICk7CisKKyAgLy8gdGhpcyBsb29wIHdpbGwgbm93IHJlYWQgb3V0IHRoZSBkYXRhIGFuZCBzdG9yZSBpdAorICAvLyAgaW4gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGJ1ZgorICBmb3IgKCBpPTA7IGk8Y291bnQ7IGkrKykgCisgIHsKKyAgICAqYnVmKysgPSB0bF9pMmNfcnhfYnl0ZShHUElPaW4sIEdQSU9vdXQpOworCisgICAgLy8gU2VuZCBBQ0sgYnkgaG9sZGluZyBkYXRhIGxpbmUgbG93IGZvciAxIGNsb2NrCisgICAgaWYgKCBpIDwgKGNvdW50LTEpICkKKyAgICAgIHRsX2kyY19jbG9ja19wdWxzZSggMHgwOCwgR1BJT291dCApOworICAgIGVsc2UgeworCS8vIERvbid0IHNlbmQgYWNrIGZvciBmaW5hbCBieXRlCisgICAgICB0bF9pMmNfY2xvY2tfcHVsc2UoIFNFVF9EQVRBX0hJLCBHUElPb3V0ICk7CisgICAgfQorICB9CisKKyAgdGxfaTJjX3R4X3N0b3AoR1BJT2luLCBHUElPb3V0KTsKKworICByZXR1cm4oIFRSVUUgKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8KKy8vCisvLyByb3V0aW5lcyB0byBzZXQgYW5kIGNsZWFyIHRoZSBkYXRhIGFuZCBjbG9jayBiaXRzCisvLworLy8KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworc3RhdGljIHZvaWQgdGxfc2V0X2Nsb2NrKHZvaWQqIGdwaW9yZWcpCit7CisgIFVMT05HIHJldF92YWw7CisKKyAgcmV0X3ZhbCA9IHJlYWRsKCBncGlvcmVnICk7CisgIHJldF92YWwgJj0gMHhmZmZmZmZGQkw7ICAvLyBjbGVhciBHUElPMiAoU0NMKQorICB3cml0ZWwoIHJldF92YWwsIGdwaW9yZWcpOworfQorCitzdGF0aWMgdm9pZCB0bF9jbHJfY2xvY2sodm9pZCogZ3Bpb3JlZykKK3sKKyAgVUxPTkcgcmV0X3ZhbDsKKworICByZXRfdmFsID0gcmVhZGwoIGdwaW9yZWcgKTsKKyAgcmV0X3ZhbCB8PSBTRVRfQ0xPQ0tfTE87CisgIHdyaXRlbCggcmV0X3ZhbCwgZ3Bpb3JlZyk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLworLy8gVGhpcyByb3V0aW5lIHdpbGwgYWR2YW5jZSB0aGUgY2xvY2sgYnkgb25lIHBlcmlvZAorLy8KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZCB0bF9pMmNfY2xvY2tfcHVsc2UoIFVDSEFSIHZhbHVlLCB2b2lkKiBHUElPb3V0ICApCit7CisgIFVMT05HIHJldF92YWw7CisKKyAgLy8gY2xlYXIgdGhlIGNsb2NrIGJpdAorICB0bF9jbHJfY2xvY2soIEdQSU9vdXQgKTsKKworICBpMmNfZGVsYXkoMCk7CisKKworICAvLyByZWFkIHRoZSBwb3J0IHRvIHByZXNlcnZlIG5vbi1JMkMgYml0cworICByZXRfdmFsID0gcmVhZGwoIEdQSU9vdXQgKTsKKworICAvLyBjbGVhciB0aGUgZGF0YSAmIGNsb2NrIGJpdHMKKyAgcmV0X3ZhbCAmPSAweEZGRkZGRmYzOworCisgIC8vIHdyaXRlIHRoZSB2YWx1ZSBwYXNzZWQgaW4uLi4KKyAgLy8gZGF0YSBjYW4gb25seSBjaGFuZ2Ugd2hpbGUgY2xvY2sgaXMgTE9XIQorICByZXRfdmFsIHw9IHZhbHVlOyAgICAgICAgICAgLy8gdGhlIGRhdGEKKyAgcmV0X3ZhbCB8PSBTRVRfQ0xPQ0tfTE87ICAgIC8vIHRoZSBjbG9jaworICB3cml0ZWwoIHJldF92YWwsIEdQSU9vdXQgKTsKKworICBpMmNfZGVsYXkoMCk7CisKKworICAvL3NldCBjbG9jayBiaXQKKyAgdGxfc2V0X2Nsb2NrKCBHUElPb3V0KTsKK30KKworCisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vCisvLyBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgNjQtYml0IFdXTgorLy8KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQgY3BxZmNUU19HZXROVlJBTV9kYXRhKCBVQ0hBUiAqd3duYnVmLCBVQ0hBUiAqYnVmICkKK3sKKyAgVUxPTkcgbGVuOworICBVTE9ORyBzdWJfbGVuOworICBVTE9ORyBwdHJfaW5jOworICBVTE9ORyBpOworICBVTE9ORyBqOworICBVQ0hBUiAqZGF0YV9wdHI7CisgIFVDSEFSICB6OworICBVQ0hBUiAgbmFtZTsKKyAgVUNIQVIgIHN1Yl9uYW1lOworICBVQ0hBUiAgZG9uZTsKKyAgaW50IGlSZXR1cm49MDsgIC8vIGRlZi4gMCBvZmZzZXQgaXMgZmFpbHVyZSB0byBmaW5kIFdXTiBmaWVsZAorICAKKworCSAgCisgIGRhdGFfcHRyID0gKFVDSEFSICopYnVmOworCisgIGRvbmUgPSBGQUxTRTsKKyAgaSA9IDA7CisKKyAgd2hpbGUgKCAoaSA8IDEyOCkgJiYgKCFkb25lKSApIAorICB7CisgICAgeiA9IGRhdGFfcHRyW2ldO1wKKyAgICBpZiAoICEoeiAmIDB4ODApICkgIAorICAgIHsJCisgICAgICBsZW4gID0gMSArICh6ICYgMHgwNyk7CisKKyAgICAgIG5hbWUgPSAoeiAmIDB4NzgpID4+IDM7CisgICAgICBpZiAobmFtZSA9PSAweDBGKQorICAgICAgICBkb25lID0gVFJVRTsKKyAgICB9CisgICAgZWxzZSAKKyAgICB7CisgICAgICBuYW1lID0geiAmIDB4N0Y7CisgICAgICBsZW4gID0gMyArIGRhdGFfcHRyW2krMV0gKyAoZGF0YV9wdHJbaSsyXSA8PCA4KTsKKyAgICAgICAgICAgCisgICAgICBzd2l0Y2ggKG5hbWUpIAorICAgICAgeworICAgICAgY2FzZSAweDBEOgorCS8vCisJICBqID0gaSArIDM7CisJICAvLworCSAgaWYgKCBkYXRhX3B0cltqXSA9PSAweDNiICkgeworCSAgICBsZW4gPSA2OworCSAgICBicmVhazsKKwkgIH0KKworCSAgd2hpbGUgKCBqPChpK2xlbikgKSB7CisJICAgIHN1Yl9uYW1lID0gKGRhdGFfcHRyW2pdICYgMHgzZik7CisJICAgIHN1Yl9sZW4gID0gZGF0YV9wdHJbaisxXSArIAorCSAgICAgICAgICAgICAgIChkYXRhX3B0cltqKzJdIDw8IDgpOworICAgICAgICAgICAgcHRyX2luYyAgPSBzdWJfbGVuICsgMzsgCisJICAgIHN3aXRjaCAoc3ViX25hbWUpIAorCSAgICB7CisJICAgIGNhc2UgMHgzQzoKKyAgICAgICAgICAgICAgbWVtY3B5KCB3d25idWYsICZkYXRhX3B0cltqKzNdLCA4KTsKKyAgICAgICAgICAgICAgaVJldHVybiA9IGorMzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBicmVhazsKKwkgICAgfQorCSAgICBqICs9IHB0cl9pbmM7CisgICAgICAgICAgfQorCSAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisJICBicmVhazsKKyAgICAgIH0gIAorICAgIH0gIAorICAvLworICAgIGkgKz0gbGVuOworICB9ICAvLyBlbmQgd2hpbGUgCisgIHJldHVybiBpUmV0dXJuOworfQorCisKKworCisKKy8vIGRlZmluZSBhIHNob3J0IDUgbWljcm8gc2VjIGRlbGF5LCBhbmQgbG9uZ2VyIChtcykgZGVsYXkKKworc3RhdGljIHZvaWQgaTJjX2RlbGF5KFVMT05HIG1zdGltZSkKK3sKKyAgVUxPTkcgaTsKKyAgCisvLyBOT1RFOiB3ZSBvbmx5IGV4cGVjdCB0byB1c2UgdGhlc2UgZGVsYXlzIHdoZW4gcmVhZGluZworLy8gb3VyIGFkYXB0ZXIncyBOVlJBTSwgd2hpY2ggaGFwcGVucyBvbmx5IGR1cmluZyBhZGFwdGVyIHJlc2V0LgorLy8gRGVsYXkgdGVjaG5pcXVlIGZyb20gIkxpbnV4IERldmljZSBEcml2ZXJzIiwgQS4gUnViaW5pIAorLy8gKDFzdCBFZC4pIHBnIDEzNy4KKworLy8gIHByaW50aygiIGRlbGF5ICVseCAgIiwgbXN0aW1lKTsKKyAgaWYoIG1zdGltZSApIC8vIG1zIGRlbGF5PworICB7CisgICAgLy8gZGVsYXkgdGVjaG5pcXVlCisgICAgZm9yKCBpPTA7IGkgPCBtc3RpbWU7IGkrKykKKyAgICAgIHVkZWxheSgxMDAwKTsgLy8gMW1zIHBlciBsb29wCisJCisgIH0KKyAgZWxzZSAgLy8gNSBtaWNybyBzZWMgZGVsYXkKKyAgCisgICAgdWRlbGF5KCA1ICk7IC8vIG1pY3JvIHNlY3MKKyAgCisvLyAgcHJpbnRrKCJkb25lXG4iKTsKK30KKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jcHFmY1RTaW5pdC5jIGIvZHJpdmVycy9zY3NpL2NwcWZjVFNpbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVlYjQ5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9jcHFmY1RTaW5pdC5jCkBAIC0wLDAgKzEsMjA5OCBAQAorLyogQ29weXJpZ2h0KGMpIDIwMDAsIENvbXBhcSBDb21wdXRlciBDb3Jwb3JhdGlvbiAKKyAqIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlciAKKyAqIDY0LWJpdCwgNjZNSHogUENJIAorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIHRlc3RlZCBvbjoKKyAqIChmcm9udCk6IFtjaGlwXSBUYWNoeW9uIFRTIEhQRkMtNTE2NkEvMS4yICBMMkMxMDkwIC4uLgorICogICAgICAgICAgU1AjIFAyMjVDWENCRklFTDZULCBSZXYgWEMKKyAqICAgICAgICAgIFNQIyAxNjEyOTAtMDAxLCBSZXYgWEQKKyAqIChiYWNrKTogQm9hcmQgTm8uIDAxMDAwOC0wMDEgQS9XIFJldiBYNSwgRkFCIFJFViBYNQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFdyaXR0ZW4gYnkgRG9uIFppbW1lcm1hbgorICogSU9DVEwgYW5kIHByb2NmcyBhZGRlZCBieSBKb3VrZSBOdW1hbgorICogU01QIHRlc3RpbmcgYnkgQ2hlbCBWYW4gR2VubmlwCisgKgorICogcG9ydGlvbnMgY29waWVkIGZyb206CisgKiBRTG9naWMgQ1BRRkNUUyBTQ1NJLUZDUAorICogV3JpdHRlbiBieSBFcmlrIEguIE1vZSwgZWhtQGNyaXMuY29tCisgKiBDb3B5cmlnaHQgMTk5NSwgRXJpayBILiBNb2UKKyAqIFJlbmFtZWQgYW5kIHVwZGF0ZWQgdG8gMS4zLnggYnkgTWljaGFlbCBHcmlmZml0aCA8Z3JpZkBjcy51Y3IuZWR1PiAKKyAqIENocmlzIExvdmVsYW5kIDxjd2xAaW9sLnVuaC5lZHU+IHRvIHN1cHBvcnQgdGhlIGlzcDIxMDAgYW5kIGlzcDIyMDAKKyovCisKKworI2RlZmluZSBMaW51eFZlcnNpb25Db2RlKHYsIHAsIHMpICgoKHYpPDwxNikrKChwKTw8OCkrKHMpKQorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+ICAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4gIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4gCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPiAgLy8gcmVxdWVzdF9yZWdpb24oKSBwcm90b3R5cGUKKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPiAgIC8vIGlvY3RsIHJlbGF0ZWQKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KKyNpbmNsdWRlICJjcHFmY1RTY2hpcC5oIgorI2luY2x1ZGUgImNwcWZjVFNzdHJ1Y3RzLmgiCisjaW5jbHVkZSAiY3BxZmNUU3RyaWdnZXIuaCIKKworI2luY2x1ZGUgImNwcWZjVFMuaCIKKworLyogRW1iZWRkZWQgbW9kdWxlIGRvY3VtZW50YXRpb24gbWFjcm9zIC0gc2VlIG1vZHVsZS5oICovCitNT0RVTEVfQVVUSE9SKCJDb21wYXEgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBDb21wYXEgNjQtYml0LzY2TWh6IFBDSSBGaWJyZSBDaGFubmVsIEhCQSB2LiAyLjUuNCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworICAKK2ludCBjcHFmY1RTX1RhcmdldERldmljZVJlc2V0KCBTY3NpX0RldmljZSAqU2NzaURldiwgdW5zaWduZWQgaW50IHJlc2V0X2ZsYWdzKTsKKworLy8gVGhpcyBzdHJ1Y3Qgd2FzIG9yaWdpbmFsbHkgZGVmaW5lZCBpbiAKKy8vIC91c3Ivc3JjL2xpbnV4L2luY2x1ZGUvbGludXgvcHJvY19mcy5oCisvLyBzaW5jZSBpdCdzIG9ubHkgcGFydGlhbGx5IGltcGxlbWVudGVkLCB3ZSBvbmx5IHVzZSBmaXJzdAorLy8gZmV3IGZpZWxkcy4uLgorLy8gTk9URTogcHJvY19mcyBjaGFuZ2VzIGluIDIuNCBrZXJuZWwKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IExpbnV4VmVyc2lvbkNvZGUoMiwzLDI3KQorc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSBwcm9jX3Njc2lfY3BxZmNUUyA9Cit7CisgIFBST0NfU0NTSV9DUFFGQ1RTLCAgICAgICAgICAgLy8gdXNob3J0IGxvd19pbm8gKGVudW1lcmF0ZWQgbGlzdCkKKyAgNywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2hvcnQgbmFtZWxlbgorICBERVZfTkFNRSwgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IGNoYXIqIG5hbWUKKyAgU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPLCAvLyBtb2RlX3QgbW9kZQorICAyICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5saW5rX3QgbmxpbmsKKwkgICAgICAgICAgICAgICAgICAgICAgIC8vIGV0Yy4gLi4uCit9OworCisKKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IExpbnV4VmVyc2lvbkNvZGUoMiw0LDcpCisjICBkZWZpbmUgQ1BRRkNfREVDTEFSRV9DT01QTEVUSU9OKHgpIERFQ0xBUkVfQ09NUExFVElPTih4KQorIyAgZGVmaW5lIENQUUZDX1dBSVRJTkcgd2FpdGluZworIyAgZGVmaW5lIENQUUZDX0NPTVBMRVRFKHgpIGNvbXBsZXRlKHgpCisjICBkZWZpbmUgQ1BRRkNfV0FJVF9GT1JfQ09NUExFVElPTih4KSB3YWl0X2Zvcl9jb21wbGV0aW9uKHgpOworI2Vsc2UKKyMgIGRlZmluZSBDUFFGQ19ERUNMQVJFX0NPTVBMRVRJT04oeCkgREVDTEFSRV9NVVRFWF9MT0NLRUQoeCkKKyMgIGRlZmluZSBDUFFGQ19XQUlUSU5HIHNlbQorIyAgZGVmaW5lIENQUUZDX0NPTVBMRVRFKHgpIHVwKHgpCisjICBkZWZpbmUgQ1BRRkNfV0FJVF9GT1JfQ09NUExFVElPTih4KSBkb3duKHgpCisjZW5kaWYKKworc3RhdGljIGludCBjcHFmY19hbGxvY19wcml2YXRlX2RhdGFfcG9vbChDUFFGQ0hCQSAqaGJhKTsKKworLyogbG9jYWwgZnVuY3Rpb24gdG8gbG9hZCBvdXIgcGVyLUhCQSAobG9jYWwpIGRhdGEgZm9yIGNoaXAKKyAgIHJlZ2lzdGVycywgRkMgbGluayBzdGF0ZSwgYWxsIEZDIGV4Y2hhbmdlcywgZXRjLgorCisgICBXZSBhbGxvY2F0ZSBzcGFjZSBhbmQgY29tcHV0ZSBhZGRyZXNzIG9mZnNldHMgZm9yIHRoZQorICAgbW9zdCBmcmVxdWVudGx5IGFjY2Vzc2VkIGFkZHJlc3Nlczsgb3RoZXJzIChsaWtlIFdvcmxkIFdpZGUKKyAgIE5hbWUpIGFyZSBub3QgbmVjZXNzYXJ5LgorKi8KK3N0YXRpYyB2b2lkIENwcWZjX2luaXRIQkFkYXRhKENQUUZDSEJBICpjcHFmY0hCQWRhdGEsIHN0cnVjdCBwY2lfZGV2ICpQY2lEZXYgKQoreworICAgICAgICAgICAgIAorICBjcHFmY0hCQWRhdGEtPlBjaURldiA9IFBjaURldjsgLy8gY29weSBQQ0kgaW5mbyBwdHIKKworICAvLyBzaW5jZSB4ODYgcG9ydCBzcGFjZSBpcyA2NGssIHdlIG9ubHkgbmVlZCB0aGUgbG93ZXIgMTYgYml0cworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuSU9CYXNlTCA9IAorICAgIFBjaURldi0+cmVzb3VyY2VbMV0uc3RhcnQgJiBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7CisgIAorICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuSU9CYXNlVSA9IAorICAgIFBjaURldi0+cmVzb3VyY2VbMl0uc3RhcnQgJiBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7CisgIAorICAvLyAzMi1iaXQgbWVtb3J5IGFkZHJlc3NlcworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuTWVtQmFzZSA9IAorICAgIFBjaURldi0+cmVzb3VyY2VbM10uc3RhcnQgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworCisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgPSAKKyAgICBpb3JlbWFwKCBQY2lEZXYtPnJlc291cmNlWzNdLnN0YXJ0ICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSywKKyAgICAgICAgICAgICAweDIwMCk7CisgIAorICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuUkFNQmFzZSA9IAorICAgIFBjaURldi0+cmVzb3VyY2VbNF0uc3RhcnQ7CisgIAorICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuU1JPTUJhc2UgPSAgLy8gTlVMTCBmb3IgSFAgVFMgYWRhcHRlcgorICAgIFBjaURldi0+cmVzb3VyY2VbNV0uc3RhcnQ7CisgIAorICAvLyBub3cgdGhlIFRhY2hsaXRlIGNoaXAgcmVnaXN0ZXJzCisgIC8vIHRoZSBSRUdJU1RFUiBzdHJ1Y3QgaG9sZHMgYm90aCB0aGUgcGh5c2ljYWwgYWRkcmVzcyAmIGxhc3QKKyAgLy8gd3JpdHRlbiB2YWx1ZSAoc29tZSBUTCByZWdpc3RlcnMgYXJlIFdSSVRFIE9OTFkpCisKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLlNGUWNvbnN1bWVySW5kZXguYWRkcmVzcyA9IAorICAgICAgICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX1NGUV9DT05TVU1FUl9JTkRFWDsKKworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuRVJRcHJvZHVjZXJJbmRleC5hZGRyZXNzID0gCisgICAgICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fRVJRX1BST0RVQ0VSX0lOREVYOworICAgICAgCisgIC8vIFRMIEZyYW1lIE1hbmFnZXIKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLkZNY29uZmlnLmFkZHJlc3MgPSAKKyAgICAgICAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9GTV9DT05GSUc7CisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5GTWNvbnRyb2wuYWRkcmVzcyA9IAorICAgICAgICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX0ZNX0NPTlRST0w7CisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5GTXN0YXR1cy5hZGRyZXNzID0gCisgICAgICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fRk1fU1RBVFVTOworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuRk1MaW5rU3RhdHVzMS5hZGRyZXNzID0gCisgICAgICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fRk1fTElOS19TVEFUMTsKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLkZNTGlua1N0YXR1czIuYWRkcmVzcyA9IAorICAgICAgICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX0ZNX0xJTktfU1RBVDI7CisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5GTUJCX0NyZWRpdFplcm8uYWRkcmVzcyA9IAorICAgICAgICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX0ZNX0JCX0NSRURJVDA7CisgICAgICAKKyAgICAgIC8vIFRMIENvbnRyb2wgUmVncworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuVFljb25maWcuYWRkcmVzcyA9IAorICAgICAgICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX1RBQ0hfQ09ORklHOworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuVFljb250cm9sLmFkZHJlc3MgPSAKKyAgICAgICAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9UQUNIX0NPTlRST0w7CisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5UWXN0YXR1cy5hZGRyZXNzID0gCisgICAgICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fVEFDSF9TVEFUVVM7CisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5yY3ZfYWxfcGEuYWRkcmVzcyA9IAorICAgICAgICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX0ZNX1JDVl9BTF9QQTsKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLmVkX3Rvdi5hZGRyZXNzID0gCisgICAgICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fRk1fRURfVE9WOworCisKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLklOVEVOLmFkZHJlc3MgPSAKKwkgICAgICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBJSU5URU47CisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5JTlRQRU5ELmFkZHJlc3MgPSAKKwkgICAgICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBJSU5UUEVORDsKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLklOVFNUQVQuYWRkcmVzcyA9IAorICAgICAgICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgSUlOVFNUQVQ7CisKKyAgREVCVUdfUENJKHByaW50aygiICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuIDpcbiIpKTsKKyAgREVCVUdfUENJKHByaW50aygiICAgIElPQmFzZUwgPSAleFxuIiwgCisgICAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLklPQmFzZUwpKTsKKyAgREVCVUdfUENJKHByaW50aygiICAgIElPQmFzZVUgPSAleFxuIiwgCisgICAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLklPQmFzZVUpKTsKKyAgCisgIC8qIHByaW50aygiIGlvcmVtYXAnZCBNZW1iYXNlOiAlcFxuIiwgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSk7ICovCisgIAorICBERUJVR19QQ0kocHJpbnRrKCIgICAgU0ZRY29uc3VtZXJJbmRleC5hZGRyZXNzID0gJXBcbiIsIAorICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5TRlFjb25zdW1lckluZGV4LmFkZHJlc3MpKTsKKyAgREVCVUdfUENJKHByaW50aygiICAgIEVSUXByb2R1Y2VySW5kZXguYWRkcmVzcyA9ICVwXG4iLCAKKyAgICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuRVJRcHJvZHVjZXJJbmRleC5hZGRyZXNzKSk7CisgIERFQlVHX1BDSShwcmludGsoIiAgICBUWWNvbmZpZy5hZGRyZXNzID0gJXBcbiIsIAorICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5UWWNvbmZpZy5hZGRyZXNzKSk7CisgIERFQlVHX1BDSShwcmludGsoIiAgICBGTWNvbmZpZy5hZGRyZXNzID0gJXBcbiIsIAorICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5GTWNvbmZpZy5hZGRyZXNzKSk7CisgIERFQlVHX1BDSShwcmludGsoIiAgICBGTWNvbnRyb2wuYWRkcmVzcyA9ICVwXG4iLCAKKyAgICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuRk1jb250cm9sLmFkZHJlc3MpKTsKKworICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zIGZvciBGQyBjb250cm9sbGVyIChjaGlwKQorICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5PcHRpb25zLmluaXRpYXRvciA9IDE7ICAvLyBkZWZhdWx0OiBTQ1NJIGluaXRpYXRvcgorICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5PcHRpb25zLnRhcmdldCA9IDA7ICAgICAvLyBkZWZhdWx0OiBTQ1NJIHRhcmdldAorICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5PcHRpb25zLmV4dExvb3BiYWNrID0gMDsvLyBkZWZhdWx0OiBubyBsb29wYmFjayBAR0JJQworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5PcHRpb25zLmludExvb3BiYWNrID0gMDsvLyBkZWZhdWx0OiBubyBsb29wYmFjayBpbnNpZGUgY2hpcAorCisgIC8vIHNldCBoaWdoZXN0IGFuZCBsb3dlc3QgRkMtUEggdmVyc2lvbiB0aGUgYWRhcHRlci9kcml2ZXIgc3VwcG9ydHMKKyAgLy8gKE5PVCBzdHJpY3QgY29tcGxpYW5jZSkKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuaGlnaGVzdF9GQ1BIX3ZlciA9IEZDX1BIMzsKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAubG93ZXN0X0ZDUEhfdmVyID0gRkNfUEg0MzsKKworICAvLyBzZXQgZnVuY3Rpb24gcG9pbnRzIGZvciB0aGlzIGNvbnRyb2xsZXIgLyBhZGFwdGVyCisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlc2V0VGFjaHlvbiA9IENwcVRzUmVzZXRUYWNoTGl0ZTsKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuRnJlZXplVGFjaHlvbiA9IENwcVRzRnJlZXplVGFjaGxpdGU7CisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlVuRnJlZXplVGFjaHlvbiA9IENwcVRzVW5GcmVlemVUYWNobGl0ZTsKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuQ3JlYXRlVGFjaHlvblF1ZXMgPSBDcHFUc0NyZWF0ZVRhY2hMaXRlUXVlczsKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuRGVzdHJveVRhY2h5b25RdWVzID0gQ3BxVHNEZXN0cm95VGFjaExpdGVRdWVzOworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5Jbml0aWFsaXplVGFjaHlvbiA9IENwcVRzSW5pdGlhbGl6ZVRhY2hMaXRlOyAgCisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLkxhc2VyQ29udHJvbCA9IENwcVRzTGFzZXJDb250cm9sOyAgCisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlByb2Nlc3NJTVFFbnRyeSA9IENwcVRzUHJvY2Vzc0lNUUVudHJ5OworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5Jbml0aWFsaXplRnJhbWVNYW5hZ2VyID0gQ3BxVHNJbml0aWFsaXplRnJhbWVNYW5hZ2VyOworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWFkV3JpdGVXV04gPSBDcHFUc1JlYWRXcml0ZVdXTjsKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVhZFdyaXRlTlZSQU0gPSBDcHFUc1JlYWRXcml0ZU5WUkFNOworCisgICAgICBpZiAoY3BxZmNfYWxsb2NfcHJpdmF0ZV9kYXRhX3Bvb2woY3BxZmNIQkFkYXRhKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCQkiY3BxZmM6IHVuYWJsZSB0byBhbGxvY2F0ZSBwb29sIGZvciBwYXNzdGhydSBpb2N0bHMuICAiCisJCQkiUGFzc3RocnUgaW9jdGxzIGRpc2FibGVkLlxuIik7CisgICAgICB9Cit9CisKKworLyogKGJvcnJvd2VkIGZyb20gbGludXgvZHJpdmVycy9zY3NpL2hvc3RzLmMpICovCitzdGF0aWMgdm9pZCBsYXVuY2hfRkN3b3JrZXJfdGhyZWFkKHN0cnVjdCBTY3NpX0hvc3QgKkhvc3RBZGFwdGVyKQoreworICBERUNMQVJFX01VVEVYX0xPQ0tFRChzZW0pOworCisgIENQUUZDSEJBICpjcHFmY0hCQWRhdGEgPSAoQ1BRRkNIQkEgKilIb3N0QWRhcHRlci0+aG9zdGRhdGE7CisKKyAgRU5URVIoImxhdW5jaF9GQ193b3JrZXJfdGhyZWFkIik7CisgICAgICAgICAgICAgCisgIGNwcWZjSEJBZGF0YS0+bm90aWZ5X3d0ID0gJnNlbTsKKworICAvKiBtdXN0IHVubG9jayBiZWZvcmUga2VybmVsX3RocmVhZCgpLCBmb3IgaXQgbWF5IGNhdXNlIGEgcmVzY2hlZHVsZS4gKi8KKyAgc3Bpbl91bmxvY2tfaXJxKEhvc3RBZGFwdGVyLT5ob3N0X2xvY2spOworICBrZXJuZWxfdGhyZWFkKChpbnQgKCopKHZvaWQgKikpY3BxZmNUU1dvcmtlclRocmVhZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIEhvc3RBZGFwdGVyLCAwKTsKKyAgLyoKKyAgICogTm93IHdhaXQgZm9yIHRoZSBrZXJuZWwgZXJyb3IgdGhyZWFkIHRvIGluaXRpYWxpemUgaXRzZWxmCisKKyAgICovCisgIGRvd24gKCZzZW0pOworICBzcGluX2xvY2tfaXJxKEhvc3RBZGFwdGVyLT5ob3N0X2xvY2spOworICBjcHFmY0hCQWRhdGEtPm5vdGlmeV93dCA9IE5VTEw7CisKKyAgTEVBVkUoImxhdW5jaF9GQ193b3JrZXJfdGhyZWFkIik7CisgCit9CisKKworLyogIkVudHJ5IiBwb2ludCB0byBkaXNjb3ZlciBpZiBhbnkgc3VwcG9ydGVkIFBDSSAKKyAgIGJ1cyBhZGFwdGVyIGNhbiBiZSBmb3VuZAorKi8KKy8qIFdlJ3JlIHN1cHBvcnRpbmc6CisgKiBDb21wYXEgNjQtYml0LCA2Nk1IeiBIQkEgd2l0aCBUYWNoeW9uIFRTCisgKiBBZ2lsZW50IFhMMiAKKyAqIEhQIFRhY2h5b24KKyAqLworI2RlZmluZSBIQkFfVFlQRVMgMworCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfQ09NUEFRXworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTVBBUV9UQUNIWU9OCTB4YTBmYworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgU3VwcG9ydGVkUENJY2FyZHMgY3BxZmNfYm9hcmRzW10gX19pbml0ZGF0YSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX1RBQ0hZT059LAorCXtQQ0lfVkVORE9SX0lEX0hQLCBQQ0lfREVWSUNFX0lEX0hQX1RBQ0hMSVRFfSwKKwl7UENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9UQUNIWU9OfSwKK307CisKKworaW50IGNwcWZjVFNfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqU2NzaUhvc3RUZW1wbGF0ZSkKK3sKKyAgaW50IE51bWJlck9mQWRhcHRlcnM9MDsgLy8gaG93IG1hbnkgb2Ygb3VyIFBDSSBhZGFwdGVycyBhcmUgZm91bmQ/CisgIHN0cnVjdCBwY2lfZGV2ICpQY2lEZXYgPSBOVUxMOworICBzdHJ1Y3QgU2NzaV9Ib3N0ICpIb3N0QWRhcHRlciA9IE5VTEw7CisgIENQUUZDSEJBICpjcHFmY0hCQWRhdGEgPSBOVUxMOyAKKyAgc3RydWN0IHRpbWVyX2xpc3QgKmNwcWZjVFN0aW1lciA9IE5VTEw7CisgIGludCBpOworCisgIEVOVEVSKCJjcHFmY1RTX2RldGVjdCIpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgTGludXhWZXJzaW9uQ29kZSgyLDMsMjcpCisgIFNjc2lIb3N0VGVtcGxhdGUtPnByb2NfZGlyID0gJnByb2Nfc2NzaV9jcHFmY1RTOworI2Vsc2UKKyAgU2NzaUhvc3RUZW1wbGF0ZS0+cHJvY19uYW1lID0gImNwcWZjVFMiOworI2VuZGlmCisKKyAgZm9yKCBpPTA7IGkgPCBIQkFfVFlQRVM7IGkrKykKKyAgeworICAgIC8vIGxvb2sgZm9yIGFsbCBIQkFzIG9mIGVhY2ggdHlwZQorCisgICAgd2hpbGUoKFBjaURldiA9IHBjaV9maW5kX2RldmljZShjcHFmY19ib2FyZHNbaV0udmVuZG9yX2lkLAorCQkJCSAgICBjcHFmY19ib2FyZHNbaV0uZGV2aWNlX2lkLCBQY2lEZXYpKSkKKyAgICB7CisKKyAgICAgIGlmIChwY2lfZW5hYmxlX2RldmljZShQY2lEZXYpKSB7CisJcHJpbnRrKEtFUk5fRVJSCisJCSJjcHFmYzogY2FuJ3QgZW5hYmxlIFBDSSBkZXZpY2UgYXQgJXNcbiIsIHBjaV9uYW1lKFBjaURldikpOworCWdvdG8gZXJyX2NvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAocGNpX3NldF9kbWFfbWFzayhQY2lEZXYsIENQUUZDVFNfRE1BX01BU0spICE9IDApIHsKKwlwcmludGsoS0VSTl9XQVJOSU5HIAorCQkiY3BxZmM6IEhCQSBjYW5ub3Qgc3VwcG9ydCByZXF1aXJlZCBETUEgbWFzaywgc2tpcHBpbmcuXG4iKTsKKwlnb3RvIGVycl9kaXNhYmxlX2RldjsKKyAgICAgIH0KKworICAgICAgLy8gTk9URTogKGtlcm5lbCAyLjIuMTItMzIpIGxpbWl0cyBhbGxvY2F0aW9uIHRvIDEyOGsgYnl0ZXMuLi4KKyAgICAgIC8qIHByaW50aygiIHNjc2lfcmVnaXN0ZXIgYWxsb2NhdGluZyAlZCBieXRlcyBmb3IgRkMgSEJBXG4iLAorCQkgICAgICAoVUxPTkcpc2l6ZW9mKENQUUZDSEJBKSk7ICovCisKKyAgICAgIEhvc3RBZGFwdGVyID0gc2NzaV9yZWdpc3RlciggU2NzaUhvc3RUZW1wbGF0ZSwgc2l6ZW9mKCBDUFFGQ0hCQSApICk7CisgICAgICAKKyAgICAgIGlmKEhvc3RBZGFwdGVyID09IE5VTEwpIHsKKwlwcmludGsoS0VSTl9XQVJOSU5HCisJCSJjcHFmYzogY2FuJ3QgcmVnaXN0ZXIgU0NTSSBIQkEsIHNraXBwaW5nLlxuIik7CisgICAgICAJZ290byBlcnJfZGlzYWJsZV9kZXY7CisgICAgICB9CisgICAgICBERUJVR19QQ0koIHByaW50aygiICBIQkEgZm91bmQhXG4iKSk7CisgICAgICBERUJVR19QQ0koIHByaW50aygiICBIb3N0QWRhcHRlci0+UGNpRGV2LT5pcnEgPSAldVxuIiwgUGNpRGV2LT5pcnEpICk7CisgICAgICBERUJVR19QQ0kocHJpbnRrKCIgIFBjaURldi0+YmFzZWFkZHJlc3NbMF09ICVseFxuIiwgCisJCQkJUGNpRGV2LT5yZXNvdXJjZVswXS5zdGFydCkpOworICAgICAgREVCVUdfUENJKHByaW50aygiICBQY2lEZXYtPmJhc2VhZGRyZXNzWzFdPSAlbHhcbiIsIAorCQkJCVBjaURldi0+cmVzb3VyY2VbMV0uc3RhcnQpKTsKKyAgICAgIERFQlVHX1BDSShwcmludGsoIiAgUGNpRGV2LT5iYXNlYWRkcmVzc1syXT0gJWx4XG4iLCAKKwkJCQlQY2lEZXYtPnJlc291cmNlWzJdLnN0YXJ0KSk7CisgICAgICBERUJVR19QQ0kocHJpbnRrKCIgIFBjaURldi0+YmFzZWFkZHJlc3NbM109ICVseFxuIiwgCisJCQkJUGNpRGV2LT5yZXNvdXJjZVszXS5zdGFydCkpOworCisgICAgICBzY3NpX3NldF9kZXZpY2UoSG9zdEFkYXB0ZXIsICZQY2lEZXYtPmRldik7CisgICAgICBIb3N0QWRhcHRlci0+aXJxID0gUGNpRGV2LT5pcnE7ICAvLyBjb3B5IGZvciBTY3NpIGxheWVycworICAgICAgCisgICAgICAvLyBIUCBUYWNobGl0ZSB1c2VzIHR3byAoMjU1LWJ5dGUpIHJhbmdlcyBvZiBQb3J0IEkvTyAobG93ZXIgJiB1cHBlciksCisgICAgICAvLyBmb3IgYSB0b3RhbCBJL08gcG9ydCBhZGRyZXNzIHNwYWNlIG9mIDUxMiBieXRlcy4KKyAgICAgIC8vIG1hc2sgb3V0IHRoZSBJL08gcG9ydCBhZGRyZXNzIChsb3dlcikgJiByZWNvcmQKKyAgICAgIEhvc3RBZGFwdGVyLT5pb19wb3J0ID0gKHVuc2lnbmVkIGludCkKKwkgICAgIFBjaURldi0+cmVzb3VyY2VbMV0uc3RhcnQgJiBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7CisgICAgICBIb3N0QWRhcHRlci0+bl9pb19wb3J0ID0gMHhmZjsKKyAgICAgIAorICAgICAgLy8gaS5lLiwgZXhwZWN0IDEyOCB0YXJnZXRzIChhcmJpdHJhcnkgbnVtYmVyKSwgd2hpbGUgdGhlCisgICAgICAvLyAgUkEtNDAwMCBzdXBwb3J0cyAzMiBMVU5zCisgICAgICBIb3N0QWRhcHRlci0+bWF4X2lkID0gIDA7ICAgLy8gaW5jcmVtZW50ZWQgYXMgZGV2aWNlcyBsb2cgaW4gICAgCisgICAgICBIb3N0QWRhcHRlci0+bWF4X2x1biA9IENQUUZDVFNfTUFYX0xVTjsgICAgICAgICAvLyBMVU5zIHBlciBGQyBkZXZpY2UKKyAgICAgIEhvc3RBZGFwdGVyLT5tYXhfY2hhbm5lbCA9IENQUUZDVFNfTUFYX0NIQU5ORUw7IC8vIG11bHRpcGxlIGJ1c3Nlcz8KKyAgICAgIAorICAgICAgLy8gZ2V0IHRoZSBwb2ludGVyIHRvIG91ciBIQkEgc3BlY2lmaWMgZGF0YS4uLiAob25lIGZvcgorICAgICAgLy8gZWFjaCBIQkEgb24gdGhlIFBDSSBidXMoc2VzKSkuCisgICAgICBjcHFmY0hCQWRhdGEgPSAoQ1BRRkNIQkEgKilIb3N0QWRhcHRlci0+aG9zdGRhdGE7CisgICAgICAKKyAgICAgIC8vIG1ha2UgY2VydGFpbiBvdXIgZGF0YSBzdHJ1Y3QgaXMgY2xlYXIKKyAgICAgIG1lbXNldCggY3BxZmNIQkFkYXRhLCAwLCBzaXplb2YoIENQUUZDSEJBICkgKTsKKworCisgICAgICAvLyBpbml0aWFsaXplIG91ciBIQkEgaW5mbworICAgICAgY3BxZmNIQkFkYXRhLT5IQkFudW0gPSBOdW1iZXJPZkFkYXB0ZXJzOworCisgICAgICBjcHFmY0hCQWRhdGEtPkhvc3RBZGFwdGVyID0gSG9zdEFkYXB0ZXI7IC8vIGJhY2sgcHRyCisgICAgICBDcHFmY19pbml0SEJBZGF0YSggY3BxZmNIQkFkYXRhLCBQY2lEZXYgKTsgLy8gZmlsbCBNT1NUIGZpZWxkcworICAgICAKKyAgICAgIGNwcWZjSEJBZGF0YS0+SEJBbnVtID0gTnVtYmVyT2ZBZGFwdGVyczsKKyAgICAgIHNwaW5fbG9ja19pbml0KCZjcHFmY0hCQWRhdGEtPmhiYV9zcGlubG9jayk7CisKKyAgICAgIC8vIHJlcXVlc3QgbmVjZXNzYXJ5IHJlc291cmNlcyBhbmQgY2hlY2sgZm9yIGNvbmZsaWN0cworICAgICAgaWYoIHJlcXVlc3RfaXJxKCBIb3N0QWRhcHRlci0+aXJxLAorCQkgICAgICAgY3BxZmNUU19pbnRyX2hhbmRsZXIsCisJICAgICAgICAgICAgICAgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisJICAgICAgICAgICAgICAgREVWX05BTUUsCisJCSAgICAgICBIb3N0QWRhcHRlcikgKQorICAgICAgeworCXByaW50ayhLRVJOX1dBUk5JTkcgImNwcWZjOiBJUlEgJXUgYWxyZWFkeSB1c2VkXG4iLCBIb3N0QWRhcHRlci0+aXJxKTsKKwlnb3RvIGVycl91bnJlZ2lzdGVyOworICAgICAgfQorCisgICAgICAvLyBTaW5jZSB3ZSBoYXZlIHR3byAyNTYtYnl0ZSBJL08gcG9ydCByYW5nZXMgKHVwcGVyCisgICAgICAvLyBhbmQgbG93ZXIpLCBjaGVjayB0aGVtIGJvdGgKKyAgICAgIGlmKCAhcmVxdWVzdF9yZWdpb24oIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5JT0Jhc2VVLAorICAgICAgCSAgICAgICAgICAgICAgICAgICAweGZmLCBERVZfTkFNRSApICkKKyAgICAgIHsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJjcHFmYzogYWRkcmVzcyBpbiB1c2U6ICV4XG4iLAorCQkJY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLklPQmFzZVUpOworCWdvdG8gZXJyX2ZyZWVfaXJxOworICAgICAgfQkKKyAgICAgIAorICAgICAgaWYoICFyZXF1ZXN0X3JlZ2lvbiggY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLklPQmFzZUwsCisgICAgICAJCQkgICAweGZmLCBERVZfTkFNRSApICkKKyAgICAgIHsKKyAgCXByaW50ayhLRVJOX1dBUk5JTkcgImNwcWZjOiBhZGRyZXNzIGluIHVzZTogJXhcbiIsCisJICAgICAgCQkJY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLklPQmFzZUwpOworCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uX1U7CisgICAgICB9CQorICAgICAgCisgICAgICAvLyBPSywgd2UgaGF2ZSBncmFiYmVkIGV2ZXJ5dGhpbmcgd2UgbmVlZCBub3cuCisgICAgICBERUJVR19QQ0kocHJpbnRrKCIgIFJlc2VydmVkIDI1NSBJL08gYWRkcmVzc2VzIEAgJXhcbiIsCisgICAgICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5JT0Jhc2VMICkpOworICAgICAgREVCVUdfUENJKHByaW50aygiICBSZXNlcnZlZCAyNTUgSS9PIGFkZHJlc3NlcyBAICV4XG4iLAorICAgICAgICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuSU9CYXNlVSApKTsKKworICAgICAKKyAKKyAgICAgIC8vIHN0YXJ0IG91ciBrZXJuZWwgd29ya2VyIHRocmVhZAorCisgICAgICBzcGluX2xvY2tfaXJxKEhvc3RBZGFwdGVyLT5ob3N0X2xvY2spOworICAgICAgbGF1bmNoX0ZDd29ya2VyX3RocmVhZChIb3N0QWRhcHRlcik7CisKKworICAgICAgLy8gc3RhcnQgb3VyIFRpbWVyVGFzay4uLgorCisgICAgICBjcHFmY1RTdGltZXIgPSAmY3BxZmNIQkFkYXRhLT5jcHFmY1RTdGltZXI7CisKKyAgICAgIGluaXRfdGltZXIoIGNwcWZjVFN0aW1lcik7IC8vIExpbnV4IGNsZWFycyBuZXh0L3ByZXYgdmFsdWVzCisgICAgICBjcHFmY1RTdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7IC8vIG9uZSBzZWNvbmQKKyAgICAgIGNwcWZjVFN0aW1lci0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKWNwcWZjSEJBZGF0YTsgLy8gdGhpcyBhZGFwdGVyCisgICAgICBjcHFmY1RTdGltZXItPmZ1bmN0aW9uID0gY3BxZmNUU2hlYXJ0YmVhdDsgLy8gaGFuZGxlcyB0aW1lb3V0cywgaG91c2VrZWVwaW5nCisKKyAgICAgIGFkZF90aW1lciggY3BxZmNUU3RpbWVyKTsgIC8vIGdpdmUgaXQgdG8gTGludXgKKworCisgICAgICAvLyBub3cgaW5pdGlhbGl6ZSBvdXIgaGFyZHdhcmUuLi4KKyAgICAgIGlmIChjcHFmY0hCQWRhdGEtPmZjQ2hpcC5Jbml0aWFsaXplVGFjaHlvbiggY3BxZmNIQkFkYXRhLCAxLDEpKSB7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiY3BxZmM6IGluaXRpYWxpemF0aW9uIG9mIEhCQSBoYXJkd2FyZSBmYWlsZWQuXG4iKTsKKwlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbl9MOworICAgICAgfQorCisgICAgICBjcHFmY0hCQWRhdGEtPmZjU3RhdHNUaW1lID0gamlmZmllczsgIC8vIChmb3IgRkMgU3RhdGlzdGljcyBkZWx0YSkKKyAgICAgIAorICAgICAgLy8gZ2l2ZSBvdXIgSEJBIHRpbWUgdG8gaW5pdGlhbGl6ZSBhbmQgbG9naW4gY3VycmVudCBkZXZpY2VzLi4uCisgICAgICB7CisJLy8gVGhlIEJyb2NhZGUgc3dpdGNoIChlLmcuIDI0MDAsIDIwMTAsIGV0Yy4pIGFzIG9mIE1hcmNoIDIwMDAsCisJLy8gaGFzIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtIGZvciBGTF9Qb3J0IHN0YXJ0dXA6CisJLy8gVGltZShzZWMpIEFjdGlvbgorCS8vIDA6ICAgICAgICBEZXZpY2UgUGx1Z2luIGFuZCBMSVAoRjcsRjcpIHRyYW5zbWlzc2lvbgorCS8vIDEuMCAgICAgICBMSVAgaW5jb21pbmcKKyAgICAgICAgLy8gMS4wMjcgICAgIExJU0EgaW5jb21pbmcsIG5vIENMUyEgKGxpbmsgbm90IHVwKQorCS8vIDEuMDI4ICAgICBOT1MgaW5jb21pbmcgKHN3aXRjaCB0ZXN0IGZvciBOX1BvcnQpCisgICAgICAgIC8vIDEuNTc3ICAgICBFRF9UT1YgZXhwaXJlZCwgdHJhbnNtaXQgTElQcyBhZ2FpbgkKKwkvLyAzLjAgICAgICAgTElQKEY4LEY3KSBpbmNvbWluZyAoc3dpdGNoIHBhc3NlcyBUYWNoIFByaW0uU2lnKQorCS8vIDMuMDI4ICAgICBMSUxQIHJlY2VpdmVkLCBsaW5rIHVwLCBGTE9HSSBzdGFydHMKKwkvLyBzbG93ZXN0KHdvcnN0KSBjYXNlLCBtZWFzdXJlZCBvbiAxR2IgRmluaXNhciBHVCBhbmFseXplcgorCQorCXVuc2lnbmVkIGxvbmcgc3RvcF90aW1lOworCisJc3Bpbl91bmxvY2tfaXJxKEhvc3RBZGFwdGVyLT5ob3N0X2xvY2spOworCXN0b3BfdGltZSA9IGppZmZpZXMgKyA0KkhaOworICAgICAgICB3aGlsZSAoIHRpbWVfYmVmb3JlKGppZmZpZXMsIHN0b3BfdGltZSkgKSAKKwkgIAlzY2hlZHVsZSgpOyAgLy8gKG91ciB3b3JrZXIgdGFzayBuZWVkcyB0byBydW4pCisKKyAgICAgIH0KKyAgICAgIAorICAgICAgc3Bpbl9sb2NrX2lycShIb3N0QWRhcHRlci0+aG9zdF9sb2NrKTsKKyAgICAgIE51bWJlck9mQWRhcHRlcnMrKzsgCisgICAgICBzcGluX3VubG9ja19pcnEoSG9zdEFkYXB0ZXItPmhvc3RfbG9jayk7CisKKyAgICAgIGNvbnRpbnVlOworCitlcnJfcmVsZWFzZV9yZWdpb25fTDoKKyAgICAgIHJlbGVhc2VfcmVnaW9uKCBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuSU9CYXNlTCwgMHhmZiApOworZXJyX3JlbGVhc2VfcmVnaW9uX1U6CisgICAgICByZWxlYXNlX3JlZ2lvbiggY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLklPQmFzZVUsIDB4ZmYgKTsKK2Vycl9mcmVlX2lycToKKyAgICAgIGZyZWVfaXJxKCBIb3N0QWRhcHRlci0+aXJxLCBIb3N0QWRhcHRlcik7CitlcnJfdW5yZWdpc3RlcjoKKyAgICAgIHNjc2lfdW5yZWdpc3RlciggSG9zdEFkYXB0ZXIpOworZXJyX2Rpc2FibGVfZGV2OgorICAgICAgcGNpX2Rpc2FibGVfZGV2aWNlKCBQY2lEZXYgKTsKK2Vycl9jb250aW51ZToKKyAgICAgIGNvbnRpbnVlOworICAgIH0gLy8gZW5kIG9mIHdoaWxlKCkKKyAgfQorCisgIExFQVZFKCJjcHFmY1RTX2RldGVjdCIpOworIAorICByZXR1cm4gTnVtYmVyT2ZBZGFwdGVyczsKK30KKworI2lmZGVmIFNVUFBPUlRfUkVTRVQKK3N0YXRpYyB2b2lkIG15X2lvY3RsX2RvbmUgKFNjc2lfQ21uZCAqIFNDcG50KQoreworICAgIHN0cnVjdCByZXF1ZXN0ICogcmVxOworICAgIAorICAgIHJlcSA9IFNDcG50LT5yZXF1ZXN0OworICAgIHJlcS0+cnFfc3RhdHVzID0gUlFfU0NTSV9ET05FOyAvKiBCdXN5LCBidXQgaW5kaWNhdGUgcmVxdWVzdCBkb25lICovCisgIAorICAgIGlmIChyZXEtPkNQUUZDX1dBSVRJTkcgIT0gTlVMTCkKKwlDUFFGQ19DT01QTEVURShyZXEtPkNQUUZDX1dBSVRJTkcpOworfSAgIAorI2VuZGlmCisKK3N0YXRpYyBpbnQgY3BxZmNfYWxsb2NfcHJpdmF0ZV9kYXRhX3Bvb2woQ1BRRkNIQkEgKmhiYSkKK3sKKwloYmEtPnByaXZhdGVfZGF0YV9iaXRzID0gTlVMTDsKKwloYmEtPnByaXZhdGVfZGF0YV9wb29sID0gTlVMTDsKKwloYmEtPnByaXZhdGVfZGF0YV9iaXRzID0gCisJCWttYWxsb2MoKChDUFFGQ19NQVhfUEFTU1RIUlVfQ01EUytCSVRTX1BFUl9MT05HLTEpIC8KKwkJCQlCSVRTX1BFUl9MT05HKSpzaXplb2YodW5zaWduZWQgbG9uZyksIAorCQkJCUdGUF9LRVJORUwpOworCWlmIChoYmEtPnByaXZhdGVfZGF0YV9iaXRzID09IE5VTEwpCisJCXJldHVybiAtMTsKKwltZW1zZXQoaGJhLT5wcml2YXRlX2RhdGFfYml0cywgMCwKKwkJKChDUFFGQ19NQVhfUEFTU1RIUlVfQ01EUytCSVRTX1BFUl9MT05HLTEpIC8KKwkJCQlCSVRTX1BFUl9MT05HKSpzaXplb2YodW5zaWduZWQgbG9uZykpOworCWhiYS0+cHJpdmF0ZV9kYXRhX3Bvb2wgPSBrbWFsbG9jKHNpemVvZihjcHFmY19wYXNzdGhydV9wcml2YXRlX3QpICoKKwkJCUNQUUZDX01BWF9QQVNTVEhSVV9DTURTLCBHRlBfS0VSTkVMKTsKKwlpZiAoaGJhLT5wcml2YXRlX2RhdGFfcG9vbCA9PSBOVUxMKSB7CisJCWtmcmVlKGhiYS0+cHJpdmF0ZV9kYXRhX2JpdHMpOworCQloYmEtPnByaXZhdGVfZGF0YV9iaXRzID0gTlVMTDsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY3BxZmNfZnJlZV9wcml2YXRlX2RhdGFfcG9vbChDUFFGQ0hCQSAqaGJhKQoreworCWtmcmVlKGhiYS0+cHJpdmF0ZV9kYXRhX2JpdHMpOworCWtmcmVlKGhiYS0+cHJpdmF0ZV9kYXRhX3Bvb2wpOworfQorCitpbnQgaXNfcHJpdmF0ZV9kYXRhX29mX2NwcWZjKENQUUZDSEJBICpoYmEsIHZvaWQgKnBvaW50ZXIpCit7CisJLyogSXMgcG9pbnRlciB3aXRoaW4gb3VyIHByaXZhdGUgZGF0YSBwb29sPworCSAgIFdlIHVzZSBTY3NpX1JlcXVlc3QtPnVwcGVyX3ByaXZhdGVfZGF0YSAobm9ybWFsbHkKKwkgICByZXNlcnZlZCBmb3IgdXBwZXIgbGF5ZXIgZHJpdmVycywgZS5nLiB0aGUgc2cgZHJpdmVyKQorCSAgIFdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgcG9pbnRlciBpcyBvdXJzIGJ5IGxvb2tpbmcgYXQKKwkgICBpdHMgYWRkcmVzcy4gIElzIHRoaXMgb2s/ICAgSG1tLCBpdCBvY2N1cnMgdG8gbWUgdGhhdAorCSAgIGEgdXNlciBhcHAgbWlnaHQgZG8gc29tZXRoaW5nIGJhZCBieSB1c2luZyBzZyB0byBzZW5kCisJICAgYSBjcHFmYyBwYXNzdGhyb3VnaCBpb2N0bCB3aXRoIHVwcGVyX2RhdGFfcHJpdmF0ZQorCSAgIGZvcmdlZCB0byBiZSBzb21ld2hlcmUgaW4gb3VyIHBvb2wuLi4sIHRob3VnaCB0aGV5J2QKKwkgICBub3JtYWxseSBoYXZlIHRvIGJlIHJvb3QgYWxyZWFkeSB0byBkbyB0aGlzLiAgKi8KKworCXJldHVybiAocG9pbnRlciAhPSBOVUxMICYmIAorCQlwb2ludGVyID49ICh2b2lkICopIGhiYS0+cHJpdmF0ZV9kYXRhX3Bvb2wgJiYgCisJCXBvaW50ZXIgPCAodm9pZCAqKSBoYmEtPnByaXZhdGVfZGF0YV9wb29sICsgCisJCQlzaXplb2YoKmhiYS0+cHJpdmF0ZV9kYXRhX3Bvb2wpICogCisJCQkJQ1BRRkNfTUFYX1BBU1NUSFJVX0NNRFMpOworfQorCitjcHFmY19wYXNzdGhydV9wcml2YXRlX3QgKmNwcWZjX2FsbG9jX3ByaXZhdGVfZGF0YShDUFFGQ0hCQSAqaGJhKQoreworCWludCBpOworCisJZG8geworCQlpID0gZmluZF9maXJzdF96ZXJvX2JpdChoYmEtPnByaXZhdGVfZGF0YV9iaXRzLCAKKwkJCUNQUUZDX01BWF9QQVNTVEhSVV9DTURTKTsKKwkJaWYgKGkgPT0gQ1BRRkNfTUFYX1BBU1NUSFJVX0NNRFMpCisJCQlyZXR1cm4gTlVMTDsKKwl9IHdoaWxlICggdGVzdF9hbmRfc2V0X2JpdChpICYgKEJJVFNfUEVSX0xPTkcgLSAxKSwgCisJCQloYmEtPnByaXZhdGVfZGF0YV9iaXRzKyhpL0JJVFNfUEVSX0xPTkcpKSAhPSAwKTsKKwlyZXR1cm4gJmhiYS0+cHJpdmF0ZV9kYXRhX3Bvb2xbaV07Cit9CisKK3ZvaWQgY3BxZmNfZnJlZV9wcml2YXRlX2RhdGEoQ1BRRkNIQkEgKmhiYSwgY3BxZmNfcGFzc3RocnVfcHJpdmF0ZV90ICpkYXRhKQoreworCWludCBpOworCWkgPSBkYXRhIC0gaGJhLT5wcml2YXRlX2RhdGFfcG9vbDsKKwljbGVhcl9iaXQoaSYoQklUU19QRVJfTE9ORy0xKSwgCisJCQloYmEtPnByaXZhdGVfZGF0YV9iaXRzKyhpL0JJVFNfUEVSX0xPTkcpKTsKK30KKworaW50IGNwcWZjVFNfaW9jdGwoIHN0cnVjdCBzY3NpX2RldmljZSAqU2NzaURldiwgaW50IENtbmQsIHZvaWQgKmFyZykKK3sKKyAgaW50IHJlc3VsdCA9IDA7CisgIHN0cnVjdCBTY3NpX0hvc3QgKkhvc3RBZGFwdGVyID0gU2NzaURldi0+aG9zdDsKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSA9IChDUFFGQ0hCQSAqKUhvc3RBZGFwdGVyLT5ob3N0ZGF0YTsKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0ID0gTlVMTDsKKyAgc3RydWN0IHNjc2lfY21uZCAqRHVtQ21uZDsKKyAgaW50IGksIGo7CisgIFZFTkRPUl9JT0NUTF9SRVEgaW9jOworICBjcHFmY19wYXNzdGhydV90ICp2ZW5kb3JfY21kOworICBTY3NpX0RldmljZSAqU0RwbnQ7CisgIFNjc2lfUmVxdWVzdCAqU2NzaVBhc3NUaHJ1UmVxOworICBjcHFmY19wYXNzdGhydV9wcml2YXRlX3QgKnByaXZhdGVkYXRhOworCisgIEVOVEVSKCJjcHFmY1RTX2lvY3RsICIpOworCisgICAgLy8gcHJpbnRrKCJpb2N0bCBDTU5EICVkIiwgQ21uZCk7CisgICAgc3dpdGNoIChDbW5kKSB7CisgICAgICAvLyBQYXNzdGhyb3VnaCBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBieXBhc3MgdGhlIFJBSUQKKyAgICAgIC8vIG9yIG90aGVyIGNvbnRyb2xsZXIgYW5kIHRhbGsgZGlyZWN0bHkgdG8gdGhlIGRldmljZXMKKyAgICAgIC8vIChlLmcuIHBoeXNpY2FsIGRpc2sgZHJpdmUpCisgICAgICAvLyBQYXNzdGhyb3VnaCBjb21tYW5kcywgdW5mb3J0dW5hdGVseSwgdGVuZCB0byBiZSB2ZW5kb3IKKyAgICAgIC8vIHNwZWNpZmljOyB0aGlzIGlzIHRhaWxvcmVkIHRvIENPTVBBUSdzIFJBSUQgKFJBNHgwMCkKKyAgICAgIGNhc2UgQ1BRRkNUU19TQ1NJX1BBU1NUSFJVOgorICAgICAgeworCXZvaWQgKmJ1ZiA9IE5VTEw7IC8vIGZvciBrZXJuZWwgc3BhY2UgYnVmZmVyIGZvciB1c2VyIGRhdGEKKworCS8qIENoZWNrIHRoYXQgb3VyIHBvb2wgZ290IGFsbG9jYXRlZCBvay4gKi8KKwlpZiAoY3BxZmNIQkFkYXRhLT5wcml2YXRlX2RhdGFfcG9vbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwkKKwlpZiggIWFyZykKKwkgIHJldHVybiAtRUlOVkFMOworCisJLy8gbXVzdCBiZSBzdXBlciB1c2VyIHRvIHNlbmQgc3R1ZmYgZGlyZWN0bHkgdG8gdGhlCisJLy8gY29udHJvbGxlciBhbmQvb3IgcGh5c2ljYWwgZHJpdmVzLi4uCisJaWYoICFjYXBhYmxlKENBUF9TWVNfUkFXSU8pICkKKwkgIHJldHVybiAtRVBFUk07CisKKwkvLyBjb3B5IHRoZSBjYWxsZXIncyBzdHJ1Y3QgdG8gb3VyIHNwYWNlLgorICAgICAgICBpZiggY29weV9mcm9tX3VzZXIoICZpb2MsIGFyZywgc2l6ZW9mKCBWRU5ET1JfSU9DVExfUkVRKSkpCisJCXJldHVybiggLUVGQVVMVCk7CisKKwl2ZW5kb3JfY21kID0gaW9jLmFyZ3A7ICAvLyBpLmUuLCBDUFEgc3BlY2lmaWMgY29tbWFuZCBzdHJ1Y3QKKworCS8vIElmIG5lY2Vzc2FyeSwgZ3JhYiBhIGtlcm5lbC9ETUEgYnVmZmVyCisJaWYoIHZlbmRvcl9jbWQtPmxlbikKKwl7CisgIAkgIGJ1ZiA9IGttYWxsb2MoIHZlbmRvcl9jbWQtPmxlbiwgR0ZQX0tFUk5FTCk7CisJICBpZiggIWJ1ZikKKwkgICAgcmV0dXJuIC1FTk9NRU07CisJfQorICAgICAgICAvLyBOb3cgYnVpbGQgYSBTY3NpX1JlcXVlc3QgdG8gcGFzcyBkb3duLi4uCisgICAgICAgIFNjc2lQYXNzVGhydVJlcSA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChTY3NpRGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoU2NzaVBhc3NUaHJ1UmVxID09IE5VTEwpIHsKKwkJa2ZyZWUoYnVmKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCVNjc2lQYXNzVGhydVJlcS0+dXBwZXJfcHJpdmF0ZV9kYXRhID0gCisJCQljcHFmY19hbGxvY19wcml2YXRlX2RhdGEoY3BxZmNIQkFkYXRhKTsKKwlpZiAoU2NzaVBhc3NUaHJ1UmVxLT51cHBlcl9wcml2YXRlX2RhdGEgPT0gTlVMTCkgeworCQlrZnJlZShidWYpOworCQlzY3NpX3JlbGVhc2VfcmVxdWVzdChTY3NpUGFzc1RocnVSZXEpOyAvLyAiZGUtYWxsb2NhdGUiCisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmICh2ZW5kb3JfY21kLT5yd19mbGFnID09IFZFTkRPUl9XUklURV9PUENPREUpIHsKKwkJaWYgKHZlbmRvcl9jbWQtPmxlbikgeyAvLyBOZWVkIGRhdGEgZnJvbSB1c2VyPworICAgICAgICAJCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHZlbmRvcl9jbWQtPmJ1ZnAsIAorCQkJCQkJdmVuZG9yX2NtZC0+bGVuKSkgeworCQkJCWtmcmVlKGJ1Zik7CisJCQkJY3BxZmNfZnJlZV9wcml2YXRlX2RhdGEoY3BxZmNIQkFkYXRhLCAKKwkJCQkJU2NzaVBhc3NUaHJ1UmVxLT51cHBlcl9wcml2YXRlX2RhdGEpOworCQkJCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNjc2lQYXNzVGhydVJlcSk7CisJCQkJcmV0dXJuKCAtRUZBVUxUKTsKKwkJCX0KKwkJfQorCQlTY3NpUGFzc1RocnVSZXEtPnNyX2RhdGFfZGlyZWN0aW9uID0gU0NTSV9EQVRBX1dSSVRFOyAKKwl9IGVsc2UgaWYgKHZlbmRvcl9jbWQtPnJ3X2ZsYWcgPT0gVkVORE9SX1JFQURfT1BDT0RFKSB7CisJCVNjc2lQYXNzVGhydVJlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfUkVBRDsgCisJfSBlbHNlCisJCS8vIG1heWJlIHRoaXMgbWVhbnMgYSBidWcgaW4gdGhlIHVzZXIgYXBwCisJCVNjc2lQYXNzVGhydVJlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfTk9ORTsKKwkgICAgCisJU2NzaVBhc3NUaHJ1UmVxLT5zcl9jbWRfbGVuID0gMDsgLy8gc2V0IGNvcnJlY3RseSBieSBzY3NpX2RvX3JlcSgpCisJU2NzaVBhc3NUaHJ1UmVxLT5zcl9zZW5zZV9idWZmZXJbMF0gPSAwOworCVNjc2lQYXNzVGhydVJlcS0+c3Jfc2Vuc2VfYnVmZmVyWzJdID0gMDsKKworICAgICAgICAvLyBXZSBjb3B5IHRoZSBzY2hlbWUgdXNlZCBieSBzZC5jOnNwaW51cF9kaXNrKCkgdG8gc3VibWl0IGNvbW1hbmRzCisJLy8gdG8gb3VyIG93biBIQkEuICBXZSBkbyB0aGlzIGluIG9yZGVyIHRvIHN0YWxsIHRoZQorCS8vIHRocmVhZCBjYWxsaW5nIHRoZSBJT0NUTCB1bnRpbCBpdCBjb21wbGV0ZXMsIGFuZCB1c2UKKwkvLyB0aGUgc2FtZSAiX3F1ZWNvbW1hbmQiIGZ1bmN0aW9uIGZvciBzeW5jaHJvbml6aW5nCisJLy8gRkMgTGluayBldmVudHMgd2l0aCBvdXIgIndvcmtlciB0aHJlYWQiLgorCisJcHJpdmF0ZWRhdGEgPSBTY3NpUGFzc1RocnVSZXEtPnVwcGVyX3ByaXZhdGVfZGF0YTsKKwlwcml2YXRlZGF0YS0+YnVzID0gdmVuZG9yX2NtZC0+YnVzOworCXByaXZhdGVkYXRhLT5wZHJpdmUgPSB2ZW5kb3JfY21kLT5wZHJpdmU7CisJCisgICAgICAgIC8vIGV2ZW50dWFsbHkgZ2V0cyB1cyB0byBvdXIgb3duIF9xdWVjb21tYW5kIHJvdXRpbmUKKwlzY3NpX3dhaXRfcmVxKFNjc2lQYXNzVGhydVJlcSwgCisJCSZ2ZW5kb3JfY21kLT5jZGJbMF0sIGJ1ZiwgdmVuZG9yX2NtZC0+bGVuLCAKKwkJMTAqSFosICAvLyB0aW1lb3V0CisJCTEpOwkvLyByZXRyaWVzCisgICAgICAgIHJlc3VsdCA9IFNjc2lQYXNzVGhydVJlcS0+c3JfcmVzdWx0OworCisgICAgICAgIC8vIGNvcHkgYW55IHNlbnNlIGRhdGEgYmFjayB0byBjYWxsZXIKKyAgICAgICAgaWYoIHJlc3VsdCAhPSAwICkKKwl7CisJICBtZW1jcHkoIHZlbmRvcl9jbWQtPnNlbnNlX2RhdGEsIC8vIHNlZSBzdHJ1Y3QgZGVmIC0gc2l6ZT00MAorCQkgIFNjc2lQYXNzVGhydVJlcS0+c3Jfc2Vuc2VfYnVmZmVyLCAKKwkJICBzaXplb2YoU2NzaVBhc3NUaHJ1UmVxLT5zcl9zZW5zZV9idWZmZXIpIDwKKyAgICAgICAgICAgICAgICAgIHNpemVvZih2ZW5kb3JfY21kLT5zZW5zZV9kYXRhKSAgICAgICAgICAgPworICAgICAgICAgICAgICAgICAgc2l6ZW9mKFNjc2lQYXNzVGhydVJlcS0+c3Jfc2Vuc2VfYnVmZmVyKSA6CisgICAgICAgICAgICAgICAgICBzaXplb2YodmVuZG9yX2NtZC0+c2Vuc2VfZGF0YSkKKyAgICAgICAgICAgICAgICApOyAKKwl9CisgICAgICAgIFNEcG50ID0gU2NzaVBhc3NUaHJ1UmVxLT5zcl9kZXZpY2U7CisJLyogdXBwZXJfcHJpdmF0ZV9kYXRhIGlzIGFscmVhZHkgZnJlZWQgaW4gY2FsbF9zY3NpX2RvbmUoKSAqLworICAgICAgICBzY3NpX3JlbGVhc2VfcmVxdWVzdChTY3NpUGFzc1RocnVSZXEpOyAvLyAiZGUtYWxsb2NhdGUiCisgICAgICAgIFNjc2lQYXNzVGhydVJlcSA9IE5VTEw7CisKKwkvLyBuZWVkIHRvIHBhc3MgZGF0YSBiYWNrIHRvIHVzZXIgKHNwYWNlKT8KKwlpZiggKHZlbmRvcl9jbWQtPnJ3X2ZsYWcgPT0gVkVORE9SX1JFQURfT1BDT0RFKSAmJgorCSAgICAgdmVuZG9yX2NtZC0+bGVuICkKKyAgICAgICAgaWYoICBjb3B5X3RvX3VzZXIoIHZlbmRvcl9jbWQtPmJ1ZnAsIGJ1ZiwgdmVuZG9yX2NtZC0+bGVuKSkKKwkJcmVzdWx0ID0gLUVGQVVMVDsKKworICAgICAgICBpZiggYnVmKSAKKwkgIGtmcmVlKCBidWYpOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgICAKKyAgICAgIGNhc2UgQ1BRRkNUU19HRVRQQ0lJTkZPOgorICAgICAgeworCWNwcWZjX3BjaV9pbmZvX3N0cnVjdCBwY2lpbmZvOworCQorCWlmKCAhYXJnKQorCSAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgIAkKKwkKKyAgICAgICAgcGNpaW5mby5idXMgPSBjcHFmY0hCQWRhdGEtPlBjaURldi0+YnVzLT5udW1iZXI7CisgICAgICAgIHBjaWluZm8uZGV2X2ZuID0gY3BxZmNIQkFkYXRhLT5QY2lEZXYtPmRldmZuOyAgCisJcGNpaW5mby5ib2FyZF9pZCA9IGNwcWZjSEJBZGF0YS0+UGNpRGV2LT5kZXZpY2UgfAorCQkJICAoY3BxZmNIQkFkYXRhLT5QY2lEZXYtPnZlbmRvciA8PDE2KTsgCisJICAgICAgCisgICAgICAgIGlmKGNvcHlfdG9fdXNlciggYXJnLCAmcGNpaW5mbywgc2l6ZW9mKGNwcWZjX3BjaV9pbmZvX3N0cnVjdCkpKQorCQlyZXR1cm4oIC1FRkFVTFQpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgY2FzZSBDUFFGQ1RTX0dFVERSSVZWRVI6CisgICAgICB7CisJRHJpdmVyVmVyX3R5cGUgRHJpdmVyVmVyID0gCisJCUNQUUZDVFNfRFJJVkVSX1ZFUiggVkVSX01BSk9SLFZFUl9NSU5PUixWRVJfU1VCTUlOT1IpOworCQorCWlmKCAhYXJnKQorCSAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgaWYoY29weV90b191c2VyKCBhcmcsICZEcml2ZXJWZXIsIHNpemVvZihEcml2ZXJWZXIpKSkKKwkJcmV0dXJuKCAtRUZBVUxUKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKworCisgICAgICBjYXNlIENQUUZDX0lPQ1RMX0ZDX1RBUkdFVF9BRERSRVNTOgorCS8vIGNhbiB3ZSBmaW5kIGFuIEZDIGRldmljZSBtYXBwaW5nIHRvIHRoaXMgU0NTSSB0YXJnZXQ/CisvKiAJRHVtQ21uZC5jaGFubmVsID0gU2NzaURldi0+Y2hhbm5lbDsgKi8JCS8vIEZvciBzZWFyY2hpbmcKKy8qIAlEdW1DbW5kLnRhcmdldCAgPSBTY3NpRGV2LT5pZDsgKi8KKy8qIAlEdW1DbW5kLmx1biAgICAgPSBTY3NpRGV2LT5sdW47ICovCisKKwlEdW1DbW5kID0gc2NzaV9nZXRfY29tbWFuZCAoU2NzaURldiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFEdW1DbW5kKQorCQlyZXR1cm4gLUVOT01FTTsKKwkKKwlwTG9nZ2VkSW5Qb3J0ID0gZmNGaW5kTG9nZ2VkSW5Qb3J0KCBmY0NoaXAsCisJCUR1bUNtbmQsIC8vIHNlYXJjaCBTY3NpIE5leHVzCisJCTAsICAgICAgICAvLyBET04nVCBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIEZDIHBvcnQgaWQKKwkJTlVMTCwgICAgIC8vIERPTidUIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgRkMgV1dOCisJCU5VTEwpOyAgICAvLyBET04nVCBjYXJlIGFib3V0IGVuZCBvZiBsaXN0CisJc2NzaV9wdXRfY29tbWFuZCAoRHVtQ21uZCk7CisJaWYgKHBMb2dnZWRJblBvcnQgPT0gTlVMTCkgeworCQlyZXN1bHQgPSAtRU5YSU87CisJCWJyZWFrOworCX0KKwlyZXN1bHQgPSBhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhcmcsIHNpemVvZihTY3NpX0ZDVGFyZ0FkZHJlc3MpKSA/IDAgOiAtRUZBVUxUOworCWlmIChyZXN1bHQpIGJyZWFrOworIAorICAgICAgcHV0X3VzZXIocExvZ2dlZEluUG9ydC0+cG9ydF9pZCwKKwkJJigoU2NzaV9GQ1RhcmdBZGRyZXNzICopIGFyZyktPmhvc3RfcG9ydF9pZCk7CisgCisgICAgICBmb3IoIGk9MyxqPTA7IGk+PTA7IGktLSkgICAJLy8gY29weSB0aGUgTE9HSU4gcG9ydCdzIFdXTgorICAgICAgICBwdXRfdXNlcihwTG9nZ2VkSW5Qb3J0LT51LnVjV1dOW2ldLCAKKwkJJigoU2NzaV9GQ1RhcmdBZGRyZXNzICopIGFyZyktPmhvc3Rfd3duW2orK10pOworICAgICAgZm9yKCBpPTc7IGk+MzsgaS0tKQkJLy8gY29weSB0aGUgTE9HSU4gcG9ydCdzIFdXTgorICAgICAgICBwdXRfdXNlcihwTG9nZ2VkSW5Qb3J0LT51LnVjV1dOW2ldLCAKKwkJJigoU2NzaV9GQ1RhcmdBZGRyZXNzICopIGFyZyktPmhvc3Rfd3duW2orK10pOworICAgICAgICBicmVhazsKKworCisgICAgICBjYXNlIENQUUZDX0lPQ1RMX0ZDX1REUjoKKyAgICAgICAgICAKKyAgICAgICAgcmVzdWx0ID0gY3BxZmNUU19UYXJnZXREZXZpY2VSZXNldCggU2NzaURldiwgMCk7CisKKyAgICAgICAgYnJlYWs7CisKKworCisKKyAgICBkZWZhdWx0OgorICAgICAgcmVzdWx0ID0gLUVJTlZBTDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBMRUFWRSgiY3BxZmNUU19pb2N0bCIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qICJSZWxlYXNlIiB0aGUgSG9zdCBCdXMgQWRhcHRlci4uLgorICAgZGlzYWJsZSBpbnRlcnJ1cHRzLCBzdG9wIHRoZSBIQkEsIHJlbGVhc2UgdGhlIGludGVycnVwdCwKKyAgIGFuZCBmcmVlIGFsbCByZXNvdXJjZXMgKi8KKworaW50IGNwcWZjVFNfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpIb3N0QWRhcHRlcikKK3sKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSA9IChDUFFGQ0hCQSAqKUhvc3RBZGFwdGVyLT5ob3N0ZGF0YTsgCisKKworICBFTlRFUigiY3BxZmNUU19yZWxlYXNlIik7CisJCisgIERFQlVHX1BDSSggcHJpbnRrKCIgY3BxZmNUUzogZGVsZXRlIHRpbWVyLi4uXG4iKSk7CisgIGRlbF90aW1lciggJmNwcWZjSEJBZGF0YS0+Y3BxZmNUU3RpbWVyKTsgIAorICAgIAorICAvLyBkaXNhYmxlIHRoZSBoYXJkd2FyZS4uLgorICBERUJVR19QQ0koIHByaW50aygiIGRpc2FibGUgaGFyZHdhcmUsIGRlc3Ryb3kgcXVldWVzLCBmcmVlIG1lbVxuIikpOworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZXNldFRhY2h5b24oIGNwcWZjSEJBZGF0YSwgQ0xFQVJfRkNQT1JUUyk7CisKKyAgLy8ga2lsbCBrZXJuZWwgdGhyZWFkCisgIGlmKCBjcHFmY0hCQWRhdGEtPndvcmtlcl90aHJlYWQgKSAvLyAob25seSBpZiBleGlzdHMpCisgIHsKKyAgICBERUNMQVJFX01VVEVYX0xPQ0tFRChzZW0pOyAgLy8gc3luY2hyb25pemUgdGhyZWFkIGtpbGwKKworICAgIGNwcWZjSEJBZGF0YS0+bm90aWZ5X3d0ID0gJnNlbTsKKyAgICBERUJVR19QQ0koIHByaW50aygiIGtpbGxpbmcga2VybmVsIHRocmVhZFxuIikpOworICAgIHNlbmRfc2lnKCBTSUdLSUxMLCBjcHFmY0hCQWRhdGEtPndvcmtlcl90aHJlYWQsIDEpOworICAgIGRvd24oICZzZW0pOworICAgIGNwcWZjSEJBZGF0YS0+bm90aWZ5X3d0ID0gTlVMTDsKKyAgICAKKyAgfQorCisgIGNwcWZjX2ZyZWVfcHJpdmF0ZV9kYXRhX3Bvb2woY3BxZmNIQkFkYXRhKTsKKyAgLy8gZnJlZSBMaW51eCByZXNvdXJjZXMKKyAgREVCVUdfUENJKCBwcmludGsoIiBjcHFmY1RTOiBmcmVlaW5nIHJlc291cmNlcy4uLlxuIikpOworICBmcmVlX2lycSggSG9zdEFkYXB0ZXItPmlycSwgSG9zdEFkYXB0ZXIpOworICBzY3NpX3VucmVnaXN0ZXIoIEhvc3RBZGFwdGVyKTsKKyAgcmVsZWFzZV9yZWdpb24oIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5JT0Jhc2VMLCAweGZmKTsKKyAgcmVsZWFzZV9yZWdpb24oIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5JT0Jhc2VVLCAweGZmKTsKKyAvKiB3ZSBnZXQgInZmcmVlOiBiYWQgYWRkcmVzcyIgZXhlY3V0aW5nIHRoaXMgLSBuZWVkIHRvIGludmVzdGlnYXRlLi4uIAorICBpZiggKHZvaWQqKSgodW5zaWduZWQgbG9uZyljcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuTWVtQmFzZSkgIT0KKyAgICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UpCisgICAgdmZyZWUoIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UpOworKi8KKyAgcGNpX2Rpc2FibGVfZGV2aWNlKCBjcHFmY0hCQWRhdGEtPlBjaURldik7CisKKyAgTEVBVkUoImNwcWZjVFNfcmVsZWFzZSIpOworICByZXR1cm4gMDsKK30KKworCitjb25zdCBjaGFyICogY3BxZmNUU19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKkhvc3RBZGFwdGVyKQoreworICBzdGF0aWMgY2hhciBidWZbMzAwXTsKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBOworICBpbnQgQnVzU3BlZWQsIEJ1c1dpZHRoOworICAKKyAgLy8gZ2V0IHRoZSBwb2ludGVyIHRvIG91ciBTY3NpIGxheWVyIEhCQSBidWZmZXIgIAorICBjcHFmY0hCQSA9IChDUFFGQ0hCQSAqKUhvc3RBZGFwdGVyLT5ob3N0ZGF0YTsKKworICBCdXNXaWR0aCA9IChjcHFmY0hCQS0+ZmNDaGlwLlJlZ2lzdGVycy5QQ0lNQ1RSICYweDQpID4gMCA/CisgICAgICAgICAgICAgICA2NCA6IDMyOworCisgIGlmKCBjcHFmY0hCQS0+ZmNDaGlwLlJlZ2lzdGVycy5UWWNvbmZpZy52YWx1ZSAmIDB4ODAwMDAwMDApCisgICAgQnVzU3BlZWQgPSA2NjsKKyAgZWxzZQorICAgIEJ1c1NwZWVkID0gMzM7CisKKyAgc3ByaW50ZihidWYsIAorIiVzOiBXV04gJTA4WCUwOFhcbiBvbiBQQ0kgYnVzICVkIGRldmljZSAweCUwMnggaXJxICVkIElPYmFzZUwgMHgleCwgTUVNQkFTRSAweCV4XG5QQ0kgYnVzIHdpZHRoICVkIGJpdHMsIGJ1cyBzcGVlZCAlZCBNSHpcbkZDUC1TQ1NJIERyaXZlciB2JWQuJWQuJWQiLAorICAgICAgY3BxZmNIQkEtPmZjQ2hpcC5OYW1lLCAKKyAgICAgIGNwcWZjSEJBLT5mY0NoaXAuUmVnaXN0ZXJzLnd3bl9oaSwKKyAgICAgIGNwcWZjSEJBLT5mY0NoaXAuUmVnaXN0ZXJzLnd3bl9sbywKKyAgICAgIGNwcWZjSEJBLT5QY2lEZXYtPmJ1cy0+bnVtYmVyLAorICAgICAgY3BxZmNIQkEtPlBjaURldi0+ZGV2aWNlLCAgCisgICAgICBIb3N0QWRhcHRlci0+aXJxLAorICAgICAgY3BxZmNIQkEtPmZjQ2hpcC5SZWdpc3RlcnMuSU9CYXNlTCwKKyAgICAgIGNwcWZjSEJBLT5mY0NoaXAuUmVnaXN0ZXJzLk1lbUJhc2UsCisgICAgICBCdXNXaWR0aCwKKyAgICAgIEJ1c1NwZWVkLAorICAgICAgVkVSX01BSk9SLCBWRVJfTUlOT1IsIFZFUl9TVUJNSU5PUgorKTsKKworICAKKyAgY3BxZmNUU0RlY29kZUdCSUN0eXBlKCAmY3BxZmNIQkEtPmZjQ2hpcCwgJmJ1Zlsgc3RybGVuKGJ1ZildKTsKKyAgY3BxZmNUU0dldExQU00oICZjcHFmY0hCQS0+ZmNDaGlwLCAmYnVmWyBzdHJsZW4oYnVmKV0pOworICByZXR1cm4gYnVmOworfQorCisvLworLy8gL3Byb2Mvc2NzaSBzdXBwb3J0LiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFsbG93IHVzIHRvIGRvICdub3JtYWwnCisvLyBzcHJpbnRmIGxpa2UgY2FsbHMgdG8gcmV0dXJuIHRoZSBjdXJyZW50bHkgcmVxdWVzdGVkIHBpZWNlIChidWZsZW5naHQKKy8vIGNoYXJzLCBzdGFydGluZyBhdCBidWZvZmZzZXQpIG9mIHRoZSBmaWxlLiBBbHRob3VnaCBwcm9jZnMgYWxsb3dzIGZvcgorLy8gYSAxIEtiIGJ5dGVzIG92ZXJmbG93IGFmdGVyIHRlIHN1cHBsaWVkIGJ1ZmZlciwgSSBjb25zaWRlciBpdCBiYWQgCisvLyBwcm9ncmFtbWluZyB0byB1c2UgaXQgdG8gbWFrZSBwcm9ncmFtbWluZyBhIGxpdHRsZSBzaW1wbGVyLiBUaGlzIHBpZWNlCisvLyBvZiBjb2RpbmcgaXMgYm9ycm93ZWQgZnJvbSBuY3I1M2M4eHguYyB3aXRoIHNvbWUgbW9kaWZpY2F0aW9ucyAKKy8vCitzdHJ1Y3QgaW5mb19zdHIKK3sKKyAgICAgICAgY2hhciAqYnVmZmVyOwkJCS8vIFBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlcgorICAgICAgICBpbnQgYnVmbGVuZ3RoOwkJCS8vIEl0J3MgbGVuZ3RoCisgICAgICAgIGludCBidWZvZmZzZXQ7CQkJLy8gRmlsZSBvZmZzZXQgY29ycmVzcG9uZGluZyB3aXRoIGJ1ZlswXQorCWludCBidWZmaWxsZW47CQkJLy8gQ3VycmVudCBmaWxsZWQgbGVuZ3RoIAorICAgICAgICBpbnQgZmlscG9zOwkJCS8vIEN1cnJlbnQgZmlsZSBvZmZzZXQKK307CisKK3N0YXRpYyB2b2lkIGNvcHlfbWVtX2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBjaGFyICpkYXRhLCBpbnQgZGF0YWxlbikKK3sKKworICBpZiAoaW5mby0+ZmlscG9zIDwgaW5mby0+YnVmb2Zmc2V0KSB7CS8vIEN1cnJlbnQgb2Zmc2V0IGJlZm9yZSBidWZmZXIgb2Zmc2V0CisgICAgaWYgKGluZm8tPmZpbHBvcyArIGRhdGFsZW4gPD0gaW5mby0+YnVmb2Zmc2V0KSB7CisgICAgICBpbmZvLT5maWxwb3MgKz0gZGF0YWxlbjsgCQkvLyBEaXNjYXJkIGlmIGNvbXBsZXRlbHkgYmVmb3JlIGJ1ZmZlcgorICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CQkJCS8vIFBhcnRpYWwgY29weSwgc2V0IHRvIGJlZ2luCisgICAgICBkYXRhICs9IChpbmZvLT5idWZvZmZzZXQgLSBpbmZvLT5maWxwb3MpOworICAgICAgZGF0YWxlbiAgLT0gKGluZm8tPmJ1Zm9mZnNldCAtIGluZm8tPmZpbHBvcyk7CisgICAgICBpbmZvLT5maWxwb3MgPSBpbmZvLT5idWZvZmZzZXQ7CisgICAgfQorICB9CisKKyAgaW5mby0+ZmlscG9zICs9IGRhdGFsZW47CQkvLyBVcGRhdGUgY3VycmVudCBvZmZzZXQKKworICBpZiAoaW5mby0+YnVmZmlsbGVuID09IGluZm8tPmJ1Zmxlbmd0aCkgLy8gQnVmZmVyIGZ1bGwsIGRpc2NhcmQKKyAgICByZXR1cm47CisKKyAgaWYgKGluZm8tPmJ1Zmxlbmd0aCAtIGluZm8tPmJ1ZmZpbGxlbiA8IGRhdGFsZW4pICAvLyBPdmVyZmxvd3MgYnVmZmVyID8KKyAgICBkYXRhbGVuID0gaW5mby0+YnVmbGVuZ3RoIC0gaW5mby0+YnVmZmlsbGVuOworCisgIG1lbWNweShpbmZvLT5idWZmZXIgKyBpbmZvLT5idWZmaWxsZW4sIGRhdGEsIGRhdGFsZW4pOworICBpbmZvLT5idWZmaWxsZW4gKz0gZGF0YWxlbjsKK30KKworc3RhdGljIGludCBjb3B5X2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICAgICAgdmFfbGlzdCBhcmdzOworICAgICAgICBjaGFyIGJ1Zls0MDBdOworICAgICAgICBpbnQgbGVuOworCisgICAgICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICAgICAgIGxlbiA9IHZzcHJpbnRmKGJ1ZiwgZm10LCBhcmdzKTsKKyAgICAgICAgdmFfZW5kKGFyZ3MpOworCisgICAgICAgIGNvcHlfbWVtX2luZm8oaW5mbywgYnVmLCBsZW4pOworICAgICAgICByZXR1cm4gbGVuOworfQorCisKKy8vIFJvdXRpbmUgdG8gZ2V0IGRhdGEgZm9yIC9wcm9jIFJBTSBmaWxlc3lzdGVtCisvLworaW50IGNwcWZjVFNfcHJvY19pbmZvIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCAKKwkJICAgICAgIGludCBpbm91dCkKK3sKKyAgc3RydWN0IHNjc2lfY21uZCAqRHVtQ21uZDsKKyAgc3RydWN0IHNjc2lfZGV2aWNlICpTY3NpRGV2OworICBpbnQgQ2hhbiwgVGFyZywgaTsKKyAgc3RydWN0IGluZm9fc3RyIGluZm87CisgIENQUUZDSEJBICpjcHFmY0hCQTsKKyAgUFRBQ0hZT04gZmNDaGlwOworICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0OworICBjaGFyIGJ1Zls4MV07CisKKyAgaWYgKGlub3V0KSByZXR1cm4gLUVJTlZBTDsKKworICAvLyBnZXQgdGhlIHBvaW50ZXIgdG8gb3VyIFNjc2kgbGF5ZXIgSEJBIGJ1ZmZlciAgCisgIGNwcWZjSEJBID0gKENQUUZDSEJBICopaG9zdC0+aG9zdGRhdGE7CisgIGZjQ2hpcCA9ICZjcHFmY0hCQS0+ZmNDaGlwOworICAKKyAgKnN0YXJ0IAkgID0gYnVmZmVyOworCisgIGluZm8uYnVmZmVyICAgICA9IGJ1ZmZlcjsKKyAgaW5mby5idWZsZW5ndGggID0gbGVuZ3RoOworICBpbmZvLmJ1Zm9mZnNldCAgPSBvZmZzZXQ7CisgIGluZm8uZmlscG9zICAgICA9IDA7CisgIGluZm8uYnVmZmlsbGVuICA9IDA7CisgIGNvcHlfaW5mbygmaW5mbywgIkRyaXZlciB2ZXJzaW9uID0gJWQuJWQuJWQiLCBWRVJfTUFKT1IsIFZFUl9NSU5PUiwgVkVSX1NVQk1JTk9SKTsgCisgIGNwcWZjVFNEZWNvZGVHQklDdHlwZSggJmNwcWZjSEJBLT5mY0NoaXAsICZidWZbMF0pOworICBjcHFmY1RTR2V0TFBTTSggJmNwcWZjSEJBLT5mY0NoaXAsICZidWZbIHN0cmxlbihidWYpXSk7CisgIGNvcHlfaW5mbygmaW5mbywgIiVzXG4iLCBidWYpOyAKKworI2RlZmluZSBESVNQTEFZX1dXTl9JTkZPCisjaWZkZWYgRElTUExBWV9XV05fSU5GTworICBTY3NpRGV2ID0gc2NzaV9nZXRfaG9zdF9kZXYgKGhvc3QpOworICBpZiAoIVNjc2lEZXYpIAorICAgIHJldHVybiAtRU5PTUVNOworICBEdW1DbW5kID0gc2NzaV9nZXRfY29tbWFuZCAoU2NzaURldiwgR0ZQX0tFUk5FTCk7CisgIGlmICghRHVtQ21uZCkgeworICAgIHNjc2lfZnJlZV9ob3N0X2RldiAoU2NzaURldik7CisgICAgcmV0dXJuIC1FTk9NRU07CisgIH0KKyAgY29weV9pbmZvKCZpbmZvLCAiV1dOIGRhdGFiYXNlOiAoXCJwb3J0X2lkOiAwMDAwMDBcIiBtZWFucyBkaXNjb25uZWN0ZWQpXG4iKTsKKyAgZm9yICggQ2hhbj0wOyBDaGFuIDw9IGhvc3QtPm1heF9jaGFubmVsOyBDaGFuKyspIHsKKyAgICBEdW1DbW5kLT5kZXZpY2UtPmNoYW5uZWwgPSBDaGFuOworICAgIGZvciAoVGFyZz0wOyBUYXJnIDw9IGhvc3QtPm1heF9pZDsgVGFyZysrKSB7CisgICAgICBEdW1DbW5kLT5kZXZpY2UtPmlkID0gVGFyZzsKKyAgICAgIGlmICgocExvZ2dlZEluUG9ydCA9IGZjRmluZExvZ2dlZEluUG9ydCggZmNDaGlwLAorCSAgICAJCQlEdW1DbW5kLCAgLy8gc2VhcmNoIFNjc2kgTmV4dXMKKyAgICAJCQkJMCwgICAgICAgIC8vIERPTidUIHNlYXJjaCBsaXN0IGZvciBGQyBwb3J0IGlkCisgICAgCQkJCU5VTEwsICAgICAvLyBET04nVCBzZWFyY2ggbGlzdCBmb3IgRkMgV1dOCisgICAgCQkJCU5VTEwpKSl7ICAgLy8gRE9OJ1QgY2FyZSBhYm91dCBlbmQgb2YgbGlzdAorCWNvcHlfaW5mbygmaW5mbywgIkhvc3Q6IHNjc2klZCBDaGFubmVsOiAlMDJkIFRhcmdldElkOiAlMDJkIC0+IFdXTjogIiwKKwkJCSAgIGhvc3QtPmhvc3Rfbm8sIENoYW4sIFRhcmcpOworICAgICAgICBmb3IoIGk9MzsgaT49MDsgaS0tKSAgICAgICAgLy8gY29weSB0aGUgTE9HSU4gcG9ydCdzIFdXTgorICAgICAgICAgIGNvcHlfaW5mbygmaW5mbywgIiUwMlgiLCBwTG9nZ2VkSW5Qb3J0LT51LnVjV1dOW2ldKTsKKyAgICAgICAgZm9yKCBpPTc7IGk+MzsgaS0tKSAgICAgICAgICAgICAvLyBjb3B5IHRoZSBMT0dJTiBwb3J0J3MgV1dOCisgICAgICAgICAgY29weV9pbmZvKCZpbmZvLCAiJTAyWCIsIHBMb2dnZWRJblBvcnQtPnUudWNXV05baV0pOworCWNvcHlfaW5mbygmaW5mbywgIiBwb3J0X2lkOiAlMDZYXG4iLCBwTG9nZ2VkSW5Qb3J0LT5wb3J0X2lkKTsgCisgICAgICB9CisgICAgfQorICB9CisKKyAgc2NzaV9wdXRfY29tbWFuZCAoRHVtQ21uZCk7CisgIHNjc2lfZnJlZV9ob3N0X2RldiAoU2NzaURldik7CisjZW5kaWYKKworCisKKyAgCisgIAorLy8gVW5mb3J0dW5hdGVseSwgdGhlIHByb2NfaW5mbyBidWZmZXIgaXNuJ3QgYmlnIGVub3VnaAorLy8gZm9yIGV2ZXJ5dGhpbmcgd2Ugd291bGQgbGlrZS4uLgorLy8gRm9yIEZDIHN0YXRzLCBjb21waWxlIHRoaXMgYW5kIHR1cm4gb2ZmIFdXTiBzdHVmZiBhYm92ZSAgCisvLyNkZWZpbmUgRElTUExBWV9GQ19TVEFUUworI2lmZGVmIERJU1BMQVlfRkNfU1RBVFMKKy8vIGdldCB0aGUgRmlicmUgQ2hhbm5lbCBzdGF0aXN0aWNzCisgIHsKKyAgICBpbnQgRGVsdGFTZWNzID0gKGppZmZpZXMgLSBjcHFmY0hCQS0+ZmNTdGF0c1RpbWUpIC8gSFo7CisgICAgaW50IGRheXMsaG91cnMsbWludXRlcyxzZWNzOworICAgIAorICAgIGRheXMgPSBEZWx0YVNlY3MgLyAoMzYwMCoyNCk7IC8vIGRheXMKKyAgICBob3VycyA9IChEZWx0YVNlY3MlICgzNjAwKjI0KSkgLyAzNjAwOyAvLyBob3VycworICAgIG1pbnV0ZXMgPSAoRGVsdGFTZWNzJTM2MDAgLzYwKTsgLy8gbWludXRlcworICAgIHNlY3MgPSAgRGVsdGFTZWNzJTYwOyAgLy8gc2VjcworY29weV9pbmZvKCAmaW5mbywgIkZpYnJlIENoYW5uZWwgU3RhdHMgKHRpbWUgZGQ6aGg6bW06c3MgJTAydTolMDJ1OiUwMnU6JTAydVxuIiwKKyAgICAgIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNzKTsKKyAgfQorICAgIAorICBjcHFmY0hCQS0+ZmNTdGF0c1RpbWUgPSBqaWZmaWVzOyAgLy8gKGZvciBuZXh0IGRlbHRhKQorCisgIGNvcHlfaW5mbyggJmluZm8sICIgIExpbmtVcCAgICAgICAgICAgJTl1ICAgICBMaW5rRG93biAgICAgICV1XG4iLAorICAgICAgICBmY0NoaXAtPmZjU3RhdHMubGlua1VwLCBmY0NoaXAtPmZjU3RhdHMubGlua0Rvd24pOworICAgICAgICAKKyAgY29weV9pbmZvKCAmaW5mbywgIiAgTG9zcyBvZiBTaWduYWwgICAlOXUgICAgIExvc3Mgb2YgU3luYyAgJXVcbiIsCisgICAgZmNDaGlwLT5mY1N0YXRzLkxvc3NvZlNpZ25hbCwgZmNDaGlwLT5mY1N0YXRzLkxvc3NvZlN5bmMpOworCQkgIAorICBjb3B5X2luZm8oICZpbmZvLCAiICBEaXNjYXJkZWQgRnJhbWVzICU5dSAgICAgQmFkIENSQyBGcmFtZSAldVxuIiwKKyAgICBmY0NoaXAtPmZjU3RhdHMuRGlzX0ZybSwgZmNDaGlwLT5mY1N0YXRzLkJhZF9DUkMpOworCisgIGNvcHlfaW5mbyggJmluZm8sICIgIFRBQ0ggTGlua0ZhaWxUWCAgJTl1ICAgICBUQUNIIExpbmtGYWlsUlggICAgICV1XG4iLAorICAgIGZjQ2hpcC0+ZmNTdGF0cy5saW5rRmFpbFRYLCBmY0NoaXAtPmZjU3RhdHMubGlua0ZhaWxSWCk7CisgIAorICBjb3B5X2luZm8oICZpbmZvLCAiICBUQUNIIFJ4RU9GYSAgICAgICU5dSAgICAgVEFDSCBFbGFzdGljIFN0b3JlICAldVxuIiwKKyAgICBmY0NoaXAtPmZjU3RhdHMuUnhfRU9GYSwgZmNDaGlwLT5mY1N0YXRzLmVfc3RvcmVzKTsKKworICBjb3B5X2luZm8oICZpbmZvLCAiICBCdWZmZXJDcmVkaXRXYWl0ICU5dXVzICAgVEFDSCBGTSBJbml0cyAldVxuIiwKKyAgICBmY0NoaXAtPmZjU3RhdHMuQkIwX1RpbWVyKjEwLCBmY0NoaXAtPmZjU3RhdHMuRk1pbml0cyApOworCQorICBjb3B5X2luZm8oICZpbmZvLCAiICBGQy0yIFRpbWVvdXRzICAgICU5dSAgICAgRkMtMiBMb2dvdXRzICAldVxuIiwKKyAgICBmY0NoaXAtPmZjU3RhdHMudGltZW91dHMsIGZjQ2hpcC0+ZmNTdGF0cy5sb2dvdXRzKTsgCisgICAgICAgIAorICBjb3B5X2luZm8oICZpbmZvLCAiICBGQy0yIEFib3J0cyAgICAgICU5dSAgICAgRkMtNCBBYm9ydHMgICAldVxuIiwKKyAgICBmY0NoaXAtPmZjU3RhdHMuRkMyYWJvcnRlZCwgZmNDaGlwLT5mY1N0YXRzLkZDNGFib3J0ZWQpOworICAgCisgIC8vIGNsZWFyIHRoZSBjb3VudGVycworICBjcHFmY1RTQ2xlYXJMaW5rU3RhdHVzQ291bnRlcnMoIGZjQ2hpcCk7CisjZW5kaWYKKwkKKyAgcmV0dXJuIGluZm8uYnVmZmlsbGVuOworfQorCisKKyNpZiBERUJVR19DTU5ECisKK1VDSEFSICpTY3NpVG9Bc2NpaSggVUNIQVIgU2NzaUNvbW1hbmQpCit7CisKKy8qKysKKworUm91dGluZSBEZXNjcmlwdGlvbjoKKworICAgQ29udmVydHMgYSBTQ1NJIGNvbW1hbmQgdG8gYSB0ZXh0IHN0cmluZyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorCisKK0FyZ3VtZW50czoKKworICAgU2NzaUNvbW1hbmQgLS0gaGV4IHZhbHVlIFNDU0kgQ29tbWFuZAorCisKK1JldHVybiBWYWx1ZToKKworICAgQW4gQVNDSUksIG51bGwtdGVybWluYXRlZCBzdHJpbmcgaWYgZm91bmQsIGVsc2UgcmV0dXJucyBOVUxMLgorCitPcmlnaW5hbCBjb2RlIGZyb20gTS4gTWNHb3dlbiwgQ29tcGFxCistLSovCisKKworICAgc3dpdGNoIChTY3NpQ29tbWFuZCkKKyAgIHsKKyAgICAgIGNhc2UgMHgwMDoKKyAgICAgICAgIHJldHVybiggIlRlc3QgVW5pdCBSZWFkeSIgKTsKKworICAgICAgY2FzZSAweDAxOgorICAgICAgICAgcmV0dXJuKCAiUmV6ZXJvIFVuaXQgb3IgUmV3aW5kIiApOworCisgICAgICBjYXNlIDB4MDI6CisgICAgICAgICByZXR1cm4oICJSZXF1ZXN0IEJsb2NrIEFkZHJlc3MiICk7CisKKyAgICAgIGNhc2UgMHgwMzoKKyAgICAgICAgIHJldHVybiggIlJlcXVlc2UgU2Vuc2UiICk7CisKKyAgICAgIGNhc2UgMHgwNDoKKyAgICAgICAgIHJldHVybiggIkZvcm1hdCBVbml0IiApOworCisgICAgICBjYXNlIDB4MDU6CisgICAgICAgICByZXR1cm4oICJSZWFkIEJsb2NrIExpbWl0cyIgKTsKKworICAgICAgY2FzZSAweDA3OgorICAgICAgICAgcmV0dXJuKCAiUmVhc3NpZ24gQmxvY2tzIiApOworCisgICAgICBjYXNlIDB4MDg6CisgICAgICAgICByZXR1cm4oICJSZWFkICg2KSIgKTsKKworICAgICAgY2FzZSAweDBhOgorICAgICAgICAgcmV0dXJuKCAiV3JpdGUgKDYpIiApOworCisgICAgICBjYXNlIDB4MGI6CisgICAgICAgICByZXR1cm4oICJTZWVrICg2KSIgKTsKKworICAgICAgY2FzZSAweDEyOgorICAgICAgICAgcmV0dXJuKCAiSW5xdWlyeSIgKTsKKworICAgICAgY2FzZSAweDE1OgorICAgICAgICAgcmV0dXJuKCAiTW9kZSBTZWxlY3QgKDYpIiApOworCisgICAgICBjYXNlIDB4MTY6CisgICAgICAgICByZXR1cm4oICJSZXNlcnZlIiApOworCisgICAgICBjYXNlIDB4MTc6CisgICAgICAgICByZXR1cm4oICJSZWxlYXNlIiApOworCisgICAgICBjYXNlIDB4MWE6CisgICAgICAgICByZXR1cm4oICJNb2RlU2VuKDYpIiApOworCisgICAgICBjYXNlIDB4MWI6CisgICAgICAgICByZXR1cm4oICJTdGFydC9TdG9wIFVuaXQiICk7CisKKyAgICAgIGNhc2UgMHgxYzoKKyAgICAgICAgIHJldHVybiggIlJlY2VpdmUgRGlhZ25vc3RpYyBSZXN1bHRzIiApOworCisgICAgICBjYXNlIDB4MWQ6CisgICAgICAgICByZXR1cm4oICJTZW5kIERpYWdub3N0aWMiICk7CisKKyAgICAgIGNhc2UgMHgyNToKKyAgICAgICAgIHJldHVybiggIlJlYWQgQ2FwYWNpdHkiICk7CisKKyAgICAgIGNhc2UgMHgyODoKKyAgICAgICAgIHJldHVybiggIlJlYWQgKDEwKSIgKTsKKworICAgICAgY2FzZSAweDJhOgorICAgICAgICAgcmV0dXJuKCAiV3JpdGUgKDEwKSIgKTsKKworICAgICAgY2FzZSAweDJiOgorICAgICAgICAgcmV0dXJuKCAiU2VlayAoMTApIiApOworCisgICAgICBjYXNlIDB4MmU6CisgICAgICAgICByZXR1cm4oICJXcml0ZSBhbmQgVmVyaWZ5IiApOworCisgICAgICBjYXNlIDB4MmY6CisgICAgICAgICByZXR1cm4oICJWZXJpZnkiICk7CisKKyAgICAgIGNhc2UgMHgzNDoKKyAgICAgICAgIHJldHVybiggIlByZS1GZXRjaCIgKTsKKworICAgICAgY2FzZSAweDM1OgorICAgICAgICAgcmV0dXJuKCAiU3luY2hyb25pemUgQ2FjaGUiICk7CisKKyAgICAgIGNhc2UgMHgzNzoKKyAgICAgICAgIHJldHVybiggIlJlYWQgRGVmZWN0IERhdGEgKDEwKSIgKTsKKworICAgICAgY2FzZSAweDNiOgorICAgICAgICAgcmV0dXJuKCAiV3JpdGUgQnVmZmVyIiApOworCisgICAgICBjYXNlIDB4M2M6CisgICAgICAgICByZXR1cm4oICJSZWFkIEJ1ZmZlciIgKTsKKworICAgICAgY2FzZSAweDNlOgorICAgICAgICAgcmV0dXJuKCAiUmVhZCBMb25nIiApOworCisgICAgICBjYXNlIDB4M2Y6CisgICAgICAgICByZXR1cm4oICJXcml0ZSBMb25nIiApOworCisgICAgICBjYXNlIDB4NDE6CisgICAgICAgICByZXR1cm4oICJXcml0ZSBTYW1lIiApOworCisgICAgICBjYXNlIDB4NGM6CisgICAgICAgICByZXR1cm4oICJMb2cgU2VsZWN0IiApOworCisgICAgICBjYXNlIDB4NGQ6CisgICAgICAgICByZXR1cm4oICJMb2cgU2Vuc2UiICk7CisKKyAgICAgIGNhc2UgMHg1NjoKKyAgICAgICAgIHJldHVybiggIlJlc2VydmUgKDEwKSIgKTsKKworICAgICAgY2FzZSAweDU3OgorICAgICAgICAgcmV0dXJuKCAiUmVsZWFzZSAoMTApIiApOworCisgICAgICBjYXNlIDB4YTA6CisgICAgICAgICByZXR1cm4oICJSZXBvcnRMdW5zIiApOworCisgICAgICBjYXNlIDB4Yjc6CisgICAgICAgICByZXR1cm4oICJSZWFkIERlZmVjdCBEYXRhICgxMikiICk7CisKKyAgICAgIGNhc2UgMHhjYToKKyAgICAgICAgIHJldHVybiggIlBlcmlwaGVyYWwgRGV2aWNlIEFkZHJlc3NpbmcgU0NTSSBQYXNzdGhyb3VnaCIgKTsKKworICAgICAgY2FzZSAweGNiOgorICAgICAgICAgcmV0dXJuKCAiQ29tcGFxIEFycmF5IEZpcm13YXJlIFBhc3N0aHJvdWdoIiApOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgcmV0dXJuKCBOVUxMICk7CisgICB9CisKK30gLy8gZW5kIFNjc2lUb0FzY2lpKCkKKwordm9pZCBjcHFmY1RTX3ByaW50X3Njc2lfY21kKFNjc2lfQ21uZCAqIGNtZCkKK3sKKworcHJpbnRrKCJjcHFmY1RTOiAoJXMpIGNobmwgMHglMDJ4LCB0cmd0ID0gMHglMDJ4LCBsdW4gPSAweCUwMngsIGNtZF9sZW4gPSAweCUwMnhcbiIsIAorICAgIFNjc2lUb0FzY2lpKCBjbWQtPmNtbmRbMF0pLCBjbWQtPmNoYW5uZWwsIGNtZC0+dGFyZ2V0LCBjbWQtPmx1biwgY21kLT5jbWRfbGVuKTsKKworaWYoIGNtZC0+Y21uZFswXSA9PSAwKSAgIC8vIFRlc3QgVW5pdCBSZWFkeT8KK3sKKyAgaW50IGk7CisKKyAgcHJpbnRrKCJDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4gPSAweCVYLCAtPnVzZV9zZyA9ICVkLCAtPmJ1ZmZsZW4gPSAlZFxuIiwKKyAgICBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgY21kLT51c2Vfc2csIGNtZC0+YnVmZmxlbik7CisgIHByaW50aygiQ21uZC0+cmVxdWVzdF9idWZmZXIgPSAlcCwgLT5zZ2xpc3RfbGVuID0gJWQsIC0+YnVmZmVyID0gJXBcbiIsCisgICAgY21kLT5yZXF1ZXN0X2J1ZmZlciwgY21kLT5zZ2xpc3RfbGVuLCBjbWQtPmJ1ZmZlcik7CisgIGZvciAoaSA9IDA7IGkgPCBjbWQtPmNtZF9sZW47IGkrKykKKyAgICBwcmludGsoIjB4JTAyeCAiLCBjbWQtPmNtbmRbaV0pOworICBwcmludGsoIlxuIik7Cit9CisKK30KKworI2VuZGlmCQkJCS8qIERFQlVHX0NNTkQgKi8KKworCisKKworc3RhdGljIHZvaWQgUXVlQ21uZE9uQm9hcmRMb2NrKCBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhLCBTY3NpX0NtbmQgKkNtbmQpCit7CisgIGludCBpOworCisgIGZvciggaT0wOyBpPCBDUFFGQ1RTX1JFUV9RVUVVRV9MRU47IGkrKykKKyAgeyAgICAvLyBmaW5kIHNwYXJlIHNsb3QKKyAgICBpZiggY3BxZmNIQkFkYXRhLT5Cb2FyZExvY2tDbW5kW2ldID09IE5VTEwgKQorICAgIHsKKyAgICAgIGNwcWZjSEJBZGF0YS0+Qm9hcmRMb2NrQ21uZFtpXSA9IENtbmQ7CisvLyAgICAgIHByaW50aygiIEJvYXJkTG9ja0NtbmRbJWRdICVwIFF1ZXVlZCwgY2hubC90YXJnZXQvbHVuICVkLyVkLyVkXG4iLAorLy8gICAgICAgIGksQ21uZCwgQ21uZC0+Y2hhbm5lbCwgQ21uZC0+dGFyZ2V0LCBDbW5kLT5sdW4pOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmKCBpID49IENQUUZDVFNfUkVRX1FVRVVFX0xFTikKKyAgeworICAgIHByaW50aygiIGNwcWZjVFMgV0FSTklORzogTG9zdCBDbW5kICVwIG9uIEJvYXJkTG9jayBRIGZ1bGwhIiwgQ21uZCk7CisgIH0KKworfQorCisKK3N0YXRpYyB2b2lkIFF1ZUxpbmtEb3duQ21uZCggQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSwgU2NzaV9DbW5kICpDbW5kKQoreworICBpbnQgaW5keDsKKworICAvLyBSZW1lbWJlciB0aGUgY29tbWFuZCBwdHIgc28gd2UgY2FuIHJldHVybjsgd2UnbGwgY29tcGxldGUgd2hlbgorICAvLyB0aGUgZGV2aWNlIGNvbWVzIGJhY2ssIGNhdXNpbmcgaW1tZWRpYXRlIHJldHJ5CisgIGZvciggaW5keD0wOyBpbmR4IDwgQ1BRRkNUU19SRVFfUVVFVUVfTEVOOyBpbmR4KyspLy8sIFNDcHRyKyspCisgIHsKKyAgICBpZiggY3BxZmNIQkFkYXRhLT5MaW5rRG5DbW5kW2luZHhdID09IE5VTEwgKSAvLyBhdmFpbGFibGU/CisgICAgeworI2lmZGVmIERVTU1ZQ01ORF9EQkcKKyAgICAgIHByaW50aygiIEBhZGQgQ21uZCAlcCB0byBMbmtEbkNtbmRbJWRdQCAiLCBDbW5kLGluZHgpOworI2VuZGlmCisgICAgICBjcHFmY0hCQWRhdGEtPkxpbmtEbkNtbmRbaW5keF0gPSBDbW5kOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYoIGluZHggPj0gQ1BRRkNUU19SRVFfUVVFVUVfTEVOICkgLy8gbm8gc3BhY2UgZm9yIENtbmQ/PworICB7CisgICAgLy8gdGhpcyB3aWxsIHJlc3VsdCBpbiBhbiBfYWJvcnQgY2FsbCBsYXRlciAod2l0aCBwb3NzaWJsZSB0cm91YmxlKQorICAgIHByaW50aygibm8gYnVmZmVyIGZvciBMaW5rRG5DbW5kISEgJXBcbiIsIENtbmQpOworICB9Cit9CisKKworCisKKworLy8gVGhlIGZpbGUgPHNjc2kvc2NzaV9ob3N0Lmg+IHNheXMgbm90IHRvIGNhbGwgc2NzaV9kb25lIGZyb20KKy8vIGluc2lkZSBfcXVldWVjb21tYW5kLCBzbyB3ZSdsbCBkbyBpdCBmcm9tIHRoZSBoZWFydGJlYXQgdGltZXIKKy8vIChjbGFyaWZpY2F0aW9uOiBUdXJucyBvdXQgaXQncyBvayB0byBjYWxsIHNjc2lfZG9uZSBmcm9tIHF1ZXVlY29tbWFuZCAKKy8vIGZvciBjYXNlcyB0aGF0IGRvbid0IGdvIHRvIHRoZSBoYXJkd2FyZSBsaWtlIHNjc2kgY21kcyBkZXN0aW5lZAorLy8gZm9yIExVTnMgd2Uga25vdyBkb24ndCBleGlzdCwgc28gdGhpcyBjb2RlIG1pZ2h0IGJlIHNpbXBsaWZpZWQuLi4pCisKK3N0YXRpYyB2b2lkIFF1ZUJhZFRhcmdldENtbmQoIENQUUZDSEJBICpjcHFmY0hCQWRhdGEsIFNjc2lfQ21uZCAqQ21uZCkKK3sKKyAgaW50IGk7CisgICAgLy8gICAgcHJpbnRrKCIgY2FuJ3QgZmluZCB0YXJnZXQgJWRcbiIsIENtbmQtPnRhcmdldCk7CisKKyAgZm9yKCBpPTA7IGk8IENQUUZDVFNfTUFYX1RBUkdFVF9JRDsgaSsrKQorICB7ICAgIC8vIGZpbmQgc3BhcmUgc2xvdAorICAgIGlmKCBjcHFmY0hCQWRhdGEtPkJhZFRhcmdldENtbmRbaV0gPT0gTlVMTCApCisgICAgeworICAgICAgY3BxZmNIQkFkYXRhLT5CYWRUYXJnZXRDbW5kW2ldID0gQ21uZDsKKy8vICAgICAgcHJpbnRrKCIgQmFkVGFyZ2V0Q21uZFslZF0gJXAgUXVldWVkLCBjaG5sL3RhcmdldC9sdW4gJWQvJWQvJWRcbiIsCisvLyAgICAgICAgICBpLENtbmQsIENtbmQtPmNoYW5uZWwsIENtbmQtPnRhcmdldCwgQ21uZC0+bHVuKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisKKy8vIFRoaXMgaXMgdGhlICJtYWluIiBlbnRyeSBwb2ludCBmb3IgTGludXggU2NzaSBjb21tYW5kcyAtLQorLy8gaXQgYWxsIHN0YXJ0cyBoZXJlLgorCitpbnQgY3BxZmNUU19xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICpDbW5kLCB2b2lkICgqIGRvbmUpKFNjc2lfQ21uZCAqKSkKK3sKKyAgc3RydWN0IFNjc2lfSG9zdCAqSG9zdEFkYXB0ZXIgPSBDbW5kLT5kZXZpY2UtPmhvc3Q7CisgIENQUUZDSEJBICpjcHFmY0hCQWRhdGEgPSAoQ1BRRkNIQkEgKilIb3N0QWRhcHRlci0+aG9zdGRhdGE7CisgIFBUQUNIWU9OIGZjQ2hpcCA9ICZjcHFmY0hCQWRhdGEtPmZjQ2hpcDsKKyAgVGFjaEZDSERSX0dDTU5EIGZjaHM7ICAvLyBvbmx5IHVzZSBmb3IgRkMgZGVzdGluYXRpb24gaWQgZmllbGQgIAorICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0OworICBVTE9ORyB1bFN0YXR1cywgU0VTVHR5cGU7CisgIExPTkcgRXhjaGFuZ2VJRDsKKworCisKKworICBFTlRFUigiY3BxZmNUU19xdWV1ZWNvbW1hbmQiKTsKKyAgICAgIAorICBQQ0lfVFJBQ0VPKCAoVUxPTkcpQ21uZCwgMHg5OCkKKyAgICAgIAorICAKKyAgQ21uZC0+c2NzaV9kb25lID0gZG9uZTsKKyNpZmRlZiBERUJVR19DTU5EICAKKyAgY3BxZmNUU19wcmludF9zY3NpX2NtZCggQ21uZCk7CisjZW5kaWYKKworICAvLyBwcmV2ZW50IGJvYXJkIGNvbnRlbnRpb24gd2l0aCBrZXJuZWwgdGhyZWFkLi4uICAKKyAgCisgICBpZiggY3BxZmNIQkFkYXRhLT5Cb2FyZExvY2sgKQorICB7CisvLyAgICBwcmludGsoIiBAQnJkTGNrIEhsZEAgIik7CisgICAgUXVlQ21uZE9uQm9hcmRMb2NrKCBjcHFmY0hCQWRhdGEsIENtbmQpOworICB9CisgIAorICBlbHNlCisgIHsKKworICAgIC8vIGluIHRoZSBjdXJyZW50IHN5c3RlbSAoMi4yLjEyKSwgdGhpcyByb3V0aW5lIGlzIGNhbGxlZAorICAgIC8vIGFmdGVyIHNwaW5fbG9ja19pcnFzYXZlKCksIHNvIElOVHMgYXJlIGRpc2FibGVkLiBIb3dldmVyLAorICAgIC8vIHdlIG1pZ2h0IGhhdmUgc29tZXRoaW5nIHBlbmRpbmcgaW4gdGhlIExpbmtRLCB3aGljaAorICAgIC8vIG1pZ2h0IGNhdXNlIHRoZSBXb3JrZXJUYXNrIHRvIHJ1bi4gIEluIGNhc2UgdGhhdAorICAgIC8vIGhhcHBlbnMsIG1ha2Ugc3VyZSB3ZSBsb2NrIGl0IG91dC4KKyAgICAKKyAgICAKKyAgICAKKyAgICBQQ0lfVFJBQ0UoIDB4OTgpIAorICAgIENQUV9TUElOTE9DS19IQkEoIGNwcWZjSEJBZGF0YSkKKyAgICBQQ0lfVFJBQ0UoIDB4OTgpIAorCSAgICAKKyAgLy8gY2FuIHdlIGZpbmQgYW4gRkMgZGV2aWNlIG1hcHBpbmcgdG8gdGhpcyBTQ1NJIHRhcmdldD8KKyAgICBwTG9nZ2VkSW5Qb3J0ID0gZmNGaW5kTG9nZ2VkSW5Qb3J0KCBmY0NoaXAsCisgICAgICBDbW5kLCAgICAgLy8gc2VhcmNoIFNjc2kgTmV4dXMKKyAgICAgIDAsICAgICAgICAvLyBET04nVCBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIEZDIHBvcnQgaWQKKyAgICAgIE5VTEwsICAgICAvLyBET04nVCBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIEZDIFdXTgorICAgICAgTlVMTCk7ICAgIC8vIERPTidUIGNhcmUgYWJvdXQgZW5kIG9mIGxpc3QKKyAKKyAgICBpZiggcExvZ2dlZEluUG9ydCA9PSBOVUxMICkgICAgICAvLyBub3QgZm91bmQhCisgICAgeworLy8gICAgcHJpbnRrKCIgQFEgYmFkIHRhcmcgY21uZCAlcEAgIiwgQ21uZCk7CisgICAgICBRdWVCYWRUYXJnZXRDbW5kKCBjcHFmY0hCQWRhdGEsIENtbmQpOworICAgIH0KKyAgICBlbHNlIGlmIChDbW5kLT5kZXZpY2UtPmx1biA+PSBDUFFGQ1RTX01BWF9MVU4pCisgICAgeworICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiY3BxZmM6IEludmFsaWQgTFVOOiAlZFxuIiwgQ21uZC0+ZGV2aWNlLT5sdW4pOworICAgICAgUXVlQmFkVGFyZ2V0Q21uZCggY3BxZmNIQkFkYXRhLCBDbW5kKTsKKyAgICB9IAorCisgICAgZWxzZSAgLy8gd2Uga25vdyB3aGF0IEZDIGRldmljZSB0byBzZW5kIHRvLi4uCisgICAgeworCisgICAgICAvLyBkb2VzIHRoaXMgZGV2aWNlIHN1cHBvcnQgRkNQIHRhcmdldCBmdW5jdGlvbnM/CisgICAgICAvLyAoZGV0ZXJtaW5lZCBieSBQUkxJIGZpZWxkKQorCisgICAgICBpZiggIShwTG9nZ2VkSW5Qb3J0LT5mY3BfaW5mbyAmIFRBUkdFVF9GVU5DVElPTikgKQorICAgICAgeworICAgICAgICBwcmludGsoIiBEb2Vzbid0IHN1cHBvcnQgVEFSR0VUIGZ1bmN0aW9ucyBwb3J0X2lkICVYaFxuIiwKKyAgICAgICAgICBwTG9nZ2VkSW5Qb3J0LT5wb3J0X2lkICk7CisgICAgICAgIFF1ZUJhZFRhcmdldENtbmQoIGNwcWZjSEJBZGF0YSwgQ21uZCk7CisgICAgICB9CisKKyAgICAvLyBJbiB0aGlzIGNhc2UgKHByZXZpb3VzIGxvZ2luIE9LKSwgdGhlIGRldmljZSBpcyB0ZW1wb3JhcmlseQorICAgIC8vIHVuYXZhaWxhYmxlIHdhaXRpbmcgZm9yIHJlLWxvZ2luLCBpbiB3aGljaCBjYXNlIHdlIGV4cGVjdCBpdAorICAgIC8vIHRvIGJlIGJhY2sgaW4gYmV0d2VlbiAyNSAtIDUwMG1zLiAgCisgICAgLy8gSWYgdGhlIEZDIHBvcnQgZG9lc24ndCBsb2cgYmFjayBpbiB3aXRoaW4gc2V2ZXJhbCBzZWNvbmRzCisgICAgLy8gKGkuZS4gaW1wbGljaXQgImxvZ291dCIpLCBvciB3ZSBnZXQgYW4gZXhwbGljaXQgbG9nb3V0LAorICAgIC8vIHdlIHNldCAiZGV2aWNlX2Jsb2NrZWQiIGluIFNjc2lfRGV2aWNlIHN0cnVjdDsgaW4gdGhpcworICAgIC8vIGNhc2UgMzAgc2Vjb25kcyB3aWxsIGVsYXBzZSBiZWZvcmUgTGludXgvU2NzaSBzZW5kcyBhbm90aGVyCisgICAgLy8gY29tbWFuZCB0byB0aGUgZGV2aWNlLgorICAgICAgZWxzZSBpZiggcExvZ2dlZEluUG9ydC0+cHJsaSAhPSBUUlVFICkKKyAgICAgIHsKKy8vICAgICAgcHJpbnRrKCJEZXZpY2UgKENobmwvVGFyZ2V0ICVkLyVkKSBpbnZhbGlkIFBSTEksIHBvcnRfaWQgJTA2bFhoXG4iLAorLy8gICAgICAgIENtbmQtPmNoYW5uZWwsIENtbmQtPnRhcmdldCwgcExvZ2dlZEluUG9ydC0+cG9ydF9pZCk7CisgICAgICAgIFF1ZUxpbmtEb3duQ21uZCggY3BxZmNIQkFkYXRhLCBDbW5kKTsKKy8vICAgIE5lZWQgdG8gdXNlICJibG9ja2VkIiBmbGFnPz8gICAJCisvLwlDbW5kLT5kZXZpY2UtPmRldmljZV9ibG9ja2VkID0gVFJVRTsgLy8ganVzdCBsZXQgaXQgdGltZW91dAorICAgICAgfQorICAgICAgZWxzZSAgLy8gZGV2aWNlIHN1cHBvcnRzIFRBUkdFVCBmdW5jdGlvbnMsIGFuZCBpcyBsb2dnZWQgaW4uLi4KKyAgICAgIHsKKyAgICAgIC8vIChjb250ZXh0IG9mIGZjaHMgaXMgdG8gInJlcGx5IiB0by4uLikKKyAgICAgICAgZmNocy5zX2lkID0gcExvZ2dlZEluUG9ydC0+cG9ydF9pZDsgLy8gZGVzdGluYXRpb24gRkMgYWRkcmVzcworCisgICAgICAvLyB3aGF0IGlzIHRoZSBkYXRhIGRpcmVjdGlvbj8gIEZvciBkYXRhIFRPIHRoZSBkZXZpY2UsCisgICAgICAvLyB3ZSBuZWVkIElXRSAoSW50aWF0b3IgV3JpdGUgRW50cnkpLiAgT3RoZXJ3aXNlLCBJUkUuCisKKyAgICAgICAgaWYoIENtbmQtPmNtbmRbMF0gPT0gV1JJVEVfMTAgfHwKKyAgCSAgQ21uZC0+Y21uZFswXSA9PSBXUklURV82IHx8CisJICBDbW5kLT5jbW5kWzBdID09IFdSSVRFX0JVRkZFUiB8fCAgICAgIAorCSAgQ21uZC0+Y21uZFswXSA9PSBWRU5ET1JfV1JJVEVfT1BDT0RFIHx8ICAvLyBDUFEgc3BlY2lmaWMgCisJICBDbW5kLT5jbW5kWzBdID09IE1PREVfU0VMRUNUICkKKyAgICAgICAgeworICAgICAgICAgIFNFU1R0eXBlID0gU0NTSV9JV0U7IC8vIGRhdGEgZnJvbSBIQkEgdG8gRGV2aWNlCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIFNFU1R0eXBlID0gU0NTSV9JUkU7IC8vIGRhdGEgZnJvbSBEZXZpY2UgdG8gSEJBCisgICAgCSAgCisgICAgICAgIHVsU3RhdHVzID0gY3BxZmNUU0J1aWxkRXhjaGFuZ2UoCisgICAgICAgICAgY3BxZmNIQkFkYXRhLAorICAgICAgICAgIFNFU1R0eXBlLCAgICAgLy8gZS5nLiBJbml0aWF0b3IgUmVhZCBFbnRyeSAoSVJFKQorICAgICAgICAgICZmY2hzLCAgICAgICAgLy8gd2UgYXJlIG9yaWdpbmF0b3I7IG9ubHkgdXNlIGRfaWQKKyAgICAgICAgICBDbW5kLCAgICAgICAgIC8vIExpbnV4IFNDU0kgY29tbWFuZCAod2l0aCBzY2F0dGVyL2dhdGhlciBsaXN0KQorICAgICAgICAgICZFeGNoYW5nZUlEICk7Ly8gZmNDb250cm9sbGVyLT5mY0V4Y2hhbmdlcyBpbmRleCwgLTEgaWYgZmFpbGVkCisKKyAgICAgICAgaWYoICF1bFN0YXR1cyApIC8vIEV4Y2hhbmdlIHNldHVwPworICAgCisgICAgICAgIHsKKyAgICAgICAgICBpZiggY3BxZmNIQkFkYXRhLT5Cb2FyZExvY2sgKQorICAgICAgICAgIHsKKyAgICBUcmlnZ2VySEJBKCBmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UsIDApOworCSAgICBwcmludGsoIiBAYmwhICVkLCB4SUQgJVhoQCAiLCBjdXJyZW50LT5waWQsIEV4Y2hhbmdlSUQpOworICAgICAgICAgIH0KKworCSAgdWxTdGF0dXMgPSBjcHFmY1RTU3RhcnRFeGNoYW5nZSggY3BxZmNIQkFkYXRhLCBFeGNoYW5nZUlEICk7CisJICBpZiggIXVsU3RhdHVzICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBQQ0lfVFJBQ0VPKCBFeGNoYW5nZUlELCAweEI4KSAKKyAgICAgICAgICAvLyBzdWJtaXR0ZWQgdG8gVGFjaCdzIE91dGJvdW5kIFF1ZSAoRVJRIFBJIGluY3JlbWVudGVkKQorICAgICAgICAgIC8vIHdhaXRlZCBmb3IgY29tcGxldGlvbiBmb3IgRUxTIHR5cGUgKExvZ2luIGZyYW1lcyBpc3N1ZWQKKyAgICAgICAgICAvLyBzeW5jaHJvbm91c2x5KQorCSAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8vIGNoZWNrIHJlYXNvbiBmb3IgRXhjaGFuZ2Ugbm90IGJlaW5nIHN0YXJ0ZWQgLSB3ZSBtaWdodAorICAgICAgICAgICAgLy8gd2FudCB0byBRdWV1ZSBhbmQgc3RhcnQgbGF0ZXIsIG9yIGZhaWwgd2l0aCBlcnJvcgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygicXVlY29tbWFuZDogY3BxZmNUU1N0YXJ0RXhjaGFuZ2UgZmFpbGVkOiAlWGhcbiIsIHVsU3RhdHVzICk7CisgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAgICAgLy8gZW5kIGdvb2QgQnVpbGRFeGNoYW5nZSBzdGF0dXMKKyAgICAgICAgCisgICAgICAgIGVsc2UgIC8vIFNFU1QgdGFibGUgcHJvYmFibHkgZnVsbCAgLS0gd2h5PyBoYXJkd2FyZSBoYW5nPworICAgICAgICB7CisJICBwcmludGsoInF1ZWNvbW1hbmQ6IGNwcWZjVFNCdWlsZEV4Y2hhbmdlIGZhaWxkOiAlWGhcbiIsIHVsU3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgfSAgLy8gZW5kIGNhbid0IGRvIEZDUC1TQ1NJIHRhcmdldCBmdW5jdGlvbnMKKyAgICB9IC8vIGVuZCBjYW4ndCBmaW5kIHRhcmdldCAoRkMgZGV2aWNlKQorCisgICAgQ1BRX1NQSU5VTkxPQ0tfSEJBKCBjcHFmY0hCQWRhdGEpCisgIH0KKwkKKyAgUENJX1RSQUNFTyggKFVMT05HKUNtbmQsIDB4OUMpIAorICBMRUFWRSgiY3BxZmNUU19xdWV1ZWNvbW1hbmQiKTsKKyAgcmV0dXJuIDA7Cit9ICAgIAorCisKKy8vIEVudHJ5IHBvaW50IGZvciB1cHBlciBTY3NpIGxheWVyIGludGlhdGVkIGFib3J0LiAgVHlwaWNhbGx5CisvLyB0aGlzIGlzIGNhbGxlZCBpZiB0aGUgY29tbWFuZCAoZm9yIGhhcmQgZGlzaykgZmFpbHMgdG8gY29tcGxldGUKKy8vIGluIDMwIHNlY29uZHMuICBUaGlzIGRyaXZlciBpbnRlbmRzIHRvIGNvbXBsZXRlIGFsbCBkaXNrIGNvbW1hbmRzCisvLyB3aXRoaW4gRXhjaGFuZ2UgIi50aW1lT3V0IiBzZWNvbmRzIChub3cgNykgd2l0aCB0YXJnZXQgc3RhdHVzLCBvcgorLy8gaW4gY2FzZSBvZiAiLnRpbWVPdXQiIGV4cGlyYXRpb24sIGEgRElEX1NPRlRfRVJST1Igd2hpY2ggY2F1c2VzCisvLyBpbW1lZGlhdGUgcmV0cnkuCisvLyBJZiBhbnkgZGlzayBjb21tYW5kcyBnZXQgdGhlIF9hYm9ydCBjYWxsLCBleGNlcHQgZm9yIHRoZSBjYXNlIHRoYXQKKy8vIHRoZSBwaHlzaWNhbCBkZXZpY2Ugd2FzIHJlbW92ZWQgb3IgdW5hdmFpbGFibGUgZHVlIHRvIGhhcmR3YXJlCisvLyBlcnJvcnMsIGl0IHNob3VsZCBiZSBjb25zaWRlcmVkIGEgZHJpdmVyIGVycm9yIGFuZCByZXBvcnRlZCB0bworLy8gdGhlIGF1dGhvci4KKworaW50IGNwcWZjVFNfYWJvcnQoU2NzaV9DbW5kICpDbW5kKQoreworLy8JcHJpbnRrKCIgY3BxZmNUU19hYm9ydCBjYWxsZWQ/PyBcbiIpOworIAlyZXR1cm4gMDsKK30KKyAKK2ludCBjcHFmY1RTX2VoX2Fib3J0KFNjc2lfQ21uZCAqQ21uZCkKK3sKKworICBzdHJ1Y3QgU2NzaV9Ib3N0ICpIb3N0QWRhcHRlciA9IENtbmQtPmRldmljZS0+aG9zdDsKKyAgLy8gZ2V0IHRoZSBwb2ludGVyIHRvIG91ciBTY3NpIGxheWVyIEhCQSBidWZmZXIgIAorICBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhID0gKENQUUZDSEJBICopSG9zdEFkYXB0ZXItPmhvc3RkYXRhOworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisgIEZDX0VYQ0hBTkdFUyAqRXhjaGFuZ2VzID0gZmNDaGlwLT5FeGNoYW5nZXM7CisgIGludCBpOworICBFTlRFUigiY3BxZmNUU19laF9hYm9ydCIpOworCisgIENtbmQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PDE2OyAgLy8gYXNzdW1lIHdlJ2xsIGZpbmQgaXQKKworICBwcmludGsoIiBATGludXggX2Fib3J0IFNjc2lfQ21uZCAlcCAiLCBDbW5kKTsKKyAgLy8gU2VlIGlmIHdlIGNhbiBmaW5kIGEgQ21uZCBwb2ludGVyIHRoYXQgbWF0Y2hlcy4uLgorICAvLyBUaGUgbW9zdCBsaWtlbHkgY2FzZSBpcyB3ZSBhY2NlcHRlZCB0aGUgY29tbWFuZAorICAvLyBmcm9tIExpbnV4IFNjc2kgKGUuZy4gY2VhdGVkIGEgU0VTVCBlbnRyeSkgYW5kIGl0CisgIC8vIGdvdCBsb3N0IHNvbWVob3cuICBJZiB3ZSBjYW4ndCBmaW5kIGFueSByZWZlcmVuY2UKKyAgLy8gdG8gdGhlIHBhc3NlZCBwb2ludGVyLCB3ZSBjYW4gb25seSBwcmVzdW1lIGl0CisgIC8vIGdvdCBjb21wbGV0ZWQgYXMgZmFyIGFzIG91ciBkcml2ZXIgaXMgY29uY2VybmVkLgorICAvLyBJZiB3ZSBmb3VuZCBpdCwgd2Ugd2lsbCB0cnkgdG8gYWJvcnQgaXQgdGhyb3VnaAorICAvLyBjb21tb24gbWVjaGFuaXNtLiAgSWYgRkMgQUJUUyBpcyBzdWNjZXNzZnVsIChBQ0MpCisgIC8vIG9yIGlzIHJlamVjdGVkIChSSlQpIGJ5IHRhcmdldCwgd2Ugd2lsbCBjYWxsCisgIC8vIFNjc2kgImRvbmUiIHF1aWNrbHkuICBPdGhlcndpc2UsIHRoZSBBQlRTIHdpbGwgdGltZW91dAorICAvLyBhbmQgd2UnbGwgY2FsbCAiZG9uZSIgbGF0ZXIuCisKKyAgLy8gU2VhcmNoIHRoZSBTRVNUIGV4Y2hhbmdlcyBmb3IgYSBtYXRjaGluZyBDbW5kIHB0ci4KKyAgZm9yKCBpPTA7IGk8IFRBQ0hfU0VTVF9MRU47IGkrKykKKyAgeworICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbaV0uQ21uZCA9PSBDbW5kICkKKyAgICB7CisgICAgICAKKyAgICAgIC8vIGZvdW5kIGl0IQorICAgICAgcHJpbnRrKCIgeF9JRCAlWGgsIHR5cGUgJVhoXG4iLCBpLCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbaV0udHlwZSk7CisKKyAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS5zdGF0dXMgPSBJTklUSUFUT1JfQUJPUlQ7IC8vIHNlY29uZHMgZGVmYXVsdAorICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW2ldLnRpbWVPdXQgPSAxMDsgLy8gc2Vjb25kcyBkZWZhdWx0IChjaGFuZ2VkIGxhdGVyKQorCisgICAgICAvLyBTaW5jZSB3ZSBuZWVkIHRvIGltbWVkaWF0ZWx5IHJldHVybiB0aGUgYWJvcnRlZCBDbW5kIHRvIFNjc2kgCisgICAgICAvLyB1cHBlciBsYXllcnMsIHdlIGNhbid0IG1ha2UgZnV0dXJlIHJlZmVyZW5jZSB0byBhbnkgb2YgaXRzIAorICAgICAgLy8gZmllbGRzIChlLmcgdGhlIE5leHVzKS4KKworICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwgQkxTX0FCVFMsICZpKTsKKworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYoIGkgPj0gVEFDSF9TRVNUX0xFTiApIC8vIGRpZG4ndCBmaW5kIENtbmQgcHRyIGluIGNoaXAncyBTRVNUPworICB7CisgICAgLy8gbm93IHNlYXJjaCBvdXIgbm9uLVNFU1QgYnVmZmVycyAoaS5lLiBDbW5kIHdhaXRpbmcgdG8KKyAgICAvLyBzdGFydCBvbiB0aGUgSEJBIG9yIHdhaXRpbmcgdG8gY29tcGxldGUgd2l0aCBlcnJvciBmb3IgcmV0cnkpLgorICAgIAorICAgIC8vIGZpcnN0IGNoZWNrIEJhZFRhcmdldENtbmQKKyAgICBmb3IoIGk9MDsgaTwgQ1BRRkNUU19NQVhfVEFSR0VUX0lEOyBpKyspCisgICAgeyAKKyAgICAgIGlmKCBjcHFmY0hCQWRhdGEtPkJhZFRhcmdldENtbmRbaV0gPT0gQ21uZCApCisgICAgICB7CisgICAgICAgIGNwcWZjSEJBZGF0YS0+QmFkVGFyZ2V0Q21uZFtpXSA9IE5VTEw7CisJcHJpbnRrKCJpbiBCYWRUYXJnZXRDbW5kIFFcbiIpOworCWdvdG8gRG9uZTsgLy8gZXhpdAorICAgICAgfQorICAgIH0KKworICAgIC8vIGlmIG5vdCBmb3VuZCBhYm92ZS4uLgorCisgICAgZm9yKCBpPTA7IGkgPCBDUFFGQ1RTX1JFUV9RVUVVRV9MRU47IGkrKykKKyAgICB7CisgICAgICBpZiggY3BxZmNIQkFkYXRhLT5MaW5rRG5DbW5kW2ldID09IENtbmQgKSAKKyAgICAgIHsKKwljcHFmY0hCQWRhdGEtPkxpbmtEbkNtbmRbaV0gPSBOVUxMOworCXByaW50aygiaW4gTGlua0RuQ21uZCBRXG4iKTsKKwlnb3RvIERvbmU7CisgICAgICB9CisgICAgfQorCisKKyAgICBmb3IoIGk9MDsgaTwgQ1BRRkNUU19SRVFfUVVFVUVfTEVOOyBpKyspCisgICAgeyAgICAvLyBmaW5kIHNwYXJlIHNsb3QKKyAgICAgIGlmKCBjcHFmY0hCQWRhdGEtPkJvYXJkTG9ja0NtbmRbaV0gPT0gQ21uZCApCisgICAgICB7CisgICAgICAgIGNwcWZjSEJBZGF0YS0+Qm9hcmRMb2NrQ21uZFtpXSA9IE5VTEw7CisJcHJpbnRrKCJpbiBCb2FyZExvY2tDbW5kIFFcbiIpOworCWdvdG8gRG9uZTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgQ21uZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8MTY7ICAvLyBIbW1tLi4uCisgICAgcHJpbnRrKCJOb3QgZm91bmQhICIpOworLy8gICAgcGFuaWMoIl9hYm9ydCIpOworICB9CisgIAorRG9uZToKKyAgCisvLyAgICBwYW5pYygiX2Fib3J0Iik7CisgIExFQVZFKCJjcHFmY1RTX2VoX2Fib3J0Iik7CisgIHJldHVybiAwOyAgLy8gKHNlZSBzY3NpLmgpCit9ICAgIAorCisKKy8vIEZDUC1TQ1NJIFRhcmdldCBEZXZpY2UgUmVzZXQKKy8vIFNlZSBkcEFOUyBGaWJyZSBDaGFubmVsIFByb3RvY29sIGZvciBTQ1NJCisvLyBYMy4yNjktMTk5WCByZXZpc2lvbiAxMiwgcGcgMjUKKworI2lmZGVmIFNVUFBPUlRfUkVTRVQKKworaW50IGNwcWZjVFNfVGFyZ2V0RGV2aWNlUmVzZXQoIFNjc2lfRGV2aWNlICpTY3NpRGV2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmVzZXRfZmxhZ3MpCit7CisgIGludCB0aW1lb3V0ID0gMTAqSFo7CisgIGludCByZXRyaWVzID0gMTsKKyAgY2hhciBzY3NpX2NkYlsxMl07CisgIGludCByZXN1bHQ7CisgIFNjc2lfQ21uZCAqIFNDcG50OworICBTY3NpX0RldmljZSAqIFNEcG50OworCisvLyBGSVhNRSwgY3BxZmNUU19UYXJnZXREZXZpY2VSZXNldCBuZWVkcyB0byBiZSBmaXhlZCAKKy8vIHNpbWlsYXJseSB0byBob3cgdGhlIHBhc3N0aHJvdWdoIGlvY3RsIHdhcyBmaXhlZCAKKy8vIGFyb3VuZCB0aGUgMi41LjMwIGtlcm5lbC4gIFNjc2lfQ21uZCByZXBsYWNlZCB3aXRoIAorLy8gU2NzaV9SZXF1ZXN0LCBldGMuCisvLyBGb3Igbm93LCBzbyBwZW9wbGUgZG9uJ3QgZmFsbCBpbnRvIGEgaG9sZS4uLgorCisgIC8vIHByaW50aygiICAgRU5URVJJTkcgY3BxZmNUU19UYXJnZXREZXZpY2VSZXNldCgpIC0gZmxhZz0lZCBcbiIscmVzZXRfZmxhZ3MpOworCisgIGlmIChTY3NpRGV2LT5ob3N0LT5laF9hY3RpdmUpIHJldHVybiBGQUlMRUQ7CisKKyAgbWVtc2V0KCBzY3NpX2NkYiwgMCwgc2l6ZW9mKCBzY3NpX2NkYikpOworCisgIHNjc2lfY2RiWzBdID0gUkVMRUFTRTsKKworICBTQ3BudCA9IHNjc2lfZ2V0X2NvbW1hbmQoU2NzaURldiwgR0ZQX0tFUk5FTCk7CisgIHsKKyAgICBDUFFGQ19ERUNMQVJFX0NPTVBMRVRJT04od2FpdCk7CisgICAgCisgICAgU0NwbnQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gRkNQX1RBUkdFVF9SRVNFVDsKKworCS8vIEZJWE1FOiB0aGlzIHdvdWxkIHBhbmljLCBTQ3BudC0+cmVxdWVzdCB3b3VsZCBiZSBOVUxMLgorCVNDcG50LT5yZXF1ZXN0LT5DUFFGQ19XQUlUSU5HID0gJndhaXQ7CisJc2NzaV9kb19jbWQoU0NwbnQsICBzY3NpX2NkYiwgTlVMTCwgIDAsIG15X2lvY3RsX2RvbmUsICB0aW1lb3V0LCByZXRyaWVzKTsKKwlDUFFGQ19XQUlUX0ZPUl9DT01QTEVUSU9OKCZ3YWl0KTsKKwlTQ3BudC0+cmVxdWVzdC0+Q1BRRkNfV0FJVElORyA9IE5VTEw7CisgIH0KKyAgICAKKworICAgICAgaWYoZHJpdmVyX2J5dGUoU0NwbnQtPnJlc3VsdCkgIT0gMCkKKwkgIHN3aXRjaChTQ3BudC0+c2Vuc2VfYnVmZmVyWzJdICYgMHhmKSB7CisJY2FzZSBJTExFR0FMX1JFUVVFU1Q6CisJICAgIGlmKGNtZFswXSA9PSBBTExPV19NRURJVU1fUkVNT1ZBTCkgZGV2LT5sb2NrYWJsZSA9IDA7CisJICAgIGVsc2UgcHJpbnRrKCJTQ1NJIGRldmljZSAoaW9jdGwpIHJlcG9ydHMgSUxMRUdBTCBSRVFVRVNULlxuIik7CisJICAgIGJyZWFrOworCWNhc2UgTk9UX1JFQURZOiAvLyBUaGlzIGhhcHBlbnMgaWYgdGhlcmUgaXMgbm8gZGlzYyBpbiBkcml2ZSAKKwkgICAgaWYoZGV2LT5yZW1vdmFibGUgJiYgKGNtZFswXSAhPSBURVNUX1VOSVRfUkVBRFkpKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRGV2aWNlIG5vdCByZWFkeS4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIGRpc2MgaW4gdGhlIGRyaXZlLlxuIik7CisJCWJyZWFrOworCSAgICB9CisJY2FzZSBVTklUX0FUVEVOVElPTjoKKwkgICAgaWYgKGRldi0+cmVtb3ZhYmxlKXsKKwkJZGV2LT5jaGFuZ2VkID0gMTsKKwkJU0NwbnQtPnJlc3VsdCA9IDA7IC8vIFRoaXMgaXMgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgYW4gZXJyb3IKKwkJLy8gZ2FnIHRoaXMgZXJyb3IsIFZGUyB3aWxsIGxvZyBpdCBhbnl3YXkgL2F4Ym9lIAorCQkvLyBwcmludGsoS0VSTl9JTkZPICJEaXNjIGNoYW5nZSBkZXRlY3RlZC5cbiIpOyAKKwkJYnJlYWs7CisJICAgIH07CisJZGVmYXVsdDogLy8gRmFsbCB0aHJvdWdoIGZvciBub24tcmVtb3ZhYmxlIG1lZGlhCisJICAgIHByaW50aygiU0NTSSBlcnJvcjogaG9zdCAlZCBpZCAlZCBsdW4gJWQgcmV0dXJuIGNvZGUgPSAleFxuIiwKKwkJICAgZGV2LT5ob3N0LT5ob3N0X25vLAorCQkgICBkZXYtPmlkLAorCQkgICBkZXYtPmx1biwKKwkJICAgU0NwbnQtPnJlc3VsdCk7CisJICAgIHByaW50aygiXHRTZW5zZSBjbGFzcyAleCwgc2Vuc2UgZXJyb3IgJXgsIGV4dGVuZGVkIHNlbnNlICV4XG4iLAorCQkgICBzZW5zZV9jbGFzcyhTQ3BudC0+c2Vuc2VfYnVmZmVyWzBdKSwKKwkJICAgc2Vuc2VfZXJyb3IoU0NwbnQtPnNlbnNlX2J1ZmZlclswXSksCisJCSAgIFNDcG50LT5zZW5zZV9idWZmZXJbMl0gJiAweGYpOworCSAgICAKKyAgICAgIH07CisgIHJlc3VsdCA9IFNDcG50LT5yZXN1bHQ7CisKKyAgU0RwbnQgPSBTQ3BudC0+ZGV2aWNlOworICBzY3NpX3B1dF9jb21tYW5kKFNDcG50KTsKKyAgU0NwbnQgPSBOVUxMOworCisgIC8vIHByaW50aygiICAgTEVBVklORyBjcHFmY1RTX1RhcmdldERldmljZVJlc2V0KCkgLSByZXR1cm4gU1VDQ0VTUyBcbiIpOworICByZXR1cm4gU1VDQ0VTUzsKK30KKworI2Vsc2UKK2ludCBjcHFmY1RTX1RhcmdldERldmljZVJlc2V0KCBTY3NpX0RldmljZSAqU2NzaURldiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJlc2V0X2ZsYWdzKQoreworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKKyNlbmRpZiAvKiBTVVBQT1JUX1JFU0VUICovCisKK2ludCBjcHFmY1RTX2VoX2RldmljZV9yZXNldChTY3NpX0NtbmQgKkNtbmQpCit7CisgIGludCByZXR2YWw7CisgIFNjc2lfRGV2aWNlICpTRHBudCA9IENtbmQtPmRldmljZTsKKyAgLy8gcHJpbnRrKCIgICBFTlRFUklORyBjcHFmY1RTX2VoX2RldmljZV9yZXNldCgpIFxuIik7CisgIHNwaW5fdW5sb2NrX2lycShDbW5kLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jayk7CisgIHJldHZhbCA9IGNwcWZjVFNfVGFyZ2V0RGV2aWNlUmVzZXQoIFNEcG50LCAwKTsKKyAgc3Bpbl9sb2NrX2lycShDbW5kLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jayk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKwkKK2ludCBjcHFmY1RTX3Jlc2V0KFNjc2lfQ21uZCAqQ21uZCwgdW5zaWduZWQgaW50IHJlc2V0X2ZsYWdzKQoreworCisgIEVOVEVSKCJjcHFmY1RTX3Jlc2V0Iik7CisKKyAgTEVBVkUoImNwcWZjVFNfcmVzZXQiKTsKKyAgcmV0dXJuIFNDU0lfUkVTRVRfRVJST1I7ICAgICAgLyogQnVzIFJlc2V0IE5vdCBzdXBwb3J0ZWQgKi8KK30KKworLyogVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIHRoZSBiaW9zIHBhcmFtZXRlcnMgZm9yIGEgZ2l2ZW4KKyAgIGhhcmRkaXNrLiBUaGVzZSB0ZW5kIHRvIGJlIG51bWJlcnMgdGhhdCBhcmUgbWFkZSB1cCBieSB0aGUKKyAgIGhvc3QgYWRhcHRlci4gIFBhcmFtZXRlcnM6CisgICBzaXplLCBkZXZpY2UgbnVtYmVyLCBsaXN0IChoZWFkcywgc2VjdG9ycyxjeWxpbmRlcnMpLgorICAgKGZyb20gaG9zdHMuaCkKKyovCisKK2ludCBjcHFmY1RTX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKm4sCisJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgaXBbXSkKK3sKKyAgaW50IHNpemUgPSBjYXBhY2l0eTsKKyAgCisgIEVOVEVSKCJjcHFmY1RTX2Jpb3NwYXJhbSIpOworICBpcFswXSA9IDY0OworICBpcFsxXSA9IDMyOworICBpcFsyXSA9IHNpemUgPj4gMTE7CisgIAorICBpZiggaXBbMl0gPiAxMDI0ICkKKyAgeworICAgIGlwWzBdID0gMjU1OworICAgIGlwWzFdID0gNjM7CisgICAgaXBbMl0gPSBzaXplIC8gKGlwWzBdICogaXBbMV0pOworICB9CisKKyAgTEVBVkUoImNwcWZjVFNfYmlvc3BhcmFtIik7CisgIHJldHVybiAwOworfSAgICAKKworCisKK2lycXJldHVybl90IGNwcWZjVFNfaW50cl9oYW5kbGVyKCBpbnQgaXJxLCAKKwkJdm9pZCAqZGV2X2lkLCAKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisKKyAgdW5zaWduZWQgbG9uZyBmbGFncywgSW5mTG9vcEJyaz0wOworICBzdHJ1Y3QgU2NzaV9Ib3N0ICpIb3N0QWRhcHRlciA9IGRldl9pZDsKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBID0gKENQUUZDSEJBICopSG9zdEFkYXB0ZXItPmhvc3RkYXRhOworICBpbnQgTW9yZU1lc3NhZ2VzID0gMTsgLy8gYXNzdW1lIHdlIGhhdmUgc29tZXRoaW5nIHRvIGRvCisgIFVDSEFSIEludFBlbmRpbmc7CisgIGludCBoYW5kbGVkID0gMDsKKworICBFTlRFUigiaW50cl9oYW5kbGVyIik7CisgIHNwaW5fbG9ja19pcnFzYXZlKCBIb3N0QWRhcHRlci0+aG9zdF9sb2NrLCBmbGFncyk7CisgIC8vIGlzIHRoaXMgb3VyIElOVD8KKyAgSW50UGVuZGluZyA9IHJlYWRiKCBjcHFmY0hCQS0+ZmNDaGlwLlJlZ2lzdGVycy5JTlRQRU5ELmFkZHJlc3MpOworCisgIC8vIGJyb2tlbiBib2FyZHMgY2FuIGdlbmVyYXRlIG1lc3NhZ2VzIGZvcmV2ZXIsIHNvCisgIC8vIHByZXZlbnQgdGhlIGluZmluaXRlIGxvb3AKKyNkZWZpbmUgSU5GSU5JVEVfSU1RX0JSRUFLIDEwMDAwCisgIGlmKCBJbnRQZW5kaW5nICkKKyAgeworICAgIGhhbmRsZWQgPSAxOworICAgIC8vIG1hc2sgb3VyIEhCQSBpbnRlcnJ1cHRzIHVudGlsIHdlIGhhbmRsZSBpdC4uLgorICAgIHdyaXRlYiggMCwgY3BxZmNIQkEtPmZjQ2hpcC5SZWdpc3RlcnMuSU5URU4uYWRkcmVzcyk7CisKKyAgICBpZiggSW50UGVuZGluZyAmIDB4NCkgLy8gIklOVCIgLSBUYWNoIHdyb3RlIHRvIElNUQorICAgIHsKKyAgICAgIHdoaWxlKCAoKytJbmZMb29wQnJrIDwgSU5GSU5JVEVfSU1RX0JSRUFLKSAmJiAoTW9yZU1lc3NhZ2VzID09MSkgKSAKKyAgICAgIHsKKyAgICAgICAgTW9yZU1lc3NhZ2VzID0gQ3BxVHNQcm9jZXNzSU1RRW50cnkoIEhvc3RBZGFwdGVyKTsgLy8gcmV0IDAgd2hlbiBkb25lCisgICAgICB9CisgICAgICBpZiggSW5mTG9vcEJyayA+PSBJTkZJTklURV9JTVFfQlJFQUsgKQorICAgICAgeworICAgICAgICBwcmludGsoIldBUk5JTkc6IENvbXBhcSBGQyBhZGFwdGVyIGdlbmVyYXRpbmcgZXhjZXNzaXZlIElOVHMgLVJFUExBQ0VcbiIpOworICAgICAgICBwcmludGsoIm9yIGludmVzdGlnYXRlIGFsdGVybmF0ZSBjYXVzZXMgKGUuZy4gcGh5c2ljYWwgRkMgbGF5ZXIpXG4iKTsKKyAgICAgIH0KKworICAgICAgZWxzZSAgLy8gd29ya2luZyBub3JtYWxseSAtIHJlLWVuYWJsZSBJTlRzIGFuZCBjb250aW51ZQorICAgICAgICB3cml0ZWIoIDB4MUYsIGNwcWZjSEJBLT5mY0NoaXAuUmVnaXN0ZXJzLklOVEVOLmFkZHJlc3MpOworICAgIAorICAgIH0gIC8vICguLi5Qcm9jZXNzSU1RRW50cnkoKSBjbGVhcnMgSU5UIGJ5IHdyaXRpbmcgSU1RIGNvbnN1bWVyKQorICAgIGVsc2UgIC8vIGluZGljYXRpb25zIG9mIGVycm9ycyBvciBwcm9ibGVtcy4uLgorICAgICAgICAgIC8vIHRoZXNlIHVzdWFsbHkgaW5kaWNhdGUgY3JpdGljYWwgc3lzdGVtIGhhcmR3YXJlIHByb2JsZW1zLgorICAgIHsKKyAgICAgIGlmKCBJbnRQZW5kaW5nICYgMHgxMCApCisgIAlwcmludGsoIiBjcHFmY1RTIGFkYXB0ZXIgZXh0ZXJuYWwgbWVtb3J5IHBhcml0eSBlcnJvciBkZXRlY3RlZFxuIik7CisgICAgICBpZiggSW50UGVuZGluZyAmIDB4OCApCisgIAlwcmludGsoIiBjcHFmY1RTIGFkYXB0ZXIgUENJIG1hc3RlciBhZGRyZXNzIGNyb3NzZWQgNDUtYml0IGJvdW5kYXJ5XG4iKTsKKyAgICAgIGlmKCBJbnRQZW5kaW5nICYgMHgyICkKKwlwcmludGsoIiBjcHFmY1RTIGFkYXB0ZXIgRE1BIGVycm9yIGRldGVjdGVkXG4iKTsKKyAgICAgIGlmKCBJbnRQZW5kaW5nICYgMHgxICkgeworICAJVUNIQVIgSW50U3RhdDsKKyAgCXByaW50aygiIGNwcWZjVFMgYWRhcHRlciBQQ0kgZXJyb3IgZGV0ZWN0ZWRcbiIpOworICAJSW50U3RhdCA9IHJlYWRiKCBjcHFmY0hCQS0+ZmNDaGlwLlJlZ2lzdGVycy5JTlRTVEFULmFkZHJlc3MpOworCXByaW50aygiY3BxZmM6IElTUiA9IDB4JTAyeFxuIiwgSW50U3RhdCk7CisJaWYgKEludFN0YXQgJiAweDEpIHsKKwkJX191MTYgcGNpc3RhdDsKKwkJLyogcmVhZCB0aGUgcGNpIHN0YXR1cyByZWdpc3RlciAqLworCQlwY2lfcmVhZF9jb25maWdfd29yZChjcHFmY0hCQS0+UGNpRGV2LCAweDA2LCAmcGNpc3RhdCk7CisJCXByaW50aygiUENJIHN0YXR1cyByZWdpc3RlciBpcyAweCUwNHhcbiIsIHBjaXN0YXQpOworCQlpZiAocGNpc3RhdCAmIDB4ODAwMCkgcHJpbnRrKCJQYXJpdHkgRXJyb3IgRGV0ZWN0ZWQuXG4iKTsKKwkJaWYgKHBjaXN0YXQgJiAweDQwMDApIHByaW50aygiU2lnbmFsbGVkIFN5c3RlbSBFcnJvclxuIik7CisJCWlmIChwY2lzdGF0ICYgMHgyMDAwKSBwcmludGsoIlJlY2VpdmVkIE1hc3RlciBBYm9ydFxuIik7CisJCWlmIChwY2lzdGF0ICYgMHgxMDAwKSBwcmludGsoIlJlY2VpdmVkIFRhcmdldCBBYm9ydFxuIik7CisJCWlmIChwY2lzdGF0ICYgMHgwODAwKSBwcmludGsoIlNpZ25hbGxlZCBUYXJnZXQgQWJvcnRcbiIpOworCX0KKwlpZiAoSW50U3RhdCAmIDB4NCkgcHJpbnRrKCIoSU5UKVxuIik7CisJaWYgKEludFN0YXQgJiAweDgpIAorCQlwcmludGsoIkNSUzogUENJIG1hc3RlciBhZGRyZXNzIGNyb3NzZWQgNDYgYml0IGJvdWFuZGFyeVxuIik7CisJaWYgKEludFN0YXQgJiAweDEwKSBwcmludGsoIk1SRTogZXh0ZXJuYWwgbWVtb3J5IHBhcml0eSBlcnJvci5cbiIpOworICAgICAgfQorICAgIH0gICAgICAKKyAgfQorICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCBIb3N0QWRhcHRlci0+aG9zdF9sb2NrLCBmbGFncyk7CisgIExFQVZFKCJpbnRyX2hhbmRsZXIiKTsKKyAgcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKworCisKK2ludCBjcHFmY1RTRGVjb2RlR0JJQ3R5cGUoIFBUQUNIWU9OIGZjQ2hpcCwgY2hhciBjRXJyb3JTdHJpbmdbXSkKK3sKKyAgICAgICAgLy8gVmVyaWZ5IEdCSUMgdHlwZSAoaWYgYW55KSBhbmQgY29ycmVjdCBUYWNoeW9uIFBvcnQgU3RhdGUgTWFjaGluZQorICAgICAgICAvLyAoR0JJQykgbW9kdWxlIGRlZmluaXRpb24gaXM6CisgICAgICAgIC8vIEdQSU8xLCBHUElPMCwgR1BJTzQgZm9yIE1EMiwgTUQxLCBNRDAuICBUaGUgaW5wdXQgc3RhdGVzIGFwcGVhcgorICAgICAgICAvLyB0byBiZSBpbnZlcnRlZCAtLSBpLmUuLCBhIHNldHRpbmcgb2YgMTExIGlzIHJlYWQgd2hlbiB0aGVyZSBpcyBOTworICAgICAgICAvLyBHQklDIHByZXNlbnQuICBUaGUgTW9kdWxlIERlZiAoTUQpIHNwZWMgc2F5cyAwMDAgaXMgIm5vIEdCSUMiCisgICAgICAgIC8vIEhhcmQgY29kZSB0aGUgYml0IHN0YXRlcyB0byBkZXRlY3QgQ29wcGVyLCAKKyAgICAgICAgLy8gTG9uZyB3YXZlIChzaW5nbGUgbW9kZSksIFNob3J0IHdhdmUgKG11bHRpLW1vZGUpLCBhbmQgYWJzZW50IEdCSUMKKworICBVTE9ORyB1bEJ1ZmY7CisKKyAgc3ByaW50ZiggY0Vycm9yU3RyaW5nLCAiXG5HQklDIGRldGVjdGVkOiAiKTsKKworICB1bEJ1ZmYgPSBmY0NoaXAtPlJlZ2lzdGVycy5UWXN0YXR1cy52YWx1ZSAmIDB4MTM7IAorICBzd2l0Y2goIHVsQnVmZiApCisgIHsKKyAgY2FzZSAweDEzOiAgLy8gR1BJTzQsIEdQSU8xLCBHUElPMCA9IDExMTsgbm8gR0JJQyEKKyAgICBzcHJpbnRmKCAmY0Vycm9yU3RyaW5nWyBzdHJsZW4oIGNFcnJvclN0cmluZyldLAorICAgICAgICAgICAgIk5PTkUhICIpOworICAgIHJldHVybiBGQUxTRTsgICAgICAgICAgCisgICAgICAgICAgCisgICAgICAgCisgIGNhc2UgMHgxMTogICAvLyBDb3BwZXIgR0JJQyBkZXRlY3RlZAorICAgIHNwcmludGYoICZjRXJyb3JTdHJpbmdbIHN0cmxlbiggY0Vycm9yU3RyaW5nKV0sCisgICAgICAgICAgICAiQ29wcGVyLiAiKTsKKyAgICBicmVhazsKKworICBjYXNlIDB4MTA6ICAgLy8gTG9uZy13YXZlIChzaW5nbGUgbW9kZSkgR0JJQyBkZXRlY3RlZAorICAgIHNwcmludGYoICZjRXJyb3JTdHJpbmdbIHN0cmxlbiggY0Vycm9yU3RyaW5nKV0sCisgICAgICAgICJMb25nLXdhdmUuICIpOworICAgIGJyZWFrOworICBjYXNlIDB4MTogICAgLy8gU2hvcnQtd2F2ZSAobXVsdGkgbW9kZSkgR0JJQyBkZXRlY3RlZAorICAgIHNwcmludGYoICZjRXJyb3JTdHJpbmdbIHN0cmxlbiggY0Vycm9yU3RyaW5nKV0sCisgICAgICAgICJTaG9ydC13YXZlLiAiKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDogICAgIC8vIHVua25vd24gR0JJQyAtIHByZXN1bWFibHkgaXQgd2lsbCB3b3JrICg/KQorICAgIHNwcmludGYoICZjRXJyb3JTdHJpbmdbIHN0cmxlbiggY0Vycm9yU3RyaW5nKV0sCisgICAgICAgICAgICAiVW5rbm93bi4gIik7CisgICAgICAgICAgCisgICAgYnJlYWs7CisgIH0gIC8vIGVuZCBzd2l0Y2ggR0JJQyBkZXRlY3Rpb24KKworICByZXR1cm4gVFJVRTsKK30KKworCisKKworCisKK2ludCBjcHFmY1RTR2V0TFBTTSggUFRBQ0hZT04gZmNDaGlwLCBjaGFyIGNFcnJvclN0cmluZ1tdKQoreworICAvLyBUYWNoeW9uJ3MgRnJhbWUgTWFuYWdlciBMUFNNIGluIExpbmtEb3duIHN0YXRlPworICAvLyAoRm9yIG5vbi1sb29wIHBvcnQsIGNoZWNrIFBTTSBpbnN0ZWFkLikKKyAgLy8gcmV0dXJuIHN0cmluZyB3aXRoIHN0YXRlIGFuZCBGQUxTRSBpcyBMaW5rIERvd24KKworICBpbnQgTGlua1VwOworCisgIGlmKCBmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZSAmIDB4ODAgKSAKKyAgICBMaW5rVXAgPSBGQUxTRTsKKyAgZWxzZQorICAgIExpbmtVcCA9IFRSVUU7CisKKyAgc3ByaW50ZiggJmNFcnJvclN0cmluZ1sgc3RybGVuKCBjRXJyb3JTdHJpbmcpXSwKKyAgICAiIExQU00gJVhoICIsIAorICAgICAoZmNDaGlwLT5SZWdpc3RlcnMuRk1zdGF0dXMudmFsdWUgPj40KSAmIDB4ZiApOworCisKKyAgc3dpdGNoKCBmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZSAmIDB4RjApCisgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYml0cyBzZXQgaW4gTFBTTQorICAgIGNhc2UgMHgxMDoKKyAgICAgIHNwcmludGYoICZjRXJyb3JTdHJpbmdbIHN0cmxlbiggY0Vycm9yU3RyaW5nKV0sICJBUkIiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHgyMDoKKyAgICAgIHNwcmludGYoICZjRXJyb3JTdHJpbmdbIHN0cmxlbiggY0Vycm9yU3RyaW5nKV0sICJBUkJ3b24iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHgzMDoKKyAgICAgIHNwcmludGYoICZjRXJyb3JTdHJpbmdbIHN0cmxlbiggY0Vycm9yU3RyaW5nKV0sICJPUEVOIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4NDA6CisgICAgICBzcHJpbnRmKCAmY0Vycm9yU3RyaW5nWyBzdHJsZW4oIGNFcnJvclN0cmluZyldLCAiT1BFTmVkIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4NTA6CisgICAgICBzcHJpbnRmKCAmY0Vycm9yU3RyaW5nWyBzdHJsZW4oIGNFcnJvclN0cmluZyldLCAiWG1pdENMUyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDYwOgorICAgICAgc3ByaW50ZiggJmNFcnJvclN0cmluZ1sgc3RybGVuKCBjRXJyb3JTdHJpbmcpXSwgIlJ4Q0xTIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4NzA6CisgICAgICBzcHJpbnRmKCAmY0Vycm9yU3RyaW5nWyBzdHJsZW4oIGNFcnJvclN0cmluZyldLCAiWGZlciIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDgwOgorICAgICAgc3ByaW50ZiggJmNFcnJvclN0cmluZ1sgc3RybGVuKCBjRXJyb3JTdHJpbmcpXSwgIkluaXQiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg5MDoKKyAgICAgIHNwcmludGYoICZjRXJyb3JTdHJpbmdbIHN0cmxlbiggY0Vycm9yU3RyaW5nKV0sICJPLUlJbml0RmluIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4YTA6CisgICAgICBzcHJpbnRmKCAmY0Vycm9yU3RyaW5nWyBzdHJsZW4oIGNFcnJvclN0cmluZyldLCAiTy1JUHJvdG9jb2wiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHhiMDoKKyAgICAgIHNwcmludGYoICZjRXJyb3JTdHJpbmdbIHN0cmxlbiggY0Vycm9yU3RyaW5nKV0sICJPLUlMaXBSY3ZkIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4YzA6CisgICAgICBzcHJpbnRmKCAmY0Vycm9yU3RyaW5nWyBzdHJsZW4oIGNFcnJvclN0cmluZyldLCAiSG9zdENvbnRyb2wiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHhkMDoKKyAgICAgIHNwcmludGYoICZjRXJyb3JTdHJpbmdbIHN0cmxlbiggY0Vycm9yU3RyaW5nKV0sICJMb29wRmFpbCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweGUwOgorICAgICAgc3ByaW50ZiggJmNFcnJvclN0cmluZ1sgc3RybGVuKCBjRXJyb3JTdHJpbmcpXSwgIk9mZmxpbmUiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHhmMDoKKyAgICAgIHNwcmludGYoICZjRXJyb3JTdHJpbmdbIHN0cmxlbiggY0Vycm9yU3RyaW5nKV0sICJPbGRQb3J0Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDA6CisgICAgZGVmYXVsdDoKKyAgICAgIHNwcmludGYoICZjRXJyb3JTdHJpbmdbIHN0cmxlbiggY0Vycm9yU3RyaW5nKV0sICJNb25pdG9yIik7CisgICAgICBicmVhazsKKworICB9CisKKyAgcmV0dXJuIExpbmtVcDsKK30KKworCisKKworI2luY2x1ZGUgImxpbnV4L3NsYWIuaCIKKworLy8gRHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBhbGlnbm1lbnQgcm91dGluZXMKKy8vIEhQJ3MgVGFjaHlvbiBGaWJyZSBDaGFubmVsIENvbnRyb2xsZXIgY2hpcHMgcmVxdWlyZQorLy8gY2VydGFpbiBtZW1vcnkgcXVldWVzIGFuZCByZWdpc3RlciBwb2ludGVycyB0byBiZSBhbGlnbmVkCisvLyBvbiB2YXJpb3VzIGJvdW5kYXJpZXMsIHVzdWFsbHkgdGhlIHNpemUgb2YgdGhlIFF1ZXVlIGluIHF1ZXN0aW9uLgorLy8gQWxpZ25tZW50IG1pZ2h0IGJlIG9uIDIsIDQsIDgsIC4uLiBvciBldmVuIDUxMiBieXRlIGJvdW5kYXJpZXMuCisvLyBTaW5jZSBtb3N0IE8vU3MgZG9uJ3QgYWxsb3cgdGhpcyAodXN1YWxseSBvbmx5IENhY2hlIGFsaWduZWQgLQorLy8gMzItYnl0ZSBib3VuZGFyeSksIHRoZXNlIHJvdXRpbmVzIHByb3ZpZGUgZ2VuZXJpYyBhbGlnbm1lbnQgKGFmdGVyCisvLyBPL1MgYWxsb2NhdGlvbikgYXQgYW55IGJvdW5kYXJ5LCBhbmQgc3RvcmUgdGhlIG9yaWdpbmFsIGFsbG9jYXRlZAorLy8gcG9pbnRlciBmb3IgZGVsZXRpb24gKE8vUyBmcmVlIGZ1bmN0aW9uKS4gIFR5cGljYWxseSwgd2UgZXhwZWN0CisvLyB0aGVzZSBmdW5jdGlvbnMgdG8gb25seSBiZSBjYWxsZWQgYXQgSEJBIGluaXRpYWxpemF0aW9uIGFuZAorLy8gcmVtb3ZhbCB0aW1lIChsb2FkIGFuZCB1bmxvYWQgdGltZXMpCisvLyBBTEdPUklUSE0gbm90ZXM6CisvLyBNZW1vcnkgYWxsb2NhdGlvbiB2YXJpZXMgYnkgY29tcGlsZXIgYW5kIHBsYXRmb3JtLiAgSW4gdGhlIHdvcnN0IGNhc2UsCisvLyB3ZSBhcmUgb25seSBhc3N1cmVkIEJZVEUgYWxpZ25tZW50LCBidXQgaW4gdGhlIGJlc3QgY2FzZSwgd2UgY2FuCisvLyByZXF1ZXN0IGFsbG9jYXRpb24gb24gYW55IGRlc2lyZWQgYm91bmRhcnkuICBPdXIgc3RyYXRlZ3k6IHBhZCB0aGUKKy8vIGFsbG9jYXRpb24gcmVxdWVzdCBzaXplIChpLmUuIHdhc3RlIG1lbW9yeSkgc28gdGhhdCB3ZSBhcmUgYXNzdXJlZAorLy8gb2YgcGFzc2luZyBkZXNpcmVkIGJvdW5kYXJ5IG5lYXIgYmVnaW5uaW5nIG9mIGNvbnRpZ3VvdXMgc3BhY2UsIHRoZW4KKy8vIG1hc2sgb3V0IGxvd2VyIGFkZHJlc3MgYml0cy4KKy8vIFdlIGRlZmluZSB0aGUgZm9sbG93aW5nIGFsZ29yaXRobToKKy8vICAgYWxsb2NCb3VuZGFyeSAtIGNvbXBpbGVyL3BsYXRmb3JtIHNwZWNpZmljIGFkZHJlc3MgYWxpZ25tZW50CisvLyAgICAgICAgICAgICAgICAgICBpbiBudW1iZXIgb2YgYnl0ZXMgKGRlZmF1bHQgaXMgc2luZ2xlIGJ5dGU7IGkuZS4gMSkKKy8vICAgbl9hbGxvYyAgICAgICAtIG51bWJlciBvZiBieXRlcyBhcHBsaWNhdGlvbiB3YW50cyBAIGFsaWduZWQgYWRkcmVzcworLy8gICBhYiAgICAgICAgICAgIC0gYWxpZ25tZW50IGJvdW5kYXJ5LCBpbiBieXRlcyAoZS5nLiA0LCAzMiwgLi4uKQorLy8gICB0X2FsbG9jICAgICAgIC0gdG90YWwgYWxsb2NhdGlvbiBuZWVkZWQgdG8gZW5zdXJlIGRlc2lyZWQgYm91bmRhcnkKKy8vICAgbWFzayAgICAgICAgICAtIHRvIGNsZWFyIGxlYXN0IHNpZ25pZmljYW50IGFkZHJlc3MgYml0cyBmb3IgYm91bmRhcnkKKy8vICAgQ29tcHV0ZToKKy8vICAgdF9hbGxvYyA9IG5fYWxsb2MgKyAoYWIgLSBhbGxvY0JvdW5kYXJ5KQorLy8gICBhbGxvY2F0ZSB0X2FsbG9jIGJ5dGVzIEAgYWxsb2NfYWRkcmVzcworLy8gICBtYXNrID0gIE5PVCAoYWIgLSAxKQorLy8gICAgICAgKGUuZy4gaWYgYWI9MzIgIF8wMDAxIDExMTEgIC0+IF8xMTEwIDAwMDAKKy8vICAgYWxpZ25lZF9hZGRyZXNzID0gYWxsb2NfYWRkcmVzcyAmIG1hc2sKKy8vICAgc2V0IG5fYWxsb2MgYnl0ZXMgdG8gMAorLy8gICByZXR1cm4gYWxpZ25lZF9hZGRyZXNzIChOVUxMIGlmIGZhaWxlZCkKKy8vCisvLyBJZiB1MzJfQWxpZ25lZEFkZHJlc3MgaXMgbm9uLXplcm8sIHRoZW4gc2VhcmNoIGZvciBCYXNlQWRkcmVzcyAoc3RvcmVkCisvLyBmcm9tIHByZXZpb3VzIGFsbG9jYXRpb24pLiAgSWYgZm91bmQsIGludm9rZSBjYWxsIHRvIEZSRUUgdGhlIG1lbW9yeS4KKy8vIFJldHVybiBOVUxMIGlmIEJhc2VBZGRyZXNzIG5vdCBmb3VuZAorCisvLyB3ZSBuZWVkIGFib3V0IDggYWxsb2NhdGlvbnMgcGVyIEhCQS4gIEZpZ3VyaW5nIGF0IG1vc3QgMTAgSEJBcyBwZXIgc2VydmVyCisvLyBzaXplIHRoZSBkeW5hbWljX21lbSBhcnJheSBhdCA4MC4KKwordm9pZCogZmNNZW1NYW5hZ2VyKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgQUxJR05FRF9NRU0gKmR5bmFtaWNfbWVtLCAKKwkJICAgVUxPTkcgbl9hbGxvYywgVUxPTkcgYWIsIFVMT05HIHUzMl9BbGlnbmVkQWRkcmVzcywKKwkJCWRtYV9hZGRyX3QgKmRtYV9oYW5kbGUpCit7CisgIFVTSE9SVCBhbGxvY0JvdW5kYXJ5PTE7ICAgLy8gY29tcGlsZXIgc3BlY2lmaWMgLSB3b3JzdCBjYXNlIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZXN0IGNhc2UgLSByZXBsYWNlIG1hbGxvYygpIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIGZ1bmN0aW9uIHRoYXQgYWxsb2NhdGVzIGV4YWN0bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCBkZXNpcmVkIGJvdW5kYXJ5CisKKyAgdW5zaWduZWQgbG9uZyB1bEFkZHJlc3M7CisgIFVMT05HIHRfYWxsb2MsIGk7CisgIHZvaWQgKmFsbG9jX2FkZHJlc3MgPSAwOyAgLy8gZGVmLiBlcnJvciBjb2RlIC8gYWRkcmVzcyBub3QgZm91bmQKKyAgTE9ORyBtYXNrOyAgICAgICAgICAgICAgICAvLyBtdXN0IGJlIDMyLWJpdHMgd2lkZSEKKworICBFTlRFUigiZmNNZW1NYW5hZ2VyIik7CisgIGlmKCB1MzJfQWxpZ25lZEFkZHJlc3MgKSAgICAgICAgICAvLyBhcmUgd2UgZnJlZWluZyBleGlzdGluZyBtZW1vcnk/CisgIHsKKy8vICAgIHByaW50aygiIGZyZWVpbmcgQWxpZ25lZEFkZHJlc3MgJVhoXG4iLCB1MzJfQWxpZ25lZEFkZHJlc3MpOworICAgIGZvciggaT0wOyBpPERZTkFNSUNfQUxMT0NBVElPTlM7IGkrKykgLy8gbG9vayBmb3IgdGhlIGJhc2UgYWRkcmVzcworICAgIHsKKy8vICAgIHByaW50aygiZHluYW1pY19tZW1bJXVdLkFsaWduZWRBZGRyZXNzICVsWFxuIiwgaSwgZHluYW1pY19tZW1baV0uQWxpZ25lZEFkZHJlc3MpOworICAgICAgaWYoIGR5bmFtaWNfbWVtW2ldLkFsaWduZWRBZGRyZXNzID09IHUzMl9BbGlnbmVkQWRkcmVzcyApCisgICAgICB7CisgICAgICAgIGFsbG9jX2FkZHJlc3MgPSBkeW5hbWljX21lbVtpXS5CYXNlQWxsb2NhdGVkOyAvLyAnc3VjY2Vzcycgc3RhdHVzCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LGR5bmFtaWNfbWVtW2ldLnNpemUsIAorCQkJCWFsbG9jX2FkZHJlc3MsIAorCQkJCWR5bmFtaWNfbWVtW2ldLmRtYV9oYW5kbGUpOworICAgICAgICBkeW5hbWljX21lbVtpXS5CYXNlQWxsb2NhdGVkID0gMDsgICAvLyBjbGVhciBmb3IgbmV4dCB1c2UKKyAgICAgICAgZHluYW1pY19tZW1baV0uQWxpZ25lZEFkZHJlc3MgPSAwOworICAgICAgICBkeW5hbWljX21lbVtpXS5zaXplID0gMDsKKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVpdCBmb3IgbG9vcDsgZG9uZQorICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIGlmKCBuX2FsbG9jICkgICAgICAgICAgICAgICAgICAgLy8gd2FudCBuZXcgbWVtb3J5PworICB7CisgICAgZG1hX2FkZHJfdCBoYW5kbGU7CisgICAgdF9hbGxvYyA9IG5fYWxsb2MgKyAoYWIgLSBhbGxvY0JvdW5kYXJ5KTsgLy8gcGFkIGJ5dGVzIGZvciBhbGlnbm1lbnQKKy8vICAgIHByaW50aygicGNpX2FsbG9jX2NvbnNpc3RlbnQoKSBmb3IgVGFjaCBhbGlnbm1lbnQ6ICVsZCBieXRlc1xuIiwgdF9hbGxvYyk7CisKKy8vICh3b3VsZCBsaWtlIHRvKSBhbGxvdyB0aHJlYWQgYmxvY2sgdG8gZnJlZSBwYWdlcyAKKyAgICBhbGxvY19hZGRyZXNzID0gICAgICAgICAgICAgICAgICAvLyB0b3RhbCBieXRlcyAoTnVtYmVyT2ZCeXRlcykKKyAgICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHRfYWxsb2MsICZoYW5kbGUpOyAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBtYXNrIG9mZiBsZWFzdCBzaWcuIGJpdHMgb2YgYWRkcmVzcworICAgIGlmKCBhbGxvY19hZGRyZXNzICkgICAgICAgICAgIC8vIChvbmx5IGlmIG5vbi1OVUxMKQorICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHBsYWNlIHRvIHN0b3JlIHB0ciwgc28gd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gZnJlZSBpdCBsYXRlci4uLgorCisgICAgICBtYXNrID0gKExPTkcpKGFiIC0gMSk7ICAgICAgICAgICAgLy8gbWFzayBhbGwgbG93LW9yZGVyIGJpdHMKKyAgICAgIG1hc2sgPSB+bWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52ZXJ0IGJpdHMKKyAgICAgIGZvciggaT0wOyBpPERZTkFNSUNfQUxMT0NBVElPTlM7IGkrKykgLy8gbG9vayBmb3IgZnJlZSBzbG90CisgICAgICB7CisgICAgICAgIGlmKCBkeW5hbWljX21lbVtpXS5CYXNlQWxsb2NhdGVkID09IDApIC8vIHRha2UgMXN0IGF2YWlsYWJsZQorICAgICAgICB7CisgICAgICAgICAgZHluYW1pY19tZW1baV0uQmFzZUFsbG9jYXRlZCA9IGFsbG9jX2FkZHJlc3M7Ly8gYWRkcmVzcyBmcm9tIE8vUworICAgICAgICAgIGR5bmFtaWNfbWVtW2ldLmRtYV9oYW5kbGUgPSBoYW5kbGU7CisJICBpZiAoZG1hX2hhbmRsZSAhPSBOVUxMKSAKKwkgIHsKKy8vICAgICAgICAgICAgIHByaW50aygiaGFuZGxlID0gJXAsIGFiPSVkLCBib3VuZGFyeSA9ICVkLCBtYXNrPTB4JTA4eFxuIiwgCisvLwkJCWhhbmRsZSwgYWIsIGFsbG9jQm91bmRhcnksIG1hc2spOworCSAgICAqZG1hX2hhbmRsZSA9IChkbWFfYWRkcl90KSAKKwkJKCgoKFVMT05HKWhhbmRsZSkgKyAoYWIgLSBhbGxvY0JvdW5kYXJ5KSkgJiBtYXNrKTsKKwkgIH0KKyAgICAgICAgICBkeW5hbWljX21lbVtpXS5zaXplID0gdF9hbGxvYzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdWxBZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpYWxsb2NfYWRkcmVzczsKKyAgICAgIAorICAgICAgdWxBZGRyZXNzICs9IChhYiAtIGFsbG9jQm91bmRhcnkpOyAgICAvLyBhZGQgdGhlIGFsaWdubWVudCBieXRlcy0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB0cnVuY2F0ZSBhZGRyZXNzLi4uCisgICAgICBhbGxvY19hZGRyZXNzID0gKHZvaWQqKSh1bEFkZHJlc3MgJiBtYXNrKTsKKyAgICAgIAorICAgICAgZHluYW1pY19tZW1baV0uQWxpZ25lZEFkZHJlc3MgPSAKKwkoVUxPTkcpKHVsQWRkcmVzcyAmIG1hc2spOyAvLyAzMmJpdCBUYWNoIGFkZHJlc3MKKyAgICAgIG1lbXNldCggYWxsb2NfYWRkcmVzcywgMCwgbl9hbGxvYyApOyAgLy8gY2xlYXIgbmV3IG1lbW9yeQorICAgIH0KKyAgICBlbHNlICAvLyBPL1MgZHluYW1pYyBtZW0gYWxsb2MgZmFpbGVkIQorICAgICAgYWxsb2NfYWRkcmVzcyA9IDA7ICAvLyAoZm9yIGRlYnVnZ2luZyBicmVha3B0KQorCisgIH0KKworICBMRUFWRSgiZmNNZW1NYW5hZ2VyIik7CisgIHJldHVybiBhbGxvY19hZGRyZXNzOyAgLy8gZ29vZCAob3IgTlVMTCkgYWRkcmVzcworfQorCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5kZXRlY3QgICAgICAgICAgICAgICAgID0gY3BxZmNUU19kZXRlY3QsCisJLnJlbGVhc2UgICAgICAgICAgICAgICAgPSBjcHFmY1RTX3JlbGVhc2UsCisJLmluZm8gICAgICAgICAgICAgICAgICAgPSBjcHFmY1RTX2luZm8sCisJLnByb2NfaW5mbyAgICAgICAgICAgICAgPSBjcHFmY1RTX3Byb2NfaW5mbywKKwkuaW9jdGwgICAgICAgICAgICAgICAgICA9IGNwcWZjVFNfaW9jdGwsCisJLnF1ZXVlY29tbWFuZCAgICAgICAgICAgPSBjcHFmY1RTX3F1ZXVlY29tbWFuZCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgICA9IGNwcWZjVFNfZWhfZGV2aWNlX3Jlc2V0LAorCS5laF9hYm9ydF9oYW5kbGVyICAgICAgID0gY3BxZmNUU19laF9hYm9ydCwgCisJLmJpb3NfcGFyYW0gICAgICAgICAgICAgPSBjcHFmY1RTX2Jpb3NwYXJhbSwgCisJLmNhbl9xdWV1ZSAgICAgICAgICAgICAgPSBDUFFGQ1RTX1JFUV9RVUVVRV9MRU4sCisJLnRoaXNfaWQgICAgICAgICAgICAgICAgPSAtMSwgCisJLnNnX3RhYmxlc2l6ZSAgICAgICAgICAgPSBTR19BTEwsIAorCS5jbWRfcGVyX2x1biAgICAgICAgICAgID0gQ1BRRkNUU19DTURfUEVSX0xVTiwKKwkudXNlX2NsdXN0ZXJpbmcgICAgICAgICA9IEVOQUJMRV9DTFVTVEVSSU5HLAorfTsKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3BxZmNUU2lvY3RsLmggYi9kcml2ZXJzL3Njc2kvY3BxZmNUU2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI1NTM2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9jcHFmY1RTaW9jdGwuaApAQCAtMCwwICsxLDk0IEBACisvLyBmb3IgdXNlciBhcHBzLCBtYWtlIHN1cmUgZGF0YSBzaXplIHR5cGVzIGFyZSBkZWZpbmVkCisvLyB3aXRoIAorCisKKyNkZWZpbmUgQ0NQUUZDVFNfSU9DX01BR0lDICdaJworCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgX191OCBidXM7CisgIF9fdTggZGV2X2ZuOworICBfX3UzMiBib2FyZF9pZDsKK30gY3BxZmNfcGNpX2luZm9fc3RydWN0OworCit0eXBlZGVmIF9fdTMyIERyaXZlclZlcl90eXBlOworLyoKK3R5cGVkZWYgdW5pb24KK3sKKyAgc3RydWN0ICAvLyBQZXJpcGhlcmFsIFVuaXQgRGV2aWNlCisgIHsgCisgICAgX191OCBCdXM6NjsKKyAgICBfX3U4IE1vZGU6MjsgIC8vIGIwMAorICAgIF9fdTggRGV2OworICB9IFBlcmlwRGV2OworICBzdHJ1Y3QgIC8vIFZvbHVtZSBTZXQgQWRkcmVzcworICB7IAorICAgIF9fdTggRGV2TVNCOjY7CisgICAgX191OCBNb2RlOjI7ICAvLyBiMDEKKyAgICBfX3U4IERldkxTQjsKKyAgfSBMb2dEZXY7CisgIHN0cnVjdCAgLy8gTG9naWNhbCBVbml0IERldmljZSAoU0NTSS0zLCBTQ0MtMiBkZWZpbmVkKQorICB7IAorICAgIF9fdTggVGFyZzo2OworICAgIF9fdTggTW9kZToyOyAgLy8gYjEwCisgICAgX191OCBEZXY6NTsKKyAgICBfX3U4IEJ1czozOworCisgIH0gTG9nVW5pdDsKK30gU0NTSTNBZGRyX3N0cnVjdDsKKworCit0eXBlZGVmIHN0cnVjdAoreworICBTQ1NJM0FkZHJfc3RydWN0IEZDUF9OZXh1czsKKyAgX191OCBjZGJbMTZdOworfSBQYXNzVGhydV9Db21tYW5kX3N0cnVjdDsKKyovCisKKy8qIHRoaXMgaXMgbmVhcmx5IGR1cGxpY2F0ZWQgaW4gaWRhc2hhcmUuaCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQJbGM7ICAgIAkJLyogQ29udHJvbGxlciBudW1iZXIgKi8KKyAgaW50CW5vZGU7CQkvKiBOb2RlIChib3gpIG51bWJlciAqLworICBpbnQJbGQ7CQkvKiBMb2dpY2FsIERyaXZlIG9uIHRoaXMgYm94LCBpZiByZXF1aXJlZCAqLworICBfX3UzMiBuZXh1czsgICAgICAgICAgLyogU0NTSSBOZXh1cyAqLworICB2b2lkCSphcmdwOwkJLyogQXJndW1lbnQgcG9pbnRlciAqLworfSBWRU5ET1JfSU9DVExfUkVROworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhcgljZGJbMTZdOwkvKiBTQ1NJIENEQiBmb3IgdGhlIHBhc3MtdGhyb3VnaCAqLworICB1c2hvcnQgYnVzOwkJLyogVGFyZ2V0IGJ1cyBvbiB0aGUgYm94ICovCisgIHVzaG9ydCBwZHJpdmU7CS8qIFBoeXNpY2FsIGRyaXZlIG9uIHRoZSBib3ggKi8KKyAgaW50IGxlbjsgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiB0aGUgZGF0YSBhcmVhIG9mIHRoZSBDREIgKi8KKyAgaW50IHNlbnNlX2xlbjsJLyogTGVuZ3RoIG9mIHRoZSBzZW5zZSBkYXRhICovCisgIGNoYXIgc2Vuc2VfZGF0YVs0MF07ICAvKiBTZW5zZSBkYXRhICovCisgIHZvaWQgKmJ1ZnA7CQkvKiBEYXRhIGFyZWEgZm9yIHRoZSBDREIgKi8KKyAgY2hhciByd19mbGFnOwkJLyogUmVhZCBDREIgb3IgV3JpdGUgQ0RCICovCit9IGNwcWZjX3Bhc3N0aHJ1X3Q7CisKKy8qCisqKiBEZWZpbmVzIGZvciB0aGUgSU9DVExTLgorKi8KKworI2RlZmluZSBWRU5ET1JfUkVBRF9PUENPREUJCQkweDI2CisjZGVmaW5lIFZFTkRPUl9XUklURV9PUENPREUJCQkweDI3CisKKyNkZWZpbmUgQ1BRRkNUU19HRVRQQ0lJTkZPIF9JT1IoIENDUFFGQ1RTX0lPQ19NQUdJQywgMSwgY3BxZmNfcGNpX2luZm9fc3RydWN0KQorI2RlZmluZSBDUFFGQ1RTX0dFVERSSVZWRVIgX0lPUiggQ0NQUUZDVFNfSU9DX01BR0lDLCA5LCBEcml2ZXJWZXJfdHlwZSkKKworI2RlZmluZSBDUFFGQ1RTX1NDU0lfUEFTU1RIUlUgX0lPV1IoIENDUFFGQ1RTX0lPQ19NQUdJQywxMSwgVkVORE9SX0lPQ1RMX1JFUSkKKworLyogV2Ugd291bGQgcmF0aGVyIGhhdmUgZXF1aXZhbGVudCBnZW5lcmljLCBsb3ctbGV2ZWwgZHJpdmVyIGFnbm9zdGljIAoraW9jdGxzIHRoYXQgZG8gd2hhdCBDUFFGQ19JT0NUTF9GQ19UQVJHRVRfQUREUkVTUyBhbmQgCitDUFFGQ19JT0NUTF9GQ19URFIgMHg1Mzg4IGRvLCBidXQgY3VycmVudGx5LCB3ZSBkbyBub3QgaGF2ZSB0aGVtLCAKK2NvbnNlcXVlbnRseSBhcHBsaWNhdGlvbnMgd291bGQgaGF2ZSB0byBrbm93IHRoZXkgYXJlIHRhbGtpbmcgdG8gY3BxZmMuICovCisgICAKKy8qIFVzZWQgdG8gZ2V0IEZpYnJlIENoYW5uZWwgV1dOIGFuZCBwb3J0X2lkIGZyb20gZGV2aWNlICovCisvLyAjZGVmaW5lIENQUUZDX0lPQ1RMX0ZDX1RBUkdFVF9BRERSRVNTIDB4NTM4NworI2RlZmluZSBDUFFGQ19JT0NUTF9GQ19UQVJHRVRfQUREUkVTUyBcCisJX0lPUiggQ0NQUUZDVFNfSU9DX01BR0lDLCAxMywgU2NzaV9GQ1RhcmdBZGRyZXNzKQorCisvKiBVc2VkIHRvIGludm9rZSBUYXJnZXQgRGVmaWNlIFJlc2V0IGZvciBGaWJyZSBDaGFubmVsICovCisvLyAjZGVmaW5lIENQUUZDX0lPQ1RMX0ZDX1REUiAweDUzODgKKyNkZWZpbmUgQ1BRRkNfSU9DVExfRkNfVERSIF9JTyggQ0NQUUZDVFNfSU9DX01BR0lDLCAxNSkKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2NwcWZjVFNzdHJ1Y3RzLmggYi9kcml2ZXJzL3Njc2kvY3BxZmNUU3N0cnVjdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmFlMzI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2NwcWZjVFNzdHJ1Y3RzLmgKQEAgLTAsMCArMSwxNTMwIEBACisvKiBDb3B5cmlnaHQoYykgMjAwMCwgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uCisgKiBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIgNjQtYml0LCA2Nk1IeiBQQ0kgCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgdGVzdGVkIG9uOgorICogKGZyb250KTogW2NoaXBdIFRhY2h5b24gVFMgSFBGQy01MTY2QS8xLjIgIEwyQzEwOTAgLi4uCisgKiAgICAgICAgICBTUCMgUDIyNUNYQ0JGSUVMNlQsIFJldiBYQworICogICAgICAgICAgU1AjIDE2MTI5MC0wMDEsIFJldiBYRAorICogKGJhY2spOiBCb2FyZCBOby4gMDEwMDA4LTAwMSBBL1cgUmV2IFg1LCBGQUIgUkVWIFg1CisgKiAgCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiBXcml0dGVuIGJ5IERvbiBaaW1tZXJtYW4KKyovCisjaWZuZGVmIENQUUZDVFNTVFJVQ1RTX0gKKyNkZWZpbmUgQ1BRRkNUU1NUUlVDVFNfSAorCisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4gIC8vIHRpbWVyIGRlY2xhcmF0aW9uIGluIG91ciBob3N0IGRhdGEKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSAiY3BxZmNUU2lvY3RsLmgiCisKKyNkZWZpbmUgRGJnRGVsYXkoc2VjcykgeyBpbnQgd2FpdF90aW1lOyBwcmludGsoICIgRGJnRGVsYXkgJWRzICIsIHNlY3MpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCB3YWl0X3RpbWU9amlmZmllcyArIChzZWNzKkhaKTsgXAorCQkgICAgICAgICB0aW1lX2JlZm9yZShqaWZmaWVzLCB3YWl0X3RpbWUpIDspIDsgfQorCisjZGVmaW5lIENQUUZDVFNfRFJJVkVSX1ZFUihtYWosbWluLHN1Ym1pbikgKChtYWo8PDE2KXwobWluPDw4KXwoc3VibWluKSkKKy8vIGRvbid0IGZvcmdldCB0byBhbHNvIGNoYW5nZSBNT0RVTEVfREVTQ1JJUFRJT04gaW4gY3BxZmNUU2luaXQuYworI2RlZmluZSBWRVJfTUFKT1IgMgorI2RlZmluZSBWRVJfTUlOT1IgNQorI2RlZmluZSBWRVJfU1VCTUlOT1IgNAorCisvLyBNYWNyb3MgZm9yIGtlcm5lbCAoZXNwLiBTTVApIHRyYWNpbmcgdXNpbmcgYSBQQ0kgYW5hbHl6ZXIKKy8vIChlLmcuIHg4NikuCisvLyNkZWZpbmUgUENJX0tFUk5FTF9UUkFDRQorI2lmZGVmIFBDSV9LRVJORUxfVFJBQ0UKKyNkZWZpbmUgUENJX1RSQUNFKHgpIGlubCggZmNDaGlwLT5SZWdpc3RlcnMuSU9CYXNlTCAreCk7CisjZGVmaW5lIFBDSV9UUkFDRU8oeCx5KSBvdXRsKCB4LCAoZmNDaGlwLT5SZWdpc3RlcnMuSU9CYXNlTCAreSkpOworI2Vsc2UKKworI2RlZmluZSBQQ0lfVFJBQ0UoeCkgCisjZGVmaW5lIFBDSV9UUkFDRU8oeCx5KQorI2VuZGlmCisKKwkJCSAKKy8vI2RlZmluZSBERUJVR19DTU5EIDEgICAvLyBkZWJ1ZyBvdXRwdXQgZm9yIExpbnV4IFNjc2kgQ0RCcworLy8jZGVmaW5lIERVTU1ZQ01ORF9EQkcgMQorCisvLyNkZWZpbmUgREVCVUdfQ1BRRkNUUyAxCisvLyN1bmRlZiBERUJVR19DUFFGQ1RTIAorI2lmZGVmIERFQlVHX0NQUUZDVFMKKyNkZWZpbmUgRU5URVIoeCkJcHJpbnRrKCJjcHFmY3RzIDogZW50ZXJpbmcgJXMoKVxuIiwgeCk7CisjZGVmaW5lIExFQVZFKHgpCXByaW50aygiY3BxZmN0cyA6IGxlYXZpbmcgJXMoKVxuIiwgeCk7CisjZGVmaW5lIERFQlVHKHgpCXgKKyNlbHNlCisjZGVmaW5lIEVOVEVSKHgpCisjZGVmaW5lIExFQVZFKHgpCisjZGVmaW5lIERFQlVHKHgpCisjZW5kaWYJCQkJLyogREVCVUdfQ1BRRkNUUyAqLworCisvLyNkZWZpbmUgREVCVUdfQ1BRRkNUU19QQ0kgMQorLy8jdW5kZWYgREVCVUdfQ1BRRkNUU19QQ0kKKyNpZiBERUJVR19DUFFGQ1RTX1BDSQorI2RlZmluZSBERUJVR19QQ0koeCkJeAorI2Vsc2UKKyNkZWZpbmUgREVCVUdfUENJKHgpCisjZW5kaWYJCQkJLyogREVCVUdfQ1BRRkNUU19QQ0kgKi8KKworI2RlZmluZSBTVEFDSExJVEU2Nl9UUzEyICAiQ29tcGFxIEZpYnJlQ2hhbm5lbCBIQkEgVGFjaHlvbiBUUyBIUEZDLTUxNjZBLzEuMiIKKyNkZWZpbmUgU1RBQ0hMSVRFNjZfVFMxMyAgIkNvbXBhcSBGaWJyZUNoYW5uZWwgSEJBIFRhY2h5b24gVFMgSFBGQy01MTY2QS8xLjMiCisjZGVmaW5lIFNUQUNITElURV9VTktOT1dOICJDb21wYXEgRmlicmVDaGFubmVsIEhCQSBUYWNoeW9uIENoaXAvQm9hcmQgVmVyPz8iCisjZGVmaW5lIFNBR0lMRU5UX1hMMl8yMSAgICJBZ2lsZW50IEZDIEhCQSwgVGFjaHlvbiBYTDIgSFBGQy01MjAwQi8yLjEiCisKKy8vIFBEQSBpcyBQZXJpcGhlcmFsIERldmljZSBBZGRyZXNzLCBWU0EgaXMgVm9sdW1lIFNldCBBZGRyZXNzaW5nCisvLyBMaW51eCBTQ1NJIHBhcmFtZXRlcnMKKyNkZWZpbmUgQ1BRRkNUU19NQVhfVEFSR0VUX0lEIDY0CisKKy8vIE5vdGUsIGNoYW5naW5nIENQUUZDVFNfTUFYX0xVTiB0byBsZXNzIHRoYW4gMzIgKGUuZywgOCkgd2lsbCByZXN1bHQgaW4KKy8vIHN0cmFuZ2UgYmVoYXZpb3IgaWYgYSBib3ggd2l0aCBtb3JlIHRoYW4sIGUuZy4gOCwgaXMgb24gdGhlIGxvb3AuCisjZGVmaW5lIENQUUZDVFNfTUFYX0xVTiAzMiAgICAvLyBUaGUgUkEtNHgwMCBzdXBwb3J0cyAzMiAoTGludXggU0NTSSBzdXBwb3J0cyA4KQorI2RlZmluZSBDUFFGQ1RTX01BWF9DSEFOTkVMIDAgLy8gT25lIEZDIHBvcnQgb24gY3BxZmNUUyBIQkEKKworI2RlZmluZSBDUFFGQ1RTX0NNRF9QRVJfTFVOIDE1IC8vIHBvd2VyIG9mIDIgLTEsIG11c3QgYmUgPjAgCisjZGVmaW5lIENQUUZDVFNfUkVRX1FVRVVFX0xFTiAoVEFDSF9TRVNUX0xFTi8yKSAvLyBtdXN0IGJlIDwgVEFDSF9TRVNUX0xFTgorCisjZGVmaW5lIExpbnV4VmVyc2lvbkNvZGUodiwgcCwgcykgKCgodik8PDE2KSsoKHApPDw4KSsocykpCisjaWZuZGVmIERFQ0xBUkVfTVVURVhfTE9DS0VECisjZGVmaW5lIERFQ0xBUkVfTVVURVhfTE9DS0VEKHNlbSkgc3RydWN0IHNlbWFwaG9yZSBzZW0gPSBNVVRFWF9MT0NLRUQKKyNlbmRpZgorCisjZGVmaW5lIERFVl9OQU1FICJjcHFmY1RTIgorCitzdHJ1Y3QgU3VwcG9ydGVkUENJY2FyZHMKK3sKKyAgX191MTYgdmVuZG9yX2lkOworICBfX3UxNiBkZXZpY2VfaWQ7Cit9OworCQkJIAorLy8gbm46bm4gZGVub3RlcyBiaXQgZmllbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUYWNoeW9uSGVhZGVyIHN0cnVjdCBkZWYuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZpZWxkcyBzaGFyZWQgd2l0aCBPREIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGhhdmUgc2FtZSB2YWx1ZQorCisKKworCisjaWZuZGVmIEJZVEUKKy8vdHlwZWRlZiBVQ0hBUiBCWVRFOwordHlwZWRlZiBfX3U4IEJZVEU7CisjZW5kaWYKKyNpZm5kZWYgVUNIQVIKK3R5cGVkZWYgX191OCBVQ0hBUjsKKyNlbmRpZgorI2lmbmRlZiBMT05HCit0eXBlZGVmIF9fczMyIExPTkc7CisjZW5kaWYKKyNpZm5kZWYgVUxPTkcKK3R5cGVkZWYgX191MzIgVUxPTkc7CisjZW5kaWYKKyNpZm5kZWYgUFZPSUQKK3R5cGVkZWYgdm9pZCAqIFBWT0lEOworI2VuZGlmCisjaWZuZGVmIFVTSE9SVAordHlwZWRlZiBfX3UxNiBVU0hPUlQ7CisjZW5kaWYKKyNpZm5kZWYgQk9PTEVBTgordHlwZWRlZiBfX3U4IEJPT0xFQU47CisjZW5kaWYKKworCisvLyBtYWNybyBmb3IgRkMtUEggcmVqZWN0IGNvZGVzCisvLyBwYXlsb2FkIGZvcm1hdCBmb3IgTFNfUkpUIChGQyBwYXlsb2FkcyBhcmUgYmlnIGVuZGlhbik6CisvLyAgICAgYnl0ZSAgMCAgICAgICAgIDEgICAgICAgICAyICAgICAgICAgMyAgKE1TQikKKy8vIERXT1JEIDAgICAwMSAgICAgICAgMDAgICAgICAgIDAwICAgICAgICAwMAorLy8gRFdPUkQgMSAgIHJlc3ZkICAgICBjb2RlICAgICAgZXhwbC4gICAgIHZlbmRvcgorCisjZGVmaW5lIExTX1JKVF9SRUFTT04oIGNvZGUsIGV4cGwpICgoIGNvZGU8PDgpIHwgKGV4cGwgPDwxNikpCisKKworI2RlZmluZSBUYWNoTGl0ZVNUQVRVUyAweDEyCisKKy8vIEZpYnJlIENoYW5uZWwgRVhDSEFOR0Ugc3RhdHVzIGNvZGVzIGZvciBUYWNoeW9uIGNoaXBzLyBkcml2ZXIgc29mdHdhcmUKKy8vIDMyLWJpdCBFUlJPUiB3b3JkIGRlZmluZXMKKyNkZWZpbmUgSU5WQUxJRF9BUkdTIDB4MQorI2RlZmluZSBMTktEV05fT1NMUyAgMHgyCisjZGVmaW5lIExOS0RXTl9MQVNFUiAweDQKKyNkZWZpbmUgT1VUUVVFX0ZVTEwgIDB4OAorI2RlZmluZSBEUklWRVJRX0ZVTEwgMHgxMAorI2RlZmluZSBTRVNUX0ZVTEwgICAgMHgyMAorI2RlZmluZSBCQURfQUxQQSAgICAgMHg0MAorI2RlZmluZSBPVkVSRkxPVyAgICAgMHg4MCAgLy8gaW5ib3VuZCBDTQorI2RlZmluZSBDT1VOVF9FUlJPUiAgICAgMHgxMDAgIC8vIGluYm91bmQgQ00KKyNkZWZpbmUgTElOS0ZBSUxfUlggICAgIDB4MjAwICAvLyBpbmJvdW5kIENNCisjZGVmaW5lIEFCT1JUU0VRX05PVElGWSAweDQwMCAgLy8gb3V0Ym91bmQgQ00KKyNkZWZpbmUgTElOS0ZBSUxfVFggICAgIDB4ODAwICAvLyBvdXRib3VuZCBDTQorI2RlZmluZSBIT1NUUFJPR19FUlIgICAgIDB4MTAwMCAgLy8gb3V0Ym91bmQgQ00KKyNkZWZpbmUgRlJBTUVfVE8gICAgICAgICAweDIwMDAgIC8vIG91dGJvdW5kIENNCisjZGVmaW5lIElOVl9FTlRSWSAgICAgICAgMHg0MDAwICAvLyBvdXRib3VuZCBDTQorI2RlZmluZSBTRVNUUFJPR19FUlIgICAgIDB4ODAwMCAgLy8gb3V0Ym91bmQgQ00KKyNkZWZpbmUgT1VUQk9VTkRfVElNRU9VVCAweDEwMDAwTCAvLyB0aW1lb3V0IHdhaXRpbmcgZm9yIFRhY2h5b24gb3V0Ym91bmQgQ00KKyNkZWZpbmUgSU5JVElBVE9SX0FCT1JUICAweDIwMDAwTCAvLyBpbml0aWF0b3IgZXhjaGFuZ2UgdGltZW91dCBvciBPL1MgQUJPUlQKKyNkZWZpbmUgTUVNUE9PTF9GQUlMICAgICAweDQwMDAwTCAvLyBPL1MgbWVtb3J5IHBvb2wgYWxsb2NhdGlvbiBmYWlsZWQKKyNkZWZpbmUgRkMyX1RJTUVPVVQgICAgICAweDgwMDAwTCAvLyBkcml2ZXIgdGltZW91dCBmb3IgbG9zdCBmcmFtZXMKKyNkZWZpbmUgVEFSR0VUX0FCT1JUICAgICAweDEwMDAwMEwgLy8gQUJUUyByZWNlaXZlZCBmcm9tIEZDIHBvcnQKKyNkZWZpbmUgRVhDSEFOR0VfUVVFVUVEICAweDIwMDAwMEwgLy8gZS5nLiBMaW5rIFN0YXRlIHdhcyBMRG4gb24gZmNTdGFydAorI2RlZmluZSBQT1JUSURfQ0hBTkdFRCAgIDB4NDAwMDAwTCAvLyBmYyBQb3J0IGFkZHJlc3MgY2hhbmdlZAorI2RlZmluZSBERVZJQ0VfUkVNT1ZFRCAgIDB4ODAwMDAwTCAvLyBmYyBQb3J0IGFkZHJlc3MgY2hhbmdlZAorLy8gU2V2ZXJhbCBlcnJvciBzY2VuYXJpb3MgcmVzdWx0IGluIFNFU1QgRXhjaGFuZ2UgZnJhbWVzIAorLy8gdW5leHBlY3RlZGx5IGFycml2aW5nIGluIHRoZSBTRlEKKyNkZWZpbmUgU0ZRX0ZSQU1FICAgICAgICAweDEwMDAwMDBMIC8vIFNGUSBmcmFtZXMgZnJvbSBvcGVuIEV4Y2hhbmdlCisKKy8vIE1heGltdW0gbnVtYmVyIG9mIEhvc3QgQnVzIEFkYXB0ZXJzIChIQkEpIC8gY29udHJvbGxlcnMgc3VwcG9ydGVkCisvLyBvbmx5IGltcG9ydGFudCBmb3IgbWVtIGFsbG9jYXRpb24gZGltZW5zaW9ucyAtIGluY3JlYXNlIGFzIG5lY2Vzc2FyeQorCisjZGVmaW5lIE1BWF9BREFQVEVSUyA4CisjZGVmaW5lIE1BWF9SWF9QQVlMT0FEIDEwMjQgIC8vIGhhcmR3YXJlIGRlcGVuZGVudCBtYXggZnJhbWUgcGF5bG9hZAorLy8gVGFjaCBoZWFkZXIgc3RydWMgZGVmaW5lcworI2RlZmluZSBTT0ZpMyAweDcKKyNkZWZpbmUgU09GZiAgMHg4CisjZGVmaW5lIFNPRm4zIDB4QgorI2RlZmluZSBFT0ZuICAweDUKKyNkZWZpbmUgRU9GdCAgMHg2CisKKy8vIEZDUCBSX0NUTCBkZWZpbmVzCisjZGVmaW5lIEZDUF9DTU5EIDB4NgorI2RlZmluZSBGQ1BfWEZFUl9SRFkgMHg1CisjZGVmaW5lIEZDUF9SU1AgMHg3CisjZGVmaW5lIEZDUF9SRVNQT05TRSAweDc3NyAvLyAoYXJiaXRyYXJ5ICMpCisjZGVmaW5lIE5FRURfRkNQX1JTUCAweDc3ICAvLyAoYXJiaXRyYXJ5ICMpCisjZGVmaW5lIEZDUF9EQVRBIDB4MQorCisjZGVmaW5lIFJFU0VUX1RBQ0ggMHgxMDAgLy8gUmVzZXQgVGFjaHlvbi9UYWNoTGl0ZQorI2RlZmluZSBTQ1NJX0lXRSAweDIwMDAgIC8vIGluaXRpYXRvciB3cml0ZSBlbnRyeSAoZm9yIFNFU1QpCisjZGVmaW5lIFNDU0lfSVJFIDB4MzAwMCAgLy8gaW5pdGlhdG9yIHJlYWQgZW50cnkgKGZvciBTRVNUKQorI2RlZmluZSBTQ1NJX1RSRSAweDQwMCAgLy8gdGFyZ2V0IHJlYWQgZW50cnkgKGZvciBTRVNUKQorI2RlZmluZSBTQ1NJX1RXRSAweDUwMCAgLy8gdGFyZ2V0IHdyaXRlIGVudHJ5IChmb3IgU0VTVCkKKyNkZWZpbmUgVE9HR0xFX0xBU0VSIDB4ODAwCisjZGVmaW5lIExJUCAweDkwMAorI2RlZmluZSBDTEVBUl9GQ1BPUlRTIDk5IC8vIChhcmJpdHJhcnkgIykgZnJlZSBtZW0gZm9yIExvZ2dlZCBpbiBwb3J0cworI2RlZmluZSBGTUlOSVQgMHg3MDcgICAgIC8vIChhcmJpdHJhcnkpIGZvciBGcmFtZSBNYW5hZ2VyIEluaXQgY29tbWFuZAorCisvLyBCTFMgPT0gQmFzaWMgTGluayBTZXJ2aWNlCisvLyBFTFMgPT0gRXh0ZW5kZWQgTGluayBTZXJ2aWNlCisjZGVmaW5lIEJMU19OT1AgNAorI2RlZmluZSBCTFNfQUJUUyAweDEwICAgLy8gRkMtUEggQmFzaWMgTGluayBTZXJ2aWNlIEFib3J0IFNlcXVlbmNlCisjZGVmaW5lIEJMU19BQlRTX0FDQyAweDEwMCAgLy8gRkMtUEggQmFzaWMgTGluayBTZXJ2aWNlIEFib3J0IFNlcXVlbmNlIEFjY2VwdAorI2RlZmluZSBCTFNfQUJUU19SSlQgMHgxMDEgIC8vIEZDLVBIIEJhc2ljIExpbmsgU2VydmljZSBBYm9ydCBTZXF1ZW5jZSBSZWplY3QKKyNkZWZpbmUgRUxTX1BMT0dJIDB4MDMgIC8vIEZDLVBIIFBvcnQgTG9naW4gKGFyYml0cmFyeSBhc3NpZ24pCisjZGVmaW5lIEVMU19TQ1IgICAweDcwICAvLyAoYXJiIGFzc2lnbikgU3RhdGUgQ2hhbmdlIFJlZ2lzdHJhdGlvbiAoRmFicmljKQorI2RlZmluZSBGQ1NfTlNSICAgMHg3MiAgLy8gKGFyYiBhc3NpZ24pIE5hbWUgU2VydmljZSBSZXF1ZXN0IChGYWJyaWMpCisjZGVmaW5lIEVMU19GTE9HSSAweDQ0ICAvLyAoYXJiIGFzc2lnbikgRmFicmljIExvZ2luCisjZGVmaW5lIEVMU19GRElTQyAweDQxICAvLyAoYXJiIGFzc2lnbikgRmFicmljIERpc2NvdmVyeSAoTG9naW4pCisjZGVmaW5lIEVMU19QRElTQyAweDUwICAvLyBGQy1QSDIgUG9ydCBEaXNjb3ZlcnkKKyNkZWZpbmUgRUxTX0FCVFggIDB4MDYgIC8vIEZDLVBIIEFib3J0IEV4Y2hhbmdlIAorI2RlZmluZSBFTFNfTE9HTyAweDA1ICAgLy8gRkMtUEggUG9ydCBMb2dvdXQKKyNkZWZpbmUgRUxTX1BSTEkgMHgyMCAgIC8vIEZDUC1TQ1NJIFByb2Nlc3MgTG9naW4KKyNkZWZpbmUgRUxTX1BSTE8gMHgyMSAgIC8vIEZDUC1TQ1NJIFByb2Nlc3MgTG9nb3V0CisjZGVmaW5lIEVMU19MT0dPX0FDQyAweDA3ICAgLy8ge0ZDLVBIfSBQb3J0IExvZ291dCBBY2NlcHQKKyNkZWZpbmUgRUxTX1BMT0dJX0FDQyAweDA4ICAvLyB7RkMtUEh9IFBvcnQgTG9naW4gQWNjZXB0CisjZGVmaW5lIEVMU19BQ0MgMHgxOCAgICAgICAgLy8ge0ZDLVBIfSAoZ2VuZXJpYykgQUNDZXB0CisjZGVmaW5lIEVMU19QUkxJX0FDQyAweDIyICAvLyB7RkNQLVNDU0l9IFByb2Nlc3MgTG9naW4gQWNjZXB0CisjZGVmaW5lIEVMU19SSlQgMHgxMDAwMDAwCisjZGVmaW5lIFNDU0lfUkVQT1JUX0xVTlMgMHgwQTAKKyNkZWZpbmUgRkNQX1RBUkdFVF9SRVNFVCAweDIwMAorCisjZGVmaW5lIEVMU19MSUxQX0ZSQU1FIDB4MDAwMDA3MTEgLy8gMXN0IHBheWxvYWQgd29yZCBvZiBMSUxQIGZyYW1lCisKKyNkZWZpbmUgU0ZRX1VOQVNTSVNURURfRkNQICAxICAvLyBJQ00sIERXb3JkMywgIlR5cGUiIHVuYXNzaXN0ZWQgRkNQCisjZGVmaW5lIFNGUV9VTktOT1dOICAgICAgICAgMHgzMSAvLyAoYXJiaXRyYXJ5KSBJQ00sIERXb3JkMywgIlR5cGUiIHVua25vd24KKworLy8gdGhlc2UgIkxJTksiIGJpdHMgcmVmZXIgdG8gbG9vcCBvciBub24tbG9vcAorI2RlZmluZSBMSU5LQUNUSVZFIDB4MiAgICAvLyBmY0xpbmtRIHR5cGUgLSBMSU5LIFVQIFRhY2h5b24gRk0gJ0x1cCcgYml0IHNldAorI2RlZmluZSBMSU5LRE9XTiAweGYyICAgICAvLyBmY0xpbmtRIHR5cGUgLSBMSU5LIERPV04gVGFjaHlvbiBGTSAnTGRuJyBiaXQgc2V0CisKKy8vI2RlZmluZSBWT0xVTUVfU0VUX0FERFJFU1NJTkcgMSAvLyAiY2hhbm5lbCIgb3IgImJ1cyIgMQorCit0eXBlZGVmIHN0cnVjdCAgICAgIC8vIDMyIGJ5dGVzIGhkciBPTkxZIChlLmcuIEZDUF9EQVRBIGJ1ZmZlciBmb3IgU0VTVCkKK3sKKyAgVUxPTkcgcmVzZXJ2ZWQ7ICAgLy8gZHdvcmQgMCAoZG9uJ3QgdXNlKQorICBVTE9ORyBzb2ZfZW9mOworICBVTE9ORyBkX2lkOyAgICAgICAvLyBkd29yZCAyIC0gMzE6MjQgUl9DVEwsIDIzOjAgRF9JRAorICBVTE9ORyBzX2lkOyAgICAgICAvLyBkd29yZCAzIC0gMzE6MjQgQ1NfQ1RMLCAyMzowIFNfSUQKKyAgVUxPTkcgZl9jdGw7ICAgICAgLy8gZHdvcmQgNCAtIDMxOjI0IFR5cGUsICAyMzowIEZfQ1RMCisgIFVMT05HIHNlcV9jbnQ7ICAgIC8vIGR3b3JkIDUgLSAzMToyNCBTRVFfSUQsIDIzOjE2IERGX0NUTCwgMTU6MCBTRVFfQ05UCisgIFVMT05HIG94X3J4X2lkOyAgIC8vIGR3b3JkIDYgLSAzMToxNiBPWF9JRCwgIDE1OjAgUlhfSUQKKyAgVUxPTkcgcm87ICAgICAgICAgLy8gZHdvcmQgNyAtIHJlbGF0aXZlIG9mZnNldAorfSBUYWNoRkNIRFI7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTk9URSEhIHRoZSBmb2xsb3dpbmcgc3RydWN0IE1VU1QgYmUgNjQgYnl0ZXMuCit0eXBlZGVmIHN0cnVjdCAgICAgIC8vIDMyIGJ5dGVzIGhkciArIDMyIGJ5dGVzIHBheWxvYWQKK3sKKyAgVUxPTkcgcmVzZXJ2ZWQ7ICAgLy8gZHdvcmQgMCAoZG9uJ3QgdXNlIC0gbXVzdCBjbGVhciB0byAwKQorICBVTE9ORyBzb2ZfZW9mOyAgICAvLyBkd29yZCAxIC0gMzE6MjQgU09GOkVPRiwgVUFNLENMUywgTENyLCBURlYsIFRpbWVTdGFtcAorICBVTE9ORyBkX2lkOyAgICAgICAvLyBkd29yZCAyIC0gMzE6MjQgUl9DVEwsIDIzOjAgRF9JRAorICBVTE9ORyBzX2lkOyAgICAgICAvLyBkd29yZCAzIC0gMzE6MjQgQ1NfQ1RMLCAyMzowIFNfSUQKKyAgVUxPTkcgZl9jdGw7ICAgICAgLy8gZHdvcmQgNCAtIDMxOjI0IFR5cGUsICAyMzowIEZfQ1RMCisgIFVMT05HIHNlcV9jbnQ7ICAgIC8vIGR3b3JkIDUgLSAzMToyNCBTRVFfSUQsIDIzOjE2IERGX0NUTCwgMTU6MCBTRVFfQ05UCisgIFVMT05HIG94X3J4X2lkOyAgIC8vIGR3b3JkIDYgLSAzMToxNiBPWF9JRCwgIDE1OjAgUlhfSUQKKyAgVUxPTkcgcm87ICAvLyBkd29yZCA3IC0gcmVsYXRpdmUgb2Zmc2V0CisvLy0tLS0tLS0tLQorICBfX3UzMiBwbFs4XTsgICAgICAgICAgICAgIC8vIGR3b3JkcyA4LTE1IGZyYW1lIGRhdGEgcGF5bG9hZAorfSBUYWNoRkNIRFJfQ01ORDsKKworCit0eXBlZGVmIHN0cnVjdCAgICAgIC8vIDMyIGJ5dGVzIGhkciArIDEyMCBieXRlcyBwYXlsb2FkCit7CisgIFVMT05HIHJlc2VydmVkOyAgIC8vIGR3b3JkIDAgKGRvbid0IHVzZSAtIG11c3QgY2xlYXIgdG8gMCkKKyAgVUxPTkcgc29mX2VvZjsgICAgLy8gZHdvcmQgMSAtIDMxOjI0IFNPRjpFT0YsIFVBTSxDTFMsIExDciwgVEZWLCBUaW1lU3RhbXAKKyAgVUxPTkcgZF9pZDsgICAgICAgLy8gZHdvcmQgMiAtIDMxOjI0IFJfQ1RMLCAyMzowIERfSUQKKyAgVUxPTkcgc19pZDsgICAgICAgLy8gZHdvcmQgMyAtIDMxOjI0IENTX0NUTCwgMjM6MCBTX0lECisgIFVMT05HIGZfY3RsOyAgICAgIC8vIGR3b3JkIDQgLSAzMToyNCBUeXBlLCAgMjM6MCBGX0NUTAorICBVTE9ORyBzZXFfY250OyAgICAvLyBkd29yZCA1IC0gMzE6MjQgU0VRX0lELCAyMzoxNiBERl9DVEwsIDE1OjAgU0VRX0NOVAorICBVTE9ORyBveF9yeF9pZDsgICAvLyBkd29yZCA2IC0gMzE6MTYgT1hfSUQsICAxNTowIFJYX0lECisgIFVMT05HIHJvOyAgLy8gZHdvcmQgNyAtIHJlbGF0aXZlIG9mZnNldAorLy8tLS0tLS0tLS0KKyAgX191MzIgcGxbMzBdOyAgICAgICAgICAgICAgLy8gbGFyZ2VzdCBuZWNlc3NhcnkgcGF5bG9hZCAoZm9yIExPR0lOIGNtbmRzKQorfSBUYWNoRkNIRFJfR0NNTkQ7CisKK3R5cGVkZWYgc3RydWN0ICAgICAgLy8gMzIgYnl0ZXMgaGRyICsgNjQgYnl0ZXMgcGF5bG9hZAoreworICBVTE9ORyByZXNlcnZlZDsgICAvLyBkd29yZCAwIChkb24ndCB1c2UpCisgIFVMT05HIHNvZl9lb2Y7CisgIFVMT05HIGRfaWQ7ICAgICAgIC8vIGR3b3JkIDIgLSAzMToyNCBSX0NUTCwgMjM6MCBEX0lECisgIFVMT05HIHNfaWQ7ICAgICAgIC8vIGR3b3JkIDMgLSAzMToyNCBDU19DVEwsIDIzOjAgU19JRAorICBVTE9ORyBmX2N0bDsgICAgICAvLyBkd29yZCA0IC0gMzE6MjQgVHlwZSwgIDIzOjAgRl9DVEwKKyAgVUxPTkcgc2VxX2NudDsgICAgLy8gZHdvcmQgNSAtIDMxOjI0IFNFUV9JRCwgMjM6MTYgREZfQ1RMLCAxNTowIFNFUV9DTlQKKyAgVUxPTkcgb3hfcnhfaWQ7ICAgLy8gZHdvcmQgNiAtIDMxOjE2IE9YX0lELCAgMTU6MCBSWF9JRAorICBVTE9ORyBybzsgIC8vIGR3b3JkIDcgLSByZWxhdGl2ZSBvZmZzZXQKKy8vLS0tLS0tLS0tCisgIF9fdTMyIHBsWzE4XTsgLy8gcGF5bG9hZCBmb3IgRkNQLVJTUCAocmVzcG9uc2UgYnVmZmVyKSBSQS00eDAwIGlzIDcyYnl0ZXMKK30gVGFjaEZDSERSX1JTUDsKKworCisKKworCisKKy8vIEluYm91bmQgTWVzc2FnZSBRdWV1ZSBzdHJ1Y3R1cmVzLi4uCit0eXBlZGVmIHN0cnVjdCAgICAgICAgICAgICAgLy8gZWFjaCBlbnRyeSA4IHdvcmRzICgzMiBieXRlcykKK3sKKyAgVUxPTkcgdHlwZTsgICAgICAgICAgICAgICAvLyBJTVEgY29tcGxldGlvbiBtZXNzYWdlIHR5cGVzCisgIFVMT05HIHdvcmRbN107ICAgICAgICAgICAgLy8gcmVtYWluZGVyIG9mIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVycHJldGVkIGJ5IElNUSB0eXBlCit9IFRhY2h5b25JTVFFOworCisKKy8vIFF1ZXVlcyBmb3IgVGFjaExpdGUgbm90IGluIG9yaWdpbmFsIFRhY2h5b24KKy8vIEVSUSAgICAgICAtIEV4Y2hhbmdlIFJlcXVlc3QgUXVldWUgKGZvciBvdXRib3VuZCBjb21tYW5kcykKKy8vIFNGUSAgICAgICAtIFNpbmdsZSBGcmFtZSBRdWV1ZSAoZm9yIGluY29taW5nIGZyYW1lcykKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmluZSBUYWNoeW9uIE91dGJvdW5kIENvbW1hbmQgUXVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFNpbmNlIG1hbnkgVGFjaHlvbiByZWdpc3RlcnMgYXJlIFJlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5LCBtYWludGFpbiBjb3BpZXMgZm9yIGRlYnVnZ2luZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3N0IFRhY2ggcXVlcyBuZWVkIHBvd2VyLW9mLTIgc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmUgcmVnaXN0ZXJzIGFyZSBsb2FkZWQgd2l0aCBwbzIgLTEKKyNkZWZpbmUgVEFDSF9TRVNUX0xFTiA1MTIgICAvLyBUYWNoTGl0ZSBTRVNUCisKKyNkZWZpbmUgRUxTX0VYQ0hBTkdFUyA2NCAgICAvLyBlLmcuIFBMT0dJLCBSU0NOLCAuLi4KKy8vIGRlZmluZSB0aGUgdG90YWwgbnVtYmVyIG9mIG91dHN0YW5kaW5nIChzaW11bHRhbmVvdXMpIGV4Y2hhbmdlcworI2RlZmluZSBUQUNIX01BWF9YSUQgKFRBQ0hfU0VTVF9MRU4gKyBFTFNfRVhDSEFOR0VTKSAgLy8gRUxTIGV4Y2hhbmdlcworCisjZGVmaW5lIEVSUV9MRU4gMTI4ICAgICAgICAgLy8gcG93ZXIgb2YgMiwgbWF4IDQwOTYKKworLy8gSW5ib3VuZCBNZXNzYWdlIFF1ZXVlIHN0cnVjdHVyZXMuLi4KKyNkZWZpbmUgSU1RX0xFTiA1MTIgICAgICAgICAgICAgIC8vIG1pbmltdW0gNCBlbnRyaWVzIFsocG93ZXIgb2YgMikgLSAxXQordHlwZWRlZiBzdHJ1Y3QgICAgICAgICAgICAgICAgICAgLy8gOCB3b3JkcyAtIDMyIGJ5dGVzCit7CisgIFRhY2h5b25JTVFFIFFFbnRyeVtJTVFfTEVOXTsKKyAgVUxPTkcgcHJvZHVjZXJJbmRleDsgICAvLyBJTVEgUHJvZHVjZXIgSW5kZXggcmVnaXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEAzMiBieXRlIGFsaWduCisgIFVMT05HIGNvbnN1bWVySW5kZXg7ICAgLy8gQ29uc3VtZXIgSW5kZXggcmVnaXN0ZXIgKGluIFRhY2h5b24pCisgIFVMT05HIGxlbmd0aDsgICAgICAgICAgLy8gTGVuZ3RoIHJlZ2lzdGVyCisgIFVMT05HIGJhc2U7Cit9IFRhY2h5b25JTVE7ICAgICAgICAgICAgICAgICAgICAvLyBAIDMyICogSU1RX0xFTiBhbGlnbgorCisKKwordHlwZWRlZiBzdHJ1Y3QgICAgICAgICAgIC8vIGluYm91bmQgY29tcGxldGlvbiBtZXNzYWdlCit7CisgIFVMT05HIFR5cGU7CisgIFVMT05HIEluZGV4OworICBVTE9ORyBUcmFuc2Zlckxlbmd0aDsKK30gVGFjaHlvbkluYkNNOworCisKKworLy8gYXJiaXRyYXJ5IG51bWVyaWMgdGFncyBmb3IgVEwgc3RydWN0dXJlcworI2RlZmluZSBUTF9GQ0hTIDEgIC8vIFRhY2hMaXRlIEZpYnJlIENoYW5uZWwgSGVhZGVyIFN0cnVjdHVyZQorI2RlZmluZSBUTF9JV0UgMiAgLy8gaW5pdGlhdG9yIHdyaXRlIGVudHJ5IChmb3IgU0VTVCkKKyNkZWZpbmUgVExfVFdFIDMgIC8vIHRhcmdldCB3cml0ZSBlbnRyeSAoZm9yIFNFU1QpCisjZGVmaW5lIFRMX0lSRSA0ICAvLyBpbml0aWF0b3IgcmVhZCBlbnRyeSAoZm9yIFNFU1QpCisjZGVmaW5lIFRMX1RSRSA1ICAvLyB0YXJnZXQgcmVhZCBlbnRyeSAoZm9yIFNFU1QpCisjZGVmaW5lIFRMX0lSQiA2ICAvLyBJL08gcmVxdWVzdCBibG9jaworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBJTkNPTUlORyBmcmFtZXMKKyNkZWZpbmUgU0ZRX0xFTiAzMiAgICAgICAgICAgICAgLy8gbWluaW11bSAzMiBlbnRyaWVzLCBtYXggNDA5NgorCit0eXBlZGVmIHN0cnVjdCAgICAgICAgICAgICAgICAgIC8vIFNpbmdsZSBGcmFtZSBRdWUKK3sKKyAgVGFjaEZDSERSX0NNTkQgUUVudHJ5W1NGUV9MRU5dOyAvLyBtdXN0IGJlIDY0IGJ5dGVzISEKKyAgVUxPTkcgcHJvZHVjZXJJbmRleDsgICAvLyBJTVEgUHJvZHVjZXIgSW5kZXggcmVnaXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEAzMiBieXRlIGFsaWduCisgIFVMT05HIGNvbnN1bWVySW5kZXg7ICAgLy8gQ29uc3VtZXIgSW5kZXggcmVnaXN0ZXIgKGluIFRhY2h5b24pCisgIFVMT05HIGxlbmd0aDsgICAgICAgICAgLy8gTGVuZ3RoIHJlZ2lzdGVyCisgIFVMT05HIGJhc2U7Cit9IFRhY2hMaXRlU0ZROworCisKK3R5cGVkZWYgc3RydWN0ICAgICAgICAgICAgICAgICAvLyBJL08gUmVxdWVzdCBCbG9jayBmbGFncworeworICBVQ0hBUiAgQlJEIDogMTsKKyAgVUNIQVIgICAgICA6IDE7IC8vIHJlc2VydmVkCisgIFVDSEFSICBTRkEgOiAxOworICBVQ0hBUiAgRE5DIDogMTsKKyAgVUNIQVIgIERJTiA6IDE7CisgIFVDSEFSICBEQ00gOiAxOworICBVQ0hBUiAgQ1RTIDogMTsKKyAgVUNIQVIgIFNCViA6IDE7ICAvLyBJUkIgZW50cnkgdmFsaWQgLSBJUkInQicgb25seQorfSBJUkJmbGFnczsKKwordHlwZWRlZiBzdHJ1Y3QgICAgICAgICAgICAgICAgICAvLyBJL08gUmVxdWVzdCBCbG9jaworeyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVxdWVzdCAnQScKKyAgVUxPTkcgUmVxX0FfU0ZTX0xlbjsgICAgIC8vIHRvdGFsIGZyYW1lIGxlbiAoaGRyICsgcGF5bG9hZCksIG1pbiAzMgorICBVTE9ORyBSZXFfQV9TRlNfQWRkcjsgICAgLy8gMzItYml0IHBvaW50ZXIgdG8gRkNIUyBzdHJ1Y3QgKHRvIGJlIHNlbnQpCisgIFVMT05HIFJlcV9BX1NGU19EX0lEOyAgICAvLyAyNC1iaXQgRkMgZGVzdGluYXRpb24gKGkuZS4gOCBiaXQgYWxfcGEpCisgIFVMT05HIFJlcV9BX1RyYW5zX0lEOyAgICAvLyBYX0lEIChPWF9JRCBvciBSWF9JRCkgYW5kL29yIEluZGV4IGluIFNFU1QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcXVlc3QgJ0InCisgIFVMT05HIFJlcV9CX1NGU19MZW47ICAgICAvLyB0b3RhbCBmcmFtZSBsZW4gKGhkciArIHBheWxvYWQpLCBtaW4gMzIKKyAgVUxPTkcgUmVxX0JfU0ZTX0FkZHI7ICAgIC8vIDMyLWJpdCBwb2ludGVyIHRvIEZDSFMgc3RydWN0ICh0byBiZSBzZW50KQorICBVTE9ORyBSZXFfQl9TRlNfRF9JRDsgICAgLy8gMjQtYml0IEZDIGRlc3RpbmF0aW9uIChpLmUuIDggYml0IGFsX3BhKQorICBVTE9ORyBSZXFfQl9UcmFuc19JRDsgICAgLy8gWF9JRCAoT1hfSUQgb3IgUlhfSUQpIGFuZC9vciBJbmRleCBpbiBTRVNUCit9IFRhY2hMaXRlSVJCOworCisKK3R5cGVkZWYgc3RydWN0ICAgICAgICAgICAvLyBUYWNoTGl0ZSBwbGFjZWhvbGRlciBmb3IgSVJCcworeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsaWduZWQgQHNpemVvZihFUlEpIGZvciBUYWNoTGl0ZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1BWCBjb21tYW5kcyBpcyBzdW0gb2YgU0VTVCBsZW4gYW5kIEVSUQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGtub3cgdGhhdCBlYWNoIFNFU1QgZW50cnkgcmVxdWlyZXMgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJUkIgKEVSUSkgZW50cnk7IGluIGFkZGl0aW9uLCB3ZSBwcm92aWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRVJRX0xFTgorICBUYWNoTGl0ZUlSQiBRRW50cnlbRVJRX0xFTl07IC8vIEJhc2UgcmVnaXN0ZXI7IGVudHJpZXMgMzIgYnl0ZXMgZWEuCisgIFVMT05HIGNvbnN1bWVySW5kZXg7ICAgLy8gQ29uc3VtZXIgSW5kZXggcmVnaXN0ZXIKKyAgVUxPTkcgcHJvZHVjZXJJbmRleDsgICAvLyBFUlEgUHJvZHVjZXIgSW5kZXggcmVnaXN0ZXIKKyAgVUxPTkcgbGVuZ3RoOyAgICAgICAgICAvLyBMZW5ndGggcmVnaXN0ZXIKKyAgVUxPTkcgYmFzZTsgICAgICAgICAgICAvLyBjb3B5IG9mIGJhc2UgcHRyIGZvciBkZWJ1ZworICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cnVjdCBpcyBzaXplZCBmb3IgbGFyZ2VzdCBleHBlY3RlZCBjbW5kIChMT0dJTikKK30gVGFjaExpdGVFUlE7CisKKy8vIGZvciBub3csIGp1c3QgMzIgYml0IERNQSwgZXZlbnR1YWxseSA0MHNvbWV0aGluZywgd2l0aCBjb2RlIGNoYW5nZXMKKyNkZWZpbmUgQ1BRRkNUU19ETUFfTUFTSyAoKHVuc2lnbmVkIGxvbmcpICgweDAwMDAwMDAwRkZGRkZGRkYpKQorCisjZGVmaW5lIFRMX01BWF9TR19FTEVNX0xFTiAweDdmZmZmICAvLyBNYXggYnVmZmVyIGxlbmd0aCBhIHNpbmdsZSBTL0cgZW50cnkKKwkJCQkvLyBtYXkgcmVwcmVzZW50IChhIGhhcmR3YXJlIGxpbWl0YXRpb24pLiAgVGhlCisJCQkJLy8gb25seSByZWFzb24gdG8gZXZlciBjaGFuZ2UgdGhpcyBpcyBpZiB5b3UKKwkJCQkvLyB3YW50IHRvIGV4ZXJjaXNlIHZlcnktaGFyZC10by1yZWFjaCBjb2RlIGluCisJCQkJLy8gY3BxZmNUU3dvcmtlci5jOmJ1aWxkX1NFU1Rfc2dsaXN0KCkuCisKKyNkZWZpbmUgVExfREFOR0VSX1NHUEFHRVMgNyAgLy8gYXJiaXRyYXJ5IGhpZ2ggd2F0ZXIgbWFyayBmb3IgIyBvZiBTL0cgcGFnZXMKKwkJCQkvLyB3ZSBtdXN0IGV4Y2VlZCB0byBlbGljaXQgYSB3YXJuaW5nIGluZGljYXRpdmUKKwkJCQkvLyBvZiBFWFRSRU1FTFkgbGFyZ2UgZGF0YSB0cmFuc2ZlcnMgb3IgCisJCQkJLy8gRVhUUkVNRSBtZW1vcnkgZnJhZ21lbnRhdGlvbi4KKwkJCQkvLyAobWVhbnMgd2UganVzdCB1c2VkIHVwIDIwNDggUy9HIGVsZW1lbnRzLAorCQkJCS8vIE5ldmVyIHNlZW4gdGhpcyBpcyByZWFsIGxpZmUsIG9ubHkgaW4gCisJCQkJLy8gdGVzdGluZyB3aXRoIHRyaWNrZWQgdXAgZHJpdmVyLikKKworI2RlZmluZSBUTF9FWFRfU0dfUEFHRV9DT1VOVCAyNTYgIC8vIE51bWJlciBvZiBFeHRlbmRlZCBTY2F0dGVyL0dhdGhlciBhL2wgUEFJUlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUYWNoeW9uIHJlZ2lzdGVyIChJT0Jhc2VVIDB4NjgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG93ZXItb2YtMiB2YWx1ZSBPTkxZISAgNCBtaW4sIDI1NiBtYXgKKworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlIGxlbiBpcyAjUGFpcnMgKiAyIFVMT05HL1BhaXIgKiA0IGJ5dGVzL1VMT05HCisjZGVmaW5lIFRMX0VYVF9TR19QQUdFX0JZVEVMRU4gKFRMX0VYVF9TR19QQUdFX0NPVU5UICoyICo0KQorCisKKworLy8gU0VTVCBlbnRyeSB0eXBlczogSVdFLCBJUkUsIFRXRSwgVFJFCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgVUxPTkcgSGRyX0xlbjsKKyAgVUxPTkcgSGRyX0FkZHI7CisgIFVMT05HIFJTUF9MZW47CisgIFVMT05HIFJTUF9BZGRyOworICBVTE9ORyBCdWZmX09mZjsKKyNkZWZpbmUgVVNFU19FWFRFTkRFRF9TR0xJU1QodGhpc19zZXN0LCB4X0lEKSBcCisJKCEoKHRoaXNfc2VzdCktPnVbIHhfSUQgXS5JV0UuQnVmZl9PZmYgJiAweDgwMDAwMDAwKSkKKyAgVUxPTkcgTGluazsKKyAgVUxPTkcgUlhfSUQ7CisgIFVMT05HIERhdGFfTGVuOworICBVTE9ORyBFeHBfUk87CisgIFVMT05HIEV4cF9CeXRlX0NudDsKKyAgIC8vIC0tLSBleHRlbmRlZC9sb2NhbCBHYXRoZXIgTGVuL0FkZHJlc3MgcGFpcnMKKyAgVUxPTkcgR0xlbjE7CisgIFVMT05HIEdBZGRyMTsKKyAgVUxPTkcgR0xlbjI7CisgIFVMT05HIEdBZGRyMjsKKyAgVUxPTkcgR0xlbjM7CisgIFVMT05HIEdBZGRyMzsKK30gVGFjaExpdGVJV0U7CisKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIFVMT05HIFNlcV9BY2N1bTsKKyAgVUxPTkcgcmVzZXJ2ZWQ7ICAgICAgIC8vIG11c3QgY2xlYXIgdG8gMAorICBVTE9ORyBSU1BfTGVuOworICBVTE9ORyBSU1BfQWRkcjsKKyAgVUxPTkcgQnVmZl9PZmY7CisgIFVMT05HIEJ1ZmZfSW5kZXg7ICAgICAgICAgICAvLyBVTE9ORyA1CisgIFVMT05HIEV4cF9STzsKKyAgVUxPTkcgQnl0ZV9Db3VudDsKKyAgVUxPTkcgcmVzZXJ2ZWRfOyAgICAgIC8vIFVMT05HIDgKKyAgVUxPTkcgRXhwX0J5dGVfQ250OworICAgLy8gLS0tIGV4dGVuZGVkL2xvY2FsIFNjYXR0ZXIgTGVuL0FkZHJlc3MgcGFpcnMKKyAgVUxPTkcgU0xlbjE7CisgIFVMT05HIFNBZGRyMTsKKyAgVUxPTkcgU0xlbjI7CisgIFVMT05HIFNBZGRyMjsKKyAgVUxPTkcgU0xlbjM7CisgIFVMT05HIFNBZGRyMzsKK30gVGFjaExpdGVJUkU7CisKKwordHlwZWRlZiBzdHJ1Y3QgICAgICAgICAgLy8gVGFyZ2V0IFdyaXRlIEVudHJ5Cit7CisgIFVMT05HIFNlcV9BY2N1bTsgICAgICAvLyBkd29yZCAwCisgIFVMT05HIHJlc2VydmVkOyAgICAgICAvLyBkd29yZCAxICBtdXN0IGNsZWFyIHRvIDAKKyAgVUxPTkcgUmVtb3RlX05vZGVfSUQ7CisgIFVMT05HIHJlc2VydmVkMTsgICAgICAvLyBkd29yZCAzICBtdXN0IGNsZWFyIHRvIDAKKyAgVUxPTkcgQnVmZl9PZmY7CisgIFVMT05HIEJ1ZmZfSW5kZXg7ICAgICAvLyBVTE9ORyA1CisgIFVMT05HIEV4cF9STzsKKyAgVUxPTkcgQnl0ZV9Db3VudDsKKyAgVUxPTkcgcmVzZXJ2ZWRfOyAgICAgIC8vIFVMT05HIDgKKyAgVUxPTkcgRXhwX0J5dGVfQ250OworICAgLy8gLS0tIGV4dGVuZGVkL2xvY2FsIFNjYXR0ZXIgTGVuL0FkZHJlc3MgcGFpcnMKKyAgVUxPTkcgU0xlbjE7CisgIFVMT05HIFNBZGRyMTsKKyAgVUxPTkcgU0xlbjI7CisgIFVMT05HIFNBZGRyMjsKKyAgVUxPTkcgU0xlbjM7CisgIFVMT05HIFNBZGRyMzsKK30gVGFjaExpdGVUV0U7CisKK3R5cGVkZWYgc3RydWN0ICAgICAgCit7CisgIFVMT05HIEhkcl9MZW47CisgIFVMT05HIEhkcl9BZGRyOworICBVTE9ORyBSU1BfTGVuOyAgICAgICAgLy8gRFdvcmQgMgorICBVTE9ORyBSU1BfQWRkcjsKKyAgVUxPTkcgQnVmZl9PZmY7CisgIFVMT05HIEJ1ZmZfSW5kZXg7ICAgICAvLyBEV29yZCA1CisgIFVMT05HIHJlc2VydmVkOworICBVTE9ORyBEYXRhX0xlbjsKKyAgVUxPTkcgcmVzZXJ2ZWRfOworICBVTE9ORyByZXNlcnZlZF9fOworICAgLy8gLS0tIGV4dGVuZGVkL2xvY2FsIEdhdGhlciBMZW4vQWRkcmVzcyBwYWlycworICBVTE9ORyBHTGVuMTsgICAgICAgICAgLy8gRFdvcmQgQQorICBVTE9ORyBHQWRkcjE7CisgIFVMT05HIEdMZW4yOworICBVTE9ORyBHQWRkcjI7CisgIFVMT05HIEdMZW4zOworICBVTE9ORyBHQWRkcjM7Cit9IFRhY2hMaXRlVFJFOworCit0eXBlZGVmIHN0cnVjdCBleHRfc2dfcGFnZV9wdHJfdCAqUFNHUEFHRVM7Cit0eXBlZGVmIHN0cnVjdCBleHRfc2dfcGFnZV9wdHJfdCAKK3sKKyAgdW5zaWduZWQgY2hhciBwYWdlW1RMX0VYVF9TR19QQUdFX0JZVEVMRU4gKiAyXTsgLy8gMnggZm9yIGFsaWdubWVudAorICBkbWFfYWRkcl90IGJ1c2FkZHI7IAkvLyBuZWVkIHRoZSBidXMgYWRkcmVzc2VzIGFuZAorICB1bnNpZ25lZCBpbnQgbWFwbGVuOyAgLy8gbGVuZ3RocyBmb3IgbGF0ZXIgcGNpIHVubWFwcGluZy4KKyAgUFNHUEFHRVMgbmV4dDsKK30gU0dQQUdFUzsgLy8gbGlua2VkIGxpc3Qgb2YgUy9HIHBhaXJzLCBieSBFeGNoYW5nZQorCit0eXBlZGVmIHN0cnVjdCAgICAgICAgICAgICAgICAgIC8vIFNDU0kgRXhjaGFuZ2UgU3RhdGUgVGFibGUKK3sKKyAgdW5pb24gICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW50cnkgY2FuIGJlIElXRSwgSVJFLCBUV0UsIFRSRQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA2NCBieXRlcyBwZXIgZW50cnkKKyAgICBUYWNoTGl0ZUlXRSBJV0U7CisgICAgVGFjaExpdGVJUkUgSVJFOworICAgIFRhY2hMaXRlVFdFIFRXRTsKKyAgICBUYWNoTGl0ZVRSRSBUUkU7CisgIH0gdVtUQUNIX1NFU1RfTEVOXTsKKworICBUYWNoRkNIRFIgRGF0YUhEUltUQUNIX1NFU1RfTEVOXTsgLy8gZm9yIFNFU1QgRkNQX0RBVEEgZnJhbWUgaGRyIChubyBwbCkKKyAgVGFjaEZDSERSX1JTUCBSc3BIRFJbVEFDSF9TRVNUX0xFTl07IC8vIHNwYWNlIGZvciBTRVNUIEZDUF9SU1AgZnJhbWUKKyAgUFNHUEFHRVMgc2dQYWdlc1tUQUNIX1NFU1RfTEVOXTsgLy8gaGVhZCBvZiBsaW5rZWQgbGlzdCBvZiBQb29sLWFsbG9jYXRpb25zCisgIFVMT05HIGxlbmd0aDsgICAgICAgICAgLy8gTGVuZ3RoIHJlZ2lzdGVyCisgIFVMT05HIGJhc2U7ICAgICAgICAgICAgLy8gY29weSBvZiBiYXNlIHB0ciBmb3IgZGVidWcKK30gVGFjaFNFU1Q7CisKKworCit0eXBlZGVmIHN0cnVjdCAgICAgICAgICAgICAgICAgIC8vIGVhY2ggcmVnaXN0ZXIgaGFzIGl0J3Mgb3duIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHZhbHVlICh1c2VkIGZvciB3cml0ZS1vbmx5IHJlZ3MpCit7CisgIHZvaWQqIGFkZHJlc3M7CisgIHZvbGF0aWxlIFVMT05HIHZhbHVlOworfSBGQ1JFR0lTVEVSOworCit0eXBlZGVmIHN0cnVjdCAgICAgICAgIC8vIEhvc3QgY29weSAtIFRhY2hMaXRlIFJlZ2lzdGVycworeworICBVTE9ORyBJT0Jhc2VMLCBJT0Jhc2VVOyAgLy8gSS9PIHBvcnQgbG93ZXIgYW5kIHVwcGVyIFRMIHJlZ2lzdGVyIGFkZHJlc3NlcworICBVTE9ORyBNZW1CYXNlOyAgICAgICAgICAgLy8gbWVtb3J5IG1hcHBlZCByZWdpc3RlciBhZGRyZXNzZXMKKyAgdm9pZCogUmVNYXBNZW1CYXNlOyAgICAgIC8vIE8vUyBWTSByZWZlcmVuY2UgZm9yIE1lbUJhc2UKKyAgVUxPTkcgd3duX2hpOyAgICAgICAgICAgIC8vIFdXTiBpcyBzZXQgb25jZSBhdCBzdGFydHVwCisgIFVMT05HIHd3bl9sbzsKKyAgVUxPTkcgbXlfYWxfcGE7ICAgICAgICAgIC8vIGFsX3BhIHJlY2VpdmVkIGFmdGVyIExJUCgpCisgIFVMT05HIFJPTUNUUjsgICAgICAgICAgICAvLyBmbGFncyBmb3Igb24tYm9hcmQgUkFNL1JPTQorICBVTE9ORyBSQU1CYXNlOyAgICAgICAgICAgLy8gb24tYm9hcmQgUkFNIChpLmUuIHNvbWUgVGFjaGxpdGVzKQorICBVTE9ORyBTUk9NQmFzZTsgICAgICAgICAgLy8gb24tYm9hcmQgRUVQUk9NIChzb21lIFRhY2hsaXRlcykKKyAgVUxPTkcgUENJTUNUUjsgICAgICAgICAgIC8vIFBDSSBNYXN0ZXIgQ29udHJvbCBSZWcgKGhhcyBidXMgd2lkdGgpCisKKyAgRkNSRUdJU1RFUiBJTlRFTjsgICAgICAgIC8vIGNvcHkgb2YgaW50ZXJydXB0IGVuYWJsZSBtYXNrCisgIEZDUkVHSVNURVIgSU5UUEVORDsgICAgICAvLyBpbnRlcnJ1cHQgcGVuZGluZworICBGQ1JFR0lTVEVSIElOVFNUQVQ7ICAgICAgLy8gaW50ZXJydXB0IHN0YXR1cworICBGQ1JFR0lTVEVSIFNGUWNvbnN1bWVySW5kZXg7IAorICBGQ1JFR0lTVEVSIEVSUXByb2R1Y2VySW5kZXg7IAorICBGQ1JFR0lTVEVSIFRZY29uZmlnOyAgIC8vIFRhY2hZb24gKGNoaXAgbGV2ZWwpCisgIEZDUkVHSVNURVIgVFljb250cm9sOworICBGQ1JFR0lTVEVSIFRZc3RhdHVzOworICBGQ1JFR0lTVEVSIEZNY29uZmlnOyAgIC8vIEZyYW1lIE1hbmFnZXIgKEZDIGxvb3AgbGV2ZWwpCisgIEZDUkVHSVNURVIgRk1jb250cm9sOworICBGQ1JFR0lTVEVSIEZNc3RhdHVzOworICBGQ1JFR0lTVEVSIEZNTGlua1N0YXR1czE7CisgIEZDUkVHSVNURVIgRk1MaW5rU3RhdHVzMjsKKyAgRkNSRUdJU1RFUiBGTUJCX0NyZWRpdFplcm87CisgIEZDUkVHSVNURVIgc3RhdHVzOworICBGQ1JFR0lTVEVSIGVkX3RvdjsgICAgIC8vIGVycm9yIGRldGVjdCB0aW1lLW91dCB2YWx1ZQorICBGQ1JFR0lTVEVSIHJjdl9hbF9wYTsgIC8vIHJlY2VpdmVkIGFyYi4gbG9vcCBwaHlzaWNhbCBhZGRyZXNzCisgIEZDUkVHSVNURVIgcHJpbWl0aXZlOyAgLy8gZS5nLiBMSVAoKSwgT1BOKCksIC4uLgorfSBUTF9SRUdJU1RFUlM7CisKKworCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgVUxPTkcgb2s7CisgIFVMT05HIGludmFsaWRBcmdzOworICBVTE9ORyBsaW5rRG93bjsKKyAgVUxPTkcgbGlua1VwOworICBVTE9ORyBvdXRRdWVGdWxsOworICBVTE9ORyBTRVNURnVsbDsKKyAgVUxPTkcgaHBlOyAgICAvLyBob3N0IHByb2dyYW1taW5nIGVyciAoZnJvbSBUYWNoKQorICBVTE9ORyBGQzRhYm9ydGVkOyAvLyBhYm9ydHMgZnJvbSBBcHBsaWNhdGlvbiBvciB1cHBlciBkcml2ZXIgbGF5ZXIKKyAgVUxPTkcgRkMyYWJvcnRlZDsgLy8gYWJvcnRzIGZyb20gb3VyIGRyaXZlcidzIHRpbWVvdXRzCisgIFVMT05HIHRpbWVvdXRzOyAgIC8vIG91ciBkcml2ZXIgdGltZW91dCAob24gaW5kaXZpZHVhbCBleGNoYW5nZXMpCisgIFVMT05HIGxvZ291dHM7ICAgIC8vIGV4cGxpY2l0IC0gc2VudCBMT0dPOyBpbXBsaWNpdCAtIGRldmljZSByZW1vdmVkCisgIFVMT05HIHJldHJpZXM7CisgIFVMT05HIGxpbmtGYWlsVFg7CisgIFVMT05HIGxpbmtGYWlsUlg7CisgIFVMT05HIENudEVycm9yczsgIC8vIGJ5dGUgY291bnQgZXhwZWN0ZWQgIT0gY291bnQgcmVjZWl2ZWQgKHR5cC4gU0VTVCkKKyAgVUxPTkcgZV9zdG9yZXM7ICAgLy8gZWxhc3RpYyBzdG9yZSBlcnJzCisgIFVMT05HIHJlc2V0czsgICAgIC8vIGhhcmQgb3Igc29mdCBjb250cm9sbGVyIHJlc2V0cworICBVTE9ORyBGTWluaXRzOyAgICAvLyBUQUNIIEZyYW1lIE1hbmFnZXIgSW5pdCAoZS5nLiBMSVBzKQorICBVTE9ORyBsbmtRdWVGdWxsOyAgLy8gdG9vIG1hbnkgTE9HSU4sIGxvb3AgY29tbWFuZHMKKyAgVUxPTkcgU2NzaVF1ZUZ1bGw7IC8vIHRvbyBtYW55IEZDUC1TQ1NJIGluYm91bmQgZnJhbWVzCisgIFVMT05HIExvc3NvZlNpZ25hbDsgICAvLyBGTSBsaW5rIHN0YXR1cyAxIHJlZ3MKKyAgVUxPTkcgQmFkUlhDaGFyOyAgIC8vIEZNIGxpbmsgc3RhdHVzIDEgcmVncworICBVTE9ORyBMb3Nzb2ZTeW5jOyAgIC8vIEZNIGxpbmsgc3RhdHVzIDEgcmVncworICBVTE9ORyBSeF9FT0ZhOyAgIC8vIEZNIGxpbmsgc3RhdHVzIDIgcmVncyAocmVjZWl2ZWQgRU9GYSkKKyAgVUxPTkcgRGlzX0ZybTsgICAvLyBGTSBsaW5rIHN0YXR1cyAyIHJlZ3MgKGRpc2NhcmRlZCBmcmFtZXMpCisgIFVMT05HIEJhZF9DUkM7ICAgLy8gRk0gbGluayBzdGF0dXMgMiByZWdzCisgIFVMT05HIEJCMF9UaW1lcjsgLy8gIEZNIEJCX0NyZWRpdCBaZXJvIFRpbWVyIFJlZworICBVTE9ORyBsb29wQnJlYWtzOyAvLyBpbmZpbml0ZSBsb29wIGV4aXRzCisgIFVMT05HIGxhc3RCQjB0aW1lcjsgIC8vIHN0YXRpYyBhY2N1bS4gYnVmZmVyIG5lZWRlZCBieSBUYWNobGl0ZQorfSBGQ1NUQVRTOworCisKK3R5cGVkZWYgc3RydWN0ICAgICAgICAgICAgICAgLy8gQ29uZmlnIE9wdGlvbnMKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTFMgQml0IGZpcnN0CisgIFVTSE9SVCAgICAgICAgOiAxOyAgICAgICAgICAgLy8gYml0MDoKKyAgVVNIT1JUICBmbG9naSA6IDE7ICAgICAgICAgICAvLyBiaXQxOiBXZSBzZW50IEZMT0dJIC0gd2FpdCBmb3IgRmFicmljIGxvZ2lucworICBVU0hPUlQgIGZhYnJpYzogMTsgICAgICAgICAgIC8vIGJpdDI6IFRhY2h5b24gZGV0ZWN0ZWQgRmFicmljIChGTSBzdGF0IExHKQorICBVU0hPUlQgIExJTFBpbjogMTsgICAgICAgICAgIC8vIGJpdDM6IFdlIGNhbiB1c2UgYW4gRkMtQUwgTElMUCBmcmFtZQorICBVU0hPUlQgIHRhcmdldDogMTsgICAgICAgICAgIC8vIGJpdDQ6IHRoaXMgUG9ydCBoYXMgU0NTSSB0YXJnZXQgY2FwYWJpbGl0eQorICBVU0hPUlQgIGluaXRpYXRvcjogICAgMTsgICAgIC8vIGJpdDU6IHRoaXMgUG9ydCBoYXMgU0NTSSBpbml0aWF0b3IgY2FwYWJpbGl0eQorICBVU0hPUlQgIGV4dExvb3BiYWNrOiAgMTsgICAgIC8vIGJpdDY6IGxvb3BiYWNrIGF0IEdCSUMKKyAgVVNIT1JUICBpbnRMb29wYmFjazogIDE7ICAgICAvLyBiaXQ3OiBsb29wYmFjayBpbiBIUCBzaWxpY29uCisgIFVTSE9SVCAgICAgICAgOiAxOyAgICAgICAgICAgLy8gYml0ODoKKyAgVVNIT1JUICAgICAgICA6IDE7ICAgICAgICAgICAvLyBiaXQ5OgorICBVU0hPUlQgICAgICAgIDogMTsgICAgICAgICAgIC8vIGJpdDEwOgorICBVU0hPUlQgICAgICAgIDogMTsgICAgICAgICAgIC8vIGJpdDExOgorICBVU0hPUlQgICAgICAgIDogMTsgICAgICAgICAgIC8vIGJpdDEyOgorICBVU0hPUlQgICAgICAgIDogMTsgICAgICAgICAgIC8vIGJpdDEzOgorICBVU0hPUlQgICAgICAgIDogMTsgICAgICAgICAgIC8vIGJpdDE0OgorICBVU0hPUlQgICAgICAgIDogMTsgICAgICAgICAgIC8vIGJpdDE1OgorfSBGQ19PUFRJT05TOworCisKKwordHlwZWRlZiBzdHJ1Y3QgZHluX21lbV9wYWlyCit7CisgIHZvaWQgKkJhc2VBbGxvY2F0ZWQ7ICAvLyBhZGRyZXNzIGFzIGFsbG9jYXRlZCBmcm9tIE8vUzsKKyAgdW5zaWduZWQgbG9uZyBBbGlnbmVkQWRkcmVzczsgLy8gYWxpZ25lZCBhZGRyZXNzICh1c2VkIGJ5IFRhY2h5b24gRE1BKQorICBkbWFfYWRkcl90IGRtYV9oYW5kbGU7CisgIHNpemVfdCBzaXplOworfSBBTElHTkVEX01FTTsKKworCisKKworLy8gdGhlc2Ugc3RydWN0cyBjb250YWluIG9ubHkgQ1JVQ0lBTCAoc3R1ZmYgd2UgYWN0dWFsbHkgdXNlKSBwYXJhbWV0ZXJzCisvLyBmcm9tIEZDLVBIKG4pIGxvZ2lucy4gIChEb24ndCBzYXZlIGVudGlyZSBMT0dJTiBwYXlsb2FkIHRvIHNhdmUgbWVtLikKKworLy8gSW1wbGljaXQgbG9nb3V0IGhhcHBlbnMgd2hlbiB0aGUgbG9vcCBnb2VzIGRvd24gLSB3ZSByZXF1aXJlIFBESVNDCisvLyB0byByZXN0b3JlLiAgRXhwbGljaXQgbG9nb3V0IGlzIHdoZW4gV0UgZGVjaWRlIG5ldmVyIHRvIHRhbGsgdG8gc29tZW9uZSwKKy8vIG9yIHdoZW4gYSB0YXJnZXQgcmVmdXNlcyB0byB0YWxrIHRvIHVzLCBpLmUuIHNlbmRzIHVzIGEgTE9HTyBmcmFtZSBvcgorLy8gTFNfUkpUIHJlamVjdCBpbiByZXNwb25zZSB0byBvdXIgUExPR0kgcmVxdWVzdC4KKworI2RlZmluZSBJTVBMSUNJVF9MT0dPVVQgMQorI2RlZmluZSBFWFBMSUNJVF9MT0dPVVQgMgorCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgVUNIQVIgY2hhbm5lbDsgLy8gU0NTSSAiYnVzIgorICBVQ0hBUiB0YXJnZXQ7CisgIFVDSEFSIElucURldmljZVR5cGU7ICAvLyBieXRlIDAgZnJvbSBTQ1NJIElucXVpcnkgcmVzcG9uc2UKKyAgVUNIQVIgVm9sdW1lU2V0QWRkcmVzc2luZzsgIC8vIEZDUC1TQ1NJIExVTiBjb2RpbmcgKDQwaCBmb3IgVlNBKQorICBVQ0hBUiBMdW5NYXNraW5nOyAgICAgLy8gVHJ1ZSBpZiBzZWxlY3RpdmUgcHJlc2VudGF0aW9uIHN1cHBvcnRlZAorICBVQ0hBUiBsdW5bQ1BRRkNUU19NQVhfTFVOXTsKK30gU0NTSV9ORVhVUzsKKworCit0eXBlZGVmIHN0cnVjdCAgICAgICAgCit7CisgIHVuaW9uIAorICB7CisgICAgVUNIQVIgdWNXV05bOF07ICAvLyBhIEZDIDY0LWJpdCBXb3JsZCBXaWRlIE5hbWUvIFBvcnRJRCBvZiB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgIC8vIGFkZHJlc3Npbmcgb2Ygc2luZ2xlIHRhcmdldCBvbiBzaW5nbGUgbG9vcC4uLgorICAgIHU2NCBsaVdXTjsKKyAgfSB1OworCisgIFVMT05HIHBvcnRfaWQ7ICAgICAvLyBhIEZDIDI0LWJpdCBhZGRyZXNzIG9mIHBvcnQgKGxvd2VyIDggYml0cyA9IGFsX3BhKQorCisjZGVmaW5lIFJFUE9SVF9MVU5TX1BMIDI1NiAgCisgIFVDSEFSIFJlcG9ydEx1bnNQYXlsb2FkW1JFUE9SVF9MVU5TX1BMXTsKKyAgCisgIFNDU0lfTkVYVVMgU2NzaU5leHVzOyAvLyBMVU5zIHBlciBGQyBkZXZpY2UKKworICBVTE9ORyBMT0dPX2NvdW50ZXI7IC8vIG1pZ2h0IHRyeSBzZXZlcmFsIHRpbWVzIGJlZm9yZSBsb2dnaW5nIG91dCBmb3IgZ29vZAorICBVTE9ORyBMT0dPX3RpbWVyOyAgIC8vIGFmdGVyIExJUCwgcG9ydHMgZXhwZWN0aW5nIFBESVNDIG11c3QgdGltZS1vdXQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgLy8gTE9HT3V0IGlmIHN1Y2Nlc3NmdWwgUERJU0Mgbm90IGNvbXBsZXRlZCBpbiAyIHNlY3MKKworICBVTE9ORyBjb25jdXJyZW50X3NlcTsgIC8vIG11c3QgYmUgMSBvciBncmVhdGVyCisgIFVMT05HIHJ4X2RhdGFfc2l6ZTsgICAgLy8gZS5nLiAxMjgsIDI1NiwgMTAyNCwgMjA0OCBwZXIgRkMtUEggc3BlYworICBVTE9ORyBCQl9jcmVkaXQ7CisgIFVMT05HIEVFX2NyZWRpdDsKKworICBVTE9ORyBmY3BfaW5mbzsgICAgICAgIC8vIGZyb20gUFJMSSAoaS5lLiBJTklUSUFUT1IvIFRBUkdFVCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbGFncyBmb3IgbG9naW4gcHJvY2VzcworICBCT09MRUFOIE9yaWdpbmF0b3I7ICAgIC8vIExvZ2luIHNlcXVlbmNlIE9yaWdpbmF0ZWQgKGlmIGZhbHNlLCB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbmRlZCB0byBhbm90aGVyIHBvcnQncyBsb2dpbiBzZXF1ZW5jZSkKKyAgQk9PTEVBTiBwbG9naTsgICAgICAgICAvLyBQTE9HSSBmcmFtZSBBQ0NlcHRlZCAob3JpZ2luYXRlZCBvciByZXNwb25kZWQpCisgIEJPT0xFQU4gcGRpc2M7ICAgICAgICAgLy8gUERJU0MgZnJhbWUgd2FzIE9SSUdJTkFURUQgKHNlbGYtbG9naW4gbG9naWMpCisgIEJPT0xFQU4gcHJsaTsgICAgICAgICAgLy8gUFJMSSBmcmFtZSBBQ0NlcHRlZCAob3JpZ2luYXRlZCBvciByZXNwb25kZWQpCisgIEJPT0xFQU4gZmxvZ2k7ICAgICAgICAgLy8gRkxPR0kgZnJhbWUgQUNDZXB0ZWQgKG9yaWdpbmF0ZWQgb3IgcmVzcG9uZGVkKQorICBCT09MRUFOIGxvZ287ICAgICAgICAgIC8vIHBvcnQgcGVybWFuZW50bHkgbG9nZ2VkIG91dCAoaW52YWxpZCBsb2dpbiBwYXJhbSkKKyAgQk9PTEVBTiBmbG9naVJlcTsgICAgICAvLyBGYWJyaWMgbG9naW4gcmVxdWlyZWQgKHNldCBpbiBMSVAgcHJvY2VzcykKKyAgVUNIQVIgaGlnaGVzdF92ZXI7CisgIFVDSEFSIGxvd2VzdF92ZXI7CisKKyAgCisgIC8vIHdoZW4gdGhlICJ0YXJnZXQiIChhY3R1YWxseSBGQyBQb3J0KSBpcyB3YWl0aW5nIGZvciBsb2dpbgorICAvLyAoZS5nLiBhZnRlciBMaW5rIHJlc2V0KSwgc2V0IHRoZSBkZXZpY2VfYmxvY2tlZCBiaXQ7CisgIC8vIGFmdGVyIFBvcnQgY29tcGxldGVzIGxvZ2luLCB1bi1ibG9jayB0YXJnZXQuCisgIFVDSEFSIGRldmljZV9ibG9ja2VkOyAvLyBzZWUgU2NzaV9EZXZpY2Ugc3RydWN0CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lIHNpbmdseS1saW5rZWQgbGlzdCBvZiBsb2dnZWQtaW4gcG9ydHMKKyAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBhIHBvcnRfaWQgaXMgaWRlbnRpZmllZCwgaXQgaXMgcmVtZW1iZXJlZCwKKyAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiB0aGUgcG9ydCBpcyByZW1vdmVkIGluZGVmaW5pdGVseQorICBQVk9JRCBwTmV4dFBvcnQ7ICAvLyBhY3R1YWxseSwgdHlwZSBQRkNfTE9HR0VESU5fUE9SVDsgdm9pZCBmb3IgQ29tcGlsZXIKKworfSBGQ19MT0dHRURJTl9QT1JULCAqUEZDX0xPR0dFRElOX1BPUlQ7CisKKworCisvLyBUaGlzIHNlcnZlcyBhcyB0aGUgRVNCIChFeGNoYW5nZSBTdGF0dXMgQmxvY2spLAorLy8gYW5kIGhhcyB0aW1lb3V0IGNvdW50ZXI7IHVzZWQgZm9yIEFCT1JUcwordHlwZWRlZiBzdHJ1Y3QgICAgICAgICAgICAgICAgCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZDLTEgWF9JRHMKKyAgVUxPTkcgdHlwZTsgICAgICAgICAgICAvLyBFTFNfUExPR0ksIFNDU0lfSVdFLCAuLi4gKDAgaWYgZnJlZSkKKyAgUEZDX0xPR0dFRElOX1BPUlQgcExvZ2dlZEluUG9ydDsgLy8gRkMgZGV2aWNlIG9uIG90aGVyIGVuZCBvZiBFeGNoYW5nZQorICBTY3NpX0NtbmQgKkNtbmQ7ICAgICAgIC8vIExpbnV4IFNDU0kgY29tbWFuZCBwYWNrZXQgaW5jbHVkZXMgUy9HIGxpc3QKKyAgVUxPTkcgdGltZU91dDsgICAgICAgICAvLyB1bml0cyBvZiA/PywgREVDIGJ5IGRyaXZlciwgQWJvcnQgd2hlbiAwCisgIFVMT05HIHJlVHJpZXM7ICAgICAgICAgLy8gbmVlZCBvbmUgb3IgbW9yZSByZXRyaWVzPworICBVTE9ORyBzdGF0dXM7ICAgICAgICAgIC8vIGZsYWdzIGluZGljYXRpbmcgZXJyb3JzICgwIGlmIG5vbmUpCisgIFRhY2hMaXRlSVJCIElSQjsgICAgICAgLy8gSS9PIFJlcXVlc3QgQmxvY2ssIGdldHMgY29waWVkIHRvIEVSUQorICBUYWNoRkNIRFJfR0NNTkQgZmNoczsgIC8vIGxvY2F0aW9uIG9mIElSQidzIFJlcV9BX1NGU19BZGRyCit9IEZDX0VYQ0hBTkdFLCAqUEZDX0VYQ0hBTkdFOworCisvLyBVbmZvcnR1bmF0ZWx5LCBMaW51eCBsaW1pdHMgb3VyIGttYWxsb2MoKSBhbGxvY2F0aW9ucyB0byAxMjhrLgorLy8gQmVjYXVzZSBvZiB0aGlzIGFuZCB0aGUgZmFjdCB0aGF0IG91ciBTY3NpUmVnaXN0ZXIgYWxsb2NhdGlvbgorLy8gaXMgYWxzbyBjb25zdHJhaW5lZCwgd2UgbW92ZSB0aGlzIGxhcmdlIHN0cnVjdHVyZSBvdXQgZm9yCisvLyBhbGxvY2F0aW9uIGFmdGVyIFNjc2kgUmVnaXN0ZXIuCisvLyAoSW4gb3RoZXIgd29yZHMsIHRoaXMgY3VtYmVyc29tZSBpbmRpcmVjdGlvbiBpcyBuZWNlc3NhcnkKKy8vIGJlY2F1c2Ugb2Yga2VybmVsIG1lbW9yeSBhbGxvY2F0aW9uIGNvbnN0cmFpbnRzISkKKwordHlwZWRlZiBzdHJ1Y3QgLy8gd2Ugd2lsbCBhbGxvY2F0ZSB0aGlzIGR5bmFtaWNhbGx5Cit7CisgIEZDX0VYQ0hBTkdFIGZjRXhjaGFuZ2VbIFRBQ0hfTUFYX1hJRCBdOworfSBGQ19FWENIQU5HRVM7CisKKworCisKKworCisKKworCisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY2hhciBOYW1lWzY0XTsgLy8gbmFtZSBvZiBjb250cm9sbGVyICgiSFAgVGFjaGxpdGUgVEwgUmV2Mi4wLCAzM01IeiwgNjRiaXQgYnVzIikKKyAgLy9QVk9JRCAgcEFkYXB0ZXJEZXZFeHQ7IC8vIGJhY2sgcG9pbnRlciB0byBkZXZpY2Ugb2JqZWN0L2V4dGVuc2lvbgorICBVTE9ORyBDaGlwVHlwZTsgICAgICAgIC8vIGxvY2FsIG51bWVyaWMga2V5IGZvciBUYWNoeW9uIFR5cGUgLyBSZXYuCisgIFVMT05HIHN0YXR1czsgICAgICAgICAgICAgIC8vIG91ciBEcml2ZXIgLSBsb2dpY2FsIHN0YXR1cworICAKKyAgVExfUkVHSVNURVJTIFJlZ2lzdGVyczsgICAgLy8gcmVnIGFkZHJlc3NlcyAmIGhvc3QgbWVtb3J5IGNvcGllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGQy00IG1hcHBpbmcgb2YgJ3RyYW5zYWN0aW9uJyB0byBYX0lEcworICBVQ0hBUiBMSUxQbWFwWzMyKjRdOyAgICAgICAvLyBMb29wIFBvc2l0aW9uIE1hcCBvZiBBTFBBcyAobGF0ZSBGQy1BTCBvbmx5KQorICBGQ19PUFRJT05TIE9wdGlvbnM7ICAgICAgICAvLyBlLmcuIFRhcmdldCwgSW5pdGlhdG9yLCBsb29wYmFjay4uLgorICBVQ0hBUiBoaWdoZXN0X0ZDUEhfdmVyOyAgICAvLyBGQy1QSCB2ZXJzaW9uIGxpbWl0cworICBVQ0hBUiBsb3dlc3RfRkNQSF92ZXI7ICAgICAvLyBGQy1QSCB2ZXJzaW9uIGxpbWl0cworCisgIEZDX0VYQ0hBTkdFUyAqRXhjaGFuZ2VzOyAgCisgIFVMT05HIGZjTHNFeGNoYW5nZUxSVTsgICAgICAgLy8gTGVhc3QgUmVjZW50bHkgVXNlZCBjb3VudGVyIChMaW5rIFNlcnZpY2UpCisgIFVMT05HIGZjU2VzdEV4Y2hhbmdlTFJVOyAgICAgICAvLyBMZWFzdCBSZWNlbnRseSBVc2VkIGNvdW50ZXIgKEZDUC1TQ1NJKQorICBGQ19MT0dHRURJTl9QT1JUIGZjUG9ydHM7ICAvLyBsaW5rZWQgbGlzdCBvZiBldmVyeSBGQyBwb3J0IGV2ZXIgc2VlbgorICBGQ1NUQVRTIGZjU3RhdHM7ICAgICAgICAgICAvLyBGQyBjb21tIGVyciBjb3VudGVycworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvc3QgbWVtb3J5IFFVRVVFIHBvaW50ZXJzCisgIFRhY2hMaXRlRVJRICpFUlE7ICAgICAgICAgIC8vIEV4Y2hhbmdlIFJlcXVlc3QgUXVlIAorICBUYWNoeW9uSU1RICpJTVE7ICAgICAgICAgICAvLyBJbmJvdW5kIE1lc3NhZ2UgUXVlIAorICBUYWNoTGl0ZVNGUSAqU0ZROyAgICAgICAgICAvLyBTaW5nbGUgRnJhbWUgUXVldWUKKyAgVGFjaFNFU1QgKlNFU1Q7ICAgICAgICAgICAgLy8gU0NTSSBFeGNoYW5nZSBTdGF0ZSBUYWJsZQorCisgIGRtYV9hZGRyX3QgZXhjaF9kbWFfaGFuZGxlOworCisgIC8vIHRoZXNlIGZ1bmN0aW9uIHBvaW50ZXJzIGFyZSBmb3IgImdlbmVyaWMiIGZ1bmN0aW9ucywgd2hpY2ggYXJlCisgIC8vIHJlcGxhY2VkIHdpdGggSG9zdCBCdXMgQWRhcHRlciB0eXBlcyBhdAorICAvLyBydW50aW1lLgorICBpbnQgKCpDcmVhdGVUYWNoeW9uUXVlcykoIHZvaWQqICwgaW50KTsKKyAgaW50ICgqRGVzdHJveVRhY2h5b25RdWVzKSggdm9pZCogLCBpbnQpOworICBpbnQgKCpMYXNlckNvbnRyb2wpKHZvaWQqLCBpbnQgKTsgICAvLyBlLmcuIE9uL09mZgorICBpbnQgKCpSZXNldFRhY2h5b24pKHZvaWQqLCBpbnQgKTsKKyAgdm9pZCAoKkZyZWV6ZVRhY2h5b24pKHZvaWQqLCBpbnQgKTsKKyAgdm9pZCAoKlVuRnJlZXplVGFjaHlvbikodm9pZCosIGludCApOworICBpbnQgKCpJbml0aWFsaXplVGFjaHlvbikodm9pZCosIGludCwgaW50ICk7CisgIGludCAoKkluaXRpYWxpemVGcmFtZU1hbmFnZXIpKHZvaWQqLCBpbnQgKTsKKyAgaW50ICgqUHJvY2Vzc0lNUUVudHJ5KSh2b2lkKik7CisgIGludCAoKlJlYWRXcml0ZVdXTikodm9pZCosIGludCBSZWFkV3JpdGUpOworICBpbnQgKCpSZWFkV3JpdGVOVlJBTSkodm9pZCosIHZvaWQqLCBpbnQgUmVhZFdyaXRlKTsKKworfSBUQUNIWU9OLCAqUFRBQ0hZT047CisKKwordm9pZCBjcHFmY1RTQ2xlYXJMaW5rU3RhdHVzQ291bnRlcnMoVEFDSFlPTiAqIGZjQ2hpcCk7CisKK2ludCBDcHFUc0NyZWF0ZVRhY2hMaXRlUXVlcyggdm9pZCogcEhCQSwgaW50IG9wY29kZSk7CitpbnQgQ3BxVHNEZXN0cm95VGFjaExpdGVRdWVzKCB2b2lkKiAsIGludCk7CitpbnQgQ3BxVHNJbml0aWFsaXplVGFjaExpdGUoIHZvaWQgKnBIQkEsIGludCBvcGNvZGUxLCBpbnQgb3Bjb2RlMik7CisKK2ludCBDcHFUc1Byb2Nlc3NJTVFFbnRyeSh2b2lkKiBwSEJBKTsKK2ludCBDcHFUc1Jlc2V0VGFjaExpdGUodm9pZCAqcEhCQSwgaW50IHR5cGUpOwordm9pZCBDcHFUc0ZyZWV6ZVRhY2hsaXRlKHZvaWQgKnBIQkEsIGludCB0eXBlKTsKK3ZvaWQgQ3BxVHNVbkZyZWV6ZVRhY2hsaXRlKHZvaWQgKnBIQkEsIGludCB0eXBlKTsKK2ludCBDcHFUc0luaXRpYWxpemVGcmFtZU1hbmFnZXIodm9pZCAqcEhCQSwgaW50KTsKK2ludCBDcHFUc0xhc2VyQ29udHJvbCggdm9pZCogYWRkckJhc2UsIGludCBvcGNvZGUgKTsKK2ludCBDcHFUc1JlYWRXcml0ZVdXTih2b2lkKiwgaW50IFJlYWRXcml0ZSk7CitpbnQgQ3BxVHNSZWFkV3JpdGVOVlJBTSh2b2lkKiwgdm9pZCogZGF0YSwgaW50IFJlYWRXcml0ZSk7CisKK3ZvaWQgY3BxZmNUU19Xb3JrVGFzayggc3RydWN0IFNjc2lfSG9zdCAqSG9zdEFkYXB0ZXIpOwordm9pZCBjcHFmY1RTV29ya2VyVGhyZWFkKCB2b2lkICpob3N0KTsKKworaW50IGNwcWZjVFNfR2V0TlZSQU1fZGF0YSggVUNIQVIgKnd3bmJ1ZiwgVUNIQVIgKmJ1ZiApOworVUxPTkcgY3BxZmNUU19SZWFkTlZSQU0oIHZvaWQqIEdQSU9pbiwgdm9pZCogR1BJT291dCAsIFVTSE9SVCBjb3VudCwKKwlVQ0hBUiAqYnVmICk7CisKK0JPT0xFQU4gdGxfd3JpdGVfaTJjX252cmFtKCB2b2lkKiBHUElPaW4sIHZvaWQqIEdQSU9vdXQsCisgIFVTSE9SVCBzdGFydE9mZnNldCwgIC8vIGUuZy4gMHgyZiBmb3IgV1dOIHN0YXJ0CisgIFVTSE9SVCBjb3VudCwKKyAgVUNIQVIgKmJ1ZiApOworCisKKy8vIGRlZmluZSBtaXNjIGZ1bmN0aW9ucyAKK2ludCBjcHFmY1RTR2V0TFBTTSggUFRBQ0hZT04gZmNDaGlwLCBjaGFyIGNFcnJvclN0cmluZ1tdKTsKK2ludCBjcHFmY1RTRGVjb2RlR0JJQ3R5cGUoIFBUQUNIWU9OIGZjQ2hpcCwgY2hhciBjRXJyb3JTdHJpbmdbXSk7Cit2b2lkKiBmY01lbU1hbmFnZXIoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQlBTElHTkVEX01FTSAqZHluX21lbV9wYWlyLCBVTE9ORyBuX2FsbG9jLCBVTE9ORyBhYiwKKyAgICAgICAgICAgICAgICAgICBVTE9ORyB1bEFsaWduZWRBZGRyZXNzLCBkbWFfYWRkcl90ICpkbWFfaGFuZGxlKTsKKwordm9pZCBCaWdFbmRpYW5Td2FwKCAgVUNIQVIgKnNvdXJjZSwgVUNIQVIgKmRlc3QsICBVU0hPUlQgY250KTsKKworLy9VTE9ORyB2aXJ0X3RvX3BoeXMoIFBWT0lEIHZpcnRhZGRyICk7CisgICAgICAgICAgICAgICAgICAKKworLy8gTGludXggaW50ZXJydXB0IGhhbmRsZXIKK2lycXJldHVybl90IGNwcWZjVFNfaW50cl9oYW5kbGVyKCBpbnQgaXJxLHZvaWQgKmRldl9pZCxzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Cit2b2lkIGNwcWZjVFNoZWFydGJlYXQoIHVuc2lnbmVkIGxvbmcgcHRyICk7CisKKworCisvLyBUaGUgYmlnZ2VzdCBRIGVsZW1lbnQgd2UgZGVhbCB3aXRoIGlzIEFib3J0cyAtIHdlCisvLyBuZWVkIDQgYnl0ZXMgZm9yIHhfSUQsIGFuZCBhIFNjc2lfQ21uZCAofjI4NCBieXRlcykKKy8vI2RlZmluZSBMSU5LUV9JVEVNX1NJWkUgKCg0K3NpemVvZihTY3NpX0NtbmQpKzMpLzQpCisjZGVmaW5lIExJTktRX0lURU1fU0laRSAoMyoxNikKK3R5cGVkZWYgc3RydWN0Cit7CisgIFVMT05HIFR5cGU7ICAgICAgICAgICAgICAvLyBlLmcuIExJTktVUCwgU0ZRRU5UUlksIFBESVNDLCBCTFNfQUJUUywgLi4uCisgIFVMT05HIHVsQnVmZlsgTElOS1FfSVRFTV9TSVpFIF07Cit9IExJTktRX0lURU07CisKKyNkZWZpbmUgRkNfTElOS1FfREVQVEggVEFDSF9NQVhfWElECit0eXBlZGVmIHN0cnVjdAoreworICBVTE9ORyBwcm9kdWNlcjsKKyAgVUxPTkcgY29uc3VtZXI7ICAvLyB3aGVuIHByb2R1Y2VyIGVxdWFscyBjb25zdW1lciwgUSBlbXB0eQorCisgIExJTktRX0lURU0gUWl0ZW1bIEZDX0xJTktRX0RFUFRIIF07CisKK30gRkNfTElOS19RVUUsICpQRkNfTElOS19RVUU7CisKKworICAgICAvLyBEUEMgcm91dGluZXMgcG9zdCB0byBoZXJlIG9uIEluYm91bmQgU0NTSSBmcmFtZXMKKyAgICAgLy8gVXNlciB0aHJlYWQgcHJvY2Vzc2VzCisjZGVmaW5lIEZDX1NDU0lRX0RFUFRIIDMyCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCBUeXBlOyAgICAgICAgICAgICAgLy8gZS5nLiBTQ1NJCisgIFVMT05HIHVsQnVmZlsgMyoxNiBdOworfSBTQ1NJUV9JVEVNOworCit0eXBlZGVmIHN0cnVjdAoreworICBVTE9ORyBwcm9kdWNlcjsKKyAgVUxPTkcgY29uc3VtZXI7ICAvLyB3aGVuIHByb2R1Y2VyIGVxdWFscyBjb25zdW1lciwgUSBlbXB0eQorCisgIFNDU0lRX0lURU0gUWl0ZW1bIEZDX1NDU0lRX0RFUFRIIF07CisKK30gRkNfU0NTSV9RVUUsICpQRkNfU0NTSV9RVUU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBUaGlzIGlzIHRhY2tlZCBvbiB0byBhIFNjc2lfUmVxdWVzdCBpbiB1cHBlcl9wcml2YXRlX2RhdGEgCisJICAgZm9yIHBhc3Rocm91Z2ggaW9jdGxzLCBhcyBhIHBsYWNlIHRvIGhvbGQgZGF0YSB0aGF0IGNhbid0IAorCSAgIGJlIHN0YXNoZWQgYW55d2hlcmUgZWxzZSBpbiB0aGUgU2NzaV9SZXF1ZXN0LiAgV2UgZGlmZmVyZW50aWF0ZQorCSAgIHRoaXMgZnJvbSBfcmVhbF8gdXBwZXJfcHJpdmF0ZV9kYXRhIGJ5IGNoZWNraW5nIGlmIHRoZSB2aXJ0IGFkZHIKKwkgICBpcyB3aXRoaW4gb3VyIHNwZWNpYWwgcG9vbC4gICovCisJdXNob3J0IGJ1czsKKwl1c2hvcnQgcGRyaXZlOworfSBjcHFmY19wYXNzdGhydV9wcml2YXRlX3Q7CisKKyNkZWZpbmUgQ1BRRkNfTUFYX1BBU1NUSFJVX0NNRFMgMTAwCisKKyNkZWZpbmUgRFlOQU1JQ19BTExPQ0FUSU9OUyA0ICAvLyBUYWNoeW9uIGFsaWduZWQgYWxsb2NhdGlvbnM6IEVSUSxJTVEsU0ZRLFNFU1QKKworLy8gTGludXggc3BhY2UgYWxsb2NhdGVkIHBlciBIQkEgKGNoaXAgc3RhdGUsIGV0Yy4pCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgc3RydWN0IFNjc2lfSG9zdCAqSG9zdEFkYXB0ZXI7IC8vIGJhY2sgcG9pbnRlciB0byBMaW51eCBTY3NpIHN0cnVjdAorCisgIFRBQ0hZT04gZmNDaGlwOyAgICAvLyBBbGwgVGFjaHlvbiByZWdpc3RlcnMsIFF1ZXVlcywgZnVuY3Rpb25zCisgIEFMSUdORURfTUVNIGR5bmFtaWNfbWVtW0RZTkFNSUNfQUxMT0NBVElPTlNdOworCisgIHN0cnVjdCBwY2lfZGV2ICpQY2lEZXY7CisgIGRtYV9hZGRyX3QgZmNMUV9kbWFfaGFuZGxlOworCisgIFNjc2lfQ21uZCAqTGlua0RuQ21uZFtDUFFGQ1RTX1JFUV9RVUVVRV9MRU5dOyAvLyBjb2xsZWN0cyBDbW5kcyBkdXJpbmcgTERuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZm9yIEFjY2VwdGFibGUgdGFyZ2V0cykKKyAgU2NzaV9DbW5kICpCb2FyZExvY2tDbW5kW0NQUUZDVFNfUkVRX1FVRVVFX0xFTl07IC8vIFNFU1Qgd2FzIGZ1bGwKKyAgCisgIFNjc2lfQ21uZCAqQmFkVGFyZ2V0Q21uZFtDUFFGQ1RTX01BWF9UQVJHRVRfSURdOyAvLyBtaXNzaW5nIHRhcmdldHMKKworICB1X2NoYXIgSEJBbnVtOyAgICAgLy8gMC1iYXNlZCBob3N0IG51bWJlcgorCisKKyAgc3RydWN0IHRpbWVyX2xpc3QgY3BxZmNUU3RpbWVyOyAvLyBGQyB1dGlsaXR5IHRpbWVyIGZvciBpbXBsaWNpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZ291dHMsIEZDIHByb3RvY29sIHRpbWVvdXRzLCBldGMuCisgIGludCBmY1N0YXRzVGltZTsgIC8vIFN0YXRpc3RpY3MgZGVsdGEgcmVwb3J0aW5nIHRpbWUKKworICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKndvcmtlcl90aHJlYWQ7IC8vIG91ciBrZXJuZWwgdGhyZWFkCisgIGludCBQb3J0RGlzY0RvbmU7ICAgIC8vIHNldCBieSBTZW5kTG9naW5zKCksIGNsZWFyZWQgYnkgTERuCisgIAorICBzdHJ1Y3Qgc2VtYXBob3JlICpUYWNoRnJvemVuOworICBzdHJ1Y3Qgc2VtYXBob3JlICpUWU9CY29tcGxldGU7ICAgIC8vIGhhbmRzaGFrZSBmb3IgVGFjaCBvdXRib3VuZCBmcmFtZXMKKyAgc3RydWN0IHNlbWFwaG9yZSAqZmNRdWVSZWFkeTsgICAgICAvLyBGaWJyZUNoYW5uZWwgd29yayBmb3Igb3VyIGtlcm5lbCB0aHJlYWQKKyAgc3RydWN0IHNlbWFwaG9yZSAqbm90aWZ5X3d0OyAgICAgICAvLyBzeW5jaHJvbml6ZXMga2VybmVsIHRocmVhZCBraWxsCisgIHN0cnVjdCBzZW1hcGhvcmUgKkJvYXJkTG9jazsKKyAgCisgIFBGQ19MSU5LX1FVRSBmY0xROyAgICAgICAgICAgICAvLyB0aGUgV29ya2VyVGhyZWFkIG9wZXJhdGVzIG9uIHRoaXMKKworICBzcGlubG9ja190IGhiYV9zcGlubG9jazsgICAgICAgICAgIC8vIGhlbGQvcmVsZWFzZWQgYnkgV29ya2VyVGhyZWFkCisgIGNwcWZjX3Bhc3N0aHJ1X3ByaXZhdGVfdCAqcHJpdmF0ZV9kYXRhX3Bvb2w7CisgIHVuc2lnbmVkIGxvbmcgKnByaXZhdGVfZGF0YV9iaXRzOworCit9IENQUUZDSEJBOworCisjZGVmaW5lCUNQUV9TUElOTE9DS19IQkEoIHggKSAgIHNwaW5fbG9jaygmeC0+aGJhX3NwaW5sb2NrKTsKKyNkZWZpbmUgQ1BRX1NQSU5VTkxPQ0tfSEJBKHgpICAgc3Bpbl91bmxvY2soJngtPmhiYV9zcGlubG9jayk7CisKKworCit2b2lkIGNwcWZjVFNJbXBsaWNpdExvZ291dCggQ1BRRkNIQkEqIGNwcWZjSEJBZGF0YSwKKwkJUEZDX0xPR0dFRElOX1BPUlQgcEZjUG9ydCk7CisKKwordm9pZCBjcHFmY1RTVGVybWluYXRlRXhjaGFuZ2UoIENQUUZDSEJBKiwgU0NTSV9ORVhVUyAqdGFyZ2V0LCBpbnQgKTsKKworUEZDX0xPR0dFRElOX1BPUlQgZmNQb3J0TG9nZ2VkSW4oIAorICAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSwgCisgICBUYWNoRkNIRFJfR0NNTkQqIGZjaHMsIAorICAgQk9PTEVBTiwgCisgICBCT09MRUFOKTsKK3ZvaWQgZmNQcm9jZXNzTG9nZ2VkSW4oIAorICAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSwgVGFjaEZDSERSX0dDTU5EKiBmY2hzKTsKKworCitVTE9ORyBjcHFmY1RTQnVpbGRFeGNoYW5nZSggCisgIENQUUZDSEJBICpjcHFmY0hCQWRhdGEsCisgIFVMT05HIHR5cGUsIC8vIGUuZy4gUExPR0kKKyAgVGFjaEZDSERSX0dDTU5EKiBJbkZDSFMsICAvLyBpbmNvbWluZyBGQ0hTCisgIHZvaWQgKkRhdGEsICAgICAgICAgICAgICAgLy8gdGhlIENEQiwgc2NhdHRlci9nYXRoZXIsIGV0Yy4gIAorICBMT05HICpFeGNoYW5nZUlEICk7ICAgICAgIC8vIGFsbG9jYXRlZCBleGNoYW5nZSBJRAorCitVTE9ORyBjcHFmY1RTU3RhcnRFeGNoYW5nZSggCisgIENQUUZDSEJBICpjcHFmY0hCQWRhdGEsCisgIExPTkcgRXhjaGFuZ2VJRCApOworCit2b2lkIGNwcWZjVFNDb21wbGV0ZUV4Y2hhbmdlKCAKKyAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LAorICAgICAgIFBUQUNIWU9OIGZjQ2hpcCwgCisgICAgICAgVUxPTkcgZXhjaGFuZ2VfSUQpOworCisKK1BGQ19MT0dHRURJTl9QT1JUICBmY0ZpbmRMb2dnZWRJblBvcnQoIAorICBQVEFDSFlPTiBmY0NoaXAsIAorICBTY3NpX0NtbmQgKkNtbmQsICAvLyAoV2Ugd2FudCB0aGUgY2hhbm5lbC90YXJnZXQvbHVuIE5leHVzIGZyb20gQ21uZCkKKyAgVUxPTkcgcG9ydF9pZCwgIC8vIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgYWxfcGEsIG9yCisgIFVDSEFSIHd3bls4XSwgICAgLy8gc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBXV04sIG9yLi4uCisgIFBGQ19MT0dHRURJTl9QT1JUICpwTGFzdExvZ2dlZEluUG9ydAorKTsKKwordm9pZCBjcHFmY1RTUHV0TGlua1F1ZSggCisgIENQUUZDSEJBICpjcHFmY0hCQWRhdGEsIAorICBpbnQgVHlwZSwgCisgIHZvaWQgKlF1ZUNvbnRlbnQpOworCit2b2lkIGZjUHV0U2NzaVF1ZSggCisgIENQUUZDSEJBICpjcHFmY0hCQWRhdGEsIAorICBpbnQgVHlwZSwgCisgIHZvaWQgKlF1ZUNvbnRlbnQpOworCit2b2lkIGZjTGlua1FSZXNldCgKKyAgIENQUUZDSEJBICopOwordm9pZCBmY1Njc2lRUmVzZXQoCisgICBDUFFGQ0hCQSAqKTsKK3ZvaWQgZmNTZXN0UmVzZXQoCisgICBDUFFGQ0hCQSAqKTsKKwordm9pZCBjcHFmY19wY2lfdW5tYXAoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgCisJU2NzaV9DbW5kICpjbWQsIAorCVBUQUNIWU9OIGZjQ2hpcCwgCisJVUxPTkcgeF9JRCk7CisKK2V4dGVybiBjb25zdCBVQ0hBUiB2YWxpZF9hbF9wYVtdOworZXh0ZXJuIGNvbnN0IGludCBudW1iZXJfb2ZfYWxfcGE7CisKKyNkZWZpbmUgRkNQX1JFU0lEX1VOREVSICAgMHg4MDAwMAorI2RlZmluZSBGQ1BfUkVTSURfT1ZFUiAgICAweDQwMDAwCisjZGVmaW5lIEZDUF9TTlNfTEVOX1ZBTElEIDB4MjAwMDAKKyNkZWZpbmUgRkNQX1JTUF9MRU5fVkFMSUQgMHgxMDAwMAorCisvLyBSU1BfQ09ERSBkZWZpbml0aW9ucyAoZHBBTlMgRmlicmUgQ2hhbm5lbCBQcm90b2NvbCBmb3IgU0NTSSwgcGcgMzQpCisjZGVmaW5lIEZDUF9EQVRBX0xFTl9OT1RfQlVSU1RfTEVOIDB4MTAwMDAwMAorI2RlZmluZSBGQ1BfQ01ORF9GSUVMRF9JTlZBTElEICAgICAweDIwMDAwMDAKKyNkZWZpbmUgRkNQX0RBVEFfUk9fTk9UX1hSRFlfUk8gICAgMHgzMDAwMDAwCisjZGVmaW5lIEZDUF9UQVNLRlVOQ1RJT05fTlMgICAgICAgIDB4NDAwMDAwMAorI2RlZmluZSBGQ1BfVEFTS0ZVTkNUSU9OX0ZBSUwgICAgICAweDUwMDAwMDAKKworLy8gRkNQLVNDU0kgcmVzcG9uc2Ugc3RhdHVzIHN0cnVjdAordHlwZWRlZiBzdHJ1Y3QgIC8vIHNlZSAiVGFjaEZDSERSX1JTUCIgZGVmaW5pdGlvbiAtIDY0IGJ5dGVzCit7CisgIF9fdTMyIHJlc2VydmVkOworICBfX3UzMiByZXNlcnZlZDE7CisgIF9fdTMyIGZjcF9zdGF0dXM7ICAgIC8vIGZpZWxkIHZhbGlkaXR5IGFuZCBTQ1NJIHN0YXR1cworICBfX3UzMiBmY3BfcmVzaWQ7CisgIF9fdTMyIGZjcF9zbnNfbGVuOyAgIC8vIGxlbmd0aCBvZiBGQ1BfU05TX0lORk8gZmllbGQKKyAgX191MzIgZmNwX3JzcF9sZW47ICAgLy8gbGVuZ3RoIG9mIEZDUF9SU1BfSU5GTyBmaWVsZCAoZXhwZWN0IDgpCisgIF9fdTMyIGZjcF9yc3BfaW5mbzsgIC8vIDQgYnl0ZXMgb2YgRkNQIHByb3RvY29sIHJlc3BvbnNlIGluZm9ybWF0aW9uCisgIF9fdTMyIGZjcF9yc3BfaW5mbzI7IC8vICg0IG1vcmUgYnl0ZXMsIHNpbmNlIG1vc3QgaW1wbGVtZW50YXRpb25zIHVzZSA4KQorICBfX3U4ICBmY3Bfc25zX2luZm9bMzZdOyAvLyBieXRlcyBmb3IgU0NTSSBzZW5zZSAoQVNDLCBBU0NRKQorCit9IEZDUF9TVEFUVVNfUkVTUE9OU0UsICpQRkNQX1NUQVRVU19SRVNQT05TRTsKKworCisvLyBGYWJyaWMgU3RhdGUgQ2hhbmdlIFJlZ2lzdHJhdGlvbgordHlwZWRlZiBzdHJ1Y3Qgc2NycGwKK3sKKyAgX191MzIgY29tbWFuZDsKKyAgX191MzIgZnVuY3Rpb247Cit9IFNDUl9QTDsKKworLy8gRmFicmljIE5hbWUgU2VydmljZSBSZXF1ZXN0Cit0eXBlZGVmIHN0cnVjdCBuc3JwbAoreworICBfX3UzMiBDVF9SZXY7ICAvLyAoJiBJTl9JRCkgICBXT1JEIDAKKyAgX191MzIgRkNTX1R5cGU7ICAgICAgICAgICAgLy8gV09SRCAxCisgIF9fdTMyIENvbW1hbmRfY29kZTsgICAgICAgIC8vIFdPUkQgMgorICBfX3UzMiByZWFzb25fY29kZTsgICAgICAgICAvLyBXT1JEIDMKKyAgX191MzIgRkNQOyAgICAgICAgICAgICAgICAgLy8gV09SRCA0IChsb3dlciBieXRlKQorICAKK30gTlNSX1BMOworCisKKworLy8gIkZDLkgiCisjZGVmaW5lIE1BWF9SWF9TSVpFCQkweDgwMAkvLyBNYXggUmVjZWl2ZSBCdWZmZXIgU2l6ZSBpcyAyMDQ4CisjZGVmaW5lIE1JTl9SWF9TSVpFCQkweDEwMAkvLyBNaW4gU2l6ZSBpcyAyNTYsIHBlciBGQy1QTERBIFNwZWMKKyNkZWZpbmUJTUFYX1RBUkdFVF9SWElEUwlTRVNUX0RFUFRICisjZGVmaW5lIFRBUkdFVF9SWF9TSVpFCQlTRVNUX0JVRkZFUl9MRU5HVEgKKworI2RlZmluZSBDTEFTU18xCQkJMHgwMQorI2RlZmluZSBDTEFTU18yCQkJMHgwMgorI2RlZmluZSBDTEFTU18zCQkJMHgwMworCisjZGVmaW5lIEZDX1BINDIJCQkweDA4CisjZGVmaW5lIEZDX1BINDMJCQkweDA5CisjZGVmaW5lIEZDX1BIMwkJCTB4MjAKKworI2RlZmluZSBSUl9UT1YJCQkyCS8vIE1pbmltdW0gVGltZSBmb3IgdGFyZ2V0IHRvIHdhaXQgZm9yCisJCQkJCS8vIFBESVNDIGFmdGVyIGEgTElQLgorI2RlZmluZSBFX0RfVE9WCQkJMgkvLyBNaW5pbXVtIFRpbWUgdG8gd2FpdCBmb3IgU2VxdWVuY2UKKwkJCQkJLy8gQ29tcGxldGlvbi4KKyNkZWZpbmUgUl9BX1RPVgkJCTAJLy8gTWluaW11bSBUaW1lIGZvciBUYXJnZXQgdG8gd2FpdCAKKwkJCQkJLy8gYmVmb3JlIHJlY2xhaW1pbmcgcmVzb3VyY2VzLgorLy8KKy8vCVJfQ1RMIEZpZWxkCisvLworLy8JUm91dGluZyBCaXRzICgzMS0yOCkKKy8vCisjZGVmaW5lIEZDNF9ERVZJQ0VfREFUQQkJMHgwMDAwMDAwMAorI2RlZmluZSBFWFRfTElOS19EQVRBCQkweDIwMDAwMDAwCisjZGVmaW5lIEZDNF9MSU5LX0RBVEEJCTB4MzAwMDAwMDAKKyNkZWZpbmUgVklERU9fREFUQQkJMHg0MDAwMDAwMAorI2RlZmluZSBCQVNJQ19MSU5LX0RBVEEJCTB4ODAwMDAwMDAKKyNkZWZpbmUgTElOS19DT05UUk9MCQkweEMwMDAwMDAwCisjZGVmaW5lIFJPVVRJTkdfTUFTSwkJMHhGMDAwMDAwMAorCisvLworLy8JSW5mb3JtYXRpb24gQml0cyAoMjctMjQpCisvLworI2RlZmluZSBVTkNBVF9JTkZPUk1BVElPTgkweDAwMDAwMDAwCisjZGVmaW5lIFNPTElDSVRFRF9EQVRBCQkweDAxMDAwMDAwCisjZGVmaW5lIFVOU09MSUNJVEVEX0NPTlRST0wJMHgwMjAwMDAwMAorI2RlZmluZSBTT0xJQ0lURURfQ09OVFJPTAkweDAzMDAwMDAwCisjZGVmaW5lIFVOU09MSUNJVEVEX0RBVEEJMHgwNDAwMDAwMAorI2RlZmluZSBEQVRBX0RFU0NSSVBUT1IJCTB4MDUwMDAwMDAKKyNkZWZpbmUgVU5TT0xJQ0lURURfQ09NTUFORAkweDA2MDAwMDAwCisjZGVmaW5lIENPTU1BTkRfU1RBVFVTCQkweDA3MDAwMDAwCisjZGVmaW5lIElORk9fTUFTSwkJMHgwRjAwMDAwMAorLy8KKy8vCShMaW5rIENvbnRyb2wgQ29kZXMpCisvLworI2RlZmluZSBBQ0tfMQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQUNLXzBfT1JfTgkJMHgwMTAwMDAwMAorI2RlZmluZSBQX1JKVAkJCTB4MDIwMDAwMDAgCisjZGVmaW5lIEZfUkpUCQkJMHgwMzAwMDAwMCAKKyNkZWZpbmUgUF9CU1kJCQkweDA0MDAwMDAwCisjZGVmaW5lIEZBQlJJQ19CVVNZX1RPX0RGCTB4MDUwMDAwMDAJLy8gRmFicmljIEJ1c3kgdG8gRGF0YSBGcmFtZQorI2RlZmluZSBGQUJSSUNfQlVTWV9UT19MQwkweDA2MDAwMDAwCS8vIEZhYnJpYyBCdXN5IHRvIExpbmsgQ3RsIEZyYW1lCisjZGVmaW5lIExJTktfQ1JFRElUX1JFU0VUCTB4MDcwMDAwMDAKKy8vCisvLwkoTGluayBTZXJ2aWNlIENvbW1hbmQgQ29kZXMpCisvLworLy8jZGVmaW5lIExTX1JKVAkJCTB4MDEwMDAwMDAJLy8gTFMgUmVqZWN0CisKKyNkZWZpbmUgTFNfQUNDCQkJMHgwMjAwMDAwMAkvLyBMUyBBY2NlcHQKKyNkZWZpbmUgTFNfUExPR0kJCTB4MDMwMDAwMDAJLy8gTl9QT1JUIExvZ2luCisjZGVmaW5lIExTX0ZMT0dJCQkweDA0MDAwMDAwCS8vIEZfUE9SVCBMb2dpbgorI2RlZmluZSBMU19MT0dPCQkJMHgwNTAwMDAwMAkvLyBMb2dvdXQKKyNkZWZpbmUgTFNfQUJUWAkJCTB4MDYwMDAwMDAJLy8gQWJvcnQgRXhjaGFuZ2UKKyNkZWZpbmUgTFNfUkNTCQkJMHgwNzAwMDAwMAkvLyBSZWFkIENvbm5lY3Rpb24gU3RhdHVzCisjZGVmaW5lIExTX1JFUwkJCTB4MDgwMDAwMDAJLy8gUmVhZCBFeGNoYW5nZSBTdGF0dXMKKyNkZWZpbmUgTFNfUlNTCQkJMHgwOTAwMDAwMAkvLyBSZWFkIFNlcXVlbmNlIFN0YXR1cworI2RlZmluZSBMU19SU0kJCQkweDBBMDAwMDAwCS8vIFJlcXVlc3QgU2VxIEluaXRpYXRpdmUKKyNkZWZpbmUgTFNfRVNUUwkJCTB4MEIwMDAwMDAJLy8gRXN0YWJsaXNoIFN0ZWFtaW5nCisjZGVmaW5lIExTX0VTVEMJCQkweDBDMDAwMDAwCS8vIEVzdGltYXRlIENyZWRpdAorI2RlZmluZSBMU19BRFZDCQkJMHgwRDAwMDAwMAkvLyBBZHZpY2UgQ3JlZGl0CisjZGVmaW5lIExTX1JUVgkJCTB4MEUwMDAwMDAJLy8gUmVhZCBUaW1lb3V0IFZhbHVlCisjZGVmaW5lIExTX1JMUwkJCTB4MEYwMDAwMDAJLy8gUmVhZCBMaW5rIFN0YXR1cworI2RlZmluZSBMU19FQ0hPCQkJMHgxMDAwMDAwMAkvLyBFY2hvCisjZGVmaW5lIExTX1RFU1QJCQkweDExMDAwMDAwCS8vIFRlc3QKKyNkZWZpbmUgTFNfUlJRCQkJMHgxMjAwMDAwMAkvLyBSZWluc3RhdGUgUmVjLiBRdWFsLgorI2RlZmluZSBMU19QUkxJCQkJMHgyMDAwMDAwMAkvLyBQcm9jZXNzIExvZ2luCisjZGVmaW5lIExTX1BSTE8JCQkweDIxMDAwMDAwCS8vIFByb2Nlc3MgTG9nb3V0CisjZGVmaW5lIExTX1RQUkxPCQkweDI0MDAwMDAwCS8vIDNyZCBQYXJ0eSBQcm9jZXNzIExvZ291dAorI2RlZmluZSBMU19QRElTQwkJMHg1MDAwMDAwMAkvLyBQcm9jZXNzIERpc2NvdmVyeQorI2RlZmluZSBMU19GRElTQwkJMHg1MTAwMDAwMAkvLyBGYWJyaWMgRGlzY292ZXJ5CisjZGVmaW5lIExTX0FESVNDCQkweDUyMDAwMDAwCS8vIERpc2NvdmVyIEFkZHJlc3MKKyNkZWZpbmUgTFNfUk5DCQkJMHg1MzAwMDAwMAkvLyBSZXBvcnQgTm9kZSBDYXBhYmlsaXR5CisjZGVmaW5lIExTX1NDUiAgICAgICAgICAgICAgICAgIDB4NjIwMDAwMDAgICAgICAvLyBTdGF0ZSBDaGFuZ2UgUmVnaXN0cmF0aW9uCisjZGVmaW5lIExTX01BU0sJCQkweEZGMDAwMDAwCQorCisvLworLy8gCVRZUEUgQml0IE1hc2tzCisvLworI2RlZmluZSBCQVNJQ19MSU5LX1NFUlZJQ0UJMHgwMDAwMDAwMAorI2RlZmluZSBFWFRfTElOS19TRVJWSUNFCTB4MDEwMDAwMDAKKworI2RlZmluZSBMTEMJCQkweDA0MDAwMDAwCisjZGVmaW5lIExMQ19TTkFQCQkweDA1MDAwMDAwCisjZGVmaW5lIFNDU0lfRkNQCQkweDA4MDAwMDAwCisjZGVmaW5lIFNDU0lfR1BQCQkweDA5MDAwMDAwCisjZGVmaW5lIElQSTNfTUFTVEVSCQkweDExMDAwMDAwCisjZGVmaW5lIElQSTNfU0xBVkUJCTB4MTIwMDAwMDAKKyNkZWZpbmUgSVBJM19QRUVSCQkweDEzMDAwMDAwCisjZGVmaW5lIENQX0lQSTNfTUFTVEVSCQkweDE1MDAwMDAwCisjZGVmaW5lIENQX0lQSTNfU0xBVkUJCTB4MTYwMDAwMDAKKyNkZWZpbmUgQ1BfSVBJM19QRUVSCQkweDE3MDAwMDAwCisjZGVmaW5lIFNCQ0NTX0NIQU5ORUwJCTB4MTkwMDAwMDAKKyNkZWZpbmUgU0JDQ1NfQ09OVFJPTAkJMHgxQTAwMDAwMAorI2RlZmluZSBGSUJSRV9TRVJWSUNFUwkJMHgyMDAwMDAwMAorI2RlZmluZSBGQ19GRwkJCTB4MjEwMDAwMDAKKyNkZWZpbmUgRkNfWFMJCQkweDIyMDAwMDAwCisjZGVmaW5lIEZDX0FMCQkJMHgyMzAwMDAwMAorI2RlZmluZSBTTk1QCQkJMHgyNDAwMDAwMAorI2RlZmluZSBISVBQSV9GUAkJMHg0MDAwMDAwMAorI2RlZmluZSBUWVBFX01BU0sJCTB4RkYwMDAwMDAKKwordHlwZWRlZiBzdHJ1Y3QgeworCVVDSEFSIHNlcV9pZF92YWxpZDsKKwlVQ0hBUiBzZXFfaWQ7CisJVVNIT1JUIHJlc2VydmVkOyAgLy8gMiBieXRlcyByZXNlcnZlZAorCVVMT05HIG94X3J4X2lkOworCVVTSE9SVCBsb3dfc2VxX2NudDsKKwlVU0hPUlQgaGlnaF9zZXFfY250OworfSBCQV9BQ0NfUEFZTE9BRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVVDSEFSIHJlc2VydmVkOworCVVDSEFSIHJlYXNvbl9jb2RlOworCVVDSEFSIHJlYXNvbl9leHBsYWluOworCVVDSEFSIHZlbmRvcl91bmlxdWU7Cit9IEJBX1JKVF9QQVlMT0FEOworCisKK3R5cGVkZWYgc3RydWN0IHsKKwlVTE9ORyAJY29tbWFuZF9jb2RlOworCVVMT05HIAlzaWQ7CisJVVNIT1JUCW94X2lkOworCVVTSE9SVAlyeF9pZDsKK30gUlJRX01FU1NBR0U7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlVTE9ORyBjb21tYW5kX2NvZGU7CisJVUNIQVIgdmVuZG9yOworCVVDSEFSIGV4cGxhaW47CisJVUNIQVIgcmVhc29uOworCVVDSEFSIHJlc2VydmVkOworfSBSRUpFQ1RfTUVTU0FHRTsKKworCisjZGVmaW5lCU5fT1JfRl9QT1JUCQkweDEwMDAKKyNkZWZpbmUgUkFORE9NX1JFTEFUSVZFX09GRlNFVAkweDQwMDAKKyNkZWZpbmUgQ09OVElOVU9TTFlfSU5DUkVBU0lORwkweDgwMDAKKworI2RlZmluZSBDTEFTU19WQUxJRAkJMHg4MDAwCisjZGVmaW5lIElOVEVSTUlYX01PREUJCTB4NDAwMAorI2RlZmluZSBUUkFOU1BBUkVOVF9TVEFDS0VECTB4MjAwMAorI2RlZmluZSBMT0NLRE9XTl9TVEFDS0VECTB4MTAwMAorI2RlZmluZSBTRVFfREVMSVZFUlkJCTB4ODAwCisKKyNkZWZpbmUgWElEX05PVF9TVVBQT1JURUQJMHgwMAorI2RlZmluZSBYSURfU1VQUE9SVEVECQkweDQwMDAKKyNkZWZpbmUgWElEX1JFUVVJUkVECQkweEMwMDAKKworI2RlZmluZSBBU1NPQ0lBVE9SX05PVF9TVVBQT1JURUQJMHgwMAorI2RlZmluZSBBU1NPQ0lBVE9SX1NVUFBPUlRFRAkweDEwMDAKKyNkZWZpbmUgQVNTT0NJQVRPUl9SRVFVSVJFRAkweDMwMDAKKworI2RlZmluZQlJTklUX0FDSzBfU1VQUE9SVAkweDgwMAorI2RlZmluZSBJTklUX0FDS05fU1VQUE9SVAkweDQwMAorCisjZGVmaW5lCVJFQ0lQX0FDSzBfU1VQUE9SVAkweDgwMDAKKyNkZWZpbmUgUkVDSVBfQUNLTl9TVVBQT1JUCTB4NDAwMAorCisjZGVmaW5lIFhfSURfSU5URVJMT0NLCQkweDIwMDAKKworI2RlZmluZSBFUlJPUl9QT0xJQ1kJCTB4MTgwMAkJLy8gRXJyb3IgUG9saWN5IFN1cHBvcnRlZAorI2RlZmluZSBFUlJPUl9ESVNDQVJECQkweDAwCQkvLyBPbmx5IERpc2NhcmQgU3VwcG9ydGVkCisjZGVmaW5lIEVSUk9SX0RJU0NfUFJPQ0VTUwkweDAyCQkvLyBEaXNjYXJkIGFuZCBwcm9jZXNzIHN1cHBvcnRlZAorCisjZGVmaW5lIE5PREVfSUQJCQkweDAxCisjZGVmaW5lIElFRUVfRVhUCQkweDIwCisKKy8vCisvLyBDYXRlZ29yaWVzIFN1cHBvcnRlZCBQZXIgU2VxdWVuY2UKKy8vCisjZGVmaW5lCUNBVEVHT1JJRVNfUEVSX1NFUVVFTkNFCTB4MzAwCisjZGVmaW5lIE9ORV9DQVRFR09SWV9TRVFVRU5DRQkweDAwCQkvLyAxIENhdGVnb3J5IHBlciBTZXF1ZW5jZQorI2RlZmluZSBUV09fQ0FURUdPUllfU0VRVUVOQ0UJMHgwMQkJLy8gMiBDYXRlZ29yaWVzIHBlciBTZXF1ZW5jZQorI2RlZmluZSBNQU5ZX0NBVEVHT1JZX1NFUVVFTkNFCTB4MDMJCS8vID4gMiBDYXRlZ29yaWVzL1NlcXVlbmNlCisKK3R5cGVkZWYgc3RydWN0IHsKKworCVVTSE9SVCBpbml0aWF0b3JfY29udHJvbDsKKwlVU0hPUlQgc2VydmljZV9vcHRpb25zOworCisJVVNIT1JUIHJ4X2RhdGFfc2l6ZTsKKwlVU0hPUlQgcmVjaXBpZW50X2NvbnRyb2w7CisKKwlVU0hPUlQgZWVfY3JlZGl0OworCVVTSE9SVCBjb25jdXJyZW50X3NlcXVlbmNlczsKKworCVVTSE9SVCByZXNlcnZlZDsKKwlVU0hPUlQgb3Blbl9zZXF1ZW5jZXM7CisKK30gQ0xBU1NfUEFSQU1FVEVSUzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVVMT05HCWxvZ2luX2NtZDsKKwkvLworCS8vIENvbW1vbiBTZXJ2aWNlIFBhcmFtZXRlcnMKKwkvLworCXN0cnVjdCB7CisKKwkJVVNIT1JUIGJiX2NyZWRpdDsKKwkJVUNIQVIgbG93ZXN0X3ZlcjsKKwkJVUNIQVIgaGlnaGVzdF92ZXI7CisKKwkJVVNIT1JUIGJiX3J4X3NpemU7CisJCVVTSE9SVCBjb21tb25fZmVhdHVyZXM7CisKKwkJVVNIT1JUIHJlbF9vZmZzZXQ7CisJCVVTSE9SVCBjb25jdXJyZW50X3NlcTsKKworCisJCVVMT05HIGVfZF90b3Y7CisJfSBjbW5fc2VydmljZXM7CisKKwkvLworCS8vIFBvcnQgTmFtZQorCS8vCisJVUNIQVIgcG9ydF9uYW1lWzhdOworCisJLy8KKwkvLyBOb2RlL0ZhYnJpYyBOYW1lCisJLy8KKwlVQ0hBUiBub2RlX25hbWVbOF07CisKKwkvLworCS8vIENsYXNzIDEsIDIgYW5kIDMgU2VydmljZSBQYXJhbWV0ZXJzCisJLy8KKwlDTEFTU19QQVJBTUVURVJTCWNsYXNzMTsKKwlDTEFTU19QQVJBTUVURVJTCWNsYXNzMjsKKwlDTEFTU19QQVJBTUVURVJTCWNsYXNzMzsKKworCVVMT05HIHJlc2VydmVkWzRdOworCisJLy8KKwkvLyBWZW5kb3IgVmVyc2lvbiBMZXZlbAorCS8vCisJVUNIQVIJCXZlbmRvcl9pZFsyXTsKKwlVQ0hBUgkJdmVuZG9yX3ZlcnNpb25bNl07CisJVUxPTkcJCWJ1ZmZlcl9zaXplOworCVVTSE9SVAkJcnhpZF9zdGFydDsKKwlVU0hPUlQJCXRvdGFsX3J4aWRzOworfSBMT0dJTl9QQVlMT0FEOworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIFVMT05HIGNtZDsgIC8vIDQgYnl0ZXMKKyAgVUNIQVIgbl9wb3J0X2lkZW50aWZpZXJbM107CisgIFVDSEFSIHJlc2VydmVkOworICBVQ0hBUiBwb3J0X25hbWVbOF07Cit9IExPR09VVF9QQVlMT0FEOworCisKKy8vCisvLwlQUkxJIFJlcXVlc3QgU2VydmljZSBQYXJhbWV0ZXIgRGVmaW5lcworLy8KKyNkZWZpbmUgUFJMSV9BQ0MJCQkweDAxCisjZGVmaW5lIFBSTElfUkVRCQkJMHgwMgorI2RlZmluZSBPUklHX1BST0NFU1NfQVNTT0NfVkFMSUQJMHg4MDAwCisjZGVmaW5lIFJFU1BfUFJPQ0VTU19BU1NPQ19WQUxJRAkweDQwMDAKKyNkZWZpbmUgRVNUQUJMSVNIX1BBSVIJCQkweDIwMDAKKyNkZWZpbmUgREFUQV9PVkVSTEFZX0FMTE9XRUQJCTB4NDAKKyNkZWZpbmUJSU5JVElBVE9SX0ZVTkNUSU9OCQkweDIwCisjZGVmaW5lCVRBUkdFVF9GVU5DVElPTgkJCTB4MTAKKyNkZWZpbmUgQ01EX0RBVEFfTUlYRUQJCQkweDA4CisjZGVmaW5lIERBVEFfUkVTUF9NSVhFRAkJCTB4MDQKKyNkZWZpbmUgUkVBRF9YRkVSX1JEWQkJCTB4MDIKKyNkZWZpbmUgV1JJVEVfWEZFUl9SRFkJCQkweDAxCisKKyNkZWZpbmUgUkVTUE9OU0VfQ09ERV9NQVNLCTB4RjAwCisjZGVmaW5lIFJFUVVFU1RfRVhFQ1VURUQJMHgxMDAKKyNkZWZpbmUgTk9fUkVTT1VSQ0VTCQkweDIwMAorI2RlZmluZSBJTklUX05PVF9DT01QTEVURQkweDMwMAorI2RlZmluZSBJTUFHRV9ET0VTX05PVF9FWElTVAkweDQwMAorI2RlZmluZSBCQURfUFJFREVGSU5FRF9DT05ECTB4NTAwCisjZGVmaW5lIFJFUV9FWEVDX0NPTkQJCTB4NjAwCisjZGVmaW5lIE5PX01VTFRJX1BBR0UJCTB4NzAwCisKK3R5cGVkZWYgc3RydWN0IHsKKwlVU0hPUlQJcGF5bG9hZF9sZW5ndGg7CisJVUNIQVIJcGFnZV9sZW5ndGg7CisJVUNIQVIJY21kOworCisKKwlVTE9ORwl2YWxpZDsKKworCVVMT05HCW9yaWdfcHJvY2Vzc19hc3NvY2lhdG9yOworCisJVUxPTkcJcmVzcF9wcm9jZXNzX2Fzc29jaWF0b3I7CisJCisJVUxPTkcJZmNwX2luZm87Cit9IFBSTElfUkVRVUVTVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCisJVVNIT1JUCXBheWxvYWRfbGVuZ3RoOworCVVDSEFSCXBhZ2VfbGVuZ3RoOworCVVDSEFSCWNtZDsKKworCVVMT05HCXZhbGlkOworCVVMT05HCW9yaWdfcHJvY2Vzc19hc3NvY2lhdG9yOworCisJVUxPTkcJcmVzcF9wcm9jZXNzX2Fzc29jaWF0b3I7CisJVUxPTkcJcmVzZXJ2ZWQ7Cit9IFBSTE9fUkVRVUVTVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVVMT05HCWNtZDsKKworCVVMT05HCWhhcmRfYWRkcmVzczsKKwkKKwlVQ0hBUglwb3J0X25hbWVbOF07CisKKwlVQ0hBUglub2RlX25hbWVbOF07CisKKwlVTE9ORwlzX2lkOworfSBBRElTQ19QQVlMT0FEOworCitzdHJ1Y3QgZXh0X3NnX2VudHJ5X3QgeworCV9fdTMyIGxlbjoxODsJCS8qIGJ1ZmZlciBsZW5ndGgsIGJpdHMgMC0xNyAqLworCV9fdTMyIHViYToxMzsJCS8qIHVwcGVyIGJ1cyBhZGRyZXNzIGJpdHMgMTgtMzEgKi8KKwlfX3UzMiBsYmE7CQkvKiBsb3dlciBidXMgYWRkcmVzcyBiaXRzIDAtMzEgKi8KK307IAorCisKKy8vIEouIE1jQ2FydHkncyBMSU5LLkgKKy8vCisvLwlMU19SSlQgUmVhc29uIENvZGVzCisvLworCisjZGVmaW5lIElOVkFMSURfQ09NTUFORF9DT0RFCTB4MDEKKyNkZWZpbmUgTE9HSUNBTF9FUlJPUgkJMHgwMworI2RlZmluZSBMT0dJQ0FMX0JVU1kJCTB4MDUKKyNkZWZpbmUgUFJPVE9DT0xfRVJST1IJCTB4MDcKKyNkZWZpbmUgVU5BQkxFX1RPX1BFUkZPUk0JMHgwOQorI2RlZmluZSBDT01NQU5EX05PVF9TVVBQT1JURUQJMHgwQgorI2RlZmluZSBMU19WRU5ET1JfVU5JUVVFCTB4RkYKKworLy8KKy8vIAlMU19SSlQgUmVhc29uIENvZGVzIEV4cGxhbmF0aW9ucworLy8KKyNkZWZpbmUgTk9fUkVBU09OCQkweDAwCisjZGVmaW5lIE9QVElPTlNfRVJST1IJCTB4MDEKKyNkZWZpbmUgSU5JVElBVE9SX0NUTF9FUlJPUgkweDAzCisjZGVmaW5lIFJFQ0lQSUVOVF9DVExfRVJST1IJMHgwNQorI2RlZmluZSBEQVRBX0ZJRUxEX1NJWkVfRVJST1IJMHgwNworI2RlZmluZSBDT05DVVJSRU5UX1NFUV9FUlJPUgkweDA5CisjZGVmaW5lIENSRURJVF9FUlJPUgkJMHgwQgorI2RlZmluZSBJTlZBTElEX1BPUlRfTkFNRQkweDBECisjZGVmaW5lIElOVkFMSURfTk9ERV9OQU1FCTB4MEUKKyNkZWZpbmUgSU5WQUxJRF9DU1AJCTB4MEYJLy8gSW52YWxpZCBTZXJ2aWNlIFBhcmFtZXRlcnMKKyNkZWZpbmUgSU5WQUxJRF9BU1NPQ19IRFIJMHgxMQkvLyBJbnZhbGlkIEFzc29jaWF0aW9uIEhlYWRlcgorI2RlZmluZSBBU1NPQ19IRFJfUkVRVUlSRUQJMHgxMwkvLyBBc3NvY2lhdGlvbiBIZWFkZXIgUmVxdWlyZWQKKyNkZWZpbmUgTFNfSU5WQUxJRF9TX0lECQkweDE1CisjZGVmaW5lIElOVkFMSURfT1hfUlhfSUQJMHgxNwkvLyBJbnZhbGlkIE9YX0lEIFJYX0lEIENvbWJpbmF0aW9uCisjZGVmaW5lIENNRF9JTl9QUk9DRVNTCQkweDE5CisjZGVmaW5lIElOVkFMSURfSURFTlRJRklFUgkweDFGCS8vIEludmFsaWQgTl9QT1JUIElkZW50aWZpZXIKKyNkZWZpbmUgSU5WQUxJRF9TRVFfSUQJCTB4MjEKKyNkZWZpbmUgQUJUX0lOVkFMSURfWENITkcJMHgyMyAJLy8gQXR0ZW1wdCB0byBBYm9ydCBhbiBpbnZhbGlkIEV4Y2hhbmdlCisjZGVmaW5lIEFCVF9JTkFDVElWRV9YQ0hORwkweDI1IAkvLyBBdHRlbXB0IHRvIEFib3J0IGFuIGluYWN0aXZlIEV4Y2hhbmdlCisjZGVmaW5lIE5FRURfUkVDX1FVQUwJCTB4MjcJLy8gUmVjb3ZlcnkgUXVhbGlmaWVyIHJlcXVpcmVkCisjZGVmaW5lIE5PX0xPR0lOX1JFU09VUkNFUwkweDI5CS8vIE5vIHJlc291cmNlcyB0byBzdXBwb3J0IGxvZ2luCisjZGVmaW5lIE5PX0RBVEEJCQkweDJBCS8vIFVuYWJsZSB0byBzdXBwbHkgcmVxdWVzdGVkIGRhdGEKKyNkZWZpbmUJUkVRVUVTVF9OT1RfU1VQUE9SVEVECTB4MkMJLy8gUmVxdWVzdCBOb3QgU3VwcG9ydGVkCisKKy8vCisvLwlMaW5rIENvbnRyb2wgQ29kZXMKKy8vCisKKy8vCisvLwlQX0JTWSBBY3Rpb24gQ29kZXMKKy8vCisjZGVmaW5lIFNFUVVFTkNFX1RFUk1JTkFURUQJMHgwMTAwMDAwMAorI2RlZmluZSBTRVFVRU5DRV9BQ1RJVkUJCTB4MDIwMDAwMDAKKworLy8KKy8vCVBfQlNZIFJlYXNvbiBDb2RlcworLy8KKyNkZWZpbmUgUEhZU19OUE9SVF9CVVNZCQkweDAxMDAwMAorI2RlZmluZSBOUE9SVF9SRVNPVVJDRV9CVVNZCTB4MDIwMDAwCisKKy8vCisvLyAJUF9SSlQsIEZfUkpUIEFjdGlvbiBDb2RlcworLy8KKworI2RlZmluZSBSRVRSWUFCTEVfRVJST1IJCTB4MDEwMDAwMDAKKyNkZWZpbmUgTk9OX1JFVFJZQUJMRV9FUlJPUgkweDAyMDAwMDAwCisKKy8vCisvLyAJUF9SSlQsIEZfUkpUIFJlYXNvbiBDb2RlcworLy8KKyNkZWZpbmUgSU5WQUxJRF9EX0lECQkweDAxMDAwMAorI2RlZmluZSBJTlZBTElEX1NfSUQJCTB4MDIwMDAwCisjZGVmaW5lIE5QT1JUX05PVF9BVkFJTF9UTVAJMHgwMzAwMDAKKyNkZWZpbmUgTlBPUlRfTk9UX0FWQUlMX1BFUk0JMHgwNDAwMDAKKyNkZWZpbmUgQ0xBU1NfTk9UX1NVUFBPUlRFRAkweDA1MDAwMAorI2RlZmluZSBVU0FHRV9FUlJPUgkJMHgwNjAwMDAKKyNkZWZpbmUgVFlQRV9OT1RfU1VQUE9SVEVECTB4MDcwMDAwCisjZGVmaW5lIElOVkFMX0xJTktfQ09OVFJPTAkweDA4MDAwMAorI2RlZmluZSBJTlZBTF9SX0NUTAkJMHgwOTAwMDAKKyNkZWZpbmUgSU5WQUxfRl9DVEwJCTB4MEEwMDAwCisjZGVmaW5lIElOVkFMX09YX0lECQkweDBCMDAwMAorI2RlZmluZSBJTlZBTF9SWF9JRAkJMHgwQzAwMDAKKyNkZWZpbmUgSU5WQUxfU0VRX0lECQkweDBEMDAwMAorI2RlZmluZSBJTlZBTF9ERl9DVEwJCTB4MEUwMDAwCisjZGVmaW5lIElOVkFMX1NFUV9DTlQJCTB4MEYwMDAwCisjZGVmaW5lIElOVkFMX1BBUkFNUwkJMHgxMDAwMDAKKyNkZWZpbmUgRVhDSEFOR0VfRVJST1IJCTB4MTEwMDAwCisjZGVmaW5lIExTX1BST1RPQ09MX0VSUk9SCTB4MTIwMDAwCisjZGVmaW5lIElOQ09SUkVDVF9MRU5HVEgJMHgxMzAwMDAKKyNkZWZpbmUgVU5FWFBFQ1RFRF9BQ0sJCTB4MTQwMDAwCisjZGVmaW5lIExPR0lOX1JFUQkJMHgxNjAwMDAKKyNkZWZpbmUgRVhDRVNTSVZFX1NFUQkJMHgxNzAwMDAKKyNkZWZpbmUgTk9fRVhDSEFOR0UJCTB4MTgwMDAwCisjZGVmaW5lIFNFQ19IRFJfTk9UX1NVUFBPUlRFRAkweDE5MDAwMAorI2RlZmluZSBOT19GQUJSSUMJCTB4MUEwMDAwCisjZGVmaW5lIFBfVkVORE9SX1VOSVFVRQkJMHhGRjAwMDAKKworLy8KKy8vIAlCQV9SSlQgUmVhc29uIENvZGVzCisvLworI2RlZmluZSBCQV9JTlZBTElEX0NPTU1BTkQJMHgwMDAxMDAwMAorI2RlZmluZSBCQV9MT0dJQ0FMX0VSUk9SCTB4MDAwMzAwMDAKKyNkZWZpbmUgQkFfTE9HSUNBTF9CVVNZCQkweDAwMDUwMDAwCisjZGVmaW5lIEJBX1BST1RPQ09MX0VSUk9SCTB4MDAwNzAwMDAKKyNkZWZpbmUgQkFfVU5BQkxFX1RPX1BFUkZPUk0JMHgwMDA5MDAwMAorCisvLworLy8gCUJBX1JKVCBSZWFzb24gRXhwbGFuYXRpb24gQ29kZXMKKy8vCisjZGVmaW5lIEJBX05PX1JFQVNPTgkJMHgwMDAwMDAwMAorI2RlZmluZSBCQV9JTlZBTElEX09YX1JYCTB4MDAwMDAzMDAKKyNkZWZpbmUgQkFfU0VRVUVOQ0VfQUJPUlRFRAkweDAwMDAwNTAwCisKKworCisjZW5kaWYgLyogQ1BRRkNUU1NUUlVDVFNfSAkqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3BxZmNUU3RyaWdnZXIuYyBiL2RyaXZlcnMvc2NzaS9jcHFmY1RTdHJpZ2dlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYjdlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvY3BxZmNUU3RyaWdnZXIuYwpAQCAtMCwwICsxLDMzIEBACisvLyBSb3V0aW5lIHRvIHRyaWdnZXIgRmluaXNhciBHVEEgYW5hbHl6ZXIuIFJ1bnMgb2YgR1BJTzIKKy8vIE5PVEU6IERFQlVHIE9OTFkhIENvdWxkIGludGVyZmVyZSB3aXRoIEZDTU5HUi9NaW5pcG9ydCBvcGVyYXRpb24KKy8vIHNpbmNlIGl0IHdyaXRlcyBkaXJlY3RseSB0byB0aGUgVGFjaHlvbiBib2FyZC4gIFRoaXMgZnVuY3Rpb24KKy8vIGRldmVsb3BlZCBmb3IgQ29tcGFxIEhCQSBUYWNoeW9uIFRTIHYxLjIgKFJldiBYNSBQQ0IpCisKKyNpbmNsdWRlICJjcHFmY1RTdHJpZ2dlci5oIgorI2lmIFRSSUdHRVJBQkxFX0hCQQorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKwordm9pZCBUcmlnZ2VySEJBKCB2b2lkKiBJT0Jhc2VVcHBlciwgaW50IFByaW50KQoreworICBfX3UzMiBsb25nIHZhbHVlOworCisgIC8vIGdldCBpbml0aWFsIHZhbHVlIGluIGhvcGVzIG9mIG5vdCBtb2RpZnlpbmcgYW55IG90aGVyIEdQSU8gbGluZQorICBJT0Jhc2VVcHBlciArPSAweDE4ODsgIC8vIFRhY2hUTC9UUyBDb250cm9sIHJlZworICAKKyAgdmFsdWUgPSByZWFkbCggSU9CYXNlVXBwZXIpOworICAvLyBzZXQgSElHSCB0byB0cmlnZ2VyIGV4dGVybmFsIGFuYWx5emVyICh0ZXN0ZWQgb24gRG9sY2hlIEZpbmlzYXIgMUdiIEdUQSkKKyAgLy8gVGhlIEZpbmlzYXIgYW5heWx6ZXIgdHJpZ2dlcnMgb24gbG93LXRvLWhpZ2ggVFRMIHRyYW5zaXRpb24KKyAgdmFsdWUgfD0gMHgwMTsgLy8gc2V0IGJpdCAwCisKKyAgd3JpdGVsKCB2YWx1ZSwgSU9CYXNlVXBwZXIpOworCisgIGlmKCBQcmludCkKKyAgICBwcmludGsoICIgLUdQSU8wIHNldC0gIik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2NwcWZjVFN0cmlnZ2VyLmggYi9kcml2ZXJzL3Njc2kvY3BxZmNUU3RyaWdnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTYxNzkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2NwcWZjVFN0cmlnZ2VyLmgKQEAgLTAsMCArMSw4IEBACisvLyBkb24ndCBkbyB0aGlzIHVubGVzcyB5b3UgaGF2ZSB0aGUgcmlnaHQgaGFyZHdhcmUhCisjZGVmaW5lIFRSSUdHRVJBQkxFX0hCQSAwCisjaWYgVFJJR0dFUkFCTEVfSEJBCit2b2lkIFRyaWdnZXJIQkEoIHZvaWQqLCBpbnQpOworI2Vsc2UKKyNkZWZpbmUgVHJpZ2dlckhCQSh4LCB5KQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jcHFmY1RTd29ya2VyLmMgYi9kcml2ZXJzL3Njc2kvY3BxZmNUU3dvcmtlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZmQ3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvY3BxZmNUU3dvcmtlci5jCkBAIC0wLDAgKzEsNjUxNiBAQAorLyogQ29weXJpZ2h0KGMpIDIwMDAsIENvbXBhcSBDb21wdXRlciBDb3Jwb3JhdGlvbiAKKyAqIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlciAKKyAqIDY0LWJpdCwgNjZNSHogUENJIAorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIHRlc3RlZCBvbjoKKyAqIChmcm9udCk6IFtjaGlwXSBUYWNoeW9uIFRTIEhQRkMtNTE2NkEvMS4yICBMMkMxMDkwIC4uLgorICogICAgICAgICAgU1AjIFAyMjVDWENCRklFTDZULCBSZXYgWEMKKyAqICAgICAgICAgIFNQIyAxNjEyOTAtMDAxLCBSZXYgWEQKKyAqIChiYWNrKTogQm9hcmQgTm8uIDAxMDAwOC0wMDEgQS9XIFJldiBYNSwgRkFCIFJFViBYNQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFdyaXR0ZW4gYnkgRG9uIFppbW1lcm1hbgorKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2RlZmluZSBTSFVURE9XTl9TSUdTCShzaWdtYXNrKFNJR0tJTEwpfHNpZ21hc2soU0lHSU5UKXxzaWdtYXNrKFNJR1RFUk0pKQorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4gICAvLyBzdHJ1Y3QgU2NzaV9Ib3N0IGRlZmluaXRpb24gZm9yIFQgaGFuZGxlcgorI2luY2x1ZGUgImNwcWZjVFNjaGlwLmgiCisjaW5jbHVkZSAiY3BxZmNUU3N0cnVjdHMuaCIKKyNpbmNsdWRlICJjcHFmY1RTdHJpZ2dlci5oIgorCisvLyNkZWZpbmUgTE9HSU5fREJHIDEKKworLy8gUkVNQVJLUzoKKy8vIFNpbmNlIFRhY2h5b24gY2hpcHMgbWF5IGJlIHBlcm1pdHRlZCB0byB3YWl0IGZyb20gNTAwbXMgdXAgdG8gMiBzZWMKKy8vIHRvIGVtcHR5IGFuIG91dGdvaW5nIGZyYW1lIGZyb20gaXRzIEZJRk8gdG8gdGhlIEZpYnJlIENoYW5uZWwgc3RyZWFtLAorLy8gd2UgY2Fubm90IGRvIGV2ZXJ5dGhpbmcgd2UgbmVlZCB0byBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIuICBTcGVjaWZpY2FsbHksCisvLyBldmVyeSB0aW1lIGEgbGluayByZS1pbml0IChlLmcuIExJUCkgdGFrZXMgcGxhY2UsIGFsbCBTQ1NJIEkvTyBoYXMgdG8gYmUKKy8vIHN1c3BlbmRlZCB1bnRpbCB0aGUgbG9naW4gc2VxdWVuY2VzIGhhdmUgYmVlbiBjb21wbGV0ZWQuICBMb2dpbiBjb21tYW5kcworLy8gYXJlIGZyYW1lcyBqdXN0IGxpa2UgU0NTSSBjb21tYW5kcyBhcmUgZnJhbWVzOyB0aGV5IGFyZSBzdWJqZWN0IHRvIHRoZSBzYW1lCisvLyB0aW1lb3V0IGlzc3VlcyBhbmQgZGVsYXlzLiAgQWxzbywgdmFyaW91cyBzcGVjcyBwcm92aWRlIHVwIHRvIDIgc2Vjb25kcyBmb3IKKy8vIGRldmljZXMgdG8gbG9nIGJhY2sgaW4gKGkuZS4gcmVzcG9uZCB3aXRoIEFDQyB0byBhIGxvZ2luIGZyYW1lKSwgc28gSS9PIHRvCisvLyB0aGF0IGRldmljZSBoYXMgdG8gYmUgc3VzcGVuZGVkLgorLy8gQSBzZXJpb3VzIHByb2JsZW0gaGVyZSBvY2N1cnMgb24gaGlnaGx5IGxvYWRlZCBGQy1BTCBzeXN0ZW1zLiAgSWYgb3VyIEZDIHBvcnQKKy8vIGhhcyBhIGxvdyBwcmlvcml0eSAoZS5nLiBoaWdoIGFyYml0cmF0ZWQgbG9vcCBwaHlzaWNhbCBhZGRyZXNzLCBhbHBhKSwgYW5kCisvLyBzb21lIG90aGVyIGRldmljZSBpcyBob2dnaW5nIGJhbmR3aWR0aCAocGVybWlzc2libGUgdW5kZXIgRkMtQUwpLCB3ZSBtaWdodAorLy8gdGltZSBvdXQgdGhpbmtpbmcgdGhlIGxpbmsgaXMgaHVuZywgd2hlbiBpdCdzIHNpbXBseSBidXN5LiAgTWFueSBzdWNoCisvLyBjb25zaWRlcmF0aW9ucyBjb21wbGljYXRlIHRoZSBkZXNpZ24uICBBbHRob3VnaCBUYWNoeW9uIGFzc3VtZXMgY29udHJvbAorLy8gKGluIHNpbGljb24pIGZvciBtYW55IGxpbmstc3BlY2lmaWMgaXNzdWVzLCB0aGUgTGludXggZHJpdmVyIGlzIGxlZnQgd2l0aCB0aGUKKy8vIHJlc3QsIHdoaWNoIHR1cm5zIG91dCB0byBiZSBhIGRpZmZpY3VsdCwgdGltZSBjcml0aWNhbCBjaG9yZS4KKworLy8gVGhlc2UgIndvcmtlciIgZnVuY3Rpb25zIHdpbGwgaGFuZGxlIHRoaW5ncyBsaWtlIEZDIExvZ2luczsgYWxsCisvLyBwcm9jZXNzZXMgd2l0aCBJL08gdG8gb3VyIGRldmljZSBtdXN0IHdhaXQgZm9yIHRoZSBMb2dpbiB0byBjb21wbGV0ZQorLy8gYW5kIChpZiBzdWNjZXNzZnVsKSBJL08gdG8gcmVzdW1lLiAgSW4gdGhlIGV2ZW50IG9mIGEgbWFsZnVuY3Rpb25pbmcgb3IgIAorLy8gdmVyeSBidXN5IGxvb3AsIGl0IG1heSB0YWtlIGh1bmRyZWRzIG9mIG1pbGxpc2VjcyBvciBldmVuIHNlY29uZHMgdG8gY29tcGxldGUKKy8vIGEgZnJhbWUgc2VuZC4gIFdlIGRvbid0IHdhbnQgdG8gaGFuZyB1cCB0aGUgZW50aXJlIHNlcnZlciAoYW5kIGFsbAorLy8gcHJvY2Vzc2VzIHdoaWNoIGRvbid0IGRlcGVuZCBvbiBGaWJyZSkgZHVyaW5nIHRoaXMgd2FpdC4KKworLy8gVGhlIFRhY2h5b24gY2hpcCBjYW4gaGF2ZSBhcm91bmQgMzAsMDAwIEkvTyBvcGVyYXRpb25zICgiZXhjaGFuZ2VzIikKKy8vIG9wZW4gYXQgb25lIHRpbWUuICBIb3dldmVyLCBlYWNoIGV4Y2hhbmdlIG11c3QgYmUgaW5pdGlhdGVkIAorLy8gc3luY2hyb25vdXNseSAoaS5lLiBlYWNoIG9mIHRoZSAzMGsgSS9PIGhhZCB0byBiZSBzdGFydGVkIG9uZSBhdCBhCisvLyB0aW1lIGJ5IHNlbmRpbmcgYSBzdGFydGluZyBmcmFtZSB2aWEgVGFjaHlvbidzIG91dGJvdW5kIHF1ZSkuICAKKworLy8gVG8gYWNjb21tb2RhdGUga2VybmVsICJtb2R1bGUiIGJ1aWxkLCB0aGlzIGRyaXZlciBsaW1pdHMgdGhlIGV4Y2hhbmdlcworLy8gdG8gMjU2LCBiZWNhdXNlIG9mIHRoZSBjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeSBsaW1pdGF0aW9uIG9mIDEyOE0uCisKKy8vIFR5cGljYWwgRkMgRXhjaGFuZ2VzIGFyZSBvcGVuZWQgcHJlc3VtaW5nIHRoZSBGQyBmcmFtZXMgc3RhcnQgd2l0aG91dCBlcnJvcnMsCisvLyB3aGlsZSBFeGNoYW5nZSBjb21wbGV0aW9uIGlzIGhhbmRsZWQgaW4gdGhlIGludGVycnVwdCBoYW5kbGVyLiAgVGhpcworLy8gb3B0aW1pemVzIHBlcmZvcm1hbmNlIGZvciB0aGUgImV2ZXJ5dGhpbmcncyB3b3JraW5nIiBjYXNlLgorLy8gSG93ZXZlciwgd2hlbiB3ZSBoYXZlIEZDIHJlbGF0ZWQgZXJyb3JzIG9yIGhvdCBwbHVnZ2luZyBvZiBGQyBwb3J0cywgd2UgcGF1c2UKKy8vIEkvTyBhbmQgaGFuZGxlIEZDLXNwZWNpZmljIHRhc2tzIGluIHRoZSB3b3JrZXIgdGhyZWFkLiAgVGhlc2UgRkMtc3BlY2lmaWMKKy8vIGZ1bmN0aW9ucyB3aWxsIGhhbmRsZSB0aGluZ3MgbGlrZSBGQyBMb2dpbnMgYW5kIEFib3J0cy4gIEFzIHRoZSBMb2dpbiBzZXF1ZW5jZQorLy8gY29tcGxldGVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHRhcmdldCwgSS9PIGNhbiByZXN1bWUgdG8gdGhhdCB0YXJnZXQuICAKKworLy8gT3VyIGtlcm5lbCAid29ya2VyIHRocmVhZCIgbXVzdCBzaGFyZSB0aGUgSEJBIHdpdGggdGhyZWFkcyBjYWxsaW5nIAorLy8gInF1ZXVlY29tbWFuZCIuICBXZSBkZWZpbmUgYSAiQm9hcmRMb2NrIiBzZW1hcGhvcmUgd2hpY2ggaW5kaWNhdGVzCisvLyB0byAicXVldWVjb21tYW5kIiB0aGF0IHRoZSBIQkEgaXMgdW5hdmFpbGFibGUsIGFuZCBDbW5kcyBhcmUgYWRkZWQgdG8gYQorLy8gYm9hcmQgbG9jayBRLiAgV2hlbiB0aGUgd29ya2VyIHRocmVhZCBmaW5pc2hlcyB3aXRoIHRoZSBib2FyZCwgdGhlIGJvYXJkCisvLyBsb2NrIFEgY29tbWFuZHMgYXJlIGNvbXBsZXRlZCB3aXRoIHN0YXR1cyBjYXVzaW5nIGltbWVkaWF0ZSByZXRyeS4KKy8vIFR5cGljYWxseSwgdGhlIGJvYXJkIGlzIGxvY2tlZCB3aGlsZSBMb2dpbnMgYXJlIGluIHByb2dyZXNzIGFmdGVyIGFuCisvLyBGQyBMaW5rIERvd24gY29uZGl0aW9uLiAgV2hlbiBDbW5kcyBhcmUgcmUtcXVldWVkIGFmdGVyIGJvYXJkIGxvY2ssIHRoZQorLy8gcGFydGljdWxhciBTY3NpIGNoYW5uZWwvdGFyZ2V0IG1heSBvciBtYXkgbm90IGhhdmUgbG9nZ2VkIGJhY2sgaW4uICBXaGVuCisvLyB0aGUgZGV2aWNlIGlzIHdhaXRpbmcgZm9yIGxvZ2luLCB0aGUgInBybGkiIGZsYWcgaXMgY2xlYXIsIGluIHdoaWNoIGNhc2UKKy8vIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gYSBMaW5rIERvd24gUS4gIFdoZW5ldmVyIHRoZSBsb2dpbiBmaW5hbGx5IGNvbXBsZXRlcywKKy8vIHRoZSBMaW5rRG93biBRIGlzIGNvbXBsZXRlZCwgYWdhaW4gd2l0aCBzdGF0dXMgY2F1c2luZyBpbW1lZGlhdGUgcmV0cnkuCisvLyBXaGVuIEZDIGRldmljZXMgYXJlIGxvZ2dlZCBpbiwgd2UgYnVpbGQgYW5kIHN0YXJ0IEZDIGNvbW1hbmRzIHRvIHRoZQorLy8gZGV2aWNlcy4KKworLy8gTk9URSEhIEFzIG9mIE1heSAyMDAwLCBrZXJuZWwgMi4yLjE0LCB0aGUgZXJyb3IgcmVjb3ZlcnkgbG9naWMgZm9yIGRldmljZXMgCisvLyB0aGF0IG5ldmVyIGxvZyBiYWNrIGluIChlLmcuIHBoeXNpY2FsbHkgcmVtb3ZlZCkgaXMgTk9UIGNvbXBsZXRlbHkKKy8vIHVuZGVyc3Rvb2QuICBJJ3ZlIHN0aWxsIHNlZW4gaW5zdGFuY2VzIG9mIHN5c3RlbSBoYW5ncyBvbiBmYWlsZWQgV3JpdGUgCisvLyBjb21tYW5kcyAocG9zc2libHkgZnJvbSB0aGUgZXh0MiBsYXllcj8pIG9uIGRldmljZSByZW1vdmFsLiAgU3VjaCBzcGVjaWFsCisvLyBjYXNlcyBuZWVkIHRvIGJlIGV2YWx1YXRlZCBmcm9tIGEgc3lzdGVtL2FwcGxpY2F0aW9uIHZpZXcgLSBlLmcuLCBob3cKKy8vIGV4YWN0bHkgZG9lcyB0aGUgc3lzdGVtIHdhbnQgbWUgdG8gY29tcGxldGUgY29tbWFuZHMgd2hlbiB0aGUgZGV2aWNlIGlzCisvLyBwaHlzaWNhbGx5IHJlbW92ZWQ/PworCisvLyBsb2NhbCBmdW5jdGlvbnMKKworc3RhdGljIHZvaWQgU2V0TG9naW5GaWVsZHMoCisgIFBGQ19MT0dHRURJTl9QT1JUIHBMb2dnZWRJblBvcnQsCisgIFRhY2hGQ0hEUl9HQ01ORCogZmNocywKKyAgQk9PTEVBTiBQRGlzYywKKyAgQk9PTEVBTiBPcmlnaW5hdG9yKTsKKworc3RhdGljIHZvaWQgQW5hbHl6ZUluY29taW5nRnJhbWUoIAorICAgICAgIENQUUZDSEJBICpjcHFmY0hCQWRhdGEsCisgICAgICAgVUxPTkcgUU5keCApOworCitzdGF0aWMgdm9pZCBTZW5kTG9naW5zKCBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhLCBfX3UzMiAqRmFicmljUG9ydElkcyApOworCitzdGF0aWMgaW50IHZlcmlmeV9QTE9HSSggUFRBQ0hZT04gZmNDaGlwLAorICAgICAgVGFjaEZDSERSX0dDTU5EKiBmY2hzLCBVTE9ORyogcmVqZWN0X2V4cGxhaW4pOworc3RhdGljIGludCB2ZXJpZnlfUFJMSSggVGFjaEZDSERSX0dDTU5EKiBmY2hzLCBVTE9ORyogcmVqZWN0X2V4cGxhaW4pOworCitzdGF0aWMgdm9pZCBMb2FkV1dOKCBQVEFDSFlPTiBmY0NoaXAsIFVDSEFSKiBkZXN0LCBVQ0hBUiB0eXBlKTsKK3N0YXRpYyB2b2lkIEJ1aWxkTGlua1NlcnZpY2VQYXlsb2FkKCAKKyAgICAgICAgICAgICAgUFRBQ0hZT04gZmNDaGlwLCBVTE9ORyB0eXBlLCB2b2lkKiBwYXlsb2FkKTsKKworc3RhdGljIHZvaWQgVW5ibG9ja1Njc2lEZXZpY2UoIHN0cnVjdCBTY3NpX0hvc3QgKkhvc3RBZGFwdGVyLCAKKyAgICAgICAgUEZDX0xPR0dFRElOX1BPUlQgcExvZ2dlZEluUG9ydCk7CisKK3N0YXRpYyB2b2lkIGNwcWZjVFNDaGVja2FuZFNub29wRkNQKCBQVEFDSFlPTiBmY0NoaXAsIFVMT05HIHhfSUQpOworCitzdGF0aWMgdm9pZCBDb21wbGV0ZUJvYXJkTG9ja0NtbmQoIENQUUZDSEJBICpjcHFmY0hCQWRhdGEpOworCitzdGF0aWMgdm9pZCBSZXZhbGlkYXRlU0VTVCggc3RydWN0IFNjc2lfSG9zdCAqSG9zdEFkYXB0ZXIsIAorCQkgICAgICAgIFBGQ19MT0dHRURJTl9QT1JUIHBMb2dnZWRJblBvcnQpOworCitzdGF0aWMgdm9pZCBJc3N1ZVJlcG9ydEx1bnNDb21tYW5kKCAKKyAgICAgICAgICAgICAgQ1BRRkNIQkEqIGNwcWZjSEJBZGF0YSwgCisJICAgICAgVGFjaEZDSERSX0dDTU5EKiBmY2hzKTsKKworLy8gKHNlZSBzY3NpX2Vycm9yLmMgY29tbWVudHMgb24ga2VybmVsIHRhc2sgY3JlYXRpb24pCisKK3ZvaWQgY3BxZmNUU1dvcmtlclRocmVhZCggdm9pZCAqaG9zdCkKK3sKKyAgc3RydWN0IFNjc2lfSG9zdCAqSG9zdEFkYXB0ZXIgPSAoc3RydWN0IFNjc2lfSG9zdCopaG9zdDsKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSA9IChDUFFGQ0hCQSAqKUhvc3RBZGFwdGVyLT5ob3N0ZGF0YTsgCisjaWZkZWYgUENJX0tFUk5FTF9UUkFDRQorICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisjZW5kaWYKKyAgREVDTEFSRV9NVVRFWF9MT0NLRUQoZmNRdWVSZWFkeSk7CisgIERFQ0xBUkVfTVVURVhfTE9DS0VEKGZjVFlPQmNvbXBsZXRlKTsgCisgIERFQ0xBUkVfTVVURVhfTE9DS0VEKFRhY2hGcm96ZW4pOyAgCisgIERFQ0xBUkVfTVVURVhfTE9DS0VEKEJvYXJkTG9jayk7ICAKKworICBFTlRFUigiV29ya2VyVGhyZWFkIik7CisKKyAgbG9ja19rZXJuZWwoKTsKKyAgZGFlbW9uaXplKCJjcHFmY1RTX3d0XyVkIiwgSG9zdEFkYXB0ZXItPmhvc3Rfbm8pOworICBzaWdpbml0c2V0aW52KCZjdXJyZW50LT5ibG9ja2VkLCBTSFVURE9XTl9TSUdTKTsKKworCisgIGNwcWZjSEJBZGF0YS0+ZmNRdWVSZWFkeSA9ICZmY1F1ZVJlYWR5OyAgLy8gcHJpbWFyeSB3YWl0IHBvaW50CisgIGNwcWZjSEJBZGF0YS0+VFlPQmNvbXBsZXRlID0gJmZjVFlPQmNvbXBsZXRlOworICBjcHFmY0hCQWRhdGEtPlRhY2hGcm96ZW4gPSAmVGFjaEZyb3plbjsKKyAgICAKKyAKKyAgY3BxZmNIQkFkYXRhLT53b3JrZXJfdGhyZWFkID0gY3VycmVudDsKKyAgCisgIHVubG9ja19rZXJuZWwoKTsKKworICBpZiggY3BxZmNIQkFkYXRhLT5ub3RpZnlfd3QgIT0gTlVMTCApCisgICAgdXAoIGNwcWZjSEJBZGF0YS0+bm90aWZ5X3d0KTsgLy8gT0sgdG8gY29udGludWUKKworICB3aGlsZSgxKQorICB7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIGRvd25faW50ZXJydXB0aWJsZSggJmZjUXVlUmVhZHkpOyAgLy8gd2FpdCBmb3Igc29tZXRoaW5nIHRvIGRvCisKKyAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgKQorICAgICAgYnJlYWs7CisgICAgCisgICAgUENJX1RSQUNFKCAweDkwKQorICAgIC8vIGZpcnN0LCB0YWtlIHRoZSBJTyBsb2NrIHNvIHRoZSBTQ1NJIHVwcGVyIGxheWVycyBjYW4ndCBjYWxsCisgICAgLy8gaW50byBvdXIgX3F1ZWNvbW1hbmQgZnVuY3Rpb24gKHRoaXMgYWxzbyBkaXNhYmxlcyBJTlRzKQorICAgIHNwaW5fbG9ja19pcnFzYXZlKCBIb3N0QWRhcHRlci0+aG9zdF9sb2NrLCBmbGFncyk7IC8vIFNUT1AgX3F1ZSBmdW5jdGlvbgorICAgIFBDSV9UUkFDRSggMHg5MCkKKyAgICAgICAgIAorICAgIENQUV9TUElOTE9DS19IQkEoIGNwcWZjSEJBZGF0YSkKKyAgICAvLyBuZXh0LCBzZXQgdGhpcyBwb2ludGVyIHRvIGluZGljYXRlIHRvIHRoZSBfcXVlY29tbWFuZCBmdW5jdGlvbgorICAgIC8vIHRoYXQgdGhlIGJvYXJkIGlzIGluIHVzZSwgc28gaXQgc2hvdWxkIHF1ZSB0aGUgY29tbWFuZCBhbmQgCisgICAgLy8gaW1tZWRpYXRlbHkgcmV0dXJuICh3ZSBkb24ndCBhY3R1YWxseSByZXF1aXJlIHRoZSBzZW1hcGhvcmUgZnVuY3Rpb24KKyAgICAvLyBpbiB0aGlzIGRyaXZlciByZXYpCisKKyAgICBjcHFmY0hCQWRhdGEtPkJvYXJkTG9jayA9ICZCb2FyZExvY2s7CisKKyAgICBQQ0lfVFJBQ0UoIDB4OTApCisKKyAgICAvLyByZWxlYXNlIHRoZSBJTyBsb2NrIChhbmQgcmUtZW5hYmxlIGludGVycnVwdHMpCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggSG9zdEFkYXB0ZXItPmhvc3RfbG9jaywgZmxhZ3MpOworCisgICAgLy8gZGlzYWJsZSBPVVIgSEJBIGludGVycnVwdCAoa2VlcCB0aGVtIG9mZiBhcyBtdWNoIGFzIHBvc3NpYmxlCisgICAgLy8gZHVyaW5nIGVycm9yIHJlY292ZXJ5KQorICAgIGRpc2FibGVfaXJxKCBjcHFmY0hCQWRhdGEtPkhvc3RBZGFwdGVyLT5pcnEpOworCisgICAgLy8gT0ssIGxldCdzIHByb2Nlc3MgdGhlIEZpYnJlIENoYW5uZWwgTGluayBRIGFuZCBkbyB0aGUgd29yaworICAgIGNwcWZjVFNfV29ya1Rhc2soIEhvc3RBZGFwdGVyKTsKKworICAgIC8vIGhvcGVmdWxseSwgbm8gbW9yZSAid29yayIgdG8gZG87CisgICAgLy8gcmUtZW5hYmxlIG91ciBJTlRzIGZvciAibm9ybWFsIiBjb21wbGV0aW9uIHByb2Nlc3NpbmcKKyAgICBlbmFibGVfaXJxKCBjcHFmY0hCQWRhdGEtPkhvc3RBZGFwdGVyLT5pcnEpOworIAorCisgICAgY3BxZmNIQkFkYXRhLT5Cb2FyZExvY2sgPSBOVUxMOyAvLyBhbGxvdyBjb21tYW5kcyB0byBiZSBxdWV1ZWQKKyAgICBDUFFfU1BJTlVOTE9DS19IQkEoIGNwcWZjSEJBZGF0YSkKKworCisgICAgLy8gTm93LCBjb21wbGV0ZSBhbnkgQ21uZCB3ZSBRJ2QgdXAgd2hpbGUgQm9hcmRMb2NrIHdhcyBoZWxkCisKKyAgICBDb21wbGV0ZUJvYXJkTG9ja0NtbmQoIGNwcWZjSEJBZGF0YSk7CisgIAorCisgIH0KKyAgLy8gaG9wZWZ1bGx5LCB0aGUgc2lnbmFsIHdhcyBmb3Igb3VyIG1vZHVsZSBleGl0Li4uCisgIGlmKCBjcHFmY0hCQWRhdGEtPm5vdGlmeV93dCAhPSBOVUxMICkKKyAgICB1cCggY3BxZmNIQkFkYXRhLT5ub3RpZnlfd3QpOyAvLyB5ZXAsIHdlJ3JlIG91dHRhIGhlcmUKK30KKworCisvLyBGcmVlemUgVGFjaHlvbiByb3V0aW5lLgorLy8gSWYgVGFjaHlvbiBpcyBhbHJlYWR5IGZyb3plbiwgcmV0dXJuIEZBTFNFCisvLyBJZiBUYWNoeW9uIGlzIG5vdCBmcm96ZW4sIGNhbGwgZnJlZXplIGZ1bmN0aW9uLCByZXR1cm4gVFJVRQorLy8KK3N0YXRpYyBCT09MRUFOIEZyZWV6ZVRhY2goIENQUUZDSEJBICpjcHFmY0hCQWRhdGEpCit7CisgIFBUQUNIWU9OIGZjQ2hpcCA9ICZjcHFmY0hCQWRhdGEtPmZjQ2hpcDsKKyAgQk9PTEVBTiBGcm96ZVRhY2ggPSBGQUxTRTsKKyAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBjaGlwIGlzIGFscmVhZHkgZnJvemVuOyBpZiBzbywKKyAgLy8gIkZyZWV6aW5nIiBhZ2FpbiB3aWxsIE5PVCEgZ2VuZXJhdGUgYW5vdGhlciBGcmVlemUKKyAgLy8gQ29tcGxldGlvbiBNZXNzYWdlLgorCisgIGlmKCAoZmNDaGlwLT5SZWdpc3RlcnMuVFlzdGF0dXMudmFsdWUgJiAweDcwMDAwKSAhPSAweDcwMDAwKQorICB7ICAvLyAobmVlZCB0byBmcmVlemUuLi4pCisgICAgZmNDaGlwLT5GcmVlemVUYWNoeW9uKCBmY0NoaXAsIDIpOyAgLy8gYm90aCBFUlEgYW5kIEZDUCBhc3Npc3RzCisKKyAgICAvLyAyLiBHZXQgVGFjaCBmcmVlemUgY29uZmlybWF0aW9uCisgICAgLy8gKHN5bmNocm9uaXplIFNFU1QgbWFuaXB1bGF0aW9uIHdpdGggRnJlZXplIENvbXBsZXRpb24gTWVzc2FnZSkKKyAgICAvLyB3ZSBuZWVkIElOVHMgb24gc28gc2VtYXBob3JlIGNhbiBiZSBzZXQuCQorICAgIGVuYWJsZV9pcnEoIGNwcWZjSEJBZGF0YS0+SG9zdEFkYXB0ZXItPmlycSk7IC8vIG9ubHkgd2F5IHRvIGdldCBTZW1hcGhvcmUKKyAgICBkb3duX2ludGVycnVwdGlibGUoIGNwcWZjSEJBZGF0YS0+VGFjaEZyb3plbik7IC8vIHdhaXQgZm9yIElOVCBoYW5kbGVyIHNlbS4KKyAgICAvLyBjYW4gd2UgVElNRU9VVCBzZW1hcGhvcmUgd2FpdD8/IFRCRAorICAgIGRpc2FibGVfaXJxKCBjcHFmY0hCQWRhdGEtPkhvc3RBZGFwdGVyLT5pcnEpOyAKKworICAgIEZyb3plVGFjaCA9IFRSVUU7CisgIH0gIC8vIChlbHNlLCBhbHJlYWR5IGZyb3plbikKKyAKKyAgcmV0dXJuIEZyb3plVGFjaDsKK30gIAorCisKKworCisvLyBUaGlzIGlzIHRoZSBrZXJuZWwgd29ya2VyIHRocmVhZCB0YXNrLCB3aGljaCBwcm9jZXNzZXMgRkMKKy8vIHRhc2tzIHdoaWNoIHdlcmUgcXVldWVkIGJ5IHRoZSBJbnRlcnJ1cHQgaGFuZGxlciBvciBieQorLy8gb3RoZXIgV29ya1Rhc2sgZnVuY3Rpb25zLgorCisjZGVmaW5lIERCRyAxCisvLyN1bmRlZiBEQkcKK3ZvaWQgY3BxZmNUU19Xb3JrVGFzayggc3RydWN0IFNjc2lfSG9zdCAqSG9zdEFkYXB0ZXIpCit7CisgIENQUUZDSEJBICpjcHFmY0hCQWRhdGEgPSAoQ1BRRkNIQkEgKilIb3N0QWRhcHRlci0+aG9zdGRhdGE7CisgIFBUQUNIWU9OIGZjQ2hpcCA9ICZjcHFmY0hCQWRhdGEtPmZjQ2hpcDsKKyAgRkNfRVhDSEFOR0VTICpFeGNoYW5nZXMgPSBmY0NoaXAtPkV4Y2hhbmdlczsKKyAgVUxPTkcgUWNvbnN1bWVyTmR4OworICBMT05HIEV4Y2hhbmdlSUQ7CisgIFVMT05HIHVsU3RhdHVzPTA7CisgIFRhY2hGQ0hEUl9HQ01ORCBmY2hzOworICBQRkNfTElOS19RVUUgZmNMUSA9IGNwcWZjSEJBZGF0YS0+ZmNMUTsKKworICBFTlRFUigiV29ya1Rhc2siKTsKKworICAvLyBjb3B5IGN1cnJlbnQgaW5kZXggdG8gd29yayBvbgorICBRY29uc3VtZXJOZHggPSBmY0xRLT5jb25zdW1lcjsKKworICBQQ0lfVFJBQ0VPKCBmY0xRLT5RaXRlbVtRY29uc3VtZXJOZHhdLlR5cGUsIDB4OTApCisgIAorCisgIC8vIE5PVEU6IHdoZW4gdGhpcyBzd2l0Y2ggY29tcGxldGVzLCB3ZSB3aWxsICJjb25zdW1lIiB0aGUgUXVlIGl0ZW0KKy8vICBwcmludGsoIlF1ZSB0eXBlICVYaFxuIiwgZmNMUS0+UWl0ZW1bUWNvbnN1bWVyTmR4XS5UeXBlKTsKKyAgc3dpdGNoKCBmY0xRLT5RaXRlbVtRY29uc3VtZXJOZHhdLlR5cGUgKQorICB7CisgICAgICAvLyBpbmNvbWluZyBmcmFtZSAtIGxpbmsgc2VydmljZSAoQUNDLCBVTlNPTCBSRVEsIGV0Yy4pCisgICAgICAvLyBvciBGQ1AtU0NTSSBjb21tYW5kCisgICAgY2FzZSBTRlFfVU5LTk9XTjogIAorICAgICAgQW5hbHl6ZUluY29taW5nRnJhbWUoIGNwcWZjSEJBZGF0YSwgUWNvbnN1bWVyTmR4ICk7CisKKyAgICAgIGJyZWFrOworICAKKyAgICAKKyAgICAKKyAgICBjYXNlIEVYQ0hBTkdFX1FVRVVFRDogIC8vIGFuIEV4Y2hhbmdlIChpLmUuIEZDUC1TQ1NJKSB3YXMgcHJldmlvdXNseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUXVldWVkIGJlY2F1c2UgdGhlIGxpbmsgd2FzIGRvd24uICBUaGUgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVhcnRiZWF0IHRpbWVyIGRldGVjdGVkIGl0IGFuZCBRdWV1ZWQgaXQgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGF0dGVtcHQgdG8gc3RhcnQgaXQgYWdhaW4sIGFuZCBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VjY2Vzc2Z1bCB3ZSBjbGVhciB0aGUgRVhDSEFOR0VfUSBmbGFnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGxpbmsgZG9lc24ndCBjb21lIHVwLCB0aGUgRXhjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgZXZlbnR1YWxseSB0aW1lLW91dC4KKworICAgICAgRXhjaGFuZ2VJRCA9IChMT05HKSAgLy8geF9JRCBjb3BpZWQgZnJvbSBEUEMgdGltZW91dCBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgIGZjTFEtPlFpdGVtW1Fjb25zdW1lck5keF0udWxCdWZmWzBdOworCisgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgYSBRJ2QgZXhjaGFuZ2UgY291bGQgaGF2ZSBhbHJlYWR5CisgICAgICAvLyBiZWVuIHN0YXJ0ZWQgYnkgb3RoZXIgbG9naWMgKGUuZy4gQUJUUyBwcm9jZXNzKQorICAgICAgLy8gRG9uJ3Qgc3RhcnQgaWYgYWxyZWFkeSBzdGFydGVkIChRJ2QgZmxhZyBjbGVhcikKKworICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtFeGNoYW5nZUlEXS5zdGF0dXMgJiBFWENIQU5HRV9RVUVVRUQgKQorICAgICAgeworLy8gICAgICAgIHByaW50aygiICpTdGFydCBRJ2QgeF9JRCAlWGg6IHR5cGUgJVhoICIsIAorLy8gICAgICAgICAgRXhjaGFuZ2VJRCwgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW0V4Y2hhbmdlSURdLnR5cGUpOworICAgICAgCisgICAgICAgIHVsU3RhdHVzID0gY3BxZmNUU1N0YXJ0RXhjaGFuZ2UoIGNwcWZjSEJBZGF0YSwgRXhjaGFuZ2VJRCk7CisgICAgICAgIGlmKCAhdWxTdGF0dXMgKQorICAgICAgICB7CisvLyAgICAgICAgICBwcmludGsoInN1Y2Nlc3MqICIpOworICAgICAgICB9CQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyNpZmRlZiBEQkcKKyAgICAgIAorICAgICAgICAgIGlmKCB1bFN0YXR1cyA9PSBFWENIQU5HRV9RVUVVRUQpCisgICAgICAgICAgICBwcmludGsoIlF1ZXVlZCogIik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRrKCJmYWlsZWQqICIpOworCQkKKyNlbmRpZgorCX0gCisgICAgICB9CisgICAgICBicmVhazsKKworCisgICAgY2FzZSBMSU5LRE9XTjogIAorICAgICAgLy8gKGxvdHMgb2YgdGhpbmdzIGFscmVhZHkgZG9uZSBpbiBJTlQgaGFuZGxlcikgZnV0dXJlIGhlcmU/CisgICAgICBicmVhazsKKyAgICAKKyAgICAKKyAgICBjYXNlIExJTktBQ1RJVkU6ICAgLy8gVGFjaHlvbiBzZXQgdGhlIEx1cCBiaXQgaW4gRk0gc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IHNvbWUgbWlzYmVoYXZpbmcgRkMgcG9ydHMgKGxpa2UgVGFjaDIuMSkKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIHJlLUxJUCBpbW1lZGlhdGVseSBhZnRlciBhIExJUCBjb21wbGV0ZXMuCisgICAgICAKKyAgICAgIC8vIGlmICJpbml0aWF0b3IiLCBuZWVkIHRvIHZlcmlmeSBMT0dzIHdpdGggcG9ydHMKKy8vICAgICAgcHJpbnRrKCJcbipMTktVUCogIik7CisKKyAgICAgIGlmKCBmY0NoaXAtPk9wdGlvbnMuaW5pdGlhdG9yICkKKyAgICAgICAgU2VuZExvZ2lucyggY3BxZmNIQkFkYXRhLCBOVUxMICk7IC8vIFBMT0dJIG9yIFBESVNDLCBiYXNlZCBvbiBmY1BvcnQgZGF0YQorICAgICAgICAgICAgICAgICAgLy8gaWYgU2VuZExvZ2lucyBzdWNjZXNzZnVsbHkgY29tcGxldGVzLCBQb3J0RGlzY0RvbmUKKyAgICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgc2V0LgorICAgICAgCisgICAgICAKKyAgICAgIC8vIElmIFNlbmRMb2dpbnMgd2FzIHN1Y2Nlc3NmdWwsIHRoZW4gd2UgZXhwZWN0IHRvIGdldCBpbmNvbWluZworICAgICAgLy8gQUNDZXB0cyBvciBSRUpFQ1RzLCB3aGljaCBhcmUgaGFuZGxlZCBiZWxvdy4KKworICAgICAgYnJlYWs7CisKKyAgICAvLyBMaW5rU2VydmljZSBhbmQgRmFicmljIHJlcXVlc3QvcmVwbHkgcHJvY2Vzc2luZworICAgIGNhc2UgRUxTX0ZESVNDOiAgICAgIC8vIG5lZWQgdG8gc2VuZCBGYWJyaWMgRGlzY292ZXJ5IChMb2dpbikKKyAgICBjYXNlIEVMU19GTE9HSTogICAgICAvLyBuZWVkIHRvIHNlbmQgRmFicmljIExvZ2luCisgICAgY2FzZSBFTFNfU0NSOiAgICAgICAgLy8gbmVlZCB0byBzZW5kIFN0YXRlIENoYW5nZSBSZWdpc3RyYXRpb24KKyAgICBjYXNlIEZDU19OU1I6ICAgICAgICAvLyBuZWVkIHRvIHNlbmQgTmFtZSBTZXJ2aWNlIFJlcXVlc3QKKyAgICBjYXNlIEVMU19QTE9HSTogICAgICAvLyBuZWVkIHRvIHNlbmQgUExPR0kKKyAgICBjYXNlIEVMU19BQ0M6ICAgICAgICAvLyBzZW5kIGdlbmVyaWMgQUNDZXB0CisgICAgY2FzZSBFTFNfUExPR0lfQUNDOiAgLy8gbmVlZCB0byBzZW5kIEVMUyBBQ0NlcHQgZnJhbWUgdG8gcmVjdidkIFBMT0dJCisgICAgY2FzZSBFTFNfUFJMSV9BQ0M6ICAgLy8gbmVlZCB0byBzZW5kIEVMUyBBQ0NlcHQgZnJhbWUgdG8gcmVjdidkIFBSTEkKKyAgICBjYXNlIEVMU19MT0dPOiAgICAgIC8vIG5lZWQgdG8gc2VuZCBFTFMgTE9HTyAobG9nb3V0KQorICAgIGNhc2UgRUxTX0xPR09fQUNDOiAgLy8gbmVlZCB0byBzZW5kIEVMUyBBQ0NlcHQgZnJhbWUgdG8gcmVjdidkIFBMT0dJCisgICAgY2FzZSBFTFNfUkpUOiAgICAgICAgIC8vIFJlSmVjVCByZXBseQorICAgIGNhc2UgRUxTX1BSTEk6ICAgICAgIC8vIG5lZWQgdG8gc2VuZCBFTFMgUFJMSQorIAorICAgIAorLy8gICAgICBwcmludGsoIiAqRUxTICVYaCogIiwgZmNMUS0+UWl0ZW1bUWNvbnN1bWVyTmR4XS5UeXBlKTsKKyAgICAgIC8vIGlmIFBvcnREaXNjRG9uZSBpcyBub3Qgc2V0LCBpdCBtZWFucyB0aGUgU2VuZExvZ2lucyByb3V0aW5lCisgICAgICAvLyBmYWlsZWQgdG8gY29tcGxldGUgLS0gYXNzdW1lIHRoYXQgTERuIG9jY3VycmVkLCBzbyBsb2dpbiBmcmFtZXMKKyAgICAgIC8vIGFyZSBpbnZhbGlkCisgICAgICBpZiggIWNwcWZjSEJBZGF0YS0+UG9ydERpc2NEb25lKSAvLyBjbGVhcmVkIGJ5IExEbgorICAgICAgeworICAgICAgICBwcmludGsoIkRpc2NhcmQgUSdkIEVMUyBsb2dpbiBmcmFtZVxuIik7CisgICAgICAgIGJyZWFrOyAgCisgICAgICB9CisKKyAgICAgIHVsU3RhdHVzID0gY3BxZmNUU0J1aWxkRXhjaGFuZ2UoCisgICAgICAgICAgY3BxZmNIQkFkYXRhLAorICAgICAgICAgIGZjTFEtPlFpdGVtW1Fjb25zdW1lck5keF0uVHlwZSwgLy8gZS5nLiBQTE9HSQorICAgICAgICAgIChUYWNoRkNIRFJfR0NNTkQqKQorICAgICAgICAgICAgZmNMUS0+UWl0ZW1bUWNvbnN1bWVyTmR4XS51bEJ1ZmYsIC8vIGluY29taW5nIGZjaHMKKyAgICAgICAgICBOVUxMLCAgICAgICAgIC8vIG5vIGRhdGEgKG5vIHNjYXR0ZXIvZ2F0aGVyIGxpc3QpCisgICAgICAgICAgJkV4Y2hhbmdlSUQgKTsvLyBmY0NvbnRyb2xsZXItPmZjRXhjaGFuZ2VzIGluZGV4LCAtMSBpZiBmYWlsZWQKKworICAgICAgaWYoICF1bFN0YXR1cyApIC8vIEV4Y2hhbmdlIHNldHVwPworICAgICAgeworICAgICAgICB1bFN0YXR1cyA9IGNwcWZjVFNTdGFydEV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEsIEV4Y2hhbmdlSUQgKTsKKyAgICAgICAgaWYoICF1bFN0YXR1cyApCisgICAgICAgIHsKKyAgICAgICAgICAvLyBzdWJtaXR0ZWQgdG8gVGFjaCdzIE91dGJvdW5kIFF1ZSAoRVJRIFBJIGluY3JlbWVudGVkKQorICAgICAgICAgIC8vIHdhaXRlZCBmb3IgY29tcGxldGlvbiBmb3IgRUxTIHR5cGUgKExvZ2luIGZyYW1lcyBpc3N1ZWQKKyAgICAgICAgICAvLyBzeW5jaHJvbm91c2x5KQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAvLyBjaGVjayByZWFzb24gZm9yIEV4Y2hhbmdlIG5vdCBiZWluZyBzdGFydGVkIC0gd2UgbWlnaHQKKyAgICAgICAgICAvLyB3YW50IHRvIFF1ZXVlIGFuZCBzdGFydCBsYXRlciwgb3IgZmFpbCB3aXRoIGVycm9yCisgICAgICAgIHsKKworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGVsc2UgICAvLyBYY2hhbmdlIHNldHVwIGZhaWxlZC4uLgorICAgICAgICBwcmludGsoIiBjcHFmY1RTQnVpbGRFeGNoYW5nZSBmYWlsZWQ6ICVYaFxuIiwgdWxTdGF0dXMgKTsKKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNDU0lfUkVQT1JUX0xVTlM6CisgICAgICAvLyBwYXNzIHRoZSBpbmNvbWluZyBmcmFtZSAoYWN0dWFsbHksIGl0J3MgYSBQUkxJIGZyYW1lKQorICAgICAgLy8gc28gd2UgY2FuIHNlbmQgUkVQT1JUX0xVTlMsIGluIG9yZGVyIHRvIGRldGVybWluZSBWU0EvUERVCisgICAgICAvLyBGQ1AtU0NTSSBMdW4gYWRkcmVzcyBtb2RlCisgICAgICBJc3N1ZVJlcG9ydEx1bnNDb21tYW5kKCBjcHFmY0hCQWRhdGEsIChUYWNoRkNIRFJfR0NNTkQqKQorICAgICAgICAgICAgZmNMUS0+UWl0ZW1bUWNvbnN1bWVyTmR4XS51bEJ1ZmYpOyAKKworICAgICAgYnJlYWs7CisgICAgICAKKworCisKKyAgICBjYXNlIEJMU19BQlRTOiAgICAgICAvLyBuZWVkIHRvIEFCT1JUIG9uZSBvciBtb3JlIGV4Y2hhbmdlcworICAgIHsKKyAgICAgIExPTkcgeF9JRCA9IGZjTFEtPlFpdGVtW1Fjb25zdW1lck5keF0udWxCdWZmWzBdOworICAgICAgQk9PTEVBTiBGcm96ZVRhY2ggPSBGQUxTRTsgICAKKyAgICAgCisgICAgICBpZiAoIHhfSUQgPj0gVEFDSF9TRVNUX0xFTiApICAvLyAoaW4pc2FuaXR5IGNoZWNrCisgICAgICB7CisvLwlwcmludGsoICIgY3BxZmNUUyBFUlJPUiEgQk9HVVMgeF9JRCAlWGgiLCB4X0lEKTsKKwlicmVhazsKKyAgICAgIH0KKworCisgICAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS5DbW5kID09IE5VTEwgKSAvLyBzaG91bGQgYmUgUkFSRQorICAgICAgeworLy8JcHJpbnRrKCIgQUJUUyAlWGggU2NzaSBDbW5kIG51bGwhICIsIHhfSUQpOworCQorICAgICAgIGJyZWFrOyAgLy8gbm90aGluZyB0byBhYm9ydCEKKyAgICAgIH0KKworLy8jZGVmaW5lIEFCVFNfREJHCisjaWZkZWYgQUJUU19EQkcKKyAgICAgIHByaW50aygiSU5WIFNFU1RbJVhdICIsIHhfSUQpOyAKKyAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0uc3RhdHVzICYgRkMyX1RJTUVPVVQpCisgICAgICB7CisgICAgICAgIHByaW50aygiRkMyVE8iKTsKKyAgICAgIH0KKyAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0uc3RhdHVzICYgSU5JVElBVE9SX0FCT1JUKQorICAgICAgeworICAgICAgICBwcmludGsoIklBIik7CisgICAgICB9CisgICAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW3hfSURdLnN0YXR1cyAmIFBPUlRJRF9DSEFOR0VEKQorICAgICAgeworICAgICAgICBwcmludGsoIlBPUlRJRCIpOworICAgICAgfQorICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVt4X0lEXS5zdGF0dXMgJiBERVZJQ0VfUkVNT1ZFRCkKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKCJERVZSTSIpOworICAgICAgfQorICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVt4X0lEXS5zdGF0dXMgJiBMSU5LRkFJTF9UWCkKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKCJMS0YiKTsKKyAgICAgIH0KKyAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0uc3RhdHVzICYgRlJBTUVfVE8pCisgICAgICB7CisgICAgICAgIHByaW50aygiRlJNVE8iKTsKKyAgICAgIH0KKyAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0uc3RhdHVzICYgQUJPUlRTRVFfTk9USUZZKQorICAgICAgeworICAgICAgICBwcmludGsoIkFCU1EiKTsKKyAgICAgIH0KKyAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0uc3RhdHVzICYgU0ZRX0ZSQU1FKQorICAgICAgeworICAgICAgICBwcmludGsoIlNGUUZSIik7CisgICAgICB9CisKKyAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSURdLnR5cGUgPT0gMHgyMDAwKQorICAgICAgICBwcmludGsoIiBXUiIpOworICAgICAgZWxzZSBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS50eXBlID09IDB4MzAwMCkKKyAgICAgICAgcHJpbnRrKCIgUkQiKTsKKyAgICAgIGVsc2UgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRF0udHlwZSA9PSAweDEwKQorICAgICAgICBwcmludGsoIiBBQlRTIik7CisgICAgICBlbHNlCisgICAgICAgIHByaW50aygiICVYaCIsIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRF0udHlwZSk7IAorCisgICAgICBpZiggIShFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0uc3RhdHVzICYgSU5JVElBVE9SX0FCT1JUKSkKKyAgICAgIHsKKwlwcmludGsoIiBDbWQgJXAsICIsIAorICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRF0uQ21uZCk7CisKKyAgICAgICAgcHJpbnRrKCIgYnJkL2Nobi90cmcvbHVuICVkLyVkLyVkLyVkIHBvcnRfaWQgJTA2WFxuIiwgCisgICAgICAgICAgY3BxZmNIQkFkYXRhLT5IQkFudW0sCisgICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS5DbW5kLT5jaGFubmVsLAorICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRF0uQ21uZC0+dGFyZ2V0LAorICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRF0uQ21uZC0+bHVuLAorICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRF0uZmNocy5kX2lkICYgMHhGRkZGRkYpOworICAgICAgfQorICAgICAgZWxzZSAgLy8gYXNzdW1lIHRoYXQgQ21uZCBwdHIgaXMgaW52YWxpZCBvbiBfYWJvcnQoKQorICAgICAgeworCXByaW50aygiIENtZCBwdHIgaW52YWxpZFxuIik7CisgICAgICB9CisgICAgIAorI2VuZGlmICAgICAgCisKKyAgICAgIAorICAgICAgLy8gU3RlcHMgdG8gQUJPUlQgYSBTRVNUIGV4Y2hhbmdlOgorICAgICAgLy8gMS4gRnJlZXplIFRMIFNDU0kgYXNzaXN0cyAmIEVSUSAoZXZlcnl0aGluZykKKyAgICAgIC8vIDIuIFJlY2VpdmUgRlJPWkVOIGluYm91bmQgQ00gKG11c3Qgc3VjY2VlZCEpCisgICAgICAvLyAzLiBJbnZhbGlkYXRlIHhfSUQgU0VTVCBlbnRyeSAKKyAgICAgIC8vIDQuIFJlc3VtZSBUTCBTQ1NJIGFzc2lzdHMgJiBFUlEgKGV2ZXJ5dGhpbmcpCisgICAgICAvLyA1LiBCdWlsZC9zdGFydCBvbiBleGNoYW5nZSAtIGNoYW5nZSAidHlwZSIgdG8gQkxTX0FCVFMsCisgICAgICAvLyAgICB0aW1lb3V0IHRvIFggc2VjIChSQV9UT1YgZnJvbSBQTERBIGlzIGFjdHVhbGx5IDApCisgICAgICAvLyA2LiBTZXQgRXhjaGFuZ2UgUSdkIHN0YXR1cyBpZiBBQlRTIGNhbm5vdCBiZSBzdGFydGVkLAorICAgICAgLy8gICAgb3Igc2ltcGx5IGNvbXBsZXRlIEV4Y2hhbmdlIGluICJUZXJtaW5hdGUiIGNvbmRpdGlvbgorCisgIFBDSV9UUkFDRU8oIHhfSUQsIDB4QjQpCisgICAgICAKKyAgICAgIC8vIDEgJiAyIC4gRnJlZXplIFRhY2ggJiBnZXQgY29uZmlybWF0aW9uIG9mIGZyZWV6ZQorICAgICAgRnJvemVUYWNoID0gRnJlZXplVGFjaCggY3BxZmNIQkFkYXRhKTsKKworICAgICAgLy8gMy4gT0ssIFRhY2h5b24gaXMgZnJvemVuLCBzbyB3ZSBjYW4gaW52YWxpZGF0ZSBTRVNUIGV4Y2hhbmdlLgorICAgICAgLy8gRkMyX1RJTUVPVVQgbWVhbnMgd2UgYXJlIG9yaWdpbmF0aW5nIHRoZSBhYm9ydCwgd2hpbGUKKyAgICAgIC8vIFRBUkdFVF9BQk9SVCBtZWFucyB3ZSBhcmUgQUNDZXB0aW5nIGFuIGFib3J0LgorICAgICAgLy8gTElOS0ZBSUxfVFgsIEFCT1JUU0VRX05PRklUWSwgSU5WX0VOVFJZIG9yIEZSQU1FX1RPIGFyZSAKKyAgICAgIC8vIGFsbCBmcm9tIFRhY2h5b246CisgICAgICAvLyBFeGNoYW5nZSB3YXMgY29ycnVwdGVkIGJ5IExEbiBvciBvdGhlciBGQyBwaHlzaWNhbCBmYWlsdXJlCisgICAgICAvLyBJTklUSUFUT1JfQUJPUlQgbWVhbnMgdGhlIHVwcGVyIGxheWVyIGRyaXZlci9hcHBsaWNhdGlvbgorICAgICAgLy8gcmVxdWVzdGVkIHRoZSBhYm9ydC4KKworCisJICAKKyAgICAgIC8vIGNsZWFyIGJpdCAzMSAoVkFMaWQpLCB0byBpbnZhbGlkYXRlICYgdGFrZSBjb250cm9sIGZyb20gVEwKKyAgICAgIGZjQ2hpcC0+U0VTVC0+dVsgeF9JRF0uSVdFLkhkcl9MZW4gJj0gMHg3RkZGRkZGRjsKKworCisgICAgICAvLyBleGFtaW5lIGFuZCBUYWNoJ3MgIkxpbmtlZCBMaXN0IiBmb3IgSVdFcyB0aGF0IAorICAgICAgLy8gcmVjZWl2ZWQgKG5lYXJseSkgc2ltdWx0YW5lb3VzIHRyYW5zZmVyIHJlYWR5IChYUkRZKSAKKyAgICAgIC8vIHJlcGFpciBsaW5rZWQgbGlzdCBpZiBuZWNlc3NhcnkgKFRCRCEpCisgICAgICAvLyAoSWYgd2UgaWdub3JlIHRoZSAiTGlua2VkIExpc3QiLCB3ZSB3aWxsIHRpbWUgb3V0CisgICAgICAvLyBXUklURSBjb21tYW5kcyB3aGVyZSB3ZSByZWNlaXZlZCB0aGUgRkNQLVNDU0kgWEZSRFkKKyAgICAgIC8vIGZyYW1lIChiZWNhdXNlIFRhY2h5b24gZGlkbid0IHByb2Nlc3NlcyBpdCkuICBMaW5rZWQgTGlzdAorICAgICAgLy8gbWFuYWdlbWVudCBzaG91bGQgYmUgZG9uZSBhcyBhbiBvcHRpbWl6YXRpb24uCisKKy8vICAgICAgIHJlYWRsKCBmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UrVExfTUVNX1NFU1RfTElOS0VEX0xJU1QgKSk7CisKKworICAgICAgCisKKyAgICAgIC8vIDQuIFJlc3VtZSBhbGwgVGFjaGxpdGUgZnVuY3Rpb25zIChmb3Igb3RoZXIgb3BlbiBFeGNoYW5nZXMpCisgICAgICAvLyBhcyBxdWlja2x5IGFzIHBvc3NpYmxlIHRvIGFsbG93IG90aGVyIGV4Y2hhbmdlcyB0byBvdGhlciBwb3J0cworICAgICAgLy8gdG8gcmVzdW1lLiAgRnJlZXppbmcgVGFjaHlvbiBtYXkgY2F1c2UgY2FzY2FkaW5nIGVycm9ycywgYmVjYXVzZQorICAgICAgLy8gYW55IHJlY2VpdmVkIFNFU1QgZnJhbWUgY2Fubm90IGJlIHByb2Nlc3NlZCBieSB0aGUgU0VTVC4KKyAgICAgIC8vIERvbid0ICJ1bmZyZWV6ZSIgdW5sZXNzIExpbmsgaXMgb3BlcmF0aW9uYWwKKyAgICAgIGlmKCBGcm96ZVRhY2ggKSAgLy8gZGlkIHdlIGp1c3QgZnJlZXplIGl0IChhYm92ZSk/CisgICAgICAgIGZjQ2hpcC0+VW5GcmVlemVUYWNoeW9uKCBmY0NoaXAsIDIpOyAgLy8gYm90aCBFUlEgYW5kIEZDUCBhc3Npc3RzCisgICAgICAKKworICBQQ0lfVFJBQ0VPKCB4X0lELCAweEI0KQorCisgICAgICAvLyBOb3RlIHRoZXJlIGlzIG5vIGNvbmZpcm1hdGlvbiB0aGF0IHRoZSBjaGlwIGlzICJ1bmZyb3plbiIuICBBbHNvLAorICAgICAgLy8gaWYgdGhlIExpbmsgaXMgZG93biB3aGVuIHVuZnJlZXplIGlzIGNhbGxlZCwgaXQgaGFzIG5vIGVmZmVjdC4KKyAgICAgIC8vIENoaXAgd2lsbCB1bmZyZWV6ZSB3aGVuIHRoZSBMaW5rIGlzIGJhY2sgdXAuCisKKyAgICAgIC8vIDUuIE5vdyBzZW5kIG91dCBBYm9ydCBjb21tYW5kcyBpZiBwb3NzaWJsZQorICAgICAgLy8gU29tZSBBYm9ydHMgY2FuJ3QgYmUgInNlbnQiIChQb3J0X2lkIGNoYW5nZWQgb3IgZ29uZSk7CisgICAgICAvLyBpZiB0aGUgZGV2aWNlIGlzIGdvbmUsIHRoZXJlIGlzIG5vIHBvcnRfaWQgdG8gc2VuZCB0aGUgQUJUUyB0by4KKworICAgICAgaWYoICEoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS5zdGF0dXMgJiBQT1JUSURfQ0hBTkdFRCkKKwkJCSAgJiYKKyAgICAgICAgICAhKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRF0uc3RhdHVzICYgREVWSUNFX1JFTU9WRUQpICkKKyAgICAgIHsKKyAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS50eXBlID0gQkxTX0FCVFM7CisgICAgICAgIGZjaHMuc19pZCA9IEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRF0uZmNocy5kX2lkOworICAgICAgICB1bFN0YXR1cyA9IGNwcWZjVFNCdWlsZEV4Y2hhbmdlKAorICAgICAgICAgIGNwcWZjSEJBZGF0YSwKKyAgICAgICAgICBCTFNfQUJUUywKKyAgICAgICAgICAmZmNocywgICAgICAgIC8vICh1c2VzIG9ubHkgc19pZCkKKyAgICAgICAgICBOVUxMLCAgICAgICAgIC8vIChubyBzY2F0dGVyL2dhdGhlciBsaXN0IGZvciBBQlRTKQorICAgICAgICAgICZ4X0lEICk7Ly8gQUJUUyBvbiB0aGlzIEV4Y2hhbmdlIElECisKKyAgICAgICAgaWYoICF1bFN0YXR1cyApIC8vIEV4Y2hhbmdlIHNldHVwIGJ1aWxkIE9LPworICAgICAgICB7CisKKyAgICAgICAgICAgIC8vIEFCVFMgbWF5IGJlIG5lZWRlZCBiZWNhdXNlIGFuIEV4Y2hhbmdlIHdhcyBjb3JydXB0ZWQKKyAgICAgICAgICAgIC8vIGJ5IGEgTGluayBkaXNydXB0aW9uLiAgSWYgdGhlIExpbmsgaXMgVVAsIHdlIGNhbgorCSAgICAvLyBwcmVzdW1lIHRoYXQgdGhpcyBBQlRTIGNhbiBzdGFydCBpbW1lZGlhdGVseTsgb3RoZXJ3aXNlLAorCSAgICAvLyBzZXQgUXVlJ2Qgc3RhdHVzIHNvIHRoZSBMb2dpbiBmdW5jdGlvbnMKKyAgICAgICAgICAgIC8vIGNhbiByZXN0YXJ0IGl0IHdoZW4gdGhlIEZDIHBoeXNpY2FsIExpbmsgaXMgcmVzdG9yZWQKKyAgICAgICAgICBpZiggKChmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZSAmMHhGMCkgJjB4ODApKSAvLyBsb29wIGluaXQ/CisgICAgICAgICAgewkJCSAgICAKKy8vICAgICAgICAgICAgICAgIHByaW50aygiICpzZXQgUSBzdGF0dXMgeF9JRCAlWGggb24gTERuKiAiLCB4X0lEKTsKKyAgICAgICAgICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSURdLnN0YXR1cyB8PSBFWENIQU5HRV9RVUVVRUQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgZWxzZSAgLy8gd2hhdCBGQyBkZXZpY2UgKHBvcnRfaWQpIGRvZXMgdGhlIENtZCBiZWxvbmcgdG8/CisgICAgICAgICAgeworICAgICAgICAgICAgUEZDX0xPR0dFRElOX1BPUlQgcExvZ2dlZEluUG9ydCA9IAorICAgICAgICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSURdLnBMb2dnZWRJblBvcnQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIGlmIFBvcnQgaXMgbG9nZ2VkIGluLCB3ZSBtaWdodCBzdGFydCB0aGUgYWJvcnQuCisJCisgICAgICAgICAgICBpZiggKHBMb2dnZWRJblBvcnQgIT0gTlVMTCkgCisJCQkgICAgICAmJgorICAgICAgICAgICAgICAgIChwTG9nZ2VkSW5Qb3J0LT5wcmxpID09IFRSVUUpICkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIGl0J3MgcG9zc2libGUgdGhhdCBhbiBFeGNoYW5nZSBoYXMgYWxyZWFkeSBiZWVuIFF1ZXVlZAorICAgICAgICAgICAgICAvLyB0byBzdGFydCBhZnRlciBMb2dpbiBjb21wbGV0ZXMuICBDaGVjayBhbmQgZG9uJ3QKKwkgICAgICAvLyBzdGFydCBpdCAoYWdhaW4pIGhlcmUgaWYgUSdkIHN0YXR1cyBzZXQKKy8vCSAgICBwcmludGsoIiBBQlRTIHhjaGcgJVhoICIsIHhfSUQpOyAgICAgICAgICAgIAorIAkgICAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW3hfSURdLnN0YXR1cyAmIEVYQ0hBTkdFX1FVRVVFRCkKKwkgICAgICB7CisvLwkJICAgIHByaW50aygiYWxyZWFkeSBRJ2QgIik7CisJICAgICAgfQorCSAgICAgIGVsc2UKKwkgICAgICB7CisvLwkgICAgICAgICAgICBwcmludGsoInN0YXJ0aW5nICIpOworCQkKKyAgICAgICAgICAgICAgICBmY0NoaXAtPmZjU3RhdHMuRkMyYWJvcnRlZCsrOyAKKyAgICAgICAgICAgICAgICB1bFN0YXR1cyA9IGNwcWZjVFNTdGFydEV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEsIHhfSUQgKTsKKyAgICAgICAgICAgICAgICBpZiggIXVsU3RhdHVzICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICAgICAgICAgIC8vIHN1Ym1pdHRlZCB0byBUYWNoJ3MgT3V0Ym91bmQgUXVlIChFUlEgUEkgaW5jcmVtZW50ZWQpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisvKiAgICAgICAgICAgICAgICAgICBwcmludGsoIkFCVFMgZXhjaGFuZ2Ugc3RhcnQgZmFpbGVkIC1zdGF0dXMgJVhoLCB4X0lEICVYaCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgdWxTdGF0dXMsIHhfSUQpOworKi8KKyAgICAgICAgICAgICAgICB9IAorCSAgICAgIH0KKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKy8qICAgICAgICAgCSAgcHJpbnRrKCIgQUJUUyBOT1Qgc3RhcnRpbmcgeGNoZyAlWGgsICVwICIsCisJCQkgICAgICAgeF9JRCwgcExvZ2dlZEluUG9ydCk7CisJICAgICAgICAgIGlmKCBwTG9nZ2VkSW5Qb3J0ICkKKwkgICAgICAgICAgICBwcmludGsoInBybGkgJWQgIiwgcExvZ2dlZEluUG9ydC0+cHJsaSk7CisqLworCSAgICB9CQkKKyAJICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgLy8gd2hhdCB0aGUgI0AhCisgICAgICAgIHsgIC8vIGhvdyBkbyB3ZSBmYWlsIHRvIGJ1aWxkIGFuIEV4Y2hhbmdlIGZvciBBQlRTPz8KKyAgICAgICAgICAgICAgcHJpbnRrKCJBQlRTIGV4Y2hhbmdlIGJ1aWxkIGZhaWxlZCAtc3RhdHVzICVYaCwgeF9JRCAlWGhcbiIsCisgICAgICAgICAgICAgICAgdWxTdGF0dXMsIHhfSUQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlICAgLy8gYWJvcnQgd2l0aG91dCBBQlRTIC0tIGp1c3QgY29tcGxldGUgZXhjaGFuZ2UvQ21uZCB0byBMaW51eAorICAgICAgeworLy8gICAgICAgICAgICBwcmludGsoIiAqVGVybWluYXRpbmcgeF9JRCAlWGggb24gJVhoKiAiLCAKKy8vCQkgICAgeF9JRCwgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW3hfSURdLnN0YXR1cyk7CisgICAgICAgIGNwcWZjVFNDb21wbGV0ZUV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEtPlBjaURldiwgZmNDaGlwLCB4X0lEKTsKKworICAgICAgfQorICAgIH0gLy8gZW5kIG9mIEFCVFMgY2FzZQorICAgICAgYnJlYWs7CisKKworCisgICAgY2FzZSBCTFNfQUJUU19BQ0M6ICAgLy8gbmVlZCB0byBBQ0NlcHQgb25lIEFCVFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoTk9URSEgdGhpcyBjb2RlIG5vdCB1cGRhdGVkIGZvciBMaW51eCB5ZXQuLikKKyAgICAgIAorCisgICAgICBwcmludGsoIiAqQUJUU19BQ0MqICIpOworICAgICAgLy8gMS4gRnJlZXplIFRMCisKKyAgICAgIGZjQ2hpcC0+RnJlZXplVGFjaHlvbiggZmNDaGlwLCAyKTsgIC8vIGJvdGggRVJRIGFuZCBGQ1AgYXNzaXN0cworCisgICAgICBtZW1jcHkoICAvLyBjb3B5IHRoZSBpbmNvbWluZyBBQlRTIGZyYW1lCisgICAgICAgICZmY2hzLAorICAgICAgICBmY0xRLT5RaXRlbVtRY29uc3VtZXJOZHhdLnVsQnVmZiwgLy8gaW5jb21pbmcgZmNocworICAgICAgICBzaXplb2YoIGZjaHMpKTsKKworICAgICAgLy8gMy4gT0ssIFRhY2h5b24gaXMgZnJvemVuIHNvIHdlIGNhbiBpbnZhbGlkYXRlIFNFU1QgZW50cnkgCisgICAgICAvLyAoaWYgbmVjZXNzYXJ5KQorICAgICAgLy8gU3RhdHVzIEZDMl9USU1FT1VUIG1lYW5zIHdlIGFyZSBvcmlnaW5hdGluZyB0aGUgYWJvcnQsIHdoaWxlCisgICAgICAvLyBUQVJHRVRfQUJPUlQgbWVhbnMgd2UgYXJlIEFDQ2VwdGluZyBhbiBhYm9ydAorICAgICAgCisgICAgICBFeGNoYW5nZUlEID0gZmNocy5veF9yeF9pZCAmIDB4N0ZGRjsgLy8gUlhfSUQgZm9yIGV4Y2hhbmdlCisvLyAgICAgIHByaW50aygiQUJUUyBBQ0MgZm9yIFRhcmdldCBFeGNoYW5nZUlEICVYaFxuIiwgRXhjaGFuZ2VJRCk7CisKKworICAgICAgLy8gc2FuaXR5IGNoZWNrIG9uIHJlY2VpdmVkIEV4Y2hhbmdlSUQKKyAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIEV4Y2hhbmdlSURdLnN0YXR1cyA9PSBUQVJHRVRfQUJPUlQgKQorICAgICAgeworICAgICAgICAgIC8vIGNsZWFyIGJpdCAzMSAoVkFMaWQpLCB0byBpbnZhbGlkYXRlICYgdGFrZSBjb250cm9sIGZyb20gVEwKKy8vICAgICAgICAgIHByaW50aygiSW52YWxpZGF0aW5nIFNFU1QgZXhjaGFuZ2UgJVhoXG4iLCBFeGNoYW5nZUlEKTsKKyAgICAgICAgICBmY0NoaXAtPlNFU1QtPnVbIEV4Y2hhbmdlSURdLklXRS5IZHJfTGVuICY9IDB4N0ZGRkZGRkY7CisgICAgICB9CisKKworICAgICAgLy8gNC4gUmVzdW1lIGFsbCBUYWNobGl0ZSBmdW5jdGlvbnMgKGZvciBvdGhlciBvcGVuIEV4Y2hhbmdlcykKKyAgICAgIC8vIGFzIHF1aWNrbHkgYXMgcG9zc2libGUgdG8gYWxsb3cgb3RoZXIgZXhjaGFuZ2VzIHRvIG90aGVyIHBvcnRzCisgICAgICAvLyB0byByZXN1bWUuICBGcmVlemluZyBUYWNoeW9uIGZvciB0b28gbG9uZyBtYXkgcm95YWxseSBzY3JldworICAgICAgLy8gdXAgZXZlcnl0aGluZyEKKyAgICAgIGZjQ2hpcC0+VW5GcmVlemVUYWNoeW9uKCBmY0NoaXAsIDIpOyAgLy8gYm90aCBFUlEgYW5kIEZDUCBhc3Npc3RzCisgICAgICAKKyAgICAgIC8vIE5vdGUgdGhlcmUgaXMgbm8gY29uZmlybWF0aW9uIHRoYXQgdGhlIGNoaXAgaXMgInVuZnJvemVuIi4gIEFsc28sCisgICAgICAvLyBpZiB0aGUgTGluayBpcyBkb3duIHdoZW4gdW5mcmVlemUgaXMgY2FsbGVkLCBpdCBoYXMgbm8gZWZmZWN0LgorICAgICAgLy8gQ2hpcCB3aWxsIHVuZnJlZXplIHdoZW4gdGhlIExpbmsgaXMgYmFjayB1cC4KKworICAgICAgLy8gNS4gTm93IHNlbmQgb3V0IEFib3J0IEFDQyByZXBseSBmb3IgdGhpcyBleGNoYW5nZQorICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyBFeGNoYW5nZUlEXS50eXBlID0gQkxTX0FCVFNfQUNDOworICAgICAgCisgICAgICBmY2hzLnNfaWQgPSBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIEV4Y2hhbmdlSURdLmZjaHMuZF9pZDsKKyAgICAgIHVsU3RhdHVzID0gY3BxZmNUU0J1aWxkRXhjaGFuZ2UoCisgICAgICAgICAgICBjcHFmY0hCQWRhdGEsCisgICAgICAgICAgICBCTFNfQUJUU19BQ0MsCisgICAgICAgICAgICAmZmNocywKKyAgICAgICAgICAgIE5VTEwsICAgICAgICAgLy8gbm8gZGF0YSAobm8gc2NhdHRlci9nYXRoZXIgbGlzdCkKKyAgICAgICAgICAgICZFeGNoYW5nZUlEICk7Ly8gZmNDb250cm9sbGVyLT5mY0V4Y2hhbmdlcyBpbmRleCwgLTEgaWYgZmFpbGVkCisKKyAgICAgIGlmKCAhdWxTdGF0dXMgKSAvLyBFeGNoYW5nZSBzZXR1cD8KKyAgICAgIHsKKyAgICAgICAgdWxTdGF0dXMgPSBjcHFmY1RTU3RhcnRFeGNoYW5nZSggY3BxZmNIQkFkYXRhLCBFeGNoYW5nZUlEICk7CisgICAgICAgIGlmKCAhdWxTdGF0dXMgKQorICAgICAgICB7CisgICAgICAgICAgLy8gc3VibWl0dGVkIHRvIFRhY2gncyBPdXRib3VuZCBRdWUgKEVSUSBQSSBpbmNyZW1lbnRlZCkKKyAgICAgICAgICAvLyB3YWl0ZWQgZm9yIGNvbXBsZXRpb24gZm9yIEVMUyB0eXBlIChMb2dpbiBmcmFtZXMgaXNzdWVkCisgICAgICAgICAgLy8gc3luY2hyb25vdXNseSkKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgLy8gY2hlY2sgcmVhc29uIGZvciBFeGNoYW5nZSBub3QgYmVpbmcgc3RhcnRlZCAtIHdlIG1pZ2h0CisgICAgICAgICAgLy8gd2FudCB0byBRdWV1ZSBhbmQgc3RhcnQgbGF0ZXIsIG9yIGZhaWwgd2l0aCBlcnJvcgorICAgICAgICB7CisKKyAgICAgICAgfSAKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisKKyAgICBjYXNlIEJMU19BQlRTX1JKVDogICAvLyBuZWVkIHRvIFJlSmVjVCBvbmUgQUJUUzsgcmVqZWN0IGltcGxpZXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhjaGFuZ2UgZG9lc24ndCBleGlzdCBpbiB0aGUgVEFSR0VUIGNvbnRleHQuCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhjaGFuZ2VJRCBoYXMgdG8gY29tZSBmcm9tIExpbmtTZXJ2aWNlIHNwYWNlLgorCisgICAgICBwcmludGsoIiAqQUJUU19SSlQqICIpOworICAgICAgdWxTdGF0dXMgPSBjcHFmY1RTQnVpbGRFeGNoYW5nZSgKKyAgICAgICAgICAgIGNwcWZjSEJBZGF0YSwKKyAgICAgICAgICAgIEJMU19BQlRTX1JKVCwKKyAgICAgICAgICAgIChUYWNoRkNIRFJfR0NNTkQqKQorICAgICAgICAgICAgICBmY0xRLT5RaXRlbVtRY29uc3VtZXJOZHhdLnVsQnVmZiwgLy8gaW5jb21pbmcgZmNocworICAgICAgICAgICAgTlVMTCwgICAgICAgICAvLyBubyBkYXRhIChubyBzY2F0dGVyL2dhdGhlciBsaXN0KQorICAgICAgICAgICAgJkV4Y2hhbmdlSUQgKTsvLyBmY0NvbnRyb2xsZXItPmZjRXhjaGFuZ2VzIGluZGV4LCAtMSBpZiBmYWlsZWQKKworICAgICAgaWYoICF1bFN0YXR1cyApIC8vIEV4Y2hhbmdlIHNldHVwIE9LPworICAgICAgeworICAgICAgICB1bFN0YXR1cyA9IGNwcWZjVFNTdGFydEV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEsIEV4Y2hhbmdlSUQgKTsKKyAgICAgICAgLy8gSWYgaXQgZmFpbHMsIHdlIGFyZW4ndCByZXF1aXJlZCB0byByZXRyeS4KKyAgICAgIH0KKyAgICAgIGlmKCB1bFN0YXR1cyApCisgICAgICB7CisgICAgICAgIHByaW50aygiRmFpbGVkIHRvIHNlbmQgQkxTX1JKVCBmb3IgQUJUUywgWF9JRCAlWGhcbiIsIEV4Y2hhbmdlSUQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwcmludGsoIlNlbnQgQkxTX1JKVCBmb3IgQUJUUywgWF9JRCAlWGhcbiIsIEV4Y2hhbmdlSUQpOworICAgICAgCisgICAgICB9CisKKyAgICAgIGJyZWFrOworCisKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfSAgICAgICAgICAgICAgICAgICAvLyBlbmQgc3dpdGNoCisvL2RvTm90aGluZzoKKyAgICAvLyBkb25lIHdpdGggdGhpcyBpdGVtIC0gbm93IHNldCB0aGUgTkVYVCBpbmRleAorCisgIGlmKCBRY29uc3VtZXJOZHgrMSA+PSBGQ19MSU5LUV9ERVBUSCApIC8vIHJvbGxvdmVyIHRlc3QKKyAgeworICAgIGZjTFEtPmNvbnN1bWVyID0gMDsKKyAgfQorICBlbHNlCisgIHsgCisgICAgZmNMUS0+Y29uc3VtZXIrKzsKKyAgfQorCisgIFBDSV9UUkFDRU8oIGZjTFEtPlFpdGVtW1Fjb25zdW1lck5keF0uVHlwZSwgMHg5NCkKKworICBMRUFWRSgiV29ya1Rhc2siKTsKKyAgcmV0dXJuOworfQorCisKKworCisvLyBXaGVuIFRhY2h5b24gcmVwb3J0cyBsaW5rIGRvd24sIGJhZCBhbF9wYSwgb3IgTGluayBTZXJ2aWNlIChlLmcuIExvZ2luKQorLy8gY29tbWFuZHMgY29tZSBpbiwgcG9zdCB0byB0aGUgTGlua1Egc28gdGhhdCBhY3Rpb24gY2FuIGJlIHRha2VuIG91dHNpZGUgdGhlCisvLyBpbnRlcnJ1cHQgaGFuZGxlci4gIAorLy8gVGhpcyBjaXJjdWxhciBRIHdvcmtzIGxpa2UgVGFjaHlvbidzIHF1ZSAtIHRoZSBwcm9kdWNlciBwb2ludHMgdG8gdGhlIG5leHQKKy8vICh1bnVzZWQpIGVudHJ5LiAgQ2FsbGVkIGJ5IEludGVycnVwdCBoYW5kbGVyLCBXb3JrZXJUaHJlYWQsIFRpbWVyCisvLyBzcHV0bGlua3EKK3ZvaWQgY3BxZmNUU1B1dExpbmtRdWUoIENQUUZDSEJBICpjcHFmY0hCQWRhdGEsCisgIGludCBUeXBlLCAKKyAgdm9pZCAqUXVlQ29udGVudCkKK3sKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworLy8gIEZDX0VYQ0hBTkdFUyAqRXhjaGFuZ2VzID0gZmNDaGlwLT5FeGNoYW5nZXM7CisgIFBGQ19MSU5LX1FVRSBmY0xRID0gY3BxZmNIQkFkYXRhLT5mY0xROworICBVTE9ORyBuZHg7CisgIAorICBFTlRFUigiY3BxZmNUU1B1dExpbmtRIik7CisKKyAgbmR4ID0gZmNMUS0+cHJvZHVjZXI7CisgIAorICBuZHggKz0gMTsgIC8vIHRlc3QgZm9yIFF1ZSBmdWxsCisKKworICAKKyAgaWYoIG5keCA+PSBGQ19MSU5LUV9ERVBUSCApIC8vIHJvbGxvdmVyIHRlc3QKKyAgICBuZHggPSAwOworCisgIGlmKCBuZHggPT0gZmNMUS0+Y29uc3VtZXIgKSAgIC8vIFFVRSBmdWxsIHRlc3QKKyAgeworICAgICAgICAgICAgICAgICAgICAgICAvLyBRVUUgd2FzIGZ1bGwhIGxvc3QgTEsgY29tbWFuZCAoZmF0YWwgdG8gbG9naWMpCisgICAgZmNDaGlwLT5mY1N0YXRzLmxua1F1ZUZ1bGwrKzsKKworICAgIHByaW50aygiKkxpbmtRIEZ1bGwhKiIpOworICAgIFRyaWdnZXJIQkEoIGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSwgMSk7CisvKgorICAgIHsKKyAgICAgIGludCBpOworICAgICAgcHJpbnRrKCJMaW5rUSBQSSAlZCwgQ0kgJWRcbiIsIGZjTFEtPnByb2R1Y2VyLAorICAgICAgICBmY0xRLT5jb25zdW1lcik7CisJCSAgICAgIAorICAgICAgZm9yKCBpPTA7IGk8IEZDX0xJTktRX0RFUFRIOyApCisgICAgICB7CisJcHJpbnRrKCIgWyVkXSVYaCAiLCBpLCBmY0xRLT5RaXRlbVtpXS5UeXBlKTsKKwlpZiggKCsraSAlOCkgPT0gMCkgcHJpbnRrKCJcbiIpOworICAgICAgfQorICAKKyAgICB9CisqLyAgICAKKyAgICBwcmludGsoICJjcHFmY1RTOiBXQVJOSU5HISEgUHV0TGlua1F1ZSAtIEZVTEwhXG4iKTsgLy8gd2UncmUgaHVuZworICB9CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAvLyBRVUUgbmV4dCBlbGVtZW50CisgIHsKKyAgICAvLyBQcmV2ZW50IGNlcnRhaW4gbXVsdGlwbGUgKGJhY2stdG8tYmFjaykgcmVxdWVzdHMuCisgICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgaW4gdGhhdCB3ZSBkb24ndCB3YW50IHRvIGlzc3VlIG11bHRpcGxlCisgICAgLy8gQUJUUyBmb3IgdGhlIHNhbWUgRXhjaGFuZ2UsIG9yIGRvIG11bHRpcGxlIEZNIGluaXRzLCBldGMuCisgICAgLy8gV2UgY2FuIG5ldmVyIGJlIHN1cmUgb2YgdGhlIHRpbWluZyBvZiBldmVudHMgcmVwb3J0ZWQgdG8KKyAgICAvLyB1cyBieSBUYWNoJ3MgSU1RLCB3aGljaCBjYW4gZGVwZW5kIG9uIHN5c3RlbS9idXMgc3BlZWRzLAorICAgIC8vIEZDIHBoeXNpY2FsIGxpbmsgY2lyY3Vtc3RhbmNlcywgZXRjLgorICAgICAKKyAgICBpZiggKGZjTFEtPnByb2R1Y2VyICE9IGZjTFEtPmNvbnN1bWVyKQorCSAgICAmJiAKKyAgICAgICAgKFR5cGUgPT0gRk1JTklUKSAgKQorICAgIHsKKyAgICAgIExPTkcgbGFzdE5keDsgIC8vIGNvbXB1dGUgcHJldmlvdXMgcHJvZHVjZXIgaW5kZXgKKyAgICAgIGlmKCBmY0xRLT5wcm9kdWNlcikKKyAgICAgICAgbGFzdE5keCA9IGZjTFEtPnByb2R1Y2VyLSAxOworICAgICAgZWxzZQorCWxhc3ROZHggPSBGQ19MSU5LUV9ERVBUSC0xOworCisKKyAgICAgIGlmKCBmY0xRLT5RaXRlbVtsYXN0TmR4XS5UeXBlID09IEZNSU5JVCkKKyAgICAgIHsKKy8vICAgICAgICBwcmludGsoIiAqc2tpcCBGTUlOSVQgUSBwb3N0KiAiKTsKKy8vICAgICAgICBnb3RvIERvbmVXaXRoUHV0UTsKKyAgICAgIH0KKworICAgIH0KKworICAgIC8vIE9LLCBhZGQgdGhlIFEnZCBpdGVtLi4uCisgICAgCisgICAgZmNMUS0+UWl0ZW1bZmNMUS0+cHJvZHVjZXJdLlR5cGUgPSBUeXBlOworICAgCisgICAgbWVtY3B5KAorICAgICAgICBmY0xRLT5RaXRlbVtmY0xRLT5wcm9kdWNlcl0udWxCdWZmLAorICAgICAgICBRdWVDb250ZW50LCAKKyAgICAgICAgc2l6ZW9mKGZjTFEtPlFpdGVtW2ZjTFEtPnByb2R1Y2VyXS51bEJ1ZmYpKTsKKworICAgIGZjTFEtPnByb2R1Y2VyID0gbmR4OyAgLy8gaW5jcmVtZW50IFF1ZSBwcm9kdWNlcgorCisgICAgLy8gc2V0IHNlbWFwaG9yZSB0byB3YWtlIHVwIEtlcm5lbCAod29ya2VyKSB0aHJlYWQKKyAgICAvLyAKKyAgICB1cCggY3BxZmNIQkFkYXRhLT5mY1F1ZVJlYWR5ICk7CisgIH0KKworLy9Eb25lV2l0aFB1dFE6CisKKyAgTEVBVkUoImNwcWZjVFNQdXRMaW5rUSIpOworfQorCisKKworCisvLyByZXNldCBkZXZpY2UgZXh0IEZDIGxpbmsgUQordm9pZCBjcHFmY1RTTGlua1FSZXNldCggQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSkKKyAgIAoreworICBQRkNfTElOS19RVUUgZmNMUSA9IGNwcWZjSEJBZGF0YS0+ZmNMUTsKKyAgZmNMUS0+cHJvZHVjZXIgPSAwOworICBmY0xRLT5jb25zdW1lciA9IDA7CisKK30KKworCisKKworCisvLyBXaGVuIFRhY2h5b24gZ2V0cyBhbiB1bmFzc2lzdGVkIEZDUC1TQ1NJIGZyYW1lLCBwb3N0IGhlcmUgc28KKy8vIGFuIGFyYml0cmFyeSBjb250ZXh0IHRocmVhZCAoZS5nLiBJT0NUTCBsb29wYmFjayB0ZXN0IGZ1bmN0aW9uKQorLy8gY2FuIHByb2Nlc3MgaXQuCisKKy8vIChOT1RFOiBOb3QgcmV2aXNlZCBmb3IgTGludXgpCisvLyBUaGlzIFEgd29ya3MgbGlrZSBUYWNoeW9uJ3MgcXVlIC0gdGhlIHByb2R1Y2VyIHBvaW50cyB0byB0aGUgbmV4dAorLy8gKHVudXNlZCkgZW50cnkuCit2b2lkIGNwcWZjVFNQdXRTY3NpUXVlKCBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhLAorICBpbnQgVHlwZSwgCisgIHZvaWQgKlF1ZUNvbnRlbnQpCit7CisvLyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSA9IChDUFFGQ0hCQSAqKUhvc3RBZGFwdGVyLT5ob3N0ZGF0YTsKKy8vICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisKKy8vICBVTE9ORyBuZHg7CisKKy8vICBVTE9ORyAqcEV4Y2hhbmdlSUQ7CisvLyAgTE9ORyBFeGNoYW5nZUlEOworCisvKgorICBLZUFjcXVpcmVTcGluTG9ja0F0RHBjTGV2ZWwoICZwRGV2RXh0LT5mY1Njc2lRdWVMb2NrKTsKKyAgbmR4ID0gcERldkV4dC0+ZmNTY3NpUXVlLnByb2R1Y2VyICsgMTsgIC8vIHRlc3QgZm9yIFF1ZSBmdWxsCisKKyAgaWYoIG5keCA+PSBGQ19TQ1NJUV9ERVBUSCApIC8vIHJvbGxvdmVyIHRlc3QKKyAgICBuZHggPSAwOworCisgIGlmKCBuZHggPT0gcERldkV4dC0+ZmNTY3NpUXVlLmNvbnN1bWVyICkgICAvLyBRVUUgZnVsbCB0ZXN0CisgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gUVVFIHdhcyBmdWxsISBsb3N0IExLIGNvbW1hbmQgKGZhdGFsIHRvIGxvZ2ljKQorICAgIGZjQ2hpcC0+ZmNTdGF0cy5TY3NpUXVlRnVsbCsrOworI2lmZGVmIERCRworICAgIHByaW50ayggImZjUHV0U2NzaVF1ZSAtIEZVTEwhXG4iKTsKKyNlbmRpZgorCisgIH0KKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFFVRSBuZXh0IGVsZW1lbnQKKyAgeworICAgIHBEZXZFeHQtPmZjU2NzaVF1ZS5RaXRlbVtwRGV2RXh0LT5mY1Njc2lRdWUucHJvZHVjZXJdLlR5cGUgPSBUeXBlOworICAgIAorICAgIGlmKCBUeXBlID09IEZDUF9SU1AgKQorICAgIHsKKyAgICAgIC8vIHRoaXMgVEwgaW5ib3VuZCBtZXNzYWdlIHR5cGUgbWVhbnMgdGhhdCBhIFRMIFNFU1QgZXhjaGFuZ2UgaGFzCisgICAgICAvLyBjb3BpZWQgYW4gRkNQIHJlc3BvbnNlIGZyYW1lIGludG8gYSBidWZmZXIgcG9pbnRlZCB0byBieSB0aGUgU0VTVAorICAgICAgLy8gZW50cnkuICBUaGF0IGJ1ZmZlciBpcyBhbGxvY2F0ZWQgaW4gdGhlIFNFU1Qgc3RydWN0dXJlIGF0IC0+UnNwSERSLgorICAgICAgLy8gQ29weSB0aGUgUnNwSERSIGZvciB1c2UgYnkgdGhlIFF1ZSBoYW5kbGVyLgorICAgICAgcEV4Y2hhbmdlSUQgPSAoVUxPTkcgKilRdWVDb250ZW50OworICAgICAgCisgICAgICBtZW1jcHkoCisJICAgICAgcERldkV4dC0+ZmNTY3NpUXVlLlFpdGVtW3BEZXZFeHQtPmZjU2NzaVF1ZS5wcm9kdWNlcl0udWxCdWZmLAorICAgICAgICAmZmNDaGlwLT5TRVNULT5Sc3BIRFJbICpwRXhjaGFuZ2VJRCBdLAorCSAgICAgIHNpemVvZihwRGV2RXh0LT5mY1Njc2lRdWUuUWl0ZW1bMF0udWxCdWZmKSk7IC8vIChhbnkgZWxlbWVudCBmb3Igc2l6ZSkKKyAgICAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgbWVtY3B5KAorCSAgICAgIHBEZXZFeHQtPmZjU2NzaVF1ZS5RaXRlbVtwRGV2RXh0LT5mY1Njc2lRdWUucHJvZHVjZXJdLnVsQnVmZiwKKyAgICAgICAgUXVlQ29udGVudCwgCisJICAgICAgc2l6ZW9mKHBEZXZFeHQtPmZjU2NzaVF1ZS5RaXRlbVtwRGV2RXh0LT5mY1Njc2lRdWUucHJvZHVjZXJdLnVsQnVmZikpOworICAgIH0KKyAgICAgIAorICAgIHBEZXZFeHQtPmZjU2NzaVF1ZS5wcm9kdWNlciA9IG5keDsgIC8vIGluY3JlbWVudCBRdWUKKworCisgICAgS2VTZXRFdmVudCggJnBEZXZFeHQtPlRZSUJzY3NpLCAgLy8gc2lnbmFsIGFueSB3YWl0aW5nIHRocmVhZAorICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAvLyBubyBwcmlvcml0eSBib29zdAorCQkgICBGQUxTRSApOyAgICAgICAgICAgICAgLy8gbm8gd2FpdGluZyBsYXRlciBmb3IgdGhpcyBldmVudAorICB9CisgIEtlUmVsZWFzZVNwaW5Mb2NrRnJvbURwY0xldmVsKCAmcERldkV4dC0+ZmNTY3NpUXVlTG9jayk7CisqLworfQorCisKKworCisKKworCitzdGF0aWMgdm9pZCBQcm9jZXNzRUxTX1JlcXVlc3QoIENQUUZDSEJBKixUYWNoRkNIRFJfR0NNTkQqKTsKKworc3RhdGljIHZvaWQgUHJvY2Vzc0VMU19SZXBseSggQ1BRRkNIQkEqLFRhY2hGQ0hEUl9HQ01ORCopOworCitzdGF0aWMgdm9pZCBQcm9jZXNzRkNTX1JlcGx5KCBDUFFGQ0hCQSosVGFjaEZDSERSX0dDTU5EKik7CisKK3ZvaWQgY3BxZmNUU0ltcGxpY2l0TG9nb3V0KCBDUFFGQ0hCQSogY3BxZmNIQkFkYXRhLAorCQlQRkNfTE9HR0VESU5fUE9SVCBwRmNQb3J0KQoreworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisKKyAgaWYoIHBGY1BvcnQtPnBvcnRfaWQgIT0gMHhGRkZDMDEgKSAvLyBkb24ndCBjYXJlIGFib3V0IEZhYnJpYworICB7CisgICAgZmNDaGlwLT5mY1N0YXRzLmxvZ291dHMrKzsKKyAgICBwcmludGsoImNwcWZjVFM6IEltcGxpY2l0IGxvZ291dCBvZiBXV04gJTA4WCUwOFgsIHBvcnRfaWQgJTA2WFxuIiwgCisgICAgICAgIChVTE9ORylwRmNQb3J0LT51LmxpV1dOLAorICAgICAgICAoVUxPTkcpKHBGY1BvcnQtPnUubGlXV04gPj4zMiksCisJcEZjUG9ydC0+cG9ydF9pZCk7CisKKyAgLy8gVGVybWluYXRlIEkvTyB3aXRoIHRoaXMgKExpbnV4KSBTY3NpIHRhcmdldAorICAgIGNwcWZjVFNUZXJtaW5hdGVFeGNoYW5nZSggY3BxZmNIQkFkYXRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEZjUG9ydC0+U2NzaU5leHVzLAorCSAgICAgICAgICAgICAgICAgICAgREVWSUNFX1JFTU9WRUQpOworICB9CisJCQkKKyAgLy8gRG8gYW4gImltcGxpY2l0IGxvZ291dCIgLSB3ZSBjYW4ndCByZWFsbHkgTG9nb3V0IHRoZSBkZXZpY2UKKyAgLy8gKGkuZS4gd2l0aCBMT0dPdXQgUmVxdWVzdCkgYmVjYXVzZSBvZiBwb3J0X2lkIGNvbmZ1c2lvbgorICAvLyAoaS5lLiB0aGUgT3RoZXIgcG9ydCBoYXMgbm8gcG9ydF9pZCkuCisgIC8vIEEgbmV3IGxvZ2luIGZvciB0aGF0IFdXTiB3aWxsIGhhdmUgdG8gcmUtd3JpdGUgcG9ydF9pZCAoMCBpbnZhbGlkKQorICBwRmNQb3J0LT5wb3J0X2lkID0gMDsgIC8vIGludmFsaWQhCisgIHBGY1BvcnQtPnBkaXNjID0gRkFMU0U7CisgIHBGY1BvcnQtPnBybGkgPSBGQUxTRTsKKyAgcEZjUG9ydC0+cGxvZ2kgPSBGQUxTRTsKKyAgcEZjUG9ydC0+ZmxvZ2kgPSBGQUxTRTsKKyAgcEZjUG9ydC0+TE9HT190aW1lciA9IDA7CisgIHBGY1BvcnQtPmRldmljZV9ibG9ja2VkID0gVFJVRTsgLy8gYmxvY2sgU2NzaSBSZXF1ZXN0cworICBwRmNQb3J0LT5TY3NpTmV4dXMuVm9sdW1lU2V0QWRkcmVzc2luZz0wOwkKK30KKworICAKKy8vIE9uIEZDLUFMLCB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IGEgcHJldmlvdXNseSBrbm93biBkZXZpY2UgY2FuCisvLyBiZSBxdWlldGx5IHJlbW92ZWQgKGUuZy4gd2l0aCBub24tbWFuYWdlZCBodWIpLCAKKy8vIHdoaWxlIGEgTkVXIGRldmljZSAod2l0aCBkaWZmZXJlbnQgV1dOKSB0b29rIHRoZSBzYW1lIGFscGEgb3IKKy8vIGV2ZW4gMjQtYml0IHBvcnRfaWQuICBUaGlzIGNoYW5jZSBpcyB1bmxpa2VseSBidXQgd2UgbXVzdCBhbHdheXMKKy8vIGNoZWNrIGZvciBpdC4KK3N0YXRpYyB2b2lkIFRlc3REdXBsaWNhdGVQb3J0SWQoIENQUUZDSEJBKiBjcHFmY0hCQWRhdGEsCisJCVBGQ19MT0dHRURJTl9QT1JUIHBMb2dnZWRJblBvcnQpCit7CisgIFBUQUNIWU9OIGZjQ2hpcCA9ICZjcHFmY0hCQWRhdGEtPmZjQ2hpcDsKKyAgLy8gc2V0ICJvdGhlciBwb3J0IiBhdCBiZWdpbm5pbmcgb2YgZmNQb3J0cyBsaXN0CisgIFBGQ19MT0dHRURJTl9QT1JUIHBPdGhlclBvcnRXaXRoUG9ydElkID0gZmNDaGlwLT5mY1BvcnRzLnBOZXh0UG9ydDsKKyAgd2hpbGUoIHBPdGhlclBvcnRXaXRoUG9ydElkICkgCisgIHsKKyAgICBpZiggKHBPdGhlclBvcnRXaXRoUG9ydElkLT5wb3J0X2lkID09IAorICAgICAgICAgcExvZ2dlZEluUG9ydC0+cG9ydF9pZCkgCisJCSAgICAmJgorICAgICAgICAgKHBPdGhlclBvcnRXaXRoUG9ydElkICE9IHBMb2dnZWRJblBvcnQpICkKKyAgICB7CisgICAgICAvLyB0cm91YmxlISAgKEltcGxpY2l0bHkpIExvZyB0aGUgb3RoZXIgZ3V5IG91dAorICAgICAgcHJpbnRrKCIgKnBvcnRfaWQgJVhoIGlzIGR1cGxpY2F0ZWQhKiAiLCAKKyAgICAgICAgcE90aGVyUG9ydFdpdGhQb3J0SWQtPnBvcnRfaWQpOworICAgICAgY3BxZmNUU0ltcGxpY2l0TG9nb3V0KCBjcHFmY0hCQWRhdGEsIHBPdGhlclBvcnRXaXRoUG9ydElkKTsgCisgICB9CisgICAgcE90aGVyUG9ydFdpdGhQb3J0SWQgPSBwT3RoZXJQb3J0V2l0aFBvcnRJZC0+cE5leHRQb3J0OworICB9Cit9CisKKworCisKKworCisvLyBEeW5hbWljIE1lbW9yeSBBbGxvY2F0aW9uIGZvciBuZXdseSBkaXNjb3ZlcmVkIEZDIFBvcnRzLgorLy8gRm9yIHNpbXBsaWNpdHksIG1haW50YWluIGZjUG9ydHMgc3RydWN0cyBmb3IgQUxMCisvLyBmb3IgZGlzY292ZXJlZCBkZXZpY2VzLCBpbmNsdWRpbmcgdGhvc2Ugd2UgbmV2ZXIgZG8gSS9PIHdpdGgKKy8vIChlLmcuIEZhYnJpYyBhZGRyZXNzZXMpCisKK3N0YXRpYyBQRkNfTE9HR0VESU5fUE9SVCBDcmVhdGVGY1BvcnQoIAorCSAgQ1BRRkNIQkEqIGNwcWZjSEJBZGF0YSwgCisJICBQRkNfTE9HR0VESU5fUE9SVCBwTGFzdExvZ2dlZEluUG9ydCwgCisJICBUYWNoRkNIRFJfR0NNTkQqIGZjaHMsCisJICBMT0dJTl9QQVlMT0FEKiBwbG9naSkKK3sKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworICBQRkNfTE9HR0VESU5fUE9SVCBwTmV4dExvZ2dlZEluUG9ydCA9IE5VTEw7CisgIGludCBpOworCisKKyAgcHJpbnRrKCJjcHFmY1RTOiBOZXcgRkMgcG9ydCAlMDZYaCBXV046ICIsIGZjaHMtPnNfaWQpOworICBmb3IoIGk9MzsgaT49MDsgaS0tKSAgIC8vIGNvcHkgdGhlIExPR0lOIHBvcnQncyBXV04KKyAgICBwcmludGsoIiUwMlgiLCBwbG9naS0+cG9ydF9uYW1lW2ldKTsKKyAgZm9yKCBpPTc7IGk+MzsgaS0tKSAgIC8vIGNvcHkgdGhlIExPR0lOIHBvcnQncyBXV04KKyAgICBwcmludGsoIiUwMlgiLCBwbG9naS0+cG9ydF9uYW1lW2ldKTsKKworCisgIC8vIGFsbG9jYXRlIG1lbSBmb3IgbmV3IHBvcnQKKyAgLy8gKHRoZXNlIGFyZSBzbWFsbCBhbmQgcmFyZSBhbGxvY2F0aW9ucy4uLikKKyAgcE5leHRMb2dnZWRJblBvcnQgPSBrbWFsbG9jKCBzaXplb2YoIEZDX0xPR0dFRElOX1BPUlQpLCBHRlBfQVRPTUlDICk7CisKKyAgICAKKyAgLy8gYWxsb2NhdGlvbiBzdWNjZWVkZWQ/ICBGaWxsIG91dCBORVcgUE9SVAorICBpZiggcE5leHRMb2dnZWRJblBvcnQgKQorICB7ICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGFueSBnYXJiYWdlIChzb21ldGltZXMgZXhpc3RzKQorICAgIG1lbXNldCggcE5leHRMb2dnZWRJblBvcnQsIDAsIHNpemVvZiggRkNfTE9HR0VESU5fUE9SVCkpOworCisKKyAgICAvLyBJZiB3ZSBsb2dpbiB0byBhIEZhYnJpYywgd2UgZG9uJ3Qgd2FudCB0byB0cmVhdCBpdAorICAgIC8vIGFzIGEgU0NTSSBkZXZpY2UuLi4KKyAgICBpZiggKGZjaHMtPnNfaWQgJiAweEZGRjAwMCkgIT0gMHhGRkYwMDApCisgICAgeworICAgICAgaW50IGk7CisgICAgICAKKyAgICAgIC8vIGNyZWF0ZSBhIHVuaXF1ZSAidmlydHVhbCIgU0NTSSBOZXh1cyAoZm9yIG5vdywganVzdCBhCisgICAgICAvLyBuZXcgdGFyZ2V0IElEKSAtLSB3ZSB3aWxsIHVwZGF0ZSBjaGFubmVsL3RhcmdldCBvbiBSRVBPUlRfTFVOUworICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB2ZXJ5IGZpcnN0IFNDU0kgdGFyZ2V0Li4uCisgICAgICBpZiggY3BxZmNIQkFkYXRhLT5Ib3N0QWRhcHRlci0+bWF4X2lkID09IDApCisgICAgICB7CisgICAgICAgIHBOZXh0TG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMudGFyZ2V0ID0gMDsKKyAgICAgICAgZmNDaGlwLT5mY1BvcnRzLlNjc2lOZXh1cy50YXJnZXQgPSAtMTsgLy8gZG9uJ3QgdXNlICJzdHViIgorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwTmV4dExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLnRhcmdldCA9CisgICAgICAgICAgY3BxZmNIQkFkYXRhLT5Ib3N0QWRhcHRlci0+bWF4X2lkOworICAgICAgfQorCisgICAgICAvLyBpbml0aWFsaXplIHRoZSBsdW5bXSBOZXh1cyBzdHJ1Y3QgZm9yIGx1biBtYXNraW5nICAgICAgCisgICAgICBmb3IoIGk9MDsgaTwgQ1BRRkNUU19NQVhfTFVOOyBpKyspCisgICAgICAgIHBOZXh0TG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMubHVuW2ldID0gMHhGRjsgLy8gaW5pdCB0byBOT1QgVVNFRAorICAgICAgCisgICAgICBwTmV4dExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLmNoYW5uZWwgPSAwOyAvLyBjcHFmY1RTIGhhcyAxIEZDIHBvcnQKKyAgICAgIAorICAgICAgcHJpbnRrKCIgU0NTSSBDaGFuL1RyZ3QgJWQvJWQiLCAKKyAgICAgICAgICBwTmV4dExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLmNoYW5uZWwsCisgICAgICAgICAgcE5leHRMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy50YXJnZXQpOworIAorICAgICAgLy8gdGVsbCBTY3NpIGxheWVycyBhYm91dCB0aGUgbmV3IHRhcmdldC4uLgorICAgICAgY3BxZmNIQkFkYXRhLT5Ib3N0QWRhcHRlci0+bWF4X2lkKys7IAorLy8gICAgcHJpbnRrKCJIb3N0QWRhcHRlci0+bWF4X2lkID0gJWRcbiIsCisvLyAgICAgIGNwcWZjSEJBZGF0YS0+SG9zdEFkYXB0ZXItPm1heF9pZCk7CQkgICAgCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIGRldmljZSBpcyBOT1QgU0NTSSAoaW4gY2FzZSBvZiBGYWJyaWMpCisgICAgICBwTmV4dExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLnRhcmdldCA9IC0xOyAgLy8gaW52YWxpZAorICAgIH0KKworCSAgLy8gY3JlYXRlIGZvcndhcmQgbGluayB0byBuZXcgcG9ydAorICAgIHBMYXN0TG9nZ2VkSW5Qb3J0LT5wTmV4dFBvcnQgPSBwTmV4dExvZ2dlZEluUG9ydDsKKyAgICBwcmludGsoIlxuIik7CisKKyAgfSAgICAgCisgIHJldHVybiBwTmV4dExvZ2dlZEluUG9ydDsgIC8vIE5VTEwgb24gYWxsb2NhdGlvbiBmYWlsdXJlCit9ICAgLy8gZW5kIE5FVyBQT1JUIChXV04pIGxvZ2ljCisKKworCisvLyBGb3IgY2VydGFpbiBjYXNlcywgd2Ugd2FudCB0byB0ZXJtaW5hdGUgZXhjaGFuZ2VzIHdpdGhvdXQKKy8vIHNlbmRpbmcgQUJUUyB0byB0aGUgZGV2aWNlLiAgRXhhbXBsZXMgaW5jbHVkZSB3aGVuIGFuIEZDCisvLyBkZXZpY2UgY2hhbmdlZCBpdCdzIHBvcnRfaWQgYWZ0ZXIgTG9vcCByZS1pbml0LCBvciB3aGVuCisvLyB0aGUgZGV2aWNlIHNlbnQgdXMgYSBsb2dvdXQuICBJbiB0aGUgY2FzZSBvZiBjaGFuZ2VkIHBvcnRfaWQsCisvLyB3ZSB3YW50IHRvIGNvbXBsZXRlIHRoZSBjb21tYW5kIGFuZCByZXR1cm4gU09GVF9FUlJPUiB0bworLy8gZm9yY2UgYSByZS10cnkuICBJbiB0aGUgY2FzZSBvZiBMT0dPdXQsIHdlIG1pZ2h0IHJldHVybgorLy8gQkFEX1RBUkdFVCBpZiB0aGUgZGV2aWNlIGlzIHJlYWxseSBnb25lLgorLy8gU2luY2Ugd2UgbXVzdCBlbnN1cmUgdGhhdCBUYWNoeW9uIGlzIG5vdCBvcGVyYXRpbmcgb24gdGhlCisvLyBleGNoYW5nZSwgd2UgaGF2ZSB0byBmcmVlemUgdGhlIGNoaXAKKy8vIHN0ZXJtaW5hdGVleAordm9pZCBjcHFmY1RTVGVybWluYXRlRXhjaGFuZ2UoIAorICBDUFFGQ0hCQSogY3BxZmNIQkFkYXRhLCBTQ1NJX05FWFVTICpTY3NpTmV4dXMsIGludCBUZXJtaW5hdGVTdGF0dXMpCit7CisgIFBUQUNIWU9OIGZjQ2hpcCA9ICZjcHFmY0hCQWRhdGEtPmZjQ2hpcDsKKyAgRkNfRVhDSEFOR0VTICpFeGNoYW5nZXMgPSBmY0NoaXAtPkV4Y2hhbmdlczsKKyAgVUxPTkcgeF9JRDsKKworICBpZiggU2NzaU5leHVzICkKKyAgeworLy8gICAgcHJpbnRrKCJUZXJtaW5hdGVFeGNoYW5nZTogU2NzaU5leHVzIGNoYW4vdGFyZ2V0ICVkLyVkXG4iLAorLy8JCSAgICBTY3NpTmV4dXMtPmNoYW5uZWwsIFNjc2lOZXh1cy0+dGFyZ2V0KTsKKworICB9IAorICAKKyAgZm9yKCB4X0lEID0gMDsgeF9JRCA8IFRBQ0hfU0VTVF9MRU47IHhfSUQrKykKKyAgeworICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0udHlwZSApICAvLyBpbiB1c2U/CisgICAgeworICAgICAgaWYoIFNjc2lOZXh1cyA9PSBOVUxMICkgLy8gb3VyIEhCQSBjaGFuZ2VkIC0gdGVybS4gYWxsCisgICAgICB7CisJRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW3hfSURdLnN0YXR1cyA9IFRlcm1pbmF0ZVN0YXR1czsKKyAgICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwgQkxTX0FCVFMsICZ4X0lEICk7IAorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworCS8vIElmIGEgZGV2aWNlLCBhY2NvcmRpbmcgdG8gV1dOLCBoYXMgYmVlbiByZW1vdmVkLCBpdCdzCisJLy8gcG9ydF9pZCBtYXkgYmUgdXNlZCBieSBhbm90aGVyIHdvcmtpbmcgZGV2aWNlLCBzbyB3ZQorCS8vIGhhdmUgdG8gdGVybWluYXRlIGJ5IFNDU0kgdGFyZ2V0LCBOT1QgcG9ydF9pZC4KKyAgICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVt4X0lEXS5DbW5kKSAvLyBDbW5kIGluIHByb2dyZXNzPworCXsJICAgICAgICAgICAgICAgICAKKwkgIGlmKCAoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW3hfSURdLkNtbmQtPmRldmljZS0+aWQgPT0gU2NzaU5leHVzLT50YXJnZXQpCisJCQkmJgorICAgICAgICAgICAgKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVt4X0lEXS5DbW5kLT5kZXZpY2UtPmNoYW5uZWwgPT0gU2NzaU5leHVzLT5jaGFubmVsKSkgCisgICAgICAgICAgeworICAgICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW3hfSURdLnN0YXR1cyA9IFRlcm1pbmF0ZVN0YXR1czsKKyAgICAgICAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsIEJMU19BQlRTLCAmeF9JRCApOyAvLyB0aW1lZC1vdXQKKyAgICAgICAgICB9CisJfQorCisJLy8gKGluIGNhc2Ugd2UgZXZlciBuZWVkIGl0Li4uKQorCS8vIGFsbCBTRVNUIHN0cnVjdHVyZXMgaGF2ZSBhIHJlbW90ZSBub2RlIElEIGF0IFNFU1QgRFdPUkQgMgorICAgICAgICAvLyAgICAgICAgICBpZiggKGZjQ2hpcC0+U0VTVC0+dVsgeF9JRCBdLlRXRS5SZW1vdGVfTm9kZV9JRCA+PiA4KQorICAgICAgICAvLyAgICAgICAgICAgICAgICA9PSAgcG9ydF9pZCkKKyAgICAgIH0gCisgICAgfQorICB9Cit9CisKKworc3RhdGljIHZvaWQgUHJvY2Vzc0VMU19SZXF1ZXN0KCAKKyAgICAgICAgICAgICAgQ1BRRkNIQkEqIGNwcWZjSEJBZGF0YSwgVGFjaEZDSERSX0dDTU5EKiBmY2hzKQoreworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisvLyAgRkNfRVhDSEFOR0VTICpFeGNoYW5nZXMgPSBmY0NoaXAtPkV4Y2hhbmdlczsKKy8vICBVTE9ORyBveF9pZCA9IChmY2hzLT5veF9yeF9pZCA+PjE2KTsKKyAgUEZDX0xPR0dFRElOX1BPUlQgcExvZ2dlZEluUG9ydD1OVUxMLCBwTGFzdExvZ2dlZEluUG9ydDsKKyAgQk9PTEVBTiBOZWVkUmVqZWN0ID0gRkFMU0U7CisgIFVMT05HIGxzX3JlamVjdF9jb2RlID0gMDsgLy8gZGVmYXVsdCBkb24nbiBrbm93Pz8KKworCisgIC8vIENoZWNrIHRoZSBpbmNvbWluZyBmcmFtZSBmb3IgYSBzdXBwb3J0ZWQgRUxTIHR5cGUKKyAgc3dpdGNoKCBmY2hzLT5wbFswXSAmIDB4RkZGRikKKyAgeworICBjYXNlIDB4MDA1MDogLy8gIFBESVNDPworCisgICAgLy8gUGF5bG9hZCBmb3IgUExPR0kgYW5kIFBESVNDIGlzIGlkZW50aWNhbCAocmVxdWVzdCAmIHJlcGx5KQorICAgIGlmKCAhdmVyaWZ5X1BMT0dJKCBmY0NoaXAsIGZjaHMsICZsc19yZWplY3RfY29kZSkgKSAvLyB2YWxpZCBwYXlsb2FkPworICAgIHsKKyAgICAgIExPR0lOX1BBWUxPQUQgbG9naTsgICAgICAgLy8gRkMtUEggUG9ydCBMb2dpbgorICAgICAgCisgICAgICAvLyBQRElTQyBwYXlsb2FkIE9LLiBJZiBjcml0aWNhbCBsb2dpbiBmaWVsZHMKKyAgICAgIC8vIChlLmcuIFdXTikgbWF0Y2hlcyBsYXN0IGxvZ2luIGZvciB0aGlzIHBvcnRfaWQsCisgICAgICAvLyB3ZSBtYXkgcmVzdW1lIGFueSBwcmlvciBleGNoYW5nZXMKKyAgICAgIC8vIHdpdGggdGhlIG90aGVyIHBvcnQKKworICAgICAgCisgICAgICBCaWdFbmRpYW5Td2FwKCAoVUNIQVIqKSZmY2hzLT5wbFswXSwgKFVDSEFSKikmbG9naSwgc2l6ZW9mKGxvZ2kpKTsKKyAgIAorICAgICAgcExvZ2dlZEluUG9ydCA9IGZjRmluZExvZ2dlZEluUG9ydCggCisgICAgICAgICAgICAgZmNDaGlwLCAKKwkgICAgIE5VTEwsICAgICAvLyBkb24ndCBzZWFyY2ggU2NzaSBOZXh1cworCSAgICAgMCwgICAgICAgIC8vIGRvbid0IHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgcG9ydF9pZAorICAgICAgICAgICAgICZsb2dpLnBvcnRfbmFtZVswXSwgICAgIC8vIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgV1dOCisgICAgICAgICAgICAgJnBMYXN0TG9nZ2VkSW5Qb3J0KTsgIC8vIG11c3QgcmV0dXJuIG5vbi1OVUxMOyB3aGVuIGEgcG9ydF9pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3QgZm91bmQsIHRoaXMgcG9pbnRlciBtYXJrcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIHRoZSBzaW5nbHkgbGlua2VkIGxpc3QKKyAgICAKKyAgICAgIGlmKCBwTG9nZ2VkSW5Qb3J0ICE9IE5VTEwpICAgLy8gV1dOIGZvdW5kIChwcmlvciBsb2dpbiBPSykKKyAgICAgIHsgCisgICAgICAgICAgIAorIAlpZiggKGZjaHMtPnNfaWQgJiAweEZGRkZGRikgPT0gcExvZ2dlZEluUG9ydC0+cG9ydF9pZCkKKwl7CisgICAgICAgICAgLy8gWWVzLiAgV2Ugd2VyZSBleHBlY3RpbmcgUERJU0M/CisgICAgICAgICAgaWYoIHBMb2dnZWRJblBvcnQtPnBkaXNjICkKKwkgIHsKKwkgICAgLy8gWWVzOyBzZXQgZmllbGRzIGFjY29yZGluZ2x5LiAgICAgKFBESVNDLCBub3QgT3JpZ2luYXRvcikKKyAgICAgICAgICAgIFNldExvZ2luRmllbGRzKCBwTG9nZ2VkSW5Qb3J0LCBmY2hzLCBUUlVFLCBGQUxTRSk7CisgICAgICAgCisgICAgICAgICAgICAvLyBzZW5kICdBQ0MnIHJlcGx5IAorICAgICAgICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU19QTE9HSV9BQ0MsIC8vIChQRElTQyBzYW1lIGFzIFBMT0dJIEFDQykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmNocyApOworCisJICAgIC8vIE9LIHRvIHJlc3VtZSBJL08uLi4KKwkgIH0KKwkgIGVsc2UKKyAJICB7CisJICAgIHByaW50aygiTm90IGV4cGVjdGluZyBQRElTQyAocGRpc2M9RkFMU0UpXG4iKTsKKwkgICAgTmVlZFJlamVjdCA9IFRSVUU7CisJICAgIC8vIHNldCByZWplY3QgcmVhc29uIGNvZGUgCisgICAgICAgICAgICBsc19yZWplY3RfY29kZSA9IAorICAgICAgICAgICAgICBMU19SSlRfUkVBU09OKCBQUk9UT0NPTF9FUlJPUiwgSU5JVElBVE9SX0NUTF9FUlJPUik7CisJICB9CisJfQorCWVsc2UKKwl7CisJICBpZiggcExvZ2dlZEluUG9ydC0+cG9ydF9pZCAhPSAwKQorCSAgeworICAJICAgIHByaW50aygiUERJU0MgUG9ydElEIGNoYW5nZTogb2xkICVYaCwgbmV3ICVYaFxuIiwKKyAgICAgICAgICAgICAgcExvZ2dlZEluUG9ydC0+cG9ydF9pZCwgZmNocy0+c19pZCAmMHhGRkZGRkYpOworCSAgfQorICAgICAgICAgIE5lZWRSZWplY3QgPSBUUlVFOworICAgICAgICAgIC8vIHNldCByZWplY3QgcmVhc29uIGNvZGUgCisgICAgICAgICAgbHNfcmVqZWN0X2NvZGUgPSAKKwkgICAgTFNfUkpUX1JFQVNPTiggUFJPVE9DT0xfRVJST1IsIElOSVRJQVRPUl9DVExfRVJST1IpOworCQkgIAorCX0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKwlwcmludGsoIlBESVNDIFJlcXVlc3QgZnJvbSB1bmtub3duIFdXTlxuIik7CisgICAgICAgIE5lZWRSZWplY3QgPSBUUlVFOworICAgICAgICAgIAorCS8vIHNldCByZWplY3QgcmVhc29uIGNvZGUgCisgICAgICAgIGxzX3JlamVjdF9jb2RlID0gCisgICAgICAgICAgTFNfUkpUX1JFQVNPTiggTE9HSUNBTF9FUlJPUiwgSU5WQUxJRF9QT1JUX05BTUUpOworICAgICAgfQorCisgICAgfQorICAgIGVsc2UgLy8gUGF5bG9hZCB1bmFjY2VwdGFibGUKKyAgICB7CisgICAgICBwcmludGsoInBheWxvYWQgdW5hY2NlcHRhYmxlXG4iKTsKKyAgICAgIE5lZWRSZWplY3QgPSBUUlVFOyAgLy8gcmVqZWN0IGNvZGUgYWxyZWFkeSBzZXQKKyAgICAgIAorICAgIH0KKworICAgIGlmKCBOZWVkUmVqZWN0KQorICAgIHsKKyAgICAgIFVMT05HIHBvcnRfaWQ7CisgICAgICAvLyBUaGUgUERJU0MgZmFpbGVkLiAgU2V0IGxvZ2luIHN0cnVjdCBmbGFncyBhY2NvcmRpbmdseSwKKyAgICAgIC8vIHRlcm1pbmF0ZSBhbnkgSS9PIHRvIHRoaXMgcG9ydCwgYW5kIFEgYSBQTE9HSQorICAgICAgaWYoIHBMb2dnZWRJblBvcnQgKQorICAgICAgeworICAgICAgICBwTG9nZ2VkSW5Qb3J0LT5wZGlzYyA9IEZBTFNFOworICAgICAgICBwTG9nZ2VkSW5Qb3J0LT5wcmxpID0gRkFMU0U7CisgICAgICAgIHBMb2dnZWRJblBvcnQtPnBsb2dpID0gRkFMU0U7CisJCisgICAgICAgIGNwcWZjVFNUZXJtaW5hdGVFeGNoYW5nZSggY3BxZmNIQkFkYXRhLCAKKyAgICAgICAgICAmcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLCBQT1JUSURfQ0hBTkdFRCk7CisJcG9ydF9pZCA9IHBMb2dnZWRJblBvcnQtPnBvcnRfaWQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisJcG9ydF9pZCA9IGZjaHMtPnNfaWQgJjB4RkZGRkZGOworICAgICAgfQorICAgICAgZmNocy0+cmVzZXJ2ZWQgPSBsc19yZWplY3RfY29kZTsgLy8gYm9ycm93IHRoaXMgKHVudXNlZCkgZmllbGQKKyAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsIEVMU19SSlQsIGZjaHMgKTsKKyAgICB9CisgICAKKyAgICBicmVhazsKKworCisKKyAgY2FzZSAweDAwMDM6IC8vICBQTE9HST8KKworICAgIC8vIFBheWxvYWQgZm9yIFBMT0dJIGFuZCBQRElTQyBpcyBpZGVudGljYWwgKHJlcXVlc3QgJiByZXBseSkKKyAgICBpZiggIXZlcmlmeV9QTE9HSSggZmNDaGlwLCBmY2hzLCAmbHNfcmVqZWN0X2NvZGUpICkgLy8gdmFsaWQgcGF5bG9hZD8KKyAgICB7CisgICAgICBMT0dJTl9QQVlMT0FEIGxvZ2k7ICAgICAgIC8vIEZDLVBIIFBvcnQgTG9naW4KKyAgICAgIEJPT0xFQU4gTmVlZFJlamVjdCA9IEZBTFNFOworICAgICAgCisgICAgICAvLyBQRElTQyBwYXlsb2FkIE9LLiBJZiBjcml0aWNhbCBsb2dpbiBmaWVsZHMKKyAgICAgIC8vIChlLmcuIFdXTikgbWF0Y2hlcyBsYXN0IGxvZ2luIGZvciB0aGlzIHBvcnRfaWQsCisgICAgICAvLyB3ZSBtYXkgcmVzdW1lIGFueSBwcmlvciBleGNoYW5nZXMKKyAgICAgIC8vIHdpdGggdGhlIG90aGVyIHBvcnQKKworICAgICAgCisgICAgICBCaWdFbmRpYW5Td2FwKCAoVUNIQVIqKSZmY2hzLT5wbFswXSwgKFVDSEFSKikmbG9naSwgc2l6ZW9mKGxvZ2kpKTsKKyAgIAorICAgICAgcExvZ2dlZEluUG9ydCA9IGZjRmluZExvZ2dlZEluUG9ydCggCisgICAgICAgICAgICAgZmNDaGlwLCAKKwkgICAgIE5VTEwsICAgICAgIC8vIGRvbid0IHNlYXJjaCBTY3NpIE5leHVzCisJICAgICAwLCAgICAgICAgLy8gZG9uJ3Qgc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBwb3J0X2lkCisgICAgICAgICAgICAgJmxvZ2kucG9ydF9uYW1lWzBdLCAgICAgLy8gc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBXV04KKyAgICAgICAgICAgICAmcExhc3RMb2dnZWRJblBvcnQpOyAgLy8gbXVzdCByZXR1cm4gbm9uLU5VTEw7IHdoZW4gYSBwb3J0X2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBmb3VuZCwgdGhpcyBwb2ludGVyIG1hcmtzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgdGhlIHNpbmdseSBsaW5rZWQgbGlzdAorICAgIAorICAgICAgaWYoIHBMb2dnZWRJblBvcnQgPT0gTlVMTCkgICAvLyBXV04gbm90IGZvdW5kIC1OZXcgUG9ydAorICAgICAgeyAKKyAgICAgIAlwTG9nZ2VkSW5Qb3J0ID0gQ3JlYXRlRmNQb3J0KCAKKwkJCSAgY3BxZmNIQkFkYXRhLCAKKwkJCSAgcExhc3RMb2dnZWRJblBvcnQsIAorCQkJICBmY2hzLAorCQkJICAmbG9naSk7CisgICAgICAgIGlmKCBwTG9nZ2VkSW5Qb3J0ID09IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRrKCIgY3BxZmNUUzogTmV3IHBvcnQgYWxsb2NhdGlvbiBmYWlsZWQgLSBsb3N0IEZDIGRldmljZSFcbiIpOworICAgICAgICAgIC8vIE5vdyBRIGEgTE9HT3V0IFJlcXVlc3QsIHNpbmNlIHdlIHdvbid0IGJlIHRhbGtpbmcgdG8gdGhhdCBkZXZpY2UKKwkKKyAgICAgICAgICBOZWVkUmVqZWN0ID0gVFJVRTsgIAorCSAgCisgICAgICAgICAgLy8gc2V0IHJlamVjdCByZWFzb24gY29kZSAKKyAgICAgICAgICBsc19yZWplY3RfY29kZSA9IAorICAgICAgICAgICAgTFNfUkpUX1JFQVNPTiggTE9HSUNBTF9FUlJPUiwgTk9fTE9HSU5fUkVTT1VSQ0VTKTsKKwkgICAgCisJfQorICAgICAgfQorICAgICAgaWYoICFOZWVkUmVqZWN0ICkKKyAgICAgIHsKKyAgICAgIAorICAgICAgICAvLyBPSyAtIHdlIGhhdmUgdmFsaWQgZmNQb3J0IHB0cjsgc2V0IGZpZWxkcyBhY2NvcmRpbmdseS4gICAKKwkvLyAgICAgICAgICAgICAgICAgICAgICAgICAobm90IFBESVNDLCBub3QgT3JpZ2luYXRvcikKKyAgICAgICAgU2V0TG9naW5GaWVsZHMoIHBMb2dnZWRJblBvcnQsIGZjaHMsIEZBTFNFLCBGQUxTRSk7IAorCisgICAgICAgIC8vIHNlbmQgJ0FDQycgcmVwbHkgCisgICAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsIAorICAgICAgICAgICAgICAgICAgICAgIEVMU19QTE9HSV9BQ0MsIC8vIChQRElTQyBzYW1lIGFzIFBMT0dJIEFDQykKKyAgICAgICAgICAgICAgICAgICAgICBmY2hzICk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgLy8gUGF5bG9hZCB1bmFjY2VwdGFibGUKKyAgICB7CisgICAgICBwcmludGsoInBheWxvYWQgdW5hY2NlcHRhYmxlXG4iKTsKKyAgICAgIE5lZWRSZWplY3QgPSBUUlVFOyAgLy8gcmVqZWN0IGNvZGUgYWxyZWFkeSBzZXQKKyAgICB9CisKKyAgICBpZiggTmVlZFJlamVjdCkKKyAgICB7CisgICAgICAvLyBUaGUgUERJU0MgZmFpbGVkLiAgU2V0IGxvZ2luIHN0cnVjdCBmbGFncyBhY2NvcmRpbmdseSwKKyAgICAgIC8vIHRlcm1pbmF0ZSBhbnkgSS9PIHRvIHRoaXMgcG9ydCwgYW5kIFEgYSBQTE9HSQorICAgICAgcExvZ2dlZEluUG9ydC0+cGRpc2MgPSBGQUxTRTsKKyAgICAgIHBMb2dnZWRJblBvcnQtPnBybGkgPSBGQUxTRTsKKyAgICAgIHBMb2dnZWRJblBvcnQtPnBsb2dpID0gRkFMU0U7CisJCisgICAgICBmY2hzLT5yZXNlcnZlZCA9IGxzX3JlamVjdF9jb2RlOyAvLyBib3Jyb3cgdGhpcyAodW51c2VkKSBmaWVsZAorCisgICAgICAvLyBzZW5kICdSSlQnIHJlcGx5IAorICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwgRUxTX1JKVCwgZmNocyApOworICAgIH0KKyAgIAorICAgIC8vIHRlcm1pbmF0ZSBhbnkgZXhjaGFuZ2VzIHdpdGggdGhpcyBkZXZpY2UuLi4KKyAgICBpZiggcExvZ2dlZEluUG9ydCApCisgICAgeworICAgICAgY3BxZmNUU1Rlcm1pbmF0ZUV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEsIAorICAgICAgICAmcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLCBQT1JUSURfQ0hBTkdFRCk7CisgICAgfQorICAgIGJyZWFrOworCisKKworICBjYXNlIDB4MTAyMDogIC8vIFBSTEk/CisgIHsKKyAgICBCT09MRUFOIE5lZWRSZWplY3QgPSBUUlVFOworICAgIHBMb2dnZWRJblBvcnQgPSBmY0ZpbmRMb2dnZWRJblBvcnQoIAorICAgICAgICAgICBmY0NoaXAsIAorICAgICAgICAgICBOVUxMLCAgICAgICAvLyBkb24ndCBzZWFyY2ggU2NzaSBOZXh1cworCSAgIChmY2hzLT5zX2lkICYgMHhGRkZGRkYpLCAgLy8gc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBwb3J0X2lkCisgICAgICAgICAgIE5VTEwsICAgICAvLyBET04nVCBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIFdXTgorICAgICAgICAgICBOVUxMKTsgICAgLy8gZG9uJ3QgY2FyZQorICAgICAgCisgICAgaWYoIHBMb2dnZWRJblBvcnQgPT0gTlVMTCApIAorICAgIHsKKyAgICAgIC8vIGh1aD8KKyAgICAgIHByaW50aygiIFVuZXhwZWN0ZWQgUFJMSSBSZXF1ZXN0IC1ub3QgbG9nZ2VkIGluIVxuIik7CisKKyAgICAgIC8vIHNldCByZWplY3QgcmVhc29uIGNvZGUgCisgICAgICBsc19yZWplY3RfY29kZSA9IExTX1JKVF9SRUFTT04oIFBST1RPQ09MX0VSUk9SLCBJTklUSUFUT1JfQ1RMX0VSUk9SKTsKKyAgICAgIAorICAgICAgLy8gUSBhIExPR091dCBoZXJlPworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLy8gdmVyaWZ5IHRoZSBQUkxJIEFDQyBwYXlsb2FkCisgICAgICBpZiggIXZlcmlmeV9QUkxJKCBmY2hzLCAmbHNfcmVqZWN0X2NvZGUpICkKKyAgICAgIHsKKyAgICAgICAgLy8gUFJMSSBSZXBseSBpcyBhY2NlcHRhYmxlOyB3ZXJlIHdlIGV4cGVjdGluZyBpdD8KKyAgICAgICAgaWYoIHBMb2dnZWRJblBvcnQtPnBsb2dpICkgCisgICAgICAgIHsgCisgIAkgIC8vIHllcywgd2UgZXhwZWN0ZWQgdGhlIFBSTEkgQUNDICAobm90IFBESVNDOyBub3QgT3JpZ2luYXRvcikKKyAgICAgICAgICBTZXRMb2dpbkZpZWxkcyggcExvZ2dlZEluUG9ydCwgZmNocywgRkFMU0UsIEZBTFNFKTsKKworICAgICAgICAgIC8vIFEgYW4gQUNDZXB0IFJlcGx5CisJICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgRUxTX1BSTElfQUNDLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjaHMgKTsgICAKKwkgIAorCSAgTmVlZFJlamVjdCA9IEZBTFNFOworCX0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLy8gaHVoPworICAgICAgICAgIHByaW50aygiICh1bmV4cGVjdGVkKSBQUkxJIFJFUUVTVCB3aXRoIHBsb2dpIEZBTFNFXG4iKTsKKworICAgICAgICAgIC8vIHNldCByZWplY3QgcmVhc29uIGNvZGUgCisgICAgICAgICAgbHNfcmVqZWN0X2NvZGUgPSBMU19SSlRfUkVBU09OKCBQUk9UT0NPTF9FUlJPUiwgSU5JVElBVE9SX0NUTF9FUlJPUik7CisgICAgCisgICAgCSAgLy8gUSBhIExPR091dCBoZXJlPworCSAgCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKCIgUFJMSSBSRVFVRVNUIHBheWxvYWQgZmFpbGVkIHZlcmlmeVxuIik7CisgICAgICAgIC8vIChyZWplY3QgY29kZSBzZXQgYnkgInZlcmlmeSIpCisKKyAgICAgICAgLy8gUSBhIExPR091dCBoZXJlPworICAgICAgfQorICAgIH0KKworICAgIGlmKCBOZWVkUmVqZWN0ICkKKyAgICB7CisgICAgICAvLyBRIGEgUmVKZWNUIFJlcGx5IHdpdGggcmVhc29uIGNvZGUKKyAgICAgIGZjaHMtPnJlc2VydmVkID0gbHNfcmVqZWN0X2NvZGU7CisgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLAorICAgICAgICAgICAgICAgICAgICBFTFNfUkpULCAvLyBRIFR5cGUKKyAgICAgICAgICAgICAgICAgICAgZmNocyApOyAgCisgICAgfQorICB9CisgICAgYnJlYWs7CisgCisKKyAgICAKKworICBjYXNlICAweDAwMDU6ICAvLyBMT0dPdXQ/CisgIHsKKyAgLy8gd2FzIHRoaXMgTE9HT1VUIGJlY2F1c2Ugd2Ugc2VudCBhIEVMU19QRElTQyB0byBhbiBGQyBkZXZpY2UKKyAgLy8gd2l0aCBjaGFuZ2VkIChvciBuZXcpIHBvcnRfaWQsIG9yIGRvZXMgdGhlIHBvcnQgcmVmdXNlIAorICAvLyB0byBjb21tdW5pY2F0ZSB0byB1cz8KKyAgLy8gV2UgbWFpbnRhaW4gYSBsb2dvdXQgY291bnRlciAtIGlmIHdlIGdldCAzIGNvbnNlY3V0aXZlIExPR091dHMsCisgIC8vIGdpdmUgdXAhCisgICAgTE9HT1VUX1BBWUxPQUQgbG9nbzsKKyAgICBCT09MRUFOIEdpdmVVcE9uRGV2aWNlID0gRkFMU0U7CisgICAgVUxPTkcgbHNfcmVqZWN0X2NvZGUgPSAwOworICAgIAorICAgIEJpZ0VuZGlhblN3YXAoIChVQ0hBUiopJmZjaHMtPnBsWzBdLCAoVUNIQVIqKSZsb2dvLCBzaXplb2YobG9nbykpOworCisgICAgcExvZ2dlZEluUG9ydCA9IGZjRmluZExvZ2dlZEluUG9ydCggCisgICAgICAgICAgIGZjQ2hpcCwgCisgICAgICAgICAgIE5VTEwsICAgICAvLyBkb24ndCBzZWFyY2ggU2NzaSBOZXh1cworCSAgIDAsICAgICAgICAvLyBkb24ndCBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIHBvcnRfaWQKKyAgICAgICAgICAgJmxvZ28ucG9ydF9uYW1lWzBdLCAgICAgLy8gc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBXV04KKyAgICAgICAgICAgTlVMTCk7ICAgIC8vIGRvbid0IGNhcmUgYWJvdXQgZW5kIG9mIGxpc3QKKyAgICAKKyAgICBpZiggcExvZ2dlZEluUG9ydCApIC8vIGZvdW5kIHRoZSBkZXZpY2U/CisgICAgeworICAgICAgLy8gUSBhbiBBQ0MgcmVwbHkgCisgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLAorICAgICAgICAgICAgICAgICAgICBFTFNfTE9HT19BQ0MsIC8vIFEgVHlwZQorICAgICAgICAgICAgICAgICAgICBmY2hzICk7ICAgICAgIC8vIGRldmljZSB0byByZXNwb25kIHRvCisKKyAgICAgIC8vIHNldCBsb2dpbiBzdHJ1Y3QgZmllbGRzIChMT0dPX2NvdW50ZXIgaW5jcmVtZW50KQorICAgICAgU2V0TG9naW5GaWVsZHMoIHBMb2dnZWRJblBvcnQsIGZjaHMsIEZBTFNFLCBGQUxTRSk7CisgICAgICAKKyAgICAgIC8vIGFyZSB3ZSBhbiBJbml0aWF0b3I/CisgICAgICBpZiggZmNDaGlwLT5PcHRpb25zLmluaXRpYXRvcikgIAorICAgICAgeworICAgICAgICAvLyB3ZSdyZSBhbiBJbml0aWF0b3IsIHNvIGNoZWNrIGlmIHdlIHNob3VsZCAKKwkvLyB0cnkgKGFub3RoZXI/KSBsb2dpbgorCisJLy8gRmFicmljcyByb3V0aW5lbHkgbG9nIG91dCBmcm9tIHVzIGFmdGVyCisJLy8gZ2V0dGluZyBkZXZpY2UgaW5mbyAtIGRvbid0IHRyeSB0byBsb2cgdGhlbQorCS8vIGJhY2sgaW4uCisJaWYoIChmY2hzLT5zX2lkICYgMHhGRkYwMDApID09IDB4RkZGMDAwICkKKwl7CisJICA7IC8vIGRvIG5vdGhpbmcKKwl9CisJZWxzZSBpZiggcExvZ2dlZEluUG9ydC0+TE9HT19jb3VudGVyIDw9IDMpCisJeworCSAgLy8gdHJ5IChhbm90aGVyKSBsb2dpbiAoUExPR0kgcmVxdWVzdCkKKwkgIAorICAgICAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEVMU19QTE9HSSwgLy8gUSBUeXBlCisgICAgICAgICAgICAgICAgICAgIGZjaHMgKTsgIAorCQorCSAgLy8gVGVybWluYXRlIEkvTyB3aXRoICJyZXRyeSIgcG90ZW50aWFsCisJICBjcHFmY1RTVGVybWluYXRlRXhjaGFuZ2UoIGNwcWZjSEJBZGF0YSwgCisJCQkgICAgICAgICAgICAmcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLAorCQkJCSAgICBQT1JUSURfQ0hBTkdFRCk7CisJfQorCWVsc2UKKwl7CisJICBwcmludGsoIiBHb3QgMyBMT0dPdXRzIC0gdGVybWluYXRpbmcgY29tbS4gd2l0aCBwb3J0X2lkICVYaFxuIiwKKwkJCSAgZmNocy0+c19pZCAmJjB4RkZGRkZGKTsKKwkgIEdpdmVVcE9uRGV2aWNlID0gVFJVRTsKKwl9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisJR2l2ZVVwT25EZXZpY2UgPSBUUlVFOworICAgICAgfQorCisKKyAgICAgIGlmKCBHaXZlVXBPbkRldmljZSA9PSBUUlVFICkKKyAgICAgIHsKKyAgICAgICAgY3BxZmNUU1Rlcm1pbmF0ZUV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEsIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cywKKwkJICAgICAgICAgICAgICAgICAgREVWSUNFX1JFTU9WRUQpOworICAgICAgfQorICAgIH0gIAorICAgIGVsc2UgIC8vIHdlIGRvbid0IGtub3cgdGhpcyBXV04hCisgICAgeworICAgICAgLy8gUSBhIFJlSmVjVCBSZXBseSB3aXRoIHJlYXNvbiBjb2RlCisgICAgICBmY2hzLT5yZXNlcnZlZCA9IGxzX3JlamVjdF9jb2RlOworICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgRUxTX1JKVCwgLy8gUSBUeXBlCisgICAgICAgICAgICAgICAgICAgIGZjaHMgKTsgIAorICAgIH0KKyAgfQorICAgIGJyZWFrOworCisKKworCisgIC8vIEZBQlJJQyBvbmx5IGNhc2UKKyAgY2FzZSAweDA0NjE6ICAvLyBFTFMgUlNDTiAoUmVnaXN0ZXJlZCBTdGF0ZSBDaGFuZ2UgTm90aWZpY2F0aW9uKT8KKyAgeworICAgIGludCBQb3J0czsKKyAgICBpbnQgaTsKKyAgICBfX3UzMiBCdWZmOworICAgIC8vIFR5cGljYWxseSwgb25lIG9yIG1vcmUgZGV2aWNlcyBoYXZlIGJlZW4gYWRkZWQgdG8gb3IgZHJvcHBlZAorICAgIC8vIGZyb20gdGhlIEZhYnJpYy4KKyAgICAvLyBUaGUgZm9ybWF0IG9mIHRoaXMgZnJhbWUgaXMgZGVmaW5lZCBpbiBGQy1GTEEgKFJldiAyLjcsIEF1ZyAxOTk3KQorICAgIC8vIFRoZSBmaXJzdCAzMi1iaXQgd29yZCBoYXMgYSAyLWJ5dGUgUGF5bG9hZCBMZW5ndGgsIHdoaWNoCisgICAgLy8gaW5jbHVkZXMgdGhlIDQgYnl0ZXMgb2YgdGhlIGZpcnN0IHdvcmQuICBDb25zZXF1ZW50bHksCisgICAgLy8gdGhpcyBQTCBsZW4gbXVzdCBuZXZlciBiZSBsZXNzIHRoYW4gNCwgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQsCisgICAgLy8gYW5kIGhhcyBhIHNwZWNpZmllZCBtYXggdmFsdWUgMjU2LgorICAgIC8vIChFbmRpYW5lc3MhKQorICAgIFBvcnRzID0gKChmY2hzLT5wbFswXSA+PjI0KSAtIDQpIC8gNDsKKyAgICBQb3J0cyA9IFBvcnRzID4gNjMgPyA2MyA6IFBvcnRzOworICAgIAorICAgIHByaW50aygiIFJTQ04gcG9ydHM6ICVkXG4iLCBQb3J0cyk7CisgICAgaWYoIFBvcnRzIDw9IDAgKSAgLy8gaHVoPworICAgIHsKKyAgICAgIC8vIFJlSmVjVCB0aGUgY29tbWFuZAorICAgICAgZmNocy0+cmVzZXJ2ZWQgPSBMU19SSlRfUkVBU09OKCBVTkFCTEVfVE9fUEVSRk9STSwgMCk7CisgICAgCisgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLAorICAgICAgICAgICAgICAgICAgICBFTFNfUkpULCAvLyBRIFR5cGUKKyAgICAgICAgICAgICAgICAgICAgZmNocyApOyAKKyAgICAgIAorICAgICAgYnJlYWs7CisgICAgfQorICAgIGVsc2UgIC8vIEFjY2VwdCB0aGUgY29tbWFuZAorICAgIHsKKyAgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLAorICAgICAgICAgICAgICAgICAgICBFTFNfQUNDLCAvLyBRIFR5cGUKKyAgICAgICAgICAgICAgICAgICAgZmNocyApOyAKKyAgICB9CisgICAgCisgICAgICAvLyBDaGVjayB0aGUgImFkZHJlc3MgZm9ybWF0IiB0byBkZXRlcm1pbmUgYWN0aW9uLgorICAgICAgLy8gV2UgaGF2ZSAzIGNhc2VzOgorICAgICAgLy8gMCA9IFBvcnQgQWRkcmVzczsgMjQtYml0IGFkZHJlc3Mgb2YgYWZmZWN0ZWQgZGV2aWNlCisgICAgICAvLyAxID0gQXJlYSBBZGRyZXNzOyBNUyAxNiBiaXRzIHZhbGlkCisgICAgICAvLyAyID0gRG9tYWluIEFkZHJlc3M7IE1TIDggYml0cyB2YWxpZAorICAgIGZvciggaT0wOyBpPFBvcnRzOyBpKyspCisgICAgeyAKKyAgICAgIEJpZ0VuZGlhblN3YXAoIChVQ0hBUiopJmZjaHMtPnBsW2krMV0sKFVDSEFSKikmQnVmZiwgNCk7CisgICAgICBzd2l0Y2goIEJ1ZmYgJiAweEZGMDAwMDAwKQorICAgICAgeworCisgICAgICBjYXNlIDA6ICAvLyBQb3J0IEFkZHJlc3M/CisJCisgICAgICBjYXNlIDB4MDEwMDAwMDA6IC8vIEFyZWEgRG9tYWluPworICAgICAgY2FzZSAweDAyMDAwMDAwOiAvLyBEb21haW4gQWRkcmVzcworICAgICAgICAvLyBGb3IgZXhhbXBsZSwgInBvcnRfaWQiIDB4MjAxMzAwIAorCS8vIE9LLCBsZXQncyB0cnkgYSBOYW1lIFNlcnZpY2UgUmVxdWVzdCAoUXVlcnkpCisgICAgICBmY2hzLT5zX2lkID0gMHhGRkZGRkM7ICAvLyBOYW1lIFNlcnZlciBBZGRyZXNzCisgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLCBGQ1NfTlNSLCBmY2hzKTsKKworICAgICAgYnJlYWs7CisJCisJCisgICAgICBkZWZhdWx0OiAgLy8gaHVoPyBuZXcgdmFsdWUgb24gdmVyc2lvbiBjaGFuZ2U/CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0gICAgCisgIGJyZWFrOyAgICAKKworCisKKyAgICAKKyAgZGVmYXVsdDogIC8vIGRvbid0IHN1cHBvcnQgdGhpcyByZXF1ZXN0ICh5ZXQpCisgICAgLy8gc2V0IHJlamVjdCByZWFzb24gY29kZSAKKyAgICBmY2hzLT5yZXNlcnZlZCA9IExTX1JKVF9SRUFTT04oIFVOQUJMRV9UT19QRVJGT1JNLCAKKwkJICAgICAgICAgICAgICAgICAgICBSRVFVRVNUX05PVF9TVVBQT1JURUQpOworICAgIAorICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEVMU19SSlQsIC8vIFEgVHlwZQorICAgICAgICAgICAgICAgICAgICBmY2hzICk7ICAgICAKKyAgICBicmVhazsgIAorICB9Cit9CisKKworc3RhdGljIHZvaWQgUHJvY2Vzc0VMU19SZXBseSggCisJCUNQUUZDSEJBKiBjcHFmY0hCQWRhdGEsIFRhY2hGQ0hEUl9HQ01ORCogZmNocykKK3sKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworICBGQ19FWENIQU5HRVMgKkV4Y2hhbmdlcyA9IGZjQ2hpcC0+RXhjaGFuZ2VzOworICBVTE9ORyBveF9pZCA9IChmY2hzLT5veF9yeF9pZCA+PjE2KTsKKyAgVUxPTkcgbHNfcmVqZWN0X2NvZGU7CisgIFBGQ19MT0dHRURJTl9QT1JUIHBMb2dnZWRJblBvcnQsIHBMYXN0TG9nZ2VkSW5Qb3J0OworICAKKyAgLy8gSWYgdGhpcyBpcyBhIHZhbGlkIHJlcGx5LCB0aGVuIHdlIE1VU1QgaGF2ZSBzZW50IGEgcmVxdWVzdC4KKyAgLy8gVmVyaWZ5IHRoYXQgd2UgY2FuIGZpbmQgYSB2YWxpZCByZXF1ZXN0IE9YX0lEIGNvcnJlc3BvbmRpbmcgdG8KKyAgLy8gdGhpcyByZXBseQorCisgIAorICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyhmY2hzLT5veF9yeF9pZCA+PjE2KV0udHlwZSA9PSAwKQorICB7CisgICAgcHJpbnRrKCIgKkRpc2NhcmRpbmcgQUNDL1JKVCBmcmFtZSwgeElEICUwNFgvJTA0WCogIiwgCisJCSAgICBveF9pZCwgZmNocy0+b3hfcnhfaWQgJiAweGZmZmYpOworICAgIGdvdG8gUXVpdDsgIC8vIGV4aXQgdGhpcyByb3V0aW5lCisgIH0KKworCisgIC8vIElzIHRoZSByZXBseSBhIFJKVCAocmVqZWN0KT8KKyAgaWYoIChmY2hzLT5wbFswXSAmIDB4RkZGRkwpID09IDB4MDEpIC8vIFJlamVjdCByZXBseT8KKyAgeworLy8gICoqKioqKiAgUkVKRUNUIFJFUExZICAqKioqKioqKgorICAgIHN3aXRjaCggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW294X2lkXS50eXBlICkKKyAgICB7CisJICAKKyAgICBjYXNlIEVMU19GRElTQzogIC8vIHdlIHNlbnQgb3V0IEZhYnJpYyBEaXNjb3ZlcnkKKyAgICBjYXNlIEVMU19GTE9HSTogIC8vIHdlIHNlbnQgb3V0IEZMT0dJCisKKyAgICAgIHByaW50aygiUkpUIHJlY2VpdmVkIG9uIEZhYnJpYyBMb2dpbiBmcm9tICVYaCwgcmVhc29uICVYaFxuIiwgCisgICAgICAgIGZjaHMtPnNfaWQsIGZjaHMtPnBsWzFdKTsgICAgCisKKyAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgICAgfQorICAgICAgCisgICAgZ290byBEb25lOworICB9CisKKyAgLy8gT0ssIHdlIGhhdmUgYW4gQUNDZXB0Li4uCisgIC8vIFdoYXQncyB0aGUgQUNDIHR5cGU/IChhY2NvcmRpbmcgdG8gd2hhdCB3ZSBzZW50KQorICBzd2l0Y2goIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtveF9pZF0udHlwZSApCisgIHsKKwkgIAorICBjYXNlIEVMU19QTE9HSTogIC8vIHdlIHNlbnQgb3V0IFBMT0dJCisgICAgaWYoICF2ZXJpZnlfUExPR0koIGZjQ2hpcCwgZmNocywgJmxzX3JlamVjdF9jb2RlKSApCisgICAgeworICAgICAgTE9HSU5fUEFZTE9BRCBsb2dpOyAgICAgICAvLyBGQy1QSCBQb3J0IExvZ2luCisgICAgICAKKyAgICAgIC8vIGxvZ2luIEFDQyBwYXlsb2FkIGFjY2VwdGFibGU7IHNlYXJjaCBmb3IgV1dOIGluIG91ciBsaXN0CisgICAgICAvLyBvZiBmY1BvcnRzCisgICAgICAKKyAgICAgIEJpZ0VuZGlhblN3YXAoIChVQ0hBUiopJmZjaHMtPnBsWzBdLCAoVUNIQVIqKSZsb2dpLCBzaXplb2YobG9naSkpOworICAgCisgICAgICBwTG9nZ2VkSW5Qb3J0ID0gZmNGaW5kTG9nZ2VkSW5Qb3J0KCAKKyAgICAgICAgICAgICBmY0NoaXAsIAorCSAgICAgTlVMTCwgICAgIC8vIGRvbid0IHNlYXJjaCBTY3NpIE5leHVzCisJICAgICAwLCAgICAgICAgLy8gZG9uJ3Qgc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBwb3J0X2lkCisgICAgICAgICAgICAgJmxvZ2kucG9ydF9uYW1lWzBdLCAgICAgLy8gc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBXV04KKyAgICAgICAgICAgICAmcExhc3RMb2dnZWRJblBvcnQpOyAgLy8gbXVzdCByZXR1cm4gbm9uLU5VTEw7IHdoZW4gYSBwb3J0X2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBmb3VuZCwgdGhpcyBwb2ludGVyIG1hcmtzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgdGhlIHNpbmdseSBsaW5rZWQgbGlzdAorICAgIAorICAgICAgaWYoIHBMb2dnZWRJblBvcnQgPT0gTlVMTCkgICAgICAgICAvLyBXV04gbm90IGZvdW5kIC0gbmV3IHBvcnQKKyAgICAgIHsKKworCXBMb2dnZWRJblBvcnQgPSBDcmVhdGVGY1BvcnQoIAorCQkJICBjcHFmY0hCQWRhdGEsIAorCQkJICBwTGFzdExvZ2dlZEluUG9ydCwgCisJCQkgIGZjaHMsCisJCQkgICZsb2dpKTsKKworICAgICAgICBpZiggcExvZ2dlZEluUG9ydCA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgIHByaW50aygiIGNwcWZjVFM6IE5ldyBwb3J0IGFsbG9jYXRpb24gZmFpbGVkIC0gbG9zdCBGQyBkZXZpY2UhXG4iKTsKKyAgICAgICAgICAvLyBOb3cgUSBhIExPR091dCBSZXF1ZXN0LCBzaW5jZSB3ZSB3b24ndCBiZSB0YWxraW5nIHRvIHRoYXQgZGV2aWNlCisJCisgICAgICAgICAgZ290byBEb25lOyAgLy8gZXhpdCB3aXRoIGVycm9yISBkcm9wcGVkIGxvZ2luIGZyYW1lCisJfQorICAgICAgfQorICAgICAgZWxzZSAgICAgIC8vIFdXTiB3YXMgYWxyZWFkeSBrbm93bi4gIEVuc3VyZSB0aGF0IGFueSBvcGVuCisJICAgICAgICAvLyBleGNoYW5nZXMgZm9yIHRoaXMgV1dOIGFyZSB0ZXJtaW5hdGVkLgorICAgICAgCS8vIE5PVEU6IEl0J3MgcG9zc2libGUgdGhhdCBhIGRldmljZSBjYW4gY2hhbmdlIGl0cyAKKwkvLyAyNC1iaXQgcG9ydF9pZCBhZnRlciBhIExpbmsgaW5pdCBvciBGYWJyaWMgY2hhbmdlIAorCS8vIChlLmcuIExJUCBvciBGYWJyaWMgUlNDTikuICBJbiB0aGF0IGNhc2UsIHRoZSBvbGQKKwkvLyAyNC1iaXQgcG9ydF9pZCBtYXkgYmUgZHVwbGljYXRlZCwgb3Igbm8gbG9uZ2VyIGV4aXN0LgorICAgICAgeworCisgICAgICAgIGNwcWZjVFNUZXJtaW5hdGVFeGNoYW5nZSggY3BxZmNIQkFkYXRhLCAKKyAgICAgICAgICAmcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLCBQT1JUSURfQ0hBTkdFRCk7CisgICAgICB9CisKKyAgICAgIC8vIFdlIGhhdmUgYW4gZmNQb3J0IHN0cnVjdCAtIHNldCBmaWVsZHMgYWNjb3JkaW5nbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBQRElTQywgb3JpZ2luYXRvciAKKyAgICAgIFNldExvZ2luRmllbGRzKCBwTG9nZ2VkSW5Qb3J0LCBmY2hzLCBGQUxTRSwgVFJVRSk7CisJCQkKKyAgICAgIC8vIFdlIGp1c3Qgc2V0IGEgInBvcnRfaWQiOyBpcyBpdCBkdXBsaWNhdGVkPworICAgICAgVGVzdER1cGxpY2F0ZVBvcnRJZCggY3BxZmNIQkFkYXRhLCBwTG9nZ2VkSW5Qb3J0KTsKKworICAgICAgLy8gRm9yIEZhYnJpYyBvcGVyYXRpb24sIHdlIGlzc3VlZCBQTE9HSSB0byAweEZGRkZGQworICAgICAgLy8gc28gd2UgY2FuIHNlbmQgU0NSIChTdGF0ZSBDaGFuZ2UgUmVnaXN0cmF0aW9uKSAKKyAgICAgIC8vIENoZWNrIGZvciB0aGlzIHNwZWNpYWwgY2FzZS4uLgorICAgICAgaWYoIGZjaHMtPnNfaWQgPT0gMHhGRkZGRkMgKSAKKyAgICAgIHsKKyAgICAgICAgLy8gUExPR0kgQUNDIHdhcyBhIEZhYnJpYyByZXNwb25zZS4uLiBpc3N1ZSBTQ1IKKwlmY2hzLT5zX2lkID0gMHhGRkZGRkQ7ICAvLyBhZGRyZXNzIGZvciBTQ1IKKyAgICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwgRUxTX1NDUiwgZmNocyk7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgIC8vIE5vdyB3ZSBuZWVkIGEgUFJMSSB0byBlbmFibGUgRkNQLVNDU0kgb3BlcmF0aW9uCisgICAgICAvLyBzZXQgZmxhZ3MgYW5kIFEgdXAgYSBFTFNfUFJMSQorICAgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLCBFTFNfUFJMSSwgZmNocyk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBsb2dpbiBwYXlsb2FkIHVuYWNjZXB0YWJsZSAtIHJlYXNvbiBpbiBsc19yZWplY3RfY29kZQorICAgICAgLy8gUSB1cCBhIExvZ291dCBSZXF1ZXN0CisgICAgICBwcmludGsoIkxvZ2luIFBheWxvYWQgdW5hY2NlcHRhYmxlXG4iKTsKKworICAgIH0KKyAgICBicmVhazsKKworCisgIC8vIFBESVNDIGxvZ2ljIHZlcnkgc2ltaWxhciB0byBQTE9HSSwgZXhjZXB0IHdlIG5ldmVyIHdhbnQKKyAgLy8gdG8gYWxsb2NhdGUgbWVtIGZvciAibmV3IiBwb3J0LCBhbmQgd2Ugc2V0IGZsYWdzIGRpZmZlcmVudGx5CisgIC8vIChtaWdodCBjb21iaW5lIGxhdGVyIHdpdGggUExPR0kgbG9naWMgZm9yIGVmZmljaWVuY3kpICAKKyAgY2FzZSBFTFNfUERJU0M6ICAvLyB3ZSBzZW50IG91dCBQRElTQworICAgIGlmKCAhdmVyaWZ5X1BMT0dJKCBmY0NoaXAsIGZjaHMsICZsc19yZWplY3RfY29kZSkgKQorICAgIHsKKyAgICAgIExPR0lOX1BBWUxPQUQgbG9naTsgICAgICAgLy8gRkMtUEggUG9ydCBMb2dpbgorICAgICAgQk9PTEVBTiBOZWVkTG9naW4gPSBGQUxTRTsKKyAgICAgIAorICAgICAgLy8gbG9naW4gcGF5bG9hZCBhY2NlcHRhYmxlOyBzZWFyY2ggZm9yIFdXTiBpbiBvdXIgbGlzdAorICAgICAgLy8gb2YgKHByZXZpb3VzbHkgc2VlbikgZmNQb3J0cworICAgICAgCisgICAgICBCaWdFbmRpYW5Td2FwKCAoVUNIQVIqKSZmY2hzLT5wbFswXSwgKFVDSEFSKikmbG9naSwgc2l6ZW9mKGxvZ2kpKTsKKyAgIAorICAgICAgcExvZ2dlZEluUG9ydCA9IGZjRmluZExvZ2dlZEluUG9ydCggCisgICAgICAgICAgICAgZmNDaGlwLCAKKwkgICAgIE5VTEwsICAgICAvLyBkb24ndCBzZWFyY2ggU2NzaSBOZXh1cworCSAgICAgMCwgICAgICAgIC8vIGRvbid0IHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgcG9ydF9pZAorICAgICAgICAgICAgICZsb2dpLnBvcnRfbmFtZVswXSwgICAgIC8vIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgV1dOCisgICAgICAgICAgICAgJnBMYXN0TG9nZ2VkSW5Qb3J0KTsgIC8vIG11c3QgcmV0dXJuIG5vbi1OVUxMOyB3aGVuIGEgcG9ydF9pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3QgZm91bmQsIHRoaXMgcG9pbnRlciBtYXJrcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIHRoZSBzaW5nbHkgbGlua2VkIGxpc3QKKyAgICAKKyAgICAgIGlmKCBwTG9nZ2VkSW5Qb3J0ICE9IE5VTEwpICAgLy8gV1dOIGZvdW5kPworICAgICAgeworICAgICAgICAvLyBXV04gaGFzIHNhbWUgcG9ydF9pZCBhcyBsYXN0IGxvZ2luPyAgKE9mIGNvdXJzZSwgYSBwcm9wZXJseQorCS8vIHdvcmtpbmcgRkMgZGV2aWNlIHNob3VsZCBORVZFUiBBQ0NlcHQgYSBQRElTQyBpZiBpdCdzCisJLy8gcG9ydF9pZCBjaGFuZ2VkLCBidXQgY2hlY2sganVzdCBpbiBjYXNlLi4uKQorCWlmKCAoZmNocy0+c19pZCAmIDB4RkZGRkZGKSA9PSBwTG9nZ2VkSW5Qb3J0LT5wb3J0X2lkKQorCXsKKyAgICAgICAgICAvLyBZZXMuICBXZSB3ZXJlIGV4cGVjdGluZyBQRElTQz8KKyAgICAgICAgICBpZiggcExvZ2dlZEluUG9ydC0+cGRpc2MgKQorCSAgeworICAgICAgICAgICAgaW50IGk7CisJICAgIAorCSAgICAKKwkgICAgLy8gUERJU0MgZXhwZWN0ZWQgLS0gc2V0IGZpZWxkcy4gIChQRElTQywgT3JpZ2luYXRvcikKKyAgICAgICAgICAgIFNldExvZ2luRmllbGRzKCBwTG9nZ2VkSW5Qb3J0LCBmY2hzLCBUUlVFLCBUUlVFKTsKKworCSAgICAvLyBXZSBhcmUgcmVhZHkgdG8gcmVzdW1lIEZDUC1TQ1NJIHRvIHRoaXMgZGV2aWNlLi4uCisgICAgICAgICAgICAvLyBEbyB3ZSBuZWVkIHRvIHN0YXJ0IGFueXRoaW5nIHRoYXQgd2FzIFF1ZXVlZD8KKworICAgICAgICAgICAgZm9yKCBpPTA7IGk8IFRBQ0hfU0VTVF9MRU47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gc2VlIGlmIGFueSBleGNoYW5nZSBmb3IgdGhpcyBQRElTQydkIHBvcnQgd2FzIHF1ZXVlZAorICAgICAgICAgICAgICBpZiggKChmY2hzLT5zX2lkICYweEZGRkZGRikgPT0gCisgICAgICAgICAgICAgICAgICAgKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS5mY2hzLmRfaWQgJiAweEZGRkZGRikpCisgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICAgIChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbaV0uc3RhdHVzICYgRVhDSEFOR0VfUVVFVUVEKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZjaHMtPnJlc2VydmVkID0gaTsgLy8gY29weSBFeGNoYW5nZUlECisvLyAgICAgICAgICAgICAgICBwcmludGsoIiAqUSB4X0lEICVYaCBhZnRlciBQRElTQyogIixpKTsKKworICAgICAgICAgICAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsIEVYQ0hBTkdFX1FVRVVFRCwgZmNocyApOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKwkgICAgLy8gQ29tcGxldGUgY29tbWFuZHMgUSdkIHdoaWxlIHdlIHdlcmUgd2FpdGluZyBmb3IgTG9naW4KKworCSAgICBVbmJsb2NrU2NzaURldmljZSggY3BxZmNIQkFkYXRhLT5Ib3N0QWRhcHRlciwgcExvZ2dlZEluUG9ydCk7CisJICB9CisJICBlbHNlCisJICB7CisJICAgIHByaW50aygiTm90IGV4cGVjdGluZyBQRElTQyAocGRpc2M9RkFMU0UpXG4iKTsKKwkgICAgTmVlZExvZ2luID0gVFJVRTsKKwkgIH0KKwl9CisJZWxzZQorCXsKKwkgIHByaW50aygiUERJU0MgUG9ydElEIGNoYW5nZTogb2xkICVYaCwgbmV3ICVYaFxuIiwKKyAgICAgICAgICAgIHBMb2dnZWRJblBvcnQtPnBvcnRfaWQsIGZjaHMtPnNfaWQgJjB4RkZGRkZGKTsKKyAgICAgICAgICBOZWVkTG9naW4gPSBUUlVFOworCQkgIAorCX0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKwlwcmludGsoIlBESVNDIEFDQyBmcm9tIHVua25vd24gV1dOXG4iKTsKKyAgICAgICAgTmVlZExvZ2luID0gVFJVRTsKKyAgICAgIH0KKworICAgICAgaWYoIE5lZWRMb2dpbikKKyAgICAgIHsKKwkKKyAgICAgICAgLy8gVGhlIFBESVNDIGZhaWxlZC4gIFNldCBsb2dpbiBzdHJ1Y3QgZmxhZ3MgYWNjb3JkaW5nbHksCisJLy8gdGVybWluYXRlIGFueSBJL08gdG8gdGhpcyBwb3J0LCBhbmQgUSBhIFBMT0dJCisJaWYoIHBMb2dnZWRJblBvcnQgKSAgLy8gRkMgZGV2aWNlIHByZXZpb3VzbHkga25vd24/CisJeworCisgICAgICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgRUxTX0xPR08sIC8vIFEgVHlwZQorICAgICAgICAgICAgICAgICAgICBmY2hzICk7ICAgLy8gaGFzIHBvcnRfaWQgdG8gc2VuZCB0byAKKworCSAgLy8gVGhlcmUgYXJlIGEgdmFyaWV0eSBvZiBlcnJvciBzY2VuYXJpb3Mgd2hpY2ggY2FuIHJlc3VsdAorICAJICAvLyBpbiBQRElTQyBmYWlsdXJlLCBzbyBhcyBhIGNhdGNoYWxsLCBhZGQgdGhlIGNoZWNrIGZvcgorCSAgLy8gZHVwbGljYXRlIHBvcnRfaWQuCisJICBUZXN0RHVwbGljYXRlUG9ydElkKCBjcHFmY0hCQWRhdGEsIHBMb2dnZWRJblBvcnQpOworCisvLyAgICBUcmlnZ2VySEJBKCBmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UsIDApOworICAgICAgICAgIHBMb2dnZWRJblBvcnQtPnBkaXNjID0gRkFMU0U7CisgICAgICAgICAgcExvZ2dlZEluUG9ydC0+cHJsaSA9IEZBTFNFOworICAgICAgICAgIHBMb2dnZWRJblBvcnQtPnBsb2dpID0gRkFMU0U7CisJCisgICAgICAgICAgY3BxZmNUU1Rlcm1pbmF0ZUV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEsIAorCSAgICAmcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLCBQT1JUSURfQ0hBTkdFRCk7CisgICAgICAgIH0KKyAgICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwgRUxTX1BMT0dJLCBmY2hzICk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBsb2dpbiBwYXlsb2FkIHVuYWNjZXB0YWJsZSAtIHJlYXNvbiBpbiBsc19yZWplY3RfY29kZQorICAgICAgLy8gUSB1cCBhIExvZ291dCBSZXF1ZXN0CisgICAgICBwcmludGsoIkVSUk9SOiBMb2dpbiBQYXlsb2FkIHVuYWNjZXB0YWJsZSFcbiIpOworCisgICAgfQorICAgCisgICAgYnJlYWs7CisgICAgCisKKworICBjYXNlIEVMU19QUkxJOiAgLy8gd2Ugc2VudCBvdXQgUFJMSQorCisKKyAgICBwTG9nZ2VkSW5Qb3J0ID0gZmNGaW5kTG9nZ2VkSW5Qb3J0KCAKKyAgICAgICAgICAgZmNDaGlwLCAKKyAgICAgICAgICAgTlVMTCwgICAgICAgLy8gZG9uJ3Qgc2VhcmNoIFNjc2kgTmV4dXMKKwkgICAoZmNocy0+c19pZCAmIDB4RkZGRkZGKSwgIC8vIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgcG9ydF9pZAorICAgICAgICAgICBOVUxMLCAgICAgLy8gRE9OJ1Qgc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBXV04KKyAgICAgICAgICAgTlVMTCk7ICAgIC8vIGRvbid0IGNhcmUKKyAgICAgIAorICAgIGlmKCBwTG9nZ2VkSW5Qb3J0ID09IE5VTEwgKSAKKyAgICB7CisgICAgICAvLyBodWg/CisgICAgICBwcmludGsoIiBVbmV4cGVjdGVkIFBSTEkgQUNDZXB0IGZyYW1lIVxuIik7CisKKyAgICAgIC8vIFEgYSBMT0dPdXQgaGVyZT8KKworICAgICAgZ290byBEb25lOworICAgIH0KKworICAgIC8vIHZlcmlmeSB0aGUgUFJMSSBBQ0MgcGF5bG9hZAorICAgIGlmKCAhdmVyaWZ5X1BSTEkoIGZjaHMsICZsc19yZWplY3RfY29kZSkgKQorICAgIHsKKyAgICAgIC8vIFBSTEkgUmVwbHkgaXMgYWNjZXB0YWJsZTsgd2VyZSB3ZSBleHBlY3RpbmcgaXQ/CisgICAgICBpZiggcExvZ2dlZEluUG9ydC0+cGxvZ2kgKSAKKyAgICAgIHsgCisJLy8geWVzLCB3ZSBleHBlY3RlZCB0aGUgUFJMSSBBQ0MgIChub3QgUERJU0M7IE9yaWdpbmF0b3IpCisJU2V0TG9naW5GaWVsZHMoIHBMb2dnZWRJblBvcnQsIGZjaHMsIEZBTFNFLCBUUlVFKTsKKworICAgICAgICAvLyBPSywgbGV0J3Mgc2VuZCBhIFJFUE9SVF9MVU5TIGNvbW1hbmQgdG8gZGV0ZXJtaW5lCisJLy8gd2hldGhlciBWU0Egb3IgUERBIEZDUC1MVU4gYWRkcmVzc2luZyBpcyB1c2VkLgorCQorICAgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLCBTQ1NJX1JFUE9SVF9MVU5TLCBmY2hzICk7CisJCisJLy8gSXQncyBwb3NzaWJsZSB0aGF0IGEgZGV2aWNlIHdlIHdlcmUgdGFsa2luZyB0byBjaGFuZ2VkIAorCS8vIHBvcnRfaWQsIGFuZCBoYXMgbG9nZ2VkIGJhY2sgaW4uICBUaGlzIGZ1bmN0aW9uIGVuc3VyZXMKKwkvLyB0aGF0IEkvTyB3aWxsIHJlc3VtZS4KKyAgICAgICAgVW5ibG9ja1Njc2lEZXZpY2UoIGNwcWZjSEJBZGF0YS0+SG9zdEFkYXB0ZXIsIHBMb2dnZWRJblBvcnQpOworCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8vIGh1aD8KKyAgICAgICAgcHJpbnRrKCIgKHVuZXhwZWN0ZWQpIFBSTEkgQUNDZXB0IHdpdGggcGxvZ2kgRkFMU0VcbiIpOworCisgICAgICAgIC8vIFEgYSBMT0dPdXQgaGVyZT8KKyAgICAgICAgZ290byBEb25lOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcHJpbnRrKCIgUFJMSSBBQ0NlcHQgcGF5bG9hZCBmYWlsZWQgdmVyaWZ5XG4iKTsKKworICAgICAgLy8gUSBhIExPR091dCBoZXJlPworICAgIH0KKworICAgIGJyZWFrOworIAorICBjYXNlIEVMU19GTE9HSTogIC8vIHdlIHNlbnQgb3V0IEZMT0dJIChGYWJyaWMgTG9naW4pCisKKyAgICAvLyB1cGRhdGUgdGhlIHVwcGVyIDE2IGJpdHMgb2Ygb3VyIHBvcnRfaWQgaW4gVGFjaHlvbgorICAgIC8vIHRoZSBzd2l0Y2ggYWRkcyB0aG9zZSB1cHBlciAxNiBiaXRzIHdoZW4gcmVzcG9uZGluZworICAgIC8vIHRvIHVzIChpLmUuIHdlIGFyZSB0aGUgZGVzdGluYXRpb25faWQpCisgICAgZmNDaGlwLT5SZWdpc3RlcnMubXlfYWxfcGEgPSAoZmNocy0+ZF9pZCAmIDB4RkZGRkZGKTsKKyAgICB3cml0ZWwoIGZjQ2hpcC0+UmVnaXN0ZXJzLm15X2FsX3BhLCAgCisgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fVEFDSF9NeV9JRCk7CisKKyAgICAvLyBub3cgc2VuZCBvdXQgYSBQTE9HSSB0byB0aGUgd2VsbCBrbm93biBwb3J0X2lkIDB4RkZGRkZDCisgICAgZmNocy0+c19pZCA9IDB4RkZGRkZDOworICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsIEVMU19QTE9HSSwgZmNocyk7CisgIAorICAgYnJlYWs7IAorCisKKyAgY2FzZSBFTFNfRkRJU0M6ICAvLyB3ZSBzZW50IG91dCBGRElTQyAoRmFicmljIERpc2NvdmVyeSAoTG9naW4pKQorCisgICBwcmludGsoICIgRUxTX0ZESVNDIHN1Y2Nlc3MgIik7CisgICBicmVhazsKKyAgIAorCisgIGNhc2UgRUxTX1NDUjogIC8vIHdlIHNlbnQgb3V0IFN0YXRlIENoYW5nZSBSZWdpc3RyYXRpb24KKyAgICAvLyBub3cgd2UgY2FuIGlzc3VlIE5hbWUgU2VydmljZSBSZXF1ZXN0IHRvIGZpbmQgYW55CisgICAgLy8gRmFicmljLWNvbm5lY3RlZCBkZXZpY2VzIHdlIG1pZ2h0IHdhbnQgdG8gbG9naW4gdG8uCisgICAKKwkKKyAgICBmY2hzLT5zX2lkID0gMHhGRkZGRkM7ICAvLyBOYW1lIFNlcnZlciBBZGRyZXNzCisgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwgRkNTX05TUiwgZmNocyk7CisgICAgCisKKyAgICBicmVhazsKKworICAgIAorICBkZWZhdWx0OgorICAgIHByaW50aygiICpEaXNjYXJkaW5nIHVua25vd24gQUNDIGZyYW1lLCB4SUQgJTA0WC8lMDRYKiAiLCAKKyAgIAkJICAgIG94X2lkLCBmY2hzLT5veF9yeF9pZCAmIDB4ZmZmZik7CisgICAgYnJlYWs7CisgIH0KKworICAKK0RvbmU6CisgIC8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgUmVwbHkgaXMgdmFsaWQgb3Igbm90LCB0aGUKKyAgLy8gdGhlIGV4Y2hhbmdlIGlzIGRvbmUgLSBjb21wbGV0ZQorICBjcHFmY1RTQ29tcGxldGVFeGNoYW5nZShjcHFmY0hCQWRhdGEtPlBjaURldiwgZmNDaGlwLCAoZmNocy0+b3hfcnhfaWQgPj4xNikpOyAKKwkgIAorUXVpdDogICAgCisgIHJldHVybjsKK30KKworCisKKworCisKKy8vICoqKioqKioqKioqKioqKiogIEZpYnJlIENoYW5uZWwgU2VydmljZXMgICoqKioqKioqKioqKioqCisvLyBUaGlzIGlzIHdoZXJlIHdlIHByb2Nlc3MgdGhlIERpcmVjdG9yeSAoTmFtZSkgU2VydmljZSBSZXBseQorLy8gdG8ga25vdyB3aGljaCBkZXZpY2VzIGFyZSBvbiB0aGUgRmFicmljCisKK3N0YXRpYyB2b2lkIFByb2Nlc3NGQ1NfUmVwbHkoIAorCUNQUUZDSEJBKiBjcHFmY0hCQWRhdGEsIFRhY2hGQ0hEUl9HQ01ORCogZmNocykKK3sKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworICBGQ19FWENIQU5HRVMgKkV4Y2hhbmdlcyA9IGZjQ2hpcC0+RXhjaGFuZ2VzOworICBVTE9ORyBveF9pZCA9IChmY2hzLT5veF9yeF9pZCA+PjE2KTsKKy8vICBVTE9ORyBsc19yZWplY3RfY29kZTsKKy8vICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0LCBwTGFzdExvZ2dlZEluUG9ydDsKKyAgCisgIC8vIElmIHRoaXMgaXMgYSB2YWxpZCByZXBseSwgdGhlbiB3ZSBNVVNUIGhhdmUgc2VudCBhIHJlcXVlc3QuCisgIC8vIFZlcmlmeSB0aGF0IHdlIGNhbiBmaW5kIGEgdmFsaWQgcmVxdWVzdCBPWF9JRCBjb3JyZXNwb25kaW5nIHRvCisgIC8vIHRoaXMgcmVwbHkKKworICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyhmY2hzLT5veF9yeF9pZCA+PjE2KV0udHlwZSA9PSAwKQorICB7CisgICAgcHJpbnRrKCIgKkRpc2NhcmRpbmcgUmVwbHkgZnJhbWUsIHhJRCAlMDRYLyUwNFgqICIsIAorCQkgICAgb3hfaWQsIGZjaHMtPm94X3J4X2lkICYgMHhmZmZmKTsKKyAgICBnb3RvIFF1aXQ7ICAvLyBleGl0IHRoaXMgcm91dGluZQorICB9CisKKworICAvLyBPSywgd2Ugd2VyZSBleHBlY3RpbmcgaXQuICBOb3cgY2hlY2sgdG8gc2VlIGlmIGl0J3MgYQorICAvLyAiTmFtZSBTZXJ2aWNlIiBSZXBseSwgYW5kIGlmIHNvIGZvcmNlIGEgcmUtdmFsaWRhdGlvbiBvZgorICAvLyBGYWJyaWMgZGV2aWNlIGxvZ2lucyAoaS5lLiBTdGFydCB0aGUgbG9naW4gdGltZW91dCBhbmQKKyAgLy8gc2VuZCBQRElTQyBvciBQTE9HSSkKKyAgLy8gKEVuZGlhbmVzcyBCeXRlIFN3YXA/KQorICBpZiggZmNocy0+cGxbMV0gPT0gMHgwMkZDICkgIC8vIE5hbWUgU2VydmljZQorICB7CisgICAgLy8gZ290IGEgbmV3IChvciBOVUxMKSBsaXN0IG9mIEZhYnJpYyBhdHRhY2ggZGV2aWNlcy4uLiAKKyAgICAvLyBJbnZhbGlkYXRlIGN1cnJlbnQgbG9naW5zCisgICAgCisgICAgUEZDX0xPR0dFRElOX1BPUlQgcExvZ2dlZEluUG9ydCA9ICZmY0NoaXAtPmZjUG9ydHM7CisgICAgd2hpbGUoIHBMb2dnZWRJblBvcnQgKSAvLyBmb3IgYWxsIHBvcnRzIHdoaWNoIGFyZSBleHBlY3RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBESVNDIGFmdGVyIHRoZSBuZXh0IExJUCwgc2V0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nb3V0VGltZXIKKyAgICB7CisKKyAgICAgIGlmKCAocExvZ2dlZEluUG9ydC0+cG9ydF9pZCAmIDB4RkZGRjAwKSAgLy8gRmFicmljIGRldmljZT8KKwkJICAgICAgJiYKKyAgICAgICAgICAocExvZ2dlZEluUG9ydC0+cG9ydF9pZCAhPSAweEZGRkZGQykgKSAvLyBOT1QgdGhlIEZfUG9ydAorICAgICAgeworICAgICAgICBwTG9nZ2VkSW5Qb3J0LT5MT0dPX3RpbWVyID0gNjsgIC8vIHdoYXQncyB0aGUgRmFicmljIHRpbWVvdXQ/PworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5kIGFueSBJL08gaW4gcHJvZ3Jlc3MgdW50aWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUERJU0MgcmVjZWl2ZWQuLi4KKyAgICAgICAgcExvZ2dlZEluUG9ydC0+cHJsaSA9IEZBTFNFOyAgIC8vIGJsb2NrIEZDUC1TQ1NJIGNvbW1hbmRzCisgICAgICB9CisJICAgIAorICAgICAgcExvZ2dlZEluUG9ydCA9IHBMb2dnZWRJblBvcnQtPnBOZXh0UG9ydDsKKyAgICB9CisgICAgCisgICAgaWYoIGZjaHMtPnBsWzJdID09IDB4MDI4MCkgIC8vIEFDQ2VwdD8KKyAgICB7CisgICAgICAvLyBTZW5kIFBMT0dJIG9yIFBESVNDIHRvIHRoZXNlIEZhYnJpYyBkZXZpY2VzCisgICAgICBTZW5kTG9naW5zKCBjcHFmY0hCQWRhdGEsICZmY2hzLT5wbFs0XSApOyAgCisgICAgfQorCisKKyAgICAvLyBBcyBvZiB0aGlzIHdyaXRpbmcsIHRoZSBvbmx5IHJlYXNvbiB0byByZWplY3QgaXMgYmVjYXVzZSBOTworICAgIC8vIGRldmljZXMgYXJlIGxlZnQgb24gdGhlIEZhYnJpYy4gIFdlIGFscmVhZHkgc3RhcnRlZAorICAgIC8vICJsb2dnZWQgb3V0IiB0aW1lcnM7IGlmIHRoZSBkZXZpY2UocykgZG9uJ3QgY29tZQorICAgIC8vIGJhY2ssIHdlJ2xsIGRvIHRoZSBpbXBsaWNpdCBsb2dvdXQgaW4gdGhlIGhlYXJ0IGJlYXQgCisgICAgLy8gdGltZXIgcm91dGluZQorICAgIGVsc2UgIC8vIFJlSmVjVAorICAgIHsKKyAgICAgIC8vIHRoaXMganVzdCBtZWFucyBubyBGYWJyaWMgZGV2aWNlIGlzIHZpc2libGUgYXQgdGhpcyBpbnN0YW50CisgICAgfSAKKyAgfQorCisgIC8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgUmVwbHkgaXMgdmFsaWQgb3Igbm90LCB0aGUKKyAgLy8gdGhlIGV4Y2hhbmdlIGlzIGRvbmUgLSBjb21wbGV0ZQorICBjcHFmY1RTQ29tcGxldGVFeGNoYW5nZShjcHFmY0hCQWRhdGEtPlBjaURldiwgZmNDaGlwLCAoZmNocy0+b3hfcnhfaWQgPj4xNikpOworCSAgCitRdWl0OiAgICAKKyAgcmV0dXJuOworfQorCisKKworCisKKworCitzdGF0aWMgdm9pZCBBbmFseXplSW5jb21pbmdGcmFtZSggCisgICAgICAgIENQUUZDSEJBICpjcHFmY0hCQWRhdGEsCisgICAgICAgIFVMT05HIFFOZHggKQoreworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisgIEZDX0VYQ0hBTkdFUyAqRXhjaGFuZ2VzID0gZmNDaGlwLT5FeGNoYW5nZXM7CisgIFBGQ19MSU5LX1FVRSBmY0xRID0gY3BxZmNIQkFkYXRhLT5mY0xROworICBUYWNoRkNIRFJfR0NNTkQqIGZjaHMgPSAKKyAgICAoVGFjaEZDSERSX0dDTU5EKilmY0xRLT5RaXRlbVtRTmR4XS51bEJ1ZmY7CisvLyAgVUxPTkcgbHNfcmVqZWN0X2NvZGU7ICAvLyByZWFzb24gZm9yIHJlamVjdGluZyBsb2dpbgorICBMT05HIEV4Y2hhbmdlSUQ7CisvLyAgRkNfTE9HR0VESU5fUE9SVCAqcExvZ2dlZEluUG9ydDsKKyAgQk9PTEVBTiBBYm9ydEFjY2VwdDsgIAorCisgIEVOVEVSKCJBbmFseXplSW5jb21pbmdGcmFtZSIpOworCisKKworICBzd2l0Y2goIGZjTFEtPlFpdGVtW1FOZHhdLlR5cGUpIC8vIEZDUCBvciBVbmtub3duCisgIHsKKworICBjYXNlIFNGUV9VTktOT1dOOiAgLy8gdW5rbm93biBmcmFtZSAoZS5nLiBMSVAgcG9zaXRpb24gZnJhbWUsIE5PUCwgZXRjLikKKyAKKworICAgICAgLy8gKioqKioqKioqICBGQy00IERldmljZSBEYXRhLyBGaWJyZSBDaGFubmVsIFNlcnZpY2UgKioqKioqKioqKioqKgorICAgIGlmKCAoKGZjaHMtPmRfaWQgJjB4RjAwMDAwMDApID09IDApICAgLy8gUl9DVEwgKHVwcGVyIG5pYmJsZSkgMHgwPworICAgICAgICAgICAgICAgICYmICAgCisgICAgICAoZmNocy0+Zl9jdGwgJiAweDIwMDAwMDAwKSApICAvLyBUWVBFIDIwaCBpcyBGaWJyZSBDaGFubmVsIFNlcnZpY2UKKyAgICB7CisKKyAgICAgIC8vICoqKioqKioqKioqKioqIEZDUyBSZXBseSAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgIGlmKCAoZmNocy0+ZF9pZCAmIDB4ZmYwMDAwMDBMKSA9PSAweDAzMDAwMDAwTCkgIC8vICgzMToyMyBSX0NUTCkKKyAgICAgIHsKKwlQcm9jZXNzRkNTX1JlcGx5KCBjcHFmY0hCQWRhdGEsIGZjaHMgKTsKKworICAgICAgfSAgLy8gZW5kIG9mICBGQ1MgbG9naWMKKworICAgIH0KKyAgICAKKworICAgICAgLy8gKioqKioqKioqKiogIEV4dGVuZGVkIExpbmsgU2VydmljZSAqKioqKioqKioqKioqKgorCisgICAgZWxzZSBpZiggZmNocy0+ZF9pZCAmIDB4MjAwMDAwMDAgICAvLyBSX0NUTCAweDI/CisgICAgICAgICAgICAgICAgICAmJiAgIAorICAgICAgKGZjaHMtPmZfY3RsICYgMHgwMTAwMDAwMCkgKSAgLy8gVFlQRSA9IDEKKyAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIGZyYW1lcyBhcmUgZWl0aGVyIGEgcmVzcG9uc2UgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyB3ZSBzZW50ICgweDIzKSBvciAidW5zb2xpY2l0ZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZXMgKDB4MjIpLgorCisKKyAgICAgIC8vICoqKioqKioqKioqKioqRXh0ZW5kZWQgTGluayBSRVBMWSAqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSX0NUTCBTb2xpY2l0ZWQgQ29udHJvbCBSZXBseQorCisgICAgICBpZiggKGZjaHMtPmRfaWQgJiAweGZmMDAwMDAwTCkgPT0gMHgyMzAwMDAwMEwpICAvLyAoMzE6MjMgUl9DVEwpCisgICAgICB7CisKKwlQcm9jZXNzRUxTX1JlcGx5KCBjcHFmY0hCQWRhdGEsIGZjaHMgKTsKKworICAgICAgfSAgLy8gZW5kIG9mICAiUl9DVEwgU29saWNpdGVkIENvbnRyb2wgUmVwbHkiCisKKworCisKKyAgICAgICAvLyAqKioqKioqKioqKioqKkV4dGVuZGVkIExpbmsgUkVRVUVTVCAqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgLy8gKHVuc29saWNpdGVkIGNvbW1hbmRzIGZyb20gYW5vdGhlciBwb3J0IG9yIHRhc2suLi4pCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJfQ1RMIEV4dCBMaW5rIFJFUVVFU1QKKyAgICAgIGVsc2UgaWYoIChmY2hzLT5kX2lkICYgMHhmZjAwMDAwMEwpID09IDB4MjIwMDAwMDBMICYmCisgICAgICAgICAgICAgIChmY2hzLT5veF9yeF9pZCAhPSAweEZGRkZGRkZGTCkgKSAvLyAoaWdub3JlIExJUCBmcmFtZSkKKyAgICAgIHsKKworCisKKwlQcm9jZXNzRUxTX1JlcXVlc3QoIGNwcWZjSEJBZGF0YSwgZmNocyApOworCisgICAgICB9CisKKworCisgICAgICAgIC8vICoqKioqKioqKioqKioqIExJTFAgKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgZWxzZSBpZiggKGZjaHMtPmRfaWQgJiAweGZmMDAwMDAwTCkgPT0gMHgyMjAwMDAwMEwgJiYKKyAgICAgICAgICAgICAgIChmY2hzLT5veF9yeF9pZCA9PSAweEZGRkZGRkZGTCkpIC8vIChlLmcuLCBMSVAgZnJhbWVzKQorCisgICAgICB7CisgICAgICAgIC8vIFNBTk1hcmsgc3BlY2lmaWVzIHRoYXQgd2hlbiBhdmFpbGFibGUsIHdlIG11c3QgdXNlCisJLy8gdGhlIExJTFAgZnJhbWUgdG8gZGV0ZXJtaW5lIHdoaWNoIEFMUEFzIHRvIHNlbmQgUG9ydCBEaXNjb3ZlcnkKKwkvLyB0by4uLgorCisgICAgICAgIGlmKCBmY2hzLT5wbFswXSA9PSAweDA3MTFMKSAvLyAgRUxTX1BMT0dJPworCXsKKy8vCSAgVUNIQVIgKnB0ciA9IChVQ0hBUiopJmZjaHMtPnBsWzFdOworLy8JICBwcmludGsoIiAlZCBBTFBBcyBmb3VuZFxuIiwgKnB0cik7CisJICBtZW1jcHkoIGZjQ2hpcC0+TElMUG1hcCwgJmZjaHMtPnBsWzFdLCAzMio0KTsgLy8gMzIgRFdPUkRzCisJICBmY0NoaXAtPk9wdGlvbnMuTElMUGluID0gMTsgLy8gb3VyIExJTFBtYXAgaXMgdmFsaWQhCisJICAvLyBub3cgcG9zdCB0byBtYWtlIFBvcnQgRGlzY292ZXJ5IGhhcHBlbi4uLgorICAgICAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsIExJTktBQ1RJVkUsIGZjaHMpOyAgCisJfQorICAgICAgfQorICAgIH0KKworICAgICAKKyAgICAvLyAqKioqKioqKioqKioqKioqKiAgQkFTSUMgTElOSyBTRVJWSUNFICoqKioqKioqKioqKioqKioqCisgICAgCisgICAgZWxzZSBpZiggZmNocy0+ZF9pZCAmIDB4ODAwMDAwMDAgIC8vIFJfQ1RMOgorICAgICAgICAgICAgICAgICAgICAmJiAgICAgICAgICAgLy8gQmFzaWMgTGluayBTZXJ2aWNlIFJlcXVlc3QKKyAgICAgICAgICAgIShmY2hzLT5mX2N0bCAmIDB4RkYwMDAwMDApICkgIC8vIHR5cGU9MCBmb3IgQkxTCisgICAgeworCisgICAgICAvLyBDaGVjayBmb3IgQUJUUyAoQWJvcnQgU2VxdWVuY2UpCisgICAgICBpZiggKGZjaHMtPmRfaWQgJiAweDhGMDAwMDAwKSA9PSAweDgxMDAwMDAwKQorICAgICAgeworICAgICAgICAvLyBsb29rIGZvciBPWF9JRCwgU19JRCBwYWlyIHRoYXQgbWF0Y2hlcyBpbiBvdXIKKyAgICAgICAgLy8gZmNFeGNoYW5nZXMgdGFibGU7IGlmIGZvdW5kLCByZXBseSB3aXRoIEFDQ2VwdCBhbmQgY29tcGxldGUKKyAgICAgICAgLy8gdGhlIGV4Y2hhbmdlCisKKyAgICAgICAgLy8gUGVyIFBMREEsIGFuIEFCVFMgaXMgc2VudCBieSBhbiBpbml0aWF0b3I7IHRoZXJlZm9yZQorICAgICAgICAvLyBhc3N1bWUgdGhhdCBpZiB3ZSBoYXZlIGFuIGV4aGFuZ2Ugb3BlbiB0byB0aGUgcG9ydCB3aG8KKyAgICAgICAgLy8gc2VudCBBQlRTLCBpdCB3aWxsIGJlIHRoZSBkX2lkIG9mIHdoYXQgd2Ugc2VudC4gIAorICAgICAgICBmb3IoIEV4Y2hhbmdlSUQgPSAwLCBBYm9ydEFjY2VwdD1GQUxTRTsKKyAgICAgICAgICAgICBFeGNoYW5nZUlEIDwgVEFDSF9TRVNUX0xFTjsgRXhjaGFuZ2VJRCsrKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBWYWxpZCAidGFyZ2V0IiBleGNoYW5nZSAyNC1iaXQgcG9ydF9pZCBtYXRjaGVzPyAKKyAgICAgICAgICAgIC8vIE5PVEU6IEZvciB0aGUgY2FzZSBvZiBoYW5kbGluZyBJbnRpYXRvciBBTkQgVGFyZ2V0CisgICAgICAgICAgICAvLyBmdW5jdGlvbnMgb24gdGhlIHNhbWUgY2hpcCwgd2UgY2FuIGhhdmUgVFdPIEV4Y2hhbmdlcworICAgICAgICAgICAgLy8gd2l0aCB0aGUgc2FtZSBPWF9JRCAtLSBPWF9JRC9GRkZGIGZvciB0aGUgQ01ORCwgYW5kCisgICAgICAgICAgICAvLyBPWF9JRC9SWF9JRCBmb3IgdGhlIFhSRFkgb3IgREFUQSBmcmFtZShzKS4gIElkZWFsbHksCisgICAgICAgICAgICAvLyB3ZSB3b3VsZCBsaWtlIHRvIHN1cHBvcnQgQUJUUyBmcm9tIEluaXRpYXRvcnMgb3IgVGFyZ2V0cywKKyAgICAgICAgICAgIC8vIGJ1dCBpdCdzIG5vdCBjbGVhciB0aGF0IGNhbiBiZSBzdXBwb3J0ZWQgb24gVGFjaHlvbiBmb3IKKyAgICAgICAgICAgIC8vIGFsbCBjYXNlcyAocmVxdWlyZXMgbW9yZSBpbnZlc3RpZ2F0aW9uKS4KKyAgICAgICAgICAgIAorICAgICAgICAgIGlmKCAoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyBFeGNoYW5nZUlEXS50eXBlID09IFNDU0lfVFdFIHx8CisgICAgICAgICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIEV4Y2hhbmdlSURdLnR5cGUgPT0gU0NTSV9UUkUpCisgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICgoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyBFeGNoYW5nZUlEXS5mY2hzLmRfaWQgJiAweEZGRkZGRikgPT0KKyAgICAgICAgICAgICAoZmNocy0+c19pZCAmIDB4RkZGRkZGKSkgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIC8vIHRhcmdldCB4Y2huZ2UgcG9ydF9pZCBtYXRjaGVzIC0tIGhvdyBhYm91dCBPWF9JRD8KKyAgICAgICAgICAgIGlmKCAoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyBFeGNoYW5nZUlEXS5mY2hzLm94X3J4X2lkICYweEZGRkYwMDAwKQorICAgICAgICAgICAgICAgICAgICA9PSAoZmNocy0+b3hfcnhfaWQgJiAweEZGRkYwMDAwKSApCisgICAgICAgICAgICAgICAgICAgIC8vIHllcyEgcG9zdCBBQ0NlcHQgcmVzcG9uc2U7IHdpbGwgYmUgY29tcGxldGVkIGJ5IGZjU3RhcnQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyBFeGNoYW5nZUlEXS5zdGF0dXMgPSBUQVJHRVRfQUJPUlQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gY29weSAoYWRkKSByeF9pZCBmaWVsZCBmb3Igc2ltcGxpZmllZCBBQ0NlcHQgcmVwbHkKKyAgICAgICAgICAgICAgZmNocy0+b3hfcnhfaWQgPSAKKyAgICAgICAgICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIEV4Y2hhbmdlSURdLmZjaHMub3hfcnhfaWQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxTX0FCVFNfQUNDLCAvLyBRIFR5cGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNocyApOyAgICAvLyB2b2lkIFF1ZUNvbnRlbnQKKyAgICAgICAgICAgICAgQWJvcnRBY2NlcHQgPSBUUlVFOworICAgICAgcHJpbnRrKCJBQ0NlcHRpbmcgQUJUUyBmb3IgeF9JRCAlOC44WGgsIFNFU1QgcGFpciAlOC44WGhcbiIsIAorICAgICAgICAgICAgIGZjaHMtPm94X3J4X2lkLCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIEV4Y2hhbmdlSURdLmZjaHMub3hfcnhfaWQpOworICAgICAgICAgICAgICBicmVhazsgICAgICAvLyBBQlRTIGNhbiBhZmZlY3Qgb25seSBPTkUgZXhjaGFuZ2UgLWV4aXQgbG9vcAorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSAgLy8gZW5kIG9mIEZPUiBsb29wCisgICAgICAgIGlmKCAhQWJvcnRBY2NlcHQgKSAvLyBjYW4ndCBBQ0NlcHQgQUJUUyAtIHNlbmQgUmVqZWN0CisgICAgICAgIHsKKyAgICAgIHByaW50aygiUmVKZWNUaW5nOiBjYW4ndCBmaW5kIEV4Y2hhbmdlSUQgJTguOFhoIGZvciBBQlRTIGNvbW1hbmRcbiIsIAorICAgICAgICAgICAgZmNocy0+b3hfcnhfaWQpOworICAgICAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIEV4Y2hhbmdlSURdLnR5cGUgCisgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgIShmY0NoaXAtPlNFU1QtPnVbIEV4Y2hhbmdlSURdLklXRS5IZHJfTGVuCisgICAgICAgICAgICAgICAmIDB4ODAwMDAwMDApKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNwcWZjVFNDb21wbGV0ZUV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEtPlBjaURldiwgZmNDaGlwLCBFeGNoYW5nZUlEKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiVW5leHBlY3RlZCBBQlRTIFJlSmVjVCEgU0VTVFslWF0gRHdvcmQgMDogJVhoXG4iLCAKKyAgICAgICAgICAgICAgRXhjaGFuZ2VJRCwgZmNDaGlwLT5TRVNULT51WyBFeGNoYW5nZUlEXS5JV0UuSGRyX0xlbik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIENoZWNrIGZvciBCTFMge0FCVFM/IChBYm9ydCBTZXF1ZW5jZSl9IEFDQ2VwdAorICAgICAgZWxzZSBpZiggKGZjaHMtPmRfaWQgJiAweDhGMDAwMDAwKSA9PSAweDg0MDAwMDAwKQorICAgICAgeworICAgICAgICAvLyB0YXJnZXQgaGFzIHJlc3BvbmRlZCB3aXRoIEFDQyBmb3Igb3VyIEFCVFM7CisJLy8gY29tcGxldGUgdGhlIGluZGljYXRlZCBleGNoYW5nZSB3aXRoIEFCT1JURUQgc3RhdHVzIAorICAgICAgICAvLyBNYWtlIG5vIGNoZWNrcyBmb3IgY29ycmVjdCBSWF9JRCwgc2luY2UKKwkvLyBhbGwgd2UgbmVlZCB0byBjb25mb3JtIEFCVFMgQUNDIGlzIHRoZSBPWF9JRC4KKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGRfaWQgbWF0Y2hlcyEKKyAKKyAgICAgICAgRXhjaGFuZ2VJRCA9IChmY2hzLT5veF9yeF9pZCA+PiAxNikgJiAweDdGRkY7IC8vIHhfaWQgZnJvbSBBQ0MKKy8vCXByaW50aygiQUJUUyBBQ0MgeF9JRCAweCUwNFggMHglMDRYLCBzdGF0dXMgJVhoXG4iLCAKKy8vICAgICAgICAgIGZjaHMtPm94X3J4X2lkID4+IDE2LCBmY2hzLT5veF9yeF9pZCAmIDB4ZmZmZiwKKy8vICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtFeGNoYW5nZUlEXS5zdGF0dXMpOworCisKKwkKKyAgICAgICAgaWYoIEV4Y2hhbmdlSUQgPCBUQUNIX1NFU1RfTEVOICkgLy8geF9JRCBtYWtlcyBzZW5zZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBEb2VzICJ0YXJnZXQiIGV4Y2hhbmdlIDI0LWJpdCBwb3J0X2lkIG1hdGNoPyAKKyAgICAgICAgICAgIC8vIChTZWUgIk5PVEUiIGFib3ZlIGZvciBoYW5kbGluZyBJbnRpYXRvciBBTkQgVGFyZ2V0IGluCisgICAgICAgICAgICAvLyB0aGUgc2FtZSBkZXZpY2UgZHJpdmVyKQorICAgICAgICAgICAgLy8gRmlyc3QsIGlmIHRoaXMgaXMgYSB0YXJnZXQgcmVzcG9uc2UsIHRoZW4gd2Ugb3JpZ2luYXRlZAorCSAgICAvLyAoaW5pdGlhdGVkKSBpdCB3aXRoIEJMU19BQlRTOgorCSAgCisgICAgICAgICAgaWYoIChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIEV4Y2hhbmdlSURdLnR5cGUgPT0gQkxTX0FCVFMpCisKKyAgICAgICAgICAgICAgICAgICYmCisJICAgIC8vIFNlY29uZCwgZG9lcyB0aGUgc291cmNlIG9mIHRoaXMgQUNDIG1hdGNoIHRoZSBkZXN0aW5hdGlvbgorICAgICAgICAgICAgLy8gb2Ygd2hvIHdlIG9yaWdpbmFsbHkgc2VudCBpdCB0bz8KKyAgICAgICAgICAgICAoKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgRXhjaGFuZ2VJRF0uZmNocy5kX2lkICYgMHhGRkZGRkYpID09CisgICAgICAgICAgICAgKGZjaHMtPnNfaWQgJiAweEZGRkZGRikpICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBjcHFmY1RTQ29tcGxldGVFeGNoYW5nZSggY3BxZmNIQkFkYXRhLT5QY2lEZXYsIGZjQ2hpcCwgRXhjaGFuZ2VJRCApOworCSAgfQorICAgICAgICB9ICAgICAgICAgICAgICAKKyAgICAgIH0KKyAgICAgIC8vIENoZWNrIGZvciBCTFMge0FCVFM/IChBYm9ydCBTZXF1ZW5jZSl9IFJlSmVjVAorICAgICAgZWxzZSBpZiggKGZjaHMtPmRfaWQgJiAweDhGMDAwMDAwKSA9PSAweDg1MDAwMDAwKQorICAgICAgeworICAgICAgICAvLyB0YXJnZXQgaGFzIHJlc3BvbmRlZCB3aXRoIFJKVCBmb3Igb3VyIEFCVFM7CisJLy8gY29tcGxldGUgdGhlIGluZGljYXRlZCBleGNoYW5nZSB3aXRoIEFCT1JURUQgc3RhdHVzIAorICAgICAgICAvLyBNYWtlIG5vIGNoZWNrcyBmb3IgY29ycmVjdCBSWF9JRCwgc2luY2UKKwkvLyBhbGwgd2UgbmVlZCB0byBjb25mb3JtIEFCVFMgQUNDIGlzIHRoZSBPWF9JRC4KKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGRfaWQgbWF0Y2hlcyEKKyAKKyAgICAgICAgRXhjaGFuZ2VJRCA9IChmY2hzLT5veF9yeF9pZCA+PiAxNikgJiAweDdGRkY7IC8vIHhfaWQgZnJvbSBBQ0MKKy8vCXByaW50aygiQkxTX0FCVFMgUkpUIG9uIEV4Y2hhbmdlIDB4JTA0WCAweCUwNFhcbiIsIAorLy8gICAgICAgICAgZmNocy0+b3hfcnhfaWQgPj4gMTYsIGZjaHMtPm94X3J4X2lkICYgMHhmZmZmKTsKKworICAgICAgICBpZiggRXhjaGFuZ2VJRCA8IFRBQ0hfU0VTVF9MRU4gKSAvLyB4X0lEIG1ha2VzIHNlbnNlCisJeyAgCisgICAgICAgICAgICAvLyBEb2VzICJ0YXJnZXQiIGV4Y2hhbmdlIDI0LWJpdCBwb3J0X2lkIG1hdGNoPyAKKyAgICAgICAgICAgIC8vIChTZWUgIk5PVEUiIGFib3ZlIGZvciBoYW5kbGluZyBJbnRpYXRvciBBTkQgVGFyZ2V0IGluCisgICAgICAgICAgICAvLyB0aGUgc2FtZSBkZXZpY2UgZHJpdmVyKQorICAgICAgICAgICAgLy8gRmlyc3QsIGlmIHRoaXMgaXMgYSB0YXJnZXQgcmVzcG9uc2UsIHRoZW4gd2Ugb3JpZ2luYXRlZAorCSAgICAvLyAoaW5pdGlhdGVkKSBpdCB3aXRoIEJMU19BQlRTOgorCQkgIAorICAgICAgICAgIGlmKCAoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyBFeGNoYW5nZUlEXS50eXBlID09IEJMU19BQlRTKQorCisgICAgICAgICAgICAgICAgICAmJgorCSAgICAvLyBTZWNvbmQsIGRvZXMgdGhlIHNvdXJjZSBvZiB0aGlzIEFDQyBtYXRjaCB0aGUgZGVzdGluYXRpb24KKyAgICAgICAgICAgIC8vIG9mIHdobyB3ZSBvcmlnaW5hbGx5IHNlbnQgaXQgdG8/CisgICAgICAgICAgICAgKChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIEV4Y2hhbmdlSURdLmZjaHMuZF9pZCAmIDB4RkZGRkZGKSA9PQorICAgICAgICAgICAgIChmY2hzLT5zX2lkICYgMHhGRkZGRkYpKSApCisgICAgICAgICAgeworCSAgICAvLyBZRVMhIE5PVEU6IFRoZXJlIGlzIGEgYnVnIGluIENQUSdzIFJBLTQwMDAgYm94IAorCSAgICAvLyB3aGVyZSB0aGUgInJlYXNvbiBjb2RlIiBpc24ndCByZXR1cm5lZCBpbiB0aGUgcGF5bG9hZAorCSAgICAvLyBGb3Igbm93LCBzaW1wbHkgcHJlc3VtZSB0aGUgcmVqZWN0IGlzIGJlY2F1c2UgdGhlIHRhcmdldAorCSAgICAvLyBhbHJlYWR5IGNvbXBsZXRlZCB0aGUgZXhjaGFuZ2UuLi4KKwkgICAgCisvLyAgICAgICAgICAgIHByaW50aygiY29tcGxldGUgeF9JRCAlWGggb24gQUJUUyBSSlRcbiIsIEV4Y2hhbmdlSUQpOworICAgICAgICAgICAgY3BxZmNUU0NvbXBsZXRlRXhjaGFuZ2UoIGNwcWZjSEJBZGF0YS0+UGNpRGV2LCBmY0NoaXAsIEV4Y2hhbmdlSUQgKTsKKwkgIH0KKwl9IAorICAgICAgfSAgLy8gZW5kIG9mIEFCVFMgY2hlY2sKKyAgICB9ICAvLyBlbmQgb2YgQmFzaWMgTGluayBTZXJ2aWNlIFJlcXVlc3QKKyAgICBicmVhazsKKyAgCisgICAgZGVmYXVsdDoKKyAgICAgIHByaW50aygiQW5hbHl6ZUluY29taW5nRnJhbWU6IHVua25vd24gdHlwZTogJVhoKCVkKVxuIiwKKyAgICAgICAgZmNMUS0+UWl0ZW1bUU5keF0uVHlwZSwKKyAgICAgICAgZmNMUS0+UWl0ZW1bUU5keF0uVHlwZSk7CisgICAgYnJlYWs7CisgIH0KK30KKworCisvLyBGdW5jdGlvbiBmb3IgUG9ydCBEaXNjb3ZlcnkgbmVjZXNzYXJ5IGFmdGVyIGV2ZXJ5IEZDIAorLy8gaW5pdGlhbGl6YXRpb24gKGUuZy4gTElQKS4KKy8vIEFsc28gbWF5IGJlIGNhbGxlZCBpZiBmcm9tIEZhYnJpYyBOYW1lIFNlcnZpY2UgbG9naWMuCisKK3N0YXRpYyB2b2lkIFNlbmRMb2dpbnMoIENQUUZDSEJBICpjcHFmY0hCQWRhdGEsIF9fdTMyICpGYWJyaWNQb3J0SWRzICkKK3sKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworICBGQ19FWENIQU5HRVMgKkV4Y2hhbmdlcyA9IGZjQ2hpcC0+RXhjaGFuZ2VzOworICBVTE9ORyB1bFN0YXR1cz0wOworICBUYWNoRkNIRFJfR0NNTkQgZmNoczsgIC8vIGNvcHkgZmllbGRzIGZvciB0cmFuc21pc3Npb24KKyAgaW50IGk7CisgIFVMT05HIGxvZ2luVHlwZTsKKyAgTE9ORyBFeGNoYW5nZUlEOworICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0OworICBfX3UzMiBQb3J0SWRzWyBudW1iZXJfb2ZfYWxfcGFdOworICBpbnQgTnVtYmVyT2ZQb3J0cz0wOworCisgIC8vIFdlJ3JlIGdvaW5nIHRvIHByZXN1bWUgKGZvciBub3cpIHRoYXQgb3VyIGxpbWl0IG9mIEZhYnJpYyBkZXZpY2VzCisgIC8vIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgYWxwYSBvbiBhIHByaXZhdGUgbG9vcCAoMTI2IGRldmljZXMpLgorICAvLyAoT2YgY291cnNlIHRoaXMgY291bGQgYmUgY2hhbmdlZCB0byBzdXBwb3J0IGhvd2V2ZXIgbWFueSB3ZSBoYXZlCisgIC8vIG1lbW9yeSBmb3IpLgorICBtZW1zZXQoICZQb3J0SWRzWzBdLCAwLCBzaXplb2YoUG9ydElkcykpOworICAgCisgIC8vIEZpcnN0LCBjaGVjayBpZiB0aGlzIGxvZ2luIGlzIGZvciBvdXIgb3duIExpbmsgSW5pdGlhbGl6YXRpb24KKyAgLy8gKGUuZy4gTElQIG9uIEZDLUFMKSwgb3IgaWYgd2UgaGF2ZSBrbm93bGVkZ2Ugb2YgRmFicmljIGRldmljZXMKKyAgLy8gZnJvbSBhIHN3aXRjaC4gIElmIHdlIGFyZSBsb2dnaW5nIGludG8gRmFicmljIGRldmljZXMsIHdlJ2xsCisgIC8vIGhhdmUgYSBub24tTlVMTCBGYWJyaWNQb3J0SWQgcG9pbnRlcgorICAKKyAgaWYoIEZhYnJpY1BvcnRJZHMgIT0gTlVMTCkgLy8gbWF5IG5lZWQgbG9naW5zCisgIHsKKyAgICBpbnQgTGFzdFBvcnQ9RkFMU0U7CisgICAgaSA9IDA7CisgICAgd2hpbGUoICFMYXN0UG9ydCkKKyAgICB7CisgICAgICAvLyBwb3J0IElEcyBGcm9tIE5TUiBwYXlsb2FkOyBieXRlIHN3YXAgbmVlZGVkPworICAgICAgQmlnRW5kaWFuU3dhcCggKFVDSEFSKilGYWJyaWNQb3J0SWRzLCAoVUNIQVIqKSZQb3J0SWRzW2ldLCA0KTsKKyAKKy8vICAgICAgcHJpbnRrKCJGUG9ydElkWyVkXSAlWGggIiwgaSwgUG9ydElkc1tpXSk7CisgICAgICBpZiggUG9ydElkc1tpXSAmIDB4ODAwMDAwMDApCisJTGFzdFBvcnQgPSBUUlVFOworICAgICAgCisgICAgICBQb3J0SWRzW2ldICY9IDB4RkZGRkZGOyAvLyBnZXQgMjQtYml0IHBvcnRfaWQKKyAgICAgIC8vIHNvbWUgbm9uLUZhYnJpYyBkZXZpY2VzIChsaWtlIHRoZSBDcm9zc3JvYWRzIEZpYnJlL1Njc2kgYnJpZGdlKQorICAgICAgLy8gZXJyb25lb3VzbHkgdXNlIEFMUEEgMC4KKyAgICAgIGlmKCBQb3J0SWRzW2ldICApIC8vIG5lZWQgbm9uLXplcm8gcG9ydF9pZC4uLgorICAgICAgICBpKys7CisgICAgICAKKyAgICAgIGlmKCBpID49IG51bWJlcl9vZl9hbF9wYSApIC8vIChpbilzYW5pdHkgY2hlY2sKKwlicmVhazsKKyAgICAgIEZhYnJpY1BvcnRJZHMrKzsgIC8vIG5leHQuLi4KKyAgICB9CisKKyAgICBOdW1iZXJPZlBvcnRzID0gaTsKKy8vICAgIHByaW50aygiTnVtYmVyT2YgRmFicmljIHBvcnRzICVkIiwgTnVtYmVyT2ZQb3J0cyk7CisgIH0KKyAgCisgIGVsc2UgIC8vIG5lZWQgdG8gc2VuZCBsb2dpbnMgb24gb3VyICJsb2NhbCIgbGluaworICB7CisgIAorICAgIC8vIGFyZSB3ZSBhIGxvb3AgcG9ydD8gIElmIHNvLCBjaGVjayBmb3IgcmVjZXB0aW9uIG9mIExJTFAgZnJhbWUsCisgICAgLy8gYW5kIGlmIHJlY2VpdmVkIHVzZSBpdCAoU0FOTWFyayByZXF1aXJlbWVudCkKKyAgICBpZiggZmNDaGlwLT5PcHRpb25zLkxJTFBpbiApCisgICAgeworICAgICAgaW50IGo9MDsKKyAgICAgIC8vIHNhbml0eSBjaGVjayBvbiBudW1iZXIgb2YgQUxQQXMgZnJvbSBMSUxQIGZyYW1lLi4uCisgICAgICAvLyBGb3IgZm9ybWF0IG9mIExJTFAgZnJhbWUsIHNlZSBGQy1BTCBzcGVjcyBvciAKKyAgICAgIC8vICJGaWJyZSBDaGFubmVsIEJlbmNoIFJlZmVyZW5jZSIsIEouIFN0YWksIDE5OTUgKElTQk4gMS04Nzk5MzYtMTctOCkKKyAgICAgIC8vIEZpcnN0IGJ5dGUgaXMgbnVtYmVyIG9mIEFMUEFzCisgICAgICBpID0gZmNDaGlwLT5MSUxQbWFwWzBdID49ICgzMio0KSA/IDMyKjQgOiBmY0NoaXAtPkxJTFBtYXBbMF07CisgICAgICBOdW1iZXJPZlBvcnRzID0gaTsKKy8vICAgICAgcHJpbnRrKCIgTElMUCBhbHBhIGNvdW50ICVkICIsIGkpOworICAgICAgd2hpbGUoIGkgPiAwKQorICAgICAgeworCVBvcnRJZHNbal0gPSBmY0NoaXAtPkxJTFBtYXBbMSsgal07CisJaisrOyBpLS07CisgICAgICB9CisgICAgfQorICAgIGVsc2UgIC8vIGhhdmUgdG8gc2VuZCBsb2dpbiB0byBldmVyeWJvZHkKKyAgICB7CisgICAgICBpbnQgaj0wOworICAgICAgaSA9IG51bWJlcl9vZl9hbF9wYTsKKyAgICAgIE51bWJlck9mUG9ydHMgPSBpOworICAgICAgd2hpbGUoIGkgPiAwKQorICAgICAgeworICAgICAgICBQb3J0SWRzW2pdID0gdmFsaWRfYWxfcGFbal07IC8vIGFsbCBsZWdhbCBBTFBBcworCWorKzsgaS0tOworICAgICAgfQorICAgIH0KKyAgfQorCisKKyAgLy8gTm93IHdlIGhhdmUgYSBjb3B5IG9mIHRoZSBwb3J0X2lkcyAoYW5kIGhvdyBtYW55KS4uLgorICBmb3IoIGkgPSAwOyBpIDwgTnVtYmVyT2ZQb3J0czsgaSsrKQorICB7CisgICAgLy8gMjQtYml0IEZDIFBvcnQgSUQKKyAgICBmY2hzLnNfaWQgPSBQb3J0SWRzW2ldOyAgLy8gbm90ZTogb25seSA4LWJpdHMgdXNlZCBmb3IgQUxQQQorCisKKyAgICAvLyBkb24ndCBsb2cgaW50byBvdXJzZWx2ZXMgKExpbnV4IFNjc2kgZGlzayBzY2FuIHdpbGwgc3RvcCBvbgorICAgIC8vIG5vIFRBUkdFVCBzdXBwb3J0IGVycm9yIG9uIHVzLCBhbmQgcXVpdCB0cnlpbmcgZm9yIHJlc3Qgb2YgZGV2aWNlcykKKyAgICBpZiggKGZjaHMuc19pZCAmIDB4RkYgKSA9PSAoZmNDaGlwLT5SZWdpc3RlcnMubXlfYWxfcGEgJiAweEZGKSApCisgICAgICBjb250aW51ZTsKKworICAgIC8vIGZhYnJpYyBsb2dpbiBuZWVkZWQ/CisgICAgaWYoIChmY2hzLnNfaWQgPT0gMCkgfHwgCisgICAgICAgIChmY0NoaXAtPk9wdGlvbnMuZmFicmljID09IDEpICkKKyAgICB7CisgICAgICBmY0NoaXAtPk9wdGlvbnMuZmxvZ2kgPSAxOyAgLy8gZmFicmljIG5lZWRzIGxvbmdlciBmb3IgbG9naW4KKyAgICAgIC8vIERvIHdlIG5lZWQgRkxPR0kgb3IgRkRJU0M/CisgICAgICBwTG9nZ2VkSW5Qb3J0ID0gZmNGaW5kTG9nZ2VkSW5Qb3J0KCAKKyAgICAgICAgICAgICBmY0NoaXAsIAorICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAvLyBkb24ndCBzZWFyY2ggU0NTSSBOZXh1cworICAgICAgICAgICAgIDB4RkZGRkZDLCAgICAgICAvLyBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIEZhYnJpYyBwb3J0X2lkCisgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgIC8vIGRvbid0IHNlYXJjaCBXV04KKyAgICAgICAgICAgICBOVUxMKTsgICAgICAgICAgLy8gKGRvbid0IGNhcmUgYWJvdXQgZW5kIG9mIGxpc3QpCisKKyAgICAgIGlmKCBwTG9nZ2VkSW5Qb3J0ICkgICAgLy8gSWYgZm91bmQsIHdlIGhhdmUgcHJpb3IgZXhwZXJpZW5jZSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgcG9ydCAtLSBjaGVjayB3aGV0aGVyIFBESVNDIGlzIG5lZWRlZAorICAgICAgeworICAgICAgICBpZiggcExvZ2dlZEluUG9ydC0+ZmxvZ2kgKQorCXsKKwkgIC8vIGRvZXMgdGhlIHN3aXRjaCBzdXBwb3J0IEZESVNDPz8gKEZMT0dJIGZvciBub3cuLi4pCisgICAgICAgICAgbG9naW5UeXBlID0gRUxTX0ZMT0dJOyAgLy8gcHJpb3IgRkxPR0kgc3RpbGwgdmFsaWQKKwl9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBsb2dpblR5cGUgPSBFTFNfRkxPR0k7ICAvLyBleHBpcmVkIEZMT0dJCisgICAgICB9CisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IEZMT0dJPworICAgICAgICBsb2dpblR5cGUgPSBFTFNfRkxPR0k7ICAKKworCisgICAgICBmY2hzLnNfaWQgPSAweEZGRkZGRTsgICAvLyB3ZWxsIGtub3duIEZfUG9ydCBhZGRyZXNzCisKKyAgICAgIC8vIEZhYnJpY3MgYXJlIG5vdCByZXF1aXJlZCB0byBzdXBwb3J0IEZESVNDLCBhbmQKKyAgICAgIC8vIGl0J3Mgbm90IGNsZWFyIGlmIHRoYXQgaGVscHMgdXMgYW55d2F5LCBzaW5jZQorICAgICAgLy8gd2UnbGwgd2FudCBhIE5hbWUgU2VydmljZSBSZXF1ZXN0IHRvIHJlLXZlcmlmeQorICAgICAgLy8gdmlzaWJsZSBkZXZpY2VzLi4uCisgICAgICAvLyBDb25zZXF1ZW50bHksIHdlIGFsd2F5cyB3YW50IG91ciB1cHBlciAxNiBiaXQKKyAgICAgIC8vIHBvcnRfaWQgdG8gYmUgemVybyAod2UnbGwgYmUgcmVqZWN0ZWQgaWYgd2UKKyAgICAgIC8vIHVzZSBvdXIgcHJpb3IgcG9ydF9pZCBpZiB3ZSd2ZSBiZWVuIHBsdWdnZWQgaW50bworICAgICAgLy8gYSBkaWZmZXJlbnQgc3dpdGNoIHBvcnQpLgorICAgICAgLy8gVHJpY2sgVGFjaHlvbiB0byBzZW5kIHRvIEFMUEEgMCAoc2VlIFRML1RTIFVHLCBwZyA4NykKKyAgICAgIC8vIElmIG91ciBBTFBBIGlzIDU1aCBmb3IgaW5zdGFuY2UsIHdlIHdhbnQgdGhlIEZDIGZyYW1lCisgICAgICAvLyBzX2lkIHRvIGJlIDB4MDAwMDU1LCB3aGlsZSBUYWNoJ3MgbXlfYWxfcGEgcmVnaXN0ZXIKKyAgICAgIC8vIG11c3QgYmUgMHgwMDAxNTUsIHRvIGZvcmNlIGFuIE9QTiBhdCBBTFBBIDAgCisgICAgICAvLyAodGhlIEZhYnJpYyBwb3J0KQorICAgICAgZmNDaGlwLT5SZWdpc3RlcnMubXlfYWxfcGEgJj0gMHhGRjsgLy8gb25seSB1c2UgQUxQQSBmb3IgRkxPR0kKKyAgICAgIHdyaXRlbCggZmNDaGlwLT5SZWdpc3RlcnMubXlfYWxfcGEgfCAweDAxMDAsICAKKyAgICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX1RBQ0hfTXlfSUQpOworICAgIH0KKworICAgIGVsc2UgLy8gbm90IEZMT0dJLi4uCisgICAgeworICAgICAgLy8gc2hvdWxkIHdlIHNlbmQgUExPR0kgb3IgUERJU0M/ICBDaGVjayBpZiBhbnkgcHJpb3IgcG9ydF9pZAorICAgICAgLy8gKGUuZy4gYWxwYSkgY29tcGxldGVkIGEgUExPR0kvUFJMSSBleGNoYW5nZSBieSBjaGVja2luZyAKKyAgICAgIC8vIHRoZSBwZGlzYyBmbGFnLgorCisgICAgICBwTG9nZ2VkSW5Qb3J0ID0gZmNGaW5kTG9nZ2VkSW5Qb3J0KCAKKyAgICAgICAgICAgICBmY0NoaXAsIAorICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAvLyBkb24ndCBzZWFyY2ggU0NTSSBOZXh1cworICAgICAgICAgICAgIGZjaHMuc19pZCwgICAgICAvLyBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIGFsX3BhCisgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgIC8vIGRvbid0IHNlYXJjaCBXV04KKyAgICAgICAgICAgICBOVUxMKTsgICAgICAgICAgLy8gKGRvbid0IGNhcmUgYWJvdXQgZW5kIG9mIGxpc3QpCisKKyAgICAgICAgICAgICAKKworICAgICAgaWYoIHBMb2dnZWRJblBvcnQgKSAgICAgIC8vIElmIGZvdW5kLCB3ZSBoYXZlIHByaW9yIGV4cGVyaWVuY2Ugd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHBvcnQgLS0gY2hlY2sgd2hldGhlciBQRElTQyBpcyBuZWVkZWQKKyAgICAgIHsKKyAgICAgICAgaWYoIHBMb2dnZWRJblBvcnQtPnBkaXNjICkKKwl7CisgICAgICAgICAgbG9naW5UeXBlID0gRUxTX1BESVNDOyAgLy8gcHJpb3IgUExPR0kgYW5kIFBSTEkgbWF5YmUgc3RpbGwgdmFsaWQKKyAgICAgICAgICAgCisJfQorICAgICAgICBlbHNlCisgICAgICAgICAgbG9naW5UeXBlID0gRUxTX1BMT0dJOyAgLy8gcHJpb3Iga25vd2xlZGdlLCBidXQgY2FuJ3QgdXNlIFBESVNDCisgICAgICB9CisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIHRhbGtlZCB0byB0aGlzIHBvcnRfaWQgYmVmb3JlCisgICAgICAgIGxvZ2luVHlwZSA9IEVMU19QTE9HSTsgIC8vIHByaW9yIGtub3dsZWRnZSwgYnV0IGNhbid0IHVzZSBQRElTQworICAgIH0KKworCisgICAgCisgICAgdWxTdGF0dXMgPSBjcHFmY1RTQnVpbGRFeGNoYW5nZSgKKyAgICAgICAgICBjcHFmY0hCQWRhdGEsCisgICAgICAgICAgbG9naW5UeXBlLCAgICAgICAgICAgIC8vIGUuZy4gUExPR0kKKyAgICAgICAgICAmZmNocywgICAgICAgIC8vIG5vIGluY29taW5nIGZyYW1lICh3ZSBhcmUgb3JpZ2luYXRvcikKKyAgICAgICAgICBOVUxMLCAgICAgICAgIC8vIG5vIGRhdGEgKG5vIHNjYXR0ZXIvZ2F0aGVyIGxpc3QpCisgICAgICAgICAgJkV4Y2hhbmdlSUQgKTsvLyBmY0NvbnRyb2xsZXItPmZjRXhjaGFuZ2VzIGluZGV4LCAtMSBpZiBmYWlsZWQKKworICAgIGlmKCAhdWxTdGF0dXMgKSAvLyBFeGNoYW5nZSBzZXR1cCBPSz8KKyAgICB7CisgICAgICB1bFN0YXR1cyA9IGNwcWZjVFNTdGFydEV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEsIEV4Y2hhbmdlSUQgKTsKKyAgICAgIGlmKCAhdWxTdGF0dXMgKQorICAgICAgeworICAgICAgICAgIC8vIHN1Ym1pdHRlZCB0byBUYWNoJ3MgT3V0Ym91bmQgUXVlIChFUlEgUEkgaW5jcmVtZW50ZWQpCisgICAgICAgICAgLy8gd2FpdGVkIGZvciBjb21wbGV0aW9uIGZvciBFTFMgdHlwZSAoTG9naW4gZnJhbWVzIGlzc3VlZAorICAgICAgICAgIC8vIHN5bmNocm9ub3VzbHkpCisKKwlpZiggbG9naW5UeXBlID09IEVMU19QRElTQyApCisJeworCSAgLy8gbm93LCB3ZSByZWFsbHkgc2hvdWxkbid0IFJldmFsaWRhdGUgU0VTVCBleGNoYW5nZXMgdW50aWwKKwkgIC8vIHdlIGdldCBhbiBBQ0MgcmVwbHkgZnJvbSBvdXIgdGFyZ2V0IGFuZCB2ZXJpZnkgdGhhdAorCSAgLy8gdGhlIHRhcmdldCBhZGRyZXNzL1dXTiBpcyB1bmNoYW5nZWQuICBIb3dldmVyLCB3aGVuIGEgZmFzdAorCSAgLy8gdGFyZ2V0IGdldHMgdGhlIFBESVNDLCB0aGV5IGNhbiBzZW5kIFNFU1QgRXhjaGFuZ2UgZGF0YQorCSAgLy8gYmVmb3JlIHdlIGV2ZW4gZ2V0IGFyb3VuZCB0byBwcm9jZXNzaW5nIHRoZSBQRElTQyBBQ0MuCisJICAvLyBDb25zZXF1ZW50bHksIHdlIGxvc2UgdGhlIEkvTy4KKwkgIC8vIFRvIGF2b2lkIHRoaXMsIGdvIGFoZWFkIGFuZCBSZXZhbGlkYXRlIHdoZW4gdGhlIFBESVNDIGdvZXMKKwkgIC8vIG91dCwgYW50aWNpcGF0aW5nIHRoYXQgdGhlIEFDQyB3aWxsIGJlIHRydWx5IGFjY2VwdGFibGUKKwkgIC8vICh0aGlzIGhhcHBlbnMgOTkuOTk5OS4uLi4lIG9mIHRoZSB0aW1lKS4KKwkgIC8vIElmIHdlIHJldmFsaWRhdGUgYSBTRVNUIHdyaXRlLCBhbmQgd3JpdGUgZGF0YSBnb2VzIHRvIGEKKwkgIC8vIHRhcmdldCB0aGF0IGlzIE5PVCB0aGUgb25lIHdlIG9yaWdpbmF0ZWQgdGhlIFdSSVRFIHRvLAorCSAgLy8gdGhhdCB0YXJnZXQgaXMgcmVxdWlyZWQgKEZDUC1TQ1NJIHNwZWNzLCBldGMpIHRvIGRpc2NhcmQgCisJICAvLyBvdXIgV1JJVEUgZGF0YS4KKworICAgICAgICAgIC8vIFJlLXZhbGlkYXRlIFNFU1QgZW50cmllcyAoVGFjaHlvbiBoYXJkd2FyZSBhc3Npc3RzKQorICAgICAgICAgIFJldmFsaWRhdGVTRVNUKCBjcHFmY0hCQWRhdGEtPkhvc3RBZGFwdGVyLCBwTG9nZ2VkSW5Qb3J0KTsgCisgICAgLy9UcmlnZ2VySEJBKCBmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UsIDEpOworCX0KKyAgICAgIH0KKyAgICAgIGVsc2UgIC8vIGdpdmUgdXAgaW1tZWRpYXRlbHkgb24gZXJyb3IKKyAgICAgIHsKKyNpZmRlZiBMT0dJTl9EQkcKKyAgICAgICAgcHJpbnRrKCJTZW5kTG9naW5zOiBmY1N0YXJ0RXhjaGFuZ2UgZmFpbGVkOiAlWGhcbiIsIHVsU3RhdHVzICk7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgICAgICAgCisgICAgICBpZiggZmNDaGlwLT5SZWdpc3RlcnMuRk1zdGF0dXMudmFsdWUgJiAweDA4MCApIC8vIExEbiBkdXJpbmcgUG9ydCBEaXNjLgorICAgICAgeworICAgICAgICB1bFN0YXR1cyA9IExOS0RXTl9PU0xTOworI2lmZGVmIExPR0lOX0RCRworICAgICAgICBwcmludGsoIlNlbmRMb2dpbnM6IFBvcnREaXNjIGFib3J0ZWQgKExEbikgQGFscGEgJVhoXG4iLCBmY2hzLnNfaWQpOworI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgICAvLyBDaGVjayB0aGUgZXhjaGFuZ2UgZm9yIGJhZCBzdGF0dXMgKGkuZS4gRnJhbWVUaW1lT3V0KSwKKyAgICAgICAgLy8gYW5kIGNvbXBsZXRlIG9uIGJhZCBzdGF0dXMgKG1vc3QgbGlrZWx5IGR1ZSB0byBCQURfQUxQQSkKKyAgICAgICAgLy8gb24gTERuLCBEUEMgZnVuY3Rpb24gbWF5IGFscmVhZHkgY29tcGxldGUgKEFCT1JUKSBhIHN0YXJ0ZWQKKyAgICAgICAgLy8gZXhjaGFuZ2UsIHNvIGNoZWNrIHR5cGUgZmlyc3QgKHR5cGUgPSAwIG9uIGNvbXBsZXRlKS4KKyAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbRXhjaGFuZ2VJRF0uc3RhdHVzICkKKyAgICAgIHsKKyNpZmRlZiBMT0dJTl9EQkcgCisgCXByaW50aygiY29tcGxldGluZyB4X0lEICVYIG9uIHN0YXR1cyAlWGhcbiIsIAorICAgICAgICAgIEV4Y2hhbmdlSUQsIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtFeGNoYW5nZUlEXS5zdGF0dXMpOworI2VuZGlmCisgICAgICAgIGNwcWZjVFNDb21wbGV0ZUV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEtPlBjaURldiwgZmNDaGlwLCBFeGNoYW5nZUlEKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgIC8vIFhjaGFuZ2Ugc2V0dXAgZmFpbGVkLi4uCisgICAgeworI2lmZGVmIExPR0lOX0RCRworICAgICAgcHJpbnRrKCJGQzogY3BxZmNUU0J1aWxkRXhjaGFuZ2UgZmFpbGVkOiAlWGhcbiIsIHVsU3RhdHVzICk7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiggIXVsU3RhdHVzICkKKyAgeworICAgIC8vIHNldCB0aGUgZXZlbnQgc2lnbmlmeWluZyB0aGF0IGFsbCBBTFBBcyB3ZXJlIHNlbnQgb3V0LgorI2lmZGVmIExPR0lOX0RCRworICAgIHByaW50aygiU2VuZExvZ2luczogUG9ydERpc2NEb25lXG4iKTsKKyNlbmRpZgorICAgIGNwcWZjSEJBZGF0YS0+UG9ydERpc2NEb25lID0gMTsKKworCisgICAgLy8gVEwvVFMgVUcsIHBnLiAxODQKKyAgICAvLyAweDAwNjUgPSAxMDBtcyBmb3IgUlRfVE9WCisgICAgLy8gMHgwMWY1ID0gNTAwbXMgZm9yIEVEX1RPVgorICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLmVkX3Rvdi52YWx1ZSA9IDB4MDA2NTAxZjVMOyAKKyAgICB3cml0ZWwoIGZjQ2hpcC0+UmVnaXN0ZXJzLmVkX3Rvdi52YWx1ZSwKKyAgICAgIChmY0NoaXAtPlJlZ2lzdGVycy5lZF90b3YuYWRkcmVzcykpOworCisgICAgLy8gc2V0IHRoZSBMUF9UT1YgYmFjayB0byBFRF9UT1YgKGkuZS4gNTAwIG1zKQorICAgIHdyaXRlbCggMHgwMDAwMDAxMCwgZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICtUTF9NRU1fRk1fVElNRU9VVDIpOworICB9CisgIGVsc2UKKyAgeworICAgIHByaW50aygiU2VuZExvZ2luczogZmFpbGVkIGF0IHhjaG5nICVYaCwgYWxwYSAlWGgsIHN0YXR1cyAlWGhcbiIsIAorICAgICAgRXhjaGFuZ2VJRCwgZmNocy5zX2lkLCB1bFN0YXR1cyk7CisgIH0KKyAgTEVBVkUoIlNlbmRMb2dpbnMiKTsKKworfQorCisKKy8vIGZvciBSRVBPUlRfTFVOUyBkb2N1bWVudGF0aW9uLCBzZWUgIkluLURlcHRoIEV4cGxvcmF0aW9uIG9mIFNjc2kiLAorLy8gRC4gRGVtaW5nLCAxOTk0LCBwZyA3LTE5IChJU0JOIDEtODc5OTM2LTA4LTkpCitzdGF0aWMgdm9pZCBTY3NpUmVwb3J0THVuc0RvbmUoU2NzaV9DbW5kICpDbW5kKQoreworICBzdHJ1Y3QgU2NzaV9Ib3N0ICpIb3N0QWRhcHRlciA9IENtbmQtPmRldmljZS0+aG9zdDsKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSA9IChDUFFGQ0hCQSAqKUhvc3RBZGFwdGVyLT5ob3N0ZGF0YTsKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworICBGQ19FWENIQU5HRVMgKkV4Y2hhbmdlcyA9IGZjQ2hpcC0+RXhjaGFuZ2VzOworICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0OyAKKyAgaW50IEx1bkxpc3RMZW49MDsKKyAgaW50IGk7CisgIFVMT05HIHhfSUQgPSAweEZGRkZGRkZGOworICBVQ0hBUiAqdWNCdWZmID0gQ21uZC0+cmVxdWVzdF9idWZmZXI7CisKKy8vICBwcmludGsoImNwcWZjVFM6IFJlcG9ydEx1bnNEb25lIFxuIik7CisgIC8vIGZpcnN0LCB3ZSBuZWVkIHRvIGZpbmQgdGhlIEV4Y2hhbmdlIGZvciB0aGlzIGNvbW1hbmQsCisgIC8vIHNvIHdlIGNhbiBmaW5kIHRoZSBmY1BvcnQgc3RydWN0IHRvIG1ha2UgdGhlIGluZGljYXRlZAorICAvLyBjaGFuZ2VzLgorICBmb3IoIGk9MDsgaTwgVEFDSF9TRVNUX0xFTjsgaSsrKQorICB7CisgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS50eXBlICAgLy8gZXhjaGFuZ2UgZGVmaW5lZD8KKyAgICAgICAgICAgICAgICAgICAmJgorICAgICAgIChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbaV0uQ21uZCA9PSBDbW5kKSApIC8vIG1hdGNoZXM/CisJICAgICAgCisgICAgeworICAgICAgeF9JRCA9IGk7ICAvLyBmb3VuZCBleGNoYW5nZSEKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiggeF9JRCA9PSAweEZGRkZGRkZGKQorICB7CisvLyAgICBwcmludGsoImNwcWZjVFM6IFJlcG9ydEx1bnMgZmFpbGVkIC0gbm8gRkMgRXhjaGFuZ2VcbiIpOworICAgIGdvdG8gRG9uZTsgIC8vIFJlcG9ydCBMdW5zIEZDIEV4Y2hhbmdlIGdvbmU7IAorICAgICAgICAgICAgICAgIC8vIGV4Y2hhbmdlIHByb2JhYmx5IFRlcm1pbmF0ZWQgYnkgSW1wbGljaXQgbG9nb3V0CisgIH0KKworCisgIC8vIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgdGhlIHBvcnRfaWQgd2Ugc2VudCBJTlFVSVJZIHRvCisgIHBMb2dnZWRJblBvcnQgPSBmY0ZpbmRMb2dnZWRJblBvcnQoIGZjQ2hpcCwKKyAgICBOVUxMLCAgICAgLy8gRE9OJ1Qgc2VhcmNoIFNjc2kgTmV4dXMgKHdlIHdpbGwgc2V0IGl0KQorICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRF0uZmNocy5kX2lkICYgMHhGRkZGRkYsICAgICAgICAKKyAgICBOVUxMLCAgICAgLy8gRE9OJ1Qgc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBGQyBXV04KKyAgICBOVUxMKTsgICAgLy8gRE9OJ1QgY2FyZSBhYm91dCBlbmQgb2YgbGlzdAorIAorICBpZiggIXBMb2dnZWRJblBvcnQgKQorICB7CisvLyAgICBwcmludGsoImNwcWZjVFM6IFJlcG9ydEx1bnMgZmFpbGVkIC0gZGV2aWNlIGdvbmVcbiIpOworICAgIGdvdG8gRG9uZTsgLy8gZXJyb3IhIGNhbid0IGZpbmQgbG9nZ2VkIGluIFBvcnQKKyAgfSAgICAKKyAgTHVuTGlzdExlbiA9IHVjQnVmZlszXTsKKyAgTHVuTGlzdExlbiArPSB1Y0J1ZmZbMl0+Pjg7CisKKyAgaWYoICFMdW5MaXN0TGVuICkgIC8vIGZhaWxlZAorICB7CisgICAgLy8gZ2VuZXJpY2FsbHkgc3BlYWtpbmcsIGEgc29mdCBlcnJvciBtZWFucyB3ZSBzaG91bGQgcmV0cnkuLi4KKyAgICBpZiggKENtbmQtPnJlc3VsdCA+PiAxNikgPT0gRElEX1NPRlRfRVJST1IgKQorICAgIHsKKyAgICAgIGlmKCAoKENtbmQtPnNlbnNlX2J1ZmZlclsyXSAmIDB4RikgPT0gMHg2KSAmJgorCSAgICAgICAgKENtbmQtPnNlbnNlX2J1ZmZlclsxMl0gPT0gMHgyOSkgKSAvLyBTZW5zZSBDb2RlICJyZXNldCIKKyAgICAgIHsKKyAgICAgICAgVGFjaEZDSERSX0dDTU5EICpmY2hzID0gJkV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRF0uZmNoczsKKyAgICAgIC8vIGRpZCB3ZSBmYWlsIGJlY2F1c2Ugb2YgImNoZWNrIGNvbmRpdGlvbiwgZGV2aWNlIHJlc2V0PyIKKyAgICAgIC8vIGUuZy4gdGhlIGRldmljZSB3YXMgcmVzZXQgKGkuZS4sIGF0IGV2ZXJ5IHBvd2VyIHVwKQorICAgICAgLy8gcmV0cnkgdGhlIFJlcG9ydCBMdW5zCisgICAgICAKKyAgICAgIC8vIHdobyBhcmUgd2Ugc2VuZGluZyBpdCB0bz8KKyAgICAgIC8vIHdlIGtub3cgdGhpcyBiZWNhdXNlIHdlIGhhdmUgYSBjb3B5IG9mIHRoZSBjb21tYW5kCisgICAgICAvLyBmcmFtZSBmcm9tIHRoZSBvcmlnaW5hbCBSZXBvcnQgTHVuIGNvbW1hbmQgLQorICAgICAgLy8gc3dpdGNoIHRoZSBkX2lkL3NfaWQgZmllbGRzLCBiZWNhdXNlIHRoZSBFeGNoYW5nZSBCdWlsZAorICAgICAgLy8gY29udGV4dCBpcyAicmVwbHkgdG8gc291cmNlIi4KKyAgICAgIAorICAgICAgICBmY2hzLT5zX2lkID0gZmNocy0+ZF9pZDsgLy8gKHRlbXBvcmFyaWx5IHJlLXVzZSB0aGUgc3RydWN0KQorICAgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLCBTQ1NJX1JFUE9SVF9MVU5TLCBmY2hzICk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgIC8vIHByb2JhYmx5LCB0aGUgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBSZXBvcnQgTHVucworICAgICAgcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLlZvbHVtZVNldEFkZHJlc3NpbmcgPSAwOyAgCisgIH0KKyAgZWxzZSAgLy8gd2UgaGF2ZSBMVU4gaW5mbyAtIGNoZWNrIFZTQSBtb2RlCisgIHsKKyAgICAvLyBmb3Igbm93LCBhc3N1bWUgYWxsIExVTnMgd2lsbCBoYXZlIHNhbWUgYWRkciBtb2RlCisgICAgLy8gZm9yIFZTQSwgcGF5bG9hZCBieXRlIDggd2lsbCBiZSAweDQwOyBvdGhlcndpc2UsIDAKKyAgICBwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMuVm9sdW1lU2V0QWRkcmVzc2luZyA9IHVjQnVmZls4XTsgIAorICAgICAgCisgICAgLy8gU2luY2Ugd2UgZ290IGEgUmVwb3J0IEx1bnMgYW5zd2VyLCBzZXQgbHVuIG1hc2tpbmcgZmxhZworICAgIHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy5MdW5NYXNraW5nID0gMTsKKworICAgIGlmKCBMdW5MaXN0TGVuID4gOCpDUFFGQ1RTX01BWF9MVU4pICAgLy8gV2UgZXhwZWN0IENQUUZDVFNfTUFYX0xVTiBtYXgKKyAgICAgIEx1bkxpc3RMZW4gPSA4KkNQUUZDVFNfTUFYX0xVTjsKKworLyogICAKKyAgICBwcmludGsoIkRldmljZSBXV04gJTA4WCUwOFggUmVwb3J0cyBMdW5zIEA6ICIsIAorICAgICAgICAgIChVTE9ORykocExvZ2dlZEluUG9ydC0+dS5saVdXTiAmMHhGRkZGRkZGRiksIAorICAgICAgICAgIChVTE9ORykocExvZ2dlZEluUG9ydC0+dS5saVdXTj4+MzIpKTsKKwkgICAgCisgICAgZm9yKCBpPTg7IGk8THVuTGlzdExlbis4OyBpKz04KQorICAgIHsgIAorICAgICAgcHJpbnRrKCIlMDJYJTAyWCAiLCB1Y0J1ZmZbaV0sIHVjQnVmZltpKzFdICk7CisgICAgfQorICAgIHByaW50aygiXG4iKTsKKyovCisgICAgCisgICAgLy8gU2luY2UgdGhlIGRldmljZSB3YXMga2luZCBlbm91Z2ggdG8gdGVsbCB1cyB3aGVyZSB0aGUKKyAgICAvLyBMVU5zIGFyZSwgbGV0cyBlbnN1cmUgdGhleSBhcmUgY29udGlndW91cyBmb3IgTGludXgncworICAgIC8vIFNDU0kgZHJpdmVyIHNjYW4sIHdoaWNoIGV4cGVjdHMgdGhlbSB0byBzdGFydCBhdCAwLgorICAgIC8vIFNpbmNlIExpbnV4IG9ubHkgc3VwcG9ydHMgOCBMVU5zLCBvbmx5IGNvcHkgdGhlIGZpcnN0CisgICAgLy8gZWlnaHQgZnJvbSB0aGUgcmVwb3J0IGx1bnMgY29tbWFuZAorCisgICAgLy8gZS5nLiwgdGhlIENvbXBhcSBSQTR4MDAgZi93IFJldiAyLjU0IGFuZCBhYm92ZSBtYXkgcmVwb3J0CisgICAgLy8gTFVOcyA0MDAxLCA0MDA0LCBldGMuLCBiZWNhdXNlIG90aGVyIExVTnMgYXJlIG1hc2tlZCBmcm9tCisgICAgLy8gdGhpcyBIQkEgKG93bmVkIGJ5IHNvbWVvbmUgZWxzZSkuICBXZSdsbCBtYWtlIHRob3NlIGFwcGVhciBhcworICAgIC8vIExVTiAwLCAxLi4uIHRvIExpbnV4CisgICAgeworICAgICAgaW50IGo7CisgICAgICBpbnQgQXBwZW5kTHVuTGlzdCA9IDA7CisgICAgICAvLyBXYWxrIHRocm91Z2ggdGhlIExVTiBsaXN0LiAgVGhlICdqJyBhcnJheSBudW1iZXIgaXMKKyAgICAgIC8vIExpbnV4J3MgbHVuICMsIHdoaWxlIHRoZSB2YWx1ZSBvZiAubHVuW2pdIGlzIHRoZSB0YXJnZXQncworICAgICAgLy8gbHVuICMuCisgICAgICAvLyBPbmNlIHdlIGJ1aWxkIGEgTFVOIGxpc3QsIGl0J3MgcG9zc2libGUgZm9yIGEga25vd24gZGV2aWNlIAorICAgICAgLy8gdG8gZ28gb2ZmbGluZSB3aGlsZSB2b2x1bWVzIChMVU5zKSBhcmUgYWRkZWQuICBMYXRlciwKKyAgICAgIC8vIHRoZSBkZXZpY2Ugd2lsbCBkbyBhbm90aGVyIFBMT0dJIC4uLiBSZXBvcnQgTHVucyBjb21tYW5kLAorICAgICAgLy8gYW5kIHdlIG11c3Qgbm90IGFsdGVyIHRoZSBleGlzdGluZyBMaW51eCBMdW4gbWFwLgorICAgICAgLy8gKFRoaXMgd2lsbCBiZSB2ZXJ5IHJhcmUpLgorICAgICAgZm9yKCBqPTA7IGogPCBDUFFGQ1RTX01BWF9MVU47IGorKykKKyAgICAgIHsKKyAgICAgICAgaWYoIHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy5sdW5bal0gIT0gMHhGRiApCisJeworCSAgQXBwZW5kTHVuTGlzdCA9IDE7CisJICBicmVhazsKKwl9CisgICAgICB9CisgICAgICBpZiggQXBwZW5kTHVuTGlzdCApCisgICAgICB7CisJaW50IGs7CisgICAgICAgIGludCBGcmVlTHVuSW5kZXg7CisvLyAgICAgICAgcHJpbnRrKCJjcHFmY1RTOiBBcHBlbmRMdW5MaXN0XG4iKTsKKworCS8vIElmIHdlIGdldCBhIG5ldyBSZXBvcnQgTHVucywgd2UgY2Fubm90IGNoYW5nZQorCS8vIGFueSBleGlzdGluZyBMVU4gbWFwcGluZyEgKE9ubHkgYWRkaXRpdmUgZW50cnkpCisJLy8gRm9yIGFsbCBMVU5zIGluIFJlcG9ydEx1biBsaXN0CisJLy8gaWYgUkwgbHVuICE9IFNjc2lOZXh1cyBsdW4KKwkvLyAgIGlmIFJMIGx1biBwcmVzZW50IGluIFNjc2lOZXh1cyBsdW5bXSwgY29udGludWUKKwkvLyAgIGVsc2UgZmluZCBTY3NpTmV4dXMgbHVuW109PUZGIGFuZCBhZGQsIGNvbnRpbnVlCisJCisgICAgICAgIGZvciggaT04LCBqPTA7IGk8THVuTGlzdExlbis4ICYmIGo8IENQUUZDVFNfTUFYX0xVTjsgaSs9OCwgaisrKQorCXsKKyAgICAgICAgICBpZiggcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLmx1bltqXSAhPSB1Y0J1ZmZbaSsxXSApCisJICB7CisJICAgIC8vIHNvbWV0aGluZyBjaGFuZ2VkIGZyb20gdGhlIGxhc3QgUmVwb3J0IEx1bnMKKwkgICAgcHJpbnRrKCIgY3BxZmNUUzogUmVwb3J0IEx1biBjaGFuZ2UhXG4iKTsKKwkgICAgZm9yKCBrPTAsIEZyZWVMdW5JbmRleD1DUFFGQ1RTX01BWF9MVU47IAorICAgICAgICAgICAgICAgICBrIDwgQ1BRRkNUU19NQVhfTFVOOyBrKyspCisgICAgICAgICAgICB7CisJICAgICAgaWYoIHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy5sdW5ba10gPT0gMHhGRikKKwkgICAgICB7CisJCUZyZWVMdW5JbmRleCA9IGs7CisJCWJyZWFrOworCSAgICAgIH0KKyAgICAgICAgICAgICAgaWYoIHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy5sdW5ba10gPT0gdWNCdWZmW2krMV0gKQorCQlicmVhazsgLy8gd2UgYWxyZWFkeSBtYXNrZWQgdGhpcyBsdW4KKwkgICAgfQorCSAgICBpZiggayA+PSBDUFFGQ1RTX01BWF9MVU4gKQorCSAgICB7CisJICAgICAgcHJpbnRrKCIgbm8gcm9vbSBmb3IgbmV3IExVTiAlZFxuIiwgdWNCdWZmW2krMV0pOworCSAgICB9CisJICAgIGVsc2UgaWYoIGsgPT0gRnJlZUx1bkluZGV4ICkgIC8vIG5lZWQgdG8gYWRkIExVTgorCSAgICB7CisJICAgICAgcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLmx1bltrXSA9IHVjQnVmZltpKzFdOworLy8JICAgICAgcHJpbnRrKCJhZGQgWyVkXS0+JTAyZFxuIiwgaywgcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLmx1bltrXSk7CisJICAgICAgCisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJICAgICAgLy8gbHVuIGFscmVhZHkga25vd24KKwkgICAgfQorCSAgICBicmVhazsKKwkgIH0KKwl9CisJLy8gcHJpbnQgb3V0IHRoZSBuZXcgbGlzdC4uLgorCWZvciggaj0wOyBqPCBDUFFGQ1RTX01BWF9MVU47IGorKykKKwl7CisJICBpZiggcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLmx1bltqXSA9PSAweEZGKQorCSAgICBicmVhazsgLy8gZG9uZQorLy8JICBwcmludGsoIlslZF0tPiUwMmQgIiwgaiwgcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLmx1bltqXSk7CisJfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworLy8JICBwcmludGsoIkxpbnV4IFNDU0kgTFVOc1tdIC0+IERldmljZSBMVU5zOiAiKTsKKwkvLyBmaXJzdCB0aW1lIC0gdGhpcyBpcyBlYXN5CisgICAgICAgIGZvciggaT04LCBqPTA7IGk8THVuTGlzdExlbis4ICYmIGo8IENQUUZDVFNfTUFYX0xVTjsgaSs9OCwgaisrKQorCXsKKyAgICAgICAgICBwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMubHVuW2pdID0gdWNCdWZmW2krMV07CisvLwkgIHByaW50aygiWyVkXS0+JTAyZCAiLCBqLCBwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMubHVuW2pdKTsKKwl9CisvLwlwcmludGsoIlxuIik7CisgICAgICB9CisgICAgfQorICB9CisKK0RvbmU6IDsKK30KKworZXh0ZXJuIGludCBpc19wcml2YXRlX2RhdGFfb2ZfY3BxZmMoQ1BRRkNIQkEgKmhiYSwgdm9pZCAqIHBvaW50ZXIpOworZXh0ZXJuIHZvaWQgY3BxZmNfZnJlZV9wcml2YXRlX2RhdGEoQ1BRRkNIQkEgKmhiYSwgY3BxZmNfcGFzc3RocnVfcHJpdmF0ZV90ICpkYXRhKTsKKworc3RhdGljIHZvaWQgCitjYWxsX3Njc2lfZG9uZShTY3NpX0NtbmQgKkNtbmQpCit7CisJQ1BRRkNIQkEgKmhiYTsKKwloYmEgPSAoQ1BRRkNIQkEgKikgQ21uZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwkvLyBXYXMgdGhpcyBjb21tYW5kIGEgY3BxZmMgcGFzc3RocnUgaW9jdGwgPworICAgICAgICBpZiAoQ21uZC0+c2NfcmVxdWVzdCAhPSBOVUxMICYmIENtbmQtPmRldmljZS0+aG9zdCAhPSBOVUxMICYmIAorCQlDbW5kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhICE9IE5VTEwgJiYKKwkJaXNfcHJpdmF0ZV9kYXRhX29mX2NwcWZjKChDUFFGQ0hCQSAqKSBDbW5kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhLAorCQkJQ21uZC0+c2NfcmVxdWVzdC0+dXBwZXJfcHJpdmF0ZV9kYXRhKSkgeworCQljcHFmY19mcmVlX3ByaXZhdGVfZGF0YShoYmEsIAorCQkJQ21uZC0+c2NfcmVxdWVzdC0+dXBwZXJfcHJpdmF0ZV9kYXRhKTsJCisJCUNtbmQtPnNjX3JlcXVlc3QtPnVwcGVyX3ByaXZhdGVfZGF0YSA9IE5VTEw7CisJCUNtbmQtPnJlc3VsdCAmPSAweGZmMDBmZmZmOworCQlDbW5kLT5yZXN1bHQgfD0gKERJRF9QQVNTVEhST1VHSCA8PCAxNik7ICAvLyBwcmV2ZW50cyByZXRyeQorCX0KKwlpZiAoQ21uZC0+c2NzaV9kb25lICE9IE5VTEwpCisJCSgqQ21uZC0+c2NzaV9kb25lKShDbW5kKTsKK30KKworLy8gQWZ0ZXIgc3VjY2Vzc2Z1bGx5IGdldHRpbmcgYSAiUHJvY2VzcyBMb2dpbiIgKFBSTEkpIGZyb20gYW4KKy8vIEZDIHBvcnQsIHdlIHdhbnQgdG8gRGlzY292ZXIgdGhlIExVTnMgc28gdGhhdCB3ZSBrbm93IHRoZQorLy8gYWRkcmVzc2luZyB0eXBlIChlLmcuLCBGQ1AtU0NTSSBWb2x1bWUgU2V0IEFkZHJlc3MsIFBlcmlwaGVyYWwKKy8vIFVuaXQgRGV2aWNlKSwgYW5kIHdoZXRoZXIgU1NQIChTZWxlY3RpdmUgU3RvcmFnZSBQcmVzZW50YXRpb24gb3IKKy8vIEx1biBNYXNraW5nKSBoYXMgbWFkZSB0aGUgTFVOIG51bWJlcnMgbm9uLXplcm8gYmFzZWQgb3IgCisvLyBub24tY29udGlndW91cy4gIFRvIHJlbWFpbiBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggdGhlIFNDU0ktMgorLy8gZHJpdmVyIG1vZGVsLCB3aGljaCBleHBlY3RzIGEgY29udGlndW91cyBMVU5zIHN0YXJ0aW5nIGF0IDAsCisvLyB3aWxsIHVzZSB0aGUgUmVwb3J0THVucyBpbmZvIHRvIG1hcCBmcm9tICJkZXZpY2UiIHRvICJMaW51eCIgCisvLyBMVU5zLgorc3RhdGljIHZvaWQgSXNzdWVSZXBvcnRMdW5zQ29tbWFuZCggCisgICAgICAgICAgICAgIENQUUZDSEJBKiBjcHFmY0hCQWRhdGEsIAorCSAgICAgIFRhY2hGQ0hEUl9HQ01ORCogZmNocykKK3sKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0OyAKKyAgc3RydWN0IHNjc2lfY21uZCAqQ21uZCA9IE5VTEw7CisgIHN0cnVjdCBzY3NpX2RldmljZSAqU2NzaURldiA9IE5VTEw7CisgIExPTkcgeF9JRDsKKyAgVUxPTkcgdWxTdGF0dXM7CisgIFVDSEFSICp1Y0J1ZmY7CisKKyAgaWYoICFjcHFmY0hCQWRhdGEtPlBvcnREaXNjRG9uZSkgLy8gY2xlYXJlZCBieSBMRG4KKyAgeworICAgIHByaW50aygiRGlzY2FyZCBRJ2QgUmVwb3J0THVuIGNvbW1hbmRcbiIpOworICAgIGdvdG8gRG9uZTsKKyAgfQorCisgIC8vIGZpbmQgdGhlIGRldmljZSAoZnJvbSBwb3J0X2lkKSB3ZSdyZSB0YWxraW5nIHRvCisgIHBMb2dnZWRJblBvcnQgPSBmY0ZpbmRMb2dnZWRJblBvcnQoIGZjQ2hpcCwKKyAgICAgICAgTlVMTCwgICAgIC8vIERPTidUIHNlYXJjaCBTY3NpIE5leHVzIAorICAJZmNocy0+c19pZCAmIDB4RkZGRkZGLCAgICAgICAgCisJTlVMTCwgICAgIC8vIERPTidUIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgRkMgV1dOCisgICAgICAgIE5VTEwpOyAgICAvLyBET04nVCBjYXJlIGFib3V0IGVuZCBvZiBsaXN0CisgIGlmKCBwTG9nZ2VkSW5Qb3J0ICkgLy8gd2UnZCBCRVRURVIgZmluZCBpdCEKKyAgeworCisKKyAgICBpZiggIShwTG9nZ2VkSW5Qb3J0LT5mY3BfaW5mbyAmIFRBUkdFVF9GVU5DVElPTikgKQorICAgICAgZ290byBEb25lOyAgLy8gZm9yZ2V0IGl0IC0gRkMgZGV2aWNlIG5vdCBhICJ0YXJnZXQiCisKKyAKKyAgICBTY3NpRGV2ID0gc2NzaV9nZXRfaG9zdF9kZXYgKGNwcWZjSEJBZGF0YS0+SG9zdEFkYXB0ZXIpOworICAgIGlmICghU2NzaURldikKKyAgICAgIGdvdG8gRG9uZTsKKyAgICAKKyAgICBDbW5kID0gc2NzaV9nZXRfY29tbWFuZCAoU2NzaURldiwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFDbW5kKSAKKyAgICAgIGdvdG8gRG9uZTsKKworICAgIHVjQnVmZiA9IHBMb2dnZWRJblBvcnQtPlJlcG9ydEx1bnNQYXlsb2FkOworICAgIAorICAgIG1lbXNldCggdWNCdWZmLCAwLCBSRVBPUlRfTFVOU19QTCk7CisgICAgCisgICAgQ21uZC0+c2NzaV9kb25lID0gU2NzaVJlcG9ydEx1bnNEb25lOworCisgICAgQ21uZC0+cmVxdWVzdF9idWZmZXIgPSBwTG9nZ2VkSW5Qb3J0LT5SZXBvcnRMdW5zUGF5bG9hZDsgCisgICAgQ21uZC0+cmVxdWVzdF9idWZmbGVuID0gUkVQT1JUX0xVTlNfUEw7IAorCSAgICAKKyAgICBDbW5kLT5jbW5kWzBdID0gMHhBMDsKKyAgICBDbW5kLT5jbW5kWzhdID0gUkVQT1JUX0xVTlNfUEwgPj4gODsKKyAgICBDbW5kLT5jbW5kWzldID0gKFVDSEFSKVJFUE9SVF9MVU5TX1BMOworICAgIENtbmQtPmNtZF9sZW4gPSAxMjsKKworICAgIENtbmQtPmRldmljZS0+Y2hhbm5lbCA9IHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy5jaGFubmVsOworICAgIENtbmQtPmRldmljZS0+aWQgPSBwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMudGFyZ2V0OworCisJICAgIAorICAgIHVsU3RhdHVzID0gY3BxZmNUU0J1aWxkRXhjaGFuZ2UoCisgICAgICBjcHFmY0hCQWRhdGEsCisgICAgICBTQ1NJX0lSRSwgCisgICAgICBmY2hzLAorICAgICAgQ21uZCwgICAgICAgICAvLyBidWZmZXIgZm9yIFJlcG9ydCBMdW4gZGF0YQorICAgICAgJnhfSUQgKTsvLyBmY0NvbnRyb2xsZXItPmZjRXhjaGFuZ2VzIGluZGV4LCAtMSBpZiBmYWlsZWQKKworICAgIGlmKCAhdWxTdGF0dXMgKSAvLyBFeGNoYW5nZSBzZXR1cD8KKyAgICB7CisgICAgICB1bFN0YXR1cyA9IGNwcWZjVFNTdGFydEV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEsIHhfSUQgKTsKKyAgICAgIGlmKCAhdWxTdGF0dXMgKQorICAgICAgeworICAgICAgICAvLyBzdWJtaXR0ZWQgdG8gVGFjaCdzIE91dGJvdW5kIFF1ZSAoRVJRIFBJIGluY3JlbWVudGVkKQorICAgICAgICAvLyB3YWl0ZWQgZm9yIGNvbXBsZXRpb24gZm9yIEVMUyB0eXBlIChMb2dpbiBmcmFtZXMgaXNzdWVkCisgICAgICAgIC8vIHN5bmNocm9ub3VzbHkpCisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIC8vIGNoZWNrIHJlYXNvbiBmb3IgRXhjaGFuZ2Ugbm90IGJlaW5nIHN0YXJ0ZWQgLSB3ZSBtaWdodAorICAgICAgICAvLyB3YW50IHRvIFF1ZXVlIGFuZCBzdGFydCBsYXRlciwgb3IgZmFpbCB3aXRoIGVycm9yCisgICAgICB7CisgIAorICAgICAgfQorICAgIH0KKworICAgIGVsc2UgICAvLyBYY2hhbmdlIHNldHVwIGZhaWxlZC4uLgorICAgICAgcHJpbnRrKCIgY3BxZmNUU0J1aWxkRXhjaGFuZ2UgZmFpbGVkOiAlWGhcbiIsIHVsU3RhdHVzICk7CisgIH0KKyAgZWxzZSAgICAgLy8gbGlrZSwgd2UganVzdCBnb3QgYSBQUkxJIEFDQywgYW5kIG5vdyB0aGUgcG9ydCBpcyBnb25lPworICB7CisgICAgcHJpbnRrKCIgY2FuJ3Qgc2VuZCBSZXBvcnRMdW5zIC0gbm8gbG9naW4gZm9yIHBvcnRfaWQgJVhoXG4iLAorCSAgICBmY2hzLT5zX2lkICYgMHhGRkZGRkYpOworICB9CisKKworCitEb25lOgorCisgIGlmIChDbW5kKQorICAgIHNjc2lfcHV0X2NvbW1hbmQgKENtbmQpOworICBpZiAoU2NzaURldikgCisgICAgc2NzaV9mcmVlX2hvc3RfZGV2IChTY3NpRGV2KTsKK30KKworCisKKworCisKKworc3RhdGljIHZvaWQgQ29tcGxldGVCb2FyZExvY2tDbW5kKCBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhKQoreworICBpbnQgaTsKKyAgZm9yKCBpID0gQ1BRRkNUU19SRVFfUVVFVUVfTEVOLTE7IGk+PSAwOyBpLS0pCisgIHsKKyAgICBpZiggY3BxZmNIQkFkYXRhLT5Cb2FyZExvY2tDbW5kW2ldICE9IE5VTEwgKQorICAgIHsKKyAgICAgIFNjc2lfQ21uZCAqQ21uZCA9IGNwcWZjSEJBZGF0YS0+Qm9hcmRMb2NrQ21uZFtpXTsKKyAgICAgIGNwcWZjSEJBZGF0YS0+Qm9hcmRMb2NrQ21uZFtpXSA9IE5VTEw7CisgICAgICBDbW5kLT5yZXN1bHQgPSAoRElEX1NPRlRfRVJST1IgPDwgMTYpOyAgLy8gYXNrIGZvciByZXRyeQorLy8gICAgICBwcmludGsoIiBCb2FyZExvY2tDbW5kWyVkXSAlcCBDb21wbGV0ZSwgY2hubC90YXJnZXQvbHVuICVkLyVkLyVkXG4iLAorLy8gICAgICAgIGksQ21uZCwgQ21uZC0+Y2hhbm5lbCwgQ21uZC0+dGFyZ2V0LCBDbW5kLT5sdW4pOworICAgICAgY2FsbF9zY3NpX2RvbmUoQ21uZCk7CisgICAgfQorICB9Cit9CisKKworCisKKworCisvLyBydW5zIGV2ZXJ5IDEgc2Vjb25kIGZvciBGQyBleGNoYW5nZSB0aW1lb3V0cyBhbmQgaW1wbGljaXQgRkMgZGV2aWNlIGxvZ291dHMKKwordm9pZCBjcHFmY1RTaGVhcnRiZWF0KCB1bnNpZ25lZCBsb25nIHB0ciApCit7CisgIENQUUZDSEJBICpjcHFmY0hCQWRhdGEgPSAoQ1BRRkNIQkEgKilwdHI7CisgIFBUQUNIWU9OIGZjQ2hpcCA9ICZjcHFmY0hCQWRhdGEtPmZjQ2hpcDsKKyAgRkNfRVhDSEFOR0VTICpFeGNoYW5nZXMgPSBmY0NoaXAtPkV4Y2hhbmdlczsKKyAgUEZDX0xPR0dFRElOX1BPUlQgcExvZ2dlZEluUG9ydCA9ICZmY0NoaXAtPmZjUG9ydHM7IAorICBVTE9ORyBpOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICBERUNMQVJFX01VVEVYX0xPQ0tFRChCb2FyZExvY2spOworICAKKyAgUENJX1RSQUNFKCAweEE4KQorCisgIGlmKCBjcHFmY0hCQWRhdGEtPkJvYXJkTG9jaykgLy8gV29ya2VyIFRhc2sgUnVubmluZz8KKyAgICBnb3RvIFNraXA7CisKKyAgLy8gU1RPUCBfcXVlIGZ1bmN0aW9uCisgIHNwaW5fbG9ja19pcnFzYXZlKCBjcHFmY0hCQWRhdGEtPkhvc3RBZGFwdGVyLT5ob3N0X2xvY2ssIGZsYWdzKTsgCisKKyAgUENJX1RSQUNFKCAweEE4KQorCisKKyAgY3BxZmNIQkFkYXRhLT5Cb2FyZExvY2sgPSAmQm9hcmRMb2NrOyAvLyBzdG9wIExpbnV4IFNDU0kgY29tbWFuZCBxdWV1aW5nCisgIAorICAvLyByZWxlYXNlIHRoZSBJTyBsb2NrIChhbmQgcmUtZW5hYmxlIGludGVycnVwdHMpCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoIGNwcWZjSEJBZGF0YS0+SG9zdEFkYXB0ZXItPmhvc3RfbG9jaywgZmxhZ3MpOworICAKKyAgLy8gRW5zdXJlIG5vIGNvbnRlbnRpb24gZnJvbSAgX3F1ZWNvbW1hbmQgb3IgV29ya2VyIHByb2Nlc3MgCisgIENQUV9TUElOTE9DS19IQkEoIGNwcWZjSEJBZGF0YSkKKyAgCisgIFBDSV9UUkFDRSggMHhBOCkKKyAgCisKKyAgZGlzYWJsZV9pcnEoIGNwcWZjSEJBZGF0YS0+SG9zdEFkYXB0ZXItPmlycSk7ICAvLyBvdXIgSVJRCisKKyAgLy8gQ29tcGxldGUgdGhlICJiYWQgdGFyZ2V0IiBjb21tYW5kcyAobm9ybWFsbHkgb25seSB1c2VkIGR1cmluZworICAvLyBpbml0aWFsaXphdGlvbiwgc2luY2Ugd2UgYXJlbid0IHN1cHBvc2VkIHRvIGNhbGwgInNjc2lfZG9uZSIKKyAgLy8gaW5zaWRlIHRoZSBxdWV1ZWNvbW1hbmQoKSBmdW5jdGlvbikuICAodGhpcyBpcyBvdmVybHkgY29udG9ydGVkLAorICAvLyBzY3NpX2RvbmUgY2FuIGJlIHNhZmVseSBjYWxsZWQgZnJvbSBxdWV1ZWNvbW1hbmQgZm9yCisgIC8vIHRoaXMgYmFkIHRhcmdldCBjYXNlLiAgTWF5IHdhbnQgdG8gc2ltcGxpZnkgdGhpcyBsYXRlcikKKworICBmb3IoIGk9MDsgaTwgQ1BRRkNUU19NQVhfVEFSR0VUX0lEOyBpKyspCisgIHsKKyAgICBpZiggY3BxZmNIQkFkYXRhLT5CYWRUYXJnZXRDbW5kW2ldICkKKyAgICB7CisgICAgICBTY3NpX0NtbmQgKkNtbmQgPSBjcHFmY0hCQWRhdGEtPkJhZFRhcmdldENtbmRbaV07CisgICAgICBjcHFmY0hCQWRhdGEtPkJhZFRhcmdldENtbmRbaV0gPSBOVUxMOworICAgICAgQ21uZC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKyAgICAgIGNhbGxfc2NzaV9kb25lKENtbmQpOworICAgIH0KKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorCisgIAorICAvLyBsb2dnZWQgaW4gcG9ydHMgLS0gcmUtbG9naW4gY2hlY2sgKHBvcnRzIHJlcXVpcmVkIHRvIHZlcmlmeSBsb2dpbiB3aXRoCisgIC8vIFBESVNDIGFmdGVyIExJUCB3aXRoaW4gMiBzZWNzKQorCisgIC8vIHByZXZlbnQgY29udGVudGlvbgorICB3aGlsZSggcExvZ2dlZEluUG9ydCApIC8vIGZvciBhbGwgcG9ydHMgd2hpY2ggYXJlIGV4cGVjdGluZworICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBESVNDIGFmdGVyIHRoZSBuZXh0IExJUCwgY2hlY2sgdG8gc2VlIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGltZSBpcyB1cCEKKyAgeworICAgICAgLy8gSW1wb3J0YW50OiB3ZSBvbmx5IGRldGVjdCAidGltZW91dCIgY29uZGl0aW9uIG9uIFRSQU5TSVRJT04KKyAgICAgIC8vIGZyb20gbm9uLXplcm8gdG8gemVybworICAgIGlmKCBwTG9nZ2VkSW5Qb3J0LT5MT0dPX3RpbWVyICkgIC8vIHRpbWUtb3V0ICJhcm1lZCI/CisgICAgeworICAgICAgaWYoICEoLS1wTG9nZ2VkSW5Qb3J0LT5MT0dPX3RpbWVyKSApIC8vIERFQyBmcm9tIDEgdG8gMD8KKyAgICAgIHsKKyAgICAgICAgICAvLyBMT0dPVVQgdGltZSEgIFBlciBQTERBLCBQRElTQyBoYXNuJ3QgY29tcGxldGUgaW4gMiBzZWNzLCBzbworICAgICAgICAgIC8vIGlzc3VlIExPR08gcmVxdWVzdCBhbmQgZGVzdHJveSBhbGwgSS9PIHdpdGggb3RoZXIgRkMgcG9ydChzKS4KKyAgICAgICAgCisvKiAgICAgICAgICAKKyAgICAgICAgcHJpbnRrKCIgfmNwcWZjVFMgaGVhcnRiZWF0OiBMT0dPdXQhfiAiKTsKKyAgICAgICAgcHJpbnRrKCJMaW51eCBTQ1NJIENoYW5sL1RhcmdldCAlZC8lZCAocG9ydF9pZCAlMDZYaCkgV1dOICUwOFglMDhYXG4iLCAKKyAgICAgICAgcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLmNoYW5uZWwsIAorICAgICAgICBwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMudGFyZ2V0LCAKKwlwTG9nZ2VkSW5Qb3J0LT5wb3J0X2lkLAorICAgICAgICAgIChVTE9ORykocExvZ2dlZEluUG9ydC0+dS5saVdXTiAmMHhGRkZGRkZGRiksIAorICAgICAgICAgIChVTE9ORykocExvZ2dlZEluUG9ydC0+dS5saVdXTj4+MzIpKTsKKworKi8KKyAgICAgICAgY3BxZmNUU0ltcGxpY2l0TG9nb3V0KCBjcHFmY0hCQWRhdGEsIHBMb2dnZWRJblBvcnQpOworCisgICAgICB9CisgICAgICAvLyBlbHNlIHNpbXBseSBkZWNyZW1lbnRlZCAtIG1heWJlIG5leHQgdGltZS4uLgorICAgIH0KKyAgICBwTG9nZ2VkSW5Qb3J0ID0gcExvZ2dlZEluUG9ydC0+cE5leHRQb3J0OworICB9CisKKworCisgIAorICAKKyAgLy8gKioqKioqKioqKioqICBGQyBFWENIQU5HRSBUSU1FT1VUIENIRUNLICoqKioqKioqKioqKioqCisgIAorICBmb3IoIGk9MDsgaTwgVEFDSF9NQVhfWElEOyBpKyspCisgIHsKKyAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW2ldLnR5cGUgKSAgLy8gZXhjaGFuZ2UgZGVmaW5lZD8KKyAgICB7CisKKyAgICAgIGlmKCAhRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW2ldLnRpbWVPdXQgKSAvLyB0aW1lIGV4cGlyZWQKKyAgICAgIHsKKyAgICAgICAgLy8gU2V0IEV4Y2hhbmdlIHRpbWVvdXQgc3RhdHVzCisgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS5zdGF0dXMgfD0gRkMyX1RJTUVPVVQ7CisKKyAgICAgICAgaWYoIGkgPj0gVEFDSF9TRVNUX0xFTiApIC8vIExpbmsgU2VydmljZSBFeGNoYW5nZQorICAgICAgICB7CisgICAgICAgICAgY3BxZmNUU0NvbXBsZXRlRXhjaGFuZ2UoIGNwcWZjSEJBZGF0YS0+UGNpRGV2LCBmY0NoaXAsIGkpOyAgLy8gRG9uJ3QgImFib3J0IiBMaW5rU2VydmljZQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBlbHNlICAvLyBTRVNUIEV4Y2hhbmdlIFRPIC0tIG1heSBwb3N0IEFCVFMgdG8gV29ya2VyIFRocmVhZCBRdWUKKyAgICAgICAgeworCSAgLy8gKE1ha2Ugc3VyZSB3ZSBkb24ndCBrZWVwIHRpbWluZyBpdCBvdXQ7IGxldCBvdGhlciBmdW5jdGlvbnMKKwkgIC8vIGNvbXBsZXRlIGl0IG9yIHNldCB0aGUgdGltZU91dCBhcyBuZWVkZWQpCisJICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbaV0udGltZU91dCA9IDMwMDAwOyAvLyBzZWNvbmRzIGRlZmF1bHQKKworICAgICAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbaV0udHlwZSAKKyAgICAgICAgICAgICAgICAgICYgCisgICAgICAgICAgICAgIChCTFNfQUJUUyB8IEJMU19BQlRTX0FDQyApICApCisgICAgICAgICAgeworCSAgICAvLyBGb3IgQkxTX0FCVFMqLCBhbiB1cHBlciBsZXZlbCBtaWdodCBzdGlsbCBoYXZlCisJICAgIC8vIGFuIG91dHN0YW5kaW5nIGNvbW1hbmQgd2FpdGluZyBmb3IgbG93LWxldmVsIGNvbXBsZXRpb24uCisJICAgIC8vIEFsc28sIGluIHRoZSBjYXNlIG9mIGEgV1JJVEUsIHdlIE1VU1QgZ2V0IGNvbmZpcm1hdGlvbgorCSAgICAvLyBvZiBlaXRoZXIgQUJUUyBBQ0Mgb3IgUkpUIGJlZm9yZSByZS11c2luZyB0aGUgRXhjaGFuZ2UuCisJICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgUkFJRCBjYWNoZSBhbGdvcml0aG0gY2FuIGhhbmcKKwkgICAgLy8gaWYgd2UgZmFpbCB0byBjb21wbGV0ZSBhIFdSSVRFIHRvIGEgTEJBLCB3aGVuIGEgUkVBRAorCSAgICAvLyBjb21lcyBsYXRlciB0byB0aGF0IHNhbWUgTEJBLiAgVGhlcmVmb3JlLCB3ZSBtdXN0CisJICAgIC8vIGVuc3VyZSB0aGF0IHRoZSB0YXJnZXQgdmVyaWZpZXMgcmVjZWlwdCBvZiBBQlRTIGZvcgorCSAgICAvLyB0aGUgZXhjaGFuZ2UKKwkgICAKKwkgICAgcHJpbnRrKCJ+VE8gUSdkIEFCVFMgKHhfSUQgJVhoKX4gIiwgaSk7IAorLy8gICAgICAgICAgICBUcmlnZ2VySEJBKCBmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UpOworCisJICAgIC8vIE9uIHRpbWVvdXQgb2YgYSBBQlRTIGV4Y2hhbmdlLCBjaGVjayB0bworCSAgICAvLyBzZWUgaWYgdGhlIEZDIGRldmljZSBoYXMgYSBjdXJyZW50IHZhbGlkIGxvZ2luLgorCSAgICAvLyBJZiBzbywgcmVzdGFydCBpdC4KKwkgICAgcExvZ2dlZEluUG9ydCA9IGZjRmluZExvZ2dlZEluUG9ydCggZmNDaGlwLAorICAgICAgICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbaV0uQ21uZCwgLy8gZmluZCBTY3NpIE5leHVzCisgICAgICAgICAgICAgIDAsICAgICAgICAvLyBET04nVCBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIEZDIHBvcnQgaWQKKwkgICAgICBOVUxMLCAgICAgLy8gRE9OJ1Qgc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBGQyBXV04KKyAgICAgICAgICAgICAgTlVMTCk7ICAgIC8vIERPTidUIGNhcmUgYWJvdXQgZW5kIG9mIGxpc3QKKworCSAgICAvLyBkZXZpY2UgZXhpc3RzPworCSAgICBpZiggcExvZ2dlZEluUG9ydCApIC8vIGRldmljZSBleGlzdHM/CisJICAgIHsKKwkgICAgICBpZiggcExvZ2dlZEluUG9ydC0+cHJsaSApIC8vIGxvZ2dlZCBpbiBmb3IgRkNQLVNDU0k/CisJICAgICAgeworCQkvLyBhdHRlbXB0IHRvIHJlc3RhcnQgdGhlIEFCVFMKKwkJcHJpbnRrKCIgfnJlc3RhcnRpbmcgQUJUU34gIik7CisgICAgICAgICAgICAgICAgY3BxZmNUU1N0YXJ0RXhjaGFuZ2UoIGNwcWZjSEJBZGF0YSwgaSApOworCisJICAgICAgfQorCSAgICB9CisgICAgICAgICAgfQorCSAgZWxzZSAgLy8gbm90IGFuIEFCVFMKKwkgIHsgCisgICAgICAgICAgIAorICAgICAgICAgICAgLy8gV2UgZXhwZWN0IHRoZSBXb3JrZXJUaHJlYWQgdG8gY2hhbmdlIHRoZSB4Y2huZyB0eXBlIHRvCisgICAgICAgICAgICAvLyBhYm9ydCBhbmQgc2V0IGFwcHJvcHJpYXRlIHRpbWVvdXQuCisgICAgICAgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLCBCTFNfQUJUUywgJmkgKTsgLy8gdGltZWQtb3V0CisJICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgIC8vIHRpbWUgbm90IGV4cGlyZWQuLi4KKyAgICAgIHsKKyAgICAgICAgLy8gZGVjcmVtZW50IHRpbWVvdXQ6IDEgb3IgbW9yZSBzZWNvbmRzIGxlZnQKKyAgICAgICAgLS1FeGNoYW5nZXMtPmZjRXhjaGFuZ2VbaV0udGltZU91dDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworCisgIGVuYWJsZV9pcnEoIGNwcWZjSEJBZGF0YS0+SG9zdEFkYXB0ZXItPmlycSk7CisgCisKKyAgQ1BRX1NQSU5VTkxPQ0tfSEJBKCBjcHFmY0hCQWRhdGEpCisKKyAgY3BxZmNIQkFkYXRhLT5Cb2FyZExvY2sgPSBOVUxMOyAvLyBMaW51eCBTQ1NJIGNvbW1hbmRzIG1heSBiZSBxdWV1ZWQKKworICAvLyBOb3csIGNvbXBsZXRlIGFueSBDbW5kIHdlIFEnZCB1cCB3aGlsZSBCb2FyZExvY2sgd2FzIGhlbGQKKworICBDb21wbGV0ZUJvYXJkTG9ja0NtbmQoIGNwcWZjSEJBZGF0YSk7CisgCisKKyAgLy8gcmVzdGFydCB0aGUgdGltZXIgdG8gcnVuIGFnYWluICgxIHNlYyBsYXRlcikKK1NraXA6CisgIG1vZF90aW1lciggJmNwcWZjSEJBZGF0YS0+Y3BxZmNUU3RpbWVyLCBqaWZmaWVzICsgSFopOworICAKKyAgUENJX1RSQUNFTyggaSwgMHhBOCkKKyAgcmV0dXJuOworfQorCisKKy8vIHB1dCB2YWxpZCBGQy1BTCBwaHlzaWNhbCBhZGRyZXNzIGluIHNwZWMgb3JkZXIKK3N0YXRpYyBjb25zdCBVQ0hBUiB2YWxpZF9hbF9wYVtdPXsKKyAgICAweGVmLCAweGU4LCAweGU0LCAweGUyLCAKKyAgICAweGUxLCAweEUwLCAweERDLCAweERBLCAKKyAgICAweEQ5LCAweEQ2LCAweEQ1LCAweEQ0LCAKKyAgICAweEQzLCAweEQyLCAweEQxLCAweENlLCAKKyAgICAweENkLCAweENjLCAweENiLCAweENhLCAKKyAgICAweEM5LCAweEM3LCAweEM2LCAweEM1LCAKKyAgICAweEMzLCAweEJjLCAweEJhLCAweEI5LAorICAgIDB4QjYsIDB4QjUsIDB4QjQsIDB4QjMsIAorICAgIDB4QjIsIDB4QjEsIDB4YWUsIDB4YWQsCisgICAgMHhBYywgMHhBYiwgMHhBYSwgMHhBOSwgCisKKyAgICAweEE3LCAweEE2LCAweEE1LCAweEEzLCAKKyAgICAweDlmLCAweDllLCAweDlkLCAweDliLCAKKyAgICAweDk4LCAweDk3LCAweDkwLCAweDhmLCAKKyAgICAweDg4LCAweDg0LCAweDgyLCAweDgxLCAKKyAgICAweDgwLCAweDdjLCAweDdhLCAweDc5LCAKKyAgICAweDc2LCAweDc1LCAweDc0LCAweDczLCAKKyAgICAweDcyLCAweDcxLCAweDZlLCAweDZkLCAKKyAgICAweDZjLCAweDZiLCAweDZhLCAweDY5LCAKKyAgICAweDY3LCAweDY2LCAweDY1LCAweDYzLCAKKyAgICAweDVjLCAweDVhLCAweDU5LCAweDU2LCAKKyAgICAKKyAgICAweDU1LCAweDU0LCAweDUzLCAweDUyLCAKKyAgICAweDUxLCAweDRlLCAweDRkLCAweDRjLCAKKyAgICAweDRiLCAweDRhLCAweDQ5LCAweDQ3LCAKKyAgICAweDQ2LCAweDQ1LCAweDQzLCAweDNjLAorICAgIDB4M2EsIDB4MzksIDB4MzYsIDB4MzUsIAorICAgIDB4MzQsIDB4MzMsIDB4MzIsIDB4MzEsIAorICAgIDB4MmUsIDB4MmQsIDB4MmMsIDB4MmIsIAorICAgIDB4MmEsIDB4MjksIDB4MjcsIDB4MjYsIAorICAgIDB4MjUsIDB4MjMsIDB4MWYsIDB4MUUsCisgICAgMHgxZCwgMHgxYiwgMHgxOCwgMHgxNywgCisKKyAgICAweDEwLCAweDBmLCA4LCA0LCAyLCAxIH07IC8vIEFMUEEgMCAoRmFicmljKSBpcyBzcGVjaWFsIGNhc2UKKworY29uc3QgaW50IG51bWJlcl9vZl9hbF9wYSA9IChzaXplb2YodmFsaWRfYWxfcGEpICk7CisKKworCisvLyB0aGlzIGZ1bmN0aW9uIGxvb2tzIHVwIGFuIGFsX3BhIGZyb20gdGhlIHRhYmxlIG9mIHZhbGlkIGFsX3BhJ3MKKy8vIHdlIGRlY3JlbWVudCBmcm9tIHRoZSBsYXN0IGRlY2ltYWwgbG9vcCBJRCwgYmVjYXVzZSBzb2Z0IGFsX3BhCisvLyAob3VyIHR5cGljYWwgY2FzZSkgYXJlIGFzc2lnbmVkIHdpdGggaGlnaGVzdCBwcmlvcml0eSAoYW5kIGhpZ2ggYWxfcGEpCisvLyBmaXJzdC4gIFNlZSAiSW4tRGVwdGggRkMtQUwiLCBSLiBLZW1iZWwgcGcuIDM4CisvLyBJTlBVVFM6CisvLyAgIGFsX3BhIC0gMjQgYml0IHBvcnQgaWRlbnRpZmllciAoOCBiaXQgYWxfcGEgb24gcHJpdmF0ZSBsb29wKQorLy8gUkVUVVJOOgorLy8gIExvb3AgSUQgLSBzZXJ2ZXMgYXJlIGluZGV4IHRvIGFycmF5IG9mIGxvZ2dlZCBpbiBwb3J0cworLy8gIC0xICAgICAgLSBpbnZhbGlkIGFsX3BhIChub3QgYWxsIDggYml0IHZhbHVlcyBhcmUgbGVnYWwpCisKKyNpZiAoMCkKK3N0YXRpYyBpbnQgR2V0TG9vcElEKCBVTE9ORyBhbF9wYSApCit7CisgIGludCBpOworCisgIGZvciggaSA9IG51bWJlcl9vZl9hbF9wYSAtMTsgaSA+PSAwOyBpLS0pICAvLyBkZWMuCisgIHsKKyAgICBpZiggdmFsaWRfYWxfcGFbaV0gPT0gKFVDSEFSKWFsX3BhICkgIC8vIHRha2UgbG93ZXN0IDggYml0cworICAgICAgcmV0dXJuIGk7ICAvLyBzdWNjZXNzIC0gZm91bmQgdmFsaWQgYWxfcGE7IHJldHVybiBkZWNpbWFsIExvb3BJRAorICB9CisgIHJldHVybiAtMTsgLy8gZmFpbGVkIC0gbm90IGZvdW5kCit9CisjZW5kaWYKKworZXh0ZXJuIGNwcWZjX3Bhc3N0aHJ1X3ByaXZhdGVfdCAqY3BxZmNfcHJpdmF0ZShTY3NpX1JlcXVlc3QgKnNyKTsKKworLy8gU2VhcmNoIHRoZSBzaW5nbHkgKGZvcndhcmQpIGxpbmtlZCBsaXN0ICJmY1BvcnRzIiBsb29raW5nIGZvciAKKy8vIGVpdGhlciB0aGUgU0NTSSB0YXJnZXQgKGlmICE9IC0xKSwgcG9ydF9pZCAoaWYgbm90IE5VTEwpLCAKKy8vIG9yIFdXTiAoaWYgbm90IG51bGwpLCBpbiB0aGF0IHNwZWNpZmljIG9yZGVyLgorLy8gSWYgd2UgZmluZCBhIFNDU0kgbmV4dXMgKGZyb20gQ21uZCBhcmcpLCBzZXQgdGhlIFNDcC5waGFzZQorLy8gZmllbGQgYWNjb3JkaW5nIHRvIFZTQSBvciBQRFUKKy8vIFJFVFVSTlM6CisvLyAgIFB0ciB0byBsb2dnZWQgaW4gcG9ydCBzdHJ1Y3QgaWYgZm91bmQKKy8vICAgICAoTlVMTCBpZiBub3QgZm91bmQpCisvLyAgIHBMYXN0TG9nZ2VkSW5Qb3J0IC0gcHRyIHRvIGxhc3Qgc3RydWN0IChmb3IgYWRkaW5nIG5ldyBvbmVzKQorLy8gCitQRkNfTE9HR0VESU5fUE9SVCAgZmNGaW5kTG9nZ2VkSW5Qb3J0KCAKKyAgUFRBQ0hZT04gZmNDaGlwLCAKKyAgU2NzaV9DbW5kICpDbW5kLCAvLyBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIFNjc2kgTmV4dXMgKGNoYW5uZWwvdGFyZ2V0L2x1bikKKyAgVUxPTkcgcG9ydF9pZCwgICAvLyBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIGFsX3BhLCBvcgorICBVQ0hBUiB3d25bOF0sICAgIC8vIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgV1dOLCBvci4uLgorICBQRkNfTE9HR0VESU5fUE9SVCAqcExhc3RMb2dnZWRJblBvcnQgKQorICAgICAgICAgICAgIAoreworICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0ID0gJmZjQ2hpcC0+ZmNQb3J0czsgCisgIEJPT0xFQU4gdGFyZ2V0X2lkX3ZhbGlkPUZBTFNFOworICBCT09MRUFOIHBvcnRfaWRfdmFsaWQ9RkFMU0U7CisgIEJPT0xFQU4gd3duX3ZhbGlkPUZBTFNFOworICBpbnQgaTsKKworCisgIGlmKCBDbW5kICE9IE5VTEwgKQorICAgIHRhcmdldF9pZF92YWxpZCA9IFRSVUU7CisgIAorICBlbHNlIGlmKCBwb3J0X2lkICkgLy8gbm90ZSEgMjQtYml0IE5VTEwgYWRkcmVzcyBpcyBpbGxlZ2FsCisgICAgcG9ydF9pZF92YWxpZCA9IFRSVUU7CisKKyAgZWxzZQorICB7CisgICAgaWYoIHd3biApIC8vIG5vbi1udWxsIGFyZz8gKE9LIHRvIHBhc3MgTlVMTCB3aGVuIG5vdCBzZWFyY2hpbmcgV1dOKQorICAgIHsKKyAgICAgIGZvciggaT0wOyBpPDg7IGkrKykgIC8vIHZhbGlkIFdXTiBwYXNzZWQ/ICBOVUxMIFdXTiBpbnZhbGlkCisgICAgICB7CisgICAgICAgIGlmKCB3d25baV0gIT0gMCApCisgICAgICAgICAgd3duX3ZhbGlkID0gVFJVRTsgIC8vIGFueSBub24temVybyBieXRlIG1ha2VzIChwcmVzdW1hYmx5KSB2YWxpZAorICAgICAgfQorICAgIH0KKyAgfQorICAgICAgICAgICAgICAgIC8vIGNoZWNrIG90aGVyIG9wdGlvbnMgLi4uCisKKworICAvLyBJbiBjYXNlIG11bHRpcGxlIHNlYXJjaCBvcHRpb25zIGFyZSBnaXZlbiwgd2UgdXNlIGEgcHJpb3JpdHkKKyAgLy8gc2NoZW1lOgorICAvLyBXaGlsZSB2YWxpZCBwTG9nZ2VkSW4gUHRyCisgIC8vICAgSWYgcG9ydF9pZCBpcyB2YWxpZAorICAvLyAgICAgaWYgcG9ydF9pZCBtYXRjaGVzLCByZXR1cm4gUHRyCisgIC8vICAgSWYgd3duIGlzIHZhbGlkCisgIC8vICAgICBpZiB3d24gbWF0Y2hlcywgcmV0dXJuIFB0cgorICAvLyAgIE5leHQgUHRyIGluIGxpc3QKKyAgLy8KKyAgLy8gUmV0dXJuIE5VTEwgKG5vdCBmb3VuZCkKKyAKKyAgICAgIAorICB3aGlsZSggcExvZ2dlZEluUG9ydCApIC8vIE5VTEwgbWFya3MgZW5kIG9mIGxpc3QgKDFzdCBwdHIgYWx3YXlzIHZhbGlkKQorICB7CisgICAgaWYoIHBMYXN0TG9nZ2VkSW5Qb3J0ICkgLy8gY2FsbGVyJ3MgcG9pbnRlciB2YWxpZD8KKyAgICAgICpwTGFzdExvZ2dlZEluUG9ydCA9IHBMb2dnZWRJblBvcnQ7ICAvLyBlbmQgb2YgbGlua2VkIGxpc3QKKyAgICAKKyAgICBpZiggdGFyZ2V0X2lkX3ZhbGlkICkKKyAgICB7CisgICAgICAvLyBjaGVjayBMaW51eCBTY3NpIENtbmQgZm9yIGNoYW5uZWwvdGFyZ2V0IE5leHVzIG1hdGNoCisgICAgICAvLyAoYWxsIGx1bnMgYXJlIGFjY2Vzc2VkIHRocm91Z2ggbWF0Y2hpbmcgInBMb2dnZWRJblBvcnQiKQorICAgICAgaWYoIChwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMudGFyZ2V0ID09IENtbmQtPmRldmljZS0+aWQpCisgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAocExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLmNoYW5uZWwgPT0gQ21uZC0+ZGV2aWNlLT5jaGFubmVsKSkKKyAgICAgIHsKKyAgICAgICAgLy8gRm9yICJwYXNzdGhydSIgbW9kZXMsIHRoZSBJT0NUTCBjYWxsZXIgaXMgcmVzcG9uc2libGUKKwkvLyBmb3Igc2V0dGluZyB0aGUgRkNQLUxVTiBhZGRyZXNzaW5nCisJaWYgKENtbmQtPnNjX3JlcXVlc3QgIT0gTlVMTCAmJiBDbW5kLT5kZXZpY2UtPmhvc3QgIT0gTlVMTCAmJiAKKwkJQ21uZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSAhPSBOVUxMICYmCisJCWlzX3ByaXZhdGVfZGF0YV9vZl9jcHFmYygoQ1BRRkNIQkEgKikgQ21uZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSwKKwkJCUNtbmQtPnNjX3JlcXVlc3QtPnVwcGVyX3ByaXZhdGVfZGF0YSkpIHsgCisJCS8qIFRoaXMgaXMgYSBwYXNzdGhydS4uLiAqLworCQljcHFmY19wYXNzdGhydV9wcml2YXRlX3QgKnBkOworCQlwZCA9IENtbmQtPnNjX3JlcXVlc3QtPnVwcGVyX3ByaXZhdGVfZGF0YTsKKyAgICAgICAgCUNtbmQtPlNDcC5waGFzZSA9IHBkLT5idXM7CisJCS8vIENtbmQtPlNDcC5oYXZlX2RhdGFfaW4gPSBwZC0+cGRyaXZlOworCQlDbW5kLT5TQ3AuaGF2ZV9kYXRhX2luID0gQ21uZC0+ZGV2aWNlLT5sdW47CisJfSBlbHNlIHsKKwkgIC8qIFRoaXMgaXMgbm90IGEgcGFzc3RocnUuLi4gKi8KKwkKKyAgICAgICAgICAvLyBzZXQgdGhlIEZDUC1MVU4gYWRkcmVzc2luZyB0eXBlCisgICAgICAgICAgQ21uZC0+U0NwLnBoYXNlID0gcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLlZvbHVtZVNldEFkZHJlc3Npbmc7CQorCisgICAgICAgICAgLy8gc2V0IHRoZSBEZXZpY2UgVHlwZSB3ZSBnb3QgZnJvbSB0aGUgc25vb3BlZCBJTlFVSVJZIHN0cmluZworCSAgQ21uZC0+U0NwLk1lc3NhZ2UgPSBwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMuSW5xRGV2aWNlVHlwZTsKKworCSAgLy8gaGFuZGxlIExVTiBtYXNraW5nOyBpZiBub3QgImRlZmF1bHQiIChpbGxlZ2FsKSBsdW4gdmFsdWUsCisJICAvLyB0aGUgdXNlIGl0LiAgVGhlc2UgbHVuIHZhbHVlcyBhcmUgc2V0IGJ5IGEgc3VjY2Vzc2Z1bAorCSAgLy8gUmVwb3J0IEx1bnMgY29tbWFuZAorICAgICAgICAgIGlmKCBwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMuTHVuTWFza2luZyA9PSAxKSAKKwkgIHsKKwkgICAgaWYgKENtbmQtPmRldmljZS0+bHVuID4gc2l6ZW9mKHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy5sdW4pKQorCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIC8vIHdlIEtOT1cgYWxsIHRoZSB2YWxpZCBMVU5zLi4uIDB4RkYgaXMgaW52YWxpZCEKKyAgICAgICAgICAgIENtbmQtPlNDcC5oYXZlX2RhdGFfaW4gPSBwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMubHVuW0NtbmQtPmRldmljZS0+bHVuXTsKKwkgICAgaWYgKHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy5sdW5bQ21uZC0+ZGV2aWNlLT5sdW5dID09IDB4RkYpCisJCXJldHVybiBOVUxMOworCSAgICAvLyBwcmludGsoInhsYXRpbmcgbHVuICVkIHRvIDB4JTAyeFxuIiwgQ21uZC0+bHVuLCAKKyAgICAgICAgICAgIC8vCXBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy5sdW5bQ21uZC0+bHVuXSk7CisJICB9CisJICBlbHNlCisJICAgIENtbmQtPlNDcC5oYXZlX2RhdGFfaW4gPSBDbW5kLT5kZXZpY2UtPmx1bjsgLy8gTGludXggJiB0YXJnZXQgbHVucyBtYXRjaAorCX0KKwlicmVhazsgLy8gZm91bmQgaXQhCisgICAgICB9CisgICAgfQorICAgIAorICAgIGlmKCBwb3J0X2lkX3ZhbGlkICkgLy8gbG9vayBmb3IgYWxwYSBmaXJzdAorICAgIHsKKyAgICAgIGlmKCBwTG9nZ2VkSW5Qb3J0LT5wb3J0X2lkID09IHBvcnRfaWQgKQorICAgICAgICAgIGJyZWFrOyAgLy8gZm91bmQgaXQhCisgICAgfQorICAgIGlmKCB3d25fdmFsaWQgKSAvLyBsb29rIGZvciB3d24gc2Vjb25kCisgICAgeworCisgICAgICBpZiggIW1lbWNtcCggJnBMb2dnZWRJblBvcnQtPnUudWNXV05bMF0sICZ3d25bMF0sIDgpKQorICAgICAgeyAgCisgICAgICAgICAgICAgICAgIC8vIGFsbCA4IGJ5dGVzIG9mIFdXTiBtYXRjaAorICAgICAgICBicmVhazsgICAvLyBmb3VuZCBpdCEKKyAgICAgIH0KKyAgICB9CisgICAgICAgICAgICAgICAgCisgICAgcExvZ2dlZEluUG9ydCA9IHBMb2dnZWRJblBvcnQtPnBOZXh0UG9ydDsgLy8gdHJ5IG5leHQgcG9ydAorICB9CisKKyAgcmV0dXJuIHBMb2dnZWRJblBvcnQ7Cit9CisKKworCisKKy8vIAorLy8gV2UgbmVlZCB0byBleGFtaW5lIHRoZSBTRVNUIHRhYmxlIGFuZCByZS12YWxpZGF0ZQorLy8gYW55IG9wZW4gRXhjaGFuZ2VzIGZvciB0aGlzIExvZ2dlZEluUG9ydAorLy8gVG8gbWFrZSBUYWNoeW9uIHBheSBhdHRlbnRpb24sIEZyZWV6ZSBGQ1AgYXNzaXN0cywKKy8vIHNldCBWQUwgYml0cywgVW5mcmVlemUgRkNQIGFzc2lzdHMKK3N0YXRpYyB2b2lkIFJldmFsaWRhdGVTRVNUKCBzdHJ1Y3QgU2NzaV9Ib3N0ICpIb3N0QWRhcHRlciwgCisJCSAgICAgICAgUEZDX0xPR0dFRElOX1BPUlQgcExvZ2dlZEluUG9ydCkKK3sKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSA9IChDUFFGQ0hCQSAqKUhvc3RBZGFwdGVyLT5ob3N0ZGF0YTsKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworICBGQ19FWENIQU5HRVMgKkV4Y2hhbmdlcyA9IGZjQ2hpcC0+RXhjaGFuZ2VzOworICBVTE9ORyB4X0lEOworICBCT09MRUFOIFRhY2hGcm96ZSA9IEZBTFNFOworICAKKyAgCisgIC8vIHJlLXZhbGlkYXRlIGFueSBTRVNUIGV4Y2hhbmdlcyB0aGF0IGFyZSBwZXJtaXR0ZWQKKyAgLy8gdG8gc3Vydml2ZSB0aGUgbGluayBkb3duIChlLmcuLCBnb29kIFBESVNDIHBlcmZvcm1lZCkKKyAgZm9yKCB4X0lEID0gMDsgeF9JRCA8IFRBQ0hfU0VTVF9MRU47IHhfSUQrKykKKyAgeworCisgICAgLy8gSWYgdGhlIFNFU1QgZW50cnkgcG9ydF9pZCBtYXRjaGVzIHRoZSBwTG9nZ2VkSW5Qb3J0LAorICAgIC8vIHdlIG5lZWQgdG8gcmUtdmFsaWRhdGUKKyAgICBpZiggKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRF0udHlwZSA9PSBTQ1NJX0lSRSkKKyAgICAgICAgIHx8IAorCShFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSURdLnR5cGUgPT0gU0NTSV9JV0UpKQorICAgIHsKKwkJICAgICAKKyAgICAgIGlmKCAoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS5mY2hzLmRfaWQgJiAweEZGRkZGRikgIC8vICgyNC1iaXQgcG9ydCBJRCkKKyAgICAgICAgICAgID09IHBMb2dnZWRJblBvcnQtPnBvcnRfaWQpIAorICAgICAgeworLy8JcHJpbnRrKCIgcmUtdmFsIHhJRCAlWGggIiwgeF9JRCk7CisgICAgICAgIGlmKCAhVGFjaEZyb3plICkgIC8vIGZyZWV6ZSBpZiBub3QgYWxyZWFkeSBmcm96ZW4KKyAgICAgICAgICBUYWNoRnJvemUgfD0gRnJlZXplVGFjaCggY3BxZmNIQkFkYXRhKTsKKyAgICAgICAgZmNDaGlwLT5TRVNULT51WyB4X0lEXS5JV0UuSGRyX0xlbiB8PSAweDgwMDAwMDAwOyAvLyBzZXQgVkFMIGJpdAorICAgICAgfQorICAgIH0gCisgIH0KKworICBpZiggVGFjaEZyb3plKSAKKyAgeyAKKyAgICBmY0NoaXAtPlVuRnJlZXplVGFjaHlvbiggZmNDaGlwLCAyKTsgIC8vIGJvdGggRVJRIGFuZCBGQ1AgYXNzaXN0cworICB9Cit9IAorCisKKy8vIENvbXBsZXRlIGFuIExpbnV4IENtbmRzIHRoYXQgd2UgUXVldWVkIGJlY2F1c2UKKy8vIG91ciBGQyBsaW5rIHdhcyBkb3duIChjYXVzZSBpbW1lZGlhdGUgcmV0cnkpCisKK3N0YXRpYyB2b2lkIFVuYmxvY2tTY3NpRGV2aWNlKCBzdHJ1Y3QgU2NzaV9Ib3N0ICpIb3N0QWRhcHRlciwgCisJCSAgICAgICAgUEZDX0xPR0dFRElOX1BPUlQgcExvZ2dlZEluUG9ydCkKK3sKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSA9IChDUFFGQ0hCQSAqKUhvc3RBZGFwdGVyLT5ob3N0ZGF0YTsKKyAgU2NzaV9DbW5kKiAqU0NwdHIgPSAmY3BxZmNIQkFkYXRhLT5MaW5rRG5DbW5kWzBdOworICBTY3NpX0NtbmQgKkNtbmQ7CisgIGludCBpbmR4OworCisgCisgIAorICAvLyBpZiB0aGUgZGV2aWNlIHdhcyBwcmV2aW91c2x5ICJibG9ja2VkIiwgbWFrZSBzdXJlCisgIC8vIHdlIHVuYmxvY2sgaXQgc28gTGludXggU0NTSSB3aWxsIHJlc3VtZQorCisgIHBMb2dnZWRJblBvcnQtPmRldmljZV9ibG9ja2VkID0gRkFMU0U7IC8vIGNsZWFyIG91ciBmbGFnCisKKyAgLy8gY2hlY2sgdGhlIExpbmsgRG93biBjb21tYW5kIHB0ciBidWZmZXI7CisgIC8vIHdlIGNhbiBjb21wbGV0ZSBub3cgY2F1c2luZyBpbW1lZGlhdGUgcmV0cnkKKyAgZm9yKCBpbmR4PTA7IGluZHggPCBDUFFGQ1RTX1JFUV9RVUVVRV9MRU47IGluZHgrKywgU0NwdHIrKykKKyAgeworICAgIGlmKCAqU0NwdHIgIT0gTlVMTCApIC8vIHNjc2kgY29tbWFuZCB0byBjb21wbGV0ZT8KKyAgICB7CisjaWZkZWYgRFVNTVlDTU5EX0RCRworICAgICAgcHJpbnRrKCJjb21wbGV0ZSBDbW5kICVwIGluIExpbmtEbkNtbmRbJWRdXG4iLCAqU0NwdHIsaW5keCk7CisjZW5kaWYKKyAgICAgIENtbmQgPSAqU0NwdHI7CisKKworICAgICAgLy8gQXJlIHRoZXJlIGFueSBRJ2QgY29tbWFuZHMgZm9yIHRoaXMgdGFyZ2V0PworICAgICAgaWYoIChDbW5kLT5kZXZpY2UtPmlkID09IHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy50YXJnZXQpCisJICAgICAgICYmCisgICAgICAgICAgKENtbmQtPmRldmljZS0+Y2hhbm5lbCA9PSBwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMuY2hhbm5lbCkgKQorICAgICAgeworICAgICAgICBDbW5kLT5yZXN1bHQgPSAoRElEX1NPRlRfRVJST1IgPDwxNik7IC8vIGZvcmNlIHJldHJ5CisgICAgICAgIGlmKCBDbW5kLT5zY3NpX2RvbmUgPT0gTlVMTCkgCisJeworICAgICAgICAgIHByaW50aygiTGlua0RuQ21uZCBzY3NpX2RvbmUgcHRyIG51bGwsIHBvcnRfaWQgJVhoXG4iLAorCQkgIHBMb2dnZWRJblBvcnQtPnBvcnRfaWQpOworCX0KKwllbHNlCisJICBjYWxsX3Njc2lfZG9uZShDbW5kKTsKKyAgICAgICAgKlNDcHRyID0gTlVMTDsgIC8vIGZyZWUgdGhpcyBzbG90IGZvciBuZXh0IHVzZQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisgIAorLy8jZGVmaW5lIFdXTl9EQkcgMQorCitzdGF0aWMgdm9pZCBTZXRMb2dpbkZpZWxkcygKKyAgUEZDX0xPR0dFRElOX1BPUlQgcExvZ2dlZEluUG9ydCwKKyAgVGFjaEZDSERSX0dDTU5EKiBmY2hzLAorICBCT09MRUFOIFBEaXNjLAorICBCT09MRUFOIE9yaWdpbmF0b3IpCit7CisgIExPR0lOX1BBWUxPQUQgbG9naTsgICAgICAgLy8gRkMtUEggUG9ydCBMb2dpbgorICBQUkxJX1JFUVVFU1QgcHJsaTsgIC8vIGNvcHkgZm9yIEJJRyBFTkRJQU4gc3dpdGNoCisgIGludCBpOworI2lmZGVmIFdXTl9EQkcKKyAgVUxPTkcgdWxCdWZmOworI2VuZGlmCisKKyAgQmlnRW5kaWFuU3dhcCggKFVDSEFSKikmZmNocy0+cGxbMF0sIChVQ0hBUiopJmxvZ2ksIHNpemVvZihsb2dpKSk7CisKKyAgcExvZ2dlZEluUG9ydC0+T3JpZ2luYXRvciA9IE9yaWdpbmF0b3I7CisgIHBMb2dnZWRJblBvcnQtPnBvcnRfaWQgPSBmY2hzLT5zX2lkICYgMHhGRkZGRkY7CisgIAorICBzd2l0Y2goIGZjaHMtPnBsWzBdICYgMHhmZmZmICkKKyAgeworICBjYXNlIDB4MDAwMDAwMDI6ICAvLyAgUExPR0kgb3IgUERJU0MgQUNDZXB0PworICAgIGlmKCBQRGlzYyApICAgICAvLyBQRElTQyBhY2NlcHQKKyAgICAgIGdvdG8gUERJU0NfY2FzZTsKKworICBjYXNlIDB4MDAwMDAwMDM6ICAvLyAgRUxTX1BMT0dJIG9yIEVMU19QTE9HSV9BQ0MKKworICAvLyBMb2dpbiBCQl9jcmVkaXQgdHlwaWNhbGx5IDAgZm9yIFRhY2h5b25zCisgICAgcExvZ2dlZEluUG9ydC0+QkJfY3JlZGl0ID0gbG9naS5jbW5fc2VydmljZXMuYmJfY3JlZGl0OworCisgICAgLy8gZS5nLiAxMjgsIDI1NiwgMTAyNCwgMjA0OCBwZXIgRkMtUEggc3BlYworICAgIC8vIFdlIGhhdmUgdG8gdXNlIHRoaXMgd2hlbiBzZXR0aW5nIHVwIFNFU1QgV3JpdGVzLAorICAgIC8vIHNpbmNlIHRoYXQgZGV0ZXJtaW5lcyBmcmFtZSBzaXplIHdlIHNlbmQuCisgICAgcExvZ2dlZEluUG9ydC0+cnhfZGF0YV9zaXplID0gbG9naS5jbGFzczMucnhfZGF0YV9zaXplOworICAgIHBMb2dnZWRJblBvcnQtPnBsb2dpID0gVFJVRTsKKyAgICBwTG9nZ2VkSW5Qb3J0LT5wZGlzYyA9IEZBTFNFOworICAgIHBMb2dnZWRJblBvcnQtPnBybGkgPSBGQUxTRTsgICAgLy8gRUxTX1BMT0dJIHJlc2V0cworICAgIHBMb2dnZWRJblBvcnQtPmZsb2dpID0gRkFMU0U7ICAgLy8gRUxTX1BMT0dJIHJlc2V0cworICAgIHBMb2dnZWRJblBvcnQtPmxvZ28gPSBGQUxTRTsgICAgLy8gRUxTX1BMT0dJIHJlc2V0cworICAgIHBMb2dnZWRJblBvcnQtPkxPR09fY291bnRlciA9IDA7Ly8gRUxTX1BMT0dJIHJlc2V0cworICAgIHBMb2dnZWRJblBvcnQtPkxPR09fdGltZXIgPSAwOy8vIEVMU19QTE9HSSByZXNldHMKKworICAgIC8vIHdhcyB0aGlzIFBMT0dJIHRvIGEgRmFicmljPworICAgIGlmKCBwTG9nZ2VkSW5Qb3J0LT5wb3J0X2lkID09IDB4RkZGRkZDICkgLy8gd2VsbCBrbm93IGFkZHJlc3MKKyAgICAgIHBMb2dnZWRJblBvcnQtPmZsb2dpID0gVFJVRTsKKworCisgICAgZm9yKCBpPTA7IGk8ODsgaSsrKSAgIC8vIGNvcHkgdGhlIExPR0lOIHBvcnQncyBXV04KKyAgICAgIHBMb2dnZWRJblBvcnQtPnUudWNXV05baV0gPSBsb2dpLnBvcnRfbmFtZVtpXTsgIAorCisjaWZkZWYgV1dOX0RCRworICAgIHVsQnVmZiA9IChVTE9ORylwTG9nZ2VkSW5Qb3J0LT51LmxpV1dOOworICAgIGlmKCBwTG9nZ2VkSW5Qb3J0LT5PcmlnaW5hdG9yKQorICAgICAgcHJpbnRrKCJvIik7CisgICAgZWxzZQorICAgICAgcHJpbnRrKCJyIik7CisgICAgcHJpbnRrKCJQTE9HSSBwb3J0X2lkICVYaCwgV1dOICUwOFgiLAorICAgICAgcExvZ2dlZEluUG9ydC0+cG9ydF9pZCwgdWxCdWZmKTsKKworICAgIHVsQnVmZiA9IChVTE9ORykocExvZ2dlZEluUG9ydC0+dS5saVdXTiA+PiAzMik7CisgICAgcHJpbnRrKCIlMDhYaCBmY1BvcnQgJXBcbiIsIHVsQnVmZiwgcExvZ2dlZEluUG9ydCk7CisjZW5kaWYKKyAgICBicmVhazsKKworCisKKyAgCisgIGNhc2UgMHgwMDAwMDAwNTogIC8vICBFTFNfTE9HTyAobG9nb3V0KQorCisKKyAgICBwTG9nZ2VkSW5Qb3J0LT5wbG9naSA9IEZBTFNFOworICAgIHBMb2dnZWRJblBvcnQtPnBkaXNjID0gRkFMU0U7CisgICAgcExvZ2dlZEluUG9ydC0+cHJsaSA9IEZBTFNFOyAgIC8vIEVMU19QTE9HSSByZXNldHMKKyAgICBwTG9nZ2VkSW5Qb3J0LT5mbG9naSA9IEZBTFNFOyAgLy8gRUxTX1BMT0dJIHJlc2V0cworICAgIHBMb2dnZWRJblBvcnQtPmxvZ28gPSBUUlVFOyAgICAvLyBFTFNfUExPR0kgcmVzZXRzCisgICAgcExvZ2dlZEluUG9ydC0+TE9HT19jb3VudGVyKys7IC8vIEVMU19QTE9HSSByZXNldHMKKyAgICBwTG9nZ2VkSW5Qb3J0LT5MT0dPX3RpbWVyID0gMDsKKyNpZmRlZiBXV05fREJHCisgICAgdWxCdWZmID0gKFVMT05HKXBMb2dnZWRJblBvcnQtPnUubGlXV047CisgICAgaWYoIHBMb2dnZWRJblBvcnQtPk9yaWdpbmF0b3IpCisgICAgICBwcmludGsoIm8iKTsKKyAgICBlbHNlCisgICAgICBwcmludGsoInIiKTsKKyAgICBwcmludGsoIkxPR08gcG9ydF9pZCAlWGgsIFdXTiAlMDhYIiwKKyAgICAgIHBMb2dnZWRJblBvcnQtPnBvcnRfaWQsIHVsQnVmZik7CisKKyAgICB1bEJ1ZmYgPSAoVUxPTkcpKHBMb2dnZWRJblBvcnQtPnUubGlXV04gPj4gMzIpOworICAgIHByaW50aygiJTA4WGhcbiIsIHVsQnVmZik7CisjZW5kaWYKKyAgICBicmVhazsKKworCisKK1BESVNDX2Nhc2U6CisgIGNhc2UgMHgwMDAwMDA1MDogLy8gIEVMU19QRElTQyBvciBFTFNfUERJU0NfQUNDCisgICAgcExvZ2dlZEluUG9ydC0+TE9HT190aW1lciA9IDA7ICAvLyBzdG9wIHRoZSB0aW1lLW91dAorICAgICAgCisgICAgcExvZ2dlZEluUG9ydC0+cHJsaSA9IFRSVUU7ICAgICAvLyByZWFkeSB0byBhY2NlcHQgRkNQLVNDU0kgSS9PCisgICAgCisKKyAgICAgIAorI2lmZGVmIFdXTl9EQkcKKyAgICB1bEJ1ZmYgPSAoVUxPTkcpcExvZ2dlZEluUG9ydC0+dS5saVdXTjsKKyAgICBpZiggcExvZ2dlZEluUG9ydC0+T3JpZ2luYXRvcikKKyAgICAgIHByaW50aygibyIpOworICAgIGVsc2UKKyAgICAgIHByaW50aygiciIpOworICAgIHByaW50aygiUERJU0MgcG9ydF9pZCAlWGgsIFdXTiAlMDhYIiwKKyAgICAgIHBMb2dnZWRJblBvcnQtPnBvcnRfaWQsIHVsQnVmZik7CisKKyAgICB1bEJ1ZmYgPSAoVUxPTkcpKHBMb2dnZWRJblBvcnQtPnUubGlXV04gPj4gMzIpOworICAgIHByaW50aygiJTA4WGhcbiIsIHVsQnVmZik7CisjZW5kaWYKKworCisgICAgCisgICAgYnJlYWs7CisKKworICAgIAorICBjYXNlICAweDEwMjBMOiAvLyAgUFJMST8KKyAgY2FzZSAgMHgxMDAyTDogLy8gIFBSTEkgQUNDZXB0PworICAgIEJpZ0VuZGlhblN3YXAoIChVQ0hBUiopJmZjaHMtPnBsWzBdLCAoVUNIQVIqKSZwcmxpLCBzaXplb2YocHJsaSkpOworCisgICAgcExvZ2dlZEluUG9ydC0+ZmNwX2luZm8gPSBwcmxpLmZjcF9pbmZvOyAvLyB0YXJnZXQvaW5pdGlhdG9yIGZsYWdzCisgICAgcExvZ2dlZEluUG9ydC0+cHJsaSA9IFRSVUU7ICAvLyBQTE9HSSByZXNldHMsIFBESVNDIGRvZXNuJ3QKKworICAgIHBMb2dnZWRJblBvcnQtPnBkaXNjID0gVFJVRTsgIC8vIGV4cGVjdCB0byBzZW5kIChvciByZWNlaXZlKSBQRElTQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgdGltZQorICAgIHBMb2dnZWRJblBvcnQtPkxPR09fdGltZXIgPSAwOyAgLy8gd2lsbCBiZSBzZXQgbmV4dCBMaW5rRG93bgorI2lmZGVmIFdXTl9EQkcKKyAgICB1bEJ1ZmYgPSAoVUxPTkcpcExvZ2dlZEluUG9ydC0+dS5saVdXTjsKKyAgICBpZiggcExvZ2dlZEluUG9ydC0+T3JpZ2luYXRvcikKKyAgICAgIHByaW50aygibyIpOworICAgIGVsc2UKKyAgICAgIHByaW50aygiciIpOworICAgIHByaW50aygiUFJMSSBwb3J0X2lkICVYaCwgV1dOICUwOFgiLAorICAgICAgcExvZ2dlZEluUG9ydC0+cG9ydF9pZCwgdWxCdWZmKTsKKworICAgIHVsQnVmZiA9IChVTE9ORykocExvZ2dlZEluUG9ydC0+dS5saVdXTiA+PiAzMik7CisgICAgICBwcmludGsoIiUwOFhoXG4iLCB1bEJ1ZmYpOworI2VuZGlmCisKKyAgICBicmVhazsKKworICB9CisKKyAgcmV0dXJuOworfQorCisKKworCisKKworc3RhdGljIHZvaWQgQnVpbGRMaW5rU2VydmljZVBheWxvYWQoIFBUQUNIWU9OIGZjQ2hpcCwgVUxPTkcgdHlwZSwgdm9pZCogcGF5bG9hZCkKK3sKKyAgTE9HSU5fUEFZTE9BRCAqcGxvZ2k7ICAvLyBGQy1QSCBQb3J0IExvZ2luCisgIExPR0lOX1BBWUxPQUQgUGxvZ2lQYXlsb2FkOyAgIC8vIGNvcHkgZm9yIEJJRyBFTkRJQU4gc3dpdGNoCisgIFBSTElfUkVRVUVTVCAgKnBybGk7ICAgICAgICAgIC8vIEZDUC1TQ1NJIFByb2Nlc3MgTG9naW4KKyAgUFJMSV9SRVFVRVNUICBQcmxpUGF5bG9hZDsgICAgLy8gY29weSBmb3IgQklHIEVORElBTiBzd2l0Y2gKKyAgTE9HT1VUX1BBWUxPQUQgICpsb2dvOworICBMT0dPVVRfUEFZTE9BRCAgTG9nb3V0UGF5bG9hZDsKKy8vICBQUkxPX1JFUVVFU1QgICpwcmxvOworLy8gIFBSTE9fUkVRVUVTVCAgUHJsb1BheWxvYWQ7CisgIFJFSkVDVF9NRVNTQUdFIHJqdCwgKnByanQ7CisKKyAgbWVtc2V0KCAmUGxvZ2lQYXlsb2FkLCAwLCBzaXplb2YoIFBsb2dpUGF5bG9hZCkpOworICBwbG9naSA9ICZQbG9naVBheWxvYWQ7ICAgIC8vIGxvYWQgaW50byBzdGFjayBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gQklHLUVORElBTiBzd2l0Y2ggYSBjb3B5IHRvIGNhbGxlcgorCisKKyAgc3dpdGNoKCB0eXBlICkgIC8vIHBheWxvYWQgdHlwZSBjYW4gYmUgRUxTX1BMT0dJLCBFTFNfUFJMSSwgQURJU0MsIC4uLgorICB7CisgICAgY2FzZSBFTFNfRkRJU0M6CisgICAgY2FzZSBFTFNfRkxPR0k6CisgICAgY2FzZSBFTFNfUExPR0lfQUNDOiAgIC8vIEZDLVBIIFBPUlQgTG9naW4gQWNjZXB0CisgICAgY2FzZSBFTFNfUExPR0k6ICAgLy8gRkMtUEggUE9SVCBMb2dpbgorICAgIGNhc2UgRUxTX1BESVNDOiAgIC8vIEZDLVBIMiBQb3J0IERpc2NvdmVyeSAtIHNhbWUgcGF5bG9hZCBhcyBFTFNfUExPR0kKKyAgICAgIHBsb2dpLT5sb2dpbl9jbWQgPSBMU19QTE9HSTsKKyAgICAgIGlmKCB0eXBlID09IEVMU19QRElTQykKKyAgICAgICAgcGxvZ2ktPmxvZ2luX2NtZCA9IExTX1BESVNDOworICAgICAgZWxzZSBpZiggdHlwZSA9PSBFTFNfUExPR0lfQUNDICkKKyAgICAgICAgcGxvZ2ktPmxvZ2luX2NtZCA9IExTX0FDQzsKKworICAgICAgcGxvZ2ktPmNtbl9zZXJ2aWNlcy5iYl9jcmVkaXQgPSAweDAwOworICAgICAgcGxvZ2ktPmNtbl9zZXJ2aWNlcy5sb3dlc3RfdmVyID0gZmNDaGlwLT5sb3dlc3RfRkNQSF92ZXI7CisgICAgICBwbG9naS0+Y21uX3NlcnZpY2VzLmhpZ2hlc3RfdmVyID0gZmNDaGlwLT5oaWdoZXN0X0ZDUEhfdmVyOworICAgICAgcGxvZ2ktPmNtbl9zZXJ2aWNlcy5iYl9yeF9zaXplID0gVEFDSExJVEVfVFNfUlhfU0laRTsKKyAgICAgIHBsb2dpLT5jbW5fc2VydmljZXMuY29tbW9uX2ZlYXR1cmVzID0gQ09OVElOVU9TTFlfSU5DUkVBU0lORyB8CisgICAgICAgICAgICAgIFJBTkRPTV9SRUxBVElWRV9PRkZTRVQ7CisKKyAgICAgICAgICAgICAvLyBmaWxsIGluIHdpdGggV29ybGQgV2lkZSBOYW1lIGJhc2VkIFBvcnQgTmFtZSAtIDggVUNIQVJzCisgICAgICAgICAgICAgLy8gZ2V0IGZyb20gVGFjaCByZWdpc3RlcnMgV1dOIGhpICYgbG8KKyAgICAgIExvYWRXV04oIGZjQ2hpcCwgcGxvZ2ktPnBvcnRfbmFtZSwgMCk7CisgICAgICAgICAgICAgLy8gZmlsbCBpbiB3aXRoIFdvcmxkIFdpZGUgTmFtZSBiYXNlZCBOb2RlL0ZhYnJpYyBOYW1lIC0gOCBVQ0hBUnMKKyAgICAgICAgICAgICAvLyBnZXQgZnJvbSBUYWNoIHJlZ2lzdGVycyBXV04gaGkgJiBsbworICAgICAgTG9hZFdXTiggZmNDaGlwLCBwbG9naS0+bm9kZV9uYW1lLCAxKTsKKworCS8vIEZvciBTZWFnYXRlIERyaXZlcy4KKwkvLworICAgICAgcGxvZ2ktPmNtbl9zZXJ2aWNlcy5jb21tb25fZmVhdHVyZXMgfD0gMHg4MDA7CisgICAgICBwbG9naS0+Y21uX3NlcnZpY2VzLnJlbF9vZmZzZXQgPSAweEZFOworICAgICAgcGxvZ2ktPmNtbl9zZXJ2aWNlcy5jb25jdXJyZW50X3NlcSA9IDE7CisgICAgICBwbG9naS0+Y2xhc3MxLnNlcnZpY2Vfb3B0aW9ucyA9IDB4MDA7CisgICAgICBwbG9naS0+Y2xhc3MyLnNlcnZpY2Vfb3B0aW9ucyA9IDB4MDA7CisgICAgICBwbG9naS0+Y2xhc3MzLnNlcnZpY2Vfb3B0aW9ucyA9IENMQVNTX1ZBTElEOworICAgICAgcGxvZ2ktPmNsYXNzMy5pbml0aWF0b3JfY29udHJvbCA9IDB4MDA7CisgICAgICBwbG9naS0+Y2xhc3MzLnJ4X2RhdGFfc2l6ZSA9IE1BWF9SWF9QQVlMT0FEOworICAgICAgcGxvZ2ktPmNsYXNzMy5yZWNpcGllbnRfY29udHJvbCA9CisgICAgICAgICAgICAgRVJST1JfRElTQ0FSRCB8IE9ORV9DQVRFR09SWV9TRVFVRU5DRTsKKyAgICAgIHBsb2dpLT5jbGFzczMuY29uY3VycmVudF9zZXF1ZW5jZXMgPSAxOworICAgICAgcGxvZ2ktPmNsYXNzMy5vcGVuX3NlcXVlbmNlcyA9IDE7CisgICAgICBwbG9naS0+dmVuZG9yX2lkWzBdID0gJ0MnOyBwbG9naS0+dmVuZG9yX2lkWzFdID0gJ1EnOworICAgICAgcGxvZ2ktPnZlbmRvcl92ZXJzaW9uWzBdID0gJ0MnOyBwbG9naS0+dmVuZG9yX3ZlcnNpb25bMV0gPSAnUSc7CisgICAgICBwbG9naS0+dmVuZG9yX3ZlcnNpb25bMl0gPSAnICc7IHBsb2dpLT52ZW5kb3JfdmVyc2lvblszXSA9ICcwJzsKKyAgICAgIHBsb2dpLT52ZW5kb3JfdmVyc2lvbls0XSA9ICcwJzsgcGxvZ2ktPnZlbmRvcl92ZXJzaW9uWzVdID0gJzAnOworCisKKyAgICAgIC8vIEZMT0dJIHNwZWNpZmljIGZpZWxkcy4uLiAoc2VlIEZDLUZMQSwgUmV2IDIuNywgQXVnIDE5OTksIHNlYyA1LjEpCisgICAgICBpZiggKHR5cGUgPT0gRUxTX0ZMT0dJKSB8fCAodHlwZSA9PSBFTFNfRkRJU0MpICkKKyAgICAgIHsKKyAgICAgICAgaWYoIHR5cGUgPT0gRUxTX0ZMT0dJICkKKyAgCSAgcGxvZ2ktPmxvZ2luX2NtZCA9IExTX0ZMT0dJOyAgCisJZWxzZQorICAJICBwbG9naS0+bG9naW5fY21kID0gTFNfRkRJU0M7ICAKKworICAgICAgICBwbG9naS0+Y21uX3NlcnZpY2VzLmxvd2VzdF92ZXIgPSAweDIwOworICAgICAgICBwbG9naS0+Y21uX3NlcnZpY2VzLmNvbW1vbl9mZWF0dXJlcyA9IDB4MDgwMDsKKyAgICAgICAgcGxvZ2ktPmNtbl9zZXJ2aWNlcy5yZWxfb2Zmc2V0ID0gMDsKKyAgICAgICAgcGxvZ2ktPmNtbl9zZXJ2aWNlcy5jb25jdXJyZW50X3NlcSA9IDA7CisKKyAgICAgICAgcGxvZ2ktPmNsYXNzMy5zZXJ2aWNlX29wdGlvbnMgPSAweDg4MDA7CisgICAgICAgIHBsb2dpLT5jbGFzczMucnhfZGF0YV9zaXplID0gMDsKKyAgICAgICAgcGxvZ2ktPmNsYXNzMy5yZWNpcGllbnRfY29udHJvbCA9IDA7CisgICAgICAgIHBsb2dpLT5jbGFzczMuY29uY3VycmVudF9zZXF1ZW5jZXMgPSAwOworICAgICAgICBwbG9naS0+Y2xhc3MzLm9wZW5fc2VxdWVuY2VzID0gMDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgICAgICAgICAvLyBjb3B5IGJhY2sgdG8gY2FsbGVyJ3MgYnVmZiwgdy8gQklHIEVORElBTiBzd2FwCisgICAgICBCaWdFbmRpYW5Td2FwKCAoVUNIQVIqKSZQbG9naVBheWxvYWQsIHBheWxvYWQsICBzaXplb2YoUGxvZ2lQYXlsb2FkKSk7CisgICAgICBicmVhazsKKworICAgIAorICAgIGNhc2UgRUxTX0FDQzogICAgICAgLy8gZ2VuZXJpYyBFeHRlbmRlZCBMaW5rIFNlcnZpY2UgQUNDZXB0CSAgICAKKyAgICAgIHBsb2dpLT5sb2dpbl9jbWQgPSBMU19BQ0M7CisgICAgICAgICAgICAgIC8vIGNvcHkgYmFjayB0byBjYWxsZXIncyBidWZmLCB3LyBCSUcgRU5ESUFOIHN3YXAKKyAgICAgIEJpZ0VuZGlhblN3YXAoIChVQ0hBUiopJlBsb2dpUGF5bG9hZCwgcGF5bG9hZCwgIDQpOworICAgICAgYnJlYWs7CisKKworICAgICAgCisgICAgY2FzZSBFTFNfU0NSOiAgICAvLyBGYWJyaWMgU3RhdGUgQ2hhbmdlIFJlZ2lzdHJhdGlvbgorICAgIHsKKyAgICAgIFNDUl9QTCBzY3I7ICAgICAvLyBzdGF0ZSBjaGFuZ2UgcmVnaXN0cmF0aW9uCisKKyAgICAgIG1lbXNldCggJnNjciwgMCwgc2l6ZW9mKHNjcikpOworCisgICAgICBzY3IuY29tbWFuZCA9IExTX1NDUjsgIC8vIDB4NjIwMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIEZDLUZMQSwgUmV2IDIuNywgVGFibGUgQS4yMiAocGcgODIpCisgICAgICBzY3IuZnVuY3Rpb24gPSAzOyAgICAgIC8vIDEgPSBFdmVudHMgZGV0ZWN0ZWQgYnkgRmFicmljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIgPSBOX1BvcnQgZGV0ZWN0ZWQgcmVnaXN0cmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMgPSBGdWxsIHJlZ2lzdHJhdGlvbgorICAgICAgCisgICAgICAvLyBjb3B5IGJhY2sgdG8gY2FsbGVyJ3MgYnVmZiwgdy8gQklHIEVORElBTiBzd2FwCisgICAgICBCaWdFbmRpYW5Td2FwKCAoVUNIQVIqKSZzY3IsIHBheWxvYWQsICBzaXplb2YoU0NSX1BMKSk7CisgICAgfQorICAgIAorICAgIGJyZWFrOworCisgICAgCisgICAgY2FzZSBGQ1NfTlNSOiAgICAvLyBGYWJyaWMgTmFtZSBTZXJ2aWNlIFJlcXVlc3QKKyAgICB7CisgICAgICBOU1JfUEwgbnNyOyAgICAvLyBOYW1lIFNlcnZlciBSZXEuIHBheWxvYWQKKworICAgICAgbWVtc2V0KCAmbnNyLCAwLCBzaXplb2YoTlNSX1BMKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIEJyb2NhZGUgRmFicmljIFByb2dyYW1taW5nIEd1aWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXYgMS4zLCBwZyA0LTQ0CisgICAgICBuc3IuQ1RfUmV2ID0gMHgwMTAwMDAwMDsKKyAgICAgIG5zci5GQ1NfVHlwZSA9IDB4RkMwMjAwMDA7CisgICAgICBuc3IuQ29tbWFuZF9jb2RlID0gMHgwMTcxMDAwMDsKKyAgICAgIG5zci5GQ1AgPSA4OworICAgICAKKyAgICAgIC8vIGNvcHkgYmFjayB0byBjYWxsZXIncyBidWZmLCB3LyBCSUcgRU5ESUFOIHN3YXAKKyAgICAgIEJpZ0VuZGlhblN3YXAoIChVQ0hBUiopJm5zciwgcGF5bG9hZCwgIHNpemVvZihOU1JfUEwpKTsKKyAgICB9CisgICAgCisgICAgYnJlYWs7CisKKworCisgICAgCisgICAgY2FzZSBFTFNfTE9HTzogICAvLyBGQy1QSCBQT1JUIExvZ091dAorICAgICAgbG9nbyA9ICZMb2dvdXRQYXlsb2FkOyAgICAvLyBsb2FkIGludG8gc3RhY2sgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIEJJRy1FTkRJQU4gc3dpdGNoIGEgY29weSB0byBjYWxsZXIKKyAgICAgIGxvZ28tPmNtZCA9IExTX0xPR087CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIDMgVUNIQVJzIG9mIHRoZSBub2RlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGlmIHByaXZhdGUgbG9vcCwgdXBwZXIgdHdvIFVDSEFScyAwKQorICAgICAgbG9nby0+cmVzZXJ2ZWQgPSAwOworCisgICAgICBsb2dvLT5uX3BvcnRfaWRlbnRpZmllclswXSA9IChVQ0hBUikoZmNDaGlwLT5SZWdpc3RlcnMubXlfYWxfcGEpOworICAgICAgbG9nby0+bl9wb3J0X2lkZW50aWZpZXJbMV0gPQorICAgICAgICAgICAgICAgICAgICAgKFVDSEFSKShmY0NoaXAtPlJlZ2lzdGVycy5teV9hbF9wYT4+OCk7CisgICAgICBsb2dvLT5uX3BvcnRfaWRlbnRpZmllclsyXSA9CisgICAgICAgICAgICAgICAgICAgICAoVUNIQVIpKGZjQ2hpcC0+UmVnaXN0ZXJzLm15X2FsX3BhPj4xNik7CisgICAgICAgICAgICAgLy8gZmlsbCBpbiB3aXRoIFdvcmxkIFdpZGUgTmFtZSBiYXNlZCBQb3J0IE5hbWUgLSA4IFVDSEFScworICAgICAgICAgICAgIC8vIGdldCBmcm9tIFRhY2ggcmVnaXN0ZXJzIFdXTiBoaSAmIGxvCisgICAgICBMb2FkV1dOKCBmY0NoaXAsIGxvZ28tPnBvcnRfbmFtZSwgMCk7CisKKyAgICAgIEJpZ0VuZGlhblN3YXAoIChVQ0hBUiopJkxvZ291dFBheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLCAgc2l6ZW9mKExvZ291dFBheWxvYWQpICk7ICAvLyAxNiBVQ0hBUiBzdHJ1Y3QKKyAgICAgIGJyZWFrOworCisKKyAgICBjYXNlIEVMU19MT0dPX0FDQzogICAgIC8vIExvZ291dCBBY2NlcHQgKEZILVBIIHBnIDE0OSwgdGFibGUgNzQpCisgICAgICBsb2dvID0gJkxvZ291dFBheWxvYWQ7ICAgIC8vIGxvYWQgaW50byBzdGFjayBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gQklHLUVORElBTiBzd2l0Y2ggYSBjb3B5IHRvIGNhbGxlcgorICAgICAgbG9nby0+Y21kID0gTFNfQUNDOworICAgICAgQmlnRW5kaWFuU3dhcCggKFVDSEFSKikmTG9nb3V0UGF5bG9hZCwgcGF5bG9hZCwgNCApOyAgLy8gNCBVQ0hBUiBjbW5kCisgICAgICBicmVhazsKKyAgICAgIAorCisgICAgY2FzZSBFTFNfUkpUOiAgICAgICAgICAvLyBFTFNfUkpUIGxpbmsgc2VydmljZSByZWplY3QgKEZILVBIIHBnIDE1NSkKKworICAgICAgcHJqdCA9IChSRUpFQ1RfTUVTU0FHRSopcGF5bG9hZDsgIC8vIHBpY2sgdXAgcGFzc2VkIGRhdGEKKyAgICAgIHJqdC5jb21tYW5kX2NvZGUgPSBFTFNfUkpUOworICAgICAgICAgICAgICAgICAgICAgICAvLyByZXZlcnNlIGZpZWxkcywgYmVjYXVzZSBvZiBTd2FwIHRoYXQgZm9sbG93cy4uLgorICAgICAgcmp0LnZlbmRvciA9IHByanQtPnJlc2VydmVkOyAvLyB2ZW5kb3Igc3BlY2lmaWMKKyAgICAgIHJqdC5leHBsYWluID0gcHJqdC0+cmVhc29uOyAvLworICAgICAgcmp0LnJlYXNvbiA9IHByanQtPmV4cGxhaW47IC8vCisgICAgICByanQucmVzZXJ2ZWQgPSBwcmp0LT52ZW5kb3I7IC8vCisgICAgICAgICAgICAgICAgICAgICAgIC8vIEJJRy1FTkRJQU4gc3dpdGNoIGEgY29weSB0byBjYWxsZXIKKyAgICAgIEJpZ0VuZGlhblN3YXAoIChVQ0hBUiopJnJqdCwgcGF5bG9hZCwgOCApOyAgLy8gOCBVQ0hBUiBjbW5kCisgICAgICBicmVhazsKKworCisKKworCisgICAgY2FzZSBFTFNfUFJMSV9BQ0M6ICAvLyBQcm9jZXNzIExvZ2luIEFDQ2VwdAorICAgIGNhc2UgRUxTX1BSTEk6ICAvLyBQcm9jZXNzIExvZ2luCisgICAgY2FzZSBFTFNfUFJMTzogIC8vIFByb2Nlc3MgTG9nb3V0CisgICAgICBtZW1zZXQoICZQcmxpUGF5bG9hZCwgMCwgc2l6ZW9mKCBQcmxpUGF5bG9hZCkpOworICAgICAgcHJsaSA9ICZQcmxpUGF5bG9hZDsgICAgICAvLyBsb2FkIGludG8gc3RhY2sgYnVmZmVyLAorCisgICAgICBpZiggdHlwZSA9PSBFTFNfUFJMSSApCisgICAgICAgIHBybGktPmNtZCA9IDB4MjA7ICAvLyBMb2dpbgorICAgICAgZWxzZSBpZiggdHlwZSA9PSBFTFNfUFJMTyApCisgICAgICAgIHBybGktPmNtZCA9IDB4MjE7ICAvLyBMb2dvdXQKKyAgICAgIGVsc2UgaWYoIHR5cGUgPT0gRUxTX1BSTElfQUNDICkKKyAgICAgIHsKKyAgICAgICAgcHJsaS0+Y21kID0gMHgwMjsgIC8vIExvZ2luIEFDQ2VwdAorICAgICAgICBwcmxpLT52YWxpZCA9IFJFUVVFU1RfRVhFQ1VURUQ7CisgICAgICB9CisKKworICAgICAgcHJsaS0+dmFsaWQgfD0gU0NTSV9GQ1AgfCBFU1RBQkxJU0hfUEFJUjsKKyAgICAgIHBybGktPmZjcF9pbmZvID0gUkVBRF9YRkVSX1JEWTsKKyAgICAgIHBybGktPnBhZ2VfbGVuZ3RoID0gMHgxMDsKKyAgICAgIHBybGktPnBheWxvYWRfbGVuZ3RoID0gMjA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbiBiZSBpbml0aWF0b3IgQU5EIHRhcmdldAorCisgICAgICBpZiggZmNDaGlwLT5PcHRpb25zLmluaXRpYXRvciApCisgICAgICAgIHBybGktPmZjcF9pbmZvIHw9IElOSVRJQVRPUl9GVU5DVElPTjsKKyAgICAgIGlmKCBmY0NoaXAtPk9wdGlvbnMudGFyZ2V0ICkKKyAgICAgICAgcHJsaS0+ZmNwX2luZm8gfD0gVEFSR0VUX0ZVTkNUSU9OOworCisgICAgICBCaWdFbmRpYW5Td2FwKCAoVUNIQVIqKSZQcmxpUGF5bG9hZCwgcGF5bG9hZCwgIHBybGktPnBheWxvYWRfbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworCisKKworICAgIGRlZmF1bHQ6ICAvLyBubyBjYW4gZG8gLSBwcm9ncmFtbWluZyBlcnJvcgorICAgICAgcHJpbnRrKCIgQnVpbGRMaW5rU2VydmljZVBheWxvYWQgdW5rbm93biFcbiIpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLy8gbG9hZHMgOCBVQ0hBUnMgZm9yIFBPUlQgbmFtZSBvciBOT0RFIG5hbWUgYmFzZSBvbgorLy8gY29udHJvbGxlcidzIFdXTi4KK3ZvaWQgTG9hZFdXTiggUFRBQ0hZT04gZmNDaGlwLCBVQ0hBUiogZGVzdCwgVUNIQVIgdHlwZSkKK3sKKyAgVUNIQVIqIGJQdHIsIGk7CisKKyAgc3dpdGNoKCB0eXBlICkKKyAgeworICAgIGNhc2UgMDogIC8vIFBvcnRfTmFtZQorICAgICAgYlB0ciA9IChVQ0hBUiopJmZjQ2hpcC0+UmVnaXN0ZXJzLnd3bl9oaTsKKyAgICAgIGZvciggaSA9MDsgaTw0OyBpKyspCisgICAgICAgIGRlc3RbaV0gPSAqYlB0cisrOworICAgICAgYlB0ciA9IChVQ0hBUiopJmZjQ2hpcC0+UmVnaXN0ZXJzLnd3bl9sbzsKKyAgICAgIGZvciggaSA9NDsgaTw4OyBpKyspCisgICAgICAgIGRlc3RbaV0gPSAqYlB0cisrOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOiAgLy8gTm9kZS9GYWJyaWMgX05hbWUKKyAgICAgIGJQdHIgPSAoVUNIQVIqKSZmY0NoaXAtPlJlZ2lzdGVycy53d25faGk7CisgICAgICBmb3IoIGkgPTA7IGk8NDsgaSsrKQorICAgICAgICBkZXN0W2ldID0gKmJQdHIrKzsKKyAgICAgIGJQdHIgPSAoVUNIQVIqKSZmY0NoaXAtPlJlZ2lzdGVycy53d25fbG87CisgICAgICBmb3IoIGkgPTQ7IGk8ODsgaSsrKQorICAgICAgICBkZXN0W2ldID0gKmJQdHIrKzsKKyAgICAgIGJyZWFrOworICB9CisgIAorfQorCisKKworLy8gV2UgY2hlY2sgdGhlIFBvcnQgTG9naW4gcGF5bG9hZCBmb3IgcmVxdWlyZWQgdmFsdWVzLiAgTm90ZSB0aGF0CisvLyBFTFNfUExPR0kgYW5kIEVMU19QRElTQyAoUG9ydCBESVNDb3ZlcikgdXNlIHRoZSBzYW1lIHBheWxvYWQuCisKKworaW50IHZlcmlmeV9QTE9HSSggUFRBQ0hZT04gZmNDaGlwLAorICAgICAgICAgICAgICAgICAgVGFjaEZDSERSX0dDTU5EKiBmY2hzLCAKKyAgICAgICAgICAgICAgICAgIFVMT05HKiByZWplY3RfZXhwbGFpbikKK3sKKyAgTE9HSU5fUEFZTE9BRAlsb2dpbjsKKworICAgICAgICAgICAgICAgICAgLy8gc291cmNlLCBkZXN0LCBsZW4gKHNob3VsZCBiZSBtdWx0LiBvZiA0KQorICBCaWdFbmRpYW5Td2FwKCAoVUNIQVIqKSZmY2hzLT5wbFswXSwgKFVDSEFSKikmbG9naW4sICBzaXplb2YobG9naW4pKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIEZDIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBvdGhlciBwb3J0J3MgaGlnaGVzdCBzdXBwb3J0ZWQgdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGxlc3MgdGhhbiBvdXIgbG93ZXN0LCBhbmQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgb3RoZXIgcG9ydCdzIGxvd2VzdAorICBpZiggbG9naW4uY21uX3NlcnZpY2VzLmhpZ2hlc3RfdmVyIDwgZmNDaGlwLT5sb3dlc3RfRkNQSF92ZXIgfHwKKyAgICAgIGxvZ2luLmNtbl9zZXJ2aWNlcy5sb3dlc3RfdmVyID4gZmNDaGlwLT5oaWdoZXN0X0ZDUEhfdmVyICkKKyAgeworICAgICpyZWplY3RfZXhwbGFpbiA9IExTX1JKVF9SRUFTT04oIExPR0lDQUxfRVJST1IsIE9QVElPTlNfRVJST1IpOworICAgIHJldHVybiBMT0dJQ0FMX0VSUk9SOworICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNlaXZlIERhdGEgRmllbGQgU2l6ZSBtdXN0IGJlID49MTI4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyIEZDLVBICisgIGlmIChsb2dpbi5jbW5fc2VydmljZXMuYmJfcnhfc2l6ZSA8IDEyOCkKKyAgeworICAgICpyZWplY3RfZXhwbGFpbiA9IExTX1JKVF9SRUFTT04oIExPR0lDQUxfRVJST1IsIERBVEFfRklFTERfU0laRV9FUlJPUik7CisgICAgcmV0dXJuIExPR0lDQUxfRVJST1I7CisgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgY2hlY2sgQ2xhc3MgMyBwYXJhbXMKKyAgaWYoIGxvZ2luLmNsYXNzMy5zZXJ2aWNlX29wdGlvbnMgJiBDTEFTU19WQUxJRCkKKyAgeworICAgIGlmIChsb2dpbi5jbGFzczMucnhfZGF0YV9zaXplIDwgMTI4KQorICAgIHsKKyAgICAgICpyZWplY3RfZXhwbGFpbiA9IExTX1JKVF9SRUFTT04oIExPR0lDQUxfRVJST1IsIElOVkFMSURfQ1NQKTsKKyAgICAgIHJldHVybiBMT0dJQ0FMX0VSUk9SOworICAgIH0KKyAgICBpZiggbG9naW4uY2xhc3MzLmluaXRpYXRvcl9jb250cm9sICYgWElEX1JFUVVJUkVEKQorICAgIHsKKyAgICAgICpyZWplY3RfZXhwbGFpbiA9IExTX1JKVF9SRUFTT04oIExPR0lDQUxfRVJST1IsIElOSVRJQVRPUl9DVExfRVJST1IpOworICAgICAgcmV0dXJuIExPR0lDQUxfRVJST1I7CisgICAgfQorICB9CisgIHJldHVybiAwOyAgIC8vIHN1Y2Nlc3MKK30KKworCisKKworaW50IHZlcmlmeV9QUkxJKCBUYWNoRkNIRFJfR0NNTkQqIGZjaHMsIFVMT05HKiByZWplY3RfZXhwbGFpbikKK3sKKyAgUFJMSV9SRVFVRVNUIHBybGk7ICAvLyBidWZmZXIgZm9yIEJJRyBFTkRJQU4KKworICAgICAgICAgICAgICAgICAgLy8gc291cmNlLCBkZXN0LCBsZW4gKHNob3VsZCBiZSBtdWx0LiBvZiA0KQorICBCaWdFbmRpYW5Td2FwKCAoVUNIQVIqKSZmY2hzLT5wbFswXSwgKFVDSEFSKikmcHJsaSwgIHNpemVvZihwcmxpKSk7CisKKyAgaWYoIHBybGkuZmNwX2luZm8gPT0gMCApICAvLyBpLmUuLCBub3QgdGFyZ2V0IG9yIGluaXRpYXRvcj8KKyAgeworICAgICpyZWplY3RfZXhwbGFpbiA9IExTX1JKVF9SRUFTT04oIExPR0lDQUxfRVJST1IsIE9QVElPTlNfRVJST1IpOworICAgIHJldHVybiBMT0dJQ0FMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIDA7ICAvLyBzdWNjZXNzCit9CisKKworLy8gU1dBUCBVQ0hBUnMgYXMgcmVxdWlyZWQgYnkgRmlicmUgQ2hhbm5lbCAoaS5lLiBCSUcgRU5ESUFOKQorLy8gSU5QVVRTOgorLy8gICBzb3VyY2UgICAtIHB0ciB0byBMSVRUTEUgRU5ESUFOIFVMT05HUworLy8gICBjbnQgICAgICAtIG51bWJlciBvZiBVQ0hBUnMgdG8gc3dpdGNoIChzaG91bGQgYmUgbXVsdC4gb2YgVUxPTkcpCisvLyBPVVRQVVRTOgorLy8gICBkZXN0ICAgICAtIHB0ciB0byBCSUcgRU5ESUFOIGNvcHkKKy8vIFJFVFVSTjoKKy8vICAgbm9uZQorLy8KK3ZvaWQgQmlnRW5kaWFuU3dhcCggVUNIQVIgKnNvdXJjZSwgVUNIQVIgKmRlc3QsICBVU0hPUlQgY250KQoreworICBpbnQgaSxqOworCisgIHNvdXJjZSs9MzsgICAvLyBzdGFydCBhdCBNU0Igb2YgMXN0IFVMT05HCisgIGZvciggaj0wOyBqIDwgY250OyBqKz00LCBzb3VyY2UrPTQsIGRlc3QrPTQpICAvLyBldmVyeSBVTE9ORworICB7CisgICAgZm9yKCBpPTA7IGk8NDsgaSsrKSAgLy8gZXZlcnkgVUNIQVIgaW4gVUxPTkcKKyAgICAgICAgICAqKGRlc3QraSkgPSAqKHNvdXJjZS1pKTsKKyAgfQorfQorCisKKworCisvLyBCdWlsZCBGQyBFeGNoYW5nZXMuLi4uLi4uLi4uLi4KKworc3RhdGljIHZvaWQgIGJ1aWxkRkNQc3RhdHVzKCAKKyAgUFRBQ0hZT04gZmNDaGlwLCAKKyAgVUxPTkcgRXhjaGFuZ2VJRCk7CisKK3N0YXRpYyBMT05HIEZpbmRGcmVlRXhjaGFuZ2UoIFBUQUNIWU9OIGZjQ2hpcCwgVUxPTkcgdHlwZSApOworCitzdGF0aWMgVUxPTkcgYnVpbGRfU0VTVF9zZ0xpc3QoIAorICBzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LAorICBVTE9ORyAqU0VTVGFsUGFpclN0YXJ0LAorICBTY3NpX0NtbmQgKkNtbmQsCisgIFVMT05HICpzZ1BhaXJzLAorICBQU0dQQUdFUyAqc2dQYWdlc19oZWFkICAvLyBsaW5rIGxpc3Qgb2YgVEwgRXh0LiBTL0cgcGFnZXMgZnJvbSBPL1MgUG9vbAorKTsKKworc3RhdGljIGludCBidWlsZF9GQ1BfcGF5bG9hZCggU2NzaV9DbW5kICpDbW5kLCAKKyAgVUNIQVIqIHBheWxvYWQsIFVMT05HIHR5cGUsIFVMT05HIGZjcF9kbCApOworCisKKy8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSQgorICAgICAgRVJRICAgICAgICAgICBfX19fX19fX19fX19fX19fX18KKyAgfCAgICAgICAgICB8ICAgLyB8IFJlcV9BX1NGU19MZW4gICAgfCAgICAgICAgX19fX19fX19fX19fX19fX19fX18KKyAgfC0tLS0tLS0tLS18ICAvICB8IFJlcV9BX1NGU19BZGRyICAgfC0tLS0tLS0+fCAgUmVzZXJ2ZWQgICAgICAgICB8CisgIHwgICBJUkIgICAgfCAvICAgfCBSZXFfQV9EX0lEICAgICAgIHwgICAgICAgIHwgU09GIEVPRiBUaW1lU3RhbXAgfAorICB8LS0tLS0tLS0tLS0vICAgIHwgUmVxX0FfU0VTVF9JbmRleCB8LSsgICAgICB8IFJfQ1RMIHwgICBEX0lEICAgIHwKKyAgfCAgIElSQiAgICB8ICAgICB8IFJlcV9CLi4uICAgICAgICAgfCB8ICAgICAgfCBDU19DVEx8ICAgU19JRCAgICB8IAorICB8LS0tLS0tLS0tLS1cICAgIHwgICAgICAgICAgICAgICAgICB8IHwgICAgICB8IFRZUEUgIHwgICBGX0NUTCAgIHwKKyAgfCAgIElSQiAgICB8IFwgICB8ICAgICAgICAgICAgICAgICAgfCB8ICAgICAgfCBTRVFfSUQgIHwgU0VRX0NOVCB8CisgIHwtLS0tLS0tLS0tLSAgXCAgfCAgICAgICAgICAgICAgICAgIHwgKy0tPistLXwgT1hfSUQgICB8IFJYX0lEICAgfAorICB8ICAgICAgICAgIHwgICBcIHxfX19fX19fX19fX19fX19fX198ICAgICB8ICB8ICAgICAgIFJPICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgfCBwbCAocGF5bG9hZC9jbW5kKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgICAgICAgIC4uLi4uICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICB8X19fX19fX19fX19fX19fX19fX3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wKK3wKK3wgICAgICAgICAgICAgICAgICAgICAgICBlLmcuIElXRSAgICAKK3wgICAgU0VTVCAgICAgICAgICAgX19fX19fX19fX19fX19fX19fICAgICAgICAgICAgIGZvciBGQ1BfREFUQQorfCB8ICAgICAgICAgIHwgICAvIHwgICAgICAgfCBIZHJfTGVuICB8ICAgICAgICBfX19fX19fX19fX19fX19fX19fXworfCB8LS0tLS0tLS0tLXwgIC8gIHwgIEhkcl9BZGRyX0FkZHIgICB8LS0tLS0tLT58ICBSZXNlcnZlZCAgICAgICAgIHwKK3wgfCAgIFswXSAgICB8IC8gICB8UmVtb3RlX0lEfCBSU1BfTGVufCAgICAgICAgfCBTT0YgRU9GIFRpbWVTdGFtcCB8Cit8IHwtLS0tLS0tLS0tLS8gICAgfCAgIFJTUF9BZGRyICAgICAgIHwtLS0rICAgIHwgUl9DVEwgfCAgIERfSUQgICAgfAorKy0+ICAgWzFdICAgIHwgICAgIHwgICAgICAgfCBCdWZmX09mZiB8ICAgfCAgICB8IENTX0NUTHwgICBTX0lEICAgIHwgCisgIHwtLS0tLS0tLS0tLVwgICAgfEJ1ZmZJbmRleHwgTGluayAgIHwgICB8ICAgIHwgVFlQRSAgfCAgIEZfQ1RMICAgfAorICB8ICAgWzJdICAgIHwgXCAgIHwgUnN2ZCAgfCAgIFJYX0lEICB8ICAgfCAgICB8IFNFUV9JRCAgfCBTRVFfQ05UIHwKKyAgfC0tLS0tLS0tLS0tICBcICB8ICAgIERhdGFfTGVuICAgICAgfCAgIHwgICAgfCBPWF9JRCAgIHwgUlhfSUQgICB8CisgIHwgICAgLi4uICAgfCAgIFwgfCAgICAgRXhwX1JPICAgICAgIHwgICB8ICAgIHwgICAgICAgUk8gICAgICAgICAgfAorICB8LS0tLS0tLS0tLXwgICAgIHwgICBFeHBfQnl0ZV9DbnQgICB8ICAgfCAgICB8X19fX19fX19fX19fX19fX19fX3wKKyAgfCBTRVNUX0xFTiB8ICArLS18ICAgIExlbiAgICAgICAgICAgfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfF9fX19fX19fX198ICB8ICB8ICAgQWRkcmVzcyAgICAgICAgfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfCAgfCAgICAuLi4gICAgICAgICAgIHwgICB8ICAgICAgICAgZm9yIEZDUF9SU1AgIAorICAgICAgICAgICAgICAgIHwgIHxfX19fX19fX19fX19fX19fX198ICAgfCAgICBfX19fX19fX19fX19fX19fX19fXworICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS18ICBSZXNlcnZlZCAgICAgICAgIHwgICAKKyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTT0YgRU9GIFRpbWVTdGFtcCB8CisgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUl9DVEwgfCAgIERfSUQgICAgfAorICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENTX0NUTHwgICBTX0lEICAgIHwgCisgICAgICAgICAgICAgICAgKy0tLSBsb2NhbCBvciBleHRlbmRlZCAgICAgICAgIHwgICAgIC4uLi4gICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgc2NhdHRlci9nYXRoZXIgbGlzdHMKKyAgICAgICAgICAgICAgICAgICAgIGRlZmluaW5nIHVwcGVyLWxheWVyCisgICAgICAgICAgICAgICAgICAgICBkYXRhIChlLmcuIGZyb20gdXNlcidzIEFwcCkKKworCisqLworLy8gQWxsIFRhY2hMaXRlIGNvbW1hbmRzIG11c3Qgc3RhcnQgd2l0aCBhIFNGUyAoU2luZ2xlIEZyYW1lIFNlcXVlbmNlKQorLy8gY29tbWFuZC4gIEluIHRoZSBzaW1wbGVzdCBjYXNlIChhIE5PUCBCYXNpYyBMaW5rIGNvbW1hbmQpLAorLy8gb25seSBvbmUgZnJhbWUgaGVhZGVyIGFuZCBFUlEgZW50cnkgaXMgcmVxdWlyZWQuICBUaGUgbW9zdCBjb21wbGV4CisvLyBjYXNlIGlzIHRoZSBTQ1NJIGFzc2lzdGVkIGNvbW1hbmQsIHdoaWNoIHJlcXVpcmVzIGFuIEVSUSBlbnRyeSwKKy8vIFNFU1QgZW50cnksIGFuZCBzZXZlcmFsIGZyYW1lIGhlYWRlcnMgYW5kIGRhdGEgYnVmZmVycyBhbGwKKy8vIGxvZ2ljYWxseSBsaW5rZWQgdG9nZXRoZXIuCisvLyBJbnB1dHM6CisvLyAgIGNwcWZjSEJBZGF0YSAgLSBjb250cm9sbGVyIHN0cnVjdAorLy8gICB0eXBlICAgICAgICAgIC0gUExPR0ksIFNDU0lfSVdFLCBldGMuCisvLyAgIEluRkNIUyAgICAgICAgLSBJbmNvbWluZyBUYWNobGl0ZSBGQ0hTIHdoaWNoIHByb21wdGVkIHRoaXMgZXhjaGFuZ2UKKy8vICAgICAgICAgICAgICAgICAgIChvbmx5IHNfaWQgc2V0IGlmIHdlIGFyZSBvcmlnaW5hdGluZykKKy8vICAgRGF0YSAgICAgICAgICAtIFBWT0lEIHRvIGRhdGEgc3RydWN0IGNvbnNpc3RlbnQgd2l0aCAidHlwZSIKKy8vICAgZmNFeGNoYW5nZUluZGV4IC0gcG9pbnRlciB0byBPWC9SRCBJRCB2YWx1ZSBvZiBidWlsdCBleGNoYW5nZQorLy8gUmV0dXJuOgorLy8gICBmY0V4Y2hhbmdlSW5kZXggLSBPWC9SRCBJRCB2YWx1ZSBpZiBzdWNjZXNzZnVsCisvLyAgIDAgICAgLSBzdWNjZXNzCisvLyAgSU5WQUxJRF9BUkdTICAgIC0gTlVMTC8gaW52YWxpZCBwYXNzZWQgYXJncworLy8gIEJBRF9BTFBBICAgICAgICAtIEJhZCBzb3VyY2UgYWxfcGEgYWRkcmVzcworLy8gIExOS0RXTl9PU0xTICAgICAtIExpbmsgRG93biAoYWNjb3JkaW5nIHRvIHRoaXMgY29udHJvbGxlcikKKy8vICBPVVRRVUVfRlVMTCAgICAgLSBPdXRib3VuZCBRdWUgZnVsbAorLy8gIERSSVZFUlFfRlVMTCAgICAtIGNvbnRyb2xsZXIncyBFeGNoYW5nZSBhcnJheSBmdWxsCisvLyAgU0VTVF9GVUxMICAgICAgIC0gU0VTVCB0YWJsZSBmdWxsCisvLworLy8gUmVtYXJrczoKKy8vIFBzdWVkbyBjb2RlOgorLy8gQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgLyBiYWQgYXJncworLy8gQnVpbGQgb3V0Z29pbmcgRkNIUyAtIHRoZSBoZWFkZXIvcGF5bG9hZCBzdHJ1Y3QKKy8vIEJ1aWxkIElSQiAoZm9yIEVSUSBlbnRyeSkKKy8vIGlmIFNDU0kgY29tbWFuZCwgYnVpbGQgU0VTVCBlbnRyeSAoZS5nLiBJV0UsIFRSRSwuLi4pCisvLyByZXR1cm4gc3VjY2VzcworCisvL3NidWlsZGV4CitVTE9ORyBjcHFmY1RTQnVpbGRFeGNoYW5nZSgKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSwKKyAgVUxPTkcgdHlwZSwgLy8gZS5nLiBQTE9HSQorICBUYWNoRkNIRFJfR0NNTkQqIEluRkNIUywgIC8vIGluY29taW5nIEZDSFMKKyAgdm9pZCAqRGF0YSwgICAgICAgICAgICAgICAvLyB0aGUgQ0RCLCBzY2F0dGVyL2dhdGhlciwgZXRjLiAgCisgIExPTkcgKmZjRXhjaGFuZ2VJbmRleCApICAgLy8gcG9pbnRzIHRvIGFsbG9jYXRlZCBleGNoYW5nZSwgCit7CisgIFBUQUNIWU9OIGZjQ2hpcCA9ICZjcHFmY0hCQWRhdGEtPmZjQ2hpcDsKKyAgRkNfRVhDSEFOR0VTICpFeGNoYW5nZXMgPSBmY0NoaXAtPkV4Y2hhbmdlczsKKyAgVUxPTkcgdWxTdGF0dXMgPSAwOyAgLy8gYXNzdW1lIE9LCisgIFVTSE9SVCBveF9JRCwgcnhfSUQ9MHhGRkZGOworICBVTE9ORyBTZnNMZW49MEw7CisgIFRhY2hMaXRlSVJCKiBwSVJCOworICBJUkJmbGFncyBJUkJfZmxhZ3M7CisgIFVDSEFSICpwSVJCX2ZsYWdzID0gKFVDSEFSKikmSVJCX2ZsYWdzOworICBUYWNoRkNIRFJfR0NNTkQqIENNRGZjaHM7CisgIFRhY2hGQ0hEUiogZGF0YUhEUjsgICAgIC8vIDMyIGJ5dGUgSEVBREVSIE9OTFkgRkNQLURBVEEgYnVmZmVyCisgIFRhY2hGQ0hEUl9SU1AqIHJzcEhEUjsgICAgIC8vIDMyIGJ5dGUgaGVhZGVyICsgUlNQIHBheWxvYWQKKyAgU2NzaV9DbW5kICpDbW5kID0gKFNjc2lfQ21uZCopRGF0YTsgICAvLyBMaW51eCBTY3NpIENEQiwgUy9HLCAuLi4KKyAgVGFjaExpdGVJV0UqIHBJV0U7CisgIFRhY2hMaXRlSVJFKiBwSVJFOworICBUYWNoTGl0ZVRXRSogcFRXRTsKKyAgVGFjaExpdGVUUkUqIHBUUkU7CisgIFVMT05HIGZjcF9kbDsgICAgICAgICAgIC8vIHRvdGFsIGJ5dGUgbGVuZ3RoIG9mIERBVEEgdHJhbnNmZXJyZWQKKyAgVUxPTkcgZmw7ICAgICAgICAgICAgICAgLy8gZnJhbWUgbGVuZ3RoIChGQyBmcmFtZSBzaXplLCAxMjgsIDI1NiwgNTEyLCAxMDI0KQorICBVTE9ORyBzZ1BhaXJzOyAgICAgICAgICAvLyBudW1iZXIgb2YgdmFsaWQgc2NhdHRlci9nYXRoZXIgcGFpcnMKKyAgaW50IEZDUF9TQ1NJX2NvbW1hbmQ7CisgIEJBX0FDQ19QQVlMT0FEICpiYV9hY2M7CisgIEJBX1JKVF9QQVlMT0FEICpiYV9yanQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgcGFzc2VkIEFSR1MKKyAgaWYoICFmY0NoaXAtPkVSUSApICAgICAgLy8gTlVMTCBwdHIgbWVhbnMgdW5pbml0aWFsaXplZCBUYWNobGl0ZSBjaGlwCisgICAgcmV0dXJuIElOVkFMSURfQVJHUzsKKworCisgIGlmKCB0eXBlID09IFNDU0lfSVJFIHx8CisgICAgICB0eXBlID09IFNDU0lfVFJFIHx8CisgICAgICB0eXBlID09IFNDU0lfSVdFIHx8CisgICAgICB0eXBlID09IFNDU0lfVFdFKQorICAgIEZDUF9TQ1NJX2NvbW1hbmQgPSAxOworCisgIGVsc2UKKyAgICBGQ1BfU0NTSV9jb21tYW5kID0gMDsKKworCisgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgY29tbWFuZHMgdGhhdCBwYXNzIHBheWxvYWQgZGF0YSAoZS5nLiBTQ1NJIHdyaXRlKQorICAgICAgICAgICAgICAgICAgICAgLy8gZXhhbWluZSBjb21tYW5kIHN0cnVjdCAtIHZlcmlmeSB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIG9mIHMvZyBidWZmZXJzIGlzIGFkZXF1YXRlIGZvciB0b3RhbCBwYXlsb2FkCisgICAgICAgICAgICAgICAgICAgICAvLyBsZW5ndGggKGVuZCBvZiBsaXN0IGlzIE5VTEwgYWRkcmVzcykKKworICBpZiggRkNQX1NDU0lfY29tbWFuZCApCisgIHsKKyAgICBpZiggRGF0YSApICAgICAvLyBtdXN0IGhhdmUgZGF0YSBkZXNjcmlwdG9yIChTL0cgbGlzdCAtLSBhdCBsZWFzdAorICAgICAgICAgICAgICAgICAgIC8vIG9uZSBhZGRyZXNzIHdpdGggYXQgbGVhc3QgMSBieXRlIG9mIGRhdGEpCisgICAgeworICAgICAgLy8gc29tZXRoaW5nIHRvIGRvIChsYXRlcik/CisgICAgfQorCisgICAgZWxzZQorICAgICAgcmV0dXJuIElOVkFMSURfQVJHUzsgIC8vIGludmFsaWQgREFUQSBwdHIKKyAgfQorCisgICAgCisKKyAgICAgICAgIC8vIHdlIGNhbiBidWlsZCBhbiBFeGNoYW5nZSBmb3IgbGF0ZXIgUXVldWluZyAob24gdGhlIFRMIGNoaXApCisgICAgICAgICAvLyBpZiBhbiBlbXB0eSBzbG90IGlzIGF2YWlsYWJsZSBpbiB0aGUgRGV2RXh0IGZvciB0aGlzIGNvbnRyb2xsZXIKKyAgICAgICAgIC8vIGxvb2sgZm9yIGF2YWlsYWJsZSBFeGNoYW5nZSBzbG90Li4uCisKKyAgaWYoIHR5cGUgIT0gRkNQX1JFU1BPTlNFICYmCisgICAgICB0eXBlICE9IEJMU19BQlRTICYmCisgICAgICB0eXBlICE9IEJMU19BQlRTX0FDQyApICAvLyBhbHJlYWR5IGhhdmUgRXhjaGFuZ2Ugc2xvdCEKKyAgICAqZmNFeGNoYW5nZUluZGV4ID0gRmluZEZyZWVFeGNoYW5nZSggZmNDaGlwLCB0eXBlICk7CisKKyAgaWYoICpmY0V4Y2hhbmdlSW5kZXggIT0gLTEgKSAgIC8vIEV4Y2hhbmdlIGlzIGF2YWlsYWJsZT8KKyAgeworICAgICAgICAgICAgICAgICAgICAgLy8gYXNzaWduIHRtcCBwdHIgKHNob3J0aGFuZCkKKyAgICBDTURmY2hzID0gJkV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgKmZjRXhjaGFuZ2VJbmRleF0uZmNoczsgCisKKyAgICBpZiggQ21uZCAhPSBOVUxMICkgLy8gKG5lY2Vzc2FyeSBmb3IgQUJUUyBjYXNlcykKKyAgICB7CisgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbICpmY0V4Y2hhbmdlSW5kZXhdLkNtbmQgPSBDbW5kOyAvLyBMaW51eCBTY3NpCisgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbICpmY0V4Y2hhbmdlSW5kZXhdLnBMb2dnZWRJblBvcnQgPSAKKwlmY0ZpbmRMb2dnZWRJblBvcnQoIGZjQ2hpcCwKKyAgICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbICpmY0V4Y2hhbmdlSW5kZXhdLkNtbmQsIC8vIGZpbmQgU2NzaSBOZXh1cworICAgICAgICAgIDAsICAgICAgICAvLyBET04nVCBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIEZDIHBvcnQgaWQKKwkgIE5VTEwsICAgICAvLyBET04nVCBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIEZDIFdXTgorICAgICAgICAgIE5VTEwpOyAgICAvLyBET04nVCBjYXJlIGFib3V0IGVuZCBvZiBsaXN0CisKKyAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGNvbW1hbmQgZnJhbWUgaGVhZGVyICgmIGRhdGEpIGFjY29yZGluZworICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY29tbWFuZCB0eXBlCisKKyAgICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkcyBjb21tb24gZm9yIGFsbCBTRlMgZnJhbWUgdHlwZXMKKyAgICBDTURmY2hzLT5yZXNlcnZlZCA9IDBMOyAvLyBtdXN0IGNsZWFyCisgICAgQ01EZmNocy0+c29mX2VvZiA9IDB4NzUwMDAwMDBMOyAgLy8gU09GaTM6RU9GbiAgbm8gVUFNOyBMQ3I9MCwgbm8gVFMKKyAgICAKKyAgICAgICAgICAgICAvLyBnZXQgdGhlIGRlc3RpbmF0aW9uIHBvcnRfaWQgZnJvbSBpbmNvbWluZyBGQ0hTCisgICAgICAgICAgICAgLy8gKGluaXRpYWxpemVkIGJlZm9yZSBjYWxsaW5nIGlmIHdlJ3JlIE9yaWdpbmF0b3IpCisgICAgICAgICAgICAgLy8gRnJhbWUgZ29lcyB0byBwb3J0IGl0IHdhcyBmcm9tIC0gdGhlIHNvdXJjZV9pZAorICAgIAorICAgIENNRGZjaHMtPmRfaWQgPSBJbkZDSFMtPnNfaWQgJjB4RkZGRkZGOyAvLyBkZXN0aW5hdGlvbiAoYWRkIFJfQ1RMIGxhdGVyKQorICAgIENNRGZjaHMtPnNfaWQgPSBmY0NoaXAtPlJlZ2lzdGVycy5teV9hbF9wYTsgLy8gQ1NfQ1RMID0gMAorCisKKyAgICAvLyBub3cgZW50ZXIgY29tbWFuZC1zcGVjaWZpYyBmaWVsZHMKKyAgICBzd2l0Y2goIHR5cGUgKQorICAgIHsKKworICAgIGNhc2UgQkxTX05PUDogICAvLyBGQyBkZWZpbmVkIGJhc2ljIGxpbmsgc2VydmljZSBjb21tYW5kIE5PLU9QCisgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHVuaXF1ZSBYX0lEcyEgKHVzZSB0cmFja2luZyBmdW5jdGlvbikKKworICAgICAgKnBJUkJfZmxhZ3MgPSAwOyAgICAgIC8vIGNsZWFyIElSQiBmbGFncworICAgICAgSVJCX2ZsYWdzLlNGQSA9IDE7ICAgIC8vIHNlbmQgU0ZTIChub3QgU0VTVCBpbmRleCkKKyAgICAgIFNmc0xlbiA9ICpwSVJCX2ZsYWdzOworCisgICAgICBTZnNMZW4gPDw9IDI0OyAgICAgICAgLy8gc2hpZnQgZmxhZ3MgdG8gTVNCCisgICAgICBTZnNMZW4gKz0gMzJMOyAgICAgICAgLy8gYWRkIGxlbiB0byBMU0IgKGhlYWRlciBvbmx5IC0gbm8gcGF5bG9hZCkKKworICAgICAgICAgICAgICAgICAgIC8vIFRZUEVbMzEtMjRdIDAwIEJhc2ljIExpbmsgU2VydmljZQorICAgICAgICAgICAgICAgICAgIC8vIGZfY3RsWzIzOjBdIGV4Y2hnIG9yaWdpbmF0b3IsIDFzdCBzZXEsIHhmZXIgUy5JLgorICAgICAgQ01EZmNocy0+ZF9pZCB8PSAweDgwMDAwMDAwTDsgIC8vIFJfQ1RMID0gODAgZm9yIE5PUCAoQmFzaWMgTGluayBTZXIuKQorICAgICAgQ01EZmNocy0+Zl9jdGwgPSAweDAwMzEwMDAwTDsgIC8vIHhjaG5nIG9yaWdpbmF0b3IsIDFzdCBzZXEsLi4uLgorICAgICAgQ01EZmNocy0+c2VxX2NudCA9IDB4MEw7CisgICAgICBDTURmY2hzLT5veF9yeF9pZCA9IDB4RkZGRjsgICAgICAgIC8vIFJYX0lEIGZvciBub3c7IE9YX0lEIG9uIHN0YXJ0CisgICAgICBDTURmY2hzLT5ybyA9IDB4MEw7ICAgIC8vIHJlbGF0aXZlIG9mZnNldCAobi9hKQorICAgICAgQ01EZmNocy0+cGxbMF0gPSAweGFhYmJjY2RkTDsgICAvLyB3b3JkcyA4LTE1IGZyYW1lIGRhdGEgcGF5bG9hZCAobi9hKQorICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyAqZmNFeGNoYW5nZUluZGV4XS50aW1lT3V0ID0gMTsgLy8gc2Vjb25kcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoTk9QIHNob3VsZCBjb21wbGV0ZSB+aW5zdGFudGx5KQorICAgICAgYnJlYWs7CisKKworICAgIAorICAgIAorICAgIGNhc2UgQkxTX0FCVFNfQUNDOiAgLy8gQWJvcnQgU2VxdWVuY2UgQUNDZXB0CisgICAgICAqcElSQl9mbGFncyA9IDA7ICAgICAgLy8gY2xlYXIgSVJCIGZsYWdzCisgICAgICBJUkJfZmxhZ3MuU0ZBID0gMTsgICAgLy8gc2VuZCBTRlMgKG5vdCBTRVNUIGluZGV4KQorICAgICAgU2ZzTGVuID0gKnBJUkJfZmxhZ3M7CisKKyAgICAgIFNmc0xlbiA8PD0gMjQ7ICAgICAgICAvLyBzaGlmdCBmbGFncyB0byBNU0IKKyAgICAgIFNmc0xlbiArPSAzMiArIDEyOyAgICAvLyBhZGQgbGVuIHRvIExTQiAoaGVhZGVyICsgMyBEV09SRCBwYXlsb2FkKQorCisgICAgICBDTURmY2hzLT5kX2lkIHw9IDB4ODQwMDAwMDBMOyAgLy8gUl9DVEwgPSA4NCBmb3IgQkFTSUMgQUNDZXB0CisgICAgICAgICAgICAgICAgICAgLy8gVFlQRVszMS0yNF0gMDAgQmFzaWMgTGluayBTZXJ2aWNlCisgICAgICAgICAgICAgICAgICAgLy8gZl9jdGxbMjM6MF0gZXhjaGcgb3JpZ2luYXRvciwgbm90IDFzdCBzZXEsIHhmZXIgUy5JLgorICAgICAgQ01EZmNocy0+Zl9jdGwgPSAweDAwOTEwMDAwTDsgIC8vIHhjaG5nZSByZXNwb25kZXIsIGxhc3Qgc2VxLCB4ZmVyIFNJCisgICAgICAgICAgICAgICAgICAgLy8gQ01EZmNocy0+c2VxX2lkICYgY291bnQgbWlnaHQgYmUgc2V0IGZyb20gRGF0YUhkcj8KKyAgICAgIENNRGZjaHMtPnJvID0gMHgwTDsgICAgLy8gcmVsYXRpdmUgb2Zmc2V0IChuL2EpCisgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbICpmY0V4Y2hhbmdlSW5kZXhdLnRpbWVPdXQgPSA1OyAvLyBzZWNvbmRzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAoVGltZW91dCBpbiBjYXNlIG9mIHdlaXJkIGVycm9yKQorICAgICAgCisgICAgICAvLyBub3cgc2V0IHRoZSBBQ0NlcHQgcGF5bG9hZC4uLgorICAgICAgYmFfYWNjID0gKEJBX0FDQ19QQVlMT0FEKikmQ01EZmNocy0+cGxbMF07CisgICAgICBtZW1zZXQoIGJhX2FjYywgMCwgc2l6ZW9mKCBCQV9BQ0NfUEFZTE9BRCkpOworICAgICAgLy8gU2luY2UgUExEQSByZXF1aXJlcyAob25seSkgZW50aXJlIEV4Y2hhbmdlIGFib3J0cywgd2UgZG9uJ3QgbmVlZAorICAgICAgLy8gdG8gd29ycnkgYWJvdXQgd2hhdCB0aGUgbGFzdCBzZXF1ZW5jZSB3YXMuCisKKyAgICAgIC8vIFdlIGV4cGVjdCB0aGF0IGEgInRhcmdldCIgdGFzayBpcyBhY2NlcHRpbmcgdGhlIGFib3J0LCBzbyB3ZQorICAgICAgLy8gY2FuIHVzZSB0aGUgT1gvUlggSUQgcGFpciAKKyAgICAgIGJhX2FjYy0+b3hfcnhfaWQgPSBDTURmY2hzLT5veF9yeF9pZDsKKyAKKyAgICAgIC8vIHNvdXJjZSwgZGVzdCwgI2J5dGVzCisgICAgICBCaWdFbmRpYW5Td2FwKChVQ0hBUiAqKSZDTURmY2hzLT5veF9yeF9pZCwgKFVDSEFSICopJmJhX2FjYy0+b3hfcnhfaWQsIDQpOworCisgICAgICBiYV9hY2MtPmxvd19zZXFfY250ID0gMDsKKyAgICAgIGJhX2FjYy0+aGlnaF9zZXFfY250ID0gMHhGRkZGOworCisKKyAgICAgIGJyZWFrOworICAgIAorCisgICAgY2FzZSBCTFNfQUJUU19SSlQ6ICAvLyBBYm9ydCBTZXF1ZW5jZSBBQ0NlcHQKKyAgICAgICpwSVJCX2ZsYWdzID0gMDsgICAgICAvLyBjbGVhciBJUkIgZmxhZ3MKKyAgICAgIElSQl9mbGFncy5TRkEgPSAxOyAgICAvLyBzZW5kIFNGUyAobm90IFNFU1QgaW5kZXgpCisgICAgICBTZnNMZW4gPSAqcElSQl9mbGFnczsKKworICAgICAgU2ZzTGVuIDw8PSAyNDsgICAgICAgIC8vIHNoaWZ0IGZsYWdzIHRvIE1TQgorICAgICAgU2ZzTGVuICs9IDMyICsgMTI7ICAgIC8vIGFkZCBsZW4gdG8gTFNCIChoZWFkZXIgKyAzIERXT1JEIHBheWxvYWQpCisKKyAgICAgIENNRGZjaHMtPmRfaWQgfD0gMHg4NTAwMDAwMEw7ICAvLyBSX0NUTCA9IDg1IGZvciBCQVNJQyBSZUplY1QKKyAgICAgICAgICAgICAgICAgICAvLyBmX2N0bFsyMzowXSBleGNoZyBvcmlnaW5hdG9yLCBub3QgMXN0IHNlcSwgeGZlciBTLkkuCisgICAgICAgICAgICAgICAgICAgLy8gVFlQRVszMS0yNF0gMDAgQmFzaWMgTGluayBTZXJ2aWNlCisgICAgICBDTURmY2hzLT5mX2N0bCA9IDB4MDA5MTAwMDBMOyAgLy8geGNobmdlIHJlc3BvbmRlciwgbGFzdCBzZXEsIHhmZXIgU0kKKyAgICAgICAgICAgICAgICAgICAvLyBDTURmY2hzLT5zZXFfaWQgJiBjb3VudCBtaWdodCBiZSBzZXQgZnJvbSBEYXRhSGRyPworICAgICAgQ01EZmNocy0+cm8gPSAweDBMOyAgICAvLyByZWxhdGl2ZSBvZmZzZXQgKG4vYSkKKyAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgKmZjRXhjaGFuZ2VJbmRleF0udGltZU91dCA9IDU7IC8vIHNlY29uZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIChUaW1lb3V0IGluIGNhc2Ugb2Ygd2VpcmQgZXJyb3IpCisgICAgICAKKyAgICAgIENNRGZjaHMtPm94X3J4X2lkID0gSW5GQ0hTLT5veF9yeF9pZDsgLy8gY29weSBmcm9tIHNlbmRlciEKKyAgICAgIAorICAgICAgLy8gbm93IHNldCB0aGUgUmVKZWNUIHBheWxvYWQuLi4KKyAgICAgIGJhX3JqdCA9IChCQV9SSlRfUEFZTE9BRCopJkNNRGZjaHMtPnBsWzBdOworICAgICAgbWVtc2V0KCBiYV9yanQsIDAsIHNpemVvZiggQkFfUkpUX1BBWUxPQUQpKTsKKworICAgICAgLy8gV2UgZXhwZWN0IHRoYXQgYSAidGFyZ2V0IiB0YXNrIGNvdWxkbid0IGZpbmQgdGhlIEV4aGFuZ2UgaW4gdGhlCisgICAgICAvLyBhcnJheSBvZiBhY3RpdmUgZXhjaGFuZ2VzLCBzbyB3ZSB1c2UgYSBuZXcgTGlua1NlcnZpY2UgWF9JRC4KKyAgICAgIC8vIFNlZSBSZWplY3QgcGF5bG9hZCBkZXNjcmlwdGlvbiBpbiBGQy1QSCAoUmV2IDQuMyksIHBnLiAxNDAKKyAgICAgIGJhX3JqdC0+cmVhc29uX2NvZGUgPSAweDA5OyAvLyAidW5hYmxlIHRvIHBlcmZvcm0gY29tbWFuZCByZXF1ZXN0IgorICAgICAgYmFfcmp0LT5yZWFzb25fZXhwbGFpbiA9IDB4MDM7IC8vIGludmFsaWQgT1gvUlggSUQgcGFpcgorCisKKyAgICAgIGJyZWFrOworICAgIAorICAgIAorICAgIGNhc2UgQkxTX0FCVFM6ICAgLy8gRkMgZGVmaW5lZCBiYXNpYyBsaW5rIHNlcnZpY2UgY29tbWFuZCBBQlRTIAorICAgICAgICAgICAgICAgICAgICAgLy8gQWJvcnQgU2VxdWVuY2UKKyAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAqcElSQl9mbGFncyA9IDA7ICAgICAgLy8gY2xlYXIgSVJCIGZsYWdzCisgICAgICBJUkJfZmxhZ3MuU0ZBID0gMTsgICAgLy8gc2VuZCBTRlMgKG5vdCBTRVNUIGluZGV4KQorICAgICAgU2ZzTGVuID0gKnBJUkJfZmxhZ3M7CisKKyAgICAgIFNmc0xlbiA8PD0gMjQ7ICAgICAgICAvLyBzaGlmdCBmbGFncyB0byBNU0IKKyAgICAgIFNmc0xlbiArPSAzMkw7ICAgICAgICAvLyBhZGQgbGVuIHRvIExTQiAoaGVhZGVyIG9ubHkgLSBubyBwYXlsb2FkKQorCisgICAgICAgICAgICAgICAgICAgLy8gVFlQRVszMS0yNF0gMDAgQmFzaWMgTGluayBTZXJ2aWNlCisgICAgICAgICAgICAgICAgICAgLy8gZl9jdGxbMjM6MF0gZXhjaGcgb3JpZ2luYXRvciwgbm90IDFzdCBzZXEsIHhmZXIgUy5JLgorICAgICAgQ01EZmNocy0+ZF9pZCB8PSAweDgxMDAwMDAwTDsgIC8vIFJfQ1RMID0gODEgZm9yIEFCVFMKKyAgICAgIENNRGZjaHMtPmZfY3RsID0gMHgwMDExMDAwMEw7ICAvLyB4Y2huZ2Ugb3JpZ2luYXRvciwgbGFzdCBzZXEsIHhmZXIgU0kKKyAgICAgICAgICAgICAgICAgICAvLyBDTURmY2hzLT5zZXFfaWQgJiBjb3VudCBtaWdodCBiZSBzZXQgZnJvbSBEYXRhSGRyPworICAgICAgQ01EZmNocy0+cm8gPSAweDBMOyAgICAvLyByZWxhdGl2ZSBvZmZzZXQgKG4vYSkKKyAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgKmZjRXhjaGFuZ2VJbmRleF0udGltZU91dCA9IDI7IC8vIHNlY29uZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIChBQlRTIG11c3QgdGltZW91dCB3aGVuIHJlc3BvbmRlciBpcyBnb25lKQorICAgICAgYnJlYWs7CisKKyAgICAKKyAgICAKKyAgICBjYXNlIEZDU19OU1I6ICAgIC8vIEZhYnJpYyBOYW1lIFNlcnZpY2UgUmVxdWVzdAorICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgKmZjRXhjaGFuZ2VJbmRleF0ucmVUcmllcyA9IDI7CisKKworICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyAqZmNFeGNoYW5nZUluZGV4XS50aW1lT3V0ID0gMjsgLy8gc2Vjb25kcworICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9YX0lELCBsaW5rZWQgdG8gRHJpdmVyIFRyYW5zYWN0aW9uIElECisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGZpeC11cCBhdCBRdWVpbmcgdGltZSkKKyAgICAgIENNRGZjaHMtPm94X3J4X2lkID0gMHhGRkZGOyAvLyBSWF9JRCAtIFJlc3BvbmRlciAodGFyZ2V0KSB0byBtb2RpZnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9YX0lEIHNldCBhdCBFUlF1ZWluZyB0aW1lCisgICAgICAqcElSQl9mbGFncyA9IDA7ICAgICAgLy8gY2xlYXIgSVJCIGZsYWdzCisgICAgICBJUkJfZmxhZ3MuU0ZBID0gMTsgICAgLy8gc2VuZCBTRlMgKG5vdCBTRVNUIGluZGV4KQorICAgICAgU2ZzTGVuID0gKnBJUkJfZmxhZ3M7CisKKyAgICAgIFNmc0xlbiA8PD0gMjQ7ICAgICAgICAvLyBzaGlmdCBmbGFncyB0byBNU0IKKyAgICAgIFNmc0xlbiArPSAoMzJMICsgc2l6ZW9mKE5TUl9QTCkpOyAvLyBhZGQgbGVuIChoZWFkZXIgJiBOU1IgcGF5bG9hZCkKKworICAgICAgQ01EZmNocy0+ZF9pZCB8PSAweDAyMDAwMDAwTDsgIC8vIFJfQ1RMID0gMDIgZm9yIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmFtZSBTZXJ2aWNlIFJlcXVlc3Q6IFVuc29saWNpdGVkIAorICAgICAgICAgICAgICAgICAgIC8vIFRZUEVbMzEtMjRdIDAxIEV4dGVuZGVkIExpbmsgU2VydmljZQorICAgICAgICAgICAgICAgICAgIC8vIGZfY3RsWzIzOjBdIGV4Y2hnIG9yaWdpbmF0b3IsIDFzdCBzZXEsIHhmZXIgUy5JLgorICAgICAgQ01EZmNocy0+Zl9jdGwgPSAweDIwMjEwMDAwTDsKKyAgICAgICAgICAgICAgICAgICAvLyBPWF9JRCB3aWxsIGJlIGZpeGVkLXVwIGF0IFRhY2h5b24gZW5xdWVpbmcgdGltZQorICAgICAgQ01EZmNocy0+c2VxX2NudCA9IDA7IC8vIHNlcSBJRCwgREZfY3RsLCBzZXEgY250CisgICAgICBDTURmY2hzLT5ybyA9IDB4MEw7ICAgIC8vIHJlbGF0aXZlIG9mZnNldCAobi9hKQorCisgICAgICBCdWlsZExpbmtTZXJ2aWNlUGF5bG9hZCggZmNDaGlwLCB0eXBlLCAmQ01EZmNocy0+cGxbMF0pOworCisgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAgIGJyZWFrOworICAgIAorICAgIAorICAgIAorICAgIAorICAgIGNhc2UgRUxTX1BMT0dJOiAgLy8gRkMtUEggZXh0ZW5kZWQgbGluayBzZXJ2aWNlIGNvbW1hbmQgUG9ydCBMb2dpbgorICAgICAgLy8gKE1heSwgMjAwMCkKKyAgICAgIC8vIE5PVEUhIFRoaXMgc3BlY2lhbCBjYXNlIGZhY2lsaXRhdGVzIFNBTk1hcmsgdGVzdGluZy4gIFRoZSBTQU5NYXJrCisgICAgICAvLyB0ZXN0IHNjcmlwdCBmb3IgaW5pdGlhbGl6YXRpb24tdGltZW91dC5mY2FsLlNBTk1hcmstMS5mYworICAgICAgLy8gImVhdHMiIHRoZSBPUE4oKSBwcmltaXRpdmUgd2l0aG91dCBpc3N1aW5nIGFuIFJfUkRZLCBjYXVzaW5nCisgICAgICAvLyBUYWNoeW9uIHRvIHJlcG9ydCBMU1QgKGxvb3Agc3RhdGUgdGltZW91dCksIHdoaWNoIGNhdXNlcyBhCisgICAgICAvLyBMSVAuICBUbyBhdm9pZCB0aGlzLCBzaW1wbHkgc2VuZCBvdXQgdGhlIGZyYW1lIChpLmUuIGFzc3VtaW5nIGEKKyAgICAgIC8vIGJ1ZmZlciBjcmVkaXQgb2YgMSkgd2l0aG91dCB3YWl0aW5nIGZvciBSX1JEWS4gIE1hbnkgRkMgZGV2aWNlcworICAgICAgLy8gKG90aGVyIHRoYW4gVGFjaHlvbikgaGF2ZSBiZWVuIGRvaW5nIHRoaXMgZm9yIHllYXJzLiAgV2UgZG9uJ3QKKyAgICAgIC8vIGV2ZXIgd2FudCB0byBkbyB0aGlzIGZvciBub24tTGluayBTZXJ2aWNlIGZyYW1lcyB1bmxlc3MgdGhlCisgICAgICAvLyBvdGhlciBkZXZpY2UgcmVhbGx5IGRpZCByZXBvcnQgbm9uLXplcm8gbG9naW4gQkIgY3JlZGl0IChpLmUuCisgICAgICAvLyBpbiB0aGUgUExPR0kgQUNDZXB0IGZyYW1lKS4KKy8vICAgICAgQ01EZmNocy0+c29mX2VvZiB8PSAweDAwMDAwNDAwTDsgIC8vIExDcj0xCisgICAgCisgICAgY2FzZSBFTFNfRkRJU0M6ICAvLyBGYWJyaWMgRGlzY292ZXJ5IChMb2dpbikKKyAgICBjYXNlIEVMU19GTE9HSTogIC8vIEZhYnJpYyBMb2dpbgorICAgIGNhc2UgRUxTX1NDUjogICAgLy8gRmFicmljIFN0YXRlIENoYW5nZSBSZWdpc3RyYXRpb24KKyAgICBjYXNlIEVMU19MT0dPOiAgIC8vIEZDLVBIIGV4dGVuZGVkIGxpbmsgc2VydmljZSBjb21tYW5kIFBvcnQgTG9nb3V0CisgICAgY2FzZSBFTFNfUERJU0M6ICAvLyBGQy1QSCBleHRlbmRlZCBsaW5rIHNlcnZpY2UgY21uZCBQb3J0IERpc2NvdmVyeQorICAgIGNhc2UgRUxTX1BSTEk6ICAgLy8gRkMtUEggZXh0ZW5kZWQgbGluayBzZXJ2aWNlIGNtbmQgUHJvY2VzcyBMb2dpbgorCisgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbICpmY0V4Y2hhbmdlSW5kZXhdLnJlVHJpZXMgPSAyOworCisKKyAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgKmZjRXhjaGFuZ2VJbmRleF0udGltZU91dCA9IDI7IC8vIHNlY29uZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPWF9JRCwgbGlua2VkIHRvIERyaXZlciBUcmFuc2FjdGlvbiBJRAorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChmaXgtdXAgYXQgUXVlaW5nIHRpbWUpCisgICAgICBDTURmY2hzLT5veF9yeF9pZCA9IDB4RkZGRjsgLy8gUlhfSUQgLSBSZXNwb25kZXIgKHRhcmdldCkgdG8gbW9kaWZ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPWF9JRCBzZXQgYXQgRVJRdWVpbmcgdGltZQorICAgICAgKnBJUkJfZmxhZ3MgPSAwOyAgICAgIC8vIGNsZWFyIElSQiBmbGFncworICAgICAgSVJCX2ZsYWdzLlNGQSA9IDE7ICAgIC8vIHNlbmQgU0ZTIChub3QgU0VTVCBpbmRleCkKKyAgICAgIFNmc0xlbiA9ICpwSVJCX2ZsYWdzOworCisgICAgICBTZnNMZW4gPDw9IDI0OyAgICAgICAgLy8gc2hpZnQgZmxhZ3MgdG8gTVNCCisgICAgICBpZiggdHlwZSA9PSBFTFNfTE9HTyApCisgICAgICAgIFNmc0xlbiArPSAoMzJMICsgMTZMKTsgLy8gIGFkZCBsZW4gKGhlYWRlciAmIFBMT0dJIHBheWxvYWQpCisgICAgICBlbHNlIGlmKCB0eXBlID09IEVMU19QUkxJICkKKyAgICAgICAgU2ZzTGVuICs9ICgzMkwgKyAyMEwpOyAvLyAgYWRkIGxlbiAoaGVhZGVyICYgUFJMSSBwYXlsb2FkKQorICAgICAgZWxzZSBpZiggdHlwZSA9PSBFTFNfU0NSICkKKyAgICAgICAgU2ZzTGVuICs9ICgzMkwgKyBzaXplb2YoU0NSX1BMKSk7IC8vICBhZGQgbGVuIChoZWFkZXIgJiBTQ1IgcGF5bG9hZCkKKyAgICAgIGVsc2UKKyAgICAgICAgU2ZzTGVuICs9ICgzMkwgKyAxMTZMKTsgLy8gIGFkZCBsZW4gKGhlYWRlciAmIFBMT0dJIHBheWxvYWQpCisKKyAgICAgIENNRGZjaHMtPmRfaWQgfD0gMHgyMjAwMDAwMEw7ICAvLyBSX0NUTCA9IDIyIGZvciAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dGVuZGVkIExpbmtfRGF0YTogVW5zb2xpY2l0ZWQgQ29udHJvbAorICAgICAgICAgICAgICAgICAgIC8vIFRZUEVbMzEtMjRdIDAxIEV4dGVuZGVkIExpbmsgU2VydmljZQorICAgICAgICAgICAgICAgICAgIC8vIGZfY3RsWzIzOjBdIGV4Y2hnIG9yaWdpbmF0b3IsIDFzdCBzZXEsIHhmZXIgUy5JLgorICAgICAgQ01EZmNocy0+Zl9jdGwgPSAweDAxMjEwMDAwTDsKKyAgICAgICAgICAgICAgICAgICAvLyBPWF9JRCB3aWxsIGJlIGZpeGVkLXVwIGF0IFRhY2h5b24gZW5xdWVpbmcgdGltZQorICAgICAgQ01EZmNocy0+c2VxX2NudCA9IDA7IC8vIHNlcSBJRCwgREZfY3RsLCBzZXEgY250CisgICAgICBDTURmY2hzLT5ybyA9IDB4MEw7ICAgIC8vIHJlbGF0aXZlIG9mZnNldCAobi9hKQorCisgICAgICBCdWlsZExpbmtTZXJ2aWNlUGF5bG9hZCggZmNDaGlwLCB0eXBlLCAmQ01EZmNocy0+cGxbMF0pOworCisgICAgICBicmVhazsKKworCisKKyAgICBjYXNlIEVMU19MT0dPX0FDQzogLy8gRkMtUEggZXh0ZW5kZWQgbGluayBzZXJ2aWNlIGxvZ291dCBhY2NlcHQKKyAgICBjYXNlIEVMU19SSlQ6ICAgICAgICAgIC8vIGV4dGVuZGVkIGxpbmsgc2VydmljZSByZWplY3QgKGFkZCByZWFzb24pCisgICAgY2FzZSBFTFNfQUNDOiAgICAgIC8vIGV4dC4gbGluayBzZXJ2aWNlIGdlbmVyaWMgYWNjZXB0CisgICAgY2FzZSBFTFNfUExPR0lfQUNDOi8vIGV4dC4gbGluayBzZXJ2aWNlIGxvZ2luIGFjY2VwdCAoUExPR0kgb3IgUERJU0MpCisgICAgY2FzZSBFTFNfUFJMSV9BQ0M6IC8vIGV4dC4gbGluayBzZXJ2aWNlIHByb2Nlc3MgbG9naW4gYWNjZXB0CisKKworICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyAqZmNFeGNoYW5nZUluZGV4XS50aW1lT3V0ID0gMTsgLy8gYXNzdW1lIGRvbmUKKyAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdW5pcXVlIFhfSURzISAodXNlIHRyYWNraW5nIGZ1bmN0aW9uKQorICAgICAgICAgICAgICAgIC8vIE9YX0lEIGZyb20gaW5pdGlhdG9yIGNtZAorICAgICAgb3hfSUQgPSAoVVNIT1JUKShJbkZDSFMtPm94X3J4X2lkID4+IDE2KTsgCisgICAgICByeF9JRCA9IDB4RkZGRjsgLy8gUlhfSUQsIGxpbmtlZCB0byBEcml2ZXIgRXhjaGFuZ2UgSUQKKworICAgICAgKnBJUkJfZmxhZ3MgPSAwOyAgICAgIC8vIGNsZWFyIElSQiBmbGFncworICAgICAgSVJCX2ZsYWdzLlNGQSA9IDE7ICAgIC8vIHNlbmQgU0ZTIChub3QgU0VTVCBpbmRleCkKKyAgICAgIFNmc0xlbiA9ICpwSVJCX2ZsYWdzOworCisgICAgICBTZnNMZW4gPDw9IDI0OyAgICAgICAgLy8gc2hpZnQgZmxhZ3MgdG8gTVNCCisgICAgICBpZiggdHlwZSA9PSBFTFNfUkpUICkKKyAgICAgIHsKKyAgICAgICAgU2ZzTGVuICs9ICgzMkwgKyA4TCk7IC8vICBhZGQgbGVuIChoZWFkZXIgKyBwYXlsb2FkKQorCisgICAgICAgIC8vIEVMU19SSlQgcmVhc29uIGNvZGVzICh1dGlsaXplIHVudXNlZCAicmVzZXJ2ZWQiIGZpZWxkKQorICAgICAgICBDTURmY2hzLT5wbFswXSA9IDE7CisgICAgICAgIENNRGZjaHMtPnBsWzFdID0gSW5GQ0hTLT5yZXNlcnZlZDsgIAorICAgICAgICAgIAorICAgICAgfQorICAgICAgZWxzZSBpZiggKHR5cGUgPT0gRUxTX0xPR09fQUNDKSB8fCAodHlwZSA9PSBFTFNfQUNDKSAgKQorICAgICAgICBTZnNMZW4gKz0gKDMyTCArIDRMKTsgLy8gIGFkZCBsZW4gKGhlYWRlciArIHBheWxvYWQpCisgICAgICBlbHNlIGlmKCB0eXBlID09IEVMU19QTE9HSV9BQ0MgKQorICAgICAgICBTZnNMZW4gKz0gKDMyTCArIDExNkwpOyAvLyAgYWRkIGxlbiAoaGVhZGVyICsgcGF5bG9hZCkKKyAgICAgIGVsc2UgaWYoIHR5cGUgPT0gRUxTX1BSTElfQUNDICkKKyAgICAgICAgU2ZzTGVuICs9ICgzMkwgKyAyMEwpOyAvLyAgYWRkIGxlbiAoaGVhZGVyICsgcGF5bG9hZCkKKworICAgICAgQ01EZmNocy0+ZF9pZCB8PSAweDIzMDAwMDAwTDsgIC8vIFJfQ1RMID0gMjMgZm9yIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0ZW5kZWQgTGlua19EYXRhOiBDb250cm9sIFJlcGx5CisgICAgICAgICAgICAgICAgICAgLy8gVFlQRVszMS0yNF0gMDEgRXh0ZW5kZWQgTGluayBTZXJ2aWNlCisgICAgICAgICAgICAgICAgICAgLy8gZl9jdGxbMjM6MF0gZXhjaGcgcmVzcG9uZGVyLCBsYXN0IHNlcSwgZV9zLCB0c2kKKyAgICAgIENNRGZjaHMtPmZfY3RsID0gMHgwMTk5MDAwMEw7CisgICAgICBDTURmY2hzLT5zZXFfY250ID0gMHgwTDsKKyAgICAgIENNRGZjaHMtPm94X3J4X2lkID0gMEw7ICAgICAgICAvLyBjbGVhcgorICAgICAgQ01EZmNocy0+b3hfcnhfaWQgPSBveF9JRDsgLy8gbG9hZCB1cHBlciAxNiBiaXRzCisgICAgICBDTURmY2hzLT5veF9yeF9pZCA8PD0gMTY7ICAgICAgLy8gc2hpZnQgdGhlbQorCisgICAgICBDTURmY2hzLT5ybyA9IDB4MEw7ICAgIC8vIHJlbGF0aXZlIG9mZnNldCAobi9hKQorCisgICAgICBCdWlsZExpbmtTZXJ2aWNlUGF5bG9hZCggZmNDaGlwLCB0eXBlLCAmQ01EZmNocy0+cGxbMF0pOworCisgICAgICBicmVhazsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlicmUgQ2hhbm5lbCBTQ1NJICdvcmlnaW5hdG9yJyBzZXF1ZW5jZXMuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyAob3JpZ2luYXRvciBtZWFucyAnaW5pdGlhdG9yJyBpbiBGQ1AtU0NTSSkKKworICAgIGNhc2UgU0NTSV9JV0U6IC8vIFRhY2hMaXRlIEluaXRpYXRvciBXcml0ZSBFbnRyeQorICAgIHsKKyAgICAgIFBGQ19MT0dHRURJTl9QT1JUIHBMb2dnZWRJblBvcnQgPSAKKyAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyAqZmNFeGNoYW5nZUluZGV4XS5wTG9nZ2VkSW5Qb3J0OworCisgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbICpmY0V4Y2hhbmdlSW5kZXhdLnJlVHJpZXMgPSAxOworICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyAqZmNFeGNoYW5nZUluZGV4XS50aW1lT3V0ID0gNzsgLy8gRkMyIHRpbWVvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAvLyBmaXJzdCwgYnVpbGQgRkNQX0NNTkQKKyAgICAgIC8vIHVuaXF1ZSBYX0lEIGZpeC11cHMgaW4gU3RhcnRFeGNoYW5nZSAKKworICAgICAgKnBJUkJfZmxhZ3MgPSAwOyAgICAgIC8vIGNsZWFyIElSQiBmbGFncworICAgICAgSVJCX2ZsYWdzLlNGQSA9IDE7ICAgIC8vIHNlbmQgU0ZTIEZDUC1DTU5EIChub3QgU0VTVCBpbmRleCkKKworICAgICAgLy8gTk9URTogdW5saWtlIEZDIExpbmtTZXJ2aWNlIGxvZ2luIGZyYW1lcywgbm9ybWFsCisgICAgICAvLyBTQ1NJIGNvbW1hbmRzIGFyZSBzZW50IHdpdGhvdXQgb3V0Z29pbmcgdmVyaWZpY2F0aW9uCisgICAgICBJUkJfZmxhZ3MuRENNID0gMTsgICAgLy8gRGlzYWJsZSBjb21wbGV0aW9uIG1lc3NhZ2UgZm9yIENtbmQgZnJhbWUKKyAgICAgIFNmc0xlbiA9ICpwSVJCX2ZsYWdzOworCisgICAgICBTZnNMZW4gPDw9IDI0OyAgICAgICAgLy8gc2hpZnQgZmxhZ3MgdG8gTVNCCisgICAgICBTZnNMZW4gKz0gNjRMOyAgICAgICAgLy8gYWRkIGxlbiB0byBMU0IgKGhlYWRlciAmIENNTkQgcGF5bG9hZCkKKworICAgICAgQ01EZmNocy0+ZF9pZCB8PSAoMHgwNjAwMDAwMEwpOyAgLy8gUl9DVEwgPSA2IGZvciBjb21tYW5kCisKKyAgICAgICAgICAgICAgICAgICAvLyBUWVBFWzMxLTI0XSA4IGZvciBGQ1AgU0NTSQorICAgICAgICAgICAgICAgICAgIC8vIGZfY3RsWzIzOjBdIGV4Y2hnIG9yaWdpbmF0b3IsIDFzdCBzZXEsIHhmZXIgUy5JLgorICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHZhbGlkIFJPCisgICAgICBDTURmY2hzLT5mX2N0bCA9IDB4MDgyMTAwMDhMOworICAgICAgQ01EZmNocy0+c2VxX2NudCA9IDB4MEw7CisgICAgICBDTURmY2hzLT5veF9yeF9pZCA9IDBMOyAgICAgICAgLy8gY2xlYXIgZm9yIG5vdyAoLW9yLSBpbiBsYXRlcikKKyAgICAgIENNRGZjaHMtPnJvID0gMHgwTDsgICAgLy8gcmVsYXRpdmUgb2Zmc2V0IChuL2EpCisKKyAgICAgICAgICAgICAgICAgICAvLyBub3csIGZpbGwgb3V0IEZDUC1EQVRBIGhlYWRlcgorICAgICAgICAgICAgICAgICAgIC8vICh1c2UgYnVmZmVyIGluc2lkZSBTRVNUIG9iamVjdCkKKyAgICAgIGRhdGFIRFIgPSAmZmNDaGlwLT5TRVNULT5EYXRhSERSWyAqZmNFeGNoYW5nZUluZGV4IF07CisgICAgICBkYXRhSERSLT5yZXNlcnZlZCA9IDBMOyAvLyBtdXN0IGNsZWFyCisgICAgICBkYXRhSERSLT5zb2ZfZW9mID0gMHg3NTAwMjAwMEw7ICAvLyBTT0ZpMzpFT0ZuICBubyBVQU07IG5vIENMUywgbm9MQ3IsIG5vIFRTCisgICAgICBkYXRhSERSLT5kX2lkID0gKEluRkNIUy0+c19pZCB8IDB4MDEwMDAwMDBMKTsgLy8gUl9DVEw9IEZDUF9EQVRBCisgICAgICBkYXRhSERSLT5zX2lkID0gZmNDaGlwLT5SZWdpc3RlcnMubXlfYWxfcGE7IC8vIENTX0NUTCA9IDAKKyAgICAgICAgICAgICAgICAgICAvLyBUWVBFWzMxLTI0XSA4IGZvciBGQ1AgU0NTSQorICAgICAgICAgICAgICAgICAgIC8vIGZfY3RsWzIzOjBdIHhmZXIgUy5JLnwgdmFsaWQgUk8KKyAgICAgIGRhdGFIRFItPmZfY3RsID0gMHgwODAxMDAwOEw7CisgICAgICBkYXRhSERSLT5zZXFfY250ID0gMHgwMjAwMDAwMEw7ICAvLyBzZXF1ZW5jZSBJRDogZGZfY3RsIDogc2VxZW5jZSBjb3VudAorICAgICAgZGF0YUhEUi0+b3hfcnhfaWQgPSAwTDsgICAgICAgIC8vIGNsZWFyOyBmaXgtdXAgZGF0YUhEUiBmaWVsZHMgbGF0ZXIKKyAgICAgIGRhdGFIRFItPnJvID0gMHgwTDsgICAgLy8gcmVsYXRpdmUgb2Zmc2V0IChuL2EpCisKKyAgICAgICAgICAgICAgICAgICAvLyBOb3cgc2V0dXAgdGhlIFNFU1QgZW50cnkKKyAgICAgIHBJV0UgPSAmZmNDaGlwLT5TRVNULT51WyAqZmNFeGNoYW5nZUluZGV4IF0uSVdFOworICAgICAgCisgICAgICAgICAgICAgICAgICAgLy8gZmlsbCBvdXQgdGhlIElXRToKKworICAgICAgICAgICAgICAgIC8vIFZBTGlkIGVudHJ5OkRpciBvdXRib3VuZDpEQ006ZW5hYmxlIENNOmVuYWwgSU5UOiBGQyBmcmFtZSBsZW4KKyAgICAgIHBJV0UtPkhkcl9MZW4gPSAweDhlMDAwMDIwTDsgLy8gZGF0YSBmcmFtZSBMZW4gYWx3YXlzIDMyIGJ5dGVzCisgICAgICAKKyAgICAgIAorICAgICAgLy8gZnJvbSBsb2dpbiBwYXJhbWV0ZXJzIHdpdGggb3RoZXIgcG9ydCwgd2hhdCdzIHRoZSBsYXJnZXN0IGZyYW1lCisgICAgICAvLyB3ZSBjYW4gc2VuZD8gCisgICAgICBpZiggcExvZ2dlZEluUG9ydCA9PSBOVUxMKSAKKyAgICAgIHsKKwl1bFN0YXR1cyA9IElOVkFMSURfQVJHUzsgIC8vIGZhaWxlZCEgZ2l2ZSB1cAorCWJyZWFrOworICAgICAgfQorICAgICAgaWYoIHBMb2dnZWRJblBvcnQtPnJ4X2RhdGFfc2l6ZSAgPj0gMjA0OCkKKyAgICAgICAgZmwgPSAweDAwMDIwMDAwOyAgLy8gMjA0OCBjb2RlIChvbmx5IHN1cHBvcnQgMTAyNCEpCisgICAgICBlbHNlIGlmKCBwTG9nZ2VkSW5Qb3J0LT5yeF9kYXRhX3NpemUgID49IDEwMjQpCisgICAgICAgIGZsID0gMHgwMDAyMDAwMDsgIC8vIDEwMjQgY29kZQorICAgICAgZWxzZSBpZiggcExvZ2dlZEluUG9ydC0+cnhfZGF0YV9zaXplICA+PSA1MTIpCisgICAgICAgIGZsID0gMHgwMDAxMDAwMDsgIC8vIDUxMiBjb2RlCisgICAgICBlbHNlCisJZmwgPSAwOyAgLy8gMTI4IGJ5dGVzIC0tIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgIAorICAgICAgCisgICAgICBwSVdFLT5IZHJfTGVuIHw9IGZsOyAvLyBhZGQgeG1pdCBGQyBmcmFtZSBsZW4gZm9yIGRhdGEgcGhhc2UKKyAgICAgIHBJV0UtPkhkcl9BZGRyID0gZmNDaGlwLT5TRVNULT5iYXNlICsgCisJCSgodW5zaWduZWQgbG9uZykmZmNDaGlwLT5TRVNULT5EYXRhSERSWypmY0V4Y2hhbmdlSW5kZXhdIC0gCisJCQkodW5zaWduZWQgbG9uZylmY0NoaXAtPlNFU1QpOworCisgICAgICBwSVdFLT5SU1BfTGVuID0gc2l6ZW9mKFRhY2hGQ0hEUl9SU1ApIDsgLy8gaGRyK2RhdGEgKHJlY3YnZCBSU1AgZnJhbWUpCisgICAgICBwSVdFLT5SU1BfTGVuIHw9IChJbkZDSFMtPnNfaWQgPDwgOCk7IC8vIE1TIDI0IGJpdHMgUmVtb3RlX0lECisgICAgICAKKyAgICAgIG1lbXNldCggJmZjQ2hpcC0+U0VTVC0+UnNwSERSWyAqZmNFeGNoYW5nZUluZGV4XS5wbCwgMCwgCisgICAgICAgIHNpemVvZiggRkNQX1NUQVRVU19SRVNQT05TRSkgKTsgIC8vIGNsZWFyIG91dCBwcmV2aW91cyBzdGF0dXMKKyAKKyAgICAgIHBJV0UtPlJTUF9BZGRyID0gZmNDaGlwLT5TRVNULT5iYXNlICsgCisJCSgodW5zaWduZWQgbG9uZykmZmNDaGlwLT5TRVNULT5Sc3BIRFJbKmZjRXhjaGFuZ2VJbmRleF0gLSAKKwkJCSh1bnNpZ25lZCBsb25nKWZjQ2hpcC0+U0VTVCk7CisKKyAgICAgICAgICAgICAgICAgICAvLyBEbyB3ZSBuZWVkIGxvY2FsIG9yIGV4dGVuZGVkIGdhdGhlciBsaXN0PworICAgICAgICAgICAgICAgICAgIC8vIGRlcGVuZHMgb24gc2l6ZSAtIHdlIGNhbiBoYW5kbGUgMyBsZW4vYWRkciBwYWlycworICAgICAgICAgICAgICAgICAgIC8vIGxvY2FsbHkuCisKKyAgICAgIGZjcF9kbCA9IGJ1aWxkX1NFU1Rfc2dMaXN0KCAKKwljcHFmY0hCQWRhdGEtPlBjaURldiwKKyAgICAgICAgJnBJV0UtPkdMZW4xLCAKKyAgICAgICAgQ21uZCwgICAgICAgLy8gUy9HIGxpc3QKKyAgICAgICAgJnNnUGFpcnMsICAgLy8gcmV0dXJuICMgb2YgcGFpcnMgaW4gUy9HIGxpc3QgKGZyb20gIkRhdGEiIGRlc2NyaXB0b3IpCisgICAgICAgICZmY0NoaXAtPlNFU1QtPnNnUGFnZXNbICpmY0V4Y2hhbmdlSW5kZXggXSk7Ly8gKGZvciBGcmVlaW5nIGxhdGVyKQorCisgICAgICBpZiggIWZjcF9kbCApIC8vIGVycm9yIGJ1aWxkaW5nIFMvRyBsaXN0PworICAgICAgeworICAgICAgICB1bFN0YXR1cyA9IE1FTVBPT0xfRkFJTDsKKyAgICAgICAgYnJlYWs7ICAgICAgLy8gZ2l2ZSB1cAorICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdyB0aGF0IHdlIGtub3cgdG90YWwgZGF0YSBsZW5ndGggaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHBhc3NlZCBTL0cgYnVmZmVyLCBzZXQgRkNQIENNTkQgZnJhbWUKKyAgICAgIGJ1aWxkX0ZDUF9wYXlsb2FkKCBDbW5kLCAoVUNIQVIqKSZDTURmY2hzLT5wbFswXSwgdHlwZSwgZmNwX2RsICk7CisKKworICAgICAgCisgICAgICBpZiggc2dQYWlycyA+IDMgKSAgLy8gbmVlZCBleHRlbmRlZCBzL2cgbGlzdAorICAgICAgICBwSVdFLT5CdWZmX09mZiA9IDB4NzgwMDAwMDBMOyAvLyBleHRlbmRlZCBkYXRhIHwgKG5vIG9mZnNldCkKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAvLyBsb2NhbCBkYXRhIHBvaW50ZXJzIChpbiBTRVNUKQorICAgICAgICBwSVdFLT5CdWZmX09mZiA9IDB4ZjgwMDAwMDBMOyAvLyBsb2NhbCBkYXRhIHwgKG5vIG9mZnNldCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVUxPTkcgNQorICAgICAgcElXRS0+TGluayA9IDB4MDAwMGZmZmZMOyAgIC8vIEJ1ZmZfSW5kZXggfCBMaW5rCisKKyAgICAgIHBJV0UtPlJYX0lEID0gMHgwTDsgICAgIC8vIERXb3JkIDY6IFJYX0lEIHNldCBieSB0YXJnZXQgWEZFUl9SRFkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEV29yZCA3CisgICAgICBwSVdFLT5EYXRhX0xlbiA9IDBMOyAgICAvLyBUTCBlbnRlcnMgcmN2J2QgWEZFUl9SRFkgQlVSU1RfTEVOCisgICAgICBwSVdFLT5FeHBfUk8gPSAwTDsgICAgICAvLyBEV29yZCA4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEV29yZCA5CisgICAgICBwSVdFLT5FeHBfQnl0ZV9DbnQgPSBmY3BfZGw7ICAvLyBzdW0gb2YgZ2F0aGVyIGJ1ZmZlcnMKKyAgICB9CisgICAgYnJlYWs7CisKKworCisKKworICAgIGNhc2UgU0NTSV9JUkU6IC8vIFRhY2hMaXRlIEluaXRpYXRvciBSZWFkIEVudHJ5CisKKyAgICAgIGlmKCBDbW5kLT50aW1lb3V0ICE9IDApCisgICAgICB7CisvLwlwcmludGsoIkNtbmQtPnRpbWVvdXQgJWRcbiIsIENtbmQtPnRpbWVvdXQpOworCS8vIHBlciBMaW51eCBTY3NpCisgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgKmZjRXhjaGFuZ2VJbmRleF0udGltZU91dCA9IENtbmQtPnRpbWVvdXQ7CisgICAgICB9CisgICAgICBlbHNlICAvLyB1c2Ugb3VyIGJlc3QgZ3Vlc3MsIGJhc2VkIG9uIEZDICYgZGV2aWNlCisgICAgICB7CisKKyAgICAgICAgaWYoIENtbmQtPlNDcC5NZXNzYWdlID09IDEgKSAvLyBUYXBlIGRldmljZT8gKGZyb20gSU5RVUlSWSkJCisJeworCSAgLy8gdHVybiBvZmYgb3VyIHRpbWVvdXRzIChmb3Igbm93Li4uKQorICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgKmZjRXhjaGFuZ2VJbmRleF0udGltZU91dCA9IDB4RkZGRkZGRkY7IAorCX0KKwllbHNlCisJeworICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgKmZjRXhjaGFuZ2VJbmRleF0ucmVUcmllcyA9IDE7CisgICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyAqZmNFeGNoYW5nZUluZGV4XS50aW1lT3V0ID0gNzsgLy8gcGVyIFNDU0kgcmVxLgorCX0KKyAgICAgIH0KKworICAKKyAgICAgIC8vIGZpcnN0LCBidWlsZCBGQ1BfQ01ORAorCisKKyAgICAgICpwSVJCX2ZsYWdzID0gMDsgICAgICAvLyBjbGVhciBJUkIgZmxhZ3MKKyAgICAgIElSQl9mbGFncy5TRkEgPSAxOyAgICAvLyBzZW5kIFNGUyBGQ1AtQ01ORCAobm90IFNFU1QgaW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogdW5saWtlIEZDIExpbmtTZXJ2aWNlIGxvZ2luIGZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWwgU0NTSSBjb21tYW5kcyBhcmUgc2VudCAib3BlbiBsb29wIgorICAgICAgSVJCX2ZsYWdzLkRDTSA9IDE7ICAgIC8vIERpc2FibGUgY29tcGxldGlvbiBtZXNzYWdlIGZvciBDbW5kIGZyYW1lCisgICAgICBTZnNMZW4gPSAqcElSQl9mbGFnczsKKworICAgICAgU2ZzTGVuIDw8PSAyNDsgICAgICAgIC8vIHNoaWZ0IGZsYWdzIHRvIE1TQgorICAgICAgU2ZzTGVuICs9IDY0TDsgICAgICAgIC8vIGFkZCBsZW4gdG8gTFNCIChoZWFkZXIgJiBDTU5EIHBheWxvYWQpCisKKyAgICAgIENNRGZjaHMtPmRfaWQgfD0gKDB4MDYwMDAwMDBMKTsgIC8vIFJfQ1RMID0gNiBmb3IgY29tbWFuZAorCisgICAgICAgICAgICAgLy8gVFlQRVszMS0yNF0gOCBmb3IgRkNQIFNDU0kKKyAgICAgICAgICAgICAvLyBmX2N0bFsyMzowXSBleGNoZyBvcmlnaW5hdG9yLCAxc3Qgc2VxLCB4ZmVyIFMuSS4KKyAgICAgICAgICAgICAvLyAgICAgICAgICAgICB2YWxpZCBSTworICAgICAgQ01EZmNocy0+Zl9jdGwgPSAweDA4MjEwMDA4TDsKKyAgICAgIENNRGZjaHMtPnNlcV9jbnQgPSAweDBMOworICAgICAgLy8geF9JRCAmIGRhdGEgZGlyZWN0aW9uIGJpdCBzZXQgbGF0ZXIKKyAgICAgIENNRGZjaHMtPm94X3J4X2lkID0gMHhGRkZGOyAgICAgICAgLy8gY2xlYXIKKyAgICAgIENNRGZjaHMtPnJvID0gMHgwTDsgICAgLy8gcmVsYXRpdmUgb2Zmc2V0IChuL2EpCisKKworCisgICAgICAgICAgICAgICAgICAgLy8gTm93IHNldHVwIHRoZSBTRVNUIGVudHJ5CisgICAgICBwSVJFID0gJmZjQ2hpcC0+U0VTVC0+dVsgKmZjRXhjaGFuZ2VJbmRleCBdLklSRTsKKworICAgICAgLy8gZmlsbCBvdXQgdGhlIElSRToKKyAgICAgIC8vIFZBTGlkIGVudHJ5OkRpciBvdXRib3VuZDplbmFibGUgQ006ZW5hbCBJTlQ6CisgICAgICBwSVJFLT5TZXFfQWNjdW0gPSAweENFMDAwMDAwTDsgLy8gVkFMLERJUiBpbmJvdW5kLERDTXwgSU5JLERBVCxSU1AKKworICAgICAgcElSRS0+cmVzZXJ2ZWQgPSAwTDsKKyAgICAgIHBJUkUtPlJTUF9MZW4gPSBzaXplb2YoVGFjaEZDSERSX1JTUCkgOyAvLyBoZHIrZGF0YSAocmVjdidkIFJTUCBmcmFtZSkKKyAgICAgIHBJUkUtPlJTUF9MZW4gfD0gKEluRkNIUy0+c19pZCA8PCA4KTsgLy8gTVMgMjQgYml0cyBSZW1vdGVfSUQKKworICAgICAgcElSRS0+UlNQX0FkZHIgPSBmY0NoaXAtPlNFU1QtPmJhc2UgKyAKKwkJKCh1bnNpZ25lZCBsb25nKSZmY0NoaXAtPlNFU1QtPlJzcEhEUlsqZmNFeGNoYW5nZUluZGV4XSAtIAorCQkJKHVuc2lnbmVkIGxvbmcpZmNDaGlwLT5TRVNUKTsKKyAgICAgIAorICAgICAgICAgICAgICAgICAgIC8vIERvIHdlIG5lZWQgbG9jYWwgb3IgZXh0ZW5kZWQgZ2F0aGVyIGxpc3Q/CisgICAgICAgICAgICAgICAgICAgLy8gZGVwZW5kcyBvbiBzaXplIC0gd2UgY2FuIGhhbmRsZSAzIGxlbi9hZGRyIHBhaXJzCisgICAgICAgICAgICAgICAgICAgLy8gbG9jYWxseS4KKworICAgICAgZmNwX2RsID0gYnVpbGRfU0VTVF9zZ0xpc3QoIAorCWNwcWZjSEJBZGF0YS0+UGNpRGV2LAorICAgICAgICAmcElSRS0+U0xlbjEsIAorICAgICAgICBDbW5kLCAgICAgICAvLyBTQ1NJIGNvbW1hbmQgRGF0YSBkZXNjLiB3aXRoIFMvRyBsaXN0CisgICAgICAgICZzZ1BhaXJzLCAgIC8vIHJldHVybiAjIG9mIHBhaXJzIGluIFMvRyBsaXN0IChmcm9tICJEYXRhIiBkZXNjcmlwdG9yKQorICAgICAgICAmZmNDaGlwLT5TRVNULT5zZ1BhZ2VzWyAqZmNFeGNoYW5nZUluZGV4IF0pOy8vIChmb3IgRnJlZWluZyBsYXRlcikKKyAgICAgIAorICAgICAgCisgICAgICBpZiggIWZjcF9kbCApIC8vIGVycm9yIGJ1aWxkaW5nIFMvRyBsaXN0PworICAgICAgeworCS8vIEl0IGlzIHBlcm1pc3NpYmxlIHRvIGhhdmUgYSBaRVJPIExFTkdUSCBSZWFkIGNvbW1hbmQuCisJLy8gSWYgdGhlcmUgaXMgdGhlIGNhc2UsIHNpbXBseSBzZXQgZmNwX2RsIChhbmQgRXhwX0J5dGVfQ250KQorCS8vIHRvIDAgYW5kIGNvbnRpbnVlLgorCWlmKCBDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4gPT0gMCApCisJeworCSAgZmNwX2RsID0gMDsgLy8gbm8gRkMgREFUQSBmcmFtZXMgZXhwZWN0ZWQKKworCX0KKwllbHNlCisJeworICAgICAgICAgIHVsU3RhdHVzID0gTUVNUE9PTF9GQUlMOworICAgICAgICAgIGJyZWFrOyAgICAgIC8vIGdpdmUgdXAKKwl9CisgICAgICB9CisKKyAgICAgIC8vIG5vdyB0aGF0IHdlIGtub3cgdGhlIFMvRyBsZW5ndGgsIGJ1aWxkIENNTkQgcGF5bG9hZAorICAgICAgYnVpbGRfRkNQX3BheWxvYWQoIENtbmQsIChVQ0hBUiopJkNNRGZjaHMtPnBsWzBdLCB0eXBlLCBmY3BfZGwgKTsKKworICAgICAgCisgICAgICBpZiggc2dQYWlycyA+IDMgKSAgLy8gbmVlZCBleHRlbmRlZCBzL2cgbGlzdAorICAgICAgICBwSVJFLT5CdWZmX09mZiA9IDB4MDAwMDAwMDA7IC8vIERXb3JkIDQ6IGV4dGVuZGVkIHMvZyBsaXN0LCBubyBvZmZzZXQKKyAgICAgIGVsc2UKKyAgICAgICAgcElSRS0+QnVmZl9PZmYgPSAweDgwMDAwMDAwOyAvLyBsb2NhbCBkYXRhLCBubyBvZmZzZXQKKyAgICAgIAorICAgICAgcElSRS0+QnVmZl9JbmRleCA9IDB4MEw7ICAgIC8vIERXb3JkIDU6IEJ1ZmZfSW5kZXggfCBSZXNlcnZlZAorCisgICAgICBwSVJFLT5FeHBfUk8gID0gMHgwTDsgICAgICAgLy8gRFdvcmQgNjogRXhwZWN0ZWQgUmVsLiBPZmZzZXQKKworICAgICAgcElSRS0+Qnl0ZV9Db3VudCA9IDA7ICAvLyBEV29yZCA3OiBmaWxsZWQgaW4gYnkgVEwgb24gZXJyCisgICAgICBwSVJFLT5yZXNlcnZlZF8gPSAwOyAgIC8vIERXb3JkIDg6IHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IDAgbGVuZ3RoIFJFQUQgaXMgT0suCisgICAgICBwSVJFLT5FeHBfQnl0ZV9DbnQgPSBmY3BfZGw7Ly8gRFdvcmQgOTogc3VtIG9mIHNjYXR0ZXIgYnVmZmVycworICAgICAgCisgICAgICBicmVhazsKKworCisKKworICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpYnJlIENoYW5uZWwgU0NTSSAncmVzcG9uZGVyJyBzZXF1ZW5jZXMuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyAob3JpZ2luYXRvciBtZWFucyAndGFyZ2V0JyBpbiBGQ1AtU0NTSSkKKyAgICBjYXNlIFNDU0lfVFdFOiAvLyBUYWNoTGl0ZSBUYXJnZXQgV3JpdGUgRW50cnkKKworICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyAqZmNFeGNoYW5nZUluZGV4XS50aW1lT3V0ID0gMTA7IC8vIHBlciBTQ1NJIHJlcS4KKworICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCwgYnVpbGQgRkNQX0NNTkQKKworICAgICAgKnBJUkJfZmxhZ3MgPSAwOyAgICAgIC8vIGNsZWFyIElSQiBmbGFncworICAgICAgSVJCX2ZsYWdzLlNGQSA9IDE7ICAgIC8vIHNlbmQgU0ZTIChYRkVSX1JEWSkKKyAgICAgIFNmc0xlbiA9ICpwSVJCX2ZsYWdzOworCisgICAgICBTZnNMZW4gPDw9IDI0OyAgICAgICAgLy8gc2hpZnQgZmxhZ3MgdG8gTVNCCisgICAgICBTZnNMZW4gKz0gKDMyTCArIDEyTCk7Ly8gYWRkIFNGUyBsZW4gKGhlYWRlciAmIFhGRVJfUkRZIHBheWxvYWQpCisKKyAgICAgIENNRGZjaHMtPmRfaWQgfD0gKDB4MDUwMDAwMDBMKTsgIC8vIFJfQ1RMID0gNSBmb3IgWEZFUl9SRFkKKworICAgICAgICAgICAgICAgICAgIC8vIFRZUEVbMzEtMjRdIDggZm9yIEZDUCBTQ1NJCisgICAgICAgICAgICAgICAgICAgLy8gZl9jdGxbMjM6MF0gZXhjaGcgcmVzcG9uZGVyLCAxc3Qgc2VxLCB4ZmVyIFMuSS4KKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICB2YWxpZCBSTworICAgICAgQ01EZmNocy0+Zl9jdGwgPSAweDA4ODEwMDA4TDsKKyAgICAgIENNRGZjaHMtPnNlcV9jbnQgPSAweDAxMDAwMDAwOyAvLyBzZXF1ZW5jZSBJRDogZGZfY3RsOiBzZXF1ZW5jZSBjb3VudAorICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2Ugb3JpZ2luYXRvciAob3RoZXIgcG9ydCdzKSBPWF9JRAorICAgICAgQ01EZmNocy0+b3hfcnhfaWQgPSBJbkZDSFMtPm94X3J4X2lkOyAgICAgLy8gd2Ugd2FudCB1cHBlciAxNiBiaXRzCisgICAgICBDTURmY2hzLT5ybyA9IDB4MEw7ICAgIC8vIHJlbGF0aXZlIG9mZnNldCAobi9hKQorCisgICAgICAgICAgICAgICAgICAgLy8gbm93LCBmaWxsIG91dCBGQ1AtUlNQIGhlYWRlcgorICAgICAgICAgICAgICAgICAgIC8vICh1c2UgYnVmZmVyIGluc2lkZSBTRVNUIG9iamVjdCkKKworICAgICAgcnNwSERSID0gJmZjQ2hpcC0+U0VTVC0+UnNwSERSWyAqZmNFeGNoYW5nZUluZGV4IF07CisgICAgICByc3BIRFItPnJlc2VydmVkID0gMEw7IC8vIG11c3QgY2xlYXIKKyAgICAgIHJzcEhEUi0+c29mX2VvZiA9IDB4NzUwMDAwMDBMOyAgLy8gU09GaTM6RU9GbiAgbm8gVUFNOyBubyBDTFMsIG5vTENyLCBubyBUUworICAgICAgcnNwSERSLT5kX2lkID0gKEluRkNIUy0+c19pZCB8IDB4MDcwMDAwMDBMKTsgLy8gUl9DVEw9IEZDUF9SU1AKKyAgICAgIHJzcEhEUi0+c19pZCA9IGZjQ2hpcC0+UmVnaXN0ZXJzLm15X2FsX3BhOyAvLyBDU19DVEwgPSAwCisgICAgICAgICAgICAgICAgICAgLy8gVFlQRVszMS0yNF0gOCBmb3IgRkNQIFNDU0kKKyAgICAgICAgICAgICAgICAgICAvLyBmX2N0bFsyMzowXSByZXNwb25kZXJ8bGFzdCBzZXF8IHhmZXIgUy5JLgorICAgICAgcnNwSERSLT5mX2N0bCA9IDB4MDg5MTAwMDBMOworICAgICAgcnNwSERSLT5zZXFfY250ID0gMHgwMzAwMDAwMDsgIC8vIHNlcXVlbmNlIElECisgICAgICByc3BIRFItPm94X3J4X2lkID0gSW5GQ0hTLT5veF9yeF9pZDsgLy8gZ2l2ZXMgdXMgT1hfSUQKKyAgICAgIHJzcEhEUi0+cm8gPSAweDBMOyAgICAvLyByZWxhdGl2ZSBvZmZzZXQgKG4vYSkKKworCisgICAgICAgICAgICAgICAgICAgLy8gTm93IHNldHVwIHRoZSBTRVNUIGVudHJ5CisgICAgICAgICAgICAgICAgICAgCisgICAgICBwVFdFID0gJmZjQ2hpcC0+U0VTVC0+dVsgKmZjRXhjaGFuZ2VJbmRleCBdLlRXRTsKKworICAgICAgLy8gZmlsbCBvdXQgdGhlIFRXRToKKworICAgICAgLy8gVkFMaWQgZW50cnk6RGlyIG91dGJvdW5kOmVuYWJsZSBDTTplbmFsIElOVDoKKyAgICAgIHBUV0UtPlNlcV9BY2N1bSA9IDB4QzQwMDAwMDBMOyAgLy8gdXBwZXIgd29yZCBmbGFncworICAgICAgcFRXRS0+cmVzZXJ2ZWQgPSAwTDsKKyAgICAgIHBUV0UtPlJlbW90ZV9Ob2RlX0lEID0gMEw7IC8vIG5vIG1vcmUgYXV0byBSU1AgZnJhbWUhIChUTC9UUyBjaGFuZ2UpCisgICAgICBwVFdFLT5SZW1vdGVfTm9kZV9JRCB8PSAoSW5GQ0hTLT5zX2lkIDw8IDgpOyAvLyBNUyAyNCBiaXRzIFJlbW90ZV9JRAorICAgICAgCisKKyAgICAgICAgICAgICAgICAgICAvLyBEbyB3ZSBuZWVkIGxvY2FsIG9yIGV4dGVuZGVkIGdhdGhlciBsaXN0PworICAgICAgICAgICAgICAgICAgIC8vIGRlcGVuZHMgb24gc2l6ZSAtIHdlIGNhbiBoYW5kbGUgMyBsZW4vYWRkciBwYWlycworICAgICAgICAgICAgICAgICAgIC8vIGxvY2FsbHkuCisKKyAgICAgIGZjcF9kbCA9IGJ1aWxkX1NFU1Rfc2dMaXN0KCAKKwljcHFmY0hCQWRhdGEtPlBjaURldiwKKyAgICAgICAgJnBUV0UtPlNMZW4xLCAKKyAgICAgICAgQ21uZCwgICAgICAgLy8gUy9HIGxpc3QKKyAgICAgICAgJnNnUGFpcnMsICAgLy8gcmV0dXJuICMgb2YgcGFpcnMgaW4gUy9HIGxpc3QgKGZyb20gIkRhdGEiIGRlc2NyaXB0b3IpCisgICAgICAgICZmY0NoaXAtPlNFU1QtPnNnUGFnZXNbICpmY0V4Y2hhbmdlSW5kZXggXSk7Ly8gKGZvciBGcmVlaW5nIGxhdGVyKQorICAgICAgCisgICAgICAKKyAgICAgIGlmKCAhZmNwX2RsICkgLy8gZXJyb3IgYnVpbGRpbmcgUy9HIGxpc3Q/CisgICAgICB7CisgICAgICAgIHVsU3RhdHVzID0gTUVNUE9PTF9GQUlMOworICAgICAgICBicmVhazsgICAgICAvLyBnaXZlIHVwCisgICAgICB9CisKKyAgICAgIC8vIG5vdyB0aGF0IHdlIGtub3cgdGhlIFMvRyBsZW5ndGgsIGJ1aWxkIENNTkQgcGF5bG9hZAorICAgICAgYnVpbGRfRkNQX3BheWxvYWQoIENtbmQsIChVQ0hBUiopJkNNRGZjaHMtPnBsWzBdLCB0eXBlLCBmY3BfZGwgKTsKKworICAgICAgCisgICAgICBpZiggc2dQYWlycyA+IDMgKSAgLy8gbmVlZCBleHRlbmRlZCBzL2cgbGlzdAorICAgICAgICBwVFdFLT5CdWZmX09mZiA9IDB4MDAwMDAwMDA7IC8vIGV4dGVuZGVkIHMvZyBsaXN0LCBubyBvZmZzZXQKKyAgICAgIGVsc2UKKyAgICAgICAgcFRXRS0+QnVmZl9PZmYgPSAweDgwMDAwMDAwOyAvLyBsb2NhbCBkYXRhLCBubyBvZmZzZXQKKyAgICAgIAorICAgICAgcFRXRS0+QnVmZl9JbmRleCA9IDA7ICAgICAvLyBCdWZmX0luZGV4IHwgTGluaworICAgICAgcFRXRS0+RXhwX1JPID0gMDsKKyAgICAgIHBUV0UtPkJ5dGVfQ291bnQgPSAwOyAgLy8gZmlsbGVkIGluIGJ5IFRMIG9uIGVycgorICAgICAgcFRXRS0+cmVzZXJ2ZWRfID0gMDsKKyAgICAgIHBUV0UtPkV4cF9CeXRlX0NudCA9IGZjcF9kbDsvLyBzdW0gb2Ygc2NhdHRlciBidWZmZXJzCisgICAgICAKKyAgICAgIGJyZWFrOworCisKKworCisKKworICAgIGNhc2UgU0NTSV9UUkU6IC8vIFRhY2hMaXRlIFRhcmdldCBSZWFkIEVudHJ5CisKKyAgICAgIC8vIEl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlIGZvciB1cyB0byAidGltZS1vdXQiIGEgUkVBRCwKKyAgICAgIC8vIGJ1dCB3ZSdsbCB1c2UgaXQgZm9yIGRlc2lnbiBjb25zaXN0ZW5jeSBhbmQgaW50ZXJuYWwgZXJyb3IgcmVjb3ZlcnkuCisgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbICpmY0V4Y2hhbmdlSW5kZXhdLnRpbWVPdXQgPSAxMDsgLy8gcGVyIFNDU0kgcmVxLgorCisgICAgICAvLyBJL08gcmVxdWVzdCBibG9jayBzZXR0aW5ncy4uLgorICAgICAgKnBJUkJfZmxhZ3MgPSAwOyAgICAgIC8vIGNsZWFyIElSQiBmbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIFBSTEkgKHByb2Nlc3MgbG9naW4pIGluZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBzZWUgaWYgSW5pdGlhdG9yIFJlcXVpcmVzIFhGRVJfUkRZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm90LCBkb24ndCBzZW5kIG9uZSEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB7IFBSTEkgY2hlY2suLi59CisgICAgICBJUkJfZmxhZ3MuU0ZBID0gMDsgICAgLy8gZG9uJ3Qgc2VuZCBYRkVSX1JEWSAtIHN0YXJ0IGRhdGEKKyAgICAgIFNmc0xlbiA9ICpwSVJCX2ZsYWdzOworCisgICAgICBTZnNMZW4gPDw9IDI0OyAgICAgICAgLy8gc2hpZnQgZmxhZ3MgdG8gTVNCCisgICAgICBTZnNMZW4gKz0gKDMyTCArIDEyTCk7Ly8gYWRkIFNGUyBsZW4gKGhlYWRlciAmIFhGRVJfUkRZIHBheWxvYWQpCisKKworICAgICAgCisgICAgICAvLyBub3csIGZpbGwgb3V0IEZDUC1EQVRBIGhlYWRlcgorICAgICAgICAgICAgICAgICAgIC8vICh1c2UgYnVmZmVyIGluc2lkZSBTRVNUIG9iamVjdCkKKyAgICAgIGRhdGFIRFIgPSAmZmNDaGlwLT5TRVNULT5EYXRhSERSWyAqZmNFeGNoYW5nZUluZGV4IF07CisKKyAgICAgIGRhdGFIRFItPnJlc2VydmVkID0gMEw7IC8vIG11c3QgY2xlYXIKKyAgICAgIGRhdGFIRFItPnNvZl9lb2YgPSAweDc1MDAwMDAwTDsgIC8vIFNPRmkzOkVPRm4gbm8gVUFNOyBubyBDTFMsbm9MQ3Isbm8gVFMKKyAgICAgIGRhdGFIRFItPmRfaWQgPSAoSW5GQ0hTLT5zX2lkIHwgMHgwMTAwMDAwMEwpOyAvLyBSX0NUTD0gRkNQX0RBVEEKKyAgICAgIGRhdGFIRFItPnNfaWQgPSBmY0NoaXAtPlJlZ2lzdGVycy5teV9hbF9wYTsgLy8gQ1NfQ1RMID0gMAorCisKKyAgICAgICAgICAgICAgICAgICAvLyBUWVBFWzMxLTI0XSA4IGZvciBGQ1AgU0NTSQorICAgICAgICAgICAgICAgICAgIC8vIGZfY3RsWzIzOjBdIGV4Y2hnIHJlc3BvbmRlciwgbm90IDFzdCBzZXEsIHhmZXIgUy5JLgorICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHZhbGlkIFJPCisgICAgICBkYXRhSERSLT5mX2N0bCA9IDB4MDg4MTAwMDhMOworICAgICAgZGF0YUhEUi0+c2VxX2NudCA9IDB4MDEwMDAwMDA7ICAvLyBzZXF1ZW5jZSBJRCAobm8gWFJEWSkKKyAgICAgIGRhdGFIRFItPm94X3J4X2lkID0gSW5GQ0hTLT5veF9yeF9pZCAmIDB4RkZGRjAwMDA7IC8vIHdlIHdhbnQgdXBwZXIgMTYgYml0cworICAgICAgZGF0YUhEUi0+cm8gPSAweDBMOyAgICAvLyByZWxhdGl2ZSBvZmZzZXQgKG4vYSkKKworICAgICAgICAgICAgICAgICAgIC8vIG5vdywgZmlsbCBvdXQgRkNQLVJTUCBoZWFkZXIKKyAgICAgICAgICAgICAgICAgICAvLyAodXNlIGJ1ZmZlciBpbnNpZGUgU0VTVCBvYmplY3QpCisgICAgICByc3BIRFIgPSAmZmNDaGlwLT5TRVNULT5Sc3BIRFJbICpmY0V4Y2hhbmdlSW5kZXggXTsKKworICAgICAgcnNwSERSLT5yZXNlcnZlZCA9IDBMOyAvLyBtdXN0IGNsZWFyCisgICAgICByc3BIRFItPnNvZl9lb2YgPSAweDc1MDAwMDAwTDsgIC8vIFNPRmkzOkVPRm4gIG5vIFVBTTsgbm8gQ0xTLCBub0xDciwgbm8gVFMKKyAgICAgIHJzcEhEUi0+ZF9pZCA9IChJbkZDSFMtPnNfaWQgfCAweDA3MDAwMDAwTCk7IC8vIFJfQ1RMPSBGQ1BfUlNQCisgICAgICByc3BIRFItPnNfaWQgPSBmY0NoaXAtPlJlZ2lzdGVycy5teV9hbF9wYTsgLy8gQ1NfQ1RMID0gMAorICAgICAgICAgICAgICAgICAgIC8vIFRZUEVbMzEtMjRdIDggZm9yIEZDUCBTQ1NJCisgICAgICAgICAgICAgICAgICAgLy8gZl9jdGxbMjM6MF0gcmVzcG9uZGVyfGxhc3Qgc2VxfCB4ZmVyIFMuSS4KKyAgICAgIHJzcEhEUi0+Zl9jdGwgPSAweDA4OTEwMDAwTDsKKyAgICAgIHJzcEhEUi0+c2VxX2NudCA9IDB4MDIwMDAwMDA7ICAvLyBzZXF1ZW5jZSBJRDogZGZfY3RsOiBzZXF1ZW5jZSBjb3VudAorCisgICAgICByc3BIRFItPnJvID0gMHgwTDsgICAgLy8gcmVsYXRpdmUgb2Zmc2V0IChuL2EpCisKKworICAgICAgLy8gTm93IHNldHVwIHRoZSBTRVNUIGVudHJ5CisgICAgICBwVFJFID0gJmZjQ2hpcC0+U0VTVC0+dVsgKmZjRXhjaGFuZ2VJbmRleCBdLlRSRTsKKworCisgICAgICAvLyBWQUxpZCBlbnRyeTpEaXIgb3V0Ym91bmQ6ZW5hYmxlIENNOmVuYWwgSU5UOgorICAgICAgcFRSRS0+SGRyX0xlbiA9IDB4ODYwMTAwMjBMOyAvLyBkYXRhIGZyYW1lIExlbiBhbHdheXMgMzIgYnl0ZXMKKyAgICAgIHBUUkUtPkhkcl9BZGRyID0gIC8vIGJ1cyBhZGRyZXNzIG9mIGRhdGFIRFI7CisgICAgICAgICAgICBmY0NoaXAtPlNFU1QtPmJhc2UgKyAKKwkJKCh1bnNpZ25lZCBsb25nKSZmY0NoaXAtPlNFU1QtPkRhdGFIRFJbICpmY0V4Y2hhbmdlSW5kZXggXSAtCisJCQkodW5zaWduZWQgbG9uZylmY0NoaXAtPlNFU1QpOworCQorICAgICAgcFRSRS0+UlNQX0xlbiA9IDY0TDsgLy8gaGRyK2RhdGEgKFRMIGFzc2lzdGVkIFJTUCBmcmFtZSkKKyAgICAgIHBUUkUtPlJTUF9MZW4gfD0gKEluRkNIUy0+c19pZCA8PCA4KTsgLy8gTVMgMjQgYml0cyBSZW1vdGVfSUQKKyAgICAgIHBUUkUtPlJTUF9BZGRyID0gLy8gYnVzIGFkZHJlc3Mgb2YgcnNwSERSCisJCWZjQ2hpcC0+U0VTVC0+YmFzZSArIAorCQkJKCh1bnNpZ25lZCBsb25nKSZmY0NoaXAtPlNFU1QtPlJzcEhEUlsgKmZjRXhjaGFuZ2VJbmRleCBdIC0KKwkJCQkodW5zaWduZWQgbG9uZylmY0NoaXAtPlNFU1QpOworCisgICAgICAgICAgICAgICAgICAgLy8gRG8gd2UgbmVlZCBsb2NhbCBvciBleHRlbmRlZCBnYXRoZXIgbGlzdD8KKyAgICAgICAgICAgICAgICAgICAvLyBkZXBlbmRzIG9uIHNpemUgLSB3ZSBjYW4gaGFuZGxlIDMgbGVuL2FkZHIgcGFpcnMKKyAgICAgICAgICAgICAgICAgICAvLyBsb2NhbGx5LgorCisgICAgICBmY3BfZGwgPSBidWlsZF9TRVNUX3NnTGlzdCggCisJY3BxZmNIQkFkYXRhLT5QY2lEZXYsCisgICAgICAgICZwVFJFLT5HTGVuMSwgCisgICAgICAgIENtbmQsICAgICAgIC8vIFMvRyBsaXN0CisgICAgICAgICZzZ1BhaXJzLCAgIC8vIHJldHVybiAjIG9mIHBhaXJzIGluIFMvRyBsaXN0IChmcm9tICJEYXRhIiBkZXNjcmlwdG9yKQorICAgICAgICAmZmNDaGlwLT5TRVNULT5zZ1BhZ2VzWyAqZmNFeGNoYW5nZUluZGV4IF0pOy8vIChmb3IgRnJlZWluZyBsYXRlcikKKyAgICAgIAorICAgICAgCisgICAgICBpZiggIWZjcF9kbCApIC8vIGVycm9yIGJ1aWxkaW5nIFMvRyBsaXN0PworICAgICAgeworICAgICAgICB1bFN0YXR1cyA9IE1FTVBPT0xfRkFJTDsKKyAgICAgICAgYnJlYWs7ICAgICAgLy8gZ2l2ZSB1cAorICAgICAgfQorCisgICAgICAvLyBubyBwYXlsb2FkIG9yIGNvbW1hbmQgdG8gYnVpbGQgLS0gUkVBRCBkb2Vzbid0IG5lZWQgWFJEWQorCisgICAgICAKKyAgICAgIGlmKCBzZ1BhaXJzID4gMyApICAvLyBuZWVkIGV4dGVuZGVkIHMvZyBsaXN0CisgICAgICAgIHBUUkUtPkJ1ZmZfT2ZmID0gMHg3ODAwMDAwMEw7IC8vIGV4dGVuZGVkIGRhdGEgfCAobm8gb2Zmc2V0KQorICAgICAgZWxzZSAgICAgICAgICAgICAgIC8vIGxvY2FsIGRhdGEgcG9pbnRlcnMgKGluIFNFU1QpCisgICAgICAgIHBUUkUtPkJ1ZmZfT2ZmID0gMHhmODAwMDAwMEw7IC8vIGxvY2FsIGRhdGEgfCAobm8gb2Zmc2V0KQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVMT05HIDUKKyAgICAgIHBUUkUtPkJ1ZmZfSW5kZXggPSAwTDsgICAvLyBCdWZmX0luZGV4IHwgcmVzZXJ2ZWQKKyAgICAgIHBUUkUtPnJlc2VydmVkID0gMHgwTDsgICAvLyBEV29yZCA2CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEV29yZCA3OiBOT1RFOiB6ZXJvIGxlbmd0aCB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZyBUYWNoTGl0ZSEKKyAgICAgIHBUUkUtPkRhdGFfTGVuID0gZmNwX2RsOyAvLyBlLmcuIHN1bSBvZiBzY2F0dGVyIGJ1ZmZlcnMKKworICAgICAgcFRSRS0+cmVzZXJ2ZWRfID0gMEw7ICAgICAvLyBEV29yZCA4CisgICAgICBwVFJFLT5yZXNlcnZlZF9fID0gMEw7ICAgIC8vIERXb3JkIDkKKworICAgICAgYnJlYWs7CisKKworCisKKworICAgIAorCisgICAgY2FzZSBGQ1BfUkVTUE9OU0U6IAorICAgICAgICAgICAgICAgICAgLy8gVGFyZ2V0IHJlc3BvbnNlIGZyYW1lOiB0aGlzIHNlcXVlbmNlIHVzZXMgYW4gT1gvUlggSUQKKyAgICAgICAgICAgICAgICAgIC8vIHBhaXIgZnJvbSBhIGNvbXBsZXRlZCBTRVNUIGV4Y2hhbmdlLiAgV2UgYnVpbHQgbW9zdAorICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHJlc3BvbnNlIGZyYW1lIHdoZW4gd2UgY3JlYXRlZCB0aGUgVFdFL1RSRS4KKworICAgICAgKnBJUkJfZmxhZ3MgPSAwOyAgICAgIC8vIGNsZWFyIElSQiBmbGFncworICAgICAgSVJCX2ZsYWdzLlNGQSA9IDE7ICAgIC8vIHNlbmQgU0ZTIChSU1ApCisgICAgICBTZnNMZW4gPSAqcElSQl9mbGFnczsKKworICAgICAgU2ZzTGVuIDw8PSAyNDsgICAgICAgIC8vIHNoaWZ0IGZsYWdzIHRvIE1TQgorICAgICAgU2ZzTGVuICs9IHNpemVvZihUYWNoRkNIRFJfUlNQKTsvLyBhZGQgU0ZTIGxlbiAoaGVhZGVyICYgUlNQIHBheWxvYWQpCisgICAgICAKKworICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyAqZmNFeGNoYW5nZUluZGV4XS50eXBlID0gCisgICAgICAgIEZDUF9SRVNQT05TRTsgLy8gY2hhbmdlIEV4Y2hhbmdlIHR5cGUgdG8gInJlc3BvbnNlIiBwaGFzZQorCisgICAgICAvLyB0YWtlIGFkdmFudGFnZSBvZiBwcmlvciBrbm93bGVkZ2Ugb2YgT1gvUlhfSUQgcGFpciBmcm9tCisgICAgICAvLyBwcmV2aW91cyBYRkVSIG91dGJvdW5kIGZyYW1lIChzdGlsbCBpbiBmY2hzIG9mIGV4Y2hhbmdlKQorICAgICAgZmNDaGlwLT5TRVNULT5Sc3BIRFJbICpmY0V4Y2hhbmdlSW5kZXggXS5veF9yeF9pZCA9IAorICAgICAgICBDTURmY2hzLT5veF9yeF9pZDsKKworICAgICAgLy8gQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgREFUQSBwaGFzZSBvZiB0aGUgZXhjaGFuZ2Ugc28gd2UgY2FuIHJlcG9ydAorICAgICAgLy8gc3RhdHVzIHRvIHRoZSBpbml0aWF0b3IKKyAgICAgIGJ1aWxkRkNQc3RhdHVzKCBmY0NoaXAsICpmY0V4Y2hhbmdlSW5kZXgpOyAvLyBzZXQgUlNQIHBheWxvYWQgZmllbGRzCisKKyAgICAgIG1lbWNweSgKKyAgICAgICAgQ01EZmNocywgIC8vIHJlLXVzZSBzYW1lIFhGRVIgZmNocyBmb3IgUmVzcG9uc2UgZnJhbWUKKyAgICAgICAgJmZjQ2hpcC0+U0VTVC0+UnNwSERSWyAqZmNFeGNoYW5nZUluZGV4IF0sCisgICAgICAgIHNpemVvZiggVGFjaEZDSERSX1JTUCApKTsKKyAgICAgIAorICAgICAgICAKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHByaW50aygiY3BxZmNUUzogZG9uJ3Qga25vdyBob3cgdG8gYnVpbGQgRkMgdHlwZTogJVhoKCVkKVxuIiwgdHlwZSx0eXBlKTsKKyAgICAgIGJyZWFrOworCisgICAgfQorCisgICAgCisgICAgCisgICAgaWYoICF1bFN0YXR1cykgIC8vIG5vIGVycm9ycyBhYm92ZT8KKyAgICB7CisgICAgICAvLyBGQ0hTIGlzIGJ1aWx0OyBub3cgYnVpbGQgSVJCCisKKyAgICAgIC8vIGxpbmsgdGhlIGp1c3QgYnVpbHQgRkNIUyAodGhlICJjb21tYW5kIikgdG8gdGhlIElSQiBlbnRyeSAKKyAgICAgIC8vIGZvciB0aGlzIEV4Y2hhbmdlLgorICAgICAgcElSQiA9ICZFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbICpmY0V4Y2hhbmdlSW5kZXhdLklSQjsgCisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlbiAmIGZsYWdzIGFjY29yZGluZyB0byBjb21tYW5kIHR5cGUgYWJvdmUKKyAgICAgIHBJUkItPlJlcV9BX1NGU19MZW4gPSBTZnNMZW47ICAvLyBpbmNsdWRlcyBJUkIgZmxhZ3MgJiBsZW4KKyAgICAgIHBJUkItPlJlcV9BX1NGU19BZGRyID0gLy8gVEwgbmVlZHMgcGh5c2ljYWwgYWRkciBvZiBmcmFtZSB0byBzZW5kCisJCWZjQ2hpcC0+ZXhjaF9kbWFfaGFuZGxlICsgKHVuc2lnbmVkIGxvbmcpQ01EZmNocyAtIAorCQkJKHVuc2lnbmVkIGxvbmcpRXhjaGFuZ2VzOworCisgICAgICBwSVJCLT5SZXFfQV9TRlNfRF9JRCA9IENNRGZjaHMtPmRfaWQgPDwgODsgLy8gRGVzdF9JRCBtdXN0IGJlIGNvbnNpc3RlbnQhCisKKyAgICAvLyBFeGNoYW5nZSBpcyBjb21wbGV0ZSBleGNlcHQgZm9yICJmaXgtdXAiIGZpZWxkcyB0byBiZSBzZXQKKyAgICAvLyBhdCBUYWNoeW9uIFF1ZXVpbmcgdGltZToKKyAgICAvLyAgICBJUkItPlJlcV9BX1RyYW5zX0lEIChPWF9JRC8gUlhfSUQpOiAgCisgICAgLy8gICAgICAgIGZvciBTRVNUIGVudHJ5LCBsb3dlciBiaXRzIGNvcnJlc3BvbmQgdG8gYWN0dWFsIEZDIEV4Y2hhbmdlIElECisgICAgLy8gICAgZmNocy0+T1hfSUQgb3IgUlhfSUQKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBEQkcgICAgIAorICAgICAgcHJpbnRrKCAiRkMgRXJyb3I6IFNFU1QgYnVpbGQgUG9vbCBBbGxvY2F0aW9uIGZhaWxlZFxuIik7CisjZW5kaWYKKyAgICAgIC8vIHJldHVybiByZXNvdXJjZXMuLi4KKyAgICAgIGNwcWZjVFNDb21wbGV0ZUV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEtPlBjaURldiwgZmNDaGlwLCAqZmNFeGNoYW5nZUluZGV4KTsgIC8vIFNFU1QgYnVpbGQgZmFpbGVkCisgICAgfQorICB9CisgIGVsc2UgIC8vIG5vIEV4Y2hhbmdlcyBhdmFpbGFibGUKKyAgeworICAgIHVsU3RhdHVzID0gU0VTVF9GVUxMOworICAgIHByaW50ayggIkZDIEVycm9yOiBubyBmY0V4Y2hhbmdlcyBhdmFpbGFibGVcbiIpOworICB9CisgIHJldHVybiB1bFN0YXR1czsKK30KKworCisKKworCisKKy8vIHNldCBSU1AgcGF5bG9hZCBmaWVsZHMKK3N0YXRpYyB2b2lkICBidWlsZEZDUHN0YXR1cyggUFRBQ0hZT04gZmNDaGlwLCBVTE9ORyBFeGNoYW5nZUlEKSAKK3sKKyAgRkNfRVhDSEFOR0VTICpFeGNoYW5nZXMgPSBmY0NoaXAtPkV4Y2hhbmdlczsKKyAgRkNfRVhDSEFOR0UgKnBFeGNoYW5nZSA9ICZFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbRXhjaGFuZ2VJRF07ICAvLyBzaG9ydGhhbmQKKyAgUEZDUF9TVEFUVVNfUkVTUE9OU0UgcEZjcFN0YXR1czsKKyAgCisgIG1lbXNldCggJmZjQ2hpcC0+U0VTVC0+UnNwSERSWyBFeGNoYW5nZUlEIF0ucGwsIDAsCisgICAgc2l6ZW9mKCBGQ1BfU1RBVFVTX1JFU1BPTlNFKSApOworICBpZiggcEV4Y2hhbmdlLT5zdGF0dXMgKSAvLyBzb21ldGhpbmcgd3Jvbmc/CisgIHsKKyAgICBwRmNwU3RhdHVzID0gKFBGQ1BfU1RBVFVTX1JFU1BPTlNFKSAgLy8gY2FzdCBSU1AgYnVmZmVyIGZvciB0aGlzIHhjaG5nCisgICAgICAmZmNDaGlwLT5TRVNULT5Sc3BIRFJbIEV4Y2hhbmdlSUQgXS5wbDsKKyAgICBpZiggcEV4Y2hhbmdlLT5zdGF0dXMgJiBDT1VOVF9FUlJPUiApCisgICAgeworICAgICAgCisgICAgICAvLyBzZXQgRkNQIHJlc3BvbnNlIGxlbiB2YWxpZCAoc28gd2UgY2FuIHJlcG9ydCBjb3VudCBlcnJvcikKKyAgICAgIHBGY3BTdGF0dXMtPmZjcF9zdGF0dXMgfD0gRkNQX1JTUF9MRU5fVkFMSUQ7CisgICAgICBwRmNwU3RhdHVzLT5mY3BfcnNwX2xlbiA9IDB4MDQwMDAwMDA7ICAvLyA0IGJ5dGUgbGVuIChCSUcgRW5kaWFuKQorCisgICAgICBwRmNwU3RhdHVzLT5mY3BfcnNwX2luZm8gPSBGQ1BfREFUQV9MRU5fTk9UX0JVUlNUX0xFTjsgLy8gUlNQX0NPREUKKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgZG1hX2FkZHJfdCAKK2NwcWZjX3BjaV9tYXBfc2dfcGFnZSgKKyAgICAJCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsCisJCVVMT05HICpod19wYWRkciwgCS8vIHdoZXJlIHRvIHB1dCBwaHlzIGFkZHIgZm9yIEhXIHVzZQorCQl2b2lkICpzZ3BfdmFkZHIsCS8vIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHNnIHBhZ2UgCisJIAlkbWFfYWRkcl90ICp1bWFwX3BhZGRyLAkvLyB3aGVyZSB0byBwdXQgcGh5cyBhZGRyIGZvciB1bm1hcAorCQl1bnNpZ25lZCBpbnQgKm1hcGxlbiwJLy8gd2hlcmUgdG8gc3RvcmUgc2cgZW50cnkgbGVuZ3RoCisJCWludCBQYWlyQ291bnQpCQkvLyBudW1iZXIgb2Ygc2cgcGFpcnMgdXNlZCBpbiB0aGUgcGFnZS4JCit7CisJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2FkZHIgPSAodW5zaWduZWQgbG9uZykgc2dwX3ZhZGRyOworCisJKm1hcGxlbiA9IFBhaXJDb3VudCAqIDg7CisgICAgICAgIGFsaWduZWRfYWRkciArPSBUTF9FWFRfU0dfUEFHRV9CWVRFTEVOOworICAgICAgICBhbGlnbmVkX2FkZHIgJj0gfihUTF9FWFRfU0dfUEFHRV9CWVRFTEVOIC0xKTsKKwkKKwkqdW1hcF9wYWRkciA9IHBjaV9tYXBfc2luZ2xlKHBjaWRldiwgKHZvaWQgKikgYWxpZ25lZF9hZGRyLCAKKwkJCQkqbWFwbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkqaHdfcGFkZHIgPSAoVUxPTkcpICp1bWFwX3BhZGRyOworCisjICAgICAgIGlmIEJJVFNfUEVSX0xPTkcgPiAzMgorICAgICAgIAkJaWYoICp1bWFwX3BhZGRyID4+MzIgKSB7CisgICAgICAgCSAgCQlwcmludGsoImNxcGZjVFM6VGFjaCBTRyBETUEgYWRkciAlcD4zMiBiaXRzXG4iLCAKKwkgIAkJCSh2b2lkKil1bWFwX3BhZGRyKTsKKyAgICAgICAJCQlyZXR1cm4gMDsKKyAgICAgICAJCX0KKyMgICAgICAgZW5kaWYKKwlyZXR1cm4gKnVtYXBfcGFkZHI7Cit9CisKK3N0YXRpYyB2b2lkCitjcHFmY191bmRvX1NFU1RfbWFwcGluZ3Moc3RydWN0IHBjaV9kZXYgKnBjaWRldiwKKwkJCXVuc2lnbmVkIGxvbmcgY29udGlnYWRkciwgaW50IGxlbiwgaW50IGRpciwKKyAgCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIGludCB1c2Vfc2csCisgICAgCQkJUFNHUEFHRVMgKnNnUGFnZXNfaGVhZCwKKwkJCWludCBhbGxvY2F0ZWRfcGFnZXMpCit7CisJUFNHUEFHRVMgaSwgbmV4dDsKKworCWlmIChjb250aWdhZGRyICE9ICh1bnNpZ25lZCBsb25nKSBOVUxMKQorCQlwY2lfdW5tYXBfc2luZ2xlKHBjaWRldiwgY29udGlnYWRkciwgbGVuLCBkaXIpOworCisJaWYgKHNnbCAhPSBOVUxMKQorCQlwY2lfdW5tYXBfc2cocGNpZGV2LCBzZ2wsIHVzZV9zZywgZGlyKTsKKworCWZvciAoaT0qc2dQYWdlc19oZWFkOyBpICE9IE5VTEwgO2kgPSBuZXh0KQorCXsKKwkJcGNpX3VubWFwX3NpbmdsZShwY2lkZXYsIGktPmJ1c2FkZHIsIGktPm1hcGxlbiwgCisJCQlzY3NpX3RvX3BjaV9kbWFfZGlyKFBDSV9ETUFfVE9ERVZJQ0UpKTsKKwkJaS0+YnVzYWRkciA9IChkbWFfYWRkcl90KSBOVUxMOyAKKwkJaS0+bWFwbGVuID0gMEw7IAorCQluZXh0ID0gaS0+bmV4dDsKKwkJa2ZyZWUoaSk7IAorCX0KKwkqc2dQYWdlc19oZWFkID0gTlVMTDsKK30KKworLy8gVGhpcyByb3V0aW5lIGJ1aWxkcyBzY2F0dGVyL2dhdGhlciBsaXN0cyBpbnRvIFNFU1QgZW50cmllcworLy8gSU5QVVRTOgorLy8gICBTRVNUYWxQYWlyIC0gU0VTVCBhZGRyZXNzIEBEV29yZEEgIkxvY2FsIEJ1ZmZlciBMZW5ndGgiCisvLyAgIHNnTGlzdCAgICAgLSBTY2F0dGVyL0dhdGhlciBsaW5rZWQgbGlzdCBvZiBMZW4vQWRkcmVzcyBkYXRhIGJ1ZmZlcnMKKy8vIE9VVFBVVDoKKy8vICAgc2dQYWlycyAtIG51bWJlciBvZiB2YWxpZCBhZGRyZXNzL2xlbmd0aCBwYWlycworLy8gUmVtYXJrczoKKy8vICAgVGhlIFNFU1QgZGF0YSBidWZmZXIgcG9pbnRlcnMgb25seSBkZXBlbmQgb24gbnVtYmVyIG9mCisvLyAgIGxlbmd0aC8gYWRkcmVzcyBwYWlycywgTk9UIG9uIHRoZSB0eXBlIChJV0UsIFRSRSwuLi4pCisvLyAgIFVwIHRvIDMgcGFpcnMgY2FuIGJlIHJlZmVyZW5jZWQgaW4gdGhlIFNFU1QgLSBtb3JlIHRoYW4gMworLy8gICByZXF1aXJlIHRoaXMgRXh0ZW5kZWQgUy9HIGxpc3QgcGFnZS4gIFRoZSBwYWdlIGhvbGRzIDQsIDgsIDE2Li4uCisvLyAgIGxlbi9hZGRyIHBhaXJzLCBwZXIgU2NhdHRlci9HYXRoZXIgTGlzdCBQYWdlIExlbmd0aCBSZWcuCisvLyAgIFRhY2hMaXRlIGFsbG93cyBwYWdlcyB0byBiZSBsaW5rZWQgdG8gYW55IGRlcHRoLgorCisvLyNkZWZpbmUgREJHX1NFU1RfU0dMSVNUIDEgLy8gZm9yIHByaW50aW5nIG91dCBTL0cgcGFpcnMgd2l0aCBFeHQuIHBhZ2VzCisKK3N0YXRpYyBpbnQgYXBfaGlfd2F0ZXIgPSBUTF9EQU5HRVJfU0dQQUdFUzsKKworc3RhdGljIFVMT05HIGJ1aWxkX1NFU1Rfc2dMaXN0KCAKKyAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LAorICAgIFVMT05HICpTRVNUYWxQYWlyU3RhcnQsICAvLyB0aGUgMyBsZW4vYWRkcmVzcyBidWZmZXJzIGluIFNFU1QKKyAgICBTY3NpX0NtbmQgKkNtbmQsCisgICAgVUxPTkcgKnNnUGFpcnMsIAorICAgIFBTR1BBR0VTICpzZ1BhZ2VzX2hlYWQpICAvLyBsaW5rIGxpc3Qgb2YgVEwgRXh0LiBTL0cgcGFnZXMgZnJvbSBPL1MgUG9vbAorICAgIAoreworICBVTE9ORyBpLCBBbGxvY2F0ZWRQYWdlcz0wOyAvLyBUYWNoIEV4dC4gUy9HIHBhZ2UgYWxsb2NhdGlvbnMKKyAgVUxPTkcqIGFsUGFpciA9IFNFU1RhbFBhaXJTdGFydDsKKyAgVUxPTkcqIGV4dF9zZ19wYWdlX3BoeXNfYWRkcl9wbGFjZSA9IE5VTEw7CisgIGludCBQYWlyQ291bnQ7CisgIHVuc2lnbmVkIGxvbmcgdWxCdWZmLCBjb250aWdhZGRyOworICBVTE9ORyB0b3RhbF9kYXRhX2xlbj0wOyAvLyAoaW4gYnl0ZXMpCisgIFVMT05HIGJ5dGVzX3RvX2dvID0gQ21uZC0+cmVxdWVzdF9idWZmbGVuOyAvLyB0b3RhbCB4ZmVyIChTL0cgc3VtKQorICBVTE9ORyB0aGlzTWFwcGluZ0xlbjsKKyAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wgPSBOVUxMOyAgLy8gUy9HIGxpc3QgKExpbnV4IGZvcm1hdCkKKyAgaW50IHNnX2NvdW50LCB0b3RhbHNnczsgCisgIGRtYV9hZGRyX3QgYnVzYWRkcjsKKyAgdW5zaWduZWQgbG9uZyB0aGlzbGVuLCBvZmZzZXQ7CisgIFBTR1BBR0VTICpzZ3BhZ2UgPSBzZ1BhZ2VzX2hlYWQ7CisgIFBTR1BBR0VTIHByZXZfcGFnZSA9IE5VTEw7CisKKyMgZGVmaW5lIFdFX0hBVkVfU0dfTElTVCAoc2dsICE9ICh1bnNpZ25lZCBsb25nKSBOVUxMKQorICBjb250aWdhZGRyID0gKHVuc2lnbmVkIGxvbmcpIE5VTEw7CisKKyAgaWYoICFDbW5kLT51c2Vfc2cgKSAgLy8gbm8gUy9HIGxpc3Q/CisgIHsKKwlpZiAoYnl0ZXNfdG9fZ28gPD0gVExfTUFYX1NHX0VMRU1fTEVOKQorCXsKKyAgICAJCSpzZ1BhaXJzID0gMTsJLy8gdXNlICJsb2NhbCIgUy9HIHBhaXIgaW4gU0VTVCBlbnRyeQorCQkJCS8vIChmb3Igbm93LCBpZ25vcmUgYWRkcmVzcyBiaXRzIGFib3ZlICMzMSkKKworCQkqYWxQYWlyKysgPSBieXRlc190b19nbzsgLy8gYml0cyAxOC0wLCBsZW5ndGgKKworCQlpZiAoYnl0ZXNfdG9fZ28gIT0gMCkgeworCQkJY29udGlnYWRkciA9IHVsQnVmZiA9IHBjaV9tYXBfc2luZ2xlKHBjaWRldiwgCisJCQkJQ21uZC0+cmVxdWVzdF9idWZmZXIsIAorCQkJCUNtbmQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQlzY3NpX3RvX3BjaV9kbWFfZGlyKENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisJCQkvLyBwcmludGsoIm1zICVwICIsIHVsQnVmZik7CisJCX0KKwkJZWxzZSB7CisJCQkvLyBObyBkYXRhIHRyYW5zZmVyLCAoZS5nLjogVGVzdCBVbml0IFJlYWR5KQorCQkJLy8gcHJpbnRrKCJidGc9MCAiKTsKKwkJCSpzZ1BhaXJzID0gMDsKKwkJCW1lbXNldChhbFBhaXIsIDAsIHNpemVvZigqYWxQYWlyKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisjCQlpZiBCSVRTX1BFUl9MT05HID4gMzIKKyAgICAJCQlpZiggdWxCdWZmID4+MzIgKSB7CisgICAgICAJCQkJcHJpbnRrKCJGQVRBTCEgVGFjaHlvbiBETUEgYWRkcmVzcyAlcCAiCisJCQkJCSJleGNlZWRzIDMyIGJpdHNcbiIsICh2b2lkKil1bEJ1ZmYgKTsKKyAgICAgIAkJCQlyZXR1cm4gMDsKKyAgICAJCQl9CisjCQllbmRpZgorICAgIAkJKmFsUGFpciA9IChVTE9ORyl1bEJ1ZmY7ICAgICAgCisgICAgCQlyZXR1cm4gYnl0ZXNfdG9fZ287CisJfSAKKwllbHNlCS8vIFdlIGhhdmUgYSBzaW5nbGUgbGFyZ2UgKHRvbyBiaWcpIGNvbnRpZ3VvdXMgYnVmZmVyLgorCXsJLy8gV2Ugd2lsbCBoYXZlIHRvIGJyZWFrIGl0IHVwLiAgV2UnbGwgdXNlIHRoZSBzY2F0dGVyCisJCS8vIGdhdGhlciBjb2RlIHdheSBiZWxvdywgYnV0IHVzZSBjb250aWdhZGRyIGluc3RlYWQKKwkJLy8gb2Ygc2dfZG1hX2FkZHIoKS4gKHRoaXMgaXMgYSB2ZXJ5IHJhcmUgY2FzZSkuCisKKwkJdW5zaWduZWQgbG9uZyBidGc7CisJCWNvbnRpZ2FkZHIgPSBwY2lfbWFwX3NpbmdsZShwY2lkZXYsIENtbmQtPnJlcXVlc3RfYnVmZmVyLCAKKwkJCQlDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJc2NzaV90b19wY2lfZG1hX2RpcihDbW5kLT5zY19kYXRhX2RpcmVjdGlvbikpOworCisJCS8vIHByaW50aygiY29udGlnYWRkciA9ICVwLCBsZW4gPSAlZFxuIiwgCisJCS8vCSh2b2lkICopIGNvbnRpZ2FkZHIsIGJ5dGVzX3RvX2dvKTsKKwkJdG90YWxzZ3MgPSAwOworCQlmb3IgKGJ0ZyA9IGJ5dGVzX3RvX2dvOyBidGcgPiAwOyApIHsKKwkJCWJ0ZyAtPSAoIGJ0ZyA+IFRMX01BWF9TR19FTEVNX0xFTiA/IAorCQkJCVRMX01BWF9TR19FTEVNX0xFTiA6IGJ0ZyApOworCQkJdG90YWxzZ3MrKzsKKwkJfQorCQlzZ2wgPSBOVUxMOworCQkqc2dQYWlycyA9IHRvdGFsc2dzOworCX0KKyAgfQorICBlbHNlICAvLyB3ZSBkbyBoYXZlIGEgc2NhdHRlciBnYXRoZXIgbGlzdAorICB7CisJLy8gW1RCRCAtIHVwZGF0ZSBmb3IgTGludXggdG8gc3VwcG9ydCA+IDMyIGJpdHMgYWRkcmVzc2luZ10KKwkvLyBzaW5jZSB0aGUgZm9ybWF0IGZvciBsb2NhbCAmIGV4dGVuZGVkIFMvRyBsaXN0cyBpcyBkaWZmZXJlbnQsCisJLy8gY2hlY2sgaWYgUy9HIHBhaXJzIGV4Y2VlZHMgMy4KKwkvLyAqc2dQYWlycyA9IENtbmQtPnVzZV9zZzsgTm9wZSwgdGhhdCdzIHdyb25nLgorIAorCXNnbCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QqKUNtbmQtPnJlcXVlc3RfYnVmZmVyOyAgCisJc2dfY291bnQgPSBwY2lfbWFwX3NnKHBjaWRldiwgc2dsLCBDbW5kLT51c2Vfc2csIAorCQlzY3NpX3RvX3BjaV9kbWFfZGlyKENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisgIAlpZiggc2dfY291bnQgPD0gMyApIHsKKworCS8vIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBoZXJlIHRoYXQgbm8gaW5kaXZpZHVhbCBtYXBwaW5nCisJLy8gaXMgdG9vIGxhcmdlLCBhbmQgaWYgYW55IGlzLCB0aGF0IGJyZWFraW5nIGl0IHVwCisJLy8gZG9lc24ndCBwdXNoIHVzIG92ZXIgMyBzZ3MsIG9yLCBpZiBpdCBkb2VzLCB0aGF0IHdlCisJLy8gaGFuZGxlIHRoYXQgY2FzZS4gIFRhY2h5b24gY2FuIHRha2UgMHg3RkZGRiBiaXRzIGZvciBsZW5ndGgsCisJLy8gYnV0IHNnIHN0cnVjdHVyZSB1c2VzICJ1bnNpZ25lZCBpbnQiLCBvbiB0aGUgZmFjZSBvZiBpdCwgCisJLy8gdXAgdG8gMHhGRkZGRkZGRiBvciBldmVuIG1vcmUuCisKKwkJaW50IGk7CisJCXVuc2lnbmVkIGxvbmcgdGhpc2xlbjsKKworCQl0b3RhbHNncyA9IDA7CisJCWZvciAoaT0wO2k8c2dfY291bnQ7aSsrKSB7CisgICAgICAJCQl0aGlzbGVuID0gc2dfZG1hX2xlbigmc2dsW2ldKTsKKwkJCXdoaWxlICh0aGlzbGVuID49IFRMX01BWF9TR19FTEVNX0xFTikgeworCQkJCXRvdGFsc2dzKys7CisJCQkJdGhpc2xlbiAtPSBUTF9NQVhfU0dfRUxFTV9MRU47CisJCQl9CisJCQlpZiAodGhpc2xlbiA+IDApIHRvdGFsc2dzKys7CisJCX0KKwkJKnNnUGFpcnMgPSB0b3RhbHNnczsKKyAgCX0gZWxzZSB0b3RhbHNncyA9IDk5OTsgLy8gYXMgYSBmaXJzdCBlc3RpbWF0ZSwgZGVmaW5pdGVseSA+MywgCisJCQkgICAgICAKKwkvLyBpZiAodG90YWxzZ3MgIT0gc2dfY291bnQpIAorCS8vCXByaW50aygidG90YWxzZ3MgPSAlZCwgc2djb3VudD0lZFxuIix0b3RhbHNncyxzZ19jb3VudCk7CisgIH0KKworICBpZiggdG90YWxzZ3MgPD0gMyApIC8vIGNhbiAobXVzdCkgdXNlICJsb2NhbCIgU0VTVCBsaXN0CisgIHsKKyAgICB3aGlsZSggYnl0ZXNfdG9fZ28pCisgICAgeworICAgICAgb2Zmc2V0ID0gMEw7CisKKyAgICAgIGlmICggV0VfSEFWRV9TR19MSVNUICkgCisJdGhpc01hcHBpbmdMZW4gPSBzZ19kbWFfbGVuKHNnbCk7CisgICAgICBlbHNlCQkJCQkvLyBvciBjb250aWd1b3VzIGJ1ZmZlcj8KKwl0aGlzTWFwcGluZ0xlbiA9IGJ5dGVzX3RvX2dvOworCisgICAgICB3aGlsZSAodGhpc01hcHBpbmdMZW4gPiAwKQorICAgICAgeyAgCisJdGhpc2xlbiA9IHRoaXNNYXBwaW5nTGVuID4gVExfTUFYX1NHX0VMRU1fTEVOID8gCisJCVRMX01BWF9TR19FTEVNX0xFTiA6IHRoaXNNYXBwaW5nTGVuOworCWJ5dGVzX3RvX2dvID0gYnl0ZXNfdG9fZ28gLSB0aGlzbGVuOworCisJLy8gd2UgaGF2ZSBML0EgcGFpcjsgTCA9IHRoaXNsZW4sIEEgPSBwaHlzaWNhbEFkZHJlc3MKKwkvLyBsb2FkIGludG8gU0VTVC4uLgorCisJdG90YWxfZGF0YV9sZW4gKz0gdGhpc2xlbjsKKwkqYWxQYWlyID0gdGhpc2xlbjsgLy8gYml0cyAxOC0wLCBsZW5ndGgKKworCWFsUGFpcisrOworCisJaWYgKCBXRV9IQVZFX1NHX0xJU1QgKSAKKwkJdWxCdWZmID0gc2dfZG1hX2FkZHJlc3Moc2dsKSArIG9mZnNldDsKKwllbHNlCisJCXVsQnVmZiA9IGNvbnRpZ2FkZHIgKyBvZmZzZXQ7CisKKwlvZmZzZXQgKz0gdGhpc2xlbjsKKworIwlpZiBCSVRTX1BFUl9MT05HID4gMzIKKwkJaWYoIHVsQnVmZiA+PjMyICkgeworICAgICAgICAJCXByaW50aygiY3FwZmNUUzogMlRhY2ggRE1BIGFkZHJlc3MgJXAgPiAzMiBiaXRzXG4iLCAKKwkJCQkodm9pZCopdWxCdWZmICk7CisJCSAgICBwcmludGsoIiVzID0gJXAsIG9mZnNldCA9ICVsZFxuIiwgCisJCQlXRV9IQVZFX1NHX0xJU1QgPyAidWxCdWZmIiA6ICJjb250aWdhZGRyIiwKKwkJCVdFX0hBVkVfU0dfTElTVCA/ICh2b2lkICopIHVsQnVmZiA6ICh2b2lkICopIGNvbnRpZ2FkZHIsCisJCQkJb2Zmc2V0KTsKKyAgICAgICAgCQlyZXR1cm4gMDsKKyAgICAgIAkJfQorIwllbmRpZgorICAgICAgICAqYWxQYWlyKysgPSAoVUxPTkcpdWxCdWZmOyAvLyBsb3dlciAzMiBiaXRzICgzMS0wKQorCXRoaXNNYXBwaW5nTGVuIC09IHRoaXNsZW47CisgICAgICB9CisKKyAgICAgIGlmICggV0VfSEFWRV9TR19MSVNUICkgKytzZ2w7ICAvLyBuZXh0IFMvRyBwYWlyCisJZWxzZSBpZiAoYnl0ZXNfdG9fZ28gIT0gMCkgcHJpbnRrKCJCVEcgbm90IHplcm8hXG4iKTsKKworIyAgICAgaWZkZWYgREJHX1NFU1RfU0dMSVNUCisJcHJpbnRrKCJMPSVkICIsIHRoaXNNYXBwaW5nTGVuKTsKKwlwcmludGsoImJ0Zz0lZCAiLCBieXRlc190b19nbyk7CisjICAgICBlbmRpZgorCisgICAgfQorICAgIC8vIHByaW50aygiaTolZFxuIiwgKnNnUGFpcnMpOworICB9CisgIGVsc2UgICAgLy8gbW9yZSB0aGFuIDMgcGFpcnMgcmVxdWlyZXMgRXh0ZW5kZWQgUy9HIHBhZ2UgKFBvb2wgQWxsb2NhdGlvbikKKyAgeworICAgIC8vIGNsZWFyIG91dCBTRVNUIERXT1JEcyAobG9jYWwgUy9HIGFkZHIpIEMtRiAoQS1CIHNldCBpbiBmb2xsb3dpbmcgbG9naWMpCisgICAgZm9yKCBpPTI7IGk8NjsgaSsrKQorICAgICAgYWxQYWlyW2ldID0gMDsKKworICAgIFBhaXJDb3VudCA9IFRMX0VYVF9TR19QQUdFX0NPVU5UOyAgICAvLyBmb3JjZXMgaW5pdGlhbCBwYWdlIGFsbG9jYXRpb24KKyAgICB0b3RhbHNncyA9IDA7CisgICAgd2hpbGUoIGJ5dGVzX3RvX2dvICkKKyAgICB7CisgICAgICAvLyBQZXIgU0VTVCBmb3JtYXQsIHdlIGNhbiBzdXBwb3J0IDUyNDI4NyBieXRlIGxlbmd0aHMgcGVyCisgICAgICAvLyBTL0cgcGFpci4gIFR5cGljYWwgdXNlciBidWZmZXJzIGFyZSA0aywgYW5kIHZlcnkgcmFyZWx5CisgICAgICAvLyBleGNlZWQgMTJrIGR1ZSB0byBmcmFnbWVudGF0aW9uIG9mIHBoeXNpY2FsIG1lbW9yeSBwYWdlcy4KKyAgICAgIC8vIEhvd2V2ZXIsIG9uIGNlcnRhaW4gTy9TIHN5c3RlbSAobm90ICJ1c2VyIikgYnVmZmVycyAob24gcGxhdGZvcm1zIAorICAgICAgLy8gd2l0aCBodWdlIG1lbW9yaWVzKSwgaXQncyBwb3NzaWJsZSB0byBleGNlZWQgdGhpcworICAgICAgLy8gbGVuZ3RoIGluIGEgc2luZ2xlIFMvRyBhZGRyZXNzL2xlbiBtYXBwaW5nLCBzbyB3ZSBoYXZlIHRvIGhhbmRsZQorICAgICAgLy8gdGhhdC4KKworICAgICAgb2Zmc2V0ID0gMEw7CisgICAgICBpZiAoIFdFX0hBVkVfU0dfTElTVCApIAorCXRoaXNNYXBwaW5nTGVuID0gc2dfZG1hX2xlbihzZ2wpOworICAgICAgZWxzZQorCXRoaXNNYXBwaW5nTGVuID0gYnl0ZXNfdG9fZ287CisKKyAgICAgIHdoaWxlICh0aGlzTWFwcGluZ0xlbiA+IDApCisgICAgICB7CisJdGhpc2xlbiA9IHRoaXNNYXBwaW5nTGVuID4gVExfTUFYX1NHX0VMRU1fTEVOID8gCisJCVRMX01BWF9TR19FTEVNX0xFTiA6IHRoaXNNYXBwaW5nTGVuOworCS8vIHByaW50aygiJWQvJWQvJWRcbiIsIHRoaXNsZW4sIHRoaXNNYXBwaW5nTGVuLCBieXRlc190b19nbyk7CisgICAgICAKKyAgCS8vIHNob3VsZCB3ZSBsb2FkIGludG8gInRoaXMiIGV4dGVuZGVkIFMvRyBwYWdlLCBvciBhbGxvY2F0ZQorCS8vIG5ldyBwYWdlPworCisJaWYoIFBhaXJDb3VudCA+PSBUTF9FWFRfU0dfUEFHRV9DT1VOVCApCisJeworCSAgLy8gTm93LCB3ZSBoYXZlIHRvIG1hcCB0aGUgcHJldmlvdXMgcGFnZSwgKHRyaWdnZXJpbmcgYnVmZmVyIGJvdW5jZSkKKwkgIC8vIFRoZSBmaXJzdCB0aW1lIHRocnUgdGhlIGxvb3AsIHRoZXJlIHdvbid0IGJlIGEgcHJldmlvdXMgcGFnZS4KKwkgIGlmIChwcmV2X3BhZ2UgIT0gTlVMTCkgLy8gaXMgdGhlcmUgYSBwcmV2IHBhZ2U/IAorCSAgeworCQkvLyB0aGlzIGNvZGUgaXMgbm9ybWFsbHkga2luZCBvZiBoYXJkIHRvIHRyaWdnZXIsIAorCQkvLyB5b3UgaGF2ZSB0byB1c2UgdXAgbW9yZSB0aGFuIDI1NiBzY2F0dGVyIGdhdGhlciAKKwkJLy8gZWxlbWVudHMgdG8gZ2V0IGhlcmUuICBDcmFua2luZyBkb3duIFRMX01BWF9TR19FTEVNX0xFTgorCQkvLyB0byBhbiBhYnN1cmRseSBsb3cgdmFsdWUgKDEyOCBieXRlcyBvciBzbykgdG8gYXJ0aWZpY2lhbGx5CisJCS8vIGJyZWFrIGkvbydzIGludG8gYSB6aWxsaW9uIHBpZWNlcyBpcyBob3cgSSB0ZXN0ZWQgaXQuIAorCQlidXNhZGRyID0gY3BxZmNfcGNpX21hcF9zZ19wYWdlKHBjaWRldiwKKwkJCQlleHRfc2dfcGFnZV9waHlzX2FkZHJfcGxhY2UsCisJCQkJcHJldl9wYWdlLT5wYWdlLAorICAgICAgICAJCQkmcHJldl9wYWdlLT5idXNhZGRyLAorICAgICAgICAJCQkmcHJldl9wYWdlLT5tYXBsZW4sCisJCQkJUGFpckNvdW50KTsKKyAgICAgICAgICB9IAorICAgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBUTCBFeHRlbmRlZCBTL0cgbGlzdCBwYWdlLiAgV2UgaGF2ZQorICAgICAgICAgIC8vIHRvIGFsbG9jYXRlIHR3aWNlIHdoYXQgd2Ugd2FudCB0byBlbnN1cmUgcmVxdWlyZWQgVEwgYWxpZ25tZW50CisgICAgICAgICAgLy8gKFRhY2hsaXRlIFRML1RTIFVzZXIgTWFuLiBSZXYgNi4wLCBwIDE2OCkKKyAgICAgICAgICAvLyBXZSBzdG9yZSB0aGUgb3JpZ2luYWwgYWxsb2NhdGVkIFBWT0lEIHNvIHdlIGNhbiBmcmVlIGxhdGVyCisJICAqc2dwYWdlID0ga21hbGxvYyggc2l6ZW9mKFNHUEFHRVMpLCBHRlBfQVRPTUlDKTsKKwkgIGlmICggISAqc2dwYWdlICkKKyAgICAgICAgICB7CisJCXByaW50aygiY3BxZmM6IEFsbG9jYXRpb24gZmFpbGVkIEAgJWQgUy9HIHBhZ2UgYWxsb2NhdGlvbnNcbiIsCisJCQlBbGxvY2F0ZWRQYWdlcyk7CisJCXRvdGFsX2RhdGFfbGVuID0gMDsgIC8vIGZhaWx1cmUhISBFeHQuIFMvRyBpcyBBbGwtb3Itbm9uZSBhZmZhaXIKKworCSAgICAgICAgLy8gdW5tYXAgdGhlIHByZXZpb3VzIG1hcHBpbmdzLCBpZiBhbnkuCisKKwkgICAgICAgIGNwcWZjX3VuZG9fU0VTVF9tYXBwaW5ncyhwY2lkZXYsIGNvbnRpZ2FkZHIsIAorCQkJQ21uZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJc2NzaV90b19wY2lfZG1hX2RpcihDbW5kLT5zY19kYXRhX2RpcmVjdGlvbiksCisgIAkJCXNnbCwgQ21uZC0+dXNlX3NnLCBzZ1BhZ2VzX2hlYWQsIEFsbG9jYXRlZFBhZ2VzKzEpOworCisJCS8vIEZJWE1FOiB0ZXN0aW5nIHNob3dzIHRoYXQgaWYgd2UgZ2V0IGhlcmUsIAorCQkvLyBpdCdzIGJhZCBuZXdzLiAgKHRoaXMgaGFzIGJlZW4gdGhpcyB3YXkgZm9yIGEgbG9uZyAKKwkJLy8gdGltZSB0aG91Z2gsIEFGQUlLLiAgTm90IHRoYXQgdGhhdCBleGN1c2VzIGl0LikKKworCQlyZXR1cm4gMDsgLy8gZ2l2ZSB1cCAoYW5kIHByb2JhYmx5IGhhbmcgdGhlIHN5c3RlbSkKKyAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IG1lbW9yeSB3ZSBqdXN0IGFsbG9jYXRlZAorCSAgbWVtc2V0KCAoKnNncGFnZSktPnBhZ2UsMCxUTF9FWFRfU0dfUEFHRV9CWVRFTEVOKjIpOworCSAgKCpzZ3BhZ2UpLT5uZXh0ID0gTlVMTDsKKwkgICgqc2dwYWdlKS0+YnVzYWRkciA9IChkbWFfYWRkcl90KSBOVUxMOworCSAgKCpzZ3BhZ2UpLT5tYXBsZW4gPSAwTDsKKyAgICAgIAorCSAgLy8gYWxpZ24gdGhlIG1lbW9yeSAtIFRMIHJlcXVpcmVzIHNpemVvZigpIEV4dC4gUy9HIHBhZ2UgYWxpZ25tZW50LgorCSAgLy8gV2UgZG91YmxlZCB0aGUgYWN0dWFsIHJlcXVpcmVkIHNpemUgc28gd2UgY291bGQgbWFzayBvZmYgTFNCcyAKKwkgIC8vIHRvIGdldCBkZXNpcmVkIG9mZnNldCAKKworCSAgdWxCdWZmID0gKHVuc2lnbmVkIGxvbmcpICgqc2dwYWdlKS0+cGFnZTsKKwkgIHVsQnVmZiArPSBUTF9FWFRfU0dfUEFHRV9CWVRFTEVOOworCSAgdWxCdWZmICY9IH4oVExfRVhUX1NHX1BBR0VfQllURUxFTiAtMSk7CisKKwkgIC8vIHNldCBwb2ludGVyLCBpbiBTRVNUIGlmIGZpcnN0IEV4dC4gUy9HIHBhZ2UsIG9yIGluIGxhc3QgcGFpcgorCSAgLy8gb2YgbGlua2VkIEV4dC4gUy9HIHBhZ2VzLi4uIChPbmx5IDMyLWJpdCBQVk9JRHMsIHNvIGp1c3QgCisJICAvLyBsb2FkIGxvd2VyIDMyIGJpdHMpCisJICAvLyBOT1RFOiB0aGUgTGVuIGZpZWxkIG11c3QgYmUgJzAnIGlmIHRoaXMgaXMgdGhlIGZpcnN0IEV4dC4gUy9HCisJICAvLyBwb2ludGVyIGluIFNFU1QsIGFuZCBub3QgMCBvdGhlcndpc2UgKHdlIGtub3cgdGhpc2xlbiAhPSAwKS4KKworCSAgKmFsUGFpciA9IChhbFBhaXIgIT0gU0VTVGFsUGFpclN0YXJ0KSA/IHRoaXNsZW4gOiAwOworCisjCSAgaWZkZWYgREJHX1NFU1RfU0dMSVNUCisgICAgICAgIAlwcmludGsoIlBhaXJDb3VudCAlZCBAJXAgZXZlbiAlWGgsICIsIAorCQkJUGFpckNvdW50LCBhbFBhaXIsICphbFBhaXIpOworIwkgIGVuZGlmCisKKwkgIC8vIFNhdmUgdGhlIHBsYWNlIHdoZXJlIHdlIG5lZWQgdG8gc3RvcmUgdGhlIHBoeXNpY2FsCisJICAvLyBhZGRyZXNzIG9mIHRoaXMgc2NhdHRlciBnYXRoZXIgcGFnZSB3aGljaCB3ZSBnZXQgd2hlbiB3ZSBtYXAgaXQKKwkgIC8vIChhbmQgbWFwcGluZyB3ZSBjYW4gZG8gb25seSBhZnRlciB3ZSBmaWxsIGl0IGluLikKKwkgIGFsUGFpcisrOyAgLy8gbmV4dCBEV09SRCwgd2lsbCBjb250YWluIHBoeXMgYWRkciBvZiB0aGUgZXh0IHBhZ2UKKwkgIGV4dF9zZ19wYWdlX3BoeXNfYWRkcl9wbGFjZSA9IGFsUGFpcjsKKworCSAgLy8gTm93LCBzZXQgYWxQYWlyID0gdGhlIHZpcnR1YWwgYWRkciBvZiB0aGUgKEV4dGVuZGVkKSBTL0cgcGFnZQorCSAgLy8gd2hpY2ggd2lsbCBhY2NlcHQgdGhlIExlbi8gUGh5c2ljYWxBZGRyZXNzIHBhaXJzCisJICBhbFBhaXIgPSAoVUxPTkcgKikgdWxCdWZmOworCisJICBBbGxvY2F0ZWRQYWdlcysrOworCSAgaWYgKEFsbG9jYXRlZFBhZ2VzID49IGFwX2hpX3dhdGVyKQorCSAgeworCQkvLyBUaGlzIG1lc3NhZ2Ugc2hvdWxkIHJhcmVseSwgaWYgZXZlciwgY29tZSBvdXQuCisJCS8vIFByZXZpb3VzbHkgKGNwcWZjIHZlcnNpb24gPD0gMi4wLjUpIHRoZSBkcml2ZXIgd291bGQKKwkJLy8ganVzdCBwdWtlIGlmIG1vcmUgdGhhbiA0IFNHIHBhZ2VzIHdlcmUgdXNlZCwgYW5kIG5vYm9keQorCQkvLyBldmVyIGNvbXBsYWluZWQgYWJvdXQgdGhhdC4gIFRoaXMgb25seSBjb21lcyBvdXQgaWYgCisJCS8vIG1vcmUgdGhhbiA4IHBhZ2VzIGFyZSB1c2VkLgorCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJImNwcWZjOiBQb3NzaWJsZSBkYW5nZXIuICAlZCBzY2F0dGVyIGdhdGhlciBwYWdlcyB1c2VkLlxuIgorCQkJImNwcWZjOiBkZXRlY3RlZCBzZWVtaW5nbHkgZXh0cmVtZSBtZW1vcnkgIgorCQkJImZyYWdtZW50YXRpb24gb3IgaHVnZSBkYXRhIHRyYW5zZmVycy5cbiIsIAorCQkJQWxsb2NhdGVkUGFnZXMpOworCQlhcF9oaV93YXRlciA9IEFsbG9jYXRlZFBhZ2VzKzE7CisJICB9CisJCQorCSAgUGFpckNvdW50ID0gMTsgIC8vIHN0YXJ0aW5nIG5ldyBFeHQuIFMvRyBwYWdlCisJICBwcmV2X3BhZ2UgPSAoKnNncGFnZSk7ICAvLyByZW1lbWJlciB0aGlzIHBhZ2UsIGZvciBuZXh0IHRpbWUgdGhydQorCSAgc2dwYWdlID0gJigoKnNncGFnZSktPm5leHQpOworCX0gIC8vIGVuZCBvZiBuZXcgVEwgRXh0LiBTL0cgcGFnZSBhbGxvY2F0aW9uCisKKwkqYWxQYWlyID0gdGhpc2xlbjsgLy8gYml0cyAxOC0wLCBsZW5ndGggKHJhbmdlIGNoZWNrIGFib3ZlKQorICAgICAgCisjCWlmZGVmIERCR19TRVNUX1NHTElTVAorCSAgcHJpbnRrKCJQYWlyQ291bnQgJWQgQCVwLCBldmVuICVYaCwgIiwgUGFpckNvdW50LCBhbFBhaXIsICphbFBhaXIpOworIwllbmRpZgorCisJYWxQYWlyKys7ICAgIC8vIG5leHQgRFdPUkQsIHBoeXNpY2FsIGFkZHJlc3MgCisKKwlpZiAoIFdFX0hBVkVfU0dfTElTVCApIAorCQl1bEJ1ZmYgPSBzZ19kbWFfYWRkcmVzcyhzZ2wpICsgb2Zmc2V0OworCWVsc2UKKwkJdWxCdWZmID0gY29udGlnYWRkciArIG9mZnNldDsKKwlvZmZzZXQgKz0gdGhpc2xlbjsKKworIwlpZiBCSVRTX1BFUl9MT05HID4gMzIKKyAgICAgICAgICBpZiggdWxCdWZmID4+MzIgKQorCSAgeworCSAgICBwcmludGsoImNxcGZjVFM6IDFUYWNoIERNQSBhZGRyZXNzICVwID4gMzIgYml0c1xuIiwgKHZvaWQqKXVsQnVmZiApOworCSAgICBwcmludGsoIiVzID0gJXAsIG9mZnNldCA9ICVsZFxuIiwgCisJCVdFX0hBVkVfU0dfTElTVCA/ICJ1bEJ1ZmYiIDogImNvbnRpZ2FkZHIiLAorCQlXRV9IQVZFX1NHX0xJU1QgPyAodm9pZCAqKSB1bEJ1ZmYgOiAodm9pZCAqKSBjb250aWdhZGRyLAorCQkJb2Zmc2V0KTsKKwkgICAgcmV0dXJuIDA7CisJICB9CisjCWVuZGlmCisKKwkqYWxQYWlyID0gKFVMT05HKSB1bEJ1ZmY7IC8vIGxvd2VyIDMyIGJpdHMgKDMxLTApCisKKyMgICAgICAgaWZkZWYgREJHX1NFU1RfU0dMSVNUCisgICAgICAgIHByaW50aygib2RkICVYaFxuIiwgKmFsUGFpcik7CisjICAgICAgIGVuZGlmCisJYWxQYWlyKys7ICAgIC8vIG5leHQgRFdPUkQsIG5leHQgYWRkcmVzcy9sZW5ndGggcGFpcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCVBhaXJDb3VudCsrOyAvLyBuZXh0IExlbmd0aC9BZGRyZXNzIHBhaXIKKworCS8vIGlmIChQYWlyQ291bnQgPiBwY19oaV93YXRlcikKKwkvLyB7CisJCS8vIHByaW50aygicGMgaGkgPSAlZCAiLCBQYWlyQ291bnQpOworCQkvLyBwY19oaV93YXRlciA9IFBhaXJDb3VudDsKKwkvLyB9CisJYnl0ZXNfdG9fZ28gLT0gdGhpc2xlbjsKKwl0b3RhbF9kYXRhX2xlbiArPSB0aGlzbGVuOyAgCisJdGhpc01hcHBpbmdMZW4gLT0gdGhpc2xlbjsKKwl0b3RhbHNncysrOworICAgICAgfSAvLyB3aGlsZSAodGhpc01hcHBpbmdMZW4gPiAwKQorICAgICAgaWYgKCBXRV9IQVZFX1NHX0xJU1QgKSBzZ2wrKzsgIC8vIG5leHQgUy9HIHBhaXIKKyAgICB9IC8vIHdoaWxlIChieXRlc190b19nbykKKworICAgIC8vIHByaW50aygiVG90YWxzZ3M9JWRcbiIsIHRvdGFsc2dzKTsKKyAgICAqc2dQYWlycyA9IHRvdGFsc2dzOworCisgICAgLy8gUENJIG1hcCAoYW5kIGJvdW5jZSkgdGhlIGxhc3QgKGFuZCB1c3VhbGx5IG9ubHkpIGV4dGVuZGVkIFNHIHBhZ2UKKyAgICBidXNhZGRyID0gY3BxZmNfcGNpX21hcF9zZ19wYWdlKHBjaWRldiwKKwkJZXh0X3NnX3BhZ2VfcGh5c19hZGRyX3BsYWNlLAorCQlwcmV2X3BhZ2UtPnBhZ2UsIAorCQkmcHJldl9wYWdlLT5idXNhZGRyLCAKKwkJJnByZXZfcGFnZS0+bWFwbGVuLAorCQlQYWlyQ291bnQpOworICB9CisgIHJldHVybiB0b3RhbF9kYXRhX2xlbjsKK30KKworCisKKy8vIFRoZSBUYWNobGl0ZSBTRVNUIHRhYmxlIGlzIHJlZmVyZW5jZWQgdG8gT1hfSUQgKG9yIFJYX0lEKS4gIFRvIG9wdGltaXplCisvLyBwZXJmb3JtYW5jZSBhbmQgZGVidWdnYWJpbGl0eSwgd2UgaW5kZXggdGhlIEV4Y2hhbmdlIHN0cnVjdHVyZSB0byBGQyBYX0lECisvLyBUaGlzIGVuYWJsZXMgdXMgdG8gYnVpbGQgZXhjaGFuZ2VzIGZvciBsYXRlciBlbi1xdWVpbmcgdG8gVGFjaHlvbiwKKy8vIHByb3ZpZGVkIHdlIGhhdmUgYW4gb3BlbiBYX0lEIHNsb3QuIEF0IFRhY2h5b24gcXVlaW5nIHRpbWUsIHdlIG9ubHkgCisvLyBuZWVkIGFuIEVSUSBzbG90OyB0aGVuICJmaXgtdXAiIHJlZmVyZW5jZXMgaW4gdGhlIAorLy8gSVJCLCBGQ0hTLCBldGMuIGFzIG5lZWRlZC4KKy8vIFJFVFVSTlM6CisvLyAwIGlmIHN1Y2Nlc3NmdWwKKy8vIG5vbi16ZXJvIG9uIGVycm9yCisvL3NzdGFydGV4CitVTE9ORyBjcHFmY1RTU3RhcnRFeGNoYW5nZSggCisgIENQUUZDSEJBICpjcHFmY0hCQWRhdGEsICAgICAgICAgICAgICAgICAgICAgIAorICBMT05HIEV4Y2hhbmdlSUQgKQoreworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisgIEZDX0VYQ0hBTkdFUyAqRXhjaGFuZ2VzID0gZmNDaGlwLT5FeGNoYW5nZXM7CisgIEZDX0VYQ0hBTkdFICpwRXhjaGFuZ2UgPSAmRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyBFeGNoYW5nZUlEIF07IC8vIHNob3J0aGFuZAorICBVU0hPUlQgcHJvZHVjZXIsIGNvbnN1bWVyOworICBVTE9ORyB1bFN0YXR1cz0wOworICBzaG9ydCBpbnQgRXJxSW5kZXg7CisgIEJPT0xFQU4gQ29tcGxldGVFeGNoYW5nZSA9IEZBTFNFOyAgLy8gZS5nLiBBQ0MgcmVwbGllcyBhcmUgY29tcGxldGUKKyAgQk9PTEVBTiBTZXN0VHlwZT1GQUxTRTsKKyAgVUxPTkcgSW5ib3VuZERhdGE9MDsKKworICAvLyBXZSB3aWxsIG1hbmlwdWxhdGUgVGFjaGxpdGUgY2hpcCByZWdpc3RlcnMgaGVyZSB0byBzdWNjZXNzZnVsbHkKKyAgLy8gc3RhcnQgZXhjaGFuZ2VzLiAKKworICAvLyBDaGVjayB0aGF0IGxpbmsgaXMgbm90IGRvd24gLS0gd2UgY2FuJ3Qgc3RhcnQgYW4gZXhjaGFuZ2Ugb24gYQorICAvLyBkb3duIGxpbmshCisKKyAgaWYoIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLnZhbHVlICYgMHg4MCkgLy8gTFBTTSBvZmZsaW5lPworICB7CitwcmludGsoImZjU3RhcnRFeGNoYW5nZTogUFNNIG9mZmxpbmUgKCVYaCksIHhfSUQgJVhoLCB0eXBlICVYaCwgcG9ydF9pZCAlWGhcbiIsCisgICAgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZSAmIDB4RkYsCisgICAgICAgICBFeGNoYW5nZUlELAorICAgICAgICAgcEV4Y2hhbmdlLT50eXBlLAorICAgICAgICAgcEV4Y2hhbmdlLT5mY2hzLmRfaWQpOworCisgICAgaWYoIEV4Y2hhbmdlSUQgPj0gVEFDSF9TRVNUX0xFTiApICAvLyBMaW5rIFNlcnZpY2UgT3V0Ym91bmQgZnJhbWU/CisgICAgeworICAgICAgLy8gT3VyIG1vc3QgcG9wdWxhciBMaW5rU2VydmljZSBjb21tYW5kcyBhcmUgcG9ydCBkaXNjb3ZlcnkgdHlwZXMKKyAgICAgIC8vIChQTE9HSS8gUERJU0MuLi4pLCB3aGljaCBhcmUgaW1wbGljaXRseSBudWxsaWZpZWQgYnkgTGluayBEb3duCisgICAgICAvLyBldmVudHMsIHNvIGl0IG1ha2VzIG5vIHNlbnNlIHRvIFF1ZSB0aGVtLiAgSG93ZXZlciwgQUJUUyBzaG91bGQKKyAgICAgIC8vIGJlIHF1ZXVlZCwgc2luY2UgZXhjaGFuZ2Ugc2VxdWVuY2VzIGFyZSBsaWtlbHkgZGVzdHJveWVkIGJ5CisgICAgICAvLyBMaW5rIERvd24gZXZlbnRzLCBhbmQgd2Ugd2FudCB0byBub3RpZnkgb3RoZXIgcG9ydHMgb2YgYnJva2VuCisgICAgICAvLyBzZXF1ZW5jZXMgYnkgYWJvcnRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgZXhjaGFuZ2VzLgorICAgICAgaWYoIHBFeGNoYW5nZS0+dHlwZSAhPSBCTFNfQUJUUyApCisgICAgICB7CisJdWxTdGF0dXMgPSBMTktEV05fT1NMUzsKKwlnb3RvIERvbmU7CisgICAgICAgIC8vIGRvbid0IFF1ZSBtb3N0IExpbmtTZXJ2IGV4Y2hhbmdlcyBvbiBMSU5LIERPV04KKyAgICAgIH0KKyAgICB9CisKKyAgICBwcmludGsoImZjU3RhcnRFeGNoYW5nZTogUXVlIHhfSUQgJVhoLCB0eXBlICVYaFxuIiwgCisgICAgICBFeGNoYW5nZUlELCBwRXhjaGFuZ2UtPnR5cGUpOworICAgIHBFeGNoYW5nZS0+c3RhdHVzIHw9IEVYQ0hBTkdFX1FVRVVFRDsKKyAgICB1bFN0YXR1cyA9IEVYQ0hBTkdFX1FVRVVFRDsKKyAgICBnb3RvIERvbmU7CisgIH0KKworICAvLyBNYWtlIHN1cmUgRVJRIGhhcyBhdmFpbGFibGUgc3BhY2UuCisgIAorICBwcm9kdWNlciA9IChVU0hPUlQpZmNDaGlwLT5FUlEtPnByb2R1Y2VySW5kZXg7IC8vIGNvcGllcyBmb3IgbG9naWNhbCBhcml0aC4KKyAgY29uc3VtZXIgPSAoVVNIT1JUKWZjQ2hpcC0+RVJRLT5jb25zdW1lckluZGV4OworICBwcm9kdWNlcisrOyAgLy8gV2UgYXJlIHRlc3RpbmcgZm9yIGZ1bGwgcXVlIGJ5IGluY3JlbWVudGluZworICAKKyAgaWYoIHByb2R1Y2VyID49IEVSUV9MRU4gKSAgLy8gcm9sbG92ZXIgY29uZGl0aW9uPworICAgIHByb2R1Y2VyID0gMDsKKyAgaWYoIGNvbnN1bWVyICE9IHByb2R1Y2VyICkgLy8gRVJRIG5vdCBmdWxsPworICB7CisgICAgLy8gKioqKioqKioqKioqKioqKioqIE5lZWQgQXRvbWljIGFjY2VzcyB0byBjaGlwIHJlZ2lzdGVycyEhKioqKioqKioKKyAgICAKKyAgICAvLyByZW1lbWJlciBFUlEgUEkgZm9yIGNvcHlpbmcgSVJCCisgICAgRXJxSW5kZXggPSAoVVNIT1JUKWZjQ2hpcC0+RVJRLT5wcm9kdWNlckluZGV4OyAKKyAgICBmY0NoaXAtPkVSUS0+cHJvZHVjZXJJbmRleCA9IHByb2R1Y2VyOyAvLyB0aGlzIGlzIHdyaXR0ZW4gdG8gVGFjaHlvbgorICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhbiBFUlEgc2xvdCEgSWYgU0NTSSBjb21tYW5kLCBuZWVkIFNFU1Qgc2xvdAorICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIGFyZSBkb25lLgorCisgICAgLy8gTm90ZSB0aGF0IFRhY2h5b24gcmVxdWlyZXMgdGhhdCBiaXQgMTUgb2YgdGhlIE9YX0lEIG9yIFJYX0lEIGJlCisgICAgLy8gc2V0IGFjY29yZGluZyB0byBkaXJlY3Rpb24gb2YgZGF0YSB0by9mcm9tIFRhY2h5b24gZm9yIFNFU1QgYXNzaXN0cy4KKyAgICAvLyBGb3IgY29uc2lzdGVuY3ksIGVuZm9yY2UgdGhpcyBydWxlIGZvciBMaW5rIFNlcnZpY2UgKG5vbi1TRVNUKQorICAgIC8vIGV4Y2hhbmdlcyBhcyB3ZWxsLgorCisgICAgLy8gZml4LXVwIHRoZSBYX0lEIGZpZWxkIGluIElSQgorICAgIHBFeGNoYW5nZS0+SVJCLlJlcV9BX1RyYW5zX0lEID0gRXhjaGFuZ2VJRCAmIDB4N0ZGRjsgLy8gMTUtYml0IGZpZWxkCisKKyAgICAvLyBmaXgtdXAgdGhlIFhfSUQgZmllbGQgaW4gZmNocyAtLSBkZXBlbmRzIG9uIE9yaWdpbmF0b3Igb3IgUmVzcG9uZGVyLAorICAgIC8vIG91dGdvaW5nIG9yIGluY29taW5nIGRhdGE/CisgICAgc3dpdGNoKCBwRXhjaGFuZ2UtPnR5cGUgKQorICAgIHsKKyAgICAgICAgICAgICAgIC8vIE9SSUdJTkFUT1IgdHlwZXMuLi4gIHdlJ3JlIHNldHRpbmcgb3VyIE9YX0lEIGFuZAorICAgICAgICAgICAgICAgLy8gZGVmYXVsdGluZyB0aGUgcmVzcG9uZGVyJ3MgUlhfSUQgdG8gMHhGRkZGCisgICAgCisgICAgY2FzZSBTQ1NJX0lSRToKKyAgICAgIC8vIFJlcXVpcmVtZW50OiBzZXQgTVNCIG9mIHhfSUQgZm9yIEluY29taW5nIFRMIGRhdGEKKyAgICAgIC8vIChzZWUgIlRhY2h5b24gVEwvVFMgVXNlcidzIE1hbnVhbCIsIFJldiA2LjAsIFNlcHQuJzk4LCBwZy4gNTApCisgICAgICBJbmJvdW5kRGF0YSA9IDB4ODAwMDsKKworICAgIGNhc2UgU0NTSV9JV0U6ICAgCisgICAgICBTZXN0VHlwZSA9IFRSVUU7CisgICAgICBwRXhjaGFuZ2UtPmZjaHMub3hfcnhfaWQgPSAoRXhjaGFuZ2VJRCB8IEluYm91bmREYXRhKTsKKyAgICAgIHBFeGNoYW5nZS0+ZmNocy5veF9yeF9pZCA8PD0gMTY7ICAgICAvLyBNU1cgc2hpZnQKKyAgICAgIHBFeGNoYW5nZS0+ZmNocy5veF9yeF9pZCB8PSAweGZmZmY7ICAvLyBhZGQgZGVmYXVsdCBSWF9JRAorICAgICAgCisgICAgICAvLyBub3cgZml4LXVwIHRoZSBEYXRhIEhEUiBPWF9JRCAoVEwgYXV0b21hdGljYWxseSBkb2VzIHJ4X2lkKQorICAgICAgLy8gKG5vdCBuZWNlc3NhcnkgZm9yIElSRSAtLSBkYXRhIGJ1ZmZlciB1bnVzZWQpCisgICAgICBpZiggcEV4Y2hhbmdlLT50eXBlID09IFNDU0lfSVdFKQorICAgICAgeworICAgICAgICBmY0NoaXAtPlNFU1QtPkRhdGFIRFJbIEV4Y2hhbmdlSUQgXS5veF9yeF9pZCA9IAorICAgICAgICAgIHBFeGNoYW5nZS0+ZmNocy5veF9yeF9pZDsKKworICAgICAgfQorCisgICAgICBicmVhazsKKworCisgICAgY2FzZSBGQ1NfTlNSOiAgLy8gZXh0LiBsaW5rIHNlcnZpY2UgTmFtZSBTZXJ2aWNlIFJlcXVlc3QKKyAgICBjYXNlIEVMU19TQ1I6ICAvLyBleHQuIGxpbmsgc2VydmljZSBTdGF0ZSBDaGFuZ2UgUmVnaXN0cmF0aW9uCisgICAgY2FzZSBFTFNfRkRJU0M6Ly8gZXh0LiBsaW5rIHNlcnZpY2UgbG9naW4KKyAgICBjYXNlIEVMU19GTE9HSTovLyBleHQuIGxpbmsgc2VydmljZSBsb2dpbgorICAgIGNhc2UgRUxTX0xPR086IC8vIEZDLVBIIGV4dGVuZGVkIGxpbmsgc2VydmljZSBsb2dvdXQKKyAgICBjYXNlIEJMU19OT1A6ICAvLyBCYXNpYyBsaW5rIHNlcnZpY2UgTm8gT1BlcmF0aW9uCisgICAgY2FzZSBFTFNfUExPR0k6Ly8gZXh0LiBsaW5rIHNlcnZpY2UgbG9naW4gKFBMT0dJKQorICAgIGNhc2UgRUxTX1BESVNDOi8vIGV4dC4gbGluayBzZXJ2aWNlIGxvZ2luIChQRElTQykKKyAgICBjYXNlIEVMU19QUkxJOiAvLyBleHQuIGxpbmsgc2VydmljZSBwcm9jZXNzIGxvZ2luCisKKyAgICAgIHBFeGNoYW5nZS0+ZmNocy5veF9yeF9pZCA9IEV4Y2hhbmdlSUQ7CisgICAgICBwRXhjaGFuZ2UtPmZjaHMub3hfcnhfaWQgPDw9IDE2OyAgLy8gTVNXIHNoaWZ0CisgICAgICBwRXhjaGFuZ2UtPmZjaHMub3hfcnhfaWQgfD0gMHhmZmZmOyAgLy8gYW5kIFJYX0lECisKKyAgICAgIGJyZWFrOworICAgICAgCisKKworCisgICAgICAgICAgICAgICAvLyBSRVNQT05ERVIgdHlwZXMuLi4gd2UgbXVzdCBzZXQgb3VyIFJYX0lEIHdoaWxlIHByZXNlcnZpbmcKKyAgICAgICAgICAgICAgIC8vIHNlbmRlcidzIE9YX0lECisgICAgICAgICAgICAgICAvLyBvdXRnb2luZyAob3Igbm8pIGRhdGEKKyAgICBjYXNlIEVMU19SSlQ6ICAgICAgIC8vIGV4dGVuZGVkIGxpbmsgc2VydmljZSByZWplY3QgCisgICAgY2FzZSBFTFNfTE9HT19BQ0M6IC8vIEZDLVBIIGV4dGVuZGVkIGxpbmsgc2VydmljZSBsb2dvdXQgYWNjZXB0CisgICAgY2FzZSBFTFNfQUNDOiAgICAgIC8vIGV4dC4gZ2VuZXJpYyBsaW5rIHNlcnZpY2UgYWNjZXB0CisgICAgY2FzZSBFTFNfUExPR0lfQUNDOi8vIGV4dC4gbGluayBzZXJ2aWNlIGxvZ2luIGFjY2VwdCAoUExPR0kgb3IgUERJU0MpCisgICAgY2FzZSBFTFNfUFJMSV9BQ0M6IC8vIGV4dC4gbGluayBzZXJ2aWNlIHByb2Nlc3MgbG9naW4gYWNjZXB0CisKKyAgICAgIENvbXBsZXRlRXhjaGFuZ2UgPSBUUlVFOyAgIC8vIFJlcGx5IChBQ0Mgb3IgUkpUKSBpcyBlbmQgb2YgZXhjaGFuZ2UKKyAgICAgIHBFeGNoYW5nZS0+ZmNocy5veF9yeF9pZCB8PSAoRXhjaGFuZ2VJRCAmIDB4RkZGRik7CisKKyAgICAgIGJyZWFrOworCisKKyAgICAgIC8vIHNpbmNlIHdlIGFyZSBhIFJlc3BvbmRlciwgT1hfSUQgc2hvdWxkIGFscmVhZHkgYmUgc2V0IGJ5CisgICAgICAvLyBjcHFmY1RTQnVpbGRFeGNoYW5nZSgpLiAgV2UgbmVlZCB0byAtT1ItIGluIFJYX0lECisgICAgY2FzZSBTQ1NJX1RXRToKKyAgICAgIFNlc3RUeXBlID0gVFJVRTsKKyAgICAgIC8vIFJlcXVpcmVtZW50OiBzZXQgTVNCIG9mIHhfSUQgZm9yIEluY29taW5nIFRMIGRhdGEKKyAgICAgIC8vIChzZWUgIlRhY2h5b24gVEwvVFMgVXNlcidzIE1hbnVhbCIsIFJldiA2LjAsIFNlcHQuJzk4LCBwZy4gNTApCisKKyAgICAgIHBFeGNoYW5nZS0+ZmNocy5veF9yeF9pZCAmPSAweEZGRkYwMDAwOyAgLy8gY2xlYXIgUlhfSUQKKyAgICAgIC8vIFJlcXVpcmVtZW50OiBzZXQgTVNCIG9mIFJYX0lEIGZvciBJbmNvbWluZyBUTCBkYXRhCisgICAgICAvLyAoc2VlICJUYWNoeW9uIFRML1RTIFVzZXIncyBNYW51YWwiLCBSZXYgNi4wLCBTZXB0Lic5OCwgcGcuIDUwKQorICAgICAgcEV4Y2hhbmdlLT5mY2hzLm94X3J4X2lkIHw9IChFeGNoYW5nZUlEIHwgMHg4MDAwKTsKKyAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgIAorICAgIGNhc2UgU0NTSV9UUkU6CisgICAgICBTZXN0VHlwZSA9IFRSVUU7CisgICAgICAKKyAgICAgIC8vIHRoZXJlIGlzIG5vIFhSRFkgZm9yIFNFU1QgdGFyZ2V0IHJlYWQ7IHRoZSBkYXRhCisgICAgICAvLyBoZWFkZXIgbmVlZHMgdG8gYmUgdXBkYXRlZC4gQWxzbyB1cGRhdGUgdGhlIFJTUAorICAgICAgLy8gZXhjaGFuZ2UgSURzIGZvciB0aGUgc3RhdHVzIGZyYW1lLCBpbiBjYXNlIGl0IGlzIHNlbnQgYXV0b21hdGljYWxseQorICAgICAgZmNDaGlwLT5TRVNULT5EYXRhSERSWyBFeGNoYW5nZUlEIF0ub3hfcnhfaWQgfD0gRXhjaGFuZ2VJRDsKKyAgICAgIGZjQ2hpcC0+U0VTVC0+UnNwSERSWyBFeGNoYW5nZUlEIF0ub3hfcnhfaWQgPSAKKyAgICAgICAgZmNDaGlwLT5TRVNULT5EYXRhSERSWyBFeGNoYW5nZUlEIF0ub3hfcnhfaWQ7CisgICAgICAKKyAgICAgIC8vIGZvciBlYXNpZXIgRkNQIHJlc3BvbnNlIGxvZ2ljICh3b3JrcyBmb3IgVFdFIGFuZCBUUkUpLCAKKyAgICAgIC8vIGNvcHkgZXhjaGFuZ2UgSURzLiAgKE5vdCBuZWVkZWQgaWYgVFJFICdSU1AnIGJpdCBzZXQpCisgICAgICBwRXhjaGFuZ2UtPmZjaHMub3hfcnhfaWQgPQorICAgICAgICBmY0NoaXAtPlNFU1QtPkRhdGFIRFJbIEV4Y2hhbmdlSUQgXS5veF9yeF9pZDsKKworICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgRkNQX1JFU1BPTlNFOiAgLy8gdXNpbmcgZXhpc3RpbmcgT1hfSUQvIFJYX0lEIHBhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBTRlMgRkNQLVJFU1BPTlNFIGZyYW1lCisgICAgICAvLyBPWC9SWF9JRCBzaG91bGQgYWxyZWFkeSBiZSBzZXQhIChTZWUgImZjQnVpbGQiIGFib3ZlKQorICAgICAgQ29tcGxldGVFeGNoYW5nZSA9IFRSVUU7ICAgLy8gUlNQIGlzIGVuZCBvZiBGQ1AtU0NTSSBleGNoYW5nZQorCisgICAgICAKKyAgICAgIGJyZWFrOworCisKKyAgICBjYXNlIEJMU19BQlRTX1JKVDogIC8vIHVzZXMgbmV3IFJYX0lELCBzaW5jZSBTRVNUIHhfSUQgbm9uLWV4aXN0ZW50CisgICAgY2FzZSBCTFNfQUJUU19BQ0M6ICAvLyB1c2luZyBleGlzdGluZyBPWF9JRC8gUlhfSUQgcGFpciBmcm9tIFNFU1QgZW50cnkKKyAgICAgIENvbXBsZXRlRXhjaGFuZ2UgPSBUUlVFOyAgIC8vIEFDQyBvciBSSlQgbWFya3MgZW5kIG9mIEZDUC1TQ1NJIGV4Y2hhbmdlCisgICAgY2FzZSBCTFNfQUJUUzogIC8vIHVzaW5nIGV4aXN0aW5nIE9YX0lELyBSWF9JRCBwYWlyIGZyb20gU0VTVCBlbnRyeQorCisKKyAgICAgIGJyZWFrOworCisKKyAgICBkZWZhdWx0OgorICAgICAgcHJpbnRrKCJFcnJvciBvbiBmY1N0YXJ0RXhjaGFuZ2U6IHVuZGVmaW5lZCB0eXBlICVYaCglZClcbiIsCisgICAgICAgIHBFeGNoYW5nZS0+dHlwZSwgcEV4Y2hhbmdlLT50eXBlKTsKKyAgICAgIHJldHVybiBJTlZBTElEX0FSR1M7CisgICAgfQorICAgIAorICAgIAorICAgICAgLy8gWF9JRCBmaWVsZHMgYXJlIGVudGVyZWQgLS0gY29weSBJUkIgdG8gVGFjaHlvbidzIEVSUQorICAgIAorCisgICAgbWVtY3B5KAorICAgICAgICAmZmNDaGlwLT5FUlEtPlFFbnRyeVsgRXJxSW5kZXggXSwgIC8vIGRlc3QuCisgICAgICAgICZwRXhjaGFuZ2UtPklSQiwKKyAgICAgICAgMzIpOyAgLy8gZml4ZWQgKGhhcmR3YXJlKSBsZW5ndGghCisKKyAgICBQQ0lfVFJBQ0VPKCBFeGNoYW5nZUlELCAweEEwKQorCisgICAgLy8gQUNUSU9OISAgTWF5IGdlbmVyYXRlIElOVCBhbmQgSU1RIGVudHJ5CisgICAgd3JpdGVsKCBmY0NoaXAtPkVSUS0+cHJvZHVjZXJJbmRleCwKKyAgICAgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5FUlFwcm9kdWNlckluZGV4LmFkZHJlc3MpOworCisgIAorICAgIGlmKCBFeGNoYW5nZUlEID49IFRBQ0hfU0VTVF9MRU4gKSAgLy8gTGluayBTZXJ2aWNlIE91dGJvdW5kIGZyYW1lPworICAgIHsKKyAgICAKKyAgICAgIC8vIHdhaXQgZm9yIGNvbXBsZXRpb24hIChUREIgLS0gdGltZW91dCBhbmQgY2hpcCByZXNldCkKKyAgICAgIAorCisgIFBDSV9UUkFDRU8oIEV4Y2hhbmdlSUQsIDB4QTQpCisgIAorICAgICAgZW5hYmxlX2lycSggY3BxZmNIQkFkYXRhLT5Ib3N0QWRhcHRlci0+aXJxKTsgLy8gb25seSB3YXkgdG8gZ2V0IFNlbS4KKyAgICAgIAorICAgICAgZG93bl9pbnRlcnJ1cHRpYmxlKCBjcHFmY0hCQWRhdGEtPlRZT0Jjb21wbGV0ZSk7IAorICAKKyAgICAgIGRpc2FibGVfaXJxKCBjcHFmY0hCQWRhdGEtPkhvc3RBZGFwdGVyLT5pcnEpOworICBQQ0lfVFJBQ0UoIDB4QTQpCisKKyAgICAgIC8vIE9uIGxvZ2luIGV4Y2hhbmdlcywgQkFEX0FMUEEgKG5vbi1leGlzdGVudCBwb3J0X2lkKSByZXN1bHRzIGluIAorICAgICAgLy8gRlRPIChGcmFtZSBUaW1lIE91dCkgb24gdGhlIE91dGJvdW5kIENvbXBsZXRpb24gbWVzc2FnZS4KKyAgICAgIC8vIElmIHdlIGdvdCBhbiBGVE8gc3RhdHVzLCBjb21wbGV0ZSB0aGUgZXhjaGFuZ2UgKGZyZWUgdXAgc2xvdCkKKyAgICAgIGlmKCBDb21wbGV0ZUV4Y2hhbmdlIHx8ICAgLy8gZmxhZyBmcm9tIFJlcGx5IGZyYW1lcworICAgICAgICAgIHBFeGNoYW5nZS0+c3RhdHVzICkgICAvLyB0eXBpY2FsbHksIGNhbiBnZXQgRlJBTUVfVE8KKyAgICAgIHsKKyAgICAJY3BxZmNUU0NvbXBsZXRlRXhjaGFuZ2UoIGNwcWZjSEJBZGF0YS0+UGNpRGV2LCBmY0NoaXAsIEV4Y2hhbmdlSUQpOyAgCisgICAgICB9CisgICAgfQorCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTRVNUIEV4Y2hhbmdlCisgICAgeworICAgICAgdWxTdGF0dXMgPSAwOyAgIC8vIHNoaXAgJiBwcmF5IHN1Y2Nlc3MgKGUuZy4gRkNQLVNDU0kpCisgICAgICAKKyAgICAgIGlmKCBDb21wbGV0ZUV4Y2hhbmdlICkgICAvLyBieSBUeXBlIG9mIGV4Y2hhbmdlIChlLmcuIGVuZC1vZi14Y2huZykKKyAgICAgIHsKKyAgICAJY3BxZmNUU0NvbXBsZXRlRXhjaGFuZ2UoIGNwcWZjSEJBZGF0YS0+UGNpRGV2LCBmY0NoaXAsIEV4Y2hhbmdlSUQpOyAgCisgICAgICB9CisgICAgICAgCisgICAgICBlbHNlCisgICAgICAgIHBFeGNoYW5nZS0+c3RhdHVzICY9IH5FWENIQU5HRV9RVUVVRUQ7ICAvLyBjbGVhciBFeGNoYW5nZVF1ZXVlZCBmbGFnIAorCisgICAgfQorICB9CisKKyAgCisgIGVsc2UgICAgICAgICAgICAgICAgLy8gRVJRICdwcm9kdWNlcicgPSAnY29uc3VtZXInIGFuZCBRVUUgaXMgZnVsbAorICB7CisgICAgdWxTdGF0dXMgPSBPVVRRVUVfRlVMTDsgLy8gT3V0Ym91bmQgKEVSUSkgUXVlIGZ1bGwKKyAgfQorIAorRG9uZTogCisgIFBDSV9UUkFDRSggMHhBMCkKKyAgcmV0dXJuIHVsU3RhdHVzOyAKK30KKworCisKKworCisvLyBTY2FuIGZjQ29udHJvbGxlci0+ZmNFeGNoYW5nZXMgYXJyYXkgZm9yIGEgdXN1YWJsZSBpbmRleCAoYSAiZnJlZSIKKy8vIGV4Y2hhbmdlKS4KKy8vIElucHV0czoKKy8vICAgZmNDaGlwIC0gcG9pbnRlciB0byBUYWNoTGl0ZSBjaGlwIHN0cnVjdHVyZQorLy8gUmV0dXJuOgorLy8gIGluZGV4IC0gZXhjaGFuZ2UgYXJyYXkgZWxlbWVudCB3aGVyZSBleGNoYW5nZSBjYW4gYmUgYnVpbHQKKy8vICAtMSAgICAtIGV4Y2hhbmdlIGFycmF5IGlzIGZ1bGwKKy8vIFJFTUFSS1M6CisvLyBBbHRob3VnaCB0aGlzIGlzIGEgKHl1ayEpIGxpbmVhciBzZWFyY2gsIHdlIHByZXN1bWUKKy8vIHRoYXQgdGhlIHN5c3RlbSB3aWxsIGNvbXBsZXRlIGV4Y2hhbmdlcyBhYm91dCBhcyBxdWlja2x5IGFzCisvLyB0aGV5IGFyZSBzdWJtaXR0ZWQuICBBIGZ1bGwgRXhjaGFuZ2UgYXJyYXkgKGFuZCBoZW5jZSwgbWF4IGxpbmVhcgorLy8gc2VhcmNoIHRpbWUgZm9yIGZyZWUgZXhjaGFuZ2Ugc2xvdCkgYWxtb3N0IGd1YXJhbnRlZXMgYSBGaWJyZSBwcm9ibGVtIAorLy8gb2Ygc29tZSBzb3J0LgorLy8gSW4gdGhlIGludGVyZXN0IG9mIG1ha2luZyBleGNoYW5nZXMgZWFzaWVyIHRvIGRlYnVnLCB3ZSB3YW50IGEgTFJVCisvLyAoTGVhc3QgUmVjZW50bHkgVXNlZCkgc2NoZW1lLgorCisKK3N0YXRpYyBMT05HIEZpbmRGcmVlRXhjaGFuZ2UoIFBUQUNIWU9OIGZjQ2hpcCwgVUxPTkcgdHlwZSApCit7CisgIEZDX0VYQ0hBTkdFUyAqRXhjaGFuZ2VzID0gZmNDaGlwLT5FeGNoYW5nZXM7CisgIFVMT05HIGk7CisgIFVMT05HIHVsU3RhdHVzPS0xOyAgLy8gYXNzdW1lIGZhaWx1cmUKKworCisgIGlmKCB0eXBlID09IFNDU0lfSVJFIHx8CisgICAgICB0eXBlID09IFNDU0lfVFJFIHx8CisgICAgICB0eXBlID09IFNDU0lfSVdFIHx8CisgICAgICB0eXBlID09IFNDU0lfVFdFKQorICB7CisgICAgICAgIC8vIFNDU0kgdHlwZSAtIFhfSURzIHNob3VsZCBiZSBmcm9tIDAgdG8gVEFDSF9TRVNUX0xFTi0xCisgICAgaWYoIGZjQ2hpcC0+ZmNTZXN0RXhjaGFuZ2VMUlUgPj0gVEFDSF9TRVNUX0xFTikgLy8gcm9sbG92ZXI/CisgICAgICBmY0NoaXAtPmZjU2VzdEV4Y2hhbmdlTFJVID0gMDsKKyAgICBpID0gZmNDaGlwLT5mY1Nlc3RFeGNoYW5nZUxSVTsgLy8gdHlwaWNhbGx5IGl0J3MgYWxyZWFkeSBmcmVlIQorCisgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS50eXBlID09IDAgKSAvLyBjaGVjayBmb3IgImZyZWUiIGVsZW1lbnQKKyAgICB7CisgICAgICB1bFN0YXR1cyA9IDA7IC8vIHN1Y2Nlc3MhCisgICAgfQorICAgIAorICAgIGVsc2UKKyAgICB7ICAgICAgICAgLy8gWVVLISB3ZSBuZWVkIHRvIGRvIGEgbGluZWFyIHNlYXJjaCBmb3IgZnJlZSBlbGVtZW50LgorICAgICAgICAgICAgICAvLyBGcmFnbWVudGF0aW9uIG9mIHRoZSBmY0V4Y2hhbmdlIGFycmF5IGlzIGR1ZSB0byBleGNlc3NpdmVseQorICAgICAgICAgICAgICAvLyBsb25nIGNvbXBsZXRpb25zIG9yIHRpbWVvdXRzLgorICAgICAgCisgICAgICB3aGlsZSggVFJVRSApCisgICAgICB7CisgICAgICAgIGlmKCArK2kgPj0gVEFDSF9TRVNUX0xFTiApIC8vIHJvbGxvdmVyIGNoZWNrCisgICAgICAgICAgaSA9IDA7ICAvLyBiZWdpbm5pbmcgb2YgU0VTVCBYX0lEcworCisvLyAgICAgICAgcHJpbnRrKCAibG9vcGluZyBmb3IgU0NTSSB4Y2huZyBJRDogaT0lZCwgdHlwZT0lWGhcbiIsIAorLy8gICAgICAgICBpLCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbaV0udHlwZSk7CisKKyAgICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS50eXBlID09IDAgKSAvLyAiZnJlZSI/CisgICAgICAgIHsKKyAgICAgICAgICB1bFN0YXR1cyA9IDA7IC8vIHN1Y2Nlc3MhCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGkgPT0gZmNDaGlwLT5mY1Nlc3RFeGNoYW5nZUxSVSApIC8vIHdyYXBwZWQtYXJvdW5kIGFycmF5PworICAgICAgICB7CisgICAgICAgICAgcHJpbnRrKCAiU0VTVCBYX0lEIHNwYWNlIGZ1bGxcbiIpOworICAgICAgICAgIGJyZWFrOyAgICAgICAvLyBmYWlsZWQgLSBwcmV2ZW50IGluZi4gbG9vcAorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGZjQ2hpcC0+ZmNTZXN0RXhjaGFuZ2VMUlUgPSBpICsgMTsgLy8gbmV4dCEgKHJvbGxvdmVyIGNoZWNrIG5leHQgcGFzcykKKyAgfQorCisgIAorICAKKyAgZWxzZSAgLy8gTGluayBTZXJ2aWNlIHR5cGUgLSBYX0lEcyBzaG91bGQgYmUgZnJvbSBUQUNIX1NFU1RfTEVOIAorICAgICAgICAvLyB0byBUQUNIX01BWF9YSUQKKyAgeworICAgIGlmKCBmY0NoaXAtPmZjTHNFeGNoYW5nZUxSVSA+PSBUQUNIX01BWF9YSUQgfHwgLy8gcmFuZ2UgY2hlY2sKKyAgICAgICAgZmNDaGlwLT5mY0xzRXhjaGFuZ2VMUlUgPCBUQUNIX1NFU1RfTEVOICkgLy8gKGUuZy4gc3RhcnR1cCkKKyAgICAgIGZjQ2hpcC0+ZmNMc0V4Y2hhbmdlTFJVID0gVEFDSF9TRVNUX0xFTjsKKworICAgIGkgPSBmY0NoaXAtPmZjTHNFeGNoYW5nZUxSVTsgLy8gdHlwaWNhbGx5IGl0J3MgYWxyZWFkeSBmcmVlIQorICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbaV0udHlwZSA9PSAwICkgLy8gY2hlY2sgZm9yICJmcmVlIiBlbGVtZW50CisgICAgeworICAgICAgdWxTdGF0dXMgPSAwOyAvLyBzdWNjZXNzIQorICAgIH0KKyAgICAKKyAgICBlbHNlCisgICAgeyAgICAgICAgIC8vIFlVSyEgd2UgbmVlZCB0byBkbyBhIGxpbmVhciBzZWFyY2ggZm9yIGZyZWUgZWxlbWVudAorICAgICAgICAgICAgICAvLyBGcmFnbWVudGF0aW9uIG9mIHRoZSBmY0V4Y2hhbmdlIGFycmF5IGlzIGR1ZSB0byBleGNlc3NpdmVseQorICAgICAgICAgICAgICAvLyBsb25nIGNvbXBsZXRpb25zIG9yIHRpbWVvdXRzLgorICAgICAgCisgICAgICB3aGlsZSggVFJVRSApCisgICAgICB7CisgICAgICAgIGlmKCArK2kgPj0gVEFDSF9NQVhfWElEICkgLy8gcm9sbG92ZXIgY2hlY2sKKyAgICAgICAgICBpID0gVEFDSF9TRVNUX0xFTjsvLyBiZWdpbm5pbmcgb2YgTGluayBTZXJ2aWNlIFhfSURzCisKKy8vICAgICAgICBwcmludGsoICJsb29waW5nIGZvciB4Y2huZyBJRDogaT0lZCwgdHlwZT0lWGhcbiIsIAorLy8gICAgICAgICBpLCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbaV0udHlwZSk7CisKKyAgICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS50eXBlID09IDAgKSAvLyAiZnJlZSI/CisgICAgICAgIHsKKyAgICAgICAgICB1bFN0YXR1cyA9IDA7IC8vIHN1Y2Nlc3MhCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGkgPT0gZmNDaGlwLT5mY0xzRXhjaGFuZ2VMUlUgKSAvLyB3cmFwcGVkLWFyb3VuZCBhcnJheT8KKyAgICAgICAgeworICAgICAgICAgIHByaW50ayggIkxpbmtTZXJ2aWNlIFhfSUQgc3BhY2UgZnVsbFxuIik7CisgICAgICAgICAgYnJlYWs7ICAgICAgIC8vIGZhaWxlZCAtIHByZXZlbnQgaW5mLiBsb29wCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZmNDaGlwLT5mY0xzRXhjaGFuZ2VMUlUgPSBpICsgMTsgLy8gbmV4dCEgKHJvbGxvdmVyIGNoZWNrIG5leHQgcGFzcykKKworICB9CisKKyAgaWYoICF1bFN0YXR1cyApICAvLyBzdWNjZXNzPworICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS50eXBlID0gdHlwZTsgLy8gYWxsb2NhdGUgaXQuCisgIAorICBlbHNlCisgICAgaSA9IC0xOyAgLy8gZXJyb3IgLSBhbGwgZXhjaGFuZ2VzICJvcGVuIgorCisgIHJldHVybiBpOyAgCit9CisKK3N0YXRpYyB2b2lkCitjcHFmY19wY2lfdW5tYXBfZXh0ZW5kZWRfc2coc3RydWN0IHBjaV9kZXYgKnBjaWRldiwKKwlQVEFDSFlPTiBmY0NoaXAsCisJVUxPTkcgeF9JRCkKK3sKKwkvLyBVbm1hcHMgdGhlIG1lbW9yeSByZWdpb25zIHVzZWQgdG8gaG9sZCB0aGUgc2NhdHRlciBnYXRoZXIgbGlzdHMKKworCVBTR1BBR0VTIGk7CisKKwkvLyBXZXJlIHRoZXJlIGFueSBzdWNoIHJlZ2lvbnMgbmVlZGluZyB1bm1hcHBpbmc/CisJaWYgKCEgVVNFU19FWFRFTkRFRF9TR0xJU1QoZmNDaGlwLT5TRVNULCB4X0lEKSkKKwkJcmV0dXJuOwkvLyBObyBzdWNoIHJlZ2lvbnMsIHdlJ3JlIG91dHRhIGhlcmUuCisKKwkvLyBmb3IgZWFjaCBleHRlbmRlZCBzY2F0dGVyIGdhdGhlciByZWdpb24gbmVlZGluZyB1bm1hcHBpbmcuLi4gCisJZm9yIChpPWZjQ2hpcC0+U0VTVC0+c2dQYWdlc1t4X0lEXSA7IGkgIT0gTlVMTCA7IGkgPSBpLT5uZXh0KQorCQlwY2lfdW5tYXBfc2luZ2xlKHBjaWRldiwgaS0+YnVzYWRkciwgaS0+bWFwbGVuLAorCQkJc2NzaV90b19wY2lfZG1hX2RpcihQQ0lfRE1BX1RPREVWSUNFKSk7Cit9CisKKy8vIENhbGxlZCBhbHNvIGZyb20gY3BxZmNUU2NvbnRyb2wubywgc28gY2FuJ3QgYmUgc3RhdGljCit2b2lkCitjcHFmY19wY2lfdW5tYXAoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgCisJU2NzaV9DbW5kICpjbWQsIAorCVBUQUNIWU9OIGZjQ2hpcCwgCisJVUxPTkcgeF9JRCkKK3sKKwkvLyBVbmRvIHRoZSBETUEgbWFwcGluZ3MKKwlpZiAoY21kLT51c2Vfc2cpIHsJLy8gVXNlZCBzY2F0dGVyIGdhdGhlciBsaXN0IGZvciBkYXRhIGJ1ZmZlcj8KKwkJY3BxZmNfcGNpX3VubWFwX2V4dGVuZGVkX3NnKHBjaWRldiwgZmNDaGlwLCB4X0lEKTsKKwkJcGNpX3VubWFwX3NnKHBjaWRldiwgY21kLT5idWZmZXIsIGNtZC0+dXNlX3NnLAorCQkJc2NzaV90b19wY2lfZG1hX2RpcihjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisJCS8vIHByaW50aygidW1zZyAlZFxuIiwgY21kLT51c2Vfc2cpOworCX0KKwllbHNlIGlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbikgeworCQkvLyBwcmludGsoInVtcyAlcCAiLCBmY0NoaXAtPlNFU1QtPnVbIHhfSUQgXS5JV0UuR0FkZHIxKTsKKwkJcGNpX3VubWFwX3NpbmdsZShwY2lkZXYsIGZjQ2hpcC0+U0VTVC0+dVsgeF9JRCBdLklXRS5HQWRkcjEsCisJCQljbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCXNjc2lfdG9fcGNpX2RtYV9kaXIoY21kLT5zY19kYXRhX2RpcmVjdGlvbikpOworCX0JIAorfQorCisvLyBXZSBjYWxsIHRoaXMgcm91dGluZSB0byBmcmVlIGFuIEV4Y2hhbmdlIGZvciBhbnkgcmVhc29uOgorLy8gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgY29tcGxldGVkIHdpdGggZXJyb3IsIGFib3J0ZWQsIGV0Yy4KKworLy8gcmV0dXJucyBGQUxTRSBpZiBFeGNoYW5nZSBmYWlsZWQgYW5kICJyZXRyeSIgaXMgYWNjZXB0YWJsZQorLy8gcmV0dXJucyBUUlVFIGlmIEV4Y2hhbmdlIHdhcyBzdWNjZXNzZnVsLCBvciByZXRyeSBpcyBpbXBvc3NpYmxlCisvLyAoZS5nLiBwb3J0L2RldmljZSBnb25lKS4KKy8vc2NvbXBsZXRlZXhjaGFuZ2UKKwordm9pZCBjcHFmY1RTQ29tcGxldGVFeGNoYW5nZSggCisgICAgICAgc3RydWN0IHBjaV9kZXYgKnBjaWRldiwKKyAgICAgICBQVEFDSFlPTiBmY0NoaXAsIAorICAgICAgIFVMT05HIHhfSUQpCit7CisgIEZDX0VYQ0hBTkdFUyAqRXhjaGFuZ2VzID0gZmNDaGlwLT5FeGNoYW5nZXM7CisgIGludCBhbHJlYWR5X3VubWFwcGVkID0gMDsKKyAgCisgIGlmKCB4X0lEIDwgVEFDSF9TRVNUX0xFTiApIC8vIFNFU1QtYmFzZWQgKG9yIExpbmtTZXJ2IGZvciBGQ1AgZXhjaGFuZ2UpCisgIHsKKyAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uQ21uZCA9PSBOVUxMICkgLy8gd2hhdCNAIQorICAgIHsKKy8vICAgICAgVHJpZ2dlckhCQSggZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlLCAwKTsKKyAgICAgIHByaW50aygiIHhfSUQgJVhoLCB0eXBlICVYaCwgTlVMTCBwdHIhXG4iLCB4X0lELAorCQkJRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0udHlwZSk7CisKKyAgICAgIGdvdG8gQ2xlYW5VcFNlc3RSZXNvdXJjZXM7ICAvLyB0aGlzIHBhdGggc2hvdWxkIGJlIHZlcnkgcmFyZS4KKyAgICB9CisKKyAgICAvLyB3ZSBoYXZlIExpbnV4IFNjc2kgQ21uZCBwdHIuLi4sIG5vdyBjaGVjayBvdXIgRXhjaGFuZ2Ugc3RhdHVzCisgICAgLy8gdG8gZGVjaWRlIGhvdyB0byBjb21wbGV0ZSB0aGlzIFNFU1QgRkNQIGV4Y2hhbmdlCisKKyAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzICkgLy8gcGVyaGFwcyBhIFRhY2ggaW5kaWNhdGVkIHByb2JsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBhYm5vcm1hbCBleGNoYW5nZSBjb21wbGV0aW9uCisgICAgeworICAgICAgLy8gc2V0IEZDUCBMaW5rIHN0YXRpc3RpY3MKKyAgICAgCisgICAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzICYgRkMyX1RJTUVPVVQpCisgICAgICAgIGZjQ2hpcC0+ZmNTdGF0cy50aW1lb3V0cysrOworICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLnN0YXR1cyAmIElOSVRJQVRPUl9BQk9SVCkKKyAgICAgICAgZmNDaGlwLT5mY1N0YXRzLkZDNGFib3J0ZWQrKzsKKyAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5zdGF0dXMgJiBDT1VOVF9FUlJPUikKKyAgICAgICAgZmNDaGlwLT5mY1N0YXRzLkNudEVycm9ycysrOworICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLnN0YXR1cyAmIExJTktGQUlMX1RYKQorICAgICAgICBmY0NoaXAtPmZjU3RhdHMubGlua0ZhaWxUWCsrOworICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLnN0YXR1cyAmIExJTktGQUlMX1JYKQorICAgICAgICBmY0NoaXAtPmZjU3RhdHMubGlua0ZhaWxSWCsrOworICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLnN0YXR1cyAmIE9WRVJGTE9XKQorICAgICAgICBmY0NoaXAtPmZjU3RhdHMuQ250RXJyb3JzKys7CisKKyAgICAgIC8vIEZpcnN0LCBzZWUgaWYgdGhlIFNjc2kgdXBwZXIgbGV2ZWwgaW5pdGlhdGVkIGFuIEFCT1JUIG9uIHRoaXMKKyAgICAgIC8vIGV4Y2hhbmdlLi4uCisgICAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzID09IElOSVRJQVRPUl9BQk9SVCApCisgICAgICB7CisgICAgICAgIHByaW50aygiIERJRF9BQk9SVCwgeF9JRCAlWGgsIENtbmQgJXAgIiwgCisgICAgICAgICAgICB4X0lELCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kKTsKKyAgICAgICAgZ290byBDbGVhblVwU2VzdFJlc291cmNlczsgIC8vICh3ZSBkb24ndCBleHBlY3QgTGludXggX2Fib3J0cykKKyAgICAgIH0KKworICAgICAgLy8gRGlkIG91ciBkcml2ZXIgdGltZW91dCB0aGUgRXhjaGFuZ2UsIG9yIGRpZCBUYWNoeW9uIGluZGljYXRlCisgICAgICAvLyBhIGZhaWx1cmUgZHVyaW5nIHRyYW5zbWlzc2lvbj8gIEFzayBmb3IgcmV0cnkgd2l0aCAiU09GVF9FUlJPUiIKKyAgICAgIGVsc2UgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLnN0YXR1cyAmIEZDMl9USU1FT1VUKSAKKyAgICAgIHsKKy8vICAgICAgICBwcmludGsoInJlc3VsdCBESURfU09GVF9FUlJPUiwgeF9JRCAlWGgsIENtbmQgJXBcbiIsIAorLy8gICAgICAgICAgICB4X0lELCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kKTsKKyAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uQ21uZC0+cmVzdWx0ID0gKERJRF9TT0ZUX0VSUk9SIDw8MTYpOworICAgICAgfQorICAgICAgCisgICAgICAvLyBEaWQgZnJhbWUocykgZm9yIGFuIG9wZW4gZXhjaGFuZ2UgYXJyaXZlIGluIHRoZSBTRlEsCisgICAgICAvLyBtZWFuaW5nIHRoZSBTRVNUIHdhcyB1bmFibGUgdG8gcHJvY2VzcyB0aGVtPworICAgICAgZWxzZSBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzICYgU0ZRX0ZSQU1FKSAKKyAgICAgIHsKKy8vICAgICAgICBwcmludGsoInJlc3VsdCBESURfU09GVF9FUlJPUiwgeF9JRCAlWGgsIENtbmQgJXBcbiIsIAorLy8gICAgICAgICAgICB4X0lELCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kKTsKKyAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uQ21uZC0+cmVzdWx0ID0gKERJRF9TT0ZUX0VSUk9SIDw8MTYpOworICAgICAgfQorICAgICAgCisgICAgICAvLyBEaWQgb3VyIGRyaXZlciB0aW1lb3V0IHRoZSBFeGNoYW5nZSwgb3IgZGlkIFRhY2h5b24gaW5kaWNhdGUKKyAgICAgIC8vIGEgZmFpbHVyZSBkdXJpbmcgdHJhbnNtaXNzaW9uPyAgQXNrIGZvciByZXRyeSB3aXRoICJTT0ZUX0VSUk9SIgorICAgICAgZWxzZSBpZiggCisgICAgICAgICAgICAgICAoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzICYgTElOS0ZBSUxfVFgpIHx8CisgICAgICAgICAgICAgICAoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzICYgUE9SVElEX0NIQU5HRUQpIHx8CisJICAgICAgIChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5zdGF0dXMgJiBGUkFNRV9UTykgICAgfHwKKwkgICAgICAgKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLnN0YXR1cyAmIElOVl9FTlRSWSkgICAgfHwKKwkgICAgICAgKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLnN0YXR1cyAmIEFCT1JUU0VRX05PVElGWSkgICAgKQorCisKKyAgICAgIHsKKy8vICAgICAgICBwcmludGsoInJlc3VsdCBESURfU09GVF9FUlJPUiwgeF9JRCAlWGgsIENtbmQgJXBcbiIsIAorLy8gICAgICAgICAgICB4X0lELCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kKTsKKyAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uQ21uZC0+cmVzdWx0ID0gKERJRF9TT0ZUX0VSUk9SIDw8MTYpOworCisKKyAgICAgIH0KKworICAgICAgLy8gZS5nLiwgYSBMT0dPdXQgaGFwcGVuZWQsIG9yIGRldmljZSBuZXZlciBsb2dnZWQgYmFjayBpbi4KKyAgICAgIGVsc2UgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLnN0YXR1cyAmIERFVklDRV9SRU1PVkVEKSAKKyAgICAgIHsKKy8vCXByaW50aygiICpMT0dPdXQgb3IgdGltZW91dCBvbiBsb2dpbiEqICIpOworCS8vIHRyaWdnZXI/CisvLyAgICAgICAgVHJpZ2dlckhCQSggZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlLCAwKTsKKworICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwxNik7CisgICAgICB9ICAgICAgCisJCQorCQkgICAgICAKKyAgICAgIC8vIERpZCBUYWNoeW9uIGluZGljYXRlIGEgQ05UIGVycm9yPyAgV2UgbmVlZCBmdXJ0aGVyIGFuYWx5c2lzCisgICAgICAvLyB0byBkZXRlcm1pbmUgaWYgdGhlIGV4Y2hhbmdlIGlzIGFjY2VwdGFibGUKKyAgICAgIGVsc2UgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLnN0YXR1cyA9PSBDT1VOVF9FUlJPUikKKyAgICAgIHsKKyAgICAgICAgVUNIQVIgU2NzaVN0YXR1czsKKyAgICAgICAgRkNQX1NUQVRVU19SRVNQT05TRSAqcEZjcFN0YXR1cyA9IAorCSAgKFBGQ1BfU1RBVFVTX1JFU1BPTlNFKSZmY0NoaXAtPlNFU1QtPlJzcEhEUlsgeF9JRCBdLnBsOworCisgICAgICAJU2NzaVN0YXR1cyA9IHBGY3BTdGF0dXMtPmZjcF9zdGF0dXMgPj4yNDsKKyAgCisJLy8gSWYgdGhlIGNvbW1hbmQgaXMgYSBTQ1NJIFJlYWQvV3JpdGUgdHlwZSwgd2UgZG9uJ3QgdG9sZXJhdGUKKwkvLyBjb3VudCBlcnJvcnMgb2YgYW55IGtpbmQ7IGFzc3VtZSB0aGUgY291bnQgZXJyb3IgaXMgZHVlIHRvCisJLy8gYSBkcm9wcGVkIGZyYW1lIGFuZCBhc2sgZm9yIHJldHJ5Li4uCisJCisJaWYoKCAoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uQ21uZC0+Y21uZFswXSA9PSAweDgpIHx8CisJICAgIChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kLT5jbW5kWzBdID09IDB4MjgpIHx8CQkKKyAgICAgICAgICAgIChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kLT5jbW5kWzBdID09IDB4QSkgfHwKKyAgICAgICAgICAgIChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kLT5jbW5kWzBdID09IDB4MkEpICkKKwkgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICAgICAgIFNjc2lTdGF0dXMgPT0gMCApCisJeworICAgICAgICAgIC8vIGFzayBmb3IgcmV0cnkKKy8qICAgICAgICAgIHByaW50aygiQ09VTlRfRVJST1IgcmV0cnksIHhfSUQgJVhoLCBzdGF0dXMgJVhoLCBDbW5kICVwXG4iLCAKKyAgICAgICAgICAgIHhfSUQsIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLnN0YXR1cywKKyAgICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLkNtbmQpOyovCisgICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uQ21uZC0+cmVzdWx0ID0gKERJRF9TT0ZUX0VSUk9SIDw8MTYpOworCX0KKwkKKwllbHNlICAvLyBuZWVkIG1vcmUgYW5hbHlzaXMKKwl7CisJICBjcHFmY1RTQ2hlY2thbmRTbm9vcEZDUChmY0NoaXAsIHhfSUQpOyAgLy8gKHdpbGwgc2V0IC0+cmVzdWx0KQorCX0KKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gZGVmYXVsdDogTk9URSEgV2UgZG9uJ3QgZXZlciB3YW50IHRvIGdldCBoZXJlLiAgR2V0dGluZyBoZXJlCisgICAgICAvLyBpbXBsaWVzIHNvbWV0aGluZyBuZXcgaXMgaGFwcGVuaW5nIHRoYXQgd2UndmUgbmV2ZXIgaGFkIGEgdGVzdAorICAgICAgLy8gY2FzZSBmb3IuICBOZWVkIGNvZGUgbWFpbnRlbmFuY2UhICBSZXR1cm4gIkVSUk9SIgorICAgICAgZWxzZQorICAgICAgeworCXVuc2lnbmVkIGludCBzdGF0ID0gRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzOworICAgICAgICBwcmludGsoIkRFRkFVTFQgcmVzdWx0ICVYaCwgeF9JRCAlWGgsIENtbmQgJXAiLCAKKyAgICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5zdGF0dXMsIHhfSUQsIAorCSAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uQ21uZCk7CisKKwlpZiAoc3RhdCAmIElOVkFMSURfQVJHUykJcHJpbnRrKCIgSU5WQUxJRF9BUkdTICIpOworCWlmIChzdGF0ICYgTE5LRFdOX09TTFMpCQlwcmludGsoIiBMTktEV05fT1NMUyAiKTsKKwlpZiAoc3RhdCAmIExOS0RXTl9MQVNFUikJcHJpbnRrKCIgTE5LRFdOX0xBU0VSICIpOworCWlmIChzdGF0ICYgT1VUUVVFX0ZVTEwpCQlwcmludGsoIiBPVVRRVUVfRlVMTCAiKTsKKwlpZiAoc3RhdCAmIERSSVZFUlFfRlVMTCkJcHJpbnRrKCIgRFJJVkVSUV9GVUxMICIpOworCWlmIChzdGF0ICYgU0VTVF9GVUxMKQkJcHJpbnRrKCIgU0VTVF9GVUxMICIpOworCWlmIChzdGF0ICYgQkFEX0FMUEEpCQlwcmludGsoIiBCQURfQUxQQSAiKTsKKwlpZiAoc3RhdCAmIE9WRVJGTE9XKQkJcHJpbnRrKCIgT1ZFUkZMT1cgIik7CisJaWYgKHN0YXQgJiBDT1VOVF9FUlJPUikJCXByaW50aygiIENPVU5UX0VSUk9SICIpOworCWlmIChzdGF0ICYgTElOS0ZBSUxfUlgpCQlwcmludGsoIiBMSU5LRkFJTF9SWCAiKTsKKwlpZiAoc3RhdCAmIEFCT1JUU0VRX05PVElGWSkJcHJpbnRrKCIgQUJPUlRTRVFfTk9USUZZICIpOworCWlmIChzdGF0ICYgTElOS0ZBSUxfVFgpCQlwcmludGsoIiBMSU5LRkFJTF9UWCAiKTsKKwlpZiAoc3RhdCAmIEhPU1RQUk9HX0VSUikJcHJpbnRrKCIgSE9TVFBST0dfRVJSICIpOworCWlmIChzdGF0ICYgRlJBTUVfVE8pCQlwcmludGsoIiBGUkFNRV9UTyAiKTsKKwlpZiAoc3RhdCAmIElOVl9FTlRSWSkJCXByaW50aygiIElOVl9FTlRSWSAiKTsKKwlpZiAoc3RhdCAmIFNFU1RQUk9HX0VSUikJcHJpbnRrKCIgU0VTVFBST0dfRVJSICIpOworCWlmIChzdGF0ICYgT1VUQk9VTkRfVElNRU9VVCkJcHJpbnRrKCIgT1VUQk9VTkRfVElNRU9VVCAiKTsKKwlpZiAoc3RhdCAmIElOSVRJQVRPUl9BQk9SVCkJcHJpbnRrKCIgSU5JVElBVE9SX0FCT1JUICIpOworCWlmIChzdGF0ICYgTUVNUE9PTF9GQUlMKQlwcmludGsoIiBNRU1QT09MX0ZBSUwgIik7CisJaWYgKHN0YXQgJiBGQzJfVElNRU9VVCkJCXByaW50aygiIEZDMl9USU1FT1VUICIpOworCWlmIChzdGF0ICYgVEFSR0VUX0FCT1JUKQlwcmludGsoIiBUQVJHRVRfQUJPUlQgIik7CisJaWYgKHN0YXQgJiBFWENIQU5HRV9RVUVVRUQpCXByaW50aygiIEVYQ0hBTkdFX1FVRVVFRCAiKTsKKwlpZiAoc3RhdCAmIFBPUlRJRF9DSEFOR0VEKQlwcmludGsoIiBQT1JUSURfQ0hBTkdFRCAiKTsKKwlpZiAoc3RhdCAmIERFVklDRV9SRU1PVkVEKQlwcmludGsoIiBERVZJQ0VfUkVNT1ZFRCAiKTsKKwlpZiAoc3RhdCAmIFNGUV9GUkFNRSkJCXByaW50aygiIFNGUV9GUkFNRSAiKTsKKwlwcmludGsoIlxuIik7CisKKyAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uQ21uZC0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PDE2KTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgICAvLyBkZWZpbml0ZWx5IG5vIFRhY2ggcHJvYmxlbSwgYnV0IHBlcmhhcHMgYW4gRkNQIHByb2JsZW0KKyAgICB7CisgICAgICAvLyBzZXQgRkNQIExpbmsgc3RhdGlzdGljCisgICAgICBmY0NoaXAtPmZjU3RhdHMub2srKzsKKyAgICAgIGNwcWZjVFNDaGVja2FuZFNub29wRkNQKCBmY0NoaXAsIHhfSUQpOyAgLy8gKHdpbGwgc2V0IC0+cmVzdWx0KSAgICAKKyAgICB9CisKKyAgICBjcHFmY19wY2lfdW5tYXAocGNpZGV2LCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0uQ21uZCwgCisJCQlmY0NoaXAsIHhfSUQpOyAvLyB1bmRvIERNQSBtYXBwaW5ncy4KKyAgICBhbHJlYWR5X3VubWFwcGVkID0gMTsKKworICAgIC8vIE9LLCB3ZSd2ZSBzZXQgdGhlIFNjc2kgIi0+cmVzdWx0IiBmaWVsZCwgc28gcHJvY2VlZCB3aXRoIGNhbGxpbmcKKyAgICAvLyBMaW51eCBTY3NpICJkb25lIiAoaWYgbm90IE5VTEwpLCBhbmQgZnJlZSBhbnkga2VybmVsIG1lbW9yeSB3ZQorICAgIC8vIG1heSBoYXZlIGFsbG9jYXRlZCBmb3IgdGhlIGV4Y2hhbmdlLgorCisgIFBDSV9UUkFDRU8oIChVTE9ORylFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0uQ21uZCwgMHhBQyk7CisgICAgLy8gY29tcGxldGUgdGhlIGNvbW1hbmQgYmFjayB0byB1cHBlciBTY3NpIGRyaXZlcnMKKyAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uQ21uZC0+c2NzaV9kb25lICE9IE5VTEwpCisgICAgeworICAgICAgLy8gQ2FsbGluZyAiZG9uZSIgb24gYW4gTGludXggX2Fib3J0KCkgYWJvcnRlZAorICAgICAgLy8gQ21uZCBjYXVzZXMgYSBrZXJuZWwgcGFuaWMgdHJ5aW5nIHRvIHJlLWZyZWUgbWVtLgorICAgICAgLy8gQWN0dWFsbHksIHdlIHNob3VsZG4ndCBkbyBhbnl0aGluZyB3aXRoIGFuIF9hYm9ydCBDTU5ECisgICAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uQ21uZC0+cmVzdWx0ICE9IChESURfQUJPUlQ8PDE2KSApCisgICAgICB7CisgICAgICAgIFBDSV9UUkFDRSgweEFDKQorCWNhbGxfc2NzaV9kb25lKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLkNtbmQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworLy8JcHJpbnRrKCIgbm90IGNhbGxpbmcgc2NzaV9kb25lIG9uIHhfSUQgJVhoLCBDbW5kICVwXG4iLAorLy8JCQl4X0lELCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZXsKKyAgICAgIHByaW50aygiIHhfSUQgJVhoLCB0eXBlICVYaCwgQ2RiMCAlWGhcbiIsIHhfSUQsCisJRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0udHlwZSwgCisJRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uQ21uZC0+Y21uZFswXSk7CSAgICAgIAorICAgICAgcHJpbnRrKCIgY3BxZmNUUzogTnVsbCBzY3NpX2RvbmUgZnVuY3Rpb24gcG9pbnRlciFcbiIpOworICAgIH0KKworCisgICAgLy8gTm93LCBjbGVhbiB1cCBub24tU2NzaV9DbW5kIGl0ZW1zLi4uCitDbGVhblVwU2VzdFJlc291cmNlczoKKyAgIAorICAgIGlmICghYWxyZWFkeV91bm1hcHBlZCkgCisJY3BxZmNfcGNpX3VubWFwKHBjaWRldiwgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW3hfSURdLkNtbmQsIAorCQkJZmNDaGlwLCB4X0lEKTsgLy8gdW5kbyBETUEgbWFwcGluZ3MuCisKKyAgICAvLyBXYXMgYW4gRXh0ZW5kZWQgU2NhdHRlci9HYXRoZXIgcGFnZSBhbGxvY2F0ZWQ/ICBXZSBrbm93CisgICAgLy8gdGhpcyBieSBjaGVja2luZyBEV09SRCA0LCBiaXQgMzEgKCJMT0MiKSBvZiBTRVNUIGVudHJ5CisgICAgaWYoICEoZmNDaGlwLT5TRVNULT51WyB4X0lEIF0uSVdFLkJ1ZmZfT2ZmICYgMHg4MDAwMDAwMCkpCisgICAgeworICAgICAgUFNHUEFHRVMgcCwgbmV4dDsKKworICAgICAgLy8gZXh0ZW5kZWQgUy9HIGxpc3Qgd2FzIHVzZWQgLS0gRnJlZSB0aGUgYWxsb2NhdGVkIGV4dC4gUy9HIHBhZ2VzCisgICAgICBmb3IgKHAgPSBmY0NoaXAtPlNFU1QtPnNnUGFnZXNbeF9JRF07IHAgIT0gTlVMTDsgcCA9IG5leHQpIHsKKwkgbmV4dCA9IHAtPm5leHQ7CisJIGtmcmVlKHApOworICAgICAgfQorICAgICAgZmNDaGlwLT5TRVNULT5zZ1BhZ2VzW3hfSURdID0gTlVMTDsKKyAgICB9CisgIAorICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLkNtbmQgPSBOVUxMOyAKKyAgfSAgLy8gRG9uZSB3aXRoIEZDUCAoU0VTVCkgZXhjaGFuZ2VzCisKKworICAvLyB0aGUgcmVtYWluaW5nIGxvZ2ljIGlzIGNvbW1vbiB0byBBTEwgRXhjaGFuZ2VzOiAKKyAgLy8gRkNQKFNFU1QpIGFuZCBMaW5rU2Vydi4KKworICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS50eXBlID0gMDsgLy8gdGhlcmUgLS0gRlJFRSEgIAorICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5zdGF0dXMgPSAwOyAKKworICBQQ0lfVFJBQ0VPKCB4X0lELCAweEFDKQorICAgICAKKyAgCisgIHJldHVybjsKK30gICAvLyAoRU5EIG9mIENvbXBsZXRlRXhjaGFuZ2UgZnVuY3Rpb24pCisgCisKKworCisvLyBVbmZvcnR1bmF0ZWx5LCB3ZSBtdXN0IHNub29wIGFsbCBjb21tYW5kIGNvbXBsZXRpb25zIGluCisvLyBvcmRlciB0byBtYW5pcHVsYXRlIGNlcnRhaW4gcmV0dXJuIGZpZWxkcywgYW5kIHRha2Ugbm90ZSBvZgorLy8gZGV2aWNlIHR5cGVzLCBldGMuLCB0byBmYWNpbGl0YXRlIHRoZSBGaWJyZS1DaGFubmVsIHRvIFNDU0kKKy8vICJtYXBwaW5nIi4gIAorLy8gKFdhdGNoIGZvciBCSUcgRW5kaWFuIGNvbmZ1c2lvbiBvbiBzb21lIHBheWxvYWQgZmllbGRzKQordm9pZCBjcHFmY1RTQ2hlY2thbmRTbm9vcEZDUCggUFRBQ0hZT04gZmNDaGlwLCBVTE9ORyB4X0lEKQoreworICBGQ19FWENIQU5HRVMgKkV4Y2hhbmdlcyA9IGZjQ2hpcC0+RXhjaGFuZ2VzOworICBTY3NpX0NtbmQgKkNtbmQgPSBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSURdLkNtbmQ7CisgIEZDUF9TVEFUVVNfUkVTUE9OU0UgKnBGY3BTdGF0dXMgPSAKKyAgICAoUEZDUF9TVEFUVVNfUkVTUE9OU0UpJmZjQ2hpcC0+U0VTVC0+UnNwSERSWyB4X0lEIF0ucGw7CisgIFVDSEFSIFNjc2lTdGF0dXM7CisKKyAgU2NzaVN0YXR1cyA9IHBGY3BTdGF0dXMtPmZjcF9zdGF0dXMgPj4yNDsKKworI2lmZGVmIEZDUF9DT01QTEVUSU9OX0RCRworICBwcmludGsoIlNjc2lTdGF0dXMgPSAweCVYXG4iLCBTY3NpU3RhdHVzKTsKKyNlbmRpZgkKKworICAvLyBGaXJzdCwgY2hlY2sgRkNQIHN0YXR1cworICBpZiggcEZjcFN0YXR1cy0+ZmNwX3N0YXR1cyAmIEZDUF9SU1BfTEVOX1ZBTElEICkKKyAgeworICAgIC8vIGNoZWNrIHJlc3BvbnNlIGNvZGUgKFJTUF9DT0RFKSAtLSBtb3N0IHBvcHVsYXIgaXMgYmFkIGxlbgorICAgIC8vIDFzdCA0IGJ5dGVzIG9mIHJzcCBpbmZvIC0tIG9ubHkgYnl0ZSAzIGludGVyZXN0aW5nCisgICAgaWYoIHBGY3BTdGF0dXMtPmZjcF9yc3BfaW5mbyAmIEZDUF9EQVRBX0xFTl9OT1RfQlVSU1RfTEVOICkKKyAgICB7IAorCisgICAgICAvLyBkbyB3ZSBFVkVSIGdldCBoZXJlPworICAgICAgcHJpbnRrKCJjcHFmY1RTOiBGQ1AgZGF0YSBsZW4gbm90IGJ1cnN0IGxlbiwgeF9JRCAlWGhcbiIsIHhfSUQpOworICAgIH0KKyAgfQorCisgIC8vIGZvciBub3csIGdvIGJ5IHRoZSBTY3NpU3RhdHVzLCBhbmQgbWFuaXB1bGF0ZSBjZXJ0YWluCisgIC8vIGNvbW1hbmRzIHdoZW4gbmVjZXNzYXJ5Li4uCisgIGlmKCBTY3NpU3RhdHVzID09IDApIC8vIFNDU0kgc3RhdHVzIGJ5dGUgImdvb2QiPworICB7CisgICAgQ21uZC0+cmVzdWx0ID0gMDsgLy8gZXZlcnl0aGluZydzIE9LCisKKyAgICBpZiggKENtbmQtPmNtbmRbMF0gPT0gSU5RVUlSWSkpIAorICAgIHsKKyAgICAgIFVDSEFSICpJbnF1aXJ5RGF0YSA9IENtbmQtPnJlcXVlc3RfYnVmZmVyOworICAgICAgUEZDX0xPR0dFRElOX1BPUlQgcExvZ2dlZEluUG9ydDsKKworICAgICAgLy8gV2UgbmVlZCB0byBtYW5pcHVsYXRlIElOUVVJUlkKKyAgICAgIC8vIHN0cmluZ3MgZm9yIENPTVBBUSBSQUlEIGNvbnRyb2xsZXJzIHRvIGZvcmNlCisgICAgICAvLyBMaW51eCB0byBzY2FuIGFkZGl0aW9uYWwgTFVOcy4gIE5hbWVseSwgc2V0CisgICAgICAvLyB0aGUgSW5xdWlyeSBzdHJpbmcgYnl0ZSAyIChBTlNJLWFwcHJvdmVkIHZlcnNpb24pCisgICAgICAvLyB0byAyLgorCisgICAgICBpZiggIW1lbWNtcCggJklucXVpcnlEYXRhWzhdLCAiQ09NUEFRIiwgNiApKQorICAgICAgeworICAgICAgICBJbnF1aXJ5RGF0YVsyXSA9IDB4MjsgIC8vIGNsYWltIFNDU0ktMiBjb21wbGlhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIG11bHRpcGxlIExVTnMgbWF5IGJlIHNjYW5uZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKG5vIFNDU0ktMiBwcm9ibGVtcyBrbm93biBpbiBDUFEpCisgICAgICB9CisgICAgICAgIAorICAgICAgLy8gc25vb3AgdGhlIElucXVpcnkgdG8gZGV0ZWN0IERpc2ssIFRhcGUsIGV0Yy4gdHlwZQorICAgICAgLy8gKHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgdGhlIHBvcnRfaWQgd2Ugc2VudCBJTlFVSVJZIHRvKQorICAgICAgcExvZ2dlZEluUG9ydCA9IGZjRmluZExvZ2dlZEluUG9ydCggZmNDaGlwLAorICAgICAgICBOVUxMLCAgICAgLy8gRE9OJ1Qgc2VhcmNoIFNjc2kgTmV4dXMgKHdlIHdpbGwgc2V0IGl0KQorICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSURdLmZjaHMuZF9pZCAmIDB4RkZGRkZGLCAgICAgICAgCisgICAgICAgIE5VTEwsICAgICAvLyBET04nVCBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIEZDIFdXTgorICAgICAgICBOVUxMKTsgICAgLy8gRE9OJ1QgY2FyZSBhYm91dCBlbmQgb2YgbGlzdAorIAorICAgICAgaWYoIHBMb2dnZWRJblBvcnQgKQorICAgICAgeworICAgICAgICBwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMuSW5xRGV2aWNlVHlwZSA9IElucXVpcnlEYXRhWzBdOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworCXByaW50aygiY3BxZmNUUzogY2FuJ3QgZmluZCBMb2dnZWRJbiBGQyBwb3J0ICUwNlggZm9yIElOUVVJUllcbiIsCisgICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS5mY2hzLmRfaWQgJiAweEZGRkZGRik7CisgICAgICB9CisgICAgfQorICB9CisKKworICAvLyBTY3NpIFN0YXR1cyBub3QgZ29vZCAtLSBwYXNzIGl0IGJhY2sgdG8gY2FsbGVyIAorCisgIGVsc2UKKyAgeworICAgIENtbmQtPnJlc3VsdCA9IFNjc2lTdGF0dXM7IC8vIFNDU0kgc3RhdHVzIGJ5dGUgaXMgMXN0CisgICAgCisgICAgLy8gY2hlY2sgZm9yIHZhbGlkICJzZW5zZSIgZGF0YQorCisgICAgaWYoIHBGY3BTdGF0dXMtPmZjcF9zdGF0dXMgJiBGQ1BfU05TX0xFTl9WQUxJRCApIAorICAgIHsgICAgICAgICAgICAvLyBsaW1pdCBTY3NpIFNlbnNlIGZpZWxkIGxlbmd0aCEKKyAgICAgIGludCBTZW5zZUxlbiA9IHBGY3BTdGF0dXMtPmZjcF9zbnNfbGVuID4+MjQ7IC8vIChCaWdFbmRpYW4pIGxvd2VyIGJ5dGUKKyAgICAgIAorICAgICAgU2Vuc2VMZW4gPSBTZW5zZUxlbiA+IHNpemVvZiggQ21uZC0+c2Vuc2VfYnVmZmVyKSA/IAorICAgICAgICBzaXplb2YoIENtbmQtPnNlbnNlX2J1ZmZlcikgOiBTZW5zZUxlbjsKKwkgICAKKworI2lmZGVmIEZDUF9DT01QTEVUSU9OX0RCRwkgICAgCisgICAgICBwcmludGsoImNvcHkgc2Vuc2VfYnVmZmVyICVwLCBsZW4gJWQsIHJlc3VsdCAlWGhcbiIsCisgICAgICAgIENtbmQtPnNlbnNlX2J1ZmZlciwgU2Vuc2VMZW4sIENtbmQtPnJlc3VsdCk7CisjZW5kaWYJICAKKworICAgICAgLy8gTk9URTogVGhlcmUgaXMgc29tZSBkaXNwdXRlIG92ZXIgdGhlIEZDUCByZXNwb25zZQorICAgICAgLy8gZm9ybWF0LiAgTW9zdCBGQyBkZXZpY2VzIGFzc3VtZSB0aGF0IEZDUF9SU1BfSU5GTworICAgICAgLy8gaXMgOCBieXRlcyBsb25nLCBpbiBzcGl0ZSBvZiB0aGUgZmFjdCB0aGF0IEZDUF9SU1BfTEVOCisgICAgICAvLyBpcyAodmlydHVhbGx5KSBhbHdheXMgMCBhbmQgdGhlIGZpZWxkIGlzICJpbnZhbGlkIi4gIAorICAgICAgLy8gU29tZSBvdGhlciBkZXZpY2VzIGFzc3VtZSB0aGF0CisgICAgICAvLyB0aGUgRkNQX1NOU19JTkZPIGJlZ2lucyBhZnRlciBGQ1BfUlNQX0xFTiBieXRlcyAoaS5lLiAwKQorICAgICAgLy8gd2hlbiB0aGUgRkNQX1JTUCBpcyBpbnZhbGlkICh0aGlzIGFsbW9zdCBhcHBlYXJzIHRvIGJlCisgICAgICAvLyBvbmUgb2YgdGhvc2UgInJlbGlnaW91cyIgaXNzdWVzKS4KKyAgICAgIC8vIENvbnNlcXVlbnRseSwgd2UgdGVzdCB0aGUgdXN1YWwgcG9zaXRpb24gb2YgRkNQX1NOU19JTkZPCisgICAgICAvLyBmb3IgN1hoLCBzaW5jZSB0aGUgU0NTSSBzZW5zZSBmb3JtYXQgc2F5cyB0aGUgZmlyc3QKKyAgICAgIC8vIGJ5dGUgKCJlcnJvciBjb2RlIikgc2hvdWxkIGJlIDB4NzAgb3IgMHg3MS4gIEluIHByYWN0aWNlLAorICAgICAgLy8gd2UgZmluZCB0aGF0IGV2ZXJ5IGRldmljZSBkb2VzIGluIGZhY3QgaGF2ZSAweDcwIG9yIDB4NzEKKyAgICAgIC8vIGluIHRoZSBmaXJzdCBieXRlIHBvc2l0aW9uLCBzbyB0aGlzIHRlc3Qgd29ya3MgZm9yIGFsbAorICAgICAgLy8gRkMgZGV2aWNlcy4gIAorICAgICAgLy8gKFRoaXMgbG9naWMgaXMgZXNwZWNpYWxseSBlZmZlY3RpdmUgZm9yIHRoZSBDUFEvREVDIEhTRzgwCisgICAgICAvLyAmIEhTRzYwIGNvbnRyb2xsZXJzKS4KKworICAgICAgaWYoIChwRmNwU3RhdHVzLT5mY3Bfc25zX2luZm9bMF0gJiAweDcwKSA9PSAweDcwICkKKyAgICAgICAgbWVtY3B5KCBDbW5kLT5zZW5zZV9idWZmZXIsIAorICAgICAgICAgICZwRmNwU3RhdHVzLT5mY3Bfc25zX2luZm9bMF0sIFNlbnNlTGVuKTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqc2JQdHIgPSAKKwkJKHVuc2lnbmVkIGNoYXIgKikmcEZjcFN0YXR1cy0+ZmNwX3Nuc19pbmZvWzBdOworICAgICAgICBzYlB0ciAtPSA4OyAgLy8gYmFjayB1cCA4IGJ5dGVzIGhvcGluZyB0byBmaW5kIHRoZQorCSAgICAgICAgICAgICAvLyBzdGFydCBvZiB0aGUgc2Vuc2UgYnVmZmVyCisgICAgICAgIG1lbWNweSggQ21uZC0+c2Vuc2VfYnVmZmVyLCBzYlB0ciwgU2Vuc2VMZW4pOworICAgICAgfQorCisgICAgICAvLyBpbiB0aGUgc3BlY2lhbCBjYXNlIG9mIERldmljZSBSZXNldCwgdGVsbCB1cHBlciBsYXllcgorICAgICAgLy8gdG8gaW1tZWRpYXRlbHkgcmV0cnkgKHdpdGggU09GVF9FUlJPUiBzdGF0dXMpCisgICAgICAvLyBsb29rIGZvciBTZW5zZSBLZXkgVW5pdCBBdHRlbnRpb24gKDB4Nikgd2l0aCBBU0MgRGV2aWNlCisgICAgICAvLyBSZXNldCAoMHgyOSkKKyAgICAgIC8vCSAgICBwcmludGsoIlNlbnNlTGVuICVkLCBLZXkgPSAweCVYLCBBU0MgPSAweCVYXG4iLAorICAgICAgLy8JCSAgICBTZW5zZUxlbiwgQ21uZC0+c2Vuc2VfYnVmZmVyWzJdLCAKKyAgICAgIC8vICAgICAgICAgICAgICAgICAgIENtbmQtPnNlbnNlX2J1ZmZlclsxMl0pOworICAgICAgaWYoICgoQ21uZC0+c2Vuc2VfYnVmZmVyWzJdICYgMHhGKSA9PSAweDYpICYmCisJICAgICAgICAoQ21uZC0+c2Vuc2VfYnVmZmVyWzEyXSA9PSAweDI5KSApIC8vIFNlbnNlIENvZGUgInJlc2V0IgorICAgICAgeworICAgICAgICBDbW5kLT5yZXN1bHQgfD0gKERJRF9TT0ZUX0VSUk9SIDw8IDE2KTsgLy8gIkhvc3QiIHN0YXR1cyBieXRlIDNyZAorICAgICAgfQorIAorICAgICAgLy8gY2hlY2sgZm9yIFNlbnNlS2V5ICJIQVJEV0FSRSBFUlJPUiIsIEFTQyBJbnRlcm5hbFRhcmdldEZhaWx1cmUKKyAgICAgIGVsc2UgaWYoICAoKENtbmQtPnNlbnNlX2J1ZmZlclsyXSAmIDB4RikgPT0gMHg0KSAmJiAgLy8gImhhcmR3YXJlIGVycm9yIgorICAgICAgCSAgICAgICAgKENtbmQtPnNlbnNlX2J1ZmZlclsxMl0gPT0gMHg0NCkgKSAvLyBBZGR0bC4gU2Vuc2UgQ29kZSAKKyAgICAgIHsKKy8vICAgICAgICBwcmludGsoIkhBUkRXQVJFX0VSUk9SLCBDaGFubmVsL1RhcmdldC9MdW4gJWQvJWQvJWRcbiIsCisvLwkJQ21uZC0+Y2hhbm5lbCwgQ21uZC0+dGFyZ2V0LCBDbW5kLT5sdW4pOworICAgICAgCUNtbmQtPnJlc3VsdCB8PSAoRElEX0VSUk9SIDw8IDE2KTsgLy8gIkhvc3QiIHN0YXR1cyBieXRlIDNyZAorICAgICAgfQorICAgICAgCisgICAgfSAgLy8gKGVuZCBvZiBzZW5zZSBsZW4gdmFsaWQpCisKKyAgICAvLyB0aGVyZSBpcyBubyBzZW5zZSBkYXRhIHRvIGhlbHAgb3V0IExpbnV4J3MgU2NzaSBsYXllcnMuLi4KKyAgICAvLyBXZSdsbCBqdXN0IHJldHVybiB0aGUgU2NzaSBzdGF0dXMgYW5kIGhvcGUgaGUgd2lsbCAiZG8gdGhlIAorICAgIC8vIHJpZ2h0IHRoaW5nIgorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBhcyBmYXIgYXMgd2Uga25vdywgdGhlIFNjc2kgc3RhdHVzIGlzIHN1ZmZpY2llbnQKKyAgICAgIENtbmQtPnJlc3VsdCB8PSAoRElEX09LIDw8IDE2KTsgLy8gIkhvc3QiIHN0YXR1cyBieXRlIDNyZAorICAgIH0KKyAgfQorfQorCisKKworLy9QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQICBQQVlMT0FEICBQUFBQUFBQUFAKKy8vIGJ1aWxkIGRhdGEgUEFZTE9BRDsgU0NTSSBGQ1BfQ01ORCBJLlUuCisvLyByZW1lbWJlciBCSUcgRU5ESUFOIHBheWxvYWQgLSBEV29yZCB2YWx1ZXMgbXVzdCBiZSBieXRlLXJldmVyc2VkCisvLyAoaGVuY2UgdGhlIGFmZmluaXR5IGZvciBieXRlIHBvaW50ZXIgYnVpbGRpbmcpLgorCitzdGF0aWMgaW50IGJ1aWxkX0ZDUF9wYXlsb2FkKCBTY3NpX0NtbmQgKkNtbmQsIAorICAgICAgVUNIQVIqIHBheWxvYWQsIFVMT05HIHR5cGUsIFVMT05HIGZjcF9kbCApCit7CisgIGludCBpOworCisgIAorICBzd2l0Y2goIHR5cGUpCisgIHsKKwkJICAKKyAgICBjYXNlIFNDU0lfSVdFOiAKKyAgICBjYXNlIFNDU0lfSVJFOiAgICAgICAgCisgICAgICAvLyA4IGJ5dGVzIEZDUF9MVU4KKyAgICAgIC8vIFBlcmlwaGVyYWwgRGV2aWNlIG9yIFZvbHVtZSBTZXQgYWRkcmVzc2luZywgYW5kIExVTiBtYXBwaW5nCisgICAgICAvLyBXaGVuIHRoZSBGQyBwb3J0IHdhcyBsb29rZWQgdXAsIHdlIGNvcGllZCBhZGRyZXNzIG1vZGUKKyAgICAgIC8vIGFuZCBhbnkgTFVOIG1hc2sgdG8gdGhlIHNjcmF0Y2ggcGFkIFNDcC5waGFzZSAmIC5tb2RlCisKKyAgICAgICpwYXlsb2FkKysgPSAoVUNIQVIpQ21uZC0+U0NwLnBoYXNlOworCisgICAgICAvLyBOb3csIGJlY2F1c2Ugb2YgImx1biBtYXNraW5nIiAKKyAgICAgIC8vIChha2Egc2VsZWN0aXZlIHN0b3JhZ2UgcHJlc2VudGF0aW9uKSwKKyAgICAgIC8vIHRoZSBjb250aWd1b3VzIExpbnV4IFNjc2kgbHVuIG51bWJlciBtYXkgbm90IG1hdGNoIHRoZQorICAgICAgLy8gZGV2aWNlJ3MgbHVuIG51bWJlciwgc28gd2UgbWF5IGhhdmUgdG8gIm1hcCIuICAKKyAgICAgIAorICAgICAgKnBheWxvYWQrKyA9IChVQ0hBUilDbW5kLT5TQ3AuaGF2ZV9kYXRhX2luOworICAgICAgCisgICAgICAvLyBXZSBkb24ndCBrbm93IG9mIGFueW9uZSBpbiB0aGUgRkMgYnVzaW5lc3MgdXNpbmcgdGhlc2UgCisgICAgICAvLyBleHRyYSAibGV2ZWxzIiBvZiBhZGRyZXNzaW5nLiAgSW4gZmFjdCwgY29uZnVzaW9uIHN0aWxsIGV4aXN0cworICAgICAgLy8ganVzdCB1c2luZyB0aGUgRklSU1QgbGV2ZWwuLi4gOy0pCisgICAgICAKKyAgICAgICpwYXlsb2FkKysgPSAwOyAgLy8gMm5kIGxldmVsIGFkZHJlc3NpbmcKKyAgICAgICpwYXlsb2FkKysgPSAwOworICAgICAgKnBheWxvYWQrKyA9IDA7ICAvLyAzcmQgbGV2ZWwgYWRkcmVzc2luZworICAgICAgKnBheWxvYWQrKyA9IDA7CisgICAgICAqcGF5bG9hZCsrID0gMDsgIC8vIDR0aCBsZXZlbCBhZGRyZXNzaW5nCisgICAgICAqcGF5bG9hZCsrID0gMDsKKworICAgICAgLy8gNCBieXRlcyBDb250cm9sIEZpZWxkIEZDUF9DTlRMCisgICAgICAqcGF5bG9hZCsrID0gMDsgICAgLy8gYnl0ZSAwOiAoTVNCKSByZXNlcnZlZAorICAgICAgKnBheWxvYWQrKyA9IDA7ICAgIC8vIGJ5dGUgMTogdGFzayBjb2RlcworCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZSAyOiB0YXNrIG1hbmFnZW1lbnQgZmxhZ3MKKyAgICAgIC8vIGFub3RoZXIgInVzZSIgb2YgdGhlIHNwYXJlIGZpZWxkIHRvIGFjY29tcGxpc2ggVERSCisgICAgICAvLyBub3RlIGNvbWJpbmF0aW9uIG5lZWRlZAorICAgICAgaWYoIChDbW5kLT5jbW5kWzBdID09IFJFTEVBU0UpICYmCisgICAgICAgICAgKENtbmQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID09IEZDUF9UQVJHRVRfUkVTRVQpICkKKyAgICAgIHsKKyAgICAgICAgQ21uZC0+Y21uZFswXSA9IDA7ICAgIC8vIGlzc3VlICJUZXN0IFVuaXQgUmVhZHkiIGZvciBURFIKKyAgICAgICAgKnBheWxvYWQrKyA9IDB4MjA7ICAgIC8vIHRhcmdldCBkZXZpY2UgcmVzZXQgYml0CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICpwYXlsb2FkKysgPSAwOyAgICAvLyBubyBURFIKKwkJICAgICAgLy8gYnl0ZSAzOiAoTFNCKSBleGVjdXRpb24gbWFuYWdlbWVudCBjb2RlcworCQkgICAgICAvLyBiaXQgMCB3cml0ZSwgYml0IDEgcmVhZCAoZG9uJ3Qgc2V0IHRvZ2V0aGVyKQorICAgICAgCisgICAgICBpZiggZmNwX2RsICE9IDAgKQorICAgICAgeworICAgICAgICBpZiggdHlwZSA9PSBTQ1NJX0lXRSApICAgICAgICAgLy8gV1JJVEUKKyAgICAgICAgICAqcGF5bG9hZCsrID0gMTsKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJFQUQKKyAgICAgICAgICAqcGF5bG9hZCsrID0gMjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKwkvLyBPbiBzb21lIGRldmljZXMsIGlmIFJEIG9yIFdSIGJpdHMgYXJlIHNldCwKKwkvLyBhbmQgZmNwX2RsIGlzIDAsIHRoZXkgd2lsbCBnZW5lcmF0ZSBhbiBlcnJvciBvbiB0aGUgY29tbWFuZC4KKwkvLyAoaS5lLiwgaWYgZGlyZWN0aW9uIGlzIHNwZWNpZmllZCwgdGhleSBpbnNpc3Qgb24gYSBsZW5ndGgpLgorCSpwYXlsb2FkKysgPSAwOyAgICAgICAgICAgICAgICAvLyBubyBkYXRhIChuZWNlc3NhcnkgZm9yIENQUSkKKyAgICAgIH0KKworCisgICAgICAvLyBOT1RFOiBjbGVhbiB0aGlzIHVwIGlmL3doZW4gTUFYX0NPTU1BTkRfU0laRSBpcyBpbmNyZWFzZWQgdG8gMTYKKyAgICAgIC8vIEZDUF9DREIgYWxsb3dzIDE2IGJ5dGUgU0NTSSBjb21tYW5kIGRlc2NyaXB0b3IgYmxrOworICAgICAgLy8gTGludXggU0NTSSBDREIgYXJyYXkgaXMgTUFYX0NPTU1BTkRfU0laRSAoMTIgYXQgdGhpcyB0aW1lLi4uKQorICAgICAgZm9yKCBpPTA7IChpIDwgQ21uZC0+Y21kX2xlbikgJiYgaSA8IE1BWF9DT01NQU5EX1NJWkU7IGkrKykKKwkqcGF5bG9hZCsrID0gQ21uZC0+Y21uZFtpXTsKKworICAgICAgLy8gaWYoIENtbmQtPmNtZF9sZW4gPT0gMTYgKQorICAgICAgLy8geworICAgICAgLy8gIG1lbWNweSggcGF5bG9hZCwgJkNtbmQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsLCA0KTsKKyAgICAgIC8vIH0KKyAgICAgIHBheWxvYWQrPSAoMTYgLSBpKTsgIAorCisJCSAgICAgIC8vIEZDUF9ETCBpcyBsYXJnZXN0IG51bWJlciBvZiBleHBlY3RlZCBkYXRhIGJ5dGVzCisJCSAgICAgIC8vIHBlciBDREIgKGkuZS4gcmVhZC93cml0ZSBjb21tYW5kKQorICAgICAgKnBheWxvYWQrKyA9IChVQ0hBUikoZmNwX2RsID4+MjQpOyAgLy8gKE1TQikgOCBieXRlcyBkYXRhIGxlbiBGQ1BfREwKKyAgICAgICpwYXlsb2FkKysgPSAoVUNIQVIpKGZjcF9kbCA+PjE2KTsKKyAgICAgICpwYXlsb2FkKysgPSAoVUNIQVIpKGZjcF9kbCA+PjgpOworICAgICAgKnBheWxvYWQrKyA9IChVQ0hBUilmY3BfZGw7ICAgIC8vIChMU0IpCisgICAgICBicmVhazsKKworICAgIGNhc2UgU0NTSV9UV0U6ICAgICAgICAgIC8vIG5lZWQgRkNQX1hGRVJfUkRZCisgICAgICAqcGF5bG9hZCsrID0gMDsgICAgIC8vICg0IGJ5dGVzKSBEQVRBX1JPIChNU0IgYnl0ZSAwKQorICAgICAgKnBheWxvYWQrKyA9IDA7CisgICAgICAqcGF5bG9hZCsrID0gMDsKKyAgICAgICpwYXlsb2FkKysgPSAwOyAgICAgLy8gTFNCIChieXRlIDMpCisJCQkgICAgIC8vICg0IGJ5dGVzKSBCVVJTVF9MRU4KKwkJCSAgICAgLy8gc2l6ZSBvZiBmb2xsb3dpbmcgRkNQX0RBVEEgcGF5bG9hZAorICAgICAgKnBheWxvYWQrKyA9IChVQ0hBUikoZmNwX2RsID4+MjQpOyAgLy8gKE1TQikgOCBieXRlcyBkYXRhIGxlbiBGQ1BfREwKKyAgICAgICpwYXlsb2FkKysgPSAoVUNIQVIpKGZjcF9kbCA+PjE2KTsKKyAgICAgICpwYXlsb2FkKysgPSAoVUNIQVIpKGZjcF9kbCA+PjgpOworICAgICAgKnBheWxvYWQrKyA9IChVQ0hBUilmY3BfZGw7ICAgIC8vIChMU0IpCisJCSAgICAgICAvLyA0IGJ5dGVzIFJFU0VSVkVECisgICAgICAqcGF5bG9hZCsrID0gMDsKKyAgICAgICpwYXlsb2FkKysgPSAwOworICAgICAgKnBheWxvYWQrKyA9IDA7CisgICAgICAqcGF5bG9hZCsrID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeWJlcnN0b3JtLmMgYi9kcml2ZXJzL3Njc2kvY3liZXJzdG9ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYmNhODVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2N5YmVyc3Rvcm0uYwpAQCAtMCwwICsxLDM3NyBAQAorLyogY3liZXJzdG9ybS5jOiBEcml2ZXIgZm9yIEN5YmVyU3Rvcm0gU0NTSSBDb250cm9sbGVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKQorICoKKyAqIFRoZSBDeWJlclN0b3JtIFNDU0kgZHJpdmVyIGlzIGJhc2VkIG9uIERhdmlkIFMuIE1pbGxlcidzIEVTUCBkcml2ZXIKKyAqIGZvciB0aGUgU3BhcmMgY29tcHV0ZXJzLiAKKyAqIAorICogVGhpcyB3b3JrIHdhcyBtYWRlIHBvc3NpYmxlIGJ5IFBoYXNlNSB3aG8gd2lsbGluZ2x5IChhbmQgbW9zdCBnZW5lcm91c2x5KQorICogc3VwcG9ydGVkIG1lIHdpdGggaGFyZHdhcmUgYW5kIGFsbCB0aGUgaW5mb3JtYXRpb24gSSBuZWVkZWQuCisgKi8KKworLyogVE9ETzoKKyAqCisgKiAxKSBGaWd1cmUgb3V0IGhvdyB0byBtYWtlIGEgY2xlYW5lciBtZXJnZSB3aXRoIHRoZSBzcGFyYyBkcml2ZXIgd2l0aCByZWdhcmQKKyAqICAgIHRvIHRoZSBjYWNoZXMgYW5kIHRoZSBTcGFyYyBNTVUgbWFwcGluZy4KKyAqIDIpIE1ha2UgYXMgZmV3IHJvdXRpbmVzIHJlcXVpcmVkIG91dHNpZGUgdGhlIGdlbmVyaWMgZHJpdmVyLiBBIGxvdCBvZiB0aGUKKyAqICAgIHJvdXRpbmVzIGluIHRoaXMgZmlsZSB1c2VkIHRvIGJlIGlubGluZSEKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiTkNSNTNDOXguaCIKKworI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgorCisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworLyogVGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGNhbiBiZSBmb3VuZCBpbiB0aGUgWjIgY29uZmlnIGFyZWEgYXQgdGhlc2UKKyAqIG9mZnNldHM6CisgKi8KKyNkZWZpbmUgQ1lCRVJfRVNQX0FERFIgMHhmNDAwCisjZGVmaW5lIENZQkVSX0RNQV9BRERSIDB4ZjgwMAorCisKKy8qIFRoZSBDeWJlclN0b3JtIERNQSBpbnRlcmZhY2UgKi8KK3N0cnVjdCBjeWJlcl9kbWFfcmVnaXN0ZXJzIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9hZGRyMDsJLyogRE1BIGFkZHJlc3MgKE1TQikgWzB4MDAwXSAqLworCXVuc2lnbmVkIGNoYXIgZG1hcGFkMVsxXTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9hZGRyMTsJLyogRE1BIGFkZHJlc3MgICAgICAgWzB4MDAyXSAqLworCXVuc2lnbmVkIGNoYXIgZG1hcGFkMlsxXTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9hZGRyMjsJLyogRE1BIGFkZHJlc3MgICAgICAgWzB4MDA0XSAqLworCXVuc2lnbmVkIGNoYXIgZG1hcGFkM1sxXTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9hZGRyMzsJLyogRE1BIGFkZHJlc3MgKExTQikgWzB4MDA2XSAqLworCXVuc2lnbmVkIGNoYXIgZG1hcGFkNFsweDNmYl07CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjb25kX3JlZzsgICAgICAgIC8qIERNQSBjb25kICAgIChybykgIFsweDQwMl0gKi8KKyNkZWZpbmUgY3RybF9yZWcgIGNvbmRfcmVnCQkJLyogRE1BIGNvbnRyb2wgKHdvKSAgWzB4NDAyXSAqLworfTsKKworLyogRE1BIGNvbnRyb2wgYml0cyAqLworI2RlZmluZSBDWUJFUl9ETUFfTEVEICAgIDB4ODAJLyogSEQgbGVkIGNvbnRyb2wgMSA9IG9uICovCisjZGVmaW5lIENZQkVSX0RNQV9XUklURSAgMHg0MAkvKiBETUEgZGlyZWN0aW9uLiAxID0gd3JpdGUgKi8KKyNkZWZpbmUgQ1lCRVJfRE1BX1ozICAgICAweDIwCS8qIDE2IChaMikgb3IgMzIgKENISVAvWjMpIGJpdCBETUEgdHJhbnNmZXIgKi8KKworLyogRE1BIHN0YXR1cyBiaXRzICovCisjZGVmaW5lIENZQkVSX0RNQV9ITkRMX0lOVFIgMHg4MAkvKiBETUEgSVJRIHBlbmRpbmc/ICovCisKKy8qIFRoZSBiaXRzIGJlbG93IGFwcGVhcnMgdG8gYmUgUGhhc2U1IERlYnVnIGJpdHMgb25seTsgdGhleSB3ZXJlIG5vdAorICogZGVzY3JpYmVkIGJ5IFBoYXNlNSBzbyB1c2luZyB0aGVtIG1heSBzZWVtIGEgYml0IHN0dXBpZC4uLgorICovCisjZGVmaW5lIENZQkVSX0hPU1RfSUQgMHgwMgkvKiBJZiBzZXQsIGhvc3QgSUQgc2hvdWxkIGJlIDcsIG90aGVyd2lzZQorCQkJCSAqIGl0IHNob3VsZCBiZSA2LgorCQkJCSAqLworI2RlZmluZSBDWUJFUl9TTE9XX0NBQkxFIDB4MDgJLyogSWYgKm5vdCogc2V0LCBhc3N1bWUgU0xPV19DQUJMRSAqLworCitzdGF0aWMgaW50ICBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCk7CitzdGF0aWMgaW50ICBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApOworc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpOworc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY3RybF9kYXRhID0gMDsJLyogS2VlcCBiYWNrdXAgb2YgdGhlIHN0dWZmIHdyaXR0ZW4KKwkJCQkgKiB0byBjdHJsX3JlZy4gQWx3YXlzIHdyaXRlIGEgY29weQorCQkJCSAqIHRvIHRoaXMgcmVnaXN0ZXIgd2hlbiB3cml0aW5nIHRvCisJCQkJICogdGhlIGhhcmR3YXJlIHJlZ2lzdGVyIQorCQkJCSAqLworCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzE2XTsKKwkJCQkvKiBUaGlzIGlzIHdoZXJlIGFsbCBjb21tYW5kcyBhcmUgcHV0CisJCQkJICogYmVmb3JlIHRoZXkgYXJlIHRyYW5zZmVycmVkIHRvIHRoZSBFU1AgY2hpcAorCQkJCSAqIHZpYSBQSU8uCisJCQkJICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZXRlY3Rpb24gKi8KK2ludCBfX2luaXQgY3liZXJfZXNwX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQpCit7CisJc3RydWN0IE5DUl9FU1AgKmVzcDsKKwlzdHJ1Y3Qgem9ycm9fZGV2ICp6ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisKKwl3aGlsZSAoKHogPSB6b3Jyb19maW5kX2RldmljZShaT1JST19XSUxEQ0FSRCwgeikpKSB7CisJICAgIHVuc2lnbmVkIGxvbmcgYm9hcmQgPSB6LT5yZXNvdXJjZS5zdGFydDsKKwkgICAgaWYgKCh6LT5pZCA9PSBaT1JST19QUk9EX1BIQVNFNV9CTElaWkFSRF8xMjIwX0NZQkVSU1RPUk0gfHwKKwkJIHotPmlkID09IFpPUlJPX1BST0RfUEhBU0U1X0JMSVpaQVJEXzEyMzBfSUlfRkFTVExBTkVfWjNfQ1lCRVJTQ1NJX0NZQkVSU1RPUk0wNjApICYmCisJCXJlcXVlc3RfbWVtX3JlZ2lvbihib2FyZCtDWUJFUl9FU1BfQUREUiwKKwkJICAgIAkJICAgc2l6ZW9mKHN0cnVjdCBFU1BfcmVncyksICJOQ1I1M0M5eCIpKSB7CisJCS8qIEZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBhIEN5YmVyU3Rvcm0gb3IgcmVhbGx5IGEgCisJCSAqIEZhc3RsYW5lL0JsaXp6YXJkIE1rIElJIGJ5IGxvb2tpbmcgYXQgdGhlIGJvYXJkIHNpemUuCisJCSAqIEN5YmVyU3Rvcm0gbWFwcyA2NGtCCisJCSAqIChaT1JST19QUk9EX1BIQVNFNV9CTElaWkFSRF8xMjIwX0NZQkVSU1RPUk0gZG9lcyBhbnl3YXkpCisJCSAqLworCQlpZih6LT5yZXNvdXJjZS5lbmQtYm9hcmQgIT0gMHhmZmZmKSB7CisJCQlyZWxlYXNlX21lbV9yZWdpb24oYm9hcmQrQ1lCRVJfRVNQX0FERFIsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgRVNQX3JlZ3MpKTsKKwkJCXJldHVybiAwOworCQl9CisJCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCAodm9pZCAqKWJvYXJkK0NZQkVSX0VTUF9BRERSKTsKKworCQkvKiBEbyBjb21tYW5kIHRyYW5zZmVyIHdpdGggcHJvZ3JhbW1lZCBJL08gKi8KKwkJZXNwLT5kb19waW9fY21kcyA9IDE7CisKKwkJLyogUmVxdWlyZWQgZnVuY3Rpb25zICovCisJCWVzcC0+ZG1hX2J5dGVzX3NlbnQgPSAmZG1hX2J5dGVzX3NlbnQ7CisJCWVzcC0+ZG1hX2Nhbl90cmFuc2ZlciA9ICZkbWFfY2FuX3RyYW5zZmVyOworCQllc3AtPmRtYV9kdW1wX3N0YXRlID0gJmRtYV9kdW1wX3N0YXRlOworCQllc3AtPmRtYV9pbml0X3JlYWQgPSAmZG1hX2luaXRfcmVhZDsKKwkJZXNwLT5kbWFfaW5pdF93cml0ZSA9ICZkbWFfaW5pdF93cml0ZTsKKwkJZXNwLT5kbWFfaW50c19vZmYgPSAmZG1hX2ludHNfb2ZmOworCQllc3AtPmRtYV9pbnRzX29uID0gJmRtYV9pbnRzX29uOworCQllc3AtPmRtYV9pcnFfcCA9ICZkbWFfaXJxX3A7CisJCWVzcC0+ZG1hX3BvcnRzX3AgPSAmZG1hX3BvcnRzX3A7CisJCWVzcC0+ZG1hX3NldHVwID0gJmRtYV9zZXR1cDsKKworCQkvKiBPcHRpb25hbCBmdW5jdGlvbnMgKi8KKwkJZXNwLT5kbWFfYmFycmllciA9IDA7CisJCWVzcC0+ZG1hX2RyYWluID0gMDsKKwkJZXNwLT5kbWFfaW52YWxpZGF0ZSA9IDA7CisJCWVzcC0+ZG1hX2lycV9lbnRyeSA9IDA7CisJCWVzcC0+ZG1hX2lycV9leGl0ID0gMDsKKwkJZXNwLT5kbWFfbGVkX29uID0gJmRtYV9sZWRfb247CisJCWVzcC0+ZG1hX2xlZF9vZmYgPSAmZG1hX2xlZF9vZmY7CisJCWVzcC0+ZG1hX3BvbGwgPSAwOworCQllc3AtPmRtYV9yZXNldCA9IDA7CisKKwkJLyogU0NTSSBjaGlwIHNwZWVkICovCisJCWVzcC0+Y2ZyZXEgPSA0MDAwMDAwMDsKKworCQkvKiBUaGUgRE1BIHJlZ2lzdGVycyBvbiB0aGUgQ3liZXJTdG9ybSBhcmUgbWFwcGVkCisJCSAqIHJlbGF0aXZlIHRvIHRoZSBkZXZpY2UgKGkuZS4gaW4gdGhlIHNhbWUgWm9ycm8KKwkJICogSS9PIGJsb2NrKS4KKwkJICovCisJCWFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylaVFdPX1ZBRERSKGJvYXJkKTsKKwkJZXNwLT5kcmVncyA9ICh2b2lkICopKGFkZHJlc3MgKyBDWUJFUl9ETUFfQUREUik7CisKKwkJLyogRVNQIHJlZ2lzdGVyIGJhc2UgKi8KKwkJZXNwLT5lcmVncyA9IChzdHJ1Y3QgRVNQX3JlZ3MgKikoYWRkcmVzcyArIENZQkVSX0VTUF9BRERSKTsKKwkJCisJCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIgKi8KKwkJZXNwLT5lc3BfY29tbWFuZCA9IGNtZF9idWZmZXI7CisJCWVzcC0+ZXNwX2NvbW1hbmRfZHZtYSA9IHZpcnRfdG9fYnVzKCh2b2lkICopY21kX2J1ZmZlcik7CisKKwkJZXNwLT5pcnEgPSBJUlFfQU1JR0FfUE9SVFM7CisJCXJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgZXNwX2ludHIsIFNBX1NISVJRLAorCQkJICAgICJDeWJlclN0b3JtIFNDU0kiLCBlc3AtPmVob3N0KTsKKwkJLyogRmlndXJlIG91dCBvdXIgc2NzaSBJRCBvbiB0aGUgYnVzICovCisJCS8qIFRoZSBETUEgY29uZCBmbGFnIGNvbnRhaW5zIGEgaGFyZGNvZGVkIGp1bXBlciBiaXQKKwkJICogd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2VsZWN0IGhvc3QgbnVtYmVyIDYgb3IgNy4KKwkJICogSG93ZXZlciwgZXZlbiB0aG91Z2ggaXQgbWF5IGNoYW5nZSwgd2UgdXNlIGEgaGFyZGNvZGVkCisJCSAqIHZhbHVlIG9mIDcuCisJCSAqLworCQllc3AtPnNjc2lfaWQgPSA3OworCQkKKwkJLyogV2UgZG9uJ3QgaGF2ZSBhIGRpZmZlcmVudGlhbCBTQ1NJLWJ1cy4gKi8KKwkJZXNwLT5kaWZmID0gMDsKKworCQllc3BfaW5pdGlhbGl6ZShlc3ApOworCisJCXByaW50aygiRVNQOiBUb3RhbCBvZiAlZCBFU1AgaG9zdHMgZm91bmQsICVkIGFjdHVhbGx5IGluIHVzZS5cbiIsIG5lc3BzLCBlc3BzX2luX3VzZSk7CisJCWVzcHNfcnVubmluZyA9IGVzcHNfaW5fdXNlOworCQlyZXR1cm4gZXNwc19pbl91c2U7CisJICAgIH0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERNQSBGdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgZG1hX2J5dGVzX3NlbnQoc3RydWN0IE5DUl9FU1AgKmVzcCwgaW50IGZpZm9fY291bnQpCit7CisJLyogU2luY2UgdGhlIEN5YmVyU3Rvcm0gRE1BIGlzIGZ1bGx5IGRlZGljYXRlZCB0byB0aGUgRVNQIGNoaXAsCisJICogdGhlIG51bWJlciBvZiBieXRlcyBzZW50ICh0byB0aGUgRVNQIGNoaXApIGVxdWFscyB0aGUgbnVtYmVyCisJICogb2YgYnl0ZXMgaW4gdGhlIEZJRk8gLSB0aGVyZSBpcyBubyBidWZmZXJpbmcgaW4gdGhlIERNQSBjb250cm9sbGVyLgorCSAqIFhYWFggRG8gSSByZWFkIHRoaXMgcmlnaHQ/IEl0IGlzIGZyb20gaG9zdCB0byBFU1AsIHJpZ2h0PworCSAqLworCXJldHVybiBmaWZvX2NvdW50OworfQorCitzdGF0aWMgaW50IGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKK3sKKwkvKiBJIGRvbid0IHRoaW5rIHRoZXJlJ3MgYW55IGxpbWl0IG9uIHRoZSBDeWJlckRNQS4gU28gd2UgdXNlIHdoYXQKKwkgKiB0aGUgRVNQIGNoaXAgY2FuIGhhbmRsZSAoMjQgYml0KS4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIHN6ID0gc3AtPlNDcC50aGlzX3Jlc2lkdWFsOworCWlmKHN6ID4gMHgxMDAwMDAwKQorCQlzeiA9IDB4MTAwMDAwMDsKKwlyZXR1cm4gc3o7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJRVNQTE9HKCgiZXNwJWQ6IGRtYSAtLSBjb25kX3JlZzwlMDJ4PlxuIiwKKwkJZXNwLT5lc3BfaWQsICgoc3RydWN0IGN5YmVyX2RtYV9yZWdpc3RlcnMgKikKKwkJCSAgICAgIChlc3AtPmRyZWdzKSktPmNvbmRfcmVnKSk7CisJRVNQTE9HKCgiaW50cmVxOjwlMDR4PiwgaW50ZW5hOjwlMDR4PlxuIiwKKwkJY3VzdG9tLmludHJlcXIsIGN1c3RvbS5pbnRlbmFyKSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgY3liZXJfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKKwkJKHN0cnVjdCBjeWJlcl9kbWFfcmVnaXN0ZXJzICopIGVzcC0+ZHJlZ3M7CisKKwljYWNoZV9jbGVhcihhZGRyLCBsZW5ndGgpOworCisJYWRkciAmPSB+KDEpOworCWRyZWdzLT5kbWFfYWRkcjAgPSAoYWRkciA+PiAyNCkgJiAweGZmOworCWRyZWdzLT5kbWFfYWRkcjEgPSAoYWRkciA+PiAxNikgJiAweGZmOworCWRyZWdzLT5kbWFfYWRkcjIgPSAoYWRkciA+PiAgOCkgJiAweGZmOworCWRyZWdzLT5kbWFfYWRkcjMgPSAoYWRkciAgICAgICkgJiAweGZmOworCWN0cmxfZGF0YSAmPSB+KENZQkVSX0RNQV9XUklURSk7CisKKwkvKiBDaGVjayBpZiBwaHlzaWNhbCBhZGRyZXNzIGlzIG91dHNpZGUgWjIgc3BhY2UgYW5kIG9mCisJICogYmxvY2sgbGVuZ3RoL2Jsb2NrIGFsaWduZWQgaW4gbWVtb3J5LiBJZiB0aGlzIGlzIHRoZQorCSAqIGNhc2UsIGVuYWJsZSAzMiBiaXQgdHJhbnNmZXIuIEluIGFsbCBvdGhlciBjYXNlcywgZmFsbCBiYWNrCisJICogdG8gMTYgYml0IHRyYW5zZmVyLgorCSAqIE9idmlvdXNseSAzMiBiaXQgdHJhbnNmZXIgc2hvdWxkIGJlIGVuYWJsZWQgaWYgdGhlIERNQSBhZGRyZXNzCisJICogYW5kIGxlbmd0aCBhcmUgMzIgYml0IGFsaWduZWQuIEhvd2V2ZXIsIHRoaXMgbGVhZHMgdG8gc29tZQorCSAqIHN0cmFuZ2UgYmVoYXZpb3IuIEV2ZW4gNjQgYml0IGFsaWduZWQgYWRkci9sZW5ndGggZmFpbHMuCisJICogVW50aWwgSSd2ZSBmb3VuZCBhIHJlYXNvbiBmb3IgdGhpcywgMzIgYml0IHRyYW5zZmVyIGlzIG9ubHkKKwkgKiB1c2VkIGZvciBmdWxsLWJsb2NrIHRyYW5zZmVycyAoMWtCKS4KKwkgKgkJCQkJCQktanNrb3YKKwkgKi8KKyNpZiAwCisJaWYoKGFkZHIgJiAweDNmYykgfHwgbGVuZ3RoICYgMHgzZmYgfHwgKChhZGRyID4gMHgyMDAwMDApICYmCisJCQkJCQkoYWRkciA8IDB4ZmYwMDAwKSkpCisJCWN0cmxfZGF0YSAmPSB+KENZQkVSX0RNQV9aMyk7CS8qIFoyLCBkbyAxNiBiaXQgRE1BICovCisJZWxzZQorCQljdHJsX2RhdGEgfD0gQ1lCRVJfRE1BX1ozOyAvKiBDSElQL1ozLCBkbyAzMiBiaXQgRE1BICovCisjZWxzZQorCWN0cmxfZGF0YSAmPSB+KENZQkVSX0RNQV9aMyk7CS8qIFoyLCBkbyAxNiBiaXQgRE1BICovCisjZW5kaWYKKwlkcmVncy0+Y3RybF9yZWcgPSBjdHJsX2RhdGE7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpCit7CisJc3RydWN0IGN5YmVyX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0gCisJCShzdHJ1Y3QgY3liZXJfZG1hX3JlZ2lzdGVycyAqKSBlc3AtPmRyZWdzOworCisJY2FjaGVfcHVzaChhZGRyLCBsZW5ndGgpOworCisJYWRkciB8PSAxOworCWRyZWdzLT5kbWFfYWRkcjAgPSAoYWRkciA+PiAyNCkgJiAweGZmOworCWRyZWdzLT5kbWFfYWRkcjEgPSAoYWRkciA+PiAxNikgJiAweGZmOworCWRyZWdzLT5kbWFfYWRkcjIgPSAoYWRkciA+PiAgOCkgJiAweGZmOworCWRyZWdzLT5kbWFfYWRkcjMgPSAoYWRkciAgICAgICkgJiAweGZmOworCWN0cmxfZGF0YSB8PSBDWUJFUl9ETUFfV1JJVEU7CisKKwkvKiBTZWUgY29tbWVudCBhYm92ZSAqLworI2lmIDAKKwlpZigoYWRkciAmIDB4M2ZjKSB8fCBsZW5ndGggJiAweDNmZiB8fCAoKGFkZHIgPiAweDIwMDAwMCkgJiYKKwkJCQkJCShhZGRyIDwgMHhmZjAwMDApKSkKKwkJY3RybF9kYXRhICY9IH4oQ1lCRVJfRE1BX1ozKTsJLyogWjIsIGRvIDE2IGJpdCBETUEgKi8KKwllbHNlCisJCWN0cmxfZGF0YSB8PSBDWUJFUl9ETUFfWjM7IC8qIENISVAvWjMsIGRvIDMyIGJpdCBETUEgKi8KKyNlbHNlCisJY3RybF9kYXRhICY9IH4oQ1lCRVJfRE1BX1ozKTsJLyogWjIsIGRvIDE2IGJpdCBETUEgKi8KKyNlbmRpZgorCWRyZWdzLT5jdHJsX3JlZyA9IGN0cmxfZGF0YTsKK30KKworc3RhdGljIHZvaWQgZG1hX2ludHNfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJZGlzYWJsZV9pcnEoZXNwLT5pcnEpOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCWVuYWJsZV9pcnEoZXNwLT5pcnEpOworfQorCitzdGF0aWMgaW50IGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCS8qIEl0J3MgaW1wb3J0YW50IHRvIGNoZWNrIHRoZSBETUEgSVJRIGJpdCBpbiB0aGUgY29ycmVjdCB3YXkhICovCisJcmV0dXJuICgoZXNwX3JlYWQoZXNwLT5lcmVncy0+ZXNwX3N0YXR1cykgJiBFU1BfU1RBVF9JTlRSKSAmJgorCQkoKCgoc3RydWN0IGN5YmVyX2RtYV9yZWdpc3RlcnMgKikoZXNwLT5kcmVncykpLT5jb25kX3JlZykgJgorCQkgQ1lCRVJfRE1BX0hORExfSU5UUikpOworfQorCitzdGF0aWMgdm9pZCBkbWFfbGVkX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCWN0cmxfZGF0YSAmPSB+Q1lCRVJfRE1BX0xFRDsKKwkoKHN0cnVjdCBjeWJlcl9kbWFfcmVnaXN0ZXJzICopKGVzcC0+ZHJlZ3MpKS0+Y3RybF9yZWcgPSBjdHJsX2RhdGE7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb24oc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwljdHJsX2RhdGEgfD0gQ1lCRVJfRE1BX0xFRDsKKwkoKHN0cnVjdCBjeWJlcl9kbWFfcmVnaXN0ZXJzICopKGVzcC0+ZHJlZ3MpKS0+Y3RybF9yZWcgPSBjdHJsX2RhdGE7Cit9CisKK3N0YXRpYyBpbnQgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlyZXR1cm4gKChjdXN0b20uaW50ZW5hcikgJiBJRl9QT1JUUyk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSkKK3sKKwkvKiBPbiB0aGUgU3BhcmMsIERNQV9TVF9XUklURSBtZWFucyAibW92ZSBkYXRhIGZyb20gZGV2aWNlIHRvIG1lbW9yeSIKKwkgKiBzbyB3aGVuICh3cml0ZSkgaXMgdHJ1ZSwgaXQgYWN0dWFsbHkgbWVhbnMgUkVBRCEKKwkgKi8KKwlpZih3cml0ZSl7CisJCWRtYV9pbml0X3JlYWQoZXNwLCBhZGRyLCBjb3VudCk7CisJfSBlbHNlIHsKKwkJZG1hX2luaXRfd3JpdGUoZXNwLCBhZGRyLCBjb3VudCk7CisJfQorfQorCisjZGVmaW5lIEhPU1RTX0MKKworaW50IGN5YmVyX2VzcF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworI2lmZGVmIE1PRFVMRQorCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSgoc3RydWN0IE5DUl9FU1AgKilpbnN0YW5jZS0+aG9zdGRhdGEpLT5lZGV2OworCisJZXNwX2RlYWxsb2NhdGUoKHN0cnVjdCBOQ1JfRVNQICopaW5zdGFuY2UtPmhvc3RkYXRhKTsKKwllc3BfcmVsZWFzZSgpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihhZGRyZXNzLCBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSk7CisJZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBlc3BfaW50cik7CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJlc3AtY3liZXJzdG9ybSIsCisJLnByb2NfaW5mbwkJPSBlc3BfcHJvY19pbmZvLAorCS5uYW1lCQkJPSAiQ3liZXJTdG9ybSBTQ1NJIiwKKwkuZGV0ZWN0CQkJPSBjeWJlcl9lc3BfZGV0ZWN0LAorCS5zbGF2ZV9hbGxvYwkJPSBlc3Bfc2xhdmVfYWxsb2MsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gZXNwX3NsYXZlX2Rlc3Ryb3ksCisJLnJlbGVhc2UJCT0gY3liZXJfZXNwX3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSBlc3BfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBlc3BfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZXNwX3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gNywKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORworfTsKKworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2N5YmVyc3Rvcm1JSS5jIGIvZHJpdmVycy9zY3NpL2N5YmVyc3Rvcm1JSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NWQ5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvY3liZXJzdG9ybUlJLmMKQEAgLTAsMCArMSwzMTQgQEAKKy8qIGN5YmVyc3Rvcm1JSS5jOiBEcml2ZXIgZm9yIEN5YmVyU3Rvcm0gU0NTSSBNayBJSQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKQorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIGN5YmVyc3Rvcm0uYworICovCisKKy8qIFRPRE86CisgKgorICogMSkgRmlndXJlIG91dCBob3cgdG8gbWFrZSBhIGNsZWFuZXIgbWVyZ2Ugd2l0aCB0aGUgc3BhcmMgZHJpdmVyIHdpdGggcmVnYXJkCisgKiAgICB0byB0aGUgY2FjaGVzIGFuZCB0aGUgU3BhcmMgTU1VIG1hcHBpbmcuCisgKiAyKSBNYWtlIGFzIGZldyByb3V0aW5lcyByZXF1aXJlZCBvdXRzaWRlIHRoZSBnZW5lcmljIGRyaXZlci4gQSBsb3Qgb2YgdGhlCisgKiAgICByb3V0aW5lcyBpbiB0aGlzIGZpbGUgdXNlZCB0byBiZSBpbmxpbmUhCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgIk5DUjUzQzl4LmgiCisKKyNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KKworI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKKy8qIFRoZSBjb250cm9sbGVyIHJlZ2lzdGVycyBjYW4gYmUgZm91bmQgaW4gdGhlIFoyIGNvbmZpZyBhcmVhIGF0IHRoZXNlCisgKiBvZmZzZXRzOgorICovCisjZGVmaW5lIENZQkVSSUlfRVNQX0FERFIgMHgxZmYwMworI2RlZmluZSBDWUJFUklJX0RNQV9BRERSIDB4MWZmNDMKKworCisvKiBUaGUgQ3liZXJTdG9ybSBJSSBETUEgaW50ZXJmYWNlICovCitzdHJ1Y3QgY3liZXJJSV9kbWFfcmVnaXN0ZXJzIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGNvbmRfcmVnOyAgICAgICAgLyogRE1BIGNvbmQgICAgKHJvKSAgWzB4MDAwXSAqLworI2RlZmluZSBjdHJsX3JlZyAgY29uZF9yZWcJCQkvKiBETUEgY29udHJvbCAod28pICBbMHgwMDBdICovCisJdW5zaWduZWQgY2hhciBkbWFwYWQ0WzB4M2ZdOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZG1hX2FkZHIwOwkvKiBETUEgYWRkcmVzcyAoTVNCKSBbMHgwNDBdICovCisJdW5zaWduZWQgY2hhciBkbWFwYWQxWzNdOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZG1hX2FkZHIxOwkvKiBETUEgYWRkcmVzcyAgICAgICBbMHgwNDRdICovCisJdW5zaWduZWQgY2hhciBkbWFwYWQyWzNdOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZG1hX2FkZHIyOwkvKiBETUEgYWRkcmVzcyAgICAgICBbMHgwNDhdICovCisJdW5zaWduZWQgY2hhciBkbWFwYWQzWzNdOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZG1hX2FkZHIzOwkvKiBETUEgYWRkcmVzcyAoTFNCKSBbMHgwNGNdICovCit9OworCisvKiBETUEgY29udHJvbCBiaXRzICovCisjZGVmaW5lIENZQkVSSUlfRE1BX0xFRCAgICAweDAyCS8qIEhEIGxlZCBjb250cm9sIDEgPSBvbiAqLworCitzdGF0aWMgaW50ICBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCk7CitzdGF0aWMgaW50ICBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApOworc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpOworc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKTsKKworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlclsxNl07CisJCQkJLyogVGhpcyBpcyB3aGVyZSBhbGwgY29tbWFuZHMgYXJlIHB1dAorCQkJCSAqIGJlZm9yZSB0aGV5IGFyZSB0cmFuc2ZlcnJlZCB0byB0aGUgRVNQIGNoaXAKKwkJCQkgKiB2aWEgUElPLgorCQkJCSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGV0ZWN0aW9uICovCitpbnQgX19pbml0IGN5YmVySUlfZXNwX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQpCit7CisJc3RydWN0IE5DUl9FU1AgKmVzcDsKKwlzdHJ1Y3Qgem9ycm9fZGV2ICp6ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJc3RydWN0IEVTUF9yZWdzICplcmVnczsKKworCWlmICgoeiA9IHpvcnJvX2ZpbmRfZGV2aWNlKFpPUlJPX1BST0RfUEhBU0U1X0NZQkVSU1RPUk1fTUtfSUksIHopKSkgeworCSAgICB1bnNpZ25lZCBsb25nIGJvYXJkID0gei0+cmVzb3VyY2Uuc3RhcnQ7CisJICAgIGlmIChyZXF1ZXN0X21lbV9yZWdpb24oYm9hcmQrQ1lCRVJJSV9FU1BfQUREUiwKKwkJCQkgICBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSwgIk5DUjUzQzl4IikpIHsKKwkJLyogRG8gc29tZSBtYWdpYyB0byBmaWd1cmUgb3V0IGlmIHRoZSBDeWJlclN0b3JtIE1rIElJCisJCSAqIGlzIGVxdWlwcGVkIHdpdGggYSBTQ1NJIGNvbnRyb2xsZXIKKwkJICovCisJCWFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylaVFdPX1ZBRERSKGJvYXJkKTsKKwkJZXJlZ3MgPSAoc3RydWN0IEVTUF9yZWdzICopKGFkZHJlc3MgKyBDWUJFUklJX0VTUF9BRERSKTsKKworCQllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgKHZvaWQgKilib2FyZCtDWUJFUklJX0VTUF9BRERSKTsKKworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmcxLCAoRVNQX0NPTkZJRzFfUEVOQUJMRSB8IDcpKTsKKwkJdWRlbGF5KDUpOworCQlpZihlc3BfcmVhZChlcmVncy0+ZXNwX2NmZzEpICE9IChFU1BfQ09ORklHMV9QRU5BQkxFIHwgNykpIHsKKwkJCWVzcF9kZWFsbG9jYXRlKGVzcCk7CisJCQlzY3NpX3VucmVnaXN0ZXIoZXNwLT5laG9zdCk7CisJCQlyZWxlYXNlX21lbV9yZWdpb24oYm9hcmQrQ1lCRVJJSV9FU1BfQUREUiwKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBFU1BfcmVncykpOworCQkJcmV0dXJuIDA7IC8qIEJhaWwgb3V0IGlmIGFkZHJlc3MgZGlkIG5vdCBob2xkIGRhdGEgKi8KKwkJfQorCisJCS8qIERvIGNvbW1hbmQgdHJhbnNmZXIgd2l0aCBwcm9ncmFtbWVkIEkvTyAqLworCQllc3AtPmRvX3Bpb19jbWRzID0gMTsKKworCQkvKiBSZXF1aXJlZCBmdW5jdGlvbnMgKi8KKwkJZXNwLT5kbWFfYnl0ZXNfc2VudCA9ICZkbWFfYnl0ZXNfc2VudDsKKwkJZXNwLT5kbWFfY2FuX3RyYW5zZmVyID0gJmRtYV9jYW5fdHJhbnNmZXI7CisJCWVzcC0+ZG1hX2R1bXBfc3RhdGUgPSAmZG1hX2R1bXBfc3RhdGU7CisJCWVzcC0+ZG1hX2luaXRfcmVhZCA9ICZkbWFfaW5pdF9yZWFkOworCQllc3AtPmRtYV9pbml0X3dyaXRlID0gJmRtYV9pbml0X3dyaXRlOworCQllc3AtPmRtYV9pbnRzX29mZiA9ICZkbWFfaW50c19vZmY7CisJCWVzcC0+ZG1hX2ludHNfb24gPSAmZG1hX2ludHNfb247CisJCWVzcC0+ZG1hX2lycV9wID0gJmRtYV9pcnFfcDsKKwkJZXNwLT5kbWFfcG9ydHNfcCA9ICZkbWFfcG9ydHNfcDsKKwkJZXNwLT5kbWFfc2V0dXAgPSAmZG1hX3NldHVwOworCisJCS8qIE9wdGlvbmFsIGZ1bmN0aW9ucyAqLworCQllc3AtPmRtYV9iYXJyaWVyID0gMDsKKwkJZXNwLT5kbWFfZHJhaW4gPSAwOworCQllc3AtPmRtYV9pbnZhbGlkYXRlID0gMDsKKwkJZXNwLT5kbWFfaXJxX2VudHJ5ID0gMDsKKwkJZXNwLT5kbWFfaXJxX2V4aXQgPSAwOworCQllc3AtPmRtYV9sZWRfb24gPSAmZG1hX2xlZF9vbjsKKwkJZXNwLT5kbWFfbGVkX29mZiA9ICZkbWFfbGVkX29mZjsKKwkJZXNwLT5kbWFfcG9sbCA9IDA7CisJCWVzcC0+ZG1hX3Jlc2V0ID0gMDsKKworCQkvKiBTQ1NJIGNoaXAgc3BlZWQgKi8KKwkJZXNwLT5jZnJlcSA9IDQwMDAwMDAwOworCisJCS8qIFRoZSBETUEgcmVnaXN0ZXJzIG9uIHRoZSBDeWJlclN0b3JtIGFyZSBtYXBwZWQKKwkJICogcmVsYXRpdmUgdG8gdGhlIGRldmljZSAoaS5lLiBpbiB0aGUgc2FtZSBab3JybworCQkgKiBJL08gYmxvY2spLgorCQkgKi8KKwkJZXNwLT5kcmVncyA9ICh2b2lkICopKGFkZHJlc3MgKyBDWUJFUklJX0RNQV9BRERSKTsKKworCQkvKiBFU1AgcmVnaXN0ZXIgYmFzZSAqLworCQllc3AtPmVyZWdzID0gZXJlZ3M7CisJCQorCQkvKiBTZXQgdGhlIGNvbW1hbmQgYnVmZmVyICovCisJCWVzcC0+ZXNwX2NvbW1hbmQgPSBjbWRfYnVmZmVyOworCQllc3AtPmVzcF9jb21tYW5kX2R2bWEgPSB2aXJ0X3RvX2J1cygodm9pZCAqKWNtZF9idWZmZXIpOworCisJCWVzcC0+aXJxID0gSVJRX0FNSUdBX1BPUlRTOworCQlyZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGVzcF9pbnRyLCBTQV9TSElSUSwKKwkJCSAgICAiQ3liZXJTdG9ybSBTQ1NJIE1rIElJIiwgZXNwLT5laG9zdCk7CisKKwkJLyogRmlndXJlIG91dCBvdXIgc2NzaSBJRCBvbiB0aGUgYnVzICovCisJCWVzcC0+c2NzaV9pZCA9IDc7CisJCQorCQkvKiBXZSBkb24ndCBoYXZlIGEgZGlmZmVyZW50aWFsIFNDU0ktYnVzLiAqLworCQllc3AtPmRpZmYgPSAwOworCisJCWVzcF9pbml0aWFsaXplKGVzcCk7CisKKwkJcHJpbnRrKCJFU1A6IFRvdGFsIG9mICVkIEVTUCBob3N0cyBmb3VuZCwgJWQgYWN0dWFsbHkgaW4gdXNlLlxuIiwgbmVzcHMsIGVzcHNfaW5fdXNlKTsKKwkJZXNwc19ydW5uaW5nID0gZXNwc19pbl91c2U7CisJCXJldHVybiBlc3BzX2luX3VzZTsKKwkgICAgfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRE1BIEZ1bmN0aW9ucyAqLworc3RhdGljIGludCBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCkKK3sKKwkvKiBTaW5jZSB0aGUgQ3liZXJTdG9ybSBETUEgaXMgZnVsbHkgZGVkaWNhdGVkIHRvIHRoZSBFU1AgY2hpcCwKKwkgKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQgKHRvIHRoZSBFU1AgY2hpcCkgZXF1YWxzIHRoZSBudW1iZXIKKwkgKiBvZiBieXRlcyBpbiB0aGUgRklGTyAtIHRoZXJlIGlzIG5vIGJ1ZmZlcmluZyBpbiB0aGUgRE1BIGNvbnRyb2xsZXIuCisJICogWFhYWCBEbyBJIHJlYWQgdGhpcyByaWdodD8gSXQgaXMgZnJvbSBob3N0IHRvIEVTUCwgcmlnaHQ/CisJICovCisJcmV0dXJuIGZpZm9fY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2Nhbl90cmFuc2ZlcihzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKQoreworCS8qIEkgZG9uJ3QgdGhpbmsgdGhlcmUncyBhbnkgbGltaXQgb24gdGhlIEN5YmVyRE1BLiBTbyB3ZSB1c2Ugd2hhdAorCSAqIHRoZSBFU1AgY2hpcCBjYW4gaGFuZGxlICgyNCBiaXQpLgorCSAqLworCXVuc2lnbmVkIGxvbmcgc3ogPSBzcC0+U0NwLnRoaXNfcmVzaWR1YWw7CisJaWYoc3ogPiAweDEwMDAwMDApCisJCXN6ID0gMHgxMDAwMDAwOworCXJldHVybiBzejsKK30KKworc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlFU1BMT0coKCJlc3AlZDogZG1hIC0tIGNvbmRfcmVnPCUwMng+XG4iLAorCQllc3AtPmVzcF9pZCwgKChzdHJ1Y3QgY3liZXJJSV9kbWFfcmVnaXN0ZXJzICopCisJCQkgICAgICAoZXNwLT5kcmVncykpLT5jb25kX3JlZykpOworCUVTUExPRygoImludHJlcTo8JTA0eD4sIGludGVuYTo8JTA0eD5cbiIsCisJCWN1c3RvbS5pbnRyZXFyLCBjdXN0b20uaW50ZW5hcikpOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpCit7CisJc3RydWN0IGN5YmVySUlfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKKwkJKHN0cnVjdCBjeWJlcklJX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVnczsKKworCWNhY2hlX2NsZWFyKGFkZHIsIGxlbmd0aCk7CisKKwlhZGRyICY9IH4oMSk7CisJZHJlZ3MtPmRtYV9hZGRyMCA9IChhZGRyID4+IDI0KSAmIDB4ZmY7CisJZHJlZ3MtPmRtYV9hZGRyMSA9IChhZGRyID4+IDE2KSAmIDB4ZmY7CisJZHJlZ3MtPmRtYV9hZGRyMiA9IChhZGRyID4+ICA4KSAmIDB4ZmY7CisJZHJlZ3MtPmRtYV9hZGRyMyA9IChhZGRyICAgICAgKSAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpCit7CisJc3RydWN0IGN5YmVySUlfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKKwkJKHN0cnVjdCBjeWJlcklJX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVnczsKKworCWNhY2hlX3B1c2goYWRkciwgbGVuZ3RoKTsKKworCWFkZHIgfD0gMTsKKwlkcmVncy0+ZG1hX2FkZHIwID0gKGFkZHIgPj4gMjQpICYgMHhmZjsKKwlkcmVncy0+ZG1hX2FkZHIxID0gKGFkZHIgPj4gMTYpICYgMHhmZjsKKwlkcmVncy0+ZG1hX2FkZHIyID0gKGFkZHIgPj4gIDgpICYgMHhmZjsKKwlkcmVncy0+ZG1hX2FkZHIzID0gKGFkZHIgICAgICApICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQgZG1hX2ludHNfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJZGlzYWJsZV9pcnEoZXNwLT5pcnEpOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCWVuYWJsZV9pcnEoZXNwLT5pcnEpOworfQorCitzdGF0aWMgaW50IGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCS8qIEl0J3MgaW1wb3J0YW50IHRvIGNoZWNrIHRoZSBETUEgSVJRIGJpdCBpbiB0aGUgY29ycmVjdCB3YXkhICovCisJcmV0dXJuIChlc3BfcmVhZChlc3AtPmVyZWdzLT5lc3Bfc3RhdHVzKSAmIEVTUF9TVEFUX0lOVFIpOworfQorCitzdGF0aWMgdm9pZCBkbWFfbGVkX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCSgoc3RydWN0IGN5YmVySUlfZG1hX3JlZ2lzdGVycyAqKShlc3AtPmRyZWdzKSktPmN0cmxfcmVnICY9IH5DWUJFUklJX0RNQV9MRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb24oc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwkoKHN0cnVjdCBjeWJlcklJX2RtYV9yZWdpc3RlcnMgKikoZXNwLT5kcmVncykpLT5jdHJsX3JlZyB8PSBDWUJFUklJX0RNQV9MRUQ7Cit9CisKK3N0YXRpYyBpbnQgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlyZXR1cm4gKChjdXN0b20uaW50ZW5hcikgJiBJRl9QT1JUUyk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSkKK3sKKwkvKiBPbiB0aGUgU3BhcmMsIERNQV9TVF9XUklURSBtZWFucyAibW92ZSBkYXRhIGZyb20gZGV2aWNlIHRvIG1lbW9yeSIKKwkgKiBzbyB3aGVuICh3cml0ZSkgaXMgdHJ1ZSwgaXQgYWN0dWFsbHkgbWVhbnMgUkVBRCEKKwkgKi8KKwlpZih3cml0ZSl7CisJCWRtYV9pbml0X3JlYWQoZXNwLCBhZGRyLCBjb3VudCk7CisJfSBlbHNlIHsKKwkJZG1hX2luaXRfd3JpdGUoZXNwLCBhZGRyLCBjb3VudCk7CisJfQorfQorCisjZGVmaW5lIEhPU1RTX0MKKworaW50IGN5YmVySUlfZXNwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisjaWZkZWYgTU9EVUxFCisJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpKChzdHJ1Y3QgTkNSX0VTUCAqKWluc3RhbmNlLT5ob3N0ZGF0YSktPmVkZXY7CisKKwllc3BfZGVhbGxvY2F0ZSgoc3RydWN0IE5DUl9FU1AgKilpbnN0YW5jZS0+aG9zdGRhdGEpOyAKKwllc3BfcmVsZWFzZSgpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihhZGRyZXNzLCBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSk7CisJZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBlc3BfaW50cik7CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJlc3AtY3liZXJzdG9ybUlJIiwKKwkucHJvY19pbmZvCQk9IGVzcF9wcm9jX2luZm8sCisJLm5hbWUJCQk9ICJDeWJlclN0b3JtIE1rIElJIFNDU0kiLAorCS5kZXRlY3QJCQk9IGN5YmVySUlfZXNwX2RldGVjdCwKKwkuc2xhdmVfYWxsb2MJCT0gZXNwX3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9kZXN0cm95CQk9IGVzcF9zbGF2ZV9kZXN0cm95LAorCS5yZWxlYXNlCQk9IGN5YmVySUlfZXNwX3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSBlc3BfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBlc3BfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZXNwX3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gNywKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORworfTsKKworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RjMzk1eC5jIGIvZHJpdmVycy9zY3NpL2RjMzk1eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYTQxY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZGMzOTV4LmMKQEAgLTAsMCArMSw0OTQyIEBACisvKgorICogZGMzOTV4LmMKKyAqCisgKiBEZXZpY2UgRHJpdmVyIGZvciBUZWtyYW0gREMzOTUoVS9VVy9GKSwgREMzMTUoVSkKKyAqIFBDSSBTQ1NJIEJ1cyBNYXN0ZXIgSG9zdCBBZGFwdGVyCisgKiAoU0NTSSBjaGlwIHNldCB1c2VkIFRla3JhbSBBU0lDIFRSTS1TMTA0MCkKKyAqCisgKiBBdXRob3JzOgorICogIEMuTC4gSHVhbmcgPGNoaW5nQHRla3JhbS5jb20udHc+CisgKiAgRXJpY2ggQ2hlbiA8ZXJpY2hAdGVrcmFtLmNvbS50dz4KKyAqICAoQykgQ29weXJpZ2h0IDE5OTUtMTk5OSBUZWtyYW0gVGVjaG5vbG9neSBDby4sIEx0ZC4KKyAqCisgKiAgS3VydCBHYXJsb2ZmIDxnYXJsb2ZmQHN1c2UuZGU+CisgKiAgKEMpIDE5OTktMjAwMCBLdXJ0IEdhcmxvZmYKKyAqCisgKiAgT2xpdmVyIE5ldWt1bSA8b2xpdmVyQG5ldWt1bS5uYW1lPgorICogIEFsaSBBa2NhYWdhYyA8YWxpYWtjQHdlYi5kZT4KKyAqICBKYW1pZSBMZW5laGFuIDxsZW5laGFuQHR3aWJibGUub3JnPgorICogIChDKSAyMDAzCisgKgorICogTGljZW5zZTogR05VIEdQTAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CS8qIG5lZWRlZCBmb3Igc2NzaWNhbV9iaW9zX3BhcmFtICovCisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2luY2x1ZGUgImRjMzk1eC5oIgorCisjZGVmaW5lIERDMzk1WF9OQU1FCSJkYzM5NXgiCisjZGVmaW5lIERDMzk1WF9CQU5ORVIJIlRla3JhbSBEQzM5NShVL1VXL0YpLCBEQzMxNShVKSAtIEFTSUMgVFJNLVMxMDQwIgorI2RlZmluZSBEQzM5NVhfVkVSU0lPTgkidjIuMDUsIDIwMDQvMDMvMDgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVhdHVyZXMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNldCB0byBkaXNhYmxlIHBhcnRzIG9mIHRoZSBkcml2ZXIKKyAqLworLyojZGVmaW5lIERDMzk1eF9OT19ESVNDT05ORUNUKi8KKy8qI2RlZmluZSBEQzM5NXhfTk9fVEFHUSovCisvKiNkZWZpbmUgREMzOTV4X05PX1NZTkMqLworLyojZGVmaW5lIERDMzk1eF9OT19XSURFKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z2dpbmcKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFR5cGVzIG9mIGRlYnVnZ2luZyB0aGF0IGNhbiBiZSBlbmFibGVkIGFuZCBkaXNhYmxlZAorICovCisjZGVmaW5lIERCR19LRwkJMHgwMDAxCisjZGVmaW5lIERCR18wCQkweDAwMDIKKyNkZWZpbmUgREJHXzEJCTB4MDAwNAorI2RlZmluZSBEQkdfU0cJCTB4MDAyMAorI2RlZmluZSBEQkdfRklGTwkweDAwNDAKKyNkZWZpbmUgREJHX1BJTwkJMHgwMDgwCisKKworLyoKKyAqIFNldCBzZXQgb2YgdGhpbmdzIHRvIG91dHB1dCBkZWJ1Z2dpbmcgZm9yLgorICogVW5kZWZpbmUgdG8gcmVtb3ZlIGFsbCBkZWJ1Z2dpbmcKKyAqLworLyojZGVmaW5lIERFQlVHX01BU0sgKERCR18wfERCR18xfERCR19TR3xEQkdfRklGT3xEQkdfUElPKSovCisvKiNkZWZpbmUgIERFQlVHX01BU0sJREJHXzAqLworCisKKy8qCisgKiBPdXRwdXQgYSBrZXJuZWwgbWVzYWdlIGF0IHRoZSBzcGVjaWZpZWQgbGV2ZWwgYW5kIGFwcGVuZCB0aGUKKyAqIGRyaXZlciBuYW1lIGFuZCBhICI6ICIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtZXNzYWdlCisgKi8KKyNkZWZpbmUgZHByaW50a2wobGV2ZWwsIGZvcm1hdCwgYXJnLi4uKSAgXAorICAgIHByaW50ayhsZXZlbCBEQzM5NVhfTkFNRSAiOiAiIGZvcm1hdCAsICMjIGFyZykKKworCisjaWZkZWYgREVCVUdfTUFTSworLyoKKyAqIHByaW50IGEgZGVidWcgbWVzc2FnZSAtIHRoaXMgaXMgZm9ybWF0ZWQgd2l0aCBLRVJOX0RFQlVHLCB0aGVuIHRoZQorICogZHJpdmVyIG5hbWUgZm9sbG93ZWQgYnkgYSAiOiAiIGFuZCB0aGVuIHRoZSBtZXNzYWdlIGlzIG91dHB1dC4gCisgKiBUaGlzIGFsc28gY2hlY2tzIHRoYXQgdGhlIHNwZWNpZmllZCBkZWJ1ZyBsZXZlbCBpcyBlbmFibGVkIGJlZm9yZQorICogb3V0cHV0aW5nIHRoZSBtZXNzYWdlCisgKi8KKyNkZWZpbmUgZHByaW50a2RiZyh0eXBlLCBmb3JtYXQsIGFyZy4uLikgXAorCWRvIHsgXAorCQlpZiAoKHR5cGUpICYgKERFQlVHX01BU0spKSBcCisJCQlkcHJpbnRrbChLRVJOX0RFQlVHICwgZm9ybWF0ICwgIyMgYXJnKTsgXAorCX0gd2hpbGUgKDApCisKKy8qCisgKiBDaGVjayBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgb2YgZGVidWdnaW5nIGlzIGVuYWJsZWQKKyAqLworI2RlZmluZSBkZWJ1Z19lbmFibGVkKHR5cGUpCSgoREVCVUdfTUFTSykgJiAodHlwZSkpCisKKyNlbHNlCisvKgorICogTm8gZGVidWdnaW5nLiBEbyBub3RoaW5nCisgKi8KKyNkZWZpbmUgZHByaW50a2RiZyh0eXBlLCBmb3JtYXQsIGFyZy4uLikgXAorCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkZWJ1Z19lbmFibGVkKHR5cGUpCSgwKQorCisjZW5kaWYKKworCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfVEVLUkFNCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVEVLUkFNICAgICAgICAgICAgICAgICAgICAweDFERTEJLyogVmVuZG9yIElEICAgICovCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9URUtSQU1fVFJNUzEwNDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9URUtSQU1fVFJNUzEwNDAgICAgICAgICAgIDB4MDM5MQkvKiBEZXZpY2UgSUQgICAgKi8KKyNlbmRpZgorCisKKyNkZWZpbmUgREMzOTV4X0xPQ0tfSU8oZGV2LGZsYWdzKQkJc3Bpbl9sb2NrX2lycXNhdmUoKChzdHJ1Y3QgU2NzaV9Ib3N0ICopZGV2KS0+aG9zdF9sb2NrLCBmbGFncykKKyNkZWZpbmUgREMzOTV4X1VOTE9DS19JTyhkZXYsZmxhZ3MpCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCgoc3RydWN0IFNjc2lfSG9zdCAqKWRldiktPmhvc3RfbG9jaywgZmxhZ3MpCisKKyNkZWZpbmUgREMzOTV4X3JlYWQ4KGFjYixhZGRyZXNzKQkJKHU4KShpbmIoYWNiLT5pb19wb3J0X2Jhc2UgKyAoYWRkcmVzcykpKQorI2RlZmluZSBEQzM5NXhfcmVhZDE2KGFjYixhZGRyZXNzKQkJKHUxNikoaW53KGFjYi0+aW9fcG9ydF9iYXNlICsgKGFkZHJlc3MpKSkKKyNkZWZpbmUgREMzOTV4X3JlYWQzMihhY2IsYWRkcmVzcykJCSh1MzIpKGlubChhY2ItPmlvX3BvcnRfYmFzZSArIChhZGRyZXNzKSkpCisjZGVmaW5lIERDMzk1eF93cml0ZTgoYWNiLGFkZHJlc3MsdmFsdWUpCW91dGIoKHZhbHVlKSwgYWNiLT5pb19wb3J0X2Jhc2UgKyAoYWRkcmVzcykpCisjZGVmaW5lIERDMzk1eF93cml0ZTE2KGFjYixhZGRyZXNzLHZhbHVlKQlvdXR3KCh2YWx1ZSksIGFjYi0+aW9fcG9ydF9iYXNlICsgKGFkZHJlc3MpKQorI2RlZmluZSBEQzM5NXhfd3JpdGUzMihhY2IsYWRkcmVzcyx2YWx1ZSkJb3V0bCgodmFsdWUpLCBhY2ItPmlvX3BvcnRfYmFzZSArIChhZGRyZXNzKSkKKworLyogY21kLT5yZXN1bHQgKi8KKyNkZWZpbmUgUkVTX1RBUkdFVAkJMHgwMDAwMDBGRgkvKiBUYXJnZXQgU3RhdGUgKi8KKyNkZWZpbmUgUkVTX1RBUkdFVF9MTlggIFNUQVRVU19NQVNLCS8qIE9ubHkgb2ZmaWNpYWwgLi4uICovCisjZGVmaW5lIFJFU19FTkRNU0cJCTB4MDAwMEZGMDAJLyogRW5kIE1lc3NhZ2UgKi8KKyNkZWZpbmUgUkVTX0RJRAkJCTB4MDBGRjAwMDAJLyogRElEXyBjb2RlcyAqLworI2RlZmluZSBSRVNfRFJWCQkJMHhGRjAwMDAwMAkvKiBEUklWRVJfIGNvZGVzICovCisKKyNkZWZpbmUgTUtfUkVTKGRydixkaWQsbXNnLHRndCkgKChpbnQpKGRydik8PDI0IHwgKGludCkoZGlkKTw8MTYgfCAoaW50KShtc2cpPDw4IHwgKGludCkodGd0KSkKKyNkZWZpbmUgTUtfUkVTX0xOWChkcnYsZGlkLG1zZyx0Z3QpICgoaW50KShkcnYpPDwyNCB8IChpbnQpKGRpZCk8PDE2IHwgKGludCkobXNnKTw8OCB8IChpbnQpKHRndCk8PDEpCisKKyNkZWZpbmUgU0VUX1JFU19UQVJHRVQod2hvLHRndCkgeyB3aG8gJj0gflJFU19UQVJHRVQ7IHdobyB8PSAoaW50KSh0Z3QpOyB9CisjZGVmaW5lIFNFVF9SRVNfVEFSR0VUX0xOWCh3aG8sdGd0KSB7IHdobyAmPSB+UkVTX1RBUkdFVF9MTlg7IHdobyB8PSAoaW50KSh0Z3QpIDw8IDE7IH0KKyNkZWZpbmUgU0VUX1JFU19NU0cod2hvLG1zZykgeyB3aG8gJj0gflJFU19FTkRNU0c7IHdobyB8PSAoaW50KShtc2cpIDw8IDg7IH0KKyNkZWZpbmUgU0VUX1JFU19ESUQod2hvLGRpZCkgeyB3aG8gJj0gflJFU19ESUQ7IHdobyB8PSAoaW50KShkaWQpIDw8IDE2OyB9CisjZGVmaW5lIFNFVF9SRVNfRFJWKHdobyxkcnYpIHsgd2hvICY9IH5SRVNfRFJWOyB3aG8gfD0gKGludCkoZHJ2KSA8PCAyNDsgfQorCisjZGVmaW5lIFRBR19OT05FIDI1NQorCisvKgorICogc3JiLT5zZWdlbWVudF94IGlzIHRoZSBodyBzZyBsaXN0LiBJdCBpcyBhbHdheXMgYWxsb2NhdGVkIGFzIGEKKyAqIERDMzk1eF9NQVhfU0dfTElTVEVOVFJZIGVudHJpZXMgaW4gYSBsaW5lYXIgYmxvY2sgd2hpY2ggZG9lcyBub3QKKyAqIGNyb3NzIGEgcGFnZSBib3VuZHkuCisgKi8KKyNkZWZpbmUgU0VHTUVOVFhfTEVOCShzaXplb2Yoc3RydWN0IFNHZW50cnkpKkRDMzk1eF9NQVhfU0dfTElTVEVOVFJZKQorI2RlZmluZSBWSVJUWF9MRU4JKHNpemVvZih2b2lkICopICogREMzOTV4X01BWF9TR19MSVNURU5UUlkpCisKK3N0cnVjdCBTR2VudHJ5IHsKKwl1MzIgYWRkcmVzczsJCS8qIGJ1cyEgYWRkcmVzcyAqLworCXUzMiBsZW5ndGg7Cit9OworCisvKiBUaGUgU0VFUFJPTSBzdHJ1Y3R1cmUgZm9yIFRSTV9TMTA0MCAqLworc3RydWN0IE5WUmFtVGFyZ2V0IHsKKwl1OCBjZmcwOwkJLyogVGFyZ2V0IGNvbmZpZ3VyYXRpb24gYnl0ZSAwICAqLworCXU4IHBlcmlvZDsJCS8qIFRhcmdldCBwZXJpb2QgICAgICAgICAgICAgICAgKi8KKwl1OCBjZmcyOwkJLyogVGFyZ2V0IGNvbmZpZ3VyYXRpb24gYnl0ZSAyICAqLworCXU4IGNmZzM7CQkvKiBUYXJnZXQgY29uZmlndXJhdGlvbiBieXRlIDMgICovCit9OworCitzdHJ1Y3QgTnZSYW1UeXBlIHsKKwl1OCBzdWJfdmVuZG9yX2lkWzJdOwkvKiAwLDEgIFN1YiBWZW5kb3IgSUQgICAqLworCXU4IHN1Yl9zeXNfaWRbMl07CS8qIDIsMyAgU3ViIFN5c3RlbSBJRCAgICovCisJdTggc3ViX2NsYXNzOwkJLyogNCAgICBTdWIgQ2xhc3MgICAgICAgKi8KKwl1OCB2ZW5kb3JfaWRbMl07CS8qIDUsNiAgVmVuZG9yIElEICAgICAgICovCisJdTggZGV2aWNlX2lkWzJdOwkvKiA3LDggIERldmljZSBJRCAgICAgICAqLworCXU4IHJlc2VydmVkOwkJLyogOSAgICBSZXNlcnZlZCAgICAgICAgKi8KKwlzdHJ1Y3QgTlZSYW1UYXJnZXQgdGFyZ2V0W0RDMzk1eF9NQVhfU0NTSV9JRF07CisJCQkJCQkvKiogMTAsMTEsMTIsMTMKKwkJCQkJCSAqKiAxNCwxNSwxNiwxNworCQkJCQkJICoqIC4uLi4KKwkJCQkJCSAqKiAuLi4uCisJCQkJCQkgKiogNzAsNzEsNzIsNzMKKwkJCQkJCSAqLworCXU4IHNjc2lfaWQ7CQkvKiA3NCBIb3N0IEFkYXB0ZXIgU0NTSSBJRCAgICAgICovCisJdTggY2hhbm5lbF9jZmc7CQkvKiA3NSBDaGFubmVsIGNvbmZpZ3VyYXRpb24gICAgICovCisJdTggZGVsYXlfdGltZTsJCS8qIDc2IFBvd2VyIG9uIGRlbGF5IHRpbWUgICAgICAgKi8KKwl1OCBtYXhfdGFnOwkJLyogNzcgTWF4aW11bSB0YWdzICAgICAgICAgICAgICAqLworCXU4IHJlc2VydmVkMDsJCS8qIDc4ICAqLworCXU4IGJvb3RfdGFyZ2V0OwkJLyogNzkgICovCisJdTggYm9vdF9sdW47CQkvKiA4MCAgKi8KKwl1OCByZXNlcnZlZDE7CQkvKiA4MSAgKi8KKwl1MTYgcmVzZXJ2ZWQyWzIyXTsJLyogODIsLi4xMjUgKi8KKwl1MTYgY2tzdW07CQkvKiAxMjYsMTI3ICovCit9OworCitzdHJ1Y3QgU2NzaVJlcUJsayB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogbmV4dC9wcmV2IHB0cnMgZm9yIHNyYiBsaXN0cyAqLworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisKKwlzdHJ1Y3QgU0dlbnRyeSAqc2VnbWVudF94OwkvKiBMaW5lYXIgYXJyYXkgb2YgaHcgc2cgZW50cmllcyAodXAgdG8gNjQgZW50cmllcykgKi8KKwl1MzIgc2dfYnVzX2FkZHI7CSAgICAgICAgLyogQnVzIGFkZHJlc3Mgb2Ygc2cgbGlzdCAoaWUsIG9mIHNlZ21lbnRfeCkgKi8KKworCXU4IHNnX2NvdW50OwkJCS8qIE5vIG9mIEhXIHNnIGVudHJpZXMgZm9yIHRoaXMgcmVxdWVzdCAqLworCXU4IHNnX2luZGV4OwkJCS8qIEluZGV4IG9mIEhXIHNnIGVudHJ5IGZvciB0aGlzIHJlcXVlc3QgKi8KKwl1MzIgdG90YWxfeGZlcl9sZW5ndGg7CQkvKiBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIHRvIGJlIHRyYW5zZmVyZWQgKi8KKwl2b2lkICoqdmlydF9tYXA7CisJdW5zaWduZWQgY2hhciAqdmlydF9hZGRyOwkvKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgY3VycmVudCB0cmFuc2ZlciBwb3NpdGlvbiAqLworCisJLyoKKwkgKiBUaGUgc2Vuc2UgYnVmZmVyIGhhbmRsaW5nIGZ1bmN0aW9uLCByZXF1ZXN0X3NlbnNlLCB1c2VzCisJICogdGhlIGZpcnN0IGh3IHNnIGVudHJ5IChzZWdtZW50X3hbMF0pIGFuZCB0aGUgdHJhbnNmZXIKKwkgKiBsZW5ndGggKHRvdGFsX3hmZXJfbGVuZ3RoKS4gV2hpbGUgZG9pbmcgdGhpcyBpdCBzdG9yZXMgdGhlCisJICogb3JpZ2luYWwgdmFsdWVzIGludG8gdGhlIGxhc3Qgc2cgaHcgbGlzdAorCSAqIChzcmItPnNlZ21lbnRfeFtEQzM5NXhfTUFYX1NHX0xJU1RFTlRSWSAtIDFdIGFuZCB0aGUKKwkgKiB0b3RhbF94ZmVyX2xlbmd0aCBpbiB4ZmVycmVkLiBUaGVzZSB2YWx1ZXMgYXJlIHJlc3RvcmVkIGluCisJICogcGNpX3VubWFwX3NyYl9zZW5zZS4gVGhpcyBpcyB0aGUgb25seSBwbGFjZSB4ZmVycmVkIGlzIHVzZWQuCisJICovCisJdTMyIHhmZXJyZWQ7CQkgICAgICAgIC8qIFNhdmVkIGNvcHkgb2YgdG90YWxfeGZlcl9sZW5ndGggKi8KKworCXUxNiBzdGF0ZTsKKworCXU4IG1zZ2luX2J1Zls2XTsKKwl1OCBtc2dvdXRfYnVmWzZdOworCisJdTggYWRhcHRlcl9zdGF0dXM7CisJdTggdGFyZ2V0X3N0YXR1czsKKwl1OCBtc2dfY291bnQ7CisJdTggZW5kX21lc3NhZ2U7CisKKwl1OCB0YWdfbnVtYmVyOworCXU4IHN0YXR1czsKKwl1OCByZXRyeV9jb3VudDsKKwl1OCBmbGFnOworCisJdTggc2NzaV9waGFzZTsKK307CisKK3N0cnVjdCBEZXZpY2VDdGxCbGsgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qIG5leHQvcHJldiBwdHJzIGZvciB0aGUgZGNiIGxpc3QgKi8KKwlzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiOworCXN0cnVjdCBsaXN0X2hlYWQgc3JiX2dvaW5nX2xpc3Q7CS8qIGhlYWQgb2YgZ29pbmcgc3JiIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHNyYl93YWl0aW5nX2xpc3Q7CS8qIGhlYWQgb2Ygd2FpdGluZyBzcmIgbGlzdCAqLworCisJc3RydWN0IFNjc2lSZXFCbGsgKmFjdGl2ZV9zcmI7CisJdTMyIHRhZ19tYXNrOworCisJdTE2IG1heF9jb21tYW5kOworCisJdTggdGFyZ2V0X2lkOwkJLyogU0NTSSBUYXJnZXQgSUQgIChTQ1NJIE9ubHkpICovCisJdTggdGFyZ2V0X2x1bjsJCS8qIFNDU0kgTG9nLiAgVW5pdCAoU0NTSSBPbmx5KSAqLworCXU4IGlkZW50aWZ5X21zZzsKKwl1OCBkZXZfbW9kZTsKKworCXU4IGlucXVpcnk3OwkJLyogVG8gc3RvcmUgSW5xdWlyeSBmbGFncyAqLworCXU4IHN5bmNfbW9kZTsJCS8qIDA6YXN5bmMgbW9kZSAqLworCXU4IG1pbl9uZWdvX3BlcmlvZDsJLyogZm9yIG5lZ28uICovCisJdTggc3luY19wZXJpb2Q7CQkvKiBmb3IgcmVnLiAgKi8KKworCXU4IHN5bmNfb2Zmc2V0OwkJLyogZm9yIHJlZy4gYW5kIG5lZ28uKGxvdyBuaWJibGUpICovCisJdTggZmxhZzsKKwl1OCBkZXZfdHlwZTsKKwl1OCBpbml0X3RjcV9mbGFnOworfTsKKworc3RydWN0IEFkYXB0ZXJDdGxCbGsgeworCXN0cnVjdCBTY3NpX0hvc3QgKnNjc2lfaG9zdDsKKworCXVuc2lnbmVkIGxvbmcgaW9fcG9ydF9iYXNlOworCXVuc2lnbmVkIGxvbmcgaW9fcG9ydF9sZW47CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRjYl9saXN0OwkJLyogaGVhZCBvZiBnb2luZyBkY2IgbGlzdCAqLworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYl9ydW5fcm9iaW47CisJc3RydWN0IERldmljZUN0bEJsayAqYWN0aXZlX2RjYjsKKworCXN0cnVjdCBsaXN0X2hlYWQgc3JiX2ZyZWVfbGlzdDsJCS8qIGhlYWQgb2YgZnJlZSBzcmIgbGlzdCAqLworCXN0cnVjdCBTY3NpUmVxQmxrICp0bXBfc3JiOworCXN0cnVjdCB0aW1lcl9saXN0IHdhaXRpbmdfdGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3Qgc2VsdG9fdGltZXI7CisKKwl1MTYgc3JiX2NvdW50OworCisJdTggc2VsX3RpbWVvdXQ7CisKKwl1bnNpZ25lZCBpbnQgaXJxX2xldmVsOworCXU4IHRhZ19tYXhfbnVtOworCXU4IGFjYl9mbGFnOworCXU4IGdtb2RlMjsKKworCXU4IGNvbmZpZzsKKwl1OCBsdW5fY2hrOworCXU4IHNjYW5fZGV2aWNlczsKKwl1OCBob3N0aWRfYml0OworCisJdTggZGNiX21hcFtEQzM5NXhfTUFYX1NDU0lfSURdOworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmNoaWxkcmVuW0RDMzk1eF9NQVhfU0NTSV9JRF1bMzJdOworCisJc3RydWN0IHBjaV9kZXYgKmRldjsKKworCXU4IG1zZ19sZW47CisKKwlzdHJ1Y3QgU2NzaVJlcUJsayBzcmJfYXJyYXlbREMzOTV4X01BWF9TUkJfQ05UXTsKKwlzdHJ1Y3QgU2NzaVJlcUJsayBzcmI7CisKKwlzdHJ1Y3QgTnZSYW1UeXBlIGVlcHJvbTsJLyogZWVwcm9tIHNldHRpbmdzIGZvciB0aGlzIGFkYXB0ZXIgKi8KK307CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3J3YXJkIGRlY2xhcmF0aW9ucworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBkYXRhX291dF9waGFzZTAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpOworc3RhdGljIHZvaWQgZGF0YV9pbl9waGFzZTAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpOworc3RhdGljIHZvaWQgY29tbWFuZF9waGFzZTAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpOworc3RhdGljIHZvaWQgc3RhdHVzX3BoYXNlMChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cyk7CitzdGF0aWMgdm9pZCBtc2dvdXRfcGhhc2UwKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIsCisJCXUxNiAqcHNjc2lfc3RhdHVzKTsKK3N0YXRpYyB2b2lkIG1zZ2luX3BoYXNlMChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cyk7CitzdGF0aWMgdm9pZCBkYXRhX291dF9waGFzZTEoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpOworc3RhdGljIHZvaWQgZGF0YV9pbl9waGFzZTEoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpOworc3RhdGljIHZvaWQgY29tbWFuZF9waGFzZTEoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpOworc3RhdGljIHZvaWQgc3RhdHVzX3BoYXNlMShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cyk7CitzdGF0aWMgdm9pZCBtc2dvdXRfcGhhc2UxKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIsCisJCXUxNiAqcHNjc2lfc3RhdHVzKTsKK3N0YXRpYyB2b2lkIG1zZ2luX3BoYXNlMShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cyk7CitzdGF0aWMgdm9pZCBub3AwKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIsCisJCXUxNiAqcHNjc2lfc3RhdHVzKTsKK3N0YXRpYyB2b2lkIG5vcDEoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwgCisJCXUxNiAqcHNjc2lfc3RhdHVzKTsKK3N0YXRpYyB2b2lkIHNldF9iYXNpY19jb25maWcoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYik7CitzdGF0aWMgdm9pZCBjbGVhbnVwX2FmdGVyX3RyYW5zZmVyKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsCisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIpOworc3RhdGljIHZvaWQgcmVzZXRfc2NzaV9idXMoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYik7CitzdGF0aWMgdm9pZCBkYXRhX2lvX3RyYW5zZmVyKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsCisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIsIHUxNiBpb19kaXIpOworc3RhdGljIHZvaWQgZGlzY29ubmVjdChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiKTsKK3N0YXRpYyB2b2lkIHJlc2VsZWN0KHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IpOworc3RhdGljIHU4IHN0YXJ0X3Njc2koc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IERldmljZUN0bEJsayAqZGNiLAorCQlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfbXNnb3V0X2Fib3J0KHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsCisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIpOworc3RhdGljIHZvaWQgYnVpbGRfc3JiKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgc3RydWN0IERldmljZUN0bEJsayAqZGNiLAorCQlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKTsKK3N0YXRpYyB2b2lkIGRvaW5nX3NyYl9kb25lKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHU4IGRpZF9jb2RlLAorCQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHU4IGZvcmNlKTsKK3N0YXRpYyB2b2lkIHNjc2lfcmVzZXRfZGV0ZWN0KHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IpOworc3RhdGljIHZvaWQgcGNpX3VubWFwX3NyYihzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKTsKK3N0YXRpYyB2b2lkIHBjaV91bm1hcF9zcmJfc2Vuc2Uoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnNyYik7CitzdGF0aWMgdm9pZCBzcmJfZG9uZShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IsCisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIpOworc3RhdGljIHZvaWQgcmVxdWVzdF9zZW5zZShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IsCisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIpOworc3RhdGljIHZvaWQgc2V0X3hmZXJfcmF0ZShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLAorCQlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IpOworc3RhdGljIHZvaWQgd2FpdGluZ190aW1lb3V0KHVuc2lnbmVkIGxvbmcgcHRyKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGljIERhdGEKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHUxNiBjdXJyZW50X3N5bmNfb2Zmc2V0ID0gMDsKKworc3RhdGljIHZvaWQgKmRjMzk1eF9zY3NpX3BoYXNlMFtdID0geworCWRhdGFfb3V0X3BoYXNlMCwvKiBwaGFzZTowICovCisJZGF0YV9pbl9waGFzZTAsCS8qIHBoYXNlOjEgKi8KKwljb21tYW5kX3BoYXNlMCwJLyogcGhhc2U6MiAqLworCXN0YXR1c19waGFzZTAsCS8qIHBoYXNlOjMgKi8KKwlub3AwLAkJLyogcGhhc2U6NCBQSF9CVVNfRlJFRSAuLiBpbml0aWFsIHBoYXNlICovCisJbm9wMCwJCS8qIHBoYXNlOjUgUEhfQlVTX0ZSRUUgLi4gaW5pdGlhbCBwaGFzZSAqLworCW1zZ291dF9waGFzZTAsCS8qIHBoYXNlOjYgKi8KKwltc2dpbl9waGFzZTAsCS8qIHBoYXNlOjcgKi8KK307CisKK3N0YXRpYyB2b2lkICpkYzM5NXhfc2NzaV9waGFzZTFbXSA9IHsKKwlkYXRhX291dF9waGFzZTEsLyogcGhhc2U6MCAqLworCWRhdGFfaW5fcGhhc2UxLAkvKiBwaGFzZToxICovCisJY29tbWFuZF9waGFzZTEsCS8qIHBoYXNlOjIgKi8KKwlzdGF0dXNfcGhhc2UxLAkvKiBwaGFzZTozICovCisJbm9wMSwJCS8qIHBoYXNlOjQgUEhfQlVTX0ZSRUUgLi4gaW5pdGlhbCBwaGFzZSAqLworCW5vcDEsCQkvKiBwaGFzZTo1IFBIX0JVU19GUkVFIC4uIGluaXRpYWwgcGhhc2UgKi8KKwltc2dvdXRfcGhhc2UxLAkvKiBwaGFzZTo2ICovCisJbXNnaW5fcGhhc2UxLAkvKiBwaGFzZTo3ICovCit9OworCisvKgorICpGYXN0MjA6CTAwMAkgNTBucywgMjAuMCBNSHoKKyAqCQkwMDEJIDc1bnMsIDEzLjMgTUh6CisgKgkJMDEwCTEwMG5zLCAxMC4wIE1IegorICoJCTAxMQkxMjVucywgIDguMCBNSHoKKyAqCQkxMDAJMTUwbnMsICA2LjYgTUh6CisgKgkJMTAxCTE3NW5zLCAgNS43IE1IegorICoJCTExMAkyMDBucywgIDUuMCBNSHoKKyAqCQkxMTEJMjUwbnMsICA0LjAgTUh6CisgKgorICpGYXN0NDAoTFZEUyk6CTAwMAkgMjVucywgNDAuMCBNSHoKKyAqCQkwMDEJIDUwbnMsIDIwLjAgTUh6CisgKgkJMDEwCSA3NW5zLCAxMy4zIE1IegorICoJCTAxMQkxMDBucywgMTAuMCBNSHoKKyAqCQkxMDAJMTI1bnMsICA4LjAgTUh6CisgKgkJMTAxCTE1MG5zLCAgNi42IE1IegorICoJCTExMAkxNzVucywgIDUuNyBNSHoKKyAqCQkxMTEJMjAwbnMsICA1LjAgTUh6CisgKi8KKy8qc3RhdGljIHU4CWNsb2NrX3BlcmlvZFtdID0gezEyLDE5LDI1LDMxLDM3LDQ0LDUwLDYyfTsqLworCisvKiByZWFsIHBlcmlvZDo0OG5zLDc2bnMsMTAwbnMsMTI0bnMsMTQ4bnMsMTc2bnMsMjAwbnMsMjQ4bnMgKi8KK3N0YXRpYyB1OCBjbG9ja19wZXJpb2RbXSA9IHsgMTIsIDE4LCAyNSwgMzEsIDM3LCA0MywgNTAsIDYyIH07CitzdGF0aWMgdTE2IGNsb2NrX3NwZWVkW10gPSB7IDIwMCwgMTMzLCAxMDAsIDgwLCA2NywgNTgsIDUwLCA0MCB9OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBNb2R1bGUvYm9vdCBwYXJhbWV0ZXJzIGN1cnJlbnRseSBlZmZlY3QgKmFsbCogaW5zdGFuY2VzIG9mIHRoZQorICogY2FyZCBpbiB0aGUgc3lzdGVtLgorICovCisKKy8qCisgKiBDb21tYW5kIGxpbmUgcGFyYW1ldGVycyBhcmUgc3RvcmVkIGluIGEgc3RydWN0dXJlIGJlbG93LgorICogVGhlc2UgYXJlIHRoZSBpbmRleCdzIGludG8gdGhlIHN0cnVjdHVyZSBmb3IgdGhlIHZhcmlvdXMKKyAqIGNvbW1hbmQgbGluZSBvcHRpb25zLgorICovCisjZGVmaW5lIENGR19BREFQVEVSX0lECQkwCisjZGVmaW5lIENGR19NQVhfU1BFRUQJCTEKKyNkZWZpbmUgQ0ZHX0RFVl9NT0RFCQkyCisjZGVmaW5lIENGR19BREFQVEVSX01PREUJMworI2RlZmluZSBDRkdfVEFHUwkJNAorI2RlZmluZSBDRkdfUkVTRVRfREVMQVkJCTUKKworI2RlZmluZSBDRkdfTlVNCQkJNgkvKiBudW1iZXIgb2YgY29uZmlndXJhdGlvbiBpdGVtcyAqLworCisKKy8qCisgKiBWYWx1ZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSBjb21tYW5kIGxpbmUgb3ZlcnJpZGUKKyAqIGhhc24ndCBiZWVuIHVzZWQgdG8gbW9kaWZ5IHRoZSB2YWx1ZS4KKyAqLworI2RlZmluZSBDRkdfUEFSQU1fVU5TRVQgLTEKKworCisvKgorICogSG9sZCBjb21tYW5kIGxpbmUgcGFyYW1ldGVycy4KKyAqLworc3RydWN0IFBhcmFtZXRlckRhdGEgeworCWludCB2YWx1ZTsJCS8qIHZhbHVlIG9mIHRoaXMgc2V0dGluZyAqLworCWludCBtaW47CQkvKiBtaW5pbXVtIHZhbHVlICovCisJaW50IG1heDsJCS8qIG1heGltdW0gdmFsdWUgKi8KKwlpbnQgZGVmOwkJLyogZGVmYXVsdCB2YWx1ZSAqLworCWludCBzYWZlOwkJLyogc2FmZSB2YWx1ZSAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgUGFyYW1ldGVyRGF0YSBfX2RldmluaXRkYXRhIGNmZ19kYXRhW10gPSB7CisJeyAvKiBhZGFwdGVyIGlkICovCisJCUNGR19QQVJBTV9VTlNFVCwKKwkJMCwKKwkJMTUsCisJCTcsCisJCTcKKwl9LAorCXsgLyogbWF4IHNwZWVkICovCisJCUNGR19QQVJBTV9VTlNFVCwKKwkJICAwLAorCQkgIDcsCisJCSAgMSwJLyogMTMuM01oeiAqLworCQkgIDQsCS8qICA2LjdIbXogKi8KKwl9LAorCXsgLyogZGV2IG1vZGUgKi8KKwkJQ0ZHX1BBUkFNX1VOU0VULAorCQkwLAorCQkweDNmLAorCQlOVENfRE9fUEFSSVRZX0NISyB8IE5UQ19ET19ESVNDT05ORUNUIHwgTlRDX0RPX1NZTkNfTkVHTyB8CisJCQlOVENfRE9fV0lERV9ORUdPIHwgTlRDX0RPX1RBR19RVUVVRUlORyB8CisJCQlOVENfRE9fU0VORF9TVEFSVCwKKwkJTlRDX0RPX1BBUklUWV9DSEsgfCBOVENfRE9fU0VORF9TVEFSVAorCX0sCisJeyAvKiBhZGFwdGVyIG1vZGUgKi8KKwkJQ0ZHX1BBUkFNX1VOU0VULAorCQkwLAorCQkweDJmLAorI2lmZGVmIENPTkZJR19TQ1NJX01VTFRJX0xVTgorCQkJTkFDX1NDQU5MVU4gfAorI2VuZGlmCisJCU5BQ19HVDJEUklWRVMgfCBOQUNfR1JFQVRFUl8xRyB8IE5BQ19QT1dFUk9OX1NDU0lfUkVTRVQKKwkJCS8qfCBOQUNfQUNUSVZFX05FRyovLAorCQlOQUNfR1QyRFJJVkVTIHwgTkFDX0dSRUFURVJfMUcgfCBOQUNfUE9XRVJPTl9TQ1NJX1JFU0VUIHwgMHgwOAorCX0sCisJeyAvKiB0YWdzICovCisJCUNGR19QQVJBTV9VTlNFVCwKKwkJMCwKKwkJNSwKKwkJMywJLyogMTYgdGFncyAoPz8pICovCisJCTIsCisJfSwKKwl7IC8qIHJlc2V0IGRlbGF5ICovCisJCUNGR19QQVJBTV9VTlNFVCwKKwkJMCwKKwkJMTgwLAorCQkxLAkvKiAxIHNlY29uZCAqLworCQkxMCwJLyogMTAgc2Vjb25kcyAqLworCX0KK307CisKKworLyoKKyAqIFNhZmUgc2V0dGluZ3MuIElmIHNldCB0byB6ZXJvIHRoZSB0aGUgQklPUy9kZWZhdWx0IHZhbHVlcyB3aXRoCisgKiBjb21tYW5kIGxpbmUgb3ZlcnJpZGVzIHdpbGwgYmUgdXNlZC4gSWYgc2V0IHRvIDEgdGhlbiBzYWZlIGFuZAorICogc2xvdyBzZXR0aW5ncyB3aWxsIGJlIHVzZWQuCisgKi8KK3N0YXRpYyBpbnQgdXNlX3NhZmVfc2V0dGluZ3MgPSAwOworbW9kdWxlX3BhcmFtX25hbWVkKHNhZmUsIHVzZV9zYWZlX3NldHRpbmdzLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc2FmZSwgIlVzZSBzYWZlIGFuZCBzbG93IHNldHRpbmdzIG9ubHkuIERlZmF1bHQ6IGZhbHNlIik7CisKKworbW9kdWxlX3BhcmFtX25hbWVkKGFkYXB0ZXJfaWQsIGNmZ19kYXRhW0NGR19BREFQVEVSX0lEXS52YWx1ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYWRhcHRlcl9pZCwgIkFkYXB0ZXIgU0NTSSBJRC4gRGVmYXVsdCA3ICgwLTE1KSIpOworCittb2R1bGVfcGFyYW1fbmFtZWQobWF4X3NwZWVkLCBjZmdfZGF0YVtDRkdfTUFYX1NQRUVEXS52YWx1ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X3NwZWVkLCAiTWF4aW11bSBidXMgc3BlZWQuIERlZmF1bHQgMSAoMC03KSBTcGVlZHM6IDA9MjAsIDE9MTMuMywgMj0xMCwgMz04LCA0PTYuNywgNT01LjgsIDY9NSwgNz00IE1oeiIpOworCittb2R1bGVfcGFyYW1fbmFtZWQoZGV2X21vZGUsIGNmZ19kYXRhW0NGR19ERVZfTU9ERV0udmFsdWUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl9tb2RlLCAiRGV2aWNlIG1vZGUuIik7CisKK21vZHVsZV9wYXJhbV9uYW1lZChhZGFwdGVyX21vZGUsIGNmZ19kYXRhW0NGR19BREFQVEVSX01PREVdLnZhbHVlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhhZGFwdGVyX21vZGUsICJBZGFwdGVyIG1vZGUuIik7CisKK21vZHVsZV9wYXJhbV9uYW1lZCh0YWdzLCBjZmdfZGF0YVtDRkdfVEFHU10udmFsdWUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRhZ3MsICJOdW1iZXIgb2YgdGFncyAoMTw8eCkuIERlZmF1bHQgMyAoMC01KSIpOworCittb2R1bGVfcGFyYW1fbmFtZWQocmVzZXRfZGVsYXksIGNmZ19kYXRhW0NGR19SRVNFVF9ERUxBWV0udmFsdWUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlc2V0X2RlbGF5LCAiUmVzZXQgZGVsYXkgaW4gc2Vjb25kcy4gRGVmYXVsdCAxICgwLTE4MCkiKTsKKworCisvKioKKyAqIHNldF9zYWZlX3NldHRpbmdzIC0gaWYgdGhlIHVzZV9zYWZlX3NldHRpbmdzIG9wdGlvbiBpcyBzZXQgdGhlbgorICogc2V0IGFsbCB2YWx1ZXMgdG8gdGhlIHNhZmUgYW5kIHNsb3cgdmFsdWVzLgorICoqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHNldF9zYWZlX3NldHRpbmdzKHZvaWQpCit7CisJaWYgKHVzZV9zYWZlX3NldHRpbmdzKQorCXsKKwkJaW50IGk7CisKKwkJZHByaW50a2woS0VSTl9JTkZPLCAiVXNpbmcgc2FmZSBzZXR0aW5ncy5cbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgQ0ZHX05VTTsgaSsrKQorCQl7CisJCQljZmdfZGF0YVtpXS52YWx1ZSA9IGNmZ19kYXRhW2ldLnNhZmU7CisJCX0KKwl9Cit9CisKKworLyoqCisgKiBmaXhfc2V0dGluZ3MgLSByZXNldCBhbnkgYm9vdCBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBvdXQgb2YgcmFuZ2UKKyAqIGJhY2sgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLgorICoqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGZpeF9zZXR0aW5ncyh2b2lkKQoreworCWludCBpOworCisJZHByaW50a2RiZyhEQkdfMSwKKwkJInNldHVwOiBBZGFwdGVySWQ9JTA4eCBNYXhTcGVlZD0lMDh4IERldk1vZGU9JTA4eCAiCisJCSJBZGFwdGVyTW9kZT0lMDh4IFRhZ3M9JTA4eCBSZXNldERlbGF5PSUwOHhcbiIsCisJCWNmZ19kYXRhW0NGR19BREFQVEVSX0lEXS52YWx1ZSwKKwkJY2ZnX2RhdGFbQ0ZHX01BWF9TUEVFRF0udmFsdWUsCisJCWNmZ19kYXRhW0NGR19ERVZfTU9ERV0udmFsdWUsCisJCWNmZ19kYXRhW0NGR19BREFQVEVSX01PREVdLnZhbHVlLAorCQljZmdfZGF0YVtDRkdfVEFHU10udmFsdWUsCisJCWNmZ19kYXRhW0NGR19SRVNFVF9ERUxBWV0udmFsdWUpOworCWZvciAoaSA9IDA7IGkgPCBDRkdfTlVNOyBpKyspCisJeworCQlpZiAoY2ZnX2RhdGFbaV0udmFsdWUgPCBjZmdfZGF0YVtpXS5taW4KKwkJICAgIHx8IGNmZ19kYXRhW2ldLnZhbHVlID4gY2ZnX2RhdGFbaV0ubWF4KQorCQkJY2ZnX2RhdGFbaV0udmFsdWUgPSBjZmdfZGF0YVtpXS5kZWY7CisJfQorfQorCisKKworLyoKKyAqIE1hcHBpbmcgZnJvbSB0aGUgZWVwcm9tIGRlbGF5IGluZGV4IHZhbHVlIChpbmRleCBpbnRvIHRoaXMgYXJyYXkpCisgKiB0byB0aGUgdGhlIG51bWJlciBvZiBhY3R1YWwgc2Vjb25kcyB0aGF0IHRoZSBkZWxheSBzaG91bGQgYmUgZm9yLgorICovCitzdGF0aWMgY2hhciBfX2RldmluaXRkYXRhIGVlcHJvbV9pbmRleF90b19kZWxheV9tYXBbXSA9IAorCXsgMSwgMywgNSwgMTAsIDE2LCAzMCwgNjAsIDEyMCB9OworCisKKy8qKgorICogZWVwcm9tX2luZGV4X3RvX2RlbGF5IC0gVGFrZSB0aGUgZWVwcm9tIGRlbGF5IHNldHRpbmcgYW5kIGNvbnZlcnQgaXQKKyAqIGludG8gYSBudW1iZXIgb2Ygc2Vjb25kcy4KKyAqCisgKiBAZWVwcm9tOiBUaGUgZWVwcm9tIHN0cnVjdHVyZSBpbiB3aGljaCB3ZSBmaW5kIHRoZSBkZWxheSBpbmRleCB0byBtYXAuCisgKiovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZWVwcm9tX2luZGV4X3RvX2RlbGF5KHN0cnVjdCBOdlJhbVR5cGUgKmVlcHJvbSkKK3sKKwllZXByb20tPmRlbGF5X3RpbWUgPSBlZXByb21faW5kZXhfdG9fZGVsYXlfbWFwW2VlcHJvbS0+ZGVsYXlfdGltZV07Cit9CisKKworLyoqCisgKiBkZWxheV90b19lZXByb21faW5kZXggLSBUYWtlIGEgZGVsYXkgaW4gc2Vjb25kcyBhbmQgcmV0dXJuIHRoZQorICogY2xvc2VzdCBlZXByb20gaW5kZXggd2hpY2ggd2lsbCBkZWxheSBmb3IgYXQgbGVhc3QgdGhhdCBhbW91bnQgb2YKKyAqIHNlY29uZHMuCisgKgorICogQGRlbGF5OiBUaGUgZGVsYXksIGluIHNlY29uZHMsIHRvIGZpbmQgdGhlIGVlcHJvbSBpbmRleCBmb3IuCisgKiovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkZWxheV90b19lZXByb21faW5kZXgoaW50IGRlbGF5KQoreworCXU4IGlkeCA9IDA7CisJd2hpbGUgKGlkeCA8IDcgJiYgZWVwcm9tX2luZGV4X3RvX2RlbGF5X21hcFtpZHhdIDwgZGVsYXkpCisJCWlkeCsrOworCXJldHVybiBpZHg7Cit9CisKKworLyoqCisgKiBlZXByb21fb3ZlcnJpZGUgLSBPdmVycmlkZSB0aGUgZWVwcm9tIHNldHRpbmdzLCBpbiB0aGUgcHJvdmlkZWQKKyAqIGVlcHJvbSBzdHJ1Y3R1cmUsIHdpdGggdmFsdWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBvbiB0aGUgY29tbWFuZAorICogbGluZS4KKyAqCisgKiBAZWVwcm9tOiBUaGUgZWVwcm9tIGRhdGEgdG8gb3ZlcnJpZGUgd2l0aCBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAqKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBlZXByb21fb3ZlcnJpZGUoc3RydWN0IE52UmFtVHlwZSAqZWVwcm9tKQoreworCXU4IGlkOworCisJLyogQWRhcHRlciBTZXR0aW5ncyAqLworCWlmIChjZmdfZGF0YVtDRkdfQURBUFRFUl9JRF0udmFsdWUgIT0gQ0ZHX1BBUkFNX1VOU0VUKQorCQllZXByb20tPnNjc2lfaWQgPSAodTgpY2ZnX2RhdGFbQ0ZHX0FEQVBURVJfSURdLnZhbHVlOworCisJaWYgKGNmZ19kYXRhW0NGR19BREFQVEVSX01PREVdLnZhbHVlICE9IENGR19QQVJBTV9VTlNFVCkKKwkJZWVwcm9tLT5jaGFubmVsX2NmZyA9ICh1OCljZmdfZGF0YVtDRkdfQURBUFRFUl9NT0RFXS52YWx1ZTsKKworCWlmIChjZmdfZGF0YVtDRkdfUkVTRVRfREVMQVldLnZhbHVlICE9IENGR19QQVJBTV9VTlNFVCkKKwkJZWVwcm9tLT5kZWxheV90aW1lID0gZGVsYXlfdG9fZWVwcm9tX2luZGV4KAorCQkJCQljZmdfZGF0YVtDRkdfUkVTRVRfREVMQVldLnZhbHVlKTsKKworCWlmIChjZmdfZGF0YVtDRkdfVEFHU10udmFsdWUgIT0gQ0ZHX1BBUkFNX1VOU0VUKQorCQllZXByb20tPm1heF90YWcgPSAodTgpY2ZnX2RhdGFbQ0ZHX1RBR1NdLnZhbHVlOworCisJLyogRGV2aWNlIFNldHRpbmdzICovCisJZm9yIChpZCA9IDA7IGlkIDwgREMzOTV4X01BWF9TQ1NJX0lEOyBpZCsrKSB7CisJCWlmIChjZmdfZGF0YVtDRkdfREVWX01PREVdLnZhbHVlICE9IENGR19QQVJBTV9VTlNFVCkKKwkJCWVlcHJvbS0+dGFyZ2V0W2lkXS5jZmcwID0KKwkJCQkodTgpY2ZnX2RhdGFbQ0ZHX0RFVl9NT0RFXS52YWx1ZTsKKworCQlpZiAoY2ZnX2RhdGFbQ0ZHX01BWF9TUEVFRF0udmFsdWUgIT0gQ0ZHX1BBUkFNX1VOU0VUKQorCQkJZWVwcm9tLT50YXJnZXRbaWRdLnBlcmlvZCA9CisJCQkJKHU4KWNmZ19kYXRhW0NGR19NQVhfU1BFRURdLnZhbHVlOworCisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBsaXN0X3NpemUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgaGVhZCkKKwkJY291bnQrKzsKKwlyZXR1cm4gY291bnQ7Cit9CisKKworc3RhdGljIHN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYl9nZXRfbmV4dChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAorCQlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpwb3MpCit7CisJaW50IHVzZV9uZXh0ID0gMDsKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrKiBuZXh0ID0gTlVMTDsKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrKiBpOworCisJaWYgKGxpc3RfZW1wdHkoaGVhZCkpCisJCXJldHVybiBOVUxMOworCisJLyogZmluZCBzdXBwbGllZCBkY2IgYW5kIHRoZW4gc2VsZWN0IHRoZSBuZXh0IG9uZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgaGVhZCwgbGlzdCkKKwkJaWYgKHVzZV9uZXh0KSB7CisJCQluZXh0ID0gaTsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGkgPT0gcG9zKSB7CisJCQl1c2VfbmV4dCA9IDE7CisJCX0KKwkvKiBpZiBubyBuZXh0IG9uZSB0YWtlIHRoZSBoZWFkIG9uZSAoaWUsIHdyYXBhcm91bmQpICovCisJaWYgKCFuZXh0KQorICAgICAgICAJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCBoZWFkLCBsaXN0KSB7CisgICAgICAgIAkJbmV4dCA9IGk7CisgICAgICAgIAkJYnJlYWs7CisgICAgICAgIAl9CisKKwlyZXR1cm4gbmV4dDsKK30KKworCitzdGF0aWMgdm9pZCBmcmVlX3RhZyhzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIpCit7CisJaWYgKHNyYi0+dGFnX251bWJlciA8IDI1NSkgeworCQlkY2ItPnRhZ19tYXNrICY9IH4oMSA8PCBzcmItPnRhZ19udW1iZXIpOwkvKiBmcmVlIHRhZyBtYXNrICovCisJCXNyYi0+dGFnX251bWJlciA9IDI1NTsKKwl9Cit9CisKKworLyogRmluZCBjbWQgaW4gU1JCIGxpc3QgKi8KK2lubGluZSBzdGF0aWMgc3RydWN0IFNjc2lSZXFCbGsgKmZpbmRfY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgCisJCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IFNjc2lSZXFCbGsgKmk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCBoZWFkLCBsaXN0KQorCQlpZiAoaS0+Y21kID09IGNtZCkKKwkJCXJldHVybiBpOworCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiX2dldF9mcmVlKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZhY2ItPnNyYl9mcmVlX2xpc3Q7CisJc3RydWN0IFNjc2lSZXFCbGsgKnNyYiA9IE5VTEw7CisKKwlpZiAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKKwkJc3JiID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LCBzdHJ1Y3QgU2NzaVJlcUJsaywgbGlzdCk7CisJCWxpc3RfZGVsKGhlYWQtPm5leHQpOworCQlkcHJpbnRrZGJnKERCR18wLCAic3JiX2dldF9mcmVlOiBzcmI9JXBcbiIsIHNyYik7CisJfQorCXJldHVybiBzcmI7Cit9CisKKworc3RhdGljIHZvaWQgc3JiX2ZyZWVfaW5zZXJ0KHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIpCit7CisJZHByaW50a2RiZyhEQkdfMCwgInNyYl9mcmVlX2luc2VydDogc3JiPSVwXG4iLCBzcmIpOworCWxpc3RfYWRkX3RhaWwoJnNyYi0+bGlzdCwgJmFjYi0+c3JiX2ZyZWVfbGlzdCk7Cit9CisKKworc3RhdGljIHZvaWQgc3JiX3dhaXRpbmdfaW5zZXJ0KHN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiwKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnNyYikKK3sKKwlkcHJpbnRrZGJnKERCR18wLCAic3JiX3dhaXRpbmdfaW5zZXJ0OiAocGlkIyVsaSkgPCUwMmktJWk+IHNyYj0lcFxuIiwKKwkJc3JiLT5jbWQtPnBpZCwgZGNiLT50YXJnZXRfaWQsIGRjYi0+dGFyZ2V0X2x1biwgc3JiKTsKKwlsaXN0X2FkZCgmc3JiLT5saXN0LCAmZGNiLT5zcmJfd2FpdGluZ19saXN0KTsKK30KKworCitzdGF0aWMgdm9pZCBzcmJfd2FpdGluZ19hcHBlbmQoc3RydWN0IERldmljZUN0bEJsayAqZGNiLAorCQlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKQoreworCWRwcmludGtkYmcoREJHXzAsICJzcmJfd2FpdGluZ19hcHBlbmQ6IChwaWQjJWxpKSA8JTAyaS0laT4gc3JiPSVwXG4iLAorCQkgc3JiLT5jbWQtPnBpZCwgZGNiLT50YXJnZXRfaWQsIGRjYi0+dGFyZ2V0X2x1biwgc3JiKTsKKwlsaXN0X2FkZF90YWlsKCZzcmItPmxpc3QsICZkY2ItPnNyYl93YWl0aW5nX2xpc3QpOworfQorCisKK3N0YXRpYyB2b2lkIHNyYl9nb2luZ19hcHBlbmQoc3RydWN0IERldmljZUN0bEJsayAqZGNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKQoreworCWRwcmludGtkYmcoREJHXzAsICJzcmJfZ29pbmdfYXBwZW5kOiAocGlkIyVsaSkgPCUwMmktJWk+IHNyYj0lcFxuIiwKKwkJc3JiLT5jbWQtPnBpZCwgZGNiLT50YXJnZXRfaWQsIGRjYi0+dGFyZ2V0X2x1biwgc3JiKTsKKwlsaXN0X2FkZF90YWlsKCZzcmItPmxpc3QsICZkY2ItPnNyYl9nb2luZ19saXN0KTsKK30KKworCitzdGF0aWMgdm9pZCBzcmJfZ29pbmdfcmVtb3ZlKHN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYikKK3sKKwlzdHJ1Y3QgU2NzaVJlcUJsayAqaTsKKwlzdHJ1Y3QgU2NzaVJlcUJsayAqdG1wOworCWRwcmludGtkYmcoREJHXzAsICJzcmJfZ29pbmdfcmVtb3ZlOiAocGlkIyVsaSkgPCUwMmktJWk+IHNyYj0lcFxuIiwKKwkJc3JiLT5jbWQtPnBpZCwgZGNiLT50YXJnZXRfaWQsIGRjYi0+dGFyZ2V0X2x1biwgc3JiKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpLCB0bXAsICZkY2ItPnNyYl9nb2luZ19saXN0LCBsaXN0KQorCQlpZiAoaSA9PSBzcmIpIHsKKwkJCWxpc3RfZGVsKCZzcmItPmxpc3QpOworCQkJYnJlYWs7CisJCX0KK30KKworCitzdGF0aWMgdm9pZCBzcmJfd2FpdGluZ19yZW1vdmUoc3RydWN0IERldmljZUN0bEJsayAqZGNiLAorCQlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKQoreworCXN0cnVjdCBTY3NpUmVxQmxrICppOworCXN0cnVjdCBTY3NpUmVxQmxrICp0bXA7CisJZHByaW50a2RiZyhEQkdfMCwgInNyYl93YWl0aW5nX3JlbW92ZTogKHBpZCMlbGkpIDwlMDJpLSVpPiBzcmI9JXBcbiIsCisJCXNyYi0+Y21kLT5waWQsIGRjYi0+dGFyZ2V0X2lkLCBkY2ItPnRhcmdldF9sdW4sIHNyYik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaSwgdG1wLCAmZGNiLT5zcmJfd2FpdGluZ19saXN0LCBsaXN0KQorCQlpZiAoaSA9PSBzcmIpIHsKKwkJCWxpc3RfZGVsKCZzcmItPmxpc3QpOworCQkJYnJlYWs7CisJCX0KK30KKworCitzdGF0aWMgdm9pZCBzcmJfZ29pbmdfdG9fd2FpdGluZ19tb3ZlKHN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiwKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnNyYikKK3sKKwlkcHJpbnRrZGJnKERCR18wLAorCQkic3JiX2dvaW5nX3RvX3dhaXRpbmdfbW92ZTogKHBpZCMlbGkpIDwlMDJpLSVpPiBzcmI9JXBcbiIsCisJCXNyYi0+Y21kLT5waWQsIGRjYi0+dGFyZ2V0X2lkLCBkY2ItPnRhcmdldF9sdW4sIHNyYik7CisJbGlzdF9tb3ZlKCZzcmItPmxpc3QsICZkY2ItPnNyYl93YWl0aW5nX2xpc3QpOworfQorCisKK3N0YXRpYyB2b2lkIHNyYl93YWl0aW5nX3RvX2dvaW5nX21vdmUoc3RydWN0IERldmljZUN0bEJsayAqZGNiLAorCQlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKQoreworCWRwcmludGtkYmcoREJHXzAsCisJCSJzcmJfd2FpdGluZ190b19nb2luZ19tb3ZlOiAocGlkIyVsaSkgPCUwMmktJWk+IHNyYj0lcFxuIiwKKwkJc3JiLT5jbWQtPnBpZCwgZGNiLT50YXJnZXRfaWQsIGRjYi0+dGFyZ2V0X2x1biwgc3JiKTsKKwlsaXN0X21vdmUoJnNyYi0+bGlzdCwgJmRjYi0+c3JiX2dvaW5nX2xpc3QpOworfQorCisKKy8qIFNldHMgdGhlIHRpbWVyIHRvIHdha2UgdXMgdXAgKi8KK3N0YXRpYyB2b2lkIHdhaXRpbmdfc2V0X3RpbWVyKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHVuc2lnbmVkIGxvbmcgdG8pCit7CisJaWYgKHRpbWVyX3BlbmRpbmcoJmFjYi0+d2FpdGluZ190aW1lcikpCisJCXJldHVybjsKKwlpbml0X3RpbWVyKCZhY2ItPndhaXRpbmdfdGltZXIpOworCWFjYi0+d2FpdGluZ190aW1lci5mdW5jdGlvbiA9IHdhaXRpbmdfdGltZW91dDsKKwlhY2ItPndhaXRpbmdfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBhY2I7CisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMgKyB0bywgYWNiLT5zY3NpX2hvc3QtPmxhc3RfcmVzZXQgLSBIWiAvIDIpKQorCQlhY2ItPndhaXRpbmdfdGltZXIuZXhwaXJlcyA9CisJCSAgICBhY2ItPnNjc2lfaG9zdC0+bGFzdF9yZXNldCAtIEhaIC8gMiArIDE7CisJZWxzZQorCQlhY2ItPndhaXRpbmdfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB0byArIDE7CisJYWRkX3RpbWVyKCZhY2ItPndhaXRpbmdfdGltZXIpOworfQorCisKKy8qIFNlbmQgdGhlIG5leHQgY29tbWFuZCBmcm9tIHRoZSB3YWl0aW5nIGxpc3QgdG8gdGhlIGJ1cyAqLworc3RhdGljIHZvaWQgd2FpdGluZ19wcm9jZXNzX25leHQoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYikKK3sKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpzdGFydCA9IE5VTEw7CisJc3RydWN0IERldmljZUN0bEJsayAqcG9zOworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYjsKKwlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiOworCXN0cnVjdCBsaXN0X2hlYWQgKmRjYl9saXN0X2hlYWQgPSAmYWNiLT5kY2JfbGlzdDsKKworCWlmIChhY2ItPmFjdGl2ZV9kY2IKKwkgICAgfHwgKGFjYi0+YWNiX2ZsYWcgJiAoUkVTRVRfREVURUNUICsgUkVTRVRfRE9ORSArIFJFU0VUX0RFVikpKQorCQlyZXR1cm47CisKKwlpZiAodGltZXJfcGVuZGluZygmYWNiLT53YWl0aW5nX3RpbWVyKSkKKwkJZGVsX3RpbWVyKCZhY2ItPndhaXRpbmdfdGltZXIpOworCisJaWYgKGxpc3RfZW1wdHkoZGNiX2xpc3RfaGVhZCkpCisJCXJldHVybjsKKworCS8qCisJICogRmluZCB0aGUgc3RhcnRpbmcgZGNiLiBOZWVkIHRvIGZpbmQgaXQgYWdhaW4gaW4gdGhlIGxpc3QKKwkgKiBzaW5jZSB0aGUgbGlzdCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHdlIHNldCB0aGUgcHRyIHRvIGl0CisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkY2IsIGRjYl9saXN0X2hlYWQsIGxpc3QpCisJCWlmIChkY2IgPT0gYWNiLT5kY2JfcnVuX3JvYmluKSB7CisJCQlzdGFydCA9IGRjYjsKKwkJCWJyZWFrOworCQl9CisJaWYgKCFzdGFydCkgeworCQkvKiBUaGlzIGNhbiBoYXBwZW4hICovCisJCXN0YXJ0ID0gbGlzdF9lbnRyeShkY2JfbGlzdF9oZWFkLT5uZXh0LCB0eXBlb2YoKnN0YXJ0KSwgbGlzdCk7CisJCWFjYi0+ZGNiX3J1bl9yb2JpbiA9IHN0YXJ0OworCX0KKworCisJLyoKKwkgKiBMb29wIG92ZXIgdGhlIGRjYiwgYnV0IHdlIHN0YXJ0IHNvbWV3aGVyZSAocG90ZW50aWFsbHkpIGluCisJICogdGhlIG1pZGRsZSBvZiB0aGUgbG9vcCBzbyB3ZSBuZWVkIHRvIG1hbnVsbHkgZG8gdGhpcy4KKwkgKi8KKwlwb3MgPSBzdGFydDsKKwlkbyB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKndhaXRpbmdfbGlzdF9oZWFkID0gJnBvcy0+c3JiX3dhaXRpbmdfbGlzdDsKKworCQkvKiBNYWtlIHN1cmUsIHRoZSBuZXh0IGFub3RoZXIgZGV2aWNlIGdldHMgc2NoZWR1bGVkIC4uLiAqLworCQlhY2ItPmRjYl9ydW5fcm9iaW4gPSBkY2JfZ2V0X25leHQoZGNiX2xpc3RfaGVhZCwKKwkJCQkJCSAgYWNiLT5kY2JfcnVuX3JvYmluKTsKKworCQlpZiAobGlzdF9lbXB0eSh3YWl0aW5nX2xpc3RfaGVhZCkgfHwKKwkJICAgIHBvcy0+bWF4X2NvbW1hbmQgPD0gbGlzdF9zaXplKCZwb3MtPnNyYl9nb2luZ19saXN0KSkgeworCQkJLyogbW92ZSB0byBuZXh0IGRjYiAqLworCQkJcG9zID0gZGNiX2dldF9uZXh0KGRjYl9saXN0X2hlYWQsIHBvcyk7CisJCX0gZWxzZSB7CisJCQlzcmIgPSBsaXN0X2VudHJ5KHdhaXRpbmdfbGlzdF9oZWFkLT5uZXh0LAorCQkJCQkgc3RydWN0IFNjc2lSZXFCbGssIGxpc3QpOworCisJCQkvKiBUcnkgdG8gc2VuZCB0byB0aGUgYnVzICovCisJCQlpZiAoIXN0YXJ0X3Njc2koYWNiLCBwb3MsIHNyYikpCisJCQkJc3JiX3dhaXRpbmdfdG9fZ29pbmdfbW92ZShwb3MsIHNyYik7CisJCQllbHNlCisJCQkJd2FpdGluZ19zZXRfdGltZXIoYWNiLCBIWi81MCk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKHBvcyAhPSBzdGFydCk7Cit9CisKKworLyogV2FrZSB1cCB3YWl0aW5nIHF1ZXVlICovCitzdGF0aWMgdm9pZCB3YWl0aW5nX3RpbWVvdXQodW5zaWduZWQgbG9uZyBwdHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiID0gKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICopcHRyOworCWRwcmludGtkYmcoREJHXzEsCisJCSJ3YWl0aW5nX3RpbWVvdXQ6IFF1ZXVlIHdva2VuIHVwIGJ5IHRpbWVyLiBhY2I9JXBcbiIsIGFjYik7CisJREMzOTV4X0xPQ0tfSU8oYWNiLT5zY3NpX2hvc3QsIGZsYWdzKTsKKwl3YWl0aW5nX3Byb2Nlc3NfbmV4dChhY2IpOworCURDMzk1eF9VTkxPQ0tfSU8oYWNiLT5zY3NpX2hvc3QsIGZsYWdzKTsKK30KKworCisvKiBHZXQgdGhlIERDQiBmb3IgYSBnaXZlbiBJRC9MVU4gY29tYmluYXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpmaW5kX2RjYihzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCB1OCBpZCwgdTggbHVuKQoreworCXJldHVybiBhY2ItPmNoaWxkcmVuW2lkXVtsdW5dOworfQorCisKKy8qIFNlbmQgU0NTSSBSZXF1ZXN0IEJsb2NrIChzcmIpIHRvIGFkYXB0ZXIgKGFjYikgKi8KK3N0YXRpYyB2b2lkIHNlbmRfc3JiKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIpCit7CisJc3RydWN0IERldmljZUN0bEJsayAqZGNiID0gc3JiLT5kY2I7CisKKwlpZiAoZGNiLT5tYXhfY29tbWFuZCA8PSBsaXN0X3NpemUoJmRjYi0+c3JiX2dvaW5nX2xpc3QpIHx8CisJICAgIGFjYi0+YWN0aXZlX2RjYiB8fAorCSAgICAoYWNiLT5hY2JfZmxhZyAmIChSRVNFVF9ERVRFQ1QgKyBSRVNFVF9ET05FICsgUkVTRVRfREVWKSkpIHsKKwkJc3JiX3dhaXRpbmdfYXBwZW5kKGRjYiwgc3JiKTsKKwkJd2FpdGluZ19wcm9jZXNzX25leHQoYWNiKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghc3RhcnRfc2NzaShhY2IsIGRjYiwgc3JiKSkKKwkJc3JiX2dvaW5nX2FwcGVuZChkY2IsIHNyYik7CisJZWxzZSB7CisJCXNyYl93YWl0aW5nX2luc2VydChkY2IsIHNyYik7CisJCXdhaXRpbmdfc2V0X3RpbWVyKGFjYiwgSFogLyA1MCk7CisJfQorfQorCisKKy8qIFByZXBhcmUgU1JCIGZvciBiZWluZyBzZW50IHRvIERldmljZSBEQ0Igdy8gY29tbWFuZCAqY21kICovCitzdGF0aWMgdm9pZCBidWlsZF9zcmIoc3RydWN0IHNjc2lfY21uZCAqY21kLCBzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IsCisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIpCit7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyID0gY21kLT5zY19kYXRhX2RpcmVjdGlvbjsKKwlkcHJpbnRrZGJnKERCR18wLCAiYnVpbGRfc3JiOiAocGlkIyVsaSkgPCUwMmktJWk+XG4iLAorCQljbWQtPnBpZCwgZGNiLT50YXJnZXRfaWQsIGRjYi0+dGFyZ2V0X2x1bik7CisKKwlzcmItPmRjYiA9IGRjYjsKKwlzcmItPmNtZCA9IGNtZDsKKwlzcmItPnNnX2NvdW50ID0gMDsKKwlzcmItPnRvdGFsX3hmZXJfbGVuZ3RoID0gMDsKKwlzcmItPnNnX2J1c19hZGRyID0gMDsKKwlzcmItPnZpcnRfYWRkciA9IE5VTEw7CisJc3JiLT5zZ19pbmRleCA9IDA7CisJc3JiLT5hZGFwdGVyX3N0YXR1cyA9IDA7CisJc3JiLT50YXJnZXRfc3RhdHVzID0gMDsKKwlzcmItPm1zZ19jb3VudCA9IDA7CisJc3JiLT5zdGF0dXMgPSAwOworCXNyYi0+ZmxhZyA9IDA7CisJc3JiLT5zdGF0ZSA9IDA7CisJc3JiLT5yZXRyeV9jb3VudCA9IDA7CisJc3JiLT50YWdfbnVtYmVyID0gVEFHX05PTkU7CisJc3JiLT5zY3NpX3BoYXNlID0gUEhfQlVTX0ZSRUU7CS8qIGluaXRpYWwgcGhhc2UgKi8KKwlzcmItPmVuZF9tZXNzYWdlID0gMDsKKworCWlmIChkaXIgPT0gUENJX0RNQV9OT05FIHx8ICFjbWQtPnJlcXVlc3RfYnVmZmVyKSB7CisJCWRwcmludGtkYmcoREJHXzAsCisJCQkiYnVpbGRfc3JiOiBbMF0gbGVuPSVkIGJ1Zj0lcCB1c2Vfc2c9JWQgIU1BUD0lMDh4XG4iLAorCQkJY21kLT5idWZmbGVuLCBjbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJY21kLT51c2Vfc2csIHNyYi0+c2VnbWVudF94WzBdLmFkZHJlc3MpOworCX0gZWxzZSBpZiAoY21kLT51c2Vfc2cpIHsKKwkJaW50IGk7CisJCXUzMiByZXFsZW4gPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzbCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikKKwkJCQkJIGNtZC0+cmVxdWVzdF9idWZmZXI7CisJCXN0cnVjdCBTR2VudHJ5ICpzZ3AgPSBzcmItPnNlZ21lbnRfeDsKKwkJc3JiLT5zZ19jb3VudCA9IHBjaV9tYXBfc2coZGNiLT5hY2ItPmRldiwgc2wsIGNtZC0+dXNlX3NnLAorCQkJCQkgICBkaXIpOworCQlkcHJpbnRrZGJnKERCR18wLAorCQkJImJ1aWxkX3NyYjogW25dIGxlbj0lZCBidWY9JXAgdXNlX3NnPSVkIHNlZ3M9JWRcbiIsCisJCQlyZXFsZW4sIGNtZC0+cmVxdWVzdF9idWZmZXIsIGNtZC0+dXNlX3NnLAorCQkJc3JiLT5zZ19jb3VudCk7CisKKwkJZm9yIChpID0gMDsgaSA8IHNyYi0+c2dfY291bnQ7IGkrKykgeworCQkJdTMyIHNlZ2xlbiA9ICh1MzIpc2dfZG1hX2xlbihzbCArIGkpOworCQkJc2dwW2ldLmFkZHJlc3MgPSAodTMyKXNnX2RtYV9hZGRyZXNzKHNsICsgaSk7CisJCQlzZ3BbaV0ubGVuZ3RoID0gc2VnbGVuOworCQkJc3JiLT50b3RhbF94ZmVyX2xlbmd0aCArPSBzZWdsZW47CisJCQlzcmItPnZpcnRfbWFwW2ldID0ga21hcChzbFtpXS5wYWdlKTsKKwkJfQorCQlzcmItPnZpcnRfYWRkciA9IHNyYi0+dmlydF9tYXBbMF07CisJCXNncCArPSBzcmItPnNnX2NvdW50IC0gMTsKKworCQkvKgorCQkgKiBhZGp1c3QgbGFzdCBwYWdlIGlmIHRvbyBiaWcgYXMgaXQgaXMgYWxsb2NhdGVkCisJCSAqIG9uIGV2ZW4gcGFnZSBib3VuZGFyaWVzCisJCSAqLworCQlpZiAoc3JiLT50b3RhbF94ZmVyX2xlbmd0aCA+IHJlcWxlbikgeworCQkJc2dwLT5sZW5ndGggLT0gKHNyYi0+dG90YWxfeGZlcl9sZW5ndGggLSByZXFsZW4pOworCQkJc3JiLT50b3RhbF94ZmVyX2xlbmd0aCA9IHJlcWxlbjsKKwkJfQorCisJCS8qIEZpeHVwIGZvciBXSURFIHBhZGRpbmcgLSBtYWtlIHN1cmUgbGVuZ3RoIGlzIGV2ZW4gKi8KKwkJaWYgKGRjYi0+c3luY19wZXJpb2QgJiBXSURFX1NZTkMgJiYKKwkJICAgIHNyYi0+dG90YWxfeGZlcl9sZW5ndGggJSAyKSB7CisJCQlzcmItPnRvdGFsX3hmZXJfbGVuZ3RoKys7CisJCQlzZ3AtPmxlbmd0aCsrOworCQl9CisKKwkJc3JiLT5zZ19idXNfYWRkciA9IHBjaV9tYXBfc2luZ2xlKGRjYi0+YWNiLT5kZXYsCisJCQkJCQlzcmItPnNlZ21lbnRfeCwKKwkJCQkgICAgICAgICAgICAJU0VHTUVOVFhfTEVOLAorCQkJCSAgICAgICAgICAgIAlQQ0lfRE1BX1RPREVWSUNFKTsKKworCQlkcHJpbnRrZGJnKERCR19TRywgImJ1aWxkX3NyYjogW25dIG1hcCBzZyAlcC0+JTA4eCglMDV4KVxuIiwKKwkJCXNyYi0+c2VnbWVudF94LCBzcmItPnNnX2J1c19hZGRyLCBTRUdNRU5UWF9MRU4pOworCX0gZWxzZSB7CisJCXNyYi0+dG90YWxfeGZlcl9sZW5ndGggPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJc3JiLT5zZ19jb3VudCA9IDE7CisJCXNyYi0+c2VnbWVudF94WzBdLmFkZHJlc3MgPQorCQkJcGNpX21hcF9zaW5nbGUoZGNiLT5hY2ItPmRldiwgY21kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQkgICAgICAgc3JiLT50b3RhbF94ZmVyX2xlbmd0aCwgZGlyKTsKKworCQkvKiBGaXh1cCBmb3IgV0lERSBwYWRkaW5nIC0gbWFrZSBzdXJlIGxlbmd0aCBpcyBldmVuICovCisJCWlmIChkY2ItPnN5bmNfcGVyaW9kICYgV0lERV9TWU5DICYmIHNyYi0+dG90YWxfeGZlcl9sZW5ndGggJSAyKQorCQkJc3JiLT50b3RhbF94ZmVyX2xlbmd0aCsrOworCisJCXNyYi0+c2VnbWVudF94WzBdLmxlbmd0aCA9IHNyYi0+dG90YWxfeGZlcl9sZW5ndGg7CisJCXNyYi0+dmlydF9hZGRyID0gY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJZHByaW50a2RiZyhEQkdfMCwKKwkJCSJidWlsZF9zcmI6IFsxXSBsZW49JWQgYnVmPSVwIHVzZV9zZz0lZCBtYXA9JTA4eFxuIiwKKwkJCXNyYi0+dG90YWxfeGZlcl9sZW5ndGgsIGNtZC0+cmVxdWVzdF9idWZmZXIsCisJCQljbWQtPnVzZV9zZywgc3JiLT5zZWdtZW50X3hbMF0uYWRkcmVzcyk7CisJfQorfQorCisKKy8qKgorICogZGMzOTV4X3F1ZXVlX2NvbW1hbmQgLSBxdWV1ZSBzY3NpIGNvbW1hbmQgcGFzc2VkIGZyb20gdGhlIG1pZAorICogbGF5ZXIsIGludm9rZSAnZG9uZScgb24gY29tcGxldGlvbgorICoKKyAqIEBjbWQ6IHBvaW50ZXIgdG8gc2NzaSBjb21tYW5kIG9iamVjdAorICogQGRvbmU6IGZ1bmN0aW9uIHBvaW50ZXIgdG8gYmUgaW52b2tlZCBvbiBjb21wbGV0aW9uCisgKgorICogUmV0dXJucyAxIGlmIHRoZSBhZGFwdGVyIChob3N0KSBpcyBidXN5LCBlbHNlIHJldHVybnMgMC4gT25lCisgKiByZWFzb24gZm9yIGFuIGFkYXB0ZXIgdG8gYmUgYnVzeSBpcyB0aGF0IHRoZSBudW1iZXIKKyAqIG9mIG91dHN0YW5kaW5nIHF1ZXVlZCBjb21tYW5kcyBpcyBhbHJlYWR5IGVxdWFsIHRvCisgKiBzdHJ1Y3QgU2NzaV9Ib3N0OjpjYW5fcXVldWUgLgorICoKKyAqIFJlcXVpcmVkOiBpZiBzdHJ1Y3QgU2NzaV9Ib3N0OjpjYW5fcXVldWUgaXMgZXZlciBub24temVybworICogICAgICAgICAgIHRoZW4gdGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZC4KKyAqCisgKiBMb2Nrczogc3RydWN0IFNjc2lfSG9zdDo6aG9zdF9sb2NrIGhlbGQgb24gZW50cnkgKHdpdGggImlycXNhdmUiKQorICogICAgICAgIGFuZCBpcyBleHBlY3RlZCB0byBiZSBoZWxkIG9uIHJldHVybi4KKyAqCisgKiovCitzdGF0aWMgaW50IGRjMzk1eF9xdWV1ZV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3RydWN0IERldmljZUN0bEJsayAqZGNiOworCXN0cnVjdCBTY3NpUmVxQmxrICpzcmI7CisJc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiA9CisJICAgIChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlkcHJpbnRrZGJnKERCR18wLCAicXVldWVfY29tbWFuZDogKHBpZCMlbGkpIDwlMDJpLSVpPiBjbW5kPTB4JTAyeFxuIiwKKwkJY21kLT5waWQsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwgY21kLT5jbW5kWzBdKTsKKworCS8qIEFzc3VtZSBCQURfVEFSR0VUOyB3aWxsIGJlIGNsZWFyZWQgbGF0ZXIgKi8KKwljbWQtPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2OworCisJLyogaWdub3JlIGludmFsaWQgdGFyZ2V0cyAqLworCWlmIChjbWQtPmRldmljZS0+aWQgPj0gYWNiLT5zY3NpX2hvc3QtPm1heF9pZCB8fAorCSAgICBjbWQtPmRldmljZS0+bHVuID49IGFjYi0+c2NzaV9ob3N0LT5tYXhfbHVuIHx8CisJICAgIGNtZC0+ZGV2aWNlLT5sdW4gPjMxKSB7CisJCWdvdG8gY29tcGxldGU7CisJfQorCisJLyogZG9lcyB0aGUgc3BlY2lmaWVkIGx1biBvbiB0aGUgc3BlY2lmaWVkIGRldmljZSBleGlzdCAqLworCWlmICghKGFjYi0+ZGNiX21hcFtjbWQtPmRldmljZS0+aWRdICYgKDEgPDwgY21kLT5kZXZpY2UtPmx1bikpKSB7CisJCWRwcmludGtsKEtFUk5fSU5GTywgInF1ZXVlX2NvbW1hbmQ6IElnbm9yZSB0YXJnZXQgPCUwMmktJWk+XG4iLAorCQkJY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKwkJZ290byBjb21wbGV0ZTsKKwl9CisKKwkvKiBkbyB3ZSBoYXZlIGEgRENCIGZvciB0aGUgZGV2aWNlICovCisJZGNiID0gZmluZF9kY2IoYWNiLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCWlmICghZGNiKSB7CisJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJZHByaW50a2woS0VSTl9FUlIsICJxdWV1ZV9jb21tYW5kOiBObyBzdWNoIGRldmljZSA8JTAyaS0laT4iLAorCQkJY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKwkJZ290byBjb21wbGV0ZTsKKwl9CisKKwkvKiBzZXQgY2FsbGJhY2sgYW5kIGNsZWFyIHJlc3VsdCBpbiB0aGUgY29tbWFuZCAqLworCWNtZC0+c2NzaV9kb25lID0gZG9uZTsKKwljbWQtPnJlc3VsdCA9IDA7CisKKwlzcmIgPSBzcmJfZ2V0X2ZyZWUoYWNiKTsKKwlpZiAoIXNyYikKKwl7CisJCS8qCisJCSAqIFJldHVybiAxIHNpbmNlIHdlIGFyZSB1bmFibGUgdG8gcXVldWUgdGhpcyBjb21tYW5kIGF0IHRoaXMKKwkJICogcG9pbnQgaW4gdGltZS4KKwkJICovCisJCWRwcmludGtkYmcoREJHXzAsICJxdWV1ZV9jb21tYW5kOiBObyBmcmVlIHNyYidzXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJYnVpbGRfc3JiKGNtZCwgZGNiLCBzcmIpOworCisJaWYgKCFsaXN0X2VtcHR5KCZkY2ItPnNyYl93YWl0aW5nX2xpc3QpKSB7CisJCS8qIGFwcGVuZCB0byB3YWl0aW5nIHF1ZXVlICovCisJCXNyYl93YWl0aW5nX2FwcGVuZChkY2IsIHNyYik7CisJCXdhaXRpbmdfcHJvY2Vzc19uZXh0KGFjYik7CisJfSBlbHNlIHsKKwkJLyogcHJvY2VzcyBpbW1lZGlhdGVseSAqLworCQlzZW5kX3NyYihhY2IsIHNyYik7CisJfQorCWRwcmludGtkYmcoREJHXzEsICJxdWV1ZV9jb21tYW5kOiAocGlkIyVsaSkgZG9uZVxuIiwgY21kLT5waWQpOworCXJldHVybiAwOworCitjb21wbGV0ZToKKwkvKgorCSAqIENvbXBsZXRlIHRoZSBjb21tYW5kIGltbWVkaWF0ZXksIGFuZCB0aGVuIHJldHVybiAwIHRvCisJICogaW5kaWNhdGUgdGhhdCB3ZSBoYXZlIGhhbmRsZWQgdGhlIGNvbW1hbmQuIFRoaXMgaXMgdXN1YWxseQorCSAqIGRvbmUgd2hlbiB0aGUgY29tbWFkIGlzIGZvciB0aGluZ3MgbGlrZSBub24gZXhpc3RlbnQKKwkgKiBkZXZpY2VzLgorCSAqLworCWRvbmUoY21kKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogUmV0dXJuIHRoZSBkaXNrIGdlb21ldHJ5IGZvciB0aGUgZ2l2ZW4gU0NTSSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgZGMzOTV4X2Jpb3NfcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICppbmZvKQoreworI2lmZGVmIENPTkZJR19TQ1NJX0RDMzk1eF9UUk1TMTA0MF9UUkFETUFQCisJaW50IGhlYWRzLCBzZWN0b3JzLCBjeWxpbmRlcnM7CisJc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYjsKKwlpbnQgc2l6ZSA9IGNhcGFjaXR5OworCisJZHByaW50a2RiZyhEQkdfMCwgImRjMzk1eF9iaW9zX3BhcmFtLi4uLi4uLi4uLi4uLi5cbiIpOworCWFjYiA9IChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqKXNkZXYtPmhvc3QtPmhvc3RkYXRhOworCWhlYWRzID0gNjQ7CisJc2VjdG9ycyA9IDMyOworCWN5bGluZGVycyA9IHNpemUgLyAoaGVhZHMgKiBzZWN0b3JzKTsKKworCWlmICgoYWNiLT5nbW9kZTIgJiBOQUNfR1JFQVRFUl8xRykgJiYgKGN5bGluZGVycyA+IDEwMjQpKSB7CisJCWhlYWRzID0gMjU1OworCQlzZWN0b3JzID0gNjM7CisJCWN5bGluZGVycyA9IHNpemUgLyAoaGVhZHMgKiBzZWN0b3JzKTsKKwl9CisJZ2VvbVswXSA9IGhlYWRzOworCWdlb21bMV0gPSBzZWN0b3JzOworCWdlb21bMl0gPSBjeWxpbmRlcnM7CisJcmV0dXJuIDA7CisjZWxzZQorCXJldHVybiBzY3NpY2FtX2Jpb3NfcGFyYW0oYmRldiwgY2FwYWNpdHksIGluZm8pOworI2VuZGlmCit9CisKKworc3RhdGljIHZvaWQgZHVtcF9yZWdpc3Rlcl9pbmZvKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsCisJCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYikKK3sKKwl1MTYgcHN0YXQ7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGFjYi0+ZGV2OworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX1NUQVRVUywgJnBzdGF0KTsKKwlpZiAoIWRjYikKKwkJZGNiID0gYWNiLT5hY3RpdmVfZGNiOworCWlmICghc3JiICYmIGRjYikKKwkJc3JiID0gZGNiLT5hY3RpdmVfc3JiOworCWlmIChzcmIpIHsKKwkJaWYgKCFzcmItPmNtZCkKKwkJCWRwcmludGtsKEtFUk5fSU5GTywgImR1bXA6IHNyYj0lcCBjbWQ9JXAgT09PUFMhXG4iLAorCQkJCXNyYiwgc3JiLT5jbWQpOworCQllbHNlCisJCQlkcHJpbnRrbChLRVJOX0lORk8sICJkdW1wOiBzcmI9JXAgY21kPSVwIChwaWQjJWxpKSAiCisJCQkJICJjbW5kPTB4JTAyeCA8JTAyaS0laT5cbiIsCisJCQkgICAgCXNyYiwgc3JiLT5jbWQsIHNyYi0+Y21kLT5waWQsCisJCQkJc3JiLT5jbWQtPmNtbmRbMF0sIHNyYi0+Y21kLT5kZXZpY2UtPmlkLAorCQkJICAgICAgIAlzcmItPmNtZC0+ZGV2aWNlLT5sdW4pOworCQlwcmludGsoIiAgc2dsaXN0PSVwIGNudD0laSBpZHg9JWkgbGVuPSVpXG4iLAorCQkgICAgICAgc3JiLT5zZWdtZW50X3gsIHNyYi0+c2dfY291bnQsIHNyYi0+c2dfaW5kZXgsCisJCSAgICAgICBzcmItPnRvdGFsX3hmZXJfbGVuZ3RoKTsKKwkJcHJpbnRrKCIgIHN0YXRlPTB4JTA0eCBzdGF0dXM9MHglMDJ4IHBoYXNlPTB4JTAyeCAoJXNjb25uLilcbiIsCisJCSAgICAgICBzcmItPnN0YXRlLCBzcmItPnN0YXR1cywgc3JiLT5zY3NpX3BoYXNlLAorCQkgICAgICAgKGFjYi0+YWN0aXZlX2RjYikgPyAiIiA6ICJub3QiKTsKKwl9CisJZHByaW50a2woS0VSTl9JTkZPLCAiZHVtcDogU0NTSXtzdGF0dXM9MHglMDR4IGZpZm9jbnQ9MHglMDJ4ICIKKwkJInNpZ25hbHM9MHglMDJ4IGlycXN0YXQ9MHglMDJ4IHN5bmM9MHglMDJ4IHRhcmdldD0weCUwMnggIgorCQkicnNlbGlkPTB4JTAyeCBjdHI9MHglMDh4IGlycWVuPTB4JTAyeCBjb25maWc9MHglMDR4ICIKKwkJImNvbmZpZzI9MHglMDJ4IGNtZD0weCUwMnggc2VsdG89MHglMDJ4fVxuIiwKKwkJREMzOTV4X3JlYWQxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX1NUQVRVUyksCisJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk9DTlQpLAorCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9TSUdOQUwpLAorCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9JTlRTVEFUVVMpLAorCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9TWU5DKSwKKwkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfVEFSR0VUSUQpLAorCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9JRE1TRyksCisJCURDMzk1eF9yZWFkMzIoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT1VOVEVSKSwKKwkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfSU5URU4pLAorCQlEQzM5NXhfcmVhZDE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09ORklHMCksCisJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTkZJRzIpLAorCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT01NQU5EKSwKKwkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfVElNRU9VVCkpOworCWRwcmludGtsKEtFUk5fSU5GTywgImR1bXA6IERNQXtjbWQ9MHglMDR4IGZpZm9jbnQ9MHglMDJ4IGZzdGF0PTB4JTAyeCAiCisJCSJpcnFzdGF0PTB4JTAyeCBpcnFlbj0weCUwMnggY2ZnPTB4JTA0eCB0Y3RyPTB4JTA4eCAiCisJCSJjdGN0cj0weCUwOHggYWRkcj0weCUwOHg6MHglMDh4fVxuIiwKKwkJREMzOTV4X3JlYWQxNihhY2IsIFRSTV9TMTA0MF9ETUFfQ09NTUFORCksCisJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9ETUFfRklGT0NOVCksCisJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9ETUFfRklGT1NUQVQpLAorCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfRE1BX1NUQVRVUyksCisJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9ETUFfSU5URU4pLAorCQlEQzM5NXhfcmVhZDE2KGFjYiwgVFJNX1MxMDQwX0RNQV9DT05GSUcpLAorCQlEQzM5NXhfcmVhZDMyKGFjYiwgVFJNX1MxMDQwX0RNQV9YQ05UKSwKKwkJREMzOTV4X3JlYWQzMihhY2IsIFRSTV9TMTA0MF9ETUFfQ1hDTlQpLAorCQlEQzM5NXhfcmVhZDMyKGFjYiwgVFJNX1MxMDQwX0RNQV9YSElHSEFERFIpLAorCQlEQzM5NXhfcmVhZDMyKGFjYiwgVFJNX1MxMDQwX0RNQV9YTE9XQUREUikpOworCWRwcmludGtsKEtFUk5fSU5GTywgImR1bXA6IGdlbntnY3RybD0weCUwMnggZ3N0YXQ9MHglMDJ4IGd0bXI9MHglMDJ4fSAiCisJCSJwY2l7c3RhdHVzPTB4JTA0eH1cbiIsCisJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9HRU5fQ09OVFJPTCksCisJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9HRU5fU1RBVFVTKSwKKwkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX0dFTl9USU1FUiksCisJCXBzdGF0KTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfZmlmbyhzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBjaGFyICp0eHQpCit7CisjaWYgZGVidWdfZW5hYmxlZChEQkdfRklGTykKKwl1OCBsaW5lcyA9IERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX1NJR05BTCk7CisJdTggZmlmb2NudCA9IERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk9DTlQpOworCWlmICghKGZpZm9jbnQgJiAweDQwKSkKKwkJZHByaW50a2RiZyhEQkdfRklGTywKKwkJCSJjbGVhcl9maWZvOiAoJWkgYnl0ZXMpIG9uIHBoYXNlICUwMnggaW4gJXNcbiIsCisJCQlmaWZvY250ICYgMHgzZiwgbGluZXMsIHR4dCk7CisjZW5kaWYKKwlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX0NMUkZJRk8pOworfQorCisKK3N0YXRpYyB2b2lkIHJlc2V0X2Rldl9wYXJhbShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiKQoreworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYjsKKwlzdHJ1Y3QgTnZSYW1UeXBlICplZXByb20gPSAmYWNiLT5lZXByb207CisJZHByaW50a2RiZyhEQkdfMCwgInJlc2V0X2Rldl9wYXJhbTogYWNiPSVwXG4iLCBhY2IpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkY2IsICZhY2ItPmRjYl9saXN0LCBsaXN0KSB7CisJCXU4IHBlcmlvZF9pbmRleDsKKworCQlkY2ItPnN5bmNfbW9kZSAmPSB+KFNZTkNfTkVHT19ET05FICsgV0lERV9ORUdPX0RPTkUpOworCQlkY2ItPnN5bmNfcGVyaW9kID0gMDsKKwkJZGNiLT5zeW5jX29mZnNldCA9IDA7CisKKwkJZGNiLT5kZXZfbW9kZSA9IGVlcHJvbS0+dGFyZ2V0W2RjYi0+dGFyZ2V0X2lkXS5jZmcwOworCQlwZXJpb2RfaW5kZXggPSBlZXByb20tPnRhcmdldFtkY2ItPnRhcmdldF9pZF0ucGVyaW9kICYgMHgwNzsKKwkJZGNiLT5taW5fbmVnb19wZXJpb2QgPSBjbG9ja19wZXJpb2RbcGVyaW9kX2luZGV4XTsKKwkJaWYgKCEoZGNiLT5kZXZfbW9kZSAmIE5UQ19ET19XSURFX05FR08pCisJCSAgICB8fCAhKGFjYi0+Y29uZmlnICYgSENDX1dJREVfQ0FSRCkpCisJCQlkY2ItPnN5bmNfbW9kZSAmPSB+V0lERV9ORUdPX0VOQUJMRTsKKwl9Cit9CisKKworLyoKKyAqIHBlcmZvcm0gYSBoYXJkIHJlc2V0IG9uIHRoZSBTQ1NJIGJ1cworICogQGNtZCAtIHNvbWUgY29tbWFuZCBmb3IgdGhpcyBob3N0IChmb3IgZmV0Y2hpbmcgaG9va3MpCisgKiBSZXR1cm5zOiBTVUNDRVNTICgweDIwMDIpIG9uIHN1Y2Nlc3MsIGVsc2UgRkFJTEVEICgweDIwMDMpLgorICovCitzdGF0aWMgaW50IGRjMzk1eF9laF9idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IgPQorCQkoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJZHByaW50a2woS0VSTl9JTkZPLAorCQkiZWhfYnVzX3Jlc2V0OiAocGlkIyVsaSkgdGFyZ2V0PTwlMDJpLSVpPiBjbWQ9JXBcbiIsCisJCWNtZC0+cGlkLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sIGNtZCk7CisKKwlpZiAodGltZXJfcGVuZGluZygmYWNiLT53YWl0aW5nX3RpbWVyKSkKKwkJZGVsX3RpbWVyKCZhY2ItPndhaXRpbmdfdGltZXIpOworCisJLyoKKwkgKiBkaXNhYmxlIGludGVycnVwdCAgICAKKwkgKi8KKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX0RNQV9JTlRFTiwgMHgwMCk7CisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0lOVEVOLCAweDAwKTsKKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09OVFJPTCwgRE9fUlNUTU9EVUxFKTsKKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX0RNQV9DT05UUk9MLCBETUFSRVNFVE1PRFVMRSk7CisKKwlyZXNldF9zY3NpX2J1cyhhY2IpOworCXVkZWxheSg1MDApOworCisJLyogV2UgbWF5IGJlIGluIHNlcmlvdXMgdHJvdWJsZS4gV2FpdCBzb21lIHNlY29uZHMgKi8KKwlhY2ItPnNjc2lfaG9zdC0+bGFzdF9yZXNldCA9CisJICAgIGppZmZpZXMgKyAzICogSFogLyAyICsKKwkgICAgSFogKiBhY2ItPmVlcHJvbS5kZWxheV90aW1lOworCisJLyoKKwkgKiByZS1lbmFibGUgaW50ZXJydXB0ICAgICAgCisJICovCisJLyogQ2xlYXIgU0NTSSBGSUZPICAgICAgICAgICovCisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9ETUFfQ09OVFJPTCwgQ0xSWEZJRk8pOworCWNsZWFyX2ZpZm8oYWNiLCAiZWhfYnVzX3Jlc2V0Iik7CisJLyogRGVsZXRlIHBlbmRpbmcgSVJRICovCisJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfSU5UU1RBVFVTKTsKKwlzZXRfYmFzaWNfY29uZmlnKGFjYik7CisKKwlyZXNldF9kZXZfcGFyYW0oYWNiKTsKKwlkb2luZ19zcmJfZG9uZShhY2IsIERJRF9SRVNFVCwgY21kLCAwKTsKKwlhY2ItPmFjdGl2ZV9kY2IgPSBOVUxMOworCWFjYi0+YWNiX2ZsYWcgPSAwOwkvKiBSRVNFVF9ERVRFQ1QsIFJFU0VUX0RPTkUgLFJFU0VUX0RFViAqLworCXdhaXRpbmdfcHJvY2Vzc19uZXh0KGFjYik7CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworCisvKgorICogYWJvcnQgYW4gZXJyYW50IFNDU0kgY29tbWFuZAorICogQGNtZCAtIGNvbW1hbmQgdG8gYmUgYWJvcnRlZAorICogUmV0dXJuczogU1VDQ0VTUyAoMHgyMDAyKSBvbiBzdWNjZXNzLCBlbHNlIEZBSUxFRCAoMHgyMDAzKS4KKyAqLworc3RhdGljIGludCBkYzM5NXhfZWhfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCS8qCisJICogTG9vayBpbnRvIG91ciBjb21tYW5kIHF1ZXVlczogSWYgaXQgaGFzIG5vdCBiZWVuIHNlbnQgYWxyZWFkeSwKKwkgKiB3ZSByZW1vdmUgaXQgYW5kIHJldHVybiBzdWNjZXNzLiBPdGhlcndpc2UgZmFpbC4KKwkgKi8KKwlzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiID0KKwkgICAgKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYjsKKwlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiOworCWRwcmludGtsKEtFUk5fSU5GTywgImVoX2Fib3J0OiAocGlkIyVsaSkgdGFyZ2V0PTwlMDJpLSVpPiBjbWQ9JXBcbiIsCisJCWNtZC0+cGlkLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sIGNtZCk7CisKKwlkY2IgPSBmaW5kX2RjYihhY2IsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisJaWYgKCFkY2IpIHsKKwkJZHByaW50a2woS0VSTl9ERUJVRywgImVoX2Fib3J0OiBObyBzdWNoIGRldmljZVxuIik7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJc3JiID0gZmluZF9jbWQoY21kLCAmZGNiLT5zcmJfd2FpdGluZ19saXN0KTsKKwlpZiAoc3JiKSB7CisJCXNyYl93YWl0aW5nX3JlbW92ZShkY2IsIHNyYik7CisJCXBjaV91bm1hcF9zcmJfc2Vuc2UoYWNiLCBzcmIpOworCQlwY2lfdW5tYXBfc3JiKGFjYiwgc3JiKTsKKwkJZnJlZV90YWcoZGNiLCBzcmIpOworCQlzcmJfZnJlZV9pbnNlcnQoYWNiLCBzcmIpOworCQlkcHJpbnRrbChLRVJOX0RFQlVHLCAiZWhfYWJvcnQ6IENvbW1hbmQgd2FzIHdhaXRpbmdcbiIpOworCQljbWQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCXNyYiA9IGZpbmRfY21kKGNtZCwgJmRjYi0+c3JiX2dvaW5nX2xpc3QpOworCWlmIChzcmIpIHsKKwkJZHByaW50a2woS0VSTl9ERUJVRywgImVoX2Fib3J0OiBDb21tYW5kIGluIHByb2dyZXNzIik7CisJCS8qIFhYWDogU2hvdWxkIGFib3J0IHRoZSBjb21tYW5kIGhlcmUgKi8KKwl9IGVsc2UgeworCQlkcHJpbnRrbChLRVJOX0RFQlVHLCAiZWhfYWJvcnQ6IENvbW1hbmQgbm90IGZvdW5kIik7CisJfQorCXJldHVybiBGQUlMRUQ7Cit9CisKKworLyogU0RUUiAqLworc3RhdGljIHZvaWQgYnVpbGRfc2R0cihzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IsCisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIpCit7CisJdTggKnB0ciA9IHNyYi0+bXNnb3V0X2J1ZiArIHNyYi0+bXNnX2NvdW50OworCWlmIChzcmItPm1zZ19jb3VudCA+IDEpIHsKKwkJZHByaW50a2woS0VSTl9JTkZPLAorCQkJImJ1aWxkX3NkdHI6IG1zZ291dF9idWYgQlVTWSAoJWk6ICUwMnggJTAyeClcbiIsCisJCQlzcmItPm1zZ19jb3VudCwgc3JiLT5tc2dvdXRfYnVmWzBdLAorCQkJc3JiLT5tc2dvdXRfYnVmWzFdKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIShkY2ItPmRldl9tb2RlICYgTlRDX0RPX1NZTkNfTkVHTykpIHsKKwkJZGNiLT5zeW5jX29mZnNldCA9IDA7CisJCWRjYi0+bWluX25lZ29fcGVyaW9kID0gMjAwID4+IDI7CisJfSBlbHNlIGlmIChkY2ItPnN5bmNfb2Zmc2V0ID09IDApCisJCWRjYi0+c3luY19vZmZzZXQgPSBTWU5DX05FR09fT0ZGU0VUOworCisJKnB0cisrID0gTVNHX0VYVEVOREVEOwkvKiAoMDFoKSAqLworCSpwdHIrKyA9IDM7CQkvKiBsZW5ndGggKi8KKwkqcHRyKysgPSBFWFRFTkRFRF9TRFRSOwkvKiAoMDFoKSAqLworCSpwdHIrKyA9IGRjYi0+bWluX25lZ29fcGVyaW9kOwkvKiBUcmFuc2ZlciBwZXJpb2QgKGluIDRucykgKi8KKwkqcHRyKysgPSBkY2ItPnN5bmNfb2Zmc2V0OwkvKiBUcmFuc2ZlciBwZXJpb2QgKG1heC4gUkVRL0FDSyBkaXN0KSAqLworCXNyYi0+bXNnX2NvdW50ICs9IDU7CisJc3JiLT5zdGF0ZSB8PSBTUkJfRE9fU1lOQ19ORUdPOworfQorCisKKy8qIFdEVFIgKi8KK3N0YXRpYyB2b2lkIGJ1aWxkX3dkdHIoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IERldmljZUN0bEJsayAqZGNiLAorCQlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKQoreworCXU4IHdpZGUgPSAoKGRjYi0+ZGV2X21vZGUgJiBOVENfRE9fV0lERV9ORUdPKSAmCisJCSAgIChhY2ItPmNvbmZpZyAmIEhDQ19XSURFX0NBUkQpKSA/IDEgOiAwOworCXU4ICpwdHIgPSBzcmItPm1zZ291dF9idWYgKyBzcmItPm1zZ19jb3VudDsKKwlpZiAoc3JiLT5tc2dfY291bnQgPiAxKSB7CisJCWRwcmludGtsKEtFUk5fSU5GTywKKwkJCSJidWlsZF93ZHRyOiBtc2dvdXRfYnVmIEJVU1kgKCVpOiAlMDJ4ICUwMngpXG4iLAorCQkJc3JiLT5tc2dfY291bnQsIHNyYi0+bXNnb3V0X2J1ZlswXSwKKwkJCXNyYi0+bXNnb3V0X2J1ZlsxXSk7CisJCXJldHVybjsKKwl9CisJKnB0cisrID0gTVNHX0VYVEVOREVEOwkvKiAoMDFoKSAqLworCSpwdHIrKyA9IDI7CQkvKiBsZW5ndGggKi8KKwkqcHRyKysgPSBFWFRFTkRFRF9XRFRSOwkvKiAoMDNoKSAqLworCSpwdHIrKyA9IHdpZGU7CisJc3JiLT5tc2dfY291bnQgKz0gNDsKKwlzcmItPnN0YXRlIHw9IFNSQl9ET19XSURFX05FR087Cit9CisKKworI2lmIDAKKy8qIFRpbWVyIHRvIHdvcmsgYXJvdW5kIGNoaXAgZmxhdzogV2hlbiBzZWxlY3RpbmcgYW5kIHRoZSBidXMgaXMgCisgKiBidXN5LCB3ZSBzb21ldGltZXMgbWlzcyBhIFNlbGVjdGlvbiB0aW1lb3V0IElSUSAqLwordm9pZCBzZWxlY3Rpb25fdGltZW91dF9taXNzZWQodW5zaWduZWQgbG9uZyBwdHIpOworLyogU2V0cyB0aGUgdGltZXIgdG8gd2FrZSB1cyB1cCAqLworc3RhdGljIHZvaWQgc2VsdG9fdGltZXIoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYikKK3sKKwlpZiAodGltZXJfcGVuZGluZygmYWNiLT5zZWx0b190aW1lcikpCisJCXJldHVybjsKKwlhY2ItPnNlbHRvX3RpbWVyLmZ1bmN0aW9uID0gc2VsZWN0aW9uX3RpbWVvdXRfbWlzc2VkOworCWFjYi0+c2VsdG9fdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBhY2I7CisJaWYgKHRpbWVfYmVmb3JlCisJICAgIChqaWZmaWVzICsgSFosIGFjYi0+c2NzaV9ob3N0LT5sYXN0X3Jlc2V0ICsgSFogLyAyKSkKKwkJYWNiLT5zZWx0b190aW1lci5leHBpcmVzID0KKwkJICAgIGFjYi0+c2NzaV9ob3N0LT5sYXN0X3Jlc2V0ICsgSFogLyAyICsgMTsKKwllbHNlCisJCWFjYi0+c2VsdG9fdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWiArIDE7CisJYWRkX3RpbWVyKCZhY2ItPnNlbHRvX3RpbWVyKTsKK30KKworCit2b2lkIHNlbGVjdGlvbl90aW1lb3V0X21pc3NlZCh1bnNpZ25lZCBsb25nIHB0cikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IgPSAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKilwdHI7CisJc3RydWN0IFNjc2lSZXFCbGsgKnNyYjsKKwlkcHJpbnRrbChLRVJOX0RFQlVHLCAiQ2hpcCBmb3Jnb3QgdG8gcHJvZHVjZSBTZWxUTyBJUlEhXG4iKTsKKwlpZiAoIWFjYi0+YWN0aXZlX2RjYiB8fCAhYWNiLT5hY3RpdmVfZGNiLT5hY3RpdmVfc3JiKSB7CisJCWRwcmludGtsKEtFUk5fREVCVUcsICIuLi4gYnV0IG5vIGNtZCBwZW5kaW5nPyBPb3BzIVxuIik7CisJCXJldHVybjsKKwl9CisJREMzOTV4X0xPQ0tfSU8oYWNiLT5zY3NpX2hvc3QsIGZsYWdzKTsKKwlzcmIgPSBhY2ItPmFjdGl2ZV9kY2ItPmFjdGl2ZV9zcmI7CisJZGlzY29ubmVjdChhY2IpOworCURDMzk1eF9VTkxPQ0tfSU8oYWNiLT5zY3NpX2hvc3QsIGZsYWdzKTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyB1OCBzdGFydF9zY3NpKHN0cnVjdCBBZGFwdGVyQ3RsQmxrKiBhY2IsIHN0cnVjdCBEZXZpY2VDdGxCbGsqIGRjYiwKKwkJc3RydWN0IFNjc2lSZXFCbGsqIHNyYikKK3sKKwl1MTYgc19zdGF0MiwgcmV0dXJuX2NvZGU7CisJdTggc19zdGF0LCBzY3NpY29tbWFuZCwgaSwgaWRlbnRpZnlfbWVzc2FnZTsKKwl1OCAqcHRyOworCWRwcmludGtkYmcoREJHXzAsICJzdGFydF9zY3NpOiAocGlkIyVsaSkgPCUwMmktJWk+IHNyYj0lcFxuIiwKKwkJc3JiLT5jbWQtPnBpZCwgZGNiLT50YXJnZXRfaWQsIGRjYi0+dGFyZ2V0X2x1biwgc3JiKTsKKworCXNyYi0+dGFnX251bWJlciA9IFRBR19OT05FOwkvKiBhY2ItPnRhZ19tYXhfbnVtOiBoYWQgZXJyb3IgcmVhZCBpbiBlZXByb20gKi8KKworCXNfc3RhdCA9IERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX1NJR05BTCk7CisJc19zdGF0MiA9IDA7CisJc19zdGF0MiA9IERDMzk1eF9yZWFkMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9TVEFUVVMpOworI2lmIDEKKwlpZiAoc19zdGF0ICYgMHgyMCAvKiBzX3N0YXQyICYgMHgwMjAwMCAqLyApIHsKKwkJZHByaW50a2RiZyhEQkdfS0csICJzdGFydF9zY3NpOiAocGlkIyVsaSkgQlVTWSAlMDJ4ICUwNHhcbiIsCisJCQlzcmItPmNtZC0+cGlkLCBzX3N0YXQsIHNfc3RhdDIpOworCQkvKgorCQkgKiBUcnkgYW55d2F5PworCQkgKgorCQkgKiBXZSBjb3VsZCwgQlVUOiBTb21ldGltZXMgdGhlIFRSTV9TMTA0MCBtaXNzZXMgdG8gcHJvZHVjZSBhIFNlbGVjdGlvbgorCQkgKiBUaW1lb3V0LCBhIERpc2Nvbm5lY3Qgb3IgYSBSZXNlbGN0aW9uIElSUSwgc28gd2Ugd291bGQgYmUgc2NyZXdlZCEKKwkJICogKFRoaXMgaXMgbGlrZWx5IHRvIGJlIGEgYnVnIGluIHRoZSBoYXJkd2FyZS4gT2J2aW91c2x5LCBtb3N0IHBlb3BsZQorCQkgKiAgb25seSBoYXZlIG9uZSBpbml0aWF0b3IgcGVyIFNDU0kgYnVzLikKKwkJICogSW5zdGVhZCBsZXQgdGhpcyBmYWlsIGFuZCBoYXZlIHRoZSB0aW1lciBtYWtlIHN1cmUgdGhlIGNvbW1hbmQgaXMgCisJCSAqIHRyaWVkIGFnYWluIGFmdGVyIGEgc2hvcnQgdGltZQorCQkgKi8KKwkJLypzZWx0b190aW1lciAoYWNiKTsgKi8KKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJaWYgKGFjYi0+YWN0aXZlX2RjYikgeworCQlkcHJpbnRrbChLRVJOX0RFQlVHLCAic3RhcnRfc2NzaTogKHBpZCMlbGkpIEF0dGVtcHQgdG8gc3RhcnQgYSIKKwkJCSJjb21tYW5kIHdoaWxlIGFub3RoZXIgY29tbWFuZCAocGlkIyVsaSkgaXMgYWN0aXZlLiIsCisJCQlzcmItPmNtZC0+cGlkLAorCQkJYWNiLT5hY3RpdmVfZGNiLT5hY3RpdmVfc3JiID8KKwkJCSAgICBhY2ItPmFjdGl2ZV9kY2ItPmFjdGl2ZV9zcmItPmNtZC0+cGlkIDogMCk7CisJCXJldHVybiAxOworCX0KKwlpZiAoREMzOTV4X3JlYWQxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX1NUQVRVUykgJiBTQ1NJSU5URVJSVVBUKSB7CisJCWRwcmludGtkYmcoREJHX0tHLCAic3RhcnRfc2NzaTogKHBpZCMlbGkpIEZhaWxlZCAoYnVzeSlcbiIsCisJCQlzcmItPmNtZC0+cGlkKTsKKwkJcmV0dXJuIDE7CisJfQorCS8qIEFsbG93IHN0YXJ0aW5nIG9mIFNDU0kgY29tbWFuZHMgaGFsZiBhIHNlY29uZCBiZWZvcmUgd2UgYWxsb3cgdGhlIG1pZC1sZXZlbAorCSAqIHRvIHF1ZXVlIHRoZW0gYWdhaW4gYWZ0ZXIgYSByZXNldCAqLworCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBhY2ItPnNjc2lfaG9zdC0+bGFzdF9yZXNldCAtIEhaIC8gMikpIHsKKwkJZHByaW50a2RiZyhEQkdfS0csICJzdGFydF9zY3NpOiBSZWZ1c2UgY21kcyAocmVzZXQgd2FpdClcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBGbHVzaCBGSUZPICovCisJY2xlYXJfZmlmbyhhY2IsICJzdGFydF9zY3NpIik7CisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0hPU1RJRCwgYWNiLT5zY3NpX2hvc3QtPnRoaXNfaWQpOworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9UQVJHRVRJRCwgZGNiLT50YXJnZXRfaWQpOworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9TWU5DLCBkY2ItPnN5bmNfcGVyaW9kKTsKKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfT0ZGU0VULCBkY2ItPnN5bmNfb2Zmc2V0KTsKKwlzcmItPnNjc2lfcGhhc2UgPSBQSF9CVVNfRlJFRTsJLyogaW5pdGlhbCBwaGFzZSAqLworCisJaWRlbnRpZnlfbWVzc2FnZSA9IGRjYi0+aWRlbnRpZnlfbXNnOworCS8qREMzOTV4X1RSTV93cml0ZTgoVFJNX1MxMDQwX1NDU0lfSURNU0csIGlkZW50aWZ5X21lc3NhZ2UpOyAqLworCS8qIERvbid0IGFsbG93IGRpc2Nvbm5lY3Rpb24gZm9yIEFVVE9fUkVRU0VOU0U6IENvbnQuQWxsLkNvbmQuISAqLworCWlmIChzcmItPmZsYWcgJiBBVVRPX1JFUVNFTlNFKQorCQlpZGVudGlmeV9tZXNzYWdlICY9IDB4QkY7CisKKwlpZiAoKChzcmItPmNtZC0+Y21uZFswXSA9PSBJTlFVSVJZKQorCSAgICAgfHwgKHNyYi0+Y21kLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpCisJICAgICB8fCAoc3JiLT5mbGFnICYgQVVUT19SRVFTRU5TRSkpCisJICAgICYmICgoKGRjYi0+c3luY19tb2RlICYgV0lERV9ORUdPX0VOQUJMRSkKKwkJICYmICEoZGNiLT5zeW5jX21vZGUgJiBXSURFX05FR09fRE9ORSkpCisJCXx8ICgoZGNiLT5zeW5jX21vZGUgJiBTWU5DX05FR09fRU5BQkxFKQorCQkgICAgJiYgIShkY2ItPnN5bmNfbW9kZSAmIFNZTkNfTkVHT19ET05FKSkpCisJICAgICYmIChkY2ItPnRhcmdldF9sdW4gPT0gMCkpIHsKKwkJc3JiLT5tc2dvdXRfYnVmWzBdID0gaWRlbnRpZnlfbWVzc2FnZTsKKwkJc3JiLT5tc2dfY291bnQgPSAxOworCQlzY3NpY29tbWFuZCA9IFNDTURfU0VMX0FUTlNUT1A7CisJCXNyYi0+c3RhdGUgPSBTUkJfTVNHT1VUOworI2lmbmRlZiBTWU5DX0ZJUlNUCisJCWlmIChkY2ItPnN5bmNfbW9kZSAmIFdJREVfTkVHT19FTkFCTEUKKwkJICAgICYmIGRjYi0+aW5xdWlyeTcgJiBTQ1NJX0lOUV9XQlVTMTYpIHsKKwkJCWJ1aWxkX3dkdHIoYWNiLCBkY2IsIHNyYik7CisJCQlnb3RvIG5vX2NtZDsKKwkJfQorI2VuZGlmCisJCWlmIChkY2ItPnN5bmNfbW9kZSAmIFNZTkNfTkVHT19FTkFCTEUKKwkJICAgICYmIGRjYi0+aW5xdWlyeTcgJiBTQ1NJX0lOUV9TWU5DKSB7CisJCQlidWlsZF9zZHRyKGFjYiwgZGNiLCBzcmIpOworCQkJZ290byBub19jbWQ7CisJCX0KKwkJaWYgKGRjYi0+c3luY19tb2RlICYgV0lERV9ORUdPX0VOQUJMRQorCQkgICAgJiYgZGNiLT5pbnF1aXJ5NyAmIFNDU0lfSU5RX1dCVVMxNikgeworCQkJYnVpbGRfd2R0cihhY2IsIGRjYiwgc3JiKTsKKwkJCWdvdG8gbm9fY21kOworCQl9CisJCXNyYi0+bXNnX2NvdW50ID0gMDsKKwl9CisJLyogU2VuZCBpZGVudGlmeSBtZXNzYWdlICovCisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8sIGlkZW50aWZ5X21lc3NhZ2UpOworCisJc2NzaWNvbW1hbmQgPSBTQ01EX1NFTF9BVE47CisJc3JiLT5zdGF0ZSA9IFNSQl9TVEFSVF87CisjaWZuZGVmIERDMzk1eF9OT19UQUdRCisJaWYgKChkY2ItPnN5bmNfbW9kZSAmIEVOX1RBR19RVUVVRUlORykKKwkgICAgJiYgKGlkZW50aWZ5X21lc3NhZ2UgJiAweEMwKSkgeworCQkvKiBTZW5kIFRhZyBtZXNzYWdlICovCisJCXUzMiB0YWdfbWFzayA9IDE7CisJCXU4IHRhZ19udW1iZXIgPSAwOworCQl3aGlsZSAodGFnX21hc2sgJiBkY2ItPnRhZ19tYXNrCisJCSAgICAgICAmJiB0YWdfbnVtYmVyIDw9IGRjYi0+bWF4X2NvbW1hbmQpIHsKKwkJCXRhZ19tYXNrID0gdGFnX21hc2sgPDwgMTsKKwkJCXRhZ19udW1iZXIrKzsKKwkJfQorCQlpZiAodGFnX251bWJlciA+PSBkY2ItPm1heF9jb21tYW5kKSB7CisJCQlkcHJpbnRrbChLRVJOX1dBUk5JTkcsICJzdGFydF9zY3NpOiAocGlkIyVsaSkgIgorCQkJCSJPdXQgb2YgdGFncyB0YXJnZXQ9PCUwMmktJWk+KVxuIiwKKwkJCQlzcmItPmNtZC0+cGlkLCBzcmItPmNtZC0+ZGV2aWNlLT5pZCwKKwkJCQlzcmItPmNtZC0+ZGV2aWNlLT5sdW4pOworCQkJc3JiLT5zdGF0ZSA9IFNSQl9SRUFEWTsKKwkJCURDMzk1eF93cml0ZTE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09OVFJPTCwKKwkJCQkgICAgICAgRE9fSFdSRVNFTEVDVCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQkvKiBTZW5kIFRhZyBpZCAqLworCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTywgTVNHX1NJTVBMRV9RVEFHKTsKKwkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8sIHRhZ19udW1iZXIpOworCQlkY2ItPnRhZ19tYXNrIHw9IHRhZ19tYXNrOworCQlzcmItPnRhZ19udW1iZXIgPSB0YWdfbnVtYmVyOworCQlzY3NpY29tbWFuZCA9IFNDTURfU0VMX0FUTjM7CisJCXNyYi0+c3RhdGUgPSBTUkJfU1RBUlRfOworCX0KKyNlbmRpZgorLypwb2xsaW5nOiovCisJLyogU2VuZCBDREIgLi5jb21tYW5kIGJsb2NrIC4uLi4uLi4uLiAqLworCWRwcmludGtkYmcoREJHX0tHLCAic3RhcnRfc2NzaTogKHBpZCMlbGkpIDwlMDJpLSVpPiBjbW5kPTB4JTAyeCB0YWc9JWlcbiIsCisJCXNyYi0+Y21kLT5waWQsIHNyYi0+Y21kLT5kZXZpY2UtPmlkLCBzcmItPmNtZC0+ZGV2aWNlLT5sdW4sCisJCXNyYi0+Y21kLT5jbW5kWzBdLCBzcmItPnRhZ19udW1iZXIpOworCWlmIChzcmItPmZsYWcgJiBBVVRPX1JFUVNFTlNFKSB7CisJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPLCBSRVFVRVNUX1NFTlNFKTsKKwkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8sIChkY2ItPnRhcmdldF9sdW4gPDwgNSkpOworCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTywgMCk7CisJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPLCAwKTsKKwkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8sCisJCQkgICAgICBzaXplb2Yoc3JiLT5jbWQtPnNlbnNlX2J1ZmZlcikpOworCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTywgMCk7CisJfSBlbHNlIHsKKwkJcHRyID0gKHU4ICopc3JiLT5jbWQtPmNtbmQ7CisJCWZvciAoaSA9IDA7IGkgPCBzcmItPmNtZC0+Y21kX2xlbjsgaSsrKQorCQkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8sICpwdHIrKyk7CisJfQorICAgICAgbm9fY21kOgorCURDMzk1eF93cml0ZTE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09OVFJPTCwKKwkJICAgICAgIERPX0hXUkVTRUxFQ1QgfCBET19EQVRBTEFUQ0gpOworCWlmIChEQzM5NXhfcmVhZDE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfU1RBVFVTKSAmIFNDU0lJTlRFUlJVUFQpIHsKKwkJLyogCisJCSAqIElmIHN0YXJ0X3Njc2kgcmV0dXJuIDE6CisJCSAqIHdlIGNhdWdodCBhbiBpbnRlcnJ1cHQgKG11c3QgYmUgcmVzZXQgb3IgcmVzZWxlY3Rpb24gLi4uICkKKwkJICogOiBMZXQncyBwcm9jZXNzIGl0IGZpcnN0IQorCQkgKi8KKwkJZHByaW50a2RiZyhEQkdfMCwgInN0YXJ0X3Njc2k6IChwaWQjJWxpKSA8JTAyaS0laT4gRmFpbGVkIC0gYnVzeVxuIiwKKwkJCXNyYi0+Y21kLT5waWQsIGRjYi0+dGFyZ2V0X2lkLCBkY2ItPnRhcmdldF9sdW4pOworCQlzcmItPnN0YXRlID0gU1JCX1JFQURZOworCQlmcmVlX3RhZyhkY2IsIHNyYik7CisJCXNyYi0+bXNnX2NvdW50ID0gMDsKKwkJcmV0dXJuX2NvZGUgPSAxOworCQkvKiBUaGlzIElSUSBzaG91bGQgTk9UIGdldCBsb3N0LCBhcyB3ZSBkaWQgbm90IGFja25vd2xlZGdlIGl0ICovCisJfSBlbHNlIHsKKwkJLyogCisJCSAqIElmIHN0YXJ0X3Njc2kgcmV0dXJucyAwOgorCQkgKiB3ZSBrbm93IHRoYXQgdGhlIFNDU0kgcHJvY2Vzc29yIGlzIGZyZWUKKwkJICovCisJCXNyYi0+c2NzaV9waGFzZSA9IFBIX0JVU19GUkVFOwkvKiBpbml0aWFsIHBoYXNlICovCisJCWRjYi0+YWN0aXZlX3NyYiA9IHNyYjsKKwkJYWNiLT5hY3RpdmVfZGNiID0gZGNiOworCQlyZXR1cm5fY29kZSA9IDA7CisJCS8qIGl0J3MgaW1wb3J0YW50IGZvciBhdG4gc3RvcCAqLworCQlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsCisJCQkgICAgICAgRE9fREFUQUxBVENIIHwgRE9fSFdSRVNFTEVDVCk7CisJCS8qIFNDU0kgY29tbWFuZCAqLworCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09NTUFORCwgc2NzaWNvbW1hbmQpOworCX0KKwlyZXR1cm4gcmV0dXJuX2NvZGU7Cit9CisKKworI2RlZmluZSBEQzM5NXhfRU5BQkxFX01TR09VVCBcCisgREMzOTV4X3dyaXRlMTYgKGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09OVFJPTCwgRE9fU0VUQVROKTsgXAorIHNyYi0+c3RhdGUgfD0gU1JCX01TR09VVAorCisKKy8qIGFib3J0IGNvbW1hbmQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfbXNnb3V0X2Fib3J0KHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsCisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIpCit7CisJc3JiLT5tc2dvdXRfYnVmWzBdID0gQUJPUlQ7CisJc3JiLT5tc2dfY291bnQgPSAxOworCURDMzk1eF9FTkFCTEVfTVNHT1VUOworCXNyYi0+c3RhdGUgJj0gflNSQl9NU0dJTjsKKwlzcmItPnN0YXRlIHw9IFNSQl9NU0dPVVQ7Cit9CisKKworLyoqCisgKiBkYzM5NXhfaGFuZGxlX2ludGVycnVwdCAtIEhhbmRsZSBhbiBpbnRlcnJ1cHQgdGhhdCBoYXMgYmVlbiBjb25maXJtZWQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBiZWVuIHRyaWdnZXJlZCBmb3IgdGhpcyBjYXJkLgorICoKKyAqIEBhY2I6CSBhIHBvaW50ZXIgdG8gdGhlIGFkcHRlciBjb250cm9sIGJsb2NrCisgKiBAc2NzaV9zdGF0dXM6IHRoZSBzdGF0dXMgcmV0dXJuIHdoZW4gd2UgY2hlY2tlZCB0aGUgY2FyZAorICoqLworc3RhdGljIHZvaWQgZGMzOTV4X2hhbmRsZV9pbnRlcnJ1cHQoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwKKwkJdTE2IHNjc2lfc3RhdHVzKQoreworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYjsKKwlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiOworCXUxNiBwaGFzZTsKKwl1OCBzY3NpX2ludHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgKCpkYzM5NXhfc3RhdGV2KShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqLCBzdHJ1Y3QgU2NzaVJlcUJsayAqLCAKKwkJCSAgICAgIHUxNiAqKTsKKworCURDMzk1eF9MT0NLX0lPKGFjYi0+c2NzaV9ob3N0LCBmbGFncyk7CisKKwkvKiBUaGlzIGFja25vd2xlZGdlcyB0aGUgSVJRICovCisJc2NzaV9pbnRzdGF0dXMgPSBEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9JTlRTVEFUVVMpOworCWlmICgoc2NzaV9zdGF0dXMgJiAweDIwMDcpID09IDB4MjAwMikKKwkJZHByaW50a2woS0VSTl9ERUJVRywKKwkJCSJDT1AgYWZ0ZXIgQ09QIGNvbXBsZXRlZD8gJTA0eFxuIiwgc2NzaV9zdGF0dXMpOworCWlmIChkZWJ1Z19lbmFibGVkKERCR19LRykpIHsKKwkJaWYgKHNjc2lfaW50c3RhdHVzICYgSU5UX1NFTFRJTUVPVVQpCisJCQlkcHJpbnRrZGJnKERCR19LRywgImhhbmRsZV9pbnRlcnJ1cHQ6IFNlbGVjdGlvbiB0aW1lb3V0XG4iKTsKKwl9CisJLypkcHJpbnRrbChLRVJOX0RFQlVHLCAiaGFuZGxlX2ludGVycnVwdDogaW50c3RhdHVzID0gMHglMDJ4ICIsIHNjc2lfaW50c3RhdHVzKTsgKi8KKworCWlmICh0aW1lcl9wZW5kaW5nKCZhY2ItPnNlbHRvX3RpbWVyKSkKKwkJZGVsX3RpbWVyKCZhY2ItPnNlbHRvX3RpbWVyKTsKKworCWlmIChzY3NpX2ludHN0YXR1cyAmIChJTlRfU0VMVElNRU9VVCB8IElOVF9ESVNDT05ORUNUKSkgeworCQlkaXNjb25uZWN0KGFjYik7CS8qIGJ1cyBmcmVlIGludGVycnVwdCAgKi8KKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlpZiAoc2NzaV9pbnRzdGF0dXMgJiBJTlRfUkVTRUxFQ1RFRCkgeworCQlyZXNlbGVjdChhY2IpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCWlmIChzY3NpX2ludHN0YXR1cyAmIElOVF9TRUxFQ1QpIHsKKwkJZHByaW50a2woS0VSTl9JTkZPLCAiSG9zdCBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldCBtb2RlIVxuIik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJaWYgKHNjc2lfaW50c3RhdHVzICYgSU5UX1NDU0lSRVNFVCkgeworCQlzY3NpX3Jlc2V0X2RldGVjdChhY2IpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCWlmIChzY3NpX2ludHN0YXR1cyAmIChJTlRfQlVTU0VSVklDRSB8IElOVF9DTURET05FKSkgeworCQlkY2IgPSBhY2ItPmFjdGl2ZV9kY2I7CisJCWlmICghZGNiKSB7CisJCQlkcHJpbnRrbChLRVJOX0RFQlVHLAorCQkJCSJPb3BzOiBCdXNTZXJ2aWNlICglMDR4ICUwMngpIHcvbyBBY3RpdmVEQ0IhXG4iLAorCQkJCXNjc2lfc3RhdHVzLCBzY3NpX2ludHN0YXR1cyk7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwkJc3JiID0gZGNiLT5hY3RpdmVfc3JiOworCQlpZiAoZGNiLT5mbGFnICYgQUJPUlRfREVWXykgeworCQkJZHByaW50a2RiZyhEQkdfMCwgIk1zZ091dCBBYm9ydCBEZXZpY2UuLi4uLlxuIik7CisJCQllbmFibGVfbXNnb3V0X2Fib3J0KGFjYiwgc3JiKTsKKwkJfQorCisJCS8qIHNvZnR3YXJlIHNlcXVlbnRpYWwgbWFjaGluZSAqLworCQlwaGFzZSA9ICh1MTYpc3JiLT5zY3NpX3BoYXNlOworCisJCS8qIAorCQkgKiA2MjAzNyBvciA2MjEzNworCQkgKiBjYWxsICBkYzM5NXhfc2NzaV9waGFzZTBbXS4uLiAicGhhc2UgZW50cnkiCisJCSAqIGhhbmRsZSBldmVyeSBwaGFzZSBiZWZvcmUgc3RhcnQgdHJhbnNmZXIKKwkJICovCisJCS8qIGRhdGFfb3V0X3BoYXNlMCwJcGhhc2U6MCAqLworCQkvKiBkYXRhX2luX3BoYXNlMCwJcGhhc2U6MSAqLworCQkvKiBjb21tYW5kX3BoYXNlMCwJcGhhc2U6MiAqLworCQkvKiBzdGF0dXNfcGhhc2UwLAlwaGFzZTozICovCisJCS8qIG5vcDAsCQlwaGFzZTo0IFBIX0JVU19GUkVFIC4uIGluaXRpYWwgcGhhc2UgKi8KKwkJLyogbm9wMCwJCXBoYXNlOjUgUEhfQlVTX0ZSRUUgLi4gaW5pdGlhbCBwaGFzZSAqLworCQkvKiBtc2dvdXRfcGhhc2UwLAlwaGFzZTo2ICovCisJCS8qIG1zZ2luX3BoYXNlMCwJcGhhc2U6NyAqLworCQlkYzM5NXhfc3RhdGV2ID0gZGMzOTV4X3Njc2lfcGhhc2UwW3BoYXNlXTsKKwkJZGMzOTV4X3N0YXRldihhY2IsIHNyYiwgJnNjc2lfc3RhdHVzKTsKKworCQkvKiAKKwkJICogaWYgdGhlcmUgd2VyZSBhbnkgZXhjZXB0aW9uIG9jY3VyZWQgc2NzaV9zdGF0dXMKKwkJICogd2lsbCBiZSBtb2RpZnkgdG8gYnVzIGZyZWUgcGhhc2UgbmV3IHNjc2lfc3RhdHVzCisJCSAqIHRyYW5zZmVyIG91dCBmcm9tIC4uLiBwcmV2aW91cyBkYzM5NXhfc3RhdGV2CisJCSAqLworCQlzcmItPnNjc2lfcGhhc2UgPSBzY3NpX3N0YXR1cyAmIFBIQVNFTUFTSzsKKwkJcGhhc2UgPSAodTE2KXNjc2lfc3RhdHVzICYgUEhBU0VNQVNLOworCisJCS8qIAorCQkgKiBjYWxsICBkYzM5NXhfc2NzaV9waGFzZTFbXS4uLiAicGhhc2UgZW50cnkiIGhhbmRsZQorCQkgKiBldmVyeSBwaGFzZSB0byBkbyB0cmFuc2ZlcgorCQkgKi8KKwkJLyogZGF0YV9vdXRfcGhhc2UxLAlwaGFzZTowICovCisJCS8qIGRhdGFfaW5fcGhhc2UxLAlwaGFzZToxICovCisJCS8qIGNvbW1hbmRfcGhhc2UxLAlwaGFzZToyICovCisJCS8qIHN0YXR1c19waGFzZTEsCXBoYXNlOjMgKi8KKwkJLyogbm9wMSwJCXBoYXNlOjQgUEhfQlVTX0ZSRUUgLi4gaW5pdGlhbCBwaGFzZSAqLworCQkvKiBub3AxLAkJcGhhc2U6NSBQSF9CVVNfRlJFRSAuLiBpbml0aWFsIHBoYXNlICovCisJCS8qIG1zZ291dF9waGFzZTEsCXBoYXNlOjYgKi8KKwkJLyogbXNnaW5fcGhhc2UxLAlwaGFzZTo3ICovCisJCWRjMzk1eF9zdGF0ZXYgPSBkYzM5NXhfc2NzaV9waGFzZTFbcGhhc2VdOworCQlkYzM5NXhfc3RhdGV2KGFjYiwgc3JiLCAmc2NzaV9zdGF0dXMpOworCX0KKyAgICAgIG91dF91bmxvY2s6CisJREMzOTV4X1VOTE9DS19JTyhhY2ItPnNjc2lfaG9zdCwgZmxhZ3MpOworfQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkYzM5NXhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiA9IChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqKWRldl9pZDsKKwl1MTYgc2NzaV9zdGF0dXM7CisJdTggZG1hX3N0YXR1czsKKwlpcnFyZXR1cm5fdCBoYW5kbGVkID0gSVJRX05PTkU7CisKKwkvKgorCSAqIENoZWNrIGZvciBwZW5kaW5nIGludGVydXB0CisJICovCisJc2NzaV9zdGF0dXMgPSBEQzM5NXhfcmVhZDE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfU1RBVFVTKTsKKwlkbWFfc3RhdHVzID0gREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX0RNQV9TVEFUVVMpOworCWlmIChzY3NpX3N0YXR1cyAmIFNDU0lJTlRFUlJVUFQpIHsKKwkJLyogaW50ZXJ1cHQgcGVuZGluZyAtIGxldCdzIHByb2Nlc3MgaXQhICovCisJCWRjMzk1eF9oYW5kbGVfaW50ZXJydXB0KGFjYiwgc2NzaV9zdGF0dXMpOworCQloYW5kbGVkID0gSVJRX0hBTkRMRUQ7CisJfQorCWVsc2UgaWYgKGRtYV9zdGF0dXMgJiAweDIwKSB7CisJCS8qIEVycm9yIGZyb20gdGhlIERNQSBlbmdpbmUgKi8KKwkJZHByaW50a2woS0VSTl9JTkZPLCAiSW50ZXJydXB0IGZyb20gRE1BIGVuZ2luZTogMHglMDJ4IVxuIiwgZG1hX3N0YXR1cyk7CisjaWYgMAorCQlkcHJpbnRrbChLRVJOX0lORk8sICJUaGlzIG1lYW5zIERNQSBlcnJvciEgVHJ5IHRvIGhhbmRsZSAuLi5cbiIpOworCQlpZiAoYWNiLT5hY3RpdmVfZGNiKSB7CisJCQlhY2ItPmFjdGl2ZV9kY2ItPiBmbGFnIHw9IEFCT1JUX0RFVl87CisJCQlpZiAoYWNiLT5hY3RpdmVfZGNiLT5hY3RpdmVfc3JiKQorCQkJCWVuYWJsZV9tc2dvdXRfYWJvcnQoYWNiLCBhY2ItPmFjdGl2ZV9kY2ItPmFjdGl2ZV9zcmIpOworCQl9CisJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfRE1BX0NPTlRST0wsIEFCT1JUWEZFUiB8IENMUlhGSUZPKTsKKyNlbHNlCisJCWRwcmludGtsKEtFUk5fSU5GTywgIklnbm9yaW5nIERNQSBlcnJvciAocHJvYmFibHkgYSBiYWQgdGhpbmcpIC4uLlxuIik7CisJCWFjYiA9IE5VTEw7CisjZW5kaWYKKwkJaGFuZGxlZCA9IElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiBoYW5kbGVkOworfQorCisKK3N0YXRpYyB2b2lkIG1zZ291dF9waGFzZTAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpCit7CisJZHByaW50a2RiZyhEQkdfMCwgIm1zZ291dF9waGFzZTA6IChwaWQjJWxpKVxuIiwgc3JiLT5jbWQtPnBpZCk7CisJaWYgKHNyYi0+c3RhdGUgJiAoU1JCX1VORVhQRUNUX1JFU0VMICsgU1JCX0FCT1JUX1NFTlQpKQorCQkqcHNjc2lfc3RhdHVzID0gUEhfQlVTX0ZSRUU7CS8qLi4gaW5pdGlhbCBwaGFzZSAqLworCisJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19EQVRBTEFUQ0gpOwkvKiBpdCdzIGltcG9ydGFudCBmb3IgYXRuIHN0b3AgKi8KKwlzcmItPnN0YXRlICY9IH5TUkJfTVNHT1VUOworfQorCisKK3N0YXRpYyB2b2lkIG1zZ291dF9waGFzZTEoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpCit7CisJdTE2IGk7CisJdTggKnB0cjsKKwlkcHJpbnRrZGJnKERCR18wLCAibXNnb3V0X3BoYXNlMTogKHBpZCMlbGkpXG4iLCBzcmItPmNtZC0+cGlkKTsKKworCWNsZWFyX2ZpZm8oYWNiLCAibXNnb3V0X3BoYXNlMSIpOworCWlmICghKHNyYi0+c3RhdGUgJiBTUkJfTVNHT1VUKSkgeworCQlzcmItPnN0YXRlIHw9IFNSQl9NU0dPVVQ7CisJCWRwcmludGtsKEtFUk5fREVCVUcsCisJCQkibXNnb3V0X3BoYXNlMTogKHBpZCMlbGkpIFBoYXNlIHVuZXhwZWN0ZWRcbiIsCisJCQlzcmItPmNtZC0+cGlkKTsJLyogU28gd2hhdCA/ICovCisJfQorCWlmICghc3JiLT5tc2dfY291bnQpIHsKKwkJZHByaW50a2RiZyhEQkdfMCwgIm1zZ291dF9waGFzZTE6IChwaWQjJWxpKSBOT1AgbXNnXG4iLAorCQkJc3JiLT5jbWQtPnBpZCk7CisJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPLCBNU0dfTk9QKTsKKwkJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19EQVRBTEFUQ0gpOwkvKiBpdCdzIGltcG9ydGFudCBmb3IgYXRuIHN0b3AgKi8KKwkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTU1BTkQsIFNDTURfRklGT19PVVQpOworCQlyZXR1cm47CisJfQorCXB0ciA9ICh1OCAqKXNyYi0+bXNnb3V0X2J1ZjsKKwlmb3IgKGkgPSAwOyBpIDwgc3JiLT5tc2dfY291bnQ7IGkrKykKKwkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8sICpwdHIrKyk7CisJc3JiLT5tc2dfY291bnQgPSAwOworCWlmIChzcmItPm1zZ291dF9idWZbMF0gPT0gTVNHX0FCT1JUKQorCQlzcmItPnN0YXRlID0gU1JCX0FCT1JUX1NFTlQ7CisKKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09NTUFORCwgU0NNRF9GSUZPX09VVCk7Cit9CisKKworc3RhdGljIHZvaWQgY29tbWFuZF9waGFzZTAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpCit7CisJZHByaW50a2RiZyhEQkdfMCwgImNvbW1hbmRfcGhhc2UwOiAocGlkIyVsaSlcbiIsIHNyYi0+Y21kLT5waWQpOworCURDMzk1eF93cml0ZTE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09OVFJPTCwgRE9fREFUQUxBVENIKTsKK30KKworCitzdGF0aWMgdm9pZCBjb21tYW5kX3BoYXNlMShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cykKK3sKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2I7CisJdTggKnB0cjsKKwl1MTYgaTsKKwlkcHJpbnRrZGJnKERCR18wLCAiY29tbWFuZF9waGFzZTE6IChwaWQjJWxpKVxuIiwgc3JiLT5jbWQtPnBpZCk7CisKKwljbGVhcl9maWZvKGFjYiwgImNvbW1hbmRfcGhhc2UxIik7CisJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19DTFJBVE4pOworCWlmICghKHNyYi0+ZmxhZyAmIEFVVE9fUkVRU0VOU0UpKSB7CisJCXB0ciA9ICh1OCAqKXNyYi0+Y21kLT5jbW5kOworCQlmb3IgKGkgPSAwOyBpIDwgc3JiLT5jbWQtPmNtZF9sZW47IGkrKykgeworCQkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8sICpwdHIpOworCQkJcHRyKys7CisJCX0KKwl9IGVsc2UgeworCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTywgUkVRVUVTVF9TRU5TRSk7CisJCWRjYiA9IGFjYi0+YWN0aXZlX2RjYjsKKwkJLyogdGFyZ2V0IGlkICovCisJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPLCAoZGNiLT50YXJnZXRfbHVuIDw8IDUpKTsKKwkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8sIDApOworCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTywgMCk7CisJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPLAorCQkJICAgICAgc2l6ZW9mKHNyYi0+Y21kLT5zZW5zZV9idWZmZXIpKTsKKwkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8sIDApOworCX0KKwlzcmItPnN0YXRlIHw9IFNSQl9DT01NQU5EOworCS8qIGl0J3MgaW1wb3J0YW50IGZvciBhdG4gc3RvcCAqLworCURDMzk1eF93cml0ZTE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09OVFJPTCwgRE9fREFUQUxBVENIKTsKKwkvKiBTQ1NJIGNvbW1hbmQgKi8KKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09NTUFORCwgU0NNRF9GSUZPX09VVCk7Cit9CisKKworLyoKKyAqIFZlcmlmeSB0aGF0IHRoZSByZW1haW5pbmcgc3BhY2UgaW4gdGhlIGh3IHNnIGxpc3RzIGlzIHRoZSBzYW1lIGFzCisgKiB0aGUgY291bnQgb2YgcmVtYWluaW5nIGJ5dGVzIGluIHNyYi0+dG90YWxfeGZlcl9sZW5ndGgKKyAqLworc3RhdGljIHZvaWQgc2dfdmVyaWZ5X2xlbmd0aChzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKQoreworCWlmIChkZWJ1Z19lbmFibGVkKERCR19TRykpIHsKKwkJdW5zaWduZWQgbGVuID0gMDsKKwkJdW5zaWduZWQgaWR4ID0gc3JiLT5zZ19pbmRleDsKKwkJc3RydWN0IFNHZW50cnkgKnBzZ2UgPSBzcmItPnNlZ21lbnRfeCArIGlkeDsKKwkJZm9yICg7IGlkeCA8IHNyYi0+c2dfY291bnQ7IHBzZ2UrKywgaWR4KyspCisJCQlsZW4gKz0gcHNnZS0+bGVuZ3RoOworCQlpZiAobGVuICE9IHNyYi0+dG90YWxfeGZlcl9sZW5ndGgpCisJCQlkcHJpbnRrZGJnKERCR19TRywKKwkJCSAgICAgICAiSW5jb25zaXN0ZW50IFNSQiBTL0cgbGVuZ3RocyAoVG90PSVpLCBDb3VudD0laSkgISFcbiIsCisJCQkgICAgICAgc3JiLT50b3RhbF94ZmVyX2xlbmd0aCwgbGVuKTsKKwl9CQkJICAgICAgIAorfQorCisKKy8qCisgKiBDb21wdXRlIHRoZSBuZXh0IFNjYXR0ZXIgR2F0aGVyIGxpc3QgaW5kZXggYW5kIGFkanVzdCBpdHMgbGVuZ3RoCisgKiBhbmQgYWRkcmVzcyBpZiBuZWNlc3Nhcnk7IGFsc28gY29tcHV0ZSB2aXJ0X2FkZHIKKyAqLworc3RhdGljIHZvaWQgc2dfdXBkYXRlX2xpc3Qoc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwgdTMyIGxlZnQpCit7CisJdTggaWR4OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gc3JiLT5jbWQ7CisJaW50IHNlZ21lbnQgPSBjbWQtPnVzZV9zZzsKKwl1MzIgeGZlcnJlZCA9IHNyYi0+dG90YWxfeGZlcl9sZW5ndGggLSBsZWZ0OyAvKiBieXRlcyB0cmFuc2ZlcmVkICovCisJc3RydWN0IFNHZW50cnkgKnBzZ2UgPSBzcmItPnNlZ21lbnRfeCArIHNyYi0+c2dfaW5kZXg7CisJdm9pZCAqKnZpcnQgPSBzcmItPnZpcnRfbWFwOworCisJZHByaW50a2RiZyhEQkdfMCwKKwkJInNnX3VwZGF0ZV9saXN0OiBUcmFuc2ZlcmVkICVpIG9mICVpIGJ5dGVzLCAlaSByZW1haW5cbiIsCisJCXhmZXJyZWQsIHNyYi0+dG90YWxfeGZlcl9sZW5ndGgsIGxlZnQpOworCWlmICh4ZmVycmVkID09IDApIHsKKwkJLyogbm90aGluZyB0byB1cGRhdGUgc2luY2Ugd2UgZGlkIG5vdCB0cmFuc2ZlciBhbnkgZGF0YSAqLworCQlyZXR1cm47CisJfQorCisJc2dfdmVyaWZ5X2xlbmd0aChzcmIpOworCXNyYi0+dG90YWxfeGZlcl9sZW5ndGggPSBsZWZ0OwkvKiB1cGRhdGUgcmVtYWluaW5nIGNvdW50ICovCisJZm9yIChpZHggPSBzcmItPnNnX2luZGV4OyBpZHggPCBzcmItPnNnX2NvdW50OyBpZHgrKykgeworCQlpZiAoeGZlcnJlZCA+PSBwc2dlLT5sZW5ndGgpIHsKKwkJCS8qIENvbXBsZXRlIFNHIGVudHJpZXMgZG9uZSAqLworCQkJeGZlcnJlZCAtPSBwc2dlLT5sZW5ndGg7CisJCX0gZWxzZSB7CisJCQkvKiBQYXJ0aWFsIFNHIGVudHJ5IGRvbmUgKi8KKwkJCXBzZ2UtPmxlbmd0aCAtPSB4ZmVycmVkOworCQkJcHNnZS0+YWRkcmVzcyArPSB4ZmVycmVkOworCQkJc3JiLT5zZ19pbmRleCA9IGlkeDsKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzcmItPmRjYi0+CisJCQkJCSAgICBhY2ItPmRldiwKKwkJCQkJICAgIHNyYi0+c2dfYnVzX2FkZHIsCisJCQkJCSAgICBTRUdNRU5UWF9MRU4sCisJCQkJCSAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWJyZWFrOworCQl9CisJCXBzZ2UrKzsKKwl9CisJc2dfdmVyaWZ5X2xlbmd0aChzcmIpOworCisJLyogd2UgbmVlZCB0aGUgY29ycmVzcG9uZGluZyB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlpZiAoIXNlZ21lbnQpIHsKKwkJc3JiLT52aXJ0X2FkZHIgKz0geGZlcnJlZDsKKwkJcmV0dXJuOworCX0KKworCS8qIFdlIGhhdmUgdG8gd2FsayB0aGUgc2NhdHRlcmxpc3QgdG8gZmluZCBpdCAqLworCXNnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKWNtZC0+cmVxdWVzdF9idWZmZXI7CisJaWR4ID0gMDsKKwl3aGlsZSAoc2VnbWVudC0tKSB7CisJCXVuc2lnbmVkIGxvbmcgbWFzayA9CisJCSAgICB+KCh1bnNpZ25lZCBsb25nKXNnLT5sZW5ndGggLSAxKSAmIFBBR0VfTUFTSzsKKwkJaWYgKChzZ19kbWFfYWRkcmVzcyhzZykgJiBtYXNrKSA9PSAocHNnZS0+YWRkcmVzcyAmIG1hc2spKSB7CisJCQlzcmItPnZpcnRfYWRkciA9IHZpcnRbaWR4XSArIChwc2dlLT5hZGRyZXNzICYgflBBR0VfTUFTSyk7CisJCQlyZXR1cm47CisJCX0KKwkJKytzZzsKKwkJKytpZHg7CisJfQorCisJZHByaW50a2woS0VSTl9FUlIsICJzZ191cGRhdGVfbGlzdDogc2dfdG9fdmlydCBmYWlsZWRcbiIpOworCXNyYi0+dmlydF9hZGRyID0gTlVMTDsKK30KKworCisvKgorICogV2UgaGF2ZSB0cmFuc2ZlcmVkIGEgc2luZ2xlIGJ5dGUgKFBJTyBtb2RlPykgYW5kIG5lZWQgdG8gdXBkYXRlCisgKiB0aGUgY291bnQgb2YgYnl0ZXMgcmVtYWluaW5nICh0b3RhbF94ZmVyX2xlbmd0aCkgYW5kIHVwZGF0ZSB0aGUgc2cKKyAqIGVudHJ5IHRvIGVpdGhlciBwb2ludCB0byBuZXh0IGJ5dGUgaW4gdGhlIGN1cnJlbnQgc2cgZW50cnksIG9yIG9mCisgKiBhbHJlYWR5IGF0IHRoZSBlbmQgdG8gcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHNnIGVudHJ5CisgKi8KK3N0YXRpYyB2b2lkIHNnX3N1YnRyYWN0X29uZShzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKQoreworCXNyYi0+dG90YWxfeGZlcl9sZW5ndGgtLTsKKwlzcmItPnNlZ21lbnRfeFtzcmItPnNnX2luZGV4XS5sZW5ndGgtLTsKKwlpZiAoc3JiLT50b3RhbF94ZmVyX2xlbmd0aCAmJgorCSAgICAhc3JiLT5zZWdtZW50X3hbc3JiLT5zZ19pbmRleF0ubGVuZ3RoKSB7CisJCWlmIChkZWJ1Z19lbmFibGVkKERCR19QSU8pKQorCQkJcHJpbnRrKCIgKG5leHQgc2VnbWVudCkiKTsKKwkJc3JiLT5zZ19pbmRleCsrOworCQlzZ191cGRhdGVfbGlzdChzcmIsIHNyYi0+dG90YWxfeGZlcl9sZW5ndGgpOworCX0KK30KKworCisvKiAKKyAqIGNsZWFudXBfYWZ0ZXJfdHJhbnNmZXIKKyAqIAorICogTWFrZXMgc3VyZSwgRE1BIGFuZCBTQ1NJIGVuZ2luZSBhcmUgZW1wdHksIGFmdGVyIHRoZSB0cmFuc2ZlciBoYXMgZmluaXNoZWQKKyAqIEtHOiBDdXJyZW50bHkgY2FsbGVkIGZyb20gIFN0YXR1c1BoYXNlMSAoKQorICogU2hvdWxkIHByb2JhYmx5IGFsc28gYmUgY2FsbGVkIGZyb20gb3RoZXIgcGxhY2VzCisgKiBCZXN0IG1pZ2h0IGJlIHRvIGNhbGwgaXQgaW4gRGF0YVhYUGhhc2UwLCBpZiBuZXcgcGhhc2Ugd2lsbCBkaWZmZXIgCisgKi8KK3N0YXRpYyB2b2lkIGNsZWFudXBfYWZ0ZXJfdHJhbnNmZXIoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnNyYikKK3sKKwkvKkRDMzk1eF93cml0ZTggKFRSTV9TMTA0MF9ETUFfU1RBVFVTLCBGT1JDRURNQUNPTVApOyAqLworCWlmIChEQzM5NXhfcmVhZDE2KGFjYiwgVFJNX1MxMDQwX0RNQV9DT01NQU5EKSAmIDB4MDAwMSkgewkvKiByZWFkICovCisJCWlmICghKERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk9DTlQpICYgMHg0MCkpCisJCQljbGVhcl9maWZvKGFjYiwgImNsZWFudXAvaW4iKTsKKwkJaWYgKCEoREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX0RNQV9GSUZPU1RBVCkgJiAweDgwKSkKKwkJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfRE1BX0NPTlRST0wsIENMUlhGSUZPKTsKKwl9IGVsc2UgewkJLyogd3JpdGUgKi8KKwkJaWYgKCEoREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX0RNQV9GSUZPU1RBVCkgJiAweDgwKSkKKwkJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfRE1BX0NPTlRST0wsIENMUlhGSUZPKTsKKwkJaWYgKCEoREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGT0NOVCkgJiAweDQwKSkKKwkJCWNsZWFyX2ZpZm8oYWNiLCAiY2xlYW51cC9vdXQiKTsKKwl9CisJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19EQVRBTEFUQ0gpOworfQorCisKKy8qCisgKiBUaG9zZSBubyBvZiBieXRlcyB3aWxsIGJlIHRyYW5zZmVyZWQgdy8gUElPIHRocm91Z2ggdGhlIFNDU0kgRklGTworICogU2VlbXMgdG8gYmUgbmVlZGVkIGZvciB1bmtub3duIHJlYXNvbnM7IGNvdWxkIGJlIGEgaGFyZHdhcmUgYnVnIDotKAorICovCisjZGVmaW5lIERDMzk1eF9MQVNUUElPIDQKKworCitzdGF0aWMgdm9pZCBkYXRhX291dF9waGFzZTAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpCit7CisJc3RydWN0IERldmljZUN0bEJsayAqZGNiID0gc3JiLT5kY2I7CisJdTE2IHNjc2lfc3RhdHVzID0gKnBzY3NpX3N0YXR1czsKKwl1MzIgZF9sZWZ0X2NvdW50ZXIgPSAwOworCWRwcmludGtkYmcoREJHXzAsICJkYXRhX291dF9waGFzZTA6IChwaWQjJWxpKSA8JTAyaS0laT5cbiIsCisJCXNyYi0+Y21kLT5waWQsIHNyYi0+Y21kLT5kZXZpY2UtPmlkLCBzcmItPmNtZC0+ZGV2aWNlLT5sdW4pOworCisJLyoKKwkgKiBLRzogV2UgbmVlZCB0byBkcmFpbiB0aGUgYnVmZmVycyBiZWZvcmUgd2UgZHJhdyBhbnkgY29uY2x1c2lvbnMhCisJICogVGhpcyBtZWFucyB0ZWxsaW5nIHRoZSBETUEgdG8gcHVzaCB0aGUgcmVzdCBpbnRvIFNDU0ksIHRlbGxpbmcKKwkgKiBTQ1NJIHRvIHB1c2ggdGhlIHJlc3QgdG8gdGhlIGJ1cy4KKwkgKiBIb3dldmVyLCB0aGUgZGV2aWNlIG1pZ2h0IGhhdmUgYmVlbiB0aGUgb25lIHRvIHN0b3AgdXMgKHBoYXNlCisJICogY2hhbmdlKSwgYW5kIHRoZSBkYXRhIGluIHRyYW5zaXQganVzdCBuZWVkcyB0byBiZSBhY2NvdW50ZWQgc28KKwkgKiBpdCBjYW4gYmUgcmV0cmFuc21pdHRlZC4pCisJICovCisJLyogCisJICogS0c6IFN0b3AgRE1BIGVuZ2luZSBwdXNoaW5nIG1vcmUgZGF0YSBpbnRvIHRoZSBTQ1NJIEZJRk8KKwkgKiBJZiB3ZSBuZWVkIG1vcmUgZGF0YSwgdGhlIERNQSBTRyBsaXN0IHdpbGwgYmUgZnJlc2hseSBzZXQgdXAsIGFueXdheQorCSAqLworCWRwcmludGtkYmcoREJHX1BJTywgImRhdGFfb3V0X3BoYXNlMDogIgorCQkiRE1Be2ZpZmNudD0weCUwMnggZmlmb3N0YXQ9MHglMDJ4fSAiCisJCSJTQ1NJe2ZpZm9jbnQ9MHglMDJ4IGNudD0weCUwNnggc3RhdHVzPTB4JTA0eH0gdG90YWw9MHglMDZ4XG4iLAorCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfRE1BX0ZJRk9DTlQpLAorCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfRE1BX0ZJRk9TVEFUKSwKKwkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGT0NOVCksCisJCURDMzk1eF9yZWFkMzIoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT1VOVEVSKSwgc2NzaV9zdGF0dXMsCisJCXNyYi0+dG90YWxfeGZlcl9sZW5ndGgpOworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfRE1BX0NPTlRST0wsIFNUT1BETUFYRkVSIHwgQ0xSWEZJRk8pOworCisJaWYgKCEoc3JiLT5zdGF0ZSAmIFNSQl9YRkVSUEFEKSkgeworCQlpZiAoc2NzaV9zdGF0dXMgJiBQQVJJVFlFUlJPUikKKwkJCXNyYi0+c3RhdHVzIHw9IFBBUklUWV9FUlJPUjsKKworCQkvKgorCQkgKiBLRzogUmlnaHQsIHdlIGNhbid0IGp1c3QgcmVseSBvbiB0aGUgU0NTSV9DT1VOVEVSLCBiZWNhdXNlIHRoaXMKKwkJICogaXMgdGhlIG5vIG9mIGJ5dGVzIGl0IGdvdCBmcm9tIHRoZSBETUEgZW5naW5lIG5vdCB0aGUgbm8gaXQgCisJCSAqIHRyYW5zZmVycmVkIHN1Y2Nlc3NmdWxseSB0byB0aGUgZGV2aWNlLiAoQW5kIHRoZSBkaWZmZXJlbmNlIGNvdWxkCisJCSAqIGJlIGFzIG11Y2ggYXMgdGhlIEZJRk8gc2l6ZSwgSSBndWVzcyAuLi4pCisJCSAqLworCQlpZiAoIShzY3NpX3N0YXR1cyAmIFNDU0lYRkVSRE9ORSkpIHsKKwkJCS8qCisJCQkgKiB3aGVuIGRhdGEgdHJhbnNmZXIgZnJvbSBETUEgRklGTyB0byBTQ1NJIEZJRk8KKwkJCSAqIGlmIHRoZXJlIHdhcyBzb21lIGRhdGEgbGVmdCBpbiBTQ1NJIEZJRk8KKwkJCSAqLworCQkJZF9sZWZ0X2NvdW50ZXIgPQorCQkJICAgICh1MzIpKERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk9DTlQpICYKKwkJCQkgIDB4MUYpOworCQkJaWYgKGRjYi0+c3luY19wZXJpb2QgJiBXSURFX1NZTkMpCisJCQkJZF9sZWZ0X2NvdW50ZXIgPDw9IDE7CisKKwkJCWRwcmludGtkYmcoREJHX0tHLCAiZGF0YV9vdXRfcGhhc2UwOiBGSUZPIGNvbnRhaW5zICVpICVzXG4iCisJCQkJIlNDU0l7Zmlmb2NudD0weCUwMnggY250PTB4JTA4eH0gIgorCQkJCSJETUF7Zmlmb2NudD0weCUwNHggY250PTB4JTAyeCBjdHI9MHglMDh4fVxuIiwKKwkJCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPQ05UKSwKKwkJCQkoZGNiLT5zeW5jX3BlcmlvZCAmIFdJREVfU1lOQykgPyAid29yZHMiIDogImJ5dGVzIiwKKwkJCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPQ05UKSwKKwkJCQlEQzM5NXhfcmVhZDMyKGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09VTlRFUiksCisJCQkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX0RNQV9GSUZPQ05UKSwKKwkJCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfRE1BX0ZJRk9TVEFUKSwKKwkJCQlEQzM5NXhfcmVhZDMyKGFjYiwgVFJNX1MxMDQwX0RNQV9DWENOVCkpOworCQl9CisJCS8qCisJCSAqIGNhbGN1bGF0ZSBhbGwgdGhlIHJlc2lkdWUgZGF0YSB0aGF0IG5vdCB5ZXQgdHJhbnNmZXJlZAorCQkgKiBTQ1NJIHRyYW5zZmVyIGNvdW50ZXIgKyBsZWZ0IGluIFNDU0kgRklGTyBkYXRhCisJCSAqCisJCSAqIC4uLi4uVFJNX1MxMDQwX1NDU0lfQ09VTlRFUiAoMjRiaXRzKQorCQkgKiBUaGUgY291bnRlciBhbHdheXMgZGVjcmVtZW50IGJ5IG9uZSBmb3IgZXZlcnkgU0NTSSBieXRlIHRyYW5zZmVyLgorCQkgKiAuLi4uLlRSTV9TMTA0MF9TQ1NJX0ZJRk9DTlQgKCA1Yml0cykKKwkJICogVGhlIGNvdW50ZXIgaXMgU0NTSSBGSUZPIG9mZnNldCBjb3VudGVyIChpbiB1bml0cyBvZiBieXRlcyBvciEgd29yZHMpCisJCSAqLworCQlpZiAoc3JiLT50b3RhbF94ZmVyX2xlbmd0aCA+IERDMzk1eF9MQVNUUElPKQorCQkJZF9sZWZ0X2NvdW50ZXIgKz0KKwkJCSAgICBEQzM5NXhfcmVhZDMyKGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09VTlRFUik7CisKKwkJLyogSXMgdGhpcyBhIGdvb2QgaWRlYT8gKi8KKwkJLypjbGVhcl9maWZvKGFjYiwgIkRPUDEiKTsgKi8KKwkJLyogS0c6IFdoYXQgaXMgdGhpcyBzdXBwb3NlZCB0byBiZSB1c2VmdWwgZm9yPyBXSURFIHBhZGRpbmcgc3R1ZmY/ICovCisJCWlmIChkX2xlZnRfY291bnRlciA9PSAxICYmIGRjYi0+c3luY19wZXJpb2QgJiBXSURFX1NZTkMKKwkJICAgICYmIHNyYi0+Y21kLT5yZXF1ZXN0X2J1ZmZsZW4gJSAyKSB7CisJCQlkX2xlZnRfY291bnRlciA9IDA7CisJCQlkcHJpbnRrbChLRVJOX0lORk8sCisJCQkJImRhdGFfb3V0X3BoYXNlMDogRGlzY2FyZCAxIGJ5dGUgKDB4JTAyeClcbiIsCisJCQkJc2NzaV9zdGF0dXMpOworCQl9CisJCS8qCisJCSAqIEtHOiBPb3BzIGFnYWluLiBTYW1lIHRoaW5rbyBhcyBhYm92ZTogVGhlIFNDU0kgbWlnaHQgaGF2ZSBiZWVuCisJCSAqIGZhc3RlciB0aGFuIHRoZSBETUEgZW5naW5lLCBzbyB0aGF0IGl0IHJhbiBvdXQgb2YgZGF0YS4KKwkJICogSW4gdGhhdCBjYXNlLCB3ZSBoYXZlIHRvIGRvIGp1c3Qgbm90aGluZyEgCisJCSAqIEJ1dDogV2h5IHRoZSBpbnRlcnJ1cHQ6IE5vIHBoYXNlIGNoYW5nZS4gTm8gWEZFUkNOVF8yX1pFUk8uIE9yPworCQkgKi8KKwkJLyoKKwkJICogS0c6IFRoaXMgaXMgbm9uc2Vuc2U6IFdlIGhhdmUgYmVlbiBXUklUSU5HIGRhdGEgdG8gdGhlIGJ1cworCQkgKiBJZiB0aGUgU0NTSSBlbmdpbmUgaGFzIG5vIGJ5dGVzIGxlZnQsIGhvdyBzaG91bGQgdGhlIERNQSBlbmdpbmU/CisJCSAqLworCQlpZiAoZF9sZWZ0X2NvdW50ZXIgPT0gMCkgeworCQkJc3JiLT50b3RhbF94ZmVyX2xlbmd0aCA9IDA7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogaWYgdHJhbnNmZXIgbm90IHlldCBjb21wbGV0ZQorCQkJICogdGhlcmUgd2VyZSBzb21lIGRhdGEgcmVzaWR1ZSBpbiBTQ1NJIEZJRk8gb3IKKwkJCSAqIFNDU0kgdHJhbnNmZXIgY291bnRlciBub3QgZW1wdHkKKwkJCSAqLworCQkJbG9uZyBvbGR4ZmVycmVkID0KKwkJCSAgICBzcmItPnRvdGFsX3hmZXJfbGVuZ3RoIC0gZF9sZWZ0X2NvdW50ZXI7CisJCQljb25zdCBpbnQgZGlmZiA9CisJCQkgICAgKGRjYi0+c3luY19wZXJpb2QgJiBXSURFX1NZTkMpID8gMiA6IDE7CisJCQlzZ191cGRhdGVfbGlzdChzcmIsIGRfbGVmdF9jb3VudGVyKTsKKwkJCS8qIEtHOiBNb3N0IHVnbHkgaGFjayEgQXBwYXJlbnRseSwgdGhpcyB3b3JrcyBhcm91bmQgYSBjaGlwIGJ1ZyAqLworCQkJaWYgKChzcmItPnNlZ21lbnRfeFtzcmItPnNnX2luZGV4XS5sZW5ndGggPT0KKwkJCSAgICAgZGlmZiAmJiBzcmItPmNtZC0+dXNlX3NnKQorCQkJICAgIHx8ICgob2xkeGZlcnJlZCAmIH5QQUdFX01BU0spID09CisJCQkJKFBBR0VfU0laRSAtIGRpZmYpKQorCQkJICAgICkgeworCQkJCWRwcmludGtsKEtFUk5fSU5GTywgImRhdGFfb3V0X3BoYXNlMDogIgorCQkJCQkiV29yayBhcm91bmQgY2hpcCBidWcgKCVpKT9cbiIsIGRpZmYpOworCQkJCWRfbGVmdF9jb3VudGVyID0KKwkJCQkgICAgc3JiLT50b3RhbF94ZmVyX2xlbmd0aCAtIGRpZmY7CisJCQkJc2dfdXBkYXRlX2xpc3Qoc3JiLCBkX2xlZnRfY291bnRlcik7CisJCQkJLypzcmItPnRvdGFsX3hmZXJfbGVuZ3RoIC09IGRpZmY7ICovCisJCQkJLypzcmItPnZpcnRfYWRkciArPSBkaWZmOyAqLworCQkJCS8qaWYgKHNyYi0+Y21kLT51c2Vfc2cpICovCisJCQkJLyogICAgICBzcmItPnNnX2luZGV4Kys7ICovCisJCQl9CisJCX0KKwl9CisJaWYgKCgqcHNjc2lfc3RhdHVzICYgUEhBU0VNQVNLKSAhPSBQSF9EQVRBX09VVCkgeworCQljbGVhbnVwX2FmdGVyX3RyYW5zZmVyKGFjYiwgc3JiKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgZGF0YV9vdXRfcGhhc2UxKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIsCisJCXUxNiAqcHNjc2lfc3RhdHVzKQoreworCWRwcmludGtkYmcoREJHXzAsICJkYXRhX291dF9waGFzZTE6IChwaWQjJWxpKSA8JTAyaS0laT5cbiIsCisJCXNyYi0+Y21kLT5waWQsIHNyYi0+Y21kLT5kZXZpY2UtPmlkLCBzcmItPmNtZC0+ZGV2aWNlLT5sdW4pOworCWNsZWFyX2ZpZm8oYWNiLCAiZGF0YV9vdXRfcGhhc2UxIik7CisJLyogZG8gcHJlcGFyZSBiZWZvcmUgdHJhbnNmZXIgd2hlbiBkYXRhIG91dCBwaGFzZSAqLworCWRhdGFfaW9fdHJhbnNmZXIoYWNiLCBzcmIsIFhGRVJEQVRBT1VUKTsKK30KKworCitzdGF0aWMgdm9pZCBkYXRhX2luX3BoYXNlMChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cykKK3sKKwl1MTYgc2NzaV9zdGF0dXMgPSAqcHNjc2lfc3RhdHVzOworCXUzMiBkX2xlZnRfY291bnRlciA9IDA7CisJZHByaW50a2RiZyhEQkdfMCwgImRhdGFfaW5fcGhhc2UwOiAocGlkIyVsaSkgPCUwMmktJWk+XG4iLAorCQlzcmItPmNtZC0+cGlkLCBzcmItPmNtZC0+ZGV2aWNlLT5pZCwgc3JiLT5jbWQtPmRldmljZS0+bHVuKTsKKworCS8qCisJICogS0c6IERhdGFJbiBpcyBtdWNoIG1vcmUgdHJpY2t5IHRoYW4gRGF0YU91dC4gV2hlbiB0aGUgZGV2aWNlIGlzIGZpbmlzaGVkCisJICogYW5kIHN3aXRjaGVzIHRvIGFub3RoZXIgcGhhc2UsIHRoZSBTQ1NJIGVuZ2luZSBzaG91bGQgYmUgZmluaXNoZWQgdG9vLgorCSAqIEJ1dDogVGhlcmUgbWlnaHQgc3RpbGwgYmUgYnl0ZXMgbGVmdCBpbiBpdHMgRklGTyB0byBiZSBmZXRjaGVkIGJ5IHRoZSBETUEKKwkgKiBlbmdpbmUgYW5kIHRyYW5zZmVycmVkIHRvIG1lbW9yeS4KKwkgKiBXZSBzaG91bGQgd2FpdCBmb3IgdGhlIEZJRk9zIHRvIGJlIGVtcHRpZWQgYnkgdGhhdCAoaXMgdGhlcmUgYW55IHdheSB0byAKKwkgKiBlbmZvcmNlIHRoaXM/KSBhbmQgdGhlbiBzdG9wIHRoZSBETUEgZW5naW5lLCBiZWNhdXNlIGl0IG1pZ2h0IHRoaW5rLCB0aGF0CisJICogdGhlcmUgYXJlIG1vcmUgYnl0ZXMgdG8gZm9sbG93LiBZZXMsIHRoZSBkZXZpY2UgbWlnaHQgZGlzY29ubmVjdCBwcmlvciB0bworCSAqIGhhdmluZyBhbGwgYnl0ZXMgdHJhbnNmZXJyZWQhIAorCSAqIEFsc28gd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IGFsbCBkYXRhIGZyb20gdGhlIERNQSBlbmdpbmUgYnVmZmVyJ3MgcmVhbGx5CisJICogbWFkZSBpdHMgd2F5IHRvIHRoZSBzeXN0ZW0gbWVtb3J5ISBTb21lIGRvY3VtZW50YXRpb24gb24gdGhpcyB3b3VsZCBub3QKKwkgKiBzZWVtIHRvIGJlIGEgYmFkIGlkZWEsIGFjdHVhbGx5LgorCSAqLworCWlmICghKHNyYi0+c3RhdGUgJiBTUkJfWEZFUlBBRCkpIHsKKwkJaWYgKHNjc2lfc3RhdHVzICYgUEFSSVRZRVJST1IpIHsKKwkJCWRwcmludGtsKEtFUk5fSU5GTywgImRhdGFfaW5fcGhhc2UwOiAocGlkIyVsaSkgIgorCQkJCSJQYXJpdHkgRXJyb3JcbiIsIHNyYi0+Y21kLT5waWQpOworCQkJc3JiLT5zdGF0dXMgfD0gUEFSSVRZX0VSUk9SOworCQl9CisJCS8qCisJCSAqIEtHOiBXZSBzaG91bGQgd2FpdCBmb3IgdGhlIERNQSBGSUZPIHRvIGJlIGVtcHR5IC4uLgorCQkgKiBidXQ6IGl0IHdvdWxkIGJlIGJldHRlciB0byB3YWl0IGZpcnN0IGZvciB0aGUgU0NTSSBGSUZPIGFuZCB0aGVuIHRoZQorCQkgKiB0aGUgRE1BIEZJRk8gdG8gYmVjb21lIGVtcHR5PyBIb3cgZG8gd2Uga25vdywgdGhhdCB0aGUgZGV2aWNlIG5vdCBhbHJlYWR5CisJCSAqIHNlbnQgZGF0YSB0byB0aGUgRklGTyBpbiBhIE1zZ0luIHBoYXNlLCBlZy4/CisJCSAqLworCQlpZiAoIShEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfRE1BX0ZJRk9TVEFUKSAmIDB4ODApKSB7CisjaWYgMAorCQkJaW50IGN0ciA9IDYwMDAwMDA7CisJCQlkcHJpbnRrbChLRVJOX0RFQlVHLAorCQkJCSJESVAwOiBXYWl0IGZvciBETUEgRklGTyB0byBmbHVzaCAuLi5cbiIpOworCQkJLypEQzM5NXhfd3JpdGU4ICAoVFJNX1MxMDQwX0RNQV9DT05UUk9MLCBTVE9QRE1BWEZFUik7ICovCisJCQkvKkRDMzk1eF93cml0ZTMyIChUUk1fUzEwNDBfU0NTSV9DT1VOVEVSLCA3KTsgKi8KKwkJCS8qREMzOTV4X3dyaXRlOCAgKFRSTV9TMTA0MF9TQ1NJX0NPTU1BTkQsIFNDTURfRE1BX0lOKTsgKi8KKwkJCXdoaWxlICghCisJCQkgICAgICAgKERDMzk1eF9yZWFkMTYoYWNiLCBUUk1fUzEwNDBfRE1BX0ZJRk9TVEFUKSAmCisJCQkJMHg4MCkgJiYgLS1jdHIpOworCQkJaWYgKGN0ciA8IDYwMDAwMDAgLSAxKQorCQkJCWRwcmludGtsKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIkRJUDA6IEhhZCB0byB3YWl0IGZvciBETUEgLi4uXG4iKTsKKwkJCWlmICghY3RyKQorCQkJCWRwcmludGtsKEtFUk5fRVJSLAorCQkJCSAgICAgICAiRGVhZGxvY2sgaW4gRElQMCB3YWl0aW5nIGZvciBETUEgRklGTyBlbXB0eSEhXG4iKTsKKwkJCS8qREMzOTV4X3dyaXRlMzIgKFRSTV9TMTA0MF9TQ1NJX0NPVU5URVIsIDApOyAqLworI2VuZGlmCisJCQlkcHJpbnRrZGJnKERCR19LRywgImRhdGFfaW5fcGhhc2UwOiAiCisJCQkJIkRNQXtmaWZvY250PTB4JTAyeCBmaWZvc3RhdD0weCUwMnh9XG4iLAorCQkJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9ETUFfRklGT0NOVCksCisJCQkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX0RNQV9GSUZPU1RBVCkpOworCQl9CisJCS8qIE5vdzogQ2hlY2sgcmVtYWluaWcgZGF0YTogVGhlIFNDU0kgY291bnRlcnMgc2hvdWxkIHRlbGwgdXMgLi4uICovCisJCWRfbGVmdF9jb3VudGVyID0gREMzOTV4X3JlYWQzMihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPVU5URVIpCisJCSAgICArICgoREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGT0NOVCkgJiAweDFmKQorCQkgICAgICAgPDwgKChzcmItPmRjYi0+c3luY19wZXJpb2QgJiBXSURFX1NZTkMpID8gMSA6CisJCQkgICAwKSk7CisJCWRwcmludGtkYmcoREJHX0tHLCAiZGF0YV9pbl9waGFzZTA6ICIKKwkJCSJTQ1NJe2ZpZm9jbnQ9MHglMDJ4JXMgY3RyPTB4JTA4eH0gIgorCQkJIkRNQXtmaWZvY250PTB4JTAyeCBmaWZvc3RhdD0weCUwMnggY3RyPTB4JTA4eH0gIgorCQkJIlJlbWFpbnt0b3R4ZmVyPSVpIHNjc2lfZmlmbytjdHI9JWl9XG4iLAorCQkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGT0NOVCksCisJCQkoc3JiLT5kY2ItPnN5bmNfcGVyaW9kICYgV0lERV9TWU5DKSA/ICJ3b3JkcyIgOiAiYnl0ZXMiLAorCQkJREMzOTV4X3JlYWQzMihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPVU5URVIpLAorCQkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX0RNQV9GSUZPQ05UKSwKKwkJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9ETUFfRklGT1NUQVQpLAorCQkJREMzOTV4X3JlYWQzMihhY2IsIFRSTV9TMTA0MF9ETUFfQ1hDTlQpLAorCQkJc3JiLT50b3RhbF94ZmVyX2xlbmd0aCwgZF9sZWZ0X2NvdW50ZXIpOworI2lmIERDMzk1eF9MQVNUUElPCisJCS8qIEtHOiBMZXNzIHRoYW4gb3IgZXF1YWwgdG8gNCBieXRlcyBjYW4gbm90IGJlIHRyYW5zZmVyZWQgdmlhIERNQSwgaXQgc2VlbXMuICovCisJCWlmIChkX2xlZnRfY291bnRlcgorCQkgICAgJiYgc3JiLT50b3RhbF94ZmVyX2xlbmd0aCA8PSBEQzM5NXhfTEFTVFBJTykgeworCQkJLyp1MzIgYWRkciA9IChzcmItPnNlZ21lbnRfeFtzcmItPnNnX2luZGV4XS5hZGRyZXNzKTsgKi8KKwkJCS8qc2dfdXBkYXRlX2xpc3QgKHNyYiwgZF9sZWZ0X2NvdW50ZXIpOyAqLworCQkJZHByaW50a2RiZyhEQkdfUElPLCAiZGF0YV9pbl9waGFzZTA6IFBJTyAoJWkgJXMpIHRvICIKKwkJCQkiJXAgZm9yIHJlbWFpbmluZyAlaSBieXRlczoiLAorCQkJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk9DTlQpICYgMHgxZiwKKwkJCQkoc3JiLT5kY2ItPnN5bmNfcGVyaW9kICYgV0lERV9TWU5DKSA/CisJCQkJICAgICJ3b3JkcyIgOiAiYnl0ZXMiLAorCQkJCXNyYi0+dmlydF9hZGRyLAorCQkJCXNyYi0+dG90YWxfeGZlcl9sZW5ndGgpOworCQkJaWYgKHNyYi0+ZGNiLT5zeW5jX3BlcmlvZCAmIFdJREVfU1lOQykKKwkJCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09ORklHMiwKKwkJCQkJICAgICAgQ0ZHMl9XSURFRklGTyk7CisJCQl3aGlsZSAoREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGT0NOVCkgIT0gMHg0MCkgeworCQkJCXU4IGJ5dGUgPSBEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPKTsKKwkJCQkqKHNyYi0+dmlydF9hZGRyKSsrID0gYnl0ZTsKKwkJCQlpZiAoZGVidWdfZW5hYmxlZChEQkdfUElPKSkKKwkJCQkJcHJpbnRrKCIgJTAyeCIsIGJ5dGUpOworCQkJCWRfbGVmdF9jb3VudGVyLS07CisJCQkJc2dfc3VidHJhY3Rfb25lKHNyYik7CisJCQl9CisJCQlpZiAoc3JiLT5kY2ItPnN5bmNfcGVyaW9kICYgV0lERV9TWU5DKSB7CisjaWYgMQorICAgICAgICAgICAgICAgIC8qIFJlYWQgdGhlIGxhc3QgYnl0ZSAuLi4gKi8KKwkJCQlpZiAoc3JiLT50b3RhbF94ZmVyX2xlbmd0aCA+IDApIHsKKwkJCQkJdTggYnl0ZSA9IERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8pOworCQkJCQkqKHNyYi0+dmlydF9hZGRyKSsrID0gYnl0ZTsKKwkJCQkJc3JiLT50b3RhbF94ZmVyX2xlbmd0aC0tOworCQkJCQlpZiAoZGVidWdfZW5hYmxlZChEQkdfUElPKSkKKwkJCQkJCXByaW50aygiICUwMngiLCBieXRlKTsKKwkJCQl9CisjZW5kaWYKKwkJCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09ORklHMiwgMCk7CisJCQl9CisJCQkvKnByaW50aygiICUwOHgiLCAqKHUzMiopKGJ1c190b192aXJ0IChhZGRyKSkpOyAqLworCQkJLypzcmItPnRvdGFsX3hmZXJfbGVuZ3RoID0gMDsgKi8KKwkJCWlmIChkZWJ1Z19lbmFibGVkKERCR19QSU8pKQorCQkJCXByaW50aygiXG4iKTsKKwkJfQorI2VuZGlmCQkJCS8qIERDMzk1eF9MQVNUUElPICovCisKKyNpZiAwCisJCS8qCisJCSAqIEtHOiBUaGlzIHdhcyBpbiBEQVRBT1VULiBEb2VzIGl0IGFsc28gYmVsb25nIGhlcmU/CisJCSAqIE5vYm9keSBzZWVtcyB0byBrbm93IHdoYXQgY291bnRlciBhbmQgZmlmb19jbnQgY291bnQgZXhhY3RseSAuLi4KKwkJICovCisJCWlmICghKHNjc2lfc3RhdHVzICYgU0NTSVhGRVJET05FKSkgeworCQkJLyoKKwkJCSAqIHdoZW4gZGF0YSB0cmFuc2ZlciBmcm9tIERNQSBGSUZPIHRvIFNDU0kgRklGTworCQkJICogaWYgdGhlcmUgd2FzIHNvbWUgZGF0YSBsZWZ0IGluIFNDU0kgRklGTworCQkJICovCisJCQlkX2xlZnRfY291bnRlciA9CisJCQkgICAgKHUzMikoREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGT0NOVCkgJgorCQkJCSAgMHgxRik7CisJCQlpZiAoc3JiLT5kY2ItPnN5bmNfcGVyaW9kICYgV0lERV9TWU5DKQorCQkJCWRfbGVmdF9jb3VudGVyIDw8PSAxOworCQkJLyoKKwkJCSAqIGlmIFdJREUgc2NzaSBTQ1NJIEZJRk9DTlQgdW5pdCBpcyB3b3JkICEhIQorCQkJICogc28gbmVlZCB0byAqPSAyCisJCQkgKiBLRzogU2VlbXMgdG8gYmUgY29ycmVjdCAuLi4KKwkJCSAqLworCQl9CisjZW5kaWYKKwkJLyogS0c6IFRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQgYW55IG1vcmUhICovCisJCWlmIChkX2xlZnRfY291bnRlciA9PSAwCisJCSAgICB8fCAoc2NzaV9zdGF0dXMgJiBTQ1NJWEZFUkNOVF8yX1pFUk8pKSB7CisjaWYgMAorCQkJaW50IGN0ciA9IDYwMDAwMDA7CisJCQl1OCBUZW1wRE1Bc3RhdHVzOworCQkJZG8geworCQkJCVRlbXBETUFzdGF0dXMgPQorCQkJCSAgICBEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfRE1BX1NUQVRVUyk7CisJCQl9IHdoaWxlICghKFRlbXBETUFzdGF0dXMgJiBETUFYRkVSQ09NUCkgJiYgLS1jdHIpOworCQkJaWYgKCFjdHIpCisJCQkJZHByaW50a2woS0VSTl9FUlIsCisJCQkJICAgICAgICJEZWFkbG9jayBpbiBEYXRhSW5QaGFzZTAgd2FpdGluZyBmb3IgRE1BISFcbiIpOworCQkJc3JiLT50b3RhbF94ZmVyX2xlbmd0aCA9IDA7CisjZW5kaWYKKwkJCXNyYi0+dG90YWxfeGZlcl9sZW5ndGggPSBkX2xlZnRfY291bnRlcjsKKwkJfSBlbHNlIHsJLyogcGhhc2UgY2hhbmdlZCAqLworCQkJLyoKKwkJCSAqIHBhcnNpbmcgdGhlIGNhc2U6CisJCQkgKiB3aGVuIGEgdHJhbnNmZXIgbm90IHlldCBjb21wbGV0ZSAKKwkJCSAqIGJ1dCBiZSBkaXNjb25uZWN0ZWQgYnkgdGFyZ2V0CisJCQkgKiBpZiB0cmFuc2ZlciBub3QgeWV0IGNvbXBsZXRlCisJCQkgKiB0aGVyZSB3ZXJlIHNvbWUgZGF0YSByZXNpZHVlIGluIFNDU0kgRklGTyBvcgorCQkJICogU0NTSSB0cmFuc2ZlciBjb3VudGVyIG5vdCBlbXB0eQorCQkJICovCisJCQlzZ191cGRhdGVfbGlzdChzcmIsIGRfbGVmdF9jb3VudGVyKTsKKwkJfQorCX0KKwkvKiBLRzogVGhlIHRhcmdldCBtYXkgZGVjaWRlIHRvIGRpc2Nvbm5lY3Q6IEVtcHR5IEZJRk8gYmVmb3JlISAqLworCWlmICgoKnBzY3NpX3N0YXR1cyAmIFBIQVNFTUFTSykgIT0gUEhfREFUQV9JTikgeworCQljbGVhbnVwX2FmdGVyX3RyYW5zZmVyKGFjYiwgc3JiKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgZGF0YV9pbl9waGFzZTEoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpCit7CisJZHByaW50a2RiZyhEQkdfMCwgImRhdGFfaW5fcGhhc2UxOiAocGlkIyVsaSkgPCUwMmktJWk+XG4iLAorCQlzcmItPmNtZC0+cGlkLCBzcmItPmNtZC0+ZGV2aWNlLT5pZCwgc3JiLT5jbWQtPmRldmljZS0+bHVuKTsKKwlkYXRhX2lvX3RyYW5zZmVyKGFjYiwgc3JiLCBYRkVSREFUQUlOKTsKK30KKworCitzdGF0aWMgdm9pZCBkYXRhX2lvX3RyYW5zZmVyKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIAorCQlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLCB1MTYgaW9fZGlyKQoreworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiA9IHNyYi0+ZGNiOworCXU4IGJ2YWw7CisJZHByaW50a2RiZyhEQkdfMCwKKwkJImRhdGFfaW9fdHJhbnNmZXI6IChwaWQjJWxpKSA8JTAyaS0laT4gJWMgbGVuPSVpLCBzZz0oJWkvJWkpXG4iLAorCQlzcmItPmNtZC0+cGlkLCBzcmItPmNtZC0+ZGV2aWNlLT5pZCwgc3JiLT5jbWQtPmRldmljZS0+bHVuLAorCQkoKGlvX2RpciAmIERNQUNNRF9ESVIpID8gJ3InIDogJ3cnKSwKKwkJc3JiLT50b3RhbF94ZmVyX2xlbmd0aCwgc3JiLT5zZ19pbmRleCwgc3JiLT5zZ19jb3VudCk7CisJaWYgKHNyYiA9PSBhY2ItPnRtcF9zcmIpCisJCWRwcmludGtsKEtFUk5fRVJSLCAiZGF0YV9pb190cmFuc2ZlcjogVXNpbmcgdG1wX3NyYiFcbiIpOworCWlmIChzcmItPnNnX2luZGV4ID49IHNyYi0+c2dfY291bnQpIHsKKwkJLyogY2FuJ3QgaGFwcGVuPyBvdXQgb2YgYm91bmRzIGVycm9yICovCisJCXJldHVybjsKKwl9CisKKwlpZiAoc3JiLT50b3RhbF94ZmVyX2xlbmd0aCA+IERDMzk1eF9MQVNUUElPKSB7CisJCXU4IGRtYV9zdGF0dXMgPSBEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfRE1BX1NUQVRVUyk7CisJCS8qCisJCSAqIEtHOiBXaGF0IHNob3VsZCB3ZSBkbzogVXNlIFNDU0kgQ21kIDB4OTAvMHg5Mj8KKwkJICogTWF5YmUsIGV2ZW4gQUJPUlRYRkVSIHdvdWxkIGJlIGFwcHJvcHJpYXRlCisJCSAqLworCQlpZiAoZG1hX3N0YXR1cyAmIFhGRVJQRU5ESU5HKSB7CisJCQlkcHJpbnRrbChLRVJOX0RFQlVHLCAiZGF0YV9pb190cmFuc2ZlcjogWGZlciBwZW5kaW5nISAiCisJCQkJIkV4cGVjdCB0cm91YmxlIVxuIik7CisJCQlkdW1wX3JlZ2lzdGVyX2luZm8oYWNiLCBkY2IsIHNyYik7CisJCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX0RNQV9DT05UUk9MLCBDTFJYRklGTyk7CisJCX0KKwkJLyogY2xlYXJfZmlmbyhhY2IsICJJTyIpOyAqLworCQkvKiAKKwkJICogbG9hZCB3aGF0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgU2NhdHRlci9HYXRoZXIgbGlzdCB0YWJsZQorCQkgKiB3YW50IHRvIGJlIHRyYW5zZmVyCisJCSAqLworCQlzcmItPnN0YXRlIHw9IFNSQl9EQVRBX1hGRVI7CisJCURDMzk1eF93cml0ZTMyKGFjYiwgVFJNX1MxMDQwX0RNQV9YSElHSEFERFIsIDApOworCQlpZiAoc3JiLT5jbWQtPnVzZV9zZykgewkvKiB3aXRoIFMvRyAqLworCQkJaW9fZGlyIHw9IERNQUNNRF9TRzsKKwkJCURDMzk1eF93cml0ZTMyKGFjYiwgVFJNX1MxMDQwX0RNQV9YTE9XQUREUiwKKwkJCQkgICAgICAgc3JiLT5zZ19idXNfYWRkciArCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgU0dlbnRyeSkgKgorCQkJCSAgICAgICBzcmItPnNnX2luZGV4KTsKKwkJCS8qIGxvYWQgaG93IG1hbnkgYnl0ZXMgaW4gdGhlIHNnIGxpc3QgdGFibGUgKi8KKwkJCURDMzk1eF93cml0ZTMyKGFjYiwgVFJNX1MxMDQwX0RNQV9YQ05ULAorCQkJCSAgICAgICAoKHUzMikoc3JiLT5zZ19jb3VudCAtCisJCQkJCSAgICAgIHNyYi0+c2dfaW5kZXgpIDw8IDMpKTsKKwkJfSBlbHNlIHsJLyogd2l0aG91dCBTL0cgKi8KKwkJCWlvX2RpciAmPSB+RE1BQ01EX1NHOworCQkJREMzOTV4X3dyaXRlMzIoYWNiLCBUUk1fUzEwNDBfRE1BX1hMT1dBRERSLAorCQkJCSAgICAgICBzcmItPnNlZ21lbnRfeFswXS5hZGRyZXNzKTsKKwkJCURDMzk1eF93cml0ZTMyKGFjYiwgVFJNX1MxMDQwX0RNQV9YQ05ULAorCQkJCSAgICAgICBzcmItPnNlZ21lbnRfeFswXS5sZW5ndGgpOworCQl9CisJCS8qIGxvYWQgdG90YWwgdHJhbnNmZXIgbGVuZ3RoICgyNGJpdHMpIG1heCB2YWx1ZSAxNk1ieXRlICovCisJCURDMzk1eF93cml0ZTMyKGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09VTlRFUiwKKwkJCSAgICAgICBzcmItPnRvdGFsX3hmZXJfbGVuZ3RoKTsKKwkJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19EQVRBTEFUQ0gpOwkvKiBpdCdzIGltcG9ydGFudCBmb3IgYXRuIHN0b3AgKi8KKwkJaWYgKGlvX2RpciAmIERNQUNNRF9ESVIpIHsJLyogcmVhZCAqLworCQkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTU1BTkQsCisJCQkJICAgICAgU0NNRF9ETUFfSU4pOworCQkJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfRE1BX0NPTU1BTkQsIGlvX2Rpcik7CisJCX0gZWxzZSB7CisJCQlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9ETUFfQ09NTUFORCwgaW9fZGlyKTsKKwkJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT01NQU5ELAorCQkJCSAgICAgIFNDTURfRE1BX09VVCk7CisJCX0KKworCX0KKyNpZiBEQzM5NXhfTEFTVFBJTworCWVsc2UgaWYgKHNyYi0+dG90YWxfeGZlcl9sZW5ndGggPiAwKSB7CS8qIFRoZSBsYXN0IGZvdXIgYnl0ZXM6IERvIFBJTyAqLworCQkvKiAKKwkJICogbG9hZCB3aGF0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgU2NhdHRlci9HYXRoZXIgbGlzdCB0YWJsZQorCQkgKiB3YW50IHRvIGJlIHRyYW5zZmVyCisJCSAqLworCQlzcmItPnN0YXRlIHw9IFNSQl9EQVRBX1hGRVI7CisJCS8qIGxvYWQgdG90YWwgdHJhbnNmZXIgbGVuZ3RoICgyNGJpdHMpIG1heCB2YWx1ZSAxNk1ieXRlICovCisJCURDMzk1eF93cml0ZTMyKGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09VTlRFUiwKKwkJCSAgICAgICBzcmItPnRvdGFsX3hmZXJfbGVuZ3RoKTsKKwkJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19EQVRBTEFUQ0gpOwkvKiBpdCdzIGltcG9ydGFudCBmb3IgYXRuIHN0b3AgKi8KKwkJaWYgKGlvX2RpciAmIERNQUNNRF9ESVIpIHsJLyogcmVhZCAqLworCQkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTU1BTkQsCisJCQkJICAgICAgU0NNRF9GSUZPX0lOKTsKKwkJfSBlbHNlIHsJLyogd3JpdGUgKi8KKwkJCWludCBsbiA9IHNyYi0+dG90YWxfeGZlcl9sZW5ndGg7CisJCQlpZiAoc3JiLT5kY2ItPnN5bmNfcGVyaW9kICYgV0lERV9TWU5DKQorCQkJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05GSUcyLAorCQkJCSAgICAgQ0ZHMl9XSURFRklGTyk7CisJCQlkcHJpbnRrZGJnKERCR19QSU8sCisJCQkJImRhdGFfaW9fdHJhbnNmZXI6IFBJTyAlaSBieXRlcyBmcm9tICVwOiIsCisJCQkJc3JiLT50b3RhbF94ZmVyX2xlbmd0aCwgc3JiLT52aXJ0X2FkZHIpOworCisJCQl3aGlsZSAoc3JiLT50b3RhbF94ZmVyX2xlbmd0aCkgeworCQkJCWlmIChkZWJ1Z19lbmFibGVkKERCR19QSU8pKQorCQkJCQlwcmludGsoIiAlMDJ4IiwgKHVuc2lnbmVkIGNoYXIpICooc3JiLT52aXJ0X2FkZHIpKTsKKworCQkJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPLCAKKwkJCQkgICAgICooc3JiLT52aXJ0X2FkZHIpKyspOworCisJCQkJc2dfc3VidHJhY3Rfb25lKHNyYik7CisJCQl9CisJCQlpZiAoc3JiLT5kY2ItPnN5bmNfcGVyaW9kICYgV0lERV9TWU5DKSB7CisJCQkJaWYgKGxuICUgMikgeworCQkJCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTywgMCk7CisJCQkJCWlmIChkZWJ1Z19lbmFibGVkKERCR19QSU8pKQorCQkJCQkJcHJpbnRrKCIgfDAwIik7CisJCQkJfQorCQkJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05GSUcyLCAwKTsKKwkJCX0KKwkJCS8qREMzOTV4X3dyaXRlMzIoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT1VOVEVSLCBsbik7ICovCisJCQlpZiAoZGVidWdfZW5hYmxlZChEQkdfUElPKSkKKwkJCQlwcmludGsoIlxuIik7CisJCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09NTUFORCwKKwkJCQkJICBTQ01EX0ZJRk9fT1VUKTsKKwkJfQorCX0KKyNlbmRpZgkJCQkvKiBEQzM5NXhfTEFTVFBJTyAqLworCWVsc2UgewkJLyogeGZlciBwYWQgKi8KKwkJdTggZGF0YSA9IDAsIGRhdGEyID0gMDsKKwkJaWYgKHNyYi0+c2dfY291bnQpIHsKKwkJCXNyYi0+YWRhcHRlcl9zdGF0dXMgPSBIX09WRVJfVU5ERVJfUlVOOworCQkJc3JiLT5zdGF0dXMgfD0gT1ZFUl9SVU47CisJCX0KKwkJLyoKKwkJICogS0c6IGRlc3BpdGUgdGhlIGZhY3QgdGhhdCB3ZSBhcmUgdXNpbmcgMTYgYml0cyBJL08gb3BzCisJCSAqIHRoZSBTQ1NJIEZJRk8gaXMgb25seSA4IGJpdHMgYWNjb3JkaW5nIHRvIHRoZSBkb2NzCisJCSAqICh3ZSBjYW4gc2V0IGJpdCAxIGluIDB4OGYgdG8gc2VyaWFsaXplIEZJRk8gYWNjZXNzIC4uLikKKwkJICovCisJCWlmIChkY2ItPnN5bmNfcGVyaW9kICYgV0lERV9TWU5DKSB7CisJCQlEQzM5NXhfd3JpdGUzMihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPVU5URVIsIDIpOworCQkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTkZJRzIsCisJCQkJICAgICAgQ0ZHMl9XSURFRklGTyk7CisJCQlpZiAoaW9fZGlyICYgRE1BQ01EX0RJUikgeworCQkJCWRhdGEgPSBEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPKTsKKwkJCQlkYXRhMiA9IERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8pOworCQkJfSBlbHNlIHsKKwkJCQkvKiBEYW5nZXIsIFJvYmluc29uOiBJZiB5b3UgZmluZCBLR3MKKwkJCQkgKiBzY2F0dGVyZWQgb3ZlciB0aGUgd2lkZSBkaXNrLCB0aGUgZHJpdmVyCisJCQkJICogb3IgY2hpcCBpcyB0byBibGFtZSA6LSggKi8KKwkJCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTywgJ0snKTsKKwkJCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTywgJ0cnKTsKKwkJCX0KKwkJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05GSUcyLCAwKTsKKwkJfSBlbHNlIHsKKwkJCURDMzk1eF93cml0ZTMyKGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09VTlRFUiwgMSk7CisJCQkvKiBEYW5nZXIsIFJvYmluc29uOiBJZiB5b3UgZmluZCBhIGNvbGxlY3Rpb24gb2YgS3Mgb24geW91ciBkaXNrCisJCQkgKiBzb21ldGhpbmcgYnJva2UgOi0oICovCisJCQlpZiAoaW9fZGlyICYgRE1BQ01EX0RJUikKKwkJCQlkYXRhID0gREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTyk7CisJCQllbHNlCisJCQkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8sICdLJyk7CisJCX0KKwkJc3JiLT5zdGF0ZSB8PSBTUkJfWEZFUlBBRDsKKwkJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19EQVRBTEFUQ0gpOwkvKiBpdCdzIGltcG9ydGFudCBmb3IgYXRuIHN0b3AgKi8KKwkJLyogU0NTSSBjb21tYW5kICovCisJCWJ2YWwgPSAoaW9fZGlyICYgRE1BQ01EX0RJUikgPyBTQ01EX0ZJRk9fSU4gOiBTQ01EX0ZJRk9fT1VUOworCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09NTUFORCwgYnZhbCk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHN0YXR1c19waGFzZTAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpCit7CisJZHByaW50a2RiZyhEQkdfMCwgInN0YXR1c19waGFzZTA6IChwaWQjJWxpKSA8JTAyaS0laT5cbiIsCisJCXNyYi0+Y21kLT5waWQsIHNyYi0+Y21kLT5kZXZpY2UtPmlkLCBzcmItPmNtZC0+ZGV2aWNlLT5sdW4pOworCXNyYi0+dGFyZ2V0X3N0YXR1cyA9IERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8pOworCXNyYi0+ZW5kX21lc3NhZ2UgPSBEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPKTsJLyogZ2V0IG1lc3NhZ2UgKi8KKwlzcmItPnN0YXRlID0gU1JCX0NPTVBMRVRFRDsKKwkqcHNjc2lfc3RhdHVzID0gUEhfQlVTX0ZSRUU7CS8qLi4gaW5pdGlhbCBwaGFzZSAqLworCURDMzk1eF93cml0ZTE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09OVFJPTCwgRE9fREFUQUxBVENIKTsJLyogaXQncyBpbXBvcnRhbnQgZm9yIGF0biBzdG9wICovCisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTU1BTkQsIFNDTURfTVNHQUNDRVBUKTsKK30KKworCitzdGF0aWMgdm9pZCBzdGF0dXNfcGhhc2UxKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIsCisJCXUxNiAqcHNjc2lfc3RhdHVzKQoreworCWRwcmludGtkYmcoREJHXzAsICJzdGF0dXNfcGhhc2UxOiAocGlkIyVsaSkgPCUwMmktJWk+XG4iLAorCQlzcmItPmNtZC0+cGlkLCBzcmItPmNtZC0+ZGV2aWNlLT5pZCwgc3JiLT5jbWQtPmRldmljZS0+bHVuKTsKKwlzcmItPnN0YXRlID0gU1JCX1NUQVRVUzsKKwlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX0RBVEFMQVRDSCk7CS8qIGl0J3MgaW1wb3J0YW50IGZvciBhdG4gc3RvcCAqLworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT01NQU5ELCBTQ01EX0NPTVApOworfQorCisKKy8qIENoZWNrIGlmIHRoZSBtZXNzYWdlIGlzIGNvbXBsZXRlICovCitzdGF0aWMgaW5saW5lIHU4IG1zZ2luX2NvbXBsZXRlZCh1OCAqIG1zZ2J1ZiwgdTMyIGxlbikKK3sKKwlpZiAoKm1zZ2J1ZiA9PSBFWFRFTkRFRF9NRVNTQUdFKSB7CisJCWlmIChsZW4gPCAyKQorCQkJcmV0dXJuIDA7CisJCWlmIChsZW4gPCBtc2didWZbMV0gKyAyKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIGlmICgqbXNnYnVmID49IDB4MjAgJiYgKm1zZ2J1ZiA8PSAweDJmKQkvKiB0d28gYnl0ZSBtZXNzYWdlcyAqLworCQlpZiAobGVuIDwgMikKKwkJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKiByZWplY3RfbXNnICovCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnaW5fcmVqZWN0KHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsCisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIpCit7CisJc3JiLT5tc2dvdXRfYnVmWzBdID0gTUVTU0FHRV9SRUpFQ1Q7CisJc3JiLT5tc2dfY291bnQgPSAxOworCURDMzk1eF9FTkFCTEVfTVNHT1VUOworCXNyYi0+c3RhdGUgJj0gflNSQl9NU0dJTjsKKwlzcmItPnN0YXRlIHw9IFNSQl9NU0dPVVQ7CisJZHByaW50a2woS0VSTl9JTkZPLCAibXNnaW5fcmVqZWN0OiAweCUwMnggPCUwMmktJWk+XG4iLAorCQlzcmItPm1zZ2luX2J1ZlswXSwKKwkJc3JiLT5kY2ItPnRhcmdldF9pZCwgc3JiLT5kY2ItPnRhcmdldF9sdW4pOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgU2NzaVJlcUJsayAqbXNnaW5fcXRhZyhzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLAorCQlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IsIHU4IHRhZykKK3sKKwlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiID0gTlVMTDsKKwlzdHJ1Y3QgU2NzaVJlcUJsayAqaTsKKwlkcHJpbnRrZGJnKERCR18wLCAibXNnaW5fcXRhZzogKHBpZCMlbGkpIHRhZz0laSBzcmI9JXBcbiIsCisJCSAgIHNyYi0+Y21kLT5waWQsIHRhZywgc3JiKTsKKworCWlmICghKGRjYi0+dGFnX21hc2sgJiAoMSA8PCB0YWcpKSkKKwkJZHByaW50a2woS0VSTl9ERUJVRywKKwkJCSJtc2dpbl9xdGFnOiB0YWdfbWFzaz0weCUwOHggZG9lcyBub3QgcmVzZXJ2ZSB0YWcgJWkhXG4iLAorCQkJZGNiLT50YWdfbWFzaywgdGFnKTsKKworCWlmIChsaXN0X2VtcHR5KCZkY2ItPnNyYl9nb2luZ19saXN0KSkKKwkJZ290byBtaW5neDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmZGNiLT5zcmJfZ29pbmdfbGlzdCwgbGlzdCkgeworCQlpZiAoaS0+dGFnX251bWJlciA9PSB0YWcpIHsKKwkJCXNyYiA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIXNyYikKKwkJZ290byBtaW5neDA7CisKKwlkcHJpbnRrZGJnKERCR18wLCAibXNnaW5fcXRhZzogKHBpZCMlbGkpIDwlMDJpLSVpPlxuIiwKKwkJc3JiLT5jbWQtPnBpZCwgc3JiLT5kY2ItPnRhcmdldF9pZCwgc3JiLT5kY2ItPnRhcmdldF9sdW4pOworCWlmIChkY2ItPmZsYWcgJiBBQk9SVF9ERVZfKSB7CisJCS8qc3JiLT5zdGF0ZSA9IFNSQl9BQk9SVF9TRU5UOyAqLworCQllbmFibGVfbXNnb3V0X2Fib3J0KGFjYiwgc3JiKTsKKwl9CisKKwlpZiAoIShzcmItPnN0YXRlICYgU1JCX0RJU0NPTk5FQ1QpKQorCQlnb3RvIG1pbmd4MDsKKworCW1lbWNweShzcmItPm1zZ2luX2J1ZiwgZGNiLT5hY3RpdmVfc3JiLT5tc2dpbl9idWYsIGFjYi0+bXNnX2xlbik7CisJc3JiLT5zdGF0ZSB8PSBkY2ItPmFjdGl2ZV9zcmItPnN0YXRlOworCXNyYi0+c3RhdGUgfD0gU1JCX0RBVEFfWEZFUjsKKwlkY2ItPmFjdGl2ZV9zcmIgPSBzcmI7CisJLyogSG93IGNhbiB3ZSBtYWtlIHRoZSBET1JTIGhhcHB5PyAqLworCXJldHVybiBzcmI7CisKKyAgICAgIG1pbmd4MDoKKwlzcmIgPSBhY2ItPnRtcF9zcmI7CisJc3JiLT5zdGF0ZSA9IFNSQl9VTkVYUEVDVF9SRVNFTDsKKwlkY2ItPmFjdGl2ZV9zcmIgPSBzcmI7CisJc3JiLT5tc2dvdXRfYnVmWzBdID0gTVNHX0FCT1JUX1RBRzsKKwlzcmItPm1zZ19jb3VudCA9IDE7CisJREMzOTV4X0VOQUJMRV9NU0dPVVQ7CisJZHByaW50a2woS0VSTl9ERUJVRywgIm1zZ2luX3F0YWc6IFVua25vd24gdGFnICVpIC0gYWJvcnRcbiIsIHRhZyk7CisJcmV0dXJuIHNyYjsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgcmVwcm9ncmFtX3JlZ3Moc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwKKwkJc3RydWN0IERldmljZUN0bEJsayAqZGNiKQoreworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9UQVJHRVRJRCwgZGNiLT50YXJnZXRfaWQpOworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9TWU5DLCBkY2ItPnN5bmNfcGVyaW9kKTsKKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfT0ZGU0VULCBkY2ItPnN5bmNfb2Zmc2V0KTsKKwlzZXRfeGZlcl9yYXRlKGFjYiwgZGNiKTsKK30KKworCisvKiBzZXQgYXN5bmMgdHJhbnNmZXIgbW9kZSAqLworc3RhdGljIHZvaWQgbXNnaW5fc2V0X2FzeW5jKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIpCit7CisJc3RydWN0IERldmljZUN0bEJsayAqZGNiID0gc3JiLT5kY2I7CisJZHByaW50a2woS0VSTl9ERUJVRywgIm1zZ2luX3NldF9hc3luYzogTm8gc3luYyB0cmFuc2ZlcnMgPCUwMmktJWk+XG4iLAorCQlkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuKTsKKworCWRjYi0+c3luY19tb2RlICY9IH4oU1lOQ19ORUdPX0VOQUJMRSk7CisJZGNiLT5zeW5jX21vZGUgfD0gU1lOQ19ORUdPX0RPTkU7CisJLypkY2ItPnN5bmNfcGVyaW9kICY9IDA7ICovCisJZGNiLT5zeW5jX29mZnNldCA9IDA7CisJZGNiLT5taW5fbmVnb19wZXJpb2QgPSAyMDAgPj4gMjsJLyogMjAwbnMgPD0+IDUgTUh6ICovCisJc3JiLT5zdGF0ZSAmPSB+U1JCX0RPX1NZTkNfTkVHTzsKKwlyZXByb2dyYW1fcmVncyhhY2IsIGRjYik7CisJaWYgKChkY2ItPnN5bmNfbW9kZSAmIFdJREVfTkVHT19FTkFCTEUpCisJICAgICYmICEoZGNiLT5zeW5jX21vZGUgJiBXSURFX05FR09fRE9ORSkpIHsKKwkJYnVpbGRfd2R0cihhY2IsIGRjYiwgc3JiKTsKKwkJREMzOTV4X0VOQUJMRV9NU0dPVVQ7CisJCWRwcmludGtkYmcoREJHXzAsICJtc2dpbl9zZXRfYXN5bmMocmVqKTogVHJ5IFdEVFIgYW55d2F5XG4iKTsKKwl9Cit9CisKKworLyogc2V0IHN5bmMgdHJhbnNmZXIgbW9kZSAqLworc3RhdGljIHZvaWQgbXNnaW5fc2V0X3N5bmMoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYikKK3sKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IgPSBzcmItPmRjYjsKKwl1OCBidmFsOworCWludCBmYWN0OworCWRwcmludGtkYmcoREJHXzEsICJtc2dpbl9zZXRfc3luYzogPCUwMmk+IFN5bmM6ICVpbnMgIgorCQkiKCUwMmkuJTAxaSBNSHopIE9mZnNldCAlaVxuIiwKKwkJZGNiLT50YXJnZXRfaWQsIHNyYi0+bXNnaW5fYnVmWzNdIDw8IDIsCisJCSgyNTAgLyBzcmItPm1zZ2luX2J1ZlszXSksCisJCSgoMjUwICUgc3JiLT5tc2dpbl9idWZbM10pICogMTApIC8gc3JiLT5tc2dpbl9idWZbM10sCisJCXNyYi0+bXNnaW5fYnVmWzRdKTsKKworCWlmIChzcmItPm1zZ2luX2J1Zls0XSA+IDE1KQorCQlzcmItPm1zZ2luX2J1Zls0XSA9IDE1OworCWlmICghKGRjYi0+ZGV2X21vZGUgJiBOVENfRE9fU1lOQ19ORUdPKSkKKwkJZGNiLT5zeW5jX29mZnNldCA9IDA7CisJZWxzZSBpZiAoZGNiLT5zeW5jX29mZnNldCA9PSAwKQorCQlkY2ItPnN5bmNfb2Zmc2V0ID0gc3JiLT5tc2dpbl9idWZbNF07CisJaWYgKHNyYi0+bXNnaW5fYnVmWzRdID4gZGNiLT5zeW5jX29mZnNldCkKKwkJc3JiLT5tc2dpbl9idWZbNF0gPSBkY2ItPnN5bmNfb2Zmc2V0OworCWVsc2UKKwkJZGNiLT5zeW5jX29mZnNldCA9IHNyYi0+bXNnaW5fYnVmWzRdOworCWJ2YWwgPSAwOworCXdoaWxlIChidmFsIDwgNyAmJiAoc3JiLT5tc2dpbl9idWZbM10gPiBjbG9ja19wZXJpb2RbYnZhbF0KKwkJCSAgICB8fCBkY2ItPm1pbl9uZWdvX3BlcmlvZCA+CisJCQkgICAgY2xvY2tfcGVyaW9kW2J2YWxdKSkKKwkJYnZhbCsrOworCWlmIChzcmItPm1zZ2luX2J1ZlszXSA8IGNsb2NrX3BlcmlvZFtidmFsXSkKKwkJZHByaW50a2woS0VSTl9JTkZPLAorCQkJIm1zZ2luX3NldF9zeW5jOiBJbmNyZWFzZSBzeW5jIG5lZ28gcGVyaW9kIHRvICVpbnNcbiIsCisJCQljbG9ja19wZXJpb2RbYnZhbF0gPDwgMik7CisJc3JiLT5tc2dpbl9idWZbM10gPSBjbG9ja19wZXJpb2RbYnZhbF07CisJZGNiLT5zeW5jX3BlcmlvZCAmPSAweGYwOworCWRjYi0+c3luY19wZXJpb2QgfD0gQUxUX1NZTkMgfCBidmFsOworCWRjYi0+bWluX25lZ29fcGVyaW9kID0gc3JiLT5tc2dpbl9idWZbM107CisKKwlpZiAoZGNiLT5zeW5jX3BlcmlvZCAmIFdJREVfU1lOQykKKwkJZmFjdCA9IDUwMDsKKwllbHNlCisJCWZhY3QgPSAyNTA7CisKKwlkcHJpbnRrbChLRVJOX0lORk8sCisJCSJUYXJnZXQgJTAyaTogJXMgU3luYzogJWlucyBPZmZzZXQgJWkgKCUwMmkuJTAxaSBNQi9zKVxuIiwKKwkJZGNiLT50YXJnZXRfaWQsIChmYWN0ID09IDUwMCkgPyAiV2lkZTE2IiA6ICIiLAorCQlkY2ItPm1pbl9uZWdvX3BlcmlvZCA8PCAyLCBkY2ItPnN5bmNfb2Zmc2V0LAorCQkoZmFjdCAvIGRjYi0+bWluX25lZ29fcGVyaW9kKSwKKwkJKChmYWN0ICUgZGNiLT5taW5fbmVnb19wZXJpb2QpICogMTAgKworCQlkY2ItPm1pbl9uZWdvX3BlcmlvZCAvIDIpIC8gZGNiLT5taW5fbmVnb19wZXJpb2QpOworCisJaWYgKCEoc3JiLT5zdGF0ZSAmIFNSQl9ET19TWU5DX05FR08pKSB7CisJCS8qIFJlcGx5IHdpdGggY29ycmVjdGVkIFNEVFIgTWVzc2FnZSAqLworCQlkcHJpbnRrbChLRVJOX0RFQlVHLCAibXNnaW5fc2V0X3N5bmM6IGFuc3dlciB3LyVpbnMgJWlcbiIsCisJCQlzcmItPm1zZ2luX2J1ZlszXSA8PCAyLCBzcmItPm1zZ2luX2J1Zls0XSk7CisKKwkJbWVtY3B5KHNyYi0+bXNnb3V0X2J1Ziwgc3JiLT5tc2dpbl9idWYsIDUpOworCQlzcmItPm1zZ19jb3VudCA9IDU7CisJCURDMzk1eF9FTkFCTEVfTVNHT1VUOworCQlkY2ItPnN5bmNfbW9kZSB8PSBTWU5DX05FR09fRE9ORTsKKwl9IGVsc2UgeworCQlpZiAoKGRjYi0+c3luY19tb2RlICYgV0lERV9ORUdPX0VOQUJMRSkKKwkJICAgICYmICEoZGNiLT5zeW5jX21vZGUgJiBXSURFX05FR09fRE9ORSkpIHsKKwkJCWJ1aWxkX3dkdHIoYWNiLCBkY2IsIHNyYik7CisJCQlEQzM5NXhfRU5BQkxFX01TR09VVDsKKwkJCWRwcmludGtkYmcoREJHXzAsICJtc2dpbl9zZXRfc3luYzogQWxzbyB0cnkgV0RUUlxuIik7CisJCX0KKwl9CisJc3JiLT5zdGF0ZSAmPSB+U1JCX0RPX1NZTkNfTkVHTzsKKwlkY2ItPnN5bmNfbW9kZSB8PSBTWU5DX05FR09fRE9ORSB8IFNZTkNfTkVHT19FTkFCTEU7CisKKwlyZXByb2dyYW1fcmVncyhhY2IsIGRjYik7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIG1zZ2luX3NldF9ub3dpZGUoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnNyYikKK3sKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IgPSBzcmItPmRjYjsKKwlkcHJpbnRrZGJnKERCR18xLCAibXNnaW5fc2V0X25vd2lkZTogPCUwMmk+XG4iLCBkY2ItPnRhcmdldF9pZCk7CisKKwlkY2ItPnN5bmNfcGVyaW9kICY9IH5XSURFX1NZTkM7CisJZGNiLT5zeW5jX21vZGUgJj0gfihXSURFX05FR09fRU5BQkxFKTsKKwlkY2ItPnN5bmNfbW9kZSB8PSBXSURFX05FR09fRE9ORTsKKwlzcmItPnN0YXRlICY9IH5TUkJfRE9fV0lERV9ORUdPOworCXJlcHJvZ3JhbV9yZWdzKGFjYiwgZGNiKTsKKwlpZiAoKGRjYi0+c3luY19tb2RlICYgU1lOQ19ORUdPX0VOQUJMRSkKKwkgICAgJiYgIShkY2ItPnN5bmNfbW9kZSAmIFNZTkNfTkVHT19ET05FKSkgeworCQlidWlsZF9zZHRyKGFjYiwgZGNiLCBzcmIpOworCQlEQzM5NXhfRU5BQkxFX01TR09VVDsKKwkJZHByaW50a2RiZyhEQkdfMCwgIm1zZ2luX3NldF9ub3dpZGU6IFJlamVjdGVkLiBUcnkgU0RUUiBhbnl3YXlcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgbXNnaW5fc2V0X3dpZGUoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYikKK3sKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IgPSBzcmItPmRjYjsKKwl1OCB3aWRlID0gKGRjYi0+ZGV2X21vZGUgJiBOVENfRE9fV0lERV9ORUdPCisJCSAgICYmIGFjYi0+Y29uZmlnICYgSENDX1dJREVfQ0FSRCkgPyAxIDogMDsKKwlkcHJpbnRrZGJnKERCR18xLCAibXNnaW5fc2V0X3dpZGU6IDwlMDJpPlxuIiwgZGNiLT50YXJnZXRfaWQpOworCisJaWYgKHNyYi0+bXNnaW5fYnVmWzNdID4gd2lkZSkKKwkJc3JiLT5tc2dpbl9idWZbM10gPSB3aWRlOworCS8qIENvbXBsZXRlZCAqLworCWlmICghKHNyYi0+c3RhdGUgJiBTUkJfRE9fV0lERV9ORUdPKSkgeworCQlkcHJpbnRrbChLRVJOX0RFQlVHLAorCQkJIm1zZ2luX3NldF93aWRlOiBXaWRlIG5lZ28gaW5pdGlhdGVkIDwlMDJpPlxuIiwKKwkJCWRjYi0+dGFyZ2V0X2lkKTsKKwkJbWVtY3B5KHNyYi0+bXNnb3V0X2J1Ziwgc3JiLT5tc2dpbl9idWYsIDQpOworCQlzcmItPm1zZ19jb3VudCA9IDQ7CisJCXNyYi0+c3RhdGUgfD0gU1JCX0RPX1dJREVfTkVHTzsKKwkJREMzOTV4X0VOQUJMRV9NU0dPVVQ7CisJfQorCisJZGNiLT5zeW5jX21vZGUgfD0gKFdJREVfTkVHT19FTkFCTEUgfCBXSURFX05FR09fRE9ORSk7CisJaWYgKHNyYi0+bXNnaW5fYnVmWzNdID4gMCkKKwkJZGNiLT5zeW5jX3BlcmlvZCB8PSBXSURFX1NZTkM7CisJZWxzZQorCQlkY2ItPnN5bmNfcGVyaW9kICY9IH5XSURFX1NZTkM7CisJc3JiLT5zdGF0ZSAmPSB+U1JCX0RPX1dJREVfTkVHTzsKKwkvKmRjYi0+c3luY19tb2RlICY9IH4oV0lERV9ORUdPX0VOQUJMRStXSURFX05FR09fRE9ORSk7ICovCisJZHByaW50a2RiZyhEQkdfMSwKKwkJIm1zZ2luX3NldF93aWRlOiBXaWRlICglaSBiaXQpIG5lZ290aWF0ZWQgPCUwMmk+XG4iLAorCQkoOCA8PCBzcmItPm1zZ2luX2J1ZlszXSksIGRjYi0+dGFyZ2V0X2lkKTsKKwlyZXByb2dyYW1fcmVncyhhY2IsIGRjYik7CisJaWYgKChkY2ItPnN5bmNfbW9kZSAmIFNZTkNfTkVHT19FTkFCTEUpCisJICAgICYmICEoZGNiLT5zeW5jX21vZGUgJiBTWU5DX05FR09fRE9ORSkpIHsKKwkJYnVpbGRfc2R0cihhY2IsIGRjYiwgc3JiKTsKKwkJREMzOTV4X0VOQUJMRV9NU0dPVVQ7CisJCWRwcmludGtkYmcoREJHXzAsICJtc2dpbl9zZXRfd2lkZTogQWxzbyB0cnkgU0RUUi5cbiIpOworCX0KK30KKworCisvKgorICogZXh0ZW5kZWQgbWVzc2FnZSBjb2RlczoKKyAqCisgKgljb2RlCWRlc2NyaXB0aW9uCisgKgorICoJMDJoCVJlc2VydmVkCisgKgkwMGgJTU9ESUZZIERBVEEgIFBPSU5URVIKKyAqCTAxaAlTWU5DSFJPTk9VUyBEQVRBIFRSQU5TRkVSIFJFUVVFU1QKKyAqCTAzaAlXSURFIERBVEEgVFJBTlNGRVIgUkVRVUVTVAorICogICAwNGggLSA3RmgJUmVzZXJ2ZWQKKyAqICAgODBoIC0gRkZoCVZlbmRvciBzcGVjaWZpYworICovCitzdGF0aWMgdm9pZCBtc2dpbl9waGFzZTAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpCit7CisJc3RydWN0IERldmljZUN0bEJsayAqZGNiID0gYWNiLT5hY3RpdmVfZGNiOworCWRwcmludGtkYmcoREJHXzAsICJtc2dpbl9waGFzZTA6IChwaWQjJWxpKVxuIiwgc3JiLT5jbWQtPnBpZCk7CisKKwlzcmItPm1zZ2luX2J1ZlthY2ItPm1zZ19sZW4rK10gPSBEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPKTsKKwlpZiAobXNnaW5fY29tcGxldGVkKHNyYi0+bXNnaW5fYnVmLCBhY2ItPm1zZ19sZW4pKSB7CisJCS8qIE5vdyBldmFsIHRoZSBtc2cgKi8KKwkJc3dpdGNoIChzcmItPm1zZ2luX2J1ZlswXSkgeworCQljYXNlIERJU0NPTk5FQ1Q6CisJCQlzcmItPnN0YXRlID0gU1JCX0RJU0NPTk5FQ1Q7CisJCQlicmVhazsKKworCQljYXNlIFNJTVBMRV9RVUVVRV9UQUc6CisJCWNhc2UgSEVBRF9PRl9RVUVVRV9UQUc6CisJCWNhc2UgT1JERVJFRF9RVUVVRV9UQUc6CisJCQlzcmIgPQorCQkJICAgIG1zZ2luX3F0YWcoYWNiLCBkY2IsCisJCQkJCSAgICAgIHNyYi0+bXNnaW5fYnVmWzFdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUVTU0FHRV9SRUpFQ1Q6CisJCQlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsCisJCQkJICAgICAgIERPX0NMUkFUTiB8IERPX0RBVEFMQVRDSCk7CisJCQkvKiBBIHN5bmMgbmVnbyBtZXNzYWdlIHdhcyByZWplY3RlZCAhICovCisJCQlpZiAoc3JiLT5zdGF0ZSAmIFNSQl9ET19TWU5DX05FR08pIHsKKwkJCQltc2dpbl9zZXRfYXN5bmMoYWNiLCBzcmIpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogQSB3aWRlIG5lZ28gbWVzc2FnZSB3YXMgcmVqZWN0ZWQgISAqLworCQkJaWYgKHNyYi0+c3RhdGUgJiBTUkJfRE9fV0lERV9ORUdPKSB7CisJCQkJbXNnaW5fc2V0X25vd2lkZShhY2IsIHNyYik7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbmFibGVfbXNnb3V0X2Fib3J0KGFjYiwgc3JiKTsKKwkJCS8qc3JiLT5zdGF0ZSB8PSBTUkJfQUJPUlRfU0VOVCAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBFWFRFTkRFRF9NRVNTQUdFOgorCQkJLyogU0RUUiAqLworCQkJaWYgKHNyYi0+bXNnaW5fYnVmWzFdID09IDMKKwkJCSAgICAmJiBzcmItPm1zZ2luX2J1ZlsyXSA9PSBFWFRFTkRFRF9TRFRSKSB7CisJCQkJbXNnaW5fc2V0X3N5bmMoYWNiLCBzcmIpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogV0RUUiAqLworCQkJaWYgKHNyYi0+bXNnaW5fYnVmWzFdID09IDIKKwkJCSAgICAmJiBzcmItPm1zZ2luX2J1ZlsyXSA9PSBFWFRFTkRFRF9XRFRSCisJCQkgICAgJiYgc3JiLT5tc2dpbl9idWZbM10gPD0gMikgeyAvKiBzYW5pdHkgY2hlY2sgLi4uICovCisJCQkJbXNnaW5fc2V0X3dpZGUoYWNiLCBzcmIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbXNnaW5fcmVqZWN0KGFjYiwgc3JiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTVNHX0lHTk9SRVdJREU6CisJCQkvKiBEaXNjYXJkICB3aWRlIHJlc2lkdWFsICovCisJCQlkcHJpbnRrZGJnKERCR18wLCAibXNnaW5fcGhhc2UwOiBJZ25vcmUgV2lkZSBSZXNpZHVhbCFcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBDT01NQU5EX0NPTVBMRVRFOgorCQkJLyogbm90aGluZyBoYXMgdG8gYmUgZG9uZSAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBTQVZFX1BPSU5URVJTOgorCQkJLyoKKwkJCSAqIFNBVkUgUE9JTlRFUiBtYXkgYmUgaWdub3JlZCBhcyB3ZSBoYXZlIHRoZSBzdHJ1Y3QKKwkJCSAqIFNjc2lSZXFCbGsqIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NzaSBjb21tYW5kLgorCQkJICovCisJCQlkcHJpbnRrZGJnKERCR18wLCAibXNnaW5fcGhhc2UwOiAocGlkIyVsaSkgIgorCQkJCSJTQVZFIFBPSU5URVIgcmVtPSVpIElnbm9yZVxuIiwKKwkJCQlzcmItPmNtZC0+cGlkLCBzcmItPnRvdGFsX3hmZXJfbGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVTVE9SRV9QT0lOVEVSUzoKKwkJCWRwcmludGtkYmcoREJHXzAsICJtc2dpbl9waGFzZTA6IFJFU1RPUkUgUE9JTlRFUi4gSWdub3JlXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUJPUlQ6CisJCQlkcHJpbnRrZGJnKERCR18wLCAibXNnaW5fcGhhc2UwOiAocGlkIyVsaSkgIgorCQkJCSI8JTAyaS0laT4gQUJPUlQgbXNnXG4iLAorCQkJCXNyYi0+Y21kLT5waWQsIGRjYi0+dGFyZ2V0X2lkLAorCQkJCWRjYi0+dGFyZ2V0X2x1bik7CisJCQlkY2ItPmZsYWcgfD0gQUJPUlRfREVWXzsKKwkJCWVuYWJsZV9tc2dvdXRfYWJvcnQoYWNiLCBzcmIpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qIHJlamVjdCB1bmtub3duIG1lc3NhZ2VzICovCisJCQlpZiAoc3JiLT5tc2dpbl9idWZbMF0gJiBJREVOVElGWV9CQVNFKSB7CisJCQkJZHByaW50a2RiZyhEQkdfMCwgIm1zZ2luX3BoYXNlMDogSWRlbnRpZnkgbXNnXG4iKTsKKwkJCQlzcmItPm1zZ19jb3VudCA9IDE7CisJCQkJc3JiLT5tc2dvdXRfYnVmWzBdID0gZGNiLT5pZGVudGlmeV9tc2c7CisJCQkJREMzOTV4X0VOQUJMRV9NU0dPVVQ7CisJCQkJc3JiLT5zdGF0ZSB8PSBTUkJfTVNHT1VUOworCQkJCS8qYnJlYWs7ICovCisJCQl9CisJCQltc2dpbl9yZWplY3QoYWNiLCBzcmIpOworCQl9CisKKwkJLyogQ2xlYXIgY291bnRlciBhbmQgTXNnSW4gc3RhdGUgKi8KKwkJc3JiLT5zdGF0ZSAmPSB+U1JCX01TR0lOOworCQlhY2ItPm1zZ19sZW4gPSAwOworCX0KKwkqcHNjc2lfc3RhdHVzID0gUEhfQlVTX0ZSRUU7CisJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19EQVRBTEFUQ0gpOwkvKiBpdCdzIGltcG9ydGFudCAuLi4geW91IGtub3chICovCisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTU1BTkQsIFNDTURfTVNHQUNDRVBUKTsKK30KKworCitzdGF0aWMgdm9pZCBtc2dpbl9waGFzZTEoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpCit7CisJZHByaW50a2RiZyhEQkdfMCwgIm1zZ2luX3BoYXNlMTogKHBpZCMlbGkpXG4iLCBzcmItPmNtZC0+cGlkKTsKKwljbGVhcl9maWZvKGFjYiwgIm1zZ2luX3BoYXNlMSIpOworCURDMzk1eF93cml0ZTMyKGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09VTlRFUiwgMSk7CisJaWYgKCEoc3JiLT5zdGF0ZSAmIFNSQl9NU0dJTikpIHsKKwkJc3JiLT5zdGF0ZSAmPSB+U1JCX0RJU0NPTk5FQ1Q7CisJCXNyYi0+c3RhdGUgfD0gU1JCX01TR0lOOworCX0KKwlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX0RBVEFMQVRDSCk7CS8qIGl0J3MgaW1wb3J0YW50IGZvciBhdG4gc3RvcCAqLworCS8qIFNDU0kgY29tbWFuZCAqLworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT01NQU5ELCBTQ01EX0ZJRk9fSU4pOworfQorCisKK3N0YXRpYyB2b2lkIG5vcDAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpCit7Cit9CisKKworc3RhdGljIHZvaWQgbm9wMShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cykKK3sKK30KKworCitzdGF0aWMgdm9pZCBzZXRfeGZlcl9yYXRlKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYikKK3sKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICppOworCisJLyogc2V0IGFsbCBsdW4gZGV2aWNlJ3MgIHBlcmlvZCwgb2Zmc2V0ICovCisJaWYgKGRjYi0+aWRlbnRpZnlfbXNnICYgMHgwNykKKwkJcmV0dXJuOworCisJaWYgKGFjYi0+c2Nhbl9kZXZpY2VzKSB7CisJCWN1cnJlbnRfc3luY19vZmZzZXQgPSBkY2ItPnN5bmNfb2Zmc2V0OworCQlyZXR1cm47CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmYWNiLT5kY2JfbGlzdCwgbGlzdCkKKwkJaWYgKGktPnRhcmdldF9pZCA9PSBkY2ItPnRhcmdldF9pZCkgeworCQkJaS0+c3luY19wZXJpb2QgPSBkY2ItPnN5bmNfcGVyaW9kOworCQkJaS0+c3luY19vZmZzZXQgPSBkY2ItPnN5bmNfb2Zmc2V0OworCQkJaS0+c3luY19tb2RlID0gZGNiLT5zeW5jX21vZGU7CisJCQlpLT5taW5fbmVnb19wZXJpb2QgPSBkY2ItPm1pbl9uZWdvX3BlcmlvZDsKKwkJfQorfQorCisKK3N0YXRpYyB2b2lkIGRpc2Nvbm5lY3Qoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYikKK3sKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IgPSBhY2ItPmFjdGl2ZV9kY2I7CisJc3RydWN0IFNjc2lSZXFCbGsgKnNyYjsKKworCWlmICghZGNiKSB7CisJCWRwcmludGtsKEtFUk5fRVJSLCAiZGlzY29ubmVjdDogTm8gc3VjaCBkZXZpY2VcbiIpOworCQl1ZGVsYXkoNTAwKTsKKwkJLyogU3VzcGVuZCBxdWV1ZSBmb3IgYSB3aGlsZSAqLworCQlhY2ItPnNjc2lfaG9zdC0+bGFzdF9yZXNldCA9CisJCSAgICBqaWZmaWVzICsgSFogLyAyICsKKwkJICAgIEhaICogYWNiLT5lZXByb20uZGVsYXlfdGltZTsKKwkJY2xlYXJfZmlmbyhhY2IsICJkaXNjb25uZWN0RXgiKTsKKwkJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19IV1JFU0VMRUNUKTsKKwkJcmV0dXJuOworCX0KKwlzcmIgPSBkY2ItPmFjdGl2ZV9zcmI7CisJYWNiLT5hY3RpdmVfZGNiID0gTlVMTDsKKwlkcHJpbnRrZGJnKERCR18wLCAiZGlzY29ubmVjdDogKHBpZCMlbGkpXG4iLCBzcmItPmNtZC0+cGlkKTsKKworCXNyYi0+c2NzaV9waGFzZSA9IFBIX0JVU19GUkVFOwkvKiBpbml0aWFsIHBoYXNlICovCisJY2xlYXJfZmlmbyhhY2IsICJkaXNjb25uZWN0Iik7CisJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19IV1JFU0VMRUNUKTsKKwlpZiAoc3JiLT5zdGF0ZSAmIFNSQl9VTkVYUEVDVF9SRVNFTCkgeworCQlkcHJpbnRrbChLRVJOX0VSUiwKKwkJCSJkaXNjb25uZWN0OiBVbmV4cGVjdGVkIHJlc2VsZWN0aW9uIDwlMDJpLSVpPlxuIiwKKwkJCWRjYi0+dGFyZ2V0X2lkLCBkY2ItPnRhcmdldF9sdW4pOworCQlzcmItPnN0YXRlID0gMDsKKwkJd2FpdGluZ19wcm9jZXNzX25leHQoYWNiKTsKKwl9IGVsc2UgaWYgKHNyYi0+c3RhdGUgJiBTUkJfQUJPUlRfU0VOVCkgeworCQlkY2ItPmZsYWcgJj0gfkFCT1JUX0RFVl87CisJCWFjYi0+c2NzaV9ob3N0LT5sYXN0X3Jlc2V0ID0gamlmZmllcyArIEhaIC8gMiArIDE7CisJCWRwcmludGtsKEtFUk5fRVJSLCAiZGlzY29ubmVjdDogU1JCX0FCT1JUX1NFTlRcbiIpOworCQlkb2luZ19zcmJfZG9uZShhY2IsIERJRF9BQk9SVCwgc3JiLT5jbWQsIDEpOworCQl3YWl0aW5nX3Byb2Nlc3NfbmV4dChhY2IpOworCX0gZWxzZSB7CisJCWlmICgoc3JiLT5zdGF0ZSAmIChTUkJfU1RBUlRfICsgU1JCX01TR09VVCkpCisJCSAgICB8fCAhKHNyYi0+CisJCQkgc3RhdGUgJiAoU1JCX0RJU0NPTk5FQ1QgKyBTUkJfQ09NUExFVEVEKSkpIHsKKwkJCS8qCisJCQkgKiBTZWxlY3Rpb24gdGltZSBvdXQgCisJCQkgKiBTUkJfU1RBUlRfIHx8IFNSQl9NU0dPVVQgfHwgKCFTUkJfRElTQ09OTkVDVCAmJiAhU1JCX0NPTVBMRVRFRCkKKwkJCSAqLworCQkJLyogVW5leHAuIERpc2MgLyBTZWwgVGltZW91dCAqLworCQkJaWYgKHNyYi0+c3RhdGUgIT0gU1JCX1NUQVJUXworCQkJICAgICYmIHNyYi0+c3RhdGUgIT0gU1JCX01TR09VVCkgeworCQkJCXNyYi0+c3RhdGUgPSBTUkJfUkVBRFk7CisJCQkJZHByaW50a2woS0VSTl9ERUJVRywKKwkJCQkJImRpc2Nvbm5lY3Q6IChwaWQjJWxpKSBVbmV4cGVjdGVkXG4iLAorCQkJCQlzcmItPmNtZC0+cGlkKTsKKwkJCQlzcmItPnRhcmdldF9zdGF0dXMgPSBTQ1NJX1NUQVRfU0VMX1RJTUVPVVQ7CisJCQkJZ290byBkaXNjMTsKKwkJCX0gZWxzZSB7CisJCQkJLyogTm9ybWFsIHNlbGVjdGlvbiB0aW1lb3V0ICovCisJCQkJZHByaW50a2RiZyhEQkdfS0csICJkaXNjb25uZWN0OiAocGlkIyVsaSkgIgorCQkJCQkiPCUwMmktJWk+IFNlbFRPXG4iLCBzcmItPmNtZC0+cGlkLAorCQkJCQlkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuKTsKKwkJCQlpZiAoc3JiLT5yZXRyeV9jb3VudCsrID4gREMzOTV4X01BWF9SRVRSSUVTCisJCQkJICAgIHx8IGFjYi0+c2Nhbl9kZXZpY2VzKSB7CisJCQkJCXNyYi0+dGFyZ2V0X3N0YXR1cyA9CisJCQkJCSAgICBTQ1NJX1NUQVRfU0VMX1RJTUVPVVQ7CisJCQkJCWdvdG8gZGlzYzE7CisJCQkJfQorCQkJCWZyZWVfdGFnKGRjYiwgc3JiKTsKKwkJCQlzcmJfZ29pbmdfdG9fd2FpdGluZ19tb3ZlKGRjYiwgc3JiKTsKKwkJCQlkcHJpbnRrZGJnKERCR19LRywKKwkJCQkJImRpc2Nvbm5lY3Q6IChwaWQjJWxpKSBSZXRyeVxuIiwKKwkJCQkJc3JiLT5jbWQtPnBpZCk7CisJCQkJd2FpdGluZ19zZXRfdGltZXIoYWNiLCBIWiAvIDIwKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzcmItPnN0YXRlICYgU1JCX0RJU0NPTk5FQ1QpIHsKKwkJCXU4IGJ2YWwgPSBEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9TSUdOQUwpOworCQkJLyoKKwkJCSAqIFNSQl9ESVNDT05ORUNUIChUaGlzIGlzIHdoYXQgd2UgZXhwZWN0ISkKKwkJCSAqLworCQkJaWYgKGJ2YWwgJiAweDQwKSB7CisJCQkJZHByaW50a2RiZyhEQkdfMCwgImRpc2Nvbm5lY3Q6IFNDU0kgYnVzIHN0YXQgIgorCQkJCQkiIDB4JTAyeDogQUNLIHNldCEgT3RoZXIgY29udHJvbGxlcnM/XG4iLAorCQkJCQlidmFsKTsKKwkJCQkvKiBJdCBjb3VsZCBjb21lIGZyb20gYW5vdGhlciBpbml0aWF0b3IsIHRoZXJlZm9yZSBkb24ndCBkbyBtdWNoICEgKi8KKwkJCX0gZWxzZQorCQkJCXdhaXRpbmdfcHJvY2Vzc19uZXh0KGFjYik7CisJCX0gZWxzZSBpZiAoc3JiLT5zdGF0ZSAmIFNSQl9DT01QTEVURUQpIHsKKwkJICAgICAgZGlzYzE6CisJCQkvKgorCQkJICoqIFNSQl9DT01QTEVURUQKKwkJCSAqLworCQkJZnJlZV90YWcoZGNiLCBzcmIpOworCQkJZGNiLT5hY3RpdmVfc3JiID0gTlVMTDsKKwkJCXNyYi0+c3RhdGUgPSBTUkJfRlJFRTsKKwkJCXNyYl9kb25lKGFjYiwgZGNiLCBzcmIpOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHJlc2VsZWN0KHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IpCit7CisJc3RydWN0IERldmljZUN0bEJsayAqZGNiID0gYWNiLT5hY3RpdmVfZGNiOworCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIgPSBOVUxMOworCXUxNiByc2VsX3Rhcl9sdW5faWQ7CisJdTggaWQsIGx1bjsKKwl1OCBhcmJsb3N0ZmxhZyA9IDA7CisJZHByaW50a2RiZyhEQkdfMCwgInJlc2VsZWN0OiBhY2I9JXBcbiIsIGFjYik7CisKKwljbGVhcl9maWZvKGFjYiwgInJlc2VsZWN0Iik7CisJLypEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX0hXUkVTRUxFQ1QgfCBET19EQVRBTEFUQ0gpOyAqLworCS8qIFJlYWQgUmVzZWxlY3RlZCBUYXJnZXQgSUQgYW5kIExVTiAqLworCXJzZWxfdGFyX2x1bl9pZCA9IERDMzk1eF9yZWFkMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9UQVJHRVRJRCk7CisJaWYgKGRjYikgewkJLyogQXJiaXRyYXRpb24gbG9zdCBidXQgUmVzZWxlY3Rpb24gd2luICovCisJCXNyYiA9IGRjYi0+YWN0aXZlX3NyYjsKKwkJaWYgKCFzcmIpIHsKKwkJCWRwcmludGtsKEtFUk5fREVCVUcsICJyZXNlbGVjdDogQXJiIGxvc3QgUmVzZWwgd29uLCAiCisJCQkJImJ1dCBhY3RpdmVfc3JiID09IE5VTExcbiIpOworCQkJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19EQVRBTEFUQ0gpOwkvKiBpdCdzIGltcG9ydGFudCBmb3IgYXRuIHN0b3AgKi8KKwkJCXJldHVybjsKKwkJfQorCQkvKiBXaHkgdGhlIGlmID8gKi8KKwkJaWYgKCFhY2ItPnNjYW5fZGV2aWNlcykgeworCQkJZHByaW50a2RiZyhEQkdfS0csICJyZXNlbGVjdDogKHBpZCMlbGkpIDwlMDJpLSVpPiAiCisJCQkJIkFyYiBsb3N0IGJ1dCBSZXNlbCB3aW4gcnNlbD0laSBzdGF0PTB4JTA0eFxuIiwKKwkJCQlzcmItPmNtZC0+cGlkLCBkY2ItPnRhcmdldF9pZCwKKwkJCQlkY2ItPnRhcmdldF9sdW4sIHJzZWxfdGFyX2x1bl9pZCwKKwkJCQlEQzM5NXhfcmVhZDE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfU1RBVFVTKSk7CisJCQlhcmJsb3N0ZmxhZyA9IDE7CisJCQkvKnNyYi0+c3RhdGUgfD0gU1JCX0RJU0NPTk5FQ1Q7ICovCisKKwkJCXNyYi0+c3RhdGUgPSBTUkJfUkVBRFk7CisJCQlmcmVlX3RhZyhkY2IsIHNyYik7CisJCQlzcmJfZ29pbmdfdG9fd2FpdGluZ19tb3ZlKGRjYiwgc3JiKTsKKwkJCXdhaXRpbmdfc2V0X3RpbWVyKGFjYiwgSFogLyAyMCk7CisKKwkJCS8qIHJldHVybjsgKi8KKwkJfQorCX0KKwkvKiBSZWFkIFJlc2VsZWN0ZWQgVGFyZ2V0IElkIGFuZCBMVU4gKi8KKwlpZiAoIShyc2VsX3Rhcl9sdW5faWQgJiAoSURFTlRJRllfQkFTRSA8PCA4KSkpCisJCWRwcmludGtsKEtFUk5fREVCVUcsICJyZXNlbGVjdDogRXhwZWN0cyBpZGVudGlmeSBtc2cuICIKKwkJCSJHb3QgJWkhXG4iLCByc2VsX3Rhcl9sdW5faWQpOworCWlkID0gcnNlbF90YXJfbHVuX2lkICYgMHhmZjsKKwlsdW4gPSAocnNlbF90YXJfbHVuX2lkID4+IDgpICYgNzsKKwlkY2IgPSBmaW5kX2RjYihhY2IsIGlkLCBsdW4pOworCWlmICghZGNiKSB7CisJCWRwcmludGtsKEtFUk5fRVJSLCAicmVzZWxlY3Q6IEZyb20gbm9uIGV4aXN0ZW50IGRldmljZSAiCisJCQkiPCUwMmktJWk+XG4iLCBpZCwgbHVuKTsKKwkJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19EQVRBTEFUQ0gpOwkvKiBpdCdzIGltcG9ydGFudCBmb3IgYXRuIHN0b3AgKi8KKwkJcmV0dXJuOworCX0KKwlhY2ItPmFjdGl2ZV9kY2IgPSBkY2I7CisKKwlpZiAoIShkY2ItPmRldl9tb2RlICYgTlRDX0RPX0RJU0NPTk5FQ1QpKQorCQlkcHJpbnRrbChLRVJOX0RFQlVHLCAicmVzZWxlY3Q6IGluIHNwaXRlIG9mIGZvcmJpZGRlbiAiCisJCQkiZGlzY29ubmVjdGlvbj8gPCUwMmktJWk+XG4iLAorCQkJZGNiLT50YXJnZXRfaWQsIGRjYi0+dGFyZ2V0X2x1bik7CisKKwlpZiAoZGNiLT5zeW5jX21vZGUgJiBFTl9UQUdfUVVFVUVJTkcgLyomJiAhYXJibG9zdGZsYWcgKi8pIHsKKwkJc3JiID0gYWNiLT50bXBfc3JiOworCQlkY2ItPmFjdGl2ZV9zcmIgPSBzcmI7CisJfSBlbHNlIHsKKwkJLyogVGhlcmUgY2FuIGJlIG9ubHkgb25lISAqLworCQlzcmIgPSBkY2ItPmFjdGl2ZV9zcmI7CisJCWlmICghc3JiIHx8ICEoc3JiLT5zdGF0ZSAmIFNSQl9ESVNDT05ORUNUKSkgeworCQkJLyoKKwkJCSAqIGFib3J0IGNvbW1hbmQKKwkJCSAqLworCQkJZHByaW50a2woS0VSTl9ERUJVRywKKwkJCQkicmVzZWxlY3Q6IHcvbyBkaXNjb25uZWN0ZWQgY21kcyA8JTAyaS0laT5cbiIsCisJCQkJZGNiLT50YXJnZXRfaWQsIGRjYi0+dGFyZ2V0X2x1bik7CisJCQlzcmIgPSBhY2ItPnRtcF9zcmI7CisJCQlzcmItPnN0YXRlID0gU1JCX1VORVhQRUNUX1JFU0VMOworCQkJZGNiLT5hY3RpdmVfc3JiID0gc3JiOworCQkJZW5hYmxlX21zZ291dF9hYm9ydChhY2IsIHNyYik7CisJCX0gZWxzZSB7CisJCQlpZiAoZGNiLT5mbGFnICYgQUJPUlRfREVWXykgeworCQkJCS8qc3JiLT5zdGF0ZSA9IFNSQl9BQk9SVF9TRU5UOyAqLworCQkJCWVuYWJsZV9tc2dvdXRfYWJvcnQoYWNiLCBzcmIpOworCQkJfSBlbHNlCisJCQkJc3JiLT5zdGF0ZSA9IFNSQl9EQVRBX1hGRVI7CisKKwkJfQorCX0KKwlzcmItPnNjc2lfcGhhc2UgPSBQSF9CVVNfRlJFRTsJLyogaW5pdGlhbCBwaGFzZSAqLworCisJLyogUHJvZ3JhbSBIQSBJRCwgdGFyZ2V0IElELCBwZXJpb2QgYW5kIG9mZnNldCAqLworCWRwcmludGtkYmcoREJHXzAsICJyZXNlbGVjdDogc2VsZWN0IDwlaT5cbiIsIGRjYi0+dGFyZ2V0X2lkKTsKKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfSE9TVElELCBhY2ItPnNjc2lfaG9zdC0+dGhpc19pZCk7CS8qIGhvc3QgICBJRCAqLworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9UQVJHRVRJRCwgZGNiLT50YXJnZXRfaWQpOwkJLyogdGFyZ2V0IElEICovCisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX09GRlNFVCwgZGNiLT5zeW5jX29mZnNldCk7CQkvKiBvZmZzZXQgICAgKi8KKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfU1lOQywgZGNiLT5zeW5jX3BlcmlvZCk7CQkvKiBzeW5jIHBlcmlvZCwgd2lkZSAqLworCURDMzk1eF93cml0ZTE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09OVFJPTCwgRE9fREFUQUxBVENIKTsJCS8qIGl0J3MgaW1wb3J0YW50IGZvciBhdG4gc3RvcCAqLworCS8qIFNDU0kgY29tbWFuZCAqLworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT01NQU5ELCBTQ01EX01TR0FDQ0VQVCk7Cit9CisKKworc3RhdGljIGlubGluZSB1OCB0YWdxX2JsYWNrbGlzdChjaGFyICpuYW1lKQoreworI2lmbmRlZiBEQzM5NXhfTk9fVEFHUQorI2lmIDAKKwl1OCBpOworCWZvciAoaSA9IDA7IGkgPCBCQURERVZDTlQ7IGkrKykKKwkJaWYgKG1lbWNtcChuYW1lLCBEQzM5NXhfYmFkZGV2bmFtZTFbaV0sIDI4KSA9PSAwKQorCQkJcmV0dXJuIDE7CisjZW5kaWYKKwlyZXR1cm4gMDsKKyNlbHNlCisJcmV0dXJuIDE7CisjZW5kaWYKK30KKworCitzdGF0aWMgdm9pZCBkaXNjX3RhZ3Ffc2V0KHN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiwgc3RydWN0IFNjc2lJbnFEYXRhICpwdHIpCit7CisJLyogQ2hlY2sgZm9yIFNDU0kgZm9ybWF0IChBTlNJIGFuZCBSZXNwb25zZSBkYXRhIGZvcm1hdCkgKi8KKwlpZiAoKHB0ci0+VmVycyAmIDB4MDcpID49IDIgfHwgKHB0ci0+UkRGICYgMHgwRikgPT0gMikgeworCQlpZiAoKHB0ci0+RmxhZ3MgJiBTQ1NJX0lOUV9DTURRVUVVRSkKKwkJICAgICYmIChkY2ItPmRldl9tb2RlICYgTlRDX0RPX1RBR19RVUVVRUlORykgJiYKKwkJICAgIC8qKGRjYi0+ZGV2X21vZGUgJiBOVENfRE9fRElTQ09OTkVDVCkgKi8KKwkJICAgIC8qICgoZGNiLT5kZXZfdHlwZSA9PSBUWVBFX0RJU0spIAorCQkgICAgICAgfHwgKGRjYi0+ZGV2X3R5cGUgPT0gVFlQRV9NT0QpKSAmJiAqLworCQkgICAgIXRhZ3FfYmxhY2tsaXN0KCgoY2hhciAqKXB0cikgKyA4KSkgeworCQkJaWYgKGRjYi0+bWF4X2NvbW1hbmQgPT0gMSkKKwkJCQlkY2ItPm1heF9jb21tYW5kID0KKwkJCQkgICAgZGNiLT5hY2ItPnRhZ19tYXhfbnVtOworCQkJZGNiLT5zeW5jX21vZGUgfD0gRU5fVEFHX1FVRVVFSU5HOworCQkJLypkY2ItPnRhZ19tYXNrID0gMDsgKi8KKwkJfSBlbHNlCisJCQlkY2ItPm1heF9jb21tYW5kID0gMTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgYWRkX2RldihzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IsCisJCXN0cnVjdCBTY3NpSW5xRGF0YSAqcHRyKQoreworCXU4IGJ2YWwxID0gcHRyLT5EZXZUeXBlICYgU0NTSV9ERVZUWVBFOworCWRjYi0+ZGV2X3R5cGUgPSBidmFsMTsKKwkvKiBpZiAoYnZhbDEgPT0gVFlQRV9ESVNLIHx8IGJ2YWwxID09IFRZUEVfTU9EKSAqLworCWRpc2NfdGFncV9zZXQoZGNiLCBwdHIpOworfQorCisKKy8qIHVubWFwIG1hcHBlZCBwY2kgcmVnaW9ucyBmcm9tIFNSQiAqLworc3RhdGljIHZvaWQgcGNpX3VubWFwX3NyYihzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHNyYi0+Y21kOworCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciA9IGNtZC0+c2NfZGF0YV9kaXJlY3Rpb247CisJaWYgKGNtZC0+dXNlX3NnICYmIGRpciAhPSBQQ0lfRE1BX05PTkUpIHsKKwkJaW50IGk7CisJCS8qIHVubWFwIERDMzk1eCBTRyBsaXN0ICovCisJCWRwcmludGtkYmcoREJHX1NHLCAicGNpX3VubWFwX3NyYjogbGlzdD0lMDh4KCUwNXgpXG4iLAorCQkJc3JiLT5zZ19idXNfYWRkciwgU0VHTUVOVFhfTEVOKTsKKwkJcGNpX3VubWFwX3NpbmdsZShhY2ItPmRldiwgc3JiLT5zZ19idXNfYWRkciwKKwkJCQkgU0VHTUVOVFhfTEVOLAorCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZHByaW50a2RiZyhEQkdfU0csICJwY2lfdW5tYXBfc3JiOiBzZWdzPSVpIGJ1ZmZlcj0lcFxuIiwKKwkJCWNtZC0+dXNlX3NnLCBjbWQtPnJlcXVlc3RfYnVmZmVyKTsKKwkJLyogdW5tYXAgdGhlIHNnIHNlZ21lbnRzICovCisJCWZvciAoaSA9IDA7IGkgPCBzcmItPnNnX2NvdW50OyBpKyspCisJCQlrdW5tYXAodmlydF90b19wYWdlKHNyYi0+dmlydF9tYXBbaV0pKTsKKwkJcGNpX3VubWFwX3NnKGFjYi0+ZGV2LAorCQkJICAgICAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCSAgICAgY21kLT51c2Vfc2csIGRpcik7CisJfSBlbHNlIGlmIChjbWQtPnJlcXVlc3RfYnVmZmVyICYmIGRpciAhPSBQQ0lfRE1BX05PTkUpIHsKKwkJZHByaW50a2RiZyhEQkdfU0csICJwY2lfdW5tYXBfc3JiOiBidWZmZXI9JTA4eCglMDV4KVxuIiwKKwkJCXNyYi0+c2VnbWVudF94WzBdLmFkZHJlc3MsIGNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwkJcGNpX3VubWFwX3NpbmdsZShhY2ItPmRldiwgc3JiLT5zZWdtZW50X3hbMF0uYWRkcmVzcywKKwkJCQkgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sIGRpcik7CisJfQorfQorCisKKy8qIHVubWFwIG1hcHBlZCBwY2kgc2Vuc2UgYnVmZmVyIGZyb20gU1JCICovCitzdGF0aWMgdm9pZCBwY2lfdW5tYXBfc3JiX3NlbnNlKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsCisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIpCit7CisJaWYgKCEoc3JiLT5mbGFnICYgQVVUT19SRVFTRU5TRSkpCisJCXJldHVybjsKKwkvKiBVbm1hcCBzZW5zZSBidWZmZXIgKi8KKwlkcHJpbnRrZGJnKERCR19TRywgInBjaV91bm1hcF9zcmJfc2Vuc2U6IGJ1ZmZlcj0lMDh4XG4iLAorCSAgICAgICBzcmItPnNlZ21lbnRfeFswXS5hZGRyZXNzKTsKKwlwY2lfdW5tYXBfc2luZ2xlKGFjYi0+ZGV2LCBzcmItPnNlZ21lbnRfeFswXS5hZGRyZXNzLAorCQkJIHNyYi0+c2VnbWVudF94WzBdLmxlbmd0aCwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkvKiBSZXN0b3JlIFNHIHN0dWZmICovCisJc3JiLT50b3RhbF94ZmVyX2xlbmd0aCA9IHNyYi0+eGZlcnJlZDsKKwlzcmItPnNlZ21lbnRfeFswXS5hZGRyZXNzID0KKwkgICAgc3JiLT5zZWdtZW50X3hbREMzOTV4X01BWF9TR19MSVNURU5UUlkgLSAxXS5hZGRyZXNzOworCXNyYi0+c2VnbWVudF94WzBdLmxlbmd0aCA9CisJICAgIHNyYi0+c2VnbWVudF94W0RDMzk1eF9NQVhfU0dfTElTVEVOVFJZIC0gMV0ubGVuZ3RoOworfQorCisKKy8qCisgKiBDb21wbGV0ZSBleGVjdXRpb24gb2YgYSBTQ1NJIGNvbW1hbmQKKyAqIFNpZ25hbCBjb21wbGV0aW9uIHRvIHRoZSBnZW5lcmljIFNDU0kgZHJpdmVyICAKKyAqLworc3RhdGljIHZvaWQgc3JiX2RvbmUoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IERldmljZUN0bEJsayAqZGNiLAorCQlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKQoreworCXU4IHRlbXBjbnQsIHN0YXR1czsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBzcmItPmNtZDsKKwlzdHJ1Y3QgU2NzaUlucURhdGEgKnB0cjsKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIgPSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uOworCisJaWYgKGNtZC0+dXNlX3NnKSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCogc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJcHRyID0gKHN0cnVjdCBTY3NpSW5xRGF0YSAqKShzcmItPnZpcnRfbWFwWzBdICsgc2ctPm9mZnNldCk7CisJfSBlbHNlIHsKKwkJcHRyID0gKHN0cnVjdCBTY3NpSW5xRGF0YSAqKShjbWQtPnJlcXVlc3RfYnVmZmVyKTsKKwl9CisKKwlkcHJpbnRrZGJnKERCR18xLCAic3JiX2RvbmU6IChwaWQjJWxpKSA8JTAyaS0laT5cbiIsIHNyYi0+Y21kLT5waWQsCisJCXNyYi0+Y21kLT5kZXZpY2UtPmlkLCBzcmItPmNtZC0+ZGV2aWNlLT5sdW4pOworCWRwcmludGtkYmcoREJHX1NHLCAic3JiX2RvbmU6IHNyYj0lcCBzZz0laSglaS8laSkgYnVmPSVwIGFkZHI9JXBcbiIsCisJCXNyYiwgY21kLT51c2Vfc2csIHNyYi0+c2dfaW5kZXgsIHNyYi0+c2dfY291bnQsCisJCWNtZC0+cmVxdWVzdF9idWZmZXIsIHB0cik7CisJc3RhdHVzID0gc3JiLT50YXJnZXRfc3RhdHVzOworCWlmIChzcmItPmZsYWcgJiBBVVRPX1JFUVNFTlNFKSB7CisJCWRwcmludGtkYmcoREJHXzAsICJzcmJfZG9uZTogQVVUT19SRVFTRU5TRTFcbiIpOworCQlwY2lfdW5tYXBfc3JiX3NlbnNlKGFjYiwgc3JiKTsKKwkJLyoKKwkJICoqIHRhcmdldCBzdGF0dXMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCQkgKi8KKwkJc3JiLT5mbGFnICY9IH5BVVRPX1JFUVNFTlNFOworCQlzcmItPmFkYXB0ZXJfc3RhdHVzID0gMDsKKwkJc3JiLT50YXJnZXRfc3RhdHVzID0gQ0hFQ0tfQ09ORElUSU9OIDw8IDE7CisJCWlmIChkZWJ1Z19lbmFibGVkKERCR18xKSkgeworCQkJc3dpdGNoIChjbWQtPnNlbnNlX2J1ZmZlclsyXSAmIDB4MGYpIHsKKwkJCWNhc2UgTk9UX1JFQURZOgorCQkJCWRwcmludGtsKEtFUk5fREVCVUcsCisJCQkJICAgICAiUmVxU2Vuc2U6IE5PVF9SRUFEWSBjbW5kPTB4JTAyeCA8JTAyaS0laT4gc3RhdD0laSBzY2FuPSVpICIsCisJCQkJICAgICBjbWQtPmNtbmRbMF0sIGRjYi0+dGFyZ2V0X2lkLAorCQkJCSAgICAgZGNiLT50YXJnZXRfbHVuLCBzdGF0dXMsIGFjYi0+c2Nhbl9kZXZpY2VzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVU5JVF9BVFRFTlRJT046CisJCQkJZHByaW50a2woS0VSTl9ERUJVRywKKwkJCQkgICAgICJSZXFTZW5zZTogVU5JVF9BVFRFTlRJT04gY21uZD0weCUwMnggPCUwMmktJWk+IHN0YXQ9JWkgc2Nhbj0laSAiLAorCQkJCSAgICAgY21kLT5jbW5kWzBdLCBkY2ItPnRhcmdldF9pZCwKKwkJCQkgICAgIGRjYi0+dGFyZ2V0X2x1biwgc3RhdHVzLCBhY2ItPnNjYW5fZGV2aWNlcyk7CisJCQkJYnJlYWs7CisJCQljYXNlIElMTEVHQUxfUkVRVUVTVDoKKwkJCQlkcHJpbnRrbChLRVJOX0RFQlVHLAorCQkJCSAgICAgIlJlcVNlbnNlOiBJTExFR0FMX1JFUVVFU1QgY21uZD0weCUwMnggPCUwMmktJWk+IHN0YXQ9JWkgc2Nhbj0laSAiLAorCQkJCSAgICAgY21kLT5jbW5kWzBdLCBkY2ItPnRhcmdldF9pZCwKKwkJCQkgICAgIGRjYi0+dGFyZ2V0X2x1biwgc3RhdHVzLCBhY2ItPnNjYW5fZGV2aWNlcyk7CisJCQkJYnJlYWs7CisJCQljYXNlIE1FRElVTV9FUlJPUjoKKwkJCQlkcHJpbnRrbChLRVJOX0RFQlVHLAorCQkJCSAgICAgIlJlcVNlbnNlOiBNRURJVU1fRVJST1IgY21uZD0weCUwMnggPCUwMmktJWk+IHN0YXQ9JWkgc2Nhbj0laSAiLAorCQkJCSAgICAgY21kLT5jbW5kWzBdLCBkY2ItPnRhcmdldF9pZCwKKwkJCQkgICAgIGRjYi0+dGFyZ2V0X2x1biwgc3RhdHVzLCBhY2ItPnNjYW5fZGV2aWNlcyk7CisJCQkJYnJlYWs7CisJCQljYXNlIEhBUkRXQVJFX0VSUk9SOgorCQkJCWRwcmludGtsKEtFUk5fREVCVUcsCisJCQkJICAgICAiUmVxU2Vuc2U6IEhBUkRXQVJFX0VSUk9SIGNtbmQ9MHglMDJ4IDwlMDJpLSVpPiBzdGF0PSVpIHNjYW49JWkgIiwKKwkJCQkgICAgIGNtZC0+Y21uZFswXSwgZGNiLT50YXJnZXRfaWQsCisJCQkJICAgICBkY2ItPnRhcmdldF9sdW4sIHN0YXR1cywgYWNiLT5zY2FuX2RldmljZXMpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGNtZC0+c2Vuc2VfYnVmZmVyWzddID49IDYpCisJCQkJcHJpbnRrKCJzZW5zZT0weCUwMnggQVNDPTB4JTAyeCBBU0NRPTB4JTAyeCAiCisJCQkJCSIoMHglMDh4IDB4JTA4eClcbiIsCisJCQkJCWNtZC0+c2Vuc2VfYnVmZmVyWzJdLCBjbWQtPnNlbnNlX2J1ZmZlclsxMl0sCisJCQkJCWNtZC0+c2Vuc2VfYnVmZmVyWzEzXSwKKwkJCQkJKigodW5zaWduZWQgaW50ICopKGNtZC0+c2Vuc2VfYnVmZmVyICsgMykpLAorCQkJCQkqKCh1bnNpZ25lZCBpbnQgKikoY21kLT5zZW5zZV9idWZmZXIgKyA4KSkpOworCQkJZWxzZQorCQkJCXByaW50aygic2Vuc2U9MHglMDJ4IE5vIEFTQy9BU0NRICgweCUwOHgpXG4iLAorCQkJCQljbWQtPnNlbnNlX2J1ZmZlclsyXSwKKwkJCQkJKigodW5zaWduZWQgaW50ICopKGNtZC0+c2Vuc2VfYnVmZmVyICsgMykpKTsKKwkJfQorCisJCWlmIChzdGF0dXMgPT0gKENIRUNLX0NPTkRJVElPTiA8PCAxKSkgeworCQkJY21kLT5yZXN1bHQgPSBESURfQkFEX1RBUkdFVCA8PCAxNjsKKwkJCWdvdG8gY2tjX2U7CisJCX0KKwkJZHByaW50a2RiZyhEQkdfMCwgInNyYl9kb25lOiBBVVRPX1JFUVNFTlNFMlxuIik7CisKKwkJaWYgKHNyYi0+dG90YWxfeGZlcl9sZW5ndGgKKwkJICAgICYmIHNyYi0+dG90YWxfeGZlcl9sZW5ndGggPj0gY21kLT51bmRlcmZsb3cpCisJCQljbWQtPnJlc3VsdCA9CisJCQkgICAgTUtfUkVTX0xOWChEUklWRVJfU0VOU0UsIERJRF9PSywKKwkJCQkgICAgICAgc3JiLT5lbmRfbWVzc2FnZSwgQ0hFQ0tfQ09ORElUSU9OKTsKKwkJLypTRVRfUkVTX0RJRChjbWQtPnJlc3VsdCxESURfT0spICovCisJCWVsc2UKKwkJCWNtZC0+cmVzdWx0ID0KKwkJCSAgICBNS19SRVNfTE5YKERSSVZFUl9TRU5TRSwgRElEX09LLAorCQkJCSAgICAgICBzcmItPmVuZF9tZXNzYWdlLCBDSEVDS19DT05ESVRJT04pOworCisJCWdvdG8gY2tjX2U7CisJfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlpZiAoc3RhdHVzKSB7CisJCS8qCisJCSAqIHRhcmdldCBzdGF0dXMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCQkgKi8KKwkJaWYgKHN0YXR1c19ieXRlKHN0YXR1cykgPT0gQ0hFQ0tfQ09ORElUSU9OKSB7CisJCQlyZXF1ZXN0X3NlbnNlKGFjYiwgZGNiLCBzcmIpOworCQkJcmV0dXJuOworCQl9IGVsc2UgaWYgKHN0YXR1c19ieXRlKHN0YXR1cykgPT0gUVVFVUVfRlVMTCkgeworCQkJdGVtcGNudCA9ICh1OClsaXN0X3NpemUoJmRjYi0+c3JiX2dvaW5nX2xpc3QpOworCQkJZHByaW50a2woS0VSTl9JTkZPLCAiUVVFVUVfRlVMTCBmb3IgZGV2IDwlMDJpLSVpPiB3aXRoICVpIGNtbmRzXG4iLAorCQkJICAgICBkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuLCB0ZW1wY250KTsKKwkJCWlmICh0ZW1wY250ID4gMSkKKwkJCQl0ZW1wY250LS07CisJCQlkY2ItPm1heF9jb21tYW5kID0gdGVtcGNudDsKKwkJCWZyZWVfdGFnKGRjYiwgc3JiKTsKKwkJCXNyYl9nb2luZ190b193YWl0aW5nX21vdmUoZGNiLCBzcmIpOworCQkJd2FpdGluZ19zZXRfdGltZXIoYWNiLCBIWiAvIDIwKTsKKwkJCXNyYi0+YWRhcHRlcl9zdGF0dXMgPSAwOworCQkJc3JiLT50YXJnZXRfc3RhdHVzID0gMDsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChzdGF0dXMgPT0gU0NTSV9TVEFUX1NFTF9USU1FT1VUKSB7CisJCQlzcmItPmFkYXB0ZXJfc3RhdHVzID0gSF9TRUxfVElNRU9VVDsKKwkJCXNyYi0+dGFyZ2V0X3N0YXR1cyA9IDA7CisJCQljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQl9IGVsc2UgeworCQkJc3JiLT5hZGFwdGVyX3N0YXR1cyA9IDA7CisJCQlTRVRfUkVTX0RJRChjbWQtPnJlc3VsdCwgRElEX0VSUk9SKTsKKwkJCVNFVF9SRVNfTVNHKGNtZC0+cmVzdWx0LCBzcmItPmVuZF9tZXNzYWdlKTsKKwkJCVNFVF9SRVNfVEFSR0VUKGNtZC0+cmVzdWx0LCBzdGF0dXMpOworCisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiogcHJvY2VzcyBpbml0aWF0b3Igc3RhdHVzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKwkJICovCisJCXN0YXR1cyA9IHNyYi0+YWRhcHRlcl9zdGF0dXM7CisJCWlmIChzdGF0dXMgJiBIX09WRVJfVU5ERVJfUlVOKSB7CisJCQlzcmItPnRhcmdldF9zdGF0dXMgPSAwOworCQkJU0VUX1JFU19ESUQoY21kLT5yZXN1bHQsIERJRF9PSyk7CisJCQlTRVRfUkVTX01TRyhjbWQtPnJlc3VsdCwgc3JiLT5lbmRfbWVzc2FnZSk7CisJCX0gZWxzZSBpZiAoc3JiLT5zdGF0dXMgJiBQQVJJVFlfRVJST1IpIHsKKwkJCVNFVF9SRVNfRElEKGNtZC0+cmVzdWx0LCBESURfUEFSSVRZKTsKKwkJCVNFVF9SRVNfTVNHKGNtZC0+cmVzdWx0LCBzcmItPmVuZF9tZXNzYWdlKTsKKwkJfSBlbHNlIHsJLyogTm8gZXJyb3IgKi8KKworCQkJc3JiLT5hZGFwdGVyX3N0YXR1cyA9IDA7CisJCQlzcmItPnRhcmdldF9zdGF0dXMgPSAwOworCQkJU0VUX1JFU19ESUQoY21kLT5yZXN1bHQsIERJRF9PSyk7CisJCX0KKwl9CisKKwlpZiAoZGlyICE9IFBDSV9ETUFfTk9ORSkgeworCQlpZiAoY21kLT51c2Vfc2cpCisJCQlwY2lfZG1hX3N5bmNfc2dfZm9yX2NwdShhY2ItPmRldiwKKwkJCQkJKHN0cnVjdCBzY2F0dGVybGlzdCAqKWNtZC0+CisJCQkJCXJlcXVlc3RfYnVmZmVyLCBjbWQtPnVzZV9zZywgZGlyKTsKKwkJZWxzZSBpZiAoY21kLT5yZXF1ZXN0X2J1ZmZlcikKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShhY2ItPmRldiwKKwkJCQkJICAgIHNyYi0+c2VnbWVudF94WzBdLmFkZHJlc3MsCisJCQkJCSAgICBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgZGlyKTsKKwl9CisKKwlpZiAoKGNtZC0+cmVzdWx0ICYgUkVTX0RJRCkgPT0gMCAmJiBjbWQtPmNtbmRbMF0gPT0gSU5RVUlSWQorCSAgICAmJiBjbWQtPmNtbmRbMl0gPT0gMCAmJiBjbWQtPnJlcXVlc3RfYnVmZmxlbiA+PSA4CisJICAgICYmIGRpciAhPSBQQ0lfRE1BX05PTkUgJiYgcHRyICYmIChwdHItPlZlcnMgJiAweDA3KSA+PSAyKQorCQlkY2ItPmlucXVpcnk3ID0gcHRyLT5GbGFnczsKKy8qIENoZWNrIEVycm9yIENvbmRpdGlvbnMgKi8KKyAgICAgIGNrY19lOgorCisJLyppZiggc3JiLT5jbWQtPmNtbmRbMF0gPT0gSU5RVUlSWSAmJiAqLworCS8qICAoaG9zdF9ieXRlKGNtZC0+cmVzdWx0KSA9PSBESURfT0sgfHwgc3RhdHVzX2J5dGUoY21kLT5yZXN1bHQpICYgQ0hFQ0tfQ09ORElUSU9OKSApICovCisJaWYgKGNtZC0+Y21uZFswXSA9PSBJTlFVSVJZICYmIChjbWQtPnJlc3VsdCA9PSAoRElEX09LIDw8IDE2KQorCQkJCQkgfHwgc3RhdHVzX2J5dGUoY21kLT4KKwkJCQkJCQlyZXN1bHQpICYKKwkJCQkJIENIRUNLX0NPTkRJVElPTikpIHsKKworCQlpZiAoIWRjYi0+aW5pdF90Y3FfZmxhZykgeworCQkJYWRkX2RldihhY2IsIGRjYiwgcHRyKTsKKwkJCWRjYi0+aW5pdF90Y3FfZmxhZyA9IDE7CisJCX0KKworCX0KKworCisJLyogSGVyZSBpcyB0aGUgaW5mbyBmb3IgRG91ZyBHaWxiZXJ0J3Mgc2czIC4uLiAqLworCWNtZC0+cmVzaWQgPSBzcmItPnRvdGFsX3hmZXJfbGVuZ3RoOworCS8qIFRoaXMgbWF5IGJlIGludGVycHJldGVkIGJ5IHNiLiBvciBub3QgLi4uICovCisJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IHNyYi0+dG90YWxfeGZlcl9sZW5ndGg7CisJY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IDA7CisJaWYgKGRlYnVnX2VuYWJsZWQoREJHX0tHKSkgeworCQlpZiAoc3JiLT50b3RhbF94ZmVyX2xlbmd0aCkKKwkJCWRwcmludGtkYmcoREJHX0tHLCAic3JiX2RvbmU6IChwaWQjJWxpKSA8JTAyaS0laT4gIgorCQkJCSJjbW5kPTB4JTAyeCBNaXNzZWQgJWkgYnl0ZXNcbiIsCisJCQkJY21kLT5waWQsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwKKwkJCQljbWQtPmNtbmRbMF0sIHNyYi0+dG90YWxfeGZlcl9sZW5ndGgpOworCX0KKworCXNyYl9nb2luZ19yZW1vdmUoZGNiLCBzcmIpOworCS8qIEFkZCB0byBmcmVlIGxpc3QgKi8KKwlpZiAoc3JiID09IGFjYi0+dG1wX3NyYikKKwkJZHByaW50a2woS0VSTl9FUlIsICJzcmJfZG9uZTogRVJST1IhIENvbXBsZXRlZCBjbWQgd2l0aCB0bXBfc3JiXG4iKTsKKwllbHNlIHsKKwkJZHByaW50a2RiZyhEQkdfMCwgInNyYl9kb25lOiAocGlkIyVsaSkgZG9uZSByZXN1bHQ9MHglMDh4XG4iLAorCQkJY21kLT5waWQsIGNtZC0+cmVzdWx0KTsKKwkJc3JiX2ZyZWVfaW5zZXJ0KGFjYiwgc3JiKTsKKwl9CisJcGNpX3VubWFwX3NyYihhY2IsIHNyYik7CisKKwljbWQtPnNjc2lfZG9uZShjbWQpOworCXdhaXRpbmdfcHJvY2Vzc19uZXh0KGFjYik7Cit9CisKKworLyogYWJvcnQgYWxsIGNtZHMgaW4gb3VyIHF1ZXVlcyAqLworc3RhdGljIHZvaWQgZG9pbmdfc3JiX2RvbmUoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgdTggZGlkX2ZsYWcsCisJCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdTggZm9yY2UpCit7CisJc3RydWN0IERldmljZUN0bEJsayAqZGNiOworCWRwcmludGtsKEtFUk5fSU5GTywgImRvaW5nX3NyYl9kb25lOiBwaWRzICIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkY2IsICZhY2ItPmRjYl9saXN0LCBsaXN0KSB7CisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmI7CisJCXN0cnVjdCBTY3NpUmVxQmxrICp0bXA7CisJCXN0cnVjdCBzY3NpX2NtbmQgKnA7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNyYiwgdG1wLCAmZGNiLT5zcmJfZ29pbmdfbGlzdCwgbGlzdCkgeworCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOworCQkJaW50IHJlc3VsdDsKKworCQkJcCA9IHNyYi0+Y21kOworCQkJZGlyID0gcC0+c2NfZGF0YV9kaXJlY3Rpb247CisJCQlyZXN1bHQgPSBNS19SRVMoMCwgZGlkX2ZsYWcsIDAsIDApOworCQkJcHJpbnRrKCJHOiVsaSglMDJpLSVpKSAiLCBwLT5waWQsCisJCQkgICAgICAgcC0+ZGV2aWNlLT5pZCwgcC0+ZGV2aWNlLT5sdW4pOworCQkJc3JiX2dvaW5nX3JlbW92ZShkY2IsIHNyYik7CisJCQlmcmVlX3RhZyhkY2IsIHNyYik7CisJCQlzcmJfZnJlZV9pbnNlcnQoYWNiLCBzcmIpOworCQkJcC0+cmVzdWx0ID0gcmVzdWx0OworCQkJcGNpX3VubWFwX3NyYl9zZW5zZShhY2IsIHNyYik7CisJCQlwY2lfdW5tYXBfc3JiKGFjYiwgc3JiKTsKKwkJCWlmIChmb3JjZSkgeworCQkJCS8qIEZvciBuZXcgRUgsIHdlIG5vcm1hbGx5IGRvbid0IG5lZWQgdG8gZ2l2ZSBjb21tYW5kcyBiYWNrLAorCQkJCSAqIGFzIHRoZXkgYWxsIGNvbXBsZXRlIG9yIGFsbCB0aW1lIG91dCAqLworCQkJCXAtPnNjc2lfZG9uZShwKTsKKwkJCX0KKwkJfQorCQlpZiAoIWxpc3RfZW1wdHkoJmRjYi0+c3JiX2dvaW5nX2xpc3QpKQorCQkJZHByaW50a2woS0VSTl9ERUJVRywgCisJCQkgICAgICAgIkhvdyBjb3VsZCB0aGUgTUwgc2VuZCBjbW5kcyB0byB0aGUgR29pbmcgcXVldWU/IDwlMDJpLSVpPlxuIiwKKwkJCSAgICAgICBkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuKTsKKwkJaWYgKGRjYi0+dGFnX21hc2spCisJCQlkcHJpbnRrbChLRVJOX0RFQlVHLAorCQkJICAgICAgICJ0YWdfbWFzayBmb3IgPCUwMmktJWk+IHNob3VsZCBiZSBlbXB0eSwgaXMgJTA4eCFcbiIsCisJCQkgICAgICAgZGNiLT50YXJnZXRfaWQsIGRjYi0+dGFyZ2V0X2x1biwKKwkJCSAgICAgICBkY2ItPnRhZ19tYXNrKTsKKworCQkvKiBXYWl0aW5nIHF1ZXVlICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzcmIsIHRtcCwgJmRjYi0+c3JiX3dhaXRpbmdfbGlzdCwgbGlzdCkgeworCQkJaW50IHJlc3VsdDsKKwkJCXAgPSBzcmItPmNtZDsKKworCQkJcmVzdWx0ID0gTUtfUkVTKDAsIGRpZF9mbGFnLCAwLCAwKTsKKwkJCXByaW50aygiVzolbGk8JTAyaS0laT4iLCBwLT5waWQsIHAtPmRldmljZS0+aWQsCisJCQkgICAgICAgcC0+ZGV2aWNlLT5sdW4pOworCQkJc3JiX3dhaXRpbmdfcmVtb3ZlKGRjYiwgc3JiKTsKKwkJCXNyYl9mcmVlX2luc2VydChhY2IsIHNyYik7CisJCQlwLT5yZXN1bHQgPSByZXN1bHQ7CisJCQlwY2lfdW5tYXBfc3JiX3NlbnNlKGFjYiwgc3JiKTsKKwkJCXBjaV91bm1hcF9zcmIoYWNiLCBzcmIpOworCQkJaWYgKGZvcmNlKSB7CisJCQkJLyogRm9yIG5ldyBFSCwgd2Ugbm9ybWFsbHkgZG9uJ3QgbmVlZCB0byBnaXZlIGNvbW1hbmRzIGJhY2ssCisJCQkJICogYXMgdGhleSBhbGwgY29tcGxldGUgb3IgYWxsIHRpbWUgb3V0ICovCisJCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJCX0KKwkJfQorCQlpZiAoIWxpc3RfZW1wdHkoJmRjYi0+c3JiX3dhaXRpbmdfbGlzdCkpCisJCQlkcHJpbnRrbChLRVJOX0RFQlVHLCAiTUwgcXVldWVkICVpIGNtbmRzIGFnYWluIHRvIDwlMDJpLSVpPlxuIiwKKwkJCSAgICAgbGlzdF9zaXplKCZkY2ItPnNyYl93YWl0aW5nX2xpc3QpLCBkY2ItPnRhcmdldF9pZCwKKwkJCSAgICAgZGNiLT50YXJnZXRfbHVuKTsKKwkJZGNiLT5mbGFnICY9IH5BQk9SVF9ERVZfOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKKworc3RhdGljIHZvaWQgcmVzZXRfc2NzaV9idXMoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYikKK3sKKwlkcHJpbnRrZGJnKERCR18wLCAicmVzZXRfc2NzaV9idXM6IGFjYj0lcFxuIiwgYWNiKTsKKwlhY2ItPmFjYl9mbGFnIHw9IFJFU0VUX0RFVjsJLyogUkVTRVRfREVURUNULCBSRVNFVF9ET05FLCBSRVNFVF9ERVYgKi8KKwlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX1JTVFNDU0kpOworCisJd2hpbGUgKCEoREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfSU5UU1RBVFVTKSAmIElOVF9TQ1NJUkVTRVQpKQorCQkvKiBub3RoaW5nICovOworfQorCisKK3N0YXRpYyB2b2lkIHNldF9iYXNpY19jb25maWcoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYikKK3sKKwl1OCBidmFsOworCXUxNiB3dmFsOworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9USU1FT1VULCBhY2ItPnNlbF90aW1lb3V0KTsKKwlpZiAoYWNiLT5jb25maWcgJiBIQ0NfUEFSSVRZKQorCQlidmFsID0gUEhBU0VMQVRDSCB8IElOSVRJQVRPUiB8IEJMT0NLUlNUIHwgUEFSSVRZQ0hFQ0s7CisJZWxzZQorCQlidmFsID0gUEhBU0VMQVRDSCB8IElOSVRJQVRPUiB8IEJMT0NLUlNUOworCisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTkZJRzAsIGJ2YWwpOworCisJLyogcHJvZ3JhbSBjb25maWd1cmF0aW9uIDE6IEFjdF9OZWcgKCsgQWN0X05lZ19Fbmg/ICsgRmFzdF9GaWx0ZXI/ICsgRGF0YURpcz8pICovCisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTkZJRzEsIDB4MDMpOwkvKiB3YXMgMHgxMzogZGVmYXVsdCAqLworCS8qIHByb2dyYW0gSG9zdCBJRCAgICAgICAgICAgICAgICAgICovCisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0hPU1RJRCwgYWNiLT5zY3NpX2hvc3QtPnRoaXNfaWQpOworCS8qIHNldCBhbnN5bmNocm9ub3VzIHRyYW5zZmVyICAgICAgICovCisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX09GRlNFVCwgMHgwMCk7CisJLyogVHVybiBMRUQgY29udHJvbCBvZmYgKi8KKwl3dmFsID0gREMzOTV4X3JlYWQxNihhY2IsIFRSTV9TMTA0MF9HRU5fQ09OVFJPTCkgJiAweDdGOworCURDMzk1eF93cml0ZTE2KGFjYiwgVFJNX1MxMDQwX0dFTl9DT05UUk9MLCB3dmFsKTsKKwkvKiBETUEgY29uZmlnICAgICAgICAgICovCisJd3ZhbCA9IERDMzk1eF9yZWFkMTYoYWNiLCBUUk1fUzEwNDBfRE1BX0NPTkZJRykgJiB+RE1BX0ZJRk9fQ1RSTDsKKwl3dmFsIHw9CisJICAgIERNQV9GSUZPX0hBTEZfSEFMRiB8IERNQV9FTkhBTkNFIC8qfCBETUFfTUVNX01VTFRJX1JFQUQgKi8gOworCURDMzk1eF93cml0ZTE2KGFjYiwgVFJNX1MxMDQwX0RNQV9DT05GSUcsIHd2YWwpOworCS8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0IHN0YXR1cyAqLworCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0lOVFNUQVRVUyk7CisJLyogRW5hYmxlIFNDU0kgaW50ZXJydXB0ICAgICovCisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0lOVEVOLCAweDdGKTsKKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX0RNQV9JTlRFTiwgRU5fU0NTSUlOVFIgfCBFTl9ETUFYRkVSRVJST1IKKwkJICAgICAgLyp8IEVOX0RNQVhGRVJBQk9SVCB8IEVOX0RNQVhGRVJDT01QIHwgRU5fRk9SQ0VETUFDT01QICovCisJCSAgICAgICk7Cit9CisKKworc3RhdGljIHZvaWQgc2NzaV9yZXNldF9kZXRlY3Qoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYikKK3sKKwlkcHJpbnRrbChLRVJOX0lORk8sICJzY3NpX3Jlc2V0X2RldGVjdDogYWNiPSVwXG4iLCBhY2IpOworCS8qIGRlbGF5IGhhbGYgYSBzZWNvbmQgKi8KKwlpZiAodGltZXJfcGVuZGluZygmYWNiLT53YWl0aW5nX3RpbWVyKSkKKwkJZGVsX3RpbWVyKCZhY2ItPndhaXRpbmdfdGltZXIpOworCisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX1JTVE1PRFVMRSk7CisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9ETUFfQ09OVFJPTCwgRE1BUkVTRVRNT0RVTEUpOworCS8qREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9ETUFfQ09OVFJPTCxTVE9QRE1BWEZFUik7ICovCisJdWRlbGF5KDUwMCk7CisJLyogTWF5YmUgd2UgbG9ja2VkIHVwIHRoZSBidXM/IFRoZW4gbGV0cyB3YWl0IGV2ZW4gbG9uZ2VyIC4uLiAqLworCWFjYi0+c2NzaV9ob3N0LT5sYXN0X3Jlc2V0ID0KKwkgICAgamlmZmllcyArIDUgKiBIWiAvIDIgKworCSAgICBIWiAqIGFjYi0+ZWVwcm9tLmRlbGF5X3RpbWU7CisKKwljbGVhcl9maWZvKGFjYiwgInNjc2lfcmVzZXRfZGV0ZWN0Iik7CisJc2V0X2Jhc2ljX2NvbmZpZyhhY2IpOworCS8qMS4yNSAqLworCS8qREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19IV1JFU0VMRUNUKTsgKi8KKworCWlmIChhY2ItPmFjYl9mbGFnICYgUkVTRVRfREVWKSB7CS8qIFJFU0VUX0RFVEVDVCwgUkVTRVRfRE9ORSwgUkVTRVRfREVWICovCisJCWFjYi0+YWNiX2ZsYWcgfD0gUkVTRVRfRE9ORTsKKwl9IGVsc2UgeworCQlhY2ItPmFjYl9mbGFnIHw9IFJFU0VUX0RFVEVDVDsKKwkJcmVzZXRfZGV2X3BhcmFtKGFjYik7CisJCWRvaW5nX3NyYl9kb25lKGFjYiwgRElEX1JFU0VULCBOVUxMLCAxKTsKKwkJLypEQzM5NXhfUmVjb3ZlclNSQiggYWNiICk7ICovCisJCWFjYi0+YWN0aXZlX2RjYiA9IE5VTEw7CisJCWFjYi0+YWNiX2ZsYWcgPSAwOworCQl3YWl0aW5nX3Byb2Nlc3NfbmV4dChhY2IpOworCX0KK30KKworCitzdGF0aWMgdm9pZCByZXF1ZXN0X3NlbnNlKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiwKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnNyYikKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBzcmItPmNtZDsKKwlkcHJpbnRrZGJnKERCR18xLCAicmVxdWVzdF9zZW5zZTogKHBpZCMlbGkpIDwlMDJpLSVpPlxuIiwKKwkJY21kLT5waWQsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisKKwlzcmItPmZsYWcgfD0gQVVUT19SRVFTRU5TRTsKKwlzcmItPmFkYXB0ZXJfc3RhdHVzID0gMDsKKwlzcmItPnRhcmdldF9zdGF0dXMgPSAwOworCisJLyogS0c6IENhbiB0aGlzIHByZXZlbnQgY3JhcCBzZW5zZSBkYXRhID8gKi8KKwltZW1zZXQoY21kLT5zZW5zZV9idWZmZXIsIDAsIHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpOworCisJLyogU2F2ZSBzb21lIGRhdGEgKi8KKwlzcmItPnNlZ21lbnRfeFtEQzM5NXhfTUFYX1NHX0xJU1RFTlRSWSAtIDFdLmFkZHJlc3MgPQorCSAgICBzcmItPnNlZ21lbnRfeFswXS5hZGRyZXNzOworCXNyYi0+c2VnbWVudF94W0RDMzk1eF9NQVhfU0dfTElTVEVOVFJZIC0gMV0ubGVuZ3RoID0KKwkgICAgc3JiLT5zZWdtZW50X3hbMF0ubGVuZ3RoOworCXNyYi0+eGZlcnJlZCA9IHNyYi0+dG90YWxfeGZlcl9sZW5ndGg7CisJLyogc3JiLT5zZWdtZW50X3ggOiBhIG9uZSBlbnRyeSBvZiBTL0cgbGlzdCB0YWJsZSAqLworCXNyYi0+dG90YWxfeGZlcl9sZW5ndGggPSBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpOworCXNyYi0+c2VnbWVudF94WzBdLmxlbmd0aCA9IHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcik7CisJLyogTWFwIHNlbnNlIGJ1ZmZlciAqLworCXNyYi0+c2VnbWVudF94WzBdLmFkZHJlc3MgPQorCSAgICBwY2lfbWFwX3NpbmdsZShhY2ItPmRldiwgY21kLT5zZW5zZV9idWZmZXIsCisJCQkgICBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCWRwcmludGtkYmcoREJHX1NHLCAicmVxdWVzdF9zZW5zZTogbWFwIGJ1ZmZlciAlcC0+JTA4eCglMDV4KVxuIiwKKwkgICAgICAgY21kLT5zZW5zZV9idWZmZXIsIHNyYi0+c2VnbWVudF94WzBdLmFkZHJlc3MsCisJICAgICAgIHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpOworCXNyYi0+c2dfY291bnQgPSAxOworCXNyYi0+c2dfaW5kZXggPSAwOworCisJaWYgKHN0YXJ0X3Njc2koYWNiLCBkY2IsIHNyYikpIHsJLyogU2hvdWxkIG9ubHkgaGFwcGVuLCBpZiBzYi4gZWxzZSBncmFicyB0aGUgYnVzICovCisJCWRwcmludGtsKEtFUk5fREVCVUcsCisJCQkicmVxdWVzdF9zZW5zZTogKHBpZCMlbGkpIGZhaWxlZCA8JTAyaS0laT5cbiIsCisJCQlzcmItPmNtZC0+cGlkLCBkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuKTsKKwkJc3JiX2dvaW5nX3RvX3dhaXRpbmdfbW92ZShkY2IsIHNyYik7CisJCXdhaXRpbmdfc2V0X3RpbWVyKGFjYiwgSFogLyAxMDApOworCX0KK30KKworCisvKioKKyAqIGRldmljZV9hbGxvYyAtIEFsbG9jYXRlIGEgbmV3IGRldmljZSBpbnN0YW5jZS4gVGhpcyBjcmVhdGUgdGhlCisgKiBkZXZpY2VzIGluc3RhbmNlIGFuZCBzZXRzIHVwIGFsbCB0aGUgZGF0YSBpdGVtcy4gVGhlIGFkYXB0ZXIKKyAqIGluc3RhbmNlIGlzIHJlcXVpcmVkIHRvIG9idGFpbiBjb25maXVyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoaXMKKyAqIGRldmljZS4gVGhpcyBkb2VzICpub3QqIGFkZCB0aGlzIGRldmljZSB0byB0aGUgYWRhcHRlcnMgZGV2aWNlCisgKiBsaXN0LgorICoKKyAqIEBhY2I6IFRoZSBhZGFwdGVyIHRvIG9idGFpbiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZyb20uCisgKiBAdGFyZ2V0OiBUaGUgdGFyZ2V0IGZvciB0aGUgbmV3IGRldmljZS4KKyAqIEBsdW46IFRoZSBsdW4gZm9yIHRoZSBuZXcgZGV2aWNlLgorICoKKyAqIFJldHVybiB0aGUgbmV3IGRldmljZSBpZiBzdWNjZXNmdWxsIG9yIE5VTEwgb24gZmFpbHVyZS4KKyAqKi8KK3N0YXRpYyBzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkZXZpY2VfYWxsb2Moc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwKKwkJdTggdGFyZ2V0LCB1OCBsdW4pCit7CisJc3RydWN0IE52UmFtVHlwZSAqZWVwcm9tID0gJmFjYi0+ZWVwcm9tOworCXU4IHBlcmlvZF9pbmRleCA9IGVlcHJvbS0+dGFyZ2V0W3RhcmdldF0ucGVyaW9kICYgMHgwNzsKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2I7CisKKwlkY2IgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgRGV2aWNlQ3RsQmxrKSwgR0ZQX0FUT01JQyk7CisJZHByaW50a2RiZyhEQkdfMCwgImRldmljZV9hbGxvYzogPCUwMmktJWk+XG4iLCB0YXJnZXQsIGx1bik7CisJaWYgKCFkY2IpCisJCXJldHVybiBOVUxMOworCWRjYi0+YWNiID0gTlVMTDsKKwlJTklUX0xJU1RfSEVBRCgmZGNiLT5zcmJfZ29pbmdfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmRjYi0+c3JiX3dhaXRpbmdfbGlzdCk7CisJZGNiLT5hY3RpdmVfc3JiID0gTlVMTDsKKwlkY2ItPnRhZ19tYXNrID0gMDsKKwlkY2ItPm1heF9jb21tYW5kID0gMTsKKwlkY2ItPnRhcmdldF9pZCA9IHRhcmdldDsKKwlkY2ItPnRhcmdldF9sdW4gPSBsdW47CisjaWZuZGVmIERDMzk1eF9OT19ESVNDT05ORUNUCisJZGNiLT5pZGVudGlmeV9tc2cgPQorCSAgICBJREVOVElGWShkY2ItPmRldl9tb2RlICYgTlRDX0RPX0RJU0NPTk5FQ1QsIGx1bik7CisjZWxzZQorCWRjYi0+aWRlbnRpZnlfbXNnID0gSURFTlRJRlkoMCwgbHVuKTsKKyNlbmRpZgorCWRjYi0+ZGV2X21vZGUgPSBlZXByb20tPnRhcmdldFt0YXJnZXRdLmNmZzA7CisJZGNiLT5pbnF1aXJ5NyA9IDA7CisJZGNiLT5zeW5jX21vZGUgPSAwOworCWRjYi0+bWluX25lZ29fcGVyaW9kID0gY2xvY2tfcGVyaW9kW3BlcmlvZF9pbmRleF07CisJZGNiLT5zeW5jX3BlcmlvZCA9IDA7CisJZGNiLT5zeW5jX29mZnNldCA9IDA7CisJZGNiLT5mbGFnID0gMDsKKworI2lmbmRlZiBEQzM5NXhfTk9fV0lERQorCWlmICgoZGNiLT5kZXZfbW9kZSAmIE5UQ19ET19XSURFX05FR08pCisJICAgICYmIChhY2ItPmNvbmZpZyAmIEhDQ19XSURFX0NBUkQpKQorCQlkY2ItPnN5bmNfbW9kZSB8PSBXSURFX05FR09fRU5BQkxFOworI2VuZGlmCisjaWZuZGVmIERDMzk1eF9OT19TWU5DCisJaWYgKGRjYi0+ZGV2X21vZGUgJiBOVENfRE9fU1lOQ19ORUdPKQorCQlpZiAoIShsdW4pIHx8IGN1cnJlbnRfc3luY19vZmZzZXQpCisJCQlkY2ItPnN5bmNfbW9kZSB8PSBTWU5DX05FR09fRU5BQkxFOworI2VuZGlmCisJaWYgKGRjYi0+dGFyZ2V0X2x1biAhPSAwKSB7CisJCS8qIENvcHkgc2V0dGluZ3MgKi8KKwkJc3RydWN0IERldmljZUN0bEJsayAqcDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmYWNiLT5kY2JfbGlzdCwgbGlzdCkKKwkJCWlmIChwLT50YXJnZXRfaWQgPT0gZGNiLT50YXJnZXRfaWQpCisJCQkJYnJlYWs7CisJCWRwcmludGtkYmcoREJHXzEsIAorCQkgICAgICAgImRldmljZV9hbGxvYzogPCUwMmktJWk+IGNvcHkgZnJvbSA8JTAyaS0laT5cbiIsCisJCSAgICAgICBkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuLAorCQkgICAgICAgcC0+dGFyZ2V0X2lkLCBwLT50YXJnZXRfbHVuKTsKKwkJZGNiLT5zeW5jX21vZGUgPSBwLT5zeW5jX21vZGU7CisJCWRjYi0+c3luY19wZXJpb2QgPSBwLT5zeW5jX3BlcmlvZDsKKwkJZGNiLT5taW5fbmVnb19wZXJpb2QgPSBwLT5taW5fbmVnb19wZXJpb2Q7CisJCWRjYi0+c3luY19vZmZzZXQgPSBwLT5zeW5jX29mZnNldDsKKwkJZGNiLT5pbnF1aXJ5NyA9IHAtPmlucXVpcnk3OworCX0KKwlyZXR1cm4gZGNiOworfQorCisKKy8qKgorICogYWRhcHRlcl9hZGRfZGV2aWNlIC0gQWRkcyB0aGUgZGV2aWNlIGluc3RhbmNlIHRvIHRoZSBhZGFwdG9yIGluc3RhbmNlLgorICoKKyAqIEBhY2I6IFRoZSBhZGFwdGVyIGRldmljZSB0byBiZSB1cGRhdGVkCisgKiBAZGNiOiBBIG5ld2x5IGNyZWF0ZWQgYW5kIGludGlhbGlzZWQgZGV2aWNlIGluc3RhbmNlIHRvIGFkZC4KKyAqKi8KK3N0YXRpYyB2b2lkIGFkYXB0ZXJfYWRkX2RldmljZShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLAorCQlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IpCit7CisJLyogYmFja3BvaW50ZXIgdG8gYWRhcHRlciAqLworCWRjYi0+YWNiID0gYWNiOworCQorCS8qIHNldCBydW5fcm9iaW4gdG8gdGhpcyBkZXZpY2UgaWYgaXQgaXMgY3VycmVudGx5IGVtcHR5ICovCisJaWYgKGxpc3RfZW1wdHkoJmFjYi0+ZGNiX2xpc3QpKQorCQlhY2ItPmRjYl9ydW5fcm9iaW4gPSBkY2I7CisKKwkvKiBhZGQgZGV2aWNlIHRvIGxpc3QgKi8KKwlsaXN0X2FkZF90YWlsKCZkY2ItPmxpc3QsICZhY2ItPmRjYl9saXN0KTsKKworCS8qIHVwZGF0ZSBkZXZpY2UgbWFwcyAqLworCWFjYi0+ZGNiX21hcFtkY2ItPnRhcmdldF9pZF0gfD0gKDEgPDwgZGNiLT50YXJnZXRfbHVuKTsKKwlhY2ItPmNoaWxkcmVuW2RjYi0+dGFyZ2V0X2lkXVtkY2ItPnRhcmdldF9sdW5dID0gZGNiOworfQorCisKKy8qKgorICogYWRhcHRlcl9yZW1vdmVfZGV2aWNlIC0gUmVtb3ZlcyB0aGUgZGV2aWNlIGluc3RhbmNlIGZyb20gdGhlIGFkYXB0b3IKKyAqIGluc3RhbmNlLiBUaGUgZGV2aWNlIGluc3RhbmNlIGlzIG5vdCBjaGVjayBpbiBhbnkgd2F5IG9yIGZyZWVkIGJ5IHRoaXMuIAorICogVGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byB0YWtlIGNhcmUgb2YgdGhhdC4gVGhpcyB3aWxsIHNpbXBseSByZW1vdmUgdGhlCisgKiBkZXZpY2UgZnJvbSB0aGUgYWRhcHRlcnMgZGF0YSBzdHJjdXR1cmVzLgorICoKKyAqIEBhY2I6IFRoZSBhZGFwdGVyIGRldmljZSB0byBiZSB1cGRhdGVkCisgKiBAZGNiOiBBIGRldmljZSB0aGF0IGhhcyBwcmV2aW91c2x5IGJlZW4gYWRkZWQgdG8gdGhlIGFkYXB0ZXIuCisgKiovCitzdGF0aWMgdm9pZCBhZGFwdGVyX3JlbW92ZV9kZXZpY2Uoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwKKwkJc3RydWN0IERldmljZUN0bEJsayAqZGNiKQoreworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmk7CisJc3RydWN0IERldmljZUN0bEJsayAqdG1wOworCWRwcmludGtkYmcoREJHXzAsICJhZGFwdGVyX3JlbW92ZV9kZXZpY2U6IDwlMDJpLSVpPlxuIiwKKwkJZGNiLT50YXJnZXRfaWQsIGRjYi0+dGFyZ2V0X2x1bik7CisKKwkvKiBmaXggdXAgYW55IHBvaW50ZXJzIHRvIHRoaXMgZGV2aWNlIHRoYXQgd2UgaGF2ZSBpbiB0aGUgYWRhcHRlciAqLworCWlmIChhY2ItPmFjdGl2ZV9kY2IgPT0gZGNiKQorCQlhY2ItPmFjdGl2ZV9kY2IgPSBOVUxMOworCWlmIChhY2ItPmRjYl9ydW5fcm9iaW4gPT0gZGNiKQorCQlhY2ItPmRjYl9ydW5fcm9iaW4gPSBkY2JfZ2V0X25leHQoJmFjYi0+ZGNiX2xpc3QsIGRjYik7CisKKwkvKiB1bmxpbmsgZnJvbSBsaXN0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGksIHRtcCwgJmFjYi0+ZGNiX2xpc3QsIGxpc3QpCisJCWlmIChkY2IgPT0gaSkgeworCQkJbGlzdF9kZWwoJmktPmxpc3QpOworCQkJYnJlYWs7CisJCX0KKworCS8qIGNsZWFyIG1hcCBhbmQgY2hpbGRyZW4gKi8JCisJYWNiLT5kY2JfbWFwW2RjYi0+dGFyZ2V0X2lkXSAmPSB+KDEgPDwgZGNiLT50YXJnZXRfbHVuKTsKKwlhY2ItPmNoaWxkcmVuW2RjYi0+dGFyZ2V0X2lkXVtkY2ItPnRhcmdldF9sdW5dID0gTlVMTDsKKwlkY2ItPmFjYiA9IE5VTEw7Cit9CisKKworLyoqCisgKiBhZGFwdGVyX3JlbW92ZV9hbmRfZnJlZV9kZXZpY2UgLSBSZW1vdmVzIGEgc2luZ2xlIGRldmljZSBmcm9tIHRoZSBhZGFwdGVyCisgKiBhbmQgdGhlbiBmcmVlcyB0aGUgZGV2aWNlIGluZm9ybWF0aW9uLgorICoKKyAqIEBhY2I6IFRoZSBhZGFwdGVyIGRldmljZSB0byBiZSB1cGRhdGVkCisgKiBAZGNiOiBBIGRldmljZSB0aGF0IGhhcyBwcmV2aW91c2x5IGJlZW4gYWRkZWQgdG8gdGhlIGFkYXB0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIGFkYXB0ZXJfcmVtb3ZlX2FuZF9mcmVlX2RldmljZShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLAorCQlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IpCit7CisJaWYgKGxpc3Rfc2l6ZSgmZGNiLT5zcmJfZ29pbmdfbGlzdCkgPiAxKSB7CisJCWRwcmludGtkYmcoREJHXzEsICJhZGFwdGVyX3JlbW92ZV9hbmRfZnJlZV9kZXZpY2U6IDwlMDJpLSVpPiAiCisJCSAgICAgICAgICAgIldvbid0IHJlbW92ZSBiZWNhdXNlIG9mICVpIGFjdGl2ZSByZXF1ZXN0cy5cbiIsCisJCQkgICBkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuLAorCQkJICAgbGlzdF9zaXplKCZkY2ItPnNyYl9nb2luZ19saXN0KSk7CisJCXJldHVybjsKKwl9CisJYWRhcHRlcl9yZW1vdmVfZGV2aWNlKGFjYiwgZGNiKTsKKwlrZnJlZShkY2IpOworfQorCisKKy8qKgorICogYWRhcHRlcl9yZW1vdmVfYW5kX2ZyZWVfYWxsX2RldmljZXMgLSBSZW1vdmVzIGFuZCBmcmVlcyBhbGwgb2YgdGhlCisgKiBkZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIuCisgKgorICogQGFjYjogVGhlIGFkYXB0ZXIgZnJvbSB3aGljaCBhbGwgZGV2aWNlcyBzaG91bGQgYmUgcmVtb3ZlZC4KKyAqKi8KK3N0YXRpYyB2b2lkIGFkYXB0ZXJfcmVtb3ZlX2FuZF9mcmVlX2FsbF9kZXZpY2VzKHN0cnVjdCBBZGFwdGVyQ3RsQmxrKiBhY2IpCit7CisJc3RydWN0IERldmljZUN0bEJsayAqZGNiOworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKnRtcDsKKwlkcHJpbnRrZGJnKERCR18xLCAiYWRhcHRlcl9yZW1vdmVfYW5kX2ZyZWVfYWxsX2RldmljZXM6IG51bT0laVxuIiwKKwkJICAgbGlzdF9zaXplKCZhY2ItPmRjYl9saXN0KSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGNiLCB0bXAsICZhY2ItPmRjYl9saXN0LCBsaXN0KQorCQlhZGFwdGVyX3JlbW92ZV9hbmRfZnJlZV9kZXZpY2UoYWNiLCBkY2IpOworfQorCisKKy8qKgorICogZGMzOTV4X3NsYXZlX2FsbG9jIC0gQ2FsbGVkIGJ5IHRoZSBzY3NpIG1pZCBsYXllciB0byB0ZWxsIHVzIGFib3V0IGEgbmV3CisgKiBzY3NpIGRldmljZSB0aGF0IHdlIG5lZWQgdG8gZGVhbCB3aXRoLiBXZSBhbGxvY2F0ZSBhIG5ldyBkZXZpY2UgYW5kIHRoZW4KKyAqIGluc2VydCB0aGF0IGRldmljZSBpbnRvIHRoZSBhZGFwdGVycyBkZXZpY2UgbGlzdC4KKyAqCisgKiBAc2NzaV9kZXZpY2U6IFRoZSBuZXcgc2NzaSBkZXZpY2UgdGhhdCB3ZSBuZWVkIHRvIGhhbmRsZS4KKyAqKi8KK3N0YXRpYyBpbnQgZGMzOTV4X3NsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaV9kZXZpY2UpCit7CisJc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiA9IChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqKXNjc2lfZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2I7CisKKwlkY2IgPSBkZXZpY2VfYWxsb2MoYWNiLCBzY3NpX2RldmljZS0+aWQsIHNjc2lfZGV2aWNlLT5sdW4pOworCWlmICghZGNiKQorCQlyZXR1cm4gLUVOT01FTTsKKwlhZGFwdGVyX2FkZF9kZXZpY2UoYWNiLCBkY2IpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBkYzM5NXhfc2xhdmVfZGVzdHJveSAtIENhbGxlZCBieSB0aGUgc2NzaSBtaWQgbGF5ZXIgdG8gdGVsbCB1cyBhYm91dCBhCisgKiBkZXZpY2UgdGhhdCBpcyBnb2luZyBhd2F5LgorICoKKyAqIEBzY3NpX2RldmljZTogVGhlIG5ldyBzY3NpIGRldmljZSB0aGF0IHdlIG5lZWQgdG8gaGFuZGxlLgorICoqLworc3RhdGljIHZvaWQgZGMzOTV4X3NsYXZlX2Rlc3Ryb3koc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2RldmljZSkKK3sKKwlzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiID0gKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICopc2NzaV9kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiA9IGZpbmRfZGNiKGFjYiwgc2NzaV9kZXZpY2UtPmlkLCBzY3NpX2RldmljZS0+bHVuKTsKKwlpZiAoZGNiKQorCQlhZGFwdGVyX3JlbW92ZV9hbmRfZnJlZV9kZXZpY2UoYWNiLCBkY2IpOworfQorCisKKworCisvKioKKyAqIHRybXMxMDQwX3dhaXRfMzB1czogd2FpdCBmb3IgMzAgdXMKKyAqCisgKiBXYWl0cyBmb3IgMzB1cyAodXNpbmcgdGhlIGNoaXAgYnkgdGhlIGxvb2tzIG9mIGl0Li4pCisgKgorICogQGlvX3BvcnQ6IGJhc2UgSS9PIGFkZHJlc3MKKyAqKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB0cm1zMTA0MF93YWl0XzMwdXModW5zaWduZWQgbG9uZyBpb19wb3J0KQoreworCS8qIFNjc2lQb3J0U3RhbGxFeGVjdXRpb24oMzApOyB3YWl0IDMwIHVzICovCisJb3V0Yig1LCBpb19wb3J0ICsgVFJNX1MxMDQwX0dFTl9USU1FUik7CisJd2hpbGUgKCEoaW5iKGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX1NUQVRVUykgJiBHVElNRU9VVCkpCisJCS8qIG5vdGhpbmcgKi8gOworfQorCisKKy8qKgorICogdHJtczEwNDBfd3JpdGVfY21kIC0gd3JpdGUgdGhlIHNlY2lmaWVkIGNvbW1hbmQgYW5kIGFkZHJlc3MgdG8KKyAqIGNoaXAKKyAqCisgKiBAaW9fcG9ydDoJYmFzZSBJL08gYWRkcmVzcworICogQGNtZDoJU0IgKyBvcCBjb2RlIChjb21tYW5kKSB0byBzZW5kCisgKiBAYWRkcjoJYWRkcmVzcyB0byBzZW5kCisgKiovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdHJtczEwNDBfd3JpdGVfY21kKHVuc2lnbmVkIGxvbmcgaW9fcG9ydCwgdTggY21kLCB1OCBhZGRyKQoreworCWludCBpOworCXU4IHNlbmRfZGF0YTsKKworCS8qIHByb2dyYW0gU0IgKyBPUCBjb2RlICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKywgY21kIDw8PSAxKSB7CisJCXNlbmRfZGF0YSA9IE5WUl9TRUxFQ1Q7CisJCWlmIChjbWQgJiAweDA0KQkvKiBTdGFydCBmcm9tIGJpdCAyICovCisJCQlzZW5kX2RhdGEgfD0gTlZSX0JJVE9VVDsKKworCQlvdXRiKHNlbmRfZGF0YSwgaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fTlZSQU0pOworCQl0cm1zMTA0MF93YWl0XzMwdXMoaW9fcG9ydCk7CisJCW91dGIoKHNlbmRfZGF0YSB8IE5WUl9DTE9DSyksCisJCSAgICAgaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fTlZSQU0pOworCQl0cm1zMTA0MF93YWl0XzMwdXMoaW9fcG9ydCk7CisJfQorCisJLyogc2VuZCBhZGRyZXNzICovCisJZm9yIChpID0gMDsgaSA8IDc7IGkrKywgYWRkciA8PD0gMSkgeworCQlzZW5kX2RhdGEgPSBOVlJfU0VMRUNUOworCQlpZiAoYWRkciAmIDB4NDApCS8qIFN0YXJ0IGZyb20gYml0IDYgKi8KKwkJCXNlbmRfZGF0YSB8PSBOVlJfQklUT1VUOworCisJCW91dGIoc2VuZF9kYXRhLCBpb19wb3J0ICsgVFJNX1MxMDQwX0dFTl9OVlJBTSk7CisJCXRybXMxMDQwX3dhaXRfMzB1cyhpb19wb3J0KTsKKwkJb3V0Yigoc2VuZF9kYXRhIHwgTlZSX0NMT0NLKSwKKwkJICAgICBpb19wb3J0ICsgVFJNX1MxMDQwX0dFTl9OVlJBTSk7CisJCXRybXMxMDQwX3dhaXRfMzB1cyhpb19wb3J0KTsKKwl9CisJb3V0YihOVlJfU0VMRUNULCBpb19wb3J0ICsgVFJNX1MxMDQwX0dFTl9OVlJBTSk7CisJdHJtczEwNDBfd2FpdF8zMHVzKGlvX3BvcnQpOworfQorCisKKy8qKgorICogdHJtczEwNDBfc2V0X2RhdGEgLSBzdG9yZSBhIHNpbmdsZSBieXRlIGluIHRoZSBlZXByb20KKyAqCisgKiBDYWxsZWQgZnJvbSB3cml0ZSBhbGwgdG8gd3JpdGUgYSBzaW5nbGUgYnl0ZSBpbnRvIHRoZSBTU0VFUFJPTQorICogV2hpY2ggaXMgZG9uZSBvbmUgYml0IGF0IGEgdGltZS4KKyAqCisgKiBAaW9fcG9ydDoJYmFzZSBJL08gYWRkcmVzcworICogQGFkZHI6CW9mZnNldCBpbnRvIEVFUFJPTQorICogQGJ5dGU6CWJ5dGVzIHRvIHdyaXRlCisgKiovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdHJtczEwNDBfc2V0X2RhdGEodW5zaWduZWQgbG9uZyBpb19wb3J0LCB1OCBhZGRyLCB1OCBieXRlKQoreworCWludCBpOworCXU4IHNlbmRfZGF0YTsKKworCS8qIFNlbmQgd3JpdGUgY29tbWFuZCAmIGFkZHJlc3MgKi8KKwl0cm1zMTA0MF93cml0ZV9jbWQoaW9fcG9ydCwgMHgwNSwgYWRkcik7CisKKwkvKiBXcml0ZSBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKywgYnl0ZSA8PD0gMSkgeworCQlzZW5kX2RhdGEgPSBOVlJfU0VMRUNUOworCQlpZiAoYnl0ZSAmIDB4ODApCS8qIFN0YXJ0IGZyb20gYml0IDcgKi8KKwkJCXNlbmRfZGF0YSB8PSBOVlJfQklUT1VUOworCisJCW91dGIoc2VuZF9kYXRhLCBpb19wb3J0ICsgVFJNX1MxMDQwX0dFTl9OVlJBTSk7CisJCXRybXMxMDQwX3dhaXRfMzB1cyhpb19wb3J0KTsKKwkJb3V0Yigoc2VuZF9kYXRhIHwgTlZSX0NMT0NLKSwgaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fTlZSQU0pOworCQl0cm1zMTA0MF93YWl0XzMwdXMoaW9fcG9ydCk7CisJfQorCW91dGIoTlZSX1NFTEVDVCwgaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fTlZSQU0pOworCXRybXMxMDQwX3dhaXRfMzB1cyhpb19wb3J0KTsKKworCS8qIERpc2FibGUgY2hpcCBzZWxlY3QgKi8KKwlvdXRiKDAsIGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX05WUkFNKTsKKwl0cm1zMTA0MF93YWl0XzMwdXMoaW9fcG9ydCk7CisKKwlvdXRiKE5WUl9TRUxFQ1QsIGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX05WUkFNKTsKKwl0cm1zMTA0MF93YWl0XzMwdXMoaW9fcG9ydCk7CisKKwkvKiBXYWl0IGZvciB3cml0ZSByZWFkeSAqLworCXdoaWxlICgxKSB7CisJCW91dGIoKE5WUl9TRUxFQ1QgfCBOVlJfQ0xPQ0spLCBpb19wb3J0ICsgVFJNX1MxMDQwX0dFTl9OVlJBTSk7CisJCXRybXMxMDQwX3dhaXRfMzB1cyhpb19wb3J0KTsKKworCQlvdXRiKE5WUl9TRUxFQ1QsIGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX05WUkFNKTsKKwkJdHJtczEwNDBfd2FpdF8zMHVzKGlvX3BvcnQpOworCisJCWlmIChpbmIoaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fTlZSQU0pICYgTlZSX0JJVElOKQorCQkJYnJlYWs7CisJfQorCisJLyogIERpc2FibGUgY2hpcCBzZWxlY3QgKi8KKwlvdXRiKDAsIGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX05WUkFNKTsKK30KKworCisvKioKKyAqIHRybXMxMDQwX3dyaXRlX2FsbCAtIHdyaXRlIDEyOCBieXRlcyB0byB0aGUgZWVwcm9tCisgKgorICogV3JpdGUgdGhlIHN1cHBsaWVkIDEyOCBieXRlcyB0byB0aGUgY2hpcHMgU0VFUFJPTQorICoKKyAqIEBlZXByb206CXRoZSBkYXRhIHRvIHdyaXRlCisgKiBAaW9fcG9ydDoJdGhlIGJhc2UgaW8gcG9ydAorICoqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHRybXMxMDQwX3dyaXRlX2FsbChzdHJ1Y3QgTnZSYW1UeXBlICplZXByb20sIHVuc2lnbmVkIGxvbmcgaW9fcG9ydCkKK3sKKwl1OCAqYl9lZXByb20gPSAodTggKillZXByb207CisJdTggYWRkcjsKKworCS8qIEVuYWJsZSBTRUVQUk9NICovCisJb3V0YigoaW5iKGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX0NPTlRST0wpIHwgRU5fRUVQUk9NKSwKKwkgICAgIGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX0NPTlRST0wpOworCisJLyogd3JpdGUgZW5hYmxlICovCisJdHJtczEwNDBfd3JpdGVfY21kKGlvX3BvcnQsIDB4MDQsIDB4RkYpOworCW91dGIoMCwgaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fTlZSQU0pOworCXRybXMxMDQwX3dhaXRfMzB1cyhpb19wb3J0KTsKKworCS8qIHdyaXRlICovCisJZm9yIChhZGRyID0gMDsgYWRkciA8IDEyODsgYWRkcisrLCBiX2VlcHJvbSsrKQorCQl0cm1zMTA0MF9zZXRfZGF0YShpb19wb3J0LCBhZGRyLCAqYl9lZXByb20pOworCisJLyogd3JpdGUgZGlzYWJsZSAqLworCXRybXMxMDQwX3dyaXRlX2NtZChpb19wb3J0LCAweDA0LCAweDAwKTsKKwlvdXRiKDAsIGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX05WUkFNKTsKKwl0cm1zMTA0MF93YWl0XzMwdXMoaW9fcG9ydCk7CisKKwkvKiBEaXNhYmxlIFNFRVBST00gKi8KKwlvdXRiKChpbmIoaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fQ09OVFJPTCkgJiB+RU5fRUVQUk9NKSwKKwkgICAgIGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX0NPTlRST0wpOworfQorCisKKy8qKgorICogdHJtczEwNDBfZ2V0X2RhdGEgLSBnZXQgYSBzaW5nbGUgYnl0ZSBmcm9tIHRoZSBlZXByb20KKyAqCisgKiBDYWxsZWQgZnJvbSByZWFkIGFsbCB0byByZWFkIGEgc2luZ2xlIGJ5dGUgaW50byB0aGUgU1NFRVBST00KKyAqIFdoaWNoIGlzIGRvbmUgb25lIGJpdCBhdCBhIHRpbWUuCisgKgorICogQGlvX3BvcnQ6CWJhc2UgSS9PIGFkZHJlc3MKKyAqIEBhZGRyOglvZmZzZXQgaW50byBTRUVQUk9NCisgKgorICogUmV0dXJucyB0aGUgdGhlIGJ5dGUgcmVhZC4KKyAqKi8KK3N0YXRpYyB1OCBfX2RldmluaXQgdHJtczEwNDBfZ2V0X2RhdGEodW5zaWduZWQgbG9uZyBpb19wb3J0LCB1OCBhZGRyKQoreworCWludCBpOworCXU4IHJlYWRfYnl0ZTsKKwl1OCByZXN1bHQgPSAwOworCisJLyogU2VuZCByZWFkIGNvbW1hbmQgJiBhZGRyZXNzICovCisJdHJtczEwNDBfd3JpdGVfY21kKGlvX3BvcnQsIDB4MDYsIGFkZHIpOworCisJLyogcmVhZCBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlvdXRiKChOVlJfU0VMRUNUIHwgTlZSX0NMT0NLKSwgaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fTlZSQU0pOworCQl0cm1zMTA0MF93YWl0XzMwdXMoaW9fcG9ydCk7CisJCW91dGIoTlZSX1NFTEVDVCwgaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fTlZSQU0pOworCisJCS8qIEdldCBkYXRhIGJpdCB3aGlsZSBmYWxsaW5nIGVkZ2UgKi8KKwkJcmVhZF9ieXRlID0gaW5iKGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX05WUkFNKTsKKwkJcmVzdWx0IDw8PSAxOworCQlpZiAocmVhZF9ieXRlICYgTlZSX0JJVElOKQorCQkJcmVzdWx0IHw9IDE7CisKKwkJdHJtczEwNDBfd2FpdF8zMHVzKGlvX3BvcnQpOworCX0KKworCS8qIERpc2FibGUgY2hpcCBzZWxlY3QgKi8KKwlvdXRiKDAsIGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX05WUkFNKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogdHJtczEwNDBfcmVhZF9hbGwgLSByZWFkIGFsbCBieXRlcyBmcm9tIHRoZSBlZXByb20KKyAqCisgKiBSZWFkIHRoZSAxMjggYnl0ZXMgZnJvbSB0aGUgU0VFUFJPTS4KKyAqCisgKiBAZWVwcm9tOgl3aGVyZSB0byBzdG9yZSB0aGUgZGF0YQorICogQGlvX3BvcnQ6CXRoZSBiYXNlIGlvIHBvcnQKKyAqKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB0cm1zMTA0MF9yZWFkX2FsbChzdHJ1Y3QgTnZSYW1UeXBlICplZXByb20sIHVuc2lnbmVkIGxvbmcgaW9fcG9ydCkKK3sKKwl1OCAqYl9lZXByb20gPSAodTggKillZXByb207CisJdTggYWRkcjsKKworCS8qIEVuYWJsZSBTRUVQUk9NICovCisJb3V0YigoaW5iKGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX0NPTlRST0wpIHwgRU5fRUVQUk9NKSwKKwkgICAgIGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX0NPTlRST0wpOworCisJLyogcmVhZCBkZXRhaWxzICovCisJZm9yIChhZGRyID0gMDsgYWRkciA8IDEyODsgYWRkcisrLCBiX2VlcHJvbSsrKQorCQkqYl9lZXByb20gPSB0cm1zMTA0MF9nZXRfZGF0YShpb19wb3J0LCBhZGRyKTsKKworCS8qIERpc2FibGUgU0VFUFJPTSAqLworCW91dGIoKGluYihpb19wb3J0ICsgVFJNX1MxMDQwX0dFTl9DT05UUk9MKSAmIH5FTl9FRVBST00pLAorCSAgICAgaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fQ09OVFJPTCk7Cit9CisKKworCisvKioKKyAqIGNoZWNrX2VlcHJvbSAtIGdldCBhbmQgY2hlY2sgY29udGVudHMgb2YgdGhlIGVlcHJvbQorICoKKyAqIFJlYWQgc2VlcHJvbSAxMjggYnl0ZXMgaW50byB0aGUgbWVtb3J5IHByb3ZpZGVyIGluIGVlcHJvbS4KKyAqIENoZWNrcyB0aGUgY2hlY2tzdW0gYW5kIGlmIGl0J3Mgbm90IGNvcnJlY3QgaXQgdXNlcyBhIHNldCBvZiBkZWZhdWx0CisgKiB2YWx1ZXMuCisgKgorICogQGVlcHJvbToJY2FsbGVyIGFsbG9jYXRlZCBzdHJjdXR1cmUgdG8gcmVhZCB0aGUgZWVwcm9tIGRhdGEgaW50bworICogQGlvX3BvcnQ6CWlvIHBvcnQgdG8gcmVhZCBmcm9tCisgKiovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgY2hlY2tfZWVwcm9tKHN0cnVjdCBOdlJhbVR5cGUgKmVlcHJvbSwgdW5zaWduZWQgbG9uZyBpb19wb3J0KQoreworCXUxNiAqd19lZXByb20gPSAodTE2ICopZWVwcm9tOworCXUxNiB3X2FkZHI7CisJdTE2IGNrc3VtOworCXUzMiBkX2FkZHI7CisJdTMyICpkX2VlcHJvbTsKKworCXRybXMxMDQwX3JlYWRfYWxsKGVlcHJvbSwgaW9fcG9ydCk7CS8qIHJlYWQgZWVwcm9tICovCisKKwlja3N1bSA9IDA7CisJZm9yICh3X2FkZHIgPSAwLCB3X2VlcHJvbSA9ICh1MTYgKillZXByb207IHdfYWRkciA8IDY0OworCSAgICAgd19hZGRyKyssIHdfZWVwcm9tKyspCisJCWNrc3VtICs9ICp3X2VlcHJvbTsKKwlpZiAoY2tzdW0gIT0gMHgxMjM0KSB7CisJCS8qCisJCSAqIENoZWNrc3VtIGlzIHdyb25nLgorCQkgKiBMb2FkIGEgc2V0IG9mIGRlZmF1bHRzIGludG8gdGhlIGVlcHJvbSBidWZmZXIKKwkJICovCisJCWRwcmludGtsKEtFUk5fV0FSTklORywKKwkJCSJFRVByb20gY2hlY2tzdW0gZXJyb3I6IHVzaW5nIGRlZmF1bHQgdmFsdWVzIGFuZCBvcHRpb25zLlxuIik7CisJCWVlcHJvbS0+c3ViX3ZlbmRvcl9pZFswXSA9ICh1OClQQ0lfVkVORE9SX0lEX1RFS1JBTTsKKwkJZWVwcm9tLT5zdWJfdmVuZG9yX2lkWzFdID0gKHU4KShQQ0lfVkVORE9SX0lEX1RFS1JBTSA+PiA4KTsKKwkJZWVwcm9tLT5zdWJfc3lzX2lkWzBdID0gKHU4KVBDSV9ERVZJQ0VfSURfVEVLUkFNX1RSTVMxMDQwOworCQllZXByb20tPnN1Yl9zeXNfaWRbMV0gPQorCQkgICAgKHU4KShQQ0lfREVWSUNFX0lEX1RFS1JBTV9UUk1TMTA0MCA+PiA4KTsKKwkJZWVwcm9tLT5zdWJfY2xhc3MgPSAweDAwOworCQllZXByb20tPnZlbmRvcl9pZFswXSA9ICh1OClQQ0lfVkVORE9SX0lEX1RFS1JBTTsKKwkJZWVwcm9tLT52ZW5kb3JfaWRbMV0gPSAodTgpKFBDSV9WRU5ET1JfSURfVEVLUkFNID4+IDgpOworCQllZXByb20tPmRldmljZV9pZFswXSA9ICh1OClQQ0lfREVWSUNFX0lEX1RFS1JBTV9UUk1TMTA0MDsKKwkJZWVwcm9tLT5kZXZpY2VfaWRbMV0gPQorCQkgICAgKHU4KShQQ0lfREVWSUNFX0lEX1RFS1JBTV9UUk1TMTA0MCA+PiA4KTsKKwkJZWVwcm9tLT5yZXNlcnZlZCA9IDB4MDA7CisKKwkJZm9yIChkX2FkZHIgPSAwLCBkX2VlcHJvbSA9ICh1MzIgKillZXByb20tPnRhcmdldDsKKwkJICAgICBkX2FkZHIgPCAxNjsgZF9hZGRyKyssIGRfZWVwcm9tKyspCisJCQkqZF9lZXByb20gPSAweDAwMDAwMDc3OwkvKiBjZmczLGNmZzIscGVyaW9kLGNmZzAgKi8KKworCQkqZF9lZXByb20rKyA9IDB4MDQwMDBGMDc7CS8qIG1heF90YWcsZGVsYXlfdGltZSxjaGFubmVsX2NmZyxzY3NpX2lkICovCisJCSpkX2VlcHJvbSsrID0gMHgwMDAwMDAxNTsJLyogcmVzZXJ2ZWQxLGJvb3RfbHVuLGJvb3RfdGFyZ2V0LHJlc2VydmVkMCAqLworCQlmb3IgKGRfYWRkciA9IDA7IGRfYWRkciA8IDEyOyBkX2FkZHIrKywgZF9lZXByb20rKykKKwkJCSpkX2VlcHJvbSA9IDB4MDA7CisKKwkJLyogTm93IGxvYWQgZGVmYXVsdHMgKG1heWJlIHNldCBieSBib290L21vZHVsZSBwYXJhbXMpICovCisJCXNldF9zYWZlX3NldHRpbmdzKCk7CisJCWZpeF9zZXR0aW5ncygpOworCQllZXByb21fb3ZlcnJpZGUoZWVwcm9tKTsKKworCQllZXByb20tPmNrc3VtID0gMHgwMDsKKwkJZm9yICh3X2FkZHIgPSAwLCBja3N1bSA9IDAsIHdfZWVwcm9tID0gKHUxNiAqKWVlcHJvbTsKKwkJICAgICB3X2FkZHIgPCA2Mzsgd19hZGRyKyssIHdfZWVwcm9tKyspCisJCQlja3N1bSArPSAqd19lZXByb207CisKKwkJKndfZWVwcm9tID0gMHgxMjM0IC0gY2tzdW07CisJCXRybXMxMDQwX3dyaXRlX2FsbChlZXByb20sIGlvX3BvcnQpOworCQllZXByb20tPmRlbGF5X3RpbWUgPSBjZmdfZGF0YVtDRkdfUkVTRVRfREVMQVldLnZhbHVlOworCX0gZWxzZSB7CisJCXNldF9zYWZlX3NldHRpbmdzKCk7CisJCWVlcHJvbV9pbmRleF90b19kZWxheShlZXByb20pOworCQllZXByb21fb3ZlcnJpZGUoZWVwcm9tKTsKKwl9Cit9CisKKworLyoqCisgKiBwcmludF9lZXByb21fc2V0dGluZ3MgLSBvdXRwdXQgdGhlIGVlcHJvbSBzZXR0aW5ncworICogdG8gdGhlIGtlcm5lbCBsb2cgc28gcGVvcGxlIGNhbiBzZWUgd2hhdCB0aGV5IHdlcmUuCisgKgorICogQGVlcHJvbTogVGhlIGVlcHJvbSBkYXRhIHN0cnVjdXRyZSB0byBzaG93IGRldGFpbHMgZm9yLgorICoqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHByaW50X2VlcHJvbV9zZXR0aW5ncyhzdHJ1Y3QgTnZSYW1UeXBlICplZXByb20pCit7CisJZHByaW50a2woS0VSTl9JTkZPLCAiVXNlZCBzZXR0aW5nczogQWRhcHRlcklEPSUwMmksIFNwZWVkPSVpKCUwMmkuJTAxaU1IeiksIGRldl9tb2RlPTB4JTAyeFxuIiwKKwkJZWVwcm9tLT5zY3NpX2lkLAorCQllZXByb20tPnRhcmdldFswXS5wZXJpb2QsCisJCWNsb2NrX3NwZWVkW2VlcHJvbS0+dGFyZ2V0WzBdLnBlcmlvZF0gLyAxMCwKKwkJY2xvY2tfc3BlZWRbZWVwcm9tLT50YXJnZXRbMF0ucGVyaW9kXSAlIDEwLAorCQllZXByb20tPnRhcmdldFswXS5jZmcwKTsKKwlkcHJpbnRrbChLRVJOX0lORk8sICIgICAgICAgICAgICAgICBBZGFwdE1vZGU9MHglMDJ4LCBUYWdzPSVpKCUwMmkpLCBEZWxheVJlc2V0PSVpc1xuIiwKKwkJZWVwcm9tLT5jaGFubmVsX2NmZywgZWVwcm9tLT5tYXhfdGFnLAorCQkxIDw8IGVlcHJvbS0+bWF4X3RhZywgZWVwcm9tLT5kZWxheV90aW1lKTsKK30KKworCisvKiBGcmVlIFNHIHRhYmxlcyAqLworc3RhdGljIHZvaWQgYWRhcHRlcl9zZ190YWJsZXNfZnJlZShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiKQoreworCWludCBpOworCWNvbnN0IHVuc2lnbmVkIHNyYnNfcGVyX3BhZ2UgPSBQQUdFX1NJWkUvU0VHTUVOVFhfTEVOOworCisJZm9yIChpID0gMDsgaSA8IERDMzk1eF9NQVhfU1JCX0NOVDsgaSArPSBzcmJzX3Blcl9wYWdlKQorCQlrZnJlZShhY2ItPnNyYl9hcnJheVtpXS5zZWdtZW50X3gpOworCisJdmZyZWUoYWNiLT5zcmJfYXJyYXlbMF0udmlydF9tYXApOworfQorCisKKy8qCisgKiBBbGxvY2F0ZSBTRyB0YWJsZXM7IGFzIHdlIGhhdmUgdG8gcGNpX21hcCB0aGVtLCBhbiBTRyBsaXN0IChzdHJ1Y3QgU0dlbnRyeSopCisgKiBzaG91bGQgbmV2ZXIgY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5ICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGFwdGVyX3NnX3RhYmxlc19hbGxvYyhzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiKQoreworCWNvbnN0IHVuc2lnbmVkIG1lbV9uZWVkZWQgPSAoREMzOTV4X01BWF9TUkJfQ05UKzEpCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICpTRUdNRU5UWF9MRU47CisJaW50IHBhZ2VzID0gKG1lbV9uZWVkZWQrKFBBR0VfU0laRS0xKSkvUEFHRV9TSVpFOworCWNvbnN0IHVuc2lnbmVkIHNyYnNfcGVyX3BhZ2UgPSBQQUdFX1NJWkUvU0VHTUVOVFhfTEVOOworCWludCBzcmJfaWR4ID0gMDsKKwl1bnNpZ25lZCBpID0gMDsKKwlzdHJ1Y3QgU0dlbnRyeSAqcHRyOworCXZvaWQgKip2aXJ0X2FycmF5OworCisJZm9yIChpID0gMDsgaSA8IERDMzk1eF9NQVhfU1JCX0NOVDsgaSsrKSB7CisJCWFjYi0+c3JiX2FycmF5W2ldLnNlZ21lbnRfeCA9IE5VTEw7CisJCWFjYi0+c3JiX2FycmF5W2ldLnZpcnRfbWFwID0gTlVMTDsKKwl9CisKKwlkcHJpbnRrZGJnKERCR18xLCAiQWxsb2NhdGUgJWkgcGFnZXMgZm9yIFNHIHRhYmxlc1xuIiwgcGFnZXMpOworCXdoaWxlIChwYWdlcy0tKSB7CisJCXB0ciA9IChzdHJ1Y3QgU0dlbnRyeSAqKWttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwdHIpIHsKKwkJCWFkYXB0ZXJfc2dfdGFibGVzX2ZyZWUoYWNiKTsKKwkJCXJldHVybiAxOworCQl9CisJCWRwcmludGtkYmcoREJHXzEsICJBbGxvY2F0ZSAlbGkgYnl0ZXMgYXQgJXAgZm9yIFNHIHNlZ21lbnRzICVpXG4iLAorCQkJUEFHRV9TSVpFLCBwdHIsIHNyYl9pZHgpOworCQlpID0gMDsKKwkJd2hpbGUgKGkgPCBzcmJzX3Blcl9wYWdlICYmIHNyYl9pZHggPCBEQzM5NXhfTUFYX1NSQl9DTlQpCisJCQlhY2ItPnNyYl9hcnJheVtzcmJfaWR4KytdLnNlZ21lbnRfeCA9CisJCQkgICAgcHRyICsgKGkrKyAqIERDMzk1eF9NQVhfU0dfTElTVEVOVFJZKTsKKwl9CisJaWYgKGkgPCBzcmJzX3Blcl9wYWdlKQorCQlhY2ItPnNyYi5zZWdtZW50X3ggPQorCQkgICAgcHRyICsgKGkgKiBEQzM5NXhfTUFYX1NHX0xJU1RFTlRSWSk7CisJZWxzZQorCQlkcHJpbnRrbChLRVJOX0RFQlVHLCAiTm8gc3BhY2UgZm9yIHRtc3JiIFNHIHRhYmxlIHJlc2VydmVkPyFcbiIpOworCisJdmlydF9hcnJheSA9IHZtYWxsb2MoKERDMzk1eF9NQVhfU1JCX0NOVCArIDEpICogREMzOTV4X01BWF9TR19MSVNURU5UUlkgKiBzaXplb2Yodm9pZCopKTsKKworCWlmICghdmlydF9hcnJheSkgeworCQlhZGFwdGVyX3NnX3RhYmxlc19mcmVlKGFjYik7CisJCXJldHVybiAxOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBEQzM5NXhfTUFYX1NSQl9DTlQgKyAxOyBpKyspIHsKKwkJYWNiLT5zcmJfYXJyYXlbaV0udmlydF9tYXAgPSB2aXJ0X2FycmF5OworCQl2aXJ0X2FycmF5ICs9IERDMzk1eF9NQVhfU0dfTElTVEVOVFJZOworCX0KKworCXJldHVybiAwOworfQorCisKKworLyoqCisgKiBhZGFwdGVyX3ByaW50X2NvbmZpZyAtIHByaW50IGFkYXB0ZXIgY29ubmVjdGlvbiBhbmQgdGVybWluYXRpb24KKyAqIGNvbmZpZworICoKKyAqIFRoZSBpbyBwb3J0IGluIHRoZSBhZGFwdGVyIG5lZWRzIHRvIGhhdmUgYmVlbiBzZXQgYmVmb3JlIGNhbGxpbmcKKyAqIHRoaXMgZnVuY3Rpb24uCisgKgorICogQGFjYjogVGhlIGFkYXB0ZXIgdG8gcHJpbnQgdGhlIGluZm9ybWF0aW9uIGZvci4KKyAqKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBhZGFwdGVyX3ByaW50X2NvbmZpZyhzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiKQoreworCXU4IGJ2YWw7CisKKwlidmFsID0gREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX0dFTl9TVEFUVVMpOworCWRwcmludGtsKEtFUk5fSU5GTywgIiVzQ29ubmVjdG9yczogIiwKKwkJKChidmFsICYgV0lERVNDU0kpID8gIihXaWRlKSAiIDogIiIpKTsKKwlpZiAoIShidmFsICYgQ09ONTA2OCkpCisJCXByaW50aygiZXh0JXMgIiwgIShidmFsICYgRVhUNjhISUdIKSA/ICI2OCIgOiAiNTAiKTsKKwlpZiAoIShidmFsICYgQ09ONjgpKQorCQlwcmludGsoImludDY4JXMgIiwgIShidmFsICYgSU5UNjhISUdIKSA/ICIiIDogIig1MCkiKTsKKwlpZiAoIShidmFsICYgQ09ONTApKQorCQlwcmludGsoImludDUwICIpOworCWlmICgoYnZhbCAmIChDT041MDY4IHwgQ09ONTAgfCBDT042OCkpID09CisJICAgIDAgLyooQ09ONTA2OCB8IENPTjUwIHwgQ09ONjgpICovICkKKwkJcHJpbnRrKCIgT29wcyEgKEFsbCAzPykgIik7CisJYnZhbCA9IERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9HRU5fQ09OVFJPTCk7CisJcHJpbnRrKCIgVGVybWluYXRpb246ICIpOworCWlmIChidmFsICYgRElTX1RFUk0pCisJCXByaW50aygiRGlzYWJsZWRcbiIpOworCWVsc2UgeworCQlpZiAoYnZhbCAmIEFVVE9URVJNKQorCQkJcHJpbnRrKCJBdXRvICIpOworCQlpZiAoYnZhbCAmIExPVzhURVJNKQorCQkJcHJpbnRrKCJMb3cgIik7CisJCWlmIChidmFsICYgVVA4VEVSTSkKKwkJCXByaW50aygiSGlnaCAiKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KK30KKworCisvKioKKyAqIGFkYXB0ZXJfaW5pdF9wYXJhbXMgLSBJbml0aWFsaXplIHRoZSB2YXJpb3VzIHBhcmFtZXRlcnMgaW4gdGhlCisgKiBhZGFwdGVyIHN0cnVjdHVyZS4gTm90ZSB0aGF0IHRoZSBwb2ludGVyIHRvIHRoZSBzY3NpX2hvc3QgaXMgc2V0CisgKiBlYXJseSAod2hlbiB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQpIGFuZCB0aGUgaW9fcG9ydCBhbmQgaXJxCisgKiB2YWx1ZXMgYXJlIHNldCBsYXRlciBhZnRlciB0aGV5IGhhdmUgYmVlbiByZXNlcnZlZC4gVGhpcyBqdXN0IGdldHMKKyAqIGV2ZXJ5dGhpbmcgc2V0IHRvIGEgZ29vZCBzdGFydGluZyBwb3NpdGlvbi4KKyAqCisgKiBUaGUgZWVwcm9tIHN0cnVjdHVyZSBpbiB0aGUgYWRhcHRlciBuZWVkcyB0byBoYXZlIGJlZW4gc2V0IGJlZm9yZQorICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIEBhY2I6IFRoZSBhZGFwdGVyIHRvIGluaXRpYWxpemUuCisgKiovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgYWRhcHRlcl9pbml0X3BhcmFtcyhzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiKQoreworCXN0cnVjdCBOdlJhbVR5cGUgKmVlcHJvbSA9ICZhY2ItPmVlcHJvbTsKKwlpbnQgaTsKKworCS8qIE5PVEU6IGFjYi0+c2NzaV9ob3N0IGlzIHNldCBhdCBzY3NpX2hvc3QvYWNiIGNyZWF0aW9uIHRpbWUgKi8KKwkvKiBOT1RFOiBhY2ItPmlvX3BvcnRfYmFzZSBpcyBzZXQgYXQgcG9ydCByZWdpc3RyYXRpb24gdGltZSAqLworCS8qIE5PVEU6IGFjYi0+aW9fcG9ydF9sZW4gaXMgc2V0IGF0IHBvcnQgcmVnaXN0cmF0aW9uIHRpbWUgKi8KKworCUlOSVRfTElTVF9IRUFEKCZhY2ItPmRjYl9saXN0KTsKKwlhY2ItPmRjYl9ydW5fcm9iaW4gPSBOVUxMOworCWFjYi0+YWN0aXZlX2RjYiA9IE5VTEw7CisKKwlJTklUX0xJU1RfSEVBRCgmYWNiLT5zcmJfZnJlZV9saXN0KTsKKwkvKiAgdGVtcCBTUkIgZm9yIFEgdGFnIHVzZWQgb3IgYWJvcnQgY29tbWFuZCB1c2VkICAqLworCWFjYi0+dG1wX3NyYiA9ICZhY2ItPnNyYjsKKwlpbml0X3RpbWVyKCZhY2ItPndhaXRpbmdfdGltZXIpOworCWluaXRfdGltZXIoJmFjYi0+c2VsdG9fdGltZXIpOworCisJYWNiLT5zcmJfY291bnQgPSBEQzM5NXhfTUFYX1NSQl9DTlQ7CisKKwlhY2ItPnNlbF90aW1lb3V0ID0gREMzOTV4X1NFTF9USU1FT1VUOwkvKiB0aW1lb3V0PTI1MG1zICovCisJLyogTk9URTogYWNiLT5pcnFfbGV2ZWwgaXMgc2V0IGF0IElSUSByZWdpc3RyYXRpb24gdGltZSAqLworCisJYWNiLT50YWdfbWF4X251bSA9IDEgPDwgZWVwcm9tLT5tYXhfdGFnOworCWlmIChhY2ItPnRhZ19tYXhfbnVtID4gMzApCisJCWFjYi0+dGFnX21heF9udW0gPSAzMDsKKworCWFjYi0+YWNiX2ZsYWcgPSAwOwkvKiBSRVNFVF9ERVRFQ1QsIFJFU0VUX0RPTkUsIFJFU0VUX0RFViAqLworCWFjYi0+Z21vZGUyID0gZWVwcm9tLT5jaGFubmVsX2NmZzsKKwlhY2ItPmNvbmZpZyA9IDA7CS8qIE5PVEU6IGFjdHVhbGx5IHNldCBpbiBhZGFwdGVyX2luaXRfY2hpcCAqLworCisJaWYgKGVlcHJvbS0+Y2hhbm5lbF9jZmcgJiBOQUNfU0NBTkxVTikKKwkJYWNiLT5sdW5fY2hrID0gMTsKKwlhY2ItPnNjYW5fZGV2aWNlcyA9IDE7CisKKwlhY2ItPnNjc2lfaG9zdC0+dGhpc19pZCA9IGVlcHJvbS0+c2NzaV9pZDsKKwlhY2ItPmhvc3RpZF9iaXQgPSAoMSA8PCBhY2ItPnNjc2lfaG9zdC0+dGhpc19pZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgREMzOTV4X01BWF9TQ1NJX0lEOyBpKyspCisJCWFjYi0+ZGNiX21hcFtpXSA9IDA7CisKKwlhY2ItPm1zZ19sZW4gPSAwOworCQorCS8qIGxpbmsgc3RhdGljIGFycmF5IG9mIHNyYnMgaW50byB0aGUgc3JiIGZyZWUgbGlzdCAqLworCWZvciAoaSA9IDA7IGkgPCBhY2ItPnNyYl9jb3VudCAtIDE7IGkrKykKKwkJc3JiX2ZyZWVfaW5zZXJ0KGFjYiwgJmFjYi0+c3JiX2FycmF5W2ldKTsKK30KKworCisvKioKKyAqIGFkYXB0ZXJfaW5pdF9ob3N0IC0gSW5pdGlhbGl6ZSB0aGUgc2NzaSBob3N0IGluc3RhbmNlIGJhc2VkIG9uCisgKiB2YWx1ZXMgdGhhdCB3ZSBoYXZlIGFscmVhZHkgc3RvcmVkIGluIHRoZSBhZGFwdGVyIGluc3RhbmNlLiBUaGVyZSdzCisgKiBzb21lIG1lbnRpb24gdGhhdCBhIGxvdCBvZiB0aGVzZSBhcmUgZGVwcmVjYXRlZCwgc28gd2Ugd29uJ3QgdXNlCisgKiB0aGVtICh3ZSdsbCB1c2UgdGhlIG9uZXMgaW4gdGhlIGFkYXB0ZXIgaW5zdGFuY2UpIGJ1dCB3ZSdsbCBmaWxsCisgKiB0aGVtIGluIGluIGNhc2Ugc29tZXRoaW5nIGVsc2UgbmVlZHMgdGhlbS4KKyAqCisgKiBUaGUgZWVwcm9tIHN0cnVjdHVyZSwgaXJxIGFuZCBpbyBwb3J0cyBpbiB0aGUgYWRhcHRlciBuZWVkIHRvIGhhdmUKKyAqIGJlZW4gc2V0IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICogQGhvc3Q6IFRoZSBzY3NpIGhvc3QgaW5zdGFuY2UgdG8gZmlsbCBpbiB0aGUgdmFsdWVzIGZvci4KKyAqKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBhZGFwdGVyX2luaXRfc2NzaV9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisgICAgICAgIHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IgPSAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKilob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgTnZSYW1UeXBlICplZXByb20gPSAmYWNiLT5lZXByb207CisgICAgICAgIAorCWhvc3QtPm1heF9jbWRfbGVuID0gMjQ7CisJaG9zdC0+Y2FuX3F1ZXVlID0gREMzOTV4X01BWF9DTURfUVVFVUU7CisJaG9zdC0+Y21kX3Blcl9sdW4gPSBEQzM5NXhfTUFYX0NNRF9QRVJfTFVOOworCWhvc3QtPnRoaXNfaWQgPSAoaW50KWVlcHJvbS0+c2NzaV9pZDsKKwlob3N0LT5pb19wb3J0ID0gYWNiLT5pb19wb3J0X2Jhc2U7CisJaG9zdC0+bl9pb19wb3J0ID0gYWNiLT5pb19wb3J0X2xlbjsKKwlob3N0LT5kbWFfY2hhbm5lbCA9IC0xOworCWhvc3QtPnVuaXF1ZV9pZCA9IGFjYi0+aW9fcG9ydF9iYXNlOworCWhvc3QtPmlycSA9IGFjYi0+aXJxX2xldmVsOworCWhvc3QtPmxhc3RfcmVzZXQgPSBqaWZmaWVzOworCisJaG9zdC0+bWF4X2lkID0gMTY7CisJaWYgKGhvc3QtPm1heF9pZCAtIDEgPT0gZWVwcm9tLT5zY3NpX2lkKQorCQlob3N0LT5tYXhfaWQtLTsKKworI2lmZGVmIENPTkZJR19TQ1NJX01VTFRJX0xVTgorCWlmIChlZXByb20tPmNoYW5uZWxfY2ZnICYgTkFDX1NDQU5MVU4pCisJCWhvc3QtPm1heF9sdW4gPSA4OworCWVsc2UKKwkJaG9zdC0+bWF4X2x1biA9IDE7CisjZWxzZQorCWhvc3QtPm1heF9sdW4gPSAxOworI2VuZGlmCisKK30KKworCisvKioKKyAqIGFkYXB0ZXJfaW5pdF9jaGlwIC0gR2V0IHRoZSBjaGlwIGludG8gYSBrbm93IHN0YXRlIGFuZCBmaWd1cmUgb3V0CisgKiBzb21lIG9mIHRoZSBzZXR0aW5ncyB0aGF0IGFwcGx5IHRvIHRoaXMgYWRhcHRlci4KKyAqCisgKiBUaGUgaW8gcG9ydCBpbiB0aGUgYWRhcHRlciBuZWVkcyB0byBoYXZlIGJlZW4gc2V0IGJlZm9yZSBjYWxsaW5nCisgKiB0aGlzIGZ1bmN0aW9uLiBUaGUgY29uZmlnIHdpbGwgYmUgY29uZmlndXJlZCBjb3JyZWN0bHkgb24gcmV0dXJuLgorICoKKyAqIEBhY2I6IFRoZSBhZGFwdGVyIHdoaWNoIHdlIGFyZSB0byBpbml0LgorICoqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGFkYXB0ZXJfaW5pdF9jaGlwKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IpCit7CisgICAgICAgIHN0cnVjdCBOdlJhbVR5cGUgKmVlcHJvbSA9ICZhY2ItPmVlcHJvbTsKKyAgICAgICAgCisgICAgICAgIC8qIE1hc2sgYWxsIHRoZSBpbnRlcnJ1cHQgKi8KKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX0RNQV9JTlRFTiwgMHgwMCk7CisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0lOVEVOLCAweDAwKTsKKworCS8qIFJlc2V0IFNDU0kgbW9kdWxlICovCisJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19SU1RNT0RVTEUpOworCisJLyogUmVzZXQgUENJL0RNQSBtb2R1bGUgKi8KKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX0RNQV9DT05UUk9MLCBETUFSRVNFVE1PRFVMRSk7CisJdWRlbGF5KDIwKTsKKworCS8qIHByb2dyYW0gY29uZmlndXJhdGlvbiAwICovCisJYWNiLT5jb25maWcgPSBIQ0NfQVVUT1RFUk0gfCBIQ0NfUEFSSVRZOworCWlmIChEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfR0VOX1NUQVRVUykgJiBXSURFU0NTSSkKKwkJYWNiLT5jb25maWcgfD0gSENDX1dJREVfQ0FSRDsKKworCWlmIChlZXByb20tPmNoYW5uZWxfY2ZnICYgTkFDX1BPV0VST05fU0NTSV9SRVNFVCkKKwkJYWNiLT5jb25maWcgfD0gSENDX1NDU0lfUkVTRVQ7CisKKwlpZiAoYWNiLT5jb25maWcgJiBIQ0NfU0NTSV9SRVNFVCkgeworCQlkcHJpbnRrbChLRVJOX0lORk8sICJQZXJmb3JtaW5nIGluaXRpYWwgU0NTSSBidXMgcmVzZXRcbiIpOworCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09OVFJPTCwgRE9fUlNUU0NTSSk7CisKKwkJLyp3aGlsZSAoISggREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfSU5UU1RBVFVTKSAmIElOVF9TQ1NJUkVTRVQgKSk7ICovCisJCS8qc3Bpbl91bmxvY2tfaXJxICgmaW9fcmVxdWVzdF9sb2NrKTsgKi8KKwkJdWRlbGF5KDUwMCk7CisKKwkJYWNiLT5zY3NpX2hvc3QtPmxhc3RfcmVzZXQgPQorCQkgICAgamlmZmllcyArIEhaIC8gMiArCisJCSAgICBIWiAqIGFjYi0+ZWVwcm9tLmRlbGF5X3RpbWU7CisKKwkJLypzcGluX2xvY2tfaXJxICgmaW9fcmVxdWVzdF9sb2NrKTsgKi8KKwl9Cit9CisKKworLyoqCisgKiBpbml0X2FkYXB0ZXIgLSBHcmFiIHRoZSByZXNvdXJjZSBmb3IgdGhlIGNhcmQsIHNldHVwIHRoZSBhZGFwdGVyCisgKiBpbmZvcm1hdGlvbiwgc2V0IHRoZSBjYXJkIGludG8gYSBrbm93biBzdGF0ZSwgY3JlYXRlIHRoZSB2YXJpb3VzCisgKiB0YWJsZXMgZXRjIGV0Yy4gVGhpcyBiYXNpY2FsbHkgZ2V0cyBhbGwgYWRhcHRlciBpbmZvcm1hdGlvbiBhbGwgdXAKKyAqIHRvIGRhdGUsIGludGlhbGlzZWQgYW5kIGdldHMgdGhlIGNoaXAgaW4gc3luYyB3aXRoIGl0LgorICoKKyAqIEBob3N0OglUaGlzIGhvc3RzIGFkYXB0ZXIgc3RydWN0dXJlCisgKiBAaW9fcG9ydDoJVGhlIGJhc2UgSS9PIHBvcnQKKyAqIEBpcnE6CUlSUQorICoKKyAqIFJldHVybnMgMCBpZiB0aGUgaW5pdGlhbGl6YXRpb24gc3VjY2VlZHMsIGFueSBvdGhlciB2YWx1ZSBvbgorICogZmFpbHVyZS4KKyAqKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkYXB0ZXJfaW5pdChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLAorCXVuc2lnbmVkIGxvbmcgaW9fcG9ydCwgdTMyIGlvX3BvcnRfbGVuLCB1bnNpZ25lZCBpbnQgaXJxKQoreworCWlmICghcmVxdWVzdF9yZWdpb24oaW9fcG9ydCwgaW9fcG9ydF9sZW4sIERDMzk1WF9OQU1FKSkgeworCQlkcHJpbnRrbChLRVJOX0VSUiwgIkZhaWxlZCB0byByZXNlcnZlIElPIHJlZ2lvbiAweCVseFxuIiwgaW9fcG9ydCk7CisJCWdvdG8gZmFpbGVkOworCX0KKwkvKiBzdG9yZSBwb3J0IGJhc2UgdG8gaW5kaWNhdGUgd2UgaGF2ZSByZWdpc3RlcmVkIGl0ICovCisJYWNiLT5pb19wb3J0X2Jhc2UgPSBpb19wb3J0OworCWFjYi0+aW9fcG9ydF9sZW4gPSBpb19wb3J0X2xlbjsKKwkKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBkYzM5NXhfaW50ZXJydXB0LCBTQV9TSElSUSwgREMzOTVYX05BTUUsIGFjYikpIHsKKwkgICAgCS8qIHJlbGVhc2UgdGhlIHJlZ2lvbiB3ZSBqdXN0IGNsYWltZWQgKi8KKwkJZHByaW50a2woS0VSTl9JTkZPLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIElSUVxuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKwkvKiBzdG9yZSBpcnEgdG8gaW5kaWNhdGUgd2UgaGF2ZSByZWdpc3RlcmVkIGl0ICovCisJYWNiLT5pcnFfbGV2ZWwgPSBpcnE7CisKKwkvKiBnZXQgZWVwcm9tIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYW5kIGNvbW1hbmQgbGluZSBzZXR0aW5ncyBldGMgKi8KKwljaGVja19lZXByb20oJmFjYi0+ZWVwcm9tLCBpb19wb3J0KTsKKyAJcHJpbnRfZWVwcm9tX3NldHRpbmdzKCZhY2ItPmVlcHJvbSk7CisKKwkvKiBzZXR1cCBhZGFwdGVyIGNvbnRyb2wgYmxvY2sgKi8JCisJYWRhcHRlcl9pbml0X3BhcmFtcyhhY2IpOworCQorCS8qIGRpc3BsYXkgY2FyZCBjb25uZWN0b3JzL3Rlcm1pbmF0aW9uIHNldHRpbmdzICovCisgCWFkYXB0ZXJfcHJpbnRfY29uZmlnKGFjYik7CisKKwlpZiAoYWRhcHRlcl9zZ190YWJsZXNfYWxsb2MoYWNiKSkgeworCQlkcHJpbnRrbChLRVJOX0RFQlVHLCAiTWVtb3J5IGFsbG9jYXRpb24gZm9yIFNHIHRhYmxlcyBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJYWRhcHRlcl9pbml0X3Njc2lfaG9zdChhY2ItPnNjc2lfaG9zdCk7CisJYWRhcHRlcl9pbml0X2NoaXAoYWNiKTsKKwlzZXRfYmFzaWNfY29uZmlnKGFjYik7CisKKwlkcHJpbnRrZGJnKERCR18wLAorCQkiYWRhcHRlcl9pbml0OiBhY2I9JXAsIHBkY2JfbWFwPSVwIHBzcmJfYXJyYXk9JXAgIgorCQkic2l6ZXthY2I9MHglMDR4IGRjYj0weCUwNHggc3JiPTB4JTA0eH1cbiIsCisJCWFjYiwgYWNiLT5kY2JfbWFwLCBhY2ItPnNyYl9hcnJheSwgc2l6ZW9mKHN0cnVjdCBBZGFwdGVyQ3RsQmxrKSwKKwkJc2l6ZW9mKHN0cnVjdCBEZXZpY2VDdGxCbGspLCBzaXplb2Yoc3RydWN0IFNjc2lSZXFCbGspKTsKKwlyZXR1cm4gMDsKKworZmFpbGVkOgorCWlmIChhY2ItPmlycV9sZXZlbCkKKwkJZnJlZV9pcnEoYWNiLT5pcnFfbGV2ZWwsIGFjYik7CisJaWYgKGFjYi0+aW9fcG9ydF9iYXNlKQorCQlyZWxlYXNlX3JlZ2lvbihhY2ItPmlvX3BvcnRfYmFzZSwgYWNiLT5pb19wb3J0X2xlbik7CisJYWRhcHRlcl9zZ190YWJsZXNfZnJlZShhY2IpOworCisJcmV0dXJuIDE7Cit9CisKKworLyoqCisgKiBhZGFwdGVyX3VuaW5pdF9jaGlwIC0gY2xlYW5seSBzaHV0IGRvd24gdGhlIHNjc2kgY29udHJvbGxlciBjaGlwLAorICogc3RvcHBpbmcgYWxsIG9wZXJhdGlvbnMgYW5kIGRpc2FibGluZyBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBvbiB0aGUKKyAqIGNhcmQuCisgKgorICogQGFjYjogVGhlIGFkYXB0ZXIgd2hpY2ggd2UgYXJlIHRvIHNodXRkb3duLgorICoqLworc3RhdGljIHZvaWQgYWRhcHRlcl91bmluaXRfY2hpcChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiKQoreworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfRE1BX0lOVEVOLCAwKTsKKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfSU5URU4sIDApOworCisJLyogcmVzZXQgdGhlIHNjc2kgYnVzICovCisJaWYgKGFjYi0+Y29uZmlnICYgSENDX1NDU0lfUkVTRVQpCisJCXJlc2V0X3Njc2lfYnVzKGFjYik7CisKKwkvKiBjbGVhciBhbnkgcGVuZGluZyBpbnRlcnVwdCBzdGF0ZSAqLworCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0lOVFNUQVRVUyk7Cit9CisKKworCisvKioKKyAqIGFkYXB0ZXJfdW5pbml0IC0gU2h1dCBkb3duIHRoZSBjaGlwIGFuZCByZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdAorICogd2UgaGFkIGFsbG9jYXRlZC4gT25jZSB0aGlzIHJldHVybnMgdGhlIGFkYXB0ZXIgc2hvdWxkIG5vdCBiZSB1c2VkCisgKiBhbnltb3JlLgorICoKKyAqIEBhY2I6IFRoZSBhZGFwdGVyIHdoaWNoIHdlIGFyZSB0byB1bi1pbml0aWFsaXplLgorICoqLworc3RhdGljIHZvaWQgYWRhcHRlcl91bmluaXQoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCURDMzk1eF9MT0NLX0lPKGFjYi0+c2NzaV9ob3N0LCBmbGFncyk7CisKKwkvKiByZW1vdmUgdGltZXJzICovCisJaWYgKHRpbWVyX3BlbmRpbmcoJmFjYi0+d2FpdGluZ190aW1lcikpCisJCWRlbF90aW1lcigmYWNiLT53YWl0aW5nX3RpbWVyKTsKKwlpZiAodGltZXJfcGVuZGluZygmYWNiLT5zZWx0b190aW1lcikpCisJCWRlbF90aW1lcigmYWNiLT5zZWx0b190aW1lcik7CisKKwlhZGFwdGVyX3VuaW5pdF9jaGlwKGFjYik7CisJYWRhcHRlcl9yZW1vdmVfYW5kX2ZyZWVfYWxsX2RldmljZXMoYWNiKTsKKwlEQzM5NXhfVU5MT0NLX0lPKGFjYi0+c2NzaV9ob3N0LCBmbGFncyk7CisKKwlpZiAoYWNiLT5pcnFfbGV2ZWwpCisJCWZyZWVfaXJxKGFjYi0+aXJxX2xldmVsLCBhY2IpOworCWlmIChhY2ItPmlvX3BvcnRfYmFzZSkKKwkJcmVsZWFzZV9yZWdpb24oYWNiLT5pb19wb3J0X2Jhc2UsIGFjYi0+aW9fcG9ydF9sZW4pOworCisJYWRhcHRlcl9zZ190YWJsZXNfZnJlZShhY2IpOworfQorCisKKyN1bmRlZiBTUFJJTlRGCisjZGVmaW5lIFNQUklOVEYoYXJncy4uLikgcG9zICs9IHNwcmludGYocG9zLCBhcmdzKQorCisjdW5kZWYgWUVTTk8KKyNkZWZpbmUgWUVTTk8oWU4pIFwKKyBpZiAoWU4pIFNQUklOVEYoIiBZZXMgIik7XAorIGVsc2UgU1BSSU5URigiIE5vICAiKQorCitzdGF0aWMgaW50IGRjMzk1eF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgY2hhciAqYnVmZmVyLAorCQljaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworCXN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IgPSAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKilob3N0LT5ob3N0ZGF0YTsKKwlpbnQgc3BkLCBzcGQxOworCWNoYXIgKnBvcyA9IGJ1ZmZlcjsKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZGV2OworCisJaWYgKGlub3V0KQkJLyogSGFzIGRhdGEgYmVlbiB3cml0dGVuIHRvIHRoZSBmaWxlID8gKi8KKwkJcmV0dXJuIC1FUEVSTTsKKworCVNQUklOVEYoREMzOTVYX0JBTk5FUiAiIFBDSSBTQ1NJIEhvc3QgQWRhcHRlclxuIik7CisJU1BSSU5URigiIERyaXZlciBWZXJzaW9uICIgREMzOTVYX1ZFUlNJT04gIlxuIik7CisKKwlEQzM5NXhfTE9DS19JTyhhY2ItPnNjc2lfaG9zdCwgZmxhZ3MpOworCisJU1BSSU5URigiU0NTSSBIb3N0IE5yICVpLCAiLCBob3N0LT5ob3N0X25vKTsKKwlTUFJJTlRGKCJEQzM5NVUvVVcvRiBEQzMxNS9VICVzXG4iLAorCQkoYWNiLT5jb25maWcgJiBIQ0NfV0lERV9DQVJEKSA/ICJXaWRlIiA6ICIiKTsKKwlTUFJJTlRGKCJpb19wb3J0X2Jhc2UgMHglMDRseCwgIiwgYWNiLT5pb19wb3J0X2Jhc2UpOworCVNQUklOVEYoImlycV9sZXZlbCAweCUwNHgsICIsIGFjYi0+aXJxX2xldmVsKTsKKwlTUFJJTlRGKCIgU2VsVGltZW91dCAlaW1zXG4iLCAoMTYzOCAqIGFjYi0+c2VsX3RpbWVvdXQpIC8gMTAwMCk7CisKKwlTUFJJTlRGKCJNYXhJRCAlaSwgTWF4TFVOICVpLCAiLCBob3N0LT5tYXhfaWQsIGhvc3QtPm1heF9sdW4pOworCVNQUklOVEYoIkFkYXB0ZXJJRCAlaVxuIiwgaG9zdC0+dGhpc19pZCk7CisKKwlTUFJJTlRGKCJ0YWdfbWF4X251bSAlaSIsIGFjYi0+dGFnX21heF9udW0pOworCS8qU1BSSU5URigiLCBETUFfU3RhdHVzICVpXG4iLCBEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfRE1BX1NUQVRVUykpOyAqLworCVNQUklOVEYoIiwgRmlsdGVyQ2ZnIDB4JTAyeCIsCisJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTkZJRzEpKTsKKwlTUFJJTlRGKCIsIERlbGF5UmVzZXQgJWlzXG4iLCBhY2ItPmVlcHJvbS5kZWxheV90aW1lKTsKKwkvKlNQUklOVEYoIlxuIik7ICovCisKKwlTUFJJTlRGKCJOciBvZiBEQ0JzOiAlaVxuIiwgbGlzdF9zaXplKCZhY2ItPmRjYl9saXN0KSk7CisJU1BSSU5URgorCSAgICAoIk1hcCBvZiBhdHRhY2hlZCBMVU5zOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJICAgICBhY2ItPmRjYl9tYXBbMF0sIGFjYi0+ZGNiX21hcFsxXSwgYWNiLT5kY2JfbWFwWzJdLAorCSAgICAgYWNiLT5kY2JfbWFwWzNdLCBhY2ItPmRjYl9tYXBbNF0sIGFjYi0+ZGNiX21hcFs1XSwKKwkgICAgIGFjYi0+ZGNiX21hcFs2XSwgYWNiLT5kY2JfbWFwWzddKTsKKwlTUFJJTlRGCisJICAgICgiICAgICAgICAgICAgICAgICAgICAgICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkgICAgIGFjYi0+ZGNiX21hcFs4XSwgYWNiLT5kY2JfbWFwWzldLCBhY2ItPmRjYl9tYXBbMTBdLAorCSAgICAgYWNiLT5kY2JfbWFwWzExXSwgYWNiLT5kY2JfbWFwWzEyXSwgYWNiLT5kY2JfbWFwWzEzXSwKKwkgICAgIGFjYi0+ZGNiX21hcFsxNF0sIGFjYi0+ZGNiX21hcFsxNV0pOworCisJU1BSSU5URgorCSAgICAoIlVuIElEIExVTiBQcnR5IFN5bmMgV2lkZSBEc0NuIFNuZFMgVGFnUSBuZWdvX3BlcmlvZCBTeW5jRnJlcSBTeW5jT2ZmcyBNYXhDbWRcbiIpOworCisJZGV2ID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRjYiwgJmFjYi0+ZGNiX2xpc3QsIGxpc3QpIHsKKwkJaW50IG5lZ29fcGVyaW9kOworCQlTUFJJTlRGKCIlMDJpICUwMmkgICUwMmkgIiwgZGV2LCBkY2ItPnRhcmdldF9pZCwKKwkJCWRjYi0+dGFyZ2V0X2x1bik7CisJCVlFU05PKGRjYi0+ZGV2X21vZGUgJiBOVENfRE9fUEFSSVRZX0NISyk7CisJCVlFU05PKGRjYi0+c3luY19vZmZzZXQpOworCQlZRVNOTyhkY2ItPnN5bmNfcGVyaW9kICYgV0lERV9TWU5DKTsKKwkJWUVTTk8oZGNiLT5kZXZfbW9kZSAmIE5UQ19ET19ESVNDT05ORUNUKTsKKwkJWUVTTk8oZGNiLT5kZXZfbW9kZSAmIE5UQ19ET19TRU5EX1NUQVJUKTsKKwkJWUVTTk8oZGNiLT5zeW5jX21vZGUgJiBFTl9UQUdfUVVFVUVJTkcpOworCQluZWdvX3BlcmlvZCA9IGNsb2NrX3BlcmlvZFtkY2ItPnN5bmNfcGVyaW9kICYgMHgwN10gPDwgMjsKKwkJaWYgKGRjYi0+c3luY19vZmZzZXQpCisJCQlTUFJJTlRGKCIgICUwM2kgbnMgIiwgbmVnb19wZXJpb2QpOworCQllbHNlCisJCQlTUFJJTlRGKCIgKCUwM2kgbnMpIiwgKGRjYi0+bWluX25lZ29fcGVyaW9kIDw8IDIpKTsKKworCQlpZiAoZGNiLT5zeW5jX29mZnNldCAmIDB4MGYpIHsKKwkJCXNwZCA9IDEwMDAgLyAobmVnb19wZXJpb2QpOworCQkJc3BkMSA9IDEwMDAgJSAobmVnb19wZXJpb2QpOworCQkJc3BkMSA9IChzcGQxICogMTAgKyBuZWdvX3BlcmlvZCAvIDIpIC8gKG5lZ29fcGVyaW9kKTsKKwkJCVNQUklOVEYoIiAgICUyaS4lMWkgTSAgICAgJTAyaSAiLCBzcGQsIHNwZDEsCisJCQkJKGRjYi0+c3luY19vZmZzZXQgJiAweDBmKSk7CisJCX0gZWxzZQorCQkJU1BSSU5URigiICAgICAgICAgICAgICAgICAiKTsKKworCQkvKiBBZGQgbW9yZSBpbmZvIC4uLiAqLworCQlTUFJJTlRGKCIgICAgICUwMmlcbiIsIGRjYi0+bWF4X2NvbW1hbmQpOworCQlkZXYrKzsKKwl9CisKKwlpZiAodGltZXJfcGVuZGluZygmYWNiLT53YWl0aW5nX3RpbWVyKSkKKwkJU1BSSU5URigiV2FpdGluZyBxdWV1ZSB0aW1lciBydW5uaW5nXG4iKTsKKwllbHNlCisJCVNQUklOVEYoIlxuIik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRjYiwgJmFjYi0+ZGNiX2xpc3QsIGxpc3QpIHsKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnNyYjsKKwkJaWYgKCFsaXN0X2VtcHR5KCZkY2ItPnNyYl93YWl0aW5nX2xpc3QpKQorCQkJU1BSSU5URigiRENCICglMDJpLSVpKTogV2FpdGluZzogJWk6IiwKKwkJCQlkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuLAorCQkJCWxpc3Rfc2l6ZSgmZGNiLT5zcmJfd2FpdGluZ19saXN0KSk7CisgICAgICAgICAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeShzcmIsICZkY2ItPnNyYl93YWl0aW5nX2xpc3QsIGxpc3QpCisJCQlTUFJJTlRGKCIgJWxpIiwgc3JiLT5jbWQtPnBpZCk7CisJCWlmICghbGlzdF9lbXB0eSgmZGNiLT5zcmJfZ29pbmdfbGlzdCkpCisJCQlTUFJJTlRGKCJcbkRDQiAoJTAyaS0laSk6IEdvaW5nICA6ICVpOiIsCisJCQkJZGNiLT50YXJnZXRfaWQsIGRjYi0+dGFyZ2V0X2x1biwKKwkJCQlsaXN0X3NpemUoJmRjYi0+c3JiX2dvaW5nX2xpc3QpKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShzcmIsICZkY2ItPnNyYl9nb2luZ19saXN0LCBsaXN0KQorCQkJU1BSSU5URigiICVsaSIsIHNyYi0+Y21kLT5waWQpOworCQlpZiAoIWxpc3RfZW1wdHkoJmRjYi0+c3JiX3dhaXRpbmdfbGlzdCkgfHwgIWxpc3RfZW1wdHkoJmRjYi0+c3JiX2dvaW5nX2xpc3QpKQorCQkJU1BSSU5URigiXG4iKTsKKwl9CisKKwlpZiAoZGVidWdfZW5hYmxlZChEQkdfMSkpIHsKKwkJU1BSSU5URigiRENCIGxpc3QgZm9yIEFDQiAlcDpcbiIsIGFjYik7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGNiLCAmYWNiLT5kY2JfbGlzdCwgbGlzdCkgeworCQkJU1BSSU5URigiJXAgLT4gIiwgZGNiKTsKKwkJfQorCQlTUFJJTlRGKCJFTkRcbiIpOworCX0KKworCSpzdGFydCA9IGJ1ZmZlciArIG9mZnNldDsKKwlEQzM5NXhfVU5MT0NLX0lPKGFjYi0+c2NzaV9ob3N0LCBmbGFncyk7CisKKwlpZiAocG9zIC0gYnVmZmVyIDwgb2Zmc2V0KQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChwb3MgLSBidWZmZXIgLSBvZmZzZXQgPCBsZW5ndGgpCisJCXJldHVybiBwb3MgLSBidWZmZXIgLSBvZmZzZXQ7CisJZWxzZQorCQlyZXR1cm4gbGVuZ3RoOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRjMzk1eF9kcml2ZXJfdGVtcGxhdGUgPSB7CisJLm1vZHVsZSAgICAgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkucHJvY19uYW1lICAgICAgICAgICAgICA9IERDMzk1WF9OQU1FLAorCS5wcm9jX2luZm8gICAgICAgICAgICAgID0gZGMzOTV4X3Byb2NfaW5mbywKKwkubmFtZSAgICAgICAgICAgICAgICAgICA9IERDMzk1WF9CQU5ORVIgIiAiIERDMzk1WF9WRVJTSU9OLAorCS5xdWV1ZWNvbW1hbmQgICAgICAgICAgID0gZGMzOTV4X3F1ZXVlX2NvbW1hbmQsCisJLmJpb3NfcGFyYW0gICAgICAgICAgICAgPSBkYzM5NXhfYmlvc19wYXJhbSwKKwkuc2xhdmVfYWxsb2MgICAgICAgICAgICA9IGRjMzk1eF9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfZGVzdHJveSAgICAgICAgICA9IGRjMzk1eF9zbGF2ZV9kZXN0cm95LAorCS5jYW5fcXVldWUgICAgICAgICAgICAgID0gREMzOTV4X01BWF9DQU5fUVVFVUUsCisJLnRoaXNfaWQgICAgICAgICAgICAgICAgPSA3LAorCS5zZ190YWJsZXNpemUgICAgICAgICAgID0gREMzOTV4X01BWF9TR19UQUJMRVNJWkUsCisJLmNtZF9wZXJfbHVuICAgICAgICAgICAgPSBEQzM5NXhfTUFYX0NNRF9QRVJfTFVOLAorCS5laF9hYm9ydF9oYW5kbGVyICAgICAgID0gZGMzOTV4X2VoX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlciAgID0gZGMzOTV4X2VoX2J1c19yZXNldCwKKwkudW5jaGVja2VkX2lzYV9kbWEgICAgICA9IDAsCisJLnVzZV9jbHVzdGVyaW5nICAgICAgICAgPSBESVNBQkxFX0NMVVNURVJJTkcsCit9OworCisKKy8qKgorICogYmFubmVyX2Rpc3BsYXkgLSBEaXNwbGF5IGJhbm5lciBvbiBmaXJzdCBpbnN0YW5jZSBvZiBkcml2ZXIKKyAqIGluaXRpYWxpemVkLgorICoqLworc3RhdGljIHZvaWQgYmFubmVyX2Rpc3BsYXkodm9pZCkKK3sKKwlzdGF0aWMgaW50IGJhbm5lcl9kb25lID0gMDsKKwlpZiAoIWJhbm5lcl9kb25lKQorCXsKKwkJZHByaW50a2woS0VSTl9JTkZPLCAiJXMgJXNcbiIsIERDMzk1WF9CQU5ORVIsIERDMzk1WF9WRVJTSU9OKTsKKwkJYmFubmVyX2RvbmUgPSAxOworCX0KK30KKworCisvKioKKyAqIGRjMzk1eF9pbml0X29uZSAtIEluaXRpYWxpc2UgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIuCisgKgorICogVGhlIFBDSSBsYXllciB3aWxsIGNhbGwgdGhpcyBvbmNlIGZvciBlYWNoIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyCisgKiB0aGF0IGl0IGZpbmRzIGluIHRoZSBzeXN0ZW0uIFRoZSBwY2lfZGV2IHN0cmN1dHVyZSBpbmRpY2F0ZXMgd2hpY2gKKyAqIGluc3RhbmNlIHdlIGFyZSBiZWluZyBjYWxsZWQgZnJvbS4KKyAqIAorICogQGRldjogVGhlIFBDSSBkZXZpY2UgdG8gaW50aWFsaXplLgorICogQGlkOiBMb29rcyBsaWtlIGEgcG9pbnRlciB0byB0aGUgZW50cnkgaW4gb3VyIHBjaSBkZXZpY2UgdGFibGUKKyAqIHRoYXQgd2FzIGFjdHVhbGx5IG1hdGNoZWQgYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIGNvZGUgKC12ZSkgb24gZmFpbHVyZS4KKyAqKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGRjMzk1eF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2NzaV9ob3N0ID0gTlVMTDsKKwlzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlvX3BvcnRfYmFzZTsKKwl1bnNpZ25lZCBpbnQgaW9fcG9ydF9sZW47CisJdW5zaWduZWQgaW50IGlycTsKKwkKKwlkcHJpbnRrZGJnKERCR18wLCAiSW5pdCBvbmUgaW5zdGFuY2UgKCVzKVxuIiwgcGNpX25hbWUoZGV2KSk7CisJYmFubmVyX2Rpc3BsYXkoKTsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShkZXYpKQorCXsKKwkJZHByaW50a2woS0VSTl9JTkZPLCAiUENJIEVuYWJsZSBkZXZpY2UgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpb19wb3J0X2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSAmIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKKwlpb19wb3J0X2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LCAwKTsKKwlpcnEgPSBkZXYtPmlycTsKKwlkcHJpbnRrZGJnKERCR18wLCAiSU9fUE9SVD0weCUwNGx4LCBJUlE9MHgleFxuIiwgaW9fcG9ydF9iYXNlLCBkZXYtPmlycSk7CisKKwkvKiBhbGxvY2F0ZSBzY3NpIGhvc3QgaW5mb3JtYXRpb24gKGluY2x1ZGVzIG91dCBhZGFwdGVyKSAqLworCXNjc2lfaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmZGMzOTV4X2RyaXZlcl90ZW1wbGF0ZSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBBZGFwdGVyQ3RsQmxrKSk7CisJaWYgKCFzY3NpX2hvc3QpIHsKKwkJZHByaW50a2woS0VSTl9JTkZPLCAic2NzaV9ob3N0X2FsbG9jIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisgCWFjYiA9IChzdHJ1Y3QgQWRhcHRlckN0bEJsayopc2NzaV9ob3N0LT5ob3N0ZGF0YTsKKyAJYWNiLT5zY3NpX2hvc3QgPSBzY3NpX2hvc3Q7CisgCWFjYi0+ZGV2ID0gZGV2OworCisJLyogaW5pdGlhbGlzZSB0aGUgYWRhcHRlciBhbmQgZXZlcnl0aGluZyB3ZSBuZWVkICovCisgCWlmIChhZGFwdGVyX2luaXQoYWNiLCBpb19wb3J0X2Jhc2UsIGlvX3BvcnRfbGVuLCBpcnEpKSB7CisJCWRwcmludGtsKEtFUk5fSU5GTywgImFkYXB0ZXIgaW5pdCBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcGNpX3NldF9tYXN0ZXIoZGV2KTsKKworCS8qIGdldCB0aGUgc2NzaSBtaWQgbGV2ZWwgdG8gc2NhbiBmb3IgbmV3IGRldmljZXMgb24gdGhlIGJ1cyAqLworCWlmIChzY3NpX2FkZF9ob3N0KHNjc2lfaG9zdCwgJmRldi0+ZGV2KSkgeworCQlkcHJpbnRrbChLRVJOX0VSUiwgInNjc2lfYWRkX2hvc3QgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlwY2lfc2V0X2RydmRhdGEoZGV2LCBzY3NpX2hvc3QpOworCXNjc2lfc2Nhbl9ob3N0KHNjc2lfaG9zdCk7CisgICAgICAgIAkKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlpZiAoYWNiICE9IE5VTEwpCisJCWFkYXB0ZXJfdW5pbml0KGFjYik7CisJaWYgKHNjc2lfaG9zdCAhPSBOVUxMKQorCQlzY3NpX2hvc3RfcHV0KHNjc2lfaG9zdCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKworLyoqCisgKiBkYzM5NXhfcmVtb3ZlX29uZSAtIENhbGxlZCB0byByZW1vdmUgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlCisgKiBhZGFwdGVyLgorICoKKyAqIEBkZXY6IFRoZSBQQ0kgZGV2aWNlIHRvIGludGlhbGl6ZS4KKyAqKi8KK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkYzM5NXhfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNjc2lfaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IgPSAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKikoc2NzaV9ob3N0LT5ob3N0ZGF0YSk7CisKKwlkcHJpbnRrZGJnKERCR18wLCAiZGMzOTV4X3JlbW92ZV9vbmU6IGFjYj0lcFxuIiwgYWNiKTsKKworCXNjc2lfcmVtb3ZlX2hvc3Qoc2NzaV9ob3N0KTsKKwlhZGFwdGVyX3VuaW5pdChhY2IpOworCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOworCXNjc2lfaG9zdF9wdXQoc2NzaV9ob3N0KTsKKwlwY2lfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKK30KKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZGMzOTV4X3BjaV90YWJsZVtdID0geworCXsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX1RFS1JBTSwKKwkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX1RFS1JBTV9UUk1TMTA0MCwKKwkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCSB9LAorCXt9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZGMzOTV4X3BjaV90YWJsZSk7CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRjMzk1eF9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgICAgID0gREMzOTVYX05BTUUsCisJLmlkX3RhYmxlICAgICAgID0gZGMzOTV4X3BjaV90YWJsZSwKKwkucHJvYmUgICAgICAgICAgPSBkYzM5NXhfaW5pdF9vbmUsCisJLnJlbW92ZSAgICAgICAgID0gX19kZXZleGl0X3AoZGMzOTV4X3JlbW92ZV9vbmUpLAorfTsKKworCisvKioKKyAqIGRjMzk1eF9tb2R1bGVfaW5pdCAtIE1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgorICoKKyAqIFVzZWQgYnkgYm90aCBtb2R1bGUgYW5kIGJ1aWx0LWluIGRyaXZlciB0byBpbml0aWFsaXNlIHRoaXMgZHJpdmVyLgorICoqLworc3RhdGljIGludCBfX2luaXQgZGMzOTV4X21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZGMzOTV4X2RyaXZlcik7Cit9CisKKworLyoqCisgKiBkYzM5NXhfbW9kdWxlX2V4aXQgLSBNb2R1bGUgY2xlYW51cCBmdW5jdGlvbi4KKyAqKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBkYzM5NXhfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRjMzk1eF9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KGRjMzk1eF9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChkYzM5NXhfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJDLkwuIEh1YW5nIC8gRXJpY2ggQ2hlbiAvIEt1cnQgR2FybG9mZiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTQ1NJIGhvc3QgYWRhcHRlciBkcml2ZXIgZm9yIFRla3JhbSBUUk0tUzEwNDAgYmFzZWQgYWRhcHRlcnM6IFRla3JhbSBEQzM5NSBhbmQgREMzMTUgc2VyaWVzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZGMzOTV4LmggYi9kcml2ZXJzL3Njc2kvZGMzOTV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4MzYwZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9kYzM5NXguaApAQCAtMCwwICsxLDY0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCWRjMzk1eC5oCQkJCQkJCSovCisvKgkJCQkJCQkJCSovCisvKglEZXZpY2UgRHJpdmVyIGZvciBUZWtyYW0gREMzOTUoVS9VVy9GKSwgREMzMTUoVSkJCSovCisvKglQQ0kgU0NTSSBCdXMgTWFzdGVyIEhvc3QgQWRhcHRlcgkJCQkqLworLyoJKFNDU0kgY2hpcCBzZXQgdXNlZCBUZWtyYW0gQVNJQyBUUk0tUzEwNDApCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIERDMzk1eF9ICisjZGVmaW5lIERDMzk1eF9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKglJbml0aWFsIHZhbHVlcwkJCQkJCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgREMzOTV4X01BWF9DTURfUVVFVUUJCTMyCisvKiAjZGVmaW5lIERDMzk1eF9NQVhfUVRBR1MJCTMyICovCisjZGVmaW5lIERDMzk1eF9NQVhfUVRBR1MJCTE2CisjZGVmaW5lIERDMzk1eF9NQVhfU0NTSV9JRAkJMTYKKyNkZWZpbmUgREMzOTV4X01BWF9DTURfUEVSX0xVTgkJREMzOTV4X01BWF9RVEFHUworI2RlZmluZSBEQzM5NXhfTUFYX1NHX1RBQkxFU0laRQkJNjQJLyogSFcgbGltaXRhdGlvbgkJCSovCisjZGVmaW5lIERDMzk1eF9NQVhfU0dfTElTVEVOVFJZCQk2NAkvKiBNdXN0IGJlIGVxdWFsIG9yIGxvd2VyIHRvIHByZXZpb3VzCSovCisJCQkJCQkvKiBpdGVtCQkJCQkqLworI2RlZmluZSBEQzM5NXhfTUFYX1NSQl9DTlQJCTYzCisvKiAjZGVmaW5lIERDMzk1eF9NQVhfQ0FOX1FVRVVFCQk3ICogREMzOTV4X01BWF9RVEFHUyAqLworI2RlZmluZSBEQzM5NXhfTUFYX0NBTl9RVUVVRQkJREMzOTV4X01BWF9TUkJfQ05UCisjZGVmaW5lIERDMzk1eF9FTkRfU0NBTgkJCTIKKyNkZWZpbmUgREMzOTV4X1NFTF9USU1FT1VUCQkxNTMJLyogMjUwIG1zIHNlbGVjdGlvbiB0aW1lb3V0IChAIDQwIE1IeikJKi8KKyNkZWZpbmUgREMzOTV4X01BWF9SRVRSSUVTCQkzCisKKyNpZiAwCisjZGVmaW5lIFNZTkNfRklSU1QKKyNlbmRpZgorCisjZGVmaW5lIE5PUk1fUkVDX0xWTAkJCTAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCVZhcmlvdXMgZGVmaW5pdGlvbnMJCQkJCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQklUMzEJCQkJMHg4MDAwMDAwMAorI2RlZmluZSBCSVQzMAkJCQkweDQwMDAwMDAwCisjZGVmaW5lIEJJVDI5CQkJCTB4MjAwMDAwMDAKKyNkZWZpbmUgQklUMjgJCQkJMHgxMDAwMDAwMAorI2RlZmluZSBCSVQyNwkJCQkweDA4MDAwMDAwCisjZGVmaW5lIEJJVDI2CQkJCTB4MDQwMDAwMDAKKyNkZWZpbmUgQklUMjUJCQkJMHgwMjAwMDAwMAorI2RlZmluZSBCSVQyNAkJCQkweDAxMDAwMDAwCisjZGVmaW5lIEJJVDIzCQkJCTB4MDA4MDAwMDAKKyNkZWZpbmUgQklUMjIJCQkJMHgwMDQwMDAwMAorI2RlZmluZSBCSVQyMQkJCQkweDAwMjAwMDAwCisjZGVmaW5lIEJJVDIwCQkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgQklUMTkJCQkJMHgwMDA4MDAwMAorI2RlZmluZSBCSVQxOAkJCQkweDAwMDQwMDAwCisjZGVmaW5lIEJJVDE3CQkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgQklUMTYJCQkJMHgwMDAxMDAwMAorI2RlZmluZSBCSVQxNQkJCQkweDAwMDA4MDAwCisjZGVmaW5lIEJJVDE0CQkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgQklUMTMJCQkJMHgwMDAwMjAwMAorI2RlZmluZSBCSVQxMgkJCQkweDAwMDAxMDAwCisjZGVmaW5lIEJJVDExCQkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgQklUMTAJCQkJMHgwMDAwMDQwMAorI2RlZmluZSBCSVQ5CQkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgQklUOAkJCQkweDAwMDAwMTAwCisjZGVmaW5lIEJJVDcJCQkJMHgwMDAwMDA4MAorI2RlZmluZSBCSVQ2CQkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgQklUNQkJCQkweDAwMDAwMDIwCisjZGVmaW5lIEJJVDQJCQkJMHgwMDAwMDAxMAorI2RlZmluZSBCSVQzCQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgQklUMgkJCQkweDAwMDAwMDA0CisjZGVmaW5lIEJJVDEJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBCSVQwCQkJCTB4MDAwMDAwMDEKKworLyogVW5pdEN0cmxGbGFnICovCisjZGVmaW5lIFVOSVRfQUxMT0NBVEVECQkJQklUMAorI2RlZmluZSBVTklUX0lORk9fQ0hBTkdFRAkJQklUMQorI2RlZmluZSBGT1JNQVRJTkdfTUVESUEJCQlCSVQyCisjZGVmaW5lIFVOSVRfUkVUUlkJCQlCSVQzCisKKy8qIFVuaXRGbGFncyAqLworI2RlZmluZSBEQVNEX1NVUFBPUlQJCQlCSVQwCisjZGVmaW5lIFNDU0lfU1VQUE9SVAkJCUJJVDEKKyNkZWZpbmUgQVNQSV9TVVBQT1JUCQkJQklUMgorCisvKiBTUkJTdGF0ZSBtYWNoaW5lIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgU1JCX0ZSRUUJCQkweDAwMDAKKyNkZWZpbmUgU1JCX1dBSVQJCQkweDAwMDEKKyNkZWZpbmUgU1JCX1JFQURZCQkJMHgwMDAyCisjZGVmaW5lIFNSQl9NU0dPVVQJCQkweDAwMDQJLyogYXJiaXRyYXRpb24rbXNnX291dCAxc3QgYnl0ZQkJKi8KKyNkZWZpbmUgU1JCX01TR0lOCQkJMHgwMDA4CisjZGVmaW5lIFNSQl9FWFRFTkRfTVNHSU4JCTB4MDAxMAorI2RlZmluZSBTUkJfQ09NTUFORAkJCTB4MDAyMAorI2RlZmluZSBTUkJfU1RBUlRfCQkJMHgwMDQwCS8qIGFyYml0cmF0aW9uK21zZ19vdXQrY29tbWFuZF9vdXQJKi8KKyNkZWZpbmUgU1JCX0RJU0NPTk5FQ1QJCQkweDAwODAKKyNkZWZpbmUgU1JCX0RBVEFfWEZFUgkJCTB4MDEwMAorI2RlZmluZSBTUkJfWEZFUlBBRAkJCTB4MDIwMAorI2RlZmluZSBTUkJfU1RBVFVTCQkJMHgwNDAwCisjZGVmaW5lIFNSQl9DT01QTEVURUQJCQkweDA4MDAKKyNkZWZpbmUgU1JCX0FCT1JUX1NFTlQJCQkweDEwMDAKKyNkZWZpbmUgU1JCX0RPX1NZTkNfTkVHTwkJMHgyMDAwCisjZGVmaW5lIFNSQl9ET19XSURFX05FR08JCTB4NDAwMAorI2RlZmluZSBTUkJfVU5FWFBFQ1RfUkVTRUwJCTB4ODAwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJQUNCIENvbmZpZwkJCQkJCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSENDX1dJREVfQ0FSRAkJCTB4MjAKKyNkZWZpbmUgSENDX1NDU0lfUkVTRVQJCQkweDEwCisjZGVmaW5lIEhDQ19QQVJJVFkJCQkweDA4CisjZGVmaW5lIEhDQ19BVVRPVEVSTQkJCTB4MDQKKyNkZWZpbmUgSENDX0xPVzhURVJNCQkJMHgwMgorI2RlZmluZSBIQ0NfVVA4VEVSTQkJCTB4MDEKKworLyogQUNCRmxhZyAqLworI2RlZmluZSBSRVNFVF9ERVYJCQlCSVQwCisjZGVmaW5lIFJFU0VUX0RFVEVDVAkJCUJJVDEKKyNkZWZpbmUgUkVTRVRfRE9ORQkJCUJJVDIKKworLyogRENCRmxhZyAqLworI2RlZmluZSBBQk9SVF9ERVZfCQkJQklUMAorCisvKiBTUkJzdGF0dXMgKi8KKyNkZWZpbmUgU1JCX09LCQkJCUJJVDAKKyNkZWZpbmUgQUJPUlRJT04JCQlCSVQxCisjZGVmaW5lIE9WRVJfUlVOCQkJQklUMgorI2RlZmluZSBVTkRFUl9SVU4JCQlCSVQzCisjZGVmaW5lIFBBUklUWV9FUlJPUgkJCUJJVDQKKyNkZWZpbmUgU1JCX0VSUk9SCQkJQklUNQorCisvKiBTUkJGbGFnICovCisjZGVmaW5lIERBVEFPVVQJCQkJQklUNworI2RlZmluZSBEQVRBSU4JCQkJQklUNgorI2RlZmluZSBSRVNJRFVBTF9WQUxJRAkJCUJJVDUKKyNkZWZpbmUgRU5BQkxFX1RJTUVSCQkJQklUNAorI2RlZmluZSBSRVNFVF9ERVYwCQkJQklUMgorI2RlZmluZSBBQk9SVF9ERVYJCQlCSVQxCisjZGVmaW5lIEFVVE9fUkVRU0VOU0UJCQlCSVQwCisKKy8qIEFkYXB0ZXIgc3RhdHVzICovCisjZGVmaW5lIEhfU1RBVFVTX0dPT0QJCQkwCisjZGVmaW5lIEhfU0VMX1RJTUVPVVQJCQkweDExCisjZGVmaW5lIEhfT1ZFUl9VTkRFUl9SVU4JCTB4MTIKKyNkZWZpbmUgSF9VTkVYUF9CVVNfRlJFRQkJMHgxMworI2RlZmluZSBIX1RBUkdFVF9QSEFTRV9GCQkweDE0CisjZGVmaW5lIEhfSU5WQUxJRF9DQ0JfT1AJCTB4MTYKKyNkZWZpbmUgSF9MSU5LX0NDQl9CQUQJCQkweDE3CisjZGVmaW5lIEhfQkFEX1RBUkdFVF9ESVIJCTB4MTgKKyNkZWZpbmUgSF9EVVBMSUNBVEVfQ0NCCQkJMHgxOQorI2RlZmluZSBIX0JBRF9DQ0JfT1JfU0cJCQkweDFBCisjZGVmaW5lIEhfQUJPUlQJCQkJMHgwRkYKKworLyogU0NTSSBCVVMgU3RhdHVzIGJ5dGUgY29kZXMgKi8KKyNkZWZpbmUgU0NTSV9TVEFUX0dPT0QJCQkweDAJLyogR29vZCBzdGF0dXMJCQkJKi8KKyNkZWZpbmUgU0NTSV9TVEFUX0NIRUNLQ09ORAkJMHgwMgkvKiBTQ1NJIENoZWNrIENvbmRpdGlvbgkJCSovCisjZGVmaW5lIFNDU0lfU1RBVF9DT05ETUVUCQkweDA0CS8qIENvbmRpdGlvbiBNZXQJCQkqLworI2RlZmluZSBTQ1NJX1NUQVRfQlVTWQkJCTB4MDgJLyogVGFyZ2V0IGJ1c3kgc3RhdHVzCQkJKi8KKyNkZWZpbmUgU0NTSV9TVEFUX0lOVEVSCQkJMHgxMAkvKiBJbnRlcm1lZGlhdGUgc3RhdHVzCQkJKi8KKyNkZWZpbmUgU0NTSV9TVEFUX0lOVEVSQ09ORE1FVAkJMHgxNAkvKiBJbnRlcm1lZGlhdGUgY29uZGl0aW9uIG1ldAkJKi8KKyNkZWZpbmUgU0NTSV9TVEFUX1JFU0NPTkZMSUNUCQkweDE4CS8qIFJlc2VydmF0aW9uIGNvbmZsaWN0CQkJKi8KKyNkZWZpbmUgU0NTSV9TVEFUX0NNRFRFUk0JCTB4MjIJLyogQ29tbWFuZCBUZXJtaW5hdGVkCQkJKi8KKyNkZWZpbmUgU0NTSV9TVEFUX1FVRVVFRlVMTAkJMHgyOAkvKiBRdWV1ZSBGdWxsCQkJCSovCisjZGVmaW5lIFNDU0lfU1RBVF9VTkVYUF9CVVNfRgkJMHhGRAkvKiBVbmV4cGVjdCBCdXMgRnJlZQkJCSovCisjZGVmaW5lIFNDU0lfU1RBVF9CVVNfUlNUX0RFVEVDVAkweEZFCS8qIFNjc2kgQnVzIFJlc2V0IGRldGVjdGVkCQkqLworI2RlZmluZSBTQ1NJX1NUQVRfU0VMX1RJTUVPVVQJCTB4RkYJLyogU2VsZWN0aW9uIFRpbWUgb3V0CQkJKi8KKworLyogU3luY19Nb2RlICovCisjZGVmaW5lIFNZTkNfV0lERV9UQUdfQVROVF9ESVNBQkxFCTAKKyNkZWZpbmUgU1lOQ19ORUdPX0VOQUJMRQkJQklUMAorI2RlZmluZSBTWU5DX05FR09fRE9ORQkJCUJJVDEKKyNkZWZpbmUgV0lERV9ORUdPX0VOQUJMRQkJQklUMgorI2RlZmluZSBXSURFX05FR09fRE9ORQkJCUJJVDMKKyNkZWZpbmUgV0lERV9ORUdPX1NUQVRFCQkJQklUNAorI2RlZmluZSBFTl9UQUdfUVVFVUVJTkcJCQlCSVQ1CisjZGVmaW5lIEVOX0FUTl9TVE9QCQkJQklUNgorCisjZGVmaW5lIFNZTkNfTkVHT19PRkZTRVQJCTE1CisKKy8qIFNDU0kgTVNHIEJZVEUgKi8KKyNkZWZpbmUgTVNHX0NPTVBMRVRFCQkJMHgwMAorI2RlZmluZSBNU0dfRVhURU5ERUQJCQkweDAxCisjZGVmaW5lIE1TR19TQVZFX1BUUgkJCTB4MDIKKyNkZWZpbmUgTVNHX1JFU1RPUkVfUFRSCQkJMHgwMworI2RlZmluZSBNU0dfRElTQ09OTkVDVAkJCTB4MDQKKyNkZWZpbmUgTVNHX0lOSVRJQVRPUl9FUlJPUgkJMHgwNQorI2RlZmluZSBNU0dfQUJPUlQJCQkweDA2CisjZGVmaW5lIE1TR19SRUpFQ1RfCQkJMHgwNworI2RlZmluZSBNU0dfTk9QCQkJCTB4MDgKKyNkZWZpbmUgTVNHX1BBUklUWV9FUlJPUgkJMHgwOQorI2RlZmluZSBNU0dfTElOS19DTURfQ09NUEwJCTB4MEEKKyNkZWZpbmUgTVNHX0xJTktfQ01EX0NPTVBMX0ZMRwkJMHgwQgorI2RlZmluZSBNU0dfQlVTX1JFU0VUCQkJMHgwQworI2RlZmluZSBNU0dfQUJPUlRfVEFHCQkJMHgwRAorI2RlZmluZSBNU0dfU0lNUExFX1FUQUcJCQkweDIwCisjZGVmaW5lIE1TR19IRUFEX1FUQUcJCQkweDIxCisjZGVmaW5lIE1TR19PUkRFUl9RVEFHCQkJMHgyMgorI2RlZmluZSBNU0dfSUdOT1JFV0lERQkJCTB4MjMKKyNkZWZpbmUgTVNHX0lERU5USUZZCQkJMHg4MAorI2RlZmluZSBNU0dfSE9TVF9JRAkJCTB4QzAKKworLyogU0NTSSBTVEFUVVMgQllURSAqLworI2RlZmluZSBTVEFUVVNfR09PRAkJCTB4MDAKKyNkZWZpbmUgQ0hFQ0tfQ09ORElUSU9OXwkJMHgwMgorI2RlZmluZSBTVEFUVVNfQlVTWQkJCTB4MDgKKyNkZWZpbmUgU1RBVFVTX0lOVEVSTUVESUFURQkJMHgxMAorI2RlZmluZSBSRVNFUlZFX0NPTkZMSUNUCQkweDE4CisKKy8qIGNtZC0+cmVzdWx0ICovCisjZGVmaW5lIFNUQVRVU19NQVNLXwkJCTB4RkYKKyNkZWZpbmUgTVNHX01BU0sJCQkweEZGMDAKKyNkZWZpbmUgUkVUVVJOX01BU0sJCQkweEZGMDAwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJSW5xdWlyeSBEYXRhIGZvcm1hdAkJCQkJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IFNjc2lJbnFEYXRhCit7CQkJCQkJLyogSU5RCQkJCQkqLworCXU4IERldlR5cGU7CQkJCS8qIFBlcmlwaCBRdWFsaWZpZXIgJiBQZXJpcGggRGV2IFR5cGUJKi8KKwl1OCBSTUJfVHlwZU1vZDsJCQkJLyogcmVtIG1lZGlhIGJpdCAmIERldiBUeXBlIE1vZGlmaWVyCSovCisJdTggVmVyczsJCQkJLyogSVNPLCBFQ01BLCAmIEFOU0kgdmVyc2lvbnMJCSovCisJdTggUkRGOwkJCQkJLyogQUVOLCBUUk1JT1AsICYgcmVzcG9uc2UgZGF0YSBmb3JtYXQJKi8KKwl1OCBBZGRMZW47CQkJCS8qIGxlbmd0aCBvZiBhZGRpdGlvbmFsIGRhdGEJCSovCisJdTggUmVzMTsJCQkJLyogcmVzZXJ2ZWQJCQkJKi8KKwl1OCBSZXMyOwkJCQkvKiByZXNlcnZlZAkJCQkqLworCXU4IEZsYWdzOwkJCQkvKiBSZWxBRHIsIFdidXMzMiwgV2J1czE2LCBTeW5jLCBldGMuCSovCisJdTggVmVuZG9ySURbOF07CQkJCS8qIFZlbmRvciBJZGVudGlmaWNhdGlvbgkJKi8KKwl1OCBQcm9kdWN0SURbMTZdOwkJCS8qIFByb2R1Y3QgSWRlbnRpZmljYXRpb24JCSovCisJdTggUHJvZHVjdFJldls0XTsJCQkvKiBQcm9kdWN0IFJldmlzaW9uCQkJKi8KK307CisKKwkJCQkJCS8qIElucXVpcnkgYnl0ZSAwIG1hc2tzCQkJKi8KKyNkZWZpbmUgU0NTSV9ERVZUWVBFCQkJMHgxRgkvKiBQZXJpcGhlcmFsIERldmljZSBUeXBlCQkqLworI2RlZmluZSBTQ1NJX1BFUklQSFFVQUwJCQkweEUwCS8qIFBlcmlwaGVyYWwgUXVhbGlmaWVyCQkJKi8KKwkJCQkJCS8qIElucXVpcnkgYnl0ZSAxIG1hc2sJCQkqLworI2RlZmluZSBTQ1NJX1JFTU9WQUJMRV9NRURJQQkJMHg4MAkvKiBSZW1vdmFibGUgTWVkaWEgYml0ICgxPXJlbW92YWJsZSkJKi8KKwkJCQkJCS8qIFBlcmlwaGVyYWwgRGV2aWNlIFR5cGUgZGVmaW5pdGlvbnMJKi8KKwkJCQkJCS8qIFNlZSBpbmNsdWRlL3Njc2kvc2NzaS5oCQkqLworI2RlZmluZSBUWVBFX05PREVWCQlTQ1NJX0RFVlRZUEUJLyogVW5rbm93biBvciBubyBkZXZpY2UgdHlwZQkJKi8KKyNpZm5kZWYgVFlQRV9QUklOVEVSCQkJCS8qCQkJCQkqLworIyBkZWZpbmUgVFlQRV9QUklOVEVSCQkJMHgwMgkvKiBQcmludGVyIGRldmljZQkJCSovCisjZW5kaWYJCQkJCQkvKgkJCQkJKi8KKyNpZm5kZWYgVFlQRV9DT01NCQkJCS8qCQkJCQkqLworIyBkZWZpbmUgVFlQRV9DT01NCQkJMHgwOQkvKiBDb21tdW5pY2F0aW9ucyBkZXZpY2UJCSovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUlucXVpcnkgZmxhZyBkZWZpbml0aW9ucyAoSW5xIGRhdGEgYnl0ZSA3KQkJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTQ1NJX0lOUV9SRUxBRFIJCQkweDgwCS8qIGRldmljZSBzdXBwb3J0cyByZWxhdGl2ZSBhZGRyZXNzaW5nCSovCisjZGVmaW5lIFNDU0lfSU5RX1dCVVMzMgkJCTB4NDAJLyogZGV2aWNlIHN1cHBvcnRzIDMyIGJpdCBkYXRhIHhmZXJzCSovCisjZGVmaW5lIFNDU0lfSU5RX1dCVVMxNgkJCTB4MjAJLyogZGV2aWNlIHN1cHBvcnRzIDE2IGJpdCBkYXRhIHhmZXJzCSovCisjZGVmaW5lIFNDU0lfSU5RX1NZTkMJCQkweDEwCS8qIGRldmljZSBzdXBwb3J0cyBzeW5jaHJvbm91cyB4ZmVyCSovCisjZGVmaW5lIFNDU0lfSU5RX0xJTktFRAkJCTB4MDgJLyogZGV2aWNlIHN1cHBvcnRzIGxpbmtlZCBjb21tYW5kcwkqLworI2RlZmluZSBTQ1NJX0lOUV9DTURRVUVVRQkJMHgwMgkvKiBkZXZpY2Ugc3VwcG9ydHMgY29tbWFuZCBxdWV1ZWluZwkqLworI2RlZmluZSBTQ1NJX0lOUV9TRlRSRQkJCTB4MDEJLyogZGV2aWNlIHN1cHBvcnRzIHNvZnQgcmVzZXRzCQkqLworCisjZGVmaW5lIEVOQUJMRV9DRQkJCTEKKyNkZWZpbmUgRElTQUJMRV9DRQkJCTAKKyNkZWZpbmUgRUVQUk9NX1JFQUQJCQkweDgwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKglUaGUgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgb2Zmc2V0IGZvciBUUk1fUzEwNDAJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBUUk1fUzEwNDBfSUQJCQkweDAwCS8qIFZlbmRvciBhbmQgRGV2aWNlIElECQkJKi8KKyNkZWZpbmUgVFJNX1MxMDQwX0NPTU1BTkQJCTB4MDQJLyogUENJIGNvbW1hbmQgcmVnaXN0ZXIJCQkqLworI2RlZmluZSBUUk1fUzEwNDBfSU9CQVNFCQkweDEwCS8qIEkvTyBTcGFjZSBiYXNlIGFkZHJlc3MJCSovCisjZGVmaW5lIFRSTV9TMTA0MF9ST01CQVNFCQkweDMwCS8qIEV4cGFuc2lvbiBST00gQmFzZSBBZGRyZXNzCQkqLworI2RlZmluZSBUUk1fUzEwNDBfSU5UTElORQkJMHgzQwkvKiBJbnRlcnJ1cHQgbGluZQkJCSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKglUaGUgU0NTSSByZWdpc3RlciBvZmZzZXQgZm9yIFRSTV9TMTA0MAkJCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVFJNX1MxMDQwX1NDU0lfU1RBVFVTCQkweDgwCS8qIFNDU0kgU3RhdHVzIChSKQkJCSovCisjZGVmaW5lIENPTU1BTkRQSEFTRURPTkUJCTB4MjAwMAkvKiBTQ1NJIGNvbW1hbmQgcGhhc2UgZG9uZQkJKi8KKyNkZWZpbmUgU0NTSVhGRVJET05FCQkJMHgwODAwCS8qIFNDU0kgU0NTSSB0cmFuc2ZlciBkb25lCQkqLworI2RlZmluZSBTQ1NJWEZFUkNOVF8yX1pFUk8JCTB4MDEwMAkvKiBTQ1NJIFNDU0kgdHJhbnNmZXIgY291bnQgdG8gemVybwkqLworI2RlZmluZSBTQ1NJSU5URVJSVVBUCQkJMHgwMDgwCS8qIFNDU0kgaW50ZXJydXB0IHBlbmRpbmcJCSovCisjZGVmaW5lIENPTU1BTkRBQk9SVAkJCTB4MDA0MAkvKiBTQ1NJIGNvbW1hbmQgYWJvcnQJCQkqLworI2RlZmluZSBTRVFVRU5DRVJBQ1RJVkUJCQkweDAwMjAJLyogU0NTSSBzZXF1ZW5jZXIgYWN0aXZlCQkqLworI2RlZmluZSBQSEFTRU1JU01BVENICQkJMHgwMDEwCS8qIFNDU0kgcGhhc2UgbWlzbWF0Y2gJCQkqLworI2RlZmluZSBQQVJJVFlFUlJPUgkJCTB4MDAwOAkvKiBTQ1NJIHBhcml0eSBlcnJvcgkJCSovCisKKyNkZWZpbmUgUEhBU0VNQVNLCQkJMHgwMDA3CS8qIFBoYXNlIE1TRy9DRC9JTwkJCSovCisjZGVmaW5lIFBIX0RBVEFfT1VUCQkJMHgwMAkvKiBEYXRhIG91dCBwaGFzZQkJCSovCisjZGVmaW5lIFBIX0RBVEFfSU4JCQkweDAxCS8qIERhdGEgaW4gcGhhc2UJCQkqLworI2RlZmluZSBQSF9DT01NQU5ECQkJMHgwMgkvKiBDb21tYW5kIHBoYXNlCQkJKi8KKyNkZWZpbmUgUEhfU1RBVFVTCQkJMHgwMwkvKiBTdGF0dXMgcGhhc2UJCQkJKi8KKyNkZWZpbmUgUEhfQlVTX0ZSRUUJCQkweDA1CS8qIEludmFsaWQgcGhhc2UgdXNlZCBhcyBidXMgZnJlZQkqLworI2RlZmluZSBQSF9NU0dfT1VUCQkJMHgwNgkvKiBNZXNzYWdlIG91dCBwaGFzZQkJCSovCisjZGVmaW5lIFBIX01TR19JTgkJCTB4MDcJLyogTWVzc2FnZSBpbiBwaGFzZQkJCSovCisKKyNkZWZpbmUgVFJNX1MxMDQwX1NDU0lfQ09OVFJPTAkJMHg4MAkvKiBTQ1NJIENvbnRyb2wgKFcpCQkJKi8KKyNkZWZpbmUgRE9fQ0xSQVROCQkJMHgwNDAwCS8qIENsZWFyIEFUTgkJCQkqLworI2RlZmluZSBET19TRVRBVE4JCQkweDAyMDAJLyogU2V0IEFUTgkJCQkqLworI2RlZmluZSBET19DTURBQk9SVAkJCTB4MDEwMAkvKiBBYm9ydCBTQ1NJIGNvbW1hbmQJCQkqLworI2RlZmluZSBET19SU1RNT0RVTEUJCQkweDAwMTAJLyogUmVzZXQgU0NTSSBjaGlwCQkJKi8KKyNkZWZpbmUgRE9fUlNUU0NTSQkJCTB4MDAwOAkvKiBSZXNldCBTQ1NJIGJ1cwkJCSovCisjZGVmaW5lIERPX0NMUkZJRk8JCQkweDAwMDQJLyogQ2xlYXIgU0NTSSB0cmFuc2ZlciBGSUZPCQkqLworI2RlZmluZSBET19EQVRBTEFUQ0gJCQkweDAwMDIJLyogRW5hYmxlIFNDU0kgYnVzIGRhdGEgaW5wdXQgKGxhdGNoZWQpCSovCisvKiAjZGVmaW5lIERPX0RBVEFMQVRDSAkJCTB4MDAwMCAqLwkvKiBLRzogRElTYWJsZSBTQ1NJIGJ1cyBkYXRhIGxhdGNoCSovCisjZGVmaW5lIERPX0hXUkVTRUxFQ1QJCQkweDAwMDEJLyogRW5hYmxlIGhhcmR3YXJlIHJlc2VsZWN0aW9uCQkqLworCisjZGVmaW5lIFRSTV9TMTA0MF9TQ1NJX0ZJRk9DTlQJCTB4ODIJLyogU0NTSSBGSUZPIENvdW50ZXIgNWJpdHMoUikJCSovCisjZGVmaW5lIFRSTV9TMTA0MF9TQ1NJX1NJR05BTAkJMHg4MwkvKiBTQ1NJIGxvdyBsZXZlbCBzaWduYWwgKFIvVykJCSovCisKKyNkZWZpbmUgVFJNX1MxMDQwX1NDU0lfSU5UU1RBVFVTCTB4ODQJLyogU0NTSSBJbnRlcnJ1cHQgU3RhdHVzIChSKQkJKi8KKyNkZWZpbmUgSU5UX1NDQU0JCQkweDgwCS8qIFNDQU0gc2VsZWN0aW9uIGludGVycnVwdAkJKi8KKyNkZWZpbmUgSU5UX1NFTEVDVAkJCTB4NDAJLyogU2VsZWN0aW9uIGludGVycnVwdAkJCSovCisjZGVmaW5lIElOVF9TRUxUSU1FT1VUCQkJMHgyMAkvKiBTZWxlY3Rpb24gdGltZW91dCBpbnRlcnJ1cHQJCSovCisjZGVmaW5lIElOVF9ESVNDT05ORUNUCQkJMHgxMAkvKiBCdXMgZGlzY29ubmVjdGVkIGludGVycnVwdAkJKi8KKyNkZWZpbmUgSU5UX1JFU0VMRUNURUQJCQkweDA4CS8qIFJlc2VsZWN0ZWQgaW50ZXJydXB0CQkJKi8KKyNkZWZpbmUgSU5UX1NDU0lSRVNFVAkJCTB4MDQJLyogU0NTSSByZXNldCBkZXRlY3RlZCBpbnRlcnJ1cHQJKi8KKyNkZWZpbmUgSU5UX0JVU1NFUlZJQ0UJCQkweDAyCS8qIEJ1cyBzZXJ2aWNlIGludGVycnVwdAkJKi8KKyNkZWZpbmUgSU5UX0NNRERPTkUJCQkweDAxCS8qIFNDU0kgY29tbWFuZCBkb25lIGludGVycnVwdAkJKi8KKworI2RlZmluZSBUUk1fUzEwNDBfU0NTSV9PRkZTRVQJCTB4ODQJLyogU0NTSSBPZmZzZXQgQ291bnQgKFcpCQkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJQml0CQlOYW1lCQlEZWZpbml0aW9uCQkJKi8KKy8qCS0tLS0tLS0tLQktLS0tLS0tLS0tLS0tCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KKy8qCTA3LTA1CTAJUlNWRAkJUmV2ZXJzZWQuIEFsd2F5cyAwLgkJKi8KKy8qCTA0CTAJT0ZGU0VUNAkJUmV2ZXJzZWQgZm9yIExWRFMuIEFsd2F5cyAwLgkqLworLyoJMDMtMDAJMAlPRkZTRVRbMDM6MDBdCU9mZnNldCBudW1iZXIgZnJvbSAwIHRvIDE1CSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFRSTV9TMTA0MF9TQ1NJX1NZTkMJCTB4ODUJLyogU0NTSSBTeW5jaHJvbm91cyBDb250cm9sIChSL1cpCSovCisjZGVmaW5lIExWRFNfU1lOQwkJCTB4MjAJLyogRW5hYmxlIExWRFMgc3luY2hyb25vdXMJCSovCisjZGVmaW5lIFdJREVfU1lOQwkJCTB4MTAJLyogRW5hYmxlIFdJREUgc3luY2hyb25vdXMJCSovCisjZGVmaW5lIEFMVF9TWU5DCQkJMHgwOAkvKiBFbmFibGUgRmFzdC0yMCBhbHRlcm5hdGUgc3luY2hyb25vdXMJKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCVNZTkNNCTcgICAgNiAgICA1ICAgIDQgICAgMyAgICAgICAyICAgICAgIDEgICAgICAgMAkJKi8KKy8qCU5hbWUJUlNWRCBSU1ZEIExWRFMgV0lERSBBTFRQRVJEIFBFUklPRDIgUEVSSU9EMSBQRVJJT0QwCSovCisvKglEZWZhdWx0CTAgICAgMCAgICAwICAgIDAgICAgMCAgICAgICAwICAgICAgIDAgICAgICAgMAkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUJpdAkJTmFtZQkJRGVmaW5pdGlvbgkJCSovCisvKgktLS0tLS0tLS0JLS0tLS0tLS0tLS0tLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KKy8qCTA3LTA2CTAJUlNWRAkJUmV2ZXJzZWQuIEFsd2F5cyByZWFkIDAJCSovCisvKgkwNQkwCUxWRFMJCVJldmVyc2VkLiBBbHdheXMgcmVhZCAwCQkqLworLyoJMDQJMAlXSURFL1dTQ1NJCUVuYWJsZSB3aWRlICgxNi1iaXRzKSBTQ1NJCSovCisvKgkJCQkJdHJhbnNmZXIuCQkJKi8KKy8qCTAzCTAJQUxUUEVSRC9BTFRQRAlBbHRlcm5hdGUgKFN5bmMuL1BlcmlvZCkgbW9kZS4JKi8KKy8qCQkJCQkJCQkJKi8KKy8qCQkJQEAgV2hlbiB0aGlzIGJpdCBpcyBzZXQsCQkJKi8KKy8qCQkJICAgdGhlIHN5bmNocm9ub3VzIHBlcmlvZCBiaXRzIDI6MAkJKi8KKy8qCQkJICAgaW4gdGhlIFN5bmNocm9ub3VzIE1vZGUgcmVnaXN0ZXIJCSovCisvKgkJCSAgIGFyZSB1c2VkIHRvIHRyYW5zZmVyIGRhdGEJCQkqLworLyoJCQkgICBhdCB0aGUgRmFzdC0yMCByYXRlLgkJCQkqLworLyoJCQlAQCBXaGVuIHRoaXMgYml0IGlzIHVuc2V0LAkJCSovCisvKgkJCSAgIHRoZSBzeW5jaHJvbm91cyBwZXJpb2QgYml0cyAyOjAJCSovCisvKgkJCSAgIGluIHRoZSBTeW5jaHJvbm91cyBNb2RlIFJlZ2lzdGVyCQkqLworLyoJCQkgICBhcmUgdXNlZCB0byB0cmFuc2ZlciBkYXRhCQkJKi8KKy8qCQkJICAgYXQgdGhlIEZhc3QtMTAgcmF0ZSAob3IgRmFzdC00MCB3LyBMVkRTKS4JKi8KKy8qCQkJCQkJCQkJKi8KKy8qCTAyLTAwCTAJUEVSSU9EWzI6MF0vCVN5bmNocm9ub3VzIFNDU0kgVHJhbnNmZXIgUmF0ZS4JKi8KKy8qCQkJU1hQRFswMjowMF0JVGhlc2UgMyBiaXRzIHNwZWNpZnkJCSovCisvKgkJCQkJdGhlIFN5bmNocm9ub3VzIFNDU0kgVHJhbnNmZXIJKi8KKy8qCQkJCQlSYXRlIGZvciBGYXN0LTIwIGFuZCBGYXN0LTEwLgkqLworLyoJCQkJCVRoZXNlIGJpdHMgYXJlIGFsc28gcmVzZXQJKi8KKy8qCQkJCQlieSBhIFNDU0kgQnVzIHJlc2V0LgkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUZvciBGYXN0LTEwIGJpdCBBTFRQRCA9IDAgYW5kIExWRFMgPSAwCQkJCSovCisvKglhbmQgYml0MixiaXQxLGJpdDAgaXMgZGVmaW5lZCBhcyBmb2xsb3dzIDoJCQkqLworLyoJCQkJCQkJCQkqLworLyoJMDAwCTEwMG5zLCAxMC4wIE1IegkJCQkJCSovCisvKgkwMDEJMTUwbnMsICA2LjYgTUh6CQkJCQkJKi8KKy8qCTAxMAkyMDBucywgIDUuMCBNSHoJCQkJCQkqLworLyoJMDExCTI1MG5zLCAgNC4wIE1IegkJCQkJCSovCisvKgkxMDAJMzAwbnMsICAzLjMgTUh6CQkJCQkJKi8KKy8qCTEwMQkzNTBucywgIDIuOCBNSHoJCQkJCQkqLworLyoJMTEwCTQwMG5zLCAgMi41IE1IegkJCQkJCSovCisvKgkxMTEJNDUwbnMsICAyLjIgTUh6CQkJCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUZvciBGYXN0LTIwIGJpdCBBTFRQRCA9IDEgYW5kIExWRFMgPSAwCQkJCSovCisvKglhbmQgYml0MixiaXQxLGJpdDAgaXMgZGVmaW5lZCBhcyBmb2xsb3dzIDoJCQkqLworLyoJCQkJCQkJCQkqLworLyoJMDAwCSA1MG5zLCAyMC4wIE1IegkJCQkJCSovCisvKgkwMDEJIDc1bnMsIDEzLjMgTUh6CQkJCQkJKi8KKy8qCTAxMAkxMDBucywgMTAuMCBNSHoJCQkJCQkqLworLyoJMDExCTEyNW5zLCAgOC4wIE1IegkJCQkJCSovCisvKgkxMDAJMTUwbnMsICA2LjYgTUh6CQkJCQkJKi8KKy8qCTEwMQkxNzVucywgIDUuNyBNSHoJCQkJCQkqLworLyoJMTEwCTIwMG5zLCAgNS4wIE1IegkJCQkJCSovCisvKgkxMTEJMjUwbnMsICA0LjAgTUh6ICAgS0c6IE1heWJlIDIyNW5zLCA0LjQgTUh6CQkqLworLyoJCQkJCQkJCQkqLworLyoJRm9yIEZhc3QtNDAgYml0IEFMVFBEID0gMCBhbmQgTFZEUyA9IDEJCQkJKi8KKy8qCWFuZCBiaXQyLGJpdDEsYml0MCBpcyBkZWZpbmVkIGFzIGZvbGxvd3MgOgkJCSovCisvKgkJCQkJCQkJCSovCisvKgkwMDAJIDI1bnMsIDQwLjAgTUh6CQkJCQkJKi8KKy8qCTAwMQkgNTBucywgMjAuMCBNSHoJCQkJCQkqLworLyoJMDEwCSA3NW5zLCAxMy4zIE1IegkJCQkJCSovCisvKgkwMTEJMTAwbnMsIDEwLjAgTUh6CQkJCQkJKi8KKy8qCTEwMAkxMjVucywgIDguMCBNSHoJCQkJCQkqLworLyoJMTAxCTE1MG5zLCAgNi42IE1IegkJCQkJCSovCisvKgkxMTAJMTc1bnMsICA1LjcgTUh6CQkJCQkJKi8KKy8qCTExMQkyMDBucywgIDUuMCBNSHoJCQkJCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUUk1fUzEwNDBfU0NTSV9UQVJHRVRJRAkJMHg4NgkvKiBTQ1NJIFRhcmdldCBJRCAoUi9XKQkJCSovCisjZGVmaW5lIFRSTV9TMTA0MF9TQ1NJX0lETVNHCQkweDg3CS8qIFNDU0kgSWRlbnRpZnkgTWVzc2FnZSAoUikJCSovCisjZGVmaW5lIFRSTV9TMTA0MF9TQ1NJX0hPU1RJRAkJMHg4NwkvKiBTQ1NJIEhvc3QgSUQgKFcpCQkJKi8KKyNkZWZpbmUgVFJNX1MxMDQwX1NDU0lfQ09VTlRFUgkJMHg4OAkvKiBTQ1NJIFRyYW5zZmVyIENvdW50ZXIgMjRiaXRzKFIvVykJKi8KKworI2RlZmluZSBUUk1fUzEwNDBfU0NTSV9JTlRFTgkJMHg4QwkvKiBTQ1NJIEludGVycnVwdCBFbmFibGUgKFIvVykJCSovCisjZGVmaW5lIEVOX1NDQU0JCQkJMHg4MAkvKiBFbmFibGUgU0NBTSBzZWxlY3Rpb24gaW50ZXJydXB0CSovCisjZGVmaW5lIEVOX1NFTEVDVAkJCTB4NDAJLyogRW5hYmxlIHNlbGVjdGlvbiBpbnRlcnJ1cHQJCSovCisjZGVmaW5lIEVOX1NFTFRJTUVPVVQJCQkweDIwCS8qIEVuYWJsZSBzZWxlY3Rpb24gdGltZW91dCBpbnRlcnJ1cHQJKi8KKyNkZWZpbmUgRU5fRElTQ09OTkVDVAkJCTB4MTAJLyogRW5hYmxlIGJ1cyBkaXNjb25uZWN0ZWQgaW50ZXJydXB0CSovCisjZGVmaW5lIEVOX1JFU0VMRUNURUQJCQkweDA4CS8qIEVuYWJsZSByZXNlbGVjdGVkIGludGVycnVwdAkJKi8KKyNkZWZpbmUgRU5fU0NTSVJFU0VUCQkJMHgwNAkvKiBFbmFibGUgU0NTSSByZXNldCBkZXRlY3RlZCBpbnRlcnJ1cHQJKi8KKyNkZWZpbmUgRU5fQlVTU0VSVklDRQkJCTB4MDIJLyogRW5hYmxlIGJ1cyBzZXJ2aWNlIGludGVycnVwdAkJKi8KKyNkZWZpbmUgRU5fQ01ERE9ORQkJCTB4MDEJLyogRW5hYmxlIFNDU0kgY29tbWFuZCBkb25lIGludGVycnVwdAkqLworCisjZGVmaW5lIFRSTV9TMTA0MF9TQ1NJX0NPTkZJRzAJCTB4OEQJLyogU0NTSSBDb25maWd1cmF0aW9uIDAgKFIvVykJCSovCisjZGVmaW5lIFBIQVNFTEFUQ0gJCQkweDQwCS8qIEVuYWJsZSBwaGFzZSBsYXRjaAkJCSovCisjZGVmaW5lIElOSVRJQVRPUgkJCTB4MjAJLyogRW5hYmxlIGluaXRpYXRvciBtb2RlCQkqLworI2RlZmluZSBQQVJJVFlDSEVDSwkJCTB4MTAJLyogRW5hYmxlIHBhcml0eSBjaGVjawkJCSovCisjZGVmaW5lIEJMT0NLUlNUCQkJMHgwMQkvKiBEaXNhYmxlIFNDU0kgcmVzZXQxCQkJKi8KKworI2RlZmluZSBUUk1fUzEwNDBfU0NTSV9DT05GSUcxCQkweDhFCS8qIFNDU0kgQ29uZmlndXJhdGlvbiAxIChSL1cpCQkqLworI2RlZmluZSBBQ1RJVkVfTkVHUExVUwkJCTB4MTAJLyogRW5oYW5jZSBhY3RpdmUgbmVnYXRpb24JCSovCisjZGVmaW5lIEZJTFRFUl9ESVNBQkxFCQkJMHgwOAkvKiBEaXNhYmxlIFNDU0kgZGF0YSBmaWx0ZXIJCSovCisjZGVmaW5lIEZBU1RfRklMVEVSCQkJMHgwNAkvKiA/CQkJCQkqLworI2RlZmluZSBBQ1RJVkVfTkVHCQkJMHgwMgkvKiBFbmFibGUgYWN0aXZlIG5lZ2F0aW9uCQkqLworCisjZGVmaW5lIFRSTV9TMTA0MF9TQ1NJX0NPTkZJRzIJCTB4OEYJLyogU0NTSSBDb25maWd1cmF0aW9uIDIgKFIvVykJCSovCisjZGVmaW5lIENGRzJfV0lERUZJRk8JCQkweDAyCS8qCQkJCQkqLworCisjZGVmaW5lIFRSTV9TMTA0MF9TQ1NJX0NPTU1BTkQJCTB4OTAJLyogU0NTSSBDb21tYW5kIChSL1cpCQkJKi8KKyNkZWZpbmUgU0NNRF9DT01QCQkJMHgxMgkvKiBDb21tYW5kIGNvbXBsZXRlCQkJKi8KKyNkZWZpbmUgU0NNRF9TRUxfQVROCQkJMHg2MAkvKiBTZWxlY3Rpb24gd2l0aCBBVE4JCQkqLworI2RlZmluZSBTQ01EX1NFTF9BVE4zCQkJMHg2NAkvKiBTZWxlY3Rpb24gd2l0aCBBVE4zCQkJKi8KKyNkZWZpbmUgU0NNRF9TRUxfQVROU1RPUAkJMHhCOAkvKiBTZWxlY3Rpb24gd2l0aCBBVE4gYW5kIFN0b3AJCSovCisjZGVmaW5lIFNDTURfRklGT19PVVQJCQkweEMwCS8qIFNDU0kgRklGTyB0cmFuc2ZlciBvdXQJCSovCisjZGVmaW5lIFNDTURfRE1BX09VVAkJCTB4QzEJLyogU0NTSSBETUEgdHJhbnNmZXIgb3V0CQkqLworI2RlZmluZSBTQ01EX0ZJRk9fSU4JCQkweEMyCS8qIFNDU0kgRklGTyB0cmFuc2ZlciBpbgkJKi8KKyNkZWZpbmUgU0NNRF9ETUFfSU4JCQkweEMzCS8qIFNDU0kgRE1BIHRyYW5zZmVyIGluCQkJKi8KKyNkZWZpbmUgU0NNRF9NU0dBQ0NFUFQJCQkweEQ4CS8qIE1lc3NhZ2UgYWNjZXB0CQkJKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUNvZGUJQ29tbWFuZCBEZXNjcmlwdGlvbgkJCQkJKi8KKy8qCS0tLS0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkJKi8KKy8qCTAyCUVuYWJsZSByZXNlbGVjdGlvbiB3aXRoIEZJRk8JCQkJKi8KKy8qCTQwCVNlbGVjdCB3aXRob3V0IEFUTiB3aXRoIEZJRk8JCQkJKi8KKy8qCTYwCVNlbGVjdCB3aXRoIEFUTiB3aXRoIEZJRk8JCQkJKi8KKy8qCTY0CVNlbGVjdCB3aXRoIEFUTjMgd2l0aCBGSUZPCQkJCSovCisvKglBMAlTZWxlY3Qgd2l0aCBBVE4gYW5kIHN0b3Agd2l0aCBGSUZPCQkJKi8KKy8qCUMwCVRyYW5zZmVyIGluZm9ybWF0aW9uIG91dCB3aXRoIEZJRk8JCQkqLworLyoJQzEJVHJhbnNmZXIgaW5mb3JtYXRpb24gb3V0IHdpdGggRE1BCQkJKi8KKy8qCUMyCVRyYW5zZmVyIGluZm9ybWF0aW9uIGluIHdpdGggRklGTwkJCSovCisvKglDMwlUcmFuc2ZlciBpbmZvcm1hdGlvbiBpbiB3aXRoIERNQQkJCSovCisvKgkxMglJbml0aWF0b3IgY29tbWFuZCBjb21wbGV0ZSB3aXRoIEZJRk8JCQkqLworLyoJNTAJSW5pdGlhdG9yIHRyYW5zZmVyIGluZm9ybWF0aW9uIG91dCBzZXF1ZW5jZSB3aXRob3V0IEFUTgkqLworLyoJCXdpdGggRklGTwkJCQkJCSovCisvKgk3MAlJbml0aWF0b3IgdHJhbnNmZXIgaW5mb3JtYXRpb24gb3V0IHNlcXVlbmNlIHdpdGggQVROCSovCisvKgkJd2l0aCBGSUZPCQkJCQkJKi8KKy8qCTc0CUluaXRpYXRvciB0cmFuc2ZlciBpbmZvcm1hdGlvbiBvdXQgc2VxdWVuY2Ugd2l0aCBBVE4zCSovCisvKgkJd2l0aCBGSUZPCQkJCQkJKi8KKy8qCTUyCUluaXRpYXRvciB0cmFuc2ZlciBpbmZvcm1hdGlvbiBpbiBzZXF1ZW5jZSB3aXRob3V0IEFUTgkqLworLyoJCXdpdGggRklGTwkJCQkJCSovCisvKgk3MglJbml0aWF0b3IgdHJhbnNmZXIgaW5mb3JtYXRpb24gaW4gc2VxdWVuY2Ugd2l0aCBBVE4JKi8KKy8qCQl3aXRoIEZJRk8JCQkJCQkqLworLyoJNzYJSW5pdGlhdG9yIHRyYW5zZmVyIGluZm9ybWF0aW9uIGluIHNlcXVlbmNlIHdpdGggQVROMwkqLworLyoJCXdpdGggRklGTwkJCQkJCSovCisvKgk5MAlJbml0aWF0b3IgdHJhbnNmZXIgaW5mb3JtYXRpb24gb3V0IGNvbW1hbmQgY29tcGxldGUJKi8KKy8qCQl3aXRoIEZJRk8JCQkJCQkqLworLyoJOTIJSW5pdGlhdG9yIHRyYW5zZmVyIGluZm9ybWF0aW9uIGluIGNvbW1hbmQgY29tcGxldGUJKi8KKy8qCQl3aXRoIEZJRk8JCQkJCQkqLworLyoJRDIJRW5hYmxlIHNlbGVjdGlvbgkJCQkJKi8KKy8qCTA4CVJlc2VsZWN0aW9uCQkJCQkJKi8KKy8qCTQ4CURpc2Nvbm5lY3QgY29tbWFuZCB3aXRoIEZJRk8JCQkJKi8KKy8qCTg4CVRlcm1pbmF0ZSBjb21tYW5kIHdpdGggRklGTwkJCQkqLworLyoJQzgJVGFyZ2V0IGNvbW1hbmQgY29tcGxldGUgd2l0aCBGSUZPCQkJKi8KKy8qCTE4CVNDQU0gQXJiaXRyYXRpb24vIFNlbGVjdGlvbgkJCQkqLworLyoJNUEJRW5hYmxlIHJlc2VsZWN0aW9uCQkJCQkqLworLyoJOTgJU2VsZWN0IHdpdGhvdXQgQVROIHdpdGggRklGTwkJCQkqLworLyoJQjgJU2VsZWN0IHdpdGggQVROIHdpdGggRklGTwkJCQkqLworLyoJRDgJTWVzc2FnZSBBY2NlcHRlZAkJCQkJKi8KKy8qCTU4CU5PUAkJCQkJCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUUk1fUzEwNDBfU0NTSV9USU1FT1VUCQkweDkxCS8qIFNDU0kgVGltZSBPdXQgVmFsdWUgKFIvVykJCSovCisjZGVmaW5lIFRSTV9TMTA0MF9TQ1NJX0ZJRk8JCTB4OTgJLyogU0NTSSBGSUZPIChSL1cpCQkJKi8KKworI2RlZmluZSBUUk1fUzEwNDBfU0NTSV9UQ1IwCQkweDlDCS8qIFNDU0kgVGFyZ2V0IENvbnRyb2wgMCAoUi9XKQkJKi8KKyNkZWZpbmUgVENSMF9XSURFX05FR09fRE9ORQkJMHg4MDAwCS8qIFdpZGUgbmVnbyBkb25lCQkJKi8KKyNkZWZpbmUgVENSMF9TWU5DX05FR09fRE9ORQkJMHg0MDAwCS8qIFN5bmNocm9ub3VzIG5lZ28gZG9uZQkJKi8KKyNkZWZpbmUgVENSMF9FTkFCTEVfTFZEUwkJMHgyMDAwCS8qIEVuYWJsZSBMVkRTIHN5bmNocm9ub3VzCQkqLworI2RlZmluZSBUQ1IwX0VOQUJMRV9XSURFCQkweDEwMDAJLyogRW5hYmxlIFdJREUgc3luY2hyb25vdXMJCSovCisjZGVmaW5lIFRDUjBfRU5BQkxFX0FMVAkJCTB4MDgwMAkvKiBFbmFibGUgYWx0ZXJuYXRlIHN5bmNocm9ub3VzCQkqLworI2RlZmluZSBUQ1IwX1BFUklPRF9NQVNLCQkweDA3MDAJLyogVHJhbnNmZXIgcmF0ZQkJCSovCisKKyNkZWZpbmUgVENSMF9ET19XSURFX05FR08JCTB4MDA4MAkvKiBEbyB3aWRlIE5FR08JCQkJKi8KKyNkZWZpbmUgVENSMF9ET19TWU5DX05FR08JCTB4MDA0MAkvKiBEbyBzeW5jIE5FR08JCQkJKi8KKyNkZWZpbmUgVENSMF9ESVNDT05ORUNUX0VOCQkweDAwMjAJLyogRGlzY29ubmVjdGlvbiBlbmFibGUJCQkqLworI2RlZmluZSBUQ1IwX09GRlNFVF9NQVNLCQkweDAwMUYJLyogT2Zmc2V0IG51bWJlcgkJCSovCisKKyNkZWZpbmUgVFJNX1MxMDQwX1NDU0lfVENSMQkJMHg5RQkvKiBTQ1NJIFRhcmdldCBDb250cm9sIDEgKFIvVykJCSovCisjZGVmaW5lIE1BWFRBR19NQVNLCQkJMHg3RjAwCS8qIE1heGltdW0gdGFncyAoMTI3KQkJCSovCisjZGVmaW5lIE5PTl9UQUdfQlVTWQkJCTB4MDA4MAkvKiBOb24gdGFnIGNvbW1hbmQgYWN0aXZlCQkqLworI2RlZmluZSBBQ1RUQUdfTUFTSwkJCTB4MDA3RgkvKiBBY3RpdmUgdGFncwkJCQkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJVGhlIERNQSByZWdpc3RlciBvZmZzZXQgZm9yIFRSTV9TMTA0MAkJCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVFJNX1MxMDQwX0RNQV9DT01NQU5ECQkweEEwCS8qIERNQSBDb21tYW5kIChSL1cpCQkJKi8KKyNkZWZpbmUgRE1BQ01EX1NHCQkJMHgwMgkvKiBFbmFibGUgSFcgUy9HIHN1cHBvcnQJCSovCisjZGVmaW5lIERNQUNNRF9ESVIJCQkweDAxCS8qIDEgPSByZWFkIGZyb20gU0NTSSB3cml0ZSB0byBIb3N0CSovCisjZGVmaW5lIFhGRVJEQVRBSU5fU0cJCQkweDAxMDMJLyogVHJhbnNmZXIgZGF0YSBpbiAgdy8gIFNHCQkqLworI2RlZmluZSBYRkVSREFUQU9VVF9TRwkJCTB4MDEwMgkvKiBUcmFuc2ZlciBkYXRhIG91dCB3LyAgU0cJCSovCisjZGVmaW5lIFhGRVJEQVRBSU4JCQkweDAxMDEJLyogVHJhbnNmZXIgZGF0YSBpbiAgdy9vIFNHCQkqLworI2RlZmluZSBYRkVSREFUQU9VVAkJCTB4MDEwMAkvKiBUcmFuc2ZlciBkYXRhIG91dCB3L28gU0cJCSovCisKKyNkZWZpbmUgVFJNX1MxMDQwX0RNQV9GSUZPQ05UCQkweEExCS8qIERNQSBGSUZPIENvdW50ZXIgKFIpCQkJKi8KKworI2RlZmluZSBUUk1fUzEwNDBfRE1BX0NPTlRST0wJCTB4QTEJLyogRE1BIENvbnRyb2wgKFcpCQkJKi8KKyNkZWZpbmUgRE1BUkVTRVRNT0RVTEUJCQkweDEwCS8qIFJlc2V0IFBDSS9ETUEgbW9kdWxlCQkJKi8KKyNkZWZpbmUgU1RPUERNQVhGRVIJCQkweDA4CS8qIFN0b3AgIERNQSB0cmFuc2ZlcgkJCSovCisjZGVmaW5lIEFCT1JUWEZFUgkJCTB4MDQJLyogQWJvcnQgRE1BIHRyYW5zZmVyCQkJKi8KKyNkZWZpbmUgQ0xSWEZJRk8JCQkweDAyCS8qIENsZWFyIERNQSB0cmFuc2ZlciBGSUZPCQkqLworI2RlZmluZSBTVEFSVERNQVhGRVIJCQkweDAxCS8qIFN0YXJ0IERNQSB0cmFuc2ZlcgkJCSovCisKKyNkZWZpbmUgVFJNX1MxMDQwX0RNQV9GSUZPU1RBVAkJMHhBMgkvKiBETUEgRklGTyBTdGF0dXMgKFIpCQkJKi8KKworI2RlZmluZSBUUk1fUzEwNDBfRE1BX1NUQVRVUwkJMHhBMwkvKiBETUEgSW50ZXJydXB0IFN0YXR1cyAoUi9XKQkJKi8KKyNkZWZpbmUgWEZFUlBFTkRJTkcJCQkweDgwCS8qIFRyYW5zZmVyIHBlbmRpbmcJCQkqLworI2RlZmluZSBTQ1NJQlVTWQkJCTB4NDAJLyogU0NTSSBidXN5CQkJCSovCisjZGVmaW5lIEdMT0JBTElOVAkJCTB4MjAJLyogRE1BX0lOVEVOIGJpdCAwLTQgc2V0CQkqLworI2RlZmluZSBGT1JDRURNQUNPTVAJCQkweDEwCS8qIEZvcmNlIERNQSB0cmFuc2ZlciBjb21wbGV0ZQkJKi8KKyNkZWZpbmUgRE1BWEZFUkVSUk9SCQkJMHgwOAkvKiBETUEgdHJhbnNmZXIgZXJyb3IJCQkqLworI2RlZmluZSBETUFYRkVSQUJPUlQJCQkweDA0CS8qIERNQSB0cmFuc2ZlciBhYm9ydAkJCSovCisjZGVmaW5lIERNQVhGRVJDT01QCQkJMHgwMgkvKiBCdXMgTWFzdGVyIFhGRVIgQ29tcGxldGUgc3RhdHVzCSovCisjZGVmaW5lIFNDU0lDT01QCQkJMHgwMQkvKiBTQ1NJIGNvbXBsZXRlIGludGVycnVwdAkJKi8KKworI2RlZmluZSBUUk1fUzEwNDBfRE1BX0lOVEVOCQkweEE0CS8qIERNQSBJbnRlcnJ1cHQgRW5hYmxlIChSL1cpCQkqLworI2RlZmluZSBFTl9GT1JDRURNQUNPTVAJCQkweDEwCS8qIEZvcmNlIERNQSB0cmFuc2ZlciBjb21wbGV0ZQkJKi8KKyNkZWZpbmUgRU5fRE1BWEZFUkVSUk9SCQkJMHgwOAkvKiBETUEgdHJhbnNmZXIgZXJyb3IJCQkqLworI2RlZmluZSBFTl9ETUFYRkVSQUJPUlQJCQkweDA0CS8qIERNQSB0cmFuc2ZlciBhYm9ydAkJCSovCisjZGVmaW5lIEVOX0RNQVhGRVJDT01QCQkJMHgwMgkvKiBCdXMgTWFzdGVyIFhGRVIgQ29tcGxldGUgc3RhdHVzCSovCisjZGVmaW5lIEVOX1NDU0lJTlRSCQkJMHgwMQkvKiBFbmFibGUgU0NTSSBjb21wbGV0ZSBpbnRlcnJ1cHQJKi8KKworI2RlZmluZSBUUk1fUzEwNDBfRE1BX0NPTkZJRwkJMHhBNgkvKiBETUEgQ29uZmlndXJhdGlvbiAoUi9XKQkJKi8KKyNkZWZpbmUgRE1BX0VOSEFOQ0UJCQkweDgwMDAJLyogRW5hYmxlIERNQSBlbmhhbmNlIGZlYXR1cmUgKFNHPykJKi8KKyNkZWZpbmUgRE1BX1BDSV9EVUFMX0FERFIJCTB4NDAwMAkvKgkJCQkJKi8KKyNkZWZpbmUgRE1BX0NGR19SRVMJCQkweDIwMDAJLyogQWx3YXlzIDEJCQkJKi8KKyNkZWZpbmUgRE1BX0FVVE9fQ0xSX0ZJRk8JCTB4MTAwMAkvKiBESVNhYmxlIERNQSBhdXRvIGNsZWFyIEZJRk8JCSovCisjZGVmaW5lIERNQV9NRU1fTVVMVElfUkVBRAkJMHgwODAwCS8qCQkJCQkqLworI2RlZmluZSBETUFfTUVNX1dSSVRFX0lOVkFMCQkweDA0MDAJLyogTWVtb3J5IHdyaXRlIGFuZCBpbnZhbGlkYXRlCQkqLworI2RlZmluZSBETUFfRklGT19DVFJMCQkJMHgwMzAwCS8qIENvbnRyb2wgRklGTyBvcGVyYXRpb24gd2l0aCBETUEJKi8KKyNkZWZpbmUgRE1BX0ZJRk9fSEFMRl9IQUxGCQkweDAyMDAJLyogS2VlcCBoYWxmIGZpbGxlZCBvbiBib3RoIHJlYWQvd3JpdGUJKi8KKworI2RlZmluZSBUUk1fUzEwNDBfRE1BX1hDTlQJCTB4QTgJLyogRE1BIFRyYW5zZmVyIENvdW50ZXIgKFIvVyksIDI0Yml0cwkqLworI2RlZmluZSBUUk1fUzEwNDBfRE1BX0NYQ05UCQkweEFDCS8qIERNQSBDdXJyZW50IFRyYW5zZmVyIENvdW50ZXIgKFIpCSovCisjZGVmaW5lIFRSTV9TMTA0MF9ETUFfWExPV0FERFIJCTB4QjAJLyogRE1BIFRyYW5zZmVyIFBoeXNpY2FsIExvdyBBZGRyZXNzCSovCisjZGVmaW5lIFRSTV9TMTA0MF9ETUFfWEhJR0hBRERSCQkweEI0CS8qIERNQSBUcmFuc2ZlciBQaHlzaWNhbCBIaWdoIEFkZHJlc3MJKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCVRoZSBnZW5lcmFsIHJlZ2lzdGVyIG9mZnNldCBmb3IgVFJNX1MxMDQwCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFRSTV9TMTA0MF9HRU5fQ09OVFJPTAkJMHhENAkvKiBHbG9iYWwgQ29udHJvbAkJCSovCisjZGVmaW5lIENUUkxfTEVECQkJMHg4MAkvKiBDb250cm9sIG9uYm9hcmQgTEVECQkJKi8KKyNkZWZpbmUgRU5fRUVQUk9NCQkJMHgxMAkvKiBFbmFibGUgRUVQUk9NIHByb2dyYW1taW5nCQkqLworI2RlZmluZSBESVNfVEVSTQkJCTB4MDgJLyogRGlzYWJsZSBvbmJvYXJkIHRlcm1pbmF0aW9uCQkqLworI2RlZmluZSBBVVRPVEVSTQkJCTB4MDQJLyogRW5hYmxlIEF1dG8gU0NTSSB0ZXJtaW5hdG9yCQkqLworI2RlZmluZSBMT1c4VEVSTQkJCTB4MDIJLyogRW5hYmxlIExvd2VyIDggYml0IFNDU0kgdGVybWluYXRvcgkqLworI2RlZmluZSBVUDhURVJNCQkJCTB4MDEJLyogRW5hYmxlIFVwcGVyIDggYml0IFNDU0kgdGVybWluYXRvcgkqLworCisjZGVmaW5lIFRSTV9TMTA0MF9HRU5fU1RBVFVTCQkweEQ1CS8qIEdsb2JhbCBTdGF0dXMJCQkqLworI2RlZmluZSBHVElNRU9VVAkJCTB4ODAJLyogR2xvYmFsIHRpbWVyIHJlYWNoIDAJCQkqLworI2RlZmluZSBFWFQ2OEhJR0gJCQkweDQwCS8qIEhpZ2hlciA4IGJpdCBjb25uZWN0ZWQgZXh0ZXJuYWxseQkqLworI2RlZmluZSBJTlQ2OEhJR0gJCQkweDIwCS8qIEhpZ2hlciA4IGJpdCBjb25uZWN0ZWQgaW50ZXJuYWxseQkqLworI2RlZmluZSBDT041MDY4CQkJCTB4MTAJLyogRXh0ZXJuYWwgNTAvNjggcGluIGNvbm5lY3RlZCAobG93KQkqLworI2RlZmluZSBDT042OAkJCQkweDA4CS8qIEludGVybmFsIDY4IHBpbiBjb25uZWN0ZWQgKGxvdykJKi8KKyNkZWZpbmUgQ09ONTAJCQkJMHgwNAkvKiBJbnRlcm5hbCA1MCBwaW4gY29ubmVjdGVkIChsb3chKQkqLworI2RlZmluZSBXSURFU0NTSQkJCTB4MDIJLyogV2lkZSBTQ1NJIGNhcmQJCQkqLworI2RlZmluZSBTVEFUVVNfTE9BRF9ERUZBVUxUCQkweDAxCS8qCQkJCQkqLworCisjZGVmaW5lIFRSTV9TMTA0MF9HRU5fTlZSQU0JCTB4RDYJLyogU2VyaWFsIE5PTi1WT0xBVElMRSBSQU0gcG9ydAkJKi8KKyNkZWZpbmUgTlZSX0JJVE9VVAkJCTB4MDgJLyogU2VyaWFsIGRhdGEgb3V0CQkJKi8KKyNkZWZpbmUgTlZSX0JJVElOCQkJMHgwNAkvKiBTZXJpYWwgZGF0YSBpbgkJCSovCisjZGVmaW5lIE5WUl9DTE9DSwkJCTB4MDIJLyogU2VyaWFsIGNsb2NrCQkJCSovCisjZGVmaW5lIE5WUl9TRUxFQ1QJCQkweDAxCS8qIFNlcmlhbCBzZWxlY3QJCQkqLworCisjZGVmaW5lIFRSTV9TMTA0MF9HRU5fRURBVEEJCTB4RDcJLyogUGFyYWxsZWwgRUVQUk9NIGRhdGEgcG9ydAkJKi8KKyNkZWZpbmUgVFJNX1MxMDQwX0dFTl9FQUREUkVTUwkJMHhEOAkvKiBQYXJhbGxlbCBFRVBST00gYWRkcmVzcwkJKi8KKyNkZWZpbmUgVFJNX1MxMDQwX0dFTl9USU1FUgkJMHhEQgkvKiBHbG9iYWwgdGltZXIJCQkJKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCU52bVRhckNmZzA6IFRhcmdldCBjb25maWd1cmF0aW9uIGJ5dGUgMCA6Li5wRENCLT5EZXZNb2RlCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBOVENfRE9fV0lERV9ORUdPCQkweDIwCS8qIFdpZGUgbmVnb3RpYXRlCQkJKi8KKyNkZWZpbmUgTlRDX0RPX1RBR19RVUVVRUlORwkJMHgxMAkvKiBFbmFibGUgU0NTSSB0YWcgcXVldWluZwkJKi8KKyNkZWZpbmUgTlRDX0RPX1NFTkRfU1RBUlQJCTB4MDgJLyogU2VuZCBzdGFydCBjb21tYW5kIFNQSU5VUAkJKi8KKyNkZWZpbmUgTlRDX0RPX0RJU0NPTk5FQ1QJCTB4MDQJLyogRW5hYmxlIFNDU0kgZGlzY29ubmVjdAkJKi8KKyNkZWZpbmUgTlRDX0RPX1NZTkNfTkVHTwkJMHgwMgkvKiBTeW5jIG5lZ290aWF0aW9uCQkJKi8KKyNkZWZpbmUgTlRDX0RPX1BBUklUWV9DSEsJCTB4MDEJLyogKGl0IHNvdWxkIGRlZmluZSBhdCBOQUMpCQkqLworCQkJCQkJLyogUGFyaXR5IGNoZWNrIGVuYWJsZQkJCSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKglOdnJhbSBJbml0aWF0ZXIgYml0cyBkZWZpbml0aW9uCQkJCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAwCisjZGVmaW5lIE1PUkUyX0RSVgkJCUJJVDAKKyNkZWZpbmUgR1JFQVRFUl8xRwkJCUJJVDEKKyNkZWZpbmUgUlNUX1NDU0lfQlVTCQkJQklUMgorI2RlZmluZSBBQ1RJVkVfTkVHQVRJT04JCQlCSVQzCisjZGVmaW5lIE5PX1NFRUsJCQkJQklUNAorI2RlZmluZSBMVU5fQ0hFQ0sJCQlCSVQ1CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCU52cmFtIEFkYXB0ZXIgQ2ZnIGJpdHMgZGVmaW5pdGlvbgkJCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTkFDX1NDQU5MVU4JCQkweDIwCS8qIEluY2x1ZGUgTFVOIGFzIEJJT1MgZGV2aWNlCQkqLworI2RlZmluZSBOQUNfUE9XRVJPTl9TQ1NJX1JFU0VUCQkweDA0CS8qIFBvd2VyIG9uIHJlc2V0IGVuYWJsZQkJKi8KKyNkZWZpbmUgTkFDX0dSRUFURVJfMUcJCQkweDAyCS8qID4gMUcgc3VwcG9ydCBlbmFibGUJCQkqLworI2RlZmluZSBOQUNfR1QyRFJJVkVTCQkJMHgwMQkvKiBTdXBwb3J0IG1vcmUgdGhhbiAyIGRyaXZlcwkJKi8KKy8qICNkZWZpbmUgTkFDX0RPX1BBUklUWV9DSEsJCTB4MDggKi8JLyogUGFyaXR5IGNoZWNrIGVuYWJsZQkJCSovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RlY19lc3AuYyBiL2RyaXZlcnMvc2NzaS9kZWNfZXNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1Zjk1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9kZWNfZXNwLmMKQEAgLTAsMCArMSw1NzMgQEAKKy8qCisgKiBkZWNfZXNwLmM6IERyaXZlciBmb3IgU0NTSSBjaGlwcyBvbiBJT0FTSUMgYmFzZWQgVFVSQk9jaGFubmVsIERFQ3N0YXRpb25zCisgKiAgICAgICAgICAgIGFuZCBUVVJCT2NoYW5uZWwgUE1BWi1BIGNhcmRzCisgKgorICogVFVSQk9jaGFubmVsIGNoYW5nZXMgYnkgSGFyYWxkIEtvZXJmZ2VuCisgKiBQTUFaLUEgc3VwcG9ydCBieSBEYXZpZCBBaXJsaWUKKyAqCisgKiBiYXNlZCBvbiBqYXp6X2VzcC5jOgorICogQ29weXJpZ2h0IChDKSAxOTk3IFRob21hcyBCb2dlbmRvZXJmZXIgKHRzYm9nZW5kQGFscGhhLmZyYW5rZW4uZGUpCisgKgorICogamF6el9lc3AgaXMgYmFzZWQgb24gRGF2aWQgUy4gTWlsbGVyJ3MgRVNQIGRyaXZlciBhbmQgY3liZXJfZXNwCisgKgorICogMjAwMDA4MTkgLSBTbWFsbCBQTUFaLUFBIGZpeGVzIGJ5IEZsb3JpYW4gTG9ob2ZmIDxmbG9AcmZjODIyLm9yZz4KKyAqICAgICAgICAgICAgQmUgd2FybmVkIHRoZSBQTUFaLUFBIHdvcmtzIGN1cnJlbnRseSBhcyBhIHNpbmdsZSBjYXJkLgorICogICAgICAgICAgICBEb250IHRyeSB0byBwdXQgbXVsdGlwbGUgY2FyZHMgaW4gb25lIG1hY2hpbmUgLSBUaGV5IGFyZQorICogICAgICAgICAgICBib3RoIGRldGVjdGVkIGJ1dCBpdCBtYXkgY3Jhc2ggdW5kZXIgaGlnaCBsb2FkIGdhcmJsaW5nIHlvdXIKKyAqICAgICAgICAgICAgZGF0YS4KKyAqIDIwMDAxMDA1CS0gSW5pdGlhbGl6YXRpb24gZml4ZXMgZm9yIDIuNC4wLXRlc3Q5CisgKiAJCQkgIEZsb3JpYW4gTG9ob2ZmIDxmbG9AcmZjODIyLm9yZz4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIE1hY2llaiBXLiBSb3p5Y2tpCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGFzbS9kZWMvaW50ZXJydXB0cy5oPgorI2luY2x1ZGUgPGFzbS9kZWMvaW9hc2ljLmg+CisjaW5jbHVkZSA8YXNtL2RlYy9pb2FzaWNfYWRkcnMuaD4KKyNpbmNsdWRlIDxhc20vZGVjL2lvYXNpY19pbnRzLmg+CisjaW5jbHVkZSA8YXNtL2RlYy9tYWNodHlwZS5oPgorI2luY2x1ZGUgPGFzbS9kZWMvdGMuaD4KKworI2RlZmluZSBERUNfU0NTSV9TUkVHIDAKKyNkZWZpbmUgREVDX1NDU0lfRE1BUkVHIDB4NDAwMDAKKyNkZWZpbmUgREVDX1NDU0lfU1JBTSAweDgwMDAwCisjZGVmaW5lIERFQ19TQ1NJX0RJQUcgMHhDMDAwMAorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiTkNSNTNDOXguaCIKKworc3RhdGljIGludCAgZG1hX2J5dGVzX3NlbnQoc3RydWN0IE5DUl9FU1AgKmVzcCwgaW50IGZpZm9fY291bnQpOworc3RhdGljIHZvaWQgZG1hX2RyYWluKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX2Nhbl90cmFuc2ZlcihzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCk7CitzdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIHUzMiB2YWRkcmVzcywgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIHUzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSk7CitzdGF0aWMgdm9pZCBkbWFfbW11X2dldF9zY3NpX29uZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICogc3ApOworc3RhdGljIHZvaWQgZG1hX21tdV9nZXRfc2NzaV9zZ2woc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqIHNwKTsKK3N0YXRpYyB2b2lkIGRtYV9hZHZhbmNlX3NnKHN0cnVjdCBzY3NpX2NtbmQgKiBzcCk7CisKK3N0YXRpYyB2b2lkIHBtYXpfZG1hX2RyYWluKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgcG1hel9kbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIHUzMiB2YWRkcmVzcywgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBwbWF6X2RtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIHUzMiB2YWRkcmVzcywgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBwbWF6X2RtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIHBtYXpfZG1hX2ludHNfb24oc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBwbWF6X2RtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCB1MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpOworc3RhdGljIHZvaWQgcG1hel9kbWFfbW11X2dldF9zY3NpX29uZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICogc3ApOworCisjZGVmaW5lIFRDX0VTUF9SQU1fU0laRSAweDIwMDAwCisjZGVmaW5lIEVTUF9UR1RfRE1BX1NJWkUgKChUQ19FU1BfUkFNX1NJWkUvNykgJiB+KHNpemVvZihpbnQpLTEpKQorI2RlZmluZSBFU1BfTkNNRCA3CisKKyNkZWZpbmUgVENfRVNQX0RNQVJfTUFTSyAgMHgxZmZmZgorI2RlZmluZSBUQ19FU1BfRE1BUl9XUklURSAweDgwMDAwMDAwCisjZGVmaW5lIFRDX0VTUF9ETUFfQUREUih4KSAoKHVuc2lnbmVkKSh4KSAmIFRDX0VTUF9ETUFSX01BU0spCisKK3UzMiBlc3BfdmlydF9idWZmZXI7CitpbnQgc2NzaV9jdXJyZW50X2xlbmd0aDsKKwordm9sYXRpbGUgdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzE2XTsKK3ZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgcG1hel9jbWRfYnVmZmVyWzE2XTsKKwkJCQkvKiBUaGlzIGlzIHdoZXJlIGFsbCBjb21tYW5kcyBhcmUgcHV0CisJCQkJICogYmVmb3JlIHRoZXkgYXJlIHRyYXNmZXJlZCB0byB0aGUgRVNQIGNoaXAKKwkJCQkgKiB2aWEgUElPLgorCQkJCSAqLworCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NzaV9kbWFfbWVycl9pbnQoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIGlycXJldHVybl90IHNjc2lfZG1hX2Vycl9pbnQoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIGlycXJldHVybl90IHNjc2lfZG1hX2ludChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CisKK3N0YXRpYyBpbnQgZGVjX2VzcF9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqIHRwbnQpOworCitzdGF0aWMgaW50IGRlY19lc3BfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpZiAoc2hvc3QtPmlycSkKKwkJZnJlZV9pcnEoc2hvc3QtPmlycSwgTlVMTCk7CisJaWYgKHNob3N0LT5pb19wb3J0ICYmIHNob3N0LT5uX2lvX3BvcnQpCisJCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKKwlzY3NpX3VucmVnaXN0ZXIoc2hvc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQkJPSAiZGVjX2VzcCIsCisJLnByb2NfaW5mbwkJPSBlc3BfcHJvY19pbmZvLAorCS5uYW1lCQkJPSAiTkNSNTNDOTQiLAorCS5kZXRlY3QJCQk9IGRlY19lc3BfZGV0ZWN0LAorCS5zbGF2ZV9hbGxvYwkJPSBlc3Bfc2xhdmVfYWxsb2MsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gZXNwX3NsYXZlX2Rlc3Ryb3ksCisJLnJlbGVhc2UJCT0gZGVjX2VzcF9yZWxlYXNlLAorCS5pbmZvCQkJPSBlc3BfaW5mbywKKwkucXVldWVjb21tYW5kCQk9IGVzcF9xdWV1ZSwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IGVzcF9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBlc3BfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSA3LAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORywKK307CisKKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZXRlY3Rpb24gKi8KK3N0YXRpYyBpbnQgZGVjX2VzcF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICogdHBudCkKK3sKKwlzdHJ1Y3QgTkNSX0VTUCAqZXNwOworCXN0cnVjdCBDb25maWdEZXYgKmVzcF9kZXY7CisJaW50IHNsb3Q7CisJdW5zaWduZWQgbG9uZyBtZW1fc3RhcnQ7CisKKwlpZiAoSU9BU0lDKSB7CisJCWVzcF9kZXYgPSAwOworCQllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgKHZvaWQgKikgZXNwX2Rldik7CisKKwkJLyogRG8gY29tbWFuZCB0cmFuc2ZlciB3aXRoIHByb2dyYW1tZWQgSS9PICovCisJCWVzcC0+ZG9fcGlvX2NtZHMgPSAxOworCisJCS8qIFJlcXVpcmVkIGZ1bmN0aW9ucyAqLworCQllc3AtPmRtYV9ieXRlc19zZW50ID0gJmRtYV9ieXRlc19zZW50OworCQllc3AtPmRtYV9jYW5fdHJhbnNmZXIgPSAmZG1hX2Nhbl90cmFuc2ZlcjsKKwkJZXNwLT5kbWFfZHVtcF9zdGF0ZSA9ICZkbWFfZHVtcF9zdGF0ZTsKKwkJZXNwLT5kbWFfaW5pdF9yZWFkID0gJmRtYV9pbml0X3JlYWQ7CisJCWVzcC0+ZG1hX2luaXRfd3JpdGUgPSAmZG1hX2luaXRfd3JpdGU7CisJCWVzcC0+ZG1hX2ludHNfb2ZmID0gJmRtYV9pbnRzX29mZjsKKwkJZXNwLT5kbWFfaW50c19vbiA9ICZkbWFfaW50c19vbjsKKwkJZXNwLT5kbWFfaXJxX3AgPSAmZG1hX2lycV9wOworCQllc3AtPmRtYV9wb3J0c19wID0gJmRtYV9wb3J0c19wOworCQllc3AtPmRtYV9zZXR1cCA9ICZkbWFfc2V0dXA7CisKKwkJLyogT3B0aW9uYWwgZnVuY3Rpb25zICovCisJCWVzcC0+ZG1hX2JhcnJpZXIgPSAwOworCQllc3AtPmRtYV9kcmFpbiA9ICZkbWFfZHJhaW47CisJCWVzcC0+ZG1hX2ludmFsaWRhdGUgPSAwOworCQllc3AtPmRtYV9pcnFfZW50cnkgPSAwOworCQllc3AtPmRtYV9pcnFfZXhpdCA9IDA7CisJCWVzcC0+ZG1hX3BvbGwgPSAwOworCQllc3AtPmRtYV9yZXNldCA9IDA7CisJCWVzcC0+ZG1hX2xlZF9vZmYgPSAwOworCQllc3AtPmRtYV9sZWRfb24gPSAwOworCisJCS8qIHZpcnR1YWwgRE1BIGZ1bmN0aW9ucyAqLworCQllc3AtPmRtYV9tbXVfZ2V0X3Njc2lfb25lID0gJmRtYV9tbXVfZ2V0X3Njc2lfb25lOworCQllc3AtPmRtYV9tbXVfZ2V0X3Njc2lfc2dsID0gJmRtYV9tbXVfZ2V0X3Njc2lfc2dsOworCQllc3AtPmRtYV9tbXVfcmVsZWFzZV9zY3NpX29uZSA9IDA7CisJCWVzcC0+ZG1hX21tdV9yZWxlYXNlX3Njc2lfc2dsID0gMDsKKwkJZXNwLT5kbWFfYWR2YW5jZV9zZyA9ICZkbWFfYWR2YW5jZV9zZzsKKworCisJCS8qIFNDU0kgY2hpcCBzcGVlZCAqLworCQllc3AtPmNmcmVxID0gMjUwMDAwMDA7CisKKwkJZXNwLT5kcmVncyA9IDA7CisKKwkJLyogRVNQIHJlZ2lzdGVyIGJhc2UgKi8KKwkJZXNwLT5lcmVncyA9IChzdHJ1Y3QgRVNQX3JlZ3MgKikgKHN5c3RlbV9iYXNlICsgSU9BU0lDX1NDU0kpOworCisJCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIgKi8KKwkJZXNwLT5lc3BfY29tbWFuZCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIGNtZF9idWZmZXI7CisKKwkJLyogZ2V0IHZpcnR1YWwgZG1hIGFkZHJlc3MgZm9yIGNvbW1hbmQgYnVmZmVyICovCisJCWVzcC0+ZXNwX2NvbW1hbmRfZHZtYSA9IHZpcnRfdG9fcGh5cyhjbWRfYnVmZmVyKTsKKworCQllc3AtPmlycSA9IGRlY19pbnRlcnJ1cHRbREVDX0lSUV9BU0NdOworCisJCWVzcC0+c2NzaV9pZCA9IDc7CisKKwkJLyogQ2hlY2sgZm9yIGRpZmZlcmVudGlhbCBTQ1NJLWJ1cyAqLworCQllc3AtPmRpZmYgPSAwOworCisJCWVzcF9pbml0aWFsaXplKGVzcCk7CisKKwkJaWYgKHJlcXVlc3RfaXJxKGVzcC0+aXJxLCBlc3BfaW50ciwgU0FfSU5URVJSVVBULAorCQkJCSJuY3I1M2M5NCIsIGVzcC0+ZWhvc3QpKQorCQkJZ290byBlcnJfZGVhbGxvYzsKKwkJaWYgKHJlcXVlc3RfaXJxKGRlY19pbnRlcnJ1cHRbREVDX0lSUV9BU0NfTUVSUl0sCisJCQkJc2NzaV9kbWFfbWVycl9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJCQkibmNyNTNjOTQgZXJyb3IiLCBlc3AtPmVob3N0KSkKKwkJCWdvdG8gZXJyX2ZyZWVfaXJxOworCQlpZiAocmVxdWVzdF9pcnEoZGVjX2ludGVycnVwdFtERUNfSVJRX0FTQ19FUlJdLAorCQkJCXNjc2lfZG1hX2Vycl9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJCQkibmNyNTNjOTQgb3ZlcnJ1biIsIGVzcC0+ZWhvc3QpKQorCQkJZ290byBlcnJfZnJlZV9pcnFfbWVycjsKKwkJaWYgKHJlcXVlc3RfaXJxKGRlY19pbnRlcnJ1cHRbREVDX0lSUV9BU0NfRE1BXSwKKwkJCQlzY3NpX2RtYV9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJCQkibmNyNTNjOTQgZG1hIiwgZXNwLT5laG9zdCkpCisJCQlnb3RvIGVycl9mcmVlX2lycV9lcnI7CisKKwl9CisKKwlpZiAoVFVSQk9DSEFOTkVMKSB7CisJCXdoaWxlICgoc2xvdCA9IHNlYXJjaF90Y19jYXJkKCJQTUFaLUFBIikpID49IDApIHsKKwkJCWNsYWltX3RjX2NhcmQoc2xvdCk7CisKKwkJCWVzcF9kZXYgPSAwOworCQkJZXNwID0gZXNwX2FsbG9jYXRlKHRwbnQsICh2b2lkICopIGVzcF9kZXYpOworCisJCQltZW1fc3RhcnQgPSBnZXRfdGNfYmFzZV9hZGRyKHNsb3QpOworCisJCQkvKiBTdG9yZSBiYXNlIGFkZHIgaW50byBlc3Agc3RydWN0ICovCisJCQllc3AtPnNsb3QgPSBQSFlTQUREUihtZW1fc3RhcnQpOworCisJCQllc3AtPmRyZWdzID0gMDsKKwkJCWVzcC0+ZXJlZ3MgPSAoc3RydWN0IEVTUF9yZWdzICopIChtZW1fc3RhcnQgKyBERUNfU0NTSV9TUkVHKTsKKwkJCWVzcC0+ZG9fcGlvX2NtZHMgPSAxOworCisJCQkvKiBTZXQgdGhlIGNvbW1hbmQgYnVmZmVyICovCisJCQllc3AtPmVzcF9jb21tYW5kID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgcG1hel9jbWRfYnVmZmVyOworCisJCQkvKiBnZXQgdmlydHVhbCBkbWEgYWRkcmVzcyBmb3IgY29tbWFuZCBidWZmZXIgKi8KKwkJCWVzcC0+ZXNwX2NvbW1hbmRfZHZtYSA9IHZpcnRfdG9fcGh5cyhwbWF6X2NtZF9idWZmZXIpOworCisJCQllc3AtPmNmcmVxID0gZ2V0X3RjX3NwZWVkKCk7CisKKwkJCWVzcC0+aXJxID0gZ2V0X3RjX2lycV9ucihzbG90KTsKKworCQkJLyogUmVxdWlyZWQgZnVuY3Rpb25zICovCisJCQllc3AtPmRtYV9ieXRlc19zZW50ID0gJmRtYV9ieXRlc19zZW50OworCQkJZXNwLT5kbWFfY2FuX3RyYW5zZmVyID0gJmRtYV9jYW5fdHJhbnNmZXI7CisJCQllc3AtPmRtYV9kdW1wX3N0YXRlID0gJmRtYV9kdW1wX3N0YXRlOworCQkJZXNwLT5kbWFfaW5pdF9yZWFkID0gJnBtYXpfZG1hX2luaXRfcmVhZDsKKwkJCWVzcC0+ZG1hX2luaXRfd3JpdGUgPSAmcG1hel9kbWFfaW5pdF93cml0ZTsKKwkJCWVzcC0+ZG1hX2ludHNfb2ZmID0gJnBtYXpfZG1hX2ludHNfb2ZmOworCQkJZXNwLT5kbWFfaW50c19vbiA9ICZwbWF6X2RtYV9pbnRzX29uOworCQkJZXNwLT5kbWFfaXJxX3AgPSAmZG1hX2lycV9wOworCQkJZXNwLT5kbWFfcG9ydHNfcCA9ICZkbWFfcG9ydHNfcDsKKwkJCWVzcC0+ZG1hX3NldHVwID0gJnBtYXpfZG1hX3NldHVwOworCisJCQkvKiBPcHRpb25hbCBmdW5jdGlvbnMgKi8KKwkJCWVzcC0+ZG1hX2JhcnJpZXIgPSAwOworCQkJZXNwLT5kbWFfZHJhaW4gPSAmcG1hel9kbWFfZHJhaW47CisJCQllc3AtPmRtYV9pbnZhbGlkYXRlID0gMDsKKwkJCWVzcC0+ZG1hX2lycV9lbnRyeSA9IDA7CisJCQllc3AtPmRtYV9pcnFfZXhpdCA9IDA7CisJCQllc3AtPmRtYV9wb2xsID0gMDsKKwkJCWVzcC0+ZG1hX3Jlc2V0ID0gMDsKKwkJCWVzcC0+ZG1hX2xlZF9vZmYgPSAwOworCQkJZXNwLT5kbWFfbGVkX29uID0gMDsKKworCQkJZXNwLT5kbWFfbW11X2dldF9zY3NpX29uZSA9IHBtYXpfZG1hX21tdV9nZXRfc2NzaV9vbmU7CisJCQllc3AtPmRtYV9tbXVfZ2V0X3Njc2lfc2dsID0gMDsKKwkJCWVzcC0+ZG1hX21tdV9yZWxlYXNlX3Njc2lfb25lID0gMDsKKwkJCWVzcC0+ZG1hX21tdV9yZWxlYXNlX3Njc2lfc2dsID0gMDsKKwkJCWVzcC0+ZG1hX2FkdmFuY2Vfc2cgPSAwOworCisgCQkJaWYgKHJlcXVlc3RfaXJxKGVzcC0+aXJxLCBlc3BfaW50ciwgU0FfSU5URVJSVVBULAorIAkJCQkJICJQTUFaX0FBIiwgZXNwLT5laG9zdCkpIHsKKyAJCQkJZXNwX2RlYWxsb2NhdGUoZXNwKTsKKyAJCQkJcmVsZWFzZV90Y19jYXJkKHNsb3QpOworIAkJCQljb250aW51ZTsKKyAJCQl9CisJCQllc3AtPnNjc2lfaWQgPSA3OworCQkJZXNwLT5kaWZmID0gMDsKKwkJCWVzcF9pbml0aWFsaXplKGVzcCk7CisJCX0KKwl9CisKKwlpZihuZXNwcykgeworCQlwcmludGsoIkVTUDogVG90YWwgb2YgJWQgRVNQIGhvc3RzIGZvdW5kLCAlZCBhY3R1YWxseSBpbiB1c2UuXG4iLCBuZXNwcywgZXNwc19pbl91c2UpOworCQllc3BzX3J1bm5pbmcgPSBlc3BzX2luX3VzZTsKKwkJcmV0dXJuIGVzcHNfaW5fdXNlOworCX0KKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfaXJxX2VycjoKKwlmcmVlX2lycShkZWNfaW50ZXJydXB0W0RFQ19JUlFfQVNDX0VSUl0sIHNjc2lfZG1hX2Vycl9pbnQpOworZXJyX2ZyZWVfaXJxX21lcnI6CisJZnJlZV9pcnEoZGVjX2ludGVycnVwdFtERUNfSVJRX0FTQ19NRVJSXSwgc2NzaV9kbWFfbWVycl9pbnQpOworZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGVzcC0+aXJxLCBlc3BfaW50cik7CitlcnJfZGVhbGxvYzoKKwllc3BfZGVhbGxvY2F0ZShlc3ApOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBETUEgRnVuY3Rpb25zICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NzaV9kbWFfbWVycl9pbnQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwcmludGsoIkdvdCB1bmV4cGVjdGVkIFNDU0kgRE1BIEludGVycnVwdCEgPCAiKTsKKwlwcmludGsoIlNDU0lfRE1BX01FTVJERVJSICIpOworCXByaW50aygiPlxuIik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzY3NpX2RtYV9lcnJfaW50KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJLyogZW1wdHkgKi8KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHNjc2lfZG1hX2ludChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUzMiBzY3NpX25leHRfcHRyOworCisJc2NzaV9uZXh0X3B0ciA9IGlvYXNpY19yZWFkKElPX1JFR19TQ1NJX0RNQV9QKTsKKworCS8qIG5leHQgcGFnZSAqLworCXNjc2lfbmV4dF9wdHIgPSAoKChzY3NpX25leHRfcHRyID4+IDMpICsgUEFHRV9TSVpFKSAmIFBBR0VfTUFTSykgPDwgMzsKKwlpb2FzaWNfd3JpdGUoSU9fUkVHX1NDU0lfRE1BX0JQLCBzY3NpX25leHRfcHRyKTsKKwlmYXN0X2lvYigpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KQoreworCXJldHVybiBmaWZvX2NvdW50OworfQorCitzdGF0aWMgdm9pZCBkbWFfZHJhaW4oc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwl1MzIgbncsIGRhdGEwLCBkYXRhMSwgc2NzaV9kYXRhX3B0cjsKKwl1MTYgKnA7CisKKwludyA9IGlvYXNpY19yZWFkKElPX1JFR19TQ1NJX1NDUik7CisKKwkvKgorCSAqIElzIHRoZXJlIHNvbWV0aGluZyBpbiB0aGUgZG1hIGJ1ZmZlcnMgbGVmdD8KKwkgKi8KKwlpZiAobncpIHsKKwkJc2NzaV9kYXRhX3B0ciA9IGlvYXNpY19yZWFkKElPX1JFR19TQ1NJX0RNQV9QKSA+PiAzOworCQlwID0gcGh5c190b192aXJ0KHNjc2lfZGF0YV9wdHIpOworCQlzd2l0Y2ggKG53KSB7CisJCWNhc2UgMToKKwkJCWRhdGEwID0gaW9hc2ljX3JlYWQoSU9fUkVHX1NDU0lfU0RSMCk7CisJCQlwWzBdID0gZGF0YTAgJiAweGZmZmY7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZGF0YTAgPSBpb2FzaWNfcmVhZChJT19SRUdfU0NTSV9TRFIwKTsKKwkJCXBbMF0gPSBkYXRhMCAmIDB4ZmZmZjsKKwkJCXBbMV0gPSAoZGF0YTAgPj4gMTYpICYgMHhmZmZmOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWRhdGEwID0gaW9hc2ljX3JlYWQoSU9fUkVHX1NDU0lfU0RSMCk7CisJCQlkYXRhMSA9IGlvYXNpY19yZWFkKElPX1JFR19TQ1NJX1NEUjEpOworCQkJcFswXSA9IGRhdGEwICYgMHhmZmZmOworCQkJcFsxXSA9IChkYXRhMCA+PiAxNikgJiAweGZmZmY7CisJCQlwWzJdID0gZGF0YTEgJiAweGZmZmY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiU3RyYW5nZTogJWQgd29yZHMgaW4gZG1hIGJ1ZmZlciBsZWZ0XG4iLCBudyk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKiBzcCkKK3sKKwlyZXR1cm4gc3AtPlNDcC50aGlzX3Jlc2lkdWFsOworfQorCitzdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworfQorCitzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIHUzMiB2YWRkcmVzcywgaW50IGxlbmd0aCkKK3sKKwl1MzIgc2NzaV9uZXh0X3B0ciwgaW9hc2ljX3NzcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHZhZGRyZXNzICYgMykKKwkJcGFuaWMoImRlY19lc3AuYzogdW5hYmxlIHRvIGhhbmRsZSBwYXJ0aWFsIHdvcmQgdHJhbnNmZXJzLCB5ZXQuLi4iKTsKKworCWRtYV9jYWNoZV93YmFja19pbnYoKHVuc2lnbmVkIGxvbmcpIHBoeXNfdG9fdmlydCh2YWRkcmVzcyksIGxlbmd0aCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hc2ljX3Nzcl9sb2NrLCBmbGFncyk7CisKKwlmYXN0X21iKCk7CisJaW9hc2ljX3NzciA9IGlvYXNpY19yZWFkKElPX1JFR19TU1IpOworCisJaW9hc2ljX3NzciAmPSB+SU9fU1NSX1NDU0lfRE1BX0VOOworCWlvYXNpY193cml0ZShJT19SRUdfU1NSLCBpb2FzaWNfc3NyKTsKKworCWZhc3Rfd21iKCk7CisJaW9hc2ljX3dyaXRlKElPX1JFR19TQ1NJX1NDUiwgMCk7CisJaW9hc2ljX3dyaXRlKElPX1JFR19TQ1NJX0RNQV9QLCB2YWRkcmVzcyA8PCAzKTsKKworCS8qIHByZXBhcmUgZm9yIG5leHQgcGFnZSAqLworCXNjc2lfbmV4dF9wdHIgPSAoKHZhZGRyZXNzICsgUEFHRV9TSVpFKSAmIFBBR0VfTUFTSykgPDwgMzsKKwlpb2FzaWNfd3JpdGUoSU9fUkVHX1NDU0lfRE1BX0JQLCBzY3NpX25leHRfcHRyKTsKKworCWlvYXNpY19zc3IgfD0gKElPX1NTUl9TQ1NJX0RNQV9ESVIgfCBJT19TU1JfU0NTSV9ETUFfRU4pOworCWZhc3Rfd21iKCk7CisJaW9hc2ljX3dyaXRlKElPX1JFR19TU1IsIGlvYXNpY19zc3IpOworCisJZmFzdF9pb2IoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FzaWNfc3NyX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKQoreworCXUzMiBzY3NpX25leHRfcHRyLCBpb2FzaWNfc3NyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodmFkZHJlc3MgJiAzKQorCQlwYW5pYygiZGVjX2VzcC5jOiB1bmFibGUgdG8gaGFuZGxlIHBhcnRpYWwgd29yZCB0cmFuc2ZlcnMsIHlldC4uLiIpOworCisJZG1hX2NhY2hlX3diYWNrX2ludigodW5zaWduZWQgbG9uZykgcGh5c190b192aXJ0KHZhZGRyZXNzKSwgbGVuZ3RoKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FzaWNfc3NyX2xvY2ssIGZsYWdzKTsKKworCWZhc3RfbWIoKTsKKwlpb2FzaWNfc3NyID0gaW9hc2ljX3JlYWQoSU9fUkVHX1NTUik7CisKKwlpb2FzaWNfc3NyICY9IH4oSU9fU1NSX1NDU0lfRE1BX0RJUiB8IElPX1NTUl9TQ1NJX0RNQV9FTik7CisJaW9hc2ljX3dyaXRlKElPX1JFR19TU1IsIGlvYXNpY19zc3IpOworCisJZmFzdF93bWIoKTsKKwlpb2FzaWNfd3JpdGUoSU9fUkVHX1NDU0lfU0NSLCAwKTsKKwlpb2FzaWNfd3JpdGUoSU9fUkVHX1NDU0lfRE1BX1AsIHZhZGRyZXNzIDw8IDMpOworCisJLyogcHJlcGFyZSBmb3IgbmV4dCBwYWdlICovCisJc2NzaV9uZXh0X3B0ciA9ICgodmFkZHJlc3MgKyBQQUdFX1NJWkUpICYgUEFHRV9NQVNLKSA8PCAzOworCWlvYXNpY193cml0ZShJT19SRUdfU0NTSV9ETUFfQlAsIHNjc2lfbmV4dF9wdHIpOworCisJaW9hc2ljX3NzciB8PSBJT19TU1JfU0NTSV9ETUFfRU47CisJZmFzdF93bWIoKTsKKwlpb2FzaWNfd3JpdGUoSU9fUkVHX1NTUiwgaW9hc2ljX3Nzcik7CisKKwlmYXN0X2lvYigpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXNpY19zc3JfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlkaXNhYmxlX2lycShkZWNfaW50ZXJydXB0W0RFQ19JUlFfQVNDX0RNQV0pOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCWVuYWJsZV9pcnEoZGVjX2ludGVycnVwdFtERUNfSVJRX0FTQ19ETUFdKTsKK30KKworc3RhdGljIGludCBkbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlyZXR1cm4gKGVzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMgJiBFU1BfU1RBVF9JTlRSKTsKK30KKworc3RhdGljIGludCBkbWFfcG9ydHNfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCS8qCisJICogRklYTUU6IHdoYXQncyB0aGlzIGdvb2QgZm9yPworCSAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQoreworCS8qCisJICogRE1BX1NUX1dSSVRFIG1lYW5zICJtb3ZlIGRhdGEgZnJvbSBkZXZpY2UgdG8gbWVtb3J5IgorCSAqIHNvIHdoZW4gKHdyaXRlKSBpcyB0cnVlLCBpdCBhY3R1YWxseSBtZWFucyBSRUFEIQorCSAqLworCWlmICh3cml0ZSkKKwkJZG1hX2luaXRfcmVhZChlc3AsIGFkZHIsIGNvdW50KTsKKwllbHNlCisJCWRtYV9pbml0X3dyaXRlKGVzcCwgYWRkciwgY291bnQpOworfQorCitzdGF0aWMgdm9pZCBkbWFfbW11X2dldF9zY3NpX29uZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICogc3ApCit7CisJc3AtPlNDcC5wdHIgPSAoY2hhciAqKXZpcnRfdG9fcGh5cyhzcC0+cmVxdWVzdF9idWZmZXIpOworfQorCitzdGF0aWMgdm9pZCBkbWFfbW11X2dldF9zY3NpX3NnbChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICogc3ApCit7CisJaW50IHN6ID0gc3AtPlNDcC5idWZmZXJzX3Jlc2lkdWFsOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBzcC0+U0NwLmJ1ZmZlcjsKKworCXdoaWxlIChzeiA+PSAwKSB7CisJCXNnW3N6XS5kbWFfYWRkcmVzcyA9IHBhZ2VfdG9fcGh5cyhzZ1tzel0ucGFnZSkgKyBzZ1tzel0ub2Zmc2V0OworCQlzei0tOworCX0KKwlzcC0+U0NwLnB0ciA9IChjaGFyICopKHNwLT5TQ3AuYnVmZmVyLT5kbWFfYWRkcmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9hZHZhbmNlX3NnKHN0cnVjdCBzY3NpX2NtbmQgKiBzcCkKK3sKKwlzcC0+U0NwLnB0ciA9IChjaGFyICopKHNwLT5TQ3AuYnVmZmVyLT5kbWFfYWRkcmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkIHBtYXpfZG1hX2RyYWluKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJbWVtY3B5KHBoeXNfdG9fdmlydChlc3BfdmlydF9idWZmZXIpLAorCQkodm9pZCAqKUtTRUcxQUREUihlc3AtPnNsb3QgKyBERUNfU0NTSV9TUkFNICsgRVNQX1RHVF9ETUFfU0laRSksCisJCXNjc2lfY3VycmVudF9sZW5ndGgpOworfQorCitzdGF0aWMgdm9pZCBwbWF6X2RtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKQoreworCXZvbGF0aWxlIHUzMiAqZG1hcmVnID0KKwkJKHZvbGF0aWxlIHUzMiAqKUtTRUcxQUREUihlc3AtPnNsb3QgKyBERUNfU0NTSV9ETUFSRUcpOworCisJaWYgKGxlbmd0aCA+IEVTUF9UR1RfRE1BX1NJWkUpCisJCWxlbmd0aCA9IEVTUF9UR1RfRE1BX1NJWkU7CisKKwkqZG1hcmVnID0gVENfRVNQX0RNQV9BRERSKEVTUF9UR1RfRE1BX1NJWkUpOworCisJaW9iKCk7CisKKwllc3BfdmlydF9idWZmZXIgPSB2YWRkcmVzczsKKwlzY3NpX2N1cnJlbnRfbGVuZ3RoID0gbGVuZ3RoOworfQorCitzdGF0aWMgdm9pZCBwbWF6X2RtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIHUzMiB2YWRkcmVzcywgaW50IGxlbmd0aCkKK3sKKwl2b2xhdGlsZSB1MzIgKmRtYXJlZyA9CisJCSh2b2xhdGlsZSB1MzIgKilLU0VHMUFERFIoZXNwLT5zbG90ICsgREVDX1NDU0lfRE1BUkVHKTsKKworCW1lbWNweSgodm9pZCAqKUtTRUcxQUREUihlc3AtPnNsb3QgKyBERUNfU0NTSV9TUkFNICsgRVNQX1RHVF9ETUFfU0laRSksCisJICAgICAgIHBoeXNfdG9fdmlydCh2YWRkcmVzcyksIGxlbmd0aCk7CisKKwl3bWIoKTsKKwkqZG1hcmVnID0gVENfRVNQX0RNQVJfV1JJVEUgfCBUQ19FU1BfRE1BX0FERFIoRVNQX1RHVF9ETUFfU0laRSk7CisKKwlpb2IoKTsKK30KKworc3RhdGljIHZvaWQgcG1hel9kbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKK30KKworc3RhdGljIHZvaWQgcG1hel9kbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworfQorCitzdGF0aWMgdm9pZCBwbWF6X2RtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCB1MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpCit7CisJLyoKKwkgKiBETUFfU1RfV1JJVEUgbWVhbnMgIm1vdmUgZGF0YSBmcm9tIGRldmljZSB0byBtZW1vcnkiCisJICogc28gd2hlbiAod3JpdGUpIGlzIHRydWUsIGl0IGFjdHVhbGx5IG1lYW5zIFJFQUQhCisJICovCisJaWYgKHdyaXRlKQorCQlwbWF6X2RtYV9pbml0X3JlYWQoZXNwLCBhZGRyLCBjb3VudCk7CisJZWxzZQorCQlwbWF6X2RtYV9pbml0X3dyaXRlKGVzcCwgYWRkciwgY291bnQpOworfQorCitzdGF0aWMgdm9pZCBwbWF6X2RtYV9tbXVfZ2V0X3Njc2lfb25lKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKiBzcCkKK3sKKwlzcC0+U0NwLnB0ciA9IChjaGFyICopdmlydF90b19waHlzKHNwLT5yZXF1ZXN0X2J1ZmZlcik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZG14MzE5MWQuYyBiL2RyaXZlcnMvc2NzaS9kbXgzMTkxZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMjI0MjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZG14MzE5MWQuYwpAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAgICBkbXgzMTkxZC5jIC0gZHJpdmVyIGZvciB0aGUgRG9tZXggRE1YMzE5MUQgU0NTSSBjYXJkLgorICAgIENvcHlyaWdodCAoQykgMjAwMCBieSBNYXNzaW1vIFBpY2Npb25pIDxkYWZhc3RpZGlvQGxpYmVyby5pdD4KKyAgICBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaEBsc3QuZGU+CisKKyAgICBCYXNlZCBvbiB0aGUgZ2VuZXJpYyBOQ1I1MzgwIGRyaXZlciBieSBEcmV3IEVja2hhcmR0IGV0IGFsLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworLyoKKyAqIERlZmludGlvbnMgZm9yIHRoZSBnZW5lcmljIDUzODAgZHJpdmVyLgorICovCisjZGVmaW5lIEFVVE9TRU5TRQorCisjZGVmaW5lIE5DUjUzODBfcmVhZChyZWcpCQlpbmIocG9ydCArIHJlZykKKyNkZWZpbmUgTkNSNTM4MF93cml0ZShyZWcsIHZhbHVlKQlvdXRiKHZhbHVlLCBwb3J0ICsgcmVnKQorCisjZGVmaW5lIE5DUjUzODBfaW1wbGVtZW50YXRpb25fZmllbGRzCXVuc2lnbmVkIGludCBwb3J0CisjZGVmaW5lIE5DUjUzODBfbG9jYWxfZGVjbGFyZSgpCQlOQ1I1MzgwX2ltcGxlbWVudGF0aW9uX2ZpZWxkcworI2RlZmluZSBOQ1I1MzgwX3NldHVwKGluc3RhbmNlKQkJcG9ydCA9IGluc3RhbmNlLT5pb19wb3J0CisKKy8qCisgKiBJbmNsdWRlcyBuZWVkZWQgZm9yIE5DUjUzODAuW2NoXSAoWFhYOiBNb3ZlIHRoZW0gdG8gTkNSNTM4MC5oKQorICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJzY3NpLmgiCisKKyNpbmNsdWRlICJOQ1I1MzgwLmgiCisjaW5jbHVkZSAiTkNSNTM4MC5jIgorCisjZGVmaW5lIERNWDMxOTFEX0RSSVZFUl9OQU1FCSJkbXgzMTkxZCIKKyNkZWZpbmUgRE1YMzE5MURfUkVHSU9OX0xFTgk4CisKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZG14MzE5MWRfZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gRE1YMzE5MURfRFJJVkVSX05BTUUsCisJLm5hbWUJCQk9ICJEb21leCBETVgzMTkxRCIsCisJLnF1ZXVlY29tbWFuZAkJPSBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBOQ1I1MzgwX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IE5DUjUzODBfYnVzX3Jlc2V0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcj0gTkNSNTM4MF9kZXZpY2VfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IE5DUjUzODBfaG9zdF9yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IDMyLAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQk9IDIsCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRteDMxOTFkX3Byb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXVuc2lnbmVkIGxvbmcgaW87CisJaW50IGVycm9yID0gLUVOT0RFVjsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJZ290byBvdXQ7CisKKwlpbyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvLCBETVgzMTkxRF9SRUdJT05fTEVOLCBETVgzMTkxRF9EUklWRVJfTkFNRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbXgzMTkxOiByZWdpb24gMHglbHgtMHglbHggYWxyZWFkeSByZXNlcnZlZFxuIiwKKwkJCQlpbywgaW8gKyBETVgzMTkxRF9SRUdJT05fTEVOKTsKKwkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJc2hvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmRteDMxOTFkX2RyaXZlcl90ZW1wbGF0ZSwKKwkJCXNpemVvZihzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSkpOworCWlmICghc2hvc3QpCisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOyAgICAgICAKKwlzaG9zdC0+aW9fcG9ydCA9IGlvOworCXNob3N0LT5pcnEgPSBwZGV2LT5pcnE7CisKKwlOQ1I1MzgwX2luaXQoc2hvc3QsIEZMQUdfTk9fUFNFVURPX0RNQSB8IEZMQUdfRFRDMzE4MUUpOworCisJaWYgKHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgTkNSNTM4MF9pbnRyLCBTQV9TSElSUSwKKwkJCQlETVgzMTkxRF9EUklWRVJfTkFNRSwgc2hvc3QpKSB7CisJCS8qCisJCSAqIFN0ZWFtIHBvd2VyZWQgc2NzaSBjb250cm9sbGVycyBydW4gd2l0aG91dCBhbiBJUlEgYW55d2F5CisJCSAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICJkbXgzMTkxOiBJUlEgJWQgbm90IGF2YWlsYWJsZSAtICIKKwkJCQkgICAgInN3aXRjaGluZyB0byBwb2xsZWQgbW9kZS5cbiIsIHBkZXYtPmlycSk7CisJCXNob3N0LT5pcnEgPSBTQ1NJX0lSUV9OT05FOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBzaG9zdCk7CisKKwllcnJvciA9IHNjc2lfYWRkX2hvc3Qoc2hvc3QsICZwZGV2LT5kZXYpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfZnJlZV9pcnE7CisKKwlzY3NpX3NjYW5faG9zdChzaG9zdCk7CisJcmV0dXJuIDA7CisKKyBvdXRfZnJlZV9pcnE6CisJZnJlZV9pcnEoc2hvc3QtPmlycSwgc2hvc3QpOworIG91dF9yZWxlYXNlX3JlZ2lvbjoKKwlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgRE1YMzE5MURfUkVHSU9OX0xFTik7Cisgb3V0X2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKyBvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZG14MzE5MWRfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpOworCisJTkNSNTM4MF9leGl0KHNob3N0KTsKKworCWlmIChzaG9zdC0+aXJxICE9IFNDU0lfSVJRX05PTkUpCisJCWZyZWVfaXJxKHNob3N0LT5pcnEsIHNob3N0KTsKKwlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgRE1YMzE5MURfUkVHSU9OX0xFTik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJc2NzaV9ob3N0X3B1dChzaG9zdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBkbXgzMTkxZF9wY2lfdGJsW10gPSB7CisJe1BDSV9WRU5ET1JfSURfRE9NRVgsIFBDSV9ERVZJQ0VfSURfRE9NRVhfRE1YMzE5MUQsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDR9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBkbXgzMTkxZF9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRteDMxOTFkX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRE1YMzE5MURfRFJJVkVSX05BTUUsCisJLmlkX3RhYmxlCT0gZG14MzE5MWRfcGNpX3RibCwKKwkucHJvYmUJCT0gZG14MzE5MWRfcHJvYmVfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZG14MzE5MWRfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkbXgzMTkxZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZG14MzE5MWRfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkbXgzMTkxZF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkbXgzMTkxZF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZG14MzE5MWRfaW5pdCk7Cittb2R1bGVfZXhpdChkbXgzMTkxZF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWFzc2ltbyBQaWNjaW9uaSA8ZGFmYXN0aWRpb0BsaWJlcm8uaXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRvbWV4IERNWDMxOTFEIFNDU0kgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZHB0L2RwdGlfaTJvLmggYi9kcml2ZXJzL3Njc2kvZHB0L2RwdGlfaTJvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk1ODVmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9kcHQvZHB0aV9pMm8uaApAQCAtMCwwICsxLDQ1OSBAQAorI2lmbmRlZiBfU0NTSV9JMk9fSAorI2RlZmluZSBfU0NTSV9JMk9fSAorCisvKiBJMk8ga2VybmVsIHNwYWNlIGFjY2Vzc2libGUgc3RydWN0dXJlcy9BUElzCisgKgorICogKGMpIENvcHlyaWdodCAxOTk5LCAyMDAwIFJlZCBIYXQgU29mdHdhcmUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVkIHRoZSBJMk8gQVBJcy9zdHJ1Y3R1cmVzIGZvciB1c2UgYnkKKyAqIHRoZSBJMk8ga2VybmVsIG1vZHVsZXMuCisgKgorICovCisKKyNpZmRlZiBfX0tFUk5FTF9fICAgICAgIC8qIFRoaXMgZmlsZSB0byBiZSBpbmNsdWRlZCBieSBrZXJuZWwgb25seSAqLworCisjaW5jbHVkZSA8bGludXgvaTJvLWRldi5oPgorCisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPiAvKiBOZWVkZWQgZm9yIE1VVEVYIGluaXQgbWFjcm9zICovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisKKy8qCisgKglUdW5hYmxlIHBhcmFtZXRlcnMgZmlyc3QKKyAqLworCisvKiBIb3cgbWFueSBkaWZmZXJlbnQgT1NNJ3MgYXJlIHdlIGFsbG93aW5nICovIAorI2RlZmluZSBNQVhfSTJPX01PRFVMRVMJCTY0CisKKyNkZWZpbmUgSTJPX0VWVF9DQVBBQklMSVRZX09USEVSCQkweDAxCisjZGVmaW5lIEkyT19FVlRfQ0FQQUJJTElUWV9DSEFOR0VECQkweDAyCisKKyNkZWZpbmUgSTJPX0VWVF9TRU5TT1JfU1RBVEVfQ0hBTkdFRAkJMHgwMQorCisvLyNpZmRlZiBfX0tFUk5FTF9fICAgLyogaW9jdGwgc3R1ZmYgb25seSB0aGluZyBleHBvcnRlZCB0byB1c2VycyAqLworCisjZGVmaW5lIEkyT19NQVhfTUFOQUdFUlMJNAorCisvKgorICoJSTJPIEludGVyZmFjZSBPYmplY3RzCisgKi8KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwwKQorCisjZGVmaW5lIERFQ0xBUkVfTVVURVgobmFtZSkgc3RydWN0IHNlbWFwaG9yZSBuYW1lPU1VVEVYCisKK3R5cGVkZWYgc3RydWN0IHdhaXRfcXVldWUgKmFkcHRfd2FpdF9xdWV1ZV9oZWFkX3Q7CisjZGVmaW5lIEFEUFRfREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQod2FpdCkgYWRwdF93YWl0X3F1ZXVlX2hlYWRfdCB3YWl0ID0gTlVMTAordHlwZWRlZiBzdHJ1Y3Qgd2FpdF9xdWV1ZSBhZHB0X3dhaXRfcXVldWVfdDsKKyNlbHNlCisKKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Cit0eXBlZGVmIHdhaXRfcXVldWVfaGVhZF90IGFkcHRfd2FpdF9xdWV1ZV9oZWFkX3Q7CisjZGVmaW5lIEFEUFRfREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQod2FpdCkgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQod2FpdCkKK3R5cGVkZWYgd2FpdF9xdWV1ZV90IGFkcHRfd2FpdF9xdWV1ZV90OworCisjZW5kaWYKKy8qCisgKiBtZXNzYWdlIHN0cnVjdHVyZXMKKyAqLworCitzdHJ1Y3QgaTJvX21lc3NhZ2UKK3sKKwl1OAl2ZXJzaW9uX29mZnNldDsKKwl1OAlmbGFnczsKKwl1MTYJc2l6ZTsKKwl1MzIJdGFyZ2V0X3RpZDoxMjsKKwl1MzIJaW5pdF90aWQ6MTI7CisJdTMyCWZ1bmN0aW9uOjg7CQorCXUzMglpbml0aWF0b3JfY29udGV4dDsKKwkvKiBMaXN0IGZvbGxvd3MgKi8KK307CisKK3N0cnVjdCBhZHB0X2RldmljZTsKK3N0cnVjdCBfYWRwdF9oYmE7CitzdHJ1Y3QgaTJvX2RldmljZQoreworCXN0cnVjdCBpMm9fZGV2aWNlICpuZXh0OwkvKiBDaGFpbiAqLworCXN0cnVjdCBpMm9fZGV2aWNlICpwcmV2OworCisJY2hhciBkZXZfbmFtZVs4XTsJCS8qIGxpbnV4IC9kZXYgbmFtZSBpZiBhdmFpbGFibGUgKi8KKwlpMm9fbGN0X2VudHJ5IGxjdF9kYXRhOy8qIERldmljZSBMQ1QgaW5mb3JtYXRpb24gKi8KKwl1MzIgZmxhZ3M7CQkKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkqIHByb2NfZW50cnk7CS8qIC9wcm9jIGRpciAqLworCXN0cnVjdCBhZHB0X2RldmljZSAqb3duZXI7CisJc3RydWN0IF9hZHB0X2hiYSAqY29udHJvbGxlcjsJLyogQ29udHJvbGxpbmcgSU9QICovCit9OworCisvKgorICoJRWFjaCBJMk8gY29udHJvbGxlciBoYXMgb25lIG9mIHRoZXNlIG9iamVjdHMKKyAqLworIAorc3RydWN0IGkyb19jb250cm9sbGVyCit7CisJY2hhciBuYW1lWzE2XTsKKwlpbnQgdW5pdDsKKwlpbnQgdHlwZTsKKwlpbnQgZW5hYmxlZDsKKworCXN0cnVjdCBub3RpZmllcl9ibG9jayAqZXZlbnRfbm90aWZlcjsJLyogRXZlbnRzICovCisJYXRvbWljX3QgdXNlcnM7CisJc3RydWN0IGkyb19kZXZpY2UgKmRldmljZXM7CQkvKiBJMk8gZGV2aWNlIGNoYWluICovCisJc3RydWN0IGkyb19jb250cm9sbGVyICpuZXh0OwkJLyogQ29udHJvbGxlciBjaGFpbiAqLworCit9OworCisvKgorICogSTJPIFN5c3RlbSB0YWJsZSBlbnRyeQorICovCitzdHJ1Y3QgaTJvX3N5c190YmxfZW50cnkKK3sKKwl1MTYJb3JnX2lkOworCXUxNglyZXNlcnZlZDE7CisJdTMyCWlvcF9pZDoxMjsKKwl1MzIJcmVzZXJ2ZWQyOjIwOworCXUxNglzZWdfbnVtOjEyOworCXUxNiAJaTJvX3ZlcnNpb246NDsKKwl1OCAJaW9wX3N0YXRlOworCXU4IAltc2dfdHlwZTsKKwl1MTYJZnJhbWVfc2l6ZTsKKwl1MTYJcmVzZXJ2ZWQzOworCXUzMglsYXN0X2NoYW5nZWQ7CisJdTMyCWlvcF9jYXBhYmlsaXRpZXM7CisJdTMyCWluYm91bmRfbG93OworCXUzMglpbmJvdW5kX2hpZ2g7Cit9OworCitzdHJ1Y3QgaTJvX3N5c190YmwKK3sKKwl1OCAJbnVtX2VudHJpZXM7CisJdTggCXZlcnNpb247CisJdTE2IAlyZXNlcnZlZDE7CisJdTMyCWNoYW5nZV9pbmQ7CisJdTMyCXJlc2VydmVkMjsKKwl1MzIJcmVzZXJ2ZWQzOworCXN0cnVjdCBpMm9fc3lzX3RibF9lbnRyeSBpb3BzWzBdOworfTsJCisKKy8qCisgKglJMk8gY2xhc3NlcyAvIHN1YmNsYXNzZXMKKyAqLworCisvKiAgQ2xhc3MgSUQgYW5kIENvZGUgQXNzaWdubWVudHMKKyAqICAoTENULkNsYXNzSUQuVmVyc2lvbiBmaWVsZCkKKyAqLworI2RlZmluZSAgICBJMk9fQ0xBU1NfVkVSU0lPTl8xMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgSTJPX0NMQVNTX1ZFUlNJT05fMTEgICAgICAgICAgICAgICAgICAgICAgICAweDAxCisKKy8qICBDbGFzcyBjb2RlIG5hbWVzCisgKiAgKGZyb20gdjEuNSBUYWJsZSA2LTEgQ2xhc3MgQ29kZSBBc3NpZ25tZW50cy4pCisgKi8KKyAKKyNkZWZpbmUgICAgSTJPX0NMQVNTX0VYRUNVVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMAorI2RlZmluZSAgICBJMk9fQ0xBU1NfRERNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxCisjZGVmaW5lICAgIEkyT19DTEFTU19SQU5ET01fQkxPQ0tfU1RPUkFHRSAgICAgICAgICAgICAgMHgwMTAKKyNkZWZpbmUgICAgSTJPX0NMQVNTX1NFUVVFTlRJQUxfU1RPUkFHRSAgICAgICAgICAgICAgICAweDAxMQorI2RlZmluZSAgICBJMk9fQ0xBU1NfTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwCisjZGVmaW5lICAgIEkyT19DTEFTU19XQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMzAKKyNkZWZpbmUgICAgSTJPX0NMQVNTX0ZJQlJFX0NIQU5ORUxfUE9SVCAgICAgICAgICAgICAgICAweDA0MAorI2RlZmluZSAgICBJMk9fQ0xBU1NfRklCUkVfQ0hBTk5FTF9QRVJJUEhFUkFMICAgICAgICAgIDB4MDQxCisjZGVmaW5lICAgIEkyT19DTEFTU19TQ1NJX1BFUklQSEVSQUwgICAgICAgICAgICAgICAgICAgMHgwNTEKKyNkZWZpbmUgICAgSTJPX0NMQVNTX0FURV9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MAorI2RlZmluZSAgICBJMk9fQ0xBU1NfQVRFX1BFUklQSEVSQUwgICAgICAgICAgICAgICAgICAgIDB4MDYxCisjZGVmaW5lICAgIEkyT19DTEFTU19GTE9QUFlfQ09OVFJPTExFUiAgICAgICAgICAgICAgICAgMHgwNzAKKyNkZWZpbmUgICAgSTJPX0NMQVNTX0ZMT1BQWV9ERVZJQ0UgICAgICAgICAgICAgICAgICAgICAweDA3MQorI2RlZmluZSAgICBJMk9fQ0xBU1NfQlVTX0FEQVBURVJfUE9SVCAgICAgICAgICAgICAgICAgIDB4MDgwCisjZGVmaW5lICAgIEkyT19DTEFTU19QRUVSX1RSQU5TUE9SVF9BR0VOVCAgICAgICAgICAgICAgMHgwOTAKKyNkZWZpbmUgICAgSTJPX0NMQVNTX1BFRVJfVFJBTlNQT1JUICAgICAgICAgICAgICAgICAgICAweDA5MQorCisvKiAgUmVzdCBvZiAweDA5MiAtIDB4MDlmIHJlc2VydmVkIGZvciBwZWVyLXRvLXBlZXIgY2xhc3NlcworICovCisgCisjZGVmaW5lICAgIEkyT19DTEFTU19NQVRDSF9BTllDTEFTUyAgICAgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgorCisvKiAgU3ViY2xhc3NlcworICovCisKKyNkZWZpbmUgICAgSTJPX1NVQkNMQVNTX2k5NjAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMQorI2RlZmluZSAgICBJMk9fU1VCQ0xBU1NfSERNICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwCisjZGVmaW5lICAgIEkyT19TVUJDTEFTU19JU00gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjEKKyAKKy8qIE9wZXJhdGlvbiBmdW5jdGlvbnMgKi8KKworI2RlZmluZSBJMk9fUEFSQU1TX0ZJRUxEX0dFVAkweDAwMDEKKyNkZWZpbmUgSTJPX1BBUkFNU19MSVNUX0dFVAkweDAwMDIKKyNkZWZpbmUgSTJPX1BBUkFNU19NT1JFX0dFVAkweDAwMDMKKyNkZWZpbmUgSTJPX1BBUkFNU19TSVpFX0dFVAkweDAwMDQKKyNkZWZpbmUgSTJPX1BBUkFNU19UQUJMRV9HRVQJMHgwMDA1CisjZGVmaW5lIEkyT19QQVJBTVNfRklFTERfU0VUCTB4MDAwNgorI2RlZmluZSBJMk9fUEFSQU1TX0xJU1RfU0VUCTB4MDAwNworI2RlZmluZSBJMk9fUEFSQU1TX1JPV19BREQJMHgwMDA4CisjZGVmaW5lIEkyT19QQVJBTVNfUk9XX0RFTEVURQkweDAwMDkKKyNkZWZpbmUgSTJPX1BBUkFNU19UQUJMRV9DTEVBUgkweDAwMEEKKworLyoKKyAqCUkyTyBzZXJpYWwgbnVtYmVyIGNvbnZlbnRpb25zIC8gZm9ybWF0cworICoJKGNpcmNhIHYxLjUpCisgKi8KKworI2RlZmluZSAgICBJMk9fU05GT1JNQVRfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgICAgSTJPX1NORk9STUFUX0JJTkFSWSAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lICAgIEkyT19TTkZPUk1BVF9BU0NJSSAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSAgICBJMk9fU05GT1JNQVRfVU5JQ09ERSAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgICAgSTJPX1NORk9STUFUX0xBTjQ4X01BQyAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lICAgIEkyT19TTkZPUk1BVF9XQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorCisvKiBQbHVzIG5ldyBpbiB2Mi4wIChZZWxsb3dzdG9uZSBwZGYgZG9jKQorICovCisKKyNkZWZpbmUgICAgSTJPX1NORk9STUFUX0xBTjY0X01BQyAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lICAgIEkyT19TTkZPUk1BVF9ERE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSAgICBJMk9fU05GT1JNQVRfSUVFRV9SRUc2NCAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgICAgSTJPX1NORk9STUFUX0lFRUVfUkVHMTI4ICAgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lICAgIEkyT19TTkZPUk1BVF9VTktOT1dOMiAgICAgICAgICAgICAgICAgICAgICAgMHhmZgorCisvKiBUcmFuc2FjdGlvbiBSZXBseSBMaXN0cyAoVFJMKSBDb250cm9sIFdvcmQgc3RydWN0dXJlICovCisKKyNkZWZpbmUgVFJMX1NJTkdMRV9GSVhFRF9MRU5HVEgJCTB4MDAKKyNkZWZpbmUgVFJMX1NJTkdMRV9WQVJJQUJMRV9MRU5HVEgJMHg0MAorI2RlZmluZSBUUkxfTVVMVElQTEVfRklYRURfTEVOR1RICTB4ODAKKworLyoKKyAqCU1lc3NhZ2luZyBBUEkgdmFsdWVzCisgKi8KKyAKKyNkZWZpbmUJSTJPX0NNRF9BREFQVEVSX0FTU0lHTgkJMHhCMworI2RlZmluZQlJMk9fQ01EX0FEQVBURVJfUkVBRAkJMHhCMgorI2RlZmluZQlJMk9fQ01EX0FEQVBURVJfUkVMRUFTRQkJMHhCNQorI2RlZmluZQlJMk9fQ01EX0JJT1NfSU5GT19TRVQJCTB4QTUKKyNkZWZpbmUJSTJPX0NNRF9CT09UX0RFVklDRV9TRVQJCTB4QTcKKyNkZWZpbmUJSTJPX0NNRF9DT05GSUdfVkFMSURBVEUJCTB4QkIKKyNkZWZpbmUJSTJPX0NNRF9DT05OX1NFVFVQCQkweENBCisjZGVmaW5lCUkyT19DTURfRERNX0RFU1RST1kJCTB4QjEKKyNkZWZpbmUJSTJPX0NNRF9ERE1fRU5BQkxFCQkweEQ1CisjZGVmaW5lCUkyT19DTURfRERNX1FVSUVTQ0UJCTB4QzcKKyNkZWZpbmUJSTJPX0NNRF9ERE1fUkVTRVQJCTB4RDkKKyNkZWZpbmUJSTJPX0NNRF9ERE1fU1VTUEVORAkJMHhBRgorI2RlZmluZQlJMk9fQ01EX0RFVklDRV9BU1NJR04JCTB4QjcKKyNkZWZpbmUJSTJPX0NNRF9ERVZJQ0VfUkVMRUFTRQkJMHhCOQorI2RlZmluZQlJMk9fQ01EX0hSVF9HRVQJCQkweEE4CisjZGVmaW5lCUkyT19DTURfQURBUFRFUl9DTEVBUgkJMHhCRQorI2RlZmluZQlJMk9fQ01EX0FEQVBURVJfQ09OTkVDVAkJMHhDOQorI2RlZmluZQlJMk9fQ01EX0FEQVBURVJfUkVTRVQJCTB4QkQKKyNkZWZpbmUJSTJPX0NNRF9MQ1RfTk9USUZZCQkweEEyCisjZGVmaW5lCUkyT19DTURfT1VUQk9VTkRfSU5JVAkJMHhBMQorI2RlZmluZQlJMk9fQ01EX1BBVEhfRU5BQkxFCQkweEQzCisjZGVmaW5lCUkyT19DTURfUEFUSF9RVUlFU0NFCQkweEM1CisjZGVmaW5lCUkyT19DTURfUEFUSF9SRVNFVAkJMHhENworI2RlZmluZQlJMk9fQ01EX1NUQVRJQ19NRl9DUkVBVEUJMHhERAorI2RlZmluZQlJMk9fQ01EX1NUQVRJQ19NRl9SRUxFQVNFCTB4REYKKyNkZWZpbmUJSTJPX0NNRF9TVEFUVVNfR0VUCQkweEEwCisjZGVmaW5lCUkyT19DTURfU1dfRE9XTkxPQUQJCTB4QTkKKyNkZWZpbmUJSTJPX0NNRF9TV19VUExPQUQJCTB4QUIKKyNkZWZpbmUJSTJPX0NNRF9TV19SRU1PVkUJCTB4QUQKKyNkZWZpbmUJSTJPX0NNRF9TWVNfRU5BQkxFCQkweEQxCisjZGVmaW5lCUkyT19DTURfU1lTX01PRElGWQkJMHhDMQorI2RlZmluZQlJMk9fQ01EX1NZU19RVUlFU0NFCQkweEMzCisjZGVmaW5lCUkyT19DTURfU1lTX1RBQl9TRVQJCTB4QTMKKworI2RlZmluZSBJMk9fQ01EX1VUSUxfTk9QCQkweDAwCisjZGVmaW5lIEkyT19DTURfVVRJTF9BQk9SVAkJMHgwMQorI2RlZmluZSBJMk9fQ01EX1VUSUxfQ0xBSU0JCTB4MDkKKyNkZWZpbmUgSTJPX0NNRF9VVElMX1JFTEVBU0UJCTB4MEIKKyNkZWZpbmUgSTJPX0NNRF9VVElMX1BBUkFNU19HRVQJCTB4MDYKKyNkZWZpbmUgSTJPX0NNRF9VVElMX1BBUkFNU19TRVQJCTB4MDUKKyNkZWZpbmUgSTJPX0NNRF9VVElMX0VWVF9SRUdJU1RFUgkweDEzCisjZGVmaW5lIEkyT19DTURfVVRJTF9FVlRfQUNLCQkweDE0CisjZGVmaW5lIEkyT19DTURfVVRJTF9DT05GSUdfRElBTE9HCTB4MTAKKyNkZWZpbmUgSTJPX0NNRF9VVElMX0RFVklDRV9SRVNFUlZFCTB4MEQKKyNkZWZpbmUgSTJPX0NNRF9VVElMX0RFVklDRV9SRUxFQVNFCTB4MEYKKyNkZWZpbmUgSTJPX0NNRF9VVElMX0xPQ0sJCTB4MTcKKyNkZWZpbmUgSTJPX0NNRF9VVElMX0xPQ0tfUkVMRUFTRQkweDE5CisjZGVmaW5lIEkyT19DTURfVVRJTF9SRVBMWV9GQVVMVF9OT1RJRlkJMHgxNQorCisjZGVmaW5lIEkyT19DTURfU0NTSV9FWEVDCQkweDgxCisjZGVmaW5lIEkyT19DTURfU0NTSV9BQk9SVAkJMHg4MworI2RlZmluZSBJMk9fQ01EX1NDU0lfQlVTUkVTRVQJCTB4MjcKKworI2RlZmluZSBJMk9fQ01EX0JMT0NLX1JFQUQJCTB4MzAKKyNkZWZpbmUgSTJPX0NNRF9CTE9DS19XUklURQkJMHgzMQorI2RlZmluZSBJMk9fQ01EX0JMT0NLX0NGTFVTSAkJMHgzNworI2RlZmluZSBJMk9fQ01EX0JMT0NLX01MT0NLCQkweDQ5CisjZGVmaW5lIEkyT19DTURfQkxPQ0tfTVVOTE9DSwkJMHg0QgorI2RlZmluZSBJMk9fQ01EX0JMT0NLX01NT1VOVAkJMHg0MQorI2RlZmluZSBJMk9fQ01EX0JMT0NLX01FSkVDVAkJMHg0MworCisjZGVmaW5lIEkyT19QUklWQVRFX01TRwkJCTB4RkYKKworLyoKKyAqCUluaXQgT3V0Ym91bmQgUSBzdGF0dXMgCisgKi8KKyAKKyNkZWZpbmUgSTJPX0NNRF9PVVRCT1VORF9JTklUX0lOX1BST0dSRVNTCTB4MDEKKyNkZWZpbmUgSTJPX0NNRF9PVVRCT1VORF9JTklUX1JFSkVDVEVECQkweDAyCisjZGVmaW5lIEkyT19DTURfT1VUQk9VTkRfSU5JVF9GQUlMRUQJCTB4MDMKKyNkZWZpbmUgSTJPX0NNRF9PVVRCT1VORF9JTklUX0NPTVBMRVRFCQkweDA0CisKKy8qCisgKglJMk8gR2V0IFN0YXR1cyBTdGF0ZSB2YWx1ZXMgCisgKi8KKworI2RlZmluZQlBREFQVEVSX1NUQVRFX0lOSVRJQUxJWklORwkJMHgwMQorI2RlZmluZQlBREFQVEVSX1NUQVRFX1JFU0VUCQkJMHgwMgorI2RlZmluZQlBREFQVEVSX1NUQVRFX0hPTEQJCQkweDA0CisjZGVmaW5lIEFEQVBURVJfU1RBVEVfUkVBRFkJCQkweDA1CisjZGVmaW5lCUFEQVBURVJfU1RBVEVfT1BFUkFUSU9OQUwJCTB4MDgKKyNkZWZpbmUJQURBUFRFUl9TVEFURV9GQUlMRUQJCQkweDEwCisjZGVmaW5lCUFEQVBURVJfU1RBVEVfRkFVTFRFRAkJCTB4MTEKKwkKKy8qIEkyTyBBUEkgZnVuY3Rpb24gcmV0dXJuIHZhbHVlcyAqLworCisjZGVmaW5lIEkyT19SVE5fTk9fRVJST1IJCQkwCisjZGVmaW5lIEkyT19SVE5fTk9UX0lOSVQJCQkxCisjZGVmaW5lIEkyT19SVE5fRlJFRV9RX0VNUFRZCQkJMgorI2RlZmluZSBJMk9fUlROX1RDQl9FUlJPUgkJCTMKKyNkZWZpbmUgSTJPX1JUTl9UUkFOU0FDVElPTl9FUlJPUgkJNAorI2RlZmluZSBJMk9fUlROX0FEQVBURVJfQUxSRUFEWV9JTklUCQk1CisjZGVmaW5lIEkyT19SVE5fTUFMTE9DX0VSUk9SCQkJNgorI2RlZmluZSBJMk9fUlROX0FEUFRSX05PVF9SRUdJU1RFUkVECQk3CisjZGVmaW5lIEkyT19SVE5fTVNHX1JFUExZX1RJTUVPVVQJCTgKKyNkZWZpbmUgSTJPX1JUTl9OT19TVEFUVVMJCQk5CisjZGVmaW5lIEkyT19SVE5fTk9fRklSTV9WRVIJCQkxMAorI2RlZmluZQlJMk9fUlROX05PX0xJTktfU1BFRUQJCQkxMQorCisvKiBSZXBseSBtZXNzYWdlIHN0YXR1cyBkZWZpbmVzIGZvciBhbGwgbWVzc2FnZXMgKi8KKworI2RlZmluZSBJMk9fUkVQTFlfU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgIAkweDAwCisjZGVmaW5lIEkyT19SRVBMWV9TVEFUVVNfQUJPUlRfRElSVFkgICAgICAgICAgICAgICAgCTB4MDEKKyNkZWZpbmUgSTJPX1JFUExZX1NUQVRVU19BQk9SVF9OT19EQVRBX1RSQU5TRkVSICAgICAJMHgwMgorI2RlZmluZQlJMk9fUkVQTFlfU1RBVFVTX0FCT1JUX1BBUlRJQUxfVFJBTlNGRVIJCTB4MDMKKyNkZWZpbmUJSTJPX1JFUExZX1NUQVRVU19FUlJPUl9ESVJUWQkJCTB4MDQKKyNkZWZpbmUJSTJPX1JFUExZX1NUQVRVU19FUlJPUl9OT19EQVRBX1RSQU5TRkVSCQkweDA1CisjZGVmaW5lCUkyT19SRVBMWV9TVEFUVVNfRVJST1JfUEFSVElBTF9UUkFOU0ZFUgkJMHgwNgorI2RlZmluZQlJMk9fUkVQTFlfU1RBVFVTX1BST0NFU1NfQUJPUlRfRElSVFkJCTB4MDgKKyNkZWZpbmUJSTJPX1JFUExZX1NUQVRVU19QUk9DRVNTX0FCT1JUX05PX0RBVEFfVFJBTlNGRVIJMHgwOQorI2RlZmluZQlJMk9fUkVQTFlfU1RBVFVTX1BST0NFU1NfQUJPUlRfUEFSVElBTF9UUkFOU0ZFUgkweDBBCisjZGVmaW5lCUkyT19SRVBMWV9TVEFUVVNfVFJBTlNBQ1RJT05fRVJST1IJCTB4MEIKKyNkZWZpbmUJSTJPX1JFUExZX1NUQVRVU19QUk9HUkVTU19SRVBPUlQJCTB4ODAKKworLyogU3RhdHVzIGNvZGVzIGFuZCBFcnJvciBJbmZvcm1hdGlvbiBmb3IgUGFyYW1ldGVyIGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIEkyT19QQVJBTVNfU1RBVFVTX1NVQ0NFU1MJCTB4MDAKKyNkZWZpbmUgSTJPX1BBUkFNU19TVEFUVVNfQkFEX0tFWV9BQk9SVAkJMHgwMQorI2RlZmluZSBJMk9fUEFSQU1TX1NUQVRVU19CQURfS0VZX0NPTlRJTlVFICAgCTB4MDIKKyNkZWZpbmUgSTJPX1BBUkFNU19TVEFUVVNfQlVGRkVSX0ZVTEwJCTB4MDMKKyNkZWZpbmUgSTJPX1BBUkFNU19TVEFUVVNfQlVGRkVSX1RPT19TTUFMTAkweDA0CisjZGVmaW5lIEkyT19QQVJBTVNfU1RBVFVTX0ZJRUxEX1VOUkVBREFCTEUJMHgwNQorI2RlZmluZSBJMk9fUEFSQU1TX1NUQVRVU19GSUVMRF9VTldSSVRFQUJMRQkweDA2CisjZGVmaW5lIEkyT19QQVJBTVNfU1RBVFVTX0lOU1VGRklDSUVOVF9GSUVMRFMJMHgwNworI2RlZmluZSBJMk9fUEFSQU1TX1NUQVRVU19JTlZBTElEX0dST1VQX0lECTB4MDgKKyNkZWZpbmUgSTJPX1BBUkFNU19TVEFUVVNfSU5WQUxJRF9PUEVSQVRJT04JMHgwOQorI2RlZmluZSBJMk9fUEFSQU1TX1NUQVRVU19OT19LRVlfRklFTEQJCTB4MEEKKyNkZWZpbmUgSTJPX1BBUkFNU19TVEFUVVNfTk9fU1VDSF9GSUVMRAkJMHgwQgorI2RlZmluZSBJMk9fUEFSQU1TX1NUQVRVU19OT05fRFlOQU1JQ19HUk9VUAkweDBDCisjZGVmaW5lIEkyT19QQVJBTVNfU1RBVFVTX09QRVJBVElPTl9FUlJPUgkweDBECisjZGVmaW5lIEkyT19QQVJBTVNfU1RBVFVTX1NDQUxBUl9FUlJPUgkJMHgwRQorI2RlZmluZSBJMk9fUEFSQU1TX1NUQVRVU19UQUJMRV9FUlJPUgkJMHgwRgorI2RlZmluZSBJMk9fUEFSQU1TX1NUQVRVU19XUk9OR19HUk9VUF9UWVBFCTB4MTAKKworLyogRGV0YWlsZWRTdGF0dXNDb2RlIGRlZmluZXMgZm9yIEV4ZWN1dGl2ZSwgRERNLCBVdGlsIGFuZCBUcmFuc2FjdGlvbiBlcnJvcgorICogbWVzc2FnZXM6IFRhYmxlIDMtMiBEZXRhaWxlZCBTdGF0dXMgQ29kZXMuKi8KKworI2RlZmluZSBJMk9fRFNDX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgSTJPX0RTQ19CQURfS0VZICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIEkyT19EU0NfVENMX0VSUk9SICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBJMk9fRFNDX1JFUExZX0JVRkZFUl9GVUxMICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgSTJPX0RTQ19OT19TVUNIX1BBR0UgICAgICAgICAgICAgICAgICAgMHgwMDA1CisjZGVmaW5lIEkyT19EU0NfSU5TVUZGSUNJRU5UX1JFU09VUkNFX1NPRlQgICAgIDB4MDAwNgorI2RlZmluZSBJMk9fRFNDX0lOU1VGRklDSUVOVF9SRVNPVVJDRV9IQVJEICAgICAweDAwMDcKKyNkZWZpbmUgSTJPX0RTQ19DSEFJTl9CVUZGRVJfVE9PX0xBUkdFICAgICAgICAgMHgwMDA5CisjZGVmaW5lIEkyT19EU0NfVU5TVVBQT1JURURfRlVOQ1RJT04gICAgICAgICAgIDB4MDAwQQorI2RlZmluZSBJMk9fRFNDX0RFVklDRV9MT0NLRUQgICAgICAgICAgICAgICAgICAweDAwMEIKKyNkZWZpbmUgSTJPX0RTQ19ERVZJQ0VfUkVTRVQgICAgICAgICAgICAgICAgICAgMHgwMDBDCisjZGVmaW5lIEkyT19EU0NfSU5BUFBST1BSSUFURV9GVU5DVElPTiAgICAgICAgIDB4MDAwRAorI2RlZmluZSBJMk9fRFNDX0lOVkFMSURfSU5JVElBVE9SX0FERFJFU1MgICAgICAweDAwMEUKKyNkZWZpbmUgSTJPX0RTQ19JTlZBTElEX01FU1NBR0VfRkxBR1MgICAgICAgICAgMHgwMDBGCisjZGVmaW5lIEkyT19EU0NfSU5WQUxJRF9PRkZTRVQgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBJMk9fRFNDX0lOVkFMSURfUEFSQU1FVEVSICAgICAgICAgICAgICAweDAwMTEKKyNkZWZpbmUgSTJPX0RTQ19JTlZBTElEX1JFUVVFU1QgICAgICAgICAgICAgICAgMHgwMDEyCisjZGVmaW5lIEkyT19EU0NfSU5WQUxJRF9UQVJHRVRfQUREUkVTUyAgICAgICAgIDB4MDAxMworI2RlZmluZSBJMk9fRFNDX01FU1NBR0VfVE9PX0xBUkdFICAgICAgICAgICAgICAweDAwMTQKKyNkZWZpbmUgSTJPX0RTQ19NRVNTQUdFX1RPT19TTUFMTCAgICAgICAgICAgICAgMHgwMDE1CisjZGVmaW5lIEkyT19EU0NfTUlTU0lOR19QQVJBTUVURVIgICAgICAgICAgICAgIDB4MDAxNgorI2RlZmluZSBJMk9fRFNDX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTcKKyNkZWZpbmUgSTJPX0RTQ19VTktOT1dOX0VSUk9SICAgICAgICAgICAgICAgICAgMHgwMDE4CisjZGVmaW5lIEkyT19EU0NfVU5LTk9XTl9GVU5DVElPTiAgICAgICAgICAgICAgIDB4MDAxOQorI2RlZmluZSBJMk9fRFNDX1VOU1VQUE9SVEVEX1ZFUlNJT04gICAgICAgICAgICAweDAwMUEKKyNkZWZpbmUgSTJPX0RTQ19ERVZJQ0VfQlVTWSAgICAgICAgICAgICAgICAgICAgMHgwMDFCCisjZGVmaW5lIEkyT19EU0NfREVWSUNFX05PVF9BVkFJTEFCTEUgICAgICAgICAgIDB4MDAxQworCisvKiBEZXZpY2UgQ2xhaW0gVHlwZXMgKi8KKyNkZWZpbmUJSTJPX0NMQUlNX1BSSU1BUlkJCQkJCTB4MDEwMDAwMDAKKyNkZWZpbmUJSTJPX0NMQUlNX01BTkFHRU1FTlQJCQkJCTB4MDIwMDAwMDAKKyNkZWZpbmUJSTJPX0NMQUlNX0FVVEhPUklaRUQJCQkJCTB4MDMwMDAwMDAKKyNkZWZpbmUJSTJPX0NMQUlNX1NFQ09OREFSWQkJCQkJMHgwNDAwMDAwMAorIAorLyogTWVzc2FnZSBoZWFkZXIgZGVmaW5lcyBmb3IgVmVyc2lvbk9mZnNldCAqLworI2RlZmluZSBJMk9WRVIxNQkweDAwMDEKKyNkZWZpbmUgSTJPVkVSMjAJMHgwMDAyCisvKiBEZWZhdWx0IGlzIDEuNSwgRklYTUU6IE5lZWQgc3VwcG9ydCBmb3IgYm90aCAxLjUgYW5kIDIuMCAqLworI2RlZmluZSBJMk9WRVJTSU9OCUkyT1ZFUjE1CisjZGVmaW5lIFNHTF9PRkZTRVRfMCAgICBJMk9WRVJTSU9OCisjZGVmaW5lIFNHTF9PRkZTRVRfNCAgICAoMHgwMDQwIHwgSTJPVkVSU0lPTikKKyNkZWZpbmUgU0dMX09GRlNFVF81ICAgICgweDAwNTAgfCBJMk9WRVJTSU9OKQorI2RlZmluZSBTR0xfT0ZGU0VUXzYgICAgKDB4MDA2MCB8IEkyT1ZFUlNJT04pCisjZGVmaW5lIFNHTF9PRkZTRVRfNyAgICAoMHgwMDcwIHwgSTJPVkVSU0lPTikKKyNkZWZpbmUgU0dMX09GRlNFVF84ICAgICgweDAwODAgfCBJMk9WRVJTSU9OKQorI2RlZmluZSBTR0xfT0ZGU0VUXzkgICAgKDB4MDA5MCB8IEkyT1ZFUlNJT04pCisjZGVmaW5lIFNHTF9PRkZTRVRfMTAgICAoMHgwMEEwIHwgSTJPVkVSU0lPTikKKyNkZWZpbmUgU0dMX09GRlNFVF8xMiAgICgweDAwQzAgfCBJMk9WRVJTSU9OKQorCisjZGVmaW5lIFRSTF9PRkZTRVRfNSAgICAoMHgwMDUwIHwgSTJPVkVSU0lPTikKKyNkZWZpbmUgVFJMX09GRlNFVF82ICAgICgweDAwNjAgfCBJMk9WRVJTSU9OKQorCisgLyogbXNnIGhlYWRlciBkZWZpbmVzIGZvciBNc2dGbGFncyAqLworI2RlZmluZSBNU0dfU1RBVElDCTB4MDEwMAorI2RlZmluZSBNU0dfNjRCSVRfQ05UWFQJMHgwMjAwCisjZGVmaW5lIE1TR19NVUxUSV9UUkFOUwkweDEwMDAKKyNkZWZpbmUgTVNHX0ZBSUwJMHgyMDAwCisjZGVmaW5lIE1TR19MQVNUCTB4NDAwMAorI2RlZmluZSBNU0dfUkVQTFkJMHg4MDAwCisKKyAvKiBtaW5pbXVtIHNpemUgbXNnICovCisjZGVmaW5lIFRIUkVFX1dPUkRfTVNHX1NJWkUJMHgwMDAzMDAwMAorI2RlZmluZSBGT1VSX1dPUkRfTVNHX1NJWkUJMHgwMDA0MDAwMAorI2RlZmluZSBGSVZFX1dPUkRfTVNHX1NJWkUJMHgwMDA1MDAwMAorI2RlZmluZSBTSVhfV09SRF9NU0dfU0laRQkweDAwMDYwMDAwCisjZGVmaW5lIFNFVkVOX1dPUkRfTVNHX1NJWkUJMHgwMDA3MDAwMAorI2RlZmluZSBFSUdIVF9XT1JEX01TR19TSVpFCTB4MDAwODAwMDAKKyNkZWZpbmUgTklORV9XT1JEX01TR19TSVpFCTB4MDAwOTAwMDAKKyNkZWZpbmUgVEVOX1dPUkRfTVNHX1NJWkUJMHgwMDBBMDAwMAorI2RlZmluZSBJMk9fTUVTU0FHRV9TSVpFKHgpCSgoeCk8PDE2KQorCisKKy8qIFNwZWNpYWwgVElEIEFzc2lnbm1lbnRzICovCisKKyNkZWZpbmUgQURBUFRFUl9USUQJCTAKKyNkZWZpbmUgSE9TVF9USUQJCTEKKworI2RlZmluZSBNU0dfRlJBTUVfU0laRQkJMTI4CisjZGVmaW5lIE5NQlJfTVNHX0ZSQU1FUwkJMTI4CisKKyNkZWZpbmUgTVNHX1BPT0xfU0laRQkJMTYzODQKKworI2RlZmluZSBJMk9fUE9TVF9XQUlUX09LCTAKKyNkZWZpbmUgSTJPX1BPU1RfV0FJVF9USU1FT1VUCS1FVElNRURPVVQKKworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX1NDU0lfSTJPX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kcHQvZHB0aV9pb2N0bC5oIGIvZHJpdmVycy9zY3NpL2RwdC9kcHRpX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkMjQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9kcHQvZHB0aV9pb2N0bC5oCkBAIC0wLDAgKzEsMTM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRwdGlfaW9jdGwuaCAgLSAgZGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGJlZ2luICAgICAgICAgICAgICAgIDogVGh1IFNlcCA3IDIwMDAKKyAgICBjb3B5cmlnaHQgICAgICAgICAgICA6IChDKSAyMDAxIGJ5IEFkYXB0ZWMKKworICAgIFNlZSBEb2N1bWVudGF0aW9uL3Njc2kvZHB0aS50eHQgZm9yIGhpc3RvcnksIG5vdGVzLCBsaWNlbnNlIGluZm8KKyAgICBhbmQgY3JlZGl0cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tICBvc2RfdW5peC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfZHB0aV9pb2N0bF9oCisjZGVmaW5lIF9kcHRpX2lvY3RsX2gKKworLy8gSU9DVEwgaW50ZXJmYWNlIGNvbW1hbmRzCisKKyNpZm5kZWYgX0lPV1IKKyMgZGVmaW5lIF9JT1dSKHgseSx6KQkoKCh4KTw8OCl8eSkKKyNlbmRpZgorI2lmbmRlZiBfSU9XCisjIGRlZmluZSBfSU9XKHgseSx6KQkoKCh4KTw8OCl8eSkKKyNlbmRpZgorI2lmbmRlZiBfSU9SCisjIGRlZmluZSBfSU9SKHgseSx6KQkoKCh4KTw8OCl8eSkKKyNlbmRpZgorI2lmbmRlZiBfSU8KKyMgZGVmaW5lIF9JTyh4LHkpCSgoKHgpPDw4KXx5KQorI2VuZGlmCisvKiBFQVRBIFBhc3NUaHJvdWdoIENvbW1hbmQJKi8KKyNkZWZpbmUgRUFUQVVTUkNNRCAgICAgIF9JT1dSKCdEJyw2NSxFQVRBX0NQKQorLyogU2V0IERlYnVnIExldmVsIElmIEVuYWJsZWQJKi8KKyNkZWZpbmUgRFBUX0RFQlVHICAgICAgIF9JT1coJ0QnLDY2LGludCkKKy8qIEdldCBTaWduYXR1cmUgU3RydWN0dXJlCSovCisjZGVmaW5lIERQVF9TSUdOQVRVUkUgICBfSU9SKCdEJyw2NyxkcHRfc2lnX1MpCisjaWYgZGVmaW5lZCBfX2JzZGlfXworI2RlZmluZSBEUFRfU0lHTkFUVVJFX1BBQ0tFRCAgIF9JT1IoJ0QnLDY3LGRwdF9zaWdfU19QYWNrZWQpCisjZW5kaWYKKy8qIEdldCBOdW1iZXIgT2YgRFBUIEFkYXB0ZXJzCSovCisjZGVmaW5lIERQVF9OVU1DVFJMUyAgICBfSU9SKCdEJyw2OCxpbnQpCisvKiBHZXQgQWRhcHRlciBJbmZvIFN0cnVjdHVyZQkqLworI2RlZmluZSBEUFRfQ1RSTElORk8gICAgX0lPUignRCcsNjksQ3RybEluZm8pCisvKiBHZXQgU3RhdGlzdGljcyBJZiBFbmFibGVkCSovCisjZGVmaW5lIERQVF9TVEFUSU5GTyAgICBfSU8oJ0QnLDcwKQorLyogQ2xlYXIgU3RhdHMgSWYgRW5hYmxlZAkqLworI2RlZmluZSBEUFRfQ0xSU1RBVCAgICAgX0lPKCdEJyw3MSkKKy8qIEdldCBTeXN0ZW0gSW5mbyBTdHJ1Y3R1cmUJKi8KKyNkZWZpbmUgRFBUX1NZU0lORk8gICAgIF9JT1IoJ0QnLDcyLHN5c0luZm9fUykKKy8qIFNldCBUaW1lb3V0IFZhbHVlCQkqLworI2RlZmluZSBEUFRfVElNRU9VVCAgICAgX0lPKCdEJyw3MykKKy8qIEdldCBjb25maWcgRGF0YSAgCQkqLworI2RlZmluZSBEUFRfQ09ORklHICAgICAgX0lPKCdEJyw3NCkKKy8qIEdldCBCbGluayBMRUQgQ29kZQkgICAgICAgICovCisjZGVmaW5lIERQVF9CTElOS0xFRCAgICBfSU9SKCdEJyw3NSxpbnQpCisvKiBHZXQgU3RhdGlzdGljYWwgaW5mb3JtYXRpb24gKGlmIGF2YWlsYWJsZSkgKi8KKyNkZWZpbmUgRFBUX1NUQVRTX0lORk8gICAgICAgIF9JT1IoJ0QnLDgwLFNUQVRTX0RBVEEpCisvKiBDbGVhciB0aGUgc3RhdGlzdGljYWwgaW5mb3JtYXRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgRFBUX1NUQVRTX0NMRUFSICAgICAgIF9JTygnRCcsODEpCisvKiBHZXQgUGVyZm9ybWFuY2UgbWV0cmljcyAqLworI2RlZmluZSBEUFRfUEVSRl9JTkZPICAgICAgICBfSU9SKCdEJyw4MixkcHRfcGVyZl90KQorLyogU2VuZCBhbiBJMk8gY29tbWFuZCAqLworI2RlZmluZSBJMk9VU1JDTUQJX0lPKCdEJyw3NikKKy8qIEluZm9ybSBkcml2ZXIgdG8gcmUtYWNxdWlyZSBMQ1QgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgSTJPUkVTQ0FOQ01ECV9JTygnRCcsNzcpCisvKiBJbmZvcm0gZHJpdmVyIHRvIHJlc2V0IGFkYXB0ZXIgKi8KKyNkZWZpbmUgSTJPUkVTRVRDTUQJX0lPKCdEJyw3OCkKKy8qIFNlZSBpZiB0aGUgdGFyZ2V0IGlzIG1vdW50ZWQgKi8KKyNkZWZpbmUgRFBUX1RBUkdFVF9CVVNZCV9JT1IoJ0QnLDc5LCBUQVJHRVRfQlVTWV9UKQorCisKKyAgLyogU3RydWN0dXJlIFJldHVybmVkIEZyb20gR2V0IENvbnRyb2xsZXIgSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVDSEFSICAgIHN0YXRlOyAgICAgICAgICAgIC8qIE9wZXJhdGlvbmFsIHN0YXRlICAgICAgICAgICAgICAgKi8KKwl1Q0hBUiAgICBpZDsgICAgICAgICAgICAgICAvKiBIb3N0IGFkYXB0ZXIgU0NTSSBpZCAgICAgICAgICAgICovCisJaW50ICAgICAgdmVjdDsgICAgICAgICAgICAgLyogSW50ZXJydXB0IHZlY3RvciBudW1iZXIgICAgICAgICAqLworCWludCAgICAgIGJhc2U7ICAgICAgICAgICAgIC8qIEJhc2UgSS9PIGFkZHJlc3MgICAgICAgICAgICAgICAgKi8KKwlpbnQgICAgICBuam9iczsgICAgICAgICAgICAvKiAjIG9mIGpvYnMgc2VudCB0byBIQSAgICAgICAgICAgICovCisJaW50ICAgICAgcWRlcHRoOyAgICAgICAgICAgLyogQ29udHJvbGxlciBxdWV1ZSBkZXB0aC4gICAgICAgICAqLworCWludCAgICAgIHdha2ViYXNlOyAgICAgICAgIC8qIG1weCB3YWtldXAgYmFzZSBpbmRleC4gICAgICAgICAgKi8KKwl1TE9ORyAgICBTR3NpemU7ICAgICAgICAgICAvKiBTY2F0dGVyL0dhdGhlciBsaXN0IHNpemUuICAgICAgICovCisJdW5zaWduZWQgaGVhZHM7ICAgICAgICAgICAgLyogaGVhZHMgZm9yIGRyaXZlcyBvbiBjbnRsci4gICAgICAqLworCXVuc2lnbmVkIHNlY3RvcnM7ICAgICAgICAgIC8qIHNlY3RvcnMgZm9yIGRyaXZlcyBvbiBjbnRsci4gICAgKi8KKwl1Q0hBUiAgICBkb19kcml2ZTMyOyAgICAgICAvKiBGbGFnIGZvciBBYm92ZSAxNiBNQiBBYmlsaXR5ICAgICovCisJdUNIQVIgICAgQnVzUXVpZXQ7ICAgICAgICAgLyogU0NTSSBCdXMgUXVpZXQgRmxhZyAgICAgICAgICAgICAqLworCWNoYXIgICAgIGlkUEFMWzRdOyAgICAgICAgIC8qIDQgQnl0ZXMgT2YgVGhlIElEIFBhbCAgICAgICAgICAgKi8KKwl1Q0hBUiAgICBwcmltYXJ5OyAgICAgICAgICAvKiAxIEZvciBQcmltYXJ5LCAwIEZvciBTZWNvbmRhcnkgICovCisJdUNIQVIgICAgZWF0YVZlcnNpb247ICAgICAgLyogRUFUQSBWZXJzaW9uICAgICAgICAgICAgICAgICAgICAqLworCXVMT05HICAgIGNwTGVuZ3RoOyAgICAgICAgIC8qIEVBVEEgQ29tbWFuZCBQYWNrZXQgTGVuZ3RoICAgICAgKi8KKwl1TE9ORyAgICBzcExlbmd0aDsgICAgICAgICAvKiBFQVRBIFN0YXR1cyBQYWNrZXQgTGVuZ3RoICAgICAgICovCisJdUNIQVIgICAgZHJxTnVtOyAgICAgICAgICAgLyogRFJRIEluZGV4ICgwLDUsNiw3KSAgICAgICAgICAgICAqLyAKKwl1Q0hBUiAgICBmbGFnMTsgICAgICAgICAgICAvKiBFQVRBIEZsYWdzIDEgKEJ5dGUgOSkgICAgICAgICAgICovCisJdUNIQVIgICAgZmxhZzI7ICAgICAgICAgICAgLyogRUFUQSBGbGFncyAyIChCeXRlIDMwKSAgICAgICAgICAqLworfSBDdHJsSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVTSE9SVCBsZW5ndGg7CQkvLyBSZW1haW5pbmcgbGVuZ3RoIG9mIHRoaXMKKwl1U0hPUlQgZHJ2ckhCQW51bTsJLy8gUmVsYXRpdmUgSEJBICMgdXNlZCBieSB0aGUgZHJpdmVyCisJdUxPTkcgYmFzZUFkZHI7CQkvLyBCYXNlIEkvTyBhZGRyZXNzCisJdVNIT1JUIGJsaW5rU3RhdGU7CS8vIEJsaW5rIExFRCBzdGF0ZSAoMD1Ob3QgaW4gYmxpbmsgTEVEKQorCXVDSEFSIHBjaUJ1c051bTsJLy8gUENJIEJ1cyAjIChPcHRpb25hbCkKKwl1Q0hBUiBwY2lEZXZpY2VOdW07CS8vIFBDSSBEZXZpY2UgIyAoT3B0aW9uYWwpCisJdVNIT1JUIGhiYUZsYWdzOwkvLyBNaXNjZWxsYW5lb3VzIEhCQSBmbGFncworCXVTSE9SVCBJbnRlcnJ1cHQ7CS8vIEludGVycnVwdCBzZXQgZm9yIHRoaXMgZGV2aWNlLgorIyAgIGlmIChkZWZpbmVkKF9EUFRfQVJDKSkKKwl1TE9ORyBiYXNlTGVuZ3RoOworCUFEQVBURVJfT0JKRUNUICpBZGFwdGVyT2JqZWN0OworCUxBUkdFX0lOVEVHRVIgRG1hTG9naWNhbEFkZHJlc3M7CisJUFZPSUQgRG1hVmlydHVhbEFkZHJlc3M7CisJTEFSR0VfSU5URUdFUiBSZXBseUxvZ2ljYWxBZGRyZXNzOworCVBWT0lEIFJlcGx5VmlydHVhbEFkZHJlc3M7CisjICAgZWxzZQorCXVMT05HIHJlc2VydmVkMTsJLy8gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24KKwl1TE9ORyByZXNlcnZlZDI7CS8vIFJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uCisJdUxPTkcgcmVzZXJ2ZWQzOwkvLyBSZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbgorIyAgIGVuZGlmCit9IGRydnJIQkFpbmZvX1M7CisKK3R5cGVkZWYgc3RydWN0IFRBUkdFVF9CVVNZCit7CisgIHVMT05HIGNoYW5uZWw7CisgIHVMT05HIGlkOworICB1TE9ORyBsdW47CisgIHVMT05HIGlzQnVzeTsKK30gVEFSR0VUX0JVU1lfVDsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kcHQvZHB0c2lnLmggYi9kcml2ZXJzL3Njc2kvZHB0L2RwdHNpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YTRjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZHB0L2RwdHNpZy5oCkBAIC0wLDAgKzEsMzM5IEBACisvKglCU0RJIGRwdHNpZy5oLHYgMS43IDE5OTgvMDYvMDMgMTk6MTU6MDAga2FyZWxzIEV4cAkqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgRGlzdHJpYnV0ZWQgUHJvY2Vzc2luZyBUZWNobm9sb2d5IENvcnBvcmF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGZvcm0sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorICogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGBhcyBpcycgYnkgRGlzdHJpYnV0ZWQgUHJvY2Vzc2luZyBUZWNobm9sb2d5IGFuZAorICogYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlCisgKiBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSwKKyAqIGFyZSBkaXNjbGFpbWVkLiBJbiBubyBldmVudCBzaGFsbCBEaXN0cmlidXRlZCBQcm9jZXNzaW5nIFRlY2hub2xvZ3kgYmUKKyAqIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSBvcgorICogY29uc2VxdWVudGlhbCBkYW1hZ2VzIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2YKKyAqIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcworICogaW50ZXJydXB0aW9ucykgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluCisgKiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKQorICogYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgZHJpdmVyIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQKKyAqIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0RQVFNJR19IXworI2RlZmluZSBfX0RQVFNJR19IXworI2lmZGVmIF9TSU5JWF9BRERPTgorI2luY2x1ZGUgImRwdC5oIgorI2VuZGlmCisvKiBEUFQgU0lHTkFUVVJFIFNQRUMgQU5EIEhFQURFUiBGSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFNpZ25hdHVyZSBWZXJzaW9uIDEgKHNvcnJ5IG5vICdBJykgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiB0byBtYWtlIHN1cmUgd2UgYXJlIHRhbGtpbmcgdGhlIHNhbWUgc2l6ZSB1bmRlciBhbGwgT1MncyAgICAgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBzaWdCWVRFOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBzaWdXT1JEOworI2lmIChkZWZpbmVkKF9NVUxUSV9EQVRBTU9ERUwpICYmIGRlZmluZWQoc3VuKSAmJiAhZGVmaW5lZChfSUxQMzIpKQordHlwZWRlZiB1aW50MzJfdCBzaWdMT05HOworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzaWdMT05HOworI2VuZGlmCisKKy8qCisgKiB1c2Ugc2lnV09SRExpdHRsZUVuZGlhbiBmb3I6CisgKiAgZHNDYXBhYmlsaXRpZXMKKyAqICBkc0RldmljZVN1cHAKKyAqICBkc0FkYXB0ZXJTdXBwCisgKiAgZHNBcHBsaWNhdGlvbgorICogdXNlIHNpZ0xPTkdMaXR0bGVFbmRpYW4gZm9yOgorICogICAgICBkc09TCisgKiBzbyB0aGF0IHRoZSBzaWcgY2FuIGJlIHN0YW5kYXJkaXNlZCB0byBMaXR0bGUgRW5kaWFuCisgKi8KKyNpZiAoZGVmaW5lZChfRFBUX0JJR19FTkRJQU4pKQorIyBkZWZpbmUgc2lnV09SRExpdHRsZUVuZGlhbih4KSAoKCgoeCkmMHhGRik8PDgpfCgoKHgpPj44KSYweEZGKSkKKyMgZGVmaW5lIHNpZ0xPTkdMaXR0bGVFbmRpYW4oeCkgXAorICAgICAgICAoKCgoeCkmMHhGRik8PDI0KSB8ICAgICAgICAgICAgIFwKKyAgICAgICAgICgoKHgpJjB4RkYwMCk8PDgpIHwgICAgXAorICAgICAgICAgKCgoeCkmMHhGRjAwMDBMKT4+OCkgfCBcCisgICAgICAgICAoKCh4KSYweEZGMDAwMDAwTCk+PjI0KSkKKyNlbHNlCisjIGRlZmluZSBzaWdXT1JETGl0dGxlRW5kaWFuKHgpICh4KQorIyBkZWZpbmUgc2lnTE9OR0xpdHRsZUVuZGlhbih4KSAoeCkKKyNlbmRpZgorCisvKiBtdXN0IG1ha2Ugc3VyZSB0aGUgc3RydWN0dXJlIGlzIG5vdCB3b3JkIG9yIGRvdWJsZS13b3JkIGFsaWduZWQgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgKi8KKy8qIEJvcmxhbmQgd2lsbCBpZ25vcmUgdGhlIGZvbGxvd2luZyBwcmFnbWE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBXb3JkIGFsaWdubWVudCBpcyBPRkYgYnkgZGVmYXVsdC4gIElmIGluIHRoZSwgSURFIG1ha2UgICAgICAgICAgICAgICAqLworLyogc3VyZSB0aGF0IE9wdGlvbnMgfCBDb21waWxlciB8IENvZGUgR2VuZXJhdGlvbiB8IFdvcmQgQWxpZ25tZW50ICAgICAgKi8KKy8qIGlzIG5vdCBjaGVja2VkLiAgSWYgdXNpbmcgQkNDLCBkbyBub3QgdXNlIHRoZSAtYSBvcHRpb24uICAgICAgICAgICAgICovCisKKyNpZm5kZWYgTk9fUEFDSworI2lmIGRlZmluZWQgKF9EUFRfQUlYKQorI3ByYWdtYSBvcHRpb25zIGFsaWduPXBhY2tlZAorI2Vsc2UKKyNwcmFnbWEgcGFjaygxKQorI2VuZGlmICAvKiBhaXggKi8KKyNlbmRpZgorLyogRm9yIHRoZSBNYWNpbnRvc2ggKi8KKyNpZiBTVFJVQ1RBTElHTk1FTlRTVVBQT1JURUQKKyNwcmFnbWEgb3B0aW9ucyBhbGlnbj1tYWM2OGsKKyNlbmRpZgorCisKKy8qIEN1cnJlbnQgU2lnbmF0dXJlIFZlcnNpb24gLSBzaWdCWVRFIGRzU2lnVmVyc2lvbjsgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBTSUdfVkVSU0lPTiAxCisKKy8qIFByb2Nlc3NvciBGYW1pbHkgLSBzaWdCWVRFIGRzUHJvY2Vzc29yRmFtaWx5OyAgRElTVElOQ1QgVkFMVUVTICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFdoYXQgdHlwZSBvZiBwcm9jZXNzb3IgdGhlIGZpbGUgaXMgbWVhbnQgdG8gcnVuIG9uLiAqLworLyogVGhpcyB3aWxsIGxldCB1cyBrbm93IHdoZXRoZXIgdG8gcmVhZCBzaWdXT1JEcyBhcyBoaWdoL2xvdyBvciBsb3cvaGlnaC4gKi8KKyNkZWZpbmUgUFJPQ19JTlRFTCAgICAgIDB4MDAgICAgLyogSW50ZWwgODB4ODYgKi8KKyNkZWZpbmUgUFJPQ19NT1RPUk9MQSAgIDB4MDEgICAgLyogTW90b3JvbGEgNjhLICovCisjZGVmaW5lIFBST0NfTUlQUzQwMDAgICAweDAyICAgIC8qIE1JUFMgUklTQyA0MDAwICovCisjZGVmaW5lIFBST0NfQUxQSEEgICAgICAweDAzICAgIC8qIERFQyBBbHBoYSAqLworI2RlZmluZSBQUk9DX1BPV0VSUEMgICAgMHgwNCAgICAvKiBJQk0gUG93ZXIgUEMgKi8KKyNkZWZpbmUgUFJPQ19pOTYwICAgICAgIDB4MDUgICAgLyogSW50ZWwgaTk2MCAqLworI2RlZmluZSBQUk9DX1VMVFJBU1BBUkMgMHgwNiAgICAvKiBTUEFSQyBwcm9jZXNzb3IgKi8KKworLyogU3BlY2lmaWMgTWluaW1pbSBQcm9jZXNzb3IgLSBzaWdCWVRFIGRzUHJvY2Vzc29yOyAgICBGTEFHIEJJVFMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRGlmZmVyZW50IGJpdCBkZWZpbml0aW9ucyBkZXBlbmRlbnQgb24gcHJvY2Vzc29yX2ZhbWlseSAqLworCisvKiBQUk9DX0lOVEVMOiAqLworI2RlZmluZSBQUk9DXzgwODYgICAgICAgMHgwMSAgICAvKiBJbnRlbCA4MDg2ICovCisjZGVmaW5lIFBST0NfMjg2ICAgICAgICAweDAyICAgIC8qIEludGVsIDgwMjg2ICovCisjZGVmaW5lIFBST0NfMzg2ICAgICAgICAweDA0ICAgIC8qIEludGVsIDgwMzg2ICovCisjZGVmaW5lIFBST0NfNDg2ICAgICAgICAweDA4ICAgIC8qIEludGVsIDgwNDg2ICovCisjZGVmaW5lIFBST0NfUEVOVElVTSAgICAweDEwICAgIC8qIEludGVsIDU4NiBha2EgUDUgYWthIFBlbnRpdW0gKi8KKyNkZWZpbmUgUFJPQ19TRVhJVU0JMHgyMAkvKiBJbnRlbCA2ODYgYWthIFA2IGFrYSBQZW50aXVtIFBybyBvciBNTVggKi8KKworLyogUFJPQ19pOTYwOiAqLworI2RlZmluZSBQUk9DXzk2MFJYICAgICAgMHgwMSAgICAvKiBJbnRlbCA4MDk2MFJDL1JEICovCisjZGVmaW5lIFBST0NfOTYwSFggICAgICAweDAyICAgIC8qIEludGVsIDgwOTYwSEEvSEQvSFQgKi8KKworLyogUFJPQ19NT1RPUk9MQTogKi8KKyNkZWZpbmUgUFJPQ182ODAwMCAgICAgIDB4MDEgICAgLyogTW90b3JvbGEgNjgwMDAgKi8KKyNkZWZpbmUgUFJPQ182ODAxMAkweDAyCS8qIE1vdG9yb2xhIDY4MDEwICovCisjZGVmaW5lIFBST0NfNjgwMjAgICAgICAweDA0ICAgIC8qIE1vdG9yb2xhIDY4MDIwICovCisjZGVmaW5lIFBST0NfNjgwMzAgICAgICAweDA4ICAgIC8qIE1vdG9yb2xhIDY4MDMwICovCisjZGVmaW5lIFBST0NfNjgwNDAgICAgICAweDEwICAgIC8qIE1vdG9yb2xhIDY4MDQwICovCisKKy8qIFBST0NfUE9XRVJQQyAqLworI2RlZmluZSBQUk9DX1BQQzYwMQkJMHgwMQkvKiBQb3dlclBDIDYwMSAqLworI2RlZmluZSBQUk9DX1BQQzYwMwkJMHgwMgkvKiBQb3dlclBDIDYwMyAqLworI2RlZmluZSBQUk9DX1BQQzYwNAkJMHgwNAkvKiBQb3dlclBDIDYwNCAqLworCisvKiBQUk9DX01JUFM0MDAwOiAqLworI2RlZmluZSBQUk9DX1I0MDAwICAgICAgMHgwMSAgICAvKiBNSVBTIFI0MDAwICovCisKKy8qIEZpbGV0eXBlIC0gc2lnQllURSBkc0ZpbGV0eXBlOyAgICAgICBESVNUSU5DVCBWQUxVRVMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBGVF9FWEVDVVRBQkxFICAgMCAgICAgICAvKiBFeGVjdXRhYmxlIFByb2dyYW0gKi8KKyNkZWZpbmUgRlRfU0NSSVBUICAgICAgIDEgICAgICAgLyogU2NyaXB0L0JhdGNoIEZpbGU/Pz8gKi8KKyNkZWZpbmUgRlRfSEJBRFJWUiAgICAgIDIgICAgICAgLyogSEJBIERyaXZlciAqLworI2RlZmluZSBGVF9PVEhFUkRSVlIgICAgMyAgICAgICAvKiBPdGhlciBEcml2ZXIgKi8KKyNkZWZpbmUgRlRfSUZTICAgICAgICAgIDQgICAgICAgLyogSW5zdGFsbGFibGUgRmlsZXN5c3RlbSBEcml2ZXIgKi8KKyNkZWZpbmUgRlRfRU5HSU5FICAgICAgIDUgICAgICAgLyogRFBUIEVuZ2luZSAqLworI2RlZmluZSBGVF9DT01QRFJWUiAgICAgNiAgICAgICAvKiBDb21wcmVzc2VkIERyaXZlciBEaXNrICovCisjZGVmaW5lIEZUX0xBTkdVQUdFICAgICA3ICAgICAgIC8qIEZvcmVpZ24gTGFuZ3VhZ2UgZmlsZSAqLworI2RlZmluZSBGVF9GSVJNV0FSRSAgICAgOCAgICAgICAvKiBEb3dubG9hZGFibGUgb3IgYWN0dWFsIEZpcm13YXJlICovCisjZGVmaW5lIEZUX0NPTU1NT0RMICAgICA5ICAgICAgIC8qIENvbW11bmljYXRpb25zIE1vZHVsZSAqLworI2RlZmluZSBGVF9JTlQxMyAgICAgICAgMTAgICAgICAvKiBJTlQgMTMgc3R5bGUgSEJBIERyaXZlciAqLworI2RlZmluZSBGVF9IRUxQRklMRSAgICAgMTEgICAgICAvKiBIZWxwIGZpbGUgKi8KKyNkZWZpbmUgRlRfTE9HR0VSICAgICAgIDEyICAgICAgLyogRXZlbnQgTG9nZ2VyICovCisjZGVmaW5lIEZUX0lOU1RBTEwgICAgICAxMyAgICAgIC8qIEFuIEluc3RhbGwgUHJvZ3JhbSAqLworI2RlZmluZSBGVF9MSUJSQVJZICAgICAgMTQgICAgICAvKiBTdG9yYWdlIE1hbmFnZXIgUmVhbC1Nb2RlIENhbGxzICovCisjZGVmaW5lIEZUX1JFU09VUkNFIAkxNSAJLyogU3RvcmFnZSBNYW5hZ2VyIFJlc291cmNlIEZpbGUgKi8KKyNkZWZpbmUgRlRfTU9ERU1fREIgIAkxNiAgCS8qIFN0b3JhZ2UgTWFuYWdlciBNb2RlbSBEYXRhYmFzZSAqLworCisvKiBGaWxldHlwZSBmbGFncyAtIHNpZ0JZVEUgZHNGaWxldHlwZUZsYWdzOyAgICBGTEFHIEJJVFMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBGVEZfRExMICAgICAgICAgMHgwMSAgICAvKiBEeW5hbWljIExpbmsgTGlicmFyeSAqLworI2RlZmluZSBGVEZfTkxNICAgICAgICAgMHgwMiAgICAvKiBOZXR3YXJlIExvYWRhYmxlIE1vZHVsZSAqLworI2RlZmluZSBGVEZfT1ZFUkxBWVMgICAgMHgwNCAgICAvKiBVc2VzIG92ZXJsYXlzICovCisjZGVmaW5lIEZURl9ERUJVRyAgICAgICAweDA4ICAgIC8qIERlYnVnIHZlcnNpb24gKi8KKyNkZWZpbmUgRlRGX1RTUiAgICAgICAgIDB4MTAgICAgLyogVFNSICovCisjZGVmaW5lIEZURl9TWVMgICAgICAgICAweDIwICAgIC8qIERPUyBMb2FkYWJsZSBkcml2ZXIgKi8KKyNkZWZpbmUgRlRGX1BST1RFQ1RFRCAgIDB4NDAgICAgLyogUnVucyBpbiBwcm90ZWN0ZWQgbW9kZSAqLworI2RlZmluZSBGVEZfQVBQX1NQRUMgICAgMHg4MCAgICAvKiBBcHBsaWNhdGlvbiBTcGVjaWZpYyAqLworI2RlZmluZSBGVEZfUk9NCQkoRlRGX1NZU3xGVEZfVFNSKQkvKiBTcGVjaWFsIENhc2UgKi8KKworLyogT0VNIC0gc2lnQllURSBkc09FTTsgICAgICAgICBESVNUSU5DVCBWQUxVRVMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBPRU1fRFBUICAgICAgICAgMCAgICAgICAvKiBEUFQgKi8KKyNkZWZpbmUgT0VNX0FUVCAgICAgICAgIDEgICAgICAgLyogQVRUICovCisjZGVmaW5lIE9FTV9ORUMgICAgICAgICAyICAgICAgIC8qIE5FQyAqLworI2RlZmluZSBPRU1fQUxQSEEgICAgICAgMyAgICAgICAvKiBBbHBoYXRyb25peCAqLworI2RlZmluZSBPRU1fQVNUICAgICAgICAgNCAgICAgICAvKiBBU1QgKi8KKyNkZWZpbmUgT0VNX09MSVZFVFRJICAgIDUgICAgICAgLyogT2xpdmV0dGkgKi8KKyNkZWZpbmUgT0VNX1NOSSAgICAgICAgIDYgICAgICAgLyogU2llbWVucy9OaXhkb3JmICovCisjZGVmaW5lIE9FTV9TVU4gICAgICAgICA3ICAgICAgIC8qIFNVTiBNaWNyb3N5c3RlbXMgKi8KKworLyogT3BlcmF0aW5nIFN5c3RlbSAgLSBzaWdMT05HIGRzT1M7ICAgIEZMQUcgQklUUyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIE9TX0RPUyAgICAgICAgICAweDAwMDAwMDAxIC8qIFBDL01TLURPUwkJCQkqLworI2RlZmluZSBPU19XSU5ET1dTICAgICAgMHgwMDAwMDAwMiAvKiBNaWNyb3NvZnQgV2luZG93cyAzLngJCSovCisjZGVmaW5lIE9TX1dJTkRPV1NfTlQgICAweDAwMDAwMDA0IC8qIE1pY3Jvc29mdCBXaW5kb3dzIE5UCQkqLworI2RlZmluZSBPU19PUzJNICAgICAgICAgMHgwMDAwMDAwOCAvKiBPUy8yIDEuMi54LE1TIDEuMy4wLElCTSAxLjMueCAtIE1vbm9saXRoaWMgKi8KKyNkZWZpbmUgT1NfT1MyTCAgICAgICAgIDB4MDAwMDAwMTAgLyogTWljcm9zb2Z0IE9TLzIgMS4zMDEgLSBMQUREUgkqLworI2RlZmluZSBPU19PUzIyeCAgICAgICAgMHgwMDAwMDAyMCAvKiBJQk0gT1MvMiAyLngJCQkqLworI2RlZmluZSBPU19OVzI4NiAgICAgICAgMHgwMDAwMDA0MCAvKiBOb3ZlbGwgTmV0V2FyZSAyODYJCSovCisjZGVmaW5lIE9TX05XMzg2ICAgICAgICAweDAwMDAwMDgwIC8qIE5vdmVsbCBOZXRXYXJlIDM4NgkJKi8KKyNkZWZpbmUgT1NfR0VOX1VOSVggICAgIDB4MDAwMDAxMDAgLyogR2VuZXJpYyBVbml4CQkJKi8KKyNkZWZpbmUgT1NfU0NPX1VOSVggICAgIDB4MDAwMDAyMDAgLyogU0NPIFVuaXgJCQkJKi8KKyNkZWZpbmUgT1NfQVRUX1VOSVggICAgIDB4MDAwMDA0MDAgLyogQVRUIFVuaXgJCQkJKi8KKyNkZWZpbmUgT1NfVU5JWFdBUkUgICAgIDB4MDAwMDA4MDAgLyogVVNMIFVuaXgJCQkJKi8KKyNkZWZpbmUgT1NfSU5UX1VOSVggICAgIDB4MDAwMDEwMDAgLyogSW50ZXJhY3RpdmUgVW5peAkJCSovCisjZGVmaW5lIE9TX1NPTEFSSVMgICAgICAweDAwMDAyMDAwIC8qIFN1blNvZnQgU29sYXJpcwkJCSovCisjZGVmaW5lIE9TX1FOWCAgICAgICAgICAweDAwMDA0MDAwIC8qIFFOWCBmb3IgVG9tIE1vY2gJCQkqLworI2RlZmluZSBPU19ORVhUU1RFUCAgICAgMHgwMDAwODAwMCAvKiBOZVhUU1RFUC9PUEVOU1RFUC9NQUNICQkqLworI2RlZmluZSBPU19CQU5ZQU4gICAgICAgMHgwMDAxMDAwMCAvKiBCYW55YW4gVmluZXMJCQkqLworI2RlZmluZSBPU19PTElWRVRUSV9VTklYIDB4MDAwMjAwMDAvKiBPbGl2ZXR0aSBVbml4CQkJKi8KKyNkZWZpbmUgT1NfTUFDX09TCTB4MDAwNDAwMDAgLyogTWFjIE9TCQkJCSovCisjZGVmaW5lIE9TX1dJTkRPV1NfOTUJMHgwMDA4MDAwMCAvKiBNaWNyb3NvZnQgV2luZG93cyAnOTUJCSovCisjZGVmaW5lIE9TX05XNHgJCTB4MDAxMDAwMDAgLyogTm92ZWxsIE5ldHdhcmUgNC54CQkqLworI2RlZmluZSBPU19CU0RJX1VOSVgJMHgwMDIwMDAwMCAvKiBCU0RpIFVuaXggQlNEL09TIDIuMCBhbmQgdXAJKi8KKyNkZWZpbmUgT1NfQUlYX1VOSVggICAgIDB4MDA0MDAwMDAgLyogQUlYIFVuaXgJCQkJKi8KKyNkZWZpbmUgT1NfRlJFRV9CU0QJMHgwMDgwMDAwMCAvKiBGcmVlQlNEIFVuaXgJCQkqLworI2RlZmluZSBPU19MSU5VWAkweDAxMDAwMDAwIC8qIExpbnV4CQkJCSovCisjZGVmaW5lIE9TX0RHVVhfVU5JWAkweDAyMDAwMDAwIC8qIERhdGEgR2VuZXJhbCBVbml4CQkJKi8KKyNkZWZpbmUgT1NfU0lOSVhfTiAgICAgIDB4MDQwMDAwMDAgLyogU05JIFNJTklYLU4JCQkqLworI2RlZmluZSBPU19QTEFOOQkweDA4MDAwMDAwIC8qIEFUVCBQbGFuIDkJCQkqLworI2RlZmluZSBPU19UU1gJCTB4MTAwMDAwMDAgLyogU05IIFRTWC0zMgkJCSovCisKKyNkZWZpbmUgT1NfT1RIRVIgICAgICAgIDB4ODAwMDAwMDAgLyogT3RoZXIJCQkJKi8KKworLyogQ2FwYWJpbGl0aWVzIC0gc2lnV09SRCBkc0NhcGFiaWxpdGllczsgICAgICAgIEZMQUcgQklUUyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIENBUF9SQUlEMCAgICAgICAweDAwMDEgIC8qIFJBSUQtMCAqLworI2RlZmluZSBDQVBfUkFJRDEgICAgICAgMHgwMDAyICAvKiBSQUlELTEgKi8KKyNkZWZpbmUgQ0FQX1JBSUQzICAgICAgIDB4MDAwNCAgLyogUkFJRC0zICovCisjZGVmaW5lIENBUF9SQUlENSAgICAgICAweDAwMDggIC8qIFJBSUQtNSAqLworI2RlZmluZSBDQVBfU1BBTiAgICAgICAgMHgwMDEwICAvKiBTcGFubmluZyAqLworI2RlZmluZSBDQVBfUEFTUyAgICAgICAgMHgwMDIwICAvKiBQcm92aWRlcyBwYXNzdGhyb3VnaCAqLworI2RlZmluZSBDQVBfT1ZFUkxBUCAgICAgMHgwMDQwICAvKiBQYXNzdGhyb3VnaCBzdXBwb3J0cyBvdmVybGFwcGVkIGNvbW1hbmRzICovCisjZGVmaW5lIENBUF9BU1BJICAgICAgICAweDAwODAgIC8qIFN1cHBvcnRzIEFTUEkgQ29tbWFuZCBSZXF1ZXN0cyAqLworI2RlZmluZSBDQVBfQUJPVkUxNk1CICAgMHgwMTAwICAvKiBJU0EgRHJpdmVyIHN1cHBvcnRzIGdyZWF0ZXIgdGhhbiAxNk1CICovCisjZGVmaW5lIENBUF9FWFRFTkQgICAgICAweDgwMDAgIC8qIEV4dGVuZGVkIGluZm8gYXBwZWFycyBhZnRlciBkZXNjcmlwdGlvbiAqLworI2lmZGVmIFNOSV9NSVBTCisjZGVmaW5lIENBUF9DQUNIRU1PREUgICAweDEwMDAgIC8qIGRwdF9mb3JjZV9jYWNoZSBpcyBzZXQgaW4gZHJpdmVyICovCisjZW5kaWYKKworLyogRGV2aWNlcyBTdXBwb3J0ZWQgLSBzaWdXT1JEIGRzRGV2aWNlU3VwcDsgICAgRkxBRyBCSVRTICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgREVWX0RBU0QgICAgICAgIDB4MDAwMSAgLyogREFTRCAoaGFyZCBkcml2ZXMpICovCisjZGVmaW5lIERFVl9UQVBFICAgICAgICAweDAwMDIgIC8qIFRhcGUgZHJpdmVzICovCisjZGVmaW5lIERFVl9QUklOVEVSICAgICAweDAwMDQgIC8qIFByaW50ZXJzICovCisjZGVmaW5lIERFVl9QUk9DICAgICAgICAweDAwMDggIC8qIFByb2Nlc3NvcnMgKi8KKyNkZWZpbmUgREVWX1dPUk0gICAgICAgIDB4MDAxMCAgLyogV09STSBkcml2ZXMgKi8KKyNkZWZpbmUgREVWX0NEUk9NICAgICAgIDB4MDAyMCAgLyogQ0QtUk9NIGRyaXZlcyAqLworI2RlZmluZSBERVZfU0NBTk5FUiAgICAgMHgwMDQwICAvKiBTY2FubmVycyAqLworI2RlZmluZSBERVZfT1BUSUNBTCAgICAgMHgwMDgwICAvKiBPcHRpY2FsIERyaXZlcyAqLworI2RlZmluZSBERVZfSlVLRUJPWCAgICAgMHgwMTAwICAvKiBKdWtlYm94ICovCisjZGVmaW5lIERFVl9DT01NICAgICAgICAweDAyMDAgIC8qIENvbW11bmljYXRpb25zIERldmljZXMgKi8KKyNkZWZpbmUgREVWX09USEVSICAgICAgIDB4MDQwMCAgLyogT3RoZXIgRGV2aWNlcyAqLworI2RlZmluZSBERVZfQUxMICAgICAgICAgMHhGRkZGICAvKiBBbGwgU0NTSSBEZXZpY2VzICovCisKKy8qIEFkYXB0ZXJzIEZhbWlsaWVzIFN1cHBvcnRlZCAtIHNpZ1dPUkQgZHNBZGFwdGVyU3VwcDsgRkxBRyBCSVRTICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgQURGXzIwMDEgICAgICAgIDB4MDAwMSAgLyogUE0yMDAxICAgICAgICAgICAqLworI2RlZmluZSBBREZfMjAxMkEgICAgICAgMHgwMDAyICAvKiBQTTIwMTJBICAgICAgICAgICovCisjZGVmaW5lIEFERl9QTFVTX0lTQSAgICAweDAwMDQgIC8qIFBNMjAxMSxQTTIwMjEgICAgKi8KKyNkZWZpbmUgQURGX1BMVVNfRUlTQSAgIDB4MDAwOCAgLyogUE0yMDEyQixQTTIwMjIgICAqLworI2RlZmluZSBBREZfU0MzX0lTQQkweDAwMTAgIC8qIFBNMjAyMSAgICAgICAgICAgKi8KKyNkZWZpbmUgQURGX1NDM19FSVNBCTB4MDAyMCAgLyogUE0yMDIyLFBNMjEyMiwgZXRjICovCisjZGVmaW5lIEFERl9TQzNfUENJCTB4MDA0MCAgLyogU21hcnRDYWNoZSBJSUkgUENJICovCisjZGVmaW5lIEFERl9TQzRfSVNBCTB4MDA4MCAgLyogU21hcnRDYWNoZSBJViBJU0EgKi8KKyNkZWZpbmUgQURGX1NDNF9FSVNBCTB4MDEwMCAgLyogU21hcnRDYWNoZSBJViBFSVNBICovCisjZGVmaW5lIEFERl9TQzRfUENJCTB4MDIwMAkvKiBTbWFydENhY2hlIElWIFBDSSAqLworI2RlZmluZSBBREZfU0M1X1BDSQkweDA0MDAJLyogRmlmdGggR2VuZXJhdGlvbiBJMk8gcHJvZHVjdHMgKi8KKy8qCisgKglDb21iaW5hdGlvbnMgb2YgcHJvZHVjdHMKKyAqLworI2RlZmluZSBBREZfQUxMXzIwMDAJKEFERl8yMDAxfEFERl8yMDEyQSkKKyNkZWZpbmUgQURGX0FMTF9QTFVTCShBREZfUExVU19JU0F8QURGX1BMVVNfRUlTQSkKKyNkZWZpbmUgQURGX0FMTF9TQzMJKEFERl9TQzNfSVNBfEFERl9TQzNfRUlTQXxBREZfU0MzX1BDSSkKKyNkZWZpbmUgQURGX0FMTF9TQzQJKEFERl9TQzRfSVNBfEFERl9TQzRfRUlTQXxBREZfU0M0X1BDSSkKKyNkZWZpbmUgQURGX0FMTF9TQzUJKEFERl9TQzVfUENJKQorLyogQWxsIEVBVEEgQ2FjaGVpbmcgUHJvZHVjdHMgKi8KKyNkZWZpbmUgQURGX0FMTF9DQUNIRQkoQURGX0FMTF9QTFVTfEFERl9BTExfU0MzfEFERl9BTExfU0M0KQorLyogQWxsIEVBVEEgQnVzIE1hc3RlcmluZyBQcm9kdWN0cyAqLworI2RlZmluZSBBREZfQUxMX01BU1RFUgkoQURGXzIwMTJBfEFERl9BTExfQ0FDSEUpCisvKiBBbGwgRUFUQSBBZGFwdGVyIFByb2R1Y3RzICovCisjZGVmaW5lIEFERl9BTExfRUFUQQkoQURGXzIwMDF8QURGX0FMTF9NQVNURVIpCisjZGVmaW5lIEFERl9BTEwJCUFERl9BTExfRUFUQQorCisvKiBBcHBsaWNhdGlvbiAtIHNpZ1dPUkQgZHNBcHBsaWNhdGlvbjsgICAgICAgICBGTEFHIEJJVFMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBBUFBfRFBUTUdSICAgICAgMHgwMDAxICAvKiBEUFQgU3RvcmFnZSBNYW5hZ2VyICovCisjZGVmaW5lIEFQUF9FTkdJTkUgICAgICAweDAwMDIgIC8qIERQVCBFbmdpbmUgKi8KKyNkZWZpbmUgQVBQX1NZVE9TICAgICAgIDB4MDAwNCAgLyogU3l0cm9uIFN5dG9zIFBsdXMgKi8KKyNkZWZpbmUgQVBQX0NIRVlFTk5FICAgIDB4MDAwOCAgLyogQ2hleWVubmUgQVJDU2VydmUgKyBBUkNTb2xvICovCisjZGVmaW5lIEFQUF9NU0NERVggICAgICAweDAwMTAgIC8qIE1pY3Jvc29mdCBDRC1ST00gZXh0ZW5zaW9ucyAqLworI2RlZmluZSBBUFBfTk9WQUJBQ0sgICAgMHgwMDIwICAvKiBOb3ZhU3RvciBOb3ZhYmFjayAqLworI2RlZmluZSBBUFBfQUlNICAgICAgICAgMHgwMDQwICAvKiBBcmNoaXZlIEluZm9ybWF0aW9uIE1hbmFnZXIgKi8KKworLyogUmVxdWlyZW1lbnRzIC0gc2lnQllURSBkc1JlcXVpcmVtZW50czsgICAgICAgICBGTEFHIEJJVFMgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICovCisjZGVmaW5lIFJFUV9TTUFSVFJPTSAgICAweDAxICAgIC8qIFJlcXVpcmVzIFNtYXJ0Uk9NIHRvIGJlIHByZXNlbnQgICAgICAqLworI2RlZmluZSBSRVFfRFBURERMICAgICAgMHgwMiAgICAvKiBSZXF1aXJlcyBEUFREREwuU1lTIHRvIGJlIGxvYWRlZCAgICAgKi8KKyNkZWZpbmUgUkVRX0hCQV9EUklWRVIgIDB4MDQgICAgLyogUmVxdWlyZXMgYW4gSEJBIGRyaXZlciB0byBiZSBsb2FkZWQgICovCisjZGVmaW5lIFJFUV9BU1BJX1RSQU4gICAweDA4ICAgIC8qIFJlcXVpcmVzIGFuIEFTUEkgVHJhbnNwb3J0IE1vZHVsZXMgICAqLworI2RlZmluZSBSRVFfRU5HSU5FICAgICAgMHgxMCAgICAvKiBSZXF1aXJlcyBhIERQVCBFbmdpbmUgdG8gYmUgbG9hZGVkICAgKi8KKyNkZWZpbmUgUkVRX0NPTU1fRU5HICAgIDB4MjAgICAgLyogUmVxdWlyZXMgYSBEUFQgQ29tbXVuaWNhdGlvbnMgRW5naW5lICovCisKKy8qCisgKiBZb3UgbWF5IGFkanVzdCBkc0Rlc2NyaXB0aW9uX3NpemUgd2l0aCBhbiBvdmVycmlkZSB0byBhIHZhbHVlIGxlc3MgdGhhbgorICogNTAgc28gdGhhdCB0aGUgc3RydWN0dXJlIGFsbG9jYXRlcyBsZXNzIHJlYWwgc3BhY2UuCisgKi8KKyNpZiAoIWRlZmluZWQoZHNEZXNjcmlwdGlvbl9zaXplKSkKKyMgZGVmaW5lIGRzRGVzY3JpcHRpb25fc2l6ZSA1MAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGRwdF9zaWcgeworICAgIGNoYXIgICAgZHNTaWduYXR1cmVbNl07ICAgICAgLyogQUxXQVlTICJkUHRTaUciICovCisgICAgc2lnQllURSBkc1NpZ1ZlcnNpb247ICAgICAgICAvKiBzaWduYXR1cmUgdmVyc2lvbiAoY3VycmVudGx5IDEpICovCisgICAgc2lnQllURSBkc1Byb2Nlc3NvckZhbWlseTsgICAvKiB3aGF0IHR5cGUgb2YgcHJvY2Vzc29yICovCisgICAgc2lnQllURSBkc1Byb2Nlc3NvcjsgICAgICAgICAvKiBwcmVjaXNlIHByb2Nlc3NvciAqLworICAgIHNpZ0JZVEUgZHNGaWxldHlwZTsgICAgICAgICAgLyogdHlwZSBvZiBmaWxlICovCisgICAgc2lnQllURSBkc0ZpbGV0eXBlRmxhZ3M7ICAgICAvKiBmbGFncyB0byBzcGVjaWZ5IGxvYWQgdHlwZSwgZXRjLiAqLworICAgIHNpZ0JZVEUgZHNPRU07ICAgICAgICAgICAgICAgLyogT0VNIGZpbGUgd2FzIGNyZWF0ZWQgZm9yICovCisgICAgc2lnTE9ORyBkc09TOyAgICAgICAgICAgICAgICAvKiB3aGljaCBPcGVyYXRpbmcgc3lzdGVtcyAqLworICAgIHNpZ1dPUkQgZHNDYXBhYmlsaXRpZXM7ICAgICAgLyogUkFJRCBsZXZlbHMsIGV0Yy4gKi8KKyAgICBzaWdXT1JEIGRzRGV2aWNlU3VwcDsgICAgICAgIC8qIFR5cGVzIG9mIFNDU0kgZGV2aWNlcyBzdXBwb3J0ZWQgKi8KKyAgICBzaWdXT1JEIGRzQWRhcHRlclN1cHA7ICAgICAgIC8qIERQVCBhZGFwdGVyIGZhbWlsaWVzIHN1cHBvcnRlZCAqLworICAgIHNpZ1dPUkQgZHNBcHBsaWNhdGlvbjsgICAgICAgLyogYXBwbGljYXRpb25zIGZpbGUgaXMgZm9yICovCisgICAgc2lnQllURSBkc1JlcXVpcmVtZW50czsgICAgICAvKiBPdGhlciBkcml2ZXIgZGVwZW5kZW5jaWVzICovCisgICAgc2lnQllURSBkc1ZlcnNpb247ICAgICAgICAgICAvKiAxICovCisgICAgc2lnQllURSBkc1JldmlzaW9uOyAgICAgICAgICAvKiAnSicgKi8KKyAgICBzaWdCWVRFIGRzU3ViUmV2aXNpb247ICAgICAgIC8qICc5JyAgICcgJyBpZiBOL0EgKi8KKyAgICBzaWdCWVRFIGRzTW9udGg7ICAgICAgICAgICAgIC8qIGNyZWF0aW9uIG1vbnRoICovCisgICAgc2lnQllURSBkc0RheTsgICAgICAgICAgICAgICAvKiBjcmVhdGlvbiBkYXkgKi8KKyAgICBzaWdCWVRFIGRzWWVhcjsgICAgICAgICAgICAgIC8qIGNyZWF0aW9uIHllYXIgc2luY2UgMTk4MCAoMTk5Mz0xMykgKi8KKyAgICAvKiBkZXNjcmlwdGlvbiAoTlVMTCB0ZXJtaW5hdGVkKSAqLworICAgIGNoYXIgIGRzRGVzY3JpcHRpb25bZHNEZXNjcmlwdGlvbl9zaXplXTsKK30gZHB0X3NpZ19TOworLyogMzIgYnl0ZXMgbWluaW11bSAtIHdpdGggbm8gZGVzY3JpcHRpb24uICBQdXQgTlVMTCBhdCBkZXNjcmlwdGlvblswXSAqLworLyogODEgYnl0ZXMgbWF4aW11bSAtIHdpdGggNDkgY2hhcmFjdGVyIGRlc2NyaXB0aW9uIHBsdXMgTlVMTC4gKi8KKworLyogVGhpcyBsaW5lIGFkZGVkIGF0IFJveWNyb2Z0J3MgcmVxdWVzdCAqLworLyogTWljcm9zb2Z0J3MgTlQgY29tcGlsZXIgZ2V0cyBjb25mdXNlZCBpZiB5b3UgZG8gYSBwYWNrIGFuZCBkb24ndCAqLworLyogcmVzdG9yZSBpdC4gKi8KKworI2lmbmRlZiBOT19VTlBBQ0sKKyNpZiBkZWZpbmVkIChfRFBUX0FJWCkKKyNwcmFnbWEgb3B0aW9ucyBhbGlnbj1yZXNldAorI2VsaWYgZGVmaW5lZCAoVU5QQUNLX0ZPVVIpCisjcHJhZ21hIHBhY2soNCkKKyNlbHNlCisjcHJhZ21hIHBhY2soKQorI2VuZGlmICAvKiBhaXggKi8KKyNlbmRpZgorLyogRm9yIHRoZSBNYWNpbnRvc2ggKi8KKyNpZiBTVFJVQ1RBTElHTk1FTlRTVVBQT1JURUQKKyNwcmFnbWEgb3B0aW9ucyBhbGlnbj1yZXNldAorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RwdC9vc2RfZGVmcy5oIGIvZHJpdmVycy9zY3NpL2RwdC9vc2RfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlM2FlNTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZHB0L29zZF9kZWZzLmgKQEAgLTAsMCArMSw3OSBAQAorLyoJQlNESSBvc2RfZGVmcy5oLHYgMS40IDE5OTgvMDYvMDMgMTk6MTQ6NTgga2FyZWxzIEV4cAkqLworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk5IERpc3RyaWJ1dGVkIFByb2Nlc3NpbmcgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBmb3JtLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyAqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBgYXMgaXMnIGJ5IERpc3RyaWJ1dGVkIFByb2Nlc3NpbmcgVGVjaG5vbG9neSBhbmQKKyAqIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZQorICogaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UsCisgKiBhcmUgZGlzY2xhaW1lZC4gSW4gbm8gZXZlbnQgc2hhbGwgRGlzdHJpYnV0ZWQgUHJvY2Vzc2luZyBUZWNobm9sb2d5IGJlCisgKiBsaWFibGUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnkgb3IKKyAqIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mCisgKiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MKKyAqIGludGVycnVwdGlvbnMpIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbgorICogY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkKKyAqIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIGRyaXZlciBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkCisgKiBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisgKgorICovCisKKyNpZm5kZWYJCV9PU0RfREVGU19ICisjZGVmaW5lCQlfT1NEX0RFRlNfSAorCisvKkZpbGUgLSBPU0RfREVGUy5ICisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqRGVzY3JpcHRpb246CisgKgorICoJVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBPUyBkZXBlbmRlbnQgZGVmaW5lcy4gIFRoaXMgZmlsZSBpcyBpbmNsdWRlZAorICppbiBvc2RfdXRpbC5oIGFuZCBwcm92aWRlcyB0aGUgT1Mgc3BlY2lmaWMgZGVmaW5lcyBmb3IgdGhhdCBmaWxlLgorICoKKyAqQ29weXJpZ2h0IERpc3RyaWJ1dGVkIFByb2Nlc3NpbmcgVGVjaG5vbG9neSwgQ29ycC4KKyAqCSAgMTQwIENhbmRhY2UgRHIuCisgKgkgIE1haXRsYW5kLCBGbC4JMzI3NTEgICBVU0EKKyAqCSAgUGhvbmU6ICg0MDcpIDgzMC01NTIyICBGYXg6ICg0MDcpIDI2MC01MzY2CisgKgkgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKkF1dGhvcjoJRG91ZyBBbmRlcnNvbgorICpEYXRlOgkJMS8zMS85NAorICoKKyAqRWRpdG9yczoKKyAqCisgKlJlbWFya3M6CisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKkRlZmluaXRpb25zIC0gRGVmaW5lcyAmIENvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgIC8qIERlZmluZSB0aGUgb3BlcmF0aW5nIHN5c3RlbSAqLworI2lmIChkZWZpbmVkKF9fbGludXhfXykpCisjIGRlZmluZSBfRFBUX0xJTlVYCisjZWxpZiAoZGVmaW5lZChfX2JzZGlfXykpCisjIGRlZmluZSBfRFBUX0JTREkKKyNlbGlmIChkZWZpbmVkKF9fRnJlZUJTRF9fKSkKKyMgZGVmaW5lIF9EUFRfRlJFRV9CU0QKKyNlbHNlCisjIGRlZmluZSBfRFBUX1NDTworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChaSUxfQ1VSU0VTKQorI2RlZmluZQkJX0RQVF9DVVJTRVMKKyNlbHNlCisjZGVmaW5lICAgICAgICAgX0RQVF9NT1RJRgorI2VuZGlmCisKKyAgLyogUmVkZWZpbmUgJ2ZhcicgdG8gbm90aGluZyAtIG5vIGZhciBwb2ludGVyIHR5cGUgcmVxdWlyZWQgaW4gVU5JWCAqLworI2RlZmluZQkJZmFyCisKKyAgLyogRGVmaW5lIHRoZSBtdXR1YWxseSBleGNsdXNpdmUgc2VtYXBob3JlIHR5cGUgKi8KKyNkZWZpbmUJCVNFTUFQSE9SRV9UCXVuc2lnbmVkIGludCAqCisgIC8qIERlZmluZSBhIGhhbmRsZSB0byBhIERMTCAqLworI2RlZmluZQkJRExMX0hBTkRMRV9UCXVuc2lnbmVkIGludCAqCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RwdC9vc2RfdXRpbC5oIGIvZHJpdmVycy9zY3NpL2RwdC9vc2RfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNTZjMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZHB0L29zZF91dGlsLmgKQEAgLTAsMCArMSwzNTggQEAKKy8qCUJTREkgb3NkX3V0aWwuaCx2IDEuOCAxOTk4LzA2LzAzIDE5OjE0OjU4IGthcmVscyBFeHAJKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk5IERpc3RyaWJ1dGVkIFByb2Nlc3NpbmcgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBmb3JtLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyAqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBgYXMgaXMnIGJ5IERpc3RyaWJ1dGVkIFByb2Nlc3NpbmcgVGVjaG5vbG9neSBhbmQKKyAqIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZQorICogaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UsCisgKiBhcmUgZGlzY2xhaW1lZC4gSW4gbm8gZXZlbnQgc2hhbGwgRGlzdHJpYnV0ZWQgUHJvY2Vzc2luZyBUZWNobm9sb2d5IGJlCisgKiBsaWFibGUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnkgb3IKKyAqIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mCisgKiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MKKyAqIGludGVycnVwdGlvbnMpIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbgorICogY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkKKyAqIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIGRyaXZlciBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkCisgKiBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisgKgorICovCisKKyNpZm5kZWYgICAgICAgICBfX09TRF9VVElMX0gKKyNkZWZpbmUgICAgICAgICBfX09TRF9VVElMX0gKKworLypGaWxlIC0gT1NEX1VUSUwuSAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKkRlc2NyaXB0aW9uOgorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluZXMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMgdGhhdCBhcmUKKyAqb3BlcmF0aW5nIHN5c3RlbSBkZXBlbmRlbnQuICBUaGUgcmVzb3VyY2VzIGRlZmluZWQgaW4gdGhpcyBmaWxlCisgKmFyZSBub3Qgc3BlY2lmaWMgdG8gYW55IHBhcnRpY3VsYXIgYXBwbGljYXRpb24uCisgKgorICpDb3B5cmlnaHQgRGlzdHJpYnV0ZWQgUHJvY2Vzc2luZyBUZWNobm9sb2d5LCBDb3JwLgorICogICAgICAgIDE0MCBDYW5kYWNlIERyLgorICogICAgICAgIE1haXRsYW5kLCBGbC4gMzI3NTEgICBVU0EKKyAqICAgICAgICBQaG9uZTogKDQwNykgODMwLTU1MjIgIEZheDogKDQwNykgMjYwLTUzNjYKKyAqICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICpBdXRob3I6ICAgICAgIERvdWcgQW5kZXJzb24KKyAqRGF0ZTogICAgICAgICAxLzcvOTQKKyAqCisgKkVkaXRvcnM6CisgKgorICpSZW1hcmtzOgorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLypEZWZpbml0aW9ucyAtIERlZmluZXMgJiBDb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogT3BlcmF0aW5nIHN5c3RlbSBzZWxlY3Rpb25zOiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiNkZWZpbmUgICAgICAgICAgICAgICBfRFBUX01TRE9TICAgICAgKi8KKy8qI2RlZmluZSAgICAgICAgICAgICAgIF9EUFRfV0lOXzNYICAgICAqLworLyojZGVmaW5lICAgICAgICAgICAgICAgX0RQVF9XSU5fNFggICAgICovCisvKiNkZWZpbmUgICAgICAgICAgICAgICBfRFBUX1dJTl9OVCAgICAgKi8KKy8qI2RlZmluZSAgICAgICAgICAgICAgIF9EUFRfTkVUV0FSRSAgICAqLworLyojZGVmaW5lICAgICAgICAgICAgICAgX0RQVF9PUzIgICAgICAgICovCisvKiNkZWZpbmUgICAgICAgICAgICAgICBfRFBUX1NDTyAgICAgICAgKi8KKy8qI2RlZmluZSAgICAgICAgICAgICAgIF9EUFRfVU5JWFdBUkUgICAqLworLyojZGVmaW5lICAgICAgICAgICAgICAgX0RQVF9TT0xBUklTICAgICovCisvKiNkZWZpbmUgICAgICAgICAgICAgICBfRFBUX05FWFRTVEVQICAgKi8KKy8qI2RlZmluZSAgICAgICAgICAgICAgIF9EUFRfQkFOWUFOICAgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBJbmNsdWRlIHRoZSBPUyBzcGVjaWZpYyBkZWZpbmVzICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qI2RlZmluZSAgICAgICBPU19TRUxFQ1RJT04gICAgRnJvbSBBYm92ZSBMaXN0ICovCisvKiNkZWZpbmUgICAgICAgU0VNQVBIT1JFX1QgICAgID8/PyAqLworLyojZGVmaW5lICAgICAgIERMTF9IQU5ETEVfVCAgICA/Pz8gKi8KKworI2lmIChkZWZpbmVkKEtFUk5FTCkgJiYgKGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19ic2RpX18pKSkKKyMgaW5jbHVkZSAgICAgICAgImkzODYvaXNhL2RwdF9vc2RfZGVmcy5oIgorI2Vsc2UKKyMgaW5jbHVkZSAgICAgICAgIm9zZF9kZWZzLmgiCisjZW5kaWYKKworI2lmbmRlZiBEUFRfVU5BTElHTkVECisgICAjZGVmaW5lICAgICAgRFBUX1VOQUxJR05FRAorI2VuZGlmCisKKyNpZm5kZWYgRFBUX0VYUE9SVAorICAgI2RlZmluZSAgICAgIERQVF9FWFBPUlQKKyNlbmRpZgorCisjaWZuZGVmIERQVF9JTVBPUlQKKyAgICNkZWZpbmUgICAgICBEUFRfSU1QT1JUCisjZW5kaWYKKworI2lmbmRlZiBEUFRfUlVOVElNRV9JTVBPUlQKKyAgICNkZWZpbmUgICAgICBEUFRfUlVOVElNRV9JTVBPUlQgIERQVF9JTVBPUlQKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogT1MgZGVwZW5kZW50IGRlZmluZXMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkIChfRFBUX01TRE9TKSB8fCBkZWZpbmVkIChfRFBUX1dJTl8zWCkKKyAgICNkZWZpbmUgICAgICBfRFBUXzE2X0JJVAorI2Vsc2UKKyAgICNkZWZpbmUgICAgICBfRFBUXzMyX0JJVAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfRFBUX1NDTykgfHwgZGVmaW5lZCAoX0RQVF9VTklYV0FSRSkgfHwgZGVmaW5lZCAoX0RQVF9TT0xBUklTKSB8fCBkZWZpbmVkIChfRFBUX0FJWCkgfHwgZGVmaW5lZCAoU05JX01JUFMpIHx8IGRlZmluZWQgKF9EUFRfQlNESSkgfHwgZGVmaW5lZCAoX0RQVF9GUkVFX0JTRCkgfHwgZGVmaW5lZChfRFBUX0xJTlVYKQorICAgI2RlZmluZSAgICAgIF9EUFRfVU5JWAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfRFBUX1dJTl8zeCkgfHwgZGVmaW5lZCAoX0RQVF9XSU5fNFgpIHx8IGRlZmluZWQgKF9EUFRfV0lOX05UKSBcCisJICAgIHx8IGRlZmluZWQgKF9EUFRfT1MyKQorICAgI2RlZmluZSAgICAgIF9EUFRfRExMX1NVUFBPUlQKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9EUFRfTVNET1MpICYmICFkZWZpbmVkIChfRFBUX1dJTl8zWCkgJiYgIWRlZmluZWQgKF9EUFRfTkVUV0FSRSkKKyAgICNkZWZpbmUgICAgICBfRFBUX1BSRUVNUFRJVkUKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9EUFRfTVNET1MpICYmICFkZWZpbmVkIChfRFBUX1dJTl8zWCkKKyAgICNkZWZpbmUgICAgICBfRFBUX01VTFRJX1RIUkVBREVECisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfRFBUX01TRE9TKQorICAgI2RlZmluZSAgICAgIF9EUFRfTVVMVElfVEFTS0lORworI2VuZGlmCisKKyAgLyogVGhlc2UgZXhpc3QgZm9yIHBsYXRmb3JtcyB0aGF0ICAgKi8KKyAgLyogY2h1bmsgd2hlbiBhY2Nlc3NpbmcgbWlzLWFsaWduZWQgKi8KKyAgLyogZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZiBkZWZpbmVkIChTTklfTUlQUykgfHwgZGVmaW5lZCAoX0RQVF9TT0xBUklTKQorICAgI2lmIGRlZmluZWQgKF9EUFRfQklHX0VORElBTikKKwkjaWYgIWRlZmluZWQgKF9EUFRfU1RSSUNUX0FMSUdOKQorICAgICAgICAgICAgI2RlZmluZSBfRFBUX1NUUklDVF9BTElHTgorCSNlbmRpZgorICAgI2VuZGlmCisjZW5kaWYKKworICAvKiBEZXRlcm1pbmUgaWYgaW4gQyBvciBDKysgbW9kZSAqLworI2lmZGVmICBfX2NwbHVzcGx1cworICAgI2RlZmluZSAgICAgIF9EUFRfQ1BQCisjZWxzZQorICAgI2RlZmluZSAgICAgIF9EUFRfQworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBVbmRlciBTb2xhcmlzIHRoZSBjb21waWxlciByZWZ1c2VzIHRvIGFjY2VwdCBjb2RlIGxpa2U6ICAgICAgICAgICAqLworLyogICB7IHsiRFBUIn0sIDAsIE5VTEwgLi4uLiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGFuZCBjb21wbGFpbnMgYWJvdXQgdGhlIHsiRFBUIn0gcGFydCBieSBzYXlpbmcgImNhbm5vdCB1c2UgeyB9ICAgICovCisvKiB0byBpbml0aWFsaXplIGNoYXIqIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJ5IGRlZmluaW5nIHRoZXNlIHVnbHkgbWFjcm9zIHdlIGNhbiBnZXQgYXJvdW5kIHRoaXMgYW5kIGFsc28gICAgICovCisvKiBub3QgaGF2ZSB0byBjb3B5IGFuZCAjaWZkZWYgbGFyZ2Ugc2VjdGlvbnMgb2YgY29kZS4gIEkga25vdyB0aGF0ICAqLworLyogdGhlc2UgbWFjcm9zIGFyZSAqcmVhbGx5KiB1Z2x5LCBidXQgdGhleSBzaG91bGQgaGVscCByZWR1Y2UgICAgICAgKi8KKy8qIG1haW50ZW5hbmNlIGluIHRoZSBsb25nIHJ1bi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAhZGVmaW5lZCAoRFBUU1FPKQorICAgI2lmIGRlZmluZWQgKF9EUFRfU09MQVJJUykKKyAgICAgICNkZWZpbmUgRFBUU1FPCisgICAgICAjZGVmaW5lIERQVFNRQworICAgI2Vsc2UKKyAgICAgICNkZWZpbmUgRFBUU1FPIHsKKyAgICAgICNkZWZpbmUgRFBUU1FDIH0KKyAgICNlbmRpZiAgLyogc29sYXJpcyAqLworI2VuZGlmICAvKiBEUFRTUU8gKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIE9TIGRlcGVuZGVudCB0eXBlZGVmcyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkIChfRFBUX01TRE9TKSB8fCBkZWZpbmVkIChfRFBUX1NDTykKKyAgICNkZWZpbmUgQllURSB1bnNpZ25lZCBjaGFyCisgICAjZGVmaW5lIFdPUkQgdW5zaWduZWQgc2hvcnQKKyNlbmRpZgorCisjaWZuZGVmIF9EUFRfVFlQRURFRlMKKyAgICNkZWZpbmUgX0RQVF9UWVBFREVGUworICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdUNIQVI7CisgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1U0hPUlQ7CisgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICB1SU5UOworICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgdUxPTkc7CisKKyAgIHR5cGVkZWYgdW5pb24geworCSB1Q0hBUiAgICAgICAgdThbNF07CisJIHVTSE9SVCAgICAgICB1MTZbMl07CisJIHVMT05HICAgICAgICB1MzI7CisgICB9IGFjY2Vzc19VOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoTlVMTCkKKyAgICNkZWZpbmUgICAgICBOVUxMICAgIDAKKyNlbmRpZgorCisKKy8qUHJvdG90eXBlcyAtIGZ1bmN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKKyAgIGV4dGVybiAiQyIgeyAgICAgICAgIC8qIERlY2xhcmUgYWxsIHRoZXNlIGZ1bmN0aW9ucyBhcyAiQyIgZnVuY3Rpb25zICovCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEJ5dGUgcmV2ZXJzYWwgZnVuY3Rpb25zICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgIC8qIFJldmVyc2VzIHRoZSBieXRlIG9yZGVyaW5nIG9mIGEgMiBieXRlIHZhcmlhYmxlICovCisjaWYgKCFkZWZpbmVkKG9zZFN3YXAyKSkKKyB1U0hPUlQgICAgICAgb3NkU3dhcDIoRFBUX1VOQUxJR05FRCB1U0hPUlQgKik7CisjZW5kaWYgIC8vICFvc2RTd2FwMgorCisgIC8qIFJldmVyc2VzIHRoZSBieXRlIG9yZGVyaW5nIG9mIGEgNCBieXRlIHZhcmlhYmxlIGFuZCBzaGlmdHMgbGVmdCA4IGJpdHMgKi8KKyNpZiAoIWRlZmluZWQob3NkU3dhcDMpKQorIHVMT05HICAgICAgICBvc2RTd2FwMyhEUFRfVU5BTElHTkVEIHVMT05HICopOworI2VuZGlmICAvLyAhb3NkU3dhcDMKKworCisjaWZkZWYgIF9EUFRfTkVUV0FSRQorICAgI2luY2x1ZGUgIm5vdnBhc3MuaCIgLyogRm9yIERQVF9Cc3dhcGwoKSBwcm90b3R5cGUgKi8KKwkvKiBJbmxpbmUgdGhlIGJ5dGUgc3dhcCAqLworICAgI2lmZGVmIF9fY3BsdXNwbHVzCisJIGlubGluZSB1TE9ORyBvc2RTd2FwNCh1TE9ORyAqaW5Mb25nKSB7CisJIHJldHVybiAqaW5Mb25nID0gRFBUX0Jzd2FwbCgqaW5Mb25nKTsKKwkgfQorICAgI2Vsc2UKKwkgI2RlZmluZSBvc2RTd2FwNChpbkxvbmcpICAgICAgIERQVF9Cc3dhcGwoaW5Mb25nKQorICAgI2VuZGlmICAvLyBjcGx1c3BsdXMKKyNlbHNlCisJLyogUmV2ZXJzZXMgdGhlIGJ5dGUgb3JkZXJpbmcgb2YgYSA0IGJ5dGUgdmFyaWFibGUgKi8KKyMgaWYgKCFkZWZpbmVkKG9zZFN3YXA0KSkKKyAgIHVMT05HICAgICAgICBvc2RTd2FwNChEUFRfVU5BTElHTkVEIHVMT05HICopOworIyBlbmRpZiAgLy8gIW9zZFN3YXA0CisKKyAgLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgQUxXQVlTIHN3YXAgcmVnYXJkbGVzcyBvZiB0aGUgKgorICAgKiBwcmVzZW5jZSBvZiBEUFRfQklHX0VORElBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICB1U0hPUlQgICAgICAgdHJ1ZVN3YXAyKERQVF9VTkFMSUdORUQgdVNIT1JUICopOworICAgdUxPTkcgICAgICAgIHRydWVTd2FwNChEUFRfVU5BTElHTkVEIHVMT05HICopOworCisjZW5kaWYgIC8vIG5ldHdhcmUKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBOZXR3b3JrIG9yZGVyIHN3YXAgZnVuY3Rpb25zICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGVzZSBmdW5jdGlvbnMvbWFjcm9zIHdpbGwgYmUgdXNlZCAqCisgKiBieSB0aGUgc3RydWN0dXJlIGluc2VydCgpL2V4dHJhY3QoKSAqCisgKiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKgorICogV2Ugd2lsbCBlbmNsb3NlIGFsbCBzdHJ1Y3R1cmUgICAgICAgKgorICogcG9ydGFiaWxpdHkgbW9kaWZpY2F0aW9ucyBpbnNpZGUgICAgKgorICogI2lmZGVmcy4gIFdoZW4gd2UgYXJlIHJlYWR5LCB3ZSAgICAgKgorICogd2lsbCAjZGVmaW5lIERQVF9QT1JUQUJMRSB0byBiZWdpbiAgKgorICogdXNpbmcgdGhlIG1vZGlmaWNhdGlvbnMuICAgICAgICAgICAgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3VMT05HCW5ldFN3YXA0KHVMT05HIHZhbCk7CisKKyNpZiBkZWZpbmVkIChfRFBUX0JJR19FTkRJQU4pCisKKy8vIGZvciBiaWctZW5kaWFuIHdlIG5lZWQgdG8gc3dhcAorCisjaWZuZGVmIE5FVF9TV0FQXzIKKyNkZWZpbmUgTkVUX1NXQVBfMih4KSAoKCh4KSA+PiA4KSB8ICgoeCkgPDwgOCkpCisjZW5kaWYgIC8vIE5FVF9TV0FQXzIKKworI2lmbmRlZiBORVRfU1dBUF80CisjZGVmaW5lIE5FVF9TV0FQXzQoeCkgbmV0U3dhcDQoKHgpKQorI2VuZGlmICAvLyBORVRfU1dBUF80CisKKyNlbHNlCisKKy8vIGZvciBsaXR0bGUtZW5kaWFuIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcKKworI2lmbmRlZiBORVRfU1dBUF8yCisjZGVmaW5lIE5FVF9TV0FQXzIoeCkgKHgpCisjZW5kaWYgIC8vIE5FVF9TV0FQXzIKKworI2lmbmRlZiBORVRfU1dBUF80CisjZGVmaW5lIE5FVF9TV0FQXzQoeCkgKHgpCisjZW5kaWYgIC8vIE5FVF9TV0FQXzQKKworI2VuZGlmICAvLyBiaWcgZW5kaWFuCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBSdW4tdGltZSBsb2FkYWJsZSBtb2R1bGUgZnVuY3Rpb25zICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgLyogTG9hZHMgdGhlIHNwZWNpZmllZCBydW4tdGltZSBsb2FkYWJsZSBETEwgKi8KK0RMTF9IQU5ETEVfVCAgICBvc2RMb2FkTW9kdWxlKHVDSEFSICopOworICAvKiBVbmxvYWRzIHRoZSBzcGVjaWZpZWQgcnVuLXRpbWUgbG9hZGFibGUgRExMICovCit1U0hPUlQgICAgICAgICAgb3NkVW5sb2FkTW9kdWxlKERMTF9IQU5ETEVfVCk7CisgIC8qIFJldHVybnMgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gaW5zaWRlIGEgcnVuLXRpbWUgbG9hZGFibGUgRExMICovCit2b2lkICogICAgICAgICAgb3NkR2V0Rm5BZGRyKERMTF9IQU5ETEVfVCx1Q0hBUiAqKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIE11dHVhbGx5IGV4Y2x1c2l2ZSBzZW1hcGhvcmUgZnVuY3Rpb25zICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgIC8qIENyZWF0ZSBhIG5hbWVkIHNlbWFwaG9yZSAqLworU0VNQVBIT1JFX1QgICAgIG9zZENyZWF0ZU5hbWVkU2VtYXBob3JlKGNoYXIgKik7CisgIC8qIENyZWF0ZSBhIG11dHVhbGx5IGV4bHVzaXZlIHNlbWFwaG9yZSAqLworU0VNQVBIT1JFX1QgICAgIG9zZENyZWF0ZVNlbWFwaG9yZSh2b2lkKTsKKwkvKiBjcmVhdGUgYW4gZXZlbnQgc2VtYXBob3JlICovCitTRU1BUEhPUkVfVCAgICAgICAgICAgICAgb3NkQ3JlYXRlRXZlbnRTZW1hcGhvcmUodm9pZCk7CisJLyogY3JlYXRlIGEgbmFtZWQgZXZlbnQgc2VtYXBob3JlICovCitTRU1BUEhPUkVfVCAgICAgICAgICAgICBvc2RDcmVhdGVOYW1lZEV2ZW50U2VtYXBob3JlKGNoYXIgKik7CisKKyAgLyogRGVzdHJveSB0aGUgc3BlY2lmaWVkIG11dHVhbGx5IGV4Y2x1c2l2ZSBzZW1hcGhvcmUgb2JqZWN0ICovCit1U0hPUlQgICAgICAgICAgb3NkRGVzdHJveVNlbWFwaG9yZShTRU1BUEhPUkVfVCk7CisgIC8qIFJlcXVlc3QgYWNjZXNzIHRvIHRoZSBzcGVjaWZpZWQgbXV0dWFsbHkgZXhjbHVzaXZlIHNlbWFwaG9yZSAqLwordUxPTkcgICAgICAgICAgIG9zZFJlcXVlc3RTZW1hcGhvcmUoU0VNQVBIT1JFX1QsdUxPTkcpOworICAvKiBSZWxlYXNlIGFjY2VzcyB0byB0aGUgc3BlY2lmaWVkIG11dHVhbGx5IGV4Y2x1c2l2ZSBzZW1hcGhvcmUgKi8KK3VTSE9SVCAgICAgICAgICBvc2RSZWxlYXNlU2VtYXBob3JlKFNFTUFQSE9SRV9UKTsKKwkvKiB3YWl0IGZvciBhIGV2ZW50IHRvIGhhcHBlbiAqLwordUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3NkV2FpdEZvckV2ZW50U2VtYXBob3JlKFNFTUFQSE9SRV9ULCB1TE9ORyk7CisJLyogc2lnbmFsIGFuIGV2ZW50ICovCit1TE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc2RTaWduYWxFdmVudFNlbWFwaG9yZShTRU1BUEhPUkVfVCk7CisJLyogcmVzZXQgdGhlIGV2ZW50ICovCit1TE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc2RSZXNldEV2ZW50U2VtYXBob3JlKFNFTUFQSE9SRV9UKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLSAqLworLyogVGhyZWFkIGZ1bmN0aW9ucyAqLworLyotLS0tLS0tLS0tLS0tLS0tLSAqLworCisgIC8qIFJlbGVhc2VzIGNvbnRyb2wgdG8gdGhlIHRhc2sgc3dpdGNoZXIgaW4gbm9uLXByZWVtcHRpdmUgKi8KKyAgLyogbXVsdGl0YXNraW5nIG9wZXJhdGluZyBzeXN0ZW1zLiAqLwordm9pZCAgICAgICAgICAgIG9zZFN3aXRjaFRocmVhZHModm9pZCk7CisKKyAgLyogU3RhcnRzIGEgdGhyZWFkIGZ1bmN0aW9uICovCit1TE9ORyAgIG9zZFN0YXJ0VGhyZWFkKHZvaWQgKix2b2lkICopOworCisvKiB3aGF0IGlzIG15IHRocmVhZCBpZCAqLwordUxPTkcgb3NkR2V0VGhyZWFkSUQodm9pZCk7CisKKy8qIHdha2VzIHVwIHRoZSBzcGVjaWZlZCB0aHJlYWQgKi8KK3ZvaWQgb3NkV2FrZVRocmVhZCh1TE9ORyk7CisKKy8qIG9zZCBzbGVlcCBmb3IgeCBtaWxpc2Vjb25kcyAqLwordm9pZCBvc2RTbGVlcCh1TE9ORyk7CisKKyNkZWZpbmUgRFBUX1RIUkVBRF9QUklPUklUWV9MT1dFU1QgMHgwMAorI2RlZmluZSBEUFRfVEhSRUFEX1BSSU9SSVRZX05PUk1BTCAweDAxCisjZGVmaW5lIERQVF9USFJFQURfUFJJT1JJVFlfSElHSEVTVCAweDAyCisKK3VDSEFSIG9zZFNldFRocmVhZFByaW9yaXR5KHVMT05HIHRpZCwgdUNIQVIgcHJpb3JpdHkpOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgIH0gICAgLyogZW5kIHRoZSB4dGVybiAiQyIgZGVjbGFyYXRpb24gKi8KKyNlbmRpZgorCisjZW5kaWYgIC8qIG9zZF91dGlsX2ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kcHQvc3lzX2luZm8uaCBiL2RyaXZlcnMvc2NzaS9kcHQvc3lzX2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjNiNzBjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2RwdC9zeXNfaW5mby5oCkBAIC0wLDAgKzEsNDE3IEBACisvKglCU0RJIHN5c19pbmZvLmgsdiAxLjYgMTk5OC8wNi8wMyAxOToxNDo1OSBrYXJlbHMgRXhwCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OSBEaXN0cmlidXRlZCBQcm9jZXNzaW5nIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgZm9ybSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisgKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYGFzIGlzJyBieSBEaXN0cmlidXRlZCBQcm9jZXNzaW5nIFRlY2hub2xvZ3kgYW5kCisgKiBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUKKyAqIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLAorICogYXJlIGRpc2NsYWltZWQuIEluIG5vIGV2ZW50IHNoYWxsIERpc3RyaWJ1dGVkIFByb2Nlc3NpbmcgVGVjaG5vbG9neSBiZQorICogbGlhYmxlIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5IG9yCisgKiBjb25zZXF1ZW50aWFsIGRhbWFnZXMgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZgorICogc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzCisgKiBpbnRlcnJ1cHRpb25zKSBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4KKyAqIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpCisgKiBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBkcml2ZXIgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZAorICogb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorICoKKyAqLworCisjaWZuZGVmICAgICAgICAgX19TWVNfSU5GT19ICisjZGVmaW5lICAgICAgICAgX19TWVNfSU5GT19ICisKKy8qRmlsZSAtIFNZU19JTkZPLkgKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICpEZXNjcmlwdGlvbjoKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZm9yIHRoZSBPUyBkZXBlbmRlbnQKKyAqbGF5ZXIgc3lzdGVtIGluZm9ybWF0aW9uIGJ1ZmZlcnMuCisgKgorICpDb3B5cmlnaHQgRGlzdHJpYnV0ZWQgUHJvY2Vzc2luZyBUZWNobm9sb2d5LCBDb3JwLgorICogICAgICAgIDE0MCBDYW5kYWNlIERyLgorICogICAgICAgIE1haXRsYW5kLCBGbC4gMzI3NTEgICBVU0EKKyAqICAgICAgICBQaG9uZTogKDQwNykgODMwLTU1MjIgIEZheDogKDQwNykgMjYwLTUzNjYKKyAqICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICpBdXRob3I6ICAgICAgIERvbiBLZW1wZXIKKyAqRGF0ZTogICAgICAgICA1LzEwLzk0CisgKgorICpFZGl0b3JzOgorICoKKyAqUmVtYXJrczoKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qSW5jbHVkZSBGaWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICAgICAgICAib3NkX3V0aWwuaCIKKworI2lmbmRlZiBOT19QQUNLCisjaWYgZGVmaW5lZCAoX0RQVF9BSVgpCisjcHJhZ21hIG9wdGlvbnMgYWxpZ249cGFja2VkCisjZWxzZQorI3ByYWdtYSBwYWNrKDEpCisjZW5kaWYgIC8qIGFpeCAqLworI2VuZGlmICAvLyBubyB1bnBhY2sKKworCisvKnN0cnVjdCAtIGRyaXZlUGFyYW1fUyAtIHN0YXJ0CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqRGVzY3JpcHRpb246CisgKgorICogICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBkcml2ZSBwYXJhbWV0ZXJzIHNlZW4gZHVyaW5nCisgKmJvb3RpbmcuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCisgICBzdHJ1Y3QgZHJpdmVQYXJhbV9TIHsKKyNlbHNlCisgICB0eXBlZGVmIHN0cnVjdCAgeworI2VuZGlmCisKKyAgIHVTSE9SVCAgICAgICBjeWxpbmRlcnM7ICAgICAgLyogVXB0byAxMDI0ICovCisgICB1Q0hBUiAgICAgICAgaGVhZHM7ICAgICAgICAgIC8qIFVwdG8gMjU1ICovCisgICB1Q0hBUiAgICAgICAgc2VjdG9yczsgICAgICAgIC8qIFVwdG8gNjMgKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworCisvLy0tLS0tLS0tLS0gUG9ydGFiaWxpdHkgQWRkaXRpb25zIC0tLS0tLS0tLS0tIGluIHNwX3NpbmZvLmNwcAorI2lmZGVmIERQVF9QT1JUQUJMRQorCXVTSE9SVAkJbmV0SW5zZXJ0KGRwdEJ1ZmZlcl9TICpidWZmZXIpOworCXVTSE9SVAkJbmV0RXh0cmFjdChkcHRCdWZmZXJfUyAqYnVmZmVyKTsKKyNlbmRpZiAvLyBEUFQgUE9SVEFCTEUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgfTsKKyNlbHNlCisgICB9IGRyaXZlUGFyYW1fUzsKKyNlbmRpZgorLypkcml2ZVBhcmFtX1MgLSBlbmQgKi8KKworCisvKnN0cnVjdCAtIHN5c0luZm9fUyAtIHN0YXJ0CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqRGVzY3JpcHRpb246CisgKgorICogICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBjb21tYW5kIHN5c3RlbSBpbmZvcm1hdGlvbiB0aGF0CisgKnNob3VsZCBiZSByZXR1cm5lZCBieSBldmVyeSBPUyBkZXBlbmRlbnQgbGF5ZXIuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKmZsYWdzIC0gYml0IGRlZmluaXRpb25zICovCisjZGVmaW5lIFNJX0NNT1NfVmFsaWQgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBTSV9OdW1Ecml2ZXNWYWxpZCAgICAgICAweDAwMDIKKyNkZWZpbmUgU0lfUHJvY2Vzc29yVmFsaWQgICAgICAgMHgwMDA0CisjZGVmaW5lIFNJX01lbW9yeVNpemVWYWxpZCAgICAgIDB4MDAwOAorI2RlZmluZSBTSV9Ecml2ZVBhcmFtc1ZhbGlkICAgICAweDAwMTAKKyNkZWZpbmUgU0lfU21hcnRST012ZXJWYWxpZCAgICAgMHgwMDIwCisjZGVmaW5lIFNJX09TdmVyc2lvblZhbGlkICAgICAgIDB4MDA0MAorI2RlZmluZSBTSV9PU3NwZWNpZmljVmFsaWQgICAgICAweDAwODAgIC8qIDEgaWYgT1Mgc3RydWN0dXJlIHJldHVybmVkICovCisjZGVmaW5lIFNJX0J1c1R5cGVWYWxpZCAgICAgICAgIDB4MDEwMAorCisjZGVmaW5lIFNJX0FMTF9WQUxJRCAgICAgICAgICAgIDB4MEZGRiAgLyogQWxsIFN0ZCBTeXNJbmZvIGlzIHZhbGlkICovCisjZGVmaW5lIFNJX05PX1NtYXJ0Uk9NICAgICAgICAgIDB4ODAwMAorCisvKmJ1c1R5cGUgLSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTSV9JU0FfQlVTICAgICAgMHgwMAorI2RlZmluZSBTSV9NQ0FfQlVTICAgICAgMHgwMQorI2RlZmluZSBTSV9FSVNBX0JVUyAgICAgMHgwMgorI2RlZmluZSBTSV9QQ0lfQlVTICAgICAgMHgwNAorCisjaWZkZWYgIF9fY3BsdXNwbHVzCisgICBzdHJ1Y3Qgc3lzSW5mb19TIHsKKyNlbHNlCisgICB0eXBlZGVmIHN0cnVjdCAgeworI2VuZGlmCisKKyAgIHVDSEFSICAgICAgICBkcml2ZTBDTU9TOyAgICAgICAgICAgICAvKiBDTU9TIERyaXZlIDAgVHlwZSAqLworICAgdUNIQVIgICAgICAgIGRyaXZlMUNNT1M7ICAgICAgICAgICAgIC8qIENNT1MgRHJpdmUgMSBUeXBlICovCisgICB1Q0hBUiAgICAgICAgbnVtRHJpdmVzOyAgICAgICAgICAgICAgLyogMDA0MDowMDc1IGNvbnRlbnRzICovCisgICB1Q0hBUiAgICAgICAgcHJvY2Vzc29yRmFtaWx5OyAgICAgICAgLyogU2FtZSBhcyBEUFRTSUcncyBkZWZpbml0aW9uICovCisgICB1Q0hBUiAgICAgICAgcHJvY2Vzc29yVHlwZTsgICAgICAgICAgLyogU2FtZSBhcyBEUFRTSUcncyBkZWZpbml0aW9uICovCisgICB1Q0hBUiAgICAgICAgc21hcnRST01NYWpvclZlcnNpb247CisgICB1Q0hBUiAgICAgICAgc21hcnRST01NaW5vclZlcnNpb247ICAgLyogU21hcnRST00gdmVyc2lvbiAqLworICAgdUNIQVIgICAgICAgIHNtYXJ0Uk9NUmV2aXNpb247CisgICB1U0hPUlQgICAgICAgZmxhZ3M7ICAgICAgICAgICAgICAgICAgLyogU2VlIGJpdCBkZWZpbml0aW9ucyBhYm92ZSAqLworICAgdVNIT1JUICAgICAgIGNvbnZlbnRpb25hbE1lbVNpemU7ICAgIC8qIGluIEtCICovCisgICB1TE9ORyAgICAgICAgZXh0ZW5kZWRNZW1TaXplOyAgICAgICAgLyogaW4gS0IgKi8KKyAgIHVMT05HICAgICAgICBvc1R5cGU7ICAgICAgICAgICAgICAgICAvKiBTYW1lIGFzIERQVFNJRydzIGRlZmluaXRpb24gKi8KKyAgIHVDSEFSICAgICAgICBvc01ham9yVmVyc2lvbjsKKyAgIHVDSEFSICAgICAgICBvc01pbm9yVmVyc2lvbjsgICAgICAgICAvKiBUaGUgT1MgdmVyc2lvbiAqLworICAgdUNIQVIgICAgICAgIG9zUmV2aXNpb247CisjaWZkZWYgX1NJTklYX0FERE9OCisgICB1Q0hBUiAgICAgICAgYnVzVHlwZTsgICAgICAgICAgICAgICAgLyogU2VlIGRlZmluaW5pdGlvbnMgYWJvdmUgKi8KKyAgIHVTSE9SVCAgICAgICBvc1N1YlJldmlzaW9uOworICAgdUNIQVIgICAgICAgIHBhZFsyXTsgICAgICAgICAgICAgICAgIC8qIEZvciBhbGlnbm1lbnQgKi8KKyNlbHNlCisgICB1Q0hBUiAgICAgICAgb3NTdWJSZXZpc2lvbjsKKyAgIHVDSEFSICAgICAgICBidXNUeXBlOyAgICAgICAgICAgICAgICAvKiBTZWUgZGVmaW5pbml0aW9ucyBhYm92ZSAqLworICAgdUNIQVIgICAgICAgIHBhZFszXTsgICAgICAgICAgICAgICAgIC8qIEZvciBhbGlnbm1lbnQgKi8KKyNlbmRpZgorICAgZHJpdmVQYXJhbV9TIGRyaXZlc1sxNl07ICAgICAgICAgICAgIC8qIFNtYXJ0Uk9NIExvZ2ljYWwgRHJpdmVzICovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKKworLy8tLS0tLS0tLS0tIFBvcnRhYmlsaXR5IEFkZGl0aW9ucyAtLS0tLS0tLS0tLSBpbiBzcF9zaW5mby5jcHAKKyNpZmRlZiBEUFRfUE9SVEFCTEUKKwl1U0hPUlQJCW5ldEluc2VydChkcHRCdWZmZXJfUyAqYnVmZmVyKTsKKwl1U0hPUlQJCW5ldEV4dHJhY3QoZHB0QnVmZmVyX1MgKmJ1ZmZlcik7CisjZW5kaWYgLy8gRFBUIFBPUlRBQkxFCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIH07CisjZWxzZQorICAgfSBzeXNJbmZvX1M7CisjZW5kaWYKKy8qc3lzSW5mb19TIC0gZW5kICovCisKKworLypzdHJ1Y3QgLSBET1NfSW5mb19TIC0gc3RhcnQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICpEZXNjcmlwdGlvbjoKKyAqCisgKiAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHN5c3RlbSBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhCisgKkRPUyB3b3Jrc3RhdGlvbi4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qZmxhZ3MgLSBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRElfRE9TX0hJR0ggICAgICAgICAgICAgMHgwMSAgICAvKiBET1MgaXMgbG9hZGVkIGhpZ2ggKi8KKyNkZWZpbmUgRElfRFBNSV9WQUxJRCAgICAgICAgICAgMHgwMiAgICAvKiBEUE1JIHZlcnNpb24gaXMgdmFsaWQgKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworICAgc3RydWN0IERPU19JbmZvX1MgeworI2Vsc2UKKyAgIHR5cGVkZWYgc3RydWN0IHsKKyNlbmRpZgorCisgICB1Q0hBUiAgICAgICAgZmxhZ3M7ICAgICAgICAgIC8qIFNlZSBiaXQgZGVmaW5pdGlvbnMgYWJvdmUgKi8KKyAgIHVTSE9SVCAgICAgICBkcml2ZXJMb2NhdGlvbjsgLyogU21hcnRST00gQklPUyBhZGRyZXNzICovCisgICB1U0hPUlQgICAgICAgRE9TX3ZlcnNpb247CisgICB1U0hPUlQgICAgICAgRFBNSV92ZXJzaW9uOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCisKKy8vLS0tLS0tLS0tLSBQb3J0YWJpbGl0eSBBZGRpdGlvbnMgLS0tLS0tLS0tLS0gaW4gc3Bfc2luZm8uY3BwCisjaWZkZWYgRFBUX1BPUlRBQkxFCisJdVNIT1JUCQluZXRJbnNlcnQoZHB0QnVmZmVyX1MgKmJ1ZmZlcik7CisJdVNIT1JUCQluZXRFeHRyYWN0KGRwdEJ1ZmZlcl9TICpidWZmZXIpOworI2VuZGlmIC8vIERQVCBQT1JUQUJMRQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICB9OworI2Vsc2UKKyAgIH0gRE9TX0luZm9fUzsKKyNlbmRpZgorLypET1NfSW5mb19TIC0gZW5kICovCisKKworLypzdHJ1Y3QgLSBOZXR3YXJlX0luZm9fUyAtIHN0YXJ0CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqRGVzY3JpcHRpb246CisgKgorICogICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzeXN0ZW0gaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gYQorICpOZXR3YXJlIG1hY2hpbmUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCisgICBzdHJ1Y3QgTmV0d2FyZV9JbmZvX1MgeworI2Vsc2UKKyAgIHR5cGVkZWYgc3RydWN0IHsKKyNlbmRpZgorCisgICB1Q0hBUiAgICAgICAgZHJpdmVyTmFtZVsxM107ICAgICAgICAgLyogaWUgUE0xMk5XMzEuRFNLICovCisgICB1Q0hBUiAgICAgICAgc2VydmVyTmFtZVs0OF07CisgICB1Q0hBUiAgICAgICAgbmV0d2FyZVZlcnNpb247ICAgICAgICAgLyogVGhlIE5ldHdhcmUgT1MgdmVyc2lvbiAqLworICAgdUNIQVIgICAgICAgIG5ldHdhcmVTdWJWZXJzaW9uOworICAgdUNIQVIgICAgICAgIG5ldHdhcmVSZXZpc2lvbjsKKyAgIHVTSE9SVCAgICAgICBtYXhDb25uZWN0aW9uczsgICAgICAgICAvKiBQcm9iYWJseSAgMjUwIG9yIDEwMDAgKi8KKyAgIHVTSE9SVCAgICAgICBjb25uZWN0aW9uc0luVXNlOworICAgdVNIT1JUICAgICAgIG1heFZvbHVtZXM7CisgICB1Q0hBUiAgICAgICAgdW51c2VkOworICAgdUNIQVIgICAgICAgIFNGVGxldmVsOworICAgdUNIQVIgICAgICAgIFRUU2xldmVsOworCisgICB1Q0hBUiAgICAgICAgY2xpYk1ham9yVmVyc2lvbjsgICAgICAgLyogVGhlIENMSUIuTkxNIHZlcnNpb24gKi8KKyAgIHVDSEFSICAgICAgICBjbGliTWlub3JWZXJzaW9uOworICAgdUNIQVIgICAgICAgIGNsaWJSZXZpc2lvbjsKKworI2lmZGVmICBfX2NwbHVzcGx1cworCisvLy0tLS0tLS0tLS0gUG9ydGFiaWxpdHkgQWRkaXRpb25zIC0tLS0tLS0tLS0tIGluIHNwX3NpbmZvLmNwcAorI2lmZGVmIERQVF9QT1JUQUJMRQorCXVTSE9SVAkJbmV0SW5zZXJ0KGRwdEJ1ZmZlcl9TICpidWZmZXIpOworCXVTSE9SVAkJbmV0RXh0cmFjdChkcHRCdWZmZXJfUyAqYnVmZmVyKTsKKyNlbmRpZiAvLyBEUFQgUE9SVEFCTEUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgfTsKKyNlbHNlCisgICB9IE5ldHdhcmVfSW5mb19TOworI2VuZGlmCisvKk5ldHdhcmVfSW5mb19TIC0gZW5kICovCisKKworLypzdHJ1Y3QgLSBPUzJfSW5mb19TIC0gc3RhcnQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICpEZXNjcmlwdGlvbjoKKyAqCisgKiAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHN5c3RlbSBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhbgorICpPUy8yIG1hY2hpbmUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCisgICBzdHJ1Y3QgT1MyX0luZm9fUyB7CisjZWxzZQorICAgdHlwZWRlZiBzdHJ1Y3QgeworI2VuZGlmCisKKyAgIHVDSEFSICAgICAgICBzb21ldGhpbmc7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKKworLy8tLS0tLS0tLS0tIFBvcnRhYmlsaXR5IEFkZGl0aW9ucyAtLS0tLS0tLS0tLSBpbiBzcF9zaW5mby5jcHAKKyNpZmRlZiBEUFRfUE9SVEFCTEUKKwl1U0hPUlQJCW5ldEluc2VydChkcHRCdWZmZXJfUyAqYnVmZmVyKTsKKwl1U0hPUlQJCW5ldEV4dHJhY3QoZHB0QnVmZmVyX1MgKmJ1ZmZlcik7CisjZW5kaWYgLy8gRFBUIFBPUlRBQkxFCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIH07CisjZWxzZQorICAgfSBPUzJfSW5mb19TOworI2VuZGlmCisvKk9TMl9JbmZvX1MgLSBlbmQgKi8KKworCisvKnN0cnVjdCAtIFdpbk5UX0luZm9fUyAtIHN0YXJ0CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqRGVzY3JpcHRpb246CisgKgorICogICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzeXN0ZW0gaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gYQorICpXaW5kb3dzIE5UIG1hY2hpbmUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCisgICBzdHJ1Y3QgV2luTlRfSW5mb19TIHsKKyNlbHNlCisgICB0eXBlZGVmIHN0cnVjdCB7CisjZW5kaWYKKworICAgdUNIQVIgICAgICAgIHNvbWV0aGluZzsKKworI2lmZGVmICBfX2NwbHVzcGx1cworCisvLy0tLS0tLS0tLS0gUG9ydGFiaWxpdHkgQWRkaXRpb25zIC0tLS0tLS0tLS0tIGluIHNwX3NpbmZvLmNwcAorI2lmZGVmIERQVF9QT1JUQUJMRQorCXVTSE9SVAkJbmV0SW5zZXJ0KGRwdEJ1ZmZlcl9TICpidWZmZXIpOworCXVTSE9SVAkJbmV0RXh0cmFjdChkcHRCdWZmZXJfUyAqYnVmZmVyKTsKKyNlbmRpZiAvLyBEUFQgUE9SVEFCTEUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgfTsKKyNlbHNlCisgICB9IFdpbk5UX0luZm9fUzsKKyNlbmRpZgorLypXaW5OVF9JbmZvX1MgLSBlbmQgKi8KKworCisvKnN0cnVjdCAtIFNDT19JbmZvX1MgLSBzdGFydAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKkRlc2NyaXB0aW9uOgorICoKKyAqICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc3lzdGVtIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGFuCisgKlNDTyBVTklYIG1hY2hpbmUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCisgICBzdHJ1Y3QgU0NPX0luZm9fUyB7CisjZWxzZQorICAgdHlwZWRlZiBzdHJ1Y3QgeworI2VuZGlmCisKKyAgIHVDSEFSICAgICAgICBzb21ldGhpbmc7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKKworLy8tLS0tLS0tLS0tIFBvcnRhYmlsaXR5IEFkZGl0aW9ucyAtLS0tLS0tLS0tLSBpbiBzcF9zaW5mby5jcHAKKyNpZmRlZiBEUFRfUE9SVEFCTEUKKwl1U0hPUlQJCW5ldEluc2VydChkcHRCdWZmZXJfUyAqYnVmZmVyKTsKKwl1U0hPUlQJCW5ldEV4dHJhY3QoZHB0QnVmZmVyX1MgKmJ1ZmZlcik7CisjZW5kaWYgLy8gRFBUIFBPUlRBQkxFCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIH07CisjZWxzZQorICAgfSBTQ09fSW5mb19TOworI2VuZGlmCisvKlNDT19JbmZvX1MgLSBlbmQgKi8KKworCisvKnN0cnVjdCAtIFVTTF9JbmZvX1MgLSBzdGFydAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKkRlc2NyaXB0aW9uOgorICoKKyAqICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc3lzdGVtIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGEKKyAqVVNMIFVOSVggbWFjaGluZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKKyAgIHN0cnVjdCBVU0xfSW5mb19TIHsKKyNlbHNlCisgICB0eXBlZGVmIHN0cnVjdCB7CisjZW5kaWYKKworICAgdUNIQVIgICAgICAgIHNvbWV0aGluZzsKKworI2lmZGVmICBfX2NwbHVzcGx1cworCisvLy0tLS0tLS0tLS0gUG9ydGFiaWxpdHkgQWRkaXRpb25zIC0tLS0tLS0tLS0tIGluIHNwX3NpbmZvLmNwcAorI2lmZGVmIERQVF9QT1JUQUJMRQorCXVTSE9SVAkJbmV0SW5zZXJ0KGRwdEJ1ZmZlcl9TICpidWZmZXIpOworCXVTSE9SVAkJbmV0RXh0cmFjdChkcHRCdWZmZXJfUyAqYnVmZmVyKTsKKyNlbmRpZiAvLyBEUFQgUE9SVEFCTEUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgfTsKKyNlbHNlCisgICB9IFVTTF9JbmZvX1M7CisjZW5kaWYKKy8qVVNMX0luZm9fUyAtIGVuZCAqLworCisKKyAgLyogUmVzdG9yZSBkZWZhdWx0IHN0cnVjdHVyZSBwYWNraW5nICovCisjaWZuZGVmIE5PX1VOUEFDSworI2lmIGRlZmluZWQgKF9EUFRfQUlYKQorI3ByYWdtYSBvcHRpb25zIGFsaWduPXJlc2V0CisjZWxpZiBkZWZpbmVkIChVTlBBQ0tfRk9VUikKKyNwcmFnbWEgcGFjayg0KQorI2Vsc2UKKyNwcmFnbWEgcGFjaygpCisjZW5kaWYgIC8qIGFpeCAqLworI2VuZGlmICAvLyBubyB1bnBhY2sKKworI2VuZGlmICAvLyBfX1NZU19JTkZPX0gKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RwdF9pMm8uYyBiL2RyaXZlcnMvc2NzaS9kcHRfaTJvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNjOWI5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9kcHRfaTJvLmMKQEAgLTAsMCArMSwzMzgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRwdGkuYyAgLSAgZGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGJlZ2luICAgICAgICAgICAgICAgIDogVGh1IFNlcCA3IDIwMDAKKyAgICBjb3B5cmlnaHQgICAgICAgICAgICA6IChDKSAyMDAwIGJ5IEFkYXB0ZWMKKworCQkJICAgSnVseSAzMCwgMjAwMSBGaXJzdCB2ZXJzaW9uIGJlaW5nIHN1Ym1pdHRlZAorCQkJICAgZm9yIGluY2x1c2lvbiBpbiB0aGUga2VybmVsLiAgVjIuNAorCisgICAgU2VlIERvY3VtZW50YXRpb24vc2NzaS9kcHRpLnR4dCBmb3IgaGlzdG9yeSwgbm90ZXMsIGxpY2Vuc2UgaW5mbworICAgIGFuZCBjcmVkaXRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2F0IERlYyAyMCAyMDAzIEdvIFRhbmlndWNoaSA8Z29AdHVyYm9saW51eC5jby5qcD4KKyAtIFN1cHBvcnQgMi42IGtlcm5lbCBhbmQgRE1BLW1hcHBpbmcKKyAtIGlvY3RsIGZpeCBmb3IgcmFpZCB0b29scworIC0gdXNlIHNjaGVkdWxlX3RpbWVvdXQgaW4gbG9uZyBsb25nIGxvb3AKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyojZGVmaW5lIERFQlVHIDEgKi8KKy8qI2RlZmluZSBVQVJUREVMQVkgMSAqLworCisvKiBPbiB0aGUgcmVhbCBrZXJuZWwgQUREUjMyIHNob3VsZCBhbHdheXMgYmUgemVybyBmb3IgMi40LiBHRlBfSElHSCBhbGxvY2F0ZXMKKyAgIGhpZ2ggcGFnZXMuIEtlZXAgdGhlIG1hY3JvIGFyb3VuZCBiZWNhdXNlIG9mIHRoZSBicm9rZW4gdW5tZXJnZWQgaWE2NCB0cmVlICovCisKKyNkZWZpbmUgQUREUjMyICgwKQorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCitNT0RVTEVfQVVUSE9SKCJEZWFubmEgQm9uZHMsIHdpdGggX2xvdHNfIG9mIGhlbHAgZnJvbSBNYXJrIFNhbHl6eW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWRhcHRlYyBJMk8gUkFJRCBEcml2ZXIiKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4JLyogRm9yIFNDU0ktUGFzc3Rocm91Z2ggKi8KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JCS8qIGZvciBrbWFsbG9jKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4JLyogZm9yIENPTkZJR19QQ0kgKi8KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4JCS8qIGZvciBQQ0kgc3VwcG9ydCAqLworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiBmb3IgdWRlbGF5ICovCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIGZvciBwcmludGsgKi8KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CS8qIGZvciBib290X2NwdV9kYXRhICovCisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIGZvciB2aXJ0X3RvX2J1cywgZXRjLiAqLworCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisKKyNpbmNsdWRlICJkcHQvZHB0c2lnLmgiCisjaW5jbHVkZSAiZHB0aS5oIgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENyZWF0ZSBhIGJpbmFyeSBzaWduYXR1cmUgLSB0aGlzIGlzIHJlYWQgYnkgZHB0c2lnCisgKiBOZWVkZWQgZm9yIG91ciBtYW5hZ2VtZW50IGFwcHMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgZHB0X3NpZ19TIERQVElfc2lnID0geworCXsnZCcsICdQJywgJ3QnLCAnUycsICdpJywgJ0cnfSwgU0lHX1ZFUlNJT04sCisjaWZkZWYgX19pMzg2X18KKwlQUk9DX0lOVEVMLCBQUk9DXzM4NiB8IFBST0NfNDg2IHwgUFJPQ19QRU5USVVNIHwgUFJPQ19TRVhJVU0sCisjZWxpZiBkZWZpbmVkKF9faWE2NF9fKQorCVBST0NfSU5URUwsIFBST0NfSUE2NCwKKyNlbGlmIGRlZmluZWQoX19zcGFyY19fKQorCVBST0NfVUxUUkFTUEFSQywgUFJPQ19VTFRSQVNQQVJDLAorI2VsaWYgZGVmaW5lZChfX2FscGhhX18pCisJUFJPQ19BTFBIQSwgUFJPQ19BTFBIQSwKKyNlbHNlCisJKC0xKSwoLTEpLAorI2VuZGlmCisJIEZUX0hCQURSVlIsIDAsIE9FTV9EUFQsIE9TX0xJTlVYLCBDQVBfT1ZFUkxBUCwgREVWX0FMTCwKKwlBREZfQUxMX1NDNSwgMCwgMCwgRFBUX1ZFUlNJT04sIERQVF9SRVZJU0lPTiwgRFBUX1NVQlJFVklTSU9OLAorCURQVF9NT05USCwgRFBUX0RBWSwgRFBUX1lFQVIsICJBZGFwdGVjIExpbnV4IEkyTyBSQUlEIERyaXZlciIKK307CisKKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2xvYmFscworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworc3RhdGljIERFQ0xBUkVfTVVURVgoYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCitzdGF0aWMgc3RydWN0IGkyb19zeXNfdGJsICpzeXNfdGJsID0gTlVMTDsKK3N0YXRpYyBpbnQgc3lzX3RibF9pbmQgPSAwOworc3RhdGljIGludCBzeXNfdGJsX2xlbiA9IDA7CisKK3N0YXRpYyBhZHB0X2hiYSogaGJhc1tEUFRJX01BWF9IQkFdOworc3RhdGljIGFkcHRfaGJhKiBoYmFfY2hhaW4gPSBOVUxMOworc3RhdGljIGludCBoYmFfY291bnQgPSAwOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZHB0X2ZvcHMgPSB7CisJLmlvY3RsCQk9IGFkcHRfaW9jdGwsCisJLm9wZW4JCT0gYWRwdF9vcGVuLAorCS5yZWxlYXNlCT0gYWRwdF9jbG9zZQorfTsKKworI2lmZGVmIFJFQk9PVF9OT1RJRklFUgorc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBhZHB0X3JlYm9vdF9ub3RpZmllciA9Cit7CisJIGFkcHRfcmVib290X2V2ZW50LAorCSBOVUxMLAorCSAwCit9OworI2VuZGlmCisKKy8qIFN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zIGZvciBzeW5jaHJvbm91cyBtZXNzYWdlIHBvc3RpbmcuCisgKiBTZWUgYWRwdF9pMm9fcG9zdF93YWl0KCkgZm9yIGRlc2NyaXB0aW9uCisgKiAqLworc3RydWN0IGFkcHRfaTJvX3Bvc3Rfd2FpdF9kYXRhCit7CisJaW50IHN0YXR1czsKKwl1MzIgaWQ7CisJYWRwdF93YWl0X3F1ZXVlX2hlYWRfdCAqd3E7CisJc3RydWN0IGFkcHRfaTJvX3Bvc3Rfd2FpdF9kYXRhICpuZXh0OworfTsKKworc3RhdGljIHN0cnVjdCBhZHB0X2kyb19wb3N0X3dhaXRfZGF0YSAqYWRwdF9wb3N0X3dhaXRfcXVldWUgPSBOVUxMOworc3RhdGljIHUzMiBhZHB0X3Bvc3Rfd2FpdF9pZCA9IDA7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFkcHRfcG9zdF93YWl0X2xvY2spOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCQkJCUZ1bmN0aW9ucworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworc3RhdGljIHU4IGFkcHRfcmVhZF9ibGlua19sZWQoYWRwdF9oYmEqIGhvc3QpCit7CisJaWYoaG9zdC0+RndEZWJ1Z0JMRURmbGFnX1AgIT0gMCkgeworCQlpZiggcmVhZGIoaG9zdC0+RndEZWJ1Z0JMRURmbGFnX1ApID09IDB4YmMgKXsKKwkJCXJldHVybiByZWFkYihob3N0LT5Gd0RlYnVnQkxFRHZhbHVlX1ApOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNjc2kgaG9zdCB0ZW1wbGF0ZSBpbnRlcmZhY2UgZnVuY3Rpb25zCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZHB0aWRzW10gPSB7CisJeyBQQ0lfRFBUX1ZFTkRPUl9JRCwgUENJX0RQVF9ERVZJQ0VfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwKKwl7IFBDSV9EUFRfVkVORE9SX0lELCBQQ0lfRFBUX1JBUFRPUl9ERVZJQ0VfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwKKwl7IDAsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSxkcHRpZHMpOworCitzdGF0aWMgaW50IGFkcHRfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUqIHNodCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcERldiA9IE5VTEw7CisJYWRwdF9oYmEqIHBIYmE7CisKKwlhZHB0X2luaXQoKTsKKworCVBJTkZPKCJEZXRlY3RpbmcgQWRhcHRlYyBJMk8gUkFJRCBjb250cm9sbGVycy4uLlxuIik7CisKKyAgICAgICAgLyogc2VhcmNoIGZvciBhbGwgQWRhdHBlYyBJMk8gUkFJRCBjYXJkcyAqLworCXdoaWxlICgocERldiA9IHBjaV9maW5kX2RldmljZSggUENJX0RQVF9WRU5ET1JfSUQsIFBDSV9BTllfSUQsIHBEZXYpKSkgeworCQlpZihwRGV2LT5kZXZpY2UgPT0gUENJX0RQVF9ERVZJQ0VfSUQgfHwKKwkJICAgcERldi0+ZGV2aWNlID09IFBDSV9EUFRfUkFQVE9SX0RFVklDRV9JRCl7CisJCQlpZihhZHB0X2luc3RhbGxfaGJhKHNodCwgcERldikgKXsKKwkJCQlQRVJST1IoIkNvdWxkIG5vdCBJbml0IGFuIEkyTyBSQUlEIGRldmljZVxuIik7CisJCQkJUEVSUk9SKCJXaWxsIG5vdCB0cnkgdG8gZGV0ZWN0IG90aGVycy5cbiIpOworCQkJCXJldHVybiBoYmFfY291bnQtMTsKKwkJCX0KKwkJfQorCX0KKworCS8qIEluIElOSVQgc3RhdGUsIEFjdGl2YXRlIElPUHMgKi8KKwlmb3IgKHBIYmEgPSBoYmFfY2hhaW47IHBIYmE7IHBIYmEgPSBwSGJhLT5uZXh0KSB7CisJCS8vIEFjdGl2YXRlIGRvZXMgZ2V0IHN0YXR1cyAsIGluaXQgb3V0Ym91bmQsIGFuZCBnZXQgaHJ0CisJCWlmIChhZHB0X2kyb19hY3RpdmF0ZV9oYmEocEhiYSkgPCAwKSB7CisJCQlhZHB0X2kyb19kZWxldGVfaGJhKHBIYmEpOworCQl9CisJfQorCisKKwkvKiBBY3RpdmUgSU9QcyBpbiBIT0xEIHN0YXRlICovCisKK3JlYnVpbGRfc3lzX3RhYjoKKwlpZiAoaGJhX2NoYWluID09IE5VTEwpIAorCQlyZXR1cm4gMDsKKworCS8qCisJICogSWYgYnVpbGRfc3lzX3RhYmxlIGZhaWxzLCB3ZSBraWxsIGV2ZXJ5dGhpbmcgYW5kIGJhaWwKKwkgKiBhcyB3ZSBjYW4ndCBpbml0IHRoZSBJT1BzIHcvbyBhIHN5c3RlbSB0YWJsZQorCSAqLwkKKwlpZiAoYWRwdF9pMm9fYnVpbGRfc3lzX3RhYmxlKCkgPCAwKSB7CisJCWFkcHRfaTJvX3N5c19zaHV0ZG93bigpOworCQlyZXR1cm4gMDsKKwl9CisKKwlQREVCVUcoIkhCQSdzIGluIEhPTEQgc3RhdGVcbiIpOworCisJLyogSWYgSU9QIGRvbid0IGdldCBvbmxpbmUsIHdlIG5lZWQgdG8gcmVidWlsZCB0aGUgU3lzdGVtIHRhYmxlICovCisJZm9yIChwSGJhID0gaGJhX2NoYWluOyBwSGJhOyBwSGJhID0gcEhiYS0+bmV4dCkgeworCQlpZiAoYWRwdF9pMm9fb25saW5lX2hiYShwSGJhKSA8IDApIHsKKwkJCWFkcHRfaTJvX2RlbGV0ZV9oYmEocEhiYSk7CQorCQkJZ290byByZWJ1aWxkX3N5c190YWI7CisJCX0KKwl9CisKKwkvKiBBY3RpdmUgSU9QcyBub3cgaW4gT1BFUkFUSU9OQUwgc3RhdGUgKi8KKwlQREVCVUcoIkhCQSdzIGluIE9QRVJBVElPTkFMIHN0YXRlXG4iKTsKKworCXByaW50aygiZHB0aTogSWYgeW91IGhhdmUgYSBsb3Qgb2YgZGV2aWNlcyB0aGlzIGNvdWxkIHRha2UgYSBmZXcgbWludXRlcy5cbiIpOworCWZvciAocEhiYSA9IGhiYV9jaGFpbjsgcEhiYTsgcEhiYSA9IHBIYmEtPm5leHQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyIlczogUmVhZGluZyB0aGUgaGFyZHdhcmUgcmVzb3VyY2UgdGFibGUuXG4iLCBwSGJhLT5uYW1lKTsKKwkJaWYgKGFkcHRfaTJvX2xjdF9nZXQocEhiYSkgPCAwKXsKKwkJCWFkcHRfaTJvX2RlbGV0ZV9oYmEocEhiYSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChhZHB0X2kyb19wYXJzZV9sY3QocEhiYSkgPCAwKXsKKwkJCWFkcHRfaTJvX2RlbGV0ZV9oYmEocEhiYSk7CisJCQljb250aW51ZTsKKwkJfQorCQlhZHB0X2lucXVpcnkocEhiYSk7CisJfQorCisJZm9yIChwSGJhID0gaGJhX2NoYWluOyBwSGJhOyBwSGJhID0gcEhiYS0+bmV4dCkgeworCQlpZiggYWRwdF9zY3NpX3JlZ2lzdGVyKHBIYmEsc2h0KSA8IDApeworCQkJYWRwdF9pMm9fZGVsZXRlX2hiYShwSGJhKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXBIYmEtPmluaXRpYWxpemVkID0gVFJVRTsKKwkJcEhiYS0+c3RhdGUgJj0gfkRQVElfU1RBVEVfUkVTRVQ7CisJfQorCisJLy8gUmVnaXN0ZXIgb3VyIGNvbnRyb2wgZGV2aWNlIG5vZGUKKwkvLyBub2RlcyB3aWxsIG5lZWQgdG8gYmUgY3JlYXRlZCBpbiAvZGV2IHRvIGFjY2VzcyB0aGlzCisJLy8gdGhlIG5vZGVzIGNhbiBub3QgYmUgY3JlYXRlZCBmcm9tIHdpdGhpbiB0aGUgZHJpdmVyCisJaWYgKGhiYV9jb3VudCAmJiByZWdpc3Rlcl9jaHJkZXYoRFBUSV9JMk9fTUFKT1IsIERQVF9EUklWRVIsICZhZHB0X2ZvcHMpKSB7CisJCWFkcHRfaTJvX3N5c19zaHV0ZG93bigpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGhiYV9jb3VudDsKK30KKworCisvKgorICogc2NzaV91bnJlZ2lzdGVyIHdpbGwgYmUgY2FsbGVkIEFGVEVSIHdlIHJldHVybi4gCisgKi8KK3N0YXRpYyBpbnQgYWRwdF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJYWRwdF9oYmEqIHBIYmEgPSAoYWRwdF9oYmEqKSBob3N0LT5ob3N0ZGF0YVswXTsKKy8vCWFkcHRfaTJvX3F1aWVzY2VfaGJhKHBIYmEpOworCWFkcHRfaTJvX2RlbGV0ZV9oYmEocEhiYSk7CisJc2NzaV91bnJlZ2lzdGVyKGhvc3QpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGFkcHRfaW5xdWlyeShhZHB0X2hiYSogcEhiYSkKK3sKKwl1MzIgbXNnWzE0XTsgCisJdTMyICptcHRyOworCXUzMiAqbGVucHRyOworCWludCBkaXJlY3Rpb247CisJaW50IHNjc2lkaXI7CisJdTMyIGxlbjsKKwl1MzIgcmVxbGVuOworCXU4KiBidWY7CisJdTggIHNjYlsxNl07CisJczMyIHJjb2RlOworCisJbWVtc2V0KG1zZywgMCwgc2l6ZW9mKG1zZykpOworCWJ1ZiA9ICh1OCopa21hbGxvYyg4MCxHRlBfS0VSTkVMfEFERFIzMik7CisJaWYoIWJ1Zil7CisJCXByaW50ayhLRVJOX0VSUiIlczogQ291bGQgbm90IGFsbG9jYXRlIGJ1ZmZlclxuIixwSGJhLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwltZW1zZXQoKHZvaWQqKWJ1ZiwgMCwgMzYpOworCQorCWxlbiA9IDM2OworCWRpcmVjdGlvbiA9IDB4MDAwMDAwMDA7CQorCXNjc2lkaXIgID0weDQwMDAwMDAwOwkvLyBEQVRBIElOICAoaW9wPC0tZGV2KQorCisJcmVxbGVuID0gMTQ7CQkvLyBTSU5HTEUgU0dFCisJLyogU3RpY2sgdGhlIGhlYWRlcnMgb24gKi8KKwltc2dbMF0gPSByZXFsZW48PDE2IHwgU0dMX09GRlNFVF8xMjsKKwltc2dbMV0gPSAoMHhmZjw8MjR8SE9TVF9USUQ8PDEyfEFEQVBURVJfVElEKTsKKwltc2dbMl0gPSAwOworCW1zZ1szXSAgPSAwOworCS8vIEFkYXB0ZWMvRFBUIFByaXZhdGUgc3R1ZmYgCisJbXNnWzRdID0gSTJPX0NNRF9TQ1NJX0VYRUN8RFBUX09SR0FOSVpBVElPTl9JRDw8MTY7CisJbXNnWzVdID0gQURBUFRFUl9USUQgfCAxPDwxNiAvKiBJbnRlcnByZXQqLzsKKwkvKiBEaXJlY3Rpb24sIGRpc2Nvbm5lY3Qgb2sgfCBzZW5zZSBkYXRhIHwgc2ltcGxlIHF1ZXVlICwgQ0RCTGVuICovCisJLy8gSTJPX1NDQl9GTEFHX0VOQUJMRV9ESVNDT05ORUNUIHwgCisJLy8gSTJPX1NDQl9GTEFHX1NJTVBMRV9RVUVVRV9UQUcgfCAKKwkvLyBJMk9fU0NCX0ZMQUdfU0VOU0VfREFUQV9JTl9NRVNTQUdFOworCW1zZ1s2XSA9IHNjc2lkaXJ8MHgyMGEwMDAwMHwgNiAvKiBjbWQgbGVuKi87CisKKwltcHRyPW1zZys3OworCisJbWVtc2V0KHNjYiwgMCwgc2l6ZW9mKHNjYikpOworCS8vIFdyaXRlIFNDU0kgY29tbWFuZCBpbnRvIHRoZSBtZXNzYWdlIC0gYWx3YXlzIDE2IGJ5dGUgYmxvY2sgCisJc2NiWzBdID0gSU5RVUlSWTsKKwlzY2JbMV0gPSAwOworCXNjYlsyXSA9IDA7CisJc2NiWzNdID0gMDsKKwlzY2JbNF0gPSAzNjsKKwlzY2JbNV0gPSAwOworCS8vIERvbid0IGNhcmUgYWJvdXQgdGhlIHJlc3Qgb2Ygc2NiCisKKwltZW1jcHkobXB0ciwgc2NiLCBzaXplb2Yoc2NiKSk7CisJbXB0cis9NDsKKwlsZW5wdHI9bXB0cisrOwkJLyogUmVtZW1iZXIgbWUgLSBmaWxsIGluIHdoZW4gd2Uga25vdyAqLworCisJLyogTm93IGZpbGwgaW4gdGhlIFNHTGlzdCBhbmQgY29tbWFuZCAqLworCSpsZW5wdHIgPSBsZW47CisJKm1wdHIrKyA9IDB4RDAwMDAwMDB8ZGlyZWN0aW9ufGxlbjsKKwkqbXB0cisrID0gdmlydF90b19idXMoYnVmKTsKKworCS8vIFNlbmQgaXQgb24gaXQncyB3YXkKKwlyY29kZSA9IGFkcHRfaTJvX3Bvc3Rfd2FpdChwSGJhLCBtc2csIHJlcWxlbjw8MiwgMTIwKTsKKwlpZiAocmNvZGUgIT0gMCkgeworCQlzcHJpbnRmKHBIYmEtPmRldGFpbCwgIkFkYXB0ZWMgSTJPIFJBSUQiKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElucXVpcnkgRXJyb3IgKCVkKVxuIixwSGJhLT5uYW1lLHJjb2RlKTsKKwkJaWYgKHJjb2RlICE9IC1FVElNRSAmJiByY29kZSAhPSAtRUlOVFIpCisJCQlrZnJlZShidWYpOworCX0gZWxzZSB7CisJCW1lbXNldChwSGJhLT5kZXRhaWwsIDAsIHNpemVvZihwSGJhLT5kZXRhaWwpKTsKKwkJbWVtY3B5KCYocEhiYS0+ZGV0YWlsKSwgIlZlbmRvcjogQWRhcHRlYyAiLCAxNik7CisJCW1lbWNweSgmKHBIYmEtPmRldGFpbFsxNl0pLCAiIE1vZGVsOiAiLCA4KTsKKwkJbWVtY3B5KCYocEhiYS0+ZGV0YWlsWzI0XSksICh1OCopICZidWZbMTZdLCAxNik7CisJCW1lbWNweSgmKHBIYmEtPmRldGFpbFs0MF0pLCAiIEZXOiAiLCA0KTsKKwkJbWVtY3B5KCYocEhiYS0+ZGV0YWlsWzQ0XSksICh1OCopICZidWZbMzJdLCA0KTsKKwkJcEhiYS0+ZGV0YWlsWzQ4XSA9ICdcMCc7CS8qIHByZWNhdXRpb25hcnkgKi8KKwkJa2ZyZWUoYnVmKTsKKwl9CisJYWRwdF9pMm9fc3RhdHVzX2dldChwSGJhKTsKKwlyZXR1cm4gOworfQorCisKK3N0YXRpYyBpbnQgYWRwdF9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICogZGV2aWNlKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBkZXZpY2UtPmhvc3Q7CisJYWRwdF9oYmEqIHBIYmE7CisKKwlwSGJhID0gKGFkcHRfaGJhICopIGhvc3QtPmhvc3RkYXRhWzBdOworCisJaWYgKGhvc3QtPmNhbl9xdWV1ZSAmJiBkZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQpIHsKKwkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2aWNlLCBNU0dfU0lNUExFX1RBRywKKwkJCQlob3N0LT5jYW5fcXVldWUgLSAxKTsKKwl9IGVsc2UgeworCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXZpY2UsIDAsIDEpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHB0X3F1ZXVlKHN0cnVjdCBzY3NpX2NtbmQgKiBjbWQsIHZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlhZHB0X2hiYSogcEhiYSA9IE5VTEw7CisJc3RydWN0IGFkcHRfZGV2aWNlKiBwRGV2ID0gTlVMTDsJLyogZHB0IHBlciBkZXZpY2UgaW5mb3JtYXRpb24gKi8KKwl1bG9uZyB0aW1lb3V0ID0gamlmZmllcyArIChUTU9VVF9TQ1NJKkhaKTsKKworCWNtZC0+c2NzaV9kb25lID0gZG9uZTsKKwkvKgorCSAqIFNDU0kgUkVRVUVTVF9TRU5TRSBjb21tYW5kcyB3aWxsIGJlIGV4ZWN1dGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIAorCSAqIEhvc3QgQWRhcHRlciBmb3IgYW55IGVycm9ycywgc28gdGhleSBzaG91bGQgbm90IGJlIGV4ZWN1dGVkIAorCSAqIGV4cGxpY2l0bHkgdW5sZXNzIHRoZSBTZW5zZSBEYXRhIGlzIHplcm8gaW5kaWNhdGluZyB0aGF0IG5vIGVycm9yIAorCSAqIG9jY3VycmVkLgorCSAqLworCisJaWYgKChjbWQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkgJiYgKGNtZC0+c2Vuc2VfYnVmZmVyWzBdICE9IDApKSB7CisJCWNtZC0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNik7CisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCXJldHVybiAwOworCX0KKworCXBIYmEgPSAoYWRwdF9oYmEqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YVswXTsKKwlpZiAoIXBIYmEpIHsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlybWIoKTsKKwkvKgorCSAqIFRPRE86IEkgbmVlZCB0byBibG9jayBoZXJlIGlmIEkgYW0gcHJvY2Vzc2luZyBpb2N0bCBjbWRzCisJICogYnV0IGlmIHRoZSBvdXRzdGFuZGluZyBjbWRzIGFsbCBmaW5pc2ggYmVmb3JlIHRoZSBpb2N0bCwKKwkgKiB0aGUgc2NzaS1jb3JlIHdpbGwgbm90IGtub3cgdG8gc3RhcnQgc2VuZGluZyBjbWRzIHRvIG1lIGFnYWluLgorCSAqIEkgbmVlZCB0byBhIHdheSB0byByZXN0YXJ0IHRoZSBzY3NpLWNvcmVzIHF1ZXVlcyBvciBzaG91bGQgSSBibG9jaworCSAqIGNhbGxpbmcgc2NzaV9kb25lIG9uIHRoZSBvdXRzdGFuZGluZyBjbWRzIGluc3RlYWQKKwkgKiBmb3Igbm93IHdlIGRvbid0IHNldCB0aGUgSU9DVEwgc3RhdGUKKwkgKi8KKwlpZigoKHBIYmEtPnN0YXRlKSAmIERQVElfU1RBVEVfSU9DVEwpIHx8ICgocEhiYS0+c3RhdGUpICYgRFBUSV9TVEFURV9SRVNFVCkpIHsKKwkJcEhiYS0+aG9zdC0+bGFzdF9yZXNldCA9IGppZmZpZXM7CisJCXBIYmEtPmhvc3QtPnJlc2V0dGluZyA9IDE7CisJCXJldHVybiAxOworCX0KKworCWlmKGNtZC0+ZWhfc3RhdGUgIT0gU0NTSV9TVEFURV9RVUVVRUQpeworCQkvLyBJZiB3ZSBhcmUgbm90IGRvaW5nIGVycm9yIHJlY292ZXJ5CisJCW1vZF90aW1lcigmY21kLT5laF90aW1lb3V0LCB0aW1lb3V0KTsKKwl9CisKKwkvLyBUT0RPIGlmIHRoZSBjbWQtPmRldmljZSBpZiBvZmZsaW5lIHRoZW4gSSBtYXkgbmVlZCB0byBpc3N1ZSBhIGJ1cyByZXNjYW4KKwkvLyBmb2xsb3dlZCBieSBhIGdldF9sY3QgdG8gc2VlIGlmIHRoZSBkZXZpY2UgaXMgdGhlcmUgYW55bW9yZQorCWlmKChwRGV2ID0gKHN0cnVjdCBhZHB0X2RldmljZSopIChjbWQtPmRldmljZS0+aG9zdGRhdGEpKSA9PSBOVUxMKSB7CisJCS8qCisJCSAqIEZpcnN0IGNvbW1hbmQgcmVxdWVzdCBmb3IgdGhpcyBkZXZpY2UuICBTZXQgdXAgYSBwb2ludGVyCisJCSAqIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAgVGhpcyBzaG91bGQgYmUgYSBURVNUX1VOSVRfUkVBRFkKKwkJICogY29tbWFuZCBmcm9tIHNjYW5fc2NzaXNfc2luZ2xlLgorCQkgKi8KKwkJaWYgKChwRGV2ID0gYWRwdF9maW5kX2RldmljZShwSGJhLCAodTMyKWNtZC0+ZGV2aWNlLT5jaGFubmVsLCAodTMyKWNtZC0+ZGV2aWNlLT5pZCwgKHUzMiljbWQtPmRldmljZS0+bHVuKSkgPT0gTlVMTCkgeworCQkJLy8gVE9ETzogaWYgYW55IGx1bnMgYXJlIGF0IHRoaXMgYnVzLCBzY3NpIGlkIHRoZW4gZmFrZSBhIFRFU1RfVU5JVF9SRUFEWSBhbmQgSU5RVUlSWSByZXNwb25zZSAKKwkJCS8vIHdpdGggdHlwZSA3RiAoZm9yIGFsbCBsdW5zIGxlc3MgdGhhbiB0aGUgbWF4IGZvciB0aGlzIGJ1cyxpZCkgc28gdGhlIGx1biBzY2FuIHdpbGwgY29udGludWUuCisJCQljbWQtPnJlc3VsdCA9IChESURfTk9fQ09OTkVDVCA8PCAxNik7CisJCQljbWQtPnNjc2lfZG9uZShjbWQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY21kLT5kZXZpY2UtPmhvc3RkYXRhID0gcERldjsKKwl9CisJcERldi0+cFNjc2lfZGV2ID0gY21kLT5kZXZpY2U7CisKKwkvKgorCSAqIElmIHdlIGFyZSBiZWluZyBjYWxsZWQgZnJvbSB3aGVuIHRoZSBkZXZpY2UgaXMgYmVpbmcgcmVzZXQsIAorCSAqIGRlbGF5IHByb2Nlc3Npbmcgb2YgdGhlIGNvbW1hbmQgdW50aWwgbGF0ZXIuCisJICovCisJaWYgKHBEZXYtPnN0YXRlICYgRFBUSV9ERVZfUkVTRVQgKSB7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCXJldHVybiBhZHB0X3Njc2lfdG9faTJvKHBIYmEsIGNtZCwgcERldik7Cit9CisKK3N0YXRpYyBpbnQgYWRwdF9iaW9zX3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LAorCQlzZWN0b3JfdCBjYXBhY2l0eSwgaW50IGdlb21bXSkKK3sKKwlpbnQgaGVhZHM9LTE7CisJaW50IHNlY3RvcnM9LTE7CisJaW50IGN5bGluZGVycz0tMTsKKworCS8vICoqKiBGaXJzdCBsZXRzIHNldCB0aGUgZGVmYXVsdCBnZW9tZXRyeSAqKioqCisJCisJLy8gSWYgdGhlIGNhcGFjaXR5IGlzIGxlc3MgdGhhbiBveDIwMDAKKwlpZiAoY2FwYWNpdHkgPCAweDIwMDAgKSB7CS8vIGZsb3BweQorCQloZWFkcyA9IDE4OworCQlzZWN0b3JzID0gMjsKKwl9IAorCS8vIGVsc2UgaWYgYmV0d2VlbiAweDIwMDAgYW5kIDB4MjAwMDAKKwllbHNlIGlmIChjYXBhY2l0eSA8IDB4MjAwMDApIHsKKwkJaGVhZHMgPSA2NDsKKwkJc2VjdG9ycyA9IDMyOworCX0KKwkvLyBlbHNlIGlmIGJldHdlZW4gMHgyMDAwMCBhbmQgMHg0MDAwMAorCWVsc2UgaWYgKGNhcGFjaXR5IDwgMHg0MDAwMCkgeworCQloZWFkcyA9IDY1OworCQlzZWN0b3JzID0gNjM7CisJfQorCS8vIGVsc2UgaWYgYmV0d2VlbiAweDQwMDAgYW5kIDB4ODAwMDAKKwllbHNlIGlmIChjYXBhY2l0eSA8IDB4ODAwMDApIHsKKwkJaGVhZHMgPSAxMjg7CisJCXNlY3RvcnMgPSA2MzsKKwl9CisJLy8gZWxzZSBpZiBncmVhdGVyIHRoYW4gMHg4MDAwMAorCWVsc2UgeworCQloZWFkcyA9IDI1NTsKKwkJc2VjdG9ycyA9IDYzOworCX0KKwljeWxpbmRlcnMgPSBzZWN0b3JfZGl2KGNhcGFjaXR5LCBoZWFkcyAqIHNlY3RvcnMpOworCisJLy8gU3BlY2lhbCBjYXNlIGlmIENEUk9NCisJaWYoc2Rldi0+dHlwZSA9PSA1KSB7ICAvLyBDRFJPTQorCQloZWFkcyA9IDI1MjsKKwkJc2VjdG9ycyA9IDYzOworCQljeWxpbmRlcnMgPSAxMTExOworCX0KKworCWdlb21bMF0gPSBoZWFkczsKKwlnZW9tWzFdID0gc2VjdG9yczsKKwlnZW9tWzJdID0gY3lsaW5kZXJzOworCQorCVBERUJVRygiYWRwdF9iaW9zX3BhcmFtOiBleGl0XG4iKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqYWRwdF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJYWRwdF9oYmEqIHBIYmE7CisKKwlwSGJhID0gKGFkcHRfaGJhICopIGhvc3QtPmhvc3RkYXRhWzBdOworCXJldHVybiAoY2hhciAqKSAocEhiYS0+ZGV0YWlsKTsKK30KKworc3RhdGljIGludCBhZHB0X3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkgIGludCBsZW5ndGgsIGludCBpbm91dCkKK3sKKwlzdHJ1Y3QgYWRwdF9kZXZpY2UqIGQ7CisJaW50IGlkOworCWludCBjaGFuOworCWludCBsZW4gPSAwOworCWludCBiZWdpbiA9IDA7CisJaW50IHBvcyA9IDA7CisJYWRwdF9oYmEqIHBIYmE7CisJaW50IHVuaXQ7CisKKwkqc3RhcnQgPSBidWZmZXI7CisJaWYgKGlub3V0ID09IFRSVUUpIHsKKwkJLyoKKwkJICogVGhlIHVzZXIgaGFzIGRvbmUgYSB3cml0ZSBhbmQgd2FudHMgdXMgdG8gdGFrZSB0aGUKKwkJICogZGF0YSBpbiB0aGUgYnVmZmVyIGFuZCBkbyBzb21ldGhpbmcgd2l0aCBpdC4KKwkJICogcHJvY19zY3Npd3JpdGUgY2FsbHMgdXMgd2l0aCBpbm91dCA9IDEKKwkJICoKKwkJICogUmVhZCBkYXRhIGZyb20gYnVmZmVyICh3cml0aW5nIHRvIHVzKSAtIE5PVCBTVVBQT1JURUQKKwkJICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogaW5vdXQgPSAwIG1lYW5zIHRoZSB1c2VyIGhhcyBkb25lIGEgcmVhZCBhbmQgd2FudHMgaW5mb3JtYXRpb24KKwkgKiByZXR1cm5lZCwgc28gd2Ugd3JpdGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhcmRzIGludG8gdGhlIGJ1ZmZlcgorCSAqIHByb2Nfc2NzaXJlYWQoKSBjYWxscyB1cyB3aXRoIGlub3V0ID0gMAorCSAqLworCisJLy8gRmluZCBIQkEgKGhvc3QgYnVzIGFkYXB0ZXIpIHdlIGFyZSBsb29raW5nIGZvcgorCWRvd24oJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwlmb3IgKHBIYmEgPSBoYmFfY2hhaW47IHBIYmE7IHBIYmEgPSBwSGJhLT5uZXh0KSB7CisJCWlmIChwSGJhLT5ob3N0ID09IGhvc3QpIHsKKwkJCWJyZWFrOwkvKiBmb3VuZCBhZGFwdGVyICovCisJCX0KKwl9CisJdXAoJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwlpZiAocEhiYSA9PSBOVUxMKSB7CisJCXJldHVybiAwOworCX0KKwlob3N0ID0gcEhiYS0+aG9zdDsKKworCWxlbiAgPSBzcHJpbnRmKGJ1ZmZlciAgICAsICJBZGFwdGVjIEkyTyBSQUlEIERyaXZlciBWZXJzaW9uOiAlc1xuXG4iLCBEUFRfSTJPX1ZFUlNJT04pOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICIlc1xuIiwgcEhiYS0+ZGV0YWlsKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCAiU0NTSSBIb3N0PXNjc2klZCAgQ29udHJvbCBOb2RlPS9kZXYvJXMgIGlycT0lZFxuIiwgCisJCQlwSGJhLT5ob3N0LT5ob3N0X25vLCBwSGJhLT5uYW1lLCBob3N0LT5pcnEpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJcdHBvc3QgZmlmbyBzaXplICA9ICVkXG5cdHJlcGx5IGZpZm8gc2l6ZSA9ICVkXG5cdHNnIHRhYmxlIHNpemUgICA9ICVkXG5cbiIsCisJCQlob3N0LT5jYW5fcXVldWUsIChpbnQpIHBIYmEtPnJlcGx5X2ZpZm9fc2l6ZSAsIGhvc3QtPnNnX3RhYmxlc2l6ZSk7CisKKwlwb3MgPSBiZWdpbiArIGxlbjsKKworCS8qIENIRUNLUE9JTlQgKi8KKwlpZihwb3MgPiBvZmZzZXQgKyBsZW5ndGgpIHsKKwkJZ290byBzdG9wX291dHB1dDsKKwl9CisJaWYocG9zIDw9IG9mZnNldCkgeworCQkvKgorCQkgKiBJZiB3ZSBoYXZlbid0IGV2ZW4gd3JpdHRlbiB0byB3aGVyZSB3ZSBsYXN0IGxlZnQKKwkJICogb2ZmICh0aGUgbGFzdCB0aW1lIHdlIHdlcmUgY2FsbGVkKSwgcmVzZXQgdGhlIAorCQkgKiBiZWdpbm5pbmcgcG9pbnRlci4KKwkJICovCisJCWxlbiA9IDA7CisJCWJlZ2luID0gcG9zOworCX0KKwlsZW4gKz0gIHNwcmludGYoYnVmZmVyK2xlbiwgIkRldmljZXM6XG4iKTsKKwlmb3IoY2hhbiA9IDA7IGNoYW4gPCBNQVhfQ0hBTk5FTDsgY2hhbisrKSB7CisJCWZvcihpZCA9IDA7IGlkIDwgTUFYX0lEOyBpZCsrKSB7CisJCQlkID0gcEhiYS0+Y2hhbm5lbFtjaGFuXS5kZXZpY2VbaWRdOworCQkJd2hpbGUoZCl7CisJCQkJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwiXHQlLTI0LjI0cyIsIGQtPnBTY3NpX2Rldi0+dmVuZG9yKTsKKwkJCQlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCIgUmV2OiAlLTguOHNcbiIsIGQtPnBTY3NpX2Rldi0+cmV2KTsKKwkJCQlwb3MgPSBiZWdpbiArIGxlbjsKKworCisJCQkJLyogQ0hFQ0tQT0lOVCAqLworCQkJCWlmKHBvcyA+IG9mZnNldCArIGxlbmd0aCkgeworCQkJCQlnb3RvIHN0b3Bfb3V0cHV0OworCQkJCX0KKwkJCQlpZihwb3MgPD0gb2Zmc2V0KSB7CisJCQkJCWxlbiA9IDA7CisJCQkJCWJlZ2luID0gcG9zOworCQkJCX0KKworCQkJCXVuaXQgPSBkLT5wSTJvX2Rldi0+bGN0X2RhdGEudGlkOworCQkJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJcdFRJRD0lZCwgKENoYW5uZWw9JWQsIFRhcmdldD0lZCwgTHVuPSVkKSAgKCVzKVxuXG4iLAorCQkJCQkgICAgICAgdW5pdCwgKGludClkLT5zY3NpX2NoYW5uZWwsIChpbnQpZC0+c2NzaV9pZCwgKGludClkLT5zY3NpX2x1biwKKwkJCQkJICAgICAgIHNjc2lfZGV2aWNlX29ubGluZShkLT5wU2NzaV9kZXYpPyAib25saW5lIjoib2ZmbGluZSIpOyAKKwkJCQlwb3MgPSBiZWdpbiArIGxlbjsKKworCQkJCS8qIENIRUNLUE9JTlQgKi8KKwkJCQlpZihwb3MgPiBvZmZzZXQgKyBsZW5ndGgpIHsKKwkJCQkJZ290byBzdG9wX291dHB1dDsKKwkJCQl9CisJCQkJaWYocG9zIDw9IG9mZnNldCkgeworCQkJCQlsZW4gPSAwOworCQkJCQliZWdpbiA9IHBvczsKKwkJCQl9CisKKwkJCQlkID0gZC0+bmV4dF9sdW47CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIGJlZ2luIGlzIHdoZXJlIHdlIGxhc3QgY2hlY2tlZCBvdXIgcG9zaXRpb24gd2l0aCByZWdhcmRzIHRvIG9mZnNldAorCSAqIGJlZ2luIGlzIGFsd2F5cyBsZXNzIHRoYW4gb2Zmc2V0LiAgbGVuIGlzIHJlbGF0aXZlIHRvIGJlZ2luLiAgSXQKKwkgKiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gcGFzdCBiZWdpbgorCSAqCisJICovCitzdG9wX291dHB1dDoKKwkvKiBzdG9wIHRoZSBvdXRwdXQgYW5kIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCBsZW5ndGggKi8KKwkqKGJ1ZmZlciArIGxlbikgPSAnXDAnOworCisJKnN0YXJ0ID0gYnVmZmVyICsgKG9mZnNldCAtIGJlZ2luKTsJLyogU3RhcnQgb2Ygd2FudGVkIGRhdGEgKi8KKwlsZW4gLT0gKG9mZnNldCAtIGJlZ2luKTsKKwlpZihsZW4gPiBsZW5ndGgpIHsKKwkJbGVuID0gbGVuZ3RoOworCX0gZWxzZSBpZihsZW4gPCAwKXsKKwkJbGVuID0gMDsKKwkJKipzdGFydCA9ICdcMCc7CisJfQorCXJldHVybiBsZW47Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEVycm9yIEhhbmRsaW5nIHJvdXRpbmVzCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3N0YXRpYyBpbnQgYWRwdF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICogY21kKQoreworCWFkcHRfaGJhKiBwSGJhID0gTlVMTDsJLyogaG9zdCBidXMgYWRhcHRlciBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgYWRwdF9kZXZpY2UqIGRwdGRldmljZTsJLyogZHB0IHBlciBkZXZpY2UgaW5mb3JtYXRpb24gKi8KKwl1MzIgbXNnWzVdOworCWludCByY29kZTsKKworCWlmKGNtZC0+c2VyaWFsX251bWJlciA9PSAwKXsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisJcEhiYSA9IChhZHB0X2hiYSopIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YVswXTsKKwlwcmludGsoS0VSTl9JTkZPIiVzOiBUcnlpbmcgdG8gQWJvcnQgY21kPSVsZFxuIixwSGJhLT5uYW1lLCBjbWQtPnNlcmlhbF9udW1iZXIpOworCWlmICgoZHB0ZGV2aWNlID0gKHZvaWQqKSAoY21kLT5kZXZpY2UtPmhvc3RkYXRhKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gYWJvcnQ6IE5vIGRldmljZSBpbiBjbW5kXG4iLHBIYmEtPm5hbWUpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCW1lbXNldChtc2csIDAsIHNpemVvZihtc2cpKTsKKwltc2dbMF0gPSBGSVZFX1dPUkRfTVNHX1NJWkV8U0dMX09GRlNFVF8wOworCW1zZ1sxXSA9IEkyT19DTURfU0NTSV9BQk9SVDw8MjR8SE9TVF9USUQ8PDEyfGRwdGRldmljZS0+dGlkOworCW1zZ1syXSA9IDA7CisJbXNnWzNdPSAwOyAKKwltc2dbNF0gPSAodTMyKWNtZDsKKwlpZiggKHJjb2RlID0gYWRwdF9pMm9fcG9zdF93YWl0KHBIYmEsIG1zZywgc2l6ZW9mKG1zZyksIEZPUkVWRVIpKSAhPSAwKXsKKwkJaWYocmNvZGUgPT0gLUVPUE5PVFNVUFAgKXsKKwkJCXByaW50ayhLRVJOX0lORk8iJXM6IEFib3J0IGNtZCBub3Qgc3VwcG9ydGVkXG4iLHBIYmEtPm5hbWUpOworCQkJcmV0dXJuIEZBSUxFRDsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPIiVzOiBBYm9ydCBjbWQ9JWxkIGZhaWxlZC5cbiIscEhiYS0+bmFtZSwgY21kLT5zZXJpYWxfbnVtYmVyKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9IAorCXByaW50ayhLRVJOX0lORk8iJXM6IEFib3J0IGNtZD0lbGQgY29tcGxldGUuXG4iLHBIYmEtPm5hbWUsIGNtZC0+c2VyaWFsX251bWJlcik7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKworI2RlZmluZSBJMk9fREVWSUNFX1JFU0VUIDB4MjcKKy8vIFRoaXMgaXMgdGhlIHNhbWUgZm9yIEJMSyBhbmQgU0NTSSBkZXZpY2VzCisvLyBOT1RFIHRoaXMgaXMgd3JvbmcgaW4gdGhlIGkyby5oIGRlZmluaXRpb25zCisvLyBUaGlzIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IG91ciBhZGFwdGVyIGJ1dCB3ZSBpc3N1ZSBpdCBhbnl3YXkKK3N0YXRpYyBpbnQgYWRwdF9kZXZpY2VfcmVzZXQoc3RydWN0IHNjc2lfY21uZCogY21kKQoreworCWFkcHRfaGJhKiBwSGJhOworCXUzMiBtc2dbNF07CisJdTMyIHJjb2RlOworCWludCBvbGRfc3RhdGU7CisJc3RydWN0IGFkcHRfZGV2aWNlKiBkID0gKHZvaWQqKSBjbWQtPmRldmljZS0+aG9zdGRhdGE7CisKKwlwSGJhID0gKHZvaWQqKSBjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF07CisJcHJpbnRrKEtFUk5fSU5GTyIlczogVHJ5aW5nIHRvIHJlc2V0IGRldmljZVxuIixwSGJhLT5uYW1lKTsKKwlpZiAoIWQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyIlczogUmVzZXQgRGV2aWNlOiBEZXZpY2UgTm90IGZvdW5kXG4iLHBIYmEtPm5hbWUpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKwltZW1zZXQobXNnLCAwLCBzaXplb2YobXNnKSk7CisJbXNnWzBdID0gRk9VUl9XT1JEX01TR19TSVpFfFNHTF9PRkZTRVRfMDsKKwltc2dbMV0gPSAoSTJPX0RFVklDRV9SRVNFVDw8MjR8SE9TVF9USUQ8PDEyfGQtPnRpZCk7CisJbXNnWzJdID0gMDsKKwltc2dbM10gPSAwOworCisJb2xkX3N0YXRlID0gZC0+c3RhdGU7CisJZC0+c3RhdGUgfD0gRFBUSV9ERVZfUkVTRVQ7CisJaWYoIChyY29kZSA9IGFkcHRfaTJvX3Bvc3Rfd2FpdChwSGJhLCAodm9pZCopbXNnLHNpemVvZihtc2cpLCBGT1JFVkVSKSkgKXsKKwkJZC0+c3RhdGUgPSBvbGRfc3RhdGU7CisJCWlmKHJjb2RlID09IC1FT1BOT1RTVVBQICl7CisJCQlwcmludGsoS0VSTl9JTkZPIiVzOiBEZXZpY2UgcmVzZXQgbm90IHN1cHBvcnRlZFxuIixwSGJhLT5uYW1lKTsKKwkJCXJldHVybiBGQUlMRUQ7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyIlczogRGV2aWNlIHJlc2V0IGZhaWxlZFxuIixwSGJhLT5uYW1lKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9IGVsc2UgeworCQlkLT5zdGF0ZSA9IG9sZF9zdGF0ZTsKKwkJcHJpbnRrKEtFUk5fSU5GTyIlczogRGV2aWNlIHJlc2V0IHN1Y2Nlc3NmdWxcbiIscEhiYS0+bmFtZSk7CisJCXJldHVybiBTVUNDRVNTOworCX0KK30KKworCisjZGVmaW5lIEkyT19IQkFfQlVTX1JFU0VUIDB4ODcKKy8vIFRoaXMgdmVyc2lvbiBvZiBidXMgcmVzZXQgaXMgY2FsbGVkIGJ5IHRoZSBlaF9lcnJvciBoYW5kbGVyCitzdGF0aWMgaW50IGFkcHRfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQqIGNtZCkKK3sKKwlhZHB0X2hiYSogcEhiYTsKKwl1MzIgbXNnWzRdOworCisJcEhiYSA9IChhZHB0X2hiYSopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhWzBdOworCW1lbXNldChtc2csIDAsIHNpemVvZihtc2cpKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBCdXMgcmVzZXQ6IFNDU0kgQnVzICVkOiB0aWQ6ICVkXG4iLHBIYmEtPm5hbWUsIGNtZC0+ZGV2aWNlLT5jaGFubmVsLHBIYmEtPmNoYW5uZWxbY21kLT5kZXZpY2UtPmNoYW5uZWxdLnRpZCApOworCW1zZ1swXSA9IEZPVVJfV09SRF9NU0dfU0laRXxTR0xfT0ZGU0VUXzA7CisJbXNnWzFdID0gKEkyT19IQkFfQlVTX1JFU0VUPDwyNHxIT1NUX1RJRDw8MTJ8cEhiYS0+Y2hhbm5lbFtjbWQtPmRldmljZS0+Y2hhbm5lbF0udGlkKTsKKwltc2dbMl0gPSAwOworCW1zZ1szXSA9IDA7CisJaWYoYWRwdF9pMm9fcG9zdF93YWl0KHBIYmEsICh2b2lkKiltc2csc2l6ZW9mKG1zZyksIEZPUkVWRVIpICl7CisJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IEJ1cyByZXNldCBmYWlsZWQuXG4iLHBIYmEtPm5hbWUpOworCQlyZXR1cm4gRkFJTEVEOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IEJ1cyByZXNldCBzdWNjZXNzLlxuIixwSGJhLT5uYW1lKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorfQorCisvLyBUaGlzIHZlcnNpb24gb2YgcmVzZXQgaXMgY2FsbGVkIGJ5IHRoZSBlaF9lcnJvcl9oYW5kbGVyCitzdGF0aWMgaW50IGFkcHRfcmVzZXQoc3RydWN0IHNjc2lfY21uZCogY21kKQoreworCWFkcHRfaGJhKiBwSGJhOworCWludCByY29kZTsKKwlwSGJhID0gKGFkcHRfaGJhKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF07CisJcHJpbnRrKEtFUk5fV0FSTklORyIlczogSGJhIFJlc2V0OiBzY3NpIGlkICVkOiB0aWQ6ICVkXG4iLHBIYmEtPm5hbWUsY21kLT5kZXZpY2UtPmNoYW5uZWwscEhiYS0+Y2hhbm5lbFtjbWQtPmRldmljZS0+Y2hhbm5lbF0udGlkICk7CisJcmNvZGUgPSAgYWRwdF9oYmFfcmVzZXQocEhiYSk7CisJaWYocmNvZGUgPT0gMCl7CisJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IEhCQSByZXNldCBjb21wbGV0ZVxuIixwSGJhLT5uYW1lKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyIlczogSEJBIHJlc2V0IGZhaWxlZCAoJXgpXG4iLHBIYmEtPm5hbWUsIHJjb2RlKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9Cit9CisKKy8vIFRoaXMgdmVyc2lvbiBvZiByZXNldCBpcyBjYWxsZWQgYnkgdGhlIGlvY3RscyBhbmQgaW5kaXJlY3RseSBmcm9tIGVoX2Vycm9yX2hhbmRsZXIgdmlhIGFkcHRfcmVzZXQKK3N0YXRpYyBpbnQgYWRwdF9oYmFfcmVzZXQoYWRwdF9oYmEqIHBIYmEpCit7CisJaW50IHJjb2RlOworCisJcEhiYS0+c3RhdGUgfD0gRFBUSV9TVEFURV9SRVNFVDsKKworCS8vIEFjdGl2YXRlIGRvZXMgZ2V0IHN0YXR1cyAsIGluaXQgb3V0Ym91bmQsIGFuZCBnZXQgaHJ0CisJaWYgKChyY29kZT1hZHB0X2kyb19hY3RpdmF0ZV9oYmEocEhiYSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYWN0aXZhdGVcbiIsIHBIYmEtPm5hbWUpOworCQlhZHB0X2kyb19kZWxldGVfaGJhKHBIYmEpOworCQlyZXR1cm4gcmNvZGU7CisJfQorCisJaWYgKChyY29kZT1hZHB0X2kyb19idWlsZF9zeXNfdGFibGUoKSkgPCAwKSB7CisJCWFkcHRfaTJvX2RlbGV0ZV9oYmEocEhiYSk7CisJCXJldHVybiByY29kZTsKKwl9CisJUERFQlVHKCIlczogaW4gSE9MRCBzdGF0ZVxuIixwSGJhLT5uYW1lKTsKKworCWlmICgocmNvZGU9YWRwdF9pMm9fb25saW5lX2hiYShwSGJhKSkgPCAwKSB7CisJCWFkcHRfaTJvX2RlbGV0ZV9oYmEocEhiYSk7CQorCQlyZXR1cm4gcmNvZGU7CisJfQorCVBERUJVRygiJXM6IGluIE9QRVJBVElPTkFMIHN0YXRlXG4iLHBIYmEtPm5hbWUpOworCisJaWYgKChyY29kZT1hZHB0X2kyb19sY3RfZ2V0KHBIYmEpKSA8IDApeworCQlhZHB0X2kyb19kZWxldGVfaGJhKHBIYmEpOworCQlyZXR1cm4gcmNvZGU7CisJfQorCisJaWYgKChyY29kZT1hZHB0X2kyb19yZXBhcnNlX2xjdChwSGJhKSkgPCAwKXsKKwkJYWRwdF9pMm9fZGVsZXRlX2hiYShwSGJhKTsKKwkJcmV0dXJuIHJjb2RlOworCX0KKwlwSGJhLT5zdGF0ZSAmPSB+RFBUSV9TVEFURV9SRVNFVDsKKworCWFkcHRfZmFpbF9wb3N0ZWRfc2NicyhwSGJhKTsKKwlyZXR1cm4gMDsJLyogcmV0dXJuIHN1Y2Nlc3MgKi8KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisKK3N0YXRpYyB2b2lkIGFkcHRfaTJvX3N5c19zaHV0ZG93bih2b2lkKQoreworCWFkcHRfaGJhICpwSGJhLCAqcE5leHQ7CisJc3RydWN0IGFkcHRfaTJvX3Bvc3Rfd2FpdF9kYXRhICpwMSwgKnAyOworCisJIHByaW50ayhLRVJOX0lORk8iU2h1dHRpbmcgZG93biBBZGFwdGVjIEkyTyBjb250cm9sbGVycy5cbiIpOworCSBwcmludGsoS0VSTl9JTkZPIiAgIFRoaXMgY291bGQgdGFrZSBhIGZldyBtaW51dGVzIGlmIHRoZXJlIGFyZSBtYW55IGRldmljZXMgYXR0YWNoZWRcbiIpOworCS8qIERlbGV0ZSBhbGwgSU9QcyBmcm9tIHRoZSBjb250cm9sbGVyIGNoYWluICovCisJLyogVGhleSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVsZWFzZWQgYnkgdGhlCisJICogc2NzaS1jb3JlCisJICovCisJZm9yIChwSGJhID0gaGJhX2NoYWluOyBwSGJhOyBwSGJhID0gcE5leHQpIHsKKwkJcE5leHQgPSBwSGJhLT5uZXh0OworCQlhZHB0X2kyb19kZWxldGVfaGJhKHBIYmEpOworCX0KKworCS8qIFJlbW92ZSBhbnkgdGltZWRvdXQgZW50cmllcyBmcm9tIHRoZSB3YWl0IHF1ZXVlLiAgKi8KKwlwMiA9IE5VTEw7CisvLwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRwdF9wb3N0X3dhaXRfbG9jaywgZmxhZ3MpOworCS8qIE5vdGhpbmcgc2hvdWxkIGJlIG91dHN0YW5kaW5nIGF0IHRoaXMgcG9pbnQgc28ganVzdAorCSAqIGZyZWUgdGhlbSAKKwkgKi8KKwlmb3IocDEgPSBhZHB0X3Bvc3Rfd2FpdF9xdWV1ZTsgcDE7IHAyID0gcDEsIHAxID0gcDItPm5leHQpIHsKKwkJa2ZyZWUocDEpOworCX0KKy8vCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkcHRfcG9zdF93YWl0X2xvY2ssIGZsYWdzKTsKKwlhZHB0X3Bvc3Rfd2FpdF9xdWV1ZSA9IE5VTEw7CisKKwkgcHJpbnRrKEtFUk5fSU5GTyAiQWRhcHRlYyBJMk8gY29udHJvbGxlcnMgZG93bi5cbiIpOworfQorCisvKgorICogcmVib290L3NodXRkb3duIG5vdGlmaWNhdGlvbi4KKyAqCisgKiAtIFF1aWVzY2UgZWFjaCBJT1AgaW4gdGhlIHN5c3RlbQorICoKKyAqLworCisjaWZkZWYgUkVCT09UX05PVElGSUVSCitzdGF0aWMgaW50IGFkcHRfcmVib290X2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbiwgdWxvbmcgY29kZSwgdm9pZCAqcCkKK3sKKworCSBpZihjb2RlICE9IFNZU19SRVNUQVJUICYmIGNvZGUgIT0gU1lTX0hBTFQgJiYgY29kZSAhPSBTWVNfUE9XRVJfT0ZGKQorCQkgIHJldHVybiBOT1RJRllfRE9ORTsKKworCSBhZHB0X2kyb19zeXNfc2h1dGRvd24oKTsKKworCSByZXR1cm4gTk9USUZZX0RPTkU7Cit9CisjZW5kaWYKKworCitzdGF0aWMgaW50IGFkcHRfaW5zdGFsbF9oYmEoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSogc2h0LCBzdHJ1Y3QgcGNpX2RldiogcERldikgCit7CisKKwlhZHB0X2hiYSogcEhiYSA9IE5VTEw7CisJYWRwdF9oYmEqIHAgPSBOVUxMOworCXVsb25nIGJhc2VfYWRkcjBfcGh5cyA9IDA7CisJdWxvbmcgYmFzZV9hZGRyMV9waHlzID0gMDsKKwl1MzIgaGJhX21hcDBfYXJlYV9zaXplID0gMDsKKwl1MzIgaGJhX21hcDFfYXJlYV9zaXplID0gMDsKKwl2b2lkIF9faW9tZW0gKmJhc2VfYWRkcl92aXJ0ID0gTlVMTDsKKwl2b2lkIF9faW9tZW0gKm1zZ19hZGRyX3ZpcnQgPSBOVUxMOworCisJaW50IHJhcHRvckZsYWcgPSBGQUxTRTsKKwlpbnQgaTsKKworCWlmKHBjaV9lbmFibGVfZGV2aWNlKHBEZXYpKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwY2lfc2V0X21hc3RlcihwRGV2KTsKKwlpZiAocGNpX3NldF9kbWFfbWFzayhwRGV2LCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpICYmCisJICAgIHBjaV9zZXRfZG1hX21hc2socERldiwgMHhmZmZmZmZmZlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJYmFzZV9hZGRyMF9waHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBEZXYsMCk7CisJaGJhX21hcDBfYXJlYV9zaXplID0gcGNpX3Jlc291cmNlX2xlbihwRGV2LDApOworCisJLy8gQ2hlY2sgaWYgc3RhbmRhcmQgUENJIGNhcmQgb3Igc2luZ2xlIEJBUiBSYXB0b3IKKwlpZihwRGV2LT5kZXZpY2UgPT0gUENJX0RQVF9ERVZJQ0VfSUQpeworCQlpZihwRGV2LT5zdWJzeXN0ZW1fZGV2aWNlID49MHhjMDMyICYmIHBEZXYtPnN1YnN5c3RlbV9kZXZpY2UgPD0gMHhjMDNiKXsKKwkJCS8vIFJhcHRvciBjYXJkIHdpdGggdGhpcyBkZXZpY2UgaWQgbmVlZHMgNE0KKwkJCWhiYV9tYXAwX2FyZWFfc2l6ZSA9IDB4NDAwMDAwOworCQl9IGVsc2UgeyAvLyBOb3QgUmFwdG9yIC0gaXQgaXMgYSBQQ0kgY2FyZAorCQkJaWYoaGJhX21hcDBfYXJlYV9zaXplID4gMHgxMDAwMDAgKXsgCisJCQkJaGJhX21hcDBfYXJlYV9zaXplID0gMHgxMDAwMDA7CisJCQl9CisJCX0KKwl9IGVsc2Ugey8vIFJhcHRvciBzcGxpdCBCQVIgY29uZmlnCisJCS8vIFVzZSBCQVIxIGluIHRoaXMgY29uZmlndXJhdGlvbgorCQliYXNlX2FkZHIxX3BoeXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocERldiwxKTsKKwkJaGJhX21hcDFfYXJlYV9zaXplID0gcGNpX3Jlc291cmNlX2xlbihwRGV2LDEpOworCQlyYXB0b3JGbGFnID0gVFJVRTsKKwl9CisKKworCWJhc2VfYWRkcl92aXJ0ID0gaW9yZW1hcChiYXNlX2FkZHIwX3BoeXMsaGJhX21hcDBfYXJlYV9zaXplKTsKKwlpZiAoIWJhc2VfYWRkcl92aXJ0KSB7CisJCVBFUlJPUigiZHB0aTogYWRwdF9jb25maWdfaGJhOiBpbyByZW1hcCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKyAgICAgICAgaWYocmFwdG9yRmxhZyA9PSBUUlVFKSB7CisJCW1zZ19hZGRyX3ZpcnQgPSBpb3JlbWFwKGJhc2VfYWRkcjFfcGh5cywgaGJhX21hcDFfYXJlYV9zaXplICk7CisJCWlmICghbXNnX2FkZHJfdmlydCkgeworCQkJUEVSUk9SKCJkcHRpOiBhZHB0X2NvbmZpZ19oYmE6IGlvIHJlbWFwIGZhaWxlZCBvbiBCQVIxXG4iKTsKKwkJCWlvdW5tYXAoYmFzZV9hZGRyX3ZpcnQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQltc2dfYWRkcl92aXJ0ID0gYmFzZV9hZGRyX3ZpcnQ7CisJfQorCQorCS8vIEFsbG9jYXRlIGFuZCB6ZXJvIHRoZSBkYXRhIHN0cnVjdHVyZQorCXBIYmEgPSBrbWFsbG9jKHNpemVvZihhZHB0X2hiYSksIEdGUF9LRVJORUwpOworCWlmKCBwSGJhID09IE5VTEwpIHsKKwkJaWYobXNnX2FkZHJfdmlydCAhPSBiYXNlX2FkZHJfdmlydCl7CisJCQlpb3VubWFwKG1zZ19hZGRyX3ZpcnQpOworCQl9CisJCWlvdW5tYXAoYmFzZV9hZGRyX3ZpcnQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHBIYmEsIDAsIHNpemVvZihhZHB0X2hiYSkpOworCisJZG93bigmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCWZvcihpPTA7aTxEUFRJX01BWF9IQkE7aSsrKSB7CisJCWlmKGhiYXNbaV09PU5VTEwpIHsKKwkJCWhiYXNbaV09cEhiYTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYoaGJhX2NoYWluICE9IE5VTEwpeworCQlmb3IocCA9IGhiYV9jaGFpbjsgcC0+bmV4dDsgcCA9IHAtPm5leHQpOworCQlwLT5uZXh0ID0gcEhiYTsKKwl9IGVsc2UgeworCQloYmFfY2hhaW4gPSBwSGJhOworCX0KKwlwSGJhLT5uZXh0ID0gTlVMTDsKKwlwSGJhLT51bml0ID0gaGJhX2NvdW50OworCXNwcmludGYocEhiYS0+bmFtZSwgImRwdGklZCIsIGkpOworCWhiYV9jb3VudCsrOworCQorCXVwKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisKKwlwSGJhLT5wRGV2ID0gcERldjsKKwlwSGJhLT5iYXNlX2FkZHJfcGh5cyA9IGJhc2VfYWRkcjBfcGh5czsKKworCS8vIFNldCB1cCB0aGUgVmlydHVhbCBCYXNlIEFkZHJlc3Mgb2YgdGhlIEkyTyBEZXZpY2UKKwlwSGJhLT5iYXNlX2FkZHJfdmlydCA9IGJhc2VfYWRkcl92aXJ0OworCXBIYmEtPm1zZ19hZGRyX3ZpcnQgPSBtc2dfYWRkcl92aXJ0OworCXBIYmEtPmlycV9tYXNrID0gYmFzZV9hZGRyX3ZpcnQrMHgzMDsKKwlwSGJhLT5wb3N0X3BvcnQgPSBiYXNlX2FkZHJfdmlydCsweDQwOworCXBIYmEtPnJlcGx5X3BvcnQgPSBiYXNlX2FkZHJfdmlydCsweDQ0OworCisJcEhiYS0+aHJ0ID0gTlVMTDsKKwlwSGJhLT5sY3QgPSBOVUxMOworCXBIYmEtPmxjdF9zaXplID0gMDsKKwlwSGJhLT5zdGF0dXNfYmxvY2sgPSBOVUxMOworCXBIYmEtPnBvc3RfY291bnQgPSAwOworCXBIYmEtPnN0YXRlID0gRFBUSV9TVEFURV9SRVNFVDsKKwlwSGJhLT5wRGV2ID0gcERldjsKKwlwSGJhLT5kZXZpY2VzID0gTlVMTDsKKworCS8vIEluaXRpYWxpemluZyB0aGUgc3BpbmxvY2tzCisJc3Bpbl9sb2NrX2luaXQoJnBIYmEtPnN0YXRlX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZhZHB0X3Bvc3Rfd2FpdF9sb2NrKTsKKworCWlmKHJhcHRvckZsYWcgPT0gMCl7CisJCXByaW50ayhLRVJOX0lORk8iQWRhcHRlYyBJMk8gUkFJRCBjb250cm9sbGVyICVkIGF0ICVwIHNpemU9JXggaXJxPSVkXG4iLCAKKwkJCWhiYV9jb3VudC0xLCBiYXNlX2FkZHJfdmlydCwgaGJhX21hcDBfYXJlYV9zaXplLCBwRGV2LT5pcnEpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8iQWRhcHRlYyBJMk8gUkFJRCBjb250cm9sbGVyICVkIGlycT0lZFxuIixoYmFfY291bnQtMSwgcERldi0+aXJxKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyIgICAgIEJBUjAgJXAgLSBzaXplPSAleFxuIixiYXNlX2FkZHJfdmlydCxoYmFfbWFwMF9hcmVhX3NpemUpOworCQlwcmludGsoS0VSTl9JTkZPIiAgICAgQkFSMSAlcCAtIHNpemU9ICV4XG4iLG1zZ19hZGRyX3ZpcnQsaGJhX21hcDFfYXJlYV9zaXplKTsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEgKHBEZXYtPmlycSwgYWRwdF9pc3IsIFNBX1NISVJRLCBwSGJhLT5uYW1lLCBwSGJhKSkgeworCQlwcmludGsoS0VSTl9FUlIiJXM6IENvdWxkbid0IHJlZ2lzdGVyIElSUSAlZFxuIiwgcEhiYS0+bmFtZSwgcERldi0+aXJxKTsKKwkJYWRwdF9pMm9fZGVsZXRlX2hiYShwSGJhKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgYWRwdF9pMm9fZGVsZXRlX2hiYShhZHB0X2hiYSogcEhiYSkKK3sKKwlhZHB0X2hiYSogcDE7CisJYWRwdF9oYmEqIHAyOworCXN0cnVjdCBpMm9fZGV2aWNlKiBkOworCXN0cnVjdCBpMm9fZGV2aWNlKiBuZXh0OworCWludCBpOworCWludCBqOworCXN0cnVjdCBhZHB0X2RldmljZSogcERldjsKKwlzdHJ1Y3QgYWRwdF9kZXZpY2UqIHBOZXh0OworCisKKwlkb3duKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisJLy8gc2NzaV91bnJlZ2lzdGVyIGNhbGxzIG91ciBhZHB0X3JlbGVhc2Ugd2hpY2gKKwkvLyBkb2VzIGEgcXVpZXNlCisJaWYocEhiYS0+aG9zdCl7CisJCWZyZWVfaXJxKHBIYmEtPmhvc3QtPmlycSwgcEhiYSk7CisJfQorCWZvcihpPTA7aTxEUFRJX01BWF9IQkE7aSsrKSB7CisJCWlmKGhiYXNbaV09PXBIYmEpIHsKKwkJCWhiYXNbaV0gPSBOVUxMOworCQl9CisJfQorCXAyID0gTlVMTDsKKwlmb3IoIHAxID0gaGJhX2NoYWluOyBwMTsgcDIgPSBwMSxwMT1wMS0+bmV4dCl7CisJCWlmKHAxID09IHBIYmEpIHsKKwkJCWlmKHAyKSB7CisJCQkJcDItPm5leHQgPSBwMS0+bmV4dDsKKwkJCX0gZWxzZSB7CisJCQkJaGJhX2NoYWluID0gcDEtPm5leHQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKworCWhiYV9jb3VudC0tOworCXVwKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisKKwlpb3VubWFwKHBIYmEtPmJhc2VfYWRkcl92aXJ0KTsKKwlpZihwSGJhLT5tc2dfYWRkcl92aXJ0ICE9IHBIYmEtPmJhc2VfYWRkcl92aXJ0KXsKKwkJaW91bm1hcChwSGJhLT5tc2dfYWRkcl92aXJ0KTsKKwl9CisJaWYocEhiYS0+aHJ0KSB7CisJCWtmcmVlKHBIYmEtPmhydCk7CisJfQorCWlmKHBIYmEtPmxjdCl7CisJCWtmcmVlKHBIYmEtPmxjdCk7CisJfQorCWlmKHBIYmEtPnN0YXR1c19ibG9jaykgeworCQlrZnJlZShwSGJhLT5zdGF0dXNfYmxvY2spOworCX0KKwlpZihwSGJhLT5yZXBseV9wb29sKXsKKwkJa2ZyZWUocEhiYS0+cmVwbHlfcG9vbCk7CisJfQorCisJZm9yKGQgPSBwSGJhLT5kZXZpY2VzOyBkIDsgZCA9IG5leHQpeworCQluZXh0ID0gZC0+bmV4dDsKKwkJa2ZyZWUoZCk7CisJfQorCWZvcihpID0gMCA7IGkgPCBwSGJhLT50b3Bfc2NzaV9jaGFubmVsIDsgaSsrKXsKKwkJZm9yKGogPSAwOyBqIDwgTUFYX0lEOyBqKyspeworCQkJaWYocEhiYS0+Y2hhbm5lbFtpXS5kZXZpY2Vbal0gIT0gTlVMTCl7CisJCQkJZm9yKHBEZXYgPSBwSGJhLT5jaGFubmVsW2ldLmRldmljZVtqXTsgcERldjsgcERldiA9IHBOZXh0KXsKKwkJCQkJcE5leHQgPSBwRGV2LT5uZXh0X2x1bjsKKwkJCQkJa2ZyZWUocERldik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWtmcmVlKHBIYmEpOworCisJaWYoaGJhX2NvdW50IDw9IDApeworCQl1bnJlZ2lzdGVyX2NocmRldihEUFRJX0kyT19NQUpPUiwgRFBUX0RSSVZFUik7ICAgCisJfQorfQorCisKK3N0YXRpYyBpbnQgYWRwdF9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlwcmludGsoIkxvYWRpbmcgQWRhcHRlYyBJMk8gUkFJRDogVmVyc2lvbiAiIERQVF9JMk9fVkVSU0lPTiAiXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgRFBUSV9NQVhfSEJBOyBpKyspIHsKKwkJaGJhc1tpXSA9IE5VTEw7CisJfQorI2lmZGVmIFJFQk9PVF9OT1RJRklFUgorCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmYWRwdF9yZWJvb3Rfbm90aWZpZXIpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGFkcHRfZGV2aWNlKiBhZHB0X2ZpbmRfZGV2aWNlKGFkcHRfaGJhKiBwSGJhLCB1MzIgY2hhbiwgdTMyIGlkLCB1MzIgbHVuKQoreworCXN0cnVjdCBhZHB0X2RldmljZSogZDsKKworCWlmKGNoYW4gPCAwIHx8IGNoYW4gPj0gTUFYX0NIQU5ORUwpCisJCXJldHVybiBOVUxMOworCQorCWlmKCBwSGJhLT5jaGFubmVsW2NoYW5dLmRldmljZSA9PSBOVUxMKXsKKwkJcHJpbnRrKEtFUk5fREVCVUciQWRhcHRlYyBJMk8gUkFJRDogVHJ5aW5nIHRvIGZpbmQgZGV2aWNlIGJlZm9yZSB0aGV5IGFyZSBhbGxvY2F0ZWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkID0gcEhiYS0+Y2hhbm5lbFtjaGFuXS5kZXZpY2VbaWRdOworCWlmKCFkIHx8IGQtPnRpZCA9PSAwKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIElmIGl0IGlzIHRoZSBvbmx5IGx1biBhdCB0aGF0IGFkZHJlc3MgdGhlbiB0aGlzIHNob3VsZCBtYXRjaCovCisJaWYoZC0+c2NzaV9sdW4gPT0gbHVuKXsKKwkJcmV0dXJuIGQ7CisJfQorCisJLyogZWxzZSB3ZSBuZWVkIHRvIGxvb2sgdGhyb3VnaCBhbGwgdGhlIGx1bnMgKi8KKwlmb3IoZD1kLT5uZXh0X2x1biA7IGQgOyBkID0gZC0+bmV4dF9sdW4peworCQlpZihkLT5zY3NpX2x1biA9PSBsdW4peworCQkJcmV0dXJuIGQ7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIGludCBhZHB0X2kyb19wb3N0X3dhaXQoYWRwdF9oYmEqIHBIYmEsIHUzMiogbXNnLCBpbnQgbGVuLCBpbnQgdGltZW91dCkKK3sKKwkvLyBJIHVzZWQgbXkgb3duIHZlcnNpb24gb2YgdGhlIFdBSVRfUVVFVUVfSEVBRAorCS8vIHRvIGhhbmRsZSBzb21lIHZlcnNpb24gZGlmZmVyZW5jZXMKKwkvLyBXaGVuIGVtYmVkZGVkIGluIHRoZSBrZXJuZWwgdGhpcyBjb3VsZCBnbyBiYWNrIHRvIHRoZSB2YW5pbGxhIG9uZQorCUFEUFRfREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYWRwdF93cV9pMm9fcG9zdCk7CisJaW50IHN0YXR1cyA9IDA7CisJdWxvbmcgZmxhZ3MgPSAwOworCXN0cnVjdCBhZHB0X2kyb19wb3N0X3dhaXRfZGF0YSAqcDEsICpwMjsKKwlzdHJ1Y3QgYWRwdF9pMm9fcG9zdF93YWl0X2RhdGEgKndhaXRfZGF0YSA9CisJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZHB0X2kyb19wb3N0X3dhaXRfZGF0YSksR0ZQX0tFUk5FTCk7CisJYWRwdF93YWl0X3F1ZXVlX3Qgd2FpdDsKKworCWlmKCF3YWl0X2RhdGEpeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyoKKwkgKiBUaGUgc3BpbiBsb2NraW5nIGlzIG5lZWRlZCB0byBrZWVwIGFueW9uZSBmcm9tIHBsYXlpbmcKKwkgKiB3aXRoIHRoZSBxdWV1ZSBwb2ludGVycyBhbmQgaWQgd2hpbGUgd2UgZG8gdGhlIHNhbWUKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRwdF9wb3N0X3dhaXRfbG9jaywgZmxhZ3MpOworICAgICAgIC8vIFRPRE8gd2UgbmVlZCBhIE1PUkUgdW5pcXVlIHdheSBvZiBnZXR0aW5nIGlkcworICAgICAgIC8vIHRvIHN1cHBvcnQgYXN5bmMgTENUIGdldAorCXdhaXRfZGF0YS0+bmV4dCA9IGFkcHRfcG9zdF93YWl0X3F1ZXVlOworCWFkcHRfcG9zdF93YWl0X3F1ZXVlID0gd2FpdF9kYXRhOworCWFkcHRfcG9zdF93YWl0X2lkKys7CisJYWRwdF9wb3N0X3dhaXRfaWQgJj0gMHg3ZmZmOworCXdhaXRfZGF0YS0+aWQgPSAgYWRwdF9wb3N0X3dhaXRfaWQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRwdF9wb3N0X3dhaXRfbG9jaywgZmxhZ3MpOworCisJd2FpdF9kYXRhLT53cSA9ICZhZHB0X3dxX2kyb19wb3N0OworCXdhaXRfZGF0YS0+c3RhdHVzID0gLUVUSU1FRE9VVDsKKworCS8vIHRoaXMgY29kZSBpcyB0YWtlbiBmcm9tIGtlcm5lbC9zY2hlZC5jOmludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dAorCXdhaXQudGFzayA9IGN1cnJlbnQ7CisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZhZHB0X3dxX2kyb19wb3N0LmxvY2ssIGZsYWdzKTsKKwlfX2FkZF93YWl0X3F1ZXVlKCZhZHB0X3dxX2kyb19wb3N0LCAmd2FpdCk7CisJc3Bpbl91bmxvY2soJmFkcHRfd3FfaTJvX3Bvc3QubG9jayk7CisKKwltc2dbMl0gfD0gMHg4MDAwMDAwMCB8ICgodTMyKXdhaXRfZGF0YS0+aWQpOworCXRpbWVvdXQgKj0gSFo7CisJaWYoKHN0YXR1cyA9IGFkcHRfaTJvX3Bvc3RfdGhpcyhwSGJhLCBtc2csIGxlbikpID09IDApeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZihwSGJhLT5ob3N0KQorCQkJc3Bpbl91bmxvY2tfaXJxKHBIYmEtPmhvc3QtPmhvc3RfbG9jayk7CisJCWlmICghdGltZW91dCkKKwkJCXNjaGVkdWxlKCk7CisJCWVsc2V7CisJCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwkJCWlmICh0aW1lb3V0ID09IDApIHsKKwkJCQkvLyBJL08gaXNzdWVkLCBidXQgY2Fubm90IGdldCByZXN1bHQgaW4KKwkJCQkvLyBzcGVjaWZpZWQgdGltZS4gRnJlZWluZyByZXNvcmNlcyBpcworCQkJCS8vIGRhbmdlcm91cy4KKwkJCQlzdGF0dXMgPSAtRVRJTUU7CisJCQl9CisJCX0KKwkJaWYocEhiYS0+aG9zdCkKKwkJCXNwaW5fbG9ja19pcnEocEhiYS0+aG9zdC0+aG9zdF9sb2NrKTsKKwl9CisJc3Bpbl9sb2NrX2lycSgmYWRwdF93cV9pMm9fcG9zdC5sb2NrKTsKKwlfX3JlbW92ZV93YWl0X3F1ZXVlKCZhZHB0X3dxX2kyb19wb3N0LCAmd2FpdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRwdF93cV9pMm9fcG9zdC5sb2NrLCBmbGFncyk7CisKKwlpZihzdGF0dXMgPT0gLUVUSU1FRE9VVCl7CisJCXByaW50ayhLRVJOX0lORk8iZHB0aSVkOiBQT1NUIFdBSVQgVElNRU9VVFxuIixwSGJhLT51bml0KTsKKwkJLy8gV2Ugd2lsbCBoYXZlIHRvIGZyZWUgdGhlIHdhaXRfZGF0YSBtZW1vcnkgZHVyaW5nIHNodXRkb3duCisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogUmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBxdWV1ZS4gICovCisJcDIgPSBOVUxMOworCXNwaW5fbG9ja19pcnFzYXZlKCZhZHB0X3Bvc3Rfd2FpdF9sb2NrLCBmbGFncyk7CisJZm9yKHAxID0gYWRwdF9wb3N0X3dhaXRfcXVldWU7IHAxOyBwMiA9IHAxLCBwMSA9IHAxLT5uZXh0KSB7CisJCWlmKHAxID09IHdhaXRfZGF0YSkgeworCQkJaWYocDEtPnN0YXR1cyA9PSBJMk9fREVUQUlMX1NUQVRVU19VTlNVUFBPUlRFRF9GVU5DVElPTiApIHsKKwkJCQlzdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJCX0KKwkJCWlmKHAyKSB7CisJCQkJcDItPm5leHQgPSBwMS0+bmV4dDsKKwkJCX0gZWxzZSB7CisJCQkJYWRwdF9wb3N0X3dhaXRfcXVldWUgPSBwMS0+bmV4dDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkcHRfcG9zdF93YWl0X2xvY2ssIGZsYWdzKTsKKworCWtmcmVlKHdhaXRfZGF0YSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXRpYyBzMzIgYWRwdF9pMm9fcG9zdF90aGlzKGFkcHRfaGJhKiBwSGJhLCB1MzIqIGRhdGEsIGludCBsZW4pCit7CisKKwl1MzIgbSA9IEVNUFRZX1FVRVVFOworCXUzMiBfX2lvbWVtICptc2c7CisJdWxvbmcgdGltZW91dCA9IGppZmZpZXMgKyAzMCpIWjsKKwlkbyB7CisJCXJtYigpOworCQltID0gcmVhZGwocEhiYS0+cG9zdF9wb3J0KTsKKwkJaWYgKG0gIT0gRU1QVFlfUVVFVUUpIHsKKwkJCWJyZWFrOworCQl9CisJCWlmKHRpbWVfYWZ0ZXIoamlmZmllcyx0aW1lb3V0KSl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HImRwdGklZDogVGltZW91dCB3YWl0aW5nIGZvciBtZXNzYWdlIGZyYW1lIVxuIiwgcEhiYS0+dW5pdCk7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfSB3aGlsZShtID09IEVNUFRZX1FVRVVFKTsKKwkJCisJbXNnID0gcEhiYS0+bXNnX2FkZHJfdmlydCArIG07CisJbWVtY3B5X3RvaW8obXNnLCBkYXRhLCBsZW4pOworCXdtYigpOworCisJLy9wb3N0IG1lc3NhZ2UKKwl3cml0ZWwobSwgcEhiYS0+cG9zdF9wb3J0KTsKKwl3bWIoKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGFkcHRfaTJvX3Bvc3Rfd2FpdF9jb21wbGV0ZSh1MzIgY29udGV4dCwgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgYWRwdF9pMm9fcG9zdF93YWl0X2RhdGEgKnAxID0gTlVMTDsKKwkvKgorCSAqIFdlIG5lZWQgdG8gc2VhcmNoIHRocm91Z2ggdGhlIGFkcHRfcG9zdF93YWl0CisJICogcXVldWUgdG8gc2VlIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIHN0aWxsCisJICogb3V0c3RhbmRpbmcuICBJZiBub3QsIGl0IG1lYW5zIHRoYXQgdGhlIElPUAorCSAqIHRvb2sgbG9uZ2VyIHRvIHJlc3BvbmQgdG8gdGhlIG1lc3NhZ2UgdGhhbiB3ZQorCSAqIGhhZCBhbGxvd2VkIGFuZCB0aW1lciBoYXMgYWxyZWFkeSBleHBpcmVkLgorCSAqIE5vdCBtdWNoIHdlIGNhbiBkbyBhYm91dCB0aGF0IGV4Y2VwdCBsb2cKKwkgKiBpdCBmb3IgZGVidWcgcHVycG9zZXMsIGluY3JlYXNlIHRpbWVvdXQsIGFuZCByZWNvbXBpbGUKKwkgKgorCSAqIExvY2sgbmVlZGVkIHRvIGtlZXAgYW55b25lIGZyb20gbW92aW5nIHF1ZXVlIHBvaW50ZXJzCisJICogYXJvdW5kIHdoaWxlIHdlJ3JlIGxvb2tpbmcgdGhyb3VnaCB0aGVtLgorCSAqLworCisJY29udGV4dCAmPSAweDdmZmY7CisKKwlzcGluX2xvY2soJmFkcHRfcG9zdF93YWl0X2xvY2spOworCWZvcihwMSA9IGFkcHRfcG9zdF93YWl0X3F1ZXVlOyBwMTsgcDEgPSBwMS0+bmV4dCkgeworCQlpZihwMS0+aWQgPT0gY29udGV4dCkgeworCQkJcDEtPnN0YXR1cyA9IHN0YXR1czsKKwkJCXNwaW5fdW5sb2NrKCZhZHB0X3Bvc3Rfd2FpdF9sb2NrKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZShwMS0+d3EpOworCQkJcmV0dXJuOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZhZHB0X3Bvc3Rfd2FpdF9sb2NrKTsKKyAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zIHdlIGxvc2UgY29tbWFuZHMgdGhhdCBwcm9iYWJseSByZWFsbHkgY29tcGxldGVkCisJcHJpbnRrKEtFUk5fREVCVUciZHB0aTogQ291bGQgTm90IGZpbmQgdGFzayAlZCBpbiB3YWl0IHF1ZXVlXG4iLGNvbnRleHQpOworCXByaW50ayhLRVJOX0RFQlVHIiAgICAgIFRhc2tzIGluIHdhaXQgcXVldWU6XG4iKTsKKwlmb3IocDEgPSBhZHB0X3Bvc3Rfd2FpdF9xdWV1ZTsgcDE7IHAxID0gcDEtPm5leHQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUciICAgICAgICAgICAlZFxuIixwMS0+aWQpOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyBzMzIgYWRwdF9pMm9fcmVzZXRfaGJhKGFkcHRfaGJhKiBwSGJhKQkJCQoreworCXUzMiBtc2dbOF07CisJdTgqIHN0YXR1czsKKwl1MzIgbSA9IEVNUFRZX1FVRVVFIDsKKwl1bG9uZyB0aW1lb3V0ID0gamlmZmllcyArIChUTU9VVF9JT1BSRVNFVCpIWik7CisKKwlpZihwSGJhLT5pbml0aWFsaXplZCAgPT0gRkFMU0UpIHsJLy8gRmlyc3QgdGltZSByZXNldCBzaG91bGQgYmUgcXVpY2sKKwkJdGltZW91dCA9IGppZmZpZXMgKyAoMjUqSFopOworCX0gZWxzZSB7CisJCWFkcHRfaTJvX3F1aWVzY2VfaGJhKHBIYmEpOworCX0KKworCWRvIHsKKwkJcm1iKCk7CisJCW0gPSByZWFkbChwSGJhLT5wb3N0X3BvcnQpOworCQlpZiAobSAhPSBFTVBUWV9RVUVVRSkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYodGltZV9hZnRlcihqaWZmaWVzLHRpbWVvdXQpKXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkciVGltZW91dCB3YWl0aW5nIGZvciBtZXNzYWdlIVxuIik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfSB3aGlsZSAobSA9PSBFTVBUWV9RVUVVRSk7CisKKwlzdGF0dXMgPSAodTgqKWttYWxsb2MoNCwgR0ZQX0tFUk5FTHxBRERSMzIpOworCWlmKHN0YXR1cyA9PSBOVUxMKSB7CisJCWFkcHRfc2VuZF9ub3AocEhiYSwgbSk7CisJCXByaW50ayhLRVJOX0VSUiJJT1AgcmVzZXQgZmFpbGVkIC0gbm8gZnJlZSBtZW1vcnkuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChzdGF0dXMsMCw0KTsKKworCW1zZ1swXT1FSUdIVF9XT1JEX01TR19TSVpFfFNHTF9PRkZTRVRfMDsKKwltc2dbMV09STJPX0NNRF9BREFQVEVSX1JFU0VUPDwyNHxIT1NUX1RJRDw8MTJ8QURBUFRFUl9USUQ7CisJbXNnWzJdPTA7CisJbXNnWzNdPTA7CisJbXNnWzRdPTA7CisJbXNnWzVdPTA7CisJbXNnWzZdPXZpcnRfdG9fYnVzKHN0YXR1cyk7CisJbXNnWzddPTA7ICAgICAKKworCW1lbWNweV90b2lvKHBIYmEtPm1zZ19hZGRyX3ZpcnQrbSwgbXNnLCBzaXplb2YobXNnKSk7CisJd21iKCk7CisJd3JpdGVsKG0sIHBIYmEtPnBvc3RfcG9ydCk7CisJd21iKCk7CisKKwl3aGlsZSgqc3RhdHVzID09IDApeworCQlpZih0aW1lX2FmdGVyKGppZmZpZXMsdGltZW91dCkpeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyIlczogSU9QIFJlc2V0IFRpbWVvdXRcbiIscEhiYS0+bmFtZSk7CisJCQlrZnJlZShzdGF0dXMpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwkJcm1iKCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisKKwlpZigqc3RhdHVzID09IDB4MDEgLypJMk9fRVhFQ19JT1BfUkVTRVRfSU5fUFJPR1JFU1MqLykgeworCQlQREVCVUcoIiVzOiBSZXNldCBpbiBwcm9ncmVzcy4uLlxuIiwgcEhiYS0+bmFtZSk7CisJCS8vIEhlcmUgd2Ugd2FpdCBmb3IgbWVzc2FnZSBmcmFtZSB0byBiZWNvbWUgYXZhaWxhYmxlCisJCS8vIGluZGljYXRlZCB0aGF0IHJlc2V0IGhhcyBmaW5pc2hlZAorCQlkbyB7CisJCQlybWIoKTsKKwkJCW0gPSByZWFkbChwSGJhLT5wb3N0X3BvcnQpOworCQkJaWYgKG0gIT0gRU1QVFlfUVVFVUUpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmKHRpbWVfYWZ0ZXIoamlmZmllcyx0aW1lb3V0KSl7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczpUaW1lb3V0IHdhaXRpbmcgZm9yIElPUCBSZXNldC5cbiIscEhiYS0+bmFtZSk7CisJCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCQl9CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQl9IHdoaWxlIChtID09IEVNUFRZX1FVRVVFKTsKKwkJLy8gRmx1c2ggdGhlIG9mZnNldAorCQlhZHB0X3NlbmRfbm9wKHBIYmEsIG0pOworCX0KKwlhZHB0X2kyb19zdGF0dXNfZ2V0KHBIYmEpOworCWlmKCpzdGF0dXMgPT0gMHgwMiB8fAorCQkJcEhiYS0+c3RhdHVzX2Jsb2NrLT5pb3Bfc3RhdGUgIT0gQURBUFRFUl9TVEFURV9SRVNFVCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBSZXNldCByZWplY3QsIHRyeWluZyB0byBjbGVhclxuIiwKKwkJCQlwSGJhLT5uYW1lKTsKKwl9IGVsc2UgeworCQlQREVCVUcoIiVzOiBSZXNldCBjb21wbGV0ZWQuXG4iLCBwSGJhLT5uYW1lKTsKKwl9CisKKwlrZnJlZShzdGF0dXMpOworI2lmZGVmIFVBUlRERUxBWQorCS8vIFRoaXMgZGVsYXkgaXMgdG8gYWxsb3cgc29tZW9uZSBhdHRhY2hlZCB0byB0aGUgY2FyZCB0aHJvdWdoIHRoZSBkZWJ1ZyBVQVJUIHRvIAorCS8vIHNldCB1cCB0aGUgZHVtcCBsZXZlbHMgdGhhdCB0aGV5IHdhbnQgYmVmb3JlIHRoZSByZXN0IG9mIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZQorCWFkcHRfZGVsYXkoMjAwMDApOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBhZHB0X2kyb19wYXJzZV9sY3QoYWRwdF9oYmEqIHBIYmEpCit7CisJaW50IGk7CisJaW50IG1heDsKKwlpbnQgdGlkOworCXN0cnVjdCBpMm9fZGV2aWNlICpkOworCWkyb19sY3QgKmxjdCA9IHBIYmEtPmxjdDsKKwl1OCBidXNfbm8gPSAwOworCXMxNiBzY3NpX2lkOworCXMxNiBzY3NpX2x1bjsKKwl1MzIgYnVmWzEwXTsgLy8gbGFyZ2VyIHRoYW4gNywgb3IgOCAuLi4KKwlzdHJ1Y3QgYWRwdF9kZXZpY2UqIHBEZXY7IAorCQorCWlmIChsY3QgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBMQ1QgaXMgZW1wdHk/Pz9cbiIscEhiYS0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJCisJbWF4ID0gbGN0LT50YWJsZV9zaXplOwkKKwltYXggLT0gMzsKKwltYXggLz0gOTsKKworCWZvcihpPTA7aTxtYXg7aSsrKSB7CisJCWlmKCBsY3QtPmxjdF9lbnRyeVtpXS51c2VyX3RpZCAhPSAweGZmZil7CisJCQkvKgorCQkJICogSWYgd2UgaGF2ZSBoaWRkZW4gZGV2aWNlcywgd2UgbmVlZCB0byBpbmZvcm0gdGhlIHVwcGVyIGxheWVycyBhYm91dAorCQkJICogdGhlIHBvc3NpYmxlIG1heGltdW0gaWQgcmVmZXJlbmNlIHRvIGhhbmRsZSBkZXZpY2UgYWNjZXNzIHdoZW4KKwkJCSAqIGFuIGFycmF5IGlzIGRpc2Fzc2VtYmxlZC4gVGhpcyBjb2RlIGhhcyBubyBvdGhlciBwdXJwb3NlIGJ1dCB0bworCQkJICogYWxsb3cgdXMgZnV0dXJlIGFjY2VzcyB0byBkZXZpY2VzIHRoYXQgYXJlIGN1cnJlbnRseSBoaWRkZW4KKwkJCSAqIGJlaGluZCBhcnJheXMsIGhvdHNwYXJlcyBvciBoYXZlIG5vdCBiZWVuIGNvbmZpZ3VyZWQgKEpCT0QgbW9kZSkuCisJCQkgKi8KKwkJCWlmKCBsY3QtPmxjdF9lbnRyeVtpXS5jbGFzc19pZCAhPSBJMk9fQ0xBU1NfUkFORE9NX0JMT0NLX1NUT1JBR0UgJiYKKwkJCSAgICBsY3QtPmxjdF9lbnRyeVtpXS5jbGFzc19pZCAhPSBJMk9fQ0xBU1NfU0NTSV9QRVJJUEhFUkFMICYmCisJCQkgICAgbGN0LT5sY3RfZW50cnlbaV0uY2xhc3NfaWQgIT0gSTJPX0NMQVNTX0ZJQlJFX0NIQU5ORUxfUEVSSVBIRVJBTCApeworCQkJICAgIAljb250aW51ZTsKKwkJCX0KKwkJCXRpZCA9IGxjdC0+bGN0X2VudHJ5W2ldLnRpZDsKKwkJCS8vIEkyT19EUFRfREVWSUNFX0lORk9fR1JPVVBfTk87CisJCQlpZihhZHB0X2kyb19xdWVyeV9zY2FsYXIocEhiYSwgdGlkLCAweDgwMDAsIC0xLCBidWYsIDMyKTwwKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlidXNfbm8gPSBidWZbMF0+PjE2OworCQkJc2NzaV9pZCA9IGJ1ZlsxXTsKKwkJCXNjc2lfbHVuID0gKGJ1ZlsyXT4+OCApJjB4ZmY7CisJCQlpZihidXNfbm8gPj0gTUFYX0NIQU5ORUwpIHsJLy8gU29tZXRoaW5nIHdyb25nIHNraXAgaXQKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBDaGFubmVsIG51bWJlciAlZCBvdXQgb2YgcmFuZ2UgXG4iLCBwSGJhLT5uYW1lLCBidXNfbm8pOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHNjc2lfaWQgPj0gTUFYX0lEKXsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBTQ1NJIElEICVkIG91dCBvZiByYW5nZSBcbiIsIHBIYmEtPm5hbWUsIGJ1c19ubyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZihidXNfbm8gPiBwSGJhLT50b3Bfc2NzaV9jaGFubmVsKXsKKwkJCQlwSGJhLT50b3Bfc2NzaV9jaGFubmVsID0gYnVzX25vOworCQkJfQorCQkJaWYoc2NzaV9pZCA+IHBIYmEtPnRvcF9zY3NpX2lkKXsKKwkJCQlwSGJhLT50b3Bfc2NzaV9pZCA9IHNjc2lfaWQ7CisJCQl9CisJCQlpZihzY3NpX2x1biA+IHBIYmEtPnRvcF9zY3NpX2x1bil7CisJCQkJcEhiYS0+dG9wX3Njc2lfbHVuID0gc2NzaV9sdW47CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlkID0gKHN0cnVjdCBpMm9fZGV2aWNlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGkyb19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwkJaWYoZD09TlVMTCkKKwkJeworCQkJcHJpbnRrKEtFUk5fQ1JJVCIlczogT3V0IG9mIG1lbW9yeSBmb3IgSTJPIGRldmljZSBkYXRhLlxuIixwSGJhLT5uYW1lKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCQorCQlkLT5jb250cm9sbGVyID0gKHZvaWQqKXBIYmE7CisJCWQtPm5leHQgPSBOVUxMOworCisJCW1lbWNweSgmZC0+bGN0X2RhdGEsICZsY3QtPmxjdF9lbnRyeVtpXSwgc2l6ZW9mKGkyb19sY3RfZW50cnkpKTsKKworCQlkLT5mbGFncyA9IDA7CisJCXRpZCA9IGQtPmxjdF9kYXRhLnRpZDsKKwkJYWRwdF9pMm9fcmVwb3J0X2hiYV91bml0KHBIYmEsIGQpOworCQlhZHB0X2kyb19pbnN0YWxsX2RldmljZShwSGJhLCBkKTsKKwl9CisJYnVzX25vID0gMDsKKwlmb3IoZCA9IHBIYmEtPmRldmljZXM7IGQgOyBkID0gZC0+bmV4dCkgeworCQlpZihkLT5sY3RfZGF0YS5jbGFzc19pZCAgPT0gSTJPX0NMQVNTX0JVU19BREFQVEVSX1BPUlQgfHwKKwkJICAgZC0+bGN0X2RhdGEuY2xhc3NfaWQgID09IEkyT19DTEFTU19GSUJSRV9DSEFOTkVMX1BPUlQpeworCQkJdGlkID0gZC0+bGN0X2RhdGEudGlkOworCQkJLy8gVE9ETyBnZXQgdGhlIGJ1c19ubyBmcm9tIGhydC1idXQgZm9yIG5vdyB0aGV5IGFyZSBpbiBvcmRlcgorCQkJLy9idXNfbm8gPSAKKwkJCWlmKGJ1c19ubyA+IHBIYmEtPnRvcF9zY3NpX2NoYW5uZWwpeworCQkJCXBIYmEtPnRvcF9zY3NpX2NoYW5uZWwgPSBidXNfbm87CisJCQl9CisJCQlwSGJhLT5jaGFubmVsW2J1c19ub10udHlwZSA9IGQtPmxjdF9kYXRhLmNsYXNzX2lkOworCQkJcEhiYS0+Y2hhbm5lbFtidXNfbm9dLnRpZCA9IHRpZDsKKwkJCWlmKGFkcHRfaTJvX3F1ZXJ5X3NjYWxhcihwSGJhLCB0aWQsIDB4MDIwMCwgLTEsIGJ1ZiwgMjgpPj0wKQorCQkJeworCQkJCXBIYmEtPmNoYW5uZWxbYnVzX25vXS5zY3NpX2lkID0gYnVmWzFdOworCQkJCVBERUJVRygiQnVzICVkIC0gU0NTSSBJRCAlZC5cbiIsIGJ1c19ubywgYnVmWzFdKTsKKwkJCX0KKwkJCS8vIFRPRE8gcmVtb3ZlIC0gdGhpcyBpcyBqdXN0IHVudGlsIHdlIGdldCBmcm9tIGhydAorCQkJYnVzX25vKys7CisJCQlpZihidXNfbm8gPj0gTUFYX0NIQU5ORUwpIHsJLy8gU29tZXRoaW5nIHdyb25nIHNraXAgaXQKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBDaGFubmVsIG51bWJlciAlZCBvdXQgb2YgcmFuZ2UgLSBMQ1RcbiIsIHBIYmEtPm5hbWUsIGJ1c19ubyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvLyBTZXR1cCBhZHB0X2RldmljZSB0YWJsZQorCWZvcihkID0gcEhiYS0+ZGV2aWNlczsgZCA7IGQgPSBkLT5uZXh0KSB7CisJCWlmKGQtPmxjdF9kYXRhLmNsYXNzX2lkICA9PSBJMk9fQ0xBU1NfUkFORE9NX0JMT0NLX1NUT1JBR0UgfHwKKwkJICAgZC0+bGN0X2RhdGEuY2xhc3NfaWQgID09IEkyT19DTEFTU19TQ1NJX1BFUklQSEVSQUwgfHwKKwkJICAgZC0+bGN0X2RhdGEuY2xhc3NfaWQgID09IEkyT19DTEFTU19GSUJSRV9DSEFOTkVMX1BFUklQSEVSQUwgKXsKKworCQkJdGlkID0gZC0+bGN0X2RhdGEudGlkOworCQkJc2NzaV9pZCA9IC0xOworCQkJLy8gSTJPX0RQVF9ERVZJQ0VfSU5GT19HUk9VUF9OTzsKKwkJCWlmKGFkcHRfaTJvX3F1ZXJ5X3NjYWxhcihwSGJhLCB0aWQsIDB4ODAwMCwgLTEsIGJ1ZiwgMzIpPj0wKSB7CisJCQkJYnVzX25vID0gYnVmWzBdPj4xNjsKKwkJCQlzY3NpX2lkID0gYnVmWzFdOworCQkJCXNjc2lfbHVuID0gKGJ1ZlsyXT4+OCApJjB4ZmY7CisJCQkJaWYoYnVzX25vID49IE1BWF9DSEFOTkVMKSB7CS8vIFNvbWV0aGluZyB3cm9uZyBza2lwIGl0CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoc2NzaV9pZCA+PSBNQVhfSUQpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmKCBwSGJhLT5jaGFubmVsW2J1c19ub10uZGV2aWNlW3Njc2lfaWRdID09IE5VTEwpeworCQkJCQlwRGV2ID0gIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZHB0X2RldmljZSksR0ZQX0tFUk5FTCk7CisJCQkJCWlmKHBEZXYgPT0gTlVMTCkgeworCQkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJCX0KKwkJCQkJcEhiYS0+Y2hhbm5lbFtidXNfbm9dLmRldmljZVtzY3NpX2lkXSA9IHBEZXY7CisJCQkJCW1lbXNldChwRGV2LDAsc2l6ZW9mKHN0cnVjdCBhZHB0X2RldmljZSkpOworCQkJCX0gZWxzZSB7CisJCQkJCWZvciggcERldiA9IHBIYmEtPmNoYW5uZWxbYnVzX25vXS5kZXZpY2Vbc2NzaV9pZF07CQorCQkJCQkJCXBEZXYtPm5leHRfbHVuOyBwRGV2ID0gcERldi0+bmV4dF9sdW4peworCQkJCQl9CisJCQkJCXBEZXYtPm5leHRfbHVuID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFkcHRfZGV2aWNlKSxHRlBfS0VSTkVMKTsKKwkJCQkJaWYocERldi0+bmV4dF9sdW4gPT0gTlVMTCkgeworCQkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJCX0KKwkJCQkJbWVtc2V0KHBEZXYtPm5leHRfbHVuLDAsc2l6ZW9mKHN0cnVjdCBhZHB0X2RldmljZSkpOworCQkJCQlwRGV2ID0gcERldi0+bmV4dF9sdW47CisJCQkJfQorCQkJCXBEZXYtPnRpZCA9IHRpZDsKKwkJCQlwRGV2LT5zY3NpX2NoYW5uZWwgPSBidXNfbm87CisJCQkJcERldi0+c2NzaV9pZCA9IHNjc2lfaWQ7CisJCQkJcERldi0+c2NzaV9sdW4gPSBzY3NpX2x1bjsKKwkJCQlwRGV2LT5wSTJvX2RldiA9IGQ7CisJCQkJZC0+b3duZXIgPSBwRGV2OworCQkJCXBEZXYtPnR5cGUgPSAoYnVmWzBdKSYweGZmOworCQkJCXBEZXYtPmZsYWdzID0gKGJ1ZlswXT4+OCkmMHhmZjsKKwkJCQlpZihzY3NpX2lkID4gcEhiYS0+dG9wX3Njc2lfaWQpeworCQkJCQlwSGJhLT50b3Bfc2NzaV9pZCA9IHNjc2lfaWQ7CisJCQkJfQorCQkJCWlmKHNjc2lfbHVuID4gcEhiYS0+dG9wX3Njc2lfbHVuKXsKKwkJCQkJcEhiYS0+dG9wX3Njc2lfbHVuID0gc2NzaV9sdW47CisJCQkJfQorCQkJfQorCQkJaWYoc2NzaV9pZCA9PSAtMSl7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyJDb3VsZCBub3QgZmluZCBTQ1NJIElEIGZvciAlc1xuIiwKKwkJCQkJCWQtPmxjdF9kYXRhLmlkZW50aXR5X3RhZyk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCUVhY2ggSTJPIGNvbnRyb2xsZXIgaGFzIGEgY2hhaW4gb2YgZGV2aWNlcyBvbiBpdCAtIHRoZXNlIG1hdGNoCisgKgl0aGUgdXNlZnVsIHBhcnRzIG9mIHRoZSBMQ1Qgb2YgdGhlIGJvYXJkLgorICovCisgCitzdGF0aWMgaW50IGFkcHRfaTJvX2luc3RhbGxfZGV2aWNlKGFkcHRfaGJhKiBwSGJhLCBzdHJ1Y3QgaTJvX2RldmljZSAqZCkKK3sKKwlkb3duKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisJZC0+Y29udHJvbGxlcj1wSGJhOworCWQtPm93bmVyPU5VTEw7CisJZC0+bmV4dD1wSGJhLT5kZXZpY2VzOworCWQtPnByZXY9TlVMTDsKKwlpZiAocEhiYS0+ZGV2aWNlcyAhPSBOVUxMKXsKKwkJcEhiYS0+ZGV2aWNlcy0+cHJldj1kOworCX0KKwlwSGJhLT5kZXZpY2VzPWQ7CisJKmQtPmRldl9uYW1lID0gMDsKKworCXVwKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRwdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vcjsKKwlhZHB0X2hiYSogcEhiYTsKKworCS8vVE9ETyBjaGVjayBmb3Igcm9vdCBhY2Nlc3MKKwkvLworCW1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlpZiAobWlub3IgPj0gaGJhX2NvdW50KSB7CisJCXJldHVybiAtRU5YSU87CisJfQorCWRvd24oJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwlmb3IgKHBIYmEgPSBoYmFfY2hhaW47IHBIYmE7IHBIYmEgPSBwSGJhLT5uZXh0KSB7CisJCWlmIChwSGJhLT51bml0ID09IG1pbm9yKSB7CisJCQlicmVhazsJLyogZm91bmQgYWRhcHRlciAqLworCQl9CisJfQorCWlmIChwSGJhID09IE5VTEwpIHsKKwkJdXAoJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKy8vCWlmKHBIYmEtPmluX3VzZSl7CisJLy8JdXAoJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKy8vCQlyZXR1cm4gLUVCVVNZOworLy8JfQorCisJcEhiYS0+aW5fdXNlID0gMTsKKwl1cCgmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRwdF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3I7CisJYWRwdF9oYmEqIHBIYmE7CisKKwltaW5vciA9IGltaW5vcihpbm9kZSk7CisJaWYgKG1pbm9yID49IGhiYV9jb3VudCkgeworCQlyZXR1cm4gLUVOWElPOworCX0KKwlkb3duKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisJZm9yIChwSGJhID0gaGJhX2NoYWluOyBwSGJhOyBwSGJhID0gcEhiYS0+bmV4dCkgeworCQlpZiAocEhiYS0+dW5pdCA9PSBtaW5vcikgeworCQkJYnJlYWs7CS8qIGZvdW5kIGFkYXB0ZXIgKi8KKwkJfQorCX0KKwl1cCgmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCWlmIChwSGJhID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlwSGJhLT5pbl91c2UgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBhZHB0X2kyb19wYXNzdGhydShhZHB0X2hiYSogcEhiYSwgdTMyIF9fdXNlciAqYXJnKQoreworCXUzMiBtc2dbTUFYX01FU1NBR0VfU0laRV07CisJdTMyKiByZXBseSA9IE5VTEw7CisJdTMyIHNpemUgPSAwOworCXUzMiByZXBseV9zaXplID0gMDsKKwl1MzIgX191c2VyICp1c2VyX21zZyA9IGFyZzsKKwl1MzIgX191c2VyICogdXNlcl9yZXBseSA9IE5VTEw7CisJdm9pZCAqc2dfbGlzdFtwSGJhLT5zZ190YWJsZXNpemVdOworCXUzMiBzZ19vZmZzZXQgPSAwOworCXUzMiBzZ19jb3VudCA9IDA7CisJaW50IHNnX2luZGV4ID0gMDsKKwl1MzIgaSA9IDA7CisJdTMyIHJjb2RlID0gMDsKKwl2b2lkICpwID0gTlVMTDsKKwl1bG9uZyBmbGFncyA9IDA7CisKKwltZW1zZXQoJm1zZywgMCwgTUFYX01FU1NBR0VfU0laRSo0KTsKKwkvLyBnZXQgdXNlciBtc2cgc2l6ZSBpbiB1MzJzIAorCWlmKGdldF91c2VyKHNpemUsICZ1c2VyX21zZ1swXSkpeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJc2l6ZSA9IHNpemU+PjE2OworCisJdXNlcl9yZXBseSA9ICZ1c2VyX21zZ1tzaXplXTsKKwlpZihzaXplID4gTUFYX01FU1NBR0VfU0laRSl7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlzaXplICo9IDQ7IC8vIENvbnZlcnQgdG8gYnl0ZXMKKworCS8qIENvcHkgaW4gdGhlIHVzZXIncyBJMk8gY29tbWFuZCAqLworCWlmKGNvcHlfZnJvbV91c2VyKG1zZywgdXNlcl9tc2csIHNpemUpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlnZXRfdXNlcihyZXBseV9zaXplLCAmdXNlcl9yZXBseVswXSk7CisJcmVwbHlfc2l6ZSA9IHJlcGx5X3NpemU+PjE2OworCWlmKHJlcGx5X3NpemUgPiBSRVBMWV9GUkFNRV9TSVpFKXsKKwkJcmVwbHlfc2l6ZSA9IFJFUExZX0ZSQU1FX1NJWkU7CisJfQorCXJlcGx5X3NpemUgKj0gNDsKKwlyZXBseSA9IGttYWxsb2MoUkVQTFlfRlJBTUVfU0laRSo0LCBHRlBfS0VSTkVMKTsKKwlpZihyZXBseSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSByZXBseSBidWZmZXJcbiIscEhiYS0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQocmVwbHksMCxSRVBMWV9GUkFNRV9TSVpFKjQpOworCXNnX29mZnNldCA9IChtc2dbMF0+PjQpJjB4ZjsKKwltc2dbMl0gPSAweDQwMDAwMDAwOyAvLyBJT0NUTCBjb250ZXh0CisJbXNnWzNdID0gKHUzMilyZXBseTsKKwltZW1zZXQoc2dfbGlzdCwwLCBzaXplb2Yoc2dfbGlzdFswXSkqcEhiYS0+c2dfdGFibGVzaXplKTsKKwlpZihzZ19vZmZzZXQpIHsKKwkJLy8gVE9ETyA2NGJpdCBmaXgKKwkJc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50ICpzZyA9ICAoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50KikgKG1zZytzZ19vZmZzZXQpOworCQlzZ19jb3VudCA9IChzaXplIC0gc2dfb2Zmc2V0KjQpIC8gc2l6ZW9mKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCk7CisJCWlmIChzZ19jb3VudCA+IHBIYmEtPnNnX3RhYmxlc2l6ZSl7CisJCQlwcmludGsoS0VSTl9ERUJVRyIlczpJT0NUTCBTRyBMaXN0IHRvbyBsYXJnZSAoJXUpXG4iLCBwSGJhLT5uYW1lLHNnX2NvdW50KTsKKwkJCWtmcmVlIChyZXBseSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWZvcihpID0gMDsgaSA8IHNnX2NvdW50OyBpKyspIHsKKwkJCWludCBzZ19zaXplOworCisJCQlpZiAoIShzZ1tpXS5mbGFnX2NvdW50ICYgMHgxMDAwMDAwMCAvKkkyT19TR0xfRkxBR1NfU0lNUExFX0FERFJFU1NfRUxFTUVOVCovKSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHIiVzOkJhZCBTRyBlbGVtZW50ICVkIC0gbm90IHNpbXBsZSAoJXgpXG4iLHBIYmEtPm5hbWUsaSwgIHNnW2ldLmZsYWdfY291bnQpOworCQkJCXJjb2RlID0gLUVJTlZBTDsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJCQlzZ19zaXplID0gc2dbaV0uZmxhZ19jb3VudCAmIDB4ZmZmZmZmOyAgICAgIAorCQkJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgdHJhbnNmZXIgKi8KKwkJCXAgPSBrbWFsbG9jKHNnX3NpemUsIEdGUF9LRVJORUx8QUREUjMyKTsKKwkJCWlmKCFwKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUciJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBTRyBidWZmZXIgLSBzaXplID0gJWQgYnVmZmVyIG51bWJlciAlZCBvZiAlZFxuIiwKKwkJCQkJCXBIYmEtPm5hbWUsc2dfc2l6ZSxpLHNnX2NvdW50KTsKKwkJCQlyY29kZSA9IC1FTk9NRU07CisJCQkJZ290byBjbGVhbnVwOworCQkJfQorCQkJc2dfbGlzdFtzZ19pbmRleCsrXSA9IHA7IC8vIHNnbGlzdCBpbmRleGVkIHdpdGggaW5wdXQgZnJhbWUsIG5vdCBvdXIgaW50ZXJuYWwgZnJhbWUuCisJCQkvKiBDb3B5IGluIHRoZSB1c2VyJ3MgU0cgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworCQkJaWYoc2dbaV0uZmxhZ19jb3VudCAmIDB4MDQwMDAwMDAgLypJMk9fU0dMX0ZMQUdTX0RJUiovKSB7CisJCQkJLy8gVE9ETyA2NGJpdCBmaXgKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIocCwodm9pZCBfX3VzZXIgKilzZ1tpXS5hZGRyX2J1cywgc2dfc2l6ZSkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUciJXM6IENvdWxkIG5vdCBjb3B5IFNHIGJ1ZiAlZCBGUk9NIHVzZXJcbiIscEhiYS0+bmFtZSxpKTsKKwkJCQkJcmNvZGUgPSAtRUZBVUxUOworCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJfQorCQkJfQorCQkJLy9UT0RPIDY0Yml0IGZpeAorCQkJc2dbaV0uYWRkcl9idXMgPSAodTMyKXZpcnRfdG9fYnVzKHApOworCQl9CisJfQorCisJZG8geworCQlpZihwSGJhLT5ob3N0KQorCQkJc3Bpbl9sb2NrX2lycXNhdmUocEhiYS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCS8vIFRoaXMgc3RhdGUgc3RvcHMgYW55IG5ldyBjb21tYW5kcyBmcm9tIGVudGVycmluZyB0aGUKKwkJLy8gY29udHJvbGxlciB3aGlsZSBwcm9jZXNzaW5nIHRoZSBpb2N0bAorLy8JCXBIYmEtPnN0YXRlIHw9IERQVElfU1RBVEVfSU9DVEw7CisvLwkJV2UgY2FuJ3Qgc2V0IHRoaXMgbm93IC0gVGhlIHNjc2kgc3Vic3lzdGVtIHNldHMgaG9zdF9ibG9ja2VkIGFuZAorLy8JCXRoZSBxdWV1ZSBlbXB0aWVzIGFuZCBzdG9wcy4gIFdlIG5lZWQgYSB3YXkgdG8gcmVzdGFydCB0aGUgcXVldWUKKwkJcmNvZGUgPSBhZHB0X2kyb19wb3N0X3dhaXQocEhiYSwgbXNnLCBzaXplLCBGT1JFVkVSKTsKKwkJaWYgKHJjb2RlICE9IDApCisJCQlwcmludGsoImFkcHRfaTJvX3Bhc3N0aHJ1OiBwb3N0IHdhaXQgZmFpbGVkICVkICVwXG4iLAorCQkJCQlyY29kZSwgcmVwbHkpOworLy8JCXBIYmEtPnN0YXRlICY9IH5EUFRJX1NUQVRFX0lPQ1RMOworCQlpZihwSGJhLT5ob3N0KQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwSGJhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl9IHdoaWxlKHJjb2RlID09IC1FVElNRURPVVQpOyAgCisKKwlpZihyY29kZSl7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlpZihzZ19vZmZzZXQpIHsKKwkvKiBDb3B5IGJhY2sgdGhlIFNjYXR0ZXIgR2F0aGVyIGJ1ZmZlcnMgYmFjayB0byB1c2VyIHNwYWNlICovCisJCXUzMiBqOworCQkvLyBUT0RPIDY0Yml0IGZpeAorCQlzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQqIHNnOworCQlpbnQgc2dfc2l6ZTsKKworCQkvLyByZS1hY3F1aXJlIHRoZSBvcmlnaW5hbCBtZXNzYWdlIHRvIGhhbmRsZSBjb3JyZWN0bHkgdGhlIHNnIGNvcHkgb3BlcmF0aW9uCisJCW1lbXNldCgmbXNnLCAwLCBNQVhfTUVTU0FHRV9TSVpFKjQpOyAKKwkJLy8gZ2V0IHVzZXIgbXNnIHNpemUgaW4gdTMycyAKKwkJaWYoZ2V0X3VzZXIoc2l6ZSwgJnVzZXJfbXNnWzBdKSl7CisJCQlyY29kZSA9IC1FRkFVTFQ7IAorCQkJZ290byBjbGVhbnVwOyAKKwkJfQorCQlzaXplID0gc2l6ZT4+MTY7CisJCXNpemUgKj0gNDsKKwkJLyogQ29weSBpbiB0aGUgdXNlcidzIEkyTyBjb21tYW5kICovCisJCWlmIChjb3B5X2Zyb21fdXNlciAobXNnLCB1c2VyX21zZywgc2l6ZSkpIHsKKwkJCXJjb2RlID0gLUVGQVVMVDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlzZ19jb3VudCA9IChzaXplIC0gc2dfb2Zmc2V0KjQpIC8gc2l6ZW9mKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCk7CisKKwkJLy8gVE9ETyA2NGJpdCBmaXgKKwkJc2cgCSA9IChzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQqKShtc2cgKyBzZ19vZmZzZXQpOworCQlmb3IgKGogPSAwOyBqIDwgc2dfY291bnQ7IGorKykgeworCQkJLyogQ29weSBvdXQgdGhlIFNHIGxpc3QgdG8gdXNlcidzIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KKwkJCWlmKCEgKHNnW2pdLmZsYWdfY291bnQgJiAweDQwMDAwMDAgLypJMk9fU0dMX0ZMQUdTX0RJUiovKSkgeworCQkJCXNnX3NpemUgPSBzZ1tqXS5mbGFnX2NvdW50ICYgMHhmZmZmZmY7IAorCQkJCS8vIFRPRE8gNjRiaXQgZml4CisJCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilzZ1tqXS5hZGRyX2J1cyxzZ19saXN0W2pdLCBzZ19zaXplKSkgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBDb3VsZCBub3QgY29weSAlcCBUTyB1c2VyICV4XG4iLHBIYmEtPm5hbWUsIHNnX2xpc3Rbal0sIHNnW2pdLmFkZHJfYnVzKTsKKwkJCQkJcmNvZGUgPSAtRUZBVUxUOworCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJfQorCQkJfQorCQl9CisJfSAKKworCS8qIENvcHkgYmFjayB0aGUgcmVwbHkgdG8gdXNlciBzcGFjZSAqLworCWlmIChyZXBseV9zaXplKSB7CisJCS8vIHdlIHdyb3RlIG91ciBvd24gdmFsdWVzIGZvciBjb250ZXh0IC0gbm93IHJlc3RvcmUgdGhlIHVzZXIgc3VwcGxpZWQgb25lcworCQlpZihjb3B5X2Zyb21fdXNlcihyZXBseSsyLCB1c2VyX21zZysyLCBzaXplb2YodTMyKSoyKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyIlczogQ291bGQgbm90IGNvcHkgbWVzc2FnZSBjb250ZXh0IEZST00gdXNlclxuIixwSGJhLT5uYW1lKTsKKwkJCXJjb2RlID0gLUVGQVVMVDsKKwkJfQorCQlpZihjb3B5X3RvX3VzZXIodXNlcl9yZXBseSwgcmVwbHksIHJlcGx5X3NpemUpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBDb3VsZCBub3QgY29weSByZXBseSBUTyB1c2VyXG4iLHBIYmEtPm5hbWUpOworCQkJcmNvZGUgPSAtRUZBVUxUOworCQl9CisJfQorCisKK2NsZWFudXA6CisJaWYgKHJjb2RlICE9IC1FVElNRSAmJiByY29kZSAhPSAtRUlOVFIpCisJCWtmcmVlIChyZXBseSk7CisJd2hpbGUoc2dfaW5kZXgpIHsKKwkJaWYoc2dfbGlzdFstLXNnX2luZGV4XSkgeworCQkJaWYgKHJjb2RlICE9IC1FVElNRSAmJiByY29kZSAhPSAtRUlOVFIpCisJCQkJa2ZyZWUoc2dfbGlzdFtzZ19pbmRleF0pOworCQl9CisJfQorCXJldHVybiByY29kZTsKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5c3RlbS4gIFRoaXMgZG9lcyBub3QgZWZmZWN0CisgKiBhbnkgbG9naWMgYW5kIGlmIHRoZSBpbmZvIGlzIHdyb25nIC0gaXQgZG9lc24ndCBtYXR0ZXIuCisgKi8KKworLyogR2V0IGFsbCB0aGUgaW5mbyB3ZSBjYW4gbm90IGdldCBmcm9tIGtlcm5lbCBzZXJ2aWNlcyAqLworc3RhdGljIGludCBhZHB0X3N5c3RlbV9pbmZvKHZvaWQgX191c2VyICpidWZmZXIpCit7CisJc3lzSW5mb19TIHNpOworCisJbWVtc2V0KCZzaSwgMCwgc2l6ZW9mKHNpKSk7CisKKwlzaS5vc1R5cGUgPSBPU19MSU5VWDsKKwlzaS5vc01ham9yVmVyc2lvbiA9ICh1OCkgKExJTlVYX1ZFUlNJT05fQ09ERSA+PiAxNik7CisJc2kub3NNaW5vclZlcnNpb24gPSAodTgpIChMSU5VWF9WRVJTSU9OX0NPREUgPj4gOCAmIDB4MGZmKTsKKwlzaS5vc1JldmlzaW9uID0gICAgICh1OCkgKExJTlVYX1ZFUlNJT05fQ09ERSAmIDB4MGZmKTsKKwlzaS5idXNUeXBlID0gU0lfUENJX0JVUzsKKwlzaS5wcm9jZXNzb3JGYW1pbHkgPSBEUFRJX3NpZy5kc1Byb2Nlc3NvckZhbWlseTsKKworI2lmIGRlZmluZWQgX19pMzg2X18gCisJYWRwdF9pMzg2X2luZm8oJnNpKTsKKyNlbGlmIGRlZmluZWQgKF9faWE2NF9fKQorCWFkcHRfaWE2NF9pbmZvKCZzaSk7CisjZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykKKwlhZHB0X3NwYXJjX2luZm8oJnNpKTsKKyNlbGlmIGRlZmluZWQgKF9fYWxwaGFfXykKKwlhZHB0X2FscGhhX2luZm8oJnNpKTsKKyNlbHNlCisJc2kucHJvY2Vzc29yVHlwZSA9IDB4ZmYgOworI2VuZGlmCisJaWYoY29weV90b191c2VyKGJ1ZmZlciwgJnNpLCBzaXplb2Yoc2kpKSl7CisJCXByaW50ayhLRVJOX1dBUk5JTkciZHB0aTogQ291bGQgbm90IGNvcHkgYnVmZmVyIFRPIHVzZXJcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmIGRlZmluZWQgX19pYTY0X18gCitzdGF0aWMgdm9pZCBhZHB0X2lhNjRfaW5mbyhzeXNJbmZvX1MqIHNpKQoreworCS8vIFRoaXMgaXMgYWxsIHRoZSBpbmZvIHdlIG5lZWQgZm9yIG5vdworCS8vIFdlIHdpbGwgYWRkIG1vcmUgaW5mbyBhcyBvdXIgbmV3CisJLy8gbWFuYWdtZW5lbnQgdXRpbGl0eSByZXF1aXJlcyBpdAorCXNpLT5wcm9jZXNzb3JUeXBlID0gUFJPQ19JQTY0OworfQorI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19zcGFyY19fIAorc3RhdGljIHZvaWQgYWRwdF9zcGFyY19pbmZvKHN5c0luZm9fUyogc2kpCit7CisJLy8gVGhpcyBpcyBhbGwgdGhlIGluZm8gd2UgbmVlZCBmb3Igbm93CisJLy8gV2Ugd2lsbCBhZGQgbW9yZSBpbmZvIGFzIG91ciBuZXcKKwkvLyBtYW5hZ21lbmVudCB1dGlsaXR5IHJlcXVpcmVzIGl0CisJc2ktPnByb2Nlc3NvclR5cGUgPSBQUk9DX1VMVFJBU1BBUkM7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19hbHBoYV9fIAorc3RhdGljIHZvaWQgYWRwdF9hbHBoYV9pbmZvKHN5c0luZm9fUyogc2kpCit7CisJLy8gVGhpcyBpcyBhbGwgdGhlIGluZm8gd2UgbmVlZCBmb3Igbm93CisJLy8gV2Ugd2lsbCBhZGQgbW9yZSBpbmZvIGFzIG91ciBuZXcKKwkvLyBtYW5hZ21lbmVudCB1dGlsaXR5IHJlcXVpcmVzIGl0CisJc2ktPnByb2Nlc3NvclR5cGUgPSBQUk9DX0FMUEhBOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9faTM4Nl9fCisKK3N0YXRpYyB2b2lkIGFkcHRfaTM4Nl9pbmZvKHN5c0luZm9fUyogc2kpCit7CisJLy8gVGhpcyBpcyBhbGwgdGhlIGluZm8gd2UgbmVlZCBmb3Igbm93CisJLy8gV2Ugd2lsbCBhZGQgbW9yZSBpbmZvIGFzIG91ciBuZXcKKwkvLyBtYW5hZ21lbmVudCB1dGlsaXR5IHJlcXVpcmVzIGl0CisJc3dpdGNoIChib290X2NwdV9kYXRhLng4NikgeworCWNhc2UgQ1BVXzM4NjoKKwkJc2ktPnByb2Nlc3NvclR5cGUgPSBQUk9DXzM4NjsKKwkJYnJlYWs7CisJY2FzZSBDUFVfNDg2OgorCQlzaS0+cHJvY2Vzc29yVHlwZSA9IFBST0NfNDg2OworCQlicmVhazsKKwljYXNlIENQVV81ODY6CisJCXNpLT5wcm9jZXNzb3JUeXBlID0gUFJPQ19QRU5USVVNOworCQlicmVhazsKKwlkZWZhdWx0OiAgLy8gSnVzdCBpbiBjYXNlIAorCQlzaS0+cHJvY2Vzc29yVHlwZSA9IFBST0NfUEVOVElVTTsKKwkJYnJlYWs7CisJfQorfQorCisjZW5kaWYKKworCitzdGF0aWMgaW50IGFkcHRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVpbnQgY21kLAorCSAgICAgIHVsb25nIGFyZykKK3sKKwlpbnQgbWlub3I7CisJaW50IGVycm9yID0gMDsKKwlhZHB0X2hiYSogcEhiYTsKKwl1bG9uZyBmbGFncyA9IDA7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwltaW5vciA9IGltaW5vcihpbm9kZSk7CisJaWYgKG1pbm9yID49IERQVElfTUFYX0hCQSl7CisJCXJldHVybiAtRU5YSU87CisJfQorCWRvd24oJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwlmb3IgKHBIYmEgPSBoYmFfY2hhaW47IHBIYmE7IHBIYmEgPSBwSGJhLT5uZXh0KSB7CisJCWlmIChwSGJhLT51bml0ID09IG1pbm9yKSB7CisJCQlicmVhazsJLyogZm91bmQgYWRhcHRlciAqLworCQl9CisJfQorCXVwKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisJaWYocEhiYSA9PSBOVUxMKXsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwl3aGlsZSgodm9sYXRpbGUgdTMyKSBwSGJhLT5zdGF0ZSAmIERQVElfU1RBVEVfUkVTRVQgKSB7CisJCXNldF90YXNrX3N0YXRlKGN1cnJlbnQsVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDIpOworCisJfQorCisJc3dpdGNoIChjbWQpIHsKKwkvLyBUT0RPOiBoYW5kbGUgMyBjYXNlcworCWNhc2UgRFBUX1NJR05BVFVSRToKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmRFBUSV9zaWcsIHNpemVvZihEUFRJX3NpZykpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwljYXNlIEkyT1VTUkNNRDoKKwkJcmV0dXJuIGFkcHRfaTJvX3Bhc3N0aHJ1KHBIYmEsIGFyZ3ApOworCisJY2FzZSBEUFRfQ1RSTElORk86eworCQlkcnZySEJBaW5mb19TIEhiYUluZm87CisKKyNkZWZpbmUgRkxHX09TRF9QQ0lfVkFMSUQgMHgwMDAxCisjZGVmaW5lIEZMR19PU0RfRE1BCSAgMHgwMDAyCisjZGVmaW5lIEZMR19PU0RfSTJPCSAgMHgwMDA0CisJCW1lbXNldCgmSGJhSW5mbywgMCwgc2l6ZW9mKEhiYUluZm8pKTsKKwkJSGJhSW5mby5kcnZySEJBbnVtID0gcEhiYS0+dW5pdDsKKwkJSGJhSW5mby5iYXNlQWRkciA9ICh1bG9uZykgcEhiYS0+YmFzZV9hZGRyX3BoeXM7CisJCUhiYUluZm8uYmxpbmtTdGF0ZSA9IGFkcHRfcmVhZF9ibGlua19sZWQocEhiYSk7CisJCUhiYUluZm8ucGNpQnVzTnVtID0gIHBIYmEtPnBEZXYtPmJ1cy0+bnVtYmVyOworCQlIYmFJbmZvLnBjaURldmljZU51bT1QQ0lfU0xPVChwSGJhLT5wRGV2LT5kZXZmbik7IAorCQlIYmFJbmZvLkludGVycnVwdCA9IHBIYmEtPnBEZXYtPmlycTsgCisJCUhiYUluZm8uaGJhRmxhZ3MgPSBGTEdfT1NEX1BDSV9WQUxJRCB8IEZMR19PU0RfRE1BIHwgRkxHX09TRF9JMk87CisJCWlmKGNvcHlfdG9fdXNlcihhcmdwLCAmSGJhSW5mbywgc2l6ZW9mKEhiYUluZm8pKSl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBDb3VsZCBub3QgY29weSBIYmFJbmZvIFRPIHVzZXJcbiIscEhiYS0+bmFtZSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwkJfQorCWNhc2UgRFBUX1NZU0lORk86CisJCXJldHVybiBhZHB0X3N5c3RlbV9pbmZvKGFyZ3ApOworCWNhc2UgRFBUX0JMSU5LTEVEOnsKKwkJdTMyIHZhbHVlOworCQl2YWx1ZSA9ICh1MzIpYWRwdF9yZWFkX2JsaW5rX2xlZChwSGJhKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwkJfQorCWNhc2UgSTJPUkVTRVRDTUQ6CisJCWlmKHBIYmEtPmhvc3QpCisJCQlzcGluX2xvY2tfaXJxc2F2ZShwSGJhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJYWRwdF9oYmFfcmVzZXQocEhiYSk7CisJCWlmKHBIYmEtPmhvc3QpCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHBIYmEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIEkyT1JFU0NBTkNNRDoKKwkJYWRwdF9yZXNjYW4ocEhiYSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3QgYWRwdF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kKiBjbWQ7CisJYWRwdF9oYmEqIHBIYmEgPSBkZXZfaWQ7CisJdTMyIG07CisJdWxvbmcgcmVwbHk7CisJdTMyIHN0YXR1cz0wOworCXUzMiBjb250ZXh0OworCXVsb25nIGZsYWdzID0gMDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlpZiAocEhiYSA9PSBOVUxMKXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyJhZHB0X2lzcjogTlVMTCBkZXZfaWRcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCWlmKHBIYmEtPmhvc3QpCisJCXNwaW5fbG9ja19pcnFzYXZlKHBIYmEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJd2hpbGUoIHJlYWRsKHBIYmEtPmlycV9tYXNrKSAmIEkyT19JTlRFUlJVUFRfUEVORElOR19CKSB7CisJCW0gPSByZWFkbChwSGJhLT5yZXBseV9wb3J0KTsKKwkJaWYobSA9PSBFTVBUWV9RVUVVRSl7CisJCQkvLyBUcnkgdHdpY2UgdGhlbiBnaXZlIHVwCisJCQlybWIoKTsKKwkJCW0gPSByZWFkbChwSGJhLT5yZXBseV9wb3J0KTsKKwkJCWlmKG0gPT0gRU1QVFlfUVVFVUUpeyAKKwkJCQkvLyBUaGlzIHJlYWxseSBzaG91bGQgbm90IGhhcHBlbgorCQkJCXByaW50ayhLRVJOX0VSUiJkcHRpOiBDb3VsZCBub3QgZ2V0IHJlcGx5IGZyYW1lXG4iKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlyZXBseSA9ICh1bG9uZylidXNfdG9fdmlydChtKTsKKworCQlpZiAocmVhZGwocmVwbHkpICYgTVNHX0ZBSUwpIHsKKwkJCXUzMiBvbGRfbSA9IHJlYWRsKHJlcGx5KzI4KTsgCisJCQl1bG9uZyBtc2c7CisJCQl1MzIgb2xkX2NvbnRleHQ7CisJCQlQREVCVUcoIiVzOiBGYWlsZWQgbWVzc2FnZVxuIixwSGJhLT5uYW1lKTsKKwkJCWlmKG9sZF9tID49IDB4MTAwMDAwKXsKKwkJCQlwcmludGsoS0VSTl9FUlIiJXM6IEJhZCBwcmVzZXJ2ZWQgTUZBICgleCktIGRyb3BwaW5nIGZyYW1lXG4iLHBIYmEtPm5hbWUsb2xkX20pOworCQkJCXdyaXRlbChtLHBIYmEtPnJlcGx5X3BvcnQpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLy8gVHJhbnNhY3Rpb24gY29udGV4dCBpcyAwIGluIGZhaWxlZCByZXBseSBmcmFtZQorCQkJbXNnID0gKHVsb25nKShwSGJhLT5tc2dfYWRkcl92aXJ0ICsgb2xkX20pOworCQkJb2xkX2NvbnRleHQgPSByZWFkbChtc2crMTIpOworCQkJd3JpdGVsKG9sZF9jb250ZXh0LCByZXBseSsxMik7CisJCQlhZHB0X3NlbmRfbm9wKHBIYmEsIG9sZF9tKTsKKwkJfSAKKwkJY29udGV4dCA9IHJlYWRsKHJlcGx5KzgpOworCQlpZihjb250ZXh0ICYgMHg0MDAwMDAwMCl7IC8vIElPQ1RMCisJCQl1bG9uZyBwID0gKHVsb25nKShyZWFkbChyZXBseSsxMikpOworCQkJaWYoIHAgIT0gMCkgeworCQkJCW1lbWNweSgodm9pZCopcCwgKHZvaWQqKXJlcGx5LCBSRVBMWV9GUkFNRV9TSVpFICogNCk7CisJCQl9CisJCQkvLyBBbGwgSU9DVExzIHdpbGwgYWxzbyBiZSBwb3N0IHdhaXQKKwkJfQorCQlpZihjb250ZXh0ICYgMHg4MDAwMDAwMCl7IC8vIFBvc3Qgd2FpdCBtZXNzYWdlCisJCQlzdGF0dXMgPSByZWFkbChyZXBseSsxNik7CisJCQlpZihzdGF0dXMgID4+IDI0KXsKKwkJCQlzdGF0dXMgJj0gIDB4ZmZmZjsgLyogR2V0IGRldGFpbCBzdGF0dXMgKi8KKwkJCX0gZWxzZSB7CisJCQkJc3RhdHVzID0gSTJPX1BPU1RfV0FJVF9PSzsKKwkJCX0KKwkJCWlmKCEoY29udGV4dCAmIDB4NDAwMDAwMDApKSB7CisJCQkJY21kID0gKHN0cnVjdCBzY3NpX2NtbmQqKSByZWFkbChyZXBseSsxMik7IAorCQkJCWlmKGNtZCAhPSBOVUxMKSB7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IEFwcGFyZW50IFNDU0kgY21kIGluIFBvc3QgV2FpdCBDb250ZXh0IC0gY21kPSVwIGNvbnRleHQ9JXhcbiIsIHBIYmEtPm5hbWUsIGNtZCwgY29udGV4dCk7CisJCQkJfQorCQkJfQorCQkJYWRwdF9pMm9fcG9zdF93YWl0X2NvbXBsZXRlKGNvbnRleHQsIHN0YXR1cyk7CisJCX0gZWxzZSB7IC8vIFNDU0kgbWVzc2FnZQorCQkJY21kID0gKHN0cnVjdCBzY3NpX2NtbmQqKSByZWFkbChyZXBseSsxMik7IAorCQkJaWYoY21kICE9IE5VTEwpeworCQkJCWlmKGNtZC0+c2VyaWFsX251bWJlciAhPSAwKSB7IC8vIElmIG5vdCB0aW1lZG91dAorCQkJCQlhZHB0X2kyb190b19zY3NpKHJlcGx5LCBjbWQpOworCQkJCX0KKwkJCX0KKwkJfQorCQl3cml0ZWwobSwgcEhiYS0+cmVwbHlfcG9ydCk7CisJCXdtYigpOworCQlybWIoKTsKKwl9CisJaGFuZGxlZCA9IDE7CitvdXQ6CWlmKHBIYmEtPmhvc3QpCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocEhiYS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyBzMzIgYWRwdF9zY3NpX3RvX2kybyhhZHB0X2hiYSogcEhiYSwgc3RydWN0IHNjc2lfY21uZCogY21kLCBzdHJ1Y3QgYWRwdF9kZXZpY2UqIGQpCit7CisJaW50IGk7CisJdTMyIG1zZ1tNQVhfTUVTU0FHRV9TSVpFXTsKKwl1MzIqIG1wdHI7CisJdTMyICpsZW5wdHI7CisJaW50IGRpcmVjdGlvbjsKKwlpbnQgc2NzaWRpcjsKKwl1MzIgbGVuOworCXUzMiByZXFsZW47CisJczMyIHJjb2RlOworCisJbWVtc2V0KG1zZywgMCAsIHNpemVvZihtc2cpKTsKKwlsZW4gPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwlkaXJlY3Rpb24gPSAweDAwMDAwMDAwOwkKKwkKKwlzY3NpZGlyID0gMHgwMDAwMDAwMDsJCQkvLyBEQVRBIE5PIFhGRVIKKwlpZihsZW4pIHsKKwkJLyoKKwkJICogU2V0IFNDQkZsYWdzIHRvIGluZGljYXRlIGlmIGRhdGEgaXMgYmVpbmcgdHJhbnNmZXJyZWQKKwkJICogaW4gb3Igb3V0LCBvciBubyBkYXRhIHRyYW5zZmVyCisJCSAqIE5vdGU6ICBEbyBub3QgaGF2ZSB0byB2ZXJpZnkgaW5kZXggaXMgbGVzcyB0aGFuIDAgc2luY2UKKwkJICogY21kLT5jbW5kWzBdIGlzIGFuIHVuc2lnbmVkIGNoYXIKKwkJICovCisJCXN3aXRjaChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKXsKKwkJY2FzZSBETUFfRlJPTV9ERVZJQ0U6CisJCQlzY3NpZGlyICA9MHg0MDAwMDAwMDsJLy8gREFUQSBJTiAgKGlvcDwtLWRldikKKwkJCWJyZWFrOworCQljYXNlIERNQV9UT19ERVZJQ0U6CisJCQlkaXJlY3Rpb249MHgwNDAwMDAwMDsJLy8gU0dMIE9VVAorCQkJc2NzaWRpciAgPTB4ODAwMDAwMDA7CS8vIERBVEEgT1VUIChpb3AtLT5kZXYpCisJCQlicmVhazsKKwkJY2FzZSBETUFfTk9ORToKKwkJCWJyZWFrOworCQljYXNlIERNQV9CSURJUkVDVElPTkFMOgorCQkJc2NzaWRpciAgPTB4NDAwMDAwMDA7CS8vIERBVEEgSU4gIChpb3A8LS1kZXYpCisJCQkvLyBBc3N1bWUgSW4gLSBhbmQgY29udGludWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IHNjc2kgb3Bjb2RlIDB4JXggbm90IHN1cHBvcnRlZC5cbiIsCisJCQkgICAgIHBIYmEtPm5hbWUsIGNtZC0+Y21uZFswXSk7CisJCQljbWQtPnJlc3VsdCA9IChESURfT0sgPDwxNikgfCAoSU5JVElBVE9SX0VSUk9SIDw8IDgpOworCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJCXJldHVybiAJMDsKKwkJfQorCX0KKwkvLyBtc2dbMF0gaXMgc2V0IGxhdGVyCisJLy8gSTJPX0NNRF9TQ1NJX0VYRUMKKwltc2dbMV0gPSAoKDB4ZmY8PDI0KXwoSE9TVF9USUQ8PDEyKXxkLT50aWQpOworCW1zZ1syXSA9IDA7CisJbXNnWzNdID0gKHUzMiljbWQ7CS8qIFdlIHdhbnQgdGhlIFNDU0kgY29udHJvbCBibG9jayBiYWNrICovCisJLy8gT3VyIGNhcmRzIHVzZSB0aGUgdHJhbnNhY3Rpb24gY29udGV4dCBhcyB0aGUgdGFnIGZvciBxdWV1ZWluZworCS8vIEFkYXB0ZWMvRFBUIFByaXZhdGUgc3R1ZmYgCisJbXNnWzRdID0gSTJPX0NNRF9TQ1NJX0VYRUN8KERQVF9PUkdBTklaQVRJT05fSUQ8PDE2KTsKKwltc2dbNV0gPSBkLT50aWQ7CisJLyogRGlyZWN0aW9uLCBkaXNjb25uZWN0IG9rIHwgc2Vuc2UgZGF0YSB8IHNpbXBsZSBxdWV1ZSAsIENEQkxlbiAqLworCS8vIEkyT19TQ0JfRkxBR19FTkFCTEVfRElTQ09OTkVDVCB8IAorCS8vIEkyT19TQ0JfRkxBR19TSU1QTEVfUVVFVUVfVEFHIHwgCisJLy8gSTJPX1NDQl9GTEFHX1NFTlNFX0RBVEFfSU5fTUVTU0FHRTsKKwltc2dbNl0gPSBzY3NpZGlyfDB4MjBhMDAwMDB8Y21kLT5jbWRfbGVuOworCisJbXB0cj1tc2crNzsKKworCS8vIFdyaXRlIFNDU0kgY29tbWFuZCBpbnRvIHRoZSBtZXNzYWdlIC0gYWx3YXlzIDE2IGJ5dGUgYmxvY2sgCisJbWVtc2V0KG1wdHIsIDAsICAxNik7CisJbWVtY3B5KG1wdHIsIGNtZC0+Y21uZCwgY21kLT5jbWRfbGVuKTsKKwltcHRyKz00OworCWxlbnB0cj1tcHRyKys7CQkvKiBSZW1lbWJlciBtZSAtIGZpbGwgaW4gd2hlbiB3ZSBrbm93ICovCisJcmVxbGVuID0gMTQ7CQkvLyBTSU5HTEUgU0dFCisJLyogTm93IGZpbGwgaW4gdGhlIFNHTGlzdCBhbmQgY29tbWFuZCAqLworCWlmKGNtZC0+dXNlX3NnKSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJaW50IHNnX2NvdW50ID0gcGNpX21hcF9zZyhwSGJhLT5wRGV2LCBzZywgY21kLT51c2Vfc2csCisJCQkJY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisKKworCQlsZW4gPSAwOworCQlmb3IoaSA9IDAgOyBpIDwgc2dfY291bnQ7IGkrKykgeworCQkJKm1wdHIrKyA9IGRpcmVjdGlvbnwweDEwMDAwMDAwfHNnX2RtYV9sZW4oc2cpOworCQkJbGVuKz1zZ19kbWFfbGVuKHNnKTsKKwkJCSptcHRyKysgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCQlzZysrOworCQl9CisJCS8qIE1ha2UgdGhpcyBhbiBlbmQgb2YgbGlzdCAqLworCQltcHRyWy0yXSA9IGRpcmVjdGlvbnwweEQwMDAwMDAwfHNnX2RtYV9sZW4oc2ctMSk7CisJCXJlcWxlbiA9IG1wdHIgLSBtc2c7CisJCSpsZW5wdHIgPSBsZW47CisJCQorCQlpZihjbWQtPnVuZGVyZmxvdyAmJiBsZW4gIT0gY21kLT51bmRlcmZsb3cpeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyJDbWQgbGVuICUwOFggQ21kIHVuZGVyZmxvdyAlMDhYXG4iLAorCQkJCWxlbiwgY21kLT51bmRlcmZsb3cpOworCQl9CisJfSBlbHNlIHsKKwkJKmxlbnB0ciA9IGxlbiA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCQlpZihsZW4gPT0gMCkgeworCQkJcmVxbGVuID0gMTI7CisJCX0gZWxzZSB7CisJCQkqbXB0cisrID0gMHhEMDAwMDAwMHxkaXJlY3Rpb258Y21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCQkqbXB0cisrID0gcGNpX21hcF9zaW5nbGUocEhiYS0+cERldiwKKwkJCQljbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCWNtZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQl9CisJfQorCQorCS8qIFN0aWNrIHRoZSBoZWFkZXJzIG9uICovCisJbXNnWzBdID0gcmVxbGVuPDwxNiB8ICgocmVxbGVuID4gMTIpID8gU0dMX09GRlNFVF8xMiA6IFNHTF9PRkZTRVRfMCk7CisJCisJLy8gU2VuZCBpdCBvbiBpdCdzIHdheQorCXJjb2RlID0gYWRwdF9pMm9fcG9zdF90aGlzKHBIYmEsIG1zZywgcmVxbGVuPDwyKTsKKwlpZiAocmNvZGUgPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHJjb2RlOworfQorCisKK3N0YXRpYyBzMzIgYWRwdF9zY3NpX3JlZ2lzdGVyKGFkcHRfaGJhKiBwSGJhLHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKiBzaHQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IE5VTEw7CisKKwlob3N0ID0gc2NzaV9yZWdpc3RlcihzaHQsIHNpemVvZihhZHB0X2hiYSopKTsKKwlpZiAoaG9zdCA9PSBOVUxMKSB7CisJCXByaW50ayAoIiVzOiBzY3NpX3JlZ2lzdGVyIHJldHVybmVkIE5VTExcbiIscEhiYS0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJaG9zdC0+aG9zdGRhdGFbMF0gPSAodW5zaWduZWQgbG9uZylwSGJhOworCXBIYmEtPmhvc3QgPSBob3N0OworCisJaG9zdC0+aXJxID0gcEhiYS0+cERldi0+aXJxOworCS8qIG5vIElPIHBvcnRzLCBzbyBkb24ndCBoYXZlIHRvIHNldCBob3N0LT5pb19wb3J0IGFuZCAKKwkgKiBob3N0LT5uX2lvX3BvcnQKKwkgKi8KKwlob3N0LT5pb19wb3J0ID0gMDsKKwlob3N0LT5uX2lvX3BvcnQgPSAwOworCQkJCS8qIHNlZSBjb21tZW50cyBpbiBob3N0cy5oICovCisJaG9zdC0+bWF4X2lkID0gMTY7CisJaG9zdC0+bWF4X2x1biA9IDI1NjsKKwlob3N0LT5tYXhfY2hhbm5lbCA9IHBIYmEtPnRvcF9zY3NpX2NoYW5uZWwgKyAxOworCWhvc3QtPmNtZF9wZXJfbHVuID0gMTsKKwlob3N0LT51bmlxdWVfaWQgPSAodWludCkgcEhiYTsKKwlob3N0LT5zZ190YWJsZXNpemUgPSBwSGJhLT5zZ190YWJsZXNpemU7CisJaG9zdC0+Y2FuX3F1ZXVlID0gcEhiYS0+cG9zdF9maWZvX3NpemU7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgczMyIGFkcHRfaTJvX3RvX3Njc2kodWxvbmcgcmVwbHksIHN0cnVjdCBzY3NpX2NtbmQqIGNtZCkKK3sKKwlhZHB0X2hiYSogcEhiYTsKKwl1MzIgaGJhX3N0YXR1czsKKwl1MzIgZGV2X3N0YXR1czsKKwl1MzIgcmVwbHlfZmxhZ3MgPSByZWFkbChyZXBseSkgJiAweGZmMDA7IC8vIExlYXZlIGl0IHNoaWZ0ZWQgdXAgOCBiaXRzIAorCS8vIEkga25vdyB0aGlzIHdvdWxkIGxvb2sgY2xlYW5lciBpZiBJIGp1c3QgcmVhZCBieXRlcworCS8vIGJ1dCB0aGUgbW9kZWwgSSBoYXZlIGJlZW4gdXNpbmcgZm9yIGFsbCB0aGUgcmVzdCBvZiB0aGUKKwkvLyBpbyBpcyBpbiA0IGJ5dGUgd29yZHMgLSBzbyBJIGtlZXAgdGhhdCBtb2RlbAorCXUxNiBkZXRhaWxlZF9zdGF0dXMgPSByZWFkbChyZXBseSsxNikgJjB4ZmZmZjsKKwlkZXZfc3RhdHVzID0gKGRldGFpbGVkX3N0YXR1cyAmIDB4ZmYpOworCWhiYV9zdGF0dXMgPSBkZXRhaWxlZF9zdGF0dXMgPj4gODsKKworCS8vIGNhbGN1bGF0ZSByZXNpZCBmb3Igc2cgCisJY21kLT5yZXNpZCA9IGNtZC0+cmVxdWVzdF9idWZmbGVuIC0gcmVhZGwocmVwbHkrNSk7CisKKwlwSGJhID0gKGFkcHRfaGJhKikgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhWzBdOworCisJY21kLT5zZW5zZV9idWZmZXJbMF0gPSAnXDAnOyAgLy8gaW5pdGlhbGl6ZSBzZW5zZSB2YWxpZCBmbGFnIHRvIGZhbHNlCisKKwlpZighKHJlcGx5X2ZsYWdzICYgTVNHX0ZBSUwpKSB7CisJCXN3aXRjaChkZXRhaWxlZF9zdGF0dXMgJiBJMk9fU0NTSV9EU0NfTUFTSykgeworCQljYXNlIEkyT19TQ1NJX0RTQ19TVUNDRVNTOgorCQkJY21kLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KTsKKwkJCS8vIGhhbmRsZSB1bmRlcmZsb3cKKwkJCWlmKHJlYWRsKHJlcGx5KzUpIDwgY21kLT51bmRlcmZsb3cgKSB7CisJCQkJY21kLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8MTYpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IFNDU0kgQ01EIHVuZGVyZmxvd1xuIixwSGJhLT5uYW1lKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEkyT19TQ1NJX0RTQ19SRVFVRVNUX0FCT1JURUQ6CisJCQljbWQtPnJlc3VsdCA9IChESURfQUJPUlQgPDwgMTYpOworCQkJYnJlYWs7CisJCWNhc2UgSTJPX1NDU0lfRFNDX1BBVEhfSU5WQUxJRDoKKwkJY2FzZSBJMk9fU0NTSV9EU0NfREVWSUNFX05PVF9QUkVTRU5UOgorCQljYXNlIEkyT19TQ1NJX0RTQ19TRUxFQ1RJT05fVElNRU9VVDoKKwkJY2FzZSBJMk9fU0NTSV9EU0NfQ09NTUFORF9USU1FT1VUOgorCQljYXNlIEkyT19TQ1NJX0RTQ19OT19BREFQVEVSOgorCQljYXNlIEkyT19TQ1NJX0RTQ19SRVNPVVJDRV9VTkFWQUlMQUJMRToKKwkJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IFNDU0kgVGltZW91dC1EZXZpY2UgKCVkLCVkLCVkKSBoYmEgc3RhdHVzPTB4JXgsIGRldiBzdGF0dXM9MHgleCwgY21kPTB4JXhcbiIsCisJCQkJcEhiYS0+bmFtZSwgKHUzMiljbWQtPmRldmljZS0+Y2hhbm5lbCwgKHUzMiljbWQtPmRldmljZS0+aWQsICh1MzIpY21kLT5kZXZpY2UtPmx1biwgaGJhX3N0YXR1cywgZGV2X3N0YXR1cywgY21kLT5jbW5kWzBdKTsKKwkJCWNtZC0+cmVzdWx0ID0gKERJRF9USU1FX09VVCA8PCAxNik7CisJCQlicmVhazsKKwkJY2FzZSBJMk9fU0NTSV9EU0NfQURBUFRFUl9CVVNZOgorCQljYXNlIEkyT19TQ1NJX0RTQ19CVVNfQlVTWToKKwkJCWNtZC0+cmVzdWx0ID0gKERJRF9CVVNfQlVTWSA8PCAxNik7CisJCQlicmVhazsKKwkJY2FzZSBJMk9fU0NTSV9EU0NfU0NTSV9CVVNfUkVTRVQ6CisJCWNhc2UgSTJPX1NDU0lfRFNDX0JEUl9NRVNTQUdFX1NFTlQ6CisJCQljbWQtPnJlc3VsdCA9IChESURfUkVTRVQgPDwgMTYpOworCQkJYnJlYWs7CisJCWNhc2UgSTJPX1NDU0lfRFNDX1BBUklUWV9FUlJPUl9GQUlMVVJFOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyIlczogU0NTSSBDTUQgcGFyaXR5IGVycm9yXG4iLHBIYmEtPm5hbWUpOworCQkJY21kLT5yZXN1bHQgPSAoRElEX1BBUklUWSA8PCAxNik7CisJCQlicmVhazsKKwkJY2FzZSBJMk9fU0NTSV9EU0NfVU5BQkxFX1RPX0FCT1JUOgorCQljYXNlIEkyT19TQ1NJX0RTQ19DT01QTEVURV9XSVRIX0VSUk9SOgorCQljYXNlIEkyT19TQ1NJX0RTQ19VTkFCTEVfVE9fVEVSTUlOQVRFOgorCQljYXNlIEkyT19TQ1NJX0RTQ19NUl9NRVNTQUdFX1JFQ0VJVkVEOgorCQljYXNlIEkyT19TQ1NJX0RTQ19BVVRPU0VOU0VfRkFJTEVEOgorCQljYXNlIEkyT19TQ1NJX0RTQ19EQVRBX09WRVJSVU46CisJCWNhc2UgSTJPX1NDU0lfRFNDX1VORVhQRUNURURfQlVTX0ZSRUU6CisJCWNhc2UgSTJPX1NDU0lfRFNDX1NFUVVFTkNFX0ZBSUxVUkU6CisJCWNhc2UgSTJPX1NDU0lfRFNDX1JFUVVFU1RfTEVOR1RIX0VSUk9SOgorCQljYXNlIEkyT19TQ1NJX0RTQ19QUk9WSURFX0ZBSUxVUkU6CisJCWNhc2UgSTJPX1NDU0lfRFNDX1JFUVVFU1RfVEVSTUlOQVRFRDoKKwkJY2FzZSBJMk9fU0NTSV9EU0NfSURFX01FU1NBR0VfU0VOVDoKKwkJY2FzZSBJMk9fU0NTSV9EU0NfVU5BQ0tOT1dMRURHRURfRVZFTlQ6CisJCWNhc2UgSTJPX1NDU0lfRFNDX01FU1NBR0VfUkVDRUlWRUQ6CisJCWNhc2UgSTJPX1NDU0lfRFNDX0lOVkFMSURfQ0RCOgorCQljYXNlIEkyT19TQ1NJX0RTQ19MVU5fSU5WQUxJRDoKKwkJY2FzZSBJMk9fU0NTSV9EU0NfU0NTSV9USURfSU5WQUxJRDoKKwkJY2FzZSBJMk9fU0NTSV9EU0NfRlVOQ1RJT05fVU5BVkFJTEFCTEU6CisJCWNhc2UgSTJPX1NDU0lfRFNDX05PX05FWFVTOgorCQljYXNlIEkyT19TQ1NJX0RTQ19DREJfUkVDRUlWRUQ6CisJCWNhc2UgSTJPX1NDU0lfRFNDX0xVTl9BTFJFQURZX0VOQUJMRUQ6CisJCWNhc2UgSTJPX1NDU0lfRFNDX1FVRVVFX0ZST1pFTjoKKwkJY2FzZSBJMk9fU0NTSV9EU0NfUkVRVUVTVF9JTlZBTElEOgorCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyIlczogU0NTSSBlcnJvciAlMHgtRGV2aWNlKCVkLCVkLCVkKSBoYmFfc3RhdHVzPTB4JXgsIGRldl9zdGF0dXM9MHgleCwgY21kPTB4JXhcbiIsCisJCQkJcEhiYS0+bmFtZSwgZGV0YWlsZWRfc3RhdHVzICYgSTJPX1NDU0lfRFNDX01BU0ssICh1MzIpY21kLT5kZXZpY2UtPmNoYW5uZWwsICh1MzIpY21kLT5kZXZpY2UtPmlkLCAodTMyKWNtZC0+ZGV2aWNlLT5sdW4sCisJCQkgICAgICAgaGJhX3N0YXR1cywgZGV2X3N0YXR1cywgY21kLT5jbW5kWzBdKTsKKwkJCWNtZC0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNik7CisJCQlicmVhazsKKwkJfQorCisJCS8vIGNvcHkgb3ZlciB0aGUgcmVxdWVzdCBzZW5zZSBkYXRhIGlmIGl0IHdhcyBhIGNoZWNrCisJCS8vIGNvbmRpdGlvbiBzdGF0dXMKKwkJaWYoZGV2X3N0YXR1cyA9PSAweDAyIC8qQ0hFQ0tfQ09ORElUSU9OKi8pIHsKKwkJCXUzMiBsZW4gPSBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpOworCQkJbGVuID0gKGxlbiA+IDQwKSA/ICA0MCA6IGxlbjsKKwkJCS8vIENvcHkgb3ZlciB0aGUgc2Vuc2UgZGF0YQorCQkJbWVtY3B5KGNtZC0+c2Vuc2VfYnVmZmVyLCAodm9pZCopKHJlcGx5KzI4KSAsIGxlbik7CisJCQlpZihjbWQtPnNlbnNlX2J1ZmZlclswXSA9PSAweDcwIC8qIGNsYXNzIDcgKi8gJiYgCisJCQkgICBjbWQtPnNlbnNlX2J1ZmZlclsyXSA9PSBEQVRBX1BST1RFQ1QgKXsKKwkJCQkvKiBUaGlzIGlzIHRvIGhhbmRsZSBhbiBhcnJheSBmYWlsZWQgKi8KKwkJCQljbWQtPnJlc3VsdCA9IChESURfVElNRV9PVVQgPDwgMTYpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IFNDU0kgRGF0YSBQcm90ZWN0LURldmljZSAoJWQsJWQsJWQpIGhiYV9zdGF0dXM9MHgleCwgZGV2X3N0YXR1cz0weCV4LCBjbWQ9MHgleFxuIiwKKwkJCQkJcEhiYS0+bmFtZSwgKHUzMiljbWQtPmRldmljZS0+Y2hhbm5lbCwgKHUzMiljbWQtPmRldmljZS0+aWQsICh1MzIpY21kLT5kZXZpY2UtPmx1biwgCisJCQkJCWhiYV9zdGF0dXMsIGRldl9zdGF0dXMsIGNtZC0+Y21uZFswXSk7CisKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qIEluIHRoaXMgY29uZHRpb24gd2UgY291bGQgbm90IHRhbGsgdG8gdGhlIHRpZAorCQkgKiB0aGUgY2FyZCByZWplY3RlZCBpdC4gIFdlIHNob3VsZCBzaWduYWwgYSByZXRyeQorCQkgKiBmb3IgYSBsaW1pdHRlZCBudW1iZXIgb2YgcmV0cmllcy4KKwkJICovCisJCWNtZC0+cmVzdWx0ID0gKERJRF9USU1FX09VVCA8PCAxNik7CisJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IEkyTyBNU0dfRkFJTCAtIERldmljZSAoJWQsJWQsJWQpIHRpZD0lZCwgY21kPTB4JXhcbiIsCisJCQlwSGJhLT5uYW1lLCAodTMyKWNtZC0+ZGV2aWNlLT5jaGFubmVsLCAodTMyKWNtZC0+ZGV2aWNlLT5pZCwgKHUzMiljbWQtPmRldmljZS0+bHVuLAorCQkJKChzdHJ1Y3QgYWRwdF9kZXZpY2UqKShjbWQtPmRldmljZS0+aG9zdGRhdGEpKS0+dGlkLCBjbWQtPmNtbmRbMF0pOworCX0KKworCWNtZC0+cmVzdWx0IHw9IChkZXZfc3RhdHVzKTsKKworCWlmKGNtZC0+c2NzaV9kb25lICE9IE5VTEwpeworCQljbWQtPnNjc2lfZG9uZShjbWQpOworCX0gCisJcmV0dXJuIGNtZC0+cmVzdWx0OworfQorCisKK3N0YXRpYyBzMzIgYWRwdF9yZXNjYW4oYWRwdF9oYmEqIHBIYmEpCit7CisJczMyIHJjb2RlOworCXVsb25nIGZsYWdzID0gMDsKKworCWlmKHBIYmEtPmhvc3QpCisJCXNwaW5fbG9ja19pcnFzYXZlKHBIYmEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWlmICgocmNvZGU9YWRwdF9pMm9fbGN0X2dldChwSGJhKSkgPCAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHJjb2RlPWFkcHRfaTJvX3JlcGFyc2VfbGN0KHBIYmEpKSA8IDApCisJCWdvdG8gb3V0OworCXJjb2RlID0gMDsKK291dDoJaWYocEhiYS0+aG9zdCkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwSGJhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmNvZGU7Cit9CisKKworc3RhdGljIHMzMiBhZHB0X2kyb19yZXBhcnNlX2xjdChhZHB0X2hiYSogcEhiYSkKK3sKKwlpbnQgaTsKKwlpbnQgbWF4OworCWludCB0aWQ7CisJc3RydWN0IGkyb19kZXZpY2UgKmQ7CisJaTJvX2xjdCAqbGN0ID0gcEhiYS0+bGN0OworCXU4IGJ1c19ubyA9IDA7CisJczE2IHNjc2lfaWQ7CisJczE2IHNjc2lfbHVuOworCXUzMiBidWZbMTBdOyAvLyBhdCBsZWFzdCA4IHUzMidzCisJc3RydWN0IGFkcHRfZGV2aWNlKiBwRGV2ID0gTlVMTDsKKwlzdHJ1Y3QgaTJvX2RldmljZSogcEkyb19kZXYgPSBOVUxMOworCQorCWlmIChsY3QgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBMQ1QgaXMgZW1wdHk/Pz9cbiIscEhiYS0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJCisJbWF4ID0gbGN0LT50YWJsZV9zaXplOwkKKwltYXggLT0gMzsKKwltYXggLz0gOTsKKworCS8vIE1hcmsgZWFjaCBkcml2ZSBhcyB1bnNjYW5uZWQKKwlmb3IgKGQgPSBwSGJhLT5kZXZpY2VzOyBkOyBkID0gZC0+bmV4dCkgeworCQlwRGV2ID0oc3RydWN0IGFkcHRfZGV2aWNlKikgZC0+b3duZXI7CisJCWlmKCFwRGV2KXsKKwkJCWNvbnRpbnVlOworCQl9CisJCXBEZXYtPnN0YXRlIHw9IERQVElfREVWX1VOU0NBTk5FRDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogTENUIGhhcyAlZCBlbnRyaWVzLlxuIiwgcEhiYS0+bmFtZSxtYXgpOworCQorCWZvcihpPTA7aTxtYXg7aSsrKSB7CisJCWlmKCBsY3QtPmxjdF9lbnRyeVtpXS51c2VyX3RpZCAhPSAweGZmZil7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmKCBsY3QtPmxjdF9lbnRyeVtpXS5jbGFzc19pZCA9PSBJMk9fQ0xBU1NfUkFORE9NX0JMT0NLX1NUT1JBR0UgfHwKKwkJICAgIGxjdC0+bGN0X2VudHJ5W2ldLmNsYXNzX2lkID09IEkyT19DTEFTU19TQ1NJX1BFUklQSEVSQUwgfHwKKwkJICAgIGxjdC0+bGN0X2VudHJ5W2ldLmNsYXNzX2lkID09IEkyT19DTEFTU19GSUJSRV9DSEFOTkVMX1BFUklQSEVSQUwgKXsKKwkJCXRpZCA9IGxjdC0+bGN0X2VudHJ5W2ldLnRpZDsKKwkJCWlmKGFkcHRfaTJvX3F1ZXJ5X3NjYWxhcihwSGJhLCB0aWQsIDB4ODAwMCwgLTEsIGJ1ZiwgMzIpPDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIiJXM6IENvdWxkIG5vdCBxdWVyeSBkZXZpY2VcbiIscEhiYS0+bmFtZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlidXNfbm8gPSBidWZbMF0+PjE2OworCQkJc2NzaV9pZCA9IGJ1ZlsxXTsKKwkJCXNjc2lfbHVuID0gKGJ1ZlsyXT4+OCApJjB4ZmY7CisJCQlwRGV2ID0gcEhiYS0+Y2hhbm5lbFtidXNfbm9dLmRldmljZVtzY3NpX2lkXTsKKwkJCS8qIGRhIGx1biAqLworCQkJd2hpbGUocERldikgeworCQkJCWlmKHBEZXYtPnNjc2lfbHVuID09IHNjc2lfbHVuKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwRGV2ID0gcERldi0+bmV4dF9sdW47CisJCQl9CisJCQlpZighcERldiApIHsgLy8gU29tZXRoaW5nIG5ldyBhZGQgaXQKKwkJCQlkID0gKHN0cnVjdCBpMm9fZGV2aWNlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGkyb19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwkJCQlpZihkPT1OVUxMKQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fQ1JJVCAiT3V0IG9mIG1lbW9yeSBmb3IgSTJPIGRldmljZSBkYXRhLlxuIik7CisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCX0KKwkJCQkKKwkJCQlkLT5jb250cm9sbGVyID0gKHZvaWQqKXBIYmE7CisJCQkJZC0+bmV4dCA9IE5VTEw7CisKKwkJCQltZW1jcHkoJmQtPmxjdF9kYXRhLCAmbGN0LT5sY3RfZW50cnlbaV0sIHNpemVvZihpMm9fbGN0X2VudHJ5KSk7CisKKwkJCQlkLT5mbGFncyA9IDA7CisJCQkJYWRwdF9pMm9fcmVwb3J0X2hiYV91bml0KHBIYmEsIGQpOworCQkJCWFkcHRfaTJvX2luc3RhbGxfZGV2aWNlKHBIYmEsIGQpOworCQorCQkJCWlmKGJ1c19ubyA+PSBNQVhfQ0hBTk5FTCkgewkvLyBTb21ldGhpbmcgd3Jvbmcgc2tpcCBpdAorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBDaGFubmVsIG51bWJlciAlZCBvdXQgb2YgcmFuZ2UgXG4iLCBwSGJhLT5uYW1lLCBidXNfbm8pOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJcERldiA9IHBIYmEtPmNoYW5uZWxbYnVzX25vXS5kZXZpY2Vbc2NzaV9pZF07CQorCQkJCWlmKCBwRGV2ID09IE5VTEwpeworCQkJCQlwRGV2ID0gIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZHB0X2RldmljZSksR0ZQX0tFUk5FTCk7CisJCQkJCWlmKHBEZXYgPT0gTlVMTCkgeworCQkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJCX0KKwkJCQkJcEhiYS0+Y2hhbm5lbFtidXNfbm9dLmRldmljZVtzY3NpX2lkXSA9IHBEZXY7CisJCQkJfSBlbHNlIHsKKwkJCQkJd2hpbGUgKHBEZXYtPm5leHRfbHVuKSB7CisJCQkJCQlwRGV2ID0gcERldi0+bmV4dF9sdW47CisJCQkJCX0KKwkJCQkJcERldiA9IHBEZXYtPm5leHRfbHVuID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFkcHRfZGV2aWNlKSxHRlBfS0VSTkVMKTsKKwkJCQkJaWYocERldiA9PSBOVUxMKSB7CisJCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQkJfQorCQkJCX0KKwkJCQltZW1zZXQocERldiwwLHNpemVvZihzdHJ1Y3QgYWRwdF9kZXZpY2UpKTsKKwkJCQlwRGV2LT50aWQgPSBkLT5sY3RfZGF0YS50aWQ7CisJCQkJcERldi0+c2NzaV9jaGFubmVsID0gYnVzX25vOworCQkJCXBEZXYtPnNjc2lfaWQgPSBzY3NpX2lkOworCQkJCXBEZXYtPnNjc2lfbHVuID0gc2NzaV9sdW47CisJCQkJcERldi0+cEkyb19kZXYgPSBkOworCQkJCWQtPm93bmVyID0gcERldjsKKwkJCQlwRGV2LT50eXBlID0gKGJ1ZlswXSkmMHhmZjsKKwkJCQlwRGV2LT5mbGFncyA9IChidWZbMF0+PjgpJjB4ZmY7CisJCQkJLy8gVG9vIGxhdGUsIFNDU0kgc3lzdGVtIGhhcyBtYWRlIHVwIGl0J3MgbWluZCwgYnV0IHdoYXQgdGhlIGhleSAuLi4KKwkJCQlpZihzY3NpX2lkID4gcEhiYS0+dG9wX3Njc2lfaWQpeworCQkJCQlwSGJhLT50b3Bfc2NzaV9pZCA9IHNjc2lfaWQ7CisJCQkJfQorCQkJCWlmKHNjc2lfbHVuID4gcEhiYS0+dG9wX3Njc2lfbHVuKXsKKwkJCQkJcEhiYS0+dG9wX3Njc2lfbHVuID0gc2NzaV9sdW47CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfSAvLyBlbmQgb2YgbmV3IGkybyBkZXZpY2UKKworCQkJLy8gV2UgZm91bmQgYW4gb2xkIGRldmljZSAtIGNoZWNrIGl0CisJCQl3aGlsZShwRGV2KSB7CisJCQkJaWYocERldi0+c2NzaV9sdW4gPT0gc2NzaV9sdW4pIHsKKwkJCQkJaWYoIXNjc2lfZGV2aWNlX29ubGluZShwRGV2LT5wU2NzaV9kZXYpKSB7CisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBTZXR0aW5nIGRldmljZSAoJWQsJWQsJWQpIGJhY2sgb25saW5lXG4iLAorCQkJCQkJCQlwSGJhLT5uYW1lLGJ1c19ubyxzY3NpX2lkLHNjc2lfbHVuKTsKKwkJCQkJCWlmIChwRGV2LT5wU2NzaV9kZXYpIHsKKwkJCQkJCQlzY3NpX2RldmljZV9zZXRfc3RhdGUocERldi0+cFNjc2lfZGV2LCBTREVWX1JVTk5JTkcpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWQgPSBwRGV2LT5wSTJvX2RldjsKKwkJCQkJaWYoZC0+bGN0X2RhdGEudGlkICE9IHRpZCkgeyAvLyBzb21ldGhpbmcgY2hhbmdlZAorCQkJCQkJcERldi0+dGlkID0gdGlkOworCQkJCQkJbWVtY3B5KCZkLT5sY3RfZGF0YSwgJmxjdC0+bGN0X2VudHJ5W2ldLCBzaXplb2YoaTJvX2xjdF9lbnRyeSkpOworCQkJCQkJaWYgKHBEZXYtPnBTY3NpX2RldikgeworCQkJCQkJCXBEZXYtPnBTY3NpX2Rldi0+Y2hhbmdlZCA9IFRSVUU7CisJCQkJCQkJcERldi0+cFNjc2lfZGV2LT5yZW1vdmFibGUgPSBUUlVFOworCQkJCQkJfQorCQkJCQl9CisJCQkJCS8vIEZvdW5kIGl0IC0gbWFyayBpdCBzY2FubmVkCisJCQkJCXBEZXYtPnN0YXRlID0gRFBUSV9ERVZfT05MSU5FOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcERldiA9IHBEZXYtPm5leHRfbHVuOworCQkJfQorCQl9CisJfQorCWZvciAocEkyb19kZXYgPSBwSGJhLT5kZXZpY2VzOyBwSTJvX2RldjsgcEkyb19kZXYgPSBwSTJvX2Rldi0+bmV4dCkgeworCQlwRGV2ID0oc3RydWN0IGFkcHRfZGV2aWNlKikgcEkyb19kZXYtPm93bmVyOworCQlpZighcERldil7CisJCQljb250aW51ZTsKKwkJfQorCQkvLyBEcml2ZSBvZmZsaW5lIGRyaXZlcyB0aGF0IHByZXZpb3VzbHkgZXhpc3RlZCBidXQgY291bGQgbm90IGJlIGZvdW5kCisJCS8vIGluIHRoZSBMQ1QgdGFibGUKKwkJaWYgKHBEZXYtPnN0YXRlICYgRFBUSV9ERVZfVU5TQ0FOTkVEKXsKKwkJCXBEZXYtPnN0YXRlID0gRFBUSV9ERVZfT0ZGTElORTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IERldmljZSAoJWQsJWQsJWQpIG9mZmxpbmVcbiIscEhiYS0+bmFtZSxwRGV2LT5zY3NpX2NoYW5uZWwscERldi0+c2NzaV9pZCxwRGV2LT5zY3NpX2x1bik7CisJCQlpZiAocERldi0+cFNjc2lfZGV2KSB7CisJCQkJc2NzaV9kZXZpY2Vfc2V0X3N0YXRlKHBEZXYtPnBTY3NpX2RldiwgU0RFVl9PRkZMSU5FKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWRwdF9mYWlsX3Bvc3RlZF9zY2JzKGFkcHRfaGJhKiBwSGJhKQoreworCXN0cnVjdCBzY3NpX2NtbmQqIAljbWQgPSBOVUxMOworCXN0cnVjdCBzY3NpX2RldmljZSogCWQgPSBOVUxMOworCisJc2hvc3RfZm9yX2VhY2hfZGV2aWNlKGQsIHBIYmEtPmhvc3QpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPmxpc3RfbG9jaywgZmxhZ3MpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNtZCwgJmQtPmNtZF9saXN0LCBsaXN0KSB7CisJCQlpZihjbWQtPnNlcmlhbF9udW1iZXIgPT0gMCl7CisJCQkJY29udGludWU7CisJCQl9CisJCQljbWQtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpIHwgKFFVRVVFX0ZVTEwgPDwxKTsKKwkJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bGlzdF9sb2NrLCBmbGFncyk7CisJfQorfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogIFJvdXRpbmVzIGZyb20gaTJvIHN1YnN5c3RlbQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworCisKKy8qCisgKglCcmluZyBhbiBJMk8gY29udHJvbGxlciBpbnRvIEhPTEQgc3RhdGUuIFNlZSB0aGUgc3BlYy4KKyAqLworc3RhdGljIGludCBhZHB0X2kyb19hY3RpdmF0ZV9oYmEoYWRwdF9oYmEqIHBIYmEpCit7CisJaW50IHJjb2RlOworCisJaWYocEhiYS0+aW5pdGlhbGl6ZWQgKSB7CisJCWlmIChhZHB0X2kyb19zdGF0dXNfZ2V0KHBIYmEpIDwgMCkgeworCQkJaWYoKHJjb2RlID0gYWRwdF9pMm9fcmVzZXRfaGJhKHBIYmEpKSAhPSAwKXsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBDb3VsZCBOT1QgcmVzZXQuXG4iLCBwSGJhLT5uYW1lKTsKKwkJCQlyZXR1cm4gcmNvZGU7CisJCQl9CisJCQlpZiAoYWRwdF9pMm9fc3RhdHVzX2dldChwSGJhKSA8IDApIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJIQkEgbm90IHJlc3BvbmRpbmcuXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKworCQlpZihwSGJhLT5zdGF0dXNfYmxvY2stPmlvcF9zdGF0ZSA9PSBBREFQVEVSX1NUQVRFX0ZBVUxURUQpIHsKKwkJCXByaW50ayhLRVJOX0NSSVQgIiVzOiBoYXJkd2FyZSBmYXVsdFxuIiwgcEhiYS0+bmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAocEhiYS0+c3RhdHVzX2Jsb2NrLT5pb3Bfc3RhdGUgPT0gQURBUFRFUl9TVEFURV9SRUFEWSB8fAorCQkgICAgcEhiYS0+c3RhdHVzX2Jsb2NrLT5pb3Bfc3RhdGUgPT0gQURBUFRFUl9TVEFURV9PUEVSQVRJT05BTCB8fAorCQkgICAgcEhiYS0+c3RhdHVzX2Jsb2NrLT5pb3Bfc3RhdGUgPT0gQURBUFRFUl9TVEFURV9IT0xEIHx8CisJCSAgICBwSGJhLT5zdGF0dXNfYmxvY2stPmlvcF9zdGF0ZSA9PSBBREFQVEVSX1NUQVRFX0ZBSUxFRCkgeworCQkJYWRwdF9pMm9fcmVzZXRfaGJhKHBIYmEpOwkJCQorCQkJaWYgKGFkcHRfaTJvX3N0YXR1c19nZXQocEhiYSkgPCAwIHx8IHBIYmEtPnN0YXR1c19ibG9jay0+aW9wX3N0YXRlICE9IEFEQVBURVJfU1RBVEVfUkVTRVQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZS5cbiIsIHBIYmEtPm5hbWUpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmKChyY29kZSA9IGFkcHRfaTJvX3Jlc2V0X2hiYShwSGJhKSkgIT0gMCl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBDb3VsZCBOT1QgcmVzZXQuXG4iLCBwSGJhLT5uYW1lKTsKKwkJCXJldHVybiByY29kZTsKKwkJfQorCisJfQorCisJaWYgKGFkcHRfaTJvX2luaXRfb3V0Ym91bmRfcShwSGJhKSA8IDApIHsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEluIEhPTEQgc3RhdGUgKi8KKwkKKwlpZiAoYWRwdF9pMm9faHJ0X2dldChwSGJhKSA8IDApIHsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICoJQnJpbmcgYSBjb250cm9sbGVyIG9ubGluZSBpbnRvIE9QRVJBVElPTkFMIHN0YXRlLiAKKyAqLworIAorc3RhdGljIGludCBhZHB0X2kyb19vbmxpbmVfaGJhKGFkcHRfaGJhKiBwSGJhKQoreworCWlmIChhZHB0X2kyb19zeXN0YWJfc2VuZChwSGJhKSA8IDApIHsKKwkJYWRwdF9pMm9fZGVsZXRlX2hiYShwSGJhKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKiBJbiBSRUFEWSBzdGF0ZSAqLworCisJaWYgKGFkcHRfaTJvX2VuYWJsZV9oYmEocEhiYSkgPCAwKSB7CisJCWFkcHRfaTJvX2RlbGV0ZV9oYmEocEhiYSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBJbiBPUEVSQVRJT05BTCBzdGF0ZSAgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHMzMiBhZHB0X3NlbmRfbm9wKGFkcHRfaGJhKnBIYmEsdTMyIG0pCit7CisJdTMyIF9faW9tZW0gKm1zZzsKKwl1bG9uZyB0aW1lb3V0ID0gamlmZmllcyArIDUqSFo7CisKKwl3aGlsZShtID09IEVNUFRZX1FVRVVFKXsKKwkJcm1iKCk7CisJCW0gPSByZWFkbChwSGJhLT5wb3N0X3BvcnQpOworCQlpZihtICE9IEVNUFRZX1FVRVVFKXsKKwkJCWJyZWFrOworCQl9CisJCWlmKHRpbWVfYWZ0ZXIoamlmZmllcyx0aW1lb3V0KSl7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUaW1lb3V0IHdhaXRpbmcgZm9yIG1lc3NhZ2UgZnJhbWUhXG4iLHBIYmEtPm5hbWUpOworCQkJcmV0dXJuIDI7CisJCX0KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKwltc2cgPSAodTMyIF9faW9tZW0gKikocEhiYS0+bXNnX2FkZHJfdmlydCArIG0pOworCXdyaXRlbCggVEhSRUVfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfMCwmbXNnWzBdKTsKKwl3cml0ZWwoIEkyT19DTURfVVRJTF9OT1AgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IDAsJm1zZ1sxXSk7CisJd3JpdGVsKCAwLCZtc2dbMl0pOworCXdtYigpOworCisJd3JpdGVsKG0sIHBIYmEtPnBvc3RfcG9ydCk7CisJd21iKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzMzIgYWRwdF9pMm9faW5pdF9vdXRib3VuZF9xKGFkcHRfaGJhKiBwSGJhKQoreworCXU4ICpzdGF0dXM7CisJdTMyIF9faW9tZW0gKm1zZyA9IE5VTEw7CisJaW50IGk7CisJdWxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBUTU9VVF9JTklUT1VUQk9VTkQqSFo7CisJdTMyKiBwdHI7CisJdTMyIG91dGJvdW5kX2ZyYW1lOyAgLy8gVGhpcyBoYWQgdG8gYmUgYSAzMiBiaXQgYWRkcmVzcworCXUzMiBtOworCisJZG8geworCQlybWIoKTsKKwkJbSA9IHJlYWRsKHBIYmEtPnBvc3RfcG9ydCk7CisJCWlmIChtICE9IEVNUFRZX1FVRVVFKSB7CisJCQlicmVhazsKKwkJfQorCisJCWlmKHRpbWVfYWZ0ZXIoamlmZmllcyx0aW1lb3V0KSl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBUaW1lb3V0IHdhaXRpbmcgZm9yIG1lc3NhZ2UgZnJhbWVcbiIscEhiYS0+bmFtZSk7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfSB3aGlsZShtID09IEVNUFRZX1FVRVVFKTsKKworCW1zZz0odTMyIF9faW9tZW0gKikocEhiYS0+bXNnX2FkZHJfdmlydCttKTsKKworCXN0YXR1cyA9IGttYWxsb2MoNCxHRlBfS0VSTkVMfEFERFIzMik7CisJaWYgKHN0YXR1cz09TlVMTCkgeworCQlhZHB0X3NlbmRfbm9wKHBIYmEsIG0pOworCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBJT1AgcmVzZXQgZmFpbGVkIC0gbm8gZnJlZSBtZW1vcnkuXG4iLAorCQkJcEhiYS0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoc3RhdHVzLCAwLCA0KTsKKworCXdyaXRlbChFSUdIVF9XT1JEX01TR19TSVpFfCBTR0xfT0ZGU0VUXzYsICZtc2dbMF0pOworCXdyaXRlbChJMk9fQ01EX09VVEJPVU5EX0lOSVQ8PDI0IHwgSE9TVF9USUQ8PDEyIHwgQURBUFRFUl9USUQsICZtc2dbMV0pOworCXdyaXRlbCgwLCAmbXNnWzJdKTsKKwl3cml0ZWwoMHgwMTA2LCAmbXNnWzNdKTsJLyogVHJhbnNhY3Rpb24gY29udGV4dCAqLworCXdyaXRlbCg0MDk2LCAmbXNnWzRdKTsJCS8qIEhvc3QgcGFnZSBmcmFtZSBzaXplICovCisJd3JpdGVsKChSRVBMWV9GUkFNRV9TSVpFKTw8MTZ8MHg4MCwgJm1zZ1s1XSk7CS8qIE91dGJvdW5kIG1zZyBmcmFtZSBzaXplIGFuZCBJbml0Y29kZSAqLworCXdyaXRlbCgweEQwMDAwMDA0LCAmbXNnWzZdKTsJCS8qIFNpbXBsZSBTRyBMRSwgRU9CICovCisJd3JpdGVsKHZpcnRfdG9fYnVzKHN0YXR1cyksICZtc2dbN10pOworCisJd3JpdGVsKG0sIHBIYmEtPnBvc3RfcG9ydCk7CisJd21iKCk7CisKKwkvLyBXYWl0IGZvciB0aGUgcmVwbHkgc3RhdHVzIHRvIGNvbWUgYmFjaworCWRvIHsKKwkJaWYgKCpzdGF0dXMpIHsKKwkJCWlmICgqc3RhdHVzICE9IDB4MDEgLypJMk9fRVhFQ19PVVRCT1VORF9JTklUX0lOX1BST0dSRVNTKi8pIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlybWIoKTsKKwkJaWYodGltZV9hZnRlcihqaWZmaWVzLHRpbWVvdXQpKXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IFRpbWVvdXQgSW5pdGlhbGl6aW5nXG4iLHBIYmEtPm5hbWUpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0gd2hpbGUgKDEpOworCisJLy8gSWYgdGhlIGNvbW1hbmQgd2FzIHN1Y2Nlc3NmdWwsIGZpbGwgdGhlIGZpZm8gd2l0aCBvdXIgcmVwbHkKKwkvLyBtZXNzYWdlIHBhY2tldHMKKwlpZigqc3RhdHVzICE9IDB4MDQgLypJMk9fRVhFQ19PVVRCT1VORF9JTklUX0NPTVBMRVRFKi8pIHsKKwkJa2ZyZWUoKHZvaWQqKXN0YXR1cyk7CisJCXJldHVybiAtMjsKKwl9CisJa2ZyZWUoKHZvaWQqKXN0YXR1cyk7CisKKwlpZihwSGJhLT5yZXBseV9wb29sICE9IE5VTEwpeworCQlrZnJlZShwSGJhLT5yZXBseV9wb29sKTsKKwl9CisKKwlwSGJhLT5yZXBseV9wb29sID0gKHUzMiopa21hbGxvYyhwSGJhLT5yZXBseV9maWZvX3NpemUgKiBSRVBMWV9GUkFNRV9TSVpFICogNCwgR0ZQX0tFUk5FTHxBRERSMzIpOworCWlmKCFwSGJhLT5yZXBseV9wb29sKXsKKwkJcHJpbnRrKEtFUk5fRVJSIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgcmVwbHkgcG9vbFxuIixwSGJhLT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQocEhiYS0+cmVwbHlfcG9vbCwgMCAsIHBIYmEtPnJlcGx5X2ZpZm9fc2l6ZSAqIFJFUExZX0ZSQU1FX1NJWkUgKiA0KTsKKworCXB0ciA9IHBIYmEtPnJlcGx5X3Bvb2w7CisJZm9yKGkgPSAwOyBpIDwgcEhiYS0+cmVwbHlfZmlmb19zaXplOyBpKyspIHsKKwkJb3V0Ym91bmRfZnJhbWUgPSAodTMyKXZpcnRfdG9fYnVzKHB0cik7CisJCXdyaXRlbChvdXRib3VuZF9mcmFtZSwgcEhiYS0+cmVwbHlfcG9ydCk7CisJCXdtYigpOworCQlwdHIgKz0gIFJFUExZX0ZSQU1FX1NJWkU7CisJfQorCWFkcHRfaTJvX3N0YXR1c19nZXQocEhiYSk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEkyTyBTeXN0ZW0gVGFibGUuICBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dAorICogYWxsIHRoZSBJT1BzIGluIHRoZSBzeXN0ZW0uICBVc2VkIHRvIGluZm9ybSBJT1BzCisgKiBhYm91dCBlYWNoIG90aGVyJ3MgZXhpc3RlbmNlLgorICoKKyAqIHN5c190YmxfdmVyIGlzIHRoZSBDdXJyZW50Q2hhbmdlSW5kaWNhdG9yIHRoYXQgaXMKKyAqIHVzZWQgYnkgSU9QcyB0byB0cmFjayBjaGFuZ2VzLgorICovCisKKworCitzdGF0aWMgczMyIGFkcHRfaTJvX3N0YXR1c19nZXQoYWRwdF9oYmEqIHBIYmEpCit7CisJdWxvbmcgdGltZW91dDsKKwl1MzIgbTsKKwl1MzIgX19pb21lbSAqbXNnOworCXU4ICpzdGF0dXNfYmxvY2s9TlVMTDsKKwl1bG9uZyBzdGF0dXNfYmxvY2tfYnVzOworCisJaWYocEhiYS0+c3RhdHVzX2Jsb2NrID09IE5VTEwpIHsKKwkJcEhiYS0+c3RhdHVzX2Jsb2NrID0gKGkyb19zdGF0dXNfYmxvY2sqKQorCQkJa21hbGxvYyhzaXplb2YoaTJvX3N0YXR1c19ibG9jayksR0ZQX0tFUk5FTHxBRERSMzIpOworCQlpZihwSGJhLT5zdGF0dXNfYmxvY2sgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkiZHB0aSVkOiBHZXQgU3RhdHVzIEJsb2NrIGZhaWxlZDsgT3V0IG9mIG1lbW9yeS4gXG4iLCAKKwkJCXBIYmEtPnVuaXQpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJbWVtc2V0KHBIYmEtPnN0YXR1c19ibG9jaywgMCwgc2l6ZW9mKGkyb19zdGF0dXNfYmxvY2spKTsKKwlzdGF0dXNfYmxvY2sgPSAodTgqKShwSGJhLT5zdGF0dXNfYmxvY2spOworCXN0YXR1c19ibG9ja19idXMgPSB2aXJ0X3RvX2J1cyhwSGJhLT5zdGF0dXNfYmxvY2spOworCXRpbWVvdXQgPSBqaWZmaWVzK1RNT1VUX0dFVFNUQVRVUypIWjsKKwlkbyB7CisJCXJtYigpOworCQltID0gcmVhZGwocEhiYS0+cG9zdF9wb3J0KTsKKwkJaWYgKG0gIT0gRU1QVFlfUVVFVUUpIHsKKwkJCWJyZWFrOworCQl9CisJCWlmKHRpbWVfYWZ0ZXIoamlmZmllcyx0aW1lb3V0KSl7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUaW1lb3V0IHdhaXRpbmcgZm9yIG1lc3NhZ2UgIVxuIiwKKwkJCQkJcEhiYS0+bmFtZSk7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfSB3aGlsZShtPT1FTVBUWV9RVUVVRSk7CisKKwkKKwltc2c9KHUzMiBfX2lvbWVtICopKHBIYmEtPm1zZ19hZGRyX3ZpcnQrbSk7CisKKwl3cml0ZWwoTklORV9XT1JEX01TR19TSVpFfFNHTF9PRkZTRVRfMCwgJm1zZ1swXSk7CisJd3JpdGVsKEkyT19DTURfU1RBVFVTX0dFVDw8MjR8SE9TVF9USUQ8PDEyfEFEQVBURVJfVElELCAmbXNnWzFdKTsKKwl3cml0ZWwoMSwgJm1zZ1syXSk7CisJd3JpdGVsKDAsICZtc2dbM10pOworCXdyaXRlbCgwLCAmbXNnWzRdKTsKKwl3cml0ZWwoMCwgJm1zZ1s1XSk7CisJd3JpdGVsKCgodTMyKXN0YXR1c19ibG9ja19idXMpJjB4ZmZmZmZmZmYsICZtc2dbNl0pOworCXdyaXRlbCgwLCAmbXNnWzddKTsKKwl3cml0ZWwoc2l6ZW9mKGkyb19zdGF0dXNfYmxvY2spLCAmbXNnWzhdKTsgLy8gODggYnl0ZXMKKworCS8vcG9zdCBtZXNzYWdlCisJd3JpdGVsKG0sIHBIYmEtPnBvc3RfcG9ydCk7CisJd21iKCk7CisKKwl3aGlsZShzdGF0dXNfYmxvY2tbODddIT0weGZmKXsKKwkJaWYodGltZV9hZnRlcihqaWZmaWVzLHRpbWVvdXQpKXsKKwkJCXByaW50ayhLRVJOX0VSUiJkcHRpJWQ6IEdldCBzdGF0dXMgdGltZW91dC5cbiIsCisJCQkJcEhiYS0+dW5pdCk7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCQlybWIoKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCS8vIFNldCB1cCBvdXIgbnVtYmVyIG9mIG91dGJvdW5kIGFuZCBpbmJvdW5kIG1lc3NhZ2VzCisJcEhiYS0+cG9zdF9maWZvX3NpemUgPSBwSGJhLT5zdGF0dXNfYmxvY2stPm1heF9pbmJvdW5kX2ZyYW1lczsKKwlpZiAocEhiYS0+cG9zdF9maWZvX3NpemUgPiBNQVhfVE9fSU9QX01FU1NBR0VTKSB7CisJCXBIYmEtPnBvc3RfZmlmb19zaXplID0gTUFYX1RPX0lPUF9NRVNTQUdFUzsKKwl9CisKKwlwSGJhLT5yZXBseV9maWZvX3NpemUgPSBwSGJhLT5zdGF0dXNfYmxvY2stPm1heF9vdXRib3VuZF9mcmFtZXM7CisJaWYgKHBIYmEtPnJlcGx5X2ZpZm9fc2l6ZSA+IE1BWF9GUk9NX0lPUF9NRVNTQUdFUykgeworCQlwSGJhLT5yZXBseV9maWZvX3NpemUgPSBNQVhfRlJPTV9JT1BfTUVTU0FHRVM7CisJfQorCisJLy8gQ2FsY3VsYXRlIHRoZSBTY2F0dGVyIEdhdGhlciBsaXN0IHNpemUKKwlwSGJhLT5zZ190YWJsZXNpemUgPSAocEhiYS0+c3RhdHVzX2Jsb2NrLT5pbmJvdW5kX2ZyYW1lX3NpemUgKiA0IC00MCkvIHNpemVvZihzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQpOworCWlmIChwSGJhLT5zZ190YWJsZXNpemUgPiBTR19MSVNUX0VMRU1FTlRTKSB7CisJCXBIYmEtPnNnX3RhYmxlc2l6ZSA9IFNHX0xJU1RfRUxFTUVOVFM7CisJfQorCisKKyNpZmRlZiBERUJVRworCXByaW50aygiZHB0aSVkOiBTdGF0ZSA9ICIscEhiYS0+dW5pdCk7CisJc3dpdGNoKHBIYmEtPnN0YXR1c19ibG9jay0+aW9wX3N0YXRlKSB7CisJCWNhc2UgMHgwMToKKwkJCXByaW50aygiSU5JVFxuIik7CisJCQlicmVhazsKKwkJY2FzZSAweDAyOgorCQkJcHJpbnRrKCJSRVNFVFxuIik7CisJCQlicmVhazsKKwkJY2FzZSAweDA0OgorCQkJcHJpbnRrKCJIT0xEXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDU6CisJCQlwcmludGsoIlJFQURZXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDg6CisJCQlwcmludGsoIk9QRVJBVElPTkFMXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MTA6CisJCQlwcmludGsoIkZBSUxFRFxuIik7CisJCQlicmVhazsKKwkJY2FzZSAweDExOgorCQkJcHJpbnRrKCJGQVVMVEVEXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCIleCAodW5rbm93biEhKVxuIixwSGJhLT5zdGF0dXNfYmxvY2stPmlvcF9zdGF0ZSk7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgdGhlIElPUCdzIExvZ2ljYWwgQ29uZmlndXJhdGlvbiBUYWJsZQorICovCitzdGF0aWMgaW50IGFkcHRfaTJvX2xjdF9nZXQoYWRwdF9oYmEqIHBIYmEpCit7CisJdTMyIG1zZ1s4XTsKKwlpbnQgcmV0OworCXUzMiBidWZbMTZdOworCisJaWYgKChwSGJhLT5sY3Rfc2l6ZSA9PSAwKSB8fCAocEhiYS0+bGN0ID09IE5VTEwpKXsKKwkJcEhiYS0+bGN0X3NpemUgPSBwSGJhLT5zdGF0dXNfYmxvY2stPmV4cGVjdGVkX2xjdF9zaXplOworCX0KKwlkbyB7CisJCWlmIChwSGJhLT5sY3QgPT0gTlVMTCkgeworCQkJcEhiYS0+bGN0ID0ga21hbGxvYyhwSGJhLT5sY3Rfc2l6ZSwgR0ZQX0tFUk5FTHxBRERSMzIpOworCQkJaWYocEhiYS0+bGN0ID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9DUklUICIlczogTGN0IEdldCBmYWlsZWQuIE91dCBvZiBtZW1vcnkuXG4iLAorCQkJCQlwSGJhLT5uYW1lKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJfQorCQltZW1zZXQocEhiYS0+bGN0LCAwLCBwSGJhLT5sY3Rfc2l6ZSk7CisKKwkJbXNnWzBdID0gRUlHSFRfV09SRF9NU0dfU0laRXxTR0xfT0ZGU0VUXzY7CisJCW1zZ1sxXSA9IEkyT19DTURfTENUX05PVElGWTw8MjQgfCBIT1NUX1RJRDw8MTIgfCBBREFQVEVSX1RJRDsKKwkJbXNnWzJdID0gMDsKKwkJbXNnWzNdID0gMDsKKwkJbXNnWzRdID0gMHhGRkZGRkZGRjsJLyogQWxsIGRldmljZXMgKi8KKwkJbXNnWzVdID0gMHgwMDAwMDAwMDsJLyogUmVwb3J0IG5vdyAqLworCQltc2dbNl0gPSAweEQwMDAwMDAwfHBIYmEtPmxjdF9zaXplOworCQltc2dbN10gPSB2aXJ0X3RvX2J1cyhwSGJhLT5sY3QpOworCisJCWlmICgocmV0PWFkcHRfaTJvX3Bvc3Rfd2FpdChwSGJhLCBtc2csIHNpemVvZihtc2cpLCAzNjApKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogTENUIEdldCBmYWlsZWQgKHN0YXR1cz0lIzEweC5cbiIsIAorCQkJCXBIYmEtPm5hbWUsIHJldCk7CQorCQkJcHJpbnRrKEtFUk5fRVJSIkFkYXB0ZWM6IEVycm9yIFJlYWRpbmcgSGFyZHdhcmUuXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlpZiAoKHBIYmEtPmxjdC0+dGFibGVfc2l6ZSA8PCAyKSA+IHBIYmEtPmxjdF9zaXplKSB7CisJCQlwSGJhLT5sY3Rfc2l6ZSA9IHBIYmEtPmxjdC0+dGFibGVfc2l6ZSA8PCAyOworCQkJa2ZyZWUocEhiYS0+bGN0KTsKKwkJCXBIYmEtPmxjdCA9IE5VTEw7CisJCX0KKwl9IHdoaWxlIChwSGJhLT5sY3QgPT0gTlVMTCk7CisKKwlQREVCVUcoIiVzOiBIYXJkd2FyZSByZXNvdXJjZSB0YWJsZSByZWFkLlxuIiwgcEhiYS0+bmFtZSk7CisKKworCS8vIEkyT19EUFRfRVhFQ19JT1BfQlVGRkVSU19HUk9VUF9OTzsKKwlpZihhZHB0X2kyb19xdWVyeV9zY2FsYXIocEhiYSwgMCAsIDB4ODAwMCwgLTEsIGJ1Ziwgc2l6ZW9mKGJ1ZikpPj0wKSB7CisJCXBIYmEtPkZ3RGVidWdCdWZmZXJTaXplID0gYnVmWzFdOworCQlwSGJhLT5Gd0RlYnVnQnVmZmVyX1AgICAgPSBwSGJhLT5iYXNlX2FkZHJfdmlydCArIGJ1ZlswXTsKKwkJcEhiYS0+RndEZWJ1Z0ZsYWdzX1AgICAgID0gcEhiYS0+RndEZWJ1Z0J1ZmZlcl9QICsgRldfREVCVUdfRkxBR1NfT0ZGU0VUOworCQlwSGJhLT5Gd0RlYnVnQkxFRHZhbHVlX1AgPSBwSGJhLT5Gd0RlYnVnQnVmZmVyX1AgKyBGV19ERUJVR19CTEVEX09GRlNFVDsKKwkJcEhiYS0+RndEZWJ1Z0JMRURmbGFnX1AgID0gcEhiYS0+RndEZWJ1Z0JMRUR2YWx1ZV9QICsgMTsKKwkJcEhiYS0+RndEZWJ1Z1N0ckxlbmd0aF9QID0gcEhiYS0+RndEZWJ1Z0J1ZmZlcl9QICsgRldfREVCVUdfU1RSX0xFTkdUSF9PRkZTRVQ7CisJCXBIYmEtPkZ3RGVidWdCdWZmZXJfUCArPSBidWZbMl07IAorCQlwSGJhLT5Gd0RlYnVnRmxhZ3MgPSAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkcHRfaTJvX2J1aWxkX3N5c190YWJsZSh2b2lkKQoreworCWFkcHRfaGJhKiBwSGJhID0gTlVMTDsKKwlpbnQgY291bnQgPSAwOworCisJc3lzX3RibF9sZW4gPSBzaXplb2Yoc3RydWN0IGkyb19zeXNfdGJsKSArCS8vIEhlYWRlciArIElPUHMKKwkJCQkoaGJhX2NvdW50KSAqIHNpemVvZihzdHJ1Y3QgaTJvX3N5c190YmxfZW50cnkpOworCisJaWYoc3lzX3RibCkKKwkJa2ZyZWUoc3lzX3RibCk7CisKKwlzeXNfdGJsID0ga21hbGxvYyhzeXNfdGJsX2xlbiwgR0ZQX0tFUk5FTHxBRERSMzIpOworCWlmKCFzeXNfdGJsKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlN5c1RhYiBTZXQgZmFpbGVkLiBPdXQgb2YgbWVtb3J5LlxuIik7CQorCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHN5c190YmwsIDAsIHN5c190YmxfbGVuKTsKKworCXN5c190YmwtPm51bV9lbnRyaWVzID0gaGJhX2NvdW50OworCXN5c190YmwtPnZlcnNpb24gPSBJMk9WRVJTSU9OOworCXN5c190YmwtPmNoYW5nZV9pbmQgPSBzeXNfdGJsX2luZCsrOworCisJZm9yKHBIYmEgPSBoYmFfY2hhaW47IHBIYmE7IHBIYmEgPSBwSGJhLT5uZXh0KSB7CisJCS8vIEdldCB1cGRhdGVkIFN0YXR1cyBCbG9jayBzbyB3ZSBoYXZlIHRoZSBsYXRlc3QgaW5mb3JtYXRpb24KKwkJaWYgKGFkcHRfaTJvX3N0YXR1c19nZXQocEhiYSkpIHsKKwkJCXN5c190YmwtPm51bV9lbnRyaWVzLS07CisJCQljb250aW51ZTsgLy8gdHJ5IG5leHQgb25lCQorCQl9CisKKwkJc3lzX3RibC0+aW9wc1tjb3VudF0ub3JnX2lkID0gcEhiYS0+c3RhdHVzX2Jsb2NrLT5vcmdfaWQ7CisJCXN5c190YmwtPmlvcHNbY291bnRdLmlvcF9pZCA9IHBIYmEtPnVuaXQgKyAyOworCQlzeXNfdGJsLT5pb3BzW2NvdW50XS5zZWdfbnVtID0gMDsKKwkJc3lzX3RibC0+aW9wc1tjb3VudF0uaTJvX3ZlcnNpb24gPSBwSGJhLT5zdGF0dXNfYmxvY2stPmkyb192ZXJzaW9uOworCQlzeXNfdGJsLT5pb3BzW2NvdW50XS5pb3Bfc3RhdGUgPSBwSGJhLT5zdGF0dXNfYmxvY2stPmlvcF9zdGF0ZTsKKwkJc3lzX3RibC0+aW9wc1tjb3VudF0ubXNnX3R5cGUgPSBwSGJhLT5zdGF0dXNfYmxvY2stPm1zZ190eXBlOworCQlzeXNfdGJsLT5pb3BzW2NvdW50XS5mcmFtZV9zaXplID0gcEhiYS0+c3RhdHVzX2Jsb2NrLT5pbmJvdW5kX2ZyYW1lX3NpemU7CisJCXN5c190YmwtPmlvcHNbY291bnRdLmxhc3RfY2hhbmdlZCA9IHN5c190YmxfaW5kIC0gMTsgLy8gPz8KKwkJc3lzX3RibC0+aW9wc1tjb3VudF0uaW9wX2NhcGFiaWxpdGllcyA9IHBIYmEtPnN0YXR1c19ibG9jay0+aW9wX2NhcGFiaWxpdGllczsKKwkJc3lzX3RibC0+aW9wc1tjb3VudF0uaW5ib3VuZF9sb3cgPSAodTMyKXZpcnRfdG9fYnVzKCh2b2lkKilwSGJhLT5wb3N0X3BvcnQpOworCQlzeXNfdGJsLT5pb3BzW2NvdW50XS5pbmJvdW5kX2hpZ2ggPSAodTMyKSgodTY0KXZpcnRfdG9fYnVzKCh2b2lkKilwSGJhLT5wb3N0X3BvcnQpPj4zMik7CisKKwkJY291bnQrKzsKKwl9CisKKyNpZmRlZiBERUJVRworeworCXUzMiAqdGFibGUgPSAodTMyKilzeXNfdGJsOworCXByaW50ayhLRVJOX0RFQlVHInN5c190YmxfbGVuPSVkIGluIDMyYml0IHdvcmRzXG4iLChzeXNfdGJsX2xlbiA+PjIpKTsKKwlmb3IoY291bnQgPSAwOyBjb3VudCA8IChzeXNfdGJsX2xlbiA+PjIpOyBjb3VudCsrKSB7CisJCXByaW50ayhLRVJOX0lORk8gInN5c190YmxbJWRdID0gJTAjMTB4XG4iLCAKKwkJCWNvdW50LCB0YWJsZVtjb3VudF0pOworCX0KK30KKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCSBEdW1wIHRoZSBpbmZvcm1hdGlvbiBibG9jayBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiB1bml0IChUSUQpCisgKi8KKyAKK3N0YXRpYyB2b2lkIGFkcHRfaTJvX3JlcG9ydF9oYmFfdW5pdChhZHB0X2hiYSogcEhiYSwgc3RydWN0IGkyb19kZXZpY2UgKmQpCit7CisJY2hhciBidWZbNjRdOworCWludCB1bml0ID0gZC0+bGN0X2RhdGEudGlkOworCisJcHJpbnRrKEtFUk5fSU5GTyAiVElEICUzLjNkICIsIHVuaXQpOworCisJaWYoYWRwdF9pMm9fcXVlcnlfc2NhbGFyKHBIYmEsIHVuaXQsIDB4RjEwMCwgMywgYnVmLCAxNik+PTApCisJeworCQlidWZbMTZdPTA7CisJCXByaW50aygiIFZlbmRvcjogJS0xMi4xMnMiLCBidWYpOworCX0KKwlpZihhZHB0X2kyb19xdWVyeV9zY2FsYXIocEhiYSwgdW5pdCwgMHhGMTAwLCA0LCBidWYsIDE2KT49MCkKKwl7CisJCWJ1ZlsxNl09MDsKKwkJcHJpbnRrKCIgRGV2aWNlOiAlLTEyLjEycyIsIGJ1Zik7CisJfQorCWlmKGFkcHRfaTJvX3F1ZXJ5X3NjYWxhcihwSGJhLCB1bml0LCAweEYxMDAsIDYsIGJ1ZiwgOCk+PTApCisJeworCQlidWZbOF09MDsKKwkJcHJpbnRrKCIgUmV2OiAlLTEyLjEyc1xuIiwgYnVmKTsKKwl9CisjaWZkZWYgREVCVUcKKwkgcHJpbnRrKEtFUk5fSU5GTyAiXHRDbGFzczogJS4yMXNcbiIsIGFkcHRfaTJvX2dldF9jbGFzc19uYW1lKGQtPmxjdF9kYXRhLmNsYXNzX2lkKSk7CisJIHByaW50ayhLRVJOX0lORk8gIlx0U3ViY2xhc3M6IDB4JTA0WFxuIiwgZC0+bGN0X2RhdGEuc3ViX2NsYXNzKTsKKwkgcHJpbnRrKEtFUk5fSU5GTyAiXHRGbGFnczogIik7CisKKwkgaWYoZC0+bGN0X2RhdGEuZGV2aWNlX2ZsYWdzJigxPDwwKSkKKwkJICBwcmludGsoIkMiKTsJICAgICAvLyBDb25maWdEaWFsb2cgcmVxdWVzdGVkCisJIGlmKGQtPmxjdF9kYXRhLmRldmljZV9mbGFncyYoMTw8MSkpCisJCSAgcHJpbnRrKCJVIik7CSAgICAgLy8gTXVsdGktdXNlciBjYXBhYmxlCisJIGlmKCEoZC0+bGN0X2RhdGEuZGV2aWNlX2ZsYWdzJigxPDw0KSkpCisJCSAgcHJpbnRrKCJQIik7CSAgICAgLy8gUGVlciBzZXJ2aWNlIGVuYWJsZWQhCisJIGlmKCEoZC0+bGN0X2RhdGEuZGV2aWNlX2ZsYWdzJigxPDw1KSkpCisJCSAgcHJpbnRrKCJNIik7CSAgICAgLy8gTWdtdCBzZXJ2aWNlIGVuYWJsZWQhCisJIHByaW50aygiXG4iKTsKKyNlbmRpZgorfQorCisjaWZkZWYgREVCVUcKKy8qCisgKglEbyBpMm8gY2xhc3MgbmFtZSBsb29rdXAKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmFkcHRfaTJvX2dldF9jbGFzc19uYW1lKGludCBjbGFzcykKK3sKKwlpbnQgaWR4ID0gMTY7CisJc3RhdGljIGNoYXIgKmkyb19jbGFzc19uYW1lW10gPSB7CisJCSJFeGVjdXRpdmUiLAorCQkiRGV2aWNlIERyaXZlciBNb2R1bGUiLAorCQkiQmxvY2sgRGV2aWNlIiwKKwkJIlRhcGUgRGV2aWNlIiwKKwkJIkxBTiBJbnRlcmZhY2UiLAorCQkiV0FOIEludGVyZmFjZSIsCisJCSJGaWJyZSBDaGFubmVsIFBvcnQiLAorCQkiRmlicmUgQ2hhbm5lbCBEZXZpY2UiLAorCQkiU0NTSSBEZXZpY2UiLAorCQkiQVRFIFBvcnQiLAorCQkiQVRFIERldmljZSIsCisJCSJGbG9wcHkgQ29udHJvbGxlciIsCisJCSJGbG9wcHkgRGV2aWNlIiwKKwkJIlNlY29uZGFyeSBCdXMgUG9ydCIsCisJCSJQZWVyIFRyYW5zcG9ydCBBZ2VudCIsCisJCSJQZWVyIFRyYW5zcG9ydCIsCisJCSJVbmtub3duIgorCX07CisJCisJc3dpdGNoKGNsYXNzJjB4RkZGKSB7CisJY2FzZSBJMk9fQ0xBU1NfRVhFQ1VUSVZFOgorCQlpZHggPSAwOyBicmVhazsKKwljYXNlIEkyT19DTEFTU19ERE06CisJCWlkeCA9IDE7IGJyZWFrOworCWNhc2UgSTJPX0NMQVNTX1JBTkRPTV9CTE9DS19TVE9SQUdFOgorCQlpZHggPSAyOyBicmVhazsKKwljYXNlIEkyT19DTEFTU19TRVFVRU5USUFMX1NUT1JBR0U6CisJCWlkeCA9IDM7IGJyZWFrOworCWNhc2UgSTJPX0NMQVNTX0xBTjoKKwkJaWR4ID0gNDsgYnJlYWs7CisJY2FzZSBJMk9fQ0xBU1NfV0FOOgorCQlpZHggPSA1OyBicmVhazsKKwljYXNlIEkyT19DTEFTU19GSUJSRV9DSEFOTkVMX1BPUlQ6CisJCWlkeCA9IDY7IGJyZWFrOworCWNhc2UgSTJPX0NMQVNTX0ZJQlJFX0NIQU5ORUxfUEVSSVBIRVJBTDoKKwkJaWR4ID0gNzsgYnJlYWs7CisJY2FzZSBJMk9fQ0xBU1NfU0NTSV9QRVJJUEhFUkFMOgorCQlpZHggPSA4OyBicmVhazsKKwljYXNlIEkyT19DTEFTU19BVEVfUE9SVDoKKwkJaWR4ID0gOTsgYnJlYWs7CisJY2FzZSBJMk9fQ0xBU1NfQVRFX1BFUklQSEVSQUw6CisJCWlkeCA9IDEwOyBicmVhazsKKwljYXNlIEkyT19DTEFTU19GTE9QUFlfQ09OVFJPTExFUjoKKwkJaWR4ID0gMTE7IGJyZWFrOworCWNhc2UgSTJPX0NMQVNTX0ZMT1BQWV9ERVZJQ0U6CisJCWlkeCA9IDEyOyBicmVhazsKKwljYXNlIEkyT19DTEFTU19CVVNfQURBUFRFUl9QT1JUOgorCQlpZHggPSAxMzsgYnJlYWs7CisJY2FzZSBJMk9fQ0xBU1NfUEVFUl9UUkFOU1BPUlRfQUdFTlQ6CisJCWlkeCA9IDE0OyBicmVhazsKKwljYXNlIEkyT19DTEFTU19QRUVSX1RSQU5TUE9SVDoKKwkJaWR4ID0gMTU7IGJyZWFrOworCX0KKwlyZXR1cm4gaTJvX2NsYXNzX25hbWVbaWR4XTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBzMzIgYWRwdF9pMm9faHJ0X2dldChhZHB0X2hiYSogcEhiYSkKK3sKKwl1MzIgbXNnWzZdOworCWludCByZXQsIHNpemUgPSBzaXplb2YoaTJvX2hydCk7CisKKwlkbyB7CisJCWlmIChwSGJhLT5ocnQgPT0gTlVMTCkgeworCQkJcEhiYS0+aHJ0PWttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTHxBRERSMzIpOworCQkJaWYgKHBIYmEtPmhydCA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IEhydCBHZXQgZmFpbGVkOyBPdXQgb2YgbWVtb3J5LlxuIiwgcEhiYS0+bmFtZSk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCX0KKworCQltc2dbMF09IFNJWF9XT1JEX01TR19TSVpFfCBTR0xfT0ZGU0VUXzQ7CisJCW1zZ1sxXT0gSTJPX0NNRF9IUlRfR0VUPDwyNCB8IEhPU1RfVElEPDwxMiB8IEFEQVBURVJfVElEOworCQltc2dbMl09IDA7CisJCW1zZ1szXT0gMDsKKwkJbXNnWzRdPSAoMHhEMDAwMDAwMCB8IHNpemUpOyAgICAvKiBTaW1wbGUgdHJhbnNhY3Rpb24gKi8KKwkJbXNnWzVdPSB2aXJ0X3RvX2J1cyhwSGJhLT5ocnQpOyAgIC8qIER1bXAgaXQgaGVyZSAqLworCisJCWlmICgocmV0ID0gYWRwdF9pMm9fcG9zdF93YWl0KHBIYmEsIG1zZywgc2l6ZW9mKG1zZyksMjApKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGdldCBIUlQgKHN0YXR1cz0lIzEweClcbiIsIHBIYmEtPm5hbWUsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJaWYgKHBIYmEtPmhydC0+bnVtX2VudHJpZXMgKiBwSGJhLT5ocnQtPmVudHJ5X2xlbiA8PCAyID4gc2l6ZSkgeworCQkJc2l6ZSA9IHBIYmEtPmhydC0+bnVtX2VudHJpZXMgKiBwSGJhLT5ocnQtPmVudHJ5X2xlbiA8PCAyOworCQkJa2ZyZWUocEhiYS0+aHJ0KTsKKwkJCXBIYmEtPmhydCA9IE5VTEw7CisJCX0KKwl9IHdoaWxlKHBIYmEtPmhydCA9PSBOVUxMKTsKKwlyZXR1cm4gMDsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLyoKKyAqCSBRdWVyeSBvbmUgc2NhbGFyIGdyb3VwIHZhbHVlIG9yIGEgd2hvbGUgc2NhbGFyIGdyb3VwLgorICovCQkgICAgCQorc3RhdGljIGludCBhZHB0X2kyb19xdWVyeV9zY2FsYXIoYWRwdF9oYmEqIHBIYmEsIGludCB0aWQsIAorCQkJaW50IGdyb3VwLCBpbnQgZmllbGQsIHZvaWQgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwl1MTYgb3BibGtbXSA9IHsgMSwgMCwgSTJPX1BBUkFNU19GSUVMRF9HRVQsIGdyb3VwLCAxLCBmaWVsZCB9OworCXU4ICpyZXNibGs7CisKKwlpbnQgc2l6ZTsKKworCS8qIDggYnl0ZXMgZm9yIGhlYWRlciAqLworCXJlc2JsayA9IGttYWxsb2Moc2l6ZW9mKHU4KSAqICg4K2J1ZmxlbiksIEdGUF9LRVJORUx8QUREUjMyKTsKKwlpZiAocmVzYmxrID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IHF1ZXJ5IHNjYWxhciBmYWlsZWQ7IE91dCBvZiBtZW1vcnkuXG4iLCBwSGJhLT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGZpZWxkID09IC0xKSAgCQkvKiB3aG9sZSBncm91cCAqLworCQkJb3BibGtbNF0gPSAtMTsKKworCXNpemUgPSBhZHB0X2kyb19pc3N1ZV9wYXJhbXMoSTJPX0NNRF9VVElMX1BBUkFNU19HRVQsIHBIYmEsIHRpZCwgCisJCW9wYmxrLCBzaXplb2Yob3BibGspLCByZXNibGssIHNpemVvZih1OCkqKDgrYnVmbGVuKSk7CisJaWYgKHNpemUgPT0gLUVUSU1FKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpc3N1ZSBwYXJhbXMgZmFpbGVkOyBUaW1lZCBvdXQuXG4iLCBwSGJhLT5uYW1lKTsKKwkJcmV0dXJuIC1FVElNRTsKKwl9IGVsc2UgaWYgKHNpemUgPT0gLUVJTlRSKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpc3N1ZSBwYXJhbXMgZmFpbGVkOyBJbnRlcnJ1cHRlZC5cbiIsIHBIYmEtPm5hbWUpOworCQlyZXR1cm4gLUVJTlRSOworCX0KKwkJCQorCW1lbWNweShidWYsIHJlc2Jsays4LCBidWZsZW4pOyAgLyogY3V0IG9mZiBoZWFkZXIgKi8KKworCWtmcmVlKHJlc2Jsayk7CisJaWYgKHNpemUgPCAwKQorCQlyZXR1cm4gc2l6ZTsJCisKKwlyZXR1cm4gYnVmbGVuOworfQorCisKKy8qCUlzc3VlIFVUSUxfUEFSQU1TX0dFVCBvciBVVElMX1BBUkFNU19TRVQKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgVXRpbFBhcmFtc0dldC9TZXQgb3BlcmF0aW9ucy4KKyAqCVRoZSBPcGVyYXRpb25CbG9jayBpcyBnaXZlbiBpbiBvcGJsay1idWZmZXIsIAorICoJYW5kIHJlc3VsdHMgYXJlIHJldHVybmVkIGluIHJlc2Jsay1idWZmZXIuCisgKglOb3RlIHRoYXQgdGhlIG1pbmltdW0gc2l6ZWQgcmVzYmxrIGlzIDggYnl0ZXMgYW5kIGNvbnRhaW5zCisgKglSZXN1bHRDb3VudCwgRXJyb3JJbmZvU2l6ZSwgQmxvY2tTdGF0dXMgYW5kIEJsb2NrU2l6ZS4KKyAqLworc3RhdGljIGludCBhZHB0X2kyb19pc3N1ZV9wYXJhbXMoaW50IGNtZCwgYWRwdF9oYmEqIHBIYmEsIGludCB0aWQsIAorCQkgIHZvaWQgKm9wYmxrLCBpbnQgb3BsZW4sIHZvaWQgKnJlc2JsaywgaW50IHJlc2xlbikKK3sKKwl1MzIgbXNnWzldOyAKKwl1MzIgKnJlcyA9ICh1MzIgKilyZXNibGs7CisJaW50IHdhaXRfc3RhdHVzOworCisJbXNnWzBdID0gTklORV9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF81OworCW1zZ1sxXSA9IGNtZCA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgdGlkOyAKKwltc2dbMl0gPSAwOworCW1zZ1szXSA9IDA7CisJbXNnWzRdID0gMDsKKwltc2dbNV0gPSAweDU0MDAwMDAwIHwgb3BsZW47CS8qIE9wZXJhdGlvbkJsb2NrICovCisJbXNnWzZdID0gdmlydF90b19idXMob3BibGspOworCW1zZ1s3XSA9IDB4RDAwMDAwMDAgfCByZXNsZW47CS8qIFJlc3VsdEJsb2NrICovCisJbXNnWzhdID0gdmlydF90b19idXMocmVzYmxrKTsKKworCWlmICgod2FpdF9zdGF0dXMgPSBhZHB0X2kyb19wb3N0X3dhaXQocEhiYSwgbXNnLCBzaXplb2YobXNnKSwgMjApKSkgeworCQlwcmludGsoImFkcHRfaTJvX2lzc3VlX3BhcmFtczogcG9zdF93YWl0IGZhaWxlZCAoJXApXG4iLCByZXNibGspOworICAgCQlyZXR1cm4gd2FpdF9zdGF0dXM7IAkvKiAtRGV0YWlsZWRTdGF0dXMgKi8KKwl9CisKKwlpZiAocmVzWzFdJjB4MDBGRjAwMDApIHsgCS8qIEJsb2NrU3RhdHVzICE9IFNVQ0NFU1MgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICVzIC0gRXJyb3I6XG4gIEVycm9ySW5mb1NpemUgPSAweCUwMngsICIKKwkJCSJCbG9ja1N0YXR1cyA9IDB4JTAyeCwgQmxvY2tTaXplID0gMHglMDR4XG4iLAorCQkJcEhiYS0+bmFtZSwKKwkJCShjbWQgPT0gSTJPX0NNRF9VVElMX1BBUkFNU19TRVQpID8gIlBBUkFNU19TRVQiCisJCQkJCQkJIDogIlBBUkFNU19HRVQiLCAgIAorCQkJcmVzWzFdPj4yNCwgKHJlc1sxXT4+MTYpJjB4RkYsIHJlc1sxXSYweEZGRkYpOworCQlyZXR1cm4gLSgocmVzWzFdID4+IDE2KSAmIDB4RkYpOyAvKiAtQmxvY2tTdGF0dXMgKi8KKwl9CisKKwkgcmV0dXJuIDQgKyAoKHJlc1sxXSAmIDB4MDAwMEZGRkYpIDw8IDIpOyAvKiBieXRlcyB1c2VkIGluIHJlc2JsayAqLyAKK30KKworCitzdGF0aWMgczMyIGFkcHRfaTJvX3F1aWVzY2VfaGJhKGFkcHRfaGJhKiBwSGJhKQoreworCXUzMiBtc2dbNF07CisJaW50IHJldDsKKworCWFkcHRfaTJvX3N0YXR1c19nZXQocEhiYSk7CisKKwkvKiBTeXNRdWllc2NlIGRpc2NhcmRlZCBpZiBJT1Agbm90IGluIFJFQURZIG9yIE9QRVJBVElPTkFMIHN0YXRlICovCisKKwlpZigocEhiYS0+c3RhdHVzX2Jsb2NrLT5pb3Bfc3RhdGUgIT0gQURBUFRFUl9TVEFURV9SRUFEWSkgJiYKKyAgIAkgICAocEhiYS0+c3RhdHVzX2Jsb2NrLT5pb3Bfc3RhdGUgIT0gQURBUFRFUl9TVEFURV9PUEVSQVRJT05BTCkpeworCQlyZXR1cm4gMDsKKwl9CisKKwltc2dbMF0gPSBGT1VSX1dPUkRfTVNHX1NJWkV8U0dMX09GRlNFVF8wOworCW1zZ1sxXSA9IEkyT19DTURfU1lTX1FVSUVTQ0U8PDI0fEhPU1RfVElEPDwxMnxBREFQVEVSX1RJRDsKKwltc2dbMl0gPSAwOworCW1zZ1szXSA9IDA7CisKKwlpZigocmV0ID0gYWRwdF9pMm9fcG9zdF93YWl0KHBIYmEsIG1zZywgc2l6ZW9mKG1zZyksIDI0MCkpKSB7CisJCXByaW50ayhLRVJOX0lORk8iZHB0aSVkOiBVbmFibGUgdG8gcXVpZXNjZSAoc3RhdHVzPSUjeCkuXG4iLAorCQkJCXBIYmEtPnVuaXQsIC1yZXQpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8iZHB0aSVkOiBRdWllc2NlZC5cbiIscEhiYS0+dW5pdCk7CisJfQorCisJYWRwdF9pMm9fc3RhdHVzX2dldChwSGJhKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qIAorICogRW5hYmxlIElPUC4gQWxsb3dzIHRoZSBJT1AgdG8gcmVzdW1lIGV4dGVybmFsIG9wZXJhdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQgYWRwdF9pMm9fZW5hYmxlX2hiYShhZHB0X2hiYSogcEhiYSkKK3sKKwl1MzIgbXNnWzRdOworCWludCByZXQ7CisJCisJYWRwdF9pMm9fc3RhdHVzX2dldChwSGJhKTsKKwlpZighcEhiYS0+c3RhdHVzX2Jsb2NrKXsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIEVuYWJsZSBvbmx5IGFsbG93ZWQgb24gUkVBRFkgc3RhdGUgKi8KKwlpZihwSGJhLT5zdGF0dXNfYmxvY2stPmlvcF9zdGF0ZSA9PSBBREFQVEVSX1NUQVRFX09QRVJBVElPTkFMKQorCQlyZXR1cm4gMDsKKworCWlmKHBIYmEtPnN0YXR1c19ibG9jay0+aW9wX3N0YXRlICE9IEFEQVBURVJfU1RBVEVfUkVBRFkpCisJCXJldHVybiAtRUlOVkFMOworCisJbXNnWzBdPUZPVVJfV09SRF9NU0dfU0laRXxTR0xfT0ZGU0VUXzA7CisJbXNnWzFdPUkyT19DTURfU1lTX0VOQUJMRTw8MjR8SE9TVF9USUQ8PDEyfEFEQVBURVJfVElEOworCW1zZ1syXT0gMDsKKwltc2dbM109IDA7CisKKwlpZiAoKHJldCA9IGFkcHRfaTJvX3Bvc3Rfd2FpdChwSGJhLCBtc2csIHNpemVvZihtc2cpLCAyNDApKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBDb3VsZCBub3QgZW5hYmxlIChzdGF0dXM9JSMxMHgpLlxuIiwgCisJCQlwSGJhLT5uYW1lLCByZXQpOworCX0gZWxzZSB7CisJCVBERUJVRygiJXM6IEVuYWJsZWQuXG4iLCBwSGJhLT5uYW1lKTsKKwl9CisKKwlhZHB0X2kyb19zdGF0dXNfZ2V0KHBIYmEpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBhZHB0X2kyb19zeXN0YWJfc2VuZChhZHB0X2hiYSogcEhiYSkKK3sKKwkgdTMyIG1zZ1sxMl07CisJIGludCByZXQ7CisKKwltc2dbMF0gPSBJMk9fTUVTU0FHRV9TSVpFKDEyKSB8IFNHTF9PRkZTRVRfNjsKKwltc2dbMV0gPSBJMk9fQ01EX1NZU19UQUJfU0VUPDwyNCB8IEhPU1RfVElEPDwxMiB8IEFEQVBURVJfVElEOworCW1zZ1syXSA9IDA7CisJbXNnWzNdID0gMDsKKwltc2dbNF0gPSAoMDw8MTYpIHwgKChwSGJhLT51bml0KzIpIDw8IDEyKTsgLyogSG9zdCAwIElPUCBJRCAodW5pdCArIDIpICovCisJbXNnWzVdID0gMDsJCQkJICAgLyogU2VnbWVudCAwICovCisKKwkvKiAKKwkgKiBQcm92aWRlIHRocmVlIFNHTC1lbGVtZW50czoKKwkgKiBTeXN0ZW0gdGFibGUgKFN5c1RhYiksIFByaXZhdGUgbWVtb3J5IHNwYWNlIGRlY2xhcmF0aW9uIGFuZCAKKwkgKiBQcml2YXRlIGkvbyBzcGFjZSBkZWNsYXJhdGlvbiAgCisJICovCisJbXNnWzZdID0gMHg1NDAwMDAwMCB8IHN5c190YmxfbGVuOworCW1zZ1s3XSA9IHZpcnRfdG9fcGh5cyhzeXNfdGJsKTsKKwltc2dbOF0gPSAweDU0MDAwMDAwIHwgMDsKKwltc2dbOV0gPSAwOworCW1zZ1sxMF0gPSAweEQ0MDAwMDAwIHwgMDsKKwltc2dbMTFdID0gMDsKKworCWlmICgocmV0PWFkcHRfaTJvX3Bvc3Rfd2FpdChwSGJhLCBtc2csIHNpemVvZihtc2cpLCAxMjApKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5hYmxlIHRvIHNldCBTeXNUYWIgKHN0YXR1cz0lIzEweCkuXG4iLCAKKwkJCXBIYmEtPm5hbWUsIHJldCk7CisJfQorI2lmZGVmIERFQlVHCisJZWxzZSB7CisJCVBJTkZPKCIlczogU3lzVGFiIHNldC5cbiIsIHBIYmEtPm5hbWUpOworCX0KKyNlbmRpZgorCisJcmV0dXJuIHJldDsJCisgfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKworI2lmZGVmIFVBUlRERUxBWSAKKworc3RhdGljIHN0YXRpYyB2b2lkIGFkcHRfZGVsYXkoaW50IG1pbGxpc2VjKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBtaWxsaXNlYzsgaSsrKSB7CisJCXVkZWxheSgxMDAwKTsJLyogZGVsYXkgZm9yIG9uZSBtaWxsaXNlY29uZCAqLworCX0KK30KKworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubmFtZQkJCT0gImRwdF9pMm8iLAorCS5wcm9jX25hbWUJCT0gImRwdF9pMm8iLAorCS5wcm9jX2luZm8JCT0gYWRwdF9wcm9jX2luZm8sCisJLmRldGVjdAkJCT0gYWRwdF9kZXRlY3QsCQorCS5yZWxlYXNlCQk9IGFkcHRfcmVsZWFzZSwKKwkuaW5mbwkJCT0gYWRwdF9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gYWRwdF9xdWV1ZSwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IGFkcHRfYWJvcnQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gYWRwdF9kZXZpY2VfcmVzZXQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gYWRwdF9idXNfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IGFkcHRfcmVzZXQsCisJLmJpb3NfcGFyYW0JCT0gYWRwdF9iaW9zX3BhcmFtLAorCS5zbGF2ZV9jb25maWd1cmUJPSBhZHB0X3NsYXZlX2NvbmZpZ3VyZSwKKwkuY2FuX3F1ZXVlCQk9IE1BWF9UT19JT1BfTUVTU0FHRVMsCisJLnRoaXNfaWQJCT0gNywKKwkuY21kX3Blcl9sdW4JCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZHB0aS5oIGIvZHJpdmVycy9zY3NpL2RwdGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjZlMTVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2RwdGkuaApAQCAtMCwwICsxLDM1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICBkcHRpLmggIC0gIGRlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBiZWdpbiAgICAgICAgICAgICAgICA6IFRodSBTZXAgNyAyMDAwCisgICAgY29weXJpZ2h0ICAgICAgICAgICAgOiAoQykgMjAwMSBieSBBZGFwdGVjCisKKyAgICBTZWUgRG9jdW1lbnRhdGlvbi9zY3NpL2RwdGkudHh0IGZvciBoaXN0b3J5LCBub3RlcywgbGljZW5zZSBpbmZvCisgICAgYW5kIGNyZWRpdHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0RQVF9ICisjZGVmaW5lIF9EUFRfSAorCisjaWZuZGVmIExJTlVYX1ZFUlNJT05fQ09ERQorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDAwKQorI2RlZmluZSBNQVhfVE9fSU9QX01FU1NBR0VTICAgKDIxMCkKKyNlbHNlCisjZGVmaW5lIE1BWF9UT19JT1BfTUVTU0FHRVMgICAoMjU1KQorI2VuZGlmCisjZGVmaW5lIE1BWF9GUk9NX0lPUF9NRVNTQUdFUyAoMjU1KQorCisKKy8qCisgKiBTQ1NJIGludGVyZmFjZSBmdW5jdGlvbiBQcm90b3R5cGVzCisgKi8KKworc3RhdGljIGludCBhZHB0X2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICogc2h0KTsKK3N0YXRpYyBpbnQgYWRwdF9xdWV1ZShzdHJ1Y3Qgc2NzaV9jbW5kICogY21kLCB2b2lkICgqY21kY29tcGxldGUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKK3N0YXRpYyBpbnQgYWRwdF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICogY21kKTsKK3N0YXRpYyBpbnQgYWRwdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kKiBjbWQpOworc3RhdGljIGludCBhZHB0X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CitzdGF0aWMgaW50IGFkcHRfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmFkcHRfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpwU0hvc3QpOworc3RhdGljIGludCBhZHB0X2Jpb3NfcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICogc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LAorCQlzZWN0b3JfdCwgaW50IGdlb21bXSk7CisKK3N0YXRpYyBpbnQgYWRwdF9idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCogY21kKTsKK3N0YXRpYyBpbnQgYWRwdF9kZXZpY2VfcmVzZXQoc3RydWN0IHNjc2lfY21uZCogY21kKTsKKworCisvKgorICogU2NzaV9Ib3N0X1RlbXBsYXRlIChzZWUgaG9zdHMuaCkgCisgKi8KKworI2RlZmluZSBEUFRfRFJJVkVSX05BTUUJIkFkYXB0ZWMgSTJPIFJBSUQiCisKKyNpZm5kZWYgSE9TVFNfQworCisjaW5jbHVkZSAiZHB0L3N5c19pbmZvLmgiCisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgImRwdC9kcHRpX2kyby5oIgorI2luY2x1ZGUgImRwdC9kcHRpX2lvY3RsLmgiCisKKyNkZWZpbmUgRFBUX0kyT19WRVJTSU9OICIyLjQgQnVpbGQgNWdvIgorI2RlZmluZSBEUFRfVkVSU0lPTiAgICAgMgorI2RlZmluZSBEUFRfUkVWSVNJT04gICAgJzQnCisjZGVmaW5lIERQVF9TVUJSRVZJU0lPTiAnNScKKyNkZWZpbmUgRFBUX0JFVEEJIiIKKyNkZWZpbmUgRFBUX01PTlRIICAgICAgOCAKKyNkZWZpbmUgRFBUX0RBWSAgICAgICAgNworI2RlZmluZSBEUFRfWUVBUiAgICAgICAgKDIwMDEtMTk4MCkKKworI2RlZmluZSBEUFRfRFJJVkVSCSJkcHRfaTJvIgorI2RlZmluZSBEUFRJX0kyT19NQUpPUgkoMTUxKQorI2RlZmluZSBEUFRfT1JHQU5JWkFUSU9OX0lEICgweDFCKSAgICAgICAgLyogRm9yIFByaXZhdGUgTWVzc2FnZXMgKi8KKyNkZWZpbmUgRFBUSV9NQVhfSEJBCSgxNikKKyNkZWZpbmUgTUFYX0NIQU5ORUwgICAgICg1KQkvLyBNYXhpbXVtIENoYW5uZWwgIyBTdXBwb3J0ZWQKKyNkZWZpbmUgTUFYX0lEICAgICAgICAJKDEyOCkJLy8gTWF4aW11bSBUYXJnZXQgSUQgU3VwcG9ydGVkCisKKy8qIFNpemVzIGluIDQgYnl0ZSB3b3JkcyAqLworI2RlZmluZSBSRVBMWV9GUkFNRV9TSVpFICAoMTcpCisjZGVmaW5lIE1BWF9NRVNTQUdFX1NJWkUgICgxMjgpCisjZGVmaW5lIFNHX0xJU1RfRUxFTUVOVFMgICg1NikKKworI2RlZmluZSBFTVBUWV9RVUVVRSAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBJMk9fSU5URVJSVVBUX1BFTkRJTkdfQiAgICgweDA4KQorCisjZGVmaW5lIFBDSV9EUFRfVkVORE9SX0lEICAgICAgICAgKDB4MTA0NCkJLy8gRFBUIFBDSSBWZW5kb3IgSUQKKyNkZWZpbmUgUENJX0RQVF9ERVZJQ0VfSUQgICAgICAgICAoMHhBNTAxKQkvLyBEUFQgUENJIEkyTyBEZXZpY2UgSUQKKyNkZWZpbmUgUENJX0RQVF9SQVBUT1JfREVWSUNFX0lEICAoMHhBNTExKQkKKworLy8jZGVmaW5lIFJFQk9PVF9OT1RJRklFUiAxCisvKiBEZWJ1Z2dpbmcgbWFjcm8gZnJvbSBMaW51eCBEZXZpY2UgRHJpdmVycyAtIFJ1YmluaSAqLworI3VuZGVmIFBERUJVRworI2lmZGVmIERFQlVHCisvL1RPRE8gYWRkIGRlYnVnIGxldmVsIHN3aXRjaAorIyAgZGVmaW5lIFBERUJVRyhmbXQsIGFyZ3MuLi4pICBwcmludGsoS0VSTl9ERUJVRyAiZHB0aTogIiBmbXQsICMjYXJncykKKyMgIGRlZmluZSBQREVCVUdWKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgImRwdGk6ICIgZm10LCAjI2FyZ3MpCisjZWxzZQorIyBkZWZpbmUgUERFQlVHKGZtdCwgYXJncy4uLikgLyogbm90IGRlYnVnZ2luZzogbm90aGluZyAqLworIyBkZWZpbmUgUERFQlVHVihmbXQsIGFyZ3MuLi4pIC8qIG5vdCBkZWJ1Z2dpbmc6IG5vdGhpbmcgKi8KKyNlbmRpZgorCisjZGVmaW5lIFBFUlJPUihmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiBmbXQsICMjYXJncykKKyNkZWZpbmUgUFdBUk4oZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIGZtdCwgIyNhcmdzKQorI2RlZmluZSBQSU5GTyhmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0lORk8gZm10LCAjI2FyZ3MpCisjZGVmaW5lIFBDUklUKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fQ1JJVCBmbXQsICMjYXJncykKKworI2RlZmluZSBTSFVURE9XTl9TSUdTCShzaWdtYXNrKFNJR0tJTEwpfHNpZ21hc2soU0lHSU5UKXxzaWdtYXNrKFNJR1RFUk0pKQorCisvLyBDb21tYW5kIHRpbWVvdXRzCisjZGVmaW5lIEZPUkVWRVIJCQkoMCkKKyNkZWZpbmUgVE1PVVRfSU5RVUlSWSAJCSgyMCkKKyNkZWZpbmUgVE1PVVRfRkxVU0gJCSgzNjAvNDUpCisjZGVmaW5lIFRNT1VUX0FCT1JUCQkoMzApCisjZGVmaW5lIFRNT1VUX1NDU0kJCSgzMDApCisjZGVmaW5lIFRNT1VUX0lPUFJFU0VUCQkoMzYwKQorI2RlZmluZSBUTU9VVF9HRVRTVEFUVVMJCSgxNSkKKyNkZWZpbmUgVE1PVVRfSU5JVE9VVEJPVU5ECSgxNSkKKyNkZWZpbmUgVE1PVVRfTENUCQkoMzYwKQorCisKKyNkZWZpbmUgSTJPX1NDU0lfREVWSUNFX0RTQ19NQVNLICAgICAgICAgICAgICAgIDB4MDBGRgorCisjZGVmaW5lIEkyT19ERVRBSUxfU1RBVFVTX1VOU1VQUE9SVEVEX0ZVTkNUSU9OICAweDAwMEEKKworI2RlZmluZSBJMk9fU0NTSV9EU0NfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGMDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX1NVQ0NFU1MgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19SRVFVRVNUX0FCT1JURUQgICAgICAgIDB4MDIwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfVU5BQkxFX1RPX0FCT1JUICAgICAgICAweDAzMDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX0NPTVBMRVRFX1dJVEhfRVJST1IgICAgMHgwNDAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19BREFQVEVSX0JVU1kgICAgICAgICAgIDB4MDUwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfUkVRVUVTVF9JTlZBTElEICAgICAgICAweDA2MDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX1BBVEhfSU5WQUxJRCAgICAgICAgICAgMHgwNzAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19ERVZJQ0VfTk9UX1BSRVNFTlQgICAgIDB4MDgwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfVU5BQkxFX1RPX1RFUk1JTkFURSAgICAweDA5MDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX1NFTEVDVElPTl9USU1FT1VUICAgICAgMHgwQTAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19DT01NQU5EX1RJTUVPVVQgICAgICAgIDB4MEIwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfTVJfTUVTU0FHRV9SRUNFSVZFRCAgICAweDBEMDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX1NDU0lfQlVTX1JFU0VUICAgICAgICAgMHgwRTAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19QQVJJVFlfRVJST1JfRkFJTFVSRSAgIDB4MEYwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfQVVUT1NFTlNFX0ZBSUxFRCAgICAgICAweDEwMDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX05PX0FEQVBURVIgICAgICAgICAgICAgMHgxMTAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19EQVRBX09WRVJSVU4gICAgICAgICAgIDB4MTIwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfVU5FWFBFQ1RFRF9CVVNfRlJFRSAgICAweDEzMDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX1NFUVVFTkNFX0ZBSUxVUkUgICAgICAgMHgxNDAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19SRVFVRVNUX0xFTkdUSF9FUlJPUiAgIDB4MTUwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfUFJPVklERV9GQUlMVVJFICAgICAgICAweDE2MDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX0JEUl9NRVNTQUdFX1NFTlQgICAgICAgMHgxNzAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19SRVFVRVNUX1RFUk1JTkFURUQgICAgIDB4MTgwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfSURFX01FU1NBR0VfU0VOVCAgICAgICAweDMzMDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX1JFU09VUkNFX1VOQVZBSUxBQkxFICAgMHgzNDAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19VTkFDS05PV0xFREdFRF9FVkVOVCAgIDB4MzUwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfTUVTU0FHRV9SRUNFSVZFRCAgICAgICAweDM2MDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX0lOVkFMSURfQ0RCICAgICAgICAgICAgMHgzNzAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19MVU5fSU5WQUxJRCAgICAgICAgICAgIDB4MzgwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfU0NTSV9USURfSU5WQUxJRCAgICAgICAweDM5MDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX0ZVTkNUSU9OX1VOQVZBSUxBQkxFICAgMHgzQTAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19OT19ORVhVUyAgICAgICAgICAgICAgIDB4M0IwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfU0NTSV9JSURfSU5WQUxJRCAgICAgICAweDNDMDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX0NEQl9SRUNFSVZFRCAgICAgICAgICAgMHgzRDAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19MVU5fQUxSRUFEWV9FTkFCTEVEICAgIDB4M0UwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfQlVTX0JVU1kgICAgICAgICAgICAgICAweDNGMDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX1FVRVVFX0ZST1pFTiAgICAgICAgICAgMHg0MDAwCisKKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEZBTFNFICAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworI2RlZmluZSBIQkFfRkxBR1NfSU5TVEFMTEVEX0IgICAgICAgMHgwMDAwMDAwMQkvLyBBZGFwdGVyIFdhcyBJbnN0YWxsZWQKKyNkZWZpbmUgSEJBX0ZMQUdTX0JMSU5LTEVEX0IgICAgICAgIDB4MDAwMDAwMDIJLy8gQWRhcHRlciBJbiBCbGluayBMRUQgU3RhdGUKKyNkZWZpbmUgSEJBX0ZMQUdTX0lOX1JFU0VUCTB4MDAwMDAwNDAJLyogaW4gcmVzZXQgKi8KKyNkZWZpbmUgSEJBX0hPU1RSRVNFVF9GQUlMRUQJMHgwMDAwMDA4MAkvKiBhZHB0X3Jlc2V0aG9zdCBmYWlsZWQgKi8KKworCisvLyBEZXZpY2Ugc3RhdGUgZmxhZ3MKKyNkZWZpbmUgRFBUSV9ERVZfT05MSU5FICAgIDB4MDAKKyNkZWZpbmUgRFBUSV9ERVZfVU5TQ0FOTkVEIDB4MDEKKyNkZWZpbmUgRFBUSV9ERVZfUkVTRVQJICAgMHgwMgorI2RlZmluZSBEUFRJX0RFVl9PRkZMSU5FICAgMHgwNAorCisKK3N0cnVjdCBhZHB0X2RldmljZSB7CisJc3RydWN0IGFkcHRfZGV2aWNlKiBuZXh0X2x1bjsKKwl1MzIJZmxhZ3M7CisJdTMyCXR5cGU7CisJdTMyCWNhcGFjaXR5OworCXUzMglibG9ja19zaXplOworCXU4CXNjc2lfY2hhbm5lbDsKKwl1OAlzY3NpX2lkOworCXU4IAlzY3NpX2x1bjsKKwl1OAlzdGF0ZTsKKwl1MTYJdGlkOworCXN0cnVjdCBpMm9fZGV2aWNlKiBwSTJvX2RldjsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnBTY3NpX2RldjsKK307CisKK3N0cnVjdCBhZHB0X2NoYW5uZWwgeworCXN0cnVjdCBhZHB0X2RldmljZSogZGV2aWNlW01BWF9JRF07CS8qIHVzZWQgYXMgYW4gYXJyYXkgb2YgMTI4IHNjc2kgaWRzICovCisJdTgJc2NzaV9pZDsKKwl1OAl0eXBlOworCXUxNgl0aWQ7CisJdTMyCXN0YXRlOworCXN0cnVjdCBpMm9fZGV2aWNlKiBwSTJvX2RldjsKK307CisKKy8vIEhCQSBzdGF0ZSBmbGFncworI2RlZmluZSBEUFRJX1NUQVRFX1JFU0VUCSgweDAxKQorI2RlZmluZSBEUFRJX1NUQVRFX0lPQ1RMCSgweDAyKQorCit0eXBlZGVmIHN0cnVjdCBfYWRwdF9oYmEgeworCXN0cnVjdCBfYWRwdF9oYmEgKm5leHQ7CisJc3RydWN0IHBjaV9kZXYgKnBEZXY7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwl1MzIgc3RhdGU7CisJc3BpbmxvY2tfdCBzdGF0ZV9sb2NrOworCWludCB1bml0OworCWludCBob3N0X25vOwkJLyogU0NTSSBob3N0IG51bWJlciAqLworCXU4IGluaXRpYWxpemVkOworCXU4IGluX3VzZTsJCS8qIGlzIHRoZSBtYW5hZ2VtZW50IG5vZGUgb3BlbiovCisKKwljaGFyIG5hbWVbMzJdOworCWNoYXIgZGV0YWlsWzU1XTsKKworCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyX3ZpcnQ7CisJdm9pZCBfX2lvbWVtICptc2dfYWRkcl92aXJ0OworCXVsb25nIGJhc2VfYWRkcl9waHlzOworCXZvaWQgX19pb21lbSAqcG9zdF9wb3J0OworCXZvaWQgX19pb21lbSAqcmVwbHlfcG9ydDsKKwl2b2lkIF9faW9tZW0gKmlycV9tYXNrOworCXUxNiAgcG9zdF9jb3VudDsKKwl1MzIgIHBvc3RfZmlmb19zaXplOworCXUzMiAgcmVwbHlfZmlmb19zaXplOworCXUzMiogcmVwbHlfcG9vbDsKKwl1MzIgIHNnX3RhYmxlc2l6ZTsJLy8gU2NhdHRlci9HYXRoZXIgTGlzdCBTaXplLiAgICAgICAKKwl1OCAgdG9wX3Njc2lfY2hhbm5lbDsKKwl1OCAgdG9wX3Njc2lfaWQ7CisJdTggIHRvcF9zY3NpX2x1bjsKKworCWkyb19zdGF0dXNfYmxvY2sqIHN0YXR1c19ibG9jazsKKwlpMm9faHJ0KiBocnQ7CisJaTJvX2xjdCogbGN0OworCXVpbnQgbGN0X3NpemU7CisJc3RydWN0IGkyb19kZXZpY2UqIGRldmljZXM7CisJc3RydWN0IGFkcHRfY2hhbm5lbCBjaGFubmVsW01BWF9DSEFOTkVMXTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkqIHByb2NfZW50cnk7CS8qIC9wcm9jIGRpciAqLworCisJdm9pZCBfX2lvbWVtICpGd0RlYnVnQnVmZmVyX1A7CS8vIFZpcnR1YWwgQWRkcmVzcyBPZiBGVyBEZWJ1ZyBCdWZmZXIKKwl1MzIgICBGd0RlYnVnQnVmZmVyU2l6ZTsJLy8gRlcgRGVidWcgQnVmZmVyIFNpemUgSW4gQnl0ZXMKKwl2b2lkIF9faW9tZW0gKkZ3RGVidWdTdHJMZW5ndGhfUDsvLyBWaXJ0dWFsIEFkZHIgT2YgRlcgRGVidWcgU3RyaW5nIExlbgorCXZvaWQgX19pb21lbSAqRndEZWJ1Z0ZsYWdzX1A7CS8vIFZpcnR1YWwgQWRkcmVzcyBPZiBGVyBEZWJ1ZyBGbGFncyAKKwl2b2lkIF9faW9tZW0gKkZ3RGVidWdCTEVEZmxhZ19QOy8vIFZpcnR1YWwgQWRkciBPZiBGVyBEZWJ1ZyBCTEVECisJdm9pZCBfX2lvbWVtICpGd0RlYnVnQkxFRHZhbHVlX1A7Ly8gVmlydHVhbCBBZGRyIE9mIEZXIERlYnVnIEJMRUQKKwl1MzIgRndEZWJ1Z0ZsYWdzOworfSBhZHB0X2hiYTsKKworc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50IHsKKyAgIHUzMiAgZmxhZ19jb3VudDsKKyAgIHUzMiBhZGRyX2J1czsKK307IAorCisvKgorICogRnVuY3Rpb24gUHJvdG90eXBlcworICovCisKK3N0YXRpYyB2b2lkIGFkcHRfaTJvX3N5c19zaHV0ZG93bih2b2lkKTsKK3N0YXRpYyBpbnQgYWRwdF9pbml0KHZvaWQpOworc3RhdGljIGludCBhZHB0X2kyb19idWlsZF9zeXNfdGFibGUodm9pZCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgYWRwdF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisjaWZkZWYgUkVCT09UX05PVElGSUVSCitzdGF0aWMgaW50IGFkcHRfcmVib290X2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbiwgdWxvbmcgY29kZSwgdm9pZCAqcCk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgYWRwdF9pMm9fcmVwb3J0X2hiYV91bml0KGFkcHRfaGJhKiBwSGJhLCBzdHJ1Y3QgaTJvX2RldmljZSAqZCk7CitzdGF0aWMgaW50IGFkcHRfaTJvX3F1ZXJ5X3NjYWxhcihhZHB0X2hiYSogcEhiYSwgaW50IHRpZCwgCisJCQlpbnQgZ3JvdXAsIGludCBmaWVsZCwgdm9pZCAqYnVmLCBpbnQgYnVmbGVuKTsKKyNpZmRlZiBERUJVRworc3RhdGljIGNvbnN0IGNoYXIgKmFkcHRfaTJvX2dldF9jbGFzc19uYW1lKGludCBjbGFzcyk7CisjZW5kaWYKK3N0YXRpYyBpbnQgYWRwdF9pMm9faXNzdWVfcGFyYW1zKGludCBjbWQsIGFkcHRfaGJhKiBwSGJhLCBpbnQgdGlkLCAKKwkJICB2b2lkICpvcGJsaywgaW50IG9wbGVuLCB2b2lkICpyZXNibGssIGludCByZXNsZW4pOworc3RhdGljIGludCBhZHB0X2kyb19wb3N0X3dhaXQoYWRwdF9oYmEqIHBIYmEsIHUzMiogbXNnLCBpbnQgbGVuLCBpbnQgdGltZW91dCk7CitzdGF0aWMgaW50IGFkcHRfaTJvX2xjdF9nZXQoYWRwdF9oYmEqIHBIYmEpOworc3RhdGljIGludCBhZHB0X2kyb19wYXJzZV9sY3QoYWRwdF9oYmEqIHBIYmEpOworc3RhdGljIGludCBhZHB0X2kyb19hY3RpdmF0ZV9oYmEoYWRwdF9oYmEqIHBIYmEpOworc3RhdGljIGludCBhZHB0X2kyb19lbmFibGVfaGJhKGFkcHRfaGJhKiBwSGJhKTsKK3N0YXRpYyBpbnQgYWRwdF9pMm9faW5zdGFsbF9kZXZpY2UoYWRwdF9oYmEqIHBIYmEsIHN0cnVjdCBpMm9fZGV2aWNlICpkKTsKK3N0YXRpYyBzMzIgYWRwdF9pMm9fcG9zdF90aGlzKGFkcHRfaGJhKiBwSGJhLCB1MzIqIGRhdGEsIGludCBsZW4pOworc3RhdGljIHMzMiBhZHB0X2kyb19xdWllc2NlX2hiYShhZHB0X2hiYSogcEhiYSk7CitzdGF0aWMgczMyIGFkcHRfaTJvX3N0YXR1c19nZXQoYWRwdF9oYmEqIHBIYmEpOworc3RhdGljIHMzMiBhZHB0X2kyb19pbml0X291dGJvdW5kX3EoYWRwdF9oYmEqIHBIYmEpOworc3RhdGljIHMzMiBhZHB0X2kyb19ocnRfZ2V0KGFkcHRfaGJhKiBwSGJhKTsKK3N0YXRpYyBzMzIgYWRwdF9zY3NpX3RvX2kybyhhZHB0X2hiYSogcEhiYSwgc3RydWN0IHNjc2lfY21uZCogY21kLCBzdHJ1Y3QgYWRwdF9kZXZpY2UqIGRwdGRldmljZSk7CitzdGF0aWMgczMyIGFkcHRfaTJvX3RvX3Njc2kodWxvbmcgcmVwbHksIHN0cnVjdCBzY3NpX2NtbmQqIGNtZCk7CitzdGF0aWMgczMyIGFkcHRfc2NzaV9yZWdpc3RlcihhZHB0X2hiYSogcEhiYSxzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICogc2h0KTsKK3N0YXRpYyBzMzIgYWRwdF9oYmFfcmVzZXQoYWRwdF9oYmEqIHBIYmEpOworc3RhdGljIHMzMiBhZHB0X2kyb19yZXNldF9oYmEoYWRwdF9oYmEqIHBIYmEpOworc3RhdGljIHMzMiBhZHB0X3Jlc2NhbihhZHB0X2hiYSogcEhiYSk7CitzdGF0aWMgczMyIGFkcHRfaTJvX3JlcGFyc2VfbGN0KGFkcHRfaGJhKiBwSGJhKTsKK3N0YXRpYyBzMzIgYWRwdF9zZW5kX25vcChhZHB0X2hiYSpwSGJhLHUzMiBtKTsKK3N0YXRpYyB2b2lkIGFkcHRfaTJvX2RlbGV0ZV9oYmEoYWRwdF9oYmEqIHBIYmEpOworc3RhdGljIHZvaWQgYWRwdF9pbnF1aXJ5KGFkcHRfaGJhKiBwSGJhKTsKK3N0YXRpYyB2b2lkIGFkcHRfZmFpbF9wb3N0ZWRfc2NicyhhZHB0X2hiYSogcEhiYSk7CitzdGF0aWMgc3RydWN0IGFkcHRfZGV2aWNlKiBhZHB0X2ZpbmRfZGV2aWNlKGFkcHRfaGJhKiBwSGJhLCB1MzIgY2hhbiwgdTMyIGlkLCB1MzIgbHVuKTsKK3N0YXRpYyBpbnQgYWRwdF9pbnN0YWxsX2hiYShzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlKiBzaHQsIHN0cnVjdCBwY2lfZGV2KiBwRGV2KSA7CitzdGF0aWMgaW50IGFkcHRfaTJvX29ubGluZV9oYmEoYWRwdF9oYmEqIHBIYmEpOworc3RhdGljIHZvaWQgYWRwdF9pMm9fcG9zdF93YWl0X2NvbXBsZXRlKHUzMiwgaW50KTsKK3N0YXRpYyBpbnQgYWRwdF9pMm9fc3lzdGFiX3NlbmQoYWRwdF9oYmEqIHBIYmEpOworCitzdGF0aWMgaW50IGFkcHRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVpbnQgY21kLCB1bG9uZyBhcmcpOworc3RhdGljIGludCBhZHB0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBhZHB0X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKKworCisjaWZkZWYgVUFSVERFTEFZCitzdGF0aWMgdm9pZCBhZHB0X2RlbGF5KGludCBtaWxsaXNlYyk7CisjZW5kaWYKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwwKQorc3RhdGljIHN0cnVjdCBwY2lfZGV2KiBhZHB0X3BjaV9maW5kX2RldmljZSh1aW50IHZlbmRvciwgc3RydWN0IHBjaV9kZXYqIGZyb20pOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9faWE2NF9fIAorc3RhdGljIHZvaWQgYWRwdF9pYTY0X2luZm8oc3lzSW5mb19TKiBzaSk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIF9fc3BhcmNfXyAKK3N0YXRpYyB2b2lkIGFkcHRfc3BhcmNfaW5mbyhzeXNJbmZvX1MqIHNpKTsKKyNlbmRpZgorI2lmIGRlZmluZWQgX19hbHBoYV9fIAorc3RhdGljIHZvaWQgYWRwdF9zcGFyY19pbmZvKHN5c0luZm9fUyogc2kpOworI2VuZGlmCisjaWYgZGVmaW5lZCBfX2kzODZfXworc3RhdGljIHZvaWQgYWRwdF9pMzg2X2luZm8oc3lzSW5mb19TKiBzaSk7CisjZW5kaWYKKworI2RlZmluZSBQUklOVF9CVUZGRVJfU0laRSAgICAgNTEyCisKKyNkZWZpbmUgSEJBX0ZMQUdTX0RCR19GTEFHU19NQVNLICAgICAgICAgMHhmZmZmMDAwMAkvLyBNYXNrIGZvciBkZWJ1ZyBmbGFncworI2RlZmluZSBIQkFfRkxBR1NfREJHX0tFUk5FTF9QUklOVF9CICAgICAweDAwMDEwMDAwCS8vIEtlcm5lbCBEZWJ1Z2dlciBQcmludAorI2RlZmluZSBIQkFfRkxBR1NfREJHX0ZXX1BSSU5UX0IgICAgICAgICAweDAwMDIwMDAwCS8vIEZpcm13YXJlIERlYnVnZ2VyIFByaW50CisjZGVmaW5lIEhCQV9GTEFHU19EQkdfRlVOQ1RJT05fRU5UUllfQiAgIDB4MDAwNDAwMDAJLy8gRnVuY3Rpb24gRW50cnkgUG9pbnQKKyNkZWZpbmUgSEJBX0ZMQUdTX0RCR19GVU5DVElPTl9FWElUX0IgICAgMHgwMDA4MDAwMAkvLyBGdW5jdGlvbiBFeGl0CisjZGVmaW5lIEhCQV9GTEFHU19EQkdfRVJST1JfQiAgICAgICAgICAgIDB4MDAxMDAwMDAJLy8gRXJyb3IgQ29uZGl0aW9ucworI2RlZmluZSBIQkFfRkxBR1NfREJHX0lOSVRfQiAgICAgICAgICAgICAweDAwMjAwMDAwCS8vIEluaXQgUHJpbnRzCisjZGVmaW5lIEhCQV9GTEFHU19EQkdfT1NfQ09NTUFORFNfQiAgICAgIDB4MDA0MDAwMDAJLy8gT1MgQ29tbWFuZCBJbmZvCisjZGVmaW5lIEhCQV9GTEFHU19EQkdfU0NBTl9CICAgICAgICAgICAgIDB4MDA4MDAwMDAJLy8gRGV2aWNlIFNjYW4KKworI2RlZmluZSBGV19ERUJVR19TVFJfTEVOR1RIX09GRlNFVCAwCisjZGVmaW5lIEZXX0RFQlVHX0ZMQUdTX09GRlNFVCAgICAgIDQKKyNkZWZpbmUgRldfREVCVUdfQkxFRF9PRkZTRVQgICAgICAgOAorCisjZGVmaW5lIEZXX0RFQlVHX0ZMQUdTX05PX0hFQURFUlNfQiAgICAweDAxCisjZW5kaWYJCQkJLyogIUhPU1RTX0MgKi8KKyNlbmRpZgkJCQkvKiBfRFBUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kdGMuYyBiL2RyaXZlcnMvc2NzaS9kdGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTFhYWE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2R0Yy5jCkBAIC0wLDAgKzEsNDk0IEBACisKKyNkZWZpbmUgQVVUT1NFTlNFCisjZGVmaW5lIFBTRVVET19ETUEKKyNkZWZpbmUgRE9OVF9VU0VfSU5UUgorI2RlZmluZSBVTlNBRkUJCQkvKiBMZWF2ZSBpbnRlcnJ1cHRzIGVuYWJsZWQgZHVyaW5nIHBzZXVkby1kbWEgSS9PICovCisjZGVmaW5lIHhOREVCVUcgKE5ERUJVR19JTlRSK05ERUJVR19SRVNFTEVDVElPTitcCisJCSBOREVCVUdfU0VMRUNUSU9OK05ERUJVR19BUkJJVFJBVElPTikKKyNkZWZpbmUgRE1BX1dPUktTX1JJR0hUCisKKworLyoKKyAqIERUQyAzMTgwLzMyODAgZHJpdmVyLCBieQorICoJUmF5IFZhbiBUYXNzbGUJcmF5dnRAY29tbS5tb3QuY29tCisgKgorICoJdGFrZW4gZnJvbSAuLi4KKyAqCVRyYW50b3IgVDEyOC9UMTI4Ri9UMjI4IGRyaXZlciBieS4uLgorICoKKyAqIAlEcmV3IEVja2hhcmR0CisgKglWaXNpb25hcnkgQ29tcHV0aW5nCisgKgkoVW5peCBhbmQgTGludXggY29uc3VsdGluZyBhbmQgY3VzdG9tIHByb2dyYW1taW5nKQorICoJZHJld0Bjb2xvcmFkby5lZHUKKyAqICAgICAgKzEgKDMwMykgNDQwLTQ4OTQKKyAqCisgKiBESVNUUklCVVRJT04gUkVMRUFTRSAxLgorICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgY29uc3VsdCAKKyAqCisgKiBOQ1IgNTM4MCBGYW1pbHkKKyAqIFNDU0kgUHJvdG9jb2wgQ29udHJvbGxlcgorICogRGF0YWJvb2sKKyovCisKKy8qCisgKiBPcHRpb25zIDogCisgKiBBVVRPU0VOU0UgLSBpZiBkZWZpbmVkLCBSRVFVRVNUIFNFTlNFIHdpbGwgYmUgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkKKyAqICAgICAgZm9yIGNvbW1hbmRzIHRoYXQgcmV0dXJuIHdpdGggYSBDSEVDSyBDT05ESVRJT04gc3RhdHVzLiAKKyAqCisgKiBQU0VVRE9fRE1BIC0gZW5hYmxlcyBQU0VVRE8tRE1BIGhhcmR3YXJlLCBzaG91bGQgZ2l2ZSBhIDMtNFggcGVyZm9ybWFuY2UKKyAqIGluY3JlYXNlIGNvbXBhcmVkIHRvIHBvbGxlZCBJL08uCisgKgorICogUEFSSVRZIC0gZW5hYmxlIHBhcml0eSBjaGVja2luZy4gIE5vdCBzdXBwb3J0ZWQuCisgKgorICogVU5TQUZFIC0gbGVhdmUgaW50ZXJydXB0cyBlbmFibGVkIGR1cmluZyBwc2V1ZG8tRE1BIHRyYW5zZmVycy4gCisgKgkJWW91IHByb2JhYmx5IHdhbnQgdGhpcy4KKyAqCisgKiBUaGUgY2FyZCBpcyBkZXRlY3RlZCBhbmQgaW5pdGlhbGl6ZWQgaW4gb25lIG9mIHNldmVyYWwgd2F5cyA6IAorICogMS4gIEF1dG9wcm9iZSAoZGVmYXVsdCkgLSBzaW5jZSB0aGUgYm9hcmQgaXMgbWVtb3J5IG1hcHBlZCwgCisgKiAgICAgYSBCSU9TIHNpZ25hdHVyZSBpcyBzY2FubmVkIGZvciB0byBsb2NhdGUgdGhlIHJlZ2lzdGVycy4KKyAqICAgICBBbiBpbnRlcnJ1cHQgaXMgdHJpZ2dlcmVkIHRvIGF1dG9wcm9iZSBmb3IgdGhlIGludGVycnVwdAorICogICAgIGxpbmUuCisgKgorICogMi4gIFdpdGggY29tbWFuZCBsaW5lIG92ZXJyaWRlcyAtIGR0Yz1hZGRyZXNzLGlycSBtYXkgYmUgCisgKiAgICAgdXNlZCBvbiB0aGUgTElMTyBjb21tYW5kIGxpbmUgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzLgorICogCisqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogdGhlIGZvbGxvd2luZyB3aWxsIHNldCB0aGUgbW9uaXRvciBib3JkZXIgY29sb3IgKHVzZWZ1bCB0byBmaW5kCisgd2hlcmUgc29tZXRoaW5nIGNyYXNoZWQgb3IgZ2V0cyBzdHVjayBhdCAqLworLyogMSA9IGJsdWUKKyAyID0gZ3JlZW4KKyAzID0gY3lhbgorIDQgPSByZWQKKyA1ID0gbWFnZW50YQorIDYgPSB5ZWxsb3cKKyA3ID0gd2hpdGUKKyovCisjaWYgMAorI2RlZmluZSBydHJjKGkpIHtpbmIoMHgzZGEpOyBvdXRiKDB4MzEsIDB4M2MwKTsgb3V0YigoaSksIDB4M2MwKTt9CisjZWxzZQorI2RlZmluZSBydHJjKGkpIHt9CisjZW5kaWYKKworCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgImR0Yy5oIgorI2RlZmluZSBBVVRPUFJPQkVfSVJRCisjaW5jbHVkZSAiTkNSNTM4MC5oIgorCisKKyNkZWZpbmUgRFRDX1BVQkxJQ19SRUxFQVNFIDIKKworLyojZGVmaW5lIERUQ0RFQlVHIDB4MSovCisjZGVmaW5lIERUQ0RFQlVHX0lOSVQJMHgxCisjZGVmaW5lIERUQ0RFQlVHX1RSQU5TRkVSIDB4MgorCisvKgorICogVGhlIERUQzMxODAgJiAzMjgwIGJvYXJkcyBhcmUgbWVtb3J5IG1hcHBlZC4KKyAqIAorICovCisKKy8qCisgKi8KKy8qIE9mZnNldCBmcm9tIERUQ181MzgwX09GRlNFVCAqLworI2RlZmluZSBEVENfQ09OVFJPTF9SRUcJCTB4MTAwCS8qIHJ3ICovCisjZGVmaW5lIERfQ1JfQUNDRVNTCQkweDgwCS8qIHJvIHNldD1jYW4gYWNjZXNzIDMyODAgcmVnaXN0ZXJzICovCisjZGVmaW5lIENTUl9ESVJfUkVBRAkJMHg0MAkvKiBydyBkaXJlY3Rpb24sIDEgPSByZWFkIDAgPSB3cml0ZSAqLworCisjZGVmaW5lIENTUl9SRVNFVCAgICAgICAgICAgICAgMHg4MAkvKiB3byAgUmVzZXRzIDUzYzQwMCAqLworI2RlZmluZSBDU1JfNTM4MF9SRUcgICAgICAgICAgIDB4ODAJLyogcm8gIDUzODAgcmVnaXN0ZXJzIGNhbiBiZSBhY2Nlc3NlZCAqLworI2RlZmluZSBDU1JfVFJBTlNfRElSICAgICAgICAgIDB4NDAJLyogcncgIERhdGEgdHJhbnNmZXIgZGlyZWN0aW9uICovCisjZGVmaW5lIENTUl9TQ1NJX0JVRkZfSU5UUiAgICAgMHgyMAkvKiBydyAgRW5hYmxlIGludCBvbiB0cmFuc2ZlciByZWFkeSAqLworI2RlZmluZSBDU1JfNTM4MF9JTlRSICAgICAgICAgIDB4MTAJLyogcncgIEVuYWJsZSA1MzgwIGludGVycnVwdHMgKi8KKyNkZWZpbmUgQ1NSX1NIQVJFRF9JTlRSICAgICAgICAweDA4CS8qIHJ3ICBJbnRlcnJ1cHQgc2hhcmluZyAqLworI2RlZmluZSBDU1JfSE9TVF9CVUZfTk9UX1JEWSAgIDB4MDQJLyogcm8gIEhvc3QgYnVmZmVyIG5vdCByZWFkeSAqLworI2RlZmluZSBDU1JfU0NTSV9CVUZfUkRZICAgICAgIDB4MDIJLyogcm8gIFNDU0kgYnVmZmVyIHJlYWR5ICovCisjZGVmaW5lIENTUl9HQVRFRF81MzgwX0lSUSAgICAgMHgwMQkvKiBybyAgTGFzdCBibG9jayB4ZmVycmVkICovCisjZGVmaW5lIENTUl9JTlRfQkFTRSAoQ1NSX1NDU0lfQlVGRl9JTlRSIHwgQ1NSXzUzODBfSU5UUikKKworCisjZGVmaW5lIERUQ19CTEtfQ05UCQkweDEwMQkvKiBydyAKKwkJCQkJICogIyBvZiAxMjgtYnl0ZSBibG9ja3MgdG8gdHJhbnNmZXIgKi8KKworCisjZGVmaW5lIERfQ1JfQUNDRVNTICAgICAgICAgICAgIDB4ODAJLyogcm8gc2V0PWNhbiBhY2Nlc3MgMzI4MCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBEVENfU1dJVENIX1JFRwkJMHgzOTgyCS8qIHJvIC0gRElQIHN3aXRjaGVzICovCisjZGVmaW5lIERUQ19SRVNVTUVfWEZFUgkJMHgzOTgyCS8qIHdvIC0gcmVzdW1lIGRhdGEgeGZlciAKKwkJCQkJICogYWZ0ZXIgZGlzY29ubmVjdC9yZWNvbm5lY3QqLworCisjZGVmaW5lIERUQ181MzgwX09GRlNFVAkJMHgzODgwCS8qIDggcmVnaXN0ZXJzIGhlcmUsIHNlZSBOQ1I1MzgwLmggKi8KKworLyohISEhIGZvciBkdGMsIGl0J3MgYSAxMjggYnl0ZSBidWZmZXIgYXQgMzkwMCAhISEgKi8KKyNkZWZpbmUgRFRDX0RBVEFfQlVGCQkweDM5MDAJLyogcncgMTI4IGJ5dGVzIGxvbmcgKi8KKworc3RhdGljIHN0cnVjdCBvdmVycmlkZSB7CisJdW5zaWduZWQgaW50IGFkZHJlc3M7CisJaW50IGlycTsKK30gb3ZlcnJpZGVzCisjaWZkZWYgT1ZFUlJJREUKK1tdIF9faW5pdGRhdGEgPSBPVkVSUklERTsKKyNlbHNlCitbNF0gX19pbml0ZGF0YSA9IHsgeworMCwgSVJRX0FVVE99LCB7CiswLCBJUlFfQVVUT30sIHsKKzAsIElSUV9BVVRPfSwgeworMCwgSVJRX0FVVE99fTsKKyNlbmRpZgorCisjZGVmaW5lIE5PX09WRVJSSURFUyAoc2l6ZW9mKG92ZXJyaWRlcykgLyBzaXplb2Yoc3RydWN0IG92ZXJyaWRlKSkKKworc3RhdGljIHN0cnVjdCBiYXNlIHsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJaW50IG5vYXV0bzsKK30gYmFzZXNbXSBfX2luaXRkYXRhID0geyAKKwl7IDB4Y2MwMDAsIDAgfSwgCisJeyAweGM4MDAwLCAwIH0sIAorCXsgMHhkYzAwMCwgMCB9LCAKKwl7IDB4ZDgwMDAsIDAgfQorfTsKKworI2RlZmluZSBOT19CQVNFUyAoc2l6ZW9mIChiYXNlcykgLyBzaXplb2YgKHN0cnVjdCBiYXNlKSkKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaWduYXR1cmUgeworCWNvbnN0IGNoYXIgKnN0cmluZzsKKwlpbnQgb2Zmc2V0OworfSBzaWduYXR1cmVzW10gPSB7IAorCXsiREFUQSBURUNITk9MT0dZIENPUlBPUkFUSU9OIEJJT1MiLCAweDI1fSwKK307CisKKyNkZWZpbmUgTk9fU0lHTkFUVVJFUyAoc2l6ZW9mIChzaWduYXR1cmVzKSAvICBzaXplb2YgKHN0cnVjdCBzaWduYXR1cmUpKQorCisjaWZuZGVmIE1PRFVMRQorLyoKKyAqIEZ1bmN0aW9uIDogZHRjX3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKQorICoKKyAqIFB1cnBvc2UgOiBMSUxPIGNvbW1hbmQgbGluZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgb3ZlcnJpZGVzIGFycmF5LAorICogCisgKiBJbnB1dHMgOiBzdHIgLSB1bnVzZWQsIGludHMgLSBhcnJheSBvZiBpbnRlZ2VyIHBhcmFtZXRlcnMgd2l0aCBpbnRzWzBdCisgKgllcXVhbCB0byB0aGUgbnVtYmVyIG9mIGludHMuCisgKgorKi8KKworc3RhdGljIHZvaWQgX19pbml0IGR0Y19zZXR1cChjaGFyICpzdHIsIGludCAqaW50cykKK3sKKwlzdGF0aWMgaW50IGNvbW1hbmRsaW5lX2N1cnJlbnQgPSAwOworCWludCBpOworCWlmIChpbnRzWzBdICE9IDIpCisJCXByaW50aygiZHRjX3NldHVwOiB1c2FnZSBkdGM9YWRkcmVzcyxpcnFcbiIpOworCWVsc2UgaWYgKGNvbW1hbmRsaW5lX2N1cnJlbnQgPCBOT19PVkVSUklERVMpIHsKKwkJb3ZlcnJpZGVzW2NvbW1hbmRsaW5lX2N1cnJlbnRdLmFkZHJlc3MgPSBpbnRzWzFdOworCQlvdmVycmlkZXNbY29tbWFuZGxpbmVfY3VycmVudF0uaXJxID0gaW50c1syXTsKKwkJZm9yIChpID0gMDsgaSA8IE5PX0JBU0VTOyArK2kpCisJCQlpZiAoYmFzZXNbaV0uYWRkcmVzcyA9PSBpbnRzWzFdKSB7CisJCQkJYmFzZXNbaV0ubm9hdXRvID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJKytjb21tYW5kbGluZV9jdXJyZW50OworCX0KK30KKyNlbmRpZgorCisvKiAKKyAqIEZ1bmN0aW9uIDogaW50IGR0Y19kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICogdHBudCkKKyAqCisgKiBQdXJwb3NlIDogZGV0ZWN0cyBhbmQgaW5pdGlhbGl6ZXMgRFRDIDMxODAvMzI4MCBjb250cm9sbGVycworICoJdGhhdCB3ZXJlIGF1dG9wcm9iZWQsIG92ZXJyaWRkZW4gb24gdGhlIExJTE8gY29tbWFuZCBsaW5lLCAKKyAqCW9yIHNwZWNpZmllZCBhdCBjb21waWxlIHRpbWUuCisgKgorICogSW5wdXRzIDogdHBudCAtIHRlbXBsYXRlIGZvciB0aGlzIFNDU0kgYWRhcHRlci4KKyAqIAorICogUmV0dXJucyA6IDEgaWYgYSBob3N0IGFkYXB0ZXIgd2FzIGZvdW5kLCAwIGlmIG5vdC4KKyAqCisqLworCitzdGF0aWMgaW50IF9faW5pdCBkdGNfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqIHRwbnQpCit7CisJc3RhdGljIGludCBjdXJyZW50X292ZXJyaWRlID0gMCwgY3VycmVudF9iYXNlID0gMDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBpbnQgYWRkcjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJaW50IHNpZywgY291bnQ7CisKKwl0cG50LT5wcm9jX25hbWUgPSAiZHRjM3g4MCI7CisJdHBudC0+cHJvY19pbmZvID0gJmR0Y19wcm9jX2luZm87CisKKwlmb3IgKGNvdW50ID0gMDsgY3VycmVudF9vdmVycmlkZSA8IE5PX09WRVJSSURFUzsgKytjdXJyZW50X292ZXJyaWRlKSB7CisJCWFkZHIgPSAwOworCQliYXNlID0gTlVMTDsKKworCQlpZiAob3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLmFkZHJlc3MpIHsKKwkJCWFkZHIgPSBvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uYWRkcmVzczsKKwkJCWJhc2UgPSBpb3JlbWFwKGFkZHIsIDB4MjAwMCk7CisJCQlpZiAoIWJhc2UpCisJCQkJYWRkciA9IDA7CisJCX0gZWxzZQorCQkJZm9yICg7ICFhZGRyICYmIChjdXJyZW50X2Jhc2UgPCBOT19CQVNFUyk7ICsrY3VycmVudF9iYXNlKSB7CisjaWYgKERUQ0RFQlVHICYgRFRDREVCVUdfSU5JVCkKKwkJCQlwcmludGsoInNjc2ktZHRjIDogcHJvYmluZyBhZGRyZXNzICUwOHhcbiIsIGJhc2VzW2N1cnJlbnRfYmFzZV0uYWRkcmVzcyk7CisjZW5kaWYKKwkJCQlpZiAoYmFzZXNbY3VycmVudF9iYXNlXS5ub2F1dG8pCisJCQkJCWNvbnRpbnVlOworCQkJCWJhc2UgPSBpb3JlbWFwKGJhc2VzW2N1cnJlbnRfYmFzZV0uYWRkcmVzcywgMHgyMDAwKTsKKwkJCQlpZiAoIWJhc2UpCisJCQkJCWNvbnRpbnVlOworCQkJCWZvciAoc2lnID0gMDsgc2lnIDwgTk9fU0lHTkFUVVJFUzsgKytzaWcpIHsKKwkJCQkJaWYgKGNoZWNrX3NpZ25hdHVyZShiYXNlICsgc2lnbmF0dXJlc1tzaWddLm9mZnNldCwgc2lnbmF0dXJlc1tzaWddLnN0cmluZywgc3RybGVuKHNpZ25hdHVyZXNbc2lnXS5zdHJpbmcpKSkgeworCQkJCQkJYWRkciA9IGJhc2VzW2N1cnJlbnRfYmFzZV0uYWRkcmVzczsKKyNpZiAoRFRDREVCVUcgJiBEVENERUJVR19JTklUKQorCQkJCQkJcHJpbnRrKCJzY3NpLWR0YyA6IGRldGVjdGVkIGJvYXJkLlxuIik7CisjZW5kaWYKKwkJCQkJCWdvdG8gZm91bmQ7CisJCQkJCX0KKwkJCQl9CisJCQkJaW91bm1hcChiYXNlKTsKKwkJCX0KKworI2lmIGRlZmluZWQoRFRDREVCVUcpICYmIChEVENERUJVRyAmIERUQ0RFQlVHX0lOSVQpCisJCXByaW50aygic2NzaS1kdGMgOiBiYXNlID0gJTA4eFxuIiwgYWRkcik7CisjZW5kaWYKKworCQlpZiAoIWFkZHIpCisJCQlicmVhazsKKworZm91bmQ6CisJCWluc3RhbmNlID0gc2NzaV9yZWdpc3Rlcih0cG50LCBzaXplb2Yoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEpKTsKKwkJaWYgKGluc3RhbmNlID09IE5VTEwpCisJCQlicmVhazsKKworCQlpbnN0YW5jZS0+YmFzZSA9IGFkZHI7CisJCSgoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKikoaW5zdGFuY2UpLT5ob3N0ZGF0YSktPmJhc2UgPSBiYXNlOworCisJCU5DUjUzODBfaW5pdChpbnN0YW5jZSwgMCk7CisKKwkJTkNSNTM4MF93cml0ZShEVENfQ09OVFJPTF9SRUcsIENTUl81MzgwX0lOVFIpOwkvKiBFbmFibGUgaW50J3MgKi8KKwkJaWYgKG92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5pcnEgIT0gSVJRX0FVVE8pCisJCQlpbnN0YW5jZS0+aXJxID0gb3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLmlycTsKKwkJZWxzZQorCQkJaW5zdGFuY2UtPmlycSA9IE5DUjUzODBfcHJvYmVfaXJxKGluc3RhbmNlLCBEVENfSVJRUyk7CisKKyNpZm5kZWYgRE9OVF9VU0VfSU5UUgorCQkvKiBXaXRoIGludGVycnVwdHMgZW5hYmxlZCwgaXQgd2lsbCBzb21ldGltZXMgaGFuZyB3aGVuIGRvaW5nIGhlYXZ5CisJCSAqIHJlYWRzLiBTbyBiZXR0ZXIgbm90IGVuYWJsZSB0aGVtIHVudGlsIEkgZmluZ2VyIGl0IG91dC4gKi8KKwkJaWYgKGluc3RhbmNlLT5pcnEgIT0gU0NTSV9JUlFfTk9ORSkKKwkJCWlmIChyZXF1ZXN0X2lycShpbnN0YW5jZS0+aXJxLCBkdGNfaW50ciwgU0FfSU5URVJSVVBULCAiZHRjIiwgaW5zdGFuY2UpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQgOiBJUlElZCBub3QgZnJlZSwgaW50ZXJydXB0cyBkaXNhYmxlZFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIGluc3RhbmNlLT5pcnEpOworCQkJCWluc3RhbmNlLT5pcnEgPSBTQ1NJX0lSUV9OT05FOworCQkJfQorCisJCWlmIChpbnN0YW5jZS0+aXJxID09IFNDU0lfSVJRX05PTkUpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZCA6IGludGVycnVwdHMgbm90IGVuYWJsZWQuIGZvciBiZXR0ZXIgaW50ZXJhY3RpdmUgcGVyZm9ybWFuY2UsXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQgOiBwbGVhc2UganVtcGVyIHRoZSBib2FyZCBmb3IgYSBmcmVlIElSUS5cbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwkJfQorI2Vsc2UKKwkJaWYgKGluc3RhbmNlLT5pcnEgIT0gU0NTSV9JUlFfTk9ORSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZCA6IGludGVycnVwdHMgbm90IHVzZWQuIE1pZ2h0IGFzIHdlbGwgbm90IGp1bXBlciBpdC5cbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwkJaW5zdGFuY2UtPmlycSA9IFNDU0lfSVJRX05PTkU7CisjZW5kaWYKKyNpZiBkZWZpbmVkKERUQ0RFQlVHKSAmJiAoRFRDREVCVUcgJiBEVENERUJVR19JTklUKQorCQlwcmludGsoInNjc2klZCA6IGlycSA9ICVkXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgaW5zdGFuY2UtPmlycSk7CisjZW5kaWYKKworCQlwcmludGsoS0VSTl9JTkZPICJzY3NpJWQgOiBhdCAweCUwNVgiLCBpbnN0YW5jZS0+aG9zdF9ubywgKGludCkgaW5zdGFuY2UtPmJhc2UpOworCQlpZiAoaW5zdGFuY2UtPmlycSA9PSBTQ1NJX0lSUV9OT05FKQorCQkJcHJpbnRrKCIgaW50ZXJydXB0cyBkaXNhYmxlZCIpOworCQllbHNlCisJCQlwcmludGsoIiBpcnEgJWQiLCBpbnN0YW5jZS0+aXJxKTsKKwkJcHJpbnRrKCIgb3B0aW9ucyBDQU5fUVVFVUU9JWQgIENNRF9QRVJfTFVOPSVkIHJlbGVhc2U9JWQiLCBDQU5fUVVFVUUsIENNRF9QRVJfTFVOLCBEVENfUFVCTElDX1JFTEVBU0UpOworCQlOQ1I1MzgwX3ByaW50X29wdGlvbnMoaW5zdGFuY2UpOworCQlwcmludGsoIlxuIik7CisKKwkJKytjdXJyZW50X292ZXJyaWRlOworCQkrK2NvdW50OworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IGludCBkdGNfYmlvc3BhcmFtKERpc2sgKiBkaXNrLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsIGludCAqaXApCisgKgorICogUHVycG9zZSA6IEdlbmVyYXRlcyBhIEJJT1MgLyBET1MgY29tcGF0aWJsZSBILUMtUyBtYXBwaW5nIGZvciAKKyAqCXRoZSBzcGVjaWZpZWQgZGV2aWNlIC8gc2l6ZS4KKyAqIAorICogSW5wdXRzIDogc2l6ZSA9IHNpemUgb2YgZGV2aWNlIGluIHNlY3RvcnMgKDUxMiBieXRlcyksIGRldiA9IGJsb2NrIGRldmljZQorICoJbWFqb3IgLyBtaW5vciwgaXBbXSA9IHtoZWFkcywgc2VjdG9ycywgY3lsaW5kZXJzfSAgCisgKgorICogUmV0dXJucyA6IGFsd2F5cyAwIChzdWNjZXNzKSwgaW5pdGlhbGl6ZXMgaXAKKyAqCQorKi8KKworLyogCisgKiBYWFggTW9zdCBTQ1NJIGJvYXJkcyB1c2UgdGhpcyBtYXBwaW5nLCBJIGNvdWxkIGJlIGluY29ycmVjdC4gIFNvbWUgb25lCisgKiB1c2luZyBoYXJkIGRpc2tzIG9uIGEgdHJhbnRvciBzaG91bGQgdmVyaWZ5IHRoYXQgdGhpcyBtYXBwaW5nIGNvcnJlc3BvbmRzCisgKiB0byB0aGF0IHVzZWQgYnkgdGhlIEJJT1MgLyBBU1BJIGRyaXZlciBieSBydW5uaW5nIHRoZSBsaW51eCBmZGlzayBwcm9ncmFtCisgKiBhbmQgbWF0Y2hpbmcgdGhlIEhfQ19TIGNvb3JkaW5hdGVzIHRvIHdoYXQgRE9TIHVzZXMuCisqLworCitzdGF0aWMgaW50IGR0Y19iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsCisJCQkgc2VjdG9yX3QgY2FwYWNpdHksIGludCAqaXApCit7CisJaW50IHNpemUgPSBjYXBhY2l0eTsKKworCWlwWzBdID0gNjQ7CisJaXBbMV0gPSAzMjsKKwlpcFsyXSA9IHNpemUgPj4gMTE7CisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfcHJlYWQgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCAKKyAqCXVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbikKKyAqCisgKiBQdXJwb3NlIDogRmFzdCA1MzgwIHBzZXVkby1kbWEgcmVhZCBmdW5jdGlvbiwgcmVhZHMgbGVuIGJ5dGVzIHRvIAorICoJZHN0CisgKiAKKyAqIElucHV0cyA6IGRzdCA9IGRlc3RpbmF0aW9uLCBsZW4gPSBsZW5ndGggaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzLCBub24gemVybyBvbiBhIGZhaWx1cmUgc3VjaCBhcyBhIHdhdGNoZG9nIAorICogCXRpbWVvdXQuCisqLworCitzdGF0aWMgaW50IGR0Y19tYXhpID0gMDsKK3N0YXRpYyBpbnQgZHRjX3dtYXhpID0gMDsKKworc3RhdGljIGlubGluZSBpbnQgTkNSNTM4MF9wcmVhZChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKmQgPSBkc3Q7CisJaW50IGk7CQkJLyogRm9yIGNvdW50aW5nIHRpbWUgc3BlbnQgaW4gdGhlIHBvbGwtbG9vcCAqLworCU5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworCU5DUjUzODBfc2V0dXAoaW5zdGFuY2UpOworCisJaSA9IDA7CisJTkNSNTM4MF9yZWFkKFJFU0VUX1BBUklUWV9JTlRFUlJVUFRfUkVHKTsKKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9FTkFCTEVfRU9QX0lOVFIgfCBNUl9ETUFfTU9ERSk7CisJaWYgKGluc3RhbmNlLT5pcnEgPT0gU0NTSV9JUlFfTk9ORSkKKwkJTkNSNTM4MF93cml0ZShEVENfQ09OVFJPTF9SRUcsIENTUl9ESVJfUkVBRCk7CisJZWxzZQorCQlOQ1I1MzgwX3dyaXRlKERUQ19DT05UUk9MX1JFRywgQ1NSX0RJUl9SRUFEIHwgQ1NSX0lOVF9CQVNFKTsKKwlOQ1I1MzgwX3dyaXRlKERUQ19CTEtfQ05ULCBsZW4gPj4gNyk7CS8qIEJsb2NrIGNvdW50ICovCisJcnRyYygxKTsKKwl3aGlsZSAobGVuID4gMCkgeworCQlydHJjKDIpOworCQl3aGlsZSAoTkNSNTM4MF9yZWFkKERUQ19DT05UUk9MX1JFRykgJiBDU1JfSE9TVF9CVUZfTk9UX1JEWSkKKwkJCSsraTsKKwkJcnRyYygzKTsKKwkJbWVtY3B5X2Zyb21pbyhkLCBiYXNlICsgRFRDX0RBVEFfQlVGLCAxMjgpOworCQlkICs9IDEyODsKKwkJbGVuIC09IDEyODsKKwkJcnRyYyg3KTsKKwkJLyoqKiB3aXRoIGludCdzIG9uLCBpdCBzb21ldGltZXMgaGFuZ3MgYWZ0ZXIgaGVyZS4KKwkJICogTG9va3MgbGlrZSBzb21ldGhpbmcgbWFrZXMgSEJOUiBnbyBhd2F5LiAqLworCX0KKwlydHJjKDQpOworCXdoaWxlICghKE5DUjUzODBfcmVhZChEVENfQ09OVFJPTF9SRUcpICYgRF9DUl9BQ0NFU1MpKQorCQkrK2k7CisJTkNSNTM4MF93cml0ZShNT0RFX1JFRywgMCk7CS8qIENsZWFyIHRoZSBvcGVyYXRpbmcgbW9kZSAqLworCXJ0cmMoMCk7CisJTkNSNTM4MF9yZWFkKFJFU0VUX1BBUklUWV9JTlRFUlJVUFRfUkVHKTsKKwlpZiAoaSA+IGR0Y19tYXhpKQorCQlkdGNfbWF4aSA9IGk7CisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfcHdyaXRlIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgCisgKgl1bnNpZ25lZCBjaGFyICpzcmMsIGludCBsZW4pCisgKgorICogUHVycG9zZSA6IEZhc3QgNTM4MCBwc2V1ZG8tZG1hIHdyaXRlIGZ1bmN0aW9uLCB0cmFuc2ZlcnMgbGVuIGJ5dGVzIGZyb20KKyAqCXNyYworICogCisgKiBJbnB1dHMgOiBzcmMgPSBzb3VyY2UsIGxlbiA9IGxlbmd0aCBpbiBieXRlcworICoKKyAqIFJldHVybnMgOiAwIG9uIHN1Y2Nlc3MsIG5vbiB6ZXJvIG9uIGEgZmFpbHVyZSBzdWNoIGFzIGEgd2F0Y2hkb2cgCisgKiAJdGltZW91dC4KKyovCisKK3N0YXRpYyBpbmxpbmUgaW50IE5DUjUzODBfcHdyaXRlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBsZW4pCit7CisJaW50IGk7CisJTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisJTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisKKwlOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0VOQUJMRV9FT1BfSU5UUiB8IE1SX0RNQV9NT0RFKTsKKwkvKiBzZXQgZGlyZWN0aW9uICh3cml0ZSkgKi8KKwlpZiAoaW5zdGFuY2UtPmlycSA9PSBTQ1NJX0lSUV9OT05FKQorCQlOQ1I1MzgwX3dyaXRlKERUQ19DT05UUk9MX1JFRywgMCk7CisJZWxzZQorCQlOQ1I1MzgwX3dyaXRlKERUQ19DT05UUk9MX1JFRywgQ1NSXzUzODBfSU5UUik7CisJTkNSNTM4MF93cml0ZShEVENfQkxLX0NOVCwgbGVuID4+IDcpOwkvKiBCbG9jayBjb3VudCAqLworCWZvciAoaSA9IDA7IGxlbiA+IDA7ICsraSkgeworCQlydHJjKDUpOworCQkvKiBQb2xsIHVudGlsIHRoZSBob3N0IGJ1ZmZlciBjYW4gYWNjZXB0IGRhdGEuICovCisJCXdoaWxlIChOQ1I1MzgwX3JlYWQoRFRDX0NPTlRST0xfUkVHKSAmIENTUl9IT1NUX0JVRl9OT1RfUkRZKQorCQkJKytpOworCQlydHJjKDMpOworCQltZW1jcHlfdG9pbyhiYXNlICsgRFRDX0RBVEFfQlVGLCBzcmMsIDEyOCk7CisJCXNyYyArPSAxMjg7CisJCWxlbiAtPSAxMjg7CisJfQorCXJ0cmMoNCk7CisJd2hpbGUgKCEoTkNSNTM4MF9yZWFkKERUQ19DT05UUk9MX1JFRykgJiBEX0NSX0FDQ0VTUykpCisJCSsraTsKKwlydHJjKDYpOworCS8qIFdhaXQgdW50aWwgdGhlIGxhc3QgYnl0ZSBoYXMgYmVlbiBzZW50IHRvIHRoZSBkaXNrICovCisJd2hpbGUgKCEoTkNSNTM4MF9yZWFkKFRBUkdFVF9DT01NQU5EX1JFRykgJiBUQ1JfTEFTVF9CWVRFX1NFTlQpKQorCQkrK2k7CisJcnRyYyg3KTsKKwkvKiBDaGVjayBmb3IgcGFyaXR5IGVycm9yIGhlcmUuIGZpeG1lLiAqLworCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIDApOwkvKiBDbGVhciB0aGUgb3BlcmF0aW5nIG1vZGUgKi8KKwlydHJjKDApOworCWlmIChpID4gZHRjX3dtYXhpKQorCQlkdGNfd21heGkgPSBpOworCXJldHVybiAoMCk7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2luY2x1ZGUgIk5DUjUzODAuYyIKKworc3RhdGljIGludCBkdGNfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwlOQ1I1MzgwX3NldHVwKHNob3N0KTsKKwlpZiAoc2hvc3QtPmlycSkKKwkJZnJlZV9pcnEoc2hvc3QtPmlycSwgTlVMTCk7CisJTkNSNTM4MF9leGl0KHNob3N0KTsKKwlpZiAoc2hvc3QtPmlvX3BvcnQgJiYgc2hvc3QtPm5faW9fcG9ydCkKKwkJcmVsZWFzZV9yZWdpb24oc2hvc3QtPmlvX3BvcnQsIHNob3N0LT5uX2lvX3BvcnQpOworCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7CisJaW91bm1hcChiYXNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLm5hbWUJCQkJPSAiRFRDIDMxODAvMzI4MCAiLAorCS5kZXRlY3QJCQkJPSBkdGNfZGV0ZWN0LAorCS5yZWxlYXNlCQkJPSBkdGNfcmVsZWFzZSwKKwkucXVldWVjb21tYW5kCQkJPSBkdGNfcXVldWVfY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlcgkJPSBkdGNfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCQk9IGR0Y19idXNfcmVzZXQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyCT0gZHRjX2RldmljZV9yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyICAgICAgICAgID0gZHRjX2hvc3RfcmVzZXQsCisJLmJpb3NfcGFyYW0gICAgIAkJPSBkdGNfYmlvc3BhcmFtLAorCS5jYW5fcXVldWUgICAgICAJCT0gQ0FOX1FVRVVFLAorCS50aGlzX2lkICAgICAgICAJCT0gNywKKwkuc2dfdGFibGVzaXplICAgCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4gICAgCQk9IENNRF9QRVJfTFVOLAorCS51c2VfY2x1c3RlcmluZyAJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorfTsKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2R0Yy5oIGIvZHJpdmVycy9zY3NpL2R0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YmNkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZHRjLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIERUQyBjb250cm9sbGVyLCB0YWtlbiBmcm9tIFQxMjggZHJpdmVyIGJ5Li4uCisgKiBDb3B5cmlnaHQgMTk5MywgRHJldyBFY2toYXJkdAorICoJVmlzaW9uYXJ5IENvbXB1dGluZworICoJKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyAqCWRyZXdAY29sb3JhZG8uZWR1CisgKiAgICAgICsxICgzMDMpIDQ0MC00ODk0CisgKgorICogRElTVFJJQlVUSU9OIFJFTEVBU0UgMi4gCisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0IAorICoKKyAqIAorICogCisgKiBhbmQgCisgKgorICogTkNSIDUzODAgRmFtaWx5CisgKiBTQ1NJIFByb3RvY29sIENvbnRyb2xsZXIKKyAqIERhdGFib29rCisgKgorICogTkNSIE1pY3JvZWxlY3Ryb25pY3MKKyAqIDE2MzUgQWVyb3BsYXphIERyaXZlCisgKiBDb2xvcmFkbyBTcHJpbmdzLCBDTyA4MDkxNgorICogMSsgKDcxOSkgNTc4LTM0MDAKKyAqIDErICg4MDApIDMzNC01NDU0CisgKi8KKworI2lmbmRlZiBEVEMzMjgwX0gKKyNkZWZpbmUgRFRDMzI4MF9ICisKK3N0YXRpYyBpbnQgZHRjX2Fib3J0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgZHRjX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLAorCQkgICAgICAgICBzZWN0b3JfdCwgaW50Kik7CitzdGF0aWMgaW50IGR0Y19kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICopOworc3RhdGljIGludCBkdGNfcXVldWVfY29tbWFuZChTY3NpX0NtbmQgKiwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSk7CitzdGF0aWMgaW50IGR0Y19idXNfcmVzZXQoU2NzaV9DbW5kICopOworc3RhdGljIGludCBkdGNfZGV2aWNlX3Jlc2V0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgZHRjX2hvc3RfcmVzZXQoU2NzaV9DbW5kICopOworCisjaWZuZGVmIENNRF9QRVJfTFVOCisjZGVmaW5lIENNRF9QRVJfTFVOIDIKKyNlbmRpZgorCisjaWZuZGVmIENBTl9RVUVVRQorI2RlZmluZSBDQU5fUVVFVUUgMzIgCisjZW5kaWYKKworI2RlZmluZSBOQ1I1MzgwX2ltcGxlbWVudGF0aW9uX2ZpZWxkcyBcCisgICAgdm9pZCBfX2lvbWVtICpiYXNlCisKKyNkZWZpbmUgTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCkgXAorICAgIHZvaWQgX19pb21lbSAqYmFzZQorCisjZGVmaW5lIE5DUjUzODBfc2V0dXAoaW5zdGFuY2UpIFwKKyAgICBiYXNlID0gKChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKShpbnN0YW5jZSktPmhvc3RkYXRhKS0+YmFzZQorCisjZGVmaW5lIERUQ19hZGRyZXNzKHJlZykgKGJhc2UgKyBEVENfNTM4MF9PRkZTRVQgKyByZWcpCisKKyNkZWZpbmUgZGJOQ1I1MzgwX3JlYWQocmVnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHJ2YWw9cmVhZGIoRFRDX2FkZHJlc3MocmVnKSksIFwKKyAgICAgKCgodW5zaWduZWQgY2hhcikgcHJpbnRrKCJEVEMgOiByZWFkIHJlZ2lzdGVyICVkIGF0IGFkZHIgJXAgaXM6ICUwMnhcbiJcCisgICAgLCAocmVnKSwgRFRDX2FkZHJlc3MocmVnKSwgcnZhbCkpLCBydmFsICkgKQorCisjZGVmaW5lIGRiTkNSNTM4MF93cml0ZShyZWcsIHZhbHVlKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsoIkRUQyA6IHdyaXRlICUwMnggdG8gcmVnaXN0ZXIgJWQgYXQgYWRkcmVzcyAlcFxuIiwgICAgICAgICBcCisgICAgICAgICAgICAodmFsdWUpLCAocmVnKSwgRFRDX2FkZHJlc3MocmVnKSk7ICAgICBcCisgICAgd3JpdGViKHZhbHVlLCBEVENfYWRkcmVzcyhyZWcpKTt9IHdoaWxlKDApCisKKworI2lmICEoRFRDREVCVUcgJiBEVENERUJVR19UUkFOU0ZFUikgCisjZGVmaW5lIE5DUjUzODBfcmVhZChyZWcpIChyZWFkYihEVENfYWRkcmVzcyhyZWcpKSkKKyNkZWZpbmUgTkNSNTM4MF93cml0ZShyZWcsIHZhbHVlKSAod3JpdGViKHZhbHVlLCBEVENfYWRkcmVzcyhyZWcpKSkKKyNlbHNlCisjZGVmaW5lIE5DUjUzODBfcmVhZChyZWcpIChyZWFkYihEVENfYWRkcmVzcyhyZWcpKSkKKyNkZWZpbmUgeE5DUjUzODBfcmVhZChyZWcpCQkJCQkJXAorICAgICgoKHVuc2lnbmVkIGNoYXIpIHByaW50aygiRFRDIDogcmVhZCByZWdpc3RlciAlZCBhdCBhZGRyZXNzICVwXG4iXAorICAgICwgKHJlZyksIERUQ19hZGRyZXNzKHJlZykpKSwgcmVhZGIoRFRDX2FkZHJlc3MocmVnKSkpCisKKyNkZWZpbmUgTkNSNTM4MF93cml0ZShyZWcsIHZhbHVlKSBkbyB7CQkJCQlcCisgICAgcHJpbnRrKCJEVEMgOiB3cml0ZSAlMDJ4IHRvIHJlZ2lzdGVyICVkIGF0IGFkZHJlc3MgJXBcbiIsIAlcCisJICAgICh2YWx1ZSksIChyZWcpLCBEVENfYWRkcmVzcyhyZWcpKTsJXAorICAgIHdyaXRlYih2YWx1ZSwgRFRDX2FkZHJlc3MocmVnKSk7fSB3aGlsZSgwKQorI2VuZGlmCisKKyNkZWZpbmUgTkNSNTM4MF9pbnRyCQkJZHRjX2ludHIKKyNkZWZpbmUgTkNSNTM4MF9xdWV1ZV9jb21tYW5kCQlkdGNfcXVldWVfY29tbWFuZAorI2RlZmluZSBOQ1I1MzgwX2Fib3J0CQkJZHRjX2Fib3J0CisjZGVmaW5lIE5DUjUzODBfYnVzX3Jlc2V0CQlkdGNfYnVzX3Jlc2V0CisjZGVmaW5lIE5DUjUzODBfZGV2aWNlX3Jlc2V0CQlkdGNfZGV2aWNlX3Jlc2V0CisjZGVmaW5lIE5DUjUzODBfaG9zdF9yZXNldAkJZHRjX2hvc3RfcmVzZXQKKyNkZWZpbmUgTkNSNTM4MF9wcm9jX2luZm8JCWR0Y19wcm9jX2luZm8gCisKKy8qIDE1IDEyIDExIDEwCisgICAxMDAxIDExMDAgMDAwMCAwMDAwICovCisKKyNkZWZpbmUgRFRDX0lSUVMgMHg5YzAwCisKKworI2VuZGlmIC8qIERUQzMyODBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2VhdGEuYyBiL2RyaXZlcnMvc2NzaS9lYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkMTZjZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9lYXRhLmMKQEAgLTAsMCArMSwyNjIxIEBACisvKgorICogICAgICBlYXRhLmMgLSBMb3ctbGV2ZWwgZHJpdmVyIGZvciBFQVRBL0RNQSBTQ1NJIGhvc3QgYWRhcHRlcnMuCisgKgorICogICAgICAwMyBKdW4gMjAwMyBSZXYuIDguMTAgZm9yIGxpbnV4LTIuNS43MAorICogICAgICAgICsgVXBkYXRlIGZvciBuZXcgSVJRIEFQSS4KKyAqICAgICAgICArIFVzZSAiZ290byIgd2hlbiBhcHByb3ByaWF0ZS4KKyAqICAgICAgICArIERyb3AgZWF0YS5oLgorICogICAgICAgICsgVXBkYXRlIGZvciBuZXcgbW9kdWxlX3BhcmFtIEFQSS4KKyAqICAgICAgICArIE1vZHVsZSBwYXJhbWV0ZXJzICBjYW4gbm93IGJlIHNwZWNpZmllZCBvbmx5IGluIHRoZQorICogICAgICAgICAgc2FtZSBmb3JtYXQgYXMgdGhlIGtlcm5lbCBib290IG9wdGlvbnMuCisgKgorICogICAgICAgICAgICAgYm9vdCBvcHRpb24gICAgb2xkIG1vZHVsZSBwYXJhbSAKKyAqICAgICAgICAgICAgIC0tLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAgICAgICAgYWRkciwuLi4gICAgICAgaW9fcG9ydD1hZGRyLC4uLgorICogICAgICAgICAgICAgbGM6W3l8bl0gICAgICAgbGlua2VkX2NvbW09WzF8MF0KKyAqICAgICAgICAgICAgIG1xOnh4ICAgICAgICAgIG1heF9xdWV1ZV9kZXB0aD14eAorICogICAgICAgICAgICAgdG06WzB8MXwyXSAgICAgdGFnX21vZGU9WzB8MXwyXQorICogICAgICAgICAgICAgZXQ6W3l8bl0gICAgICAgZXh0X3RyYW49WzF8MF0KKyAqICAgICAgICAgICAgIHJzOlt5fG5dICAgICAgIHJldl9zY2FuPVsxfDBdCisgKiAgICAgICAgICAgICBpcDpbeXxuXSAgICAgICBpc2FfcHJvYmU9WzF8MF0KKyAqICAgICAgICAgICAgIGVwOlt5fG5dICAgICAgIGVpc2FfcHJvYmU9WzF8MF0KKyAqICAgICAgICAgICAgIHBwOlt5fG5dICAgICAgIHBjaV9wcm9iZT1bMXwwXQorICoKKyAqICAgICAgICAgIEEgdmFsaWQgZXhhbXBsZSB1c2luZyB0aGUgbmV3IHBhcmFtZXRlciBmb3JtYXQgaXM6CisgKiAgICAgICAgICBtb2Rwcm9iZSBlYXRhICJlYXRhPTB4NzQxMCwweDIzMCxsYzp5LHRtOjAsbXE6NCxlcDpuIgorICoKKyAqICAgICAgICAgIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIG9sZCBmb3JtYXQ6CisgKiAgICAgICAgICBtb2Rwcm9iZSBlYXRhIGlvX3BvcnQ9MHg3NDEwLDB4MjMwIGxpbmtlZF9jb21tPTEgdGFnX21vZGU9MCBcCisgKiAgICAgICAgICAgICAgICAgICAgICAgIG1heF9xdWV1ZV9kZXB0aD00IGVpc2FfcHJvYmU9MAorICoKKyAqICAgICAgMTIgRmViIDIwMDMgUmV2LiA4LjA0IGZvciBsaW51eCAyLjUuNjAKKyAqICAgICAgICArIFJlbGVhc2UgaXJxIGJlZm9yZSBjYWxsaW5nIHNjc2lfcmVnaXN0ZXIuCisgKgorICogICAgICAxMiBOb3YgMjAwMiBSZXYuIDguMDIgZm9yIGxpbnV4IDIuNS40NworICogICAgICAgICsgUmVsZWFzZSBkcml2ZXJfbG9jayBiZWZvcmUgY2FsbGluZyBzY3NpX3JlZ2lzdGVyLgorICoKKyAqICAgICAgMTEgTm92IDIwMDIgUmV2LiA4LjAxIGZvciBsaW51eCAyLjUuNDcKKyAqICAgICAgICArIEZpeGVkIGJpb3NfcGFyYW0gYW5kIHNjc2ljYW1fYmlvc19wYXJhbSBjYWxsaW5nIHBhcmFtZXRlcnMuCisgKgorICogICAgICAyOCBPY3QgMjAwMiBSZXYuIDguMDAgZm9yIGxpbnV4IDIuNS40NC1hYzQKKyAqICAgICAgICArIFVzZSBuZXcgdGNxIGFuZCBhZGp1c3RfcXVldWVfZGVwdGggYXBpLgorICogICAgICAgICsgTmV3IGNvbW1hbmQgbGluZSBvcHRpb24gKHRtOlswLTJdKSB0byBjaG9vc2UgdGhlIHR5cGUgb2YgdGFnczoKKyAqICAgICAgICAgIDAgLT4gZGlzYWJsZSB0YWdnaW5nIDsgMSAtPiBzaW1wbGUgdGFncyAgOyAyIC0+IG9yZGVyZWQgdGFncy4KKyAqICAgICAgICAgIERlZmF1bHQgaXMgdG06MCAodGFnZ2VkIGNvbW1hbmRzIGRpc2FibGVkKS4KKyAqICAgICAgICAgIEZvciBjb21wYXRpYmlsaXR5IHRoZSAidGM6IiBvcHRpb24gaXMgYW4gYWxpYXMgb2YgdGhlICJ0bToiCisgKiAgICAgICAgICBvcHRpb247IHRjOm4gaXMgZXF1aXZhbGVudCB0byB0bTowIGFuZCB0Yzp5IGlzIGVxdWl2YWxlbnQgdG8KKyAqICAgICAgICAgIHRtOjEuCisgKiAgICAgICAgKyBUaGUgdGFnZ2VkX2NvbW0gbW9kdWxlIHBhcmFtZXRlciBoYXMgYmVlbiByZW1vdmVkLCB1c2UgdGFnX21vZGUKKyAqICAgICAgICAgIGluc3RlYWQsIGVxdWl2YWxlbnQgdG8gdGhlICJ0bToiIGJvb3Qgb3B0aW9uLgorICoKKyAqICAgICAgMTAgT2N0IDIwMDIgUmV2LiA3LjcwIGZvciBsaW51eCAyLjUuNDIKKyAqICAgICAgICArIEZvcmVwb3J0IGZyb20gcmV2aXNpb24gNi43MC4KKyAqCisgKiAgICAgIDI1IEp1biAyMDAyIFJldi4gNi43MCBmb3IgbGludXggMi40LjE5CisgKiAgICAgICAgKyBUaGlzIHJlbGVhc2UgaXMgdGhlIGZpcnN0IG9uZSB0ZXN0ZWQgb24gYSBCaWcgRW5kaWFuIHBsYXRmb3JtOgorICogICAgICAgICAgZml4ZWQgZW5kaWFuLW5lc3MgcHJvYmxlbSBkdWUgdG8gYml0ZmllbGRzOworICogICAgICAgICAgZml4ZWQgZW5kaWFuLW5lc3MgcHJvYmxlbSBpbiByZWFkX3Bpby4KKyAqICAgICAgICArIEFkZGVkIG5ldyBvcHRpb25zIGZvciBzZWxlY3RpdmVseSBwcm9iaW5nIElTQSwgRUlTQSBhbmQgUENJIGJ1czoKKyAqCisgKiAgICAgICAgICBCb290IG9wdGlvbiAgIFBhcmFtZXRlciBuYW1lICAgIERlZmF1bHQgYWNjb3JkaW5nIHRvCisgKgorICogICAgICAgICAgaXA6W3l8bl0gICAgICBpc2FfcHJvYmU9WzF8MF0gICBDT05GSUdfSVNBICBkZWZpbmVkCisgKiAgICAgICAgICBlcDpbeXxuXSAgICAgIGVpc2FfcHJvYmU9WzF8MF0gIENPTkZJR19FSVNBIGRlZmluZWQKKyAqICAgICAgICAgIHBwOlt5fG5dICAgICAgcGNpX3Byb2JlPVsxfDBdICAgQ09ORklHX1BDSSAgZGVmaW5lZAorICoKKyAqICAgICAgICAgIFRoZSBkZWZhdWx0IGFjdGlvbiBpcyB0byBwZXJmb3JtIHByb2JpbmcgaWYgdGhlIGNvcnJpc3BvbmRpbmcKKyAqICAgICAgICAgIGJ1cyBpcyBjb25maWd1cmVkIGFuZCB0byBza2lwIHByb2Jpbmcgb3RoZXJ3aXNlLgorICoKKyAqICAgICAgICArIElmIHBjaV9wcm9iZSBpcyBpbiBlZmZlY3QgYW5kIGEgbGlzdCBvZiBJL08gIHBvcnRzIGlzIHNwZWNpZmllZAorICogICAgICAgICAgYXMgcGFyYW1ldGVyIG9yIGJvb3Qgb3B0aW9uLCBwY2lfZW5hYmxlX2RldmljZSgpIGlzIHBlcmZvcm1lZAorICogICAgICAgICAgb24gYWxsIHBjaSBkZXZpY2VzIG1hdGNoaW5nIFBDSV9DTEFTU19TVE9SQUdFX1NDU0kuCisgKgorICogICAgICAyMSBGZWIgMjAwMiBSZXYuIDYuNTIgZm9yIGxpbnV4IDIuNC4xOAorICogICAgICAgICsgQmFja3BvcnQgZnJvbSByZXYuIDcuMjIgKHVzZSBpb19yZXF1ZXN0X2xvY2spLgorICoKKyAqICAgICAgMjAgRmViIDIwMDIgUmV2LiA3LjIyIGZvciBsaW51eCAyLjUuNQorICogICAgICAgICsgUmVtb3ZlIGFueSByZWZlcmVuY2UgdG8gdmlydF90b19idXMoKS4KKyAqICAgICAgICArIEZpeCBwaW8gaGFuZyB3aGlsZSBkZXRlY3RpbmcgbXVsdGlwbGUgSEJBcy4KKyAqICAgICAgICArIEZpeGVkIGEgYm9hcmQgZGV0ZWN0aW9uIGJ1ZzogaW4gYSBzeXN0ZW0gd2l0aAorICogICAgICAgICAgbXVsdGlwbGUgSVNBL0VJU0EgYm9hcmRzLCBhbGwgYnV0IHRoZSBmaXJzdCBvbmUKKyAqICAgICAgICAgIHdlcmUgZXJyb25lb3VzbHkgZGV0ZWN0ZWQgYXMgUENJLgorICoKKyAqICAgICAgMDEgSmFuIDIwMDIgUmV2LiA3LjIwIGZvciBsaW51eCAyLjUuMQorICogICAgICAgICsgVXNlIHRoZSBkeW5hbWljIERNQSBtYXBwaW5nIEFQSS4KKyAqCisgKiAgICAgIDE5IERlYyAyMDAxIFJldi4gNy4wMiBmb3IgbGludXggMi41LjEKKyAqICAgICAgICArIFVzZSBTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24gaWYgc2V0LgorICogICAgICAgICsgVXNlIHNnbGlzdC5wYWdlIGluc3RlYWQgb2Ygc2dsaXN0LmFkZHJlc3MuCisgKgorICogICAgICAxMSBEZWMgMjAwMSBSZXYuIDcuMDAgZm9yIGxpbnV4IDIuNS4xCisgKiAgICAgICAgKyBVc2UgaG9zdC0+aG9zdF9sb2NrIGluc3RlYWQgb2YgaW9fcmVxdWVzdF9sb2NrLgorICoKKyAqICAgICAgIDEgTWF5IDIwMDEgUmV2LiA2LjA1IGZvciBsaW51eCAyLjQuNAorICogICAgICAgICsgQ2xlYW4gdXAgYWxsIHBjaSByZWxhdGVkIHJvdXRpbmVzLgorICogICAgICAgICsgRml4IGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uIGZvciBvcGNvZGUgU0VORF9DVUVfU0hFRVQgKDB4NWQpCisgKgorICogICAgICAzMCBKYW4gMjAwMSBSZXYuIDYuMDQgZm9yIGxpbnV4IDIuNC4xCisgKiAgICAgICAgKyBDYWxsIHBjaV9yZXNvdXJjZV9zdGFydCBhZnRlciBwY2lfZW5hYmxlX2RldmljZS4KKyAqCisgKiAgICAgIDI1IEphbiAyMDAxIFJldi4gNi4wMyBmb3IgbGludXggMi40LjAKKyAqICAgICAgICArICJjaGVja19yZWdpb24iIGNhbGwgcmVwbGFjZWQgYnkgInJlcXVlc3RfcmVnaW9uIi4KKyAqCisgKiAgICAgIDIyIE5vdiAyMDAwIFJldi4gNi4wMiBmb3IgbGludXggMi40LjAtdGVzdDExCisgKiAgICAgICAgKyBSZXR1cm4gY29kZSBjaGVja2VkIHdoZW4gY2FsbGluZyBwY2lfZW5hYmxlX2RldmljZS4KKyAqICAgICAgICArIFJlbW92ZWQgb2xkIHNjc2kgZXJyb3IgaGFuZGxpbmcgc3VwcG9ydC4KKyAqICAgICAgICArIFRoZSBvYnNvbGV0ZSBib290IG9wdGlvbiBmbGFnIGVoOm4gaXMgc2lsZW50bHkgaWdub3JlZC4KKyAqICAgICAgICArIFJlbW92ZWQgZXJyb3IgbWVzc2FnZXMgd2hpbGUgYSBkaXNrIGRyaXZlIGlzIHBvd2VyZWQgdXAgYXQKKyAqICAgICAgICAgIGJvb3QgdGltZS4KKyAqICAgICAgICArIEltcHJvdmVkIGJvb3QgbWVzc2FnZXM6IGFsbCB0YWdnZWQgY2FwYWJsZSBkZXZpY2UgYXJlCisgKiAgICAgICAgICBpbmRpY2F0ZWQgYXMgInRhZ2dlZCIgb3IgInNvZnQtdGFnZ2VkIiA6CisgKiAgICAgICAgICAtICJzb2Z0LXRhZ2dlZCIgIG1lYW5zIHRoYXQgdGhlIGRyaXZlciBpcyB0cnlpbmcgdG8gZG8gaXRzCisgKiAgICAgICAgICAgIG93biB0YWdnaW5nIChpLmUuIHRoZSB0Yzp5IG9wdGlvbiBpcyBpbiBlZmZlY3QpOworICogICAgICAgICAgLSAidGFnZ2VkIiBtZWFucyB0aGF0IHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGFnZ2VkIGNvbW1hbmRzLAorICogICAgICAgICAgICBidXQgdGhlIGRyaXZlciBsZXRzIHRoZSBIQkEgYmUgcmVzcG9uc2libGUgZm9yIHRhZ2dpbmcKKyAqICAgICAgICAgICAgc3VwcG9ydC4KKyAqCisgKiAgICAgIDE2IFNlcCAxOTk5IFJldi4gNS4xMSBmb3IgbGludXggMi4yLjEyIGFuZCAyLjMuMTgKKyAqICAgICAgICArIFVwZGF0ZWQgdG8gdGhlIG5ldyBfX3NldHVwIGludGVyZmFjZSBmb3IgYm9vdCBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAqICAgICAgICArIFdoZW4gbG9hZGVkIGFzIGEgbW9kdWxlLCBhY2NlcHRzIHRoZSBuZXcgcGFyYW1ldGVyIGJvb3Rfb3B0aW9ucworICogICAgICAgICAgd2hpY2ggdmFsdWUgaXMgYSBzdHJpbmcgd2l0aCB0aGUgc2FtZSBmb3JtYXQgb2YgdGhlIGtlcm5lbCBib290CisgKiAgICAgICAgICBjb21tYW5kIGxpbmUgb3B0aW9ucy4gQSB2YWxpZCBleGFtcGxlIGlzOgorICogICAgICAgICAgbW9kcHJvYmUgZWF0YSAnYm9vdF9vcHRpb25zPSIweDc0MTAsMHgyMzAsbGM6eSx0YzpuLG1xOjQiJworICoKKyAqICAgICAgIDkgU2VwIDE5OTkgUmV2LiA1LjEwIGZvciBsaW51eCAyLjIuMTIgYW5kIDIuMy4xNworICogICAgICAgICsgNjRiaXQgY2xlYW51cCBmb3IgTGludXgvQWxwaGEgcGxhdGZvcm0gc3VwcG9ydAorICogICAgICAgICAgKGNvbnRyaWJ1dGlvbiBmcm9tIEguSi4gTHUpLgorICoKKyAqICAgICAgMjIgSnVsIDE5OTkgUmV2LiA1LjAwIGZvciBsaW51eCAyLjIuMTAgYW5kIDIuMy4xMQorICogICAgICAgICsgUmVtb3ZlZCBwcmUtMi4yIHNvdXJjZSBjb2RlIGNvbXBhdGliaWxpdHkuCisgKiAgICAgICAgKyBBZGRlZCBjYWxsIHRvIHBjaV9zZXRfbWFzdGVyLgorICoKKyAqICAgICAgMjYgSnVsIDE5OTggUmV2LiA0LjMzIGZvciBsaW51eCAyLjAuMzUgYW5kIDIuMS4xMTEKKyAqICAgICAgICArIEFkZGVkIGNvbW1hbmQgbGluZSBvcHRpb24gKHJzOlt5fG5dKSB0byByZXZlcnNlIHRoZSBzY2FuIG9yZGVyCisgKiAgICAgICAgICBvZiBQQ0kgYm9hcmRzLiBUaGUgZGVmYXVsdCBpcyByczp5LCB3aGljaCByZXZlcnNlcyB0aGUgQklPUyBvcmRlcgorICogICAgICAgICAgd2hpbGUgcmVnaXN0ZXJpbmcgUENJIGJvYXJkcy4gVGhlIGRlZmF1bHQgdmFsdWUgcnM6eSBnZW5lcmF0ZXMKKyAqICAgICAgICAgIHRoZSBzYW1lIG9yZGVyIG9mIGFsbCBwcmV2aW91cyByZXZpc2lvbnMgb2YgdGhpcyBkcml2ZXIuCisgKiAgICAgICAgICBQbHMuIG5vdGUgdGhhdCAiQklPUyBvcmRlciIgbWlnaHQgaGF2ZSBiZWVuIHJldmVyc2VkIGl0c2VsZgorICogICAgICAgICAgYWZ0ZXIgdGhlIDIuMS45eCBQQ0kgbW9kaWZpY2F0aW9ucyBpbiB0aGUgbGludXgga2VybmVsLgorICogICAgICAgICAgVGhlIHJzIHZhbHVlIGlzIGlnbm9yZWQgd2hlbiB0aGUgZXhwbGljaXQgbGlzdCBvZiBhZGRyZXNzZXMKKyAqICAgICAgICAgIGlzIHVzZWQgYnkgdGhlICJlYXRhPXBvcnQwLHBvcnQxLC4uLiIgY29tbWFuZCBsaW5lIG9wdGlvbi4KKyAqICAgICAgICArIEFkZGVkIGNvbW1hbmQgbGluZSBvcHRpb24gKGV0Olt5fG5dKSB0byBmb3JjZSB1c2Ugb2YgZXh0ZW5kZWQKKyAqICAgICAgICAgIHRyYW5zbGF0aW9uICgyNTUgaGVhZHMsIDYzIHNlY3RvcnMpIGFzIGRpc2sgZ2VvbWV0cnkuCisgKiAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBldDpuLCB3aGljaCB1c2VzIHRoZSBkaXNrIGdlb21ldHJ5IHJldHVybmVkCisgKiAgICAgICAgICBieSBzY3NpY2FtX2Jpb3NfcGFyYW0uIFRoZSBkZWZhdWx0IHZhbHVlIGV0Om4gaXMgY29tcGF0aWJsZSB3aXRoCisgKiAgICAgICAgICBhbGwgcHJldmlvdXMgcmV2aXNpb25zIG9mIHRoaXMgZHJpdmVyLgorICoKKyAqICAgICAgMjggTWF5IDE5OTggUmV2LiA0LjMyIGZvciBsaW51eCAyLjAuMzMgYW5kIDIuMS4xMDQKKyAqICAgICAgICAgIEluY3JlYXNlZCBidXN5IHRpbWVvdXQgZnJvbSAxMCBtc2VjLiB0byAyMDAgbXNlYy4gd2hpbGUKKyAqICAgICAgICAgIHByb2Nlc3NpbmcgaW50ZXJydXB0cy4KKyAqCisgKiAgICAgIDE2IE1heSAxOTk4IFJldi4gNC4zMSBmb3IgbGludXggMi4wLjMzIGFuZCAyLjEuMTAyCisgKiAgICAgICAgICBJbXByb3ZlZCBhYm9ydCBoYW5kbGluZyBkdXJpbmcgdGhlIGVoIHJlY292ZXJ5IHByb2Nlc3MuCisgKgorICogICAgICAxMyBNYXkgMTk5OCBSZXYuIDQuMzAgZm9yIGxpbnV4IDIuMC4zMyBhbmQgMi4xLjEwMQorICogICAgICAgICAgVGhlIGRyaXZlciBpcyBub3cgZnVsbHkgU01QIHNhZmUsIGluY2x1ZGluZyB0aGUKKyAqICAgICAgICAgIGFib3J0IGFuZCByZXNldCByb3V0aW5lcy4KKyAqICAgICAgICAgIEFkZGVkIGNvbW1hbmQgbGluZSBvcHRpb25zIChlaDpbeXxuXSkgdG8gY2hvb3NlIGJldHdlZW4KKyAqICAgICAgICAgIG5ld19laF9jb2RlIGFuZCB0aGUgb2xkIHNjc2kgY29kZS4KKyAqICAgICAgICAgIElmIGxpbnV4IHZlcnNpb24gPj0gMi4xLjEwMSB0aGUgZGVmYXVsdCBpcyBlaDp5LCB3aGlsZSB0aGUgZWgKKyAqICAgICAgICAgIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBwcmV2aW91cyByZWxlYXNlcyBhbmQgdGhlIG9sZCBzY3NpIGNvZGUKKyAqICAgICAgICAgIGlzIHVzZWQuCisgKgorICogICAgICAxOCBBcHIgMTk5OCBSZXYuIDQuMjAgZm9yIGxpbnV4IDIuMC4zMyBhbmQgMi4xLjk3CisgKiAgICAgICAgICBSZXdvcmtlZCBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqCisgKiAgICAgIDExIEFwciAxOTk4IHJldi4gNC4wNSBmb3IgbGludXggMi4wLjMzIGFuZCAyLjEuOTUKKyAqICAgICAgICAgIE1ham9yIHJlbGlhYmlsaXR5IGltcHJvdmVtZW50OiB3aGVuIGEgYmF0Y2ggd2l0aCBvdmVybGFwcGluZworICogICAgICAgICAgcmVxdWVzdHMgaXMgZGV0ZWN0ZWQsIHJlcXVlc3RzIGFyZSBxdWV1ZWQgb25lIGF0IGEgdGltZQorICogICAgICAgICAgZWxpbWluYXRpbmcgYW55IHBvc3NpYmxlIGJvYXJkIG9yIGRyaXZlIHJlb3JkZXJpbmcuCisgKgorICogICAgICAxMCBBcHIgMTk5OCByZXYuIDQuMDQgZm9yIGxpbnV4IDIuMC4zMyBhbmQgMi4xLjk1CisgKiAgICAgICAgICBJbXByb3ZlZCBTTVAgc3VwcG9ydCAoaWYgbGludXggdmVyc2lvbiA+PSAyLjEuOTUpLgorICoKKyAqICAgICAgIDkgQXByIDE5OTggcmV2LiA0LjAzIGZvciBsaW51eCAyLjAuMzMgYW5kIDIuMS45NAorICogICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgbmV3IFBDSSBjb2RlIGFuZCBJTy1BUElDIHJlbWFwcGluZyBvZiBpcnFzLgorICogICAgICAgICAgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQ6IHdoZW4gc2VxdWVudGlhbCBpL28gaXMgZGV0ZWN0ZWQsCisgKiAgICAgICAgICBhbHdheXMgdXNlIGRpcmVjdCBzb3J0IGluc3RlYWQgb2YgcmV2ZXJzZSBzb3J0LgorICoKKyAqICAgICAgIDQgQXByIDE5OTggcmV2LiA0LjAyIGZvciBsaW51eCAyLjAuMzMgYW5kIDIuMS45MgorICogICAgICAgICAgaW9fcG9ydCBpcyBub3cgdW5zaWduZWQgbG9uZy4KKyAqCisgKiAgICAgIDE3IE1hciAxOTk4IHJldi4gNC4wMSBmb3IgbGludXggMi4wLjMzIGFuZCAyLjEuODgKKyAqICAgICAgICAgIFVzZSBuZXcgc2NzaSBlcnJvciBoYW5kbGluZyBjb2RlIChpZiBsaW51eCB2ZXJzaW9uID49IDIuMS44OCkuCisgKiAgICAgICAgICBVc2UgbmV3IGludGVycnVwdCBjb2RlLgorICoKKyAqICAgICAgMTIgU2VwIDE5OTcgcmV2LiAzLjExIGZvciBsaW51eCAyLjAuMzAgYW5kIDIuMS41NQorICogICAgICAgICAgVXNlIG9mIHVkZWxheSBpbnNpZGUgdGhlIHdhaXQgbG9vcHMgdG8gYXZvaWQgdGltZW91dAorICogICAgICAgICAgcHJvYmxlbXMgd2l0aCBmYXN0IGNwdXMuCisgKiAgICAgICAgICBSZW1vdmVkIGNoZWNrIGFib3V0IHVzZWxlc3MgY2FsbHMgdG8gdGhlIGludGVycnVwdCBzZXJ2aWNlCisgKiAgICAgICAgICByb3V0aW5lIChyZXBvcnRlZCBvbiBTTVAgc3lzdGVtcyBvbmx5KS4KKyAqICAgICAgICAgIEF0IGluaXRpYWxpemF0aW9uIHRpbWUgInNvcnRlZC91bnNvcnRlZCIgaXMgZGlzcGxheWVkIGluc3RlYWQKKyAqICAgICAgICAgIG9mICJsaW5rZWQvdW5saW5rZWQiIHRvIHJlaW5mb3JjZSB0aGUgZmFjdCB0aGF0ICJsaW5raW5nIiBpcworICogICAgICAgICAgbm90aGluZyBidXQgImVsZXZhdG9yIHNvcnRpbmciIGluIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uCisgKgorICogICAgICAxNyBNYXkgMTk5NyByZXYuIDMuMTAgZm9yIGxpbnV4IDIuMC4zMCBhbmQgMi4xLjM4CisgKiAgICAgICAgICBVc2Ugb2Ygc2VyaWFsX251bWJlcl9hdF90aW1lb3V0IGluIGFib3J0IGFuZCByZXNldCBwcm9jZXNzaW5nLgorICogICAgICAgICAgVXNlIG9mIHRoZSBfX2luaXRmdW5jIGFuZCBfX2luaXRkYXRhIG1hY3JvIGluIHNldHVwIGNvZGUuCisgKiAgICAgICAgICBNaW5vciBjbGVhbnVwcyBpbiB0aGUgbGlzdF9zdGF0aXN0aWNzIGNvZGUuCisgKiAgICAgICAgICBJbmNyZWFzZWQgY29udHJvbGxlciBidXN5IHRpbWVvdXQgaW4gb3JkZXIgdG8gYmV0dGVyIHN1cHBvcnQKKyAqICAgICAgICAgIHNsb3cgU0NTSSBkZXZpY2VzLgorICoKKyAqICAgICAgMjQgRmViIDE5OTcgcmV2LiAzLjAwIGZvciBsaW51eCAyLjAuMjkgYW5kIDIuMS4yNgorICogICAgICAgICAgV2hlbiBsb2FkaW5nIGFzIGEgbW9kdWxlLCBwYXJhbWV0ZXIgcGFzc2luZyBpcyBub3cgc3VwcG9ydGVkCisgKiAgICAgICAgICBib3RoIGluIDIuMCBhbmQgaW4gMi4xIHN0eWxlLgorICogICAgICAgICAgRml4ZWQgZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gZm9yIHNvbWUgU0NTSSBvcGNvZGVzLgorICogICAgICAgICAgSW1tZWRpYXRlIGFja25vd2xlZGdlIHRvIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZHMuCisgKiAgICAgICAgICBMaW5rZWQgY29tbWFuZHMgdG8gZWFjaCBkaXNrIGRldmljZSBhcmUgbm93IHJlb3JkZXJlZCBieSBlbGV2YXRvcgorICogICAgICAgICAgc29ydGluZy4gUmFyZSBjYXNlcyBpbiB3aGljaCByZW9yZGVyaW5nIG9mIHdyaXRlIHJlcXVlc3RzIGNvdWxkCisgKiAgICAgICAgICBjYXVzZSB3cm9uZyByZXN1bHRzIGFyZSBtYW5hZ2VkLgorICogICAgICAgICAgRml4ZWQgc3B1cmlvdXMgdGltZW91dHMgY2F1c2VkIGJ5IGxvbmcgc2ltcGxlIHF1ZXVlIHRhZyBzZXF1ZW5jZXMuCisgKiAgICAgICAgICBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbiAodG06WzAtM10pIHRvIGNob29zZSB0aGUgdHlwZSBvZiB0YWdzOgorICogICAgICAgICAgMCAtPiBtaXhlZCAoZGVmYXVsdCk7IDEgLT4gc2ltcGxlOyAyIC0+IGhlYWQ7IDMgLT4gb3JkZXJlZC4KKyAqCisgKiAgICAgIDE4IEphbiAxOTk3IHJldi4gMi42MCBmb3IgbGludXggMi4xLjIxIGFuZCAyLjAuMjgKKyAqICAgICAgICAgIEFkZGVkIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIGVuYWJsZS9kaXNhYmxlIGxpbmtlZCBjb21tYW5kcworICogICAgICAgICAgKGxjOlt5fG5dKSwgdGFnZ2VkIGNvbW1hbmRzICh0YzpbeXxuXSkgYW5kIHRvIHNldCB0aGUgbWF4IHF1ZXVlCisgKiAgICAgICAgICBkZXB0aCAobXE6eHgpLiBEZWZhdWx0IGlzICJlYXRhPWxjOm4sdGM6bixtcToxNiIuCisgKiAgICAgICAgICBJbXByb3ZlZCBjb21tYW5kIGxpbmtpbmcuCisgKiAgICAgICAgICBEb2N1bWVudGVkIGhvdyB0byBzZXR1cCBSQUlELTAgd2l0aCBEUFQgU21hcnRSQUlEIGJvYXJkcy4KKyAqCisgKiAgICAgICA4IEphbiAxOTk3IHJldi4gMi41MCBmb3IgbGludXggMi4xLjIwIGFuZCAyLjAuMjcKKyAqICAgICAgICAgIEFkZGVkIGxpbmtlZCBjb21tYW5kIHN1cHBvcnQuCisgKiAgICAgICAgICBJbXByb3ZlZCBkZXRlY3Rpb24gb2YgUENJIGJvYXJkcyB1c2luZyBJU0EgYmFzZSBhZGRyZXNzZXMuCisgKgorICogICAgICAgMyBEZWMgMTk5NiByZXYuIDIuNDAgZm9yIGxpbnV4IDIuMS4xNCBhbmQgMi4wLjI3CisgKiAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciB0YWdnZWQgY29tbWFuZHMgYW5kIHF1ZXVlIGRlcHRoIGFkanVzdG1lbnQuCisgKgorICogICAgICAyMiBOb3YgMTk5NiByZXYuIDIuMzAgZm9yIGxpbnV4IDIuMS4xMiBhbmQgMi4wLjI2CisgKiAgICAgICAgICBXaGVuIENPTkZJR19QQ0kgaXMgZGVmaW5lZCwgQklPUzMyIGlzIHVzZWQgdG8gaW5jbHVkZSBpbiB0aGUKKyAqICAgICAgICAgIGxpc3Qgb2YgaS9vIHBvcnRzIHRvIGJlIHByb2JlZCBhbGwgdGhlIFBDSSBTQ1NJIGNvbnRyb2xsZXJzLgorICogICAgICAgICAgVGhlIGxpc3Qgb2YgaS9vIHBvcnRzIHRvIGJlIHByb2JlZCBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCisgKiAgICAgICAgICAiZWF0YT1wb3J0MCxwb3J0MSwuLi4uIiBib290IGNvbW1hbmQgbGluZSBvcHRpb24uCisgKiAgICAgICAgICBTY2F0dGVyL2dhdGhlciBsaXN0cyBhcmUgbm93IGFsbG9jYXRlZCBieSBhIG51bWJlciBvZiBrbWFsbG9jCisgKiAgICAgICAgICBjYWxscywgaW4gb3JkZXIgdG8gYXZvaWQgdGhlIHByZXZpb3VzIHNpemUgbGltaXQgb2YgNjRLYi4KKyAqCisgKiAgICAgIDE2IE5vdiAxOTk2IHJldi4gMi4yMCBmb3IgbGludXggMi4xLjEwIGFuZCAyLjAuMjUKKyAqICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIEVBVEEgMi4wQywgUENJLCBtdWx0aWNoYW5uZWwgYW5kIHdpZGUgU0NTSS4KKyAqCisgKiAgICAgIDI3IFNlcCAxOTk2IHJldi4gMi4xMiBmb3IgbGludXggMi4xLjAKKyAqICAgICAgICAgIFBvcnRhYmlsaXR5IGNsZWFudXBzICh2aXJ0dWFsL2J1cyBhZGRyZXNzaW5nLCBsaXR0bGUvYmlnIGVuZGlhbgorICogICAgICAgICAgc3VwcG9ydCkuCisgKgorICogICAgICAwOSBKdWwgMTk5NiByZXYuIDIuMTEgZm9yIGxpbnV4IDIuMC40CisgKiAgICAgICAgICBOdW1iZXIgb2YgaW50ZXJuYWwgcmV0cmllcyBpcyBub3cgbGltaXRlZC4KKyAqCisgKiAgICAgIDE2IEFwciAxOTk2IHJldi4gMi4xMCBmb3IgbGludXggMS4zLjkwCisgKiAgICAgICAgICBOZXcgYXJndW1lbnQgInJlc2V0X2ZsYWdzIiB0byB0aGUgcmVzZXQgcm91dGluZS4KKyAqCisgKiAgICAgICA2IEp1bCAxOTk1IHJldi4gMi4wMSBmb3IgbGludXggMS4zLjcKKyAqICAgICAgICAgIFVwZGF0ZSByZXF1aXJlZCBieSB0aGUgbmV3IC9wcm9jL3Njc2kgc3VwcG9ydC4KKyAqCisgKiAgICAgIDExIE1hciAxOTk1IHJldi4gMi4wMCBmb3IgbGludXggMS4yLjAKKyAqICAgICAgICAgIEZpeGVkIGEgYnVnIHdoaWNoIHByZXZlbnRlZCBtZWRpYSBjaGFuZ2UgZGV0ZWN0aW9uIGZvciByZW1vdmFibGUKKyAqICAgICAgICAgIGRpc2sgZHJpdmVzLgorICoKKyAqICAgICAgMjMgRmViIDE5OTUgcmV2LiAxLjE4IGZvciBsaW51eCAxLjEuOTQKKyAqICAgICAgICAgIEFkZGVkIGEgY2hlY2sgZm9yIHNjc2lfcmVnaXN0ZXIgcmV0dXJuaW5nIE5VTEwuCisgKgorICogICAgICAxMSBGZWIgMTk5NSByZXYuIDEuMTcgZm9yIGxpbnV4IDEuMS45MQorICogICAgICAgICAgTm93IERFQlVHX1JFU0VUIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisgKiAgICAgICAgICBSZWdpc3RlciBhIGJvYXJkIGV2ZW4gaWYgaXQgZG9lcyBub3QgYXNzZXJ0IERNQSBwcm90b2NvbCBzdXBwb3J0CisgKiAgICAgICAgICAoRFBUIFNLMjAxMUIgZG9lcyBub3QgcmVwb3J0IGNvcnJlY3RseSB0aGUgZG1hc3VwIGJpdCkuCisgKgorICogICAgICAgOSBGZWIgMTk5NSByZXYuIDEuMTYgZm9yIGxpbnV4IDEuMS45MAorICogICAgICAgICAgVXNlIGhvc3QtPndpc2hfYmxvY2sgaW5zdGVhZCBvZiBob3N0LT5ibG9jay4KKyAqICAgICAgICAgIE5ldyBsaXN0IG9mIERhdGEgT3V0IFNDU0kgY29tbWFuZHMuCisgKgorICogICAgICAgOCBGZWIgMTk5NSByZXYuIDEuMTUgZm9yIGxpbnV4IDEuMS44OQorICogICAgICAgICAgQ2xlYXJlZCB0YXJnZXRfdGltZV9vdXQgY291bnRlciB3aGlsZSBwZXJmb3JtaW5nIGEgcmVzZXQuCisgKiAgICAgICAgICBBbGwgZXh0ZXJuYWwgc3ltYm9scyByZW5hbWVkIHRvIGF2b2lkIHBvc3NpYmxlIG5hbWUgY29uZmxpY3RzLgorICoKKyAqICAgICAgMjggSmFuIDE5OTUgcmV2LiAxLjE0IGZvciBsaW51eCAxLjEuODYKKyAqICAgICAgICAgIEFkZGVkIG1vZHVsZSBzdXBwb3J0LgorICogICAgICAgICAgTG9nIGFuZCBkbyBhIHJldHJ5IHdoZW4gYSBkaXNrIGRyaXZlIHJldHVybnMgYSB0YXJnZXQgc3RhdHVzCisgKiAgICAgICAgICBkaWZmZXJlbnQgZnJvbSB6ZXJvIG9uIGEgcmVjb3ZlcmVkIGVycm9yLgorICoKKyAqICAgICAgMjQgSmFuIDE5OTUgcmV2LiAxLjEzIGZvciBsaW51eCAxLjEuODUKKyAqICAgICAgICAgIFVzZSBvcHRpbWl6ZWQgYm9hcmQgY29uZmlndXJhdGlvbiwgd2l0aCBhIG1lYXN1cmVkIHBlcmZvcm1hbmNlCisgKiAgICAgICAgICBpbmNyZWFzZSBpbiB0aGUgcmFuZ2UgMTAlLTIwJSBvbiBpL28gdGhyb3VnaHB1dC4KKyAqCisgKiAgICAgIDE2IEphbiAxOTk1IHJldi4gMS4xMiBmb3IgbGludXggMS4xLjgxCisgKiAgICAgICAgICBGaXggbXNjcCBzdHJ1Y3R1cmUgY29tbWVudHMgKG5vIGZ1bmN0aW9uYWwgY2hhbmdlKS4KKyAqICAgICAgICAgIERpc3BsYXkgYSBtZXNzYWdlIGlmIGNoZWNrX3JlZ2lvbiBkZXRlY3RzIGEgcG9ydCBhZGRyZXNzCisgKiAgICAgICAgICBhbHJlYWR5IGluIHVzZS4KKyAqCisgKiAgICAgIDE3IERlYyAxOTk0IHJldi4gMS4xMSBmb3IgbGludXggMS4xLjc0CisgKiAgICAgICAgICBVc2UgdGhlIHNjc2ljYW1fYmlvc19wYXJhbSByb3V0aW5lLiBUaGlzIGFsbG93cyBhbiBlYXN5CisgKiAgICAgICAgICBtaWdyYXRpb24gcGF0aCBmcm9tIGRpc2sgcGFydGl0aW9uIHRhYmxlcyBjcmVhdGVkIHVzaW5nCisgKiAgICAgICAgICBkaWZmZXJlbnQgU0NTSSBkcml2ZXJzIGFuZCBub24gb3B0aW1hbCBkaXNrIGdlb21ldHJ5LgorICoKKyAqICAgICAgMTUgRGVjIDE5OTQgcmV2LiAxLjEwIGZvciBsaW51eCAxLjEuNzQKKyAqICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIElTQSBFQVRBIGJvYXJkcyAoRFBUIFBNMjAxMSwgRFBUIFBNMjAyMSkuCisgKiAgICAgICAgICBUaGUgaG9zdC0+YmxvY2sgZmxhZyBpcyBzZXQgZm9yIGFsbCB0aGUgZGV0ZWN0ZWQgSVNBIGJvYXJkcy4KKyAqICAgICAgICAgIFRoZSBkZXRlY3Qgcm91dGluZSBubyBsb25nZXIgZW5mb3JjZXMgTEVWRUwgdHJpZ2dlcmluZworICogICAgICAgICAgZm9yIEVJU0EgYm9hcmRzLCBpdCBqdXN0IHByaW50cyBhIHdhcm5pbmcgbWVzc2FnZS4KKyAqCisgKiAgICAgIDMwIE5vdiAxOTk0IHJldi4gMS4wOSBmb3IgbGludXggMS4xLjY4CisgKiAgICAgICAgICBSZWRvIGkvbyBvbiB0YXJnZXQgc3RhdHVzIENIRUNLX0NPTkRJVElPTiBmb3IgVFlQRV9ESVNLIG9ubHkuCisgKiAgICAgICAgICBBZGRlZCBvcHRpb25hbCBzdXBwb3J0IGZvciB1c2luZyBhIHNpbmdsZSBib2FyZCBhdCBhIHRpbWUuCisgKgorICogICAgICAxOCBOb3YgMTk5NCByZXYuIDEuMDggZm9yIGxpbnV4IDEuMS42NAorICogICAgICAgICAgRm9yY2VzIHNnX3RhYmxlc2l6ZSA9IDY0IGFuZCBjYW5fcXVldWUgPSA2NCBpZiB0aGVzZQorICogICAgICAgICAgdmFsdWVzIGFyZSBub3QgY29ycmVjdGx5IGRldGVjdGVkIChEUFQgUE0yMDEyKS4KKyAqCisgKiAgICAgIDE0IE5vdiAxOTk0IHJldi4gMS4wNyBmb3IgbGludXggMS4xLjYzICBGaW5hbCBCRVRBIHJlbGVhc2UuCisgKiAgICAgIDA0IEF1ZyAxOTk0IHJldi4gMS4wMCBmb3IgbGludXggMS4xLjM5ICBGaXJzdCBCRVRBIHJlbGVhc2UuCisgKgorICoKKyAqICAgICAgICAgIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHRoZSBDQU0gKENvbW1vbiBBY2Nlc3MgTWV0aG9kIENvbW1pdHRlZSkKKyAqICAgICAgICAgIEVBVEEgKEVuaGFuY2VkIEFUIEJ1cyBBdHRhY2htZW50KSByZXYuIDIuMEEsIHVzaW5nIERNQSBwcm90b2NvbC4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk0LTIwMDMgRGFyaW8gQmFsbGFiaW8gKGJhbGxhYmlvX2RhcmlvQGVtYy5jb20pCisgKgorICogIEFsdGVybmF0ZSBlbWFpbDogZGFyaW8uYmFsbGFiaW9AaW53aW5kLml0LCBkYXJpby5iYWxsYWJpb0B0aXNjYWxpbmV0Lml0CisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UKKyAqICBjb2RlIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBjb21tZW50IHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24uCisgKgorICovCisKKy8qCisgKgorICogIEhlcmUgaXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgRFBUIFNDU0kgaG9zdCBhZGFwdGVycy4KKyAqICBBbGwgdGhlc2UgYm9hcmRzIHByb3ZpZGUgYW4gRUFUQS9ETUEgY29tcGF0aWJsZSBwcm9ncmFtbWluZyBpbnRlcmZhY2UKKyAqICBhbmQgYXJlIGZ1bGx5IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciBpbiBhbnkgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nCisgKiAgbXVsdGlwbGUgU0NTSSBjaGFubmVsczoKKyAqCisgKiAgUE0yMDExQi85WCAtICBFbnRyeSBMZXZlbCBJU0EKKyAqICBQTTIwMjFBLzlYIC0gIEhpZ2ggUGVyZm9ybWFuY2UgSVNBCisgKiAgUE0yMDEyQSAgICAgICBPbGQgRUlTQQorICogIFBNMjAxMkIgICAgICAgT2xkIEVJU0EKKyAqICBQTTIwMjJBLzlYIC0gIEVudHJ5IExldmVsIEVJU0EKKyAqICBQTTIxMjJBLzlYIC0gIEhpZ2ggUGVyZm9ybWFuY2UgRUlTQQorICogIFBNMjMyMkEvOVggLSAgRXh0cmEgSGlnaCBQZXJmb3JtYW5jZSBFSVNBCisgKiAgUE0zMDIxICAgICAtICBTbWFydFJBSUQgQWRhcHRlciBmb3IgSVNBCisgKiAgUE0zMjIyICAgICAtICBTbWFydFJBSUQgQWRhcHRlciBmb3IgRUlTQSAoUE0zMjIyVyBpcyAxNi1iaXQgd2lkZSBTQ1NJKQorICogIFBNMzIyNCAgICAgLSAgU21hcnRSQUlEIEFkYXB0ZXIgZm9yIFBDSSAgKFBNMzIyNFcgaXMgMTYtYml0IHdpZGUgU0NTSSkKKyAqICBQTTMzMzQwVVcgIC0gIFNtYXJ0UkFJRCBBZGFwdGVyIGZvciBQQ0kgIHVsdHJhIHdpZGUgbXVsdGljaGFubmVsCisgKgorICogIFRoZSBhYm92ZSBsaXN0IGlzIGp1c3QgYW4gaW5kaWNhdGlvbjogYXMgYSBtYXR0ZXIgb2YgZmFjdCBhbGwgRFBUCisgKiAgYm9hcmRzIHVzaW5nIHRoZSBFQVRBL0RNQSBwcm90b2NvbCBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLAorICogIHNpbmNlIHRoZXkgdXNlIGV4YWN0ZWx5IHRoZSBzYW1lIHByb2dyYW1taW5nIGludGVyZmFjZS4KKyAqCisgKiAgVGhlIERQVCBQTTIwMDEgcHJvdmlkZXMgb25seSB0aGUgRUFUQS9QSU8gaW50ZXJmYWNlIGFuZCBoZW5jZSBpcyBub3QKKyAqICBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuCisgKgorICogIFRoaXMgY29kZSBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCB1cCB0byAzIERpc3RyaWJ1dGVkIFByb2Nlc3NpbmcgVGVjaG5vbG9neQorICogIFBNMjEyMkEvOVggKERQVCBTQ1NJIEJJT1MgdjAwMi5EMSwgZmlybXdhcmUgdjA1RS4wKSBFSVNBIGNvbnRyb2xsZXJzLAorICogIGluIGFueSBjb21iaW5hdGlvbiBvZiBwcml2YXRlIGFuZCBzaGFyZWQgSVJRLgorICogIFBDSSBzdXBwb3J0IGhhcyBiZWVuIHRlc3RlZCB1c2luZyB1cCB0byAyIERQVCBQTTMyMjRXIChEUFQgU0NTSSBCSU9TCisgKiAgdjAwMy5EMCwgZmlybXdhcmUgdjA3Ry4wKS4KKyAqCisgKiAgRFBUIFNtYXJ0UkFJRCBib2FyZHMgc3VwcG9ydCAiSGFyZHdhcmUgQXJyYXkiIC0gYSBncm91cCBvZiBkaXNrIGRyaXZlcworICogIHdoaWNoIGFyZSBhbGwgbWVtYmVycyBvZiB0aGUgc2FtZSBSQUlELTAsIFJBSUQtMSBvciBSQUlELTUgYXJyYXkgaW1wbGVtZW50ZWQKKyAqICBpbiBob3N0IGFkYXB0ZXIgaGFyZHdhcmUuIEhhcmR3YXJlIEFycmF5cyBhcmUgZnVsbHkgY29tcGF0aWJsZSB3aXRoIHRoaXMKKyAqICBkcml2ZXIsIHNpbmNlIHRoZXkgbG9vayB0byBpdCBhcyBhIHNpbmdsZSBkaXNrIGRyaXZlLgorICoKKyAqICBXQVJOSU5HOiB0byBjcmVhdGUgYSBSQUlELTAgIkhhcmR3YXJlIEFycmF5IiB5b3UgbXVzdCBzZWxlY3QgIk90aGVyIFVuaXgiCisgKiAgYXMgdGhlIGN1cnJlbnQgT1MgaW4gdGhlIERQVE1HUiAiSW5pdGlhbCBTeXN0ZW0gSW5zdGFsbGF0aW9uIiBtZW51LgorICogIE90aGVyd2lzZSBSQUlELTAgaXMgZ2VuZXJhdGVkIGFzIGFuICJBcnJheSBHcm91cCIgKGkuZS4gc29mdHdhcmUgUkFJRC0wKSwKKyAqICB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBhY3R1YWwgU0NTSSBzdWJzeXN0ZW0uCisgKiAgVG8gZ2V0IHRoZSAiQXJyYXkgR3JvdXAiIGZ1bmN0aW9uYWxpdHksIHRoZSBMaW51eCBNRCBkcml2ZXIgbXVzdCBiZSB1c2VkCisgKiAgaW5zdGVhZCBvZiB0aGUgRFBUICJBcnJheSBHcm91cCIgZmVhdHVyZS4KKyAqCisgKiAgTXVsdGlwbGUgSVNBLCBFSVNBIGFuZCBQQ0kgYm9hcmRzIGNhbiBiZSBjb25maWd1cmVkIGluIHRoZSBzYW1lIHN5c3RlbS4KKyAqICBJdCBpcyBzdWdnZXN0ZWQgdG8gcHV0IGFsbCB0aGUgRUlTQSBib2FyZHMgb24gdGhlIHNhbWUgSVJRIGxldmVsLCBhbGwKKyAqICB0aGUgUENJICBib2FyZHMgb24gYW5vdGhlciBJUlEgbGV2ZWwsIHdoaWxlIElTQSBib2FyZHMgY2Fubm90IHNoYXJlCisgKiAgaW50ZXJydXB0cy4KKyAqCisgKiAgSWYgeW91IGNvbmZpZ3VyZSBtdWx0aXBsZSBib2FyZHMgb24gdGhlIHNhbWUgSVJRLCB0aGUgaW50ZXJydXB0IG11c3QKKyAqICBiZSBfbGV2ZWxfIHRyaWdnZXJlZCAobm90IF9lZGdlXyB0cmlnZ2VyZWQpLgorICoKKyAqICBUaGlzIGRyaXZlciBkZXRlY3RzIEVBVEEgYm9hcmRzIGJ5IHByb2JlcyBhdCBmaXhlZCBwb3J0IGFkZHJlc3NlcywKKyAqICBzbyBubyBCSU9TMzIgb3IgUENJIEJJT1Mgc3VwcG9ydCBpcyByZXF1aXJlZC4KKyAqICBUaGUgc3VnZ2VzdGVkIHdheSB0byBkZXRlY3QgYSBnZW5lcmljIEVBVEEgUENJIGJvYXJkIGlzIHRvIGZvcmNlIG9uIGl0CisgKiAgYW55IHVudXNlZCBFSVNBIGFkZHJlc3MsIGV2ZW4gaWYgdGhlcmUgYXJlIG90aGVyIGNvbnRyb2xsZXJzIG9uIHRoZSBFSVNBCisgKiAgYnVzLCBvciBldmVuIGlmIHlvdSBzeXN0ZW0gaGFzIG5vIEVJU0EgYnVzIGF0IGFsbC4KKyAqICBEbyBub3QgZm9yY2UgYW55IElTQSBhZGRyZXNzIG9uIEVBVEEgUENJIGJvYXJkcy4KKyAqCisgKiAgSWYgUENJIGJpb3Mgc3VwcG9ydCBpcyBjb25maWd1cmVkIGludG8gdGhlIGtlcm5lbCwgQklPUzMyIGlzIHVzZWQgdG8KKyAqICBpbmNsdWRlIGluIHRoZSBsaXN0IG9mIGkvbyBwb3J0cyB0byBiZSBwcm9iZWQgYWxsIHRoZSBQQ0kgU0NTSSBjb250cm9sbGVycy4KKyAqCisgKiAgRHVlIHRvIGEgRFBUIEJJT1MgImZlYXR1cmUiLCBpdCBtaWdodCBub3QgYmUgcG9zc2libGUgdG8gZm9yY2UgYW4gRUlTQQorICogIGFkZHJlc3Mgb24gbW9yZSB0aGFuIGEgc2luZ2xlIERQVCBQQ0kgYm9hcmQsIHNvIGluIHRoaXMgY2FzZSB5b3UgaGF2ZSB0bworICogIGxldCB0aGUgUENJIEJJT1MgYXNzaWduIHRoZSBhZGRyZXNzZXMuCisgKgorICogIFRoZSBzZXF1ZW5jZSBvZiBkZXRlY3Rpb24gcHJvYmVzIGlzOgorICoKKyAqICAtIElTQSAweDFGMDsKKyAqICAtIFBDSSBTQ1NJIGNvbnRyb2xsZXJzIChvbmx5IGlmIEJJT1MzMiBpcyBhdmFpbGFibGUpOworICogIC0gRUlTQS9QQ0kgMHgxQzg4IHRocm91Z2ggMHhGQzg4IChjb3JyZXNwb25kaW5nIHRvIEVJU0Egc2xvdHMgMSB0byAxNSk7CisgKiAgLSBJU0EgIDB4MTcwLCAweDIzMCwgMHgzMzAuCisgKgorICogIFRoZSBhYm92ZSBsaXN0IG9mIGRldGVjdGlvbiBwcm9iZXMgY2FuIGJlIHRvdGFsbHkgcmVwbGFjZWQgYnkgdGhlCisgKiAgYm9vdCBjb21tYW5kIGxpbmUgb3B0aW9uOiAiZWF0YT1wb3J0MCxwb3J0MSxwb3J0MiwuLi4iLCB3aGVyZSB0aGUKKyAqICBwb3J0MCwgcG9ydDEuLi4gYXJndW1lbnRzIGFyZSBJU0EvRUlTQS9QQ0kgYWRkcmVzc2VzIHRvIGJlIHByb2JlZC4KKyAqICBGb3IgZXhhbXBsZSB1c2luZyAiZWF0YT0weDc0MTAsMHg3NDUwLDB4MjMwIiwgdGhlIGRyaXZlciBwcm9iZXMKKyAqICBvbmx5IHRoZSB0d28gUENJIGFkZHJlc3NlcyAweDc0MTAgYW5kIDB4NzQ1MCBhbmQgdGhlIElTQSBhZGRyZXNzIDB4MjMwLAorICogIGluIHRoaXMgb3JkZXI7ICJlYXRhPTAiIHRvdGFsbHkgZGlzYWJsZXMgdGhpcyBkcml2ZXIuCisgKgorICogIEFmdGVyIHRoZSBvcHRpb25hbCBsaXN0IG9mIGRldGVjdGlvbiBwcm9iZXMsIG90aGVyIHBvc3NpYmxlIGNvbW1hbmQgbGluZQorICogIG9wdGlvbnMgYXJlOgorICoKKyAqICBldDp5ICBmb3JjZSB1c2Ugb2YgZXh0ZW5kZWQgdHJhbnNsYXRpb24gKDI1NSBoZWFkcywgNjMgc2VjdG9ycyk7CisgKiAgZXQ6biAgdXNlIGRpc2sgZ2VvbWV0cnkgZGV0ZWN0ZWQgYnkgc2NzaWNhbV9iaW9zX3BhcmFtOworICogIHJzOnkgIHJldmVyc2Ugc2NhbiBvcmRlciB3aGlsZSBkZXRlY3RpbmcgUENJIGJvYXJkczsKKyAqICByczpuICB1c2UgQklPUyBvcmRlciB3aGlsZSBkZXRlY3RpbmcgUENJIGJvYXJkczsKKyAqICBsYzp5ICBlbmFibGVzIGxpbmtlZCBjb21tYW5kczsKKyAqICBsYzpuICBkaXNhYmxlcyBsaW5rZWQgY29tbWFuZHM7CisgKiAgdG06MCAgZGlzYWJsZXMgdGFnZ2VkIGNvbW1hbmRzIChzYW1lIGFzIHRjOm4pOworICogIHRtOjEgIHVzZSBzaW1wbGUgcXVldWUgdGFncyAoc2FtZSBhcyB0Yzp5KTsKKyAqICB0bToyICB1c2Ugb3JkZXJlZCBxdWV1ZSB0YWdzIChzYW1lIGFzIHRjOjIpOworICogIG1xOnh4IHNldCB0aGUgbWF4IHF1ZXVlIGRlcHRoIHRvIHRoZSB2YWx1ZSB4eCAoMiA8PSB4eCA8PSAzMikuCisgKgorICogIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiAiZWF0YT1sYzpuLG1xOjE2LHRtOjAsZXQ6bixyczpuIi4KKyAqICBBbiBleGFtcGxlIHVzaW5nIHRoZSBsaXN0IG9mIGRldGVjdGlvbiBwcm9iZXMgY291bGQgYmU6CisgKiAgImVhdGE9MHg3NDEwLDB4MjMwLGxjOnksdG06MixtcTo0LGV0Om4iLgorICoKKyAqICBXaGVuIGxvYWRpbmcgYXMgYSBtb2R1bGUsIHBhcmFtZXRlcnMgY2FuIGJlIHNwZWNpZmllZCBhcyB3ZWxsLgorICogIFRoZSBhYm92ZSBleGFtcGxlIHdvdWxkIGJlICh1c2UgMSBpbiBwbGFjZSBvZiB5IGFuZCAwIGluIHBsYWNlIG9mIG4pOgorICoKKyAqICBtb2Rwcm9iZSBlYXRhIGlvX3BvcnQ9MHg3NDEwLDB4MjMwIGxpbmtlZF9jb21tPTEgXAorICogICAgICAgICAgICAgICAgbWF4X3F1ZXVlX2RlcHRoPTQgZXh0X3RyYW49MCB0YWdfbW9kZT0yIFwKKyAqICAgICAgICAgICAgICAgIHJldl9zY2FuPTEKKyAqCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIGxpbmtlZCBjb21tYW5kcyBhcmUgZGVzaWduZWQgdG8gd29yayB3aXRoIGFueSBESVNLCisgKiAgb3IgQ0QtUk9NLCBzaW5jZSB0aGlzIGxpbmtpbmcgaGFzIG9ubHkgdGhlIGludGVudCBvZiBjbHVzdGVyaW5nICh0aW1lLXdpc2UpCisgKiAgYW5kIHJlb3JkZXJpbmcgYnkgZWxldmF0b3Igc29ydGluZyBjb21tYW5kcyBkaXJlY3RlZCB0byBlYWNoIGRldmljZSwKKyAqICB3aXRob3V0IGFueSByZWxhdGlvbiB3aXRoIHRoZSBhY3R1YWwgU0NTSSBwcm90b2NvbCBiZXR3ZWVuIHRoZSBjb250cm9sbGVyCisgKiAgYW5kIHRoZSBkZXZpY2UuCisgKiAgSWYgUSBpcyB0aGUgcXVldWUgZGVwdGggcmVwb3J0ZWQgYXQgYm9vdCB0aW1lIGZvciBlYWNoIGRldmljZSAoYWxzbyBuYW1lZAorICogIGNtZHMvbHVuKSBhbmQgUSA+IDIsIHdoZW5ldmVyIHRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aXZlIGNvbW1hbmQgdG8gdGhlCisgKiAgZGV2aWNlIGFsbCBvdGhlciBjb21tYW5kcyB0byB0aGUgc2FtZSBkZXZpY2UgICh1cCB0byBRLTEpIGFyZSBrZXB0IHdhaXRpbmcKKyAqICBpbiB0aGUgZWxldmF0b3Igc29ydGluZyBxdWV1ZS4gV2hlbiB0aGUgYWN0aXZlIGNvbW1hbmQgY29tcGxldGVzLCB0aGUKKyAqICBjb21tYW5kcyBpbiB0aGlzIHF1ZXVlIGFyZSBzb3J0ZWQgYnkgc2VjdG9yIGFkZHJlc3MuIFRoZSBzb3J0IGlzIGNob3NlbgorICogIGJldHdlZW4gaW5jcmVhc2luZyBvciBkZWNyZWFzaW5nIGJ5IG1pbmltaXppbmcgdGhlIHNlZWsgZGlzdGFuY2UgYmV0d2VlbgorICogIHRoZSBzZWN0b3Igb2YgdGhlIGNvbW1hbmRzIGp1c3QgY29tcGxldGVkIGFuZCB0aGUgc2VjdG9yIG9mIHRoZSBmaXJzdAorICogIGNvbW1hbmQgaW4gdGhlIGxpc3QgdG8gYmUgc29ydGVkLgorICogIFRyaXZpYWwgbWF0aCBhc3N1cmVzIHRoYXQgdGhlIHVuc29ydGVkIGF2ZXJhZ2Ugc2VlayBkaXN0YW5jZSB3aGVuIGRvaW5nCisgKiAgcmFuZG9tIHNlZWtzIG92ZXIgUyBzZWN0b3JzIGlzIFMvMy4KKyAqICBXaGVuIChRLTEpIHJlcXVlc3RzIGFyZSB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgb3ZlciBTIHNlY3RvcnMsIHRoZSBhdmVyYWdlCisgKiAgZGlzdGFuY2UgYmV0d2VlbiB0d28gYWRqYWNlbnQgcmVxdWVzdHMgaXMgUy8oKFEtMSkgKyAxKSwgc28gdGhlIHNvcnRlZAorICogIGF2ZXJhZ2Ugc2VlayBkaXN0YW5jZSBmb3IgKFEtMSkgcmFuZG9tIHJlcXVlc3RzIG92ZXIgUyBzZWN0b3JzIGlzIFMvUS4KKyAqICBUaGUgZWxldmF0b3Igc29ydGluZyBoZW5jZSBkaXZpZGVzIHRoZSBzZWVrIGRpc3RhbmNlIGJ5IGEgZmFjdG9yIFEvMy4KKyAqICBUaGUgYWJvdmUgcHVyZSBnZW9tZXRyaWMgcmVtYXJrcyBhcmUgdmFsaWQgaW4gYWxsIGNhc2VzIGFuZCB0aGUKKyAqICBkcml2ZXIgZWZmZWN0aXZlbHkgcmVkdWNlcyB0aGUgc2VlayBkaXN0YW5jZSBieSB0aGUgcHJlZGljdGVkIGZhY3RvcgorICogIHdoZW4gdGhlcmUgYXJlIFEgY29uY3VycmVudCByZWFkIGkvbyBvcGVyYXRpb25zIG9uIHRoZSBkZXZpY2UsIGJ1dCB0aGlzCisgKiAgZG9lcyBub3QgbmVjZXNzYXJpbHkgcmVzdWx0cyBpbiBhIG5vdGljZWFibGUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQ6CisgKiAgeW91ciBtaWxlYWdlIG1heSB2YXJ5Li4uLgorICoKKyAqICBOb3RlOiBjb21tYW5kIHJlb3JkZXJpbmcgaW5zaWRlIGEgYmF0Y2ggb2YgcXVldWVkIGNvbW1hbmRzIGNvdWxkIGNhdXNlCisgKiAgICAgICAgd3JvbmcgcmVzdWx0cyBvbmx5IGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB3cml0ZSByZXF1ZXN0IGFuZCB0aGUKKyAqICAgICAgICBpbnRlcnNlY3Rpb24gKHNlY3Rvci13aXNlKSBvZiBhbGwgcmVxdWVzdHMgaXMgbm90IGVtcHR5LgorICogICAgICAgIFdoZW4gdGhlIGRyaXZlciBkZXRlY3RzIGEgYmF0Y2ggaW5jbHVkaW5nIG92ZXJsYXBwaW5nIHJlcXVlc3RzCisgKiAgICAgICAgKGEgcmVhbGx5IHJhcmUgZXZlbnQpIHN0cmljdCBzZXJpYWwgKHBpZCkgb3JkZXIgaXMgZW5mb3JjZWQuCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFRoZSBleHRlbmRlZCB0cmFuc2xhdGlvbiBvcHRpb24gKGV0OnkpIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIGxhcmdlIHBoeXNpY2FsCisgKiAgZGlza3MvYXJyYXlzLiBJdCBjb3VsZCBhbHNvIGJlIHVzZWZ1bCB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIEFkYXB0ZWMgYm9hcmRzCisgKiAgYW5kIERQVCBib2FyZHMgd2l0aG91dCByZWZvcm1hdHRpbmcgdGhlIGRpc2suCisgKiAgV2hlbiBhIGJvb3QgZGlzayBpcyBwYXJ0aXRpb25lZCB3aXRoIGV4dGVuZGVkIHRyYW5zbGF0aW9uLCBpbiBvcmRlciB0bworICogIGJlIGFibGUgdG8gYm9vdCBpdCB3aXRoIGEgRFBUIGJvYXJkIGlzIGNvdWxkIGJlIG5lY2Vzc2FyeSB0byBhZGQgdG8KKyAqICBsaWxvLmNvbmYgYWRkaXRpb25hbCBjb21tYW5kcyBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisgKgorICogIGZpeC10YWJsZQorICogIGRpc2s9L2Rldi9zZGEgYmlvcz0weDgwIHNlY3RvcnM9NjMgaGVhZHM9MTI4IGN5bGluZHJlcz01NDYKKyAqCisgKiAgd2hlcmUgdGhlIGFib3ZlIGdlb21ldHJ5IHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSBvbmUgcmVwb3J0ZWQgYXQKKyAqICBwb3dlciB1cCBieSB0aGUgRFBUIGNvbnRyb2xsZXIuCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBUaGUgYm9hcmRzIGFyZSBuYW1lZCBFQVRBMCwgRUFUQTEsLi4uIGFjY29yZGluZyB0byB0aGUgZGV0ZWN0aW9uIG9yZGVyLgorICoKKyAqICBJbiBvcmRlciB0byBzdXBwb3J0IG11bHRpcGxlIElTQSBib2FyZHMgaW4gYSByZWxpYWJsZSB3YXksCisgKiAgdGhlIGRyaXZlciBzZXRzIGhvc3QtPndpc2hfYmxvY2sgPSAxIGZvciBhbGwgSVNBIGJvYXJkcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKworc3RhdGljIGludCBlYXRhMnhfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKik7CitzdGF0aWMgaW50IGVhdGEyeF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgaW50IGVhdGEyeF9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqLAorCQkJICAgICAgIHZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSk7CitzdGF0aWMgaW50IGVhdGEyeF9laF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIGludCBlYXRhMnhfZWhfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIGludCBlYXRhMnhfYmlvc19wYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLAorCQkJICAgICBzZWN0b3JfdCwgaW50ICopOworc3RhdGljIGludCBlYXRhMnhfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqKTsKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5uYW1lID0gIkVBVEEvRE1BIDIuMHggcmV2LiA4LjEwLjAwICIsCisJLmRldGVjdCA9IGVhdGEyeF9kZXRlY3QsCisJLnJlbGVhc2UgPSBlYXRhMnhfcmVsZWFzZSwKKwkucXVldWVjb21tYW5kID0gZWF0YTJ4X3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlciA9IGVhdGEyeF9laF9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBOVUxMLAorCS5laF9idXNfcmVzZXRfaGFuZGxlciA9IE5VTEwsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlciA9IGVhdGEyeF9laF9ob3N0X3Jlc2V0LAorCS5iaW9zX3BhcmFtID0gZWF0YTJ4X2Jpb3NfcGFyYW0sCisJLnNsYXZlX2NvbmZpZ3VyZSA9IGVhdGEyeF9zbGF2ZV9jb25maWd1cmUsCisJLnRoaXNfaWQgPSA3LAorCS51bmNoZWNrZWRfaXNhX2RtYSA9IDEsCisJLnVzZV9jbHVzdGVyaW5nID0gRU5BQkxFX0NMVVNURVJJTkcKK307CisKKyNpZiAhZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpICYmICFkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKyNlcnJvciAiQWRqdXN0IHlvdXIgPGFzbS9ieXRlb3JkZXIuaD4gZGVmaW5lcyIKKyNlbmRpZgorCisvKiBTdWJ2ZXJzaW9uIHZhbHVlcyAqLworI2RlZmluZSBJU0EgIDAKKyNkZWZpbmUgRVNBIDEKKworI3VuZGVmICBGT1JDRV9DT05GSUcKKworI3VuZGVmICBERUJVR19MSU5LRURfQ09NTUFORFMKKyN1bmRlZiAgREVCVUdfREVURUNUCisjdW5kZWYgIERFQlVHX1BDSV9ERVRFQ1QKKyN1bmRlZiAgREVCVUdfSU5URVJSVVBUCisjdW5kZWYgIERFQlVHX1JFU0VUCisjdW5kZWYgIERFQlVHX0dFTkVSQVRFX0VSUk9SUworI3VuZGVmICBERUJVR19HRU5FUkFURV9BQk9SVFMKKyN1bmRlZiAgREVCVUdfR0VPTUVUUlkKKworI2RlZmluZSBNQVhfSVNBIDQKKyNkZWZpbmUgTUFYX1ZFU0EgMAorI2RlZmluZSBNQVhfRUlTQSAxNQorI2RlZmluZSBNQVhfUENJIDE2CisjZGVmaW5lIE1BWF9CT0FSRFMgKE1BWF9JU0EgKyBNQVhfVkVTQSArIE1BWF9FSVNBICsgTUFYX1BDSSkKKyNkZWZpbmUgTUFYX0NIQU5ORUwgNAorI2RlZmluZSBNQVhfTFVOIDMyCisjZGVmaW5lIE1BWF9UQVJHRVQgMzIKKyNkZWZpbmUgTUFYX01BSUxCT1hFUyA2NAorI2RlZmluZSBNQVhfU0dMSVNUIDY0CisjZGVmaW5lIE1BWF9MQVJHRV9TR0xJU1QgMTIyCisjZGVmaW5lIE1BWF9JTlRFUk5BTF9SRVRSSUVTIDY0CisjZGVmaW5lIE1BWF9DTURfUEVSX0xVTiAyCisjZGVmaW5lIE1BWF9UQUdHRURfQ01EX1BFUl9MVU4gKE1BWF9NQUlMQk9YRVMgLSBNQVhfQ01EX1BFUl9MVU4pCisKKyNkZWZpbmUgU0tJUCBVTE9OR19NQVgKKyNkZWZpbmUgRlJFRSAwCisjZGVmaW5lIElOX1VTRSAgIDEKKyNkZWZpbmUgTE9DS0VEICAgMgorI2RlZmluZSBJTl9SRVNFVCAzCisjZGVmaW5lIElHTk9SRSAgIDQKKyNkZWZpbmUgUkVBRFkgICAgNQorI2RlZmluZSBBQk9SVElORyA2CisjZGVmaW5lIE5PX0RNQSAgMHhmZgorI2RlZmluZSBNQVhMT09QICAxMDAwMAorI2RlZmluZSBUQUdfRElTQUJMRUQgMAorI2RlZmluZSBUQUdfU0lNUExFICAgMQorI2RlZmluZSBUQUdfT1JERVJFRCAgMgorCisjZGVmaW5lIFJFR19DTUQgICAgICAgICA3CisjZGVmaW5lIFJFR19TVEFUVVMgICAgICA3CisjZGVmaW5lIFJFR19BVVhfU1RBVFVTICA4CisjZGVmaW5lIFJFR19EQVRBICAgICAgICAwCisjZGVmaW5lIFJFR19EQVRBMiAgICAgICAxCisjZGVmaW5lIFJFR19TRUUgICAgICAgICA2CisjZGVmaW5lIFJFR19MT1cgICAgICAgICAyCisjZGVmaW5lIFJFR19MTSAgICAgICAgICAzCisjZGVmaW5lIFJFR19NSUQgICAgICAgICA0CisjZGVmaW5lIFJFR19NU0IgICAgICAgICA1CisjZGVmaW5lIFJFR0lPTl9TSVpFICAgICA5VUwKKyNkZWZpbmUgTUFYX0lTQV9BRERSICAgIDB4MDNmZgorI2RlZmluZSBNSU5fRUlTQV9BRERSICAgMHgxYzg4CisjZGVmaW5lIE1BWF9FSVNBX0FERFIgICAweGZjODgKKyNkZWZpbmUgQlNZX0FTU0VSVEVEICAgICAgMHg4MAorI2RlZmluZSBEUlFfQVNTRVJURUQgICAgICAweDA4CisjZGVmaW5lIEFCU1lfQVNTRVJURUQgICAgIDB4MDEKKyNkZWZpbmUgSVJRX0FTU0VSVEVEICAgICAgMHgwMgorI2RlZmluZSBSRUFEX0NPTkZJR19QSU8gICAweGYwCisjZGVmaW5lIFNFVF9DT05GSUdfUElPICAgIDB4ZjEKKyNkZWZpbmUgU0VORF9DUF9QSU8gICAgICAgMHhmMgorI2RlZmluZSBSRUNFSVZFX1NQX1BJTyAgICAweGYzCisjZGVmaW5lIFRSVU5DQVRFX1hGUl9QSU8gIDB4ZjQKKyNkZWZpbmUgUkVTRVRfUElPICAgICAgICAgMHhmOQorI2RlZmluZSBSRUFEX0NPTkZJR19ETUEgICAweGZkCisjZGVmaW5lIFNFVF9DT05GSUdfRE1BICAgIDB4ZmUKKyNkZWZpbmUgU0VORF9DUF9ETUEgICAgICAgMHhmZgorI2RlZmluZSBBU09LICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTU1QgICAgICAgICAgICAgIDB4MDEKKworI2RlZmluZSBZRVNOTyhhKSAoKGEpID8gJ3knIDogJ24nKQorI2RlZmluZSBUTERFVih0eXBlKSAoKHR5cGUpID09IFRZUEVfRElTSyB8fCAodHlwZSkgPT0gVFlQRV9ST00pCisKKy8qICJFQVRBIiwgaW4gQmlnIEVuZGlhbiBmb3JtYXQgKi8KKyNkZWZpbmUgRUFUQV9TSUdfQkUgMHg0NTQxNTQ0MQorCisvKiBOdW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gdGhlIGJvYXJkIGNvbmZpZyBzdHJ1Y3R1cmUgZm9yIEVBVEEgMi4weCAqLworI2RlZmluZSBFQVRBXzJfMEFfU0laRSAyOAorI2RlZmluZSBFQVRBXzJfMEJfU0laRSAzMAorI2RlZmluZSBFQVRBXzJfMENfU0laRSAzNAorCisvKiBCb2FyZCBpbmZvIHN0cnVjdHVyZSAqLworc3RydWN0IGVhdGFfaW5mbyB7CisJdV9pbnQzMl90IGRhdGFfbGVuOwkvKiBOdW1iZXIgb2YgdmFsaWQgYnl0ZXMgYWZ0ZXIgdGhpcyBmaWVsZCAqLworCXVfaW50MzJfdCBzaWduOwkJLyogQVNDSUkgIkVBVEEiIHNpZ25hdHVyZSAqLworCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJdW5jaGFyIHZlcnNpb24JOiA0LAorCSAgICAgICAJCTogNDsKKwl1bmNoYXIgaGFhdmFsCTogMSwKKwkgICAgICAgYXRhCTogMSwKKwkgICAgICAgZHJxdmxkCTogMSwKKwkgICAgICAgZG1hc3VwCTogMSwKKwkgICAgICAgbW9yc3VwCTogMSwKKwkgICAgICAgdHJueGZyCTogMSwKKwkgICAgICAgdGFyc3VwCTogMSwKKwkgICAgICAgb2NzZW5hCTogMTsKKyNlbHNlCisJdW5jaGFyCQk6IDQsCS8qIHVudXNlZCBsb3cgbmliYmxlICovCisJIAl2ZXJzaW9uCTogNDsJLyogRUFUQSB2ZXJzaW9uLCBzaG91bGQgYmUgMHgxICovCisJdW5jaGFyIG9jc2VuYQk6IDEsCS8qIE92ZXJsYXAgQ29tbWFuZCBTdXBwb3J0IEVuYWJsZWQgKi8KKwkgICAgICAgdGFyc3VwCTogMSwJLyogVGFyZ2V0IE1vZGUgU3VwcG9ydGVkICovCisJICAgICAgIHRybnhmcgk6IDEsCS8qIFRydW5jYXRlIFRyYW5zZmVyIENtZCBOT1QgTmVjZXNzYXJ5ICovCisJICAgICAgIG1vcnN1cAk6IDEsCS8qIE1vcmUgU3VwcG9ydGVkICovCisJICAgICAgIGRtYXN1cAk6IDEsCS8qIERNQSBTdXBwb3J0ZWQgKi8KKwkgICAgICAgZHJxdmxkCTogMSwJLyogRFJRIEluZGV4IChEUlFYKSBpcyB2YWxpZCAqLworCSAgICAgICBhdGEJOiAxLAkvKiBUaGlzIGlzIGFuIEFUQSBkZXZpY2UgKi8KKwkgICAgICAgaGFhdmFsCTogMTsJLyogSG9zdCBBZGFwdGVyIEFkZHJlc3MgVmFsaWQgKi8KKyNlbmRpZgorCisJdXNob3J0IGNwX3BhZF9sZW47CS8qIE51bWJlciBvZiBwYWQgYnl0ZXMgYWZ0ZXIgY3BfbGVuICovCisJdW5jaGFyIGhvc3RfYWRkcls0XTsJLyogSG9zdCBBZGFwdGVyIFNDU0kgSUQgZm9yIGNoYW5uZWxzIDMsIDIsIDEsIDAgKi8KKwl1X2ludDMyX3QgY3BfbGVuOwkvKiBOdW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gY3AgKi8KKwl1X2ludDMyX3Qgc3BfbGVuOwkvKiBOdW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gc3AgKi8KKwl1c2hvcnQgcXVldWVfc2l6ZTsJLyogTWF4IG51bWJlciBvZiBjcCB0aGF0IGNhbiBiZSBxdWV1ZWQgKi8KKwl1c2hvcnQgdW51c2VkOworCXVzaG9ydCBzY2F0dF9zaXplOwkvKiBNYXggbnVtYmVyIG9mIGVudHJpZXMgaW4gc2NhdHRlci9nYXRoZXIgdGFibGUgKi8KKworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCXVuY2hhciBkcnF4CTogMiwKKwkgICAgICAgc2Vjb25kCTogMSwKKwkgICAgICAgaXJxX3RyCTogMSwKKwkgICAgICAgaXJxCTogNDsKKwl1bmNoYXIgc3luYzsKKwl1bmNoYXIJCTogNCwKKwkgICAgICAgcmVzMQk6IDEsCisJICAgICAgIGxhcmdlX3NnCTogMSwKKwkgICAgICAgZm9yY2FkZHIJOiAxLAorCSAgICAgICBpc2FlbmEJOiAxOworCXVuY2hhciBtYXhfY2hhbgk6IDMsCisJICAgICAgIG1heF9pZAk6IDU7CisJdW5jaGFyIG1heF9sdW47CisJdW5jaGFyIGVpc2EJOiAxLAorCSAgICAgICBwY2kJOiAxLAorCSAgICAgICBpZHF1ZXN0CTogMSwKKwkgICAgICAgbTEJOiAxLAorCSAgICAgICAJCTogNDsKKyNlbHNlCisJdW5jaGFyIGlycQk6IDQsCS8qIEludGVycnVwdCBSZXF1ZXN0IGFzc2lnbmVkIHRvIHRoaXMgY29udHJvbGxlciAqLworCSAgICAgICBpcnFfdHIJOiAxLAkvKiAwIGZvciBlZGdlIHRyaWdnZXJlZCwgMSBmb3IgbGV2ZWwgdHJpZ2dlcmVkICovCisJICAgICAgIHNlY29uZAk6IDEsCS8qIDEgaWYgdGhpcyBpcyBhIHNlY29uZGFyeSAobm90IHByaW1hcnkpIGNvbnRyb2xsZXIgKi8KKwkgICAgICAgZHJxeAk6IDI7CS8qIERSUSBJbmRleCAoMD1ETUEwLCAxPURNQTcsIDI9RE1BNiwgMz1ETUE1KSAqLworCXVuY2hhciBzeW5jOwkJLyogMSBpZiBzY3NpIHRhcmdldCBpZCA3Li4uMCBpcyBydW5uaW5nIHN5bmMgc2NzaSAqLworCisJLyogU3RydWN0dXJlIGV4dGVuc2lvbiBkZWZpbmVkIGluIEVBVEEgMi4wQiAqLworCXVuY2hhciBpc2FlbmEJOiAxLAkvKiBJU0EgaS9vIGFkZHJlc3NpbmcgaXMgZGlzYWJsZWQvZW5hYmxlZCAqLworCSAgICAgICBmb3JjYWRkcgk6IDEsCS8qIFBvcnQgYWRkcmVzcyBoYXMgYmVlbiBmb3JjZWQgKi8KKwkgICAgICAgbGFyZ2Vfc2cJOiAxLAkvKiAxIGlmIGxhcmdlIFNHIGxpc3RzIGFyZSBzdXBwb3J0ZWQgKi8KKwkgICAgICAgcmVzMQk6IDEsCisJICAgICAgIAkJOiA0OworCXVuY2hhciBtYXhfaWQJOiA1LAkvKiBNYXggU0NTSSB0YXJnZXQgSUQgbnVtYmVyICovCisJICAgICAgIG1heF9jaGFuCTogMzsJLyogTWF4IFNDU0kgY2hhbm5lbCBudW1iZXIgb24gdGhpcyBib2FyZCAqLworCisJLyogU3RydWN0dXJlIGV4dGVuc2lvbiBkZWZpbmVkIGluIEVBVEEgMi4wQyAqLworCXVuY2hhciBtYXhfbHVuOwkJLyogTWF4IFNDU0kgTFVOIG51bWJlciAqLworCXVuY2hhcgorCQkJOiA0LAorCSAgICAgICBtMQk6IDEsCS8qIFRoaXMgaXMgYSBQQ0kgd2l0aCBhbiBNMSBjaGlwIGluc3RhbGxlZCAqLworCSAgICAgICBpZHF1ZXN0CTogMSwJLyogUkFJRE5VTSByZXR1cm5lZCBpcyBxdWVzdGlvbmFibGUgKi8KKwkgICAgICAgcGNpCTogMSwJLyogVGhpcyBib2FyZCBpcyBQQ0kgKi8KKwkgICAgICAgZWlzYQk6IDE7CS8qIFRoaXMgYm9hcmQgaXMgRUlTQSAqLworI2VuZGlmCisKKwl1bmNoYXIgcmFpZG51bTsJCS8qIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBIQkEgaW4gYSBzeXN0ZW0gKi8KKwl1bmNoYXIgbm90dXNlZDsKKworCXVzaG9ydCBpcGFkWzI0N107Cit9OworCisvKiBCb2FyZCBjb25maWcgc3RydWN0dXJlICovCitzdHJ1Y3QgZWF0YV9jb25maWcgeworCXVzaG9ydCBsZW47CQkvKiBOdW1iZXIgb2YgYnl0ZXMgZm9sbG93aW5nIHRoaXMgZmllbGQgKi8KKworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCXVuY2hhcgkJOiA0LAorCSAgICAgICB0YXJlbmEJOiAxLAorCSAgICAgICBtZHBlbmEJOiAxLAorCSAgICAgICBvY2VuYQk6IDEsCisJICAgICAgIGVkaXMJOiAxOworI2Vsc2UKKwl1bmNoYXIgZWRpcwk6IDEsCS8qIERpc2FibGUgRUFUQSBpbnRlcmZhY2UgYWZ0ZXIgY29uZmlnIGNvbW1hbmQgKi8KKwkgICAgICAgb2NlbmEJOiAxLAkvKiBPdmVybGFwcGVkIENvbW1hbmRzIEVuYWJsZWQgKi8KKwkgICAgICAgbWRwZW5hCTogMSwJLyogVHJhbnNmZXIgYWxsIE1vZGlmaWVkIERhdGEgUG9pbnRlciBNZXNzYWdlcyAqLworCSAgICAgICB0YXJlbmEJOiAxLAkvKiBUYXJnZXQgTW9kZSBFbmFibGVkIGZvciB0aGlzIGNvbnRyb2xsZXIgKi8KKwkgICAgICAgCQk6IDQ7CisjZW5kaWYKKwl1bmNoYXIgY3BhZFs1MTFdOworfTsKKworLyogUmV0dXJuZWQgc3RhdHVzIHBhY2tldCBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBtc3NwIHsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwl1bmNoYXIgZW9jCTogMSwKKwkgICAgICAgYWRhcHRlcl9zdGF0dXMgOiA3OworI2Vsc2UKKwl1bmNoYXIgYWRhcHRlcl9zdGF0dXMgOiA3LAkvKiBTdGF0ZSByZWxhdGVkIHRvIGN1cnJlbnQgY29tbWFuZCAqLworCSAgICAgICBlb2MJOiAxOwkJLyogRW5kIE9mIENvbW1hbmQgKDEgPSBjb21tYW5kIGNvbXBsZXRlZCkgKi8KKyNlbmRpZgorCXVuY2hhciB0YXJnZXRfc3RhdHVzOwkvKiBTQ1NJIHN0YXR1cyByZWNlaXZlZCBhZnRlciBkYXRhIHRyYW5zZmVyICovCisJdW5jaGFyIHVudXNlZFsyXTsKKwl1X2ludDMyX3QgaW52X3Jlc19sZW47CS8qIE51bWJlciBvZiBieXRlcyBub3QgdHJhbnNmZXJyZWQgKi8KKwl1X2ludDMyX3QgY3BwX2luZGV4OwkvKiBJbmRleCBvZiBhZGRyZXNzIHNldCBpbiBjcCAqLworCWNoYXIgbWVzc1sxMl07Cit9OworCitzdHJ1Y3Qgc2dfbGlzdCB7CisJdW5zaWduZWQgaW50IGFkZHJlc3M7CS8qIFNlZ21lbnQgQWRkcmVzcyAqLworCXVuc2lnbmVkIGludCBudW1fYnl0ZXM7CS8qIFNlZ21lbnQgTGVuZ3RoICovCit9OworCisvKiBNYWlsQm94IFNDU0kgQ29tbWFuZCBQYWNrZXQgKi8KK3N0cnVjdCBtc2NwIHsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwl1bmNoYXIgZGluCTogMSwKKwkgICAgICAgZG91dAk6IDEsCisJICAgICAgIGludGVycAk6IDEsCisJICAgICAgIAkJOiAxLAorCQlzZwk6IDEsCisJCXJlcXNlbgk6MSwKKwkJaW5pdAk6IDEsCisJCXNyZXNldAk6IDE7CisJdW5jaGFyIHNlbnNlX2xlbjsKKwl1bmNoYXIgdW51c2VkWzNdOworCXVuY2hhcgkJOiA3LAorCSAgICAgICBmd25lc3QJOiAxOworCXVuY2hhcgkJOiA1LAorCSAgICAgICBoYmFjaQk6IDEsCisJICAgICAgIGlhdAk6IDEsCisJICAgICAgIHBoc3VuaXQJOiAxOworCXVuY2hhciBjaGFubmVsCTogMywKKwkgICAgICAgdGFyZ2V0CTogNTsKKwl1bmNoYXIgb25lCTogMSwKKwkgICAgICAgZGlzcHJpCTogMSwKKwkgICAgICAgbHVudGFyCTogMSwKKwkgICAgICAgbHVuCTogNTsKKyNlbHNlCisJdW5jaGFyIHNyZXNldAk6MSwJLyogU0NTSSBCdXMgUmVzZXQgU2lnbmFsIHNob3VsZCBiZSBhc3NlcnRlZCAqLworCSAgICAgICBpbml0CToxLAkvKiBSZS1pbml0aWFsaXplIGNvbnRyb2xsZXIgYW5kIHNlbGYgdGVzdCAqLworCSAgICAgICByZXFzZW4JOjEsCS8qIFRyYW5zZmVyIFJlcXVlc3QgU2Vuc2UgRGF0YSB0byBhZGRyIHVzaW5nIERNQSAqLworCSAgICAgICBzZwk6MSwJLyogVXNlIFNjYXR0ZXIvR2F0aGVyICovCisJICAgICAgIAkJOjEsCisJICAgICAgIGludGVycAk6MSwJLyogVGhlIGNvbnRyb2xsZXIgaW50ZXJwcmV0cyBjcCwgbm90IHRoZSB0YXJnZXQgKi8KKwkgICAgICAgZG91dAk6MSwJLyogRGlyZWN0aW9uIG9mIFRyYW5zZmVyIGlzIE91dCAoSG9zdCB0byBUYXJnZXQpICovCisJICAgICAgIGRpbgk6MTsJLyogRGlyZWN0aW9uIG9mIFRyYW5zZmVyIGlzIEluIChUYXJnZXQgdG8gSG9zdCkgKi8KKwl1bmNoYXIgc2Vuc2VfbGVuOwkvKiBSZXF1ZXN0IFNlbnNlIExlbmd0aCAqLworCXVuY2hhciB1bnVzZWRbM107CisJdW5jaGFyIGZ3bmVzdAk6IDEsCS8qIFNlbmQgY29tbWFuZCB0byBhIGNvbXBvbmVudCBvZiBhbiBBcnJheSBHcm91cCAqLworCQkJOiA3OworCXVuY2hhciBwaHN1bml0CTogMSwJLyogU2VuZCB0byBUYXJnZXQgUGh5c2ljYWwgVW5pdCAoYnlwYXNzIFJBSUQpICovCisJICAgICAgIGlhdAk6IDEsCS8qIEluaGliaXQgQWRkcmVzcyBUcmFuc2xhdGlvbiAqLworCSAgICAgICBoYmFjaQk6IDEsCS8qIEluaGliaXQgSEJBIENhY2hpbmcgZm9yIHRoaXMgY29tbWFuZCAqLworCSAgICAgICAJCTogNTsKKwl1bmNoYXIgdGFyZ2V0CTogNSwJLyogU0NTSSB0YXJnZXQgSUQgKi8KKwkgICAgICAgY2hhbm5lbAk6IDM7CS8qIFNDU0kgY2hhbm5lbCBudW1iZXIgKi8KKwl1bmNoYXIgbHVuCTogNSwJLyogU0NTSSBsb2dpY2FsIHVuaXQgbnVtYmVyICovCisJICAgICAgIGx1bnRhcgk6IDEsCS8qIFRoaXMgY3AgaXMgZm9yIFRhcmdldCAobm90IExVTikgKi8KKwkgICAgICAgZGlzcHJpCTogMSwJLyogRGlzY29ubmVjdCBQcml2aWxlZ2UgZ3JhbnRlZCAqLworCSAgICAgICBvbmUJOiAxOwkvKiAxICovCisjZW5kaWYKKworCXVuY2hhciBtZXNzWzNdOwkJLyogTWFzc2FnZSB0by9mcm9tIFRhcmdldCAqLworCXVuY2hhciBjZGJbMTJdOwkJLyogQ29tbWFuZCBEZXNjcmlwdG9yIEJsb2NrICovCisJdV9pbnQzMl90IGRhdGFfbGVuOwkvKiBJZiBzZz0wIERhdGEgTGVuZ3RoLCBpZiBzZz0xIHNnbGlzdCBsZW5ndGggKi8KKwl1X2ludDMyX3QgY3BwX2luZGV4OwkvKiBJbmRleCBvZiBhZGRyZXNzIHRvIGJlIHJldHVybmVkIGluIHNwICovCisJdV9pbnQzMl90IGRhdGFfYWRkcmVzczsJLyogSWYgc2c9MCBEYXRhIEFkZHJlc3MsIGlmIHNnPTEgc2dsaXN0IGFkZHJlc3MgKi8KKwl1X2ludDMyX3Qgc3BfZG1hX2FkZHI7CS8qIEFkZHJlc3Mgd2hlcmUgc3AgaXMgRE1BJ2VkIHdoZW4gY3AgY29tcGxldGVzICovCisJdV9pbnQzMl90IHNlbnNlX2FkZHI7CS8qIEFkZHJlc3Mgd2hlcmUgU2Vuc2UgRGF0YSBpcyBETUEnZWQgb24gZXJyb3IgKi8KKworCS8qIEFkZGl0aW9uYWwgZmllbGRzIGJlZ2luIGhlcmUuICovCisJc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CisKKwkvKiBBbGwgdGhlIGNwIHN0cnVjdHVyZSBpcyB6ZXJvIGZpbGxlZCBieSBxdWV1ZWNvbW1hbmQgZXhjZXB0IHRoZQorCSAgIGZvbGxvd2luZyBDUF9UQUlMX1NJWkUgYnl0ZXMsIGluaXRpYWxpemVkIGJ5IGRldGVjdCAqLworCWRtYV9hZGRyX3QgY3BfZG1hX2FkZHI7CS8qIGRtYSBoYW5kbGUgZm9yIHRoaXMgY3Agc3RydWN0dXJlICovCisJc3RydWN0IHNnX2xpc3QgKnNnbGlzdDsJLyogcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIFNHIGxpc3QgKi8KK307CisKKyNkZWZpbmUgQ1BfVEFJTF9TSVpFIChzaXplb2Yoc3RydWN0IHNnbGlzdCAqKSArIHNpemVvZihkbWFfYWRkcl90KSkKKworc3RydWN0IGhvc3RkYXRhIHsKKwlzdHJ1Y3QgbXNjcCBjcFtNQVhfTUFJTEJPWEVTXTsJLyogTWFpbGJveGVzIGZvciB0aGlzIGJvYXJkICovCisJdW5zaWduZWQgaW50IGNwX3N0YXRbTUFYX01BSUxCT1hFU107CS8qIEZSRUUsIElOX1VTRSwgTE9DS0VELCBJTl9SRVNFVCAqLworCXVuc2lnbmVkIGludCBsYXN0X2NwX3VzZWQ7CS8qIEluZGV4IG9mIGxhc3QgbWFpbGJveCB1c2VkICovCisJdW5zaWduZWQgaW50IGlvY291bnQ7CS8qIFRvdGFsIGkvbyBkb25lIGZvciB0aGlzIGJvYXJkICovCisJaW50IGJvYXJkX251bWJlcjsJLyogTnVtYmVyIG9mIHRoaXMgYm9hcmQgKi8KKwljaGFyIGJvYXJkX25hbWVbMTZdOwkvKiBOYW1lIG9mIHRoaXMgYm9hcmQgKi8KKwlpbnQgaW5fcmVzZXQ7CQkvKiBUcnVlIGlmIGJvYXJkIGlzIGRvaW5nIGEgcmVzZXQgKi8KKwlpbnQgdGFyZ2V0X3RvW01BWF9UQVJHRVRdW01BWF9DSEFOTkVMXTsJLyogTi4gb2YgdGltZW91dCBlcnJvcnMgb24gdGFyZ2V0ICovCisJaW50IHRhcmdldF9yZWRvW01BWF9UQVJHRVRdW01BWF9DSEFOTkVMXTsJLyogSWYgMSByZWRvIGkvbyBvbiB0YXJnZXQgKi8KKwl1bnNpZ25lZCBpbnQgcmV0cmllczsJLyogTnVtYmVyIG9mIGludGVybmFsIHJldHJpZXMgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcmV0cmllZF9waWQ7CS8qIFBpZCBvZiBsYXN0IHJldHJpZWQgY29tbWFuZCAqLworCXVuc2lnbmVkIGNoYXIgc3VidmVyc2lvbjsJLyogQnVzIHR5cGUsIGVpdGhlciBJU0Egb3IgRUlTQS9QQ0kgKi8KKwl1bnNpZ25lZCBjaGFyIHByb3RvY29sX3JldjsJLyogRUFUQSAyLjAgcmV2LiwgJ0EnIG9yICdCJyBvciAnQycgKi8KKwl1bnNpZ25lZCBjaGFyIGlzX3BjaTsJLyogMSBpcyBidXMgdHlwZSBpcyBQQ0kgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsJLyogcGRldiBmb3IgUENJIGJ1cywgTlVMTCBvdGhlcndpc2UgKi8KKwlzdHJ1Y3QgbXNzcCAqc3BfY3B1X2FkZHI7CS8qIGNwdSBhZGRyIGZvciBETUEgYnVmZmVyIHNwICovCisJZG1hX2FkZHJfdCBzcF9kbWFfYWRkcjsJLyogZG1hIGhhbmRsZSBmb3IgRE1BIGJ1ZmZlciBzcCAqLworCXN0cnVjdCBtc3NwIHNwOwkJLyogTG9jYWwgY29weSBvZiBzcCBidWZmZXIgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICpzaFtNQVhfQk9BUkRTXTsKK3N0YXRpYyBjb25zdCBjaGFyICpkcml2ZXJfbmFtZSA9ICJFQVRBIjsKK3N0YXRpYyBjaGFyIHNoYVtNQVhfQk9BUkRTXTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZHJpdmVyX2xvY2spOworCisvKiBJbml0aWFsaXplIG51bV9ib2FyZHMgc28gdGhhdCBpaGRsciBjYW4gd29yayB3aGlsZSBkZXRlY3QgaXMgaW4gcHJvZ3Jlc3MgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX2JvYXJkcyA9IE1BWF9CT0FSRFM7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlvX3BvcnRbXSA9IHsKKworCS8qIFNwYWNlIGZvciBNQVhfSU5UX1BBUkFNIHBvcnRzIHVzYWJsZSB3aGlsZSBsb2FkaW5nIGFzIGEgbW9kdWxlICovCisJU0tJUCwgU0tJUCwgU0tJUCwgU0tJUCwgU0tJUCwgU0tJUCwgU0tJUCwgU0tJUCwKKwlTS0lQLCBTS0lQLAorCisJLyogRmlyc3QgSVNBICovCisJMHgxZjAsCisKKwkvKiBTcGFjZSBmb3IgTUFYX1BDSSBwb3J0cyBwb3NzaWJseSByZXBvcnRlZCBieSBQQ0lfQklPUyAqLworCVNLSVAsIFNLSVAsIFNLSVAsIFNLSVAsIFNLSVAsIFNLSVAsIFNLSVAsIFNLSVAsCisJU0tJUCwgU0tJUCwgU0tJUCwgU0tJUCwgU0tJUCwgU0tJUCwgU0tJUCwgU0tJUCwKKworCS8qIE1BWF9FSVNBIHBvcnRzICovCisJMHgxYzg4LCAweDJjODgsIDB4M2M4OCwgMHg0Yzg4LCAweDVjODgsIDB4NmM4OCwgMHg3Yzg4LCAweDhjODgsCisJMHg5Yzg4LCAweGFjODgsIDB4YmM4OCwgMHhjYzg4LCAweGRjODgsIDB4ZWM4OCwgMHhmYzg4LAorCisJLyogT3RoZXIgKE1BWF9JU0EgLSAxKSBwb3J0cyAqLworCTB4MTcwLCAweDIzMCwgMHgzMzAsCisKKwkvKiBFbmQgb2YgbGlzdCAqLworCTB4MAorfTsKKworLyogRGV2aWNlIGlzIEJpZyBFbmRpYW4gKi8KKyNkZWZpbmUgSDJERVYoeCkgICBjcHVfdG9fYmUzMih4KQorI2RlZmluZSBERVYySCh4KSAgIGJlMzJfdG9fY3B1KHgpCisjZGVmaW5lIEgyREVWMTYoeCkgY3B1X3RvX2JlMTYoeCkKKyNkZWZpbmUgREVWMkgxNih4KSBiZTE2X3RvX2NwdSh4KQorCisvKiBCdXQgdHJhbnNmZXIgb3JpZW50YXRpb24gZnJvbSB0aGUgMTYgYml0IGRhdGEgcmVnaXN0ZXIgaXMgTGl0dGxlIEVuZGlhbiAqLworI2RlZmluZSBSRUcySCh4KSAgIGxlMTZfdG9fY3B1KHgpCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkb19pbnRlcnJ1cHRfaGFuZGxlcihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgdm9pZCBmbHVzaF9kZXYoc3RydWN0IHNjc2lfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBob3N0ZGF0YSAqLAorCQkgICAgICB1bnNpZ25lZCBpbnQpOworc3RhdGljIGludCBkb190cmFjZSA9IDA7CitzdGF0aWMgaW50IHNldHVwX2RvbmUgPSAwOworc3RhdGljIGludCBsaW5rX3N0YXRpc3RpY3M7CitzdGF0aWMgaW50IGV4dF90cmFuID0gMDsKK3N0YXRpYyBpbnQgcmV2X3NjYW4gPSAxOworCisjaWYgZGVmaW5lZChDT05GSUdfU0NTSV9FQVRBX1RBR0dFRF9RVUVVRSkKK3N0YXRpYyBpbnQgdGFnX21vZGUgPSBUQUdfU0lNUExFOworI2Vsc2UKK3N0YXRpYyBpbnQgdGFnX21vZGUgPSBUQUdfRElTQUJMRUQ7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NDU0lfRUFUQV9MSU5LRURfQ09NTUFORFMpCitzdGF0aWMgaW50IGxpbmtlZF9jb21tID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IGxpbmtlZF9jb21tID0gMDsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0NTSV9FQVRBX01BWF9UQUdTKQorc3RhdGljIGludCBtYXhfcXVldWVfZGVwdGggPSBDT05GSUdfU0NTSV9FQVRBX01BWF9UQUdTOworI2Vsc2UKK3N0YXRpYyBpbnQgbWF4X3F1ZXVlX2RlcHRoID0gTUFYX0NNRF9QRVJfTFVOOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19JU0EpCitzdGF0aWMgaW50IGlzYV9wcm9iZSA9IDE7CisjZWxzZQorc3RhdGljIGludCBpc2FfcHJvYmUgPSAwOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19FSVNBKQorc3RhdGljIGludCBlaXNhX3Byb2JlID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IGVpc2FfcHJvYmUgPSAwOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCitzdGF0aWMgaW50IHBjaV9wcm9iZSA9IDE7CisjZWxzZQorc3RhdGljIGludCBwY2lfcHJvYmUgPSAwOworI2VuZGlmCisKKyNkZWZpbmUgTUFYX0lOVF9QQVJBTSAxMAorI2RlZmluZSBNQVhfQk9PVF9PUFRJT05TX1NJWkUgMjU2CitzdGF0aWMgY2hhciBib290X29wdGlvbnNbTUFYX0JPT1RfT1BUSU9OU19TSVpFXTsKKworI2lmIGRlZmluZWQoTU9EVUxFKQorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisKK21vZHVsZV9wYXJhbV9zdHJpbmcoZWF0YSwgYm9vdF9vcHRpb25zLCBNQVhfQk9PVF9PUFRJT05TX1NJWkUsIDApOworTU9EVUxFX1BBUk1fREVTQyhlYXRhLCAiIGVxdWl2YWxlbnQgdG8gdGhlIFwiZWF0YT0uLi5cIiBrZXJuZWwgYm9vdCBvcHRpb24uIgorCQkgIiAgICAgICAgICAgIEV4YW1wbGU6IG1vZHByb2JlIGVhdGEgXCJlYXRhPTB4NzQxMCwweDIzMCxsYzp5LHRtOjAsbXE6NCxlcDpuXCIiKTsKK01PRFVMRV9BVVRIT1IoIkRhcmlvIEJhbGxhYmlvIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkVBVEEvRE1BIFNDU0kgRHJpdmVyIik7CisKKyNlbmRpZgorCitzdGF0aWMgaW50IGVhdGEyeF9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpkZXYpCit7CisJaW50IHRxZCwgdXRxZDsKKwljaGFyICp0YWdfc3VmZml4LCAqbGlua19zdWZmaXg7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXYtPmhvc3Q7CisJc3RydWN0IGhvc3RkYXRhICpoYSA9IChzdHJ1Y3QgaG9zdGRhdGEgKilzaG9zdC0+aG9zdGRhdGE7CisKKwl1dHFkID0gTUFYX0NNRF9QRVJfTFVOOworCXRxZCA9IG1heF9xdWV1ZV9kZXB0aDsKKworCWlmIChUTERFVihkZXYtPnR5cGUpICYmIGRldi0+dGFnZ2VkX3N1cHBvcnRlZCkgeworCQlpZiAodGFnX21vZGUgPT0gVEFHX1NJTVBMRSkgeworCQkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2LCBNU0dfU0lNUExFX1RBRywgdHFkKTsKKwkJCXRhZ19zdWZmaXggPSAiLCBzaW1wbGUgdGFncyI7CisJCX0gZWxzZSBpZiAodGFnX21vZGUgPT0gVEFHX09SREVSRUQpIHsKKwkJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldiwgTVNHX09SREVSRURfVEFHLCB0cWQpOworCQkJdGFnX3N1ZmZpeCA9ICIsIG9yZGVyZWQgdGFncyI7CisJCX0gZWxzZSB7CisJCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXYsIDAsIHRxZCk7CisJCQl0YWdfc3VmZml4ID0gIiwgbm8gdGFncyI7CisJCX0KKwl9IGVsc2UgaWYgKFRMREVWKGRldi0+dHlwZSkgJiYgbGlua2VkX2NvbW0pIHsKKwkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2LCAwLCB0cWQpOworCQl0YWdfc3VmZml4ID0gIiwgdW50YWdnZWQiOworCX0gZWxzZSB7CisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldiwgMCwgdXRxZCk7CisJCXRhZ19zdWZmaXggPSAiIjsKKwl9CisKKwlpZiAoVExERVYoZGV2LT50eXBlKSAmJiBsaW5rZWRfY29tbSAmJiBkZXYtPnF1ZXVlX2RlcHRoID4gMikKKwkJbGlua19zdWZmaXggPSAiLCBzb3J0ZWQiOworCWVsc2UgaWYgKFRMREVWKGRldi0+dHlwZSkpCisJCWxpbmtfc3VmZml4ID0gIiwgdW5zb3J0ZWQiOworCWVsc2UKKwkJbGlua19zdWZmaXggPSAiIjsKKworCXByaW50aygiJXM6IHNjc2klZCwgY2hhbm5lbCAlZCwgaWQgJWQsIGx1biAlZCwgY21kcy9sdW4gJWQlcyVzLlxuIiwKKwkgICAgICAgaGEtPmJvYXJkX25hbWUsIHNob3N0LT5ob3N0X25vLCBkZXYtPmNoYW5uZWwsIGRldi0+aWQsIGRldi0+bHVuLAorCSAgICAgICBkZXYtPnF1ZXVlX2RlcHRoLCBsaW5rX3N1ZmZpeCwgdGFnX3N1ZmZpeCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3YWl0X29uX2J1c3kodW5zaWduZWQgbG9uZyBpb2Jhc2UsIHVuc2lnbmVkIGludCBsb29wKQoreworCXdoaWxlIChpbmIoaW9iYXNlICsgUkVHX0FVWF9TVEFUVVMpICYgQUJTWV9BU1NFUlRFRCkgeworCQl1ZGVsYXkoMUwpOworCQlpZiAoLS1sb29wID09IDApCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG9fZG1hKHVuc2lnbmVkIGxvbmcgaW9iYXNlLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuY2hhciBjbWQpCit7CisJdW5zaWduZWQgY2hhciAqYnlhZGRyOworCXVuc2lnbmVkIGxvbmcgZGV2YWRkcjsKKworCWlmICh3YWl0X29uX2J1c3koaW9iYXNlLCAoYWRkciA/IE1BWExPT1AgKiAxMDAgOiBNQVhMT09QKSkpCisJCXJldHVybiAxOworCisJaWYgKGFkZHIpIHsKKwkJZGV2YWRkciA9IEgyREVWKGFkZHIpOworCQlieWFkZHIgPSAodW5zaWduZWQgY2hhciAqKSZkZXZhZGRyOworCQlvdXRiKGJ5YWRkclszXSwgaW9iYXNlICsgUkVHX0xPVyk7CisJCW91dGIoYnlhZGRyWzJdLCBpb2Jhc2UgKyBSRUdfTE0pOworCQlvdXRiKGJ5YWRkclsxXSwgaW9iYXNlICsgUkVHX01JRCk7CisJCW91dGIoYnlhZGRyWzBdLCBpb2Jhc2UgKyBSRUdfTVNCKTsKKwl9CisKKwlvdXRiKGNtZCwgaW9iYXNlICsgUkVHX0NNRCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9waW8odW5zaWduZWQgbG9uZyBpb2Jhc2UsIHVzaG9ydCAqIHN0YXJ0LCB1c2hvcnQgKiBlbmQpCit7CisJdW5zaWduZWQgaW50IGxvb3AgPSBNQVhMT09QOworCXVzaG9ydCAqcDsKKworCWZvciAocCA9IHN0YXJ0OyBwIDw9IGVuZDsgcCsrKSB7CisJCXdoaWxlICghKGluYihpb2Jhc2UgKyBSRUdfU1RBVFVTKSAmIERSUV9BU1NFUlRFRCkpIHsKKwkJCXVkZWxheSgxTCk7CisJCQlpZiAoLS1sb29wID09IDApCisJCQkJcmV0dXJuIDE7CisJCX0KKwkJbG9vcCA9IE1BWExPT1A7CisJCSpwID0gUkVHMkgoaW53KGlvYmFzZSkpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKmdldF9wY2lfZGV2KHVuc2lnbmVkIGxvbmcgcG9ydF9iYXNlKQoreworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKwl1bnNpZ25lZCBpbnQgYWRkcjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKworCXdoaWxlICgoZGV2ID0gcGNpX2dldF9jbGFzcyhQQ0lfQ0xBU1NfU1RPUkFHRV9TQ1NJIDw8IDgsIGRldikpKSB7CisJCWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKKworI2lmIGRlZmluZWQoREVCVUdfUENJX0RFVEVDVCkKKwkJcHJpbnRrKCIlczogZ2V0X3BjaV9kZXYsIGJ1cyAlZCwgZGV2Zm4gMHgleCwgYWRkciAweCV4LlxuIiwKKwkJICAgICAgIGRyaXZlcl9uYW1lLCBkZXYtPmJ1cy0+bnVtYmVyLCBkZXYtPmRldmZuLCBhZGRyKTsKKyNlbmRpZgorCisJCS8qIHdlIGFyZSBpbiBzbyBtdWNoIHRyb3VibGUgZm9yIGEgcGNpIGhvdHBsdWcgc3lzdGVtIHdpdGggdGhpcyBkcml2ZXIKKwkJICogYW55d2F5LCBzbyBkb2luZyB0aGlzIGF0IGxlYXN0IGxldHMgcGVvcGxlIHVubG9hZCB0aGUgZHJpdmVyIGFuZCBub3QKKwkJICogY2F1c2UgbWVtb3J5IHByb2JsZW1zLCBidXQgaW4gZ2VuZXJhbCB0aGlzIGlzIGEgYmFkIHRoaW5nIHRvIGRvICh0aGlzCisJCSAqIGRyaXZlciBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gdGhlIHByb3BlciBQQ0kgYXBpIHNvbWVkYXkuLi4gKi8KKwkJcGNpX2Rldl9wdXQoZGV2KTsKKwkJaWYgKGFkZHIgKyBQQ0lfQkFTRV9BRERSRVNTXzAgPT0gcG9ydF9iYXNlKQorCQkJcmV0dXJuIGRldjsKKwl9CisjZW5kaWYJCQkJLyogZW5kIENPTkZJR19QQ0kgKi8KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX3BjaV9wb3J0cyh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKworCXdoaWxlICgoZGV2ID0gcGNpX2dldF9jbGFzcyhQQ0lfQ0xBU1NfU1RPUkFHRV9TQ1NJIDw8IDgsIGRldikpKSB7CisjaWYgZGVmaW5lZChERUJVR19QQ0lfREVURUNUKQorCQlwcmludGsoIiVzOiBlbmFibGVfcGNpX3BvcnRzLCBidXMgJWQsIGRldmZuIDB4JXguXG4iLAorCQkgICAgICAgZHJpdmVyX25hbWUsIGRldi0+YnVzLT5udW1iZXIsIGRldi0+ZGV2Zm4pOworI2VuZGlmCisKKwkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikpCisJCQlwcmludGsKKwkJCSAgICAoIiVzOiB3YXJuaW5nLCBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGJ1cyAlZCBkZXZmbiAweCV4LlxuIiwKKwkJCSAgICAgZHJpdmVyX25hbWUsIGRldi0+YnVzLT5udW1iZXIsIGRldi0+ZGV2Zm4pOworCX0KKworI2VuZGlmCQkJCS8qIGVuZCBDT05GSUdfUENJICovCit9CisKK3N0YXRpYyBpbnQgcG9ydF9kZXRlY3QodW5zaWduZWQgbG9uZyBwb3J0X2Jhc2UsIHVuc2lnbmVkIGludCBqLAorCQlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0cG50KQoreworCXVuc2lnbmVkIGNoYXIgaXJxLCBkbWFfY2hhbm5lbCwgc3VidmVyc2lvbiwgaSwgaXNfcGNpID0gMDsKKwl1bnNpZ25lZCBjaGFyIHByb3RvY29sX3JldjsKKwlzdHJ1Y3QgZWF0YV9pbmZvIGluZm87CisJY2hhciAqYnVzX3R5cGUsIGRtYV9uYW1lWzE2XTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwkvKiBBbGxvd2VkIERNQSBjaGFubmVscyBmb3IgSVNBICgwIGluZGljYXRlcyByZXNlcnZlZCkgKi8KKwl1bnNpZ25lZCBjaGFyIGRtYV9jaGFubmVsX3RhYmxlWzRdID0geyA1LCA2LCA3LCAwIH07CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IGhvc3RkYXRhICpoYTsKKwljaGFyIG5hbWVbMTZdOworCisJc3ByaW50ZihuYW1lLCAiJXMlZCIsIGRyaXZlcl9uYW1lLCBqKTsKKworCWlmICghcmVxdWVzdF9yZWdpb24ocG9ydF9iYXNlLCBSRUdJT05fU0laRSwgZHJpdmVyX25hbWUpKSB7CisjaWYgZGVmaW5lZChERUJVR19ERVRFQ1QpCisJCXByaW50aygiJXM6IGFkZHJlc3MgMHglMDNseCBpbiB1c2UsIHNraXBwaW5nIHByb2JlLlxuIiwgbmFtZSwKKwkJICAgICAgIHBvcnRfYmFzZSk7CisjZW5kaWYKKwkJZ290byBmYWlsOworCX0KKworCXNwaW5fbG9ja19pcnEoJmRyaXZlcl9sb2NrKTsKKworCWlmIChkb19kbWEocG9ydF9iYXNlLCAwLCBSRUFEX0NPTkZJR19QSU8pKSB7CisjaWYgZGVmaW5lZChERUJVR19ERVRFQ1QpCisJCXByaW50aygiJXM6IGRldGVjdCwgZG9fZG1hIGZhaWxlZCBhdCAweCUwM2x4LlxuIiwgbmFtZSwKKwkJICAgICAgIHBvcnRfYmFzZSk7CisjZW5kaWYKKwkJZ290byBmcmVlbG9jazsKKwl9CisKKwkvKiBSZWFkIHRoZSBpbmZvIHN0cnVjdHVyZSAqLworCWlmIChyZWFkX3Bpbyhwb3J0X2Jhc2UsICh1c2hvcnQgKikgJiBpbmZvLCAodXNob3J0ICopICYgaW5mby5pcGFkWzBdKSkgeworI2lmIGRlZmluZWQoREVCVUdfREVURUNUKQorCQlwcmludGsoIiVzOiBkZXRlY3QsIHJlYWRfcGlvIGZhaWxlZCBhdCAweCUwM2x4LlxuIiwgbmFtZSwKKwkJICAgICAgIHBvcnRfYmFzZSk7CisjZW5kaWYKKwkJZ290byBmcmVlbG9jazsKKwl9CisKKwlpbmZvLmRhdGFfbGVuID0gREVWMkgoaW5mby5kYXRhX2xlbik7CisJaW5mby5zaWduID0gREVWMkgoaW5mby5zaWduKTsKKwlpbmZvLmNwX3BhZF9sZW4gPSBERVYySDE2KGluZm8uY3BfcGFkX2xlbik7CisJaW5mby5jcF9sZW4gPSBERVYySChpbmZvLmNwX2xlbik7CisJaW5mby5zcF9sZW4gPSBERVYySChpbmZvLnNwX2xlbik7CisJaW5mby5zY2F0dF9zaXplID0gREVWMkgxNihpbmZvLnNjYXR0X3NpemUpOworCWluZm8ucXVldWVfc2l6ZSA9IERFVjJIMTYoaW5mby5xdWV1ZV9zaXplKTsKKworCS8qIENoZWNrIHRoZSBjb250cm9sbGVyICJFQVRBIiBzaWduYXR1cmUgKi8KKwlpZiAoaW5mby5zaWduICE9IEVBVEFfU0lHX0JFKSB7CisjaWYgZGVmaW5lZChERUJVR19ERVRFQ1QpCisJCXByaW50aygiJXM6IHNpZ25hdHVyZSAweCUwNHggZGlzY2FyZGVkLlxuIiwgbmFtZSwgaW5mby5zaWduKTsKKyNlbmRpZgorCQlnb3RvIGZyZWVsb2NrOworCX0KKworCWlmIChpbmZvLmRhdGFfbGVuIDwgRUFUQV8yXzBBX1NJWkUpIHsKKwkJcHJpbnRrCisJCSAgICAoIiVzOiBjb25maWcgc3RydWN0dXJlIHNpemUgKCVkIGJ5dGVzKSB0b28gc2hvcnQsIGRldGFjaGluZy5cbiIsCisJCSAgICAgbmFtZSwgaW5mby5kYXRhX2xlbik7CisJCWdvdG8gZnJlZWxvY2s7CisJfSBlbHNlIGlmIChpbmZvLmRhdGFfbGVuID09IEVBVEFfMl8wQV9TSVpFKQorCQlwcm90b2NvbF9yZXYgPSAnQSc7CisJZWxzZSBpZiAoaW5mby5kYXRhX2xlbiA9PSBFQVRBXzJfMEJfU0laRSkKKwkJcHJvdG9jb2xfcmV2ID0gJ0InOworCWVsc2UKKwkJcHJvdG9jb2xfcmV2ID0gJ0MnOworCisJaWYgKHByb3RvY29sX3JldiAhPSAnQScgJiYgaW5mby5mb3JjYWRkcikgeworCQlwcmludGsoIiVzOiB3YXJuaW5nLCBwb3J0IGFkZHJlc3MgaGFzIGJlZW4gZm9yY2VkLlxuIiwgbmFtZSk7CisJCWJ1c190eXBlID0gIlBDSSI7CisJCWlzX3BjaSA9IDE7CisJCXN1YnZlcnNpb24gPSBFU0E7CisJfSBlbHNlIGlmIChwb3J0X2Jhc2UgPiBNQVhfRUlTQV9BRERSCisJCSAgIHx8IChwcm90b2NvbF9yZXYgPT0gJ0MnICYmIGluZm8ucGNpKSkgeworCQlidXNfdHlwZSA9ICJQQ0kiOworCQlpc19wY2kgPSAxOworCQlzdWJ2ZXJzaW9uID0gRVNBOworCX0gZWxzZSBpZiAocG9ydF9iYXNlID49IE1JTl9FSVNBX0FERFIKKwkJICAgfHwgKHByb3RvY29sX3JldiA9PSAnQycgJiYgaW5mby5laXNhKSkgeworCQlidXNfdHlwZSA9ICJFSVNBIjsKKwkJc3VidmVyc2lvbiA9IEVTQTsKKwl9IGVsc2UgaWYgKHByb3RvY29sX3JldiA9PSAnQycgJiYgIWluZm8uZWlzYSAmJiAhaW5mby5wY2kpIHsKKwkJYnVzX3R5cGUgPSAiSVNBIjsKKwkJc3VidmVyc2lvbiA9IElTQTsKKwl9IGVsc2UgaWYgKHBvcnRfYmFzZSA+IE1BWF9JU0FfQUREUikgeworCQlidXNfdHlwZSA9ICJQQ0kiOworCQlpc19wY2kgPSAxOworCQlzdWJ2ZXJzaW9uID0gRVNBOworCX0gZWxzZSB7CisJCWJ1c190eXBlID0gIklTQSI7CisJCXN1YnZlcnNpb24gPSBJU0E7CisJfQorCisJaWYgKCFpbmZvLmhhYXZhbCB8fCBpbmZvLmF0YSkgeworCQlwcmludGsKKwkJICAgICgiJXM6IGFkZHJlc3MgMHglMDNseCwgdW51c2FibGUgJXMgYm9hcmQgKCVkJWQpLCBkZXRhY2hpbmcuXG4iLAorCQkgICAgIG5hbWUsIHBvcnRfYmFzZSwgYnVzX3R5cGUsIGluZm8uaGFhdmFsLCBpbmZvLmF0YSk7CisJCWdvdG8gZnJlZWxvY2s7CisJfQorCisJaWYgKGluZm8uZHJxdmxkKSB7CisJCWlmIChzdWJ2ZXJzaW9uID09IEVTQSkKKwkJCXByaW50aygiJXM6IHdhcm5pbmcsIHdlaXJkICVzIGJvYXJkIHVzaW5nIERNQS5cbiIsIG5hbWUsCisJCQkgICAgICAgYnVzX3R5cGUpOworCisJCXN1YnZlcnNpb24gPSBJU0E7CisJCWRtYV9jaGFubmVsID0gZG1hX2NoYW5uZWxfdGFibGVbMyAtIGluZm8uZHJxeF07CisJfSBlbHNlIHsKKwkJaWYgKHN1YnZlcnNpb24gPT0gSVNBKQorCQkJcHJpbnRrKCIlczogd2FybmluZywgd2VpcmQgJXMgYm9hcmQgbm90IHVzaW5nIERNQS5cbiIsCisJCQkgICAgICAgbmFtZSwgYnVzX3R5cGUpOworCisJCXN1YnZlcnNpb24gPSBFU0E7CisJCWRtYV9jaGFubmVsID0gTk9fRE1BOworCX0KKworCWlmICghaW5mby5kbWFzdXApCisJCXByaW50aygiJXM6IHdhcm5pbmcsIERNQSBwcm90b2NvbCBzdXBwb3J0IG5vdCBhc3NlcnRlZC5cbiIsCisJCSAgICAgICBuYW1lKTsKKworCWlycSA9IGluZm8uaXJxOworCisJaWYgKHN1YnZlcnNpb24gPT0gRVNBICYmICFpbmZvLmlycV90cikKKwkJcHJpbnRrCisJCSAgICAoIiVzOiB3YXJuaW5nLCBMRVZFTCB0cmlnZ2VyaW5nIGlzIHN1Z2dlc3RlZCBmb3IgSVJRICV1LlxuIiwKKwkJICAgICBuYW1lLCBpcnEpOworCisJaWYgKGlzX3BjaSkgeworCQlwZGV2ID0gZ2V0X3BjaV9kZXYocG9ydF9iYXNlKTsKKwkJaWYgKCFwZGV2KQorCQkJcHJpbnRrCisJCQkgICAgKCIlczogd2FybmluZywgZmFpbGVkIHRvIGdldCBwY2lfZGV2IHN0cnVjdHVyZS5cbiIsCisJCQkgICAgIG5hbWUpOworCX0gZWxzZQorCQlwZGV2ID0gTlVMTDsKKworCWlmIChwZGV2ICYmIChpcnEgIT0gcGRldi0+aXJxKSkgeworCQlwcmludGsoIiVzOiBJUlEgJXUgbWFwcGVkIHRvIElPLUFQSUMgSVJRICV1LlxuIiwgbmFtZSwgaXJxLAorCQkgICAgICAgcGRldi0+aXJxKTsKKwkJaXJxID0gcGRldi0+aXJxOworCX0KKworCS8qIEJvYXJkIGRldGVjdGVkLCBhbGxvY2F0ZSBpdHMgSVJRICovCisJaWYgKHJlcXVlc3RfaXJxKGlycSwgZG9faW50ZXJydXB0X2hhbmRsZXIsCisJCQlTQV9JTlRFUlJVUFQgfCAoKHN1YnZlcnNpb24gPT0gRVNBKSA/IFNBX1NISVJRIDogMCksCisJCQlkcml2ZXJfbmFtZSwgKHZvaWQgKikmc2hhW2pdKSkgeworCQlwcmludGsoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgSVJRICV1LCBkZXRhY2hpbmcuXG4iLCBuYW1lLAorCQkgICAgICAgaXJxKTsKKwkJZ290byBmcmVlbG9jazsKKwl9CisKKwlpZiAoc3VidmVyc2lvbiA9PSBJU0EgJiYgcmVxdWVzdF9kbWEoZG1hX2NoYW5uZWwsIGRyaXZlcl9uYW1lKSkgeworCQlwcmludGsoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgRE1BIGNoYW5uZWwgJXUsIGRldGFjaGluZy5cbiIsCisJCSAgICAgICBuYW1lLCBkbWFfY2hhbm5lbCk7CisJCWdvdG8gZnJlZWlycTsKKwl9CisjaWYgZGVmaW5lZChGT1JDRV9DT05GSUcpCisJeworCQlzdHJ1Y3QgZWF0YV9jb25maWcgKmNmOworCQlkbWFfYWRkcl90IGNmX2RtYV9hZGRyOworCisJCWNmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCBlYXRhX2NvbmZpZyksCisJCQkJCSAgJmNmX2RtYV9hZGRyKTsKKworCQlpZiAoIWNmKSB7CisJCQlwcmludGsKKwkJCSAgICAoIiVzOiBjb25maWcsIHBjaV9hbGxvY19jb25zaXN0ZW50IGZhaWxlZCwgZGV0YWNoaW5nLlxuIiwKKwkJCSAgICAgbmFtZSk7CisJCQlnb3RvIGZyZWVkbWE7CisJCX0KKworCQkvKiBTZXQgYm9hcmQgY29uZmlndXJhdGlvbiAqLworCQltZW1zZXQoKGNoYXIgKiljZiwgMCwgc2l6ZW9mKHN0cnVjdCBlYXRhX2NvbmZpZykpOworCQljZi0+bGVuID0gKHVzaG9ydCkgSDJERVYxNigodXNob3J0KSA1MTApOworCQljZi0+b2NlbmEgPSAxOworCisJCWlmIChkb19kbWEocG9ydF9iYXNlLCBjZl9kbWFfYWRkciwgU0VUX0NPTkZJR19ETUEpKSB7CisJCQlwcmludGsKKwkJCSAgICAoIiVzOiBidXN5IHRpbWVvdXQgc2VuZGluZyBjb25maWd1cmF0aW9uLCBkZXRhY2hpbmcuXG4iLAorCQkJICAgICBuYW1lKTsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCBlYXRhX2NvbmZpZyksCisJCQkJCSAgICBjZiwgY2ZfZG1hX2FkZHIpOworCQkJZ290byBmcmVlZG1hOworCQl9CisKKwl9CisjZW5kaWYKKworCXNwaW5fdW5sb2NrX2lycSgmZHJpdmVyX2xvY2spOworCXNoW2pdID0gc2hvc3QgPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIHNpemVvZihzdHJ1Y3QgaG9zdGRhdGEpKTsKKwlzcGluX2xvY2tfaXJxKCZkcml2ZXJfbG9jayk7CisKKwlpZiAoc2hvc3QgPT0gTlVMTCkgeworCQlwcmludGsoIiVzOiB1bmFibGUgdG8gcmVnaXN0ZXIgaG9zdCwgZGV0YWNoaW5nLlxuIiwgbmFtZSk7CisJCWdvdG8gZnJlZWRtYTsKKwl9CisKKwlzaG9zdC0+aW9fcG9ydCA9IHBvcnRfYmFzZTsKKwlzaG9zdC0+dW5pcXVlX2lkID0gcG9ydF9iYXNlOworCXNob3N0LT5uX2lvX3BvcnQgPSBSRUdJT05fU0laRTsKKwlzaG9zdC0+ZG1hX2NoYW5uZWwgPSBkbWFfY2hhbm5lbDsKKwlzaG9zdC0+aXJxID0gaXJxOworCXNob3N0LT5zZ190YWJsZXNpemUgPSAodXNob3J0KSBpbmZvLnNjYXR0X3NpemU7CisJc2hvc3QtPnRoaXNfaWQgPSAodXNob3J0KSBpbmZvLmhvc3RfYWRkclszXTsKKwlzaG9zdC0+Y2FuX3F1ZXVlID0gKHVzaG9ydCkgaW5mby5xdWV1ZV9zaXplOworCXNob3N0LT5jbWRfcGVyX2x1biA9IE1BWF9DTURfUEVSX0xVTjsKKworCWhhID0gKHN0cnVjdCBob3N0ZGF0YSAqKXNob3N0LT5ob3N0ZGF0YTsKKwkKKwltZW1zZXQoaGEsIDAsIHNpemVvZihzdHJ1Y3QgaG9zdGRhdGEpKTsKKwloYS0+c3VidmVyc2lvbiA9IHN1YnZlcnNpb247CisJaGEtPnByb3RvY29sX3JldiA9IHByb3RvY29sX3JldjsKKwloYS0+aXNfcGNpID0gaXNfcGNpOworCWhhLT5wZGV2ID0gcGRldjsKKwloYS0+Ym9hcmRfbnVtYmVyID0gajsKKworCWlmIChoYS0+c3VidmVyc2lvbiA9PSBFU0EpCisJCXNob3N0LT51bmNoZWNrZWRfaXNhX2RtYSA9IDA7CisJZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXNob3N0LT51bmNoZWNrZWRfaXNhX2RtYSA9IDE7CisKKwkJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCQlkaXNhYmxlX2RtYShkbWFfY2hhbm5lbCk7CisJCWNsZWFyX2RtYV9mZihkbWFfY2hhbm5lbCk7CisJCXNldF9kbWFfbW9kZShkbWFfY2hhbm5lbCwgRE1BX01PREVfQ0FTQ0FERSk7CisJCWVuYWJsZV9kbWEoZG1hX2NoYW5uZWwpOworCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKworCX0KKworCXN0cmNweShoYS0+Ym9hcmRfbmFtZSwgbmFtZSk7CisKKwkvKiBEUFQgUE0yMDEyIGRvZXMgbm90IGFsbG93IHRvIGRldGVjdCBzZ190YWJsZXNpemUgY29ycmVjdGx5ICovCisJaWYgKHNob3N0LT5zZ190YWJsZXNpemUgPiBNQVhfU0dMSVNUIHx8IHNob3N0LT5zZ190YWJsZXNpemUgPCAyKSB7CisJCXByaW50aygiJXM6IGRldGVjdCwgd3Jvbmcgbi4gb2YgU0cgbGlzdHMgJWQsIGZpeGVkLlxuIiwKKwkJICAgICAgIGhhLT5ib2FyZF9uYW1lLCBzaG9zdC0+c2dfdGFibGVzaXplKTsKKwkJc2hvc3QtPnNnX3RhYmxlc2l6ZSA9IE1BWF9TR0xJU1Q7CisJfQorCisJLyogRFBUIFBNMjAxMiBkb2VzIG5vdCBhbGxvdyB0byBkZXRlY3QgY2FuX3F1ZXVlIGNvcnJlY3RseSAqLworCWlmIChzaG9zdC0+Y2FuX3F1ZXVlID4gTUFYX01BSUxCT1hFUyB8fCBzaG9zdC0+Y2FuX3F1ZXVlIDwgMikgeworCQlwcmludGsoIiVzOiBkZXRlY3QsIHdyb25nIG4uIG9mIG1ib3ggJWQsIGZpeGVkLlxuIiwKKwkJICAgICAgIGhhLT5ib2FyZF9uYW1lLCBzaG9zdC0+Y2FuX3F1ZXVlKTsKKwkJc2hvc3QtPmNhbl9xdWV1ZSA9IE1BWF9NQUlMQk9YRVM7CisJfQorCisJaWYgKHByb3RvY29sX3JldiAhPSAnQScpIHsKKwkJaWYgKGluZm8ubWF4X2NoYW4gPiAwICYmIGluZm8ubWF4X2NoYW4gPCBNQVhfQ0hBTk5FTCkKKwkJCXNob3N0LT5tYXhfY2hhbm5lbCA9IGluZm8ubWF4X2NoYW47CisKKwkJaWYgKGluZm8ubWF4X2lkID4gNyAmJiBpbmZvLm1heF9pZCA8IE1BWF9UQVJHRVQpCisJCQlzaG9zdC0+bWF4X2lkID0gaW5mby5tYXhfaWQgKyAxOworCisJCWlmIChpbmZvLmxhcmdlX3NnICYmIHNob3N0LT5zZ190YWJsZXNpemUgPT0gTUFYX1NHTElTVCkKKwkJCXNob3N0LT5zZ190YWJsZXNpemUgPSBNQVhfTEFSR0VfU0dMSVNUOworCX0KKworCWlmIChwcm90b2NvbF9yZXYgPT0gJ0MnKSB7CisJCWlmIChpbmZvLm1heF9sdW4gPiA3ICYmIGluZm8ubWF4X2x1biA8IE1BWF9MVU4pCisJCQlzaG9zdC0+bWF4X2x1biA9IGluZm8ubWF4X2x1biArIDE7CisJfQorCisJaWYgKGRtYV9jaGFubmVsID09IE5PX0RNQSkKKwkJc3ByaW50ZihkbWFfbmFtZSwgIiVzIiwgIkJNU1QiKTsKKwllbHNlCisJCXNwcmludGYoZG1hX25hbWUsICJETUEgJXUiLCBkbWFfY2hhbm5lbCk7CisKKwlzcGluX3VubG9ja19pcnEoJmRyaXZlcl9sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaG9zdC0+Y2FuX3F1ZXVlOyBpKyspCisJCWhhLT5jcFtpXS5jcF9kbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKGhhLT5wZGV2LAorCQkJCQkJCSAgJmhhLT5jcFtpXSwKKwkJCQkJCQkgIHNpemVvZihzdHJ1Y3QgbXNjcCksCisJCQkJCQkJICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCisJZm9yIChpID0gMDsgaSA8IHNob3N0LT5jYW5fcXVldWU7IGkrKykgeworCQlzaXplX3Qgc3ogPSBzaG9zdC0+c2dfdGFibGVzaXplICpzaXplb2Yoc3RydWN0IHNnX2xpc3QpOworCQl1bnNpZ25lZCBpbnQgZ2ZwX21hc2sgPSAoc2hvc3QtPnVuY2hlY2tlZF9pc2FfZG1hID8gR0ZQX0RNQSA6IDApIHwgR0ZQX0FUT01JQzsKKwkJaGEtPmNwW2ldLnNnbGlzdCA9IGttYWxsb2Moc3osIGdmcF9tYXNrKTsKKwkJaWYgKCFoYS0+Y3BbaV0uc2dsaXN0KSB7CisJCQlwcmludGsKKwkJCSAgICAoIiVzOiBrbWFsbG9jIFNHbGlzdCBmYWlsZWQsIG1ib3ggJWQsIGRldGFjaGluZy5cbiIsCisJCQkgICAgIGhhLT5ib2FyZF9uYW1lLCBpKTsKKwkJCWdvdG8gcmVsZWFzZTsKKwkJfQorCX0KKworCWlmICghKGhhLT5zcF9jcHVfYWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGhhLT5wZGV2LAorCQkJCQkJCXNpemVvZihzdHJ1Y3QgbXNzcCksCisJCQkJCQkJJmhhLT5zcF9kbWFfYWRkcikpKSB7CisJCXByaW50aygiJXM6IHBjaV9hbGxvY19jb25zaXN0ZW50IGZhaWxlZCwgZGV0YWNoaW5nLlxuIiwgaGEtPmJvYXJkX25hbWUpOworCQlnb3RvIHJlbGVhc2U7CisJfQorCisJaWYgKG1heF9xdWV1ZV9kZXB0aCA+IE1BWF9UQUdHRURfQ01EX1BFUl9MVU4pCisJCW1heF9xdWV1ZV9kZXB0aCA9IE1BWF9UQUdHRURfQ01EX1BFUl9MVU47CisKKwlpZiAobWF4X3F1ZXVlX2RlcHRoIDwgTUFYX0NNRF9QRVJfTFVOKQorCQltYXhfcXVldWVfZGVwdGggPSBNQVhfQ01EX1BFUl9MVU47CisKKwlpZiAodGFnX21vZGUgIT0gVEFHX0RJU0FCTEVEICYmIHRhZ19tb2RlICE9IFRBR19TSU1QTEUpCisJCXRhZ19tb2RlID0gVEFHX09SREVSRUQ7CisKKwlpZiAoaiA9PSAwKSB7CisJCXByaW50aworCQkgICAgKCJFQVRBL0RNQSAyLjB4OiBDb3B5cmlnaHQgKEMpIDE5OTQtMjAwMyBEYXJpbyBCYWxsYWJpby5cbiIpOworCQlwcmludGsKKwkJICAgICgiJXMgY29uZmlnIG9wdGlvbnMgLT4gdG06JWQsIGxjOiVjLCBtcTolZCwgcnM6JWMsIGV0OiVjLCAiCisJCSAgICAgImlwOiVjLCBlcDolYywgcHA6JWMuXG4iLCBkcml2ZXJfbmFtZSwgdGFnX21vZGUsCisJCSAgICAgWUVTTk8obGlua2VkX2NvbW0pLCBtYXhfcXVldWVfZGVwdGgsIFlFU05PKHJldl9zY2FuKSwKKwkJICAgICBZRVNOTyhleHRfdHJhbiksIFlFU05PKGlzYV9wcm9iZSksIFlFU05PKGVpc2FfcHJvYmUpLAorCQkgICAgIFlFU05PKHBjaV9wcm9iZSkpOworCX0KKworCXByaW50aygiJXM6IDIuMCVjLCAlcyAweCUwM2x4LCBJUlEgJXUsICVzLCBTRyAlZCwgTUIgJWQuXG4iLAorCSAgICAgICBoYS0+Ym9hcmRfbmFtZSwgaGEtPnByb3RvY29sX3JldiwgYnVzX3R5cGUsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXNob3N0LT5pb19wb3J0LCBzaG9zdC0+aXJxLCBkbWFfbmFtZSwKKwkgICAgICAgc2hvc3QtPnNnX3RhYmxlc2l6ZSwgc2hvc3QtPmNhbl9xdWV1ZSk7CisKKwlpZiAoc2hvc3QtPm1heF9pZCA+IDggfHwgc2hvc3QtPm1heF9sdW4gPiA4KQorCQlwcmludGsKKwkJICAgICgiJXM6IHdpZGUgU0NTSSBzdXBwb3J0IGVuYWJsZWQsIG1heF9pZCAldSwgbWF4X2x1biAldS5cbiIsCisJCSAgICAgaGEtPmJvYXJkX25hbWUsIHNob3N0LT5tYXhfaWQsIHNob3N0LT5tYXhfbHVuKTsKKworCWZvciAoaSA9IDA7IGkgPD0gc2hvc3QtPm1heF9jaGFubmVsOyBpKyspCisJCXByaW50aygiJXM6IFNDU0kgY2hhbm5lbCAldSBlbmFibGVkLCBob3N0IHRhcmdldCBJRCAlZC5cbiIsCisJCSAgICAgICBoYS0+Ym9hcmRfbmFtZSwgaSwgaW5mby5ob3N0X2FkZHJbMyAtIGldKTsKKworI2lmIGRlZmluZWQoREVCVUdfREVURUNUKQorCXByaW50aygiJXM6IFZlcnMuIDB4JXgsIG9jcyAldSwgdGFyICV1LCB0cm54ZnIgJXUsIG1vcmUgJXUsIFNZTkMgMHgleCwgIgorCSAgICAgICAic2VjLiAldSwgaW5mb2wgJWQsIGNwbCAlZCBzcGwgJWQuXG4iLCBuYW1lLCBpbmZvLnZlcnNpb24sCisJICAgICAgIGluZm8ub2NzZW5hLCBpbmZvLnRhcnN1cCwgaW5mby50cm54ZnIsIGluZm8ubW9yc3VwLCBpbmZvLnN5bmMsCisJICAgICAgIGluZm8uc2Vjb25kLCBpbmZvLmRhdGFfbGVuLCBpbmZvLmNwX2xlbiwgaW5mby5zcF9sZW4pOworCisJaWYgKHByb3RvY29sX3JldiA9PSAnQicgfHwgcHJvdG9jb2xfcmV2ID09ICdDJykKKwkJcHJpbnRrKCIlczogaXNhZW5hICV1LCBmb3JjYWRkciAldSwgbWF4X2lkICV1LCBtYXhfY2hhbiAldSwgIgorCQkgICAgICAgImxhcmdlX3NnICV1LCByZXMxICV1LlxuIiwgbmFtZSwgaW5mby5pc2FlbmEsCisJCSAgICAgICBpbmZvLmZvcmNhZGRyLCBpbmZvLm1heF9pZCwgaW5mby5tYXhfY2hhbiwgaW5mby5sYXJnZV9zZywKKwkJICAgICAgIGluZm8ucmVzMSk7CisKKwlpZiAocHJvdG9jb2xfcmV2ID09ICdDJykKKwkJcHJpbnRrKCIlczogbWF4X2x1biAldSwgbTEgJXUsIGlkcXVlc3QgJXUsIHBjaSAldSwgZWlzYSAldSwgIgorCQkgICAgICAgInJhaWRudW0gJXUuXG4iLCBuYW1lLCBpbmZvLm1heF9sdW4sIGluZm8ubTEsCisJCSAgICAgICBpbmZvLmlkcXVlc3QsIGluZm8ucGNpLCBpbmZvLmVpc2EsIGluZm8ucmFpZG51bSk7CisjZW5kaWYKKworCWlmIChoYS0+cGRldikgeworCQlwY2lfc2V0X21hc3RlcihoYS0+cGRldik7CisJCWlmIChwY2lfc2V0X2RtYV9tYXNrKGhhLT5wZGV2LCAweGZmZmZmZmZmKSkKKwkJCXByaW50aygiJXM6IHdhcm5pbmcsIHBjaV9zZXRfZG1hX21hc2sgZmFpbGVkLlxuIiwKKwkJCSAgICAgICBoYS0+Ym9hcmRfbmFtZSk7CisJfQorCisJcmV0dXJuIDE7CisKKyAgICAgIGZyZWVkbWE6CisJaWYgKHN1YnZlcnNpb24gPT0gSVNBKQorCQlmcmVlX2RtYShkbWFfY2hhbm5lbCk7CisgICAgICBmcmVlaXJxOgorCWZyZWVfaXJxKGlycSwgJnNoYVtqXSk7CisgICAgICBmcmVlbG9jazoKKwlzcGluX3VubG9ja19pcnEoJmRyaXZlcl9sb2NrKTsKKwlyZWxlYXNlX3JlZ2lvbihwb3J0X2Jhc2UsIFJFR0lPTl9TSVpFKTsKKyAgICAgIGZhaWw6CisJcmV0dXJuIDA7CisKKyAgICAgIHJlbGVhc2U6CisJZWF0YTJ4X3JlbGVhc2Uoc2hvc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9zZXR1cChjaGFyICpzdHIsIGludCAqaW50cykKK3sKKwlpbnQgaSwgYXJnYyA9IGludHNbMF07CisJY2hhciAqY3VyID0gc3RyLCAqcGM7CisKKwlpZiAoYXJnYyA+IDApIHsKKwkJaWYgKGFyZ2MgPiBNQVhfSU5UX1BBUkFNKQorCQkJYXJnYyA9IE1BWF9JTlRfUEFSQU07CisKKwkJZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykKKwkJCWlvX3BvcnRbaV0gPSBpbnRzW2kgKyAxXTsKKworCQlpb19wb3J0W2ldID0gMDsKKwkJc2V0dXBfZG9uZSA9IDE7CisJfQorCisJd2hpbGUgKGN1ciAmJiAocGMgPSBzdHJjaHIoY3VyLCAnOicpKSkgeworCQlpbnQgdmFsID0gMCwgYyA9ICorK3BjOworCisJCWlmIChjID09ICduJyB8fCBjID09ICdOJykKKwkJCXZhbCA9IDA7CisJCWVsc2UgaWYgKGMgPT0gJ3knIHx8IGMgPT0gJ1knKQorCQkJdmFsID0gMTsKKwkJZWxzZQorCQkJdmFsID0gKGludClzaW1wbGVfc3RydG91bChwYywgTlVMTCwgMCk7CisKKwkJaWYgKCFzdHJuY21wKGN1ciwgImxjOiIsIDMpKQorCQkJbGlua2VkX2NvbW0gPSB2YWw7CisJCWVsc2UgaWYgKCFzdHJuY21wKGN1ciwgInRtOiIsIDMpKQorCQkJdGFnX21vZGUgPSB2YWw7CisJCWVsc2UgaWYgKCFzdHJuY21wKGN1ciwgInRjOiIsIDMpKQorCQkJdGFnX21vZGUgPSB2YWw7CisJCWVsc2UgaWYgKCFzdHJuY21wKGN1ciwgIm1xOiIsIDMpKQorCQkJbWF4X3F1ZXVlX2RlcHRoID0gdmFsOworCQllbHNlIGlmICghc3RybmNtcChjdXIsICJsczoiLCAzKSkKKwkJCWxpbmtfc3RhdGlzdGljcyA9IHZhbDsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoY3VyLCAiZXQ6IiwgMykpCisJCQlleHRfdHJhbiA9IHZhbDsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoY3VyLCAicnM6IiwgMykpCisJCQlyZXZfc2NhbiA9IHZhbDsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoY3VyLCAiaXA6IiwgMykpCisJCQlpc2FfcHJvYmUgPSB2YWw7CisJCWVsc2UgaWYgKCFzdHJuY21wKGN1ciwgImVwOiIsIDMpKQorCQkJZWlzYV9wcm9iZSA9IHZhbDsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoY3VyLCAicHA6IiwgMykpCisJCQlwY2lfcHJvYmUgPSB2YWw7CisKKwkJaWYgKChjdXIgPSBzdHJjaHIoY3VyLCAnLCcpKSkKKwkJCSsrY3VyOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIGludCBvcHRpb25fc2V0dXAoY2hhciAqc3RyKQoreworCWludCBpbnRzW01BWF9JTlRfUEFSQU1dOworCWNoYXIgKmN1ciA9IHN0cjsKKwlpbnQgaSA9IDE7CisKKwl3aGlsZSAoY3VyICYmIGlzZGlnaXQoKmN1cikgJiYgaSA8PSBNQVhfSU5UX1BBUkFNKSB7CisJCWludHNbaSsrXSA9IHNpbXBsZV9zdHJ0b3VsKGN1ciwgTlVMTCwgMCk7CisKKwkJaWYgKChjdXIgPSBzdHJjaHIoY3VyLCAnLCcpKSAhPSBOVUxMKQorCQkJY3VyKys7CisJfQorCisJaW50c1swXSA9IGkgLSAxOworCWludGVybmFsX3NldHVwKGN1ciwgaW50cyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9wY2lfcG9ydHModm9pZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisJdW5zaWduZWQgaW50IGFkZHIsIGs7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisKKwlmb3IgKGsgPSAwOyBrIDwgTUFYX1BDSTsgaysrKSB7CisKKwkJaWYgKCEoZGV2ID0gcGNpX2dldF9jbGFzcyhQQ0lfQ0xBU1NfU1RPUkFHRV9TQ1NJIDw8IDgsIGRldikpKQorCQkJYnJlYWs7CisKKwkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikpIHsKKyNpZiBkZWZpbmVkKERFQlVHX1BDSV9ERVRFQ1QpCisJCQlwcmludGsKKwkJCSAgICAoIiVzOiBkZXRlY3QsIGJ1cyAlZCwgZGV2Zm4gMHgleCwgcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLlxuIiwKKwkJCSAgICAgZHJpdmVyX25hbWUsIGRldi0+YnVzLT5udW1iZXIsIGRldi0+ZGV2Zm4pOworI2VuZGlmCisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApOworCisjaWYgZGVmaW5lZChERUJVR19QQ0lfREVURUNUKQorCQlwcmludGsoIiVzOiBkZXRlY3QsIHNlcS4gJWQsIGJ1cyAlZCwgZGV2Zm4gMHgleCwgYWRkciAweCV4LlxuIiwKKwkJICAgICAgIGRyaXZlcl9uYW1lLCBrLCBkZXYtPmJ1cy0+bnVtYmVyLCBkZXYtPmRldmZuLCBhZGRyKTsKKyNlbmRpZgorCisJCS8qIE9yZGVyIGFkZHJlc3NlcyBhY2NvcmRpbmcgdG8gcmV2X3NjYW4gdmFsdWUgKi8KKwkJaW9fcG9ydFtNQVhfSU5UX1BBUkFNICsgKHJldl9zY2FuID8gKE1BWF9QQ0kgLSBrKSA6ICgxICsgaykpXSA9CisJCSAgICBhZGRyICsgUENJX0JBU0VfQUREUkVTU18wOworCX0KKworCXBjaV9kZXZfcHV0KGRldik7CisjZW5kaWYJCQkJLyogZW5kIENPTkZJR19QQ0kgKi8KK30KKworc3RhdGljIGludCBlYXRhMnhfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCit7CisJdW5zaWduZWQgaW50IGogPSAwLCBrOworCisJdHBudC0+cHJvY19uYW1lID0gImVhdGEyeCI7CisKKwlpZiAoc3RybGVuKGJvb3Rfb3B0aW9ucykpCisJCW9wdGlvbl9zZXR1cChib290X29wdGlvbnMpOworCisjaWYgZGVmaW5lZChNT0RVTEUpCisJLyogaW9fcG9ydCBjb3VsZCBoYXZlIGJlZW4gbW9kaWZpZWQgd2hlbiBsb2FkaW5nIGFzIGEgbW9kdWxlICovCisJaWYgKGlvX3BvcnRbMF0gIT0gU0tJUCkgeworCQlzZXR1cF9kb25lID0gMTsKKwkJaW9fcG9ydFtNQVhfSU5UX1BBUkFNXSA9IDA7CisJfQorI2VuZGlmCisKKwlmb3IgKGsgPSBNQVhfSU5UX1BBUkFNOyBpb19wb3J0W2tdOyBrKyspCisJCWlmIChpb19wb3J0W2tdID09IFNLSVApCisJCQljb250aW51ZTsKKwkJZWxzZSBpZiAoaW9fcG9ydFtrXSA8PSBNQVhfSVNBX0FERFIpIHsKKwkJCWlmICghaXNhX3Byb2JlKQorCQkJCWlvX3BvcnRba10gPSBTS0lQOworCQl9IGVsc2UgaWYgKGlvX3BvcnRba10gPj0gTUlOX0VJU0FfQUREUgorCQkJICAgJiYgaW9fcG9ydFtrXSA8PSBNQVhfRUlTQV9BRERSKSB7CisJCQlpZiAoIWVpc2FfcHJvYmUpCisJCQkJaW9fcG9ydFtrXSA9IFNLSVA7CisJCX0KKworCWlmIChwY2lfcHJvYmUpIHsKKwkJaWYgKCFzZXR1cF9kb25lKQorCQkJYWRkX3BjaV9wb3J0cygpOworCQllbHNlCisJCQllbmFibGVfcGNpX3BvcnRzKCk7CisJfQorCisJZm9yIChrID0gMDsgaW9fcG9ydFtrXTsgaysrKSB7CisKKwkJaWYgKGlvX3BvcnRba10gPT0gU0tJUCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChqIDwgTUFYX0JPQVJEUyAmJiBwb3J0X2RldGVjdChpb19wb3J0W2tdLCBqLCB0cG50KSkKKwkJCWorKzsKKwl9CisKKwludW1fYm9hcmRzID0gajsKKwlyZXR1cm4gajsKK30KKworc3RhdGljIHZvaWQgbWFwX2RtYSh1bnNpZ25lZCBpbnQgaSwgc3RydWN0IGhvc3RkYXRhICpoYSkKK3sKKwl1bnNpZ25lZCBpbnQgaywgY291bnQsIHBjaV9kaXI7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ3BudDsKKwlzdHJ1Y3QgbXNjcCAqY3BwOworCXN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OworCisJY3BwID0gJmhhLT5jcFtpXTsKKwlTQ3BudCA9IGNwcC0+U0NwbnQ7CisJcGNpX2RpciA9IFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbjsKKworCWlmIChTQ3BudC0+c2Vuc2VfYnVmZmVyKQorCQljcHAtPnNlbnNlX2FkZHIgPQorCQkgICAgSDJERVYocGNpX21hcF9zaW5nbGUoaGEtPnBkZXYsIFNDcG50LT5zZW5zZV9idWZmZXIsCisJCQkgICBzaXplb2YgU0NwbnQtPnNlbnNlX2J1ZmZlciwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisKKwljcHAtPnNlbnNlX2xlbiA9IHNpemVvZiBTQ3BudC0+c2Vuc2VfYnVmZmVyOworCisJaWYgKCFTQ3BudC0+dXNlX3NnKSB7CisKKwkJLyogSWYgd2UgZ2V0IGhlcmUgd2l0aCBQQ0lfRE1BX05PTkUsIHBjaV9tYXBfc2luZ2xlIHRyaWdnZXJzIGEgQlVHKCkgKi8KKwkJaWYgKCFTQ3BudC0+cmVxdWVzdF9idWZmbGVuKQorCQkJcGNpX2RpciA9IFBDSV9ETUFfQklESVJFQ1RJT05BTDsKKworCQlpZiAoU0NwbnQtPnJlcXVlc3RfYnVmZmVyKQorCQkJY3BwLT5kYXRhX2FkZHJlc3MgPSBIMkRFVihwY2lfbWFwX3NpbmdsZShoYS0+cGRldiwKKwkJCQkJCQkJIFNDcG50LT4KKwkJCQkJCQkJIHJlcXVlc3RfYnVmZmVyLAorCQkJCQkJCQkgU0NwbnQtPgorCQkJCQkJCQkgcmVxdWVzdF9idWZmbGVuLAorCQkJCQkJCQkgcGNpX2RpcikpOworCisJCWNwcC0+ZGF0YV9sZW4gPSBIMkRFVihTQ3BudC0+cmVxdWVzdF9idWZmbGVuKTsKKwkJcmV0dXJuOworCX0KKworCXNncG50ID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKVNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwljb3VudCA9IHBjaV9tYXBfc2coaGEtPnBkZXYsIHNncG50LCBTQ3BudC0+dXNlX3NnLCBwY2lfZGlyKTsKKworCWZvciAoayA9IDA7IGsgPCBjb3VudDsgaysrKSB7CisJCWNwcC0+c2dsaXN0W2tdLmFkZHJlc3MgPSBIMkRFVihzZ19kbWFfYWRkcmVzcygmc2dwbnRba10pKTsKKwkJY3BwLT5zZ2xpc3Rba10ubnVtX2J5dGVzID0gSDJERVYoc2dfZG1hX2xlbigmc2dwbnRba10pKTsKKwl9CisKKwljcHAtPnNnID0gMTsKKwljcHAtPmRhdGFfYWRkcmVzcyA9IEgyREVWKHBjaV9tYXBfc2luZ2xlKGhhLT5wZGV2LCBjcHAtPnNnbGlzdCwKKwkJCQkJCSBTQ3BudC0+dXNlX3NnICoKKwkJCQkJCSBzaXplb2Yoc3RydWN0IHNnX2xpc3QpLAorCQkJCQkJIHBjaV9kaXIpKTsKKwljcHAtPmRhdGFfbGVuID0gSDJERVYoKFNDcG50LT51c2Vfc2cgKiBzaXplb2Yoc3RydWN0IHNnX2xpc3QpKSk7Cit9CisKK3N0YXRpYyB2b2lkIHVubWFwX2RtYSh1bnNpZ25lZCBpbnQgaSwgc3RydWN0IGhvc3RkYXRhICpoYSkKK3sKKwl1bnNpZ25lZCBpbnQgcGNpX2RpcjsKKwlzdHJ1Y3QgbXNjcCAqY3BwOworCXN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OworCisJY3BwID0gJmhhLT5jcFtpXTsKKwlTQ3BudCA9IGNwcC0+U0NwbnQ7CisJcGNpX2RpciA9IFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbjsKKworCWlmIChERVYySChjcHAtPnNlbnNlX2FkZHIpKQorCQlwY2lfdW5tYXBfc2luZ2xlKGhhLT5wZGV2LCBERVYySChjcHAtPnNlbnNlX2FkZHIpLAorCQkJCSBERVYySChjcHAtPnNlbnNlX2xlbiksIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwlpZiAoU0NwbnQtPnVzZV9zZykKKwkJcGNpX3VubWFwX3NnKGhhLT5wZGV2LCBTQ3BudC0+cmVxdWVzdF9idWZmZXIsIFNDcG50LT51c2Vfc2csCisJCQkgICAgIHBjaV9kaXIpOworCisJaWYgKCFERVYySChjcHAtPmRhdGFfbGVuKSkKKwkJcGNpX2RpciA9IFBDSV9ETUFfQklESVJFQ1RJT05BTDsKKworCWlmIChERVYySChjcHAtPmRhdGFfYWRkcmVzcykpCisJCXBjaV91bm1hcF9zaW5nbGUoaGEtPnBkZXYsIERFVjJIKGNwcC0+ZGF0YV9hZGRyZXNzKSwKKwkJCQkgREVWMkgoY3BwLT5kYXRhX2xlbiksIHBjaV9kaXIpOworfQorCitzdGF0aWMgdm9pZCBzeW5jX2RtYSh1bnNpZ25lZCBpbnQgaSwgc3RydWN0IGhvc3RkYXRhICpoYSkKK3sKKwl1bnNpZ25lZCBpbnQgcGNpX2RpcjsKKwlzdHJ1Y3QgbXNjcCAqY3BwOworCXN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OworCisJY3BwID0gJmhhLT5jcFtpXTsKKwlTQ3BudCA9IGNwcC0+U0NwbnQ7CisJcGNpX2RpciA9IFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbjsKKworCWlmIChERVYySChjcHAtPnNlbnNlX2FkZHIpKQorCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoaGEtPnBkZXYsIERFVjJIKGNwcC0+c2Vuc2VfYWRkciksCisJCQkJCSAgICBERVYySChjcHAtPnNlbnNlX2xlbiksCisJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJaWYgKFNDcG50LT51c2Vfc2cpCisJCXBjaV9kbWFfc3luY19zZ19mb3JfY3B1KGhhLT5wZGV2LCBTQ3BudC0+cmVxdWVzdF9idWZmZXIsCisJCQkJCVNDcG50LT51c2Vfc2csIHBjaV9kaXIpOworCisJaWYgKCFERVYySChjcHAtPmRhdGFfbGVuKSkKKwkJcGNpX2RpciA9IFBDSV9ETUFfQklESVJFQ1RJT05BTDsKKworCWlmIChERVYySChjcHAtPmRhdGFfYWRkcmVzcykpCisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShoYS0+cGRldiwKKwkJCQkJICAgIERFVjJIKGNwcC0+ZGF0YV9hZGRyZXNzKSwKKwkJCQkJICAgIERFVjJIKGNwcC0+ZGF0YV9sZW4pLCBwY2lfZGlyKTsKK30KKworc3RhdGljIHZvaWQgc2NzaV90b19kZXZfZGlyKHVuc2lnbmVkIGludCBpLCBzdHJ1Y3QgaG9zdGRhdGEgKmhhKQoreworCXVuc2lnbmVkIGludCBrOworCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGF0YV9vdXRfY21kc1tdID0geworCQkweDBhLCAweDJhLCAweDE1LCAweDU1LCAweDA0LCAweDA3LCAweDE4LCAweDFkLCAweDI0LCAweDJlLAorCQkweDMwLCAweDMxLCAweDMyLCAweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNkLCAweDNmLCAweDQwLAorCQkweDQxLCAweDRjLCAweGFhLCAweGFlLCAweGIwLCAweGIxLCAweGIyLCAweGI2LCAweGVhLCAweDFiLCAweDVkCisJfTsKKworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRhdGFfbm9uZV9jbWRzW10gPSB7CisJCTB4MDEsIDB4MGIsIDB4MTAsIDB4MTEsIDB4MTMsIDB4MTYsIDB4MTcsIDB4MTksIDB4MmIsIDB4MWUsCisJCTB4MmMsIDB4YWMsIDB4MmYsIDB4YWYsIDB4MzMsIDB4YjMsIDB4MzUsIDB4MzYsIDB4NDUsIDB4NDcsCisJCTB4NDgsIDB4NDksIDB4YTksIDB4NGIsIDB4YTUsIDB4YTYsIDB4YjUsIDB4MDAKKwl9OworCisJc3RydWN0IG1zY3AgKmNwcDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudDsKKworCWNwcCA9ICZoYS0+Y3BbaV07CisJU0NwbnQgPSBjcHAtPlNDcG50OworCisJaWYgKFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKKwkJY3BwLT5kaW4gPSAxOworCQljcHAtPmRvdXQgPSAwOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgeworCQljcHAtPmRpbiA9IDA7CisJCWNwcC0+ZG91dCA9IDE7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfTk9ORSkgeworCQljcHAtPmRpbiA9IDA7CisJCWNwcC0+ZG91dCA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAoU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uICE9IERNQV9CSURJUkVDVElPTkFMKQorCQlwYW5pYygiJXM6IHFjb21tLCBpbnZhbGlkIFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbi5cbiIsCisJCQkJaGEtPmJvYXJkX25hbWUpOworCisJZm9yIChrID0gMDsgayA8IEFSUkFZX1NJWkUoZGF0YV9vdXRfY21kcyk7IGsrKykKKwkJaWYgKFNDcG50LT5jbW5kWzBdID09IGRhdGFfb3V0X2NtZHNba10pIHsKKwkJCWNwcC0+ZG91dCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJaWYgKChjcHAtPmRpbiA9ICFjcHAtPmRvdXQpKQorCQlmb3IgKGsgPSAwOyBrIDwgQVJSQVlfU0laRShkYXRhX25vbmVfY21kcyk7IGsrKykKKwkJCWlmIChTQ3BudC0+Y21uZFswXSA9PSBkYXRhX25vbmVfY21kc1trXSkgeworCQkJCWNwcC0+ZGluID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKworfQorCitzdGF0aWMgaW50IGVhdGEyeF9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsCisJCQkgICAgICAgdm9pZCAoKmRvbmUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gU0NwbnQtPmRldmljZS0+aG9zdDsKKwlzdHJ1Y3QgaG9zdGRhdGEgKmhhID0gKHN0cnVjdCBob3N0ZGF0YSAqKXNob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBpbnQgaSwgazsKKwlzdHJ1Y3QgbXNjcCAqY3BwOworCisJaWYgKFNDcG50LT5ob3N0X3NjcmliYmxlKQorCQlwYW5pYygiJXM6IHFjb21tLCBwaWQgJWxkLCBTQ3BudCAlcCBhbHJlYWR5IGFjdGl2ZS5cbiIsCisJCSAgICAgIGhhLT5ib2FyZF9uYW1lLCBTQ3BudC0+cGlkLCBTQ3BudCk7CisKKwkvKiBpIGlzIHRoZSBtYWlsYm94IG51bWJlciwgbG9vayBmb3IgdGhlIGZpcnN0IGZyZWUgbWFpbGJveAorCSAgIHN0YXJ0aW5nIGZyb20gbGFzdF9jcF91c2VkICovCisJaSA9IGhhLT5sYXN0X2NwX3VzZWQgKyAxOworCisJZm9yIChrID0gMDsgayA8IHNob3N0LT5jYW5fcXVldWU7IGsrKywgaSsrKSB7CisJCWlmIChpID49IHNob3N0LT5jYW5fcXVldWUpCisJCQlpID0gMDsKKwkJaWYgKGhhLT5jcF9zdGF0W2ldID09IEZSRUUpIHsKKwkJCWhhLT5sYXN0X2NwX3VzZWQgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoayA9PSBzaG9zdC0+Y2FuX3F1ZXVlKSB7CisJCXByaW50aygiJXM6IHFjb21tLCBubyBmcmVlIG1haWxib3guXG4iLCBoYS0+Ym9hcmRfbmFtZSk7CisJCXJldHVybiAxOworCX0KKworCS8qIFNldCBwb2ludGVyIHRvIGNvbnRyb2wgcGFja2V0IHN0cnVjdHVyZSAqLworCWNwcCA9ICZoYS0+Y3BbaV07CisKKwltZW1zZXQoY3BwLCAwLCBzaXplb2Yoc3RydWN0IG1zY3ApIC0gQ1BfVEFJTF9TSVpFKTsKKworCS8qIFNldCBwb2ludGVyIHRvIHN0YXR1cyBwYWNrZXQgc3RydWN0dXJlLCBCaWcgRW5kaWFuIGZvcm1hdCAqLworCWNwcC0+c3BfZG1hX2FkZHIgPSBIMkRFVihoYS0+c3BfZG1hX2FkZHIpOworCisJU0NwbnQtPnNjc2lfZG9uZSA9IGRvbmU7CisJY3BwLT5jcHBfaW5kZXggPSBpOworCVNDcG50LT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikmY3BwLT5jcHBfaW5kZXg7CisKKwlpZiAoZG9fdHJhY2UpCisJCXByaW50aygiJXM6IHFjb21tLCBtYm94ICVkLCB0YXJnZXQgJWQuJWQ6JWQsIHBpZCAlbGQuXG4iLAorCQkgICAgICAgaGEtPmJvYXJkX25hbWUsIGksIFNDcG50LT5kZXZpY2UtPmNoYW5uZWwsIFNDcG50LT5kZXZpY2UtPmlkLAorCQkgICAgICAgU0NwbnQtPmRldmljZS0+bHVuLCBTQ3BudC0+cGlkKTsKKworCWNwcC0+cmVxc2VuID0gMTsKKwljcHAtPmRpc3ByaSA9IDE7CisjaWYgMAorCWlmIChTQ3BudC0+ZGV2aWNlLT50eXBlID09IFRZUEVfVEFQRSkKKwkJY3BwLT5oYmFjaSA9IDE7CisjZW5kaWYKKwljcHAtPm9uZSA9IDE7CisJY3BwLT5jaGFubmVsID0gU0NwbnQtPmRldmljZS0+Y2hhbm5lbDsKKwljcHAtPnRhcmdldCA9IFNDcG50LT5kZXZpY2UtPmlkOworCWNwcC0+bHVuID0gU0NwbnQtPmRldmljZS0+bHVuOworCWNwcC0+U0NwbnQgPSBTQ3BudDsKKwltZW1jcHkoY3BwLT5jZGIsIFNDcG50LT5jbW5kLCBTQ3BudC0+Y21kX2xlbik7CisKKwkvKiBVc2UgZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uICovCisJc2NzaV90b19kZXZfZGlyKGksIGhhKTsKKworCS8qIE1hcCBETUEgYnVmZmVycyBhbmQgU0cgbGlzdCAqLworCW1hcF9kbWEoaSwgaGEpOworCisJaWYgKGxpbmtlZF9jb21tICYmIFNDcG50LT5kZXZpY2UtPnF1ZXVlX2RlcHRoID4gMgorCSAgICAmJiBUTERFVihTQ3BudC0+ZGV2aWNlLT50eXBlKSkgeworCQloYS0+Y3Bfc3RhdFtpXSA9IFJFQURZOworCQlmbHVzaF9kZXYoU0NwbnQtPmRldmljZSwgU0NwbnQtPnJlcXVlc3QtPnNlY3RvciwgaGEsIDApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBTZW5kIGNvbnRyb2wgcGFja2V0IHRvIHRoZSBib2FyZCAqLworCWlmIChkb19kbWEoc2hvc3QtPmlvX3BvcnQsIGNwcC0+Y3BfZG1hX2FkZHIsIFNFTkRfQ1BfRE1BKSkgeworCQl1bm1hcF9kbWEoaSwgaGEpOworCQlTQ3BudC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJCXByaW50aygiJXM6IHFjb21tLCB0YXJnZXQgJWQuJWQ6JWQsIHBpZCAlbGQsIGFkYXB0ZXIgYnVzeS5cbiIsCisJCSAgICAgICBoYS0+Ym9hcmRfbmFtZSwgU0NwbnQtPmRldmljZS0+Y2hhbm5lbCwgU0NwbnQtPmRldmljZS0+aWQsCisJCSAgICAgICBTQ3BudC0+ZGV2aWNlLT5sdW4sIFNDcG50LT5waWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwloYS0+Y3Bfc3RhdFtpXSA9IElOX1VTRTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlYXRhMnhfZWhfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqU0NhcmcpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBTQ2FyZy0+ZGV2aWNlLT5ob3N0OworCXN0cnVjdCBob3N0ZGF0YSAqaGEgPSAoc3RydWN0IGhvc3RkYXRhICopc2hvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKFNDYXJnLT5ob3N0X3NjcmliYmxlID09IE5VTEwpIHsKKwkJcHJpbnRrKCIlczogYWJvcnQsIHRhcmdldCAlZC4lZDolZCwgcGlkICVsZCBpbmFjdGl2ZS5cbiIsCisJCSAgICAgICBoYS0+Ym9hcmRfbmFtZSwgU0NhcmctPmRldmljZS0+Y2hhbm5lbCwgU0NhcmctPmRldmljZS0+aWQsCisJCSAgICAgICBTQ2FyZy0+ZGV2aWNlLT5sdW4sIFNDYXJnLT5waWQpOworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisKKwlpID0gKih1bnNpZ25lZCBpbnQgKilTQ2FyZy0+aG9zdF9zY3JpYmJsZTsKKwlwcmludGsoIiVzOiBhYm9ydCwgbWJveCAlZCwgdGFyZ2V0ICVkLiVkOiVkLCBwaWQgJWxkLlxuIiwKKwkgICAgICAgaGEtPmJvYXJkX25hbWUsIGksIFNDYXJnLT5kZXZpY2UtPmNoYW5uZWwsIFNDYXJnLT5kZXZpY2UtPmlkLAorCSAgICAgICBTQ2FyZy0+ZGV2aWNlLT5sdW4sIFNDYXJnLT5waWQpOworCisJaWYgKGkgPj0gc2hvc3QtPmNhbl9xdWV1ZSkKKwkJcGFuaWMoIiVzOiBhYm9ydCwgaW52YWxpZCBTQ2FyZy0+aG9zdF9zY3JpYmJsZS5cbiIsIGhhLT5ib2FyZF9uYW1lKTsKKworCWlmICh3YWl0X29uX2J1c3koc2hvc3QtPmlvX3BvcnQsIE1BWExPT1ApKSB7CisJCXByaW50aygiJXM6IGFib3J0LCB0aW1lb3V0IGVycm9yLlxuIiwgaGEtPmJvYXJkX25hbWUpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCWlmIChoYS0+Y3Bfc3RhdFtpXSA9PSBGUkVFKSB7CisJCXByaW50aygiJXM6IGFib3J0LCBtYm94ICVkIGlzIGZyZWUuXG4iLCBoYS0+Ym9hcmRfbmFtZSwgaSk7CisJCXJldHVybiBTVUNDRVNTOworCX0KKworCWlmIChoYS0+Y3Bfc3RhdFtpXSA9PSBJTl9VU0UpIHsKKwkJcHJpbnRrKCIlczogYWJvcnQsIG1ib3ggJWQgaXMgaW4gdXNlLlxuIiwgaGEtPmJvYXJkX25hbWUsIGkpOworCisJCWlmIChTQ2FyZyAhPSBoYS0+Y3BbaV0uU0NwbnQpCisJCQlwYW5pYygiJXM6IGFib3J0LCBtYm94ICVkLCBTQ2FyZyAlcCwgY3AgU0NwbnQgJXAuXG4iLAorCQkJICAgICAgaGEtPmJvYXJkX25hbWUsIGksIFNDYXJnLCBoYS0+Y3BbaV0uU0NwbnQpOworCisJCWlmIChpbmIoc2hvc3QtPmlvX3BvcnQgKyBSRUdfQVVYX1NUQVRVUykgJiBJUlFfQVNTRVJURUQpCisJCQlwcmludGsoIiVzOiBhYm9ydCwgbWJveCAlZCwgaW50ZXJydXB0IHBlbmRpbmcuXG4iLAorCQkJICAgICAgIGhhLT5ib2FyZF9uYW1lLCBpKTsKKworCQlpZiAoU0NhcmctPmVoX3N0YXRlID09IFNDU0lfU1RBVEVfVElNRU9VVCkgeworCQkJdW5tYXBfZG1hKGksIGhhKTsKKwkJCVNDYXJnLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwkJCWhhLT5jcF9zdGF0W2ldID0gRlJFRTsKKwkJCXByaW50aworCQkJICAgICgiJXMsIGFib3J0LCBtYm94ICVkLCBlaF9zdGF0ZSB0aW1lb3V0LCBwaWQgJWxkLlxuIiwKKwkJCSAgICAgaGEtPmJvYXJkX25hbWUsIGksIFNDYXJnLT5waWQpOworCQkJcmV0dXJuIFNVQ0NFU1M7CisJCX0KKworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCWlmIChoYS0+Y3Bfc3RhdFtpXSA9PSBJTl9SRVNFVCkgeworCQlwcmludGsoIiVzOiBhYm9ydCwgbWJveCAlZCBpcyBpbiByZXNldC5cbiIsIGhhLT5ib2FyZF9uYW1lLCBpKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlpZiAoaGEtPmNwX3N0YXRbaV0gPT0gTE9DS0VEKSB7CisJCXByaW50aygiJXM6IGFib3J0LCBtYm94ICVkIGlzIGxvY2tlZC5cbiIsIGhhLT5ib2FyZF9uYW1lLCBpKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCisJaWYgKGhhLT5jcF9zdGF0W2ldID09IFJFQURZIHx8IGhhLT5jcF9zdGF0W2ldID09IEFCT1JUSU5HKSB7CisJCXVubWFwX2RtYShpLCBoYSk7CisJCVNDYXJnLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCVNDYXJnLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwkJaGEtPmNwX3N0YXRbaV0gPSBGUkVFOworCQlwcmludGsoIiVzLCBhYm9ydCwgbWJveCAlZCByZWFkeSwgRElEX0FCT1JULCBwaWQgJWxkIGRvbmUuXG4iLAorCQkgICAgICAgaGEtPmJvYXJkX25hbWUsIGksIFNDYXJnLT5waWQpOworCQlTQ2FyZy0+c2NzaV9kb25lKFNDYXJnKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCisJcGFuaWMoIiVzOiBhYm9ydCwgbWJveCAlZCwgaW52YWxpZCBjcF9zdGF0LlxuIiwgaGEtPmJvYXJkX25hbWUsIGkpOworfQorCitzdGF0aWMgaW50IGVhdGEyeF9laF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDYXJnKQoreworCXVuc2lnbmVkIGludCBpLCB0aW1lLCBrLCBjLCBsaW1pdCA9IDA7CisJaW50IGFyZ19kb25lID0gMDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IFNDYXJnLT5kZXZpY2UtPmhvc3Q7CisJc3RydWN0IGhvc3RkYXRhICpoYSA9IChzdHJ1Y3QgaG9zdGRhdGEgKilzaG9zdC0+aG9zdGRhdGE7CisKKwlwcmludGsoIiVzOiByZXNldCwgZW50ZXIsIHRhcmdldCAlZC4lZDolZCwgcGlkICVsZC5cbiIsCisJICAgICAgIGhhLT5ib2FyZF9uYW1lLCBTQ2FyZy0+ZGV2aWNlLT5jaGFubmVsLCBTQ2FyZy0+ZGV2aWNlLT5pZCwKKwkgICAgICAgU0NhcmctPmRldmljZS0+bHVuLCBTQ2FyZy0+cGlkKTsKKworCWlmIChTQ2FyZy0+aG9zdF9zY3JpYmJsZSA9PSBOVUxMKQorCQlwcmludGsoIiVzOiByZXNldCwgcGlkICVsZCBpbmFjdGl2ZS5cbiIsIGhhLT5ib2FyZF9uYW1lLCBTQ2FyZy0+cGlkKTsKKworCWlmIChoYS0+aW5fcmVzZXQpIHsKKwkJcHJpbnRrKCIlczogcmVzZXQsIGV4aXQsIGFscmVhZHkgaW4gcmVzZXQuXG4iLCBoYS0+Ym9hcmRfbmFtZSk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJaWYgKHdhaXRfb25fYnVzeShzaG9zdC0+aW9fcG9ydCwgTUFYTE9PUCkpIHsKKwkJcHJpbnRrKCIlczogcmVzZXQsIGV4aXQsIHRpbWVvdXQgZXJyb3IuXG4iLCBoYS0+Ym9hcmRfbmFtZSk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJaGEtPnJldHJpZXMgPSAwOworCisJZm9yIChjID0gMDsgYyA8PSBzaG9zdC0+bWF4X2NoYW5uZWw7IGMrKykKKwkJZm9yIChrID0gMDsgayA8IHNob3N0LT5tYXhfaWQ7IGsrKykgeworCQkJaGEtPnRhcmdldF9yZWRvW2tdW2NdID0gMTsKKwkJCWhhLT50YXJnZXRfdG9ba11bY10gPSAwOworCQl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2hvc3QtPmNhbl9xdWV1ZTsgaSsrKSB7CisKKwkJaWYgKGhhLT5jcF9zdGF0W2ldID09IEZSRUUpCisJCQljb250aW51ZTsKKworCQlpZiAoaGEtPmNwX3N0YXRbaV0gPT0gTE9DS0VEKSB7CisJCQloYS0+Y3Bfc3RhdFtpXSA9IEZSRUU7CisJCQlwcmludGsoIiVzOiByZXNldCwgbG9ja2VkIG1ib3ggJWQgZm9yY2VkIGZyZWUuXG4iLAorCQkJICAgICAgIGhhLT5ib2FyZF9uYW1lLCBpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCEoU0NwbnQgPSBoYS0+Y3BbaV0uU0NwbnQpKQorCQkJcGFuaWMoIiVzOiByZXNldCwgbWJveCAlZCwgU0NwbnQgPT0gTlVMTC5cbiIsIGhhLT5ib2FyZF9uYW1lLCBpKTsKKworCQlpZiAoaGEtPmNwX3N0YXRbaV0gPT0gUkVBRFkgfHwgaGEtPmNwX3N0YXRbaV0gPT0gQUJPUlRJTkcpIHsKKwkJCWhhLT5jcF9zdGF0W2ldID0gQUJPUlRJTkc7CisJCQlwcmludGsoIiVzOiByZXNldCwgbWJveCAlZCBhYm9ydGluZywgcGlkICVsZC5cbiIsCisJCQkgICAgICAgaGEtPmJvYXJkX25hbWUsIGksIFNDcG50LT5waWQpOworCQl9CisKKwkJZWxzZSB7CisJCQloYS0+Y3Bfc3RhdFtpXSA9IElOX1JFU0VUOworCQkJcHJpbnRrKCIlczogcmVzZXQsIG1ib3ggJWQgaW4gcmVzZXQsIHBpZCAlbGQuXG4iLAorCQkJICAgICAgIGhhLT5ib2FyZF9uYW1lLCBpLCBTQ3BudC0+cGlkKTsKKwkJfQorCisJCWlmIChTQ3BudC0+aG9zdF9zY3JpYmJsZSA9PSBOVUxMKQorCQkJcGFuaWMoIiVzOiByZXNldCwgbWJveCAlZCwgZ2FyYmxlZCBTQ3BudC5cbiIsIGhhLT5ib2FyZF9uYW1lLCBpKTsKKworCQlpZiAoKih1bnNpZ25lZCBpbnQgKilTQ3BudC0+aG9zdF9zY3JpYmJsZSAhPSBpKQorCQkJcGFuaWMoIiVzOiByZXNldCwgbWJveCAlZCwgaW5kZXggbWlzbWF0Y2guXG4iLCBoYS0+Ym9hcmRfbmFtZSwgaSk7CisKKwkJaWYgKFNDcG50LT5zY3NpX2RvbmUgPT0gTlVMTCkKKwkJCXBhbmljKCIlczogcmVzZXQsIG1ib3ggJWQsIFNDcG50LT5zY3NpX2RvbmUgPT0gTlVMTC5cbiIsCisJCQkgICAgICBoYS0+Ym9hcmRfbmFtZSwgaSk7CisKKwkJaWYgKFNDcG50ID09IFNDYXJnKQorCQkJYXJnX2RvbmUgPSAxOworCX0KKworCWlmIChkb19kbWEoc2hvc3QtPmlvX3BvcnQsIDAsIFJFU0VUX1BJTykpIHsKKwkJcHJpbnRrKCIlczogcmVzZXQsIGNhbm5vdCByZXNldCwgdGltZW91dCBlcnJvci5cbiIsIGhhLT5ib2FyZF9uYW1lKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlwcmludGsoIiVzOiByZXNldCwgYm9hcmQgcmVzZXQgZG9uZSwgZW5hYmxpbmcgaW50ZXJydXB0cy5cbiIsIGhhLT5ib2FyZF9uYW1lKTsKKworI2lmIGRlZmluZWQoREVCVUdfUkVTRVQpCisJZG9fdHJhY2UgPSAxOworI2VuZGlmCisKKwloYS0+aW5fcmVzZXQgPSAxOworCisJc3Bpbl91bmxvY2tfaXJxKHNob3N0LT5ob3N0X2xvY2spOworCXRpbWUgPSBqaWZmaWVzOworCXdoaWxlICgoamlmZmllcyAtIHRpbWUpIDwgKDEwICogSFopICYmIGxpbWl0KysgPCAyMDAwMDApCisJCXVkZWxheSgxMDBMKTsKKwlzcGluX2xvY2tfaXJxKHNob3N0LT5ob3N0X2xvY2spOworCisJcHJpbnRrKCIlczogcmVzZXQsIGludGVycnVwdHMgZGlzYWJsZWQsIGxvb3BzICVkLlxuIiwgaGEtPmJvYXJkX25hbWUsIGxpbWl0KTsKKworCWZvciAoaSA9IDA7IGkgPCBzaG9zdC0+Y2FuX3F1ZXVlOyBpKyspIHsKKworCQlpZiAoaGEtPmNwX3N0YXRbaV0gPT0gSU5fUkVTRVQpIHsKKwkJCVNDcG50ID0gaGEtPmNwW2ldLlNDcG50OworCQkJdW5tYXBfZG1hKGksIGhhKTsKKwkJCVNDcG50LT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7CisJCQlTQ3BudC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisKKwkJCS8qIFRoaXMgbWFpbGJveCBpcyBzdGlsbCB3YWl0aW5nIGZvciBpdHMgaW50ZXJydXB0ICovCisJCQloYS0+Y3Bfc3RhdFtpXSA9IExPQ0tFRDsKKworCQkJcHJpbnRrCisJCQkgICAgKCIlcywgcmVzZXQsIG1ib3ggJWQgbG9ja2VkLCBESURfUkVTRVQsIHBpZCAlbGQgZG9uZS5cbiIsCisJCQkgICAgIGhhLT5ib2FyZF9uYW1lLCBpLCBTQ3BudC0+cGlkKTsKKwkJfQorCisJCWVsc2UgaWYgKGhhLT5jcF9zdGF0W2ldID09IEFCT1JUSU5HKSB7CisJCQlTQ3BudCA9IGhhLT5jcFtpXS5TQ3BudDsKKwkJCXVubWFwX2RtYShpLCBoYSk7CisJCQlTQ3BudC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQkJU0NwbnQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCisJCQkvKiBUaGlzIG1haWxib3ggd2FzIG5ldmVyIHF1ZXVlZCB0byB0aGUgYWRhcHRlciAqLworCQkJaGEtPmNwX3N0YXRbaV0gPSBGUkVFOworCisJCQlwcmludGsKKwkJCSAgICAoIiVzLCByZXNldCwgbWJveCAlZCBhYm9ydGluZywgRElEX1JFU0VULCBwaWQgJWxkIGRvbmUuXG4iLAorCQkJICAgICBoYS0+Ym9hcmRfbmFtZSwgaSwgU0NwbnQtPnBpZCk7CisJCX0KKworCQllbHNlCisJCQkvKiBBbnkgb3RoZXIgbWFpbGJveCBoYXMgYWxyZWFkeSBiZWVuIHNldCBmcmVlIGJ5IGludGVycnVwdCAqLworCQkJY29udGludWU7CisKKwkJU0NwbnQtPnNjc2lfZG9uZShTQ3BudCk7CisJfQorCisJaGEtPmluX3Jlc2V0ID0gMDsKKwlkb190cmFjZSA9IDA7CisKKwlpZiAoYXJnX2RvbmUpCisJCXByaW50aygiJXM6IHJlc2V0LCBleGl0LCBwaWQgJWxkIGRvbmUuXG4iLCBoYS0+Ym9hcmRfbmFtZSwgU0NhcmctPnBpZCk7CisJZWxzZQorCQlwcmludGsoIiVzOiByZXNldCwgZXhpdC5cbiIsIGhhLT5ib2FyZF9uYW1lKTsKKworCXJldHVybiBTVUNDRVNTOworfQorCitpbnQgZWF0YTJ4X2Jpb3NfcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkgICAgICBzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICpka2luZm8pCit7CisJdW5zaWduZWQgaW50IHNpemUgPSBjYXBhY2l0eTsKKworCWlmIChleHRfdHJhbiB8fCAoc2NzaWNhbV9iaW9zX3BhcmFtKGJkZXYsIGNhcGFjaXR5LCBka2luZm8pIDwgMCkpIHsKKwkJZGtpbmZvWzBdID0gMjU1OworCQlka2luZm9bMV0gPSA2MzsKKwkJZGtpbmZvWzJdID0gc2l6ZSAvIChka2luZm9bMF0gKiBka2luZm9bMV0pOworCX0KKyNpZiBkZWZpbmVkIChERUJVR19HRU9NRVRSWSkKKwlwcmludGsoIiVzOiBiaW9zX3BhcmFtLCBoZWFkPSVkLCBzZWM9JWQsIGN5bD0lZC5cbiIsIGRyaXZlcl9uYW1lLAorCSAgICAgICBka2luZm9bMF0sIGRraW5mb1sxXSwgZGtpbmZvWzJdKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNvcnQodW5zaWduZWQgbG9uZyBza1tdLCB1bnNpZ25lZCBpbnQgZGFbXSwgdW5zaWduZWQgaW50IG4sCisJCSB1bnNpZ25lZCBpbnQgcmV2KQoreworCXVuc2lnbmVkIGludCBpLCBqLCBrLCB5OworCXVuc2lnbmVkIGxvbmcgeDsKKworCWZvciAoaSA9IDA7IGkgPCBuIC0gMTsgaSsrKSB7CisJCWsgPSBpOworCisJCWZvciAoaiA9IGsgKyAxOyBqIDwgbjsgaisrKQorCQkJaWYgKHJldikgeworCQkJCWlmIChza1tqXSA+IHNrW2tdKQorCQkJCQlrID0gajsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHNrW2pdIDwgc2tba10pCisJCQkJCWsgPSBqOworCQkJfQorCisJCWlmIChrICE9IGkpIHsKKwkJCXggPSBza1trXTsKKwkJCXNrW2tdID0gc2tbaV07CisJCQlza1tpXSA9IHg7CisJCQl5ID0gZGFba107CisJCQlkYVtrXSA9IGRhW2ldOworCQkJZGFbaV0gPSB5OworCQl9CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHJlb3JkZXIoc3RydWN0IGhvc3RkYXRhICpoYSwgdW5zaWduZWQgbG9uZyBjdXJzZWMsCisJCSAgIHVuc2lnbmVkIGludCBpaGRsciwgdW5zaWduZWQgaW50IGlsW10sIHVuc2lnbmVkIGludCBuX3JlYWR5KQoreworCXN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OworCXN0cnVjdCBtc2NwICpjcHA7CisJdW5zaWduZWQgaW50IGssIG47CisJdW5zaWduZWQgaW50IHJldiA9IDAsIHMgPSAxLCByID0gMTsKKwl1bnNpZ25lZCBpbnQgaW5wdXRfb25seSA9IDEsIG92ZXJsYXAgPSAwOworCXVuc2lnbmVkIGxvbmcgc2xbbl9yZWFkeV0sIHBsW25fcmVhZHldLCBsbFtuX3JlYWR5XTsKKwl1bnNpZ25lZCBsb25nIG1heHNlYyA9IDAsIG1pbnNlYyA9IFVMT05HX01BWCwgc2VlayA9IDAsIGlzZWVrID0gMDsKKwl1bnNpZ25lZCBsb25nIGlvc2VlayA9IDA7CisKKwlzdGF0aWMgdW5zaWduZWQgaW50IGZsdXNoY291bnQgPSAwLCBiYXRjaGNvdW50ID0gMCwgc29ydGNvdW50ID0gMDsKKwlzdGF0aWMgdW5zaWduZWQgaW50IHJlYWR5Y291bnQgPSAwLCBvdmxjb3VudCA9IDAsIGlucHV0Y291bnQgPSAwOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgcmVhZHlzb3J0ZWQgPSAwLCByZXZjb3VudCA9IDA7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgc2Vla3NvcnRlZCA9IDAsIHNlZWtub3NvcnQgPSAwOworCisJaWYgKGxpbmtfc3RhdGlzdGljcyAmJiAhKCsrZmx1c2hjb3VudCAlIGxpbmtfc3RhdGlzdGljcykpCisJCXByaW50aygiZmMgJWQgYmMgJWQgaWMgJWQgb2MgJWQgcmMgJWQgcnMgJWQgc2MgJWQgcmUgJWQiCisJCSAgICAgICAiIGF2ICVsZEsgYXMgJWxkSy5cbiIsIGZsdXNoY291bnQsIGJhdGNoY291bnQsCisJCSAgICAgICBpbnB1dGNvdW50LCBvdmxjb3VudCwgcmVhZHljb3VudCwgcmVhZHlzb3J0ZWQsIHNvcnRjb3VudCwKKwkJICAgICAgIHJldmNvdW50LCBzZWVrbm9zb3J0IC8gKHJlYWR5Y291bnQgKyAxKSwKKwkJICAgICAgIHNlZWtzb3J0ZWQgLyAocmVhZHljb3VudCArIDEpKTsKKworCWlmIChuX3JlYWR5IDw9IDEpCisJCXJldHVybiAwOworCisJZm9yIChuID0gMDsgbiA8IG5fcmVhZHk7IG4rKykgeworCQlrID0gaWxbbl07CisJCWNwcCA9ICZoYS0+Y3Bba107CisJCVNDcG50ID0gY3BwLT5TQ3BudDsKKworCQlpZiAoIWNwcC0+ZGluKQorCQkJaW5wdXRfb25seSA9IDA7CisKKwkJaWYgKFNDcG50LT5yZXF1ZXN0LT5zZWN0b3IgPCBtaW5zZWMpCisJCQltaW5zZWMgPSBTQ3BudC0+cmVxdWVzdC0+c2VjdG9yOworCQlpZiAoU0NwbnQtPnJlcXVlc3QtPnNlY3RvciA+IG1heHNlYykKKwkJCW1heHNlYyA9IFNDcG50LT5yZXF1ZXN0LT5zZWN0b3I7CisKKwkJc2xbbl0gPSBTQ3BudC0+cmVxdWVzdC0+c2VjdG9yOworCQlpb3NlZWsgKz0gU0NwbnQtPnJlcXVlc3QtPm5yX3NlY3RvcnM7CisKKwkJaWYgKCFuKQorCQkJY29udGludWU7CisKKwkJaWYgKHNsW25dIDwgc2xbbiAtIDFdKQorCQkJcyA9IDA7CisJCWlmIChzbFtuXSA+IHNsW24gLSAxXSkKKwkJCXIgPSAwOworCisJCWlmIChsaW5rX3N0YXRpc3RpY3MpIHsKKwkJCWlmIChzbFtuXSA+IHNsW24gLSAxXSkKKwkJCQlzZWVrICs9IHNsW25dIC0gc2xbbiAtIDFdOworCQkJZWxzZQorCQkJCXNlZWsgKz0gc2xbbiAtIDFdIC0gc2xbbl07CisJCX0KKworCX0KKworCWlmIChsaW5rX3N0YXRpc3RpY3MpIHsKKwkJaWYgKGN1cnNlYyA+IHNsWzBdKQorCQkJc2VlayArPSBjdXJzZWMgLSBzbFswXTsKKwkJZWxzZQorCQkJc2VlayArPSBzbFswXSAtIGN1cnNlYzsKKwl9CisKKwlpZiAoY3Vyc2VjID4gKChtYXhzZWMgKyBtaW5zZWMpIC8gMikpCisJCXJldiA9IDE7CisKKwlpZiAoaW9zZWVrID4gKChtYXhzZWMgLSBtaW5zZWMpIC8gMikpCisJCXJldiA9IDA7CisKKwlpZiAoISgocmV2ICYmIHIpIHx8ICghcmV2ICYmIHMpKSkKKwkJc29ydChzbCwgaWwsIG5fcmVhZHksIHJldik7CisKKwlpZiAoIWlucHV0X29ubHkpCisJCWZvciAobiA9IDA7IG4gPCBuX3JlYWR5OyBuKyspIHsKKwkJCWsgPSBpbFtuXTsKKwkJCWNwcCA9ICZoYS0+Y3Bba107CisJCQlTQ3BudCA9IGNwcC0+U0NwbnQ7CisJCQlsbFtuXSA9IFNDcG50LT5yZXF1ZXN0LT5ucl9zZWN0b3JzOworCQkJcGxbbl0gPSBTQ3BudC0+cGlkOworCisJCQlpZiAoIW4pCisJCQkJY29udGludWU7CisKKwkJCWlmICgoc2xbbl0gPT0gc2xbbiAtIDFdKQorCQkJICAgIHx8ICghcmV2ICYmICgoc2xbbiAtIDFdICsgbGxbbiAtIDFdKSA+IHNsW25dKSkKKwkJCSAgICB8fCAocmV2ICYmICgoc2xbbl0gKyBsbFtuXSkgPiBzbFtuIC0gMV0pKSkKKwkJCQlvdmVybGFwID0gMTsKKwkJfQorCisJaWYgKG92ZXJsYXApCisJCXNvcnQocGwsIGlsLCBuX3JlYWR5LCAwKTsKKworCWlmIChsaW5rX3N0YXRpc3RpY3MpIHsKKwkJaWYgKGN1cnNlYyA+IHNsWzBdKQorCQkJaXNlZWsgPSBjdXJzZWMgLSBzbFswXTsKKwkJZWxzZQorCQkJaXNlZWsgPSBzbFswXSAtIGN1cnNlYzsKKwkJYmF0Y2hjb3VudCsrOworCQlyZWFkeWNvdW50ICs9IG5fcmVhZHk7CisJCXNlZWtub3NvcnQgKz0gc2VlayAvIDEwMjQ7CisJCWlmIChpbnB1dF9vbmx5KQorCQkJaW5wdXRjb3VudCsrOworCQlpZiAob3ZlcmxhcCkgeworCQkJb3ZsY291bnQrKzsKKwkJCXNlZWtzb3J0ZWQgKz0gaXNlZWsgLyAxMDI0OworCQl9IGVsc2UKKwkJCXNlZWtzb3J0ZWQgKz0gKGlzZWVrICsgbWF4c2VjIC0gbWluc2VjKSAvIDEwMjQ7CisJCWlmIChyZXYgJiYgIXIpIHsKKwkJCXJldmNvdW50Kys7CisJCQlyZWFkeXNvcnRlZCArPSBuX3JlYWR5OworCQl9CisJCWlmICghcmV2ICYmICFzKSB7CisJCQlzb3J0Y291bnQrKzsKKwkJCXJlYWR5c29ydGVkICs9IG5fcmVhZHk7CisJCX0KKwl9CisjaWYgZGVmaW5lZChERUJVR19MSU5LRURfQ09NTUFORFMpCisJaWYgKGxpbmtfc3RhdGlzdGljcyAmJiAob3ZlcmxhcCB8fCAhKGZsdXNoY291bnQgJSBsaW5rX3N0YXRpc3RpY3MpKSkKKwkJZm9yIChuID0gMDsgbiA8IG5fcmVhZHk7IG4rKykgeworCQkJayA9IGlsW25dOworCQkJY3BwID0gJmhhLT5jcFtrXTsKKwkJCVNDcG50ID0gY3BwLT5TQ3BudDsKKwkJCXByaW50aworCQkJICAgICgiJXMgJWQuJWQ6JWQgcGlkICVsZCBtYiAlZCBmYyAlZCBuciAlZCBzZWMgJWxkIG5zICVsZCIKKwkJCSAgICAgIiBjdXIgJWxkIHM6JWMgcjolYyByZXY6JWMgaW46JWMgb3Y6JWMgeGQgJWQuXG4iLAorCQkJICAgICAoaWhkbHIgPyAiaWhkbHIiIDogInFjb21tIiksCisJCQkgICAgIFNDcG50LT5kZXZpY2UtPmNoYW5uZWwsIFNDcG50LT5kZXZpY2UtPmlkLAorCQkJICAgICBTQ3BudC0+ZGV2aWNlLT5sdW4sIFNDcG50LT5waWQsIGssIGZsdXNoY291bnQsCisJCQkgICAgIG5fcmVhZHksIFNDcG50LT5yZXF1ZXN0LT5zZWN0b3IsCisJCQkgICAgIFNDcG50LT5yZXF1ZXN0LT5ucl9zZWN0b3JzLCBjdXJzZWMsIFlFU05PKHMpLAorCQkJICAgICBZRVNOTyhyKSwgWUVTTk8ocmV2KSwgWUVTTk8oaW5wdXRfb25seSksCisJCQkgICAgIFlFU05PKG92ZXJsYXApLCBjcHAtPmRpbik7CisJCX0KKyNlbmRpZgorCXJldHVybiBvdmVybGFwOworfQorCitzdGF0aWMgdm9pZCBmbHVzaF9kZXYoc3RydWN0IHNjc2lfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgY3Vyc2VjLAorCQkgICAgICBzdHJ1Y3QgaG9zdGRhdGEgKmhhLCB1bnNpZ25lZCBpbnQgaWhkbHIpCit7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CisJc3RydWN0IG1zY3AgKmNwcDsKKwl1bnNpZ25lZCBpbnQgaywgbiwgbl9yZWFkeSA9IDAsIGlsW01BWF9NQUlMQk9YRVNdOworCisJZm9yIChrID0gMDsgayA8IGRldi0+aG9zdC0+Y2FuX3F1ZXVlOyBrKyspIHsKKworCQlpZiAoaGEtPmNwX3N0YXRba10gIT0gUkVBRFkgJiYgaGEtPmNwX3N0YXRba10gIT0gSU5fVVNFKQorCQkJY29udGludWU7CisKKwkJY3BwID0gJmhhLT5jcFtrXTsKKwkJU0NwbnQgPSBjcHAtPlNDcG50OworCisJCWlmIChTQ3BudC0+ZGV2aWNlICE9IGRldikKKwkJCWNvbnRpbnVlOworCisJCWlmIChoYS0+Y3Bfc3RhdFtrXSA9PSBJTl9VU0UpCisJCQlyZXR1cm47CisKKwkJaWxbbl9yZWFkeSsrXSA9IGs7CisJfQorCisJaWYgKHJlb3JkZXIoaGEsIGN1cnNlYywgaWhkbHIsIGlsLCBuX3JlYWR5KSkKKwkJbl9yZWFkeSA9IDE7CisKKwlmb3IgKG4gPSAwOyBuIDwgbl9yZWFkeTsgbisrKSB7CisJCWsgPSBpbFtuXTsKKwkJY3BwID0gJmhhLT5jcFtrXTsKKwkJU0NwbnQgPSBjcHAtPlNDcG50OworCisJCWlmIChkb19kbWEoZGV2LT5ob3N0LT5pb19wb3J0LCBjcHAtPmNwX2RtYV9hZGRyLCBTRU5EX0NQX0RNQSkpIHsKKwkJCXByaW50aworCQkJICAgICgiJXM6ICVzLCB0YXJnZXQgJWQuJWQ6JWQsIHBpZCAlbGQsIG1ib3ggJWQsIGFkYXB0ZXIiCisJCQkgICAgICIgYnVzeSwgd2lsbCBhYm9ydC5cbiIsIGhhLT5ib2FyZF9uYW1lLAorCQkJICAgICAoaWhkbHIgPyAiaWhkbHIiIDogInFjb21tIiksCisJCQkgICAgIFNDcG50LT5kZXZpY2UtPmNoYW5uZWwsIFNDcG50LT5kZXZpY2UtPmlkLAorCQkJICAgICBTQ3BudC0+ZGV2aWNlLT5sdW4sIFNDcG50LT5waWQsIGspOworCQkJaGEtPmNwX3N0YXRba10gPSBBQk9SVElORzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaGEtPmNwX3N0YXRba10gPSBJTl9VU0U7CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaWhkbHIoaW50IGlycSwgc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CisJdW5zaWduZWQgaW50IGksIGssIGMsIHN0YXR1cywgdHN0YXR1cywgcmVnOworCXN0cnVjdCBtc3NwICpzcHA7CisJc3RydWN0IG1zY3AgKmNwcDsKKwlzdHJ1Y3QgaG9zdGRhdGEgKmhhID0gKHN0cnVjdCBob3N0ZGF0YSAqKXNob3N0LT5ob3N0ZGF0YTsKKworCWlmIChzaG9zdC0+aXJxICE9IGlycSkKKwkJcGFuaWMoIiVzOiBpaGRsciwgaXJxICVkLCBzaG9zdC0+aXJxICVkLlxuIiwgaGEtPmJvYXJkX25hbWUsIGlycSwKKwkJICAgICAgc2hvc3QtPmlycSk7CisKKwkvKiBDaGVjayBpZiB0aGlzIGJvYXJkIG5lZWQgdG8gYmUgc2VydmljZWQgKi8KKwlpZiAoIShpbmIoc2hvc3QtPmlvX3BvcnQgKyBSRUdfQVVYX1NUQVRVUykgJiBJUlFfQVNTRVJURUQpKQorCQlnb3RvIG5vbmU7CisKKwloYS0+aW9jb3VudCsrOworCisJaWYgKGRvX3RyYWNlKQorCQlwcmludGsoIiVzOiBpaGRsciwgZW50ZXIsIGlycSAlZCwgY291bnQgJWQuXG4iLCBoYS0+Ym9hcmRfbmFtZSwgaXJxLAorCQkgICAgICAgaGEtPmlvY291bnQpOworCisJLyogQ2hlY2sgaWYgdGhpcyBib2FyZCBpcyBzdGlsbCBidXN5ICovCisJaWYgKHdhaXRfb25fYnVzeShzaG9zdC0+aW9fcG9ydCwgMjAgKiBNQVhMT09QKSkgeworCQlyZWcgPSBpbmIoc2hvc3QtPmlvX3BvcnQgKyBSRUdfU1RBVFVTKTsKKwkJcHJpbnRrCisJCSAgICAoIiVzOiBpaGRsciwgYnVzeSB0aW1lb3V0IGVycm9yLCAgaXJxICVkLCByZWcgMHgleCwgY291bnQgJWQuXG4iLAorCQkgICAgIGhhLT5ib2FyZF9uYW1lLCBpcnEsIHJlZywgaGEtPmlvY291bnQpOworCQlnb3RvIG5vbmU7CisJfQorCisJc3BwID0gJmhhLT5zcDsKKworCS8qIE1ha2UgYSBsb2NhbCBjb3B5IGp1c3QgYmVmb3JlIGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgaW5kaWNhdGlvbiAqLworCW1lbWNweShzcHAsIGhhLT5zcF9jcHVfYWRkciwgc2l6ZW9mKHN0cnVjdCBtc3NwKSk7CisKKwkvKiBDbGVhciB0aGUgY29tcGxldGlvbiBmbGFnIGFuZCBjcCBwb2ludGVyIG9uIHRoZSBkeW5hbWljIGNvcHkgb2Ygc3AgKi8KKwltZW1zZXQoaGEtPnNwX2NwdV9hZGRyLCAwLCBzaXplb2Yoc3RydWN0IG1zc3ApKTsKKworCS8qIFJlYWQgdGhlIHN0YXR1cyByZWdpc3RlciB0byBjbGVhciB0aGUgaW50ZXJydXB0IGluZGljYXRpb24gKi8KKwlyZWcgPSBpbmIoc2hvc3QtPmlvX3BvcnQgKyBSRUdfU1RBVFVTKTsKKworI2lmIGRlZmluZWQgKERFQlVHX0lOVEVSUlVQVCkKKwl7CisJCXVuc2lnbmVkIGNoYXIgKmJ5dGVzcDsKKwkJaW50IGNudDsKKwkJYnl0ZXNwID0gKHVuc2lnbmVkIGNoYXIgKilzcHA7CisJCWlmIChoYS0+aW9jb3VudCA8IDIwMCkgeworCQkJcHJpbnRrKCJzcFtdID0iKTsKKwkJCWZvciAoY250ID0gMDsgY250IDwgMTU7IGNudCsrKQorCQkJCXByaW50aygiIDB4JXgiLCBieXRlc3BbY250XSk7CisJCQlwcmludGsoIlxuIik7CisJCX0KKwl9CisjZW5kaWYKKworCS8qIFJlamVjdCBhbnkgc3Agd2l0aCBzdXBzcGVjdCBkYXRhICovCisJaWYgKHNwcC0+ZW9jID09IDAgJiYgaGEtPmlvY291bnQgPiAxKQorCQlwcmludGsKKwkJICAgICgiJXM6IGloZGxyLCBzcHAtPmVvYyA9PSAwLCBpcnEgJWQsIHJlZyAweCV4LCBjb3VudCAlZC5cbiIsCisJCSAgICAgaGEtPmJvYXJkX25hbWUsIGlycSwgcmVnLCBoYS0+aW9jb3VudCk7CisJaWYgKHNwcC0+Y3BwX2luZGV4IDwgMCB8fCBzcHAtPmNwcF9pbmRleCA+PSBzaG9zdC0+Y2FuX3F1ZXVlKQorCQlwcmludGsKKwkJICAgICgiJXM6IGloZGxyLCBiYWQgc3BwLT5jcHBfaW5kZXggJWQsIGlycSAlZCwgcmVnIDB4JXgsIGNvdW50ICVkLlxuIiwKKwkJICAgICBoYS0+Ym9hcmRfbmFtZSwgc3BwLT5jcHBfaW5kZXgsIGlycSwgcmVnLCBoYS0+aW9jb3VudCk7CisJaWYgKHNwcC0+ZW9jID09IDAgfHwgc3BwLT5jcHBfaW5kZXggPCAwCisJICAgIHx8IHNwcC0+Y3BwX2luZGV4ID49IHNob3N0LT5jYW5fcXVldWUpCisJCWdvdG8gaGFuZGxlZDsKKworCS8qIEZpbmQgdGhlIG1haWxib3ggdG8gYmUgc2VydmljZWQgb24gdGhpcyBib2FyZCAqLworCWkgPSBzcHAtPmNwcF9pbmRleDsKKworCWNwcCA9ICYoaGEtPmNwW2ldKTsKKworI2lmIGRlZmluZWQoREVCVUdfR0VORVJBVEVfQUJPUlRTKQorCWlmICgoaGEtPmlvY291bnQgPiA1MDApICYmICgoaGEtPmlvY291bnQgJSA1MDApIDwgMykpCisJCWdvdG8gaGFuZGxlZDsKKyNlbmRpZgorCisJaWYgKGhhLT5jcF9zdGF0W2ldID09IElHTk9SRSkgeworCQloYS0+Y3Bfc3RhdFtpXSA9IEZSRUU7CisJCWdvdG8gaGFuZGxlZDsKKwl9IGVsc2UgaWYgKGhhLT5jcF9zdGF0W2ldID09IExPQ0tFRCkgeworCQloYS0+Y3Bfc3RhdFtpXSA9IEZSRUU7CisJCXByaW50aygiJXM6IGloZGxyLCBtYm94ICVkIHVubG9ja2VkLCBjb3VudCAlZC5cbiIsIGhhLT5ib2FyZF9uYW1lLCBpLAorCQkgICAgICAgaGEtPmlvY291bnQpOworCQlnb3RvIGhhbmRsZWQ7CisJfSBlbHNlIGlmIChoYS0+Y3Bfc3RhdFtpXSA9PSBGUkVFKSB7CisJCXByaW50aygiJXM6IGloZGxyLCBtYm94ICVkIGlzIGZyZWUsIGNvdW50ICVkLlxuIiwgaGEtPmJvYXJkX25hbWUsIGksCisJCSAgICAgICBoYS0+aW9jb3VudCk7CisJCWdvdG8gaGFuZGxlZDsKKwl9IGVsc2UgaWYgKGhhLT5jcF9zdGF0W2ldID09IElOX1JFU0VUKQorCQlwcmludGsoIiVzOiBpaGRsciwgbWJveCAlZCBpcyBpbiByZXNldC5cbiIsIGhhLT5ib2FyZF9uYW1lLCBpKTsKKwllbHNlIGlmIChoYS0+Y3Bfc3RhdFtpXSAhPSBJTl9VU0UpCisJCXBhbmljKCIlczogaWhkbHIsIG1ib3ggJWQsIGludmFsaWQgY3Bfc3RhdDogJWQuXG4iLAorCQkgICAgICBoYS0+Ym9hcmRfbmFtZSwgaSwgaGEtPmNwX3N0YXRbaV0pOworCisJaGEtPmNwX3N0YXRbaV0gPSBGUkVFOworCVNDcG50ID0gY3BwLT5TQ3BudDsKKworCWlmIChTQ3BudCA9PSBOVUxMKQorCQlwYW5pYygiJXM6IGloZGxyLCBtYm94ICVkLCBTQ3BudCA9PSBOVUxMLlxuIiwgaGEtPmJvYXJkX25hbWUsIGkpOworCisJaWYgKFNDcG50LT5ob3N0X3NjcmliYmxlID09IE5VTEwpCisJCXBhbmljKCIlczogaWhkbHIsIG1ib3ggJWQsIHBpZCAlbGQsIFNDcG50ICVwIGdhcmJsZWQuXG4iLCBoYS0+Ym9hcmRfbmFtZSwKKwkJICAgICAgaSwgU0NwbnQtPnBpZCwgU0NwbnQpOworCisJaWYgKCoodW5zaWduZWQgaW50ICopU0NwbnQtPmhvc3Rfc2NyaWJibGUgIT0gaSkKKwkJcGFuaWMoIiVzOiBpaGRsciwgbWJveCAlZCwgcGlkICVsZCwgaW5kZXggbWlzbWF0Y2ggJWQuXG4iLAorCQkgICAgICBoYS0+Ym9hcmRfbmFtZSwgaSwgU0NwbnQtPnBpZCwKKwkJICAgICAgKih1bnNpZ25lZCBpbnQgKilTQ3BudC0+aG9zdF9zY3JpYmJsZSk7CisKKwlzeW5jX2RtYShpLCBoYSk7CisKKwlpZiAobGlua2VkX2NvbW0gJiYgU0NwbnQtPmRldmljZS0+cXVldWVfZGVwdGggPiAyCisJICAgICYmIFRMREVWKFNDcG50LT5kZXZpY2UtPnR5cGUpKQorCQlmbHVzaF9kZXYoU0NwbnQtPmRldmljZSwgU0NwbnQtPnJlcXVlc3QtPnNlY3RvciwgaGEsIDEpOworCisJdHN0YXR1cyA9IHN0YXR1c19ieXRlKHNwcC0+dGFyZ2V0X3N0YXR1cyk7CisKKyNpZiBkZWZpbmVkKERFQlVHX0dFTkVSQVRFX0VSUk9SUykKKwlpZiAoKGhhLT5pb2NvdW50ID4gNTAwKSAmJiAoKGhhLT5pb2NvdW50ICUgMjAwKSA8IDIpKQorCQlzcHAtPmFkYXB0ZXJfc3RhdHVzID0gMHgwMTsKKyNlbmRpZgorCisJc3dpdGNoIChzcHAtPmFkYXB0ZXJfc3RhdHVzKSB7CisJY2FzZSBBU09LOgkJLyogc3RhdHVzIE9LICovCisKKwkJLyogRm9yY2VzIGEgcmVzZXQgaWYgYSBkaXNrIGRyaXZlIGtlZXBzIHJldHVybmluZyBCVVNZICovCisJCWlmICh0c3RhdHVzID09IEJVU1kgJiYgU0NwbnQtPmRldmljZS0+dHlwZSAhPSBUWVBFX1RBUEUpCisJCQlzdGF0dXMgPSBESURfRVJST1IgPDwgMTY7CisKKwkJLyogSWYgdGhlcmUgd2FzIGEgYnVzIHJlc2V0LCByZWRvIG9wZXJhdGlvbiBvbiBlYWNoIHRhcmdldCAqLworCQllbHNlIGlmICh0c3RhdHVzICE9IEdPT0QgJiYgU0NwbnQtPmRldmljZS0+dHlwZSA9PSBUWVBFX0RJU0sKKwkJCSAmJiBoYS0+dGFyZ2V0X3JlZG9bU0NwbnQtPmRldmljZS0+aWRdW1NDcG50LT4KKwkJCQkJCQkJICBkZXZpY2UtPgorCQkJCQkJCQkgIGNoYW5uZWxdKQorCQkJc3RhdHVzID0gRElEX0JVU19CVVNZIDw8IDE2OworCisJCS8qIFdvcmtzIGFyb3VuZCBhIGZsYXcgaW4gc2NzaS5jICovCisJCWVsc2UgaWYgKHRzdGF0dXMgPT0gQ0hFQ0tfQ09ORElUSU9OCisJCQkgJiYgU0NwbnQtPmRldmljZS0+dHlwZSA9PSBUWVBFX0RJU0sKKwkJCSAmJiAoU0NwbnQtPnNlbnNlX2J1ZmZlclsyXSAmIDB4ZikgPT0gUkVDT1ZFUkVEX0VSUk9SKQorCQkJc3RhdHVzID0gRElEX0JVU19CVVNZIDw8IDE2OworCisJCWVsc2UKKwkJCXN0YXR1cyA9IERJRF9PSyA8PCAxNjsKKworCQlpZiAodHN0YXR1cyA9PSBHT09EKQorCQkJaGEtPnRhcmdldF9yZWRvW1NDcG50LT5kZXZpY2UtPmlkXVtTQ3BudC0+ZGV2aWNlLT4KKwkJCQkJCQkgICAgICBjaGFubmVsXSA9IDA7CisKKwkJaWYgKHNwcC0+dGFyZ2V0X3N0YXR1cyAmJiBTQ3BudC0+ZGV2aWNlLT50eXBlID09IFRZUEVfRElTSyAmJgorCQkgICAgKCEodHN0YXR1cyA9PSBDSEVDS19DT05ESVRJT04gJiYgaGEtPmlvY291bnQgPD0gMTAwMCAmJgorCQkgICAgICAgKFNDcG50LT5zZW5zZV9idWZmZXJbMl0gJiAweGYpID09IE5PVF9SRUFEWSkpKQorCQkJcHJpbnRrKCIlczogaWhkbHIsIHRhcmdldCAlZC4lZDolZCwgcGlkICVsZCwgIgorCQkJICAgICAgICJ0YXJnZXRfc3RhdHVzIDB4JXgsIHNlbnNlIGtleSAweCV4LlxuIiwKKwkJCSAgICAgICBoYS0+Ym9hcmRfbmFtZSwKKwkJCSAgICAgICBTQ3BudC0+ZGV2aWNlLT5jaGFubmVsLCBTQ3BudC0+ZGV2aWNlLT5pZCwKKwkJCSAgICAgICBTQ3BudC0+ZGV2aWNlLT5sdW4sIFNDcG50LT5waWQsCisJCQkgICAgICAgc3BwLT50YXJnZXRfc3RhdHVzLCBTQ3BudC0+c2Vuc2VfYnVmZmVyWzJdKTsKKworCQloYS0+dGFyZ2V0X3RvW1NDcG50LT5kZXZpY2UtPmlkXVtTQ3BudC0+ZGV2aWNlLT5jaGFubmVsXSA9IDA7CisKKwkJaWYgKGhhLT5sYXN0X3JldHJpZWRfcGlkID09IFNDcG50LT5waWQpCisJCQloYS0+cmV0cmllcyA9IDA7CisKKwkJYnJlYWs7CisJY2FzZSBBU1NUOgkJLyogU2VsZWN0aW9uIFRpbWUgT3V0ICovCisJY2FzZSAweDAyOgkJLyogQ29tbWFuZCBUaW1lIE91dCAgICovCisKKwkJaWYgKGhhLT50YXJnZXRfdG9bU0NwbnQtPmRldmljZS0+aWRdW1NDcG50LT5kZXZpY2UtPmNoYW5uZWxdID4gMSkKKwkJCXN0YXR1cyA9IERJRF9FUlJPUiA8PCAxNjsKKwkJZWxzZSB7CisJCQlzdGF0dXMgPSBESURfVElNRV9PVVQgPDwgMTY7CisJCQloYS0+dGFyZ2V0X3RvW1NDcG50LT5kZXZpY2UtPmlkXVtTQ3BudC0+ZGV2aWNlLT4KKwkJCQkJCQkgICAgY2hhbm5lbF0rKzsKKwkJfQorCisJCWJyZWFrOworCisJCS8qIFBlcmZvcm0gYSBsaW1pdGVkIG51bWJlciBvZiBpbnRlcm5hbCByZXRyaWVzICovCisJY2FzZSAweDAzOgkJLyogU0NTSSBCdXMgUmVzZXQgUmVjZWl2ZWQgKi8KKwljYXNlIDB4MDQ6CQkvKiBJbml0aWFsIENvbnRyb2xsZXIgUG93ZXItdXAgKi8KKworCQlmb3IgKGMgPSAwOyBjIDw9IHNob3N0LT5tYXhfY2hhbm5lbDsgYysrKQorCQkJZm9yIChrID0gMDsgayA8IHNob3N0LT5tYXhfaWQ7IGsrKykKKwkJCQloYS0+dGFyZ2V0X3JlZG9ba11bY10gPSAxOworCisJCWlmIChTQ3BudC0+ZGV2aWNlLT50eXBlICE9IFRZUEVfVEFQRQorCQkgICAgJiYgaGEtPnJldHJpZXMgPCBNQVhfSU5URVJOQUxfUkVUUklFUykgeworCisjaWYgZGVmaW5lZChESURfU09GVF9FUlJPUikKKwkJCXN0YXR1cyA9IERJRF9TT0ZUX0VSUk9SIDw8IDE2OworI2Vsc2UKKwkJCXN0YXR1cyA9IERJRF9CVVNfQlVTWSA8PCAxNjsKKyNlbmRpZgorCisJCQloYS0+cmV0cmllcysrOworCQkJaGEtPmxhc3RfcmV0cmllZF9waWQgPSBTQ3BudC0+cGlkOworCQl9IGVsc2UKKwkJCXN0YXR1cyA9IERJRF9FUlJPUiA8PCAxNjsKKworCQlicmVhazsKKwljYXNlIDB4MDU6CQkvKiBVbmV4cGVjdGVkIEJ1cyBQaGFzZSAqLworCWNhc2UgMHgwNjoJCS8qIFVuZXhwZWN0ZWQgQnVzIEZyZWUgKi8KKwljYXNlIDB4MDc6CQkvKiBCdXMgUGFyaXR5IEVycm9yICovCisJY2FzZSAweDA4OgkJLyogU0NTSSBIdW5nICovCisJY2FzZSAweDA5OgkJLyogVW5leHBlY3RlZCBNZXNzYWdlIFJlamVjdCAqLworCWNhc2UgMHgwYToJCS8qIFNDU0kgQnVzIFJlc2V0IFN0dWNrICovCisJY2FzZSAweDBiOgkJLyogQXV0byBSZXF1ZXN0LVNlbnNlIEZhaWxlZCAqLworCWNhc2UgMHgwYzoJCS8qIENvbnRyb2xsZXIgUmFtIFBhcml0eSBFcnJvciAqLworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IERJRF9FUlJPUiA8PCAxNjsKKwkJYnJlYWs7CisJfQorCisJU0NwbnQtPnJlc3VsdCA9IHN0YXR1cyB8IHNwcC0+dGFyZ2V0X3N0YXR1czsKKworI2lmIGRlZmluZWQoREVCVUdfSU5URVJSVVBUKQorCWlmIChTQ3BudC0+cmVzdWx0IHx8IGRvX3RyYWNlKQorI2Vsc2UKKwlpZiAoKHNwcC0+YWRhcHRlcl9zdGF0dXMgIT0gQVNPSyAmJiBoYS0+aW9jb3VudCA+IDEwMDApIHx8CisJICAgIChzcHAtPmFkYXB0ZXJfc3RhdHVzICE9IEFTT0sgJiYKKwkgICAgIHNwcC0+YWRhcHRlcl9zdGF0dXMgIT0gQVNTVCAmJiBoYS0+aW9jb3VudCA8PSAxMDAwKSB8fAorCSAgICBkb190cmFjZSB8fCBtc2dfYnl0ZShzcHAtPnRhcmdldF9zdGF0dXMpKQorI2VuZGlmCisJCXByaW50aygiJXM6IGloZGxyLCBtYm94ICUyZCwgZXJyIDB4JXg6JXgsIgorCQkgICAgICAgIiB0YXJnZXQgJWQuJWQ6JWQsIHBpZCAlbGQsIHJlZyAweCV4LCBjb3VudCAlZC5cbiIsCisJCSAgICAgICBoYS0+Ym9hcmRfbmFtZSwgaSwgc3BwLT5hZGFwdGVyX3N0YXR1cywgc3BwLT50YXJnZXRfc3RhdHVzLAorCQkgICAgICAgU0NwbnQtPmRldmljZS0+Y2hhbm5lbCwgU0NwbnQtPmRldmljZS0+aWQsCisJCSAgICAgICBTQ3BudC0+ZGV2aWNlLT5sdW4sIFNDcG50LT5waWQsIHJlZywgaGEtPmlvY291bnQpOworCisJdW5tYXBfZG1hKGksIGhhKTsKKworCS8qIFNldCB0aGUgY29tbWFuZCBzdGF0ZSB0byBpbmFjdGl2ZSAqLworCVNDcG50LT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworCVNDcG50LT5zY3NpX2RvbmUoU0NwbnQpOworCisJaWYgKGRvX3RyYWNlKQorCQlwcmludGsoIiVzOiBpaGRsciwgZXhpdCwgaXJxICVkLCBjb3VudCAlZC5cbiIsIGhhLT5ib2FyZF9uYW1lLAorCQkJCWlycSwgaGEtPmlvY291bnQpOworCisgICAgICBoYW5kbGVkOgorCXJldHVybiBJUlFfSEFORExFRDsKKyAgICAgIG5vbmU6CisJcmV0dXJuIElSUV9OT05FOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZG9faW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqc2hhcCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJdW5zaWduZWQgaW50IGo7CisJdW5zaWduZWQgbG9uZyBzcGluX2ZsYWdzOworCWlycXJldHVybl90IHJldDsKKworCS8qIENoZWNrIGlmIHRoZSBpbnRlcnJ1cHQgbXVzdCBiZSBwcm9jZXNzZWQgYnkgdGhpcyBoYW5kbGVyICovCisJaWYgKChqID0gKHVuc2lnbmVkIGludCkoKGNoYXIgKilzaGFwIC0gc2hhKSkgPj0gbnVtX2JvYXJkcykKKwkJcmV0dXJuIElSUV9OT05FOworCXNob3N0ID0gc2hbal07CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBzcGluX2ZsYWdzKTsKKwlyZXQgPSBpaGRscihpcnEsIHNob3N0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIHNwaW5fZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZWF0YTJ4X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IGhvc3RkYXRhICpoYSA9IChzdHJ1Y3QgaG9zdGRhdGEgKilzaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2hvc3QtPmNhbl9xdWV1ZTsgaSsrKQorCQlpZiAoKCZoYS0+Y3BbaV0pLT5zZ2xpc3QpCisJCQlrZnJlZSgoJmhhLT5jcFtpXSktPnNnbGlzdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2hvc3QtPmNhbl9xdWV1ZTsgaSsrKQorCQlwY2lfdW5tYXBfc2luZ2xlKGhhLT5wZGV2LCBoYS0+Y3BbaV0uY3BfZG1hX2FkZHIsCisJCQkJIHNpemVvZihzdHJ1Y3QgbXNjcCksIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisKKwlpZiAoaGEtPnNwX2NwdV9hZGRyKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LCBzaXplb2Yoc3RydWN0IG1zc3ApLAorCQkJCSAgICBoYS0+c3BfY3B1X2FkZHIsIGhhLT5zcF9kbWFfYWRkcik7CisKKwlmcmVlX2lycShzaG9zdC0+aXJxLCAmc2hhW2hhLT5ib2FyZF9udW1iZXJdKTsKKworCWlmIChzaG9zdC0+ZG1hX2NoYW5uZWwgIT0gTk9fRE1BKQorCQlmcmVlX2RtYShzaG9zdC0+ZG1hX2NoYW5uZWwpOworCisJcmVsZWFzZV9yZWdpb24oc2hvc3QtPmlvX3BvcnQsIHNob3N0LT5uX2lvX3BvcnQpOworCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCisjaWZuZGVmIE1PRFVMRQorX19zZXR1cCgiZWF0YT0iLCBvcHRpb25fc2V0dXApOworI2VuZGlmCQkJCS8qIGVuZCBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9lYXRhX2dlbmVyaWMuaCBiL2RyaXZlcnMvc2NzaS9lYXRhX2dlbmVyaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGJjZTJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2VhdGFfZ2VuZXJpYy5oCkBAIC0wLDAgKzEsNDA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSGVhZGVyIGZpbGUgZm9yIGVhdGFfZG1hLmMgYW5kIGVhdGFfcGlvLmMJCSoKKyogTGludXggRUFUQSBTQ1NJIGRyaXZlcnMJCQkJKgorKiAoYykgMTk5My05NiBNaWNoYWVsIE5ldWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgIG1pa2VAaS1Db25uZWN0Lk5ldCAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgbmV1ZmZlckBtYWlsLnVuaS1tYWluei5kZSAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGxhc3QgY2hhbmdlOiA5Ni8wOC8xNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX0VBVEFfR0VORVJJQ19ICisjZGVmaW5lIF9FQVRBX0dFTkVSSUNfSAorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWlzYy4gZGVmaW5pdGlvbnMJCQkgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFIDEKKyNlbmRpZgorI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKworI2RlZmluZSBSX0xJTUlUIDB4MjAwMDAKKworI2RlZmluZSBNQVhJU0EJICAgNAorI2RlZmluZSBNQVhFSVNBCSAgMTYgIAorI2RlZmluZSBNQVhQQ0kJICAxNgorI2RlZmluZSBNQVhJUlEJICAxNiAKKyNkZWZpbmUgTUFYVEFSR0VUIDE2CisjZGVmaW5lIE1BWENIQU5ORUwgMworCisjZGVmaW5lIElTX0lTQQkgICAnSScKKyNkZWZpbmUgSVNfRUlTQQkgICAnRScKKyNkZWZpbmUgSVNfUENJCSAgICdQJworCisjZGVmaW5lIEJST0tFTl9JTlFVSVJZCTEKKworI2RlZmluZSBCVVNNQVNURVIgICAgICAgMHhmZgorI2RlZmluZSBQSU8gICAgICAgICAgICAgMHhmZQorCisjZGVmaW5lIEVBVEFfU0lHTkFUVVJFCTB4NDU0MTU0NDEgICAgIC8qIEJJRyBFTkRJQU4gY29kZWQgIkVBVEEiIHNpZy4JICovCisKKyNkZWZpbmUgRFBUX0lEMSAgICAgICAgIDB4MTIKKyNkZWZpbmUgRFBUX0lEMiAgICAgICAgIDB4MTQKKworI2RlZmluZSBBVFRfSUQxICAgICAgICAgMHgwNgorI2RlZmluZSBBVFRfSUQyICAgICAgICAgMHg5NAorI2RlZmluZSBBVFRfSUQzICAgICAgICAgMHgwCisKKyNkZWZpbmUgTkVDX0lEMSAgICAgICAgIDB4MzgKKyNkZWZpbmUgTkVDX0lEMiAgICAgICAgIDB4YTMKKyNkZWZpbmUgTkVDX0lEMyAgICAgICAgIDB4ODIKKworIAorI2RlZmluZSBFQVRBX0NQX1NJWkUJIDQ0CisKKyNkZWZpbmUgTUFYX1BDSV9ERVZJQ0VTICAzMgkgICAgICAgLyogTWF4aW11bSAjIE9mIERldmljZXMgUGVyIEJ1cwkgKi8KKyNkZWZpbmUgTUFYX01FVEhPRF8yCSAxNgkgICAgICAgLyogTWF4IERldmljZXMgRm9yIE1ldGhvZCAyCSAqLworI2RlZmluZSBNQVhfUENJX0JVUwkgMTYJICAgICAgIC8qIE1heGltdW0gIyBPZiBCdXNzZXMgQWxsb3dlZAkgKi8KKworI2RlZmluZSBTR19TSVpFCQkgNjQgCisjZGVmaW5lIFNHX1NJWkVfQklHCSAyNTIJICAgICAgIC8qIG1heC4gODA5NiBlbGVtZW50cywgNjRrICovCisKKyNkZWZpbmUgVVBQRVJfREVWSUNFX1FVRVVFX0xJTUlUIDY0ICAgIC8qIFRoZSBsaW1pdCB3ZSBoYXZlIHRvIHNldCBmb3IgdGhlIAorCQkJCQkqIGRldmljZSBxdWV1ZSB0byBrZWVwIHRoZSBicm9rZW4gCisJCQkJCSogbWlkbGV2ZWwgU0NTSSBjb2RlIGZyb20gcHJvZHVjaW5nCisJCQkJCSogYm9ndXMgdGltZW91dHMKKwkJCQkJKi8KKworI2RlZmluZSBUWVBFX0RJU0tfUVVFVUUgIDE2CisjZGVmaW5lIFRZUEVfVEFQRV9RVUVVRSAgNAorI2RlZmluZSBUWVBFX1JPTV9RVUVVRSAgIDQKKyNkZWZpbmUgVFlQRV9PVEhFUl9RVUVVRSAyCisKKyNkZWZpbmUgRlJFRQkgICAgICAgICAwCisjZGVmaW5lIE9LCSAgICAgICAgIDAKKyNkZWZpbmUgTk9fVElNRU9VVCAgICAgICAwCisjZGVmaW5lIFVTRUQJICAgICAgICAgMQorI2RlZmluZSBUSU1FT1VUCSAgICAgICAgIDIKKyNkZWZpbmUgUkVTRVQJICAgICAgICAgNAorI2RlZmluZSBMT0NLRUQJICAgICAgICAgOAorI2RlZmluZSBBQk9SVEVEICAgICAgICAgIDE2CisKKyNkZWZpbmUgUkVBRCAgICAgICAgICAgICAwCisjZGVmaW5lIFdSSVRFICAgICAgICAgICAgMQorI2RlZmluZSBPVEhFUiAgICAgICAgICAgIDIKKworI2RlZmluZSBIRChjbWQpCSAoKGhvc3RkYXRhICopJihjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGEpKQorI2RlZmluZSBDRChjbWQpCSAoKHN0cnVjdCBlYXRhX2NjYiAqKShjbWQtPmhvc3Rfc2NyaWJibGUpKQorI2RlZmluZSBTRChob3N0KSAoKGhvc3RkYXRhICopJihob3N0LT5ob3N0ZGF0YSkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgRUFUQSBDb21tYW5kICYgUmVnaXN0ZXIgZGVmaW5pdGlvbnMgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBDSV9SRUdfRFBUY29uZmlnCSAweDQwCSAKKyNkZWZpbmUgUENJX1JFR19QdW1wTW9kZUFkZHJlc3MJIDB4NDQJIAorI2RlZmluZSBQQ0lfUkVHX1B1bXBNb2RlRGF0YQkgMHg0OAkgCisjZGVmaW5lIFBDSV9SRUdfQ29uZmlnUGFyYW0xCSAweDUwCSAKKyNkZWZpbmUgUENJX1JFR19Db25maWdQYXJhbTIJIDB4NTQJIAorCisKKyNkZWZpbmUgRUFUQV9DTURfUElPX1NFVFVQVEVTVAkgMHhjNgorI2RlZmluZSBFQVRBX0NNRF9QSU9fUkVBRF9DT05GSUcgMHhmMAorI2RlZmluZSBFQVRBX0NNRF9QSU9fU0VUX0NPTkZJRwkgMHhmMQorI2RlZmluZSBFQVRBX0NNRF9QSU9fU0VORF9DUAkgMHhmMgorI2RlZmluZSBFQVRBX0NNRF9QSU9fUkVDRUlWRV9TUAkgMHhmMworI2RlZmluZSBFQVRBX0NNRF9QSU9fVFJVTkMJIDB4ZjQKKworI2RlZmluZSBFQVRBX0NNRF9SRVNFVAkJIDB4ZjkKKyNkZWZpbmUgRUFUQV9DTURfSU1NRURJQVRFCSAweGZhCisKKyNkZWZpbmUgRUFUQV9DTURfRE1BX1JFQURfQ09ORklHIDB4ZmQKKyNkZWZpbmUgRUFUQV9DTURfRE1BX1NFVF9DT05GSUcJIDB4ZmUKKyNkZWZpbmUgRUFUQV9DTURfRE1BX1NFTkRfQ1AJIDB4ZmYKKworI2RlZmluZSBFQ1NfRU1VTEFURV9TRU5TRQkgMHhkNAorCisjZGVmaW5lIEVBVEFfR0VORVJJQ19BQk9SVCAgICAgICAweDAwIAorI2RlZmluZSBFQVRBX1NQRUNJRklDX1JFU0VUICAgICAgMHgwMQorI2RlZmluZSBFQVRBX0JVU19SRVNFVCAgICAgICAgICAgMHgwMgorI2RlZmluZSBFQVRBX1NQRUNJRklDX0FCT1JUICAgICAgMHgwMworI2RlZmluZSBFQVRBX1FVSUVUX0lOVFIgICAgICAgICAgMHgwNAorI2RlZmluZSBFQVRBX0NPTERfQk9PVF9IQkEgICAgICAgMHgwNgkgICAvKiBPbmx5IGFzIGEgbGFzdCByZXNvcnQJKi8KKyNkZWZpbmUgRUFUQV9GT1JDRV9JTyAgICAgICAgICAgIDB4MDcKKworI2RlZmluZSBIQV9DVFJMUkVHICAgICAweDIwNiAgICAgICAvKiBjb250cm9sIHJlZ2lzdGVyIGZvciBIQkEgICAgKi8KKyNkZWZpbmUgSEFfQ1RSTF9ESVNJTlQgMHgwMiAgICAgICAgLyogQ1RSTFJFRzogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisjZGVmaW5lIEhBX0NUUkxfUkVTQ1BVIDB4MDQgICAgICAgIC8qIENUUkxSRUc6IHJlc2V0IHByb2Nlc3NvciAgICAqLworI2RlZmluZSBIQV9DVFJMXzhIRUFEUyAweDA4ICAgICAgICAvKiBDVFJMUkVHOiBzZXQgZm9yIGRyaXZlcyB3aXRoKiAKKwkJCQkgICAgKiA+PTggaGVhZHMgKFdEMTAwMyBydWRpbWVudGFyeSA6LSkgKi8KKworI2RlZmluZSBIQV9XQ09NTUFORCAgICAweDA3CSAgIC8qIGNvbW1hbmQgcmVnaXN0ZXIgb2Zmc2V0CSovCisjZGVmaW5lIEhBX1dJRkMgICAgICAgIDB4MDYJICAgLyogaW1tZWRpYXRlIGNvbW1hbmQgb2Zmc2V0ICAqLworI2RlZmluZSBIQV9XQ09ERSAgICAgICAweDA1IAorI2RlZmluZSBIQV9XQ09ERTIgICAgICAweDA0IAorI2RlZmluZSBIQV9XRE1BQUREUiAgICAweDAyCSAgIC8qIERNQSBhZGRyZXNzIExTQiBvZmZzZXQJKi8gIAorI2RlZmluZSBIQV9SQVVYU1RBVCAgICAweDA4CSAgIC8qIGF1eCBzdGF0dXMgcmVnaXN0ZXIgb2Zmc2V0Ki8KKyNkZWZpbmUgSEFfUlNUQVRVUyAgICAgMHgwNwkgICAvKiBzdGF0dXMgcmVnaXN0ZXIgb2Zmc2V0CSovCisjZGVmaW5lIEhBX1JEQVRBICAgICAgIDB4MDAJICAgLyogZGF0YSByZWdpc3RlciAoMTZiaXQpCSovCisjZGVmaW5lIEhBX1dEQVRBICAgICAgIDB4MDAJICAgLyogZGF0YSByZWdpc3RlciAoMTZiaXQpCSovCisKKyNkZWZpbmUgSEFfQUJVU1kgICAgICAgMHgwMQkgICAvKiBhdXggYnVzeSBiaXQJCSovCisjZGVmaW5lIEhBX0FJUlEJICAgICAgIDB4MDIJICAgLyogYXV4IElSUSBwZW5kaW5nIGJpdAkqLworI2RlZmluZSBIQV9TRVJST1IgICAgICAweDAxCSAgIC8qIHByLiBjb21tYW5kIGVuZGVkIGluIGVycm9yKi8KKyNkZWZpbmUgSEFfU01PUkUgICAgICAgMHgwMgkgICAvKiBtb3JlIGRhdGEgc29vbiB0byBjb21lCSovCisjZGVmaW5lIEhBX1NDT1JSICAgICAgIDB4MDQJICAgLyogZGF0YSBjb3JyZWN0ZWQJCSovCisjZGVmaW5lIEhBX1NEUlEJICAgICAgIDB4MDgJICAgLyogZGF0YSByZXF1ZXN0IGFjdGl2ZQkqLworI2RlZmluZSBIQV9TU0MJICAgICAgIDB4MTAJICAgLyogc2VlayBjb21wbGV0ZQkJKi8KKyNkZWZpbmUgSEFfU0ZBVUxUICAgICAgMHgyMAkgICAvKiB3cml0ZSBmYXVsdAkJKi8KKyNkZWZpbmUgSEFfU1JFQURZICAgICAgMHg0MAkgICAvKiBkcml2ZSByZWFkeQkJKi8KKyNkZWZpbmUgSEFfU0JVU1kgICAgICAgMHg4MAkgICAvKiBkcml2ZSBidXN5CQkqLworI2RlZmluZSBIQV9TRFJEWSAgICAgICBIQV9TU0MrSEFfU1JFQURZK0hBX1NEUlEgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNZXNzYWdlIGRlZmluaXRpb25zCQkJICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSEFfTk9fRVJST1IJIDB4MDAJLyogTm8gRXJyb3IJCQkJKi8KKyNkZWZpbmUgSEFfRVJSX1NFTF9UTwkgMHgwMQkvKiBTZWxlY3Rpb24gVGltZW91dAkJCSovCisjZGVmaW5lIEhBX0VSUl9DTURfVE8JIDB4MDIJLyogQ29tbWFuZCBUaW1lb3V0CQkJKi8KKyNkZWZpbmUgSEFfQlVTX1JFU0VUCSAweDAzCS8qIFNDU0kgQnVzIFJlc2V0IFJlY2VpdmVkCQkqLworI2RlZmluZSBIQV9JTklUX1BPV0VSVVAJIDB4MDQJLyogSW5pdGlhbCBDb250cm9sbGVyIFBvd2VyLXVwCQkqLworI2RlZmluZSBIQV9VTlhfQlVTUEhBU0UJIDB4MDUJLyogVW5leHBlY3RlZCBCdXMgUGhhc2UJCQkqLworI2RlZmluZSBIQV9VTlhfQlVTX0ZSRUUJIDB4MDYJLyogVW5leHBlY3RlZCBCdXMgRnJlZQkJCSovCisjZGVmaW5lIEhBX0JVU19QQVJJVFkJIDB4MDcJLyogQnVzIFBhcml0eSBFcnJvcgkJCSovCisjZGVmaW5lIEhBX1NDU0lfSFVORwkgMHgwOAkvKiBTQ1NJIEh1bmcJCQkJKi8KKyNkZWZpbmUgSEFfVU5YX01TR1JKQ1QJIDB4MDkJLyogVW5leHBlY3RlZCBNZXNzYWdlIFJlamVjdGVkCQkqLworI2RlZmluZSBIQV9SRVNFVF9TVFVDSwkgMHgwYQkvKiBTQ1NJIEJ1cyBSZXNldCBTdHVjawkJCSovCisjZGVmaW5lIEhBX1JTRU5TRV9GQUlMCSAweDBiCS8qIEF1dG8gUmVxdWVzdC1TZW5zZSBGYWlsZWQJCSovCisjZGVmaW5lIEhBX1BBUklUWV9FUlIJIDB4MGMJLyogQ29udHJvbGxlciBSYW0gUGFyaXR5IEVycm9yCQkqLworI2RlZmluZSBIQV9DUF9BQk9SVF9OQQkgMHgwZAkvKiBBYm9ydCBNZXNzYWdlIHNlbnQgdG8gbm9uLWFjdGl2ZSBjbWQgKi8KKyNkZWZpbmUgSEFfQ1BfQUJPUlRFRAkgMHgwZQkvKiBBYm9ydCBNZXNzYWdlIHNlbnQgdG8gYWN0aXZlIGNtZAkqLworI2RlZmluZSBIQV9DUF9SRVNFVF9OQQkgMHgwZgkvKiBSZXNldCBNZXNzYWdlIHNlbnQgdG8gbm9uLWFjdGl2ZSBjbWQgKi8KKyNkZWZpbmUgSEFfQ1BfUkVTRVQJIDB4MTAJLyogUmVzZXQgTWVzc2FnZSBzZW50IHRvIGFjdGl2ZSBjbWQJKi8KKyNkZWZpbmUgSEFfRUNDX0VSUgkgMHgxMQkvKiBDb250cm9sbGVyIFJhbSBFQ0MgRXJyb3IJCSovCisjZGVmaW5lIEhBX1BDSV9QQVJJVFkJIDB4MTIJLyogUENJIFBhcml0eSBFcnJvcgkJCSovCisjZGVmaW5lIEhBX1BDSV9NQUJPUlQJIDB4MTMJLyogUENJIE1hc3RlciBBYm9ydAkJCSovCisjZGVmaW5lIEhBX1BDSV9UQUJPUlQJIDB4MTQJLyogUENJIFRhcmdldCBBYm9ydAkJCSovCisjZGVmaW5lIEhBX1BDSV9TVEFCT1JUCSAweDE1CS8qIFBDSSBTaWduYWxlZCBUYXJnZXQgQWJvcnQJCSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgT3RoZXIgIGRlZmluaXRpb25zCQkJICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCByZWdfYml0IHsgICAgICAvKiByZWFkaW5nIHRoaXMgb25lIHdpbGwgY2xlYXIgdGhlIGludGVycnVwdCAgICAqLworICAgIF9fdTggZXJyb3I6MTsgICAgIC8qIHByZXZpb3VzIGNvbW1hbmQgZW5kZWQgaW4gYW4gZXJyb3IJICAgICAgKi8KKyAgICBfX3U4IG1vcmU6MTsgICAgICAvKiBtb3JlIERBVEEgY29taW5nIHNvb24sIHBvbGwgQlNZICYgRFJRIChQSU8pICAqLworICAgIF9fdTggY29ycjoxOyAgICAgIC8qIGRhdGEgcmVhZCB3YXMgc3VjY2Vzc2Z1bGx5IGNvcnJlY3RlZCB3aXRoIEVDQyovCisgICAgX191OCBkcnE6MTsJICAgICAgLyogZGF0YSByZXF1ZXN0IGFjdGl2ZSAgKi8gICAgIAorICAgIF9fdTggc2M6MTsJICAgICAgLyogc2VlayBjb21wbGV0ZQkgICAgICAqLworICAgIF9fdTggZmF1bHQ6MTsgICAgIC8qIHdyaXRlIGZhdWx0CSAgICAgICovCisgICAgX191OCByZWFkeToxOyAgICAgLyogZHJpdmUgcmVhZHkJICAgICAgKi8KKyAgICBfX3U4IGJ1c3k6MTsgICAgICAvKiBjb250cm9sbGVyIGJ1c3kgICAgICAqLworfTsKKworc3RydWN0IHJlZ19hYml0IHsgICAgIC8qIHJlYWRpbmcgdGhpcyB3b24ndCBjbGVhciB0aGUgaW50ZXJydXB0ICovCisgICAgX191OCBhYnVzeToxOyAgICAgLyogYXV4aWxpYXJ5IGJ1c3kJCQkJKi8KKyAgICBfX3U4IGlycToxOwkgICAgICAvKiBzZXQgd2hlbiBkcml2ZSBpbnRlcnJ1cHQgaXMgYXNzZXJ0ZWQJKi8KKyAgICBfX3U4IGR1bW15OjY7Cit9OworCitzdHJ1Y3QgZWF0YV9yZWdpc3RlciB7CSAgICAvKiBFQVRBIHJlZ2lzdGVyIHNldCAqLworICAgIF9fdTggZGF0YV9yZWdbMl07CSAgICAvKiBSLCBjb3VsZG4ndCBmaWd1cmUgdGhpcyBvbmUgb3V0CQkqLworICAgIF9fdTggY3BfYWRkcls0XTsJICAgIC8qIFcsIENQIGFkZHJlc3MgcmVnaXN0ZXIJCQkqLworICAgIHVuaW9uIHsgCisJX191OCBjb21tYW5kOwkgICAgLyogVywgY29tbWFuZCBjb2RlOiBbcmVhZHxzZXRdIGNvbmYsIHNlbmQgQ1AqLworCXN0cnVjdCByZWdfYml0IHN0YXR1czsJLyogUiwgc2VlIHJlZ2lzdGVyX2JpdDEJCQkqLworCV9fdTggc3RhdHVzYnl0ZTsKKyAgICB9IG92cjsgICAKKyAgICBzdHJ1Y3QgcmVnX2FiaXQgYXV4X3N0YXQ7IC8qIFIsIHNlZSByZWdpc3Rlcl9iaXQyCQkJKi8KK307CisKK3N0cnVjdCBnZXRfY29uZiB7CSAgICAgIC8qIFJlYWQgQ29uZmlndXJhdGlvbiBBcnJheQkJKi8KKyAgICBfX3UzMiAgbGVuOwkJICAgICAgLyogU2hvdWxkIHJldHVybiAweDIyLCAweDI0LCBldGMJCSovCisgICAgX191MzIgc2lnbmF0dXJlOwkgICAgICAvKiBTaWduYXR1cmUgTVVTVCBiZSAiRUFUQSIJCSovCisgICAgX191OCAgICB2ZXJzaW9uMjo0LAorCSAgICAgdmVyc2lvbjo0OwkgICAgICAvKiBFQVRBIFZlcnNpb24gbGV2ZWwJCQkqLworICAgIF9fdTggT0NTX2VuYWJsZWQ6MSwJICAgICAgLyogT3ZlcmxhcCBDb21tYW5kIFN1cHBvcnQgZW5hYmxlZAkqLworCSBUQVJfc3VwcG9ydDoxLAkgICAgICAvKiBTQ1NJIFRhcmdldCBNb2RlIHN1cHBvcnRlZAkJKi8KKwkgICAgICBUUk5YRlI6MSwJICAgICAgLyogVHJ1bmNhdGUgVHJhbnNmZXIgQ21kIG5vdCBuZWNlc3NhcnkJKgorCQkJICAgICAgICogT25seSB1c2VkIGluIFBJTyBNb2RlCQkJKi8KKwlNT1JFX3N1cHBvcnQ6MSwJICAgICAgLyogTU9SRSBzdXBwb3J0ZWQgKG9ubHkgUElPIE1vZGUpCQkqLworCSBETUFfc3VwcG9ydDoxLAkgICAgICAvKiBETUEgc3VwcG9ydGVkIERyaXZlciB1c2VzIG9ubHkJCSoKKwkJCSAgICAgICAqIHRoaXMgbW9kZQkJCQkqLworCSAgIERNQV92YWxpZDoxLAkgICAgICAvKiBEUlEgdmFsdWUgaW4gQnl0ZSAzMCBpcyB2YWxpZAkJKi8KKwkJIEFUQToxLAkgICAgICAvKiBBVEEgZGV2aWNlIGNvbm5lY3RlZCAobm90IHN1cHBvcnRlZCkJKi8KKwkgICBIQUFfdmFsaWQ6MTsJICAgICAgLyogSG9zdGFkYXB0ZXIgQWRkcmVzcyBpcyB2YWxpZAkJKi8KKworICAgIF9fdTE2IGNwcGFkbGVuOwkgICAgICAvKiBOdW1iZXIgb2YgcGFkIGJ5dGVzIHNlbmQgYWZ0ZXIgQ0QgZGF0YSAqCisJCQkgICAgICAgKiBzZXQgdG8gemVybyBmb3IgRE1BIGNvbW1hbmRzCQkqLworICAgIF9fdTggc2NzaV9pZFs0XTsJICAgICAgLyogU0NTSSBJRCBvZiBjb250cm9sbGVyIDItMCBCeXRlIDAgcmVzLgkqCisJCQkgICAgICAgKiBpZiBub3QsIHplcm8gaXMgcmV0dXJuZWQJCSovCisgICAgX191MzIgIGNwbGVuOwkgICAgICAvKiBDUCBsZW5ndGg6IG51bWJlciBvZiB2YWxpZCBjcCBieXRlcwkqLworICAgIF9fdTMyICBzcGxlbjsJICAgICAgLyogTnVtYmVyIG9mIGJ5dGVzIHJldHVybmVkIGFmdGVyCQkqIAorCQkJICAgICAgICogUmVjZWl2ZSBTUCBjb21tYW5kCQkJKi8KKyAgICBfX3UxNiBxdWV1ZXNpejsJICAgICAgLyogbWF4IG51bWJlciBvZiBxdWV1ZWFibGUgQ1BzCQkqLworICAgIF9fdTE2IGR1bW15OworICAgIF9fdTE2IFNHc2l6OwkgICAgICAvKiBtYXggbnVtYmVyIG9mIFNHIHRhYmxlIGVudHJpZXMJCSovCisgICAgX191OCAgICBJUlE6NCwJICAgICAgLyogSVJRIHVzZWQgdGhpcyBIQQkJCSovCisJIElSUV9UUjoxLAkgICAgICAvKiBJUlEgVHJpZ2dlcjogMD1lZGdlLCAxPWxldmVsCQkqLworCSBTRUNPTkQ6MSwJICAgICAgLyogVGhpcyBpcyBhIHNlY29uZGFyeSBjb250cm9sbGVyCQkqLworICAgIERNQV9jaGFubmVsOjI7CSAgICAgIC8qIERSUSBpbmRleCwgRFJRIGlzIDJjb21wIG9mIERSUVgJKi8KKyAgICBfX3U4IHN5bmM7CQkgICAgICAvKiBkZXZpY2UgYXQgSUQgNyB0cnUgMCBpcyBydW5uaW5nIGluCSoKKwkJCSAgICAgICAqIHN5bmNocm9ub3VzIG1vZGUsIHRoaXMgd2lsbCBkaXNhcHBlYXIJKi8KKyAgICBfX3U4ICAgRFNCTEU6MSwJICAgICAgLyogSVNBIGkvbyBhZGRyZXNzaW5nIGlzIGRpc2FibGVkCQkqLworCSBGT1JDQURSOjEsCSAgICAgIC8qIGkvbyBhZGRyZXNzIGhhcyBiZWVuIGZvcmNlZAkJKi8KKwkgIFNHXzY0SzoxLAorCSAgU0dfVUFFOjEsCisJCTo0OworICAgIF9fdTggIE1BWF9JRDo1LAkgICAgICAvKiBNYXggbnVtYmVyIG9mIFNDU0kgdGFyZ2V0IElEcwkJKi8KKwlNQVhfQ0hBTjozOwkgICAgICAvKiBOdW1iZXIgb2YgU0NTSSBidXNzZXMgb24gSEJBCQkqLworICAgIF9fdTggTUFYX0xVTjsJICAgICAgLyogTWF4IG51bWJlciBvZiBMVU5zCQkJKi8KKyAgICBfX3U4CTozLAorCSBBVVRPVFJNOjEsCisJIE0xX2luc3Q6MSwKKwkgSURfcWVzdDoxLAkgICAgICAvKiBSYWlkbnVtIElEIGlzIHF1ZXN0aW9uYWJsZQkJKi8KKwkgIGlzX1BDSToxLAkgICAgICAvKiBIQkEgaXMgUENJCQkJCSovCisJIGlzX0VJU0E6MTsJICAgICAgLyogSEJBIGlzIEVJU0EJCQkJKi8KKyAgICBfX3U4IFJBSUROVU07ICAgICAgICAgICAgIC8qIHVuaXF1ZSBIQkEgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICovCisgICAgX191OCB1bnVzZWRbNDc0XTsgCit9OworCitzdHJ1Y3QgZWF0YV9zZ19saXN0Cit7CisgICAgX191MzIgZGF0YTsKKyAgICBfX3UzMiBsZW47Cit9OworCitzdHJ1Y3QgZWF0YV9jY2IgewkgICAgICAvKiBTZW5kIENvbW1hbmQgUGFja2V0IHN0cnVjdHVyZQkgICAgKi8KKyAKKyAgICBfX3U4IFNDU0lfUmVzZXQ6MSwJICAgICAgLyogQ2F1c2UgYSBTQ1NJIEJ1cyByZXNldCBvbiB0aGUgY21kCSovCisJICAgSEJBX0luaXQ6MSwJICAgICAgLyogQ2F1c2UgQ29udHJvbGxlciB0byByZWluaXRpYWxpemUJKi8KKyAgICAgICBBdXRvX1JlcV9TZW46MSwJICAgICAgLyogRG8gQXV0byBSZXF1ZXN0IFNlbnNlIG9uIGVycm9ycwkqLworCSAgICBzY2F0dGVyOjEsCSAgICAgIC8qIERhdGEgUHRyIHBvaW50cyB0byBhIFNHIFBhY2tldAkJKi8KKwkgICAgIFJlc3J2ZDoxLAkgICAgICAvKiBSRlUJCQkJCSovCisJICBJbnRlcnByZXQ6MSwJICAgICAgLyogSW50ZXJwcmV0IHRoZSBTQ1NJIGNkYiBvZiBvd24gdXNlCSovCisJICAgIERhdGFPdXQ6MSwJICAgICAgLyogRGF0YSBPdXQgcGhhc2Ugd2l0aCBjb21tYW5kCQkqLworCSAgICAgRGF0YUluOjE7CSAgICAgIC8qIERhdGEgSW4gcGhhc2Ugd2l0aCBjb21tYW5kCQkqLworICAgIF9fdTggcmVxbGVuOwkgICAgICAvKiBSZXF1ZXN0IFNlbnNlIExlbmd0aAkJCSogCisJCQkgICAgICAgKiBWYWxpZCBpZiBBdXRvX1JlcV9TZW49MQkJKi8KKyAgICBfX3U4IHVudXNlZFszXTsKKyAgICBfX3U4ICBGV05FU1Q6MSwJICAgICAgLyogc2VuZCBjbWQgdG8gcGh5cyBSQUlEIGNvbXBvbmVudAkqLworCSB1bnVzZWQyOjc7CisgICAgX191OCBQaHN1bml0OjEsCSAgICAgIC8qIHBoeXNpY2FsIHVuaXQgb24gbWlycm9yZWQgcGFpcgkJKi8KKwkgICAgSV9BVDoxLAkgICAgICAvKiBpbmhpYml0IGFkZHJlc3MgdHJhbnNsYXRpb24JCSovCisJIElfSEJBX0M6MSwJICAgICAgLyogSEJBIGluaGliaXQgY2FjaGluZwkJCSovCisJIHVudXNlZDM6NTsKKworICAgIF9fdTggICAgIGNwX2lkOjUsCSAgICAgIC8qIFNDU0kgRGV2aWNlIElEIG9mIHRhcmdldAkJKi8gCisJY3BfY2hhbm5lbDozOwkgICAgICAvKiBTQ1NJIENoYW5uZWwgIyBvZiBIQkEJCQkqLworICAgIF9fdTggICAgY3BfbHVuOjMsCisJCSAgOjIsCisJIGNwX2x1bnRhcjoxLAkgICAgICAvKiBDUCBpcyBmb3IgdGFyZ2V0IFJPVVRJTkUJCSovCisJIGNwX2Rpc3ByaToxLAkgICAgICAvKiBHcmFudCBkaXNjb25uZWN0IHByaXZpbGVnZQkJKi8KKyAgICAgICBjcF9pZGVudGlmeToxOwkgICAgICAvKiBBbHdheXMgVFJVRQkJCQkqLworICAgIF9fdTggY3BfbXNnMTsJICAgICAgLyogTWVzc2FnZSBieXRlcyAwLTMJCQkqLworICAgIF9fdTggY3BfbXNnMjsKKyAgICBfX3U4IGNwX21zZzM7CisgICAgX191OCBjcF9jZGJbMTJdOwkgICAgICAvKiBDb21tYW5kIERlc2NyaXB0b3IgQmxvY2sJCSovCisgICAgX191MzIgY3BfZGF0YWxlbjsJICAgICAgLyogRGF0YSBUcmFuc2ZlciBMZW5ndGgJCQkqCisJCQkgICAgICAgKiBJZiBzY2F0dGVyPTEgbGVuIG9mIHNnIHBhY2thZ2UJCSovCisgICAgdm9pZCAqY3BfdmlyYWRkcjsJICAgICAgLyogYWRkcmVzcyBvZiB0aGlzIGNjYgkJCSovCisgICAgX191MzIgY3BfZGF0YURNQTsJICAgICAgLyogRGF0YSBBZGRyZXNzLCBpZiBzY2F0dGVyPTEJCSoKKwkJCSAgICAgICAqIGFkZHJlc3Mgb2Ygc2NhdHRlciBwYWNrZXQJCSovCisgICAgX191MzIgY3Bfc3RhdERNQTsJICAgICAgLyogYWRkcmVzcyBmb3IgU3RhdHVzIFBhY2tldAkJKi8gCisgICAgX191MzIgY3BfcmVxRE1BOwkgICAgICAvKiBSZXF1ZXN0IFNlbnNlIEFkZHJlc3MsIHVzZWQgaWYJCSoKKwkJCSAgICAgICAqIENQIGNvbW1hbmQgZW5kcyB3aXRoIGVycm9yCQkqLworICAgIC8qIEFkZGl0aW9uYWwgQ1AgaW5mbyBiZWdpbnMgaGVyZSAqLworICAgIF9fdTMyIHRpbWVzdGFtcDsJICAgICAgLyogTmVlZGVkIHRvIG1lYXN1cmUgY29tbWFuZCBsYXRlbmN5CSovCisgICAgX191MzIgdGltZW91dDsKKyAgICBfX3U4IHNpemVpbmRleDsKKyAgICBfX3U4IHJ3X2xhdGVuY3k7CisgICAgX191OCByZXRyaWVzOworICAgIF9fdTggc3RhdHVzOwkgICAgICAvKiBzdGF0dXMgb2YgdGhpcyBxdWV1ZXNsb3QJCSovCisgICAgc3RydWN0IHNjc2lfY21uZCAqY21kOyAgICAvKiBhZGRyZXNzIG9mIGNtZAkJCQkqLworICAgIHN0cnVjdCBlYXRhX3NnX2xpc3QgKnNnX2xpc3Q7Cit9OworCisKK3N0cnVjdCBlYXRhX3NwIHsKKyAgICBfX3U4IGhiYV9zdGF0OjcsCSAgICAgIC8qIEhCQSBzdGF0dXMJCQkJKi8KKwkgICAgICBFT0M6MTsJICAgICAgLyogVHJ1ZSBpZiBjb21tYW5kIGZpbmlzaGVkCQkqLworICAgIF9fdTggc2NzaV9zdGF0OwkgICAgICAvKiBUYXJnZXQgU0NTSSBzdGF0dXMJCQkqLworICAgIF9fdTggcmVzZXJ2ZWRbMl07CisgICAgX191MzIgIHJlc2lkdWVfbGVuOwkgICAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgbm90IHRyYW5zZmVycmVkCSovCisgICAgc3RydWN0IGVhdGFfY2NiICpjY2I7ICAgICAvKiBBZGRyZXNzIHNldCBpbiBDT01NQU5EIFBBQ0tFVAkJKi8KKyAgICBfX3U4IG1zZ1sxMl07Cit9OworCit0eXBlZGVmIHN0cnVjdCBoc3RkIHsKKyAgICBfX3U4ICAgdmVuZG9yWzldOworICAgIF9fdTggICBuYW1lWzE4XTsKKyAgICBfX3U4ICAgcmV2aXNpb25bNl07CisgICAgX191OCAgIEVBVEFfcmV2aXNpb247CisgICAgX191MzIgIGZpcm13YXJlX3JldmlzaW9uOworICAgIF9fdTggICBIQkFfbnVtYmVyOworICAgIF9fdTggICBidXN0eXBlOwkJIC8qIGJ1c3R5cGUgb2YgSEJBCSAgICAgICAqLworICAgIF9fdTggICBjaGFubmVsOwkJIC8qICMgb2YgYXZhaWwuIHNjc2kgY2hhbm5lbHMgICovCisgICAgX191OCAgIHN0YXRlOwkJIC8qIHN0YXRlIG9mIEhCQQkgICAgICAgKi8KKyAgICBfX3U4ICAgcHJpbWFyeTsJCSAvKiB0cnVlIGlmIHByaW1hcnkJICAgICAgICovCisgICAgX191OCAgICAgICAgbW9yZV9zdXBwb3J0OjEsICAvKiBIQkEgc3VwcG9ydHMgTU9SRSBmbGFnICAgICAqLworICAgICAgICAgICBpbW1lZGlhdGVfc3VwcG9ydDoxLCAgLyogSEJBIHN1cHBvcnRzIElNTUVESUFURSBDTURzKi8KKyAgICAgICAgICAgICAgYnJva2VuX0lOUVVJUlk6MTsJIC8qIFRoaXMgaXMgYW4gRUlTQSBIQkEgd2l0aCAgICoKKwkJCQkgICogYnJva2VuIElOUVVJUlkJICAgICAgICovCisgICAgX191OCAgIGRvX2xhdGVuY3k7CQkgLyogTGF0ZW5jeSBtZWFzdXJlbWVudCBmbGFnICAgKi8KKyAgICBfX3UzMiAgcmVhZHNbMTNdOworICAgIF9fdTMyICB3cml0ZXNbMTNdOworICAgIF9fdTMyICByZWFkc19sYXRbMTJdWzRdOworICAgIF9fdTMyICB3cml0ZXNfbGF0WzEyXVs0XTsKKyAgICBfX3UzMiAgYWxsX2xhdFs0XTsKKyAgICBfX3U4ICAgcmVzZXRsZXZlbFtNQVhDSEFOTkVMXTsgCisgICAgX191MzIgIGxhc3RfY2NiOwkJIC8qIExhc3QgdXNlZCBjY2IJICAgICAgICovCisgICAgX191MzIgIGNwbGVuOwkJIC8qIHNpemUgb2YgQ1AgaW4gd29yZHMJICAgICAgICovCisgICAgX191MTYgIGNwcGFkbGVuOwkJIC8qIHBhZCBsZW5ndGggb2YgY3AgaW4gd29yZHMgICovCisgICAgX191MTYgIHF1ZXVlc2l6ZTsKKyAgICBfX3UxNiAgc2dzaXplOyAgICAgICAgICAgICAgIC8qICMgb2YgZW50cmllcyBpbiB0aGUgU0cgbGlzdCovCisgICAgX191MTYgIGRldmZsYWdzOwkJIC8qIGJpdHMgc2V0IGZvciBkZXRlY3RlZCBkZXZpY2VzICovCisgICAgX191OCAgIGhvc3RpZDsJCSAvKiBTQ1NJIElEIG9mIEhCQQkgICAgICAgKi8KKyAgICBfX3U4ICAgbW9yZXN1cHBvcnQ7CQkgLyogSEJBIHN1cHBvcnRzIE1PUkUgZmxhZyAgICAgKi8KKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpuZXh0OwkgICAgCisgICAgc3RydWN0IFNjc2lfSG9zdCAqcHJldjsKKyAgICBzdHJ1Y3QgZWF0YV9zcCBzcDsJCSAvKiBzdGF0dXMgcGFja2V0CSAgICAgICAqLyAKKyAgICBzdHJ1Y3QgZWF0YV9jY2IgY2NiWzBdOwkgLyogY2NiIGFycmF5IGJlZ2lucyBoZXJlICAgICAgKi8KK31ob3N0ZGF0YTsKKworLyogc3RydWN0dXJlIGZvciBtYXguIDIgZW11bGF0ZWQgZHJpdmVzICovCitzdHJ1Y3QgZHJpdmVfZ2VvbV9lbXVsIHsKKyAgICBfX3U4ICB0cmFuczsJCSAvKiB0cmFuc2xhdGlvbiBmbGFnIDE9dHJhbnNsICovCisgICAgX191OCAgY2hhbm5lbDsJCSAvKiBTQ1NJIGNoYW5uZWwgbnVtYmVyCSAgICAgICovCisgICAgX191OCAgSEJBOwkJCSAvKiBIQkEgbnVtYmVyIChwcmltL3NlYykgICAgICovCisgICAgX191OCAgaWQ7CQkJIC8qIGRyaXZlIGlkCQkgICAgICAqLworICAgIF9fdTggIGx1bjsJCQkgLyogZHJpdmUgbHVuCQkgICAgICAqLworICAgIF9fdTMyIGhlYWRzOwkJIC8qIG51bWJlciBvZiBoZWFkcwkgICAgICAqLworICAgIF9fdTMyIHNlY3RvcnM7CQkgLyogbnVtYmVyIG9mIHNlY3RvcnMJICAgICAgKi8KKyAgICBfX3UzMiBjeWxpbmRlcjsJCSAvKiBudW1iZXIgb2YgY3lsaW5kZXJzCSAgICAgICovCit9OworCitzdHJ1Y3QgZ2VvbV9lbXVsIHsKKyAgICBfX3U4IGJpb3NfZHJpdmVzOwkJIC8qIG51bWJlciBvZiBlbXVsYXRlZCBkcml2ZXMgKi8KKyAgICBzdHJ1Y3QgZHJpdmVfZ2VvbV9lbXVsIGRydlsyXTsgLyogZHJpdmUgc3RydWN0dXJlcwkgICAgICAqLworfTsKKworI2VuZGlmIC8qIF9FQVRBX0dFTkVSSUNfSCAqLworCisvKgorICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGFsbW9zdCBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgorICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5CisgKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCisgKiBvZiB0aGUgZmlsZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1pbmRlbnQtbGV2ZWw6IDQKKyAqIGMtYnJhY2UtaW1hZ2luYXJ5LW9mZnNldDogMAorICogYy1icmFjZS1vZmZzZXQ6IC00CisgKiBjLWFyZ2RlY2wtaW5kZW50OiA0CisgKiBjLWxhYmVsLW9mZnNldDogLTQKKyAqIGMtY29udGludWVkLXN0YXRlbWVudC1vZmZzZXQ6IDQKKyAqIGMtY29udGludWVkLWJyYWNlLW9mZnNldDogMAorICogdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9lYXRhX3Bpby5jIGIvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlNDlkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9lYXRhX3Bpby5jCkBAIC0wLDAgKzEsOTk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgIExpbnV4IEVBVEEgU0NTSSBQSU8gZHJpdmVyICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgYmFzZWQgb24gdGhlIENBTSBkb2N1bWVudCBDQU0vODktMDA0IHJldi4gMi4wYywgICAgICAgICAqCisgKiAgRFBUJ3MgZHJpdmVyIGtpdCwgc29tZSBpbnRlcm5hbCBkb2N1bWVudHMgYW5kIHNvdXJjZSwgICAqCisgKiAgYW5kIHNldmVyYWwgb3RoZXIgTGludXggc2NzaSBkcml2ZXJzIGFuZCBrZXJuZWwgZG9jcy4gICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgVGhlIGRyaXZlciBjdXJyZW50bHk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgIC1zdXBwb3J0cyBhbGwgRUFUQS1QSU8gYm9hcmRzICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgIC1vbmx5IHN1cHBvcnRzIERBU0QgZGV2aWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgKGMpMTk5My05NiBNaWNoYWVsIE5ldWZmZXIsIEFsZnJlZCBBcm5vbGQgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICBuZXVmZmVyQGdvb2Z5Lnpkdi51bmktbWFpbnouZGUgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICBhLmFybm9sZEBrZmEtanVlbGljaC5kZSAgICAgICAgICAgICAgICAgICAgICAqIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIFVwZGF0ZWQgMjAwMiBieSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiBmb3IgTGludXggICAgKgorICogIDIuNS54IGFuZCB0aGUgbmV3ZXIgbG9ja2luZyBhbmQgZXJyb3IgaGFuZGxpbmcgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCAgKgorICogIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgICAgKgorICogIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgKgorICogIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICAgKgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgKgorICogIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlICAgICAgKgorICogIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgICAgKgorICogIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKgorICogIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsICAgICAgKgorICogIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBrZXJuZWw7IGlmIG5vdCwgd3JpdGUgdG8gKgorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgICAgICAgKgorICogIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoJCQkJCQkJICAgICoKKyAqICBGb3IgdGhlIGF2b2lkYW5jZSBvZiBkb3VidCB0aGUgInByZWZlcnJlZCBmb3JtIiBvZiB0aGlzICoKKyAqICBjb2RlIGlzIG9uZSB3aGljaCBpcyBpbiBhbiBvcGVuIG5vbiBwYXRlbnQgZW5jdW1iZXJlZCAgICoKKyAqICBmb3JtYXQuIFdoZXJlIGNyeXB0b2dyYXBoaWMga2V5IHNpZ25pbmcgZm9ybXMgcGFydCBvZiAgICoKKyAqICB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBleGVjdXRhYmxlIHRoZSBpbmZvcm1hdGlvbiAgICoKKyAqICBpbmNsdWRpbmcga2V5cyBuZWVkZWQgdG8gZ2VuZXJhdGUgYW4gZXF1aXZhbGVudGx5ICAgICAgICoKKyAqICBmdW5jdGlvbmFsIGV4ZWN1dGFibGUgYXJlIGRlZW1lZCB0byBiZSBwYXJ0IG9mIHRoZSAJICAgICoKKyAqICBzb3VyY2UgY29kZSBhcmUgZGVlbWVkIHRvIGJlIHBhcnQgb2YgdGhlIHNvdXJjZSBjb2RlLiAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBsYXN0IGNoYW5nZTogMjAwMi8xMS8wMiAgICAgICAgICAgICAgIE9TOiBMaW51eCAyLjUuNDUgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNpbmNsdWRlICJlYXRhX2dlbmVyaWMuaCIKKyNpbmNsdWRlICJlYXRhX3Bpby5oIgorCisKK3N0YXRpYyB1aW50IElTQWJhc2VzW01BWElTQV0gPQl7CisJIDB4MUYwLCAweDE3MCwgMHgzMzAsIDB4MjMwCit9OworCitzdGF0aWMgdWludCBJU0FpcnFzW01BWElTQV0gPSB7CisJMTQsIDEyLCAxNSwgMTEKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIEVJU0FiYXNlc1tdID0geyAKKwkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEgCit9OworCitzdGF0aWMgdWludCByZWdpc3RlcmVkX0hCQXM7CitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqbGFzdF9IQkE7CitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqZmlyc3RfSEJBOworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVnX0lSUVsxNl07CitzdGF0aWMgdW5zaWduZWQgY2hhciByZWdfSVJRTFsxNl07CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnRfY291bnRlcjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHF1ZXVlX2NvdW50ZXI7CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZTsKKworLyoKKyAqIGVhdGFfcHJvY19pbmZvCisgKiBpbm91dCA6IGRlY2lkZXMgb24gdGhlIGRpcmVjdGlvbiBvZiB0aGUgZGF0YWZsb3cgYW5kIHRoZSBtZWFuaW5nIG9mIHRoZSAKKyAqICAgICAgICAgdmFyaWFibGVzCisgKiBidWZmZXI6IElmIGlub3V0PT1GQUxTRSBkYXRhIGlzIGJlaW5nIHdyaXR0ZW4gdG8gaXQgZWxzZSByZWFkIGZyb20gaXQKKyAqICpzdGFydDogSWYgaW5vdXQ9PUZBTFNFIHN0YXJ0IG9mIHRoZSB2YWxpZCBkYXRhIGluIHRoZSBidWZmZXIKKyAqIG9mZnNldDogSWYgaW5vdXQ9PUZBTFNFIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGltYWdpbmFyeSBmaWxlIAorICogICAgICAgICBmcm9tIHdoaWNoIHdlIHN0YXJ0IHdyaXRpbmcgaW50byB0aGUgYnVmZmVyCisgKiBsZW5ndGg6IElmIGlub3V0PT1GQUxTRSBtYXggbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgYnVmZmVyIAorICogICAgICAgICBlbHNlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyCisgKi8KK3N0YXRpYyBpbnQgZWF0YV9waW9fcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJICAgICAgaW50IGxlbmd0aCwgaW50IHJ3KQoreworICAgIHN0YXRpYyB1OCBidWZmWzUxMl07CisgICAgaW50IHNpemUsIGxlbiA9IDA7CisgICAgb2ZmX3QgYmVnaW4gPSAwLCBwb3MgPSAwOworCisgICAgaWYgKHJ3KQorICAgIAlyZXR1cm4gLUVOT1NZUzsKKyAgICBpZiAob2Zmc2V0ID09IDApCisJbWVtc2V0KGJ1ZmYsIDAsIHNpemVvZihidWZmKSk7CisKKyAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLCAiRUFUQSAoRXh0ZW5kZWQgQXR0YWNobWVudCkgUElPIGRyaXZlciB2ZXJzaW9uOiAiCisJCSAgICIlZC4lZCVzXG4iLFZFUl9NQUpPUiwgVkVSX01JTk9SLCBWRVJfU1VCKTsKKyAgICBsZW4gKz0gc2l6ZTsgcG9zID0gYmVnaW4gKyBsZW47CisgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyICsgbGVuLCAicXVldWVkIGNvbW1hbmRzOiAgICAgJTEwbGRcbiIKKwkJICAgInByb2Nlc3NlZCBpbnRlcnJ1cHRzOiUxMGxkXG4iLCBxdWV1ZV9jb3VudGVyLCBpbnRfY291bnRlcik7CisgICAgbGVuICs9IHNpemU7IHBvcyA9IGJlZ2luICsgbGVuOworICAgIAorICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIlxuc2NzaSUtMmQ6IEhCQSAlLjEwc1xuIiwKKwkJICAgc2hvc3QtPmhvc3Rfbm8sIFNEKHNob3N0KS0+bmFtZSk7CisgICAgbGVuICs9IHNpemU7IAorICAgIHBvcyA9IGJlZ2luICsgbGVuOworICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIkZpcm13YXJlIHJldmlzaW9uOiB2JXNcbiIsIAorCQkgICBTRChzaG9zdCktPnJldmlzaW9uKTsKKyAgICBsZW4gKz0gc2l6ZTsKKyAgICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICBzaXplID0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJJTzogUElPXG4iKTsKKyAgICBsZW4gKz0gc2l6ZTsgCisgICAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiQmFzZSBJTyA6ICUjLjR4XG4iLCAodTMyKSBzaG9zdC0+YmFzZSk7CisgICAgbGVuICs9IHNpemU7IAorICAgIHBvcyA9IGJlZ2luICsgbGVuOworICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIkhvc3QgQnVzOiAlc1xuIiwgCisJCSAgIChTRChzaG9zdCktPmJ1c3R5cGUgPT0gJ1AnKT8iUENJICI6CisJCSAgIChTRChzaG9zdCktPmJ1c3R5cGUgPT0gJ0UnKT8iRUlTQSI6IklTQSAiKTsKKyAgICAKKyAgICBsZW4gKz0gc2l6ZTsgCisgICAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgCisgICAgaWYgKHBvcyA8IG9mZnNldCkgeworCWxlbiA9IDA7CisJYmVnaW4gPSBwb3M7CisgICAgfQorICAgIGlmIChwb3MgPiBvZmZzZXQgKyBsZW5ndGgpCisJZ290byBzdG9wX291dHB1dDsKKyAgICAKKyBzdG9wX291dHB1dDoKKyAgICBEQkcoREJHX1BST0MsIHByaW50aygiMnBvczogJWxkIG9mZnNldDogJWxkIGxlbjogJWRcbiIsIHBvcywgb2Zmc2V0LCBsZW4pKTsKKyAgICAqc3RhcnQ9YnVmZmVyKyhvZmZzZXQtYmVnaW4pOyAgIC8qIFN0YXJ0IG9mIHdhbnRlZCBkYXRhICovCisgICAgbGVuLT0ob2Zmc2V0LWJlZ2luKTsgICAgICAgICAgICAvKiBTdGFydCBzbG9wICovCisgICAgaWYobGVuPmxlbmd0aCkKKwlsZW4gPSBsZW5ndGg7ICAgICAgICAgICAgICAgLyogRW5kaW5nIHNsb3AgKi8KKyAgICBEQkcoREJHX1BST0MsIHByaW50aygiM3BvczogJWxkIG9mZnNldDogJWxkIGxlbjogJWRcbiIsIHBvcywgb2Zmc2V0LCBsZW4pKTsKKyAgICAKKyAgICByZXR1cm4gKGxlbik7ICAgICAKK30KKworc3RhdGljIGludCBlYXRhX3Bpb19yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNoKQoreworCWlmIChzaC0+aXJxICYmIHJlZ19JUlFbc2gtPmlycV0gPT0gMSkKKwkJZnJlZV9pcnEoc2gtPmlycSwgTlVMTCk7CisJZWxzZQorCQlyZWdfSVJRW3NoLT5pcnFdLS07CisJaWYgKFNEKHNoKS0+Y2hhbm5lbCA9PSAwKSB7CisJCWlmIChzaC0+aW9fcG9ydCAmJiBzaC0+bl9pb19wb3J0KQorCQkJcmVsZWFzZV9yZWdpb24oc2gtPmlvX3BvcnQsIHNoLT5uX2lvX3BvcnQpOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgSW5jU3RhdChzdHJ1Y3Qgc2NzaV9wb2ludGVyICpTQ3AsIHVpbnQgSW5jcmVtZW50KQoreworCVNDcC0+cHRyICs9IEluY3JlbWVudDsKKwlpZiAoKFNDcC0+dGhpc19yZXNpZHVhbCAtPSBJbmNyZW1lbnQpID09IDApIHsKKwkJaWYgKCgtLVNDcC0+YnVmZmVyc19yZXNpZHVhbCkgPT0gMCkKKwkJCVNDcC0+U3RhdHVzID0gMDsKKwkJZWxzZSB7CisJCQlTQ3AtPmJ1ZmZlcisrOworCQkJU0NwLT5wdHIgPSBwYWdlX2FkZHJlc3MoU0NwLT5idWZmZXItPnBhZ2UpICsgU0NwLT5idWZmZXItPm9mZnNldDsKKwkJCVNDcC0+dGhpc19yZXNpZHVhbCA9IFNDcC0+YnVmZmVyLT5sZW5ndGg7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVhdGFfcGlvX2ludF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCitzdGF0aWMgaXJxcmV0dXJuX3QgZG9fZWF0YV9waW9faW50X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpkZXYgPSBkZXZfaWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCWVhdGFfcGlvX2ludF9oYW5kbGVyKGlycSwgZGV2X2lkLCByZWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBlYXRhX3Bpb19pbnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVpbnQgZWF0YV9zdGF0ID0gMHhmZmZmZjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJaG9zdGRhdGEgKmhkOworCXN0cnVjdCBlYXRhX2NjYiAqY3A7CisJdWludCBiYXNlOworCXVpbnQgeCwgejsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaDsKKwl1bnNpZ25lZCBzaG9ydCB6d2lja2VsID0gMDsKKwl1bnNpZ25lZCBjaGFyIHN0YXQsIG9kZDsKKworCWZvciAoeCA9IDEsIHNoID0gZmlyc3RfSEJBOyB4IDw9IHJlZ2lzdGVyZWRfSEJBczsgeCsrLCBzaCA9IFNEKHNoKS0+cHJldikgCisJeworCQlpZiAoc2gtPmlycSAhPSBpcnEpCisJCQljb250aW51ZTsKKwkJaWYgKGluYigodWludCkgc2gtPmJhc2UgKyBIQV9SU1RBVFVTKSAmIEhBX1NCVVNZKQorCQkJY29udGludWU7CisKKwkJaW50X2NvdW50ZXIrKzsKKworCQloZCA9IFNEKHNoKTsKKworCQljcCA9ICZoZC0+Y2NiWzBdOworCQljbWQgPSBjcC0+Y21kOworCQliYXNlID0gKHVpbnQpIGNtZC0+ZGV2aWNlLT5ob3N0LT5iYXNlOworCisJCWRvIHsKKwkJCXN0YXQgPSBpbmIoYmFzZSArIEhBX1JTVEFUVVMpOworCQkJaWYgKHN0YXQgJiBIQV9TRFJRKSB7CisJCQkJaWYgKGNwLT5EYXRhSW4pIHsKKwkJCQkJeiA9IDI1NjsKKwkJCQkJb2RkID0gMDsKKwkJCQkJd2hpbGUgKChjbWQtPlNDcC5TdGF0dXMpICYmICgoeiA+IDApIHx8IChvZGQpKSkgeworCQkJCQkJaWYgKG9kZCkgeworCQkJCQkJCSooY21kLT5TQ3AucHRyKSA9IHp3aWNrZWwgPj4gODsKKwkJCQkJCQlJbmNTdGF0KCZjbWQtPlNDcCwgMSk7CisJCQkJCQkJb2RkID0gMDsKKwkJCQkJCX0KKwkJCQkJCXggPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHosIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgLyAyKTsKKwkJCQkJCWluc3coYmFzZSArIEhBX1JEQVRBLCBjbWQtPlNDcC5wdHIsIHgpOworCQkJCQkJeiAtPSB4OworCQkJCQkJSW5jU3RhdCgmY21kLT5TQ3AsIDIgKiB4KTsKKwkJCQkJCWlmICgoeiA+IDApICYmIChjbWQtPlNDcC50aGlzX3Jlc2lkdWFsID09IDEpKSB7CisJCQkJCQkJendpY2tlbCA9IGludyhiYXNlICsgSEFfUkRBVEEpOworCQkJCQkJCSooY21kLT5TQ3AucHRyKSA9IHp3aWNrZWwgJiAweGZmOworCQkJCQkJCUluY1N0YXQoJmNtZC0+U0NwLCAxKTsKKwkJCQkJCQl6LS07CisJCQkJCQkJb2RkID0gMTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQl3aGlsZSAoeiA+IDApIHsKKwkJCQkJCXp3aWNrZWwgPSBpbncoYmFzZSArIEhBX1JEQVRBKTsKKwkJCQkJCXotLTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CS8qIGNwLT5EYXRhT3V0ICovCisKKwkJCQkJb2RkID0gMDsKKwkJCQkJeiA9IDI1NjsKKwkJCQkJd2hpbGUgKChjbWQtPlNDcC5TdGF0dXMpICYmICgoeiA+IDApIHx8IChvZGQpKSkgeworCQkJCQkJaWYgKG9kZCkgeworCQkJCQkJCXp3aWNrZWwgKz0gKihjbWQtPlNDcC5wdHIpIDw8IDg7CisJCQkJCQkJSW5jU3RhdCgmY21kLT5TQ3AsIDEpOworCQkJCQkJCW91dHcoendpY2tlbCwgYmFzZSArIEhBX1JEQVRBKTsKKwkJCQkJCQl6LS07CisJCQkJCQkJb2RkID0gMDsKKwkJCQkJCX0KKwkJCQkJCXggPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHosIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgLyAyKTsKKwkJCQkJCW91dHN3KGJhc2UgKyBIQV9SREFUQSwgY21kLT5TQ3AucHRyLCB4KTsKKwkJCQkJCXogLT0geDsKKwkJCQkJCUluY1N0YXQoJmNtZC0+U0NwLCAyICogeCk7CisJCQkJCQlpZiAoKHogPiAwKSAmJiAoY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9PSAxKSkgeworCQkJCQkJCXp3aWNrZWwgPSAqKGNtZC0+U0NwLnB0cik7CisJCQkJCQkJendpY2tlbCAmPSAweGZmOworCQkJCQkJCUluY1N0YXQoJmNtZC0+U0NwLCAxKTsKKwkJCQkJCQlvZGQgPSAxOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXdoaWxlICh6ID4gMCB8fCBvZGQpIHsKKwkJCQkJCW91dHcoendpY2tlbCwgYmFzZSArIEhBX1JEQVRBKTsKKwkJCQkJCXotLTsKKwkJCQkJCW9kZCA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJd2hpbGUgKChzdGF0ICYgSEFfU0RSUSkgfHwgKChzdGF0ICYgSEFfU01PUkUpICYmIGhkLT5tb3Jlc3VwcG9ydCkpOworCisJCS8qIHRlcm1pbmF0ZSBoYW5kbGVyIGlmIEhCQSBnb2VzIGJ1c3kgYWdhaW4sIGkuZS4gdHJhbnNmZXJzCisJCSAqIG1vcmUgZGF0YSAqLworCisJCWlmIChzdGF0ICYgSEFfU0JVU1kpCisJCQlicmVhazsKKworCQkvKiBPSywgdGhpcyBpcyBxdWl0ZSBzdHVwaWQsIGJ1dCBJIGhhdmVuJ3QgZm91bmQgYW55IGNvcnJlY3QKKwkJICogd2F5IHRvIGdldCBIQkEmU0NTSSBzdGF0dXMgc28gZmFyICovCisKKwkJaWYgKCEoaW5iKGJhc2UgKyBIQV9SU1RBVFVTKSAmIEhBX1NFUlJPUikpIHsKKwkJCWNtZC0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNik7CisJCQloZC0+ZGV2ZmxhZ3MgfD0gKDEgPDwgY3AtPmNwX2lkKTsKKwkJfSBlbHNlIGlmIChoZC0+ZGV2ZmxhZ3MgJiAxIDw8IGNwLT5jcF9pZCkKKwkJCWNtZC0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgKyAweDAyOworCQllbHNlCisJCQljbWQtPnJlc3VsdCA9IChESURfTk9fQ09OTkVDVCA8PCAxNik7CisKKwkJaWYgKGNwLT5zdGF0dXMgPT0gTE9DS0VEKSB7CisJCQljcC0+c3RhdHVzID0gRlJFRTsKKwkJCWVhdGFfc3RhdCA9IGluYihiYXNlICsgSEFfUlNUQVRVUyk7CisJCQlwcmludGsoS0VSTl9DUklUICJlYXRhX3BpbzogaW50X2hhbmRsZXIsIGZyZWVpbmcgbG9ja2VkICIgInF1ZXVlc2xvdFxuIik7CisJCQlyZXR1cm47CisJCX0KKyNpZiBEQkdfSU5UUjIKKwkJaWYgKHN0YXQgIT0gMHg1MCkKKwkJCXByaW50ayhLRVJOX0RFQlVHICJzdGF0OiAlIy4yeCwgcmVzdWx0OiAlIy44eFxuIiwgc3RhdCwgY21kLT5yZXN1bHQpOworI2VuZGlmCisKKwkJY3AtPnN0YXR1cyA9IEZSRUU7CS8qIG5vdyB3ZSBjYW4gcmVsZWFzZSB0aGUgc2xvdCAgKi8KKworCQljbWQtPnNjc2lfZG9uZShjbWQpOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB1aW50IGVhdGFfcGlvX3NlbmRfY29tbWFuZCh1aW50IGJhc2UsIHVuc2lnbmVkIGNoYXIgY29tbWFuZCkKK3sKKwl1aW50IGxvb3AgPSBIWiAvIDI7CisKKwl3aGlsZSAoaW5iKGJhc2UgKyBIQV9SU1RBVFVTKSAmIEhBX1NCVVNZKQorCQlpZiAoLS1sb29wID09IDApCisJCQlyZXR1cm4gMTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGZvciBIQkEuICBJdCBpcyBub3QgdGhlIGJlc3Qgd2F5IHRvIGRvIGl0IGF0IHRoaXMKKwkgKiBwbGFjZSwgYnV0IEkgaG9wZSB0aGF0IGl0IGRvZXNuJ3QgaW50ZXJmZXJlIHdpdGggdGhlIElERSBkcml2ZXIgCisJICogaW5pdGlhbGl6YXRpb24gdGhpcyB3YXkgKi8KKworCW91dGIoSEFfQ1RSTF84SEVBRFMsIGJhc2UgKyBIQV9DVFJMUkVHKTsKKworCW91dGIoY29tbWFuZCwgYmFzZSArIEhBX1dDT01NQU5EKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlYXRhX3Bpb19xdWV1ZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCXZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCXVpbnQgeCwgeTsKKwl1aW50IGJhc2U7CisKKwlob3N0ZGF0YSAqaGQ7CisJc3RydWN0IFNjc2lfSG9zdCAqc2g7CisJc3RydWN0IGVhdGFfY2NiICpjcDsKKworCXF1ZXVlX2NvdW50ZXIrKzsKKworCWhkID0gSEQoY21kKTsKKwlzaCA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCWJhc2UgPSAodWludCkgc2gtPmJhc2U7CisKKwkvKiB1c2Ugb25seSBzbG90IDAsIGFzIDIwMDEgY2FuIGhhbmRsZSBvbmx5IG9uZSBjbWQgYXQgYSB0aW1lICovCisKKwl5ID0geCA9IDA7CisKKwlpZiAoaGQtPmNjYlt5XS5zdGF0dXMgIT0gRlJFRSkgeworCisJCURCRyhEQkdfUVVFVUUsIHByaW50ayhLRVJOX0VNRVJHICJjYW5fcXVldWUgJWQsIHggJWQsIHkgJWRcbiIsIHNoLT5jYW5fcXVldWUsIHgsIHkpKTsKKyNpZiBERUJVR19FQVRBCisJCXBhbmljKEtFUk5fRU1FUkcgImVhdGFfcGlvOiBydW4gb3V0IG9mIHF1ZXVlIHNsb3RzIGNtZG5vOiVsZCAiICJpbnRybm86ICVsZFxuIiwgcXVldWVfY291bnRlciwgaW50X2NvdW50ZXIpOworI2Vsc2UKKwkJcGFuaWMoS0VSTl9FTUVSRyAiZWF0YV9waW86IHJ1biBvdXQgb2YgcXVldWUgc2xvdHMuLi4uXG4iKTsKKyNlbmRpZgorCX0KKworCWNwID0gJmhkLT5jY2JbeV07CisKKwltZW1zZXQoY3AsIDAsIHNpemVvZihzdHJ1Y3QgZWF0YV9jY2IpKTsKKwltZW1zZXQoY21kLT5zZW5zZV9idWZmZXIsIDAsIHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpOworCisJY3AtPnN0YXR1cyA9IFVTRUQ7CS8qIGNsYWltIGZyZWUgc2xvdCAqLworCisJREJHKERCR19RVUVVRSwgcHJpbnRrKEtFUk5fREVCVUcgImVhdGFfcGlvX3F1ZXVlIHBpZCAlbGQsIHRhcmdldDogJXgsIGx1bjoiICIgJXgsIHkgJWRcbiIsIGNtZC0+cGlkLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sIHkpKTsKKworCWNtZC0+c2NzaV9kb25lID0gKHZvaWQgKikgZG9uZTsKKworCWlmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpCisJCWNwLT5EYXRhT3V0ID0gMTsJLyogT3V0cHV0IG1vZGUgKi8KKwllbHNlCisJCWNwLT5EYXRhSW4gPSAwOwkvKiBJbnB1dCBtb2RlICAqLworCisJY3AtPkludGVycHJldCA9IChjbWQtPmRldmljZS0+aWQgPT0gaGQtPmhvc3RpZCk7CisJY3AtPmNwX2RhdGFsZW4gPSBodG9ubCgodW5zaWduZWQgbG9uZykgY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCWNwLT5BdXRvX1JlcV9TZW4gPSAwOworCWNwLT5jcF9yZXFETUEgPSBodG9ubCgwKTsKKwljcC0+cmVxbGVuID0gMDsKKworCWNwLT5jcF9pZCA9IGNtZC0+ZGV2aWNlLT5pZDsKKwljcC0+Y3BfbHVuID0gY21kLT5kZXZpY2UtPmx1bjsKKwljcC0+Y3BfZGlzcHJpID0gMDsKKwljcC0+Y3BfaWRlbnRpZnkgPSAxOworCW1lbWNweShjcC0+Y3BfY2RiLCBjbWQtPmNtbmQsIENPTU1BTkRfU0laRSgqY21kLT5jbW5kKSk7CisKKwljcC0+Y3Bfc3RhdERNQSA9IGh0b25sKDApOworCisJY3AtPmNwX3ZpcmFkZHIgPSBjcDsKKwljcC0+Y21kID0gY21kOworCWNtZC0+aG9zdF9zY3JpYmJsZSA9IChjaGFyICopICZoZC0+Y2NiW3ldOworCisJaWYgKGNtZC0+dXNlX3NnID09IDApIHsKKwkJY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IDE7CisJCWNtZC0+U0NwLnB0ciA9IGNtZC0+cmVxdWVzdF9idWZmZXI7CisJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJY21kLT5TQ3AuYnVmZmVyID0gTlVMTDsKKwl9IGVsc2UgeworCQljbWQtPlNDcC5idWZmZXIgPSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCQljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gY21kLT51c2Vfc2c7CisJCWNtZC0+U0NwLnB0ciA9IHBhZ2VfYWRkcmVzcyhjbWQtPlNDcC5idWZmZXItPnBhZ2UpICsgY21kLT5TQ3AuYnVmZmVyLT5vZmZzZXQ7CisJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBjbWQtPlNDcC5idWZmZXItPmxlbmd0aDsKKwl9CisJY21kLT5TQ3AuU3RhdHVzID0gKGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgIT0gMCk7CS8qIFRSVUUgYXMgbG9uZyBhcyBieXRlcyAKKwkJCQkJCQkJICogYXJlIHRvIHRyYW5zZmVyICovCisKKwlpZiAoZWF0YV9waW9fc2VuZF9jb21tYW5kKGJhc2UsIEVBVEFfQ01EX1BJT19TRU5EX0NQKSkgeworCQljbWQtPnJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNjsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJlYXRhX3Bpb19xdWV1ZSB0YXJnZXQgJWQsIHBpZCAlbGQsIEhCQSBidXN5LCAiICJyZXR1cm5pbmcgRElEX0JVU19CVVNZLCBkb25lLlxuIiwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPnBpZCk7CisJCWRvbmUoY21kKTsKKwkJY3AtPnN0YXR1cyA9IEZSRUU7CisJCXJldHVybiAoMCk7CisJfQorCS8qIEZJWE1FOiB0aW1lb3V0ICovCisJd2hpbGUgKCEoaW5iKGJhc2UgKyBIQV9SU1RBVFVTKSAmIEhBX1NEUlEpKQorCQljcHVfcmVsYXgoKTsKKwlvdXRzdyhiYXNlICsgSEFfUkRBVEEsIGNwLCBoZC0+Y3BsZW4pOworCW91dGIoRUFUQV9DTURfUElPX1RSVU5DLCBiYXNlICsgSEFfV0NPTU1BTkQpOworCWZvciAoeCA9IDA7IHggPCBoZC0+Y3BwYWRsZW47IHgrKykKKwkJb3V0dygwLCBiYXNlICsgSEFfUkRBVEEpOworCisJREJHKERCR19RVUVVRSwgcHJpbnRrKEtFUk5fREVCVUcgIlF1ZXVlZCBiYXNlICUjLjRseCBwaWQ6ICVsZCB0YXJnZXQ6ICV4ICIgImx1bjogJXggc2xvdCAlZCBpcnEgJWRcbiIsIChsb25nKSBzaC0+YmFzZSwgY21kLT5waWQsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwgeSwgc2gtPmlycSkpOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBlYXRhX3Bpb19hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJdWludCBsb29wID0gSFo7CisKKwlEQkcoREJHX0FCTk9STSwgcHJpbnRrKEtFUk5fV0FSTklORyAiZWF0YV9waW9fYWJvcnQgY2FsbGVkIHBpZDogJWxkICIgInRhcmdldDogJXggbHVuOiAleCByZWFzb24gJXhcbiIsIGNtZC0+cGlkLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sIGNtZC0+YWJvcnRfcmVhc29uKSk7CisKKworCXdoaWxlIChpbmIoY21kLT5kZXZpY2UtPmhvc3QtPmJhc2UgKyBIQV9SQVVYU1RBVCkgJiBIQV9BQlVTWSkKKwkJaWYgKC0tbG9vcCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJlYXRhX3BpbzogYWJvcnQsIHRpbWVvdXQgZXJyb3IuXG4iKTsKKwkJCXJldHVybiBGQUlMRUQ7CisJCX0KKwlpZiAoQ0QoY21kKS0+c3RhdHVzID09IEZSRUUpIHsKKwkJREJHKERCR19BQk5PUk0sIHByaW50ayhLRVJOX1dBUk5JTkcgIlJldHVybmluZzogU0NTSV9BQk9SVF9OT1RfUlVOTklOR1xuIikpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKwlpZiAoQ0QoY21kKS0+c3RhdHVzID09IFVTRUQpIHsKKwkJREJHKERCR19BQk5PUk0sIHByaW50ayhLRVJOX1dBUk5JTkcgIlJldHVybmluZzogU0NTSV9BQk9SVF9CVVNZXG4iKSk7CisJCS8qIFdlIHdhbnQgdG8gc2xlZXAgYSBiaXQgbW9yZSBoZXJlICovCisJCXJldHVybiBGQUlMRUQ7CQkvKiBTTk9PWkUgKi8KKwl9CisJaWYgKENEKGNtZCktPnN0YXR1cyA9PSBSRVNFVCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJlYXRhX3BpbzogYWJvcnQsIGNvbW1hbmQgcmVzZXQgZXJyb3IuXG4iKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisJaWYgKENEKGNtZCktPnN0YXR1cyA9PSBMT0NLRUQpIHsKKwkJREJHKERCR19BQk5PUk0sIHByaW50ayhLRVJOX1dBUk5JTkcgImVhdGFfcGlvOiBhYm9ydCwgcXVldWUgc2xvdCAiICJsb2NrZWQuXG4iKSk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCXBhbmljKCJlYXRhX3BpbzogYWJvcnQ6IGludmFsaWQgc2xvdCBzdGF0dXNcbiIpOworfQorCitzdGF0aWMgaW50IGVhdGFfcGlvX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXVpbnQgeCwgbGltaXQgPSAwOworCXVuc2lnbmVkIGNoYXIgc3VjY2VzcyA9IDA7CisJc3RydWN0IHNjc2lfY21uZCAqc3A7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCisJREJHKERCR19BQk5PUk0sIHByaW50ayhLRVJOX1dBUk5JTkcgImVhdGFfcGlvX3Jlc2V0IGNhbGxlZCBwaWQ6JWxkIHRhcmdldDoiICIgJXggbHVuOiAleCByZWFzb24gJXhcbiIsIGNtZC0+cGlkLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sIGNtZC0+YWJvcnRfcmVhc29uKSk7CisKKwlpZiAoSEQoY21kKS0+c3RhdGUgPT0gUkVTRVQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWF0YV9waW9fcmVzZXQ6IGV4aXQsIGFscmVhZHkgaW4gcmVzZXQuXG4iKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwkvKiBmb3JjZSBhbGwgc2xvdHMgdG8gYmUgZnJlZSAqLworCisJZm9yICh4ID0gMDsgeCA8IGNtZC0+ZGV2aWNlLT5ob3N0LT5jYW5fcXVldWU7IHgrKykgeworCisJCWlmIChIRChjbWQpLT5jY2JbeF0uc3RhdHVzID09IEZSRUUpCisJCQljb250aW51ZTsKKworCQlzcCA9IEhEKGNtZCktPmNjYlt4XS5jbWQ7CisJCUhEKGNtZCktPmNjYlt4XS5zdGF0dXMgPSBSRVNFVDsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWF0YV9waW9fcmVzZXQ6IHNsb3QgJWQgaW4gcmVzZXQsIHBpZCAlbGQuXG4iLCB4LCBzcC0+cGlkKTsKKworCQlpZiAoc3AgPT0gTlVMTCkKKwkJCXBhbmljKCJlYXRhX3Bpb19yZXNldDogc2xvdCAlZCwgc3A9PU5VTEwuXG4iLCB4KTsKKwl9CisKKwkvKiBoYXJkIHJlc2V0IHRoZSBIQkEgICovCisJb3V0YihFQVRBX0NNRF9SRVNFVCwgKHVpbnQpIGNtZC0+ZGV2aWNlLT5ob3N0LT5iYXNlICsgSEFfV0NPTU1BTkQpOworCisJREJHKERCR19BQk5PUk0sIHByaW50ayhLRVJOX1dBUk5JTkcgImVhdGFfcGlvX3Jlc2V0OiBib2FyZCByZXNldCBkb25lLlxuIikpOworCUhEKGNtZCktPnN0YXRlID0gUkVTRVQ7CisKKwlzcGluX3VubG9ja19pcnEoaG9zdC0+aG9zdF9sb2NrKTsKKwltc2xlZXAoMzAwMCk7CisJc3Bpbl9sb2NrX2lycShob3N0LT5ob3N0X2xvY2spOworCisJREJHKERCR19BQk5PUk0sIHByaW50ayhLRVJOX1dBUk5JTkcgImVhdGFfcGlvX3Jlc2V0OiBpbnRlcnJ1cHRzIGRpc2FibGVkLCAiICJsb29wcyAlZC5cbiIsIGxpbWl0KSk7CisKKwlmb3IgKHggPSAwOyB4IDwgY21kLT5kZXZpY2UtPmhvc3QtPmNhbl9xdWV1ZTsgeCsrKSB7CisKKwkJLyogU2tpcCBzbG90cyBhbHJlYWR5IHNldCBmcmVlIGJ5IGludGVycnVwdCAqLworCQlpZiAoSEQoY21kKS0+Y2NiW3hdLnN0YXR1cyAhPSBSRVNFVCkKKwkJCWNvbnRpbnVlOworCisJCXNwID0gSEQoY21kKS0+Y2NiW3hdLmNtZDsKKwkJc3AtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKworCQkvKiBUaGlzIG1haWxib3ggaXMgdGVybWluYXRlZCAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICJlYXRhX3Bpb19yZXNldDogcmVzZXQgY2NiICVkLlxuIiwgeCk7CisJCUhEKGNtZCktPmNjYlt4XS5zdGF0dXMgPSBGUkVFOworCisJCXNwLT5zY3NpX2RvbmUoc3ApOworCX0KKworCUhEKGNtZCktPnN0YXRlID0gMDsKKworCWlmIChzdWNjZXNzKSB7CQkvKiBobW1tLi4uICovCisJCURCRyhEQkdfQUJOT1JNLCBwcmludGsoS0VSTl9XQVJOSU5HICJlYXRhX3Bpb19yZXNldDogZXhpdCwgc3VjY2Vzcy5cbiIpKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfSBlbHNlIHsKKwkJREJHKERCR19BQk5PUk0sIHByaW50ayhLRVJOX1dBUk5JTkcgImVhdGFfcGlvX3Jlc2V0OiBleGl0LCB3YWtldXAuXG4iKSk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorfQorCitzdGF0aWMgY2hhciAqZ2V0X3Bpb19ib2FyZF9kYXRhKHVuc2lnbmVkIGxvbmcgYmFzZSwgdWludCBpcnEsIHVpbnQgaWQsIHVuc2lnbmVkIGxvbmcgY3BsZW4sIHVuc2lnbmVkIHNob3J0IGNwcGFkbGVuKQoreworCXN0cnVjdCBlYXRhX2NjYiBjcDsKKwlzdGF0aWMgY2hhciBidWZmWzI1Nl07CisJaW50IHo7CisKKwltZW1zZXQoJmNwLCAwLCBzaXplb2Yoc3RydWN0IGVhdGFfY2NiKSk7CisJbWVtc2V0KGJ1ZmYsIDAsIHNpemVvZihidWZmKSk7CisKKwljcC5EYXRhSW4gPSAxOworCWNwLkludGVycHJldCA9IDE7CS8qIEludGVycHJldCBjb21tYW5kICovCisKKwljcC5jcF9kYXRhbGVuID0gaHRvbmwoMjU0KTsKKwljcC5jcF9kYXRhRE1BID0gaHRvbmwoMCk7CisKKwljcC5jcF9pZCA9IGlkOworCWNwLmNwX2x1biA9IDA7CisKKwljcC5jcF9jZGJbMF0gPSBJTlFVSVJZOworCWNwLmNwX2NkYlsxXSA9IDA7CisJY3AuY3BfY2RiWzJdID0gMDsKKwljcC5jcF9jZGJbM10gPSAwOworCWNwLmNwX2NkYls0XSA9IDI1NDsKKwljcC5jcF9jZGJbNV0gPSAwOworCisJaWYgKGVhdGFfcGlvX3NlbmRfY29tbWFuZCgodWludCkgYmFzZSwgRUFUQV9DTURfUElPX1NFTkRfQ1ApKQorCQlyZXR1cm4gKE5VTEwpOworCXdoaWxlICghKGluYihiYXNlICsgSEFfUlNUQVRVUykgJiBIQV9TRFJRKSk7CisJb3V0c3coYmFzZSArIEhBX1JEQVRBLCAmY3AsIGNwbGVuKTsKKwlvdXRiKEVBVEFfQ01EX1BJT19UUlVOQywgYmFzZSArIEhBX1dDT01NQU5EKTsKKwlmb3IgKHogPSAwOyB6IDwgY3BwYWRsZW47IHorKykKKwkJb3V0dygwLCBiYXNlICsgSEFfUkRBVEEpOworCisJd2hpbGUgKGluYihiYXNlICsgSEFfUlNUQVRVUykgJiBIQV9TQlVTWSk7CisJaWYgKGluYihiYXNlICsgSEFfUlNUQVRVUykgJiBIQV9TRVJST1IpCisJCXJldHVybiAoTlVMTCk7CisJZWxzZSBpZiAoIShpbmIoYmFzZSArIEhBX1JTVEFUVVMpICYgSEFfU0RSUSkpCisJCXJldHVybiAoTlVMTCk7CisJZWxzZSB7CisJCWluc3coYmFzZSArIEhBX1JEQVRBLCAmYnVmZiwgMTI3KTsKKwkJd2hpbGUgKGluYihiYXNlICsgSEFfUlNUQVRVUykgJiBIQV9TRFJRKQorCQkJaW53KGJhc2UgKyBIQV9SREFUQSk7CisJCXJldHVybiAoYnVmZik7CisJfQorfQorCitzdGF0aWMgaW50IGdldF9waW9fY29uZl9QSU8odTMyIGJhc2UsIHN0cnVjdCBnZXRfY29uZiAqYnVmKQoreworCXVuc2lnbmVkIGxvbmcgbG9vcCA9IEhaIC8gMjsKKwlpbnQgejsKKwl1bnNpZ25lZCBzaG9ydCAqcDsKKworCWlmICghcmVxdWVzdF9yZWdpb24oYmFzZSwgOSwgImVhdGFfcGlvIikpCisJCXJldHVybiAwOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKHN0cnVjdCBnZXRfY29uZikpOworCisJd2hpbGUgKGluYihiYXNlICsgSEFfUlNUQVRVUykgJiBIQV9TQlVTWSkKKwkJaWYgKC0tbG9vcCA9PSAwKQorCQkJZ290byBmYWlsOworCisJREJHKERCR19QSU8gJiYgREJHX1BST0JFLCBwcmludGsoS0VSTl9ERUJVRyAiSXNzdWluZyBQSU8gUkVBRCBDT05GSUcgdG8gSEJBIGF0ICUjeFxuIiwgYmFzZSkpOworCWVhdGFfcGlvX3NlbmRfY29tbWFuZChiYXNlLCBFQVRBX0NNRF9QSU9fUkVBRF9DT05GSUcpOworCisJbG9vcCA9IEhaIC8gMjsKKwlmb3IgKHAgPSAodW5zaWduZWQgc2hvcnQgKikgYnVmOyAobG9uZykgcCA8PSAoKGxvbmcpIGJ1ZiArIChzaXplb2Yoc3RydWN0IGdldF9jb25mKSAvIDIpKTsgcCsrKSB7CisJCXdoaWxlICghKGluYihiYXNlICsgSEFfUlNUQVRVUykgJiBIQV9TRFJRKSkKKwkJCWlmICgtLWxvb3AgPT0gMCkKKwkJCQlnb3RvIGZhaWw7CisKKwkJbG9vcCA9IEhaIC8gMjsKKwkJKnAgPSBpbncoYmFzZSArIEhBX1JEQVRBKTsKKwl9CisJaWYgKGluYihiYXNlICsgSEFfUlNUQVRVUykgJiBIQV9TRVJST1IpIHsKKwkJREJHKERCR19QUk9CRSwgcHJpbnRrKCJlYXRhX2RtYTogZ2V0X2NvbmZfUElPLCBlcnJvciBkdXJpbmcgIgorCQkJCQkidHJhbnNmZXIgZm9yIEhCQSBhdCAleFxuIiwgYmFzZSkpOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKGh0b25sKEVBVEFfU0lHTkFUVVJFKSAhPSBidWYtPnNpZ25hdHVyZSkKKwkJZ290byBmYWlsOworCisJREJHKERCR19QSU8gJiYgREJHX1BST0JFLCBwcmludGsoS0VSTl9OT1RJQ0UgIkVBVEEgQ29udHJvbGxlciBmb3VuZCAiCisJCQkJImF0ICUjNHggRUFUQSBMZXZlbDogJXhcbiIsCisJCQkJYmFzZSwgKHVpbnQpIChidWYtPnZlcnNpb24pKSk7CisKKwl3aGlsZSAoaW5iKGJhc2UgKyBIQV9SU1RBVFVTKSAmIEhBX1NEUlEpCisJCWludyhiYXNlICsgSEFfUkRBVEEpOworCisJaWYgKCFBTExPV19ETUFfQk9BUkRTKSB7CisJCWZvciAoeiA9IDA7IHogPCBNQVhJU0E7IHorKykKKwkJCWlmIChiYXNlID09IElTQWJhc2VzW3pdKSB7CisJCQkJYnVmLT5JUlEgPSBJU0FpcnFzW3pdOworCQkJCWJyZWFrOworCQkJfQorCX0KKworCXJldHVybiAxOworCisgZmFpbDoKKwlyZWxlYXNlX3JlZ2lvbihiYXNlLCA5KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcGlvX2NvbmZpZyhzdHJ1Y3QgZ2V0X2NvbmYgKmdjKQoreworCXByaW50aygiUGxlYXNlIGNoZWNrIHZhbHVlczogKHJlYWQgY29uZmlnIGRhdGEpXG4iKTsKKwlwcmludGsoIkxFTjogJWQgdmVyOiVkIE9DUzolZCBUQVI6JWQgVFJOWEZSOiVkIE1PUkVTOiVkXG4iLCAodWludCkgbnRvaGwoZ2MtPmxlbiksIGdjLT52ZXJzaW9uLCBnYy0+T0NTX2VuYWJsZWQsIGdjLT5UQVJfc3VwcG9ydCwgZ2MtPlRSTlhGUiwgZ2MtPk1PUkVfc3VwcG9ydCk7CisJcHJpbnRrKCJIQUFWOiVkIFNDU0lJRDA6JWQgSUQxOiVkIElEMjolZCBRVUVVRTolZCBTRzolZCBTRUM6JWRcbiIsIGdjLT5IQUFfdmFsaWQsIGdjLT5zY3NpX2lkWzNdLCBnYy0+c2NzaV9pZFsyXSwgZ2MtPnNjc2lfaWRbMV0sIG50b2hzKGdjLT5xdWV1ZXNpeiksIG50b2hzKGdjLT5TR3NpeiksIGdjLT5TRUNPTkQpOworCXByaW50aygiSVJROiVkIElSUVQ6JWQgRk9SQ0FEUjolZCBNQ0g6JWQgUklEUTolZFxuIiwgZ2MtPklSUSwgZ2MtPklSUV9UUiwgZ2MtPkZPUkNBRFIsIGdjLT5NQVhfQ0hBTiwgZ2MtPklEX3Flc3QpOworfQorCitzdGF0aWMgdWludCBwcmludF9zZWxmdGVzdCh1aW50IGJhc2UpCit7CisJdW5zaWduZWQgY2hhciBidWZmZXJbNTEyXTsKKyNpZmRlZiBWRVJCT1NFX1NFVFVQCisJaW50IHo7CisjZW5kaWYKKworCXByaW50aygiZWF0YV9waW86IGV4ZWN1dGluZyBjb250cm9sbGVyIHNlbGYgdGVzdCAmIHNldHVwLi4uXG4iKTsKKwl3aGlsZSAoaW5iKGJhc2UgKyBIQV9SU1RBVFVTKSAmIEhBX1NCVVNZKTsKKwlvdXRiKEVBVEFfQ01EX1BJT19TRVRVUFRFU1QsIGJhc2UgKyBIQV9XQ09NTUFORCk7CisJZG8geworCQl3aGlsZSAoaW5iKGJhc2UgKyBIQV9SU1RBVFVTKSAmIEhBX1NCVVNZKQorCQkJLyogbm90aGluZyAqLyA7CisJCWlmIChpbmIoYmFzZSArIEhBX1JTVEFUVVMpICYgSEFfU0RSUSkgeworCQkJaW5zdyhiYXNlICsgSEFfUkRBVEEsICZidWZmZXIsIDI1Nik7CisjaWZkZWYgVkVSQk9TRV9TRVRVUAorCQkJLyogbm8gYmVlcHMgcGxlYXNlLi4uICovCisJCQlmb3IgKHogPSAwOyB6IDwgNTExICYmIGJ1ZmZlclt6XTsgeisrKQorCQkJCWlmIChidWZmZXJbel0gIT0gNykKKwkJCQkJcHJpbnRrKCIlYyIsIGJ1ZmZlclt6XSk7CisjZW5kaWYKKwkJfQorCX0gd2hpbGUgKGluYihiYXNlICsgSEFfUlNUQVRVUykgJiAoSEFfU0JVU1kgfCBIQV9TRFJRKSk7CisKKwlyZXR1cm4gKCEoaW5iKGJhc2UgKyBIQV9SU1RBVFVTKSAmIEhBX1NFUlJPUikpOworfQorCitzdGF0aWMgaW50IHJlZ2lzdGVyX3Bpb19IQkEobG9uZyBiYXNlLCBzdHJ1Y3QgZ2V0X2NvbmYgKmdjKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDA7CisJY2hhciAqYnVmZjsKKwl1bnNpZ25lZCBsb25nIGNwbGVuOworCXVuc2lnbmVkIHNob3J0IGNwcGFkbGVuOworCXN0cnVjdCBTY3NpX0hvc3QgKnNoOworCWhvc3RkYXRhICpoZDsKKworCURCRyhEQkdfUkVHSVNURVIsIHByaW50X3Bpb19jb25maWcoZ2MpKTsKKworCWlmIChnYy0+RE1BX3N1cHBvcnQpIHsKKwkJcHJpbnRrKCJIQkEgYXQgJSMuNGx4IHN1cHBvcnRzIERNQS4gUGxlYXNlIHVzZSBFQVRBLURNQSBkcml2ZXIuXG4iLCBiYXNlKTsKKwkJaWYgKCFBTExPV19ETUFfQk9BUkRTKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKChidWZmID0gZ2V0X3Bpb19ib2FyZF9kYXRhKCh1aW50KSBiYXNlLCBnYy0+SVJRLCBnYy0+c2NzaV9pZFszXSwgY3BsZW4gPSAoaHRvbmwoZ2MtPmNwbGVuKSArIDEpIC8gMiwgY3BwYWRsZW4gPSAoaHRvbnMoZ2MtPmNwcGFkbGVuKSArIDEpIC8gMikpID09IE5VTEwpIHsKKwkJcHJpbnRrKCJIQkEgYXQgJSNseCBkaWRuJ3QgcmVhY3Qgb24gSU5RVUlSWS4gU29ycnkuXG4iLCAodW5zaWduZWQgbG9uZykgYmFzZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghcHJpbnRfc2VsZnRlc3QoYmFzZSkgJiYgIUFMTE9XX0RNQV9CT0FSRFMpIHsKKwkJcHJpbnRrKCJIQkEgYXQgJSNseCBmYWlsZWQgd2hpbGUgcGVyZm9ybWluZyBzZWxmIHRlc3QgJiBzZXR1cC5cbiIsICh1bnNpZ25lZCBsb25nKSBiYXNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2l6ZSA9IHNpemVvZihob3N0ZGF0YSkgKyAoc2l6ZW9mKHN0cnVjdCBlYXRhX2NjYikgKiBudG9ocyhnYy0+cXVldWVzaXopKTsKKworCXNoID0gc2NzaV9yZWdpc3RlcigmZHJpdmVyX3RlbXBsYXRlLCBzaXplKTsKKwlpZiAoc2ggPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXJlZ19JUlFbZ2MtPklSUV0pIHsJLyogSW50ZXJydXB0IGFscmVhZHkgcmVnaXN0ZXJlZCA/ICovCisJCWlmICghcmVxdWVzdF9pcnEoZ2MtPklSUSwgZG9fZWF0YV9waW9faW50X2hhbmRsZXIsIFNBX0lOVEVSUlVQVCwgIkVBVEEtUElPIiwgc2gpKSB7CisJCQlyZWdfSVJRW2djLT5JUlFdKys7CisJCQlpZiAoIWdjLT5JUlFfVFIpCisJCQkJcmVnX0lSUUxbZ2MtPklSUV0gPSAxOwkvKiBJUlEgaXMgZWRnZSB0cmlnZ2VyZWQgKi8KKwkJfSBlbHNlIHsKKwkJCXByaW50aygiQ291bGRuJ3QgYWxsb2NhdGUgSVJRICVkLCBTb3JyeS5cbiIsIGdjLT5JUlEpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgewkJLyogTW9yZSB0aGFuIG9uZSBIQkEgb24gdGhpcyBJUlEgKi8KKwkJaWYgKHJlZ19JUlFMW2djLT5JUlFdKSB7CisJCQlwcmludGsoIkNhbid0IHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBIQkEgb24gdGhpcyBJUlEsXG4iICIgIGlmIHRoZSBJUlEgaXMgZWRnZSB0cmlnZ2VyZWQuIFNvcnJ5LlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlyZWdfSVJRW2djLT5JUlFdKys7CisJfQorCisJaGQgPSBTRChzaCk7CisKKwltZW1zZXQoaGQtPmNjYiwgMCwgKHNpemVvZihzdHJ1Y3QgZWF0YV9jY2IpICogbnRvaHMoZ2MtPnF1ZXVlc2l6KSkpOworCW1lbXNldChoZC0+cmVhZHMsIDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDI2KTsKKworCXN0cmxjcHkoU0Qoc2gpLT52ZW5kb3IsICZidWZmWzhdLCBzaXplb2YoU0Qoc2gpLT52ZW5kb3IpKTsKKwlzdHJsY3B5KFNEKHNoKS0+bmFtZSwgJmJ1ZmZbMTZdLCBzaXplb2YoU0Qoc2gpLT5uYW1lKSk7CisJU0Qoc2gpLT5yZXZpc2lvblswXSA9IGJ1ZmZbMzJdOworCVNEKHNoKS0+cmV2aXNpb25bMV0gPSBidWZmWzMzXTsKKwlTRChzaCktPnJldmlzaW9uWzJdID0gYnVmZlszNF07CisJU0Qoc2gpLT5yZXZpc2lvblszXSA9ICcuJzsKKwlTRChzaCktPnJldmlzaW9uWzRdID0gYnVmZlszNV07CisJU0Qoc2gpLT5yZXZpc2lvbls1XSA9IDA7CisKKwlzd2l0Y2ggKG50b2hsKGdjLT5sZW4pKSB7CisJY2FzZSAweDFjOgorCQlTRChzaCktPkVBVEFfcmV2aXNpb24gPSAnYSc7CisJCWJyZWFrOworCWNhc2UgMHgxZToKKwkJU0Qoc2gpLT5FQVRBX3JldmlzaW9uID0gJ2InOworCQlicmVhazsKKwljYXNlIDB4MjI6CisJCVNEKHNoKS0+RUFUQV9yZXZpc2lvbiA9ICdjJzsKKwkJYnJlYWs7CisJY2FzZSAweDI0OgorCQlTRChzaCktPkVBVEFfcmV2aXNpb24gPSAneic7CisJZGVmYXVsdDoKKwkJU0Qoc2gpLT5FQVRBX3JldmlzaW9uID0gJz8nOworCX0KKworCWlmIChudG9obChnYy0+bGVuKSA+PSAweDIyKSB7CisJCWlmIChnYy0+aXNfUENJKQorCQkJaGQtPmJ1c3R5cGUgPSBJU19QQ0k7CisJCWVsc2UgaWYgKGdjLT5pc19FSVNBKQorCQkJaGQtPmJ1c3R5cGUgPSBJU19FSVNBOworCQllbHNlCisJCQloZC0+YnVzdHlwZSA9IElTX0lTQTsKKwl9IGVsc2UgeworCQlpZiAoYnVmZlsyMV0gPT0gJzQnKQorCQkJaGQtPmJ1c3R5cGUgPSBJU19QQ0k7CisJCWVsc2UgaWYgKGJ1ZmZbMjFdID09ICcyJykKKwkJCWhkLT5idXN0eXBlID0gSVNfRUlTQTsKKwkJZWxzZQorCQkJaGQtPmJ1c3R5cGUgPSBJU19JU0E7CisJfQorCisJU0Qoc2gpLT5jcGxlbiA9IGNwbGVuOworCVNEKHNoKS0+Y3BwYWRsZW4gPSBjcHBhZGxlbjsKKwlTRChzaCktPmhvc3RpZCA9IGdjLT5zY3NpX2lkWzNdOworCVNEKHNoKS0+ZGV2ZmxhZ3MgPSAxIDw8IGdjLT5zY3NpX2lkWzNdOworCVNEKHNoKS0+bW9yZXN1cHBvcnQgPSBnYy0+TU9SRV9zdXBwb3J0OworCXNoLT51bmlxdWVfaWQgPSBiYXNlOworCXNoLT5iYXNlID0gYmFzZTsKKwlzaC0+aW9fcG9ydCA9IGJhc2U7CisJc2gtPm5faW9fcG9ydCA9IDk7CisJc2gtPmlycSA9IGdjLT5JUlE7CisJc2gtPmRtYV9jaGFubmVsID0gUElPOworCXNoLT50aGlzX2lkID0gZ2MtPnNjc2lfaWRbM107CisJc2gtPmNhbl9xdWV1ZSA9IDE7CisJc2gtPmNtZF9wZXJfbHVuID0gMTsKKwlzaC0+c2dfdGFibGVzaXplID0gU0dfQUxMOworCisJaGQtPmNoYW5uZWwgPSAwOworCisJc2gtPm1heF9pZCA9IDg7CisJc2gtPm1heF9sdW4gPSA4OworCisJaWYgKGdjLT5TRUNPTkQpCisJCWhkLT5wcmltYXJ5ID0gMDsKKwllbHNlCisJCWhkLT5wcmltYXJ5ID0gMTsKKworCXNoLT51bmNoZWNrZWRfaXNhX2RtYSA9IDA7CS8qIFdlIGNhbiBvbmx5IGRvIFBJTyAqLworCisJaGQtPm5leHQgPSBOVUxMOwkvKiBidWlsZCBhIGxpbmtlZCBsaXN0IG9mIGFsbCBIQkFzICovCisJaGQtPnByZXYgPSBsYXN0X0hCQTsKKwlpZiAoaGQtPnByZXYgIT0gTlVMTCkKKwkJU0QoaGQtPnByZXYpLT5uZXh0ID0gc2g7CisJbGFzdF9IQkEgPSBzaDsKKwlpZiAoZmlyc3RfSEJBID09IE5VTEwpCisJCWZpcnN0X0hCQSA9IHNoOworCXJlZ2lzdGVyZWRfSEJBcysrOworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmRfcGlvX0lTQShzdHJ1Y3QgZ2V0X2NvbmYgKmJ1ZikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhJU0E7IGkrKykgeworCQlpZiAoIUlTQWJhc2VzW2ldKQorCQkJY29udGludWU7CisJCWlmICghZ2V0X3Bpb19jb25mX1BJTyhJU0FiYXNlc1tpXSwgYnVmKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXJlZ2lzdGVyX3Bpb19IQkEoSVNBYmFzZXNbaV0sIGJ1ZikpCisJCQlyZWxlYXNlX3JlZ2lvbihJU0FiYXNlc1tpXSwgOSk7CisJCWVsc2UKKwkJCUlTQWJhc2VzW2ldID0gMDsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBmaW5kX3Bpb19FSVNBKHN0cnVjdCBnZXRfY29uZiAqYnVmKQoreworCXUzMiBiYXNlOworCWludCBpOworCisjaWZkZWYgQ0hFQ0tQQUwKKwl1OCBwYWwxLCBwYWwyLCBwYWwzOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYRUlTQTsgaSsrKSB7CisJCWlmIChFSVNBYmFzZXNbaV0pIHsJLyogU3RpbGwgYSBwb3NzaWJpbGl0eSA/ICAgICAgICAgICovCisKKwkJCWJhc2UgPSAweDFjODggKyAoaSAqIDB4MTAwMCk7CisjaWZkZWYgQ0hFQ0tQQUwKKwkJCXBhbDEgPSBpbmIoKHUxNikgYmFzZSAtIDgpOworCQkJcGFsMiA9IGluYigodTE2KSBiYXNlIC0gNyk7CisJCQlwYWwzID0gaW5iKCh1MTYpIGJhc2UgLSA2KTsKKworCQkJaWYgKCgocGFsMSA9PSAweDEyKSAmJiAocGFsMiA9PSAweDE0KSkgfHwgKChwYWwxID09IDB4MzgpICYmIChwYWwyID09IDB4YTMpICYmIChwYWwzID09IDB4ODIpKSB8fCAoKHBhbDEgPT0gMHgwNikgJiYgKHBhbDIgPT0gMHg5NCkgJiYgKHBhbDMgPT0gMHgyNCkpKSB7CisJCQkJREJHKERCR19QUk9CRSwgcHJpbnRrKEtFUk5fTk9USUNFICJFSVNBIEVBVEEgaWQgdGFncyBmb3VuZDogIiAiJXggJXggJXggXG4iLCAoaW50KSBwYWwxLCAoaW50KSBwYWwyLCAoaW50KSBwYWwzKSk7CisjZW5kaWYKKwkJCQlpZiAoZ2V0X3Bpb19jb25mX1BJTyhiYXNlLCBidWYpKSB7CisJCQkJCURCRyhEQkdfUFJPQkUgJiYgREJHX0VJU0EsIHByaW50X3Bpb19jb25maWcoYnVmKSk7CisJCQkJCWlmIChidWYtPklSUSkgeworCQkJCQkJaWYgKCFyZWdpc3Rlcl9waW9fSEJBKGJhc2UsIGJ1ZikpCisJCQkJCQkJcmVsZWFzZV9yZWdpb24oYmFzZSwgOSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgImVhdGFfZG1hOiBObyB2YWxpZCBJUlEuIEhCQSAiICJyZW1vdmVkIGZyb20gbGlzdFxuIik7CisJCQkJCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCA5KTsKKwkJCQkJfQorCQkJCX0KKwkJCQkvKiBOb3RoaW5nIGZvdW5kIGhlcmUgc28gd2UgdGFrZSBpdCBmcm9tIHRoZSBsaXN0ICovCisJCQkJRUlTQWJhc2VzW2ldID0gMDsKKyNpZmRlZiBDSEVDS1BBTAorCQkJfQorI2VuZGlmCisJCX0KKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBmaW5kX3Bpb19QQ0koc3RydWN0IGdldF9jb25mICpidWYpCit7CisjaWZuZGVmIENPTkZJR19QQ0kKKwlwcmludGsoImVhdGFfZG1hOiBrZXJuZWwgUENJIHN1cHBvcnQgbm90IGVuYWJsZWQuIFNraXBwaW5nIHNjYW4gZm9yIFBDSSBIQkFzLlxuIik7CisjZWxzZQorCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCXUzMiBiYXNlLCB4OworCisJd2hpbGUgKChkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9EUFQsIFBDSV9ERVZJQ0VfSURfRFBULCBkZXYpKSAhPSBOVUxMKSB7CisJCURCRyhEQkdfUFJPQkUgJiYgREJHX1BDSSwgcHJpbnRrKCJlYXRhX3BpbzogZmluZF9QQ0ksIEhCQSBhdCAlc1xuIiwgcGNpX25hbWUoZGV2KSkpOworCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkKKwkJCWNvbnRpbnVlOworCQlwY2lfc2V0X21hc3RlcihkZXYpOworCQliYXNlID0gcGNpX3Jlc291cmNlX2ZsYWdzKGRldiwgMCk7CisJCWlmIChiYXNlICYgSU9SRVNPVVJDRV9NRU0pIHsKKwkJCXByaW50aygiZWF0YV9waW86IGludmFsaWQgYmFzZSBhZGRyZXNzIG9mIGRldmljZSAlc1xuIiwgcGNpX25hbWUoZGV2KSk7CisJCQljb250aW51ZTsKKwkJfQorCQliYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCk7CisJCS8qIEVJU0EgdGFnIHRoZXJlID8gKi8KKwkJaWYgKChpbmIoYmFzZSkgPT0gMHgxMikgJiYgKGluYihiYXNlICsgMSkgPT0gMHgxNCkpCisJCQljb250aW51ZTsJLyogSmVwLCBpdCdzIGZvcmNlZCwgc28gbW92ZSBvbiAgKi8KKwkJYmFzZSArPSAweDEwOwkvKiBOb3csIFRISVMgaXMgdGhlIHJlYWwgYWRkcmVzcyAqLworCQlpZiAoYmFzZSAhPSAweDFmOCkgeworCQkJLyogV2UgZGlkbid0IGZpbmQgaXQgaW4gdGhlIHByaW1hcnkgc2VhcmNoICovCisJCQlpZiAoZ2V0X3Bpb19jb25mX1BJTyhiYXNlLCBidWYpKSB7CisJCQkJaWYgKGJ1Zi0+Rk9SQ0FEUikgewkvKiBJZiB0aGUgYWRkcmVzcyBpcyBmb3JjZWQgKi8KKwkJCQkJcmVsZWFzZV9yZWdpb24oYmFzZSwgOSk7CisJCQkJCWNvbnRpbnVlOwkvKiB3ZSdsbCBmaW5kIGl0IGxhdGVyICAgICAgKi8KKwkJCQl9CisKKwkJCQkvKiBPSy4gV2UgbWFkZSBpdCB0aWxsIGhlcmUsIHNvIHdlIGNhbiBnbyBub3cgIAorCQkJCSAqIGFuZCByZWdpc3RlciBpdC4gV2UgIG9ubHkgaGF2ZSB0byBjaGVjayBhbmQgCisJCQkJICogZXZlbnR1YWxseSByZW1vdmUgaXQgZnJvbSB0aGUgRUlTQSBhbmQgSVNBIGxpc3QgCisJCQkJICovCisKKwkJCQlpZiAoIXJlZ2lzdGVyX3Bpb19IQkEoYmFzZSwgYnVmKSkgeworCQkJCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCA5KTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJaWYgKGJhc2UgPCAweDEwMDApIHsKKwkJCQkJZm9yICh4ID0gMDsgeCA8IE1BWElTQTsgKyt4KSB7CisJCQkJCQlpZiAoSVNBYmFzZXNbeF0gPT0gYmFzZSkgeworCQkJCQkJCUlTQWJhc2VzW3hdID0gMDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoKGJhc2UgJiAweDBmZmYpID09IDB4MGM4OCkgeworCQkJCQl4ID0gKGJhc2UgPj4gMTIpICYgMHgwZjsKKwkJCQkJRUlTQWJhc2VzW3hdID0gMDsKKwkJCQl9CisJCQl9CisjaWZkZWYgQ0hFQ0tfQkxJTksKKwkJCWVsc2UgaWYgKGNoZWNrX2JsaW5rX3N0YXRlKGJhc2UpKSB7CisJCQkJcHJpbnRrKCJlYXRhX3BpbzogSEJBIGlzIGluIEJMSU5LIHN0YXRlLlxuIiAiQ29uc3VsdCB5b3VyIEhCQXMgbWFudWFsIHRvIGNvcnJlY3QgdGhpcy5cbiIpOworCQkJfQorI2VuZGlmCisJCX0KKwl9CisjZW5kaWYJCQkJLyogI2lmbmRlZiBDT05GSUdfUENJICovCit9CisKK3N0YXRpYyBpbnQgZWF0YV9waW9fZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqSEJBX3B0cjsKKwlzdHJ1Y3QgZ2V0X2NvbmYgZ2M7CisJaW50IGk7CisKKwlmaW5kX3Bpb19QQ0koJmdjKTsKKwlmaW5kX3Bpb19FSVNBKCZnYyk7CisJZmluZF9waW9fSVNBKCZnYyk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IE1BWElSUTsgaSsrKQorCQlpZiAocmVnX0lSUVtpXSkKKwkJCXJlcXVlc3RfaXJxKGksIGRvX2VhdGFfcGlvX2ludF9oYW5kbGVyLCBTQV9JTlRFUlJVUFQsICJFQVRBLVBJTyIsIE5VTEwpOworCisJSEJBX3B0ciA9IGZpcnN0X0hCQTsKKworCWlmIChyZWdpc3RlcmVkX0hCQXMgIT0gMCkgeworCQlwcmludGsoIkVBVEEgKEV4dGVuZGVkIEF0dGFjaG1lbnQpIFBJTyBkcml2ZXIgdmVyc2lvbjogJWQuJWQlc1xuIgorCQkgICAgICAgIihjKSAxOTkzLTk1IE1pY2hhZWwgTmV1ZmZlciwgbmV1ZmZlckBnb29meS56ZHYudW5pLW1haW56LmRlXG4iICIgICAgICAgICAgICBBbGZyZWQgQXJub2xkLCAgIGEuYXJub2xkQGtmYS1qdWVsaWNoLmRlXG4iICJUaGlzIHJlbGVhc2Ugb25seSBzdXBwb3J0cyBEQVNEIGRldmljZXMgKGhhcmRkaXNrcylcbiIsIFZFUl9NQUpPUiwgVkVSX01JTk9SLCBWRVJfU1VCKTsKKworCQlwcmludGsoIlJlZ2lzdGVyZWQgSEJBczpcbiIpOworCQlwcmludGsoIkhCQSBuby4gQm9hcmR0eXBlOiBSZXZpczogRUFUQTogQnVzOiBCYXNlSU86IElSUTogQ2g6IElEOiBQcjoiICIgUVM6IFNHOiBDUEw6XG4iKTsKKwkJZm9yIChpID0gMTsgaSA8PSByZWdpc3RlcmVkX0hCQXM7IGkrKykgeworCQkJcHJpbnRrKCJzY3NpJS0yZDogJS4xMHMgdiVzIDIuMCVjICAlcyAlIy40eCAgICUyZCAgICVkICAgJWQgICAlYyIKKwkJCSAgICAgICAiICAlMmQgICUyZCAgJTJkXG4iLAorCQkJICAgICAgIEhCQV9wdHItPmhvc3Rfbm8sIFNEKEhCQV9wdHIpLT5uYW1lLCBTRChIQkFfcHRyKS0+cmV2aXNpb24sCisJCQkgICAgICAgU0QoSEJBX3B0ciktPkVBVEFfcmV2aXNpb24sIChTRChIQkFfcHRyKS0+YnVzdHlwZSA9PSAnUCcpID8KKwkJCSAgICAgICAiUENJICIgOiAoU0QoSEJBX3B0ciktPmJ1c3R5cGUgPT0gJ0UnKSA/ICJFSVNBIiA6ICJJU0EgIiwKKwkJCSAgICAgICAodWludCkgSEJBX3B0ci0+YmFzZSwgSEJBX3B0ci0+aXJxLCBTRChIQkFfcHRyKS0+Y2hhbm5lbCwgSEJBX3B0ci0+dGhpc19pZCwKKwkJCSAgICAgICBTRChIQkFfcHRyKS0+cHJpbWFyeSA/ICdZJyA6ICdOJywgSEJBX3B0ci0+Y2FuX3F1ZXVlLAorCQkJICAgICAgIEhCQV9wdHItPnNnX3RhYmxlc2l6ZSwgSEJBX3B0ci0+Y21kX3Blcl9sdW4pOworCQkJSEJBX3B0ciA9IFNEKEhCQV9wdHIpLT5uZXh0OworCQl9CisJfQorCXJldHVybiAocmVnaXN0ZXJlZF9IQkFzKTsKK30KKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gImVhdGFfcGlvIiwKKwkubmFtZSAgICAgICAgICAgICAgCT0gIkVBVEEgKEV4dGVuZGVkIEF0dGFjaG1lbnQpIFBJTyBkcml2ZXIiLAorCS5wcm9jX2luZm8gICAgICAgICAJPSBlYXRhX3Bpb19wcm9jX2luZm8sCisJLmRldGVjdCAgICAgICAgICAgIAk9IGVhdGFfcGlvX2RldGVjdCwKKwkucmVsZWFzZSAgICAgICAgICAgCT0gZWF0YV9waW9fcmVsZWFzZSwKKwkucXVldWVjb21tYW5kICAgICAgCT0gZWF0YV9waW9fcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIgIAk9IGVhdGFfcGlvX2Fib3J0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSBlYXRhX3Bpb19ob3N0X3Jlc2V0LAorCS51c2VfY2x1c3RlcmluZyAgICAJPSBFTkFCTEVfQ0xVU1RFUklORywKK307CisKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgTmV1ZmZlciwgQWxmcmVkIEFybm9sZCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFQVRBIFNDU0kgUElPIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9lYXRhX3Bpby5oIGIvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RlZWI5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9lYXRhX3Bpby5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBIZWFkZXIgZmlsZSBmb3IgZWF0YV9waW8uYyBMaW51eCBFQVRBLVBJTyBTQ1NJIGRyaXZlciAqCisqIChjKSAxOTkzLTk2IE1pY2hhZWwgTmV1ZmZlciAgCSAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBsYXN0IGNoYW5nZTogMjAwMi8xMS8wMgkJCQkqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9FQVRBX1BJT19ICisjZGVmaW5lIF9FQVRBX1BJT19ICisKKyNkZWZpbmUgVkVSX01BSk9SIDAKKyNkZWZpbmUgVkVSX01JTk9SIDAKKyNkZWZpbmUgVkVSX1NVQgkgICIxYiIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSGVyZSB5b3UgY2FuIHN3aXRjaCBwYXJ0cyBvZiB0aGUgY29kZSBvbiBhbmQgb2YJCQkqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFZFUkJPU0VfU0VUVVAJCS8qIHNob3cgc3RhcnR1cCBzY3JlZW4gb2YgMjAwMSAqLworI2RlZmluZSBBTExPV19ETUFfQk9BUkRTIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVidWcgb3B0aW9ucy4JCQkJCQkJKiAKKyAqIEVuYWJsZSBERUJVRyBhbmQgd2hpY2hldmVyIG9wdGlvbnMgeW91IHJlcXVpcmUuCQkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgREVCVUdfRUFUQQkxCS8qIEVuYWJsZSBkZWJ1ZyBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRFBUX0RFQlVHCTAJLyogQm9icyBzcGVjaWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEQkdfREVMQVkJMAkvKiBCdWlsZCBpbiBkZWxheXMgc28gZGVidWcgbWVzc2FnZXMgY2FuIGJlCisJCQkJICogYmUgcmVhZCBiZWZvcmUgdGhleSB2YW5pc2ggb2YgdGhlIHRvcCBvZgorCQkJCSAqIHRoZSBzY3JlZW4hCisJCQkJICovCisjZGVmaW5lIERCR19QUk9CRQkwCS8qIERlYnVnIHByb2JlIHJvdXRpbmVzLiAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgREJHX0lTQQkJMAkvKiBUcmFjZSBJU0Egcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERCR19FSVNBCTAJLyogVHJhY2UgRUlTQSByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEQkdfUENJCQkwCS8qIFRyYWNlIFBDSSByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgREJHX1BJTwkJMAkvKiBUcmFjZSBnZXRfY29uZmlnX1BJTyAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERCR19DT00JCTAJLyogVHJhY2UgY29tbWFuZCBjYWxsICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEQkdfUVVFVUUJMAkvKiBUcmFjZSBjb21tYW5kIHF1ZXVlaW5nLiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERCR19JTlRSCTAJLyogVHJhY2UgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4gICAgICAgICAqLworI2RlZmluZSBEQkdfSU5UUjIJMAkvKiBUcmFjZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLiAgICAgICAgICovCisjZGVmaW5lIERCR19QUk9DCTAJLyogRGVidWcgcHJvYy1mcyByZWxhdGVkIHN0YXRpc3RpY3MgICAgICAgICAqLworI2RlZmluZSBEQkdfUFJPQ19XUklURQkwCisjZGVmaW5lIERCR19SRUdJU1RFUgkwCS8qICovCisjZGVmaW5lIERCR19BQk5PUk0JMQkvKiBEZWJ1ZyBhYm5vcm1hbCBhY3Rpb25zIChyZXNldCwgYWJvcnQpICAgICovCisKKyNpZiBERUJVR19FQVRBCisjZGVmaW5lIERCRyh4LCB5KSAgIGlmICgoeCkpIHt5O30KKyNlbHNlCisjZGVmaW5lIERCRyh4LCB5KQorI2VuZGlmCisKKyNlbmRpZgkJCQkvKiBfRUFUQV9QSU9fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2VzcC5jIGIvZHJpdmVycy9zY3NpL2VzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YWI3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZXNwLmMKQEAgLTAsMCArMSw0NDAyIEBACisvKiAkSWQ6IGVzcC5jLHYgMS4xMDEgMjAwMi8wMS8xNSAwNjo0ODo1NSBkYXZlbSBFeHAgJAorICogZXNwLmM6ICBFbmhhbmNlZFNjc2lQcm9jZXNzb3IgU3VuIFNDU0kgZHJpdmVyIGNvZGUuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKKyAqLworCisvKiBUT0RPOgorICoKKyAqIDEpIE1heWJlIGRpc2FibGUgcGFyaXR5IGNoZWNraW5nIGluIGNvbmZpZyByZWdpc3RlciBvbmUgZm9yIFNDU0kxCisgKiAgICB0YXJnZXRzLiAgKEdpbG1vcmUgc2F5cyBwYXJpdHkgZXJyb3Igb24gdGhlIFNCdXMgY2FuIGxvY2sgdXAKKyAqICAgIG9sZCBzdW40YydzKQorICogMikgQWRkIHN1cHBvcnQgZm9yIERNQTIgcGlwZWxpbmluZy4KKyAqIDMpIEFkZCB0YWdnZWQgcXVldWVpbmcuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImVzcC5oIgorCisjaW5jbHVkZSA8YXNtL3NidXMuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpZm5kZWYgX19zcGFyY192OV9fCisjaW5jbHVkZSA8YXNtL21hY2hpbmVzLmg+CisjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKworI2RlZmluZSBERUJVR19FU1AKKy8qICNkZWZpbmUgREVCVUdfRVNQX0hNRSAqLworLyogI2RlZmluZSBERUJVR19FU1BfREFUQSAqLworLyogI2RlZmluZSBERUJVR19FU1BfUVVFVUUgKi8KKy8qICNkZWZpbmUgREVCVUdfRVNQX0RJU0NPTk5FQ1QgKi8KKy8qICNkZWZpbmUgREVCVUdfRVNQX1NUQVRVUyAqLworLyogI2RlZmluZSBERUJVR19FU1BfUEhBU0VTICovCisvKiAjZGVmaW5lIERFQlVHX0VTUF9XT1JLQlVTICovCisvKiAjZGVmaW5lIERFQlVHX1NUQVRFX01BQ0hJTkUgKi8KKy8qICNkZWZpbmUgREVCVUdfRVNQX0NNRFMgKi8KKy8qICNkZWZpbmUgREVCVUdfRVNQX0lSUVMgKi8KKy8qICNkZWZpbmUgREVCVUdfU0RUUiAqLworLyogI2RlZmluZSBERUJVR19FU1BfU0cgKi8KKworLyogVXNlIHRoZSBmb2xsb3dpbmcgdG8gc3ByaW5rbGUgZGVidWdnaW5nIG1lc3NhZ2VzIGluIGEgd2F5IHdoaWNoCisgKiBzdWl0cyB5b3UgaWYgY29tYmluYXRpb25zIG9mIHRoZSBhYm92ZSBiZWNvbWUgdG9vIHZlcmJvc2Ugd2hlbgorICogdHJ5aW5nIHRvIHRyYWNrIGRvd24gYSBzcGVjaWZpYyBwcm9ibGVtLgorICovCisvKiAjZGVmaW5lIERFQlVHX0VTUF9NSVNDICovCisKKyNpZiBkZWZpbmVkKERFQlVHX0VTUCkKKyNkZWZpbmUgRVNQTE9HKGZvbykgIHByaW50ayBmb28KKyNlbHNlCisjZGVmaW5lIEVTUExPRyhmb28pCisjZW5kaWYgLyogKERFQlVHX0VTUCkgKi8KKworI2lmIGRlZmluZWQoREVCVUdfRVNQX0hNRSkKKyNkZWZpbmUgRVNQSE1FKGZvbykgIHByaW50ayBmb28KKyNlbHNlCisjZGVmaW5lIEVTUEhNRShmb28pCisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUdfRVNQX0RBVEEpCisjZGVmaW5lIEVTUERBVEEoZm9vKSAgcHJpbnRrIGZvbworI2Vsc2UKKyNkZWZpbmUgRVNQREFUQShmb28pCisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUdfRVNQX1FVRVVFKQorI2RlZmluZSBFU1BRVUVVRShmb28pICBwcmludGsgZm9vCisjZWxzZQorI2RlZmluZSBFU1BRVUVVRShmb28pCisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUdfRVNQX0RJU0NPTk5FQ1QpCisjZGVmaW5lIEVTUERJU0MoZm9vKSAgcHJpbnRrIGZvbworI2Vsc2UKKyNkZWZpbmUgRVNQRElTQyhmb28pCisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUdfRVNQX1NUQVRVUykKKyNkZWZpbmUgRVNQU1RBVChmb28pICBwcmludGsgZm9vCisjZWxzZQorI2RlZmluZSBFU1BTVEFUKGZvbykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChERUJVR19FU1BfUEhBU0VTKQorI2RlZmluZSBFU1BQSEFTRShmb28pICBwcmludGsgZm9vCisjZWxzZQorI2RlZmluZSBFU1BQSEFTRShmb28pCisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUdfRVNQX1dPUktCVVMpCisjZGVmaW5lIEVTUEJVUyhmb28pICBwcmludGsgZm9vCisjZWxzZQorI2RlZmluZSBFU1BCVVMoZm9vKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHX0VTUF9JUlFTKQorI2RlZmluZSBFU1BJUlEoZm9vKSAgcHJpbnRrIGZvbworI2Vsc2UKKyNkZWZpbmUgRVNQSVJRKGZvbykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChERUJVR19TRFRSKQorI2RlZmluZSBFU1BTRFRSKGZvbykgIHByaW50ayBmb28KKyNlbHNlCisjZGVmaW5lIEVTUFNEVFIoZm9vKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHX0VTUF9NSVNDKQorI2RlZmluZSBFU1BNSVNDKGZvbykgIHByaW50ayBmb28KKyNlbHNlCisjZGVmaW5lIEVTUE1JU0MoZm9vKQorI2VuZGlmCisKKy8qIENvbW1hbmQgcGhhc2UgZW51bWVyYXRpb24uICovCitlbnVtIHsKKwlub3RfaXNzdWVkICAgID0gMHgwMCwgIC8qIFN0aWxsIGluIHRoZSBpc3N1ZV9TQyBxdWV1ZS4gICAgICAgICAgKi8KKworCS8qIFZhcmlvdXMgZm9ybXMgb2Ygc2VsZWN0aW5nIGEgdGFyZ2V0LiAqLworI2RlZmluZSBpbl9zbGN0X21hc2sgICAgMHgxMAorCWluX3NsY3Rfbm9ybSAgPSAweDEwLCAgLyogRVNQIGlzIGFyYml0cmF0aW5nLCBub3JtYWwgc2VsZWN0aW9uICAqLworCWluX3NsY3Rfc3RvcCAgPSAweDExLCAgLyogRVNQIHdpbGwgc2VsZWN0LCB0aGVuIHN0b3Agd2l0aCBJUlEgICAqLworCWluX3NsY3RfbXNnICAgPSAweDEyLCAgLyogc2VsZWN0LCB0aGVuIHNlbmQgYSBtZXNzYWdlICAgICAgICAgICAqLworCWluX3NsY3RfdGFnICAgPSAweDEzLCAgLyogc2VsZWN0IGFuZCBzZW5kIHRhZ2dlZCBxdWV1ZSBtc2cgICAgICAqLworCWluX3NsY3Rfc25lZyAgPSAweDE0LCAgLyogc2VsZWN0IGFuZCBhY3F1aXJlIHN5bmMgY2FwYWJpbGl0aWVzICAqLworCisJLyogQW55IHBvc3Qgc2VsZWN0aW9uIGFjdGl2aXR5LiAqLworI2RlZmluZSBpbl9waGFzZXNfbWFzayAgMHgyMAorCWluX2RhdGFpbiAgICAgPSAweDIwLCAgLyogRGF0YSBpcyB0cmFuc2ZlcnJpbmcgZnJvbSB0aGUgYnVzICAgICAqLworCWluX2RhdGFvdXQgICAgPSAweDIxLCAgLyogRGF0YSBpcyB0cmFuc2ZlcnJpbmcgdG8gdGhlIGJ1cyAgICAgICAqLworCWluX2RhdGFfZG9uZSAgPSAweDIyLCAgLyogTGFzdCBETUEgZGF0YSBvcGVyYXRpb24gZG9uZSAobWF5YmUpICAqLworCWluX21zZ2luICAgICAgPSAweDIzLCAgLyogRWF0aW5nIG1lc3NhZ2UgZnJvbSB0YXJnZXQgICAgICAgICAgICAqLworCWluX21zZ2luY29udCAgPSAweDI0LCAgLyogRWF0aW5nIG1vcmUgbXNnIGJ5dGVzIGZyb20gdGFyZ2V0ICAgICAqLworCWluX21zZ2luZG9uZSAgPSAweDI1LCAgLyogRGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB3aGF0IHdlIGdvdCAgICAqLworCWluX21zZ291dCAgICAgPSAweDI2LCAgLyogU2VuZGluZyBtZXNzYWdlIHRvIHRhcmdldCAgICAgICAgICAgICAqLworCWluX21zZ291dGRvbmUgPSAweDI3LCAgLyogRG9uZSBzZW5kaW5nIG1zZyBvdXQgICAgICAgICAgICAgICAgICAqLworCWluX2NtZGJlZ2luICAgPSAweDI4LCAgLyogU2VuZGluZyBjbWQgYWZ0ZXIgYWJub3JtYWwgc2VsZWN0aW9uICAqLworCWluX2NtZGVuZCAgICAgPSAweDI5LCAgLyogRG9uZSBzZW5kaW5nIHNsb3cgY21kICAgICAgICAgICAgICAgICAqLworCWluX3N0YXR1cyAgICAgPSAweDJhLCAgLyogV2FzIGluIHN0YXR1cyBwaGFzZSwgZmluaXNoaW5nIGNtZCAgICAqLworCWluX2ZyZWVpbmcgICAgPSAweDJiLCAgLyogZnJlZWluZyB0aGUgYnVzIGZvciBjbWQgY21wbHQgb3IgZGlzYyAqLworCWluX3RoZV9kYXJrICAgPSAweDJjLCAgLyogRG9uJ3Qga25vdyB3aGF0IGJ1cyBwaGFzZSB3ZSBhcmUgaW4gICAqLworCisJLyogU3BlY2lhbCBzdGF0ZXMsIGllLiBub3Qgbm9ybWFsIGJ1cyB0cmFuc2l0aW9ucy4uLiAqLworI2RlZmluZSBpbl9zcGVjX21hc2sgICAgMHg4MAorCWluX2Fib3J0b25lICAgPSAweDgwLCAgLyogQWJvcnRpbmcgb25lIGNvbW1hbmQgY3VycmVudGx5ICAgICAgICAqLworCWluX2Fib3J0YWxsICAgPSAweDgxLCAgLyogQmxvd2luZyBhd2F5IGFsbCBjb21tYW5kcyB3ZSBoYXZlICAgICAqLworCWluX3Jlc2V0ZGV2ICAgPSAweDgyLCAgLyogU0NTSSB0YXJnZXQgcmVzZXQgaW4gcHJvZ3Jlc3MgICAgICAgICAqLworCWluX3Jlc2V0YnVzICAgPSAweDgzLCAgLyogU0NTSSBidXMgcmVzZXQgaW4gcHJvZ3Jlc3MgICAgICAgICAgICAqLworCWluX3RndGVycm9yICAgPSAweDg0LCAgLyogVGFyZ2V0IGRpZCBzb21ldGhpbmcgc3R1cGlkICAgICAgICAgICAqLworfTsKKworZW51bSB7CisJLyogWmVybyBoYXMgc3BlY2lhbCBtZWFuaW5nLCBzZWUgc2tpcGFoZWFkWzEyXS4gKi8KKy8qMCovCWRvX25ldmVyLAorCisvKjEqLwlkb19waGFzZV9kZXRlcm1pbmUsCisvKjIqLwlkb19yZXNldF9idXMsCisvKjMqLwlkb19yZXNldF9jb21wbGV0ZSwKKy8qNCovCWRvX3dvcmtfYnVzLAorLyo1Ki8JZG9faW50cl9lbmQKK307CisKKy8qIFRoZSBtYXN0ZXIgcmluZyBvZiBhbGwgZXNwIGhvc3RzIHdlIGFyZSBtYW5hZ2luZyBpbiB0aGlzIGRyaXZlci4gKi8KK3N0YXRpYyBzdHJ1Y3QgZXNwICplc3BjaGFpbjsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZXNwY2hhaW5fbG9jayk7CitzdGF0aWMgaW50IGVzcHNfcnVubmluZyA9IDA7CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zLiAqLworc3RhdGljIGlycXJldHVybl90IGVzcF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnByZWdzKTsKKworLyogRGVidWdnaW5nIHJvdXRpbmVzICovCitzdHJ1Y3QgZXNwX2NtZHN0cmluZ3MgeworCXU4IGNtZGNoYXI7CisJY2hhciAqdGV4dDsKK30gZXNwX2NtZF9zdHJpbmdzW10gPSB7CisJLyogTWlzY2VsbGFuZW91cyAqLworCXsgRVNQX0NNRF9OVUxMLCAiRVNQX05PUCIsIH0sCisJeyBFU1BfQ01EX0ZMVVNILCAiRklGT19GTFVTSCIsIH0sCisJeyBFU1BfQ01EX1JDLCAiUlNURVNQIiwgfSwKKwl7IEVTUF9DTURfUlMsICJSU1RTQ1NJIiwgfSwKKwkvKiBEaXNjb25uZWN0ZWQgU3RhdGUgR3JvdXAgKi8KKwl7IEVTUF9DTURfUlNFTCwgIlJFU0xDVFNFUSIsIH0sCisJeyBFU1BfQ01EX1NFTCwgIlNMQ1ROQVROIiwgfSwKKwl7IEVTUF9DTURfU0VMQSwgIlNMQ1RBVE4iLCB9LAorCXsgRVNQX0NNRF9TRUxBUywgIlNMQ1RBVE5TVE9QIiwgfSwKKwl7IEVTUF9DTURfRVNFTCwgIkVOU0xDVFJFU0VMIiwgfSwKKwl7IEVTUF9DTURfRFNFTCwgIkRJU1NFTFJFU0VMIiwgfSwKKwl7IEVTUF9DTURfU0EzLCAiU0xDVEFUTjMiLCB9LAorCXsgRVNQX0NNRF9SU0VMMywgIlJFU0xDVFNFUSIsIH0sCisJLyogVGFyZ2V0IFN0YXRlIEdyb3VwICovCisJeyBFU1BfQ01EX1NNU0csICJTTkRNU0ciLCB9LAorCXsgRVNQX0NNRF9TU1RBVCwgIlNORFNUQVRVUyIsIH0sCisJeyBFU1BfQ01EX1NEQVRBLCAiU05EREFUQSIsIH0sCisJeyBFU1BfQ01EX0RTRVEsICJESVNDU0VRIiwgfSwKKwl7IEVTUF9DTURfVFNFUSwgIlRFUk1TRVEiLCB9LAorCXsgRVNQX0NNRF9UQ0NTRVEsICJUUkdUQ01EQ09NUFNFUSIsIH0sCisJeyBFU1BfQ01EX0RDTkNULCAiRElTQyIsIH0sCisJeyBFU1BfQ01EX1JNU0csICJSQ1ZNU0ciLCB9LAorCXsgRVNQX0NNRF9SQ01ELCAiUkNWQ01EIiwgfSwKKwl7IEVTUF9DTURfUkRBVEEsICJSQ1ZEQVRBIiwgfSwKKwl7IEVTUF9DTURfUkNTRVEsICJSQ1ZDTURTRVEiLCB9LAorCS8qIEluaXRpYXRvciBTdGF0ZSBHcm91cCAqLworCXsgRVNQX0NNRF9USSwgIlRSQU5TSU5GTyIsIH0sCisJeyBFU1BfQ01EX0lDQ1NFUSwgIklOSUNNRFNFUUNPTVAiLCB9LAorCXsgRVNQX0NNRF9NT0ssICJNU0dBQ0NFUFRFRCIsIH0sCisJeyBFU1BfQ01EX1RQQUQsICJUUEFEIiwgfSwKKwl7IEVTUF9DTURfU0FUTiwgIlNBVE4iLCB9LAorCXsgRVNQX0NNRF9SQVROLCAiUkFUTiIsIH0sCit9OworI2RlZmluZSBOVU1fRVNQX0NPTU1BTkRTICAoKHNpemVvZihlc3BfY21kX3N0cmluZ3MpKSAvIChzaXplb2Yoc3RydWN0IGVzcF9jbWRzdHJpbmdzKSkpCisKKy8qIFByaW50IHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgYW4gRVNQIGNvbW1hbmQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlc3BfcHJpbnRfY21kKHU4IGVzcGNtZCkKK3sKKwl1OCBkbWFfYml0ID0gZXNwY21kICYgRVNQX0NNRF9ETUE7CisJaW50IGk7CisKKwllc3BjbWQgJj0gfmRtYV9iaXQ7CisJZm9yIChpID0gMDsgaSA8IE5VTV9FU1BfQ09NTUFORFM7IGkrKykKKwkJaWYgKGVzcF9jbWRfc3RyaW5nc1tpXS5jbWRjaGFyID09IGVzcGNtZCkKKwkJCWJyZWFrOworCWlmIChpID09IE5VTV9FU1BfQ09NTUFORFMpCisJCXByaW50aygiRVNQX1Vua25vd24iKTsKKwllbHNlCisJCXByaW50aygiJXMlcyIsIGVzcF9jbWRfc3RyaW5nc1tpXS50ZXh0LAorCQkgICAgICAgKChkbWFfYml0KSA/ICIrRE1BIiA6ICIiKSk7Cit9CisKKy8qIFByaW50IHRoZSBzdGF0dXMgcmVnaXN0ZXIncyB2YWx1ZSAqLworc3RhdGljIGlubGluZSB2b2lkIGVzcF9wcmludF9zdGF0cmVnKHU4IHN0YXRyZWcpCit7CisJdTggcGhhc2U7CisKKwlwcmludGsoIlNUQVRVUzwiKTsKKwlwaGFzZSA9IHN0YXRyZWcgJiBFU1BfU1RBVF9QTUFTSzsKKwlwcmludGsoIiVzLCIsIChwaGFzZSA9PSBFU1BfRE9QID8gIkRBVEEtT1VUIiA6CisJCSAgICAgICAocGhhc2UgPT0gRVNQX0RJUCA/ICJEQVRBLUlOIiA6CisJCQkocGhhc2UgPT0gRVNQX0NNRFAgPyAiQ09NTUFORCIgOgorCQkJIChwaGFzZSA9PSBFU1BfU1RBVFAgPyAiU1RBVFVTIiA6CisJCQkgIChwaGFzZSA9PSBFU1BfTU9QID8gIk1TRy1PVVQiIDoKKwkJCSAgIChwaGFzZSA9PSBFU1BfTUlQID8gIk1TR19JTiIgOgorCQkJICAgICJ1bmtub3duIikpKSkpKSk7CisJaWYgKHN0YXRyZWcgJiBFU1BfU1RBVF9URE9ORSkKKwkJcHJpbnRrKCJUUkFOU19ET05FLCIpOworCWlmIChzdGF0cmVnICYgRVNQX1NUQVRfVENOVCkKKwkJcHJpbnRrKCJUQ09VTlRfWkVSTywiKTsKKwlpZiAoc3RhdHJlZyAmIEVTUF9TVEFUX1BFUlIpCisJCXByaW50aygiUF9FUlJPUiwiKTsKKwlpZiAoc3RhdHJlZyAmIEVTUF9TVEFUX1NQQU0pCisJCXByaW50aygiU1BBTSwiKTsKKwlpZiAoc3RhdHJlZyAmIEVTUF9TVEFUX0lOVFIpCisJCXByaW50aygiSVJRLCIpOworCXByaW50aygiPiIpOworfQorCisvKiBQcmludCB0aGUgaW50ZXJydXB0IHJlZ2lzdGVyJ3MgdmFsdWUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlc3BfcHJpbnRfaXJlZyh1OCBpbnRyZWcpCit7CisJcHJpbnRrKCJJTlRSRUc8ICIpOworCWlmIChpbnRyZWcgJiBFU1BfSU5UUl9TKQorCQlwcmludGsoIlNMQ1RfTkFUTiAiKTsKKwlpZiAoaW50cmVnICYgRVNQX0lOVFJfU0FUTikKKwkJcHJpbnRrKCJTTENUX0FUTiAiKTsKKwlpZiAoaW50cmVnICYgRVNQX0lOVFJfUlNFTCkKKwkJcHJpbnRrKCJSU0xDVCAiKTsKKwlpZiAoaW50cmVnICYgRVNQX0lOVFJfRkRPTkUpCisJCXByaW50aygiRkRPTkUgIik7CisJaWYgKGludHJlZyAmIEVTUF9JTlRSX0JTRVJWKQorCQlwcmludGsoIkJTRVJWICIpOworCWlmIChpbnRyZWcgJiBFU1BfSU5UUl9EQykKKwkJcHJpbnRrKCJESVNDTkNUICIpOworCWlmIChpbnRyZWcgJiBFU1BfSU5UUl9JQykKKwkJcHJpbnRrKCJJTExfQ01EICIpOworCWlmIChpbnRyZWcgJiBFU1BfSU5UUl9TUikKKwkJcHJpbnRrKCJTQ1NJX0JVU19SRVNFVCAiKTsKKwlwcmludGsoIj4iKTsKK30KKworLyogUHJpbnQgdGhlIHNlcXVlbmNlIHN0ZXAgcmVnaXN0ZXJzIGNvbnRlbnRzICovCitzdGF0aWMgaW5saW5lIHZvaWQgZXNwX3ByaW50X3NlcXJlZyh1OCBzdGVwcmVnKQoreworCXN0ZXByZWcgJj0gRVNQX1NURVBfVkJJVFM7CisJcHJpbnRrKCJTVEVQPCVzPiIsCisJICAgICAgIChzdGVwcmVnID09IEVTUF9TVEVQX0FTRUwgPyAiU0xDVF9BUkJfQ01QTFQiIDoKKwkJKHN0ZXByZWcgPT0gRVNQX1NURVBfU0lEID8gIjFCWVRFX01TR19TRU5UIiA6CisJCSAoc3RlcHJlZyA9PSBFU1BfU1RFUF9OQ01EID8gIk5PVF9JTl9DTURfUEhBU0UiIDoKKwkJICAoc3RlcHJlZyA9PSBFU1BfU1RFUF9QUEMgPyAiQ01EX0JZVEVTX0xPU1QiIDoKKwkJICAgKHN0ZXByZWcgPT0gRVNQX1NURVBfRklOSTQgPyAiQ01EX1NFTlRfT0siIDoKKwkJICAgICJVTktOT1dOIikpKSkpKTsKK30KKworc3RhdGljIGNoYXIgKnBoYXNlX3N0cmluZyhpbnQgcGhhc2UpCit7CisJc3dpdGNoIChwaGFzZSkgeworCWNhc2Ugbm90X2lzc3VlZDoKKwkJcmV0dXJuICJVTklTU1VFRCI7CisJY2FzZSBpbl9zbGN0X25vcm06CisJCXJldHVybiAiU0xDVE5PUk0iOworCWNhc2UgaW5fc2xjdF9zdG9wOgorCQlyZXR1cm4gIlNMQ1RTVE9QIjsKKwljYXNlIGluX3NsY3RfbXNnOgorCQlyZXR1cm4gIlNMQ1RNU0ciOworCWNhc2UgaW5fc2xjdF90YWc6CisJCXJldHVybiAiU0xDVFRBRyI7CisJY2FzZSBpbl9zbGN0X3NuZWc6CisJCXJldHVybiAiU0xDVFNORUciOworCWNhc2UgaW5fZGF0YWluOgorCQlyZXR1cm4gIkRBVEFJTiI7CisJY2FzZSBpbl9kYXRhb3V0OgorCQlyZXR1cm4gIkRBVEFPVVQiOworCWNhc2UgaW5fZGF0YV9kb25lOgorCQlyZXR1cm4gIkRBVEFET05FIjsKKwljYXNlIGluX21zZ2luOgorCQlyZXR1cm4gIk1TR0lOIjsKKwljYXNlIGluX21zZ2luY29udDoKKwkJcmV0dXJuICJNU0dJTkNPTlQiOworCWNhc2UgaW5fbXNnaW5kb25lOgorCQlyZXR1cm4gIk1TR0lORE9ORSI7CisJY2FzZSBpbl9tc2dvdXQ6CisJCXJldHVybiAiTVNHT1VUIjsKKwljYXNlIGluX21zZ291dGRvbmU6CisJCXJldHVybiAiTVNHT1VURE9ORSI7CisJY2FzZSBpbl9jbWRiZWdpbjoKKwkJcmV0dXJuICJDTURCRUdJTiI7CisJY2FzZSBpbl9jbWRlbmQ6CisJCXJldHVybiAiQ01ERU5EIjsKKwljYXNlIGluX3N0YXR1czoKKwkJcmV0dXJuICJTVEFUVVMiOworCWNhc2UgaW5fZnJlZWluZzoKKwkJcmV0dXJuICJGUkVFSU5HIjsKKwljYXNlIGluX3RoZV9kYXJrOgorCQlyZXR1cm4gIkNMVUVMRVNTIjsKKwljYXNlIGluX2Fib3J0b25lOgorCQlyZXR1cm4gIkFCT1JUT05FIjsKKwljYXNlIGluX2Fib3J0YWxsOgorCQlyZXR1cm4gIkFCT1JUQUxMIjsKKwljYXNlIGluX3Jlc2V0ZGV2OgorCQlyZXR1cm4gIlJFU0VUREVWIjsKKwljYXNlIGluX3Jlc2V0YnVzOgorCQlyZXR1cm4gIlJFU0VUQlVTIjsKKwljYXNlIGluX3RndGVycm9yOgorCQlyZXR1cm4gIlRHVEVSUk9SIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIlVOS05PV04iOworCX07Cit9CisKKyNpZmRlZiBERUJVR19TVEFURV9NQUNISU5FCitzdGF0aWMgaW5saW5lIHZvaWQgZXNwX2FkdmFuY2VfcGhhc2Uoc3RydWN0IHNjc2lfY21uZCAqcywgaW50IG5ld3BoYXNlKQoreworCUVTUExPRygoIjwlcz4iLCBwaGFzZV9zdHJpbmcobmV3cGhhc2UpKSk7CisJcy0+U0NwLnNlbnRfY29tbWFuZCA9IHMtPlNDcC5waGFzZTsKKwlzLT5TQ3AucGhhc2UgPSBuZXdwaGFzZTsKK30KKyNlbHNlCisjZGVmaW5lIGVzcF9hZHZhbmNlX3BoYXNlKF9fcywgX19uZXdwaGFzZSkgXAorCShfX3MpLT5TQ3Auc2VudF9jb21tYW5kID0gKF9fcyktPlNDcC5waGFzZTsgXAorCShfX3MpLT5TQ3AucGhhc2UgPSAoX19uZXdwaGFzZSk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0VTUF9DTURTCitzdGF0aWMgaW5saW5lIHZvaWQgZXNwX2NtZChzdHJ1Y3QgZXNwICplc3AsIHU4IGNtZCkKK3sKKwllc3AtPmVzcGNtZGxvZ1tlc3AtPmVzcGNtZGVudF0gPSBjbWQ7CisJZXNwLT5lc3BjbWRlbnQgPSAoZXNwLT5lc3BjbWRlbnQgKyAxKSAmIDMxOworCXNidXNfd3JpdGViKGNtZCwgZXNwLT5lcmVncyArIEVTUF9DTUQpOworfQorI2Vsc2UKKyNkZWZpbmUgZXNwX2NtZChfX2VzcCwgX19jbWQpCVwKKwlzYnVzX3dyaXRlYigoX19jbWQpLCAoKF9fZXNwKS0+ZXJlZ3MpICsgRVNQX0NNRCkKKyNlbmRpZgorCisjZGVmaW5lIEVTUF9JTlRTT0ZGKF9fZHJlZ3MpCVwKKwlzYnVzX3dyaXRlbChzYnVzX3JlYWRsKChfX2RyZWdzKStETUFfQ1NSKSZ+KERNQV9JTlRfRU5BQiksIChfX2RyZWdzKStETUFfQ1NSKQorI2RlZmluZSBFU1BfSU5UU09OKF9fZHJlZ3MpCVwKKwlzYnVzX3dyaXRlbChzYnVzX3JlYWRsKChfX2RyZWdzKStETUFfQ1NSKXxETUFfSU5UX0VOQUIsIChfX2RyZWdzKStETUFfQ1NSKQorI2RlZmluZSBFU1BfSVJRX1AoX19kcmVncykJXAorCShzYnVzX3JlYWRsKChfX2RyZWdzKStETUFfQ1NSKSAmIChETUFfSE5ETF9JTlRSfERNQV9ITkRMX0VSUk9SKSkKKworLyogSG93IHdlIHVzZSB0aGUgdmFyaW91cyBMaW51eCBTQ1NJIGRhdGEgc3RydWN0dXJlcyBmb3Igb3BlcmF0aW9uLgorICoKKyAqIHN0cnVjdCBzY3NpX2NtbmQ6CisgKgorICogICBXZSBrZWVwIHRyYWNrIG9mIHRoZSBzeW5jaHJvbm91cyBjYXBhYmlsaXRpZXMgb2YgYSB0YXJnZXQKKyAqICAgaW4gdGhlIGRldmljZSBtZW1iZXIsIHVzaW5nIHN5bmNfbWluX3BlcmlvZCBhbmQKKyAqICAgc3luY19tYXhfb2Zmc2V0LiAgVGhlc2UgYXJlIHRoZSB2YWx1ZXMgd2UgZGlyZWN0bHkgd3JpdGUKKyAqICAgaW50byB0aGUgRVNQIHJlZ2lzdGVycyB3aGlsZSBydW5uaW5nIGEgY29tbWFuZC4gIElmIG9mZnNldAorICogICBpcyB6ZXJvIHRoZSBFU1Agd2lsbCB1c2UgYXN5bmNocm9ub3VzIHRyYW5zZmVycy4KKyAqICAgSWYgdGhlIGJvcmtlbiBmbGFnIGlzIHNldCB3ZSBhc3N1bWUgd2Ugc2hvdWxkbid0IGV2ZW4gYm90aGVyCisgKiAgIHRyeWluZyB0byBuZWdvdGlhdGUgZm9yIHN5bmNocm9ub3VzIHRyYW5zZmVyIGFzIHRoaXMgdGFyZ2V0CisgKiAgIGlzIHJlYWxseSBzdHVwaWQuICBJZiB3ZSBub3RpY2UgdGhlIHRhcmdldCBpcyBkcm9wcGluZyB0aGUKKyAqICAgYnVzLCBhbmQgd2UgaGF2ZSBiZWVuIGFsbG93aW5nIGl0IHRvIGRpc2Nvbm5lY3QsIHdlIGNsZWFyCisgKiAgIHRoZSBkaXNjb25uZWN0IGZsYWcuCisgKi8KKworCisvKiBNYW5pcHVsYXRpb24gb2YgdGhlIEVTUCBjb21tYW5kIHF1ZXVlcy4gIFRoYW5rcyB0byB0aGUgYWhhMTUyeCBkcml2ZXIKKyAqIGFuZCBpdHMgYXV0aG9yLCBKdWVyZ2VuIEUuIEZpc2NoZXIsIGZvciB0aGUgbWV0aG9kcyB1c2VkIGhlcmUuCisgKiBOb3RlIHRoYXQgdGhlc2UgYXJlIHBlci1FU1AgcXVldWVzLCBub3QgZ2xvYmFsIHF1ZXVlcyBsaWtlCisgKiB0aGUgYWhhMTUyeCBkcml2ZXIgdXNlcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGFwcGVuZF9TQyhzdHJ1Y3Qgc2NzaV9jbW5kICoqU0MsIHN0cnVjdCBzY3NpX2NtbmQgKm5ld19TQykKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICplbmQ7CisKKwluZXdfU0MtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSBOVUxMOworCWlmICghKlNDKQorCQkqU0MgPSBuZXdfU0M7CisJZWxzZSB7CisJCWZvciAoZW5kPSpTQztlbmQtPmhvc3Rfc2NyaWJibGU7ZW5kPShzdHJ1Y3Qgc2NzaV9jbW5kICopZW5kLT5ob3N0X3NjcmliYmxlKQorCQkJOworCQllbmQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSBuZXdfU0M7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlcGVuZF9TQyhzdHJ1Y3Qgc2NzaV9jbW5kICoqU0MsIHN0cnVjdCBzY3NpX2NtbmQgKm5ld19TQykKK3sKKwluZXdfU0MtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSAqU0M7CisJKlNDID0gbmV3X1NDOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzY3NpX2NtbmQgKnJlbW92ZV9maXJzdF9TQyhzdHJ1Y3Qgc2NzaV9jbW5kICoqU0MpCit7CisJc3RydWN0IHNjc2lfY21uZCAqcHRyOworCXB0ciA9ICpTQzsKKwlpZiAocHRyKQorCQkqU0MgPSAoc3RydWN0IHNjc2lfY21uZCAqKSAoKlNDKS0+aG9zdF9zY3JpYmJsZTsKKwlyZXR1cm4gcHRyOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzY3NpX2NtbmQgKnJlbW92ZV9TQyhzdHJ1Y3Qgc2NzaV9jbW5kICoqU0MsIGludCB0YXJnZXQsIGludCBsdW4pCit7CisJc3RydWN0IHNjc2lfY21uZCAqcHRyLCAqcHJldjsKKworCWZvciAocHRyID0gKlNDLCBwcmV2ID0gTlVMTDsKKwkgICAgIHB0ciAmJiAoKHB0ci0+ZGV2aWNlLT5pZCAhPSB0YXJnZXQpIHx8IChwdHItPmRldmljZS0+bHVuICE9IGx1bikpOworCSAgICAgcHJldiA9IHB0ciwgcHRyID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgcHRyLT5ob3N0X3NjcmliYmxlKQorCQk7CisJaWYgKHB0cikgeworCQlpZiAocHJldikKKwkJCXByZXYtPmhvc3Rfc2NyaWJibGU9cHRyLT5ob3N0X3NjcmliYmxlOworCQllbHNlCisJCQkqU0M9KHN0cnVjdCBzY3NpX2NtbmQgKilwdHItPmhvc3Rfc2NyaWJibGU7CisJfQorCXJldHVybiBwdHI7Cit9CisKKy8qIFJlc2V0dGluZyB2YXJpb3VzIHBpZWNlcyBvZiB0aGUgRVNQIHNjc2kgZHJpdmVyIGNoaXBzZXQvYnVzZXMuICovCitzdGF0aWMgdm9pZCBlc3BfcmVzZXRfZG1hKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlpbnQgY2FuX2RvX2J1cnN0MTYsIGNhbl9kb19idXJzdDMyLCBjYW5fZG9fYnVyc3Q2NDsKKwlpbnQgY2FuX2RvX3NidXM2NDsKKwl1MzIgdG1wOworCisJY2FuX2RvX2J1cnN0MTYgPSAoZXNwLT5idXJzdHMgJiBETUFfQlVSU1QxNikgIT0gMDsKKwljYW5fZG9fYnVyc3QzMiA9IChlc3AtPmJ1cnN0cyAmIERNQV9CVVJTVDMyKSAhPSAwOworCWNhbl9kb19idXJzdDY0ID0gMDsKKwljYW5fZG9fc2J1czY0ID0gMDsKKwlpZiAoc2J1c19jYW5fZG1hXzY0Yml0KGVzcC0+c2RldikpCisJCWNhbl9kb19zYnVzNjQgPSAxOworCWlmIChzYnVzX2Nhbl9idXJzdDY0KGVzcC0+c2RldikpCisJCWNhbl9kb19idXJzdDY0ID0gKGVzcC0+YnVyc3RzICYgRE1BX0JVUlNUNjQpICE9IDA7CisKKwkvKiBQdW50IHRoZSBEVk1BIGludG8gYSBrbm93biBzdGF0ZS4gKi8KKwlpZiAoZXNwLT5kbWEtPnJldmlzaW9uICE9IGR2bWFobWUpIHsKKwkJdG1wID0gc2J1c19yZWFkbChlc3AtPmRyZWdzICsgRE1BX0NTUik7CisJCXNidXNfd3JpdGVsKHRtcCB8IERNQV9SU1RfU0NTSSwgZXNwLT5kcmVncyArIERNQV9DU1IpOworCQlzYnVzX3dyaXRlbCh0bXAgJiB+RE1BX1JTVF9TQ1NJLCBlc3AtPmRyZWdzICsgRE1BX0NTUik7CisJfQorCXN3aXRjaCAoZXNwLT5kbWEtPnJldmlzaW9uKSB7CisJY2FzZSBkdm1haG1lOgorCQkvKiBUaGlzIGlzIHRoZSBITUUgRFZNQSBnYXRlIGFycmF5LiAqLworCisJCXNidXNfd3JpdGVsKERNQV9SRVNFVF9GQVMzNjYsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwkJc2J1c193cml0ZWwoRE1BX1JTVF9TQ1NJLCBlc3AtPmRyZWdzICsgRE1BX0NTUik7CisKKwkJZXNwLT5wcmV2X2htZV9kbWFjc3IgPSAoRE1BX1BBUklUWV9PRkZ8RE1BXzJDTEtTfERNQV9TQ1NJX0RJU0FCfERNQV9JTlRfRU5BQik7CisJCWVzcC0+cHJldl9obWVfZG1hY3NyICY9IH4oRE1BX0VOQUJMRXxETUFfU1RfV1JJVEV8RE1BX0JSU1RfU1opOworCisJCWlmIChjYW5fZG9fYnVyc3Q2NCkKKwkJCWVzcC0+cHJldl9obWVfZG1hY3NyIHw9IERNQV9CUlNUNjQ7CisJCWVsc2UgaWYgKGNhbl9kb19idXJzdDMyKQorCQkJZXNwLT5wcmV2X2htZV9kbWFjc3IgfD0gRE1BX0JSU1QzMjsKKworCQlpZiAoY2FuX2RvX3NidXM2NCkgeworCQkJZXNwLT5wcmV2X2htZV9kbWFjc3IgfD0gRE1BX1NDU0lfU0JVUzY0OworCQkJc2J1c19zZXRfc2J1czY0KGVzcC0+c2RldiwgZXNwLT5idXJzdHMpOworCQl9CisKKwkJLyogVGhpcyBjaGlwIGlzIGhvcnJpYmxlLiAqLworCQl3aGlsZSAoc2J1c19yZWFkbChlc3AtPmRyZWdzICsgRE1BX0NTUikgJiBETUFfUEVORF9SRUFEKQorCQkJdWRlbGF5KDEpOworCisJCXNidXNfd3JpdGVsKDAsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwkJc2J1c193cml0ZWwoZXNwLT5wcmV2X2htZV9kbWFjc3IsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKworCQkvKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBoYXZpbmcgdGhlIFNDU0kgY2hhbm5lbAorCQkgKiBlbmdpbmUgbG9jayB1cCBvbiB1cy4KKwkJICovCisJCXNidXNfd3JpdGVsKDAsIGVzcC0+ZHJlZ3MgKyBETUFfQUREUik7CisKKwkJYnJlYWs7CisJY2FzZSBkdm1hcmV2MjoKKwkJLyogVGhpcyBpcyB0aGUgZ2F0ZSBhcnJheSBmb3VuZCBpbiB0aGUgc3VuNG0KKwkJICogTkNSIFNCVVMgSS9PIHN1YnN5c3RlbS4KKwkJICovCisJCWlmIChlc3AtPmVyZXYgIT0gZXNwMTAwKSB7CisJCQl0bXAgPSBzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwkJCXNidXNfd3JpdGVsKHRtcCB8IERNQV8zQ0xLUywgZXNwLT5kcmVncyArIERNQV9DU1IpOworCQl9CisJCWJyZWFrOworCWNhc2UgZHZtYXJldjM6CisJCXRtcCA9IHNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpOworCQl0bXAgJj0gfkRNQV8zQ0xLUzsKKwkJdG1wIHw9IERNQV8yQ0xLUzsKKwkJaWYgKGNhbl9kb19idXJzdDMyKSB7CisJCQl0bXAgJj0gfkRNQV9CUlNUX1NaOworCQkJdG1wIHw9IERNQV9CUlNUMzI7CisJCX0KKwkJc2J1c193cml0ZWwodG1wLCBlc3AtPmRyZWdzICsgRE1BX0NTUik7CisJCWJyZWFrOworCWNhc2UgZHZtYWVzYzE6CisJCS8qIFRoaXMgaXMgdGhlIERNQSB1bml0IGZvdW5kIG9uIFNDU0kvRXRoZXIgY2FyZHMuICovCisJCXRtcCA9IHNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpOworCQl0bXAgfD0gRE1BX0FERF9FTkFCTEU7CisJCXRtcCAmPSB+RE1BX0JDTlRfRU5BQjsKKwkJaWYgKCFjYW5fZG9fYnVyc3QzMiAmJiBjYW5fZG9fYnVyc3QxNikgeworCQkJdG1wIHw9IERNQV9FU0NfQlVSU1Q7CisJCX0gZWxzZSB7CisJCQl0bXAgJj0gfihETUFfRVNDX0JVUlNUKTsKKwkJfQorCQlzYnVzX3dyaXRlbCh0bXAsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfTsKKwlFU1BfSU5UU09OKGVzcC0+ZHJlZ3MpOworfQorCisvKiBSZXNldCB0aGUgRVNQIGNoaXAsIF9ub3RfIHRoZSBTQ1NJIGJ1cy4gKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBlc3BfcmVzZXRfZXNwKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwl1OCBmYW1pbHlfY29kZSwgdmVyc2lvbjsKKwlpbnQgaTsKKworCS8qIE5vdyByZXNldCB0aGUgRVNQIGNoaXAgKi8KKwllc3BfY21kKGVzcCwgRVNQX0NNRF9SQyk7CisJZXNwX2NtZChlc3AsIEVTUF9DTURfTlVMTCB8IEVTUF9DTURfRE1BKTsKKwllc3BfY21kKGVzcCwgRVNQX0NNRF9OVUxMIHwgRVNQX0NNRF9ETUEpOworCisJLyogUmVsb2FkIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworCXNidXNfd3JpdGViKGVzcC0+Y2ZhY3QsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZBQ1QpOworCWVzcC0+cHJldl9zdHAgPSAwOworCXNidXNfd3JpdGViKGVzcC0+cHJldl9zdHAsIGVzcC0+ZXJlZ3MgKyBFU1BfU1RQKTsKKwllc3AtPnByZXZfc29mZiA9IDA7CisJc2J1c193cml0ZWIoZXNwLT5wcmV2X3NvZmYsIGVzcC0+ZXJlZ3MgKyBFU1BfU09GRik7CisJc2J1c193cml0ZWIoZXNwLT5uZWdfZGVmcCwgZXNwLT5lcmVncyArIEVTUF9USU1FTyk7CisKKwkvKiBUaGlzIGlzIHRoZSBvbmx5IHBvaW50IGF0IHdoaWNoIGl0IGlzIHJlbGlhYmxlIHRvIHJlYWQKKwkgKiB0aGUgSUQtY29kZSBmb3IgYSBmYXN0IEVTUCBjaGlwIHZhcmlhbnRzLgorCSAqLworCWVzcC0+bWF4X3BlcmlvZCA9ICgoMzUgKiBlc3AtPmNjeWNsZSkgLyAxMDAwKTsKKwlpZiAoZXNwLT5lcmV2ID09IGZhc3QpIHsKKwkJdmVyc2lvbiA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9VSUQpOworCQlmYW1pbHlfY29kZSA9ICh2ZXJzaW9uICYgMHhmOCkgPj4gMzsKKwkJaWYgKGZhbWlseV9jb2RlID09IDB4MDIpCisJCQllc3AtPmVyZXYgPSBmYXMyMzY7CisJCWVsc2UgaWYgKGZhbWlseV9jb2RlID09IDB4MGEpCisJCQllc3AtPmVyZXYgPSBmYXNobWU7IC8qIFZlcnNpb24gaXMgdXN1YWxseSAnNScuICovCisJCWVsc2UKKwkJCWVzcC0+ZXJldiA9IGZhczEwMGE7CisJCUVTUE1JU0MoKCJlc3AlZDogRkFTVCBjaGlwIGlzICVzIChmYW1pbHk9JWQsIHZlcnNpb249JWQpXG4iLAorCQkJIGVzcC0+ZXNwX2lkLAorCQkJIChlc3AtPmVyZXYgPT0gZmFzMjM2KSA/ICJmYXMyMzYiIDoKKwkJCSAoKGVzcC0+ZXJldiA9PSBmYXMxMDBhKSA/ICJmYXMxMDBhIiA6CisJCQkgICJmYXNITUUiKSwgZmFtaWx5X2NvZGUsICh2ZXJzaW9uICYgNykpKTsKKworCQllc3AtPm1pbl9wZXJpb2QgPSAoKDQgKiBlc3AtPmNjeWNsZSkgLyAxMDAwKTsKKwl9IGVsc2UgeworCQllc3AtPm1pbl9wZXJpb2QgPSAoKDUgKiBlc3AtPmNjeWNsZSkgLyAxMDAwKTsKKwl9CisJZXNwLT5tYXhfcGVyaW9kID0gKGVzcC0+bWF4X3BlcmlvZCArIDMpPj4yOworCWVzcC0+bWluX3BlcmlvZCA9IChlc3AtPm1pbl9wZXJpb2QgKyAzKT4+MjsKKworCXNidXNfd3JpdGViKGVzcC0+Y29uZmlnMSwgZXNwLT5lcmVncyArIEVTUF9DRkcxKTsKKwlzd2l0Y2ggKGVzcC0+ZXJldikgeworCWNhc2UgZXNwMTAwOgorCQkvKiBub3RoaW5nIHRvIGRvICovCisJCWJyZWFrOworCWNhc2UgZXNwMTAwYToKKwkJc2J1c193cml0ZWIoZXNwLT5jb25maWcyLCBlc3AtPmVyZWdzICsgRVNQX0NGRzIpOworCQlicmVhazsKKwljYXNlIGVzcDIzNjoKKwkJLyogU2xvdyAyMzYgKi8KKwkJc2J1c193cml0ZWIoZXNwLT5jb25maWcyLCBlc3AtPmVyZWdzICsgRVNQX0NGRzIpOworCQllc3AtPnByZXZfY2ZnMyA9IGVzcC0+Y29uZmlnM1swXTsKKwkJc2J1c193cml0ZWIoZXNwLT5wcmV2X2NmZzMsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMyk7CisJCWJyZWFrOworCWNhc2UgZmFzaG1lOgorCQllc3AtPmNvbmZpZzIgfD0gKEVTUF9DT05GSUcyX0hNRTMyIHwgRVNQX0NPTkZJRzJfSE1FRkVOQUIpOworCQkvKiBmYWxsdGhyb3VnaC4uLiAqLworCWNhc2UgZmFzMjM2OgorCQkvKiBGYXN0IDIzNiBvciBITUUgKi8KKwkJc2J1c193cml0ZWIoZXNwLT5jb25maWcyLCBlc3AtPmVyZWdzICsgRVNQX0NGRzIpOworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpIHsKKwkJCQl1OCBjZmczOworCisJCQkJY2ZnMyA9IEVTUF9DT05GSUczX0ZDTE9DSyB8IEVTUF9DT05GSUczX09CUFVTSDsKKwkJCQlpZiAoZXNwLT5zY3NpX2lkID49IDgpCisJCQkJCWNmZzMgfD0gRVNQX0NPTkZJRzNfSURCSVQzOworCQkJCWVzcC0+Y29uZmlnM1tpXSB8PSBjZmczOworCQkJfSBlbHNlIHsKKwkJCQllc3AtPmNvbmZpZzNbaV0gfD0gRVNQX0NPTkZJRzNfRkNMSzsKKwkJCX0KKwkJfQorCQllc3AtPnByZXZfY2ZnMyA9IGVzcC0+Y29uZmlnM1swXTsKKwkJc2J1c193cml0ZWIoZXNwLT5wcmV2X2NmZzMsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMyk7CisJCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKSB7CisJCQllc3AtPnJhZGVsYXkgPSA4MDsKKwkJfSBlbHNlIHsKKwkJCWlmIChlc3AtPmRpZmYpCisJCQkJZXNwLT5yYWRlbGF5ID0gMDsKKwkJCWVsc2UKKwkJCQllc3AtPnJhZGVsYXkgPSA5NjsKKwkJfQorCQlicmVhazsKKwljYXNlIGZhczEwMGE6CisJCS8qIEZhc3QgMTAwYSAqLworCQlzYnVzX3dyaXRlYihlc3AtPmNvbmZpZzIsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMik7CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJZXNwLT5jb25maWczW2ldIHw9IEVTUF9DT05GSUczX0ZDTE9DSzsKKwkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPmNvbmZpZzNbMF07CisJCXNidXNfd3JpdGViKGVzcC0+cHJldl9jZmczLCBlc3AtPmVyZWdzICsgRVNQX0NGRzMpOworCQllc3AtPnJhZGVsYXkgPSAzMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGFuaWMoImVzcDogd2hhdCBjb3VsZCBpdCBiZS4uLiBJIHdvbmRlci4uLiIpOworCQlicmVhazsKKwl9OworCisJLyogRWF0IGFueSBiaXRyb3QgaW4gdGhlIGNoaXAgKi8KKwlzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfSU5UUlBUKTsKKwl1ZGVsYXkoMTAwKTsKK30KKworLyogVGhpcyBwbGFjZXMgdGhlIEVTUCBpbnRvIGEga25vd24gc3RhdGUgYXQgYm9vdCB0aW1lLiAqLworc3RhdGljIHZvaWQgX19pbml0IGVzcF9ib290dXBfcmVzZXQoc3RydWN0IGVzcCAqZXNwKQoreworCXU4IHRtcDsKKworCS8qIFJlc2V0IHRoZSBETUEgKi8KKwllc3BfcmVzZXRfZG1hKGVzcCk7CisKKwkvKiBSZXNldCB0aGUgRVNQICovCisJZXNwX3Jlc2V0X2VzcChlc3ApOworCisJLyogUmVzZXQgdGhlIFNDU0kgYnVzLCBidXQgdGVsbCBFU1Agbm90IHRvIGdlbmVyYXRlIGFuIGlycSAqLworCXRtcCA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9DRkcxKTsKKwl0bXAgfD0gRVNQX0NPTkZJRzFfU1JSRElTQUI7CisJc2J1c193cml0ZWIodG1wLCBlc3AtPmVyZWdzICsgRVNQX0NGRzEpOworCisJZXNwX2NtZChlc3AsIEVTUF9DTURfUlMpOworCXVkZWxheSg0MDApOworCisJc2J1c193cml0ZWIoZXNwLT5jb25maWcxLCBlc3AtPmVyZWdzICsgRVNQX0NGRzEpOworCisJLyogRWF0IGFueSBiaXRyb3QgaW4gdGhlIGNoaXAgYW5kIHdlIGFyZSBkb25lLi4uICovCisJc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0lOVFJQVCk7Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9jaGFpbl9hZGQoc3RydWN0IGVzcCAqZXNwKQoreworCXNwaW5fbG9ja19pcnEoJmVzcGNoYWluX2xvY2spOworCWlmIChlc3BjaGFpbikgeworCQlzdHJ1Y3QgZXNwICplbGluayA9IGVzcGNoYWluOworCQl3aGlsZSAoZWxpbmstPm5leHQpCisJCQllbGluayA9IGVsaW5rLT5uZXh0OworCQllbGluay0+bmV4dCA9IGVzcDsKKwl9IGVsc2UgeworCQllc3BjaGFpbiA9IGVzcDsKKwl9CisJZXNwLT5uZXh0ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnEoJmVzcGNoYWluX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBlc3BfY2hhaW5fZGVsKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzcGluX2xvY2tfaXJxKCZlc3BjaGFpbl9sb2NrKTsKKwlpZiAoZXNwY2hhaW4gPT0gZXNwKSB7CisJCWVzcGNoYWluID0gZXNwLT5uZXh0OworCX0gZWxzZSB7CisJCXN0cnVjdCBlc3AgKmVsaW5rID0gZXNwY2hhaW47CisJCXdoaWxlIChlbGluay0+bmV4dCAhPSBlc3ApCisJCQllbGluayA9IGVsaW5rLT5uZXh0OworCQllbGluay0+bmV4dCA9IGVzcC0+bmV4dDsKKwl9CisJZXNwLT5uZXh0ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnEoJmVzcGNoYWluX2xvY2spOworfQorCitzdGF0aWMgaW50IF9faW5pdCBlc3BfZmluZF9kdm1hKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNidXNfZGV2ICpkbWFfc2RldikKK3sKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBlc3AtPnNkZXY7CisJc3RydWN0IHNidXNfZG1hICpkbWE7CisKKwlpZiAoZG1hX3NkZXYgIT0gTlVMTCkgeworCQlmb3JfZWFjaF9kdm1hKGRtYSkgeworCQkJaWYgKGRtYS0+c2RldiA9PSBkbWFfc2RldikKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCWZvcl9lYWNoX2R2bWEoZG1hKSB7CisJCQkvKiBJZiBhbGxvY2F0ZWQgYWxyZWFkeSwgY2FuJ3QgdXNlIGl0LiAqLworCQkJaWYgKGRtYS0+YWxsb2NhdGVkKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoZG1hLT5zZGV2ID09IE5VTEwpCisJCQkJYnJlYWs7CisKKwkJCS8qIElmIGJ1cyArIHNsb3QgYXJlIHRoZSBzYW1lIGFuZCBpdCBoYXMgdGhlCisJCQkgKiBjb3JyZWN0IE9CUCBuYW1lLCBpdCdzIG91cnMuCisJCQkgKi8KKwkJCWlmIChzZGV2LT5idXMgPT0gZG1hLT5zZGV2LT5idXMgJiYKKwkJCSAgICBzZGV2LT5zbG90ID09IGRtYS0+c2Rldi0+c2xvdCAmJgorCQkJICAgICghc3RyY21wKGRtYS0+c2Rldi0+cHJvbV9uYW1lLCAiZG1hIikgfHwKKwkJCSAgICAgIXN0cmNtcChkbWEtPnNkZXYtPnByb21fbmFtZSwgImVzcGRtYSIpKSkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8qIElmIHdlIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGUgZHZtYSwKKwkgKiBkbyBub3QgdXNlIHRoaXMgZGV2aWNlLgorCSAqLworCWlmIChkbWEgPT0gTlVMTCkgeworCQlwcmludGsoIkNhbm5vdCBmaW5kIGR2bWEgZm9yIEVTUCVkJ3MgU0NTSVxuIiwgZXNwLT5lc3BfaWQpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChkbWEtPmFsbG9jYXRlZCkgeworCQlwcmludGsoImVzcCVkOiBjYW4ndCB1c2UgbXkgZXNwZG1hXG4iLCBlc3AtPmVzcF9pZCk7CisJCXJldHVybiAtMTsKKwl9CisJZG1hLT5hbGxvY2F0ZWQgPSAxOworCWVzcC0+ZG1hID0gZG1hOworCWVzcC0+ZHJlZ3MgPSBkbWEtPnJlZ3M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgZXNwX21hcF9yZWdzKHN0cnVjdCBlc3AgKmVzcCwgaW50IGhtZSkKK3sKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBlc3AtPnNkZXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwkvKiBPbiBITUUsIHR3byByZWcgc2V0cyBleGlzdCwgZmlyc3QgaXMgRFZNQSwKKwkgKiBzZWNvbmQgaXMgRVNQIHJlZ2lzdGVycy4KKwkgKi8KKwlpZiAoaG1lKQorCQlyZXMgPSAmc2Rldi0+cmVzb3VyY2VbMV07CisJZWxzZQorCQlyZXMgPSAmc2Rldi0+cmVzb3VyY2VbMF07CisKKwllc3AtPmVyZWdzID0gc2J1c19pb3JlbWFwKHJlcywgMCwgRVNQX1JFR19TSVpFLCAiRVNQIFJlZ2lzdGVycyIpOworCisJaWYgKGVzcC0+ZXJlZ3MgPT0gMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBlc3BfbWFwX2NtZGFyZWEoc3RydWN0IGVzcCAqZXNwKQoreworCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IGVzcC0+c2RldjsKKworCWVzcC0+ZXNwX2NvbW1hbmQgPSBzYnVzX2FsbG9jX2NvbnNpc3RlbnQoc2RldiwgMTYsCisJCQkJCQkgJmVzcC0+ZXNwX2NvbW1hbmRfZHZtYSk7CisJaWYgKGVzcC0+ZXNwX2NvbW1hbmQgPT0gTlVMTCB8fAorCSAgICBlc3AtPmVzcF9jb21tYW5kX2R2bWEgPT0gMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBlc3BfcmVnaXN0ZXJfaXJxKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwllc3AtPmVob3N0LT5pcnEgPSBlc3AtPmlycSA9IGVzcC0+c2Rldi0+aXJxc1swXTsKKworCS8qIFdlIHVzZWQgdG8gdHJ5IHZhcmlvdXMgb3Zlcmx5LWNsZXZlciB0aGluZ3MgdG8KKwkgKiByZWR1Y2UgdGhlIGludGVycnVwdCBwcm9jZXNzaW5nIG92ZXJoZWFkIG9uCisJICogc3VuNGMvc3VuNG0gd2hlbiBtdWx0aXBsZSBFU1AncyBzaGFyZWQgdGhlCisJICogc2FtZSBJUlEuICBJdCB3YXMgdG9vIGNvbXBsZXggYW5kIG1lc3N5IHRvCisJICogc2FuZWx5IG1haW50YWluLgorCSAqLworCWlmIChyZXF1ZXN0X2lycShlc3AtPmVob3N0LT5pcnEsIGVzcF9pbnRyLAorCQkJU0FfU0hJUlEsICJFU1AgU0NTSSIsIGVzcCkpIHsKKwkJcHJpbnRrKCJlc3AlZDogQ2Fubm90IGFjcXVpcmUgaXJxIGxpbmVcbiIsCisJCSAgICAgICBlc3AtPmVzcF9pZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcmludGsoImVzcCVkOiBJUlEgJXMgIiwgZXNwLT5lc3BfaWQsCisJICAgICAgIF9faXJxX2l0b2EoZXNwLT5laG9zdC0+aXJxKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGVzcF9nZXRfc2NzaV9pZChzdHJ1Y3QgZXNwICplc3ApCit7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gZXNwLT5zZGV2OworCisJZXNwLT5zY3NpX2lkID0gcHJvbV9nZXRpbnRkZWZhdWx0KGVzcC0+cHJvbV9ub2RlLAorCQkJCQkgICJpbml0aWF0b3ItaWQiLAorCQkJCQkgIC0xKTsKKwlpZiAoZXNwLT5zY3NpX2lkID09IC0xKQorCQllc3AtPnNjc2lfaWQgPSBwcm9tX2dldGludGRlZmF1bHQoZXNwLT5wcm9tX25vZGUsCisJCQkJCQkgICJzY3NpLWluaXRpYXRvci1pZCIsCisJCQkJCQkgIC0xKTsKKwlpZiAoZXNwLT5zY3NpX2lkID09IC0xKQorCQllc3AtPnNjc2lfaWQgPSAoc2Rldi0+YnVzID09IE5VTEwpID8gNyA6CisJCQlwcm9tX2dldGludGRlZmF1bHQoc2Rldi0+YnVzLT5wcm9tX25vZGUsCisJCQkJCSAgICJzY3NpLWluaXRpYXRvci1pZCIsCisJCQkJCSAgIDcpOworCWVzcC0+ZWhvc3QtPnRoaXNfaWQgPSBlc3AtPnNjc2lfaWQ7CisJZXNwLT5zY3NpX2lkX21hc2sgPSAoMSA8PCBlc3AtPnNjc2lfaWQpOworCit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBlc3BfZ2V0X2Nsb2NrX3BhcmFtcyhzdHJ1Y3QgZXNwICplc3ApCit7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gZXNwLT5zZGV2OworCWludCBwcm9tX25vZGUgPSBlc3AtPnByb21fbm9kZTsKKwlpbnQgc2J1c19wcm9tX25vZGU7CisJdW5zaWduZWQgaW50IGZtaHo7CisJdTggY2NmOworCisJaWYgKHNkZXYgIT0gTlVMTCAmJiBzZGV2LT5idXMgIT0gTlVMTCkKKwkJc2J1c19wcm9tX25vZGUgPSBzZGV2LT5idXMtPnByb21fbm9kZTsKKwllbHNlCisJCXNidXNfcHJvbV9ub2RlID0gMDsKKworCS8qIFRoaXMgaXMgZ2V0dGluZyBtZXNzeSBidXQgaXQgaGFzIHRvIGJlIGRvbmUKKwkgKiBjb3JyZWN0bHkgb3IgZWxzZSB5b3UgZ2V0IHdlaXJkIGJlaGF2aW9yIGFsbAorCSAqIG92ZXIgdGhlIHBsYWNlLiAgV2UgYXJlIHRyeWluZyB0byBiYXNpY2FsbHkKKwkgKiBmaWd1cmUgb3V0IHRocmVlIHBpZWNlcyBvZiBpbmZvcm1hdGlvbi4KKwkgKgorCSAqIGEpIENsb2NrIENvbnZlcnNpb24gRmFjdG9yCisJICoKKwkgKiAgICBUaGlzIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlucHV0CisJICogICAgY3J5c3RhbCBjbG9jayBmcmVxdWVuY3kgZ29pbmcgaW50byB0aGUKKwkgKiAgICBFU1Agb24gdGhpcyBtYWNoaW5lLiAgQW55IG9wZXJhdGlvbiB3aG9zZQorCSAqICAgIHRpbWluZyBpcyBsb25nZXIgdGhhbiA0MDBucyBkZXBlbmRzIG9uIHRoaXMKKwkgKiAgICB2YWx1ZSBiZWluZyBjb3JyZWN0LiAgRm9yIGV4YW1wbGUsIHlvdSdsbAorCSAqICAgIGdldCBibGlwcyBmb3IgYXJiaXRyYXRpb24vc2VsZWN0aW9uIGR1cmluZworCSAqICAgIGhpZ2ggbG9hZCBvciB3aXRoIG11bHRpcGxlIHRhcmdldHMgaWYgdGhpcworCSAqICAgIGlzIG5vdCBzZXQgY29ycmVjdGx5LgorCSAqCisJICogYikgU2VsZWN0aW9uIFRpbWUtT3V0CisJICoKKwkgKiAgICBUaGUgRVNQIGlzbid0IHZlcnkgYnJpZ2h0IGFuZCB3aWxsIGFyYml0cmF0ZQorCSAqICAgIGZvciB0aGUgYnVzIGFuZCB0cnkgdG8gc2VsZWN0IGEgdGFyZ2V0CisJICogICAgZm9yZXZlciBpZiB5b3UgbGV0IGl0LiAgVGhpcyB2YWx1ZSB0ZWxscworCSAqICAgIHRoZSBFU1Agd2hlbiBpdCBoYXMgdGFrZW4gdG9vIGxvbmcgdG8KKwkgKiAgICBuZWdvdGlhdGUgYW5kIHRoYXQgaXQgc2hvdWxkIGludGVycnVwdAorCSAqICAgIHRoZSBDUFUgc28gd2UgY2FuIHNlZSB3aGF0IGhhcHBlbmVkLgorCSAqICAgIFRoZSB2YWx1ZSBpcyBjb21wdXRlZCBhcyBmb2xsb3dzIChmcm9tCisJICogICAgTkNSL1N5bWJpb3MgY2hpcCBkb2NzKS4KKwkgKgorCSAqICAgICAgICAgIChUaW1lIE91dCBQZXJpb2QpICogIChJbnB1dCBDbG9jaykKKwkgKiAgICBTVE8gPSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogICAgICAgICAgKDgxOTIpICogKENsb2NrIENvbnZlcnNpb24gRmFjdG9yKQorCSAqCisJICogICAgWW91IHVzdWFsbHkgd2FudCB0aGUgdGltZSBvdXQgcGVyaW9kIHRvIGJlCisJICogICAgYXJvdW5kIDI1MG1zLCBJIHRoaW5rIHdlJ2xsIHNldCBpdCBhIGxpdHRsZQorCSAqICAgIGJpdCBoaWdoZXIgdG8gYWNjb3VudCBmb3IgZnVsbHkgbG9hZGVkIFNDU0kKKwkgKiAgICBidXMncyBhbmQgc2xvdyBkZXZpY2VzIHRoYXQgZG9uJ3QgcmVzcG9uZCBzbworCSAqICAgIHF1aWNrbHkgdG8gc2VsZWN0aW9uIGF0dGVtcHRzLiAoeWVhaCwgSSBrbm93CisJICogICAgdGhpcyBpcyBvdXQgb2Ygc3BlYy4gYnV0IHRoZXJlIGlzIGEgbG90IG9mCisJICogICAgYnVnZ3kgcGllY2VzIG9mIGZpcm13YXJlIG91dCB0aGVyZSBzbyBiaXRlIG1lKQorCSAqCisJICogYykgSW1wZXJpY2FsIGNvbnN0YW50cyBmb3Igc3luY2hyb25vdXMgb2Zmc2V0CisJICogICAgYW5kIHRyYW5zZmVyIHBlcmlvZCByZWdpc3RlciB2YWx1ZXMKKwkgKgorCSAqICAgIFRoaXMgZW50YWlscyB0aGUgc21hbGxlc3QgYW5kIGxhcmdlc3Qgc3luYworCSAqICAgIHBlcmlvZCB3ZSBjb3VsZCBldmVyIGhhbmRsZSBvbiB0aGlzIEVTUC4KKwkgKi8KKworCWZtaHogPSBwcm9tX2dldGludGRlZmF1bHQocHJvbV9ub2RlLCAiY2xvY2stZnJlcXVlbmN5IiwgLTEpOworCWlmIChmbWh6ID09IC0xKQorCQlmbWh6ID0gKCFzYnVzX3Byb21fbm9kZSkgPyAwIDoKKwkJCXByb21fZ2V0aW50ZGVmYXVsdChzYnVzX3Byb21fbm9kZSwgImNsb2NrLWZyZXF1ZW5jeSIsIC0xKTsKKworCWlmIChmbWh6IDw9ICg1MDAwMDAwKSkKKwkJY2NmID0gMDsKKwllbHNlCisJCWNjZiA9ICgoKDUwMDAwMDAgLSAxKSArIChmbWh6KSkvKDUwMDAwMDApKTsKKworCWlmICghY2NmIHx8IGNjZiA+IDgpIHsKKwkJLyogSWYgd2UgY2FuJ3QgZmluZCBhbnl0aGluZyByZWFzb25hYmxlLAorCQkgKiBqdXN0IGFzc3VtZSAyME1IWi4gIFRoaXMgaXMgdGhlIGNsb2NrCisJCSAqIGZyZXF1ZW5jeSBvZiB0aGUgb2xkZXIgc3VuNGMncyB3aGVyZSBJJ3ZlCisJCSAqIGJlZW4gdW5hYmxlIHRvIGZpbmQgdGhlIGNsb2NrLWZyZXF1ZW5jeQorCQkgKiBQUk9NIHByb3BlcnR5LiAgQWxsIG90aGVyIG1hY2hpbmVzIHByb3ZpZGUKKwkJICogdXNlZnVsIHZhbHVlcyBpdCBzZWVtcy4KKwkJICovCisJCWNjZiA9IEVTUF9DQ0ZfRjQ7CisJCWZtaHogPSAoMjAwMDAwMDApOworCX0KKworCWlmIChjY2YgPT0gKEVTUF9DQ0ZfRjcgKyAxKSkKKwkJZXNwLT5jZmFjdCA9IEVTUF9DQ0ZfRjA7CisJZWxzZSBpZiAoY2NmID09IEVTUF9DQ0ZfTkVWRVIpCisJCWVzcC0+Y2ZhY3QgPSBFU1BfQ0NGX0YyOworCWVsc2UKKwkJZXNwLT5jZmFjdCA9IGNjZjsKKwllc3AtPnJhd19jZmFjdCA9IGNjZjsKKworCWVzcC0+Y2ZyZXEgPSBmbWh6OworCWVzcC0+Y2N5Y2xlID0gRVNQX01IWl9UT19DWUNMRShmbWh6KTsKKwllc3AtPmN0aWNrID0gRVNQX1RJQ0soY2NmLCBlc3AtPmNjeWNsZSk7CisJZXNwLT5uZWdfZGVmcCA9IEVTUF9ORUdfREVGUChmbWh6LCBjY2YpOworCWVzcC0+c3luY19kZWZwID0gU1lOQ19ERUZQX1NMT1c7CisKKwlwcmludGsoIlNDU0kgSUQgJWQgQ2xrICVkTUh6IENDWUM9JWQgQ0NGPSVkIFRPdXQgJWQgIiwKKwkgICAgICAgZXNwLT5zY3NpX2lkLCAoZm1oeiAvIDEwMDAwMDApLAorCSAgICAgICAoaW50KWVzcC0+Y2N5Y2xlLCAoaW50KWNjZiwgKGludCkgZXNwLT5uZWdfZGVmcCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBlc3BfZ2V0X2J1cnN0cyhzdHJ1Y3QgZXNwICplc3AsIHN0cnVjdCBzYnVzX2RldiAqZG1hKQoreworCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IGVzcC0+c2RldjsKKwl1OCBidXJzdHM7CisKKwlidXJzdHMgPSBwcm9tX2dldGludGRlZmF1bHQoZXNwLT5wcm9tX25vZGUsICJidXJzdC1zaXplcyIsIDB4ZmYpOworCisJaWYgKGRtYSkgeworCQl1OCB0bXAgPSBwcm9tX2dldGludGRlZmF1bHQoZG1hLT5wcm9tX25vZGUsCisJCQkJCSAgICAiYnVyc3Qtc2l6ZXMiLCAweGZmKTsKKwkJaWYgKHRtcCAhPSAweGZmKQorCQkJYnVyc3RzICY9IHRtcDsKKwl9CisKKwlpZiAoc2Rldi0+YnVzKSB7CisJCXU4IHRtcCA9IHByb21fZ2V0aW50ZGVmYXVsdChzZGV2LT5idXMtPnByb21fbm9kZSwKKwkJCQkJICAgICJidXJzdC1zaXplcyIsIDB4ZmYpOworCQlpZiAodG1wICE9IDB4ZmYpCisJCQlidXJzdHMgJj0gdG1wOworCX0KKworCWlmIChidXJzdHMgPT0gMHhmZiB8fAorCSAgICAoYnVyc3RzICYgRE1BX0JVUlNUMTYpID09IDAgfHwKKwkgICAgKGJ1cnN0cyAmIERNQV9CVVJTVDMyKSA9PSAwKQorCQlidXJzdHMgPSAoRE1BX0JVUlNUMzIgLSAxKTsKKworCWVzcC0+YnVyc3RzID0gYnVyc3RzOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZXNwX2dldF9yZXZpc2lvbihzdHJ1Y3QgZXNwICplc3ApCit7CisJdTggdG1wOworCisJZXNwLT5jb25maWcxID0gKEVTUF9DT05GSUcxX1BFTkFCTEUgfCAoZXNwLT5zY3NpX2lkICYgNykpOworCWVzcC0+Y29uZmlnMiA9IChFU1BfQ09ORklHMl9TQ1NJMkVOQUIgfCBFU1BfQ09ORklHMl9SRUdQQVJJVFkpOworCXNidXNfd3JpdGViKGVzcC0+Y29uZmlnMiwgZXNwLT5lcmVncyArIEVTUF9DRkcyKTsKKworCXRtcCA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9DRkcyKTsKKwl0bXAgJj0gfkVTUF9DT05GSUcyX01BR0lDOworCWlmICh0bXAgIT0gKEVTUF9DT05GSUcyX1NDU0kyRU5BQiB8IEVTUF9DT05GSUcyX1JFR1BBUklUWSkpIHsKKwkJLyogSWYgd2hhdCB3ZSB3cml0ZSB0byBjZmcyIGRvZXMgbm90IGNvbWUgYmFjaywgY2ZnMgorCQkgKiBpcyBub3QgaW1wbGVtZW50ZWQsIHRoZXJlZm9yZSB0aGlzIG11c3QgYmUgYSBwbGFpbgorCQkgKiBlc3AxMDAuCisJCSAqLworCQllc3AtPmVyZXYgPSBlc3AxMDA7CisJCXByaW50aygiTkNSNTNDOTAoZXNwMTAwKVxuIik7CisJfSBlbHNlIHsKKwkJZXNwLT5jb25maWcyID0gMDsKKwkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPmNvbmZpZzNbMF0gPSA1OworCQlzYnVzX3dyaXRlYihlc3AtPmNvbmZpZzIsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMik7CisJCXNidXNfd3JpdGViKDAsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMyk7CisJCXNidXNfd3JpdGViKGVzcC0+cHJldl9jZmczLCBlc3AtPmVyZWdzICsgRVNQX0NGRzMpOworCisJCXRtcCA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9DRkczKTsKKwkJaWYgKHRtcCAhPSA1KSB7CisJCQkvKiBUaGUgY2ZnMiByZWdpc3RlciBpcyBpbXBsZW1lbnRlZCwgaG93ZXZlcgorCQkJICogY2ZnMyBpcyBub3QsIG11c3QgYmUgZXNwMTAwYS4KKwkJCSAqLworCQkJZXNwLT5lcmV2ID0gZXNwMTAwYTsKKwkJCXByaW50aygiTkNSNTNDOTBBKGVzcDEwMGEpXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWludCB0YXJnZXQ7CisKKwkJCWZvciAodGFyZ2V0ID0gMDsgdGFyZ2V0IDwgMTY7IHRhcmdldCsrKQorCQkJCWVzcC0+Y29uZmlnM1t0YXJnZXRdID0gMDsKKwkJCWVzcC0+cHJldl9jZmczID0gMDsKKwkJCXNidXNfd3JpdGViKGVzcC0+cHJldl9jZmczLCBlc3AtPmVyZWdzICsgRVNQX0NGRzMpOworCisJCQkvKiBBbGwgb2YgY2ZnezEsMiwzfSBpbXBsZW1lbnRlZCwgbXVzdCBiZSBvbmUgb2YKKwkJCSAqIHRoZSBmYXMgdmFyaWFudHMsIGZpZ3VyZSBvdXQgd2hpY2ggb25lLgorCQkJICovCisJCQlpZiAoZXNwLT5yYXdfY2ZhY3QgPiBFU1BfQ0NGX0Y1KSB7CisJCQkJZXNwLT5lcmV2ID0gZmFzdDsKKwkJCQllc3AtPnN5bmNfZGVmcCA9IFNZTkNfREVGUF9GQVNUOworCQkJCXByaW50aygiTkNSNTNDOVhGKGVzcGZhc3QpXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJZXNwLT5lcmV2ID0gZXNwMjM2OworCQkJCXByaW50aygiTkNSNTNDOXgoZXNwMjM2KVxuIik7CisJCQl9CisJCQllc3AtPmNvbmZpZzIgPSAwOworCQkJc2J1c193cml0ZWIoZXNwLT5jb25maWcyLCBlc3AtPmVyZWdzICsgRVNQX0NGRzIpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZXNwX2luaXRfc3dzdGF0ZShzdHJ1Y3QgZXNwICplc3ApCit7CisJaW50IGk7CisKKwkvKiBDb21tYW5kIHF1ZXVlcy4uLiAqLworCWVzcC0+Y3VycmVudF9TQyA9IE5VTEw7CisJZXNwLT5kaXNjb25uZWN0ZWRfU0MgPSBOVUxMOworCWVzcC0+aXNzdWVfU0MgPSBOVUxMOworCisJLyogVGFyZ2V0IGFuZCBjdXJyZW50IGNvbW1hbmQgc3RhdGUuLi4gKi8KKwllc3AtPnRhcmdldHNfcHJlc2VudCA9IDA7CisJZXNwLT5yZXNldHRpbmdfYnVzID0gMDsKKwllc3AtPnNuaXAgPSAwOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmZXNwLT5yZXNldF9xdWV1ZSk7CisKKwkvKiBEZWJ1Z2dpbmcuLi4gKi8KKwlmb3IoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQllc3AtPmVzcGNtZGxvZ1tpXSA9IDA7CisJZXNwLT5lc3BjbWRlbnQgPSAwOworCisJLyogTVNHIHBoYXNlIHN0YXRlLi4uICovCisJZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQllc3AtPmN1cl9tc2dvdXRbaV0gPSAwOworCQllc3AtPmN1cl9tc2dpbltpXSA9IDA7CisJfQorCWVzcC0+cHJldm1zZ291dCA9IGVzcC0+cHJldm1zZ2luID0gMDsKKwllc3AtPm1zZ291dF9sZW4gPSBlc3AtPm1zZ2luX2xlbiA9IDA7CisKKwkvKiBDbGVhciB0aGUgb25lIGJlaGluZCBjYWNoZXMgdG8gaG9sZCB1bm1hdGNoYWJsZSB2YWx1ZXMuICovCisJZXNwLT5wcmV2X3NvZmYgPSBlc3AtPnByZXZfc3RwID0gZXNwLT5wcmV2X2NmZzMgPSAweGZmOworCWVzcC0+cHJldl9obWVfZG1hY3NyID0gMHhmZmZmZmZmZjsKK30KKworc3RhdGljIGludCBfX2luaXQgZGV0ZWN0X29uZV9lc3Aoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCwgc3RydWN0IHNidXNfZGV2ICplc3BfZGV2LAorCQkJCSBzdHJ1Y3Qgc2J1c19kZXYgKmVzcGRtYSwgc3RydWN0IHNidXNfYnVzICpzYnVzLAorCQkJCSBpbnQgaWQsIGludCBobWUpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqZXNwX2hvc3QgPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIHNpemVvZihzdHJ1Y3QgZXNwKSk7CisJc3RydWN0IGVzcCAqZXNwOworCQorCWlmICghZXNwX2hvc3QpIHsKKwkJcHJpbnRrKCJFU1A6IENhbm5vdCByZWdpc3RlciBTQ1NJIGhvc3RcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChobWUpCisJCWVzcF9ob3N0LT5tYXhfaWQgPSAxNjsKKwllc3AgPSAoc3RydWN0IGVzcCAqKSBlc3BfaG9zdC0+aG9zdGRhdGE7CisJZXNwLT5laG9zdCA9IGVzcF9ob3N0OworCWVzcC0+c2RldiA9IGVzcF9kZXY7CisJZXNwLT5lc3BfaWQgPSBpZDsKKwllc3AtPnByb21fbm9kZSA9IGVzcF9kZXYtPnByb21fbm9kZTsKKwlwcm9tX2dldHN0cmluZyhlc3AtPnByb21fbm9kZSwgIm5hbWUiLCBlc3AtPnByb21fbmFtZSwKKwkJICAgICAgIHNpemVvZihlc3AtPnByb21fbmFtZSkpOworCisJZXNwX2NoYWluX2FkZChlc3ApOworCWlmIChlc3BfZmluZF9kdm1hKGVzcCwgZXNwZG1hKSA8IDApCisJCWdvdG8gZmFpbF91bmxpbms7CisJaWYgKGVzcF9tYXBfcmVncyhlc3AsIGhtZSkgPCAwKSB7CisJCXByaW50aygiRVNQIHJlZ2lzdGVycyB1bm1hcHBhYmxlIik7CisJCWdvdG8gZmFpbF9kdm1hX3JlbGVhc2U7CisJfQorCWlmIChlc3BfbWFwX2NtZGFyZWEoZXNwKSA8IDApIHsKKwkJcHJpbnRrKCJFU1AgRFZNQSB0cmFuc3BvcnQgYXJlYSB1bm1hcHBhYmxlIik7CisJCWdvdG8gZmFpbF91bm1hcF9yZWdzOworCX0KKwlpZiAoZXNwX3JlZ2lzdGVyX2lycShlc3ApIDwgMCkKKwkJZ290byBmYWlsX3VubWFwX2NtZGFyZWE7CisKKwllc3BfZ2V0X3Njc2lfaWQoZXNwKTsKKworCWVzcC0+ZGlmZiA9IHByb21fZ2V0Ym9vbChlc3AtPnByb21fbm9kZSwgImRpZmZlcmVudGlhbCIpOworCWlmIChlc3AtPmRpZmYpCisJCXByaW50aygiRGlmZmVyZW50aWFsICIpOworCisJZXNwX2dldF9jbG9ja19wYXJhbXMoZXNwKTsKKwllc3BfZ2V0X2J1cnN0cyhlc3AsIGVzcGRtYSk7CisJZXNwX2dldF9yZXZpc2lvbihlc3ApOworCWVzcF9pbml0X3N3c3RhdGUoZXNwKTsKKworCWVzcF9ib290dXBfcmVzZXQoZXNwKTsKKworCXJldHVybiAwOworCitmYWlsX3VubWFwX2NtZGFyZWE6CisJc2J1c19mcmVlX2NvbnNpc3RlbnQoZXNwLT5zZGV2LCAxNiwKKwkJCSAgICAgKHZvaWQgKikgZXNwLT5lc3BfY29tbWFuZCwKKwkJCSAgICAgZXNwLT5lc3BfY29tbWFuZF9kdm1hKTsKKworZmFpbF91bm1hcF9yZWdzOgorCXNidXNfaW91bm1hcChlc3AtPmVyZWdzLCBFU1BfUkVHX1NJWkUpOworCitmYWlsX2R2bWFfcmVsZWFzZToKKwllc3AtPmRtYS0+YWxsb2NhdGVkID0gMDsKKworZmFpbF91bmxpbms6CisJZXNwX2NoYWluX2RlbChlc3ApOworCXNjc2lfdW5yZWdpc3Rlcihlc3BfaG9zdCk7CisJcmV0dXJuIC0xOworfQorCisvKiBEZXRlY3RpbmcgRVNQIGNoaXBzIG9uIHRoZSBtYWNoaW5lLiAgVGhpcyBpcyB0aGUgc2ltcGxlIGFuZCBlYXN5CisgKiB2ZXJzaW9uLgorICovCisKKyNpZmRlZiBDT05GSUdfU1VONAorCisjaW5jbHVkZSA8YXNtL3N1bjRwYWRkci5oPgorCitzdGF0aWMgaW50IF9faW5pdCBlc3BfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCit7CisJc3RhdGljIHN0cnVjdCBzYnVzX2RldiBlc3BfZGV2OworCWludCBlc3BzX2luX3VzZSA9IDA7CisKKwllc3BjaGFpbiA9IDA7CisKKwlpZiAoc3VuNF9lc3BfcGh5c2FkZHIpIHsKKwkJbWVtc2V0ICgmZXNwX2RldiwgMCwgc2l6ZW9mKGVzcF9kZXYpKTsKKwkJZXNwX2Rldi5yZWdfYWRkcnNbMF0ucGh5c19hZGRyID0gc3VuNF9lc3BfcGh5c2FkZHI7CisJCWVzcF9kZXYuaXJxc1swXSA9IDQ7CisJCWVzcF9kZXYucmVzb3VyY2VbMF0uc3RhcnQgPSBzdW40X2VzcF9waHlzYWRkcjsKKwkJZXNwX2Rldi5yZXNvdXJjZVswXS5lbmQgPSBzdW40X2VzcF9waHlzYWRkciArIEVTUF9SRUdfU0laRSAtIDE7CisJCWVzcF9kZXYucmVzb3VyY2VbMF0uZmxhZ3MgPSBJT1JFU09VUkNFX0lPOworCisJCWlmICghZGV0ZWN0X29uZV9lc3AodHBudCwgJmVzcF9kZXYsIE5VTEwsIE5VTEwsIDAsIDApKQorCQkJZXNwc19pbl91c2UrKzsKKwkJcHJpbnRrKCJFU1A6IFRvdGFsIG9mIDEgRVNQIGhvc3RzIGZvdW5kLCAlZCBhY3R1YWxseSBpbiB1c2UuXG4iLCBlc3BzX2luX3VzZSk7CisJCWVzcHNfcnVubmluZyA9ICBlc3BzX2luX3VzZTsKKwl9CisJcmV0dXJuIGVzcHNfaW5fdXNlOworfQorCisjZWxzZSAvKiAhQ09ORklHX1NVTjQgKi8KKworc3RhdGljIGludCBfX2luaXQgZXNwX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0cG50KQoreworCXN0cnVjdCBzYnVzX2J1cyAqc2J1czsKKwlzdHJ1Y3Qgc2J1c19kZXYgKmVzcF9kZXYsICpzYmRldl9pdGVyOworCWludCBuZXNwcyA9IDAsIGVzcHNfaW5fdXNlID0gMDsKKworCWVzcGNoYWluID0gMDsKKwlpZiAoIXNidXNfcm9vdCkgeworI2lmZGVmIENPTkZJR19QQ0kKKwkJcmV0dXJuIDA7CisjZWxzZQorCQlwYW5pYygiTm8gU0JVUyBpbiBlc3BfZGV0ZWN0KCkiKTsKKyNlbmRpZgorCX0KKwlmb3JfZWFjaF9zYnVzKHNidXMpIHsKKwkJZm9yX2VhY2hfc2J1c2RldihzYmRldl9pdGVyLCBzYnVzKSB7CisJCQlzdHJ1Y3Qgc2J1c19kZXYgKmVzcGRtYSA9IE5VTEw7CisJCQlpbnQgaG1lID0gMDsKKworCQkJLyogSXMgaXQgYW4gZXNwIHNidXMgZGV2aWNlPyAqLworCQkJZXNwX2RldiA9IHNiZGV2X2l0ZXI7CisJCQlpZiAoc3RyY21wKGVzcF9kZXYtPnByb21fbmFtZSwgImVzcCIpICYmCisJCQkgICAgc3RyY21wKGVzcF9kZXYtPnByb21fbmFtZSwgIlNVTlcsZXNwIikpIHsKKwkJCQlpZiAoIXN0cmNtcChlc3BfZGV2LT5wcm9tX25hbWUsICJTVU5XLGZhcyIpKSB7CisJCQkJCWhtZSA9IDE7CisJCQkJCWVzcGRtYSA9IGVzcF9kZXY7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCFlc3BfZGV2LT5jaGlsZCB8fAorCQkJCQkgICAgKHN0cmNtcChlc3BfZGV2LT5wcm9tX25hbWUsICJlc3BkbWEiKSAmJgorCQkJCQkgICAgIHN0cmNtcChlc3BfZGV2LT5wcm9tX25hbWUsICJkbWEiKSkpCisJCQkJCQljb250aW51ZTsgLyogbm9wZS4uLiAqLworCQkJCQllc3BkbWEgPSBlc3BfZGV2OworCQkJCQllc3BfZGV2ID0gZXNwX2Rldi0+Y2hpbGQ7CisJCQkJCWlmIChzdHJjbXAoZXNwX2Rldi0+cHJvbV9uYW1lLCAiZXNwIikgJiYKKwkJCQkJICAgIHN0cmNtcChlc3BfZGV2LT5wcm9tX25hbWUsICJTVU5XLGVzcCIpKQorCQkJCQkJY29udGludWU7IC8qIGhvdyBjYW4gdGhpcyBoYXBwZW4/ICovCisJCQkJfQorCQkJfQorCQkJCisJCQlpZiAoZGV0ZWN0X29uZV9lc3AodHBudCwgZXNwX2RldiwgZXNwZG1hLCBzYnVzLCBuZXNwcysrLCBobWUpIDwgMCkKKwkJCQljb250aW51ZTsKKwkJCQkKKwkJCWVzcHNfaW5fdXNlKys7CisJCX0gLyogZm9yIGVhY2ggc2J1c2RldiAqLworCX0gLyogZm9yIGVhY2ggc2J1cyAqLworCXByaW50aygiRVNQOiBUb3RhbCBvZiAlZCBFU1AgaG9zdHMgZm91bmQsICVkIGFjdHVhbGx5IGluIHVzZS5cbiIsIG5lc3BzLAorCSAgICAgICBlc3BzX2luX3VzZSk7CisJZXNwc19ydW5uaW5nID0gZXNwc19pbl91c2U7CisJcmV0dXJuIGVzcHNfaW5fdXNlOworfQorCisjZW5kaWYgLyogIUNPTkZJR19TVU40ICovCisKKy8qCisgKi8KK3N0YXRpYyBpbnQgZXNwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgZXNwICplc3AgPSAoc3RydWN0IGVzcCAqKSBob3N0LT5ob3N0ZGF0YTsKKworCUVTUF9JTlRTT0ZGKGVzcC0+ZHJlZ3MpOworI2lmIDAKKwllc3BfcmVzZXRfZG1hKGVzcCk7CisJZXNwX3Jlc2V0X2VzcChlc3ApOworI2VuZGlmCisKKwlmcmVlX2lycShlc3AtPmVob3N0LT5pcnEsIGVzcCk7CisJc2J1c19mcmVlX2NvbnNpc3RlbnQoZXNwLT5zZGV2LCAxNiwKKwkJCSAgICAgKHZvaWQgKikgZXNwLT5lc3BfY29tbWFuZCwgZXNwLT5lc3BfY29tbWFuZF9kdm1hKTsKKwlzYnVzX2lvdW5tYXAoZXNwLT5lcmVncywgRVNQX1JFR19TSVpFKTsKKwllc3AtPmRtYS0+YWxsb2NhdGVkID0gMDsKKwllc3BfY2hhaW5fZGVsKGVzcCk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBpbmZvIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHdoYXRldmVyIHVzZWZ1bAorICogaW5mb3JtYXRpb24gdGhlIGRldmVsb3BlciBzZWVzIGZpdC4gIElmIG5vdCBwcm92aWRlZCwgdGhlbgorICogdGhlIG5hbWUgZmllbGQgd2lsbCBiZSB1c2VkIGluc3RlYWQuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICplc3BfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0cnVjdCBlc3AgKmVzcDsKKworCWVzcCA9IChzdHJ1Y3QgZXNwICopIGhvc3QtPmhvc3RkYXRhOworCXN3aXRjaCAoZXNwLT5lcmV2KSB7CisJY2FzZSBlc3AxMDA6CisJCXJldHVybiAiU3BhcmMgRVNQMTAwIChOQ1I1M0M5MCkiOworCWNhc2UgZXNwMTAwYToKKwkJcmV0dXJuICJTcGFyYyBFU1AxMDBBIChOQ1I1M0M5MEEpIjsKKwljYXNlIGVzcDIzNjoKKwkJcmV0dXJuICJTcGFyYyBFU1AyMzYiOworCWNhc2UgZmFzMjM2OgorCQlyZXR1cm4gIlNwYXJjIEVTUDIzNi1GQVNUIjsKKwljYXNlIGZhc2htZToKKwkJcmV0dXJuICJTcGFyYyBFU1AzNjYtSE1FIjsKKwljYXNlIGZhczEwMGE6CisJCXJldHVybiAiU3BhcmMgRVNQMTAwQS1GQVNUIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIkJvZ29uIEVTUCByZXZpc2lvbiI7CisJfTsKK30KKworLyogRnJvbSBXb2xmZ2FuZyBTdGFuZ2xtZWllcidzIE5DUiBzY3NpIGRyaXZlci4gKi8KK3N0cnVjdCBpbmZvX3N0cgoreworCWNoYXIgKmJ1ZmZlcjsKKwlpbnQgbGVuZ3RoOworCWludCBvZmZzZXQ7CisJaW50IHBvczsKK307CisKK3N0YXRpYyB2b2lkIGNvcHlfbWVtX2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCWlmIChpbmZvLT5wb3MgKyBsZW4gPiBpbmZvLT5sZW5ndGgpCisJCWxlbiA9IGluZm8tPmxlbmd0aCAtIGluZm8tPnBvczsKKworCWlmIChpbmZvLT5wb3MgKyBsZW4gPCBpbmZvLT5vZmZzZXQpIHsKKwkJaW5mby0+cG9zICs9IGxlbjsKKwkJcmV0dXJuOworCX0KKwlpZiAoaW5mby0+cG9zIDwgaW5mby0+b2Zmc2V0KSB7CisJCWRhdGEgKz0gKGluZm8tPm9mZnNldCAtIGluZm8tPnBvcyk7CisJCWxlbiAgLT0gKGluZm8tPm9mZnNldCAtIGluZm8tPnBvcyk7CisJfQorCisJaWYgKGxlbiA+IDApIHsKKwkJbWVtY3B5KGluZm8tPmJ1ZmZlciArIGluZm8tPnBvcywgZGF0YSwgbGVuKTsKKwkJaW5mby0+cG9zICs9IGxlbjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29weV9pbmZvKHN0cnVjdCBpbmZvX3N0ciAqaW5mbywgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWNoYXIgYnVmWzgxXTsKKwlpbnQgbGVuOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlsZW4gPSB2c3ByaW50ZihidWYsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJY29weV9tZW1faW5mbyhpbmZvLCBidWYsIGxlbik7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBlc3BfaG9zdF9pbmZvKHN0cnVjdCBlc3AgKmVzcCwgY2hhciAqcHRyLCBvZmZfdCBvZmZzZXQsIGludCBsZW4pCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCXN0cnVjdCBpbmZvX3N0ciBpbmZvOworCWludCBpOworCisJaW5mby5idWZmZXIJPSBwdHI7CisJaW5mby5sZW5ndGgJPSBsZW47CisJaW5mby5vZmZzZXQJPSBvZmZzZXQ7CisJaW5mby5wb3MJPSAwOworCisJY29weV9pbmZvKCZpbmZvLCAiU3BhcmMgRVNQIEhvc3QgQWRhcHRlcjpcbiIpOworCWNvcHlfaW5mbygmaW5mbywgIlx0UFJPTSBub2RlXHRcdCUwOHhcbiIsICh1bnNpZ25lZCBpbnQpIGVzcC0+cHJvbV9ub2RlKTsKKwljb3B5X2luZm8oJmluZm8sICJcdFBST00gbmFtZVx0XHQlc1xuIiwgZXNwLT5wcm9tX25hbWUpOworCWNvcHlfaW5mbygmaW5mbywgIlx0RVNQIE1vZGVsXHRcdCIpOworCXN3aXRjaCAoZXNwLT5lcmV2KSB7CisJY2FzZSBlc3AxMDA6CisJCWNvcHlfaW5mbygmaW5mbywgIkVTUDEwMFxuIik7CisJCWJyZWFrOworCWNhc2UgZXNwMTAwYToKKwkJY29weV9pbmZvKCZpbmZvLCAiRVNQMTAwQVxuIik7CisJCWJyZWFrOworCWNhc2UgZXNwMjM2OgorCQljb3B5X2luZm8oJmluZm8sICJFU1AyMzZcbiIpOworCQlicmVhazsKKwljYXNlIGZhczIzNjoKKwkJY29weV9pbmZvKCZpbmZvLCAiRkFTMjM2XG4iKTsKKwkJYnJlYWs7CisJY2FzZSBmYXMxMDBhOgorCQljb3B5X2luZm8oJmluZm8sICJGQVMxMDBBXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBmYXN0OgorCQljb3B5X2luZm8oJmluZm8sICJGQVNUXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBmYXNobWU6CisJCWNvcHlfaW5mbygmaW5mbywgIkhhcHB5IE1lYWwgRkFTXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBlc3B1bmtub3duOgorCWRlZmF1bHQ6CisJCWNvcHlfaW5mbygmaW5mbywgIlVua25vd24hXG4iKTsKKwkJYnJlYWs7CisJfTsKKwljb3B5X2luZm8oJmluZm8sICJcdERNQSBSZXZpc2lvblx0XHQiKTsKKwlzd2l0Y2ggKGVzcC0+ZG1hLT5yZXZpc2lvbikgeworCWNhc2UgZHZtYXJldjA6CisJCWNvcHlfaW5mbygmaW5mbywgIlJldiAwXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBkdm1hZXNjMToKKwkJY29weV9pbmZvKCZpbmZvLCAiRVNDIFJldiAxXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBkdm1hcmV2MToKKwkJY29weV9pbmZvKCZpbmZvLCAiUmV2IDFcbiIpOworCQlicmVhazsKKwljYXNlIGR2bWFyZXYyOgorCQljb3B5X2luZm8oJmluZm8sICJSZXYgMlxuIik7CisJCWJyZWFrOworCWNhc2UgZHZtYXJldjM6CisJCWNvcHlfaW5mbygmaW5mbywgIlJldiAzXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBkdm1hcmV2cGx1czoKKwkJY29weV9pbmZvKCZpbmZvLCAiUmV2IDErXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBkdm1haG1lOgorCQljb3B5X2luZm8oJmluZm8sICJSZXYgSE1FL0ZBU1xuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNvcHlfaW5mbygmaW5mbywgIlVua25vd24hXG4iKTsKKwkJYnJlYWs7CisJfTsKKwljb3B5X2luZm8oJmluZm8sICJcdExpdmUgVGFyZ2V0c1x0XHRbICIpOworCWZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSB7CisJCWlmIChlc3AtPnRhcmdldHNfcHJlc2VudCAmICgxIDw8IGkpKQorCQkJY29weV9pbmZvKCZpbmZvLCAiJWQgIiwgaSk7CisJfQorCWNvcHlfaW5mbygmaW5mbywgIl1cblxuIik7CisJCisJLyogTm93IGRlc2NyaWJlIHRoZSBzdGF0ZSBvZiBlYWNoIGV4aXN0aW5nIHRhcmdldC4gKi8KKwljb3B5X2luZm8oJmluZm8sICJUYXJnZXQgI1x0Y29uZmlnM1x0XHRTeW5jIENhcGFiaWxpdGllc1x0RGlzY29ubmVjdFx0V2lkZVxuIik7CisKKwlzaG9zdF9mb3JfZWFjaF9kZXZpY2Uoc2RldiwgZXNwLT5laG9zdCkgeworCQlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IHNkZXYtPmhvc3RkYXRhOworCQl1aW50IGlkID0gc2Rldi0+aWQ7CisKKwkJaWYgKCEoZXNwLT50YXJnZXRzX3ByZXNlbnQgJiAoMSA8PCBpZCkpKQorCQkJY29udGludWU7CisKKwkJY29weV9pbmZvKCZpbmZvLCAiJWRcdFx0IiwgaWQpOworCQljb3B5X2luZm8oJmluZm8sICIlMDhseFx0IiwgZXNwLT5jb25maWczW2lkXSk7CisJCWNvcHlfaW5mbygmaW5mbywgIlslMDJseCwlMDJseF1cdFx0XHQiLAorCQkJZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0LAorCQkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kKTsKKwkJY29weV9pbmZvKCZpbmZvLCAiJXNcdFx0IiwKKwkJCWVzcF9kZXYtPmRpc2Nvbm5lY3QgPyAieWVzIiA6ICJubyIpOworCQljb3B5X2luZm8oJmluZm8sICIlc1xuIiwKKwkJCShlc3AtPmNvbmZpZzNbaWRdICYgRVNQX0NPTkZJRzNfRVdJREUpID8gInllcyIgOiAibm8iKTsKKwl9CisJcmV0dXJuIGluZm8ucG9zID4gaW5mby5vZmZzZXQ/IGluZm8ucG9zIC0gaW5mby5vZmZzZXQgOiAwOworfQorCisvKiBFU1AgcHJvYyBmaWxlc3lzdGVtIGNvZGUuICovCitzdGF0aWMgaW50IGVzcF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCSBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCit7CisJc3RydWN0IGVzcCAqZXNwOworCisJaWYgKGlub3V0KQorCQlyZXR1cm4gLUVJTlZBTDsgLyogbm90IHlldCAqLworCisJZm9yX2VhY2hfZXNwKGVzcCkgeworCQlpZiAoZXNwLT5laG9zdCA9PSBob3N0KQorCQkJYnJlYWs7CisJfQorCWlmICghZXNwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzdGFydCkKKwkJKnN0YXJ0ID0gYnVmZmVyOworCisJcmV0dXJuIGVzcF9ob3N0X2luZm8oZXNwLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKK30KKworc3RhdGljIHZvaWQgZXNwX2dldF9kbWFidWZzKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc3ApCit7CisJaWYgKHNwLT51c2Vfc2cgPT0gMCkgeworCQlzcC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBzcC0+cmVxdWVzdF9idWZmbGVuOworCQlzcC0+U0NwLmJ1ZmZlciA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgc3AtPnJlcXVlc3RfYnVmZmVyOworCQlzcC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSAwOworCQlpZiAoc3AtPnJlcXVlc3RfYnVmZmxlbikgeworCQkJc3AtPlNDcC5oYXZlX2RhdGFfaW4gPSBzYnVzX21hcF9zaW5nbGUoZXNwLT5zZGV2LCBzcC0+U0NwLmJ1ZmZlciwKKwkJCQkJCQkgICAgICAgc3AtPlNDcC50aGlzX3Jlc2lkdWFsLAorCQkJCQkJCSAgICAgICBzcC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQkJc3AtPlNDcC5wdHIgPSAoY2hhciAqKSAoKHVuc2lnbmVkIGxvbmcpc3AtPlNDcC5oYXZlX2RhdGFfaW4pOworCQl9IGVsc2UgeworCQkJc3AtPlNDcC5wdHIgPSBOVUxMOworCQl9CisJfSBlbHNlIHsKKwkJc3AtPlNDcC5idWZmZXIgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIHNwLT5idWZmZXI7CisJCXNwLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IHNidXNfbWFwX3NnKGVzcC0+c2RldiwKKwkJCQkJCSAgICAgICBzcC0+U0NwLmJ1ZmZlciwKKwkJCQkJCSAgICAgICBzcC0+dXNlX3NnLAorCQkJCQkJICAgICAgIHNwLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCXNwLT5TQ3AudGhpc19yZXNpZHVhbCA9IHNnX2RtYV9sZW4oc3AtPlNDcC5idWZmZXIpOworCQlzcC0+U0NwLnB0ciA9IChjaGFyICopICgodW5zaWduZWQgbG9uZylzZ19kbWFfYWRkcmVzcyhzcC0+U0NwLmJ1ZmZlcikpOworCX0KK30KKworc3RhdGljIHZvaWQgZXNwX3JlbGVhc2VfZG1hYnVmcyhzdHJ1Y3QgZXNwICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKnNwKQoreworCWlmIChzcC0+dXNlX3NnKSB7CisJCXNidXNfdW5tYXBfc2coZXNwLT5zZGV2LCBzcC0+YnVmZmVyLCBzcC0+dXNlX3NnLAorCQkJICAgICAgc3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwl9IGVsc2UgaWYgKHNwLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKKwkJc2J1c191bm1hcF9zaW5nbGUoZXNwLT5zZGV2LAorCQkJCSAgc3AtPlNDcC5oYXZlX2RhdGFfaW4sCisJCQkJICBzcC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCSAgc3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9yZXN0b3JlX3BvaW50ZXJzKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc3ApCit7CisJc3RydWN0IGVzcF9wb2ludGVycyAqZXAgPSAmZXNwLT5kYXRhX3BvaW50ZXJzW3NwLT5kZXZpY2UtPmlkXTsKKworCXNwLT5TQ3AucHRyID0gZXAtPnNhdmVkX3B0cjsKKwlzcC0+U0NwLmJ1ZmZlciA9IGVwLT5zYXZlZF9idWZmZXI7CisJc3AtPlNDcC50aGlzX3Jlc2lkdWFsID0gZXAtPnNhdmVkX3RoaXNfcmVzaWR1YWw7CisJc3AtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gZXAtPnNhdmVkX2J1ZmZlcnNfcmVzaWR1YWw7Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9zYXZlX3BvaW50ZXJzKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc3ApCit7CisJc3RydWN0IGVzcF9wb2ludGVycyAqZXAgPSAmZXNwLT5kYXRhX3BvaW50ZXJzW3NwLT5kZXZpY2UtPmlkXTsKKworCWVwLT5zYXZlZF9wdHIgPSBzcC0+U0NwLnB0cjsKKwllcC0+c2F2ZWRfYnVmZmVyID0gc3AtPlNDcC5idWZmZXI7CisJZXAtPnNhdmVkX3RoaXNfcmVzaWR1YWwgPSBzcC0+U0NwLnRoaXNfcmVzaWR1YWw7CisJZXAtPnNhdmVkX2J1ZmZlcnNfcmVzaWR1YWwgPSBzcC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw7Cit9CisKKy8qIFNvbWUgcnVsZXM6CisgKgorICogICAxKSBOZXZlciBldmVyIHBhbmljIHdoaWxlIHNvbWV0aGluZyBpcyBsaXZlIG9uIHRoZSBidXMuCisgKiAgICAgIElmIHRoZXJlIGlzIHRvIGJlIGFueSBjaGFuY2Ugb2Ygc3luY2luZyB0aGUgZGlza3MgdGhpcworICogICAgICBydWxlIGlzIHRvIGJlIG9iZXllZC4KKyAqCisgKiAgIDIpIEFueSB0YXJnZXQgdGhhdCBjYXVzZXMgYSBmb3VsIGNvbmRpdGlvbiB3aWxsIG5vIGxvbmdlcgorICogICAgICBoYXZlIHN5bmNocm9ub3VzIHRyYW5zZmVycyBkb25lIHRvIGl0LCBubyBxdWVzdGlvbnMKKyAqICAgICAgYXNrZWQuCisgKgorICogICAzKSBLZWVwIHJlZ2lzdGVyIGFjY2Vzc2VzIHRvIGEgbWluaW11bS4gIFRoaW5rIGFib3V0IHNvbWUKKyAqICAgICAgZGF5IHdoZW4gd2UgaGF2ZSBYYnVzIG1hY2hpbmVzIHRoaXMgaXMgcnVubmluZyBvbiBhbmQKKyAqICAgICAgdGhlIEVTUCBjaGlwIGlzIG9uIHRoZSBvdGhlciBlbmQgb2YgdGhlIG1hY2hpbmUgb24gYQorICogICAgICBkaWZmZXJlbnQgYm9hcmQgZnJvbSB0aGUgY3B1IHdoZXJlIHRoaXMgaXMgcnVubmluZy4KKyAqLworCisvKiBGaXJlIG9mZiBhIGNvbW1hbmQuICBXZSBhc3N1bWUgdGhlIGJ1cyBpcyBmcmVlIGFuZCB0aGF0IHRoZSBvbmx5CisgKiBjYXNlIHdoZXJlIHdlIGNvdWxkIHNlZSBhbiBpbnRlcnJ1cHQgaXMgd2hlcmUgd2UgaGF2ZSBkaXNjb25uZWN0ZWQKKyAqIGNvbW1hbmRzIGFjdGl2ZSBhbmQgdGhleSBhcmUgdHJ5aW5nIHRvIHJlc2VsZWN0IHVzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZXNwX2NoZWNrX2NtZChzdHJ1Y3QgZXNwICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKnNwKQoreworCXN3aXRjaCAoc3AtPmNtZF9sZW4pIHsKKwljYXNlIDY6CisJY2FzZSAxMDoKKwljYXNlIDEyOgorCQllc3AtPmVzcF9zbG93Y21kID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllc3AtPmVzcF9zbG93Y21kID0gMTsKKwkJZXNwLT5lc3Bfc2NtZGxlZnQgPSBzcC0+Y21kX2xlbjsKKwkJZXNwLT5lc3Bfc2NtZHAgPSAmc3AtPmNtbmRbMF07CisJCWJyZWFrOworCX07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidWlsZF9zeW5jX25lZ29fbXNnKHN0cnVjdCBlc3AgKmVzcCwgaW50IHBlcmlvZCwgaW50IG9mZnNldCkKK3sKKwllc3AtPmN1cl9tc2dvdXRbMF0gPSBFWFRFTkRFRF9NRVNTQUdFOworCWVzcC0+Y3VyX21zZ291dFsxXSA9IDM7CisJZXNwLT5jdXJfbXNnb3V0WzJdID0gRVhURU5ERURfU0RUUjsKKwllc3AtPmN1cl9tc2dvdXRbM10gPSBwZXJpb2Q7CisJZXNwLT5jdXJfbXNnb3V0WzRdID0gb2Zmc2V0OworCWVzcC0+bXNnb3V0X2xlbiA9IDU7Cit9CisKKy8qIFNJWkUgaXMgaW4gYml0cywgY3VycmVudGx5IEhNRSBvbmx5IHN1cHBvcnRzIDE2IGJpdCB3aWRlIHRyYW5zZmVycy4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBidWlsZF93aWRlX25lZ29fbXNnKHN0cnVjdCBlc3AgKmVzcCwgaW50IHNpemUpCit7CisJZXNwLT5jdXJfbXNnb3V0WzBdID0gRVhURU5ERURfTUVTU0FHRTsKKwllc3AtPmN1cl9tc2dvdXRbMV0gPSAyOworCWVzcC0+Y3VyX21zZ291dFsyXSA9IEVYVEVOREVEX1dEVFI7CisJc3dpdGNoIChzaXplKSB7CisJY2FzZSAzMjoKKwkJZXNwLT5jdXJfbXNnb3V0WzNdID0gMjsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJZXNwLT5jdXJfbXNnb3V0WzNdID0gMTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCWRlZmF1bHQ6CisJCWVzcC0+Y3VyX21zZ291dFszXSA9IDA7CisJCWJyZWFrOworCX07CisKKwllc3AtPm1zZ291dF9sZW4gPSA0OworfQorCitzdGF0aWMgdm9pZCBlc3BfZXhlY19jbWQoc3RydWN0IGVzcCAqZXNwKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKlNDcHRyOworCXN0cnVjdCBzY3NpX2RldmljZSAqU0RwdHI7CisJc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXY7CisJdm9sYXRpbGUgdTggKmNtZHAgPSBlc3AtPmVzcF9jb21tYW5kOworCXU4IHRoZV9lc3BfY29tbWFuZDsKKwlpbnQgbHVuLCB0YXJnZXQ7CisJaW50IGk7CisKKwkvKiBIb2xkIG9mZiBpZiB3ZSBoYXZlIGRpc2Nvbm5lY3RlZCBjb21tYW5kcyBhbmQKKwkgKiBhbiBJUlEgaXMgc2hvd2luZy4uLgorCSAqLworCWlmIChlc3AtPmRpc2Nvbm5lY3RlZF9TQyAmJiBFU1BfSVJRX1AoZXNwLT5kcmVncykpCisJCXJldHVybjsKKworCS8qIEdyYWIgZmlyc3QgbWVtYmVyIG9mIHRoZSBpc3N1ZSBxdWV1ZS4gKi8KKwlTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQyA9IHJlbW92ZV9maXJzdF9TQygmZXNwLT5pc3N1ZV9TQyk7CisKKwkvKiBTYWZlIHRvIHBhbmljIGhlcmUgYmVjYXVzZSBjdXJyZW50X1NDIGlzIG51bGwuICovCisJaWYgKCFTQ3B0cikKKwkJcGFuaWMoImVzcDogZXNwX2V4ZWNfY21kIGFuZCBpc3N1ZSBxdWV1ZSBpcyBOVUxMIik7CisKKwlTRHB0ciA9IFNDcHRyLT5kZXZpY2U7CisJZXNwX2RldiA9IFNEcHRyLT5ob3N0ZGF0YTsKKwlsdW4gPSBTQ3B0ci0+ZGV2aWNlLT5sdW47CisJdGFyZ2V0ID0gU0NwdHItPmRldmljZS0+aWQ7CisKKwllc3AtPnNuaXAgPSAwOworCWVzcC0+bXNnb3V0X2xlbiA9IDA7CisKKwkvKiBTZW5kIGl0IG91dCB3aG9sZSwgb3IgcGllY2UgYnkgcGllY2U/ICAgVGhlIEVTUAorCSAqIG9ubHkga25vd3MgaG93IHRvIGF1dG9tYXRpY2FsbHkgc2VuZCBvdXQgNiwgMTAsCisJICogYW5kIDEyIGJ5dGUgY29tbWFuZHMuICBJIHVzZWQgdG8gdGhpbmsgdGhhdCB0aGUKKwkgKiBMaW51eCBTQ1NJIGNvZGUgd291bGQgbmV2ZXIgdGhyb3cgYW55dGhpbmcgb3RoZXIKKwkgKiB0aGFuIHRoYXQgdG8gdXMsIGJ1dCB0aGVuIGFnYWluIHRoZXJlIGlzIHRoZQorCSAqIFNDU0kgZ2VuZXJpYyBkcml2ZXIgd2hpY2ggY2FuIHNlbmQgdXMgYW55dGhpbmcuCisJICovCisJZXNwX2NoZWNrX2NtZChlc3AsIFNDcHRyKTsKKworCS8qIElmIGFyYml0cmF0aW9uL3NlbGVjdGlvbiBpcyBzdWNjZXNzZnVsLCB0aGUgRVNQIHdpbGwgbGVhdmUKKwkgKiBBVE4gYXNzZXJ0ZWQsIGNhdXNpbmcgdGhlIHRhcmdldCB0byBnbyBpbnRvIG1lc3NhZ2Ugb3V0CisJICogcGhhc2UuICBUaGUgRVNQIHdpbGwgZmVlZCB0aGUgdGFyZ2V0IHRoZSBpZGVudGlmeSBhbmQgdGhlbgorCSAqIHRoZSB0YXJnZXQgY2FuIG9ubHkgbGVnYWxseSBnbyB0byBvbmUgb2YgY29tbWFuZCwKKwkgKiBkYXRhaW4vb3V0LCBzdGF0dXMsIG9yIG1lc3NhZ2UgaW4gcGhhc2UsIG9yIHN0YXkgaW4gbWVzc2FnZQorCSAqIG91dCBwaGFzZSAoc2hvdWxkIHdlIGJlIHRyeWluZyB0byBzZW5kIGEgc3luYyBuZWdvdGlhdGlvbgorCSAqIG1lc3NhZ2UgYWZ0ZXIgdGhlIGlkZW50aWZ5KS4gIEl0IGlzIG5vdCBhbGxvd2VkIHRvIGRyb3AKKwkgKiBCU1ksIGJ1dCBzb21lIGJ1Z2d5IHRhcmdldHMgZG8gYW5kIHdlIGNoZWNrIGZvciB0aGlzCisJICogY29uZGl0aW9uIGluIHRoZSBzZWxlY3Rpb24gY29tcGxldGUgY29kZS4gIE1vc3Qgb2YgdGhlIHRpbWUKKwkgKiB3ZSdsbCBtYWtlIHRoZSBjb21tYW5kIGJ5dGVzIGF2YWlsYWJsZSB0byB0aGUgRVNQIGFuZCBpdAorCSAqIHdpbGwgbm90IGludGVycnVwdCB1cyB1bnRpbCBpdCBmaW5pc2hlcyBjb21tYW5kIHBoYXNlLCB3ZQorCSAqIGNhbm5vdCBkbyB0aGlzIGZvciBjb21tYW5kIHNpemVzIHRoZSBFU1AgZG9lcyBub3QKKwkgKiB1bmRlcnN0YW5kIGFuZCBpbiB0aGlzIGNhc2Ugd2UnbGwgZ2V0IGludGVycnVwdGVkIHJpZ2h0CisJICogd2hlbiB0aGUgdGFyZ2V0IGdvZXMgaW50byBjb21tYW5kIHBoYXNlLgorCSAqCisJICogSXQgaXMgYWJzb2x1dGVseSBfaWxsZWdhbF8gaW4gdGhlIHByZXNlbmNlIG9mIFNDU0ktMiBkZXZpY2VzCisJICogdG8gdXNlIHRoZSBFU1Agc2VsZWN0IHcvbyBBVE4gY29tbWFuZC4gIFdoZW4gU0NTSS0yIGRldmljZXMgYXJlCisJICogcHJlc2VudCBvbiB0aGUgYnVzIHdlIF9tdXN0XyBhbHdheXMgZ28gc3RyYWlnaHQgdG8gbWVzc2FnZSBvdXQKKwkgKiBwaGFzZSB3aXRoIGFuIGlkZW50aWZ5IG1lc3NhZ2UgZm9yIHRoZSB0YXJnZXQuICBCZWluZyB0aGF0CisJICogc2VsZWN0aW9uIGF0dGVtcHRzIGluIFNDU0ktMSB3L28gQVROIHdhcyBhbiBvcHRpb24sIGRvaW5nIFNDU0ktMgorCSAqIHNlbGVjdGlvbnMgc2hvdWxkIG5vdCBjb25mdXNlIFNDU0ktMSB3ZSBob3BlLgorCSAqLworCisJaWYgKGVzcF9kZXYtPnN5bmMpIHsKKwkJLyogdGhpcyB0YXJnZXRzIHN5bmMgaXMga25vd24gKi8KKyNpZm5kZWYgX19zcGFyY192OV9fCitkb19zeW5jX2tub3duOgorI2VuZGlmCisJCWlmIChlc3BfZGV2LT5kaXNjb25uZWN0KQorCQkJKmNtZHArKyA9IElERU5USUZZKDEsIGx1bik7CisJCWVsc2UKKwkJCSpjbWRwKysgPSBJREVOVElGWSgwLCBsdW4pOworCisJCWlmIChlc3AtPmVzcF9zbG93Y21kKSB7CisJCQl0aGVfZXNwX2NvbW1hbmQgPSAoRVNQX0NNRF9TRUxBUyB8IEVTUF9DTURfRE1BKTsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9zbGN0X3N0b3ApOworCQl9IGVsc2UgeworCQkJdGhlX2VzcF9jb21tYW5kID0gKEVTUF9DTURfU0VMQSB8IEVTUF9DTURfRE1BKTsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9zbGN0X25vcm0pOworCQl9CisJfSBlbHNlIGlmICghKGVzcC0+dGFyZ2V0c19wcmVzZW50ICYgKDE8PHRhcmdldCkpIHx8ICEoZXNwX2Rldi0+ZGlzY29ubmVjdCkpIHsKKwkJLyogQWZ0ZXIgdGhlIGJvb3R1cCBTQ1NJIGNvZGUgc2VuZHMgYm90aCB0aGUKKwkJICogVEVTVF9VTklUX1JFQURZIGFuZCBJTlFVSVJZIGNvbW1hbmRzIHdlIHdhbnQKKwkJICogdG8gYXQgbGVhc3QgYXR0ZW1wdCBhbGxvd2luZyB0aGUgZGV2aWNlIHRvCisJCSAqIGRpc2Nvbm5lY3QuCisJCSAqLworCQlFU1BNSVNDKCgiZXNwOiBTZWxlY3RpbmcgZGV2aWNlIGZvciBmaXJzdCB0aW1lLiB0YXJnZXQ9JWQgIgorCQkJICJsdW49JWRcbiIsIHRhcmdldCwgU0NwdHItPmRldmljZS0+bHVuKSk7CisJCWlmICghU0RwdHItPmJvcmtlbiAmJiAhZXNwX2Rldi0+ZGlzY29ubmVjdCkKKwkJCWVzcF9kZXYtPmRpc2Nvbm5lY3QgPSAxOworCisJCSpjbWRwKysgPSBJREVOVElGWSgwLCBsdW4pOworCQllc3AtPnByZXZtc2dvdXQgPSBOT1A7CisJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9zbGN0X25vcm0pOworCQl0aGVfZXNwX2NvbW1hbmQgPSAoRVNQX0NNRF9TRUxBIHwgRVNQX0NNRF9ETUEpOworCisJCS8qIFRha2Ugbm8gY2hhbmNlcy4uLiAqLworCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgPSAwOworCQllc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgPSAwOworCX0gZWxzZSB7CisJCS8qIFNvcnJ5LCBJIGhhdmUgaGFkIHdheSB0b28gbWFueSBwcm9ibGVtcyB3aXRoCisJCSAqIHZhcmlvdXMgQ0RST00gZGV2aWNlcyBvbiBFU1AuIC1EYXZlTQorCQkgKi8KKwkJaW50IGNkcm9tX2h3YnVnX3drYXJvdW5kID0gMDsKKworI2lmbmRlZiBfX3NwYXJjX3Y5X18KKwkJLyogTmV2ZXIgYWxsb3cgZGlzY29ubmVjdHMgb3Igc3luY2hyb25vdXMgdHJhbnNmZXJzIG9uCisJCSAqIFNwYXJjU3RhdGlvbjEgYW5kIFNwYXJjU3RhdGlvbjErLiAgQWxsb3dpbmcgdGhvc2UKKwkJICogdG8gYmUgZW5hYmxlZCBzZWVtcyB0byBsb2NrdXAgdGhlIG1hY2hpbmUgY29tcGxldGVseS4KKwkJICovCisJCWlmICgoaWRwcm9tLT5pZF9tYWNodHlwZSA9PSAoU01fU1VONEMgfCBTTV80Q19TUzEpKSB8fAorCQkgICAgKGlkcHJvbS0+aWRfbWFjaHR5cGUgPT0gKFNNX1NVTjRDIHwgU01fNENfU1MxUExVUykpKSB7CisJCQkvKiBCdXQgd2UgYXJlIG5pY2UgYW5kIGFsbG93IHRhcGVzIGFuZCByZW1vdmFibGUKKwkJCSAqIGRpc2tzIChidXQgbm90IENEUk9NcykgdG8gZGlzY29ubmVjdC4KKwkJCSAqLworCQkJaWYoU0RwdHItPnR5cGUgPT0gVFlQRV9UQVBFIHx8CisJCQkgICAoU0RwdHItPnR5cGUgIT0gVFlQRV9ST00gJiYgU0RwdHItPnJlbW92YWJsZSkpCisJCQkJZXNwX2Rldi0+ZGlzY29ubmVjdCA9IDE7CisJCQllbHNlCisJCQkJZXNwX2Rldi0+ZGlzY29ubmVjdCA9IDA7CisJCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgPSAwOworCQkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gMDsKKwkJCWVzcF9kZXYtPnN5bmMgPSAxOworCQkJZXNwLT5zbmlwID0gMDsKKwkJCWdvdG8gZG9fc3luY19rbm93bjsKKwkJfQorI2VuZGlmIC8qICEoX19zcGFyY192OV9fKSAqLworCisJCS8qIFdlJ3ZlIHRhbGtlZCB0byB0aGlzIGd1eSBiZWZvcmUsCisJCSAqIGJ1dCBuZXZlciBuZWdvdGlhdGVkLiAgTGV0J3MgdHJ5LAorCQkgKiBuZWVkIHRvIGF0dGVtcHQgV0lERSBmaXJzdCwgYmVmb3JlCisJCSAqIHN5bmMgbmVnbywgYXMgcGVyIFNDU0kgMiBzdGFuZGFyZC4KKwkJICovCisJCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lICYmICFlc3BfZGV2LT53aWRlKSB7CisJCQlpZiAoIVNEcHRyLT5ib3JrZW4gJiYKKwkJCSAgIFNEcHRyLT50eXBlICE9IFRZUEVfUk9NICYmCisJCQkgICBTRHB0ci0+cmVtb3ZhYmxlID09IDApIHsKKwkJCQlidWlsZF93aWRlX25lZ29fbXNnKGVzcCwgMTYpOworCQkJCWVzcF9kZXYtPndpZGUgPSAxOworCQkJCWVzcC0+d25pcCA9IDE7CisJCQkJZ290byBhZnRlcl9uZWdvX21zZ19idWlsdDsKKwkJCX0gZWxzZSB7CisJCQkJZXNwX2Rldi0+d2lkZSA9IDE7CisJCQkJLyogRmFsbCB0aHJvdWdoIGFuZCB0cnkgc3luYy4gKi8KKwkJCX0KKwkJfQorCisJCWlmICghU0RwdHItPmJvcmtlbikgeworCQkJaWYgKChTRHB0ci0+dHlwZSA9PSBUWVBFX1JPTSkpIHsKKwkJCQkvKiBOaWNlIHRyeSBzdWNrZXIuLi4gKi8KKwkJCQlFU1BNSVNDKCgiZXNwJWQ6IERpc2FibGluZyBzeW5jIGZvciBidWdneSAiCisJCQkJCSAiQ0RST00uXG4iLCBlc3AtPmVzcF9pZCkpOworCQkJCWNkcm9tX2h3YnVnX3drYXJvdW5kID0gMTsKKwkJCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgMCwgMCk7CisJCQl9IGVsc2UgaWYgKFNEcHRyLT5yZW1vdmFibGUgIT0gMCkgeworCQkJCUVTUE1JU0MoKCJlc3AlZDogTm90IG5lZ290aWF0aW5nIHN5bmMvd2lkZSBidXQgIgorCQkJCQkgImFsbG93aW5nIGRpc2Nvbm5lY3QgZm9yIHJlbW92YWJsZSBtZWRpYS5cbiIsCisJCQkJCSBlc3AtPmVzcF9pZCkpOworCQkJCWJ1aWxkX3N5bmNfbmVnb19tc2coZXNwLCAwLCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJYnVpbGRfc3luY19uZWdvX21zZyhlc3AsIGVzcC0+c3luY19kZWZwLCAxNSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgMCwgMCk7CisJCX0KKwkJZXNwX2Rldi0+c3luYyA9IDE7CisJCWVzcC0+c25pcCA9IDE7CisKK2FmdGVyX25lZ29fbXNnX2J1aWx0OgorCQkvKiBBIGZpeCBmb3IgYnJva2VuIFNDU0kxIHRhcmdldHMsIHdoZW4gdGhleSBkaXNjb25uZWN0CisJCSAqIHRoZXkgbG9jayB1cCB0aGUgYnVzIGFuZCBjb25mdXNlIEVTUC4gIFNvIGRpc2FsbG93CisJCSAqIGRpc2Nvbm5lY3RzIGZvciBTQ1NJMSB0YXJnZXRzIGZvciBub3cgdW50aWwgd2UKKwkJICogZmluZCBhIGJldHRlciBmaXguCisJCSAqCisJCSAqIEFkZGVuZHVtOiBUaGlzIGlzIGZ1bm55LCBJIGZpZ3VyZWQgb3V0IHdoYXQgd2FzIGdvaW5nCisJCSAqICAgICAgICAgICBvbi4gIFRoZSBibG90emVkIFNDU0kxIHRhcmdldCB3b3VsZCBkaXNjb25uZWN0LAorCQkgKiAgICAgICAgICAgb25lIG9mIHRoZSBvdGhlciBTQ1NJMiB0YXJnZXRzIG9yIGJvdGggd291bGQgYmUKKwkJICogICAgICAgICAgIGRpc2Nvbm5lY3RlZCBhcyB3ZWxsLiAgVGhlIFNDU0kxIHRhcmdldCB3b3VsZAorCQkgKiAgICAgICAgICAgc3RheSBkaXNjb25uZWN0ZWQgbG9uZyBlbm91Z2ggdGhhdCB3ZSBzdGFydAorCQkgKiAgICAgICAgICAgdXAgYSBjb21tYW5kIG9uIG9uZSBvZiB0aGUgU0NTSTIgdGFyZ2V0cy4gIEFzCisJCSAqICAgICAgICAgICB0aGUgRVNQIGlzIGFyYml0cmF0aW5nIGZvciB0aGUgYnVzIHRoZSBTQ1NJMQorCQkgKiAgICAgICAgICAgdGFyZ2V0IGJlZ2lucyB0byBhcmJpdHJhdGUgYXMgd2VsbCB0byByZXNlbGVjdAorCQkgKiAgICAgICAgICAgdGhlIEVTUC4gIFRoZSBTQ1NJMSB0YXJnZXQgcmVmdXNlcyB0byBkcm9wIGl0J3MKKwkJICogICAgICAgICAgIElEIGJpdCBvbiB0aGUgZGF0YSBidXMgZXZlbiB0aG91Z2ggdGhlIEVTUCBpcworCQkgKiAgICAgICAgICAgYXQgSUQgNyBhbmQgaXMgdGhlIG9idmlvdXMgd2lubmVyIGZvciBhbnkKKwkJICogICAgICAgICAgIGFyYml0cmF0aW9uLiAgVGhlIEVTUCBpcyBhIHBvb3Igc3BvcnQgYW5kIHJlZnVzZXMKKwkJICogICAgICAgICAgIHRvIGxvc2UgYXJiaXRyYXRpb24sIGl0IHdpbGwgY29udGludWUgaW5kZWZpbml0ZWx5CisJCSAqICAgICAgICAgICB0cnlpbmcgdG8gYXJiaXRyYXRlIGZvciB0aGUgYnVzIGFuZCBjYW4gb25seSBiZQorCQkgKiAgICAgICAgICAgc3RvcHBlZCB2aWEgYSBjaGlwIHJlc2V0IG9yIFNDU0kgYnVzIHJlc2V0LgorCQkgKiAgICAgICAgICAgVGhlcmVmb3JlIF9ub18gZGlzY29ubmVjdHMgZm9yIFNDU0kxIHRhcmdldHMKKwkJICogICAgICAgICAgIHRoYW5rIHlvdSB2ZXJ5IG11Y2guIDstKQorCQkgKi8KKwkJaWYoKChTRHB0ci0+c2NzaV9sZXZlbCA8IDMpICYmCisJCSAgICAoU0RwdHItPnR5cGUgIT0gVFlQRV9UQVBFKSAmJgorCQkgICAgU0RwdHItPnJlbW92YWJsZSA9PSAwKSB8fAorCQkgICAgY2Ryb21faHdidWdfd2thcm91bmQgfHwgU0RwdHItPmJvcmtlbikgeworCQkJRVNQTUlTQygoS0VSTl9JTkZPICJlc3AlZDogRGlzYWJsaW5nIERJU0NPTk5FQ1QgZm9yIHRhcmdldCAlZCAiCisJCQkJICJsdW4gJWRcbiIsIGVzcC0+ZXNwX2lkLCBTQ3B0ci0+ZGV2aWNlLT5pZCwgU0NwdHItPmRldmljZS0+bHVuKSk7CisJCQllc3BfZGV2LT5kaXNjb25uZWN0ID0gMDsKKwkJCSpjbWRwKysgPSBJREVOVElGWSgwLCBsdW4pOworCQl9IGVsc2UgeworCQkJKmNtZHArKyA9IElERU5USUZZKDEsIGx1bik7CisJCX0KKworCQkvKiBFU1AgZmlmbyBpcyBvbmx5IHNvIGJpZy4uLgorCQkgKiBNYWtlIHRoaXMgbG9vayBsaWtlIGEgc2xvdyBjb21tYW5kLgorCQkgKi8KKwkJZXNwLT5lc3Bfc2xvd2NtZCA9IDE7CisJCWVzcC0+ZXNwX3NjbWRsZWZ0ID0gU0NwdHItPmNtZF9sZW47CisJCWVzcC0+ZXNwX3NjbWRwID0gJlNDcHRyLT5jbW5kWzBdOworCisJCXRoZV9lc3BfY29tbWFuZCA9IChFU1BfQ01EX1NFTEFTIHwgRVNQX0NNRF9ETUEpOworCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fc2xjdF9tc2cpOworCX0KKworCWlmICghZXNwLT5lc3Bfc2xvd2NtZCkKKwkJZm9yIChpID0gMDsgaSA8IFNDcHRyLT5jbWRfbGVuOyBpKyspCisJCQkqY21kcCsrID0gU0NwdHItPmNtbmRbaV07CisKKwkvKiBITUUgc3Vja3MuLi4gKi8KKwlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkKKwkJc2J1c193cml0ZWIoKHRhcmdldCAmIDB4ZikgfCAoRVNQX0JVU0lEX1JFU0VMSUQgfCBFU1BfQlVTSURfQ1RSMzJCSVQpLAorCQkJICAgIGVzcC0+ZXJlZ3MgKyBFU1BfQlVTSUQpOworCWVsc2UKKwkJc2J1c193cml0ZWIodGFyZ2V0ICYgNywgZXNwLT5lcmVncyArIEVTUF9CVVNJRCk7CisJaWYgKGVzcC0+cHJldl9zb2ZmICE9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCB8fAorCSAgICBlc3AtPnByZXZfc3RwICAhPSBlc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgfHwKKwkgICAgKGVzcC0+ZXJldiA+IGVzcDEwMGEgJiYKKwkgICAgIGVzcC0+cHJldl9jZmczICE9IGVzcC0+Y29uZmlnM1t0YXJnZXRdKSkgeworCQllc3AtPnByZXZfc29mZiA9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldDsKKwkJZXNwLT5wcmV2X3N0cCA9IGVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZDsKKwkJc2J1c193cml0ZWIoZXNwLT5wcmV2X3NvZmYsIGVzcC0+ZXJlZ3MgKyBFU1BfU09GRik7CisJCXNidXNfd3JpdGViKGVzcC0+cHJldl9zdHAsIGVzcC0+ZXJlZ3MgKyBFU1BfU1RQKTsKKwkJaWYgKGVzcC0+ZXJldiA+IGVzcDEwMGEpIHsKKwkJCWVzcC0+cHJldl9jZmczID0gZXNwLT5jb25maWczW3RhcmdldF07CisJCQlzYnVzX3dyaXRlYihlc3AtPnByZXZfY2ZnMywgZXNwLT5lcmVncyArIEVTUF9DRkczKTsKKwkJfQorCX0KKwlpID0gKGNtZHAgLSBlc3AtPmVzcF9jb21tYW5kKTsKKworCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKSB7CisJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsgLyogR3JyciEgKi8KKworCQkvKiBTZXQgdXAgdGhlIERNQSBhbmQgSE1FIGNvdW50ZXJzICovCisJCXNidXNfd3JpdGViKGksIGVzcC0+ZXJlZ3MgKyBFU1BfVENMT1cpOworCQlzYnVzX3dyaXRlYigwLCBlc3AtPmVyZWdzICsgRVNQX1RDTUVEKTsKKwkJc2J1c193cml0ZWIoMCwgZXNwLT5lcmVncyArIEZBU19STE8pOworCQlzYnVzX3dyaXRlYigwLCBlc3AtPmVyZWdzICsgRkFTX1JISSk7CisJCWVzcF9jbWQoZXNwLCB0aGVfZXNwX2NvbW1hbmQpOworCisJCS8qIFRhbGsgYWJvdXQgdG91Y2h5IGhhcmR3YXJlLi4uICovCisJCWVzcC0+cHJldl9obWVfZG1hY3NyID0gKChlc3AtPnByZXZfaG1lX2RtYWNzciB8CisJCQkJCSAoRE1BX1NDU0lfRElTQUIgfCBETUFfRU5BQkxFKSkgJgorCQkJCQl+KERNQV9TVF9XUklURSkpOworCQlzYnVzX3dyaXRlbCgxNiwgZXNwLT5kcmVncyArIERNQV9DT1VOVCk7CisJCXNidXNfd3JpdGVsKGVzcC0+ZXNwX2NvbW1hbmRfZHZtYSwgZXNwLT5kcmVncyArIERNQV9BRERSKTsKKwkJc2J1c193cml0ZWwoZXNwLT5wcmV2X2htZV9kbWFjc3IsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwl9IGVsc2UgeworCQl1MzIgdG1wOworCisJCS8qIFNldCB1cCB0aGUgRE1BIGFuZCBFU1AgY291bnRlcnMgKi8KKwkJc2J1c193cml0ZWIoaSwgZXNwLT5lcmVncyArIEVTUF9UQ0xPVyk7CisJCXNidXNfd3JpdGViKDAsIGVzcC0+ZXJlZ3MgKyBFU1BfVENNRUQpOworCQl0bXAgPSBzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwkJdG1wICY9IH5ETUFfU1RfV1JJVEU7CisJCXRtcCB8PSBETUFfRU5BQkxFOworCQlzYnVzX3dyaXRlbCh0bXAsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwkJaWYgKGVzcC0+ZG1hLT5yZXZpc2lvbiA9PSBkdm1hZXNjMSkgeworCQkJaWYgKGkpIC8qIFdvcmthcm91bmQgRVNDIGdhdGUgYXJyYXkgU0JVUyByZXJ1biBidWcuICovCisJCQkJc2J1c193cml0ZWwoUEFHRV9TSVpFLCBlc3AtPmRyZWdzICsgRE1BX0NPVU5UKTsKKwkJfQorCQlzYnVzX3dyaXRlbChlc3AtPmVzcF9jb21tYW5kX2R2bWEsIGVzcC0+ZHJlZ3MgKyBETUFfQUREUik7CisKKwkJLyogVGVsbCBFU1AgdG8gImdvIi4gKi8KKwkJZXNwX2NtZChlc3AsIHRoZV9lc3BfY29tbWFuZCk7CisJfQorfQorCisvKiBRdWV1ZSBhIFNDU0kgY29tbWFuZCBkZWxpdmVyZWQgZnJvbSB0aGUgbWlkLWxldmVsIExpbnV4IFNDU0kgY29kZS4gKi8KK3N0YXRpYyBpbnQgZXNwX3F1ZXVlKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgZXNwICplc3A7CisKKwkvKiBTZXQgdXAgZnVuYyBwdHIgYW5kIGluaXRpYWwgZHJpdmVyIGNtZC1waGFzZS4gKi8KKwlTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKKwlTQ3BudC0+U0NwLnBoYXNlID0gbm90X2lzc3VlZDsKKworCS8qIFdlIHVzZSB0aGUgc2NyYXRjaCBhcmVhLiAqLworCUVTUFFVRVVFKCgiZXNwX3F1ZXVlOiB0YXJnZXQ9JWQgbHVuPSVkICIsIFNDcG50LT5kZXZpY2UtPmlkLCBTQ3BudC0+ZGV2aWNlLT5sdW4pKTsKKwlFU1BESVNDKCgiTjwlMDJ4LCUwMng+IiwgU0NwbnQtPmRldmljZS0+aWQsIFNDcG50LT5kZXZpY2UtPmx1bikpOworCisJZXNwID0gKHN0cnVjdCBlc3AgKikgU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJZXNwX2dldF9kbWFidWZzKGVzcCwgU0NwbnQpOworCWVzcF9zYXZlX3BvaW50ZXJzKGVzcCwgU0NwbnQpOyAvKiBGSVhNRSBmb3IgdGFnIHF1ZXVlaW5nICovCisKKwlTQ3BudC0+U0NwLlN0YXR1cyAgICAgICAgICAgPSBDSEVDS19DT05ESVRJT047CisJU0NwbnQtPlNDcC5NZXNzYWdlICAgICAgICAgID0gMHhmZjsKKwlTQ3BudC0+U0NwLnNlbnRfY29tbWFuZCAgICAgPSAwOworCisJLyogUGxhY2UgaW50byBvdXIgcXVldWUuICovCisJaWYgKFNDcG50LT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpIHsKKwkJRVNQUVVFVUUoKCJSUVNFTlNFXG4iKSk7CisJCXByZXBlbmRfU0MoJmVzcC0+aXNzdWVfU0MsIFNDcG50KTsKKwl9IGVsc2UgeworCQlFU1BRVUVVRSgoIlxuIikpOworCQlhcHBlbmRfU0MoJmVzcC0+aXNzdWVfU0MsIFNDcG50KTsKKwl9CisKKwkvKiBSdW4gaXQgbm93IGlmIHdlIGNhbi4gKi8KKwlpZiAoIWVzcC0+Y3VycmVudF9TQyAmJiAhZXNwLT5yZXNldHRpbmdfYnVzKQorCQllc3BfZXhlY19jbWQoZXNwKTsKKworCXJldHVybiAwOworfQorCisvKiBEdW1wIGRyaXZlciBzdGF0ZS4gKi8KK3N0YXRpYyB2b2lkIGVzcF9kdW1wX2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3B0cikKK3sKKwlFU1BMT0coKCJbdGd0PCUwMng+IGx1bjwlMDJ4PiAiCisJCSJwcGhhc2U8JXM+IGNwaGFzZTwlcz5dIiwKKwkJU0NwdHItPmRldmljZS0+aWQsIFNDcHRyLT5kZXZpY2UtPmx1biwKKwkJcGhhc2Vfc3RyaW5nKFNDcHRyLT5TQ3Auc2VudF9jb21tYW5kKSwKKwkJcGhhc2Vfc3RyaW5nKFNDcHRyLT5TQ3AucGhhc2UpKSk7Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9kdW1wX3N0YXRlKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKKyNpZmRlZiBERUJVR19FU1BfQ01EUworCWludCBpOworI2VuZGlmCisKKwlFU1BMT0coKCJlc3AlZDogZHVtcGluZyBzdGF0ZVxuIiwgZXNwLT5lc3BfaWQpKTsKKwlFU1BMT0coKCJlc3AlZDogZG1hIC0tIGNvbmRfcmVnPCUwOHg+IGFkZHI8JTA4eD5cbiIsCisJCWVzcC0+ZXNwX2lkLAorCQlzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKSwKKwkJc2J1c19yZWFkbChlc3AtPmRyZWdzICsgRE1BX0FERFIpKSk7CisJRVNQTE9HKCgiZXNwJWQ6IFNXIFtzcmVnPCUwMng+IHNzdGVwPCUwMng+IGlyZWc8JTAyeD5dXG4iLAorCQllc3AtPmVzcF9pZCwgZXNwLT5zcmVnLCBlc3AtPnNlcXJlZywgZXNwLT5pcmVnKSk7CisJRVNQTE9HKCgiZXNwJWQ6IEhXIHJlcmVhZCBbc3JlZzwlMDJ4PiBzc3RlcDwlMDJ4PiBpcmVnPCUwMng+XVxuIiwKKwkJZXNwLT5lc3BfaWQsCisJCXNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9TVEFUVVMpLAorCQlzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfU1NURVApLAorCQlzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfSU5UUlBUKSkpOworI2lmZGVmIERFQlVHX0VTUF9DTURTCisJcHJpbnRrKCJlc3AlZDogbGFzdCBFU1AgY21kcyBbIiwgZXNwLT5lc3BfaWQpOworCWkgPSAoZXNwLT5lc3BjbWRlbnQgLSAxKSAmIDMxOworCXByaW50aygiPCIpOyBlc3BfcHJpbnRfY21kKGVzcC0+ZXNwY21kbG9nW2ldKTsgcHJpbnRrKCI+Iik7CisJaSA9IChpIC0gMSkgJiAzMTsKKwlwcmludGsoIjwiKTsgZXNwX3ByaW50X2NtZChlc3AtPmVzcGNtZGxvZ1tpXSk7IHByaW50aygiPiIpOworCWkgPSAoaSAtIDEpICYgMzE7CisJcHJpbnRrKCI8Iik7IGVzcF9wcmludF9jbWQoZXNwLT5lc3BjbWRsb2dbaV0pOyBwcmludGsoIj4iKTsKKwlpID0gKGkgLSAxKSAmIDMxOworCXByaW50aygiPCIpOyBlc3BfcHJpbnRfY21kKGVzcC0+ZXNwY21kbG9nW2ldKTsgcHJpbnRrKCI+Iik7CisJcHJpbnRrKCJdXG4iKTsKKyNlbmRpZiAvKiAoREVCVUdfRVNQX0NNRFMpICovCisKKwlpZiAoU0NwdHIpIHsKKwkJRVNQTE9HKCgiZXNwJWQ6IGN1cnJlbnQgY29tbWFuZCAiLCBlc3AtPmVzcF9pZCkpOworCQllc3BfZHVtcF9jbWQoU0NwdHIpOworCX0KKwlFU1BMT0coKCJcbiIpKTsKKwlTQ3B0ciA9IGVzcC0+ZGlzY29ubmVjdGVkX1NDOworCUVTUExPRygoImVzcCVkOiBkaXNjb25uZWN0ZWQgIiwgZXNwLT5lc3BfaWQpKTsKKwl3aGlsZSAoU0NwdHIpIHsKKwkJZXNwX2R1bXBfY21kKFNDcHRyKTsKKwkJU0NwdHIgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBTQ3B0ci0+aG9zdF9zY3JpYmJsZTsKKwl9CisJRVNQTE9HKCgiXG4iKSk7Cit9CisKKy8qIEFib3J0IGEgY29tbWFuZC4gIFRoZSBob3N0X2xvY2sgaXMgYWNxdWlyZWQgYnkgY2FsbGVyLiAqLworc3RhdGljIGludCBlc3BfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqU0NwdHIpCit7CisJc3RydWN0IGVzcCAqZXNwID0gKHN0cnVjdCBlc3AgKikgU0NwdHItPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJaW50IGRvbjsKKworCUVTUExPRygoImVzcCVkOiBBYm9ydGluZyBjb21tYW5kXG4iLCBlc3AtPmVzcF9pZCkpOworCWVzcF9kdW1wX3N0YXRlKGVzcCk7CisKKwkvKiBXaGVlZSwgaWYgdGhpcyBpcyB0aGUgY3VycmVudCBjb21tYW5kIG9uIHRoZSBidXMsIHRoZQorCSAqIGJlc3Qgd2UgY2FuIGRvIGlzIGFzc2VydCBBVE4gYW5kIHdhaXQgZm9yIG1zZ291dCBwaGFzZS4KKwkgKiBUaGlzIHNob3VsZCBldmVuIGZpeCBhIGh1bmcgU0NTSSBidXMgd2hlbiB3ZSBsb3NlIHN0YXRlCisJICogaW4gdGhlIGRyaXZlciBhbmQgdGltZW91dCBiZWNhdXNlIHRoZSBldmVudHVhbCBwaGFzZSBjaGFuZ2UKKwkgKiB3aWxsIGNhdXNlIHRoZSBFU1AgdG8gKGV2ZW50dWFsbHkpIGdpdmUgYW4gaW50ZXJydXB0LgorCSAqLworCWlmIChlc3AtPmN1cnJlbnRfU0MgPT0gU0NwdHIpIHsKKwkJZXNwLT5jdXJfbXNnb3V0WzBdID0gQUJPUlQ7CisJCWVzcC0+bXNnb3V0X2xlbiA9IDE7CisJCWVzcC0+bXNnb3V0X2N0ciA9IDA7CisJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX1NBVE4pOworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisKKwkvKiBJZiBpdCBpcyBzdGlsbCBpbiB0aGUgaXNzdWUgcXVldWUgdGhlbiB3ZSBjYW4gc2FmZWx5CisJICogY2FsbCB0aGUgY29tcGxldGlvbiByb3V0aW5lIGFuZCByZXBvcnQgYWJvcnQgc3VjY2Vzcy4KKwkgKi8KKwlkb24gPSAoc2J1c19yZWFkbChlc3AtPmRyZWdzICsgRE1BX0NTUikgJiBETUFfSU5UX0VOQUIpOworCWlmIChkb24pIHsKKwkJRVNQX0lOVFNPRkYoZXNwLT5kcmVncyk7CisJfQorCWlmIChlc3AtPmlzc3VlX1NDKSB7CisJCXN0cnVjdCBzY3NpX2NtbmQgKipwcmV2LCAqdGhpczsKKwkJZm9yIChwcmV2ID0gKCZlc3AtPmlzc3VlX1NDKSwgdGhpcyA9IGVzcC0+aXNzdWVfU0M7CisJCSAgICAgdGhpcyAhPSBOVUxMOworCQkgICAgIHByZXYgPSAoc3RydWN0IHNjc2lfY21uZCAqKikgJih0aGlzLT5ob3N0X3NjcmliYmxlKSwKKwkJCSAgICAgdGhpcyA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIHRoaXMtPmhvc3Rfc2NyaWJibGUpIHsKKworCQkJaWYgKHRoaXMgPT0gU0NwdHIpIHsKKwkJCQkqcHJldiA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIHRoaXMtPmhvc3Rfc2NyaWJibGU7CisJCQkJdGhpcy0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisKKwkJCQllc3BfcmVsZWFzZV9kbWFidWZzKGVzcCwgdGhpcyk7CisJCQkJdGhpcy0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworCQkJCXRoaXMtPnNjc2lfZG9uZSh0aGlzKTsKKworCQkJCWlmIChkb24pCisJCQkJCUVTUF9JTlRTT04oZXNwLT5kcmVncyk7CisKKwkJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJCX0KKwkJfQorCX0KKworCS8qIFl1Y2ssIHRoZSBjb21tYW5kIHRvIGFib3J0IGlzIGRpc2Nvbm5lY3RlZCwgaXQgaXMgbm90CisJICogd29ydGggdHJ5aW5nIHRvIGFib3J0IGl0IG5vdyBpZiBzb21ldGhpbmcgZWxzZSBpcyBsaXZlCisJICogb24gdGhlIGJ1cyBhdCB0aGlzIHRpbWUuICBTbywgd2UgbGV0IHRoZSBTQ1NJIGNvZGUgd2FpdAorCSAqIGEgbGl0dGxlIGJpdCBhbmQgdHJ5IGFnYWluIGxhdGVyLgorCSAqLworCWlmIChlc3AtPmN1cnJlbnRfU0MpIHsKKwkJaWYgKGRvbikKKwkJCUVTUF9JTlRTT04oZXNwLT5kcmVncyk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJLyogSXQncyBkaXNjb25uZWN0ZWQsIHdlIGhhdmUgdG8gcmVjb25uZWN0IHRvIHJlLWVzdGFibGlzaAorCSAqIHRoZSBuZXh1cyBhbmQgdGVsbCB0aGUgZGV2aWNlIHRvIGFib3J0LiAgSG93ZXZlciwgd2UgcmVhbGx5CisJICogY2Fubm90ICdyZWNvbm5lY3QnIHBlciBzZS4gIERvbid0IHRyeSB0byBiZSBmYW5jeSwganVzdAorCSAqIGluZGljYXRlIGZhaWx1cmUsIHdoaWNoIGNhdXNlcyBvdXIgY2FsbGVyIHRvIHJlc2V0IHRoZSB3aG9sZQorCSAqIGJ1cy4KKwkgKi8KKworCWlmIChkb24pCisJCUVTUF9JTlRTT04oZXNwLT5kcmVncyk7CisKKwlyZXR1cm4gRkFJTEVEOworfQorCisvKiBXZSd2ZSBzZW50IEVTUF9DTURfUlMgdG8gdGhlIEVTUCwgdGhlIGludGVycnVwdCBoYWQganVzdAorICogYXJyaXZlZCBpbmRpY2F0aW5nIHRoZSBlbmQgb2YgdGhlIFNDU0kgYnVzIHJlc2V0LiAgT3VyIGpvYgorICogaXMgdG8gY2xlYW4gb3V0IHRoZSBjb21tYW5kIHF1ZXVlcyBhbmQgYmVnaW4gcmUtZXhlY3V0aW9uCisgKiBvZiBTQ1NJIGNvbW1hbmRzIG9uY2UgbW9yZS4KKyAqLworc3RhdGljIGludCBlc3BfZmluaXNoX3Jlc2V0KHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzcCA9IGVzcC0+Y3VycmVudF9TQzsKKworCS8qIENsZWFuIHVwIGN1cnJlbnRseSBleGVjdXRpbmcgY29tbWFuZCwgaWYgYW55LiAqLworCWlmIChzcCAhPSBOVUxMKSB7CisJCWVzcC0+Y3VycmVudF9TQyA9IE5VTEw7CisKKwkJZXNwX3JlbGVhc2VfZG1hYnVmcyhlc3AsIHNwKTsKKwkJc3AtPnJlc3VsdCA9IChESURfUkVTRVQgPDwgMTYpOworCisJCXNwLT5zY3NpX2RvbmUoc3ApOworCX0KKworCS8qIENsZWFuIHVwIGRpc2Nvbm5lY3RlZCBxdWV1ZSwgdGhleSBoYXZlIGJlZW4gaW52YWxpZGF0ZWQKKwkgKiBieSB0aGUgYnVzIHJlc2V0LgorCSAqLworCWlmIChlc3AtPmRpc2Nvbm5lY3RlZF9TQykgeworCQl3aGlsZSAoKHNwID0gcmVtb3ZlX2ZpcnN0X1NDKCZlc3AtPmRpc2Nvbm5lY3RlZF9TQykpICE9IE5VTEwpIHsKKwkJCWVzcF9yZWxlYXNlX2RtYWJ1ZnMoZXNwLCBzcCk7CisJCQlzcC0+cmVzdWx0ID0gKERJRF9SRVNFVCA8PCAxNik7CisKKwkJCXNwLT5zY3NpX2RvbmUoc3ApOworCQl9CisJfQorCisJLyogU0NTSSBidXMgcmVzZXQgaXMgY29tcGxldGUuICovCisJZXNwLT5yZXNldHRpbmdfYnVzID0gMDsKKwl3YWtlX3VwKCZlc3AtPnJlc2V0X3F1ZXVlKTsKKworCS8qIE9rLCBub3cgaXQgaXMgc2FmZSB0byBnZXQgY29tbWFuZHMgZ29pbmcgb25jZSBtb3JlLiAqLworCWlmIChlc3AtPmlzc3VlX1NDKQorCQllc3BfZXhlY19jbWQoZXNwKTsKKworCXJldHVybiBkb19pbnRyX2VuZDsKK30KKworc3RhdGljIGludCBlc3BfZG9fcmVzZXRidXMoc3RydWN0IGVzcCAqZXNwKQoreworCUVTUExPRygoImVzcCVkOiBSZXNldHRpbmcgc2NzaSBidXNcbiIsIGVzcC0+ZXNwX2lkKSk7CisJZXNwLT5yZXNldHRpbmdfYnVzID0gMTsKKwllc3BfY21kKGVzcCwgRVNQX0NNRF9SUyk7CisKKwlyZXR1cm4gZG9faW50cl9lbmQ7Cit9CisKKy8qIFJlc2V0IEVTUCBjaGlwLCByZXNldCBoYW5naW5nIGJ1cywgdGhlbiBraWxsIGFjdGl2ZSBhbmQKKyAqIGRpc2Nvbm5lY3RlZCBjb21tYW5kcyBmb3IgdGFyZ2V0cyB3aXRob3V0IHNvZnQgcmVzZXQuCisgKgorICogVGhlIGhvc3RfbG9jayBpcyBhY3F1aXJlZCBieSBjYWxsZXIuCisgKi8KK3N0YXRpYyBpbnQgZXNwX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcHRyKQoreworCXN0cnVjdCBlc3AgKmVzcCA9IChzdHJ1Y3QgZXNwICopIFNDcHRyLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJKHZvaWQpIGVzcF9kb19yZXNldGJ1cyhlc3ApOworCisJc3Bpbl91bmxvY2tfaXJxKGVzcC0+ZWhvc3QtPmhvc3RfbG9jayk7CisKKwl3YWl0X2V2ZW50KGVzcC0+cmVzZXRfcXVldWUsIChlc3AtPnJlc2V0dGluZ19idXMgPT0gMCkpOworCisJc3Bpbl9sb2NrX2lycShlc3AtPmVob3N0LT5ob3N0X2xvY2spOworCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qIEludGVybmFsIEVTUCBkb25lIGZ1bmN0aW9uLiAqLworc3RhdGljIHZvaWQgZXNwX2RvbmUoc3RydWN0IGVzcCAqZXNwLCBpbnQgZXJyb3IpCit7CisJc3RydWN0IHNjc2lfY21uZCAqZG9uZV9TQyA9IGVzcC0+Y3VycmVudF9TQzsKKworCWVzcC0+Y3VycmVudF9TQyA9IE5VTEw7CisKKwllc3BfcmVsZWFzZV9kbWFidWZzKGVzcCwgZG9uZV9TQyk7CisJZG9uZV9TQy0+cmVzdWx0ID0gZXJyb3I7CisKKwlkb25lX1NDLT5zY3NpX2RvbmUoZG9uZV9TQyk7CisKKwkvKiBCdXMgaXMgZnJlZSwgaXNzdWUgYW55IGNvbW1hbmRzIGluIHRoZSBxdWV1ZS4gKi8KKwlpZiAoZXNwLT5pc3N1ZV9TQyAmJiAhZXNwLT5jdXJyZW50X1NDKQorCQllc3BfZXhlY19jbWQoZXNwKTsKKworfQorCisvKiBXaGVlZSwgRVNQIGludGVycnVwdCBlbmdpbmUuICovICAKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMuICovCitzdGF0aWMgaW50IGVzcF9kb19waGFzZV9kZXRlcm1pbmUoc3RydWN0IGVzcCAqZXNwKTsKK3N0YXRpYyBpbnQgZXNwX2RvX2RhdGFfZmluYWxlKHN0cnVjdCBlc3AgKmVzcCk7CitzdGF0aWMgaW50IGVzcF9zZWxlY3RfY29tcGxldGUoc3RydWN0IGVzcCAqZXNwKTsKK3N0YXRpYyBpbnQgZXNwX2RvX3N0YXR1cyhzdHJ1Y3QgZXNwICplc3ApOworc3RhdGljIGludCBlc3BfZG9fbXNnaW4oc3RydWN0IGVzcCAqZXNwKTsKK3N0YXRpYyBpbnQgZXNwX2RvX21zZ2luZG9uZShzdHJ1Y3QgZXNwICplc3ApOworc3RhdGljIGludCBlc3BfZG9fbXNnb3V0KHN0cnVjdCBlc3AgKmVzcCk7CitzdGF0aWMgaW50IGVzcF9kb19jbWRiZWdpbihzdHJ1Y3QgZXNwICplc3ApOworCisjZGVmaW5lIHNyZWdfZGF0YWlucChfX3NyZWcpICAoKChfX3NyZWcpICYgRVNQX1NUQVRfUE1BU0spID09IEVTUF9ESVApCisjZGVmaW5lIHNyZWdfZGF0YW91dHAoX19zcmVnKSAoKChfX3NyZWcpICYgRVNQX1NUQVRfUE1BU0spID09IEVTUF9ET1ApCisKKy8qIFJlYWQgYW55IGJ5dGVzIGZvdW5kIGluIHRoZSBGQVMzNjYgZmlmbywgc3RvcmluZyB0aGVtIGludG8KKyAqIHRoZSBFU1AgZHJpdmVyIHNvZnR3YXJlIHN0YXRlIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQgaG1lX2ZpZm9fcmVhZChzdHJ1Y3QgZXNwICplc3ApCit7CisJdTggY291bnQgPSAwOworCXU4IHN0YXR1cyA9IGVzcC0+c3JlZzsKKworCS8qIENhbm5vdCBzYWZlbHkgZnJvYiB0aGUgZmlmbyBmb3IgdGhlc2UgZm9sbG93aW5nIGNhc2VzLCBidXQKKwkgKiB3ZSBtdXN0IGFsd2F5cyByZWFkIHRoZSBmaWZvIHdoZW4gdGhlIHJlc2VsZWN0IGludGVycnVwdAorCSAqIGlzIHBlbmRpbmcuCisJICovCisJaWYgKCgoZXNwLT5pcmVnICYgRVNQX0lOVFJfUlNFTCkgPT0gMCkJJiYKKwkgICAgKHNyZWdfZGF0YWlucChzdGF0dXMpCQl8fAorCSAgICAgc3JlZ19kYXRhb3V0cChzdGF0dXMpCQl8fAorCSAgICAgKGVzcC0+Y3VycmVudF9TQyAmJgorCSAgICAgIGVzcC0+Y3VycmVudF9TQy0+U0NwLnBoYXNlID09IGluX2RhdGFfZG9uZSkpKSB7CisJCUVTUEhNRSgoIjx3a2Fyb3VuZF9za2lwcGVkPiIpKTsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBsb25nIGZjbnQgPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfRkZMQUdTKSAmIEVTUF9GRl9GQllURVM7CisKKwkJLyogVGhlIEhNRSBzdG9yZXMgYnl0ZXMgaW4gbXVsdGlwbGVzIG9mIDIgaW4gdGhlIGZpZm8uICovCisJCUVTUEhNRSgoImhtZV9maWZvW2ZjbnQ9JWQiLCAoaW50KWZjbnQpKTsKKwkJd2hpbGUgKGZjbnQpIHsKKwkJCWVzcC0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9idWZmZXJbY291bnQrK10gPQorCQkJCXNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9GREFUQSk7CisJCQllc3AtPmhtZV9maWZvX3dvcmthcm91bmRfYnVmZmVyW2NvdW50KytdID0KKwkJCQlzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfRkRBVEEpOworCQkJRVNQSE1FKCgiPCUwMngsJTAyeD4iLCBlc3AtPmhtZV9maWZvX3dvcmthcm91bmRfYnVmZmVyW2NvdW50LTJdLCBlc3AtPmhtZV9maWZvX3dvcmthcm91bmRfYnVmZmVyW2NvdW50LTFdKSk7CisJCQlmY250LS07CisJCX0KKwkJaWYgKHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9TVEFUVVMyKSAmIEVTUF9TVEFUMl9GMUJZVEUpIHsKKwkJCUVTUEhNRSgoIjxwb2tlX2J5dGU+IikpOworCQkJc2J1c193cml0ZWIoMCwgZXNwLT5lcmVncyArIEVTUF9GREFUQSk7CisJCQllc3AtPmhtZV9maWZvX3dvcmthcm91bmRfYnVmZmVyW2NvdW50KytdID0KKwkJCQlzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfRkRBVEEpOworCQkJRVNQSE1FKCgiPCUwMngsMHgwMD4iLCBlc3AtPmhtZV9maWZvX3dvcmthcm91bmRfYnVmZmVyW2NvdW50LTFdKSk7CisJCQlFU1BITUUoKCJDTURfRkxVU0giKSk7CisJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7CisJCX0gZWxzZSB7CisJCQlFU1BITUUoKCJub194dHJhX2J5dGUiKSk7CisJCX0KKwl9CisJRVNQSE1FKCgid2thcm5kX2NudD0lZF0iLCAoaW50KWNvdW50KSk7CisJZXNwLT5obWVfZmlmb193b3JrYXJvdW5kX2NvdW50ID0gY291bnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBobWVfZmlmb19wdXNoKHN0cnVjdCBlc3AgKmVzcCwgdTggKmJ5dGVzLCB1OCBjb3VudCkKK3sKKwllc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7CisJd2hpbGUgKGNvdW50KSB7CisJCXU4IHRtcCA9ICpieXRlcysrOworCQlzYnVzX3dyaXRlYih0bXAsIGVzcC0+ZXJlZ3MgKyBFU1BfRkRBVEEpOworCQlzYnVzX3dyaXRlYigwLCBlc3AtPmVyZWdzICsgRVNQX0ZEQVRBKTsKKwkJY291bnQtLTsKKwl9Cit9CisKKy8qIFdlIHRyeSB0byBhdm9pZCBzb21lIGludGVycnVwdHMgYnkganVtcGluZyBhaGVhZCBhbmQgc2VlIGlmIHRoZSBFU1AKKyAqIGhhcyBnb3R0ZW4gZmFyIGVub3VnaCB5ZXQuICBIZW5jZSB0aGUgZm9sbG93aW5nLgorICovCitzdGF0aWMgaW5saW5lIGludCBza2lwYWhlYWQxKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc2NwLAorCQkJICAgICBpbnQgcHJldl9waGFzZSwgaW50IG5ld19waGFzZSkKK3sKKwlpZiAoc2NwLT5TQ3Auc2VudF9jb21tYW5kICE9IHByZXZfcGhhc2UpCisJCXJldHVybiAwOworCWlmIChFU1BfSVJRX1AoZXNwLT5kcmVncykpIHsKKwkJLyogWWVzLCB3ZSBhcmUgYWJsZSB0byBzYXZlIGFuIGludGVycnVwdC4gKi8KKwkJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpCisJCQllc3AtPnNyZWcyID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NUQVRVUzIpOworCQllc3AtPnNyZWcgPSAoc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NUQVRVUykgJiB+KEVTUF9TVEFUX0lOVFIpKTsKKwkJZXNwLT5pcmVnID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0lOVFJQVCk7CisJCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKSB7CisJCQkvKiBUaGlzIGNoaXAgaXMgcmVhbGx5IGxvc2luZy4gKi8KKwkJCUVTUEhNRSgoIkhNRVsiKSk7CisJCQkvKiBNdXN0IGxhdGNoIGZpZm8gYmVmb3JlIHJlYWRpbmcgdGhlIGludGVycnVwdAorCQkJICogcmVnaXN0ZXIgZWxzZSBnYXJiYWdlIGVuZHMgdXAgaW4gdGhlIEZJRk8KKwkJCSAqIHdoaWNoIGNvbmZ1c2VzIHRoZSBkcml2ZXIgdXR0ZXJseS4KKwkJCSAqIEhhcHB5IE1lYWwgaW5kZWVkLi4uLgorCQkJICovCisJCQlFU1BITUUoKCJmaWZvX3dvcmthcm91bmRdIikpOworCQkJaWYgKCEoZXNwLT5zcmVnMiAmIEVTUF9TVEFUMl9GRU1QVFkpIHx8CisJCQkgICAgKGVzcC0+c3JlZzIgJiBFU1BfU1RBVDJfRjFCWVRFKSkKKwkJCQlobWVfZmlmb19yZWFkKGVzcCk7CisJCX0KKwkJaWYgKCEoZXNwLT5pcmVnICYgRVNQX0lOVFJfU1IpKQorCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXJldHVybiBkb19yZXNldF9jb21wbGV0ZTsKKwl9CisJLyogSG8gaHVtLCB0YXJnZXQgaXMgdGFraW5nIGZvcmV2ZXIuLi4gKi8KKwlzY3AtPlNDcC5zZW50X2NvbW1hbmQgPSBuZXdfcGhhc2U7IC8qIHNvIHdlIGRvbid0IHJlY3Vyc2UuLi4gKi8KKwlyZXR1cm4gZG9faW50cl9lbmQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNraXBhaGVhZDIoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3AsCisJCQkgICAgIGludCBwcmV2X3BoYXNlMSwgaW50IHByZXZfcGhhc2UyLCBpbnQgbmV3X3BoYXNlKQoreworCWlmIChzY3AtPlNDcC5zZW50X2NvbW1hbmQgIT0gcHJldl9waGFzZTEgJiYKKwkgICAgc2NwLT5TQ3Auc2VudF9jb21tYW5kICE9IHByZXZfcGhhc2UyKQorCQlyZXR1cm4gMDsKKwlpZiAoRVNQX0lSUV9QKGVzcC0+ZHJlZ3MpKSB7CisJCS8qIFllcywgd2UgYXJlIGFibGUgdG8gc2F2ZSBhbiBpbnRlcnJ1cHQuICovCisJCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKQorCQkJZXNwLT5zcmVnMiA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9TVEFUVVMyKTsKKwkJZXNwLT5zcmVnID0gKHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9TVEFUVVMpICYgfihFU1BfU1RBVF9JTlRSKSk7CisJCWVzcC0+aXJlZyA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9JTlRSUFQpOworCQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkgeworCQkJLyogVGhpcyBjaGlwIGlzIHJlYWxseSBsb3NpbmcuICovCisJCQlFU1BITUUoKCJITUVbIikpOworCisJCQkvKiBNdXN0IGxhdGNoIGZpZm8gYmVmb3JlIHJlYWRpbmcgdGhlIGludGVycnVwdAorCQkJICogcmVnaXN0ZXIgZWxzZSBnYXJiYWdlIGVuZHMgdXAgaW4gdGhlIEZJRk8KKwkJCSAqIHdoaWNoIGNvbmZ1c2VzIHRoZSBkcml2ZXIgdXR0ZXJseS4KKwkJCSAqIEhhcHB5IE1lYWwgaW5kZWVkLi4uLgorCQkJICovCisJCQlFU1BITUUoKCJmaWZvX3dvcmthcm91bmRdIikpOworCQkJaWYgKCEoZXNwLT5zcmVnMiAmIEVTUF9TVEFUMl9GRU1QVFkpIHx8CisJCQkgICAgKGVzcC0+c3JlZzIgJiBFU1BfU1RBVDJfRjFCWVRFKSkKKwkJCQlobWVfZmlmb19yZWFkKGVzcCk7CisJCX0KKwkJaWYgKCEoZXNwLT5pcmVnICYgRVNQX0lOVFJfU1IpKQorCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXJldHVybiBkb19yZXNldF9jb21wbGV0ZTsKKwl9CisJLyogSG8gaHVtLCB0YXJnZXQgaXMgdGFraW5nIGZvcmV2ZXIuLi4gKi8KKwlzY3AtPlNDcC5zZW50X2NvbW1hbmQgPSBuZXdfcGhhc2U7IC8qIHNvIHdlIGRvbid0IHJlY3Vyc2UuLi4gKi8KKwlyZXR1cm4gZG9faW50cl9lbmQ7Cit9CisKKy8qIE5vdyBzb21lIGRtYSBoZWxwZXJzLiAqLworc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBlc3AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpCit7CisJdTMyIG5yZWcgPSBzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKworCWlmICh3cml0ZSkKKwkJbnJlZyB8PSBETUFfU1RfV1JJVEU7CisJZWxzZQorCQlucmVnICY9IH4oRE1BX1NUX1dSSVRFKTsKKwlucmVnIHw9IERNQV9FTkFCTEU7CisJc2J1c193cml0ZWwobnJlZywgZXNwLT5kcmVncyArIERNQV9DU1IpOworCWlmIChlc3AtPmRtYS0+cmV2aXNpb24gPT0gZHZtYWVzYzEpIHsKKwkJLyogVGhpcyBFU0MgZ2F0ZSBhcnJheSBzdWNrcyEgKi8KKwkJX191MzIgc3JjID0gYWRkcjsKKwkJX191MzIgZGVzdCA9IHNyYyArIGNvdW50OworCisJCWlmIChkZXN0ICYgKFBBR0VfU0laRSAtIDEpKQorCQkJY291bnQgPSBQQUdFX0FMSUdOKGNvdW50KTsKKwkJc2J1c193cml0ZWwoY291bnQsIGVzcC0+ZHJlZ3MgKyBETUFfQ09VTlQpOworCX0KKwlzYnVzX3dyaXRlbChhZGRyLCBlc3AtPmRyZWdzICsgRE1BX0FERFIpOworfQorCitzdGF0aWMgdm9pZCBkbWFfZHJhaW4oc3RydWN0IGVzcCAqZXNwKQoreworCXUzMiB0bXA7CisKKwlpZiAoZXNwLT5kbWEtPnJldmlzaW9uID09IGR2bWFobWUpCisJCXJldHVybjsKKwlpZiAoKHRtcCA9IHNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpKSAmIERNQV9GSUZPX0lTRFJBSU4pIHsKKwkJc3dpdGNoIChlc3AtPmRtYS0+cmV2aXNpb24pIHsKKwkJZGVmYXVsdDoKKwkJCXRtcCB8PSBETUFfRklGT19TVERSQUlOOworCQkJc2J1c193cml0ZWwodG1wLCBlc3AtPmRyZWdzICsgRE1BX0NTUik7CisKKwkJY2FzZSBkdm1hcmV2MzoKKwkJY2FzZSBkdm1hZXNjMToKKwkJCXdoaWxlIChzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKSAmIERNQV9GSUZPX0lTRFJBSU4pCisJCQkJdWRlbGF5KDEpOworCQl9OworCX0KK30KKworc3RhdGljIHZvaWQgZG1hX2ludmFsaWRhdGUoc3RydWN0IGVzcCAqZXNwKQoreworCXUzMiB0bXA7CisKKwlpZiAoZXNwLT5kbWEtPnJldmlzaW9uID09IGR2bWFobWUpIHsKKwkJc2J1c193cml0ZWwoRE1BX1JTVF9TQ1NJLCBlc3AtPmRyZWdzICsgRE1BX0NTUik7CisKKwkJZXNwLT5wcmV2X2htZV9kbWFjc3IgPSAoKGVzcC0+cHJldl9obWVfZG1hY3NyIHwKKwkJCQkJIChETUFfUEFSSVRZX09GRiB8IERNQV8yQ0xLUyB8CisJCQkJCSAgRE1BX1NDU0lfRElTQUIgfCBETUFfSU5UX0VOQUIpKSAmCisJCQkJCX4oRE1BX1NUX1dSSVRFIHwgRE1BX0VOQUJMRSkpOworCisJCXNidXNfd3JpdGVsKDAsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwkJc2J1c193cml0ZWwoZXNwLT5wcmV2X2htZV9kbWFjc3IsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKworCQkvKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBoYXZpbmcgdGhlIFNDU0kgY2hhbm5lbAorCQkgKiBlbmdpbmUgbG9jayB1cCBvbiB1cy4KKwkJICovCisJCXNidXNfd3JpdGVsKDAsIGVzcC0+ZHJlZ3MgKyBETUFfQUREUik7CisJfSBlbHNlIHsKKwkJd2hpbGUgKCh0bXAgPSBzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKSkgJiBETUFfUEVORF9SRUFEKQorCQkJdWRlbGF5KDEpOworCisJCXRtcCAmPSB+KERNQV9FTkFCTEUgfCBETUFfU1RfV1JJVEUgfCBETUFfQkNOVF9FTkFCKTsKKwkJdG1wIHw9IERNQV9GSUZPX0lOVjsKKwkJc2J1c193cml0ZWwodG1wLCBlc3AtPmRyZWdzICsgRE1BX0NTUik7CisJCXRtcCAmPSB+RE1BX0ZJRk9fSU5WOworCQlzYnVzX3dyaXRlbCh0bXAsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfZmxhc2hjbGVhcihzdHJ1Y3QgZXNwICplc3ApCit7CisJZG1hX2RyYWluKGVzcCk7CisJZG1hX2ludmFsaWRhdGUoZXNwKTsKK30KKworc3RhdGljIGludCBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc3ApCit7CisJX191MzIgYmFzZSwgZW5kLCBzejsKKworCWlmIChlc3AtPmRtYS0+cmV2aXNpb24gPT0gZHZtYXJldjMpIHsKKwkJc3ogPSBzcC0+U0NwLnRoaXNfcmVzaWR1YWw7CisJCWlmIChzeiA+IDB4MTAwMDAwMCkKKwkJCXN6ID0gMHgxMDAwMDAwOworCX0gZWxzZSB7CisJCWJhc2UgPSAoKF9fdTMyKSgodW5zaWduZWQgbG9uZylzcC0+U0NwLnB0cikpOworCQliYXNlICY9ICgweDEwMDAwMDAgLSAxKTsKKwkJZW5kID0gKGJhc2UgKyBzcC0+U0NwLnRoaXNfcmVzaWR1YWwpOworCQlpZiAoZW5kID4gMHgxMDAwMDAwKQorCQkJZW5kID0gMHgxMDAwMDAwOworCQlzeiA9IChlbmQgLSBiYXNlKTsKKwl9CisJcmV0dXJuIHN6OworfQorCisvKiBNaXNjLiBlc3AgaGVscGVyIG1hY3Jvcy4gKi8KKyNkZWZpbmUgZXNwX3NldGNvdW50KF9fZXJlZ3MsIF9fY250LCBfX2htZSkgXAorCXNidXNfd3JpdGViKCgoX19jbnQpJjB4ZmYpLCAoX19lcmVncykgKyBFU1BfVENMT1cpOyBcCisJc2J1c193cml0ZWIoKCgoX19jbnQpPj44KSYweGZmKSwgKF9fZXJlZ3MpICsgRVNQX1RDTUVEKTsgXAorCWlmIChfX2htZSkgeyBcCisJCXNidXNfd3JpdGViKCgoKF9fY250KT4+MTYpJjB4ZmYpLCAoX19lcmVncykgKyBGQVNfUkxPKTsgXAorCQlzYnVzX3dyaXRlYigwLCAoX19lcmVncykgKyBGQVNfUkhJKTsgXAorCX0KKworI2RlZmluZSBlc3BfZ2V0Y291bnQoX19lcmVncywgX19obWUpIFwKKwkoKHNidXNfcmVhZGIoKF9fZXJlZ3MpICsgRVNQX1RDTE9XKSYweGZmKSB8IFwKKwkgKChzYnVzX3JlYWRiKChfX2VyZWdzKSArIEVTUF9UQ01FRCkmMHhmZikgPDwgOCkgfCBcCisgICAgICAgICAoKF9faG1lKSA/IHNidXNfcmVhZGIoKF9fZXJlZ3MpICsgRkFTX1JMTykgPDwgMTYgOiAwKSkKKworI2RlZmluZSBmY291bnQoX19lc3ApIFwKKwkoKChfX2VzcCktPmVyZXYgPT0gZmFzaG1lKSA/IFwKKwkgIChfX2VzcCktPmhtZV9maWZvX3dvcmthcm91bmRfY291bnQgOiBcCisJICBzYnVzX3JlYWRiKCgoX19lc3ApLT5lcmVncykgKyBFU1BfRkZMQUdTKSAmIEVTUF9GRl9GQllURVMpCisKKyNkZWZpbmUgZm56ZXJvKF9fZXNwKSBcCisJKCgoX19lc3ApLT5lcmV2ID09IGZhc2htZSkgPyAwIDogXAorCSBzYnVzX3JlYWRiKCgoX19lc3ApLT5lcmVncykgKyBFU1BfRkZMQUdTKSAmIEVTUF9GRl9PTk9UWkVSTykKKworLyogWFhYIHNwZWN1bGF0aXZlIG5vcHMgdW5uZWNlc3Nhcnkgd2hlbiBjb250aW51aW5nIGFtaWRzdCBhIGRhdGEgcGhhc2UKKyAqIFhYWCBldmVuIG9uIGVzcDEwMCEhISAgYW5vdGhlciBjYXNlIG9mIGZsb29kaW5nIHRoZSBidXMgd2l0aCBJL08gcmVnCisgKiBYWFggd3JpdGVzLi4uCisgKi8KKyNkZWZpbmUgZXNwX21heWJlX25vcChfX2VzcCkgXAorCWlmICgoX19lc3ApLT5lcmV2ID09IGVzcDEwMCkgXAorCQllc3BfY21kKChfX2VzcCksIEVTUF9DTURfTlVMTCkKKworI2RlZmluZSBzcmVnX3RvX2RhdGFwaGFzZShfX3NyZWcpIFwKKwkoKCgoX19zcmVnKSAmIEVTUF9TVEFUX1BNQVNLKSA9PSBFU1BfRE9QKSA/IGluX2RhdGFvdXQgOiBpbl9kYXRhaW4pCisKKy8qIFRoZSBFU1AxMDAgd2hlbiBpbiBzeW5jaHJvbm91cyBkYXRhIHBoYXNlLCBjYW4gbWlzdGFrZSBhIGxvbmcgZmluYWwKKyAqIFJFUSBwdWxzZSBmcm9tIHRoZSB0YXJnZXQgYXMgYW4gZXh0cmEgYnl0ZSwgaXQgcGxhY2VzIHdoYXRldmVyIGlzIG9uCisgKiB0aGUgZGF0YSBsaW5lcyBpbnRvIHRoZSBmaWZvLiAgRm9yIG5vdywgd2Ugd2lsbCBhc3N1bWUgd2hlbiB0aGlzCisgKiBoYXBwZW5zIHRoYXQgdGhlIHRhcmdldCBpcyBhIGJpdCBxdWlya3kgYW5kIHdlIGRvbid0IHdhbnQgdG8KKyAqIGJlIHRhbGtpbmcgc3luY2hyb25vdXNseSB0byBpdCBhbnl3YXlzLiAgUmVnYXJkbGVzcywgd2UgbmVlZCB0bworICogdGVsbCB0aGUgRVNQIHRvIGVhdCB0aGUgZXh0cmFuZW91cyBieXRlIHNvIHRoYXQgd2UgY2FuIHByb2NlZWQKKyAqIHRvIHRoZSBuZXh0IHBoYXNlLgorICovCitzdGF0aWMgaW50IGVzcDEwMF9zeW5jX2h3YnVnKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc3AsIGludCBmaWZvY250KQoreworCS8qIERvIG5vdCB0b3VjaCB0aGlzIHBpZWNlIG9mIGNvZGUuICovCisJaWYgKCghKGVzcC0+ZXJldiA9PSBlc3AxMDApKSB8fAorCSAgICAoIShzcmVnX2RhdGFpbnAoKGVzcC0+c3JlZyA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9TVEFUVVMpKSkgJiYKKwkgICAgICAgIWZpZm9jbnQpICYmCisJICAgICAhKHNyZWdfZGF0YW91dHAoZXNwLT5zcmVnKSAmJiAhZm56ZXJvKGVzcCkpKSkgeworCQlpZiAoc3AtPlNDcC5waGFzZSA9PSBpbl9kYXRhb3V0KQorCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfRkxVU0gpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiBBc3luYyBtb2RlIGZvciB0aGlzIGd1eS4gKi8KKwkJYnVpbGRfc3luY19uZWdvX21zZyhlc3AsIDAsIDApOworCisJCS8qIEFjayB0aGUgYm9ndXMgYnl0ZSwgYnV0IHNldCBBVE4gZmlyc3QuICovCisJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX1NBVE4pOworCQllc3BfY21kKGVzcCwgRVNQX0NNRF9NT0spOworCQlyZXR1cm4gMTsKKwl9Cit9CisKKy8qIFRoaXMgY2xvc2VzIHRoZSB3aW5kb3cgZHVyaW5nIGEgc2VsZWN0aW9uIHdpdGggYSByZXNlbGVjdCBwZW5kaW5nLCBiZWNhdXNlCisgKiB3ZSB1c2UgRE1BIGZvciB0aGUgc2VsZWN0aW9uIHByb2Nlc3MgdGhlIEZJRk8gc2hvdWxkIGhvbGQgdGhlIGNvcnJlY3QKKyAqIGNvbnRlbnRzIGlmIHdlIGdldCByZXNlbGVjdGVkIGR1cmluZyB0aGlzIHByb2Nlc3MuICBTbyB3ZSBqdXN0IG5lZWQgdG8KKyAqIGFjayB0aGUgcG9zc2libGUgaWxsZWdhbCBjbWQgaW50ZXJydXB0IHBlbmRpbmcgb24gdGhlIGVzcDEwMC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZXNwMTAwX3JlY29ubmVjdF9od2J1ZyhzdHJ1Y3QgZXNwICplc3ApCit7CisJdTggdG1wOworCisJaWYgKGVzcC0+ZXJldiAhPSBlc3AxMDApCisJCXJldHVybiAwOworCXRtcCA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9JTlRSUFQpOworCWlmICh0bXAgJiBFU1BfSU5UUl9TUikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgdmVyaWZpZXMgdGhlIEJVU0lEIGJpdHMgZHVyaW5nIGEgcmVzZWxlY3Rpb24gc28gdGhhdCB3ZSBrbm93IHdoaWNoCisgKiB0YXJnZXQgaXMgdGFsa2luZyB0byB1cy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcmVjb25uZWN0X3RhcmdldChzdHJ1Y3QgZXNwICplc3ApCit7CisJaW50IGl0LCBtZSA9IGVzcC0+c2NzaV9pZF9tYXNrLCB0YXJnID0gMDsKKworCWlmICgyICE9IGZjb3VudChlc3ApKQorCQlyZXR1cm4gLTE7CisJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpIHsKKwkJLyogSE1FIGRvZXMgbm90IGxhdGNoIGl0J3Mgb3duIEJVUyBJRCBiaXRzIGR1cmluZworCQkgKiBhIHJlc2VsZWN0aW9uLiAgQWxzbyB0aGUgdGFyZ2V0IG51bWJlciBpcyBnaXZlbgorCQkgKiBhcyBhbiB1bnNpZ25lZCBjaGFyLCBub3QgYXMgYSBzb2xlIGJpdCBudW1iZXIKKwkJICogbGlrZSB0aGUgb3RoZXIgRVNQJ3MgZG8uCisJCSAqIEhhcHB5IE1lYWwgaW5kZWVkLi4uLgorCQkgKi8KKwkJdGFyZyA9IGVzcC0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9idWZmZXJbMF07CisJfSBlbHNlIHsKKwkJaXQgPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfRkRBVEEpOworCQlpZiAoIShpdCAmIG1lKSkKKwkJCXJldHVybiAtMTsKKwkJaXQgJj0gfm1lOworCQlpZiAoaXQgJiAoaXQgLSAxKSkKKwkJCXJldHVybiAtMTsKKwkJd2hpbGUgKCEoaXQgJiAxKSkKKwkJCXRhcmcrKywgaXQgPj49IDE7CisJfQorCXJldHVybiB0YXJnOworfQorCisvKiBUaGlzIHZlcmlmaWVzIHRoZSBpZGVudGlmeSBmcm9tIHRoZSB0YXJnZXQgc28gdGhhdCB3ZSBrbm93IHdoaWNoIGx1biBpcworICogYmVpbmcgcmVjb25uZWN0ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJlY29ubmVjdF9sdW4oc3RydWN0IGVzcCAqZXNwKQoreworCWludCBsdW47CisKKwlpZiAoKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BNQVNLKSAhPSBFU1BfTUlQKQorCQlyZXR1cm4gLTE7CisJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpCisJCWx1biA9IGVzcC0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9idWZmZXJbMV07CisJZWxzZQorCQlsdW4gPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfRkRBVEEpOworCisJLyogWWVzLCB5b3UgcmVhZCB0aGlzIGNvcnJlY3RseS4gIFdlIHJlcG9ydCBsdW4gb2YgemVybworCSAqIGlmIHdlIHNlZSBwYXJpdHkgZXJyb3IuICBFU1AgcmVwb3J0cyBwYXJpdHkgZXJyb3IgZm9yCisJICogdGhlIGx1biBieXRlLCBhbmQgdGhpcyBpcyB0aGUgb25seSB3YXkgdG8gaG9wZSB0byByZWNvdmVyCisJICogYmVjYXVzZSB0aGUgdGFyZ2V0IGlzIGNvbm5lY3RlZC4KKwkgKi8KKwlpZiAoZXNwLT5zcmVnICYgRVNQX1NUQVRfUEVSUikKKwkJcmV0dXJuIDA7CisKKwkvKiBDaGVjayBmb3IgaWxsZWdhbCBiaXRzIGJlaW5nIHNldCBpbiB0aGUgbHVuLiAqLworCWlmICgobHVuICYgMHg0MCkgfHwgIShsdW4gJiAweDgwKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIGx1biAmIDc7Cit9CisKKy8qIFRoaXMgcHV0cyB0aGUgZHJpdmVyIGluIGEgc3RhdGUgd2hlcmUgaXQgY2FuIHJldml0YWxpemUgYSBjb21tYW5kIHRoYXQKKyAqIGlzIGJlaW5nIGNvbnRpbnVlZCBkdWUgdG8gcmVzZWxlY3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlc3BfY29ubmVjdChzdHJ1Y3QgZXNwICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKnNwKQoreworCXN0cnVjdCBlc3BfZGV2aWNlICplc3BfZGV2ID0gc3AtPmRldmljZS0+aG9zdGRhdGE7CisKKwlpZiAoZXNwLT5wcmV2X3NvZmYgICE9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCB8fAorCSAgICBlc3AtPnByZXZfc3RwICAgIT0gZXNwX2Rldi0+c3luY19taW5fcGVyaW9kIHx8CisJICAgIChlc3AtPmVyZXYgPiBlc3AxMDBhICYmCisJICAgICBlc3AtPnByZXZfY2ZnMyAhPSBlc3AtPmNvbmZpZzNbc3AtPmRldmljZS0+aWRdKSkgeworCQllc3AtPnByZXZfc29mZiA9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldDsKKwkJZXNwLT5wcmV2X3N0cCA9IGVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZDsKKwkJc2J1c193cml0ZWIoZXNwLT5wcmV2X3NvZmYsIGVzcC0+ZXJlZ3MgKyBFU1BfU09GRik7CisJCXNidXNfd3JpdGViKGVzcC0+cHJldl9zdHAsIGVzcC0+ZXJlZ3MgKyBFU1BfU1RQKTsKKwkJaWYgKGVzcC0+ZXJldiA+IGVzcDEwMGEpIHsKKwkJCWVzcC0+cHJldl9jZmczID0gZXNwLT5jb25maWczW3NwLT5kZXZpY2UtPmlkXTsKKwkJCXNidXNfd3JpdGViKGVzcC0+cHJldl9jZmczLCBlc3AtPmVyZWdzICsgRVNQX0NGRzMpOworCQl9CisJfQorCWVzcC0+Y3VycmVudF9TQyA9IHNwOworfQorCisvKiBUaGlzIHdpbGwgcGxhY2UgdGhlIGN1cnJlbnQgd29ya2luZyBjb21tYW5kIGJhY2sgaW50byB0aGUgaXNzdWUgcXVldWUKKyAqIGlmIHdlIGFyZSB0byByZWNlaXZlIGEgcmVzZWxlY3Rpb24gYW1pZHN0IGEgc2VsZWN0aW9uIGF0dGVtcHQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlc3BfcmVjb25uZWN0KHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc3ApCit7CisJaWYgKCFlc3AtPmRpc2Nvbm5lY3RlZF9TQykKKwkJRVNQTE9HKCgiZXNwJWQ6IFdlaXJkLCBiZWluZyByZXNlbGVjdGVkIGJ1dCBkaXNjb25uZWN0ZWQgIgorCQkJImNvbW1hbmQgcXVldWUgaXMgZW1wdHkuXG4iLCBlc3AtPmVzcF9pZCkpOworCWVzcC0+c25pcCA9IDA7CisJZXNwLT5jdXJyZW50X1NDID0gMDsKKwlzcC0+U0NwLnBoYXNlID0gbm90X2lzc3VlZDsKKwlhcHBlbmRfU0MoJmVzcC0+aXNzdWVfU0MsIHNwKTsKK30KKworLyogQmVnaW4gbWVzc2FnZSBpbiBwaGFzZS4gKi8KK3N0YXRpYyBpbnQgZXNwX2RvX21zZ2luKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwkvKiBNdXN0IGJlIHZlcnkgY2FyZWZ1bCB3aXRoIHRoZSBmaWZvIG9uIHRoZSBITUUgKi8KKwlpZiAoKGVzcC0+ZXJldiAhPSBmYXNobWUpIHx8CisJICAgICEoc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NUQVRVUzIpICYgRVNQX1NUQVQyX0ZFTVBUWSkpCisJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKKwllc3BfbWF5YmVfbm9wKGVzcCk7CisJZXNwX2NtZChlc3AsIEVTUF9DTURfVEkpOworCWVzcC0+bXNnaW5fbGVuID0gMTsKKwllc3AtPm1zZ2luX2N0ciA9IDA7CisJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9tc2dpbmRvbmUpOworCXJldHVybiBkb193b3JrX2J1czsKK30KKworLyogVGhpcyB1c2VzIHZhcmlvdXMgRE1BIGNzciBmaWVsZHMgYW5kIHRoZSBmaWZvIGZsYWdzIGNvdW50IHZhbHVlIHRvCisgKiBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgd2VyZSBzdWNjZXNzZnVsbHkgc2VudC9yZWNlaXZlZCBieSB0aGUgRVNQLgorICovCitzdGF0aWMgaW5saW5lIGludCBlc3BfYnl0ZXNfc2VudChzdHJ1Y3QgZXNwICplc3AsIGludCBmaWZvX2NvdW50KQoreworCWludCBydmFsID0gc2J1c19yZWFkbChlc3AtPmRyZWdzICsgRE1BX0FERFIpIC0gZXNwLT5lc3BfY29tbWFuZF9kdm1hOworCisJaWYgKGVzcC0+ZG1hLT5yZXZpc2lvbiA9PSBkdm1hcmV2MSkKKwkJcnZhbCAtPSAoNCAtICgoc2J1c19yZWFkbChlc3AtPmRyZWdzICsgRE1BX0NTUikgJiBETUFfUkVBRF9BSEVBRCk+PjExKSk7CisJcmV0dXJuIHJ2YWwgLSBmaWZvX2NvdW50OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWR2YW5jZV9zZyhzdHJ1Y3Qgc2NzaV9jbW5kICpzcCkKK3sKKwkrK3NwLT5TQ3AuYnVmZmVyOworCS0tc3AtPlNDcC5idWZmZXJzX3Jlc2lkdWFsOworCXNwLT5TQ3AudGhpc19yZXNpZHVhbCA9IHNnX2RtYV9sZW4oc3AtPlNDcC5idWZmZXIpOworCXNwLT5TQ3AucHRyID0gKGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpc2dfZG1hX2FkZHJlc3Moc3AtPlNDcC5idWZmZXIpKTsKK30KKworLyogUGxlYXNlIG5vdGUgdGhhdCB0aGUgd2F5IEkndmUgY29kZWQgdGhlc2Ugcm91dGluZXMgaXMgdGhhdCBJIF9hbHdheXNfCisgKiBjaGVjayBmb3IgYSBkaXNjb25uZWN0IGR1cmluZyBhbnkgYW5kIGFsbCBpbmZvcm1hdGlvbiB0cmFuc2ZlcgorICogcGhhc2VzLiAgVGhlIFNDU0kgc3RhbmRhcmQgc3RhdGVzIHRoYXQgdGhlIHRhcmdldCBfY2FuXyBjYXVzZSBhIEJVUworICogRlJFRSBjb25kaXRpb24gYnkgZHJvcHBpbmcgYWxsIE1TRy9DRC9JTy9CU1kgc2lnbmFscy4gIEFsc28gbm90ZQorICogdGhhdCBkdXJpbmcgaW5mb3JtYXRpb24gdHJhbnNmZXIgcGhhc2VzIHRoZSB0YXJnZXQgY29udHJvbHMgZXZlcnkKKyAqIGNoYW5nZSBpbiBwaGFzZSwgdGhlIG9ubHkgdGhpbmcgdGhlIGluaXRpYXRvciBjYW4gZG8gaXMgImFzayIgZm9yCisgKiBhIG1lc3NhZ2Ugb3V0IHBoYXNlIGJ5IGRyaXZpbmcgQVROIHRydWUuICBUaGUgdGFyZ2V0IGNhbiwgYW5kIHNvbWV0aW1lcworICogd2lsbCwgY29tcGxldGVseSBpZ25vcmUgdGhpcyByZXF1ZXN0IHNvIHdlIGNhbm5vdCBhc3N1bWUgYW55dGhpbmcgd2hlbgorICogd2UgdHJ5IHRvIGZvcmNlIGEgbWVzc2FnZSBvdXQgcGhhc2UgdG8gYWJvcnQvcmVzZXQgYSB0YXJnZXQuICBNb3N0IG9mCisgKiB0aGUgdGltZSB0aGUgdGFyZ2V0IHdpbGwgZXZlbnR1YWxseSBiZSBuaWNlIGFuZCBnbyB0byBtZXNzYWdlIG91dCwgc28KKyAqIHdlIG1heSBoYXZlIHRvIGhvbGQgb24gdG8gb3VyIHN0YXRlIGFib3V0IHdoYXQgd2Ugd2FudCB0byB0ZWxsIHRoZSB0YXJnZXQKKyAqIGZvciBzb21lIHBlcmlvZCBvZiB0aW1lLgorICovCisKKy8qIEkgdGhpbmsgSSBoYXZlIHRoaW5ncyB3b3JraW5nIGhlcmUgY29ycmVjdGx5LiAgRXZlbiBwYXJ0aWFsIHRyYW5zZmVycworICogd2l0aGluIGEgYnVmZmVyIG9yIHN1Yi1idWZmZXIgc2hvdWxkIG5vdCB1cHNldCB1cyBhdCBhbGwgbm8gbWF0dGVyCisgKiBob3cgYmFkIHRoZSB0YXJnZXQgYW5kL29yIEVTUCBmdWNrcyB0aGluZ3MgdXAuCisgKi8KK3N0YXRpYyBpbnQgZXNwX2RvX2RhdGEoc3RydWN0IGVzcCAqZXNwKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKlNDcHRyID0gZXNwLT5jdXJyZW50X1NDOworCWludCB0aGlzcGhhc2UsIGhtdWNoOworCisJRVNQREFUQSgoImVzcF9kb19kYXRhOiAiKSk7CisJZXNwX21heWJlX25vcChlc3ApOworCXRoaXNwaGFzZSA9IHNyZWdfdG9fZGF0YXBoYXNlKGVzcC0+c3JlZyk7CisJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIHRoaXNwaGFzZSk7CisJRVNQREFUQSgoIm5ld3BoYXNlPCVzPiAiLCAodGhpc3BoYXNlID09IGluX2RhdGFpbikgPyAiREFUQUlOIiA6ICJEQVRBT1VUIikpOworCWhtdWNoID0gZG1hX2Nhbl90cmFuc2Zlcihlc3AsIFNDcHRyKTsKKwlpZiAoaG11Y2ggPiAoNjQgKiAxMDI0KSAmJiAoZXNwLT5lcmV2ICE9IGZhc2htZSkpCisJCWhtdWNoID0gKDY0ICogMTAyNCk7CisJRVNQREFUQSgoImhtdWNoPCVkPiAiLCBobXVjaCkpOworCWVzcC0+Y3VycmVudF90cmFuc2Zlcl9zaXplID0gaG11Y2g7CisKKwlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkgeworCQl1MzIgdG1wID0gZXNwLT5wcmV2X2htZV9kbWFjc3I7CisKKwkJLyogQWx3YXlzIHNldCB0aGUgRVNQIGNvdW50IHJlZ2lzdGVycyBmaXJzdC4gKi8KKwkJZXNwX3NldGNvdW50KGVzcC0+ZXJlZ3MsIGhtdWNoLCAxKTsKKworCQkvKiBHZXQgdGhlIERNQSBjc3IgY29tcHV0ZWQuICovCisJCXRtcCB8PSAoRE1BX1NDU0lfRElTQUIgfCBETUFfRU5BQkxFKTsKKwkJaWYgKHRoaXNwaGFzZSA9PSBpbl9kYXRhaW4pCisJCQl0bXAgfD0gRE1BX1NUX1dSSVRFOworCQllbHNlCisJCQl0bXAgJj0gfihETUFfU1RfV1JJVEUpOworCQllc3AtPnByZXZfaG1lX2RtYWNzciA9IHRtcDsKKworCQlFU1BEQVRBKCgiRE1BfFRJIC0tPiBkb19pbnRyX2VuZFxuIikpOworCQlpZiAodGhpc3BoYXNlID09IGluX2RhdGFpbikgeworCQkJc2J1c193cml0ZWwoaG11Y2gsIGVzcC0+ZHJlZ3MgKyBETUFfQ09VTlQpOworCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfRE1BIHwgRVNQX0NNRF9USSk7CisJCX0gZWxzZSB7CisJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9ETUEgfCBFU1BfQ01EX1RJKTsKKwkJCXNidXNfd3JpdGVsKGhtdWNoLCBlc3AtPmRyZWdzICsgRE1BX0NPVU5UKTsKKwkJfQorCQlzYnVzX3dyaXRlbCgoX191MzIpKCh1bnNpZ25lZCBsb25nKVNDcHRyLT5TQ3AucHRyKSwgZXNwLT5kcmVncytETUFfQUREUik7CisJCXNidXNfd3JpdGVsKGVzcC0+cHJldl9obWVfZG1hY3NyLCBlc3AtPmRyZWdzICsgRE1BX0NTUik7CisJfSBlbHNlIHsKKwkJZXNwX3NldGNvdW50KGVzcC0+ZXJlZ3MsIGhtdWNoLCAwKTsKKwkJZG1hX3NldHVwKGVzcCwgKChfX3UzMikoKHVuc2lnbmVkIGxvbmcpU0NwdHItPlNDcC5wdHIpKSwKKwkJCSAgaG11Y2gsICh0aGlzcGhhc2UgPT0gaW5fZGF0YWluKSk7CisJCUVTUERBVEEoKCJETUF8VEkgLS0+IGRvX2ludHJfZW5kXG4iKSk7CisJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0RNQSB8IEVTUF9DTURfVEkpOworCX0KKwlyZXR1cm4gZG9faW50cl9lbmQ7Cit9CisKKy8qIFNlZSBob3cgc3VjY2Vzc2Z1bCB0aGUgZGF0YSB0cmFuc2ZlciB3YXMuICovCitzdGF0aWMgaW50IGVzcF9kb19kYXRhX2ZpbmFsZShzdHJ1Y3QgZXNwICplc3ApCit7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7CisJc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPSBTQ3B0ci0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwlpbnQgYm9ndXNfZGF0YSA9IDAsIGJ5dGVzX3NlbnQgPSAwLCBmaWZvY250LCBlY291bnQgPSAwOworCisJRVNQREFUQSgoImVzcF9kb19kYXRhX2ZpbmFsZTogIikpOworCisJaWYgKFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fZGF0YWluKSB7CisJCWlmIChlc3AtPnNyZWcgJiBFU1BfU1RBVF9QRVJSKSB7CisJCQkvKiBZdWNrLCBwYXJpdHkgZXJyb3IuICBUaGUgRVNQIGFzc2VydHMgQVROCisJCQkgKiBzbyB0aGF0IHdlIGNhbiBnbyB0byBtZXNzYWdlIG91dCBwaGFzZQorCQkJICogaW1tZWRpYXRlbHkgYW5kIGluZm9ybSB0aGUgdGFyZ2V0IHRoYXQKKwkJCSAqIHNvbWV0aGluZyBiYWQgaGFwcGVuZWQuCisJCQkgKi8KKwkJCUVTUExPRygoImVzcCVkOiBkYXRhIGJhZCBwYXJpdHkgZGV0ZWN0ZWQuXG4iLAorCQkJCWVzcC0+ZXNwX2lkKSk7CisJCQllc3AtPmN1cl9tc2dvdXRbMF0gPSBJTklUSUFUT1JfRVJST1I7CisJCQllc3AtPm1zZ291dF9sZW4gPSAxOworCQl9CisJCWRtYV9kcmFpbihlc3ApOworCX0KKwlkbWFfaW52YWxpZGF0ZShlc3ApOworCisJLyogVGhpcyBjb3VsZCBoYXBwZW4gZm9yIHRoZSBhYm92ZSBwYXJpdHkgZXJyb3IgY2FzZS4gKi8KKwlpZiAoZXNwLT5pcmVnICE9IEVTUF9JTlRSX0JTRVJWKSB7CisJCS8qIFBsZWFzZSBnbyB0byBtc2dvdXQgcGhhc2UsIHBsZWFzZSBwbGVhc2UgcGxlYXNlLi4uICovCisJCUVTUExPRygoImVzcCVkOiAhQlNFUlYgYWZ0ZXIgZGF0YSwgcHJvYmFibHkgdG8gbXNnb3V0XG4iLAorCQkJZXNwLT5lc3BfaWQpKTsKKwkJcmV0dXJuIGVzcF9kb19waGFzZV9kZXRlcm1pbmUoZXNwKTsKKwl9CQorCisJLyogQ2hlY2sgZm9yIHBhcnRpYWwgdHJhbnNmZXJzIGFuZCBvdGhlciBob3JyaWJsZSBldmVudHMuCisJICogTm90ZSwgaGVyZSB3ZSByZWFkIHRoZSByZWFsIGZpZm8gZmxhZ3MgcmVnaXN0ZXIgZXZlbgorCSAqIG9uIEhNRSBicm9rZW4gYWRhcHRlcnMgYmVjYXVzZSB3ZSBza2lwIHRoZSBITUUgZmlmbworCSAqIHdvcmthcm91bmQgY29kZSBpbiBlc3BfaGFuZGxlKCkgaWYgd2UgYXJlIGRvaW5nIGRhdGEKKwkgKiBwaGFzZSB0aGluZ3MuICBXZSBkb24ndCB3YW50IHRvIGZ1Y2sgZGlyZWN0bHkgd2l0aAorCSAqIHRoZSBmaWZvIGxpa2UgdGhhdCwgZXNwZWNpYWxseSBpZiBkb2luZyBzeW5jaHJvbm91cworCSAqIHRyYW5zZmVycyEgIEFsc28sIHdpbGwgbmVlZCB0byBkb3VibGUgdGhlIGNvdW50IG9uCisJICogSE1FIGlmIHdlIGFyZSBkb2luZyB3aWRlIHRyYW5zZmVycywgYXMgdGhlIEhNRSBmaWZvCisJICogd2lsbCBtb3ZlIGFuZCBjb3VudCAxNi1iaXQgcXVhbnRpdGllcyBkdXJpbmcgd2lkZSBkYXRhLgorCSAqIFNNQ0MgX2FuZF8gUWxvZ2ljIGNhbiBib3RoIGJpdGUgbWUuCisJICovCisJZmlmb2NudCA9IChzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfRkZMQUdTKSAmIEVTUF9GRl9GQllURVMpOworCWlmIChlc3AtPmVyZXYgIT0gZmFzaG1lKQorCQllY291bnQgPSBlc3BfZ2V0Y291bnQoZXNwLT5lcmVncywgMCk7CisJYnl0ZXNfc2VudCA9IGVzcC0+Y3VycmVudF90cmFuc2Zlcl9zaXplOworCisJRVNQREFUQSgoInRyYW5zX3N6KCVkKSwgIiwgYnl0ZXNfc2VudCkpOworCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKSB7CisJCWlmICghKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1RDTlQpKSB7CisJCQllY291bnQgPSBlc3BfZ2V0Y291bnQoZXNwLT5lcmVncywgMSk7CisJCQlieXRlc19zZW50IC09IGVjb3VudDsKKwkJfQorCisJCS8qIEFsd2F5cyBzdWJ0cmFjdCBhbnkgY3J1ZnQgcmVtYWluaW5nIGluIHRoZSBGSUZPLiAqLworCQlpZiAoZXNwLT5wcmV2X2NmZzMgJiBFU1BfQ09ORklHM19FV0lERSkKKwkJCWZpZm9jbnQgPDw9IDE7CisJCWlmIChTQ3B0ci0+U0NwLnBoYXNlID09IGluX2RhdGFvdXQpCisJCQlieXRlc19zZW50IC09IGZpZm9jbnQ7CisKKwkJLyogSSBoYXZlIGFuIElCTSBkaXNrIHdoaWNoIGV4aGliaXRzIHRoZSBmb2xsb3dpbmcKKwkJICogYmVoYXZpb3IgZHVyaW5nIHdyaXRlcyB0byBpdC4gIEl0IGRpc2Nvbm5lY3RzIGluCisJCSAqIHRoZSBtaWRkbGUgb2YgYSBwYXJ0aWFsIHRyYW5zZmVyLCB0aGUgY3VycmVudCBzZ2xpc3QKKwkJICogYnVmZmVyIGlzIDEwMjQgYnl0ZXMsIHRoZSBkaXNrIHN0b3BzIGRhdGEgdHJhbnNmZXIKKwkJICogYXQgNTEyIGJ5dGVzLgorCQkgKgorCQkgKiBIb3dldmVyIHRoZSBGQVMzNjYgcmVwb3J0cyB0aGF0IDMyIG1vcmUgYnl0ZXMgd2VyZQorCQkgKiB0cmFuc2ZlcnJlZCB0aGFuIHJlYWxseSB3ZXJlLiAgVGhpcyBpcyBwcmVjaXNlbHkKKwkJICogdGhlIHNpemUgb2YgYSBmdWxseSBsb2FkZWQgRklGTyBpbiB3aWRlIHNjc2kgbW9kZS4KKwkJICogVGhlIEZJRk8gc3RhdGUgcmVjb3JkZWQgaW5kaWNhdGVzIHRoYXQgaXQgaXMgZW1wdHkuCisJCSAqCisJCSAqIEkgaGF2ZSBubyBpZGVhIGlmIHRoaXMgaXMgYSBidWcgaW4gdGhlIEZBUzM2NiBjaGlwCisJCSAqIG9yIGEgYnVnIGluIHRoZSBmaXJtd2FyZSBvbiB0aGlzIElCTSBkaXNrLiAgSW4gYW55CisJCSAqIGV2ZW50IHRoZSBmb2xsb3dpbmcgc2VlbXMgdG8gYmUgYSBnb29kIHdvcmthcm91bmQuICAtRGF2ZU0KKwkJICovCisJCWlmIChieXRlc19zZW50ICE9IGVzcC0+Y3VycmVudF90cmFuc2Zlcl9zaXplICYmCisJCSAgICBTQ3B0ci0+U0NwLnBoYXNlID09IGluX2RhdGFvdXQpIHsKKwkJCWludCBtYXNrID0gKDY0IC0gMSk7CisKKwkJCWlmICgoZXNwLT5wcmV2X2NmZzMgJiBFU1BfQ09ORklHM19FV0lERSkgPT0gMCkKKwkJCQltYXNrID4+PSAxOworCisJCQlpZiAoYnl0ZXNfc2VudCAmIG1hc2spCisJCQkJYnl0ZXNfc2VudCAtPSAoYnl0ZXNfc2VudCAmIG1hc2spOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCEoZXNwLT5zcmVnICYgRVNQX1NUQVRfVENOVCkpCisJCQlieXRlc19zZW50IC09IGVjb3VudDsKKwkJaWYgKFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fZGF0YW91dCkKKwkJCWJ5dGVzX3NlbnQgLT0gZmlmb2NudDsKKwl9CisKKwlFU1BEQVRBKCgiYnl0ZXNfc2VudCglZCksICIsIGJ5dGVzX3NlbnQpKTsKKworCS8qIElmIHdlIHdlcmUgaW4gc3luY2hyb25vdXMgbW9kZSwgY2hlY2sgZm9yIHBlY3VsaWFyaXRpZXMuICovCisJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpIHsKKwkJaWYgKGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCkgeworCQkJaWYgKFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fZGF0YW91dCkKKwkJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7CisJCX0gZWxzZSB7CisJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0KQorCQkJYm9ndXNfZGF0YSA9IGVzcDEwMF9zeW5jX2h3YnVnKGVzcCwgU0NwdHIsIGZpZm9jbnQpOworCQllbHNlCisJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7CisJfQorCisJLyogVW50aWwgd2UgYXJlIHN1cmUgb2Ygd2hhdCBoYXMgaGFwcGVuZWQsIHdlIGFyZSBjZXJ0YWlubHkKKwkgKiBpbiB0aGUgZGFyay4KKwkgKi8KKwllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOworCisJaWYgKGJ5dGVzX3NlbnQgPCAwKSB7CisJCS8qIEkndmUgc2VlbiB0aGlzIGhhcHBlbiBkdWUgdG8gbG9zdCBzdGF0ZSBpbiB0aGlzCisJCSAqIGRyaXZlci4gIE5vIGlkZWEgd2h5IGl0IGhhcHBlbmVkLCBidXQgYWxsb3dpbmcKKwkJICogdGhpcyB2YWx1ZSB0byBiZSBuZWdhdGl2ZSBjYXVzZWQgdGhpbmdzIHRvCisJCSAqIGxvY2sgdXAuICBUaGlzIGFsbG93cyBncmVhdGVyIGNoYW5jZSBvZiByZWNvdmVyeS4KKwkJICogSW4gZmFjdCBldmVyeSB0aW1lIEkndmUgc2VlbiB0aGlzLCBpdCBoYXMgYmVlbgorCQkgKiBhIGRyaXZlciBidWcgd2l0aG91dCBxdWVzdGlvbi4KKwkJICovCisJCUVTUExPRygoImVzcCVkOiB5aWVlZSwgYnl0ZXNfc2VudCA8IDAhXG4iLCBlc3AtPmVzcF9pZCkpOworCQlFU1BMT0coKCJlc3AlZDogY3N6PSVkIGZpZm9jb3VudD0lZCBlY291bnQ9JWRcbiIsCisJCQllc3AtPmVzcF9pZCwKKwkJCWVzcC0+Y3VycmVudF90cmFuc2Zlcl9zaXplLCBmaWZvY250LCBlY291bnQpKTsKKwkJRVNQTE9HKCgiZXNwJWQ6IHVzZV9zZz0lZCBwdHI9JXAgdGhpc19yZXNpZHVhbD0lZFxuIiwKKwkJCWVzcC0+ZXNwX2lkLAorCQkJU0NwdHItPnVzZV9zZywgU0NwdHItPlNDcC5wdHIsIFNDcHRyLT5TQ3AudGhpc19yZXNpZHVhbCkpOworCQlFU1BMT0coKCJlc3AlZDogRm9yY2luZyBhc3luYyBmb3IgdGFyZ2V0ICVkXG4iLCBlc3AtPmVzcF9pZCwgCisJCQlTQ3B0ci0+ZGV2aWNlLT5pZCkpOworCQlTQ3B0ci0+ZGV2aWNlLT5ib3JrZW4gPSAxOworCQllc3BfZGV2LT5zeW5jID0gMDsKKwkJYnl0ZXNfc2VudCA9IDA7CisJfQorCisJLyogVXBkYXRlIHRoZSBzdGF0ZSBvZiBvdXIgdHJhbnNmZXIuICovCisJU0NwdHItPlNDcC5wdHIgKz0gYnl0ZXNfc2VudDsKKwlTQ3B0ci0+U0NwLnRoaXNfcmVzaWR1YWwgLT0gYnl0ZXNfc2VudDsKKwlpZiAoU0NwdHItPlNDcC50aGlzX3Jlc2lkdWFsIDwgMCkgeworCQkvKiBzaGl0ICovCisJCUVTUExPRygoImVzcCVkOiBEYXRhIHRyYW5zZmVyIG92ZXJydW4uXG4iLCBlc3AtPmVzcF9pZCkpOworCQlTQ3B0ci0+U0NwLnRoaXNfcmVzaWR1YWwgPSAwOworCX0KKworCS8qIE1heWJlIGNvbnRpbnVlLiAqLworCWlmICghYm9ndXNfZGF0YSkgeworCQlFU1BEQVRBKCgiIWJvZ3VzX2RhdGEsICIpKTsKKworCQkvKiBOTyBNQVRURVIgV0hBVCwgd2UgYWR2YW5jZSB0aGUgc2NhdHRlcmxpc3QsCisJCSAqIGlmIHRoZSB0YXJnZXQgc2hvdWxkIGRlY2lkZSB0byBkaXNjb25uZWN0CisJCSAqIGluIGJldHdlZW4gc2NhdHRlciBjaHVua3MgKHdoaWNoIGlzIGNvbW1vbikKKwkJICogd2UgY291bGQgZGllIGhvcnJpYmx5ISAgSSB1c2VkIHRvIGhhdmUgdGhlIHNnCisJCSAqIGFkdmFuY2Ugb2NjdXIgb25seSBpZiB3ZSBhcmUgZ29pbmcgYmFjayBpbnRvCisJCSAqIChvciBhcmUgc3RheWluZyBpbikgYSBkYXRhIHBoYXNlLCB5b3UgY2FuCisJCSAqIGltYWdpbmUgdGhlIGhlbGwgSSB3ZW50IHRocm91Z2ggdHJ5aW5nIHRvCisJCSAqIGZpZ3VyZSB0aGlzIG91dC4KKwkJICovCisJCWlmIChTQ3B0ci0+dXNlX3NnICYmICFTQ3B0ci0+U0NwLnRoaXNfcmVzaWR1YWwpCisJCQlhZHZhbmNlX3NnKFNDcHRyKTsKKwkJaWYgKHNyZWdfZGF0YWlucChlc3AtPnNyZWcpIHx8IHNyZWdfZGF0YW91dHAoZXNwLT5zcmVnKSkgeworCQkJRVNQREFUQSgoInRvIG1vcmUgZGF0YVxuIikpOworCQkJcmV0dXJuIGVzcF9kb19kYXRhKGVzcCk7CisJCX0KKwkJRVNQREFUQSgoInRvIG5ldyBwaGFzZVxuIikpOworCQlyZXR1cm4gZXNwX2RvX3BoYXNlX2RldGVybWluZShlc3ApOworCX0KKwkvKiBCb2d1cyBkYXRhLCBqdXN0IHdhaXQgZm9yIG5leHQgaW50ZXJydXB0LiAqLworCUVTUExPRygoImVzcCVkOiBib2d1c19kYXRhIGR1cmluZyBlbmQgb2YgZGF0YSBwaGFzZVxuIiwKKwkJZXNwLT5lc3BfaWQpKTsKKwlyZXR1cm4gZG9faW50cl9lbmQ7Cit9CisKKy8qIFdlIHJlY2VpdmVkIGEgbm9uLWdvb2Qgc3RhdHVzIHJldHVybiBhdCB0aGUgZW5kIG9mCisgKiBydW5uaW5nIGEgU0NTSSBjb21tYW5kLiAgVGhpcyBpcyB1c2VkIHRvIGRlY2lkZSBpZgorICogd2Ugc2hvdWxkIGNsZWFyIG91ciBzeW5jaHJvbm91cyB0cmFuc2ZlciBzdGF0ZSBmb3IKKyAqIHN1Y2ggYSBkZXZpY2Ugd2hlbiB0aGF0IGhhcHBlbnMuCisgKgorICogVGhlIGlkZWEgaXMgdGhhdCB3aGVuIHNwaW5uaW5nIHVwIGEgZGlzayBvciByZXdpbmRpbmcKKyAqIGEgdGFwZSwgd2UgZG9uJ3Qgd2FudCB0byBnbyBpbnRvIGEgbG9vcCByZS1uZWdvdGlhdGluZworICogc3luY2hyb25vdXMgY2FwYWJpbGl0aWVzIG92ZXIgYW5kIG92ZXIuCisgKi8KK3N0YXRpYyBpbnQgZXNwX3Nob3VsZF9jbGVhcl9zeW5jKHN0cnVjdCBzY3NpX2NtbmQgKnNwKQoreworCXU4IGNtZDEgPSBzcC0+Y21uZFswXTsKKwl1OCBjbWQyID0gc3AtPmRhdGFfY21uZFswXTsKKworCS8qIFRoZXNlIGNhc2VzIGFyZSBmb3Igc3Bpbm5pbmcgdXAgYSBkaXNrIGFuZAorCSAqIHdhaXRpbmcgZm9yIHRoYXQgc3BpbnVwIHRvIGNvbXBsZXRlLgorCSAqLworCWlmIChjbWQxID09IFNUQVJUX1NUT1AgfHwKKwkgICAgY21kMiA9PSBTVEFSVF9TVE9QKQorCQlyZXR1cm4gMDsKKworCWlmIChjbWQxID09IFRFU1RfVU5JVF9SRUFEWSB8fAorCSAgICBjbWQyID09IFRFU1RfVU5JVF9SRUFEWSkKKwkJcmV0dXJuIDA7CisKKwkvKiBPbmUgbW9yZSBzcGVjaWFsIGNhc2UgZm9yIFNDU0kgdGFwZSBkcml2ZXMsCisJICogdGhpcyBpcyB3aGF0IGlzIHVzZWQgdG8gcHJvYmUgdGhlIGRldmljZSBmb3IKKwkgKiBjb21wbGV0aW9uIG9mIGEgcmV3aW5kIG9yIHRhcGUgbG9hZCBvcGVyYXRpb24uCisJICovCisJaWYgKHNwLT5kZXZpY2UtPnR5cGUgPT0gVFlQRV9UQVBFKSB7CisJCWlmIChjbWQxID09IE1PREVfU0VOU0UgfHwKKwkJICAgIGNtZDIgPT0gTU9ERV9TRU5TRSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKiBFaXRoZXIgYSBjb21tYW5kIGlzIGNvbXBsZXRpbmcgb3IgYSB0YXJnZXQgaXMgZHJvcHBpbmcgb2ZmIHRoZSBidXMKKyAqIHRvIGNvbnRpbnVlIHRoZSBjb21tYW5kIGluIHRoZSBiYWNrZ3JvdW5kIHNvIHdlIGNhbiBkbyBvdGhlciB3b3JrLgorICovCitzdGF0aWMgaW50IGVzcF9kb19mcmVlYnVzKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKKwlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IFNDcHRyLT5kZXZpY2UtPmhvc3RkYXRhOworCWludCBydmFsOworCisJcnZhbCA9IHNraXBhaGVhZDIoZXNwLCBTQ3B0ciwgaW5fc3RhdHVzLCBpbl9tc2dpbmRvbmUsIGluX2ZyZWVpbmcpOworCWlmIChydmFsKQorCQlyZXR1cm4gcnZhbDsKKwlpZiAoZXNwLT5pcmVnICE9IEVTUF9JTlRSX0RDKSB7CisJCUVTUExPRygoImVzcCVkOiBUYXJnZXQgd2lsbCBub3QgZGlzY29ubmVjdFxuIiwgZXNwLT5lc3BfaWQpKTsKKwkJcmV0dXJuIGRvX3Jlc2V0X2J1czsgLyogdGFyZ2V0IHdpbGwgbm90IGRyb3AgQlNZLi4uICovCisJfQorCWVzcC0+bXNnb3V0X2xlbiA9IDA7CisJZXNwLT5wcmV2bXNnb3V0ID0gTk9QOworCWlmIChlc3AtPnByZXZtc2dpbiA9PSBDT01NQU5EX0NPTVBMRVRFKSB7CisJCS8qIE5vcm1hbCBlbmQgb2YgbmV4dXMuICovCisJCWlmIChlc3AtPmRpc2Nvbm5lY3RlZF9TQyB8fCAoZXNwLT5lcmV2ID09IGZhc2htZSkpCisJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9FU0VMKTsKKworCQlpZiAoU0NwdHItPlNDcC5TdGF0dXMgIT0gR09PRCAmJgorCQkgICAgU0NwdHItPlNDcC5TdGF0dXMgIT0gQ09ORElUSU9OX0dPT0QgJiYKKwkJICAgICgoMTw8U0NwdHItPmRldmljZS0+aWQpICYgZXNwLT50YXJnZXRzX3ByZXNlbnQpICYmCisJCSAgICBlc3BfZGV2LT5zeW5jICYmCisJCSAgICBlc3BfZGV2LT5zeW5jX21heF9vZmZzZXQpIHsKKwkJCS8qIFNDU0kgc3RhbmRhcmQgc2F5cyB0aGF0IHRoZSBzeW5jaHJvbm91cyBjYXBhYmlsaXRpZXMKKwkJCSAqIHNob3VsZCBiZSByZW5lZ290aWF0ZWQgYXQgdGhpcyBwb2ludC4gIE1vc3QgbGlrZWx5CisJCQkgKiB3ZSBhcmUgYWJvdXQgdG8gcmVxdWVzdCBzZW5zZSBmcm9tIHRoaXMgdGFyZ2V0CisJCQkgKiBpbiB3aGljaCBjYXNlIHdlIHdhbnQgdG8gYXZvaWQgdXNpbmcgc3luYworCQkJICogdHJhbnNmZXJzIHVudGlsIHdlIGFyZSBzdXJlIG9mIHRoZSBjdXJyZW50IHRhcmdldAorCQkJICogc3RhdGUuCisJCQkgKi8KKwkJCUVTUE1JU0MoKCJlc3A6IFN0YXR1cyA8JWQ+IGZvciB0YXJnZXQgJWQgbHVuICVkXG4iLAorCQkJCSBTQ3B0ci0+U0NwLlN0YXR1cywgU0NwdHItPmRldmljZS0+aWQsIFNDcHRyLT5kZXZpY2UtPmx1bikpOworCisJCQkvKiBCdXQgZG9uJ3QgZG8gdGhpcyB3aGVuIHNwaW5uaW5nIHVwIGEgZGlzayBhdAorCQkJICogYm9vdCB0aW1lIHdoaWxlIHdlIHBvbGwgZm9yIGNvbXBsZXRpb24gYXMgaXQKKwkJCSAqIGZpbGxzIHVwIHRoZSBjb25zb2xlIHdpdGggbWVzc2FnZXMuICBBbHNvLCB0YXBlcworCQkJICogY2FuIHJlcG9ydCBub3QgcmVhZHkgbWFueSB0aW1lcyByaWdodCBhZnRlcgorCQkJICogbG9hZGluZyB1cCBhIHRhcGUuCisJCQkgKi8KKwkJCWlmIChlc3Bfc2hvdWxkX2NsZWFyX3N5bmMoU0NwdHIpICE9IDApCisJCQkJZXNwX2Rldi0+c3luYyA9IDA7CisJCX0KKwkJRVNQRElTQygoIkY8JTAyeCwlMDJ4PiIsIFNDcHRyLT5kZXZpY2UtPmlkLCBTQ3B0ci0+ZGV2aWNlLT5sdW4pKTsKKwkJZXNwX2RvbmUoZXNwLCAoKFNDcHRyLT5TQ3AuU3RhdHVzICYgMHhmZikgfAorCQkJICAgICAgICgoU0NwdHItPlNDcC5NZXNzYWdlICYgMHhmZik8PDgpIHwKKwkJCSAgICAgICAoRElEX09LIDw8IDE2KSkpOworCX0gZWxzZSBpZiAoZXNwLT5wcmV2bXNnaW4gPT0gRElTQ09OTkVDVCkgeworCQkvKiBOb3JtYWwgZGlzY29ubmVjdC4gKi8KKwkJZXNwX2NtZChlc3AsIEVTUF9DTURfRVNFTCk7CisJCUVTUERJU0MoKCJEPCUwMngsJTAyeD4iLCBTQ3B0ci0+ZGV2aWNlLT5pZCwgU0NwdHItPmRldmljZS0+bHVuKSk7CisJCWFwcGVuZF9TQygmZXNwLT5kaXNjb25uZWN0ZWRfU0MsIFNDcHRyKTsKKwkJZXNwLT5jdXJyZW50X1NDID0gTlVMTDsKKwkJaWYgKGVzcC0+aXNzdWVfU0MpCisJCQllc3BfZXhlY19jbWQoZXNwKTsKKwl9IGVsc2UgeworCQkvKiBEcml2ZXIgYnVnLCB3ZSBkbyBub3QgZXhwZWN0IGEgZGlzY29ubmVjdCBoZXJlCisJCSAqIGFuZCBzaG91bGQgbm90IGhhdmUgYWR2YW5jZWQgdGhlIHN0YXRlIGVuZ2luZQorCQkgKiB0byBpbl9mcmVlaW5nLgorCQkgKi8KKwkJRVNQTE9HKCgiZXNwJWQ6IGxhc3QgbXNnIG5vdCBkaXNjIGFuZCBub3QgY21kIGNtcGx0LlxuIiwKKwkJCWVzcC0+ZXNwX2lkKSk7CisJCXJldHVybiBkb19yZXNldF9idXM7CisJfQorCXJldHVybiBkb19pbnRyX2VuZDsKK30KKworLyogV2hlbiBhIHJlc2VsZWN0IG9jY3VycywgYW5kIHdlIGNhbm5vdCBmaW5kIHRoZSBjb21tYW5kIHRvCisgKiByZWNvbm5lY3QgdG8gaW4gb3VyIHF1ZXVlcywgd2UgZG8gdGhpcy4KKyAqLworc3RhdGljIGludCBlc3BfYmFkX3JlY29ubmVjdChzdHJ1Y3QgZXNwICplc3ApCit7CisJc3RydWN0IHNjc2lfY21uZCAqc3A7CisKKwlFU1BMT0coKCJlc3AlZDogRWllZWVlLCByZWNvbm5lY3RpbmcgdW5rbm93biBjb21tYW5kIVxuIiwKKwkJZXNwLT5lc3BfaWQpKTsKKwlFU1BMT0coKCJRVUVVRSBEVU1QXG4iKSk7CisJc3AgPSBlc3AtPmlzc3VlX1NDOworCUVTUExPRygoImVzcCVkOiBpc3N1ZV9TQ1siLCBlc3AtPmVzcF9pZCkpOworCXdoaWxlIChzcCkgeworCQlFU1BMT0coKCI8JTAyeCwlMDJ4PiIsIHNwLT5kZXZpY2UtPmlkLCBzcC0+ZGV2aWNlLT5sdW4pKTsKKwkJc3AgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBzcC0+aG9zdF9zY3JpYmJsZTsKKwl9CisJRVNQTE9HKCgiXVxuIikpOworCXNwID0gZXNwLT5jdXJyZW50X1NDOworCUVTUExPRygoImVzcCVkOiBjdXJyZW50X1NDWyIsIGVzcC0+ZXNwX2lkKSk7CisJaWYgKHNwKQorCQlFU1BMT0coKCI8JTAyeCwlMDJ4PiIsIHNwLT5kZXZpY2UtPmlkLCBzcC0+ZGV2aWNlLT5sdW4pKTsKKwllbHNlCisJCUVTUExPRygoIjxOVUxMPiIpKTsKKwlFU1BMT0coKCJdXG4iKSk7CisJc3AgPSBlc3AtPmRpc2Nvbm5lY3RlZF9TQzsKKwlFU1BMT0coKCJlc3AlZDogZGlzY29ubmVjdGVkX1NDWyIsIGVzcC0+ZXNwX2lkKSk7CisJd2hpbGUgKHNwKSB7CisJCUVTUExPRygoIjwlMDJ4LCUwMng+Iiwgc3AtPmRldmljZS0+aWQsIHNwLT5kZXZpY2UtPmx1bikpOworCQlzcCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIHNwLT5ob3N0X3NjcmliYmxlOworCX0KKwlFU1BMT0coKCJdXG4iKSk7CisJcmV0dXJuIGRvX3Jlc2V0X2J1czsKK30KKworLyogRG8gdGhlIG5lZWR5IHdoZW4gYSB0YXJnZXQgdHJpZXMgdG8gcmVjb25uZWN0IHRvIHVzLiAqLworc3RhdGljIGludCBlc3BfZG9fcmVjb25uZWN0KHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlpbnQgbHVuLCB0YXJnZXQ7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwdHI7CisKKwkvKiBDaGVjayBmb3IgYWxsIGJvZ3VzIGNvbmRpdGlvbnMgZmlyc3QuICovCisJdGFyZ2V0ID0gcmVjb25uZWN0X3RhcmdldChlc3ApOworCWlmICh0YXJnZXQgPCAwKSB7CisJCUVTUERJU0MoKCJiYWQgYnVzIGJpdHNcbiIpKTsKKwkJcmV0dXJuIGRvX3Jlc2V0X2J1czsKKwl9CisJbHVuID0gcmVjb25uZWN0X2x1bihlc3ApOworCWlmIChsdW4gPCAwKSB7CisJCUVTUERJU0MoKCJ0YXJnZXQ9JTJ4LCBiYWQgaWRlbnRpZnkgbXNnXG4iLCB0YXJnZXQpKTsKKwkJcmV0dXJuIGRvX3Jlc2V0X2J1czsKKwl9CisKKwkvKiBUaGluZ3MgbG9vayBvay4uLiAqLworCUVTUERJU0MoKCJSPCUwMngsJTAyeD4iLCB0YXJnZXQsIGx1bikpOworCisJLyogTXVzdCBub3QgZmx1c2ggRklGTyBvciBEVk1BIG9uIEhNRS4gKi8KKwlpZiAoZXNwLT5lcmV2ICE9IGZhc2htZSkgeworCQllc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7CisJCWlmIChlc3AxMDBfcmVjb25uZWN0X2h3YnVnKGVzcCkpCisJCQlyZXR1cm4gZG9fcmVzZXRfYnVzOworCQllc3BfY21kKGVzcCwgRVNQX0NNRF9OVUxMKTsKKwl9CisKKwlTQ3B0ciA9IHJlbW92ZV9TQygmZXNwLT5kaXNjb25uZWN0ZWRfU0MsICh1OCkgdGFyZ2V0LCAodTgpIGx1bik7CisJaWYgKCFTQ3B0cikKKwkJcmV0dXJuIGVzcF9iYWRfcmVjb25uZWN0KGVzcCk7CisKKwllc3BfY29ubmVjdChlc3AsIFNDcHRyKTsKKwllc3BfY21kKGVzcCwgRVNQX0NNRF9NT0spOworCisJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpCisJCXNidXNfd3JpdGViKCgoU0NwdHItPmRldmljZS0+aWQgJiAweGYpIHwKKwkJCSAgICAgKEVTUF9CVVNJRF9SRVNFTElEIHwgRVNQX0JVU0lEX0NUUjMyQklUKSksCisJCQkgICAgZXNwLT5lcmVncyArIEVTUF9CVVNJRCk7CisKKwkvKiBSZWNvbm5lY3QgaW1wbGllcyBhIHJlc3RvcmUgcG9pbnRlcnMgb3BlcmF0aW9uLiAqLworCWVzcF9yZXN0b3JlX3BvaW50ZXJzKGVzcCwgU0NwdHIpOworCisJZXNwLT5zbmlwID0gMDsKKwllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOworCXJldHVybiBkb19pbnRyX2VuZDsKK30KKworLyogRW5kIG9mIE5FWFVTIChob3BlZnVsbHkpLCBwaWNrIHVwIHN0YXR1cyArIG1lc3NhZ2UgYnl0ZSB0aGVuIGxlYXZlIGlmCisgKiBhbGwgZ29lcyB3ZWxsLgorICovCitzdGF0aWMgaW50IGVzcF9kb19zdGF0dXMoc3RydWN0IGVzcCAqZXNwKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKlNDcHRyID0gZXNwLT5jdXJyZW50X1NDOworCWludCBpbnRyLCBydmFsOworCisJcnZhbCA9IHNraXBhaGVhZDEoZXNwLCBTQ3B0ciwgaW5fdGhlX2RhcmssIGluX3N0YXR1cyk7CisJaWYgKHJ2YWwpCisJCXJldHVybiBydmFsOworCWludHIgPSBlc3AtPmlyZWc7CisJRVNQU1RBVCgoImVzcF9kb19zdGF0dXM6ICIpKTsKKwlpZiAoaW50ciAhPSBFU1BfSU5UUl9EQykgeworCQlpbnQgbWVzc2FnZV9vdXQgPSAwOyAvKiBmb3IgcGFyaXR5IHByb2JsZW1zICovCisKKwkJLyogQWNrIHRoZSBtZXNzYWdlLiAqLworCQlFU1BTVEFUKCgiYWNrIG1zZywgIikpOworCQllc3BfY21kKGVzcCwgRVNQX0NNRF9NT0spOworCisJCWlmIChlc3AtPmVyZXYgIT0gZmFzaG1lKSB7CisJCQlkbWFfZmxhc2hjbGVhcihlc3ApOworCisJCQkvKiBXYWl0IHRpbGwgdGhlIGZpcnN0IGJpdHMgc2V0dGxlLiAqLworCQkJd2hpbGUgKGVzcC0+ZXNwX2NvbW1hbmRbMF0gPT0gMHhmZikKKwkJCQl1ZGVsYXkoMSk7CisJCX0gZWxzZSB7CisJCQllc3AtPmVzcF9jb21tYW5kWzBdID0gZXNwLT5obWVfZmlmb193b3JrYXJvdW5kX2J1ZmZlclswXTsKKwkJCWVzcC0+ZXNwX2NvbW1hbmRbMV0gPSBlc3AtPmhtZV9maWZvX3dvcmthcm91bmRfYnVmZmVyWzFdOworCQl9CisKKwkJRVNQU1RBVCgoImdvdCBzb21ldGhpbmcsICIpKTsKKwkJLyogRVNQIGNoaW1lcyBpbiB3aXRoIG9uZSBvZgorCQkgKgorCQkgKiAxKSBmdW5jdGlvbiBkb25lIGludGVycnVwdDoKKwkJICoJYm90aCBzdGF0dXMgYW5kIG1lc3NhZ2UgaW4gYnl0ZXMKKwkJICoJYXJlIGF2YWlsYWJsZQorCQkgKgorCQkgKiAyKSBidXMgc2VydmljZSBpbnRlcnJ1cHQ6CisJCSAqCW9ubHkgc3RhdHVzIGJ5dGUgd2FzIGFjcXVpcmVkCisJCSAqCisJCSAqIDMpIEFueXRoaW5nIGVsc2U6CisJCSAqCWNhbid0IGhhcHBlbiwgYnV0IHdlIHRlc3QgZm9yIGl0CisJCSAqCWFueXdheXMKKwkJICoKKwkJICogQUxTTzogSWYgYmFkIHBhcml0eSB3YXMgZGV0ZWN0ZWQgb24gZWl0aGVyCisJCSAqICAgICAgIHRoZSBzdGF0dXMgX29yXyB0aGUgbWVzc2FnZSBieXRlIHRoZW4KKwkJICogICAgICAgdGhlIEVTUCBoYXMgYXNzZXJ0ZWQgQVROIG9uIHRoZSBidXMKKwkJICogICAgICAgYW5kIHdlIG11c3QgdGhlcmVmb3JlIHdhaXQgZm9yIHRoZQorCQkgKiAgICAgICBuZXh0IHBoYXNlIGNoYW5nZS4KKwkJICovCisJCWlmIChpbnRyICYgRVNQX0lOVFJfRkRPTkUpIHsKKwkJCS8qIFdlIGdvdCBpdCBhbGwsIGhhbGxlanVsaWEuICovCisJCQlFU1BTVEFUKCgiZ290IGJvdGgsICIpKTsKKwkJCVNDcHRyLT5TQ3AuU3RhdHVzID0gZXNwLT5lc3BfY29tbWFuZFswXTsKKwkJCVNDcHRyLT5TQ3AuTWVzc2FnZSA9IGVzcC0+ZXNwX2NvbW1hbmRbMV07CisJCQllc3AtPnByZXZtc2dpbiA9IFNDcHRyLT5TQ3AuTWVzc2FnZTsKKwkJCWVzcC0+Y3VyX21zZ2luWzBdID0gU0NwdHItPlNDcC5NZXNzYWdlOworCQkJaWYgKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BFUlIpIHsKKwkJCQkvKiBUaGVyZSB3YXMgYmFkIHBhcml0eSBmb3IgdGhlCisJCQkJICogbWVzc2FnZSBieXRlLCB0aGUgc3RhdHVzIGJ5dGUKKwkJCQkgKiB3YXMgb2suCisJCQkJICovCisJCQkJbWVzc2FnZV9vdXQgPSBNU0dfUEFSSVRZX0VSUk9SOworCQkJfQorCQl9IGVsc2UgaWYgKGludHIgPT0gRVNQX0lOVFJfQlNFUlYpIHsKKwkJCS8qIE9ubHkgZ290IHN0YXR1cyBieXRlLiAqLworCQkJRVNQTE9HKCgiZXNwJWQ6IGdvdCBzdGF0dXMgb25seSwgIiwgZXNwLT5lc3BfaWQpKTsKKwkJCWlmICghKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BFUlIpKSB7CisJCQkJU0NwdHItPlNDcC5TdGF0dXMgPSBlc3AtPmVzcF9jb21tYW5kWzBdOworCQkJCVNDcHRyLT5TQ3AuTWVzc2FnZSA9IDB4ZmY7CisJCQl9IGVsc2UgeworCQkJCS8qIFRoZSBzdGF0dXMgYnl0ZSBoYWQgYmFkIHBhcml0eS4KKwkJCQkgKiB3ZSBsZWF2ZSB0aGUgc2NzaV9wb2ludGVyIFN0YXR1cworCQkJCSAqIGZpZWxkIGFsb25lIGFzIHdlIHNldCBpdCB0byBhIGRlZmF1bHQKKwkJCQkgKiBvZiBDSEVDS19DT05ESVRJT04gaW4gZXNwX3F1ZXVlLgorCQkJCSAqLworCQkJCW1lc3NhZ2Vfb3V0ID0gSU5JVElBVE9SX0VSUk9SOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGV2ZXIuICovCisJCQlFU1BTVEFUKCgiZ290IGJvbGl4ZWRcbiIpKTsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJCQlyZXR1cm4gZXNwX2RvX3BoYXNlX2RldGVybWluZShlc3ApOworCQl9CisKKwkJaWYgKCFtZXNzYWdlX291dCkgeworCQkJRVNQU1RBVCgoInN0YXR1cz0lMnggbXNnPSUyeCwgIiwgU0NwdHItPlNDcC5TdGF0dXMsCisJCQkJU0NwdHItPlNDcC5NZXNzYWdlKSk7CisJCQlpZiAoU0NwdHItPlNDcC5NZXNzYWdlID09IENPTU1BTkRfQ09NUExFVEUpIHsKKwkJCQlFU1BTVEFUKCgiYW5kIHdhcyBDT01NQU5EX0NPTVBMRVRFXG4iKSk7CisJCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX2ZyZWVpbmcpOworCQkJCXJldHVybiBlc3BfZG9fZnJlZWJ1cyhlc3ApOworCQkJfSBlbHNlIHsKKwkJCQlFU1BMT0coKCJlc3AlZDogYW5kIF9ub3RfIENPTU1BTkRfQ09NUExFVEVcbiIsCisJCQkJCWVzcC0+ZXNwX2lkKSk7CisJCQkJZXNwLT5tc2dpbl9sZW4gPSBlc3AtPm1zZ2luX2N0ciA9IDE7CisJCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX21zZ2luZG9uZSk7CisJCQkJcmV0dXJuIGVzcF9kb19tc2dpbmRvbmUoZXNwKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFdpdGggbHVjayB3ZSdsbCBiZSBhYmxlIHRvIGxldCB0aGUgdGFyZ2V0CisJCQkgKiBrbm93IHRoYXQgYmFkIHBhcml0eSBoYXBwZW5lZCwgaXQgd2lsbCBrbm93CisJCQkgKiB3aGljaCBieXRlIGNhdXNlZCB0aGUgcHJvYmxlbXMgYW5kIHNlbmQgaXQKKwkJCSAqIGFnYWluLiAgRm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBzdGF0dXMgYnl0ZQorCQkJICogcmVjZWl2ZXMgYmFkIHBhcml0eSwgSSBkbyBub3QgYmVsaWV2ZSBtb3N0CisJCQkgKiB0YXJnZXRzIHJlY292ZXIgdmVyeSB3ZWxsLiAgV2UnbGwgc2VlLgorCQkJICovCisJCQlFU1BMT0coKCJlc3AlZDogYmFkIHBhcml0eSBzb21ld2hlcmUgbW91dD0lMnhcbiIsCisJCQkJZXNwLT5lc3BfaWQsIG1lc3NhZ2Vfb3V0KSk7CisJCQllc3AtPmN1cl9tc2dvdXRbMF0gPSBtZXNzYWdlX291dDsKKwkJCWVzcC0+bXNnb3V0X2xlbiA9IGVzcC0+bXNnb3V0X2N0ciA9IDE7CisJCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOworCQkJcmV0dXJuIGVzcF9kb19waGFzZV9kZXRlcm1pbmUoZXNwKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIElmIHdlIGRpc2Nvbm5lY3Qgbm93LCBhbGwgaGVsbCBicmVha3MgbG9vc2UuICovCisJCUVTUExPRygoImVzcCVkOiB3aG9vcHMsIGRpc2Nvbm5lY3RcbiIsIGVzcC0+ZXNwX2lkKSk7CisJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJCXJldHVybiBlc3BfZG9fcGhhc2VfZGV0ZXJtaW5lKGVzcCk7CisJfQorfQorCitzdGF0aWMgaW50IGVzcF9lbnRlcl9zdGF0dXMoc3RydWN0IGVzcCAqZXNwKQoreworCXU4IHRoZWNtZCA9IEVTUF9DTURfSUNDU0VROworCisJZXNwX2NtZChlc3AsIEVTUF9DTURfRkxVU0gpOworCWlmIChlc3AtPmVyZXYgIT0gZmFzaG1lKSB7CisJCXUzMiB0bXA7CisKKwkJZXNwLT5lc3BfY29tbWFuZFswXSA9IGVzcC0+ZXNwX2NvbW1hbmRbMV0gPSAweGZmOworCQlzYnVzX3dyaXRlYigyLCBlc3AtPmVyZWdzICsgRVNQX1RDTE9XKTsKKwkJc2J1c193cml0ZWIoMCwgZXNwLT5lcmVncyArIEVTUF9UQ01FRCk7CisJCXRtcCA9IHNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpOworCQl0bXAgfD0gKERNQV9TVF9XUklURSB8IERNQV9FTkFCTEUpOworCQlzYnVzX3dyaXRlbCh0bXAsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwkJaWYgKGVzcC0+ZG1hLT5yZXZpc2lvbiA9PSBkdm1hZXNjMSkKKwkJCXNidXNfd3JpdGVsKDB4MTAwLCBlc3AtPmRyZWdzICsgRE1BX0NPVU5UKTsKKwkJc2J1c193cml0ZWwoZXNwLT5lc3BfY29tbWFuZF9kdm1hLCBlc3AtPmRyZWdzICsgRE1BX0FERFIpOworCQl0aGVjbWQgfD0gRVNQX0NNRF9ETUE7CisJfQorCWVzcF9jbWQoZXNwLCB0aGVjbWQpOworCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fc3RhdHVzKTsKKworCXJldHVybiBlc3BfZG9fc3RhdHVzKGVzcCk7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2Rpc2Nvbm5lY3RfYW1pZHN0X3BoYXNlcyhzdHJ1Y3QgZXNwICplc3ApCit7CisJc3RydWN0IHNjc2lfY21uZCAqc3AgPSBlc3AtPmN1cnJlbnRfU0M7CisJc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPSBzcC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKworCS8qIFRoaXMgbWVhbnMgcmVhbCBwcm9ibGVtcyBpZiB3ZSBzZWUgdGhpcworCSAqIGhlcmUuICBVbmxlc3Mgd2Ugd2VyZSBhY3R1YWxseSB0cnlpbmcKKwkgKiB0byBmb3JjZSB0aGUgZGV2aWNlIHRvIGFib3J0L3Jlc2V0LgorCSAqLworCUVTUExPRygoImVzcCVkIERpc2Nvbm5lY3QgYW1pZHN0IHBoYXNlcywgIiwgZXNwLT5lc3BfaWQpKTsKKwlFU1BMT0coKCJwcGhhc2U8JXM+IGNwaGFzZTwlcz4sICIsCisJCXBoYXNlX3N0cmluZyhzcC0+U0NwLnBoYXNlKSwKKwkJcGhhc2Vfc3RyaW5nKHNwLT5TQ3Auc2VudF9jb21tYW5kKSkpOworCisJaWYgKGVzcC0+ZGlzY29ubmVjdGVkX1NDICE9IE5VTEwgfHwgKGVzcC0+ZXJldiA9PSBmYXNobWUpKQorCQllc3BfY21kKGVzcCwgRVNQX0NNRF9FU0VMKTsKKworCXN3aXRjaCAoZXNwLT5jdXJfbXNnb3V0WzBdKSB7CisJZGVmYXVsdDoKKwkJLyogV2UgZGlkbid0IGV4cGVjdCB0aGlzIHRvIGhhcHBlbiBhdCBhbGwuICovCisJCUVTUExPRygoImRldmljZSBpcyBib2xpeGVkXG4iKSk7CisJCWVzcF9hZHZhbmNlX3BoYXNlKHNwLCBpbl90Z3RlcnJvcik7CisJCWVzcF9kb25lKGVzcCwgKERJRF9FUlJPUiA8PCAxNikpOworCQlicmVhazsKKworCWNhc2UgQlVTX0RFVklDRV9SRVNFVDoKKwkJRVNQTE9HKCgiZGV2aWNlIHJlc2V0IHN1Y2Nlc3NmdWxcbiIpKTsKKwkJZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0ID0gMDsKKwkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gMDsKKwkJZXNwX2Rldi0+c3luYyA9IDA7CisJCWVzcF9hZHZhbmNlX3BoYXNlKHNwLCBpbl9yZXNldGRldik7CisJCWVzcF9kb25lKGVzcCwgKERJRF9SRVNFVCA8PCAxNikpOworCQlicmVhazsKKworCWNhc2UgQUJPUlQ6CisJCUVTUExPRygoImRldmljZSBhYm9ydCBzdWNjZXNzZnVsXG4iKSk7CisJCWVzcF9hZHZhbmNlX3BoYXNlKHNwLCBpbl9hYm9ydG9uZSk7CisJCWVzcF9kb25lKGVzcCwgKERJRF9BQk9SVCA8PCAxNikpOworCQlicmVhazsKKworCX07CisJcmV0dXJuIGRvX2ludHJfZW5kOworfQorCitzdGF0aWMgaW50IGVzcF9lbnRlcl9tc2dvdXQoc3RydWN0IGVzcCAqZXNwKQoreworCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fbXNnb3V0KTsKKwlyZXR1cm4gZXNwX2RvX21zZ291dChlc3ApOworfQorCitzdGF0aWMgaW50IGVzcF9lbnRlcl9tc2dpbihzdHJ1Y3QgZXNwICplc3ApCit7CisJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9tc2dpbik7CisJcmV0dXJuIGVzcF9kb19tc2dpbihlc3ApOworfQorCitzdGF0aWMgaW50IGVzcF9lbnRlcl9jbWQoc3RydWN0IGVzcCAqZXNwKQoreworCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fY21kYmVnaW4pOworCXJldHVybiBlc3BfZG9fY21kYmVnaW4oZXNwKTsKK30KKworc3RhdGljIGludCBlc3BfZW50ZXJfYmFkcGhhc2Uoc3RydWN0IGVzcCAqZXNwKQoreworCUVTUExPRygoImVzcCVkOiBCaXphcnJlIGJ1cyBwaGFzZSAlMnguXG4iLCBlc3AtPmVzcF9pZCwKKwkJZXNwLT5zcmVnICYgRVNQX1NUQVRfUE1BU0spKTsKKwlyZXR1cm4gZG9fcmVzZXRfYnVzOworfQorCit0eXBlZGVmIGludCAoKmVzcGZ1bmNfdCkoc3RydWN0IGVzcCAqKTsKKworc3RhdGljIGVzcGZ1bmNfdCBwaGFzZV92ZWN0b3JbXSA9IHsKKwllc3BfZG9fZGF0YSwJCS8qIEVTUF9ET1AgKi8KKwllc3BfZG9fZGF0YSwJCS8qIEVTUF9ESVAgKi8KKwllc3BfZW50ZXJfY21kLAkJLyogRVNQX0NNRFAgKi8KKwllc3BfZW50ZXJfc3RhdHVzLAkvKiBFU1BfU1RBVFAgKi8KKwllc3BfZW50ZXJfYmFkcGhhc2UsCS8qIEVTUF9TVEFUX1BNU0cgKi8KKwllc3BfZW50ZXJfYmFkcGhhc2UsCS8qIEVTUF9TVEFUX1BNU0cgfCBFU1BfU1RBVF9QSU8gKi8KKwllc3BfZW50ZXJfbXNnb3V0LAkvKiBFU1BfTU9QICovCisJZXNwX2VudGVyX21zZ2luLAkvKiBFU1BfTUlQICovCit9OworCisvKiBUaGUgdGFyZ2V0IGhhcyBjb250cm9sIG9mIHRoZSBidXMgYW5kIHdlIGhhdmUgdG8gc2VlIHdoZXJlIGl0IGhhcworICogdGFrZW4gdXMuCisgKi8KK3N0YXRpYyBpbnQgZXNwX2RvX3BoYXNlX2RldGVybWluZShzdHJ1Y3QgZXNwICplc3ApCit7CisJaWYgKChlc3AtPmlyZWcgJiBFU1BfSU5UUl9EQykgIT0gMCkKKwkJcmV0dXJuIGVzcF9kaXNjb25uZWN0X2FtaWRzdF9waGFzZXMoZXNwKTsKKwlyZXR1cm4gcGhhc2VfdmVjdG9yW2VzcC0+c3JlZyAmIEVTUF9TVEFUX1BNQVNLXShlc3ApOworfQorCisvKiBGaXJzdCBpbnRlcnJ1cHQgYWZ0ZXIgZXhlYydpbmcgYSBjbWQgY29tZXMgaGVyZS4gKi8KK3N0YXRpYyBpbnQgZXNwX3NlbGVjdF9jb21wbGV0ZShzdHJ1Y3QgZXNwICplc3ApCit7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7CisJc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPSBTQ3B0ci0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwlpbnQgY21kX2J5dGVzX3NlbnQsIGZjbnQ7CisKKwlpZiAoZXNwLT5lcmV2ICE9IGZhc2htZSkKKwkJZXNwLT5zZXFyZWcgPSAoc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NTVEVQKSAmIEVTUF9TVEVQX1ZCSVRTKTsKKworCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKQorCQlmY250ID0gZXNwLT5obWVfZmlmb193b3JrYXJvdW5kX2NvdW50OworCWVsc2UKKwkJZmNudCA9IChzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfRkZMQUdTKSAmIEVTUF9GRl9GQllURVMpOworCisJY21kX2J5dGVzX3NlbnQgPSBlc3BfYnl0ZXNfc2VudChlc3AsIGZjbnQpOworCWRtYV9pbnZhbGlkYXRlKGVzcCk7CisKKwkvKiBMZXQncyBjaGVjayB0byBzZWUgaWYgYSByZXNlbGVjdCBoYXBwZW5lZAorCSAqIHdoaWxlIHdlIHdlJ3JlIHRyeWluZyB0byBzZWxlY3QuICBUaGlzIG11c3QKKwkgKiBiZSBjaGVja2VkIGZpcnN0LgorCSAqLworCWlmIChlc3AtPmlyZWcgPT0gKEVTUF9JTlRSX1JTRUwgfCBFU1BfSU5UUl9GRE9ORSkpIHsKKwkJZXNwX3JlY29ubmVjdChlc3AsIFNDcHRyKTsKKwkJcmV0dXJuIGVzcF9kb19yZWNvbm5lY3QoZXNwKTsKKwl9CisKKwkvKiBMb29rcyBsaWtlIHRoaW5ncyB3b3JrZWQsIHdlIHNob3VsZCBzZWUgYSBidXMgc2VydmljZSAmCisJICogYSBmdW5jdGlvbiBjb21wbGV0ZSBpbnRlcnJ1cHQgYXQgdGhpcyBwb2ludC4gIE5vdGUgd2UKKwkgKiBhcmUgZG9pbmcgYSBkaXJlY3QgY29tcGFyaXNvbiBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8KKwkgKiBiZSBmb29sZWQgaW50byB0aGlua2luZyBzZWxlY3Rpb24gd2FzIHN1Y2Nlc3NmdWwgaWYKKwkgKiBFU1BfSU5UUl9EQyBpcyBzZXQsIHNlZSBiZWxvdy4KKwkgKi8KKwlpZiAoZXNwLT5pcmVnID09IChFU1BfSU5UUl9GRE9ORSB8IEVTUF9JTlRSX0JTRVJWKSkgeworCQkvKiB0YXJnZXQgc3BlYWtzLi4uICovCisJCWVzcC0+dGFyZ2V0c19wcmVzZW50IHw9ICgxPDxTQ3B0ci0+ZGV2aWNlLT5pZCk7CisKKwkJLyogV2hhdCBpZiB0aGUgdGFyZ2V0IGlnbm9yZXMgdGhlIHNkdHI/ICovCisJCWlmIChlc3AtPnNuaXApCisJCQllc3BfZGV2LT5zeW5jID0gMTsKKworCQkvKiBTZWUgaG93IGZhciwgaWYgYXQgYWxsLCB3ZSBnb3QgaW4gZ2V0dGluZworCQkgKiB0aGUgaW5mb3JtYXRpb24gb3V0IHRvIHRoZSB0YXJnZXQuCisJCSAqLworCQlzd2l0Y2ggKGVzcC0+c2VxcmVnKSB7CisJCWRlZmF1bHQ6CisKKwkJY2FzZSBFU1BfU1RFUF9BU0VMOgorCQkJLyogQXJiaXRyYXRpb24gd29uLCB0YXJnZXQgc2VsZWN0ZWQsIGJ1dAorCQkJICogd2UgYXJlIGluIHNvbWUgcGhhc2Ugd2hpY2ggaXMgbm90IGNvbW1hbmQKKwkJCSAqIHBoYXNlIG5vciBpcyBpdCBtZXNzYWdlIG91dCBwaGFzZS4KKwkJCSAqCisJCQkgKiBYWFggV2UndmUgY29uZnVzZWQgdGhlIHRhcmdldCwgb2J2aW91c2x5LgorCQkJICogWFhYIFNvIGNsZWFyIGl0J3Mgc3RhdGUsIGJ1dCB3ZSBhbHNvIGVuZAorCQkJICogWFhYIHVwIGNsZWFyaW5nIGV2ZXJ5b25lIGVsc2VzLiAgVGhhdCBpc24ndAorCQkJICogWFhYIHNvIG5pY2UuICBJJ2QgbGlrZSB0byBqdXN0IHJlc2V0IHRoaXMKKwkJCSAqIFhYWCB0YXJnZXQsIGJ1dCBpZiBJIGNhbm5vdCBldmVuIGdldCBpdCdzCisJCQkgKiBYWFggYXR0ZW50aW9uIGFuZCBmaW5pc2ggc2VsZWN0aW9uIHRvIHRhbGsKKwkJCSAqIFhYWCB0byBpdCwgdGhlcmUgaXMgbm90IG11Y2ggbW9yZSBJIGNhbiBkby4KKwkJCSAqIFhYWCBJZiB3ZSBoYXZlIGEgbG9hZGVkIGJ1cyB3ZSdyZSBnb2luZyB0bworCQkJICogWFhYIHNwZW5kIHRoZSBuZXh0IHNlY29uZCBvciBzbyByZW5lZ290aWF0aW5nCisJCQkgKiBYWFggZm9yIHN5bmNocm9ub3VzIHRyYW5zZmVycy4KKwkJCSAqLworCQkJRVNQTE9HKCgiZXNwJWQ6IFNURVBfQVNFTCBmb3IgdGd0ICVkXG4iLAorCQkJCWVzcC0+ZXNwX2lkLCBTQ3B0ci0+ZGV2aWNlLT5pZCkpOworCisJCWNhc2UgRVNQX1NURVBfU0lEOgorCQkJLyogQXJiaXRyYXRpb24gd29uLCB0YXJnZXQgc2VsZWN0ZWQsIHdlbnQKKwkJCSAqIHRvIG1lc3NhZ2Ugb3V0IHBoYXNlLCBzZW50IG9uZSBtZXNzYWdlCisJCQkgKiBieXRlLCB0aGVuIHdlIHN0b3BwZWQuICBBVE4gaXMgYXNzZXJ0ZWQKKwkJCSAqIG9uIHRoZSBTQ1NJIGJ1cyBhbmQgdGhlIHRhcmdldCBpcyBzdGlsbAorCQkJICogdGhlcmUgaGFuZ2luZyBvbi4gIFRoaXMgaXMgYSBsZWdhbAorCQkJICogc2VxdWVuY2Ugc3RlcCBpZiB3ZSBnYXZlIHRoZSBFU1AgYSBzZWxlY3QKKwkJCSAqIGFuZCBzdG9wIGNvbW1hbmQuCisJCQkgKgorCQkJICogWFhYIFNlZSBhYm92ZSwgSSBjb3VsZCBzZXQgdGhlIGJvcmtlbiBmbGFnCisJCQkgKiBYWFggaW4gdGhlIGRldmljZSBzdHJ1Y3QgYW5kIHJldHJ5IHRoZQorCQkJICogWFhYIGNvbW1hbmQuICBCdXQgd291bGQgdGhhdCBoZWxwIGZvcgorCQkJICogWFhYIHRhZ2dlZCBjYXBhYmxlIHRhcmdldHM/CisJCQkgKi8KKworCQljYXNlIEVTUF9TVEVQX05DTUQ6CisJCQkvKiBBcmJpdHJhdGlvbiB3b24sIHRhcmdldCBzZWxlY3RlZCwgbWF5YmUKKwkJCSAqIHNlbnQgdGhlIG9uZSBtZXNzYWdlIGJ5dGUgaW4gbWVzc2FnZSBvdXQKKwkJCSAqIHBoYXNlLCBidXQgd2UgZGlkIG5vdCBnbyB0byBjb21tYW5kIHBoYXNlCisJCQkgKiBpbiB0aGUgZW5kLiAgQWN0dWFsbHksIHdlIGNvdWxkIGhhdmUgc2VudAorCQkJICogb25seSBzb21lIG9mIHRoZSBtZXNzYWdlIGJ5dGVzIGlmIHdlIHRyaWVkCisJCQkgKiB0byBzZW5kIG91dCB0aGUgZW50aXJlIGlkZW50aWZ5IGFuZCB0YWcKKwkJCSAqIG1lc3NhZ2UgdXNpbmcgRVNQX0NNRF9TQTMuCisJCQkgKi8KKwkJCWNtZF9ieXRlc19zZW50ID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgRVNQX1NURVBfUFBDOgorCQkJLyogTm8sIG5vdCB0aGUgcG93ZXJQQyBwaW5oZWFkLiAgQXJiaXRyYXRpb24KKwkJCSAqIHdvbiwgYWxsIG1lc3NhZ2UgYnl0ZXMgc2VudCBpZiB3ZSB3ZW50IHRvCisJCQkgKiBtZXNzYWdlIG91dCBwaGFzZSwgd2VudCB0byBjb21tYW5kIHBoYXNlCisJCQkgKiBidXQgb25seSBwYXJ0IG9mIHRoZSBjb21tYW5kIHdhcyBzZW50LgorCQkJICoKKwkJCSAqIFhYWCBJJ3ZlIHNlZW4gdGhpcywgYnV0IHVzdWFsbHkgaW4gY29uanVuY3Rpb24KKwkJCSAqIFhYWCB3aXRoIGEgZ3Jvc3MgZXJyb3Igd2hpY2ggYXBwZWFycyB0byBoYXZlCisJCQkgKiBYWFggb2NjdXJyZWQgYmV0d2VlbiB0aGUgdGltZSBJIHRvbGQgdGhlCisJCQkgKiBYWFggRVNQIHRvIGFyYml0cmF0ZSBhbmQgd2hlbiBJIGdvdCB0aGUKKwkJCSAqIFhYWCBpbnRlcnJ1cHQuICBDb3VsZCBJIGhhdmUgbWlzbG9hZGVkIHRoZQorCQkJICogWFhYIGNvbW1hbmQgYnl0ZXMgaW50byB0aGUgZmlmbz8gIEFjdHVhbGx5LAorCQkJICogWFhYIEkgbW9zdCBsaWtlbHkgbWlzc2VkIGEgcGhhc2UsIGFuZCB0aGVyZWZvcmUKKwkJCSAqIFhYWCB3ZW50IGludG8gbmV2ZXIgbmV2ZXIgbGFuZCBhbmQgZGlkbid0IGV2ZW4KKwkJCSAqIFhYWCBrbm93IGl0LiAgVGhhdCB3YXMgdGhlIG9sZCBkcml2ZXIgdGhvdWdoLgorCQkJICogWFhYIFdoYXQgaXMgZXZlbiBtb3JlIHBlY3VsaWFyIGlzIHRoYXQgdGhlIEVTUAorCQkJICogWFhYIHNob3dlZCB0aGUgcHJvcGVyIGZ1bmN0aW9uIGNvbXBsZXRlIGFuZAorCQkJICogWFhYIGJ1cyBzZXJ2aWNlIGJpdHMgaW4gdGhlIGludGVycnVwdCByZWdpc3Rlci4KKwkJCSAqLworCisJCWNhc2UgRVNQX1NURVBfRklOSTQ6CisJCWNhc2UgRVNQX1NURVBfRklOSTU6CisJCWNhc2UgRVNQX1NURVBfRklOSTY6CisJCWNhc2UgRVNQX1NURVBfRklOSTc6CisJCQkvKiBBY2NvdW50IGZvciB0aGUgaWRlbnRpZnkgbWVzc2FnZSAqLworCQkJaWYgKFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fc2xjdF9ub3JtKQorCQkJCWNtZF9ieXRlc19zZW50IC09IDE7CisJCX07CisKKwkJaWYgKGVzcC0+ZXJldiAhPSBmYXNobWUpCisJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9OVUxMKTsKKworCQkvKiBCZSBjYXJlZnVsLCB3ZSBjb3VsZCByZWFsbHkgZ2V0IGZ1Y2tlZCBkdXJpbmcgc3luY2hyb25vdXMKKwkJICogZGF0YSB0cmFuc2ZlcnMgaWYgd2UgdHJ5IHRvIGZsdXNoIHRoZSBmaWZvIG5vdy4KKwkJICovCisJCWlmICgoZXNwLT5lcmV2ICE9IGZhc2htZSkgJiYgLyogbm90IGEgSGFwcHkgTWVhbCBhbmQuLi4gKi8KKwkJICAgICFmY250ICYmIC8qIEZpZm8gaXMgZW1wdHkgYW5kLi4uICovCisJCSAgICAvKiBlaXRoZXIgd2UgYXJlIG5vdCBkb2luZyBzeW5jaHJvbm91cyB0cmFuc2ZlcnMgb3IuLi4gKi8KKwkJICAgICghZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0IHx8CisJCSAgICAgLyogV2UgYXJlIG5vdCBnb2luZyBpbnRvIGRhdGEgaW4gcGhhc2UuICovCisJCSAgICAgKChlc3AtPnNyZWcgJiBFU1BfU1RBVF9QTUFTSykgIT0gRVNQX0RJUCkpKQorCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfRkxVU0gpOyAvKiBmbHVzaCBpcyBzYWZlICovCisKKwkJLyogU2VlIGhvdyBmYXIgd2UgZ290IGlmIHRoaXMgaXMgbm90IGEgc2xvdyBjb21tYW5kLiAqLworCQlpZiAoIWVzcC0+ZXNwX3Nsb3djbWQpIHsKKwkJCWlmIChjbWRfYnl0ZXNfc2VudCA8IDApCisJCQkJY21kX2J5dGVzX3NlbnQgPSAwOworCQkJaWYgKGNtZF9ieXRlc19zZW50ICE9IFNDcHRyLT5jbWRfbGVuKSB7CisJCQkJLyogQ3JhcG9sYSwgbWFyayBpdCBhcyBhIHNsb3djbWQKKwkJCQkgKiBzbyB0aGF0IHdlIGhhdmUgc29tZSBjaGFuY2Ugb2YKKwkJCQkgKiBrZWVwaW5nIHRoZSBjb21tYW5kIGFsaXZlIHdpdGgKKwkJCQkgKiBnb29kIGx1Y2suCisJCQkJICoKKwkJCQkgKiBYWFggQWN0dWFsbHksIGlmIHdlIGRpZG4ndCBzZW5kIGl0IGFsbAorCQkJCSAqIFhYWCB0aGlzIG1lYW5zIGVpdGhlciB3ZSBkaWRuJ3Qgc2V0IHRoaW5ncworCQkJCSAqIFhYWCB1cCBwcm9wZXJseSAoZHJpdmVyIGJ1Zykgb3IgdGhlIHRhcmdldAorCQkJCSAqIFhYWCBvciB0aGUgRVNQIGRldGVjdGVkIHBhcml0eSBvbiBvbmUgb2YKKwkJCQkgKiBYWFggdGhlIGNvbW1hbmQgYnl0ZXMuICBUaGlzIG1ha2VzIG11Y2gKKwkJCQkgKiBYWFggbW9yZSBzZW5zZSwgYW5kIHRoZXJlZm9yZSB0aGlzIGNvZGUKKwkJCQkgKiBYWFggc2hvdWxkIGJlIGNoYW5nZWQgdG8gc2VuZCBvdXQgYQorCQkJCSAqIFhYWCBwYXJpdHkgZXJyb3IgbWVzc2FnZSBvciBpZiB0aGUgc3RhdHVzCisJCQkJICogWFhYIHJlZ2lzdGVyIHNob3dzIG5vIHBhcml0eSBlcnJvciB0aGVuCisJCQkJICogWFhYIGp1c3QgZXhwZWN0IHRoZSB0YXJnZXQgdG8gYnJpbmcgdGhlCisJCQkJICogWFhYIGJ1cyBpbnRvIG1lc3NhZ2UgaW4gcGhhc2Ugc28gdGhhdCBpdAorCQkJCSAqIFhYWCBjYW4gc2VuZCB1cyB0aGUgcGFyaXR5IGVycm9yIG1lc3NhZ2UuCisJCQkJICogWFhYIFNDU0kgc3Vja3MuLi4KKwkJCQkgKi8KKwkJCQllc3AtPmVzcF9zbG93Y21kID0gMTsKKwkJCQllc3AtPmVzcF9zY21kcCA9ICYoU0NwdHItPmNtbmRbY21kX2J5dGVzX3NlbnRdKTsKKwkJCQllc3AtPmVzcF9zY21kbGVmdCA9IChTQ3B0ci0+Y21kX2xlbiAtIGNtZF9ieXRlc19zZW50KTsKKwkJCX0KKwkJfQorCisJCS8qIE5vdyBmaWd1cmUgb3V0IHdoZXJlIHdlIHdlbnQuICovCisJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJCXJldHVybiBlc3BfZG9fcGhhc2VfZGV0ZXJtaW5lKGVzcCk7CisJfQorCisJLyogRGlkIHRoZSB0YXJnZXQgZXZlbiBtYWtlIGl0PyAqLworCWlmIChlc3AtPmlyZWcgPT0gRVNQX0lOVFJfREMpIHsKKwkJLyogd2hlZWUuLi4gbm9ib2R5IHRoZXJlIG9yIHRoZXkgZGlkbid0IGxpa2UKKwkJICogd2hhdCB3ZSB0b2xkIGl0IHRvIGRvLCBjbGVhbiB1cC4KKwkJICovCisKKwkJLyogSWYgYW55b25lIGlzIG9mZiB0aGUgYnVzLCBidXQgd29ya2luZyBvbgorCQkgKiBhIGNvbW1hbmQgaW4gdGhlIGJhY2tncm91bmQgZm9yIHVzLCB0ZWxsCisJCSAqIHRoZSBFU1AgdG8gbGlzdGVuIGZvciB0aGVtLgorCQkgKi8KKwkJaWYgKGVzcC0+ZGlzY29ubmVjdGVkX1NDKQorCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfRVNFTCk7CisKKwkJaWYgKCgoMTw8U0NwdHItPmRldmljZS0+aWQpICYgZXNwLT50YXJnZXRzX3ByZXNlbnQpICYmCisJCSAgICBlc3AtPnNlcXJlZyAhPSAwICYmCisJCSAgICAoZXNwLT5jdXJfbXNnb3V0WzBdID09IEVYVEVOREVEX01FU1NBR0UpICYmCisJCSAgICAoU0NwdHItPlNDcC5waGFzZSA9PSBpbl9zbGN0X21zZyB8fAorCQkgICAgIFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fc2xjdF9zdG9wKSkgeworCQkJLyogc2hpdCAqLworCQkJZXNwLT5zbmlwID0gMDsKKwkJCUVTUExPRygoImVzcCVkOiBGYWlsZWQgc3luY2hyb25vdXMgbmVnb3RpYXRpb24gZm9yIHRhcmdldCAlZCAiCisJCQkJImx1biAlZFxuIiwgZXNwLT5lc3BfaWQsIFNDcHRyLT5kZXZpY2UtPmlkLCBTQ3B0ci0+ZGV2aWNlLT5sdW4pKTsKKwkJCWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCA9IDA7CisJCQllc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgPSAwOworCQkJZXNwX2Rldi0+c3luYyA9IDE7IC8qIHNvIHdlIGRvbid0IG5lZ290aWF0ZSBhZ2FpbiAqLworCisJCQkvKiBSdW4gdGhlIGNvbW1hbmQgYWdhaW4sIHRoaXMgdGltZSB0aG91Z2ggd2UKKwkJCSAqIHdvbid0IHRyeSB0byBuZWdvdGlhdGUgZm9yIHN5bmNocm9ub3VzIHRyYW5zZmVycy4KKwkJCSAqCisJCQkgKiBYWFggSSdkIGxpa2UgdG8gZG8gc29tZXRoaW5nIGxpa2Ugc2VuZCBhbgorCQkJICogWFhYIElOSVRJQVRPUl9FUlJPUiBvciBBQk9SVCBtZXNzYWdlIHRvIHRoZQorCQkJICogWFhYIHRhcmdldCB0byB0ZWxsIGl0LCAiU29ycnkgSSBjb25mdXNlZCB5b3UsCisJCQkgKiBYWFggcGxlYXNlIGNvbWUgYmFjayBhbmQgSSB3aWxsIGJlIG5pY2VyIG5leHQKKwkJCSAqIFhYWCB0aW1lIi4gIEJ1dCB0aGF0IHJlcXVpcmVzIGhhdmluZyB0aGUgdGFyZ2V0CisJCQkgKiBYWFggb24gdGhlIGJ1cywgYW5kIGl0IGhhcyBkcm9wcGVkIEJTWSBvbiB1cy4KKwkJCSAqLworCQkJZXNwLT5jdXJyZW50X1NDID0gTlVMTDsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBub3RfaXNzdWVkKTsKKwkJCXByZXBlbmRfU0MoJmVzcC0+aXNzdWVfU0MsIFNDcHRyKTsKKwkJCWVzcF9leGVjX2NtZChlc3ApOworCQkJcmV0dXJuIGRvX2ludHJfZW5kOworCQl9CisKKwkJLyogT2ssIHRoaXMgaXMgbm9ybWFsLCB0aGlzIGlzIHdoYXQgd2Ugc2VlIGR1cmluZyBib290CisJCSAqIG9yIHdoZW5ldmVyIHdoZW4gd2UgYXJlIHNjYW5uaW5nIHRoZSBidXMgZm9yIHRhcmdldHMuCisJCSAqIEJ1dCBmaXJzdCBtYWtlIHN1cmUgdGhhdCBpcyByZWFsbHkgd2hhdCBpcyBoYXBwZW5pbmcuCisJCSAqLworCQlpZiAoKCgxPDxTQ3B0ci0+ZGV2aWNlLT5pZCkgJiBlc3AtPnRhcmdldHNfcHJlc2VudCkpIHsKKwkJCUVTUExPRygoImVzcCVkOiBXYXJuaW5nLCBsaXZlIHRhcmdldCAlZCBub3QgcmVzcG9uZGluZyB0byAiCisJCQkJInNlbGVjdGlvbi5cbiIsIGVzcC0+ZXNwX2lkLCBTQ3B0ci0+ZGV2aWNlLT5pZCkpOworCisJCQkvKiBUaGlzIF9DQU5fIGhhcHBlbi4gIFRoZSBTQ1NJIHN0YW5kYXJkIHN0YXRlcyB0aGF0CisJCQkgKiB0aGUgdGFyZ2V0IGlzIHRvIF9ub3RfIHJlc3BvbmQgdG8gc2VsZWN0aW9uIGlmCisJCQkgKiBfaXRfIGRldGVjdHMgYmFkIHBhcml0eSBvbiB0aGUgYnVzIGZvciBhbnkgcmVhc29uLgorCQkJICogVGhlcmVmb3JlLCB3ZSBhc3N1bWUgdGhhdCBpZiB3ZSd2ZSB0YWxrZWQgc3VjY2Vzc2Z1bGx5CisJCQkgKiB0byB0aGlzIHRhcmdldCBiZWZvcmUsIGJhZCBwYXJpdHkgaXMgdGhlIHByb2JsZW0uCisJCQkgKi8KKwkJCWVzcF9kb25lKGVzcCwgKERJRF9QQVJJVFkgPDwgMTYpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEVsc2UsIHRoZXJlIHJlYWxseSBpc24ndCBhbnlvbmUgdGhlcmUuICovCisJCQlFU1BNSVNDKCgiZXNwOiBzZWxlY3Rpb24gZmFpbHVyZSwgbWF5YmUgbm9ib2R5IHRoZXJlP1xuIikpOworCQkJRVNQTUlTQygoImVzcDogdGFyZ2V0ICVkIGx1biAlZFxuIiwKKwkJCQkgU0NwdHItPmRldmljZS0+aWQsIFNDcHRyLT5kZXZpY2UtPmx1bikpOworCQkJZXNwX2RvbmUoZXNwLCAoRElEX0JBRF9UQVJHRVQgPDwgMTYpKTsKKwkJfQorCQlyZXR1cm4gZG9faW50cl9lbmQ7CisJfQorCisJRVNQTE9HKCgiZXNwJWQ6IFNlbGVjdGlvbiBmYWlsdXJlLlxuIiwgZXNwLT5lc3BfaWQpKTsKKwlwcmludGsoImVzcCVkOiBDdXJyZW50bHkgLS0gIiwgZXNwLT5lc3BfaWQpOworCWVzcF9wcmludF9pcmVnKGVzcC0+aXJlZyk7IHByaW50aygiICIpOworCWVzcF9wcmludF9zdGF0cmVnKGVzcC0+c3JlZyk7IHByaW50aygiICIpOworCWVzcF9wcmludF9zZXFyZWcoZXNwLT5zZXFyZWcpOyBwcmludGsoIlxuIik7CisJcHJpbnRrKCJlc3AlZDogTmV3IC0tICIsIGVzcC0+ZXNwX2lkKTsKKwllc3AtPnNyZWcgPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfU1RBVFVTKTsKKwllc3AtPnNlcXJlZyA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9TU1RFUCk7CisJZXNwLT5pcmVnID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0lOVFJQVCk7CisJZXNwX3ByaW50X2lyZWcoZXNwLT5pcmVnKTsgcHJpbnRrKCIgIik7CisJZXNwX3ByaW50X3N0YXRyZWcoZXNwLT5zcmVnKTsgcHJpbnRrKCIgIik7CisJZXNwX3ByaW50X3NlcXJlZyhlc3AtPnNlcXJlZyk7IHByaW50aygiXG4iKTsKKwlFU1BMT0coKCJlc3AlZDogcmVzZXR0aW5nIGJ1c1xuIiwgZXNwLT5lc3BfaWQpKTsKKwlyZXR1cm4gZG9fcmVzZXRfYnVzOyAvKiB1Z2guLi4gKi8KK30KKworLyogQ29udGludWUgcmVhZGluZyBieXRlcyBmb3IgbXNnaW4gcGhhc2UuICovCitzdGF0aWMgaW50IGVzcF9kb19tc2dpbmNvbnQoc3RydWN0IGVzcCAqZXNwKQoreworCWlmIChlc3AtPmlyZWcgJiBFU1BfSU5UUl9CU0VSVikgeworCQkvKiBpbiB0aGUgcmlnaHQgcGhhc2UgdG9vPyAqLworCQlpZiAoKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BNQVNLKSA9PSBFU1BfTUlQKSB7CisJCQkvKiBwaGV3Li4uICovCisJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9USSk7CisJCQllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX21zZ2luZG9uZSk7CisJCQlyZXR1cm4gZG9faW50cl9lbmQ7CisJCX0KKworCQkvKiBXZSBjaGFuZ2VkIHBoYXNlIGJ1dCBFU1Agc2hvd3MgYnVzIHNlcnZpY2UsCisJCSAqIGluIHRoaXMgY2FzZSBpdCBpcyBtb3N0IGxpa2VseSB0aGF0IHdlLCB0aGUKKwkJICogaGFja2VyIHdobyBoYXMgYmVlbiB1cCBmb3IgMjBocnMgc3RyYWlnaHQKKwkJICogc3RhcmluZyBhdCB0aGUgc2NyZWVuLCBkcm93bmVkIGluIGNvZmZlZQorCQkgKiBzbWVsbGluZyBsaWtlIHJldGNoZWQgY2lnYXJldHRlIGFzaGVzCisJCSAqIGhhdmUgbWlzY29kZWQgc29tZXRoaW5nLi4uLi4gc28sIHRyeSB0bworCQkgKiByZWNvdmVyIGFzIGJlc3Qgd2UgY2FuLgorCQkgKi8KKwkJRVNQTE9HKCgiZXNwJWQ6IG1lc3NhZ2UgaW4gbWlzLWNhcnJpYWdlLlxuIiwgZXNwLT5lc3BfaWQpKTsKKwl9CisJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl90aGVfZGFyayk7CisJcmV0dXJuIGRvX3BoYXNlX2RldGVybWluZTsKK30KKworc3RhdGljIGludCBjaGVja19zaW5nbGVieXRlX21zZyhzdHJ1Y3QgZXNwICplc3ApCit7CisJZXNwLT5wcmV2bXNnaW4gPSBlc3AtPmN1cl9tc2dpblswXTsKKwlpZiAoZXNwLT5jdXJfbXNnaW5bMF0gJiAweDgwKSB7CisJCS8qIHdoZWVlLi4uICovCisJCUVTUExPRygoImVzcCVkOiB0YXJnZXQgc2VuZHMgaWRlbnRpZnkgYW1pZHN0IHBoYXNlc1xuIiwKKwkJCWVzcC0+ZXNwX2lkKSk7CisJCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fdGhlX2RhcmspOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKCgoZXNwLT5jdXJfbXNnaW5bMF0gJiAweGYwKSA9PSAweDIwKSB8fAorCQkgICAoZXNwLT5jdXJfbXNnaW5bMF0gPT0gRVhURU5ERURfTUVTU0FHRSkpIHsKKwkJZXNwLT5tc2dpbl9sZW4gPSAyOworCQllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX21zZ2luY29udCk7CisJCXJldHVybiAwOworCX0KKwllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX3RoZV9kYXJrKTsKKwlzd2l0Y2ggKGVzcC0+Y3VyX21zZ2luWzBdKSB7CisJZGVmYXVsdDoKKwkJLyogV2UgZG9uJ3Qgd2FudCB0byBoZWFyIGFib3V0IGl0LiAqLworCQlFU1BMT0coKCJlc3AlZDogbXNnICUwMnggd2hpY2ggd2UgZG9uJ3Qga25vdyBhYm91dFxuIiwgZXNwLT5lc3BfaWQsCisJCQllc3AtPmN1cl9tc2dpblswXSkpOworCQlyZXR1cm4gTUVTU0FHRV9SRUpFQ1Q7CisKKwljYXNlIE5PUDoKKwkJRVNQTE9HKCgiZXNwJWQ6IHRhcmdldCAlZCBzZW5kcyBhIG5vcFxuIiwgZXNwLT5lc3BfaWQsCisJCQllc3AtPmN1cnJlbnRfU0MtPmRldmljZS0+aWQpKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFJFU1RPUkVfUE9JTlRFUlM6CisJCS8qIEluIHRoaXMgY2FzZSB3ZSBtaWdodCBhbHNvIGhhdmUgdG8gYmFja3VwIHRoZQorCQkgKiAic2xvdyBjb21tYW5kIiBwb2ludGVyLiAgSXQgaXMgcmFyZSB0byBnZXQgc3VjaAorCQkgKiBhIHNhdmUvcmVzdG9yZSBwb2ludGVyIHNlcXVlbmNlIHNvIGVhcmx5IGluIHRoZQorCQkgKiBidXMgdHJhbnNpdGlvbiBzZXF1ZW5jZXMsIGJ1dCBjb3ZlciBpdC4KKwkJICovCisJCWlmIChlc3AtPmVzcF9zbG93Y21kKSB7CisJCQllc3AtPmVzcF9zY21kbGVmdCA9IGVzcC0+Y3VycmVudF9TQy0+Y21kX2xlbjsKKwkJCWVzcC0+ZXNwX3NjbWRwID0gJmVzcC0+Y3VycmVudF9TQy0+Y21uZFswXTsKKwkJfQorCQllc3BfcmVzdG9yZV9wb2ludGVycyhlc3AsIGVzcC0+Y3VycmVudF9TQyk7CisJCXJldHVybiAwOworCisJY2FzZSBTQVZFX1BPSU5URVJTOgorCQllc3Bfc2F2ZV9wb2ludGVycyhlc3AsIGVzcC0+Y3VycmVudF9TQyk7CisJCXJldHVybiAwOworCisJY2FzZSBDT01NQU5EX0NPTVBMRVRFOgorCWNhc2UgRElTQ09OTkVDVDoKKwkJLyogRnJlZWluZyB0aGUgYnVzLCBsZXQgaXQgZ28uICovCisJCWVzcC0+Y3VycmVudF9TQy0+U0NwLnBoYXNlID0gaW5fZnJlZWluZzsKKwkJcmV0dXJuIDA7CisKKwljYXNlIE1FU1NBR0VfUkVKRUNUOgorCQlFU1BNSVNDKCgibXNnIHJlamVjdCwgIikpOworCQlpZiAoZXNwLT5wcmV2bXNnb3V0ID09IEVYVEVOREVEX01FU1NBR0UpIHsKKwkJCXN0cnVjdCBlc3BfZGV2aWNlICplc3BfZGV2ID0gZXNwLT5jdXJyZW50X1NDLT5kZXZpY2UtPmhvc3RkYXRhOworCisJCQkvKiBEb2Vzbid0IGxvb2sgbGlrZSB0aGlzIHRhcmdldCBjYW4KKwkJCSAqIGRvIHN5bmNocm9ub3VzIG9yIFdJREUgdHJhbnNmZXJzLgorCQkJICovCisJCQlFU1BTRFRSKCgiZ290IHJlamVjdCwgd2FzIHRyeWluZyBuZWdvLCBjbGVhcmluZyBzeW5jL1dJREVcbiIpKTsKKwkJCWVzcF9kZXYtPnN5bmMgPSAxOworCQkJZXNwX2Rldi0+d2lkZSA9IDE7CisJCQllc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgPSAwOworCQkJZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0ID0gMDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJRVNQTUlTQygoIm5vdCBzeW5jIG5lZ28sIHNlbmRpbmcgQUJPUlRcbiIpKTsKKwkJCXJldHVybiBBQk9SVDsKKwkJfQorCX07Cit9CisKKy8qIFRhcmdldCBuZWdvdGlhdGVzIGZvciBzeW5jaHJvbm91cyB0cmFuc2ZlcnMgYmVmb3JlIHdlIGRvLCB0aGlzCisgKiBpcyBsZWdhbCBhbHRob3VnaCB2ZXJ5IHN0cmFuZ2UuICBXaGF0IGlzIGV2ZW4gZnVubmllciBpcyB0aGF0CisgKiB0aGUgU0NTSTIgc3RhbmRhcmQgc3BlY2lmaWNhbGx5IHJlY29tbWVuZHMgYWdhaW5zdCB0YXJnZXRzIGRvaW5nCisgKiB0aGlzIGJlY2F1c2Ugc28gbWFueSBpbml0aWF0b3JzIGNhbm5vdCBjb3BlIHdpdGggdGhpcyBvY2N1cnJpbmcuCisgKi8KK3N0YXRpYyBpbnQgdGFyZ2V0X3dpdGhfYW50c19pbl9wYW50cyhzdHJ1Y3QgZXNwICplc3AsCisJCQkJICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3B0ciwKKwkJCQkgICAgIHN0cnVjdCBlc3BfZGV2aWNlICplc3BfZGV2KQoreworCWlmIChlc3BfZGV2LT5zeW5jIHx8IFNDcHRyLT5kZXZpY2UtPmJvcmtlbikgeworCQkvKiBzb3JyeSwgbm8gY2FuIGRvICovCisJCUVTUFNEVFIoKCJmb3JjaW5nIHRvIGFzeW5jLCAiKSk7CisJCWJ1aWxkX3N5bmNfbmVnb19tc2coZXNwLCAwLCAwKTsKKwkJZXNwX2Rldi0+c3luYyA9IDE7CisJCWVzcC0+c25pcCA9IDE7CisJCUVTUExPRygoImVzcCVkOiBob3BpbmcgZm9yIG1zZ291dFxuIiwgZXNwLT5lc3BfaWQpKTsKKwkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKKwkJcmV0dXJuIEVYVEVOREVEX01FU1NBR0U7CisJfQorCisJLyogT2ssIHdlJ2xsIGNoZWNrIHRoZW0gb3V0Li4uICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmNfcmVwb3J0KHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlpbnQgbXNnMywgbXNnNDsKKwljaGFyICp0eXBlOworCisJbXNnMyA9IGVzcC0+Y3VyX21zZ2luWzNdOworCW1zZzQgPSBlc3AtPmN1cl9tc2dpbls0XTsKKwlpZiAobXNnNCkgeworCQlpbnQgaHogPSAxMDAwMDAwMDAwIC8gKG1zZzMgKiA0KTsKKwkJaW50IGludGVnZXIgPSBoeiAvIDEwMDAwMDA7CisJCWludCBmcmFjdGlvbiA9IChoeiAtIChpbnRlZ2VyICogMTAwMDAwMCkpIC8gMTAwMDA7CisJCWlmICgoZXNwLT5lcmV2ID09IGZhc2htZSkgJiYKKwkJICAgIChlc3AtPmNvbmZpZzNbZXNwLT5jdXJyZW50X1NDLT5kZXZpY2UtPmlkXSAmIEVTUF9DT05GSUczX0VXSURFKSkgeworCQkJdHlwZSA9ICJGQVNULVdJREUiOworCQkJaW50ZWdlciA8PD0gMTsKKwkJCWZyYWN0aW9uIDw8PSAxOworCQl9IGVsc2UgaWYgKChtc2czICogNCkgPCAyMDApIHsKKwkJCXR5cGUgPSAiRkFTVCI7CisJCX0gZWxzZSB7CisJCQl0eXBlID0gInN5bmNocm9ub3VzIjsKKwkJfQorCisJCS8qIERvIG5vdCB0cmFuc2Zvcm0gdGhpcyBiYWNrIGludG8gb25lIGJpZyBwcmludGsKKwkJICogYWdhaW4sIGl0IHRyaWdnZXJzIGEgYnVnIGluIG91ciBzcGFyYzY0LWdjYzI3MgorCQkgKiBzaWJsaW5nIGNhbGwgb3B0aW1pemF0aW9uLiAgLURhdmVNCisJCSAqLworCQlFU1BMT0coKEtFUk5fSU5GTyAiZXNwJWQ6IHRhcmdldCAlZCAiLAorCQkJZXNwLT5lc3BfaWQsIGVzcC0+Y3VycmVudF9TQy0+ZGV2aWNlLT5pZCkpOworCQlFU1BMT0coKCJbcGVyaW9kICVkbnMgb2Zmc2V0ICVkICVkLiUwMmRNSHogIiwKKwkJCShpbnQpIG1zZzMgKiA0LCAoaW50KSBtc2c0LAorCQkJaW50ZWdlciwgZnJhY3Rpb24pKTsKKwkJRVNQTE9HKCgiJXMgU0NTSSVzXVxuIiwgdHlwZSwKKwkJCSgoKG1zZzMgKiA0KSA8IDIwMCkgPyAiLUlJIiA6ICIiKSkpOworCX0gZWxzZSB7CisJCUVTUExPRygoS0VSTl9JTkZPICJlc3AlZDogdGFyZ2V0ICVkIGFzeW5jaHJvbm91c1xuIiwKKwkJCWVzcC0+ZXNwX2lkLCBlc3AtPmN1cnJlbnRfU0MtPmRldmljZS0+aWQpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfbXVsdGlieXRlX21zZyhzdHJ1Y3QgZXNwICplc3ApCit7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7CisJc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPSBTQ3B0ci0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwl1OCByZWd2YWwgPSAwOworCWludCBtZXNzYWdlX291dCA9IDA7CisKKwlFU1BTRFRSKCgiY2hrIG11bHRpYnl0ZSBtc2c6ICIpKTsKKwlpZiAoZXNwLT5jdXJfbXNnaW5bMl0gPT0gRVhURU5ERURfU0RUUikgeworCQlpbnQgcGVyaW9kID0gZXNwLT5jdXJfbXNnaW5bM107CisJCWludCBvZmZzZXQgPSBlc3AtPmN1cl9tc2dpbls0XTsKKworCQlFU1BTRFRSKCgiaXMgc3luYyBuZWdvIHJlc3BvbnNlLCAiKSk7CisJCWlmICghZXNwLT5zbmlwKSB7CisJCQlpbnQgcnZhbDsKKworCQkJLyogVGFyZ2V0IG5lZ290aWF0ZXMgZmlyc3QhICovCisJCQlFU1BTRFRSKCgidGFyZ2V0IGp1bXBzIHRoZSBndW4sICIpKTsKKwkJCW1lc3NhZ2Vfb3V0ID0gRVhURU5ERURfTUVTU0FHRTsgLyogd2UgbXVzdCByZXNwb25kICovCisJCQlydmFsID0gdGFyZ2V0X3dpdGhfYW50c19pbl9wYW50cyhlc3AsIFNDcHRyLCBlc3BfZGV2KTsKKwkJCWlmIChydmFsKQorCQkJCXJldHVybiBydmFsOworCQl9CisKKwkJRVNQU0RUUigoImV4YW1pbmluZyBzZHRyLCAiKSk7CisKKwkJLyogT2Zmc2V0IGNhbm5vdCBiZSBsYXJnZXIgdGhhbiBFU1AgZmlmbyBzaXplLiAqLworCQlpZiAob2Zmc2V0ID4gMTUpIHsKKwkJCUVTUFNEVFIoKCJvZmZzZXQgdG9vIGJpZyAlMngsICIsIG9mZnNldCkpOworCQkJb2Zmc2V0ID0gMTU7CisJCQlFU1BTRFRSKCgic2VuZGluZyBiYWNrIG5ldyBvZmZzZXRcbiIpKTsKKwkJCWJ1aWxkX3N5bmNfbmVnb19tc2coZXNwLCBwZXJpb2QsIG9mZnNldCk7CisJCQlyZXR1cm4gRVhURU5ERURfTUVTU0FHRTsKKwkJfQorCisJCWlmIChvZmZzZXQgJiYgcGVyaW9kID4gZXNwLT5tYXhfcGVyaW9kKSB7CisJCQkvKiBZZWVlLCBhc3luYyBmb3IgdGhpcyBzbG93IGRldmljZS4gKi8KKwkJCUVTUFNEVFIoKCJwZXJpb2QgdG9vIGxvbmcgJTJ4LCAiLCBwZXJpb2QpKTsKKwkJCWJ1aWxkX3N5bmNfbmVnb19tc2coZXNwLCAwLCAwKTsKKwkJCUVTUFNEVFIoKCJob3BpbmcgZm9yIG1zZ291dFxuIikpOworCQkJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl90aGVfZGFyayk7CisJCQlyZXR1cm4gRVhURU5ERURfTUVTU0FHRTsKKwkJfSBlbHNlIGlmIChvZmZzZXQgJiYgcGVyaW9kIDwgZXNwLT5taW5fcGVyaW9kKSB7CisJCQlFU1BTRFRSKCgicGVyaW9kIHRvbyBzaG9ydCAlMngsICIsIHBlcmlvZCkpOworCQkJcGVyaW9kID0gZXNwLT5taW5fcGVyaW9kOworCQkJaWYgKGVzcC0+ZXJldiA+IGVzcDIzNikKKwkJCQlyZWd2YWwgPSA0OworCQkJZWxzZQorCQkJCXJlZ3ZhbCA9IDU7CisJCX0gZWxzZSBpZiAob2Zmc2V0KSB7CisJCQlpbnQgdG1wOworCisJCQlFU1BTRFRSKCgicGVyaW9kIGlzIG9rLCAiKSk7CisJCQl0bXAgPSBlc3AtPmNjeWNsZSAvIDEwMDA7CisJCQlyZWd2YWwgPSAoKChwZXJpb2QgPDwgMikgKyB0bXAgLSAxKSAvIHRtcCk7CisJCQlpZiAocmVndmFsICYmICgoZXNwLT5lcmV2ID09IGZhczEwMGEgfHwKKwkJCQkJZXNwLT5lcmV2ID09IGZhczIzNiAgfHwKKwkJCQkJZXNwLT5lcmV2ID09IGZhc2htZSkpKSB7CisJCQkJaWYgKHBlcmlvZCA+PSA1MCkKKwkJCQkJcmVndmFsLS07CisJCQl9CisJCX0KKworCQlpZiAob2Zmc2V0KSB7CisJCQl1OCBiaXQ7CisKKwkJCWVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZCA9IChyZWd2YWwgJiAweDFmKTsKKwkJCWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCA9IChvZmZzZXQgfCBlc3AtPnJhZGVsYXkpOworCQkJaWYgKGVzcC0+ZXJldiA9PSBmYXMxMDBhIHx8IGVzcC0+ZXJldiA9PSBmYXMyMzYgfHwgZXNwLT5lcmV2ID09IGZhc2htZSkgeworCQkJCWlmICgoZXNwLT5lcmV2ID09IGZhczEwMGEpIHx8IChlc3AtPmVyZXYgPT0gZmFzaG1lKSkKKwkJCQkJYml0ID0gRVNQX0NPTkZJRzNfRkFTVDsKKwkJCQllbHNlCisJCQkJCWJpdCA9IEVTUF9DT05GSUczX0ZTQ1NJOworCQkJCWlmIChwZXJpb2QgPCA1MCkgeworCQkJCQkvKiBPbiBGQVMzNjYsIGlmIHVzaW5nIGZhc3QtMjAgc3luY2hyb25vdXMgdHJhbnNmZXJzCisJCQkJCSAqIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBSRVEvQUNLIGFzc2VydC9kZWFzc2VydAorCQkJCQkgKiBjb250cm9sIGJpdHMgYXJlIGNsZWFyLgorCQkJCQkgKi8KKwkJCQkJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpCisJCQkJCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgJj0gfmVzcC0+cmFkZWxheTsKKwkJCQkJZXNwLT5jb25maWczW1NDcHRyLT5kZXZpY2UtPmlkXSB8PSBiaXQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJZXNwLT5jb25maWczW1NDcHRyLT5kZXZpY2UtPmlkXSAmPSB+Yml0OworCQkJCX0KKwkJCQllc3AtPnByZXZfY2ZnMyA9IGVzcC0+Y29uZmlnM1tTQ3B0ci0+ZGV2aWNlLT5pZF07CisJCQkJc2J1c193cml0ZWIoZXNwLT5wcmV2X2NmZzMsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMyk7CisJCQl9CisJCQllc3AtPnByZXZfc29mZiA9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldDsKKwkJCWVzcC0+cHJldl9zdHAgPSBlc3BfZGV2LT5zeW5jX21pbl9wZXJpb2Q7CisJCQlzYnVzX3dyaXRlYihlc3AtPnByZXZfc29mZiwgZXNwLT5lcmVncyArIEVTUF9TT0ZGKTsKKwkJCXNidXNfd3JpdGViKGVzcC0+cHJldl9zdHAsIGVzcC0+ZXJlZ3MgKyBFU1BfU1RQKTsKKwkJCUVTUFNEVFIoKCJzb2ZmPSUyeCBzdHA9JTJ4IGNmZzM9JTJ4XG4iLAorCQkJCSBlc3BfZGV2LT5zeW5jX21heF9vZmZzZXQsCisJCQkJIGVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZCwKKwkJCQkgZXNwLT5jb25maWczW1NDcHRyLT5kZXZpY2UtPmlkXSkpOworCisJCQllc3AtPnNuaXAgPSAwOworCQl9IGVsc2UgaWYgKGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCkgeworCQkJdTggYml0OworCisJCQkvKiBiYWNrIHRvIGFzeW5jIG1vZGUgKi8KKwkJCUVTUFNEVFIoKCJ1bmFjY2FwdGFibGUgc3luYyBuZWdvLCBmb3JjaW5nIGFzeW5jXG4iKSk7CisJCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgPSAwOworCQkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gMDsKKwkJCWVzcC0+cHJldl9zb2ZmID0gMDsKKwkJCWVzcC0+cHJldl9zdHAgPSAwOworCQkJc2J1c193cml0ZWIoZXNwLT5wcmV2X3NvZmYsIGVzcC0+ZXJlZ3MgKyBFU1BfU09GRik7CisJCQlzYnVzX3dyaXRlYihlc3AtPnByZXZfc3RwLCBlc3AtPmVyZWdzICsgRVNQX1NUUCk7CisJCQlpZiAoZXNwLT5lcmV2ID09IGZhczEwMGEgfHwgZXNwLT5lcmV2ID09IGZhczIzNiB8fCBlc3AtPmVyZXYgPT0gZmFzaG1lKSB7CisJCQkJaWYgKChlc3AtPmVyZXYgPT0gZmFzMTAwYSkgfHwgKGVzcC0+ZXJldiA9PSBmYXNobWUpKQorCQkJCQliaXQgPSBFU1BfQ09ORklHM19GQVNUOworCQkJCWVsc2UKKwkJCQkJYml0ID0gRVNQX0NPTkZJRzNfRlNDU0k7CisJCQkJZXNwLT5jb25maWczW1NDcHRyLT5kZXZpY2UtPmlkXSAmPSB+Yml0OworCQkJCWVzcC0+cHJldl9jZmczID0gZXNwLT5jb25maWczW1NDcHRyLT5kZXZpY2UtPmlkXTsKKwkJCQlzYnVzX3dyaXRlYihlc3AtPnByZXZfY2ZnMywgZXNwLT5lcmVncyArIEVTUF9DRkczKTsKKwkJCX0KKwkJfQorCisJCXN5bmNfcmVwb3J0KGVzcCk7CisKKwkJRVNQU0RUUigoImNoayBtdWx0aWJ5dGUgbXNnOiBzeW5jIGlzIGtub3duLCAiKSk7CisJCWVzcF9kZXYtPnN5bmMgPSAxOworCisJCWlmIChtZXNzYWdlX291dCkgeworCQkJRVNQTE9HKCgiZXNwJWQ6IHNlbmRpbmcgc2R0ciBiYWNrLCBob3BpbmcgZm9yIG1zZ291dFxuIiwKKwkJCQllc3AtPmVzcF9pZCkpOworCQkJYnVpbGRfc3luY19uZWdvX21zZyhlc3AsIHBlcmlvZCwgb2Zmc2V0KTsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJCQlyZXR1cm4gRVhURU5ERURfTUVTU0FHRTsKKwkJfQorCisJCUVTUFNEVFIoKCJyZXR1cm5pbmcgemVyb1xuIikpOworCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOyAvKiAuLi5vciBlbHNlISAqLworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGVzcC0+Y3VyX21zZ2luWzJdID09IEVYVEVOREVEX1dEVFIpIHsKKwkJaW50IHNpemUgPSA4IDw8IGVzcC0+Y3VyX21zZ2luWzNdOworCisJCWVzcC0+d25pcCA9IDA7CisJCWlmIChlc3AtPmVyZXYgIT0gZmFzaG1lKSB7CisJCQlFU1BMT0coKCJlc3AlZDogQUlFRUUgd2lkZSBtc2cgcmVjZWl2ZWQgYW5kIG5vdCBITUUuXG4iLAorCQkJCWVzcC0+ZXNwX2lkKSk7CisJCQltZXNzYWdlX291dCA9IE1FU1NBR0VfUkVKRUNUOworCQl9IGVsc2UgaWYgKHNpemUgPiAxNikgeworCQkJRVNQTE9HKCgiZXNwJWQ6IEFJRUVFIHdpZGUgdHJhbnNmZXIgZm9yICVkIHNpemUgIgorCQkJCSJub3Qgc3VwcG9ydGVkLlxuIiwgZXNwLT5lc3BfaWQsIHNpemUpKTsKKwkJCW1lc3NhZ2Vfb3V0ID0gTUVTU0FHRV9SRUpFQ1Q7CisJCX0gZWxzZSB7CisJCQkvKiBUaGluZ3MgbG9vayBnb29kOyBsZXQncyBzZWUgd2hhdCB3ZSBnb3QuICovCisJCQlpZiAoc2l6ZSA9PSAxNikgeworCQkJCS8qIFNldCBjb25maWcgMyByZWdpc3RlciBmb3IgdGhpcyB0YXJnZXQuICovCisJCQkJZXNwLT5jb25maWczW1NDcHRyLT5kZXZpY2UtPmlkXSB8PSBFU1BfQ09ORklHM19FV0lERTsKKwkJCX0gZWxzZSB7CisJCQkJLyogSnVzdCBtYWtlIHN1cmUgaXQgd2FzIG9uZSBieXRlIHNpemVkLiAqLworCQkJCWlmIChzaXplICE9IDgpIHsKKwkJCQkJRVNQTE9HKCgiZXNwJWQ6IEFpZWVlLCB3aWRlIG5lZ28gb2YgJWQgc2l6ZS5cbiIsCisJCQkJCQllc3AtPmVzcF9pZCwgc2l6ZSkpOworCQkJCQltZXNzYWdlX291dCA9IE1FU1NBR0VfUkVKRUNUOworCQkJCQlnb3RvIGZpbmlzaDsKKwkJCQl9CisJCQkJLyogUHVyZSBwYXJhbm9pYS4gKi8KKwkJCQllc3AtPmNvbmZpZzNbU0NwdHItPmRldmljZS0+aWRdICY9IH4oRVNQX0NPTkZJRzNfRVdJREUpOworCQkJfQorCQkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPmNvbmZpZzNbU0NwdHItPmRldmljZS0+aWRdOworCQkJc2J1c193cml0ZWIoZXNwLT5wcmV2X2NmZzMsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMyk7CisKKwkJCS8qIFJlZ2FyZGxlc3MsIG5leHQgdHJ5IGZvciBzeW5jIHRyYW5zZmVycy4gKi8KKwkJCWJ1aWxkX3N5bmNfbmVnb19tc2coZXNwLCBlc3AtPnN5bmNfZGVmcCwgMTUpOworCQkJZXNwX2Rldi0+c3luYyA9IDE7CisJCQllc3AtPnNuaXAgPSAxOworCQkJbWVzc2FnZV9vdXQgPSBFWFRFTkRFRF9NRVNTQUdFOworCQl9CisJfSBlbHNlIGlmIChlc3AtPmN1cl9tc2dpblsyXSA9PSBFWFRFTkRFRF9NT0RJRllfREFUQV9QT0lOVEVSKSB7CisJCUVTUExPRygoImVzcCVkOiByZWplY3RpbmcgbW9kaWZ5IGRhdGEgcHRyIG1zZ1xuIiwgZXNwLT5lc3BfaWQpKTsKKwkJbWVzc2FnZV9vdXQgPSBNRVNTQUdFX1JFSkVDVDsKKwl9CitmaW5pc2g6CisJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKKwlyZXR1cm4gbWVzc2FnZV9vdXQ7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2RvX21zZ2luZG9uZShzdHJ1Y3QgZXNwICplc3ApCit7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7CisJaW50IG1lc3NhZ2Vfb3V0ID0gMCwgaXQgPSAwLCBydmFsOworCisJcnZhbCA9IHNraXBhaGVhZDEoZXNwLCBTQ3B0ciwgaW5fbXNnaW4sIGluX21zZ2luZG9uZSk7CisJaWYgKHJ2YWwpCisJCXJldHVybiBydmFsOworCWlmIChTQ3B0ci0+U0NwLnNlbnRfY29tbWFuZCAhPSBpbl9zdGF0dXMpIHsKKwkJaWYgKCEoZXNwLT5pcmVnICYgRVNQX0lOVFJfREMpKSB7CisJCQlpZiAoZXNwLT5tc2dpbl9sZW4gJiYgKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BFUlIpKSB7CisJCQkJbWVzc2FnZV9vdXQgPSBNU0dfUEFSSVRZX0VSUk9SOworCQkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKKwkJCX0gZWxzZSBpZiAoZXNwLT5lcmV2ICE9IGZhc2htZSAmJgorCQkJICAoaXQgPSAoc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0ZGTEFHUykgJiBFU1BfRkZfRkJZVEVTKSkgIT0gMSkgeworCQkJCS8qIFdlIGNlcnRhaW5seSBkcm9wcGVkIHRoZSBiYWxsIHNvbWV3aGVyZS4gKi8KKwkJCQltZXNzYWdlX291dCA9IElOSVRJQVRPUl9FUlJPUjsKKwkJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7CisJCQl9IGVsc2UgaWYgKCFlc3AtPm1zZ2luX2xlbikgeworCQkJCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKQorCQkJCQlpdCA9IGVzcC0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9idWZmZXJbMF07CisJCQkJZWxzZQorCQkJCQlpdCA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9GREFUQSk7CisJCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX21zZ2luY29udCk7CisJCQl9IGVsc2UgeworCQkJCS8qIGl0IGlzIG9rIGFuZCB3ZSB3YW50IGl0ICovCisJCQkJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpCisJCQkJCWl0ID0gZXNwLT5jdXJfbXNnaW5bZXNwLT5tc2dpbl9jdHJdID0KKwkJCQkJCWVzcC0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9idWZmZXJbMF07CisJCQkJZWxzZQorCQkJCQlpdCA9IGVzcC0+Y3VyX21zZ2luW2VzcC0+bXNnaW5fY3RyXSA9CisJCQkJCQlzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfRkRBVEEpOworCQkJCWVzcC0+bXNnaW5fY3RyKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOworCQkJcmV0dXJuIGRvX3dvcmtfYnVzOworCQl9CisJfSBlbHNlIHsKKwkJaXQgPSBlc3AtPmN1cl9tc2dpblswXTsKKwl9CisJaWYgKCFtZXNzYWdlX291dCAmJiBlc3AtPm1zZ2luX2xlbikgeworCQlpZiAoZXNwLT5tc2dpbl9jdHIgPCBlc3AtPm1zZ2luX2xlbikgeworCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX21zZ2luY29udCk7CisJCX0gZWxzZSBpZiAoZXNwLT5tc2dpbl9sZW4gPT0gMSkgeworCQkJbWVzc2FnZV9vdXQgPSBjaGVja19zaW5nbGVieXRlX21zZyhlc3ApOworCQl9IGVsc2UgaWYgKGVzcC0+bXNnaW5fbGVuID09IDIpIHsKKwkJCWlmIChlc3AtPmN1cl9tc2dpblswXSA9PSBFWFRFTkRFRF9NRVNTQUdFKSB7CisJCQkJaWYgKChpdCArIDIpID49IDE1KSB7CisJCQkJCW1lc3NhZ2Vfb3V0ID0gTUVTU0FHRV9SRUpFQ1Q7CisJCQkJfSBlbHNlIHsKKwkJCQkJZXNwLT5tc2dpbl9sZW4gPSAoaXQgKyAyKTsKKwkJCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX21zZ2luY29udCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQltZXNzYWdlX291dCA9IE1FU1NBR0VfUkVKRUNUOyAvKiBmb28gb24geW91ICovCisJCQl9CisJCX0gZWxzZSB7CisJCQltZXNzYWdlX291dCA9IGNoZWNrX211bHRpYnl0ZV9tc2coZXNwKTsKKwkJfQorCX0KKwlpZiAobWVzc2FnZV9vdXQgPCAwKSB7CisJCXJldHVybiAtbWVzc2FnZV9vdXQ7CisJfSBlbHNlIGlmIChtZXNzYWdlX291dCkgeworCQlpZiAoKChtZXNzYWdlX291dCAhPSAxKSAmJgorCQkgICAgICgobWVzc2FnZV9vdXQgPCAweDIwKSB8fCAobWVzc2FnZV9vdXQgJiAweDgwKSkpKQorCQkJZXNwLT5tc2dvdXRfbGVuID0gMTsKKwkJZXNwLT5jdXJfbXNnb3V0WzBdID0gbWVzc2FnZV9vdXQ7CisJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX1NBVE4pOworCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOworCQllc3AtPm1zZ2luX2xlbiA9IDA7CisJfQorCWVzcC0+c3JlZyA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9TVEFUVVMpOworCWVzcC0+c3JlZyAmPSB+KEVTUF9TVEFUX0lOVFIpOworCWlmICgoZXNwLT5zcmVnICYgKEVTUF9TVEFUX1BNU0d8RVNQX1NUQVRfUENEKSkgPT0gKEVTUF9TVEFUX1BNU0d8RVNQX1NUQVRfUENEKSkKKwkJZXNwX2NtZChlc3AsIEVTUF9DTURfTU9LKTsKKwlpZiAoKFNDcHRyLT5TQ3Auc2VudF9jb21tYW5kID09IGluX21zZ2luZG9uZSkgJiYKKwkgICAgKFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fZnJlZWluZykpCisJCXJldHVybiBlc3BfZG9fZnJlZWJ1cyhlc3ApOworCXJldHVybiBkb19pbnRyX2VuZDsKK30KKworc3RhdGljIGludCBlc3BfZG9fY21kYmVnaW4oc3RydWN0IGVzcCAqZXNwKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKlNDcHRyID0gZXNwLT5jdXJyZW50X1NDOworCisJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX2NtZGVuZCk7CisJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpIHsKKwkJdTMyIHRtcCA9IHNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpOworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgZXNwLT5lc3Bfc2NtZGxlZnQ7IGkrKykKKwkJCWVzcC0+ZXNwX2NvbW1hbmRbaV0gPSAqZXNwLT5lc3Bfc2NtZHArKzsKKwkJZXNwLT5lc3Bfc2NtZGxlZnQgPSAwOworCQllc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7CisJCWVzcF9zZXRjb3VudChlc3AtPmVyZWdzLCBpLCAxKTsKKwkJZXNwX2NtZChlc3AsIChFU1BfQ01EX0RNQSB8IEVTUF9DTURfVEkpKTsKKwkJdG1wIHw9IChETUFfU0NTSV9ESVNBQiB8IERNQV9FTkFCTEUpOworCQl0bXAgJj0gfihETUFfU1RfV1JJVEUpOworCQlzYnVzX3dyaXRlbChpLCBlc3AtPmRyZWdzICsgRE1BX0NPVU5UKTsKKwkJc2J1c193cml0ZWwoZXNwLT5lc3BfY29tbWFuZF9kdm1hLCBlc3AtPmRyZWdzICsgRE1BX0FERFIpOworCQlzYnVzX3dyaXRlbCh0bXAsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwl9IGVsc2UgeworCQl1OCB0bXA7CisKKwkJZXNwX2NtZChlc3AsIEVTUF9DTURfRkxVU0gpOworCQl0bXAgPSAqZXNwLT5lc3Bfc2NtZHArKzsKKwkJZXNwLT5lc3Bfc2NtZGxlZnQtLTsKKwkJc2J1c193cml0ZWIodG1wLCBlc3AtPmVyZWdzICsgRVNQX0ZEQVRBKTsKKwkJZXNwX2NtZChlc3AsIEVTUF9DTURfVEkpOworCX0KKwlyZXR1cm4gZG9faW50cl9lbmQ7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2RvX2NtZGRvbmUoc3RydWN0IGVzcCAqZXNwKQoreworCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKQorCQlkbWFfaW52YWxpZGF0ZShlc3ApOworCWVsc2UKKwkJZXNwX2NtZChlc3AsIEVTUF9DTURfTlVMTCk7CisKKwlpZiAoZXNwLT5pcmVnICYgRVNQX0lOVFJfQlNFUlYpIHsKKwkJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl90aGVfZGFyayk7CisJCXJldHVybiBlc3BfZG9fcGhhc2VfZGV0ZXJtaW5lKGVzcCk7CisJfQorCisJRVNQTE9HKCgiZXNwJWQ6IGluIGRvX2NtZGRvbmUoKSBidXQgZGlkbid0IGdldCBCU0VSViBpbnRlcnJ1cHQuXG4iLAorCQllc3AtPmVzcF9pZCkpOworCXJldHVybiBkb19yZXNldF9idXM7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2RvX21zZ291dChzdHJ1Y3QgZXNwICplc3ApCit7CisJZXNwX2NtZChlc3AsIEVTUF9DTURfRkxVU0gpOworCXN3aXRjaCAoZXNwLT5tc2dvdXRfbGVuKSB7CisJY2FzZSAxOgorCQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkKKwkJCWhtZV9maWZvX3B1c2goZXNwLCAmZXNwLT5jdXJfbXNnb3V0WzBdLCAxKTsKKwkJZWxzZQorCQkJc2J1c193cml0ZWIoZXNwLT5jdXJfbXNnb3V0WzBdLCBlc3AtPmVyZWdzICsgRVNQX0ZEQVRBKTsKKworCQllc3BfY21kKGVzcCwgRVNQX0NNRF9USSk7CisJCWJyZWFrOworCisJY2FzZSAyOgorCQllc3AtPmVzcF9jb21tYW5kWzBdID0gZXNwLT5jdXJfbXNnb3V0WzBdOworCQllc3AtPmVzcF9jb21tYW5kWzFdID0gZXNwLT5jdXJfbXNnb3V0WzFdOworCisJCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKSB7CisJCQlobWVfZmlmb19wdXNoKGVzcCwgJmVzcC0+Y3VyX21zZ291dFswXSwgMik7CisJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9USSk7CisJCX0gZWxzZSB7CisJCQlkbWFfc2V0dXAoZXNwLCBlc3AtPmVzcF9jb21tYW5kX2R2bWEsIDIsIDApOworCQkJZXNwX3NldGNvdW50KGVzcC0+ZXJlZ3MsIDIsIDApOworCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfRE1BIHwgRVNQX0NNRF9USSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDQ6CisJCWVzcC0+ZXNwX2NvbW1hbmRbMF0gPSBlc3AtPmN1cl9tc2dvdXRbMF07CisJCWVzcC0+ZXNwX2NvbW1hbmRbMV0gPSBlc3AtPmN1cl9tc2dvdXRbMV07CisJCWVzcC0+ZXNwX2NvbW1hbmRbMl0gPSBlc3AtPmN1cl9tc2dvdXRbMl07CisJCWVzcC0+ZXNwX2NvbW1hbmRbM10gPSBlc3AtPmN1cl9tc2dvdXRbM107CisJCWVzcC0+c25pcCA9IDE7CisKKwkJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpIHsKKwkJCWhtZV9maWZvX3B1c2goZXNwLCAmZXNwLT5jdXJfbXNnb3V0WzBdLCA0KTsKKwkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX1RJKTsKKwkJfSBlbHNlIHsKKwkJCWRtYV9zZXR1cChlc3AsIGVzcC0+ZXNwX2NvbW1hbmRfZHZtYSwgNCwgMCk7CisJCQllc3Bfc2V0Y291bnQoZXNwLT5lcmVncywgNCwgMCk7CisJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9ETUEgfCBFU1BfQ01EX1RJKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgNToKKwkJZXNwLT5lc3BfY29tbWFuZFswXSA9IGVzcC0+Y3VyX21zZ291dFswXTsKKwkJZXNwLT5lc3BfY29tbWFuZFsxXSA9IGVzcC0+Y3VyX21zZ291dFsxXTsKKwkJZXNwLT5lc3BfY29tbWFuZFsyXSA9IGVzcC0+Y3VyX21zZ291dFsyXTsKKwkJZXNwLT5lc3BfY29tbWFuZFszXSA9IGVzcC0+Y3VyX21zZ291dFszXTsKKwkJZXNwLT5lc3BfY29tbWFuZFs0XSA9IGVzcC0+Y3VyX21zZ291dFs0XTsKKwkJZXNwLT5zbmlwID0gMTsKKworCQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkgeworCQkJaG1lX2ZpZm9fcHVzaChlc3AsICZlc3AtPmN1cl9tc2dvdXRbMF0sIDUpOworCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfVEkpOworCQl9IGVsc2UgeworCQkJZG1hX3NldHVwKGVzcCwgZXNwLT5lc3BfY29tbWFuZF9kdm1hLCA1LCAwKTsKKwkJCWVzcF9zZXRjb3VudChlc3AtPmVyZWdzLCA1LCAwKTsKKwkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0RNQSB8IEVTUF9DTURfVEkpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogd2hvb3BzICovCisJCUVTUE1JU0MoKCJib2d1cyBtc2dvdXQgc2VuZGluZyBOT1BcbiIpKTsKKwkJZXNwLT5jdXJfbXNnb3V0WzBdID0gTk9QOworCisJCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKSB7CisJCQlobWVfZmlmb19wdXNoKGVzcCwgJmVzcC0+Y3VyX21zZ291dFswXSwgMSk7CisJCX0gZWxzZSB7CisJCQlzYnVzX3dyaXRlYihlc3AtPmN1cl9tc2dvdXRbMF0sIGVzcC0+ZXJlZ3MgKyBFU1BfRkRBVEEpOworCQl9CisKKwkJZXNwLT5tc2dvdXRfbGVuID0gMTsKKwkJZXNwX2NtZChlc3AsIEVTUF9DTURfVEkpOworCQlicmVhazsKKwl9OworCisJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9tc2dvdXRkb25lKTsKKwlyZXR1cm4gZG9faW50cl9lbmQ7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2RvX21zZ291dGRvbmUoc3RydWN0IGVzcCAqZXNwKQoreworCWlmIChlc3AtPm1zZ291dF9sZW4gPiAxKSB7CisJCS8qIFhYWCBITUUvRkFTIEFUTiBkZWFzc2VydCB3b3JrYXJvdW5kIHJlcXVpcmVkLAorCQkgKiBYWFggbm8gRE1BIGZsdXNoaW5nLCBvbmx5IHBvc3NpYmxlIEVTUF9DTURfRkxVU0gKKwkJICogWFhYIHRvIGtpbGwgdGhlIGZpZm8uCisJCSAqLworCQlpZiAoZXNwLT5lcmV2ICE9IGZhc2htZSkgeworCQkJdTMyIHRtcDsKKworCQkJd2hpbGUgKCh0bXAgPSBzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKSkgJiBETUFfUEVORF9SRUFEKQorCQkJCXVkZWxheSgxKTsKKwkJCXRtcCAmPSB+RE1BX0VOQUJMRTsKKwkJCXNidXNfd3JpdGVsKHRtcCwgZXNwLT5kcmVncyArIERNQV9DU1IpOworCQkJZG1hX2ludmFsaWRhdGUoZXNwKTsKKwkJfSBlbHNlIHsKKwkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKKwkJfQorCX0KKwlpZiAoIShlc3AtPmlyZWcgJiBFU1BfSU5UUl9EQykpIHsKKwkJaWYgKGVzcC0+ZXJldiAhPSBmYXNobWUpCisJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9OVUxMKTsKKwkJc3dpdGNoIChlc3AtPnNyZWcgJiBFU1BfU1RBVF9QTUFTSykgeworCQljYXNlIEVTUF9NT1A6CisJCQkvKiB3aG9vcHMsIHBhcml0eSBlcnJvciAqLworCQkJRVNQTE9HKCgiZXNwJWQ6IHN0aWxsIGluIG1zZ291dCwgcGFyaXR5IGVycm9yIGFzc3VtZWRcbiIsCisJCQkJZXNwLT5lc3BfaWQpKTsKKwkJCWlmIChlc3AtPm1zZ291dF9sZW4gPiAxKQorCQkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX1NBVE4pOworCQkJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9tc2dvdXQpOworCQkJcmV0dXJuIGRvX3dvcmtfYnVzOworCisJCWNhc2UgRVNQX0RJUDoKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvKiBIYXBweSBNZWFsIGZpZm8gaXMgdG91Y2h5Li4uICovCisJCQlpZiAoKGVzcC0+ZXJldiAhPSBmYXNobWUpICYmCisJCQkgICAgIWZjb3VudChlc3ApICYmCisJCQkgICAgISgoKHN0cnVjdCBlc3BfZGV2aWNlICopZXNwLT5jdXJyZW50X1NDLT5kZXZpY2UtPmhvc3RkYXRhKS0+c3luY19tYXhfb2Zmc2V0KSkKKwkJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7CisJCQlicmVhazsKKworCQl9OworCX0gZWxzZSB7CisJCUVTUExPRygoImVzcCVkOiBkaXNjb25uZWN0LCByZXNldHRpbmcgYnVzXG4iLCBlc3AtPmVzcF9pZCkpOworCQlyZXR1cm4gZG9fcmVzZXRfYnVzOworCX0KKworCS8qIElmIHdlIHNlbnQgb3V0IGEgc3luY2hyb25vdXMgbmVnb3RpYXRpb24gbWVzc2FnZSwgdXBkYXRlCisJICogb3VyIHN0YXRlLgorCSAqLworCWlmIChlc3AtPmN1cl9tc2dvdXRbMl0gPT0gRVhURU5ERURfTUVTU0FHRSAmJgorCSAgICBlc3AtPmN1cl9tc2dvdXRbNF0gPT0gRVhURU5ERURfU0RUUikgeworCQllc3AtPnNuaXAgPSAxOyAvKiBhbmFsIHJldGVudGl2ZW5lc3MuLi4gKi8KKwl9CisKKwllc3AtPnByZXZtc2dvdXQgPSBlc3AtPmN1cl9tc2dvdXRbMF07CisJZXNwLT5tc2dvdXRfbGVuID0gMDsKKwllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX3RoZV9kYXJrKTsKKwlyZXR1cm4gZXNwX2RvX3BoYXNlX2RldGVybWluZShlc3ApOworfQorCitzdGF0aWMgaW50IGVzcF9idXNfdW5leHBlY3RlZChzdHJ1Y3QgZXNwICplc3ApCit7CisJRVNQTE9HKCgiZXNwJWQ6IGNvbW1hbmQgaW4gd2VpcmQgc3RhdGUgJTJ4XG4iLAorCQllc3AtPmVzcF9pZCwgZXNwLT5jdXJyZW50X1NDLT5TQ3AucGhhc2UpKTsKKwlyZXR1cm4gZG9fcmVzZXRfYnVzOworfQorCitzdGF0aWMgZXNwZnVuY190IGJ1c192ZWN0b3JbXSA9IHsKKwllc3BfZG9fZGF0YV9maW5hbGUsCisJZXNwX2RvX2RhdGFfZmluYWxlLAorCWVzcF9idXNfdW5leHBlY3RlZCwKKwllc3BfZG9fbXNnaW4sCisJZXNwX2RvX21zZ2luY29udCwKKwllc3BfZG9fbXNnaW5kb25lLAorCWVzcF9kb19tc2dvdXQsCisJZXNwX2RvX21zZ291dGRvbmUsCisJZXNwX2RvX2NtZGJlZ2luLAorCWVzcF9kb19jbWRkb25lLAorCWVzcF9kb19zdGF0dXMsCisJZXNwX2RvX2ZyZWVidXMsCisJZXNwX2RvX3BoYXNlX2RldGVybWluZSwKKwllc3BfYnVzX3VuZXhwZWN0ZWQsCisJZXNwX2J1c191bmV4cGVjdGVkLAorCWVzcF9idXNfdW5leHBlY3RlZCwKK307CisKKy8qIFRoaXMgaXMgdGhlIHNlY29uZCB0aWVyIGluIG91ciBkdWFsLWxldmVsIFNDU0kgc3RhdGUgbWFjaGluZS4gKi8KK3N0YXRpYyBpbnQgZXNwX3dvcmtfYnVzKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKKwl1bnNpZ25lZCBpbnQgcGhhc2U7CisKKwlFU1BCVVMoKCJlc3Bfd29ya19idXM6ICIpKTsKKwlpZiAoIVNDcHRyKSB7CisJCUVTUEJVUygoInJlY29ubmVjdFxuIikpOworCQlyZXR1cm4gZXNwX2RvX3JlY29ubmVjdChlc3ApOworCX0KKwlwaGFzZSA9IFNDcHRyLT5TQ3AucGhhc2U7CisJaWYgKChwaGFzZSAmIDB4ZjApID09IGluX3BoYXNlc19tYXNrKQorCQlyZXR1cm4gYnVzX3ZlY3RvclsocGhhc2UgJiAweDBmKV0oZXNwKTsKKwllbHNlIGlmICgocGhhc2UgJiAweGYwKSA9PSBpbl9zbGN0X21hc2spCisJCXJldHVybiBlc3Bfc2VsZWN0X2NvbXBsZXRlKGVzcCk7CisJZWxzZQorCQlyZXR1cm4gZXNwX2J1c191bmV4cGVjdGVkKGVzcCk7Cit9CisKK3N0YXRpYyBlc3BmdW5jX3QgaXN2Y192ZWN0b3JbXSA9IHsKKwkwLAorCWVzcF9kb19waGFzZV9kZXRlcm1pbmUsCisJZXNwX2RvX3Jlc2V0YnVzLAorCWVzcF9maW5pc2hfcmVzZXQsCisJZXNwX3dvcmtfYnVzCit9OworCisvKiBNYWluIGludGVycnVwdCBoYW5kbGVyIGZvciBhbiBlc3AgYWRhcHRlci4gKi8KK3N0YXRpYyB2b2lkIGVzcF9oYW5kbGUoc3RydWN0IGVzcCAqZXNwKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKlNDcHRyOworCWludCB3aGF0X25leHQgPSBkb19pbnRyX2VuZDsKKworCVNDcHRyID0gZXNwLT5jdXJyZW50X1NDOworCisJLyogQ2hlY2sgZm9yIGVycm9ycy4gKi8KKwllc3AtPnNyZWcgPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfU1RBVFVTKTsKKwllc3AtPnNyZWcgJj0gKH5FU1BfU1RBVF9JTlRSKTsKKwlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkgeworCQllc3AtPnNyZWcyID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NUQVRVUzIpOworCQllc3AtPnNlcXJlZyA9IChzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfU1NURVApICYgRVNQX1NURVBfVkJJVFMpOworCX0KKworCWlmIChlc3AtPnNyZWcgJiAoRVNQX1NUQVRfU1BBTSkpIHsKKwkJLyogR3Jvc3MgZXJyb3IsIGNvdWxkIGJlIGR1ZSB0byBvbmUgb2Y6CisJCSAqCisJCSAqIC0gdG9wIG9mIGZpZm8gb3ZlcndyaXR0ZW4sIGNvdWxkIGJlIGJlY2F1c2UKKwkJICogICB3ZSB0cmllZCB0byBkbyBhIHN5bmNocm9ub3VzIHRyYW5zZmVyIHdpdGgKKwkJICogICBhbiBvZmZzZXQgZ3JlYXRlciB0aGFuIEVTUCBmaWZvIHNpemUKKwkJICoKKwkJICogLSB0b3Agb2YgY29tbWFuZCByZWdpc3RlciBvdmVyd3JpdHRlbgorCQkgKgorCQkgKiAtIERNQSBzZXR1cCB0byBnbyBpbiBvbmUgZGlyZWN0aW9uLCBTQ1NJCisJCSAqICAgYnVzIHBvaW50cyBpbiB0aGUgb3RoZXIsIHdob29wcworCQkgKgorCQkgKiAtIHdlaXJkIHBoYXNlIGNoYW5nZSBkdXJpbmcgYXN5bmNocm9ub3VzCisJCSAqICAgZGF0YSBwaGFzZSB3aGlsZSB3ZSBhcmUgaW5pdGlhdG9yCisJCSAqLworCQlFU1BMT0coKCJlc3AlZDogR3Jvc3MgZXJyb3Igc3JlZz0lMnhcbiIsIGVzcC0+ZXNwX2lkLCBlc3AtPnNyZWcpKTsKKworCQkvKiBJZiBhIGNvbW1hbmQgaXMgbGl2ZSBvbiB0aGUgYnVzIHdlIGNhbm5vdCBzYWZlbHkKKwkJICogcmVzZXQgdGhlIGJ1cywgc28gd2UnbGwganVzdCBsZXQgdGhlIHBpZWNlcyBmYWxsCisJCSAqIHdoZXJlIHRoZXkgbWF5LiAgSGVyZSB3ZSBhcmUgaG9waW5nIHRoYXQgdGhlCisJCSAqIHRhcmdldCB3aWxsIGJlIGFibGUgdG8gY2xlYW5seSBnbyBhd2F5IHNvb24KKwkJICogc28gd2UgY2FuIHNhZmVseSByZXNldCB0aGluZ3MuCisJCSAqLworCQlpZiAoIVNDcHRyKSB7CisJCQlFU1BMT0coKCJlc3AlZDogTm8gY3VycmVudCBjbWQgZHVyaW5nIGdyb3NzIGVycm9yLCAiCisJCQkJInJlc2V0dGluZyBidXNcbiIsIGVzcC0+ZXNwX2lkKSk7CisJCQl3aGF0X25leHQgPSBkb19yZXNldF9idXM7CisJCQlnb3RvIHN0YXRlX21hY2hpbmU7CisJCX0KKwl9CisKKwlpZiAoc2J1c19yZWFkbChlc3AtPmRyZWdzICsgRE1BX0NTUikgJiBETUFfSE5ETF9FUlJPUikgeworCQkvKiBBIERNQSBnYXRlIGFycmF5IGVycm9yLiAgSGVyZSB3ZSBtdXN0CisJCSAqIGJlIHNlZWluZyBvbmUgb2YgdHdvIHRoaW5ncy4gIEVpdGhlciB0aGUKKwkJICogdmlydHVhbCB0byBwaHlzaWNhbCBhZGRyZXNzIHRyYW5zbGF0aW9uCisJCSAqIG9uIHRoZSBTQlVTIGNvdWxkIG5vdCBvY2N1ciwgZWxzZSB0aGUKKwkJICogdHJhbnNsYXRpb24gaXQgZGlkIGdldCBwb2ludGVkIHRvIGEgYm9ndXMKKwkJICogcGFnZS4gIEhvIGh1bS4uLgorCQkgKi8KKwkJRVNQTE9HKCgiZXNwJWQ6IERNQSBlcnJvciAlMDh4XG4iLCBlc3AtPmVzcF9pZCwKKwkJCXNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpKSk7CisKKwkJLyogRE1BIGdhdGUgYXJyYXkgaXRzZWxmIG11c3QgYmUgcmVzZXQgdG8gY2xlYXIgdGhlCisJCSAqIGVycm9yIGNvbmRpdGlvbi4KKwkJICovCisJCWVzcF9yZXNldF9kbWEoZXNwKTsKKworCQl3aGF0X25leHQgPSBkb19yZXNldF9idXM7CisJCWdvdG8gc3RhdGVfbWFjaGluZTsKKwl9CisKKwllc3AtPmlyZWcgPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfSU5UUlBUKTsgICAvKiBVbmxhdGNoIGludHIgcmVnICovCisKKwlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkgeworCQkvKiBUaGlzIGNoaXAgaXMgcmVhbGx5IGxvc2luZy4gKi8KKwkJRVNQSE1FKCgiSE1FWyIpKTsKKworCQlFU1BITUUoKCJzcmVnMj0lMDJ4LCIsIGVzcC0+c3JlZzIpKTsKKwkJLyogTXVzdCBsYXRjaCBmaWZvIGJlZm9yZSByZWFkaW5nIHRoZSBpbnRlcnJ1cHQKKwkJICogcmVnaXN0ZXIgZWxzZSBnYXJiYWdlIGVuZHMgdXAgaW4gdGhlIEZJRk8KKwkJICogd2hpY2ggY29uZnVzZXMgdGhlIGRyaXZlciB1dHRlcmx5LgorCQkgKi8KKwkJaWYgKCEoZXNwLT5zcmVnMiAmIEVTUF9TVEFUMl9GRU1QVFkpIHx8CisJCSAgICAoZXNwLT5zcmVnMiAmIEVTUF9TVEFUMl9GMUJZVEUpKSB7CisJCQlFU1BITUUoKCJmaWZvX3dvcmthcm91bmRdIikpOworCQkJaG1lX2ZpZm9fcmVhZChlc3ApOworCQl9IGVsc2UgeworCQkJRVNQSE1FKCgibm9fZmlmb193b3JrYXJvdW5kXSIpKTsKKwkJfQorCX0KKworCS8qIE5vIGN1cnJlbnQgY21kIGlzIG9ubHkgdmFsaWQgYXQgdGhpcyBwb2ludCB3aGVuIHRoZXJlIGFyZQorCSAqIGNvbW1hbmRzIG9mZiB0aGUgYnVzIG9yIHdlIGFyZSB0cnlpbmcgYSByZXNldC4KKwkgKi8KKwlpZiAoIVNDcHRyICYmICFlc3AtPmRpc2Nvbm5lY3RlZF9TQyAmJiAhKGVzcC0+aXJlZyAmIEVTUF9JTlRSX1NSKSkgeworCQkvKiBQYW5pYyBpcyBzYWZlLCBzaW5jZSBjdXJyZW50X1NDIGlzIG51bGwuICovCisJCUVTUExPRygoImVzcCVkOiBubyBjb21tYW5kIGluIGVzcF9oYW5kbGUoKVxuIiwgZXNwLT5lc3BfaWQpKTsKKwkJcGFuaWMoImVzcF9oYW5kbGU6IGN1cnJlbnRfU0MgPT0gcGVuZ3VpbiB3aXRoaW4gaW50ZXJydXB0ISIpOworCX0KKworCWlmIChlc3AtPmlyZWcgJiAoRVNQX0lOVFJfSUMpKSB7CisJCS8qIElsbGVnYWwgY29tbWFuZCBmZWQgdG8gRVNQLiAgT3V0c2lkZSBvZiBvYnZpb3VzCisJCSAqIHNvZnR3YXJlIGJ1Z3MgdGhhdCBjb3VsZCBjYXVzZSB0aGlzLCB0aGVyZSBpcworCQkgKiBhIGNvbmRpdGlvbiB3aXRoIGVzcDEwMCB3aGVyZSB3ZSBjYW4gY29uZnVzZSB0aGUKKwkJICogRVNQIGludG8gYW4gZXJyb25lb3VzIGlsbGVnYWwgY29tbWFuZCBpbnRlcnJ1cHQKKwkJICogYmVjYXVzZSBpdCBkb2VzIG5vdCBzY3JhcGUgdGhlIEZJRk8gcHJvcGVybHkKKwkJICogZm9yIHJlc2VsZWN0aW9uLiAgU2VlIGVzcDEwMF9yZWNvbm5lY3RfaHdidWcoKQorCQkgKiB0byBzZWUgaG93IHdlIHRyeSB2ZXJ5IGhhcmQgdG8gYXZvaWQgdGhpcy4KKwkJICovCisJCUVTUExPRygoImVzcCVkOiBpbnZhbGlkIGNvbW1hbmRcbiIsIGVzcC0+ZXNwX2lkKSk7CisKKwkJZXNwX2R1bXBfc3RhdGUoZXNwKTsKKworCQlpZiAoU0NwdHIgIT0gTlVMTCkgeworCQkJLyogRGV2aWNlcyB3aXRoIHZlcnkgYnVnZ3kgZmlybXdhcmUgY2FuIGRyb3AgQlNZCisJCQkgKiBkdXJpbmcgYSBzY2F0dGVyIGxpc3QgaW50ZXJydXB0IHdoZW4gdXNpbmcgc3luYworCQkJICogbW9kZSB0cmFuc2ZlcnMuICBXZSBjb250aW51ZSB0aGUgdHJhbnNmZXIgYXMKKwkJCSAqIGV4cGVjdGVkLCB0aGUgdGFyZ2V0IGRyb3BzIHRoZSBidXMsIHRoZSBFU1AKKwkJCSAqIGdldHMgY29uZnVzZWQsIGFuZCB3ZSBnZXQgYSBpbGxlZ2FsIGNvbW1hbmQKKwkJCSAqIGludGVycnVwdCBiZWNhdXNlIHRoZSBidXMgaXMgaW4gdGhlIGRpc2Nvbm5lY3RlZAorCQkJICogc3RhdGUgbm93IGFuZCBFU1BfQ01EX1RJIGlzIG9ubHkgYWxsb3dlZCB3aGVuCisJCQkgKiBhIG5leHVzIGlzIGFsaXZlIG9uIHRoZSBidXMuCisJCQkgKi8KKwkJCUVTUExPRygoImVzcCVkOiBGb3JjaW5nIGFzeW5jIGFuZCBkaXNhYmxpbmcgZGlzY29ubmVjdCBmb3IgIgorCQkJCSJ0YXJnZXQgJWRcbiIsIGVzcC0+ZXNwX2lkLCBTQ3B0ci0+ZGV2aWNlLT5pZCkpOworCQkJU0NwdHItPmRldmljZS0+Ym9ya2VuID0gMTsgLyogZm9vIG9uIHlvdSAqLworCQl9CisKKwkJd2hhdF9uZXh0ID0gZG9fcmVzZXRfYnVzOworCX0gZWxzZSBpZiAoIShlc3AtPmlyZWcgJiB+KEVTUF9JTlRSX0ZET05FIHwgRVNQX0lOVFJfQlNFUlYgfCBFU1BfSU5UUl9EQykpKSB7CisJCWlmIChTQ3B0cikgeworCQkJdW5zaWduZWQgaW50IHBoYXNlID0gU0NwdHItPlNDcC5waGFzZTsKKworCQkJaWYgKHBoYXNlICYgaW5fcGhhc2VzX21hc2spIHsKKwkJCQl3aGF0X25leHQgPSBlc3Bfd29ya19idXMoZXNwKTsKKwkJCX0gZWxzZSBpZiAocGhhc2UgJiBpbl9zbGN0X21hc2spIHsKKwkJCQl3aGF0X25leHQgPSBlc3Bfc2VsZWN0X2NvbXBsZXRlKGVzcCk7CisJCQl9IGVsc2UgeworCQkJCUVTUExPRygoImVzcCVkOiBpbnRlcnJ1cHQgZm9yIG5vIGdvb2QgcmVhc29uLi4uXG4iLAorCQkJCQllc3AtPmVzcF9pZCkpOworCQkJCXdoYXRfbmV4dCA9IGRvX2ludHJfZW5kOworCQkJfQorCQl9IGVsc2UgeworCQkJRVNQTE9HKCgiZXNwJWQ6IEJTRVJWIG9yIEZET05FIG9yIERDIHdoaWxlIFNDcHRyPT1OVUxMXG4iLAorCQkJCWVzcC0+ZXNwX2lkKSk7CisJCQl3aGF0X25leHQgPSBkb19yZXNldF9idXM7CisJCX0KKwl9IGVsc2UgaWYgKGVzcC0+aXJlZyAmIEVTUF9JTlRSX1NSKSB7CisJCUVTUExPRygoImVzcCVkOiBTQ1NJIGJ1cyByZXNldCBpbnRlcnJ1cHRcbiIsIGVzcC0+ZXNwX2lkKSk7CisJCXdoYXRfbmV4dCA9IGRvX3Jlc2V0X2NvbXBsZXRlOworCX0gZWxzZSBpZiAoZXNwLT5pcmVnICYgKEVTUF9JTlRSX1MgfCBFU1BfSU5UUl9TQVROKSkgeworCQlFU1BMT0coKCJlc3AlZDogQUlFRUUgd2UgaGF2ZSBiZWVuIHNlbGVjdGVkIGJ5IGFub3RoZXIgaW5pdGlhdG9yIVxuIiwKKwkJCWVzcC0+ZXNwX2lkKSk7CisJCXdoYXRfbmV4dCA9IGRvX3Jlc2V0X2J1czsKKwl9IGVsc2UgaWYgKGVzcC0+aXJlZyAmIEVTUF9JTlRSX1JTRUwpIHsKKwkJaWYgKFNDcHRyID09IE5VTEwpIHsKKwkJCS8qIFRoaXMgaXMgb2suICovCisJCQl3aGF0X25leHQgPSBlc3BfZG9fcmVjb25uZWN0KGVzcCk7CisJCX0gZWxzZSBpZiAoU0NwdHItPlNDcC5waGFzZSAmIGluX3NsY3RfbWFzaykgeworCQkJLyogT25seSBzZWxlY3Rpb24gY29kZSBrbm93cyBob3cgdG8gY2xlYW4KKwkJCSAqIHVwIHByb3Blcmx5LgorCQkJICovCisJCQlFU1BESVNDKCgiUmVzZWxlY3RlZCBkdXJpbmcgc2VsZWN0aW9uIGF0dGVtcHRcbiIpKTsKKwkJCXdoYXRfbmV4dCA9IGVzcF9zZWxlY3RfY29tcGxldGUoZXNwKTsKKwkJfSBlbHNlIHsKKwkJCUVTUExPRygoImVzcCVkOiBSZXNlbGVjdGVkIHdoaWxlIGJ1cyBpcyBidXN5XG4iLAorCQkJCWVzcC0+ZXNwX2lkKSk7CisJCQl3aGF0X25leHQgPSBkb19yZXNldF9idXM7CisJCX0KKwl9CisKKwkvKiBUaGlzIGlzIHRpZXItb25lIGluIG91ciBkdWFsIGxldmVsIFNDU0kgc3RhdGUgbWFjaGluZS4gKi8KK3N0YXRlX21hY2hpbmU6CisJd2hpbGUgKHdoYXRfbmV4dCAhPSBkb19pbnRyX2VuZCkgeworCQlpZiAod2hhdF9uZXh0ID49IGRvX3BoYXNlX2RldGVybWluZSAmJgorCQkgICAgd2hhdF9uZXh0IDwgZG9faW50cl9lbmQpIHsKKwkJCXdoYXRfbmV4dCA9IGlzdmNfdmVjdG9yW3doYXRfbmV4dF0oZXNwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHN0YXRlIGlzIGNvbXBsZXRlbHkgbG9zdCA7LSggKi8KKwkJCUVTUExPRygoImVzcCVkOiBpbnRlcnJ1cHQgZW5naW5lIGxvc2VzIHN0YXRlLCByZXNldHRpbmcgYnVzXG4iLAorCQkJCWVzcC0+ZXNwX2lkKSk7CisJCQl3aGF0X25leHQgPSBkb19yZXNldF9idXM7CisJCX0KKwl9Cit9CisKKy8qIFNlcnZpY2Ugb25seSB0aGUgRVNQIGRlc2NyaWJlZCBieSBkZXZfaWQuICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZXNwX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcHJlZ3MpCit7CisJc3RydWN0IGVzcCAqZXNwID0gZGV2X2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShlc3AtPmVob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlpZiAoRVNQX0lSUV9QKGVzcC0+ZHJlZ3MpKSB7CisJCUVTUF9JTlRTT0ZGKGVzcC0+ZHJlZ3MpOworCisJCUVTUElSUSgoIklbJWQ6JWRdKCIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgZXNwLT5lc3BfaWQpKTsKKwkJZXNwX2hhbmRsZShlc3ApOworCQlFU1BJUlEoKCIpIikpOworCisJCUVTUF9JTlRTT04oZXNwLT5kcmVncyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZXNwLT5laG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgZXNwX3NsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqU0RwdHIpCit7CisJc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPQorCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXNwX2RldmljZSksIEdGUF9BVE9NSUMpOworCisJaWYgKCFlc3BfZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZXNwX2RldiwgMCwgc2l6ZW9mKHN0cnVjdCBlc3BfZGV2aWNlKSk7CisJU0RwdHItPmhvc3RkYXRhID0gZXNwX2RldjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXNwX3NsYXZlX2Rlc3Ryb3koc3RydWN0IHNjc2lfZGV2aWNlICpTRHB0cikKK3sKKwlzdHJ1Y3QgZXNwICplc3AgPSAoc3RydWN0IGVzcCAqKSBTRHB0ci0+aG9zdC0+aG9zdGRhdGE7CisKKwllc3AtPnRhcmdldHNfcHJlc2VudCAmPSB+KDEgPDwgU0RwdHItPmlkKTsKKwlrZnJlZShTRHB0ci0+aG9zdGRhdGEpOworCVNEcHRyLT5ob3N0ZGF0YSA9IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJlc3AiLAorCS5wcm9jX2luZm8JCT0gZXNwX3Byb2NfaW5mbywKKwkubmFtZQkJCT0gIlN1biBFU1AgMTAwLzEwMGEvMjAwIiwKKwkuZGV0ZWN0CQkJPSBlc3BfZGV0ZWN0LAorCS5zbGF2ZV9hbGxvYwkJPSBlc3Bfc2xhdmVfYWxsb2MsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gZXNwX3NsYXZlX2Rlc3Ryb3ksCisJLnJlbGVhc2UJCT0gZXNwX3JlbGVhc2UsCisJLmluZm8JCQk9IGVzcF9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gZXNwX3F1ZXVlLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gZXNwX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGVzcF9yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IDcsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCit9OworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZXNwLmggYi9kcml2ZXJzL3Njc2kvZXNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmN2Q2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9lc3AuaApAQCAtMCwwICsxLDQxMCBAQAorLyogJElkOiBlc3AuaCx2IDEuMjkgMjAwMS8xMi8xMSAwNDo1NTo0NyBkYXZlbSBFeHAgJAorICogZXNwLmg6ICBEZWZpbmVzIGFuZCBzdHJ1Y3R1cmVzIGZvciB0aGUgU3BhcmMgRVNQIChFbmhhbmNlZCBTQ1NJCisgKiAgICAgICAgIFByb2Nlc3NvcikgZHJpdmVyIHVuZGVyIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCisgKi8KKworI2lmbmRlZiBfU1BBUkNfRVNQX0gKKyNkZWZpbmUgX1NQQVJDX0VTUF9ICisKKy8qIEZvciBkdm1hIGNvbnRyb2xsZXIgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuICovCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisvKiBUaGUgRVNQIFNDU0kgY29udHJvbGxlcnMgaGF2ZSB0aGVpciByZWdpc3RlciBzZXRzIGluIHRocmVlCisgKiAiY2xhc3NlcyI6CisgKgorICogMSkgUmVnaXN0ZXJzIHdoaWNoIGFyZSBib3RoIHJlYWQgYW5kIHdyaXRlLgorICogMikgUmVnaXN0ZXJzIHdoaWNoIGFyZSByZWFkIG9ubHkuCisgKiAzKSBSZWdpc3RlcnMgd2hpY2ggYXJlIHdyaXRlIG9ubHkuCisgKgorICogWWV0LCB0aGV5IGFsbCBsaXZlIHdpdGhpbiB0aGUgc2FtZSBJTyBzcGFjZS4KKyAqLworCisvKiBBbGwgdGhlIEVTUCByZWdpc3RlcnMgYXJlIG9uZSBieXRlIGVhY2ggYW5kIGFyZSBhY2Nlc3NlZCBsb25nd29yZHMKKyAqIGFwYXJ0IHdpdGggYSBiaWctZW5kaWFuIG9yZGVyaW5nIHRvIHRoZSBieXRlcy4KKyAqLworCQkJCQkvKiBBY2Nlc3MgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgIE9mZnNldCAqLworI2RlZmluZSBFU1BfVENMT1cJMHgwMFVMCQkvKiBydyAgTG93IGJpdHMgb2YgdGhlIHRyYW5zZmVyIGNvdW50IDB4MDAgICAqLworI2RlZmluZSBFU1BfVENNRUQJMHgwNFVMCQkvKiBydyAgTWlkIGJpdHMgb2YgdGhlIHRyYW5zZmVyIGNvdW50IDB4MDQgICAqLworI2RlZmluZSBFU1BfRkRBVEEJMHgwOFVMCQkvKiBydyAgRklGTyBkYXRhIGJpdHMgICAgICAgICAgICAgICAgIDB4MDggICAqLworI2RlZmluZSBFU1BfQ01ECQkweDBjVUwJCS8qIHJ3ICBTQ1NJIGNvbW1hbmQgYml0cyAgICAgICAgICAgICAgMHgwYyAgICovCisjZGVmaW5lIEVTUF9TVEFUVVMJMHgxMFVMCQkvKiBybyAgRVNQIHN0YXR1cyByZWdpc3RlciAgICAgICAgICAgIDB4MTAgICAqLworI2RlZmluZSBFU1BfQlVTSUQJRVNQX1NUQVRVUwkvKiB3byAgQnVzIElEIGZvciBzZWxlY3QvcmVzZWxlY3QgICAgIDB4MTAgICAqLworI2RlZmluZSBFU1BfSU5UUlBUCTB4MTRVTAkJLyogcm8gIEtpbmQgb2YgaW50ZXJydXB0ICAgICAgICAgICAgICAweDE0ICAgKi8KKyNkZWZpbmUgRVNQX1RJTUVPCUVTUF9JTlRSUFQJLyogd28gIFRpbWVvdXQgdmFsdWUgZm9yIHNlbGVjdC9yZXNlbCAweDE0ICAgKi8KKyNkZWZpbmUgRVNQX1NTVEVQCTB4MThVTAkJLyogcm8gIFNlcXVlbmNlIHN0ZXAgcmVnaXN0ZXIgICAgICAgICAweDE4ICAgKi8KKyNkZWZpbmUgRVNQX1NUUAkJRVNQX1NTVEVQCS8qIHdvICBUcmFuc2ZlciBwZXJpb2QgcGVyIHN5bmMgICAgICAgMHgxOCAgICovCisjZGVmaW5lIEVTUF9GRkxBR1MJMHgxY1VMCQkvKiBybyAgQml0cyBvZiBjdXJyZW50IEZJRk8gaW5mbyAgICAgIDB4MWMgICAqLworI2RlZmluZSBFU1BfU09GRglFU1BfRkZMQUdTCS8qIHdvICBTeW5jIG9mZnNldCAgICAgICAgICAgICAgICAgICAgMHgxYyAgICovCisjZGVmaW5lIEVTUF9DRkcxCTB4MjBVTAkJLyogcncgIEZpcnN0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgICAweDIwICAgKi8KKyNkZWZpbmUgRVNQX0NGQUNUCTB4MjRVTAkJLyogd28gIENsb2NrIGNvbnZlcnNpb24gZmFjdG9yICAgICAgICAweDI0ICAgKi8KKyNkZWZpbmUgRVNQX1NUQVRVUzIJRVNQX0NGQUNUCS8qIHJvICBITUUgc3RhdHVzMiByZWdpc3RlciAgICAgICAgICAgMHgyNCAgICovCisjZGVmaW5lIEVTUF9DVEVTVAkweDI4VUwJCS8qIHdvICBDaGlwIHRlc3QgcmVnaXN0ZXIgICAgICAgICAgICAgMHgyOCAgICovCisjZGVmaW5lIEVTUF9DRkcyCTB4MmNVTAkJLyogcncgIFNlY29uZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICAweDJjICAgKi8KKyNkZWZpbmUgRVNQX0NGRzMJMHgzMFVMCQkvKiBydyAgVGhpcmQgY29uZmlndXJhdGlvbiByZWdpc3RlciAgIDB4MzAgICAqLworI2RlZmluZSBFU1BfVENISQkweDM4VUwJCS8qIHJ3ICBIaWdoIGJpdHMgb2YgdHJhbnNmZXIgY291bnQgICAgMHgzOCAgICovCisjZGVmaW5lIEVTUF9VSUQJCUVTUF9UQ0hJCS8qIHJvICBVbmlxdWUgSUQgY29kZSAgICAgICAgICAgICAgICAgMHgzOCAgICovCisjZGVmaW5lIEZBU19STE8JCUVTUF9UQ0hJCS8qIHJ3ICBITUUgZXh0ZW5kZWQgY291bnRlciAgICAgICAgICAgMHgzOCAgICovCisjZGVmaW5lIEVTUF9GR1JORAkweDNjVUwJCS8qIHJ3ICBEYXRhIGJhc2UgZm9yIGZpZm8gICAgICAgICAgICAgMHgzYyAgICovCisjZGVmaW5lIEZBU19SSEkJCUVTUF9GR1JORAkvKiBydyAgSE1FIGV4dGVuZGVkIGNvdW50ZXIgICAgICAgICAgIDB4M2MgICAqLworI2RlZmluZSBFU1BfUkVHX1NJWkUJMHg0MFVMCisKKy8qIFZhcmlvdXMgcmV2aXNpb25zIG9mIHRoZSBFU1AgYm9hcmQuICovCitlbnVtIGVzcF9yZXYgeworCWVzcDEwMCAgICAgPSAweDAwLCAgLyogTkNSNTNDOTAgLSB2ZXJ5IGJyb2tlbiAqLworCWVzcDEwMGEgICAgPSAweDAxLCAgLyogTkNSNTNDOTBBICovCisJZXNwMjM2ICAgICA9IDB4MDIsCisJZmFzMjM2ICAgICA9IDB4MDMsCisJZmFzMTAwYSAgICA9IDB4MDQsCisJZmFzdCAgICAgICA9IDB4MDUsCisJZmFzaG1lICAgICA9IDB4MDYsCisJZXNwdW5rbm93biA9IDB4MDcKK307CisKKy8qIFdlIGFsbG9jYXRlIG9uZSBvZiB0aGVzZSBmb3IgZWFjaCBzY3NpIGRldmljZSBhbmQgYXR0YWNoIGl0IHRvCisgKiBTRHB0ci0+aG9zdGRhdGEgZm9yIHVzZSBpbiB0aGUgZHJpdmVyCisgKi8KK3N0cnVjdCBlc3BfZGV2aWNlIHsKKyAgdW5zaWduZWQgY2hhciBzeW5jX21pbl9wZXJpb2Q7CisgIHVuc2lnbmVkIGNoYXIgc3luY19tYXhfb2Zmc2V0OworICB1bnNpZ25lZCBzeW5jOjE7CisgIHVuc2lnbmVkIHdpZGU6MTsKKyAgdW5zaWduZWQgZGlzY29ubmVjdDoxOworfTsKKworc3RydWN0IHNjc2lfY21uZDsKKworLyogV2UgZ2V0IG9uZSBvZiB0aGVzZSBmb3IgZWFjaCBFU1AgcHJvYmVkLiAqLworc3RydWN0IGVzcCB7CisJdm9pZCBfX2lvbWVtCQkqZXJlZ3M7CQkvKiBFU1AgY29udHJvbGxlciByZWdpc3RlcnMgKi8KKwl2b2lkIF9faW9tZW0JCSpkcmVnczsJCS8qIERNQSBjb250cm9sbGVyIHJlZ2lzdGVycyAqLworCXN0cnVjdCBzYnVzX2RtYQkJKmRtYTsJCS8qIERNQSBjb250cm9sbGVyIHN3IHN0YXRlICovCisJc3RydWN0IFNjc2lfSG9zdAkqZWhvc3Q7CQkvKiBCYWNrcG9pbnRlciB0byBTQ1NJIEhvc3QgKi8KKwlzdHJ1Y3Qgc2J1c19kZXYJCSpzZGV2OwkJLyogUG9pbnRlciB0byBTQnVzIGVudHJ5ICovCisKKwkvKiBFU1AgQ29uZmlndXJhdGlvbiBSZWdpc3RlcnMgKi8KKwl1OAkJCWNvbmZpZzE7CS8qIENvcHkgb2YgdGhlIDFzdCBjb25maWcgcmVnaXN0ZXIgKi8KKwl1OAkJCWNvbmZpZzI7CS8qIENvcHkgb2YgdGhlIDJuZCBjb25maWcgcmVnaXN0ZXIgKi8KKwl1OAkJCWNvbmZpZzNbMTZdOwkvKiBDb3B5IG9mIHRoZSAzcmQgY29uZmlnIHJlZ2lzdGVyICovCisKKwkvKiBUaGUgY3VycmVudCBjb21tYW5kIHdlIGFyZSBzZW5kaW5nIHRvIHRoZSBFU1AgY2hpcC4gIFRoaXMgZXNwX2NvbW1hbmQKKwkgKiBwdHIgbmVlZHMgdG8gYmUgbWFwcGVkIGluIERWTUEgYXJlYSBzbyB3ZSBjYW4gc2VuZCBjb21tYW5kcyBhbmQgcmVhZAorCSAqIGZyb20gdGhlIEVTUCBmaWZvIHdpdGhvdXQgYnVybmluZyBwcmVjaW91cyBDUFUgY3ljbGVzLiAgUHJvZ3JhbW1lZCBJL08KKwkgKiBzdWNrcyB3aGVuIHdlIGhhdmUgdGhlIERWTUEgdG8gZG8gaXQgZm9yIHVzLiAgVGhlIEVTUCBpcyBzdHVwaWQgYW5kIHdpbGwKKwkgKiBvbmx5IHNlbmQgb3V0IDYsIDEwLCBhbmQgMTIgYnl0ZSBTQ1NJIGNvbW1hbmRzLCBvdGhlcnMgd2UgbmVlZCB0byBzZW5kCisJICogb25lIGJ5dGUgYXQgYSB0aW1lLiAgZXNwX3Nsb3djbWQgYmVpbmcgc2V0IHNheXMgdGhhdCB3ZSBhcmUgZG9pbmcgb25lCisJICogb2YgdGhlIGNvbW1hbmQgdHlwZXMgRVNQIGRvZXNuJ3QgdW5kZXJzdGFuZCwgZXNwX3NjbWRwIGtlZXBzIHRyYWNrIG9mCisJICogd2hpY2ggYnl0ZSB3ZSBhcmUgc2VuZGluZywgZXNwX3NjbWRsZWZ0IHNheXMgaG93IG1hbnkgYnl0ZXMgdG8gZ28uCisJICovCisJdm9sYXRpbGUgdTgJCSplc3BfY29tbWFuZDsgICAgLyogTG9jYXRpb24gb2YgY29tbWFuZCAoQ1BVIHZpZXcpICAqLworCV9fdTMyCQkJZXNwX2NvbW1hbmRfZHZtYTsvKiBMb2NhdGlvbiBvZiBjb21tYW5kIChEVk1BIHZpZXcpICovCisJdW5zaWduZWQgY2hhcgkJZXNwX2NsZW47CSAvKiBMZW5ndGggb2YgdGhpcyBjb21tYW5kICovCisJdW5zaWduZWQgY2hhcgkJZXNwX3Nsb3djbWQ7CisJdW5zaWduZWQgY2hhcgkJKmVzcF9zY21kcDsKKwl1bnNpZ25lZCBjaGFyCQllc3Bfc2NtZGxlZnQ7CisKKwkvKiBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgY2F1c2Ugb2YgYW4gSVJRLiBVcG9uIGV2ZXJ5CisJICogSVJRIGVudHJ5IHdlIHN5bmNocm9uaXplIHRoZXNlIHdpdGggdGhlIGhhcmR3YXJlIHJlZ2lzdGVycy4KKwkgKi8KKwl1OAkJCWlyZWc7CQkvKiBDb3B5IG9mIEVTUCBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKwl1OAkJCXNyZWc7CQkvKiBDb3B5IG9mIEVTUCBzdGF0dXMgcmVnaXN0ZXIgKi8KKwl1OAkJCXNlcXJlZzsJCS8qIENvcHkgb2YgRVNQIHNlcXVlbmNlIHN0ZXAgcmVnaXN0ZXIgKi8KKwl1OAkJCXNyZWcyOwkJLyogQ29weSBvZiBITUUgc3RhdHVzMiByZWdpc3RlciAqLworCisJLyogVG8gc2F2ZSByZWdpc3RlciB3cml0ZXMgdG8gdGhlIEVTUCwgd2hpY2ggY2FuIGJlIGV4cGVuc2l2ZSwgd2UKKwkgKiBrZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyB2YWx1ZSB0aGF0IHZhcmlvdXMgcmVnaXN0ZXJzIGhhZCBmb3IKKwkgKiB0aGUgbGFzdCB0YXJnZXQgd2UgY29ubmVjdGVkIHRvLiAgSWYgdGhleSBhcmUgdGhlIHNhbWUgZm9yIHRoZQorCSAqIGN1cnJlbnQgdGFyZ2V0LCB3ZSBza2lwIHRoZSByZWdpc3RlciB3cml0ZXMgYXMgdGhleSBhcmUgbm90IG5lZWRlZC4KKwkgKi8KKwl1OAkJCXByZXZfc29mZiwgcHJldl9zdHA7CisJdTgJCQlwcmV2X2NmZzMsIF9fY2FjaGVfcGFkOworCisJLyogV2UgYWxzbyBrZWVwIGEgY2FjaGUgb2YgdGhlIHByZXZpb3VzIEZBUy9ITUUgRE1BIENTUiByZWdpc3RlciB2YWx1ZS4gICovCisJdTMyCQkJcHJldl9obWVfZG1hY3NyOworCisJLyogVGhlIEhNRSBpcyB0aGUgYmlnZ2VzdCBwaWVjZSBvZiBzaGl0IEkgaGF2ZSBldmVyIHNlZW4uICovCisJdTgJCQlobWVfZmlmb193b3JrYXJvdW5kX2J1ZmZlclsxNiAqIDJdOworCXU4CQkJaG1lX2ZpZm9fd29ya2Fyb3VuZF9jb3VudDsKKworCS8qIEZvciBlYWNoIHRhcmdldCB3ZSBrZWVwIHRyYWNrIG9mIHNhdmUvcmVzdG9yZSBkYXRhCisJICogcG9pbnRlciBpbmZvcm1hdGlvbi4gIFRoaXMgbmVlZHMgdG8gYmUgdXBkYXRlZCBtYWpvcmx5CisJICogd2hlbiB3ZSBhZGQgc3VwcG9ydCBmb3IgdGFnZ2VkIHF1ZXVlaW5nLiAgLURhdmVNCisJICovCisJc3RydWN0IGVzcF9wb2ludGVycyB7CisJCWNoYXIJCQkqc2F2ZWRfcHRyOworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNhdmVkX2J1ZmZlcjsKKwkJaW50CQkJc2F2ZWRfdGhpc19yZXNpZHVhbDsKKwkJaW50CQkJc2F2ZWRfYnVmZmVyc19yZXNpZHVhbDsKKwl9IGRhdGFfcG9pbnRlcnNbMTZdIC8qWFhYIFtNQVhfVEFHU19QRVJfVEFSR0VUXSovOworCisJLyogQ2xvY2sgcGVyaW9kcywgZnJlcXVlbmNpZXMsIHN5bmNocm9uaXphdGlvbiwgZXRjLiAqLworCXVuc2lnbmVkIGludAkJY2ZyZXE7CQkvKiBDbG9jayBmcmVxdWVuY3kgaW4gSFogKi8KKwl1bnNpZ25lZCBpbnQJCWNmYWN0OwkJLyogQ2xvY2sgY29udmVyc2lvbiBmYWN0b3IgKi8KKwl1bnNpZ25lZCBpbnQJCXJhd19jZmFjdDsJLyogUmF3IGNvcHkgZnJvbSBwcm9iaW5nICovCisJdW5zaWduZWQgaW50CQljY3ljbGU7CQkvKiBPbmUgRVNQIGNsb2NrIGN5Y2xlICovCisJdW5zaWduZWQgaW50CQljdGljazsJCS8qIE9uZSBFU1AgY2xvY2sgdGltZSAqLworCXVuc2lnbmVkIGludAkJcmFkZWxheTsJLyogRkFTVCBjaGlwIHJlcS9hY2sgZGVsYXkgKi8KKwl1bnNpZ25lZCBpbnQJCW5lZ19kZWZwOwkvKiBEZWZhdWx0IG5lZ290aWF0aW9uIHBlcmlvZCAqLworCXVuc2lnbmVkIGludAkJc3luY19kZWZwOwkvKiBEZWZhdWx0IHN5bmMgdHJhbnNmZXIgcGVyaW9kICovCisJdW5zaWduZWQgaW50CQltYXhfcGVyaW9kOwkvKiBsb25nZXN0IG91ciBwZXJpb2QgY2FuIGJlICovCisJdW5zaWduZWQgaW50CQltaW5fcGVyaW9kOwkvKiBzaG9ydGVzdCBwZXJpb2Qgd2UgY2FuIHdpdGhzdGFuZCAqLworCisJc3RydWN0IGVzcAkJKm5leHQ7CQkvKiBOZXh0IEVTUCB3ZSBwcm9iZWQgb3IgTlVMTCAqLworCWNoYXIJCQlwcm9tX25hbWVbNjRdOwkvKiBOYW1lIG9mIEVTUCBkZXZpY2UgZnJvbSBwcm9tICovCisJaW50CQkJcHJvbV9ub2RlOwkvKiBQcm9tIG5vZGUgd2hlcmUgRVNQIGZvdW5kICovCisJaW50CQkJZXNwX2lkOwkJLyogVW5pcXVlIHBlci1FU1AgSUQgbnVtYmVyICovCisKKwkvKiBGb3Igc2xvdyB0byBtZWRpdW0gc3BlZWQgaW5wdXQgY2xvY2sgcmF0ZXMgd2Ugc2hvb3QgZm9yIDVtYi9zLAorCSAqIGJ1dCBmb3IgaGlnaCBpbnB1dCBjbG9jayByYXRlcyB3ZSB0cnkgdG8gZG8gMTBtYi9zIGFsdGhvdWdoIEkKKwkgKiBkb24ndCB0aGluayBhIHRyYW5zZmVyIGNhbiBldmVuIHJ1biB0aGF0IGZhc3Qgd2l0aCBhbiBFU1AgZXZlbgorCSAqIHdpdGggRE1BMiBzY2F0dGVyIGdhdGhlciBwaXBlbGluaW5nLgorCSAqLworI2RlZmluZSBTWU5DX0RFRlBfU0xPVyAgICAgICAgICAgIDB4MzIgICAvKiA1bWIvcyAgKi8KKyNkZWZpbmUgU1lOQ19ERUZQX0ZBU1QgICAgICAgICAgICAweDE5ICAgLyogMTBtYi9zICovCisKKwl1bnNpZ25lZCBpbnQJCXNuaXA7CQkvKiBTeW5jLiBuZWdvdGlhdGlvbiBpbiBwcm9ncmVzcyAqLworCXVuc2lnbmVkIGludAkJd25pcDsJCS8qIFdJREUgbmVnb3RpYXRpb24gaW4gcHJvZ3Jlc3MgKi8KKwl1bnNpZ25lZCBpbnQJCXRhcmdldHNfcHJlc2VudDsvKiB0YXJnZXRzIHNwb2tlbiB0byBiZWZvcmUgKi8KKworCWludAkJY3VycmVudF90cmFuc2Zlcl9zaXplOwkvKiBTZXQgYXQgYmVnaW5uaW5nIG9mIGRhdGEgZG1hICovCisKKwl1OAkJCWVzcGNtZGxvZ1szMl07CS8qIExvZyBvZiBjdXJyZW50IGVzcCBjbWRzIHNlbnQuICovCisJdTgJCQllc3BjbWRlbnQ7CS8qIEN1cnJlbnQgZW50cnkgaW4gZXNwIGNtZCBsb2cuICovCisKKwkvKiBNaXNjLiBpbmZvIGFib3V0IHRoaXMgRVNQICovCisJZW51bSBlc3BfcmV2CQllcmV2OwkJLyogRVNQIHJldmlzaW9uICovCisJaW50CQkJaXJxOwkJLyogU0J1cyBJUlEgZm9yIHRoaXMgRVNQICovCisJaW50CQkJc2NzaV9pZDsJLyogV2hvIGFtIEkgYXMgaW5pdGlhdG9yPyAqLworCWludAkJCXNjc2lfaWRfbWFzazsJLyogQml0bWFzayBvZiAnbWUnLiAqLworCWludAkJCWRpZmY7CQkvKiBEaWZmZXJlbnRpYWwgU0NTSSBidXM/ICovCisJaW50CQkJYnVyc3RzOwkJLyogQnVyc3Qgc2l6ZXMgb3VyIERWTUEgc3VwcG9ydHMgKi8KKworCS8qIE91ciBjb21tYW5kIHF1ZXVlcywgb25seSBvbmUgY21kIGxpdmVzIGluIHRoZSBjdXJyZW50X1NDIHF1ZXVlLiAqLworCXN0cnVjdCBzY3NpX2NtbmQJKmlzc3VlX1NDOwkvKiBDb21tYW5kcyB0byBiZSBpc3N1ZWQgKi8KKwlzdHJ1Y3Qgc2NzaV9jbW5kCSpjdXJyZW50X1NDOwkvKiBXaG8gaXMgY3VycmVudGx5IHdvcmtpbmcgdGhlIGJ1cyAqLworCXN0cnVjdCBzY3NpX2NtbmQJKmRpc2Nvbm5lY3RlZF9TQzsvKiBDb21tYW5kcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgYnVzICovCisKKwkvKiBNZXNzYWdlIGdvbyAqLworCXU4CQkJY3VyX21zZ291dFsxNl07CisJdTgJCQljdXJfbXNnaW5bMTZdOworCXU4CQkJcHJldm1zZ291dCwgcHJldm1zZ2luOworCXU4CQkJbXNnb3V0X2xlbiwgbXNnaW5fbGVuOworCXU4CQkJbXNnb3V0X2N0ciwgbXNnaW5fY3RyOworCisJLyogU3RhdGVzIHRoYXQgd2UgY2Fubm90IGtlZXAgaW4gdGhlIHBlciBjbWQgc3RydWN0dXJlIGJlY2F1c2UgdGhleQorCSAqIGNhbm5vdCBiZSBhc3Nvc2NpYXRlZCB3aXRoIGFueSBzcGVjaWZpYyBjb21tYW5kLgorCSAqLworCXU4CQkJcmVzZXR0aW5nX2J1czsKKwl3YWl0X3F1ZXVlX2hlYWRfdAlyZXNldF9xdWV1ZTsKK307CisKKy8qIEJpdGZpZWxkIG1lYW5pbmdzIGZvciB0aGUgYWJvdmUgcmVnaXN0ZXJzLiAqLworCisvKiBFU1AgY29uZmlnIHJlZyAxLCByZWFkLXdyaXRlLCBmb3VuZCBvbiBhbGwgRVNQIGNoaXBzICovCisjZGVmaW5lIEVTUF9DT05GSUcxX0lEICAgICAgICAweDA3ICAgICAgICAgICAgIC8qIE15IEJVUyBJRCBiaXRzICovCisjZGVmaW5lIEVTUF9DT05GSUcxX0NIVEVTVCAgICAweDA4ICAgICAgICAgICAgIC8qIEVuYWJsZSBFU1AgY2hpcCB0ZXN0cyAqLworI2RlZmluZSBFU1BfQ09ORklHMV9QRU5BQkxFICAgMHgxMCAgICAgICAgICAgICAvKiBFbmFibGUgcGFyaXR5IGNoZWNrcyAqLworI2RlZmluZSBFU1BfQ09ORklHMV9QQVJURVNUICAgMHgyMCAgICAgICAgICAgICAvKiBQYXJpdHkgdGVzdCBtb2RlIGVuYWJsZWQ/ICovCisjZGVmaW5lIEVTUF9DT05GSUcxX1NSUkRJU0FCICAweDQwICAgICAgICAgICAgIC8qIERpc2FibGUgU0NTSSByZXNldCByZXBvcnRzICovCisjZGVmaW5lIEVTUF9DT05GSUcxX1NMQ0FCTEUgICAweDgwICAgICAgICAgICAgIC8qIEVuYWJsZSBzbG93IGNhYmxlIG1vZGUgKi8KKworLyogRVNQIGNvbmZpZyByZWcgMiwgcmVhZC13cml0ZSwgZm91bmQgb25seSBvbiBlc3AxMDBhK2VzcDIwMCtlc3AyMzYgY2hpcHMgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfRE1BUEFSSVRZIDB4MDEgICAgICAgICAgICAgLyogZW5hYmxlIERNQSBQYXJpdHkgKDIwMCwyMzYpICovCisjZGVmaW5lIEVTUF9DT05GSUcyX1JFR1BBUklUWSAweDAyICAgICAgICAgICAgIC8qIGVuYWJsZSByZWcgUGFyaXR5ICgyMDAsMjM2KSAqLworI2RlZmluZSBFU1BfQ09ORklHMl9CQURQQVJJVFkgMHgwNCAgICAgICAgICAgICAvKiBCYWQgcGFyaXR5IHRhcmdldCBhYm9ydCAgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfU0NTSTJFTkFCIDB4MDggICAgICAgICAgICAgLyogRW5hYmxlIFNDU0ktMiBmZWF0dXJlcyAodG1vZGUgb25seSkgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfSEkgICAgICAgIDB4MTAgICAgICAgICAgICAgLyogSGlnaCBJbXBlZGFuY2UgRFJFUSA/Pz8gICovCisjZGVmaW5lIEVTUF9DT05GSUcyX0hNRUZFTkFCICAweDEwICAgICAgICAgICAgIC8qIEhNRSBmZWF0dXJlcyBlbmFibGUgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfQkNNICAgICAgIDB4MjAgICAgICAgICAgICAgLyogRW5hYmxlIGJ5dGUtY3RybCAoMjM2KSAgICovCisjZGVmaW5lIEVTUF9DT05GSUcyX0RJU1BJTlQgICAweDIwICAgICAgICAgICAgIC8qIERpc2FibGUgcGF1c2UgaXJxIChobWUpICovCisjZGVmaW5lIEVTUF9DT05GSUcyX0ZFTkFCICAgICAweDQwICAgICAgICAgICAgIC8qIEVuYWJsZSBmZWF0dXJlcyAoZmFzMTAwLGVzcDIxNikgICAgICAqLworI2RlZmluZSBFU1BfQ09ORklHMl9TUEwgICAgICAgMHg0MCAgICAgICAgICAgICAvKiBFbmFibGUgc3RhdHVzLXBoYXNlIGxhdGNoIChlc3AyMzYpICAgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfTUtET05FICAgIDB4NDAgICAgICAgICAgICAgLyogSE1FIG1hZ2ljIGZlYXR1cmUgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfSE1FMzIgICAgIDB4ODAgICAgICAgICAgICAgLyogSE1FIDMyIGV4dGVuZGVkICovCisjZGVmaW5lIEVTUF9DT05GSUcyX01BR0lDICAgICAweGUwICAgICAgICAgICAgIC8qIEludmFsaWQgYml0cy4uLiAqLworCisvKiBFU1AgY29uZmlnIHJlZ2lzdGVyIDMgcmVhZC13cml0ZSwgZm91bmQgb25seSBlc3AyMzYrZmFzMjM2K2ZhczEwMGEraG1lIGNoaXBzICovCisjZGVmaW5lIEVTUF9DT05GSUczX0ZDTE9DSyAgICAweDAxICAgICAgICAgICAgIC8qIEZBU1QgU0NTSSBjbG9jayByYXRlIChlc3AxMDBhL2htZSkgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzNfVEVNICAgICAgIDB4MDEgICAgICAgICAgICAgLyogRW5hYmxlIHRocmVzaC04IG1vZGUgKGVzcC9mYXMyMzYpICAqLworI2RlZmluZSBFU1BfQ09ORklHM19GQVNUICAgICAgMHgwMiAgICAgICAgICAgICAvKiBFbmFibGUgRkFTVCBTQ1NJICAgICAoZXNwMTAwYS9obWUpICovCisjZGVmaW5lIEVTUF9DT05GSUczX0FETUEgICAgICAweDAyICAgICAgICAgICAgIC8qIEVuYWJsZSBhbHRlcm5hdGUtZG1hIChlc3AvZmFzMjM2KSAgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzNfVEVOQiAgICAgIDB4MDQgICAgICAgICAgICAgLyogZ3JvdXAyIFNDU0kyIHN1cHBvcnQgKGVzcDEwMGEvaG1lKSAqLworI2RlZmluZSBFU1BfQ09ORklHM19TUkIgICAgICAgMHgwNCAgICAgICAgICAgICAvKiBTYXZlIHJlc2lkdWFsIGJ5dGUgICAoZXNwL2ZhczIzNikgICovCisjZGVmaW5lIEVTUF9DT05GSUczX1RNUyAgICAgICAweDA4ICAgICAgICAgICAgIC8qIFRocmVlLWJ5dGUgbXNnJ3Mgb2sgIChlc3AxMDBhL2htZSkgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzNfRkNMSyAgICAgIDB4MDggICAgICAgICAgICAgLyogRmFzdCBTQ1NJIGNsb2NrIHJhdGUgKGVzcC9mYXMyMzYpICAqLworI2RlZmluZSBFU1BfQ09ORklHM19JRE1TRyAgICAgMHgxMCAgICAgICAgICAgICAvKiBJRCBtZXNzYWdlIGNoZWNraW5nICAoZXNwMTAwYS9obWUpICovCisjZGVmaW5lIEVTUF9DT05GSUczX0ZTQ1NJICAgICAweDEwICAgICAgICAgICAgIC8qIEVuYWJsZSBGQVNUIFNDU0kgICAgIChlc3AvZmFzMjM2KSAgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzNfR1RNICAgICAgIDB4MjAgICAgICAgICAgICAgLyogZ3JvdXAyIFNDU0kyIHN1cHBvcnQgKGVzcC9mYXMyMzYpICAqLworI2RlZmluZSBFU1BfQ09ORklHM19JREJJVDMgICAgMHgyMCAgICAgICAgICAgICAvKiBCaXQgMyBvZiBITUUgU0NTSS1JRCAoaG1lKSAgICAgICAgICovCisjZGVmaW5lIEVTUF9DT05GSUczX1RCTVMgICAgICAweDQwICAgICAgICAgICAgIC8qIFRocmVlLWJ5dGUgbXNnJ3Mgb2sgIChlc3AvZmFzMjM2KSAgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzNfRVdJREUgICAgIDB4NDAgICAgICAgICAgICAgLyogRW5hYmxlIFdpZGUtU0NTSSAgICAgKGhtZSkgICAgICAgICAqLworI2RlZmluZSBFU1BfQ09ORklHM19JTVMgICAgICAgMHg4MCAgICAgICAgICAgICAvKiBJRCBtc2cgY2hrJ25nICAgICAgICAoZXNwL2ZhczIzNikgICovCisjZGVmaW5lIEVTUF9DT05GSUczX09CUFVTSCAgICAweDgwICAgICAgICAgICAgIC8qIFB1c2ggb2RkLWJ5dGUgdG8gZG1hIChobWUpICAgICAgICAgKi8KKworLyogRVNQIGNvbW1hbmQgcmVnaXN0ZXIgcmVhZC13cml0ZSAqLworLyogR3JvdXAgMSBjb21tYW5kczogIFRoZXNlIG1heSBiZSBzZW50IGF0IGFueSBwb2ludCBpbiB0aW1lIHRvIHRoZSBFU1AKKyAqICAgICAgICAgICAgICAgICAgICBjaGlwLiAgTm9uZSBvZiB0aGVtIGNhbiBnZW5lcmF0ZSBpbnRlcnJ1cHRzICdjZXB0CisgKiAgICAgICAgICAgICAgICAgICAgdGhlICJTQ1NJIGJ1cyByZXNldCIgY29tbWFuZCBpZiB5b3UgaGF2ZSBub3QgZGlzYWJsZWQKKyAqICAgICAgICAgICAgICAgICAgICBTQ1NJIHJlc2V0IGludGVycnVwdHMgaW4gdGhlIGNvbmZpZzEgRVNQIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIEVTUF9DTURfTlVMTCAgICAgICAgICAweDAwICAgICAgICAgICAgIC8qIE51bGwgY29tbWFuZCwgaWUuIGEgbm9wICovCisjZGVmaW5lIEVTUF9DTURfRkxVU0ggICAgICAgICAweDAxICAgICAgICAgICAgIC8qIEZJRk8gRmx1c2ggKi8KKyNkZWZpbmUgRVNQX0NNRF9SQyAgICAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogQ2hpcCByZXNldCAqLworI2RlZmluZSBFU1BfQ01EX1JTICAgICAgICAgICAgMHgwMyAgICAgICAgICAgICAvKiBTQ1NJIGJ1cyByZXNldCAqLworCisvKiBHcm91cCAyIGNvbW1hbmRzOiAgRVNQIG11c3QgYmUgYW4gaW5pdGlhdG9yIGFuZCBjb25uZWN0ZWQgdG8gYSB0YXJnZXQKKyAqICAgICAgICAgICAgICAgICAgICBmb3IgdGhlc2UgY29tbWFuZHMgdG8gd29yay4KKyAqLworI2RlZmluZSBFU1BfQ01EX1RJICAgICAgICAgICAgMHgxMCAgICAgICAgICAgICAvKiBUcmFuc2ZlciBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBFU1BfQ01EX0lDQ1NFUSAgICAgICAgMHgxMSAgICAgICAgICAgICAvKiBJbml0aWF0b3IgY21kIGNvbXBsZXRlIHNlcXVlbmNlICovCisjZGVmaW5lIEVTUF9DTURfTU9LICAgICAgICAgICAweDEyICAgICAgICAgICAgIC8qIE1lc3NhZ2Ugb2tpZS1kb2tpZSAqLworI2RlZmluZSBFU1BfQ01EX1RQQUQgICAgICAgICAgMHgxOCAgICAgICAgICAgICAvKiBUcmFuc2ZlciBQYWQgKi8KKyNkZWZpbmUgRVNQX0NNRF9TQVROICAgICAgICAgIDB4MWEgICAgICAgICAgICAgLyogU2V0IEFUTiAqLworI2RlZmluZSBFU1BfQ01EX1JBVE4gICAgICAgICAgMHgxYiAgICAgICAgICAgICAvKiBEZS1hc3NlcnQgQVROICovCisKKy8qIEdyb3VwIDMgY29tbWFuZHM6ICBFU1AgbXVzdCBiZSBpbiB0aGUgTVNHT1VUIG9yIE1TR0lOIHN0YXRlIGFuZCBiZSBjb25uZWN0ZWQKKyAqICAgICAgICAgICAgICAgICAgICB0byBhIHRhcmdldCBhcyB0aGUgaW5pdGlhdG9yIGZvciB0aGVzZSBjb21tYW5kcyB0byB3b3JrLgorICovCisjZGVmaW5lIEVTUF9DTURfU01TRyAgICAgICAgICAweDIwICAgICAgICAgICAgIC8qIFNlbmQgbWVzc2FnZSAqLworI2RlZmluZSBFU1BfQ01EX1NTVEFUICAgICAgICAgMHgyMSAgICAgICAgICAgICAvKiBTZW5kIHN0YXR1cyAqLworI2RlZmluZSBFU1BfQ01EX1NEQVRBICAgICAgICAgMHgyMiAgICAgICAgICAgICAvKiBTZW5kIGRhdGEgKi8KKyNkZWZpbmUgRVNQX0NNRF9EU0VRICAgICAgICAgIDB4MjMgICAgICAgICAgICAgLyogRGlzY29udGludWUgU2VxdWVuY2UgKi8KKyNkZWZpbmUgRVNQX0NNRF9UU0VRICAgICAgICAgIDB4MjQgICAgICAgICAgICAgLyogVGVybWluYXRlIFNlcXVlbmNlICovCisjZGVmaW5lIEVTUF9DTURfVENDU0VRICAgICAgICAweDI1ICAgICAgICAgICAgIC8qIFRhcmdldCBjbWQgY21wbHQgc2VxdWVuY2UgKi8KKyNkZWZpbmUgRVNQX0NNRF9EQ05DVCAgICAgICAgIDB4MjcgICAgICAgICAgICAgLyogRGlzY29ubmVjdCAqLworI2RlZmluZSBFU1BfQ01EX1JNU0cgICAgICAgICAgMHgyOCAgICAgICAgICAgICAvKiBSZWNlaXZlIE1lc3NhZ2UgKi8KKyNkZWZpbmUgRVNQX0NNRF9SQ01EICAgICAgICAgIDB4MjkgICAgICAgICAgICAgLyogUmVjZWl2ZSBDb21tYW5kICovCisjZGVmaW5lIEVTUF9DTURfUkRBVEEgICAgICAgICAweDJhICAgICAgICAgICAgIC8qIFJlY2VpdmUgRGF0YSAqLworI2RlZmluZSBFU1BfQ01EX1JDU0VRICAgICAgICAgMHgyYiAgICAgICAgICAgICAvKiBSZWNlaXZlIGNtZCBzZXF1ZW5jZSAqLworCisvKiBHcm91cCA0IGNvbW1hbmRzOiAgVGhlIEVTUCBtdXN0IGJlIGluIHRoZSBkaXNjb25uZWN0ZWQgc3RhdGUgYW5kIG11c3QKKyAqICAgICAgICAgICAgICAgICAgICBub3QgYmUgY29ubmVjdGVkIHRvIGFueSB0YXJnZXRzIGFzIGluaXRpYXRvciBmb3IKKyAqICAgICAgICAgICAgICAgICAgICB0aGVzZSBjb21tYW5kcyB0byB3b3JrLgorICovCisjZGVmaW5lIEVTUF9DTURfUlNFTCAgICAgICAgICAweDQwICAgICAgICAgICAgIC8qIFJlc2VsZWN0ICovCisjZGVmaW5lIEVTUF9DTURfU0VMICAgICAgICAgICAweDQxICAgICAgICAgICAgIC8qIFNlbGVjdCB3L28gQVROICovCisjZGVmaW5lIEVTUF9DTURfU0VMQSAgICAgICAgICAweDQyICAgICAgICAgICAgIC8qIFNlbGVjdCB3L0FUTiAqLworI2RlZmluZSBFU1BfQ01EX1NFTEFTICAgICAgICAgMHg0MyAgICAgICAgICAgICAvKiBTZWxlY3Qgdy9BVE4gJiBTVE9QICovCisjZGVmaW5lIEVTUF9DTURfRVNFTCAgICAgICAgICAweDQ0ICAgICAgICAgICAgIC8qIEVuYWJsZSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgRVNQX0NNRF9EU0VMICAgICAgICAgIDB4NDUgICAgICAgICAgICAgLyogRGlzYWJsZSBzZWxlY3Rpb25zICovCisjZGVmaW5lIEVTUF9DTURfU0EzICAgICAgICAgICAweDQ2ICAgICAgICAgICAgIC8qIFNlbGVjdCB3L0FUTjMgKi8KKyNkZWZpbmUgRVNQX0NNRF9SU0VMMyAgICAgICAgIDB4NDcgICAgICAgICAgICAgLyogUmVzZWxlY3QzICovCisKKy8qIFRoaXMgYml0IGVuYWJsZXMgdGhlIEVTUCdzIERNQSBvbiB0aGUgU0J1cyAqLworI2RlZmluZSBFU1BfQ01EX0RNQSAgICAgICAgICAgMHg4MCAgICAgICAgICAgICAvKiBEbyBETUE/ICovCisKKworLyogRVNQIHN0YXR1cyByZWdpc3RlciByZWFkLW9ubHkgKi8KKyNkZWZpbmUgRVNQX1NUQVRfUElPICAgICAgICAgIDB4MDEgICAgICAgICAgICAgLyogSU8gcGhhc2UgYml0ICovCisjZGVmaW5lIEVTUF9TVEFUX1BDRCAgICAgICAgICAweDAyICAgICAgICAgICAgIC8qIENEIHBoYXNlIGJpdCAqLworI2RlZmluZSBFU1BfU1RBVF9QTVNHICAgICAgICAgMHgwNCAgICAgICAgICAgICAvKiBNU0cgcGhhc2UgYml0ICovCisjZGVmaW5lIEVTUF9TVEFUX1BNQVNLICAgICAgICAweDA3ICAgICAgICAgICAgIC8qIE1hc2sgb2YgcGhhc2UgYml0cyAqLworI2RlZmluZSBFU1BfU1RBVF9URE9ORSAgICAgICAgMHgwOCAgICAgICAgICAgICAvKiBUcmFuc2ZlciBDb21wbGV0ZWQgKi8KKyNkZWZpbmUgRVNQX1NUQVRfVENOVCAgICAgICAgIDB4MTAgICAgICAgICAgICAgLyogVHJhbnNmZXIgQ291bnRlciBJcyBaZXJvICovCisjZGVmaW5lIEVTUF9TVEFUX1BFUlIgICAgICAgICAweDIwICAgICAgICAgICAgIC8qIFBhcml0eSBlcnJvciAqLworI2RlZmluZSBFU1BfU1RBVF9TUEFNICAgICAgICAgMHg0MCAgICAgICAgICAgICAvKiBSZWFsIGJhZCBlcnJvciAqLworLyogVGhpcyBpbmRpY2F0ZXMgdGhlICdpbnRlcnJ1cHQgcGVuZGluZycgY29uZGl0aW9uIG9uIGVzcDIzNiwgaXQgaXMgYSByZXNlcnZlZAorICogYml0IG9uIG90aGVyIHJldnMgb2YgdGhlIEVTUC4KKyAqLworI2RlZmluZSBFU1BfU1RBVF9JTlRSICAgICAgICAgMHg4MCAgICAgICAgICAgICAvKiBJbnRlcnJ1cHQgKi8KKworLyogSE1FIG9ubHk6IHN0YXR1cyAyIHJlZ2lzdGVyICovCisjZGVmaW5lIEVTUF9TVEFUMl9TQ0hCSVQgICAgICAweDAxIC8qIFVwcGVyIGJpdHMgMy03IG9mIHNzdGVwIGVuYWJsZWQgKi8KKyNkZWZpbmUgRVNQX1NUQVQyX0ZGTEFHUyAgICAgIDB4MDIgLyogVGhlIGZpZm8gZmxhZ3MgYXJlIG5vdyBsYXRjaGVkICovCisjZGVmaW5lIEVTUF9TVEFUMl9YQ05UICAgICAgICAweDA0IC8qIFRoZSB0cmFuc2ZlciBjb3VudGVyIGlzIGxhdGNoZWQgKi8KKyNkZWZpbmUgRVNQX1NUQVQyX0NSRUdBICAgICAgIDB4MDggLyogVGhlIGNvbW1hbmQgcmVnIGlzIGFjdGl2ZSBub3cgKi8KKyNkZWZpbmUgRVNQX1NUQVQyX1dJREUgICAgICAgIDB4MTAgLyogSW50ZXJmYWNlIG9uIHRoaXMgYWRhcHRlciBpcyB3aWRlICovCisjZGVmaW5lIEVTUF9TVEFUMl9GMUJZVEUgICAgICAweDIwIC8qIFRoZXJlIGlzIG9uZSBieXRlIGF0IHRvcCBvZiBmaWZvICovCisjZGVmaW5lIEVTUF9TVEFUMl9GTVNCICAgICAgICAweDQwIC8qIE5leHQgYnl0ZSBpbiBmaWZvIGlzIG1vc3Qgc2lnbmlmaWNhbnQgKi8KKyNkZWZpbmUgRVNQX1NUQVQyX0ZFTVBUWSAgICAgIDB4ODAgLyogRklGTyBpcyBlbXB0eSAqLworCisvKiBUaGUgc3RhdHVzIHJlZ2lzdGVyIGNhbiBiZSBtYXNrZWQgd2l0aCBFU1BfU1RBVF9QTUFTSyBhbmQgY29tcGFyZWQKKyAqIHdpdGggdGhlIGZvbGxvd2luZyB2YWx1ZXMgdG8gZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHBoYXNlIHRoZSBFU1AKKyAqIChhdCBsZWFzdCB0aGlua3MgaXQpIGlzIGluLiAgRm9yIG91ciBwdXJwb3NlcyB3ZSBhbHNvIGFkZCBvdXIgb3duCisgKiBzb2Z0d2FyZSAnZG9uZScgYml0IGZvciBvdXIgcGhhc2UgbWFuYWdlbWVudCBlbmdpbmUuCisgKi8KKyNkZWZpbmUgRVNQX0RPUCAgICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERhdGEgT3V0ICAqLworI2RlZmluZSBFU1BfRElQICAgKEVTUF9TVEFUX1BJTykgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGF0YSBJbiAgICovCisjZGVmaW5lIEVTUF9DTURQICAoRVNQX1NUQVRfUENEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kICAgKi8KKyNkZWZpbmUgRVNQX1NUQVRQIChFU1BfU1RBVF9QQ0R8RVNQX1NUQVRfUElPKSAgICAgICAgICAgICAgIC8qIFN0YXR1cyAgICAqLworI2RlZmluZSBFU1BfTU9QICAgKEVTUF9TVEFUX1BNU0d8RVNQX1NUQVRfUENEKSAgICAgICAgICAgICAgLyogTWVzc2FnZSBPdXQgKi8KKyNkZWZpbmUgRVNQX01JUCAgIChFU1BfU1RBVF9QTVNHfEVTUF9TVEFUX1BDRHxFU1BfU1RBVF9QSU8pIC8qIE1lc3NhZ2UgSW4gKi8KKworLyogRVNQIGludGVycnVwdCByZWdpc3RlciByZWFkLW9ubHkgKi8KKyNkZWZpbmUgRVNQX0lOVFJfUyAgICAgICAgICAgIDB4MDEgICAgICAgICAgICAgLyogU2VsZWN0IHcvbyBBVE4gKi8KKyNkZWZpbmUgRVNQX0lOVFJfU0FUTiAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogU2VsZWN0IHcvQVROICovCisjZGVmaW5lIEVTUF9JTlRSX1JTRUwgICAgICAgICAweDA0ICAgICAgICAgICAgIC8qIFJlc2VsZWN0ZWQgKi8KKyNkZWZpbmUgRVNQX0lOVFJfRkRPTkUgICAgICAgIDB4MDggICAgICAgICAgICAgLyogRnVuY3Rpb24gZG9uZSAqLworI2RlZmluZSBFU1BfSU5UUl9CU0VSViAgICAgICAgMHgxMCAgICAgICAgICAgICAvKiBCdXMgc2VydmljZSAqLworI2RlZmluZSBFU1BfSU5UUl9EQyAgICAgICAgICAgMHgyMCAgICAgICAgICAgICAvKiBEaXNjb25uZWN0ICovCisjZGVmaW5lIEVTUF9JTlRSX0lDICAgICAgICAgICAweDQwICAgICAgICAgICAgIC8qIElsbGVnYWwgY29tbWFuZCBnaXZlbiAqLworI2RlZmluZSBFU1BfSU5UUl9TUiAgICAgICAgICAgMHg4MCAgICAgICAgICAgICAvKiBTQ1NJIGJ1cyByZXNldCBkZXRlY3RlZCAqLworCisvKiBJbnRlcnJ1cHQgc3RhdHVzIG1hY3JvcyAqLworI2RlZmluZSBFU1BfU1JFU0VUX0lSUShlc3ApICAoKGVzcCktPmludHJlZyAmIChFU1BfSU5UUl9TUikpCisjZGVmaW5lIEVTUF9JTExDTURfSVJRKGVzcCkgICgoZXNwKS0+aW50cmVnICYgKEVTUF9JTlRSX0lDKSkKKyNkZWZpbmUgRVNQX1NFTEVDVF9XSVRIX0FUTl9JUlEoZXNwKSAgICAgKChlc3ApLT5pbnRyZWcgJiAoRVNQX0lOVFJfU0FUTikpCisjZGVmaW5lIEVTUF9TRUxFQ1RfV0lUSE9VVF9BVE5fSVJRKGVzcCkgICgoZXNwKS0+aW50cmVnICYgKEVTUF9JTlRSX1MpKQorI2RlZmluZSBFU1BfU0VMRUNUSU9OX0lSUShlc3ApICAoKEVTUF9TRUxFQ1RfV0lUSF9BVE5fSVJRKGVzcCkpIHx8ICAgICAgICAgXAorCQkJCSAoRVNQX1NFTEVDVF9XSVRIT1VUX0FUTl9JUlEoZXNwKSkpCisjZGVmaW5lIEVTUF9SRVNFTEVDVElPTl9JUlEoZXNwKSAgICAgICAgICgoZXNwKS0+aW50cmVnICYgKEVTUF9JTlRSX1JTRUwpKQorCisvKiBFU1Agc2VxdWVuY2Ugc3RlcCByZWdpc3RlciByZWFkLW9ubHkgKi8KKyNkZWZpbmUgRVNQX1NURVBfVkJJVFMgICAgICAgIDB4MDcgICAgICAgICAgICAgLyogVmFsaWQgYml0cyAqLworI2RlZmluZSBFU1BfU1RFUF9BU0VMICAgICAgICAgMHgwMCAgICAgICAgICAgICAvKiBTZWxlY3Rpb24mQXJiaXRyYXRlIGNtcGx0ICovCisjZGVmaW5lIEVTUF9TVEVQX1NJRCAgICAgICAgICAweDAxICAgICAgICAgICAgIC8qIE9uZSBtc2cgYnl0ZSBzZW50ICovCisjZGVmaW5lIEVTUF9TVEVQX05DTUQgICAgICAgICAweDAyICAgICAgICAgICAgIC8qIFdhcyBub3QgaW4gY29tbWFuZCBwaGFzZSAqLworI2RlZmluZSBFU1BfU1RFUF9QUEMgICAgICAgICAgMHgwMyAgICAgICAgICAgICAvKiBFYXJseSBwaGFzZSBjaGcgY2F1c2VkIGNtbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnl0ZXMgdG8gYmUgbG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVNQX1NURVBfRklOSTQgICAgICAgIDB4MDQgICAgICAgICAgICAgLyogQ29tbWFuZCB3YXMgc2VudCBvayAqLworCisvKiBIbyBodW0sIHNvbWUgRVNQJ3Mgc2V0IHRoZSBzdGVwIHJlZ2lzdGVyIHRvIHRoaXMgYXMgd2VsbC4uLiAqLworI2RlZmluZSBFU1BfU1RFUF9GSU5JNSAgICAgICAgMHgwNQorI2RlZmluZSBFU1BfU1RFUF9GSU5JNiAgICAgICAgMHgwNgorI2RlZmluZSBFU1BfU1RFUF9GSU5JNyAgICAgICAgMHgwNworCisvKiBFU1AgY2hpcC10ZXN0IHJlZ2lzdGVyIHJlYWQtd3JpdGUgKi8KKyNkZWZpbmUgRVNQX1RFU1RfVEFSRyAgICAgICAgIDB4MDEgICAgICAgICAgICAgLyogVGFyZ2V0IHRlc3QgbW9kZSAqLworI2RlZmluZSBFU1BfVEVTVF9JTkkgICAgICAgICAgMHgwMiAgICAgICAgICAgICAvKiBJbml0aWF0b3IgdGVzdCBtb2RlICovCisjZGVmaW5lIEVTUF9URVNUX1RTICAgICAgICAgICAweDA0ICAgICAgICAgICAgIC8qIFRyaXN0YXRlIHRlc3QgbW9kZSAqLworCisvKiBFU1AgdW5pcXVlIElEIHJlZ2lzdGVyIHJlYWQtb25seSwgZm91bmQgb24gZmFzMjM2K2ZhczEwMGEgb25seSAqLworI2RlZmluZSBFU1BfVUlEX0YxMDBBICAgICAgICAgMHgwMCAgICAgICAgICAgICAvKiBFU1AgRkFTMTAwQSAgKi8KKyNkZWZpbmUgRVNQX1VJRF9GMjM2ICAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogRVNQIEZBUzIzNiAgICovCisjZGVmaW5lIEVTUF9VSURfUkVWICAgICAgICAgICAweDA3ICAgICAgICAgICAgIC8qIEVTUCByZXZpc2lvbiAqLworI2RlZmluZSBFU1BfVUlEX0ZBTSAgICAgICAgICAgMHhmOCAgICAgICAgICAgICAvKiBFU1AgZmFtaWx5ICAgKi8KKworLyogRVNQIGZpZm8gZmxhZ3MgcmVnaXN0ZXIgcmVhZC1vbmx5ICovCisvKiBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyBpbXBsaWVzIGEgMTYgYnl0ZSBGSUZPIG9uIHRoZSBFU1AuICovCisjZGVmaW5lIEVTUF9GRl9GQllURVMgICAgICAgICAweDFmICAgICAgICAgICAgIC8qIE51bSBieXRlcyBpbiBGSUZPICovCisjZGVmaW5lIEVTUF9GRl9PTk9UWkVSTyAgICAgICAweDIwICAgICAgICAgICAgIC8qIG9mZnNldCBjdHIgbm90IHplcm8gKGVzcDEwMCkgKi8KKyNkZWZpbmUgRVNQX0ZGX1NTVEVQICAgICAgICAgIDB4ZTAgICAgICAgICAgICAgLyogU2VxdWVuY2Ugc3RlcCAqLworCisvKiBFU1AgY2xvY2sgY29udmVyc2lvbiBmYWN0b3IgcmVnaXN0ZXIgd3JpdGUtb25seSAqLworI2RlZmluZSBFU1BfQ0NGX0YwICAgICAgICAgICAgMHgwMCAgICAgICAgICAgICAvKiAzNS4wMU1IeiAtIDQwTUh6ICovCisjZGVmaW5lIEVTUF9DQ0ZfTkVWRVIgICAgICAgICAweDAxICAgICAgICAgICAgIC8qIFNldCBpdCB0byB0aGlzIGFuZCBkaWUgKi8KKyNkZWZpbmUgRVNQX0NDRl9GMiAgICAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogMTBNSHogKi8KKyNkZWZpbmUgRVNQX0NDRl9GMyAgICAgICAgICAgIDB4MDMgICAgICAgICAgICAgLyogMTAuMDFNSHogLSAxNU1IeiAqLworI2RlZmluZSBFU1BfQ0NGX0Y0ICAgICAgICAgICAgMHgwNCAgICAgICAgICAgICAvKiAxNS4wMU1IeiAtIDIwTUh6ICovCisjZGVmaW5lIEVTUF9DQ0ZfRjUgICAgICAgICAgICAweDA1ICAgICAgICAgICAgIC8qIDIwLjAxTUh6IC0gMjVNSHogKi8KKyNkZWZpbmUgRVNQX0NDRl9GNiAgICAgICAgICAgIDB4MDYgICAgICAgICAgICAgLyogMjUuMDFNSHogLSAzME1IeiAqLworI2RlZmluZSBFU1BfQ0NGX0Y3ICAgICAgICAgICAgMHgwNyAgICAgICAgICAgICAvKiAzMC4wMU1IeiAtIDM1TUh6ICovCisKKy8qIEhNRSBvbmx5Li4uICovCisjZGVmaW5lIEVTUF9CVVNJRF9SRVNFTElEICAgICAweDEwCisjZGVmaW5lIEVTUF9CVVNJRF9DVFIzMkJJVCAgICAweDQwCisKKyNkZWZpbmUgRVNQX0JVU19USU1FT1VUICAgICAgICAyNzUgICAgICAgICAgICAgLyogSW4gbWlsbGktc2Vjb25kcyAqLworI2RlZmluZSBFU1BfVElNRU9fQ09OU1QgICAgICAgODE5MgorI2RlZmluZSBFU1BfTkVHX0RFRlAobWh6LCBjZmFjdCkgXAorICAgICAgICAoKEVTUF9CVVNfVElNRU9VVCAqICgobWh6KSAvIDEwMDApKSAvICg4MTkyICogKGNmYWN0KSkpCisjZGVmaW5lIEVTUF9NSFpfVE9fQ1lDTEUobWhlcnR6KSAgKCgxMDAwMDAwMDAwKSAvICgobWhlcnR6KSAvIDEwMDApKQorI2RlZmluZSBFU1BfVElDSyhjY2YsIGN5Y2xlKSAgKCg3NjgyICogKGNjZikgKiAoY3ljbGUpIC8gMTAwMCkpCisKKy8qIEZvciBvdXIgaW50ZXJydXB0IGVuZ2luZS4gKi8KKyNkZWZpbmUgZm9yX2VhY2hfZXNwKGVzcCkgXAorICAgICAgICBmb3IoKGVzcCkgPSBlc3BjaGFpbjsgKGVzcCk7IChlc3ApID0gKGVzcCktPm5leHQpCisKKyNlbmRpZiAvKiAhKF9TUEFSQ19FU1BfSCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mYXN0bGFuZS5jIGIvZHJpdmVycy9zY3NpL2Zhc3RsYW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0NzYxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9mYXN0bGFuZS5jCkBAIC0wLDAgKzEsNDIxIEBACisvKiBmYXN0bGFuZS5jOiBEcml2ZXIgZm9yIFBoYXNlNSdzIEZhc3RsYW5lIFNDU0kgQ29udHJvbGxlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykKKyAqCisgKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiB0aGUgQ3liZXJTdG9ybSBkcml2ZXIsIGhlbmNlIHRoZSBvY2Nhc2lvbmFsCisgKiByZWZlcmVuY2UgdG8gQ3liZXJTdG9ybS4KKyAqCisgKiBCZXRhdGVzdGluZyAmIGNydWNpYWwgYWRqdXN0bWVudHMgYnkKKyAqICAgICAgICBQYXRyaWsgUmFrIChwcmFrMzI2NEBzczEwMDAubXMubWZmLmN1bmkuY3opCisgKgorICovCisKKy8qIFRPRE86CisgKgorICogbyBBY2NvcmRpbmcgdG8gdGhlIGRvYyBmcm9tIGxhaXJlLCBpdCBpcyByZXF1aXJlZCB0byByZXNldCB0aGUgRE1BIHdoZW4KKyAqICAgdGhlIHRyYW5zZmVyIGlzIGRvbmUuIEFUTSB3ZSByZXNldCBETUEganVzdCBiZWZvcmUgZXZlcnkgbmV3IAorICogICBkbWFfaW5pdF8ocmVhZHx3cml0ZSkuCisgKgorICogMSkgRmlndXJlIG91dCBob3cgdG8gbWFrZSBhIGNsZWFuZXIgbWVyZ2Ugd2l0aCB0aGUgc3BhcmMgZHJpdmVyIHdpdGggcmVnYXJkCisgKiAgICB0byB0aGUgY2FjaGVzIGFuZCB0aGUgU3BhcmMgTU1VIG1hcHBpbmcuCisgKiAyKSBNYWtlIGFzIGZldyByb3V0aW5lcyByZXF1aXJlZCBvdXRzaWRlIHRoZSBnZW5lcmljIGRyaXZlci4gQSBsb3Qgb2YgdGhlCisgKiAgICByb3V0aW5lcyBpbiB0aGlzIGZpbGUgdXNlZCB0byBiZSBpbmxpbmUhCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgIk5DUjUzQzl4LmgiCisKKyNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgorCisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworLyogU3VjaCBkYXkgaGFzIGp1c3QgY29tZS4uLiAqLworI2lmIDAKKy8qIExldCB0aGlzIGRlZmluZWQgdW5sZXNzIHlvdSByZWFsbHkgbmVlZCB0byBlbmFibGUgRE1BIElSUSBvbmUgZGF5ICovCisjZGVmaW5lIE5PRE1BSVJRCisjZW5kaWYKKworLyogVGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGNhbiBiZSBmb3VuZCBpbiB0aGUgWjIgY29uZmlnIGFyZWEgYXQgdGhlc2UKKyAqIG9mZnNldHM6CisgKi8KKyNkZWZpbmUgRkFTVExBTkVfRVNQX0FERFIgMHgxMDAwMDAxCisjZGVmaW5lIEZBU1RMQU5FX0RNQV9BRERSIDB4MTAwMDA0MQorCisKKy8qIFRoZSBGYXN0bGFuZSBETUEgaW50ZXJmYWNlICovCitzdHJ1Y3QgZmFzdGxhbmVfZG1hX3JlZ2lzdGVycyB7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjb25kX3JlZzsJLyogRE1BIHN0YXR1cyAgKHJvKSBbMHgwMDAwXSAqLworI2RlZmluZSBjdHJsX3JlZyAgY29uZF9yZWcJCQkvKiBETUEgY29udHJvbCAod28pIFsweDAwMDBdICovCisJdW5zaWduZWQgY2hhciBkbWFwYWQxWzB4M2ZdOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgY2xlYXJfc3Ryb2JlOyAgICAvKiBETUEgY2xlYXIgICAod28pIFsweDAwNDBdICovCit9OworCisKKy8qIERNQSBzdGF0dXMgYml0cyAqLworI2RlZmluZSBGQVNUTEFORV9ETUFfTUlOVCAgMHg4MAorI2RlZmluZSBGQVNUTEFORV9ETUFfSUFDVCAgMHg0MAorI2RlZmluZSBGQVNUTEFORV9ETUFfQ1JFUSAgMHgyMAorCisvKiBETUEgY29udHJvbCBiaXRzICovCisjZGVmaW5lIEZBU1RMQU5FX0RNQV9GQ09ERSAweGEwCisjZGVmaW5lIEZBU1RMQU5FX0RNQV9NQVNLICAweGYzCisjZGVmaW5lIEZBU1RMQU5FX0RNQV9MRUQgICAweDEwCS8qIEhEIGxlZCBjb250cm9sIDEgPSBvbiAqLworI2RlZmluZSBGQVNUTEFORV9ETUFfV1JJVEUgMHgwOCAvKiAxID0gd3JpdGUgKi8KKyNkZWZpbmUgRkFTVExBTkVfRE1BX0VOQUJMRSAweDA0IC8qIEVuYWJsZSBETUEgKi8KKyNkZWZpbmUgRkFTVExBTkVfRE1BX0VESSAgIDB4MDIJLyogRW5hYmxlIERNQSBJUlEgPyAqLworI2RlZmluZSBGQVNUTEFORV9ETUFfRVNJICAgMHgwMQkvKiBFbmFibGUgU0NTSSBJUlEgKi8KKworc3RhdGljIGludCAgZG1hX2J5dGVzX3NlbnQoc3RydWN0IE5DUl9FU1AgKmVzcCwgaW50IGZpZm9fY291bnQpOworc3RhdGljIGludCAgZG1hX2Nhbl90cmFuc2ZlcihzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKTsKK3N0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIHZhZGRyLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX2lycV9leGl0KHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX2xlZF9vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfbGVkX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpOworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjdHJsX2RhdGEgPSAwOwkvKiBLZWVwIGJhY2t1cCBvZiB0aGUgc3R1ZmYgd3JpdHRlbgorCQkJCSAqIHRvIGN0cmxfcmVnLiBBbHdheXMgd3JpdGUgYSBjb3B5CisJCQkJICogdG8gdGhpcyByZWdpc3RlciB3aGVuIHdyaXRpbmcgdG8KKwkJCQkgKiB0aGUgaGFyZHdhcmUgcmVnaXN0ZXIhCisJCQkJICovCisKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGNtZF9idWZmZXJbMTZdOworCQkJCS8qIFRoaXMgaXMgd2hlcmUgYWxsIGNvbW1hbmRzIGFyZSBwdXQKKwkJCQkgKiBiZWZvcmUgdGhleSBhcmUgdHJhbnNmZXJyZWQgdG8gdGhlIEVTUCBjaGlwCisJCQkJICogdmlhIFBJTy4KKwkJCQkgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGRtYV9jbGVhcihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCXN0cnVjdCBmYXN0bGFuZV9kbWFfcmVnaXN0ZXJzICpkcmVncyA9CisJCShzdHJ1Y3QgZmFzdGxhbmVfZG1hX3JlZ2lzdGVycyAqKSAoZXNwLT5kcmVncyk7CisJdW5zaWduZWQgbG9uZyAqdDsKKworCWN0cmxfZGF0YSA9IChjdHJsX2RhdGEgJiBGQVNUTEFORV9ETUFfTUFTSyk7CisJZHJlZ3MtPmN0cmxfcmVnID0gY3RybF9kYXRhOworCisJdCA9ICh1bnNpZ25lZCBsb25nICopKGVzcC0+ZWRldik7CisKKwlkcmVncy0+Y2xlYXJfc3Ryb2JlID0gMDsKKwkqdCA9IDAgOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGV0ZWN0aW9uICovCitpbnQgX19pbml0IGZhc3RsYW5lX2VzcF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICp0cG50KQoreworCXN0cnVjdCBOQ1JfRVNQICplc3A7CisJc3RydWN0IHpvcnJvX2RldiAqeiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzOworCisJaWYgKCh6ID0gem9ycm9fZmluZF9kZXZpY2UoWk9SUk9fUFJPRF9QSEFTRTVfQkxJWlpBUkRfMTIzMF9JSV9GQVNUTEFORV9aM19DWUJFUlNDU0lfQ1lCRVJTVE9STTA2MCwgeikpKSB7CisJICAgIHVuc2lnbmVkIGxvbmcgYm9hcmQgPSB6LT5yZXNvdXJjZS5zdGFydDsKKwkgICAgaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihib2FyZCtGQVNUTEFORV9FU1BfQUREUiwKKwkJCQkgICBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSwgIk5DUjUzQzl4IikpIHsKKwkJLyogQ2hlY2sgaWYgdGhpcyBpcyByZWFsbHkgYSBmYXN0bGFuZSBjb250cm9sbGVyLiBUaGUgcHJvYmxlbQorCQkgKiBpcyB0aGF0IGFsc28gdGhlIGN5YmVyc3Rvcm0gYW5kIGJsaXp6YXJkIGNvbnRyb2xsZXJzIHVzZQorCQkgKiB0aGlzIElEIHZhbHVlLiBGb3J0dW5hdGVseSBvbmx5IEZhc3RsYW5lIG1hcHMgaW4gWjMgc3BhY2UKKwkJICovCisJCWlmIChib2FyZCA8IDB4MTAwMDAwMCkgeworCQkJZ290byBlcnJfcmVsZWFzZTsKKwkJfQorCQllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgKHZvaWQgKilib2FyZCtGQVNUTEFORV9FU1BfQUREUik7CisKKwkJLyogRG8gY29tbWFuZCB0cmFuc2ZlciB3aXRoIHByb2dyYW1tZWQgSS9PICovCisJCWVzcC0+ZG9fcGlvX2NtZHMgPSAxOworCisJCS8qIFJlcXVpcmVkIGZ1bmN0aW9ucyAqLworCQllc3AtPmRtYV9ieXRlc19zZW50ID0gJmRtYV9ieXRlc19zZW50OworCQllc3AtPmRtYV9jYW5fdHJhbnNmZXIgPSAmZG1hX2Nhbl90cmFuc2ZlcjsKKwkJZXNwLT5kbWFfZHVtcF9zdGF0ZSA9ICZkbWFfZHVtcF9zdGF0ZTsKKwkJZXNwLT5kbWFfaW5pdF9yZWFkID0gJmRtYV9pbml0X3JlYWQ7CisJCWVzcC0+ZG1hX2luaXRfd3JpdGUgPSAmZG1hX2luaXRfd3JpdGU7CisJCWVzcC0+ZG1hX2ludHNfb2ZmID0gJmRtYV9pbnRzX29mZjsKKwkJZXNwLT5kbWFfaW50c19vbiA9ICZkbWFfaW50c19vbjsKKwkJZXNwLT5kbWFfaXJxX3AgPSAmZG1hX2lycV9wOworCQllc3AtPmRtYV9wb3J0c19wID0gJmRtYV9wb3J0c19wOworCQllc3AtPmRtYV9zZXR1cCA9ICZkbWFfc2V0dXA7CisKKwkJLyogT3B0aW9uYWwgZnVuY3Rpb25zICovCisJCWVzcC0+ZG1hX2JhcnJpZXIgPSAwOworCQllc3AtPmRtYV9kcmFpbiA9IDA7CisJCWVzcC0+ZG1hX2ludmFsaWRhdGUgPSAwOworCQllc3AtPmRtYV9pcnFfZW50cnkgPSAwOworCQllc3AtPmRtYV9pcnFfZXhpdCA9ICZkbWFfaXJxX2V4aXQ7CisJCWVzcC0+ZG1hX2xlZF9vbiA9ICZkbWFfbGVkX29uOworCQllc3AtPmRtYV9sZWRfb2ZmID0gJmRtYV9sZWRfb2ZmOworCQllc3AtPmRtYV9wb2xsID0gMDsKKwkJZXNwLT5kbWFfcmVzZXQgPSAwOworCisJCS8qIEluaXRpYWxpemUgdGhlIHBvcnRCaXRzIChlbmFibGUgSVJRcykgKi8KKwkJY3RybF9kYXRhID0gKEZBU1RMQU5FX0RNQV9GQ09ERSB8CisjaWZuZGVmIE5PRE1BSVJRCisJCQkgICAgIEZBU1RMQU5FX0RNQV9FREkgfAorI2VuZGlmCisJCQkgICAgIEZBU1RMQU5FX0RNQV9FU0kpOworCQkJCisKKwkJLyogU0NTSSBjaGlwIGNsb2NrICovCisJCWVzcC0+Y2ZyZXEgPSA0MDAwMDAwMDsKKworCisJCS8qIE1hcCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSBpbnRvIHZpcnR1YWwga2VybmVsIHNwYWNlICovCisJCWFkZHJlc3MgPSAodW5zaWduZWQgbG9uZykKKwkJCXpfaW9yZW1hcChib2FyZCwgei0+cmVzb3VyY2UuZW5kLWJvYXJkKzEpOworCisJCWlmKCFhZGRyZXNzKXsKKwkJCXByaW50aygiQ291bGQgbm90IHJlbWFwIEZhc3RsYW5lIGNvbnRyb2xsZXIgbWVtb3J5ISIpOworCQkJZ290byBlcnJfdW5yZWdpc3RlcjsKKwkJfQorCisKKwkJLyogVGhlIERNQSByZWdpc3RlcnMgb24gdGhlIEZhc3RsYW5lIGFyZSBtYXBwZWQKKwkJICogcmVsYXRpdmUgdG8gdGhlIGRldmljZSAoaS5lLiBpbiB0aGUgc2FtZSBab3JybworCQkgKiBJL08gYmxvY2spLgorCQkgKi8KKwkJZXNwLT5kcmVncyA9ICh2b2lkICopKGFkZHJlc3MgKyBGQVNUTEFORV9ETUFfQUREUik7CisKKwkJLyogRVNQIHJlZ2lzdGVyIGJhc2UgKi8KKwkJZXNwLT5lcmVncyA9IChzdHJ1Y3QgRVNQX3JlZ3MgKikoYWRkcmVzcyArIEZBU1RMQU5FX0VTUF9BRERSKTsKKworCQkvKiBCb2FyZCBiYXNlICovCisJCWVzcC0+ZWRldiA9ICh2b2lkICopIGFkZHJlc3M7CisJCQorCQkvKiBTZXQgdGhlIGNvbW1hbmQgYnVmZmVyICovCisJCWVzcC0+ZXNwX2NvbW1hbmQgPSBjbWRfYnVmZmVyOworCQllc3AtPmVzcF9jb21tYW5kX2R2bWEgPSB2aXJ0X3RvX2J1cygodm9pZCAqKWNtZF9idWZmZXIpOworCisJCWVzcC0+aXJxID0gSVJRX0FNSUdBX1BPUlRTOworCQllc3AtPnNsb3QgPSBib2FyZCtGQVNUTEFORV9FU1BfQUREUjsKKwkJaWYgKHJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgZXNwX2ludHIsIFNBX1NISVJRLAorCQkJCSJGYXN0bGFuZSBTQ1NJIiwgZXNwLT5laG9zdCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhc3RsYW5lOiBDb3VsZCBub3QgZ2V0IElSUSVkLCBhYm9ydGluZy5cbiIsIElSUV9BTUlHQV9QT1JUUyk7CisJCQlnb3RvIGVycl91bm1hcDsKKwkJfQkJCQorCisJCS8qIENvbnRyb2xsZXIgSUQgKi8KKwkJZXNwLT5zY3NpX2lkID0gNzsKKwkJCisJCS8qIFdlIGRvbid0IGhhdmUgYSBkaWZmZXJlbnRpYWwgU0NTSS1idXMuICovCisJCWVzcC0+ZGlmZiA9IDA7CisKKwkJZG1hX2NsZWFyKGVzcCk7CisJCWVzcF9pbml0aWFsaXplKGVzcCk7CisKKwkJcHJpbnRrKCJFU1A6IFRvdGFsIG9mICVkIEVTUCBob3N0cyBmb3VuZCwgJWQgYWN0dWFsbHkgaW4gdXNlLlxuIiwgbmVzcHMsIGVzcHNfaW5fdXNlKTsKKwkJZXNwc19ydW5uaW5nID0gZXNwc19pbl91c2U7CisJCXJldHVybiBlc3BzX2luX3VzZTsKKwkgICAgfQorCX0KKwlyZXR1cm4gMDsKKworIGVycl91bm1hcDoKKwl6X2lvdW5tYXAoKHZvaWQgKilhZGRyZXNzKTsKKyBlcnJfdW5yZWdpc3RlcjoKKwlzY3NpX3VucmVnaXN0ZXIgKGVzcC0+ZWhvc3QpOworIGVycl9yZWxlYXNlOgorCXJlbGVhc2VfbWVtX3JlZ2lvbih6LT5yZXNvdXJjZS5zdGFydCtGQVNUTEFORV9FU1BfQUREUiwKKwkJCSAgIHNpemVvZihzdHJ1Y3QgRVNQX3JlZ3MpKTsKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBETUEgRnVuY3Rpb25zICovCitzdGF0aWMgaW50IGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KQoreworCS8qIFNpbmNlIHRoZSBGYXN0bGFuZSBETUEgaXMgZnVsbHkgZGVkaWNhdGVkIHRvIHRoZSBFU1AgY2hpcCwKKwkgKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQgKHRvIHRoZSBFU1AgY2hpcCkgZXF1YWxzIHRoZSBudW1iZXIKKwkgKiBvZiBieXRlcyBpbiB0aGUgRklGTyAtIHRoZXJlIGlzIG5vIGJ1ZmZlcmluZyBpbiB0aGUgRE1BIGNvbnRyb2xsZXIuCisJICogWFhYWCBEbyBJIHJlYWQgdGhpcyByaWdodD8gSXQgaXMgZnJvbSBob3N0IHRvIEVTUCwgcmlnaHQ/CisJICovCisJcmV0dXJuIGZpZm9fY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2Nhbl90cmFuc2ZlcihzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKQoreworCXVuc2lnbmVkIGxvbmcgc3ogPSBzcC0+U0NwLnRoaXNfcmVzaWR1YWw7CisJaWYoc3ogPiAweGZmZmMpCisJCXN6ID0gMHhmZmZjOworCXJldHVybiBzejsKK30KKworc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlFU1BMT0coKCJlc3AlZDogZG1hIC0tIGNvbmRfcmVnPCUwMng+XG4iLAorCQllc3AtPmVzcF9pZCwgKChzdHJ1Y3QgZmFzdGxhbmVfZG1hX3JlZ2lzdGVycyAqKQorCQkJICAgICAgKGVzcC0+ZHJlZ3MpKS0+Y29uZF9yZWcpKTsKKwlFU1BMT0coKCJpbnRyZXE6PCUwNHg+LCBpbnRlbmE6PCUwNHg+XG4iLAorCQljdXN0b20uaW50cmVxciwgY3VzdG9tLmludGVuYXIpKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBmYXN0bGFuZV9kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAorCQkoc3RydWN0IGZhc3RsYW5lX2RtYV9yZWdpc3RlcnMgKikgKGVzcC0+ZHJlZ3MpOworCXVuc2lnbmVkIGxvbmcgKnQ7CisJCisJY2FjaGVfY2xlYXIoYWRkciwgbGVuZ3RoKTsKKworCWRtYV9jbGVhcihlc3ApOworCisJdCA9ICh1bnNpZ25lZCBsb25nICopKChhZGRyICYgMHgwMGZmZmZmZikgKyBlc3AtPmVkZXYpOworCisJZHJlZ3MtPmNsZWFyX3N0cm9iZSA9IDA7CisJKnQgPSBhZGRyOworCisJY3RybF9kYXRhID0gKGN0cmxfZGF0YSAmIEZBU1RMQU5FX0RNQV9NQVNLKSB8IEZBU1RMQU5FX0RNQV9FTkFCTEU7CisJZHJlZ3MtPmN0cmxfcmVnID0gY3RybF9kYXRhOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBmYXN0bGFuZV9kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAorCQkoc3RydWN0IGZhc3RsYW5lX2RtYV9yZWdpc3RlcnMgKikgKGVzcC0+ZHJlZ3MpOworCXVuc2lnbmVkIGxvbmcgKnQ7CisKKwljYWNoZV9wdXNoKGFkZHIsIGxlbmd0aCk7CisKKwlkbWFfY2xlYXIoZXNwKTsKKworCXQgPSAodW5zaWduZWQgbG9uZyAqKSgoYWRkciAmIDB4MDBmZmZmZmYpICsgKGVzcC0+ZWRldikpOworCisJZHJlZ3MtPmNsZWFyX3N0cm9iZSA9IDA7CisJKnQgPSBhZGRyOworCisJY3RybF9kYXRhID0gKChjdHJsX2RhdGEgJiBGQVNUTEFORV9ETUFfTUFTSykgfCAKKwkJICAgICBGQVNUTEFORV9ETUFfRU5BQkxFIHwKKwkJICAgICBGQVNUTEFORV9ETUFfV1JJVEUpOworCWRyZWdzLT5jdHJsX3JlZyA9IGN0cmxfZGF0YTsKK30KKworCitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlkaXNhYmxlX2lycShlc3AtPmlycSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJZW5hYmxlX2lycShlc3AtPmlycSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pcnFfZXhpdChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCXN0cnVjdCBmYXN0bGFuZV9kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAorCQkoc3RydWN0IGZhc3RsYW5lX2RtYV9yZWdpc3RlcnMgKikgKGVzcC0+ZHJlZ3MpOworCisJZHJlZ3MtPmN0cmxfcmVnID0gY3RybF9kYXRhICYgfihGQVNUTEFORV9ETUFfRURJfEZBU1RMQU5FX0RNQV9FU0kpOworI2lmZGVmIF9fbWM2ODAwMF9fCisJbm9wKCk7CisjZW5kaWYKKwlkcmVncy0+Y3RybF9yZWcgPSBjdHJsX2RhdGE7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJc3RydWN0IGZhc3RsYW5lX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0gCisJCShzdHJ1Y3QgZmFzdGxhbmVfZG1hX3JlZ2lzdGVycyAqKSAoZXNwLT5kcmVncyk7CisJdW5zaWduZWQgY2hhciBkbWFfc3RhdHVzOworCisJZG1hX3N0YXR1cyA9IGRyZWdzLT5jb25kX3JlZzsKKworCWlmKGRtYV9zdGF0dXMgJiBGQVNUTEFORV9ETUFfSUFDVCkKKwkJcmV0dXJuIDA7CS8qIG5vdCBvdXIgSVJRICovCisKKwkvKiBSZXR1cm4gbm9uLXplcm8gaWYgRVNQIHJlcXVlc3RlZCBJUlEgKi8KKwlyZXR1cm4gKAorI2lmbmRlZiBOT0RNQUlSUQorCSAgIChkbWFfc3RhdHVzICYgRkFTVExBTkVfRE1BX0NSRVEpICYmCisjZW5kaWYKKwkgICAoIShkbWFfc3RhdHVzICYgRkFTVExBTkVfRE1BX01JTlQpKSAmJgorCSAgIChlc3BfcmVhZCgoKHN0cnVjdCBFU1BfcmVncyAqKSAoZXNwLT5lcmVncykpLT5lc3Bfc3RhdHVzKSAmIEVTUF9TVEFUX0lOVFIpKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2xlZF9vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwljdHJsX2RhdGEgJj0gfkZBU1RMQU5FX0RNQV9MRUQ7CisJKChzdHJ1Y3QgZmFzdGxhbmVfZG1hX3JlZ2lzdGVycyAqKShlc3AtPmRyZWdzKSktPmN0cmxfcmVnID0gY3RybF9kYXRhOworfQorCitzdGF0aWMgdm9pZCBkbWFfbGVkX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJY3RybF9kYXRhIHw9IEZBU1RMQU5FX0RNQV9MRUQ7CisJKChzdHJ1Y3QgZmFzdGxhbmVfZG1hX3JlZ2lzdGVycyAqKShlc3AtPmRyZWdzKSktPmN0cmxfcmVnID0gY3RybF9kYXRhOworfQorCitzdGF0aWMgaW50IGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJcmV0dXJuICgoY3VzdG9tLmludGVuYXIpICYgSUZfUE9SVFMpOworfQorCitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpCit7CisJLyogT24gdGhlIFNwYXJjLCBETUFfU1RfV1JJVEUgbWVhbnMgIm1vdmUgZGF0YSBmcm9tIGRldmljZSB0byBtZW1vcnkiCisJICogc28gd2hlbiAod3JpdGUpIGlzIHRydWUsIGl0IGFjdHVhbGx5IG1lYW5zIFJFQUQhCisJICovCisJaWYod3JpdGUpeworCQlkbWFfaW5pdF9yZWFkKGVzcCwgYWRkciwgY291bnQpOworCX0gZWxzZSB7CisJCWRtYV9pbml0X3dyaXRlKGVzcCwgYWRkciwgY291bnQpOworCX0KK30KKworI2RlZmluZSBIT1NUU19DCisKK2ludCBmYXN0bGFuZV9lc3BfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKyNpZmRlZiBNT0RVTEUKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZykoKHN0cnVjdCBOQ1JfRVNQICopaW5zdGFuY2UtPmhvc3RkYXRhKS0+ZWRldjsKKwllc3BfZGVhbGxvY2F0ZSgoc3RydWN0IE5DUl9FU1AgKilpbnN0YW5jZS0+aG9zdGRhdGEpOworCWVzcF9yZWxlYXNlKCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGFkZHJlc3MsIHNpemVvZihzdHJ1Y3QgRVNQX3JlZ3MpKTsKKwlmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGVzcF9pbnRyKTsKKyNlbmRpZgorCXJldHVybiAxOworfQorCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gImVzcC1mYXN0bGFuZSIsCisJLnByb2NfaW5mbwkJPSBlc3BfcHJvY19pbmZvLAorCS5uYW1lCQkJPSAiRmFzdGxhbmUgU0NTSSIsCisJLmRldGVjdAkJCT0gZmFzdGxhbmVfZXNwX2RldGVjdCwKKwkuc2xhdmVfYWxsb2MJCT0gZXNwX3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9kZXN0cm95CQk9IGVzcF9zbGF2ZV9kZXN0cm95LAorCS5yZWxlYXNlCQk9IGZhc3RsYW5lX2VzcF9yZWxlYXNlLAorCS5xdWV1ZWNvbW1hbmQJCT0gZXNwX3F1ZXVlLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gZXNwX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGVzcF9yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IDcsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcKK307CisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZmNhbC5jIGIvZHJpdmVycy9zY3NpL2ZjYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGFkODlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2ZjYWwuYwpAQCAtMCwwICsxLDMyMCBAQAorLyogZmNhbC5jOiBGaWJyZSBDaGFubmVsIEFyYml0cmF0ZWQgTG9vcCBTQ1NJIGhvc3QgYWRhcHRlciBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LDE5OTkgSmFrdWIgSmVsaW5layAoampAdWx0cmEubGludXguY3opCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2lmZGVmIENPTkZJR19LTU9ECisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICIuLi9mYzQvZmNwX2ltcGwuaCIKKyNpbmNsdWRlICJmY2FsLmgiCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworLyogI2RlZmluZSBGQ0FMX0RFQlVHICovCisKKyNkZWZpbmUgZmNhbF9wcmludGsgcHJpbnRrICgiRkNBTCAlczogIiwgZmMtPm5hbWUpOyBwcmludGsKKworI2lmZGVmIEZDQUxfREVCVUcKKyNkZWZpbmUgRkNBTEQoeCkgIGZjYWxfcHJpbnRrIHg7CisjZGVmaW5lIEZDQUxORCh4KSBwcmludGsgKCJGQ0FMOiAiKTsgcHJpbnRrIHg7CisjZWxzZQorI2RlZmluZSBGQ0FMRCh4KQorI2RlZmluZSBGQ0FMTkQoeCkKKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhbHBhMnRhcmdldFtdID0geworMHg3ZSwgMHg3ZCwgMHg3YywgMHhmZiwgMHg3YiwgMHhmZiwgMHhmZiwgMHhmZiwgMHg3YSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHg3OSwKKzB4NzgsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4NzcsIDB4NzYsIDB4ZmYsIDB4ZmYsIDB4NzUsIDB4ZmYsIDB4NzQsIDB4NzMsIDB4NzIsCisweGZmLCAweGZmLCAweGZmLCAweDcxLCAweGZmLCAweDcwLCAweDZmLCAweDZlLCAweGZmLCAweDZkLCAweDZjLCAweDZiLCAweDZhLCAweDY5LCAweDY4LCAweGZmLAorMHhmZiwgMHg2NywgMHg2NiwgMHg2NSwgMHg2NCwgMHg2MywgMHg2MiwgMHhmZiwgMHhmZiwgMHg2MSwgMHg2MCwgMHhmZiwgMHg1ZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4NWUsIDB4ZmYsIDB4NWQsIDB4NWMsIDB4NWIsIDB4ZmYsIDB4NWEsIDB4NTksIDB4NTgsIDB4NTcsIDB4NTYsIDB4NTUsIDB4ZmYsCisweGZmLCAweDU0LCAweDUzLCAweDUyLCAweDUxLCAweDUwLCAweDRmLCAweGZmLCAweGZmLCAweDRlLCAweDRkLCAweGZmLCAweDRjLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHg0YiwgMHhmZiwgMHg0YSwgMHg0OSwgMHg0OCwgMHhmZiwgMHg0NywgMHg0NiwgMHg0NSwgMHg0NCwgMHg0MywgMHg0MiwgMHhmZiwKKzB4ZmYsIDB4NDEsIDB4NDAsIDB4M2YsIDB4M2UsIDB4M2QsIDB4M2MsIDB4ZmYsIDB4ZmYsIDB4M2IsIDB4M2EsIDB4ZmYsIDB4MzksIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweDM4LCAweDM3LCAweDM2LCAweGZmLCAweDM1LCAweGZmLCAweGZmLCAweGZmLCAweDM0LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDMzLAorMHgzMiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgzMSwgMHgzMCwgMHhmZiwgMHhmZiwgMHgyZiwgMHhmZiwgMHgyZSwgMHgyZCwgMHgyYywKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MmIsIDB4ZmYsIDB4MmEsIDB4MjksIDB4MjgsIDB4ZmYsIDB4MjcsIDB4MjYsIDB4MjUsIDB4MjQsIDB4MjMsIDB4MjIsIDB4ZmYsCisweGZmLCAweDIxLCAweDIwLCAweDFmLCAweDFlLCAweDFkLCAweDFjLCAweGZmLCAweGZmLCAweDFiLCAweDFhLCAweGZmLCAweDE5LCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHgxOCwgMHhmZiwgMHgxNywgMHgxNiwgMHgxNSwgMHhmZiwgMHgxNCwgMHgxMywgMHgxMiwgMHgxMSwgMHgxMCwgMHgwZiwgMHhmZiwKKzB4ZmYsIDB4MGUsIDB4MGQsIDB4MGMsIDB4MGIsIDB4MGEsIDB4MDksIDB4ZmYsIDB4ZmYsIDB4MDgsIDB4MDcsIDB4ZmYsIDB4MDYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweDA1LCAweDA0LCAweDAzLCAweGZmLCAweDAyLCAweGZmLCAweGZmLCAweGZmLCAweDAxLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB0YXJnZXQyYWxwYVtdID0geworMHhlZiwgMHhlOCwgMHhlNCwgMHhlMiwgMHhlMSwgMHhlMCwgMHhkYywgMHhkYSwgMHhkOSwgMHhkNiwgMHhkNSwgMHhkNCwgMHhkMywgMHhkMiwgMHhkMSwgMHhjZSwKKzB4Y2QsIDB4Y2MsIDB4Y2IsIDB4Y2EsIDB4YzksIDB4YzcsIDB4YzYsIDB4YzUsIDB4YzMsIDB4YmMsIDB4YmEsIDB4YjksIDB4YjYsIDB4YjUsIDB4YjQsIDB4YjMsCisweGIyLCAweGIxLCAweGFlLCAweGFkLCAweGFjLCAweGFiLCAweGFhLCAweGE5LCAweGE3LCAweGE2LCAweGE1LCAweGEzLCAweDlmLCAweDllLCAweDlkLCAweDliLAorMHg5OCwgMHg5NywgMHg5MCwgMHg4ZiwgMHg4OCwgMHg4NCwgMHg4MiwgMHg4MSwgMHg4MCwgMHg3YywgMHg3YSwgMHg3OSwgMHg3NiwgMHg3NSwgMHg3NCwgMHg3MywKKzB4NzIsIDB4NzEsIDB4NmUsIDB4NmQsIDB4NmMsIDB4NmIsIDB4NmEsIDB4NjksIDB4NjcsIDB4NjYsIDB4NjUsIDB4NjMsIDB4NWMsIDB4NWEsIDB4NTksIDB4NTYsCisweDU1LCAweDU0LCAweDUzLCAweDUyLCAweDUxLCAweDRlLCAweDRkLCAweDRjLCAweDRiLCAweDRhLCAweDQ5LCAweDQ3LCAweDQ2LCAweDQ1LCAweDQzLCAweDNjLAorMHgzYSwgMHgzOSwgMHgzNiwgMHgzNSwgMHgzNCwgMHgzMywgMHgzMiwgMHgzMSwgMHgyZSwgMHgyZCwgMHgyYywgMHgyYiwgMHgyYSwgMHgyOSwgMHgyNywgMHgyNiwKKzB4MjUsIDB4MjMsIDB4MWYsIDB4MWUsIDB4MWQsIDB4MWIsIDB4MTgsIDB4MTcsIDB4MTAsIDB4MGYsIDB4MDgsIDB4MDQsIDB4MDIsIDB4MDEsIDB4MDAKK307CisKK3N0YXRpYyBpbnQgZmNhbF9lbmNvZGVfYWRkcihTY3NpX0NtbmQgKlNDcG50LCB1MTYgKmFkZHIsIGZjX2NoYW5uZWwgKmZjLCBmY3BfY21uZCAqZmNtZCk7CisKK2ludCBmY2FsX3NsYXZlX2NvbmZpZ3VyZShTY3NpX0RldmljZSAqZGV2aWNlKQoreworCWludCBkZXB0aF90b191c2U7CisJCisJaWYgKGRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCkKKwkJZGVwdGhfdG9fdXNlID0gLyogMjU0ICovIDg7CisJZWxzZQorCQlkZXB0aF90b191c2UgPSAyOworCisJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2aWNlLAorCQkJCShkZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQgPworCQkJCSBNU0dfU0lNUExFX1RBRyA6IDApLAorCQkJCWRlcHRoX3RvX3VzZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRGV0ZWN0IGFsbCBGQyBBcmJpdHJhdGVkIExvb3BzIGF0dGFjaGVkIHRvIHRoZSBtYWNoaW5lLgorICAgZmM0IG1vZHVsZSBoYXMgZG9uZSBhbGwgdGhlIHdvcmsgZm9yIHVzLi4uICovCitpbnQgX19pbml0IGZjYWxfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCkKK3sKKwlpbnQgbmZjYWxzID0gMDsKKwlmY19jaGFubmVsICpmYzsKKwlpbnQgZmNhbGNvdW50OworCWludCBpOworCisJdHBudC0+cHJvY19uYW1lID0gImZjYWwiOworCWZjYWxjb3VudCA9IDA7CisJZm9yX2VhY2hfb25saW5lX2ZjX2NoYW5uZWwoZmMpCisJCWlmIChmYy0+cG9zbWFwKQorCQkJZmNhbGNvdW50Kys7CisJRkNBTE5EKCgiJWQgY2hhbm5lbHMgb25saW5lXG4iLCBmY2FsY291bnQpKQorCWlmICghZmNhbGNvdW50KSB7CisjaWYgZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0ZDNF9TT0NBTF9NT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0tNT0QpCisJCXJlcXVlc3RfbW9kdWxlKCJzb2NhbCIpOworCQkKKwkJZm9yX2VhY2hfb25saW5lX2ZjX2NoYW5uZWwoZmMpCisJCQlpZiAoZmMtPnBvc21hcCkKKwkJCQlmY2FsY291bnQrKzsKKwkJaWYgKCFmY2FsY291bnQpCisjZW5kaWYKKwkJCXJldHVybiAwOworCX0KKwlmb3JfZWFjaF9vbmxpbmVfZmNfY2hhbm5lbChmYykgeworCQlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCQlsb25nICphZ2VzOworCQlzdHJ1Y3QgZmNhbCAqZmNhbDsKKwkJCisJCWlmICghZmMtPnBvc21hcCkgY29udGludWU7CisJCQorCQkvKiBTdHJhbmdlLCB0aGlzIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB0byBzb21lIG90aGVyIFNDU0kgaG9zdCwgdGhlbiBpdCBjYW5ub3QgYmUgZmNhbCAqLworCQlpZiAoZmMtPnNjc2lfbmFtZVswXSkgY29udGludWU7CisJCW1lbWNweSAoZmMtPnNjc2lfbmFtZSwgIkZDQUwiLCA0KTsKKwkJCisJCWZjLT5jYW5fcXVldWUgPSBGQ0FMX0NBTl9RVUVVRTsKKwkJZmMtPnJzcF9zaXplID0gNjQ7CisJCWZjLT5lbmNvZGVfYWRkciA9IGZjYWxfZW5jb2RlX2FkZHI7CisJCQorCQlhZ2VzID0ga21hbGxvYyAoMTI4ICogc2l6ZW9mKGxvbmcpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFhZ2VzKSBjb250aW51ZTsKKwkJCQkKKwkJaG9zdCA9IHNjc2lfcmVnaXN0ZXIgKHRwbnQsIHNpemVvZiAoc3RydWN0IGZjYWwpKTsKKwkJaWYgKCFob3N0KSAKKwkJeworCQkJa2ZyZWUoYWdlcyk7CisJCQljb250aW51ZTsKKwkJfQorCQkJCQorCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGZjLT5tb2R1bGUpKSB7CisJCQlrZnJlZShhZ2VzKTsKKwkJCXNjc2lfdW5yZWdpc3Rlcihob3N0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCisJCW5mY2FscysrOworCQkJCQorCQlmY2FsID0gKHN0cnVjdCBmY2FsICopaG9zdC0+aG9zdGRhdGE7CisJCQorCQlmYy0+ZmNwX3JlZ2lzdGVyKGZjLCBUWVBFX1NDU0lfRkNQLCAwKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgZmMtPnBvc21hcC0+bGVuOyBpKyspIHsKKwkJCWludCBzdGF0dXMsIHRhcmdldCwgYWxwYTsKKworCQkJYWxwYSA9IGZjLT5wb3NtYXAtPmxpc3RbaV07CQkJCisJCQlGQ0FMRCgoIlNlbmRpbmcgUExPR0kgdG8gJTAyeFxuIiwgYWxwYSkpCisJCQl0YXJnZXQgPSBhbHBhMnRhcmdldFthbHBhXTsKKwkJCXN0YXR1cyA9IGZjX2RvX3Bsb2dpKGZjLCBhbHBhLCBmY2FsLT5ub2RlX3d3biArIHRhcmdldCwgCisJCQkJCSAgICAgZmNhbC0+bnBvcnRfd3duICsgdGFyZ2V0KTsKKwkJCUZDQUxEKCgiUExPR0kgcmV0dXJuZWQgd2l0aCBzdGF0dXMgJWRcbiIsIHN0YXR1cykpCisJCQlpZiAoc3RhdHVzICE9IEZDX1NUQVRVU19PSykKKwkJCQljb250aW51ZTsKKwkJCUZDQUxEKCgiU2VuZGluZyBQUkxJIHRvICUwMnhcbiIsIGFscGEpKQorCQkJc3RhdHVzID0gZmNfZG9fcHJsaShmYywgYWxwYSk7CisJCQlGQ0FMRCgoIlBSTEkgcmV0dXJuZWQgd2l0aCBzdGF0dXMgJWRcbiIsIHN0YXR1cykpCisJCQlpZiAoc3RhdHVzID09IEZDX1NUQVRVU19PSykKKwkJCQlmY2FsLT5tYXBbdGFyZ2V0XSA9IDE7CisJCX0KKwkJCisJCWhvc3QtPm1heF9pZCA9IDEyNzsKKwkJaG9zdC0+aXJxID0gZmMtPmlycTsKKyNpZmRlZiBfX3NwYXJjX3Y5X18KKwkJaG9zdC0+dW5jaGVja2VkX2lzYV9kbWEgPSAxOworI2VuZGlmCisKKwkJZmMtPmNoYW5uZWxzID0gMTsKKwkJZmMtPnRhcmdldHMgPSAxMjc7CisJCWZjLT5hZ2VzID0gYWdlczsKKwkJbWVtc2V0IChhZ2VzLCAwLCAxMjggKiBzaXplb2YobG9uZykpOworCQkJCQorCQlmY2FsLT5mYyA9IGZjOworCQkKKwkJRkNBTEQoKCJGb3VuZCBGQ0FMXG4iKSkKKwl9CisJaWYgKG5mY2FscykKKyNpZmRlZiBfX3NwYXJjX18KKwkJcHJpbnRrICgiRkNBTDogVG90YWwgb2YgJWQgU3VuIEVudGVycHJpc2UgTmV0d29yayBBcnJheSAoQTUwMDAgb3IgRVg1MDApIGNoYW5uZWxzIGZvdW5kXG4iLCBuZmNhbHMpOworI2Vsc2UKKwkJcHJpbnRrICgiRkNBTDogVG90YWwgb2YgJWQgRmlicmUgQ2hhbm5lbCBBcmJpdHJhdGVkIExvb3BzIGZvdW5kXG4iLCBuZmNhbHMpOworI2VuZGlmCisJcmV0dXJuIG5mY2FsczsKK30KKworaW50IGZjYWxfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0cnVjdCBmY2FsICpmY2FsID0gKHN0cnVjdCBmY2FsICopaG9zdC0+aG9zdGRhdGE7CisJZmNfY2hhbm5lbCAqZmMgPSBmY2FsLT5mYzsKKworCW1vZHVsZV9wdXQoZmMtPm1vZHVsZSk7CisJCisJZmMtPmZjcF9yZWdpc3RlcihmYywgVFlQRV9TQ1NJX0ZDUCwgMSk7CisJRkNBTE5EKCgiIHJlbGVhc2luZyBmY2FsLlxuIikpOworCWtmcmVlIChmYy0+YWdlcyk7CisJRkNBTE5EKCgicmVsZWFzZWQgZmNhbCFcbiIpKTsKKwlyZXR1cm4gMDsKK30KKworI3VuZGVmIFNQUklOVEYKKyNkZWZpbmUgU1BSSU5URihhcmdzLi4uKSB7IGlmIChwb3MgPCAoYnVmZmVyICsgbGVuZ3RoKSkgcG9zICs9IHNwcmludGYgKHBvcywgIyMgYXJncyk7IH0KKworaW50IGZjYWxfcHJvY19pbmZvIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCit7CisJc3RydWN0IGZjYWwgKmZjYWw7CisJZmNfY2hhbm5lbCAqZmM7CisJY2hhciAqcG9zID0gYnVmZmVyOworCWludCBpLCBqOworCisJaWYgKGlub3V0KSByZXR1cm4gbGVuZ3RoOworICAgIAorCWZjYWwgPSAoc3RydWN0IGZjYWwgKilob3N0LT5ob3N0ZGF0YTsKKwlmYyA9IGZjYWwtPmZjOworCisjaWZkZWYgX19zcGFyY19fCisJU1BSSU5URiAoIlN1biBFbnRlcnByaXNlIE5ldHdvcmsgQXJyYXkgKEE1MDAwIG9yIEU/NTAwKSBvbiAlcyBQUk9NIG5vZGUgJXhcbiIsIGZjLT5uYW1lLCBmYy0+ZGV2LT5wcm9tX25vZGUpOworI2Vsc2UKKwlTUFJJTlRGICgiRmlicmUgQ2hhbm5lbCBBcmJpdHJhdGVkIExvb3Agb24gJXNcbiIsIGZjLT5uYW1lKTsKKyNlbmRpZgorCVNQUklOVEYgKCJJbml0aWF0b3IgQUwtUEE6ICUwMnhcbiIsIGZjLT5zaWQpOworCisJU1BSSU5URiAoIlxuQXR0YWNoZWQgZGV2aWNlczpcbiIpOworCQorCWZvciAoaSA9IDA7IGkgPCBmYy0+cG9zbWFwLT5sZW47IGkrKykgeworCQl1bnNpZ25lZCBjaGFyIGFscGEgPSBmYy0+cG9zbWFwLT5saXN0W2ldOworCQl1bnNpZ25lZCBjaGFyIHRhcmdldDsKKwkJdTMyICp1MSwgKnUyOworCQkKKwkJdGFyZ2V0ID0gYWxwYTJ0YXJnZXRbYWxwYV07CisJCXUxID0gKHUzMiAqKSZmY2FsLT5ucG9ydF93d25bdGFyZ2V0XTsKKwkJdTIgPSAodTMyICopJmZjYWwtPm5vZGVfd3duW3RhcmdldF07CisJCWlmICghdTFbMF0gJiYgIXUxWzFdKSB7CisJCQlTUFJJTlRGICgiICBbQUwtUEE6ICUwMnhdIE5vdCByZXNwb25kZWQgdG8gUExPR0lcbiIsIGFscGEpOworCQl9IGVsc2UgaWYgKCFmY2FsLT5tYXBbdGFyZ2V0XSkgeworCQkJU1BSSU5URiAoIiAgW0FMLVBBOiAlMDJ4LCBQb3J0IFdXTjogJTA4eCUwOHgsIE5vZGUgV1dOOiAlMDh4JTA4eF0gTm90IHJlc3BvbmRlZCB0byBQUkxJXG4iLAorCQkJCSBhbHBhLCB1MVswXSwgdTFbMV0sIHUyWzBdLCB1MlsxXSk7CisJCX0gZWxzZSB7CisJCQlTY3NpX0RldmljZSAqc2NkOworCQkJc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHNjZCwgaG9zdCkKKwkJCQlpZiAoc2NkLT5pZCA9PSB0YXJnZXQpIHsKKwkJCQkJU1BSSU5URiAoIiAgW0FMLVBBOiAlMDJ4LCBJZDogJTAyZCwgUG9ydCBXV046ICUwOHglMDh4LCBOb2RlIFdXTjogJTA4eCUwOHhdICAiLAorCQkJCQkJYWxwYSwgdGFyZ2V0LCB1MVswXSwgdTFbMV0sIHUyWzBdLCB1MlsxXSk7CisJCQkJCVNQUklOVEYgKCIlcyAiLCAoc2NkLT50eXBlIDwgTUFYX1NDU0lfREVWSUNFX0NPREUpID8KKwkJCQkJCXNjc2lfZGV2aWNlX3R5cGVzWyhzaG9ydCkgc2NkLT50eXBlXSA6ICJVbmtub3duIGRldmljZSIpOworCisJCQkJCWZvciAoaiA9IDA7IChqIDwgOCkgJiYgKHNjZC0+dmVuZG9yW2pdID49IDB4MjApOyBqKyspCisJCQkJCQlTUFJJTlRGICgiJWMiLCBzY2QtPnZlbmRvcltqXSk7CisJCQkJCVNQUklOVEYgKCIgIik7CisKKwkJCQkJZm9yIChqID0gMDsgKGogPCAxNikgJiYgKHNjZC0+bW9kZWxbal0gPj0gMHgyMCk7IGorKykKKwkJCQkJCVNQUklOVEYgKCIlYyIsIHNjZC0+bW9kZWxbal0pOworCQkKKwkJCQkJU1BSSU5URiAoIlxuIik7CisJCQkJfQorCQl9CisJfQorCVNQUklOVEYgKCJcbiIpOworCisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCisJaWYgKChwb3MgLSBidWZmZXIpIDwgb2Zmc2V0KQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChwb3MgLSBidWZmZXIgLSBvZmZzZXQgPCBsZW5ndGgpCisJCXJldHVybiBwb3MgLSBidWZmZXIgLSBvZmZzZXQ7CisJZWxzZQorCQlyZXR1cm4gbGVuZ3RoOworfQorCisvKiAKKyAgIEZvciBGQy1BTCwgd2UgdXNlIGEgc2ltcGxlIGFkZHJlc3Npbmc6IHdlIGhhdmUganVzdCBvbmUgY2hhbm5lbCAwLAorICAgYW5kIGFsbCBBTC1QQXMgYXJlIG1hcHBlZCB0byB0YXJnZXRzIDAuLjB4N2UKKyAqLworc3RhdGljIGludCBmY2FsX2VuY29kZV9hZGRyKFNjc2lfQ21uZCAqU0NwbnQsIHUxNiAqYWRkciwgZmNfY2hhbm5lbCAqZmMsIGZjcF9jbW5kICpmY21kKQoreworCXN0cnVjdCBmY2FsICpmOworCQorCS8qIFdlIGRvbid0IHN1cHBvcnQgTFVOcyB5ZXQgLSBJJ20gbm90IHN1cmUgaWYgTFVOIHNob3VsZCBiZSBpbiBTQ1NJIGZjcF9jZGIsIG9yIGluIHNlY29uZCBieXRlIG9mIGFkZHJbMF0gKi8KKwlpZiAoU0NwbnQtPmNtbmRbMV0gJiAweGUwKSByZXR1cm4gLUVJTlZBTDsKKwkvKiBGQy1QTERBIHRlbGxzIHVzLi4uICovCisJbWVtc2V0KGFkZHIsIDAsIDgpOworCWYgPSAoc3RydWN0IGZjYWwgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlpZiAoIWYtPm1hcFtTQ3BudC0+ZGV2aWNlLT5pZF0pCisJCXJldHVybiAtRUlOVkFMOworCS8qIE5vdywgZGV0ZXJtaW5lIERJRDogSXQgd2lsbCBiZSBOYXRpdmUgSWRlbnRpZmllciwgc28gd2UgemVybyB1cHBlcgorCSAgIDIgYnl0ZXMgb2YgdGhlIDMgYnl0ZSBESUQsIGxvd2VzdCBieXRlIHdpbGwgYmUgQUwtUEEgKi8KKwlmY21kLT5kaWQgPSB0YXJnZXQyYWxwYVtTQ3BudC0+ZGV2aWNlLT5pZF07CisJRkNBTEQoKCJ0cnlpbmcgRElEICUwNnhcbiIsIGZjbWQtPmRpZCkpCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5uYW1lCQkJPSAiRmlicmUgQ2hhbm5lbCBBcmJpdHJhdGVkIExvb3AiLAorCS5kZXRlY3QJCQk9IGZjYWxfZGV0ZWN0LAorCS5yZWxlYXNlCQk9IGZjYWxfcmVsZWFzZSwJCisJLnByb2NfaW5mbwkJPSBmY2FsX3Byb2NfaW5mbywKKwkucXVldWVjb21tYW5kCQk9IGZjcF9zY3NpX3F1ZXVlY29tbWFuZCwKKwkuc2xhdmVfY29uZmlndXJlCT0gZmNhbF9zbGF2ZV9jb25maWd1cmUsCisJLmNhbl9xdWV1ZQkJPSBGQ0FMX0NBTl9RVUVVRSwKKwkudGhpc19pZAkJPSAtMSwKKwkuc2dfdGFibGVzaXplCQk9IDEsCisJLmNtZF9wZXJfbHVuCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gZmNwX3Njc2lfYWJvcnQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gZmNwX3Njc2lfZGV2X3Jlc2V0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGZjcF9zY3NpX2J1c19yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCT0gZmNwX3Njc2lfaG9zdF9yZXNldCwKK307CisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZmNhbC5oIGIvZHJpdmVycy9zY3NpL2ZjYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWFhMzJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2ZjYWwuaApAQCAtMCwwICsxLDI3IEBACisvKiBmY2FsLmg6IEdlbmVyaWMgRmlicmUgQ2hhbm5lbCBBcmJpdHJhdGVkIExvb3AgU0NTSSBob3N0IGFkYXB0ZXIgZHJpdmVyIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCwxOTk5IEpha3ViIEplbGluZWsgKGpqQHVsdHJhLmxpbnV4LmN6KQorICovCisKKyNpZm5kZWYgX0ZDQUxfSAorI2RlZmluZSBfRkNBTF9ICisKKyNpbmNsdWRlICIuLi9mYzQvZmNwX2ltcGwuaCIKKworc3RydWN0IGZjYWwgeworCS8qIGZjIG11c3QgYmUgZmlyc3QgKi8KKwlmY19jaGFubmVsCQkqZmM7CisJdW5zaWduZWQgY2hhcgkJbWFwWzEyOF07CisJZmNfd3duCQkJbnBvcnRfd3duWzEyOF07CisJZmNfd3duCQkJbm9kZV93d25bMTI4XTsKK307CisKKy8qIEFyYml0cmFyeSBjb25zdGFudC4gQ2Fubm90IGJlIHRvbyBsYXJnZSwgYXMgZmM0IGxheWVyIGhhcyBsaW1pdGF0aW9ucworICAgZm9yIGEgcGFydGljdWxhciBjaGFubmVsICovCisjZGVmaW5lIEZDQUxfQ0FOX1FVRVVFCQk1MTIKKworaW50IGZjYWxfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK2ludCBmY2FsX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqKTsKK2ludCBmY2FsX3NsYXZlX2NvbmZpZ3VyZShTY3NpX0RldmljZSAqKTsKKworI2VuZGlmIC8qICEoX0ZDQUxfSCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mZF9tY3MuYyBiL2RyaXZlcnMvc2NzaS9mZF9tY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzA5MzBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2ZkX21jcy5jCkBAIC0wLDAgKzEsMTM2OSBAQAorLyogZmRfbWNzLmMgLS0gRnV0dXJlIERvbWFpbiBNQ1MgNjAwLzcwMCAob3IgSUJNIE9FTSkgZHJpdmVyCisgKgorICogRnV0dXJlRG9tYWluIE1DUy02MDAvNzAwIHYwLjIgMDMvMTEvMTk5OCBieSBaUCBHdSAoenBnQGNhc3RsZS5uZXQpCisgKgorICogVGhpcyBkcml2ZXIgaXMgY2xvbmVkIGZyb20gZmRvbWFpbi4qIHRvIHNwZWNpZmljYWxseSBzdXBwb3J0CisgKiB0aGUgRnV0dXJlIERvbWFpbiBNQ1MgNjAwLzcwMCBNQ0EgU0NTSSBhZGFwdGVycy4gU29tZSBQUy8ycworICogYWxzbyBlcXVpcHBlZCB3aXRoIElCTSBGYXN0IFNDU0kgQWRhcHRlci9BIHdoaWNoIGlzIGFuIE9FTQorICogb2YgTUNTIDcwMC4KKyAqCisgKiBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIFJlcGx5IFNCMTYvU0NTSSBjYXJkICh0aGUgU0NTSSBwYXJ0KS4KKyAqCisgKiBXaGF0IG1ha2VzIHRoaXMgZHJpdmVyIGRpZmZlcmVudCBpcyB0aGF0IHRoaXMgZHJpdmVyIGlzIE1DQSBvbmx5CisgKiBhbmQgaXQgc3VwcG9ydHMgbXVsdGlwbGUgYWRhcHRlcnMgaW4gdGhlIHNhbWUgc3lzdGVtLCBJUlEgCisgKiBzaGFyaW5nLCBzb21lIGRyaXZlciBzdGF0aXN0aWNzLCBhbmQgbWFwcyBoaWdoZXN0IFNDU0kgaWQgdG8gc2RhLgorICogQWxsIGNhcmRzIGFyZSBhdXRvLWRldGVjdGVkLgorICoKKyAqIEFzc3VtcHRpb25zOiBUTUMtMTgwMC8xOEM1MC8xOEMzMCwgQklPUyA+PSAzLjQKKyAqCisgKiBMSUxPIGNvbW1hbmQtbGluZSBvcHRpb25zOgorICogICBmZF9tY3M9PEZJRk9fQ09VTlQ+Wyw8RklGT19TSVpFPl0KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGxlYXNlIHNlZSBDb3B5cmlnaHRzL0NvbW1lbnRzIGluIGZkb21haW4uKiBmb3IgY3JlZGl0cy4KKyAqIEZvbGxvd2luZyBpcyBmcm9tIGZkb21haW4uYyBmb3IgYWNrbm93bGVkZ2VtZW50OgorICoKKyAqIENyZWF0ZWQ6IFN1biBNYXkgIDMgMTg6NTM6MTkgMTk5MiBieSBmYWl0aEBjcy51bmMuZWR1CisgKiBSZXZpc2VkOiBXZWQgT2N0ICAyIDExOjEwOjU1IDE5OTYgYnkgci5mYWl0aEBpZWVlLm9yZworICogQXV0aG9yOiBSaWNrYXJkIEUuIEZhaXRoLCBmYWl0aEBjcy51bmMuZWR1CisgKiBDb3B5cmlnaHQgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiBSaWNrYXJkIEUuIEZhaXRoCisgKgorICogJElkOiBmZG9tYWluLmMsdiA1LjQ1IDE5OTYvMTAvMDIgMTU6MTM6MDYgcm9vdCBFeHAgJAorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIE5PVEVTIE9OIFVTRVIgREVGSU5BQkxFIE9QVElPTlM6CisKKyBERUJVRzogVGhpcyB0dXJucyBvbiB0aGUgcHJpbnRpbmcgb2YgdmFyaW91cyBkZWJ1ZyBpbmZvcm1hdGlvbi4KKworIEVOQUJMRV9QQVJJVFk6IFRoaXMgdHVybnMgb24gU0NTSSBwYXJpdHkgY2hlY2tpbmcuICBXaXRoIHRoZSBjdXJyZW50CisgZHJpdmVyLCBhbGwgYXR0YWNoZWQgZGV2aWNlcyBtdXN0IHN1cHBvcnQgU0NTSSBwYXJpdHkuICBJZiBub25lIG9mIHlvdXIKKyBkZXZpY2VzIHN1cHBvcnQgcGFyaXR5LCB0aGVuIHlvdSBjYW4gcHJvYmFibHkgZ2V0IHRoZSBkcml2ZXIgdG8gd29yayBieQorIHR1cm5pbmcgdGhpcyBvcHRpb24gb2ZmLiAgSSBoYXZlIG5vIHdheSBvZiB0ZXN0aW5nIHRoaXMsIGhvd2V2ZXIsIGFuZCBpdAorIHdvdWxkIGFwcGVhciB0aGF0IG5vIG9uZSBldmVyIHVzZXMgdGhpcyBvcHRpb24uCisKKyBGSUZPX0NPVU5UOiBUaGUgaG9zdCBhZGFwdGVyIGhhcyBhbiA4SyBjYWNoZSAoaG9zdCBhZGFwdGVycyBiYXNlZCBvbiB0aGUKKyAxOEMzMCBjaGlwIGhhdmUgYSAyayBjYWNoZSkuICBXaGVuIHRoaXMgbWFueSA1MTIgYnl0ZSBibG9ja3MgYXJlIGZpbGxlZCBieQorIHRoZSBTQ1NJIGRldmljZSwgYW4gaW50ZXJydXB0IHdpbGwgYmUgcmFpc2VkLiAgVGhlcmVmb3JlLCB0aGlzIGNvdWxkIGJlIGFzCisgbG93IGFzIDAsIG9yIGFzIGhpZ2ggYXMgMTYuICBOb3RlLCBob3dldmVyLCB0aGF0IHZhbHVlcyB3aGljaCBhcmUgdG9vIGhpZ2gKKyBvciB0b28gbG93IHNlZW0gdG8gcHJldmVudCBhbnkgaW50ZXJydXB0cyBmcm9tIG9jY3VycmluZywgYW5kIHRoZXJlYnkgbG9jaworIHVwIHRoZSBtYWNoaW5lLiAgSSBoYXZlIGZvdW5kIHRoYXQgMiBpcyBhIGdvb2QgbnVtYmVyLCBidXQgdGhyb3VnaHB1dCBtYXkKKyBiZSBpbmNyZWFzZWQgYnkgY2hhbmdpbmcgdGhpcyB2YWx1ZSB0byB2YWx1ZXMgd2hpY2ggYXJlIGNsb3NlIHRvIDIuCisgUGxlYXNlIGxldCBtZSBrbm93IGlmIHlvdSB0cnkgYW55IGRpZmZlcmVudCB2YWx1ZXMuCisgWyoqKioqTm93IGEgcnVudGltZSBvcHRpb24qKioqKl0KKworIFJFU0VMRUNUSU9OOiBUaGlzIGlzIG5vIGxvbmdlciBhbiBvcHRpb24sIHNpbmNlIEkgZ2F2ZSB1cCB0cnlpbmcgdG8KKyBpbXBsZW1lbnQgaXQgaW4gdmVyc2lvbiA0Lnggb2YgdGhpcyBkcml2ZXIuICBJdCBkaWQgbm90IGltcHJvdmUKKyBwZXJmb3JtYW5jZSBhdCBhbGwgYW5kIG1hZGUgdGhlIGRyaXZlciB1bnN0YWJsZSAoYmVjYXVzZSBJIG5ldmVyIGZvdW5kIG9uZQorIG9mIHRoZSB0d28gcmFjZSBjb25kaXRpb25zIHdoaWNoIHdlcmUgaW50cm9kdWNlZCBieSB0aGUgbXVsdGlwbGUKKyBvdXRzdGFuZGluZyBjb21tYW5kIGNvZGUpLiAgVGhlIGluc3RhYmlsaXR5IHNlZW1zIGEgdmVyeSBoaWdoIHByaWNlIHRvIHBheQorIGp1c3Qgc28gdGhhdCB5b3UgZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciB0aGUgdGFwZSB0byByZXdpbmQuICBJZiB5b3Ugd2FudAorIHRoaXMgZmVhdHVyZSBpbXBsZW1lbnRlZCwgc2VuZCBtZSBwYXRjaGVzLiAgSSdsbCBiZSBoYXBweSB0byBzZW5kIGEgY29weQorIG9mIG15IChicm9rZW4pIGRyaXZlciB0byBhbnlvbmUgd2hvIHdvdWxkIGxpa2UgdG8gc2VlIGEgY29weS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbWNhLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EtbGVnYWN5Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjAuMiBieSBaUCBHdTx6cGdAY2FzdGxlLm5ldD4iCisKKy8qIFNUQVJUIE9GIFVTRVIgREVGSU5BQkxFIE9QVElPTlMgKi8KKworI2RlZmluZSBERUJVRyAgICAgICAgICAgIDAJLyogRW5hYmxlIGRlYnVnZ2luZyBvdXRwdXQgKi8KKyNkZWZpbmUgRU5BQkxFX1BBUklUWSAgICAxCS8qIEVuYWJsZSBTQ1NJIFBhcml0eSAqLworCisvKiBFTkQgT0YgVVNFUiBERUZJTkFCTEUgT1BUSU9OUyAqLworCisjaWYgREVCVUcKKyNkZWZpbmUgRVZFUllfQUNDRVNTICAgICAwCS8qIFdyaXRlIGEgbGluZSBvbiBldmVyeSBzY3NpIGFjY2VzcyAqLworI2RlZmluZSBFUlJPUlNfT05MWSAgICAgIDEJLyogT25seSB3cml0ZSBhIGxpbmUgaWYgdGhlcmUgaXMgYW4gZXJyb3IgKi8KKyNkZWZpbmUgREVCVUdfTUVTU0FHRVMgICAxCS8qIERlYnVnIE1FU1NBR0UgSU4gcGhhc2UgKi8KKyNkZWZpbmUgREVCVUdfQUJPUlQgICAgICAxCS8qIERlYnVnIGFib3J0KCkgcm91dGluZSAqLworI2RlZmluZSBERUJVR19SRVNFVCAgICAgIDEJLyogRGVidWcgcmVzZXQoKSByb3V0aW5lICovCisjZGVmaW5lIERFQlVHX1JBQ0UgICAgICAgMQkvKiBEZWJ1ZyBpbnRlcnJ1cHQtZHJpdmVuIHJhY2UgY29uZGl0aW9uICovCisjZWxzZQorI2RlZmluZSBFVkVSWV9BQ0NFU1MgICAgIDAJLyogTEVBVkUgVEhFU0UgQUxPTkUtLUNIQU5HRSBUSEUgT05FUyBBQk9WRSAqLworI2RlZmluZSBFUlJPUlNfT05MWSAgICAgIDAKKyNkZWZpbmUgREVCVUdfTUVTU0FHRVMgICAwCisjZGVmaW5lIERFQlVHX0FCT1JUICAgICAgMAorI2RlZmluZSBERUJVR19SRVNFVCAgICAgIDAKKyNkZWZpbmUgREVCVUdfUkFDRSAgICAgICAwCisjZW5kaWYKKworLyogRXJyb3JzIGFyZSByZXBvcnRlZCBvbiB0aGUgbGluZSwgc28gd2UgZG9uJ3QgbmVlZCB0byByZXBvcnQgdGhlbSBhZ2FpbiAqLworI2lmIEVWRVJZX0FDQ0VTUworI3VuZGVmIEVSUk9SU19PTkxZCisjZGVmaW5lIEVSUk9SU19PTkxZICAgICAgMAorI2VuZGlmCisKKyNpZiBFTkFCTEVfUEFSSVRZCisjZGVmaW5lIFBBUklUWV9NQVNLICAgICAgMHgwOAorI2Vsc2UKKyNkZWZpbmUgUEFSSVRZX01BU0sgICAgICAweDAwCisjZW5kaWYKKworZW51bSBjaGlwX3R5cGUgeworCXVua25vd24gPSAweDAwLAorCXRtYzE4MDAgPSAweDAxLAorCXRtYzE4YzUwID0gMHgwMiwKKwl0bWMxOGMzMCA9IDB4MDMsCit9OworCitlbnVtIHsKKwlpbl9hcmJpdHJhdGlvbiA9IDB4MDIsCisJaW5fc2VsZWN0aW9uID0gMHgwNCwKKwlpbl9vdGhlciA9IDB4MDgsCisJZGlzY29ubmVjdCA9IDB4MTAsCisJYWJvcnRlZCA9IDB4MjAsCisJc2VudF9pZGVudCA9IDB4NDAsCit9OworCitlbnVtIGluX3BvcnRfdHlwZSB7CisJUmVhZF9TQ1NJX0RhdGEgPSAwLAorCVNDU0lfU3RhdHVzID0gMSwKKwlUTUNfU3RhdHVzID0gMiwKKwlGSUZPX1N0YXR1cyA9IDMsCS8qIHRtYzE4YzUwL3RtYzE4YzMwIG9ubHkgKi8KKwlJbnRlcnJ1cHRfQ29uZCA9IDQsCS8qIHRtYzE4YzUwL3RtYzE4YzMwIG9ubHkgKi8KKwlMU0JfSURfQ29kZSA9IDUsCisJTVNCX0lEX0NvZGUgPSA2LAorCVJlYWRfTG9vcGJhY2sgPSA3LAorCVNDU0lfRGF0YV9Ob0FDSyA9IDgsCisJSW50ZXJydXB0X1N0YXR1cyA9IDksCisJQ29uZmlndXJhdGlvbjEgPSAxMCwKKwlDb25maWd1cmF0aW9uMiA9IDExLAkvKiB0bWMxOGM1MC90bWMxOGMzMCBvbmx5ICovCisJUmVhZF9GSUZPID0gMTIsCisJRklGT19EYXRhX0NvdW50ID0gMTQKK307CisKK2VudW0gb3V0X3BvcnRfdHlwZSB7CisJV3JpdGVfU0NTSV9EYXRhID0gMCwKKwlTQ1NJX0NudGwgPSAxLAorCUludGVycnVwdF9DbnRsID0gMiwKKwlTQ1NJX01vZGVfQ250bCA9IDMsCisJVE1DX0NudGwgPSA0LAorCU1lbW9yeV9DbnRsID0gNSwJLyogdG1jMThjNTAvdG1jMThjMzAgb25seSAqLworCVdyaXRlX0xvb3BiYWNrID0gNywKKwlJT19Db250cm9sID0gMTEsCS8qIHRtYzE4YzMwIG9ubHkgKi8KKwlXcml0ZV9GSUZPID0gMTIKK307CisKK3N0cnVjdCBmZF9ob3N0ZGF0YSB7CisJdW5zaWduZWQgbG9uZyBfYmlvc19iYXNlOworCWludCBfYmlvc19tYWpvcjsKKwlpbnQgX2Jpb3NfbWlub3I7CisJdm9sYXRpbGUgaW50IF9pbl9jb21tYW5kOworCVNjc2lfQ21uZCAqX2N1cnJlbnRfU0M7CisJZW51bSBjaGlwX3R5cGUgX2NoaXA7CisJaW50IF9hZGFwdGVyX21hc2s7CisJaW50IF9maWZvX2NvdW50OwkvKiBOdW1iZXIgb2YgNTEyIGJ5dGUgYmxvY2tzIGJlZm9yZSBJTlRSICovCisKKwljaGFyIF9hZGFwdGVyX25hbWVbNjRdOworI2lmIERFQlVHX1JBQ0UKKwl2b2xhdGlsZSBpbnQgX2luX2ludGVycnVwdF9mbGFnOworI2VuZGlmCisKKwlpbnQgX1NDU0lfTW9kZV9DbnRsX3BvcnQ7CisJaW50IF9GSUZPX0RhdGFfQ291bnRfcG9ydDsKKwlpbnQgX0ludGVycnVwdF9DbnRsX3BvcnQ7CisJaW50IF9JbnRlcnJ1cHRfU3RhdHVzX3BvcnQ7CisJaW50IF9JbnRlcnJ1cHRfQ29uZF9wb3J0OworCWludCBfUmVhZF9GSUZPX3BvcnQ7CisJaW50IF9SZWFkX1NDU0lfRGF0YV9wb3J0OworCWludCBfU0NTSV9DbnRsX3BvcnQ7CisJaW50IF9TQ1NJX0RhdGFfTm9BQ0tfcG9ydDsKKwlpbnQgX1NDU0lfU3RhdHVzX3BvcnQ7CisJaW50IF9UTUNfQ250bF9wb3J0OworCWludCBfVE1DX1N0YXR1c19wb3J0OworCWludCBfV3JpdGVfRklGT19wb3J0OworCWludCBfV3JpdGVfU0NTSV9EYXRhX3BvcnQ7CisKKwlpbnQgX0ZJRk9fU2l6ZTsJCS8qID0gMHgyMDAwOyAgOGsgRklGTyBmb3IKKwkJCQkgICBwcmUtdG1jMThjMzAgY2hpcHMgKi8KKwkvKiBzaW1wbGUgc3RhdHMgKi8KKwlpbnQgX0J5dGVzX1JlYWQ7CisJaW50IF9CeXRlc19Xcml0dGVuOworCWludCBfSU5UUl9Qcm9jZXNzZWQ7Cit9OworCisjZGVmaW5lIEZEX01BWF9IT1NUUyAzCQkvKiBlbm91Z2g/ICovCisKKyNkZWZpbmUgSE9TVERBVEEoc2hwbnQpICgoc3RydWN0IGZkX2hvc3RkYXRhICopIHNocG50LT5ob3N0ZGF0YSkKKyNkZWZpbmUgYmlvc19iYXNlICAgICAgICAgICAgIChIT1NUREFUQShzaHBudCktPl9iaW9zX2Jhc2UpCisjZGVmaW5lIGJpb3NfbWFqb3IgICAgICAgICAgICAoSE9TVERBVEEoc2hwbnQpLT5fYmlvc19tYWpvcikKKyNkZWZpbmUgYmlvc19taW5vciAgICAgICAgICAgIChIT1NUREFUQShzaHBudCktPl9iaW9zX21pbm9yKQorI2RlZmluZSBpbl9jb21tYW5kICAgICAgICAgICAgKEhPU1REQVRBKHNocG50KS0+X2luX2NvbW1hbmQpCisjZGVmaW5lIGN1cnJlbnRfU0MgICAgICAgICAgICAoSE9TVERBVEEoc2hwbnQpLT5fY3VycmVudF9TQykKKyNkZWZpbmUgY2hpcCAgICAgICAgICAgICAgICAgIChIT1NUREFUQShzaHBudCktPl9jaGlwKQorI2RlZmluZSBhZGFwdGVyX21hc2sgICAgICAgICAgKEhPU1REQVRBKHNocG50KS0+X2FkYXB0ZXJfbWFzaykKKyNkZWZpbmUgRklGT19DT1VOVCAgICAgICAgICAgIChIT1NUREFUQShzaHBudCktPl9maWZvX2NvdW50KQorI2RlZmluZSBhZGFwdGVyX25hbWUgICAgICAgICAgKEhPU1REQVRBKHNocG50KS0+X2FkYXB0ZXJfbmFtZSkKKyNpZiBERUJVR19SQUNFCisjZGVmaW5lIGluX2ludGVycnVwdF9mbGFnICAgICAoSE9TVERBVEEoc2hwbnQpLT5faW5faW50ZXJydXB0X2ZsYWcpCisjZW5kaWYKKyNkZWZpbmUgU0NTSV9Nb2RlX0NudGxfcG9ydCAgIChIT1NUREFUQShzaHBudCktPl9TQ1NJX01vZGVfQ250bF9wb3J0KQorI2RlZmluZSBGSUZPX0RhdGFfQ291bnRfcG9ydCAgKEhPU1REQVRBKHNocG50KS0+X0ZJRk9fRGF0YV9Db3VudF9wb3J0KQorI2RlZmluZSBJbnRlcnJ1cHRfQ250bF9wb3J0ICAgKEhPU1REQVRBKHNocG50KS0+X0ludGVycnVwdF9DbnRsX3BvcnQpCisjZGVmaW5lIEludGVycnVwdF9TdGF0dXNfcG9ydCAoSE9TVERBVEEoc2hwbnQpLT5fSW50ZXJydXB0X1N0YXR1c19wb3J0KQorI2RlZmluZSBJbnRlcnJ1cHRfQ29uZF9wb3J0ICAgKEhPU1REQVRBKHNocG50KS0+X0ludGVycnVwdF9Db25kX3BvcnQpCisjZGVmaW5lIFJlYWRfRklGT19wb3J0ICAgICAgICAoSE9TVERBVEEoc2hwbnQpLT5fUmVhZF9GSUZPX3BvcnQpCisjZGVmaW5lIFJlYWRfU0NTSV9EYXRhX3BvcnQgICAoSE9TVERBVEEoc2hwbnQpLT5fUmVhZF9TQ1NJX0RhdGFfcG9ydCkKKyNkZWZpbmUgU0NTSV9DbnRsX3BvcnQgICAgICAgIChIT1NUREFUQShzaHBudCktPl9TQ1NJX0NudGxfcG9ydCkKKyNkZWZpbmUgU0NTSV9EYXRhX05vQUNLX3BvcnQgIChIT1NUREFUQShzaHBudCktPl9TQ1NJX0RhdGFfTm9BQ0tfcG9ydCkKKyNkZWZpbmUgU0NTSV9TdGF0dXNfcG9ydCAgICAgIChIT1NUREFUQShzaHBudCktPl9TQ1NJX1N0YXR1c19wb3J0KQorI2RlZmluZSBUTUNfQ250bF9wb3J0ICAgICAgICAgKEhPU1REQVRBKHNocG50KS0+X1RNQ19DbnRsX3BvcnQpCisjZGVmaW5lIFRNQ19TdGF0dXNfcG9ydCAgICAgICAoSE9TVERBVEEoc2hwbnQpLT5fVE1DX1N0YXR1c19wb3J0KQorI2RlZmluZSBXcml0ZV9GSUZPX3BvcnQgICAgICAgKEhPU1REQVRBKHNocG50KS0+X1dyaXRlX0ZJRk9fcG9ydCkKKyNkZWZpbmUgV3JpdGVfU0NTSV9EYXRhX3BvcnQgIChIT1NUREFUQShzaHBudCktPl9Xcml0ZV9TQ1NJX0RhdGFfcG9ydCkKKyNkZWZpbmUgRklGT19TaXplICAgICAgICAgICAgIChIT1NUREFUQShzaHBudCktPl9GSUZPX1NpemUpCisjZGVmaW5lIEJ5dGVzX1JlYWQgICAgICAgICAgICAoSE9TVERBVEEoc2hwbnQpLT5fQnl0ZXNfUmVhZCkKKyNkZWZpbmUgQnl0ZXNfV3JpdHRlbiAgICAgICAgIChIT1NUREFUQShzaHBudCktPl9CeXRlc19Xcml0dGVuKQorI2RlZmluZSBJTlRSX1Byb2Nlc3NlZCAgICAgICAgKEhPU1REQVRBKHNocG50KS0+X0lOVFJfUHJvY2Vzc2VkKQorCitzdHJ1Y3QgZmRfbWNzX2FkYXB0ZXJzX3N0cnVjdCB7CisJY2hhciAqbmFtZTsKKwlpbnQgaWQ7CisJZW51bSBjaGlwX3R5cGUgZmRfY2hpcDsKKwlpbnQgZmlmb19zaXplOworCWludCBmaWZvX2NvdW50OworfTsKKworI2RlZmluZSBSRVBMWV9JRCAweDUxMzcKKworc3RhdGljIHN0cnVjdCBmZF9tY3NfYWRhcHRlcnNfc3RydWN0IGZkX21jc19hZGFwdGVyc1tdID0geworCXsiRnV0dXJlIERvbWFpbiBTQ1NJIEFkYXB0ZXIgTUNTLTcwMCgxOEM1MCkiLAorCSAweDYwZTksCisJIHRtYzE4YzUwLAorCSAweDIwMDAsCisJIDR9LAorCXsiRnV0dXJlIERvbWFpbiBTQ1NJIEFkYXB0ZXIgTUNTLTYwMC83MDAoVE1DLTE4MDApIiwKKwkgMHg2MTI3LAorCSB0bWMxODAwLAorCSAweDIwMDAsCisJIDR9LAorCXsiUmVwbHkgU291bmQgQmxhc3Rlci9TQ1NJIEFkYXB0ZXIiLAorCSBSRVBMWV9JRCwKKwkgdG1jMThjMzAsCisJIDB4ODAwLAorCSAyfSwKK307CisKKyNkZWZpbmUgRkRfQlJEUyBzaXplb2YoZmRfbWNzX2FkYXB0ZXJzKS9zaXplb2Yoc3RydWN0IGZkX21jc19hZGFwdGVyc19zdHJ1Y3QpCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBmZF9tY3NfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWRkcmVzc2VzW10gPSB7IDB4YzgwMDAsIDB4Y2EwMDAsIDB4Y2UwMDAsIDB4ZGUwMDAgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwb3J0c1tdID0geyAweDE0MCwgMHgxNTAsIDB4MTYwLCAweDE3MCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IGludGVycnVwdHNbXSA9IHsgMywgNSwgMTAsIDExLCAxMiwgMTQsIDE1LCAwIH07CisKKy8qIGhvc3QgaW5mb3JtYXRpb24gKi8KK3N0YXRpYyBpbnQgZm91bmQgPSAwOworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3RzW0ZEX01BWF9IT1NUUyArIDFdID0geyBOVUxMIH07CisKK3N0YXRpYyBpbnQgdXNlcl9maWZvX2NvdW50ID0gMDsKK3N0YXRpYyBpbnQgdXNlcl9maWZvX3NpemUgPSAwOworCitzdGF0aWMgaW50IF9faW5pdCBmZF9tY3Nfc2V0dXAoY2hhciAqc3RyKQoreworCXN0YXRpYyBpbnQgZG9uZV9zZXR1cCA9IDA7CisJaW50IGludHNbM107CisKKwlnZXRfb3B0aW9ucyhzdHIsIDMsIGludHMpOworCWlmIChkb25lX3NldHVwKysgfHwgaW50c1swXSA8IDEgfHwgaW50c1swXSA+IDIgfHwgaW50c1sxXSA8IDEgfHwgaW50c1sxXSA+IDE2KSB7CisJCXByaW50aygiZmRfbWNzOiB1c2FnZTogZmRfbWNzPUZJRk9fQ09VTlQsIEZJRk9fU0laRVxuIik7CisJCXJldHVybiAwOworCX0KKworCXVzZXJfZmlmb19jb3VudCA9IGludHNbMF0gPj0gMSA/IGludHNbMV0gOiAwOworCXVzZXJfZmlmb19zaXplID0gaW50c1swXSA+PSAyID8gaW50c1syXSA6IDA7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImZkX21jcz0iLCBmZF9tY3Nfc2V0dXApOworCitzdGF0aWMgdm9pZCBwcmludF9iYW5uZXIoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJcHJpbnRrKCJzY3NpJWQgPGZkX21jcz46ICIsIHNocG50LT5ob3N0X25vKTsKKworCWlmIChiaW9zX2Jhc2UpIHsKKwkJcHJpbnRrKCJCSU9TIGF0IDB4JWxYIiwgYmlvc19iYXNlKTsKKwl9IGVsc2UgeworCQlwcmludGsoIk5vIEJJT1MiKTsKKwl9CisKKwlwcmludGsoIiwgSG9zdElEICVkLCAlcyBDaGlwLCBJUlEgJWQsIElPIDB4JWxYXG4iLCBzaHBudC0+dGhpc19pZCwgY2hpcCA9PSB0bWMxOGM1MCA/ICJUTUMtMThDNTAiIDogKGNoaXAgPT0gdG1jMThjMzAgPyAiVE1DLTE4QzMwIiA6IChjaGlwID09IHRtYzE4MDAgPyAiVE1DLTE4MDAiIDogIlVua25vd24iKSksIHNocG50LT5pcnEsIHNocG50LT5pb19wb3J0KTsKK30KKworCitzdGF0aWMgdm9pZCBkb19wYXVzZSh1bnNpZ25lZCBhbW91bnQpCit7CQkJCS8qIFBhdXNlIGZvciBhbW91bnQqMTAgbWlsbGlzZWNvbmRzICovCisJZG8geworCQltZGVsYXkoMTApOworCX0gd2hpbGUgKC0tYW1vdW50KTsKK30KKworc3RhdGljIHZvaWQgZmRfbWNzX21ha2VfYnVzX2lkbGUoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJb3V0YigwLCBTQ1NJX0NudGxfcG9ydCk7CisJb3V0YigwLCBTQ1NJX01vZGVfQ250bF9wb3J0KTsKKwlpZiAoY2hpcCA9PSB0bWMxOGM1MCB8fCBjaGlwID09IHRtYzE4YzMwKQorCQlvdXRiKDB4MjEgfCBQQVJJVFlfTUFTSywgVE1DX0NudGxfcG9ydCk7CS8qIENsZWFyIGZvcmNlZCBpbnRyLiAqLworCWVsc2UKKwkJb3V0YigweDAxIHwgUEFSSVRZX01BU0ssIFRNQ19DbnRsX3BvcnQpOworfQorCitzdGF0aWMgaW50IGZkX21jc19kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICogdHBudCkKK3sKKwlpbnQgbG9vcDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudDsKKworCS8qIGdldCBpZCwgcG9ydCwgYmlvcywgaXJxICovCisJaW50IHNsb3Q7CisJdV9jaGFyIHBvczIsIHBvczMsIHBvczQ7CisJaW50IGlkLCBwb3J0LCBpcnE7CisJdW5zaWduZWQgbG9uZyBiaW9zOworCisJLyogaWYgbm90IE1DQSBtYWNoaW5lLCByZXR1cm4gKi8KKwlpZiAoIU1DQV9idXMpCisJCXJldHVybiAwOworCisJLyogY2hhbmdlYWJsZT8gKi8KKwlpZCA9IDc7CisKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgRkRfQlJEUzsgbG9vcCsrKSB7CisJCXNsb3QgPSAwOworCQl3aGlsZSAoTUNBX05PVEZPVU5EICE9IChzbG90ID0gbWNhX2ZpbmRfYWRhcHRlcihmZF9tY3NfYWRhcHRlcnNbbG9vcF0uaWQsIHNsb3QpKSkgeworCisJCQkvKiBpZiB3ZSBnZXQgdGhpcyBmYXIsIGFuIGFkYXB0ZXIgaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kIGlzCisJCQkgICBlbmFibGVkICovCisKKwkJCXByaW50ayhLRVJOX0lORk8gInNjc2kgIDxmZF9tY3M+OiAlcyBhdCBzbG90ICVkXG4iLCBmZF9tY3NfYWRhcHRlcnNbbG9vcF0ubmFtZSwgc2xvdCArIDEpOworCisJCQlwb3MyID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCAyKTsKKwkJCXBvczMgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDMpOworCQkJcG9zNCA9IG1jYV9yZWFkX3N0b3JlZF9wb3Moc2xvdCwgNCk7CisKKwkJCS8qIHJlYWR5IGZvciBuZXh0IHByb2JlICovCisJCQlzbG90Kys7CisKKwkJCWlmIChmZF9tY3NfYWRhcHRlcnNbbG9vcF0uaWQgPT0gUkVQTFlfSUQpIHsJLyogcmVwbHkgY2FyZCAqLworCQkJCXN0YXRpYyBpbnQgcmVwbHlfaXJxW10gPSB7IDEwLCAxMSwgMTQsIDE1IH07CisKKwkJCQliaW9zID0gMDsJLyogbm8gYmlvcyAqLworCisJCQkJaWYgKHBvczIgJiAweDIpCisJCQkJCXBvcnQgPSBwb3J0c1twb3M0ICYgMHgzXTsKKwkJCQllbHNlCisJCQkJCWNvbnRpbnVlOworCisJCQkJLyogY2FuJ3QgcmVhbGx5IGRpc2FibGUgaXQsIHNhbWUgYXMgaXJxPTEwICovCisJCQkJaXJxID0gcmVwbHlfaXJxWygocG9zNCA+PiAyKSAmIDB4MSkgKyAyICogKChwb3M0ID4+IDQpICYgMHgxKV07CisJCQl9IGVsc2UgeworCQkJCWJpb3MgPSBhZGRyZXNzZXNbcG9zMiA+PiA2XTsKKwkJCQlwb3J0ID0gcG9ydHNbKHBvczIgPj4gNCkgJiAweDAzXTsKKwkJCQlpcnEgPSBpbnRlcnJ1cHRzWyhwb3MyID4+IDEpICYgMHgwN107CisJCQl9CisKKwkJCWlmIChpcnEpIHsKKwkJCQkvKiBjbGFpbSB0aGUgc2xvdCAqLworCQkJCW1jYV9zZXRfYWRhcHRlcl9uYW1lKHNsb3QgLSAxLCBmZF9tY3NfYWRhcHRlcnNbbG9vcF0ubmFtZSk7CisKKwkJCQkvKiBjaGVjayBpcnEvcmVnaW9uICovCisJCQkJaWYgKHJlcXVlc3RfaXJxKGlycSwgZmRfbWNzX2ludHIsIFNBX1NISVJRLCAiZmRfbWNzIiwgaG9zdHMpKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiZmRfbWNzOiBpbnRlcnJ1cHQgaXMgbm90IGF2YWlsYWJsZSwgc2tpcHBpbmcuLi5cbiIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQkvKiByZXF1ZXN0IEkvTyByZWdpb24gKi8KKwkJCQlpZiAocmVxdWVzdF9yZWdpb24ocG9ydCwgMHgxMCwgImZkX21jcyIpKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiZmRfbWNzOiBJL08gcmVnaW9uIGlzIGFscmVhZHkgaW4gdXNlLCBza2lwcGluZy4uLlxuIik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKiByZWdpc3RlciAqLworCQkJCWlmICghKHNocG50ID0gc2NzaV9yZWdpc3Rlcih0cG50LCBzaXplb2Yoc3RydWN0IGZkX2hvc3RkYXRhKSkpKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiZmRfbWNzOiBzY3NpX3JlZ2lzdGVyKCkgZmFpbGVkXG4iKTsKKwkJCQkJcmVsZWFzZV9yZWdpb24ocG9ydCwgMHgxMCk7CisJCQkJCWZyZWVfaXJxKGlycSwgaG9zdHMpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKworCQkJCS8qIHNhdmUgbmFtZSAqLworCQkJCXN0cmNweShhZGFwdGVyX25hbWUsIGZkX21jc19hZGFwdGVyc1tsb29wXS5uYW1lKTsKKworCQkJCS8qIGNoaXAvZmlmbyAqLworCQkJCWNoaXAgPSBmZF9tY3NfYWRhcHRlcnNbbG9vcF0uZmRfY2hpcDsKKwkJCQkvKiB1c2UgYm9vdCB0aW1lIHZhbHVlIGlmIGF2YWlsYWJsZSAqLworCQkJCUZJRk9fQ09VTlQgPSB1c2VyX2ZpZm9fY291bnQgPyB1c2VyX2ZpZm9fY291bnQgOiBmZF9tY3NfYWRhcHRlcnNbbG9vcF0uZmlmb19jb3VudDsKKwkJCQlGSUZPX1NpemUgPSB1c2VyX2ZpZm9fc2l6ZSA/IHVzZXJfZmlmb19zaXplIDogZmRfbWNzX2FkYXB0ZXJzW2xvb3BdLmZpZm9fc2l6ZTsKKworLyogRklYTUU6IERvIHdlIG5lZWQgdG8ga2VlcCB0aGlzIGJpdCBvZiBjb2RlIGluc2lkZSBOT1RfVVNFRCBhcm91bmQgYXQgYWxsPyAqLworI2lmZGVmIE5PVF9VU0VECisJCQkJLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisJCQkJLyogVHJ5IHRvIHRvZ2dsZSAzMi1iaXQgbW9kZS4gIFRoaXMgb25seQorCQkJCSAgIHdvcmtzIG9uIGFuIDE4YzMwIGNoaXAuICAoVXNlciByZXBvcnRzCisJCQkJICAgc2F5IHRoaXMgd29ya3MsIHNvIHdlIHNob3VsZCBzd2l0Y2ggdG8KKwkJCQkgICBpdCBpbiB0aGUgbmVhciBmdXR1cmUuKSAqLworCQkJCW91dGIoMHg4MCwgcG9ydCArIElPX0NvbnRyb2wpOworCQkJCWlmICgoaW5iKHBvcnQgKyBDb25maWd1cmF0aW9uMikgJiAweDgwKSA9PSAweDgwKSB7CisJCQkJCW91dGIoMHgwMCwgcG9ydCArIElPX0NvbnRyb2wpOworCQkJCQlpZiAoKGluYihwb3J0ICsgQ29uZmlndXJhdGlvbjIpICYgMHg4MCkgPT0gMHgwMCkgeworCQkJCQkJY2hpcCA9IHRtYzE4YzMwOworCQkJCQkJRklGT19TaXplID0gMHg4MDA7CS8qIDJrIEZJRk8gKi8KKworCQkJCQkJcHJpbnRrKCJGSVJTVDogY2hpcD0lcywgZmlmb19zaXplPTB4JXhcbiIsIChjaGlwID09IHRtYzE4YzMwKSA/ICJ0bWMxOGMzMCIgOiAidG1jMThjNTAiLCBGSUZPX1NpemUpOworCQkJCQl9CisJCQkJfQorCisJCQkJLyogVGhhdCBzaG91bGQgaGF2ZSB3b3JrZWQsIGJ1dCBhcHBlYXJzIHRvCisJCQkJICAgaGF2ZSBwcm9ibGVtcy4gIExldCdzIGFzc3VtZSBpdCBpcyBhbgorCQkJCSAgIDE4YzMwIGlmIHRoZSBSQU0gaXMgZGlzYWJsZWQuICovCisKKwkJCQlpZiAoaW5iKHBvcnQgKyBDb25maWd1cmF0aW9uMikgJiAweDAyKSB7CisJCQkJCWNoaXAgPSB0bWMxOGMzMDsKKwkJCQkJRklGT19TaXplID0gMHg4MDA7CS8qIDJrIEZJRk8gKi8KKworCQkJCQlwcmludGsoIlNFQ09ORDogY2hpcD0lcywgZmlmb19zaXplPTB4JXhcbiIsIChjaGlwID09IHRtYzE4YzMwKSA/ICJ0bWMxOGMzMCIgOiAidG1jMThjNTAiLCBGSUZPX1NpemUpOworCQkJCX0KKwkJCQkvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNlbmRpZgorCisJCQkJLyogSUJNL0FOU0kgc2NzaSBzY2FuIG9yZGVyaW5nICovCisJCQkJLyogU3RpY2sgdGhpcyBiYWNrIGluIHdoZW4gdGhlIHNjc2kuYyBjaGFuZ2VzIGFyZSB0aGVyZSAqLworCQkJCXNocG50LT5yZXZlcnNlX29yZGVyaW5nID0gMTsKKworCisJCQkJLyogc2F2aW5nIGluZm8gKi8KKwkJCQlob3N0c1tmb3VuZCsrXSA9IHNocG50OworCisJCQkJc2hwbnQtPnRoaXNfaWQgPSBpZDsKKwkJCQlzaHBudC0+aXJxID0gaXJxOworCQkJCXNocG50LT5pb19wb3J0ID0gcG9ydDsKKwkJCQlzaHBudC0+bl9pb19wb3J0ID0gMHgxMDsKKworCQkJCS8qIHNhdmUgKi8KKwkJCQliaW9zX2Jhc2UgPSBiaW9zOworCQkJCWFkYXB0ZXJfbWFzayA9ICgxIDw8IGlkKTsKKworCQkJCS8qIHNhdmUgbW9yZSAqLworCQkJCVNDU0lfTW9kZV9DbnRsX3BvcnQgPSBwb3J0ICsgU0NTSV9Nb2RlX0NudGw7CisJCQkJRklGT19EYXRhX0NvdW50X3BvcnQgPSBwb3J0ICsgRklGT19EYXRhX0NvdW50OworCQkJCUludGVycnVwdF9DbnRsX3BvcnQgPSBwb3J0ICsgSW50ZXJydXB0X0NudGw7CisJCQkJSW50ZXJydXB0X1N0YXR1c19wb3J0ID0gcG9ydCArIEludGVycnVwdF9TdGF0dXM7CisJCQkJSW50ZXJydXB0X0NvbmRfcG9ydCA9IHBvcnQgKyBJbnRlcnJ1cHRfQ29uZDsKKwkJCQlSZWFkX0ZJRk9fcG9ydCA9IHBvcnQgKyBSZWFkX0ZJRk87CisJCQkJUmVhZF9TQ1NJX0RhdGFfcG9ydCA9IHBvcnQgKyBSZWFkX1NDU0lfRGF0YTsKKwkJCQlTQ1NJX0NudGxfcG9ydCA9IHBvcnQgKyBTQ1NJX0NudGw7CisJCQkJU0NTSV9EYXRhX05vQUNLX3BvcnQgPSBwb3J0ICsgU0NTSV9EYXRhX05vQUNLOworCQkJCVNDU0lfU3RhdHVzX3BvcnQgPSBwb3J0ICsgU0NTSV9TdGF0dXM7CisJCQkJVE1DX0NudGxfcG9ydCA9IHBvcnQgKyBUTUNfQ250bDsKKwkJCQlUTUNfU3RhdHVzX3BvcnQgPSBwb3J0ICsgVE1DX1N0YXR1czsKKwkJCQlXcml0ZV9GSUZPX3BvcnQgPSBwb3J0ICsgV3JpdGVfRklGTzsKKwkJCQlXcml0ZV9TQ1NJX0RhdGFfcG9ydCA9IHBvcnQgKyBXcml0ZV9TQ1NJX0RhdGE7CisKKwkJCQlCeXRlc19SZWFkID0gMDsKKwkJCQlCeXRlc19Xcml0dGVuID0gMDsKKwkJCQlJTlRSX1Byb2Nlc3NlZCA9IDA7CisKKwkJCQkvKiBzYXkgc29tZXRoaW5nICovCisJCQkJcHJpbnRfYmFubmVyKHNocG50KTsKKworCQkJCS8qIHJlc2V0ICovCisJCQkJb3V0YigxLCBTQ1NJX0NudGxfcG9ydCk7CisJCQkJZG9fcGF1c2UoMik7CisJCQkJb3V0YigwLCBTQ1NJX0NudGxfcG9ydCk7CisJCQkJZG9fcGF1c2UoMTE1KTsKKwkJCQlvdXRiKDAsIFNDU0lfTW9kZV9DbnRsX3BvcnQpOworCQkJCW91dGIoUEFSSVRZX01BU0ssIFRNQ19DbnRsX3BvcnQpOworCQkJCS8qIGRvbmUgcmVzZXQgKi8KKwkJCX0KKwkJfQorCisJCWlmIChmb3VuZCA9PSBGRF9NQVhfSE9TVFMpIHsKKwkJCXByaW50aygiZmRfbWNzOiBkZXRlY3RpbmcgcmVhY2hlZCBtYXg9JWQgaG9zdCBhZGFwdGVycy5cbiIsIEZEX01BWF9IT1NUUyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmZkX21jc19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCXJldHVybiBhZGFwdGVyX25hbWU7Cit9CisKK3N0YXRpYyBpbnQgVE9UQUxfSU5UUiA9IDA7CisKKy8qCisgKiBpbm91dCA6IGRlY2lkZXMgb24gdGhlIGRpcmVjdGlvbiBvZiB0aGUgZGF0YWZsb3cgYW5kIHRoZSBtZWFuaW5nIG9mIHRoZSAKKyAqICAgICAgICAgdmFyaWFibGVzCisgKiBidWZmZXI6IElmIGlub3V0PT1GQUxTRSBkYXRhIGlzIGJlaW5nIHdyaXR0ZW4gdG8gaXQgZWxzZSByZWFkIGZyb20gaXQKKyAqICpzdGFydDogSWYgaW5vdXQ9PUZBTFNFIHN0YXJ0IG9mIHRoZSB2YWxpZCBkYXRhIGluIHRoZSBidWZmZXIKKyAqIG9mZnNldDogSWYgaW5vdXQ9PUZBTFNFIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGltYWdpbmFyeSBmaWxlIAorICogICAgICAgICBmcm9tIHdoaWNoIHdlIHN0YXJ0IHdyaXRpbmcgaW50byB0aGUgYnVmZmVyCisgKiBsZW5ndGg6IElmIGlub3V0PT1GQUxTRSBtYXggbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgYnVmZmVyIAorICogICAgICAgICBlbHNlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyCisgKi8KK3N0YXRpYyBpbnQgZmRfbWNzX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworCWludCBsZW4gPSAwOworCisJaWYgKGlub3V0KQorCQlyZXR1cm4gKC1FTk9TWVMpOworCisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiRnV0dXJlIERvbWFpbiBNQ1MtNjAwLzcwMCBEcml2ZXIgJXNcbiIsIERSSVZFUl9WRVJTSU9OKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJIT1NUICMlZDogJXNcbiIsIHNocG50LT5ob3N0X25vLCBhZGFwdGVyX25hbWUpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIkZJRk8gU2l6ZT0weCV4LCBGSUZPIENvdW50PSVkXG4iLCBGSUZPX1NpemUsIEZJRk9fQ09VTlQpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIkRyaXZlckNhbGxzPSVkLCBJbnRlcnJ1cHRzPSVkLCBCeXRlc1JlYWQ9JWQsIEJ5dGVzV3JpdGU9JWRcblxuIiwgVE9UQUxfSU5UUiwgSU5UUl9Qcm9jZXNzZWQsIEJ5dGVzX1JlYWQsIEJ5dGVzX1dyaXR0ZW4pOworCisJaWYgKChsZW4gLT0gb2Zmc2V0KSA8PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAobGVuID4gbGVuZ3RoKQorCQlsZW4gPSBsZW5ndGg7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBmZF9tY3Nfc2VsZWN0KHN0cnVjdCBTY3NpX0hvc3QgKnNocG50LCBpbnQgdGFyZ2V0KQoreworCWludCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJb3V0YigweDgyLCBTQ1NJX0NudGxfcG9ydCk7CS8qIEJ1cyBFbmFibGUgKyBTZWxlY3QgKi8KKwlvdXRiKGFkYXB0ZXJfbWFzayB8ICgxIDw8IHRhcmdldCksIFNDU0lfRGF0YV9Ob0FDS19wb3J0KTsKKworCS8qIFN0b3AgYXJiaXRyYXRpb24gYW5kIGVuYWJsZSBwYXJpdHkgKi8KKwlvdXRiKFBBUklUWV9NQVNLLCBUTUNfQ250bF9wb3J0KTsKKworCXRpbWVvdXQgPSAzNTA7CQkvKiAzNTBtUyAtLSBiZWNhdXNlIG9mIHRpbWVvdXRzCisJCQkJICAgKHdhcyAyNTBtUykgKi8KKworCWRvIHsKKwkJc3RhdHVzID0gaW5iKFNDU0lfU3RhdHVzX3BvcnQpOwkvKiBSZWFkIGFkYXB0ZXIgc3RhdHVzICovCisJCWlmIChzdGF0dXMgJiAxKSB7CS8qIEJ1c3kgYXNzZXJ0ZWQgKi8KKwkJCS8qIEVuYWJsZSBTQ1NJIEJ1cyAob24gZXJyb3IsIHNob3VsZCBtYWtlIGJ1cyBpZGxlIHdpdGggMCkgKi8KKwkJCW91dGIoMHg4MCwgU0NTSV9DbnRsX3BvcnQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJdWRlbGF5KDEwMDApOwkvKiB3YWl0IG9uZSBtc2VjICovCisJfSB3aGlsZSAoLS10aW1lb3V0KTsKKworCS8qIE1ha2UgYnVzIGlkbGUgKi8KKwlmZF9tY3NfbWFrZV9idXNfaWRsZShzaHBudCk7CisjaWYgRVZFUllfQUNDRVNTCisJaWYgKCF0YXJnZXQpCisJCXByaW50aygiU2VsZWN0aW9uIGZhaWxlZFxuIik7CisjZW5kaWYKKyNpZiBFUlJPUlNfT05MWQorCWlmICghdGFyZ2V0KSB7CisJCXN0YXRpYyBpbnQgZmxhZyA9IDA7CisKKwkJaWYgKCFmbGFnKQkvKiBTa2lwIGZpcnN0IGZhaWx1cmUgZm9yIGFsbCBjaGlwcy4gKi8KKwkJCSsrZmxhZzsKKwkJZWxzZQorCQkJcHJpbnRrKCJmZF9tY3M6IFNlbGVjdGlvbiBmYWlsZWRcbiIpOworCX0KKyNlbmRpZgorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBteV9kb25lKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50LCBpbnQgZXJyb3IpCit7CisJaWYgKGluX2NvbW1hbmQpIHsKKwkJaW5fY29tbWFuZCA9IDA7CisJCW91dGIoMHgwMCwgSW50ZXJydXB0X0NudGxfcG9ydCk7CisJCWZkX21jc19tYWtlX2J1c19pZGxlKHNocG50KTsKKwkJY3VycmVudF9TQy0+cmVzdWx0ID0gZXJyb3I7CisJCWN1cnJlbnRfU0MtPnNjc2lfZG9uZShjdXJyZW50X1NDKTsKKwl9IGVsc2UgeworCQlwYW5pYygiZmRfbWNzOiBteV9kb25lKCkgY2FsbGVkIG91dHNpZGUgb2YgY29tbWFuZFxuIik7CisJfQorI2lmIERFQlVHX1JBQ0UKKwlpbl9pbnRlcnJ1cHRfZmxhZyA9IDA7CisjZW5kaWYKK30KKworLyogb25seSBteV9kb25lIG5lZWRzIHRvIGJlIHByb3RlY3RlZCAgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBmZF9tY3NfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0YXR1czsKKwlpbnQgZG9uZSA9IDA7CisJdW5zaWduZWQgZGF0YV9jb3VudCwgdG1wX2NvdW50OworCisJaW50IGkgPSAwOworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50OworCisJVE9UQUxfSU5UUisrOworCisJLyogc2VhcmNoIGZvciBvbmUgYWRhcHRlci1yZXNwb25zZSBvbiBzaGFyZWQgaW50ZXJydXB0ICovCisJd2hpbGUgKChzaHBudCA9IGhvc3RzW2krK10pKSB7CisJCWlmICgoaW5iKFRNQ19TdGF0dXNfcG9ydCkpICYgMSkKKwkJCWJyZWFrOworCX0KKworCS8qIHJldHVybiBpZiBzb21lIG90aGVyIGRldmljZSBvbiB0aGlzIElSUSBjYXVzZWQgdGhlIGludGVycnVwdCAqLworCWlmICghc2hwbnQpIHsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCUlOVFJfUHJvY2Vzc2VkKys7CisKKwlvdXRiKDB4MDAsIEludGVycnVwdF9DbnRsX3BvcnQpOworCisJLyogQWJvcnQgY2FsbHMgbXlfZG9uZSwgc28gd2UgZG8gbm90aGluZyBoZXJlLiAqLworCWlmIChjdXJyZW50X1NDLT5TQ3AucGhhc2UgJiBhYm9ydGVkKSB7CisjaWYgREVCVUdfQUJPUlQKKwkJcHJpbnRrKCJJbnRlcnJ1cHQgYWZ0ZXIgYWJvcnQsIGlnbm9yaW5nXG4iKTsKKyNlbmRpZgorCQkvKiByZXR1cm4gSVJRX0hBTkRMRUQ7ICovCisJfQorI2lmIERFQlVHX1JBQ0UKKwkrK2luX2ludGVycnVwdF9mbGFnOworI2VuZGlmCisKKwlpZiAoY3VycmVudF9TQy0+U0NwLnBoYXNlICYgaW5fYXJiaXRyYXRpb24pIHsKKwkJc3RhdHVzID0gaW5iKFRNQ19TdGF0dXNfcG9ydCk7CS8qIFJlYWQgYWRhcHRlciBzdGF0dXMgKi8KKwkJaWYgKCEoc3RhdHVzICYgMHgwMikpIHsKKyNpZiBFVkVSWV9BQ0NFU1MKKwkJCXByaW50aygiIEFGQUlMICIpOworI2VuZGlmCisJCQlzcGluX2xvY2tfaXJxc2F2ZShzaHBudC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQlteV9kb25lKHNocG50LCBESURfQlVTX0JVU1kgPDwgMTYpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaHBudC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwkJY3VycmVudF9TQy0+U0NwLnBoYXNlID0gaW5fc2VsZWN0aW9uOworCisJCW91dGIoMHg0MCB8IEZJRk9fQ09VTlQsIEludGVycnVwdF9DbnRsX3BvcnQpOworCisJCW91dGIoMHg4MiwgU0NTSV9DbnRsX3BvcnQpOwkvKiBCdXMgRW5hYmxlICsgU2VsZWN0ICovCisJCW91dGIoYWRhcHRlcl9tYXNrIHwgKDEgPDwgY3VycmVudF9TQy0+ZGV2aWNlLT5pZCksIFNDU0lfRGF0YV9Ob0FDS19wb3J0KTsKKworCQkvKiBTdG9wIGFyYml0cmF0aW9uIGFuZCBlbmFibGUgcGFyaXR5ICovCisJCW91dGIoMHgxMCB8IFBBUklUWV9NQVNLLCBUTUNfQ250bF9wb3J0KTsKKyNpZiBERUJVR19SQUNFCisJCWluX2ludGVycnVwdF9mbGFnID0gMDsKKyNlbmRpZgorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfSBlbHNlIGlmIChjdXJyZW50X1NDLT5TQ3AucGhhc2UgJiBpbl9zZWxlY3Rpb24pIHsKKwkJc3RhdHVzID0gaW5iKFNDU0lfU3RhdHVzX3BvcnQpOworCQlpZiAoIShzdGF0dXMgJiAweDAxKSkgeworCQkJLyogVHJ5IGFnYWluLCBmb3Igc2xvdyBkZXZpY2VzICovCisJCQlpZiAoZmRfbWNzX3NlbGVjdChzaHBudCwgY3VycmVudF9TQy0+ZGV2aWNlLT5pZCkpIHsKKyNpZiBFVkVSWV9BQ0NFU1MKKwkJCQlwcmludGsoIiBTRkFJTCAiKTsKKyNlbmRpZgorCQkJCXNwaW5fbG9ja19pcnFzYXZlKHNocG50LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJCQlteV9kb25lKHNocG50LCBESURfTk9fQ09OTkVDVCA8PCAxNik7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaHBudC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfSBlbHNlIHsKKyNpZiBFVkVSWV9BQ0NFU1MKKwkJCQlwcmludGsoIiBBbHRTZWwgIik7CisjZW5kaWYKKwkJCQkvKiBTdG9wIGFyYml0cmF0aW9uIGFuZCBlbmFibGUgcGFyaXR5ICovCisJCQkJb3V0YigweDEwIHwgUEFSSVRZX01BU0ssIFRNQ19DbnRsX3BvcnQpOworCQkJfQorCQl9CisJCWN1cnJlbnRfU0MtPlNDcC5waGFzZSA9IGluX290aGVyOworCQlvdXRiKDB4OTAgfCBGSUZPX0NPVU5ULCBJbnRlcnJ1cHRfQ250bF9wb3J0KTsKKwkJb3V0YigweDgwLCBTQ1NJX0NudGxfcG9ydCk7CisjaWYgREVCVUdfUkFDRQorCQlpbl9pbnRlcnJ1cHRfZmxhZyA9IDA7CisjZW5kaWYKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCS8qIGN1cnJlbnRfU0MtPlNDcC5waGFzZSA9PSBpbl9vdGhlcjogdGhpcyBpcyB0aGUgYm9keSBvZiB0aGUgcm91dGluZSAqLworCisJc3RhdHVzID0gaW5iKFNDU0lfU3RhdHVzX3BvcnQpOworCisJaWYgKHN0YXR1cyAmIDB4MTApIHsJLyogUkVRICovCisKKwkJc3dpdGNoIChzdGF0dXMgJiAweDBlKSB7CisKKwkJY2FzZSAweDA4OgkvKiBDT01NQU5EIE9VVCAqLworCQkJb3V0YihjdXJyZW50X1NDLT5jbW5kW2N1cnJlbnRfU0MtPlNDcC5zZW50X2NvbW1hbmQrK10sIFdyaXRlX1NDU0lfRGF0YV9wb3J0KTsKKyNpZiBFVkVSWV9BQ0NFU1MKKwkJCXByaW50aygiQ01EID0gJXgsIiwgY3VycmVudF9TQy0+Y21uZFtjdXJyZW50X1NDLT5TQ3Auc2VudF9jb21tYW5kIC0gMV0pOworI2VuZGlmCisJCQlicmVhazsKKwkJY2FzZSAweDAwOgkvKiBEQVRBIE9VVCAtLSB0bWMxOGM1MC90bWMxOGMzMCBvbmx5ICovCisJCQlpZiAoY2hpcCAhPSB0bWMxODAwICYmICFjdXJyZW50X1NDLT5TQ3AuaGF2ZV9kYXRhX2luKSB7CisJCQkJY3VycmVudF9TQy0+U0NwLmhhdmVfZGF0YV9pbiA9IC0xOworCQkJCW91dGIoMHhkMCB8IFBBUklUWV9NQVNLLCBUTUNfQ250bF9wb3J0KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDB4MDQ6CS8qIERBVEEgSU4gLS0gdG1jMThjNTAvdG1jMThjMzAgb25seSAqLworCQkJaWYgKGNoaXAgIT0gdG1jMTgwMCAmJiAhY3VycmVudF9TQy0+U0NwLmhhdmVfZGF0YV9pbikgeworCQkJCWN1cnJlbnRfU0MtPlNDcC5oYXZlX2RhdGFfaW4gPSAxOworCQkJCW91dGIoMHg5MCB8IFBBUklUWV9NQVNLLCBUTUNfQ250bF9wb3J0KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDB4MGM6CS8qIFNUQVRVUyBJTiAqLworCQkJY3VycmVudF9TQy0+U0NwLlN0YXR1cyA9IGluYihSZWFkX1NDU0lfRGF0YV9wb3J0KTsKKyNpZiBFVkVSWV9BQ0NFU1MKKwkJCXByaW50aygiU3RhdHVzID0gJXgsICIsIGN1cnJlbnRfU0MtPlNDcC5TdGF0dXMpOworI2VuZGlmCisjaWYgRVJST1JTX09OTFkKKwkJCWlmIChjdXJyZW50X1NDLT5TQ3AuU3RhdHVzICYmIGN1cnJlbnRfU0MtPlNDcC5TdGF0dXMgIT0gMiAmJiBjdXJyZW50X1NDLT5TQ3AuU3RhdHVzICE9IDgpIHsKKwkJCQlwcmludGsoIkVSUk9SIGZkX21jczogdGFyZ2V0ID0gJWQsIGNvbW1hbmQgPSAleCwgc3RhdHVzID0gJXhcbiIsIGN1cnJlbnRfU0MtPmRldmljZS0+aWQsIGN1cnJlbnRfU0MtPmNtbmRbMF0sIGN1cnJlbnRfU0MtPlNDcC5TdGF0dXMpOworCQkJfQorI2VuZGlmCisJCQlicmVhazsKKwkJY2FzZSAweDBhOgkvKiBNRVNTQUdFIE9VVCAqLworCQkJb3V0YihNRVNTQUdFX1JFSkVDVCwgV3JpdGVfU0NTSV9EYXRhX3BvcnQpOwkvKiBSZWplY3QgKi8KKwkJCWJyZWFrOworCQljYXNlIDB4MGU6CS8qIE1FU1NBR0UgSU4gKi8KKwkJCWN1cnJlbnRfU0MtPlNDcC5NZXNzYWdlID0gaW5iKFJlYWRfU0NTSV9EYXRhX3BvcnQpOworI2lmIEVWRVJZX0FDQ0VTUworCQkJcHJpbnRrKCJNZXNzYWdlID0gJXgsICIsIGN1cnJlbnRfU0MtPlNDcC5NZXNzYWdlKTsKKyNlbmRpZgorCQkJaWYgKCFjdXJyZW50X1NDLT5TQ3AuTWVzc2FnZSkKKwkJCQkrK2RvbmU7CisjaWYgREVCVUdfTUVTU0FHRVMgfHwgRVZFUllfQUNDRVNTCisJCQlpZiAoY3VycmVudF9TQy0+U0NwLk1lc3NhZ2UpIHsKKwkJCQlwcmludGsoImZkX21jczogbWVzc2FnZSA9ICV4XG4iLCBjdXJyZW50X1NDLT5TQ3AuTWVzc2FnZSk7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGNoaXAgPT0gdG1jMTgwMCAmJiAhY3VycmVudF9TQy0+U0NwLmhhdmVfZGF0YV9pbiAmJiAoY3VycmVudF9TQy0+U0NwLnNlbnRfY29tbWFuZCA+PSBjdXJyZW50X1NDLT5jbWRfbGVuKSkgeworCQkvKiBXZSBoYXZlIHRvIGdldCB0aGUgRklGTyBkaXJlY3Rpb24KKwkJICAgY29ycmVjdCwgc28gSSd2ZSBtYWRlIGEgdGFibGUgYmFzZWQKKwkJICAgb24gdGhlIFNDU0kgU3RhbmRhcmQgb2Ygd2hpY2ggY29tbWFuZHMKKwkJICAgYXBwZWFyIHRvIHJlcXVpcmUgYSBEQVRBIE9VVCBwaGFzZS4KKwkJICovCisJCS8qCisJCSAgIHAuIDk0OiBDb21tYW5kIGZvciBhbGwgZGV2aWNlIHR5cGVzCisJCSAgIENIQU5HRSBERUZJTklUSU9OICAgICAgICAgICAgNDAgREFUQSBPVVQKKwkJICAgQ09NUEFSRSAgICAgICAgICAgICAgICAgICAgICAzOSBEQVRBIE9VVAorCQkgICBDT1BZICAgICAgICAgICAgICAgICAgICAgICAgIDE4IERBVEEgT1VUCisJCSAgIENPUFkgQU5EIFZFUklGWSAgICAgICAgICAgICAgM2EgREFUQSBPVVQKKwkJICAgSU5RVUlSWSAgICAgICAgICAgICAgICAgICAgICAxMiAKKwkJICAgTE9HIFNFTEVDVCAgICAgICAgICAgICAgICAgICA0YyBEQVRBIE9VVAorCQkgICBMT0cgU0VOU0UgICAgICAgICAgICAgICAgICAgIDRkCisJCSAgIE1PREUgU0VMRUNUICg2KSAgICAgICAgICAgICAgMTUgREFUQSBPVVQKKwkJICAgTU9ERSBTRUxFQ1QgKDEwKSAgICAgICAgICAgICA1NSBEQVRBIE9VVAorCQkgICBNT0RFIFNFTlNFICg2KSAgICAgICAgICAgICAgIDFhCisJCSAgIE1PREUgU0VOU0UgKDEwKSAgICAgICAgICAgICAgNWEKKwkJICAgUkVBRCBCVUZGRVIgICAgICAgICAgICAgICAgICAzYworCQkgICBSRUNFSVZFIERJQUdOT1NUSUMgUkVTVUxUUyAgIDFjCisJCSAgIFJFUVVFU1QgU0VOU0UgICAgICAgICAgICAgICAgMDMKKwkJICAgU0VORCBESUFHTk9TVElDICAgICAgICAgICAgICAxZCBEQVRBIE9VVAorCQkgICBURVNUIFVOSVQgUkVBRFkgICAgICAgICAgICAgIDAwCisJCSAgIFdSSVRFIEJVRkZFUiAgICAgICAgICAgICAgICAgM2IgREFUQSBPVVQKKworCQkgICBwLjE3ODogQ29tbWFuZHMgZm9yIGRpcmVjdC1hY2Nlc3MgZGV2aWNlcyAobm90IGxpc3RlZCBvbiBwLiA5NCkKKwkJICAgRk9STUFUIFVOSVQgICAgICAgICAgICAgICAgICAwNCBEQVRBIE9VVAorCQkgICBMT0NLLVVOTE9DSyBDQUNIRSAgICAgICAgICAgIDM2CisJCSAgIFBSRS1GRVRDSCAgICAgICAgICAgICAgICAgICAgMzQKKwkJICAgUFJFVkVOVC1BTExPVyBNRURJVU0gUkVNT1ZBTCAxZQorCQkgICBSRUFEICg2KS9SRUNFSVZFICAgICAgICAgICAgIDA4CisJCSAgIFJFQUQgKDEwKSAgICAgICAgICAgICAgICAgICAgM2MKKwkJICAgUkVBRCBDQVBBQ0lUWSAgICAgICAgICAgICAgICAyNQorCQkgICBSRUFEIERFRkVDVCBEQVRBICgxMCkgICAgICAgIDM3CisJCSAgIFJFQUQgTE9ORyAgICAgICAgICAgICAgICAgICAgM2UKKwkJICAgUkVBU1NJR04gQkxPQ0tTICAgICAgICAgICAgICAwNyBEQVRBIE9VVAorCQkgICBSRUxFQVNFICAgICAgICAgICAgICAgICAgICAgIDE3CisJCSAgIFJFU0VSVkUgICAgICAgICAgICAgICAgICAgICAgMTYgREFUQSBPVVQKKwkJICAgUkVaRVJPIFVOSVQvUkVXSU5EICAgICAgICAgICAwMQorCQkgICBTRUFSQ0ggREFUQSBFUVVBTCAoMTApICAgICAgIDMxIERBVEEgT1VUCisJCSAgIFNFQVJDSCBEQVRBIEhJR0ggKDEwKSAgICAgICAgMzAgREFUQSBPVVQKKwkJICAgU0VBUkNIIERBVEEgTE9XICgxMCkgICAgICAgICAzMiBEQVRBIE9VVAorCQkgICBTRUVLICg2KSAgICAgICAgICAgICAgICAgICAgIDBiCisJCSAgIFNFRUsgKDEwKSAgICAgICAgICAgICAgICAgICAgMmIKKwkJICAgU0VUIExJTUlUUyAoMTApICAgICAgICAgICAgICAzMworCQkgICBTVEFSVCBTVE9QIFVOSVQgICAgICAgICAgICAgIDFiCisJCSAgIFNZTkNIUk9OSVpFIENBQ0hFICAgICAgICAgICAgMzUKKwkJICAgVkVSSUZZICgxMCkgICAgICAgICAgICAgICAgICAyZgorCQkgICBXUklURSAoNikvUFJJTlQvU0VORCAgICAgICAgIDBhIERBVEEgT1VUCisJCSAgIFdSSVRFICgxMCkvU0VORCAgICAgICAgICAgICAgMmEgREFUQSBPVVQKKwkJICAgV1JJVEUgQU5EIFZFUklGWSAoMTApICAgICAgICAyZSBEQVRBIE9VVAorCQkgICBXUklURSBMT05HICAgICAgICAgICAgICAgICAgIDNmIERBVEEgT1VUCisJCSAgIFdSSVRFIFNBTUUgICAgICAgICAgICAgICAgICAgNDEgREFUQSBPVVQgPworCisJCSAgIHAuIDI2MTogQ29tbWFuZHMgZm9yIHNlcXVlbnRpYWwtYWNjZXNzIGRldmljZXMgKG5vdCBwcmV2aW91c2x5IGxpc3RlZCkKKwkJICAgRVJBU0UgICAgICAgICAgICAgICAgICAgICAgICAxOQorCQkgICBMT0FEIFVOTE9BRCAgICAgICAgICAgICAgICAgIDFiCisJCSAgIExPQ0FURSAgICAgICAgICAgICAgICAgICAgICAgMmIKKwkJICAgUkVBRCBCTE9DSyBMSU1JVFMgICAgICAgICAgICAwNQorCQkgICBSRUFEIFBPU0lUSU9OICAgICAgICAgICAgICAgIDM0CisJCSAgIFJFQUQgUkVWRVJTRSAgICAgICAgICAgICAgICAgMGYKKwkJICAgUkVDT1ZFUiBCVUZGRVJFRCBEQVRBICAgICAgICAxNAorCQkgICBTUEFDRSAgICAgICAgICAgICAgICAgICAgICAgIDExCisJCSAgIFdSSVRFIEZJTEVNQVJLUyAgICAgICAgICAgICAgMTAgPworCisJCSAgIHAuIDI5ODogQ29tbWFuZHMgZm9yIHByaW50ZXIgZGV2aWNlcyAobm90IHByZXZpb3VzbHkgbGlzdGVkKQorCQkgICAqKioqKiogTk9UIFNVUFBPUlRFRCBCWSBUSElTIERSSVZFUiwgc2luY2UgMGIgaXMgU0VFSyAoNikgKioqKioKKwkJICAgU0xFVyBBTkQgUFJJTlQgICAgICAgICAgICAgICAwYiBEQVRBIE9VVCAgLS0gc2FtZSBhcyBzZWVrCisJCSAgIFNUT1AgUFJJTlQgICAgICAgICAgICAgICAgICAgMWIKKwkJICAgU1lOQ0hST05JWkUgQlVGRkVSICAgICAgICAgICAxMAorCisJCSAgIHAuIDMxNTogQ29tbWFuZHMgZm9yIHByb2Nlc3NvciBkZXZpY2VzIChub3QgcHJldmlvdXNseSBsaXN0ZWQpCisKKwkJICAgcC4gMzIxOiBDb21tYW5kcyBmb3Igd3JpdGUtb25jZSBkZXZpY2VzIChub3QgcHJldmlvdXNseSBsaXN0ZWQpCisJCSAgIE1FRElVTSBTQ0FOICAgICAgICAgICAgICAgICAgMzgKKwkJICAgUkVBRCAoMTIpICAgICAgICAgICAgICAgICAgICBhOAorCQkgICBTRUFSQ0ggREFUQSBFUVVBTCAoMTIpICAgICAgIGIxIERBVEEgT1VUCisJCSAgIFNFQVJDSCBEQVRBIEhJR0ggKDEyKSAgICAgICAgYjAgREFUQSBPVVQKKwkJICAgU0VBUkNIIERBVEEgTE9XICgxMikgICAgICAgICBiMiBEQVRBIE9VVAorCQkgICBTRVQgTElNSVRTICgxMikgICAgICAgICAgICAgIGIzCisJCSAgIFZFUklGWSAoMTIpICAgICAgICAgICAgICAgICAgYWYKKwkJICAgV1JJVEUgKDEyKSAgICAgICAgICAgICAgICAgICBhYSBEQVRBIE9VVAorCQkgICBXUklURSBBTkQgVkVSSUZZICgxMikgICAgICAgIGFlIERBVEEgT1VUCisKKwkJICAgcC4gMzMyOiBDb21tYW5kcyBmb3IgQ0QtUk9NIGRldmljZXMgKG5vdCBwcmV2aW91c2x5IGxpc3RlZCkKKwkJICAgUEFVU0UvUkVTVU1FICAgICAgICAgICAgICAgICA0YgorCQkgICBQTEFZIEFVRElPICgxMCkgICAgICAgICAgICAgIDQ1CisJCSAgIFBMQVkgQVVESU8gKDEyKSAgICAgICAgICAgICAgYTUKKwkJICAgUExBWSBBVURJTyBNU0YgICAgICAgICAgICAgICA0NworCQkgICBQTEFZIFRSQUNLIFJFTEFUSVZFICgxMCkgICAgIDQ5CisJCSAgIFBMQVkgVFJBQ0sgUkVMQVRJVkUgKDEyKSAgICAgYTkKKwkJICAgUkVBRCBIRUFERVIgICAgICAgICAgICAgICAgICA0NAorCQkgICBSRUFEIFNVQi1DSEFOTkVMICAgICAgICAgICAgIDQyCisJCSAgIFJFQUQgVE9DICAgICAgICAgICAgICAgICAgICAgNDMKKworCQkgICBwLiAzNzA6IENvbW1hbmRzIGZvciBzY2FubmVyIGRldmljZXMgKG5vdCBwcmV2aW91c2x5IGxpc3RlZCkKKwkJICAgR0VUIERBVEEgQlVGRkVSIFNUQVRVUyAgICAgICAzNAorCQkgICBHRVQgV0lORE9XICAgICAgICAgICAgICAgICAgIDI1CisJCSAgIE9CSkVDVCBQT1NJVElPTiAgICAgICAgICAgICAgMzEKKwkJICAgU0NBTiAgICAgICAgICAgICAgICAgICAgICAgICAxYgorCQkgICBTRVQgV0lORE9XICAgICAgICAgICAgICAgICAgIDI0IERBVEEgT1VUCisKKwkJICAgcC4gMzkxOiBDb21tYW5kcyBmb3Igb3B0aWNhbCBtZW1vcnkgZGV2aWNlcyAobm90IGxpc3RlZCkKKwkJICAgRVJBU0UgKDEwKSAgICAgICAgICAgICAgICAgICAyYworCQkgICBFUkFTRSAoMTIpICAgICAgICAgICAgICAgICAgIGFjCisJCSAgIE1FRElVTSBTQ0FOICAgICAgICAgICAgICAgICAgMzggREFUQSBPVVQKKwkJICAgUkVBRCBERUZFQ1QgREFUQSAoMTIpICAgICAgICBiNworCQkgICBSRUFEIEdFTkVSQVRJT04gICAgICAgICAgICAgIDI5CisJCSAgIFJFQUQgVVBEQVRFRCBCTE9DSyAgICAgICAgICAgMmQKKwkJICAgVVBEQVRFIEJMT0NLICAgICAgICAgICAgICAgICAzZCBEQVRBIE9VVAorCisJCSAgIHAuIDQxOTogQ29tbWFuZHMgZm9yIG1lZGl1bSBjaGFuZ2VyIGRldmljZXMgKG5vdCBsaXN0ZWQpCisJCSAgIEVYQ0hBTkdFIE1FRElVTSAgICAgICAgICAgICAgNDYKKwkJICAgSU5JVElBTElaRSBFTEVNRU5UIFNUQVRVUyAgICAwNworCQkgICBNT1ZFIE1FRElVTSAgICAgICAgICAgICAgICAgIGE1CisJCSAgIFBPU0lUSU9OIFRPIEVMRU1FTlQgICAgICAgICAgMmIKKwkJICAgUkVBRCBFTEVNRU5UIFNUQVRVUyAgICAgICAgICBiOAorCQkgICBSRVFVRVNUIFZPTC4gRUxFTUVOVCBBRERSRVNTIGI1CisJCSAgIFNFTkQgVk9MVU1FIFRBRyAgICAgICAgICAgICAgYjYgREFUQSBPVVQKKworCQkgICBwLiA0NTQ6IENvbW1hbmRzIGZvciBjb21tdW5pY2F0aW9ucyBkZXZpY2VzIChub3QgbGlzdGVkIHByZXZpb3VzbHkpCisJCSAgIEdFVCBNRVNTQUdFICg2KSAgICAgICAgICAgICAgMDgKKwkJICAgR0VUIE1FU1NBR0UgKDEwKSAgICAgICAgICAgICAyOAorCQkgICBHRVQgTUVTU0FHRSAoMTIpICAgICAgICAgICAgIGE4CisJCSAqLworCisJCXN3aXRjaCAoY3VycmVudF9TQy0+Y21uZFswXSkgeworCQljYXNlIENIQU5HRV9ERUZJTklUSU9OOgorCQljYXNlIENPTVBBUkU6CisJCWNhc2UgQ09QWToKKwkJY2FzZSBDT1BZX1ZFUklGWToKKwkJY2FzZSBMT0dfU0VMRUNUOgorCQljYXNlIE1PREVfU0VMRUNUOgorCQljYXNlIE1PREVfU0VMRUNUXzEwOgorCQljYXNlIFNFTkRfRElBR05PU1RJQzoKKwkJY2FzZSBXUklURV9CVUZGRVI6CisKKwkJY2FzZSBGT1JNQVRfVU5JVDoKKwkJY2FzZSBSRUFTU0lHTl9CTE9DS1M6CisJCWNhc2UgUkVTRVJWRToKKwkJY2FzZSBTRUFSQ0hfRVFVQUw6CisJCWNhc2UgU0VBUkNIX0hJR0g6CisJCWNhc2UgU0VBUkNIX0xPVzoKKwkJY2FzZSBXUklURV82OgorCQljYXNlIFdSSVRFXzEwOgorCQljYXNlIFdSSVRFX1ZFUklGWToKKwkJY2FzZSAweDNmOgorCQljYXNlIDB4NDE6CisKKwkJY2FzZSAweGIxOgorCQljYXNlIDB4YjA6CisJCWNhc2UgMHhiMjoKKwkJY2FzZSAweGFhOgorCQljYXNlIDB4YWU6CisKKwkJY2FzZSAweDI0OgorCisJCWNhc2UgMHgzODoKKwkJY2FzZSAweDNkOgorCisJCWNhc2UgMHhiNjoKKworCQljYXNlIDB4ZWE6CS8qIGFsdGVybmF0ZSBudW1iZXIgZm9yIFdSSVRFIExPTkcgKi8KKworCQkJY3VycmVudF9TQy0+U0NwLmhhdmVfZGF0YV9pbiA9IC0xOworCQkJb3V0YigweGQwIHwgUEFSSVRZX01BU0ssIFRNQ19DbnRsX3BvcnQpOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDAwOgorCQlkZWZhdWx0OgorCisJCQljdXJyZW50X1NDLT5TQ3AuaGF2ZV9kYXRhX2luID0gMTsKKwkJCW91dGIoMHg5MCB8IFBBUklUWV9NQVNLLCBUTUNfQ250bF9wb3J0KTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGN1cnJlbnRfU0MtPlNDcC5oYXZlX2RhdGFfaW4gPT0gLTEpIHsJLyogREFUQSBPVVQgKi8KKwkJd2hpbGUgKChkYXRhX2NvdW50ID0gRklGT19TaXplIC0gaW53KEZJRk9fRGF0YV9Db3VudF9wb3J0KSkgPiA1MTIpIHsKKyNpZiBFVkVSWV9BQ0NFU1MKKwkJCXByaW50aygiREM9JWQsICIsIGRhdGFfY291bnQpOworI2VuZGlmCisJCQlpZiAoZGF0YV9jb3VudCA+IGN1cnJlbnRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsKQorCQkJCWRhdGFfY291bnQgPSBjdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbDsKKwkJCWlmIChkYXRhX2NvdW50ID4gMCkgeworI2lmIEVWRVJZX0FDQ0VTUworCQkJCXByaW50aygiJWQgT1VULCAiLCBkYXRhX2NvdW50KTsKKyNlbmRpZgorCQkJCWlmIChkYXRhX2NvdW50ID09IDEpIHsKKwkJCQkJQnl0ZXNfV3JpdHRlbisrOworCisJCQkJCW91dGIoKmN1cnJlbnRfU0MtPlNDcC5wdHIrKywgV3JpdGVfRklGT19wb3J0KTsKKwkJCQkJLS1jdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbDsKKwkJCQl9IGVsc2UgeworCQkJCQlkYXRhX2NvdW50ID4+PSAxOworCQkJCQl0bXBfY291bnQgPSBkYXRhX2NvdW50IDw8IDE7CisJCQkJCW91dHN3KFdyaXRlX0ZJRk9fcG9ydCwgY3VycmVudF9TQy0+U0NwLnB0ciwgZGF0YV9jb3VudCk7CisJCQkJCWN1cnJlbnRfU0MtPlNDcC5wdHIgKz0gdG1wX2NvdW50OworCQkJCQlCeXRlc19Xcml0dGVuICs9IHRtcF9jb3VudDsKKwkJCQkJY3VycmVudF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgLT0gdG1wX2NvdW50OworCQkJCX0KKwkJCX0KKwkJCWlmICghY3VycmVudF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwpIHsKKwkJCQlpZiAoY3VycmVudF9TQy0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpIHsKKwkJCQkJLS1jdXJyZW50X1NDLT5TQ3AuYnVmZmVyc19yZXNpZHVhbDsKKwkJCQkJKytjdXJyZW50X1NDLT5TQ3AuYnVmZmVyOworCQkJCQljdXJyZW50X1NDLT5TQ3AucHRyID0gcGFnZV9hZGRyZXNzKGN1cnJlbnRfU0MtPlNDcC5idWZmZXItPnBhZ2UpICsgY3VycmVudF9TQy0+U0NwLmJ1ZmZlci0+b2Zmc2V0OworCQkJCQljdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbCA9IGN1cnJlbnRfU0MtPlNDcC5idWZmZXItPmxlbmd0aDsKKwkJCQl9IGVsc2UKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGN1cnJlbnRfU0MtPlNDcC5oYXZlX2RhdGFfaW4gPT0gMSkgewkvKiBEQVRBIElOICovCisJCXdoaWxlICgoZGF0YV9jb3VudCA9IGludyhGSUZPX0RhdGFfQ291bnRfcG9ydCkpID4gMCkgeworI2lmIEVWRVJZX0FDQ0VTUworCQkJcHJpbnRrKCJEQz0lZCwgIiwgZGF0YV9jb3VudCk7CisjZW5kaWYKKwkJCWlmIChkYXRhX2NvdW50ID4gY3VycmVudF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwpCisJCQkJZGF0YV9jb3VudCA9IGN1cnJlbnRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsOworCQkJaWYgKGRhdGFfY291bnQpIHsKKyNpZiBFVkVSWV9BQ0NFU1MKKwkJCQlwcmludGsoIiVkIElOLCAiLCBkYXRhX2NvdW50KTsKKyNlbmRpZgorCQkJCWlmIChkYXRhX2NvdW50ID09IDEpIHsKKwkJCQkJQnl0ZXNfUmVhZCsrOworCQkJCQkqY3VycmVudF9TQy0+U0NwLnB0cisrID0gaW5iKFJlYWRfRklGT19wb3J0KTsKKwkJCQkJLS1jdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbDsKKwkJCQl9IGVsc2UgeworCQkJCQlkYXRhX2NvdW50ID4+PSAxOwkvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKwkJCQkJdG1wX2NvdW50ID0gZGF0YV9jb3VudCA8PCAxOworCQkJCQlpbnN3KFJlYWRfRklGT19wb3J0LCBjdXJyZW50X1NDLT5TQ3AucHRyLCBkYXRhX2NvdW50KTsKKwkJCQkJY3VycmVudF9TQy0+U0NwLnB0ciArPSB0bXBfY291bnQ7CisJCQkJCUJ5dGVzX1JlYWQgKz0gdG1wX2NvdW50OworCQkJCQljdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbCAtPSB0bXBfY291bnQ7CisJCQkJfQorCQkJfQorCQkJaWYgKCFjdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbCAmJiBjdXJyZW50X1NDLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCkgeworCQkJCS0tY3VycmVudF9TQy0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw7CisJCQkJKytjdXJyZW50X1NDLT5TQ3AuYnVmZmVyOworCQkJCWN1cnJlbnRfU0MtPlNDcC5wdHIgPSBwYWdlX2FkZHJlc3MoY3VycmVudF9TQy0+U0NwLmJ1ZmZlci0+cGFnZSkgKyBjdXJyZW50X1NDLT5TQ3AuYnVmZmVyLT5vZmZzZXQ7CisJCQkJY3VycmVudF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgPSBjdXJyZW50X1NDLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZG9uZSkgeworI2lmIEVWRVJZX0FDQ0VTUworCQlwcmludGsoIiAqKiBJTiBET05FICVkICoqICIsIGN1cnJlbnRfU0MtPlNDcC5oYXZlX2RhdGFfaW4pOworI2VuZGlmCisKKyNpZiBFUlJPUlNfT05MWQorCQlpZiAoY3VycmVudF9TQy0+Y21uZFswXSA9PSBSRVFVRVNUX1NFTlNFICYmICFjdXJyZW50X1NDLT5TQ3AuU3RhdHVzKSB7CisJCQlpZiAoKHVuc2lnbmVkIGNoYXIpICgqKChjaGFyICopIGN1cnJlbnRfU0MtPnJlcXVlc3RfYnVmZmVyICsgMikpICYgMHgwZikgeworCQkJCXVuc2lnbmVkIGNoYXIga2V5OworCQkJCXVuc2lnbmVkIGNoYXIgY29kZTsKKwkJCQl1bnNpZ25lZCBjaGFyIHF1YWxpZmllcjsKKworCQkJCWtleSA9ICh1bnNpZ25lZCBjaGFyKSAoKigoY2hhciAqKSBjdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZlciArIDIpKSAmIDB4MGY7CisJCQkJY29kZSA9ICh1bnNpZ25lZCBjaGFyKSAoKigoY2hhciAqKSBjdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZlciArIDEyKSk7CisJCQkJcXVhbGlmaWVyID0gKHVuc2lnbmVkIGNoYXIpICgqKChjaGFyICopIGN1cnJlbnRfU0MtPnJlcXVlc3RfYnVmZmVyICsgMTMpKTsKKworCQkJCWlmIChrZXkgIT0gVU5JVF9BVFRFTlRJT04gJiYgIShrZXkgPT0gTk9UX1JFQURZICYmIGNvZGUgPT0gMHgwNCAmJiAoIXF1YWxpZmllciB8fCBxdWFsaWZpZXIgPT0gMHgwMiB8fCBxdWFsaWZpZXIgPT0gMHgwMSkpCisJCQkJICAgICYmICEoa2V5ID09IElMTEVHQUxfUkVRVUVTVCAmJiAoY29kZSA9PSAweDI1IHx8IGNvZGUgPT0gMHgyNCB8fCAhY29kZSkpKQorCisJCQkJCXByaW50aygiZmRfbWNzOiBSRVFVRVNUIFNFTlNFICIgIktleSA9ICV4LCBDb2RlID0gJXgsIFF1YWxpZmllciA9ICV4XG4iLCBrZXksIGNvZGUsIHF1YWxpZmllcik7CisJCQl9CisJCX0KKyNlbmRpZgorI2lmIEVWRVJZX0FDQ0VTUworCQlwcmludGsoIkJFRk9SRSBNWV9ET05FLiAuIC4iKTsKKyNlbmRpZgorCQlzcGluX2xvY2tfaXJxc2F2ZShzaHBudC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCW15X2RvbmUoc2hwbnQsIChjdXJyZW50X1NDLT5TQ3AuU3RhdHVzICYgMHhmZikKKwkJCXwgKChjdXJyZW50X1NDLT5TQ3AuTWVzc2FnZSAmIDB4ZmYpIDw8IDgpIHwgKERJRF9PSyA8PCAxNikpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNocG50LT5ob3N0X2xvY2ssIGZsYWdzKTsKKyNpZiBFVkVSWV9BQ0NFU1MKKwkJcHJpbnRrKCJSRVRVUk5JTkcuXG4iKTsKKyNlbmRpZgorCisJfSBlbHNlIHsKKwkJaWYgKGN1cnJlbnRfU0MtPlNDcC5waGFzZSAmIGRpc2Nvbm5lY3QpIHsKKwkJCW91dGIoMHhkMCB8IEZJRk9fQ09VTlQsIEludGVycnVwdF9DbnRsX3BvcnQpOworCQkJb3V0YigweDAwLCBTQ1NJX0NudGxfcG9ydCk7CisJCX0gZWxzZSB7CisJCQlvdXRiKDB4OTAgfCBGSUZPX0NPVU5ULCBJbnRlcnJ1cHRfQ250bF9wb3J0KTsKKwkJfQorCX0KKyNpZiBERUJVR19SQUNFCisJaW5faW50ZXJydXB0X2ZsYWcgPSAwOworI2VuZGlmCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGZkX21jc19yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCWludCBpLCB0aGlzX2hvc3QsIGlycV91c2FnZTsKKworCXJlbGVhc2VfcmVnaW9uKHNocG50LT5pb19wb3J0LCBzaHBudC0+bl9pb19wb3J0KTsKKworCXRoaXNfaG9zdCA9IC0xOworCWlycV91c2FnZSA9IDA7CisJZm9yIChpID0gMDsgaSA8IGZvdW5kOyBpKyspIHsKKwkJaWYgKHNocG50ID09IGhvc3RzW2ldKQorCQkJdGhpc19ob3N0ID0gaTsKKwkJaWYgKHNocG50LT5pcnEgPT0gaG9zdHNbaV0tPmlycSkKKwkJCWlycV91c2FnZSsrOworCX0KKworCS8qIG9ubHkgZm9yIHRoZSBsYXN0IG9uZSAqLworCWlmICgxID09IGlycV91c2FnZSkKKwkJZnJlZV9pcnEoc2hwbnQtPmlycSwgaG9zdHMpOworCisJZm91bmQtLTsKKworCWZvciAoaSA9IHRoaXNfaG9zdDsgaSA8IGZvdW5kOyBpKyspCisJCWhvc3RzW2ldID0gaG9zdHNbaSArIDFdOworCisJaG9zdHNbZm91bmRdID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZkX21jc19xdWV1ZShTY3NpX0NtbmQgKiBTQ3BudCwgdm9pZCAoKmRvbmUpIChTY3NpX0NtbmQgKikpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0OworCisJaWYgKGluX2NvbW1hbmQpIHsKKwkJcGFuaWMoImZkX21jczogZmRfbWNzX3F1ZXVlKCkgTk9UIFJFRU5UUkFOVCFcbiIpOworCX0KKyNpZiBFVkVSWV9BQ0NFU1MKKwlwcmludGsoInF1ZXVlOiB0YXJnZXQgPSAlZCBjbW5kID0gMHglMDJ4IHBpZWNlcyA9ICVkIHNpemUgPSAldVxuIiwgU0NwbnQtPnRhcmdldCwgKih1bnNpZ25lZCBjaGFyICopIFNDcG50LT5jbW5kLCBTQ3BudC0+dXNlX3NnLCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuKTsKKyNlbmRpZgorCisJZmRfbWNzX21ha2VfYnVzX2lkbGUoc2hwbnQpOworCisJU0NwbnQtPnNjc2lfZG9uZSA9IGRvbmU7CS8qIFNhdmUgdGhpcyBmb3IgdGhlIGRvbmUgZnVuY3Rpb24gKi8KKwljdXJyZW50X1NDID0gU0NwbnQ7CisKKwkvKiBJbml0aWFsaXplIHN0YXRpYyBkYXRhICovCisKKwlpZiAoY3VycmVudF9TQy0+dXNlX3NnKSB7CisJCWN1cnJlbnRfU0MtPlNDcC5idWZmZXIgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIGN1cnJlbnRfU0MtPnJlcXVlc3RfYnVmZmVyOworCQljdXJyZW50X1NDLT5TQ3AucHRyID0gcGFnZV9hZGRyZXNzKGN1cnJlbnRfU0MtPlNDcC5idWZmZXItPnBhZ2UpICsgY3VycmVudF9TQy0+U0NwLmJ1ZmZlci0+b2Zmc2V0OworCQljdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbCA9IGN1cnJlbnRfU0MtPlNDcC5idWZmZXItPmxlbmd0aDsKKwkJY3VycmVudF9TQy0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSBjdXJyZW50X1NDLT51c2Vfc2cgLSAxOworCX0gZWxzZSB7CisJCWN1cnJlbnRfU0MtPlNDcC5wdHIgPSAoY2hhciAqKSBjdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJY3VycmVudF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgPSBjdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZsZW47CisJCWN1cnJlbnRfU0MtPlNDcC5idWZmZXIgPSBOVUxMOworCQljdXJyZW50X1NDLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IDA7CisJfQorCisKKwljdXJyZW50X1NDLT5TQ3AuU3RhdHVzID0gMDsKKwljdXJyZW50X1NDLT5TQ3AuTWVzc2FnZSA9IDA7CisJY3VycmVudF9TQy0+U0NwLmhhdmVfZGF0YV9pbiA9IDA7CisJY3VycmVudF9TQy0+U0NwLnNlbnRfY29tbWFuZCA9IDA7CisJY3VycmVudF9TQy0+U0NwLnBoYXNlID0gaW5fYXJiaXRyYXRpb247CisKKwkvKiBTdGFydCBhcmJpdHJhdGlvbiAqLworCW91dGIoMHgwMCwgSW50ZXJydXB0X0NudGxfcG9ydCk7CisJb3V0YigweDAwLCBTQ1NJX0NudGxfcG9ydCk7CS8qIERpc2FibGUgZGF0YSBkcml2ZXJzICovCisJb3V0YihhZGFwdGVyX21hc2ssIFNDU0lfRGF0YV9Ob0FDS19wb3J0KTsJLyogU2V0IG91ciBpZCBiaXQgKi8KKwlpbl9jb21tYW5kID0gMTsKKwlvdXRiKDB4MjAsIEludGVycnVwdF9DbnRsX3BvcnQpOworCW91dGIoMHgxNCB8IFBBUklUWV9NQVNLLCBUTUNfQ250bF9wb3J0KTsJLyogU3RhcnQgYXJiaXRyYXRpb24gKi8KKworCXJldHVybiAwOworfQorCisjaWYgREVCVUdfQUJPUlQgfHwgREVCVUdfUkVTRVQKK3N0YXRpYyB2b2lkIGZkX21jc19wcmludF9pbmZvKFNjc2lfQ21uZCAqIFNDcG50KQoreworCXVuc2lnbmVkIGludCBpbXI7CisJdW5zaWduZWQgaW50IGlycjsKKwl1bnNpZ25lZCBpbnQgaXNyOworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gU0NwbnQtPmhvc3Q7CisKKwlpZiAoIVNDcG50IHx8ICFTQ3BudC0+aG9zdCkgeworCQlwcmludGsoImZkX21jczogY2Fubm90IHByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb25cbiIpOworCX0KKworCXByaW50aygiJXNcbiIsIGZkX21jc19pbmZvKFNDcG50LT5ob3N0KSk7CisJcHJpbnRfYmFubmVyKFNDcG50LT5ob3N0KTsKKwlzd2l0Y2ggKFNDcG50LT5TQ3AucGhhc2UpIHsKKwljYXNlIGluX2FyYml0cmF0aW9uOgorCQlwcmludGsoImFyYml0cmF0aW9uICIpOworCQlicmVhazsKKwljYXNlIGluX3NlbGVjdGlvbjoKKwkJcHJpbnRrKCJzZWxlY3Rpb24gIik7CisJCWJyZWFrOworCWNhc2UgaW5fb3RoZXI6CisJCXByaW50aygib3RoZXIgIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygidW5rbm93biAiKTsKKwkJYnJlYWs7CisJfQorCisJcHJpbnRrKCIoJWQpLCB0YXJnZXQgPSAlZCBjbW5kID0gMHglMDJ4IHBpZWNlcyA9ICVkIHNpemUgPSAldVxuIiwgU0NwbnQtPlNDcC5waGFzZSwgU0NwbnQtPmRldmljZS0+aWQsICoodW5zaWduZWQgY2hhciAqKSBTQ3BudC0+Y21uZCwgU0NwbnQtPnVzZV9zZywgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbik7CisJcHJpbnRrKCJzZW50X2NvbW1hbmQgPSAlZCwgaGF2ZV9kYXRhX2luID0gJWQsIHRpbWVvdXQgPSAlZFxuIiwgU0NwbnQtPlNDcC5zZW50X2NvbW1hbmQsIFNDcG50LT5TQ3AuaGF2ZV9kYXRhX2luLCBTQ3BudC0+dGltZW91dCk7CisjaWYgREVCVUdfUkFDRQorCXByaW50aygiaW5faW50ZXJydXB0X2ZsYWcgPSAlZFxuIiwgaW5faW50ZXJydXB0X2ZsYWcpOworI2VuZGlmCisKKwlpbXIgPSAoaW5iKDB4MGExKSA8PCA4KSArIGluYigweDIxKTsKKwlvdXRiKDB4MGEsIDB4YTApOworCWlyciA9IGluYigweGEwKSA8PCA4OworCW91dGIoMHgwYSwgMHgyMCk7CisJaXJyICs9IGluYigweDIwKTsKKwlvdXRiKDB4MGIsIDB4YTApOworCWlzciA9IGluYigweGEwKSA8PCA4OworCW91dGIoMHgwYiwgMHgyMCk7CisJaXNyICs9IGluYigweDIwKTsKKworCS8qIFByaW50IG91dCBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiAqLworCXByaW50aygiSU1SID0gMHglMDR4IiwgaW1yKTsKKwlpZiAoaW1yICYgKDEgPDwgc2hwbnQtPmlycSkpCisJCXByaW50aygiIChtYXNrZWQpIik7CisJcHJpbnRrKCIsIElSUiA9IDB4JTA0eCwgSVNSID0gMHglMDR4XG4iLCBpcnIsIGlzcik7CisKKwlwcmludGsoIlNDU0kgU3RhdHVzICAgICAgPSAweCUwMnhcbiIsIGluYihTQ1NJX1N0YXR1c19wb3J0KSk7CisJcHJpbnRrKCJUTUMgU3RhdHVzICAgICAgID0gMHglMDJ4IiwgaW5iKFRNQ19TdGF0dXNfcG9ydCkpOworCWlmIChpbmIoVE1DX1N0YXR1c19wb3J0KSAmIDEpCisJCXByaW50aygiIChpbnRlcnJ1cHQpIik7CisJcHJpbnRrKCJcbiIpOworCXByaW50aygiSW50ZXJydXB0IFN0YXR1cyA9IDB4JTAyeCIsIGluYihJbnRlcnJ1cHRfU3RhdHVzX3BvcnQpKTsKKwlpZiAoaW5iKEludGVycnVwdF9TdGF0dXNfcG9ydCkgJiAweDA4KQorCQlwcmludGsoIiAoZW5hYmxlZCkiKTsKKwlwcmludGsoIlxuIik7CisJaWYgKGNoaXAgPT0gdG1jMThjNTAgfHwgY2hpcCA9PSB0bWMxOGMzMCkgeworCQlwcmludGsoIkZJRk8gU3RhdHVzICAgICAgPSAweCUwMnhcbiIsIGluYihzaHBudC0+aW9fcG9ydCArIEZJRk9fU3RhdHVzKSk7CisJCXByaW50aygiSW50LiBDb25kaXRpb24gICA9IDB4JTAyeFxuIiwgaW5iKHNocG50LT5pb19wb3J0ICsgSW50ZXJydXB0X0NvbmQpKTsKKwl9CisJcHJpbnRrKCJDb25maWd1cmF0aW9uIDEgID0gMHglMDJ4XG4iLCBpbmIoc2hwbnQtPmlvX3BvcnQgKyBDb25maWd1cmF0aW9uMSkpOworCWlmIChjaGlwID09IHRtYzE4YzUwIHx8IGNoaXAgPT0gdG1jMThjMzApCisJCXByaW50aygiQ29uZmlndXJhdGlvbiAyICA9IDB4JTAyeFxuIiwgaW5iKHNocG50LT5pb19wb3J0ICsgQ29uZmlndXJhdGlvbjIpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGZkX21jc19hYm9ydChTY3NpX0NtbmQgKiBTQ3BudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IFNDcG50LT5kZXZpY2UtPmhvc3Q7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmIEVWRVJZX0FDQ0VTUyB8fCBFUlJPUlNfT05MWSB8fCBERUJVR19BQk9SVAorCXByaW50aygiZmRfbWNzOiBhYm9ydCAiKTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoc2hwbnQtPmhvc3RfbG9jaywgZmxhZ3MpOworCWlmICghaW5fY29tbWFuZCkgeworI2lmIEVWRVJZX0FDQ0VTUyB8fCBFUlJPUlNfT05MWQorCQlwcmludGsoIiAobm90IGluIGNvbW1hbmQpXG4iKTsKKyNlbmRpZgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNocG50LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9IGVsc2UKKwkJcHJpbnRrKCJcbiIpOworCisjaWYgREVCVUdfQUJPUlQKKwlmZF9tY3NfcHJpbnRfaW5mbyhTQ3BudCk7CisjZW5kaWYKKworCWZkX21jc19tYWtlX2J1c19pZGxlKHNocG50KTsKKworCWN1cnJlbnRfU0MtPlNDcC5waGFzZSB8PSBhYm9ydGVkOworCisJY3VycmVudF9TQy0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworCisJLyogQWJvcnRzIGFyZSBub3QgZG9uZSB3ZWxsLiAuIC4gKi8KKwlteV9kb25lKHNocG50LCBESURfQUJPUlQgPDwgMTYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaHBudC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgZmRfbWNzX2hvc3RfcmVzZXQoU2NzaV9DbW5kICogU0NwbnQpCit7CisJcmV0dXJuIEZBSUxFRDsKK30KKworc3RhdGljIGludCBmZF9tY3NfZGV2aWNlX3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50KSAKK3sKKwlyZXR1cm4gRkFJTEVEOworfQorCitzdGF0aWMgaW50IGZkX21jc19idXNfcmVzZXQoU2NzaV9DbW5kICogU0NwbnQpIHsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IFNDcG50LT5kZXZpY2UtPmhvc3Q7CisKKyNpZiBERUJVR19SRVNFVAorCXN0YXRpYyBpbnQgY2FsbGVkX29uY2UgPSAwOworI2VuZGlmCisKKyNpZiBFUlJPUlNfT05MWQorCWlmIChTQ3BudCkKKwkJcHJpbnRrKCJmZF9tY3M6IFNDU0kgQnVzIFJlc2V0XG4iKTsKKyNlbmRpZgorCisjaWYgREVCVUdfUkVTRVQKKwlpZiAoY2FsbGVkX29uY2UpCisJCWZkX21jc19wcmludF9pbmZvKGN1cnJlbnRfU0MpOworCWNhbGxlZF9vbmNlID0gMTsKKyNlbmRpZgorCisJb3V0YigxLCBTQ1NJX0NudGxfcG9ydCk7CisJZG9fcGF1c2UoMik7CisJb3V0YigwLCBTQ1NJX0NudGxfcG9ydCk7CisJZG9fcGF1c2UoMTE1KTsKKwlvdXRiKDAsIFNDU0lfTW9kZV9DbnRsX3BvcnQpOworCW91dGIoUEFSSVRZX01BU0ssIFRNQ19DbnRsX3BvcnQpOworCisJLyogVW5sZXNzIHRoaXMgaXMgdGhlIHZlcnkgZmlyc3QgY2FsbCAoaS5lLiwgU0NQbnQgPT0gTlVMTCksIGV2ZXJ5dGhpbmcKKwkgICBpcyBwcm9iYWJseSBob3NlZCBhdCB0aGlzIHBvaW50LiAgV2Ugd2lsbCwgaG93ZXZlciwgdHJ5IHRvIGtlZXAKKwkgICB0aGluZ3MgZ29pbmcgYnkgaW5mb3JtaW5nIHRoZSBoaWdoLWxldmVsIGNvZGUgdGhhdCB3ZSBuZWVkIGhlbHAuICovCisJCXJldHVybiBTVUNDRVNTOworfQorCisjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CisKK3N0YXRpYyBpbnQgZmRfbWNzX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiBkaXNrLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJICAgIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKmluZm9fYXJyYXkpIAoreworCXVuc2lnbmVkIGNoYXIgKnAgPSBzY3NpX2Jpb3NfcHRhYmxlKGJkZXYpOworCWludCBzaXplID0gY2FwYWNpdHk7CisKKwkvKiBCSU9TID49IDMuNCBmb3IgTUNBIGNhcmRzICovCisJLyogVGhpcyBhbGdvcml0aG0gd2FzIHByb3ZpZGVkIGJ5IEZ1dHVyZSBEb21haW4gKG11Y2ggdGhhbmtzISkuICovCisKKwlpZiAocCAmJiBwWzY1XSA9PSAweGFhICYmIHBbNjRdID09IDB4NTUJLyogUGFydGl0aW9uIHRhYmxlIHZhbGlkICovCisJICAgICYmIHBbNF0pIHsJLyogUGFydGl0aW9uIHR5cGUgKi8KKwkJLyogVGhlIHBhcnRpdGlvbiB0YWJsZSBsYXlvdXQgaXMgYXMgZm9sbG93czoKKworCQkgICBTdGFydDogMHgxYjNoCisJCSAgIE9mZnNldDogMCA9IHBhcnRpdGlvbiBzdGF0dXMKKwkJICAgMSA9IHN0YXJ0aW5nIGhlYWQKKwkJICAgMiA9IHN0YXJ0aW5nIHNlY3RvciBhbmQgY3lsaW5kZXIgKHdvcmQsIGVuY29kZWQpCisJCSAgIDQgPSBwYXJ0aXRpb24gdHlwZQorCQkgICA1ID0gZW5kaW5nIGhlYWQKKwkJICAgNiA9IGVuZGluZyBzZWN0b3IgYW5kIGN5bGluZGVyICh3b3JkLCBlbmNvZGVkKQorCQkgICA4ID0gc3RhcnRpbmcgYWJzb2x1dGUgc2VjdG9yIChkb3VibGUgd29yZCkKKwkJICAgYyA9IG51bWJlciBvZiBzZWN0b3JzIChkb3VibGUgd29yZCkKKwkJICAgU2lnbmF0dXJlOiAweDFmZSA9IDB4NTVhYQorCisJCSAgIFNvLCB0aGlzIGFsZ29yaXRobSBhc3N1bWVzOgorCQkgICAxKSB0aGUgZmlyc3QgcGFydGl0aW9uIHRhYmxlIGlzIGluIHVzZSwKKwkJICAgMikgdGhlIGRhdGEgaW4gdGhlIGZpcnN0IGVudHJ5IGlzIGNvcnJlY3QsIGFuZAorCQkgICAzKSBwYXJ0aXRpb25zIG5ldmVyIGRpdmlkZSBjeWxpbmRlcnMKKworCQkgICBOb3RlIHRoYXQgKDEpIG1heSBiZSBGQUxTRSBmb3IgTmV0QlNEIChhbmQgb3RoZXIgQlNEIGZsYXZvcnMpLAorCQkgICBhcyB3ZWxsIGFzIGZvciBMaW51eC4gIE5vdGUgYWxzbywgdGhhdCBMaW51eCBkb2Vzbid0IHBheSBhbnkKKwkJICAgYXR0ZW50aW9uIHRvIHRoZSBmaWVsZHMgdGhhdCBhcmUgdXNlZCBieSB0aGlzIGFsZ29yaXRobSAtLSBpdAorCQkgICBvbmx5IHVzZXMgdGhlIGFic29sdXRlIHNlY3RvciBkYXRhLiAgUmVjZW50IHZlcnNpb25zIG9mIExpbnV4J3MKKwkJICAgZmRpc2soMSkgd2lsbCBmaWxsIHRoaXMgZGF0YSBpbiBjb3JyZWN0bHksIGFuZCBmb3J0aGNvbWluZworCQkgICB2ZXJzaW9ucyB3aWxsIGNoZWNrIGZvciBjb25zaXN0ZW5jeS4KKworCQkgICBDaGVja2luZyBmb3IgYSBub24temVybyBwYXJ0aXRpb24gdHlwZSBpcyBub3QgcGFydCBvZiB0aGUKKwkJICAgRnV0dXJlIERvbWFpbiBhbGdvcml0aG0sIGJ1dCBpdCBzZWVtZWQgdG8gYmUgYSByZWFzb25hYmxlIHRoaW5nCisJCSAgIHRvIGRvLCBlc3BlY2lhbGx5IGluIHRoZSBMaW51eCBhbmQgQlNEIHdvcmxkcy4gKi8KKworCQlpbmZvX2FycmF5WzBdID0gcFs1XSArIDE7CS8qIGhlYWRzICovCisJCWluZm9fYXJyYXlbMV0gPSBwWzZdICYgMHgzZjsJLyogc2VjdG9ycyAqLworCX0gZWxzZSB7CisJCS8qIE5vdGUgdGhhdCB0aGlzIG5ldyBtZXRob2QgZ3VhcmFudGVlcyB0aGF0IHRoZXJlIHdpbGwgYWx3YXlzIGJlCisJCSAgIGxlc3MgdGhhbiAxMDI0IGN5bGluZGVycyBvbiBhIHBsYXR0ZXIuICBUaGlzIGlzIGdvb2QgZm9yIGRyaXZlcworCQkgICB1cCB0byBhcHByb3hpbWF0ZWx5IDcuODVHQiAod2hlcmUgMUdCID0gMTAyNCAqIDEwMjQga0IpLiAqLworCQlpZiAoKHVuc2lnbmVkIGludCkgc2l6ZSA+PSAweDdlMDAwMFUpIAorCQl7CisJCQlpbmZvX2FycmF5WzBdID0gMHhmZjsJLyogaGVhZHMgICA9IDI1NSAqLworCQkJaW5mb19hcnJheVsxXSA9IDB4M2Y7CS8qIHNlY3RvcnMgPSAgNjMgKi8KKwkJfSBlbHNlIGlmICgodW5zaWduZWQgaW50KSBzaXplID49IDB4MjAwMDAwVSkgeworCQkJaW5mb19hcnJheVswXSA9IDB4ODA7CS8qIGhlYWRzICAgPSAxMjggKi8KKwkJCWluZm9fYXJyYXlbMV0gPSAweDNmOwkvKiBzZWN0b3JzID0gIDYzICovCisJCX0gZWxzZSB7CisJCQlpbmZvX2FycmF5WzBdID0gMHg0MDsJLyogaGVhZHMgICA9ICA2NCAqLworCQkJaW5mb19hcnJheVsxXSA9IDB4MjA7CS8qIHNlY3RvcnMgPSAgMzIgKi8KKwkJfQorCX0KKwkvKiBGb3IgYm90aCBtZXRob2RzLCBjb21wdXRlIHRoZSBjeWxpbmRlcnMgKi8KKwlpbmZvX2FycmF5WzJdID0gKHVuc2lnbmVkIGludCkgc2l6ZSAvIChpbmZvX2FycmF5WzBdICogaW5mb19hcnJheVsxXSk7CisJa2ZyZWUocCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCQk9ICJmZF9tY3MiLAorCS5wcm9jX2luZm8JCQk9IGZkX21jc19wcm9jX2luZm8sCisJLmRldGVjdAkJCQk9IGZkX21jc19kZXRlY3QsCisJLnJlbGVhc2UJCQk9IGZkX21jc19yZWxlYXNlLAorCS5pbmZvCQkJCT0gZmRfbWNzX2luZm8sCisJLnF1ZXVlY29tbWFuZCAgIAkJPSBmZF9tY3NfcXVldWUsIAorCS5laF9hYm9ydF9oYW5kbGVyCQk9IGZkX21jc19hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJCT0gZmRfbWNzX2J1c19yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCQk9IGZkX21jc19ob3N0X3Jlc2V0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcgk9IGZkX21jc19kZXZpY2VfcmVzZXQsCisJLmJpb3NfcGFyYW0gICAgIAkJPSBmZF9tY3NfYmlvc3BhcmFtLAorCS5jYW5fcXVldWUgICAgICAJCT0gMSwKKwkudGhpc19pZCAgICAgICAgCQk9IDcsCisJLnNnX3RhYmxlc2l6ZSAgIAkJPSA2NCwKKwkuY21kX3Blcl9sdW4gICAgCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nIAkJPSBESVNBQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZmRvbWFpbi5jIGIvZHJpdmVycy9zY3NpL2Zkb21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODQzYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2Zkb21haW4uYwpAQCAtMCwwICsxLDE3MzkgQEAKKy8qIGZkb21haW4uYyAtLSBGdXR1cmUgRG9tYWluIFRNQy0xNngwIFNDU0kgZHJpdmVyCisgKiBDcmVhdGVkOiBTdW4gTWF5ICAzIDE4OjUzOjE5IDE5OTIgYnkgZmFpdGhAY3MudW5jLmVkdQorICogUmV2aXNlZDogTW9uIERlYyAyOCAyMTo1OTowMiAxOTk4IGJ5IGZhaXRoQGFjbS5vcmcKKyAqIEF1dGhvcjogUmlja2FyZCBFLiBGYWl0aCwgZmFpdGhAY3MudW5jLmVkdQorICogQ29weXJpZ2h0IDE5OTItMTk5NiwgMTk5OCBSaWNrYXJkIEUuIEZhaXRoIChmYWl0aEBhY20ub3JnKQorICogU2hhcmVkIElSUSBzdXBwb3J0ZWQgYWRkZWQgNy83LzIwMDEgIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgU1VNTUFSWToKKworIEZ1dHVyZSBEb21haW4gQklPUyB2ZXJzaW9ucyBzdXBwb3J0ZWQgZm9yIGF1dG9kZXRlY3Q6CisgICAgMi4wLCAzLjAsIDMuMiwgMy40ICgxLjApLCAzLjUgKDIuMCksIDMuNiwgMy42MQorIENoaXBzIGFyZSBzdXBwb3J0ZWQ6CisgICAgVE1DLTE4MDAsIFRNQy0xOEM1MCwgVE1DLTE4QzMwLCBUTUMtMzZDNzAKKyBCb2FyZHMgc3VwcG9ydGVkOgorICAgIEZ1dHVyZSBEb21haW4gVE1DLTE2NTAsIFRNQy0xNjYwLCBUTUMtMTY3MCwgVE1DLTE2ODAsIFRNQy0xNjEwTS9NRVIvTUVYCisgICAgRnV0dXJlIERvbWFpbiBUTUMtMzI2MCAoUENJKQorICAgIFF1YW50dW0gSVNBLTIwMFMsIElTQS0yNTBNRworICAgIEFkYXB0ZWMgQUhBLTI5MjBBIChQQ0kpIFtCVVQgKk5PVCogQUhBLTI5MjBDIC0tIHVzZSBhaWM3eHh4IGluc3RlYWRdCisgICAgSUJNID8KKyBMSUxPL0lOU01PRCBjb21tYW5kLWxpbmUgb3B0aW9uczoKKyAgICBmZG9tYWluPTxQT1JUX0JBU0U+LDxJUlE+Wyw8QURBUFRFUl9JRD5dCisKKworICAgIAorIE5PVEU6CisKKyBUaGUgQWRhcHRlYyBBSEEtMjkyMEMgaGFzIGFuIEFkYXB0ZWMgQUlDLTc4NTAgY2hpcCBvbiBpdC4KKyBVc2UgdGhlIGFpYzd4eHggZHJpdmVyIGZvciB0aGlzIGJvYXJkLgorICAgICAgIAorIFRoZSBBZGFwdGVjIEFIQS0yOTIwQSBoYXMgYSBGdXR1cmUgRG9tYWluIGNoaXAgb24gaXQsIHNvIHRoaXMgaXMgdGhlIHJpZ2h0CisgZHJpdmVyIGZvciB0aGF0IGNhcmQuICBVbmZvcnR1bmF0ZWx5LCB0aGUgYm94ZXMgd2lsbCBwcm9iYWJseSBqdXN0IHNheQorICIyOTIwIiwgc28geW91J2xsIGhhdmUgdG8gbG9vayBvbiB0aGUgY2FyZCBmb3IgYSBGdXR1cmUgRG9tYWluIGxvZ28sIG9yIGEKKyBsZXR0ZXIgYWZ0ZXIgdGhlIDI5MjAuCisKKyAKKyAKKyBUSEFOS1M6CisKKyBUaGFua3MgdG8gQWRhcHRlYyBmb3IgcHJvdmlkaW5nIFBDSSBib2FyZHMgZm9yIHRlc3RpbmcuICBUaGlzIGZpbmFsbHkKKyBlbmFibGVkIG1lIHRvIHRlc3QgdGhlIFBDSSBkZXRlY3Rpb24gYW5kIGNvcnJlY3QgaXQgZm9yIFBDSSBib2FyZHMgdGhhdCBkbworIG5vdCBoYXZlIGEgQklPUyBhdCBhIHN0YW5kYXJkIElTQSBsb2NhdGlvbi4gIEZvciBQQ0kgYm9hcmRzLCBMSUxPL0lOU01PRAorIGNvbW1hbmQtbGluZSBvcHRpb25zIHNob3VsZCBubyBsb25nZXIgYmUgbmVlZGVkLiAgLS1SRiAxOE5vdjk4CisKKworIAorIERFU0NSSVBUSU9OOgorIAorIFRoaXMgaXMgdGhlIExpbnV4IGxvdy1sZXZlbCBTQ1NJIGRyaXZlciBmb3IgRnV0dXJlIERvbWFpbiBUTUMtMTY2MC8xNjgwCisgVE1DLTE2NTAvMTY3MCwgYW5kIFRNQy0zMjYwIFNDU0kgaG9zdCBhZGFwdGVycy4gIFRoZSAxNjUwIGFuZCAxNjcwIGhhdmUgYQorIDI1LXBpbiBleHRlcm5hbCBjb25uZWN0b3IsIHdoZXJlYXMgdGhlIDE2NjAgYW5kIDE2ODAgaGF2ZSBhIFNDU0ktMiA1MC1waW4KKyBoaWdoLWRlbnNpdHkgZXh0ZXJuYWwgY29ubmVjdG9yLiAgVGhlIDE2NzAgYW5kIDE2ODAgaGF2ZSBmbG9wcHkgZGlzaworIGNvbnRyb2xsZXJzIGJ1aWx0IGluLiAgVGhlIFRNQy0zMjYwIGlzIGEgUENJIGJ1cyBjYXJkLgorCisgRnV0dXJlIERvbWFpbidzIG9sZGVyIGJvYXJkcyBhcmUgYmFzZWQgb24gdGhlIFRNQy0xODAwIGNoaXAsIGFuZCB0aGlzCisgZHJpdmVyIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gZm9yIGEgVE1DLTE2ODAgYm9hcmQgd2l0aCB0aGUgVE1DLTE4MDAgY2hpcC4KKyBNb3JlIHJlY2VudGx5LCBib2FyZHMgYXJlIGJlaW5nIHByb2R1Y2VkIHdpdGggdGhlIFRNQy0xOEM1MCBhbmQgVE1DLTE4QzMwCisgY2hpcHMuICBUaGUgbGF0ZXN0IGFuZCBncmVhdGVzdCBib2FyZCBtYXkgbm90IHdvcmsgd2l0aCB0aGlzIGRyaXZlci4gIElmCisgeW91IGhhdmUgdG8gcGF0Y2ggdGhpcyBkcml2ZXIgc28gdGhhdCBpdCB3aWxsIHJlY29nbml6ZSB5b3VyIGJvYXJkJ3MgQklPUworIHNpZ25hdHVyZSwgdGhlbiB0aGUgZHJpdmVyIG1heSBmYWlsIHRvIGZ1bmN0aW9uIGFmdGVyIHRoZSBib2FyZCBpcworIGRldGVjdGVkLgorCisgUGxlYXNlIG5vdGUgdGhhdCB0aGUgZHJpdmUgb3JkZXJpbmcgdGhhdCBGdXR1cmUgRG9tYWluIGltcGxlbWVudGVkIGluIEJJT1MKKyB2ZXJzaW9ucyAzLjQgYW5kIDMuNSBpcyB0aGUgb3Bwb3NpdGUgb2YgdGhlIG9yZGVyIChjdXJyZW50bHkpIHVzZWQgYnkgdGhlCisgcmVzdCBvZiB0aGUgU0NTSSBpbmR1c3RyeS4gIElmIHlvdSBoYXZlIEJJT1MgdmVyc2lvbiAzLjQgb3IgMy41LCBhbmQgaGF2ZQorIG1vcmUgdGhhbiBvbmUgZHJpdmUsIHRoZW4gdGhlIGRyaXZlIG9yZGVyaW5nIHdpbGwgYmUgdGhlIHJldmVyc2Ugb2YgdGhhdAorIHdoaWNoIHlvdSBzZWUgdW5kZXIgRE9TLiAgRm9yIGV4YW1wbGUsIHVuZGVyIERPUyBTQ1NJIElEIDAgd2lsbCBiZSBEOiBhbmQKKyBTQ1NJIElEIDEgd2lsbCBiZSBDOiAodGhlIGJvb3QgZGV2aWNlKS4gIFVuZGVyIExpbnV4LCBTQ1NJIElEIDAgd2lsbCBiZQorIC9kZXYvc2RhIGFuZCBTQ1NJIElEIDEgd2lsbCBiZSAvZGV2L3NkYi4gIFRoZSBMaW51eCBvcmRlcmluZyBpcyBjb25zaXN0ZW50Cisgd2l0aCB0aGF0IHByb3ZpZGVkIGJ5IGFsbCB0aGUgb3RoZXIgU0NTSSBkcml2ZXJzIGZvciBMaW51eC4gIElmIHlvdSB3YW50CisgdGhpcyBjaGFuZ2VkLCB5b3Ugd2lsbCBwcm9iYWJseSBoYXZlIHRvIHBhdGNoIHRoZSBoaWdoZXIgbGV2ZWwgU0NTSSBjb2RlLgorIElmIHlvdSBkbyBzbywgcGxlYXNlIHNlbmQgbWUgcGF0Y2hlcyB0aGF0IGFyZSBwcm90ZWN0ZWQgYnkgI2lmZGVmcy4KKworIElmIHlvdSBoYXZlIGEgVE1DLTh4eCBvciBUTUMtOXh4IGJvYXJkLCB0aGVuIHRoaXMgaXMgbm90IHRoZSBkcml2ZXIgZm9yCisgeW91ciBib2FyZC4gIFBsZWFzZSByZWZlciB0byB0aGUgU2VhZ2F0ZSBkcml2ZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kCisgcG9zc2libGUgc3VwcG9ydC4KKworIAorIAorIEhJU1RPUlk6CisKKyBMaW51eCAgICAgICBEcml2ZXIgICAgICBEcml2ZXIKKyBWZXJzaW9uICAgICBWZXJzaW9uICAgICBEYXRlICAgICAgICAgU3VwcG9ydC9Ob3RlcworCisgICAgICAgICAgICAgMC4wICAgICAgICAgIDMgTWF5IDE5OTIgIFYyLjAgQklPUzsgMTgwMCBjaGlwCisgMC45NyAgICAgICAgMS45ICAgICAgICAgMjggSnVsIDE5OTIKKyAwLjk4LjYgICAgICAzLjEgICAgICAgICAyNyBOb3YgMTk5MgorIDAuOTkgICAgICAgIDMuMiAgICAgICAgICA5IERlYyAxOTkyCisKKyAwLjk5LjMgICAgICAzLjMgICAgICAgICAxMCBKYW4gMTk5MyAgVjMuMCBCSU9TCisgMC45OS41ICAgICAgMy41ICAgICAgICAgMTggRmViIDE5OTMKKyAwLjk5LjEwICAgICAzLjYgICAgICAgICAxNSBNYXkgMTk5MyAgVjMuMiBCSU9TOyAxOEM1MCBjaGlwCisgMC45OS4xMSAgICAgMy4xNyAgICAgICAgIDMgSnVsIDE5OTMgIChub3cgdW5kZXIgUkNTKQorIDAuOTkuMTIgICAgIDMuMTggICAgICAgIDEzIEF1ZyAxOTkzCisgMC45OS4xNCAgICAgNS42ICAgICAgICAgMzEgT2N0IDE5OTMgIChyZXNlbGVjdGlvbiBjb2RlIHJlbW92ZWQpCisKKyAwLjk5LjE1ICAgICA1LjkgICAgICAgICAyMyBKYW4gMTk5NCAgVjMuNCBCSU9TIChwcmVsaW1pbmFyeSkKKyAxLjAuOC8xLjEuMSA1LjE1ICAgICAgICAgMSBBcHIgMTk5NCAgVjMuNCBCSU9TOyAxOEMzMCBjaGlwIChwcmVsaW1pbmFyeSkKKyAxLjAuOS8xLjEuMyA1LjE2ICAgICAgICAgNyBBcHIgMTk5NCAgVjMuNCBCSU9TOyAxOEMzMCBjaGlwCisgMS4xLjM4ICAgICAgNS4xOCAgICAgICAgMzAgSnVsIDE5OTQgIDM2QzcwIGNoaXAgKFBDSSB2ZXJzaW9uIG9mIDE4QzMwKQorIDEuMS42MiAgICAgIDUuMjAgICAgICAgICAyIE5vdiAxOTk0ICBWMy41IEJJT1MKKyAxLjEuNzMgICAgICA1LjIyICAgICAgICAgNyBEZWMgMTk5NCAgUXVhbnR1bSBJU0EtMjAwUyBib2FyZDsgVjIuMCBCSU9TCisKKyAxLjEuODIgICAgICA1LjI2ICAgICAgICAxNCBKYW4gMTk5NSAgVjMuNSBCSU9TOyBUTUMtMTYxME0vTUVSL01FWCBib2FyZAorIDEuMi4xMCAgICAgIDUuMjggICAgICAgICA1IEp1biAxOTk1ICBRdWFudHVtIElTQS0yNTBNRyBib2FyZDsgVjIuMCwgVjIuMDEgQklPUworIDEuMy40ICAgICAgIDUuMzEgICAgICAgIDIzIEp1biAxOTk1ICBQQ0kgQklPUy0zMiBkZXRlY3Rpb24gKHByZWxpbWluYXJ5KQorIDEuMy43ICAgICAgIDUuMzMgICAgICAgICA0IEp1bCAxOTk1ICBQQ0kgQklPUy0zMiBkZXRlY3Rpb24KKyAxLjMuMjggICAgICA1LjM2ICAgICAgICAxNyBTZXAgMTk5NSAgVjMuNjEgQklPUzsgTElMTyBjb21tYW5kLWxpbmUgc3VwcG9ydAorIDEuMy4zNCAgICAgIDUuMzkgICAgICAgIDEyIE9jdCAxOTk1ICBWMy42MCBCSU9TOyAvcHJvYworIDEuMy43MiAgICAgIDUuMzkgICAgICAgICA4IEZlYiAxOTk2ICBBZGFwdGVjIEFIQS0yOTIwIGJvYXJkCisgMS4zLjg1ICAgICAgNS40MSAgICAgICAgIDQgQXByIDE5OTYKKyAyLjAuMTIgICAgICA1LjQ0ICAgICAgICAgOCBBdWcgMTk5NiAgVXNlIElEIDcgZm9yIGFsbCBQQ0kgY2FyZHMKKyAyLjEuMSAgICAgICA1LjQ1ICAgICAgICAgMiBPY3QgMTk5NiAgVXBkYXRlIFJPTSBhY2Nlc3NlcyBmb3IgMi4xLngKKyAyLjEuOTcgICAgICA1LjQ2CSAyMyBBcHIgMTk5OCAgUmV3cml0dGVuIFBDSSBkZXRlY3Rpb24gcm91dGluZXMgW21qXQorIDIuMS4xMXggICAgIDUuNDcJICA5IEF1ZyAxOTk4ICBUb3VjaGVkIGZvciA4IFNDU0kgZGlzayBtYWpvcnMgc3VwcG9ydAorICAgICAgICAgICAgIDUuNDggICAgICAgIDE4IE5vdiAxOTk4ICBCSU9TIG5vIGxvbmdlciBuZWVkZWQgZm9yIFBDSSBkZXRlY3Rpb24KKyAyLjIuMCAgICAgICA1LjUwICAgICAgICAyOCBEZWMgMTk5OCAgU3VwcG9ydCBpbnNtb2QgcGFyYW1ldGVycworIAorCisgUkVGRVJFTkNFUyBVU0VEOgorCisgIlRNQy0xODAwIFNDU0kgQ2hpcCBTcGVjaWZpY2F0aW9uIChGREMtMTgwMFQpIiwgRnV0dXJlIERvbWFpbiBDb3Jwb3JhdGlvbiwKKyAxOTkwLgorCisgIlRlY2huaWNhbCBSZWZlcmVuY2UgTWFudWFsOiAxOEM1MCBTQ1NJIEhvc3QgQWRhcHRlciBDaGlwIiwgRnV0dXJlIERvbWFpbgorIENvcnBvcmF0aW9uLCBKYW51YXJ5IDE5OTIuCisKKyAiTFhUIFNDU0kgUHJvZHVjdHM6IFNwZWNpZmljYXRpb25zIGFuZCBPRU0gVGVjaG5pY2FsIE1hbnVhbCAoUmV2aXNpb24KKyBCL1NlcHRlbWJlciAxOTkxKSIsIE1heHRvciBDb3Jwb3JhdGlvbiwgMTk5MS4KKworICI3MjEzUyBwcm9kdWN0IE1hbnVhbCAoUmV2aXNpb24gUDMpIiwgTWF4dG9yIENvcnBvcmF0aW9uLCAxOTkyLgorCisgIkRyYWZ0IFByb3Bvc2VkIEFtZXJpY2FuIE5hdGlvbmFsIFN0YW5kYXJkOiBTbWFsbCBDb21wdXRlciBTeXN0ZW0KKyBJbnRlcmZhY2UgLSAyIChTQ1NJLTIpIiwgR2xvYmFsIEVuZ2luZWVyaW5nIERvY3VtZW50cy4gKFgzVDkuMi84Ni0xMDksCisgcmV2aXNpb24gMTBoLCBPY3RvYmVyIDE3LCAxOTkxKQorCisgUHJpdmF0ZSBjb21tdW5pY2F0aW9ucywgRHJldyBFY2toYXJkdCAoZHJld0Bjcy5jb2xvcmFkby5lZHUpIGFuZCBFcmljCisgWW91bmdkYWxlIChlcmljeUBjYWlzLmNvbSksIDE5OTIuCisKKyBQcml2YXRlIGNvbW11bmljYXRpb24sIFR1b25nIExlIChGdXR1cmUgRG9tYWluIEVuZ2luZWVyaW5nIGRlcGFydG1lbnQpLAorIDE5OTQuIChEaXNrIGdlb21ldHJ5IGNvbXB1dGF0aW9ucyBmb3IgRnV0dXJlIERvbWFpbiBCSU9TIHZlcnNpb24gMy40LCBhbmQKKyBUTUMtMThDMzAgZGV0ZWN0aW9uLikKKworIEhvZ2FuLCBUaG9tLiBUaGUgUHJvZ3JhbW1lcidzIFBDIFNvdXJjZWJvb2suIE1pY3Jvc29mdCBQcmVzcywgMTk4OC4gUGFnZQorIDYwICgyLjM5OiBEaXNrIFBhcnRpdGlvbiBUYWJsZSBMYXlvdXQpLgorCisgIjE4QzMwIFRlY2huaWNhbCBSZWZlcmVuY2UgTWFudWFsIiwgRnV0dXJlIERvbWFpbiBDb3Jwb3JhdGlvbiwgMTk5MywgcGFnZQorIDYtMS4KKworCisgCisgTk9URVMgT04gUkVGRVJFTkNFUzoKKworIFRoZSBNYXh0b3IgbWFudWFscyB3ZXJlIGZyZWUuICBNYXh0b3IgdGVsZXBob25lIHRlY2huaWNhbCBzdXBwb3J0IGlzCisgZ3JlYXQhCisKKyBUaGUgRnV0dXJlIERvbWFpbiBtYW51YWxzIHdlcmUgJDI1IGFuZCAkMzUuICBUaGV5IGRvY3VtZW50IHRoZSBjaGlwLCBub3QKKyB0aGUgVE1DLTE2eDAgYm9hcmRzLCBzbyBzb21lIGluZm9ybWF0aW9uIEkgaGFkIHRvIGd1ZXNzIGF0LiAgSW4gMTk5MiwKKyBGdXR1cmUgRG9tYWluIHNvbGQgRE9TIEJJT1Mgc291cmNlIGZvciAkMjUwIGFuZCB0aGUgVU4qWCBkcml2ZXIgc291cmNlIHdhcworICQ3NTAsIGJ1dCB0aGVzZSByZXF1aXJlZCBhIG5vbi1kaXNjbG9zdXJlIGFncmVlbWVudCwgc28gZXZlbiBpZiBJIGNvdWxkCisgaGF2ZSBhZmZvcmRlZCB0aGVtLCB0aGV5IHdvdWxkICpub3QqIGhhdmUgYmVlbiB1c2VmdWwgZm9yIHdyaXRpbmcgdGhpcworIHB1YmxpY2FsbHkgZGlzdHJpYnV0YWJsZSBkcml2ZXIuICBGdXR1cmUgRG9tYWluIHRlY2huaWNhbCBzdXBwb3J0IGhhcworIHByb3ZpZGVkIHNvbWUgaW5mb3JtYXRpb24gb24gdGhlIHBob25lIGFuZCBoYXZlIHNlbnQgYSBmZXcgdXNlZnVsIEZBWHMuCisgVGhleSBoYXZlIGJlZW4gbXVjaCBtb3JlIGhlbHBmdWwgc2luY2UgdGhleSBzdGFydGVkIHRvIHJlY29nbml6ZSB0aGF0IHRoZQorIHdvcmQgIkxpbnV4IiByZWZlcnMgdG8gYW4gb3BlcmF0aW5nIHN5c3RlbSA6LSkuCisKKyAKKworIEFMUEhBIFRFU1RFUlM6CisKKyBUaGVyZSBhcmUgbWFueSBvdGhlciBhbHBoYSB0ZXN0ZXJzIHRoYXQgY29tZSBhbmQgZ28gYXMgdGhlIGRyaXZlcgorIGRldmVsb3BzLiAgVGhlIHBlb3BsZSBsaXN0ZWQgaGVyZSB3ZXJlIG1vc3QgaGVscGZ1bCBpbiB0aW1lcyBvZiBncmVhdGVzdAorIG5lZWQgKG1vc3RseSBlYXJseSBvbiAtLSBJJ3ZlIHByb2JhYmx5IGxlZnQgb3V0IGEgZmV3IHdvcnRoeSBwZW9wbGUgaW4KKyBtb3JlIHJlY2VudCB0aW1lcyk6CisKKyBUb2RkIENhcnJpY28gKHRvZGRAd3V0Yy53dXN0bC5lZHUpLCBEYW4gUG9pcmllciAocG9pcmllckBjcy51bmMuZWR1ICksIEtlbgorIENvcmV5IChrZW5jQHNvbC5hY3MudW50LmVkdSksIEMuIGRlIEJydWluIChicnVpbkBicnVpbkBzdGVyYmJzLm5sKSwgU2FrYXJpCisgQWFsdG9uZW4gKHNha2FyaWFAdmlwdW5lbi5oaXQuZmkpLCBKb2huIFJpY2UgKHJpY2VAeGFudGguY3Mub2R1LmVkdSksIEJyYWQKKyBZZWFyd29vZCAoYnJhZEBvcHRpbGluay5jb20pLCBhbmQgUmF5IFRveSAodG95QHNvaG8uY3JkLmdlLmNvbSkuCisKKyBTcGVjaWFsIHRoYW5rcyB0byBUaWVuLVdhbiBZYW5nICh0d3lhbmdAY3MudWguZWR1KSwgd2hvIGdyYWNpb3VzbHkgbGVudCBtZQorIGhpcyAxOEM1MC1iYXNlZCBjYXJkIGZvciBkZWJ1Z2dpbmcuICBIZSBpcyB0aGUgc29sZSByZWFzb24gdGhhdCB0aGlzCisgZHJpdmVyIHdvcmtzIHdpdGggdGhlIDE4QzUwIGNoaXAuCisKKyBUaGFua3MgdG8gRGF2ZSBOZXdtYW4gKGRuZXdtYW5AY3JsLmNvbSkgZm9yIHByb3ZpZGluZyBpbml0aWFsIHBhdGNoZXMgZm9yCisgdGhlIHZlcnNpb24gMy40IEJJT1MuCisKKyBUaGFua3MgdG8gSmFtZXMgVC4gTWNLaW5sZXkgKG1ja2lubGV5QG1zdXBhLnBhLm1zdS5lZHUpIGZvciBwcm92aWRpbmcKKyBwYXRjaGVzIHRoYXQgc3VwcG9ydCB0aGUgVE1DLTMyNjAsIGEgUENJIGJ1cyBjYXJkIHdpdGggdGhlIDM2QzcwIGNoaXAuCisgVGhlIDM2QzcwIGNoaXAgYXBwZWFycyB0byBiZSAiY29tcGxldGVseSBjb21wYXRpYmxlIiB3aXRoIHRoZSAxOEMzMCBjaGlwLgorCisgVGhhbmtzIHRvIEVyaWMgS2FzdGVuICh0aWdnZXJAcGV0cm9nbHlwaC5jbC5tc3UuZWR1KSBmb3IgcHJvdmlkaW5nIHRoZQorIHBhdGNoIGZvciB0aGUgdmVyc2lvbiAzLjUgQklPUy4KKworIFRoYW5rcyBmb3IgU3RlcGhlbiBIZW5zb24gKHNoZW5zb25Abnl4MTAuY3MuZHUuZWR1KSBmb3IgcHJvdmlkaW5nIHRoZQorIHBhdGNoIGZvciB0aGUgUXVhbnR1bSBJU0EtMjAwUyBTQ1NJIGFkYXB0ZXIuCisgCisgVGhhbmtzIHRvIEFkYW0gQm93ZW4gZm9yIHRoZSBzaWduYXR1cmUgdG8gdGhlIDE2MTBNL01FUi9NRVggc2NzaSBjYXJkcywgdG8KKyBNYXJ0aW4gQW5kcmV3cyAoYW5kcmV3bUBjY2ZhZG0uZWVnLmNjZi5vcmcpIGZvciB0aGUgc2lnbmF0dXJlIHRvIHNvbWUKKyByYW5kb20gVE1DLTE2ODAgcmVwYWNrYWdlZCBieSBJQk07IGFuZCB0byBNaW50YWsgTmcgKG1pbnRha0BwYW5peC5jb20pIGZvcgorIHRoZSB2ZXJzaW9uIDMuNjEgQklPUyBzaWduYXR1cmUuCisKKyBUaGFua3MgZm9yIE1hcmsgU2luZ2VyIChlbGZAbmV0Y29tLmNvbSkgYW5kIFJpY2hhcmQgU2ltcHNvbgorIChyc2ltcHNvbkBld3Jjc2RyYS5kZW1vbi5jby51aykgZm9yIG1vcmUgUXVhbnR1bSBzaWduYXR1cmVzIGFuZCBkZXRlY3RpdmUKKyB3b3JrIG9uIHRoZSBRdWFudHVtIFJBTSBsYXlvdXQuCisKKyBTcGVjaWFsIHRoYW5rcyB0byBKYW1lcyBULiBNY0tpbmxleSAobWNraW5sZXlAbXN1cGEucGEubXN1LmVkdSkgZm9yCisgcHJvdmlkaW5nIHBhdGNoZXMgZm9yIHByb3BlciBQQ0kgQklPUzMyLW1lZGlhdGVkIGRldGVjdGlvbiBvZiB0aGUgVE1DLTMyNjAKKyBjYXJkIChhIFBDSSBidXMgY2FyZCB3aXRoIHRoZSAzNkM3MCBjaGlwKS4gIFBsZWFzZSBzZW5kIEphbWVzIFBDSS1yZWxhdGVkCisgYnVnIHJlcG9ydHMuCisKKyBUaGFua3MgdG8gVG9tIENhdmluICh0ZWNAdXNhMS5jb20pIGZvciBwcmVsaW1pbmFyeSBjb21tYW5kLWxpbmUgb3B0aW9uCisgcGF0Y2hlcy4KKworIE5ldyBQQ0kgZGV0ZWN0aW9uIGNvZGUgd3JpdHRlbiBieSBNYXJ0aW4gTWFyZXMgPG1qQGF0cmV5Lmthcmxpbi5tZmYuY3VuaS5jej4KKworIEluc21vZCBwYXJhbWV0ZXIgY29kZSBiYXNlZCBvbiBwYXRjaGVzIGZyb20gRGFuaWVsIEdyYWhhbQorIDxncmFoYW1AYmFsYW5jZS51b3JlZ29uLmVkdT4uIAorIAorIEFsbCBvZiB0aGUgYWxwaGEgdGVzdGVycyBkZXNlcnZlIG11Y2ggdGhhbmtzLgorCisKKworIE5PVEVTIE9OIFVTRVIgREVGSU5BQkxFIE9QVElPTlM6CisKKyBERUJVRzogVGhpcyB0dXJucyBvbiB0aGUgcHJpbnRpbmcgb2YgdmFyaW91cyBkZWJ1ZyBpbmZvcm1hdGlvbi4KKworIEVOQUJMRV9QQVJJVFk6IFRoaXMgdHVybnMgb24gU0NTSSBwYXJpdHkgY2hlY2tpbmcuICBXaXRoIHRoZSBjdXJyZW50CisgZHJpdmVyLCBhbGwgYXR0YWNoZWQgZGV2aWNlcyBtdXN0IHN1cHBvcnQgU0NTSSBwYXJpdHkuICBJZiBub25lIG9mIHlvdXIKKyBkZXZpY2VzIHN1cHBvcnQgcGFyaXR5LCB0aGVuIHlvdSBjYW4gcHJvYmFibHkgZ2V0IHRoZSBkcml2ZXIgdG8gd29yayBieQorIHR1cm5pbmcgdGhpcyBvcHRpb24gb2ZmLiAgSSBoYXZlIG5vIHdheSBvZiB0ZXN0aW5nIHRoaXMsIGhvd2V2ZXIsIGFuZCBpdAorIHdvdWxkIGFwcGVhciB0aGF0IG5vIG9uZSBldmVyIHVzZXMgdGhpcyBvcHRpb24uCisKKyBGSUZPX0NPVU5UOiBUaGUgaG9zdCBhZGFwdGVyIGhhcyBhbiA4SyBjYWNoZSAoaG9zdCBhZGFwdGVycyBiYXNlZCBvbiB0aGUKKyAxOEMzMCBjaGlwIGhhdmUgYSAyayBjYWNoZSkuICBXaGVuIHRoaXMgbWFueSA1MTIgYnl0ZSBibG9ja3MgYXJlIGZpbGxlZCBieQorIHRoZSBTQ1NJIGRldmljZSwgYW4gaW50ZXJydXB0IHdpbGwgYmUgcmFpc2VkLiAgVGhlcmVmb3JlLCB0aGlzIGNvdWxkIGJlIGFzCisgbG93IGFzIDAsIG9yIGFzIGhpZ2ggYXMgMTYuICBOb3RlLCBob3dldmVyLCB0aGF0IHZhbHVlcyB3aGljaCBhcmUgdG9vIGhpZ2gKKyBvciB0b28gbG93IHNlZW0gdG8gcHJldmVudCBhbnkgaW50ZXJydXB0cyBmcm9tIG9jY3VycmluZywgYW5kIHRoZXJlYnkgbG9jaworIHVwIHRoZSBtYWNoaW5lLiAgSSBoYXZlIGZvdW5kIHRoYXQgMiBpcyBhIGdvb2QgbnVtYmVyLCBidXQgdGhyb3VnaHB1dCBtYXkKKyBiZSBpbmNyZWFzZWQgYnkgY2hhbmdpbmcgdGhpcyB2YWx1ZSB0byB2YWx1ZXMgd2hpY2ggYXJlIGNsb3NlIHRvIDIuCisgUGxlYXNlIGxldCBtZSBrbm93IGlmIHlvdSB0cnkgYW55IGRpZmZlcmVudCB2YWx1ZXMuCisKKyBSRVNFTEVDVElPTjogVGhpcyBpcyBubyBsb25nZXIgYW4gb3B0aW9uLCBzaW5jZSBJIGdhdmUgdXAgdHJ5aW5nIHRvCisgaW1wbGVtZW50IGl0IGluIHZlcnNpb24gNC54IG9mIHRoaXMgZHJpdmVyLiAgSXQgZGlkIG5vdCBpbXByb3ZlCisgcGVyZm9ybWFuY2UgYXQgYWxsIGFuZCBtYWRlIHRoZSBkcml2ZXIgdW5zdGFibGUgKGJlY2F1c2UgSSBuZXZlciBmb3VuZCBvbmUKKyBvZiB0aGUgdHdvIHJhY2UgY29uZGl0aW9ucyB3aGljaCB3ZXJlIGludHJvZHVjZWQgYnkgdGhlIG11bHRpcGxlCisgb3V0c3RhbmRpbmcgY29tbWFuZCBjb2RlKS4gIFRoZSBpbnN0YWJpbGl0eSBzZWVtcyBhIHZlcnkgaGlnaCBwcmljZSB0byBwYXkKKyBqdXN0IHNvIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gd2FpdCBmb3IgdGhlIHRhcGUgdG8gcmV3aW5kLiAgSWYgeW91IHdhbnQKKyB0aGlzIGZlYXR1cmUgaW1wbGVtZW50ZWQsIHNlbmQgbWUgcGF0Y2hlcy4gIEknbGwgYmUgaGFwcHkgdG8gc2VuZCBhIGNvcHkKKyBvZiBteSAoYnJva2VuKSBkcml2ZXIgdG8gYW55b25lIHdobyB3b3VsZCBsaWtlIHRvIHNlZSBhIGNvcHkuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KKyNpbmNsdWRlICJmZG9tYWluLmgiCisKK01PRFVMRV9BVVRIT1IoIlJpY2thcmQgRS4gRmFpdGgiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRnV0dXJlIGRvbWFpbiBTQ1NJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisgIAorI2RlZmluZSBWRVJTSU9OICAgICAgICAgICIkUmV2aXNpb246IDUuNTEgJCIKKworLyogU1RBUlQgT0YgVVNFUiBERUZJTkFCTEUgT1BUSU9OUyAqLworCisjZGVmaW5lIERFQlVHICAgICAgICAgICAgMAkvKiBFbmFibGUgZGVidWdnaW5nIG91dHB1dCAqLworI2RlZmluZSBFTkFCTEVfUEFSSVRZICAgIDEJLyogRW5hYmxlIFNDU0kgUGFyaXR5ICovCisjZGVmaW5lIEZJRk9fQ09VTlQgICAgICAgMgkvKiBOdW1iZXIgb2YgNTEyIGJ5dGUgYmxvY2tzIGJlZm9yZSBJTlRSICovCisKKy8qIEVORCBPRiBVU0VSIERFRklOQUJMRSBPUFRJT05TICovCisKKyNpZiBERUJVRworI2RlZmluZSBFVkVSWV9BQ0NFU1MgICAgIDAJLyogV3JpdGUgYSBsaW5lIG9uIGV2ZXJ5IHNjc2kgYWNjZXNzICovCisjZGVmaW5lIEVSUk9SU19PTkxZICAgICAgMQkvKiBPbmx5IHdyaXRlIGEgbGluZSBpZiB0aGVyZSBpcyBhbiBlcnJvciAqLworI2RlZmluZSBERUJVR19ERVRFQ1QgICAgIDAJLyogRGVidWcgZmRvbWFpbl8xNngwX2RldGVjdCgpICovCisjZGVmaW5lIERFQlVHX01FU1NBR0VTICAgMQkvKiBEZWJ1ZyBNRVNTQUdFIElOIHBoYXNlICovCisjZGVmaW5lIERFQlVHX0FCT1JUICAgICAgMQkvKiBEZWJ1ZyBhYm9ydCgpIHJvdXRpbmUgKi8KKyNkZWZpbmUgREVCVUdfUkVTRVQgICAgICAxCS8qIERlYnVnIHJlc2V0KCkgcm91dGluZSAqLworI2RlZmluZSBERUJVR19SQUNFICAgICAgIDEgICAgICAvKiBEZWJ1ZyBpbnRlcnJ1cHQtZHJpdmVuIHJhY2UgY29uZGl0aW9uICovCisjZWxzZQorI2RlZmluZSBFVkVSWV9BQ0NFU1MgICAgIDAJLyogTEVBVkUgVEhFU0UgQUxPTkUtLUNIQU5HRSBUSEUgT05FUyBBQk9WRSAqLworI2RlZmluZSBFUlJPUlNfT05MWSAgICAgIDAKKyNkZWZpbmUgREVCVUdfREVURUNUICAgICAwCisjZGVmaW5lIERFQlVHX01FU1NBR0VTICAgMAorI2RlZmluZSBERUJVR19BQk9SVCAgICAgIDAKKyNkZWZpbmUgREVCVUdfUkVTRVQgICAgICAwCisjZGVmaW5lIERFQlVHX1JBQ0UgICAgICAgMAorI2VuZGlmCisKKy8qIEVycm9ycyBhcmUgcmVwb3J0ZWQgb24gdGhlIGxpbmUsIHNvIHdlIGRvbid0IG5lZWQgdG8gcmVwb3J0IHRoZW0gYWdhaW4gKi8KKyNpZiBFVkVSWV9BQ0NFU1MKKyN1bmRlZiBFUlJPUlNfT05MWQorI2RlZmluZSBFUlJPUlNfT05MWSAgICAgIDAKKyNlbmRpZgorCisjaWYgRU5BQkxFX1BBUklUWQorI2RlZmluZSBQQVJJVFlfTUFTSyAgICAgIDB4MDgKKyNlbHNlCisjZGVmaW5lIFBBUklUWV9NQVNLICAgICAgMHgwMAorI2VuZGlmCisKK2VudW0gY2hpcF90eXBlIHsKKyAgIHVua25vd24gICAgICAgICAgPSAweDAwLAorICAgdG1jMTgwMCAgICAgICAgICA9IDB4MDEsCisgICB0bWMxOGM1MCAgICAgICAgID0gMHgwMiwKKyAgIHRtYzE4YzMwICAgICAgICAgPSAweDAzLAorfTsKKworZW51bSB7CisgICBpbl9hcmJpdHJhdGlvbiAgID0gMHgwMiwKKyAgIGluX3NlbGVjdGlvbiAgICAgPSAweDA0LAorICAgaW5fb3RoZXIgICAgICAgICA9IDB4MDgsCisgICBkaXNjb25uZWN0ICAgICAgID0gMHgxMCwKKyAgIGFib3J0ZWQgICAgICAgICAgPSAweDIwLAorICAgc2VudF9pZGVudCAgICAgICA9IDB4NDAsCit9OworCitlbnVtIGluX3BvcnRfdHlwZSB7CisgICBSZWFkX1NDU0lfRGF0YSAgID0gIDAsCisgICBTQ1NJX1N0YXR1cyAgICAgID0gIDEsCisgICBUTUNfU3RhdHVzICAgICAgID0gIDIsCisgICBGSUZPX1N0YXR1cyAgICAgID0gIDMsCS8qIHRtYzE4YzUwL3RtYzE4YzMwIG9ubHkgKi8KKyAgIEludGVycnVwdF9Db25kICAgPSAgNCwJLyogdG1jMThjNTAvdG1jMThjMzAgb25seSAqLworICAgTFNCX0lEX0NvZGUgICAgICA9ICA1LAorICAgTVNCX0lEX0NvZGUgICAgICA9ICA2LAorICAgUmVhZF9Mb29wYmFjayAgICA9ICA3LAorICAgU0NTSV9EYXRhX05vQUNLICA9ICA4LAorICAgSW50ZXJydXB0X1N0YXR1cyA9ICA5LAorICAgQ29uZmlndXJhdGlvbjEgICA9IDEwLAorICAgQ29uZmlndXJhdGlvbjIgICA9IDExLAkvKiB0bWMxOGM1MC90bWMxOGMzMCBvbmx5ICovCisgICBSZWFkX0ZJRk8gICAgICAgID0gMTIsCisgICBGSUZPX0RhdGFfQ291bnQgID0gMTQKK307CisKK2VudW0gb3V0X3BvcnRfdHlwZSB7CisgICBXcml0ZV9TQ1NJX0RhdGEgID0gIDAsCisgICBTQ1NJX0NudGwgICAgICAgID0gIDEsCisgICBJbnRlcnJ1cHRfQ250bCAgID0gIDIsCisgICBTQ1NJX01vZGVfQ250bCAgID0gIDMsCisgICBUTUNfQ250bCAgICAgICAgID0gIDQsCisgICBNZW1vcnlfQ250bCAgICAgID0gIDUsCS8qIHRtYzE4YzUwL3RtYzE4YzMwIG9ubHkgKi8KKyAgIFdyaXRlX0xvb3BiYWNrICAgPSAgNywKKyAgIElPX0NvbnRyb2wgICAgICAgPSAxMSwJLyogdG1jMThjMzAgb25seSAqLworICAgV3JpdGVfRklGTyAgICAgICA9IDEyCit9OworCisvKiAuYnNzIHdpbGwgemVybyBhbGwgdGhlIHN0YXRpYyB2YXJpYWJsZXMgYmVsb3cgKi8KK3N0YXRpYyBpbnQgICAgICAgICAgICAgICBwb3J0X2Jhc2U7CitzdGF0aWMgdW5zaWduZWQgbG9uZyAgICAgYmlvc19iYXNlOworc3RhdGljIHZvaWQgX19pb21lbSAqICAgIGJpb3NfbWVtOworc3RhdGljIGludCAgICAgICAgICAgICAgIGJpb3NfbWFqb3I7CitzdGF0aWMgaW50ICAgICAgICAgICAgICAgYmlvc19taW5vcjsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgICBQQ0lfYnVzOworc3RhdGljIGludCAgICAgICAgICAgICAgIFF1YW50dW07CS8qIFF1YW50dW0gYm9hcmQgdmFyaWFudCAqLworc3RhdGljIGludCAgICAgICAgICAgICAgIGludGVycnVwdF9sZXZlbDsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgICAgICBpbl9jb21tYW5kOworc3RhdGljIHN0cnVjdCBzY3NpX2NtbmQgICpjdXJyZW50X1NDOworc3RhdGljIGVudW0gY2hpcF90eXBlICAgIGNoaXAgICAgICAgICAgICAgID0gdW5rbm93bjsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgICBhZGFwdGVyX21hc2s7CitzdGF0aWMgaW50ICAgICAgICAgICAgICAgdGhpc19pZDsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgICBzZXR1cF9jYWxsZWQ7CisKKyNpZiBERUJVR19SQUNFCitzdGF0aWMgdm9sYXRpbGUgaW50ICAgICAgaW5faW50ZXJydXB0X2ZsYWc7CisjZW5kaWYKKworc3RhdGljIGludCAgICAgICAgICAgICAgIEZJRk9fU2l6ZSA9IDB4MjAwMDsgLyogOGsgRklGTyBmb3IKKwkJCQkJCXByZS10bWMxOGMzMCBjaGlwcyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgICAgICAgZG9fZmRvbWFpbl8xNngwX2ludHIoIGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJICAgIHN0cnVjdCBwdF9yZWdzICogcmVncyApOworLyogQWxsb3cgaW5zbW9kIHBhcmFtZXRlcnMgdG8gYmUgbGlrZSBMSUxPIHBhcmFtZXRlcnMuICBGb3IgZXhhbXBsZToKKyAgIGluc21vZCBmZG9tYWluIGZkb21haW49MHgxNDAsMTEgKi8KK3N0YXRpYyBjaGFyICogZmRvbWFpbiA9IE5VTEw7Cittb2R1bGVfcGFyYW0oZmRvbWFpbiwgY2hhcnAsIDApOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhZGRyZXNzZXNbXSA9IHsKKyAgIDB4YzgwMDAsCisgICAweGNhMDAwLAorICAgMHhjZTAwMCwKKyAgIDB4ZGUwMDAsCisgICAweGNjMDAwLAkJLyogRXh0cmEgYWRkcmVzc2VzIGZvciBQQ0kgYm9hcmRzICovCisgICAweGQwMDAwLAorICAgMHhlMDAwMCwKK307CisjZGVmaW5lIEFERFJFU1NfQ09VTlQgKHNpemVvZiggYWRkcmVzc2VzICkgLyBzaXplb2YoIHVuc2lnbmVkICkpCisJCSAgICAgICAKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwb3J0c1tdID0geyAweDE0MCwgMHgxNTAsIDB4MTYwLCAweDE3MCB9OworI2RlZmluZSBQT1JUX0NPVU5UIChzaXplb2YoIHBvcnRzICkgLyBzaXplb2YoIHVuc2lnbmVkIHNob3J0ICkpCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbnRzW10gPSB7IDMsIDUsIDEwLCAxMSwgMTIsIDE0LCAxNSwgMCB9OworCisvKgorCisgIFJFQUQgVEhJUyBCRUZPUkUgWU9VIEFERCBBIFNJR05BVFVSRSEKKworICBSRUFESU5HIFRISVMgU0hPUlQgTk9URSBDQU4gU0FWRSBZT1UgTE9UUyBPRiBUSU1FIQorCisgIFJFQUQgRVZFUlkgV09SRCwgRVNQRUNJQUxMWSBUSEUgV09SRCAqTk9UKgorCisgIFRoaXMgZHJpdmVyIHdvcmtzICpPTkxZKiBmb3IgRnV0dXJlIERvbWFpbiBjYXJkcyB1c2luZyB0aGUgVE1DLTE4MDAsCisgIFRNQy0xOEM1MCwgb3IgVE1DLTE4QzMwIGNoaXAuICBUaGlzIGluY2x1ZGVzIG1vZGVscyBUTUMtMTY1MCwgMTY2MCwgMTY3MCwKKyAgYW5kIDE2ODAuICBUaGVzZSBhcmUgYWxsIDE2LWJpdCBjYXJkcy4KKworICBUaGUgZm9sbG93aW5nIEJJT1Mgc2lnbmF0dXJlIHNpZ25hdHVyZXMgYXJlIGZvciBib2FyZHMgd2hpY2ggZG8gKk5PVCoKKyAgd29yayB3aXRoIHRoaXMgZHJpdmVyICh0aGVzZSBUTUMtOHh4IGFuZCBUTUMtOXh4IGJvYXJkcyBtYXkgd29yayB3aXRoIHRoZQorICBTZWFnYXRlIGRyaXZlcik6CisKKyAgRlVUVVJFIERPTUFJTiBDT1JQLiAoQykgMTk4Ni0xOTg4IFY0LjBJIDAzLzE2Lzg4CisgIEZVVFVSRSBET01BSU4gQ09SUC4gKEMpIDE5ODYtMTk4OSBWNS4wQzIvMTQvODkKKyAgRlVUVVJFIERPTUFJTiBDT1JQLiAoQykgMTk4Ni0xOTg5IFY2LjBBNy8yOC84OQorICBGVVRVUkUgRE9NQUlOIENPUlAuIChDKSAxOTg2LTE5OTAgVjYuMDEwNS8zMS85MAorICBGVVRVUkUgRE9NQUlOIENPUlAuIChDKSAxOTg2LTE5OTAgVjYuMDIwOS8xOC85MAorICBGVVRVUkUgRE9NQUlOIENPUlAuIChDKSAxOTg2LTE5OTAgVjcuMDA5LzE4LzkwCisgIEZVVFVSRSBET01BSU4gQ09SUC4gKEMpIDE5OTIgVjguMDAuMDA0LzAyLzkyCisKKyAgKFRoZSBjYXJkcyB3aGljaCBkbyAqTk9UKiB3b3JrIGFyZSBhbGwgOC1iaXQgY2FyZHMgLS0gYWx0aG91Z2ggc29tZSBvZgorICB0aGVtIGhhdmUgYSAxNi1iaXQgZm9ybS1mYWN0b3IsIHRoZSB1cHBlciA4LWJpdHMgYXJlIHVzZWQgb25seSBmb3IgSVJRcworICBhbmQgYXJlICpOT1QqIHVzZWQgZm9yIGRhdGEuICBZb3UgY2FuIHRlbGwgdGhlIGRpZmZlcmVuY2UgYnkgZm9sbG93aW5nCisgIHRoZSB0cmFjaW5ncyBvbiB0aGUgY2lyY3VpdCBib2FyZCAtLSBpZiBvbmx5IHRoZSBJUlEgbGluZXMgYXJlIGludm9sdmVkLAorICB5b3UgaGF2ZSBhICI4LWJpdCIgY2FyZCwgYW5kIHNob3VsZCAqTk9UKiB1c2UgdGhpcyBkcml2ZXIuKQorCisqLworCitzdGF0aWMgc3RydWN0IHNpZ25hdHVyZSB7CisgICBjb25zdCBjaGFyICpzaWduYXR1cmU7CisgICBpbnQgIHNpZ19vZmZzZXQ7CisgICBpbnQgIHNpZ19sZW5ndGg7CisgICBpbnQgIG1ham9yX2Jpb3NfdmVyc2lvbjsKKyAgIGludCAgbWlub3JfYmlvc192ZXJzaW9uOworICAgaW50ICBmbGFnOyAvKiAxID09IFBDSV9idXMsIDIgPT0gSVNBXzIwMFMsIDMgPT0gSVNBXzI1ME1HLCA0ID09IElTQV8yMDBTICovCit9IHNpZ25hdHVyZXNbXSA9IHsKKyAgIC8qICAgICAgICAgIDEgICAgICAgICAyICAgICAgICAgMyAgICAgICAgIDQgICAgICAgICA1ICAgICAgICAgNiAqLworICAgLyogMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwICovCisgICB7ICJGVVRVUkUgRE9NQUlOIENPUlAuIChDKSAxOTg2LTE5OTAgMTgwMC1WMi4wNy8yOC84OSIsICA1LCA1MCwgIDIsICAwLCAwIH0sCisgICB7ICJGVVRVUkUgRE9NQUlOIENPUlAuIChDKSAxOTg2LTE5OTAgMTgwMC1WMS4wNy8yOC84OSIsICA1LCA1MCwgIDIsICAwLCAwIH0sCisgICB7ICJGVVRVUkUgRE9NQUlOIENPUlAuIChDKSAxOTg2LTE5OTAgMTgwMC1WMi4wNy8yOC84OSIsIDcyLCA1MCwgIDIsICAwLCAyIH0sCisgICB7ICJGVVRVUkUgRE9NQUlOIENPUlAuIChDKSAxOTg2LTE5OTAgMTgwMC1WMi4wIiwgICAgICAgIDczLCA0MywgIDIsICAwLCAzIH0sCisgICB7ICJGVVRVUkUgRE9NQUlOIENPUlAuIChDKSAxOTkxIDE4MDAtVjIuMC4iLCAgICAgICAgICAgIDcyLCAzOSwgIDIsICAwLCA0IH0sCisgICB7ICJGVVRVUkUgRE9NQUlOIENPUlAuIChDKSAxOTkyIFYzLjAwLjAwNC8wMi85MiIsICAgICAgICA1LCA0NCwgIDMsICAwLCAwIH0sCisgICB7ICJGVVRVUkUgRE9NQUlOIFRNQy0xOFhYIChDKSAxOTkzIFYzLjIwMy8xMi85MyIsICAgICAgICA1LCA0NCwgIDMsICAyLCAwIH0sCisgICB7ICJJQk0gRjEgUDIgQklPUyB2MS4wMTA0LzI5LzkzIiwgICAgICAgICAgICAgICAgICAgICAgICA1LCAyOCwgIDMsIC0xLCAwIH0sCisgICB7ICJGdXR1cmUgRG9tYWluIENvcnAuIFYxLjAwMDgvMTgvOTMiLCAgICAgICAgICAgICAgICAgICA1LCAzMywgIDMsICA0LCAwIH0sCisgICB7ICJGdXR1cmUgRG9tYWluIENvcnAuIFYxLjAwMDgvMTgvOTMiLCAgICAgICAgICAgICAgICAgIDI2LCAzMywgIDMsICA0LCAxIH0sCisgICB7ICJBZGFwdGVjIEFIQS0yOTIwIFBDSS1TQ1NJIENhcmQiLCAgICAgICAgICAgICAgICAgICAgIDQyLCAzMSwgIDMsIC0xLCAxIH0sCisgICB7ICJJQk0gRjEgUDI2NC8zMiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAxNCwgIDMsIC0xLCAxIH0sCisJCQkJLyogVGhpcyBuZXh0IHNpZ25hdHVyZSBtYXkgbm90IGJlIGEgMy41IGJpb3MgKi8KKyAgIHsgIkZ1dHVyZSBEb21haW4gQ29ycC4gVjIuMDEwOC8xOC85MyIsICAgICAgICAgICAgICAgICAgIDUsIDMzLCAgMywgIDUsIDAgfSwKKyAgIHsgIkZVVFVSRSBET01BSU4gQ09SUC4gIFYzLjUwMDgvMTgvOTMiLCAgICAgICAgICAgICAgICAgIDUsIDM0LCAgMywgIDUsIDAgfSwKKyAgIHsgIkZVVFVSRSBET01BSU4gMThjMzAvMThjNTAvMTgwMCAoQykgMTk5NCBWMy41IiwgICAgICAgIDUsIDQ0LCAgMywgIDUsIDAgfSwKKyAgIHsgIkZVVFVSRSBET01BSU4gQ09SUC4gIFYzLjYwMDgvMTgvOTMiLCAgICAgICAgICAgICAgICAgIDUsIDM0LCAgMywgIDYsIDAgfSwKKyAgIHsgIkZVVFVSRSBET01BSU4gQ09SUC4gIFYzLjYxMDgvMTgvOTMiLCAgICAgICAgICAgICAgICAgIDUsIDM0LCAgMywgIDYsIDAgfSwKKyAgIHsgIkZVVFVSRSBET01BSU4gVE1DLTE4WFgiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDIyLCAtMSwgLTEsIDAgfSwKKworICAgLyogUkVBRCBOT1RJQ0UgQUJPVkUgKkJFRk9SRSogWU9VIFdBU1RFIFlPVVIgVElNRSBBRERJTkcgQSBTSUdOQVRVUkUKKyAgICBBbHNvLCBmaXggdGhlIGRpc2sgZ2VvbWV0cnkgY29kZSBmb3IgeW91ciBzaWduYXR1cmUgYW5kIHNlbmQgeW91cgorICAgIGNoYW5nZXMgZm9yIGZhaXRoQGNzLnVuYy5lZHUuICBBYm92ZSBhbGwsIGRvICpOT1QqIGNoYW5nZSBhbnkgb2xkCisgICAgc2lnbmF0dXJlcyEKKworICAgIE5vdGUgdGhhdCB0aGUgbGFzdCBsaW5lIHdpbGwgbWF0Y2ggYSAiZ2VuZXJpYyIgMThYWCBiaW9zLiAgQmVjYXVzZQorICAgIEZ1dHVyZSBEb21haW4gaGFzIGNoYW5nZWQgdGhlIGhvc3QgU0NTSSBJRCBhbmQvb3IgdGhlIGxvY2F0aW9uIG9mIHRoZQorICAgIGdlb21ldHJ5IGluZm9ybWF0aW9uIGluIHRoZSBvbi1ib2FyZCBSQU0gYXJlYSBmb3IgZWFjaCBvZiB0aGUgZmlyc3QKKyAgICB0aHJlZSBCSU9TJ3MsIGl0IGlzIHN0aWxsIGltcG9ydGFudCB0byBlbnRlciBhIGZ1bGx5IHF1YWxpZmllZAorICAgIHNpZ25hdHVyZSBpbiB0aGUgdGFibGUgZm9yIGFueSBuZXcgQklPUydzIChhZnRlciB0aGUgaG9zdCBTQ1NJIElEIGFuZAorICAgIGdlb21ldHJ5IGxvY2F0aW9uIGFyZSB2ZXJpZmllZCkuICovCit9OworCisjZGVmaW5lIFNJR05BVFVSRV9DT1VOVCAoc2l6ZW9mKCBzaWduYXR1cmVzICkgLyBzaXplb2YoIHN0cnVjdCBzaWduYXR1cmUgKSkKKworc3RhdGljIHZvaWQgcHJpbnRfYmFubmVyKCBzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCApCit7CisgICBpZiAoIXNocG50KSByZXR1cm47CQkvKiBUaGlzIHdvbid0IGV2ZXIgaGFwcGVuICovCisKKyAgIGlmIChiaW9zX21ham9yIDwgMCAmJiBiaW9zX21pbm9yIDwgMCkgeworICAgICAgcHJpbnRrKEtFUk5fSU5GTyAic2NzaSVkOiA8ZmRvbWFpbj4gTm8gQklPUzsgdXNpbmcgc2NzaSBpZCAlZFxuIiwKKwkgICAgICBzaHBudC0+aG9zdF9ubywgc2hwbnQtPnRoaXNfaWQpOworICAgfSBlbHNlIHsKKyAgICAgIHByaW50ayhLRVJOX0lORk8gInNjc2klZDogPGZkb21haW4+IEJJT1MgdmVyc2lvbiAiLCBzaHBudC0+aG9zdF9ubyk7CisKKyAgICAgIGlmIChiaW9zX21ham9yID49IDApIHByaW50aygiJWQuIiwgYmlvc19tYWpvcik7CisgICAgICBlbHNlICAgICAgICAgICAgICAgICBwcmludGsoIj8uIik7CisKKyAgICAgIGlmIChiaW9zX21pbm9yID49IDApIHByaW50aygiJWQiLCBiaW9zX21pbm9yKTsKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgIHByaW50aygiPy4iKTsKKyAgIAorICAgICAgcHJpbnRrKCAiIGF0IDB4JWx4IHVzaW5nIHNjc2kgaWQgJWRcbiIsCisJICAgICAgYmlvc19iYXNlLCBzaHBudC0+dGhpc19pZCApOworICAgfQorCisJCQkJLyogSWYgdGhpcyBkcml2ZXIgd29ya3MgZm9yIGxhdGVyIEZEIFBDSQorCQkJCSAgIGJvYXJkcywgd2Ugd2lsbCBoYXZlIHRvIG1vZGlmeSBiYW5uZXIKKwkJCQkgICBmb3IgYWRkaXRpb25hbCBQQ0kgY2FyZHMsIGJ1dCBmb3Igbm93IGlmCisJCQkJICAgaXQncyBQQ0kgaXQncyBhIFRNQy0zMjYwIC0gSlRNICovCisgICBwcmludGsoS0VSTl9JTkZPICJzY3NpJWQ6IDxmZG9tYWluPiAlcyBjaGlwIGF0IDB4JXggaXJxICIsCisJICAgc2hwbnQtPmhvc3Rfbm8sCisJICAgY2hpcCA9PSB0bWMxODAwID8gIlRNQy0xODAwIiA6IChjaGlwID09IHRtYzE4YzUwID8gIlRNQy0xOEM1MCIgOiAoY2hpcCA9PSB0bWMxOGMzMCA/IChQQ0lfYnVzID8gIlRNQy0zNkM3MCAoUENJIGJ1cykiIDogIlRNQy0xOEMzMCIpIDogIlVua25vd24iKSksCisJICAgcG9ydF9iYXNlKTsKKworICAgaWYgKGludGVycnVwdF9sZXZlbCkKKyAgIAlwcmludGsoIiVkIiwgaW50ZXJydXB0X2xldmVsKTsKKyAgIGVsc2UKKyAgICAgICAgcHJpbnRrKCI8bm9uZT4iKTsKKworICAgcHJpbnRrKCAiXG4iICk7Cit9CisKK2ludCBmZG9tYWluX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgaW50c1s0XTsKKworCSh2b2lkKWdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisKKwlpZiAoc2V0dXBfY2FsbGVkKysgfHwgaW50c1swXSA8IDIgfHwgaW50c1swXSA+IDMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaTogPGZkb21haW4+IFVzYWdlOiBmZG9tYWluPTxQT1JUX0JBU0U+LDxJUlE+Wyw8QURBUFRFUl9JRD5dXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpOiA8ZmRvbWFpbj4gQmFkIExJTE8vSU5TTU9EIHBhcmFtZXRlcnM/XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcG9ydF9iYXNlICAgICAgID0gaW50c1swXSA+PSAxID8gaW50c1sxXSA6IDA7CisJaW50ZXJydXB0X2xldmVsID0gaW50c1swXSA+PSAyID8gaW50c1syXSA6IDA7CisJdGhpc19pZCAgICAgICAgID0gaW50c1swXSA+PSAzID8gaW50c1szXSA6IDA7CisgICAKKwliaW9zX21ham9yID0gYmlvc19taW5vciA9IC0xOyAvKiBVc2UgZ2VvbWV0cnkgZm9yIEJJT1MgdmVyc2lvbiA+PSAzLjQgKi8KKwkrK3NldHVwX2NhbGxlZDsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiZmRvbWFpbj0iLCBmZG9tYWluX3NldHVwKTsKKworCitzdGF0aWMgdm9pZCBkb19wYXVzZSh1bnNpZ25lZCBhbW91bnQpCS8qIFBhdXNlIGZvciBhbW91bnQqMTAgbWlsbGlzZWNvbmRzICovCit7CisJbWRlbGF5KDEwKmFtb3VudCk7Cit9CisKK2lubGluZSBzdGF0aWMgdm9pZCBmZG9tYWluX21ha2VfYnVzX2lkbGUoIHZvaWQgKQoreworICAgb3V0YigwLCBwb3J0X2Jhc2UgKyBTQ1NJX0NudGwpOworICAgb3V0YigwLCBwb3J0X2Jhc2UgKyBTQ1NJX01vZGVfQ250bCk7CisgICBpZiAoY2hpcCA9PSB0bWMxOGM1MCB8fCBjaGlwID09IHRtYzE4YzMwKQorCSBvdXRiKDB4MjEgfCBQQVJJVFlfTUFTSywgcG9ydF9iYXNlICsgVE1DX0NudGwpOyAvKiBDbGVhciBmb3JjZWQgaW50ci4gKi8KKyAgIGVsc2UKKwkgb3V0YigweDAxIHwgUEFSSVRZX01BU0ssIHBvcnRfYmFzZSArIFRNQ19DbnRsKTsKK30KKworc3RhdGljIGludCBmZG9tYWluX2lzX3ZhbGlkX3BvcnQoIGludCBwb3J0ICkKK3sKKyNpZiBERUJVR19ERVRFQ1QgCisgICBwcmludGsoICIgKCV4JXgpLCIsCisJICAgaW5iKCBwb3J0ICsgTVNCX0lEX0NvZGUgKSwgaW5iKCBwb3J0ICsgTFNCX0lEX0NvZGUgKSApOworI2VuZGlmCisKKyAgIC8qIFRoZSBNQ0EgSUQgaXMgYSB1bmlxdWUgaWQgZm9yIGVhY2ggTUNBIGNvbXBhdGlibGUgYm9hcmQuICBXZQorICAgICAgYXJlIHVzaW5nIElTQSBib2FyZHMsIGJ1dCBGdXR1cmUgRG9tYWluIHByb3ZpZGVzIHRoZSBNQ0EgSUQKKyAgICAgIGFueXdheS4gIFdlIGNhbiB1c2UgdGhpcyBJRCB0byBlbnN1cmUgdGhhdCB0aGlzIGlzIGEgRnV0dXJlCisgICAgICBEb21haW4gVE1DLTE2NjAvVE1DLTE2ODAuCisgICAgKi8KKworICAgaWYgKGluYiggcG9ydCArIExTQl9JRF9Db2RlICkgIT0gMHhlOSkgeyAvKiB0ZXN0IGZvciAweDYxMjcgaWQgKi8KKyAgICAgIGlmIChpbmIoIHBvcnQgKyBMU0JfSURfQ29kZSApICE9IDB4MjcpIHJldHVybiAwOworICAgICAgaWYgKGluYiggcG9ydCArIE1TQl9JRF9Db2RlICkgIT0gMHg2MSkgcmV0dXJuIDA7CisgICAgICBjaGlwID0gdG1jMTgwMDsKKyAgIH0gZWxzZSB7CQkJCSAgICAvKiB0ZXN0IGZvciAweGU5NjAgaWQgKi8KKyAgICAgIGlmIChpbmIoIHBvcnQgKyBNU0JfSURfQ29kZSApICE9IDB4NjApIHJldHVybiAwOworICAgICAgY2hpcCA9IHRtYzE4YzUwOworCisJCQkJLyogVHJ5IHRvIHRvZ2dsZSAzMi1iaXQgbW9kZS4gIFRoaXMgb25seQorCQkJCSAgIHdvcmtzIG9uIGFuIDE4YzMwIGNoaXAuICAoVXNlciByZXBvcnRzCisJCQkJICAgc2F5IHRoaXMgd29ya3MsIHNvIHdlIHNob3VsZCBzd2l0Y2ggdG8KKwkJCQkgICBpdCBpbiB0aGUgbmVhciBmdXR1cmUuKSAqLworCisgICAgICBvdXRiKCAweDgwLCBwb3J0ICsgSU9fQ29udHJvbCApOworICAgICAgaWYgKChpbmIoIHBvcnQgKyBDb25maWd1cmF0aW9uMiApICYgMHg4MCkgPT0gMHg4MCkgeworCSBvdXRiKCAweDAwLCBwb3J0ICsgSU9fQ29udHJvbCApOworCSBpZiAoKGluYiggcG9ydCArIENvbmZpZ3VyYXRpb24yICkgJiAweDgwKSA9PSAweDAwKSB7CisJICAgIGNoaXAgPSB0bWMxOGMzMDsKKwkgICAgRklGT19TaXplID0gMHg4MDA7CS8qIDJrIEZJRk8gKi8KKwkgfQorICAgICAgfQorCQkJCS8qIElmIHRoYXQgZmFpbGVkLCB3ZSBhcmUgYW4gMThjNTAuICovCisgICB9CisKKyAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGZkb21haW5fdGVzdF9sb29wYmFjayggdm9pZCApCit7CisgICBpbnQgaTsKKyAgIGludCByZXN1bHQ7CisKKyAgIGZvciAoaSA9IDA7IGkgPCAyNTU7IGkrKykgeworICAgICAgb3V0YiggaSwgcG9ydF9iYXNlICsgV3JpdGVfTG9vcGJhY2sgKTsKKyAgICAgIHJlc3VsdCA9IGluYiggcG9ydF9iYXNlICsgUmVhZF9Mb29wYmFjayApOworICAgICAgaWYgKGkgIT0gcmVzdWx0KQorCSAgICByZXR1cm4gMTsKKyAgIH0KKyAgIHJldHVybiAwOworfQorCisvKiBmZG9tYWluX2dldF9pcnEgYXNzdW1lcyB0aGF0IHdlIGhhdmUgYSB2YWxpZCBNQ0EgSUQgZm9yIGEKKyAgIFRNQy0xNjYwL1RNQy0xNjgwIEZ1dHVyZSBEb21haW4gYm9hcmQuICBOb3csIGNoZWNrIHRvIGJlIHN1cmUgdGhlCisgICBiaW9zX2Jhc2UgbWF0Y2hlcyB0aGVzZSBwb3J0cy4gIElmIHNvbWVvbmUgd2FzIHVubHVja3kgZW5vdWdoIHRvIGhhdmUKKyAgIHB1cmNoYXNlZCBtb3JlIHRoYW4gb25lIEZ1dHVyZSBEb21haW4gYm9hcmQsIHRoZW4gdGhleSB3aWxsIGhhdmUgdG8KKyAgIG1vZGlmeSB0aGlzIGNvZGUsIGFzIHdlIG9ubHkgZGV0ZWN0IG9uZSBib2FyZCBoZXJlLiAgW1RoZSBvbmUgd2l0aCB0aGUKKyAgIGxvd2VzdCBiaW9zX2Jhc2UuXQorCisgICBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIGlzIG9ubHkgdXNlZCBmb3Igc3lzdGVtcyB3aXRob3V0IGEgUENJIEJJT1MzMgorICAgKGUuZy4sIElTQSBidXMpLiAgRm9yIFBDSSBidXMgc3lzdGVtcywgdGhpcyByb3V0aW5lIHdpbGwgbGlrZWx5IGZhaWwKKyAgIHVubGVzcyBvbmUgb2YgdGhlIElSUXMgbGlzdGVkIGluIHRoZSBpbnRzIGFycmF5IGlzIHVzZWQgYnkgdGhlIGJvYXJkLgorICAgU29tZXRpbWVzIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSB0aGUgY29tcHV0ZXIncyBCSU9TIHNldHVwIHNjcmVlbiB0bworICAgY29uZmlndXJlIGEgUENJIHN5c3RlbSBzbyB0aGF0IG9uZSBvZiB0aGVzZSBJUlFzIHdpbGwgYmUgdXNlZCBieSB0aGUKKyAgIEZ1dHVyZSBEb21haW4gY2FyZC4gKi8KKworc3RhdGljIGludCBmZG9tYWluX2dldF9pcnEoIGludCBiYXNlICkKK3sKKyAgIGludCBvcHRpb25zID0gaW5iKGJhc2UgKyBDb25maWd1cmF0aW9uMSk7CisKKyNpZiBERUJVR19ERVRFQ1QKKyAgIHByaW50aygic2NzaTogPGZkb21haW4+IE9wdGlvbnMgPSAleFxuIiwgb3B0aW9ucyk7CisjZW5kaWYKKyAKKyAgIC8qIENoZWNrIGZvciBib2FyZCB3aXRoIGxvd2VzdCBiaW9zX2Jhc2UgLS0KKyAgICAgIHRoaXMgaXNuJ3QgdmFsaWQgZm9yIHRoZSAxOGMzMCBvciBmb3IKKyAgICAgIGJvYXJkcyBvbiB0aGUgUENJIGJ1cywgc28ganVzdCBhc3N1bWUgd2UKKyAgICAgIGhhdmUgdGhlIHJpZ2h0IGJvYXJkLiAqLworCisgICBpZiAoY2hpcCAhPSB0bWMxOGMzMCAmJiAhUENJX2J1cyAmJiBhZGRyZXNzZXNbKG9wdGlvbnMgJiAweGMwKSA+PiA2IF0gIT0gYmlvc19iYXNlKQorICAgCXJldHVybiAwOworICAgcmV0dXJuIGludHNbKG9wdGlvbnMgJiAweDBlKSA+PiAxXTsKK30KKworc3RhdGljIGludCBmZG9tYWluX2lzYV9kZXRlY3QoIGludCAqaXJxLCBpbnQgKmlvYmFzZSApCit7CisjaWZuZGVmIFBDTUNJQQorICAgaW50IGksIGo7CisgICBpbnQgYmFzZSA9IDB4ZGVhZGJlZWY7CisgICBpbnQgZmxhZyA9IDA7CisKKyNpZiBERUJVR19ERVRFQ1QKKyAgIHByaW50ayggInNjc2k6IDxmZG9tYWluPiBmZG9tYWluX2lzYV9kZXRlY3Q6IiApOworI2VuZGlmCisKKyAgIGZvciAoaSA9IDA7IGkgPCBBRERSRVNTX0NPVU5UOyBpKyspIHsKKyAgICAgIHZvaWQgX19pb21lbSAqcCA9IGlvcmVtYXAoYWRkcmVzc2VzW2ldLCAweDIwMDApOworICAgICAgaWYgKCFwKQorCWNvbnRpbnVlOworI2lmIERFQlVHX0RFVEVDVAorICAgICAgcHJpbnRrKCAiICVseCglbHgpLCIsIGFkZHJlc3Nlc1tpXSwgYmlvc19iYXNlICk7CisjZW5kaWYKKyAgICAgIGZvciAoaiA9IDA7IGogPCBTSUdOQVRVUkVfQ09VTlQ7IGorKykgeworCSBpZiAoY2hlY2tfc2lnbmF0dXJlKHAgKyBzaWduYXR1cmVzW2pdLnNpZ19vZmZzZXQsCisJCQkgICAgIHNpZ25hdHVyZXNbal0uc2lnbmF0dXJlLAorCQkJICAgICBzaWduYXR1cmVzW2pdLnNpZ19sZW5ndGggKSkgeworCSAgICBiaW9zX21ham9yID0gc2lnbmF0dXJlc1tqXS5tYWpvcl9iaW9zX3ZlcnNpb247CisJICAgIGJpb3NfbWlub3IgPSBzaWduYXR1cmVzW2pdLm1pbm9yX2Jpb3NfdmVyc2lvbjsKKwkgICAgUENJX2J1cyAgICA9IChzaWduYXR1cmVzW2pdLmZsYWcgPT0gMSk7CisJICAgIFF1YW50dW0gICAgPSAoc2lnbmF0dXJlc1tqXS5mbGFnID4gMSkgPyBzaWduYXR1cmVzW2pdLmZsYWcgOiAwOworCSAgICBiaW9zX2Jhc2UgID0gYWRkcmVzc2VzW2ldOworCSAgICBiaW9zX21lbSAgID0gcDsKKwkgICAgZ290byBmb3VuZDsKKwkgfQorICAgICAgfQorICAgICAgaW91bm1hcChwKTsKKyAgIH0KKyAKK2ZvdW5kOgorICAgaWYgKGJpb3NfbWFqb3IgPT0gMikgeworICAgICAgLyogVGhlIFRNQy0xNjYwL1RNQy0xNjgwIGhhcyBhIFJBTSBhcmVhIGp1c3QgYWZ0ZXIgdGhlIEJJT1MgUk9NLgorCSBBc3N1bWluZyB0aGUgUk9NIGlzIGVuYWJsZWQgKG90aGVyd2lzZSB3ZSB3b3VsZG4ndCBoYXZlIGJlZW4KKwkgYWJsZSB0byByZWFkIHRoZSBST00gc2lnbmF0dXJlIDotKSwgdGhlbiB0aGUgUk9NIHNldHMgdXAgdGhlCisJIFJBTSBhcmVhIHdpdGggc29tZSBtYWdpYyBudW1iZXJzLCBzdWNoIGFzIGEgbGlzdCBvZiBwb3J0CisJIGJhc2UgYWRkcmVzc2VzIGFuZCBhIGxpc3Qgb2YgdGhlIGRpc2sgImdlb21ldHJ5IiByZXBvcnRlZCB0bworCSBET1MgKHRoaXMgZ2VvbWV0cnkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBwaHlzaWNhbCBnZW9tZXRyeSkuCisgICAgICAgKi8KKworICAgICAgc3dpdGNoIChRdWFudHVtKSB7CisgICAgICBjYXNlIDI6CQkJLyogSVNBXzIwMFMgKi8KKyAgICAgIGNhc2UgMzoJCQkvKiBJU0FfMjUwTUcgKi8KKwkgYmFzZSA9IHJlYWRiKGJpb3NfbWVtICsgMHgxZmEyKSArIChyZWFkYihiaW9zX21lbSArIDB4MWZhMykgPDwgOCk7CisJIGJyZWFrOworICAgICAgY2FzZSA0OgkJCS8qIElTQV8yMDBTIChhbm90aGVyIG9uZSkgKi8KKwkgYmFzZSA9IHJlYWRiKGJpb3NfbWVtICsgMHgxZmEzKSArIChyZWFkYihiaW9zX21lbSArIDB4MWZhNCkgPDwgOCk7CisJIGJyZWFrOworICAgICAgZGVmYXVsdDoKKwkgYmFzZSA9IHJlYWRiKGJpb3NfbWVtICsgMHgxZmNjKSArIChyZWFkYihiaW9zX21lbSArIDB4MWZjZCkgPDwgOCk7CisJIGJyZWFrOworICAgICAgfQorICAgCisjaWYgREVCVUdfREVURUNUCisgICAgICBwcmludGsoICIgJXgsIiwgYmFzZSApOworI2VuZGlmCisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBQT1JUX0NPVU5UOyBpKyspIHsKKwlpZiAoYmFzZSA9PSBwb3J0c1tpXSkgeworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGJhc2UsIDB4MTAsICJmZG9tYWluIikpCisJCQlicmVhazsKKwkJaWYgKCFmZG9tYWluX2lzX3ZhbGlkX3BvcnQoYmFzZSkpIHsKKwkJCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDB4MTApOworCQkJYnJlYWs7CisJCX0KKwkJKmlycSAgICA9IGZkb21haW5fZ2V0X2lycSggYmFzZSApOworCQkqaW9iYXNlID0gYmFzZTsKKwkJcmV0dXJuIDE7CisJfQorICAgICAgfQorCisgICAgICAvKiBUaGlzIGlzIGEgYmFkIHNpZ24uICBJdCB1c3VhbGx5IG1lYW5zIHRoYXQgc29tZW9uZSBwYXRjaGVkIHRoZQorCSBCSU9TIHNpZ25hdHVyZSBsaXN0ICh0aGUgc2lnbmF0dXJlcyB2YXJpYWJsZSkgdG8gY29udGFpbiBhIEJJT1MKKwkgc2lnbmF0dXJlIGZvciBhIGJvYXJkICpPVEhFUiBUSEFOKiB0aGUgVE1DLTE2NjAvVE1DLTE2ODAuICovCisgICAgICAKKyNpZiBERUJVR19ERVRFQ1QKKyAgICAgIHByaW50ayggIiBSQU0gRkFJTEVELCAiICk7CisjZW5kaWYKKyAgIH0KKworICAgLyogQW55d2F5LCB0aGUgYWx0ZXJuYXRpdmUgdG8gZmluZGluZyB0aGUgYWRkcmVzcyBpbiB0aGUgUkFNIGlzIHRvIGp1c3QKKyAgICAgIHNlYXJjaCB0aHJvdWdoIGV2ZXJ5IHBvc3NpYmxlIHBvcnQgYWRkcmVzcyBmb3Igb25lIHRoYXQgaXMgYXR0YWNoZWQKKyAgICAgIHRvIHRoZSBGdXR1cmUgRG9tYWluIGNhcmQuICBEb24ndCBwYW5pYywgdGhvdWdoLCBhYm91dCByZWFkaW5nIGFsbAorICAgICAgdGhlc2UgcmFuZG9tIHBvcnQgYWRkcmVzc2VzIC0tIHRoZXJlIGFyZSBydW1vcnMgdGhhdCB0aGUgRnV0dXJlCisgICAgICBEb21haW4gQklPUyBkb2VzIHNvbWV0aGluZyB2ZXJ5IHNpbWlsYXIuCisKKyAgICAgIERvIG5vdCwgaG93ZXZlciwgY2hlY2sgcG9ydHMgd2hpY2ggdGhlIGtlcm5lbCBrbm93cyBhcmUgYmVpbmcgdXNlZCBieQorICAgICAgYW5vdGhlciBkcml2ZXIuICovCisKKyAgIGZvciAoaSA9IDA7IGkgPCBQT1JUX0NPVU5UOyBpKyspIHsKKyAgICAgIGJhc2UgPSBwb3J0c1tpXTsKKyAgICAgIGlmICghcmVxdWVzdF9yZWdpb24oYmFzZSwgMHgxMCwgImZkb21haW4iKSkgeworI2lmIERFQlVHX0RFVEVDVAorCSBwcmludGsoICIgKCV4IGludXNlKSwiLCBiYXNlICk7CisjZW5kaWYKKwkgY29udGludWU7CisgICAgICB9CisjaWYgREVCVUdfREVURUNUCisgICAgICBwcmludGsoICIgJXgsIiwgYmFzZSApOworI2VuZGlmCisgICAgICBmbGFnID0gZmRvbWFpbl9pc192YWxpZF9wb3J0KGJhc2UpOworICAgICAgaWYgKGZsYWcpCisJYnJlYWs7CisgICAgICByZWxlYXNlX3JlZ2lvbihiYXNlLCAweDEwKTsKKyAgIH0KKworI2lmIERFQlVHX0RFVEVDVAorICAgaWYgKGZsYWcpIHByaW50ayggIiBTVUNDRVNTXG4iICk7CisgICBlbHNlICAgICAgcHJpbnRrKCAiIEZBSUxVUkVcbiIgKTsKKyNlbmRpZgorCisgICBpZiAoIWZsYWcpIHJldHVybiAwOwkJLyogaW9iYXNlIG5vdCBmb3VuZCAqLworCisgICAqaXJxICAgID0gZmRvbWFpbl9nZXRfaXJxKCBiYXNlICk7CisgICAqaW9iYXNlID0gYmFzZTsKKworICAgcmV0dXJuIDE7CQkJLyogc3VjY2VzcyAqLworI2Vsc2UKKyAgIHJldHVybiAwOworI2VuZGlmCit9CisKKy8qIFBDSSBkZXRlY3Rpb24gZnVuY3Rpb246IGludCBmZG9tYWluX3BjaV9iaW9zX2RldGVjdChpbnQqIGlycSwgaW50KgorICAgaW9iYXNlKSBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIEludGVycnVwdCBMZXZlbCBhbmQgSS9PIGJhc2UgYWRkcmVzcyBmcm9tCisgICB0aGUgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLiAqLworCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGludCBmZG9tYWluX3BjaV9iaW9zX2RldGVjdCggaW50ICppcnEsIGludCAqaW9iYXNlLCBzdHJ1Y3QgcGNpX2RldiAqKnJldF9wZGV2ICkKK3sKKyAgIHVuc2lnbmVkIGludCAgICAgcGNpX2lycTsgICAgICAgICAgICAgICAgLyogUENJIGludGVycnVwdCBsaW5lICovCisgICB1bnNpZ25lZCBsb25nICAgIHBjaV9iYXNlOyAgICAgICAgICAgICAgIC8qIFBDSSBJL08gYmFzZSBhZGRyZXNzICovCisgICBzdHJ1Y3QgcGNpX2RldiAgICpwZGV2ID0gTlVMTDsKKworI2lmIERFQlVHX0RFVEVDVAorICAgLyogVGVsbCBob3cgdG8gcHJpbnQgYSBsaXN0IG9mIHRoZSBrbm93biBQQ0kgZGV2aWNlcyBmcm9tIGJpb3MzMiBhbmQKKyAgICAgIGxpc3QgdmVuZG9yIGFuZCBkZXZpY2UgSURzIGJlaW5nIHVzZWQgaWYgaW4gZGVidWcgbW9kZS4gICovCisgICAgICAKKyAgIHByaW50ayggInNjc2k6IDxmZG9tYWluPiBJTkZPOiB1c2UgbHNwY2kgLXYgdG8gc2VlIGxpc3Qgb2YgUENJIGRldmljZXNcbiIgKTsKKyAgIHByaW50ayggInNjc2k6IDxmZG9tYWluPiBUTUMtMzI2MCBkZXRlY3Q6IgorCSAgICIgVXNpbmcgVmVuZG9yIElEOiAweCV4IGFuZCBEZXZpY2UgSUQ6IDB4JXhcbiIsCisJICAgUENJX1ZFTkRPUl9JRF9GRCwgCisJICAgUENJX0RFVklDRV9JRF9GRF8zNkM3MCApOworI2VuZGlmIAorCisgICBpZiAoKHBkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9GRCwgUENJX0RFVklDRV9JRF9GRF8zNkM3MCwgcGRldikpID09IE5VTEwpCisJCXJldHVybiAwOworICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSByZXR1cm4gMDsKKyAgICAgICAKKyNpZiBERUJVR19ERVRFQ1QKKyAgIHByaW50ayggInNjc2k6IDxmZG9tYWluPiBUTUMtMzI2MCBkZXRlY3Q6IgorCSAgICIgUENJIGJ1cyAldSwgZGV2aWNlICV1LCBmdW5jdGlvbiAldVxuIiwKKwkgICBwZGV2LT5idXMtPm51bWJlciwKKwkgICBQQ0lfU0xPVChwZGV2LT5kZXZmbiksCisJICAgUENJX0ZVTkMocGRldi0+ZGV2Zm4pKTsKKyNlbmRpZgorCisgICAvKiBXZSBub3cgaGF2ZSB0aGUgYXBwcm9wcmlhdGUgZGV2aWNlIGZ1bmN0aW9uIGZvciB0aGUgRkQgYm9hcmQgc28gd2UKKyAgICAgIGp1c3QgcmVhZCB0aGUgUENJIGNvbmZpZyBpbmZvIGZyb20gdGhlIHJlZ2lzdGVycy4gICovCisKKyAgIHBjaV9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworICAgcGNpX2lycSA9IHBkZXYtPmlycTsKKworICAgaWYgKCFyZXF1ZXN0X3JlZ2lvbiggcGNpX2Jhc2UsIDB4MTAsICJmZG9tYWluIiApKQorCXJldHVybiAwOworCisgICAvKiBOb3cgd2UgaGF2ZSB0aGUgSS9PIGJhc2UgYWRkcmVzcyBhbmQgaW50ZXJydXB0IGZyb20gdGhlIFBDSQorICAgICAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuICovCisKKyAgICppcnEgICAgPSBwY2lfaXJxOworICAgKmlvYmFzZSA9IHBjaV9iYXNlOworICAgKnJldF9wZGV2ID0gcGRldjsKKworI2lmIERFQlVHX0RFVEVDVAorICAgcHJpbnRrKCAic2NzaTogPGZkb21haW4+IFRNQy0zMjYwIGRldGVjdDoiCisJICAgIiBJUlEgPSAlZCwgSS9PIGJhc2UgPSAweCV4IFsweCVseF1cbiIsICppcnEsICppb2Jhc2UsIHBjaV9iYXNlICk7CisjZW5kaWYKKworICAgaWYgKCFmZG9tYWluX2lzX3ZhbGlkX3BvcnQocGNpX2Jhc2UpKSB7CisgICAgICBwcmludGsoS0VSTl9FUlIgInNjc2k6IDxmZG9tYWluPiBQQ0kgY2FyZCBkZXRlY3RlZCwgYnV0IGRyaXZlciBub3QgbG9hZGVkIChpbnZhbGlkIHBvcnQpXG4iICk7CisgICAgICByZWxlYXNlX3JlZ2lvbihwY2lfYmFzZSwgMHgxMCk7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKworCQkJCS8qIEZpbGwgaW4gYSBmZXcgZ2xvYmFsIHZhcmlhYmxlcy4gIFVnaC4gKi8KKyAgIGJpb3NfbWFqb3IgPSBiaW9zX21pbm9yID0gLTE7CisgICBQQ0lfYnVzICAgID0gMTsKKyAgIFF1YW50dW0gICAgPSAwOworICAgYmlvc19iYXNlICA9IDA7CisgICAKKyAgIHJldHVybiAxOworfQorI2VuZGlmCisKK3N0cnVjdCBTY3NpX0hvc3QgKl9fZmRvbWFpbl8xNngwX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0cG50ICkKK3sKKyAgIGludCAgICAgICAgICAgICAgcmV0Y29kZTsKKyAgIHN0cnVjdCBTY3NpX0hvc3QgKnNocG50OworICAgc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCisgICBpZiAoc2V0dXBfY2FsbGVkKSB7CisjaWYgREVCVUdfREVURUNUCisgICAgICBwcmludGsoICJzY3NpOiA8ZmRvbWFpbj4gTm8gQklPUywgdXNpbmcgcG9ydF9iYXNlID0gMHgleCwgaXJxID0gJWRcbiIsCisJICAgICAgcG9ydF9iYXNlLCBpbnRlcnJ1cHRfbGV2ZWwgKTsKKyNlbmRpZgorICAgICAgaWYgKCFyZXF1ZXN0X3JlZ2lvbihwb3J0X2Jhc2UsIDB4MTAsICJmZG9tYWluIikpIHsKKwkgcHJpbnRrKCAic2NzaTogPGZkb21haW4+IHBvcnQgMHgleCBpcyBidXN5XG4iLCBwb3J0X2Jhc2UgKTsKKwkgcHJpbnRrKCAic2NzaTogPGZkb21haW4+IEJhZCBMSUxPL0lOU01PRCBwYXJhbWV0ZXJzP1xuIiApOworCSByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGlmICghZmRvbWFpbl9pc192YWxpZF9wb3J0KCBwb3J0X2Jhc2UgKSkgeworCSBwcmludGsoICJzY3NpOiA8ZmRvbWFpbj4gQ2Fubm90IGxvY2F0ZSBjaGlwIGF0IHBvcnQgYmFzZSAweCV4XG4iLAorCQkgcG9ydF9iYXNlICk7CisJIHByaW50ayggInNjc2k6IDxmZG9tYWluPiBCYWQgTElMTy9JTlNNT0QgcGFyYW1ldGVycz9cbiIgKTsKKwkgcmVsZWFzZV9yZWdpb24ocG9ydF9iYXNlLCAweDEwKTsKKwkgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICB9IGVsc2UgeworICAgICAgaW50IGZsYWcgPSAwOworCisjaWZkZWYgQ09ORklHX1BDSQorCQkJCS8qIFRyeSBQQ0kgZGV0ZWN0aW9uIGZpcnN0ICovCisgICAgICBmbGFnID0gZmRvbWFpbl9wY2lfYmlvc19kZXRlY3QoICZpbnRlcnJ1cHRfbGV2ZWwsICZwb3J0X2Jhc2UsICZwZGV2ICk7CisjZW5kaWYKKyAgICAgIGlmICghZmxhZykgeworCQkJCS8qIFRoZW4gdHJ5IElTQSBidXMgZGV0ZWN0aW9uICovCisJIGZsYWcgPSBmZG9tYWluX2lzYV9kZXRlY3QoICZpbnRlcnJ1cHRfbGV2ZWwsICZwb3J0X2Jhc2UgKTsKKworCSBpZiAoIWZsYWcpIHsKKwkgICAgcHJpbnRrKCAic2NzaTogPGZkb21haW4+IERldGVjdGlvbiBmYWlsZWQgKG5vIGNhcmQpXG4iICk7CisJICAgIHJldHVybiBOVUxMOworCSB9CisgICAgICB9CisgICB9CisKKyAgIGZkb21haW5fMTZ4MF9idXNfcmVzZXQoTlVMTCk7CisKKyAgIGlmIChmZG9tYWluX3Rlc3RfbG9vcGJhY2soKSkgeworICAgICAgcHJpbnRrKEtFUk5fRVJSICAic2NzaTogPGZkb21haW4+IERldGVjdGlvbiBmYWlsZWQgKGxvb3BiYWNrIHRlc3QgZmFpbGVkIGF0IHBvcnQgYmFzZSAweCV4KVxuIiwgcG9ydF9iYXNlKTsKKyAgICAgIGlmIChzZXR1cF9jYWxsZWQpIHsKKwkgcHJpbnRrKEtFUk5fRVJSICJzY3NpOiA8ZmRvbWFpbj4gQmFkIExJTE8vSU5TTU9EIHBhcmFtZXRlcnM/XG4iKTsKKyAgICAgIH0KKyAgICAgIHJlbGVhc2VfcmVnaW9uKHBvcnRfYmFzZSwgMHgxMCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgaWYgKHRoaXNfaWQpIHsKKyAgICAgIHRwbnQtPnRoaXNfaWQgPSAodGhpc19pZCAmIDB4MDcpOworICAgICAgYWRhcHRlcl9tYXNrICA9ICgxIDw8IHRwbnQtPnRoaXNfaWQpOworICAgfSBlbHNlIHsKKyAgICAgIGlmIChQQ0lfYnVzIHx8IChiaW9zX21ham9yID09IDMgJiYgYmlvc19taW5vciA+PSAyKSB8fCBiaW9zX21ham9yIDwgMCkgeworCSB0cG50LT50aGlzX2lkID0gNzsKKwkgYWRhcHRlcl9tYXNrICA9IDB4ODA7CisgICAgICB9IGVsc2UgeworCSB0cG50LT50aGlzX2lkID0gNjsKKwkgYWRhcHRlcl9tYXNrICA9IDB4NDA7CisgICAgICB9CisgICB9CisKKy8qIFByaW50IG91dCBhIGJhbm5lciBoZXJlIGluIGNhc2Ugd2UgY2FuJ3QKKyAgIGdldCByZXNvdXJjZXMuICAqLworCisgICBzaHBudCA9IHNjc2lfcmVnaXN0ZXIoIHRwbnQsIDAgKTsKKyAgIGlmKHNocG50ID09IE5VTEwpIHsKKwlyZWxlYXNlX3JlZ2lvbihwb3J0X2Jhc2UsIDB4MTApOworICAgCXJldHVybiBOVUxMOworICAgfQorICAgc2hwbnQtPmlycSA9IGludGVycnVwdF9sZXZlbDsKKyAgIHNocG50LT5pb19wb3J0ID0gcG9ydF9iYXNlOworICAgc2NzaV9zZXRfZGV2aWNlKHNocG50LCAmcGRldi0+ZGV2KTsKKyAgIHNocG50LT5uX2lvX3BvcnQgPSAweDEwOworICAgcHJpbnRfYmFubmVyKCBzaHBudCApOworCisgICAvKiBMb2cgSVJRIHdpdGgga2VybmVsICovICAgCisgICBpZiAoIWludGVycnVwdF9sZXZlbCkgeworICAgICAgcHJpbnRrKEtFUk5fRVJSICJzY3NpOiA8ZmRvbWFpbj4gQ2FyZCBEZXRlY3RlZCwgYnV0IGRyaXZlciBub3QgbG9hZGVkIChubyBJUlEpXG4iICk7CisgICAgICByZWxlYXNlX3JlZ2lvbihwb3J0X2Jhc2UsIDB4MTApOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9IGVsc2UgeworICAgICAgLyogUmVnaXN0ZXIgdGhlIElSUSB3aXRoIHRoZSBrZXJuZWwgKi8KKworICAgICAgcmV0Y29kZSA9IHJlcXVlc3RfaXJxKCBpbnRlcnJ1cHRfbGV2ZWwsCisJCQkgICAgIGRvX2Zkb21haW5fMTZ4MF9pbnRyLCBwZGV2P1NBX1NISVJROjAsICJmZG9tYWluIiwgc2hwbnQpOworCisgICAgICBpZiAocmV0Y29kZSA8IDApIHsKKwkgaWYgKHJldGNvZGUgPT0gLUVJTlZBTCkgeworCSAgICBwcmludGsoS0VSTl9FUlIgInNjc2k6IDxmZG9tYWluPiBJUlEgJWQgaXMgYmFkIVxuIiwgaW50ZXJydXB0X2xldmVsICk7CisJICAgIHByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICAgIFRoaXMgc2hvdWxkbid0IGhhcHBlbiFcbiIgKTsKKwkgICAgcHJpbnRrKEtFUk5fRVJSICIgICAgICAgICAgICAgICAgU2VuZCBtYWlsIHRvIGZhaXRoQGFjbS5vcmdcbiIgKTsKKwkgfSBlbHNlIGlmIChyZXRjb2RlID09IC1FQlVTWSkgeworCSAgICBwcmludGsoS0VSTl9FUlIgInNjc2k6IDxmZG9tYWluPiBJUlEgJWQgaXMgYWxyZWFkeSBpbiB1c2UhXG4iLCBpbnRlcnJ1cHRfbGV2ZWwgKTsKKwkgICAgcHJpbnRrKEtFUk5fRVJSICIgICAgICAgICAgICAgICAgUGxlYXNlIHVzZSBhbm90aGVyIElSUSFcbiIgKTsKKwkgfSBlbHNlIHsKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJzY3NpOiA8ZmRvbWFpbj4gRXJyb3IgZ2V0dGluZyBJUlEgJWRcbiIsIGludGVycnVwdF9sZXZlbCApOworCSAgICBwcmludGsoS0VSTl9FUlIgIiAgICAgICAgICAgICAgICBUaGlzIHNob3VsZG4ndCBoYXBwZW4hXG4iICk7CisJICAgIHByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICAgIFNlbmQgbWFpbCB0byBmYWl0aEBhY20ub3JnXG4iICk7CisJIH0KKwkgcHJpbnRrKEtFUk5fRVJSICJzY3NpOiA8ZmRvbWFpbj4gRGV0ZWN0ZWQsIGJ1dCBkcml2ZXIgbm90IGxvYWRlZCAoSVJRKVxuIiApOworICAgICAgICAgcmVsZWFzZV9yZWdpb24ocG9ydF9iYXNlLCAweDEwKTsKKwkgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICB9CisgICByZXR1cm4gc2hwbnQ7Cit9CisKK3N0YXRpYyBpbnQgZmRvbWFpbl8xNngwX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0cG50KQoreworCWlmIChmZG9tYWluKQorCQlmZG9tYWluX3NldHVwKGZkb21haW4pOworCXJldHVybiAoX19mZG9tYWluXzE2eDBfZGV0ZWN0KHRwbnQpICE9IE5VTEwpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZmRvbWFpbl8xNngwX2luZm8oIHN0cnVjdCBTY3NpX0hvc3QgKmlnbm9yZSApCit7CisgICBzdGF0aWMgY2hhciBidWZmZXJbMTI4XTsKKyAgIGNoYXIgICAgICAgICpwdDsKKyAgIAorICAgc3RyY3B5KCBidWZmZXIsICJGdXR1cmUgRG9tYWluIDE2LWJpdCBTQ1NJIERyaXZlciBWZXJzaW9uIiApOworICAgaWYgKHN0cmNociggVkVSU0lPTiwgJzonKSkgeyAvKiBBc3N1bWUgVkVSU0lPTiBpcyBhbiBSQ1MgUmV2aXNpb24gc3RyaW5nICovCisgICAgICBzdHJjYXQoIGJ1ZmZlciwgc3RyY2hyKCBWRVJTSU9OLCAnOicgKSArIDEgKTsKKyAgICAgIHB0ID0gc3RycmNociggYnVmZmVyLCAnJCcpIC0gMTsKKyAgICAgIGlmICghcHQpICAJCS8qIFN0cmlwcGVkIFJDUyBSZXZpc2lvbiBzdHJpbmc/ICovCisJICAgIHB0ID0gYnVmZmVyICsgc3RybGVuKCBidWZmZXIgKSAtIDE7CisgICAgICBpZiAoKnB0ICE9ICcgJykKKwkgICAgKytwdDsKKyAgICAgICpwdCA9ICdcMCc7CisgICB9IGVsc2UgewkJCS8qIEFzc3VtZSBWRVJTSU9OIGlzIGEgbnVtYmVyICovCisgICAgICBzdHJjYXQoIGJ1ZmZlciwgIiAiIFZFUlNJT04gKTsKKyAgIH0KKyAgICAgIAorICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgZmRvbWFpbl9hcmJpdHJhdGUoIHZvaWQgKQoreworICAgaW50ICAgICAgICAgICBzdGF0dXMgPSAwOworICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisjaWYgRVZFUllfQUNDRVNTCisgICBwcmludGsoICJmZG9tYWluX2FyYml0cmF0ZSgpXG4iICk7CisjZW5kaWYKKyAgIAorICAgb3V0YigweDAwLCBwb3J0X2Jhc2UgKyBTQ1NJX0NudGwpOyAgICAgICAgICAgICAgLyogRGlzYWJsZSBkYXRhIGRyaXZlcnMgKi8KKyAgIG91dGIoYWRhcHRlcl9tYXNrLCBwb3J0X2Jhc2UgKyBTQ1NJX0RhdGFfTm9BQ0spOyAvKiBTZXQgb3VyIGlkIGJpdCAqLworICAgb3V0YigweDA0IHwgUEFSSVRZX01BU0ssIHBvcnRfYmFzZSArIFRNQ19DbnRsKTsgLyogU3RhcnQgYXJiaXRyYXRpb24gKi8KKworICAgdGltZW91dCA9IDUwMDsKKyAgIGRvIHsKKyAgICAgIHN0YXR1cyA9IGluYihwb3J0X2Jhc2UgKyBUTUNfU3RhdHVzKTsgICAgICAgIC8qIFJlYWQgYWRhcHRlciBzdGF0dXMgKi8KKyAgICAgIGlmIChzdGF0dXMgJiAweDAyKQkJICAgICAgLyogQXJiaXRyYXRpb24gY29tcGxldGUgKi8KKwkgICAgcmV0dXJuIDA7CisgICAgICBtZGVsYXkoMSk7CQkJLyogV2FpdCBvbmUgbWlsbGlzZWNvbmQgKi8KKyAgIH0gd2hpbGUgKC0tdGltZW91dCk7CisKKyAgIC8qIE1ha2UgYnVzIGlkbGUgKi8KKyAgIGZkb21haW5fbWFrZV9idXNfaWRsZSgpOworCisjaWYgRVZFUllfQUNDRVNTCisgICBwcmludGsoICJBcmJpdHJhdGlvbiBmYWlsZWQsIHN0YXR1cyA9ICV4XG4iLCBzdGF0dXMgKTsKKyNlbmRpZgorI2lmIEVSUk9SU19PTkxZCisgICBwcmludGsoICJzY3NpOiA8ZmRvbWFpbj4gQXJiaXRyYXRpb24gZmFpbGVkLCBzdGF0dXMgPSAleFxuIiwgc3RhdHVzICk7CisjZW5kaWYKKyAgIHJldHVybiAxOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZmRvbWFpbl9zZWxlY3QoIGludCB0YXJnZXQgKQoreworICAgaW50ICAgICAgICAgICBzdGF0dXM7CisgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisjaWYgRVJST1JTX09OTFkKKyAgIHN0YXRpYyBpbnQgICAgZmxhZyA9IDA7CisjZW5kaWYKKworICAgb3V0YigweDgyLCBwb3J0X2Jhc2UgKyBTQ1NJX0NudGwpOyAvKiBCdXMgRW5hYmxlICsgU2VsZWN0ICovCisgICBvdXRiKGFkYXB0ZXJfbWFzayB8ICgxIDw8IHRhcmdldCksIHBvcnRfYmFzZSArIFNDU0lfRGF0YV9Ob0FDSyk7CisKKyAgIC8qIFN0b3AgYXJiaXRyYXRpb24gYW5kIGVuYWJsZSBwYXJpdHkgKi8KKyAgIG91dGIoUEFSSVRZX01BU0ssIHBvcnRfYmFzZSArIFRNQ19DbnRsKTsgCisKKyAgIHRpbWVvdXQgPSAzNTA7CQkJLyogMzUwIG1zZWMgKi8KKworICAgZG8geworICAgICAgc3RhdHVzID0gaW5iKHBvcnRfYmFzZSArIFNDU0lfU3RhdHVzKTsgLyogUmVhZCBhZGFwdGVyIHN0YXR1cyAqLworICAgICAgaWYgKHN0YXR1cyAmIDEpIHsJCQkvKiBCdXN5IGFzc2VydGVkICovCisJIC8qIEVuYWJsZSBTQ1NJIEJ1cyAob24gZXJyb3IsIHNob3VsZCBtYWtlIGJ1cyBpZGxlIHdpdGggMCkgKi8KKwkgb3V0YigweDgwLCBwb3J0X2Jhc2UgKyBTQ1NJX0NudGwpOworCSByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIG1kZWxheSgxKTsJCQkvKiB3YWl0IG9uZSBtc2VjICovCisgICB9IHdoaWxlICgtLXRpbWVvdXQpOworICAgLyogTWFrZSBidXMgaWRsZSAqLworICAgZmRvbWFpbl9tYWtlX2J1c19pZGxlKCk7CisjaWYgRVZFUllfQUNDRVNTCisgICBpZiAoIXRhcmdldCkgcHJpbnRrKCAiU2VsZWN0aW9uIGZhaWxlZFxuIiApOworI2VuZGlmCisjaWYgRVJST1JTX09OTFkKKyAgIGlmICghdGFyZ2V0KSB7CisgICAgICBpZiAoIWZsYWcpIC8qIFNraXAgZmlyc3QgZmFpbHVyZSBmb3IgYWxsIGNoaXBzLiAqLworCSAgICArK2ZsYWc7CisgICAgICBlbHNlCisJICAgIHByaW50ayggInNjc2k6IDxmZG9tYWluPiBTZWxlY3Rpb24gZmFpbGVkXG4iICk7CisgICB9CisjZW5kaWYKKyAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBteV9kb25lKGludCBlcnJvcikKK3sKKyAgIGlmIChpbl9jb21tYW5kKSB7CisgICAgICBpbl9jb21tYW5kID0gMDsKKyAgICAgIG91dGIoMHgwMCwgcG9ydF9iYXNlICsgSW50ZXJydXB0X0NudGwpOworICAgICAgZmRvbWFpbl9tYWtlX2J1c19pZGxlKCk7CisgICAgICBjdXJyZW50X1NDLT5yZXN1bHQgPSBlcnJvcjsKKyAgICAgIGlmIChjdXJyZW50X1NDLT5zY3NpX2RvbmUpCisJICAgIGN1cnJlbnRfU0MtPnNjc2lfZG9uZSggY3VycmVudF9TQyApOworICAgICAgZWxzZSBwYW5pYyggInNjc2k6IDxmZG9tYWluPiBjdXJyZW50X1NDLT5zY3NpX2RvbmUoKSA9PSBOVUxMIiApOworICAgfSBlbHNlIHsKKyAgICAgIHBhbmljKCAic2NzaTogPGZkb21haW4+IG15X2RvbmUoKSBjYWxsZWQgb3V0c2lkZSBvZiBjb21tYW5kXG4iICk7CisgICB9CisjaWYgREVCVUdfUkFDRQorICAgaW5faW50ZXJydXB0X2ZsYWcgPSAwOworI2VuZGlmCit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkb19mZG9tYWluXzE2eDBfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCXN0cnVjdCBwdF9yZWdzICogcmVncyApCit7CisgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgaW50ICAgICAgc3RhdHVzOworICAgaW50ICAgICAgZG9uZSA9IDA7CisgICB1bnNpZ25lZCBkYXRhX2NvdW50OworCisJCQkJLyogVGhlIGZkb21haW5fMTZ4MF9pbnRyIGlzIG9ubHkgY2FsbGVkIHZpYQorCQkJCSAgIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4gIFRoZSBnb2FsIG9mIHRoZQorCQkJCSAgIHN0aSgpIGhlcmUgaXMgdG8gYWxsb3cgb3RoZXIKKwkJCQkgICBpbnRlcnJ1cHRpb25zIHdoaWxlIHRoaXMgcm91dGluZSBpcworCQkJCSAgIHJ1bm5pbmcuICovCisKKyAgIC8qIENoZWNrIGZvciBvdGhlciBJUlEgc291cmNlcyAqLworICAgaWYgKChpbmIocG9ydF9iYXNlICsgVE1DX1N0YXR1cykgJiAweDAxKSA9PSAwKQorICAgCXJldHVybiBJUlFfTk9ORTsKKworICAgLyogSXQgaXMgb3VyIElSUSAqLyAgIAkKKyAgIG91dGIoMHgwMCwgcG9ydF9iYXNlICsgSW50ZXJydXB0X0NudGwpOworCisgICAvKiBXZSB1c3VhbGx5IGhhdmUgb25lIHNwdXJpb3VzIGludGVycnVwdCBhZnRlciBlYWNoIGNvbW1hbmQuICBJZ25vcmUgaXQuICovCisgICBpZiAoIWluX2NvbW1hbmQgfHwgIWN1cnJlbnRfU0MpIHsJLyogU3B1cmlvdXMgaW50ZXJydXB0ICovCisjaWYgRVZFUllfQUNDRVNTCisgICAgICBwcmludGsoICJTcHVyaW91cyBpbnRlcnJ1cHQsIGluX2NvbW1hbmQgPSAlZCwgY3VycmVudF9TQyA9ICV4XG4iLAorCSAgICAgIGluX2NvbW1hbmQsIGN1cnJlbnRfU0MgKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIElSUV9OT05FOworICAgfQorCisgICAvKiBBYm9ydCBjYWxscyBteV9kb25lLCBzbyB3ZSBkbyBub3RoaW5nIGhlcmUuICovCisgICBpZiAoY3VycmVudF9TQy0+U0NwLnBoYXNlICYgYWJvcnRlZCkgeworI2lmIERFQlVHX0FCT1JUCisgICAgICBwcmludGsoICJzY3NpOiA8ZmRvbWFpbj4gSW50ZXJydXB0IGFmdGVyIGFib3J0LCBpZ25vcmluZ1xuIiApOworI2VuZGlmCisgICAgICAvKgorICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOyAqLworICAgfQorCisjaWYgREVCVUdfUkFDRQorICAgKytpbl9pbnRlcnJ1cHRfZmxhZzsKKyNlbmRpZgorCisgICBpZiAoY3VycmVudF9TQy0+U0NwLnBoYXNlICYgaW5fYXJiaXRyYXRpb24pIHsKKyAgICAgIHN0YXR1cyA9IGluYihwb3J0X2Jhc2UgKyBUTUNfU3RhdHVzKTsgICAgICAgIC8qIFJlYWQgYWRhcHRlciBzdGF0dXMgKi8KKyAgICAgIGlmICghKHN0YXR1cyAmIDB4MDIpKSB7CisjaWYgRVZFUllfQUNDRVNTCisJIHByaW50ayggIiBBRkFJTCAiICk7CisjZW5kaWYKKyAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKGN1cnJlbnRfU0MtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJIG15X2RvbmUoIERJRF9CVVNfQlVTWSA8PCAxNiApOworICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjdXJyZW50X1NDLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCSByZXR1cm4gSVJRX0hBTkRMRUQ7CisgICAgICB9CisgICAgICBjdXJyZW50X1NDLT5TQ3AucGhhc2UgPSBpbl9zZWxlY3Rpb247CisgICAgICAKKyAgICAgIG91dGIoMHg0MCB8IEZJRk9fQ09VTlQsIHBvcnRfYmFzZSArIEludGVycnVwdF9DbnRsKTsKKworICAgICAgb3V0YigweDgyLCBwb3J0X2Jhc2UgKyBTQ1NJX0NudGwpOyAvKiBCdXMgRW5hYmxlICsgU2VsZWN0ICovCisgICAgICBvdXRiKGFkYXB0ZXJfbWFzayB8ICgxIDw8IGN1cnJlbnRfU0MtPmRldmljZS0+aWQpLCBwb3J0X2Jhc2UgKyBTQ1NJX0RhdGFfTm9BQ0spOworICAgICAgCisgICAgICAvKiBTdG9wIGFyYml0cmF0aW9uIGFuZCBlbmFibGUgcGFyaXR5ICovCisgICAgICBvdXRiKDB4MTAgfCBQQVJJVFlfTUFTSywgcG9ydF9iYXNlICsgVE1DX0NudGwpOworI2lmIERFQlVHX1JBQ0UKKyAgICAgIGluX2ludGVycnVwdF9mbGFnID0gMDsKKyNlbmRpZgorICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOworICAgfSBlbHNlIGlmIChjdXJyZW50X1NDLT5TQ3AucGhhc2UgJiBpbl9zZWxlY3Rpb24pIHsKKyAgICAgIHN0YXR1cyA9IGluYihwb3J0X2Jhc2UgKyBTQ1NJX1N0YXR1cyk7CisgICAgICBpZiAoIShzdGF0dXMgJiAweDAxKSkgeworCSAvKiBUcnkgYWdhaW4sIGZvciBzbG93IGRldmljZXMgKi8KKwkgaWYgKGZkb21haW5fc2VsZWN0KCBjdXJyZW50X1NDLT5kZXZpY2UtPmlkICkpIHsKKyNpZiBFVkVSWV9BQ0NFU1MKKwkgICAgcHJpbnRrKCAiIFNGQUlMICIgKTsKKyNlbmRpZgorICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoY3VycmVudF9TQy0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkgICAgbXlfZG9uZSggRElEX05PX0NPTk5FQ1QgPDwgMTYgKTsKKyAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY3VycmVudF9TQy0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkgICAgcmV0dXJuIElSUV9IQU5ETEVEOworCSB9IGVsc2UgeworI2lmIEVWRVJZX0FDQ0VTUworCSAgICBwcmludGsoICIgQWx0U2VsICIgKTsKKyNlbmRpZgorCSAgICAvKiBTdG9wIGFyYml0cmF0aW9uIGFuZCBlbmFibGUgcGFyaXR5ICovCisJICAgIG91dGIoMHgxMCB8IFBBUklUWV9NQVNLLCBwb3J0X2Jhc2UgKyBUTUNfQ250bCk7CisJIH0KKyAgICAgIH0KKyAgICAgIGN1cnJlbnRfU0MtPlNDcC5waGFzZSA9IGluX290aGVyOworICAgICAgb3V0YigweDkwIHwgRklGT19DT1VOVCwgcG9ydF9iYXNlICsgSW50ZXJydXB0X0NudGwpOworICAgICAgb3V0YigweDgwLCBwb3J0X2Jhc2UgKyBTQ1NJX0NudGwpOworI2lmIERFQlVHX1JBQ0UKKyAgICAgIGluX2ludGVycnVwdF9mbGFnID0gMDsKKyNlbmRpZgorICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOworICAgfQorICAgCisgICAvKiBjdXJyZW50X1NDLT5TQ3AucGhhc2UgPT0gaW5fb3RoZXI6IHRoaXMgaXMgdGhlIGJvZHkgb2YgdGhlIHJvdXRpbmUgKi8KKyAgIAorICAgc3RhdHVzID0gaW5iKHBvcnRfYmFzZSArIFNDU0lfU3RhdHVzKTsKKyAgIAorICAgaWYgKHN0YXR1cyAmIDB4MTApIHsJLyogUkVRICovCisgICAgICAKKyAgICAgIHN3aXRjaCAoc3RhdHVzICYgMHgwZSkgeworICAgICAgIAorICAgICAgY2FzZSAweDA4OgkJLyogQ09NTUFORCBPVVQgKi8KKwkgb3V0YihjdXJyZW50X1NDLT5jbW5kW2N1cnJlbnRfU0MtPlNDcC5zZW50X2NvbW1hbmQrK10sCisJICAgICAgcG9ydF9iYXNlICsgV3JpdGVfU0NTSV9EYXRhKTsKKyNpZiBFVkVSWV9BQ0NFU1MKKwkgcHJpbnRrKCAiQ01EID0gJXgsIiwKKwkJIGN1cnJlbnRfU0MtPmNtbmRbIGN1cnJlbnRfU0MtPlNDcC5zZW50X2NvbW1hbmQgLSAxXSApOworI2VuZGlmCisJIGJyZWFrOworICAgICAgY2FzZSAweDAwOgkJLyogREFUQSBPVVQgLS0gdG1jMThjNTAvdG1jMThjMzAgb25seSAqLworCSBpZiAoY2hpcCAhPSB0bWMxODAwICYmICFjdXJyZW50X1NDLT5TQ3AuaGF2ZV9kYXRhX2luKSB7CisJICAgIGN1cnJlbnRfU0MtPlNDcC5oYXZlX2RhdGFfaW4gPSAtMTsKKwkgICAgb3V0YigweGQwIHwgUEFSSVRZX01BU0ssIHBvcnRfYmFzZSArIFRNQ19DbnRsKTsKKwkgfQorCSBicmVhazsKKyAgICAgIGNhc2UgMHgwNDoJCS8qIERBVEEgSU4gLS0gdG1jMThjNTAvdG1jMThjMzAgb25seSAqLworCSBpZiAoY2hpcCAhPSB0bWMxODAwICYmICFjdXJyZW50X1NDLT5TQ3AuaGF2ZV9kYXRhX2luKSB7CisJICAgIGN1cnJlbnRfU0MtPlNDcC5oYXZlX2RhdGFfaW4gPSAxOworCSAgICBvdXRiKDB4OTAgfCBQQVJJVFlfTUFTSywgcG9ydF9iYXNlICsgVE1DX0NudGwpOworCSB9CisJIGJyZWFrOworICAgICAgY2FzZSAweDBjOgkJLyogU1RBVFVTIElOICovCisJIGN1cnJlbnRfU0MtPlNDcC5TdGF0dXMgPSBpbmIocG9ydF9iYXNlICsgUmVhZF9TQ1NJX0RhdGEpOworI2lmIEVWRVJZX0FDQ0VTUworCSBwcmludGsoICJTdGF0dXMgPSAleCwgIiwgY3VycmVudF9TQy0+U0NwLlN0YXR1cyApOworI2VuZGlmCisjaWYgRVJST1JTX09OTFkKKwkgaWYgKGN1cnJlbnRfU0MtPlNDcC5TdGF0dXMKKwkgICAgICYmIGN1cnJlbnRfU0MtPlNDcC5TdGF0dXMgIT0gMgorCSAgICAgJiYgY3VycmVudF9TQy0+U0NwLlN0YXR1cyAhPSA4KSB7CisJICAgIHByaW50ayggInNjc2k6IDxmZG9tYWluPiB0YXJnZXQgPSAlZCwgY29tbWFuZCA9ICV4LCBzdGF0dXMgPSAleFxuIiwKKwkJICAgIGN1cnJlbnRfU0MtPmRldmljZS0+aWQsCisJCSAgICBjdXJyZW50X1NDLT5jbW5kWzBdLAorCQkgICAgY3VycmVudF9TQy0+U0NwLlN0YXR1cyApOworCSB9CisjZW5kaWYKKwkgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4MGE6CQkvKiBNRVNTQUdFIE9VVCAqLworCSBvdXRiKE1FU1NBR0VfUkVKRUNULCBwb3J0X2Jhc2UgKyBXcml0ZV9TQ1NJX0RhdGEpOyAvKiBSZWplY3QgKi8KKwkgYnJlYWs7CisgICAgICBjYXNlIDB4MGU6CQkvKiBNRVNTQUdFIElOICovCisJIGN1cnJlbnRfU0MtPlNDcC5NZXNzYWdlID0gaW5iKHBvcnRfYmFzZSArIFJlYWRfU0NTSV9EYXRhKTsKKyNpZiBFVkVSWV9BQ0NFU1MKKwkgcHJpbnRrKCAiTWVzc2FnZSA9ICV4LCAiLCBjdXJyZW50X1NDLT5TQ3AuTWVzc2FnZSApOworI2VuZGlmCisJIGlmICghY3VycmVudF9TQy0+U0NwLk1lc3NhZ2UpICsrZG9uZTsKKyNpZiBERUJVR19NRVNTQUdFUyB8fCBFVkVSWV9BQ0NFU1MKKwkgaWYgKGN1cnJlbnRfU0MtPlNDcC5NZXNzYWdlKSB7CisJICAgIHByaW50ayggInNjc2k6IDxmZG9tYWluPiBtZXNzYWdlID0gJXhcbiIsCisJCSAgICBjdXJyZW50X1NDLT5TQ3AuTWVzc2FnZSApOworCSB9CisjZW5kaWYKKwkgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIGlmIChjaGlwID09IHRtYzE4MDAgJiYgIWN1cnJlbnRfU0MtPlNDcC5oYXZlX2RhdGFfaW4KKyAgICAgICAmJiAoY3VycmVudF9TQy0+U0NwLnNlbnRfY29tbWFuZCA+PSBjdXJyZW50X1NDLT5jbWRfbGVuKSkgeworICAgICAgCisgICAgICBpZihjdXJyZW50X1NDLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKQorICAgICAgeworCSBjdXJyZW50X1NDLT5TQ3AuaGF2ZV9kYXRhX2luID0gLTE7CisJIG91dGIoMHhkMCB8IFBBUklUWV9NQVNLLCBwb3J0X2Jhc2UgKyBUTUNfQ250bCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisJIGN1cnJlbnRfU0MtPlNDcC5oYXZlX2RhdGFfaW4gPSAxOworCSBvdXRiKDB4OTAgfCBQQVJJVFlfTUFTSywgcG9ydF9iYXNlICsgVE1DX0NudGwpOworICAgICAgfQorICAgfQorCisgICBpZiAoY3VycmVudF9TQy0+U0NwLmhhdmVfZGF0YV9pbiA9PSAtMSkgeyAvKiBEQVRBIE9VVCAqLworICAgICAgd2hpbGUgKChkYXRhX2NvdW50ID0gRklGT19TaXplIC0gaW53KHBvcnRfYmFzZSArIEZJRk9fRGF0YV9Db3VudCkpID4gNTEyKSB7CisjaWYgRVZFUllfQUNDRVNTCisJIHByaW50ayggIkRDPSVkLCAiLCBkYXRhX2NvdW50ICkgOworI2VuZGlmCisJIGlmIChkYXRhX2NvdW50ID4gY3VycmVudF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwpCisJICAgICAgIGRhdGFfY291bnQgPSBjdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbDsKKwkgaWYgKGRhdGFfY291bnQgPiAwKSB7CisjaWYgRVZFUllfQUNDRVNTCisJICAgIHByaW50ayggIiVkIE9VVCwgIiwgZGF0YV9jb3VudCApOworI2VuZGlmCisJICAgIGlmIChkYXRhX2NvdW50ID09IDEpIHsKKwkgICAgICAgb3V0YigqY3VycmVudF9TQy0+U0NwLnB0cisrLCBwb3J0X2Jhc2UgKyBXcml0ZV9GSUZPKTsKKwkgICAgICAgLS1jdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbDsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgZGF0YV9jb3VudCA+Pj0gMTsKKwkgICAgICAgb3V0c3cocG9ydF9iYXNlICsgV3JpdGVfRklGTywgY3VycmVudF9TQy0+U0NwLnB0ciwgZGF0YV9jb3VudCk7CisJICAgICAgIGN1cnJlbnRfU0MtPlNDcC5wdHIgKz0gMiAqIGRhdGFfY291bnQ7CisJICAgICAgIGN1cnJlbnRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsIC09IDIgKiBkYXRhX2NvdW50OworCSAgICB9CisJIH0KKwkgaWYgKCFjdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbCkgeworCSAgICBpZiAoY3VycmVudF9TQy0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpIHsKKwkgICAgICAgLS1jdXJyZW50X1NDLT5TQ3AuYnVmZmVyc19yZXNpZHVhbDsKKwkgICAgICAgKytjdXJyZW50X1NDLT5TQ3AuYnVmZmVyOworCSAgICAgICBjdXJyZW50X1NDLT5TQ3AucHRyID0gcGFnZV9hZGRyZXNzKGN1cnJlbnRfU0MtPlNDcC5idWZmZXItPnBhZ2UpICsgY3VycmVudF9TQy0+U0NwLmJ1ZmZlci0+b2Zmc2V0OworCSAgICAgICBjdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbCA9IGN1cnJlbnRfU0MtPlNDcC5idWZmZXItPmxlbmd0aDsKKwkgICAgfSBlbHNlCisJCSAgYnJlYWs7CisJIH0KKyAgICAgIH0KKyAgIH0KKyAgIAorICAgaWYgKGN1cnJlbnRfU0MtPlNDcC5oYXZlX2RhdGFfaW4gPT0gMSkgeyAvKiBEQVRBIElOICovCisgICAgICB3aGlsZSAoKGRhdGFfY291bnQgPSBpbncocG9ydF9iYXNlICsgRklGT19EYXRhX0NvdW50KSkgPiAwKSB7CisjaWYgRVZFUllfQUNDRVNTCisJIHByaW50ayggIkRDPSVkLCAiLCBkYXRhX2NvdW50ICk7CisjZW5kaWYKKwkgaWYgKGRhdGFfY291bnQgPiBjdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbCkKKwkgICAgICAgZGF0YV9jb3VudCA9IGN1cnJlbnRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsOworCSBpZiAoZGF0YV9jb3VudCkgeworI2lmIEVWRVJZX0FDQ0VTUworCSAgICBwcmludGsoICIlZCBJTiwgIiwgZGF0YV9jb3VudCApOworI2VuZGlmCisJICAgIGlmIChkYXRhX2NvdW50ID09IDEpIHsKKwkgICAgICAgKmN1cnJlbnRfU0MtPlNDcC5wdHIrKyA9IGluYihwb3J0X2Jhc2UgKyBSZWFkX0ZJRk8pOworCSAgICAgICAtLWN1cnJlbnRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsOworCSAgICB9IGVsc2UgeworCSAgICAgICBkYXRhX2NvdW50ID4+PSAxOyAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKwkgICAgICAgaW5zdyhwb3J0X2Jhc2UgKyBSZWFkX0ZJRk8sIGN1cnJlbnRfU0MtPlNDcC5wdHIsIGRhdGFfY291bnQpOworCSAgICAgICBjdXJyZW50X1NDLT5TQ3AucHRyICs9IDIgKiBkYXRhX2NvdW50OworCSAgICAgICBjdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbCAtPSAyICogZGF0YV9jb3VudDsKKwkgICAgfQorCSB9CisJIGlmICghY3VycmVudF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwKKwkgICAgICYmIGN1cnJlbnRfU0MtPlNDcC5idWZmZXJzX3Jlc2lkdWFsKSB7CisJICAgIC0tY3VycmVudF9TQy0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw7CisJICAgICsrY3VycmVudF9TQy0+U0NwLmJ1ZmZlcjsKKwkgICAgY3VycmVudF9TQy0+U0NwLnB0ciA9IHBhZ2VfYWRkcmVzcyhjdXJyZW50X1NDLT5TQ3AuYnVmZmVyLT5wYWdlKSArIGN1cnJlbnRfU0MtPlNDcC5idWZmZXItPm9mZnNldDsKKwkgICAgY3VycmVudF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgPSBjdXJyZW50X1NDLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJIH0KKyAgICAgIH0KKyAgIH0KKyAgIAorICAgaWYgKGRvbmUpIHsKKyNpZiBFVkVSWV9BQ0NFU1MKKyAgICAgIHByaW50ayggIiAqKiBJTiBET05FICVkICoqICIsIGN1cnJlbnRfU0MtPlNDcC5oYXZlX2RhdGFfaW4gKTsKKyNlbmRpZgorCisjaWYgRVJST1JTX09OTFkKKyAgICAgIGlmIChjdXJyZW50X1NDLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UgJiYgIWN1cnJlbnRfU0MtPlNDcC5TdGF0dXMpIHsKKwkgaWYgKCh1bnNpZ25lZCBjaGFyKSgqKChjaGFyICopY3VycmVudF9TQy0+cmVxdWVzdF9idWZmZXIrMikpICYgMHgwZikgeworCSAgICB1bnNpZ25lZCBjaGFyIGtleTsKKwkgICAgdW5zaWduZWQgY2hhciBjb2RlOworCSAgICB1bnNpZ25lZCBjaGFyIHF1YWxpZmllcjsKKworCSAgICBrZXkgPSAodW5zaWduZWQgY2hhcikoKigoY2hhciAqKWN1cnJlbnRfU0MtPnJlcXVlc3RfYnVmZmVyICsgMikpCisJCSAgJiAweDBmOworCSAgICBjb2RlID0gKHVuc2lnbmVkIGNoYXIpKCooKGNoYXIgKiljdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZlciArIDEyKSk7CisJICAgIHF1YWxpZmllciA9ICh1bnNpZ25lZCBjaGFyKSgqKChjaGFyICopY3VycmVudF9TQy0+cmVxdWVzdF9idWZmZXIKKwkJCQkJICArIDEzKSk7CisKKwkgICAgaWYgKGtleSAhPSBVTklUX0FUVEVOVElPTgorCQkmJiAhKGtleSA9PSBOT1RfUkVBRFkKKwkJICAgICAmJiBjb2RlID09IDB4MDQKKwkJICAgICAmJiAoIXF1YWxpZmllciB8fCBxdWFsaWZpZXIgPT0gMHgwMiB8fCBxdWFsaWZpZXIgPT0gMHgwMSkpCisJCSYmICEoa2V5ID09IElMTEVHQUxfUkVRVUVTVCAmJiAoY29kZSA9PSAweDI1CisJCQkJCQl8fCBjb2RlID09IDB4MjQKKwkJCQkJCXx8ICFjb2RlKSkpCisJCSAgCisJCSAgcHJpbnRrKCAic2NzaTogPGZkb21haW4+IFJFUVVFU1QgU0VOU0UiCisJCQkgICIgS2V5ID0gJXgsIENvZGUgPSAleCwgUXVhbGlmaWVyID0gJXhcbiIsCisJCQkgIGtleSwgY29kZSwgcXVhbGlmaWVyICk7CisJIH0KKyAgICAgIH0KKyNlbmRpZgorI2lmIEVWRVJZX0FDQ0VTUworICAgICAgcHJpbnRrKCAiQkVGT1JFIE1ZX0RPTkUuIC4gLiIgKTsKKyNlbmRpZgorICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoY3VycmVudF9TQy0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKyAgICAgIG15X2RvbmUoIChjdXJyZW50X1NDLT5TQ3AuU3RhdHVzICYgMHhmZikKKwkgICAgICAgfCAoKGN1cnJlbnRfU0MtPlNDcC5NZXNzYWdlICYgMHhmZikgPDwgOCkgfCAoRElEX09LIDw8IDE2KSApOworICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjdXJyZW50X1NDLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworI2lmIEVWRVJZX0FDQ0VTUworICAgICAgcHJpbnRrKCAiUkVUVVJOSU5HLlxuIiApOworI2VuZGlmCisgICAgICAKKyAgIH0gZWxzZSB7CisgICAgICBpZiAoY3VycmVudF9TQy0+U0NwLnBoYXNlICYgZGlzY29ubmVjdCkgeworCSBvdXRiKDB4ZDAgfCBGSUZPX0NPVU5ULCBwb3J0X2Jhc2UgKyBJbnRlcnJ1cHRfQ250bCk7CisJIG91dGIoMHgwMCwgcG9ydF9iYXNlICsgU0NTSV9DbnRsKTsKKyAgICAgIH0gZWxzZSB7CisJIG91dGIoMHg5MCB8IEZJRk9fQ09VTlQsIHBvcnRfYmFzZSArIEludGVycnVwdF9DbnRsKTsKKyAgICAgIH0KKyAgIH0KKyNpZiBERUJVR19SQUNFCisgICBpbl9pbnRlcnJ1cHRfZmxhZyA9IDA7CisjZW5kaWYKKyAgIHJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBmZG9tYWluXzE2eDBfcXVldWUoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsCisJCXZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworICAgaWYgKGluX2NvbW1hbmQpIHsKKyAgICAgIHBhbmljKCAic2NzaTogPGZkb21haW4+IGZkb21haW5fMTZ4MF9xdWV1ZSgpIE5PVCBSRUVOVFJBTlQhXG4iICk7CisgICB9CisjaWYgRVZFUllfQUNDRVNTCisgICBwcmludGsoICJxdWV1ZTogdGFyZ2V0ID0gJWQgY21uZCA9IDB4JTAyeCBwaWVjZXMgPSAlZCBzaXplID0gJXVcbiIsCisJICAgU0NwbnQtPnRhcmdldCwKKwkgICAqKHVuc2lnbmVkIGNoYXIgKilTQ3BudC0+Y21uZCwKKwkgICBTQ3BudC0+dXNlX3NnLAorCSAgIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gKTsKKyNlbmRpZgorCisgICBmZG9tYWluX21ha2VfYnVzX2lkbGUoKTsKKworICAgY3VycmVudF9TQyAgICAgICAgICAgID0gU0NwbnQ7IC8qIFNhdmUgdGhpcyBmb3IgdGhlIGRvbmUgZnVuY3Rpb24gKi8KKyAgIGN1cnJlbnRfU0MtPnNjc2lfZG9uZSA9IGRvbmU7CisKKyAgIC8qIEluaXRpYWxpemUgc3RhdGljIGRhdGEgKi8KKworICAgaWYgKGN1cnJlbnRfU0MtPnVzZV9zZykgeworICAgICAgY3VycmVudF9TQy0+U0NwLmJ1ZmZlciA9CisJICAgIChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZlcjsKKyAgICAgIGN1cnJlbnRfU0MtPlNDcC5wdHIgICAgICAgICAgICAgID0gcGFnZV9hZGRyZXNzKGN1cnJlbnRfU0MtPlNDcC5idWZmZXItPnBhZ2UpICsgY3VycmVudF9TQy0+U0NwLmJ1ZmZlci0+b2Zmc2V0OworICAgICAgY3VycmVudF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgICAgPSBjdXJyZW50X1NDLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisgICAgICBjdXJyZW50X1NDLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IGN1cnJlbnRfU0MtPnVzZV9zZyAtIDE7CisgICB9IGVsc2UgeworICAgICAgY3VycmVudF9TQy0+U0NwLnB0ciAgICAgICAgICAgICAgPSAoY2hhciAqKWN1cnJlbnRfU0MtPnJlcXVlc3RfYnVmZmVyOworICAgICAgY3VycmVudF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgICAgPSBjdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZsZW47CisgICAgICBjdXJyZW50X1NDLT5TQ3AuYnVmZmVyICAgICAgICAgICA9IE5VTEw7CisgICAgICBjdXJyZW50X1NDLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IDA7CisgICB9CisJIAorICAgCisgICBjdXJyZW50X1NDLT5TQ3AuU3RhdHVzICAgICAgICAgICAgICA9IDA7CisgICBjdXJyZW50X1NDLT5TQ3AuTWVzc2FnZSAgICAgICAgICAgICA9IDA7CisgICBjdXJyZW50X1NDLT5TQ3AuaGF2ZV9kYXRhX2luICAgICAgICA9IDA7CisgICBjdXJyZW50X1NDLT5TQ3Auc2VudF9jb21tYW5kICAgICAgICA9IDA7CisgICBjdXJyZW50X1NDLT5TQ3AucGhhc2UgICAgICAgICAgICAgICA9IGluX2FyYml0cmF0aW9uOworCisgICAvKiBTdGFydCBhcmJpdHJhdGlvbiAqLworICAgb3V0YigweDAwLCBwb3J0X2Jhc2UgKyBJbnRlcnJ1cHRfQ250bCk7CisgICBvdXRiKDB4MDAsIHBvcnRfYmFzZSArIFNDU0lfQ250bCk7ICAgICAgICAgICAgICAvKiBEaXNhYmxlIGRhdGEgZHJpdmVycyAqLworICAgb3V0YihhZGFwdGVyX21hc2ssIHBvcnRfYmFzZSArIFNDU0lfRGF0YV9Ob0FDSyk7IC8qIFNldCBvdXIgaWQgYml0ICovCisgICArK2luX2NvbW1hbmQ7CisgICBvdXRiKDB4MjAsIHBvcnRfYmFzZSArIEludGVycnVwdF9DbnRsKTsKKyAgIG91dGIoMHgxNCB8IFBBUklUWV9NQVNLLCBwb3J0X2Jhc2UgKyBUTUNfQ250bCk7IC8qIFN0YXJ0IGFyYml0cmF0aW9uICovCisKKyAgIHJldHVybiAwOworfQorCisjaWYgREVCVUdfQUJPUlQKK3N0YXRpYyB2b2lkIHByaW50X2luZm8oc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCit7CisgICB1bnNpZ25lZCBpbnQgaW1yOworICAgdW5zaWduZWQgaW50IGlycjsKKyAgIHVuc2lnbmVkIGludCBpc3I7CisKKyAgIGlmICghU0NwbnQgfHwgIVNDcG50LT5kZXZpY2UgfHwgIVNDcG50LT5kZXZpY2UtPmhvc3QpIHsKKyAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgInNjc2k6IDxmZG9tYWluPiBDYW5ub3QgcHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvblxuIik7CisgICAgICByZXR1cm47CisgICB9CisgICAKKyAgIHByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBmZG9tYWluXzE2eDBfaW5mbyggU0NwbnQtPmRldmljZS0+aG9zdCApICk7CisgICBwcmludF9iYW5uZXIoU0NwbnQtPmRldmljZS0+aG9zdCk7CisgICBzd2l0Y2ggKFNDcG50LT5TQ3AucGhhc2UpIHsKKyAgIGNhc2UgaW5fYXJiaXRyYXRpb246IHByaW50aygiYXJiaXRyYXRpb24iKTsgYnJlYWs7CisgICBjYXNlIGluX3NlbGVjdGlvbjogICBwcmludGsoInNlbGVjdGlvbiIpOyAgIGJyZWFrOworICAgY2FzZSBpbl9vdGhlcjogICAgICAgcHJpbnRrKCJvdGhlciIpOyAgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6ICAgICAgICAgICAgIHByaW50aygidW5rbm93biIpOyAgICAgYnJlYWs7CisgICB9CisKKyAgIHByaW50ayggIiAoJWQpLCB0YXJnZXQgPSAlZCBjbW5kID0gMHglMDJ4IHBpZWNlcyA9ICVkIHNpemUgPSAldVxuIiwKKwkgICBTQ3BudC0+U0NwLnBoYXNlLAorCSAgIFNDcG50LT5kZXZpY2UtPmlkLAorCSAgICoodW5zaWduZWQgY2hhciAqKVNDcG50LT5jbW5kLAorCSAgIFNDcG50LT51c2Vfc2csCisJICAgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiApOworICAgcHJpbnRrKCAic2VudF9jb21tYW5kID0gJWQsIGhhdmVfZGF0YV9pbiA9ICVkLCB0aW1lb3V0ID0gJWRcbiIsCisJICAgU0NwbnQtPlNDcC5zZW50X2NvbW1hbmQsCisJICAgU0NwbnQtPlNDcC5oYXZlX2RhdGFfaW4sCisJICAgU0NwbnQtPnRpbWVvdXQgKTsKKyNpZiBERUJVR19SQUNFCisgICBwcmludGsoICJpbl9pbnRlcnJ1cHRfZmxhZyA9ICVkXG4iLCBpbl9pbnRlcnJ1cHRfZmxhZyApOworI2VuZGlmCisKKyAgIGltciA9IChpbmIoIDB4MGExICkgPDwgOCkgKyBpbmIoIDB4MjEgKTsKKyAgIG91dGIoIDB4MGEsIDB4YTAgKTsKKyAgIGlyciA9IGluYiggMHhhMCApIDw8IDg7CisgICBvdXRiKCAweDBhLCAweDIwICk7CisgICBpcnIgKz0gaW5iKCAweDIwICk7CisgICBvdXRiKCAweDBiLCAweGEwICk7CisgICBpc3IgPSBpbmIoIDB4YTAgKSA8PCA4OworICAgb3V0YiggMHgwYiwgMHgyMCApOworICAgaXNyICs9IGluYiggMHgyMCApOworCisJCQkJLyogUHJpbnQgb3V0IGludGVyZXN0aW5nIGluZm9ybWF0aW9uICovCisgICBwcmludGsoICJJTVIgPSAweCUwNHgiLCBpbXIgKTsKKyAgIGlmIChpbXIgJiAoMSA8PCBpbnRlcnJ1cHRfbGV2ZWwpKQorCSBwcmludGsoICIgKG1hc2tlZCkiICk7CisgICBwcmludGsoICIsIElSUiA9IDB4JTA0eCwgSVNSID0gMHglMDR4XG4iLCBpcnIsIGlzciApOworCisgICBwcmludGsoICJTQ1NJIFN0YXR1cyAgICAgID0gMHglMDJ4XG4iLCBpbmIocG9ydF9iYXNlICsgU0NTSV9TdGF0dXMpKTsKKyAgIHByaW50ayggIlRNQyBTdGF0dXMgICAgICAgPSAweCUwMngiLCBpbmIocG9ydF9iYXNlICsgVE1DX1N0YXR1cykpOworICAgaWYgKGluYigocG9ydF9iYXNlICsgVE1DX1N0YXR1cykgJiAxKSkKKwkgcHJpbnRrKCAiIChpbnRlcnJ1cHQpIiApOworICAgcHJpbnRrKCAiXG4iICk7CisgICBwcmludGsoIkludGVycnVwdCBTdGF0dXMgPSAweCUwMngiLCBpbmIocG9ydF9iYXNlICsgSW50ZXJydXB0X1N0YXR1cykpOworICAgaWYgKGluYihwb3J0X2Jhc2UgKyBJbnRlcnJ1cHRfU3RhdHVzKSAmIDB4MDgpCisJIHByaW50ayggIiAoZW5hYmxlZCkiICk7CisgICBwcmludGsoICJcbiIgKTsKKyAgIGlmIChjaGlwID09IHRtYzE4YzUwIHx8IGNoaXAgPT0gdG1jMThjMzApIHsKKyAgICAgIHByaW50aygiRklGTyBTdGF0dXMgICAgICA9IDB4JTAyeFxuIiwgaW5iKHBvcnRfYmFzZSArIEZJRk9fU3RhdHVzKSk7CisgICAgICBwcmludGsoICJJbnQuIENvbmRpdGlvbiAgID0gMHglMDJ4XG4iLAorCSAgICAgIGluYiggcG9ydF9iYXNlICsgSW50ZXJydXB0X0NvbmQgKSApOworICAgfQorICAgcHJpbnRrKCAiQ29uZmlndXJhdGlvbiAxICA9IDB4JTAyeFxuIiwgaW5iKCBwb3J0X2Jhc2UgKyBDb25maWd1cmF0aW9uMSApICk7CisgICBpZiAoY2hpcCA9PSB0bWMxOGM1MCB8fCBjaGlwID09IHRtYzE4YzMwKQorCSBwcmludGsoICJDb25maWd1cmF0aW9uIDIgID0gMHglMDJ4XG4iLAorCQkgaW5iKCBwb3J0X2Jhc2UgKyBDb25maWd1cmF0aW9uMiApICk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBmZG9tYWluXzE2eDBfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCit7CisjaWYgRVZFUllfQUNDRVNTIHx8IEVSUk9SU19PTkxZIHx8IERFQlVHX0FCT1JUCisgICBwcmludGsoICJzY3NpOiA8ZmRvbWFpbj4gYWJvcnQgIiApOworI2VuZGlmCisKKyAgIGlmICghaW5fY29tbWFuZCkgeworI2lmIEVWRVJZX0FDQ0VTUyB8fCBFUlJPUlNfT05MWQorICAgICAgcHJpbnRrKCAiIChub3QgaW4gY29tbWFuZClcbiIgKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIEZBSUxFRDsKKyAgIH0gZWxzZSBwcmludGsoICJcbiIgKTsKKworI2lmIERFQlVHX0FCT1JUCisgICBwcmludF9pbmZvKCBTQ3BudCApOworI2VuZGlmCisKKyAgIGZkb21haW5fbWFrZV9idXNfaWRsZSgpOworICAgY3VycmVudF9TQy0+U0NwLnBoYXNlIHw9IGFib3J0ZWQ7CisgICBjdXJyZW50X1NDLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisgICAKKyAgIC8qIEFib3J0cyBhcmUgbm90IGRvbmUgd2VsbC4gLiAuICovCisgICBteV9kb25lKERJRF9BQk9SVCA8PCAxNik7CisgICByZXR1cm4gU1VDQ0VTUzsKK30KKworaW50IGZkb21haW5fMTZ4MF9idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCit7CisgICBvdXRiKDEsIHBvcnRfYmFzZSArIFNDU0lfQ250bCk7CisgICBkb19wYXVzZSggMiApOworICAgb3V0YigwLCBwb3J0X2Jhc2UgKyBTQ1NJX0NudGwpOworICAgZG9fcGF1c2UoIDExNSApOworICAgb3V0YigwLCBwb3J0X2Jhc2UgKyBTQ1NJX01vZGVfQ250bCk7CisgICBvdXRiKFBBUklUWV9NQVNLLCBwb3J0X2Jhc2UgKyBUTUNfQ250bCk7CisgICByZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBmZG9tYWluXzE2eDBfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKKwkJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJc2VjdG9yX3QgY2FwYWNpdHksIGludCAqaW5mb19hcnJheSkKK3sKKyAgIGludCAgICAgICAgICAgICAgZHJpdmU7CisgICBpbnQJCSAgICBzaXplICAgICAgPSBjYXBhY2l0eTsKKyAgIHVuc2lnbmVkIGxvbmcgICAgb2Zmc2V0OworICAgc3RydWN0IGRyaXZlX2luZm8geworICAgICAgdW5zaWduZWQgc2hvcnQgY3lsaW5kZXJzOworICAgICAgdW5zaWduZWQgY2hhciAgaGVhZHM7CisgICAgICB1bnNpZ25lZCBjaGFyICBzZWN0b3JzOworICAgfSBpOworICAgCisgICAvKiBOT1RFUzoKKyAgICAgIFRoZSBSQU0gYXJlYSBzdGFydHMgYXQgMHgxZjAwIGZyb20gdGhlIGJpb3NfYmFzZSBhZGRyZXNzLgorCisgICAgICBGb3IgQklPUyBWZXJzaW9uIDIuMDoKKyAgICAgIAorICAgICAgVGhlIGRyaXZlIHBhcmFtZXRlciB0YWJsZSBzZWVtcyB0byBzdGFydCBhdCAweDFmMzAuCisgICAgICBUaGUgZmlyc3QgYnl0ZSdzIHB1cnBvc2UgaXMgbm90IGtub3duLgorICAgICAgTmV4dCBpcyB0aGUgY3lsaW5kZXIsIGhlYWQsIGFuZCBzZWN0b3IgaW5mb3JtYXRpb24uCisgICAgICBUaGUgbGFzdCA0IGJ5dGVzIGFwcGVhciB0byBiZSB0aGUgZHJpdmUncyBzaXplIGluIHNlY3RvcnMuCisgICAgICBUaGUgb3RoZXIgYnl0ZXMgaW4gdGhlIGRyaXZlIHBhcmFtZXRlciB0YWJsZSBhcmUgdW5rbm93bi4KKyAgICAgIElmIGFueW9uZSBmaWd1cmVzIHRoZW0gb3V0LCBwbGVhc2Ugc2VuZCBtZSBtYWlsLCBhbmQgSSB3aWxsCisgICAgICB1cGRhdGUgdGhlc2Ugbm90ZXMuCisKKyAgICAgIFRhcGUgZHJpdmVzIGRvIG5vdCBnZXQgcGxhY2VkIGluIHRoaXMgdGFibGUuCisKKyAgICAgIFRoZXJlIGlzIGFub3RoZXIgdGFibGUgYXQgMHgxZmVhOgorICAgICAgSWYgdGhlIGJ5dGUgaXMgMHgwMSwgdGhlbiB0aGUgU0NTSSBJRCBpcyBub3QgaW4gdXNlLgorICAgICAgSWYgdGhlIGJ5dGUgaXMgMHgxOCBvciAweDQ4LCB0aGVuIHRoZSBTQ1NJIElEIGlzIGluIHVzZSwKKyAgICAgIGFsdGhvdWdoIHRhcGVzIGRvbid0IHNlZW0gdG8gYmUgaW4gdGhpcyB0YWJsZS4gIEkgaGF2ZW4ndAorICAgICAgc2VlbiBhbnkgb3RoZXIgbnVtYmVycyAoaW4gYSBsaW1pdGVkIHNhbXBsZSkuCisKKyAgICAgIDB4MWYyZCBpcyBhIGRyaXZlIGNvdW50IChpLmUuLCBub3QgaW5jbHVkaW5nIHRhcGVzKQorCisgICAgICBUaGUgdGFibGUgYXQgMHgxZmNjIGFyZSBJL08gcG9ydHMgYWRkcmVzc2VzIGZvciB0aGUgdmFyaW91cworICAgICAgb3BlcmF0aW9ucy4gIEkgY2FsY3VsYXRlIHRoZXNlIGJ5IGhhbmQgaW4gdGhpcyBkcml2ZXIgY29kZS4KKworICAgICAgCisgICAgICAKKyAgICAgIEZvciB0aGUgSVNBLTIwMFMgdmVyc2lvbiBvZiBCSU9TIFZlcnNpb24gMi4wOgorCisgICAgICBUaGUgZHJpdmUgcGFyYW1ldGVyIHRhYmxlIHN0YXJ0cyBhdCAweDFmMzMuCisKKyAgICAgIFdBUk5JTkc6IEFzc3VtZSB0aGF0IHRoZSB0YWJsZSBlbnRyeSBpcyAyNSBieXRlcyBsb25nLiAgU29tZW9uZSBuZWVkcworICAgICAgdG8gY2hlY2sgdGhpcyBmb3IgdGhlIFF1YW50dW0gSVNBLTIwMFMgY2FyZC4KKworICAgICAgCisgICAgICAKKyAgICAgIEZvciBCSU9TIFZlcnNpb24gMy4yOgorCisgICAgICBUaGUgZHJpdmUgcGFyYW1ldGVyIHRhYmxlIHN0YXJ0cyBhdCAweDFmNzAuICBFYWNoIGVudHJ5IGlzCisgICAgICAweDBhIGJ5dGVzIGxvbmcuICBIZWFkcyBhcmUgb25lIGxlc3MgdGhhbiB3ZSBuZWVkIHRvIHJlcG9ydC4KKyAgICAqLworCisgICBpZiAoTUFKT1IoYmRldi0+YmRfZGV2KSAhPSBTQ1NJX0RJU0swX01BSk9SKSB7CisgICAgICBwcmludGsoInNjc2k6IDxmZG9tYWluPiBmZG9tYWluXzE2eDBfYmlvc3BhcmFtOiB0b28gbWFueSBkaXNrcyIpOworICAgICAgcmV0dXJuIDA7CisgICB9CisgICBkcml2ZSA9IE1JTk9SKGJkZXYtPmJkX2RldikgPj4gNDsKKworICAgaWYgKGJpb3NfbWFqb3IgPT0gMikgeworICAgICAgc3dpdGNoIChRdWFudHVtKSB7CisgICAgICBjYXNlIDI6CQkJLyogSVNBXzIwMFMgKi8KKwkJCQkvKiBUaGUgdmFsdWUgb2YgMjUgaGFzIG5ldmVyIGJlZW4gdmVyaWZpZWQuCisJCQkJICAgSXQgc2hvdWxkIHByb2JhYmx5IGJlIDE1LiAqLworCSBvZmZzZXQgPSAweDFmMzMgKyBkcml2ZSAqIDI1OworCSBicmVhazsKKyAgICAgIGNhc2UgMzoJCQkvKiBJU0FfMjUwTUcgKi8KKwkgb2Zmc2V0ID0gMHgxZjM2ICsgZHJpdmUgKiAxNTsKKwkgYnJlYWs7CisgICAgICBjYXNlIDQ6CQkJLyogSVNBXzIwMFMgKGFub3RoZXIgb25lKSAqLworCSBvZmZzZXQgPSAweDFmMzQgKyBkcml2ZSAqIDE1OworCSBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJIG9mZnNldCA9IDB4MWYzMSArIGRyaXZlICogMjU7CisJIGJyZWFrOworICAgICAgfQorICAgICAgbWVtY3B5X2Zyb21pbyggJmksIGJpb3NfbWVtICsgb2Zmc2V0LCBzaXplb2YoIHN0cnVjdCBkcml2ZV9pbmZvICkgKTsKKyAgICAgIGluZm9fYXJyYXlbMF0gPSBpLmhlYWRzOworICAgICAgaW5mb19hcnJheVsxXSA9IGkuc2VjdG9yczsKKyAgICAgIGluZm9fYXJyYXlbMl0gPSBpLmN5bGluZGVyczsKKyAgIH0gZWxzZSBpZiAoYmlvc19tYWpvciA9PSAzCisJICAgICAgJiYgYmlvc19taW5vciA+PSAwCisJICAgICAgJiYgYmlvc19taW5vciA8IDQpIHsgLyogMy4wIGFuZCAzLjIgQklPUyAqLworICAgICAgbWVtY3B5X2Zyb21pbyggJmksIGJpb3NfbWVtICsgMHgxZjcxICsgZHJpdmUgKiAxMCwKKwkJICAgICBzaXplb2YoIHN0cnVjdCBkcml2ZV9pbmZvICkgKTsKKyAgICAgIGluZm9fYXJyYXlbMF0gPSBpLmhlYWRzICsgMTsKKyAgICAgIGluZm9fYXJyYXlbMV0gPSBpLnNlY3RvcnM7CisgICAgICBpbmZvX2FycmF5WzJdID0gaS5jeWxpbmRlcnM7CisgICB9IGVsc2UgewkJCS8qIDMuNCBCSU9TIChhbmQgdXA/KSAqLworICAgICAgLyogVGhpcyBhbGdvcml0aG0gd2FzIHByb3ZpZGVkIGJ5IEZ1dHVyZSBEb21haW4gKG11Y2ggdGhhbmtzISkuICovCisgICAgICB1bnNpZ25lZCBjaGFyICpwID0gc2NzaV9iaW9zX3B0YWJsZShiZGV2KTsKKworICAgICAgaWYgKHAgJiYgcFs2NV0gPT0gMHhhYSAmJiBwWzY0XSA9PSAweDU1IC8qIFBhcnRpdGlvbiB0YWJsZSB2YWxpZCAqLworCSAgJiYgcFs0XSkgewkJCSAgICAvKiBQYXJ0aXRpb24gdHlwZSAqLworCisJIC8qIFRoZSBwYXJ0aXRpb24gdGFibGUgbGF5b3V0IGlzIGFzIGZvbGxvd3M6CisKKwkgICAgU3RhcnQ6IDB4MWIzaAorCSAgICBPZmZzZXQ6IDAgPSBwYXJ0aXRpb24gc3RhdHVzCisJCSAgICAxID0gc3RhcnRpbmcgaGVhZAorCQkgICAgMiA9IHN0YXJ0aW5nIHNlY3RvciBhbmQgY3lsaW5kZXIgKHdvcmQsIGVuY29kZWQpCisJCSAgICA0ID0gcGFydGl0aW9uIHR5cGUKKwkJICAgIDUgPSBlbmRpbmcgaGVhZAorCQkgICAgNiA9IGVuZGluZyBzZWN0b3IgYW5kIGN5bGluZGVyICh3b3JkLCBlbmNvZGVkKQorCQkgICAgOCA9IHN0YXJ0aW5nIGFic29sdXRlIHNlY3RvciAoZG91YmxlIHdvcmQpCisJCSAgICBjID0gbnVtYmVyIG9mIHNlY3RvcnMgKGRvdWJsZSB3b3JkKQorCSAgICBTaWduYXR1cmU6IDB4MWZlID0gMHg1NWFhCisKKwkgICAgU28sIHRoaXMgYWxnb3JpdGhtIGFzc3VtZXM6CisJICAgIDEpIHRoZSBmaXJzdCBwYXJ0aXRpb24gdGFibGUgaXMgaW4gdXNlLAorCSAgICAyKSB0aGUgZGF0YSBpbiB0aGUgZmlyc3QgZW50cnkgaXMgY29ycmVjdCwgYW5kCisJICAgIDMpIHBhcnRpdGlvbnMgbmV2ZXIgZGl2aWRlIGN5bGluZGVycworCisJICAgIE5vdGUgdGhhdCAoMSkgbWF5IGJlIEZBTFNFIGZvciBOZXRCU0QgKGFuZCBvdGhlciBCU0QgZmxhdm9ycyksCisJICAgIGFzIHdlbGwgYXMgZm9yIExpbnV4LiAgTm90ZSBhbHNvLCB0aGF0IExpbnV4IGRvZXNuJ3QgcGF5IGFueQorCSAgICBhdHRlbnRpb24gdG8gdGhlIGZpZWxkcyB0aGF0IGFyZSB1c2VkIGJ5IHRoaXMgYWxnb3JpdGhtIC0tIGl0CisJICAgIG9ubHkgdXNlcyB0aGUgYWJzb2x1dGUgc2VjdG9yIGRhdGEuICBSZWNlbnQgdmVyc2lvbnMgb2YgTGludXgncworCSAgICBmZGlzaygxKSB3aWxsIGZpbGwgdGhpcyBkYXRhIGluIGNvcnJlY3RseSwgYW5kIGZvcnRoY29taW5nCisJICAgIHZlcnNpb25zIHdpbGwgY2hlY2sgZm9yIGNvbnNpc3RlbmN5LgorCisJICAgIENoZWNraW5nIGZvciBhIG5vbi16ZXJvIHBhcnRpdGlvbiB0eXBlIGlzIG5vdCBwYXJ0IG9mIHRoZQorCSAgICBGdXR1cmUgRG9tYWluIGFsZ29yaXRobSwgYnV0IGl0IHNlZW1lZCB0byBiZSBhIHJlYXNvbmFibGUgdGhpbmcKKwkgICAgdG8gZG8sIGVzcGVjaWFsbHkgaW4gdGhlIExpbnV4IGFuZCBCU0Qgd29ybGRzLiAqLworCisJIGluZm9fYXJyYXlbMF0gPSBwWzVdICsgMTsJICAgIC8qIGhlYWRzICovCisJIGluZm9fYXJyYXlbMV0gPSBwWzZdICYgMHgzZjsJICAgIC8qIHNlY3RvcnMgKi8KKyAgICAgIH0gZWxzZSB7CisKKyAJIC8qIE5vdGUgdGhhdCB0aGlzIG5ldyBtZXRob2QgZ3VhcmFudGVlcyB0aGF0IHRoZXJlIHdpbGwgYWx3YXlzIGJlCisJICAgIGxlc3MgdGhhbiAxMDI0IGN5bGluZGVycyBvbiBhIHBsYXR0ZXIuICBUaGlzIGlzIGdvb2QgZm9yIGRyaXZlcworCSAgICB1cCB0byBhcHByb3hpbWF0ZWx5IDcuODVHQiAod2hlcmUgMUdCID0gMTAyNCAqIDEwMjQga0IpLiAqLworCisJIGlmICgodW5zaWduZWQgaW50KXNpemUgPj0gMHg3ZTAwMDBVKSB7CisJICAgIGluZm9fYXJyYXlbMF0gPSAweGZmOyAvKiBoZWFkcyAgID0gMjU1ICovCisJICAgIGluZm9fYXJyYXlbMV0gPSAweDNmOyAvKiBzZWN0b3JzID0gIDYzICovCisJIH0gZWxzZSBpZiAoKHVuc2lnbmVkIGludClzaXplID49IDB4MjAwMDAwVSkgeworCSAgICBpbmZvX2FycmF5WzBdID0gMHg4MDsgLyogaGVhZHMgICA9IDEyOCAqLworCSAgICBpbmZvX2FycmF5WzFdID0gMHgzZjsgLyogc2VjdG9ycyA9ICA2MyAqLworCSB9IGVsc2UgeworCSAgICBpbmZvX2FycmF5WzBdID0gMHg0MDsgLyogaGVhZHMgICA9ICA2NCAqLworCSAgICBpbmZvX2FycmF5WzFdID0gMHgyMDsgLyogc2VjdG9ycyA9ICAzMiAqLworCSB9CisgICAgICB9CisJCQkJLyogRm9yIGJvdGggbWV0aG9kcywgY29tcHV0ZSB0aGUgY3lsaW5kZXJzICovCisgICAgICBpbmZvX2FycmF5WzJdID0gKHVuc2lnbmVkIGludClzaXplIC8gKGluZm9fYXJyYXlbMF0gKiBpbmZvX2FycmF5WzFdICk7CisgICAgICBrZnJlZShwKTsKKyAgIH0KKyAgIAorICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmRvbWFpbl8xNngwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaWYgKHNocG50LT5pcnEpCisJCWZyZWVfaXJxKHNocG50LT5pcnEsIHNocG50KTsKKwlpZiAoc2hwbnQtPmlvX3BvcnQgJiYgc2hwbnQtPm5faW9fcG9ydCkKKwkJcmVsZWFzZV9yZWdpb24oc2hwbnQtPmlvX3BvcnQsIHNocG50LT5uX2lvX3BvcnQpOworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGZkb21haW5fZHJpdmVyX3RlbXBsYXRlID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSAiZmRvbWFpbiIsCisJLnByb2NfbmFtZQkJPSAiZmRvbWFpbiIsCisJLmRldGVjdAkJCT0gZmRvbWFpbl8xNngwX2RldGVjdCwKKwkuaW5mbwkJCT0gZmRvbWFpbl8xNngwX2luZm8sCisJLnF1ZXVlY29tbWFuZAkJPSBmZG9tYWluXzE2eDBfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBmZG9tYWluXzE2eDBfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZmRvbWFpbl8xNngwX2J1c19yZXNldCwKKwkuYmlvc19wYXJhbQkJPSBmZG9tYWluXzE2eDBfYmlvc3BhcmFtLAorCS5yZWxlYXNlCQk9IGZkb21haW5fMTZ4MF9yZWxlYXNlLAorCS5jYW5fcXVldWUJCT0gMSwKKwkudGhpc19pZAkJPSA2LAorCS5zZ190YWJsZXNpemUJCT0gNjQsCisJLmNtZF9wZXJfbHVuCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORywKK307CisKKyNpZm5kZWYgUENNQ0lBCisjZGVmaW5lIGRyaXZlcl90ZW1wbGF0ZSBmZG9tYWluX2RyaXZlcl90ZW1wbGF0ZQorI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mZG9tYWluLmggYi9kcml2ZXJzL3Njc2kvZmRvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MDIxZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZmRvbWFpbi5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBmZG9tYWluLmMgLS0gRnV0dXJlIERvbWFpbiBUTUMtMTZ4MCBTQ1NJIGRyaXZlcgorICogQXV0aG9yOiBSaWNrYXJkIEUuIEZhaXRoLCBmYWl0aEBjcy51bmMuZWR1CisgKiBDb3B5cmlnaHQgMTk5Mi0xOTk2LCAxOTk4IFJpY2thcmQgRS4gRmFpdGggKGZhaXRoQGFjbS5vcmcpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworZXh0ZXJuIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZmRvbWFpbl9kcml2ZXJfdGVtcGxhdGU7CitleHRlcm4gaW50IGZkb21haW5fc2V0dXAoY2hhciAqc3RyKTsKK2V4dGVybiBzdHJ1Y3QgU2NzaV9Ib3N0ICpfX2Zkb21haW5fMTZ4MF9kZXRlY3Qoc3RydWN0ICBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQgKTsKK2V4dGVybiBpbnQgZmRvbWFpbl8xNngwX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZ19OQ1I1MzgwLmMgYi9kcml2ZXJzL3Njc2kvZ19OQ1I1MzgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5ZDViZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9nX05DUjUzODAuYwpAQCAtMCwwICsxLDk0NyBAQAorLyoKKyAqIEdlbmVyaWMgR2VuZXJpYyBOQ1I1MzgwIGRyaXZlcgorICoJCisgKiBDb3B5cmlnaHQgMTk5MywgRHJldyBFY2toYXJkdAorICoJVmlzaW9uYXJ5IENvbXB1dGluZworICoJKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyAqCWRyZXdAY29sb3JhZG8uZWR1CisgKiAgICAgICsxICgzMDMpIDQ0MC00ODk0CisgKgorICogTkNSNTNDNDAwIGV4dGVuc2lvbnMgKGMpIDE5OTQsMTk5NSwxOTk2LCBLZXZpbiBMZW50aW4KKyAqICAgIEsuTGVudGluQGNzLm1vbmFzaC5lZHUuYXUKKyAqCisgKiBOQ1I1M0M0MDBBIGV4dGVuc2lvbnMgKGMpIDE5OTYsIEluZ21hciBCYXVtZ2FydAorICogICAgaW5nbWFyQGdvbnpvLnNjaHdhYmVuLmRlCisgKgorICogRFRDMzE4MUUgZXh0ZW5zaW9ucyAoYykgMTk5NywgUm9uYWxkIHZhbiBDdWlqbGVuYm9yZworICogcm9uYWxkLnZhbi5jdWlqbGVuYm9yZ0B0aXAubmwgb3IgbnV0dHlAZGRzLm5sCisgKgorICogQWRkZWQgSVNBUE5QIHN1cHBvcnQgZm9yIERUQzQzNiBhZGFwdGVycywKKyAqIFRob21hcyBTYWlsZXIsIHNhaWxlckBpZmUuZWUuZXRoei5jaAorICoKKyAqIEFMUEhBIFJFTEVBU0UgMS4gCisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0IAorICoKKyAqIE5DUiA1MzgwIEZhbWlseQorICogU0NTSSBQcm90b2NvbCBDb250cm9sbGVyCisgKiBEYXRhYm9vaworICoKKyAqIE5DUiBNaWNyb2VsZWN0cm9uaWNzCisgKiAxNjM1IEFlcm9wbGF6YSBEcml2ZQorICogQ29sb3JhZG8gU3ByaW5ncywgQ08gODA5MTYKKyAqIDErICg3MTkpIDU3OC0zNDAwCisgKiAxKyAoODAwKSAzMzQtNTQ1NAorICovCisKKy8qIAorICogVE9ETyA6IGZsZXNoIG91dCBETUEgc3VwcG9ydCwgZmluZCBzb21lIG9uZSBhY3R1YWxseSB1c2luZyB0aGlzIChJIGhhdmUKKyAqIAlhIG1lbW9yeSBtYXBwZWQgVHJhbnRvciBib2FyZCB0aGF0IHdvcmtzIGZpbmUpCisgKi8KKworLyoKKyAqIE9wdGlvbnMgOgorICoKKyAqIFBBUklUWSAtIGVuYWJsZSBwYXJpdHkgY2hlY2tpbmcuICBOb3Qgc3VwcG9ydGVkLgorICoKKyAqIFNDU0kyIC0gZW5hYmxlIHN1cHBvcnQgZm9yIFNDU0ktSUkgdGFnZ2VkIHF1ZXVlaW5nLiAgVW50ZXN0ZWQuCisgKgorICogVVNMRUVQIC0gZW5hYmxlIHN1cHBvcnQgZm9yIGRldmljZXMgdGhhdCBkb24ndCBkaXNjb25uZWN0LiAgVW50ZXN0ZWQuCisgKgorICogVGhlIGNhcmQgaXMgZGV0ZWN0ZWQgYW5kIGluaXRpYWxpemVkIGluIG9uZSBvZiBzZXZlcmFsIHdheXMgOiAKKyAqIDEuICBXaXRoIGNvbW1hbmQgbGluZSBvdmVycmlkZXMgLSBOQ1I1MzgwPXBvcnQsaXJxIG1heSBiZSAKKyAqICAgICB1c2VkIG9uIHRoZSBMSUxPIGNvbW1hbmQgbGluZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMuCisgKgorICogMi4gIFdpdGggdGhlIEdFTkVSSUNfTkNSNTM4MF9PVkVSUklERSBjb21waWxlIHRpbWUgZGVmaW5lLiAgVGhpcyBpcyAKKyAqICAgICBzcGVjaWZpZWQgYXMgYW4gYXJyYXkgb2YgYWRkcmVzcywgaXJxLCBkbWEsIGJvYXJkIHR1cGxlcy4gIEllLCBmb3IKKyAqICAgICBvbmUgYm9hcmQgYXQgMHgzNTAsIElSUTUsIG5vIGRtYSwgSSBjb3VsZCBzYXkgIAorICogICAgIC1ER0VORVJJQ19OQ1I1MzgwX09WRVJSSURFPXt7MHhjYzAwMCwgNSwgRE1BX05PTkUsIEJPQVJEX05DUjUzODB9fQorICogCisgKiAtMSBzaG91bGQgYmUgc3BlY2lmaWVkIGZvciBubyBvciBETUEgaW50ZXJydXB0LCAtMiB0byBhdXRvcHJvYmUgZm9yIGFuIAorICogCUlSUSBsaW5lIGlmIG92ZXJyaWRkZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KKyAqCisgKiAzLiAgV2hlbiBpbmNsdWRlZCBhcyBhIG1vZHVsZSwgd2l0aCBhcmd1bWVudHMgcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmU6CisgKiAgICAgICAgIG5jcl9pcnE9eHgJdGhlIGludGVycnVwdAorICogICAgICAgICBuY3JfYWRkcj14eCAgdGhlIHBvcnQgb3IgYmFzZSBhZGRyZXNzIChmb3IgcG9ydCBvciBtZW1vcnkKKyAqICAgICAgICAgICAgICAJbWFwcGVkLCByZXNwLikKKyAqICAgICAgICAgbmNyX2RtYT14eAl0aGUgRE1BCisgKiAgICAgICAgIG5jcl81MzgwPTEJdG8gc2V0IHVwIGZvciBhIE5DUjUzODAgYm9hcmQKKyAqICAgICAgICAgbmNyXzUzYzQwMD0xCXRvIHNldCB1cCBmb3IgYSBOQ1I1M0M0MDAgYm9hcmQKKyAqICAgICBlLmcuCisgKiAgICAgbW9kcHJvYmUgZ19OQ1I1MzgwIG5jcl9pcnE9NSBuY3JfYWRkcj0weDM1MCBuY3JfNTM4MD0xCisgKiAgICAgICBmb3IgYSBwb3J0IG1hcHBlZCBOQ1I1MzgwIGJvYXJkIG9yCisgKiAgICAgbW9kcHJvYmUgZ19OQ1I1MzgwIG5jcl9pcnE9MjU1IG5jcl9hZGRyPTB4YzgwMDAgbmNyXzUzYzQwMD0xCisgKiAgICAgICBmb3IgYSBtZW1vcnkgbWFwcGVkIE5DUjUzQzQwMCBib2FyZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKiAKKyAqIDI1NSBzaG91bGQgYmUgc3BlY2lmaWVkIGZvciBubyBvciBETUEgaW50ZXJydXB0LCAyNTQgdG8gYXV0b3Byb2JlIGZvciBhbiAKKyAqIAlJUlEgbGluZSBpZiBvdmVycmlkZGVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgKiAgICAgCisgKi8KKworLyoKKyAqICRMb2c6IGdlbmVyaWNfTkNSNTM4MC5jLHYgJAorICovCisKKy8qIHNldHRpbmdzIGZvciBEVEMzMTgxRSBjYXJkIHdpdGggb25seSBNdXN0ZWsgc2Nhbm5lciBhdHRhY2hlZCAqLworI2RlZmluZSBVU0xFRVAKKyNkZWZpbmUgVVNMRUVQX1BPTEwJMQorI2RlZmluZSBVU0xFRVBfU0xFRVAJMjAKKyNkZWZpbmUgVVNMRUVQX1dBSVRMT05HCTUwMAorCisjZGVmaW5lIEFVVE9QUk9CRV9JUlEKKyNkZWZpbmUgQVVUT1NFTlNFCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2lmZGVmIENPTkZJR19TQ1NJX0dFTkVSSUNfTkNSNTNDNDAwCisjZGVmaW5lIE5DUjUzQzQwMF9QU0VVRE9fRE1BIDEKKyNkZWZpbmUgUFNFVURPX0RNQQorI2RlZmluZSBOQ1I1M0M0MDAKKyNkZWZpbmUgTkNSNTM4MF9TVEFUUworI3VuZGVmIE5DUjUzODBfU1RBVF9MSU1JVAorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJnX05DUjUzODAuaCIKKyNpbmNsdWRlICJOQ1I1MzgwLmgiCisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pc2FwbnAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjZGVmaW5lIE5DUl9OT1RfU0VUIDAKK3N0YXRpYyBpbnQgbmNyX2lycSA9IE5DUl9OT1RfU0VUOworc3RhdGljIGludCBuY3JfZG1hID0gTkNSX05PVF9TRVQ7CitzdGF0aWMgaW50IG5jcl9hZGRyID0gTkNSX05PVF9TRVQ7CitzdGF0aWMgaW50IG5jcl81MzgwID0gTkNSX05PVF9TRVQ7CitzdGF0aWMgaW50IG5jcl81M2M0MDAgPSBOQ1JfTk9UX1NFVDsKK3N0YXRpYyBpbnQgbmNyXzUzYzQwMGEgPSBOQ1JfTk9UX1NFVDsKK3N0YXRpYyBpbnQgZHRjXzMxODFlID0gTkNSX05PVF9TRVQ7CisKK3N0YXRpYyBzdHJ1Y3Qgb3ZlcnJpZGUgeworCU5DUjUzODBfaW1wbGVtZW50YXRpb25fZmllbGRzOworCWludCBpcnE7CisJaW50IGRtYTsKKwlpbnQgYm9hcmQ7CQkvKiBVc2UgTkNSNTNjNDAwLCBSaWNvaCwgZXRjLiBleHRlbnNpb25zID8gKi8KK30gb3ZlcnJpZGVzCisjaWZkZWYgR0VORVJJQ19OQ1I1MzgwX09WRVJSSURFCitbXSBfX2luaXRkYXRhID0gR0VORVJJQ19OQ1I1MzgwX09WRVJSSURFOworI2Vsc2UKK1sxXSBfX2luaXRkYXRhID0geyB7IDAsfSx9OworI2VuZGlmCisKKworI2RlZmluZSBOT19PVkVSUklERVMgKHNpemVvZihvdmVycmlkZXMpIC8gc2l6ZW9mKHN0cnVjdCBvdmVycmlkZSkpCisKKyNpZm5kZWYgTU9EVUxFIAorCisvKioKKyAqCWludGVybmFsX3NldHVwCQktCWhhbmRsZSBsaWxvIGNvbW1hbmQgc3RyaW5nIG92ZXJyaWRlCisgKglAYm9hcmQ6CUJPQVJEXyogaWRlbnRpZmllciBmb3IgdGhlIGJvYXJkCisgKglAc3RyOiB1bnVzZWQKKyAqCUBpbnRzOiBudW1lcmljIHBhcmFtZXRlcnMKKyAqCisgKiAJRG8gTElMTyBjb21tYW5kIGxpbmUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG92ZXJyaWRlcyBhcnJheS4gRGlzcGxheQorICoJZXJyb3JzIHdoZW4gbmVlZGVkCisgKgorICoJTG9ja3M6IG5vbmUKKyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgaW50ZXJuYWxfc2V0dXAoaW50IGJvYXJkLCBjaGFyICpzdHIsIGludCAqaW50cykKK3sKKwlzdGF0aWMgaW50IGNvbW1hbmRsaW5lX2N1cnJlbnQgPSAwOworCXN3aXRjaCAoYm9hcmQpIHsKKwljYXNlIEJPQVJEX05DUjUzODA6CisJCWlmIChpbnRzWzBdICE9IDIgJiYgaW50c1swXSAhPSAzKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImdlbmVyaWNfTkNSNTM4MF9zZXR1cCA6IHVzYWdlIG5jcjUzODA9IiBTVFJWQUwoTkNSNTM4MF9tYXBfbmFtZSkgIixpcnEsZG1hXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKwljYXNlIEJPQVJEX05DUjUzQzQwMDoKKwkJaWYgKGludHNbMF0gIT0gMikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJnZW5lcmljX05DUjUzQzQwMF9zZXR1cCA6IHVzYWdlIG5jcjUzYzQwMD0iIFNUUlZBTChOQ1I1MzgwX21hcF9uYW1lKSAiLGlycVxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCT0FSRF9OQ1I1M0M0MDBBOgorCQlpZiAoaW50c1swXSAhPSAyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImdlbmVyaWNfTkNSNTNDNDAwQV9zZXR1cCA6IHVzYWdlIG5jcjUzYzQwMGE9IiBTVFJWQUwoTkNSNTM4MF9tYXBfbmFtZSkgIixpcnFcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCWNhc2UgQk9BUkRfRFRDMzE4MUU6CisJCWlmIChpbnRzWzBdICE9IDIpIHsKKwkJCXByaW50aygiZ2VuZXJpY19EVEMzMTgxRV9zZXR1cCA6IHVzYWdlIGR0YzMxODFlPSIgU1RSVkFMKE5DUjUzODBfbWFwX25hbWUpICIsaXJxXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAoY29tbWFuZGxpbmVfY3VycmVudCA8IE5PX09WRVJSSURFUykgeworCQlvdmVycmlkZXNbY29tbWFuZGxpbmVfY3VycmVudF0uTkNSNTM4MF9tYXBfbmFtZSA9IChOQ1I1MzgwX21hcF90eXBlKSBpbnRzWzFdOworCQlvdmVycmlkZXNbY29tbWFuZGxpbmVfY3VycmVudF0uaXJxID0gaW50c1syXTsKKwkJaWYgKGludHNbMF0gPT0gMykKKwkJCW92ZXJyaWRlc1tjb21tYW5kbGluZV9jdXJyZW50XS5kbWEgPSBpbnRzWzNdOworCQllbHNlCisJCQlvdmVycmlkZXNbY29tbWFuZGxpbmVfY3VycmVudF0uZG1hID0gRE1BX05PTkU7CisJCW92ZXJyaWRlc1tjb21tYW5kbGluZV9jdXJyZW50XS5ib2FyZCA9IGJvYXJkOworCQkrK2NvbW1hbmRsaW5lX2N1cnJlbnQ7CisJfQorfQorCisKKy8qKgorICogCWRvX05DUjUzQzgwX3NldHVwCQktCXNldCB1cCBlbnRyeSBwb2ludAorICoJQHN0cjogdW51c2VkCisgKgorICoJU2V0dXAgZnVuY3Rpb24gaW52b2tlZCBhdCBib290IHRvIHBhcnNlIHRoZSBuY3I1MzgwPSBjb21tYW5kCisgKglsaW5lLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGRvX05DUjUzODBfc2V0dXAoY2hhciAqc3RyKQoreworCWludCBpbnRzWzEwXTsKKworCWdldF9vcHRpb25zKHN0ciwgc2l6ZW9mKGludHMpIC8gc2l6ZW9mKGludCksIGludHMpOworCWludGVybmFsX3NldHVwKEJPQVJEX05DUjUzODAsIHN0ciwgaW50cyk7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogCWRvX05DUjUzQzQwMF9zZXR1cAkJLQlzZXQgdXAgZW50cnkgcG9pbnQKKyAqCUBzdHI6IHVudXNlZAorICoJQGludHM6IGludGVnZXIgcGFyYW1ldGVycyBmcm9tIGtlcm5lbCBzZXR1cCBjb2RlIAorICoKKyAqCVNldHVwIGZ1bmN0aW9uIGludm9rZWQgYXQgYm9vdCB0byBwYXJzZSB0aGUgbmNyNTNjNDAwPSBjb21tYW5kCisgKglsaW5lLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGRvX05DUjUzQzQwMF9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGludHNbMTBdOworCisJZ2V0X29wdGlvbnMoc3RyLCBzaXplb2YoaW50cykgLyBzaXplb2YoaW50KSwgaW50cyk7CisJaW50ZXJuYWxfc2V0dXAoQk9BUkRfTkNSNTNDNDAwLCBzdHIsIGludHMpOworCXJldHVybiAxOworfQorCisvKioKKyAqIAlkb19OQ1I1M0M0MDBBX3NldHVwCS0Jc2V0IHVwIGVudHJ5IHBvaW50CisgKglAc3RyOiB1bnVzZWQKKyAqCUBpbnRzOiBpbnRlZ2VyIHBhcmFtZXRlcnMgZnJvbSBrZXJuZWwgc2V0dXAgY29kZSAKKyAqCisgKglTZXR1cCBmdW5jdGlvbiBpbnZva2VkIGF0IGJvb3QgdG8gcGFyc2UgdGhlIG5jcjUzYzQwMGE9IGNvbW1hbmQKKyAqCWxpbmUuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgZG9fTkNSNTNDNDAwQV9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGludHNbMTBdOworCisJZ2V0X29wdGlvbnMoc3RyLCBzaXplb2YoaW50cykgLyBzaXplb2YoaW50KSwgaW50cyk7CisJaW50ZXJuYWxfc2V0dXAoQk9BUkRfTkNSNTNDNDAwQSwgc3RyLCBpbnRzKTsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiAJZG9fRFRDMzE4MUVfc2V0dXAJLQlzZXQgdXAgZW50cnkgcG9pbnQKKyAqCUBzdHI6IHVudXNlZAorICoJQGludHM6IGludGVnZXIgcGFyYW1ldGVycyBmcm9tIGtlcm5lbCBzZXR1cCBjb2RlIAorICoKKyAqCVNldHVwIGZ1bmN0aW9uIGludm9rZWQgYXQgYm9vdCB0byBwYXJzZSB0aGUgZHRjMzE4MWU9IGNvbW1hbmQKKyAqCWxpbmUuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgZG9fRFRDMzE4MUVfc2V0dXAoY2hhciAqc3RyKQoreworCWludCBpbnRzWzEwXTsKKworCWdldF9vcHRpb25zKHN0ciwgc2l6ZW9mKGludHMpIC8gc2l6ZW9mKGludCksIGludHMpOworCWludGVybmFsX3NldHVwKEJPQVJEX0RUQzMxODFFLCBzdHIsIGludHMpOworCXJldHVybiAxOworfQorCisjZW5kaWYKKworLyoqCisgKiAJZ2VuZXJpY19OQ1I1MzgwX2RldGVjdAktCWxvb2sgZm9yIE5DUjUzODAgY29udHJvbGxlcnMKKyAqCUB0cG50OiB0aGUgc2NzaSB0ZW1wbGF0ZQorICoKKyAqCVNjYW4gZm9yIHRoZSBwcmVzZW50IG9mIE5DUjUzODAsIE5DUjUzQzQwMCwgTkNSNTNDNDAwQSwgRFRDMzE4MUUKKyAqCWFuZCBEVEM0MzYoSVNBUG5QKSBjb250cm9sbGVycy4gSWYgb3ZlcnJpZGVzIGhhdmUgYmVlbiBzZXQgd2UgdXNlCisgKgl0aGVtLgorICoKKyAqCVRoZSBjYWxsZXIgc3VwcGxpZWQgTkNSNTM4MF9pbml0IGZ1bmN0aW9uIGlzIGludm9rZWQgZnJvbSBoZXJlLCBiZWZvcmUKKyAqCXRoZSBpbnRlcnJ1cHQgbGluZSBpcyB0YWtlbi4KKyAqCisgKglMb2Nrczogbm9uZQorICovCisKK2ludCBfX2luaXQgZ2VuZXJpY19OQ1I1MzgwX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKiB0cG50KQoreworCXN0YXRpYyBpbnQgY3VycmVudF9vdmVycmlkZSA9IDA7CisJaW50IGNvdW50LCBpOworCXVuc2lnbmVkIGludCAqcG9ydHM7CisJdW5zaWduZWQgbG9uZyByZWdpb25fc2l6ZSA9IDE2OworCXN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0ZGF0YSBuY3JfNTNjNDAwYV9wb3J0c1tdID0geworCQkweDI4MCwgMHgyOTAsIDB4MzAwLCAweDMxMCwgMHgzMzAsIDB4MzQwLCAweDM0OCwgMHgzNTAsIDAKKwl9OworCXN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0ZGF0YSBkdGNfMzE4MWVfcG9ydHNbXSA9IHsKKwkJMHgyMjAsIDB4MjQwLCAweDI4MCwgMHgyYTAsIDB4MmMwLCAweDMwMCwgMHgzMjAsIDB4MzQwLCAwCisJfTsKKwlpbnQgZmxhZ3MgPSAwOworCXN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlOworCisJaWYgKG5jcl9pcnEgIT0gTkNSX05PVF9TRVQpCisJCW92ZXJyaWRlc1swXS5pcnEgPSBuY3JfaXJxOworCWlmIChuY3JfZG1hICE9IE5DUl9OT1RfU0VUKQorCQlvdmVycmlkZXNbMF0uZG1hID0gbmNyX2RtYTsKKwlpZiAobmNyX2FkZHIgIT0gTkNSX05PVF9TRVQpCisJCW92ZXJyaWRlc1swXS5OQ1I1MzgwX21hcF9uYW1lID0gKE5DUjUzODBfbWFwX3R5cGUpIG5jcl9hZGRyOworCWlmIChuY3JfNTM4MCAhPSBOQ1JfTk9UX1NFVCkKKwkJb3ZlcnJpZGVzWzBdLmJvYXJkID0gQk9BUkRfTkNSNTM4MDsKKwllbHNlIGlmIChuY3JfNTNjNDAwICE9IE5DUl9OT1RfU0VUKQorCQlvdmVycmlkZXNbMF0uYm9hcmQgPSBCT0FSRF9OQ1I1M0M0MDA7CisJZWxzZSBpZiAobmNyXzUzYzQwMGEgIT0gTkNSX05PVF9TRVQpCisJCW92ZXJyaWRlc1swXS5ib2FyZCA9IEJPQVJEX05DUjUzQzQwMEE7CisJZWxzZSBpZiAoZHRjXzMxODFlICE9IE5DUl9OT1RfU0VUKQorCQlvdmVycmlkZXNbMF0uYm9hcmQgPSBCT0FSRF9EVEMzMTgxRTsKKworCWlmICghY3VycmVudF9vdmVycmlkZSAmJiBpc2FwbnBfcHJlc2VudCgpKSB7CisJCXN0cnVjdCBwbnBfZGV2ICpkZXYgPSBOVUxMOworCQljb3VudCA9IDA7CisJCXdoaWxlICgoZGV2ID0gcG5wX2ZpbmRfZGV2KE5VTEwsIElTQVBOUF9WRU5ET1IoJ0QnLCAnVCcsICdDJyksIElTQVBOUF9GVU5DVElPTigweDQzNmUpLCBkZXYpKSkgeworCQkJaWYgKGNvdW50ID49IE5PX09WRVJSSURFUykKKwkJCQlicmVhazsKKwkJCWlmIChwbnBfZGV2aWNlX2F0dGFjaChkZXYpIDwgMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiZHRjNDM2ZSBwcm9iZTogYXR0YWNoIGZhaWxlZFxuIik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAocG5wX2FjdGl2YXRlX2RldihkZXYpIDwgMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiZHRjNDM2ZSBwcm9iZTogYWN0aXZhdGUgZmFpbGVkXG4iKTsKKwkJCQlwbnBfZGV2aWNlX2RldGFjaChkZXYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwbnBfcG9ydF92YWxpZChkZXYsIDApKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJkdGM0MzZlIHByb2JlOiBubyB2YWxpZCBwb3J0XG4iKTsKKwkJCQlwbnBfZGV2aWNlX2RldGFjaChkZXYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHBucF9pcnFfdmFsaWQoZGV2LCAwKSkKKwkJCQlvdmVycmlkZXNbY291bnRdLmlycSA9IHBucF9pcnEoZGV2LCAwKTsKKwkJCWVsc2UKKwkJCQlvdmVycmlkZXNbY291bnRdLmlycSA9IFNDU0lfSVJRX05PTkU7CisJCQlpZiAocG5wX2RtYV92YWxpZChkZXYsIDApKQorCQkJCW92ZXJyaWRlc1tjb3VudF0uZG1hID0gcG5wX2RtYShkZXYsIDApOworCQkJZWxzZQorCQkJCW92ZXJyaWRlc1tjb3VudF0uZG1hID0gRE1BX05PTkU7CisJCQlvdmVycmlkZXNbY291bnRdLk5DUjUzODBfbWFwX25hbWUgPSAoTkNSNTM4MF9tYXBfdHlwZSkgcG5wX3BvcnRfc3RhcnQoZGV2LCAwKTsKKwkJCW92ZXJyaWRlc1tjb3VudF0uYm9hcmQgPSBCT0FSRF9EVEMzMTgxRTsKKwkJCWNvdW50Kys7CisJCX0KKwl9CisKKwl0cG50LT5wcm9jX25hbWUgPSAiZ19OQ1I1MzgwIjsKKworCWZvciAoY291bnQgPSAwOyBjdXJyZW50X292ZXJyaWRlIDwgTk9fT1ZFUlJJREVTOyArK2N1cnJlbnRfb3ZlcnJpZGUpIHsKKwkJaWYgKCEob3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLk5DUjUzODBfbWFwX25hbWUpKQorCQkJY29udGludWU7CisKKwkJcG9ydHMgPSBOVUxMOworCQlzd2l0Y2ggKG92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5ib2FyZCkgeworCQljYXNlIEJPQVJEX05DUjUzODA6CisJCQlmbGFncyA9IEZMQUdfTk9fUFNFVURPX0RNQTsKKwkJCWJyZWFrOworCQljYXNlIEJPQVJEX05DUjUzQzQwMDoKKwkJCWZsYWdzID0gRkxBR19OQ1I1M0M0MDA7CisJCQlicmVhazsKKwkJY2FzZSBCT0FSRF9OQ1I1M0M0MDBBOgorCQkJZmxhZ3MgPSBGTEFHX05PX1BTRVVET19ETUE7CisJCQlwb3J0cyA9IG5jcl81M2M0MDBhX3BvcnRzOworCQkJYnJlYWs7CisJCWNhc2UgQk9BUkRfRFRDMzE4MUU6CisJCQlmbGFncyA9IEZMQUdfTk9fUFNFVURPX0RNQSB8IEZMQUdfRFRDMzE4MUU7CisJCQlwb3J0cyA9IGR0Y18zMTgxZV9wb3J0czsKKwkJCWJyZWFrOworCQl9CisKKyNpZm5kZWYgQ09ORklHX1NDU0lfR19OQ1I1MzgwX01FTQorCQlpZiAocG9ydHMpIHsKKwkJCS8qIHdha2V1cCBzZXF1ZW5jZSBmb3IgdGhlIE5DUjUzQzQwMEEgYW5kIERUQzMxODFFICovCisKKwkJCS8qIERpc2FibGUgdGhlIGFkYXB0ZXIgYW5kIGxvb2sgZm9yIGEgZnJlZSBpbyBwb3J0ICovCisJCQlvdXRiKDB4NTksIDB4Nzc5KTsKKwkJCW91dGIoMHhiOSwgMHgzNzkpOworCQkJb3V0YigweGM1LCAweDM3OSk7CisJCQlvdXRiKDB4YWUsIDB4Mzc5KTsKKwkJCW91dGIoMHhhNiwgMHgzNzkpOworCQkJb3V0YigweDAwLCAweDM3OSk7CisKKwkJCWlmIChvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uTkNSNTM4MF9tYXBfbmFtZSAhPSBQT1JUX0FVVE8pCisJCQkJZm9yIChpID0gMDsgcG9ydHNbaV07IGkrKykgeworCQkJCQlpZiAoIXJlcXVlc3RfcmVnaW9uKHBvcnRzW2ldLCAgMTYsICJuY3I1M2M4MCIpKQorCQkJCQkJY29udGludWU7CisJCQkJCWlmIChvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uTkNSNTM4MF9tYXBfbmFtZSA9PSBwb3J0c1tpXSkKKwkJCQkJCWJyZWFrOworCQkJCQlyZWxlYXNlX3JlZ2lvbihwb3J0c1tpXSwgMTYpOworCQkJfSBlbHNlCisJCQkJZm9yIChpID0gMDsgcG9ydHNbaV07IGkrKykgeworCQkJCQlpZiAoIXJlcXVlc3RfcmVnaW9uKHBvcnRzW2ldLCAgMTYsICJuY3I1M2M4MCIpKQorCQkJCQkJY29udGludWU7CisJCQkJCWlmIChpbmIocG9ydHNbaV0pID09IDB4ZmYpCisJCQkJCQlicmVhazsKKwkJCQkJcmVsZWFzZV9yZWdpb24ocG9ydHNbaV0sIDE2KTsKKwkJCQl9CisJCQlpZiAocG9ydHNbaV0pIHsKKwkJCQkvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgb3VyIHJlZ2lvbiByZXNlcnZlZCAqLworCQkJCW91dGIoMHg1OSwgMHg3NzkpOworCQkJCW91dGIoMHhiOSwgMHgzNzkpOworCQkJCW91dGIoMHhjNSwgMHgzNzkpOworCQkJCW91dGIoMHhhZSwgMHgzNzkpOworCQkJCW91dGIoMHhhNiwgMHgzNzkpOworCQkJCW91dGIoMHg4MCB8IGksIDB4Mzc5KTsJLyogc2V0IGlvIHBvcnQgdG8gYmUgdXNlZCAqLworCQkJCW91dGIoMHhjMCwgcG9ydHNbaV0gKyA5KTsKKwkJCQlpZiAoaW5iKHBvcnRzW2ldICsgOSkgIT0gMHg4MCkKKwkJCQkJY29udGludWU7CisJCQkJZWxzZQorCQkJCQlvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uTkNSNTM4MF9tYXBfbmFtZSA9IHBvcnRzW2ldOworCQkJfSBlbHNlCisJCQkJY29udGludWU7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBOb3QgYSA1M0M0MDBBIHN0eWxlIHNldHVwIC0ganVzdCBncmFiICovCisJCQlpZighKHJlcXVlc3RfcmVnaW9uKG92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5OQ1I1MzgwX21hcF9uYW1lLCBOQ1I1MzgwX3JlZ2lvbl9zaXplLCAibmNyNTM4MCIpKSkKKwkJCQljb250aW51ZTsKKwkJCXJlZ2lvbl9zaXplID0gTkNSNTM4MF9yZWdpb25fc2l6ZTsKKwkJfQorI2Vsc2UKKwkJaWYoIXJlcXVlc3RfbWVtX3JlZ2lvbihvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uTkNSNTM4MF9tYXBfbmFtZSwgTkNSNTM4MF9yZWdpb25fc2l6ZSwgIm5jcjUzODAiKSkKKwkJCWNvbnRpbnVlOworI2VuZGlmCisJCWluc3RhbmNlID0gc2NzaV9yZWdpc3Rlcih0cG50LCBzaXplb2Yoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEpKTsKKwkJaWYgKGluc3RhbmNlID09IE5VTEwpIHsKKyNpZm5kZWYgQ09ORklHX1NDU0lfR19OQ1I1MzgwX01FTQorCQkJcmVsZWFzZV9yZWdpb24ob3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLk5DUjUzODBfbWFwX25hbWUsIHJlZ2lvbl9zaXplKTsKKyNlbHNlCisJCQlyZWxlYXNlX21lbV9yZWdpb24ob3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLk5DUjUzODBfbWFwX25hbWUsIE5DUjUzODBfcmVnaW9uX3NpemUpOworI2VuZGlmCisJCQljb250aW51ZTsKKwkJfQorCisJCWluc3RhbmNlLT5OQ1I1MzgwX2luc3RhbmNlX25hbWUgPSBvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uTkNSNTM4MF9tYXBfbmFtZTsKKyNpZm5kZWYgQ09ORklHX1NDU0lfR19OQ1I1MzgwX01FTQorCQlpbnN0YW5jZS0+bl9pb19wb3J0ID0gcmVnaW9uX3NpemU7CisjZW5kaWYKKworCQlOQ1I1MzgwX2luaXQoaW5zdGFuY2UsIGZsYWdzKTsKKworCQlpZiAob3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLmlycSAhPSBJUlFfQVVUTykKKwkJCWluc3RhbmNlLT5pcnEgPSBvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uaXJxOworCQllbHNlCisJCQlpbnN0YW5jZS0+aXJxID0gTkNSNTM4MF9wcm9iZV9pcnEoaW5zdGFuY2UsIDB4ZmZmZik7CisKKwkJaWYgKGluc3RhbmNlLT5pcnEgIT0gU0NTSV9JUlFfTk9ORSkKKwkJCWlmIChyZXF1ZXN0X2lycShpbnN0YW5jZS0+aXJxLCBnZW5lcmljX05DUjUzODBfaW50ciwgU0FfSU5URVJSVVBULCAiTkNSNTM4MCIsIGluc3RhbmNlKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZCA6IElSUSVkIG5vdCBmcmVlLCBpbnRlcnJ1cHRzIGRpc2FibGVkXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgaW5zdGFuY2UtPmlycSk7CisJCQkJaW5zdGFuY2UtPmlycSA9IFNDU0lfSVJRX05PTkU7CisJCQl9CisKKwkJaWYgKGluc3RhbmNlLT5pcnEgPT0gU0NTSV9JUlFfTk9ORSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSVkIDogaW50ZXJydXB0cyBub3QgZW5hYmxlZC4gZm9yIGJldHRlciBpbnRlcmFjdGl2ZSBwZXJmb3JtYW5jZSxcbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwkJCXByaW50ayhLRVJOX0lORk8gInNjc2klZCA6IHBsZWFzZSBqdW1wZXIgdGhlIGJvYXJkIGZvciBhIGZyZWUgSVJRLlxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSVkIDogYXQgIiBTVFJWQUwoTkNSNTM4MF9tYXBfbmFtZSkgIiAweCV4IiwgaW5zdGFuY2UtPmhvc3Rfbm8sICh1bnNpZ25lZCBpbnQpIGluc3RhbmNlLT5OQ1I1MzgwX2luc3RhbmNlX25hbWUpOworCQlpZiAoaW5zdGFuY2UtPmlycSA9PSBTQ1NJX0lSUV9OT05FKQorCQkJcHJpbnRrKCIgaW50ZXJydXB0cyBkaXNhYmxlZCIpOworCQllbHNlCisJCQlwcmludGsoIiBpcnEgJWQiLCBpbnN0YW5jZS0+aXJxKTsKKwkJcHJpbnRrKCIgb3B0aW9ucyBDQU5fUVVFVUU9JWQgIENNRF9QRVJfTFVOPSVkIHJlbGVhc2U9JWQiLCBDQU5fUVVFVUUsIENNRF9QRVJfTFVOLCBHRU5FUklDX05DUjUzODBfUFVCTElDX1JFTEVBU0UpOworCQlOQ1I1MzgwX3ByaW50X29wdGlvbnMoaW5zdGFuY2UpOworCQlwcmludGsoIlxuIik7CisKKwkJKytjdXJyZW50X292ZXJyaWRlOworCQkrK2NvdW50OworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICoJZ2VuZXJpY19OQ1I1MzgwX2luZm8JLQlyZXBvcnRpbmcgc3RyaW5nCisgKglAaG9zdDogTkNSNTM4MCB0byByZXBvcnQgb24KKyAqCisgKglSZXBvcnQgZHJpdmVyIGluZm9ybWF0aW9uIGZvciB0aGUgTkNSNTM4MAorICovCisgCQorY29uc3QgY2hhciAqZ2VuZXJpY19OQ1I1MzgwX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBzdHJpbmdbXSA9ICJHZW5lcmljIE5DUjUzODAvNTNDNDAwIERyaXZlciI7CisJcmV0dXJuIHN0cmluZzsKK30KKworLyoqCisgKglnZW5lcmljX05DUjUzODBfcmVsZWFzZV9yZXNvdXJjZXMJLQlmcmVlIHJlc291cmNlcworICoJQGluc3RhbmNlOiBob3N0IGFkYXB0ZXIgdG8gY2xlYW4gdXAgCisgKgorICoJRnJlZSB0aGUgZ2VuZXJpYyBpbnRlcmZhY2UgcmVzb3VyY2VzIGZyb20gdGhpcyBhZGFwdGVyLgorICoKKyAqCUxvY2tzOiBub25lCisgKi8KKyAKK2ludCBnZW5lcmljX05DUjUzODBfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisJTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisJTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisJCisJaWYgKGluc3RhbmNlLT5pcnEgIT0gU0NTSV9JUlFfTk9ORSkKKwkJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgTlVMTCk7CisJTkNSNTM4MF9leGl0KGluc3RhbmNlKTsKKworI2lmbmRlZiBDT05GSUdfU0NTSV9HX05DUjUzODBfTUVNCisJcmVsZWFzZV9yZWdpb24oaW5zdGFuY2UtPk5DUjUzODBfaW5zdGFuY2VfbmFtZSwgaW5zdGFuY2UtPm5faW9fcG9ydCk7CisjZWxzZQorCXJlbGVhc2VfbWVtX3JlZ2lvbihpbnN0YW5jZS0+TkNSNTM4MF9pbnN0YW5jZV9uYW1lLCBOQ1I1MzgwX3JlZ2lvbl9zaXplKTsKKyNlbmRpZgorCisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEJJT1NQQVJBTQorLyoqCisgKglnZW5lcmljX05DUjUzODBfYmlvc3BhcmFtCisgKglAZGlzazogZGlzayB0byBjb21wdXRlIGdlb21ldHJ5IGZvcgorICoJQGRldjogZGV2aWNlIGlkZW50aWZpZXIgZm9yIHRoaXMgZGlzaworICoJQGlwOiBzaXplcyB0byBmaWxsIGluCisgKgorICoJR2VuZXJhdGVzIGEgQklPUyAvIERPUyBjb21wYXRpYmxlIEgtQy1TIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQgCisgKglkZXZpY2UgLyBzaXplLgorICogCisgKiAJWFhYIE1vc3QgU0NTSSBib2FyZHMgdXNlIHRoaXMgbWFwcGluZywgSSBjb3VsZCBiZSBpbmNvcnJlY3QuICBTb21lb25lCisgKgl1c2luZyBoYXJkIGRpc2tzIG9uIGEgdHJhbnRvciBzaG91bGQgdmVyaWZ5IHRoYXQgdGhpcyBtYXBwaW5nCisgKgljb3JyZXNwb25kcyB0byB0aGF0IHVzZWQgYnkgdGhlIEJJT1MgLyBBU1BJIGRyaXZlciBieSBydW5uaW5nIHRoZSBsaW51eAorICoJZmRpc2sgcHJvZ3JhbSBhbmQgbWF0Y2hpbmcgdGhlIEhfQ19TIGNvb3JkaW5hdGVzIHRvIHdoYXQgRE9TIHVzZXMuCisgKgorICoJTG9ja3M6IG5vbmUKKyAqLworCitzdGF0aWMgaW50CitnZW5lcmljX05DUjUzODBfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJCSAgc2VjdG9yX3QgY2FwYWNpdHksIGludCAqaXApCit7CisJaXBbMF0gPSA2NDsKKwlpcFsxXSA9IDMyOworCWlwWzJdID0gY2FwYWNpdHkgPj4gMTE7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmIE5DUjUzQzQwMF9QU0VVRE9fRE1BCisKKy8qKgorICoJTkNSNTM4MF9wcmVhZAkJLQlwc2V1ZG8gRE1BIHJlYWQKKyAqCUBpbnN0YW5jZTogYWRhcHRlciB0byByZWFkIGZyb20KKyAqCUBkc3Q6IGJ1ZmZlciB0byByZWFkIGludG8KKyAqCUBsZW46IGJ1ZmZlciBsZW5ndGgKKyAqCisgKglQZXJmb3JtIGEgcHN1ZWRvIERNQSBtb2RlIHJlYWQgZnJvbSBhbiBOQ1I1M0M0MDAgb3IgZXF1aXZhbGVudAorICoJY29udHJvbGxlcgorICovCisgCitzdGF0aWMgaW5saW5lIGludCBOQ1I1MzgwX3ByZWFkKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBsZW4pCit7CisJaW50IGJsb2NrcyA9IGxlbiAvIDEyODsKKwlpbnQgc3RhcnQgPSAwOworCWludCBibDsKKworCU5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworCU5DUjUzODBfc2V0dXAoaW5zdGFuY2UpOworCisJTkNSNTM4MF93cml0ZShDNDAwX0NPTlRST0xfU1RBVFVTX1JFRywgQ1NSX0JBU0UgfCBDU1JfVFJBTlNfRElSKTsKKwlOQ1I1MzgwX3dyaXRlKEM0MDBfQkxPQ0tfQ09VTlRFUl9SRUcsIGJsb2Nrcyk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKChibCA9IE5DUjUzODBfcmVhZChDNDAwX0JMT0NLX0NPVU5URVJfUkVHKSkgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKE5DUjUzODBfcmVhZChDNDAwX0NPTlRST0xfU1RBVFVTX1JFRykgJiBDU1JfR0FURURfNTNDODBfSVJRKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIjUzQzQwMHI6IEdvdCA1M0M4MF9JUlEgc3RhcnQ9JWQsIGJsb2Nrcz0lZFxuIiwgc3RhcnQsIGJsb2Nrcyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJd2hpbGUgKE5DUjUzODBfcmVhZChDNDAwX0NPTlRST0xfU1RBVFVTX1JFRykgJiBDU1JfSE9TVF9CVUZfTk9UX1JEWSk7CisKKyNpZm5kZWYgQ09ORklHX1NDU0lfR19OQ1I1MzgwX01FTQorCQl7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKwkJCQlkc3Rbc3RhcnQgKyBpXSA9IE5DUjUzODBfcmVhZChDNDAwX0hPU1RfQlVGRkVSKTsKKwkJfQorI2Vsc2UKKwkJLyogaW1wbGllcyBDT05GSUdfU0NTSV9HX05DUjUzODBfTUVNICovCisJCWlzYV9tZW1jcHlfZnJvbWlvKGRzdCArIHN0YXJ0LCBOQ1I1M0M0MDBfaG9zdF9idWZmZXIgKyBOQ1I1MzgwX21hcF9uYW1lLCAxMjgpOworI2VuZGlmCisJCXN0YXJ0ICs9IDEyODsKKwkJYmxvY2tzLS07CisJfQorCisJaWYgKGJsb2NrcykgeworCQl3aGlsZSAoTkNSNTM4MF9yZWFkKEM0MDBfQ09OVFJPTF9TVEFUVVNfUkVHKSAmIENTUl9IT1NUX0JVRl9OT1RfUkRZKQorCQl7CisJCQkvLyBGSVhNRSAtIG5vIHRpbWVvdXQKKwkJfQorCisjaWZuZGVmIENPTkZJR19TQ1NJX0dfTkNSNTM4MF9NRU0KKwkJeworCQkJaW50IGk7CQorCQkJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorCQkJCWRzdFtzdGFydCArIGldID0gTkNSNTM4MF9yZWFkKEM0MDBfSE9TVF9CVUZGRVIpOworCQl9CisjZWxzZQorCQkvKiBpbXBsaWVzIENPTkZJR19TQ1NJX0dfTkNSNTM4MF9NRU0gKi8KKwkJaXNhX21lbWNweV9mcm9taW8oZHN0ICsgc3RhcnQsIE5DUjUzQzQwMF9ob3N0X2J1ZmZlciArIE5DUjUzODBfbWFwX25hbWUsIDEyOCk7CisjZW5kaWYKKwkJc3RhcnQgKz0gMTI4OworCQlibG9ja3MtLTsKKwl9CisKKwlpZiAoIShOQ1I1MzgwX3JlYWQoQzQwMF9DT05UUk9MX1NUQVRVU19SRUcpICYgQ1NSX0dBVEVEXzUzQzgwX0lSUSkpCisJCXByaW50aygiNTNDNDAwcjogbm8gNTNDODAgZ2F0ZWQgaXJxIGFmdGVyIHRyYW5zZmVyIik7CisKKyNpZiAwCisJLyoKKwkgKglET04nVCBETyBUSElTIC0gVEhFWSBORVZFUiBBUlJJVkUhCisJICovCisJcHJpbnRrKCI1M0M0MDByOiBXYWl0aW5nIGZvciA1M0M4MCByZWdpc3RlcnNcbiIpOworCXdoaWxlIChOQ1I1MzgwX3JlYWQoQzQwMF9DT05UUk9MX1NUQVRVU19SRUcpICYgQ1NSXzUzQzgwX1JFRykKKwkJOworI2VuZGlmCisJaWYgKCEoTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRykgJiBCQVNSX0VORF9ETUFfVFJBTlNGRVIpKQorCQlwcmludGsoS0VSTl9FUlIgIjUzQzQwMHI6IG5vIGVuZCBkbWEgc2lnbmFsXG4iKTsKKwkJCisJTkNSNTM4MF93cml0ZShNT0RFX1JFRywgTVJfQkFTRSk7CisJTkNSNTM4MF9yZWFkKFJFU0VUX1BBUklUWV9JTlRFUlJVUFRfUkVHKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglOQ1I1MzgwX3dyaXRlCQktCXBzZXVkbyBETUEgd3JpdGUKKyAqCUBpbnN0YW5jZTogYWRhcHRlciB0byByZWFkIGZyb20KKyAqCUBkc3Q6IGJ1ZmZlciB0byByZWFkIGludG8KKyAqCUBsZW46IGJ1ZmZlciBsZW5ndGgKKyAqCisgKglQZXJmb3JtIGEgcHN1ZWRvIERNQSBtb2RlIHJlYWQgZnJvbSBhbiBOQ1I1M0M0MDAgb3IgZXF1aXZhbGVudAorICoJY29udHJvbGxlcgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IE5DUjUzODBfcHdyaXRlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBsZW4pCit7CisJaW50IGJsb2NrcyA9IGxlbiAvIDEyODsKKwlpbnQgc3RhcnQgPSAwOworCWludCBibDsKKwlpbnQgaTsKKworCU5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworCU5DUjUzODBfc2V0dXAoaW5zdGFuY2UpOworCisJTkNSNTM4MF93cml0ZShDNDAwX0NPTlRST0xfU1RBVFVTX1JFRywgQ1NSX0JBU0UpOworCU5DUjUzODBfd3JpdGUoQzQwMF9CTE9DS19DT1VOVEVSX1JFRywgYmxvY2tzKTsKKwl3aGlsZSAoMSkgeworCQlpZiAoTkNSNTM4MF9yZWFkKEM0MDBfQ09OVFJPTF9TVEFUVVNfUkVHKSAmIENTUl9HQVRFRF81M0M4MF9JUlEpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiNTNDNDAwdzogR290IDUzQzgwX0lSUSBzdGFydD0lZCwgYmxvY2tzPSVkXG4iLCBzdGFydCwgYmxvY2tzKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmICgoYmwgPSBOQ1I1MzgwX3JlYWQoQzQwMF9CTE9DS19DT1VOVEVSX1JFRykpID09IDApIHsKKwkJCWJyZWFrOworCQl9CisJCXdoaWxlIChOQ1I1MzgwX3JlYWQoQzQwMF9DT05UUk9MX1NUQVRVU19SRUcpICYgQ1NSX0hPU1RfQlVGX05PVF9SRFkpCisJCQk7IC8vIEZJWE1FIC0gdGltZW91dAorI2lmbmRlZiBDT05GSUdfU0NTSV9HX05DUjUzODBfTUVNCisJCXsKKwkJCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKwkJCQlOQ1I1MzgwX3dyaXRlKEM0MDBfSE9TVF9CVUZGRVIsIHNyY1tzdGFydCArIGldKTsKKwkJfQorI2Vsc2UKKwkJLyogaW1wbGllcyBDT05GSUdfU0NTSV9HX05DUjUzODBfTUVNICovCisJCWlzYV9tZW1jcHlfdG9pbyhOQ1I1M0M0MDBfaG9zdF9idWZmZXIgKyBOQ1I1MzgwX21hcF9uYW1lLCBzcmMgKyBzdGFydCwgMTI4KTsKKyNlbmRpZgorCQlzdGFydCArPSAxMjg7CisJCWJsb2Nrcy0tOworCX0KKwlpZiAoYmxvY2tzKSB7CisJCXdoaWxlIChOQ1I1MzgwX3JlYWQoQzQwMF9DT05UUk9MX1NUQVRVU19SRUcpICYgQ1NSX0hPU1RfQlVGX05PVF9SRFkpCisJCQk7IC8vIEZJWE1FIC0gbm8gdGltZW91dAorCisjaWZuZGVmIENPTkZJR19TQ1NJX0dfTkNSNTM4MF9NRU0KKwkJeworCQkJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorCQkJCU5DUjUzODBfd3JpdGUoQzQwMF9IT1NUX0JVRkZFUiwgc3JjW3N0YXJ0ICsgaV0pOworCQl9CisjZWxzZQorCQkvKiBpbXBsaWVzIENPTkZJR19TQ1NJX0dfTkNSNTM4MF9NRU0gKi8KKwkJaXNhX21lbWNweV90b2lvKE5DUjUzQzQwMF9ob3N0X2J1ZmZlciArIE5DUjUzODBfbWFwX25hbWUsIHNyYyArIHN0YXJ0LCAxMjgpOworI2VuZGlmCisJCXN0YXJ0ICs9IDEyODsKKwkJYmxvY2tzLS07CisJfQorCisjaWYgMAorCXByaW50aygiNTNDNDAwdzogd2FpdGluZyBmb3IgcmVnaXN0ZXJzIHRvIGJlIGF2YWlsYWJsZVxuIik7CisJVEhFWSBORVZFUiBETyAhIHdoaWxlIChOQ1I1MzgwX3JlYWQoQzQwMF9DT05UUk9MX1NUQVRVU19SRUcpICYgQ1NSXzUzQzgwX1JFRyk7CisJcHJpbnRrKCI1M0M0MDB3OiBHb3QgZW1cbiIpOworI2VuZGlmCisKKwkvKiBMZXQncyB3YWl0IGZvciB0aGlzIGluc3RlYWQgLSBjb3VsZCBiZSB1Z2x5ICovCisJLyogQWxsIGRvY3VtZW50YXRpb24gc2F5cyB0byBjaGVjayBmb3IgdGhpcy4gTWF5YmUgbXkgaGFyZHdhcmUgaXMgdG9vCisJICogZmFzdC4gV2FpdGluZyBmb3IgaXQgc2VlbXMgdG8gd29yayBmaW5lISBLTEwKKwkgKi8KKwl3aGlsZSAoIShpID0gTkNSNTM4MF9yZWFkKEM0MDBfQ09OVFJPTF9TVEFUVVNfUkVHKSAmIENTUl9HQVRFRF81M0M4MF9JUlEpKQorCQk7CS8vIEZJWE1FIC0gbm8gdGltZW91dAorCisJLyoKKwkgKiBJIGtub3cuIGkgaXMgY2VydGFpbmx5ICE9IDAgaGVyZSBidXQgdGhlIGxvb3AgaXMgbmV3LiBTZWUgcHJldmlvdXMKKwkgKiBjb21tZW50LgorCSAqLworCWlmIChpKSB7CisJCWlmICghKChpID0gTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRykpICYgQkFTUl9FTkRfRE1BX1RSQU5TRkVSKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiNTNDNDAwdzogTm8gRU5EIE9GIERNQSBiaXQgLSBXSE9PUFMhIEJBU1I9JTB4XG4iLCBpKTsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICI1M0M0MDB3OiBubyA1M0M4MCBnYXRlZCBpcnEgYWZ0ZXIgdHJhbnNmZXIgKGxhc3QgYmxvY2spXG4iKTsKKworI2lmIDAKKwlpZiAoIShOQ1I1MzgwX3JlYWQoQlVTX0FORF9TVEFUVVNfUkVHKSAmIEJBU1JfRU5EX0RNQV9UUkFOU0ZFUikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICI1M0M0MDB3OiBubyBlbmQgZG1hIHNpZ25hbFxuIik7CisJfQorI2VuZGlmCisJd2hpbGUgKCEoTkNSNTM4MF9yZWFkKFRBUkdFVF9DT01NQU5EX1JFRykgJiBUQ1JfTEFTVF9CWVRFX1NFTlQpKQorCQk7IAkvLyBUSU1FT1VUCisJcmV0dXJuIDA7Cit9CisjZW5kaWYJCQkJLyogUFNFVURPX0RNQSAqLworCisvKgorICoJSW5jbHVkZSB0aGUgTkNSNTM4MCBjb3JlIGNvZGUgdGhhdCB3ZSBidWlsZCBvdXIgZHJpdmVyIGFyb3VuZAkKKyAqLworIAorI2luY2x1ZGUgIk5DUjUzODAuYyIKKworI2RlZmluZSBQUklOVFAoeCkgbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwgeCkKKyNkZWZpbmUgQU5EUCAsCisKK3N0YXRpYyBpbnQgc3ByaW50X29wY29kZShjaGFyICpidWZmZXIsIGludCBsZW4sIGludCBvcGNvZGUpCit7CisJaW50IHN0YXJ0ID0gbGVuOworCVBSSU5UUCgiMHglMDJ4ICIgQU5EUCBvcGNvZGUpOworCXJldHVybiBsZW4gLSBzdGFydDsKK30KKworc3RhdGljIGludCBzcHJpbnRfY29tbWFuZChjaGFyICpidWZmZXIsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKmNvbW1hbmQpCit7CisJaW50IGksIHMsIHN0YXJ0ID0gbGVuOworCWxlbiArPSBzcHJpbnRfb3Bjb2RlKGJ1ZmZlciwgbGVuLCBjb21tYW5kWzBdKTsKKwlmb3IgKGkgPSAxLCBzID0gQ09NTUFORF9TSVpFKGNvbW1hbmRbMF0pOyBpIDwgczsgKytpKQorCQlQUklOVFAoIiUwMnggIiBBTkRQIGNvbW1hbmRbaV0pOworCVBSSU5UUCgiXG4iKTsKKwlyZXR1cm4gbGVuIC0gc3RhcnQ7Cit9CisKKy8qKgorICoJc3ByaW50Zl9TY3NpX0NtbmQJLQlwcmludCBhIHNjc2kgY29tbWFuZAorICoJQGJ1ZmZlcjogYnVmZnIgdG8gcHJpbnQgaW50bworICoJQGxlbjogYnVmZmVyIGxlbmd0aAorICoJQGNtZDogU0NTSSBjb21tYW5kIGJsb2NrCisgKgkKKyAqCVByaW50IG91dCB0aGUgdGFyZ2V0IGFuZCBjb21tYW5kIGRhdGEgaW4gaGV4CisgKi8KKworc3RhdGljIGludCBzcHJpbnRfU2NzaV9DbW5kKGNoYXIgKmJ1ZmZlciwgaW50IGxlbiwgU2NzaV9DbW5kICogY21kKQoreworCWludCBzdGFydCA9IGxlbjsKKwlQUklOVFAoImhvc3QgbnVtYmVyICVkIGRlc3RpbmF0aW9uIHRhcmdldCAlZCwgbHVuICVkXG4iIEFORFAgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8gQU5EUCBjbWQtPmRldmljZS0+aWQgQU5EUCBjbWQtPmRldmljZS0+bHVuKTsKKwlQUklOVFAoIiAgICAgICAgY29tbWFuZCA9ICIpOworCWxlbiArPSBzcHJpbnRfY29tbWFuZChidWZmZXIsIGxlbiwgY21kLT5jbW5kKTsKKwlyZXR1cm4gbGVuIC0gc3RhcnQ7Cit9CisKKy8qKgorICoJZ2VuZXJpY19OQ1I1MzgwX3Byb2NfaW5mbwktCS9wcm9jIGZvciBOQ1I1MzgwIGRyaXZlcgorICoJQGJ1ZmZlcjogYnVmZmVyIHRvIHByaW50IGludG8KKyAqCUBzdGFydDogc3RhcnQgcG9zaXRpb24KKyAqCUBvZmZzZXQ6IG9mZnNldCBpbnRvIGJ1ZmZlcgorICoJQGxlbjogbGVuZ3RoCisgKglAaG9zdG5vOiBpbnN0YW5jZSB0byBhZmZlY3QKKyAqCUBpbm91dDogcmVhZC93cml0ZQorICoKKyAqCVByb3ZpZGUgdGhlIHByb2NmcyBpbmZvcm1hdGlvbiBmb3IgdGhlIDUzODAgY29udHJvbGxlci4gV2UgZmlsbAorICoJdGhpcyB3aXRoIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW5jbHVkaW5nIHRoZSBjb21tYW5kcworICoJYmVpbmcgZXhlY3V0ZWQsIGRpc2Nvbm5lY3RlZCBjb21tYW5kIHF1ZXVlIGFuZCB0aGUgc3RhdGlzdGljYWwKKyAqCWRhdGEKKyAqCisgKglMb2NrczogZ2xvYmFsIGNsaS9sb2NrIGZvciBxdWV1ZSB3YWxrCisgKi8KKyAKK3N0YXRpYyBpbnQgZ2VuZXJpY19OQ1I1MzgwX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX3B0ciwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworCWludCBsZW4gPSAwOworCU5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJaW50IGk7CisJU2NzaV9DbW5kICpwdHI7CisJc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKmhvc3RkYXRhOworI2lmZGVmIE5DUjUzODBfU1RBVFMKKwlTY3NpX0RldmljZSAqZGV2OworCWV4dGVybiBjb25zdCBjaGFyICpjb25zdCBzY3NpX2RldmljZV90eXBlc1tNQVhfU0NTSV9ERVZJQ0VfQ09ERV07CisjZW5kaWYKKworCU5DUjUzODBfc2V0dXAoc2NzaV9wdHIpOworCWhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopIHNjc2lfcHRyLT5ob3N0ZGF0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNjc2lfcHRyLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlQUklOVFAoIlNDU0kgaG9zdCBudW1iZXIgJWQgOiAlc1xuIiBBTkRQIHNjc2lfcHRyLT5ob3N0X25vIEFORFAgc2NzaV9wdHItPmhvc3R0LT5uYW1lKTsKKwlQUklOVFAoIkdlbmVyaWMgTkNSNTM4MCBkcml2ZXIgdmVyc2lvbiAlZFxuIiBBTkRQIEdFTkVSSUNfTkNSNTM4MF9QVUJMSUNfUkVMRUFTRSk7CisJUFJJTlRQKCJOQ1I1MzgwIGNvcmUgdmVyc2lvbiAlZFxuIiBBTkRQIE5DUjUzODBfUFVCTElDX1JFTEVBU0UpOworI2lmZGVmIE5DUjUzQzQwMAorCVBSSU5UUCgiTkNSNTNDNDAwIGV4dGVuc2lvbiB2ZXJzaW9uICVkXG4iIEFORFAgTkNSNTNDNDAwX1BVQkxJQ19SRUxFQVNFKTsKKwlQUklOVFAoIk5DUjUzQzQwMCBjYXJkJXMgZGV0ZWN0ZWRcbiIgQU5EUCgoKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopIHNjc2lfcHRyLT5ob3N0ZGF0YSktPmZsYWdzICYgRkxBR19OQ1I1M0M0MDApID8gIiIgOiAiIG5vdCIpOworIyBpZiBOQ1I1M0M0MDBfUFNFVURPX0RNQQorCVBSSU5UUCgiTkNSNTNDNDAwIHBzZXVkbyBETUEgdXNlZFxuIik7CisjIGVuZGlmCisjZWxzZQorCVBSSU5UUCgiTk8gTkNSNTNDNDAwIGRyaXZlciBleHRlbnNpb25zXG4iKTsKKyNlbmRpZgorCVBSSU5UUCgiVXNpbmcgJXMgbWFwcGluZyBhdCAlcyAweCVseCwgIiBBTkRQIFNUUlZBTChOQ1I1MzgwX21hcF9jb25maWcpIEFORFAgU1RSVkFMKE5DUjUzODBfbWFwX25hbWUpIEFORFAgc2NzaV9wdHItPk5DUjUzODBfaW5zdGFuY2VfbmFtZSk7CisJaWYgKHNjc2lfcHRyLT5pcnEgPT0gU0NTSV9JUlFfTk9ORSkKKwkJUFJJTlRQKCJubyBpbnRlcnJ1cHRcbiIpOworCWVsc2UKKwkJUFJJTlRQKCJvbiBpbnRlcnJ1cHQgJWRcbiIgQU5EUCBzY3NpX3B0ci0+aXJxKTsKKworI2lmZGVmIE5DUjUzODBfU1RBVFMKKwlpZiAoaG9zdGRhdGEtPmNvbm5lY3RlZCB8fCBob3N0ZGF0YS0+aXNzdWVfcXVldWUgfHwgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSkKKwkJUFJJTlRQKCJUaGVyZSBhcmUgY29tbWFuZHMgcGVuZGluZywgdHJhbnNmZXIgcmF0ZXMgbWF5IGJlIGNydWRcbiIpOworCWlmIChob3N0ZGF0YS0+cGVuZGluZ3IpCisJCVBSSU5UUCgiICAlZCBwZW5kaW5nIHJlYWRzIiBBTkRQIGhvc3RkYXRhLT5wZW5kaW5ncik7CisJaWYgKGhvc3RkYXRhLT5wZW5kaW5ndykKKwkJUFJJTlRQKCIgICVkIHBlbmRpbmcgd3JpdGVzIiBBTkRQIGhvc3RkYXRhLT5wZW5kaW5ndyk7CisJaWYgKGhvc3RkYXRhLT5wZW5kaW5nciB8fCBob3N0ZGF0YS0+cGVuZGluZ3cpCisJCVBSSU5UUCgiXG4iKTsKKwlzaG9zdF9mb3JfZWFjaF9kZXZpY2UoZGV2LCBzY3NpX3B0cikgeworCQl1bnNpZ25lZCBsb25nIGJyID0gaG9zdGRhdGEtPmJ5dGVzX3JlYWRbZGV2LT5pZF07CisJCXVuc2lnbmVkIGxvbmcgYncgPSBob3N0ZGF0YS0+Ynl0ZXNfd3JpdGVbZGV2LT5pZF07CisJCWxvbmcgdHIgPSBob3N0ZGF0YS0+dGltZV9yZWFkW2Rldi0+aWRdIC8gSFo7CisJCWxvbmcgdHcgPSBob3N0ZGF0YS0+dGltZV93cml0ZVtkZXYtPmlkXSAvIEhaOworCisJCVBSSU5UUCgiICBUOiVkICVzICIgQU5EUCBkZXYtPmlkIEFORFAoZGV2LT50eXBlIDwgTUFYX1NDU0lfREVWSUNFX0NPREUpID8gc2NzaV9kZXZpY2VfdHlwZXNbKGludCkgZGV2LT50eXBlXSA6ICJVbmtub3duIik7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQlpZiAoZGV2LT52ZW5kb3JbaV0gPj0gMHgyMCkKKwkJCQkqKGJ1ZmZlciArIChsZW4rKykpID0gZGV2LT52ZW5kb3JbaV07CisJCSooYnVmZmVyICsgKGxlbisrKSkgPSAnICc7CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJaWYgKGRldi0+bW9kZWxbaV0gPj0gMHgyMCkKKwkJCQkqKGJ1ZmZlciArIChsZW4rKykpID0gZGV2LT5tb2RlbFtpXTsKKwkJKihidWZmZXIgKyAobGVuKyspKSA9ICcgJzsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCWlmIChkZXYtPnJldltpXSA+PSAweDIwKQorCQkJCSooYnVmZmVyICsgKGxlbisrKSkgPSBkZXYtPnJldltpXTsKKwkJKihidWZmZXIgKyAobGVuKyspKSA9ICcgJzsKKworCQlQUklOVFAoIlxuJTEwbGQga2IgcmVhZCAgICBpbiAlNWxkIHNlY3MiIEFORFAgYnIgLyAxMDI0IEFORFAgdHIpOworCQlpZiAodHIpCisJCQlQUklOVFAoIiBAICU1bGQgYnBzIiBBTkRQIGJyIC8gdHIpOworCisJCVBSSU5UUCgiXG4lMTBsZCBrYiB3cml0dGVuIGluICU1bGQgc2VjcyIgQU5EUCBidyAvIDEwMjQgQU5EUCB0dyk7CisJCWlmICh0dykKKwkJCVBSSU5UUCgiIEAgJTVsZCBicHMiIEFORFAgYncgLyB0dyk7CisJCVBSSU5UUCgiXG4iKTsKKwl9CisjZW5kaWYKKworCXN0YXR1cyA9IE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKTsKKwlpZiAoIShzdGF0dXMgJiBTUl9SRVEpKQorCQlQUklOVFAoIlJFUSBub3QgYXNzZXJ0ZWQsIHBoYXNlIHVua25vd24uXG4iKTsKKwllbHNlIHsKKwkJZm9yIChpID0gMDsgKHBoYXNlc1tpXS52YWx1ZSAhPSBQSEFTRV9VTktOT1dOKSAmJiAocGhhc2VzW2ldLnZhbHVlICE9IChzdGF0dXMgJiBQSEFTRV9NQVNLKSk7ICsraSk7CisJCVBSSU5UUCgiUGhhc2UgJXNcbiIgQU5EUCBwaGFzZXNbaV0ubmFtZSk7CisJfQorCisJaWYgKCFob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJCVBSSU5UUCgiTm8gY3VycmVudGx5IGNvbm5lY3RlZCBjb21tYW5kXG4iKTsKKwl9IGVsc2UgeworCQlsZW4gKz0gc3ByaW50X1Njc2lfQ21uZChidWZmZXIsIGxlbiwgKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+Y29ubmVjdGVkKTsKKwl9CisKKwlQUklOVFAoImlzc3VlX3F1ZXVlXG4iKTsKKworCWZvciAocHRyID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7IHB0cjsgcHRyID0gKFNjc2lfQ21uZCAqKSBwdHItPmhvc3Rfc2NyaWJibGUpCisJCWxlbiArPSBzcHJpbnRfU2NzaV9DbW5kKGJ1ZmZlciwgbGVuLCBwdHIpOworCisJUFJJTlRQKCJkaXNjb25uZWN0ZWRfcXVldWVcbiIpOworCisJZm9yIChwdHIgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWU7IHB0cjsgcHRyID0gKFNjc2lfQ21uZCAqKSBwdHItPmhvc3Rfc2NyaWJibGUpCisJCWxlbiArPSBzcHJpbnRfU2NzaV9DbW5kKGJ1ZmZlciwgbGVuLCBwdHIpOworCisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCWxlbiAtPSBvZmZzZXQ7CisJaWYgKGxlbiA+IGxlbmd0aCkKKwkJbGVuID0gbGVuZ3RoOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2NzaV9wdHItPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBsZW47Cit9CisKKyN1bmRlZiBQUklOVFAKKyN1bmRlZiBBTkRQCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX2luZm8gICAgICAJPSBnZW5lcmljX05DUjUzODBfcHJvY19pbmZvLAorCS5uYW1lICAgICAgICAgICAJPSAiR2VuZXJpYyBOQ1I1MzgwL05DUjUzQzQwMCBTY3NpIERyaXZlciIsCisJLmRldGVjdCAgICAgICAgIAk9IGdlbmVyaWNfTkNSNTM4MF9kZXRlY3QsCisJLnJlbGVhc2UgICAgICAgIAk9IGdlbmVyaWNfTkNSNTM4MF9yZWxlYXNlX3Jlc291cmNlcywKKwkuaW5mbyAgICAgICAgICAgCT0gZ2VuZXJpY19OQ1I1MzgwX2luZm8sCisJLnF1ZXVlY29tbWFuZCAgIAk9IGdlbmVyaWNfTkNSNTM4MF9xdWV1ZV9jb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gZ2VuZXJpY19OQ1I1MzgwX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGdlbmVyaWNfTkNSNTM4MF9idXNfcmVzZXQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gZ2VuZXJpY19OQ1I1MzgwX2RldmljZV9yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCT0gZ2VuZXJpY19OQ1I1MzgwX2hvc3RfcmVzZXQsCisJLmJpb3NfcGFyYW0gICAgIAk9IE5DUjUzODBfQklPU1BBUkFNLAorCS5jYW5fcXVldWUgICAgICAJPSBDQU5fUVVFVUUsCisgICAgICAgIC50aGlzX2lkICAgICAgICAJPSA3LAorICAgICAgICAuc2dfdGFibGVzaXplICAgCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1biAgICAJPSBDTURfUEVSX0xVTiwKKyAgICAgICAgLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORywKK307CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworbW9kdWxlX3BhcmFtKG5jcl9pcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obmNyX2RtYSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShuY3JfYWRkciwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShuY3JfNTM4MCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShuY3JfNTNjNDAwLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG5jcl81M2M0MDBhLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGR0Y18zMTgxZSwgaW50LCAwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCitzdGF0aWMgc3RydWN0IGlzYXBucF9kZXZpY2VfaWQgaWRfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXsKKwkgSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkgSVNBUE5QX1ZFTkRPUignRCcsICdUJywgJ0MnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4NDM2ZSksCisJIDB9LAorCXswfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpc2FwbnAsIGlkX3RhYmxlKTsKKworCitfX3NldHVwKCJuY3I1MzgwPSIsIGRvX05DUjUzODBfc2V0dXApOworX19zZXR1cCgibmNyNTNjNDAwPSIsIGRvX05DUjUzQzQwMF9zZXR1cCk7CitfX3NldHVwKCJuY3I1M2M0MDBhPSIsIGRvX05DUjUzQzQwMEFfc2V0dXApOworX19zZXR1cCgiZHRjMzE4MWU9IiwgZG9fRFRDMzE4MUVfc2V0dXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2dfTkNSNTM4MC5oIGIvZHJpdmVycy9zY3NpL2dfTkNSNTM4MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMDRjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZ19OQ1I1MzgwLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBHZW5lcmljIEdlbmVyaWMgTkNSNTM4MCBkcml2ZXIgZGVmaW5lcworICoKKyAqIENvcHlyaWdodCAxOTkzLCBEcmV3IEVja2hhcmR0CisgKglWaXNpb25hcnkgQ29tcHV0aW5nCisgKgkoVW5peCBhbmQgTGludXggY29uc3VsdGluZyBhbmQgY3VzdG9tIHByb2dyYW1taW5nKQorICoJZHJld0Bjb2xvcmFkby5lZHUKKyAqICAgICAgKzEgKDMwMykgNDQwLTQ4OTQKKyAqCisgKiBOQ1I1M0M0MDAgZXh0ZW5zaW9ucyAoYykgMTk5NCwxOTk1LDE5OTYsIEtldmluIExlbnRpbgorICogICAgSy5MZW50aW5AY3MubW9uYXNoLmVkdS5hdQorICoKKyAqIEFMUEhBIFJFTEVBU0UgMS4gCisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0IAorICoKKyAqIE5DUiA1MzgwIEZhbWlseQorICogU0NTSSBQcm90b2NvbCBDb250cm9sbGVyCisgKiBEYXRhYm9vaworICoKKyAqIE5DUiBNaWNyb2VsZWN0cm9uaWNzCisgKiAxNjM1IEFlcm9wbGF6YSBEcml2ZQorICogQ29sb3JhZG8gU3ByaW5ncywgQ08gODA5MTYKKyAqIDErICg3MTkpIDU3OC0zNDAwCisgKiAxKyAoODAwKSAzMzQtNTQ1NAorICovCisKKy8qCisgKiAkTG9nOiBnZW5lcmljX05DUjUzODAuaCx2ICQKKyAqLworCisjaWZuZGVmIEdFTkVSSUNfTkNSNTM4MF9ICisjZGVmaW5lIEdFTkVSSUNfTkNSNTM4MF9ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2RlZmluZSBHRU5FUklDX05DUjUzODBfUFVCTElDX1JFTEVBU0UgMQorCisjaWZkZWYgTkNSNTNDNDAwCisjZGVmaW5lIEJJT1NQQVJBTQorI2RlZmluZSBOQ1I1MzgwX0JJT1NQQVJBTSBnZW5lcmljX05DUjUzODBfYmlvc3BhcmFtCisjZWxzZQorI2RlZmluZSBOQ1I1MzgwX0JJT1NQQVJBTSBOVUxMCisjZW5kaWYKKworI2lmbmRlZiBBU00KK3N0YXRpYyBpbnQgZ2VuZXJpY19OQ1I1MzgwX2Fib3J0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgZ2VuZXJpY19OQ1I1MzgwX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKik7CitzdGF0aWMgaW50IGdlbmVyaWNfTkNSNTM4MF9yZWxlYXNlX3Jlc291cmNlcyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIGludCBnZW5lcmljX05DUjUzODBfcXVldWVfY29tbWFuZChTY3NpX0NtbmQgKiwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSk7CitzdGF0aWMgaW50IGdlbmVyaWNfTkNSNTM4MF9idXNfcmVzZXQoU2NzaV9DbW5kICopOworc3RhdGljIGludCBnZW5lcmljX05DUjUzODBfaG9zdF9yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IGdlbmVyaWNfTkNSNTM4MF9kZXZpY2VfcmVzZXQoU2NzaV9DbW5kICopOworc3RhdGljIGNvbnN0IGNoYXIqIGdlbmVyaWNfTkNSNTM4MF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKik7CisKKyNpZm5kZWYgQ01EX1BFUl9MVU4KKyNkZWZpbmUgQ01EX1BFUl9MVU4gMgorI2VuZGlmCisKKyNpZm5kZWYgQ0FOX1FVRVVFCisjZGVmaW5lIENBTl9RVUVVRSAxNgorI2VuZGlmCisKKyNpZm5kZWYgSE9TVFNfQworCisjZGVmaW5lIF9fU1RSVkFMKHgpICN4CisjZGVmaW5lIFNUUlZBTCh4KSBfX1NUUlZBTCh4KQorCisjaWZuZGVmIENPTkZJR19TQ1NJX0dfTkNSNTM4MF9NRU0KKworI2RlZmluZSBOQ1I1MzgwX21hcF9jb25maWcgcG9ydAorI2RlZmluZSBOQ1I1MzgwX21hcF90eXBlIGludAorI2RlZmluZSBOQ1I1MzgwX21hcF9uYW1lIHBvcnQKKyNkZWZpbmUgTkNSNTM4MF9pbnN0YW5jZV9uYW1lIGlvX3BvcnQKKyNkZWZpbmUgTkNSNTNDNDAwX3JlZ2lzdGVyX29mZnNldCAwCisjZGVmaW5lIE5DUjUzQzQwMF9hZGRyZXNzX2FkanVzdCA4CisKKyNpZmRlZiBOQ1I1M0M0MDAKKyNkZWZpbmUgTkNSNTM4MF9yZWdpb25fc2l6ZSAxNgorI2Vsc2UKKyNkZWZpbmUgTkNSNTM4MF9yZWdpb25fc2l6ZSA4CisjZW5kaWYKKworI2RlZmluZSBOQ1I1MzgwX3JlYWQocmVnKSAoaW5iKE5DUjUzODBfbWFwX25hbWUgKyAocmVnKSkpCisjZGVmaW5lIE5DUjUzODBfd3JpdGUocmVnLCB2YWx1ZSkgKG91dGIoKHZhbHVlKSwgKE5DUjUzODBfbWFwX25hbWUgKyAocmVnKSkpKQorCisjZWxzZSAKKy8qIHRoZXJlZm9yZSBDT05GSUdfU0NTSV9HX05DUjUzODBfTUVNICovCisKKyNkZWZpbmUgTkNSNTM4MF9tYXBfY29uZmlnIG1lbW9yeQorI2RlZmluZSBOQ1I1MzgwX21hcF90eXBlIHVuc2lnbmVkIGxvbmcKKyNkZWZpbmUgTkNSNTM4MF9tYXBfbmFtZSBiYXNlCisjZGVmaW5lIE5DUjUzODBfaW5zdGFuY2VfbmFtZSBiYXNlCisjZGVmaW5lIE5DUjUzQzQwMF9yZWdpc3Rlcl9vZmZzZXQgMHgxMDgKKyNkZWZpbmUgTkNSNTNDNDAwX2FkZHJlc3NfYWRqdXN0IDAKKyNkZWZpbmUgTkNSNTNDNDAwX21lbV9iYXNlIDB4Mzg4MAorI2RlZmluZSBOQ1I1M0M0MDBfaG9zdF9idWZmZXIgMHgzOTAwCisjZGVmaW5lIE5DUjUzODBfcmVnaW9uX3NpemUgMHgzYTAwCisKKyNkZWZpbmUgTkNSNTM4MF9yZWFkKHJlZykgaXNhX3JlYWRiKE5DUjUzODBfbWFwX25hbWUgKyBOQ1I1M0M0MDBfbWVtX2Jhc2UgKyAocmVnKSkKKyNkZWZpbmUgTkNSNTM4MF93cml0ZShyZWcsIHZhbHVlKSBpc2Ffd3JpdGViKHZhbHVlLCBOQ1I1MzgwX21hcF9uYW1lICsgTkNSNTNDNDAwX21lbV9iYXNlICsgKHJlZykpCisjZW5kaWYKKworI2RlZmluZSBOQ1I1MzgwX2ltcGxlbWVudGF0aW9uX2ZpZWxkcyBcCisgICAgTkNSNTM4MF9tYXBfdHlwZSBOQ1I1MzgwX21hcF9uYW1lCisKKyNkZWZpbmUgTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCkgXAorICAgIHJlZ2lzdGVyIE5DUjUzODBfaW1wbGVtZW50YXRpb25fZmllbGRzCisKKyNkZWZpbmUgTkNSNTM4MF9zZXR1cChpbnN0YW5jZSkgXAorICAgIE5DUjUzODBfbWFwX25hbWUgPSAoTkNSNTM4MF9tYXBfdHlwZSkoKGluc3RhbmNlKS0+TkNSNTM4MF9pbnN0YW5jZV9uYW1lKQorCisjZGVmaW5lIE5DUjUzODBfaW50ciBnZW5lcmljX05DUjUzODBfaW50cgorI2RlZmluZSBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQgZ2VuZXJpY19OQ1I1MzgwX3F1ZXVlX2NvbW1hbmQKKyNkZWZpbmUgTkNSNTM4MF9hYm9ydCBnZW5lcmljX05DUjUzODBfYWJvcnQKKyNkZWZpbmUgTkNSNTM4MF9idXNfcmVzZXQgZ2VuZXJpY19OQ1I1MzgwX2J1c19yZXNldAorI2RlZmluZSBOQ1I1MzgwX2RldmljZV9yZXNldCBnZW5lcmljX05DUjUzODBfZGV2aWNlX3Jlc2V0CisjZGVmaW5lIE5DUjUzODBfaG9zdF9yZXNldCBnZW5lcmljX05DUjUzODBfaG9zdF9yZXNldAorI2RlZmluZSBOQ1I1MzgwX3ByZWFkIGdlbmVyaWNfTkNSNTM4MF9wcmVhZAorI2RlZmluZSBOQ1I1MzgwX3B3cml0ZSBnZW5lcmljX05DUjUzODBfcHdyaXRlCisjZGVmaW5lIE5DUjUzODBfcHJvY19pbmZvIG5vdHlldF9nZW5lcmljX3Byb2NfaW5mbworCisjZGVmaW5lIEJPQVJEX05DUjUzODAJMAorI2RlZmluZSBCT0FSRF9OQ1I1M0M0MDAJMQorI2RlZmluZSBCT0FSRF9OQ1I1M0M0MDBBIDIKKyNkZWZpbmUgQk9BUkRfRFRDMzE4MUUJMworCisjZW5kaWYgLyogZWxzZSBkZWYgSE9TVFNfQyAqLworI2VuZGlmIC8qIG5kZWYgQVNNICovCisjZW5kaWYgLyogR0VORVJJQ19OQ1I1MzgwX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2dfTkNSNTM4MF9tbWlvLmMgYi9kcml2ZXJzL3Njc2kvZ19OQ1I1MzgwX21taW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2RkZTcxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2dfTkNSNTM4MF9tbWlvLmMKQEAgLTAsMCArMSwxMCBAQAorLyoKKyAqCVRoZXJlIGlzIHByb2JhYmx5IGEgbmljZXIgd2F5IHRvIGRvIHRoaXMgYnV0IHRoaXMgb25lIG1ha2VzCisgKglwcmV0dHkgb2J2aW91cyB3aGF0IGlzIGhhcHBlbmluZy4gV2UgcmVidWlsZCB0aGUgc2FtZSBmaWxlIHdpdGgKKyAqCWRpZmZlcmVudCBvcHRpb25zIGZvciBtbWlvIHZlcnN1cyBwaW8uCisgKi8KKworI2RlZmluZSBTQ1NJX0dfTkNSNTM4MF9NRU0KKworI2luY2x1ZGUgImdfTkNSNTM4MC5jIgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZ2R0aC5jIGIvZHJpdmVycy9zY3NpL2dkdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzBjYjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2dkdGguYwpAQCAtMCwwICsxLDU3MzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpbnV4IGRyaXZlciBmb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICogSUNQIHZvcnRleCBHbWJIOiAgICBHRFQgSVNBL0VJU0EvUENJIERpc2sgQXJyYXkgQ29udHJvbGxlcnMgICAgICAgICAgKgorICogSW50ZWwgQ29ycG9yYXRpb246ICBTdG9yYWdlIFJBSUQgQ29udHJvbGxlcnMgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogZ2R0aC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTA0IElDUCB2b3J0ZXggR21iSCwgQWNoaW0gTGV1Ym5lciAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTA0IEludGVsIENvcnBvcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTA0IEFkYXB0ZWMgSW5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogPGFjaGltX2xldWJuZXJAYWRhcHRlYy5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQWRkaXRpb25zL0ZpeGVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQm9qaSBUb255IEthbm5hbnRoYW5hbSA8Ym9qaS50Lmthbm5hbnRoYW5hbUBpbnRlbC5jb20+ICAgICAgICAgICAgICAgKgorICogSm9oYW5uZXMgRGlubmVyIDxqb2hhbm5lc19kaW5uZXJAYWRhcHRlYy5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgICAgKgorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgICAgKgorICogb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIGtlcm5lbDsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgKgorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogTGludXgga2VybmVsIDIuMi54LCAyLjQueCwgMi42Lnggc3VwcG9ydGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogJExvZzogZ2R0aC5jLHYgJAorICogUmV2aXNpb24gMS43MyAgMjAwNC8wMy8zMSAxMzozMzowMyAgYWNoaW0KKyAqIFNwZWNpYWwgY29tbWFuZCAweGZkIGltcGxlbWVudGVkIHRvIGRldGVjdCA2NC1iaXQgRE1BIHN1cHBvcnQKKyAqCisgKiBSZXZpc2lvbiAxLjcyICAyMDA0LzAzLzE3IDA4OjU2OjA0ICBhY2hpbQorICogNjQtYml0IERNQSBvbmx5IGVuYWJsZWQgaWYgRlcgPj0geC40MworICoKKyAqIFJldmlzaW9uIDEuNzEgIDIwMDQvMDMvMDUgMTU6NTE6MjkgIGFjaGltCisgKiBTY3JlZW4gc2VydmljZTogc2VwYXJhdGUgbWVzc2FnZSBidWZmZXIsIGJ1Z2ZpeGVzCisgKgorICogUmV2aXNpb24gMS43MCAgMjAwNC8wMi8yNyAxMjoxOTowNyAgYWNoaW0KKyAqIEJ1Z2ZpeDogUmVzZXQgYml0IGluIGNvbmZpZyAoMHhmZSkgY2FsbCByZW1vdmVkCisgKgorICogUmV2aXNpb24gMS42OSAgMjAwNC8wMi8yMCAwOTo1MDoyNCAgYWNoaW0KKyAqIENvbXBhdGliaWxpdHkgY2hhbmdlcyBmb3Iga2VybmVscyA8IDIuNC4yMAorICogQnVnZml4IHNjcmVlbiBzZXJ2aWNlIGNvbW1hbmQgc2l6ZQorICogcGNpX3NldF9kbWFfbWFzaygpIGVycm9yIGhhbmRsaW5nIGFkZGVkCisgKgorICogUmV2aXNpb24gMS42OCAgMjAwNC8wMi8xOSAxNTo0Njo1NCAgYWNoaW0KKyAqIDY0LWJpdCBETUEgYnVnZml4ZXMKKyAqIERyaXZlIHNpemUgYnVnZml4IGZvciBkcml2ZXMgPiAxVEIKKyAqCisgKiBSZXZpc2lvbiAxLjY3ICAyMDA0LzAxLzE0IDEzOjExOjU3ICBhY2hpbQorICogVG9vbCBhY2Nlc3Mgb3ZlciAvcHJvYyBubyBsb25nZXIgc3VwcG9ydGVkCisgKiBCdWdmaXhlcyBJT0NUTHMKKyAqCisgKiBSZXZpc2lvbiAxLjY2ICAyMDAzLzEyLzE5IDE1OjA0OjA2ICBhY2hpbQorICogQnVnZml4ZXMgc3VwcG9ydCBmb3IgZHJpdmVzID4gMlRCCisgKgorICogUmV2aXNpb24gMS42NSAgMjAwMy8xMi8xNSAxMToyMTo1NiAgYWNoaW0KKyAqIDY0LWJpdCBETUEgc3VwcG9ydCBhZGRlZAorICogU3VwcG9ydCBmb3IgZHJpdmVzID4gMiBUQiBpbXBsZW1lbnRlZAorICogS2VybmVscyAyLjIueCwgMi40LngsIDIuNi54IHN1cHBvcnRlZAorICoKKyAqIFJldmlzaW9uIDEuNjQgIDIwMDMvMDkvMTcgMDg6MzA6MjYgIGFjaGltCisgKiBFSVNBL0lTQSBjb250cm9sbGVyIHNjYW4gZGlzYWJsZWQKKyAqIENvbW1hbmQgbGluZSBzd2l0Y2ggcHJvYmVfZWlzYV9pc2EgYWRkZWQKKyAqCisgKiBSZXZpc2lvbiAxLjYzICAyMDAzLzA3LzEyIDE0OjAxOjAwICBEYW5pZWxlIEJlbGx1Y2NpIDxiZWxsdWNkYUB0aXNjYWxpLml0PgorICogTWlub3IgY2xlYW51cHMgaW4gZ2R0aF9pb2N0bC4KKyAqCisgKiBSZXZpc2lvbiAxLjYyICAyMDAzLzAyLzI3IDE1OjAxOjU5ICBhY2hpbQorICogRHluYW1pYyBETUEgbWFwcGluZyBpbXBsZW1lbnRlZAorICogTmV3IChjaGFyYWN0ZXIgZGV2aWNlKSBJT0NUTCBpbnRlcmZhY2UgYWRkZWQKKyAqIE90aGVyIGNvbnRyb2xsZXIgcmVsYXRlZCBjaGFuZ2VzIG1hZGUKKyAqCisgKiBSZXZpc2lvbiAxLjYxICAyMDAyLzExLzA4IDEzOjA5OjUyICBib2ppCisgKiBBZGRlZCBzdXBwb3J0IGZvciBYU0NBTEUgYmFzZWQgUkFJRCBDb250cm9sbGVycworICogRml4ZWQgU0NSRUVOU0VSVklDRSBpbml0aWFsaXphdGlvbiBpbiBTTVAgY2FzZXMKKyAqIEFkZGVkIGNoZWNrcyBmb3IgZ2R0aF9wb2xsaW5nIGJlZm9yZSBHRFRIX0hBX0xPQ0sKKyAqCisgKiBSZXZpc2lvbiAxLjYwICAyMDAyLzAyLzA1IDA5OjM1OjIyICBhY2hpbQorICogTU9EVUxFX0xJQ0VOU0Ugb25seSBpZiBrZXJuZWwgPj0gMi40LjExCisgKgorICogUmV2aXNpb24gMS41OSAgMjAwMi8wMS8zMCAwOTo0NjozMyAgYWNoaW0KKyAqIFNtYWxsIGNoYW5nZXMKKyAqCisgKiBSZXZpc2lvbiAxLjU4ICAyMDAyLzAxLzI5IDE1OjMwOjAyICBhY2hpbQorICogU2V0IGRlZmF1bHQgdmFsdWUgb2Ygc2hhcmVkX2FjY2VzcyB0byBZCisgKiBOZXcgc3RhdHVzIFNfQ0FDSEVfUkVTRVJWIGZvciBjbHVzdGVyaW5nIGFkZGVkCisgKgorICogUmV2aXNpb24gMS41NyAgMjAwMS8wOC8yMSAxMToxNjozNSAgYWNoaW0KKyAqIEJ1Z2ZpeCBmcmVlX2lycSgpCisgKgorICogUmV2aXNpb24gMS41NiAgMjAwMS8wOC8wOSAxMToxOTozOSAgYWNoaW0KKyAqIFNjc2lfSG9zdF9UZW1wbGF0ZSBjaGFuZ2VzCisgKgorICogUmV2aXNpb24gMS41NSAgMjAwMS8wOC8wOSAxMDoxMToyOCAgYWNoaW0KKyAqIENvbW1hbmQgSE9TVF9VTkZSRUVaRV9JTyBiZWZvcmUgY2FjaGUgc2VydmljZSBpbml0LgorICoKKyAqIFJldmlzaW9uIDEuNTQgIDIwMDEvMDcvMjAgMTM6NDg6MTIgIGFjaGltCisgKiBFeHBhbmQ6IGdkdGhfYW5hbHlzZV9oZHJpdmUoKSByZW1vdmVkCisgKgorICogUmV2aXNpb24gMS41MyAgMjAwMS8wNy8xNyAwOTo1Mjo0OSAgYWNoaW0KKyAqIFNtYWxsIE9FTSByZWxhdGVkIGNoYW5nZQorICoKKyAqIFJldmlzaW9uIDEuNTIgIDIwMDEvMDYvMTkgMTU6MDY6MjAgIGFjaGltCisgKiBOZXcgaG9zdCBjb21tYW5kIEdEVF9VTkZSRUVaRV9JTyBhZGRlZAorICoKKyAqIFJldmlzaW9uIDEuNTEgIDIwMDEvMDUvMjIgMDY6NDI6MzcgIGFjaGltCisgKiBQQ0k6IFN1YmRldmljZSBJRCBhZGRlZAorICoKKyAqIFJldmlzaW9uIDEuNTAgIDIwMDEvMDUvMTcgMTM6NDI6MTYgIGFjaGltCisgKiBTdXBwb3J0IGZvciBJbnRlbCBTdG9yYWdlIFJBSUQgQ29udHJvbGxlcnMgYWRkZWQKKyAqCisgKiBSZXZpc2lvbiAxLjUwICAyMDAxLzA1LzE3IDEyOjEyOjM0ICBhY2hpbQorICogU3VwcG9ydCBmb3IgSW50ZWwgU3RvcmFnZSBSQUlEIENvbnRyb2xsZXJzIGFkZGVkCisgKgorICogUmV2aXNpb24gMS40OSAgMjAwMS8wMy8xNSAxNTowNzoxNyAgYWNoaW0KKyAqIE5ldyBfX3NldHVwIGludGVyZmFjZSBmb3IgYm9vdCBjb21tYW5kIGxpbmUgb3B0aW9ucyBhZGRlZAorICoKKyAqIFJldmlzaW9uIDEuNDggIDIwMDEvMDIvMDYgMTI6MzY6MjggIGFjaGltCisgKiBCdWdmaXggQ2x1c3RlciBwcm90b2NvbAorICoKKyAqIFJldmlzaW9uIDEuNDcgIDIwMDEvMDEvMTAgMTQ6NDI6MDYgIGFjaGltCisgKiBOZXcgc3dpdGNoIHNoYXJlZF9hY2Nlc3MgYWRkZWQKKyAqCisgKiBSZXZpc2lvbiAxLjQ2ICAyMDAxLzAxLzA5IDA4OjExOjM1ICBhY2hpbQorICogZ2R0aF9jb21tYW5kKCkgcmVtb3ZlZAorICogbWVhbmluZyBvZiBTY3NpX1BvaW50ZXIgbWVtYmVycyBjaGFuZ2VkCisgKgorICogUmV2aXNpb24gMS40NSAgMjAwMC8xMS8xNiAxMjowMjoyNCAgYWNoaW0KKyAqIENoYW5nZXMgZm9yIGtlcm5lbCAyLjQKKyAqCisgKiBSZXZpc2lvbiAxLjQ0ICAyMDAwLzEwLzExIDA4OjQ0OjEwICBhY2hpbQorICogQ2x1c3RlcmluZyBjaGFuZ2VzOiBOZXcgZmxhZyBtZWRpYV9jaGFuZ2VkIGFkZGVkCisgKgorICogUmV2aXNpb24gMS40MyAgMjAwMC8wOS8yMCAxMjo1OTowMSAgYWNoaW0KKyAqIERQTUVNIHJlbWFwIGZ1bmN0aW9ucyBmb3IgYWxsIFBDSSBjb250cm9sbGVyIHR5cGVzIGltcGxlbWVudGVkCisgKiBTbWFsbCBjaGFuZ2VzIGZvciBpYTY0IHBsYXRmb3JtCisgKgorICogUmV2aXNpb24gMS40MiAgMjAwMC8wNy8yMCAwOTowNDo1MCAgYWNoaW0KKyAqIFNtYWxsIGNoYW5nZXMgZm9yIGtlcm5lbCAyLjQKKyAqCisgKiBSZXZpc2lvbiAxLjQxICAyMDAwLzA3LzA0IDE0OjExOjExICBhY2hpbQorICogZ2R0aF9hbmFseXNlX2hkcml2ZSgpIGFkZGVkIHRvIHJlc2NhbiBkcml2ZXMgYWZ0ZXIgb25saW5lIGV4cGFuc2lvbgorICoKKyAqIFJldmlzaW9uIDEuNDAgIDIwMDAvMDYvMjcgMTE6MjQ6MTYgIGFjaGltCisgKiBDaGFuZ2VzIENsdXN0ZXJpbmcsIFNjcmVlbnNlcnZpY2UKKyAqCisgKiBSZXZpc2lvbiAxLjM5ICAyMDAwLzA2LzE1IDEzOjA5OjA0ICBhY2hpbQorICogQ2hhbmdlcyBmb3IgZ2R0aF9kb19jbWQoKQorICoKKyAqIFJldmlzaW9uIDEuMzggIDIwMDAvMDYvMTUgMTI6MDg6NDMgIGFjaGltCisgKiBCdWdmaXggZ2R0aF9zeW5jX2V2ZW50KCksIHNlcnZpY2UgU0NSRUVOU0VSVklDRQorICogRGF0YSBkaXJlY3Rpb24gZm9yIGNvbW1hbmQgMHhjMiBjaGFuZ2VkIHRvIERPVQorICoKKyAqIFJldmlzaW9uIDEuMzcgIDIwMDAvMDUvMjUgMTM6NTA6MTAgIGFjaGltCisgKiBOZXcgZHJpdmVyIHBhcmFtZXRlciB2aXJ0X2N0ciBhZGRlZAorICoKKyAqIFJldmlzaW9uIDEuMzYgIDIwMDAvMDUvMDQgMDg6NTA6NDYgIGFjaGltCisgKiBFdmVudCBidWZmZXIgbm93IGluIGdkdGhfaGFfc3RyCisgKgorICogUmV2aXNpb24gMS4zNSAgMjAwMC8wMy8wMyAxMDo0NDowOCAgYWNoaW0KKyAqIE5ldyBldmVudF9zdHJpbmcgb25seSB2YWxpZCBmb3IgdGhlIFJQIGNvbnRyb2xsZXIgZmFtaWx5CisgKgorICogUmV2aXNpb24gMS4zNCAgMjAwMC8wMy8wMiAxNDo1NToyOSAgYWNoaW0KKyAqIE5ldyBtZWNoYW5pc20gZm9yIGFzeW5jLiBldmVudCBoYW5kbGluZyBpbXBsZW1lbnRlZAorICoKKyAqIFJldmlzaW9uIDEuMzMgIDIwMDAvMDIvMjEgMTU6Mzc6MzcgIGFjaGltCisgKiBCdWdmaXggQWxwaGEgcGxhdGZvcm0gKyBEUE1FTSBhYm92ZSA0R0IKKyAqCisgKiBSZXZpc2lvbiAxLjMyICAyMDAwLzAyLzE0IDE2OjE3OjM3ICBhY2hpbQorICogQnVnZml4IHNlbnNlX2J1ZmZlcltdICsgcmF3IGRldmljZXMKKyAqCisgKiBSZXZpc2lvbiAxLjMxICAyMDAwLzAyLzEwIDEwOjI5OjAwICBhY2hpbQorICogRGVsZXRlIHNlbnNlX2J1ZmZlclswXSwgaWYgY29tbWFuZCBPSworICoKKyAqIFJldmlzaW9uIDEuMzAgIDE5OTkvMTEvMDIgMTM6NDI6MzkgIGFjaGltCisgKiBBUlJBWV9EUlZfTElTVDIgaW1wbGVtZW50ZWQKKyAqIE5vdyAyNTUgbG9nLiBhbmQgMTAwIGhvc3QgZHJpdmVzIHN1cHBvcnRlZAorICoKKyAqIFJldmlzaW9uIDEuMjkgIDE5OTkvMTAvMDUgMTM6Mjg6NDcgIGFjaGltCisgKiBHRFRfQ0xVU1RfUkVTRVQgYWRkZWQKKyAqCisgKiBSZXZpc2lvbiAxLjI4ICAxOTk5LzA4LzEyIDEzOjQ0OjU0ICBhY2hpbQorICogTU9VTlRBTEwgcmVtb3ZlZAorICogQ2x1c3RlciBkcml2ZXMgLT4gcmVtb3ZlYWJsZSBkcml2ZXMKKyAqCisgKiBSZXZpc2lvbiAxLjI3ICAxOTk5LzA2LzIyIDA3OjIyOjM4ICBhY2hpbQorICogU21hbGwgY2hhbmdlcworICoKKyAqIFJldmlzaW9uIDEuMjYgIDE5OTkvMDYvMTAgMTY6MDk6MTIgIGFjaGltCisgKiBDbHVzdGVyIEhvc3QgRHJpdmUgc3VwcG9ydDogQnVnZml4ZXMKKyAqCisgKiBSZXZpc2lvbiAxLjI1ICAxOTk5LzA2LzAxIDE2OjAzOjU2ICBhY2hpbQorICogZ2R0aF9pbml0X3BjaSgpOiBNYW5pcHVsYXRlIGNvbmZpZy4gc3BhY2UgdG8gc3RhcnQgUlAgY29udHJvbGxlcgorICoKKyAqIFJldmlzaW9uIDEuMjQgIDE5OTkvMDUvMjYgMTE6NTM6MDYgIGFjaGltCisgKiBDbHVzdGVyIEhvc3QgRHJpdmUgc3VwcG9ydCBhZGRlZAorICoKKyAqIFJldmlzaW9uIDEuMjMgIDE5OTkvMDMvMjYgMDk6MTI6MzEgIGFjaGltCisgKiBEZWZhdWx0IHZhbHVlIGZvciBoZHJfY2hhbm5lbCBzZXQgdG8gMAorICoKKyAqIFJldmlzaW9uIDEuMjIgIDE5OTkvMDMvMjIgMTY6Mjc6MTYgIGFjaGltCisgKiBCdWdmaXg6IGdkdGhfc3RvcmVfZXZlbnQoKSBtdXN0IG5vdCBiZSBsb2NrZWQgd2l0aCBHRFRIX0xPQ0tfSEEoKQorICoKKyAqIFJldmlzaW9uIDEuMjEgIDE5OTkvMDMvMTYgMTM6NDA6MzQgIGFjaGltCisgKiBQcm9ibGVtcyB3aXRoIHJlc2VydmVkIGRyaXZlcyBzb2x2ZWQKKyAqIGdkdGhfZWhfYnVzX3Jlc2V0KCkgaW1wbGVtZW50ZWQKKyAqCisgKiBSZXZpc2lvbiAxLjIwICAxOTk5LzAzLzEwIDA5OjA4OjEzICBhY2hpbQorICogQnVnZml4OiBDb3JyZWN0aW9ucyBpbiBnZHRoX2RpcmVjdGlvbl90YWJbXSBtYWRlCisgKiBCdWdmaXg6IEluY3JlYXNlIGNvbW1hbmQgdGltZW91dCAoZ2R0aF91cGRhdGVfdGltZW91dCgpKSBOT1QgaW4gZ2R0aF9wdXRxKCkKKyAqCisgKiBSZXZpc2lvbiAxLjE5ICAxOTk5LzAzLzA1IDE0OjM4OjE2ICBhY2hpbQorICogQnVnZml4OiBIZWFkcy9TZWN0b3JzIG1hcHBpbmcgZm9yIHJlc2VydmVkIGRldmljZXMgcG9zc2libHkgd3JvbmcKKyAqIC0+IGdkdGhfZXZhbF9tYXBwaW5nKCkgaW1wbGVtZW50ZWQsIGNoYW5nZXMgaW4gZ2R0aF9iaW9zX3BhcmFtKCkKKyAqIElOSVRfUkVUUklFUyBzZXQgdG8gMTAwcyB0byBhdm9pZCBERUlOSVQtVGltZW91dCBmb3IgY29udHJvbGxlcnMKKyAqIHdpdGggQklPUyBkaXNhYmxlZCBhbmQgbWVtb3J5IHRlc3Qgc2V0IHRvIEludGVuc2l2ZQorICogRW5oYW5jZWQgL3Byb2Mgc3VwcG9ydAorICoKKyAqIFJldmlzaW9uIDEuMTggIDE5OTkvMDIvMjQgMDk6NTQ6MzMgIGFjaGltCisgKiBDb21tYW5kIGxpbmUgcGFyYW1ldGVyIGhkcl9jaGFubmVsIGltcGxlbWVudGVkCisgKiBCdWdmaXggZm9yIEVJU0EgY29udHJvbGxlcnMgKyBMaW51eCAyLjIueAorICoKKyAqIFJldmlzaW9uIDEuMTcgIDE5OTgvMTIvMTcgMTU6NTg6MTEgIGFjaGltCisgKiBDb21tYW5kIGxpbmUgcGFyYW1ldGVycyBpbXBsZW1lbnRlZAorICogQ2hhbmdlcyBmb3IgQWxwaGEgcGxhdGZvcm1zCisgKiBQQ0kgY29udHJvbGxlciBzY2FuIGNoYW5nZWQKKyAqIFNNUCBzdXBwb3J0IGltcHJvdmVkIChzcGluX2xvY2tfaXJxc2F2ZSgpLC4uLikKKyAqIE5ldyBhc3luYy4gZXZlbnRzLCBuZXcgc2Nhbi9yZXNlcnZlIGNvbW1hbmRzIGluY2x1ZGVkCisgKgorICogUmV2aXNpb24gMS4xNiAgMTk5OC8wOS8yOCAxNjowODo0NiAgYWNoaW0KKyAqIEdEVF9QQ0lNUFI6IERQTUVNIHJlbWFwcGluZywgaWYgcmVxdWlyZWQKKyAqIG1kZWxheSgpIGFkZGVkCisgKgorICogUmV2aXNpb24gMS4xNSAgMTk5OC8wNi8wMyAxNDo1NDowNiAgYWNoaW0KKyAqIGdkdGhfZGVsYXkoKSwgZ2R0aF9mbHVzaCgpIGltcGxlbWVudGVkCisgKiBCdWdmaXg6IGdkdGhfcmVsZWFzZSgpIGNoYW5nZWQKKyAqCisgKiBSZXZpc2lvbiAxLjE0ICAxOTk4LzA1LzIyIDEwOjAxOjE3ICBhY2hpbQorICogbWo6IHBjaWJpb3Nfc3RyZXJyb3IoKSByZW1vdmVkCisgKiBJbXByb3ZlZCBTTVAgc3VwcG9ydCAoaWYgdmVyc2lvbiA+PSAyLjEuOTUpCisgKiBnZHRoX2hhbHQoKTogaGFsdF9jYWxsZWQgZmxhZyBhZGRlZCAoaWYgdmVyc2lvbiA8IDIuMSkKKyAqCisgKiBSZXZpc2lvbiAxLjEzICAxOTk4LzA0LzE2IDA5OjE0OjU3ICBhY2hpbQorICogUmVzZXJ2ZSBkcml2ZXMgKGZvciByYXcgc2VydmljZSkgaW1wbGVtZW50ZWQKKyAqIE5ldyBlcnJvciBoYW5kbGluZyBjb2RlIGVuYWJsZWQKKyAqIEdldCBjb250cm9sbGVyIG5hbWUgZnJvbSBib2FyZF9pbmZvKCkgSU9DVEwKKyAqIEZpbmFsIHJvdW5kIG9mIFBDSSBkZXZpY2UgZHJpdmVyIHBhdGNoZXMgYnkgTWFydGluIE1hcmVzCisgKgorICogUmV2aXNpb24gMS4xMiAgMTk5OC8wMy8wMyAwOTozMjozNyAgYWNoaW0KKyAqIEZpYnJlIGNoYW5uZWwgY29udHJvbGxlciBzdXBwb3J0IGFkZGVkCisgKgorICogUmV2aXNpb24gMS4xMSAgMTk5OC8wMS8yNyAxNjoxOToxNCAgYWNoaW0KKyAqIFNBX1NISVJRIGFkZGVkCisgKiBhZGRfdGltZXIoKS9kZWxfdGltZXIoKSBpbnN0ZWFkIG9mIEdEVEhfVElNRVIKKyAqIHNjc2lfYWRkX3RpbWVyKCkvc2NzaV9kZWxfdGltZXIoKSBpbnN0ZWFkIG9mIFNDU0lfVElNRVIKKyAqIE5ldyBlcnJvciBoYW5kbGluZyBpbmNsdWRlZAorICoKKyAqIFJldmlzaW9uIDEuMTAgIDE5OTcvMTAvMzEgMTI6Mjk6NTcgIGFjaGltCisgKiBSZWFkIGhlYWRzL3NlY3RvcnMgZnJvbSBob3N0IGRyaXZlCisgKgorICogUmV2aXNpb24gMS45ICAxOTk3LzA5LzA0IDEwOjA3OjI1ICBhY2hpbQorICogSU8tbWFwcGluZyB3aXRoIHZpcnRfdG9fYnVzKCksIGdkdGhfcmVhZGIoKSwgZ2R0aF93cml0ZWIoKSwgLi4uCisgKiByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoKSB0byBnZXQgYSBub3RpZnkgb24gc2h1dG93biB1c2VkCisgKgorICogUmV2aXNpb24gMS44ICAxOTk3LzA0LzAyIDEyOjE0OjMwICBhY2hpbQorICogVmVyc2lvbiAxLjAwIChzZWUgZ2R0aC5oKSwgdGVzdGVkIHdpdGgga2VybmVsIDIuMC4yOQorICoKKyAqIFJldmlzaW9uIDEuNyAgMTk5Ny8wMy8xMiAxMzozMzozNyAgYWNoaW0KKyAqIGdkdGhfcmVzZXQoKSBjaGFuZ2VkLCBuZXcgYXN5bmMuIGV2ZW50cworICoKKyAqIFJldmlzaW9uIDEuNiAgMTk5Ny8wMy8wNCAxNDowMToxMSAgYWNoaW0KKyAqIFNodXRkb3duIHJvdXRpbmUgZ2R0aF9oYWx0KCkgaW1wbGVtZW50ZWQKKyAqCisgKiBSZXZpc2lvbiAxLjUgIDE5OTcvMDIvMjEgMDk6MDg6MzYgIGFjaGltCisgKiBOZXcgY29udHJvbGxlciBpbmNsdWRlZCAoUlAsIFJQMSwgUlAyIHNlcmllcykKKyAqIElPQ1RMIGludGVyZmFjZSBpbXBsZW1lbnRlZAorICoKKyAqIFJldmlzaW9uIDEuNCAgMTk5Ni8wNy8wNSAxMjo0ODo1NSAgYWNoaW0KKyAqIEZ1bmN0aW9uIGdkdGhfYmlvc19wYXJhbSgpIGltcGxlbWVudGVkCisgKiBOZXcgY29uc3RhbnQgR0RUSF9NQVhDX1BfTCBpbnNlcnRlZAorICogR0RUX1dSSVRFX1RIUiwgR0RUX0VYVF9JTkZPIGltcGxlbWVudGVkCisgKiBGdW5jdGlvbiBnZHRoX3Jlc2V0KCkgY2hhbmdlZAorICoKKyAqIFJldmlzaW9uIDEuMyAgMTk5Ni8wNS8xMCAwOTowNDo0MSAgYWNoaW0KKyAqIFNtYWxsIGNoYW5nZXMgZm9yIExpbnV4IDEuMi4xMworICoKKyAqIFJldmlzaW9uIDEuMiAgMTk5Ni8wNS8wOSAxMjo0NToyNyAgYWNoaW0KKyAqIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0IGltcGxlbWVudGVkCisgKiAvcHJvYyBzdXBwb3J0IGNvcnJlY3Rpb25zIG1hZGUKKyAqCisgKiBSZXZpc2lvbiAxLjEgIDE5OTYvMDQvMTEgMDc6MzU6NTcgIGFjaGltCisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQWxsIEdEVCBEaXNrIEFycmF5IENvbnRyb2xsZXJzIGFyZSBmdWxseSBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuCisgKiBUaGlzIGluY2x1ZGVzIHRoZSBQQ0kvRUlTQS9JU0EgU0NTSSBEaXNrIEFycmF5IENvbnRyb2xsZXJzIGFuZCB0aGUKKyAqIFBDSSBGaWJyZSBDaGFubmVsIERpc2sgQXJyYXkgQ29udHJvbGxlcnMuIFNlZSBnZHRoLmggZm9yIGEgY29tcGxldGUKKyAqIGxpc3Qgb2YgYWxsIGNvbnRyb2xsZXIgdHlwZXMuCisgKiAKKyAqIElmIHlvdSBoYXZlIG9uZSBvciBtb3JlIEdEVDMwMDAvMzAyMCBFSVNBIGNvbnRyb2xsZXJzIHdpdGggCisgKiBjb250cm9sbGVyIEJJT1MgZGlzYWJsZWQsIHlvdSBoYXZlIHRvIHNldCB0aGUgSVJRIHZhbHVlcyB3aXRoIHRoZSAKKyAqIGNvbW1hbmQgbGluZSBvcHRpb24gImdkdGg9aXJxMSxpcnEyLC4uLiIsIHdoZXJlIHRoZSBpcnExLGlycTIsLi4uIGFyZQorICogdGhlIElSUSB2YWx1ZXMgZm9yIHRoZSBFSVNBIGNvbnRyb2xsZXJzLgorICogCisgKiBBZnRlciB0aGUgb3B0aW9uYWwgbGlzdCBvZiBJUlEgdmFsdWVzLCBvdGhlciBwb3NzaWJsZSAKKyAqIGNvbW1hbmQgbGluZSBvcHRpb25zIGFyZToKKyAqIGRpc2FibGU6WSAgICAgICAgICAgICAgICAgICAgZGlzYWJsZSBkcml2ZXIKKyAqIGRpc2FibGU6TiAgICAgICAgICAgICAgICAgICAgZW5hYmxlIGRyaXZlcgorICogcmVzZXJ2ZV9tb2RlOjAgICAgICAgICAgICAgICByZXNlcnZlIG5vIGRyaXZlcyBmb3IgdGhlIHJhdyBzZXJ2aWNlCisgKiByZXNlcnZlX21vZGU6MSAgICAgICAgICAgICAgIHJlc2VydmUgYWxsIG5vdCBpbml0LiwgcmVtb3ZhYmxlIGRyaXZlcworICogcmVzZXJ2ZV9tb2RlOjIgICAgICAgICAgICAgICByZXNlcnZlIGFsbCBub3QgaW5pdC4gZHJpdmVzCisgKiByZXNlcnZlX2xpc3Q6aCxiLHQsbCxoLGIsdCxsLC4uLiAgICAgcmVzZXJ2ZSBwYXJ0aWN1bGFyIGRyaXZlKHMpIHdpdGggCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtIGNvbnRyb2xsZXIgbm8uLCBiLSBjaGFubmVsIG5vLiwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtIHRhcmdldCBJRCwgbC0gTFVOCisgKiByZXZlcnNlX3NjYW46WSAgICAgICAgICAgICAgIHJldmVyc2Ugc2NhbiBvcmRlciBmb3IgUENJIGNvbnRyb2xsZXJzICAgICAgICAgCisgKiByZXZlcnNlX3NjYW46TiAgICAgICAgICAgICAgIHNjYW4gUENJIGNvbnRyb2xsZXJzIGxpa2UgQklPUworICogbWF4X2lkczp4ICAgICAgICAgICAgICAgICAgICB4IC0gdGFyZ2V0IElEIGNvdW50IHBlciBjaGFubmVsICgxLi5NQVhJRCkKKyAqIHJlc2NhbjpZICAgICAgICAgICAgICAgICAgICAgcmVzY2FuIGFsbCBjaGFubmVscy9JRHMgCisgKiByZXNjYW46TiAgICAgICAgICAgICAgICAgICAgIHVzZSBhbGwgZGV2aWNlcyBmb3VuZCB1bnRpbCBub3cKKyAqIHZpcnRfY3RyOlkgICAgICAgICAgICAgICAgICAgbWFwIGV2ZXJ5IGNoYW5uZWwgdG8gYSB2aXJ0dWFsIGNvbnRyb2xsZXIgCisgKiB2aXJ0X2N0cjpOICAgICAgICAgICAgICAgICAgIHVzZSBtdWx0aSBjaGFubmVsIHN1cHBvcnQgCisgKiBoZHJfY2hhbm5lbDp4ICAgICAgICAgICAgICAgIHggLSBudW1iZXIgb2YgdmlydHVhbCBidXMgZm9yIGhvc3QgZHJpdmVzCisgKiBzaGFyZWRfYWNjZXNzOlkgICAgICAgICAgICAgIGRpc2FibGUgZHJpdmVyIHJlc2VydmUvcmVsZWFzZSBwcm90b2NvbCB0byAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzIGEgc2hhcmVkIHJlc291cmNlIGZyb20gc2V2ZXJhbCBub2RlcywgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJvcGlhdGUgY29udHJvbGxlciBmaXJtd2FyZSByZXF1aXJlZAorICogc2hhcmVkX2FjY2VzczpOICAgICAgICAgICAgICBlbmFibGUgZHJpdmVyIHJlc2VydmUvcmVsZWFzZSBwcm90b2NvbAorICogcHJvYmVfZWlzYV9pc2E6WSAgICAgICAgICAgICBzY2FuIGZvciBFSVNBL0lTQSBjb250cm9sbGVycworICogcHJvYmVfZWlzYV9pc2E6TiAgICAgICAgICAgICBkbyBub3Qgc2NhbiBmb3IgRUlTQS9JU0EgY29udHJvbGxlcnMKKyAqIGZvcmNlX2RtYTMyOlkgICAgICAgICAgICAgICAgdXNlIG9ubHkgMzIgYml0IERNQSBtb2RlCisgKiBmb3JjZV9kbWEzMjpOICAgICAgICAgICAgICAgIHVzZSA2NCBiaXQgRE1BIG1vZGUsIGlmIHN1cHBvcnRlZAorICoKKyAqIFRoZSBkZWZhdWx0IHZhbHVlcyBhcmU6ICJnZHRoPWRpc2FibGU6TixyZXNlcnZlX21vZGU6MSxyZXZlcnNlX3NjYW46TiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfaWRzOjEyNyxyZXNjYW46Tix2aXJ0X2N0cjpOLGhkcl9jaGFubmVsOjAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2FjY2VzczpZLHByb2JlX2Vpc2FfaXNhOk4sZm9yY2VfZG1hMzI6TiIuCisgKiBIZXJlIGlzIGFub3RoZXIgZXhhbXBsZTogImdkdGg9cmVzZXJ2ZV9saXN0OjAsMSwyLDAsMCwxLDMsMCxyZXNjYW46WSIuCisgKiAKKyAqIFdoZW4gbG9hZGluZyB0aGUgZ2R0aCBkcml2ZXIgYXMgYSBtb2R1bGUsIHRoZSBzYW1lIG9wdGlvbnMgYXJlIGF2YWlsYWJsZS4gCisgKiBZb3UgY2FuIHNldCB0aGUgSVJRcyB3aXRoICJJUlE9Li4uIi4gSG93ZXZlciwgdGhlIHN5bnRheCB0byBzcGVjaWZ5IHRoZQorICogb3B0aW9ucyBjaGFuZ2VzIHNsaWdodGx5LiBZb3UgbXVzdCByZXBsYWNlIGFsbCAnLCcgYmV0d2VlbiBvcHRpb25zIAorICogd2l0aCAnICcgYW5kIGFsbCAnOicgd2l0aCAnPScgYW5kIHlvdSBtdXN0IHVzZSAKKyAqICcxJyBpbiBwbGFjZSBvZiAnWScgYW5kICcwJyBpbiBwbGFjZSBvZiAnTicuCisgKiAKKyAqIERlZmF1bHQ6ICJtb2Rwcm9iZSBnZHRoIGRpc2FibGU9MCByZXNlcnZlX21vZGU9MSByZXZlcnNlX3NjYW49MAorICogICAgICAgICAgIG1heF9pZHM9MTI3IHJlc2Nhbj0wIHZpcnRfY3RyPTAgaGRyX2NoYW5uZWw9MCBzaGFyZWRfYWNjZXNzPTAgCisgKiAgICAgICAgICAgcHJvYmVfZWlzYV9pc2E9MCBmb3JjZV9kbWEzMj0wIgorICogVGhlIG90aGVyIGV4YW1wbGU6ICJtb2Rwcm9iZSBnZHRoIHJlc2VydmVfbGlzdD0wLDEsMiwwLDAsMSwzLDAgcmVzY2FuPTEiLgorICovCisKKy8qIFRoZSBtZWFuaW5nIG9mIHRoZSBTY3NpX1BvaW50ZXIgbWVtYmVycyBpbiB0aGlzIGRyaXZlciBpcyBhcyBmb2xsb3dzOgorICogcHRyOiAgICAgICAgICAgICAgICAgICAgIENoYWluaW5nCisgKiB0aGlzX3Jlc2lkdWFsOiAgICAgICAgICAgQ29tbWFuZCBwcmlvcml0eQorICogYnVmZmVyOiAgICAgICAgICAgICAgICAgIHBoeXMuIERNQSBzZW5zZSBidWZmZXIgCisgKiBkbWFfaGFuZGxlOiAgICAgICAgICAgICAgcGh5cy4gRE1BIGJ1ZmZlciAoa2VybmVsID49IDIuNC4wKQorICogYnVmZmVyc19yZXNpZHVhbDogICAgICAgIFRpbWVvdXQgdmFsdWUKKyAqIFN0YXR1czogICAgICAgICAgICAgICAgICBDb21tYW5kIHN0YXR1cyAoZ2R0aF9kb19jbWQoKSksIERNQSBtZW0uIG1hcHBpbmdzCisgKiBNZXNzYWdlOiAgICAgICAgICAgICAgICAgQWRkaXRpb25hbCBpbmZvIChnZHRoX2RvX2NtZCgpKSwgRE1BIGRpcmVjdGlvbgorICogaGF2ZV9kYXRhX2luOiAgICAgICAgICAgIEZsYWcgZm9yIGdkdGhfd2FpdF9jb21wbGV0aW9uKCkKKyAqIHNlbnRfY29tbWFuZDogICAgICAgICAgICBPcGNvZGUgc3BlY2lhbCBjb21tYW5kCisgKiBwaGFzZTogICAgICAgICAgICAgICAgICAgU2VydmljZS9wYXJhbWV0ZXIvcmV0dXJuIGNvZGUgc3BlY2lhbCBjb21tYW5kCisgKi8KKworCisvKiBpbnRlcnJ1cHQgY29hbGVzY2luZyAqLworLyogI2RlZmluZSBJTlRfQ09BTCAqLworCisvKiBzdGF0aXN0aWNzICovCisjZGVmaW5lIEdEVEhfU1RBVElTVElDUworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpZmRlZiBHRFRIX1JUQworI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNlbHNlCisjaW5jbHVkZSA8bGludXgvYmxrLmg+CisjaW5jbHVkZSAic2QuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiZ2R0aC5oIgorI2luY2x1ZGUgImdkdGhfa2NvbXBhdC5oIgorCitzdGF0aWMgdm9pZCBnZHRoX2RlbGF5KGludCBtaWxsaXNlY29uZHMpOworc3RhdGljIHZvaWQgZ2R0aF9ldmFsX21hcHBpbmcodWxvbmczMiBzaXplLCB1bG9uZzMyICpjeWxzLCBpbnQgKmhlYWRzLCBpbnQgKnNlY3MpOworc3RhdGljIGlycXJldHVybl90IGdkdGhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCBnZHRoX3N5bmNfZXZlbnQoaW50IGhhbnVtLGludCBzZXJ2aWNlLHVuY2hhciBpbmRleCxTY3NpX0NtbmQgKnNjcCk7CitzdGF0aWMgaW50IGdkdGhfYXN5bmNfZXZlbnQoaW50IGhhbnVtKTsKK3N0YXRpYyB2b2lkIGdkdGhfbG9nX2V2ZW50KGdkdGhfZXZ0X2RhdGEgKmR2ciwgY2hhciAqYnVmZmVyKTsKKworc3RhdGljIHZvaWQgZ2R0aF9wdXRxKGludCBoYW51bSxTY3NpX0NtbmQgKnNjcCx1bmNoYXIgcHJpb3JpdHkpOworc3RhdGljIHZvaWQgZ2R0aF9uZXh0KGludCBoYW51bSk7CitzdGF0aWMgaW50IGdkdGhfZmlsbF9yYXdfY21kKGludCBoYW51bSxTY3NpX0NtbmQgKnNjcCx1bmNoYXIgYik7CitzdGF0aWMgaW50IGdkdGhfc3BlY2lhbF9jbWQoaW50IGhhbnVtLFNjc2lfQ21uZCAqc2NwKTsKK3N0YXRpYyBnZHRoX2V2dF9zdHIgKmdkdGhfc3RvcmVfZXZlbnQoZ2R0aF9oYV9zdHIgKmhhLCB1c2hvcnQgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgaWR4LCBnZHRoX2V2dF9kYXRhICpldnQpOworc3RhdGljIGludCBnZHRoX3JlYWRfZXZlbnQoZ2R0aF9oYV9zdHIgKmhhLCBpbnQgaGFuZGxlLCBnZHRoX2V2dF9zdHIgKmVzdHIpOworc3RhdGljIHZvaWQgZ2R0aF9yZWFkYXBwX2V2ZW50KGdkdGhfaGFfc3RyICpoYSwgdW5jaGFyIGFwcGxpY2F0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZHRoX2V2dF9zdHIgKmVzdHIpOworc3RhdGljIHZvaWQgZ2R0aF9jbGVhcl9ldmVudHModm9pZCk7CisKK3N0YXRpYyB2b2lkIGdkdGhfY29weV9pbnRlcm5hbF9kYXRhKGludCBoYW51bSxTY3NpX0NtbmQgKnNjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZmZlcix1c2hvcnQgY291bnQpOworc3RhdGljIGludCBnZHRoX2ludGVybmFsX2NhY2hlX2NtZChpbnQgaGFudW0sU2NzaV9DbW5kICpzY3ApOworc3RhdGljIGludCBnZHRoX2ZpbGxfY2FjaGVfY21kKGludCBoYW51bSxTY3NpX0NtbmQgKnNjcCx1c2hvcnQgaGRyaXZlKTsKKworc3RhdGljIGludCBnZHRoX3NlYXJjaF9laXNhKHVzaG9ydCBlaXNhX2Fkcik7CitzdGF0aWMgaW50IGdkdGhfc2VhcmNoX2lzYSh1bG9uZzMyIGJpb3NfYWRyKTsKK3N0YXRpYyBpbnQgZ2R0aF9zZWFyY2hfcGNpKGdkdGhfcGNpX3N0ciAqcGNpc3RyKTsKK3N0YXRpYyB2b2lkIGdkdGhfc2VhcmNoX2RldihnZHRoX3BjaV9zdHIgKnBjaXN0ciwgdXNob3J0ICpjbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCB2ZW5kb3IsIHVzaG9ydCBkZXYpOworc3RhdGljIHZvaWQgZ2R0aF9zb3J0X3BjaShnZHRoX3BjaV9zdHIgKnBjaXN0ciwgaW50IGNudCk7CitzdGF0aWMgaW50IGdkdGhfaW5pdF9laXNhKHVzaG9ydCBlaXNhX2FkcixnZHRoX2hhX3N0ciAqaGEpOworc3RhdGljIGludCBnZHRoX2luaXRfaXNhKHVsb25nMzIgYmlvc19hZHIsZ2R0aF9oYV9zdHIgKmhhKTsKK3N0YXRpYyBpbnQgZ2R0aF9pbml0X3BjaShnZHRoX3BjaV9zdHIgKnBjaXN0cixnZHRoX2hhX3N0ciAqaGEpOworCitzdGF0aWMgdm9pZCBnZHRoX2VuYWJsZV9pbnQoaW50IGhhbnVtKTsKK3N0YXRpYyBpbnQgZ2R0aF9nZXRfc3RhdHVzKHVuY2hhciAqcElTdGF0dXMsaW50IGlycSk7CitzdGF0aWMgaW50IGdkdGhfdGVzdF9idXN5KGludCBoYW51bSk7CitzdGF0aWMgaW50IGdkdGhfZ2V0X2NtZF9pbmRleChpbnQgaGFudW0pOworc3RhdGljIHZvaWQgZ2R0aF9yZWxlYXNlX2V2ZW50KGludCBoYW51bSk7CitzdGF0aWMgaW50IGdkdGhfd2FpdChpbnQgaGFudW0saW50IGluZGV4LHVsb25nMzIgdGltZSk7CitzdGF0aWMgaW50IGdkdGhfaW50ZXJuYWxfY21kKGludCBoYW51bSx1bmNoYXIgc2VydmljZSx1c2hvcnQgb3Bjb2RlLHVsb25nMzIgcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsb25nNjQgcDIsdWxvbmc2NCBwMyk7CitzdGF0aWMgaW50IGdkdGhfc2VhcmNoX2RyaXZlcyhpbnQgaGFudW0pOworc3RhdGljIGludCBnZHRoX2FuYWx5c2VfaGRyaXZlKGludCBoYW51bSwgdXNob3J0IGhkcml2ZSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpnZHRoX2N0cl9uYW1lKGludCBoYW51bSk7CisKK3N0YXRpYyBpbnQgZ2R0aF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlcCk7CitzdGF0aWMgaW50IGdkdGhfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwKTsKK3N0YXRpYyBpbnQgZ2R0aF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCitzdGF0aWMgdm9pZCBnZHRoX2ZsdXNoKGludCBoYW51bSk7CitzdGF0aWMgaW50IGdkdGhfaGFsdChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bG9uZyBldmVudCwgdm9pZCAqYnVmKTsKKworI2lmZGVmIERFQlVHX0dEVEgKK3N0YXRpYyB1bmNoYXIgICBEZWJ1Z1N0YXRlID0gREVCVUdfR0RUSDsKKworI2lmZGVmIF9fU0VSSUFMX18KKyNkZWZpbmUgTUFYX1NFUkJVRiAxNjAKK3N0YXRpYyB2b2lkIHNlcl9pbml0KHZvaWQpOworc3RhdGljIHZvaWQgc2VyX3B1dHMoY2hhciAqc3RyKTsKK3N0YXRpYyB2b2lkIHNlcl9wdXRjKGNoYXIgYyk7CitzdGF0aWMgaW50ICBzZXJfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK3N0YXRpYyBjaGFyIHN0cmJ1ZltNQVhfU0VSQlVGKzFdOworI2lmZGVmIF9fQ09NMl9fCisjZGVmaW5lIENPTV9CQVNFIDB4MmY4CisjZWxzZQorI2RlZmluZSBDT01fQkFTRSAweDNmOAorI2VuZGlmCitzdGF0aWMgdm9pZCBzZXJfaW5pdCgpCit7CisgICAgdW5zaWduZWQgcG9ydD1DT01fQkFTRTsKKworICAgIG91dGIoMHg4MCxwb3J0KzMpOworICAgIG91dGIoMCxwb3J0KzEpOworICAgIC8qIDE5MjAwIEJhdWQsIGlmIDk2MDA6IG91dGIoMTIscG9ydCkgKi8KKyAgICBvdXRiKDYsIHBvcnQpOworICAgIG91dGIoMyxwb3J0KzMpOworICAgIG91dGIoMCxwb3J0KzEpOworICAgIC8qCisgICAgc2VyX3B1dGMoJ0knKTsKKyAgICBzZXJfcHV0YygnICcpOworICAgICovCit9CisKK3N0YXRpYyB2b2lkIHNlcl9wdXRzKGNoYXIgKnN0cikKK3sKKyAgICBjaGFyICpwdHI7CisKKyAgICBzZXJfaW5pdCgpOworICAgIGZvciAocHRyPXN0cjsqcHRyOysrcHRyKQorICAgICAgICBzZXJfcHV0YygqcHRyKTsKK30KKworc3RhdGljIHZvaWQgc2VyX3B1dGMoY2hhciBjKQoreworICAgIHVuc2lnbmVkIHBvcnQ9Q09NX0JBU0U7CisKKyAgICB3aGlsZSAoKGluYihwb3J0KzUpICYgMHgyMCk9PTApOworICAgIG91dGIoYyxwb3J0KTsKKyAgICBpZiAoYz09MHgwYSkKKyAgICB7CisgICAgICAgIHdoaWxlICgoaW5iKHBvcnQrNSkgJiAweDIwKT09MCk7CisgICAgICAgIG91dGIoMHgwZCxwb3J0KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgc2VyX3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgaW50IGk7CisKKyAgICB2YV9zdGFydChhcmdzLGZtdCk7CisgICAgaSA9IHZzcHJpbnRmKHN0cmJ1ZixmbXQsYXJncyk7CisgICAgc2VyX3B1dHMoc3RyYnVmKTsKKyAgICB2YV9lbmQoYXJncyk7CisgICAgcmV0dXJuIGk7Cit9CisKKyNkZWZpbmUgVFJBQ0UoYSkgICAge2lmIChEZWJ1Z1N0YXRlPT0xKSB7c2VyX3ByaW50ayBhO319CisjZGVmaW5lIFRSQUNFMihhKSAgIHtpZiAoRGVidWdTdGF0ZT09MSB8fCBEZWJ1Z1N0YXRlPT0yKSB7c2VyX3ByaW50ayBhO319CisjZGVmaW5lIFRSQUNFMyhhKSAgIHtpZiAoRGVidWdTdGF0ZSE9MCkge3Nlcl9wcmludGsgYTt9fQorCisjZWxzZSAvKiAhX19TRVJJQUxfXyAqLworI2RlZmluZSBUUkFDRShhKSAgICB7aWYgKERlYnVnU3RhdGU9PTEpIHtwcmludGsgYTt9fQorI2RlZmluZSBUUkFDRTIoYSkgICB7aWYgKERlYnVnU3RhdGU9PTEgfHwgRGVidWdTdGF0ZT09Mikge3ByaW50ayBhO319CisjZGVmaW5lIFRSQUNFMyhhKSAgIHtpZiAoRGVidWdTdGF0ZSE9MCkge3ByaW50ayBhO319CisjZW5kaWYKKworI2Vsc2UgLyogIURFQlVHICovCisjZGVmaW5lIFRSQUNFKGEpCisjZGVmaW5lIFRSQUNFMihhKQorI2RlZmluZSBUUkFDRTMoYSkKKyNlbmRpZgorCisjaWZkZWYgR0RUSF9TVEFUSVNUSUNTCitzdGF0aWMgdWxvbmczMiBtYXhfcnE9MCwgbWF4X2luZGV4PTAsIG1heF9zZz0wOworI2lmZGVmIElOVF9DT0FMCitzdGF0aWMgdWxvbmczMiBtYXhfaW50X2NvYWw9MDsKKyNlbmRpZgorc3RhdGljIHVsb25nMzIgYWN0X2ludHM9MCwgYWN0X2lvcz0wLCBhY3Rfc3RhdHM9MCwgYWN0X3JxPTA7CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZ2R0aF90aW1lcjsKKyNlbmRpZgorCisjZGVmaW5lIFBUUjJVU0hPUlQoYSkgICAodXNob3J0KSh1bG9uZykoYSkKKyNkZWZpbmUgR0RUT0ZGU09GKGEsYikgIChzaXplX3QpJigoKGEqKTApLT5iKSAgIAorI2RlZmluZSBJTkRFWF9PSyhpLHQpICAgKChpKTxzaXplb2YodCkvc2l6ZW9mKCh0KVswXSkpCisKKyNkZWZpbmUgTlVNREFUQShhKSAgICAgICggKGdkdGhfbnVtX3N0ciAgKikoKGEpLT5ob3N0ZGF0YSkpCisjZGVmaW5lIEhBREFUQShhKSAgICAgICAoJigoZ2R0aF9leHRfc3RyICopKChhKS0+aG9zdGRhdGEpKS0+aGFleHQpCisjZGVmaW5lIENNRERBVEEoYSkgICAgICAoJigoZ2R0aF9leHRfc3RyICopKChhKS0+aG9zdGRhdGEpKS0+Y21kZXh0KQorCisjZGVmaW5lIEJVU19MMlAoYSxiKSAgICAoKGIpPihhKS0+dmlydF9idXMgPyAoYi0xKTooYikpCisKKyNkZWZpbmUgZ2R0aF9yZWFkYihhZGRyKSAgICAgICAgcmVhZGIoYWRkcikKKyNkZWZpbmUgZ2R0aF9yZWFkdyhhZGRyKSAgICAgICAgcmVhZHcoYWRkcikKKyNkZWZpbmUgZ2R0aF9yZWFkbChhZGRyKSAgICAgICAgcmVhZGwoYWRkcikKKyNkZWZpbmUgZ2R0aF93cml0ZWIoYixhZGRyKSAgICAgd3JpdGViKChiKSwoYWRkcikpCisjZGVmaW5lIGdkdGhfd3JpdGV3KGIsYWRkcikgICAgIHdyaXRldygoYiksKGFkZHIpKQorI2RlZmluZSBnZHRoX3dyaXRlbChiLGFkZHIpICAgICB3cml0ZWwoKGIpLChhZGRyKSkKKworc3RhdGljIHVuY2hhciAgIGdkdGhfZHJxX3RhYls0XSA9IHs1LDYsNyw3fTsgICAgICAgICAgICAvKiBEUlEgdGFibGUgKi8KK3N0YXRpYyB1bmNoYXIgICBnZHRoX2lycV90YWJbNl0gPSB7MCwxMCwxMSwxMiwxNCwwfTsgICAgLyogSVJRIHRhYmxlICovCitzdGF0aWMgdW5jaGFyICAgZ2R0aF9wb2xsaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvbGxpbmcgaWYgVFJVRSAqLworc3RhdGljIHVuY2hhciAgIGdkdGhfZnJvbV93YWl0ICA9IEZBTFNFOyAgICAgICAgICAgICAgICAvKiBnZHRoX3dhaXQoKSAqLworc3RhdGljIGludCAgICAgIHdhaXRfaW5kZXgsd2FpdF9oYW51bTsgICAgICAgICAgICAgICAgICAvKiBnZHRoX3dhaXQoKSAqLworc3RhdGljIGludCAgICAgIGdkdGhfY3RyX2NvdW50ICA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIGNvdW50ICovCitzdGF0aWMgaW50ICAgICAgZ2R0aF9jdHJfdmNvdW50ID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHZpcnQuIGN0ci4gY291bnQgKi8KK3N0YXRpYyBpbnQgICAgICBnZHRoX2N0cl9yZWxlYXNlZCA9IDA7ICAgICAgICAgICAgICAgICAgLyogZ2R0aF9yZWxlYXNlKCkgKi8KK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICpnZHRoX2N0cl90YWJbTUFYSEFdOyAgICAgICAgICAgLyogY29udHJvbGxlciB0YWJsZSAqLworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKmdkdGhfY3RyX3Z0YWJbTUFYSEEqTUFYQlVTXTsgICAvKiB2aXJ0LiBjdHIuIHRhYmxlICovCitzdGF0aWMgdW5jaGFyICAgZ2R0aF93cml0ZV90aHJvdWdoID0gRkFMU0U7ICAgICAgICAgICAgIC8qIHdyaXRlIHRocm91Z2ggKi8KK3N0YXRpYyBnZHRoX2V2dF9zdHIgZWJ1ZmZlcltNQVhfRVZFTlRTXTsgICAgICAgICAgICAgICAgLyogZXZlbnQgYnVmZmVyICovCitzdGF0aWMgaW50IGVsYXN0aWR4Oworc3RhdGljIGludCBlb2xkaWR4Oworc3RhdGljIGludCBtYWpvcjsKKworI2RlZmluZSBESU4gICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSU4gZGF0YSBkaXJlY3Rpb24gKi8KKyNkZWZpbmUgRE9VICAgICAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9VVCBkYXRhIGRpcmVjdGlvbiAqLworI2RlZmluZSBETk8gICAgIERJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gZGF0YSB0cmFuc2ZlciAqLworI2RlZmluZSBEVU4gICAgIERJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5rbm93biBkYXRhIGRpcmVjdGlvbiAqLworc3RhdGljIHVuY2hhciBnZHRoX2RpcmVjdGlvbl90YWJbMHgxMDBdID0geworICAgIEROTyxETk8sRElOLERJTixET1UsRElOLERJTixET1UsRElOLERVTixET1UsRE9VLERVTixEVU4sRFVOLERJTiwKKyAgICBETk8sRElOLERJTixET1UsRElOLERPVSxETk8sRE5PLERPVSxETk8sRElOLEROTyxESU4sRE9VLEROTyxEVU4sCisgICAgRElOLERVTixESU4sRFVOLERPVSxESU4sRFVOLERVTixESU4sRElOLERPVSxETk8sRFVOLERJTixET1UsRE9VLAorICAgIERPVSxET1UsRE9VLEROTyxESU4sRE5PLEROTyxESU4sRE9VLERPVSxET1UsRE9VLERJTixET1UsRElOLERPVSwKKyAgICBET1UsRE9VLERJTixESU4sRElOLEROTyxEVU4sRE5PLEROTyxETk8sRFVOLEROTyxET1UsRElOLERVTixEVU4sCisgICAgRFVOLERVTixEVU4sRFVOLERVTixET1UsRFVOLERVTixEVU4sRFVOLERJTixEVU4sRFVOLERVTixEVU4sRFVOLAorICAgIERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTiwKKyAgICBEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sCisgICAgRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixESU4sRFVOLERPVSxEVU4sRFVOLERVTixEVU4sRFVOLAorICAgIERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRElOLERVTiwKKyAgICBEVU4sRFVOLERVTixEVU4sRFVOLEROTyxETk8sRFVOLERJTixETk8sRE9VLERVTixETk8sRFVOLERPVSxET1UsCisgICAgRE9VLERPVSxET1UsRE5PLERVTixESU4sRE9VLERJTixESU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLAorICAgIERVTixEVU4sRE9VLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTiwKKyAgICBEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sCisgICAgRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERPVSxEVU4sRFVOLERVTixEVU4sRFVOLAorICAgIERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTgorfTsKKworLyogTElMTyBhbmQgbW9kcHJvYmUvaW5zbW9kIHBhcmFtZXRlcnMgKi8KKy8qIElSUSBsaXN0IGZvciBHRFQzMDAwLzMwMjAgRUlTQSBjb250cm9sbGVycyAqLworc3RhdGljIGludCBpcnFbTUFYSEFdIF9faW5pdGRhdGEgPSAKK3sweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisgMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmfTsKKy8qIGRpc2FibGUgZHJpdmVyIGZsYWcgKi8KK3N0YXRpYyBpbnQgZGlzYWJsZSBfX2luaXRkYXRhID0gMDsKKy8qIHJlc2VydmUgZmxhZyAqLworc3RhdGljIGludCByZXNlcnZlX21vZGUgPSAxOyAgICAgICAgICAgICAgICAgIAorLyogcmVzZXJ2ZSBsaXN0ICovCitzdGF0aWMgaW50IHJlc2VydmVfbGlzdFtNQVhfUkVTX0FSR1NdID0gCit7MHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorIDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKyAweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZn07CisvKiBzY2FuIG9yZGVyIGZvciBQQ0kgY29udHJvbGxlcnMgKi8KK3N0YXRpYyBpbnQgcmV2ZXJzZV9zY2FuID0gMDsKKy8qIHZpcnR1YWwgY2hhbm5lbCBmb3IgdGhlIGhvc3QgZHJpdmVzICovCitzdGF0aWMgaW50IGhkcl9jaGFubmVsID0gMDsKKy8qIG1heC4gSURzIHBlciBjaGFubmVsICovCitzdGF0aWMgaW50IG1heF9pZHMgPSBNQVhJRDsKKy8qIHJlc2NhbiBhbGwgSURzICovCitzdGF0aWMgaW50IHJlc2NhbiA9IDA7CisvKiBtYXAgY2hhbm5lbHMgdG8gdmlydHVhbCBjb250cm9sbGVycyAqLworc3RhdGljIGludCB2aXJ0X2N0ciA9IDA7CisvKiBzaGFyZWQgYWNjZXNzICovCitzdGF0aWMgaW50IHNoYXJlZF9hY2Nlc3MgPSAxOworLyogZW5hYmxlIHN1cHBvcnQgZm9yIEVJU0EgYW5kIElTQSBjb250cm9sbGVycyAqLworc3RhdGljIGludCBwcm9iZV9laXNhX2lzYSA9IDA7CisvKiA2NCBiaXQgRE1BIG1vZGUsIHN1cHBvcnQgZm9yIGRyaXZlcyA+IDIgVEIsIGlmIGZvcmNlX2RtYTMyID0gMCAqLworc3RhdGljIGludCBmb3JjZV9kbWEzMiA9IDA7CisKKy8qIHBhcmFtZXRlcnMgZm9yIG1vZHByb2JlL2luc21vZCAqLworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShkaXNhYmxlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJlc2VydmVfbW9kZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShyZXNlcnZlX2xpc3QsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0ocmV2ZXJzZV9zY2FuLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGhkcl9jaGFubmVsLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1heF9pZHMsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocmVzY2FuLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHZpcnRfY3RyLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNoYXJlZF9hY2Nlc3MsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocHJvYmVfZWlzYV9pc2EsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZm9yY2VfZG1hMzIsIGludCwgMCk7CitNT0RVTEVfQVVUSE9SKCJBY2hpbSBMZXVibmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIGlvY3RsIGludGVyZmFjZSAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ2R0aF9mb3BzID0geworICAgIC5pb2N0bCAgID0gZ2R0aF9pb2N0bCwKKyAgICAub3BlbiAgICA9IGdkdGhfb3BlbiwKKyAgICAucmVsZWFzZSA9IGdkdGhfY2xvc2UsCit9OworCisjaW5jbHVkZSAiZ2R0aF9wcm9jLmgiCisjaW5jbHVkZSAiZ2R0aF9wcm9jLmMiCisKKy8qIG5vdGlmaWVyIGJsb2NrIHRvIGdldCBhIG5vdGlmeSBvbiBzeXN0ZW0gc2h1dGRvd24vaGFsdC9yZWJvb3QgKi8KK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZ2R0aF9ub3RpZmllciA9IHsKKyAgICBnZHRoX2hhbHQsIE5VTEwsIDAKK307CisKKworc3RhdGljIHZvaWQgZ2R0aF9kZWxheShpbnQgbWlsbGlzZWNvbmRzKQoreworICAgIGlmIChtaWxsaXNlY29uZHMgPT0gMCkgeworICAgICAgICB1ZGVsYXkoMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWRlbGF5KG1pbGxpc2Vjb25kcyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZHRoX2V2YWxfbWFwcGluZyh1bG9uZzMyIHNpemUsIHVsb25nMzIgKmN5bHMsIGludCAqaGVhZHMsIGludCAqc2VjcykKK3sKKyAgICAqY3lscyA9IHNpemUgL0hFQURTL1NFQ1M7CisgICAgaWYgKCpjeWxzIDw9IE1BWENZTFMpIHsKKyAgICAgICAgKmhlYWRzID0gSEVBRFM7CisgICAgICAgICpzZWNzID0gU0VDUzsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0b28gaGlnaCBmb3IgNjQqMzIgKi8KKyAgICAgICAgKmN5bHMgPSBzaXplIC9NRURIRUFEUy9NRURTRUNTOworICAgICAgICBpZiAoKmN5bHMgPD0gTUFYQ1lMUykgeworICAgICAgICAgICAgKmhlYWRzID0gTUVESEVBRFM7CisgICAgICAgICAgICAqc2VjcyA9IE1FRFNFQ1M7CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdG9vIGhpZ2ggZm9yIDEyNyo2MyAqLworICAgICAgICAgICAgKmN5bHMgPSBzaXplIC9CSUdIRUFEUy9CSUdTRUNTOworICAgICAgICAgICAgKmhlYWRzID0gQklHSEVBRFM7CisgICAgICAgICAgICAqc2VjcyA9IEJJR1NFQ1M7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIGNvbnRyb2xsZXIgc2VhcmNoIGFuZCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBfX2luaXQgZ2R0aF9zZWFyY2hfZWlzYSh1c2hvcnQgZWlzYV9hZHIpCit7CisgICAgdWxvbmczMiBpZDsKKyAgICAKKyAgICBUUkFDRSgoImdkdGhfc2VhcmNoX2Vpc2EoKSBhZHIuICV4XG4iLGVpc2FfYWRyKSk7CisgICAgaWQgPSBpbmwoZWlzYV9hZHIrSUQwUkVHKTsKKyAgICBpZiAoaWQgPT0gR0RUM0FfSUQgfHwgaWQgPT0gR0RUM0JfSUQpIHsgICAgIC8qIEdEVDMwMDBBIG9yIEdEVDMwMDBCICovCisgICAgICAgIGlmICgoaW5iKGVpc2FfYWRyK0VJU0FSRUcpICYgOCkgPT0gMCkgICAKKyAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBFSVNBIGNvbmZpZ3VyZWQgKi8KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChpZCA9PSBHRFQzX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR0RUMzAwMCAqLworICAgICAgICByZXR1cm4gMTsKKworICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9CisKKworc3RhdGljIGludCBfX2luaXQgZ2R0aF9zZWFyY2hfaXNhKHVsb25nMzIgYmlvc19hZHIpCit7CisgICAgdm9pZCBfX2lvbWVtICphZGRyOworICAgIHVsb25nMzIgaWQ7CisKKyAgICBUUkFDRSgoImdkdGhfc2VhcmNoX2lzYSgpIGJpb3MgYWRyLiAleFxuIixiaW9zX2FkcikpOworICAgIGlmICgoYWRkciA9IGlvcmVtYXAoYmlvc19hZHIrQklPU19JRF9PRkZTLCBzaXplb2YodWxvbmczMikpKSAhPSBOVUxMKSB7CisgICAgICAgIGlkID0gZ2R0aF9yZWFkbChhZGRyKTsKKyAgICAgICAgaW91bm1hcChhZGRyKTsKKyAgICAgICAgaWYgKGlkID09IEdEVDJfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHRFQyMDAwICovCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgZ2R0aF9zZWFyY2hfcGNpKGdkdGhfcGNpX3N0ciAqcGNpc3RyKQoreworICAgIHVzaG9ydCBkZXZpY2UsIGNudDsKKyAgICAKKyAgICBUUkFDRSgoImdkdGhfc2VhcmNoX3BjaSgpXG4iKSk7CisKKyAgICBjbnQgPSAwOworICAgIGZvciAoZGV2aWNlID0gMDsgZGV2aWNlIDw9IFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDY1NTU7ICsrZGV2aWNlKQorICAgICAgICBnZHRoX3NlYXJjaF9kZXYocGNpc3RyLCAmY250LCBQQ0lfVkVORE9SX0lEX1ZPUlRFWCwgZGV2aWNlKTsKKyAgICBmb3IgKGRldmljZSA9IFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MTdSUDsgCisgICAgICAgICBkZXZpY2UgPD0gUENJX0RFVklDRV9JRF9WT1JURVhfR0RUTUFYUlA7ICsrZGV2aWNlKQorICAgICAgICBnZHRoX3NlYXJjaF9kZXYocGNpc3RyLCAmY250LCBQQ0lfVkVORE9SX0lEX1ZPUlRFWCwgZGV2aWNlKTsKKyAgICBnZHRoX3NlYXJjaF9kZXYocGNpc3RyLCAmY250LCBQQ0lfVkVORE9SX0lEX1ZPUlRFWCwgCisgICAgICAgICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVE5FV1JYKTsKKyAgICBnZHRoX3NlYXJjaF9kZXYocGNpc3RyLCAmY250LCBQQ0lfVkVORE9SX0lEX1ZPUlRFWCwgCisgICAgICAgICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVE5FV1JYMik7CisgICAgZ2R0aF9zZWFyY2hfZGV2KHBjaXN0ciwgJmNudCwgUENJX1ZFTkRPUl9JRF9JTlRFTCwKKyAgICAgICAgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF9TUkMpOworICAgIGdkdGhfc2VhcmNoX2RldihwY2lzdHIsICZjbnQsIFBDSV9WRU5ET1JfSURfSU5URUwsCisgICAgICAgICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfU1JDX1hTQ0FMRSk7CisgICAgcmV0dXJuIGNudDsKK30KKworLyogVm9ydGV4IG9ubHkgbWFrZXMgUkFJRCBjb250cm9sbGVycy4KKyAqIFdlIGRvIG5vdCByZWFsbHkgd2FudCB0byBzcGVjaWZ5IGFsbCA1NTAgaWRzIGhlcmUsIHNvIHdpbGRjYXJkIG1hdGNoLgorICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZ2R0aHRhYmxlW10gX19hdHRyaWJ1dGVfdXNlZF9fID0geworICAgIHtQQ0lfVkVORE9SX0lEX1ZPUlRFWCxQQ0lfQU5ZX0lELFBDSV9BTllfSUQsIFBDSV9BTllfSUR9LAorICAgIHtQQ0lfVkVORE9SX0lEX0lOVEVMLFBDSV9ERVZJQ0VfSURfSU5URUxfU1JDLFBDSV9BTllfSUQsUENJX0FOWV9JRH0sIAorICAgIHtQQ0lfVkVORE9SX0lEX0lOVEVMLFBDSV9ERVZJQ0VfSURfSU5URUxfU1JDX1hTQ0FMRSxQQ0lfQU5ZX0lELFBDSV9BTllfSUR9LCAKKyAgICB7MH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSxnZHRodGFibGUpOworCitzdGF0aWMgdm9pZCBfX2luaXQgZ2R0aF9zZWFyY2hfZGV2KGdkdGhfcGNpX3N0ciAqcGNpc3RyLCB1c2hvcnQgKmNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgdmVuZG9yLCB1c2hvcnQgZGV2aWNlKQoreworICAgIHVsb25nIGJhc2UwLCBiYXNlMSwgYmFzZTI7CisgICAgc3RydWN0IHBjaV9kZXYgKnBkZXY7CisgICAgCisgICAgVFJBQ0UoKCJnZHRoX3NlYXJjaF9kZXYoKSBjbnQgJWQgdmVuZG9yICV4IGRldmljZSAleFxuIiwKKyAgICAgICAgICAqY250LCB2ZW5kb3IsIGRldmljZSkpOworCisgICAgcGRldiA9IE5VTEw7CisgICAgd2hpbGUgKChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKHZlbmRvciwgZGV2aWNlLCBwZGV2KSkgCisgICAgICAgICAgICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICgqY250ID49IE1BWEhBKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAvKiBHRFQgUENJIGNvbnRyb2xsZXIgZm91bmQsIHJlc291cmNlcyBhcmUgYWxyZWFkeSBpbiBwZGV2ICovCisgICAgICAgIHBjaXN0clsqY250XS5wZGV2ID0gcGRldjsKKyAgICAgICAgcGNpc3RyWypjbnRdLnZlbmRvcl9pZCA9IHZlbmRvcjsKKyAgICAgICAgcGNpc3RyWypjbnRdLmRldmljZV9pZCA9IGRldmljZTsKKyAgICAgICAgcGNpc3RyWypjbnRdLnN1YmRldmljZV9pZCA9IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisgICAgICAgIHBjaXN0clsqY250XS5idXMgPSBwZGV2LT5idXMtPm51bWJlcjsKKyAgICAgICAgcGNpc3RyWypjbnRdLmRldmljZV9mbiA9IHBkZXYtPmRldmZuOworICAgICAgICBwY2lzdHJbKmNudF0uaXJxID0gcGRldi0+aXJxOworICAgICAgICBiYXNlMCA9IHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKTsKKyAgICAgICAgYmFzZTEgPSBwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMSk7CisgICAgICAgIGJhc2UyID0gcGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDIpOworICAgICAgICBpZiAoZGV2aWNlIDw9IFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDYwMDBCIHx8ICAgLyogR0RUNjAwMC9CICovCisgICAgICAgICAgICBkZXZpY2UgPj0gUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngxN1JQKSB7ICAvKiBNUFIgKi8KKyAgICAgICAgICAgIGlmICghKGJhc2UwICYgSU9SRVNPVVJDRV9NRU0pKSAKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHBjaXN0clsqY250XS5kcG1lbSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR0RUNjExMCwgR0RUNjEyMCwgLi4gKi8KKyAgICAgICAgICAgIGlmICghKGJhc2UwICYgSU9SRVNPVVJDRV9NRU0pIHx8CisgICAgICAgICAgICAgICAgIShiYXNlMiAmIElPUkVTT1VSQ0VfTUVNKSB8fAorICAgICAgICAgICAgICAgICEoYmFzZTEgJiBJT1JFU09VUkNFX0lPKSkgCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBwY2lzdHJbKmNudF0uZHBtZW0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7CisgICAgICAgICAgICBwY2lzdHJbKmNudF0uaW9fbW0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisgICAgICAgICAgICBwY2lzdHJbKmNudF0uaW8gICAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisgICAgICAgIH0KKyAgICAgICAgVFJBQ0UyKCgiQ29udHJvbGxlciBmb3VuZCBhdCAlZC8lZCwgaXJxICVkLCBkcG1lbSAweCVseFxuIiwKKyAgICAgICAgICAgICAgICBwY2lzdHJbKmNudF0uYnVzLCBQQ0lfU0xPVChwY2lzdHJbKmNudF0uZGV2aWNlX2ZuKSwgCisgICAgICAgICAgICAgICAgcGNpc3RyWypjbnRdLmlycSwgcGNpc3RyWypjbnRdLmRwbWVtKSk7CisgICAgICAgICgqY250KSsrOworICAgIH0gICAgICAgCit9ICAgCisKKworc3RhdGljIHZvaWQgX19pbml0IGdkdGhfc29ydF9wY2koZ2R0aF9wY2lfc3RyICpwY2lzdHIsIGludCBjbnQpCit7ICAgIAorICAgIGdkdGhfcGNpX3N0ciB0ZW1wOworICAgIGludCBpLCBjaGFuZ2VkOworICAgIAorICAgIFRSQUNFKCgiZ2R0aF9zb3J0X3BjaSgpIGNudCAlZFxuIixjbnQpKTsKKyAgICBpZiAoY250ID09IDApCisgICAgICAgIHJldHVybjsKKworICAgIGRvIHsKKyAgICAgICAgY2hhbmdlZCA9IEZBTFNFOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY250LTE7ICsraSkgeworICAgICAgICAgICAgaWYgKCFyZXZlcnNlX3NjYW4pIHsKKyAgICAgICAgICAgICAgICBpZiAoKHBjaXN0cltpXS5idXMgPiBwY2lzdHJbaSsxXS5idXMpIHx8CisgICAgICAgICAgICAgICAgICAgIChwY2lzdHJbaV0uYnVzID09IHBjaXN0cltpKzFdLmJ1cyAmJgorICAgICAgICAgICAgICAgICAgICAgUENJX1NMT1QocGNpc3RyW2ldLmRldmljZV9mbikgPiAKKyAgICAgICAgICAgICAgICAgICAgIFBDSV9TTE9UKHBjaXN0cltpKzFdLmRldmljZV9mbikpKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBwY2lzdHJbaV07CisgICAgICAgICAgICAgICAgICAgIHBjaXN0cltpXSA9IHBjaXN0cltpKzFdOworICAgICAgICAgICAgICAgICAgICBwY2lzdHJbaSsxXSA9IHRlbXA7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKChwY2lzdHJbaV0uYnVzIDwgcGNpc3RyW2krMV0uYnVzKSB8fAorICAgICAgICAgICAgICAgICAgICAocGNpc3RyW2ldLmJ1cyA9PSBwY2lzdHJbaSsxXS5idXMgJiYKKyAgICAgICAgICAgICAgICAgICAgIFBDSV9TTE9UKHBjaXN0cltpXS5kZXZpY2VfZm4pIDwgCisgICAgICAgICAgICAgICAgICAgICBQQ0lfU0xPVChwY2lzdHJbaSsxXS5kZXZpY2VfZm4pKSkgeworICAgICAgICAgICAgICAgICAgICB0ZW1wID0gcGNpc3RyW2ldOworICAgICAgICAgICAgICAgICAgICBwY2lzdHJbaV0gPSBwY2lzdHJbaSsxXTsKKyAgICAgICAgICAgICAgICAgICAgcGNpc3RyW2krMV0gPSB0ZW1wOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChjaGFuZ2VkKTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBnZHRoX2luaXRfZWlzYSh1c2hvcnQgZWlzYV9hZHIsZ2R0aF9oYV9zdHIgKmhhKQoreworICAgIHVsb25nMzIgcmV0cmllcyxpZDsKKyAgICB1bmNoYXIgcHJvdF92ZXIsZWlzYWNmLGksaXJxX2ZvdW5kOworCisgICAgVFJBQ0UoKCJnZHRoX2luaXRfZWlzYSgpIGFkci4gJXhcbiIsZWlzYV9hZHIpKTsKKyAgICAKKyAgICAvKiBkaXNhYmxlIGJvYXJkIGludGVycnVwdHMsIGRlaW5pdGlhbGl6ZSBzZXJ2aWNlcyAqLworICAgIG91dGIoMHhmZixlaXNhX2FkcitFRE9PUlJFRyk7CisgICAgb3V0YigweDAwLGVpc2FfYWRyK0VERU5BQlJFRyk7CisgICAgb3V0YigweDAwLGVpc2FfYWRyK0VJTlRFTkFCUkVHKTsKKyAgICAKKyAgICBvdXRiKDB4ZmYsZWlzYV9hZHIrTERPT1JSRUcpOworICAgIHJldHJpZXMgPSBJTklUX1JFVFJJRVM7CisgICAgZ2R0aF9kZWxheSgyMCk7CisgICAgd2hpbGUgKGluYihlaXNhX2FkcitFRE9PUlJFRykgIT0gMHhmZikgeworICAgICAgICBpZiAoLS1yZXRyaWVzID09IDApIHsKKyAgICAgICAgICAgIHByaW50aygiR0RULUVJU0E6IEluaXRpYWxpemF0aW9uIGVycm9yIChERUlOSVQgZmFpbGVkKVxuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBnZHRoX2RlbGF5KDEpOworICAgICAgICBUUkFDRTIoKCJ3YWl0IGZvciBERUlOSVQ6IHJldHJpZXM9JWRcbiIscmV0cmllcykpOworICAgIH0KKyAgICBwcm90X3ZlciA9IGluYihlaXNhX2FkcitNQUlMQk9YUkVHKTsKKyAgICBvdXRiKDB4ZmYsZWlzYV9hZHIrRURPT1JSRUcpOworICAgIGlmIChwcm90X3ZlciAhPSBQUk9UT0NPTF9WRVJTSU9OKSB7CisgICAgICAgIHByaW50aygiR0RULUVJU0E6IElsbGVnYWwgcHJvdG9jb2wgdmVyc2lvblxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBoYS0+Ym1pYyA9IGVpc2FfYWRyOworICAgIGhhLT5icmRfcGh5cyA9ICh1bG9uZzMyKWVpc2FfYWRyID4+IDEyOworCisgICAgb3V0bCgwLGVpc2FfYWRyK01BSUxCT1hSRUcpOworICAgIG91dGwoMCxlaXNhX2FkcitNQUlMQk9YUkVHKzQpOworICAgIG91dGwoMCxlaXNhX2FkcitNQUlMQk9YUkVHKzgpOworICAgIG91dGwoMCxlaXNhX2FkcitNQUlMQk9YUkVHKzEyKTsKKworICAgIC8qIGRldGVjdCBJUlEgKi8gCisgICAgaWYgKChpZCA9IGlubChlaXNhX2FkcitJRDBSRUcpKSA9PSBHRFQzX0lEKSB7CisgICAgICAgIGhhLT5vZW1faWQgPSBPRU1fSURfSUNQOworICAgICAgICBoYS0+dHlwZSA9IEdEVF9FSVNBOworICAgICAgICBoYS0+c3R5cGUgPSBpZDsKKyAgICAgICAgb3V0bCgxLGVpc2FfYWRyK01BSUxCT1hSRUcrOCk7CisgICAgICAgIG91dGIoMHhmZSxlaXNhX2FkcitMRE9PUlJFRyk7CisgICAgICAgIHJldHJpZXMgPSBJTklUX1JFVFJJRVM7CisgICAgICAgIGdkdGhfZGVsYXkoMjApOworICAgICAgICB3aGlsZSAoaW5iKGVpc2FfYWRyK0VET09SUkVHKSAhPSAweGZlKSB7CisgICAgICAgICAgICBpZiAoLS1yZXRyaWVzID09IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1FSVNBOiBJbml0aWFsaXphdGlvbiBlcnJvciAoZ2V0IElSUSBmYWlsZWQpXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdkdGhfZGVsYXkoMSk7CisgICAgICAgIH0KKyAgICAgICAgaGEtPmlycSA9IGluYihlaXNhX2FkcitNQUlMQk9YUkVHKTsKKyAgICAgICAgb3V0YigweGZmLGVpc2FfYWRyK0VET09SUkVHKTsKKyAgICAgICAgVFJBQ0UyKCgiR0RUMzAwMC8zMDIwOiBJUlE9JWRcbiIsaGEtPmlycSkpOworICAgICAgICAvKiBjaGVjayB0aGUgcmVzdWx0ICovCisgICAgICAgIGlmIChoYS0+aXJxID09IDApIHsKKyAgICAgICAgICAgICAgICBUUkFDRTIoKCJVbmtub3duIElSUSwgdXNlIElSUSB0YWJsZSBmcm9tIGNtZCBsaW5lICFcbiIpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpcnFfZm91bmQgPSBGQUxTRTsgCisgICAgICAgICAgICAgICAgICAgICBpIDwgTUFYSEEgJiYgaXJxW2ldICE9IDB4ZmY7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChpcnFbaV09PTEwIHx8IGlycVtpXT09MTEgfHwgaXJxW2ldPT0xMiB8fCBpcnFbaV09PTE0KSB7CisgICAgICAgICAgICAgICAgICAgIGlycV9mb3VuZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXJxX2ZvdW5kKSB7CisgICAgICAgICAgICAgICAgaGEtPmlycSA9IGlycVtpXTsKKyAgICAgICAgICAgICAgICBpcnFbaV0gPSAwOworICAgICAgICAgICAgICAgIHByaW50aygiR0RULUVJU0E6IENhbiBub3QgZGV0ZWN0IGNvbnRyb2xsZXIgSVJRLFxuIik7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJVc2UgSVJRIHNldHRpbmcgZnJvbSBjb21tYW5kIGxpbmUgKElSUSA9ICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaGEtPmlycSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50aygiR0RULUVJU0E6IEluaXRpYWxpemF0aW9uIGVycm9yICh1bmtub3duIElSUSksIEVuYWJsZVxuIik7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJ0aGUgY29udHJvbGxlciBCSU9TIG9yIHVzZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBlaXNhY2YgPSBpbmIoZWlzYV9hZHIrRUlTQVJFRykgJiA3OworICAgICAgICBpZiAoZWlzYWNmID4gNCkgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGV2ZWwgdHJpZ2dlcmVkICovCisgICAgICAgICAgICBlaXNhY2YgLT0gNDsKKyAgICAgICAgaGEtPmlycSA9IGdkdGhfaXJxX3RhYltlaXNhY2ZdOworICAgICAgICBoYS0+b2VtX2lkID0gT0VNX0lEX0lDUDsKKyAgICAgICAgaGEtPnR5cGUgPSBHRFRfRUlTQTsKKyAgICAgICAgaGEtPnN0eXBlID0gaWQ7CisgICAgfQorCisgICAgaGEtPmRtYTY0X3N1cHBvcnQgPSAwOworICAgIHJldHVybiAxOworfQorCisgICAgICAgCitzdGF0aWMgaW50IF9faW5pdCBnZHRoX2luaXRfaXNhKHVsb25nMzIgYmlvc19hZHIsZ2R0aF9oYV9zdHIgKmhhKQoreworICAgIHJlZ2lzdGVyIGdkdDJfZHByYW1fc3RyIF9faW9tZW0gKmRwMl9wdHI7CisgICAgaW50IGk7CisgICAgdW5jaGFyIGlycV9kcnEscHJvdF92ZXI7CisgICAgdWxvbmczMiByZXRyaWVzOworCisgICAgVFJBQ0UoKCJnZHRoX2luaXRfaXNhKCkgYmlvcyBhZHIuICV4XG4iLGJpb3NfYWRyKSk7CisKKyAgICBoYS0+YnJkID0gaW9yZW1hcChiaW9zX2Fkciwgc2l6ZW9mKGdkdDJfZHByYW1fc3RyKSk7CisgICAgaWYgKGhhLT5icmQgPT0gTlVMTCkgeworICAgICAgICBwcmludGsoIkdEVC1JU0E6IEluaXRpYWxpemF0aW9uIGVycm9yIChEUE1FTSByZW1hcCBlcnJvcilcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZHAyX3B0ciA9IGhhLT5icmQ7CisgICAgZ2R0aF93cml0ZWIoMSwgJmRwMl9wdHItPmlvLm1lbWxvY2spOyAvKiBzd2l0Y2ggb2ZmIHdyaXRlIHByb3RlY3Rpb24gKi8KKyAgICAvKiByZXNldCBpbnRlcmZhY2UgYXJlYSAqLworICAgIG1lbXNldF9pbygmZHAyX3B0ci0+dSwgMCwgc2l6ZW9mKGRwMl9wdHItPnUpKTsKKyAgICBpZiAoZ2R0aF9yZWFkbCgmZHAyX3B0ci0+dSkgIT0gMCkgeworICAgICAgICBwcmludGsoIkdEVC1JU0E6IEluaXRpYWxpemF0aW9uIGVycm9yIChEUE1FTSB3cml0ZSBlcnJvcilcbiIpOworICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBkaXNhYmxlIGJvYXJkIGludGVycnVwdHMsIHJlYWQgRFJRIGFuZCBJUlEgKi8KKyAgICBnZHRoX3dyaXRlYigweGZmLCAmZHAyX3B0ci0+aW8uaXJxZGVsKTsKKyAgICBnZHRoX3dyaXRlYigweDAwLCAmZHAyX3B0ci0+aW8uaXJxZW4pOworICAgIGdkdGhfd3JpdGViKDB4MDAsICZkcDJfcHRyLT51LmljLlNfU3RhdHVzKTsKKyAgICBnZHRoX3dyaXRlYigweDAwLCAmZHAyX3B0ci0+dS5pYy5DbWRfSW5kZXgpOworCisgICAgaXJxX2RycSA9IGdkdGhfcmVhZGIoJmRwMl9wdHItPmlvLnJxKTsKKyAgICBmb3IgKGk9MDsgaTwzOyArK2kpIHsKKyAgICAgICAgaWYgKChpcnFfZHJxICYgMSk9PTApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaXJxX2RycSA+Pj0gMTsKKyAgICB9CisgICAgaGEtPmRycSA9IGdkdGhfZHJxX3RhYltpXTsKKworICAgIGlycV9kcnEgPSBnZHRoX3JlYWRiKCZkcDJfcHRyLT5pby5ycSkgPj4gMzsKKyAgICBmb3IgKGk9MTsgaTw1OyArK2kpIHsKKyAgICAgICAgaWYgKChpcnFfZHJxICYgMSk9PTApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaXJxX2RycSA+Pj0gMTsKKyAgICB9CisgICAgaGEtPmlycSA9IGdkdGhfaXJxX3RhYltpXTsKKworICAgIC8qIGRlaW5pdGlhbGl6ZSBzZXJ2aWNlcyAqLworICAgIGdkdGhfd3JpdGVsKGJpb3NfYWRyLCAmZHAyX3B0ci0+dS5pYy5TX0luZm9bMF0pOworICAgIGdkdGhfd3JpdGViKDB4ZmYsICZkcDJfcHRyLT51LmljLlNfQ21kX0luZHgpOworICAgIGdkdGhfd3JpdGViKDAsICZkcDJfcHRyLT5pby5ldmVudCk7CisgICAgcmV0cmllcyA9IElOSVRfUkVUUklFUzsKKyAgICBnZHRoX2RlbGF5KDIwKTsKKyAgICB3aGlsZSAoZ2R0aF9yZWFkYigmZHAyX3B0ci0+dS5pYy5TX1N0YXR1cykgIT0gMHhmZikgeworICAgICAgICBpZiAoLS1yZXRyaWVzID09IDApIHsKKyAgICAgICAgICAgIHByaW50aygiR0RULUlTQTogSW5pdGlhbGl6YXRpb24gZXJyb3IgKERFSU5JVCBmYWlsZWQpXG4iKTsKKyAgICAgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBnZHRoX2RlbGF5KDEpOworICAgIH0KKyAgICBwcm90X3ZlciA9ICh1bmNoYXIpZ2R0aF9yZWFkbCgmZHAyX3B0ci0+dS5pYy5TX0luZm9bMF0pOworICAgIGdkdGhfd3JpdGViKDAsICZkcDJfcHRyLT51LmljLlN0YXR1cyk7CisgICAgZ2R0aF93cml0ZWIoMHhmZiwgJmRwMl9wdHItPmlvLmlycWRlbCk7CisgICAgaWYgKHByb3RfdmVyICE9IFBST1RPQ09MX1ZFUlNJT04pIHsKKyAgICAgICAgcHJpbnRrKCJHRFQtSVNBOiBJbGxlZ2FsIHByb3RvY29sIHZlcnNpb25cbiIpOworICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBoYS0+b2VtX2lkID0gT0VNX0lEX0lDUDsKKyAgICBoYS0+dHlwZSA9IEdEVF9JU0E7CisgICAgaGEtPmljX2FsbF9zaXplID0gc2l6ZW9mKGRwMl9wdHItPnUpOworICAgIGhhLT5zdHlwZT0gR0RUMl9JRDsKKyAgICBoYS0+YnJkX3BoeXMgPSBiaW9zX2FkciA+PiA0OworCisgICAgLyogc3BlY2lhbCByZXF1ZXN0IHRvIGNvbnRyb2xsZXIgQklPUyAqLworICAgIGdkdGhfd3JpdGVsKDB4MDAsICZkcDJfcHRyLT51LmljLlNfSW5mb1swXSk7CisgICAgZ2R0aF93cml0ZWwoMHgwMCwgJmRwMl9wdHItPnUuaWMuU19JbmZvWzFdKTsKKyAgICBnZHRoX3dyaXRlbCgweDAxLCAmZHAyX3B0ci0+dS5pYy5TX0luZm9bMl0pOworICAgIGdkdGhfd3JpdGVsKDB4MDAsICZkcDJfcHRyLT51LmljLlNfSW5mb1szXSk7CisgICAgZ2R0aF93cml0ZWIoMHhmZSwgJmRwMl9wdHItPnUuaWMuU19DbWRfSW5keCk7CisgICAgZ2R0aF93cml0ZWIoMCwgJmRwMl9wdHItPmlvLmV2ZW50KTsKKyAgICByZXRyaWVzID0gSU5JVF9SRVRSSUVTOworICAgIGdkdGhfZGVsYXkoMjApOworICAgIHdoaWxlIChnZHRoX3JlYWRiKCZkcDJfcHRyLT51LmljLlNfU3RhdHVzKSAhPSAweGZlKSB7CisgICAgICAgIGlmICgtLXJldHJpZXMgPT0gMCkgeworICAgICAgICAgICAgcHJpbnRrKCJHRFQtSVNBOiBJbml0aWFsaXphdGlvbiBlcnJvclxuIik7CisgICAgICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZ2R0aF9kZWxheSgxKTsKKyAgICB9CisgICAgZ2R0aF93cml0ZWIoMCwgJmRwMl9wdHItPnUuaWMuU3RhdHVzKTsKKyAgICBnZHRoX3dyaXRlYigweGZmLCAmZHAyX3B0ci0+aW8uaXJxZGVsKTsKKworICAgIGhhLT5kbWE2NF9zdXBwb3J0ID0gMDsKKyAgICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBnZHRoX2luaXRfcGNpKGdkdGhfcGNpX3N0ciAqcGNpc3RyLGdkdGhfaGFfc3RyICpoYSkKK3sKKyAgICByZWdpc3RlciBnZHQ2X2RwcmFtX3N0ciBfX2lvbWVtICpkcDZfcHRyOworICAgIHJlZ2lzdGVyIGdkdDZjX2RwcmFtX3N0ciBfX2lvbWVtICpkcDZjX3B0cjsKKyAgICByZWdpc3RlciBnZHQ2bV9kcHJhbV9zdHIgX19pb21lbSAqZHA2bV9wdHI7CisgICAgdWxvbmczMiByZXRyaWVzOworICAgIHVuY2hhciBwcm90X3ZlcjsKKyAgICB1c2hvcnQgY29tbWFuZDsKKyAgICBpbnQgaSwgZm91bmQgPSBGQUxTRTsKKworICAgIFRSQUNFKCgiZ2R0aF9pbml0X3BjaSgpXG4iKSk7CisKKyAgICBpZiAocGNpc3RyLT52ZW5kb3JfaWQgPT0gUENJX1ZFTkRPUl9JRF9JTlRFTCkKKyAgICAgICAgaGEtPm9lbV9pZCA9IE9FTV9JRF9JTlRFTDsKKyAgICBlbHNlCisgICAgICAgIGhhLT5vZW1faWQgPSBPRU1fSURfSUNQOworICAgIGhhLT5icmRfcGh5cyA9IChwY2lzdHItPmJ1cyA8PCA4KSB8IChwY2lzdHItPmRldmljZV9mbiAmIDB4ZjgpOworICAgIGhhLT5zdHlwZSA9ICh1bG9uZzMyKXBjaXN0ci0+ZGV2aWNlX2lkOworICAgIGhhLT5zdWJkZXZpY2VfaWQgPSBwY2lzdHItPnN1YmRldmljZV9pZDsKKyAgICBoYS0+aXJxID0gcGNpc3RyLT5pcnE7CisgICAgaGEtPnBkZXYgPSBwY2lzdHItPnBkZXY7CisgICAgCisgICAgaWYgKGhhLT5zdHlwZSA8PSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2MDAwQikgeyAgLyogR0RUNjAwMC9CICovCisgICAgICAgIFRSQUNFMigoImluaXRfcGNpKCkgZHBtZW0gJWx4IGlycSAlZFxuIixwY2lzdHItPmRwbWVtLGhhLT5pcnEpKTsKKyAgICAgICAgaGEtPmJyZCA9IGlvcmVtYXAocGNpc3RyLT5kcG1lbSwgc2l6ZW9mKGdkdDZfZHByYW1fc3RyKSk7CisgICAgICAgIGlmIChoYS0+YnJkID09IE5VTEwpIHsKKyAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogSW5pdGlhbGl6YXRpb24gZXJyb3IgKERQTUVNIHJlbWFwIGVycm9yKVxuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAvKiBjaGVjayBhbmQgcmVzZXQgaW50ZXJmYWNlIGFyZWEgKi8KKyAgICAgICAgZHA2X3B0ciA9IGhhLT5icmQ7CisgICAgICAgIGdkdGhfd3JpdGVsKERQTUVNX01BR0lDLCAmZHA2X3B0ci0+dSk7CisgICAgICAgIGlmIChnZHRoX3JlYWRsKCZkcDZfcHRyLT51KSAhPSBEUE1FTV9NQUdJQykgeworICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBDYW5ub3QgYWNjZXNzIERQTUVNIGF0IDB4JWx4IChzaGFkb3dlZD8pXG4iLCAKKyAgICAgICAgICAgICAgICAgICBwY2lzdHItPmRwbWVtKTsKKyAgICAgICAgICAgIGZvdW5kID0gRkFMU0U7CisgICAgICAgICAgICBmb3IgKGkgPSAweEM4MDAwOyBpIDwgMHhFODAwMDsgaSArPSAweDQwMDApIHsKKyAgICAgICAgICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICAgICAgICAgIGhhLT5icmQgPSBpb3JlbWFwKGksIHNpemVvZih1c2hvcnQpKTsgCisgICAgICAgICAgICAgICAgaWYgKGhhLT5icmQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IEluaXRpYWxpemF0aW9uIGVycm9yIChEUE1FTSByZW1hcCBlcnJvcilcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGdkdGhfcmVhZHcoaGEtPmJyZCkgIT0gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgIFRSQUNFMigoImluaXRfcGNpX29sZCgpIGFkZHJlc3MgMHgleCBidXN5XG4iLCBpKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICAgICAgICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpc3RyLT5wZGV2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9CQVNFX0FERFJFU1NfMCwgaSk7CisgICAgICAgICAgICAgICAgaGEtPmJyZCA9IGlvcmVtYXAoaSwgc2l6ZW9mKGdkdDZfZHByYW1fc3RyKSk7IAorICAgICAgICAgICAgICAgIGlmIChoYS0+YnJkID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBJbml0aWFsaXphdGlvbiBlcnJvciAoRFBNRU0gcmVtYXAgZXJyb3IpXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRwNl9wdHIgPSBoYS0+YnJkOworICAgICAgICAgICAgICAgIGdkdGhfd3JpdGVsKERQTUVNX01BR0lDLCAmZHA2X3B0ci0+dSk7CisgICAgICAgICAgICAgICAgaWYgKGdkdGhfcmVhZGwoJmRwNl9wdHItPnUpID09IERQTUVNX01BR0lDKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogVXNlIGZyZWUgYWRkcmVzcyBhdCAweCV4XG4iLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ICAgCisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBObyBmcmVlIGFkZHJlc3MgZm91bmQhXG4iKTsKKyAgICAgICAgICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1lbXNldF9pbygmZHA2X3B0ci0+dSwgMCwgc2l6ZW9mKGRwNl9wdHItPnUpKTsKKyAgICAgICAgaWYgKGdkdGhfcmVhZGwoJmRwNl9wdHItPnUpICE9IDApIHsKKyAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogSW5pdGlhbGl6YXRpb24gZXJyb3IgKERQTUVNIHdyaXRlIGVycm9yKVxuIik7CisgICAgICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIGRpc2FibGUgYm9hcmQgaW50ZXJydXB0cywgZGVpbml0IHNlcnZpY2VzICovCisgICAgICAgIGdkdGhfd3JpdGViKDB4ZmYsICZkcDZfcHRyLT5pby5pcnFkZWwpOworICAgICAgICBnZHRoX3dyaXRlYigweDAwLCAmZHA2X3B0ci0+aW8uaXJxZW4pOworICAgICAgICBnZHRoX3dyaXRlYigweDAwLCAmZHA2X3B0ci0+dS5pYy5TX1N0YXR1cyk7CisgICAgICAgIGdkdGhfd3JpdGViKDB4MDAsICZkcDZfcHRyLT51LmljLkNtZF9JbmRleCk7CisKKyAgICAgICAgZ2R0aF93cml0ZWwocGNpc3RyLT5kcG1lbSwgJmRwNl9wdHItPnUuaWMuU19JbmZvWzBdKTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMHhmZiwgJmRwNl9wdHItPnUuaWMuU19DbWRfSW5keCk7CisgICAgICAgIGdkdGhfd3JpdGViKDAsICZkcDZfcHRyLT5pby5ldmVudCk7CisgICAgICAgIHJldHJpZXMgPSBJTklUX1JFVFJJRVM7CisgICAgICAgIGdkdGhfZGVsYXkoMjApOworICAgICAgICB3aGlsZSAoZ2R0aF9yZWFkYigmZHA2X3B0ci0+dS5pYy5TX1N0YXR1cykgIT0gMHhmZikgeworICAgICAgICAgICAgaWYgKC0tcmV0cmllcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBJbml0aWFsaXphdGlvbiBlcnJvciAoREVJTklUIGZhaWxlZClcbiIpOworICAgICAgICAgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZHRoX2RlbGF5KDEpOworICAgICAgICB9CisgICAgICAgIHByb3RfdmVyID0gKHVuY2hhcilnZHRoX3JlYWRsKCZkcDZfcHRyLT51LmljLlNfSW5mb1swXSk7CisgICAgICAgIGdkdGhfd3JpdGViKDAsICZkcDZfcHRyLT51LmljLlNfU3RhdHVzKTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMHhmZiwgJmRwNl9wdHItPmlvLmlycWRlbCk7CisgICAgICAgIGlmIChwcm90X3ZlciAhPSBQUk9UT0NPTF9WRVJTSU9OKSB7CisgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IElsbGVnYWwgcHJvdG9jb2wgdmVyc2lvblxuIik7CisgICAgICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBoYS0+dHlwZSA9IEdEVF9QQ0k7CisgICAgICAgIGhhLT5pY19hbGxfc2l6ZSA9IHNpemVvZihkcDZfcHRyLT51KTsKKyAgICAgICAgCisgICAgICAgIC8qIHNwZWNpYWwgY29tbWFuZCB0byBjb250cm9sbGVyIEJJT1MgKi8KKyAgICAgICAgZ2R0aF93cml0ZWwoMHgwMCwgJmRwNl9wdHItPnUuaWMuU19JbmZvWzBdKTsKKyAgICAgICAgZ2R0aF93cml0ZWwoMHgwMCwgJmRwNl9wdHItPnUuaWMuU19JbmZvWzFdKTsKKyAgICAgICAgZ2R0aF93cml0ZWwoMHgwMCwgJmRwNl9wdHItPnUuaWMuU19JbmZvWzJdKTsKKyAgICAgICAgZ2R0aF93cml0ZWwoMHgwMCwgJmRwNl9wdHItPnUuaWMuU19JbmZvWzNdKTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMHhmZSwgJmRwNl9wdHItPnUuaWMuU19DbWRfSW5keCk7CisgICAgICAgIGdkdGhfd3JpdGViKDAsICZkcDZfcHRyLT5pby5ldmVudCk7CisgICAgICAgIHJldHJpZXMgPSBJTklUX1JFVFJJRVM7CisgICAgICAgIGdkdGhfZGVsYXkoMjApOworICAgICAgICB3aGlsZSAoZ2R0aF9yZWFkYigmZHA2X3B0ci0+dS5pYy5TX1N0YXR1cykgIT0gMHhmZSkgeworICAgICAgICAgICAgaWYgKC0tcmV0cmllcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBJbml0aWFsaXphdGlvbiBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgaW91bm1hcChoYS0+YnJkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdkdGhfZGVsYXkoMSk7CisgICAgICAgIH0KKyAgICAgICAgZ2R0aF93cml0ZWIoMCwgJmRwNl9wdHItPnUuaWMuU19TdGF0dXMpOworICAgICAgICBnZHRoX3dyaXRlYigweGZmLCAmZHA2X3B0ci0+aW8uaXJxZGVsKTsKKworICAgICAgICBoYS0+ZG1hNjRfc3VwcG9ydCA9IDA7CisKKyAgICB9IGVsc2UgaWYgKGhhLT5zdHlwZSA8PSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTU1KSB7IC8qIEdEVDYxMTAsIC4uLiAqLworICAgICAgICBoYS0+cGx4ID0gKGdkdDZjX3BseF9yZWdzICopcGNpc3RyLT5pbzsKKyAgICAgICAgVFJBQ0UyKCgiaW5pdF9wY2lfbmV3KCkgZHBtZW0gJWx4IGlycSAlZFxuIiwKKyAgICAgICAgICAgIHBjaXN0ci0+ZHBtZW0saGEtPmlycSkpOworICAgICAgICBoYS0+YnJkID0gaW9yZW1hcChwY2lzdHItPmRwbWVtLCBzaXplb2YoZ2R0NmNfZHByYW1fc3RyKSk7CisgICAgICAgIGlmIChoYS0+YnJkID09IE5VTEwpIHsKKyAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogSW5pdGlhbGl6YXRpb24gZXJyb3IgKERQTUVNIHJlbWFwIGVycm9yKVxuIik7CisgICAgICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgLyogY2hlY2sgYW5kIHJlc2V0IGludGVyZmFjZSBhcmVhICovCisgICAgICAgIGRwNmNfcHRyID0gaGEtPmJyZDsKKyAgICAgICAgZ2R0aF93cml0ZWwoRFBNRU1fTUFHSUMsICZkcDZjX3B0ci0+dSk7CisgICAgICAgIGlmIChnZHRoX3JlYWRsKCZkcDZjX3B0ci0+dSkgIT0gRFBNRU1fTUFHSUMpIHsKKyAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogQ2Fubm90IGFjY2VzcyBEUE1FTSBhdCAweCVseCAoc2hhZG93ZWQ/KVxuIiwgCisgICAgICAgICAgICAgICAgICAgcGNpc3RyLT5kcG1lbSk7CisgICAgICAgICAgICBmb3VuZCA9IEZBTFNFOworICAgICAgICAgICAgZm9yIChpID0gMHhDODAwMDsgaSA8IDB4RTgwMDA7IGkgKz0gMHg0MDAwKSB7CisgICAgICAgICAgICAgICAgaW91bm1hcChoYS0+YnJkKTsKKyAgICAgICAgICAgICAgICBoYS0+YnJkID0gaW9yZW1hcChpLCBzaXplb2YodXNob3J0KSk7IAorICAgICAgICAgICAgICAgIGlmIChoYS0+YnJkID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBJbml0aWFsaXphdGlvbiBlcnJvciAoRFBNRU0gcmVtYXAgZXJyb3IpXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChnZHRoX3JlYWR3KGhhLT5icmQpICE9IDB4ZmZmZikgeworICAgICAgICAgICAgICAgICAgICBUUkFDRTIoKCJpbml0X3BjaV9wbHgoKSBhZGRyZXNzIDB4JXggYnVzeVxuIiwgaSkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW91bm1hcChoYS0+YnJkKTsKKyAgICAgICAgICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaXN0ci0+cGRldiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfQkFTRV9BRERSRVNTXzIsIGkpOworICAgICAgICAgICAgICAgIGhhLT5icmQgPSBpb3JlbWFwKGksIHNpemVvZihnZHQ2Y19kcHJhbV9zdHIpKTsgCisgICAgICAgICAgICAgICAgaWYgKGhhLT5icmQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IEluaXRpYWxpemF0aW9uIGVycm9yIChEUE1FTSByZW1hcCBlcnJvcilcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHA2Y19wdHIgPSBoYS0+YnJkOworICAgICAgICAgICAgICAgIGdkdGhfd3JpdGVsKERQTUVNX01BR0lDLCAmZHA2Y19wdHItPnUpOworICAgICAgICAgICAgICAgIGlmIChnZHRoX3JlYWRsKCZkcDZjX3B0ci0+dSkgPT0gRFBNRU1fTUFHSUMpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBVc2UgZnJlZSBhZGRyZXNzIGF0IDB4JXhcbiIsIGkpOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IE5vIGZyZWUgYWRkcmVzcyBmb3VuZCFcbiIpOworICAgICAgICAgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0X2lvKCZkcDZjX3B0ci0+dSwgMCwgc2l6ZW9mKGRwNmNfcHRyLT51KSk7CisgICAgICAgIGlmIChnZHRoX3JlYWRsKCZkcDZjX3B0ci0+dSkgIT0gMCkgeworICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBJbml0aWFsaXphdGlvbiBlcnJvciAoRFBNRU0gd3JpdGUgZXJyb3IpXG4iKTsKKyAgICAgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogZGlzYWJsZSBib2FyZCBpbnRlcnJ1cHRzLCBkZWluaXQgc2VydmljZXMgKi8KKyAgICAgICAgb3V0YigweDAwLFBUUjJVU0hPUlQoJmhhLT5wbHgtPmNvbnRyb2wxKSk7CisgICAgICAgIG91dGIoMHhmZixQVFIyVVNIT1JUKCZoYS0+cGx4LT5lZG9vcl9yZWcpKTsKKyAgICAgICAgCisgICAgICAgIGdkdGhfd3JpdGViKDB4MDAsICZkcDZjX3B0ci0+dS5pYy5TX1N0YXR1cyk7CisgICAgICAgIGdkdGhfd3JpdGViKDB4MDAsICZkcDZjX3B0ci0+dS5pYy5DbWRfSW5kZXgpOworCisgICAgICAgIGdkdGhfd3JpdGVsKHBjaXN0ci0+ZHBtZW0sICZkcDZjX3B0ci0+dS5pYy5TX0luZm9bMF0pOworICAgICAgICBnZHRoX3dyaXRlYigweGZmLCAmZHA2Y19wdHItPnUuaWMuU19DbWRfSW5keCk7CisKKyAgICAgICAgb3V0YigxLFBUUjJVU0hPUlQoJmhhLT5wbHgtPmxkb29yX3JlZykpOworCisgICAgICAgIHJldHJpZXMgPSBJTklUX1JFVFJJRVM7CisgICAgICAgIGdkdGhfZGVsYXkoMjApOworICAgICAgICB3aGlsZSAoZ2R0aF9yZWFkYigmZHA2Y19wdHItPnUuaWMuU19TdGF0dXMpICE9IDB4ZmYpIHsKKyAgICAgICAgICAgIGlmICgtLXJldHJpZXMgPT0gMCkgeworICAgICAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogSW5pdGlhbGl6YXRpb24gZXJyb3IgKERFSU5JVCBmYWlsZWQpXG4iKTsKKyAgICAgICAgICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2R0aF9kZWxheSgxKTsKKyAgICAgICAgfQorICAgICAgICBwcm90X3ZlciA9ICh1bmNoYXIpZ2R0aF9yZWFkbCgmZHA2Y19wdHItPnUuaWMuU19JbmZvWzBdKTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMCwgJmRwNmNfcHRyLT51LmljLlN0YXR1cyk7CisgICAgICAgIGlmIChwcm90X3ZlciAhPSBQUk9UT0NPTF9WRVJTSU9OKSB7CisgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IElsbGVnYWwgcHJvdG9jb2wgdmVyc2lvblxuIik7CisgICAgICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBoYS0+dHlwZSA9IEdEVF9QQ0lORVc7CisgICAgICAgIGhhLT5pY19hbGxfc2l6ZSA9IHNpemVvZihkcDZjX3B0ci0+dSk7CisKKyAgICAgICAgLyogc3BlY2lhbCBjb21tYW5kIHRvIGNvbnRyb2xsZXIgQklPUyAqLworICAgICAgICBnZHRoX3dyaXRlbCgweDAwLCAmZHA2Y19wdHItPnUuaWMuU19JbmZvWzBdKTsKKyAgICAgICAgZ2R0aF93cml0ZWwoMHgwMCwgJmRwNmNfcHRyLT51LmljLlNfSW5mb1sxXSk7CisgICAgICAgIGdkdGhfd3JpdGVsKDB4MDAsICZkcDZjX3B0ci0+dS5pYy5TX0luZm9bMl0pOworICAgICAgICBnZHRoX3dyaXRlbCgweDAwLCAmZHA2Y19wdHItPnUuaWMuU19JbmZvWzNdKTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMHhmZSwgJmRwNmNfcHRyLT51LmljLlNfQ21kX0luZHgpOworICAgICAgICAKKyAgICAgICAgb3V0YigxLFBUUjJVU0hPUlQoJmhhLT5wbHgtPmxkb29yX3JlZykpOworCisgICAgICAgIHJldHJpZXMgPSBJTklUX1JFVFJJRVM7CisgICAgICAgIGdkdGhfZGVsYXkoMjApOworICAgICAgICB3aGlsZSAoZ2R0aF9yZWFkYigmZHA2Y19wdHItPnUuaWMuU19TdGF0dXMpICE9IDB4ZmUpIHsKKyAgICAgICAgICAgIGlmICgtLXJldHJpZXMgPT0gMCkgeworICAgICAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogSW5pdGlhbGl6YXRpb24gZXJyb3JcbiIpOworICAgICAgICAgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZHRoX2RlbGF5KDEpOworICAgICAgICB9CisgICAgICAgIGdkdGhfd3JpdGViKDAsICZkcDZjX3B0ci0+dS5pYy5TX1N0YXR1cyk7CisKKyAgICAgICAgaGEtPmRtYTY0X3N1cHBvcnQgPSAwOworCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1QUiAqLworICAgICAgICBUUkFDRTIoKCJpbml0X3BjaV9tcHIoKSBkcG1lbSAlbHggaXJxICVkXG4iLHBjaXN0ci0+ZHBtZW0saGEtPmlycSkpOworICAgICAgICBoYS0+YnJkID0gaW9yZW1hcChwY2lzdHItPmRwbWVtLCBzaXplb2YoZ2R0Nm1fZHByYW1fc3RyKSk7CisgICAgICAgIGlmIChoYS0+YnJkID09IE5VTEwpIHsKKyAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogSW5pdGlhbGl6YXRpb24gZXJyb3IgKERQTUVNIHJlbWFwIGVycm9yKVxuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG1hbmlwdWxhdGUgY29uZmlnLiBzcGFjZSB0byBlbmFibGUgRFBNRU0sIHN0YXJ0IFJQIGNvbnRyb2xsZXIgKi8KKyAgICAgICAgcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpc3RyLT5wZGV2LCBQQ0lfQ09NTUFORCwgJmNvbW1hbmQpOworICAgICAgICBjb21tYW5kIHw9IDY7CisgICAgICAgIHBjaV93cml0ZV9jb25maWdfd29yZChwY2lzdHItPnBkZXYsIFBDSV9DT01NQU5ELCBjb21tYW5kKTsKKyAgICAgICAgaWYgKHBjaV9yZXNvdXJjZV9zdGFydChwY2lzdHItPnBkZXYsIDgpID09IDFVTCkKKyAgICAgICAgICAgIHBjaV9yZXNvdXJjZV9zdGFydChwY2lzdHItPnBkZXYsIDgpID0gMFVMOworICAgICAgICBpID0gMHhGRUZGMDAwMVVMOworICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaXN0ci0+cGRldiwgUENJX1JPTV9BRERSRVNTLCBpKTsKKyAgICAgICAgZ2R0aF9kZWxheSgxKTsKKyAgICAgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lzdHItPnBkZXYsIFBDSV9ST01fQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpc3RyLT5wZGV2LCA4KSk7CisgICAgICAgIAorICAgICAgICBkcDZtX3B0ciA9IGhhLT5icmQ7CisKKyAgICAgICAgLyogRW5zdXJlIHRoYXQgaXQgaXMgc2FmZSB0byBhY2Nlc3MgdGhlIG5vbiBIVyBwb3J0aW9ucyBvZiBEUE1FTS4KKyAgICAgICAgICogQWRpdGlvbmFsIGNoZWNrIG5lZWRlZCBmb3IgWHNjYWxlIGJhc2VkIFJBSUQgY29udHJvbGxlcnMgKi8KKyAgICAgICAgd2hpbGUoICgoaW50KWdkdGhfcmVhZGIoJmRwNm1fcHRyLT5pOTYwci5zZW1hMF9yZWcpICkgJiAzICkKKyAgICAgICAgICAgIGdkdGhfZGVsYXkoMSk7CisgICAgICAgIAorICAgICAgICAvKiBjaGVjayBhbmQgcmVzZXQgaW50ZXJmYWNlIGFyZWEgKi8KKyAgICAgICAgZ2R0aF93cml0ZWwoRFBNRU1fTUFHSUMsICZkcDZtX3B0ci0+dSk7CisgICAgICAgIGlmIChnZHRoX3JlYWRsKCZkcDZtX3B0ci0+dSkgIT0gRFBNRU1fTUFHSUMpIHsKKyAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogQ2Fubm90IGFjY2VzcyBEUE1FTSBhdCAweCVseCAoc2hhZG93ZWQ/KVxuIiwgCisgICAgICAgICAgICAgICAgICAgcGNpc3RyLT5kcG1lbSk7CisgICAgICAgICAgICBmb3VuZCA9IEZBTFNFOworICAgICAgICAgICAgZm9yIChpID0gMHhDODAwMDsgaSA8IDB4RTgwMDA7IGkgKz0gMHg0MDAwKSB7CisgICAgICAgICAgICAgICAgaW91bm1hcChoYS0+YnJkKTsKKyAgICAgICAgICAgICAgICBoYS0+YnJkID0gaW9yZW1hcChpLCBzaXplb2YodXNob3J0KSk7IAorICAgICAgICAgICAgICAgIGlmIChoYS0+YnJkID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBJbml0aWFsaXphdGlvbiBlcnJvciAoRFBNRU0gcmVtYXAgZXJyb3IpXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChnZHRoX3JlYWR3KGhhLT5icmQpICE9IDB4ZmZmZikgeworICAgICAgICAgICAgICAgICAgICBUUkFDRTIoKCJpbml0X3BjaV9tcHIoKSBhZGRyZXNzIDB4JXggYnVzeVxuIiwgaSkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW91bm1hcChoYS0+YnJkKTsKKyAgICAgICAgICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaXN0ci0+cGRldiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfQkFTRV9BRERSRVNTXzAsIGkpOworICAgICAgICAgICAgICAgIGhhLT5icmQgPSBpb3JlbWFwKGksIHNpemVvZihnZHQ2bV9kcHJhbV9zdHIpKTsgCisgICAgICAgICAgICAgICAgaWYgKGhhLT5icmQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IEluaXRpYWxpemF0aW9uIGVycm9yIChEUE1FTSByZW1hcCBlcnJvcilcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHA2bV9wdHIgPSBoYS0+YnJkOworICAgICAgICAgICAgICAgIGdkdGhfd3JpdGVsKERQTUVNX01BR0lDLCAmZHA2bV9wdHItPnUpOworICAgICAgICAgICAgICAgIGlmIChnZHRoX3JlYWRsKCZkcDZtX3B0ci0+dSkgPT0gRFBNRU1fTUFHSUMpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBVc2UgZnJlZSBhZGRyZXNzIGF0IDB4JXhcbiIsIGkpOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IE5vIGZyZWUgYWRkcmVzcyBmb3VuZCFcbiIpOworICAgICAgICAgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0X2lvKCZkcDZtX3B0ci0+dSwgMCwgc2l6ZW9mKGRwNm1fcHRyLT51KSk7CisgICAgICAgIAorICAgICAgICAvKiBkaXNhYmxlIGJvYXJkIGludGVycnVwdHMsIGRlaW5pdCBzZXJ2aWNlcyAqLworICAgICAgICBnZHRoX3dyaXRlYihnZHRoX3JlYWRiKCZkcDZtX3B0ci0+aTk2MHIuZWRvb3JfZW5fcmVnKSB8IDQsCisgICAgICAgICAgICAgICAgICAgICZkcDZtX3B0ci0+aTk2MHIuZWRvb3JfZW5fcmVnKTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMHhmZiwgJmRwNm1fcHRyLT5pOTYwci5lZG9vcl9yZWcpOworICAgICAgICBnZHRoX3dyaXRlYigweDAwLCAmZHA2bV9wdHItPnUuaWMuU19TdGF0dXMpOworICAgICAgICBnZHRoX3dyaXRlYigweDAwLCAmZHA2bV9wdHItPnUuaWMuQ21kX0luZGV4KTsKKworICAgICAgICBnZHRoX3dyaXRlbChwY2lzdHItPmRwbWVtLCAmZHA2bV9wdHItPnUuaWMuU19JbmZvWzBdKTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMHhmZiwgJmRwNm1fcHRyLT51LmljLlNfQ21kX0luZHgpOworICAgICAgICBnZHRoX3dyaXRlYigxLCAmZHA2bV9wdHItPmk5NjByLmxkb29yX3JlZyk7CisgICAgICAgIHJldHJpZXMgPSBJTklUX1JFVFJJRVM7CisgICAgICAgIGdkdGhfZGVsYXkoMjApOworICAgICAgICB3aGlsZSAoZ2R0aF9yZWFkYigmZHA2bV9wdHItPnUuaWMuU19TdGF0dXMpICE9IDB4ZmYpIHsKKyAgICAgICAgICAgIGlmICgtLXJldHJpZXMgPT0gMCkgeworICAgICAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogSW5pdGlhbGl6YXRpb24gZXJyb3IgKERFSU5JVCBmYWlsZWQpXG4iKTsKKyAgICAgICAgICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2R0aF9kZWxheSgxKTsKKyAgICAgICAgfQorICAgICAgICBwcm90X3ZlciA9ICh1bmNoYXIpZ2R0aF9yZWFkbCgmZHA2bV9wdHItPnUuaWMuU19JbmZvWzBdKTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMCwgJmRwNm1fcHRyLT51LmljLlNfU3RhdHVzKTsKKyAgICAgICAgaWYgKHByb3RfdmVyICE9IFBST1RPQ09MX1ZFUlNJT04pIHsKKyAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogSWxsZWdhbCBwcm90b2NvbCB2ZXJzaW9uXG4iKTsKKyAgICAgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGhhLT50eXBlID0gR0RUX1BDSU1QUjsKKyAgICAgICAgaGEtPmljX2FsbF9zaXplID0gc2l6ZW9mKGRwNm1fcHRyLT51KTsKKyAgICAgICAgCisgICAgICAgIC8qIHNwZWNpYWwgY29tbWFuZCB0byBjb250cm9sbGVyIEJJT1MgKi8KKyAgICAgICAgZ2R0aF93cml0ZWwoMHgwMCwgJmRwNm1fcHRyLT51LmljLlNfSW5mb1swXSk7CisgICAgICAgIGdkdGhfd3JpdGVsKDB4MDAsICZkcDZtX3B0ci0+dS5pYy5TX0luZm9bMV0pOworICAgICAgICBnZHRoX3dyaXRlbCgweDAwLCAmZHA2bV9wdHItPnUuaWMuU19JbmZvWzJdKTsKKyAgICAgICAgZ2R0aF93cml0ZWwoMHgwMCwgJmRwNm1fcHRyLT51LmljLlNfSW5mb1szXSk7CisgICAgICAgIGdkdGhfd3JpdGViKDB4ZmUsICZkcDZtX3B0ci0+dS5pYy5TX0NtZF9JbmR4KTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMSwgJmRwNm1fcHRyLT5pOTYwci5sZG9vcl9yZWcpOworICAgICAgICByZXRyaWVzID0gSU5JVF9SRVRSSUVTOworICAgICAgICBnZHRoX2RlbGF5KDIwKTsKKyAgICAgICAgd2hpbGUgKGdkdGhfcmVhZGIoJmRwNm1fcHRyLT51LmljLlNfU3RhdHVzKSAhPSAweGZlKSB7CisgICAgICAgICAgICBpZiAoLS1yZXRyaWVzID09IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IEluaXRpYWxpemF0aW9uIGVycm9yXG4iKTsKKyAgICAgICAgICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2R0aF9kZWxheSgxKTsKKyAgICAgICAgfQorICAgICAgICBnZHRoX3dyaXRlYigwLCAmZHA2bV9wdHItPnUuaWMuU19TdGF0dXMpOworCisgICAgICAgIC8qIHJlYWQgRlcgdmVyc2lvbiB0byBkZXRlY3QgNjQtYml0IERNQSBzdXBwb3J0ICovCisgICAgICAgIGdkdGhfd3JpdGViKDB4ZmQsICZkcDZtX3B0ci0+dS5pYy5TX0NtZF9JbmR4KTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMSwgJmRwNm1fcHRyLT5pOTYwci5sZG9vcl9yZWcpOworICAgICAgICByZXRyaWVzID0gSU5JVF9SRVRSSUVTOworICAgICAgICBnZHRoX2RlbGF5KDIwKTsKKyAgICAgICAgd2hpbGUgKGdkdGhfcmVhZGIoJmRwNm1fcHRyLT51LmljLlNfU3RhdHVzKSAhPSAweGZkKSB7CisgICAgICAgICAgICBpZiAoLS1yZXRyaWVzID09IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IEluaXRpYWxpemF0aW9uIGVycm9yIChERUlOSVQgZmFpbGVkKVxuIik7CisgICAgICAgICAgICAgICAgaW91bm1hcChoYS0+YnJkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdkdGhfZGVsYXkoMSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdF92ZXIgPSAodW5jaGFyKShnZHRoX3JlYWRsKCZkcDZtX3B0ci0+dS5pYy5TX0luZm9bMF0pID4+IDE2KTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMCwgJmRwNm1fcHRyLT51LmljLlNfU3RhdHVzKTsKKyAgICAgICAgaWYgKHByb3RfdmVyIDwgMHgyYikgICAgICAvKiBGVyA8IHguNDM6IG5vIDY0LWJpdCBETUEgc3VwcG9ydCAqLworICAgICAgICAgICAgaGEtPmRtYTY0X3N1cHBvcnQgPSAwOworICAgICAgICBlbHNlIAorICAgICAgICAgICAgaGEtPmRtYTY0X3N1cHBvcnQgPSAxOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCisKKy8qIGNvbnRyb2xsZXIgcHJvdG9jb2wgZnVuY3Rpb25zICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBnZHRoX2VuYWJsZV9pbnQoaW50IGhhbnVtKQoreworICAgIGdkdGhfaGFfc3RyICpoYTsKKyAgICB1bG9uZyBmbGFnczsKKyAgICBnZHQyX2RwcmFtX3N0ciBfX2lvbWVtICpkcDJfcHRyOworICAgIGdkdDZfZHByYW1fc3RyIF9faW9tZW0gKmRwNl9wdHI7CisgICAgZ2R0Nm1fZHByYW1fc3RyIF9faW9tZW0gKmRwNm1fcHRyOworCisgICAgVFJBQ0UoKCJnZHRoX2VuYWJsZV9pbnQoKSBoYW51bSAlZFxuIixoYW51bSkpOworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKworICAgIGlmIChoYS0+dHlwZSA9PSBHRFRfRUlTQSkgeworICAgICAgICBvdXRiKDB4ZmYsIGhhLT5ibWljICsgRURPT1JSRUcpOworICAgICAgICBvdXRiKDB4ZmYsIGhhLT5ibWljICsgRURFTkFCUkVHKTsKKyAgICAgICAgb3V0YigweDAxLCBoYS0+Ym1pYyArIEVJTlRFTkFCUkVHKTsKKyAgICB9IGVsc2UgaWYgKGhhLT50eXBlID09IEdEVF9JU0EpIHsKKyAgICAgICAgZHAyX3B0ciA9IGhhLT5icmQ7CisgICAgICAgIGdkdGhfd3JpdGViKDEsICZkcDJfcHRyLT5pby5pcnFkZWwpOworICAgICAgICBnZHRoX3dyaXRlYigwLCAmZHAyX3B0ci0+dS5pYy5DbWRfSW5kZXgpOworICAgICAgICBnZHRoX3dyaXRlYigxLCAmZHAyX3B0ci0+aW8uaXJxZW4pOworICAgIH0gZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSSkgeworICAgICAgICBkcDZfcHRyID0gaGEtPmJyZDsKKyAgICAgICAgZ2R0aF93cml0ZWIoMSwgJmRwNl9wdHItPmlvLmlycWRlbCk7CisgICAgICAgIGdkdGhfd3JpdGViKDAsICZkcDZfcHRyLT51LmljLkNtZF9JbmRleCk7CisgICAgICAgIGdkdGhfd3JpdGViKDEsICZkcDZfcHRyLT5pby5pcnFlbik7CisgICAgfSBlbHNlIGlmIChoYS0+dHlwZSA9PSBHRFRfUENJTkVXKSB7CisgICAgICAgIG91dGIoMHhmZiwgUFRSMlVTSE9SVCgmaGEtPnBseC0+ZWRvb3JfcmVnKSk7CisgICAgICAgIG91dGIoMHgwMywgUFRSMlVTSE9SVCgmaGEtPnBseC0+Y29udHJvbDEpKTsKKyAgICB9IGVsc2UgaWYgKGhhLT50eXBlID09IEdEVF9QQ0lNUFIpIHsKKyAgICAgICAgZHA2bV9wdHIgPSBoYS0+YnJkOworICAgICAgICBnZHRoX3dyaXRlYigweGZmLCAmZHA2bV9wdHItPmk5NjByLmVkb29yX3JlZyk7CisgICAgICAgIGdkdGhfd3JpdGViKGdkdGhfcmVhZGIoJmRwNm1fcHRyLT5pOTYwci5lZG9vcl9lbl9yZWcpICYgfjQsCisgICAgICAgICAgICAgICAgICAgICZkcDZtX3B0ci0+aTk2MHIuZWRvb3JfZW5fcmVnKTsKKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIGludCBnZHRoX2dldF9zdGF0dXModW5jaGFyICpwSVN0YXR1cyxpbnQgaXJxKQoreworICAgIHJlZ2lzdGVyIGdkdGhfaGFfc3RyICpoYTsKKyAgICBpbnQgaTsKKworICAgIFRSQUNFKCgiZ2R0aF9nZXRfc3RhdHVzKCkgaXJxICVkIGN0cl9jb3VudCAlZFxuIiwKKyAgICAgICAgICAgaXJxLGdkdGhfY3RyX2NvdW50KSk7CisgICAgCisgICAgKnBJU3RhdHVzID0gMDsKKyAgICBmb3IgKGk9MDsgaTxnZHRoX2N0cl9jb3VudDsgKytpKSB7CisgICAgICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltpXSk7CisgICAgICAgIGlmIChoYS0+aXJxICE9ICh1bmNoYXIpaXJxKSAgICAgICAgICAgICAvKiBjaGVjayBJUlEgKi8KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoaGEtPnR5cGUgPT0gR0RUX0VJU0EpCisgICAgICAgICAgICAqcElTdGF0dXMgPSBpbmIoKHVzaG9ydCloYS0+Ym1pYyArIEVET09SUkVHKTsKKyAgICAgICAgZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX0lTQSkKKyAgICAgICAgICAgICpwSVN0YXR1cyA9CisgICAgICAgICAgICAgICAgZ2R0aF9yZWFkYigmKChnZHQyX2RwcmFtX3N0ciBfX2lvbWVtICopaGEtPmJyZCktPnUuaWMuQ21kX0luZGV4KTsKKyAgICAgICAgZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSSkKKyAgICAgICAgICAgICpwSVN0YXR1cyA9CisgICAgICAgICAgICAgICAgZ2R0aF9yZWFkYigmKChnZHQ2X2RwcmFtX3N0ciBfX2lvbWVtICopaGEtPmJyZCktPnUuaWMuQ21kX0luZGV4KTsKKyAgICAgICAgZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSU5FVykgCisgICAgICAgICAgICAqcElTdGF0dXMgPSBpbmIoUFRSMlVTSE9SVCgmaGEtPnBseC0+ZWRvb3JfcmVnKSk7CisgICAgICAgIGVsc2UgaWYgKGhhLT50eXBlID09IEdEVF9QQ0lNUFIpCisgICAgICAgICAgICAqcElTdGF0dXMgPQorICAgICAgICAgICAgICAgIGdkdGhfcmVhZGIoJigoZ2R0Nm1fZHByYW1fc3RyIF9faW9tZW0gKiloYS0+YnJkKS0+aTk2MHIuZWRvb3JfcmVnKTsKKyAgIAorICAgICAgICBpZiAoKnBJU3RhdHVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJvYXJkIGZvdW5kICovCisgICAgfQorICAgIHJldHVybiAtMTsKK30KKyAgICAgICAgICAgICAgICAgCisgICAgCitzdGF0aWMgaW50IGdkdGhfdGVzdF9idXN5KGludCBoYW51bSkKK3sKKyAgICByZWdpc3RlciBnZHRoX2hhX3N0ciAqaGE7CisgICAgcmVnaXN0ZXIgaW50IGdkdHNlbWEwID0gMDsKKworICAgIFRSQUNFKCgiZ2R0aF90ZXN0X2J1c3koKSBoYW51bSAlZFxuIixoYW51bSkpOworICAgIAorICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIGlmIChoYS0+dHlwZSA9PSBHRFRfRUlTQSkKKyAgICAgICAgZ2R0c2VtYTAgPSAoaW50KWluYihoYS0+Ym1pYyArIFNFTUEwUkVHKTsKKyAgICBlbHNlIGlmIChoYS0+dHlwZSA9PSBHRFRfSVNBKQorICAgICAgICBnZHRzZW1hMCA9IChpbnQpZ2R0aF9yZWFkYigmKChnZHQyX2RwcmFtX3N0ciBfX2lvbWVtICopaGEtPmJyZCktPnUuaWMuU2VtYTApOworICAgIGVsc2UgaWYgKGhhLT50eXBlID09IEdEVF9QQ0kpCisgICAgICAgIGdkdHNlbWEwID0gKGludClnZHRoX3JlYWRiKCYoKGdkdDZfZHByYW1fc3RyIF9faW9tZW0gKiloYS0+YnJkKS0+dS5pYy5TZW1hMCk7CisgICAgZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSU5FVykgCisgICAgICAgIGdkdHNlbWEwID0gKGludClpbmIoUFRSMlVTSE9SVCgmaGEtPnBseC0+c2VtYTBfcmVnKSk7CisgICAgZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSU1QUikKKyAgICAgICAgZ2R0c2VtYTAgPSAKKyAgICAgICAgICAgIChpbnQpZ2R0aF9yZWFkYigmKChnZHQ2bV9kcHJhbV9zdHIgX19pb21lbSAqKWhhLT5icmQpLT5pOTYwci5zZW1hMF9yZWcpOworCisgICAgcmV0dXJuIChnZHRzZW1hMCAmIDEpOworfQorCisKK3N0YXRpYyBpbnQgZ2R0aF9nZXRfY21kX2luZGV4KGludCBoYW51bSkKK3sKKyAgICByZWdpc3RlciBnZHRoX2hhX3N0ciAqaGE7CisgICAgaW50IGk7CisKKyAgICBUUkFDRSgoImdkdGhfZ2V0X2NtZF9pbmRleCgpIGhhbnVtICVkXG4iLGhhbnVtKSk7CisKKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICBmb3IgKGk9MDsgaTxHRFRIX01BWENNRFM7ICsraSkgeworICAgICAgICBpZiAoaGEtPmNtZF90YWJbaV0uY21uZCA9PSBVTlVTRURfQ01ORCkgeworICAgICAgICAgICAgaGEtPmNtZF90YWJbaV0uY21uZCA9IGhhLT5wY2NiLT5SZXF1ZXN0QnVmZmVyOworICAgICAgICAgICAgaGEtPmNtZF90YWJbaV0uc2VydmljZSA9IGhhLT5wY2NiLT5TZXJ2aWNlOworICAgICAgICAgICAgaGEtPnBjY2ItPkNvbW1hbmRJbmRleCA9ICh1bG9uZzMyKWkrMjsKKyAgICAgICAgICAgIHJldHVybiAoaSsyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBnZHRoX3NldF9zZW1hMChpbnQgaGFudW0pCit7CisgICAgcmVnaXN0ZXIgZ2R0aF9oYV9zdHIgKmhhOworCisgICAgVFJBQ0UoKCJnZHRoX3NldF9zZW1hMCgpIGhhbnVtICVkXG4iLGhhbnVtKSk7CisKKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICBpZiAoaGEtPnR5cGUgPT0gR0RUX0VJU0EpIHsKKyAgICAgICAgb3V0YigxLCBoYS0+Ym1pYyArIFNFTUEwUkVHKTsKKyAgICB9IGVsc2UgaWYgKGhhLT50eXBlID09IEdEVF9JU0EpIHsKKyAgICAgICAgZ2R0aF93cml0ZWIoMSwgJigoZ2R0Ml9kcHJhbV9zdHIgX19pb21lbSAqKWhhLT5icmQpLT51LmljLlNlbWEwKTsKKyAgICB9IGVsc2UgaWYgKGhhLT50eXBlID09IEdEVF9QQ0kpIHsKKyAgICAgICAgZ2R0aF93cml0ZWIoMSwgJigoZ2R0Nl9kcHJhbV9zdHIgX19pb21lbSAqKWhhLT5icmQpLT51LmljLlNlbWEwKTsKKyAgICB9IGVsc2UgaWYgKGhhLT50eXBlID09IEdEVF9QQ0lORVcpIHsgCisgICAgICAgIG91dGIoMSwgUFRSMlVTSE9SVCgmaGEtPnBseC0+c2VtYTBfcmVnKSk7CisgICAgfSBlbHNlIGlmIChoYS0+dHlwZSA9PSBHRFRfUENJTVBSKSB7CisgICAgICAgIGdkdGhfd3JpdGViKDEsICYoKGdkdDZtX2RwcmFtX3N0ciBfX2lvbWVtICopaGEtPmJyZCktPmk5NjByLnNlbWEwX3JlZyk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGdkdGhfY29weV9jb21tYW5kKGludCBoYW51bSkKK3sKKyAgICByZWdpc3RlciBnZHRoX2hhX3N0ciAqaGE7CisgICAgcmVnaXN0ZXIgZ2R0aF9jbWRfc3RyICpjbWRfcHRyOworICAgIHJlZ2lzdGVyIGdkdDZtX2RwcmFtX3N0ciBfX2lvbWVtICpkcDZtX3B0cjsKKyAgICByZWdpc3RlciBnZHQ2Y19kcHJhbV9zdHIgX19pb21lbSAqZHA2Y19wdHI7CisgICAgZ2R0Nl9kcHJhbV9zdHIgX19pb21lbSAqZHA2X3B0cjsKKyAgICBnZHQyX2RwcmFtX3N0ciBfX2lvbWVtICpkcDJfcHRyOworICAgIHVzaG9ydCBjcF9jb3VudCxkcF9vZmZzZXQsY21kX25vOworICAgIAorICAgIFRSQUNFKCgiZ2R0aF9jb3B5X2NvbW1hbmQoKSBoYW51bSAlZFxuIixoYW51bSkpOworCisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgY3BfY291bnQgPSBoYS0+Y21kX2xlbjsKKyAgICBkcF9vZmZzZXQ9IGhhLT5jbWRfb2Zmc19kcG1lbTsKKyAgICBjbWRfbm8gICA9IGhhLT5jbWRfY250OworICAgIGNtZF9wdHIgID0gaGEtPnBjY2I7CisKKyAgICArK2hhLT5jbWRfY250OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmIChoYS0+dHlwZSA9PSBHRFRfRUlTQSkKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIERQTUVNLCBubyBjb3B5ICovCisKKyAgICAvKiBzZXQgY3Bjb3VudCBkd29yZCBhbGlnbmVkICovCisgICAgaWYgKGNwX2NvdW50ICYgMykKKyAgICAgICAgY3BfY291bnQgKz0gKDQgLSAoY3BfY291bnQgJiAzKSk7CisKKyAgICBoYS0+Y21kX29mZnNfZHBtZW0gKz0gY3BfY291bnQ7CisgICAgCisgICAgLyogc2V0IG9mZnNldCBhbmQgc2VydmljZSwgY29weSBjb21tYW5kIHRvIERQTUVNICovCisgICAgaWYgKGhhLT50eXBlID09IEdEVF9JU0EpIHsKKyAgICAgICAgZHAyX3B0ciA9IGhhLT5icmQ7CisgICAgICAgIGdkdGhfd3JpdGV3KGRwX29mZnNldCArIERQTUVNX0NPTU1BTkRfT0ZGU0VULCAKKyAgICAgICAgICAgICAgICAgICAgJmRwMl9wdHItPnUuaWMuY29tbV9xdWV1ZVtjbWRfbm9dLm9mZnNldCk7CisgICAgICAgIGdkdGhfd3JpdGV3KCh1c2hvcnQpY21kX3B0ci0+U2VydmljZSwgCisgICAgICAgICAgICAgICAgICAgICZkcDJfcHRyLT51LmljLmNvbW1fcXVldWVbY21kX25vXS5zZXJ2X2lkKTsKKyAgICAgICAgbWVtY3B5X3RvaW8oJmRwMl9wdHItPnUuaWMuZ2R0X2Rwcl9jbWRbZHBfb2Zmc2V0XSxjbWRfcHRyLGNwX2NvdW50KTsKKyAgICB9IGVsc2UgaWYgKGhhLT50eXBlID09IEdEVF9QQ0kpIHsKKyAgICAgICAgZHA2X3B0ciA9IGhhLT5icmQ7CisgICAgICAgIGdkdGhfd3JpdGV3KGRwX29mZnNldCArIERQTUVNX0NPTU1BTkRfT0ZGU0VULCAKKyAgICAgICAgICAgICAgICAgICAgJmRwNl9wdHItPnUuaWMuY29tbV9xdWV1ZVtjbWRfbm9dLm9mZnNldCk7CisgICAgICAgIGdkdGhfd3JpdGV3KCh1c2hvcnQpY21kX3B0ci0+U2VydmljZSwgCisgICAgICAgICAgICAgICAgICAgICZkcDZfcHRyLT51LmljLmNvbW1fcXVldWVbY21kX25vXS5zZXJ2X2lkKTsKKyAgICAgICAgbWVtY3B5X3RvaW8oJmRwNl9wdHItPnUuaWMuZ2R0X2Rwcl9jbWRbZHBfb2Zmc2V0XSxjbWRfcHRyLGNwX2NvdW50KTsKKyAgICB9IGVsc2UgaWYgKGhhLT50eXBlID09IEdEVF9QQ0lORVcpIHsKKyAgICAgICAgZHA2Y19wdHIgPSBoYS0+YnJkOworICAgICAgICBnZHRoX3dyaXRldyhkcF9vZmZzZXQgKyBEUE1FTV9DT01NQU5EX09GRlNFVCwgCisgICAgICAgICAgICAgICAgICAgICZkcDZjX3B0ci0+dS5pYy5jb21tX3F1ZXVlW2NtZF9ub10ub2Zmc2V0KTsKKyAgICAgICAgZ2R0aF93cml0ZXcoKHVzaG9ydCljbWRfcHRyLT5TZXJ2aWNlLCAKKyAgICAgICAgICAgICAgICAgICAgJmRwNmNfcHRyLT51LmljLmNvbW1fcXVldWVbY21kX25vXS5zZXJ2X2lkKTsKKyAgICAgICAgbWVtY3B5X3RvaW8oJmRwNmNfcHRyLT51LmljLmdkdF9kcHJfY21kW2RwX29mZnNldF0sY21kX3B0cixjcF9jb3VudCk7CisgICAgfSBlbHNlIGlmIChoYS0+dHlwZSA9PSBHRFRfUENJTVBSKSB7CisgICAgICAgIGRwNm1fcHRyID0gaGEtPmJyZDsKKyAgICAgICAgZ2R0aF93cml0ZXcoZHBfb2Zmc2V0ICsgRFBNRU1fQ09NTUFORF9PRkZTRVQsIAorICAgICAgICAgICAgICAgICAgICAmZHA2bV9wdHItPnUuaWMuY29tbV9xdWV1ZVtjbWRfbm9dLm9mZnNldCk7CisgICAgICAgIGdkdGhfd3JpdGV3KCh1c2hvcnQpY21kX3B0ci0+U2VydmljZSwgCisgICAgICAgICAgICAgICAgICAgICZkcDZtX3B0ci0+dS5pYy5jb21tX3F1ZXVlW2NtZF9ub10uc2Vydl9pZCk7CisgICAgICAgIG1lbWNweV90b2lvKCZkcDZtX3B0ci0+dS5pYy5nZHRfZHByX2NtZFtkcF9vZmZzZXRdLGNtZF9wdHIsY3BfY291bnQpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBnZHRoX3JlbGVhc2VfZXZlbnQoaW50IGhhbnVtKQoreworICAgIHJlZ2lzdGVyIGdkdGhfaGFfc3RyICpoYTsKKworICAgIFRSQUNFKCgiZ2R0aF9yZWxlYXNlX2V2ZW50KCkgaGFudW0gJWRcbiIsaGFudW0pKTsKKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKworI2lmZGVmIEdEVEhfU1RBVElTVElDUworICAgIHsKKyAgICAgICAgdWxvbmczMiBpLGo7CisgICAgICAgIGZvciAoaT0wLGo9MDsgajxHRFRIX01BWENNRFM7ICsraikgeworICAgICAgICAgICAgaWYgKGhhLT5jbWRfdGFiW2pdLmNtbmQgIT0gVU5VU0VEX0NNTkQpCisgICAgICAgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgICAgIGlmIChtYXhfaW5kZXggPCBpKSB7CisgICAgICAgICAgICBtYXhfaW5kZXggPSBpOworICAgICAgICAgICAgVFJBQ0UzKCgiR0RUOiBtYXhfaW5kZXggPSAlZFxuIiwodXNob3J0KWkpKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGhhLT5wY2NiLT5PcENvZGUgPT0gR0RUX0lOSVQpCisgICAgICAgIGhhLT5wY2NiLT5TZXJ2aWNlIHw9IDB4ODA7CisKKyAgICBpZiAoaGEtPnR5cGUgPT0gR0RUX0VJU0EpIHsKKyAgICAgICAgaWYgKGhhLT5wY2NiLT5PcENvZGUgPT0gR0RUX0lOSVQpICAgICAgICAgICAgICAgLyogc3RvcmUgRE1BIGJ1ZmZlciAqLworICAgICAgICAgICAgb3V0bChoYS0+Y2NiX3BoeXMsIGhhLT5ibWljICsgTUFJTEJPWFJFRyk7CisgICAgICAgIG91dGIoaGEtPnBjY2ItPlNlcnZpY2UsIGhhLT5ibWljICsgTERPT1JSRUcpOworICAgIH0gZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX0lTQSkgeworICAgICAgICBnZHRoX3dyaXRlYigwLCAmKChnZHQyX2RwcmFtX3N0ciBfX2lvbWVtICopaGEtPmJyZCktPmlvLmV2ZW50KTsKKyAgICB9IGVsc2UgaWYgKGhhLT50eXBlID09IEdEVF9QQ0kpIHsKKyAgICAgICAgZ2R0aF93cml0ZWIoMCwgJigoZ2R0Nl9kcHJhbV9zdHIgX19pb21lbSAqKWhhLT5icmQpLT5pby5ldmVudCk7CisgICAgfSBlbHNlIGlmIChoYS0+dHlwZSA9PSBHRFRfUENJTkVXKSB7IAorICAgICAgICBvdXRiKDEsIFBUUjJVU0hPUlQoJmhhLT5wbHgtPmxkb29yX3JlZykpOworICAgIH0gZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSU1QUikgeworICAgICAgICBnZHRoX3dyaXRlYigxLCAmKChnZHQ2bV9kcHJhbV9zdHIgX19pb21lbSAqKWhhLT5icmQpLT5pOTYwci5sZG9vcl9yZWcpOworICAgIH0KK30KKworICAgIAorc3RhdGljIGludCBnZHRoX3dhaXQoaW50IGhhbnVtLGludCBpbmRleCx1bG9uZzMyIHRpbWUpCit7CisgICAgZ2R0aF9oYV9zdHIgKmhhOworICAgIGludCBhbnN3ZXJfZm91bmQgPSBGQUxTRTsKKworICAgIFRSQUNFKCgiZ2R0aF93YWl0KCkgaGFudW0gJWQgaW5kZXggJWQgdGltZSAlZFxuIixoYW51bSxpbmRleCx0aW1lKSk7CisKKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICBpZiAoaW5kZXggPT0gMCkKKyAgICAgICAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHdhaXQgcmVxdWlyZWQgKi8KKworICAgIGdkdGhfZnJvbV93YWl0ID0gVFJVRTsKKyAgICBkbyB7CisgICAgICAgIGdkdGhfaW50ZXJydXB0KChpbnQpaGEtPmlycSxoYSxOVUxMKTsKKyAgICAgICAgaWYgKHdhaXRfaGFudW09PWhhbnVtICYmIHdhaXRfaW5kZXg9PWluZGV4KSB7CisgICAgICAgICAgICBhbnN3ZXJfZm91bmQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZ2R0aF9kZWxheSgxKTsKKyAgICB9IHdoaWxlICgtLXRpbWUpOworICAgIGdkdGhfZnJvbV93YWl0ID0gRkFMU0U7CisgICAgCisgICAgd2hpbGUgKGdkdGhfdGVzdF9idXN5KGhhbnVtKSkKKyAgICAgICAgZ2R0aF9kZWxheSgwKTsKKworICAgIHJldHVybiAoYW5zd2VyX2ZvdW5kKTsKK30KKworCitzdGF0aWMgaW50IGdkdGhfaW50ZXJuYWxfY21kKGludCBoYW51bSx1bmNoYXIgc2VydmljZSx1c2hvcnQgb3Bjb2RlLHVsb25nMzIgcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsb25nNjQgcDIsdWxvbmc2NCBwMykKK3sKKyAgICByZWdpc3RlciBnZHRoX2hhX3N0ciAqaGE7CisgICAgcmVnaXN0ZXIgZ2R0aF9jbWRfc3RyICpjbWRfcHRyOworICAgIGludCByZXRyaWVzLGluZGV4OworCisgICAgVFJBQ0UyKCgiZ2R0aF9pbnRlcm5hbF9jbWQoKSBzZXJ2aWNlICVkIG9wY29kZSAlZFxuIixzZXJ2aWNlLG9wY29kZSkpOworCisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgY21kX3B0ciA9IGhhLT5wY2NiOworICAgIG1lbXNldCgoY2hhciopY21kX3B0ciwwLHNpemVvZihnZHRoX2NtZF9zdHIpKTsKKworICAgIC8qIG1ha2UgY29tbWFuZCAgKi8KKyAgICBmb3IgKHJldHJpZXMgPSBJTklUX1JFVFJJRVM7OykgeworICAgICAgICBjbWRfcHRyLT5TZXJ2aWNlICAgICAgICAgID0gc2VydmljZTsKKyAgICAgICAgY21kX3B0ci0+UmVxdWVzdEJ1ZmZlciAgICA9IElOVEVSTkFMX0NNTkQ7CisgICAgICAgIGlmICghKGluZGV4PWdkdGhfZ2V0X2NtZF9pbmRleChoYW51bSkpKSB7CisgICAgICAgICAgICBUUkFDRSgoIkdEVDogTm8gZnJlZSBjb21tYW5kIGluZGV4IGZvdW5kXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBnZHRoX3NldF9zZW1hMChoYW51bSk7CisgICAgICAgIGNtZF9wdHItPk9wQ29kZSAgICAgICAgICAgPSBvcGNvZGU7CisgICAgICAgIGNtZF9wdHItPkJvYXJkTm9kZSAgICAgICAgPSBMT0NBTEJPQVJEOworICAgICAgICBpZiAoc2VydmljZSA9PSBDQUNIRVNFUlZJQ0UpIHsKKyAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gR0RUX0lPQ1RMKSB7CisgICAgICAgICAgICAgICAgY21kX3B0ci0+dS5pb2N0bC5zdWJmdW5jID0gcDE7CisgICAgICAgICAgICAgICAgY21kX3B0ci0+dS5pb2N0bC5jaGFubmVsID0gKHVsb25nMzIpcDI7CisgICAgICAgICAgICAgICAgY21kX3B0ci0+dS5pb2N0bC5wYXJhbV9zaXplID0gKHVzaG9ydClwMzsKKyAgICAgICAgICAgICAgICBjbWRfcHRyLT51LmlvY3RsLnBfcGFyYW0gPSBoYS0+c2NyYXRjaF9waHlzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaGEtPmNhY2hlX2ZlYXQgJiBHRFRfNjRCSVQpIHsKKyAgICAgICAgICAgICAgICAgICAgY21kX3B0ci0+dS5jYWNoZTY0LkRldmljZU5vID0gKHVzaG9ydClwMTsKKyAgICAgICAgICAgICAgICAgICAgY21kX3B0ci0+dS5jYWNoZTY0LkJsb2NrTm8gID0gcDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY21kX3B0ci0+dS5jYWNoZS5EZXZpY2VObyA9ICh1c2hvcnQpcDE7CisgICAgICAgICAgICAgICAgICAgIGNtZF9wdHItPnUuY2FjaGUuQmxvY2tObyAgPSAodWxvbmczMilwMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZSA9PSBTQ1NJUkFXU0VSVklDRSkgeworICAgICAgICAgICAgaWYgKGhhLT5yYXdfZmVhdCAmIEdEVF82NEJJVCkgeworICAgICAgICAgICAgICAgIGNtZF9wdHItPnUucmF3NjQuZGlyZWN0aW9uICA9IHAxOworICAgICAgICAgICAgICAgIGNtZF9wdHItPnUucmF3NjQuYnVzICAgICAgICA9ICh1bmNoYXIpcDI7CisgICAgICAgICAgICAgICAgY21kX3B0ci0+dS5yYXc2NC50YXJnZXQgICAgID0gKHVuY2hhcilwMzsKKyAgICAgICAgICAgICAgICBjbWRfcHRyLT51LnJhdzY0Lmx1biAgICAgICAgPSAodW5jaGFyKShwMyA+PiA4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY21kX3B0ci0+dS5yYXcuZGlyZWN0aW9uICA9IHAxOworICAgICAgICAgICAgICAgIGNtZF9wdHItPnUucmF3LmJ1cyAgICAgICAgPSAodW5jaGFyKXAyOworICAgICAgICAgICAgICAgIGNtZF9wdHItPnUucmF3LnRhcmdldCAgICAgPSAodW5jaGFyKXAzOworICAgICAgICAgICAgICAgIGNtZF9wdHItPnUucmF3Lmx1biAgICAgICAgPSAodW5jaGFyKShwMyA+PiA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlID09IFNDUkVFTlNFUlZJQ0UpIHsKKyAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gR0RUX1JFQUxUSU1FKSB7CisgICAgICAgICAgICAgICAgKih1bG9uZzMyICopJmNtZF9wdHItPnUuc2NyZWVuLnN1LmRhdGFbMF0gPSBwMTsKKyAgICAgICAgICAgICAgICAqKHVsb25nMzIgKikmY21kX3B0ci0+dS5zY3JlZW4uc3UuZGF0YVs0XSA9ICh1bG9uZzMyKXAyOworICAgICAgICAgICAgICAgICoodWxvbmczMiAqKSZjbWRfcHRyLT51LnNjcmVlbi5zdS5kYXRhWzhdID0gKHVsb25nMzIpcDM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaGEtPmNtZF9sZW4gICAgICAgICAgPSBzaXplb2YoZ2R0aF9jbWRfc3RyKTsKKyAgICAgICAgaGEtPmNtZF9vZmZzX2RwbWVtICAgPSAwOworICAgICAgICBoYS0+Y21kX2NudCAgICAgICAgICA9IDA7CisgICAgICAgIGdkdGhfY29weV9jb21tYW5kKGhhbnVtKTsKKyAgICAgICAgZ2R0aF9yZWxlYXNlX2V2ZW50KGhhbnVtKTsKKyAgICAgICAgZ2R0aF9kZWxheSgyMCk7CisgICAgICAgIGlmICghZ2R0aF93YWl0KGhhbnVtLGluZGV4LElOSVRfVElNRU9VVCkpIHsKKyAgICAgICAgICAgIHByaW50aygiR0RUOiBJbml0aWFsaXphdGlvbiBlcnJvciAodGltZW91dCBzZXJ2aWNlICVkKVxuIixzZXJ2aWNlKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChoYS0+c3RhdHVzICE9IFNfQlNZIHx8IC0tcmV0cmllcyA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGdkdGhfZGVsYXkoMSk7ICAgCisgICAgfSAgIAorICAgIAorICAgIHJldHVybiAoaGEtPnN0YXR1cyAhPSBTX09LID8gMDoxKTsKK30KKyAgICAKKworLyogc2VhcmNoIGZvciBkZXZpY2VzICovCisKK3N0YXRpYyBpbnQgX19pbml0IGdkdGhfc2VhcmNoX2RyaXZlcyhpbnQgaGFudW0pCit7CisgICAgcmVnaXN0ZXIgZ2R0aF9oYV9zdHIgKmhhOworICAgIHVzaG9ydCBjZGV2X2NudCwgaTsKKyAgICBpbnQgb2s7CisgICAgdWxvbmczMiBidXNfbm8sIGRydl9jbnQsIGRydl9ubywgajsKKyAgICBnZHRoX2dldGNoX3N0ciAqY2huOworICAgIGdkdGhfZHJsaXN0X3N0ciAqZHJsOworICAgIGdkdGhfaW9jaGFuX3N0ciAqaW9jOworICAgIGdkdGhfcmF3X2lvY2hhbl9zdHIgKmlvY3I7CisgICAgZ2R0aF9hcmNkbF9zdHIgKmFsc3Q7CisgICAgZ2R0aF9hbGlzdF9zdHIgKmFsc3QyOworICAgIGdkdGhfb2VtX3N0cl9pb2N0bCAqb2Vtc3RyOworI2lmZGVmIElOVF9DT0FMCisgICAgZ2R0aF9wZXJmX21vZGVzICpwbW9kOworI2VuZGlmCisKKyNpZmRlZiBHRFRIX1JUQworICAgIHVuY2hhciBydGNbMTJdOworICAgIHVsb25nIGZsYWdzOworI2VuZGlmICAgICAKKyAgIAorICAgIFRSQUNFKCgiZ2R0aF9zZWFyY2hfZHJpdmVzKCkgaGFudW0gJWRcbiIsaGFudW0pKTsKKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICBvayA9IDA7CisKKyAgICAvKiBpbml0aWFsaXplIGNvbnRyb2xsZXIgc2VydmljZXMsIGF0IGZpcnN0OiBzY3JlZW4gc2VydmljZSAqLworICAgIGhhLT5zY3JlZW5fZmVhdCA9IDA7CisgICAgaWYgKCFmb3JjZV9kbWEzMikgeworICAgICAgICBvayA9IGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLFNDUkVFTlNFUlZJQ0UsR0RUX1hfSU5JVF9TQ1IsMCwwLDApOworICAgICAgICBpZiAob2spCisgICAgICAgICAgICBoYS0+c2NyZWVuX2ZlYXQgPSBHRFRfNjRCSVQ7CisgICAgfQorICAgIGlmIChmb3JjZV9kbWEzMiB8fCAoIW9rICYmIGhhLT5zdGF0dXMgPT0gKHVzaG9ydClTX05PRlVOQykpCisgICAgICAgIG9rID0gZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sU0NSRUVOU0VSVklDRSxHRFRfSU5JVCwwLDAsMCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBwcmludGsoIkdEVC1IQSAlZDogSW5pdGlhbGl6YXRpb24gZXJyb3Igc2NyZWVuIHNlcnZpY2UgKGNvZGUgJWQpXG4iLAorICAgICAgICAgICAgICAgaGFudW0sIGhhLT5zdGF0dXMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgVFJBQ0UyKCgiZ2R0aF9zZWFyY2hfZHJpdmVzKCk6IFNDUkVFTlNFUlZJQ0UgaW5pdGlhbGl6ZWRcbiIpKTsKKworI2lmZGVmIEdEVEhfUlRDCisgICAgLyogcmVhZCByZWFsdGltZSBjbG9jayBpbmZvLCBzZW5kIHRvIGNvbnRyb2xsZXIgKi8KKyAgICAvKiAxLiB3YWl0IGZvciB0aGUgZmFsbGluZyBlZGdlIG9mIHVwZGF0ZSBmbGFnICovCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CisgICAgZm9yIChqID0gMDsgaiA8IDEwMDAwMDA7ICsraikKKyAgICAgICAgaWYgKENNT1NfUkVBRChSVENfRlJFUV9TRUxFQ1QpICYgUlRDX1VJUCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGZvciAoaiA9IDA7IGogPCAxMDAwMDAwOyArK2opCisgICAgICAgIGlmICghKENNT1NfUkVBRChSVENfRlJFUV9TRUxFQ1QpICYgUlRDX1VJUCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAvKiAyLiByZWFkIGluZm8gKi8KKyAgICBkbyB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxMjsgKytqKSAKKyAgICAgICAgICAgIHJ0Y1tqXSA9IENNT1NfUkVBRChqKTsKKyAgICB9IHdoaWxlIChydGNbMF0gIT0gQ01PU19SRUFEKDApKTsKKyAgICBzcGluX2xvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKKyAgICBUUkFDRTIoKCJnZHRoX3NlYXJjaF9kcml2ZXMoKTogUlRDOiAleC8leC8leFxuIiwqKHVsb25nMzIgKikmcnRjWzBdLAorICAgICAgICAgICAgKih1bG9uZzMyICopJnJ0Y1s0XSwgKih1bG9uZzMyICopJnJ0Y1s4XSkpOworICAgIC8qIDMuIHNlbmQgdG8gY29udHJvbGxlciBmaXJtd2FyZSAqLworICAgIGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLFNDUkVFTlNFUlZJQ0UsR0RUX1JFQUxUSU1FLCAqKHVsb25nMzIgKikmcnRjWzBdLAorICAgICAgICAgICAgICAgICAgICAgICoodWxvbmczMiAqKSZydGNbNF0sICoodWxvbmczMiAqKSZydGNbOF0pOworI2VuZGlmICAKKyAKKyAgICAvKiB1bmZyZWV6ZSBhbGwgSU9zICovCisgICAgZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9VTkZSRUVaRV9JTywwLDAsMCk7CisgCisgICAgLyogaW5pdGlhbGl6ZSBjYWNoZSBzZXJ2aWNlICovCisgICAgaGEtPmNhY2hlX2ZlYXQgPSAwOworICAgIGlmICghZm9yY2VfZG1hMzIpIHsKKyAgICAgICAgb2sgPSBnZHRoX2ludGVybmFsX2NtZChoYW51bSxDQUNIRVNFUlZJQ0UsR0RUX1hfSU5JVF9IT1NULExJTlVYX09TLDAsMCk7CisgICAgICAgIGlmIChvaykKKyAgICAgICAgICAgIGhhLT5jYWNoZV9mZWF0ID0gR0RUXzY0QklUOworICAgIH0KKyAgICBpZiAoZm9yY2VfZG1hMzIgfHwgKCFvayAmJiBoYS0+c3RhdHVzID09ICh1c2hvcnQpU19OT0ZVTkMpKQorICAgICAgICBvayA9IGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLENBQ0hFU0VSVklDRSxHRFRfSU5JVCxMSU5VWF9PUywwLDApOworICAgIGlmICghb2spIHsKKyAgICAgICAgcHJpbnRrKCJHRFQtSEEgJWQ6IEluaXRpYWxpemF0aW9uIGVycm9yIGNhY2hlIHNlcnZpY2UgKGNvZGUgJWQpXG4iLAorICAgICAgICAgICAgICAgaGFudW0sIGhhLT5zdGF0dXMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgVFJBQ0UyKCgiZ2R0aF9zZWFyY2hfZHJpdmVzKCk6IENBQ0hFU0VSVklDRSBpbml0aWFsaXplZFxuIikpOworICAgIGNkZXZfY250ID0gKHVzaG9ydCloYS0+aW5mbzsKKyAgICBoYS0+ZndfdmVycyA9IGhhLT5zZXJ2aWNlOworCisjaWZkZWYgSU5UX0NPQUwKKyAgICBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSU1QUikgeworICAgICAgICAvKiBzZXQgcGVyZi4gbW9kZXMgKi8KKyAgICAgICAgcG1vZCA9IChnZHRoX3BlcmZfbW9kZXMgKiloYS0+cHNjcmF0Y2g7CisgICAgICAgIHBtb2QtPnZlcnNpb24gICAgICAgICAgPSAxOworICAgICAgICBwbW9kLT5zdF9tb2RlICAgICAgICAgID0gMTsgICAgLyogZW5hYmxlIG9uZSBzdGF0dXMgYnVmZmVyICovCisgICAgICAgICooKHVsb25nNjQgKikmcG1vZC0+c3RfYnVmZl9hZGRyMSkgPSBoYS0+Y29hbF9zdGF0X3BoeXM7CisgICAgICAgIHBtb2QtPnN0X2J1ZmZfaW5keDEgICAgPSBDT0FMSU5ERVg7CisgICAgICAgIHBtb2QtPnN0X2J1ZmZfYWRkcjIgICAgPSAwOworICAgICAgICBwbW9kLT5zdF9idWZmX3VfYWRkcjIgID0gMDsKKyAgICAgICAgcG1vZC0+c3RfYnVmZl9pbmR4MiAgICA9IDA7CisgICAgICAgIHBtb2QtPnN0X2J1ZmZfc2l6ZSAgICAgPSBzaXplb2YoZ2R0aF9jb2FsX3N0YXR1cykgKiBNQVhPRkZTRVRTOworICAgICAgICBwbW9kLT5jbWRfbW9kZSAgICAgICAgID0gMDsgICAgLy8gZGlzYWJsZSBhbGwgY21kIGJ1ZmZlcnMKKyAgICAgICAgcG1vZC0+Y21kX2J1ZmZfYWRkcjEgICA9IDA7CisgICAgICAgIHBtb2QtPmNtZF9idWZmX3VfYWRkcjEgPSAwOworICAgICAgICBwbW9kLT5jbWRfYnVmZl9pbmR4MSAgID0gMDsKKyAgICAgICAgcG1vZC0+Y21kX2J1ZmZfYWRkcjIgICA9IDA7CisgICAgICAgIHBtb2QtPmNtZF9idWZmX3VfYWRkcjIgPSAwOworICAgICAgICBwbW9kLT5jbWRfYnVmZl9pbmR4MiAgID0gMDsKKyAgICAgICAgcG1vZC0+Y21kX2J1ZmZfc2l6ZSAgICA9IDA7CisgICAgICAgIHBtb2QtPnJlc2VydmVkMSAgICAgICAgPSAwOyAgICAgICAgICAgIAorICAgICAgICBwbW9kLT5yZXNlcnZlZDIgICAgICAgID0gMDsgICAgICAgICAgICAKKyAgICAgICAgaWYgKGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLENBQ0hFU0VSVklDRSxHRFRfSU9DVEwsU0VUX1BFUkZfTU9ERVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX0NIQU5ORUwsc2l6ZW9mKGdkdGhfcGVyZl9tb2RlcykpKSB7CisgICAgICAgICAgICBwcmludGsoIkdEVC1IQSAlZDogSW50ZXJydXB0IGNvYWxlc2NpbmcgYWN0aXZhdGVkXG4iLCBoYW51bSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIC8qIGRldGVjdCBudW1iZXIgb2YgYnVzZXMgLSB0cnkgbmV3IElPQ1RMICovCisgICAgaW9jciA9IChnZHRoX3Jhd19pb2NoYW5fc3RyICopaGEtPnBzY3JhdGNoOworICAgIGlvY3ItPmhkci52ZXJzaW9uICAgICAgICA9IDB4ZmZmZmZmZmY7CisgICAgaW9jci0+aGRyLmxpc3RfZW50cmllcyAgID0gTUFYQlVTOworICAgIGlvY3ItPmhkci5maXJzdF9jaGFuICAgICA9IDA7CisgICAgaW9jci0+aGRyLmxhc3RfY2hhbiAgICAgID0gTUFYQlVTLTE7CisgICAgaW9jci0+aGRyLmxpc3Rfb2Zmc2V0ICAgID0gR0RUT0ZGU09GKGdkdGhfcmF3X2lvY2hhbl9zdHIsIGxpc3RbMF0pOworICAgIGlmIChnZHRoX2ludGVybmFsX2NtZChoYW51bSxDQUNIRVNFUlZJQ0UsR0RUX0lPQ1RMLElPQ0hBTl9SQVdfREVTQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9DSEFOTkVMLHNpemVvZihnZHRoX3Jhd19pb2NoYW5fc3RyKSkpIHsKKyAgICAgICAgVFJBQ0UyKCgiSU9DSEFOX1JBV19ERVNDIHN1cHBvcnRlZCFcbiIpKTsKKyAgICAgICAgaGEtPmJ1c19jbnQgPSBpb2NyLT5oZHIuY2hhbl9jb3VudDsKKyAgICAgICAgZm9yIChidXNfbm8gPSAwOyBidXNfbm8gPCBoYS0+YnVzX2NudDsgKytidXNfbm8pIHsKKyAgICAgICAgICAgIGlmIChpb2NyLT5saXN0W2J1c19ub10ucHJvY19pZCA8IE1BWElEKQorICAgICAgICAgICAgICAgIGhhLT5idXNfaWRbYnVzX25vXSA9IGlvY3ItPmxpc3RbYnVzX25vXS5wcm9jX2lkOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGhhLT5idXNfaWRbYnVzX25vXSA9IDB4ZmY7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBvbGQgbWV0aG9kICovCisgICAgICAgIGNobiA9IChnZHRoX2dldGNoX3N0ciAqKWhhLT5wc2NyYXRjaDsKKyAgICAgICAgZm9yIChidXNfbm8gPSAwOyBidXNfbm8gPCBNQVhCVVM7ICsrYnVzX25vKSB7CisgICAgICAgICAgICBjaG4tPmNoYW5uZWxfbm8gPSBidXNfbm87CisgICAgICAgICAgICBpZiAoIWdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLENBQ0hFU0VSVklDRSxHRFRfSU9DVEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDU0lfQ0hBTl9DTlQgfCBMX0NUUkxfUEFUVEVSTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9fQ0hBTk5FTCB8IElOVkFMSURfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdkdGhfZ2V0Y2hfc3RyKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVzX25vID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtSEEgJWQ6IEVycm9yIGRldGVjdGluZyBjaGFubmVsIGNvdW50ICgweCV4KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbnVtLCBoYS0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNobi0+c2lvcF9pZCA8IE1BWElEKQorICAgICAgICAgICAgICAgIGhhLT5idXNfaWRbYnVzX25vXSA9IGNobi0+c2lvcF9pZDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBoYS0+YnVzX2lkW2J1c19ub10gPSAweGZmOworICAgICAgICB9ICAgICAgIAorICAgICAgICBoYS0+YnVzX2NudCA9ICh1bmNoYXIpYnVzX25vOworICAgIH0KKyAgICBUUkFDRTIoKCJnZHRoX3NlYXJjaF9kcml2ZXMoKSAlZCBjaGFubmVsc1xuIixoYS0+YnVzX2NudCkpOworCisgICAgLyogcmVhZCBjYWNoZSBjb25maWd1cmF0aW9uICovCisgICAgaWYgKCFnZHRoX2ludGVybmFsX2NtZChoYW51bSxDQUNIRVNFUlZJQ0UsR0RUX0lPQ1RMLENBQ0hFX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX0NIQU5ORUwsc2l6ZW9mKGdkdGhfY2luZm9fc3RyKSkpIHsKKyAgICAgICAgcHJpbnRrKCJHRFQtSEEgJWQ6IEluaXRpYWxpemF0aW9uIGVycm9yIGNhY2hlIHNlcnZpY2UgKGNvZGUgJWQpXG4iLAorICAgICAgICAgICAgICAgaGFudW0sIGhhLT5zdGF0dXMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaGEtPmNwYXIgPSAoKGdkdGhfY2luZm9fc3RyICopaGEtPnBzY3JhdGNoKS0+Y3BhcjsKKyAgICBUUkFDRTIoKCJnZHRoX3NlYXJjaF9kcml2ZXMoKSBjaW5mbzogdnMgJXggc3RhICVkIHN0ciAlZCBkdyAlZCBiICVkXG4iLAorICAgICAgICAgICAgaGEtPmNwYXIudmVyc2lvbixoYS0+Y3Bhci5zdGF0ZSxoYS0+Y3Bhci5zdHJhdGVneSwKKyAgICAgICAgICAgIGhhLT5jcGFyLndyaXRlX2JhY2ssaGEtPmNwYXIuYmxvY2tfc2l6ZSkpOworCisgICAgLyogcmVhZCBib2FyZCBpbmZvIGFuZCBmZWF0dXJlcyAqLworICAgIGhhLT5tb3JlX3Byb2MgPSBGQUxTRTsKKyAgICBpZiAoZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9JT0NUTCxCT0FSRF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX0NIQU5ORUwsc2l6ZW9mKGdkdGhfYmluZm9fc3RyKSkpIHsKKyAgICAgICAgbWVtY3B5KCZoYS0+YmluZm8sIChnZHRoX2JpbmZvX3N0ciAqKWhhLT5wc2NyYXRjaCwKKyAgICAgICAgICAgICAgIHNpemVvZihnZHRoX2JpbmZvX3N0cikpOworICAgICAgICBpZiAoZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9JT0NUTCxCT0FSRF9GRUFUVVJFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfQ0hBTk5FTCxzaXplb2YoZ2R0aF9iZmVhdF9zdHIpKSkgeworICAgICAgICAgICAgVFJBQ0UyKCgiQk9BUkRfSU5GTy9CT0FSRF9GRUFUVVJFUyBzdXBwb3J0ZWRcbiIpKTsKKyAgICAgICAgICAgIGhhLT5iZmVhdCA9ICooZ2R0aF9iZmVhdF9zdHIgKiloYS0+cHNjcmF0Y2g7CisgICAgICAgICAgICBoYS0+bW9yZV9wcm9jID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIFRSQUNFMigoIkJPQVJEX0lORk8gcmVxdWlyZXMgZmlybXdhcmUgPj0gMS4xMC8yLjA4XG4iKSk7CisgICAgICAgIHN0cmNweShoYS0+YmluZm8udHlwZV9zdHJpbmcsIGdkdGhfY3RyX25hbWUoaGFudW0pKTsKKyAgICB9CisgICAgVFJBQ0UyKCgiQ29udHJvbGxlciBuYW1lOiAlc1xuIixoYS0+YmluZm8udHlwZV9zdHJpbmcpKTsKKworICAgIC8qIHJlYWQgbW9yZSBpbmZvcm1hdGlvbnMgKi8KKyAgICBpZiAoaGEtPm1vcmVfcHJvYykgeworICAgICAgICAvKiBwaHlzaWNhbCBkcml2ZXMsIGNoYW5uZWwgYWRkcmVzc2VzICovCisgICAgICAgIGlvYyA9IChnZHRoX2lvY2hhbl9zdHIgKiloYS0+cHNjcmF0Y2g7CisgICAgICAgIGlvYy0+aGRyLnZlcnNpb24gICAgICAgID0gMHhmZmZmZmZmZjsKKyAgICAgICAgaW9jLT5oZHIubGlzdF9lbnRyaWVzICAgPSBNQVhCVVM7CisgICAgICAgIGlvYy0+aGRyLmZpcnN0X2NoYW4gICAgID0gMDsKKyAgICAgICAgaW9jLT5oZHIubGFzdF9jaGFuICAgICAgPSBNQVhCVVMtMTsKKyAgICAgICAgaW9jLT5oZHIubGlzdF9vZmZzZXQgICAgPSBHRFRPRkZTT0YoZ2R0aF9pb2NoYW5fc3RyLCBsaXN0WzBdKTsKKyAgICAgICAgaWYgKGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLENBQ0hFU0VSVklDRSxHRFRfSU9DVEwsSU9DSEFOX0RFU0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX0NIQU5ORUwsc2l6ZW9mKGdkdGhfaW9jaGFuX3N0cikpKSB7CisgICAgICAgICAgICBmb3IgKGJ1c19ubyA9IDA7IGJ1c19ubyA8IGhhLT5idXNfY250OyArK2J1c19ubykgeworICAgICAgICAgICAgICAgIGhhLT5yYXdbYnVzX25vXS5hZGRyZXNzID0gaW9jLT5saXN0W2J1c19ub10uYWRkcmVzczsKKyAgICAgICAgICAgICAgICBoYS0+cmF3W2J1c19ub10ubG9jYWxfbm8gPSBpb2MtPmxpc3RbYnVzX25vXS5sb2NhbF9ubzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoYnVzX25vID0gMDsgYnVzX25vIDwgaGEtPmJ1c19jbnQ7ICsrYnVzX25vKSB7CisgICAgICAgICAgICAgICAgaGEtPnJhd1tidXNfbm9dLmFkZHJlc3MgPSBJT19DSEFOTkVMOworICAgICAgICAgICAgICAgIGhhLT5yYXdbYnVzX25vXS5sb2NhbF9ubyA9IGJ1c19ubzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGJ1c19ubyA9IDA7IGJ1c19ubyA8IGhhLT5idXNfY250OyArK2J1c19ubykgeworICAgICAgICAgICAgY2huID0gKGdkdGhfZ2V0Y2hfc3RyICopaGEtPnBzY3JhdGNoOworICAgICAgICAgICAgY2huLT5jaGFubmVsX25vID0gaGEtPnJhd1tidXNfbm9dLmxvY2FsX25vOworICAgICAgICAgICAgaWYgKGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLENBQ0hFU0VSVklDRSxHRFRfSU9DVEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NTSV9DSEFOX0NOVCB8IExfQ1RSTF9QQVRURVJOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5yYXdbYnVzX25vXS5hZGRyZXNzIHwgSU5WQUxJRF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihnZHRoX2dldGNoX3N0cikpKSB7CisgICAgICAgICAgICAgICAgaGEtPnJhd1tidXNfbm9dLnBkZXZfY250ID0gY2huLT5kcml2ZV9jbnQ7CisgICAgICAgICAgICAgICAgVFJBQ0UyKCgiQ2hhbm5lbCAlZDogJWQgcGh5cy4gZHJpdmVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVzX25vLGNobi0+ZHJpdmVfY250KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGEtPnJhd1tidXNfbm9dLnBkZXZfY250ID4gMCkgeworICAgICAgICAgICAgICAgIGRybCA9IChnZHRoX2RybGlzdF9zdHIgKiloYS0+cHNjcmF0Y2g7CisgICAgICAgICAgICAgICAgZHJsLT5zY19ubyA9IGhhLT5yYXdbYnVzX25vXS5sb2NhbF9ubzsKKyAgICAgICAgICAgICAgICBkcmwtPnNjX2NudCA9IGhhLT5yYXdbYnVzX25vXS5wZGV2X2NudDsKKyAgICAgICAgICAgICAgICBpZiAoZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9JT0NUTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NTSV9EUl9MSVNUIHwgTF9DVFJMX1BBVFRFUk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5yYXdbYnVzX25vXS5hZGRyZXNzIHwgSU5WQUxJRF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZ2R0aF9kcmxpc3Rfc3RyKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGhhLT5yYXdbYnVzX25vXS5wZGV2X2NudDsgKytqKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5yYXdbYnVzX25vXS5pZF9saXN0W2pdID0gZHJsLT5zY19saXN0W2pdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGhhLT5yYXdbYnVzX25vXS5wZGV2X2NudCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogbG9naWNhbCBkcml2ZXMgKi8KKyAgICAgICAgaWYgKGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLENBQ0hFU0VSVklDRSxHRFRfSU9DVEwsQ0FDSEVfRFJWX0NOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfQ0hBTk5FTCxzaXplb2YodWxvbmczMikpKSB7CisgICAgICAgICAgICBkcnZfY250ID0gKih1bG9uZzMyICopaGEtPnBzY3JhdGNoOworICAgICAgICAgICAgaWYgKGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLENBQ0hFU0VSVklDRSxHRFRfSU9DVEwsQ0FDSEVfRFJWX0xJU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9DSEFOTkVMLGRydl9jbnQgKiBzaXplb2YodWxvbmczMikpKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGRydl9jbnQ7ICsraikgeworICAgICAgICAgICAgICAgICAgICBkcnZfbm8gPSAoKHVsb25nMzIgKiloYS0+cHNjcmF0Y2gpW2pdOworICAgICAgICAgICAgICAgICAgICBpZiAoZHJ2X25vIDwgTUFYX0xEUklWRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5oZHJbZHJ2X25vXS5pc19sb2dkcnYgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UyKCgiRHJpdmUgJWQgaXMgbG9nLiBkcml2ZVxuIixkcnZfbm8pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFsc3QgPSAoZ2R0aF9hcmNkbF9zdHIgKiloYS0+cHNjcmF0Y2g7CisgICAgICAgICAgICBhbHN0LT5lbnRyaWVzX2F2YWlsID0gTUFYX0xEUklWRVM7CisgICAgICAgICAgICBhbHN0LT5maXJzdF9lbnRyeSA9IDA7CisgICAgICAgICAgICBhbHN0LT5saXN0X29mZnNldCA9IEdEVE9GRlNPRihnZHRoX2FyY2RsX3N0ciwgbGlzdFswXSk7CisgICAgICAgICAgICBpZiAoZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9JT0NUTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9EUlZfTElTVDIgfCBMQV9DVFJMX1BBVFRFUk4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfQ0hBTk5FTCwgc2l6ZW9mKGdkdGhfYXJjZGxfc3RyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsc3QtPmVudHJpZXNfYXZhaWwtMSkgKiBzaXplb2YoZ2R0aF9hbGlzdF9zdHIpKSkgeyAKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYWxzdC0+ZW50cmllc19pbml0OyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgaGEtPmhkcltqXS5pc19hcnJheWRydiA9IGFsc3QtPmxpc3Rbal0uaXNfYXJyYXlkOworICAgICAgICAgICAgICAgICAgICBoYS0+aGRyW2pdLmlzX21hc3RlciA9IGFsc3QtPmxpc3Rbal0uaXNfbWFzdGVyOworICAgICAgICAgICAgICAgICAgICBoYS0+aGRyW2pdLmlzX3Bhcml0eSA9IGFsc3QtPmxpc3Rbal0uaXNfcGFyaXR5OworICAgICAgICAgICAgICAgICAgICBoYS0+aGRyW2pdLmlzX2hvdGZpeCA9IGFsc3QtPmxpc3Rbal0uaXNfaG90Zml4OworICAgICAgICAgICAgICAgICAgICBoYS0+aGRyW2pdLm1hc3Rlcl9ubyA9IGFsc3QtPmxpc3Rbal0uY2RfaGFuZGxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9JT0NUTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfRFJWX0xJU1QgfCBMQV9DVFJMX1BBVFRFUk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDM1ICogc2l6ZW9mKGdkdGhfYWxpc3Rfc3RyKSkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzU7ICsraikgeworICAgICAgICAgICAgICAgICAgICBhbHN0MiA9ICYoKGdkdGhfYWxpc3Rfc3RyICopaGEtPnBzY3JhdGNoKVtqXTsKKyAgICAgICAgICAgICAgICAgICAgaGEtPmhkcltqXS5pc19hcnJheWRydiA9IGFsc3QyLT5pc19hcnJheWQ7CisgICAgICAgICAgICAgICAgICAgIGhhLT5oZHJbal0uaXNfbWFzdGVyID0gYWxzdDItPmlzX21hc3RlcjsKKyAgICAgICAgICAgICAgICAgICAgaGEtPmhkcltqXS5pc19wYXJpdHkgPSBhbHN0Mi0+aXNfcGFyaXR5OworICAgICAgICAgICAgICAgICAgICBoYS0+aGRyW2pdLmlzX2hvdGZpeCA9IGFsc3QyLT5pc19ob3RmaXg7CisgICAgICAgICAgICAgICAgICAgIGhhLT5oZHJbal0ubWFzdGVyX25vID0gYWxzdDItPmNkX2hhbmRsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9ICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIC8qIGluaXRpYWxpemUgcmF3IHNlcnZpY2UgKi8KKyAgICBoYS0+cmF3X2ZlYXQgPSAwOworICAgIGlmICghZm9yY2VfZG1hMzIpIHsKKyAgICAgICAgb2sgPSBnZHRoX2ludGVybmFsX2NtZChoYW51bSxTQ1NJUkFXU0VSVklDRSxHRFRfWF9JTklUX1JBVywwLDAsMCk7CisgICAgICAgIGlmIChvaykKKyAgICAgICAgICAgIGhhLT5yYXdfZmVhdCA9IEdEVF82NEJJVDsKKyAgICB9CisgICAgaWYgKGZvcmNlX2RtYTMyIHx8ICghb2sgJiYgaGEtPnN0YXR1cyA9PSAodXNob3J0KVNfTk9GVU5DKSkKKyAgICAgICAgb2sgPSBnZHRoX2ludGVybmFsX2NtZChoYW51bSxTQ1NJUkFXU0VSVklDRSxHRFRfSU5JVCwwLDAsMCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBwcmludGsoIkdEVC1IQSAlZDogSW5pdGlhbGl6YXRpb24gZXJyb3IgcmF3IHNlcnZpY2UgKGNvZGUgJWQpXG4iLAorICAgICAgICAgICAgICAgaGFudW0sIGhhLT5zdGF0dXMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgVFJBQ0UyKCgiZ2R0aF9zZWFyY2hfZHJpdmVzKCk6IFJBV1NFUlZJQ0UgaW5pdGlhbGl6ZWRcbiIpKTsKKworICAgIC8qIHNldC9nZXQgZmVhdHVyZXMgcmF3IHNlcnZpY2UgKHNjYXR0ZXIvZ2F0aGVyKSAqLworICAgIGlmIChnZHRoX2ludGVybmFsX2NtZChoYW51bSxTQ1NJUkFXU0VSVklDRSxHRFRfU0VUX0ZFQVQsU0NBVFRFUl9HQVRIRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMCkpIHsKKyAgICAgICAgVFJBQ0UyKCgiZ2R0aF9zZWFyY2hfZHJpdmVzKCk6IHNldCBmZWF0dXJlcyBSQVdTRVJWSUNFIE9LXG4iKSk7CisgICAgICAgIGlmIChnZHRoX2ludGVybmFsX2NtZChoYW51bSxTQ1NJUkFXU0VSVklDRSxHRFRfR0VUX0ZFQVQsMCwwLDApKSB7CisgICAgICAgICAgICBUUkFDRTIoKCJnZHRoX3NlYXJjaF9kcigpOiBnZXQgZmVhdCBSQVdTRVJWSUNFICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBoYS0+aW5mbykpOworICAgICAgICAgICAgaGEtPnJhd19mZWF0IHw9ICh1c2hvcnQpaGEtPmluZm87CisgICAgICAgIH0KKyAgICB9IAorCisgICAgLyogc2V0L2dldCBmZWF0dXJlcyBjYWNoZSBzZXJ2aWNlIChlcXVhbCB0byByYXcgc2VydmljZSkgKi8KKyAgICBpZiAoZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9TRVRfRkVBVCwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FUVEVSX0dBVEhFUiwwKSkgeworICAgICAgICBUUkFDRTIoKCJnZHRoX3NlYXJjaF9kcml2ZXMoKTogc2V0IGZlYXR1cmVzIENBQ0hFU0VSVklDRSBPS1xuIikpOworICAgICAgICBpZiAoZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9HRVRfRkVBVCwwLDAsMCkpIHsKKyAgICAgICAgICAgIFRSQUNFMigoImdkdGhfc2VhcmNoX2RyKCk6IGdldCBmZWF0IENBQ0hFU0VSVi4gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGhhLT5pbmZvKSk7CisgICAgICAgICAgICBoYS0+Y2FjaGVfZmVhdCB8PSAodXNob3J0KWhhLT5pbmZvOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcmVzZXJ2ZSBkcml2ZXMgZm9yIHJhdyBzZXJ2aWNlICovCisgICAgaWYgKHJlc2VydmVfbW9kZSAhPSAwKSB7CisgICAgICAgIGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLFNDU0lSQVdTRVJWSUNFLEdEVF9SRVNFUlZFX0FMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZV9tb2RlID09IDEgPyAxIDogMywgMCwgMCk7CisgICAgICAgIFRSQUNFMigoImdkdGhfc2VhcmNoX2RyaXZlcygpOiBSRVNFUlZFX0FMTCBjb2RlICVkXG4iLCAKKyAgICAgICAgICAgICAgICBoYS0+c3RhdHVzKSk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUkVTX0FSR1M7IGkgKz0gNCkgeworICAgICAgICBpZiAocmVzZXJ2ZV9saXN0W2ldID09IGhhbnVtICYmIHJlc2VydmVfbGlzdFtpKzFdIDwgaGEtPmJ1c19jbnQgJiYgCisgICAgICAgICAgICByZXNlcnZlX2xpc3RbaSsyXSA8IGhhLT50aWRfY250ICYmIHJlc2VydmVfbGlzdFtpKzNdIDwgTUFYTFVOKSB7CisgICAgICAgICAgICBUUkFDRTIoKCJnZHRoX3NlYXJjaF9kcml2ZXMoKTogcmVzZXJ2ZSBoYSAlZCBidXMgJWQgaWQgJWQgbHVuICVkXG4iLAorICAgICAgICAgICAgICAgICAgICByZXNlcnZlX2xpc3RbaV0sIHJlc2VydmVfbGlzdFtpKzFdLAorICAgICAgICAgICAgICAgICAgICByZXNlcnZlX2xpc3RbaSsyXSwgcmVzZXJ2ZV9saXN0W2krM10pKTsKKyAgICAgICAgICAgIGlmICghZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sU0NTSVJBV1NFUlZJQ0UsR0RUX1JFU0VSVkUsMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZV9saXN0W2krMV0sIHJlc2VydmVfbGlzdFtpKzJdIHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNlcnZlX2xpc3RbaSszXSA8PCA4KSkpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1IQSAlZDogRXJyb3IgcmF3IHNlcnZpY2UgKFJFU0VSVkUsIGNvZGUgJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBoYW51bSwgaGEtPnN0YXR1cyk7CisgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogRGV0ZXJtaW5lIE9FTSBzdHJpbmcgdXNpbmcgSU9DVEwgKi8KKyAgICBvZW1zdHIgPSAoZ2R0aF9vZW1fc3RyX2lvY3RsICopaGEtPnBzY3JhdGNoOworICAgIG9lbXN0ci0+cGFyYW1zLmN0bF92ZXJzaW9uID0gMHgwMTsKKyAgICBvZW1zdHItPnBhcmFtcy5idWZmZXJfc2l6ZSA9IHNpemVvZihvZW1zdHItPnRleHQpOworICAgIGlmIChnZHRoX2ludGVybmFsX2NtZChoYW51bSxDQUNIRVNFUlZJQ0UsR0RUX0lPQ1RMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRV9SRUFEX09FTV9TVFJJTkdfUkVDT1JELElOVkFMSURfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdkdGhfb2VtX3N0cl9pb2N0bCkpKSB7CisgICAgICAgIFRSQUNFMigoImdkdGhfc2VhcmNoX2RyaXZlcygpOiBDQUNIRV9SRUFEX09FTV9TVFJJTkdfUkVDT1JEIE9LXG4iKSk7CisgICAgICAgIHByaW50aygiR0RULUhBICVkOiBWZW5kb3I6ICVzIE5hbWU6ICVzXG4iLAorICAgICAgICAgICAgICAgaGFudW0sb2Vtc3RyLT50ZXh0Lm9lbV9jb21wYW55X25hbWUsaGEtPmJpbmZvLnR5cGVfc3RyaW5nKTsKKyAgICAgICAgLyogU2F2ZSB0aGUgSG9zdCBEcml2ZSBpbnF1aXJ5IGRhdGEgKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgICAgIHN0cmxjcHkoaGEtPm9lbV9uYW1lLG9lbXN0ci0+dGV4dC5zY3NpX2hvc3RfZHJpdmVfaW5xdWlyeV92ZW5kb3JfaWQsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGhhLT5vZW1fbmFtZSkpOworI2Vsc2UKKyAgICAgICAgc3RybmNweShoYS0+b2VtX25hbWUsb2Vtc3RyLT50ZXh0LnNjc2lfaG9zdF9kcml2ZV9pbnF1aXJ5X3ZlbmRvcl9pZCw3KTsKKyAgICAgICAgaGEtPm9lbV9uYW1lWzddID0gJ1wwJzsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIE9sZCBtZXRob2QsIGJhc2VkIG9uIFBDSSBJRCAqLworICAgICAgICBUUkFDRTIoKCJnZHRoX3NlYXJjaF9kcml2ZXMoKTogQ0FDSEVfUkVBRF9PRU1fU1RSSU5HX1JFQ09SRCBmYWlsZWRcbiIpKTsKKyAgICAgICAgcHJpbnRrKCJHRFQtSEEgJWQ6IE5hbWU6ICVzXG4iLAorICAgICAgICAgICAgICAgaGFudW0saGEtPmJpbmZvLnR5cGVfc3RyaW5nKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgICAgIGlmIChoYS0+b2VtX2lkID09IE9FTV9JRF9JTlRFTCkKKyAgICAgICAgICAgIHN0cmxjcHkoaGEtPm9lbV9uYW1lLCJJbnRlbCAgIiwgc2l6ZW9mKGhhLT5vZW1fbmFtZSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdHJsY3B5KGhhLT5vZW1fbmFtZSwiSUNQICAgICIsIHNpemVvZihoYS0+b2VtX25hbWUpKTsKKyNlbHNlIAorICAgICAgICBpZiAoaGEtPm9lbV9pZCA9PSBPRU1fSURfSU5URUwpCisgICAgICAgICAgICBzdHJjcHkoaGEtPm9lbV9uYW1lLCJJbnRlbCAgIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0cmNweShoYS0+b2VtX25hbWUsIklDUCAgICAiKTsKKyNlbmRpZgorICAgIH0KKworICAgIC8qIHNjYW5uaW5nIGZvciBob3N0IGRyaXZlcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjZGV2X2NudDsgKytpKSAKKyAgICAgICAgZ2R0aF9hbmFseXNlX2hkcml2ZShoYW51bSxpKTsKKyAgICAKKyAgICBUUkFDRSgoImdkdGhfc2VhcmNoX2RyaXZlcygpIE9LXG4iKSk7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZ2R0aF9hbmFseXNlX2hkcml2ZShpbnQgaGFudW0sdXNob3J0IGhkcml2ZSkKK3sKKyAgICByZWdpc3RlciBnZHRoX2hhX3N0ciAqaGE7CisgICAgdWxvbmczMiBkcnZfY3lsczsKKyAgICBpbnQgZHJ2X2hkcywgZHJ2X3NlY3M7CisKKyAgICBUUkFDRSgoImdkdGhfYW5hbHlzZV9oZHJpdmUoKSBoYW51bSAlZCBkcml2ZSAlZFxuIixoYW51bSxoZHJpdmUpKTsKKyAgICBpZiAoaGRyaXZlID49IE1BWF9IRFJJVkVTKQorICAgICAgICByZXR1cm4gMDsKKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKworICAgIGlmICghZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9JTkZPLGhkcml2ZSwwLDApKSAKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaGEtPmhkcltoZHJpdmVdLnByZXNlbnQgPSBUUlVFOworICAgIGhhLT5oZHJbaGRyaXZlXS5zaXplID0gaGEtPmluZm87CisgICAKKyAgICAvKiBldmFsdWF0ZSBtYXBwaW5nIChzZWN0b3JzIHBlciBoZWFkLCBoZWFkcyBwZXIgY3lsaW5kZXIpICovCisgICAgaGEtPmhkcltoZHJpdmVdLnNpemUgJj0gflNFQ1MzMjsKKyAgICBpZiAoaGEtPmluZm8yID09IDApIHsKKyAgICAgICAgZ2R0aF9ldmFsX21hcHBpbmcoaGEtPmhkcltoZHJpdmVdLnNpemUsJmRydl9jeWxzLCZkcnZfaGRzLCZkcnZfc2Vjcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHJ2X2hkcyA9IGhhLT5pbmZvMiAmIDB4ZmY7CisgICAgICAgIGRydl9zZWNzID0gKGhhLT5pbmZvMiA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGRydl9jeWxzID0gKHVsb25nMzIpaGEtPmhkcltoZHJpdmVdLnNpemUgLyBkcnZfaGRzIC8gZHJ2X3NlY3M7CisgICAgfQorICAgIGhhLT5oZHJbaGRyaXZlXS5oZWFkcyA9ICh1bmNoYXIpZHJ2X2hkczsKKyAgICBoYS0+aGRyW2hkcml2ZV0uc2VjcyAgPSAodW5jaGFyKWRydl9zZWNzOworICAgIC8qIHJvdW5kIHNpemUgKi8KKyAgICBoYS0+aGRyW2hkcml2ZV0uc2l6ZSAgPSBkcnZfY3lscyAqIGRydl9oZHMgKiBkcnZfc2VjczsKKyAgICAKKyAgICBpZiAoaGEtPmNhY2hlX2ZlYXQgJiBHRFRfNjRCSVQpIHsKKyAgICAgICAgaWYgKGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLENBQ0hFU0VSVklDRSxHRFRfWF9JTkZPLGhkcml2ZSwwLDApCisgICAgICAgICAgICAmJiBoYS0+aW5mbzIgIT0gMCkgeworICAgICAgICAgICAgaGEtPmhkcltoZHJpdmVdLnNpemUgPSAoKHVsb25nNjQpaGEtPmluZm8yIDw8IDMyKSB8IGhhLT5pbmZvOworICAgICAgICB9CisgICAgfQorICAgIFRSQUNFMigoImdkdGhfc2VhcmNoX2RyKCkgY2RyLiAlZCBzaXplICVkIGhkcyAlZCBzY3MgJWRcbiIsCisgICAgICAgICAgICBoZHJpdmUsaGEtPmhkcltoZHJpdmVdLnNpemUsZHJ2X2hkcyxkcnZfc2VjcykpOworCisgICAgLyogZ2V0IGluZm9ybWF0aW9ucyBhYm91dCBkZXZpY2UgKi8KKyAgICBpZiAoZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9ERVZUWVBFLGhkcml2ZSwwLDApKSB7CisgICAgICAgIFRSQUNFMigoImdkdGhfc2VhcmNoX2RyKCkgY2FjaGUgZHJpdmUgJWQgZGV2dHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICBoZHJpdmUsaGEtPmluZm8pKTsKKyAgICAgICAgaGEtPmhkcltoZHJpdmVdLmRldnR5cGUgPSAodXNob3J0KWhhLT5pbmZvOworICAgIH0KKworICAgIC8qIGNsdXN0ZXIgaW5mbyAqLworICAgIGlmIChnZHRoX2ludGVybmFsX2NtZChoYW51bSxDQUNIRVNFUlZJQ0UsR0RUX0NMVVNUX0lORk8saGRyaXZlLDAsMCkpIHsKKyAgICAgICAgVFJBQ0UyKCgiZ2R0aF9zZWFyY2hfZHIoKSBjYWNoZSBkcml2ZSAlZCBjbHVzdGVyIGluZm8gJWRcbiIsCisgICAgICAgICAgICAgICAgaGRyaXZlLGhhLT5pbmZvKSk7CisgICAgICAgIGlmICghc2hhcmVkX2FjY2VzcykKKyAgICAgICAgICAgIGhhLT5oZHJbaGRyaXZlXS5jbHVzdGVyX3R5cGUgPSAodW5jaGFyKWhhLT5pbmZvOworICAgIH0KKworICAgIC8qIFIvVyBhdHRyaWJ1dGVzICovCisgICAgaWYgKGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLENBQ0hFU0VSVklDRSxHRFRfUldfQVRUUklCUyxoZHJpdmUsMCwwKSkgeworICAgICAgICBUUkFDRTIoKCJnZHRoX3NlYXJjaF9kcigpIGNhY2hlIGRyaXZlICVkIHIvdyBhdHRyaWIuICVkXG4iLAorICAgICAgICAgICAgICAgIGhkcml2ZSxoYS0+aW5mbykpOworICAgICAgICBoYS0+aGRyW2hkcml2ZV0ucndfYXR0cmlicyA9ICh1bmNoYXIpaGEtPmluZm87CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKworLyogY29tbWFuZCBxdWV1ZWluZy9zZW5kaW5nIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgdm9pZCBnZHRoX3B1dHEoaW50IGhhbnVtLFNjc2lfQ21uZCAqc2NwLHVuY2hhciBwcmlvcml0eSkKK3sKKyAgICByZWdpc3RlciBnZHRoX2hhX3N0ciAqaGE7CisgICAgcmVnaXN0ZXIgU2NzaV9DbW5kICpwc2NwOworICAgIHJlZ2lzdGVyIFNjc2lfQ21uZCAqbnNjcDsKKyAgICB1bG9uZyBmbGFnczsKKyAgICB1bmNoYXIgYiwgdDsKKworICAgIFRSQUNFKCgiZ2R0aF9wdXRxKCkgcHJpb3JpdHkgJWRcbiIscHJpb3JpdHkpKTsKKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisKKyAgICBzY3AtPlNDcC50aGlzX3Jlc2lkdWFsID0gKGludClwcmlvcml0eTsKKyAgICBiID0gdmlydF9jdHIgPyBOVU1EQVRBKHNjcC0+ZGV2aWNlLT5ob3N0KS0+YnVzbnVtIDogc2NwLT5kZXZpY2UtPmNoYW5uZWw7CisgICAgdCA9IHNjcC0+ZGV2aWNlLT5pZDsKKyAgICBpZiAocHJpb3JpdHkgPj0gREVGQVVMVF9QUkkpIHsKKyAgICAgICAgaWYgKChiICE9IGhhLT52aXJ0X2J1cyAmJiBoYS0+cmF3W0JVU19MMlAoaGEsYildLmxvY2spIHx8CisgICAgICAgICAgICAoYiA9PSBoYS0+dmlydF9idXMgJiYgdCA8IE1BWF9IRFJJVkVTICYmIGhhLT5oZHJbdF0ubG9jaykpIHsKKyAgICAgICAgICAgIFRSQUNFMigoImdkdGhfcHV0cSgpOiBsb2NrZWQgSU8gLT4gdXBkYXRlX3RpbWVvdXQoKVxuIikpOworICAgICAgICAgICAgc2NwLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IGdkdGhfdXBkYXRlX3RpbWVvdXQoaGFudW0sIHNjcCwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaGEtPnJlcV9maXJzdD09TlVMTCkgeworICAgICAgICBoYS0+cmVxX2ZpcnN0ID0gc2NwOyAgICAgICAgICAgICAgICAgICAgLyogcXVldWUgd2FzIGVtcHR5ICovCisgICAgICAgIHNjcC0+U0NwLnB0ciA9IE5VTEw7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxdWV1ZSBub3QgZW1wdHkgKi8KKyAgICAgICAgcHNjcCA9IGhhLT5yZXFfZmlyc3Q7CisgICAgICAgIG5zY3AgPSAoU2NzaV9DbW5kICopcHNjcC0+U0NwLnB0cjsKKyAgICAgICAgLyogcHJpb3JpdHk6IDAtaGlnaGVzdCwuLiwweGZmLWxvd2VzdCAqLworICAgICAgICB3aGlsZSAobnNjcCAmJiAodW5jaGFyKW5zY3AtPlNDcC50aGlzX3Jlc2lkdWFsIDw9IHByaW9yaXR5KSB7CisgICAgICAgICAgICBwc2NwID0gbnNjcDsKKyAgICAgICAgICAgIG5zY3AgPSAoU2NzaV9DbW5kICopcHNjcC0+U0NwLnB0cjsKKyAgICAgICAgfQorICAgICAgICBwc2NwLT5TQ3AucHRyID0gKGNoYXIgKilzY3A7CisgICAgICAgIHNjcC0+U0NwLnB0ciAgPSAoY2hhciAqKW5zY3A7CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworCisjaWZkZWYgR0RUSF9TVEFUSVNUSUNTCisgICAgZmxhZ3MgPSAwOworICAgIGZvciAobnNjcD1oYS0+cmVxX2ZpcnN0OyBuc2NwOyBuc2NwPShTY3NpX0NtbmQqKW5zY3AtPlNDcC5wdHIpCisgICAgICAgICsrZmxhZ3M7CisgICAgaWYgKG1heF9ycSA8IGZsYWdzKSB7CisgICAgICAgIG1heF9ycSA9IGZsYWdzOworICAgICAgICBUUkFDRTMoKCJHRFQ6IG1heF9ycSA9ICVkXG4iLCh1c2hvcnQpbWF4X3JxKSk7CisgICAgfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGdkdGhfbmV4dChpbnQgaGFudW0pCit7CisgICAgcmVnaXN0ZXIgZ2R0aF9oYV9zdHIgKmhhOworICAgIHJlZ2lzdGVyIFNjc2lfQ21uZCAqcHNjcDsKKyAgICByZWdpc3RlciBTY3NpX0NtbmQgKm5zY3A7CisgICAgdW5jaGFyIGIsIHQsIGwsIGZpcnN0dGltZTsKKyAgICB1bmNoYXIgdGhpc19jbWQsIG5leHRfY21kOworICAgIHVsb25nIGZsYWdzID0gMDsKKyAgICBpbnQgY21kX2luZGV4OworCisgICAgVFJBQ0UoKCJnZHRoX25leHQoKSBoYW51bSAlZFxuIixoYW51bSkpOworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIGlmICghZ2R0aF9wb2xsaW5nKSAKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworCisgICAgaGEtPmNtZF9jbnQgPSBoYS0+Y21kX29mZnNfZHBtZW0gPSAwOworICAgIHRoaXNfY21kID0gZmlyc3R0aW1lID0gVFJVRTsKKyAgICBuZXh0X2NtZCA9IGdkdGhfcG9sbGluZyA/IEZBTFNFOlRSVUU7CisgICAgY21kX2luZGV4ID0gMDsKKworICAgIGZvciAobnNjcCA9IHBzY3AgPSBoYS0+cmVxX2ZpcnN0OyBuc2NwOyBuc2NwID0gKFNjc2lfQ21uZCAqKW5zY3AtPlNDcC5wdHIpIHsKKyAgICAgICAgaWYgKG5zY3AgIT0gcHNjcCAmJiBuc2NwICE9IChTY3NpX0NtbmQgKilwc2NwLT5TQ3AucHRyKQorICAgICAgICAgICAgcHNjcCA9IChTY3NpX0NtbmQgKilwc2NwLT5TQ3AucHRyOworICAgICAgICBiID0gdmlydF9jdHIgPyBOVU1EQVRBKG5zY3AtPmRldmljZS0+aG9zdCktPmJ1c251bSA6IG5zY3AtPmRldmljZS0+Y2hhbm5lbDsKKyAgICAgICAgdCA9IG5zY3AtPmRldmljZS0+aWQ7CisgICAgICAgIGwgPSBuc2NwLT5kZXZpY2UtPmx1bjsKKyAgICAgICAgaWYgKG5zY3AtPlNDcC50aGlzX3Jlc2lkdWFsID49IERFRkFVTFRfUFJJKSB7CisgICAgICAgICAgICBpZiAoKGIgIT0gaGEtPnZpcnRfYnVzICYmIGhhLT5yYXdbQlVTX0wyUChoYSxiKV0ubG9jaykgfHwKKyAgICAgICAgICAgICAgICAoYiA9PSBoYS0+dmlydF9idXMgJiYgdCA8IE1BWF9IRFJJVkVTICYmIGhhLT5oZHJbdF0ubG9jaykpIAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpcnN0dGltZSkgeworICAgICAgICAgICAgaWYgKGdkdGhfdGVzdF9idXN5KGhhbnVtKSkgeyAgICAgICAgLyogY29udHJvbGxlciBidXN5ID8gKi8KKyAgICAgICAgICAgICAgICBUUkFDRSgoImdkdGhfbmV4dCgpIGNvbnRyb2xsZXIgJWQgYnVzeSAhXG4iLGhhbnVtKSk7CisgICAgICAgICAgICAgICAgaWYgKCFnZHRoX3BvbGxpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKGdkdGhfdGVzdF9idXN5KGhhbnVtKSkKKyAgICAgICAgICAgICAgICAgICAgZ2R0aF9kZWxheSgxKTsKKyAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgIGZpcnN0dGltZSA9IEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5zY3AtPmRvbmUgIT0gZ2R0aF9zY3NpX2RvbmUgfHwgbnNjcC0+Y21uZFswXSAhPSAweGZmKSB7ICAgICAgICAKKyAgICAgICAgaWYgKG5zY3AtPlNDcC5waGFzZSA9PSAtMSkgeworICAgICAgICAgICAgbnNjcC0+U0NwLnBoYXNlID0gQ0FDSEVTRVJWSUNFOyAgICAgICAgICAgLyogZGVmYXVsdDogY2FjaGUgc3ZjLiAqLyAKKyAgICAgICAgICAgIGlmIChuc2NwLT5jbW5kWzBdID09IFRFU1RfVU5JVF9SRUFEWSkgeworICAgICAgICAgICAgICAgIFRSQUNFMigoIlRFU1RfVU5JVF9SRUFEWSBCdXMgJWQgSWQgJWQgTFVOICVkXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGIsIHQsIGwpKTsKKyAgICAgICAgICAgICAgICAvKiBURVNUX1VOSVRfUkVBRFkgLT4gc2V0IHNjYW4gbW9kZSAqLworICAgICAgICAgICAgICAgIGlmICgoaGEtPnNjYW5fbW9kZSAmIDB4MGYpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gMCAmJiB0ID09IDAgJiYgbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYS0+c2Nhbl9tb2RlIHw9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRTIoKCJTY2FuIG1vZGU6IDB4JXhcbiIsIGhhLT5zY2FuX21vZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGhhLT5zY2FuX21vZGUgJiAweDBmKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiID09IDAgJiYgKCh0ID09IDAgJiYgbCA9PSAxKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICh0ID09IDEgJiYgbCA9PSAwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5zY3AtPlNDcC5zZW50X2NvbW1hbmQgPSBHRFRfU0NBTl9TVEFSVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5zY3AtPlNDcC5waGFzZSA9ICgoaGEtPnNjYW5fbW9kZSAmIDB4MTAgPyAxOjApIDw8IDgpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU0NTSVJBV1NFUlZJQ0U7CisgICAgICAgICAgICAgICAgICAgICAgICBoYS0+c2Nhbl9tb2RlID0gMHgxMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFMigoIlNjYW4gbW9kZTogMHgleCAoU0NBTl9TVEFSVClcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYS0+c2Nhbl9tb2RlKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYS0+c2Nhbl9tb2RlICY9IDB4MTA7CisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRTIoKCJTY2FuIG1vZGU6IDB4JXhcbiIsIGhhLT5zY2FuX21vZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhLT5zY2FuX21vZGUgPT0gMHgxMikgeworICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSBoYS0+YnVzX2NudCAmJiB0ID09IGhhLT50aWRfY250LTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5zY3AtPlNDcC5waGFzZSA9IFNDU0lSQVdTRVJWSUNFOworICAgICAgICAgICAgICAgICAgICAgICAgbnNjcC0+U0NwLnNlbnRfY29tbWFuZCA9IEdEVF9TQ0FOX0VORDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5zY2FuX21vZGUgJj0gMHgxMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFMigoIlNjYW4gbW9kZTogMHgleCAoU0NBTl9FTkQpXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGEtPnNjYW5fbW9kZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGIgPT0gaGEtPnZpcnRfYnVzICYmIG5zY3AtPmNtbmRbMF0gIT0gSU5RVUlSWSAmJgorICAgICAgICAgICAgICAgIG5zY3AtPmNtbmRbMF0gIT0gUkVBRF9DQVBBQ0lUWSAmJiBuc2NwLT5jbW5kWzBdICE9IE1PREVfU0VOU0UgJiYKKyAgICAgICAgICAgICAgICAoaGEtPmhkclt0XS5jbHVzdGVyX3R5cGUgJiBDTFVTVEVSX0RSSVZFKSkgeworICAgICAgICAgICAgICAgIC8qIGFsd2F5cyBHRFRfQ0xVU1RfSU5GTyEgKi8KKyAgICAgICAgICAgICAgICBuc2NwLT5TQ3Auc2VudF9jb21tYW5kID0gR0RUX0NMVVNUX0lORk87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChuc2NwLT5TQ3Auc2VudF9jb21tYW5kICE9IC0xKSB7CisgICAgICAgICAgICBpZiAoKG5zY3AtPlNDcC5waGFzZSAmIDB4ZmYpID09IENBQ0hFU0VSVklDRSkgeworICAgICAgICAgICAgICAgIGlmICghKGNtZF9pbmRleD1nZHRoX2ZpbGxfY2FjaGVfY21kKGhhbnVtLG5zY3AsdCkpKQorICAgICAgICAgICAgICAgICAgICB0aGlzX2NtZCA9IEZBTFNFOworICAgICAgICAgICAgICAgIG5leHRfY21kID0gRkFMU0U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChuc2NwLT5TQ3AucGhhc2UgJiAweGZmKSA9PSBTQ1NJUkFXU0VSVklDRSkgeworICAgICAgICAgICAgICAgIGlmICghKGNtZF9pbmRleD1nZHRoX2ZpbGxfcmF3X2NtZChoYW51bSxuc2NwLEJVU19MMlAoaGEsYikpKSkKKyAgICAgICAgICAgICAgICAgICAgdGhpc19jbWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBuZXh0X2NtZCA9IEZBTFNFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQoKGNoYXIqKW5zY3AtPnNlbnNlX2J1ZmZlciwwLDE2KTsKKyAgICAgICAgICAgICAgICBuc2NwLT5zZW5zZV9idWZmZXJbMF0gPSAweDcwOworICAgICAgICAgICAgICAgIG5zY3AtPnNlbnNlX2J1ZmZlclsyXSA9IE5PVF9SRUFEWTsKKyAgICAgICAgICAgICAgICBuc2NwLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KSB8IChDSEVDS19DT05ESVRJT04gPDwgMSk7CisgICAgICAgICAgICAgICAgaWYgKCFuc2NwLT5TQ3AuaGF2ZV9kYXRhX2luKQorICAgICAgICAgICAgICAgICAgICBuc2NwLT5TQ3AuaGF2ZV9kYXRhX2luKys7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBuc2NwLT5zY3NpX2RvbmUobnNjcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobnNjcC0+ZG9uZSA9PSBnZHRoX3Njc2lfZG9uZSAmJiBuc2NwLT5jbW5kWzBdID09IDB4ZmYpIHsKKyAgICAgICAgICAgIGlmICghKGNtZF9pbmRleD1nZHRoX3NwZWNpYWxfY21kKGhhbnVtLG5zY3ApKSkKKyAgICAgICAgICAgICAgICB0aGlzX2NtZCA9IEZBTFNFOworICAgICAgICAgICAgbmV4dF9jbWQgPSBGQUxTRTsKKyAgICAgICAgfSBlbHNlIGlmIChiICE9IGhhLT52aXJ0X2J1cykgeworICAgICAgICAgICAgaWYgKGhhLT5yYXdbQlVTX0wyUChoYSxiKV0uaW9fY250W3RdID49IEdEVEhfTUFYX1JBVyB8fAorICAgICAgICAgICAgICAgICEoY21kX2luZGV4PWdkdGhfZmlsbF9yYXdfY21kKGhhbnVtLG5zY3AsQlVTX0wyUChoYSxiKSkpKSAKKyAgICAgICAgICAgICAgICB0aGlzX2NtZCA9IEZBTFNFOworICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICBoYS0+cmF3W0JVU19MMlAoaGEsYildLmlvX2NudFt0XSsrOworICAgICAgICB9IGVsc2UgaWYgKHQgPj0gTUFYX0hEUklWRVMgfHwgIWhhLT5oZHJbdF0ucHJlc2VudCB8fCBsICE9IDApIHsKKyAgICAgICAgICAgIFRSQUNFMigoIkNvbW1hbmQgMHgleCB0byBidXMgJWQgaWQgJWQgbHVuICVkIC0+IElHTk9SRVxuIiwKKyAgICAgICAgICAgICAgICAgICAgbnNjcC0+Y21uZFswXSwgYiwgdCwgbCkpOworICAgICAgICAgICAgbnNjcC0+cmVzdWx0ID0gRElEX0JBRF9UQVJHRVQgPDwgMTY7CisgICAgICAgICAgICBpZiAoIW5zY3AtPlNDcC5oYXZlX2RhdGFfaW4pCisgICAgICAgICAgICAgICAgbnNjcC0+U0NwLmhhdmVfZGF0YV9pbisrOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG5zY3AtPnNjc2lfZG9uZShuc2NwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAobnNjcC0+Y21uZFswXSkgeworICAgICAgICAgICAgICBjYXNlIFRFU1RfVU5JVF9SRUFEWToKKyAgICAgICAgICAgICAgY2FzZSBJTlFVSVJZOgorICAgICAgICAgICAgICBjYXNlIFJFUVVFU1RfU0VOU0U6CisgICAgICAgICAgICAgIGNhc2UgUkVBRF9DQVBBQ0lUWToKKyAgICAgICAgICAgICAgY2FzZSBWRVJJRlk6CisgICAgICAgICAgICAgIGNhc2UgU1RBUlRfU1RPUDoKKyAgICAgICAgICAgICAgY2FzZSBNT0RFX1NFTlNFOgorICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfQUNUSU9OX0lOOgorICAgICAgICAgICAgICAgIFRSQUNFKCgiY2FjaGUgY21kICV4LyV4LyV4LyV4LyV4LyV4XG4iLG5zY3AtPmNtbmRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgIG5zY3AtPmNtbmRbMV0sbnNjcC0+Y21uZFsyXSxuc2NwLT5jbW5kWzNdLAorICAgICAgICAgICAgICAgICAgICAgICBuc2NwLT5jbW5kWzRdLG5zY3AtPmNtbmRbNV0pKTsKKyAgICAgICAgICAgICAgICBpZiAoaGEtPmhkclt0XS5tZWRpYV9jaGFuZ2VkICYmIG5zY3AtPmNtbmRbMF0gIT0gSU5RVUlSWSkgeworICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gVU5JVF9BVFRFTlRJT04gKi8KKyAgICAgICAgICAgICAgICAgICAgVFJBQ0UyKCgiY21kIDB4JXggdGFyZ2V0ICVkOiBVTklUX0FUVEVOVElPTlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNjcC0+Y21uZFswXSwgdCkpOworICAgICAgICAgICAgICAgICAgICBoYS0+aGRyW3RdLm1lZGlhX2NoYW5nZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KChjaGFyKiluc2NwLT5zZW5zZV9idWZmZXIsMCwxNik7CisgICAgICAgICAgICAgICAgICAgIG5zY3AtPnNlbnNlX2J1ZmZlclswXSA9IDB4NzA7CisgICAgICAgICAgICAgICAgICAgIG5zY3AtPnNlbnNlX2J1ZmZlclsyXSA9IFVOSVRfQVRURU5USU9OOworICAgICAgICAgICAgICAgICAgICBuc2NwLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KSB8IChDSEVDS19DT05ESVRJT04gPDwgMSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbnNjcC0+U0NwLmhhdmVfZGF0YV9pbikKKyAgICAgICAgICAgICAgICAgICAgICAgIG5zY3AtPlNDcC5oYXZlX2RhdGFfaW4rKzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbnNjcC0+c2NzaV9kb25lKG5zY3ApOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2R0aF9pbnRlcm5hbF9jYWNoZV9jbWQoaGFudW0sbnNjcCkpCisgICAgICAgICAgICAgICAgICAgIG5zY3AtPnNjc2lfZG9uZShuc2NwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIEFMTE9XX01FRElVTV9SRU1PVkFMOgorICAgICAgICAgICAgICAgIFRSQUNFKCgiY2FjaGUgY21kICV4LyV4LyV4LyV4LyV4LyV4XG4iLG5zY3AtPmNtbmRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgIG5zY3AtPmNtbmRbMV0sbnNjcC0+Y21uZFsyXSxuc2NwLT5jbW5kWzNdLAorICAgICAgICAgICAgICAgICAgICAgICBuc2NwLT5jbW5kWzRdLG5zY3AtPmNtbmRbNV0pKTsKKyAgICAgICAgICAgICAgICBpZiAoIChuc2NwLT5jbW5kWzRdJjEpICYmICEoaGEtPmhkclt0XS5kZXZ0eXBlJjEpICkgeworICAgICAgICAgICAgICAgICAgICBUUkFDRSgoIlByZXZlbnQgci4gbm9ucmVtb3YuIGRyaXZlLT5kbyBub3RoaW5nXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIG5zY3AtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKyAgICAgICAgICAgICAgICAgICAgbnNjcC0+c2Vuc2VfYnVmZmVyWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFuc2NwLT5TQ3AuaGF2ZV9kYXRhX2luKQorICAgICAgICAgICAgICAgICAgICAgICAgbnNjcC0+U0NwLmhhdmVfZGF0YV9pbisrOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBuc2NwLT5zY3NpX2RvbmUobnNjcCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbnNjcC0+Y21uZFszXSA9IChoYS0+aGRyW3RdLmRldnR5cGUmMSkgPyAxOjA7CisgICAgICAgICAgICAgICAgICAgIFRSQUNFKCgiUHJldmVudC9hbGxvdyByLiAlZCByZW0uIGRyaXZlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNjcC0+Y21uZFs0XSxuc2NwLT5jbW5kWzNdKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKGNtZF9pbmRleD1nZHRoX2ZpbGxfY2FjaGVfY21kKGhhbnVtLG5zY3AsdCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19jbWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGNhc2UgUkVTRVJWRToKKyAgICAgICAgICAgICAgY2FzZSBSRUxFQVNFOgorICAgICAgICAgICAgICAgIFRSQUNFMigoImNhY2hlIGNtZCAlc1xuIixuc2NwLT5jbW5kWzBdID09IFJFU0VSVkUgPworICAgICAgICAgICAgICAgICAgICAgICAgIlJFU0VSVkUiIDogIlJFTEVBU0UiKSk7CisgICAgICAgICAgICAgICAgaWYgKCEoY21kX2luZGV4PWdkdGhfZmlsbF9jYWNoZV9jbWQoaGFudW0sbnNjcCx0KSkpCisgICAgICAgICAgICAgICAgICAgIHRoaXNfY21kID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGNhc2UgUkVBRF82OgorICAgICAgICAgICAgICBjYXNlIFdSSVRFXzY6CisgICAgICAgICAgICAgIGNhc2UgUkVBRF8xMDoKKyAgICAgICAgICAgICAgY2FzZSBXUklURV8xMDoKKyAgICAgICAgICAgICAgY2FzZSBSRUFEXzE2OgorICAgICAgICAgICAgICBjYXNlIFdSSVRFXzE2OgorICAgICAgICAgICAgICAgIGlmIChoYS0+aGRyW3RdLm1lZGlhX2NoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIFVOSVRfQVRURU5USU9OICovCisgICAgICAgICAgICAgICAgICAgIFRSQUNFMigoImNtZCAweCV4IHRhcmdldCAlZDogVU5JVF9BVFRFTlRJT05cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zY3AtPmNtbmRbMF0sIHQpKTsKKyAgICAgICAgICAgICAgICAgICAgaGEtPmhkclt0XS5tZWRpYV9jaGFuZ2VkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCgoY2hhciopbnNjcC0+c2Vuc2VfYnVmZmVyLDAsMTYpOworICAgICAgICAgICAgICAgICAgICBuc2NwLT5zZW5zZV9idWZmZXJbMF0gPSAweDcwOworICAgICAgICAgICAgICAgICAgICBuc2NwLT5zZW5zZV9idWZmZXJbMl0gPSBVTklUX0FUVEVOVElPTjsKKyAgICAgICAgICAgICAgICAgICAgbnNjcC0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCAoQ0hFQ0tfQ09ORElUSU9OIDw8IDEpOworICAgICAgICAgICAgICAgICAgICBpZiAoIW5zY3AtPlNDcC5oYXZlX2RhdGFfaW4pCisgICAgICAgICAgICAgICAgICAgICAgICBuc2NwLT5TQ3AuaGF2ZV9kYXRhX2luKys7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG5zY3AtPnNjc2lfZG9uZShuc2NwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEoY21kX2luZGV4PWdkdGhfZmlsbF9jYWNoZV9jbWQoaGFudW0sbnNjcCx0KSkpCisgICAgICAgICAgICAgICAgICAgIHRoaXNfY21kID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBUUkFDRTIoKCJjYWNoZSBjbWQgJXgvJXgvJXgvJXgvJXgvJXggdW5rbm93blxuIixuc2NwLT5jbW5kWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgbnNjcC0+Y21uZFsxXSxuc2NwLT5jbW5kWzJdLG5zY3AtPmNtbmRbM10sCisgICAgICAgICAgICAgICAgICAgICAgICBuc2NwLT5jbW5kWzRdLG5zY3AtPmNtbmRbNV0pKTsKKyAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1IQSAlZDogVW5rbm93biBTQ1NJIGNvbW1hbmQgMHgleCB0byBjYWNoZSBzZXJ2aWNlICFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGhhbnVtLCBuc2NwLT5jbW5kWzBdKTsKKyAgICAgICAgICAgICAgICBuc2NwLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisgICAgICAgICAgICAgICAgaWYgKCFuc2NwLT5TQ3AuaGF2ZV9kYXRhX2luKQorICAgICAgICAgICAgICAgICAgICBuc2NwLT5TQ3AuaGF2ZV9kYXRhX2luKys7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBuc2NwLT5zY3NpX2RvbmUobnNjcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRoaXNfY21kKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChuc2NwID09IGhhLT5yZXFfZmlyc3QpCisgICAgICAgICAgICBoYS0+cmVxX2ZpcnN0ID0gcHNjcCA9IChTY3NpX0NtbmQgKiluc2NwLT5TQ3AucHRyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwc2NwLT5TQ3AucHRyID0gbnNjcC0+U0NwLnB0cjsKKyAgICAgICAgaWYgKCFuZXh0X2NtZCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChoYS0+Y21kX2NudCA+IDApIHsKKyAgICAgICAgZ2R0aF9yZWxlYXNlX2V2ZW50KGhhbnVtKTsKKyAgICB9CisKKyAgICBpZiAoIWdkdGhfcG9sbGluZykgCisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworCisgICAgaWYgKGdkdGhfcG9sbGluZyAmJiBoYS0+Y21kX2NudCA+IDApIHsKKyAgICAgICAgaWYgKCFnZHRoX3dhaXQoaGFudW0sY21kX2luZGV4LFBPTExfVElNRU9VVCkpCisgICAgICAgICAgICBwcmludGsoIkdEVC1IQSAlZDogQ29tbWFuZCAlZCB0aW1lZCBvdXQgIVxuIiwKKyAgICAgICAgICAgICAgICAgICBoYW51bSxjbWRfaW5kZXgpOworICAgIH0KK30KKyAgIAorc3RhdGljIHZvaWQgZ2R0aF9jb3B5X2ludGVybmFsX2RhdGEoaW50IGhhbnVtLFNjc2lfQ21uZCAqc2NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmZmVyLHVzaG9ydCBjb3VudCkKK3sKKyAgICB1c2hvcnQgY3Bjb3VudCxpOworICAgIHVzaG9ydCBjcHN1bSxjcG5vdzsKKyAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNsOworICAgIGdkdGhfaGFfc3RyICpoYTsKKyAgICBjaGFyICphZGRyZXNzOworCisgICAgY3Bjb3VudCA9IGNvdW50PD0odXNob3J0KXNjcC0+YnVmZmxlbiA/IGNvdW50Oih1c2hvcnQpc2NwLT5idWZmbGVuOworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworCisgICAgaWYgKHNjcC0+dXNlX3NnKSB7CisgICAgICAgIHNsID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNjcC0+cmVxdWVzdF9idWZmZXI7CisgICAgICAgIGZvciAoaT0wLGNwc3VtPTA7IGk8c2NwLT51c2Vfc2c7ICsraSwrK3NsKSB7CisJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgICAgICBjcG5vdyA9ICh1c2hvcnQpc2wtPmxlbmd0aDsKKyAgICAgICAgICAgIFRSQUNFKCgiY29weV9pbnRlcm5hbCgpIG5vdyAlZCBzdW0gJWQgY291bnQgJWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNwbm93LGNwc3VtLGNwY291bnQsKHVzaG9ydClzY3AtPmJ1ZmZsZW4pKTsKKyAgICAgICAgICAgIGlmIChjcHN1bStjcG5vdyA+IGNwY291bnQpIAorICAgICAgICAgICAgICAgIGNwbm93ID0gY3Bjb3VudCAtIGNwc3VtOworICAgICAgICAgICAgY3BzdW0gKz0gY3Bub3c7CisgICAgICAgICAgICBpZiAoIXNsLT5wYWdlKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtSEEgJWQ6IGludmFsaWQgc2MvZ3QgZWxlbWVudCBpbiBnZHRoX2NvcHlfaW50ZXJuYWxfZGF0YSgpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBoYW51bSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCSAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJICAgIGFkZHJlc3MgPSBrbWFwX2F0b21pYyhzbC0+cGFnZSwgS01fQklPX1NSQ19JUlEpICsgc2wtPm9mZnNldDsKKyAgICAgICAgICAgIG1lbWNweShhZGRyZXNzLGJ1ZmZlcixjcG5vdyk7CisJICAgIGZsdXNoX2RjYWNoZV9wYWdlKHNsLT5wYWdlKTsKKwkgICAga3VubWFwX2F0b21pYyhhZGRyZXNzLCBLTV9CSU9fU1JDX0lSUSk7CisJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICAgICAgICAgIGlmIChjcHN1bSA9PSBjcGNvdW50KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgYnVmZmVyICs9IGNwbm93OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgVFJBQ0UoKCJjb3B5X2ludGVybmFsKCkgY291bnQgJWRcbiIsY3Bjb3VudCkpOworICAgICAgICBtZW1jcHkoKGNoYXIqKXNjcC0+cmVxdWVzdF9idWZmZXIsYnVmZmVyLGNwY291bnQpOworICAgIH0KK30KKworc3RhdGljIGludCBnZHRoX2ludGVybmFsX2NhY2hlX2NtZChpbnQgaGFudW0sU2NzaV9DbW5kICpzY3ApCit7CisgICAgcmVnaXN0ZXIgZ2R0aF9oYV9zdHIgKmhhOworICAgIHVuY2hhciB0OworICAgIGdkdGhfaW5xX2RhdGEgaW5xOworICAgIGdkdGhfcmRjYXBfZGF0YSByZGM7CisgICAgZ2R0aF9zZW5zZV9kYXRhIHNkOworICAgIGdkdGhfbW9kZXBfZGF0YSBtcGQ7CisKKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICB0ICA9IHNjcC0+ZGV2aWNlLT5pZDsKKyAgICBUUkFDRSgoImdkdGhfaW50ZXJuYWxfY2FjaGVfY21kKCkgY21kIDB4JXggaGRyaXZlICVkXG4iLAorICAgICAgICAgICBzY3AtPmNtbmRbMF0sdCkpOworCisgICAgc2NwLT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisgICAgc2NwLT5zZW5zZV9idWZmZXJbMF0gPSAwOworCisgICAgc3dpdGNoIChzY3AtPmNtbmRbMF0pIHsKKyAgICAgIGNhc2UgVEVTVF9VTklUX1JFQURZOgorICAgICAgY2FzZSBWRVJJRlk6CisgICAgICBjYXNlIFNUQVJUX1NUT1A6CisgICAgICAgIFRSQUNFMigoIlRlc3QvVmVyaWZ5L1N0YXJ0IGhkcml2ZSAlZFxuIix0KSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIElOUVVJUlk6CisgICAgICAgIFRSQUNFMigoIklucXVpcnkgaGRyaXZlICVkIGRldnR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgdCxoYS0+aGRyW3RdLmRldnR5cGUpKTsKKyAgICAgICAgaW5xLnR5cGVfcXVhbCA9IChoYS0+aGRyW3RdLmRldnR5cGUmNCkgPyBUWVBFX1JPTTpUWVBFX0RJU0s7CisgICAgICAgIC8qIHlvdSBjYW4gaGVyZSBzZXQgYWxsIGRpc2tzIHRvIHJlbW92YWJsZSwgaWYgeW91IHdhbnQgdG8gZG8KKyAgICAgICAgICAgYSBmbHVzaCB1c2luZyB0aGUgQUxMT1dfTUVESVVNX1JFTU9WQUwgY29tbWFuZCAqLworICAgICAgICBpbnEubW9kaWZfcm1iID0gMHgwMDsKKyAgICAgICAgaWYgKChoYS0+aGRyW3RdLmRldnR5cGUgJiAxKSB8fAorICAgICAgICAgICAgKGhhLT5oZHJbdF0uY2x1c3Rlcl90eXBlICYgQ0xVU1RFUl9EUklWRSkpCisgICAgICAgICAgICBpbnEubW9kaWZfcm1iID0gMHg4MDsKKyAgICAgICAgaW5xLnZlcnNpb24gICA9IDI7CisgICAgICAgIGlucS5yZXNwX2FlbmMgPSAyOworICAgICAgICBpbnEuYWRkX2xlbmd0aD0gMzI7CisgICAgICAgIHN0cmNweShpbnEudmVuZG9yLGhhLT5vZW1fbmFtZSk7CisgICAgICAgIHNwcmludGYoaW5xLnByb2R1Y3QsIkhvc3QgRHJpdmUgICMlMDJkIix0KTsKKyAgICAgICAgc3RyY3B5KGlucS5yZXZpc2lvbiwiICAgIik7CisgICAgICAgIGdkdGhfY29weV9pbnRlcm5hbF9kYXRhKGhhbnVtLHNjcCwoY2hhciopJmlucSxzaXplb2YoZ2R0aF9pbnFfZGF0YSkpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBSRVFVRVNUX1NFTlNFOgorICAgICAgICBUUkFDRTIoKCJSZXF1ZXN0IHNlbnNlIGhkcml2ZSAlZFxuIix0KSk7CisgICAgICAgIHNkLmVycm9yY29kZSA9IDB4NzA7CisgICAgICAgIHNkLnNlZ25vICAgICA9IDB4MDA7CisgICAgICAgIHNkLmtleSAgICAgICA9IE5PX1NFTlNFOworICAgICAgICBzZC5pbmZvICAgICAgPSAwOworICAgICAgICBzZC5hZGRfbGVuZ3RoPSAwOworICAgICAgICBnZHRoX2NvcHlfaW50ZXJuYWxfZGF0YShoYW51bSxzY3AsKGNoYXIqKSZzZCxzaXplb2YoZ2R0aF9zZW5zZV9kYXRhKSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE1PREVfU0VOU0U6CisgICAgICAgIFRSQUNFMigoIk1vZGUgc2Vuc2UgaGRyaXZlICVkXG4iLHQpKTsKKyAgICAgICAgbWVtc2V0KChjaGFyKikmbXBkLDAsc2l6ZW9mKGdkdGhfbW9kZXBfZGF0YSkpOworICAgICAgICBtcGQuaGQuZGF0YV9sZW5ndGggPSBzaXplb2YoZ2R0aF9tb2RlcF9kYXRhKTsKKyAgICAgICAgbXBkLmhkLmRldl9wYXIgICAgID0gKGhhLT5oZHJbdF0uZGV2dHlwZSYyKSA/IDB4ODA6MDsKKyAgICAgICAgbXBkLmhkLmJkX2xlbmd0aCAgID0gc2l6ZW9mKG1wZC5iZCk7CisgICAgICAgIG1wZC5iZC5ibG9ja19sZW5ndGhbMF0gPSAoU0VDVE9SX1NJWkUgJiAweDAwZmYwMDAwKSA+PiAxNjsKKyAgICAgICAgbXBkLmJkLmJsb2NrX2xlbmd0aFsxXSA9IChTRUNUT1JfU0laRSAmIDB4MDAwMGZmMDApID4+IDg7CisgICAgICAgIG1wZC5iZC5ibG9ja19sZW5ndGhbMl0gPSAoU0VDVE9SX1NJWkUgJiAweDAwMDAwMGZmKTsKKyAgICAgICAgZ2R0aF9jb3B5X2ludGVybmFsX2RhdGEoaGFudW0sc2NwLChjaGFyKikmbXBkLHNpemVvZihnZHRoX21vZGVwX2RhdGEpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUkVBRF9DQVBBQ0lUWToKKyAgICAgICAgVFJBQ0UyKCgiUmVhZCBjYXBhY2l0eSBoZHJpdmUgJWRcbiIsdCkpOworICAgICAgICBpZiAoaGEtPmhkclt0XS5zaXplID4gKHVsb25nNjQpMHhmZmZmZmZmZikKKyAgICAgICAgICAgIHJkYy5sYXN0X2Jsb2NrX25vID0gMHhmZmZmZmZmZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmRjLmxhc3RfYmxvY2tfbm8gPSBjcHVfdG9fYmUzMihoYS0+aGRyW3RdLnNpemUtMSk7CisgICAgICAgIHJkYy5ibG9ja19sZW5ndGggID0gY3B1X3RvX2JlMzIoU0VDVE9SX1NJWkUpOworICAgICAgICBnZHRoX2NvcHlfaW50ZXJuYWxfZGF0YShoYW51bSxzY3AsKGNoYXIqKSZyZGMsc2l6ZW9mKGdkdGhfcmRjYXBfZGF0YSkpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTRVJWSUNFX0FDVElPTl9JTjoKKyAgICAgICAgaWYgKChzY3AtPmNtbmRbMV0gJiAweDFmKSA9PSBTQUlfUkVBRF9DQVBBQ0lUWV8xNiAmJgorICAgICAgICAgICAgKGhhLT5jYWNoZV9mZWF0ICYgR0RUXzY0QklUKSkgeworICAgICAgICAgICAgZ2R0aF9yZGNhcDE2X2RhdGEgcmRjMTY7CisKKyAgICAgICAgICAgIFRSQUNFMigoIlJlYWQgY2FwYWNpdHkgKDE2KSBoZHJpdmUgJWRcbiIsdCkpOworICAgICAgICAgICAgcmRjMTYubGFzdF9ibG9ja19ubyA9IGNwdV90b19iZTY0KGhhLT5oZHJbdF0uc2l6ZS0xKTsKKyAgICAgICAgICAgIHJkYzE2LmJsb2NrX2xlbmd0aCAgPSBjcHVfdG9fYmUzMihTRUNUT1JfU0laRSk7CisgICAgICAgICAgICBnZHRoX2NvcHlfaW50ZXJuYWxfZGF0YShoYW51bSxzY3AsKGNoYXIqKSZyZGMxNixzaXplb2YoZ2R0aF9yZGNhcDE2X2RhdGEpKTsKKyAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICBzY3AtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgVFJBQ0UyKCgiSW50ZXJuYWwgY2FjaGUgY21kIDB4JXggdW5rbm93blxuIixzY3AtPmNtbmRbMF0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFzY3AtPlNDcC5oYXZlX2RhdGFfaW4pCisgICAgICAgIHNjcC0+U0NwLmhhdmVfZGF0YV9pbisrOworICAgIGVsc2UgCisgICAgICAgIHJldHVybiAxOworCisgICAgcmV0dXJuIDA7Cit9CisgICAgCitzdGF0aWMgaW50IGdkdGhfZmlsbF9jYWNoZV9jbWQoaW50IGhhbnVtLFNjc2lfQ21uZCAqc2NwLHVzaG9ydCBoZHJpdmUpCit7CisgICAgcmVnaXN0ZXIgZ2R0aF9oYV9zdHIgKmhhOworICAgIHJlZ2lzdGVyIGdkdGhfY21kX3N0ciAqY21kcDsKKyAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNsOworICAgIHVsb25nMzIgY250LCBibG9ja2NudDsKKyAgICB1bG9uZzY0IG5vLCBibG9ja25vOworICAgIGRtYV9hZGRyX3QgcGh5c19hZGRyOworICAgIGludCBpLCBjbWRfaW5kZXgsIHJlYWRfd3JpdGUsIHNnY250LCBtb2RlNjQ7CisgICAgc3RydWN0IHBhZ2UgKnBhZ2U7CisgICAgdWxvbmcgb2Zmc2V0OworCisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgY21kcCA9IGhhLT5wY2NiOworICAgIFRSQUNFKCgiZ2R0aF9maWxsX2NhY2hlX2NtZCgpIGNtZCAweCV4IGNtZHNpemUgJWQgaGRyaXZlICVkXG4iLAorICAgICAgICAgICAgICAgICBzY3AtPmNtbmRbMF0sc2NwLT5jbWRfbGVuLGhkcml2ZSkpOworCisgICAgaWYgKGhhLT50eXBlPT1HRFRfRUlTQSAmJiBoYS0+Y21kX2NudD4wKSAKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBtb2RlNjQgPSAoaGEtPmNhY2hlX2ZlYXQgJiBHRFRfNjRCSVQpID8gVFJVRSA6IEZBTFNFOworICAgIC8qIHRlc3QgZm9yIFJFQURfMTYsIFdSSVRFXzE2IGlmICFtb2RlNjQgPyAtLS0KKyAgICAgICBub3QgcmVxdWlyZWQsIHNob3VsZCBub3Qgb2NjdXIgZHVlIHRvIGVycm9yIHJldHVybiBvbiAKKyAgICAgICBSRUFEX0NBUEFDSVRZXzE2ICovCisKKyAgICBjbWRwLT5TZXJ2aWNlID0gQ0FDSEVTRVJWSUNFOworICAgIGNtZHAtPlJlcXVlc3RCdWZmZXIgPSBzY3A7CisgICAgLyogc2VhcmNoIGZyZWUgY29tbWFuZCBpbmRleCAqLworICAgIGlmICghKGNtZF9pbmRleD1nZHRoX2dldF9jbWRfaW5kZXgoaGFudW0pKSkgeworICAgICAgICBUUkFDRSgoIkdEVDogTm8gZnJlZSBjb21tYW5kIGluZGV4IGZvdW5kXG4iKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvKiBpZiBpdCdzIHRoZSBmaXJzdCBjb21tYW5kLCBzZXQgY29tbWFuZCBzZW1hcGhvcmUgKi8KKyAgICBpZiAoaGEtPmNtZF9jbnQgPT0gMCkKKyAgICAgICAgZ2R0aF9zZXRfc2VtYTAoaGFudW0pOworCisgICAgLyogZmlsbCBjb21tYW5kICovCisgICAgcmVhZF93cml0ZSA9IDA7CisgICAgaWYgKHNjcC0+U0NwLnNlbnRfY29tbWFuZCAhPSAtMSkgCisgICAgICAgIGNtZHAtPk9wQ29kZSA9IHNjcC0+U0NwLnNlbnRfY29tbWFuZDsgICAvKiBzcGVjaWFsIGNhY2hlIGNtZC4gKi8KKyAgICBlbHNlIGlmIChzY3AtPmNtbmRbMF0gPT0gUkVTRVJWRSkgCisgICAgICAgIGNtZHAtPk9wQ29kZSA9IEdEVF9SRVNFUlZFX0RSVjsKKyAgICBlbHNlIGlmIChzY3AtPmNtbmRbMF0gPT0gUkVMRUFTRSkKKyAgICAgICAgY21kcC0+T3BDb2RlID0gR0RUX1JFTEVBU0VfRFJWOworICAgIGVsc2UgaWYgKHNjcC0+Y21uZFswXSA9PSBBTExPV19NRURJVU1fUkVNT1ZBTCkgeworICAgICAgICBpZiAoc2NwLT5jbW5kWzRdICYgMSkgICAgICAgICAgICAgICAgICAgLyogcHJldmVudCA/ICovCisgICAgICAgICAgICBjbWRwLT5PcENvZGUgPSBHRFRfTU9VTlQ7CisgICAgICAgIGVsc2UgaWYgKHNjcC0+Y21uZFszXSAmIDEpICAgICAgICAgICAgICAvKiByZW1vdmFibGUgZHJpdmUgPyAqLworICAgICAgICAgICAgY21kcC0+T3BDb2RlID0gR0RUX1VOTU9VTlQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNtZHAtPk9wQ29kZSA9IEdEVF9GTFVTSDsKKyAgICB9IGVsc2UgaWYgKHNjcC0+Y21uZFswXSA9PSBXUklURV82IHx8IHNjcC0+Y21uZFswXSA9PSBXUklURV8xMCB8fAorICAgICAgICAgICAgICAgc2NwLT5jbW5kWzBdID09IFdSSVRFXzEyIHx8IHNjcC0+Y21uZFswXSA9PSBXUklURV8xNgorICAgICkgeworICAgICAgICByZWFkX3dyaXRlID0gMTsKKyAgICAgICAgaWYgKGdkdGhfd3JpdGVfdGhyb3VnaCB8fCAoKGhhLT5oZHJbaGRyaXZlXS5yd19hdHRyaWJzICYgMSkgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoYS0+Y2FjaGVfZmVhdCAmIEdEVF9XUl9USFJPVUdIKSkpCisgICAgICAgICAgICBjbWRwLT5PcENvZGUgPSBHRFRfV1JJVEVfVEhSOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjbWRwLT5PcENvZGUgPSBHRFRfV1JJVEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVhZF93cml0ZSA9IDI7CisgICAgICAgIGNtZHAtPk9wQ29kZSA9IEdEVF9SRUFEOworICAgIH0KKworICAgIGNtZHAtPkJvYXJkTm9kZSA9IExPQ0FMQk9BUkQ7CisgICAgaWYgKG1vZGU2NCkgeworICAgICAgICBjbWRwLT51LmNhY2hlNjQuRGV2aWNlTm8gPSBoZHJpdmU7CisgICAgICAgIGNtZHAtPnUuY2FjaGU2NC5CbG9ja05vICA9IDE7CisgICAgICAgIGNtZHAtPnUuY2FjaGU2NC5zZ19jYW56ICA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY21kcC0+dS5jYWNoZS5EZXZpY2VObyA9IGhkcml2ZTsKKyAgICAgICAgY21kcC0+dS5jYWNoZS5CbG9ja05vICA9IDE7CisgICAgICAgIGNtZHAtPnUuY2FjaGUuc2dfY2FueiAgPSAwOworICAgIH0KKworICAgIGlmIChyZWFkX3dyaXRlKSB7CisgICAgICAgIGlmIChzY3AtPmNtZF9sZW4gPT0gMTYpIHsKKyAgICAgICAgICAgIG1lbWNweSgmbm8sICZzY3AtPmNtbmRbMl0sIHNpemVvZih1bG9uZzY0KSk7CisgICAgICAgICAgICBibG9ja25vID0gYmU2NF90b19jcHUobm8pOworICAgICAgICAgICAgbWVtY3B5KCZjbnQsICZzY3AtPmNtbmRbMTBdLCBzaXplb2YodWxvbmczMikpOworICAgICAgICAgICAgYmxvY2tjbnQgPSBiZTMyX3RvX2NwdShjbnQpOworICAgICAgICB9IGVsc2UgaWYgKHNjcC0+Y21kX2xlbiA9PSAxMCkgeworICAgICAgICAgICAgbWVtY3B5KCZubywgJnNjcC0+Y21uZFsyXSwgc2l6ZW9mKHVsb25nMzIpKTsKKyAgICAgICAgICAgIGJsb2Nrbm8gPSBiZTMyX3RvX2NwdShubyk7CisgICAgICAgICAgICBtZW1jcHkoJmNudCwgJnNjcC0+Y21uZFs3XSwgc2l6ZW9mKHVzaG9ydCkpOworICAgICAgICAgICAgYmxvY2tjbnQgPSBiZTE2X3RvX2NwdShjbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KCZubywgJnNjcC0+Y21uZFswXSwgc2l6ZW9mKHVsb25nMzIpKTsKKyAgICAgICAgICAgIGJsb2Nrbm8gPSBiZTMyX3RvX2NwdShubykgJiAweDAwMWZmZmZmVUw7CisgICAgICAgICAgICBibG9ja2NudD0gc2NwLT5jbW5kWzRdPT0wID8gMHgxMDAgOiBzY3AtPmNtbmRbNF07CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1vZGU2NCkgeworICAgICAgICAgICAgY21kcC0+dS5jYWNoZTY0LkJsb2NrTm8gPSBibG9ja25vOworICAgICAgICAgICAgY21kcC0+dS5jYWNoZTY0LkJsb2NrQ250ID0gYmxvY2tjbnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbWRwLT51LmNhY2hlLkJsb2NrTm8gPSAodWxvbmczMilibG9ja25vOworICAgICAgICAgICAgY21kcC0+dS5jYWNoZS5CbG9ja0NudCA9IGJsb2NrY250OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNjcC0+dXNlX3NnKSB7CisgICAgICAgICAgICBzbCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3AtPnJlcXVlc3RfYnVmZmVyOworICAgICAgICAgICAgc2djbnQgPSBzY3AtPnVzZV9zZzsKKyAgICAgICAgICAgIHNjcC0+U0NwLlN0YXR1cyA9IEdEVEhfTUFQX1NHOworICAgICAgICAgICAgc2NwLT5TQ3AuTWVzc2FnZSA9IChyZWFkX3dyaXRlID09IDEgPyAKKyAgICAgICAgICAgICAgICBQQ0lfRE1BX1RPREVWSUNFIDogUENJX0RNQV9GUk9NREVWSUNFKTsgICAKKyAgICAgICAgICAgIHNnY250ID0gcGNpX21hcF9zZyhoYS0+cGRldixzbCxzY3AtPnVzZV9zZyxzY3AtPlNDcC5NZXNzYWdlKTsKKyAgICAgICAgICAgIGlmIChtb2RlNjQpIHsKKyAgICAgICAgICAgICAgICBjbWRwLT51LmNhY2hlNjQuRGVzdEFkZHI9ICh1bG9uZzY0KS0xOworICAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGU2NC5zZ19jYW56ID0gc2djbnQ7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8c2djbnQ7ICsraSwrK3NsKSB7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGU2NC5zZ19sc3RbaV0uc2dfcHRyID0gc2dfZG1hX2FkZHJlc3Moc2wpOworI2lmZGVmIEdEVEhfRE1BX1NUQVRJU1RJQ1MKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNtZHAtPnUuY2FjaGU2NC5zZ19sc3RbaV0uc2dfcHRyID4gKHVsb25nNjQpMHhmZmZmZmZmZikKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5kbWE2NF9jbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgaGEtPmRtYTMyX2NudCsrOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGU2NC5zZ19sc3RbaV0uc2dfbGVuID0gc2dfZG1hX2xlbihzbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbWRwLT51LmNhY2hlLkRlc3RBZGRyPSAweGZmZmZmZmZmOworICAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGUuc2dfY2FueiA9IHNnY250OworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPHNnY250OyArK2ksKytzbCkgeworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LmNhY2hlLnNnX2xzdFtpXS5zZ19wdHIgPSBzZ19kbWFfYWRkcmVzcyhzbCk7CisjaWZkZWYgR0RUSF9ETUFfU1RBVElTVElDUworICAgICAgICAgICAgICAgICAgICBoYS0+ZG1hMzJfY250Kys7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZS5zZ19sc3RbaV0uc2dfbGVuID0gc2dfZG1hX2xlbihzbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisjaWZkZWYgR0RUSF9TVEFUSVNUSUNTCisgICAgICAgICAgICBpZiAobWF4X3NnIDwgKHVsb25nMzIpc2djbnQpIHsKKyAgICAgICAgICAgICAgICBtYXhfc2cgPSAodWxvbmczMilzZ2NudDsKKyAgICAgICAgICAgICAgICBUUkFDRTMoKCJHRFQ6IG1heF9zZyA9ICVkXG4iLG1heF9zZykpOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNjcC0+U0NwLlN0YXR1cyA9IEdEVEhfTUFQX1NJTkdMRTsKKyAgICAgICAgICAgIHNjcC0+U0NwLk1lc3NhZ2UgPSAocmVhZF93cml0ZSA9PSAxID8gCisgICAgICAgICAgICAgICAgUENJX0RNQV9UT0RFVklDRSA6IFBDSV9ETUFfRlJPTURFVklDRSk7CisgICAgICAgICAgICBwYWdlID0gdmlydF90b19wYWdlKHNjcC0+cmVxdWVzdF9idWZmZXIpOworICAgICAgICAgICAgb2Zmc2V0ID0gKHVsb25nKXNjcC0+cmVxdWVzdF9idWZmZXIgJiB+UEFHRV9NQVNLOworICAgICAgICAgICAgcGh5c19hZGRyID0gcGNpX21hcF9wYWdlKGhhLT5wZGV2LHBhZ2Usb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcC0+cmVxdWVzdF9idWZmbGVuLHNjcC0+U0NwLk1lc3NhZ2UpOworICAgICAgICAgICAgc2NwLT5TQ3AuZG1hX2hhbmRsZSA9IHBoeXNfYWRkcjsKKyAgICAgICAgICAgIGlmIChtb2RlNjQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaGEtPmNhY2hlX2ZlYXQgJiBTQ0FUVEVSX0dBVEhFUikgeworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LmNhY2hlNjQuRGVzdEFkZHIgPSAodWxvbmc2NCktMTsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZTY0LnNnX2NhbnogPSAxOworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LmNhY2hlNjQuc2dfbHN0WzBdLnNnX3B0ciA9IHBoeXNfYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZTY0LnNnX2xzdFswXS5zZ19sZW4gPSBzY3AtPnJlcXVlc3RfYnVmZmxlbjsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZTY0LnNnX2xzdFsxXS5zZ19sZW4gPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGU2NC5EZXN0QWRkciAgPSBwaHlzX2FkZHI7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGU2NC5zZ19jYW56PSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGhhLT5jYWNoZV9mZWF0ICYgU0NBVFRFUl9HQVRIRVIpIHsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZS5EZXN0QWRkciA9IDB4ZmZmZmZmZmY7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGUuc2dfY2FueiA9IDE7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGUuc2dfbHN0WzBdLnNnX3B0ciA9IHBoeXNfYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZS5zZ19sc3RbMF0uc2dfbGVuID0gc2NwLT5yZXF1ZXN0X2J1ZmZsZW47CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGUuc2dfbHN0WzFdLnNnX2xlbiA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZS5EZXN0QWRkciAgPSBwaHlzX2FkZHI7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGUuc2dfY2Fuej0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogZXZhbHVhdGUgY29tbWFuZCBzaXplLCBjaGVjayBzcGFjZSAqLworICAgIGlmIChtb2RlNjQpIHsKKyAgICAgICAgVFJBQ0UoKCJjYWNoZSBjbWQ6IGFkZHIuICV4IHNnYW56ICV4IHNncHRyMCAleCBzZ2xlbjAgJXhcbiIsCisgICAgICAgICAgICAgICBjbWRwLT51LmNhY2hlNjQuRGVzdEFkZHIsY21kcC0+dS5jYWNoZTY0LnNnX2NhbnosCisgICAgICAgICAgICAgICBjbWRwLT51LmNhY2hlNjQuc2dfbHN0WzBdLnNnX3B0ciwKKyAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGU2NC5zZ19sc3RbMF0uc2dfbGVuKSk7CisgICAgICAgIFRSQUNFKCgiY2FjaGUgY21kOiBjbWQgJWQgYmxvY2tuby4gJWQsIGJsb2NrY250ICVkXG4iLAorICAgICAgICAgICAgICAgY21kcC0+T3BDb2RlLGNtZHAtPnUuY2FjaGU2NC5CbG9ja05vLGNtZHAtPnUuY2FjaGU2NC5CbG9ja0NudCkpOworICAgICAgICBoYS0+Y21kX2xlbiA9IEdEVE9GRlNPRihnZHRoX2NtZF9zdHIsdS5jYWNoZTY0LnNnX2xzdCkgKworICAgICAgICAgICAgKHVzaG9ydCljbWRwLT51LmNhY2hlNjQuc2dfY2FueiAqIHNpemVvZihnZHRoX3NnNjRfc3RyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUUkFDRSgoImNhY2hlIGNtZDogYWRkci4gJXggc2dhbnogJXggc2dwdHIwICV4IHNnbGVuMCAleFxuIiwKKyAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGUuRGVzdEFkZHIsY21kcC0+dS5jYWNoZS5zZ19jYW56LAorICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZS5zZ19sc3RbMF0uc2dfcHRyLAorICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZS5zZ19sc3RbMF0uc2dfbGVuKSk7CisgICAgICAgIFRSQUNFKCgiY2FjaGUgY21kOiBjbWQgJWQgYmxvY2tuby4gJWQsIGJsb2NrY250ICVkXG4iLAorICAgICAgICAgICAgICAgY21kcC0+T3BDb2RlLGNtZHAtPnUuY2FjaGUuQmxvY2tObyxjbWRwLT51LmNhY2hlLkJsb2NrQ250KSk7CisgICAgICAgIGhhLT5jbWRfbGVuID0gR0RUT0ZGU09GKGdkdGhfY21kX3N0cix1LmNhY2hlLnNnX2xzdCkgKworICAgICAgICAgICAgKHVzaG9ydCljbWRwLT51LmNhY2hlLnNnX2NhbnogKiBzaXplb2YoZ2R0aF9zZ19zdHIpOworICAgIH0KKyAgICBpZiAoaGEtPmNtZF9sZW4gJiAzKQorICAgICAgICBoYS0+Y21kX2xlbiArPSAoNCAtIChoYS0+Y21kX2xlbiAmIDMpKTsKKworICAgIGlmIChoYS0+Y21kX2NudCA+IDApIHsKKyAgICAgICAgaWYgKChoYS0+Y21kX29mZnNfZHBtZW0gKyBoYS0+Y21kX2xlbiArIERQTUVNX0NPTU1BTkRfT0ZGU0VUKSA+CisgICAgICAgICAgICBoYS0+aWNfYWxsX3NpemUpIHsKKyAgICAgICAgICAgIFRSQUNFMigoImdkdGhfZmlsbF9jYWNoZSgpIERQTUVNIG92ZXJmbG93XG4iKSk7CisgICAgICAgICAgICBoYS0+Y21kX3RhYltjbWRfaW5kZXgtMl0uY21uZCA9IFVOVVNFRF9DTU5EOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjb3B5IGNvbW1hbmQgKi8KKyAgICBnZHRoX2NvcHlfY29tbWFuZChoYW51bSk7CisgICAgcmV0dXJuIGNtZF9pbmRleDsKK30KKworc3RhdGljIGludCBnZHRoX2ZpbGxfcmF3X2NtZChpbnQgaGFudW0sU2NzaV9DbW5kICpzY3AsdW5jaGFyIGIpCit7CisgICAgcmVnaXN0ZXIgZ2R0aF9oYV9zdHIgKmhhOworICAgIHJlZ2lzdGVyIGdkdGhfY21kX3N0ciAqY21kcDsKKyAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNsOworICAgIHVzaG9ydCBpOworICAgIGRtYV9hZGRyX3QgcGh5c19hZGRyLCBzZW5zZV9wYWRkcjsKKyAgICBpbnQgY21kX2luZGV4LCBzZ2NudCwgbW9kZTY0OworICAgIHVuY2hhciB0LGw7CisgICAgc3RydWN0IHBhZ2UgKnBhZ2U7CisgICAgdWxvbmcgb2Zmc2V0OworCisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgdCA9IHNjcC0+ZGV2aWNlLT5pZDsKKyAgICBsID0gc2NwLT5kZXZpY2UtPmx1bjsKKyAgICBjbWRwID0gaGEtPnBjY2I7CisgICAgVFJBQ0UoKCJnZHRoX2ZpbGxfcmF3X2NtZCgpIGNtZCAweCV4IGJ1cyAlZCBJRCAlZCBMVU4gJWRcbiIsCisgICAgICAgICAgIHNjcC0+Y21uZFswXSxiLHQsbCkpOworCisgICAgaWYgKGhhLT50eXBlPT1HRFRfRUlTQSAmJiBoYS0+Y21kX2NudD4wKSAKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBtb2RlNjQgPSAoaGEtPnJhd19mZWF0ICYgR0RUXzY0QklUKSA/IFRSVUUgOiBGQUxTRTsKKworICAgIGNtZHAtPlNlcnZpY2UgPSBTQ1NJUkFXU0VSVklDRTsKKyAgICBjbWRwLT5SZXF1ZXN0QnVmZmVyID0gc2NwOworICAgIC8qIHNlYXJjaCBmcmVlIGNvbW1hbmQgaW5kZXggKi8KKyAgICBpZiAoIShjbWRfaW5kZXg9Z2R0aF9nZXRfY21kX2luZGV4KGhhbnVtKSkpIHsKKyAgICAgICAgVFJBQ0UoKCJHRFQ6IE5vIGZyZWUgY29tbWFuZCBpbmRleCBmb3VuZFxuIikpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogaWYgaXQncyB0aGUgZmlyc3QgY29tbWFuZCwgc2V0IGNvbW1hbmQgc2VtYXBob3JlICovCisgICAgaWYgKGhhLT5jbWRfY250ID09IDApCisgICAgICAgIGdkdGhfc2V0X3NlbWEwKGhhbnVtKTsKKworICAgIC8qIGZpbGwgY29tbWFuZCAqLyAgCisgICAgaWYgKHNjcC0+U0NwLnNlbnRfY29tbWFuZCAhPSAtMSkgeworICAgICAgICBjbWRwLT5PcENvZGUgICAgICAgICAgID0gc2NwLT5TQ3Auc2VudF9jb21tYW5kOyAvKiBzcGVjaWFsIHJhdyBjbWQuICovCisgICAgICAgIGNtZHAtPkJvYXJkTm9kZSAgICAgICAgPSBMT0NBTEJPQVJEOworICAgICAgICBpZiAobW9kZTY0KSB7CisgICAgICAgICAgICBjbWRwLT51LnJhdzY0LmRpcmVjdGlvbiA9IChzY3AtPlNDcC5waGFzZSA+PiA4KTsKKyAgICAgICAgICAgIFRSQUNFMigoInNwZWNpYWwgcmF3IGNtZCAweCV4IHBhcmFtIDB4JXhcbiIsIAorICAgICAgICAgICAgICAgICAgICBjbWRwLT5PcENvZGUsIGNtZHAtPnUucmF3NjQuZGlyZWN0aW9uKSk7CisgICAgICAgICAgICAvKiBldmFsdWF0ZSBjb21tYW5kIHNpemUgKi8KKyAgICAgICAgICAgIGhhLT5jbWRfbGVuID0gR0RUT0ZGU09GKGdkdGhfY21kX3N0cix1LnJhdzY0LnNnX2xzdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbWRwLT51LnJhdy5kaXJlY3Rpb24gID0gKHNjcC0+U0NwLnBoYXNlID4+IDgpOworICAgICAgICAgICAgVFJBQ0UyKCgic3BlY2lhbCByYXcgY21kIDB4JXggcGFyYW0gMHgleFxuIiwgCisgICAgICAgICAgICAgICAgICAgIGNtZHAtPk9wQ29kZSwgY21kcC0+dS5yYXcuZGlyZWN0aW9uKSk7CisgICAgICAgICAgICAvKiBldmFsdWF0ZSBjb21tYW5kIHNpemUgKi8KKyAgICAgICAgICAgIGhhLT5jbWRfbGVuID0gR0RUT0ZGU09GKGdkdGhfY21kX3N0cix1LnJhdy5zZ19sc3QpOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICBwYWdlID0gdmlydF90b19wYWdlKHNjcC0+c2Vuc2VfYnVmZmVyKTsKKyAgICAgICAgb2Zmc2V0ID0gKHVsb25nKXNjcC0+c2Vuc2VfYnVmZmVyICYgflBBR0VfTUFTSzsKKyAgICAgICAgc2Vuc2VfcGFkZHIgPSBwY2lfbWFwX3BhZ2UoaGEtPnBkZXYscGFnZSxvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LFBDSV9ETUFfRlJPTURFVklDRSk7CisgICAgICAgIHNjcC0+U0NwLmJ1ZmZlciA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikoKHVsb25nMzIpc2Vuc2VfcGFkZHIpOworICAgICAgICAvKiBoaWdoIHBhcnQsIGlmIDY0Yml0ICovCisgICAgICAgIHNjcC0+aG9zdF9zY3JpYmJsZSA9IChjaGFyICopKHVsb25nMzIpKCh1bG9uZzY0KXNlbnNlX3BhZGRyID4+IDMyKTsKKyAgICAgICAgY21kcC0+T3BDb2RlICAgICAgICAgICA9IEdEVF9XUklURTsgICAgICAgICAgICAgLyogYWx3YXlzICovCisgICAgICAgIGNtZHAtPkJvYXJkTm9kZSAgICAgICAgPSBMT0NBTEJPQVJEOworICAgICAgICBpZiAobW9kZTY0KSB7IAorICAgICAgICAgICAgY21kcC0+dS5yYXc2NC5yZXNlcnZlZCAgID0gMDsKKyAgICAgICAgICAgIGNtZHAtPnUucmF3NjQubWRpc2NfdGltZSA9IDA7CisgICAgICAgICAgICBjbWRwLT51LnJhdzY0Lm1jb25fdGltZSAgPSAwOworICAgICAgICAgICAgY21kcC0+dS5yYXc2NC5jbGVuICAgICAgID0gc2NwLT5jbWRfbGVuOworICAgICAgICAgICAgY21kcC0+dS5yYXc2NC50YXJnZXQgICAgID0gdDsKKyAgICAgICAgICAgIGNtZHAtPnUucmF3NjQubHVuICAgICAgICA9IGw7CisgICAgICAgICAgICBjbWRwLT51LnJhdzY0LmJ1cyAgICAgICAgPSBiOworICAgICAgICAgICAgY21kcC0+dS5yYXc2NC5wcmlvcml0eSAgID0gMDsKKyAgICAgICAgICAgIGNtZHAtPnUucmF3NjQuc2RsZW4gICAgICA9IHNjcC0+cmVxdWVzdF9idWZmbGVuOworICAgICAgICAgICAgY21kcC0+dS5yYXc2NC5zZW5zZV9sZW4gID0gMTY7CisgICAgICAgICAgICBjbWRwLT51LnJhdzY0LnNlbnNlX2RhdGEgPSBzZW5zZV9wYWRkcjsKKyAgICAgICAgICAgIGNtZHAtPnUucmF3NjQuZGlyZWN0aW9uICA9IAorICAgICAgICAgICAgICAgIGdkdGhfZGlyZWN0aW9uX3RhYltzY3AtPmNtbmRbMF1dPT1ET1UgPyBHRFRIX0RBVEFfT1VUOkdEVEhfREFUQV9JTjsKKyAgICAgICAgICAgIG1lbWNweShjbWRwLT51LnJhdzY0LmNtZCxzY3AtPmNtbmQsMTYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY21kcC0+dS5yYXcucmVzZXJ2ZWQgICA9IDA7CisgICAgICAgICAgICBjbWRwLT51LnJhdy5tZGlzY190aW1lID0gMDsKKyAgICAgICAgICAgIGNtZHAtPnUucmF3Lm1jb25fdGltZSAgPSAwOworICAgICAgICAgICAgY21kcC0+dS5yYXcuY2xlbiAgICAgICA9IHNjcC0+Y21kX2xlbjsKKyAgICAgICAgICAgIGNtZHAtPnUucmF3LnRhcmdldCAgICAgPSB0OworICAgICAgICAgICAgY21kcC0+dS5yYXcubHVuICAgICAgICA9IGw7CisgICAgICAgICAgICBjbWRwLT51LnJhdy5idXMgICAgICAgID0gYjsKKyAgICAgICAgICAgIGNtZHAtPnUucmF3LnByaW9yaXR5ICAgPSAwOworICAgICAgICAgICAgY21kcC0+dS5yYXcubGlua19wICAgICA9IDA7CisgICAgICAgICAgICBjbWRwLT51LnJhdy5zZGxlbiAgICAgID0gc2NwLT5yZXF1ZXN0X2J1ZmZsZW47CisgICAgICAgICAgICBjbWRwLT51LnJhdy5zZW5zZV9sZW4gID0gMTY7CisgICAgICAgICAgICBjbWRwLT51LnJhdy5zZW5zZV9kYXRhID0gc2Vuc2VfcGFkZHI7CisgICAgICAgICAgICBjbWRwLT51LnJhdy5kaXJlY3Rpb24gID0gCisgICAgICAgICAgICAgICAgZ2R0aF9kaXJlY3Rpb25fdGFiW3NjcC0+Y21uZFswXV09PURPVSA/IEdEVEhfREFUQV9PVVQ6R0RUSF9EQVRBX0lOOworICAgICAgICAgICAgbWVtY3B5KGNtZHAtPnUucmF3LmNtZCxzY3AtPmNtbmQsMTIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNjcC0+dXNlX3NnKSB7CisgICAgICAgICAgICBzbCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3AtPnJlcXVlc3RfYnVmZmVyOworICAgICAgICAgICAgc2djbnQgPSBzY3AtPnVzZV9zZzsKKyAgICAgICAgICAgIHNjcC0+U0NwLlN0YXR1cyA9IEdEVEhfTUFQX1NHOworICAgICAgICAgICAgc2NwLT5TQ3AuTWVzc2FnZSA9IFBDSV9ETUFfQklESVJFQ1RJT05BTDsgCisgICAgICAgICAgICBzZ2NudCA9IHBjaV9tYXBfc2coaGEtPnBkZXYsc2wsc2NwLT51c2Vfc2csc2NwLT5TQ3AuTWVzc2FnZSk7CisgICAgICAgICAgICBpZiAobW9kZTY0KSB7CisgICAgICAgICAgICAgICAgY21kcC0+dS5yYXc2NC5zZGF0YSA9ICh1bG9uZzY0KS0xOworICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3NjQuc2dfcmFueiA9IHNnY250OworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPHNnY250OyArK2ksKytzbCkgeworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LnJhdzY0LnNnX2xzdFtpXS5zZ19wdHIgPSBzZ19kbWFfYWRkcmVzcyhzbCk7CisjaWZkZWYgR0RUSF9ETUFfU1RBVElTVElDUworICAgICAgICAgICAgICAgICAgICBpZiAoY21kcC0+dS5yYXc2NC5zZ19sc3RbaV0uc2dfcHRyID4gKHVsb25nNjQpMHhmZmZmZmZmZikKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5kbWE2NF9jbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgaGEtPmRtYTMyX2NudCsrOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3NjQuc2dfbHN0W2ldLnNnX2xlbiA9IHNnX2RtYV9sZW4oc2wpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY21kcC0+dS5yYXcuc2RhdGEgPSAweGZmZmZmZmZmOworICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3LnNnX3JhbnogPSBzZ2NudDsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxzZ2NudDsgKytpLCsrc2wpIHsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5yYXcuc2dfbHN0W2ldLnNnX3B0ciA9IHNnX2RtYV9hZGRyZXNzKHNsKTsKKyNpZmRlZiBHRFRIX0RNQV9TVEFUSVNUSUNTCisgICAgICAgICAgICAgICAgICAgIGhhLT5kbWEzMl9jbnQrKzsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBjbWRwLT51LnJhdy5zZ19sc3RbaV0uc2dfbGVuID0gc2dfZG1hX2xlbihzbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisjaWZkZWYgR0RUSF9TVEFUSVNUSUNTCisgICAgICAgICAgICBpZiAobWF4X3NnIDwgc2djbnQpIHsKKyAgICAgICAgICAgICAgICBtYXhfc2cgPSBzZ2NudDsKKyAgICAgICAgICAgICAgICBUUkFDRTMoKCJHRFQ6IG1heF9zZyA9ICVkXG4iLHNnY250KSk7CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2NwLT5TQ3AuU3RhdHVzID0gR0RUSF9NQVBfU0lOR0xFOworICAgICAgICAgICAgc2NwLT5TQ3AuTWVzc2FnZSA9IFBDSV9ETUFfQklESVJFQ1RJT05BTDsgCisgICAgICAgICAgICBwYWdlID0gdmlydF90b19wYWdlKHNjcC0+cmVxdWVzdF9idWZmZXIpOworICAgICAgICAgICAgb2Zmc2V0ID0gKHVsb25nKXNjcC0+cmVxdWVzdF9idWZmZXIgJiB+UEFHRV9NQVNLOworICAgICAgICAgICAgcGh5c19hZGRyID0gcGNpX21hcF9wYWdlKGhhLT5wZGV2LHBhZ2Usb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcC0+cmVxdWVzdF9idWZmbGVuLHNjcC0+U0NwLk1lc3NhZ2UpOworICAgICAgICAgICAgc2NwLT5TQ3AuZG1hX2hhbmRsZSA9IHBoeXNfYWRkcjsKKworICAgICAgICAgICAgaWYgKG1vZGU2NCkgeworICAgICAgICAgICAgICAgIGlmIChoYS0+cmF3X2ZlYXQgJiBTQ0FUVEVSX0dBVEhFUikgeworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LnJhdzY0LnNkYXRhICA9ICh1bG9uZzY0KS0xOworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LnJhdzY0LnNnX3Jhbno9IDE7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3NjQuc2dfbHN0WzBdLnNnX3B0ciA9IHBoeXNfYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5yYXc2NC5zZ19sc3RbMF0uc2dfbGVuID0gc2NwLT5yZXF1ZXN0X2J1ZmZsZW47CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3NjQuc2dfbHN0WzFdLnNnX2xlbiA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5yYXc2NC5zZGF0YSAgPSBwaHlzX2FkZHI7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3NjQuc2dfcmFuej0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChoYS0+cmF3X2ZlYXQgJiBTQ0FUVEVSX0dBVEhFUikgeworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LnJhdy5zZGF0YSAgPSAweGZmZmZmZmZmOworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LnJhdy5zZ19yYW56PSAxOworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LnJhdy5zZ19sc3RbMF0uc2dfcHRyID0gcGh5c19hZGRyOworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LnJhdy5zZ19sc3RbMF0uc2dfbGVuID0gc2NwLT5yZXF1ZXN0X2J1ZmZsZW47CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3LnNnX2xzdFsxXS5zZ19sZW4gPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3LnNkYXRhICA9IHBoeXNfYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5yYXcuc2dfcmFuej0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1vZGU2NCkgeworICAgICAgICAgICAgVFJBQ0UoKCJyYXcgY21kOiBhZGRyLiAleCBzZ2FueiAleCBzZ3B0cjAgJXggc2dsZW4wICV4XG4iLAorICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3NjQuc2RhdGEsY21kcC0+dS5yYXc2NC5zZ19yYW56LAorICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3NjQuc2dfbHN0WzBdLnNnX3B0ciwKKyAgICAgICAgICAgICAgICAgICBjbWRwLT51LnJhdzY0LnNnX2xzdFswXS5zZ19sZW4pKTsKKyAgICAgICAgICAgIC8qIGV2YWx1YXRlIGNvbW1hbmQgc2l6ZSAqLworICAgICAgICAgICAgaGEtPmNtZF9sZW4gPSBHRFRPRkZTT0YoZ2R0aF9jbWRfc3RyLHUucmF3NjQuc2dfbHN0KSArCisgICAgICAgICAgICAgICAgKHVzaG9ydCljbWRwLT51LnJhdzY0LnNnX3JhbnogKiBzaXplb2YoZ2R0aF9zZzY0X3N0cik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUkFDRSgoInJhdyBjbWQ6IGFkZHIuICV4IHNnYW56ICV4IHNncHRyMCAleCBzZ2xlbjAgJXhcbiIsCisgICAgICAgICAgICAgICAgICAgY21kcC0+dS5yYXcuc2RhdGEsY21kcC0+dS5yYXcuc2dfcmFueiwKKyAgICAgICAgICAgICAgICAgICBjbWRwLT51LnJhdy5zZ19sc3RbMF0uc2dfcHRyLAorICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3LnNnX2xzdFswXS5zZ19sZW4pKTsKKyAgICAgICAgICAgIC8qIGV2YWx1YXRlIGNvbW1hbmQgc2l6ZSAqLworICAgICAgICAgICAgaGEtPmNtZF9sZW4gPSBHRFRPRkZTT0YoZ2R0aF9jbWRfc3RyLHUucmF3LnNnX2xzdCkgKworICAgICAgICAgICAgICAgICh1c2hvcnQpY21kcC0+dS5yYXcuc2dfcmFueiAqIHNpemVvZihnZHRoX3NnX3N0cik7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogY2hlY2sgc3BhY2UgKi8KKyAgICBpZiAoaGEtPmNtZF9sZW4gJiAzKQorICAgICAgICBoYS0+Y21kX2xlbiArPSAoNCAtIChoYS0+Y21kX2xlbiAmIDMpKTsKKworICAgIGlmIChoYS0+Y21kX2NudCA+IDApIHsKKyAgICAgICAgaWYgKChoYS0+Y21kX29mZnNfZHBtZW0gKyBoYS0+Y21kX2xlbiArIERQTUVNX0NPTU1BTkRfT0ZGU0VUKSA+CisgICAgICAgICAgICBoYS0+aWNfYWxsX3NpemUpIHsKKyAgICAgICAgICAgIFRSQUNFMigoImdkdGhfZmlsbF9yYXcoKSBEUE1FTSBvdmVyZmxvd1xuIikpOworICAgICAgICAgICAgaGEtPmNtZF90YWJbY21kX2luZGV4LTJdLmNtbmQgPSBVTlVTRURfQ01ORDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY29weSBjb21tYW5kICovCisgICAgZ2R0aF9jb3B5X2NvbW1hbmQoaGFudW0pOworICAgIHJldHVybiBjbWRfaW5kZXg7Cit9CisKK3N0YXRpYyBpbnQgZ2R0aF9zcGVjaWFsX2NtZChpbnQgaGFudW0sU2NzaV9DbW5kICpzY3ApCit7CisgICAgcmVnaXN0ZXIgZ2R0aF9oYV9zdHIgKmhhOworICAgIHJlZ2lzdGVyIGdkdGhfY21kX3N0ciAqY21kcDsKKyAgICBpbnQgY21kX2luZGV4OworCisgICAgaGEgID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIGNtZHA9IGhhLT5wY2NiOworICAgIFRSQUNFMigoImdkdGhfc3BlY2lhbF9jbWQoKTogIikpOworCisgICAgaWYgKGhhLT50eXBlPT1HRFRfRUlTQSAmJiBoYS0+Y21kX2NudD4wKSAKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBtZW1jcHkoIGNtZHAsIHNjcC0+cmVxdWVzdF9idWZmZXIsIHNpemVvZihnZHRoX2NtZF9zdHIpKTsKKyAgICBjbWRwLT5SZXF1ZXN0QnVmZmVyID0gc2NwOworCisgICAgLyogc2VhcmNoIGZyZWUgY29tbWFuZCBpbmRleCAqLworICAgIGlmICghKGNtZF9pbmRleD1nZHRoX2dldF9jbWRfaW5kZXgoaGFudW0pKSkgeworICAgICAgICBUUkFDRSgoIkdEVDogTm8gZnJlZSBjb21tYW5kIGluZGV4IGZvdW5kXG4iKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIGlmIGl0J3MgdGhlIGZpcnN0IGNvbW1hbmQsIHNldCBjb21tYW5kIHNlbWFwaG9yZSAqLworICAgIGlmIChoYS0+Y21kX2NudCA9PSAwKQorICAgICAgIGdkdGhfc2V0X3NlbWEwKGhhbnVtKTsKKworICAgIC8qIGV2YWx1YXRlIGNvbW1hbmQgc2l6ZSwgY2hlY2sgc3BhY2UgKi8KKyAgICBpZiAoY21kcC0+T3BDb2RlID09IEdEVF9JT0NUTCkgeworICAgICAgICBUUkFDRTIoKCJJT0NUTFxuIikpOworICAgICAgICBoYS0+Y21kX2xlbiA9IAorICAgICAgICAgICAgR0RUT0ZGU09GKGdkdGhfY21kX3N0cix1LmlvY3RsLnBfcGFyYW0pICsgc2l6ZW9mKHVsb25nNjQpOworICAgIH0gZWxzZSBpZiAoY21kcC0+U2VydmljZSA9PSBDQUNIRVNFUlZJQ0UpIHsKKyAgICAgICAgVFJBQ0UyKCgiY2FjaGUgY29tbWFuZCAlZFxuIixjbWRwLT5PcENvZGUpKTsKKyAgICAgICAgaWYgKGhhLT5jYWNoZV9mZWF0ICYgR0RUXzY0QklUKQorICAgICAgICAgICAgaGEtPmNtZF9sZW4gPSAKKyAgICAgICAgICAgICAgICBHRFRPRkZTT0YoZ2R0aF9jbWRfc3RyLHUuY2FjaGU2NC5zZ19sc3QpICsgc2l6ZW9mKGdkdGhfc2c2NF9zdHIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBoYS0+Y21kX2xlbiA9IAorICAgICAgICAgICAgICAgIEdEVE9GRlNPRihnZHRoX2NtZF9zdHIsdS5jYWNoZS5zZ19sc3QpICsgc2l6ZW9mKGdkdGhfc2dfc3RyKTsKKyAgICB9IGVsc2UgaWYgKGNtZHAtPlNlcnZpY2UgPT0gU0NTSVJBV1NFUlZJQ0UpIHsKKyAgICAgICAgVFJBQ0UyKCgicmF3IGNvbW1hbmQgJWRcbiIsY21kcC0+T3BDb2RlKSk7CisgICAgICAgIGlmIChoYS0+cmF3X2ZlYXQgJiBHRFRfNjRCSVQpCisgICAgICAgICAgICBoYS0+Y21kX2xlbiA9IAorICAgICAgICAgICAgICAgIEdEVE9GRlNPRihnZHRoX2NtZF9zdHIsdS5yYXc2NC5zZ19sc3QpICsgc2l6ZW9mKGdkdGhfc2c2NF9zdHIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBoYS0+Y21kX2xlbiA9IAorICAgICAgICAgICAgICAgIEdEVE9GRlNPRihnZHRoX2NtZF9zdHIsdS5yYXcuc2dfbHN0KSArIHNpemVvZihnZHRoX3NnX3N0cik7CisgICAgfQorCisgICAgaWYgKGhhLT5jbWRfbGVuICYgMykKKyAgICAgICAgaGEtPmNtZF9sZW4gKz0gKDQgLSAoaGEtPmNtZF9sZW4gJiAzKSk7CisKKyAgICBpZiAoaGEtPmNtZF9jbnQgPiAwKSB7CisgICAgICAgIGlmICgoaGEtPmNtZF9vZmZzX2RwbWVtICsgaGEtPmNtZF9sZW4gKyBEUE1FTV9DT01NQU5EX09GRlNFVCkgPgorICAgICAgICAgICAgaGEtPmljX2FsbF9zaXplKSB7CisgICAgICAgICAgICBUUkFDRTIoKCJnZHRoX3NwZWNpYWxfY21kKCkgRFBNRU0gb3ZlcmZsb3dcbiIpKTsKKyAgICAgICAgICAgIGhhLT5jbWRfdGFiW2NtZF9pbmRleC0yXS5jbW5kID0gVU5VU0VEX0NNTkQ7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNvcHkgY29tbWFuZCAqLworICAgIGdkdGhfY29weV9jb21tYW5kKGhhbnVtKTsKKyAgICByZXR1cm4gY21kX2luZGV4OworfSAgICAKKworCisvKiBDb250cm9sbGVyIGV2ZW50IGhhbmRsaW5nIGZ1bmN0aW9ucyAqLworc3RhdGljIGdkdGhfZXZ0X3N0ciAqZ2R0aF9zdG9yZV9ldmVudChnZHRoX2hhX3N0ciAqaGEsIHVzaG9ydCBzb3VyY2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgaWR4LCBnZHRoX2V2dF9kYXRhICpldnQpCit7CisgICAgZ2R0aF9ldnRfc3RyICplOworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworCisgICAgLyogbm8gR0RUSF9MT0NLX0hBKCkgISAqLworICAgIFRSQUNFMigoImdkdGhfc3RvcmVfZXZlbnQoKSBzb3VyY2UgJWQgaWR4ICVkXG4iLCBzb3VyY2UsIGlkeCkpOworICAgIGlmIChzb3VyY2UgPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBzb3VyY2UgLT4gbm8gZXZlbnQgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoZWJ1ZmZlcltlbGFzdGlkeF0uZXZlbnRfc291cmNlID09IHNvdXJjZSAmJgorICAgICAgICBlYnVmZmVyW2VsYXN0aWR4XS5ldmVudF9pZHggPT0gaWR4ICYmCisgICAgICAgICgoZXZ0LT5zaXplICE9IDAgJiYgZWJ1ZmZlcltlbGFzdGlkeF0uZXZlbnRfZGF0YS5zaXplICE9IDAgJiYKKyAgICAgICAgICAgICFtZW1jbXAoKGNoYXIgKikmZWJ1ZmZlcltlbGFzdGlkeF0uZXZlbnRfZGF0YS5ldSwKKyAgICAgICAgICAgIChjaGFyICopJmV2dC0+ZXUsIGV2dC0+c2l6ZSkpIHx8CisgICAgICAgIChldnQtPnNpemUgPT0gMCAmJiBlYnVmZmVyW2VsYXN0aWR4XS5ldmVudF9kYXRhLnNpemUgPT0gMCAmJgorICAgICAgICAgICAgIXN0cmNtcCgoY2hhciAqKSZlYnVmZmVyW2VsYXN0aWR4XS5ldmVudF9kYXRhLmV2ZW50X3N0cmluZywKKyAgICAgICAgICAgIChjaGFyICopJmV2dC0+ZXZlbnRfc3RyaW5nKSkpKSB7IAorICAgICAgICBlID0gJmVidWZmZXJbZWxhc3RpZHhdOworICAgICAgICBkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKyAgICAgICAgZS0+bGFzdF9zdGFtcCA9IHR2LnR2X3NlYzsKKyAgICAgICAgKytlLT5zYW1lX2NvdW50OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChlYnVmZmVyW2VsYXN0aWR4XS5ldmVudF9zb3VyY2UgIT0gMCkgeyAgLyogZW50cnkgbm90IGZyZWUgPyAqLworICAgICAgICAgICAgKytlbGFzdGlkeDsKKyAgICAgICAgICAgIGlmIChlbGFzdGlkeCA9PSBNQVhfRVZFTlRTKQorICAgICAgICAgICAgICAgIGVsYXN0aWR4ID0gMDsKKyAgICAgICAgICAgIGlmIChlbGFzdGlkeCA9PSBlb2xkaWR4KSB7ICAgICAgICAgICAgICAvKiByZWFjaGVkIG1hcmsgPyAqLworICAgICAgICAgICAgICAgICsrZW9sZGlkeDsKKyAgICAgICAgICAgICAgICBpZiAoZW9sZGlkeCA9PSBNQVhfRVZFTlRTKQorICAgICAgICAgICAgICAgICAgICBlb2xkaWR4ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlID0gJmVidWZmZXJbZWxhc3RpZHhdOworICAgICAgICBlLT5ldmVudF9zb3VyY2UgPSBzb3VyY2U7CisgICAgICAgIGUtPmV2ZW50X2lkeCA9IGlkeDsKKyAgICAgICAgZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisgICAgICAgIGUtPmZpcnN0X3N0YW1wID0gZS0+bGFzdF9zdGFtcCA9IHR2LnR2X3NlYzsKKyAgICAgICAgZS0+c2FtZV9jb3VudCA9IDE7CisgICAgICAgIGUtPmV2ZW50X2RhdGEgPSAqZXZ0OworICAgICAgICBlLT5hcHBsaWNhdGlvbiA9IDA7CisgICAgfQorICAgIHJldHVybiBlOworfQorCitzdGF0aWMgaW50IGdkdGhfcmVhZF9ldmVudChnZHRoX2hhX3N0ciAqaGEsIGludCBoYW5kbGUsIGdkdGhfZXZ0X3N0ciAqZXN0cikKK3sKKyAgICBnZHRoX2V2dF9zdHIgKmU7CisgICAgaW50IGVpbmRleDsKKyAgICB1bG9uZyBmbGFnczsKKworICAgIFRSQUNFMigoImdkdGhfcmVhZF9ldmVudCgpIGhhbmRsZSAlZFxuIiwgaGFuZGxlKSk7CisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgIGlmIChoYW5kbGUgPT0gLTEpCisgICAgICAgIGVpbmRleCA9IGVvbGRpZHg7CisgICAgZWxzZQorICAgICAgICBlaW5kZXggPSBoYW5kbGU7CisgICAgZXN0ci0+ZXZlbnRfc291cmNlID0gMDsKKworICAgIGlmIChlaW5kZXggPj0gTUFYX0VWRU5UUykgeworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIGVpbmRleDsKKyAgICB9CisgICAgZSA9ICZlYnVmZmVyW2VpbmRleF07CisgICAgaWYgKGUtPmV2ZW50X3NvdXJjZSAhPSAwKSB7CisgICAgICAgIGlmIChlaW5kZXggIT0gZWxhc3RpZHgpIHsKKyAgICAgICAgICAgIGlmICgrK2VpbmRleCA9PSBNQVhfRVZFTlRTKQorICAgICAgICAgICAgICAgIGVpbmRleCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlaW5kZXggPSAtMTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoZXN0ciwgZSwgc2l6ZW9mKGdkdGhfZXZ0X3N0cikpOworICAgIH0KKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICByZXR1cm4gZWluZGV4OworfQorCitzdGF0aWMgdm9pZCBnZHRoX3JlYWRhcHBfZXZlbnQoZ2R0aF9oYV9zdHIgKmhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY2hhciBhcHBsaWNhdGlvbiwgZ2R0aF9ldnRfc3RyICplc3RyKQoreworICAgIGdkdGhfZXZ0X3N0ciAqZTsKKyAgICBpbnQgZWluZGV4OworICAgIHVsb25nIGZsYWdzOworICAgIHVuY2hhciBmb3VuZCA9IEZBTFNFOworCisgICAgVFJBQ0UyKCgiZ2R0aF9yZWFkYXBwX2V2ZW50KCkgYXBwLiAlZFxuIiwgYXBwbGljYXRpb24pKTsKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgZWluZGV4ID0gZW9sZGlkeDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGUgPSAmZWJ1ZmZlcltlaW5kZXhdOworICAgICAgICBpZiAoZS0+ZXZlbnRfc291cmNlID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKChlLT5hcHBsaWNhdGlvbiAmIGFwcGxpY2F0aW9uKSA9PSAwKSB7CisgICAgICAgICAgICBlLT5hcHBsaWNhdGlvbiB8PSBhcHBsaWNhdGlvbjsKKyAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChlaW5kZXggPT0gZWxhc3RpZHgpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKCsrZWluZGV4ID09IE1BWF9FVkVOVFMpCisgICAgICAgICAgICBlaW5kZXggPSAwOworICAgIH0KKyAgICBpZiAoZm91bmQpCisgICAgICAgIG1lbWNweShlc3RyLCBlLCBzaXplb2YoZ2R0aF9ldnRfc3RyKSk7CisgICAgZWxzZQorICAgICAgICBlc3RyLT5ldmVudF9zb3VyY2UgPSAwOworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBnZHRoX2NsZWFyX2V2ZW50cyh2b2lkKQoreworICAgIFRSQUNFKCgiZ2R0aF9jbGVhcl9ldmVudHMoKSIpKTsKKworICAgIGVvbGRpZHggPSBlbGFzdGlkeCA9IDA7CisgICAgZWJ1ZmZlclswXS5ldmVudF9zb3VyY2UgPSAwOworfQorCisKKy8qIFNDU0kgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgZ2R0aF9pbnRlcnJ1cHQoaW50IGlycSx2b2lkICpkZXZfaWQsc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgZ2R0aF9oYV9zdHIgKmhhMiA9IChnZHRoX2hhX3N0ciAqKWRldl9pZDsKKyAgICByZWdpc3RlciBnZHRoX2hhX3N0ciAqaGE7CisgICAgZ2R0Nm1fZHByYW1fc3RyIF9faW9tZW0gKmRwNm1fcHRyID0gTlVMTDsKKyAgICBnZHQ2X2RwcmFtX3N0ciBfX2lvbWVtICpkcDZfcHRyOworICAgIGdkdDJfZHByYW1fc3RyIF9faW9tZW0gKmRwMl9wdHI7CisgICAgU2NzaV9DbW5kICpzY3A7CisgICAgaW50IGhhbnVtLCBydmFsLCBpOworICAgIHVuY2hhciBJU3RhdHVzOworICAgIHVzaG9ydCBTZXJ2aWNlOworICAgIHVsb25nIGZsYWdzID0gMDsKKyNpZmRlZiBJTlRfQ09BTAorICAgIGludCBjb2FsZXNjZWQgPSBGQUxTRTsKKyAgICBpbnQgbmV4dCA9IEZBTFNFOworICAgIGdkdGhfY29hbF9zdGF0dXMgKnBjcyA9IE5VTEw7CisgICAgaW50IGFjdF9pbnRfY29hbCA9IDA7ICAgICAgIAorI2VuZGlmCisKKyAgICBUUkFDRSgoImdkdGhfaW50ZXJydXB0KCkgSVJRICVkXG4iLGlycSkpOworCisgICAgLyogaWYgcG9sbGluZyBhbmQgbm90IGZyb20gZ2R0aF93YWl0KCkgLT4gcmV0dXJuICovCisgICAgaWYgKGdkdGhfcG9sbGluZykgeworICAgICAgICBpZiAoIWdkdGhfZnJvbV93YWl0KSB7CisgICAgICAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWdkdGhfcG9sbGluZykKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGEyLT5zbXBfbG9jaywgZmxhZ3MpOworICAgIHdhaXRfaW5kZXggPSAwOworCisgICAgLyogc2VhcmNoIGNvbnRyb2xsZXIgKi8KKyAgICBpZiAoKGhhbnVtID0gZ2R0aF9nZXRfc3RhdHVzKCZJU3RhdHVzLGlycSkpID09IC0xKSB7CisgICAgICAgIC8qIHNwdXJpb3VzIGludGVycnVwdCAqLworICAgICAgICBpZiAoIWdkdGhfcG9sbGluZykKKyAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhMi0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKKyAgICB9CisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisKKyNpZmRlZiBHRFRIX1NUQVRJU1RJQ1MKKyAgICArK2FjdF9pbnRzOworI2VuZGlmCisKKyNpZmRlZiBJTlRfQ09BTAorICAgIC8qIFNlZSBpZiB0aGUgZncgaXMgcmV0dXJuaW5nIGNvYWxlc2NlZCBzdGF0dXMgKi8KKyAgICBpZiAoSVN0YXR1cyA9PSBDT0FMSU5ERVgpIHsKKyAgICAgICAgLyogQ29hbGVzY2VkIHN0YXR1cy4gIFNldHVwIHRoZSBpbml0aWFsIHN0YXR1cyAKKyAgICAgICAgICAgYnVmZmVyIHBvaW50ZXIgYW5kIGZsYWdzICovCisgICAgICAgIHBjcyA9IGhhLT5jb2FsX3N0YXQ7CisgICAgICAgIGNvYWxlc2NlZCA9IFRSVUU7ICAgICAgICAKKyAgICAgICAgbmV4dCA9IFRSVUU7CisgICAgfQorCisgICAgZG8geworICAgICAgICBpZiAoY29hbGVzY2VkKSB7CisgICAgICAgICAgICAvKiBGb3IgY29hbGVzY2VkIHJlcXVlc3RzIGFsbCBzdGF0dXMKKyAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGlzIGZvdW5kIGluIHRoZSBzdGF0dXMgYnVmZmVyICovCisgICAgICAgICAgICBJU3RhdHVzID0gKHVuY2hhcikocGNzLT5zdGF0dXMgJiAweGZmKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgCisgICAgICAgIGlmIChoYS0+dHlwZSA9PSBHRFRfRUlTQSkgeworICAgICAgICAgICAgaWYgKElTdGF0dXMgJiAweDgwKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBlcnJvciBmbGFnICovCisgICAgICAgICAgICAgICAgSVN0YXR1cyAmPSB+MHg4MDsKKyAgICAgICAgICAgICAgICBoYS0+c3RhdHVzID0gaW53KGhhLT5ibWljICsgTUFJTEJPWFJFRys4KTsKKyAgICAgICAgICAgICAgICBUUkFDRTIoKCJnZHRoX2ludGVycnVwdCgpIGVycm9yICVkLyVkXG4iLElTdGF0dXMsaGEtPnN0YXR1cykpOworICAgICAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBlcnJvciAqLworICAgICAgICAgICAgICAgIGhhLT5zdGF0dXMgPSBTX09LOworICAgICAgICAgICAgaGEtPmluZm8gPSBpbmwoaGEtPmJtaWMgKyBNQUlMQk9YUkVHKzEyKTsKKyAgICAgICAgICAgIGhhLT5zZXJ2aWNlID0gaW53KGhhLT5ibWljICsgTUFJTEJPWFJFRysxMCk7CisgICAgICAgICAgICBoYS0+aW5mbzIgPSBpbmwoaGEtPmJtaWMgKyBNQUlMQk9YUkVHKzQpOworCisgICAgICAgICAgICBvdXRiKDB4ZmYsIGhhLT5ibWljICsgRURPT1JSRUcpOyAgICAvKiBhY2tub3dsZWRnZSBpbnRlcnJ1cHQgKi8KKyAgICAgICAgICAgIG91dGIoMHgwMCwgaGEtPmJtaWMgKyBTRU1BMVJFRyk7ICAgIC8qIHJlc2V0IHN0YXR1cyBzZW1hcGhvcmUgKi8KKyAgICAgICAgfSBlbHNlIGlmIChoYS0+dHlwZSA9PSBHRFRfSVNBKSB7CisgICAgICAgICAgICBkcDJfcHRyID0gaGEtPmJyZDsKKyAgICAgICAgICAgIGlmIChJU3RhdHVzICYgMHg4MCkgeyAgICAgICAgICAgICAgICAgICAgICAgLyogZXJyb3IgZmxhZyAqLworICAgICAgICAgICAgICAgIElTdGF0dXMgJj0gfjB4ODA7CisgICAgICAgICAgICAgICAgaGEtPnN0YXR1cyA9IGdkdGhfcmVhZHcoJmRwMl9wdHItPnUuaWMuU3RhdHVzKTsKKyAgICAgICAgICAgICAgICBUUkFDRTIoKCJnZHRoX2ludGVycnVwdCgpIGVycm9yICVkLyVkXG4iLElTdGF0dXMsaGEtPnN0YXR1cykpOworICAgICAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBlcnJvciAqLworICAgICAgICAgICAgICAgIGhhLT5zdGF0dXMgPSBTX09LOworICAgICAgICAgICAgaGEtPmluZm8gPSBnZHRoX3JlYWRsKCZkcDJfcHRyLT51LmljLkluZm9bMF0pOworICAgICAgICAgICAgaGEtPnNlcnZpY2UgPSBnZHRoX3JlYWR3KCZkcDJfcHRyLT51LmljLlNlcnZpY2UpOworICAgICAgICAgICAgaGEtPmluZm8yID0gZ2R0aF9yZWFkbCgmZHAyX3B0ci0+dS5pYy5JbmZvWzFdKTsKKworICAgICAgICAgICAgZ2R0aF93cml0ZWIoMHhmZiwgJmRwMl9wdHItPmlvLmlycWRlbCk7IC8qIGFja25vd2xlZGdlIGludGVycnVwdCAqLworICAgICAgICAgICAgZ2R0aF93cml0ZWIoMCwgJmRwMl9wdHItPnUuaWMuQ21kX0luZGV4KTsvKiByZXNldCBjb21tYW5kIGluZGV4ICovCisgICAgICAgICAgICBnZHRoX3dyaXRlYigwLCAmZHAyX3B0ci0+aW8uU2VtYTEpOyAgICAgLyogcmVzZXQgc3RhdHVzIHNlbWFwaG9yZSAqLworICAgICAgICB9IGVsc2UgaWYgKGhhLT50eXBlID09IEdEVF9QQ0kpIHsKKyAgICAgICAgICAgIGRwNl9wdHIgPSBoYS0+YnJkOworICAgICAgICAgICAgaWYgKElTdGF0dXMgJiAweDgwKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBlcnJvciBmbGFnICovCisgICAgICAgICAgICAgICAgSVN0YXR1cyAmPSB+MHg4MDsKKyAgICAgICAgICAgICAgICBoYS0+c3RhdHVzID0gZ2R0aF9yZWFkdygmZHA2X3B0ci0+dS5pYy5TdGF0dXMpOworICAgICAgICAgICAgICAgIFRSQUNFMigoImdkdGhfaW50ZXJydXB0KCkgZXJyb3IgJWQvJWRcbiIsSVN0YXR1cyxoYS0+c3RhdHVzKSk7CisgICAgICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGVycm9yICovCisgICAgICAgICAgICAgICAgaGEtPnN0YXR1cyA9IFNfT0s7CisgICAgICAgICAgICBoYS0+aW5mbyA9IGdkdGhfcmVhZGwoJmRwNl9wdHItPnUuaWMuSW5mb1swXSk7CisgICAgICAgICAgICBoYS0+c2VydmljZSA9IGdkdGhfcmVhZHcoJmRwNl9wdHItPnUuaWMuU2VydmljZSk7CisgICAgICAgICAgICBoYS0+aW5mbzIgPSBnZHRoX3JlYWRsKCZkcDZfcHRyLT51LmljLkluZm9bMV0pOworCisgICAgICAgICAgICBnZHRoX3dyaXRlYigweGZmLCAmZHA2X3B0ci0+aW8uaXJxZGVsKTsgLyogYWNrbm93bGVkZ2UgaW50ZXJydXB0ICovCisgICAgICAgICAgICBnZHRoX3dyaXRlYigwLCAmZHA2X3B0ci0+dS5pYy5DbWRfSW5kZXgpOy8qIHJlc2V0IGNvbW1hbmQgaW5kZXggKi8KKyAgICAgICAgICAgIGdkdGhfd3JpdGViKDAsICZkcDZfcHRyLT5pby5TZW1hMSk7ICAgICAvKiByZXNldCBzdGF0dXMgc2VtYXBob3JlICovCisgICAgICAgIH0gZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSU5FVykgeworICAgICAgICAgICAgaWYgKElTdGF0dXMgJiAweDgwKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBlcnJvciBmbGFnICovCisgICAgICAgICAgICAgICAgSVN0YXR1cyAmPSB+MHg4MDsKKyAgICAgICAgICAgICAgICBoYS0+c3RhdHVzID0gaW53KFBUUjJVU0hPUlQoJmhhLT5wbHgtPnN0YXR1cykpOworICAgICAgICAgICAgICAgIFRSQUNFMigoImdkdGhfaW50ZXJydXB0KCkgZXJyb3IgJWQvJWRcbiIsSVN0YXR1cyxoYS0+c3RhdHVzKSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBoYS0+c3RhdHVzID0gU19PSzsKKyAgICAgICAgICAgIGhhLT5pbmZvID0gaW5sKFBUUjJVU0hPUlQoJmhhLT5wbHgtPmluZm9bMF0pKTsKKyAgICAgICAgICAgIGhhLT5zZXJ2aWNlID0gaW53KFBUUjJVU0hPUlQoJmhhLT5wbHgtPnNlcnZpY2UpKTsKKyAgICAgICAgICAgIGhhLT5pbmZvMiA9IGlubChQVFIyVVNIT1JUKCZoYS0+cGx4LT5pbmZvWzFdKSk7CisKKyAgICAgICAgICAgIG91dGIoMHhmZiwgUFRSMlVTSE9SVCgmaGEtPnBseC0+ZWRvb3JfcmVnKSk7IAorICAgICAgICAgICAgb3V0YigweDAwLCBQVFIyVVNIT1JUKCZoYS0+cGx4LT5zZW1hMV9yZWcpKTsgCisgICAgICAgIH0gZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSU1QUikgeworICAgICAgICAgICAgZHA2bV9wdHIgPSBoYS0+YnJkOworICAgICAgICAgICAgaWYgKElTdGF0dXMgJiAweDgwKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBlcnJvciBmbGFnICovCisgICAgICAgICAgICAgICAgSVN0YXR1cyAmPSB+MHg4MDsKKyNpZmRlZiBJTlRfQ09BTAorICAgICAgICAgICAgICAgIGlmIChjb2FsZXNjZWQpCisgICAgICAgICAgICAgICAgICAgIGhhLT5zdGF0dXMgPSBwY3MtPmV4dF9zdGF0dXMgJiYgMHhmZmZmOworICAgICAgICAgICAgICAgIGVsc2UgCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgaGEtPnN0YXR1cyA9IGdkdGhfcmVhZHcoJmRwNm1fcHRyLT5pOTYwci5zdGF0dXMpOworICAgICAgICAgICAgICAgIFRSQUNFMigoImdkdGhfaW50ZXJydXB0KCkgZXJyb3IgJWQvJWRcbiIsSVN0YXR1cyxoYS0+c3RhdHVzKSk7CisgICAgICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGVycm9yICovCisgICAgICAgICAgICAgICAgaGEtPnN0YXR1cyA9IFNfT0s7CisjaWZkZWYgSU5UX0NPQUwKKyAgICAgICAgICAgIC8qIGdldCBpbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgaWYgKGNvYWxlc2NlZCkgeyAgICAKKyAgICAgICAgICAgICAgICBoYS0+aW5mbyA9IHBjcy0+aW5mbzA7CisgICAgICAgICAgICAgICAgaGEtPmluZm8yID0gcGNzLT5pbmZvMTsKKyAgICAgICAgICAgICAgICBoYS0+c2VydmljZSA9IChwY3MtPmV4dF9zdGF0dXMgPj4gMTYpICYmIDB4ZmZmZjsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGEtPmluZm8gPSBnZHRoX3JlYWRsKCZkcDZtX3B0ci0+aTk2MHIuaW5mb1swXSk7CisgICAgICAgICAgICAgICAgaGEtPnNlcnZpY2UgPSBnZHRoX3JlYWR3KCZkcDZtX3B0ci0+aTk2MHIuc2VydmljZSk7CisgICAgICAgICAgICAgICAgaGEtPmluZm8yID0gZ2R0aF9yZWFkbCgmZHA2bV9wdHItPmk5NjByLmluZm9bMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZXZlbnQgc3RyaW5nICovCisgICAgICAgICAgICBpZiAoSVN0YXR1cyA9PSBBU1lOQ0lOREVYKSB7CisgICAgICAgICAgICAgICAgaWYgKGhhLT5zZXJ2aWNlICE9IFNDUkVFTlNFUlZJQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgKGhhLT5md192ZXJzICYgMHhmZikgPj0gMHgxYSkgeworICAgICAgICAgICAgICAgICAgICBoYS0+ZHZyLnNldmVyaXR5ID0gZ2R0aF9yZWFkYgorICAgICAgICAgICAgICAgICAgICAgICAgKCYoKGdkdDZtX2RwcmFtX3N0ciBfX2lvbWVtICopaGEtPmJyZCktPmk5NjByLnNldmVyaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYS0+ZHZyLmV2ZW50X3N0cmluZ1tpXSA9IGdkdGhfcmVhZGIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJigoZ2R0Nm1fZHByYW1fc3RyIF9faW9tZW0gKiloYS0+YnJkKS0+aTk2MHIuZXZ0X3N0cltpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGEtPmR2ci5ldmVudF9zdHJpbmdbaV0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNpZmRlZiBJTlRfQ09BTAorICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgbm9uIGNvYWxlc2NlZCBpbnRlcnJ1cHRzIGdldCBjbGVhcmVkCisgICAgICAgICAgICAgICBiZWZvcmUgYmVpbmcgaGFuZGxlZCBieSBnZHRoX2FzeW5jX2V2ZW50L2dkdGhfc3luY19ldmVudCAqLworICAgICAgICAgICAgaWYgKCFjb2FsZXNjZWQpCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdkdGhfd3JpdGViKDB4ZmYsICZkcDZtX3B0ci0+aTk2MHIuZWRvb3JfcmVnKTsKKyAgICAgICAgICAgICAgICBnZHRoX3dyaXRlYigwLCAmZHA2bV9wdHItPmk5NjByLnNlbWExX3JlZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUkFDRTIoKCJnZHRoX2ludGVycnVwdCgpIHVua25vd24gY29udHJvbGxlciB0eXBlXG4iKSk7CisgICAgICAgICAgICBpZiAoIWdkdGhfcG9sbGluZykKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYTItPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CisgICAgICAgIH0KKworICAgICAgICBUUkFDRSgoImdkdGhfaW50ZXJydXB0KCkgaW5kZXggJWQgc3RhdCAlZCBpbmZvICVkXG4iLAorICAgICAgICAgICAgICAgSVN0YXR1cyxoYS0+c3RhdHVzLGhhLT5pbmZvKSk7CisKKyAgICAgICAgaWYgKGdkdGhfZnJvbV93YWl0KSB7CisgICAgICAgICAgICB3YWl0X2hhbnVtID0gaGFudW07CisgICAgICAgICAgICB3YWl0X2luZGV4ID0gKGludClJU3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKElTdGF0dXMgPT0gQVNZTkNJTkRFWCkgeworICAgICAgICAgICAgVFJBQ0UyKCgiZ2R0aF9pbnRlcnJ1cHQoKSBhc3luYy4gZXZlbnRcbiIpKTsKKyAgICAgICAgICAgIGdkdGhfYXN5bmNfZXZlbnQoaGFudW0pOworICAgICAgICAgICAgaWYgKCFnZHRoX3BvbGxpbmcpCisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEyLT5zbXBfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgZ2R0aF9uZXh0KGhhbnVtKTsKKyAgICAgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKKyAgICAgICAgfSAKKworICAgICAgICBpZiAoSVN0YXR1cyA9PSBTUEVaSU5ERVgpIHsKKyAgICAgICAgICAgIFRSQUNFMigoIlNlcnZpY2UgdW5rbm93biBvciBub3QgaW5pdGlhbGl6ZWQgIVxuIikpOworICAgICAgICAgICAgaGEtPmR2ci5zaXplID0gc2l6ZW9mKGhhLT5kdnIuZXUuZHJpdmVyKTsKKyAgICAgICAgICAgIGhhLT5kdnIuZXUuZHJpdmVyLmlvbm9kZSA9IGhhbnVtOworICAgICAgICAgICAgZ2R0aF9zdG9yZV9ldmVudChoYSwgRVNfRFJJVkVSLCA0LCAmaGEtPmR2cik7CisgICAgICAgICAgICBpZiAoIWdkdGhfcG9sbGluZykKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYTItPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CisgICAgICAgIH0KKyAgICAgICAgc2NwICAgICA9IGhhLT5jbWRfdGFiW0lTdGF0dXMtMl0uY21uZDsKKyAgICAgICAgU2VydmljZSA9IGhhLT5jbWRfdGFiW0lTdGF0dXMtMl0uc2VydmljZTsKKyAgICAgICAgaGEtPmNtZF90YWJbSVN0YXR1cy0yXS5jbW5kID0gVU5VU0VEX0NNTkQ7CisgICAgICAgIGlmIChzY3AgPT0gVU5VU0VEX0NNTkQpIHsKKyAgICAgICAgICAgIFRSQUNFMigoImdkdGhfaW50ZXJydXB0KCkgaW5kZXggdG8gdW51c2VkIGNvbW1hbmQgKCVkKVxuIixJU3RhdHVzKSk7CisgICAgICAgICAgICBoYS0+ZHZyLnNpemUgPSBzaXplb2YoaGEtPmR2ci5ldS5kcml2ZXIpOworICAgICAgICAgICAgaGEtPmR2ci5ldS5kcml2ZXIuaW9ub2RlID0gaGFudW07CisgICAgICAgICAgICBoYS0+ZHZyLmV1LmRyaXZlci5pbmRleCA9IElTdGF0dXM7CisgICAgICAgICAgICBnZHRoX3N0b3JlX2V2ZW50KGhhLCBFU19EUklWRVIsIDEsICZoYS0+ZHZyKTsKKyAgICAgICAgICAgIGlmICghZ2R0aF9wb2xsaW5nKQorICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhMi0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2NwID09IElOVEVSTkFMX0NNTkQpIHsKKyAgICAgICAgICAgIFRSQUNFKCgiZ2R0aF9pbnRlcnJ1cHQoKSBhbnN3ZXIgdG8gaW50ZXJuYWwgY29tbWFuZFxuIikpOworICAgICAgICAgICAgaWYgKCFnZHRoX3BvbGxpbmcpCisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEyLT5zbXBfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOworICAgICAgICB9CisKKyAgICAgICAgVFJBQ0UoKCJnZHRoX2ludGVycnVwdCgpIHN5bmMuIHN0YXR1c1xuIikpOworICAgICAgICBydmFsID0gZ2R0aF9zeW5jX2V2ZW50KGhhbnVtLFNlcnZpY2UsSVN0YXR1cyxzY3ApOworICAgICAgICBpZiAoIWdkdGhfcG9sbGluZykKKyAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhMi0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKHJ2YWwgPT0gMikgeworICAgICAgICAgICAgZ2R0aF9wdXRxKGhhbnVtLHNjcCxzY3AtPlNDcC50aGlzX3Jlc2lkdWFsKTsKKyAgICAgICAgfSBlbHNlIGlmIChydmFsID09IDEpIHsKKyAgICAgICAgICAgIHNjcC0+c2NzaV9kb25lKHNjcCk7CisgICAgICAgIH0KKworI2lmZGVmIElOVF9DT0FMCisgICAgICAgIGlmIChjb2FsZXNjZWQpIHsKKyAgICAgICAgICAgIC8qIGdvIHRvIHRoZSBuZXh0IHN0YXR1cyBpbiB0aGUgc3RhdHVzIGJ1ZmZlciAqLworICAgICAgICAgICAgKytwY3M7CisjaWZkZWYgR0RUSF9TVEFUSVNUSUNTCisgICAgICAgICAgICArK2FjdF9pbnRfY29hbDsKKyAgICAgICAgICAgIGlmIChhY3RfaW50X2NvYWwgPiBtYXhfaW50X2NvYWwpIHsKKyAgICAgICAgICAgICAgICBtYXhfaW50X2NvYWwgPSBhY3RfaW50X2NvYWw7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQ6IG1heF9pbnRfY29hbCA9ICVkXG4iLCh1c2hvcnQpbWF4X2ludF9jb2FsKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAgICAgIAorICAgICAgICAgICAgLyogc2VlIGlmIHRoZXJlIGlzIGFub3RoZXIgc3RhdHVzICovCisgICAgICAgICAgICBpZiAocGNzLT5zdGF0dXMgPT0gMCkgICAgCisgICAgICAgICAgICAgICAgLyogU3RvcCB0aGUgY29hbGVzY2UgbG9vcCAqLworICAgICAgICAgICAgICAgIG5leHQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKG5leHQpOworCisgICAgLyogY29hbGVzY2luZyBvbmx5IGZvciBuZXcgR0RUX1BDSU1QUiBjb250cm9sbGVycyBhdmFpbGFibGUgKi8gICAgICAKKyAgICBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSU1QUiAmJiBjb2FsZXNjZWQpIHsKKyAgICAgICAgZ2R0aF93cml0ZWIoMHhmZiwgJmRwNm1fcHRyLT5pOTYwci5lZG9vcl9yZWcpOworICAgICAgICBnZHRoX3dyaXRlYigwLCAmZHA2bV9wdHItPmk5NjByLnNlbWExX3JlZyk7CisgICAgfQorI2VuZGlmCisKKyAgICBnZHRoX25leHQoaGFudW0pOworICAgIHJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBnZHRoX3N5bmNfZXZlbnQoaW50IGhhbnVtLGludCBzZXJ2aWNlLHVuY2hhciBpbmRleCxTY3NpX0NtbmQgKnNjcCkKK3sKKyAgICByZWdpc3RlciBnZHRoX2hhX3N0ciAqaGE7CisgICAgZ2R0aF9tc2dfc3RyICptc2c7CisgICAgZ2R0aF9jbWRfc3RyICpjbWRwOworICAgIHVuY2hhciBiLCB0OworCisgICAgaGEgICA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICBjbWRwID0gaGEtPnBjY2I7CisgICAgVFJBQ0UoKCJnZHRoX3N5bmNfZXZlbnQoKSBzZXJ2ICVkIHN0YXR1cyAlZFxuIiwKKyAgICAgICAgICAgc2VydmljZSxoYS0+c3RhdHVzKSk7CisKKyAgICBpZiAoc2VydmljZSA9PSBTQ1JFRU5TRVJWSUNFKSB7CisgICAgICAgIG1zZyAgPSBoYS0+cG1zZzsKKyAgICAgICAgVFJBQ0UoKCJsZW46ICVkLCBhbnN3ZXI6ICVkLCBleHQ6ICVkLCBhbGVuOiAlZFxuIiwKKyAgICAgICAgICAgICAgIG1zZy0+bXNnX2xlbixtc2ctPm1zZ19hbnN3ZXIsbXNnLT5tc2dfZXh0LG1zZy0+bXNnX2FsZW4pKTsKKyAgICAgICAgaWYgKG1zZy0+bXNnX2xlbiA+IE1TR0xFTisxKQorICAgICAgICAgICAgbXNnLT5tc2dfbGVuID0gTVNHTEVOKzE7CisgICAgICAgIGlmIChtc2ctPm1zZ19sZW4pCisgICAgICAgICAgICBpZiAoIShtc2ctPm1zZ19hbnN3ZXIgJiYgbXNnLT5tc2dfZXh0KSkgeworICAgICAgICAgICAgICAgIG1zZy0+bXNnX3RleHRbbXNnLT5tc2dfbGVuXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgcHJpbnRrKCIlcyIsbXNnLT5tc2dfdGV4dCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgaWYgKG1zZy0+bXNnX2V4dCAmJiAhbXNnLT5tc2dfYW5zd2VyKSB7CisgICAgICAgICAgICB3aGlsZSAoZ2R0aF90ZXN0X2J1c3koaGFudW0pKQorICAgICAgICAgICAgICAgIGdkdGhfZGVsYXkoMCk7CisgICAgICAgICAgICBjbWRwLT5TZXJ2aWNlICAgICAgID0gU0NSRUVOU0VSVklDRTsKKyAgICAgICAgICAgIGNtZHAtPlJlcXVlc3RCdWZmZXIgPSBTQ1JFRU5fQ01ORDsKKyAgICAgICAgICAgIGdkdGhfZ2V0X2NtZF9pbmRleChoYW51bSk7CisgICAgICAgICAgICBnZHRoX3NldF9zZW1hMChoYW51bSk7CisgICAgICAgICAgICBjbWRwLT5PcENvZGUgICAgICAgID0gR0RUX1JFQUQ7CisgICAgICAgICAgICBjbWRwLT5Cb2FyZE5vZGUgICAgID0gTE9DQUxCT0FSRDsKKyAgICAgICAgICAgIGNtZHAtPnUuc2NyZWVuLnJlc2VydmVkICA9IDA7CisgICAgICAgICAgICBjbWRwLT51LnNjcmVlbi5zdS5tc2cubXNnX2hhbmRsZT0gbXNnLT5tc2dfaGFuZGxlOworICAgICAgICAgICAgY21kcC0+dS5zY3JlZW4uc3UubXNnLm1zZ19hZGRyICA9IGhhLT5tc2dfcGh5czsKKyAgICAgICAgICAgIGhhLT5jbWRfb2Zmc19kcG1lbSA9IDA7CisgICAgICAgICAgICBoYS0+Y21kX2xlbiA9IEdEVE9GRlNPRihnZHRoX2NtZF9zdHIsdS5zY3JlZW4uc3UubXNnLm1zZ19hZGRyKSAKKyAgICAgICAgICAgICAgICArIHNpemVvZih1bG9uZzY0KTsKKyAgICAgICAgICAgIGhhLT5jbWRfY250ID0gMDsKKyAgICAgICAgICAgIGdkdGhfY29weV9jb21tYW5kKGhhbnVtKTsKKyAgICAgICAgICAgIGdkdGhfcmVsZWFzZV9ldmVudChoYW51bSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtc2ctPm1zZ19hbnN3ZXIgJiYgbXNnLT5tc2dfYWxlbikgeworICAgICAgICAgICAgLyogZGVmYXVsdCBhbnN3ZXJzIChnZXRjaGFyKCkgbm90IHBvc3NpYmxlKSAqLworICAgICAgICAgICAgaWYgKG1zZy0+bXNnX2FsZW4gPT0gMSkgeworICAgICAgICAgICAgICAgIG1zZy0+bXNnX2FsZW4gPSAwOworICAgICAgICAgICAgICAgIG1zZy0+bXNnX2xlbiA9IDE7CisgICAgICAgICAgICAgICAgbXNnLT5tc2dfdGV4dFswXSA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1zZy0+bXNnX2FsZW4gLT0gMjsKKyAgICAgICAgICAgICAgICBtc2ctPm1zZ19sZW4gPSAyOworICAgICAgICAgICAgICAgIG1zZy0+bXNnX3RleHRbMF0gPSAxOworICAgICAgICAgICAgICAgIG1zZy0+bXNnX3RleHRbMV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnLT5tc2dfZXh0ICAgID0gMDsKKyAgICAgICAgICAgIG1zZy0+bXNnX2Fuc3dlciA9IDA7CisgICAgICAgICAgICB3aGlsZSAoZ2R0aF90ZXN0X2J1c3koaGFudW0pKQorICAgICAgICAgICAgICAgIGdkdGhfZGVsYXkoMCk7CisgICAgICAgICAgICBjbWRwLT5TZXJ2aWNlICAgICAgID0gU0NSRUVOU0VSVklDRTsKKyAgICAgICAgICAgIGNtZHAtPlJlcXVlc3RCdWZmZXIgPSBTQ1JFRU5fQ01ORDsKKyAgICAgICAgICAgIGdkdGhfZ2V0X2NtZF9pbmRleChoYW51bSk7CisgICAgICAgICAgICBnZHRoX3NldF9zZW1hMChoYW51bSk7CisgICAgICAgICAgICBjbWRwLT5PcENvZGUgICAgICAgID0gR0RUX1dSSVRFOworICAgICAgICAgICAgY21kcC0+Qm9hcmROb2RlICAgICA9IExPQ0FMQk9BUkQ7CisgICAgICAgICAgICBjbWRwLT51LnNjcmVlbi5yZXNlcnZlZCAgPSAwOworICAgICAgICAgICAgY21kcC0+dS5zY3JlZW4uc3UubXNnLm1zZ19oYW5kbGU9IG1zZy0+bXNnX2hhbmRsZTsKKyAgICAgICAgICAgIGNtZHAtPnUuc2NyZWVuLnN1Lm1zZy5tc2dfYWRkciAgPSBoYS0+bXNnX3BoeXM7CisgICAgICAgICAgICBoYS0+Y21kX29mZnNfZHBtZW0gPSAwOworICAgICAgICAgICAgaGEtPmNtZF9sZW4gPSBHRFRPRkZTT0YoZ2R0aF9jbWRfc3RyLHUuc2NyZWVuLnN1Lm1zZy5tc2dfYWRkcikgCisgICAgICAgICAgICAgICAgKyBzaXplb2YodWxvbmc2NCk7CisgICAgICAgICAgICBoYS0+Y21kX2NudCA9IDA7CisgICAgICAgICAgICBnZHRoX2NvcHlfY29tbWFuZChoYW51bSk7CisgICAgICAgICAgICBnZHRoX3JlbGVhc2VfZXZlbnQoaGFudW0pOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRrKCJcbiIpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgYiA9IHZpcnRfY3RyID8gTlVNREFUQShzY3AtPmRldmljZS0+aG9zdCktPmJ1c251bSA6IHNjcC0+ZGV2aWNlLT5jaGFubmVsOworICAgICAgICB0ID0gc2NwLT5kZXZpY2UtPmlkOworICAgICAgICBpZiAoc2NwLT5TQ3Auc2VudF9jb21tYW5kID09IC0xICYmIGIgIT0gaGEtPnZpcnRfYnVzKSB7CisgICAgICAgICAgICBoYS0+cmF3W0JVU19MMlAoaGEsYildLmlvX2NudFt0XS0tOworICAgICAgICB9CisgICAgICAgIC8qIGNhY2hlIG9yIHJhdyBzZXJ2aWNlICovCisgICAgICAgIGlmIChoYS0+c3RhdHVzID09IFNfQlNZKSB7CisgICAgICAgICAgICBUUkFDRTIoKCJDb250cm9sbGVyIGJ1c3kgLT4gcmV0cnkgIVxuIikpOworICAgICAgICAgICAgaWYgKHNjcC0+U0NwLnNlbnRfY29tbWFuZCA9PSBHRFRfTU9VTlQpCisgICAgICAgICAgICAgICAgc2NwLT5TQ3Auc2VudF9jb21tYW5kID0gR0RUX0NMVVNUX0lORk87CisgICAgICAgICAgICAvKiByZXRyeSAqLworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNjcC0+U0NwLlN0YXR1cyA9PSBHRFRIX01BUF9TRykgCisgICAgICAgICAgICBwY2lfdW5tYXBfc2coaGEtPnBkZXYsc2NwLT5yZXF1ZXN0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzY3AtPnVzZV9zZyxzY3AtPlNDcC5NZXNzYWdlKTsKKyAgICAgICAgZWxzZSBpZiAoc2NwLT5TQ3AuU3RhdHVzID09IEdEVEhfTUFQX1NJTkdMRSkgCisgICAgICAgICAgICBwY2lfdW5tYXBfcGFnZShoYS0+cGRldixzY3AtPlNDcC5kbWFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NwLT5yZXF1ZXN0X2J1ZmZsZW4sc2NwLT5TQ3AuTWVzc2FnZSk7CisgICAgICAgIGlmIChzY3AtPlNDcC5idWZmZXIpIHsKKyAgICAgICAgICAgIGRtYV9hZGRyX3QgYWRkcjsKKyAgICAgICAgICAgIGFkZHIgPSAoZG1hX2FkZHJfdCkodWxvbmczMilzY3AtPlNDcC5idWZmZXI7CisgICAgICAgICAgICBpZiAoc2NwLT5ob3N0X3NjcmliYmxlKQorICAgICAgICAgICAgICAgIGFkZHIgKz0gKGRtYV9hZGRyX3QpKCh1bG9uZzY0KSh1bG9uZzMyKXNjcC0+aG9zdF9zY3JpYmJsZSA8PCAzMik7ICAgICAgICAgICAgICAgCisgICAgICAgICAgICBwY2lfdW5tYXBfcGFnZShoYS0+cGRldixhZGRyLDE2LFBDSV9ETUFfRlJPTURFVklDRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGEtPnN0YXR1cyA9PSBTX09LKSB7CisgICAgICAgICAgICBzY3AtPlNDcC5TdGF0dXMgPSBTX09LOworICAgICAgICAgICAgc2NwLT5TQ3AuTWVzc2FnZSA9IGhhLT5pbmZvOworICAgICAgICAgICAgaWYgKHNjcC0+U0NwLnNlbnRfY29tbWFuZCAhPSAtMSkgeworICAgICAgICAgICAgICAgIFRSQUNFMigoImdkdGhfc3luY19ldmVudCgpOiBzcGVjaWFsIGNtZCAweCV4IE9LXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc2NwLT5TQ3Auc2VudF9jb21tYW5kKSk7CisgICAgICAgICAgICAgICAgLyogc3BlY2lhbCBjb21tYW5kcyBHRFRfQ0xVU1RfSU5GTy9HRFRfTU9VTlQgPyAqLworICAgICAgICAgICAgICAgIGlmIChzY3AtPlNDcC5zZW50X2NvbW1hbmQgPT0gR0RUX0NMVVNUX0lORk8pIHsKKyAgICAgICAgICAgICAgICAgICAgaGEtPmhkclt0XS5jbHVzdGVyX3R5cGUgPSAodW5jaGFyKWhhLT5pbmZvOworICAgICAgICAgICAgICAgICAgICBpZiAoIShoYS0+aGRyW3RdLmNsdXN0ZXJfdHlwZSAmIAorICAgICAgICAgICAgICAgICAgICAgICAgQ0xVU1RFUl9NT1VOVEVEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogTk9UIE1PVU5URUQgLT4gTU9VTlQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNjcC0+U0NwLnNlbnRfY29tbWFuZCA9IEdEVF9NT1VOVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYS0+aGRyW3RdLmNsdXN0ZXJfdHlwZSAmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMVVNURVJfUkVTRVJWRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbHVzdGVyIGRyaXZlIFJFU0VSVkVEIChvbiB0aGUgb3RoZXIgbm9kZSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3AtPlNDcC5waGFzZSA9IC0yOyAgICAgIC8qIHJlc2VydmF0aW9uIGNvbmZsaWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY3AtPlNDcC5zZW50X2NvbW1hbmQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzY3AtPlNDcC5zZW50X2NvbW1hbmQgPT0gR0RUX01PVU5UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYS0+aGRyW3RdLmNsdXN0ZXJfdHlwZSB8PSBDTFVTVEVSX01PVU5URUQ7CisgICAgICAgICAgICAgICAgICAgICAgICBoYS0+aGRyW3RdLm1lZGlhX2NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjcC0+U0NwLnNlbnRfY29tbWFuZCA9PSBHRFRfVU5NT1VOVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGEtPmhkclt0XS5jbHVzdGVyX3R5cGUgJj0gfkNMVVNURVJfTU9VTlRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5oZHJbdF0ubWVkaWFfY2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgICAgIHNjcC0+U0NwLnNlbnRfY29tbWFuZCA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiByZXRyeSAqLworICAgICAgICAgICAgICAgIHNjcC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBISUdIX1BSSTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogUkVTRVJWRS9SRUxFQVNFID8gKi8KKyAgICAgICAgICAgICAgICBpZiAoc2NwLT5jbW5kWzBdID09IFJFU0VSVkUpIHsKKyAgICAgICAgICAgICAgICAgICAgaGEtPmhkclt0XS5jbHVzdGVyX3R5cGUgfD0gQ0xVU1RFUl9SRVNFUlZFRDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjcC0+Y21uZFswXSA9PSBSRUxFQVNFKSB7CisgICAgICAgICAgICAgICAgICAgIGhhLT5oZHJbdF0uY2x1c3Rlcl90eXBlICY9IH5DTFVTVEVSX1JFU0VSVkVEOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNjcC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworICAgICAgICAgICAgICAgIHNjcC0+c2Vuc2VfYnVmZmVyWzBdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNjcC0+U0NwLlN0YXR1cyA9IGhhLT5zdGF0dXM7CisgICAgICAgICAgICBzY3AtPlNDcC5NZXNzYWdlID0gaGEtPmluZm87CisKKyAgICAgICAgICAgIGlmIChzY3AtPlNDcC5zZW50X2NvbW1hbmQgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBUUkFDRTIoKCJnZHRoX3N5bmNfZXZlbnQoKTogc3BlY2lhbCBjbWQgMHgleCBlcnJvciAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc2NwLT5TQ3Auc2VudF9jb21tYW5kLCBoYS0+c3RhdHVzKSk7CisgICAgICAgICAgICAgICAgaWYgKHNjcC0+U0NwLnNlbnRfY29tbWFuZCA9PSBHRFRfU0NBTl9TVEFSVCB8fAorICAgICAgICAgICAgICAgICAgICBzY3AtPlNDcC5zZW50X2NvbW1hbmQgPT0gR0RUX1NDQU5fRU5EKSB7CisgICAgICAgICAgICAgICAgICAgIHNjcC0+U0NwLnNlbnRfY29tbWFuZCA9IC0xOworICAgICAgICAgICAgICAgICAgICAvKiByZXRyeSAqLworICAgICAgICAgICAgICAgICAgICBzY3AtPlNDcC50aGlzX3Jlc2lkdWFsID0gSElHSF9QUkk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1zZXQoKGNoYXIqKXNjcC0+c2Vuc2VfYnVmZmVyLDAsMTYpOworICAgICAgICAgICAgICAgIHNjcC0+c2Vuc2VfYnVmZmVyWzBdID0gMHg3MDsKKyAgICAgICAgICAgICAgICBzY3AtPnNlbnNlX2J1ZmZlclsyXSA9IE5PVF9SRUFEWTsKKyAgICAgICAgICAgICAgICBzY3AtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpIHwgKENIRUNLX0NPTkRJVElPTiA8PCAxKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZSA9PSBDQUNIRVNFUlZJQ0UpIHsKKyAgICAgICAgICAgICAgICBpZiAoaGEtPnN0YXR1cyA9PSBTX0NBQ0hFX1VOS05PV04gJiYKKyAgICAgICAgICAgICAgICAgICAgKGhhLT5oZHJbdF0uY2x1c3Rlcl90eXBlICYgCisgICAgICAgICAgICAgICAgICAgICBDTFVTVEVSX1JFU0VSVkVfU1RBVEUpID09IENMVVNURVJfUkVTRVJWRV9TVEFURSkgeworICAgICAgICAgICAgICAgICAgICAvKiBidXMgcmVzZXQgLT4gZm9yY2UgR0RUX0NMVVNUX0lORk8gKi8KKyAgICAgICAgICAgICAgICAgICAgaGEtPmhkclt0XS5jbHVzdGVyX3R5cGUgJj0gfkNMVVNURVJfUkVTRVJWRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lbXNldCgoY2hhciopc2NwLT5zZW5zZV9idWZmZXIsMCwxNik7CisgICAgICAgICAgICAgICAgaWYgKGhhLT5zdGF0dXMgPT0gKHVzaG9ydClTX0NBQ0hFX1JFU0VSVikgeworICAgICAgICAgICAgICAgICAgICBzY3AtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpIHwgKFJFU0VSVkFUSU9OX0NPTkZMSUNUIDw8IDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNjcC0+c2Vuc2VfYnVmZmVyWzBdID0gMHg3MDsKKyAgICAgICAgICAgICAgICAgICAgc2NwLT5zZW5zZV9idWZmZXJbMl0gPSBOT1RfUkVBRFk7CisgICAgICAgICAgICAgICAgICAgIHNjcC0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCAoQ0hFQ0tfQ09ORElUSU9OIDw8IDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2NwLT5kb25lICE9IGdkdGhfc2NzaV9kb25lKSB7CisgICAgICAgICAgICAgICAgICAgIGhhLT5kdnIuc2l6ZSA9IHNpemVvZihoYS0+ZHZyLmV1LnN5bmMpOworICAgICAgICAgICAgICAgICAgICBoYS0+ZHZyLmV1LnN5bmMuaW9ub2RlICA9IGhhbnVtOworICAgICAgICAgICAgICAgICAgICBoYS0+ZHZyLmV1LnN5bmMuc2VydmljZSA9IHNlcnZpY2U7CisgICAgICAgICAgICAgICAgICAgIGhhLT5kdnIuZXUuc3luYy5zdGF0dXMgID0gaGEtPnN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgaGEtPmR2ci5ldS5zeW5jLmluZm8gICAgPSBoYS0+aW5mbzsKKyAgICAgICAgICAgICAgICAgICAgaGEtPmR2ci5ldS5zeW5jLmhvc3Rkcml2ZSA9IHQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYS0+c3RhdHVzID49IDB4ODAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdkdGhfc3RvcmVfZXZlbnQoaGEsIEVTX1NZTkMsIDAsICZoYS0+ZHZyKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZ2R0aF9zdG9yZV9ldmVudChoYSwgRVNfU1lOQywgc2VydmljZSwgJmhhLT5kdnIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogc2Vuc2UgYnVmZmVyIGZpbGxlZCBmcm9tIGNvbnRyb2xsZXIgZmlybXdhcmUgKERNQSkgKi8KKyAgICAgICAgICAgICAgICBpZiAoaGEtPnN0YXR1cyAhPSBTX1JBV19TQ1NJIHx8IGhhLT5pbmZvID49IDB4MTAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNjcC0+cmVzdWx0ID0gRElEX0JBRF9UQVJHRVQgPDwgMTY7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2NwLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KSB8IGhhLT5pbmZvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXNjcC0+U0NwLmhhdmVfZGF0YV9pbikKKyAgICAgICAgICAgIHNjcC0+U0NwLmhhdmVfZGF0YV9pbisrOworICAgICAgICBlbHNlIAorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICphc3luY19jYWNoZV90YWJbXSA9IHsKKy8qIDAqLyAgIlwwMTFcMDAwXDAwMlwwMDJcMDAyXDAwNFwwMDJcMDA2XDAwNCIKKyAgICAgICAgIkdEVCBIQSAldSwgc2VydmljZSAldSwgYXN5bmMuIHN0YXR1cyAldS8lbHUgdW5rbm93biIsCisvKiAxKi8gICJcMDExXDAwMFwwMDJcMDAyXDAwMlwwMDRcMDAyXDAwNlwwMDQiCisgICAgICAgICJHRFQgSEEgJXUsIHNlcnZpY2UgJXUsIGFzeW5jLiBzdGF0dXMgJXUvJWx1IHVua25vd24iLAorLyogMiovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDQiCisgICAgICAgICJHRFQgSEEgJXUsIEhvc3QgRHJpdmUgJWx1IG5vdCByZWFkeSIsCisvKiAzKi8gICJcMDA1XDAwMFwwMDJcMDA2XDAwNCIKKyAgICAgICAgIkdEVCBIQSAldSwgSG9zdCBEcml2ZSAlbHU6IFJFQVNTSUdOIG5vdCBzdWNjZXNzZnVsIGFuZC9vciBkYXRhIGVycm9yIG9uIHJlYXNzaWduZWQgYmxvY2tzLiBEcml2ZSBtYXkgY3Jhc2ggaW4gdGhlIGZ1dHVyZSBhbmQgc2hvdWxkIGJlIHJlcGxhY2VkIiwKKy8qIDQqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDA0IgorICAgICAgICAiR0RUIEhBICV1LCBtaXJyb3IgdXBkYXRlIG9uIEhvc3QgRHJpdmUgJWx1IGZhaWxlZCIsCisvKiA1Ki8gICJcMDA1XDAwMFwwMDJcMDA2XDAwNCIKKyAgICAgICAgIkdEVCBIQSAldSwgTWlycm9yIERyaXZlICVsdSBmYWlsZWQiLAorLyogNiovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDQiCisgICAgICAgICJHRFQgSEEgJXUsIE1pcnJvciBEcml2ZSAlbHU6IFJFQVNTSUdOIG5vdCBzdWNjZXNzZnVsIGFuZC9vciBkYXRhIGVycm9yIG9uIHJlYXNzaWduZWQgYmxvY2tzLiBEcml2ZSBtYXkgY3Jhc2ggaW4gdGhlIGZ1dHVyZSBhbmQgc2hvdWxkIGJlIHJlcGxhY2VkIiwKKy8qIDcqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDA0IgorICAgICAgICAiR0RUIEhBICV1LCBIb3N0IERyaXZlICVsdSB3cml0ZSBwcm90ZWN0ZWQiLAorLyogOCovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDQiCisgICAgICAgICJHRFQgSEEgJXUsIG1lZGlhIGNoYW5nZWQgaW4gSG9zdCBEcml2ZSAlbHUiLAorLyogOSovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDQiCisgICAgICAgICJHRFQgSEEgJXUsIEhvc3QgRHJpdmUgJWx1IGlzIG9mZmxpbmUiLAorLyoxMCovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDQiCisgICAgICAgICJHRFQgSEEgJXUsIG1lZGlhIGNoYW5nZSBvZiBNaXJyb3IgRHJpdmUgJWx1IiwKKy8qMTEqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDA0IgorICAgICAgICAiR0RUIEhBICV1LCBNaXJyb3IgRHJpdmUgJWx1IGlzIHdyaXRlIHByb3RlY3RlZCIsCisvKjEyKi8gICJcMDA1XDAwMFwwMDJcMDA2XDAwNCIKKyAgICAgICAgIkdEVCBIQSAldSwgZ2VuZXJhbCBlcnJvciBvbiBIb3N0IERyaXZlICVsdS4gUGxlYXNlIGNoZWNrIHRoZSBkZXZpY2VzIG9mIHRoaXMgZHJpdmUhIiwKKy8qMTMqLyAgIlwwMDdcMDAwXDAwMlwwMDZcMDAyXDAxMFwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBDYWNoZSBEcml2ZSAldSBmYWlsZWQiLAorLyoxNCovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBGQUlMIHN0YXRlIGVudGVyZWQiLAorLyoxNSovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBlcnJvciIsCisvKjE2Ki8gICJcMDA3XDAwMFwwMDJcMDA2XDAwMlwwMTBcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBBcnJheSBEcml2ZSAldTogZmFpbGVkIGRyaXZlIHJlcGxhY2VkIGJ5IENhY2hlIERyaXZlICV1IiwKKy8qMTcqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBBcnJheSBEcml2ZSAldTogcGFyaXR5IGJ1aWxkIGZhaWxlZCIsCisvKjE4Ki8gICJcMDA1XDAwMFwwMDJcMDA2XDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgQXJyYXkgRHJpdmUgJXU6IGRyaXZlIHJlYnVpbGQgZmFpbGVkIiwKKy8qMTkqLyAgIlwwMDVcMDAwXDAwMlwwMTBcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBUZXN0IG9mIEhvdCBGaXggJXUgZmFpbGVkIiwKKy8qMjAqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBBcnJheSBEcml2ZSAldTogZHJpdmUgYnVpbGQgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5IiwKKy8qMjEqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBBcnJheSBEcml2ZSAldTogZHJpdmUgcmVidWlsZCBmaW5pc2hlZCBzdWNjZXNzZnVsbHkiLAorLyoyMiovICAiXDAwN1wwMDBcMDAyXDAwNlwwMDJcMDEwXDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgQXJyYXkgRHJpdmUgJXU6IEhvdCBGaXggJXUgYWN0aXZhdGVkIiwKKy8qMjMqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBIb3N0IERyaXZlICV1OiBwcm9jZXNzaW5nIG9mIGkvbyBhYm9ydGVkIGR1ZSB0byBzZXJpb3VzIGRyaXZlIGVycm9yIiwKKy8qMjQqLyAgIlwwMDVcMDAwXDAwMlwwMTBcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBtaXJyb3IgdXBkYXRlIG9uIENhY2hlIERyaXZlICV1IGNvbXBsZXRlZCIsCisvKjI1Ki8gICJcMDA1XDAwMFwwMDJcMDEwXDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgbWlycm9yIHVwZGF0ZSBvbiBDYWNoZSBEcml2ZSAlbHUgZmFpbGVkIiwKKy8qMjYqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBBcnJheSBEcml2ZSAldTogZHJpdmUgcmVidWlsZCBzdGFydGVkIiwKKy8qMjcqLyAgIlwwMDVcMDAwXDAwMlwwMTJcMDAxIgorICAgICAgICAiR0RUIEhBICV1LCBGYXVsdCBidXMgJXU6IFNIRUxGIE9LIGRldGVjdGVkIiwKKy8qMjgqLyAgIlwwMDVcMDAwXDAwMlwwMTJcMDAxIgorICAgICAgICAiR0RUIEhBICV1LCBGYXVsdCBidXMgJXU6IFNIRUxGIG5vdCBPSyBkZXRlY3RlZCIsCisvKjI5Ki8gICJcMDA3XDAwMFwwMDJcMDEyXDAwMVwwMTNcMDAxIgorICAgICAgICAiR0RUIEhBICV1LCBGYXVsdCBidXMgJXUsIElEICV1OiBBdXRvIEhvdCBQbHVnIHN0YXJ0ZWQiLAorLyozMCovICAiXDAwN1wwMDBcMDAyXDAxMlwwMDFcMDEzXDAwMSIKKyAgICAgICAgIkdEVCBIQSAldSwgRmF1bHQgYnVzICV1LCBJRCAldTogbmV3IGRpc2sgZGV0ZWN0ZWQiLAorLyozMSovICAiXDAwN1wwMDBcMDAyXDAxMlwwMDFcMDEzXDAwMSIKKyAgICAgICAgIkdEVCBIQSAldSwgRmF1bHQgYnVzICV1LCBJRCAldTogb2xkIGRpc2sgZGV0ZWN0ZWQiLAorLyozMiovICAiXDAwN1wwMDBcMDAyXDAxMlwwMDFcMDEzXDAwMSIKKyAgICAgICAgIkdEVCBIQSAldSwgRmF1bHQgYnVzICV1LCBJRCAldTogcGx1Z2dpbmcgYW4gYWN0aXZlIGRpc2sgaXMgaW52YWxpZCIsCisvKjMzKi8gICJcMDA3XDAwMFwwMDJcMDEyXDAwMVwwMTNcMDAxIgorICAgICAgICAiR0RUIEhBICV1LCBGYXVsdCBidXMgJXUsIElEICV1OiBpbnZhbGlkIGRldmljZSBkZXRlY3RlZCIsCisvKjM0Ki8gICJcMDExXDAwMFwwMDJcMDEyXDAwMVwwMTNcMDAxXDAwNlwwMDQiCisgICAgICAgICJHRFQgSEEgJXUsIEZhdWx0IGJ1cyAldSwgSUQgJXU6IGluc3VmZmljaWVudCBkaXNrIGNhcGFjaXR5ICglbHUgTUIgcmVxdWlyZWQpIiwKKy8qMzUqLyAgIlwwMDdcMDAwXDAwMlwwMTJcMDAxXDAxM1wwMDEiCisgICAgICAgICJHRFQgSEEgJXUsIEZhdWx0IGJ1cyAldSwgSUQgJXU6IGRpc2sgd3JpdGUgcHJvdGVjdGVkIiwKKy8qMzYqLyAgIlwwMDdcMDAwXDAwMlwwMTJcMDAxXDAxM1wwMDEiCisgICAgICAgICJHRFQgSEEgJXUsIEZhdWx0IGJ1cyAldSwgSUQgJXU6IGRpc2sgbm90IGF2YWlsYWJsZSIsCisvKjM3Ki8gICJcMDA3XDAwMFwwMDJcMDEyXDAwMVwwMDZcMDA0IgorICAgICAgICAiR0RUIEhBICV1LCBGYXVsdCBidXMgJXU6IHN3YXAgZGV0ZWN0ZWQgKCVsdSkiLAorLyozOCovICAiXDAwN1wwMDBcMDAyXDAxMlwwMDFcMDEzXDAwMSIKKyAgICAgICAgIkdEVCBIQSAldSwgRmF1bHQgYnVzICV1LCBJRCAldTogQXV0byBIb3QgUGx1ZyBmaW5pc2hlZCBzdWNjZXNzZnVsbHkiLAorLyozOSovICAiXDAwN1wwMDBcMDAyXDAxMlwwMDFcMDEzXDAwMSIKKyAgICAgICAgIkdEVCBIQSAldSwgRmF1bHQgYnVzICV1LCBJRCAldTogQXV0byBIb3QgUGx1ZyBhYm9ydGVkIGR1ZSB0byB1c2VyIEhvdCBQbHVnIiwKKy8qNDAqLyAgIlwwMDdcMDAwXDAwMlwwMTJcMDAxXDAxM1wwMDEiCisgICAgICAgICJHRFQgSEEgJXUsIEZhdWx0IGJ1cyAldSwgSUQgJXU6IEF1dG8gSG90IFBsdWcgYWJvcnRlZCIsCisvKjQxKi8gICJcMDA3XDAwMFwwMDJcMDEyXDAwMVwwMTNcMDAxIgorICAgICAgICAiR0RUIEhBICV1LCBGYXVsdCBidXMgJXUsIElEICV1OiBBdXRvIEhvdCBQbHVnIGZvciBIb3QgRml4IHN0YXJ0ZWQiLAorLyo0MiovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBkcml2ZSBidWlsZCBzdGFydGVkIiwKKy8qNDMqLyAgIlwwMDNcMDAwXDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgRFJBTSBwYXJpdHkgZXJyb3IgZGV0ZWN0ZWQiLAorLyo0NCovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIE1pcnJvciBEcml2ZSAldTogdXBkYXRlIHN0YXJ0ZWQiLAorLyo0NSovICAiXDAwN1wwMDBcMDAyXDAwNlwwMDJcMDEwXDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgTWlycm9yIERyaXZlICV1OiBIb3QgRml4ICV1IGFjdGl2YXRlZCIsCisvKjQ2Ki8gICJcMDA1XDAwMFwwMDJcMDA2XDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgQXJyYXkgRHJpdmUgJXU6IG5vIG1hdGNoaW5nIFBvb2wgSG90IEZpeCBEcml2ZSBhdmFpbGFibGUiLAorLyo0NyovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBQb29sIEhvdCBGaXggRHJpdmUgYXZhaWxhYmxlIiwKKy8qNDgqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBNaXJyb3IgRHJpdmUgJXU6IG5vIG1hdGNoaW5nIFBvb2wgSG90IEZpeCBEcml2ZSBhdmFpbGFibGUiLAorLyo0OSovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIE1pcnJvciBEcml2ZSAldTogUG9vbCBIb3QgRml4IERyaXZlIGF2YWlsYWJsZSIsCisvKjUwKi8gICJcMDA3XDAwMFwwMDJcMDEyXDAwMVwwMTNcMDAxIgorICAgICAgICAiR0RUIEhBICV1LCBTQ1NJIGJ1cyAldSwgSUQgJXU6IElHTk9SRV9XSURFX1JFU0lEVUUgbWVzc2FnZSByZWNlaXZlZCIsCisvKjUxKi8gICJcMDA1XDAwMFwwMDJcMDA2XDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgQXJyYXkgRHJpdmUgJXU6IGV4cGFuZCBzdGFydGVkIiwKKy8qNTIqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBBcnJheSBEcml2ZSAldTogZXhwYW5kIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseSIsCisvKjUzKi8gICJcMDA1XDAwMFwwMDJcMDA2XDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgQXJyYXkgRHJpdmUgJXU6IGV4cGFuZCBmYWlsZWQiLAorLyo1NCovICAiXDAwM1wwMDBcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBDUFUgdGVtcGVyYXR1cmUgY3JpdGljYWwiLAorLyo1NSovICAiXDAwM1wwMDBcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBDUFUgdGVtcGVyYXR1cmUgT0siLAorLyo1NiovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDQiCisgICAgICAgICJHRFQgSEEgJXUsIEhvc3QgZHJpdmUgJWx1IGNyZWF0ZWQiLAorLyo1NyovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBleHBhbmQgcmVzdGFydGVkIiwKKy8qNTgqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBBcnJheSBEcml2ZSAldTogZXhwYW5kIHN0b3BwZWQiLAorLyo1OSovICAiXDAwNVwwMDBcMDAyXDAxMFwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIE1pcnJvciBEcml2ZSAldTogZHJpdmUgYnVpbGQgcXVpdGVkIiwKKy8qNjAqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBBcnJheSBEcml2ZSAldTogcGFyaXR5IGJ1aWxkIHF1aXRlZCIsCisvKjYxKi8gICJcMDA1XDAwMFwwMDJcMDA2XDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgQXJyYXkgRHJpdmUgJXU6IGRyaXZlIHJlYnVpbGQgcXVpdGVkIiwKKy8qNjIqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBBcnJheSBEcml2ZSAldTogcGFyaXR5IHZlcmlmeSBzdGFydGVkIiwKKy8qNjMqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBBcnJheSBEcml2ZSAldTogcGFyaXR5IHZlcmlmeSBkb25lIiwKKy8qNjQqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBBcnJheSBEcml2ZSAldTogcGFyaXR5IHZlcmlmeSBmYWlsZWQiLAorLyo2NSovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBwYXJpdHkgZXJyb3IgZGV0ZWN0ZWQiLAorLyo2NiovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBwYXJpdHkgdmVyaWZ5IHF1aXRlZCIsCisvKjY3Ki8gICJcMDA1XDAwMFwwMDJcMDA2XDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgSG9zdCBEcml2ZSAldSByZXNlcnZlZCIsCisvKjY4Ki8gICJcMDA1XDAwMFwwMDJcMDA2XDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgSG9zdCBEcml2ZSAldSBtb3VudGVkIGFuZCByZWxlYXNlZCIsCisvKjY5Ki8gICJcMDA1XDAwMFwwMDJcMDA2XDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgSG9zdCBEcml2ZSAldSByZWxlYXNlZCIsCisvKjcwKi8gICJcMDAzXDAwMFwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIERSQU0gZXJyb3IgZGV0ZWN0ZWQgYW5kIGNvcnJlY3RlZCB3aXRoIEVDQyIsCisvKjcxKi8gICJcMDAzXDAwMFwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIFVuY29ycmVjdGFibGUgRFJBTSBlcnJvciBkZXRlY3RlZCB3aXRoIEVDQyIsCisvKjcyKi8gICJcMDExXDAwMFwwMDJcMDEyXDAwMVwwMTNcMDAxXDAxNFwwMDEiCisgICAgICAgICJHRFQgSEEgJXUsIFNDU0kgYnVzICV1LCBJRCAldSwgTFVOICV1OiByZWFzc2lnbmluZyBibG9jayIsCisvKjczKi8gICJcMDA1XDAwMFwwMDJcMDA2XDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgSG9zdCBkcml2ZSAldSByZXNldHRlZCBsb2NhbGx5IiwKKy8qNzQqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBIb3N0IGRyaXZlICV1IHJlc2V0dGVkIHJlbW90ZWx5IiwKKy8qNzUqLyAgIlwwMDNcMDAwXDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgYXN5bmMuIHN0YXR1cyA3NSB1bmtub3duIiwKK307CisKKworc3RhdGljIGludCBnZHRoX2FzeW5jX2V2ZW50KGludCBoYW51bSkKK3sKKyAgICBnZHRoX2hhX3N0ciAqaGE7CisgICAgZ2R0aF9jbWRfc3RyICpjbWRwOworICAgIGludCBjbWRfaW5kZXg7CisKKyAgICBoYSAgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgY21kcD0gaGEtPnBjY2I7CisgICAgVFJBQ0UyKCgiZ2R0aF9hc3luY19ldmVudCgpIGhhICVkIHNlcnYgJWRcbiIsCisgICAgICAgICAgICBoYW51bSxoYS0+c2VydmljZSkpOworCisgICAgaWYgKGhhLT5zZXJ2aWNlID09IFNDUkVFTlNFUlZJQ0UpIHsKKyAgICAgICAgaWYgKGhhLT5zdGF0dXMgPT0gTVNHX1JFUVVFU1QpIHsKKyAgICAgICAgICAgIHdoaWxlIChnZHRoX3Rlc3RfYnVzeShoYW51bSkpCisgICAgICAgICAgICAgICAgZ2R0aF9kZWxheSgwKTsKKyAgICAgICAgICAgIGNtZHAtPlNlcnZpY2UgICAgICAgPSBTQ1JFRU5TRVJWSUNFOworICAgICAgICAgICAgY21kcC0+UmVxdWVzdEJ1ZmZlciA9IFNDUkVFTl9DTU5EOworICAgICAgICAgICAgY21kX2luZGV4ID0gZ2R0aF9nZXRfY21kX2luZGV4KGhhbnVtKTsKKyAgICAgICAgICAgIGdkdGhfc2V0X3NlbWEwKGhhbnVtKTsKKyAgICAgICAgICAgIGNtZHAtPk9wQ29kZSAgICAgICAgPSBHRFRfUkVBRDsKKyAgICAgICAgICAgIGNtZHAtPkJvYXJkTm9kZSAgICAgPSBMT0NBTEJPQVJEOworICAgICAgICAgICAgY21kcC0+dS5zY3JlZW4ucmVzZXJ2ZWQgID0gMDsKKyAgICAgICAgICAgIGNtZHAtPnUuc2NyZWVuLnN1Lm1zZy5tc2dfaGFuZGxlPSBNU0dfSU5WX0hBTkRMRTsKKyAgICAgICAgICAgIGNtZHAtPnUuc2NyZWVuLnN1Lm1zZy5tc2dfYWRkciAgPSBoYS0+bXNnX3BoeXM7CisgICAgICAgICAgICBoYS0+Y21kX29mZnNfZHBtZW0gPSAwOworICAgICAgICAgICAgaGEtPmNtZF9sZW4gPSBHRFRPRkZTT0YoZ2R0aF9jbWRfc3RyLHUuc2NyZWVuLnN1Lm1zZy5tc2dfYWRkcikgCisgICAgICAgICAgICAgICAgKyBzaXplb2YodWxvbmc2NCk7CisgICAgICAgICAgICBoYS0+Y21kX2NudCA9IDA7CisgICAgICAgICAgICBnZHRoX2NvcHlfY29tbWFuZChoYW51bSk7CisgICAgICAgICAgICBpZiAoaGEtPnR5cGUgPT0gR0RUX0VJU0EpCisgICAgICAgICAgICAgICAgcHJpbnRrKCJbRUlTQSBzbG90ICVkXSAiLCh1c2hvcnQpaGEtPmJyZF9waHlzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGhhLT50eXBlID09IEdEVF9JU0EpCisgICAgICAgICAgICAgICAgcHJpbnRrKCJbRFBNRU0gMHglNFhdICIsKHVzaG9ydCloYS0+YnJkX3BoeXMpOworICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICBwcmludGsoIltQQ0kgJWQvJWRdICIsKHVzaG9ydCkoaGEtPmJyZF9waHlzPj44KSwKKyAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkoKGhhLT5icmRfcGh5cz4+MykmMHgxZikpOworICAgICAgICAgICAgZ2R0aF9yZWxlYXNlX2V2ZW50KGhhbnVtKTsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGhhLT50eXBlID09IEdEVF9QQ0lNUFIgJiYgCisgICAgICAgICAgICAoaGEtPmZ3X3ZlcnMgJiAweGZmKSA+PSAweDFhKSB7CisgICAgICAgICAgICBoYS0+ZHZyLnNpemUgPSAwOworICAgICAgICAgICAgaGEtPmR2ci5ldS5hc3luYy5pb25vZGUgPSBoYW51bTsKKyAgICAgICAgICAgIGhhLT5kdnIuZXUuYXN5bmMuc3RhdHVzICA9IGhhLT5zdGF0dXM7CisgICAgICAgICAgICAvKiBzZXZlcml0eSBhbmQgZXZlbnRfc3RyaW5nIGFscmVhZHkgc2V0ISAqLworICAgICAgICB9IGVsc2UgeyAgICAgICAgCisgICAgICAgICAgICBoYS0+ZHZyLnNpemUgPSBzaXplb2YoaGEtPmR2ci5ldS5hc3luYyk7CisgICAgICAgICAgICBoYS0+ZHZyLmV1LmFzeW5jLmlvbm9kZSAgID0gaGFudW07CisgICAgICAgICAgICBoYS0+ZHZyLmV1LmFzeW5jLnNlcnZpY2UgPSBoYS0+c2VydmljZTsKKyAgICAgICAgICAgIGhhLT5kdnIuZXUuYXN5bmMuc3RhdHVzICA9IGhhLT5zdGF0dXM7CisgICAgICAgICAgICBoYS0+ZHZyLmV1LmFzeW5jLmluZm8gICAgPSBoYS0+aW5mbzsKKyAgICAgICAgICAgICoodWxvbmczMiAqKWhhLT5kdnIuZXUuYXN5bmMuc2NzaV9jb29yZCAgPSBoYS0+aW5mbzI7CisgICAgICAgIH0KKyAgICAgICAgZ2R0aF9zdG9yZV9ldmVudCggaGEsIEVTX0FTWU5DLCBoYS0+c2VydmljZSwgJmhhLT5kdnIgKTsKKyAgICAgICAgZ2R0aF9sb2dfZXZlbnQoICZoYS0+ZHZyLCBOVUxMICk7CisgICAgCisgICAgICAgIC8qIG5ldyBob3N0IGRyaXZlIGZyb20gZXhwYW5kPyAqLworICAgICAgICBpZiAoaGEtPnNlcnZpY2UgPT0gQ0FDSEVTRVJWSUNFICYmIGhhLT5zdGF0dXMgPT0gNTYpIHsKKyAgICAgICAgICAgIFRSQUNFMigoImdkdGhfYXN5bmNfZXZlbnQoKTogbmV3IGhvc3QgZHJpdmUgJWQgY3JlYXRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCloYS0+aW5mbykpOworICAgICAgICAgICAgLyogZ2R0aF9hbmFseXNlX2hkcml2ZShoYW51bSwgKHVzaG9ydCloYS0+aW5mbyk7ICovCisgICAgICAgIH0gICAKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGdkdGhfbG9nX2V2ZW50KGdkdGhfZXZ0X2RhdGEgKmR2ciwgY2hhciAqYnVmZmVyKQoreworICAgIGdkdGhfc3RhY2tmcmFtZSBzdGFjazsKKyAgICBjaGFyICpmID0gTlVMTDsKKyAgICBpbnQgaSxqOworCisgICAgVFJBQ0UyKCgiZ2R0aF9sb2dfZXZlbnQoKVxuIikpOworICAgIGlmIChkdnItPnNpemUgPT0gMCkgeworICAgICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHByaW50aygiQWRhcHRlciAlZDogJXNcbiIsZHZyLT5ldS5hc3luYy5pb25vZGUsZHZyLT5ldmVudF9zdHJpbmcpOyAKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCJBZGFwdGVyICVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBkdnItPmV1LmFzeW5jLmlvbm9kZSxkdnItPmV2ZW50X3N0cmluZyk7IAorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChkdnItPmV1LmFzeW5jLnNlcnZpY2UgPT0gQ0FDSEVTRVJWSUNFICYmIAorICAgICAgICBJTkRFWF9PSyhkdnItPmV1LmFzeW5jLnN0YXR1cywgYXN5bmNfY2FjaGVfdGFiKSkgeworICAgICAgICBUUkFDRTIoKCJHRFQ6IEFzeW5jLiBldmVudCBjYWNoZSBzZXJ2aWNlLCBldmVudCBuby46ICVkXG4iLAorICAgICAgICAgICAgICAgIGR2ci0+ZXUuYXN5bmMuc3RhdHVzKSk7CisgICAgICAgIAorICAgICAgICBmID0gYXN5bmNfY2FjaGVfdGFiW2R2ci0+ZXUuYXN5bmMuc3RhdHVzXTsKKyAgICAgICAgCisgICAgICAgIC8qIGk6IHBhcmFtZXRlciB0byBwdXNoLCBqOiBzdGFjayBlbGVtZW50IHRvIGZpbGwgKi8KKyAgICAgICAgZm9yIChqPTAsaT0xOyBpIDwgZlswXTsgaSs9MikgeworICAgICAgICAgICAgc3dpdGNoIChmW2krMV0pIHsKKyAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIHN0YWNrLmJbaisrXSA9ICoodWxvbmczMiopJmR2ci0+ZXUuc3RyZWFtWyhpbnQpZltpXV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBzdGFjay5iW2orK10gPSAqKHVzaG9ydCopJmR2ci0+ZXUuc3RyZWFtWyhpbnQpZltpXV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBzdGFjay5iW2orK10gPSAqKHVuY2hhciopJmR2ci0+ZXUuc3RyZWFtWyhpbnQpZltpXV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgcHJpbnRrKCZmWyhpbnQpZlswXV0sc3RhY2spOyAKKyAgICAgICAgICAgIHByaW50aygiXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCZmWyhpbnQpZlswXV0sc3RhY2spOyAKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBwcmludGsoIkdEVCBIQSAldSwgVW5rbm93biBhc3luYy4gZXZlbnQgc2VydmljZSAlZCBldmVudCBuby4gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgZHZyLT5ldS5hc3luYy5pb25vZGUsZHZyLT5ldS5hc3luYy5zZXJ2aWNlLGR2ci0+ZXUuYXN5bmMuc3RhdHVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCJHRFQgSEEgJXUsIFVua25vd24gYXN5bmMuIGV2ZW50IHNlcnZpY2UgJWQgZXZlbnQgbm8uICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZHZyLT5ldS5hc3luYy5pb25vZGUsZHZyLT5ldS5hc3luYy5zZXJ2aWNlLGR2ci0+ZXUuYXN5bmMuc3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KK30KKworI2lmZGVmIEdEVEhfU1RBVElTVElDUwordm9pZCBnZHRoX3RpbWVvdXQodWxvbmcgZGF0YSkKK3sKKyAgICB1bG9uZzMyIGk7CisgICAgU2NzaV9DbW5kICpuc2NwOworICAgIGdkdGhfaGFfc3RyICpoYTsKKyAgICB1bG9uZyBmbGFnczsKKyAgICBpbnQgaGFudW0gPSAwOworCisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworCisgICAgZm9yIChhY3Rfc3RhdHM9MCxpPTA7IGk8R0RUSF9NQVhDTURTOyArK2kpIAorICAgICAgICBpZiAoaGEtPmNtZF90YWJbaV0uY21uZCAhPSBVTlVTRURfQ01ORCkKKyAgICAgICAgICAgICsrYWN0X3N0YXRzOworCisgICAgZm9yIChhY3RfcnE9MCxuc2NwPWhhLT5yZXFfZmlyc3Q7IG5zY3A7IG5zY3A9KFNjc2lfQ21uZCopbnNjcC0+U0NwLnB0cikKKyAgICAgICAgKythY3RfcnE7CisKKyAgICBUUkFDRTIoKCJnZHRoX3RvKCk6IGludHMgJWQsIGlvcyAlZCwgYWN0X3N0YXRzICVkLCBhY3RfcnEgJWRcbiIsCisgICAgICAgICAgICBhY3RfaW50cywgYWN0X2lvcywgYWN0X3N0YXRzLCBhY3RfcnEpKTsKKyAgICBhY3RfaW50cyA9IGFjdF9pb3MgPSAwOworCisgICAgZ2R0aF90aW1lci5leHBpcmVzID0gamlmZmllcyArIDMwICogSFo7CisgICAgYWRkX3RpbWVyKCZnZHRoX3RpbWVyKTsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKK30KKyNlbmRpZgorCit2b2lkIF9faW5pdCBpbnRlcm5hbF9zZXR1cChjaGFyICpzdHIsaW50ICppbnRzKQoreworICAgIGludCBpLCBhcmdjOworICAgIGNoYXIgKmN1cl9zdHIsICphcmd2OworCisgICAgVFJBQ0UyKCgiaW50ZXJuYWxfc2V0dXAoKSBzdHIgJXMgaW50c1swXSAlZFxuIiwgCisgICAgICAgICAgICBzdHIgPyBzdHI6Ik5VTEwiLCBpbnRzID8gaW50c1swXTowKSk7CisKKyAgICAvKiByZWFkIGlycVtdIGZyb20gaW50c1tdICovCisgICAgaWYgKGludHMpIHsKKyAgICAgICAgYXJnYyA9IGludHNbMF07CisgICAgICAgIGlmIChhcmdjID4gMCkgeworICAgICAgICAgICAgaWYgKGFyZ2MgPiBNQVhIQSkKKyAgICAgICAgICAgICAgICBhcmdjID0gTUFYSEE7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgKytpKQorICAgICAgICAgICAgICAgIGlycVtpXSA9IGludHNbaSsxXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGFuYWx5c2Ugc3RyaW5nICovCisgICAgYXJndiA9IHN0cjsKKyAgICB3aGlsZSAoYXJndiAmJiAoY3VyX3N0ciA9IHN0cmNocihhcmd2LCAnOicpKSkgeworICAgICAgICBpbnQgdmFsID0gMCwgYyA9ICorK2N1cl9zdHI7CisgICAgICAgIAorICAgICAgICBpZiAoYyA9PSAnbicgfHwgYyA9PSAnTicpCisgICAgICAgICAgICB2YWwgPSAwOworICAgICAgICBlbHNlIGlmIChjID09ICd5JyB8fCBjID09ICdZJykKKyAgICAgICAgICAgIHZhbCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbCA9IChpbnQpc2ltcGxlX3N0cnRvdWwoY3VyX3N0ciwgTlVMTCwgMCk7CisKKyAgICAgICAgaWYgKCFzdHJuY21wKGFyZ3YsICJkaXNhYmxlOiIsIDgpKQorICAgICAgICAgICAgZGlzYWJsZSA9IHZhbDsKKyAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoYXJndiwgInJlc2VydmVfbW9kZToiLCAxMykpCisgICAgICAgICAgICByZXNlcnZlX21vZGUgPSB2YWw7CisgICAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGFyZ3YsICJyZXZlcnNlX3NjYW46IiwgMTMpKQorICAgICAgICAgICAgcmV2ZXJzZV9zY2FuID0gdmFsOworICAgICAgICBlbHNlIGlmICghc3RybmNtcChhcmd2LCAiaGRyX2NoYW5uZWw6IiwgMTIpKQorICAgICAgICAgICAgaGRyX2NoYW5uZWwgPSB2YWw7CisgICAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGFyZ3YsICJtYXhfaWRzOiIsIDgpKQorICAgICAgICAgICAgbWF4X2lkcyA9IHZhbDsKKyAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoYXJndiwgInJlc2NhbjoiLCA3KSkKKyAgICAgICAgICAgIHJlc2NhbiA9IHZhbDsKKyAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoYXJndiwgInZpcnRfY3RyOiIsIDkpKQorICAgICAgICAgICAgdmlydF9jdHIgPSB2YWw7CisgICAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGFyZ3YsICJzaGFyZWRfYWNjZXNzOiIsIDE0KSkKKyAgICAgICAgICAgIHNoYXJlZF9hY2Nlc3MgPSB2YWw7CisgICAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGFyZ3YsICJwcm9iZV9laXNhX2lzYToiLCAxNSkpCisgICAgICAgICAgICBwcm9iZV9laXNhX2lzYSA9IHZhbDsKKyAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoYXJndiwgInJlc2VydmVfbGlzdDoiLCAxMykpIHsKKyAgICAgICAgICAgIHJlc2VydmVfbGlzdFswXSA9IHZhbDsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBNQVhfUkVTX0FSR1M7IGkrKykgeworICAgICAgICAgICAgICAgIGN1cl9zdHIgPSBzdHJjaHIoY3VyX3N0ciwgJywnKTsKKyAgICAgICAgICAgICAgICBpZiAoIWN1cl9zdHIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmICghaXNkaWdpdCgoaW50KSorK2N1cl9zdHIpKSB7CisgICAgICAgICAgICAgICAgICAgIC0tY3VyX3N0cjsgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXNlcnZlX2xpc3RbaV0gPSAKKyAgICAgICAgICAgICAgICAgICAgKGludClzaW1wbGVfc3RydG91bChjdXJfc3RyLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghY3VyX3N0cikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGFyZ3YgPSArK2N1cl9zdHI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoYXJndiA9IHN0cmNocihhcmd2LCAnLCcpKSkKKyAgICAgICAgICAgICsrYXJndjsKKyAgICB9Cit9CisKK2ludCBfX2luaXQgb3B0aW9uX3NldHVwKGNoYXIgKnN0cikKK3sKKyAgICBpbnQgaW50c1tNQVhIQV07CisgICAgY2hhciAqY3VyID0gc3RyOworICAgIGludCBpID0gMTsKKworICAgIFRSQUNFMigoIm9wdGlvbl9zZXR1cCgpIHN0ciAlc1xuIiwgc3RyID8gc3RyOiJOVUxMIikpOyAKKworICAgIHdoaWxlIChjdXIgJiYgaXNkaWdpdCgqY3VyKSAmJiBpIDw9IE1BWEhBKSB7CisgICAgICAgIGludHNbaSsrXSA9IHNpbXBsZV9zdHJ0b3VsKGN1ciwgTlVMTCwgMCk7CisgICAgICAgIGlmICgoY3VyID0gc3RyY2hyKGN1ciwgJywnKSkgIT0gTlVMTCkgY3VyKys7CisgICAgfQorCisgICAgaW50c1swXSA9IGkgLSAxOworICAgIGludGVybmFsX3NldHVwKGN1ciwgaW50cyk7CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBfX2luaXQgZ2R0aF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICpzaHRwKQoreworICAgIHN0cnVjdCBTY3NpX0hvc3QgKnNocDsKKyAgICBnZHRoX3BjaV9zdHIgcGNpc3RyW01BWEhBXTsKKyAgICBnZHRoX2hhX3N0ciAqaGE7CisgICAgdWxvbmczMiBpc2FfYmlvczsKKyAgICB1c2hvcnQgZWlzYV9zbG90OworICAgIGludCBpLGhhbnVtLGNudCxjdHIsZXJyOworICAgIHVuY2hhciBiOworICAgIAorIAorI2lmZGVmIERFQlVHX0dEVEgKKyAgICBwcmludGsoIkdEVDogVGhpcyBkcml2ZXIgY29udGFpbnMgZGVidWdnaW5nIGluZm9ybWF0aW9uICEhIFRyYWNlIGxldmVsID0gJWRcbiIsCisgICAgICAgIERlYnVnU3RhdGUpOworICAgIHByaW50aygiICAgICBEZXN0aW5hdGlvbiBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb246ICIpOworI2lmZGVmIF9fU0VSSUFMX18KKyNpZmRlZiBfX0NPTTJfXworICAgIHByaW50aygiU2VyaWFsIHBvcnQgQ09NMlxuIik7CisjZWxzZQorICAgIHByaW50aygiU2VyaWFsIHBvcnQgQ09NMVxuIik7CisjZW5kaWYKKyNlbHNlCisgICAgcHJpbnRrKCJDb25zb2xlXG4iKTsKKyNlbmRpZgorICAgIGdkdGhfZGVsYXkoMzAwMCk7CisjZW5kaWYKKworICAgIFRSQUNFKCgiZ2R0aF9kZXRlY3QoKVxuIikpOworCisgICAgaWYgKGRpc2FibGUpIHsKKyAgICAgICAgcHJpbnRrKCJHRFQtSEE6IENvbnRyb2xsZXIgZHJpdmVyIGRpc2FibGVkIGZyb20gY29tbWFuZCBsaW5lICFcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwcmludGsoIkdEVC1IQTogU3RvcmFnZSBSQUlEIENvbnRyb2xsZXIgRHJpdmVyLiBWZXJzaW9uOiAlcyBcbiIsR0RUSF9WRVJTSU9OX1NUUik7CisgICAgLyogaW5pdGlhbGl6YXRpb25zICovCisgICAgZ2R0aF9wb2xsaW5nID0gVFJVRTsgYiA9IDA7CisgICAgZ2R0aF9jbGVhcl9ldmVudHMoKTsKKworICAgIC8qIEFzIGRlZmF1bHQgd2UgZG8gbm90IHByb2JlIGZvciBFSVNBIG9yIElTQSBjb250cm9sbGVycyAqLworICAgIGlmIChwcm9iZV9laXNhX2lzYSkgeyAgICAKKyAgICAgICAgLyogc2Nhbm5pbmcgZm9yIGNvbnRyb2xsZXJzLCBhdCBmaXJzdDogSVNBIGNvbnRyb2xsZXIgKi8KKyAgICAgICAgZm9yIChpc2FfYmlvcz0weGM4MDAwVUw7IGlzYV9iaW9zPD0weGQ4MDAwVUw7IGlzYV9iaW9zKz0weDgwMDBVTCkgeworICAgICAgICAgICAgZG1hX2FkZHJfdCBzY3JhdGNoX2RtYV9oYW5kbGU7CisgICAgICAgICAgICBzY3JhdGNoX2RtYV9oYW5kbGUgPSAwOworCisgICAgICAgICAgICBpZiAoZ2R0aF9jdHJfY291bnQgPj0gTUFYSEEpIAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKGdkdGhfc2VhcmNoX2lzYShpc2FfYmlvcykpIHsgICAgICAgIC8qIGNvbnRyb2xsZXIgZm91bmQgKi8KKyAgICAgICAgICAgICAgICBzaHAgPSBzY3NpX3JlZ2lzdGVyKHNodHAsc2l6ZW9mKGdkdGhfZXh0X3N0cikpOworICAgICAgICAgICAgICAgIGlmIChzaHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAKKworICAgICAgICAgICAgICAgIGhhID0gSEFEQVRBKHNocCk7CisgICAgICAgICAgICAgICAgaWYgKCFnZHRoX2luaXRfaXNhKGlzYV9iaW9zLGhhKSkgeworICAgICAgICAgICAgICAgICAgICBzY3NpX3VucmVnaXN0ZXIoc2hwKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIF9faWE2NF9fCisgICAgICAgICAgICAgICAgYnJlYWs7CisjZWxzZQorICAgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIgZm91bmQgYW5kIGluaXRpYWxpemVkICovCisgICAgICAgICAgICAgICAgcHJpbnRrKCJDb25maWd1cmluZyBHRFQtSVNBIEhBIGF0IEJJT1MgMHglMDVYIElSUSAldSBEUlEgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGlzYV9iaW9zLGhhLT5pcnEsaGEtPmRycSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVxdWVzdF9pcnEoaGEtPmlycSxnZHRoX2ludGVycnVwdCxTQV9JTlRFUlJVUFQsImdkdGgiLGhhKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1JU0E6IFVuYWJsZSB0byBhbGxvY2F0ZSBJUlFcbiIpOworICAgICAgICAgICAgICAgICAgICBzY3NpX3VucmVnaXN0ZXIoc2hwKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0X2RtYShoYS0+ZHJxLCJnZHRoIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtSVNBOiBVbmFibGUgdG8gYWxsb2NhdGUgRE1BIGNoYW5uZWxcbiIpOworICAgICAgICAgICAgICAgICAgICBmcmVlX2lycShoYS0+aXJxLGhhKTsKKyAgICAgICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXRfZG1hX21vZGUoaGEtPmRycSxETUFfTU9ERV9DQVNDQURFKTsKKyAgICAgICAgICAgICAgICBlbmFibGVfZG1hKGhhLT5kcnEpOworICAgICAgICAgICAgICAgIHNocC0+dW5jaGVja2VkX2lzYV9kbWEgPSAxOworICAgICAgICAgICAgICAgIHNocC0+aXJxID0gaGEtPmlycTsKKyAgICAgICAgICAgICAgICBzaHAtPmRtYV9jaGFubmVsID0gaGEtPmRycTsKKyAgICAgICAgICAgICAgICBoYW51bSA9IGdkdGhfY3RyX2NvdW50OyAgICAgICAgIAorICAgICAgICAgICAgICAgIGdkdGhfY3RyX3RhYltnZHRoX2N0cl9jb3VudCsrXSA9IHNocDsKKyAgICAgICAgICAgICAgICBnZHRoX2N0cl92dGFiW2dkdGhfY3RyX3Zjb3VudCsrXSA9IHNocDsKKworICAgICAgICAgICAgICAgIE5VTURBVEEoc2hwKS0+aGFudW0gPSAodXNob3J0KWhhbnVtOworICAgICAgICAgICAgICAgIE5VTURBVEEoc2hwKS0+YnVzbnVtPSAwOworCisgICAgICAgICAgICAgICAgaGEtPnBjY2IgPSBDTUREQVRBKHNocCk7CisgICAgICAgICAgICAgICAgaGEtPmNjYl9waHlzID0gMEw7CisgICAgICAgICAgICAgICAgaGEtPnBkZXYgPSBOVUxMOworICAgICAgICAgICAgICAgIGhhLT5wc2NyYXRjaCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGhhLT5wZGV2LCBHRFRIX1NDUkFUQ0gsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JhdGNoX2RtYV9oYW5kbGUpOworICAgICAgICAgICAgICAgIGhhLT5zY3JhdGNoX3BoeXMgPSBzY3JhdGNoX2RtYV9oYW5kbGU7CisgICAgICAgICAgICAgICAgaGEtPnBtc2cgPSBwY2lfYWxsb2NfY29uc2lzdGVudChoYS0+cGRldiwgc2l6ZW9mKGdkdGhfbXNnX3N0ciksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmF0Y2hfZG1hX2hhbmRsZSk7CisgICAgICAgICAgICAgICAgaGEtPm1zZ19waHlzID0gc2NyYXRjaF9kbWFfaGFuZGxlOworI2lmZGVmIElOVF9DT0FMCisgICAgICAgICAgICAgICAgaGEtPmNvYWxfc3RhdCA9IChnZHRoX2NvYWxfc3RhdHVzICopCisgICAgICAgICAgICAgICAgICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KGhhLT5wZGV2LCBzaXplb2YoZ2R0aF9jb2FsX3N0YXR1cykgKgorICAgICAgICAgICAgICAgICAgICAgICAgTUFYT0ZGU0VUUywgJnNjcmF0Y2hfZG1hX2hhbmRsZSk7CisgICAgICAgICAgICAgICAgaGEtPmNvYWxfc3RhdF9waHlzID0gc2NyYXRjaF9kbWFfaGFuZGxlOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBoYS0+c2NyYXRjaF9idXN5ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgaGEtPnJlcV9maXJzdCA9IE5VTEw7CisgICAgICAgICAgICAgICAgaGEtPnRpZF9jbnQgPSBNQVhfSERSSVZFUzsKKyAgICAgICAgICAgICAgICBpZiAobWF4X2lkcyA+IDAgJiYgbWF4X2lkcyA8IGhhLT50aWRfY250KQorICAgICAgICAgICAgICAgICAgICBoYS0+dGlkX2NudCA9IG1heF9pZHM7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8R0RUSF9NQVhDTURTOyArK2kpCisgICAgICAgICAgICAgICAgICAgIGhhLT5jbWRfdGFiW2ldLmNtbmQgPSBVTlVTRURfQ01ORDsKKyAgICAgICAgICAgICAgICBoYS0+c2Nhbl9tb2RlID0gcmVzY2FuID8gMHgxMCA6IDA7CisKKyAgICAgICAgICAgICAgICBpZiAoaGEtPnBzY3JhdGNoID09IE5VTEwgfHwgaGEtPnBtc2cgPT0gTlVMTCB8fCAKKyAgICAgICAgICAgICAgICAgICAgIWdkdGhfc2VhcmNoX2RyaXZlcyhoYW51bSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtSVNBOiBFcnJvciBkdXJpbmcgZGV2aWNlIHNjYW5cbiIpOworICAgICAgICAgICAgICAgICAgICAtLWdkdGhfY3RyX2NvdW50OworICAgICAgICAgICAgICAgICAgICAtLWdkdGhfY3RyX3Zjb3VudDsKKworI2lmZGVmIElOVF9DT0FMCisgICAgICAgICAgICAgICAgICAgIGlmIChoYS0+Y29hbF9zdGF0KQorICAgICAgICAgICAgICAgICAgICAgICAgcGNpX2ZyZWVfY29uc2lzdGVudChoYS0+cGRldiwgc2l6ZW9mKGdkdGhfY29hbF9zdGF0dXMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYT0ZGU0VUUywgaGEtPmNvYWxfc3RhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGEtPmNvYWxfc3RhdF9waHlzKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBpZiAoaGEtPnBzY3JhdGNoKQorICAgICAgICAgICAgICAgICAgICAgICAgcGNpX2ZyZWVfY29uc2lzdGVudChoYS0+cGRldiwgR0RUSF9TQ1JBVENILCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGEtPnBzY3JhdGNoLCBoYS0+c2NyYXRjaF9waHlzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhLT5wbXNnKQorICAgICAgICAgICAgICAgICAgICAgICAgcGNpX2ZyZWVfY29uc2lzdGVudChoYS0+cGRldiwgc2l6ZW9mKGdkdGhfbXNnX3N0ciksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYS0+cG1zZywgaGEtPm1zZ19waHlzKTsKKworICAgICAgICAgICAgICAgICAgICBmcmVlX2lycShoYS0+aXJxLGhhKTsKKyAgICAgICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGRyX2NoYW5uZWwgPCAwIHx8IGhkcl9jaGFubmVsID4gaGEtPmJ1c19jbnQpCisgICAgICAgICAgICAgICAgICAgIGhkcl9jaGFubmVsID0gaGEtPmJ1c19jbnQ7CisgICAgICAgICAgICAgICAgaGEtPnZpcnRfYnVzID0gaGRyX2NoYW5uZWw7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKSAmJiBcCisgICAgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgICAgICAgICAgICAgc2hwLT5oaWdobWVtX2lvICA9IDA7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAoaGEtPmNhY2hlX2ZlYXQgJiBoYS0+cmF3X2ZlYXQgJiBoYS0+c2NyZWVuX2ZlYXQgJiBHRFRfNjRCSVQpIAorICAgICAgICAgICAgICAgICAgICBzaHAtPm1heF9jbWRfbGVuID0gMTY7CisKKyAgICAgICAgICAgICAgICBzaHAtPm1heF9pZCAgICAgID0gaGEtPnRpZF9jbnQ7CisgICAgICAgICAgICAgICAgc2hwLT5tYXhfbHVuICAgICA9IE1BWExVTjsKKyAgICAgICAgICAgICAgICBzaHAtPm1heF9jaGFubmVsID0gdmlydF9jdHIgPyAwIDogaGEtPmJ1c19jbnQ7CisgICAgICAgICAgICAgICAgaWYgKHZpcnRfY3RyKSB7CisgICAgICAgICAgICAgICAgICAgIHZpcnRfY3RyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgYWRkaXQuIFNDU0kgY2hhbm5lbHMgYXMgdmlydHVhbCBjb250cm9sbGVycyAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGIgPSAxOyBiIDwgaGEtPmJ1c19jbnQgKyAxOyArK2IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNocCA9IHNjc2lfcmVnaXN0ZXIoc2h0cCxzaXplb2YoZ2R0aF9udW1fc3RyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzaHAtPnVuY2hlY2tlZF9pc2FfZG1hID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNocC0+aXJxID0gaGEtPmlycTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNocC0+ZG1hX2NoYW5uZWwgPSBoYS0+ZHJxOworICAgICAgICAgICAgICAgICAgICAgICAgZ2R0aF9jdHJfdnRhYltnZHRoX2N0cl92Y291bnQrK10gPSBzaHA7CisgICAgICAgICAgICAgICAgICAgICAgICBOVU1EQVRBKHNocCktPmhhbnVtID0gKHVzaG9ydCloYW51bTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTURBVEEoc2hwKS0+YnVzbnVtID0gYjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gIAorCisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2luaXQoJmhhLT5zbXBfbG9jayk7CisgICAgICAgICAgICAgICAgZ2R0aF9lbmFibGVfaW50KGhhbnVtKTsKKyNlbmRpZiAvKiAhX19pYTY0X18gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIHNjYW5uaW5nIGZvciBFSVNBIGNvbnRyb2xsZXJzICovCisgICAgICAgIGZvciAoZWlzYV9zbG90PTB4MTAwMDsgZWlzYV9zbG90PD0weDgwMDA7IGVpc2Ffc2xvdCs9MHgxMDAwKSB7CisgICAgICAgICAgICBkbWFfYWRkcl90IHNjcmF0Y2hfZG1hX2hhbmRsZTsKKyAgICAgICAgICAgIHNjcmF0Y2hfZG1hX2hhbmRsZSA9IDA7CisKKyAgICAgICAgICAgIGlmIChnZHRoX2N0cl9jb3VudCA+PSBNQVhIQSkgCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoZ2R0aF9zZWFyY2hfZWlzYShlaXNhX3Nsb3QpKSB7ICAgICAgLyogY29udHJvbGxlciBmb3VuZCAqLworICAgICAgICAgICAgICAgIHNocCA9IHNjc2lfcmVnaXN0ZXIoc2h0cCxzaXplb2YoZ2R0aF9leHRfc3RyKSk7CisgICAgICAgICAgICAgICAgaWYgKHNocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgIAorCisgICAgICAgICAgICAgICAgaGEgPSBIQURBVEEoc2hwKTsKKyAgICAgICAgICAgICAgICBpZiAoIWdkdGhfaW5pdF9laXNhKGVpc2Ffc2xvdCxoYSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIGZvdW5kIGFuZCBpbml0aWFsaXplZCAqLworICAgICAgICAgICAgICAgIHByaW50aygiQ29uZmlndXJpbmcgR0RULUVJU0EgSEEgYXQgU2xvdCAlZCBJUlEgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGVpc2Ffc2xvdD4+MTIsaGEtPmlycSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVxdWVzdF9pcnEoaGEtPmlycSxnZHRoX2ludGVycnVwdCxTQV9JTlRFUlJVUFQsImdkdGgiLGhhKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1FSVNBOiBVbmFibGUgdG8gYWxsb2NhdGUgSVJRXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaHAtPnVuY2hlY2tlZF9pc2FfZG1hID0gMDsKKyAgICAgICAgICAgICAgICBzaHAtPmlycSA9IGhhLT5pcnE7CisgICAgICAgICAgICAgICAgc2hwLT5kbWFfY2hhbm5lbCA9IDB4ZmY7CisgICAgICAgICAgICAgICAgaGFudW0gPSBnZHRoX2N0cl9jb3VudDsKKyAgICAgICAgICAgICAgICBnZHRoX2N0cl90YWJbZ2R0aF9jdHJfY291bnQrK10gPSBzaHA7CisgICAgICAgICAgICAgICAgZ2R0aF9jdHJfdnRhYltnZHRoX2N0cl92Y291bnQrK10gPSBzaHA7CisKKyAgICAgICAgICAgICAgICBOVU1EQVRBKHNocCktPmhhbnVtID0gKHVzaG9ydCloYW51bTsKKyAgICAgICAgICAgICAgICBOVU1EQVRBKHNocCktPmJ1c251bT0gMDsKKyAgICAgICAgICAgICAgICBUUkFDRTIoKCJFSVNBIGRldGVjdCBCdXMgMDogaGFudW0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBOVU1EQVRBKHNocCktPmhhbnVtKSk7CisKKyAgICAgICAgICAgICAgICBoYS0+cGNjYiA9IENNRERBVEEoc2hwKTsKKyAgICAgICAgICAgICAgICBoYS0+Y2NiX3BoeXMgPSAwTDsgCisKKyAgICAgICAgICAgICAgICBoYS0+cGRldiA9IE5VTEw7CisgICAgICAgICAgICAgICAgaGEtPnBzY3JhdGNoID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGEtPnBkZXYsIEdEVEhfU0NSQVRDSCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmF0Y2hfZG1hX2hhbmRsZSk7CisgICAgICAgICAgICAgICAgaGEtPnNjcmF0Y2hfcGh5cyA9IHNjcmF0Y2hfZG1hX2hhbmRsZTsKKyAgICAgICAgICAgICAgICBoYS0+cG1zZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGhhLT5wZGV2LCBzaXplb2YoZ2R0aF9tc2dfc3RyKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyYXRjaF9kbWFfaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBoYS0+bXNnX3BoeXMgPSBzY3JhdGNoX2RtYV9oYW5kbGU7CisjaWZkZWYgSU5UX0NPQUwKKyAgICAgICAgICAgICAgICBoYS0+Y29hbF9zdGF0ID0gKGdkdGhfY29hbF9zdGF0dXMgKikKKyAgICAgICAgICAgICAgICAgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGEtPnBkZXYsIHNpemVvZihnZHRoX2NvYWxfc3RhdHVzKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWE9GRlNFVFMsICZzY3JhdGNoX2RtYV9oYW5kbGUpOworICAgICAgICAgICAgICAgIGhhLT5jb2FsX3N0YXRfcGh5cyA9IHNjcmF0Y2hfZG1hX2hhbmRsZTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGhhLT5jY2JfcGh5cyA9IAorICAgICAgICAgICAgICAgICAgICBwY2lfbWFwX3NpbmdsZShoYS0+cGRldixoYS0+cGNjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdkdGhfY21kX3N0ciksUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKyAgICAgICAgICAgICAgICBoYS0+c2NyYXRjaF9idXN5ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgaGEtPnJlcV9maXJzdCA9IE5VTEw7CisgICAgICAgICAgICAgICAgaGEtPnRpZF9jbnQgPSBNQVhfSERSSVZFUzsKKyAgICAgICAgICAgICAgICBpZiAobWF4X2lkcyA+IDAgJiYgbWF4X2lkcyA8IGhhLT50aWRfY250KQorICAgICAgICAgICAgICAgICAgICBoYS0+dGlkX2NudCA9IG1heF9pZHM7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8R0RUSF9NQVhDTURTOyArK2kpCisgICAgICAgICAgICAgICAgICAgIGhhLT5jbWRfdGFiW2ldLmNtbmQgPSBVTlVTRURfQ01ORDsKKyAgICAgICAgICAgICAgICBoYS0+c2Nhbl9tb2RlID0gcmVzY2FuID8gMHgxMCA6IDA7CisKKyAgICAgICAgICAgICAgICBpZiAoaGEtPnBzY3JhdGNoID09IE5VTEwgfHwgaGEtPnBtc2cgPT0gTlVMTCB8fCAKKyAgICAgICAgICAgICAgICAgICAgIWdkdGhfc2VhcmNoX2RyaXZlcyhoYW51bSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtRUlTQTogRXJyb3IgZHVyaW5nIGRldmljZSBzY2FuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgLS1nZHRoX2N0cl9jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgLS1nZHRoX2N0cl92Y291bnQ7CisjaWZkZWYgSU5UX0NPQUwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhLT5jb2FsX3N0YXQpCisgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LCBzaXplb2YoZ2R0aF9jb2FsX3N0YXR1cykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhPRkZTRVRTLCBoYS0+Y29hbF9zdGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYS0+Y29hbF9zdGF0X3BoeXMpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGlmIChoYS0+cHNjcmF0Y2gpCisgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LCBHRFRIX1NDUkFUQ0gsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYS0+cHNjcmF0Y2gsIGhhLT5zY3JhdGNoX3BoeXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoaGEtPnBtc2cpCisgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LCBzaXplb2YoZ2R0aF9tc2dfc3RyKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5wbXNnLCBoYS0+bXNnX3BoeXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoaGEtPmNjYl9waHlzKQorICAgICAgICAgICAgICAgICAgICAgICAgcGNpX3VubWFwX3NpbmdsZShoYS0+cGRldixoYS0+Y2NiX3BoeXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdkdGhfY21kX3N0ciksUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZV9pcnEoaGEtPmlycSxoYSk7CisgICAgICAgICAgICAgICAgICAgIHNjc2lfdW5yZWdpc3RlcihzaHApOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGhkcl9jaGFubmVsIDwgMCB8fCBoZHJfY2hhbm5lbCA+IGhhLT5idXNfY250KQorICAgICAgICAgICAgICAgICAgICBoZHJfY2hhbm5lbCA9IGhhLT5idXNfY250OworICAgICAgICAgICAgICAgIGhhLT52aXJ0X2J1cyA9IGhkcl9jaGFubmVsOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwyMCkgJiYgXAorICAgIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgICAgICAgICAgICAgIHNocC0+aGlnaG1lbV9pbyAgPSAwOworI2VuZGlmCisgICAgICAgICAgICAgICAgaWYgKGhhLT5jYWNoZV9mZWF0ICYgaGEtPnJhd19mZWF0ICYgaGEtPnNjcmVlbl9mZWF0ICYgR0RUXzY0QklUKSAKKyAgICAgICAgICAgICAgICAgICAgc2hwLT5tYXhfY21kX2xlbiA9IDE2OworCisgICAgICAgICAgICAgICAgc2hwLT5tYXhfaWQgICAgICA9IGhhLT50aWRfY250OworICAgICAgICAgICAgICAgIHNocC0+bWF4X2x1biAgICAgPSBNQVhMVU47CisgICAgICAgICAgICAgICAgc2hwLT5tYXhfY2hhbm5lbCA9IHZpcnRfY3RyID8gMCA6IGhhLT5idXNfY250OworICAgICAgICAgICAgICAgIGlmICh2aXJ0X2N0cikgeworICAgICAgICAgICAgICAgICAgICB2aXJ0X2N0ciA9IDE7CisgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIGFkZGl0LiBTQ1NJIGNoYW5uZWxzIGFzIHZpcnR1YWwgY29udHJvbGxlcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChiID0gMTsgYiA8IGhhLT5idXNfY250ICsgMTsgKytiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaHAgPSBzY3NpX3JlZ2lzdGVyKHNodHAsc2l6ZW9mKGdkdGhfbnVtX3N0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgc2hwLT51bmNoZWNrZWRfaXNhX2RtYSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBzaHAtPmlycSA9IGhhLT5pcnE7CisgICAgICAgICAgICAgICAgICAgICAgICBzaHAtPmRtYV9jaGFubmVsID0gMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdkdGhfY3RyX3Z0YWJbZ2R0aF9jdHJfdmNvdW50KytdID0gc2hwOworICAgICAgICAgICAgICAgICAgICAgICAgTlVNREFUQShzaHApLT5oYW51bSA9ICh1c2hvcnQpaGFudW07CisgICAgICAgICAgICAgICAgICAgICAgICBOVU1EQVRBKHNocCktPmJ1c251bSA9IGI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ICAKKworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pbml0KCZoYS0+c21wX2xvY2spOworICAgICAgICAgICAgICAgIGdkdGhfZW5hYmxlX2ludChoYW51bSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzY2FubmluZyBmb3IgUENJIGNvbnRyb2xsZXJzICovCisgICAgY250ID0gZ2R0aF9zZWFyY2hfcGNpKHBjaXN0cik7CisgICAgcHJpbnRrKCJHRFQtSEE6IEZvdW5kICVkIFBDSSBTdG9yYWdlIFJBSUQgQ29udHJvbGxlcnNcbiIsY250KTsKKyAgICBnZHRoX3NvcnRfcGNpKHBjaXN0cixjbnQpOworICAgIGZvciAoY3RyID0gMDsgY3RyIDwgY250OyArK2N0cikgeworICAgICAgICBkbWFfYWRkcl90IHNjcmF0Y2hfZG1hX2hhbmRsZTsKKyAgICAgICAgc2NyYXRjaF9kbWFfaGFuZGxlID0gMDsKKworICAgICAgICBpZiAoZ2R0aF9jdHJfY291bnQgPj0gTUFYSEEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc2hwID0gc2NzaV9yZWdpc3RlcihzaHRwLHNpemVvZihnZHRoX2V4dF9zdHIpKTsKKyAgICAgICAgaWYgKHNocCA9PSBOVUxMKQorICAgICAgICAgICAgY29udGludWU7ICAKKworICAgICAgICBoYSA9IEhBREFUQShzaHApOworICAgICAgICBpZiAoIWdkdGhfaW5pdF9wY2koJnBjaXN0cltjdHJdLGhhKSkgeworICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvKiBjb250cm9sbGVyIGZvdW5kIGFuZCBpbml0aWFsaXplZCAqLworICAgICAgICBwcmludGsoIkNvbmZpZ3VyaW5nIEdEVC1QQ0kgSEEgYXQgJWQvJWQgSVJRICV1XG4iLAorICAgICAgICAgICAgICAgcGNpc3RyW2N0cl0uYnVzLFBDSV9TTE9UKHBjaXN0cltjdHJdLmRldmljZV9mbiksaGEtPmlycSk7CisKKyAgICAgICAgaWYgKHJlcXVlc3RfaXJxKGhhLT5pcnEsIGdkdGhfaW50ZXJydXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgU0FfSU5URVJSVVBUfFNBX1NISVJRLCAiZ2R0aCIsIGhhKSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBVbmFibGUgdG8gYWxsb2NhdGUgSVJRXG4iKTsKKyAgICAgICAgICAgIHNjc2lfdW5yZWdpc3RlcihzaHApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc2hwLT51bmNoZWNrZWRfaXNhX2RtYSA9IDA7CisgICAgICAgIHNocC0+aXJxID0gaGEtPmlycTsKKyAgICAgICAgc2hwLT5kbWFfY2hhbm5lbCA9IDB4ZmY7CisgICAgICAgIGhhbnVtID0gZ2R0aF9jdHJfY291bnQ7CisgICAgICAgIGdkdGhfY3RyX3RhYltnZHRoX2N0cl9jb3VudCsrXSA9IHNocDsKKyAgICAgICAgZ2R0aF9jdHJfdnRhYltnZHRoX2N0cl92Y291bnQrK10gPSBzaHA7CisKKyAgICAgICAgTlVNREFUQShzaHApLT5oYW51bSA9ICh1c2hvcnQpaGFudW07CisgICAgICAgIE5VTURBVEEoc2hwKS0+YnVzbnVtPSAwOworCisgICAgICAgIGhhLT5wY2NiID0gQ01EREFUQShzaHApOworICAgICAgICBoYS0+Y2NiX3BoeXMgPSAwTDsKKworICAgICAgICBoYS0+cHNjcmF0Y2ggPSBwY2lfYWxsb2NfY29uc2lzdGVudChoYS0+cGRldiwgR0RUSF9TQ1JBVENILCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmF0Y2hfZG1hX2hhbmRsZSk7CisgICAgICAgIGhhLT5zY3JhdGNoX3BoeXMgPSBzY3JhdGNoX2RtYV9oYW5kbGU7CisgICAgICAgIGhhLT5wbXNnID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGEtPnBkZXYsIHNpemVvZihnZHRoX21zZ19zdHIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyYXRjaF9kbWFfaGFuZGxlKTsKKyAgICAgICAgaGEtPm1zZ19waHlzID0gc2NyYXRjaF9kbWFfaGFuZGxlOworI2lmZGVmIElOVF9DT0FMCisgICAgICAgIGhhLT5jb2FsX3N0YXQgPSAoZ2R0aF9jb2FsX3N0YXR1cyAqKQorICAgICAgICAgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGEtPnBkZXYsIHNpemVvZihnZHRoX2NvYWxfc3RhdHVzKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhPRkZTRVRTLCAmc2NyYXRjaF9kbWFfaGFuZGxlKTsKKyAgICAgICAgaGEtPmNvYWxfc3RhdF9waHlzID0gc2NyYXRjaF9kbWFfaGFuZGxlOworI2VuZGlmCisgICAgICAgIGhhLT5zY3JhdGNoX2J1c3kgPSBGQUxTRTsKKyAgICAgICAgaGEtPnJlcV9maXJzdCA9IE5VTEw7CisgICAgICAgIGhhLT50aWRfY250ID0gcGNpc3RyW2N0cl0uZGV2aWNlX2lkID49IDB4MjAwID8gTUFYSUQgOiBNQVhfSERSSVZFUzsKKyAgICAgICAgaWYgKG1heF9pZHMgPiAwICYmIG1heF9pZHMgPCBoYS0+dGlkX2NudCkKKyAgICAgICAgICAgIGhhLT50aWRfY250ID0gbWF4X2lkczsKKyAgICAgICAgZm9yIChpPTA7IGk8R0RUSF9NQVhDTURTOyArK2kpCisgICAgICAgICAgICBoYS0+Y21kX3RhYltpXS5jbW5kID0gVU5VU0VEX0NNTkQ7CisgICAgICAgIGhhLT5zY2FuX21vZGUgPSByZXNjYW4gPyAweDEwIDogMDsKKworICAgICAgICBlcnIgPSBGQUxTRTsKKyAgICAgICAgaWYgKGhhLT5wc2NyYXRjaCA9PSBOVUxMIHx8IGhhLT5wbXNnID09IE5VTEwgfHwgCisgICAgICAgICAgICAhZ2R0aF9zZWFyY2hfZHJpdmVzKGhhbnVtKSkgeworICAgICAgICAgICAgZXJyID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChoZHJfY2hhbm5lbCA8IDAgfHwgaGRyX2NoYW5uZWwgPiBoYS0+YnVzX2NudCkKKyAgICAgICAgICAgICAgICBoZHJfY2hhbm5lbCA9IGhhLT5idXNfY250OworICAgICAgICAgICAgaGEtPnZpcnRfYnVzID0gaGRyX2NoYW5uZWw7CisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgICAgIHNjc2lfc2V0X2RldmljZShzaHAsICZwY2lzdHJbY3RyXS5wZGV2LT5kZXYpOworI2Vsc2UKKyAgICAgICAgICAgIHNjc2lfc2V0X3BjaV9kZXZpY2Uoc2hwLCBwY2lzdHJbY3RyXS5wZGV2KTsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKCEoaGEtPmNhY2hlX2ZlYXQgJiBoYS0+cmF3X2ZlYXQgJiBoYS0+c2NyZWVuX2ZlYXQgJkdEVF82NEJJVCl8fAorICAgICAgICAgICAgICAgIC8qIDY0LWJpdCBETUEgb25seSBzdXBwb3J0ZWQgZnJvbSBGVyA+PSB4LjQzICovCisgICAgICAgICAgICAgICAgKCFoYS0+ZG1hNjRfc3VwcG9ydCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocGNpX3NldF9kbWFfbWFzayhwY2lzdHJbY3RyXS5wZGV2LCAweGZmZmZmZmZmKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJHRFQtUENJICVkOiBVbmFibGUgdG8gc2V0IDMyLWJpdCBETUFcbiIsIGhhbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNocC0+bWF4X2NtZF9sZW4gPSAxNjsKKyAgICAgICAgICAgICAgICBpZiAoIXBjaV9zZXRfZG1hX21hc2socGNpc3RyW2N0cl0ucGRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0kgJWQ6IDY0LWJpdCBETUEgZW5hYmxlZFxuIiwgaGFudW0pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGNpX3NldF9kbWFfbWFzayhwY2lzdHJbY3RyXS5wZGV2LCAweGZmZmZmZmZmKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJHRFQtUENJICVkOiBVbmFibGUgdG8gc2V0IDY0LzMyLWJpdCBETUFcbiIsIGhhbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0kgJWQ6IEVycm9yIGR1cmluZyBkZXZpY2Ugc2NhblxuIiwgaGFudW0pOworICAgICAgICAgICAgLS1nZHRoX2N0cl9jb3VudDsKKyAgICAgICAgICAgIC0tZ2R0aF9jdHJfdmNvdW50OworI2lmZGVmIElOVF9DT0FMCisgICAgICAgICAgICBpZiAoaGEtPmNvYWxfc3RhdCkKKyAgICAgICAgICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LCBzaXplb2YoZ2R0aF9jb2FsX3N0YXR1cykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYT0ZGU0VUUywgaGEtPmNvYWxfc3RhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5jb2FsX3N0YXRfcGh5cyk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChoYS0+cHNjcmF0Y2gpCisgICAgICAgICAgICAgICAgcGNpX2ZyZWVfY29uc2lzdGVudChoYS0+cGRldiwgR0RUSF9TQ1JBVENILCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5wc2NyYXRjaCwgaGEtPnNjcmF0Y2hfcGh5cyk7CisgICAgICAgICAgICBpZiAoaGEtPnBtc2cpCisgICAgICAgICAgICAgICAgcGNpX2ZyZWVfY29uc2lzdGVudChoYS0+cGRldiwgc2l6ZW9mKGdkdGhfbXNnX3N0ciksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGEtPnBtc2csIGhhLT5tc2dfcGh5cyk7CisgICAgICAgICAgICBmcmVlX2lycShoYS0+aXJxLGhhKTsKKyAgICAgICAgICAgIHNjc2lfdW5yZWdpc3RlcihzaHApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzaHAtPm1heF9pZCAgICAgID0gaGEtPnRpZF9jbnQ7CisgICAgICAgIHNocC0+bWF4X2x1biAgICAgPSBNQVhMVU47CisgICAgICAgIHNocC0+bWF4X2NoYW5uZWwgPSB2aXJ0X2N0ciA/IDAgOiBoYS0+YnVzX2NudDsKKyAgICAgICAgaWYgKHZpcnRfY3RyKSB7CisgICAgICAgICAgICB2aXJ0X2N0ciA9IDE7CisgICAgICAgICAgICAvKiByZWdpc3RlciBhZGRpdC4gU0NTSSBjaGFubmVscyBhcyB2aXJ0dWFsIGNvbnRyb2xsZXJzICovCisgICAgICAgICAgICBmb3IgKGIgPSAxOyBiIDwgaGEtPmJ1c19jbnQgKyAxOyArK2IpIHsKKyAgICAgICAgICAgICAgICBzaHAgPSBzY3NpX3JlZ2lzdGVyKHNodHAsc2l6ZW9mKGdkdGhfbnVtX3N0cikpOworICAgICAgICAgICAgICAgIHNocC0+dW5jaGVja2VkX2lzYV9kbWEgPSAwOworICAgICAgICAgICAgICAgIHNocC0+aXJxID0gaGEtPmlycTsKKyAgICAgICAgICAgICAgICBzaHAtPmRtYV9jaGFubmVsID0gMHhmZjsKKyAgICAgICAgICAgICAgICBnZHRoX2N0cl92dGFiW2dkdGhfY3RyX3Zjb3VudCsrXSA9IHNocDsKKyAgICAgICAgICAgICAgICBOVU1EQVRBKHNocCktPmhhbnVtID0gKHVzaG9ydCloYW51bTsKKyAgICAgICAgICAgICAgICBOVU1EQVRBKHNocCktPmJ1c251bSA9IGI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gIAorCisgICAgICAgIHNwaW5fbG9ja19pbml0KCZoYS0+c21wX2xvY2spOworICAgICAgICBnZHRoX2VuYWJsZV9pbnQoaGFudW0pOworICAgIH0KKyAgICAKKyAgICBUUkFDRTIoKCJnZHRoX2RldGVjdCgpICVkIGNvbnRyb2xsZXIgZGV0ZWN0ZWRcbiIsZ2R0aF9jdHJfY291bnQpKTsKKyAgICBpZiAoZ2R0aF9jdHJfY291bnQgPiAwKSB7CisjaWZkZWYgR0RUSF9TVEFUSVNUSUNTCisgICAgICAgIFRSQUNFMigoImdkdGhfZGV0ZWN0KCk6IEluaXRpYWxpemluZyB0aW1lciAhXG4iKSk7CisgICAgICAgIGluaXRfdGltZXIoJmdkdGhfdGltZXIpOworICAgICAgICBnZHRoX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisgICAgICAgIGdkdGhfdGltZXIuZGF0YSA9IDBMOworICAgICAgICBnZHRoX3RpbWVyLmZ1bmN0aW9uID0gZ2R0aF90aW1lb3V0OworICAgICAgICBhZGRfdGltZXIoJmdkdGhfdGltZXIpOworI2VuZGlmCisgICAgICAgIG1ham9yID0gcmVnaXN0ZXJfY2hyZGV2KDAsImdkdGgiLCZnZHRoX2ZvcHMpOworICAgICAgICByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmdkdGhfbm90aWZpZXIpOworICAgIH0KKyAgICBnZHRoX3BvbGxpbmcgPSBGQUxTRTsKKyAgICByZXR1cm4gZ2R0aF9jdHJfdmNvdW50OworfQorCisKK2ludCBnZHRoX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hwKQoreworICAgIGludCBoYW51bTsKKyAgICBnZHRoX2hhX3N0ciAqaGE7CisKKyAgICBUUkFDRTIoKCJnZHRoX3JlbGVhc2UoKVxuIikpOworICAgIGlmIChOVU1EQVRBKHNocCktPmJ1c251bSA9PSAwKSB7CisgICAgICAgIGhhbnVtID0gTlVNREFUQShzaHApLT5oYW51bTsKKyAgICAgICAgaGEgICAgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgICAgIGlmIChoYS0+c2RldikgeworICAgICAgICAgICAgc2NzaV9mcmVlX2hvc3RfZGV2KGhhLT5zZGV2KTsKKyAgICAgICAgICAgIGhhLT5zZGV2ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBnZHRoX2ZsdXNoKGhhbnVtKTsKKworICAgICAgICBpZiAoc2hwLT5pcnEpIHsKKyAgICAgICAgICAgIGZyZWVfaXJxKHNocC0+aXJxLGhhKTsKKyAgICAgICAgfQorI2lmbmRlZiBfX2lhNjRfXworICAgICAgICBpZiAoc2hwLT5kbWFfY2hhbm5lbCAhPSAweGZmKSB7CisgICAgICAgICAgICBmcmVlX2RtYShzaHAtPmRtYV9jaGFubmVsKTsKKyAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgSU5UX0NPQUwKKyAgICAgICAgaWYgKGhhLT5jb2FsX3N0YXQpCisgICAgICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LCBzaXplb2YoZ2R0aF9jb2FsX3N0YXR1cykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhPRkZTRVRTLCBoYS0+Y29hbF9zdGF0LCBoYS0+Y29hbF9zdGF0X3BoeXMpOworI2VuZGlmCisgICAgICAgIGlmIChoYS0+cHNjcmF0Y2gpCisgICAgICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LCBHRFRIX1NDUkFUQ0gsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYS0+cHNjcmF0Y2gsIGhhLT5zY3JhdGNoX3BoeXMpOworICAgICAgICBpZiAoaGEtPnBtc2cpCisgICAgICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LCBzaXplb2YoZ2R0aF9tc2dfc3RyKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5wbXNnLCBoYS0+bXNnX3BoeXMpOworICAgICAgICBpZiAoaGEtPmNjYl9waHlzKQorICAgICAgICAgICAgcGNpX3VubWFwX3NpbmdsZShoYS0+cGRldixoYS0+Y2NiX3BoeXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihnZHRoX2NtZF9zdHIpLFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisgICAgICAgIGdkdGhfY3RyX3JlbGVhc2VkKys7CisgICAgICAgIFRSQUNFMigoImdkdGhfcmVsZWFzZSgpOiBIQSAlZCBvZiAlZFxuIiwgCisgICAgICAgICAgICAgICAgZ2R0aF9jdHJfcmVsZWFzZWQsIGdkdGhfY3RyX2NvdW50KSk7CisKKyAgICAgICAgaWYgKGdkdGhfY3RyX3JlbGVhc2VkID09IGdkdGhfY3RyX2NvdW50KSB7CisjaWZkZWYgR0RUSF9TVEFUSVNUSUNTCisgICAgICAgICAgICBkZWxfdGltZXIoJmdkdGhfdGltZXIpOworI2VuZGlmCisgICAgICAgICAgICB1bnJlZ2lzdGVyX2NocmRldihtYWpvciwiZ2R0aCIpOworICAgICAgICAgICAgdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmdkdGhfbm90aWZpZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgcmV0dXJuIDA7Cit9CisgICAgICAgICAgICAKKworc3RhdGljIGNvbnN0IGNoYXIgKmdkdGhfY3RyX25hbWUoaW50IGhhbnVtKQoreworICAgIGdkdGhfaGFfc3RyICpoYTsKKworICAgIFRSQUNFMigoImdkdGhfY3RyX25hbWUoKVxuIikpOworCisgICAgaGEgICAgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisKKyAgICBpZiAoaGEtPnR5cGUgPT0gR0RUX0VJU0EpIHsKKyAgICAgICAgc3dpdGNoIChoYS0+c3R5cGUpIHsKKyAgICAgICAgICBjYXNlIEdEVDNfSUQ6CisgICAgICAgICAgICByZXR1cm4oIkdEVDMwMDAvMzAyMCIpOworICAgICAgICAgIGNhc2UgR0RUM0FfSUQ6CisgICAgICAgICAgICByZXR1cm4oIkdEVDMwMDBBLzMwMjBBLzMwNTBBIik7CisgICAgICAgICAgY2FzZSBHRFQzQl9JRDoKKyAgICAgICAgICAgIHJldHVybigiR0RUMzAwMEIvMzAxMEEiKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX0lTQSkgeworICAgICAgICByZXR1cm4oIkdEVDIwMDAvMjAyMCIpOworICAgIH0gZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSSkgeworICAgICAgICBzd2l0Y2ggKGhhLT5zdHlwZSkgeworICAgICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjB4MDoKKyAgICAgICAgICAgIHJldHVybigiR0RUNjAwMC82MDIwLzYwNTAiKTsKKyAgICAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDYwMDBCOgorICAgICAgICAgICAgcmV0dXJuKCJHRFQ2MDAwQi82MDEwIik7CisgICAgICAgIH0KKyAgICB9IAorICAgIC8qIG5ldyBjb250cm9sbGVycyAoR0RUX1BDSU5FVywgR0RUX1BDSU1QUiwgLi4pIHVzZSBib2FyZF9pbmZvIElPQ1RMISAqLworCisgICAgcmV0dXJuKCIiKTsKK30KKworY29uc3QgY2hhciAqZ2R0aF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNocCkKK3sKKyAgICBpbnQgaGFudW07CisgICAgZ2R0aF9oYV9zdHIgKmhhOworCisgICAgVFJBQ0UyKCgiZ2R0aF9pbmZvKClcbiIpKTsKKyAgICBoYW51bSA9IE5VTURBVEEoc2hwKS0+aGFudW07CisgICAgaGEgICAgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisKKyAgICByZXR1cm4gKChjb25zdCBjaGFyICopaGEtPmJpbmZvLnR5cGVfc3RyaW5nKTsKK30KKworLyogbmV3IGVycm9yIGhhbmRsaW5nICovCitpbnQgZ2R0aF9laF9hYm9ydChTY3NpX0NtbmQgKnNjcCkKK3sKKyAgICBUUkFDRTIoKCJnZHRoX2VoX2Fib3J0KClcbiIpKTsKKyAgICByZXR1cm4gRkFJTEVEOworfQorCitpbnQgZ2R0aF9laF9kZXZpY2VfcmVzZXQoU2NzaV9DbW5kICpzY3ApCit7CisgICAgVFJBQ0UyKCgiZ2R0aF9laF9kZXZpY2VfcmVzZXQoKVxuIikpOworICAgIHJldHVybiBGQUlMRUQ7Cit9CisKK2ludCBnZHRoX2VoX2J1c19yZXNldChTY3NpX0NtbmQgKnNjcCkKK3sKKyAgICBpbnQgaSwgaGFudW07CisgICAgZ2R0aF9oYV9zdHIgKmhhOworICAgIHVsb25nIGZsYWdzOworICAgIFNjc2lfQ21uZCAqY21uZDsKKyAgICB1bmNoYXIgYjsKKworICAgIFRSQUNFMigoImdkdGhfZWhfYnVzX3Jlc2V0KClcbiIpKTsKKworICAgIGhhbnVtID0gTlVNREFUQShzY3AtPmRldmljZS0+aG9zdCktPmhhbnVtOworICAgIGIgPSB2aXJ0X2N0ciA/IE5VTURBVEEoc2NwLT5kZXZpY2UtPmhvc3QpLT5idXNudW0gOiBzY3AtPmRldmljZS0+Y2hhbm5lbDsKKyAgICBoYSAgICA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKworICAgIC8qIGNsZWFyIGNvbW1hbmQgdGFiICovCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgIGZvciAoaSA9IDA7IGkgPCBHRFRIX01BWENNRFM7ICsraSkgeworICAgICAgICBjbW5kID0gaGEtPmNtZF90YWJbaV0uY21uZDsKKyAgICAgICAgaWYgKCFTUEVDSUFMX1NDUChjbW5kKSAmJiBjbW5kLT5kZXZpY2UtPmNoYW5uZWwgPT0gYikKKyAgICAgICAgICAgIGhhLT5jbWRfdGFiW2ldLmNtbmQgPSBVTlVTRURfQ01ORDsKKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisKKyAgICBpZiAoYiA9PSBoYS0+dmlydF9idXMpIHsKKyAgICAgICAgLyogaG9zdCBkcml2ZXMgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9IRFJJVkVTOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChoYS0+aGRyW2ldLnByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgZ2R0aF9wb2xsaW5nID0gVFJVRTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZ2R0aF90ZXN0X2J1c3koaGFudW0pKQorICAgICAgICAgICAgICAgICAgICBnZHRoX2RlbGF5KDApOworICAgICAgICAgICAgICAgIGlmIChnZHRoX2ludGVybmFsX2NtZChoYW51bSwgQ0FDSEVTRVJWSUNFLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0RUX0NMVVNUX1JFU0VULCBpLCAwLCAwKSkKKyAgICAgICAgICAgICAgICAgICAgaGEtPmhkcltpXS5jbHVzdGVyX3R5cGUgJj0gfkNMVVNURVJfUkVTRVJWRUQ7CisgICAgICAgICAgICAgICAgZ2R0aF9wb2xsaW5nID0gRkFMU0U7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiByYXcgZGV2aWNlcyAqLworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhJRDsgKytpKQorICAgICAgICAgICAgaGEtPnJhd1tCVVNfTDJQKGhhLGIpXS5pb19jbnRbaV0gPSAwOworICAgICAgICBnZHRoX3BvbGxpbmcgPSBUUlVFOworICAgICAgICB3aGlsZSAoZ2R0aF90ZXN0X2J1c3koaGFudW0pKQorICAgICAgICAgICAgZ2R0aF9kZWxheSgwKTsKKyAgICAgICAgZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sIFNDU0lSQVdTRVJWSUNFLCBHRFRfUkVTRVRfQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCVVNfTDJQKGhhLGIpLCAwLCAwKTsKKyAgICAgICAgZ2R0aF9wb2xsaW5nID0gRkFMU0U7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgfQorICAgIHJldHVybiBTVUNDRVNTOworfQorCitpbnQgZ2R0aF9laF9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqc2NwKQoreworICAgIFRSQUNFMigoImdkdGhfZWhfaG9zdF9yZXNldCgpXG4iKSk7CisgICAgcmV0dXJuIEZBSUxFRDsKK30KKworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQoraW50IGdkdGhfYmlvc19wYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsc3RydWN0IGJsb2NrX2RldmljZSAqYmRldixzZWN0b3JfdCBjYXAsaW50ICppcCkKKyNlbHNlCitpbnQgZ2R0aF9iaW9zX3BhcmFtKERpc2sgKmRpc2ssa2Rldl90IGRldixpbnQgKmlwKQorI2VuZGlmCit7CisgICAgdW5jaGFyIGIsIHQ7CisgICAgaW50IGhhbnVtOworICAgIGdkdGhfaGFfc3RyICpoYTsKKyAgICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkOworICAgIHVuc2lnbmVkIGNhcGFjaXR5OworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgIHNkID0gc2RldjsKKyAgICBjYXBhY2l0eSA9IGNhcDsKKyNlbHNlCisgICAgc2QgPSBkaXNrLT5kZXZpY2U7CisgICAgY2FwYWNpdHkgPSBkaXNrLT5jYXBhY2l0eTsKKyNlbmRpZgorICAgIGhhbnVtID0gTlVNREFUQShzZC0+aG9zdCktPmhhbnVtOworICAgIGIgPSB2aXJ0X2N0ciA/IE5VTURBVEEoc2QtPmhvc3QpLT5idXNudW0gOiBzZC0+Y2hhbm5lbDsKKyAgICB0ID0gc2QtPmlkOworICAgIFRSQUNFMigoImdkdGhfYmlvc19wYXJhbSgpIGhhICVkIGJ1cyAlZCB0YXJnZXQgJWRcbiIsIGhhbnVtLCBiLCB0KSk7IAorICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworCisgICAgaWYgKGIgIT0gaGEtPnZpcnRfYnVzIHx8IGhhLT5oZHJbdF0uaGVhZHMgPT0gMCkgeworICAgICAgICAvKiByYXcgZGV2aWNlIG9yIGhvc3QgZHJpdmUgd2l0aG91dCBtYXBwaW5nIGluZm9ybWF0aW9uICovCisgICAgICAgIFRSQUNFMigoIkV2YWx1YXRlIG1hcHBpbmdcbiIpKTsKKyAgICAgICAgZ2R0aF9ldmFsX21hcHBpbmcoY2FwYWNpdHksJmlwWzJdLCZpcFswXSwmaXBbMV0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGlwWzBdID0gaGEtPmhkclt0XS5oZWFkczsKKyAgICAgICAgaXBbMV0gPSBoYS0+aGRyW3RdLnNlY3M7CisgICAgICAgIGlwWzJdID0gY2FwYWNpdHkgLyBpcFswXSAvIGlwWzFdOworICAgIH0KKworICAgIFRSQUNFMigoImdkdGhfYmlvc19wYXJhbSgpOiAlZCBoZWFkcywgJWQgc2VjcywgJWQgY3lsc1xuIiwKKyAgICAgICAgICAgIGlwWzBdLGlwWzFdLGlwWzJdKSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50IGdkdGhfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqc2NwLHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpCit7CisgICAgaW50IGhhbnVtOworICAgIGludCBwcmlvcml0eTsKKworICAgIFRSQUNFKCgiZ2R0aF9xdWV1ZWNvbW1hbmQoKSBjbWQgMHgleFxuIiwgc2NwLT5jbW5kWzBdKSk7CisgICAgCisgICAgc2NwLT5zY3NpX2RvbmUgPSAodm9pZCAqKWRvbmU7CisgICAgc2NwLT5TQ3AuaGF2ZV9kYXRhX2luID0gMTsKKyAgICBzY3AtPlNDcC5waGFzZSA9IC0xOworICAgIHNjcC0+U0NwLnNlbnRfY29tbWFuZCA9IC0xOworICAgIHNjcC0+U0NwLlN0YXR1cyA9IEdEVEhfTUFQX05PTkU7CisgICAgc2NwLT5TQ3AuYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKU5VTEw7CisKKyAgICBoYW51bSA9IE5VTURBVEEoc2NwLT5kZXZpY2UtPmhvc3QpLT5oYW51bTsKKyNpZmRlZiBHRFRIX1NUQVRJU1RJQ1MKKyAgICArK2FjdF9pb3M7CisjZW5kaWYKKworICAgIHByaW9yaXR5ID0gREVGQVVMVF9QUkk7CisgICAgaWYgKHNjcC0+ZG9uZSA9PSBnZHRoX3Njc2lfZG9uZSkKKyAgICAgICAgcHJpb3JpdHkgPSBzY3AtPlNDcC50aGlzX3Jlc2lkdWFsOworICAgIGdkdGhfdXBkYXRlX3RpbWVvdXQoaGFudW0sIHNjcCwgc2NwLT50aW1lb3V0X3Blcl9jb21tYW5kICogNik7CisgICAgZ2R0aF9wdXRxKCBoYW51bSwgc2NwLCBwcmlvcml0eSApOworICAgIGdkdGhfbmV4dCggaGFudW0gKTsKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGdkdGhfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisgICAgZ2R0aF9oYV9zdHIgKmhhOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGdkdGhfY3RyX2NvdW50OyBpKyspIHsKKyAgICAgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2ldKTsKKyAgICAgICAgaWYgKCFoYS0+c2RldikKKyAgICAgICAgICAgIGhhLT5zZGV2ID0gc2NzaV9nZXRfaG9zdF9kZXYoZ2R0aF9jdHJfdGFiW2ldKTsKKyAgICB9CisKKyAgICBUUkFDRSgoImdkdGhfb3BlbigpXG4iKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2R0aF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisgICAgVFJBQ0UoKCJnZHRoX2Nsb3NlKClcbiIpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpb2NfZXZlbnQodm9pZCBfX3VzZXIgKmFyZykKK3sKKyAgICBnZHRoX2lvY3RsX2V2ZW50IGV2dDsKKyAgICBnZHRoX2hhX3N0ciAqaGE7CisgICAgdWxvbmcgZmxhZ3M7CisKKyAgICBpZiAoY29weV9mcm9tX3VzZXIoJmV2dCwgYXJnLCBzaXplb2YoZ2R0aF9pb2N0bF9ldmVudCkpIHx8CisgICAgICAgIGV2dC5pb25vZGUgPj0gZ2R0aF9jdHJfY291bnQpCisgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltldnQuaW9ub2RlXSk7CisKKyAgICBpZiAoZXZ0LmVyYXNlID09IDB4ZmYpIHsKKyAgICAgICAgaWYgKGV2dC5ldmVudC5ldmVudF9zb3VyY2UgPT0gRVNfVEVTVCkKKyAgICAgICAgICAgIGV2dC5ldmVudC5ldmVudF9kYXRhLnNpemU9c2l6ZW9mKGV2dC5ldmVudC5ldmVudF9kYXRhLmV1LnRlc3QpOyAKKyAgICAgICAgZWxzZSBpZiAoZXZ0LmV2ZW50LmV2ZW50X3NvdXJjZSA9PSBFU19EUklWRVIpCisgICAgICAgICAgICBldnQuZXZlbnQuZXZlbnRfZGF0YS5zaXplPXNpemVvZihldnQuZXZlbnQuZXZlbnRfZGF0YS5ldS5kcml2ZXIpOyAKKyAgICAgICAgZWxzZSBpZiAoZXZ0LmV2ZW50LmV2ZW50X3NvdXJjZSA9PSBFU19TWU5DKQorICAgICAgICAgICAgZXZ0LmV2ZW50LmV2ZW50X2RhdGEuc2l6ZT1zaXplb2YoZXZ0LmV2ZW50LmV2ZW50X2RhdGEuZXUuc3luYyk7IAorICAgICAgICBlbHNlCisgICAgICAgICAgICBldnQuZXZlbnQuZXZlbnRfZGF0YS5zaXplPXNpemVvZihldnQuZXZlbnQuZXZlbnRfZGF0YS5ldS5hc3luYyk7CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgZ2R0aF9zdG9yZV9ldmVudChoYSwgZXZ0LmV2ZW50LmV2ZW50X3NvdXJjZSwgZXZ0LmV2ZW50LmV2ZW50X2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZXZ0LmV2ZW50LmV2ZW50X2RhdGEpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICB9IGVsc2UgaWYgKGV2dC5lcmFzZSA9PSAweGZlKSB7CisgICAgICAgIGdkdGhfY2xlYXJfZXZlbnRzKCk7CisgICAgfSBlbHNlIGlmIChldnQuZXJhc2UgPT0gMCkgeworICAgICAgICBldnQuaGFuZGxlID0gZ2R0aF9yZWFkX2V2ZW50KGhhLCBldnQuaGFuZGxlLCAmZXZ0LmV2ZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBnZHRoX3JlYWRhcHBfZXZlbnQoaGEsIGV2dC5lcmFzZSwgJmV2dC5ldmVudCk7CisgICAgfSAgICAgCisgICAgaWYgKGNvcHlfdG9fdXNlcihhcmcsICZldnQsIHNpemVvZihnZHRoX2lvY3RsX2V2ZW50KSkpCisgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlvY19sb2NrZHJ2KHZvaWQgX191c2VyICphcmcpCit7CisgICAgZ2R0aF9pb2N0bF9sb2NrZHJ2IGxkcnY7CisgICAgdW5jaGFyIGksIGo7CisgICAgdWxvbmcgZmxhZ3M7CisgICAgZ2R0aF9oYV9zdHIgKmhhOworCisgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZsZHJ2LCBhcmcsIHNpemVvZihnZHRoX2lvY3RsX2xvY2tkcnYpKSB8fAorICAgICAgICBsZHJ2Lmlvbm9kZSA+PSBnZHRoX2N0cl9jb3VudCkKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2xkcnYuaW9ub2RlXSk7CisgCisgICAgZm9yIChpID0gMDsgaSA8IGxkcnYuZHJpdmVfY250ICYmIGkgPCBNQVhfSERSSVZFUzsgKytpKSB7CisgICAgICAgIGogPSBsZHJ2LmRyaXZlc1tpXTsKKyAgICAgICAgaWYgKGogPj0gTUFYX0hEUklWRVMgfHwgIWhhLT5oZHJbal0ucHJlc2VudCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAobGRydi5sb2NrKSB7CisgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICBoYS0+aGRyW2pdLmxvY2sgPSAxOworICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICBnZHRoX3dhaXRfY29tcGxldGlvbihsZHJ2Lmlvbm9kZSwgaGEtPmJ1c19jbnQsIGopOyAKKyAgICAgICAgICAgIGdkdGhfc3RvcF90aW1lb3V0KGxkcnYuaW9ub2RlLCBoYS0+YnVzX2NudCwgaik7IAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgaGEtPmhkcltqXS5sb2NrID0gMDsKKyAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgZ2R0aF9zdGFydF90aW1lb3V0KGxkcnYuaW9ub2RlLCBoYS0+YnVzX2NudCwgaik7IAorICAgICAgICAgICAgZ2R0aF9uZXh0KGxkcnYuaW9ub2RlKTsgCisgICAgICAgIH0KKyAgICB9IAorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlvY19yZXNldGRydih2b2lkIF9fdXNlciAqYXJnLCBjaGFyICpjbW5kKQoreworICAgIGdkdGhfaW9jdGxfcmVzZXQgcmVzOworICAgIGdkdGhfY21kX3N0ciBjbWQ7CisgICAgaW50IGhhbnVtOworICAgIGdkdGhfaGFfc3RyICpoYTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgU2NzaV9SZXF1ZXN0ICpzcnA7CisjZWxzZQorICAgIFNjc2lfQ21uZCAqc2NwOworI2VuZGlmCisKKyAgICBpZiAoY29weV9mcm9tX3VzZXIoJnJlcywgYXJnLCBzaXplb2YoZ2R0aF9pb2N0bF9yZXNldCkpIHx8CisgICAgICAgIHJlcy5pb25vZGUgPj0gZ2R0aF9jdHJfY291bnQgfHwgcmVzLm51bWJlciA+PSBNQVhfSERSSVZFUykKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgaGFudW0gPSByZXMuaW9ub2RlOworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworIAorICAgIGlmICghaGEtPmhkcltyZXMubnVtYmVyXS5wcmVzZW50KQorICAgICAgICByZXR1cm4gMDsKKyAgICBtZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGdkdGhfY21kX3N0cikpOworICAgIGNtZC5TZXJ2aWNlID0gQ0FDSEVTRVJWSUNFOworICAgIGNtZC5PcENvZGUgPSBHRFRfQ0xVU1RfUkVTRVQ7CisgICAgaWYgKGhhLT5jYWNoZV9mZWF0ICYgR0RUXzY0QklUKQorICAgICAgICBjbWQudS5jYWNoZTY0LkRldmljZU5vID0gcmVzLm51bWJlcjsKKyAgICBlbHNlCisgICAgICAgIGNtZC51LmNhY2hlLkRldmljZU5vID0gcmVzLm51bWJlcjsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgc3JwICA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChoYS0+c2RldiwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFzcnApCisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIHNycC0+c3JfY21kX2xlbiA9IDEyOworICAgIHNycC0+c3JfdXNlX3NnID0gMDsKKyAgICBnZHRoX2RvX3JlcShzcnAsICZjbWQsIGNtbmQsIDMwKTsKKyAgICByZXMuc3RhdHVzID0gKHVzaG9ydClzcnAtPnNyX2NvbW1hbmQtPlNDcC5TdGF0dXM7CisgICAgc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JwKTsKKyNlbHNlCisgICAgc2NwICA9IHNjc2lfYWxsb2NhdGVfZGV2aWNlKGhhLT5zZGV2LCAxLCBGQUxTRSk7CisgICAgaWYgKCFzY3ApCisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIHNjcC0+Y21kX2xlbiA9IDEyOworICAgIHNjcC0+dXNlX3NnID0gMDsKKyAgICBnZHRoX2RvX2NtZChzY3AsICZjbWQsIGNtbmQsIDMwKTsKKyAgICByZXMuc3RhdHVzID0gKHVzaG9ydClzY3AtPlNDcC5TdGF0dXM7CisgICAgc2NzaV9yZWxlYXNlX2NvbW1hbmQoc2NwKTsKKyNlbmRpZgorCisgICAgaWYgKGNvcHlfdG9fdXNlcihhcmcsICZyZXMsIHNpemVvZihnZHRoX2lvY3RsX3Jlc2V0KSkpCisgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlvY19nZW5lcmFsKHZvaWQgX191c2VyICphcmcsIGNoYXIgKmNtbmQpCit7CisgICAgZ2R0aF9pb2N0bF9nZW5lcmFsIGdlbjsKKyAgICBjaGFyICpidWYgPSBOVUxMOworICAgIHVsb25nNjQgcGFkZHI7IAorICAgIGludCBoYW51bTsKKyAgICAgICAgZ2R0aF9oYV9zdHIgKmhhOyAKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgICAgIFNjc2lfUmVxdWVzdCAqc3JwOworI2Vsc2UKKyAgICAgICAgU2NzaV9DbW5kICpzY3A7CisjZW5kaWYKKyAgICAgICAgCisgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZnZW4sIGFyZywgc2l6ZW9mKGdkdGhfaW9jdGxfZ2VuZXJhbCkpIHx8CisgICAgICAgIGdlbi5pb25vZGUgPj0gZ2R0aF9jdHJfY291bnQpCisgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgIGhhbnVtID0gZ2VuLmlvbm9kZTsgCisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgaWYgKGdlbi5kYXRhX2xlbiArIGdlbi5zZW5zZV9sZW4gIT0gMCkgeworICAgICAgICBpZiAoIShidWYgPSBnZHRoX2lvY3RsX2FsbG9jKGhhbnVtLCBnZW4uZGF0YV9sZW4gKyBnZW4uc2Vuc2VfbGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgJnBhZGRyKSkpCisgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYXJnICsgc2l6ZW9mKGdkdGhfaW9jdGxfZ2VuZXJhbCksICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi5kYXRhX2xlbiArIGdlbi5zZW5zZV9sZW4pKSB7CisgICAgICAgICAgICBnZHRoX2lvY3RsX2ZyZWUoaGFudW0sIGdlbi5kYXRhX2xlbitnZW4uc2Vuc2VfbGVuLCBidWYsIHBhZGRyKTsKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdlbi5jb21tYW5kLk9wQ29kZSA9PSBHRFRfSU9DVEwpIHsKKyAgICAgICAgICAgIGdlbi5jb21tYW5kLnUuaW9jdGwucF9wYXJhbSA9IHBhZGRyOworICAgICAgICB9IGVsc2UgaWYgKGdlbi5jb21tYW5kLlNlcnZpY2UgPT0gQ0FDSEVTRVJWSUNFKSB7CisgICAgICAgICAgICBpZiAoaGEtPmNhY2hlX2ZlYXQgJiBHRFRfNjRCSVQpIHsKKyAgICAgICAgICAgICAgICAvKiBjb3B5IGVsZW1lbnRzIGZyb20gMzItYml0IElPQ1RMIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUuY2FjaGU2NC5CbG9ja0NudCA9IGdlbi5jb21tYW5kLnUuY2FjaGUuQmxvY2tDbnQ7CisgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5jYWNoZTY0LkJsb2NrTm8gPSBnZW4uY29tbWFuZC51LmNhY2hlLkJsb2NrTm87CisgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5jYWNoZTY0LkRldmljZU5vID0gZ2VuLmNvbW1hbmQudS5jYWNoZS5EZXZpY2VObzsKKyAgICAgICAgICAgICAgICAvKiBhZGRyZXNzZXMgKi8KKyAgICAgICAgICAgICAgICBpZiAoaGEtPmNhY2hlX2ZlYXQgJiBTQ0FUVEVSX0dBVEhFUikgeworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LmNhY2hlNjQuRGVzdEFkZHIgPSAodWxvbmc2NCktMTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5jYWNoZTY0LnNnX2NhbnogPSAxOworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LmNhY2hlNjQuc2dfbHN0WzBdLnNnX3B0ciA9IHBhZGRyOworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LmNhY2hlNjQuc2dfbHN0WzBdLnNnX2xlbiA9IGdlbi5kYXRhX2xlbjsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5jYWNoZTY0LnNnX2xzdFsxXS5zZ19sZW4gPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUuY2FjaGU2NC5EZXN0QWRkciA9IHBhZGRyOworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LmNhY2hlNjQuc2dfY2FueiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaGEtPmNhY2hlX2ZlYXQgJiBTQ0FUVEVSX0dBVEhFUikgeworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LmNhY2hlLkRlc3RBZGRyID0gMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5jYWNoZS5zZ19jYW56ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5jYWNoZS5zZ19sc3RbMF0uc2dfcHRyID0gKHVsb25nMzIpcGFkZHI7CisgICAgICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUuY2FjaGUuc2dfbHN0WzBdLnNnX2xlbiA9IGdlbi5kYXRhX2xlbjsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5jYWNoZS5zZ19sc3RbMV0uc2dfbGVuID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LmNhY2hlLkRlc3RBZGRyID0gcGFkZHI7CisgICAgICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUuY2FjaGUuc2dfY2FueiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGdlbi5jb21tYW5kLlNlcnZpY2UgPT0gU0NTSVJBV1NFUlZJQ0UpIHsKKyAgICAgICAgICAgIGlmIChoYS0+cmF3X2ZlYXQgJiBHRFRfNjRCSVQpIHsKKyAgICAgICAgICAgICAgICAvKiBjb3B5IGVsZW1lbnRzIGZyb20gMzItYml0IElPQ1RMIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgICAgIGNoYXIgY21kWzE2XTsKKyAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LnJhdzY0LnNlbnNlX2xlbiA9IGdlbi5jb21tYW5kLnUucmF3LnNlbnNlX2xlbjsKKyAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LnJhdzY0LmJ1cyA9IGdlbi5jb21tYW5kLnUucmF3LmJ1czsKKyAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LnJhdzY0Lmx1biA9IGdlbi5jb21tYW5kLnUucmF3Lmx1bjsKKyAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LnJhdzY0LnRhcmdldCA9IGdlbi5jb21tYW5kLnUucmF3LnRhcmdldDsKKyAgICAgICAgICAgICAgICBtZW1jcHkoY21kLCBnZW4uY29tbWFuZC51LnJhdy5jbWQsIDE2KTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZ2VuLmNvbW1hbmQudS5yYXc2NC5jbWQsIGNtZCwgMTYpOworICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUucmF3NjQuY2xlbiA9IGdlbi5jb21tYW5kLnUucmF3LmNsZW47CisgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5yYXc2NC5zZGxlbiA9IGdlbi5jb21tYW5kLnUucmF3LnNkbGVuOworICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUucmF3NjQuZGlyZWN0aW9uID0gZ2VuLmNvbW1hbmQudS5yYXcuZGlyZWN0aW9uOworICAgICAgICAgICAgICAgIC8qIGFkZHJlc3NlcyAqLworICAgICAgICAgICAgICAgIGlmIChoYS0+cmF3X2ZlYXQgJiBTQ0FUVEVSX0dBVEhFUikgeworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LnJhdzY0LnNkYXRhID0gKHVsb25nNjQpLTE7CisgICAgICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUucmF3NjQuc2dfcmFueiA9IDE7CisgICAgICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUucmF3NjQuc2dfbHN0WzBdLnNnX3B0ciA9IHBhZGRyOworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LnJhdzY0LnNnX2xzdFswXS5zZ19sZW4gPSBnZW4uZGF0YV9sZW47CisgICAgICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUucmF3NjQuc2dfbHN0WzFdLnNnX2xlbiA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5yYXc2NC5zZGF0YSA9IHBhZGRyOworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LnJhdzY0LnNnX3JhbnogPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LnJhdzY0LnNlbnNlX2RhdGEgPSBwYWRkciArIGdlbi5kYXRhX2xlbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGhhLT5yYXdfZmVhdCAmIFNDQVRURVJfR0FUSEVSKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUucmF3LnNkYXRhID0gMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5yYXcuc2dfcmFueiA9IDE7CisgICAgICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUucmF3LnNnX2xzdFswXS5zZ19wdHIgPSAodWxvbmczMilwYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5yYXcuc2dfbHN0WzBdLnNnX2xlbiA9IGdlbi5kYXRhX2xlbjsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5yYXcuc2dfbHN0WzFdLnNnX2xlbiA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5yYXcuc2RhdGEgPSBwYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5yYXcuc2dfcmFueiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUucmF3LnNlbnNlX2RhdGEgPSAodWxvbmczMilwYWRkciArIGdlbi5kYXRhX2xlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdkdGhfaW9jdGxfZnJlZShoYW51bSwgZ2VuLmRhdGFfbGVuK2dlbi5zZW5zZV9sZW4sIGJ1ZiwgcGFkZHIpOworICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgIH0KKyAgICB9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgc3JwICA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChoYS0+c2RldiwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFzcnApCisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIHNycC0+c3JfY21kX2xlbiA9IDEyOworICAgIHNycC0+c3JfdXNlX3NnID0gMDsKKyAgICBnZHRoX2RvX3JlcShzcnAsICZnZW4uY29tbWFuZCwgY21uZCwgZ2VuLnRpbWVvdXQpOworICAgIGdlbi5zdGF0dXMgPSBzcnAtPnNyX2NvbW1hbmQtPlNDcC5TdGF0dXM7CisgICAgZ2VuLmluZm8gPSBzcnAtPnNyX2NvbW1hbmQtPlNDcC5NZXNzYWdlOworICAgIHNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNycCk7CisjZWxzZQorICAgIHNjcCAgPSBzY3NpX2FsbG9jYXRlX2RldmljZShoYS0+c2RldiwgMSwgRkFMU0UpOworICAgIGlmICghc2NwKQorICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICBzY3AtPmNtZF9sZW4gPSAxMjsKKyAgICBzY3AtPnVzZV9zZyA9IDA7CisgICAgZ2R0aF9kb19jbWQoc2NwLCAmZ2VuLmNvbW1hbmQsIGNtbmQsIGdlbi50aW1lb3V0KTsKKyAgICBnZW4uc3RhdHVzID0gc2NwLT5TQ3AuU3RhdHVzOworICAgIGdlbi5pbmZvID0gc2NwLT5TQ3AuTWVzc2FnZTsKKyAgICBzY3NpX3JlbGVhc2VfY29tbWFuZChzY3ApOworI2VuZGlmCisKKyAgICBpZiAoY29weV90b191c2VyKGFyZyArIHNpemVvZihnZHRoX2lvY3RsX2dlbmVyYWwpLCBidWYsIAorICAgICAgICAgICAgICAgICAgICAgZ2VuLmRhdGFfbGVuICsgZ2VuLnNlbnNlX2xlbikpIHsKKyAgICAgICAgZ2R0aF9pb2N0bF9mcmVlKGhhbnVtLCBnZW4uZGF0YV9sZW4rZ2VuLnNlbnNlX2xlbiwgYnVmLCBwYWRkcik7CisgICAgICAgIHJldHVybiAtRUZBVUxUOyAKKyAgICB9IAorICAgIGlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZ2VuLCAKKyAgICAgICAgc2l6ZW9mKGdkdGhfaW9jdGxfZ2VuZXJhbCkgLSBzaXplb2YoZ2R0aF9jbWRfc3RyKSkpIHsKKyAgICAgICAgZ2R0aF9pb2N0bF9mcmVlKGhhbnVtLCBnZW4uZGF0YV9sZW4rZ2VuLnNlbnNlX2xlbiwgYnVmLCBwYWRkcik7CisgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgIH0KKyAgICBnZHRoX2lvY3RsX2ZyZWUoaGFudW0sIGdlbi5kYXRhX2xlbitnZW4uc2Vuc2VfbGVuLCBidWYsIHBhZGRyKTsKKyAgICByZXR1cm4gMDsKK30KKyAKK3N0YXRpYyBpbnQgaW9jX2hkcmxpc3Qodm9pZCBfX3VzZXIgKmFyZywgY2hhciAqY21uZCkKK3sKKyAgICBnZHRoX2lvY3RsX3Jlc2NhbiAqcnNjOworICAgIGdkdGhfY21kX3N0ciAqY21kOworICAgIGdkdGhfaGFfc3RyICpoYTsKKyAgICB1bmNoYXIgaTsKKyAgICBpbnQgaGFudW0sIHJjID0gLUVOT01FTTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgU2NzaV9SZXF1ZXN0ICpzcnA7CisjZWxzZQorICAgIFNjc2lfQ21uZCAqc2NwOworI2VuZGlmCisgICAgICAgIAorICAgIHJzYyA9IGttYWxsb2Moc2l6ZW9mKCpyc2MpLCBHRlBfS0VSTkVMKTsKKyAgICBjbWQgPSBrbWFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFyc2MgfHwgIWNtZCkKKwlnb3RvIGZyZWVfZmFpbDsKKworICAgIGlmIChjb3B5X2Zyb21fdXNlcihyc2MsIGFyZywgc2l6ZW9mKGdkdGhfaW9jdGxfcmVzY2FuKSkgfHwKKyAgICAgICAgcnNjLT5pb25vZGUgPj0gZ2R0aF9jdHJfY291bnQpIHsKKyAgICAgICAgcmMgPSAtRUZBVUxUOworCWdvdG8gZnJlZV9mYWlsOworICAgIH0KKyAgICBoYW51bSA9IHJzYy0+aW9ub2RlOworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIG1lbXNldChjbWQsIDAsIHNpemVvZihnZHRoX2NtZF9zdHIpKTsKKyAgIAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICBzcnAgID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KGhhLT5zZGV2LCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIXNycCkKKyAgICAgICAgZ290byBmcmVlX2ZhaWw7CisgICAgc3JwLT5zcl9jbWRfbGVuID0gMTI7CisgICAgc3JwLT5zcl91c2Vfc2cgPSAwOworI2Vsc2UKKyAgICBzY3AgID0gc2NzaV9hbGxvY2F0ZV9kZXZpY2UoaGEtPnNkZXYsIDEsIEZBTFNFKTsKKyAgICBpZiAoIXNjcCkKKyAgICAgICAgZ290byBmcmVlX2ZhaWw7CisgICAgc2NwLT5jbWRfbGVuID0gMTI7CisgICAgc2NwLT51c2Vfc2cgPSAwOworI2VuZGlmCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0hEUklWRVM7ICsraSkgeyAKKyAgICAgICAgaWYgKCFoYS0+aGRyW2ldLnByZXNlbnQpIHsKKyAgICAgICAgICAgIHJzYy0+aGRyX2xpc3RbaV0uYnVzID0gMHhmZjsgCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSAKKyAgICAgICAgcnNjLT5oZHJfbGlzdFtpXS5idXMgPSBoYS0+dmlydF9idXM7CisgICAgICAgIHJzYy0+aGRyX2xpc3RbaV0udGFyZ2V0ID0gaTsKKyAgICAgICAgcnNjLT5oZHJfbGlzdFtpXS5sdW4gPSAwOworICAgICAgICByc2MtPmhkcl9saXN0W2ldLmNsdXN0ZXJfdHlwZSA9IGhhLT5oZHJbaV0uY2x1c3Rlcl90eXBlOworICAgICAgICBpZiAoaGEtPmhkcltpXS5jbHVzdGVyX3R5cGUgJiBDTFVTVEVSX0RSSVZFKSB7IAorICAgICAgICAgICAgY21kLT5TZXJ2aWNlID0gQ0FDSEVTRVJWSUNFOworICAgICAgICAgICAgY21kLT5PcENvZGUgPSBHRFRfQ0xVU1RfSU5GTzsKKyAgICAgICAgICAgIGlmIChoYS0+Y2FjaGVfZmVhdCAmIEdEVF82NEJJVCkKKyAgICAgICAgICAgICAgICBjbWQtPnUuY2FjaGU2NC5EZXZpY2VObyA9IGk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY21kLT51LmNhY2hlLkRldmljZU5vID0gaTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgICAgICAgICBnZHRoX2RvX3JlcShzcnAsIGNtZCwgY21uZCwgMzApOworICAgICAgICAgICAgaWYgKHNycC0+c3JfY29tbWFuZC0+U0NwLlN0YXR1cyA9PSBTX09LKQorICAgICAgICAgICAgICAgIHJzYy0+aGRyX2xpc3RbaV0uY2x1c3Rlcl90eXBlID0gc3JwLT5zcl9jb21tYW5kLT5TQ3AuTWVzc2FnZTsKKyNlbHNlCisgICAgICAgICAgICBnZHRoX2RvX2NtZChzY3AsIGNtZCwgY21uZCwgMzApOworICAgICAgICAgICAgaWYgKHNjcC0+U0NwLlN0YXR1cyA9PSBTX09LKQorICAgICAgICAgICAgICAgIHJzYy0+aGRyX2xpc3RbaV0uY2x1c3Rlcl90eXBlID0gc2NwLT5TQ3AuTWVzc2FnZTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfSAKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JwKTsKKyNlbHNlCisgICAgc2NzaV9yZWxlYXNlX2NvbW1hbmQoc2NwKTsKKyNlbmRpZiAgICAgICAKKyAKKyAgICBpZiAoY29weV90b191c2VyKGFyZywgcnNjLCBzaXplb2YoZ2R0aF9pb2N0bF9yZXNjYW4pKSkKKyAgICAgICAgcmMgPSAtRUZBVUxUOworICAgIGVsc2UKKwlyYyA9IDA7CisKK2ZyZWVfZmFpbDoKKyAgICBrZnJlZShyc2MpOworICAgIGtmcmVlKGNtZCk7CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGlvY19yZXNjYW4odm9pZCBfX3VzZXIgKmFyZywgY2hhciAqY21uZCkKK3sKKyAgICBnZHRoX2lvY3RsX3Jlc2NhbiAqcnNjOworICAgIGdkdGhfY21kX3N0ciAqY21kOworICAgIHVzaG9ydCBpLCBzdGF0dXMsIGhkcl9jbnQ7CisgICAgdWxvbmczMiBpbmZvOworICAgIGludCBoYW51bSwgY3lscywgaGRzLCBzZWNzOworICAgIGludCByYyA9IC1FTk9NRU07CisgICAgdWxvbmcgZmxhZ3M7CisgICAgZ2R0aF9oYV9zdHIgKmhhOyAKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgU2NzaV9SZXF1ZXN0ICpzcnA7CisjZWxzZQorICAgIFNjc2lfQ21uZCAqc2NwOworI2VuZGlmCisKKyAgICByc2MgPSBrbWFsbG9jKHNpemVvZigqcnNjKSwgR0ZQX0tFUk5FTCk7CisgICAgY21kID0ga21hbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOworICAgIGlmICghY21kIHx8ICFyc2MpCisJZ290byBmcmVlX2ZhaWw7CisKKyAgICBpZiAoY29weV9mcm9tX3VzZXIocnNjLCBhcmcsIHNpemVvZihnZHRoX2lvY3RsX3Jlc2NhbikpIHx8CisgICAgICAgIHJzYy0+aW9ub2RlID49IGdkdGhfY3RyX2NvdW50KSB7CisJcmMgPSAtRUZBVUxUOworCWdvdG8gZnJlZV9mYWlsOworICAgIH0KKyAgICBoYW51bSA9IHJzYy0+aW9ub2RlOworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIG1lbXNldChjbWQsIDAsIHNpemVvZihnZHRoX2NtZF9zdHIpKTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICBzcnAgID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KGhhLT5zZGV2LCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIXNycCkKKyAgICAgICAgZ290byBmcmVlX2ZhaWw7CisgICAgc3JwLT5zcl9jbWRfbGVuID0gMTI7CisgICAgc3JwLT5zcl91c2Vfc2cgPSAwOworI2Vsc2UKKyAgICBzY3AgID0gc2NzaV9hbGxvY2F0ZV9kZXZpY2UoaGEtPnNkZXYsIDEsIEZBTFNFKTsKKyAgICBpZiAoIXNjcCkKKyAgICAgICAgZ290byBmcmVlX2ZhaWw7CisgICAgc2NwLT5jbWRfbGVuID0gMTI7CisgICAgc2NwLT51c2Vfc2cgPSAwOworI2VuZGlmCisgICAgIAorICAgIGlmIChyc2MtPmZsYWcgPT0gMCkgeworICAgICAgICAvKiBvbGQgbWV0aG9kOiByZS1pbml0LiBjYWNoZSBzZXJ2aWNlICovCisgICAgICAgIGNtZC0+U2VydmljZSA9IENBQ0hFU0VSVklDRTsKKyAgICAgICAgaWYgKGhhLT5jYWNoZV9mZWF0ICYgR0RUXzY0QklUKSB7CisgICAgICAgICAgICBjbWQtPk9wQ29kZSA9IEdEVF9YX0lOSVRfSE9TVDsKKyAgICAgICAgICAgIGNtZC0+dS5jYWNoZTY0LkRldmljZU5vID0gTElOVVhfT1M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbWQtPk9wQ29kZSA9IEdEVF9JTklUOworICAgICAgICAgICAgY21kLT51LmNhY2hlLkRldmljZU5vID0gTElOVVhfT1M7CisgICAgICAgIH0KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgICAgIGdkdGhfZG9fcmVxKHNycCwgY21kLCBjbW5kLCAzMCk7CisgICAgICAgIHN0YXR1cyA9ICh1c2hvcnQpc3JwLT5zcl9jb21tYW5kLT5TQ3AuU3RhdHVzOworICAgICAgICBpbmZvID0gKHVsb25nMzIpc3JwLT5zcl9jb21tYW5kLT5TQ3AuTWVzc2FnZTsKKyNlbGlmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMCkKKyAgICAgICAgZ2R0aF9kb19jbWQoc2NwLCBjbWQsIGNtbmQsIDMwKTsKKyAgICAgICAgc3RhdHVzID0gKHVzaG9ydClzY3AtPlNDcC5TdGF0dXM7CisgICAgICAgIGluZm8gPSAodWxvbmczMilzY3AtPlNDcC5NZXNzYWdlOworI2Vsc2UKKyAgICAgICAgZ2R0aF9kb19jbWQoJnNjcCwgY21kLCBjbW5kLCAzMCk7CisgICAgICAgIHN0YXR1cyA9ICh1c2hvcnQpc2NwLlNDcC5TdGF0dXM7CisgICAgICAgIGluZm8gPSAodWxvbmczMilzY3AuU0NwLk1lc3NhZ2U7CisjZW5kaWYKKyAgICAgICAgaSA9IDA7CisgICAgICAgIGhkcl9jbnQgPSAoc3RhdHVzID09IFNfT0sgPyAodXNob3J0KWluZm8gOiAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpID0gcnNjLT5oZHJfbm87CisgICAgICAgIGhkcl9jbnQgPSBpICsgMTsKKyAgICB9CisKKyAgICBmb3IgKDsgaSA8IGhkcl9jbnQgJiYgaSA8IE1BWF9IRFJJVkVTOyArK2kpIHsKKyAgICAgICAgY21kLT5TZXJ2aWNlID0gQ0FDSEVTRVJWSUNFOworICAgICAgICBjbWQtPk9wQ29kZSA9IEdEVF9JTkZPOworICAgICAgICBpZiAoaGEtPmNhY2hlX2ZlYXQgJiBHRFRfNjRCSVQpIAorICAgICAgICAgICAgY21kLT51LmNhY2hlNjQuRGV2aWNlTm8gPSBpOworICAgICAgICBlbHNlIAorICAgICAgICAgICAgY21kLT51LmNhY2hlLkRldmljZU5vID0gaTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgICAgIGdkdGhfZG9fcmVxKHNycCwgY21kLCBjbW5kLCAzMCk7CisgICAgICAgIHN0YXR1cyA9ICh1c2hvcnQpc3JwLT5zcl9jb21tYW5kLT5TQ3AuU3RhdHVzOworICAgICAgICBpbmZvID0gKHVsb25nMzIpc3JwLT5zcl9jb21tYW5kLT5TQ3AuTWVzc2FnZTsKKyNlbHNlCisgICAgICAgIGdkdGhfZG9fY21kKHNjcCwgY21kLCBjbW5kLCAzMCk7CisgICAgICAgIHN0YXR1cyA9ICh1c2hvcnQpc2NwLT5TQ3AuU3RhdHVzOworICAgICAgICBpbmZvID0gKHVsb25nMzIpc2NwLT5TQ3AuTWVzc2FnZTsKKyNlbmRpZgorICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgIHJzYy0+aGRyX2xpc3RbaV0uYnVzID0gaGEtPnZpcnRfYnVzOworICAgICAgICByc2MtPmhkcl9saXN0W2ldLnRhcmdldCA9IGk7CisgICAgICAgIHJzYy0+aGRyX2xpc3RbaV0ubHVuID0gMDsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBTX09LKSB7CisgICAgICAgICAgICBoYS0+aGRyW2ldLnByZXNlbnQgPSBGQUxTRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhhLT5oZHJbaV0ucHJlc2VudCA9IFRSVUU7CisgICAgICAgICAgICBoYS0+aGRyW2ldLnNpemUgPSBpbmZvOworICAgICAgICAgICAgLyogZXZhbHVhdGUgbWFwcGluZyAqLworICAgICAgICAgICAgaGEtPmhkcltpXS5zaXplICY9IH5TRUNTMzI7CisgICAgICAgICAgICBnZHRoX2V2YWxfbWFwcGluZyhoYS0+aGRyW2ldLnNpemUsJmN5bHMsJmhkcywmc2Vjcyk7IAorICAgICAgICAgICAgaGEtPmhkcltpXS5oZWFkcyA9IGhkczsKKyAgICAgICAgICAgIGhhLT5oZHJbaV0uc2VjcyA9IHNlY3M7CisgICAgICAgICAgICAvKiByb3VuZCBzaXplICovCisgICAgICAgICAgICBoYS0+aGRyW2ldLnNpemUgPSBjeWxzICogaGRzICogc2VjczsKKyAgICAgICAgfQorICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBTX09LKQorICAgICAgICAgICAgY29udGludWU7IAorICAgICAgICAKKyAgICAgICAgLyogZXh0ZW5kZWQgaW5mbywgaWYgR0RUXzY0QklULCBmb3IgZHJpdmVzID4gMiBUQiAqLworICAgICAgICAvKiBidXQgd2UgbmVlZCBoYS0+aW5mbzIsIG5vdCB5ZXQgc3RvcmVkIGluIHNjcC0+U0NwICovCisKKyAgICAgICAgLyogZGV2dHlwZSwgY2x1c3RlciBpbmZvLCBSL1cgYXR0cmlicyAqLworICAgICAgICBjbWQtPlNlcnZpY2UgPSBDQUNIRVNFUlZJQ0U7CisgICAgICAgIGNtZC0+T3BDb2RlID0gR0RUX0RFVlRZUEU7CisgICAgICAgIGlmIChoYS0+Y2FjaGVfZmVhdCAmIEdEVF82NEJJVCkgCisgICAgICAgICAgICBjbWQtPnUuY2FjaGU2NC5EZXZpY2VObyA9IGk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNtZC0+dS5jYWNoZS5EZXZpY2VObyA9IGk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgICAgICBnZHRoX2RvX3JlcShzcnAsIGNtZCwgY21uZCwgMzApOworICAgICAgICBzdGF0dXMgPSAodXNob3J0KXNycC0+c3JfY29tbWFuZC0+U0NwLlN0YXR1czsKKyAgICAgICAgaW5mbyA9ICh1bG9uZzMyKXNycC0+c3JfY29tbWFuZC0+U0NwLk1lc3NhZ2U7CisjZWxzZQorICAgICAgICBnZHRoX2RvX2NtZChzY3AsIGNtZCwgY21uZCwgMzApOworICAgICAgICBzdGF0dXMgPSAodXNob3J0KXNjcC0+U0NwLlN0YXR1czsKKyAgICAgICAgaW5mbyA9ICh1bG9uZzMyKXNjcC0+U0NwLk1lc3NhZ2U7CisjZW5kaWYKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgICAgICBoYS0+aGRyW2ldLmRldnR5cGUgPSAoc3RhdHVzID09IFNfT0sgPyAodXNob3J0KWluZm8gOiAwKTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisKKyAgICAgICAgY21kLT5TZXJ2aWNlID0gQ0FDSEVTRVJWSUNFOworICAgICAgICBjbWQtPk9wQ29kZSA9IEdEVF9DTFVTVF9JTkZPOworICAgICAgICBpZiAoaGEtPmNhY2hlX2ZlYXQgJiBHRFRfNjRCSVQpIAorICAgICAgICAgICAgY21kLT51LmNhY2hlNjQuRGV2aWNlTm8gPSBpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjbWQtPnUuY2FjaGUuRGV2aWNlTm8gPSBpOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgZ2R0aF9kb19yZXEoc3JwLCBjbWQsIGNtbmQsIDMwKTsKKyAgICAgICAgc3RhdHVzID0gKHVzaG9ydClzcnAtPnNyX2NvbW1hbmQtPlNDcC5TdGF0dXM7CisgICAgICAgIGluZm8gPSAodWxvbmczMilzcnAtPnNyX2NvbW1hbmQtPlNDcC5NZXNzYWdlOworI2Vsc2UKKyAgICAgICAgZ2R0aF9kb19jbWQoc2NwLCBjbWQsIGNtbmQsIDMwKTsKKyAgICAgICAgc3RhdHVzID0gKHVzaG9ydClzY3AtPlNDcC5TdGF0dXM7CisgICAgICAgIGluZm8gPSAodWxvbmczMilzY3AtPlNDcC5NZXNzYWdlOworI2VuZGlmCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgaGEtPmhkcltpXS5jbHVzdGVyX3R5cGUgPSAKKyAgICAgICAgICAgICgoc3RhdHVzID09IFNfT0sgJiYgIXNoYXJlZF9hY2Nlc3MpID8gKHVzaG9ydClpbmZvIDogMCk7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgICAgICByc2MtPmhkcl9saXN0W2ldLmNsdXN0ZXJfdHlwZSA9IGhhLT5oZHJbaV0uY2x1c3Rlcl90eXBlOworCisgICAgICAgIGNtZC0+U2VydmljZSA9IENBQ0hFU0VSVklDRTsKKyAgICAgICAgY21kLT5PcENvZGUgPSBHRFRfUldfQVRUUklCUzsKKyAgICAgICAgaWYgKGhhLT5jYWNoZV9mZWF0ICYgR0RUXzY0QklUKSAKKyAgICAgICAgICAgIGNtZC0+dS5jYWNoZTY0LkRldmljZU5vID0gaTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY21kLT51LmNhY2hlLkRldmljZU5vID0gaTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgICAgIGdkdGhfZG9fcmVxKHNycCwgY21kLCBjbW5kLCAzMCk7CisgICAgICAgIHN0YXR1cyA9ICh1c2hvcnQpc3JwLT5zcl9jb21tYW5kLT5TQ3AuU3RhdHVzOworICAgICAgICBpbmZvID0gKHVsb25nMzIpc3JwLT5zcl9jb21tYW5kLT5TQ3AuTWVzc2FnZTsKKyNlbHNlCisgICAgICAgIGdkdGhfZG9fY21kKHNjcCwgY21kLCBjbW5kLCAzMCk7CisgICAgICAgIHN0YXR1cyA9ICh1c2hvcnQpc2NwLT5TQ3AuU3RhdHVzOworICAgICAgICBpbmZvID0gKHVsb25nMzIpc2NwLT5TQ3AuTWVzc2FnZTsKKyNlbmRpZgorICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgIGhhLT5oZHJbaV0ucndfYXR0cmlicyA9IChzdGF0dXMgPT0gU19PSyA/ICh1c2hvcnQpaW5mbyA6IDApOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICB9CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgIHNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNycCk7CisjZWxzZQorICAgIHNjc2lfcmVsZWFzZV9jb21tYW5kKHNjcCk7CisjZW5kaWYgICAgICAgCisgCisgICAgaWYgKGNvcHlfdG9fdXNlcihhcmcsIHJzYywgc2l6ZW9mKGdkdGhfaW9jdGxfcmVzY2FuKSkpCisgICAgICAgIHJjID0gLUVGQVVMVDsKKyAgICBlbHNlCisJcmMgPSAwOworCitmcmVlX2ZhaWw6CisgICAga2ZyZWUocnNjKTsKKyAgICBrZnJlZShjbWQpOworICAgIHJldHVybiByYzsKK30KKyAgCitzdGF0aWMgaW50IGdkdGhfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgIGdkdGhfaGFfc3RyICpoYTsgCisgICAgU2NzaV9DbW5kICpzY3A7CisgICAgdWxvbmcgZmxhZ3M7CisgICAgY2hhciBjbW5kW01BWF9DT01NQU5EX1NJWkVdOyAgIAorICAgIHZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisgICAgbWVtc2V0KGNtbmQsIDB4ZmYsIDEyKTsKKyAgICAKKyAgICBUUkFDRSgoImdkdGhfaW9jdGwoKSBjbWQgMHgleFxuIiwgY21kKSk7CisgCisgICAgc3dpdGNoIChjbWQpIHsKKyAgICAgIGNhc2UgR0RUSU9DVExfQ1RSQ05UOgorICAgICAgeyAKKyAgICAgICAgaW50IGNudCA9IGdkdGhfY3RyX2NvdW50OworICAgICAgICBpZiAocHV0X3VzZXIoY250LCAoaW50IF9fdXNlciAqKWFyZ3ApKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBHRFRJT0NUTF9EUlZFUlM6CisgICAgICB7IAorICAgICAgICBpbnQgdmVyID0gKEdEVEhfVkVSU0lPTjw8OCkgfCBHRFRIX1NVQlZFUlNJT047CisgICAgICAgIGlmIChwdXRfdXNlcih2ZXIsIChpbnQgX191c2VyICopYXJncCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICBjYXNlIEdEVElPQ1RMX09TVkVSUzoKKyAgICAgIHsgCisgICAgICAgIGdkdGhfaW9jdGxfb3N2ZXJzIG9zdjsgCisKKyAgICAgICAgb3N2LnZlcnNpb24gPSAodW5jaGFyKShMSU5VWF9WRVJTSU9OX0NPREUgPj4gMTYpOworICAgICAgICBvc3Yuc3VidmVyc2lvbiA9ICh1bmNoYXIpKExJTlVYX1ZFUlNJT05fQ09ERSA+PiA4KTsKKyAgICAgICAgb3N2LnJldmlzaW9uID0gKHVzaG9ydCkoTElOVVhfVkVSU0lPTl9DT0RFICYgMHhmZik7CisgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm9zdiwgc2l6ZW9mKGdkdGhfaW9jdGxfb3N2ZXJzKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdEVElPQ1RMX0NUUlRZUEU6CisgICAgICB7IAorICAgICAgICBnZHRoX2lvY3RsX2N0cnR5cGUgY3RydDsKKyAgICAgICAgCisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmY3RydCwgYXJncCwgc2l6ZW9mKGdkdGhfaW9jdGxfY3RydHlwZSkpIHx8CisgICAgICAgICAgICBjdHJ0Lmlvbm9kZSA+PSBnZHRoX2N0cl9jb3VudCkKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbY3RydC5pb25vZGVdKTsKKyAgICAgICAgaWYgKGhhLT50eXBlID09IEdEVF9JU0EgfHwgaGEtPnR5cGUgPT0gR0RUX0VJU0EpIHsKKyAgICAgICAgICAgIGN0cnQudHlwZSA9ICh1bmNoYXIpKChoYS0+c3R5cGU+PjIwKSAtIDB4MTApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGhhLT50eXBlICE9IEdEVF9QQ0lNUFIpIHsKKyAgICAgICAgICAgICAgICBjdHJ0LnR5cGUgPSAodW5jaGFyKSgoaGEtPnN0eXBlPDw0KSArIDYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjdHJ0LnR5cGUgPSAKKyAgICAgICAgICAgICAgICAgICAgKGhhLT5vZW1faWQgPT0gT0VNX0lEX0lOVEVMID8gMHhmZCA6IDB4ZmUpOworICAgICAgICAgICAgICAgIGlmIChoYS0+c3R5cGUgPj0gMHgzMDApCisgICAgICAgICAgICAgICAgICAgIGN0cnQuZXh0X3R5cGUgPSAweDYwMDAgfCBoYS0+c3ViZGV2aWNlX2lkOworICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgICAgIGN0cnQuZXh0X3R5cGUgPSAweDYwMDAgfCBoYS0+c3R5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdHJ0LmRldmljZV9pZCA9IGhhLT5zdHlwZTsKKyAgICAgICAgICAgIGN0cnQuc3ViX2RldmljZV9pZCA9IGhhLT5zdWJkZXZpY2VfaWQ7CisgICAgICAgIH0KKyAgICAgICAgY3RydC5pbmZvID0gaGEtPmJyZF9waHlzOworICAgICAgICBjdHJ0Lm9lbV9pZCA9IGhhLT5vZW1faWQ7CisgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmN0cnQsIHNpemVvZihnZHRoX2lvY3RsX2N0cnR5cGUpKSkKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgICAgCisgICAgICBjYXNlIEdEVElPQ1RMX0dFTkVSQUw6CisgICAgICAgIHJldHVybiBpb2NfZ2VuZXJhbChhcmdwLCBjbW5kKTsKKworICAgICAgY2FzZSBHRFRJT0NUTF9FVkVOVDoKKyAgICAgICAgcmV0dXJuIGlvY19ldmVudChhcmdwKTsKKworICAgICAgY2FzZSBHRFRJT0NUTF9MT0NLRFJWOgorICAgICAgICByZXR1cm4gaW9jX2xvY2tkcnYoYXJncCk7CisKKyAgICAgIGNhc2UgR0RUSU9DVExfTE9DS0NITjoKKyAgICAgIHsKKyAgICAgICAgZ2R0aF9pb2N0bF9sb2NrY2huIGxjaG47CisgICAgICAgIHVuY2hhciBpLCBqOworCisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmbGNobiwgYXJncCwgc2l6ZW9mKGdkdGhfaW9jdGxfbG9ja2NobikpIHx8CisgICAgICAgICAgICBsY2huLmlvbm9kZSA+PSBnZHRoX2N0cl9jb3VudCkKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbbGNobi5pb25vZGVdKTsKKyAgICAgICAgCisgICAgICAgIGkgPSBsY2huLmNoYW5uZWw7CisgICAgICAgIGlmIChpIDwgaGEtPmJ1c19jbnQpIHsKKyAgICAgICAgICAgIGlmIChsY2huLmxvY2spIHsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgaGEtPnJhd1tpXS5sb2NrID0gMTsKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaGEtPnRpZF9jbnQ7ICsraikgeworICAgICAgICAgICAgICAgICAgICBnZHRoX3dhaXRfY29tcGxldGlvbihsY2huLmlvbm9kZSwgaSwgaik7IAorICAgICAgICAgICAgICAgICAgICBnZHRoX3N0b3BfdGltZW91dChsY2huLmlvbm9kZSwgaSwgaik7IAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIGhhLT5yYXdbaV0ubG9jayA9IDA7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGhhLT50aWRfY250OyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgZ2R0aF9zdGFydF90aW1lb3V0KGxjaG4uaW9ub2RlLCBpLCBqKTsgCisgICAgICAgICAgICAgICAgICAgIGdkdGhfbmV4dChsY2huLmlvbm9kZSk7IAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR0RUSU9DVExfUkVTQ0FOOgorICAgICAgICByZXR1cm4gaW9jX3Jlc2NhbihhcmdwLCBjbW5kKTsKKworICAgICAgY2FzZSBHRFRJT0NUTF9IRFJMSVNUOgorICAgICAgICByZXR1cm4gaW9jX2hkcmxpc3QoYXJncCwgY21uZCk7CisKKyAgICAgIGNhc2UgR0RUSU9DVExfUkVTRVRfQlVTOgorICAgICAgeworICAgICAgICBnZHRoX2lvY3RsX3Jlc2V0IHJlczsKKyAgICAgICAgaW50IGhhbnVtLCBydmFsOworCisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmcmVzLCBhcmdwLCBzaXplb2YoZ2R0aF9pb2N0bF9yZXNldCkpIHx8CisgICAgICAgICAgICByZXMuaW9ub2RlID49IGdkdGhfY3RyX2NvdW50KQorICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgIGhhbnVtID0gcmVzLmlvbm9kZTsgCisgICAgICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworCisgICAgICAgIC8qIEJlY2F1c2Ugd2UgbmVlZCBhIFNjc2lfQ21uZCBzdHJ1Y3QuLCB3ZSBtYWtlIGEgc2NzaV9hbGxvY2F0ZSBkZXZpY2UgYWxzbyBmb3Iga2VybmVscyA+PTIuNi54ICovICAgICAgICAKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgICAgIHNjcCAgPSBzY3NpX2dldF9jb21tYW5kKGhhLT5zZGV2LCBHRlBfS0VSTkVMKTsKKyAgICAgICAgaWYgKCFzY3ApCisgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgc2NwLT5jbWRfbGVuID0gMTI7CisgICAgICAgIHNjcC0+dXNlX3NnID0gMDsKKyAgICAgICAgc2NwLT5kZXZpY2UtPmNoYW5uZWwgPSB2aXJ0X2N0ciA/IDAgOiByZXMubnVtYmVyOworICAgICAgICBydmFsID0gZ2R0aF9laF9idXNfcmVzZXQoc2NwKTsKKyAgICAgICAgcmVzLnN0YXR1cyA9IChydmFsID09IFNVQ0NFU1MgPyBTX09LIDogU19HRU5FUlIpOworICAgICAgICBzY3NpX3B1dF9jb21tYW5kKHNjcCk7CisjZWxzZQorICAgICAgICBzY3AgID0gc2NzaV9hbGxvY2F0ZV9kZXZpY2UoaGEtPnNkZXYsIDEsIEZBTFNFKTsKKyAgICAgICAgaWYgKCFzY3ApCisgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgc2NwLT5jbWRfbGVuID0gMTI7CisgICAgICAgIHNjcC0+dXNlX3NnID0gMDsKKyAgICAgICAgc2NwLT5jaGFubmVsID0gdmlydF9jdHIgPyAwIDogcmVzLm51bWJlcjsKKyAgICAgICAgcnZhbCA9IGdkdGhfZWhfYnVzX3Jlc2V0KHNjcCk7CisgICAgICAgIHJlcy5zdGF0dXMgPSAocnZhbCA9PSBTVUNDRVNTID8gU19PSyA6IFNfR0VORVJSKTsKKyAgICAgICAgc2NzaV9yZWxlYXNlX2NvbW1hbmQoc2NwKTsKKyNlbmRpZgorICAgICAgICBpZiAoY29weV90b191c2VyKGFyZ3AsICZyZXMsIHNpemVvZihnZHRoX2lvY3RsX3Jlc2V0KSkpCisgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR0RUSU9DVExfUkVTRVRfRFJWOgorICAgICAgICByZXR1cm4gaW9jX3Jlc2V0ZHJ2KGFyZ3AsIGNtbmQpOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsgCisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8qIGZsdXNoIHJvdXRpbmUgKi8KK3N0YXRpYyB2b2lkIGdkdGhfZmx1c2goaW50IGhhbnVtKQoreworICAgIGludCAgICAgICAgICAgICBpOworICAgIGdkdGhfaGFfc3RyICAgICAqaGE7CisgICAgZ2R0aF9jbWRfc3RyICAgIGdkdGNtZDsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgU2NzaV9SZXF1ZXN0ICAgICpzcnA7CisjZWxzZQorICAgIFNjc2lfQ21uZCAgICAgICAqc2NwOworI2VuZGlmCisgICAgU2NzaV9EZXZpY2UgICAgICpzZGV2OworICAgIGNoYXIgICAgICAgICAgICBjbW5kW01BWF9DT01NQU5EX1NJWkVdOyAgIAorICAgIG1lbXNldChjbW5kLCAweGZmLCBNQVhfQ09NTUFORF9TSVpFKTsKKworICAgIFRSQUNFMigoImdkdGhfZmx1c2goKSBoYW51bSAlZFxuIixoYW51bSkpOworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgIHNkZXYgPSBzY3NpX2dldF9ob3N0X2RldihnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICBzcnAgID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KHNkZXYsIEdGUF9LRVJORUwpOworICAgIGlmICghc3JwKQorICAgICAgICByZXR1cm47CisgICAgc3JwLT5zcl9jbWRfbGVuID0gMTI7CisgICAgc3JwLT5zcl91c2Vfc2cgPSAwOworI2Vsc2UKKyAgICBzZGV2ID0gc2NzaV9nZXRfaG9zdF9kZXYoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgc2NwICA9IHNjc2lfYWxsb2NhdGVfZGV2aWNlKHNkZXYsIDEsIEZBTFNFKTsKKyAgICBpZiAoIXNjcCkKKyAgICAgICAgcmV0dXJuOworICAgIHNjcC0+Y21kX2xlbiA9IDEyOworICAgIHNjcC0+dXNlX3NnID0gMDsKKyNlbmRpZgorCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9IRFJJVkVTOyArK2kpIHsKKyAgICAgICAgaWYgKGhhLT5oZHJbaV0ucHJlc2VudCkgeworICAgICAgICAgICAgZ2R0Y21kLkJvYXJkTm9kZSA9IExPQ0FMQk9BUkQ7CisgICAgICAgICAgICBnZHRjbWQuU2VydmljZSA9IENBQ0hFU0VSVklDRTsKKyAgICAgICAgICAgIGdkdGNtZC5PcENvZGUgPSBHRFRfRkxVU0g7CisgICAgICAgICAgICBpZiAoaGEtPmNhY2hlX2ZlYXQgJiBHRFRfNjRCSVQpIHsgCisgICAgICAgICAgICAgICAgZ2R0Y21kLnUuY2FjaGU2NC5EZXZpY2VObyA9IGk7CisgICAgICAgICAgICAgICAgZ2R0Y21kLnUuY2FjaGU2NC5CbG9ja05vID0gMTsKKyAgICAgICAgICAgICAgICBnZHRjbWQudS5jYWNoZTY0LnNnX2NhbnogPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZHRjbWQudS5jYWNoZS5EZXZpY2VObyA9IGk7CisgICAgICAgICAgICAgICAgZ2R0Y21kLnUuY2FjaGUuQmxvY2tObyA9IDE7CisgICAgICAgICAgICAgICAgZ2R0Y21kLnUuY2FjaGUuc2dfY2FueiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUUkFDRTIoKCJnZHRoX2ZsdXNoKCk6IGZsdXNoIGhhICVkIGRyaXZlICVkXG4iLCBoYW51bSwgaSkpOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgICAgIGdkdGhfZG9fcmVxKHNycCwgJmdkdGNtZCwgY21uZCwgMzApOworI2Vsc2UKKyAgICAgICAgICAgIGdkdGhfZG9fY21kKHNjcCwgJmdkdGNtZCwgY21uZCwgMzApOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgIHNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNycCk7CisgICAgc2NzaV9mcmVlX2hvc3RfZGV2KHNkZXYpOworI2Vsc2UKKyAgICBzY3NpX3JlbGVhc2VfY29tbWFuZChzY3ApOworICAgIHNjc2lfZnJlZV9ob3N0X2RldihzZGV2KTsKKyNlbmRpZgorfQorCisvKiBzaHV0ZG93biByb3V0aW5lICovCitzdGF0aWMgaW50IGdkdGhfaGFsdChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bG9uZyBldmVudCwgdm9pZCAqYnVmKQoreworICAgIGludCAgICAgICAgICAgICBoYW51bTsKKyNpZm5kZWYgX19hbHBoYV9fCisgICAgZ2R0aF9jbWRfc3RyICAgIGdkdGNtZDsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgU2NzaV9SZXF1ZXN0ICAgICpzcnA7CisgICAgU2NzaV9EZXZpY2UgICAgICpzZGV2OworI2Vsc2UKKyAgICBTY3NpX0NtbmQgICAgICAgKnNjcDsKKyAgICBTY3NpX0RldmljZSAgICAgKnNkZXY7CisjZW5kaWYKKyAgICBjaGFyICAgICAgICAgICAgY21uZFtNQVhfQ09NTUFORF9TSVpFXTsgICAKKyNlbmRpZgorCisgICAgVFJBQ0UyKCgiZ2R0aF9oYWx0KCkgZXZlbnQgJWRcbiIsKGludClldmVudCkpOworICAgIGlmIChldmVudCAhPSBTWVNfUkVTVEFSVCAmJiBldmVudCAhPSBTWVNfSEFMVCAmJiBldmVudCAhPSBTWVNfUE9XRVJfT0ZGKQorICAgICAgICByZXR1cm4gTk9USUZZX0RPTkU7CisKKyAgICBwcmludGsoIkdEVC1IQTogRmx1c2hpbmcgYWxsIGhvc3QgZHJpdmVzIC4uICIpOworICAgIGZvciAoaGFudW0gPSAwOyBoYW51bSA8IGdkdGhfY3RyX2NvdW50OyArK2hhbnVtKSB7CisgICAgICAgIGdkdGhfZmx1c2goaGFudW0pOworCisjaWZuZGVmIF9fYWxwaGFfXworICAgICAgICAvKiBjb250cm9sbGVyIHJlc2V0ICovCisgICAgICAgIG1lbXNldChjbW5kLCAweGZmLCBNQVhfQ09NTUFORF9TSVpFKTsKKyAgICAgICAgZ2R0Y21kLkJvYXJkTm9kZSA9IExPQ0FMQk9BUkQ7CisgICAgICAgIGdkdGNtZC5TZXJ2aWNlID0gQ0FDSEVTRVJWSUNFOworICAgICAgICBnZHRjbWQuT3BDb2RlID0gR0RUX1JFU0VUOworICAgICAgICBUUkFDRTIoKCJnZHRoX2hhbHQoKTogcmVzZXQgY29udHJvbGxlciAlZFxuIiwgaGFudW0pKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgICAgIHNkZXYgPSBzY3NpX2dldF9ob3N0X2RldihnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICAgICAgc3JwICA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChzZGV2LCBHRlBfS0VSTkVMKTsKKyAgICAgICAgaWYgKCFzcnApIHsKKyAgICAgICAgICAgIHVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZnZHRoX25vdGlmaWVyKTsKKyAgICAgICAgICAgIHJldHVybiBOT1RJRllfT0s7CisgICAgICAgIH0KKyAgICAgICAgc3JwLT5zcl9jbWRfbGVuID0gMTI7CisgICAgICAgIHNycC0+c3JfdXNlX3NnID0gMDsKKyAgICAgICAgZ2R0aF9kb19yZXEoc3JwLCAmZ2R0Y21kLCBjbW5kLCAxMCk7CisgICAgICAgIHNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNycCk7CisgICAgICAgIHNjc2lfZnJlZV9ob3N0X2RldihzZGV2KTsKKyNlbHNlCisgICAgICAgIHNkZXYgPSBzY3NpX2dldF9ob3N0X2RldihnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICAgICAgc2NwICA9IHNjc2lfYWxsb2NhdGVfZGV2aWNlKHNkZXYsIDEsIEZBTFNFKTsKKyAgICAgICAgaWYgKCFzY3ApIHsKKyAgICAgICAgICAgIHVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZnZHRoX25vdGlmaWVyKTsKKyAgICAgICAgICAgIHJldHVybiBOT1RJRllfT0s7CisgICAgICAgIH0KKyAgICAgICAgc2NwLT5jbWRfbGVuID0gMTI7CisgICAgICAgIHNjcC0+dXNlX3NnID0gMDsKKyAgICAgICAgZ2R0aF9kb19jbWQoc2NwLCAmZ2R0Y21kLCBjbW5kLCAxMCk7CisgICAgICAgIHNjc2lfcmVsZWFzZV9jb21tYW5kKHNjcCk7CisgICAgICAgIHNjc2lfZnJlZV9ob3N0X2RldihzZGV2KTsKKyNlbmRpZgorI2VuZGlmCisgICAgfQorICAgIHByaW50aygiRG9uZS5cbiIpOworCisjaWZkZWYgR0RUSF9TVEFUSVNUSUNTCisgICAgZGVsX3RpbWVyKCZnZHRoX3RpbWVyKTsKKyNlbmRpZgorICAgIHVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZnZHRoX25vdGlmaWVyKTsKKyAgICByZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKyAgICAgICAgLnByb2NfbmFtZSAgICAgICAgICAgICAgPSAiZ2R0aCIsIAorICAgICAgICAucHJvY19pbmZvICAgICAgICAgICAgICA9IGdkdGhfcHJvY19pbmZvLAorICAgICAgICAubmFtZSAgICAgICAgICAgICAgICAgICA9ICJHRFQgU0NTSSBEaXNrIEFycmF5IENvbnRyb2xsZXIiLAorICAgICAgICAuZGV0ZWN0ICAgICAgICAgICAgICAgICA9IGdkdGhfZGV0ZWN0LCAKKyAgICAgICAgLnJlbGVhc2UgICAgICAgICAgICAgICAgPSBnZHRoX3JlbGVhc2UsCisgICAgICAgIC5pbmZvICAgICAgICAgICAgICAgICAgID0gZ2R0aF9pbmZvLCAKKyAgICAgICAgLnF1ZXVlY29tbWFuZCAgICAgICAgICAgPSBnZHRoX3F1ZXVlY29tbWFuZCwKKyAgICAgICAgLmVoX2Fib3J0X2hhbmRsZXIgICAgICAgPSBnZHRoX2VoX2Fib3J0LCAKKyAgICAgICAgLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gZ2R0aF9laF9kZXZpY2VfcmVzZXQsCisgICAgICAgIC5laF9idXNfcmVzZXRfaGFuZGxlciAgID0gZ2R0aF9laF9idXNfcmVzZXQsCisgICAgICAgIC5laF9ob3N0X3Jlc2V0X2hhbmRsZXIgID0gZ2R0aF9laF9ob3N0X3Jlc2V0LAorICAgICAgICAuYmlvc19wYXJhbSAgICAgICAgICAgICA9IGdkdGhfYmlvc19wYXJhbSwKKyAgICAgICAgLmNhbl9xdWV1ZSAgICAgICAgICAgICAgPSBHRFRIX01BWENNRFMsCisgICAgICAgIC50aGlzX2lkICAgICAgICAgICAgICAgID0gLTEsCisgICAgICAgIC5zZ190YWJsZXNpemUgICAgICAgICAgID0gR0RUSF9NQVhTRywKKyAgICAgICAgLmNtZF9wZXJfbHVuICAgICAgICAgICAgPSBHRFRIX01BWENfUF9MLAorICAgICAgICAudW5jaGVja2VkX2lzYV9kbWEgICAgICA9IDEsCisgICAgICAgIC51c2VfY2x1c3RlcmluZyAgICAgICAgID0gRU5BQkxFX0NMVVNURVJJTkcsCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgICAgIC51c2VfbmV3X2VoX2NvZGUgICAgICAgID0gMSwKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKQorICAgICAgICAuaGlnaG1lbV9pbyAgICAgICAgICAgICA9IDEsCisjZW5kaWYKKyNlbmRpZgorfTsKKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisjaWZuZGVmIE1PRFVMRQorX19zZXR1cCgiZ2R0aD0iLCBvcHRpb25fc2V0dXApOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZ2R0aC5oIGIvZHJpdmVycy9zY3NpL2dkdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjI2OWYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2dkdGguaApAQCAtMCwwICsxLDEwNzkgQEAKKyNpZm5kZWYgX0dEVEhfSAorI2RlZmluZSBfR0RUSF9ICisKKy8qCisgKiBIZWFkZXIgZmlsZSBmb3IgdGhlIEdEVCBEaXNrIEFycmF5L1N0b3JhZ2UgUkFJRCBjb250cm9sbGVycyBkcml2ZXIgZm9yIExpbnV4CisgKiAKKyAqIGdkdGguaCBDb3B5cmlnaHQgKEMpIDE5OTUtMDMgSUNQIHZvcnRleCwgQWNoaW0gTGV1Ym5lcgorICogU2VlIGdkdGguYyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbnMgYW5kIAorICogYmVsb3cgZm9yIHN1cHBvcnRlZCBjb250cm9sbGVyIHR5cGVzCisgKgorICogPGFjaGltX2xldWJuZXJAYWRhcHRlYy5jb20+CisgKgorICogJElkOiBnZHRoLmgsdiAxLjU3IDIwMDQvMDMvMzEgMTE6NTI6MDkgYWNoaW0gRXhwICQKKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFIDEKKyNlbmRpZgorI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKworLyogZGVmaW5lcywgbWFjcm9zICovCisKKy8qIGRyaXZlciB2ZXJzaW9uICovCisjZGVmaW5lIEdEVEhfVkVSU0lPTl9TVFIgICAgICAgICIzLjA0IgorI2RlZmluZSBHRFRIX1ZFUlNJT04gICAgICAgICAgICAzCisjZGVmaW5lIEdEVEhfU1VCVkVSU0lPTiAgICAgICAgIDQKKworLyogcHJvdG9jb2wgdmVyc2lvbiAqLworI2RlZmluZSBQUk9UT0NPTF9WRVJTSU9OICAgICAgICAxCisKKy8qIE9FTSBJRHMgKi8KKyNkZWZpbmUgT0VNX0lEX0lDUCAgICAgIDB4OTQxYworI2RlZmluZSBPRU1fSURfSU5URUwgICAgMHg4MDAwCisKKy8qIGNvbnRyb2xsZXIgY2xhc3NlcyAqLworI2RlZmluZSBHRFRfSVNBICAgICAgICAgMHgwMSAgICAgICAgICAgICAgICAgICAgLyogSVNBIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgR0RUX0VJU0EgICAgICAgIDB4MDIgICAgICAgICAgICAgICAgICAgIC8qIEVJU0EgY29udHJvbGxlciAqLworI2RlZmluZSBHRFRfUENJICAgICAgICAgMHgwMyAgICAgICAgICAgICAgICAgICAgLyogUENJIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgR0RUX1BDSU5FVyAgICAgIDB4MDQgICAgICAgICAgICAgICAgICAgIC8qIG5ldyBQQ0kgY29udHJvbGxlciAqLworI2RlZmluZSBHRFRfUENJTVBSICAgICAgMHgwNSAgICAgICAgICAgICAgICAgICAgLyogUENJIE1QUiBjb250cm9sbGVyICovCisvKiBHRFRfRUlTQSwgY29udHJvbGxlciBzdWJ0eXBlcyBFSVNBICovCisjZGVmaW5lIEdEVDNfSUQgICAgICAgICAweDAxMzA5NDFjICAgICAgICAgICAgICAvKiBHRFQzMDAwLzMwMjAgKi8KKyNkZWZpbmUgR0RUM0FfSUQgICAgICAgIDB4MDIzMDk0MWMgICAgICAgICAgICAgIC8qIEdEVDMwMDBBLzMwMjBBLzMwNTBBICovCisjZGVmaW5lIEdEVDNCX0lEICAgICAgICAweDAzMzA5NDFjICAgICAgICAgICAgICAvKiBHRFQzMDAwQi8zMDEwQSAqLworLyogR0RUX0lTQSAqLworI2RlZmluZSBHRFQyX0lEICAgICAgICAgMHgwMTIwOTQxYyAgICAgICAgICAgICAgLyogR0RUMjAwMC8yMDIwICovCisKKy8qIHZlbmRvciBJRCwgZGV2aWNlIElEcyAoUENJKSAqLworLyogdGhlc2UgZGVmaW5lcyBzaG91bGQgYWxyZWFkeSBleGlzdCBpbiA8bGludXgvcGNpLmg+ICovCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfVk9SVEVYCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVk9SVEVYICAgICAgICAgICAgMHgxMTE5ICAvKiBQQ0kgY29udHJvbGxlciB2ZW5kb3IgSUQgKi8KKyNlbmRpZgorI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0lOVEVMCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSU5URUwgICAgICAgICAgICAgMHg4MDg2ICAKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDYweDAKKy8qIEdEVF9QQ0kgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjB4MCAgICAwICAgICAgIC8qIEdEVDYwMDAvNjAyMC82MDUwICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDYwMDBCICAgMSAgICAgICAvKiBHRFQ2MDAwQi82MDEwICovCisvKiBHRFRfUENJTkVXICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MTAgICAgMiAgICAgICAvKiBHRFQ2MTEwLzY1MTAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngyMCAgICAzICAgICAgIC8qIEdEVDYxMjAvNjUyMCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTMwICAgIDQgICAgICAgLyogR0RUNjUzMCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTUwICAgIDUgICAgICAgLyogR0RUNjU1MCAqLworLyogR0RUX1BDSU5FVywgd2lkZS91bHRyYSBTQ1NJIGNvbnRyb2xsZXJzICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MTcgICAgNiAgICAgICAvKiBHRFQ2MTE3LzY1MTcgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngyNyAgICA3ICAgICAgIC8qIEdEVDYxMjcvNjUyNyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTM3ICAgIDggICAgICAgLyogR0RUNjUzNyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTU3ICAgIDkgICAgICAgLyogR0RUNjU1Ny82NTU3LUVDQyAqLworLyogR0RUX1BDSU5FVywgd2lkZSBTQ1NJIGNvbnRyb2xsZXJzICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MTUgICAgMTAgICAgICAvKiBHRFQ2MTE1LzY1MTUgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngyNSAgICAxMSAgICAgIC8qIEdEVDYxMjUvNjUyNSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTM1ICAgIDEyICAgICAgLyogR0RUNjUzNSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTU1ICAgIDEzICAgICAgLyogR0RUNjU1NS82NTU1LUVDQyAqLworI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngxN1JQCisvKiBHRFRfTVBSLCBSUCBzZXJpZXMsIHdpZGUvdWx0cmEgU0NTSSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDE3UlAgIDB4MTAwICAgLyogR0RUNjExN1JQL0dEVDY1MTdSUCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDI3UlAgIDB4MTAxICAgLyogR0RUNjEyN1JQL0dEVDY1MjdSUCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTM3UlAgIDB4MTAyICAgLyogR0RUNjUzN1JQICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDY1NTdSUCAgMHgxMDMgICAvKiBHRFQ2NTU3UlAgKi8KKy8qIEdEVF9NUFIsIFJQIHNlcmllcywgbmFycm93L3VsdHJhIFNDU0kgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngxMVJQICAweDEwNCAgIC8qIEdEVDYxMTFSUC9HRFQ2NTExUlAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngyMVJQICAweDEwNSAgIC8qIEdEVDYxMjFSUC9HRFQ2NTIxUlAgKi8KKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDE3UkQKKy8qIEdEVF9NUFIsIFJEIHNlcmllcywgd2lkZS91bHRyYSBTQ1NJICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MTdSRCAgMHgxMTAgICAvKiBHRFQ2MTE3UkQvR0RUNjUxN1JEICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MjdSRCAgMHgxMTEgICAvKiBHRFQ2MTI3UkQvR0RUNjUyN1JEICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDY1MzdSRCAgMHgxMTIgICAvKiBHRFQ2NTM3UkQgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjU1N1JEICAweDExMyAgIC8qIEdEVDY1NTdSRCAqLworLyogR0RUX01QUiwgUkQgc2VyaWVzLCBuYXJyb3cvdWx0cmEgU0NTSSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDExUkQgIDB4MTE0ICAgLyogR0RUNjExMVJEL0dEVDY1MTFSRCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDIxUkQgIDB4MTE1ICAgLyogR0RUNjEyMVJEL0dEVDY1MjFSRCAqLworLyogR0RUX01QUiwgUkQgc2VyaWVzLCB3aWRlL3VsdHJhMiBTQ1NJICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MThSRCAgMHgxMTggICAvKiBHRFQ2MTE4UkQvR0RUNjUxOFJELworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0RUNjYxOFJEICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MjhSRCAgMHgxMTkgICAvKiBHRFQ2MTI4UkQvR0RUNjUyOFJELworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0RUNjYyOFJEICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MzhSRCAgMHgxMUEgICAvKiBHRFQ2NTM4UkQvR0RUNjYzOFJEICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4NThSRCAgMHgxMUIgICAvKiBHRFQ2NTU4UkQvR0RUNjY1OFJEICovCisvKiBHRFRfTVBSLCBSTiBzZXJpZXMgKDY0LWJpdCBQQ0kpLCB3aWRlL3VsdHJhMiBTQ1NJICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDd4MThSTiAgMHgxNjggICAvKiBHRFQ3MTE4Uk4vR0RUNzUxOFJOLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0RUNzYxOFJOICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDd4MjhSTiAgMHgxNjkgICAvKiBHRFQ3MTI4Uk4vR0RUNzUyOFJOLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0RUNzYyOFJOICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDd4MzhSTiAgMHgxNkEgICAvKiBHRFQ3NTM4Uk4vR0RUNzYzOFJOICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDd4NThSTiAgMHgxNkIgICAvKiBHRFQ3NTU4Uk4vR0RUNzY1OFJOICovCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDE5UkQKKy8qIEdEVF9NUFIsIFJEIHNlcmllcywgRmlicmUgQ2hhbm5lbCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDE5UkQgIDB4MjEwICAgLyogR0RUNjUxOVJEL0dEVDY2MTlSRCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDI5UkQgIDB4MjExICAgLyogR0RUNjUyOVJEL0dEVDY2MjlSRCAqLworLyogR0RUX01QUiwgUk4gc2VyaWVzICg2NC1iaXQgUENJKSwgRmlicmUgQ2hhbm5lbCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ3eDE5Uk4gIDB4MjYwICAgLyogR0RUNzUxOVJOL0dEVDc2MTlSTiAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ3eDI5Uk4gIDB4MjYxICAgLyogR0RUNzUyOVJOL0dEVDc2MjlSTiAqLworI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUTUFYUlAKKy8qIEdEVF9NUFIsIGxhc3QgZGV2aWNlIElEICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVE1BWFJQICAgMHgyZmYgICAKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVE5FV1JYCisvKiBuZXcgR0RUIFJ4IENvbnRyb2xsZXIgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUTkVXUlggICAweDMwMAorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUTkVXUlgyCisvKiBuZXcoMikgR0RUIFJ4IENvbnRyb2xsZXIgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUTkVXUlgyICAweDMwMQorI2VuZGlmICAgICAgICAKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0lOVEVMX1NSQworLyogSW50ZWwgU3RvcmFnZSBSQUlEIENvbnRyb2xsZXIgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9TUkMgICAgICAgICAweDYwMAorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9JTlRFTF9TUkNfWFNDQUxFCisvKiBJbnRlbCBTdG9yYWdlIFJBSUQgQ29udHJvbGxlciAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1NSQ19YU0NBTEUgIDB4NjAxCisjZW5kaWYKKworLyogbGltaXRzICovCisjZGVmaW5lIEdEVEhfU0NSQVRDSCAgICBQQUdFX1NJWkUgICAgICAgICAgICAgICAvKiA0S0Igc2NyYXRjaCBidWZmZXIgKi8KKyNkZWZpbmUgR0RUSF9NQVhDTURTICAgIDEyMAorI2RlZmluZSBHRFRIX01BWENfUF9MICAgMTYgICAgICAgICAgICAgICAgICAgICAgLyogbWF4LiBjbWRzIHBlciBsdW4gKi8KKyNkZWZpbmUgR0RUSF9NQVhfUkFXICAgIDIgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heC4gY21kcyBwZXIgcmF3IGRldmljZSAqLworI2RlZmluZSBNQVhPRkZTRVRTICAgICAgMTI4CisjZGVmaW5lIE1BWEhBICAgICAgICAgICAxNgorI2RlZmluZSBNQVhJRCAgICAgICAgICAgMTI3CisjZGVmaW5lIE1BWExVTiAgICAgICAgICA4CisjZGVmaW5lIE1BWEJVUyAgICAgICAgICA2CisjZGVmaW5lIE1BWF9FVkVOVFMgICAgICAxMDAgICAgICAgICAgICAgICAgICAgICAvKiBldmVudCBidWZmZXIgY291bnQgKi8KKyNkZWZpbmUgTUFYX1JFU19BUkdTICAgIDQwICAgICAgICAgICAgICAgICAgICAgIC8qIGRldmljZSByZXNlcnZhdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAqLworI2RlZmluZSBNQVhDWUxTICAgICAgICAgMTAyNAorI2RlZmluZSBIRUFEUyAgICAgICAgICAgNjQKKyNkZWZpbmUgU0VDUyAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgIC8qIG1hcHBpbmcgNjQqMzIgKi8KKyNkZWZpbmUgTUVESEVBRFMgICAgICAgIDEyNworI2RlZmluZSBNRURTRUNTICAgICAgICAgNjMgICAgICAgICAgICAgICAgICAgICAgLyogbWFwcGluZyAxMjcqNjMgKi8KKyNkZWZpbmUgQklHSEVBRFMgICAgICAgIDI1NQorI2RlZmluZSBCSUdTRUNTICAgICAgICAgNjMgICAgICAgICAgICAgICAgICAgICAgLyogbWFwcGluZyAyNTUqNjMgKi8KKworLyogc3BlY2lhbCBjb21tYW5kIHB0ci4gKi8KKyNkZWZpbmUgVU5VU0VEX0NNTkQgICAgICgoU2NzaV9DbW5kICopLTEpCisjZGVmaW5lIElOVEVSTkFMX0NNTkQgICAoKFNjc2lfQ21uZCAqKS0yKQorI2RlZmluZSBTQ1JFRU5fQ01ORCAgICAgKChTY3NpX0NtbmQgKiktMykKKyNkZWZpbmUgU1BFQ0lBTF9TQ1AocCkgIChwPT1VTlVTRURfQ01ORCB8fCBwPT1JTlRFUk5BTF9DTU5EIHx8IHA9PVNDUkVFTl9DTU5EKQorCisvKiBjb250cm9sbGVyIHNlcnZpY2VzICovCisjZGVmaW5lIFNDU0lSQVdTRVJWSUNFICAzCisjZGVmaW5lIENBQ0hFU0VSVklDRSAgICA5CisjZGVmaW5lIFNDUkVFTlNFUlZJQ0UgICAxMQorCisvKiBzY3JlZW5zZXJ2aWNlIGRlZmluZXMgKi8KKyNkZWZpbmUgTVNHX0lOVl9IQU5ETEUgIC0xICAgICAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWwgbWVzc2FnZSBoYW5kbGUgKi8KKyNkZWZpbmUgTVNHTEVOICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgbWVzc2FnZSB0ZXh0ICovCisjZGVmaW5lIE1TR19TSVpFICAgICAgICAzNCAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIG1lc3NhZ2Ugc3RydWN0dXJlICovCisjZGVmaW5lIE1TR19SRVFVRVNUICAgICAwICAgICAgICAgICAgICAgICAgICAgICAvKiBhc3luYy4gZXZlbnQ6IG1lc3NhZ2UgKi8KKworLyogY2FjaGVzZXJ2aWNlIGRlZmluZXMgKi8KKyNkZWZpbmUgU0VDVE9SX1NJWkUgICAgIDB4MjAwICAgICAgICAgICAgICAgICAgIC8qIGFsd2F5cyA1MTIgYnl0ZXMgcGVyIHNlYy4gKi8KKworLyogRFBNRU0gY29uc3RhbnRzICovCisjZGVmaW5lIERQTUVNX01BR0lDICAgICAweEMwRkZFRTExCisjZGVmaW5lIElDX0hFQURFUl9CWVRFUyA0OAorI2RlZmluZSBJQ19RVUVVRV9CWVRFUyAgNAorI2RlZmluZSBEUE1FTV9DT01NQU5EX09GRlNFVCAgICBJQ19IRUFERVJfQllURVMrSUNfUVVFVUVfQllURVMqTUFYT0ZGU0VUUworCisvKiBjbHVzdGVyX3R5cGUgY29uc3RhbnRzICovCisjZGVmaW5lIENMVVNURVJfRFJJVkUgICAgICAgICAxCisjZGVmaW5lIENMVVNURVJfTU9VTlRFRCAgICAgICAyCisjZGVmaW5lIENMVVNURVJfUkVTRVJWRUQgICAgICA0CisjZGVmaW5lIENMVVNURVJfUkVTRVJWRV9TVEFURSAoQ0xVU1RFUl9EUklWRXxDTFVTVEVSX01PVU5URUR8Q0xVU1RFUl9SRVNFUlZFRCkKKworLyogY29tbWFuZHMgZm9yIGFsbCBzZXJ2aWNlcywgY2FjaGUgc2VydmljZSAqLworI2RlZmluZSBHRFRfSU5JVCAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgLyogc2VydmljZSBpbml0aWFsaXphdGlvbiAqLworI2RlZmluZSBHRFRfUkVBRCAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZCBjb21tYW5kICovCisjZGVmaW5lIEdEVF9XUklURSAgICAgICAyICAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBjb21tYW5kICovCisjZGVmaW5lIEdEVF9JTkZPICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmZvcm1hdGlvbiBhYm91dCBkZXZpY2VzICovCisjZGVmaW5lIEdEVF9GTFVTSCAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAvKiBmbHVzaCBkaXJ0eSBjYWNoZSBidWZmZXJzICovCisjZGVmaW5lIEdEVF9JT0NUTCAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAvKiBpb2N0bCBjb21tYW5kICovCisjZGVmaW5lIEdEVF9ERVZUWVBFICAgICA5ICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICovCisjZGVmaW5lIEdEVF9NT1VOVCAgICAgICAxMCAgICAgICAgICAgICAgICAgICAgICAvKiBtb3VudCBjYWNoZSBkZXZpY2UgKi8KKyNkZWZpbmUgR0RUX1VOTU9VTlQgICAgIDExICAgICAgICAgICAgICAgICAgICAgIC8qIHVubW91bnQgY2FjaGUgZGV2aWNlICovCisjZGVmaW5lIEdEVF9TRVRfRkVBVCAgICAxMiAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgZmVhdC4gKHNjYXR0ZXIvZ2F0aGVyKSAqLworI2RlZmluZSBHRFRfR0VUX0ZFQVQgICAgMTMgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGZlYXR1cmVzICovCisjZGVmaW5lIEdEVF9XUklURV9USFIgICAxNiAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSB0aHJvdWdoICovCisjZGVmaW5lIEdEVF9SRUFEX1RIUiAgICAxNyAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkIHRocm91Z2ggKi8KKyNkZWZpbmUgR0RUX0VYVF9JTkZPICAgIDE4ICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dGVuZGVkIGluZm8gKi8KKyNkZWZpbmUgR0RUX1JFU0VUICAgICAgIDE5ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIgcmVzZXQgKi8KKyNkZWZpbmUgR0RUX1JFU0VSVkVfRFJWIDIwICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmUgaG9zdCBkcml2ZSAqLworI2RlZmluZSBHRFRfUkVMRUFTRV9EUlYgMjEgICAgICAgICAgICAgICAgICAgICAgLyogcmVsZWFzZSBob3N0IGRyaXZlICovCisjZGVmaW5lIEdEVF9DTFVTVF9JTkZPICAyMiAgICAgICAgICAgICAgICAgICAgICAvKiBjbHVzdGVyIGluZm8gKi8KKyNkZWZpbmUgR0RUX1JXX0FUVFJJQlMgIDIzICAgICAgICAgICAgICAgICAgICAgIC8qIFIvVyBhdHRyaWJzICh3cml0ZSB0aHJ1LC4uKSovCisjZGVmaW5lIEdEVF9DTFVTVF9SRVNFVCAyNCAgICAgICAgICAgICAgICAgICAgICAvKiByZWxlYXNlcyB0aGUgY2x1c3RlciBkcml2ZXMqLworI2RlZmluZSBHRFRfRlJFRVpFX0lPICAgMjUgICAgICAgICAgICAgICAgICAgICAgLyogZnJlZXplcyBhbGwgSU9zICovCisjZGVmaW5lIEdEVF9VTkZSRUVaRV9JTyAyNiAgICAgICAgICAgICAgICAgICAgICAvKiB1bmZyZWV6ZXMgYWxsIElPcyAqLworI2RlZmluZSBHRFRfWF9JTklUX0hPU1QgMjkgICAgICAgICAgICAgICAgICAgICAgLyogZXh0LiBpbml0OiA2NCBiaXQgc3VwcG9ydCAqLworI2RlZmluZSBHRFRfWF9JTkZPICAgICAgMzAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0LiBpbmZvIGZvciBkcml2ZXM+MlRCICovCisKKy8qIHJhdyBzZXJ2aWNlIGNvbW1hbmRzICovCisjZGVmaW5lIEdEVF9SRVNFUlZFICAgICAxNCAgICAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlIGRldi4gdG8gcmF3IHNlcnYuICovCisjZGVmaW5lIEdEVF9SRUxFQVNFICAgICAxNSAgICAgICAgICAgICAgICAgICAgICAvKiByZWxlYXNlIGRldmljZSAqLworI2RlZmluZSBHRFRfUkVTRVJWRV9BTEwgMTYgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZSBhbGwgZGV2aWNlcyAqLworI2RlZmluZSBHRFRfUkVMRUFTRV9BTEwgMTcgICAgICAgICAgICAgICAgICAgICAgLyogcmVsZWFzZSBhbGwgZGV2aWNlcyAqLworI2RlZmluZSBHRFRfUkVTRVRfQlVTICAgMTggICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXQgYnVzICovCisjZGVmaW5lIEdEVF9TQ0FOX1NUQVJUICAxOSAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBkZXZpY2Ugc2NhbiAqLworI2RlZmluZSBHRFRfU0NBTl9FTkQgICAgMjAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcCBkZXZpY2Ugc2NhbiAqLyAgCisjZGVmaW5lIEdEVF9YX0lOSVRfUkFXICAyMSAgICAgICAgICAgICAgICAgICAgICAvKiBleHQuIGluaXQ6IDY0IGJpdCBzdXBwb3J0ICovCisKKy8qIHNjcmVlbiBzZXJ2aWNlIGNvbW1hbmRzICovCisjZGVmaW5lIEdEVF9SRUFMVElNRSAgICAzICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFsdGltZSBjbG9jayB0byBzY3JlZW5zLiAqLworI2RlZmluZSBHRFRfWF9JTklUX1NDUiAgNCAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0LiBpbml0OiA2NCBiaXQgc3VwcG9ydCAqLworCisvKiBJT0NUTCBjb21tYW5kIGRlZmluZXMgKi8KKyNkZWZpbmUgU0NTSV9EUl9JTkZPICAgIDB4MDAgICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgZHJpdmUgaW5mbyAqLyAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgU0NTSV9DSEFOX0NOVCAgIDB4MDUgICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgY2hhbm5lbCBjb3VudCAqLyAgIAorI2RlZmluZSBTQ1NJX0RSX0xJU1QgICAgMHgwNiAgICAgICAgICAgICAgICAgICAgLyogU0NTSSBkcml2ZSBsaXN0ICovCisjZGVmaW5lIFNDU0lfREVGX0NOVCAgICAweDE1ICAgICAgICAgICAgICAgICAgICAvKiBncm93bi9wcmltYXJ5IGRlZmVjdHMgKi8KKyNkZWZpbmUgRFNLX1NUQVRJU1RJQ1MgIDB4NGIgICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgZGlzayBzdGF0aXN0aWNzICovCisjZGVmaW5lIElPQ0hBTl9ERVNDICAgICAweDVkICAgICAgICAgICAgICAgICAgICAvKiBkZXNjcmlwdGlvbiBvZiBJTyBjaGFubmVsICovCisjZGVmaW5lIElPQ0hBTl9SQVdfREVTQyAweDVlICAgICAgICAgICAgICAgICAgICAvKiBkZXNjcmlwdGlvbiBvZiByYXcgSU8gY2huLiAqLworI2RlZmluZSBMX0NUUkxfUEFUVEVSTiAgMHgyMDAwMDAwMEwgICAgICAgICAgICAgLyogU0NTSSBJT0NUTCBtYXNrICovCisjZGVmaW5lIEFSUkFZX0lORk8gICAgICAweDEyICAgICAgICAgICAgICAgICAgICAvKiBhcnJheSBkcml2ZSBpbmZvICovCisjZGVmaW5lIEFSUkFZX0RSVl9MSVNUICAweDBmICAgICAgICAgICAgICAgICAgICAvKiBhcnJheSBkcml2ZSBsaXN0ICovCisjZGVmaW5lIEFSUkFZX0RSVl9MSVNUMiAweDM0ICAgICAgICAgICAgICAgICAgICAvKiBhcnJheSBkcml2ZSBsaXN0IChuZXcpICovCisjZGVmaW5lIExBX0NUUkxfUEFUVEVSTiAweDEwMDAwMDAwTCAgICAgICAgICAgICAvKiBhcnJheSBJT0NUTCBtYXNrICovCisjZGVmaW5lIENBQ0hFX0RSVl9DTlQgICAweDAxICAgICAgICAgICAgICAgICAgICAvKiBjYWNoZSBkcml2ZSBjb3VudCAqLworI2RlZmluZSBDQUNIRV9EUlZfTElTVCAgMHgwMiAgICAgICAgICAgICAgICAgICAgLyogY2FjaGUgZHJpdmUgbGlzdCAqLworI2RlZmluZSBDQUNIRV9JTkZPICAgICAgMHgwNCAgICAgICAgICAgICAgICAgICAgLyogY2FjaGUgaW5mbyAqLworI2RlZmluZSBDQUNIRV9DT05GSUcgICAgMHgwNSAgICAgICAgICAgICAgICAgICAgLyogY2FjaGUgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBDQUNIRV9EUlZfSU5GTyAgMHgwNyAgICAgICAgICAgICAgICAgICAgLyogY2FjaGUgZHJpdmUgaW5mbyAqLworI2RlZmluZSBCT0FSRF9GRUFUVVJFUyAgMHgxNSAgICAgICAgICAgICAgICAgICAgLyogY29udHJvbGxlciBmZWF0dXJlcyAqLworI2RlZmluZSBCT0FSRF9JTkZPICAgICAgMHgyOCAgICAgICAgICAgICAgICAgICAgLyogY29udHJvbGxlciBpbmZvICovCisjZGVmaW5lIFNFVF9QRVJGX01PREVTICAweDgyICAgICAgICAgICAgICAgICAgICAvKiBzZXQgbW9kZSAoY29hbGVzY2luZywuLikgKi8KKyNkZWZpbmUgR0VUX1BFUkZfTU9ERVMgIDB4ODMgICAgICAgICAgICAgICAgICAgIC8qIGdldCBtb2RlICovCisjZGVmaW5lIENBQ0hFX1JFQURfT0VNX1NUUklOR19SRUNPUkQgMHg4NCAgICAgICAvKiByZWFkIE9FTSBzdHJpbmcgcmVjb3JkICovIAorI2RlZmluZSBIT1NUX0dFVCAgICAgICAgMHgxMDAwMUwgICAgICAgICAgICAgICAgLyogZ2V0IGhvc3QgZHJpdmUgbGlzdCAqLworI2RlZmluZSBJT19DSEFOTkVMICAgICAgMHgwMDAyMDAwMEwgICAgICAgICAgICAgLyogZGVmYXVsdCBJTyBjaGFubmVsICovCisjZGVmaW5lIElOVkFMSURfQ0hBTk5FTCAweDAwMDBmZmZmTCAgICAgICAgICAgICAvKiBpbnZhbGlkIGNoYW5uZWwgKi8KKworLyogc2VydmljZSBlcnJvcnMgKi8KKyNkZWZpbmUgU19PSyAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGVycm9yICovCisjZGVmaW5lIFNfR0VORVJSICAgICAgICA2ICAgICAgICAgICAgICAgICAgICAgICAvKiBnZW5lcmFsIGVycm9yICovCisjZGVmaW5lIFNfQlNZICAgICAgICAgICA3ICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIGJ1c3kgKi8KKyNkZWZpbmUgU19DQUNIRV9VTktOT1dOIDEyICAgICAgICAgICAgICAgICAgICAgIC8qIGNhY2hlIHNlcnYuOiBkcml2ZSB1bmtub3duICovCisjZGVmaW5lIFNfUkFXX1NDU0kgICAgICAxMiAgICAgICAgICAgICAgICAgICAgICAvKiByYXcgc2Vydi46IHRhcmdldCBlcnJvciAqLworI2RlZmluZSBTX1JBV19JTEwgICAgICAgMHhmZiAgICAgICAgICAgICAgICAgICAgLyogcmF3IHNlcnYuOiBpbGxlZ2FsICovCisjZGVmaW5lIFNfTk9GVU5DICAgICAgICAtMiAgICAgICAgICAgICAgICAgICAgICAvKiB1bmtub3duIGZ1bmN0aW9uICovCisjZGVmaW5lIFNfQ0FDSEVfUkVTRVJWICAtMjQgICAgICAgICAgICAgICAgICAgICAvKiBjYWNoZTogcmVzZXJ2LiBjb25mbGljdCAqLyAgIAorCisvKiB0aW1lb3V0IHZhbHVlcyAqLworI2RlZmluZSBJTklUX1JFVFJJRVMgICAgMTAwMDAwICAgICAgICAgICAgICAgICAgLyogMTAwMDAwICogMW1zID0gMTAwcyAqLworI2RlZmluZSBJTklUX1RJTUVPVVQgICAgMTAwMDAwICAgICAgICAgICAgICAgICAgLyogMTAwMDAwICogMW1zID0gMTAwcyAqLworI2RlZmluZSBQT0xMX1RJTUVPVVQgICAgMTAwMDAgICAgICAgICAgICAgICAgICAgLyogMTAwMDAgKiAxbXMgPSAxMHMgKi8KKworLyogcHJpb3JpdGllcyAqLworI2RlZmluZSBERUZBVUxUX1BSSSAgICAgMHgyMAorI2RlZmluZSBJT0NUTF9QUkkgICAgICAgMHgxMAorI2RlZmluZSBISUdIX1BSSSAgICAgICAgMHgwOAorCisvKiBkYXRhIGRpcmVjdGlvbnMgKi8KKyNkZWZpbmUgR0RUSF9EQVRBX0lOICAgIDB4MDEwMDAwMDBMICAgICAgICAgICAgIC8qIGRhdGEgZnJvbSB0YXJnZXQgKi8KKyNkZWZpbmUgR0RUSF9EQVRBX09VVCAgIDB4MDAwMDAwMDBMICAgICAgICAgICAgIC8qIGRhdGEgdG8gdGFyZ2V0ICovCisKKy8qIEJNSUMgcmVnaXN0ZXJzIChFSVNBIGNvbnRyb2xsZXJzKSAqLworI2RlZmluZSBJRDBSRUcgICAgICAgICAgMHgwYzgwICAgICAgICAgICAgICAgICAgLyogYm9hcmQgSUQgKi8KKyNkZWZpbmUgRUlOVEVOQUJSRUcgICAgIDB4MGM4OSAgICAgICAgICAgICAgICAgIC8qIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgU0VNQTBSRUcgICAgICAgIDB4MGM4YSAgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgc2VtYXBob3JlICovCisjZGVmaW5lIFNFTUExUkVHICAgICAgICAweDBjOGIgICAgICAgICAgICAgICAgICAvKiBzdGF0dXMgc2VtYXBob3JlICovCisjZGVmaW5lIExET09SUkVHICAgICAgICAweDBjOGQgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBkb29yYmVsbCAqLworI2RlZmluZSBFREVOQUJSRUcgICAgICAgMHgwYzhlICAgICAgICAgICAgICAgICAgLyogRUlTQSBzeXN0ZW0gZG9vcmJlbGwgZW5hYi4gKi8KKyNkZWZpbmUgRURPT1JSRUcgICAgICAgIDB4MGM4ZiAgICAgICAgICAgICAgICAgIC8qIEVJU0Egc3lzdGVtIGRvb3JiZWxsICovCisjZGVmaW5lIE1BSUxCT1hSRUcgICAgICAweDBjOTAgICAgICAgICAgICAgICAgICAvKiBtYWlsYm94IHJlZy4gKDE2IGJ5dGVzKSAqLworI2RlZmluZSBFSVNBUkVHICAgICAgICAgMHgwY2MwICAgICAgICAgICAgICAgICAgLyogRUlTQSBjb25maWd1cmF0aW9uICovCisKKy8qIERNQSBtZW1vcnkgbWFwcGluZ3MgKi8KKyNkZWZpbmUgR0RUSF9NQVBfTk9ORSAgIDAKKyNkZWZpbmUgR0RUSF9NQVBfU0lOR0xFIDEKKyNkZWZpbmUgR0RUSF9NQVBfU0cgICAgIDIKKyNkZWZpbmUgR0RUSF9NQVBfSU9DVEwgIDMgCisKKy8qIG90aGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgTElOVVhfT1MgICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZWQgZm9yIGNhY2hlIG9wdGltLiAqLworI2RlZmluZSBTQ0FUVEVSX0dBVEhFUiAgMSAgICAgICAgICAgICAgICAgICAgICAgLyogcy9nIGZlYXR1cmUgKi8KKyNkZWZpbmUgU0VDUzMyICAgICAgICAgIDB4MWYgICAgICAgICAgICAgICAgICAgIC8qIHJvdW5kIGNhcGFjaXR5ICovCisjZGVmaW5lIEJJT1NfSURfT0ZGUyAgICAweDEwICAgICAgICAgICAgICAgICAgICAvKiBvZmZzZXQgY29udHItSUQgaW4gSVNBQklPUyAqLworI2RlZmluZSBMT0NBTEJPQVJEICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgLyogYm9hcmQgbm9kZSBhbHdheXMgMCAqLworI2RlZmluZSBBU1lOQ0lOREVYICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgLyogY21kIGluZGV4IGFzeW5jLiBldmVudCAqLworI2RlZmluZSBTUEVaSU5ERVggICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgLyogY21kIGluZGV4IHVua25vd24gc2VydmljZSAqLworI2RlZmluZSBDT0FMSU5ERVggICAgICAgKEdEVEhfTUFYQ01EUyArIDIpCisKKy8qIGZlYXR1cmVzICovCisjZGVmaW5lIFNDQVRURVJfR0FUSEVSICAxICAgICAgICAgICAgICAgICAgICAgICAvKiBzL2cgZmVhdHVyZSAqLworI2RlZmluZSBHRFRfV1JfVEhST1VHSCAgMHgxMDAgICAgICAgICAgICAgICAgICAgLyogV1JJVEVfVEhST1VHSCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgR0RUXzY0QklUICAgICAgIDB4MjAwICAgICAgICAgICAgICAgICAgIC8qIDY0Yml0IC8gZHJ2PjJUQiBzdXBwb3J0ICovCisKKyNpbmNsdWRlICJnZHRoX2lvY3RsLmgiCisKKy8qIHNjcmVlbnNlcnZpY2UgbWVzc2FnZSAqLwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB1bG9uZzMyICAgICBtc2dfaGFuZGxlOyAgICAgICAgICAgICAgICAgICAgIC8qIG1lc3NhZ2UgaGFuZGxlICovCisgICAgdWxvbmczMiAgICAgbXNnX2xlbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIG1lc3NhZ2UgKi8KKyAgICB1bG9uZzMyICAgICBtc2dfYWxlbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuc3dlciBsZW5ndGggKi8KKyAgICB1bmNoYXIgICAgICBtc2dfYW5zd2VyOyAgICAgICAgICAgICAgICAgICAgIC8qIGFuc3dlciBmbGFnICovCisgICAgdW5jaGFyICAgICAgbXNnX2V4dDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3JlIG1lc3NhZ2VzICovCisgICAgdW5jaGFyICAgICAgbXNnX3Jlc2VydmVkWzJdOworICAgIGNoYXIgICAgICAgIG1zZ190ZXh0W01TR0xFTisyXTsgICAgICAgICAgICAgLyogdGhlIG1lc3NhZ2UgdGV4dCAqLworfSBQQUNLRUQgZ2R0aF9tc2dfc3RyOworCisKKy8qIElPQ1RMIGRhdGEgc3RydWN0dXJlcyAqLworCisvKiBTdGF0dXMgY29hbGVzY2luZyBidWZmZXIgZm9yIHJldHVybmluZyBtdWx0aXBsZSByZXF1ZXN0cyBwZXIgaW50ZXJydXB0ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmczMiAgICAgc3RhdHVzOworICAgIHVsb25nMzIgICAgIGV4dF9zdGF0dXM7CisgICAgdWxvbmczMiAgICAgaW5mbzA7CisgICAgdWxvbmczMiAgICAgaW5mbzE7Cit9IFBBQ0tFRCBnZHRoX2NvYWxfc3RhdHVzOworCisvKiBwZXJmb3JtYW5jZSBtb2RlIGRhdGEgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmczMiAgICAgdmVyc2lvbjsgICAgICAgICAgICAvKiBUaGUgdmVyc2lvbiBvZiB0aGlzIElPQ1RMIHN0cnVjdHVyZS4gKi8KKyAgICB1bG9uZzMyICAgICBzdF9tb2RlOyAgICAgICAgICAgIC8qIDA9ZGlzLiwgMT1zdF9idWZfYWRkcjEgdmFsaWQsIDI9Ym90aCAgKi8KKyAgICB1bG9uZzMyICAgICBzdF9idWZmX2FkZHIxOyAgICAgIC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2Ygc3RhdHVzIGJ1ZmZlciAxICovCisgICAgdWxvbmczMiAgICAgc3RfYnVmZl91X2FkZHIxOyAgICAvKiByZXNlcnZlZCBmb3IgNjQgYml0IGFkZHJlc3NpbmcgKi8KKyAgICB1bG9uZzMyICAgICBzdF9idWZmX2luZHgxOyAgICAgIC8qIHJlc2VydmVkIGNvbW1hbmQgaWR4LiBmb3IgdGhpcyBidWZmZXIgKi8KKyAgICB1bG9uZzMyICAgICBzdF9idWZmX2FkZHIyOyAgICAgIC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2Ygc3RhdHVzIGJ1ZmZlciAxICovCisgICAgdWxvbmczMiAgICAgc3RfYnVmZl91X2FkZHIyOyAgICAvKiByZXNlcnZlZCBmb3IgNjQgYml0IGFkZHJlc3NpbmcgKi8KKyAgICB1bG9uZzMyICAgICBzdF9idWZmX2luZHgyOyAgICAgIC8qIHJlc2VydmVkIGNvbW1hbmQgaWR4LiBmb3IgdGhpcyBidWZmZXIgKi8KKyAgICB1bG9uZzMyICAgICBzdF9idWZmX3NpemU7ICAgICAgIC8qIHNpemUgb2YgZWFjaCBidWZmZXIgaW4gYnl0ZXMgKi8KKyAgICB1bG9uZzMyICAgICBjbWRfbW9kZTsgICAgICAgICAgIC8qIDAgPSBtb2RlIGRpc2FibGVkLCAxID0gY21kX2J1ZmZfYWRkcjEgKi8gCisgICAgdWxvbmczMiAgICAgY21kX2J1ZmZfYWRkcjE7ICAgICAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIGNtZCBidWZmZXIgMSAqLyAgIAorICAgIHVsb25nMzIgICAgIGNtZF9idWZmX3VfYWRkcjE7ICAgLyogcmVzZXJ2ZWQgZm9yIDY0IGJpdCBhZGRyZXNzaW5nICovCisgICAgdWxvbmczMiAgICAgY21kX2J1ZmZfaW5keDE7ICAgICAvKiBjbWQgYnVmIGFkZHIxIHVuaXF1ZSBpZGVudGlmaWVyICovCisgICAgdWxvbmczMiAgICAgY21kX2J1ZmZfYWRkcjI7ICAgICAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIGNtZCBidWZmZXIgMSAqLyAgIAorICAgIHVsb25nMzIgICAgIGNtZF9idWZmX3VfYWRkcjI7ICAgLyogcmVzZXJ2ZWQgZm9yIDY0IGJpdCBhZGRyZXNzaW5nICovCisgICAgdWxvbmczMiAgICAgY21kX2J1ZmZfaW5keDI7ICAgICAvKiBjbWQgYnVmIGFkZHIxIHVuaXF1ZSBpZGVudGlmaWVyICovCisgICAgdWxvbmczMiAgICAgY21kX2J1ZmZfc2l6ZTsgICAgICAvKiBzaXplIG9mIGVhY2ggY21kIGJ1ZmVyIGluIGJ5dGVzICovCisgICAgdWxvbmczMiAgICAgcmVzZXJ2ZWQxOworICAgIHVsb25nMzIgICAgIHJlc2VydmVkMjsKK30gUEFDS0VEIGdkdGhfcGVyZl9tb2RlczsKKworLyogU0NTSSBkcml2ZSBpbmZvICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5jaGFyICAgICAgdmVuZG9yWzhdOyAgICAgICAgICAgICAgICAgICAgICAvKiB2ZW5kb3Igc3RyaW5nICovCisgICAgdW5jaGFyICAgICAgcHJvZHVjdFsxNl07ICAgICAgICAgICAgICAgICAgICAvKiBwcm9kdWN0IHN0cmluZyAqLworICAgIHVuY2hhciAgICAgIHJldmlzaW9uWzRdOyAgICAgICAgICAgICAgICAgICAgLyogcmV2aXNpb24gKi8KKyAgICB1bG9uZzMyICAgICBzeV9yYXRlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgcmF0ZSBmb3Igc3luYy4gdHIuICovCisgICAgdWxvbmczMiAgICAgc3lfbWF4X3JhdGU7ICAgICAgICAgICAgICAgICAgICAvKiBtYXguIHJhdGUgZm9yIHN5bmMuIHRyLiAqLworICAgIHVsb25nMzIgICAgIG5vX2xkcml2ZTsgICAgICAgICAgICAgICAgICAgICAgLyogYmVsb25ncyB0byB0aGlzIGxvZy4gZHJ2LiovCisgICAgdWxvbmczMiAgICAgYmxrY250OyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYmxvY2tzICovCisgICAgdXNob3J0ICAgICAgYmxrc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIGJsb2NrIGluIGJ5dGVzICovCisgICAgdW5jaGFyICAgICAgYXZhaWxhYmxlOyAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFnOiBhY2Nlc3MgaXMgYXZhaWxhYmxlICovCisgICAgdW5jaGFyICAgICAgaW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtZWRpdW0gaXMgaW5pdGlhbGl6ZWQgKi8KKyAgICB1bmNoYXIgICAgICBkZXZ0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgZGV2aWNldHlwZSAqLworICAgIHVuY2hhciAgICAgIHJtX21lZGl1bTsgICAgICAgICAgICAgICAgICAgICAgLyogbWVkaXVtIGlzIHJlbW92YWJsZSAqLworICAgIHVuY2hhciAgICAgIHdwX21lZGl1bTsgICAgICAgICAgICAgICAgICAgICAgLyogbWVkaXVtIGlzIHdyaXRlIHByb3RlY3RlZCAqLworICAgIHVuY2hhciAgICAgIGFuc2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0NTSSBJL0lJIG9yIElJST8gKi8KKyAgICB1bmNoYXIgICAgICBwcm90b2NvbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhbWUgYXMgYW5zaSAqLworICAgIHVuY2hhciAgICAgIHN5bmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZzogc3luYy4gdHJhbnNmZXIgZW5hYi4gKi8KKyAgICB1bmNoYXIgICAgICBkaXNjOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWc6IGRpc2Nvbm5lY3QgZW5hYmxlZCAqLworICAgIHVuY2hhciAgICAgIHF1ZXVlaW5nOyAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZzogY29tbWFuZCBxdWVpbmcgZW5hYi4gKi8KKyAgICB1bmNoYXIgICAgICBjYWNoZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWc6IGNhY2hpbmcgZW5hYmxlZCAqLworICAgIHVuY2hhciAgICAgIHRhcmdldF9pZDsgICAgICAgICAgICAgICAgICAgICAgLyogdGFyZ2V0IElEIG9mIGRldmljZSAqLworICAgIHVuY2hhciAgICAgIGx1bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTFVOIGlkIG9mIGRldmljZSAqLworICAgIHVuY2hhciAgICAgIG9ycGhhbjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZzogZHJpdmUgZnJhZ21lbnQgKi8KKyAgICB1bG9uZzMyICAgICBsYXN0X2Vycm9yOyAgICAgICAgICAgICAgICAgICAgIC8qIHNlbnNlIGtleSBvciBkcml2ZSBzdGF0ZSAqLworICAgIHVsb25nMzIgICAgIGxhc3RfcmVzdWx0OyAgICAgICAgICAgICAgICAgICAgLyogcmVzdWx0IG9mIGxhc3QgY29tbWFuZCAqLworICAgIHVsb25nMzIgICAgIGNoZWNrX2Vycm9yczsgICAgICAgICAgICAgICAgICAgLyogZXJyLiBpbiBsYXN0IHN1cmZhY2UgY2hlY2sgKi8KKyAgICB1bmNoYXIgICAgICBwZXJjZW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2dyZXNzIGZvciBzdXJmYWNlIGNoZWNrICovCisgICAgdW5jaGFyICAgICAgbGFzdF9jaGVjazsgICAgICAgICAgICAgICAgICAgICAvKiBJT0NUUkwgb3BlcmF0aW9uICovCisgICAgdW5jaGFyICAgICAgcmVzWzJdOworICAgIHVsb25nMzIgICAgIGZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnJvbSAxLjE5LzIuMTk6IHJhdyByZXNlcnYuKi8KKyAgICB1bmNoYXIgICAgICBtdWx0aV9idXM7ICAgICAgICAgICAgICAgICAgICAgIC8qIG11bHRpIGJ1cyBkZXY/IChmaWJyZSBjaC4pICovCisgICAgdW5jaGFyICAgICAgbWJfc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAvKiBzdGF0dXM6IGF2YWlsYWJsZT8gKi8KKyAgICB1bmNoYXIgICAgICByZXMyWzJdOworICAgIHVuY2hhciAgICAgIG1iX2FsdF9zdGF0dXM7ICAgICAgICAgICAgICAgICAgLyogc3RhdHVzIG9uIHNlY29uZCBidXMgKi8KKyAgICB1bmNoYXIgICAgICBtYl9hbHRfYmlkOyAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzZWNvbmQgYnVzICovCisgICAgdW5jaGFyICAgICAgbWJfYWx0X3RpZDsgICAgICAgICAgICAgICAgICAgICAvKiB0YXJnZXQgaWQgb24gc2Vjb25kIGJ1cyAqLworICAgIHVuY2hhciAgICAgIHJlczM7CisgICAgdW5jaGFyICAgICAgZmNfZmxhZzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBmcm9tIDEuMjIvMi4yMjogaW5mbyB2YWxpZD8qLworICAgIHVuY2hhciAgICAgIHJlczQ7CisgICAgdXNob3J0ICAgICAgZmNfZnJhbWVfc2l6ZTsgICAgICAgICAgICAgICAgICAvKiBmcmFtZSBzaXplIChieXRlcykgKi8KKyAgICBjaGFyICAgICAgICB3d25bOF07ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmxkIHdpZGUgbmFtZSAqLworfSBQQUNLRUQgZ2R0aF9kaXNraW5mb19zdHI7CisKKy8qIGdldCBTQ1NJIGNoYW5uZWwgY291bnQgICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmczMiAgICAgY2hhbm5lbF9ubzsgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY2hhbm5lbCAqLworICAgIHVsb25nMzIgICAgIGRyaXZlX2NudDsgICAgICAgICAgICAgICAgICAgICAgLyogZHJpdmUgY291bnQgKi8KKyAgICB1bmNoYXIgICAgICBzaW9wX2lkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgcHJvY2Vzc29yIElEICovCisgICAgdW5jaGFyICAgICAgc2lvcF9zdGF0ZTsgICAgICAgICAgICAgICAgICAgICAvKiBTQ1NJIHByb2Nlc3NvciBzdGF0ZSAqLyAKK30gUEFDS0VEIGdkdGhfZ2V0Y2hfc3RyOworCisvKiBnZXQgU0NTSSBkcml2ZSBudW1iZXJzICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmczMiAgICAgc2Nfbm87ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTQ1NJIGNoYW5uZWwgKi8KKyAgICB1bG9uZzMyICAgICBzY19jbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjX2xpc3RbXSBlbGVtZW50cyAqLworICAgIHVsb25nMzIgICAgIHNjX2xpc3RbTUFYSURdOyAgICAgICAgICAgICAgICAgLyogbWlub3IgZGV2aWNlIG51bWJlcnMgKi8KK30gUEFDS0VEIGdkdGhfZHJsaXN0X3N0cjsKKworLyogZ2V0IGdyb3duL3ByaW1hcnkgZGVmZWN0IGNvdW50ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5jaGFyICAgICAgc2RkY190eXBlOyAgICAgICAgICAgICAgICAgICAgICAvKiAweDA4OiBncm93biwgMHgxMDogcHJpbS4gKi8KKyAgICB1bmNoYXIgICAgICBzZGRjX2Zvcm1hdDsgICAgICAgICAgICAgICAgICAgIC8qIGxpc3QgZW50cnkgZm9ybWF0ICovCisgICAgdW5jaGFyICAgICAgc2RkY19sZW47ICAgICAgICAgICAgICAgICAgICAgICAvKiBsaXN0IGVudHJ5IGxlbmd0aCAqLworICAgIHVuY2hhciAgICAgIHNkZGNfcmVzOworICAgIHVsb25nMzIgICAgIHNkZGNfY250OyAgICAgICAgICAgICAgICAgICAgICAgLyogZW50cnkgY291bnQgKi8KK30gUEFDS0VEIGdkdGhfZGVmY250X3N0cjsKKworLyogZGlzayBzdGF0aXN0aWNzICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmczMiAgICAgYmlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTQ1NJIGNoYW5uZWwgKi8KKyAgICB1bG9uZzMyICAgICBmaXJzdDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IFNDU0kgZGlzayAqLworICAgIHVsb25nMzIgICAgIGVudHJpZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzICovCisgICAgdWxvbmczMiAgICAgY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoUikgbnVtYmVyIG9mIGluaXQuIGVsLiAqLworICAgIHVsb25nMzIgICAgIG1vbl90aW1lOyAgICAgICAgICAgICAgICAgICAgICAgLyogdGltZSBzdGFtcCAqLworICAgIHN0cnVjdCB7CisgICAgICAgIHVuY2hhciAgdGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YXJnZXQgSUQgKi8KKyAgICAgICAgdW5jaGFyICBsdW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExVTiAqLworICAgICAgICB1bmNoYXIgIHJlc1syXTsKKyAgICAgICAgdWxvbmczMiBibGtfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGJsb2NrIHNpemUgaW4gYnl0ZXMgKi8KKyAgICAgICAgdWxvbmczMiByZF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ5dGVzIHJlYWQgKi8KKyAgICAgICAgdWxvbmczMiB3cl9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ5dGVzIHdyaXR0ZW4gKi8KKyAgICAgICAgdWxvbmczMiByZF9ibGtfY291bnQ7ICAgICAgICAgICAgICAgICAgIC8qIGJsb2NrcyByZWFkICovCisgICAgICAgIHVsb25nMzIgd3JfYmxrX2NvdW50OyAgICAgICAgICAgICAgICAgICAvKiBibG9ja3Mgd3JpdHRlbiAqLworICAgICAgICB1bG9uZzMyIHJldHJpZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV0cmllcyAqLworICAgICAgICB1bG9uZzMyIHJlYXNzaWduczsgICAgICAgICAgICAgICAgICAgICAgLyogcmVhc3NpZ25zICovCisgICAgfSBQQUNLRUQgbGlzdFsxXTsKK30gUEFDS0VEIGdkdGhfZHNrc3RhdF9zdHI7CisKKy8qIElPIGNoYW5uZWwgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmczMiAgICAgdmVyc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZXJzaW9uICgtMVVMOiBuZXdlc3QpICovCisgICAgdW5jaGFyICAgICAgbGlzdF9lbnRyaWVzOyAgICAgICAgICAgICAgICAgICAvKiBsaXN0IGVudHJ5IGNvdW50ICovCisgICAgdW5jaGFyICAgICAgZmlyc3RfY2hhbjsgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBjaGFubmVsIG51bWJlciAqLworICAgIHVuY2hhciAgICAgIGxhc3RfY2hhbjsgICAgICAgICAgICAgICAgICAgICAgLyogbGFzdCBjaGFubmVsIG51bWJlciAqLworICAgIHVuY2hhciAgICAgIGNoYW5fY291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyogKFIpIGNoYW5uZWwgY291bnQgKi8KKyAgICB1bG9uZzMyICAgICBsaXN0X29mZnNldDsgICAgICAgICAgICAgICAgICAgIC8qIG9mZnNldCBvZiBsaXN0WzBdICovCit9IFBBQ0tFRCBnZHRoX2lvY2hhbl9oZWFkZXI7CisKKy8qIGdldCBJTyBjaGFubmVsIGRlc2NyaXB0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZ2R0aF9pb2NoYW5faGVhZGVyICBoZHI7CisgICAgc3RydWN0IHsKKyAgICAgICAgdWxvbmczMiAgICAgICAgIGFkZHJlc3M7ICAgICAgICAgICAgICAgIC8qIGNoYW5uZWwgYWRkcmVzcyAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgdHlwZTsgICAgICAgICAgICAgICAgICAgLyogdHlwZSAoU0NTSSwgRkNBTCkgKi8KKyAgICAgICAgdW5jaGFyICAgICAgICAgIGxvY2FsX25vOyAgICAgICAgICAgICAgIC8qIGxvY2FsIG51bWJlciAqLworICAgICAgICB1c2hvcnQgICAgICAgICAgZmVhdHVyZXM7ICAgICAgICAgICAgICAgLyogY2hhbm5lbCBmZWF0dXJlcyAqLworICAgIH0gUEFDS0VEIGxpc3RbTUFYQlVTXTsKK30gUEFDS0VEIGdkdGhfaW9jaGFuX3N0cjsKKworLyogZ2V0IHJhdyBJTyBjaGFubmVsIGRlc2NyaXB0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZ2R0aF9pb2NoYW5faGVhZGVyICBoZHI7CisgICAgc3RydWN0IHsKKyAgICAgICAgdW5jaGFyICAgICAgcHJvY19pZDsgICAgICAgICAgICAgICAgICAgIC8qIHByb2Nlc3NvciBpZCAqLworICAgICAgICB1bmNoYXIgICAgICBwcm9jX2RlZmVjdDsgICAgICAgICAgICAgICAgLyogZGVmZWN0ID8gKi8KKyAgICAgICAgdW5jaGFyICAgICAgcmVzZXJ2ZWRbMl07CisgICAgfSBQQUNLRUQgbGlzdFtNQVhCVVNdOworfSBQQUNLRUQgZ2R0aF9yYXdfaW9jaGFuX3N0cjsKKworLyogYXJyYXkgZHJpdmUgY29tcG9uZW50ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmczMiAgICAgYWxfY29udHJvbGxlcjsgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIElEICovCisgICAgdW5jaGFyICAgICAgYWxfY2FjaGVfZHJpdmU7ICAgICAgICAgICAgICAgICAvKiBjYWNoZSBkcml2ZSBudW1iZXIgKi8KKyAgICB1bmNoYXIgICAgICBhbF9zdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNhY2hlIGRyaXZlIHN0YXRlICovCisgICAgdW5jaGFyICAgICAgYWxfcmVzWzJdOyAgICAgCit9IFBBQ0tFRCBnZHRoX2FycmF5Y29tcF9zdHI7CisKKy8qIGFycmF5IGRyaXZlIGluZm9ybWF0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5jaGFyICAgICAgYWlfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcnJheSB0eXBlIChSQUlEMCw0LDUpICovCisgICAgdW5jaGFyICAgICAgYWlfY2FjaGVfZHJpdmVfY250OyAgICAgICAgICAgICAvKiBhY3RpdmUgY2FjaGVkcml2ZXMgKi8KKyAgICB1bmNoYXIgICAgICBhaV9zdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGFycmF5IGRyaXZlIHN0YXRlICovCisgICAgdW5jaGFyICAgICAgYWlfbWFzdGVyX2NkOyAgICAgICAgICAgICAgICAgICAvKiBtYXN0ZXIgY2FjaGVkcml2ZSAqLworICAgIHVsb25nMzIgICAgIGFpX21hc3Rlcl9jb250cm9sbGVyOyAgICAgICAgICAgLyogSUQgb2YgbWFzdGVyIGNvbnRyb2xsZXIgKi8KKyAgICB1bG9uZzMyICAgICBhaV9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZXIgY2FwYWNpdHkgW3NlY3RvcnNdICovCisgICAgdWxvbmczMiAgICAgYWlfc3RyaXBpbmdfc2l6ZTsgICAgICAgICAgICAgICAvKiBzdHJpcGluZyBzaXplIFtzZWN0b3JzXSAqLworICAgIHVsb25nMzIgICAgIGFpX3NlY3NpemU7ICAgICAgICAgICAgICAgICAgICAgLyogc2VjdG9yIHNpemUgW2J5dGVzXSAqLworICAgIHVsb25nMzIgICAgIGFpX2Vycl9pbmZvOyAgICAgICAgICAgICAgICAgICAgLyogZmFpbGVkIGNhY2hlIGRyaXZlICovCisgICAgdW5jaGFyICAgICAgYWlfbmFtZVs4XTsgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lIG9mIHRoZSBhcnJheSBkcml2ZSAqLworICAgIHVuY2hhciAgICAgIGFpX2NvbnRyb2xsZXJfY250OyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvbnRyb2xsZXJzICovCisgICAgdW5jaGFyICAgICAgYWlfcmVtb3ZhYmxlOyAgICAgICAgICAgICAgICAgICAvKiBmbGFnOiByZW1vdmFibGUgKi8KKyAgICB1bmNoYXIgICAgICBhaV93cml0ZV9wcm90ZWN0ZWQ7ICAgICAgICAgICAgIC8qIGZsYWc6IHdyaXRlIHByb3RlY3RlZCAqLworICAgIHVuY2hhciAgICAgIGFpX2RldnR5cGU7ICAgICAgICAgICAgICAgICAgICAgLyogdHlwZTogYWx3YXlzIGRpcmVjdCBhY2Nlc3MgKi8KKyAgICBnZHRoX2FycmF5Y29tcF9zdHIgIGFpX2RyaXZlc1szNV07ICAgICAgICAgIC8qIGRyaXZlIGNvbXBvbmVudHM6ICovCisgICAgdW5jaGFyICAgICAgYWlfZHJpdmVfZW50cmllczsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZHJpdmUgY29tcG9uZW50cyAqLworICAgIHVuY2hhciAgICAgIGFpX3Byb3RlY3RlZDsgICAgICAgICAgICAgICAgICAgLyogcHJvdGVjdGlvbiBmbGFnICovCisgICAgdW5jaGFyICAgICAgYWlfdmVyaWZ5X3N0YXRlOyAgICAgICAgICAgICAgICAvKiBzdGF0ZSBvZiBhIHBhcml0eSB2ZXJpZnkgKi8KKyAgICB1bmNoYXIgICAgICBhaV9leHRfc3RhdGU7ICAgICAgICAgICAgICAgICAgIC8qIGV4dGVuZGVkIGFycmF5IGRyaXZlIHN0YXRlICovCisgICAgdW5jaGFyICAgICAgYWlfZXhwYW5kX3N0YXRlOyAgICAgICAgICAgICAgICAvKiBhcnJheSBleHBhbmQgc3RhdGUgKD49Mi4xOCkqLworICAgIHVuY2hhciAgICAgIGFpX3Jlc2VydmVkWzNdOworfSBQQUNLRUQgZ2R0aF9hcnJheWluZl9zdHI7CisKKy8qIGdldCBhcnJheSBkcml2ZSBsaXN0ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmczMiAgICAgY29udHJvbGxlcl9ubzsgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIG5vLiAqLworICAgIHVuY2hhciAgICAgIGNkX2hhbmRsZTsgICAgICAgICAgICAgICAgICAgICAgLyogbWFzdGVyIGNhY2hlZHJpdmUgKi8KKyAgICB1bmNoYXIgICAgICBpc19hcnJheWQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWc6IGlzIGFycmF5IGRyaXZlPyAqLworICAgIHVuY2hhciAgICAgIGlzX21hc3RlcjsgICAgICAgICAgICAgICAgICAgICAgLyogRmxhZzogaXMgYXJyYXkgbWFzdGVyPyAqLworICAgIHVuY2hhciAgICAgIGlzX3Bhcml0eTsgICAgICAgICAgICAgICAgICAgICAgLyogRmxhZzogaXMgcGFyaXR5IGRyaXZlPyAqLworICAgIHVuY2hhciAgICAgIGlzX2hvdGZpeDsgICAgICAgICAgICAgICAgICAgICAgLyogRmxhZzogaXMgaG90Zml4IGRyaXZlPyAqLworICAgIHVuY2hhciAgICAgIHJlc1szXTsKK30gUEFDS0VEIGdkdGhfYWxpc3Rfc3RyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmczMiAgICAgZW50cmllc19hdmFpbDsgICAgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZWQgZW50cmllcyAqLworICAgIHVsb25nMzIgICAgIGVudHJpZXNfaW5pdDsgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuZWQgZW50cmllcyAqLworICAgIHVsb25nMzIgICAgIGZpcnN0X2VudHJ5OyAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgZW50cnkgbnVtYmVyICovCisgICAgdWxvbmczMiAgICAgbGlzdF9vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAvKiBvZmZzZXQgb2YgZm9sbG93aW5nIGxpc3QgKi8KKyAgICBnZHRoX2FsaXN0X3N0ciBsaXN0WzFdOyAgICAgICAgICAgICAgICAgICAgIC8qIGxpc3QgKi8KK30gUEFDS0VEIGdkdGhfYXJjZGxfc3RyOworCisvKiBjYWNoZSBpbmZvL2NvbmZpZyBJT0NUTCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVsb25nMzIgICAgIHZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlybXdhcmUgdmVyc2lvbiAqLworICAgIHVzaG9ydCAgICAgIHN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FjaGUgc3RhdGUgKG9uL29mZikgKi8KKyAgICB1c2hvcnQgICAgICBzdHJhdGVneTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhY2hlIHN0cmF0ZWd5ICovCisgICAgdXNob3J0ICAgICAgd3JpdGVfYmFjazsgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBiYWNrIHN0YXRlIChvbi9vZmYpICovCisgICAgdXNob3J0ICAgICAgYmxvY2tfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAvKiBjYWNoZSBibG9jayBzaXplICovCit9IFBBQ0tFRCBnZHRoX2NwYXJfc3RyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmczMiAgICAgY3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWNoZSBzaXplICovCisgICAgdWxvbmczMiAgICAgcmVhZF9jbnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkL3dyaXRlIGNvdW50ZXIgKi8KKyAgICB1bG9uZzMyICAgICB3cml0ZV9jbnQ7CisgICAgdWxvbmczMiAgICAgdHJfaGl0czsgICAgICAgICAgICAgICAgICAgICAgICAvKiBoaXRzICovCisgICAgdWxvbmczMiAgICAgc2VjX2hpdHM7CisgICAgdWxvbmczMiAgICAgc2VjX21pc3M7ICAgICAgICAgICAgICAgICAgICAgICAvKiBtaXNzZXMgKi8KK30gUEFDS0VEIGdkdGhfY3N0YXRfc3RyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZ2R0aF9jcGFyX3N0ciAgIGNwYXI7CisgICAgZ2R0aF9jc3RhdF9zdHIgIGNzdGF0OworfSBQQUNLRUQgZ2R0aF9jaW5mb19zdHI7CisKKy8qIGNhY2hlIGRyaXZlIGluZm8gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bmNoYXIgICAgICBjZF9uYW1lWzhdOyAgICAgICAgICAgICAgICAgICAgIC8qIGNhY2hlIGRyaXZlIG5hbWUgKi8KKyAgICB1bG9uZzMyICAgICBjZF9kZXZ0eXBlOyAgICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgZGV2aWNldHlwZSAqLworICAgIHVsb25nMzIgICAgIGNkX2xkY250OyAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxvZy4gZHJpdmVzICovCisgICAgdWxvbmczMiAgICAgY2RfbGFzdF9lcnJvcjsgICAgICAgICAgICAgICAgICAvKiBsYXN0IGVycm9yICovCisgICAgdW5jaGFyICAgICAgY2RfaW5pdGlhbGl6ZWQ7ICAgICAgICAgICAgICAgICAvKiBkcml2ZSBpcyBpbml0aWFsaXplZCAqLworICAgIHVuY2hhciAgICAgIGNkX3JlbW92YWJsZTsgICAgICAgICAgICAgICAgICAgLyogbWVkaWEgaXMgcmVtb3ZhYmxlICovCisgICAgdW5jaGFyICAgICAgY2Rfd3JpdGVfcHJvdGVjdGVkOyAgICAgICAgICAgICAvKiB3cml0ZSBwcm90ZWN0ZWQgKi8KKyAgICB1bmNoYXIgICAgICBjZF9mbGFnczsgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvb2wgSG90IEZpeD8gKi8KKyAgICB1bG9uZzMyICAgICBsZF9ibGtjbnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgKi8KKyAgICB1bG9uZzMyICAgICBsZF9ibGtzaXplOyAgICAgICAgICAgICAgICAgICAgIC8qIGJsb2Nrc2l6ZSAqLworICAgIHVsb25nMzIgICAgIGxkX2RjbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGRpc2tzICovCisgICAgdWxvbmczMiAgICAgbGRfc2xhdmU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2cuIGRyaXZlIGluZGV4ICovCisgICAgdWxvbmczMiAgICAgbGRfZHR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAvKiB0eXBlIG9mIGxvZ2ljYWwgZHJpdmUgKi8KKyAgICB1bG9uZzMyICAgICBsZF9sYXN0X2Vycm9yOyAgICAgICAgICAgICAgICAgIC8qIGxhc3QgZXJyb3IgKi8KKyAgICB1bmNoYXIgICAgICBsZF9uYW1lWzhdOyAgICAgICAgICAgICAgICAgICAgIC8qIGxvZy4gZHJpdmUgbmFtZSAqLworICAgIHVuY2hhciAgICAgIGxkX2Vycm9yOyAgICAgICAgICAgICAgICAgICAgICAgLyogZXJyb3IgKi8KK30gUEFDS0VEIGdkdGhfY2RyaW5mb19zdHI7CisKKy8qIE9FTSBzdHJpbmcgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZzMyICAgICBjdGxfdmVyc2lvbjsKKyAgICB1bG9uZzMyICAgICBmaWxlX21ham9yX3ZlcnNpb247CisgICAgdWxvbmczMiAgICAgZmlsZV9taW5vcl92ZXJzaW9uOworICAgIHVsb25nMzIgICAgIGJ1ZmZlcl9zaXplOworICAgIHVsb25nMzIgICAgIGNweV9jb3VudDsKKyAgICB1bG9uZzMyICAgICBleHRfZXJyb3I7CisgICAgdWxvbmczMiAgICAgb2VtX2lkOworICAgIHVsb25nMzIgICAgIGJvYXJkX2lkOworfSBQQUNLRUQgZ2R0aF9vZW1fc3RyX3BhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuY2hhciAgICAgIHByb2R1Y3RfMF8xX25hbWVbMTZdOworICAgIHVuY2hhciAgICAgIHByb2R1Y3RfNF81X25hbWVbMTZdOworICAgIHVuY2hhciAgICAgIHByb2R1Y3RfY2x1c3Rlcl9uYW1lWzE2XTsKKyAgICB1bmNoYXIgICAgICBwcm9kdWN0X3Jlc2VydmVkWzE2XTsKKyAgICB1bmNoYXIgICAgICBzY3NpX2NsdXN0ZXJfdGFyZ2V0X3ZlbmRvcl9pZFsxNl07CisgICAgdW5jaGFyICAgICAgY2x1c3Rlcl9yYWlkX2Z3X25hbWVbMTZdOworICAgIHVuY2hhciAgICAgIG9lbV9icmFuZF9uYW1lWzE2XTsKKyAgICB1bmNoYXIgICAgICBvZW1fcmFpZF90eXBlWzE2XTsKKyAgICB1bmNoYXIgICAgICBiaW9zX3R5cGVbMTNdOworICAgIHVuY2hhciAgICAgIGJpb3NfdGl0bGVbNTBdOworICAgIHVuY2hhciAgICAgIG9lbV9jb21wYW55X25hbWVbMzddOworICAgIHVsb25nMzIgICAgIHBjaV9pZF8xOworICAgIHVsb25nMzIgICAgIHBjaV9pZF8yOworICAgIHVuY2hhciAgICAgIHZhbGlkYXRpb25fc3RhdHVzWzgwXTsKKyAgICB1bmNoYXIgICAgICByZXNlcnZlZF8xWzRdOworICAgIHVuY2hhciAgICAgIHNjc2lfaG9zdF9kcml2ZV9pbnF1aXJ5X3ZlbmRvcl9pZFsxNl07CisgICAgdW5jaGFyICAgICAgbGlicmFyeV9maWxlX3RlbXBsYXRlWzE2XTsKKyAgICB1bmNoYXIgICAgICByZXNlcnZlZF8yWzE2XTsKKyAgICB1bmNoYXIgICAgICB0b29sX25hbWVfMVszMl07CisgICAgdW5jaGFyICAgICAgdG9vbF9uYW1lXzJbMzJdOworICAgIHVuY2hhciAgICAgIHRvb2xfbmFtZV8zWzMyXTsKKyAgICB1bmNoYXIgICAgICBvZW1fY29udGFjdF8xWzg0XTsKKyAgICB1bmNoYXIgICAgICBvZW1fY29udGFjdF8yWzg0XTsKKyAgICB1bmNoYXIgICAgICBvZW1fY29udGFjdF8zWzg0XTsKK30gUEFDS0VEIGdkdGhfb2VtX3N0cjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGdkdGhfb2VtX3N0cl9wYXJhbXMgcGFyYW1zOworICAgIGdkdGhfb2VtX3N0ciAgICAgICAgdGV4dDsKK30gUEFDS0VEIGdkdGhfb2VtX3N0cl9pb2N0bDsKKworLyogYm9hcmQgZmVhdHVyZXMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bmNoYXIgICAgICBjaGFpbmluZzsgICAgICAgICAgICAgICAgICAgICAgIC8qIENoYWluaW5nIHN1cHBvcnRlZCAqLworICAgIHVuY2hhciAgICAgIHN0cmlwaW5nOyAgICAgICAgICAgICAgICAgICAgICAgLyogU3RyaXBpbmcgKFJBSUQtMCkgc3VwcC4gKi8KKyAgICB1bmNoYXIgICAgICBtaXJyb3Jpbmc7ICAgICAgICAgICAgICAgICAgICAgIC8qIE1pcnJvcmluZyAoUkFJRC0xKSBzdXBwLiAqLworICAgIHVuY2hhciAgICAgIHJhaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUkFJRC00LzUvMTAgc3VwcG9ydGVkICovCit9IFBBQ0tFRCBnZHRoX2JmZWF0X3N0cjsKKworLyogYm9hcmQgaW5mbyBJT0NUTCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVsb25nMzIgICAgIHNlcl9ubzsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VyaWFsIG5vLiAqLworICAgIHVuY2hhciAgICAgIG9lbV9pZFsyXTsgICAgICAgICAgICAgICAgICAgICAgLyogT0VNIElEICovCisgICAgdXNob3J0ICAgICAgZXBfZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAvKiBlcHJvbSBmbGFncyAqLworICAgIHVsb25nMzIgICAgIHByb2NfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvY2Vzc29yIElEICovCisgICAgdWxvbmczMiAgICAgbWVtc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtZW1vcnkgc2l6ZSAoYnl0ZXMpICovCisgICAgdW5jaGFyICAgICAgbWVtX2JhbmtzOyAgICAgICAgICAgICAgICAgICAgICAvKiBtZW1vcnkgYmFua3MgKi8KKyAgICB1bmNoYXIgICAgICBjaGFuX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNoYW5uZWwgdHlwZSAqLworICAgIHVuY2hhciAgICAgIGNoYW5fY291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyogY2hhbm5lbCBjb3VudCAqLworICAgIHVuY2hhciAgICAgIHJkb25nbGVfcHJlczsgICAgICAgICAgICAgICAgICAgLyogZG9uZ2xlIHByZXNlbnQ/ICovCisgICAgdWxvbmczMiAgICAgZXByX2Z3X3ZlcjsgICAgICAgICAgICAgICAgICAgICAvKiAoZXByb20pIGZpcm13YXJlIHZlcnNpb24gKi8KKyAgICB1bG9uZzMyICAgICB1cGRfZndfdmVyOyAgICAgICAgICAgICAgICAgICAgIC8qICh1cGRhdGUpIGZpcm13YXJlIHZlcnNpb24gKi8KKyAgICB1bG9uZzMyICAgICB1cGRfcmV2aXNpb247ICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSByZXZpc2lvbiAqLworICAgIGNoYXIgICAgICAgIHR5cGVfc3RyaW5nWzE2XTsgICAgICAgICAgICAgICAgLyogY29udHJvbGxlciBuYW1lICovCisgICAgY2hhciAgICAgICAgcmFpZF9zdHJpbmdbMTZdOyAgICAgICAgICAgICAgICAvKiBSQUlEIGZpcm13YXJlIG5hbWUgKi8KKyAgICB1bmNoYXIgICAgICB1cGRhdGVfcHJlczsgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBwcmVzZW50PyAqLworICAgIHVuY2hhciAgICAgIHhvcl9wcmVzOyAgICAgICAgICAgICAgICAgICAgICAgLyogWE9SIGVuZ2luZSBwcmVzZW50PyAqLworICAgIHVuY2hhciAgICAgIHByb21fdHlwZTsgICAgICAgICAgICAgICAgICAgICAgLyogUk9NIHR5cGUgKGVwcm9tL2ZsYXNoKSAqLworICAgIHVuY2hhciAgICAgIHByb21fY291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIFJPTSBkZXZpY2VzICovCisgICAgdWxvbmczMiAgICAgZHVwX3ByZXM7ICAgICAgICAgICAgICAgICAgICAgICAvKiBkdXBsZXhpbmcgbW9kdWxlIHByZXNlbnQ/ICovCisgICAgdWxvbmczMiAgICAgY2hhbl9wcmVzOyAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXhwYW5zaW9uIGNobi4gKi8KKyAgICB1bG9uZzMyICAgICBtZW1fcHJlczsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lbW9yeSBleHBhbnNpb24gaW5zdC4gPyAqLworICAgIHVuY2hhciAgICAgIGZ0X2J1c19zeXN0ZW07ICAgICAgICAgICAgICAgICAgLyogZmF1bHQgYnVzIHN1cHBvcnRlZD8gKi8KKyAgICB1bmNoYXIgICAgICBzdWJ0eXBlX3ZhbGlkOyAgICAgICAgICAgICAgICAgIC8qIGJvYXJkX3N1YnR5cGUgdmFsaWQ/ICovCisgICAgdW5jaGFyICAgICAgYm9hcmRfc3VidHlwZTsgICAgICAgICAgICAgICAgICAvKiBzdWJ0eXBlL2hhcmR3YXJlIGxldmVsICovCisgICAgdW5jaGFyICAgICAgcmFtcGFyaXR5X3ByZXM7ICAgICAgICAgICAgICAgICAvKiBSQU0gcGFyaXR5IGNoZWNrIGhhcmR3YXJlPyAqLworfSBQQUNLRUQgZ2R0aF9iaW5mb19zdHI7IAorCisvKiBnZXQgaG9zdCBkcml2ZSBpbmZvICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciAgICAgICAgbmFtZVs4XTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBob3N0IGRyaXZlIG5hbWUgKi8KKyAgICB1bG9uZzMyICAgICBzaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKHNlY3RvcnMpICovCisgICAgdW5jaGFyICAgICAgaG9zdF9kcml2ZTsgICAgICAgICAgICAgICAgICAgICAvKiBob3N0IGRyaXZlIG51bWJlciAqLworICAgIHVuY2hhciAgICAgIGxvZ19kcml2ZTsgICAgICAgICAgICAgICAgICAgICAgLyogbG9nLiBkcml2ZSAobWFzdGVyKSAqLworICAgIHVuY2hhciAgICAgIHJlc2VydmVkOworICAgIHVuY2hhciAgICAgIHJ3X2F0dHJpYnM7ICAgICAgICAgICAgICAgICAgICAgLyogci93IGF0dHJpYnMgKi8KKyAgICB1bG9uZzMyICAgICBzdGFydF9zZWM7ICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IHNlY3RvciAqLworfSBQQUNLRUQgZ2R0aF9oZW50cnlfc3RyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmczMiAgICAgZW50cmllczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbnRyeSBjb3VudCAqLworICAgIHVsb25nMzIgICAgIG9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Zmc2V0IG9mIGVudHJpZXMgKi8KKyAgICB1bmNoYXIgICAgICBzZWNzX3BfaGVhZDsgICAgICAgICAgICAgICAgICAgIC8qIHNlY3RvcnMvaGVhZCAqLworICAgIHVuY2hhciAgICAgIGhlYWRzX3BfY3lsOyAgICAgICAgICAgICAgICAgICAgLyogaGVhZHMvY3lsaW5kZXIgKi8KKyAgICB1bmNoYXIgICAgICByZXNlcnZlZDsKKyAgICB1bmNoYXIgICAgICBjbHVzdF9kcnZ0eXBlOyAgICAgICAgICAgICAgICAgIC8qIGNsdXN0ZXIgZHJpdmUgdHlwZSAqLworICAgIHVsb25nMzIgICAgIGxvY2F0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgLyogY29udHJvbGxlciBudW1iZXIgKi8KKyAgICBnZHRoX2hlbnRyeV9zdHIgZW50cnlbTUFYX0hEUklWRVNdOyAgICAgICAgIC8qIGVudHJpZXMgKi8KK30gUEFDS0VEIGdkdGhfaGdldF9zdHI7ICAgIAorCisKKy8qIERQUkFNIHN0cnVjdHVyZXMgKi8KKworLyogaW50ZXJmYWNlIGFyZWEgSVNBL1BDSSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuY2hhciAgICAgICAgICAgICAgU19DbWRfSW5keDsgICAgICAgICAgICAgLyogc3BlY2lhbCBjb21tYW5kICovCisgICAgdW5jaGFyIHZvbGF0aWxlICAgICBTX1N0YXR1czsgICAgICAgICAgICAgICAvKiBzdGF0dXMgc3BlY2lhbCBjb21tYW5kICovCisgICAgdXNob3J0ICAgICAgICAgICAgICByZXNlcnZlZDE7CisgICAgdWxvbmczMiAgICAgICAgICAgICBTX0luZm9bNF07ICAgICAgICAgICAgICAvKiBhZGQuIGluZm8gc3BlY2lhbCBjb21tYW5kICovCisgICAgdW5jaGFyIHZvbGF0aWxlICAgICBTZW1hMDsgICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIHNlbWFwaG9yZSAqLworICAgIHVuY2hhciAgICAgICAgICAgICAgcmVzZXJ2ZWQyWzNdOworICAgIHVuY2hhciAgICAgICAgICAgICAgQ21kX0luZGV4OyAgICAgICAgICAgICAgLyogY29tbWFuZCBudW1iZXIgKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIHJlc2VydmVkM1szXTsKKyAgICB1c2hvcnQgdm9sYXRpbGUgICAgIFN0YXR1czsgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgc3RhdHVzICovCisgICAgdXNob3J0ICAgICAgICAgICAgICBTZXJ2aWNlOyAgICAgICAgICAgICAgICAvKiBzZXJ2aWNlKGZvciBhc3luYy5ldmVudHMpICovCisgICAgdWxvbmczMiAgICAgICAgICAgICBJbmZvWzJdOyAgICAgICAgICAgICAgICAvKiBhZGRpdGlvbmFsIGluZm8gKi8KKyAgICBzdHJ1Y3QgeworICAgICAgICB1c2hvcnQgICAgICAgICAgb2Zmc2V0OyAgICAgICAgICAgICAgICAgLyogY29tbWFuZCBvZmZzLiBpbiB0aGUgRFBSQU0qLworICAgICAgICB1c2hvcnQgICAgICAgICAgc2Vydl9pZDsgICAgICAgICAgICAgICAgLyogc2VydmljZSAqLworICAgIH0gUEFDS0VEIGNvbW1fcXVldWVbTUFYT0ZGU0VUU107ICAgICAgICAgICAgLyogY29tbWFuZCBxdWV1ZSAqLworICAgIHVsb25nMzIgICAgICAgICAgICAgYmlvc19yZXNlcnZlZFsyXTsKKyAgICB1bmNoYXIgICAgICAgICAgICAgIGdkdF9kcHJfY21kWzFdOyAgICAgICAgIC8qIGNvbW1hbmRzICovCit9IFBBQ0tFRCBnZHRfZHByX2lmOworCisvKiBTUkFNIHN0cnVjdHVyZSBQQ0kgY29udHJvbGxlcnMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZzMyICAgICBtYWdpYzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIgSUQgZnJvbSBCSU9TICovCisgICAgdXNob3J0ICAgICAgbmVlZF9kZWluaXQ7ICAgICAgICAgICAgICAgICAgICAvKiBzd2l0Y2ggYmV0dy4gQklPUy9kcml2ZXIgKi8KKyAgICB1bmNoYXIgICAgICBzd2l0Y2hfc3VwcG9ydDsgICAgICAgICAgICAgICAgIC8qIHNlZSBuZWVkX2RlaW5pdCAqLworICAgIHVuY2hhciAgICAgIHBhZGRpbmdbOV07CisgICAgdW5jaGFyICAgICAgb3NfdXNlZFsxNl07ICAgICAgICAgICAgICAgICAgICAvKiBPUyBjb2RlIHBlciBzZXJ2aWNlICovCisgICAgdW5jaGFyICAgICAgdW51c2VkWzI4XTsKKyAgICB1bmNoYXIgICAgICBmd19tYWdpYzsgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRyLiBJRCBmcm9tIGZpcm13YXJlICovCit9IFBBQ0tFRCBnZHRfcGNpX3NyYW07CisKKy8qIFNSQU0gc3RydWN0dXJlIEVJU0EgY29udHJvbGxlcnMgKGJ1dCBOT1QgR0RUMzAwMC8zMDIwKSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuY2hhciAgICAgIG9zX3VzZWRbMTZdOyAgICAgICAgICAgICAgICAgICAgLyogT1MgY29kZSBwZXIgc2VydmljZSAqLworICAgIHVzaG9ydCAgICAgIG5lZWRfZGVpbml0OyAgICAgICAgICAgICAgICAgICAgLyogc3dpdGNoIGJldHcuIEJJT1MvZHJpdmVyICovCisgICAgdW5jaGFyICAgICAgc3dpdGNoX3N1cHBvcnQ7ICAgICAgICAgICAgICAgICAvKiBzZWUgbmVlZF9kZWluaXQgKi8KKyAgICB1bmNoYXIgICAgICBwYWRkaW5nOworfSBQQUNLRUQgZ2R0X2Vpc2Ffc3JhbTsKKworCisvKiBEUFJBTSBJU0EgY29udHJvbGxlcnMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1bmNoYXIgICAgICBiaW9zX3VzZWRbMHgzYzAwLTMyXTsgICAvKiAxNUtCIC0gMzJCeXRlcyBCSU9TICovCisgICAgICAgICAgICB1bG9uZzMyICAgICBtYWdpYzsgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIChFSVNBKSBJRCAqLworICAgICAgICAgICAgdXNob3J0ICAgICAgbmVlZF9kZWluaXQ7ICAgICAgICAgICAgLyogc3dpdGNoIGJldHcuIEJJT1MvZHJpdmVyICovCisgICAgICAgICAgICB1bmNoYXIgICAgICBzd2l0Y2hfc3VwcG9ydDsgICAgICAgICAvKiBzZWUgbmVlZF9kZWluaXQgKi8KKyAgICAgICAgICAgIHVuY2hhciAgICAgIHBhZGRpbmdbOV07CisgICAgICAgICAgICB1bmNoYXIgICAgICBvc191c2VkWzE2XTsgICAgICAgICAgICAvKiBPUyBjb2RlIHBlciBzZXJ2aWNlICovCisgICAgICAgIH0gUEFDS0VEIGRwX3NyYW07CisgICAgICAgIHVuY2hhciAgICAgICAgICBiaW9zX2FyZWFbMHg0MDAwXTsgICAgICAvKiAxNktCIHJlc2VydmVkIGZvciBCSU9TICovCisgICAgfSBidTsKKyAgICB1bmlvbiB7CisgICAgICAgIGdkdF9kcHJfaWYgICAgICBpYzsgICAgICAgICAgICAgICAgICAgICAvKiBpbnRlcmZhY2UgYXJlYSAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgaWZfYXJlYVsweDMwMDBdOyAgICAgICAgLyogMTJLQiBmb3IgaW50ZXJmYWNlICovCisgICAgfSB1OworICAgIHN0cnVjdCB7CisgICAgICAgIHVuY2hhciAgICAgICAgICBtZW1sb2NrOyAgICAgICAgICAgICAgICAvKiB3cml0ZSBwcm90ZWN0aW9uIERQUkFNICovCisgICAgICAgIHVuY2hhciAgICAgICAgICBldmVudDsgICAgICAgICAgICAgICAgICAvKiByZWxlYXNlIGV2ZW50ICovCisgICAgICAgIHVuY2hhciAgICAgICAgICBpcnFlbjsgICAgICAgICAgICAgICAgICAvKiBib2FyZCBpbnRlcnJ1cHRzIGVuYWJsZSAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgaXJxZGVsOyAgICAgICAgICAgICAgICAgLyogYWNrbm93bGVkZ2UgYm9hcmQgaW50LiAqLworICAgICAgICB1bmNoYXIgdm9sYXRpbGUgU2VtYTE7ICAgICAgICAgICAgICAgICAgLyogc3RhdHVzIHNlbWFwaG9yZSAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgcnE7ICAgICAgICAgICAgICAgICAgICAgLyogSVJRL0RSUSBjb25maWd1cmF0aW9uICovCisgICAgfSBQQUNLRUQgaW87Cit9IFBBQ0tFRCBnZHQyX2RwcmFtX3N0cjsKKworLyogRFBSQU0gUENJIGNvbnRyb2xsZXJzICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5pb24geworICAgICAgICBnZHRfZHByX2lmICAgICAgaWM7ICAgICAgICAgICAgICAgICAgICAgLyogaW50ZXJmYWNlIGFyZWEgKi8KKyAgICAgICAgdW5jaGFyICAgICAgICAgIGlmX2FyZWFbMHhmZjAtc2l6ZW9mKGdkdF9wY2lfc3JhbSldOworICAgIH0gdTsKKyAgICBnZHRfcGNpX3NyYW0gICAgICAgIGdkdDZzcjsgICAgICAgICAgICAgICAgIC8qIFNSQU0gc3RydWN0dXJlICovCisgICAgc3RydWN0IHsKKyAgICAgICAgdW5jaGFyICAgICAgICAgIHVudXNlZDBbMV07CisgICAgICAgIHVuY2hhciB2b2xhdGlsZSBTZW1hMTsgICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIHNlbWFwaG9yZSAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgdW51c2VkMVszXTsKKyAgICAgICAgdW5jaGFyICAgICAgICAgIGlycWVuOyAgICAgICAgICAgICAgICAgIC8qIGJvYXJkIGludGVycnVwdHMgZW5hYmxlICovCisgICAgICAgIHVuY2hhciAgICAgICAgICB1bnVzZWQyWzJdOworICAgICAgICB1bmNoYXIgICAgICAgICAgZXZlbnQ7ICAgICAgICAgICAgICAgICAgLyogcmVsZWFzZSBldmVudCAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgdW51c2VkM1szXTsKKyAgICAgICAgdW5jaGFyICAgICAgICAgIGlycWRlbDsgICAgICAgICAgICAgICAgIC8qIGFja25vd2xlZGdlIGJvYXJkIGludC4gKi8KKyAgICAgICAgdW5jaGFyICAgICAgICAgIHVudXNlZDRbM107CisgICAgfSBQQUNLRUQgaW87Cit9IFBBQ0tFRCBnZHQ2X2RwcmFtX3N0cjsKKworLyogUExYIHJlZ2lzdGVyIHN0cnVjdHVyZSAobmV3IFBDSSBjb250cm9sbGVycykgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bmNoYXIgICAgICAgICAgICAgIGNmZ19yZWc7ICAgICAgICAvKiBEUFJBTSBjZmcuKDI6YmVsb3cgMU1CLDA6YW55d2hlcmUpKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIHVudXNlZDFbMHgzZl07CisgICAgdW5jaGFyIHZvbGF0aWxlICAgICBzZW1hMF9yZWc7ICAgICAgICAgICAgICAvKiBjb21tYW5kIHNlbWFwaG9yZSAqLworICAgIHVuY2hhciB2b2xhdGlsZSAgICAgc2VtYTFfcmVnOyAgICAgICAgICAgICAgLyogc3RhdHVzIHNlbWFwaG9yZSAqLworICAgIHVuY2hhciAgICAgICAgICAgICAgdW51c2VkMlsyXTsKKyAgICB1c2hvcnQgdm9sYXRpbGUgICAgIHN0YXR1czsgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgc3RhdHVzICovCisgICAgdXNob3J0ICAgICAgICAgICAgICBzZXJ2aWNlOyAgICAgICAgICAgICAgICAvKiBzZXJ2aWNlICovCisgICAgdWxvbmczMiAgICAgICAgICAgICBpbmZvWzJdOyAgICAgICAgICAgICAgICAvKiBhZGRpdGlvbmFsIGluZm8gKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIHVudXNlZDNbMHgxMF07CisgICAgdW5jaGFyICAgICAgICAgICAgICBsZG9vcl9yZWc7ICAgICAgICAgICAgICAvKiBQQ0kgdG8gbG9jYWwgZG9vcmJlbGwgKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIHVudXNlZDRbM107CisgICAgdW5jaGFyIHZvbGF0aWxlICAgICBlZG9vcl9yZWc7ICAgICAgICAgICAgICAvKiBsb2NhbCB0byBQQ0kgZG9vcmJlbGwgKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIHVudXNlZDVbM107CisgICAgdW5jaGFyICAgICAgICAgICAgICBjb250cm9sMDsgICAgICAgICAgICAgICAvKiBjb250cm9sMCByZWdpc3Rlcih1bnVzZWQpICovCisgICAgdW5jaGFyICAgICAgICAgICAgICBjb250cm9sMTsgICAgICAgICAgICAgICAvKiBib2FyZCBpbnRlcnJ1cHRzIGVuYWJsZSAqLworICAgIHVuY2hhciAgICAgICAgICAgICAgdW51c2VkNlsweDE2XTsKK30gUEFDS0VEIGdkdDZjX3BseF9yZWdzOworCisvKiBEUFJBTSBuZXcgUENJIGNvbnRyb2xsZXJzICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5pb24geworICAgICAgICBnZHRfZHByX2lmICAgICAgaWM7ICAgICAgICAgICAgICAgICAgICAgLyogaW50ZXJmYWNlIGFyZWEgKi8KKyAgICAgICAgdW5jaGFyICAgICAgICAgIGlmX2FyZWFbMHg0MDAwLXNpemVvZihnZHRfcGNpX3NyYW0pXTsKKyAgICB9IHU7CisgICAgZ2R0X3BjaV9zcmFtICAgICAgICBnZHQ2c3I7ICAgICAgICAgICAgICAgICAvKiBTUkFNIHN0cnVjdHVyZSAqLworfSBQQUNLRUQgZ2R0NmNfZHByYW1fc3RyOworCisvKiBpOTYwIHJlZ2lzdGVyIHN0cnVjdHVyZSAoUENJIE1QUiBjb250cm9sbGVycykgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bmNoYXIgICAgICAgICAgICAgIHVudXNlZDFbMTZdOworICAgIHVuY2hhciB2b2xhdGlsZSAgICAgc2VtYTBfcmVnOyAgICAgICAgICAgICAgLyogY29tbWFuZCBzZW1hcGhvcmUgKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIHVudXNlZDI7CisgICAgdW5jaGFyIHZvbGF0aWxlICAgICBzZW1hMV9yZWc7ICAgICAgICAgICAgICAvKiBzdGF0dXMgc2VtYXBob3JlICovCisgICAgdW5jaGFyICAgICAgICAgICAgICB1bnVzZWQzOworICAgIHVzaG9ydCB2b2xhdGlsZSAgICAgc3RhdHVzOyAgICAgICAgICAgICAgICAgLyogY29tbWFuZCBzdGF0dXMgKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgIHNlcnZpY2U7ICAgICAgICAgICAgICAgIC8qIHNlcnZpY2UgKi8KKyAgICB1bG9uZzMyICAgICAgICAgICAgIGluZm9bMl07ICAgICAgICAgICAgICAgIC8qIGFkZGl0aW9uYWwgaW5mbyAqLworICAgIHVuY2hhciAgICAgICAgICAgICAgbGRvb3JfcmVnOyAgICAgICAgICAgICAgLyogUENJIHRvIGxvY2FsIGRvb3JiZWxsICovCisgICAgdW5jaGFyICAgICAgICAgICAgICB1bnVzZWQ0WzExXTsKKyAgICB1bmNoYXIgdm9sYXRpbGUgICAgIGVkb29yX3JlZzsgICAgICAgICAgICAgIC8qIGxvY2FsIHRvIFBDSSBkb29yYmVsbCAqLworICAgIHVuY2hhciAgICAgICAgICAgICAgdW51c2VkNVs3XTsKKyAgICB1bmNoYXIgICAgICAgICAgICAgIGVkb29yX2VuX3JlZzsgICAgICAgICAgIC8qIGJvYXJkIGludGVycnVwdHMgZW5hYmxlICovCisgICAgdW5jaGFyICAgICAgICAgICAgICB1bnVzZWQ2WzI3XTsKKyAgICB1bG9uZzMyICAgICAgICAgICAgIHVudXNlZDdbOTM5XTsgICAgICAgICAKKyAgICB1bG9uZzMyICAgICAgICAgICAgIHNldmVyaXR5OyAgICAgICAKKyAgICBjaGFyICAgICAgICAgICAgICAgIGV2dF9zdHJbMjU2XTsgICAgICAgICAgIC8qIGV2ZW50IHN0cmluZyAqLworfSBQQUNLRUQgZ2R0Nm1faTk2MF9yZWdzOworCisvKiBEUFJBTSBQQ0kgTVBSIGNvbnRyb2xsZXJzICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZ2R0Nm1faTk2MF9yZWdzICAgICBpOTYwcjsgICAgICAgICAgICAgICAgICAvKiA0S0IgaTk2MCByZWdpc3RlcnMgKi8KKyAgICB1bmlvbiB7CisgICAgICAgIGdkdF9kcHJfaWYgICAgICBpYzsgICAgICAgICAgICAgICAgICAgICAvKiBpbnRlcmZhY2UgYXJlYSAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgaWZfYXJlYVsweDMwMDAtc2l6ZW9mKGdkdF9wY2lfc3JhbSldOworICAgIH0gdTsKKyAgICBnZHRfcGNpX3NyYW0gICAgICAgIGdkdDZzcjsgICAgICAgICAgICAgICAgIC8qIFNSQU0gc3RydWN0dXJlICovCit9IFBBQ0tFRCBnZHQ2bV9kcHJhbV9zdHI7CisKKworLyogUENJIHJlc291cmNlcyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHN0cnVjdCBwY2lfZGV2ICAgICAgKnBkZXY7CisgICAgdXNob3J0ICAgICAgICAgICAgICB2ZW5kb3JfaWQ7ICAgICAgICAgICAgICAvKiB2ZW5kb3IgKElDUCwgSW50ZWwsIC4uKSAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgZGV2aWNlX2lkOyAgICAgICAgICAgICAgLyogZGV2aWNlIElEICgwLC4uLDkpICovCisgICAgdXNob3J0ICAgICAgICAgICAgICBzdWJkZXZpY2VfaWQ7ICAgICAgICAgICAvKiBzdWIgZGV2aWNlIElEICovCisgICAgdW5jaGFyICAgICAgICAgICAgICBidXM7ICAgICAgICAgICAgICAgICAgICAvKiBQQ0kgYnVzICovCisgICAgdW5jaGFyICAgICAgICAgICAgICBkZXZpY2VfZm47ICAgICAgICAgICAgICAvKiBQQ0kgZGV2aWNlL2Z1bmN0aW9uIG5vLiAqLworICAgIHVsb25nICAgICAgICAgICAgICAgZHBtZW07ICAgICAgICAgICAgICAgICAgLyogRFBSQU0gYWRkcmVzcyAqLworICAgIHVsb25nICAgICAgICAgICAgICAgaW87ICAgICAgICAgICAgICAgICAgICAgLyogSU8gYWRkcmVzcyAqLworICAgIHVsb25nICAgICAgICAgICAgICAgaW9fbW07ICAgICAgICAgICAgICAgICAgLyogSU8gYWRkcmVzcyBtZW0uIG1hcHBlZCAqLworICAgIHVuY2hhciAgICAgICAgICAgICAgaXJxOyAgICAgICAgICAgICAgICAgICAgLyogSVJRICovCit9IGdkdGhfcGNpX3N0cjsKKworCisvKiBjb250cm9sbGVyIGluZm9ybWF0aW9uIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVzaG9ydCAgICAgICAgICAgICAgb2VtX2lkOyAgICAgICAgICAgICAgICAgLyogT0VNICovCisgICAgdXNob3J0ICAgICAgICAgICAgICB0eXBlOyAgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIGNsYXNzICovCisgICAgdWxvbmczMiAgICAgICAgICAgICBzdHlwZTsgICAgICAgICAgICAgICAgICAvKiBzdWJ0eXBlIChQQ0k6IGRldmljZSBJRCkgKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgIHN1YmRldmljZV9pZDsgICAgICAgICAgIC8qIHN1YiBkZXZpY2UgSUQgKFBDSSkgKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgIGZ3X3ZlcnM7ICAgICAgICAgICAgICAgIC8qIGZpcm13YXJlIHZlcnNpb24gKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgIGNhY2hlX2ZlYXQ7ICAgICAgICAgICAgIC8qIGZlYXQuIGNhY2hlIHNlcnYuIChzL2csLi4pKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgIHJhd19mZWF0OyAgICAgICAgICAgICAgIC8qIGZlYXQuIHJhdyBzZXJ2aWNlIChzL2csLi4pKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgIHNjcmVlbl9mZWF0OyAgICAgICAgICAgIC8qIGZlYXQuIHJhdyBzZXJ2aWNlIChzL2csLi4pKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgIGJtaWM7ICAgICAgICAgICAgICAgICAgIC8qIEJNSUMgYWRkcmVzcyAoRUlTQSkgKi8KKyAgICB2b2lkIF9faW9tZW0gICAgICAgICpicmQ7ICAgICAgICAgICAgICAgICAgIC8qIERQUkFNIGFkZHJlc3MgKi8KKyAgICB1bG9uZzMyICAgICAgICAgICAgIGJyZF9waHlzOyAgICAgICAgICAgICAgIC8qIHNsb3QgbnVtYmVyL0JJT1MgYWRkcmVzcyAqLworICAgIGdkdDZjX3BseF9yZWdzICAgICAgKnBseDsgICAgICAgICAgICAgICAgICAgLyogUExYIHJlZ3MgKG5ldyBQQ0kgY29udHIuKSAqLworICAgIGdkdGhfY21kX3N0ciAgICAgICAgKnBjY2I7ICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBjb21tYW5kIHN0cnVjdHVyZSAqLworICAgIHVsb25nMzIgICAgICAgICAgICAgY2NiX3BoeXM7ICAgICAgICAgICAgICAgLyogcGh5cy4gYWRkcmVzcyAqLworI2lmZGVmIElOVF9DT0FMCisgICAgZ2R0aF9jb2FsX3N0YXR1cyAgICAqY29hbF9zdGF0OyAgICAgICAgICAgICAvKiBidWZmZXIgZm9yIGNvYWxlc2NpbmcgaW50LiovCisgICAgdWxvbmc2NCAgICAgICAgICAgICBjb2FsX3N0YXRfcGh5czsgICAgICAgICAvKiBwaHlzLiBhZGRyZXNzICovCisjZW5kaWYKKyAgICBjaGFyICAgICAgICAgICAgICAgICpwc2NyYXRjaDsgICAgICAgICAgICAgIC8qIHNjcmF0Y2ggKERNQSkgYnVmZmVyICovCisgICAgdWxvbmc2NCAgICAgICAgICAgICBzY3JhdGNoX3BoeXM7ICAgICAgICAgICAvKiBwaHlzLiBhZGRyZXNzICovCisgICAgdW5jaGFyICAgICAgICAgICAgICBzY3JhdGNoX2J1c3k7ICAgICAgICAgICAvKiBpbiB1c2U/ICovCisgICAgdW5jaGFyICAgICAgICAgICAgICBkbWE2NF9zdXBwb3J0OyAgICAgICAgICAvKiA2NC1iaXQgRE1BIHN1cHBvcnRlZD8gKi8KKyAgICBnZHRoX21zZ19zdHIgICAgICAgICpwbXNnOyAgICAgICAgICAgICAgICAgIC8qIG1lc3NhZ2UgYnVmZmVyICovCisgICAgdWxvbmc2NCAgICAgICAgICAgICBtc2dfcGh5czsgICAgICAgICAgICAgICAvKiBwaHlzLiBhZGRyZXNzICovCisgICAgdW5jaGFyICAgICAgICAgICAgICBzY2FuX21vZGU7ICAgICAgICAgICAgICAvKiBjdXJyZW50IHNjYW4gbW9kZSAqLworICAgIHVuY2hhciAgICAgICAgICAgICAgaXJxOyAgICAgICAgICAgICAgICAgICAgLyogSVJRICovCisgICAgdW5jaGFyICAgICAgICAgICAgICBkcnE7ICAgICAgICAgICAgICAgICAgICAvKiBEUlEgKElTQSBjb250cm9sbGVycykgKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgIHN0YXR1czsgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgc3RhdHVzICovCisgICAgdXNob3J0ICAgICAgICAgICAgICBzZXJ2aWNlOyAgICAgICAgICAgICAgICAvKiBzZXJ2aWNlL2Zpcm13YXJlIHZlci4vLi4gKi8KKyAgICB1bG9uZzMyICAgICAgICAgICAgIGluZm87CisgICAgdWxvbmczMiAgICAgICAgICAgICBpbmZvMjsgICAgICAgICAgICAgICAgICAvKiBhZGRpdGlvbmFsIGluZm8gKi8KKyAgICBTY3NpX0NtbmQgICAgICAgICAgICpyZXFfZmlyc3Q7ICAgICAgICAgICAgIC8qIHRvcCBvZiByZXF1ZXN0IHF1ZXVlICovCisgICAgc3RydWN0IHsKKyAgICAgICAgdW5jaGFyICAgICAgICAgIHByZXNlbnQ7ICAgICAgICAgICAgICAgIC8qIEZsYWc6IGhvc3QgZHJpdmUgcHJlc2VudD8gKi8KKyAgICAgICAgdW5jaGFyICAgICAgICAgIGlzX2xvZ2RydjsgICAgICAgICAgICAgIC8qIEZsYWc6IGxvZy4gZHJpdmUgKG1hc3Rlcik/ICovCisgICAgICAgIHVuY2hhciAgICAgICAgICBpc19hcnJheWRydjsgICAgICAgICAgICAvKiBGbGFnOiBhcnJheSBkcml2ZT8gKi8KKyAgICAgICAgdW5jaGFyICAgICAgICAgIGlzX21hc3RlcjsgICAgICAgICAgICAgIC8qIEZsYWc6IGFycmF5IGRyaXZlIG1hc3Rlcj8gKi8KKyAgICAgICAgdW5jaGFyICAgICAgICAgIGlzX3Bhcml0eTsgICAgICAgICAgICAgIC8qIEZsYWc6IHBhcml0eSBkcml2ZT8gKi8KKyAgICAgICAgdW5jaGFyICAgICAgICAgIGlzX2hvdGZpeDsgICAgICAgICAgICAgIC8qIEZsYWc6IGhvdGZpeCBkcml2ZT8gKi8KKyAgICAgICAgdW5jaGFyICAgICAgICAgIG1hc3Rlcl9ubzsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBtYXN0ZXIgZHJpdmUgKi8KKyAgICAgICAgdW5jaGFyICAgICAgICAgIGxvY2s7ICAgICAgICAgICAgICAgICAgIC8qIGRyaXZlIGxvY2tlZD8gKGhvdCBwbHVnKSAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgaGVhZHM7ICAgICAgICAgICAgICAgICAgLyogbWFwcGluZyAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgc2VjczsKKyAgICAgICAgdXNob3J0ICAgICAgICAgIGRldnR5cGU7ICAgICAgICAgICAgICAgIC8qIGZ1cnRoZXIgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgdWxvbmc2NCAgICAgICAgIHNpemU7ICAgICAgICAgICAgICAgICAgIC8qIGNhcGFjaXR5ICovCisgICAgICAgIHVuY2hhciAgICAgICAgICBsZHJfbm87ICAgICAgICAgICAgICAgICAvKiBsb2cuIGRyaXZlIG5vLiAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgcndfYXR0cmliczsgICAgICAgICAgICAgLyogci93IGF0dHJpYnV0ZXMgKi8KKyAgICAgICAgdW5jaGFyICAgICAgICAgIGNsdXN0ZXJfdHlwZTsgICAgICAgICAgIC8qIGNsdXN0ZXIgcHJvcGVydGllcyAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgbWVkaWFfY2hhbmdlZDsgICAgICAgICAgLyogRmxhZzpNT1VOVC9VTk1PVU5UIG9jY3VyZWQgKi8KKyAgICAgICAgdWxvbmczMiAgICAgICAgIHN0YXJ0X3NlYzsgICAgICAgICAgICAgIC8qIHN0YXJ0IHNlY3RvciAqLworICAgIH0gaGRyW01BWF9MRFJJVkVTXTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogaG9zdCBkcml2ZXMgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgICB1bmNoYXIgICAgICAgICAgbG9jazsgICAgICAgICAgICAgICAgICAgLyogY2hhbm5lbCBsb2NrZWQ/IChob3QgcGx1ZykgKi8KKyAgICAgICAgdW5jaGFyICAgICAgICAgIHBkZXZfY250OyAgICAgICAgICAgICAgIC8qIHBoeXNpY2FsIGRldmljZSBjb3VudCAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgbG9jYWxfbm87ICAgICAgICAgICAgICAgLyogbG9jYWwgY2hhbm5lbCBudW1iZXIgKi8KKyAgICAgICAgdW5jaGFyICAgICAgICAgIGlvX2NudFtNQVhJRF07ICAgICAgICAgIC8qIGN1cnJlbnQgSU8gY291bnQgKi8KKyAgICAgICAgdWxvbmczMiAgICAgICAgIGFkZHJlc3M7ICAgICAgICAgICAgICAgIC8qIGNoYW5uZWwgYWRkcmVzcyAqLworICAgICAgICB1bG9uZzMyICAgICAgICAgaWRfbGlzdFtNQVhJRF07ICAgICAgICAgLyogSURzIG9mIHRoZSBwaHlzLiBkZXZpY2VzICovCisgICAgfSByYXdbTUFYQlVTXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTQ1NJIGNoYW5uZWxzICovCisgICAgc3RydWN0IHsKKyAgICAgICAgU2NzaV9DbW5kICAgICAgICpjbW5kOyAgICAgICAgICAgICAgICAgIC8qIHBlbmRpbmcgcmVxdWVzdCAqLworICAgICAgICB1c2hvcnQgICAgICAgICAgc2VydmljZTsgICAgICAgICAgICAgICAgLyogc2VydmljZSAqLworICAgIH0gY21kX3RhYltHRFRIX01BWENNRFNdOyAgICAgICAgICAgICAgICAgICAgLyogdGFibGUgb2YgcGVuZC4gcmVxdWVzdHMgKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIGJ1c19jbnQ7ICAgICAgICAgICAgICAgIC8qIFNDU0kgYnVzIGNvdW50ICovCisgICAgdW5jaGFyICAgICAgICAgICAgICB0aWRfY250OyAgICAgICAgICAgICAgICAvKiBUYXJnZXQgSUQgY291bnQgKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIGJ1c19pZFtNQVhCVVNdOyAgICAgICAgIC8qIElPUCBJRHMgKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIHZpcnRfYnVzOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiB2aXJ0dWFsIGJ1cyAqLworICAgIHVuY2hhciAgICAgICAgICAgICAgbW9yZV9wcm9jOyAgICAgICAgICAgICAgLyogbW9yZSAvcHJvYyBpbmZvIHN1cHBvcnRlZCAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgY21kX2NudDsgICAgICAgICAgICAgICAgLyogY29tbWFuZCBjb3VudCBpbiBEUFJBTSAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgY21kX2xlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGFjdHVhbCBjb21tYW5kICovCisgICAgdXNob3J0ICAgICAgICAgICAgICBjbWRfb2Zmc19kcG1lbTsgICAgICAgICAvKiBhY3R1YWwgb2Zmc2V0IGluIERQUkFNICovCisgICAgdXNob3J0ICAgICAgICAgICAgICBpY19hbGxfc2l6ZTsgICAgICAgICAgICAvKiBzaXplb2YgRFBSQU0gaW50ZXJmLiBhcmVhICovCisgICAgZ2R0aF9jcGFyX3N0ciAgICAgICBjcGFyOyAgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIGNhY2hlIHBhci4gKi8KKyAgICBnZHRoX2JmZWF0X3N0ciAgICAgIGJmZWF0OyAgICAgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIgZmVhdHVyZXMgKi8KKyAgICBnZHRoX2JpbmZvX3N0ciAgICAgIGJpbmZvOyAgICAgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIgaW5mbyAqLworICAgIGdkdGhfZXZ0X2RhdGEgICAgICAgZHZyOyAgICAgICAgICAgICAgICAgICAgLyogZXZlbnQgc3RydWN0dXJlICovCisgICAgc3BpbmxvY2tfdCAgICAgICAgICBzbXBfbG9jazsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDApCisgICAgc3RydWN0IHBjaV9kZXYgICAgICAqcGRldjsKKyNlbmRpZgorICAgIGNoYXIgICAgICAgICAgICAgICAgb2VtX25hbWVbOF07CisjaWZkZWYgR0RUSF9ETUFfU1RBVElTVElDUworICAgIHVsb25nICAgICAgICAgICAgICAgZG1hMzJfY250LCBkbWE2NF9jbnQ7ICAgLyogc3RhdGlzdGljczogRE1BIGJ1ZmZlciAqLworI2VuZGlmCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwwKQorICAgIFNjc2lfRGV2aWNlICAgICAgICAgKnNkZXY7CisjZWxzZQorICAgIFNjc2lfRGV2aWNlICAgICAgICAgc2RldjsKKyNlbmRpZgorfSBnZHRoX2hhX3N0cjsKKworLyogc3RydWN0dXJlIGZvciBzY3NpX3JlZ2lzdGVyKCksIFNDU0kgYnVzICE9IDAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1c2hvcnQgICAgICBoYW51bTsKKyAgICB1c2hvcnQgICAgICBidXNudW07Cit9IGdkdGhfbnVtX3N0cjsKKworLyogc3RydWN0dXJlIGZvciBzY3NpX3JlZ2lzdGVyKCkgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBnZHRoX251bV9zdHIgICAgICAgIG51bWV4dDsgICAgICAgICAgICAgICAgIC8qIG11c3QgYmUgdGhlIGZpcnN0IGVsZW1lbnQgKi8KKyAgICBnZHRoX2hhX3N0ciAgICAgICAgIGhhZXh0OworICAgIGdkdGhfY21kX3N0ciAgICAgICAgY21kZXh0OworfSBnZHRoX2V4dF9zdHI7CisKKworLyogSU5RVUlSWSBkYXRhIGZvcm1hdCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuY2hhciAgICAgIHR5cGVfcXVhbDsKKyAgICB1bmNoYXIgICAgICBtb2RpZl9ybWI7CisgICAgdW5jaGFyICAgICAgdmVyc2lvbjsKKyAgICB1bmNoYXIgICAgICByZXNwX2FlbmM7CisgICAgdW5jaGFyICAgICAgYWRkX2xlbmd0aDsKKyAgICB1bmNoYXIgICAgICByZXNlcnZlZDE7CisgICAgdW5jaGFyICAgICAgcmVzZXJ2ZWQyOworICAgIHVuY2hhciAgICAgIG1pc2M7CisgICAgdW5jaGFyICAgICAgdmVuZG9yWzhdOworICAgIHVuY2hhciAgICAgIHByb2R1Y3RbMTZdOworICAgIHVuY2hhciAgICAgIHJldmlzaW9uWzRdOworfSBQQUNLRUQgZ2R0aF9pbnFfZGF0YTsKKworLyogUkVBRF9DQVBBQ0lUWSBkYXRhIGZvcm1hdCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVsb25nMzIgICAgIGxhc3RfYmxvY2tfbm87CisgICAgdWxvbmczMiAgICAgYmxvY2tfbGVuZ3RoOworfSBQQUNLRUQgZ2R0aF9yZGNhcF9kYXRhOworCisvKiBSRUFEX0NBUEFDSVRZICgxNikgZGF0YSBmb3JtYXQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZzY0ICAgICBsYXN0X2Jsb2NrX25vOworICAgIHVsb25nMzIgICAgIGJsb2NrX2xlbmd0aDsKK30gUEFDS0VEIGdkdGhfcmRjYXAxNl9kYXRhOworCisvKiBSRVFVRVNUX1NFTlNFIGRhdGEgZm9ybWF0ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5jaGFyICAgICAgZXJyb3Jjb2RlOworICAgIHVuY2hhciAgICAgIHNlZ25vOworICAgIHVuY2hhciAgICAgIGtleTsKKyAgICB1bG9uZzMyICAgICBpbmZvOworICAgIHVuY2hhciAgICAgIGFkZF9sZW5ndGg7CisgICAgdWxvbmczMiAgICAgY21kX2luZm87CisgICAgdW5jaGFyICAgICAgYWRzYzsKKyAgICB1bmNoYXIgICAgICBhZHNxOworICAgIHVuY2hhciAgICAgIGZydWM7CisgICAgdW5jaGFyICAgICAga2V5X3NwZWNbM107Cit9IFBBQ0tFRCBnZHRoX3NlbnNlX2RhdGE7CisKKy8qIE1PREVfU0VOU0UgZGF0YSBmb3JtYXQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1bmNoYXIgIGRhdGFfbGVuZ3RoOworICAgICAgICB1bmNoYXIgIG1lZF90eXBlOworICAgICAgICB1bmNoYXIgIGRldl9wYXI7CisgICAgICAgIHVuY2hhciAgYmRfbGVuZ3RoOworICAgIH0gUEFDS0VEIGhkOworICAgIHN0cnVjdCB7CisgICAgICAgIHVuY2hhciAgZGVuc19jb2RlOworICAgICAgICB1bmNoYXIgIGJsb2NrX2NvdW50WzNdOworICAgICAgICB1bmNoYXIgIHJlc2VydmVkOworICAgICAgICB1bmNoYXIgIGJsb2NrX2xlbmd0aFszXTsKKyAgICB9IFBBQ0tFRCBiZDsKK30gUEFDS0VEIGdkdGhfbW9kZXBfZGF0YTsKKworLyogc3RhY2sgZnJhbWUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZyAgICAgICBiWzEwXTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMyLzY0IGJpdCBjb21waWxlciAhICovCit9IFBBQ0tFRCBnZHRoX3N0YWNrZnJhbWU7CisKKworLyogZnVuY3Rpb24gcHJvdG90eXBpbmcgKi8KKworaW50IGdkdGhfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK2ludCBnZHRoX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqKTsKK2ludCBnZHRoX3F1ZXVlY29tbWFuZChTY3NpX0NtbmQgKix2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKK2NvbnN0IGNoYXIgKmdkdGhfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQoraW50IGdkdGhfYmlvc19wYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKixzdHJ1Y3QgYmxvY2tfZGV2aWNlICosc2VjdG9yX3QsaW50ICopOworaW50IGdkdGhfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKiwgY2hhciAqLGNoYXIgKiosb2ZmX3QsaW50LGludCk7CisjZWxpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDApCitpbnQgZ2R0aF9iaW9zX3BhcmFtKERpc2sgKixrZGV2X3QsaW50ICopOworaW50IGdkdGhfcHJvY19pbmZvKGNoYXIgKixjaGFyICoqLG9mZl90LGludCxpbnQsaW50KTsKKyNlbHNlCitpbnQgZ2R0aF9iaW9zX3BhcmFtKERpc2sgKixrZGV2X3QsaW50ICopOworZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSBwcm9jX3Njc2lfZ2R0aDsKK2ludCBnZHRoX3Byb2NfaW5mbyhjaGFyICosY2hhciAqKixvZmZfdCxpbnQsaW50LGludCk7CitpbnQgZ2R0aF9hYm9ydChTY3NpX0NtbmQgKik7CitpbnQgZ2R0aF9yZXNldChTY3NpX0NtbmQgKix1bnNpZ25lZCBpbnQpOyAKKyNkZWZpbmUgR0RUSCB7IHByb2NfZGlyOiAgICAgICAgJnByb2Nfc2NzaV9nZHRoLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgcHJvY19pbmZvOiAgICAgICBnZHRoX3Byb2NfaW5mbywgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBuYW1lOiAgICAgICAgICAgICJHRFQgU0NTSSBEaXNrIEFycmF5IENvbnRyb2xsZXIiLFwKKyAgICAgICAgICAgICAgIGRldGVjdDogICAgICAgICAgZ2R0aF9kZXRlY3QsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgcmVsZWFzZTogICAgICAgICBnZHRoX3JlbGVhc2UsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBpbmZvOiAgICAgICAgICAgIGdkdGhfaW5mbywgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGNvbW1hbmQ6ICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgcXVldWVjb21tYW5kOiAgICBnZHRoX3F1ZXVlY29tbWFuZCwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBlaF9hYm9ydF9oYW5kbGVyOiBnZHRoX2VoX2Fib3J0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGVoX2RldmljZV9yZXNldF9oYW5kbGVyOiBnZHRoX2VoX2RldmljZV9yZXNldCwgICAgXAorICAgICAgICAgICAgICAgZWhfYnVzX3Jlc2V0X2hhbmRsZXI6IGdkdGhfZWhfYnVzX3Jlc2V0LCAgICAgICAgICBcCisgICAgICAgICAgICAgICBlaF9ob3N0X3Jlc2V0X2hhbmRsZXI6IGdkdGhfZWhfaG9zdF9yZXNldCwgICAgICAgIFwKKyAgICAgICAgICAgICAgIGFib3J0OiAgICAgICAgICAgZ2R0aF9hYm9ydCwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgcmVzZXQ6ICAgICAgICAgICBnZHRoX3Jlc2V0LCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBiaW9zX3BhcmFtOiAgICAgIGdkdGhfYmlvc19wYXJhbSwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGNhbl9xdWV1ZTogICAgICAgR0RUSF9NQVhDTURTLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgdGhpc19pZDogICAgICAgICAtMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBzZ190YWJsZXNpemU6ICAgIEdEVEhfTUFYU0csICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGNtZF9wZXJfbHVuOiAgICAgR0RUSF9NQVhDX1BfTCwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgcHJlc2VudDogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICB1bmNoZWNrZWRfaXNhX2RtYTogMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIHVzZV9jbHVzdGVyaW5nOiAgRU5BQkxFX0NMVVNURVJJTkcsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgdXNlX25ld19laF9jb2RlOiAxICAgICAgIC8qIHVzZSBuZXcgZXJyb3IgY29kZSAqLyB9ICAgIAorI2VuZGlmCisKK2ludCBnZHRoX2VoX2Fib3J0KFNjc2lfQ21uZCAqc2NwKTsKK2ludCBnZHRoX2VoX2RldmljZV9yZXNldChTY3NpX0NtbmQgKnNjcCk7CitpbnQgZ2R0aF9laF9idXNfcmVzZXQoU2NzaV9DbW5kICpzY3ApOworaW50IGdkdGhfZWhfaG9zdF9yZXNldChTY3NpX0NtbmQgKnNjcCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2dkdGhfaW9jdGwuaCBiL2RyaXZlcnMvc2NzaS9nZHRoX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgzZmFlNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9nZHRoX2lvY3RsLmgKQEAgLTAsMCArMSwzNDcgQEAKKyNpZm5kZWYgX0dEVEhfSU9DVExfSAorI2RlZmluZSBfR0RUSF9JT0NUTF9ICisKKy8qIGdkdGhfaW9jdGwuaAorICogJElkOiBnZHRoX2lvY3RsLmgsdiAxLjE0IDIwMDQvMDIvMTkgMTU6NDM6MTUgYWNoaW0gRXhwICQKKyAqLworCisvKiBJT0NUTHMgKi8KKyNkZWZpbmUgR0RUSU9DVExfTUFTSyAgICAgICAoJ0onPDw4KQorI2RlZmluZSBHRFRJT0NUTF9HRU5FUkFMICAgIChHRFRJT0NUTF9NQVNLIHwgMCkgLyogZ2VuZXJhbCBJT0NUTCAqLworI2RlZmluZSBHRFRJT0NUTF9EUlZFUlMgICAgIChHRFRJT0NUTF9NQVNLIHwgMSkgLyogZ2V0IGRyaXZlciB2ZXJzaW9uICovCisjZGVmaW5lIEdEVElPQ1RMX0NUUlRZUEUgICAgKEdEVElPQ1RMX01BU0sgfCAyKSAvKiBnZXQgY29udHJvbGxlciB0eXBlICovCisjZGVmaW5lIEdEVElPQ1RMX09TVkVSUyAgICAgKEdEVElPQ1RMX01BU0sgfCAzKSAvKiBnZXQgT1MgdmVyc2lvbiAqLworI2RlZmluZSBHRFRJT0NUTF9IRFJMSVNUICAgIChHRFRJT0NUTF9NQVNLIHwgNCkgLyogZ2V0IGhvc3QgZHJpdmUgbGlzdCAqLworI2RlZmluZSBHRFRJT0NUTF9DVFJDTlQgICAgIChHRFRJT0NUTF9NQVNLIHwgNSkgLyogZ2V0IGNvbnRyb2xsZXIgY291bnQgKi8KKyNkZWZpbmUgR0RUSU9DVExfTE9DS0RSViAgICAoR0RUSU9DVExfTUFTSyB8IDYpIC8qIGxvY2sgaG9zdCBkcml2ZSAqLworI2RlZmluZSBHRFRJT0NUTF9MT0NLQ0hOICAgIChHRFRJT0NUTF9NQVNLIHwgNykgLyogbG9jayBjaGFubmVsICovCisjZGVmaW5lIEdEVElPQ1RMX0VWRU5UICAgICAgKEdEVElPQ1RMX01BU0sgfCA4KSAvKiByZWFkIGNvbnRyb2xsZXIgZXZlbnRzICovCisjZGVmaW5lIEdEVElPQ1RMX1NDU0kgICAgICAgKEdEVElPQ1RMX01BU0sgfCA5KSAvKiBTQ1NJIGNvbW1hbmQgKi8KKyNkZWZpbmUgR0RUSU9DVExfUkVTRVRfQlVTICAoR0RUSU9DVExfTUFTSyB8MTApIC8qIHJlc2V0IFNDU0kgYnVzICovCisjZGVmaW5lIEdEVElPQ1RMX1JFU0NBTiAgICAgKEdEVElPQ1RMX01BU0sgfDExKSAvKiByZXNjYW4gaG9zdCBkcml2ZXMgKi8KKyNkZWZpbmUgR0RUSU9DVExfUkVTRVRfRFJWICAoR0RUSU9DVExfTUFTSyB8MTIpIC8qIHJlc2V0IChyZW1vdGUpIGRydi4gcmVzLiAqLworCisjZGVmaW5lIEdEVElPQ1RMX01BR0lDICAweGFmZmUwMDA0CisjZGVmaW5lIEVWRU5UX1NJWkUgICAgICAyOTQgCisjZGVmaW5lIEdEVEhfTUFYU0cgICAgICAzMiAgICAgICAgICAgICAgICAgICAgICAvKiBtYXguIHMvZyBlbGVtZW50cyAqLworCisjZGVmaW5lIE1BWF9MRFJJVkVTICAgICAyNTUgICAgICAgICAgICAgICAgICAgICAvKiBtYXguIGxvZy4gZHJpdmUgY291bnQgKi8KKyNpZmRlZiBHRFRIX0lPQ1RMX1BST0MKKyNkZWZpbmUgTUFYX0hEUklWRVMgICAgIDEwMCAgICAgICAgICAgICAgICAgICAgIC8qIG1heC4gaG9zdCBkcml2ZSBjb3VudCAqLworI2Vsc2UKKyNkZWZpbmUgTUFYX0hEUklWRVMgICAgIE1BWF9MRFJJVkVTICAgICAgICAgICAgIC8qIG1heC4gaG9zdCBkcml2ZSBjb3VudCAqLworI2VuZGlmCisKKy8qIHR5cGVkZWZzICovCisjaWZkZWYgX19LRVJORUxfXwordHlwZWRlZiB1MzIgICAgIHVsb25nMzI7Cit0eXBlZGVmIHU2NCAgICAgdWxvbmc2NDsKKyNlbmRpZgorCisjZGVmaW5lIFBBQ0tFRCAgX19hdHRyaWJ1dGVfXygocGFja2VkKSkKKworLyogc2NhdHRlci9nYXRoZXIgZWxlbWVudCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVsb25nMzIgICAgIHNnX3B0cjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyAqLworICAgIHVsb25nMzIgICAgIHNnX2xlbjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoICovCit9IFBBQ0tFRCBnZHRoX3NnX3N0cjsKKworLyogc2NhdHRlci9nYXRoZXIgZWxlbWVudCAtIDY0Yml0IGFkZHJlc3NlcyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVsb25nNjQgICAgIHNnX3B0cjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkcmVzcyAqLworICAgIHVsb25nMzIgICAgIHNnX2xlbjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoICovCit9IFBBQ0tFRCBnZHRoX3NnNjRfc3RyOworCisvKiBjb21tYW5kIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVsb25nMzIgICAgIEJvYXJkTm9kZTsgICAgICAgICAgICAgICAgICAgICAgLyogYm9hcmQgbm9kZSAoYWx3YXlzIDApICovCisgICAgdWxvbmczMiAgICAgQ29tbWFuZEluZGV4OyAgICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIG51bWJlciAqLworICAgIHVzaG9ydCAgICAgIE9wQ29kZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGNvbW1hbmQgKFJFQUQsLi4pICovCisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdXNob3J0ICAgICAgRGV2aWNlTm87ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNhY2hlIGRyaXZlICovCisgICAgICAgICAgICB1bG9uZzMyICAgICBCbG9ja05vOyAgICAgICAgICAgICAgICAvKiBibG9jayBudW1iZXIgKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIEJsb2NrQ250OyAgICAgICAgICAgICAgIC8qIGJsb2NrIGNvdW50ICovCisgICAgICAgICAgICB1bG9uZzMyICAgICBEZXN0QWRkcjsgICAgICAgICAgICAgICAvKiBkZXN0LiBhZGRyLiAoaWYgcy9nOiAtMSkgKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIHNnX2Nhbno7ICAgICAgICAgICAgICAgIC8qIHMvZyBlbGVtZW50IGNvdW50ICovCisgICAgICAgICAgICBnZHRoX3NnX3N0ciBzZ19sc3RbR0RUSF9NQVhTR107ICAgICAvKiBzL2cgbGlzdCAqLworICAgICAgICB9IFBBQ0tFRCBjYWNoZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FjaGUgc2VydmljZSBjbWQuIHN0ci4gKi8KKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVzaG9ydCAgICAgIERldmljZU5vOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjYWNoZSBkcml2ZSAqLworICAgICAgICAgICAgdWxvbmc2NCAgICAgQmxvY2tObzsgICAgICAgICAgICAgICAgLyogYmxvY2sgbnVtYmVyICovCisgICAgICAgICAgICB1bG9uZzMyICAgICBCbG9ja0NudDsgICAgICAgICAgICAgICAvKiBibG9jayBjb3VudCAqLworICAgICAgICAgICAgdWxvbmc2NCAgICAgRGVzdEFkZHI7ICAgICAgICAgICAgICAgLyogZGVzdC4gYWRkci4gKGlmIHMvZzogLTEpICovCisgICAgICAgICAgICB1bG9uZzMyICAgICBzZ19jYW56OyAgICAgICAgICAgICAgICAvKiBzL2cgZWxlbWVudCBjb3VudCAqLworICAgICAgICAgICAgZ2R0aF9zZzY0X3N0ciBzZ19sc3RbR0RUSF9NQVhTR107ICAgLyogcy9nIGxpc3QgKi8KKyAgICAgICAgfSBQQUNLRUQgY2FjaGU2NDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhY2hlIHNlcnZpY2UgY21kLiBzdHIuICovCisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1c2hvcnQgICAgICBwYXJhbV9zaXplOyAgICAgICAgICAgICAvKiBzaXplIG9mIHBfcGFyYW0gYnVmZmVyICovCisgICAgICAgICAgICB1bG9uZzMyICAgICBzdWJmdW5jOyAgICAgICAgICAgICAgICAvKiBJT0NUTCBmdW5jdGlvbiAqLworICAgICAgICAgICAgdWxvbmczMiAgICAgY2hhbm5lbDsgICAgICAgICAgICAgICAgLyogZGV2aWNlICovCisgICAgICAgICAgICB1bG9uZzY0ICAgICBwX3BhcmFtOyAgICAgICAgICAgICAgICAvKiBidWZmZXIgKi8KKyAgICAgICAgfSBQQUNLRUQgaW9jdGw7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElPQ1RMIGNvbW1hbmQgc3RydWN0dXJlICovCisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1c2hvcnQgICAgICByZXNlcnZlZDsKKyAgICAgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICB1bG9uZzMyICBtc2dfaGFuZGxlOyAgICAgICAgLyogbWVzc2FnZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgdWxvbmc2NCAgbXNnX2FkZHI7ICAgICAgICAgIC8qIG1lc3NhZ2UgYnVmZmVyIGFkZHJlc3MgKi8KKyAgICAgICAgICAgICAgICB9IFBBQ0tFRCBtc2c7CisgICAgICAgICAgICAgICAgdW5jaGFyICAgICAgIGRhdGFbMTJdOyAgICAgICAgICAvKiBidWZmZXIgZm9yIHJ0YyBkYXRhLCAuLi4gKi8KKyAgICAgICAgICAgIH0gc3U7CisgICAgICAgIH0gUEFDS0VEIHNjcmVlbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY3JlZW4gc2VydmljZSBjbWQuIHN0ci4gKi8KKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVzaG9ydCAgICAgIHJlc2VydmVkOworICAgICAgICAgICAgdWxvbmczMiAgICAgZGlyZWN0aW9uOyAgICAgICAgICAgICAgLyogZGF0YSBkaXJlY3Rpb24gKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIG1kaXNjX3RpbWU7ICAgICAgICAgICAgIC8qIGRpc2MuIHRpbWUgKDA6IG5vIHRpbWVvdXQpKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIG1jb25fdGltZTsgICAgICAgICAgICAgIC8qIGNvbm5lY3QgdGltZSgwOiBubyB0by4pICovCisgICAgICAgICAgICB1bG9uZzMyICAgICBzZGF0YTsgICAgICAgICAgICAgICAgICAvKiBkZXN0LiBhZGRyLiAoaWYgcy9nOiAtMSkgKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIHNkbGVuOyAgICAgICAgICAgICAgICAgIC8qIGRhdGEgbGVuZ3RoIChieXRlcykgKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIGNsZW47ICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgY21kLiBsZW5ndGgoNiwxMCwxMikgKi8KKyAgICAgICAgICAgIHVuY2hhciAgICAgIGNtZFsxMl07ICAgICAgICAgICAgICAgIC8qIFNDU0kgY29tbWFuZCAqLworICAgICAgICAgICAgdW5jaGFyICAgICAgdGFyZ2V0OyAgICAgICAgICAgICAgICAgLyogdGFyZ2V0IElEICovCisgICAgICAgICAgICB1bmNoYXIgICAgICBsdW47ICAgICAgICAgICAgICAgICAgICAvKiBMVU4gKi8KKyAgICAgICAgICAgIHVuY2hhciAgICAgIGJ1czsgICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgYnVzIG51bWJlciAqLworICAgICAgICAgICAgdW5jaGFyICAgICAgcHJpb3JpdHk7ICAgICAgICAgICAgICAgLyogb25seSAwIHVzZWQgKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIHNlbnNlX2xlbjsgICAgICAgICAgICAgIC8qIHNlbnNlIGRhdGEgbGVuZ3RoICovCisgICAgICAgICAgICB1bG9uZzMyICAgICBzZW5zZV9kYXRhOyAgICAgICAgICAgICAvKiBzZW5zZSBkYXRhIGFkZHIuICovCisgICAgICAgICAgICB1bG9uZzMyICAgICBsaW5rX3A7ICAgICAgICAgICAgICAgICAvKiBsaW5rZWQgY21kcyAobm90IHN1cHAuKSAqLworICAgICAgICAgICAgdWxvbmczMiAgICAgc2dfcmFuejsgICAgICAgICAgICAgICAgLyogcy9nIGVsZW1lbnQgY291bnQgKi8KKyAgICAgICAgICAgIGdkdGhfc2dfc3RyIHNnX2xzdFtHRFRIX01BWFNHXTsgICAgIC8qIHMvZyBsaXN0ICovCisgICAgICAgIH0gUEFDS0VEIHJhdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByYXcgc2VydmljZSBjbWQuIHN0cnVjdC4gKi8KKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVzaG9ydCAgICAgIHJlc2VydmVkOworICAgICAgICAgICAgdWxvbmczMiAgICAgZGlyZWN0aW9uOyAgICAgICAgICAgICAgLyogZGF0YSBkaXJlY3Rpb24gKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIG1kaXNjX3RpbWU7ICAgICAgICAgICAgIC8qIGRpc2MuIHRpbWUgKDA6IG5vIHRpbWVvdXQpKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIG1jb25fdGltZTsgICAgICAgICAgICAgIC8qIGNvbm5lY3QgdGltZSgwOiBubyB0by4pICovCisgICAgICAgICAgICB1bG9uZzY0ICAgICBzZGF0YTsgICAgICAgICAgICAgICAgICAvKiBkZXN0LiBhZGRyLiAoaWYgcy9nOiAtMSkgKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIHNkbGVuOyAgICAgICAgICAgICAgICAgIC8qIGRhdGEgbGVuZ3RoIChieXRlcykgKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIGNsZW47ICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgY21kLiBsZW5ndGgoNiwuLiwxNikgKi8KKyAgICAgICAgICAgIHVuY2hhciAgICAgIGNtZFsxNl07ICAgICAgICAgICAgICAgIC8qIFNDU0kgY29tbWFuZCAqLworICAgICAgICAgICAgdW5jaGFyICAgICAgdGFyZ2V0OyAgICAgICAgICAgICAgICAgLyogdGFyZ2V0IElEICovCisgICAgICAgICAgICB1bmNoYXIgICAgICBsdW47ICAgICAgICAgICAgICAgICAgICAvKiBMVU4gKi8KKyAgICAgICAgICAgIHVuY2hhciAgICAgIGJ1czsgICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgYnVzIG51bWJlciAqLworICAgICAgICAgICAgdW5jaGFyICAgICAgcHJpb3JpdHk7ICAgICAgICAgICAgICAgLyogb25seSAwIHVzZWQgKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIHNlbnNlX2xlbjsgICAgICAgICAgICAgIC8qIHNlbnNlIGRhdGEgbGVuZ3RoICovCisgICAgICAgICAgICB1bG9uZzY0ICAgICBzZW5zZV9kYXRhOyAgICAgICAgICAgICAvKiBzZW5zZSBkYXRhIGFkZHIuICovCisgICAgICAgICAgICB1bG9uZzMyICAgICBzZ19yYW56OyAgICAgICAgICAgICAgICAvKiBzL2cgZWxlbWVudCBjb3VudCAqLworICAgICAgICAgICAgZ2R0aF9zZzY0X3N0ciBzZ19sc3RbR0RUSF9NQVhTR107ICAgLyogcy9nIGxpc3QgKi8KKyAgICAgICAgfSBQQUNLRUQgcmF3NjQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJhdyBzZXJ2aWNlIGNtZC4gc3RydWN0LiAqLworICAgIH0gdTsKKyAgICAvKiBhZGRpdGlvbmFsIHZhcmlhYmxlcyAqLworICAgIHVuY2hhciAgICAgIFNlcnZpY2U7ICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udHJvbGxlciBzZXJ2aWNlICovCisgICAgdW5jaGFyICAgICAgcmVzZXJ2ZWQ7CisgICAgdXNob3J0ICAgICAgU3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIHJlc3VsdCAqLworICAgIHVsb25nMzIgICAgIEluZm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAqLworICAgIHZvaWQgICAgICAgICpSZXF1ZXN0QnVmZmVyOyAgICAgICAgICAgICAgICAgLyogcmVxdWVzdCBidWZmZXIgKi8KK30gUEFDS0VEIGdkdGhfY21kX3N0cjsKKworLyogY29udHJvbGxlciBldmVudCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgRVNfQVNZTkMgICAgMQorI2RlZmluZSBFU19EUklWRVIgICAyCisjZGVmaW5lIEVTX1RFU1QgICAgIDMKKyNkZWZpbmUgRVNfU1lOQyAgICAgNAordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVzaG9ydCAgICAgICAgICAgICAgICAgIHNpemU7ICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBzdHJ1Y3R1cmUgKi8KKyAgICB1bmlvbiB7CisgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgc3RyZWFtWzE2XTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVzaG9ydCAgICAgICAgICBpb25vZGU7CisgICAgICAgICAgICB1c2hvcnQgICAgICAgICAgc2VydmljZTsKKyAgICAgICAgICAgIHVsb25nMzIgICAgICAgICBpbmRleDsKKyAgICAgICAgfSBQQUNLRUQgZHJpdmVyOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdXNob3J0ICAgICAgICAgIGlvbm9kZTsKKyAgICAgICAgICAgIHVzaG9ydCAgICAgICAgICBzZXJ2aWNlOworICAgICAgICAgICAgdXNob3J0ICAgICAgICAgIHN0YXR1czsKKyAgICAgICAgICAgIHVsb25nMzIgICAgICAgICBpbmZvOworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIHNjc2lfY29vcmRbM107CisgICAgICAgIH0gUEFDS0VEIGFzeW5jOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdXNob3J0ICAgICAgICAgIGlvbm9kZTsKKyAgICAgICAgICAgIHVzaG9ydCAgICAgICAgICBzZXJ2aWNlOworICAgICAgICAgICAgdXNob3J0ICAgICAgICAgIHN0YXR1czsKKyAgICAgICAgICAgIHVsb25nMzIgICAgICAgICBpbmZvOworICAgICAgICAgICAgdXNob3J0ICAgICAgICAgIGhvc3Rkcml2ZTsKKyAgICAgICAgICAgIHVuY2hhciAgICAgICAgICBzY3NpX2Nvb3JkWzNdOworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIHNlbnNlX2tleTsKKyAgICAgICAgfSBQQUNLRUQgc3luYzsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVsb25nMzIgICAgICAgICBsMSwgbDIsIGwzLCBsNDsKKyAgICAgICAgfSBQQUNLRUQgdGVzdDsKKyAgICB9IGV1OworICAgIHVsb25nMzIgICAgICAgICAgICAgICAgIHNldmVyaXR5OworICAgIHVuY2hhciAgICAgICAgICAgICAgICAgIGV2ZW50X3N0cmluZ1syNTZdOyAgICAgICAgICAKK30gUEFDS0VEIGdkdGhfZXZ0X2RhdGE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZzMyICAgICAgICAgZmlyc3Rfc3RhbXA7CisgICAgdWxvbmczMiAgICAgICAgIGxhc3Rfc3RhbXA7CisgICAgdXNob3J0ICAgICAgICAgIHNhbWVfY291bnQ7CisgICAgdXNob3J0ICAgICAgICAgIGV2ZW50X3NvdXJjZTsKKyAgICB1c2hvcnQgICAgICAgICAgZXZlbnRfaWR4OworICAgIHVuY2hhciAgICAgICAgICBhcHBsaWNhdGlvbjsKKyAgICB1bmNoYXIgICAgICAgICAgcmVzZXJ2ZWQ7CisgICAgZ2R0aF9ldnRfZGF0YSAgIGV2ZW50X2RhdGE7Cit9IFBBQ0tFRCBnZHRoX2V2dF9zdHI7CisKKworI2lmZGVmIEdEVEhfSU9DVExfUFJPQworLyogSU9DVEwgc3RydWN0dXJlICh3cml0ZSkgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZzMyICAgICAgICAgICAgICAgICBtYWdpYzsgICAgICAgICAgICAgIC8qIElPQ1RMIG1hZ2ljICovCisgICAgdXNob3J0ICAgICAgICAgICAgICAgICAgaW9jdGw7ICAgICAgICAgICAgICAvKiBJT0NUTCAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgICAgIGlvbm9kZTsgICAgICAgICAgICAgLyogY29udHJvbGxlciBudW1iZXIgKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgICAgICBzZXJ2aWNlOyAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIgc2VydmljZSAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgICAgIHRpbWVvdXQ7ICAgICAgICAgICAgLyogdGltZW91dCAqLworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVuY2hhciAgICAgICAgICBjb21tYW5kWzUxMl07ICAgICAgIC8qIGNvbnRyb2xsZXIgY29tbWFuZCAqLworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIGRhdGFbMV07ICAgICAgICAgICAgLyogYWRkLiBkYXRhICovCisgICAgICAgIH0gZ2VuZXJhbDsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVuY2hhciAgICAgICAgICBsb2NrOyAgICAgICAgICAgICAgIC8qIGxvY2svdW5sb2NrICovCisgICAgICAgICAgICB1bmNoYXIgICAgICAgICAgZHJpdmVfY250OyAgICAgICAgICAvKiBkcml2ZSBjb3VudCAqLworICAgICAgICAgICAgdXNob3J0ICAgICAgICAgIGRyaXZlc1tNQVhfSERSSVZFU107LyogZHJpdmVzICovCisgICAgICAgIH0gbG9ja2RydjsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVuY2hhciAgICAgICAgICBsb2NrOyAgICAgICAgICAgICAgIC8qIGxvY2svdW5sb2NrICovCisgICAgICAgICAgICB1bmNoYXIgICAgICAgICAgY2hhbm5lbDsgICAgICAgICAgICAvKiBjaGFubmVsICovCisgICAgICAgIH0gbG9ja2NobjsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIGludCAgICAgICAgICAgICBlcmFzZTsgICAgICAgICAgICAgIC8qIGVyYXNlIGV2ZW50ID8gKi8KKyAgICAgICAgICAgIGludCAgICAgICAgICAgICBoYW5kbGU7CisgICAgICAgICAgICB1bmNoYXIgICAgICAgICAgZXZ0W0VWRU5UX1NJWkVdOyAgICAvKiBldmVudCBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgfSBldmVudDsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVuY2hhciAgICAgICAgICBidXM7ICAgICAgICAgICAgICAgIC8qIFNDU0kgYnVzICovCisgICAgICAgICAgICB1bmNoYXIgICAgICAgICAgdGFyZ2V0OyAgICAgICAgICAgICAvKiB0YXJnZXQgSUQgKi8KKyAgICAgICAgICAgIHVuY2hhciAgICAgICAgICBsdW47ICAgICAgICAgICAgICAgIC8qIExVTiAqLworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIGNtZF9sZW47ICAgICAgICAgICAgLyogY29tbWFuZCBsZW5ndGggKi8KKyAgICAgICAgICAgIHVuY2hhciAgICAgICAgICBjbWRbMTJdOyAgICAgICAgICAgIC8qIFNDU0kgY29tbWFuZCAqLworICAgICAgICB9IHNjc2k7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1c2hvcnQgICAgICAgICAgaGRyX25vOyAgICAgICAgICAgICAvKiBob3N0IGRyaXZlIG51bWJlciAqLworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIGZsYWc7ICAgICAgICAgICAgICAgLyogb2xkIG1ldGguL2FkZC9yZW1vdmUgKi8KKyAgICAgICAgfSByZXNjYW47CisgICAgfSBpdTsKK30gZ2R0aF9pb3dyX3N0cjsKKworLyogSU9DVEwgc3RydWN0dXJlIChyZWFkKSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVsb25nMzIgICAgICAgICAgICAgICAgIHNpemU7ICAgICAgICAgICAgICAgLyogYnVmZmVyIHNpemUgKi8KKyAgICB1bG9uZzMyICAgICAgICAgICAgICAgICBzdGF0dXM7ICAgICAgICAgICAgIC8qIElPQ1RMIGVycm9yIGNvZGUgKi8KKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1bmNoYXIgICAgICAgICAgZGF0YVsxXTsgICAgICAgICAgICAvKiBkYXRhICovCisgICAgICAgIH0gZ2VuZXJhbDsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVzaG9ydCAgICAgICAgICB2ZXJzaW9uOyAgICAgICAgICAgIC8qIGRyaXZlciB2ZXJzaW9uICovCisgICAgICAgIH0gZHJ2ZXJzOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIHR5cGU7ICAgICAgICAgICAgICAgLyogY29udHJvbGxlciB0eXBlICovCisgICAgICAgICAgICB1c2hvcnQgICAgICAgICAgaW5mbzsgICAgICAgICAgICAgICAvKiBzbG90IGV0Yy4gKi8KKyAgICAgICAgICAgIHVzaG9ydCAgICAgICAgICBvZW1faWQ7ICAgICAgICAgICAgIC8qIE9FTSBJRCAqLworICAgICAgICAgICAgdXNob3J0ICAgICAgICAgIGJpb3NfdmVyOyAgICAgICAgICAgLyogbm90IHVzZWQgKi8KKyAgICAgICAgICAgIHVzaG9ydCAgICAgICAgICBhY2Nlc3M7ICAgICAgICAgICAgIC8qIG5vdCB1c2VkICovCisgICAgICAgICAgICB1c2hvcnQgICAgICAgICAgZXh0X3R5cGU7ICAgICAgICAgICAvKiBleHRlbmRlZCB0eXBlICovCisgICAgICAgICAgICB1c2hvcnQgICAgICAgICAgZGV2aWNlX2lkOyAgICAgICAgICAvKiBkZXZpY2UgSUQgKi8KKyAgICAgICAgICAgIHVzaG9ydCAgICAgICAgICBzdWJfZGV2aWNlX2lkOyAgICAgIC8qIHN1YiBkZXZpY2UgSUQgKi8KKyAgICAgICAgfSBjdHJ0eXBlOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIHZlcnNpb247ICAgICAgICAgICAgLyogT1MgdmVyc2lvbiAqLworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIHN1YnZlcnNpb247ICAgICAgICAgLyogT1Mgc3VidmVyc2lvbiAqLworICAgICAgICAgICAgdXNob3J0ICAgICAgICAgIHJldmlzaW9uOyAgICAgICAgICAgLyogcmV2aXNpb24gKi8KKyAgICAgICAgfSBvc3ZlcnM7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1c2hvcnQgICAgICAgICAgY291bnQ7ICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIGNvdW50ICovCisgICAgICAgIH0gY3RyY250OworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGhhbmRsZTsKKyAgICAgICAgICAgIHVuY2hhciAgICAgICAgICBldnRbRVZFTlRfU0laRV07ICAgIC8qIGV2ZW50IHN0cnVjdHVyZSAqLworICAgICAgICB9IGV2ZW50OworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIGJ1czsgICAgICAgICAgICAgICAgLyogU0NTSSBidXMsIDB4ZmY6IGludmFsaWQgKi8KKyAgICAgICAgICAgIHVuY2hhciAgICAgICAgICB0YXJnZXQ7ICAgICAgICAgICAgIC8qIHRhcmdldCBJRCAqLworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIGx1bjsgICAgICAgICAgICAgICAgLyogTFVOICovCisgICAgICAgICAgICB1bmNoYXIgICAgICAgICAgY2x1c3Rlcl90eXBlOyAgICAgICAvKiBjbHVzdGVyIHByb3BlcnRpZXMgKi8KKyAgICAgICAgfSBoZHJfbGlzdFtNQVhfSERSSVZFU107ICAgICAgICAgICAgICAgIC8qIGluZGV4IGlzIGhvc3QgZHJpdmUgbnVtYmVyICovCisgICAgfSBpdTsKK30gZ2R0aF9pb3JkX3N0cjsKKyNlbmRpZgorCisvKiBHRFRJT0NUTF9HRU5FUkFMICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdXNob3J0IGlvbm9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIG51bWJlciAqLworICAgIHVzaG9ydCB0aW1lb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGltZW91dCAqLworICAgIHVsb25nMzIgaW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXJyb3IgaW5mbyAqLyAKKyAgICB1c2hvcnQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXR1cyAqLworICAgIHVsb25nIGRhdGFfbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGF0YSBidWZmZXIgc2l6ZSAqLworICAgIHVsb25nIHNlbnNlX2xlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2Vuc2UgYnVmZmVyIHNpemUgKi8KKyAgICBnZHRoX2NtZF9zdHIgY29tbWFuZDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgKi8gICAgICAgICAgICAgICAgICAgCit9IGdkdGhfaW9jdGxfZ2VuZXJhbDsKKworLyogR0RUSU9DVExfTE9DS0RSViAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVzaG9ydCBpb25vZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udHJvbGxlciBudW1iZXIgKi8KKyAgICB1bmNoYXIgbG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvY2svdW5sb2NrICovCisgICAgdW5jaGFyIGRyaXZlX2NudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkcml2ZSBjb3VudCAqLworICAgIHVzaG9ydCBkcml2ZXNbTUFYX0hEUklWRVNdOyAgICAgICAgICAgICAgICAgLyogZHJpdmVzICovCit9IGdkdGhfaW9jdGxfbG9ja2RydjsKKworLyogR0RUSU9DVExfTE9DS0NITiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVzaG9ydCBpb25vZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udHJvbGxlciBudW1iZXIgKi8KKyAgICB1bmNoYXIgbG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvY2svdW5sb2NrICovCisgICAgdW5jaGFyIGNoYW5uZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGFubmVsICovCit9IGdkdGhfaW9jdGxfbG9ja2NobjsKKworLyogR0RUSU9DVExfT1NWRVJTICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5jaGFyIHZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPUyB2ZXJzaW9uICovCisgICAgdW5jaGFyIHN1YnZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPUyBzdWJ2ZXJzaW9uICovCisgICAgdXNob3J0IHJldmlzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXZpc2lvbiAqLworfSBnZHRoX2lvY3RsX29zdmVyczsKKworLyogR0RUSU9DVExfQ1RSVFlQRSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVzaG9ydCBpb25vZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udHJvbGxlciBudW1iZXIgKi8KKyAgICB1bmNoYXIgdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIgdHlwZSAqLworICAgIHVzaG9ydCBpbmZvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2xvdCBldGMuICovCisgICAgdXNob3J0IG9lbV9pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPRU0gSUQgKi8KKyAgICB1c2hvcnQgYmlvc192ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCB1c2VkICovCisgICAgdXNob3J0IGFjY2VzczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgdXNlZCAqLworICAgIHVzaG9ydCBleHRfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0ZW5kZWQgdHlwZSAqLworICAgIHVzaG9ydCBkZXZpY2VfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGV2aWNlIElEICovCisgICAgdXNob3J0IHN1Yl9kZXZpY2VfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzdWIgZGV2aWNlIElEICovCit9IGdkdGhfaW9jdGxfY3RydHlwZTsKKworLyogR0RUSU9DVExfRVZFTlQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1c2hvcnQgaW9ub2RlOworICAgIGludCBlcmFzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXJhc2UgZXZlbnQ/ICovCisgICAgaW50IGhhbmRsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBldmVudCBoYW5kbGUgKi8KKyAgICBnZHRoX2V2dF9zdHIgZXZlbnQ7Cit9IGdkdGhfaW9jdGxfZXZlbnQ7CisKKy8qIEdEVElPQ1RMX1JFU0NBTi9HRFRJT0NUTF9IRFJMSVNUICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdXNob3J0IGlvbm9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIG51bWJlciAqLworICAgIHVuY2hhciBmbGFnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkL3JlbW92ZSAqLworICAgIHVzaG9ydCBoZHJfbm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHJpdmUgbm8uICovCisgICAgc3RydWN0IHsKKyAgICAgICAgdW5jaGFyIGJ1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgYnVzICovCisgICAgICAgIHVuY2hhciB0YXJnZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YXJnZXQgSUQgKi8KKyAgICAgICAgdW5jaGFyIGx1bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExVTiAqLworICAgICAgICB1bmNoYXIgY2x1c3Rlcl90eXBlOyAgICAgICAgICAgICAgICAgICAgLyogY2x1c3RlciBwcm9wZXJ0aWVzICovCisgICAgfSBoZHJfbGlzdFtNQVhfSERSSVZFU107ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpcyBob3N0IGRyaXZlIG51bWJlciAqLworfSBnZHRoX2lvY3RsX3Jlc2NhbjsKKworLyogR0RUSU9DVExfUkVTRVRfQlVTL0dEVElPQ1RMX1JFU0VUX0RSViAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVzaG9ydCBpb25vZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udHJvbGxlciBudW1iZXIgKi8KKyAgICB1c2hvcnQgbnVtYmVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1cy9ob3N0IGRyaXZlIG51bWJlciAqLworICAgIHVzaG9ydCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhdHVzICovCit9IGdkdGhfaW9jdGxfcmVzZXQ7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2dkdGhfa2NvbXBhdC5oIGIvZHJpdmVycy9zY3NpL2dkdGhfa2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2Y2YwZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZ2R0aF9rY29tcGF0LmgKQEAgLTAsMCArMSwyMSBAQAorCisKKyNpZm5kZWYgSVJRX0hBTkRMRUQKK3R5cGVkZWYgdm9pZCBpcnFyZXR1cm5fdDsKKyNkZWZpbmUgSVJRX05PTkUKKyNkZWZpbmUgSVJRX0hBTkRMRUQKKyNlbmRpZgorCisjaWZuZGVmIE1PRFVMRV9MSUNFTlNFCisjZGVmaW5lIE1PRFVMRV9MSUNFTlNFKHgpCisjZW5kaWYKKworI2lmbmRlZiBTRVJWSUNFX0FDVElPTl9JTgorI2RlZmluZSBTRVJWSUNFX0FDVElPTl9JTgkweDllCisjZW5kaWYKKyNpZm5kZWYgUkVBRF8xNgorI2RlZmluZSBSRUFEXzE2CQkJMHg4OAorI2VuZGlmCisjaWZuZGVmIFdSSVRFXzE2CisjZGVmaW5lIFdSSVRFXzE2CQkweDhhCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9nZHRoX3Byb2MuYyBiL2RyaXZlcnMvc2NzaS9nZHRoX3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmQwMmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2dkdGhfcHJvYy5jCkBAIC0wLDAgKzEsMTAzMCBAQAorLyogZ2R0aF9wcm9jLmMgCisgKiAkSWQ6IGdkdGhfcHJvYy5jLHYgMS40MiAyMDA0LzAzLzA1IDE1OjUwOjIwIGFjaGltIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKK2ludCBnZHRoX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjaGFyICpidWZmZXIsY2hhciAqKnN0YXJ0LG9mZl90IG9mZnNldCxpbnQgbGVuZ3RoLCAgIAorICAgICAgICAgICAgICAgICAgIGludCBpbm91dCkKK3sKKyAgICBpbnQgaGFudW0sYnVzbnVtOworCisgICAgVFJBQ0UyKCgiZ2R0aF9wcm9jX2luZm8oKSBsZW5ndGggJWQgb2ZmcyAlZCBpbm91dCAlZFxuIiwKKyAgICAgICAgICAgIGxlbmd0aCwoaW50KW9mZnNldCxpbm91dCkpOworCisgICAgaGFudW0gPSBOVU1EQVRBKGhvc3QpLT5oYW51bTsKKyAgICBidXNudW09IE5VTURBVEEoaG9zdCktPmJ1c251bTsKKworICAgIGlmIChpbm91dCkKKyAgICAgICAgcmV0dXJuKGdkdGhfc2V0X2luZm8oYnVmZmVyLGxlbmd0aCxob3N0LGhhbnVtLGJ1c251bSkpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKGdkdGhfZ2V0X2luZm8oYnVmZmVyLHN0YXJ0LG9mZnNldCxsZW5ndGgsaG9zdCxoYW51bSxidXNudW0pKTsKK30KKyNlbHNlCitpbnQgZ2R0aF9wcm9jX2luZm8oY2hhciAqYnVmZmVyLGNoYXIgKipzdGFydCxvZmZfdCBvZmZzZXQsaW50IGxlbmd0aCxpbnQgaG9zdG5vLCAgIAorICAgICAgICAgICAgICAgICAgIGludCBpbm91dCkKK3sKKyAgICBpbnQgaGFudW0sYnVzbnVtLGk7CisKKyAgICBUUkFDRTIoKCJnZHRoX3Byb2NfaW5mbygpIGxlbmd0aCAlZCBvZmZzICVkIGlub3V0ICVkXG4iLAorICAgICAgICAgICAgbGVuZ3RoLChpbnQpb2Zmc2V0LGlub3V0KSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ2R0aF9jdHJfdmNvdW50OyArK2kpIHsKKyAgICAgICAgaWYgKGdkdGhfY3RyX3Z0YWJbaV0tPmhvc3Rfbm8gPT0gaG9zdG5vKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpID09IGdkdGhfY3RyX3Zjb3VudCkKKyAgICAgICAgcmV0dXJuKC1FSU5WQUwpOworCisgICAgaGFudW0gPSBOVU1EQVRBKGdkdGhfY3RyX3Z0YWJbaV0pLT5oYW51bTsKKyAgICBidXNudW09IE5VTURBVEEoZ2R0aF9jdHJfdnRhYltpXSktPmJ1c251bTsKKworICAgIGlmIChpbm91dCkKKyAgICAgICAgcmV0dXJuKGdkdGhfc2V0X2luZm8oYnVmZmVyLGxlbmd0aCxnZHRoX2N0cl92dGFiW2ldLGhhbnVtLGJ1c251bSkpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKGdkdGhfZ2V0X2luZm8oYnVmZmVyLHN0YXJ0LG9mZnNldCxsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkdGhfY3RyX3Z0YWJbaV0saGFudW0sYnVzbnVtKSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBnZHRoX3NldF9pbmZvKGNoYXIgKmJ1ZmZlcixpbnQgbGVuZ3RoLHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhbnVtLGludCBidXNudW0pCit7CisgICAgaW50ICAgICAgICAgICAgIHJldF92YWwgPSAtRUlOVkFMOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICBTY3NpX1JlcXVlc3QgICAgKnNjcDsKKyAgICBTY3NpX0RldmljZSAgICAgKnNkZXY7CisjZWxzZQorICAgIFNjc2lfQ21uZCAgICAgICAqc2NwOworICAgIFNjc2lfRGV2aWNlICAgICAqc2RldjsKKyNlbmRpZgorICAgIFRSQUNFMigoImdkdGhfc2V0X2luZm8oKSBoYSAlZCBidXMgJWRcbiIsaGFudW0sYnVzbnVtKSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgc2RldiA9IHNjc2lfZ2V0X2hvc3RfZGV2KGhvc3QpOworICAgIHNjcCAgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc2RldiwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFzY3ApCisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIHNjcC0+c3JfY21kX2xlbiA9IDEyOworICAgIHNjcC0+c3JfdXNlX3NnID0gMDsKKyNlbHNlCisgICAgc2RldiA9IHNjc2lfZ2V0X2hvc3RfZGV2KGhvc3QpOworICAgIHNjcCAgPSBzY3NpX2FsbG9jYXRlX2RldmljZShzZGV2LCAxLCBGQUxTRSk7CisgICAgaWYgKCFzY3ApCisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIHNjcC0+Y21kX2xlbiA9IDEyOworICAgIHNjcC0+dXNlX3NnID0gMDsKKyNlbmRpZgorCisgICAgaWYgKGxlbmd0aCA+PSA0KSB7CisgICAgICAgIGlmIChzdHJuY21wKGJ1ZmZlciwiZ2R0aCIsNCkgPT0gMCkgeworICAgICAgICAgICAgYnVmZmVyICs9IDU7CisgICAgICAgICAgICBsZW5ndGggLT0gNTsKKyAgICAgICAgICAgIHJldF92YWwgPSBnZHRoX3NldF9hc2NfaW5mbyggYnVmZmVyLCBsZW5ndGgsIGhhbnVtLCBzY3AgKTsKKyAgICAgICAgfQorICAgIH0KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc2NwKTsKKyAgICBzY3NpX2ZyZWVfaG9zdF9kZXYoc2Rldik7CisjZWxzZQorICAgIHNjc2lfcmVsZWFzZV9jb21tYW5kKHNjcCk7CisgICAgc2NzaV9mcmVlX2hvc3RfZGV2KHNkZXYpOworI2VuZGlmCisgICAgcmV0dXJuIHJldF92YWw7Cit9CisgICAgICAgICAKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCitzdGF0aWMgaW50IGdkdGhfc2V0X2FzY19pbmZvKGNoYXIgKmJ1ZmZlcixpbnQgbGVuZ3RoLGludCBoYW51bSxTY3NpX1JlcXVlc3QgKnNjcCkKKyNlbHNlCitzdGF0aWMgaW50IGdkdGhfc2V0X2FzY19pbmZvKGNoYXIgKmJ1ZmZlcixpbnQgbGVuZ3RoLGludCBoYW51bSxTY3NpX0NtbmQgKnNjcCkKKyNlbmRpZgoreworICAgIGludCAgICAgICAgICAgICBvcmlnX2xlbmd0aCwgZHJpdmUsIHdiX21vZGU7CisgICAgaW50ICAgICAgICAgICAgIGksIGZvdW5kOworICAgIGdkdGhfaGFfc3RyICAgICAqaGE7CisgICAgZ2R0aF9jbWRfc3RyICAgIGdkdGNtZDsKKyAgICBnZHRoX2NwYXJfc3RyICAgKnBjcGFyOworICAgIHVsb25nNjQgICAgICAgICBwYWRkcjsKKworICAgIGNoYXIgICAgICAgICAgICBjbW5kW01BWF9DT01NQU5EX1NJWkVdOworICAgIG1lbXNldChjbW5kLCAweGZmLCAxMik7CisgICAgbWVtc2V0KCZnZHRjbWQsIDAsIHNpemVvZihnZHRoX2NtZF9zdHIpKTsKKworICAgIFRSQUNFMigoImdkdGhfc2V0X2FzY19pbmZvKCkgaGEgJWRcbiIsaGFudW0pKTsKKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICBvcmlnX2xlbmd0aCA9IGxlbmd0aCArIDU7CisgICAgZHJpdmUgPSAtMTsKKyAgICB3Yl9tb2RlID0gMDsKKyAgICBmb3VuZCA9IEZBTFNFOworCisgICAgaWYgKGxlbmd0aCA+PSA1ICYmIHN0cm5jbXAoYnVmZmVyLCJmbHVzaCIsNSk9PTApIHsKKyAgICAgICAgYnVmZmVyICs9IDY7CisgICAgICAgIGxlbmd0aCAtPSA2OworICAgICAgICBpZiAobGVuZ3RoICYmICpidWZmZXI+PScwJyAmJiAqYnVmZmVyPD0nOScpIHsKKyAgICAgICAgICAgIGRyaXZlID0gKGludCkoKmJ1ZmZlci0nMCcpOworICAgICAgICAgICAgKytidWZmZXI7IC0tbGVuZ3RoOworICAgICAgICAgICAgaWYgKGxlbmd0aCAmJiAqYnVmZmVyPj0nMCcgJiYgKmJ1ZmZlcjw9JzknKSB7CisgICAgICAgICAgICAgICAgZHJpdmUgPSBkcml2ZSoxMCArIChpbnQpKCpidWZmZXItJzAnKTsKKyAgICAgICAgICAgICAgICArK2J1ZmZlcjsgLS1sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGsoIkdEVDogRmx1c2hpbmcgaG9zdCBkcml2ZSAlZCAuLiAiLGRyaXZlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50aygiR0RUOiBGbHVzaGluZyBhbGwgaG9zdCBkcml2ZXMgLi4gIik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9IRFJJVkVTOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChoYS0+aGRyW2ldLnByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZHJpdmUgIT0gLTEgJiYgaSAhPSBkcml2ZSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgICAgICAgIGdkdGNtZC5TZXJ2aWNlID0gQ0FDSEVTRVJWSUNFOworICAgICAgICAgICAgICAgIGdkdGNtZC5PcENvZGUgPSBHRFRfRkxVU0g7CisgICAgICAgICAgICAgICAgaWYgKGhhLT5jYWNoZV9mZWF0ICYgR0RUXzY0QklUKSB7CisgICAgICAgICAgICAgICAgICAgIGdkdGNtZC51LmNhY2hlNjQuRGV2aWNlTm8gPSBpOworICAgICAgICAgICAgICAgICAgICBnZHRjbWQudS5jYWNoZTY0LkJsb2NrTm8gPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdkdGNtZC51LmNhY2hlLkRldmljZU5vID0gaTsKKyAgICAgICAgICAgICAgICAgICAgZ2R0Y21kLnUuY2FjaGUuQmxvY2tObyA9IDE7CisgICAgICAgICAgICAgICAgfQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgICAgICAgICBnZHRoX2RvX3JlcShzY3AsICZnZHRjbWQsIGNtbmQsIDMwKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgZ2R0aF9kb19jbWQoc2NwLCAmZ2R0Y21kLCBjbW5kLCAzMCk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKQorICAgICAgICAgICAgcHJpbnRrKCJcbk5vIGhvc3QgZHJpdmUgZm91bmQgIVxuIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50aygiRG9uZS5cbiIpOworICAgICAgICByZXR1cm4ob3JpZ19sZW5ndGgpOworICAgIH0KKworICAgIGlmIChsZW5ndGggPj0gNyAmJiBzdHJuY21wKGJ1ZmZlciwid2JwX29mZiIsNyk9PTApIHsKKyAgICAgICAgYnVmZmVyICs9IDg7CisgICAgICAgIGxlbmd0aCAtPSA4OworICAgICAgICBwcmludGsoIkdEVDogRGlzYWJsaW5nIHdyaXRlIGJhY2sgcGVybWFuZW50bHkgLi4gIik7CisgICAgICAgIHdiX21vZGUgPSAxOworICAgIH0gZWxzZSBpZiAobGVuZ3RoID49IDYgJiYgc3RybmNtcChidWZmZXIsIndicF9vbiIsNik9PTApIHsKKyAgICAgICAgYnVmZmVyICs9IDc7CisgICAgICAgIGxlbmd0aCAtPSA3OworICAgICAgICBwcmludGsoIkdEVDogRW5hYmxpbmcgd3JpdGUgYmFjayBwZXJtYW5lbnRseSAuLiAiKTsKKyAgICAgICAgd2JfbW9kZSA9IDI7CisgICAgfSBlbHNlIGlmIChsZW5ndGggPj0gNiAmJiBzdHJuY21wKGJ1ZmZlciwid2Jfb2ZmIiw2KT09MCkgeworICAgICAgICBidWZmZXIgKz0gNzsKKyAgICAgICAgbGVuZ3RoIC09IDc7CisgICAgICAgIHByaW50aygiR0RUOiBEaXNhYmxpbmcgd3JpdGUgYmFjayBjb21tYW5kcyAuLiAiKTsKKyAgICAgICAgaWYgKGhhLT5jYWNoZV9mZWF0ICYgR0RUX1dSX1RIUk9VR0gpIHsKKyAgICAgICAgICAgIGdkdGhfd3JpdGVfdGhyb3VnaCA9IFRSVUU7CisgICAgICAgICAgICBwcmludGsoIkRvbmUuXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50aygiTm90IHN1cHBvcnRlZCAhXG4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4ob3JpZ19sZW5ndGgpOworICAgIH0gZWxzZSBpZiAobGVuZ3RoID49IDUgJiYgc3RybmNtcChidWZmZXIsIndiX29uIiw1KT09MCkgeworICAgICAgICBidWZmZXIgKz0gNjsKKyAgICAgICAgbGVuZ3RoIC09IDY7CisgICAgICAgIHByaW50aygiR0RUOiBFbmFibGluZyB3cml0ZSBiYWNrIGNvbW1hbmRzIC4uICIpOworICAgICAgICBnZHRoX3dyaXRlX3Rocm91Z2ggPSBGQUxTRTsKKyAgICAgICAgcHJpbnRrKCJEb25lLlxuIik7CisgICAgICAgIHJldHVybihvcmlnX2xlbmd0aCk7CisgICAgfQorCisgICAgaWYgKHdiX21vZGUpIHsKKyAgICAgICAgaWYgKCFnZHRoX2lvY3RsX2FsbG9jKGhhbnVtLCBzaXplb2YoZ2R0aF9jcGFyX3N0ciksIFRSVUUsICZwYWRkcikpCisgICAgICAgICAgICByZXR1cm4oLUVCVVNZKTsKKyAgICAgICAgcGNwYXIgPSAoZ2R0aF9jcGFyX3N0ciAqKWhhLT5wc2NyYXRjaDsKKyAgICAgICAgbWVtY3B5KCBwY3BhciwgJmhhLT5jcGFyLCBzaXplb2YoZ2R0aF9jcGFyX3N0cikgKTsKKyAgICAgICAgZ2R0Y21kLlNlcnZpY2UgPSBDQUNIRVNFUlZJQ0U7CisgICAgICAgIGdkdGNtZC5PcENvZGUgPSBHRFRfSU9DVEw7CisgICAgICAgIGdkdGNtZC51LmlvY3RsLnBfcGFyYW0gPSBwYWRkcjsKKyAgICAgICAgZ2R0Y21kLnUuaW9jdGwucGFyYW1fc2l6ZSA9IHNpemVvZihnZHRoX2NwYXJfc3RyKTsKKyAgICAgICAgZ2R0Y21kLnUuaW9jdGwuc3ViZnVuYyA9IENBQ0hFX0NPTkZJRzsKKyAgICAgICAgZ2R0Y21kLnUuaW9jdGwuY2hhbm5lbCA9IElOVkFMSURfQ0hBTk5FTDsKKyAgICAgICAgcGNwYXItPndyaXRlX2JhY2sgPSB3Yl9tb2RlPT0xID8gMDoxOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgZ2R0aF9kb19yZXEoc2NwLCAmZ2R0Y21kLCBjbW5kLCAzMCk7CisjZWxzZQorICAgICAgICBnZHRoX2RvX2NtZChzY3AsICZnZHRjbWQsIGNtbmQsIDMwKTsKKyNlbmRpZgorICAgICAgICBnZHRoX2lvY3RsX2ZyZWUoaGFudW0sIEdEVEhfU0NSQVRDSCwgaGEtPnBzY3JhdGNoLCBwYWRkcik7CisgICAgICAgIHByaW50aygiRG9uZS5cbiIpOworICAgICAgICByZXR1cm4ob3JpZ19sZW5ndGgpOworICAgIH0KKworICAgIHByaW50aygiR0RUOiBVbmtub3duIGNvbW1hbmQ6ICVzICBMZW5ndGg6ICVkXG4iLGJ1ZmZlcixsZW5ndGgpOworICAgIHJldHVybigtRUlOVkFMKTsKK30KKworc3RhdGljIGludCBnZHRoX2dldF9pbmZvKGNoYXIgKmJ1ZmZlcixjaGFyICoqc3RhcnQsb2ZmX3Qgb2Zmc2V0LGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFNjc2lfSG9zdCAqaG9zdCxpbnQgaGFudW0saW50IGJ1c251bSkKK3sKKyAgICBpbnQgc2l6ZSA9IDAsbGVuID0gMDsKKyAgICBvZmZfdCBiZWdpbiA9IDAscG9zID0gMDsKKyAgICBnZHRoX2hhX3N0ciAqaGE7CisgICAgaW50IGlkLCBpLCBqLCBrLCBzZWMsIGZsYWc7CisgICAgaW50IG5vX21kcnYgPSAwLCBkcnZfbm8sIGlzX21pcnI7CisgICAgdWxvbmczMiBjbnQ7CisgICAgdWxvbmc2NCBwYWRkcjsKKyAgICBpbnQgcmMgPSAtRU5PTUVNOworCisgICAgZ2R0aF9jbWRfc3RyICpnZHRjbWQ7CisgICAgZ2R0aF9ldnRfc3RyICplc3RyOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICBTY3NpX1JlcXVlc3QgKnNjcDsKKyAgICBTY3NpX0RldmljZSAqc2RldjsgCisjZWxzZQorICAgIFNjc2lfQ21uZCAqc2NwOworICAgIFNjc2lfRGV2aWNlICpzZGV2OworI2VuZGlmCisgICAgY2hhciBocmVjWzE2MV07CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisKKyAgICBjaGFyICpidWY7CisgICAgZ2R0aF9kc2tzdGF0X3N0ciAqcGRzOworICAgIGdkdGhfZGlza2luZm9fc3RyICpwZGk7CisgICAgZ2R0aF9hcnJheWluZl9zdHIgKnBhaTsKKyAgICBnZHRoX2RlZmNudF9zdHIgKnBkZWY7CisgICAgZ2R0aF9jZHJpbmZvX3N0ciAqcGNkaTsKKyAgICBnZHRoX2hnZXRfc3RyICpwaGc7CisgICAgY2hhciBjbW5kW01BWF9DT01NQU5EX1NJWkVdOworCisgICAgZ2R0Y21kID0ga21hbGxvYyhzaXplb2YoKmdkdGNtZCksIEdGUF9LRVJORUwpOworICAgIGVzdHIgPSBrbWFsbG9jKHNpemVvZigqZXN0ciksIEdGUF9LRVJORUwpOworICAgIGlmICghZ2R0Y21kIHx8ICFlc3RyKQorCWdvdG8gZnJlZV9mYWlsOworCisgICAgbWVtc2V0KGNtbmQsIDB4ZmYsIDEyKTsKKyAgICBtZW1zZXQoZ2R0Y21kLCAwLCBzaXplb2YoZ2R0aF9jbWRfc3RyKSk7CisKKyAgICBUUkFDRTIoKCJnZHRoX2dldF9pbmZvKCkgaGEgJWQgYnVzICVkXG4iLGhhbnVtLGJ1c251bSkpOworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgIHNkZXYgPSBzY3NpX2dldF9ob3N0X2Rldihob3N0KTsKKyAgICBzY3AgID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KHNkZXYsIEdGUF9LRVJORUwpOworICAgIGlmICghc2NwKQorICAgICAgICBnb3RvIGZyZWVfZmFpbDsKKyAgICBzY3AtPnNyX2NtZF9sZW4gPSAxMjsKKyAgICBzY3AtPnNyX3VzZV9zZyA9IDA7CisjZWxpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDApCisgICAgc2RldiA9IHNjc2lfZ2V0X2hvc3RfZGV2KGhvc3QpOworICAgIHNjcCAgPSBzY3NpX2FsbG9jYXRlX2RldmljZShzZGV2LCAxLCBGQUxTRSk7CisgICAgaWYgKCFzY3ApCisgICAgICAgIGdvdG8gZnJlZV9mYWlsOworICAgIHNjcC0+Y21kX2xlbiA9IDEyOworICAgIHNjcC0+dXNlX3NnID0gMDsKKyNlbHNlCisgICAgbWVtc2V0KCZzZGV2LDAsc2l6ZW9mKFNjc2lfRGV2aWNlKSk7CisgICAgbWVtc2V0KCZzY3AsIDAsc2l6ZW9mKFNjc2lfQ21uZCkpOworICAgIHNkZXYuaG9zdCA9IHNjcC5ob3N0ID0gaG9zdDsKKyAgICBzZGV2LmlkID0gc2NwLnRhcmdldCA9IHNkZXYuaG9zdC0+dGhpc19pZDsKKyAgICBzY3AuZGV2aWNlID0gJnNkZXY7CisjZW5kaWYKKyAgICAKKyAgICAKKyAgICAvKiByZXF1ZXN0IGlzIGkuZS4gImNhdCAvcHJvYy9zY3NpL2dkdGgvMCIgKi8gCisgICAgLyogZm9ybWF0OiAlLTE1c1x0JS0xMHNcdCUtMTVzXHQlcyAqLworICAgIC8qIGRyaXZlciBwYXJhbWV0ZXJzICovCisgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwiRHJpdmVyIFBhcmFtZXRlcnM6XG4iKTsKKyAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworICAgIGlmIChyZXNlcnZlX2xpc3RbMF0gPT0gMHhmZikKKyAgICAgICAgc3RyY3B5KGhyZWMsICItLSIpOworICAgIGVsc2UgeworICAgICAgICBzcHJpbnRmKGhyZWMsICIlZCIsIHJlc2VydmVfbGlzdFswXSk7CisgICAgICAgIGZvciAoaSA9IDE7ICBpIDwgTUFYX1JFU19BUkdTOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChyZXNlcnZlX2xpc3RbaV0gPT0gMHhmZikgCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBzcHJpbnRmKGhyZWMsIiVzLCVkIiwgaHJlYywgcmVzZXJ2ZV9saXN0W2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLAorICAgICAgICAgICAgICAgICAgICIgcmVzZXJ2ZV9tb2RlOiBcdCVkICAgICAgICAgXHRyZXNlcnZlX2xpc3Q6ICBcdCVzXG4iLAorICAgICAgICAgICAgICAgICAgIHJlc2VydmVfbW9kZSwgaHJlYyk7CisgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLAorICAgICAgICAgICAgICAgICAgICIgbWF4X2lkczogICAgICBcdCUtM2QgICAgICAgXHRoZHJfY2hhbm5lbDogICBcdCVkXG4iLAorICAgICAgICAgICAgICAgICAgIG1heF9pZHMsIGhkcl9jaGFubmVsKTsKKyAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworCisgICAgLyogY29udHJvbGxlciBpbmZvcm1hdGlvbiAqLworICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sIlxuRGlzayBBcnJheSBDb250cm9sbGVyIEluZm9ybWF0aW9uOlxuIik7CisgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICBpZiAodmlydF9jdHIpCisgICAgICAgIHNwcmludGYoaHJlYywgIiVzIChCdXMgJWQpIiwgaGEtPmJpbmZvLnR5cGVfc3RyaW5nLCBidXNudW0pOworICAgIGVsc2UKKyAgICAgICAgc3RyY3B5KGhyZWMsIGhhLT5iaW5mby50eXBlX3N0cmluZyk7CisgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwKKyAgICAgICAgICAgICAgICAgICAiIE51bWJlcjogICAgICAgXHQlZCAgICAgICAgIFx0TmFtZTogICAgICAgICAgXHQlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBoYW51bSwgaHJlYyk7CisgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKworICAgIGlmIChoYS0+bW9yZV9wcm9jKQorICAgICAgICBzcHJpbnRmKGhyZWMsICIlZC4lMDJkLiUwMmQtJWMlMDNYIiwgCisgICAgICAgICAgICAgICAgKHVuY2hhcikoaGEtPmJpbmZvLnVwZF9md192ZXI+PjI0KSwKKyAgICAgICAgICAgICAgICAodW5jaGFyKShoYS0+YmluZm8udXBkX2Z3X3Zlcj4+MTYpLAorICAgICAgICAgICAgICAgICh1bmNoYXIpKGhhLT5iaW5mby51cGRfZndfdmVyKSwKKyAgICAgICAgICAgICAgICBoYS0+YmZlYXQucmFpZCA/ICdSJzonTicsCisgICAgICAgICAgICAgICAgaGEtPmJpbmZvLnVwZF9yZXZpc2lvbik7CisgICAgZWxzZQorICAgICAgICBzcHJpbnRmKGhyZWMsICIlZC4lMDJkIiwgKHVuY2hhcikoaGEtPmNwYXIudmVyc2lvbj4+OCksCisgICAgICAgICAgICAgICAgKHVuY2hhcikoaGEtPmNwYXIudmVyc2lvbikpOworCisgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwKKyAgICAgICAgICAgICAgICAgICAiIERyaXZlciBWZXIuOiAgXHQlLTEwc1x0RmlybXdhcmUgVmVyLjogXHQlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBHRFRIX1ZFUlNJT05fU1RSLCBocmVjKTsKKyAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworIAorICAgIGlmIChoYS0+bW9yZV9wcm9jKSB7CisgICAgICAgIC8qIG1vcmUgaW5mb3JtYXRpb246IDEuIGFib3V0IGNvbnRyb2xsZXIgKi8KKyAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiBTZXJpYWwgTm8uOiAgIFx0MHglOFhcdENhY2hlIFJBTSBzaXplOlx0JWQgS0JcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGhhLT5iaW5mby5zZXJfbm8sIGhhLT5iaW5mby5tZW1zaXplIC8gMTAyNCk7CisgICAgICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgfQorCisjaWZkZWYgR0RUSF9ETUFfU1RBVElTVElDUworICAgIC8qIGNvbnRyb2xsZXIgc3RhdGlzdGljcyAqLworICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sIlxuQ29udHJvbGxlciBTdGF0aXN0aWNzOlxuIik7CisgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLAorICAgICAgICAgICAgICAgICAgICIgMzItYml0IERNQSBidWZmZXI6XHQlbHVcdDY0LWJpdCBETUEgYnVmZmVyOlx0JWx1XG4iLAorICAgICAgICAgICAgICAgICAgIGhhLT5kbWEzMl9jbnQsIGhhLT5kbWE2NF9jbnQpOworICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisjZW5kaWYKKworICAgIGlmIChwb3MgPCBvZmZzZXQpIHsKKyAgICAgICAgbGVuID0gMDsKKyAgICAgICAgYmVnaW4gPSBwb3M7CisgICAgfQorICAgIGlmIChwb3MgPiBvZmZzZXQgKyBsZW5ndGgpCisgICAgICAgIGdvdG8gc3RvcF9vdXRwdXQ7CisKKyAgICBpZiAoaGEtPm1vcmVfcHJvYykgeworICAgICAgICAvKiBtb3JlIGluZm9ybWF0aW9uOiAyLiBhYm91dCBwaHlzaWNhbCBkZXZpY2VzICovCisgICAgICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sIlxuUGh5c2ljYWwgRGV2aWNlczoiKTsKKyAgICAgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICAgICAgZmxhZyA9IEZBTFNFOworICAgICAgICAgICAgCisgICAgICAgIGJ1ZiA9IGdkdGhfaW9jdGxfYWxsb2MoaGFudW0sIEdEVEhfU0NSQVRDSCwgRkFMU0UsICZwYWRkcik7CisgICAgICAgIGlmICghYnVmKSAKKyAgICAgICAgICAgIGdvdG8gc3RvcF9vdXRwdXQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoYS0+YnVzX2NudDsgKytpKSB7CisgICAgICAgICAgICAvKiAyLmEgc3RhdGlzdGljcyAoYW5kIHJldHJpZXMvcmVhc3NpZ25zKSAqLworICAgICAgICAgICAgVFJBQ0UyKCgicGRyX3N0YXRpc3RpY3MoKSBjaG4gJWRcbiIsaSkpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHBkcyA9IChnZHRoX2Rza3N0YXRfc3RyICopKGJ1ZiArIEdEVEhfU0NSQVRDSC80KTsKKyAgICAgICAgICAgIGdkdGNtZC0+U2VydmljZSA9IENBQ0hFU0VSVklDRTsKKyAgICAgICAgICAgIGdkdGNtZC0+T3BDb2RlID0gR0RUX0lPQ1RMOworICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLnBfcGFyYW0gPSBwYWRkciArIEdEVEhfU0NSQVRDSC80OworICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLnBhcmFtX3NpemUgPSAzKkdEVEhfU0NSQVRDSC80OworICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLnN1YmZ1bmMgPSBEU0tfU1RBVElTVElDUyB8IExfQ1RSTF9QQVRURVJOOworICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLmNoYW5uZWwgPSBoYS0+cmF3W2ldLmFkZHJlc3MgfCBJTlZBTElEX0NIQU5ORUw7CisgICAgICAgICAgICBwZHMtPmJpZCA9IGhhLT5yYXdbaV0ubG9jYWxfbm87CisgICAgICAgICAgICBwZHMtPmZpcnN0ID0gMDsKKyAgICAgICAgICAgIHBkcy0+ZW50cmllcyA9IGhhLT5yYXdbaV0ucGRldl9jbnQ7CisgICAgICAgICAgICBjbnQgPSAoMypHRFRIX1NDUkFUQ0gvNCAtIDUgKiBzaXplb2YodWxvbmczMikpIC8KKyAgICAgICAgICAgICAgICBzaXplb2YocGRzLT5saXN0WzBdKTsKKyAgICAgICAgICAgIGlmIChwZHMtPmVudHJpZXMgPiBjbnQpCisgICAgICAgICAgICAgICAgcGRzLT5lbnRyaWVzID0gY250OworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgICAgIGdkdGhfZG9fcmVxKHNjcCwgZ2R0Y21kLCBjbW5kLCAzMCk7CisgICAgICAgICAgICBpZiAoc2NwLT5zcl9jb21tYW5kLT5TQ3AuU3RhdHVzICE9IFNfT0spIAorI2Vsc2UKKyAgICAgICAgICAgIGdkdGhfZG9fY21kKHNjcCwgZ2R0Y21kLCBjbW5kLCAzMCk7CisgICAgICAgICAgICBpZiAoc2NwLT5TQ3AuU3RhdHVzICE9IFNfT0spIAorI2VuZGlmCisgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgIHBkcy0+Y291bnQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBvdGhlciBJT0NUTHMgbXVzdCBmaXQgaW50byBhcmVhIEdEVEhfU0NSQVRDSC80ICovCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaGEtPnJhd1tpXS5wZGV2X2NudDsgKytqKSB7CisgICAgICAgICAgICAgICAgLyogMi5iIGRyaXZlIGluZm8gKi8KKyAgICAgICAgICAgICAgICBUUkFDRTIoKCJzY3NpX2Rydl9pbmZvKCkgY2huICVkIGRldiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgaSwgaGEtPnJhd1tpXS5pZF9saXN0W2pdKSk7ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBkaSA9IChnZHRoX2Rpc2tpbmZvX3N0ciAqKWJ1ZjsKKyAgICAgICAgICAgICAgICBnZHRjbWQtPlNlcnZpY2UgPSBDQUNIRVNFUlZJQ0U7CisgICAgICAgICAgICAgICAgZ2R0Y21kLT5PcENvZGUgPSBHRFRfSU9DVEw7CisgICAgICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLnBfcGFyYW0gPSBwYWRkcjsKKyAgICAgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwucGFyYW1fc2l6ZSA9IHNpemVvZihnZHRoX2Rpc2tpbmZvX3N0cik7CisgICAgICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLnN1YmZ1bmMgPSBTQ1NJX0RSX0lORk8gfCBMX0NUUkxfUEFUVEVSTjsKKyAgICAgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwuY2hhbm5lbCA9IAorICAgICAgICAgICAgICAgICAgICBoYS0+cmF3W2ldLmFkZHJlc3MgfCBoYS0+cmF3W2ldLmlkX2xpc3Rbal07CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgICAgICAgICAgICAgIGdkdGhfZG9fcmVxKHNjcCwgZ2R0Y21kLCBjbW5kLCAzMCk7CisgICAgICAgICAgICAgICAgaWYgKHNjcC0+c3JfY29tbWFuZC0+U0NwLlN0YXR1cyA9PSBTX09LKSAKKyNlbHNlCisgICAgICAgICAgICAgICAgZ2R0aF9kb19jbWQoc2NwLCBnZHRjbWQsIGNtbmQsIDMwKTsKKyAgICAgICAgICAgICAgICBpZiAoc2NwLT5TQ3AuU3RhdHVzID09IFNfT0spIAorI2VuZGlmCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KGhyZWMscGRpLT52ZW5kb3IsOCk7CisgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkoaHJlYys4LHBkaS0+cHJvZHVjdCwxNik7CisgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkoaHJlYysyNCxwZGktPnJldmlzaW9uLDQpOworICAgICAgICAgICAgICAgICAgICBocmVjWzI4XSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiBDaG4vSUQvTFVOOiAgIFx0JWMvJTAyZC8lZCAgICBcdE5hbWU6ICAgICAgICAgIFx0JXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJytpLHBkaS0+dGFyZ2V0X2lkLHBkaS0+bHVuLGhyZWMpOworICAgICAgICAgICAgICAgICAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworICAgICAgICAgICAgICAgICAgICBmbGFnID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcGRpLT5ub19sZHJpdmUgJj0gMHhmZmZmOworICAgICAgICAgICAgICAgICAgICBpZiAocGRpLT5ub19sZHJpdmUgPT0gMHhmZmZmKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGhyZWMsIi0tIik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoaHJlYywiJWQiLHBkaS0+bm9fbGRyaXZlKTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBDYXBhY2l0eSBbTUJdOlx0JS02ZCAgICBcdFRvIExvZy4gRHJpdmU6IFx0JXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkaS0+YmxrY250LygxMDI0KjEwMjQvcGRpLT5ibGtzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlYyk7CisgICAgICAgICAgICAgICAgICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGRpLT5kZXZ0eXBlID0gMHhmZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChwZGktPmRldnR5cGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBzZWFyY2ggcmV0cmllcy9yZWFzc2lnbnMgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHBkcy0+Y291bnQ7ICsraykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBkcy0+bGlzdFtrXS50aWQgPT0gcGRpLT50YXJnZXRfaWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHMtPmxpc3Rba10ubHVuID09IHBkaS0+bHVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFJldHJpZXM6ICAgICAgXHQlLTZkICAgIFx0UmVhc3NpZ25zOiAgICAgXHQlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHMtPmxpc3Rba10ucmV0cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHMtPmxpc3Rba10ucmVhc3NpZ25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIDIuYyBncm93biBkZWZlY3RzICovCisgICAgICAgICAgICAgICAgICAgIFRSQUNFMigoInNjc2lfZHJ2X2RlZmNudCgpIGNobiAlZCBkZXYgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgaGEtPnJhd1tpXS5pZF9saXN0W2pdKSk7ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBwZGVmID0gKGdkdGhfZGVmY250X3N0ciAqKWJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgZ2R0Y21kLT5TZXJ2aWNlID0gQ0FDSEVTRVJWSUNFOworICAgICAgICAgICAgICAgICAgICBnZHRjbWQtPk9wQ29kZSA9IEdEVF9JT0NUTDsKKyAgICAgICAgICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLnBfcGFyYW0gPSBwYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLnBhcmFtX3NpemUgPSBzaXplb2YoZ2R0aF9kZWZjbnRfc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLnN1YmZ1bmMgPSBTQ1NJX0RFRl9DTlQgfCBMX0NUUkxfUEFUVEVSTjsKKyAgICAgICAgICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLmNoYW5uZWwgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5yYXdbaV0uYWRkcmVzcyB8IGhhLT5yYXdbaV0uaWRfbGlzdFtqXTsKKyAgICAgICAgICAgICAgICAgICAgcGRlZi0+c2RkY190eXBlID0gMHgwODsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgICAgICAgICAgICAgICAgIGdkdGhfZG9fcmVxKHNjcCwgZ2R0Y21kLCBjbW5kLCAzMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzY3AtPnNyX2NvbW1hbmQtPlNDcC5TdGF0dXMgPT0gU19PSykgCisjZWxzZQorICAgICAgICAgICAgICAgICAgICBnZHRoX2RvX2NtZChzY3AsIGdkdGNtZCwgY21uZCwgMzApOworICAgICAgICAgICAgICAgICAgICBpZiAoc2NwLT5TQ3AuU3RhdHVzID09IFNfT0spIAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEdyb3duIERlZmVjdHM6XHQlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZWYtPnNkZGNfY250KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBvcyA8IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IHBvczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBvcyA+IG9mZnNldCArIGxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBzdG9wX291dHB1dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBnZHRoX2lvY3RsX2ZyZWUoaGFudW0sIEdEVEhfU0NSQVRDSCwgYnVmLCBwYWRkcik7CisKKyAgICAgICAgaWYgKCFmbGFnKSB7CisgICAgICAgICAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLCAiXG4gLS1cbiIpOworICAgICAgICAgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIDMuIGFib3V0IGxvZ2ljYWwgZHJpdmVzICovCisgICAgICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sIlxuTG9naWNhbCBEcml2ZXM6Iik7CisgICAgICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgICAgIGZsYWcgPSBGQUxTRTsKKworICAgICAgICBidWYgPSBnZHRoX2lvY3RsX2FsbG9jKGhhbnVtLCBHRFRIX1NDUkFUQ0gsIEZBTFNFLCAmcGFkZHIpOworICAgICAgICBpZiAoIWJ1ZikgCisgICAgICAgICAgICBnb3RvIHN0b3Bfb3V0cHV0OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0xEUklWRVM7ICsraSkgeworICAgICAgICAgICAgaWYgKCFoYS0+aGRyW2ldLmlzX2xvZ2RydikKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGRydl9ubyA9IGk7CisgICAgICAgICAgICBqID0gayA9IDA7CisgICAgICAgICAgICBpc19taXJyID0gRkFMU0U7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgLyogMy5hIGxvZy4gZHJpdmUgaW5mbyAqLworICAgICAgICAgICAgICAgIFRSQUNFMigoImNhY2hlX2Rydl9pbmZvKCkgZHJpdmUgbm8gJWRcbiIsZHJ2X25vKSk7CisgICAgICAgICAgICAgICAgcGNkaSA9IChnZHRoX2NkcmluZm9fc3RyICopYnVmOworICAgICAgICAgICAgICAgIGdkdGNtZC0+U2VydmljZSA9IENBQ0hFU0VSVklDRTsKKyAgICAgICAgICAgICAgICBnZHRjbWQtPk9wQ29kZSA9IEdEVF9JT0NUTDsKKyAgICAgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwucF9wYXJhbSA9IHBhZGRyOworICAgICAgICAgICAgICAgIGdkdGNtZC0+dS5pb2N0bC5wYXJhbV9zaXplID0gc2l6ZW9mKGdkdGhfY2RyaW5mb19zdHIpOworICAgICAgICAgICAgICAgIGdkdGNtZC0+dS5pb2N0bC5zdWJmdW5jID0gQ0FDSEVfRFJWX0lORk87CisgICAgICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLmNoYW5uZWwgPSBkcnZfbm87CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgICAgICAgICAgICAgIGdkdGhfZG9fcmVxKHNjcCwgZ2R0Y21kLCBjbW5kLCAzMCk7CisgICAgICAgICAgICAgICAgaWYgKHNjcC0+c3JfY29tbWFuZC0+U0NwLlN0YXR1cyAhPSBTX09LKSAKKyNlbHNlCisgICAgICAgICAgICAgICAgZ2R0aF9kb19jbWQoc2NwLCBnZHRjbWQsIGNtbmQsIDMwKTsKKyAgICAgICAgICAgICAgICBpZiAoc2NwLT5TQ3AuU3RhdHVzICE9IFNfT0spCisjZW5kaWYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwY2RpLT5sZF9kdHlwZSA+Pj0gMTY7CisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgIGlmIChwY2RpLT5sZF9kdHlwZSA+IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGhyZWMsICJtaXNzaW5nIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwY2RpLT5sZF9lcnJvciAmIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGhyZWMsICJmYXVsdCIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGNkaS0+bGRfZXJyb3IgJiAyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmNweShocmVjLCAiaW52YWxpZCIpOworICAgICAgICAgICAgICAgICAgICBrKys7IGotLTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdHJjcHkoaHJlYywgIm9rIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoZHJ2X25vID09IGkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIE51bWJlcjogICAgICAgXHQlLTJkICAgICAgICBcdFN0YXR1czogICAgICAgIFx0JXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRydl9ubywgaHJlYyk7CisgICAgICAgICAgICAgICAgICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgICAgICAgICAgICAgICAgIGZsYWcgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBub19tZHJ2ID0gcGNkaS0+Y2RfbGRjbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChub19tZHJ2ID4gMSB8fCBwY2RpLT5sZF9zbGF2ZSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNfbWlyciA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoaHJlYywgIlJBSUQtMSIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBjZGktPmxkX2R0eXBlID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweShocmVjLCAiRGlzayIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBjZGktPmxkX2R0eXBlID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweShocmVjLCAiUkFJRC0wIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGNkaS0+bGRfZHR5cGUgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGhyZWMsICJDaGFpbiIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGhyZWMsICI/Pz8iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIENhcGFjaXR5IFtNQl06XHQlLTZkICAgIFx0VHlwZTogICAgICAgICAgXHQlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNkaS0+bGRfYmxrY250LygxMDI0KjEwMjQvcGNkaS0+bGRfYmxrc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWMpOworICAgICAgICAgICAgICAgICAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgU2xhdmUgTnVtYmVyOiBcdCUtMmQgICAgICAgIFx0U3RhdHVzOiAgICAgICAgXHQlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X25vICYgMHg3ZmZmLCBocmVjKTsKKyAgICAgICAgICAgICAgICAgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHJ2X25vID0gcGNkaS0+bGRfc2xhdmU7CisgICAgICAgICAgICAgICAgaWYgKHBvcyA8IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IHBvczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBvcyA+IG9mZnNldCArIGxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBzdG9wX291dHB1dDsKKyAgICAgICAgICAgIH0gd2hpbGUgKGRydl9ubyAhPSAtMSk7CisgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaXNfbWlycikgeworICAgICAgICAgICAgICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBNaXNzaW5nIERydi46IFx0JS0yZCAgICAgICAgXHRJbnZhbGlkIERydi46ICBcdCVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vX21kcnYgLSBqIC0gaywgayk7CisgICAgICAgICAgICAgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIWhhLT5oZHJbaV0uaXNfYXJyYXlkcnYpCisgICAgICAgICAgICAgICAgc3RyY3B5KGhyZWMsICItLSIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNwcmludGYoaHJlYywgIiVkIiwgaGEtPmhkcltpXS5tYXN0ZXJfbm8pOworICAgICAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVG8gQXJyYXkgRHJ2LjpcdCVzXG4iLCBocmVjKTsKKyAgICAgICAgICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgICAgICAgICBpZiAocG9zIDwgb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgICAgICBiZWdpbiA9IHBvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwb3MgPiBvZmZzZXQgKyBsZW5ndGgpCisgICAgICAgICAgICAgICAgZ290byBzdG9wX291dHB1dDsKKyAgICAgICAgfSAgICAgICAKKyAgICAgICAgZ2R0aF9pb2N0bF9mcmVlKGhhbnVtLCBHRFRIX1NDUkFUQ0gsIGJ1ZiwgcGFkZHIpOworICAgICAgICAKKyAgICAgICAgaWYgKCFmbGFnKSB7CisgICAgICAgICAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLCAiXG4gLS1cbiIpOworICAgICAgICAgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICAgICAgfSAgIAorCisgICAgICAgIC8qIDQuIGFib3V0IGFycmF5IGRyaXZlcyAqLworICAgICAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLCJcbkFycmF5IERyaXZlczoiKTsKKyAgICAgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICAgICAgZmxhZyA9IEZBTFNFOworCisgICAgICAgIGJ1ZiA9IGdkdGhfaW9jdGxfYWxsb2MoaGFudW0sIEdEVEhfU0NSQVRDSCwgRkFMU0UsICZwYWRkcik7CisgICAgICAgIGlmICghYnVmKSAKKyAgICAgICAgICAgIGdvdG8gc3RvcF9vdXRwdXQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTERSSVZFUzsgKytpKSB7CisgICAgICAgICAgICBpZiAoIShoYS0+aGRyW2ldLmlzX2FycmF5ZHJ2ICYmIGhhLT5oZHJbaV0uaXNfbWFzdGVyKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIC8qIDQuYSBhcnJheSBkcml2ZSBpbmZvICovCisgICAgICAgICAgICBUUkFDRTIoKCJhcnJheV9pbmZvKCkgZHJpdmUgbm8gJWRcbiIsaSkpOworICAgICAgICAgICAgcGFpID0gKGdkdGhfYXJyYXlpbmZfc3RyICopYnVmOworICAgICAgICAgICAgZ2R0Y21kLT5TZXJ2aWNlID0gQ0FDSEVTRVJWSUNFOworICAgICAgICAgICAgZ2R0Y21kLT5PcENvZGUgPSBHRFRfSU9DVEw7CisgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwucF9wYXJhbSA9IHBhZGRyOworICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLnBhcmFtX3NpemUgPSBzaXplb2YoZ2R0aF9hcnJheWluZl9zdHIpOworICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLnN1YmZ1bmMgPSBBUlJBWV9JTkZPIHwgTEFfQ1RSTF9QQVRURVJOOworICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLmNoYW5uZWwgPSBpOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgICAgIGdkdGhfZG9fcmVxKHNjcCwgZ2R0Y21kLCBjbW5kLCAzMCk7CisgICAgICAgICAgICBpZiAoc2NwLT5zcl9jb21tYW5kLT5TQ3AuU3RhdHVzID09IFNfT0spIAorI2Vsc2UKKyAgICAgICAgICAgIGdkdGhfZG9fY21kKHNjcCwgZ2R0Y21kLCBjbW5kLCAzMCk7CisgICAgICAgICAgICBpZiAoc2NwLT5TQ3AuU3RhdHVzID09IFNfT0spIAorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBhaS0+YWlfc3RhdGUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGhyZWMsICJpZGxlIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFpLT5haV9zdGF0ZSA9PSAyKQorICAgICAgICAgICAgICAgICAgICBzdHJjcHkoaHJlYywgImJ1aWxkIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFpLT5haV9zdGF0ZSA9PSA0KQorICAgICAgICAgICAgICAgICAgICBzdHJjcHkoaHJlYywgInJlYWR5Iik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFpLT5haV9zdGF0ZSA9PSA2KQorICAgICAgICAgICAgICAgICAgICBzdHJjcHkoaHJlYywgImZhaWwiKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwYWktPmFpX3N0YXRlID09IDggfHwgcGFpLT5haV9zdGF0ZSA9PSAxMCkKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGhyZWMsICJyZWJ1aWxkIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzdHJjcHkoaHJlYywgImVycm9yIik7CisgICAgICAgICAgICAgICAgaWYgKHBhaS0+YWlfZXh0X3N0YXRlICYgMHgxMCkKKyAgICAgICAgICAgICAgICAgICAgc3RyY2F0KGhyZWMsICIvZXhwYW5kIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFpLT5haV9leHRfc3RhdGUgJiAweDEpCisgICAgICAgICAgICAgICAgICAgIHN0cmNhdChocmVjLCAiL3BhdGNoIik7CisgICAgICAgICAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4gTnVtYmVyOiAgICAgICBcdCUtMmQgICAgICAgIFx0U3RhdHVzOiAgICAgICAgXHQlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLGhyZWMpOworICAgICAgICAgICAgICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgICAgICAgICAgICAgZmxhZyA9IFRSVUU7CisKKyAgICAgICAgICAgICAgICBpZiAocGFpLT5haV90eXBlID09IDApCisgICAgICAgICAgICAgICAgICAgIHN0cmNweShocmVjLCAiUkFJRC0wIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFpLT5haV90eXBlID09IDQpCisgICAgICAgICAgICAgICAgICAgIHN0cmNweShocmVjLCAiUkFJRC00Iik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFpLT5haV90eXBlID09IDUpCisgICAgICAgICAgICAgICAgICAgIHN0cmNweShocmVjLCAiUkFJRC01Iik7CisgICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGhyZWMsICJSQUlELTEwIik7CisgICAgICAgICAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIENhcGFjaXR5IFtNQl06XHQlLTZkICAgIFx0VHlwZTogICAgICAgICAgXHQlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWktPmFpX3NpemUvKDEwMjQqMTAyNC9wYWktPmFpX3NlY3NpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWMpOworICAgICAgICAgICAgICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgICAgICAgICAgICAgaWYgKHBvcyA8IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IHBvczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBvcyA+IG9mZnNldCArIGxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBzdG9wX291dHB1dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBnZHRoX2lvY3RsX2ZyZWUoaGFudW0sIEdEVEhfU0NSQVRDSCwgYnVmLCBwYWRkcik7CisgICAgICAgIAorICAgICAgICBpZiAoIWZsYWcpIHsKKyAgICAgICAgICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJcbiAtLVxuIik7CisgICAgICAgICAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworICAgICAgICB9CisKKyAgICAgICAgLyogNS4gYWJvdXQgaG9zdCBkcml2ZXMgKi8KKyAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwiXG5Ib3N0IERyaXZlczoiKTsKKyAgICAgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICAgICAgZmxhZyA9IEZBTFNFOworCisgICAgICAgIGJ1ZiA9IGdkdGhfaW9jdGxfYWxsb2MoaGFudW0sIHNpemVvZihnZHRoX2hnZXRfc3RyKSwgRkFMU0UsICZwYWRkcik7CisgICAgICAgIGlmICghYnVmKSAKKyAgICAgICAgICAgIGdvdG8gc3RvcF9vdXRwdXQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTERSSVZFUzsgKytpKSB7CisgICAgICAgICAgICBpZiAoIWhhLT5oZHJbaV0uaXNfbG9nZHJ2IHx8IAorICAgICAgICAgICAgICAgIChoYS0+aGRyW2ldLmlzX2FycmF5ZHJ2ICYmICFoYS0+aGRyW2ldLmlzX21hc3RlcikpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAvKiA1LmEgZ2V0IGhvc3QgZHJpdmUgbGlzdCAqLworICAgICAgICAgICAgVFJBQ0UyKCgiaG9zdF9nZXQoKSBkcnZfbm8gJWRcbiIsaSkpOyAgICAgICAgICAgCisgICAgICAgICAgICBwaGcgPSAoZ2R0aF9oZ2V0X3N0ciAqKWJ1ZjsKKyAgICAgICAgICAgIGdkdGNtZC0+U2VydmljZSA9IENBQ0hFU0VSVklDRTsKKyAgICAgICAgICAgIGdkdGNtZC0+T3BDb2RlID0gR0RUX0lPQ1RMOworICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLnBfcGFyYW0gPSBwYWRkcjsKKyAgICAgICAgICAgIGdkdGNtZC0+dS5pb2N0bC5wYXJhbV9zaXplID0gc2l6ZW9mKGdkdGhfaGdldF9zdHIpOworICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLnN1YmZ1bmMgPSBIT1NUX0dFVCB8IExBX0NUUkxfUEFUVEVSTjsKKyAgICAgICAgICAgIGdkdGNtZC0+dS5pb2N0bC5jaGFubmVsID0gaTsKKyAgICAgICAgICAgIHBoZy0+ZW50cmllcyA9IE1BWF9IRFJJVkVTOworICAgICAgICAgICAgcGhnLT5vZmZzZXQgPSBHRFRPRkZTT0YoZ2R0aF9oZ2V0X3N0ciwgZW50cnlbMF0pOyAKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgICAgICAgICBnZHRoX2RvX3JlcShzY3AsIGdkdGNtZCwgY21uZCwgMzApOworICAgICAgICAgICAgaWYgKHNjcC0+c3JfY29tbWFuZC0+U0NwLlN0YXR1cyAhPSBTX09LKSAKKyNlbHNlCisgICAgICAgICAgICBnZHRoX2RvX2NtZChzY3AsIGdkdGNtZCwgY21uZCwgMzApOworICAgICAgICAgICAgaWYgKHNjcC0+U0NwLlN0YXR1cyAhPSBTX09LKSAKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhLT5oZHJbaV0ubGRyX25vID0gaTsKKyAgICAgICAgICAgICAgICBoYS0+aGRyW2ldLnJ3X2F0dHJpYnMgPSAwOworICAgICAgICAgICAgICAgIGhhLT5oZHJbaV0uc3RhcnRfc2VjID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBoZy0+ZW50cmllczsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIGsgPSBwaGctPmVudHJ5W2pdLmhvc3RfZHJpdmU7CisgICAgICAgICAgICAgICAgICAgIGlmIChrID49IE1BWF9MRFJJVkVTKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGhhLT5oZHJba10ubGRyX25vID0gcGhnLT5lbnRyeVtqXS5sb2dfZHJpdmU7CisgICAgICAgICAgICAgICAgICAgIGhhLT5oZHJba10ucndfYXR0cmlicyA9IHBoZy0+ZW50cnlbal0ucndfYXR0cmliczsKKyAgICAgICAgICAgICAgICAgICAgaGEtPmhkcltrXS5zdGFydF9zZWMgPSBwaGctPmVudHJ5W2pdLnN0YXJ0X3NlYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ2R0aF9pb2N0bF9mcmVlKGhhbnVtLCBzaXplb2YoZ2R0aF9oZ2V0X3N0ciksIGJ1ZiwgcGFkZHIpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfSERSSVZFUzsgKytpKSB7CisgICAgICAgICAgICBpZiAoIShoYS0+aGRyW2ldLnByZXNlbnQpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4gTnVtYmVyOiAgICAgICBcdCUtMmQgICAgICAgIFx0QXJyL0xvZy4gRHJpdmU6XHQlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGhhLT5oZHJbaV0ubGRyX25vKTsKKyAgICAgICAgICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgICAgICAgICBmbGFnID0gVFJVRTsKKworICAgICAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQ2FwYWNpdHkgW01CXTpcdCUtNmQgICAgXHRTdGFydCBTZWN0b3I6ICBcdCVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVsb25nMzIpKGhhLT5oZHJbaV0uc2l6ZS8yMDQ4KSwgaGEtPmhkcltpXS5zdGFydF9zZWMpOworICAgICAgICAgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICAgICAgICAgIGlmIChwb3MgPCBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgIGJlZ2luID0gcG9zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvcyA+IG9mZnNldCArIGxlbmd0aCkKKyAgICAgICAgICAgICAgICBnb3RvIHN0b3Bfb3V0cHV0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIWZsYWcpIHsKKyAgICAgICAgICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJcbiAtLVxuIik7CisgICAgICAgICAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY29udHJvbGxlciBldmVudHMgKi8KKyAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLCJcbkNvbnRyb2xsZXIgRXZlbnRzOlxuIik7CisgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKworICAgIGZvciAoaWQgPSAtMTs7KSB7CisgICAgICAgIGlkID0gZ2R0aF9yZWFkX2V2ZW50KGhhLCBpZCwgZXN0cik7CisgICAgICAgIGlmIChlc3RyLT5ldmVudF9zb3VyY2UgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoZXN0ci0+ZXZlbnRfZGF0YS5ldS5kcml2ZXIuaW9ub2RlID09IGhhbnVtICYmCisgICAgICAgICAgICBlc3RyLT5ldmVudF9zb3VyY2UgPT0gRVNfQVNZTkMpIHsgCisgICAgICAgICAgICBnZHRoX2xvZ19ldmVudCgmZXN0ci0+ZXZlbnRfZGF0YSwgaHJlYyk7CisgICAgICAgICAgICBkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKyAgICAgICAgICAgIHNlYyA9IChpbnQpKHR2LnR2X3NlYyAtIGVzdHItPmZpcnN0X3N0YW1wKTsKKyAgICAgICAgICAgIGlmIChzZWMgPCAwKSBzZWMgPSAwOworICAgICAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwiIGRhdGUtICUwMmQ6JTAyZDolMDJkXHQlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYy8zNjAwLCBzZWMlMzYwMC82MCwgc2VjJTYwLCBocmVjKTsKKyAgICAgICAgICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgICAgICAgICBpZiAocG9zIDwgb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgICAgICBiZWdpbiA9IHBvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwb3MgPiBvZmZzZXQgKyBsZW5ndGgpCisgICAgICAgICAgICAgICAgZ290byBzdG9wX291dHB1dDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaWQgPT0gLTEpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKK3N0b3Bfb3V0cHV0OgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICBzY3NpX3JlbGVhc2VfcmVxdWVzdChzY3ApOworICAgIHNjc2lfZnJlZV9ob3N0X2RldihzZGV2KTsKKyNlbHNlCisgICAgc2NzaV9yZWxlYXNlX2NvbW1hbmQoc2NwKTsKKyAgICBzY3NpX2ZyZWVfaG9zdF9kZXYoc2Rldik7CisjZW5kaWYKKyAgICAqc3RhcnQgPSBidWZmZXIgKyhvZmZzZXQtYmVnaW4pOworICAgIGxlbiAtPSAob2Zmc2V0LWJlZ2luKTsKKyAgICBpZiAobGVuID4gbGVuZ3RoKQorICAgICAgICBsZW4gPSBsZW5ndGg7CisgICAgVFJBQ0UyKCgiZ2V0X2luZm8oKSBsZW4gJWQgcG9zICVkIGJlZ2luICVkIG9mZnNldCAlZCBsZW5ndGggJWQgc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgIGxlbiwoaW50KXBvcywoaW50KWJlZ2luLChpbnQpb2Zmc2V0LGxlbmd0aCxzaXplKSk7CisgICAgcmMgPSBsZW47CisKK2ZyZWVfZmFpbDoKKyAgICBrZnJlZShnZHRjbWQpOworICAgIGtmcmVlKGVzdHIpOworICAgIHJldHVybiByYzsKK30KKworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorc3RhdGljIHZvaWQgZ2R0aF9kb19yZXEoU2NzaV9SZXF1ZXN0ICpzY3AsIGdkdGhfY21kX3N0ciAqZ2R0Y21kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNtbmQsIGludCB0aW1lb3V0KQoreworICAgIHVuc2lnbmVkIGJ1ZmZsZW47CisgICAgREVDTEFSRV9DT01QTEVUSU9OKHdhaXQpOworCisgICAgVFJBQ0UyKCgiZ2R0aF9kb19yZXEoKVxuIikpOworICAgIGlmIChnZHRjbWQgIT0gTlVMTCkgeyAKKyAgICAgICAgYnVmZmxlbiA9IHNpemVvZihnZHRoX2NtZF9zdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZmZsZW4gPSAwOworICAgIH0KKyAgICBzY3AtPnNyX3JlcXVlc3QtPnJxX3N0YXR1cyA9IFJRX1NDU0lfQlVTWTsKKyAgICBzY3AtPnNyX3JlcXVlc3QtPndhaXRpbmcgPSAmd2FpdDsKKyAgICBzY3NpX2RvX3JlcShzY3AsIGNtbmQsIGdkdGNtZCwgYnVmZmxlbiwgZ2R0aF9zY3NpX2RvbmUsIHRpbWVvdXQqSFosIDEpOworICAgIHdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOworfQorCisjZWxzZQorc3RhdGljIHZvaWQgZ2R0aF9kb19jbWQoU2NzaV9DbW5kICpzY3AsIGdkdGhfY21kX3N0ciAqZ2R0Y21kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNtbmQsIGludCB0aW1lb3V0KQoreworICAgIHVuc2lnbmVkIGJ1ZmZsZW47CisgICAgREVDTEFSRV9DT01QTEVUSU9OKHdhaXQpOworCisgICAgVFJBQ0UyKCgiZ2R0aF9kb19jbWQoKVxuIikpOworICAgIGlmIChnZHRjbWQgIT0gTlVMTCkgeyAKKyAgICAgICAgc2NwLT5TQ3AudGhpc19yZXNpZHVhbCA9IElPQ1RMX1BSSTsKKyAgICAgICAgYnVmZmxlbiA9IHNpemVvZihnZHRoX2NtZF9zdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNjcC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBERUZBVUxUX1BSSTsKKyAgICAgICAgYnVmZmxlbiA9IDA7CisgICAgfQorCisgICAgc2NwLT5yZXF1ZXN0LnJxX3N0YXR1cyA9IFJRX1NDU0lfQlVTWTsKKyAgICBzY3AtPnJlcXVlc3Qud2FpdGluZyA9ICZ3YWl0OworICAgIHNjc2lfZG9fY21kKHNjcCwgY21uZCwgZ2R0Y21kLCBidWZmbGVuLCBnZHRoX3Njc2lfZG9uZSwgdGltZW91dCpIWiwgMSk7CisgICAgd2FpdF9mb3JfY29tcGxldGlvbigmd2FpdCk7Cit9CisjZW5kaWYKKwordm9pZCBnZHRoX3Njc2lfZG9uZShTY3NpX0NtbmQgKnNjcCkKK3sKKyAgICBUUkFDRTIoKCJnZHRoX3Njc2lfZG9uZSgpXG4iKSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgc2NwLT5yZXF1ZXN0LT5ycV9zdGF0dXMgPSBSUV9TQ1NJX0RPTkU7CisgICAgaWYgKHNjcC0+cmVxdWVzdC0+d2FpdGluZyAhPSBOVUxMKQorICAgICAgICBjb21wbGV0ZShzY3AtPnJlcXVlc3QtPndhaXRpbmcpOworI2Vsc2UKKyAgICBzY3AtPnJlcXVlc3QucnFfc3RhdHVzID0gUlFfU0NTSV9ET05FOworICAgIGlmIChzY3AtPnJlcXVlc3Qud2FpdGluZyAhPSBOVUxMKQorICAgICAgICBjb21wbGV0ZShzY3AtPnJlcXVlc3Qud2FpdGluZyk7CisjZW5kaWYKK30KKworc3RhdGljIGNoYXIgKmdkdGhfaW9jdGxfYWxsb2MoaW50IGhhbnVtLCBpbnQgc2l6ZSwgaW50IHNjcmF0Y2gsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxvbmc2NCAqcGFkZHIpCit7CisgICAgZ2R0aF9oYV9zdHIgKmhhOworICAgIHVsb25nIGZsYWdzOworICAgIGNoYXIgKnJldF92YWw7CisKKyAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKworICAgIGlmICghaGEtPnNjcmF0Y2hfYnVzeSAmJiBzaXplIDw9IEdEVEhfU0NSQVRDSCkgeworICAgICAgICBoYS0+c2NyYXRjaF9idXN5ID0gVFJVRTsKKyAgICAgICAgcmV0X3ZhbCA9IGhhLT5wc2NyYXRjaDsKKyAgICAgICAgKnBhZGRyID0gaGEtPnNjcmF0Y2hfcGh5czsKKyAgICB9IGVsc2UgaWYgKHNjcmF0Y2gpIHsKKyAgICAgICAgcmV0X3ZhbCA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworICAgICAgICByZXRfdmFsID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGEtPnBkZXYsIHNpemUsICZkbWFfYWRkcik7CisgICAgICAgICpwYWRkciA9IGRtYV9hZGRyOworICAgIH0KKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgIHJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgdm9pZCBnZHRoX2lvY3RsX2ZyZWUoaW50IGhhbnVtLCBpbnQgc2l6ZSwgY2hhciAqYnVmLCB1bG9uZzY0IHBhZGRyKQoreworICAgIGdkdGhfaGFfc3RyICpoYTsKKyAgICB1bG9uZyBmbGFnczsKKworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKworICAgIGlmIChidWYgPT0gaGEtPnBzY3JhdGNoKSB7CisgICAgICAgIGhhLT5zY3JhdGNoX2J1c3kgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LCBzaXplLCBidWYsIHBhZGRyKTsKKyAgICB9CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKK30KKworI2lmZGVmIEdEVEhfSU9DVExfUFJPQworc3RhdGljIGludCBnZHRoX2lvY3RsX2NoZWNrX2JpbihpbnQgaGFudW0sIHVzaG9ydCBzaXplKQoreworICAgIGdkdGhfaGFfc3RyICpoYTsKKyAgICB1bG9uZyBmbGFnczsKKyAgICBpbnQgcmV0X3ZhbDsKKworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKworICAgIHJldF92YWwgPSBGQUxTRTsKKyAgICBpZiAoaGEtPnNjcmF0Y2hfYnVzeSkgeworICAgICAgICBpZiAoKChnZHRoX2lvcmRfc3RyICopaGEtPnBzY3JhdGNoKS0+c2l6ZSA9PSAodWxvbmczMilzaXplKQorICAgICAgICAgICAgcmV0X3ZhbCA9IFRSVUU7CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgIHJldHVybiByZXRfdmFsOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGdkdGhfd2FpdF9jb21wbGV0aW9uKGludCBoYW51bSwgaW50IGJ1c251bSwgaW50IGlkKQoreworICAgIGdkdGhfaGFfc3RyICpoYTsKKyAgICB1bG9uZyBmbGFnczsKKyAgICBpbnQgaTsKKyAgICBTY3NpX0NtbmQgKnNjcDsKKyAgICB1bmNoYXIgYiwgdDsKKworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBHRFRIX01BWENNRFM7ICsraSkgeworICAgICAgICBzY3AgPSBoYS0+Y21kX3RhYltpXS5jbW5kOworCisgICAgICAgIGIgPSB2aXJ0X2N0ciA/IE5VTURBVEEoc2NwLT5kZXZpY2UtPmhvc3QpLT5idXNudW0gOiBzY3AtPmRldmljZS0+Y2hhbm5lbDsKKyAgICAgICAgdCA9IHNjcC0+ZGV2aWNlLT5pZDsKKyAgICAgICAgaWYgKCFTUEVDSUFMX1NDUChzY3ApICYmIHQgPT0gKHVuY2hhcilpZCAmJiAKKyAgICAgICAgICAgIGIgPT0gKHVuY2hhcilidXNudW0pIHsKKyAgICAgICAgICAgIHNjcC0+U0NwLmhhdmVfZGF0YV9pbiA9IDA7CisgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgIHdoaWxlICghc2NwLT5TQ3AuaGF2ZV9kYXRhX2luKQorICAgICAgICAgICAgICAgIGJhcnJpZXIoKTsKKyAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZ2R0aF9zdG9wX3RpbWVvdXQoaW50IGhhbnVtLCBpbnQgYnVzbnVtLCBpbnQgaWQpCit7CisgICAgZ2R0aF9oYV9zdHIgKmhhOworICAgIHVsb25nIGZsYWdzOworICAgIFNjc2lfQ21uZCAqc2NwOworICAgIHVuY2hhciBiLCB0OworCisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworCisgICAgZm9yIChzY3AgPSBoYS0+cmVxX2ZpcnN0OyBzY3A7IHNjcCA9IChTY3NpX0NtbmQgKilzY3AtPlNDcC5wdHIpIHsKKyAgICAgICAgYiA9IHZpcnRfY3RyID8gTlVNREFUQShzY3AtPmRldmljZS0+aG9zdCktPmJ1c251bSA6IHNjcC0+ZGV2aWNlLT5jaGFubmVsOworICAgICAgICB0ID0gc2NwLT5kZXZpY2UtPmlkOworICAgICAgICBpZiAodCA9PSAodW5jaGFyKWlkICYmIGIgPT0gKHVuY2hhcilidXNudW0pIHsKKyAgICAgICAgICAgIFRSQUNFMigoImdkdGhfc3RvcF90aW1lb3V0KCk6IHVwZGF0ZV90aW1lb3V0KClcbiIpKTsKKyAgICAgICAgICAgIHNjcC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSBnZHRoX3VwZGF0ZV90aW1lb3V0KGhhbnVtLCBzY3AsIDApOworICAgICAgICB9CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBnZHRoX3N0YXJ0X3RpbWVvdXQoaW50IGhhbnVtLCBpbnQgYnVzbnVtLCBpbnQgaWQpCit7CisgICAgZ2R0aF9oYV9zdHIgKmhhOworICAgIHVsb25nIGZsYWdzOworICAgIFNjc2lfQ21uZCAqc2NwOworICAgIHVuY2hhciBiLCB0OworCisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworCisgICAgZm9yIChzY3AgPSBoYS0+cmVxX2ZpcnN0OyBzY3A7IHNjcCA9IChTY3NpX0NtbmQgKilzY3AtPlNDcC5wdHIpIHsKKyAgICAgICAgYiA9IHZpcnRfY3RyID8gTlVNREFUQShzY3AtPmRldmljZS0+aG9zdCktPmJ1c251bSA6IHNjcC0+ZGV2aWNlLT5jaGFubmVsOworICAgICAgICB0ID0gc2NwLT5kZXZpY2UtPmlkOworICAgICAgICBpZiAodCA9PSAodW5jaGFyKWlkICYmIGIgPT0gKHVuY2hhcilidXNudW0pIHsKKyAgICAgICAgICAgIFRSQUNFMigoImdkdGhfc3RhcnRfdGltZW91dCgpOiB1cGRhdGVfdGltZW91dCgpXG4iKSk7CisgICAgICAgICAgICBnZHRoX3VwZGF0ZV90aW1lb3V0KGhhbnVtLCBzY3AsIHNjcC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpOworICAgICAgICB9CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGdkdGhfdXBkYXRlX3RpbWVvdXQoaW50IGhhbnVtLCBTY3NpX0NtbmQgKnNjcCwgaW50IHRpbWVvdXQpCit7CisgICAgaW50IG9sZHRvOworCisgICAgb2xkdG8gPSBzY3AtPnRpbWVvdXRfcGVyX2NvbW1hbmQ7CisgICAgc2NwLT50aW1lb3V0X3Blcl9jb21tYW5kID0gdGltZW91dDsKKworICAgIGlmICh0aW1lb3V0ID09IDApIHsKKyAgICAgICAgZGVsX3RpbWVyKCZzY3AtPmVoX3RpbWVvdXQpOworICAgICAgICBzY3AtPmVoX3RpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBOVUxMOworICAgICAgICBzY3AtPmVoX3RpbWVvdXQuZXhwaXJlcyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNjcC0+ZWhfdGltZW91dC5kYXRhICE9ICh1bnNpZ25lZCBsb25nKSBOVUxMKSAKKyAgICAgICAgICAgIGRlbF90aW1lcigmc2NwLT5laF90aW1lb3V0KTsKKyAgICAgICAgc2NwLT5laF90aW1lb3V0LmRhdGEgPSAodW5zaWduZWQgbG9uZykgc2NwOworICAgICAgICBzY3AtPmVoX3RpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0OworICAgICAgICBhZGRfdGltZXIoJnNjcC0+ZWhfdGltZW91dCk7CisgICAgfQorCisgICAgcmV0dXJuIG9sZHRvOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2dkdGhfcHJvYy5oIGIvZHJpdmVycy9zY3NpL2dkdGhfcHJvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NWU4MjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZ2R0aF9wcm9jLmgKQEAgLTAsMCArMSwzNCBAQAorI2lmbmRlZiBfR0RUSF9QUk9DX0gKKyNkZWZpbmUgX0dEVEhfUFJPQ19ICisKKy8qIGdkdGhfcHJvYy5oIAorICogJElkOiBnZHRoX3Byb2MuaCx2IDEuMTYgMjAwNC8wMS8xNCAxMzowOTowMSBhY2hpbSBFeHAgJAorICovCisKK3N0YXRpYyBpbnQgZ2R0aF9zZXRfaW5mbyhjaGFyICpidWZmZXIsaW50IGxlbmd0aCxzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYW51bSxpbnQgYnVzbnVtKTsKK3N0YXRpYyBpbnQgZ2R0aF9nZXRfaW5mbyhjaGFyICpidWZmZXIsY2hhciAqKnN0YXJ0LG9mZl90IG9mZnNldCxpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsaW50IGhhbnVtLGludCBidXNudW0pOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorc3RhdGljIHZvaWQgZ2R0aF9kb19yZXEoU2NzaV9SZXF1ZXN0ICpzcnAsIGdkdGhfY21kX3N0ciAqY21kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNtbmQsIGludCB0aW1lb3V0KTsKK3N0YXRpYyBpbnQgZ2R0aF9zZXRfYXNjX2luZm8oY2hhciAqYnVmZmVyLGludCBsZW5ndGgsaW50IGhhbnVtLFNjc2lfUmVxdWVzdCAqc2NwKTsKKyNlbHNlCitzdGF0aWMgdm9pZCBnZHRoX2RvX2NtZChTY3NpX0NtbmQgKnNjcCwgZ2R0aF9jbWRfc3RyICpjbWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqY21uZCwgaW50IHRpbWVvdXQpOworc3RhdGljIGludCBnZHRoX3NldF9hc2NfaW5mbyhjaGFyICpidWZmZXIsaW50IGxlbmd0aCxpbnQgaGFudW0sU2NzaV9DbW5kICpzY3ApOworI2VuZGlmCisKK3N0YXRpYyBjaGFyICpnZHRoX2lvY3RsX2FsbG9jKGludCBoYW51bSwgaW50IHNpemUsIGludCBzY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxvbmc2NCAqcGFkZHIpOyAgCitzdGF0aWMgdm9pZCBnZHRoX2lvY3RsX2ZyZWUoaW50IGhhbnVtLCBpbnQgc2l6ZSwgY2hhciAqYnVmLCB1bG9uZzY0IHBhZGRyKTsKK3N0YXRpYyB2b2lkIGdkdGhfd2FpdF9jb21wbGV0aW9uKGludCBoYW51bSwgaW50IGJ1c251bSwgaW50IGlkKTsKK3N0YXRpYyB2b2lkIGdkdGhfc3RvcF90aW1lb3V0KGludCBoYW51bSwgaW50IGJ1c251bSwgaW50IGlkKTsKK3N0YXRpYyB2b2lkIGdkdGhfc3RhcnRfdGltZW91dChpbnQgaGFudW0sIGludCBidXNudW0sIGludCBpZCk7CitzdGF0aWMgaW50IGdkdGhfdXBkYXRlX3RpbWVvdXQoaW50IGhhbnVtLCBTY3NpX0NtbmQgKnNjcCwgaW50IHRpbWVvdXQpOworCit2b2lkIGdkdGhfc2NzaV9kb25lKFNjc2lfQ21uZCAqc2NwKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ndnAxMS5jIGIvZHJpdmVycy9zY3NpL2d2cDExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjYmY3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9ndnAxMS5jCkBAIC0wLDAgKzEsMzg3IEBACisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KKyNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAid2QzM2M5My5oIgorI2luY2x1ZGUgImd2cDExLmgiCisKKyNpbmNsdWRlPGxpbnV4L3N0YXQuaD4KKworI2RlZmluZSBETUEocHRyKSAoKGd2cDExX3Njc2lyZWdzICopKChwdHIpLT5iYXNlKSkKKyNkZWZpbmUgSERBVEEocHRyKSAoKHN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhICopKChwdHIpLT5ob3N0ZGF0YSkpCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBndnAxMV9pbnRyIChpbnQgaXJxLCB2b2lkICpfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHVuc2lnbmVkIGludCBzdGF0dXM7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UgPSAoc3RydWN0IFNjc2lfSG9zdCAqKV9pbnN0YW5jZTsKKworICAgIHN0YXR1cyA9IERNQShpbnN0YW5jZSktPkNOVFI7CisgICAgaWYgKCEoc3RhdHVzICYgR1ZQMTFfRE1BQ19JTlRfUEVORElORykpCisJcmV0dXJuIElSUV9OT05FOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoaW5zdGFuY2UtPmhvc3RfbG9jaywgZmxhZ3MpOworICAgIHdkMzNjOTNfaW50cihpbnN0YW5jZSk7CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+aG9zdF9sb2NrLCBmbGFncyk7CisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGd2cDExX3hmZXJfbWFzayA9IDA7CisKK3ZvaWQgZ3ZwMTFfc2V0dXAgKGNoYXIgKnN0ciwgaW50ICppbnRzKQoreworICAgIGd2cDExX3hmZXJfbWFzayA9IGludHNbMV07Cit9CisKK3N0YXRpYyBpbnQgZG1hX3NldHVwIChTY3NpX0NtbmQgKmNtZCwgaW50IGRpcl9pbikKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBjbnRyID0gR1ZQMTFfRE1BQ19JTlRfRU5BQkxFOworICAgIHVuc2lnbmVkIGxvbmcgYWRkciA9IHZpcnRfdG9fYnVzKGNtZC0+U0NwLnB0cik7CisgICAgaW50IGJhbmtfbWFzazsKKyAgICBzdGF0aWMgaW50IHNjc2lfYWxsb2Nfb3V0X29mX3JhbmdlID0gMDsKKworICAgIC8qIHVzZSBib3VuY2UgYnVmZmVyIGlmIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGlzIGJhZCAqLworICAgIGlmIChhZGRyICYgSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfeGZlcl9tYXNrIHx8CisJKCFkaXJfaW4gJiYgbW1fZW5kX29mX2NodW5rIChhZGRyLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsKSkpCisgICAgeworCUhEQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KS0+ZG1hX2JvdW5jZV9sZW4gPSAoY21kLT5TQ3AudGhpc19yZXNpZHVhbCArIDUxMSkKKwkgICAgJiB+MHgxZmY7CisKKyAJaWYoICFzY3NpX2FsbG9jX291dF9vZl9yYW5nZSApIHsKKwkgICAgSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfYm91bmNlX2J1ZmZlciA9CisJCWttYWxsb2MgKEhEQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KS0+ZG1hX2JvdW5jZV9sZW4sIEdGUF9LRVJORUwpOworCSAgICBIREFUQShjbWQtPmRldmljZS0+aG9zdCktPmRtYV9idWZmZXJfcG9vbCA9IEJVRl9TQ1NJX0FMTE9DRUQ7CisJfQorCisJaWYgKHNjc2lfYWxsb2Nfb3V0X29mX3JhbmdlIHx8CisJICAgICFIREFUQShjbWQtPmRldmljZS0+aG9zdCktPmRtYV9ib3VuY2VfYnVmZmVyKSB7CisJICAgIEhEQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KS0+ZG1hX2JvdW5jZV9idWZmZXIgPQorCQlhbWlnYV9jaGlwX2FsbG9jKEhEQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KS0+ZG1hX2JvdW5jZV9sZW4sCisJCQkJICAgICAgICJHVlAgSUkgU0NTSSBCb3VuY2UgQnVmZmVyIik7CisKKwkgICAgaWYoIUhEQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KS0+ZG1hX2JvdW5jZV9idWZmZXIpCisJICAgIHsKKwkJSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfYm91bmNlX2xlbiA9IDA7CisJCXJldHVybiAxOworCSAgICB9CisKKwkgICAgSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfYnVmZmVyX3Bvb2wgPSBCVUZfQ0hJUF9BTExPQ0VEOworCX0KKworCS8qIGNoZWNrIGlmIHRoZSBhZGRyZXNzIG9mIHRoZSBib3VuY2UgYnVmZmVyIGlzIE9LICovCisJYWRkciA9IHZpcnRfdG9fYnVzKEhEQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KS0+ZG1hX2JvdW5jZV9idWZmZXIpOworCisJaWYgKGFkZHIgJiBIREFUQShjbWQtPmRldmljZS0+aG9zdCktPmRtYV94ZmVyX21hc2spIHsKKwkgICAgLyogZmFsbCBiYWNrIHRvIENoaXAgUkFNIGlmIGFkZHJlc3Mgb3V0IG9mIHJhbmdlICovCisJICAgIGlmKCBIREFUQShjbWQtPmRldmljZS0+aG9zdCktPmRtYV9idWZmZXJfcG9vbCA9PSBCVUZfU0NTSV9BTExPQ0VEKSB7CisJCWtmcmVlIChIREFUQShjbWQtPmRldmljZS0+aG9zdCktPmRtYV9ib3VuY2VfYnVmZmVyKTsKKwkJc2NzaV9hbGxvY19vdXRfb2ZfcmFuZ2UgPSAxOworCSAgICB9IGVsc2UgeworCQlhbWlnYV9jaGlwX2ZyZWUgKEhEQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KS0+ZG1hX2JvdW5jZV9idWZmZXIpOworICAgICAgICAgICAgfQorCQkKKwkgICAgSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfYm91bmNlX2J1ZmZlciA9CisJCWFtaWdhX2NoaXBfYWxsb2MoSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfYm91bmNlX2xlbiwKKwkJCQkgICAgICAgIkdWUCBJSSBTQ1NJIEJvdW5jZSBCdWZmZXIiKTsKKworCSAgICBpZighSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfYm91bmNlX2J1ZmZlcikKKwkgICAgeworCQlIREFUQShjbWQtPmRldmljZS0+aG9zdCktPmRtYV9ib3VuY2VfbGVuID0gMDsKKwkJcmV0dXJuIDE7CisJICAgIH0KKworCSAgICBhZGRyID0gdmlydF90b19idXMoSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfYm91bmNlX2J1ZmZlcik7CisJICAgIEhEQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KS0+ZG1hX2J1ZmZlcl9wb29sID0gQlVGX0NISVBfQUxMT0NFRDsKKwl9CisJICAgIAorCWlmICghZGlyX2luKSB7CisJICAgIC8qIGNvcHkgdG8gYm91bmNlIGJ1ZmZlciBmb3IgYSB3cml0ZSAqLworCSAgICBtZW1jcHkgKEhEQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KS0+ZG1hX2JvdW5jZV9idWZmZXIsCisJCSAgICBjbWQtPlNDcC5wdHIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworCX0KKyAgICB9CisKKyAgICAvKiBzZXR1cCBkbWEgZGlyZWN0aW9uICovCisgICAgaWYgKCFkaXJfaW4pCisJY250ciB8PSBHVlAxMV9ETUFDX0RJUl9XUklURTsKKworICAgIEhEQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KS0+ZG1hX2RpciA9IGRpcl9pbjsKKyAgICBETUEoY21kLT5kZXZpY2UtPmhvc3QpLT5DTlRSID0gY250cjsKKworICAgIC8qIHNldHVwIERNQSAqcGh5c2ljYWwqIGFkZHJlc3MgKi8KKyAgICBETUEoY21kLT5kZXZpY2UtPmhvc3QpLT5BQ1IgPSBhZGRyOworCisgICAgaWYgKGRpcl9pbikKKwkvKiBpbnZhbGlkYXRlIGFueSBjYWNoZSAqLworCWNhY2hlX2NsZWFyIChhZGRyLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsKTsKKyAgICBlbHNlCisJLyogcHVzaCBhbnkgZGlydHkgY2FjaGUgKi8KKwljYWNoZV9wdXNoIChhZGRyLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsKTsKKworICAgIGlmICgoYmFua19tYXNrID0gKH5IREFUQShjbWQtPmRldmljZS0+aG9zdCktPmRtYV94ZmVyX21hc2sgPj4gMTgpICYgMHgwMWMwKSkKKwkgICAgRE1BKGNtZC0+ZGV2aWNlLT5ob3N0KS0+QkFOSyA9IGJhbmtfbWFzayAmIChhZGRyID4+IDE4KTsKKworICAgIC8qIHN0YXJ0IERNQSAqLworICAgIERNQShjbWQtPmRldmljZS0+aG9zdCktPlNUX0RNQSA9IDE7CisKKyAgICAvKiByZXR1cm4gc3VjY2VzcyAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkbWFfc3RvcCAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIFNjc2lfQ21uZCAqU0NwbnQsCisJCSAgICAgIGludCBzdGF0dXMpCit7CisgICAgLyogc3RvcCBETUEgKi8KKyAgICBETUEoaW5zdGFuY2UpLT5TUF9ETUEgPSAxOworICAgIC8qIHJlbW92ZSB3cml0ZSBiaXQgZnJvbSBDT05UUk9MIGJpdHMgKi8KKyAgICBETUEoaW5zdGFuY2UpLT5DTlRSID0gR1ZQMTFfRE1BQ19JTlRfRU5BQkxFOworCisgICAgLyogY29weSBmcm9tIGEgYm91bmNlIGJ1ZmZlciwgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKHN0YXR1cyAmJiBIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfYnVmZmVyKSB7CisJaWYgKEhEQVRBKGluc3RhbmNlKS0+ZG1hX2RpciAmJiBTQ3BudCkKKwkgICAgbWVtY3B5IChTQ3BudC0+U0NwLnB0ciwgCisJCSAgICBIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfYnVmZmVyLAorCQkgICAgU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsKTsKKwkKKwlpZiAoSERBVEEoaW5zdGFuY2UpLT5kbWFfYnVmZmVyX3Bvb2wgPT0gQlVGX1NDU0lfQUxMT0NFRCkKKwkgICAga2ZyZWUgKEhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9idWZmZXIpOworCWVsc2UKKwkgICAgYW1pZ2FfY2hpcF9mcmVlKEhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9idWZmZXIpOworCQorCUhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9idWZmZXIgPSBOVUxMOworCUhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9sZW4gPSAwOworICAgIH0KK30KKworI2RlZmluZSBDSEVDS19XRDMzQzkzCisKK2ludCBfX2luaXQgZ3ZwMTFfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCkKK3sKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBjYWxsZWQgPSAwOworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlOworICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKyAgICB1bnNpZ25lZCBpbnQgZXBjOworICAgIHN0cnVjdCB6b3Jyb19kZXYgKnogPSBOVUxMOworICAgIHVuc2lnbmVkIGludCBkZWZhdWx0X2RtYV94ZmVyX21hc2s7CisgICAgd2QzM2M5M19yZWdzIHJlZ3M7CisgICAgaW50IG51bV9ndnAxMSA9IDA7CisjaWZkZWYgQ0hFQ0tfV0QzM0M5MworICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnNhc3JfMzM5MywgKnNjbWRfMzM5MzsKKyAgICB1bnNpZ25lZCBjaGFyIHNhdmVfc2FzcjsKKyAgICB1bnNpZ25lZCBjaGFyIHEsIHFxOworI2VuZGlmCisKKyAgICBpZiAoIU1BQ0hfSVNfQU1JR0EgfHwgY2FsbGVkKQorCXJldHVybiAwOworICAgIGNhbGxlZCA9IDE7CisKKyAgICB0cG50LT5wcm9jX25hbWUgPSAiR1ZQMTEiOworICAgIHRwbnQtPnByb2NfaW5mbyA9ICZ3ZDMzYzkzX3Byb2NfaW5mbzsKKworICAgIHdoaWxlICgoeiA9IHpvcnJvX2ZpbmRfZGV2aWNlKFpPUlJPX1dJTERDQVJELCB6KSkpIHsKKwkvKiAKKwkgKiBUaGlzIHNob3VsZCAoaG9wZWZ1bGx5KSBiZSB0aGUgY29ycmVjdCB3YXkgdG8gaWRlbnRpZnkKKwkgKiBhbGwgdGhlIGRpZmZlcmVudCBHVlAgU0NTSSBjb250cm9sbGVycyAoZXhjZXB0IGZvciB0aGUKKwkgKiBTRVJJRVMgSSB0aG91Z2gpLgorCSAqLworCisJaWYgKHotPmlkID09IFpPUlJPX1BST0RfR1ZQX0NPTUJPXzAzMF9SM19TQ1NJIHx8CisJICAgIHotPmlkID09IFpPUlJPX1BST0RfR1ZQX1NFUklFU19JSSkKKwkgICAgZGVmYXVsdF9kbWFfeGZlcl9tYXNrID0gfjB4MDBmZmZmZmY7CisJZWxzZSBpZiAoei0+aWQgPT0gWk9SUk9fUFJPRF9HVlBfR0ZPUkNFXzAzMF9TQ1NJIHx8CisJCSB6LT5pZCA9PSBaT1JST19QUk9EX0dWUF9BNTMwX1NDU0kgfHwKKwkJIHotPmlkID09IFpPUlJPX1BST0RfR1ZQX0NPTUJPXzAzMF9SNF9TQ1NJKQorCSAgICBkZWZhdWx0X2RtYV94ZmVyX21hc2sgPSB+MHgwMWZmZmZmZjsKKwllbHNlIGlmICh6LT5pZCA9PSBaT1JST19QUk9EX0dWUF9BMTI5MSB8fAorCQkgei0+aWQgPT0gWk9SUk9fUFJPRF9HVlBfR0ZPUkNFXzA0MF9TQ1NJXzEpCisJICAgIGRlZmF1bHRfZG1hX3hmZXJfbWFzayA9IH4weDA3ZmZmZmZmOworCWVsc2UKKwkgICAgY29udGludWU7CisKKwkvKgorCSAqIFJ1bW9ycyBzdGF0ZSB0aGF0IHNvbWUgR1ZQIHJhbSBib2FyZHMgdXNlIHRoZSBzYW1lIHByb2R1Y3QKKwkgKiBjb2RlIGFzIHRoZSBTQ1NJIGNvbnRyb2xsZXJzLiBUaGVyZWZvcmUgaWYgdGhlIGJvYXJkLXNpemUKKwkgKiBpcyBub3QgNjRLQiB3ZSBhc3VtZSBpdCBpcyBhIHJhbSBib2FyZCBhbmQgYmFpbCBvdXQuCisJICovCisJaWYgKHotPnJlc291cmNlLmVuZC16LT5yZXNvdXJjZS5zdGFydCAhPSAweGZmZmYpCisJCWNvbnRpbnVlOworCisJYWRkcmVzcyA9IHotPnJlc291cmNlLnN0YXJ0OworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGFkZHJlc3MsIDI1NiwgIndkMzNjOTMiKSkKKwkgICAgY29udGludWU7CisKKyNpZmRlZiBDSEVDS19XRDMzQzkzCisKKwkvKgorCSAqIFRoZXNlIGRhcm4gR1ZQIGJvYXJkcyBhcmUgYSBwcm9ibGVtIC0gaXQgY2FuIGJlIHRvdWdoIHRvIHRlbGwKKwkgKiB3aGV0aGVyIG9yIG5vdCB0aGV5IGluY2x1ZGUgYSBTQ1NJIGNvbnRyb2xsZXIuIFRoaXMgaXMgdGhlCisJICogdWx0aW1hdGUgWWV0LUFub3RoZXItR1ZQLURldGVjdGlvbi1IYWNrIGluIHRoYXQgaXQgYWN0dWFsbHkKKwkgKiBwcm9iZXMgZm9yIGEgV0QzM2M5MyBjaGlwOiBJZiB3ZSBmaW5kIG9uZSwgaXQncyBleHRyZW1lbHkKKwkgKiBsaWtlbHkgdGhhdCB0aGlzIGNhcmQgc3VwcG9ydHMgU0NTSSwgcmVnYXJkbGVzcyBvZiBQcm9kdWN0XworCSAqIENvZGUsIEJvYXJkX1NpemUsIGV0Yy4gCisJICovCisKKyAgICAvKiBHZXQgcG9pbnRlcnMgdG8gdGhlIHByZXN1bWVkIHJlZ2lzdGVyIGxvY2F0aW9ucyBhbmQgc2F2ZSBjb250ZW50cyAqLworCisJc2Fzcl8zMzkzID0gJigoKGd2cDExX3Njc2lyZWdzICopKFpUV09fVkFERFIoYWRkcmVzcykpKS0+U0FTUik7CisJc2NtZF8zMzkzID0gJigoKGd2cDExX3Njc2lyZWdzICopKFpUV09fVkFERFIoYWRkcmVzcykpKS0+U0NNRCk7CisJc2F2ZV9zYXNyID0gKnNhc3JfMzM5MzsKKworICAgIC8qIEZpcnN0IHRlc3QgdGhlIEF1eFN0YXR1cyBSZWcgKi8KKworCXEgPSAqc2Fzcl8zMzkzOwkJLyogcmVhZCBpdCAqLworCWlmIChxICYgMHgwOCkJCS8qIGJpdCAzIHNob3VsZCBhbHdheXMgYmUgY2xlYXIgKi8KKwkJZ290byByZWxlYXNlOworCSpzYXNyXzMzOTMgPSBXRF9BVVhJTElBUllfU1RBVFVTOwkgLyogc2V0dXAgaW5kaXJlY3QgYWRkcmVzcyAqLworCWlmICgqc2Fzcl8zMzkzID09IFdEX0FVWElMSUFSWV9TVEFUVVMpIHsgLyogc2hvdWxkbid0IHJldGFpbiB0aGUgd3JpdGUgKi8KKwkJKnNhc3JfMzM5MyA9IHNhdmVfc2FzcjsJLyogT29wcyAtIHJlc3RvcmUgdGhpcyBieXRlICovCisJCWdvdG8gcmVsZWFzZTsKKwkJfQorCWlmICgqc2Fzcl8zMzkzICE9IHEpIHsJLyogc2hvdWxkIHN0aWxsIHJlYWQgdGhlIHNhbWUgKi8KKwkJKnNhc3JfMzM5MyA9IHNhdmVfc2FzcjsJLyogT29wcyAtIHJlc3RvcmUgdGhpcyBieXRlICovCisJCWdvdG8gcmVsZWFzZTsKKwkJfQorCWlmICgqc2NtZF8zMzkzICE9IHEpCS8qIGFuZCBzbyBzaG91bGQgdGhlIGltYWdlIGF0IDB4MWYgKi8KKwkJZ290byByZWxlYXNlOworCisKKyAgICAvKiBPaywgd2UgcHJvYmFibHkgaGF2ZSBhIHdkMzNjOTMsIGJ1dCBsZXQncyBjaGVjayBhIGZldyBvdGhlciBwbGFjZXMKKyAgICAgKiBmb3IgZ29vZCBtZWFzdXJlLiBNYWtlIHN1cmUgdGhhdCB0aGlzIHdvcmtzIGZvciBib3RoICdBIGFuZCAnQiAgICAKKyAgICAgKiBjaGlwIHZlcnNpb25zLgorICAgICAqLworCisJKnNhc3JfMzM5MyA9IFdEX1NDU0lfU1RBVFVTOworCXEgPSAqc2NtZF8zMzkzOworCSpzYXNyXzMzOTMgPSBXRF9TQ1NJX1NUQVRVUzsKKwkqc2NtZF8zMzkzID0gfnE7CisJKnNhc3JfMzM5MyA9IFdEX1NDU0lfU1RBVFVTOworCXFxID0gKnNjbWRfMzM5MzsKKwkqc2Fzcl8zMzkzID0gV0RfU0NTSV9TVEFUVVM7CisJKnNjbWRfMzM5MyA9IHE7CisJaWYgKHFxICE9IHEpCQkJLyogc2hvdWxkIGJlIHJlYWQgb25seSAqLworCQlnb3RvIHJlbGVhc2U7CisJKnNhc3JfMzM5MyA9IDB4MWU7CS8qIHRoaXMgcmVnaXN0ZXIgaXMgdW5pbXBsZW1lbnRlZCAqLworCXEgPSAqc2NtZF8zMzkzOworCSpzYXNyXzMzOTMgPSAweDFlOworCSpzY21kXzMzOTMgPSB+cTsKKwkqc2Fzcl8zMzkzID0gMHgxZTsKKwlxcSA9ICpzY21kXzMzOTM7CisJKnNhc3JfMzM5MyA9IDB4MWU7CisJKnNjbWRfMzM5MyA9IHE7CisJaWYgKHFxICE9IHEgfHwgcXEgIT0gMHhmZikJLyogc2hvdWxkIGJlIHJlYWQgb25seSwgYWxsIDEncyAqLworCQlnb3RvIHJlbGVhc2U7CisJKnNhc3JfMzM5MyA9IFdEX1RJTUVPVVRfUEVSSU9EOworCXEgPSAqc2NtZF8zMzkzOworCSpzYXNyXzMzOTMgPSBXRF9USU1FT1VUX1BFUklPRDsKKwkqc2NtZF8zMzkzID0gfnE7CisJKnNhc3JfMzM5MyA9IFdEX1RJTUVPVVRfUEVSSU9EOworCXFxID0gKnNjbWRfMzM5MzsKKwkqc2Fzcl8zMzkzID0gV0RfVElNRU9VVF9QRVJJT0Q7CisJKnNjbWRfMzM5MyA9IHE7CisJaWYgKHFxICE9ICh+cSAmIDB4ZmYpKQkJLyogc2hvdWxkIGJlIHJlYWQvd3JpdGUgKi8KKwkJZ290byByZWxlYXNlOworI2VuZGlmCisKKwlpbnN0YW5jZSA9IHNjc2lfcmVnaXN0ZXIgKHRwbnQsIHNpemVvZiAoc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEpKTsKKwlpZihpbnN0YW5jZSA9PSBOVUxMKQorCQlnb3RvIHJlbGVhc2U7CisJaW5zdGFuY2UtPmJhc2UgPSBaVFdPX1ZBRERSKGFkZHJlc3MpOworCWluc3RhbmNlLT5pcnEgPSBJUlFfQU1JR0FfUE9SVFM7CisJaW5zdGFuY2UtPnVuaXF1ZV9pZCA9IHotPnNsb3RhZGRyOworCisJaWYgKGd2cDExX3hmZXJfbWFzaykKKwkJSERBVEEoaW5zdGFuY2UpLT5kbWFfeGZlcl9tYXNrID0gZ3ZwMTFfeGZlcl9tYXNrOworCWVsc2UKKwkJSERBVEEoaW5zdGFuY2UpLT5kbWFfeGZlcl9tYXNrID0gZGVmYXVsdF9kbWFfeGZlcl9tYXNrOworCisKKwlETUEoaW5zdGFuY2UpLT5zZWNyZXQyID0gMTsKKwlETUEoaW5zdGFuY2UpLT5zZWNyZXQxID0gMDsKKwlETUEoaW5zdGFuY2UpLT5zZWNyZXQzID0gMTU7CisJd2hpbGUgKERNQShpbnN0YW5jZSktPkNOVFIgJiBHVlAxMV9ETUFDX0JVU1kpIDsKKwlETUEoaW5zdGFuY2UpLT5DTlRSID0gMDsKKworCURNQShpbnN0YW5jZSktPkJBTksgPSAwOworCisJZXBjID0gKih1bnNpZ25lZCBzaG9ydCAqKShaVFdPX1ZBRERSKGFkZHJlc3MpICsgMHg4MDAwKTsKKworCS8qCisJICogQ2hlY2sgZm9yIDE0TUh6IFNDU0kgY2xvY2sKKwkgKi8KKwlyZWdzLlNBU1IgPSAmKERNQShpbnN0YW5jZSktPlNBU1IpOworCXJlZ3MuU0NNRCA9ICYoRE1BKGluc3RhbmNlKS0+U0NNRCk7CisJd2QzM2M5M19pbml0KGluc3RhbmNlLCByZWdzLCBkbWFfc2V0dXAsIGRtYV9zdG9wLAorCQkgICAgIChlcGMgJiBHVlBfU0NTSUNMS01BU0spID8gV0QzM0M5M19GU184XzEwCisJCQkJCSAgICAgOiBXRDMzQzkzX0ZTXzEyXzE1KTsKKworCXJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgZ3ZwMTFfaW50ciwgU0FfU0hJUlEsICJHVlAxMSBTQ1NJIiwKKwkJICAgIGluc3RhbmNlKTsKKwlETUEoaW5zdGFuY2UpLT5DTlRSID0gR1ZQMTFfRE1BQ19JTlRfRU5BQkxFOworCW51bV9ndnAxMSsrOworCWNvbnRpbnVlOworCityZWxlYXNlOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihhZGRyZXNzLCAyNTYpOworICAgIH0KKworICAgIHJldHVybiBudW1fZ3ZwMTE7Cit9CisKK3N0YXRpYyBpbnQgZ3ZwMTFfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqY21kKQoreworCS8qIEZJWE1FIHBlcmZvcm0gYnVzLXNwZWNpZmljIHJlc2V0ICovCisJd2QzM2M5M19ob3N0X3Jlc2V0KGNtZCk7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKworI2RlZmluZSBIT1NUU19DCisKKyNpbmNsdWRlICJndnAxMS5oIgorCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJHVlAxMSIsCisJLm5hbWUJCQk9ICJHVlAgU2VyaWVzIElJIFNDU0kiLAorCS5kZXRlY3QJCQk9IGd2cDExX2RldGVjdCwKKwkucmVsZWFzZQkJPSBndnAxMV9yZWxlYXNlLAorCS5xdWV1ZWNvbW1hbmQJCT0gd2QzM2M5M19xdWV1ZWNvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSB3ZDMzYzkzX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGd2cDExX2J1c19yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCT0gd2QzM2M5M19ob3N0X3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gQ0FOX1FVRVVFLAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQk9IENNRF9QRVJfTFVOLAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcKK307CisKKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKK2ludCBndnAxMV9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworI2lmZGVmIE1PRFVMRQorICAgIERNQShpbnN0YW5jZSktPkNOVFIgPSAwOworICAgIHJlbGVhc2VfbWVtX3JlZ2lvbihaVFdPX1BBRERSKGluc3RhbmNlLT5iYXNlKSwgMjU2KTsKKyAgICBmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGluc3RhbmNlKTsKKyAgICB3ZDMzYzkzX3JlbGVhc2UoKTsKKyNlbmRpZgorICAgIHJldHVybiAxOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZ3ZwMTEuaCBiL2RyaXZlcnMvc2NzaS9ndnAxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDhkOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZ3ZwMTEuaApAQCAtMCwwICsxLDYzIEBACisjaWZuZGVmIEdWUDExX0gKKworLyogJElkOiBndnAxMS5oLHYgMS40IDE5OTcvMDEvMTkgMjM6MDc6MTIgZGF2ZW0gRXhwICQKKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgdGhlIEdWUCBTZXJpZXMgSUkgU0NTSSBjb250cm9sbGVyIGZvciBMaW51eAorICoKKyAqIFdyaXR0ZW4gYW5kIChDKSAxOTkzLCBSYWxmIEJhZWNobGUsIHNlZSBndnAxMS5jIGZvciBtb3JlIGluZm8KKyAqIGJhc2VkIG9uIGEyMDkxLmggKEMpIDE5OTMgYnkgSGFtaXNoIE1hY2RvbmFsZAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworaW50IGd2cDExX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKik7CitpbnQgZ3ZwMTFfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICopOworY29uc3QgY2hhciAqd2QzM2M5M19pbmZvKHZvaWQpOworaW50IHdkMzNjOTNfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKK2ludCB3ZDMzYzkzX2Fib3J0KFNjc2lfQ21uZCAqKTsKK2ludCB3ZDMzYzkzX3Jlc2V0KFNjc2lfQ21uZCAqLCB1bnNpZ25lZCBpbnQpOworCisjaWZuZGVmIENNRF9QRVJfTFVOCisjZGVmaW5lIENNRF9QRVJfTFVOIDIKKyNlbmRpZgorCisjaWZuZGVmIENBTl9RVUVVRQorI2RlZmluZSBDQU5fUVVFVUUgMTYKKyNlbmRpZgorCisjaWZuZGVmIEhPU1RTX0MKKworLyoKKyAqIGlmIHRoZSB0cmFuc2ZlciBhZGRyZXNzIEFORGVkIHdpdGggdGhpcyByZXN1bHRzIGluIGEgbm9uLXplcm8KKyAqIHJlc3VsdCwgdGhlbiB3ZSBjYW4ndCB1c2UgRE1BLgorICovCisjZGVmaW5lIEdWUDExX1hGRVJfTUFTSyAgKDB4ZmYwMDAwMDEpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgcGFkMVs2NF07CisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgICAgIENOVFI7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDJbMzFdOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICAgICBTQVNSOworICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBwYWQzOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICAgICBTQ01EOworICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBwYWQ0WzRdOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICAgICBCQU5LOworICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBwYWQ1WzZdOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgICAgICBBQ1I7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgICAgIHNlY3JldDE7IC8qIHN0b3JlIDAgaGVyZSAqLworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICAgICBTVF9ETUE7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgICAgIFNQX0RNQTsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgICAgc2VjcmV0MjsgLyogc3RvcmUgMSBoZXJlICovCisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgICAgIHNlY3JldDM7IC8qIHN0b3JlIDE1IGhlcmUgKi8KK30gZ3ZwMTFfc2NzaXJlZ3M7CisKKy8qIGJpdHMgaW4gQ05UUiAqLworI2RlZmluZSBHVlAxMV9ETUFDX0JVU1kJCSgxPDwwKQorI2RlZmluZSBHVlAxMV9ETUFDX0lOVF9QRU5ESU5HCSgxPDwxKQorI2RlZmluZSBHVlAxMV9ETUFDX0lOVF9FTkFCTEUJKDE8PDMpCisjZGVmaW5lIEdWUDExX0RNQUNfRElSX1dSSVRFCSgxPDw0KQorCisjZW5kaWYgLyogZWxzZSBkZWYgSE9TVFNfQyAqLworCisjZW5kaWYgLyogR1ZQMTFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hvc3RzLmMgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTM0NzU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2hvc3RzLmMKQEAgLTAsMCArMSw0NjIgQEAKKy8qCisgKiAgaG9zdHMuYyBDb3B5cmlnaHQgKEMpIDE5OTIgRHJldyBFY2toYXJkdAorICogICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1IEVyaWMgWW91bmdkYWxlCisgKiAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBDaHJpc3RvcGggSGVsbHdpZworICoKKyAqICBtaWQgdG8gbG93bGV2ZWwgU0NTSSBkcml2ZXIgaW50ZXJmYWNlCisgKiAgICAgIEluaXRpYWwgdmVyc2lvbnM6IERyZXcgRWNraGFyZHQKKyAqICAgICAgU3Vic2VxdWVudCByZXZpc2lvbnM6IEVyaWMgWW91bmdkYWxlCisgKgorICogIDxkcmV3QGNvbG9yYWRvLmVkdT4KKyAqCisgKiAgSmlmZmllcyB3cmFwIGZpeGVzIChob3N0LT5yZXNldHRpbmcpLCAzIERlYyAxOTk4IEFuZHJlYSBBcmNhbmdlbGkKKyAqICBBZGRlZCBRTE9HSUMgUUxBMTI4MCBTQ1NJIGNvbnRyb2xsZXIga2VybmVsIGhvc3Qgc3VwcG9ydC4gCisgKiAgICAgQXVndXN0IDQsIDE5OTkgRnJlZCBMZXdpcywgSW50ZWwgRHVQb250CisgKgorICogIFVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgbmV3IGluaXRpYWxpemF0aW9uIHNjaGVtZSBmb3IgdGhlIGhpZ2hlciAKKyAqICBsZXZlbCBvZiBzY3NpIGRyaXZlcnMgKHNkL3NyL3N0KQorICogIFNlcHRlbWJlciAxNywgMjAwMCBUb3JiZW4gTWF0aGlhc2VuIDx0bW1AaW1hZ2UuZGs+CisgKgorICogIFJlc3RydWN0dXJlZCBzY3NpX2hvc3QgbGlzdHMgYW5kIGFzc29jaWF0ZWQgZnVuY3Rpb25zLgorICogIFNlcHRlbWJlciAwNCwgMjAwMiBNaWtlIEFuZGVyc29uIChhbmRtaWtlQHVzLmlibS5jb20pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC90cmFuc3BvcnRfY2xhc3MuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KKworI2luY2x1ZGUgInNjc2lfcHJpdi5oIgorI2luY2x1ZGUgInNjc2lfbG9nZ2luZy5oIgorCisKK3N0YXRpYyBpbnQgc2NzaV9ob3N0X25leHRfaG47CQkvKiBob3N0X25vIGZvciBuZXh0IG5ldyBob3N0ICovCisKKworc3RhdGljIHZvaWQgc2NzaV9ob3N0X2Nsc19yZWxlYXNlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldikKK3sKKwlwdXRfZGV2aWNlKCZjbGFzc190b19zaG9zdChjbGFzc19kZXYpLT5zaG9zdF9nZW5kZXYpOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzIHNob3N0X2NsYXNzID0geworCS5uYW1lCQk9ICJzY3NpX2hvc3QiLAorCS5yZWxlYXNlCT0gc2NzaV9ob3N0X2Nsc19yZWxlYXNlLAorfTsKKworLyoqCisgKiBzY3NpX2hvc3RfY2FuY2VsIC0gY2FuY2VsIG91dHN0YW5kaW5nIElPIHRvIHRoaXMgaG9zdAorICogQHNob3N0Oglwb2ludGVyIHRvIHN0cnVjdCBTY3NpX0hvc3QKKyAqIHJlY292ZXJ5OglyZWNvdmVyeSByZXF1ZXN0ZWQgdG8gcnVuLgorICoqLwordm9pZCBzY3NpX2hvc3RfY2FuY2VsKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBpbnQgcmVjb3ZlcnkpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCisJc2V0X2JpdChTSE9TVF9DQU5DRUwsICZzaG9zdC0+c2hvc3Rfc3RhdGUpOworCXNob3N0X2Zvcl9lYWNoX2RldmljZShzZGV2LCBzaG9zdCkgeworCQlzY3NpX2RldmljZV9jYW5jZWwoc2RldiwgcmVjb3ZlcnkpOworCX0KKwl3YWl0X2V2ZW50KHNob3N0LT5ob3N0X3dhaXQsICghdGVzdF9iaXQoU0hPU1RfUkVDT1ZFUlksCisJCQkJCQkmc2hvc3QtPnNob3N0X3N0YXRlKSkpOworfQorCisvKioKKyAqIHNjc2lfcmVtb3ZlX2hvc3QgLSByZW1vdmUgYSBzY3NpIGhvc3QKKyAqIEBzaG9zdDoJYSBwb2ludGVyIHRvIGEgc2NzaSBob3N0IHRvIHJlbW92ZQorICoqLwordm9pZCBzY3NpX3JlbW92ZV9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXNjc2lfZm9yZ2V0X2hvc3Qoc2hvc3QpOworCXNjc2lfaG9zdF9jYW5jZWwoc2hvc3QsIDApOworCXNjc2lfcHJvY19ob3N0X3JtKHNob3N0KTsKKworCXNldF9iaXQoU0hPU1RfREVMLCAmc2hvc3QtPnNob3N0X3N0YXRlKTsKKworCXRyYW5zcG9ydF91bnJlZ2lzdGVyX2RldmljZSgmc2hvc3QtPnNob3N0X2dlbmRldik7CisJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoJnNob3N0LT5zaG9zdF9jbGFzc2Rldik7CisJZGV2aWNlX2RlbCgmc2hvc3QtPnNob3N0X2dlbmRldik7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfcmVtb3ZlX2hvc3QpOworCisvKioKKyAqIHNjc2lfYWRkX2hvc3QgLSBhZGQgYSBzY3NpIGhvc3QKKyAqIEBzaG9zdDoJc2NzaSBob3N0IHBvaW50ZXIgdG8gYWRkCisgKiBAZGV2OglhIHN0cnVjdCBkZXZpY2Ugb2YgdHlwZSBzY3NpIGNsYXNzCisgKgorICogUmV0dXJuIHZhbHVlOiAKKyAqIAkwIG9uIHN1Y2Nlc3MgLyAhPSAwIGZvciBlcnJvcgorICoqLworaW50IHNjc2lfYWRkX2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQgPSBzaG9zdC0+aG9zdHQ7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKworCXByaW50ayhLRVJOX0lORk8gInNjc2klZCA6ICVzXG4iLCBzaG9zdC0+aG9zdF9ubywKKwkJCXNodC0+aW5mbyA/IHNodC0+aW5mbyhzaG9zdCkgOiBzaHQtPm5hbWUpOworCisJaWYgKCFzaG9zdC0+Y2FuX3F1ZXVlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbl9xdWV1ZSA9IDAgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuIiwKKwkJCQlzaHQtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXNob3N0LT5zaG9zdF9nZW5kZXYucGFyZW50KQorCQlzaG9zdC0+c2hvc3RfZ2VuZGV2LnBhcmVudCA9IGRldiA/IGRldiA6ICZwbGF0Zm9ybV9idXM7CisKKwllcnJvciA9IGRldmljZV9hZGQoJnNob3N0LT5zaG9zdF9nZW5kZXYpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwlzZXRfYml0KFNIT1NUX0FERCwgJnNob3N0LT5zaG9zdF9zdGF0ZSk7CisJZ2V0X2RldmljZShzaG9zdC0+c2hvc3RfZ2VuZGV2LnBhcmVudCk7CisKKwllcnJvciA9IGNsYXNzX2RldmljZV9hZGQoJnNob3N0LT5zaG9zdF9jbGFzc2Rldik7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9kZWxfZ2VuZGV2OworCisJZ2V0X2RldmljZSgmc2hvc3QtPnNob3N0X2dlbmRldik7CisKKwlpZiAoc2hvc3QtPnRyYW5zcG9ydHQtPmhvc3Rfc2l6ZSAmJgorCSAgICAoc2hvc3QtPnNob3N0X2RhdGEgPSBrbWFsbG9jKHNob3N0LT50cmFuc3BvcnR0LT5ob3N0X3NpemUsCisJCQkJCSBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJZ290byBvdXRfZGVsX2NsYXNzZGV2OworCisJaWYgKHNob3N0LT50cmFuc3BvcnR0LT5jcmVhdGVfd29ya19xdWV1ZSkgeworCQlzbnByaW50ZihzaG9zdC0+d29ya19xX25hbWUsIEtPQkpfTkFNRV9MRU4sICJzY3NpX3dxXyVkIiwKKwkJCXNob3N0LT5ob3N0X25vKTsKKwkJc2hvc3QtPndvcmtfcSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKAorCQkJCQlzaG9zdC0+d29ya19xX25hbWUpOworCQlpZiAoIXNob3N0LT53b3JrX3EpCisJCQlnb3RvIG91dF9mcmVlX3Nob3N0X2RhdGE7CisJfQorCisJZXJyb3IgPSBzY3NpX3N5c2ZzX2FkZF9ob3N0KHNob3N0KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2Rlc3Ryb3lfaG9zdDsKKworCXNjc2lfcHJvY19ob3N0X2FkZChzaG9zdCk7CisJcmV0dXJuIGVycm9yOworCisgb3V0X2Rlc3Ryb3lfaG9zdDoKKwlpZiAoc2hvc3QtPndvcmtfcSkKKwkJZGVzdHJveV93b3JrcXVldWUoc2hvc3QtPndvcmtfcSk7Cisgb3V0X2ZyZWVfc2hvc3RfZGF0YToKKwlrZnJlZShzaG9zdC0+c2hvc3RfZGF0YSk7Cisgb3V0X2RlbF9jbGFzc2RldjoKKwljbGFzc19kZXZpY2VfZGVsKCZzaG9zdC0+c2hvc3RfY2xhc3NkZXYpOworIG91dF9kZWxfZ2VuZGV2OgorCWRldmljZV9kZWwoJnNob3N0LT5zaG9zdF9nZW5kZXYpOworIG91dDoKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfYWRkX2hvc3QpOworCitzdGF0aWMgdm9pZCBzY3NpX2hvc3RfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KGRldik7CisJc3RydWN0IGRldmljZSAqcGFyZW50ID0gZGV2LT5wYXJlbnQ7CisKKwlpZiAoc2hvc3QtPmVoYW5kbGVyKSB7CisJCURFQ0xBUkVfQ09NUExFVElPTihzZW0pOworCQlzaG9zdC0+ZWhfbm90aWZ5ID0gJnNlbTsKKwkJc2hvc3QtPmVoX2tpbGwgPSAxOworCQl1cChzaG9zdC0+ZWhfd2FpdCk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnNlbSk7CisJCXNob3N0LT5laF9ub3RpZnkgPSBOVUxMOworCX0KKworCWlmIChzaG9zdC0+d29ya19xKQorCQlkZXN0cm95X3dvcmtxdWV1ZShzaG9zdC0+d29ya19xKTsKKworCXNjc2lfcHJvY19ob3N0ZGlyX3JtKHNob3N0LT5ob3N0dCk7CisJc2NzaV9kZXN0cm95X2NvbW1hbmRfZnJlZWxpc3Qoc2hvc3QpOworCWtmcmVlKHNob3N0LT5zaG9zdF9kYXRhKTsKKworCS8qCisJICogU29tZSBkcml2ZXJzIChlZyBhaGExNTQyKSBkbyBzY3NpX3JlZ2lzdGVyKCkvc2NzaV91bnJlZ2lzdGVyKCkKKwkgKiBkdXJpbmcgcHJvYmluZyB3aXRob3V0IHBlcmZvcm1pbmcgYSBzY3NpX3NldF9kZXZpY2UoKSBpbiBiZXR3ZWVuLgorCSAqIEluIHRoaXMgY2FzZSBkZXYtPnBhcmVudCBpcyBOVUxMLgorCSAqLworCWlmIChwYXJlbnQpCisJCXB1dF9kZXZpY2UocGFyZW50KTsKKwlrZnJlZShzaG9zdCk7Cit9CisKKy8qKgorICogc2NzaV9ob3N0X2FsbG9jIC0gcmVnaXN0ZXIgYSBzY3NpIGhvc3QgYWRhcHRlciBpbnN0YW5jZS4KKyAqIEBzaHQ6CXBvaW50ZXIgdG8gc2NzaSBob3N0IHRlbXBsYXRlCisgKiBAcHJpdnNpemU6CWV4dHJhIGJ5dGVzIHRvIGFsbG9jYXRlIGZvciBkcml2ZXIKKyAqCisgKiBOb3RlOgorICogCUFsbG9jYXRlIGEgbmV3IFNjc2lfSG9zdCBhbmQgcGVyZm9ybSBiYXNpYyBpbml0aWFsaXphdGlvbi4KKyAqIAlUaGUgaG9zdCBpcyBub3QgcHVibGlzaGVkIHRvIHRoZSBzY3NpIG1pZGxheWVyIHVudGlsIHNjc2lfYWRkX2hvc3QKKyAqIAlpcyBjYWxsZWQuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCVBvaW50ZXIgdG8gYSBuZXcgU2NzaV9Ib3N0CisgKiovCitzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX2hvc3RfYWxsb2Moc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0LCBpbnQgcHJpdnNpemUpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJaW50IGdmcF9tYXNrID0gR0ZQX0tFUk5FTCwgcnZhbDsKKwlERUNMQVJFX0NPTVBMRVRJT04oY29tcGxldGUpOworCisJaWYgKHNodC0+dW5jaGVja2VkX2lzYV9kbWEgJiYgcHJpdnNpemUpCisJCWdmcF9tYXNrIHw9IF9fR0ZQX0RNQTsKKworICAgICAgICAvKiBDaGVjayB0byBzZWUgaWYgdGhpcyBob3N0IGhhcyBhbnkgZXJyb3IgaGFuZGxpbmcgZmFjaWxpdGllcyAqLworICAgICAgICBpZiAoIXNodC0+ZWhfc3RyYXRlZ3lfaGFuZGxlciAmJiAhc2h0LT5laF9hYm9ydF9oYW5kbGVyICYmCisJICAgICFzaHQtPmVoX2RldmljZV9yZXNldF9oYW5kbGVyICYmICFzaHQtPmVoX2J1c19yZXNldF9oYW5kbGVyICYmCisgICAgICAgICAgICAhc2h0LT5laF9ob3N0X3Jlc2V0X2hhbmRsZXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogU0NTSSBob3N0IGAlcycgaGFzIG5vIGVycm9yIGhhbmRsaW5nXG4iCisJCQkJIkVSUk9SOiBUaGlzIGlzIG5vdCBhIHNhZmUgd2F5IHRvIHJ1biB5b3VyICIKKwkJCQkgICAgICAgICJTQ1NJIGhvc3RcbiIKKwkJCQkiRVJST1I6IFRoZSBlcnJvciBoYW5kbGluZyBtdXN0IGJlIGFkZGVkIHRvICIKKwkJCQkidGhpcyBkcml2ZXJcbiIsIHNodC0+cHJvY19uYW1lKTsKKwkJZHVtcF9zdGFjaygpOworICAgICAgICB9CisKKwlzaG9zdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBTY3NpX0hvc3QpICsgcHJpdnNpemUsIGdmcF9tYXNrKTsKKwlpZiAoIXNob3N0KQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoc2hvc3QsIDAsIHNpemVvZihzdHJ1Y3QgU2NzaV9Ib3N0KSArIHByaXZzaXplKTsKKworCXNwaW5fbG9ja19pbml0KCZzaG9zdC0+ZGVmYXVsdF9sb2NrKTsKKwlzY3NpX2Fzc2lnbl9sb2NrKHNob3N0LCAmc2hvc3QtPmRlZmF1bHRfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnNob3N0LT5fX2RldmljZXMpOworCUlOSVRfTElTVF9IRUFEKCZzaG9zdC0+X190YXJnZXRzKTsKKwlJTklUX0xJU1RfSEVBRCgmc2hvc3QtPmVoX2NtZF9xKTsKKwlJTklUX0xJU1RfSEVBRCgmc2hvc3QtPnN0YXJ2ZWRfbGlzdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmc2hvc3QtPmhvc3Rfd2FpdCk7CisKKwlpbml0X01VVEVYKCZzaG9zdC0+c2Nhbl9tdXRleCk7CisKKwlzaG9zdC0+aG9zdF9ubyA9IHNjc2lfaG9zdF9uZXh0X2huKys7IC8qIFhYWChoY2gpOiBzdGlsbCByYWN5ICovCisJc2hvc3QtPmRtYV9jaGFubmVsID0gMHhmZjsKKworCS8qIFRoZXNlIHRocmVlIGFyZSBkZWZhdWx0IHZhbHVlcyB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiAqLworCXNob3N0LT5tYXhfY2hhbm5lbCA9IDA7CisJc2hvc3QtPm1heF9pZCA9IDg7CisJc2hvc3QtPm1heF9sdW4gPSA4OworCisJLyogR2l2ZSBlYWNoIHNob3N0IGEgZGVmYXVsdCB0cmFuc3BvcnR0ICovCisJc2hvc3QtPnRyYW5zcG9ydHQgPSAmYmxhbmtfdHJhbnNwb3J0X3RlbXBsYXRlOworCisJLyoKKwkgKiBBbGwgZHJpdmVycyByaWdodCBub3cgc2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIDEyIGJ5dGUKKwkgKiBjb21tYW5kcy4gIEV2ZXJ5IHNvIG9mdGVuIHRoZXJlIGFyZSByZXF1ZXN0cyBmb3IgMTYgYnl0ZQorCSAqIGNvbW1hbmRzLCBidXQgaW5kaXZpZHVhbCBsb3ctbGV2ZWwgZHJpdmVycyBuZWVkIHRvIGNlcnRpZnkgdGhhdAorCSAqIHRoZXkgYWN0dWFsbHkgZG8gc29tZXRoaW5nIHNlbnNpYmxlIHdpdGggc3VjaCBjb21tYW5kcy4KKwkgKi8KKwlzaG9zdC0+bWF4X2NtZF9sZW4gPSAxMjsKKwlzaG9zdC0+aG9zdHQgPSBzaHQ7CisJc2hvc3QtPnRoaXNfaWQgPSBzaHQtPnRoaXNfaWQ7CisJc2hvc3QtPmNhbl9xdWV1ZSA9IHNodC0+Y2FuX3F1ZXVlOworCXNob3N0LT5zZ190YWJsZXNpemUgPSBzaHQtPnNnX3RhYmxlc2l6ZTsKKwlzaG9zdC0+Y21kX3Blcl9sdW4gPSBzaHQtPmNtZF9wZXJfbHVuOworCXNob3N0LT51bmNoZWNrZWRfaXNhX2RtYSA9IHNodC0+dW5jaGVja2VkX2lzYV9kbWE7CisJc2hvc3QtPnVzZV9jbHVzdGVyaW5nID0gc2h0LT51c2VfY2x1c3RlcmluZzsKKwlzaG9zdC0+b3JkZXJlZF9mbHVzaCA9IHNodC0+b3JkZXJlZF9mbHVzaDsKKwlzaG9zdC0+b3JkZXJlZF90YWcgPSBzaHQtPm9yZGVyZWRfdGFnOworCisJLyoKKwkgKiBob3N0cy9kZXZpY2VzIHRoYXQgZG8gcXVldWVpbmcgbXVzdCBzdXBwb3J0IG9yZGVyZWQgdGFncworCSAqLworCWlmIChzaG9zdC0+Y2FuX3F1ZXVlID4gMSAmJiBzaG9zdC0+b3JkZXJlZF9mbHVzaCkgeworCQlwcmludGsoS0VSTl9FUlIgInNjc2k6IG9yZGVyZWQgZmx1c2hlcyBkb24ndCBzdXBwb3J0IHF1ZXVlaW5nXG4iKTsKKwkJc2hvc3QtPm9yZGVyZWRfZmx1c2ggPSAwOworCX0KKworCWlmIChzaHQtPm1heF9ob3N0X2Jsb2NrZWQpCisJCXNob3N0LT5tYXhfaG9zdF9ibG9ja2VkID0gc2h0LT5tYXhfaG9zdF9ibG9ja2VkOworCWVsc2UKKwkJc2hvc3QtPm1heF9ob3N0X2Jsb2NrZWQgPSBTQ1NJX0RFRkFVTFRfSE9TVF9CTE9DS0VEOworCisJLyoKKwkgKiBJZiB0aGUgZHJpdmVyIGltcG9zZXMgbm8gaGFyZCBzZWN0b3IgdHJhbnNmZXIgbGltaXQsIHN0YXJ0IGF0CisJICogbWFjaGluZSBpbmZpbml0eSBpbml0aWFsbHkuCisJICovCisJaWYgKHNodC0+bWF4X3NlY3RvcnMpCisJCXNob3N0LT5tYXhfc2VjdG9ycyA9IHNodC0+bWF4X3NlY3RvcnM7CisJZWxzZQorCQlzaG9zdC0+bWF4X3NlY3RvcnMgPSBTQ1NJX0RFRkFVTFRfTUFYX1NFQ1RPUlM7CisKKwkvKgorCSAqIGFzc3VtZSBhIDRHQiBib3VuZGFyeSwgaWYgbm90IHNldAorCSAqLworCWlmIChzaHQtPmRtYV9ib3VuZGFyeSkKKwkJc2hvc3QtPmRtYV9ib3VuZGFyeSA9IHNodC0+ZG1hX2JvdW5kYXJ5OworCWVsc2UKKwkJc2hvc3QtPmRtYV9ib3VuZGFyeSA9IDB4ZmZmZmZmZmY7CisKKwlydmFsID0gc2NzaV9zZXR1cF9jb21tYW5kX2ZyZWVsaXN0KHNob3N0KTsKKwlpZiAocnZhbCkKKwkJZ290byBmYWlsX2tmcmVlOworCisJZGV2aWNlX2luaXRpYWxpemUoJnNob3N0LT5zaG9zdF9nZW5kZXYpOworCXNucHJpbnRmKHNob3N0LT5zaG9zdF9nZW5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgImhvc3QlZCIsCisJCXNob3N0LT5ob3N0X25vKTsKKwlzaG9zdC0+c2hvc3RfZ2VuZGV2LnJlbGVhc2UgPSBzY3NpX2hvc3RfZGV2X3JlbGVhc2U7CisKKwljbGFzc19kZXZpY2VfaW5pdGlhbGl6ZSgmc2hvc3QtPnNob3N0X2NsYXNzZGV2KTsKKwlzaG9zdC0+c2hvc3RfY2xhc3NkZXYuZGV2ID0gJnNob3N0LT5zaG9zdF9nZW5kZXY7CisJc2hvc3QtPnNob3N0X2NsYXNzZGV2LmNsYXNzID0gJnNob3N0X2NsYXNzOworCXNucHJpbnRmKHNob3N0LT5zaG9zdF9jbGFzc2Rldi5jbGFzc19pZCwgQlVTX0lEX1NJWkUsICJob3N0JWQiLAorCQkgIHNob3N0LT5ob3N0X25vKTsKKworCXNob3N0LT5laF9ub3RpZnkgPSAmY29tcGxldGU7CisJcnZhbCA9IGtlcm5lbF90aHJlYWQoc2NzaV9lcnJvcl9oYW5kbGVyLCBzaG9zdCwgMCk7CisJaWYgKHJ2YWwgPCAwKQorCQlnb3RvIGZhaWxfZGVzdHJveV9mcmVlbGlzdDsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wbGV0ZSk7CisJc2hvc3QtPmVoX25vdGlmeSA9IE5VTEw7CisKKwlzY3NpX3Byb2NfaG9zdGRpcl9hZGQoc2hvc3QtPmhvc3R0KTsKKwlyZXR1cm4gc2hvc3Q7CisKKyBmYWlsX2Rlc3Ryb3lfZnJlZWxpc3Q6CisJc2NzaV9kZXN0cm95X2NvbW1hbmRfZnJlZWxpc3Qoc2hvc3QpOworIGZhaWxfa2ZyZWU6CisJa2ZyZWUoc2hvc3QpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChzY3NpX2hvc3RfYWxsb2MpOworCitzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX3JlZ2lzdGVyKHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCwgaW50IHByaXZzaXplKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gc2NzaV9ob3N0X2FsbG9jKHNodCwgcHJpdnNpemUpOworCisJaWYgKCFzaHQtPmRldGVjdCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpX3JlZ2lzdGVyKCkgY2FsbGVkIG9uIG5ldy1zdHlsZSAiCisJCQkJICAgICJ0ZW1wbGF0ZSBmb3IgZHJpdmVyICVzXG4iLCBzaHQtPm5hbWUpOworCQlkdW1wX3N0YWNrKCk7CisJfQorCisJaWYgKHNob3N0KQorCQlsaXN0X2FkZF90YWlsKCZzaG9zdC0+c2h0X2xlZ2FjeV9saXN0LCAmc2h0LT5sZWdhY3lfaG9zdHMpOworCXJldHVybiBzaG9zdDsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9yZWdpc3Rlcik7CisKK3ZvaWQgc2NzaV91bnJlZ2lzdGVyKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCWxpc3RfZGVsKCZzaG9zdC0+c2h0X2xlZ2FjeV9saXN0KTsKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV91bnJlZ2lzdGVyKTsKKworLyoqCisgKiBzY3NpX2hvc3RfbG9va3VwIC0gZ2V0IGEgcmVmZXJlbmNlIHRvIGEgU2NzaV9Ib3N0IGJ5IGhvc3Qgbm8KKyAqCisgKiBAaG9zdG51bToJaG9zdCBudW1iZXIgdG8gbG9jYXRlCisgKgorICogUmV0dXJuIHZhbHVlOgorICoJQSBwb2ludGVyIHRvIGxvY2F0ZWQgU2NzaV9Ib3N0IG9yIE5VTEwuCisgKiovCitzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX2hvc3RfbG9va3VwKHVuc2lnbmVkIHNob3J0IGhvc3RudW0pCit7CisJc3RydWN0IGNsYXNzICpjbGFzcyA9ICZzaG9zdF9jbGFzczsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2OworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gRVJSX1BUUigtRU5YSU8pLCAqcDsKKworCWRvd25fcmVhZCgmY2xhc3MtPnN1YnN5cy5yd3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZGV2LCAmY2xhc3MtPmNoaWxkcmVuLCBub2RlKSB7CisJCXAgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwkJaWYgKHAtPmhvc3Rfbm8gPT0gaG9zdG51bSkgeworCQkJc2hvc3QgPSBzY3NpX2hvc3RfZ2V0KHApOworCQkJYnJlYWs7CisJCX0KKwl9CisJdXBfcmVhZCgmY2xhc3MtPnN1YnN5cy5yd3NlbSk7CisKKwlyZXR1cm4gc2hvc3Q7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfaG9zdF9sb29rdXApOworCisvKioKKyAqIHNjc2lfaG9zdF9nZXQgLSBpbmMgYSBTY3NpX0hvc3QgcmVmIGNvdW50CisgKiBAc2hvc3Q6CVBvaW50ZXIgdG8gU2NzaV9Ib3N0IHRvIGluYy4KKyAqKi8KK3N0cnVjdCBTY3NpX0hvc3QgKnNjc2lfaG9zdF9nZXQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJaWYgKHRlc3RfYml0KFNIT1NUX0RFTCwgJnNob3N0LT5zaG9zdF9zdGF0ZSkgfHwKKwkJIWdldF9kZXZpY2UoJnNob3N0LT5zaG9zdF9nZW5kZXYpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gc2hvc3Q7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfaG9zdF9nZXQpOworCisvKioKKyAqIHNjc2lfaG9zdF9wdXQgLSBkZWMgYSBTY3NpX0hvc3QgcmVmIGNvdW50CisgKiBAc2hvc3Q6CVBvaW50ZXIgdG8gU2NzaV9Ib3N0IHRvIGRlYy4KKyAqKi8KK3ZvaWQgc2NzaV9ob3N0X3B1dChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlwdXRfZGV2aWNlKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9ob3N0X3B1dCk7CisKK2ludCBzY3NpX2luaXRfaG9zdHModm9pZCkKK3sKKwlyZXR1cm4gY2xhc3NfcmVnaXN0ZXIoJnNob3N0X2NsYXNzKTsKK30KKwordm9pZCBzY3NpX2V4aXRfaG9zdHModm9pZCkKK3sKKwljbGFzc191bnJlZ2lzdGVyKCZzaG9zdF9jbGFzcyk7Cit9CisKK2ludCBzY3NpX2lzX2hvc3RfZGV2aWNlKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2LT5yZWxlYXNlID09IHNjc2lfaG9zdF9kZXZfcmVsZWFzZTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9pc19ob3N0X2RldmljZSk7CisKKy8qKgorICogc2NzaV9xdWV1ZV93b3JrIC0gUXVldWUgd29yayB0byB0aGUgU2NzaV9Ib3N0IHdvcmtxdWV1ZS4KKyAqIEBzaG9zdDoJUG9pbnRlciB0byBTY3NpX0hvc3QuCisgKiBAd29yazoJV29yayB0byBxdWV1ZSBmb3IgZXhlY3V0aW9uLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkwIG9uIHN1Y2Nlc3MgLyAhPSAwIGZvciBlcnJvcgorICoqLworaW50IHNjc2lfcXVldWVfd29yayhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWlmICh1bmxpa2VseSghc2hvc3QtPndvcmtfcSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiRVJST1I6IFNjc2kgaG9zdCAnJXMnIGF0dGVtcHRlZCB0byBxdWV1ZSBzY3NpLXdvcmssICIKKwkJCSJ3aGVuIG5vIHdvcmtxdWV1ZSBjcmVhdGVkLlxuIiwgc2hvc3QtPmhvc3R0LT5uYW1lKTsKKwkJZHVtcF9zdGFjaygpOworCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBxdWV1ZV93b3JrKHNob3N0LT53b3JrX3EsIHdvcmspOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2NzaV9xdWV1ZV93b3JrKTsKKworLyoqCisgKiBzY3NpX2ZsdXNoX3dvcmsgLSBGbHVzaCBhIFNjc2lfSG9zdCdzIHdvcmtxdWV1ZS4KKyAqIEBzaG9zdDoJUG9pbnRlciB0byBTY3NpX0hvc3QuCisgKiovCit2b2lkIHNjc2lfZmx1c2hfd29yayhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpZiAoIXNob3N0LT53b3JrX3EpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiRVJST1I6IFNjc2kgaG9zdCAnJXMnIGF0dGVtcHRlZCB0byBmbHVzaCBzY3NpLXdvcmssICIKKwkJCSJ3aGVuIG5vIHdvcmtxdWV1ZSBjcmVhdGVkLlxuIiwgc2hvc3QtPmhvc3R0LT5uYW1lKTsKKwkJZHVtcF9zdGFjaygpOworCQlyZXR1cm47CisJfQorCisJZmx1c2hfd29ya3F1ZXVlKHNob3N0LT53b3JrX3EpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2NzaV9mbHVzaF93b3JrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ob3N0cy5oIGIvZHJpdmVycy9zY3NpL2hvc3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI3MjY0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9ob3N0cy5oCkBAIC0wLDAgKzEsMiBAQAorI3dhcm5pbmcgIlRoaXMgZmlsZSBpcyBvYnNvbGV0ZSwgcGxlYXNlIHVzZSA8c2NzaS9zY3NpX2hvc3QuaD4gaW5zdGVhZCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libW1jYS5jIGIvZHJpdmVycy9zY3NpL2libW1jYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZmRlYWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaWJtbWNhLmMKQEAgLTAsMCArMSwyNDkxIEBACisvKgorIExvdyBMZXZlbCBMaW51eCBEcml2ZXIgZm9yIHRoZSBJQk0gTWljcm9jaGFubmVsIFNDU0kgU3Vic3lzdGVtIGZvcgorIExpbnV4IEtlcm5lbCA+PSAyLjQuMC4KKyBDb3B5cmlnaHQgKGMpIDE5OTUgU3Ryb20gU3lzdGVtcywgSW5jLiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuIFdyaXR0ZW4gYnkgTWFydGluIEtvbGluZWssIERlY2VtYmVyIDE5OTUuCisgRnVydGhlciBkZXZlbG9wbWVudCBieTogQ2hyaXMgQmVhdXJlZ2FyZCwgS2xhdXMgS3VkaWVsa2EsIE1pY2hhZWwgTGFuZworIFNlZSB0aGUgZmlsZSBEb2N1bWVudGF0aW9uL3Njc2kvaWJtbWNhLnR4dCBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbgorIG9mIHRoaXMgZHJpdmVyLCB0aGUgY29tbWFuZGxpbmUgYXJndW1lbnRzIGFuZCB0aGUgaGlzdG9yeSBvZiBpdHMKKyBkZXZlbG9wbWVudC4KKyBTZWUgdGhlIFdXVy1wYWdlOiBodHRwOi8vd3d3LnVuaS1tYWluei5kZS9+bGFuZ20wMDAvbGludXguaHRtbCBmb3IgbGF0ZXN0CisgdXBkYXRlcywgaW5mbyBhbmQgQURGLWZpbGVzIGZvciBhZGFwdGVycyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuCisKKyBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorIFVwZGF0ZWQgZm9yIExpbnV4IDIuNS40NSB0byB1c2UgdGhlIG5ldyBlcnJvciBoYW5kbGVyLCBjbGVhbmVkIHVwIHRoZQorIGxvY2sgbWFjcm9zIGFuZCBkaWQgYSBmZXcgdW5hdm9pZGFibGUgbG9ja2luZyB0d2Vha3MsIHBsdXMgb25lIGxvY2tpbmcKKyBmaXggaW4gdGhlIGlycSBhbmQgY29tcGxldGlvbiBwYXRoLgorIAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpZm5kZWYgTElOVVhfVkVSU0lPTl9DT0RFCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2VuZGlmCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDQ1KQorI2Vycm9yICJUaGlzIGRyaXZlciB3b3JrcyBvbmx5IHdpdGgga2VybmVsIDIuNS40NSBvciBoaWdoZXIhIgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EtbGVnYWN5Lmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJpYm1tY2EuaCIKKworLyogY3VycmVudCB2ZXJzaW9uIG9mIHRoaXMgZHJpdmVyLXNvdXJjZTogKi8KKyNkZWZpbmUgSUJNTUNBX1NDU0lfRFJJVkVSX1ZFUlNJT04gIjQuMGItYWMiCisKKy8qIGRyaXZlciBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIElNX01BWF9IT1NUUyAgICAgOAkvKiBtYXhpbXVtIG51bWJlciBvZiBob3N0IGFkYXB0ZXJzICovCisjZGVmaW5lIElNX1JFU0VUX0RFTEFZCTYwCS8qIHNlY29uZHMgYWxsb3dlZCBmb3IgYSByZXNldCAqLworCisvKiBkcml2ZXIgZGVidWdnaW5nIC0gI3VuZGVmIGFsbCBmb3Igbm9ybWFsIG9wZXJhdGlvbiAqLworLyogaWYgZGVmaW5lZDogY291bnQgaW50ZXJydXB0cyBhbmQgaWdub3JlIHRoaXMgc3BlY2lhbCBvbmU6ICovCisjdW5kZWYJSU1fREVCVUdfVElNRU9VVAkvLzUwCisjZGVmaW5lIFRJTUVPVVRfUFVOCTAKKyNkZWZpbmUgVElNRU9VVF9MVU4JMAorLyogdmVyYm9zZSBpbnRlcnJ1cHQ6ICovCisjdW5kZWYgSU1fREVCVUdfSU5UCisvKiB2ZXJib3NlIHF1ZXVlY29tbWFuZDogKi8KKyN1bmRlZiBJTV9ERUJVR19DTUQKKy8qIHZlcmJvc2UgcXVldWNvbW1hbmQgZm9yIHNwZWNpZmljIFNDU0ktZGV2aWNlIHR5cGU6ICovCisjdW5kZWYgSU1fREVCVUdfQ01EX1NQRUNfREVWCisvKiB2ZXJib3NlIGRldmljZSBwcm9iaW5nICovCisjdW5kZWYgSU1fREVCVUdfUFJPQkUKKworLyogZGV2aWNlIHR5cGUgdGhhdCBzaGFsbCBiZSBkaXNwbGF5ZWQgb24gc3lzbG9nIChvbmx5IGR1cmluZyBkZWJ1Z2dpbmcpOiAqLworI2RlZmluZSBJTV9ERUJVR19DTURfREVWSUNFCVRZUEVfVEFQRQorCisvKiByZWxhdGl2ZSBhZGRyZXNzZXMgb2YgaGFyZHdhcmUgcmVnaXN0ZXJzIG9uIGEgc3Vic3lzdGVtICovCisjZGVmaW5lIElNX0NNRF9SRUcoaGkpCShob3N0c1soaGkpXS0+aW9fcG9ydCkJLypDb21tYW5kIEludGVyZmFjZSwgKDQgYnl0ZXMgbG9uZykgKi8KKyNkZWZpbmUgSU1fQVRUTl9SRUcoaGkpCShob3N0c1soaGkpXS0+aW9fcG9ydCs0KQkvKkF0dGVudGlvbiAoMSBieXRlKSAqLworI2RlZmluZSBJTV9DVFJfUkVHKGhpKQkoaG9zdHNbKGhpKV0tPmlvX3BvcnQrNSkJLypCYXNpYyBDb250cm9sICgxIGJ5dGUpICovCisjZGVmaW5lIElNX0lOVFJfUkVHKGhpKQkoaG9zdHNbKGhpKV0tPmlvX3BvcnQrNikJLypJbnRlcnJ1cHQgU3RhdHVzICgxIGJ5dGUsIHIvbykgKi8KKyNkZWZpbmUgSU1fU1RBVF9SRUcoaGkpCShob3N0c1soaGkpXS0+aW9fcG9ydCs3KQkvKkJhc2ljIFN0YXR1cyAoMSBieXRlLCByZWFkIG9ubHkpICovCisKKy8qIGJhc2ljIEkvTy1wb3J0IG9mIGZpcnN0IGFkYXB0ZXIgKi8KKyNkZWZpbmUgSU1fSU9fUE9SVAkweDM1NDAKKy8qIG1heGltdW0gbnVtYmVyIG9mIGhvc3RzIHRoYXQgY2FuIGJlIGZvdW5kICovCisjZGVmaW5lIElNX05fSU9fUE9SVAk4CisKKy8qcmVxdWVzdHMgZ29pbmcgaW50byB0aGUgdXBwZXIgbmliYmxlIG9mIHRoZSBBdHRlbnRpb24gcmVnaXN0ZXIgKi8KKy8qbm90ZTogdGhlIGxvd2VyIG5pYmJsZSBzcGVjaWZpZXMgdGhlIGRldmljZSgwLTE0KSwgb3Igc3Vic3lzdGVtKDE1KSAqLworI2RlZmluZSBJTV9JTU1fQ01ECTB4MTAJLyppbW1lZGlhdGUgY29tbWFuZCAqLworI2RlZmluZSBJTV9TQ0IJCTB4MzAJLypTdWJzeXN0ZW0gQ29udHJvbCBCbG9jayBjb21tYW5kICovCisjZGVmaW5lIElNX0xPTkdfU0NCCTB4NDAJLypsb25nIFN1YnN5c3RlbSBDb250cm9sIEJsb2NrIGNvbW1hbmQgKi8KKyNkZWZpbmUgSU1fRU9JCQkweGUwCS8qZW5kLW9mLWludGVycnVwdCByZXF1ZXN0ICovCisKKy8qdmFsdWVzIGZvciBiaXRzIDcsMSwwIG9mIEJhc2ljIENvbnRyb2wgcmVnLiAoYml0cyA2LTIgcmVzZXJ2ZWQpICovCisjZGVmaW5lIElNX0hXX1JFU0VUCTB4ODAJLypoYXJkd2FyZSByZXNldCAqLworI2RlZmluZSBJTV9FTkFCTEVfRE1BCTB4MDIJLyplbmFibGUgc3Vic3lzdGVtJ3MgYnVzbWFzdGVyIERNQSAqLworI2RlZmluZSBJTV9FTkFCTEVfSU5UUgkweDAxCS8qZW5hYmxlIGludGVycnVwdHMgdG8gdGhlIHN5c3RlbSAqLworCisvKnRvIGludGVycHJldCB0aGUgdXBwZXIgbmliYmxlIG9mIEludGVycnVwdCBTdGF0dXMgcmVnaXN0ZXIgKi8KKy8qbm90ZTogdGhlIGxvd2VyIG5pYmJsZSBzcGVjaWZpZXMgdGhlIGRldmljZSgwLTE0KSwgb3Igc3Vic3lzdGVtKDE1KSAqLworI2RlZmluZSBJTV9TQ0JfQ01EX0NPTVBMRVRFRAkJCTB4MTAKKyNkZWZpbmUgSU1fU0NCX0NNRF9DT01QTEVURURfV0lUSF9SRVRSSUVTCTB4NTAKKyNkZWZpbmUgSU1fTE9PUF9TQ0FUVEVSX0JVRkZFUl9GVUxMCQkweDYwCisjZGVmaW5lIElNX0FEQVBURVJfSFdfRkFJTFVSRQkJCTB4NzAKKyNkZWZpbmUgSU1fSU1NRURJQVRFX0NNRF9DT01QTEVURUQJCTB4YTAKKyNkZWZpbmUgSU1fQ01EX0NPTVBMRVRFRF9XSVRIX0ZBSUxVUkUJCTB4YzAKKyNkZWZpbmUgSU1fQ01EX0VSUk9SCQkJCTB4ZTAKKyNkZWZpbmUgSU1fU09GVFdBUkVfU0VRVUVOQ0lOR19FUlJPUgkJMHhmMAorCisvKnRvIGludGVycHJldCBiaXRzIDMtMCBvZiBCYXNpYyBTdGF0dXMgcmVnaXN0ZXIgKGJpdHMgNy00IHJlc2VydmVkKSAqLworI2RlZmluZSBJTV9DTURfUkVHX0ZVTEwJCTB4MDgKKyNkZWZpbmUgSU1fQ01EX1JFR19FTVBUWQkweDA0CisjZGVmaW5lIElNX0lOVFJfUkVRVUVTVAkJMHgwMgorI2RlZmluZSBJTV9CVVNZCQkJMHgwMQorCisvKmltbWVkaWF0ZSBjb21tYW5kcyAod29yZCB3cml0dGVuIGludG8gbG93IDIgYnl0ZXMgb2YgY29tbWFuZCByZWcpICovCisjZGVmaW5lIElNX1JFU0VUX0lNTV9DTUQJMHgwNDAwCisjZGVmaW5lIElNX0ZFQVRVUkVfQ1RSX0lNTV9DTUQJMHgwNDBjCisjZGVmaW5lIElNX0RNQV9QQUNJTkdfSU1NX0NNRAkweDA0MGQKKyNkZWZpbmUgSU1fQVNTSUdOX0lNTV9DTUQJMHgwNDBlCisjZGVmaW5lIElNX0FCT1JUX0lNTV9DTUQJMHgwNDBmCisjZGVmaW5lIElNX0ZPUk1BVF9QUkVQX0lNTV9DTUQJMHgwNDE3CisKKy8qU0NCIChTdWJzeXN0ZW0gQ29udHJvbCBCbG9jaykgc3RydWN0dXJlICovCitzdHJ1Y3QgaW1fc2NiIHsKKwl1bnNpZ25lZCBzaG9ydCBjb21tYW5kOwkvKmNvbW1hbmQgd29yZCAocmVhZCwgZXRjLikgKi8KKwl1bnNpZ25lZCBzaG9ydCBlbmFibGU7CS8qZW5hYmxlIHdvcmQsIG1vZGlmaWVzIGNtZCAqLworCXVuaW9uIHsKKwkJdW5zaWduZWQgbG9uZyBsb2dfYmxrX2FkcjsJLypibG9jayBhZGRyZXNzIG9uIFNDU0kgZGV2aWNlICovCisJCXVuc2lnbmVkIGNoYXIgc2NzaV9jbWRfbGVuZ3RoOwkvKjYsMTAsMTIsIGZvciBvdGhlciBzY3NpIGNtZCAqLworCX0gdTE7CisJdW5zaWduZWQgbG9uZyBzeXNfYnVmX2FkcjsJLypwaHlzaWNhbCBzeXN0ZW0gbWVtb3J5IGFkciAqLworCXVuc2lnbmVkIGxvbmcgc3lzX2J1Zl9sZW5ndGg7CS8qc2l6ZSBvZiBzeXMgbWVtIGJ1ZmZlciAqLworCXVuc2lnbmVkIGxvbmcgdHNiX2FkcjsJLypUZXJtaW5hdGlvbiBTdGF0dXMgQmxvY2sgYWRyICovCisJdW5zaWduZWQgbG9uZyBzY2JfY2hhaW5fYWRyOwkvKm9wdGlvbmFsIFNDQiBjaGFpbiBhZGRyZXNzICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgc2hvcnQgY291bnQ7CS8qYmxvY2sgY291bnQsIG9uIFNDU0kgZGV2aWNlICovCisJCQl1bnNpZ25lZCBzaG9ydCBsZW5ndGg7CS8qYmxvY2sgbGVuZ3RoLCBvbiBTQ1NJIGRldmljZSAqLworCQl9IGJsazsKKwkJdW5zaWduZWQgY2hhciBzY3NpX2NvbW1hbmRbMTJdOwkvKm90aGVyIHNjc2kgY29tbWFuZCAqLworCX0gdTI7Cit9OworCisvKnN0cnVjdHVyZSBzY2F0dGVyLWdhdGhlciBlbGVtZW50IChmb3IgbGlzdCBvZiBzeXN0ZW0gbWVtb3J5IGFyZWFzKSAqLworc3RydWN0IGltX3NnZSB7CisJdm9pZCAqYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIGJ5dGVfbGVuZ3RoOworfTsKKworLypzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgYSBnZXRfcG9zX2luZm8gY29tbWFuZDogKi8KK3N0cnVjdCBpbV9wb3NfaW5mbyB7CisJdW5zaWduZWQgc2hvcnQgcG9zX2lkOwkvKiBhZGFwdGVyIGlkICovCisJdW5zaWduZWQgY2hhciBwb3NfM2E7CS8qIHBvcyAzIChpZiBwb3MgNiA9IDApICovCisJdW5zaWduZWQgY2hhciBwb3NfMjsJLyogcG9zIDIgKi8KKwl1bnNpZ25lZCBjaGFyIGludF9sZXZlbDsJLyogaW50ZXJydXB0IGxldmVsIElSUSAxMSBvciAxNCAqLworCXVuc2lnbmVkIGNoYXIgcG9zXzRhOwkvKiBwb3MgNCAoaWYgcG9zIDYgPSAwKSAqLworCXVuc2lnbmVkIHNob3J0IGNvbm5lY3Rvcl9zaXplOwkvKiBNQ0EgY29ubmVjdG9yIHNpemU6IDE2IG9yIDMyIEJpdCAqLworCXVuc2lnbmVkIGNoYXIgbnVtX2x1bnM7CS8qIG51bWJlciBvZiBzdXBwb3J0ZWQgbHVucyBwZXIgZGV2aWNlICovCisJdW5zaWduZWQgY2hhciBudW1fcHVuczsJLyogbnVtYmVyIG9mIHN1cHBvcnRlZCBwdW5zICovCisJdW5zaWduZWQgY2hhciBwYWNpbmdfZmFjdG9yOwkvKiBwYWNpbmcgZmFjdG9yICovCisJdW5zaWduZWQgY2hhciBudW1fbGRuczsJLyogbnVtYmVyIG9mIGxkbnMgYXZhaWxhYmxlICovCisJdW5zaWduZWQgY2hhciBlb2lfb2ZmOwkvKiB0aW1lIEVPSSBhbmQgaW50ZXJydXB0IGluYWN0aXZlICovCisJdW5zaWduZWQgY2hhciBtYXhfYnVzeTsJLyogdGltZSBiZXR3ZWVuIHJlc2V0IGFuZCBidXN5IG9uICovCisJdW5zaWduZWQgc2hvcnQgY2FjaGVfc3RhdDsJLyogbGRuIGNhY2hlc3RhdC4gQml0PTEgPSBub3QgY2FjaGVkICovCisJdW5zaWduZWQgc2hvcnQgcmV0cnlfc3RhdDsJLyogcmV0cnkgc3RhdHVzIG9mIGxkbnMuIEJpdD0xPWRpc2FibGVkICovCisJdW5zaWduZWQgY2hhciBwb3NfNGI7CS8qIHBvcyA0IChpZiBwb3MgNiA9IDEpICovCisJdW5zaWduZWQgY2hhciBwb3NfM2I7CS8qIHBvcyAzIChpZiBwb3MgNiA9IDEpICovCisJdW5zaWduZWQgY2hhciBwb3NfNjsJLyogcG9zIDYgKi8KKwl1bnNpZ25lZCBjaGFyIHBvc181OwkvKiBwb3MgNSAqLworCXVuc2lnbmVkIHNob3J0IG1heF9vdmVybGFwOwkvKiBtYXhpbXVtIG92ZXJsYXBwaW5nIHJlcXVlc3RzICovCisJdW5zaWduZWQgc2hvcnQgbnVtX2J1czsJLyogbnVtYmVyIG9mIFNDU0ktYnVzc2VzICovCit9OworCisvKnZhbHVlcyBmb3IgU0NCIGNvbW1hbmQgd29yZCAqLworI2RlZmluZSBJTV9OT19TWU5DSFJPTk9VUyAgICAgIDB4MDA0MAkvKmZsYWcgZm9yIGFueSBjb21tYW5kICovCisjZGVmaW5lIElNX05PX0RJU0NPTk5FQ1QgICAgICAgMHgwMDgwCS8qZmxhZyBmb3IgYW55IGNvbW1hbmQgKi8KKyNkZWZpbmUgSU1fUkVBRF9EQVRBX0NNRCAgICAgICAweDFjMDEKKyNkZWZpbmUgSU1fV1JJVEVfREFUQV9DTUQgICAgICAweDFjMDIKKyNkZWZpbmUgSU1fUkVBRF9WRVJJRllfQ01EICAgICAweDFjMDMKKyNkZWZpbmUgSU1fV1JJVEVfVkVSSUZZX0NNRCAgICAweDFjMDQKKyNkZWZpbmUgSU1fUkVRVUVTVF9TRU5TRV9DTUQgICAweDFjMDgKKyNkZWZpbmUgSU1fUkVBRF9DQVBBQ0lUWV9DTUQgICAweDFjMDkKKyNkZWZpbmUgSU1fREVWSUNFX0lOUVVJUllfQ01EICAweDFjMGIKKyNkZWZpbmUgSU1fUkVBRF9MT0dJQ0FMX0NNRCAgICAweDFjMmEKKyNkZWZpbmUgSU1fT1RIRVJfU0NTSV9DTURfQ01EICAweDI0MWYKKworLyogdW51c2VkLCBidXQgc3VwcG9ydGVkLCBTQ0IgY29tbWFuZHMgKi8KKyNkZWZpbmUgSU1fR0VUX0NPTU1BTkRfQ09NUExFVEVfU1RBVFVTX0NNRCAgIDB4MWMwNwkvKiBjb21tYW5kIHN0YXR1cyAqLworI2RlZmluZSBJTV9HRVRfUE9TX0lORk9fQ01EICAgICAgICAgICAgICAgICAgMHgxYzBhCS8qIHJldHVybnMgbmVhdCBzdHVmZiAqLworI2RlZmluZSBJTV9SRUFEX1BSRUZFVENIX0NNRCAgICAgICAgICAgICAgICAgMHgxYzMxCS8qIGNhY2hpbmcgY29udHJvbGxlciBvbmx5ICovCisjZGVmaW5lIElNX0ZPTUFUX1VOSVRfQ01EICAgICAgICAgICAgICAgICAgICAweDFjMTYJLyogZm9ybWF0IHVuaXQgKi8KKyNkZWZpbmUgSU1fUkVBU1NJR05fQkxPQ0tfQ01EICAgICAgICAgICAgICAgIDB4MWMxOAkvKiBpbiBjYXNlIG9mIGVycm9yICovCisKKy8qdmFsdWVzIHRvIHNldCBiaXRzIGluIHRoZSBlbmFibGUgd29yZCBvZiBTQ0IgKi8KKyNkZWZpbmUgSU1fUkVBRF9DT05UUk9MICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgSU1fUkVQT1JUX1RTQl9PTkxZX09OX0VSUk9SICAweDQwMDAKKyNkZWZpbmUgSU1fUkVUUllfRU5BQkxFICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgSU1fUE9JTlRFUl9UT19MSVNUICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgSU1fU1VQUkVTU19FWENFUFRJT05fU0hPUlQgICAweDA0MDAKKyNkZWZpbmUgSU1fQllQQVNTX0JVRkZFUiAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgSU1fQ0hBSU5fT05fTk9fRVJST1IgICAgICAgICAweDAwMDEKKworLypUU0IgKFRlcm1pbmF0aW9uIFN0YXR1cyBCbG9jaykgc3RydWN0dXJlICovCitzdHJ1Y3QgaW1fdHNiIHsKKwl1bnNpZ25lZCBzaG9ydCBlbmRfc3RhdHVzOworCXVuc2lnbmVkIHNob3J0IHJlc2VydmVkMTsKKwl1bnNpZ25lZCBsb25nIHJlc2lkdWFsX2J5dGVfY291bnQ7CisJdW5zaWduZWQgbG9uZyBzZ19saXN0X2VsZW1lbnRfYWRyOworCXVuc2lnbmVkIHNob3J0IHN0YXR1c19sZW5ndGg7CisJdW5zaWduZWQgY2hhciBkZXZfc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgY21kX3N0YXR1czsKKwl1bnNpZ25lZCBjaGFyIGRldl9lcnJvcjsKKwl1bnNpZ25lZCBjaGFyIGNtZF9lcnJvcjsKKwl1bnNpZ25lZCBzaG9ydCByZXNlcnZlZDI7CisJdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWQzOworCXVuc2lnbmVkIHNob3J0IGxvd19vZl9sYXN0X3NjYl9hZHI7CisJdW5zaWduZWQgc2hvcnQgaGlnaF9vZl9sYXN0X3NjYl9hZHI7Cit9OworCisvKnN1YnN5c3RlbSB1c2VzIGludGVycnVwdCByZXF1ZXN0IGxldmVsIDE0ICovCisjZGVmaW5lIElNX0lSUSAgICAgMTQKKy8qU0NTSS0yIEYvVyBtYXkgZXZhZGUgdG8gaW50ZXJydXB0IDExICovCisjZGVmaW5lIElNX0lSUV9GVyAgMTEKKworLyogTW9kZWwgOTUgaGFzIGFuIGFkZGl0aW9uYWwgYWxwaGFudW1lcmljIGRpc3BsYXksIHdoaWNoIGNhbiBiZSB1c2VkCisgICB0byBkaXNwbGF5IFNDU0ktYWN0aXZpdGllcy4gODU5NSBtb2RlbHMgZG8gbm90IGhhdmUgYW55IGRpc2sgbGVkLCB3aGljaAorICAgbWFrZXMgdGhpcyBmZWF0dXJlIHF1aXRlIHVzZWZ1bC4KKyAgIFRoZSByZWd1bGFyIFBTLzIgZGlzayBsZWQgaXMgdHVybmVkIG9uL29mZiBieSBiaXRzIDYsNyBvZiBzeXN0ZW0KKyAgIGNvbnRyb2wgcG9ydC4gKi8KKworLyogTEVEIGRpc3BsYXktcG9ydCAoYWN0dWFsbHksIGxhc3QgTEVEIG9uIGRpc3BsYXkpICovCisjZGVmaW5lIE1PRDk1X0xFRF9QT1JUCSAgIDB4MTA4CisvKiBzeXN0ZW0tY29udHJvbC1yZWdpc3RlciBvZiBQUy8ycyB3aXRoIGRpc2tpbmRpY2F0b3IgKi8KKyNkZWZpbmUgUFMyX1NZU19DVFIgICAgICAgIDB4OTIKKy8qIGFjdGl2aXR5IGRpc3BsYXlpbmcgbWV0aG9kcyAqLworI2RlZmluZSBMRURfRElTUCAgICAgICAgICAgMQorI2RlZmluZSBMRURfQURJU1AgICAgICAgICAgMgorI2RlZmluZSBMRURfQUNUSVZJVFkgICAgICAgNAorLyogZmFpbGVkIGludHIgKi8KKyNkZWZpbmUgQ01EX0ZBSUwgICAgICAgICAgIDI1NQorCisvKiBUaGUgU0NTSS1JRCghKSBvZiB0aGUgYWNjZXNzZWQgU0NTSS1kZXZpY2UgaXMgc2hvd24gb24gUFMvMi05NSBtYWNoaW5lcycgTEVECisgICBkaXNwbGF5cy4gbGRuIGlzIG5vIGxvbmdlciBkaXNwbGF5ZWQgaGVyZSwgYmVjYXVzZSB0aGUgbGRuIG1hcHBpbmcgaXMgbm93IAorICAgZG9uZSBkeW5hbWljYWxseSBhbmQgdGhlIGxkbiA8LT4gcHVuLGx1biBtYXBzIGNhbiBiZSBsb29rZWQtdXAgYXQgYm9vdHRpbWUgCisgICBvciBkdXJpbmcgdXB0aW1lIGluIC9wcm9jL3Njc2kvaWJtbWNhLzxob3N0X25vPiBpbiBjYXNlIG9mIHRyb3VibGUsIAorICAgaW50ZXJlc3QsIGRlYnVnZ2luZyBvciBqdXN0IGZvciBoYXZpbmcgZnVuLiBUaGUgbGVmdCBudW1iZXIgZ2l2ZXMgdGhlCisgICBob3N0LWFkYXB0ZXIgbnVtYmVyIGFuZCB0aGUgcmlnaHQgc2hvd3MgdGhlIGFjY2Vzc2VkIFNDU0ktSUQuICovCisKKy8qIGRpc3BsYXlfbW9kZSBpcyBzZXQgYnkgdGhlIGlibW1jYXNjc2k9IGNvbW1hbmQgbGluZSBhcmcgKi8KK3N0YXRpYyBpbnQgZGlzcGxheV9tb2RlID0gMDsKKy8qIHNldCBkZWZhdWx0IGFkYXB0ZXIgdGltZW91dCAqLworc3RhdGljIHVuc2lnbmVkIGludCBhZGFwdGVyX3RpbWVvdXQgPSA0NTsKKy8qIGZvciBwcm9iaW5nIG9uIGZlYXR1cmUtY29tbWFuZDogKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2xvYmFsX2NvbW1hbmRfZXJyb3JfZXhjdXNlID0gMDsKKy8qIGdsb2JhbCBzZXR0aW5nIGJ5IGNvbW1hbmQgbGluZSBmb3IgYWRhcHRlcl9zcGVlZCAqLworc3RhdGljIGludCBnbG9iYWxfYWRhcHRlcl9zcGVlZCA9IDA7CS8qIGZ1bGwgc3BlZWQgYnkgZGVmYXVsdCAqLworCisvKiBQYW5lbCAvIExFRCBvbiwgZG8gaXQgcmlnaHQgZm9yIEYvVyBhZGRyZXNzaW4sIHRvby4gYWRpc3BsYXkgd2lsbAorICoganVzdCBpZ25vcmUgaWRzPjcsIGFzIHRoZSBwYW5lbCBoYXMgb25seSA3IGRpZ2l0cyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgUFMyX0RJU0tfTEVEX09OKGFkLGlkKSB7IGlmIChkaXNwbGF5X21vZGUgJiBMRURfRElTUCkgeyBpZiAoaWQ+OSkgXAorICAgIG91dHcoKGFkKzQ4KXwoKGlkKzU1KTw8OCksIE1PRDk1X0xFRF9QT1JUICk7IGVsc2UgXAorICAgIG91dHcoKGFkKzQ4KXwoKGlkKzQ4KTw8OCksIE1PRDk1X0xFRF9QT1JUICk7IH0gZWxzZSBcCisgICAgaWYgKGRpc3BsYXlfbW9kZSAmIExFRF9BRElTUCkgeyBpZiAoaWQ8Nykgb3V0YigoY2hhcikoaWQrNDgpLE1PRDk1X0xFRF9QT1JUKzEraWQpOyBcCisgICAgb3V0YigoY2hhcikoYWQrNDgpLCBNT0Q5NV9MRURfUE9SVCk7IH0gXAorICAgIGlmICgoZGlzcGxheV9tb2RlICYgTEVEX0FDVElWSVRZKXx8KCFkaXNwbGF5X21vZGUpKSBcCisgICAgb3V0YihpbmIoUFMyX1NZU19DVFIpIHwgMHhjMCwgUFMyX1NZU19DVFIpOyB9CisKKy8qIFBhbmVsIC8gTEVEIG9mZiAqLworLyogYnVnIGZpeGVkLCBEZWMgMTUsIDE5OTcsIHdoZXJlIHwgd2FzIHJlcGxhY2VkIGJ5ICYgaGVyZSAqLworI2RlZmluZSBQUzJfRElTS19MRURfT0ZGKCkgeyBpZiAoZGlzcGxheV9tb2RlICYgTEVEX0RJU1ApIFwKKyAgICBvdXR3KDB4MjAyMCwgTU9EOTVfTEVEX1BPUlQgKTsgZWxzZSBpZiAoZGlzcGxheV9tb2RlICYgTEVEX0FESVNQKSB7IFwKKyAgICBvdXRsKDB4MjAyMDIwMjAsTU9EOTVfTEVEX1BPUlQpOyBvdXRsKDB4MjAyMDIwMjAsTU9EOTVfTEVEX1BPUlQrNCk7IH0gXAorICAgIGlmICgoZGlzcGxheV9tb2RlICYgTEVEX0FDVElWSVRZKXx8KCFkaXNwbGF5X21vZGUpKSBcCisgICAgb3V0YihpbmIoUFMyX1NZU19DVFIpICYgMHgzZiwgUFMyX1NZU19DVFIpOyB9CisKKy8qbGlzdCBvZiBzdXBwb3J0ZWQgc3Vic3lzdGVtcyAqLworc3RydWN0IHN1YnN5c19saXN0X3N0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQgbWNhX2lkOworCWNoYXIgKmRlc2NyaXB0aW9uOworfTsKKworLyogdHlwZXMgb2YgZGlmZmVyZW50IHN1cHBvcnRlZCBoYXJkd2FyZSB0aGF0IGdvZXMgdG8gaG9zdGRhdGEgc3BlY2lhbCAqLworI2RlZmluZSBJQk1fU0NTSTJfRlcgICAgIDAKKyNkZWZpbmUgSUJNXzc1NjhfV0NBQ0hFICAxCisjZGVmaW5lIElCTV9FWFBfVU5JVCAgICAgMgorI2RlZmluZSBJQk1fU0NTSV9XQ0FDSEUgIDMKKyNkZWZpbmUgSUJNX1NDU0kgICAgICAgICA0CisKKy8qIG90aGVyIHNwZWNpYWwgZmxhZ3MgZm9yIGhvc3RkYXRhIHN0cnVjdHVyZSAqLworI2RlZmluZSBGT1JDRURfREVURUNUSU9OICAgICAgICAgMTAwCisjZGVmaW5lIElOVEVHUkFURURfU0NTSSAgICAgICAgICAxMDEKKworLyogTGlzdCBvZiBwb3NzaWJsZSBJQk0tU0NTSS1hZGFwdGVycyAqLworc3RhdGljIHN0cnVjdCBzdWJzeXNfbGlzdF9zdHJ1Y3Qgc3Vic3lzX2xpc3RbXSA9IHsKKwl7MHg4ZWZjLCAiSUJNIFNDU0ktMiBGL1cgQWRhcHRlciJ9LAkvKiBzcGVjaWFsID0gMCAqLworCXsweDhlZmQsICJJQk0gNzU2OCBJbmR1c3RyaWFsIENvbXB1dGVyIFNDU0kgQWRhcHRlciB3L0NhY2hlIn0sCS8qIHNwZWNpYWwgPSAxICovCisJezB4OGVmOCwgIklCTSBFeHBhbnNpb24gVW5pdCBTQ1NJIENvbnRyb2xsZXIifSwJLyogc3BlY2lhbCA9IDIgKi8KKwl7MHg4ZWZmLCAiSUJNIFNDU0kgQWRhcHRlciB3L0NhY2hlIn0sCS8qIHNwZWNpYWwgPSAzICovCisJezB4OGVmZSwgIklCTSBTQ1NJIEFkYXB0ZXIifSwJLyogc3BlY2lhbCA9IDQgKi8KK307CisKKy8qIE1heCBudW1iZXIgb2YgbG9naWNhbCBkZXZpY2VzIChjYW4gYmUgdXAgZnJvbSAwIHRvIDE0KS4gIDE1IGlzIHRoZSBhZGRyZXNzCitvZiB0aGUgYWRhcHRlciBpdHNlbGYuICovCisjZGVmaW5lIE1BWF9MT0dfREVWICAxNQorCisvKmxvY2FsIGRhdGEgZm9yIGEgbG9naWNhbCBkZXZpY2UgKi8KK3N0cnVjdCBsb2dpY2FsX2RldmljZSB7CisJc3RydWN0IGltX3NjYiBzY2I7CS8qIFNDU0ktc3Vic3lzdGVtLWNvbnRyb2wtYmxvY2sgc3RydWN0dXJlICovCisJc3RydWN0IGltX3RzYiB0c2I7CS8qIFNDU0kgY29tbWFuZCBjb21wbGV0ZSBzdGF0dXMgYmxvY2sgc3RydWN0dXJlICovCisJc3RydWN0IGltX3NnZSBzZ2VbMTZdOwkvKiBzY2F0dGVyIGdhdGhlciBsaXN0IHN0cnVjdHVyZSAqLworCXVuc2lnbmVkIGNoYXIgYnVmWzI1Nl07CS8qIFNDU0kgY29tbWFuZCByZXR1cm4gZGF0YSBidWZmZXIgKi8KKwlTY3NpX0NtbmQgKmNtZDsJCS8qIFNDU0ktY29tbWFuZCB0aGF0IGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcyAqLworCWludCBkZXZpY2VfdHlwZTsJLyogdHlwZSBvZiB0aGUgU0NTSS1kZXZpY2UuIFNlZSBpbmNsdWRlL3Njc2kvc2NzaS5oCisJCQkJICAgZm9yIGludGVycHJldGF0aW9uIG9mIHRoZSBwb3NzaWJsZSB2YWx1ZXMgKi8KKwlpbnQgYmxvY2tfbGVuZ3RoOwkvKiBibG9ja3NpemUgb2YgYSBwYXJ0aWN1bGFyIGxvZ2ljYWwgU0NTSS1kZXZpY2UgKi8KKwlpbnQgY2FjaGVfZmxhZzsJCS8qIDEgaWYgdGhpcyBpcyB1bmNhY2hlZCwgMCBpZiBjYWNoZSBpcyBwcmVzZW50IGZvciBsZG4gKi8KKwlpbnQgcmV0cnlfZmxhZzsJCS8qIDEgaWYgYWRhcHRlciByZXRyeSBpcyBkaXNhYmxlZCwgMCBpZiBlbmFibGVkICovCit9OworCisvKiBzdGF0aXN0aWNzIG9mIHRoZSBkcml2ZXIgZHVyaW5nIG9wZXJhdGlvbnMgKGZvciBwcm9jX2luZm8pICovCitzdHJ1Y3QgRHJpdmVyX1N0YXRpc3RpY3MgeworCS8qIFNDU0kgc3RhdGlzdGljcyBvbiB0aGUgYWRhcHRlciAqLworCWludCBsZG5fYWNjZXNzW01BWF9MT0dfREVWICsgMV07CS8qIHRvdGFsIGFjY2Vzc2VzIG9uIGEgbGRuICovCisJaW50IGxkbl9yZWFkX2FjY2Vzc1tNQVhfTE9HX0RFViArIDFdOwkvKiB0b3RhbCByZWFkLWFjY2VzcyBvbiBhIGxkbiAqLworCWludCBsZG5fd3JpdGVfYWNjZXNzW01BWF9MT0dfREVWICsgMV07CS8qIHRvdGFsIHdyaXRlLWFjY2VzcyBvbiBhIGxkbiAqLworCWludCBsZG5faW5xdWlyeV9hY2Nlc3NbTUFYX0xPR19ERVYgKyAxXTsJLyogdG90YWwgaW5xdWlyaWVzIG9uIGEgbGRuICovCisJaW50IGxkbl9tb2Rlc2VsZWN0X2FjY2Vzc1tNQVhfTE9HX0RFViArIDFdOwkvKiB0b3RhbCBtb2RlIHNlbGVjdHMgb24gbGRuICovCisJaW50IHNjYnM7CQkvKiBzaG9ydCBTQ0JzIHF1ZXVlZCAqLworCWludCBsb25nX3NjYnM7CQkvKiBsb25nIFNDQnMgcXVldWVkICovCisJaW50IHRvdGFsX2FjY2Vzc2VzOwkvKiB0b3RhbCBhY2Nlc3NlcyBvbiBhbGwgbGRucyAqLworCWludCB0b3RhbF9pbnRlcnJ1cHRzOwkvKiB0b3RhbCBpbnRlcnJ1cHRzIChzaG91bGQgYmUKKwkJCQkgICBzYW1lIGFzIHRvdGFsX2FjY2Vzc2VzKSAqLworCWludCB0b3RhbF9lcnJvcnM7CS8qIGNvbW1hbmQgY29tcGxldGVkIHdpdGggZXJyb3IgKi8KKwkvKiBkeW5hbWljYWwgYXNzaWdubWVudCBzdGF0aXN0aWNzICovCisJaW50IHRvdGFsX3Njc2lfZGV2aWNlczsJLyogbnVtYmVyIG9mIHBoeXNpY2FsIHB1bixsdW4gKi8KKwlpbnQgZHluX2ZsYWc7CQkvKiBmbGFnIHNob3dpbmcgZHluYW1pY2FsIG1vZGUgKi8KKwlpbnQgZHluYW1pY2FsX2Fzc2lnbm1lbnRzOwkvKiBudW1iZXIgb2YgcmVtYXBwaW5ncyBvZiBsZG5zICovCisJaW50IGxkbl9hc3NpZ25tZW50c1tNQVhfTE9HX0RFViArIDFdOwkvKiBudW1iZXIgb2YgcmVtYXBwaW5ncyBvZiBlYWNoCisJCQkJCQkgICBsZG4gKi8KK307CisKKy8qIGRhdGEgc3RydWN0dXJlIGZvciBlYWNoIGhvc3QgYWRhcHRlciAqLworc3RydWN0IGlibW1jYV9ob3N0ZGF0YSB7CisJLyogYXJyYXkgb2YgbG9naWNhbCBkZXZpY2VzOiAqLworCXN0cnVjdCBsb2dpY2FsX2RldmljZSBfbGRbTUFYX0xPR19ERVYgKyAxXTsKKwkvKiBhcnJheSB0byBjb252ZXJ0IChwdW4sIGx1bikgaW50byBsb2dpY2FsIGRldmljZSBudW1iZXI6ICovCisJdW5zaWduZWQgY2hhciBfZ2V0X2xkblsxNl1bOF07CisJLyphcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGh5c2ljYWwgU0NTSS1kZXZpY2VzCisJICAgYXR0YWNoZWQgdG8gdGhpcyBob3N0IGFkYXB0ZXI6ICovCisJdW5zaWduZWQgY2hhciBfZ2V0X3Njc2lbMTZdWzhdOworCS8qIHVzZWQgb25seSB3aGVuIGNoZWNraW5nIGxvZ2ljYWwgZGV2aWNlczogKi8KKwlpbnQgX2xvY2FsX2NoZWNraW5nX3BoYXNlX2ZsYWc7CisJLyogcmVwb3J0IHJlY2VpdmVkIGludGVycnVwdDogKi8KKwlpbnQgX2dvdF9pbnRlcnJ1cHQ7CisJLyogcmVwb3J0IHRlcm1pbmF0aW9uLXN0YXR1cyBvZiBTQ1NJLWNvbW1hbmQ6ICovCisJaW50IF9zdGF0X3Jlc3VsdDsKKwkvKiByZXNldCBzdGF0dXMgKHVzZWQgb25seSB3aGVuIGRvaW5nIHJlc2V0KTogKi8KKwlpbnQgX3Jlc2V0X3N0YXR1czsKKwkvKiBjb2RlIG9mIHRoZSBsYXN0IFNDU0kgY29tbWFuZCAobmVlZGVkIGZvciBwYW5pYyBpbmZvKTogKi8KKwlpbnQgX2xhc3Rfc2NzaV9jb21tYW5kW01BWF9MT0dfREVWICsgMV07CisJLyogaWRlbnRpZmllciBvZiB0aGUgbGFzdCBTQ1NJLWNvbW1hbmQgdHlwZSAqLworCWludCBfbGFzdF9zY3NpX3R5cGVbTUFYX0xPR19ERVYgKyAxXTsKKwkvKiBsYXN0IGJsb2NrY291bnQgKi8KKwlpbnQgX2xhc3Rfc2NzaV9ibG9ja2NvdW50W01BWF9MT0dfREVWICsgMV07CisJLyogbGFzdCBsb2NnaWNhbCBibG9jayBhZGRyZXNzICovCisJdW5zaWduZWQgbG9uZyBfbGFzdF9zY3NpX2xvZ2ljYWxfYmxvY2tbTUFYX0xPR19ERVYgKyAxXTsKKwkvKiBDb3VudGVyIHRoYXQgcG9pbnRzIG9uIHRoZSBuZXh0IHJlYXNzaWduYWJsZSBsZG4gZm9yIGR5bmFtaWNhbAorCSAgIHJlbWFwcGluZy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgNywgdGhhdCBpcyB0aGUgZmlyc3QgcmVhc3NpZ25hYmxlCisJICAgbnVtYmVyIGluIHRoZSBsaXN0IGF0IGJvb3R0aW1lOiAqLworCWludCBfbmV4dF9sZG47CisJLyogU3RhdGlzdGljcy1zdHJ1Y3R1cmUgZm9yIHRoaXMgSUJNLVNDU0ktaG9zdDogKi8KKwlzdHJ1Y3QgRHJpdmVyX1N0YXRpc3RpY3MgX0lCTV9EUzsKKwkvKiBUaGlzIGhvc3RhZGFwdGVycyBwb3MtcmVnaXN0ZXJzIHBvczIgdW50aWwgcG9zNiAqLworCXVuc2lnbmVkIGludCBfcG9zWzhdOworCS8qIGFzc2lnbiBhIHNwZWNpYWwgdmFyaWFibGUsIHRoYXQgY29udGFpbnMgZGVkaWNhdGVkIGluZm8gYWJvdXQgdGhlCisJICAgYWRhcHRlcnR5cGUgKi8KKwlpbnQgX3NwZWNpYWw7CisJLyogY29ubmVjdG9yIHNpemUgb24gdGhlIE1DQSBidXMgKi8KKwlpbnQgX2Nvbm5lY3Rvcl9zaXplOworCS8qIHN5bmNocm9ub3VzIFNDU0kgdHJhbnNmZXIgcmF0ZSBiaXRwYXR0ZXJuICovCisJaW50IF9hZGFwdGVyX3NwZWVkOworfTsKKworLyogbWFjcm9zIHRvIGFjY2VzcyBob3N0IGRhdGEgc3RydWN0dXJlICovCisjZGVmaW5lIHN1YnN5c3RlbV9wdW4oaGkpIChob3N0c1soaGkpXS0+dGhpc19pZCkKKyNkZWZpbmUgc3Vic3lzdGVtX21heGlkKGhpKSAoaG9zdHNbKGhpKV0tPm1heF9pZCkKKyNkZWZpbmUgbGQoaGkpICgoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgaG9zdHNbKGhpKV0tPmhvc3RkYXRhKS0+X2xkKQorI2RlZmluZSBnZXRfbGRuKGhpKSAoKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIGhvc3RzWyhoaSldLT5ob3N0ZGF0YSktPl9nZXRfbGRuKQorI2RlZmluZSBnZXRfc2NzaShoaSkgKCgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBob3N0c1soaGkpXS0+aG9zdGRhdGEpLT5fZ2V0X3Njc2kpCisjZGVmaW5lIGxvY2FsX2NoZWNraW5nX3BoYXNlX2ZsYWcoaGkpICgoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgaG9zdHNbKGhpKV0tPmhvc3RkYXRhKS0+X2xvY2FsX2NoZWNraW5nX3BoYXNlX2ZsYWcpCisjZGVmaW5lIGdvdF9pbnRlcnJ1cHQoaGkpICgoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgaG9zdHNbKGhpKV0tPmhvc3RkYXRhKS0+X2dvdF9pbnRlcnJ1cHQpCisjZGVmaW5lIHN0YXRfcmVzdWx0KGhpKSAoKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIGhvc3RzWyhoaSldLT5ob3N0ZGF0YSktPl9zdGF0X3Jlc3VsdCkKKyNkZWZpbmUgcmVzZXRfc3RhdHVzKGhpKSAoKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIGhvc3RzWyhoaSldLT5ob3N0ZGF0YSktPl9yZXNldF9zdGF0dXMpCisjZGVmaW5lIGxhc3Rfc2NzaV9jb21tYW5kKGhpKSAoKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIGhvc3RzWyhoaSldLT5ob3N0ZGF0YSktPl9sYXN0X3Njc2lfY29tbWFuZCkKKyNkZWZpbmUgbGFzdF9zY3NpX3R5cGUoaGkpICgoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgaG9zdHNbKGhpKV0tPmhvc3RkYXRhKS0+X2xhc3Rfc2NzaV90eXBlKQorI2RlZmluZSBsYXN0X3Njc2lfYmxvY2tjb3VudChoaSkgKCgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBob3N0c1soaGkpXS0+aG9zdGRhdGEpLT5fbGFzdF9zY3NpX2Jsb2NrY291bnQpCisjZGVmaW5lIGxhc3Rfc2NzaV9sb2dpY2FsX2Jsb2NrKGhpKSAoKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIGhvc3RzWyhoaSldLT5ob3N0ZGF0YSktPl9sYXN0X3Njc2lfbG9naWNhbF9ibG9jaykKKyNkZWZpbmUgbGFzdF9zY3NpX3R5cGUoaGkpICgoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgaG9zdHNbKGhpKV0tPmhvc3RkYXRhKS0+X2xhc3Rfc2NzaV90eXBlKQorI2RlZmluZSBuZXh0X2xkbihoaSkgKCgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBob3N0c1soaGkpXS0+aG9zdGRhdGEpLT5fbmV4dF9sZG4pCisjZGVmaW5lIElCTV9EUyhoaSkgKCgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBob3N0c1soaGkpXS0+aG9zdGRhdGEpLT5fSUJNX0RTKQorI2RlZmluZSBzcGVjaWFsKGhpKSAoKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIGhvc3RzWyhoaSldLT5ob3N0ZGF0YSktPl9zcGVjaWFsKQorI2RlZmluZSBzdWJzeXN0ZW1fY29ubmVjdG9yX3NpemUoaGkpICgoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgaG9zdHNbKGhpKV0tPmhvc3RkYXRhKS0+X2Nvbm5lY3Rvcl9zaXplKQorI2RlZmluZSBhZGFwdGVyX3NwZWVkKGhpKSAoKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIGhvc3RzWyhoaSldLT5ob3N0ZGF0YSktPl9hZGFwdGVyX3NwZWVkKQorI2RlZmluZSBwb3MyKGhpKSAoKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIGhvc3RzWyhoaSldLT5ob3N0ZGF0YSktPl9wb3NbMl0pCisjZGVmaW5lIHBvczMoaGkpICgoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgaG9zdHNbKGhpKV0tPmhvc3RkYXRhKS0+X3Bvc1szXSkKKyNkZWZpbmUgcG9zNChoaSkgKCgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBob3N0c1soaGkpXS0+aG9zdGRhdGEpLT5fcG9zWzRdKQorI2RlZmluZSBwb3M1KGhpKSAoKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIGhvc3RzWyhoaSldLT5ob3N0ZGF0YSktPl9wb3NbNV0pCisjZGVmaW5lIHBvczYoaGkpICgoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgaG9zdHNbKGhpKV0tPmhvc3RkYXRhKS0+X3Bvc1s2XSkKKworLyogRGVmaW5lIGEgYXJiaXRyYXJ5IG51bWJlciBhcyBzdWJzeXN0ZW0tbWFya2VyLXR5cGUuIFRoaXMgbnVtYmVyIGlzLCBhcworICAgZGVzY3JpYmVkIGluIHRoZSBBTlNJLVNDU0ktc3RhbmRhcmQsIG5vdCBvY2N1cGllZCBieSBvdGhlciBkZXZpY2UtdHlwZXMuICovCisjZGVmaW5lIFRZUEVfSUJNX1NDU0lfQURBUFRFUiAgIDB4MkYKKworLyogRGVmaW5lIDB4RkYgZm9yIG5vIGRldmljZSB0eXBlLCBiZWNhdXNlIHRoaXMgdHlwZSBpcyBub3QgZGVmaW5lZCB3aXRoaW4KKyAgIHRoZSBBTlNJLVNDU0ktc3RhbmRhcmQsIHRoZXJlZm9yZSwgaXQgY2FuIGJlIHVzZWQgYW5kIHNob3VsZCBub3QgY2F1c2UgYW55CisgICBoYXJtLiAqLworI2RlZmluZSBUWVBFX05PX0RFVklDRSAgICAgICAgICAweEZGCisKKy8qIGRlZmluZSBtZWRpdW0tY2hhbmdlci4gSWYgdGhpcyBpcyBub3QgZGVmaW5lZCBwcmV2aW91c2x5LCBlLmcuIExpbnV4CisgICAyLjAueCwgZGVmaW5lIHRoaXMgdHlwZSBoZXJlLiAqLworI2lmbmRlZiBUWVBFX01FRElVTV9DSEFOR0VSCisjZGVmaW5lIFRZUEVfTUVESVVNX0NIQU5HRVIgICAgIDB4MDgKKyNlbmRpZgorCisvKiBkZWZpbmUgcG9zc2libGUgb3BlcmF0aW9ucyBmb3IgdGhlIGltbWVkaWF0ZV9hc3NpZ24gY29tbWFuZCAqLworI2RlZmluZSBTRVRfTEROICAgICAgICAwCisjZGVmaW5lIFJFTU9WRV9MRE4gICAgIDEKKworLyogbGRuIHdoaWNoIGlzIHVzZWQgdG8gcHJvYmUgdGhlIFNDU0kgZGV2aWNlcyAqLworI2RlZmluZSBQUk9CRV9MRE4gICAgICAwCisKKy8qIHJlc2V0IHN0YXR1cyBmbGFnIGNvbnRlbnRzICovCisjZGVmaW5lIElNX1JFU0VUX05PVF9JTl9QUk9HUkVTUyAgICAgICAgIDAKKyNkZWZpbmUgSU1fUkVTRVRfSU5fUFJPR1JFU1MgICAgICAgICAgICAgMQorI2RlZmluZSBJTV9SRVNFVF9GSU5JU0hFRF9PSyAgICAgICAgICAgICAyCisjZGVmaW5lIElNX1JFU0VUX0ZJTklTSEVEX0ZBSUwgICAgICAgICAgIDMKKyNkZWZpbmUgSU1fUkVTRVRfTk9UX0lOX1BST0dSRVNTX05PX0lOVCAgNAorI2RlZmluZSBJTV9SRVNFVF9GSU5JU0hFRF9PS19OT19JTlQgICAgICA1CisKKy8qIGRlZmluZSB1bmRlZmluZWQgU0NTSS1jb21tYW5kICovCisjZGVmaW5lIE5PX1NDU0kgICAgICAgICAgICAgICAgICAweGZmZmYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGlmIHRoaXMgaXMgbm9uemVybywgaWJtbWNhc2NzaSBvcHRpb24gaGFzIGJlZW4gcGFzc2VkIHRvIHRoZSBrZXJuZWwgKi8KK3N0YXRpYyBpbnQgaW9fcG9ydFtJTV9NQVhfSE9TVFNdID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CitzdGF0aWMgaW50IHNjc2lfaWRbSU1fTUFYX0hPU1RTXSA9IHsgNywgNywgNywgNywgNywgNywgNywgNyB9OworCisvKiBmaWxsIG1vZHVsZS1wYXJhbWV0ZXJzIG9ubHksIHdoZW4gdGhpcyBkZWZpbmUgaXMgcHJlc2VudC4KKyAgICh0aGF0IGlzIGtlcm5lbCB2ZXJzaW9uIDIuMS54KSAqLworI2lmIGRlZmluZWQoTU9EVUxFKQorc3RhdGljIGNoYXIgKmJvb3Rfb3B0aW9ucyA9IE5VTEw7Cittb2R1bGVfcGFyYW0oYm9vdF9vcHRpb25zLCBjaGFycCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaW9fcG9ydCwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShzY3NpX2lkLCBpbnQsIE5VTEwsIDApOworCisjaWYgMCAvKiBGSVhNRTogTm8gbG9uZ2VyIGV4aXN0PyAtLVJSICovCitNT0RVTEVfUEFSTShkaXNwbGF5LCAiMWkiKTsKK01PRFVMRV9QQVJNKGFkaXNwbGF5LCAiMWkiKTsKK01PRFVMRV9QQVJNKG5vcm1hbCwgIjFpIik7CitNT0RVTEVfUEFSTShhbnNpLCAiMWkiKTsKKyNlbmRpZgorI2VuZGlmCisvKmNvdW50ZXIgb2YgY29uY3VycmVudCBkaXNrIHJlYWQvd3JpdGVzLCB0byB0dXJuIG9uL29mZiBkaXNrIGxlZCAqLworc3RhdGljIGludCBkaXNrX3J3X2luX3Byb2dyZXNzID0gMDsKKworLyogaG9zdCBpbmZvcm1hdGlvbiAqLworc3RhdGljIGludCBmb3VuZCA9IDA7CitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqaG9zdHNbSU1fTUFYX0hPU1RTICsgMV0gPSB7CisJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAorfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcG9zWzhdOwkvKiB3aG9sZSBwb3MgcmVnaXN0ZXItbGluZSBmb3IgZGlhZ25vc2lzICovCisvKiBUYWtpbmcgaW50byBhY2NvdW50IHRoZSBhZGRpdGlvbnMsIG1hZGUgYnkgWlAgR3UuCisgKiBUaGlzIHNlbGVjdHMgbm93IHRoZSBwcmVzZXQgdmFsdWUgZnJvbSB0aGUgY29uZmlnZmlsZSBhbmQKKyAqIG9mZmVycyB0aGUgJ25vcm1hbCcgY29tbWFuZGxpbmUgb3B0aW9uIHRvIGJlIGFjY2VwdGVkICovCisjaWZkZWYgQ09ORklHX0lCTU1DQV9TQ1NJX09SREVSX1NUQU5EQVJECitzdGF0aWMgY2hhciBpYm1fYW5zaV9vcmRlciA9IDE7CisjZWxzZQorc3RhdGljIGNoYXIgaWJtX2Fuc2lfb3JkZXIgPSAwOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGlzc3VlX2NtZChpbnQsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGNoYXIpOworc3RhdGljIHZvaWQgaW50ZXJuYWxfZG9uZShTY3NpX0NtbmQgKiBjbWQpOworc3RhdGljIHZvaWQgY2hlY2tfZGV2aWNlcyhpbnQsIGludCk7CitzdGF0aWMgaW50IGltbWVkaWF0ZV9hc3NpZ24oaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworc3RhdGljIGludCBpbW1lZGlhdGVfZmVhdHVyZShpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKKyNpZmRlZiBDT05GSUdfSUJNTUNBX1NDU0lfREVWX1JFU0VUCitzdGF0aWMgaW50IGltbWVkaWF0ZV9yZXNldChpbnQsIHVuc2lnbmVkIGludCk7CisjZW5kaWYKK3N0YXRpYyBpbnQgZGV2aWNlX2lucXVpcnkoaW50LCBpbnQpOworc3RhdGljIGludCByZWFkX2NhcGFjaXR5KGludCwgaW50KTsKK3N0YXRpYyBpbnQgZ2V0X3Bvc19pbmZvKGludCk7CitzdGF0aWMgY2hhciAqdGlfcChpbnQpOworc3RhdGljIGNoYXIgKnRpX2woaW50KTsKK3N0YXRpYyBjaGFyICppYm1yYXRlKHVuc2lnbmVkIGludCwgaW50KTsKK3N0YXRpYyBpbnQgcHJvYmVfZGlzcGxheShpbnQpOworc3RhdGljIGludCBwcm9iZV9idXNfbW9kZShpbnQpOworc3RhdGljIGludCBkZXZpY2VfZXhpc3RzKGludCwgaW50LCBpbnQgKiwgaW50ICopOworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKmlibW1jYV9yZWdpc3RlcihTY3NpX0hvc3RfVGVtcGxhdGUgKiwgaW50LCBpbnQsIGludCwgY2hhciAqKTsKK3N0YXRpYyBpbnQgb3B0aW9uX3NldHVwKGNoYXIgKik7CisvKiBsb2NhbCBmdW5jdGlvbnMgbmVlZGVkIGZvciBwcm9jX2luZm8gKi8KK3N0YXRpYyBpbnQgbGRuX2FjY2Vzc19sb2FkKGludCwgaW50KTsKK3N0YXRpYyBpbnQgbGRuX2FjY2Vzc190b3RhbF9yZWFkX3dyaXRlKGludCk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBob3N0X2luZGV4LCBpaG9zdF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgaW50cl9yZWc7CisJdW5zaWduZWQgaW50IGNtZF9yZXN1bHQ7CisJdW5zaWduZWQgaW50IGxkbjsKKwlTY3NpX0NtbmQgKmNtZDsKKwlpbnQgbGFzdFNDU0k7CisJc3RydWN0IFNjc2lfSG9zdCAqZGV2ID0gZGV2X2lkOworCisJc3Bpbl9sb2NrKGRldi0+aG9zdF9sb2NrKTsKKwkgICAgLyogc2VhcmNoIGZvciBvbmUgYWRhcHRlci1yZXNwb25zZSBvbiBzaGFyZWQgaW50ZXJydXB0ICovCisJICAgIGZvciAoaG9zdF9pbmRleCA9IDA7IGhvc3RzW2hvc3RfaW5kZXhdICYmICEoaW5iKElNX1NUQVRfUkVHKGhvc3RfaW5kZXgpKSAmIElNX0lOVFJfUkVRVUVTVCk7IGhvc3RfaW5kZXgrKyk7CisJLyogcmV0dXJuIGlmIHNvbWUgb3RoZXIgZGV2aWNlIG9uIHRoaXMgSVJRIGNhdXNlZCB0aGUgaW50ZXJydXB0ICovCisJaWYgKCFob3N0c1tob3N0X2luZGV4XSkgeworCQlzcGluX3VubG9jayhkZXYtPmhvc3RfbG9jayk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvKiB0aGUgcmVzZXQtZnVuY3Rpb24gYWxyZWFkeSBkaWQgYWxsIHRoZSBqb2IsIGV2ZW4gaW50cyBnb3QKKwkgICByZW5hYmxlZCBvbiB0aGUgc3Vic3lzdGVtLCBzbyBqdXN0IHJldHVybiAqLworCWlmICgocmVzZXRfc3RhdHVzKGhvc3RfaW5kZXgpID09IElNX1JFU0VUX05PVF9JTl9QUk9HUkVTU19OT19JTlQpIHx8IChyZXNldF9zdGF0dXMoaG9zdF9pbmRleCkgPT0gSU1fUkVTRVRfRklOSVNIRURfT0tfTk9fSU5UKSkgeworCQlyZXNldF9zdGF0dXMoaG9zdF9pbmRleCkgPSBJTV9SRVNFVF9OT1RfSU5fUFJPR1JFU1M7CisJCXNwaW5fdW5sb2NrKGRldi0+aG9zdF9sb2NrKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCS8qbXVzdCB3YWl0IGZvciBhdHRlbnRpb24gcmVnIG5vdCBidXN5LCB0aGVuIHNlbmQgRU9JIHRvIHN1YnN5c3RlbSAqLworCXdoaWxlICgxKSB7CisJCWlmICghKGluYihJTV9TVEFUX1JFRyhob3N0X2luZGV4KSkgJiBJTV9CVVNZKSkKKwkJCWJyZWFrOworCQljcHVfcmVsYXgoKTsKKwl9CisJaWhvc3RfaW5kZXggPSBob3N0X2luZGV4OworCS8qZ2V0IGNvbW1hbmQgcmVzdWx0IGFuZCBsb2dpY2FsIGRldmljZSAqLworCWludHJfcmVnID0gKHVuc2lnbmVkIGNoYXIpIChpbmIoSU1fSU5UUl9SRUcoaWhvc3RfaW5kZXgpKSk7CisJY21kX3Jlc3VsdCA9IGludHJfcmVnICYgMHhmMDsKKwlsZG4gPSBpbnRyX3JlZyAmIDB4MGY7CisJLyogZ2V0IHRoZSBsYXN0X3Njc2lfY29tbWFuZCBoZXJlICovCisJbGFzdFNDU0kgPSBsYXN0X3Njc2lfY29tbWFuZChpaG9zdF9pbmRleClbbGRuXTsKKwlvdXRiKElNX0VPSSB8IGxkbiwgSU1fQVRUTl9SRUcoaWhvc3RfaW5kZXgpKTsKKwkKKwkvKnRoZXNlIHNob3VsZCBuZXZlciBoYXBwZW4gKGh3IGZhaWxzLCBvciBhIGxvY2FsIHByb2dyYW1taW5nIGJ1ZykgKi8KKwlpZiAoIWdsb2JhbF9jb21tYW5kX2Vycm9yX2V4Y3VzZSkgeworCQlzd2l0Y2ggKGNtZF9yZXN1bHQpIHsKKwkJCS8qIFByZXZlbnQgZnJvbSBPb29wc2luZyBvbiBlcnJvciB0byBzaG93IHRoZSByZWFsIHJlYXNvbiAqLworCQljYXNlIElNX0FEQVBURVJfSFdfRkFJTFVSRToKKwkJY2FzZSBJTV9TT0ZUV0FSRV9TRVFVRU5DSU5HX0VSUk9SOgorCQljYXNlIElNX0NNRF9FUlJPUjoKKwkJCXByaW50ayhLRVJOX0VSUiAiSUJNIE1DQSBTQ1NJOiBGYXRhbCBTdWJzeXN0ZW0gRVJST1IhXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICBMYXN0IGNtZD0weCV4LCBlbmE9JXgsIGxlbj0iLCBsYXN0U0NTSSwgbGQoaWhvc3RfaW5kZXgpW2xkbl0uc2NiLmVuYWJsZSk7CisJCQlpZiAobGQoaWhvc3RfaW5kZXgpW2xkbl0uY21kKQorCQkJCXByaW50aygiJWxkLyVsZCwiLCAobG9uZykgKGxkKGlob3N0X2luZGV4KVtsZG5dLmNtZC0+cmVxdWVzdF9idWZmbGVuKSwgKGxvbmcpIChsZChpaG9zdF9pbmRleClbbGRuXS5zY2Iuc3lzX2J1Zl9sZW5ndGgpKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoIm5vbmUsIik7CisJCQlpZiAobGQoaWhvc3RfaW5kZXgpW2xkbl0uY21kKQorCQkJCXByaW50aygiQmxvY2tzaXplPSVkIiwgbGQoaWhvc3RfaW5kZXgpW2xkbl0uc2NiLnUyLmJsay5sZW5ndGgpOworCQkJZWxzZQorCQkJCXByaW50aygiQmxvY2tzaXplPW5vbmUiKTsKKwkJCXByaW50aygiLCBob3N0PTB4JXgsIGxkbj0weCV4XG4iLCBpaG9zdF9pbmRleCwgbGRuKTsKKwkJCWlmIChsZChpaG9zdF9pbmRleClbbGRuXS5jbWQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkJsb2NrY291bnQ9JWQvJWRcbiIsIGxhc3Rfc2NzaV9ibG9ja2NvdW50KGlob3N0X2luZGV4KVtsZG5dLCBsZChpaG9zdF9pbmRleClbbGRuXS5zY2IudTIuYmxrLmNvdW50KTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkxvZ2ljYWwgYmxvY2s9JWx4LyVseFxuIiwgbGFzdF9zY3NpX2xvZ2ljYWxfYmxvY2soaWhvc3RfaW5kZXgpW2xkbl0sIGxkKGlob3N0X2luZGV4KVtsZG5dLnNjYi51MS5sb2dfYmxrX2Fkcik7CisJCQl9CisJCQlwcmludGsoS0VSTl9FUlIgIlJlYXNvbiBnaXZlbjogJXNcbiIsIChjbWRfcmVzdWx0ID09IElNX0FEQVBURVJfSFdfRkFJTFVSRSkgPyAiSEFSRFdBUkUgRkFJTFVSRSIgOiAoY21kX3Jlc3VsdCA9PSBJTV9TT0ZUV0FSRV9TRVFVRU5DSU5HX0VSUk9SKSA/ICJTT0ZUV0FSRSBTRVFVRU5DSU5HIEVSUk9SIiA6IChjbWRfcmVzdWx0ID09IElNX0NNRF9FUlJPUikgPyAiQ09NTUFORCBFUlJPUiIgOiAiVU5LTk9XTiIpOworCQkJLyogaWYgZXJyb3JzIGFwcGVhciwgZW50ZXIgdGhpcyBzZWN0aW9uIHRvIGdpdmUgZGV0YWlsZWQgaW5mbyAqLworCQkJcHJpbnRrKEtFUk5fRVJSICJJQk0gTUNBIFNDU0k6IFN1YnN5c3RlbSBFcnJvci1TdGF0dXMgZm9sbG93czpcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICIgICAgICAgICAgICAgIENvbW1hbmQgVHlwZS4uLi4uLi4uLi4uLi4uLi46ICV4XG4iLCBsYXN0X3Njc2lfdHlwZShpaG9zdF9pbmRleClbbGRuXSk7CisJCQlwcmludGsoS0VSTl9FUlIgIiAgICAgICAgICAgICAgQXR0ZW50aW9uIFJlZ2lzdGVyLi4uLi4uLi4uLjogJXhcbiIsIGluYihJTV9BVFROX1JFRyhpaG9zdF9pbmRleCkpKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICBCYXNpYyBDb250cm9sIFJlZ2lzdGVyLi4uLi4uOiAleFxuIiwgaW5iKElNX0NUUl9SRUcoaWhvc3RfaW5kZXgpKSk7CisJCQlwcmludGsoS0VSTl9FUlIgIiAgICAgICAgICAgICAgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3Rlci4uLjogJXhcbiIsIGludHJfcmVnKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICBCYXNpYyBTdGF0dXMgUmVnaXN0ZXIuLi4uLi4uOiAleFxuIiwgaW5iKElNX1NUQVRfUkVHKGlob3N0X2luZGV4KSkpOworCQkJaWYgKChsYXN0X3Njc2lfdHlwZShpaG9zdF9pbmRleClbbGRuXSA9PSBJTV9TQ0IpIHx8IChsYXN0X3Njc2lfdHlwZShpaG9zdF9pbmRleClbbGRuXSA9PSBJTV9MT05HX1NDQikpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiAgICAgICAgICAgICAgU0NCLUNvbW1hbmQuLi4uLi4uLi4uLi4uLi4uLjogJXhcbiIsIGxkKGlob3N0X2luZGV4KVtsZG5dLnNjYi5jb21tYW5kKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiAgICAgICAgICAgICAgU0NCLUVuYWJsZS4uLi4uLi4uLi4uLi4uLi4uLjogJXhcbiIsIGxkKGlob3N0X2luZGV4KVtsZG5dLnNjYi5lbmFibGUpOworCQkJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICBTQ0ItbG9naWNhbCBibG9jayBhZGRyZXNzLi4uOiAlbHhcbiIsIGxkKGlob3N0X2luZGV4KVtsZG5dLnNjYi51MS5sb2dfYmxrX2Fkcik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIgICAgICAgICAgICAgIFNDQi1zeXN0ZW0gYnVmZmVyIGFkZHJlc3MuLi46ICVseFxuIiwgbGQoaWhvc3RfaW5kZXgpW2xkbl0uc2NiLnN5c19idWZfYWRyKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiAgICAgICAgICAgICAgU0NCLXN5c3RlbSBidWZmZXIgbGVuZ3RoLi4uLjogJWx4XG4iLCBsZChpaG9zdF9pbmRleClbbGRuXS5zY2Iuc3lzX2J1Zl9sZW5ndGgpOworCQkJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICBTQ0ItdHNiIGFkZHJlc3MuLi4uLi4uLi4uLi4uOiAlbHhcbiIsIGxkKGlob3N0X2luZGV4KVtsZG5dLnNjYi50c2JfYWRyKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiAgICAgICAgICAgICAgU0NCLUNoYWluIGFkZHJlc3MuLi4uLi4uLi4uLjogJWx4XG4iLCBsZChpaG9zdF9pbmRleClbbGRuXS5zY2Iuc2NiX2NoYWluX2Fkcik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIgICAgICAgICAgICAgIFNDQi1ibG9jayBjb3VudC4uLi4uLi4uLi4uLi46ICV4XG4iLCBsZChpaG9zdF9pbmRleClbbGRuXS5zY2IudTIuYmxrLmNvdW50KTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiAgICAgICAgICAgICAgU0NCLWJsb2NrIGxlbmd0aC4uLi4uLi4uLi4uLjogJXhcbiIsIGxkKGlob3N0X2luZGV4KVtsZG5dLnNjYi51Mi5ibGsubGVuZ3RoKTsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICBTZW5kIHRoaXMgcmVwb3J0IHRvIHRoZSBtYWludGFpbmVyLlxuIik7CisJCQlwYW5pYygiSUJNIE1DQSBTQ1NJOiBGYXRhbCBlcnJvciBtZXNzYWdlIGZyb20gdGhlIHN1YnN5c3RlbSAoMHglWCwweCVYKSFcbiIsIGxhc3RTQ1NJLCBjbWRfcmVzdWx0KTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyogVGhlIGNvbW1hbmQgZXJyb3IgaGFuZGxpbmcgaXMgbWFkZSBzaWxlbnQsIGJ1dCB3ZSB0ZWxsIHRoZQorCQkgKiBjYWxsaW5nIGZ1bmN0aW9uLCB0aGF0IHRoZXJlIGlzIGEgcmVwb3J0ZWQgZXJyb3IgZnJvbSB0aGUKKwkJICogYWRhcHRlci4gKi8KKwkJc3dpdGNoIChjbWRfcmVzdWx0KSB7CisJCWNhc2UgSU1fQURBUFRFUl9IV19GQUlMVVJFOgorCQljYXNlIElNX1NPRlRXQVJFX1NFUVVFTkNJTkdfRVJST1I6CisJCWNhc2UgSU1fQ01EX0VSUk9SOgorCQkJZ2xvYmFsX2NvbW1hbmRfZXJyb3JfZXhjdXNlID0gQ01EX0ZBSUw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdsb2JhbF9jb21tYW5kX2Vycm9yX2V4Y3VzZSA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBpZiBubyBwYW5pYyBhcHBlYXJlZCwgaW5jcmVhc2UgdGhlIGludGVycnVwdC1jb3VudGVyICovCisJSUJNX0RTKGlob3N0X2luZGV4KS50b3RhbF9pbnRlcnJ1cHRzKys7CisJLypvbmx5IGZvciBsb2NhbCBjaGVja2luZyBwaGFzZSAqLworCWlmIChsb2NhbF9jaGVja2luZ19waGFzZV9mbGFnKGlob3N0X2luZGV4KSkgeworCQlzdGF0X3Jlc3VsdChpaG9zdF9pbmRleCkgPSBjbWRfcmVzdWx0OworCQlnb3RfaW50ZXJydXB0KGlob3N0X2luZGV4KSA9IDE7CisJCXJlc2V0X3N0YXR1cyhpaG9zdF9pbmRleCkgPSBJTV9SRVNFVF9GSU5JU0hFRF9PSzsKKwkJbGFzdF9zY3NpX2NvbW1hbmQoaWhvc3RfaW5kZXgpW2xkbl0gPSBOT19TQ1NJOworCQlzcGluX3VubG9jayhkZXYtPmhvc3RfbG9jayk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJLyogaGFuZGxpbmcgb2YgY29tbWFuZHMgY29taW5nIGZyb20gdXBwZXIgbGV2ZWwgb2Ygc2NzaSBkcml2ZXIgKi8KKwlpZiAobGFzdF9zY3NpX3R5cGUoaWhvc3RfaW5kZXgpW2xkbl0gPT0gSU1fSU1NX0NNRCkgeworCQkvKiB2ZXJpZnkgbGRuLCBhbmQgbWF5IGhhbmRsZSByYXJlIHJlc2V0IGltbWVkaWF0ZSBjb21tYW5kICovCisJCWlmICgocmVzZXRfc3RhdHVzKGlob3N0X2luZGV4KSA9PSBJTV9SRVNFVF9JTl9QUk9HUkVTUykgJiYgKGxhc3Rfc2NzaV9jb21tYW5kKGlob3N0X2luZGV4KVtsZG5dID09IElNX1JFU0VUX0lNTV9DTUQpKSB7CisJCQlpZiAoY21kX3Jlc3VsdCA9PSBJTV9DTURfQ09NUExFVEVEX1dJVEhfRkFJTFVSRSkgeworCQkJCWRpc2tfcndfaW5fcHJvZ3Jlc3MgPSAwOworCQkJCVBTMl9ESVNLX0xFRF9PRkYoKTsKKwkJCQlyZXNldF9zdGF0dXMoaWhvc3RfaW5kZXgpID0gSU1fUkVTRVRfRklOSVNIRURfRkFJTDsKKwkJCX0gZWxzZSB7CisJCQkJLypyZXNldCBkaXNrIGxlZCBjb3VudGVyLCB0dXJuIG9mZiBkaXNrIGxlZCAqLworCQkJCWRpc2tfcndfaW5fcHJvZ3Jlc3MgPSAwOworCQkJCVBTMl9ESVNLX0xFRF9PRkYoKTsKKwkJCQlyZXNldF9zdGF0dXMoaWhvc3RfaW5kZXgpID0gSU1fUkVTRVRfRklOSVNIRURfT0s7CisJCQl9CisJCQlzdGF0X3Jlc3VsdChpaG9zdF9pbmRleCkgPSBjbWRfcmVzdWx0OworCQkJbGFzdF9zY3NpX2NvbW1hbmQoaWhvc3RfaW5kZXgpW2xkbl0gPSBOT19TQ1NJOworCQkJbGFzdF9zY3NpX3R5cGUoaWhvc3RfaW5kZXgpW2xkbl0gPSAwOworCQkJc3Bpbl91bmxvY2soZGV2LT5ob3N0X2xvY2spOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9IGVsc2UgaWYgKGxhc3Rfc2NzaV9jb21tYW5kKGlob3N0X2luZGV4KVtsZG5dID09IElNX0FCT1JUX0lNTV9DTUQpIHsKKwkJCS8qIHJlYWN0IG9uIFNDU0kgYWJvcnQgY29tbWFuZCAqLworI2lmZGVmIElNX0RFQlVHX1BST0JFCisJCQlwcmludGsoIklCTSBNQ0EgU0NTSTogSW50ZXJydXB0IGZyb20gU0NTSS1hYm9ydC5cbiIpOworI2VuZGlmCisJCQlkaXNrX3J3X2luX3Byb2dyZXNzID0gMDsKKwkJCVBTMl9ESVNLX0xFRF9PRkYoKTsKKwkJCWNtZCA9IGxkKGlob3N0X2luZGV4KVtsZG5dLmNtZDsKKwkJCWxkKGlob3N0X2luZGV4KVtsZG5dLmNtZCA9IE5VTEw7CisJCQlpZiAoY21kX3Jlc3VsdCA9PSBJTV9DTURfQ09NUExFVEVEX1dJVEhfRkFJTFVSRSkKKwkJCQljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQkJZWxzZQorCQkJCWNtZC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworCQkJc3RhdF9yZXN1bHQoaWhvc3RfaW5kZXgpID0gY21kX3Jlc3VsdDsKKwkJCWxhc3Rfc2NzaV9jb21tYW5kKGlob3N0X2luZGV4KVtsZG5dID0gTk9fU0NTSTsKKwkJCWxhc3Rfc2NzaV90eXBlKGlob3N0X2luZGV4KVtsZG5dID0gMDsKKwkJCWlmIChjbWQtPnNjc2lfZG9uZSkKKwkJCQkoY21kLT5zY3NpX2RvbmUpIChjbWQpOwkvKiBzaG91bGQgYmUgdGhlIGludGVybmFsX2RvbmUgKi8KKwkJCXNwaW5fdW5sb2NrKGRldi0+aG9zdF9sb2NrKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfSBlbHNlIHsKKwkJCWRpc2tfcndfaW5fcHJvZ3Jlc3MgPSAwOworCQkJUFMyX0RJU0tfTEVEX09GRigpOworCQkJcmVzZXRfc3RhdHVzKGlob3N0X2luZGV4KSA9IElNX1JFU0VUX0ZJTklTSEVEX09LOworCQkJc3RhdF9yZXN1bHQoaWhvc3RfaW5kZXgpID0gY21kX3Jlc3VsdDsKKwkJCWxhc3Rfc2NzaV9jb21tYW5kKGlob3N0X2luZGV4KVtsZG5dID0gTk9fU0NTSTsKKwkJCXNwaW5fdW5sb2NrKGRldi0+aG9zdF9sb2NrKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCX0KKwlsYXN0X3Njc2lfY29tbWFuZChpaG9zdF9pbmRleClbbGRuXSA9IE5PX1NDU0k7CisJbGFzdF9zY3NpX3R5cGUoaWhvc3RfaW5kZXgpW2xkbl0gPSAwOworCWNtZCA9IGxkKGlob3N0X2luZGV4KVtsZG5dLmNtZDsKKwlsZChpaG9zdF9pbmRleClbbGRuXS5jbWQgPSBOVUxMOworI2lmZGVmIElNX0RFQlVHX1RJTUVPVVQKKwlpZiAoY21kKSB7CisJCWlmICgoY21kLT50YXJnZXQgPT0gVElNRU9VVF9QVU4pICYmIChjbWQtPmRldmljZS0+bHVuID09IFRJTUVPVVRfTFVOKSkgeworCQkJcHJpbnRrKCJJQk0gTUNBIFNDU0k6IElnbm9yaW5nIGludGVycnVwdCBmcm9tIHB1bj0leCwgbHVuPSV4LlxuIiwgY21kLT50YXJnZXQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJfQorI2VuZGlmCisJLyppZiBubyBjb21tYW5kIHN0cnVjdHVyZSwganVzdCByZXR1cm4sIGVsc2UgY2xlYXIgY21kICovCisJaWYgKCFjbWQpCisJeworCQlzcGluX3VubG9jayhkZXYtPmhvc3RfbG9jayk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKyNpZmRlZiBJTV9ERUJVR19JTlQKKwlwcmludGsoImNtZD0lMDJ4IGlyZWc9JTAyeCBkcz0lMDJ4IGNzPSUwMnggZGU9JTAyeCBjZT0lMDJ4XG4iLCBjbWQtPmNtbmRbMF0sIGludHJfcmVnLCBsZChpaG9zdF9pbmRleClbbGRuXS50c2IuZGV2X3N0YXR1cywgbGQoaWhvc3RfaW5kZXgpW2xkbl0udHNiLmNtZF9zdGF0dXMsIGxkKGlob3N0X2luZGV4KVtsZG5dLnRzYi5kZXZfZXJyb3IsIGxkKGlob3N0X2luZGV4KVtsZG5dLnRzYi5jbWRfZXJyb3IpOworI2VuZGlmCisJLyppZiB0aGlzIGlzIGVuZCBvZiBtZWRpYSByZWFkL3dyaXRlLCBtYXkgdHVybiBvZmYgUFMvMiBkaXNrIGxlZCAqLworCWlmICgobGQoaWhvc3RfaW5kZXgpW2xkbl0uZGV2aWNlX3R5cGUgIT0gVFlQRV9OT19MVU4pICYmIChsZChpaG9zdF9pbmRleClbbGRuXS5kZXZpY2VfdHlwZSAhPSBUWVBFX05PX0RFVklDRSkpIHsKKwkJLyogb25seSBhY2Nlc3MgdGhpcywgaWYgdGhlcmUgd2FzIGEgdmFsaWQgZGV2aWNlIGFkZHJlc3NlZCAqLworCQlpZiAoLS1kaXNrX3J3X2luX3Byb2dyZXNzID09IDApCisJCQlQUzJfRElTS19MRURfT0ZGKCk7CisJfQorCisJLyogSUJNIGRlc2NyaWJlcyB0aGUgc3RhdHVzLW1hc2sgdG8gYmUgMHgxZSwgYnV0IHRoaXMgaXMgbm90IGNvbmZvcm0KKwkgKiB3aXRoIFNDU0ktZGVmaW5pdGlvbiwgSSBzdXBwb3NlLCB0aGUgcmVhc29uIGZvciBpdCBpcyB0aGF0IElCTQorCSAqIGFkYXB0ZXJzIGRvIG5vdCBzdXBwb3J0IENNRF9URVJNSU5BVEVELCBUQVNLX1NFVF9GVUxMIGFuZAorCSAqIEFDQV9BQ1RJVkUgYXMgcmV0dXJuaW5nIHN0YXR1c2J5dGUgaW5mb3JtYXRpb24uIChNTCkgKi8KKwlpZiAoY21kX3Jlc3VsdCA9PSBJTV9DTURfQ09NUExFVEVEX1dJVEhfRkFJTFVSRSkgeworCQljbWQtPnJlc3VsdCA9ICh1bnNpZ25lZCBjaGFyKSAobGQoaWhvc3RfaW5kZXgpW2xkbl0udHNiLmRldl9zdGF0dXMgJiAweDFlKTsKKwkJSUJNX0RTKGlob3N0X2luZGV4KS50b3RhbF9lcnJvcnMrKzsKKwl9IGVsc2UKKwkJY21kLT5yZXN1bHQgPSAwOworCS8qIHdyaXRlIGRldmljZSBzdGF0dXMgaW50byBjbWQtPnJlc3VsdCwgYW5kIGNhbGwgZG9uZSBmdW5jdGlvbiAqLworCWlmIChsYXN0U0NTSSA9PSBOT19TQ1NJKSB7CS8qIHVuZXhwZWN0ZWQgaW50ZXJydXB0IDotKCAqLworCQljbWQtPnJlc3VsdCB8PSBESURfQkFEX0lOVFIgPDwgMTY7CisJCXByaW50aygiSUJNIE1DQSBTQ1NJOiBXQVJOSU5HIC0gSW50ZXJydXB0IGZyb20gbm9uLXBlbmRpbmcgU0NTSS1jb21tYW5kIVxuIik7CisJfSBlbHNlCQkJLyogdGhpbmdzIHdlbnQgcmlnaHQgOi0pICovCisJCWNtZC0+cmVzdWx0IHw9IERJRF9PSyA8PCAxNjsKKwlpZiAoY21kLT5zY3NpX2RvbmUpCisJCShjbWQtPnNjc2lfZG9uZSkgKGNtZCk7CisJc3Bpbl91bmxvY2soZGV2LT5ob3N0X2xvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgaXNzdWVfY21kKGludCBob3N0X2luZGV4LCB1bnNpZ25lZCBsb25nIGNtZF9yZWcsIHVuc2lnbmVkIGNoYXIgYXR0bl9yZWcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkvKiBtdXN0IHdhaXQgZm9yIGF0dGVudGlvbiByZWcgbm90IGJ1c3kgKi8KKwl3aGlsZSAoMSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZShob3N0c1tob3N0X2luZGV4XS0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWlmICghKGluYihJTV9TVEFUX1JFRyhob3N0X2luZGV4KSkgJiBJTV9CVVNZKSkKKwkJCWJyZWFrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3RzW2hvc3RfaW5kZXhdLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl9CisJLyogd3JpdGUgcmVnaXN0ZXJzIGFuZCBlbmFibGUgc3lzdGVtIGludGVycnVwdHMgKi8KKwlvdXRsKGNtZF9yZWcsIElNX0NNRF9SRUcoaG9zdF9pbmRleCkpOworCW91dGIoYXR0bl9yZWcsIElNX0FUVE5fUkVHKGhvc3RfaW5kZXgpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3RzW2hvc3RfaW5kZXhdLT5ob3N0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgaW50ZXJuYWxfZG9uZShTY3NpX0NtbmQgKiBjbWQpCit7CisJY21kLT5TQ3AuU3RhdHVzKys7CisJcmV0dXJuOworfQorCisvKiBTQ1NJLVNDQi1jb21tYW5kIGZvciBkZXZpY2VfaW5xdWlyeSAqLworc3RhdGljIGludCBkZXZpY2VfaW5xdWlyeShpbnQgaG9zdF9pbmRleCwgaW50IGxkbikKK3sKKwlpbnQgcmV0cjsKKwlzdHJ1Y3QgaW1fc2NiICpzY2I7CisJc3RydWN0IGltX3RzYiAqdHNiOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworCXNjYiA9ICYobGQoaG9zdF9pbmRleClbbGRuXS5zY2IpOworCXRzYiA9ICYobGQoaG9zdF9pbmRleClbbGRuXS50c2IpOworCWJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopICgmKGxkKGhvc3RfaW5kZXgpW2xkbl0uYnVmKSk7CisJbGQoaG9zdF9pbmRleClbbGRuXS50c2IuZGV2X3N0YXR1cyA9IDA7CS8qIHByZXBhcmUgc3RhdHVzYmxvY2sgKi8KKwlmb3IgKHJldHIgPSAwOyByZXRyIDwgMzsgcmV0cisrKSB7CisJCS8qIGZpbGwgc2NiIHdpdGggaW5xdWlyeSBjb21tYW5kICovCisJCXNjYi0+Y29tbWFuZCA9IElNX0RFVklDRV9JTlFVSVJZX0NNRCB8IElNX05PX0RJU0NPTk5FQ1Q7CisJCXNjYi0+ZW5hYmxlID0gSU1fUkVQT1JUX1RTQl9PTkxZX09OX0VSUk9SIHwgSU1fUkVBRF9DT05UUk9MIHwgSU1fU1VQUkVTU19FWENFUFRJT05fU0hPUlQgfCBJTV9SRVRSWV9FTkFCTEUgfCBJTV9CWVBBU1NfQlVGRkVSOworCQlsYXN0X3Njc2lfY29tbWFuZChob3N0X2luZGV4KVtsZG5dID0gSU1fREVWSUNFX0lOUVVJUllfQ01EOworCQlsYXN0X3Njc2lfdHlwZShob3N0X2luZGV4KVtsZG5dID0gSU1fU0NCOworCQlzY2ItPnN5c19idWZfYWRyID0gaXNhX3ZpcnRfdG9fYnVzKGJ1Zik7CisJCXNjYi0+c3lzX2J1Zl9sZW5ndGggPSAyNTU7CS8qIG1heGltdW0gYnVmZmVybGVuZ3RoIGdpdmVzIG1heCBpbmZvICovCisJCXNjYi0+dHNiX2FkciA9IGlzYV92aXJ0X3RvX2J1cyh0c2IpOworCQkvKiBpc3N1ZSBzY2IgdG8gcGFzc2VkIGxkbiwgYW5kIGJ1c3kgd2FpdCBmb3IgaW50ZXJydXB0ICovCisJCWdvdF9pbnRlcnJ1cHQoaG9zdF9pbmRleCkgPSAwOworCQlpc3N1ZV9jbWQoaG9zdF9pbmRleCwgaXNhX3ZpcnRfdG9fYnVzKHNjYiksIElNX1NDQiB8IGxkbik7CisJCXdoaWxlICghZ290X2ludGVycnVwdChob3N0X2luZGV4KSkKKwkJCWJhcnJpZXIoKTsKKworCQkvKmlmIGNvbW1hbmQgc3VjY2VzZnVsLCBicmVhayAqLworCQlpZiAoKHN0YXRfcmVzdWx0KGhvc3RfaW5kZXgpID09IElNX1NDQl9DTURfQ09NUExFVEVEKSB8fCAoc3RhdF9yZXN1bHQoaG9zdF9pbmRleCkgPT0gSU1fU0NCX0NNRF9DT01QTEVURURfV0lUSF9SRVRSSUVTKSkKKwkJCXJldHVybiAxOworCX0KKwkvKmlmIGFsbCB0aHJlZSByZXRyaWVzIGZhaWxlZCwgcmV0dXJuICJubyBkZXZpY2UgYXQgdGhpcyBsZG4iICovCisJaWYgKHJldHIgPj0gMykKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCByZWFkX2NhcGFjaXR5KGludCBob3N0X2luZGV4LCBpbnQgbGRuKQoreworCWludCByZXRyOworCXN0cnVjdCBpbV9zY2IgKnNjYjsKKwlzdHJ1Y3QgaW1fdHNiICp0c2I7CisJdW5zaWduZWQgY2hhciAqYnVmOworCisJc2NiID0gJihsZChob3N0X2luZGV4KVtsZG5dLnNjYik7CisJdHNiID0gJihsZChob3N0X2luZGV4KVtsZG5dLnRzYik7CisJYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgKCYobGQoaG9zdF9pbmRleClbbGRuXS5idWYpKTsKKwlsZChob3N0X2luZGV4KVtsZG5dLnRzYi5kZXZfc3RhdHVzID0gMDsKKwlmb3IgKHJldHIgPSAwOyByZXRyIDwgMzsgcmV0cisrKSB7CisJCS8qZmlsbCBzY2Igd2l0aCByZWFkIGNhcGFjaXR5IGNvbW1hbmQgKi8KKwkJc2NiLT5jb21tYW5kID0gSU1fUkVBRF9DQVBBQ0lUWV9DTUQ7CisJCXNjYi0+ZW5hYmxlID0gSU1fUkVQT1JUX1RTQl9PTkxZX09OX0VSUk9SIHwgSU1fUkVBRF9DT05UUk9MIHwgSU1fUkVUUllfRU5BQkxFIHwgSU1fQllQQVNTX0JVRkZFUjsKKwkJbGFzdF9zY3NpX2NvbW1hbmQoaG9zdF9pbmRleClbbGRuXSA9IElNX1JFQURfQ0FQQUNJVFlfQ01EOworCQlsYXN0X3Njc2lfdHlwZShob3N0X2luZGV4KVtsZG5dID0gSU1fU0NCOworCQlzY2ItPnN5c19idWZfYWRyID0gaXNhX3ZpcnRfdG9fYnVzKGJ1Zik7CisJCXNjYi0+c3lzX2J1Zl9sZW5ndGggPSA4OworCQlzY2ItPnRzYl9hZHIgPSBpc2FfdmlydF90b19idXModHNiKTsKKwkJLyppc3N1ZSBzY2IgdG8gcGFzc2VkIGxkbiwgYW5kIGJ1c3kgd2FpdCBmb3IgaW50ZXJydXB0ICovCisJCWdvdF9pbnRlcnJ1cHQoaG9zdF9pbmRleCkgPSAwOworCQlpc3N1ZV9jbWQoaG9zdF9pbmRleCwgaXNhX3ZpcnRfdG9fYnVzKHNjYiksIElNX1NDQiB8IGxkbik7CisJCXdoaWxlICghZ290X2ludGVycnVwdChob3N0X2luZGV4KSkKKwkJCWJhcnJpZXIoKTsKKworCQkvKmlmIGdvdCBjYXBhY2l0eSwgZ2V0IGJsb2NrIGxlbmd0aCBhbmQgcmV0dXJuIG9uZSBkZXZpY2UgZm91bmQgKi8KKwkJaWYgKChzdGF0X3Jlc3VsdChob3N0X2luZGV4KSA9PSBJTV9TQ0JfQ01EX0NPTVBMRVRFRCkgfHwgKHN0YXRfcmVzdWx0KGhvc3RfaW5kZXgpID09IElNX1NDQl9DTURfQ09NUExFVEVEX1dJVEhfUkVUUklFUykpCisJCQlyZXR1cm4gMTsKKwl9CisJLyppZiBhbGwgdGhyZWUgcmV0cmllcyBmYWlsZWQsIHJldHVybiAibm8gZGV2aWNlIGF0IHRoaXMgbGRuIiAqLworCWlmIChyZXRyID49IDMpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3Bvc19pbmZvKGludCBob3N0X2luZGV4KQoreworCWludCByZXRyOworCXN0cnVjdCBpbV9zY2IgKnNjYjsKKwlzdHJ1Y3QgaW1fdHNiICp0c2I7CisJdW5zaWduZWQgY2hhciAqYnVmOworCisJc2NiID0gJihsZChob3N0X2luZGV4KVtNQVhfTE9HX0RFVl0uc2NiKTsKKwl0c2IgPSAmKGxkKGhvc3RfaW5kZXgpW01BWF9MT0dfREVWXS50c2IpOworCWJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopICgmKGxkKGhvc3RfaW5kZXgpW01BWF9MT0dfREVWXS5idWYpKTsKKwlsZChob3N0X2luZGV4KVtNQVhfTE9HX0RFVl0udHNiLmRldl9zdGF0dXMgPSAwOworCWZvciAocmV0ciA9IDA7IHJldHIgPCAzOyByZXRyKyspIHsKKwkJLypmaWxsIHNjYiB3aXRoIGdldF9wb3NfaW5mbyBjb21tYW5kICovCisJCXNjYi0+Y29tbWFuZCA9IElNX0dFVF9QT1NfSU5GT19DTUQ7CisJCXNjYi0+ZW5hYmxlID0gSU1fUkVBRF9DT05UUk9MIHwgSU1fUkVQT1JUX1RTQl9PTkxZX09OX0VSUk9SIHwgSU1fUkVUUllfRU5BQkxFIHwgSU1fQllQQVNTX0JVRkZFUjsKKwkJbGFzdF9zY3NpX2NvbW1hbmQoaG9zdF9pbmRleClbTUFYX0xPR19ERVZdID0gSU1fR0VUX1BPU19JTkZPX0NNRDsKKwkJbGFzdF9zY3NpX3R5cGUoaG9zdF9pbmRleClbTUFYX0xPR19ERVZdID0gSU1fU0NCOworCQlzY2ItPnN5c19idWZfYWRyID0gaXNhX3ZpcnRfdG9fYnVzKGJ1Zik7CisJCWlmIChzcGVjaWFsKGhvc3RfaW5kZXgpID09IElCTV9TQ1NJMl9GVykKKwkJCXNjYi0+c3lzX2J1Zl9sZW5ndGggPSAyNTY7CS8qIGdldCBhbGwgaW5mbyBmcm9tIEYvVyBhZGFwdGVyICovCisJCWVsc2UKKwkJCXNjYi0+c3lzX2J1Zl9sZW5ndGggPSAxODsJLyogZ2V0IGV4YWN0bHkgMTggYnl0ZXMgZm9yIG90aGVyIFNDU0kgKi8KKwkJc2NiLT50c2JfYWRyID0gaXNhX3ZpcnRfdG9fYnVzKHRzYik7CisJCS8qaXNzdWUgc2NiIHRvIGxkbj0xNSwgYW5kIGJ1c3kgd2FpdCBmb3IgaW50ZXJydXB0ICovCisJCWdvdF9pbnRlcnJ1cHQoaG9zdF9pbmRleCkgPSAwOworCQlpc3N1ZV9jbWQoaG9zdF9pbmRleCwgaXNhX3ZpcnRfdG9fYnVzKHNjYiksIElNX1NDQiB8IE1BWF9MT0dfREVWKTsKKwkJCisJCS8qIEZJWE1FOiB0aW1lb3V0ICovCisJCXdoaWxlICghZ290X2ludGVycnVwdChob3N0X2luZGV4KSkKKwkJCWJhcnJpZXIoKTsKKworCQkvKmlmIGdvdCBQT1Mtc3R1ZmYsIGdldCBibG9jayBsZW5ndGggYW5kIHJldHVybiBvbmUgZGV2aWNlIGZvdW5kICovCisJCWlmICgoc3RhdF9yZXN1bHQoaG9zdF9pbmRleCkgPT0gSU1fU0NCX0NNRF9DT01QTEVURUQpIHx8IChzdGF0X3Jlc3VsdChob3N0X2luZGV4KSA9PSBJTV9TQ0JfQ01EX0NPTVBMRVRFRF9XSVRIX1JFVFJJRVMpKQorCQkJcmV0dXJuIDE7CisJfQorCS8qIGlmIGFsbCB0aHJlZSByZXRyaWVzIGZhaWxlZCwgcmV0dXJuICJubyBkZXZpY2UgYXQgdGhpcyBsZG4iICovCisJaWYgKHJldHIgPj0gMykKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworLyogU0NTSS1pbW1lZGlhdGUtY29tbWFuZCBmb3IgYXNzaWduLiBUaGlzIGZ1bmN0aW9ucyBtYXBzL3VubWFwcyBzcGVjaWZpYworIGxkbi1udW1iZXJzIG9uIFNDU0kgKFBVTixMVU4pLiBJdCBpcyBuZWVkZWQgZm9yIHByZXNldHRpbmcgb2YgdGhlCisgc3Vic3lzdGVtIGFuZCBmb3IgZHluYW1pY2FsIHJlbWFwcGluZyBvZCBsZG5zLiAqLworc3RhdGljIGludCBpbW1lZGlhdGVfYXNzaWduKGludCBob3N0X2luZGV4LCB1bnNpZ25lZCBpbnQgcHVuLCB1bnNpZ25lZCBpbnQgbHVuLCB1bnNpZ25lZCBpbnQgbGRuLCB1bnNpZ25lZCBpbnQgb3BlcmF0aW9uKQoreworCWludCByZXRyOworCXVuc2lnbmVkIGxvbmcgaW1tX2NtZDsKKworCWZvciAocmV0ciA9IDA7IHJldHIgPCAzOyByZXRyKyspIHsKKwkJLyogc2VsZWN0IG11dGF0aW9uIGxldmVsIG9mIHRoZSBTQ1NJLWFkYXB0ZXIgKi8KKwkJc3dpdGNoIChzcGVjaWFsKGhvc3RfaW5kZXgpKSB7CisJCWNhc2UgSUJNX1NDU0kyX0ZXOgorCQkJaW1tX2NtZCA9ICh1bnNpZ25lZCBsb25nKSAoSU1fQVNTSUdOX0lNTV9DTUQpOworCQkJaW1tX2NtZCB8PSAodW5zaWduZWQgbG9uZykgKChsdW4gJiA3KSA8PCAyNCk7CisJCQlpbW1fY21kIHw9ICh1bnNpZ25lZCBsb25nKSAoKG9wZXJhdGlvbiAmIDEpIDw8IDIzKTsKKwkJCWltbV9jbWQgfD0gKHVuc2lnbmVkIGxvbmcpICgocHVuICYgNykgPDwgMjApIHwgKChwdW4gJiA4KSA8PCAyNCk7CisJCQlpbW1fY21kIHw9ICh1bnNpZ25lZCBsb25nKSAoKGxkbiAmIDE1KSA8PCAxNik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWltbV9jbWQgPSBpbmwoSU1fQ01EX1JFRyhob3N0X2luZGV4KSk7CisJCQlpbW1fY21kICY9ICh1bnNpZ25lZCBsb25nKSAoMHhGODAwMDAwMCk7CS8qIGtlZXAgcmVzZXJ2ZWQgYml0cyAqLworCQkJaW1tX2NtZCB8PSAodW5zaWduZWQgbG9uZykgKElNX0FTU0lHTl9JTU1fQ01EKTsKKwkJCWltbV9jbWQgfD0gKHVuc2lnbmVkIGxvbmcpICgobHVuICYgNykgPDwgMjQpOworCQkJaW1tX2NtZCB8PSAodW5zaWduZWQgbG9uZykgKChvcGVyYXRpb24gJiAxKSA8PCAyMyk7CisJCQlpbW1fY21kIHw9ICh1bnNpZ25lZCBsb25nKSAoKHB1biAmIDcpIDw8IDIwKTsKKwkJCWltbV9jbWQgfD0gKHVuc2lnbmVkIGxvbmcpICgobGRuICYgMTUpIDw8IDE2KTsKKwkJCWJyZWFrOworCQl9CisJCWxhc3Rfc2NzaV9jb21tYW5kKGhvc3RfaW5kZXgpW01BWF9MT0dfREVWXSA9IElNX0FTU0lHTl9JTU1fQ01EOworCQlsYXN0X3Njc2lfdHlwZShob3N0X2luZGV4KVtNQVhfTE9HX0RFVl0gPSBJTV9JTU1fQ01EOworCQlnb3RfaW50ZXJydXB0KGhvc3RfaW5kZXgpID0gMDsKKwkJaXNzdWVfY21kKGhvc3RfaW5kZXgsICh1bnNpZ25lZCBsb25nKSAoaW1tX2NtZCksIElNX0lNTV9DTUQgfCBNQVhfTE9HX0RFVik7CisJCXdoaWxlICghZ290X2ludGVycnVwdChob3N0X2luZGV4KSkKKwkJCWJhcnJpZXIoKTsKKworCQkvKmlmIGNvbW1hbmQgc3VjY2VzZnVsLCBicmVhayAqLworCQlpZiAoc3RhdF9yZXN1bHQoaG9zdF9pbmRleCkgPT0gSU1fSU1NRURJQVRFX0NNRF9DT01QTEVURUQpCisJCQlyZXR1cm4gMTsKKwl9CisJaWYgKHJldHIgPj0gMykKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBpbW1lZGlhdGVfZmVhdHVyZShpbnQgaG9zdF9pbmRleCwgdW5zaWduZWQgaW50IHNwZWVkLCB1bnNpZ25lZCBpbnQgdGltZW91dCkKK3sKKwlpbnQgcmV0cjsKKwl1bnNpZ25lZCBsb25nIGltbV9jbWQ7CisKKwlmb3IgKHJldHIgPSAwOyByZXRyIDwgMzsgcmV0cisrKSB7CisJCS8qIHNlbGVjdCBtdXRhdGlvbiBsZXZlbCBvZiB0aGUgU0NTSS1hZGFwdGVyICovCisJCWltbV9jbWQgPSBJTV9GRUFUVVJFX0NUUl9JTU1fQ01EOworCQlpbW1fY21kIHw9ICh1bnNpZ25lZCBsb25nKSAoKHNwZWVkICYgMHg3KSA8PCAyOSk7CisJCWltbV9jbWQgfD0gKHVuc2lnbmVkIGxvbmcpICgodGltZW91dCAmIDB4MWZmZikgPDwgMTYpOworCQlsYXN0X3Njc2lfY29tbWFuZChob3N0X2luZGV4KVtNQVhfTE9HX0RFVl0gPSBJTV9GRUFUVVJFX0NUUl9JTU1fQ01EOworCQlsYXN0X3Njc2lfdHlwZShob3N0X2luZGV4KVtNQVhfTE9HX0RFVl0gPSBJTV9JTU1fQ01EOworCQlnb3RfaW50ZXJydXB0KGhvc3RfaW5kZXgpID0gMDsKKwkJLyogd2UgbmVlZCB0byBydW4gaW50byBjb21tYW5kIGVycm9ycyBpbiBvcmRlciB0byBwcm9iZSBmb3IgdGhlCisJCSAqIHJpZ2h0IHNwZWVkISAqLworCQlnbG9iYWxfY29tbWFuZF9lcnJvcl9leGN1c2UgPSAxOworCQlpc3N1ZV9jbWQoaG9zdF9pbmRleCwgKHVuc2lnbmVkIGxvbmcpIChpbW1fY21kKSwgSU1fSU1NX0NNRCB8IE1BWF9MT0dfREVWKTsKKwkJCisJCS8qIEZJWE1FOiB0aW1lb3V0ICovCisJCXdoaWxlICghZ290X2ludGVycnVwdChob3N0X2luZGV4KSkKKwkJCWJhcnJpZXIoKTsKKwkJaWYgKGdsb2JhbF9jb21tYW5kX2Vycm9yX2V4Y3VzZSA9PSBDTURfRkFJTCkgeworCQkJZ2xvYmFsX2NvbW1hbmRfZXJyb3JfZXhjdXNlID0gMDsKKwkJCXJldHVybiAyOworCQl9IGVsc2UKKwkJCWdsb2JhbF9jb21tYW5kX2Vycm9yX2V4Y3VzZSA9IDA7CisJCS8qaWYgY29tbWFuZCBzdWNjZXNmdWwsIGJyZWFrICovCisJCWlmIChzdGF0X3Jlc3VsdChob3N0X2luZGV4KSA9PSBJTV9JTU1FRElBVEVfQ01EX0NPTVBMRVRFRCkKKwkJCXJldHVybiAxOworCX0KKwlpZiAocmV0ciA+PSAzKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOworfQorCisjaWZkZWYgQ09ORklHX0lCTU1DQV9TQ1NJX0RFVl9SRVNFVAorc3RhdGljIGludCBpbW1lZGlhdGVfcmVzZXQoaW50IGhvc3RfaW5kZXgsIHVuc2lnbmVkIGludCBsZG4pCit7CisJaW50IHJldHJpZXM7CisJaW50IHRpY2tzOworCXVuc2lnbmVkIGxvbmcgaW1tX2NvbW1hbmQ7CisKKwlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgMzsgcmV0cmllcysrKSB7CisJCWltbV9jb21tYW5kID0gaW5sKElNX0NNRF9SRUcoaG9zdF9pbmRleCkpOworCQlpbW1fY29tbWFuZCAmPSAodW5zaWduZWQgbG9uZykgKDB4RkZGRjAwMDApOwkvKiBrZWVwIHJlc2VydmVkIGJpdHMgKi8KKwkJaW1tX2NvbW1hbmQgfD0gKHVuc2lnbmVkIGxvbmcpIChJTV9SRVNFVF9JTU1fQ01EKTsKKwkJbGFzdF9zY3NpX2NvbW1hbmQoaG9zdF9pbmRleClbbGRuXSA9IElNX1JFU0VUX0lNTV9DTUQ7CisJCWxhc3Rfc2NzaV90eXBlKGhvc3RfaW5kZXgpW2xkbl0gPSBJTV9JTU1fQ01EOworCQlnb3RfaW50ZXJydXB0KGhvc3RfaW5kZXgpID0gMDsKKwkJcmVzZXRfc3RhdHVzKGhvc3RfaW5kZXgpID0gSU1fUkVTRVRfSU5fUFJPR1JFU1M7CisJCWlzc3VlX2NtZChob3N0X2luZGV4LCAodW5zaWduZWQgbG9uZykgKGltbV9jb21tYW5kKSwgSU1fSU1NX0NNRCB8IGxkbik7CisJCXRpY2tzID0gSU1fUkVTRVRfREVMQVkgKiBIWjsKKwkJd2hpbGUgKHJlc2V0X3N0YXR1cyhob3N0X2luZGV4KSA9PSBJTV9SRVNFVF9JTl9QUk9HUkVTUyAmJiAtLXRpY2tzKSB7CisJCQl1ZGVsYXkoKDEgKyA5OTkgLyBIWikgKiAxMDAwKTsKKwkJCWJhcnJpZXIoKTsKKwkJfQorCQkvKiBpZiByZXNldCBkaWQgbm90IGNvbXBsZXRlLCBqdXN0IGNvbXBsYWluICovCisJCWlmICghdGlja3MpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiSUJNIE1DQSBTQ1NJOiByZXNldCBkaWQgbm90IGNvbXBsZXRlIHdpdGhpbiAlZCBzZWNvbmRzLlxuIiwgSU1fUkVTRVRfREVMQVkpOworCQkJcmVzZXRfc3RhdHVzKGhvc3RfaW5kZXgpID0gSU1fUkVTRVRfRklOSVNIRURfT0s7CisJCQkvKiBkaWQgbm90IHdvcmssIGZpbmlzaCAqLworCQkJcmV0dXJuIDE7CisJCX0KKwkJLyppZiBjb21tYW5kIHN1Y2Nlc2Z1bCwgYnJlYWsgKi8KKwkJaWYgKHN0YXRfcmVzdWx0KGhvc3RfaW5kZXgpID09IElNX0lNTUVESUFURV9DTURfQ09NUExFVEVEKQorCQkJcmV0dXJuIDE7CisJfQorCWlmIChyZXRyaWVzID49IDMpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyogdHlwZS1pbnRlcnByZXRlciBmb3IgcGh5c2ljYWwgZGV2aWNlIG51bWJlcnMgKi8KK3N0YXRpYyBjaGFyICp0aV9wKGludCBkZXYpCit7CisJc3dpdGNoIChkZXYpIHsKKwljYXNlIFRZUEVfSUJNX1NDU0lfQURBUFRFUjoKKwkJcmV0dXJuICgiQSIpOworCWNhc2UgVFlQRV9ESVNLOgorCQlyZXR1cm4gKCJEIik7CisJY2FzZSBUWVBFX1RBUEU6CisJCXJldHVybiAoIlQiKTsKKwljYXNlIFRZUEVfUFJPQ0VTU09SOgorCQlyZXR1cm4gKCJQIik7CisJY2FzZSBUWVBFX1dPUk06CisJCXJldHVybiAoIlciKTsKKwljYXNlIFRZUEVfUk9NOgorCQlyZXR1cm4gKCJSIik7CisJY2FzZSBUWVBFX1NDQU5ORVI6CisJCXJldHVybiAoIlMiKTsKKwljYXNlIFRZUEVfTU9EOgorCQlyZXR1cm4gKCJNIik7CisJY2FzZSBUWVBFX01FRElVTV9DSEFOR0VSOgorCQlyZXR1cm4gKCJDIik7CisJY2FzZSBUWVBFX05PX0xVTjoKKwkJcmV0dXJuICgiKyIpOwkvKiBzaG93IE5PX0xVTiAqLworCX0KKwlyZXR1cm4gKCItIik7CQkvKiBUWVBFX05PX0RFVklDRSBhbmQgb3RoZXJzICovCit9CisKKy8qIGludGVycHJldGVyIGZvciBsb2dpY2FsIGRldmljZSBudW1iZXJzIChsZG4pICovCitzdGF0aWMgY2hhciAqdGlfbChpbnQgdmFsKQoreworCWNvbnN0IGNoYXIgaGV4WzE2XSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKwlzdGF0aWMgY2hhciBhbnN3ZXJbMl07CisKKwlhbnN3ZXJbMV0gPSAoY2hhcikgKDB4MCk7CisJaWYgKHZhbCA8PSBNQVhfTE9HX0RFVikKKwkJYW5zd2VyWzBdID0gaGV4W3ZhbF07CisJZWxzZQorCQlhbnN3ZXJbMF0gPSAnLSc7CisJcmV0dXJuIChjaGFyICopICZhbnN3ZXI7Cit9CisKKy8qIHRyYW5zZmVycyBiaXRwYXR0ZXJuIG9mIHRoZSBmZWF0dXJlIGNvbW1hbmQgdG8gdmFsdWVzIGluIE1IeiAqLworc3RhdGljIGNoYXIgKmlibXJhdGUodW5zaWduZWQgaW50IHNwZWVkLCBpbnQgaSkKK3sKKwlzd2l0Y2ggKHNwZWVkKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gaSA/ICI1LjAwIiA6ICIxMC4wMCI7CisJY2FzZSAxOgorCQlyZXR1cm4gaSA/ICI0LjAwIiA6ICI4LjAwIjsKKwljYXNlIDI6CisJCXJldHVybiBpID8gIjMuMzMiIDogIjYuNjYiOworCWNhc2UgMzoKKwkJcmV0dXJuIGkgPyAiMi44NiIgOiAiNS4wMCI7CisJY2FzZSA0OgorCQlyZXR1cm4gaSA/ICIyLjUwIiA6ICI0LjAwIjsKKwljYXNlIDU6CisJCXJldHVybiBpID8gIjIuMjIiIDogIjMuMTAiOworCWNhc2UgNjoKKwkJcmV0dXJuIGkgPyAiMi4wMCIgOiAiMi41MCI7CisJY2FzZSA3OgorCQlyZXR1cm4gaSA/ICIxLjgyIiA6ICIyLjAwIjsKKwl9CisJcmV0dXJuICItLS0iOworfQorCitzdGF0aWMgaW50IHByb2JlX2Rpc3BsYXkoaW50IHdoYXQpCit7CisJc3RhdGljIGludCByb3RhdG9yID0gMDsKKwljb25zdCBjaGFyIHJvdG9yW10gPSAifC8tXFwiOworCisJaWYgKCEoZGlzcGxheV9tb2RlICYgTEVEX0RJU1ApKQorCQlyZXR1cm4gMDsKKwlpZiAoIXdoYXQpIHsKKwkJb3V0bCgweDIwMjAyMDIwLCBNT0Q5NV9MRURfUE9SVCk7CisJCW91dGwoMHgyMDIwMjAyMCwgTU9EOTVfTEVEX1BPUlQgKyA0KTsKKwl9IGVsc2UgeworCQlvdXRiKCdTJywgTU9EOTVfTEVEX1BPUlQgKyA3KTsKKwkJb3V0YignQycsIE1PRDk1X0xFRF9QT1JUICsgNik7CisJCW91dGIoJ1MnLCBNT0Q5NV9MRURfUE9SVCArIDUpOworCQlvdXRiKCdJJywgTU9EOTVfTEVEX1BPUlQgKyA0KTsKKwkJb3V0YignaScsIE1PRDk1X0xFRF9QT1JUICsgMyk7CisJCW91dGIoJ24nLCBNT0Q5NV9MRURfUE9SVCArIDIpOworCQlvdXRiKCdpJywgTU9EOTVfTEVEX1BPUlQgKyAxKTsKKwkJb3V0YigoY2hhcikgKHJvdG9yW3JvdGF0b3JdKSwgTU9EOTVfTEVEX1BPUlQpOworCQlyb3RhdG9yKys7CisJCWlmIChyb3RhdG9yID4gMykKKwkJCXJvdGF0b3IgPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9iZV9idXNfbW9kZShpbnQgaG9zdF9pbmRleCkKK3sKKwlzdHJ1Y3QgaW1fcG9zX2luZm8gKmluZm87CisJaW50IG51bV9idXMgPSAwOworCWludCBsZG47CisKKwlpbmZvID0gKHN0cnVjdCBpbV9wb3NfaW5mbyAqKSAoJihsZChob3N0X2luZGV4KVtNQVhfTE9HX0RFVl0uYnVmKSk7CisJaWYgKGdldF9wb3NfaW5mbyhob3N0X2luZGV4KSkgeworCQlpZiAoaW5mby0+Y29ubmVjdG9yX3NpemUgJiAweGYwMDApCisJCQlzdWJzeXN0ZW1fY29ubmVjdG9yX3NpemUoaG9zdF9pbmRleCkgPSAxNjsKKwkJZWxzZQorCQkJc3Vic3lzdGVtX2Nvbm5lY3Rvcl9zaXplKGhvc3RfaW5kZXgpID0gMzI7CisJCW51bV9idXMgfD0gKGluZm8tPnBvc180YiAmIDgpID4+IDM7CisJCWZvciAobGRuID0gMDsgbGRuIDw9IE1BWF9MT0dfREVWOyBsZG4rKykgeworCQkJaWYgKChzcGVjaWFsKGhvc3RfaW5kZXgpID09IElCTV9TQ1NJX1dDQUNIRSkgfHwgKHNwZWNpYWwoaG9zdF9pbmRleCkgPT0gSUJNXzc1NjhfV0NBQ0hFKSkgeworCQkJCWlmICghKChpbmZvLT5jYWNoZV9zdGF0ID4+IGxkbikgJiAxKSkKKwkJCQkJbGQoaG9zdF9pbmRleClbbGRuXS5jYWNoZV9mbGFnID0gMDsKKwkJCX0KKwkJCWlmICghKChpbmZvLT5yZXRyeV9zdGF0ID4+IGxkbikgJiAxKSkKKwkJCQlsZChob3N0X2luZGV4KVtsZG5dLnJldHJ5X2ZsYWcgPSAwOworCQl9CisjaWZkZWYgSU1fREVCVUdfUFJPQkUKKwkJcHJpbnRrKCJJQk0gTUNBIFNDU0k6IFNDU0ktQ2FjaGUgYml0czogIik7CisJCWZvciAobGRuID0gMDsgbGRuIDw9IE1BWF9MT0dfREVWOyBsZG4rKykgeworCQkJcHJpbnRrKCIlZCIsIGxkKGhvc3RfaW5kZXgpW2xkbl0uY2FjaGVfZmxhZyk7CisJCX0KKwkJcHJpbnRrKCJcbklCTSBNQ0EgU0NTSTogU0NTSS1SZXRyeSBiaXRzOiAiKTsKKwkJZm9yIChsZG4gPSAwOyBsZG4gPD0gTUFYX0xPR19ERVY7IGxkbisrKSB7CisJCQlwcmludGsoIiVkIiwgbGQoaG9zdF9pbmRleClbbGRuXS5yZXRyeV9mbGFnKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisjZW5kaWYKKwl9CisJcmV0dXJuIG51bV9idXM7Cit9CisKKy8qIHByb2Jpbmcgc2NzaSBkZXZpY2VzICovCitzdGF0aWMgdm9pZCBjaGVja19kZXZpY2VzKGludCBob3N0X2luZGV4LCBpbnQgYWRhcHRlcnR5cGUpCit7CisJaW50IGlkLCBsdW4sIGxkbiwgdGlja3M7CisJaW50IGNvdW50X2RldmljZXM7CS8qIGxvY2FsIGNvdW50ZXIgZm9yIGNvbm5lY3RlZCBkZXZpY2UgKi8KKwlpbnQgbWF4X3B1bjsKKwlpbnQgbnVtX2J1czsKKwlpbnQgc3BlZWRydW47CQkvKiBsb2NhbCBhZGFwdGVyX3NwZWVkIGNoZWNrIHZhcmlhYmxlICovCisKKwkvKiBhc3NpZ24gZGVmYXVsdCB2YWx1ZXMgdG8gY2VydGFpbiB2YXJpYWJsZXMgKi8KKwl0aWNrcyA9IDA7CisJY291bnRfZGV2aWNlcyA9IDA7CisJSUJNX0RTKGhvc3RfaW5kZXgpLmR5bl9mbGFnID0gMDsJLyogbm9ybWFsbHkgbm8gbmVlZCBmb3IgZHluYW1pY2FsIGxkbiBtYW5hZ2VtZW50ICovCisJSUJNX0RTKGhvc3RfaW5kZXgpLnRvdGFsX2Vycm9ycyA9IDA7CS8qIHNldCBlcnJvcmNvdW50ZXIgdG8gMCAqLworCW5leHRfbGRuKGhvc3RfaW5kZXgpID0gNzsJLyogbmV4dCBsZG4gdG8gYmUgYXNzaWduZWQgaXMgNywgYmVjYXVzZSAwLTYgaXMgJ2hhcmR3aXJlZCcgKi8KKworCS8qIGluaXRpYWxpemUgdGhlIHZlcnkgaW1wb3J0YW50IGRyaXZlci1pbmZvcm1hdGlvbmFsIGFycmF5cy9zdHJ1Y3RzICovCisJbWVtc2V0KGxkKGhvc3RfaW5kZXgpLCAwLCBzaXplb2YobGQoaG9zdF9pbmRleCkpKTsKKwlmb3IgKGxkbiA9IDA7IGxkbiA8PSBNQVhfTE9HX0RFVjsgbGRuKyspIHsKKwkJbGFzdF9zY3NpX2NvbW1hbmQoaG9zdF9pbmRleClbbGRuXSA9IE5PX1NDU0k7CS8qIGVtcHRpZnkgbGFzdCBTQ1NJLWNvbW1hbmQgc3RvcmFnZSAqLworCQlsYXN0X3Njc2lfdHlwZShob3N0X2luZGV4KVtsZG5dID0gMDsKKwkJbGQoaG9zdF9pbmRleClbbGRuXS5jYWNoZV9mbGFnID0gMTsKKwkJbGQoaG9zdF9pbmRleClbbGRuXS5yZXRyeV9mbGFnID0gMTsKKwl9CisJbWVtc2V0KGdldF9sZG4oaG9zdF9pbmRleCksIFRZUEVfTk9fREVWSUNFLCBzaXplb2YoZ2V0X2xkbihob3N0X2luZGV4KSkpOwkvKiB0aGlzIGlzIGVzc2VudGlhbCAhICovCisJbWVtc2V0KGdldF9zY3NpKGhvc3RfaW5kZXgpLCBUWVBFX05PX0RFVklDRSwgc2l6ZW9mKGdldF9zY3NpKGhvc3RfaW5kZXgpKSk7CS8qIHRoaXMgaXMgZXNzZW50aWFsICEgKi8KKwlmb3IgKGx1biA9IDA7IGx1biA8IDg7IGx1bisrKSB7CisJCS8qIG1hcmsgdGhlIGFkYXB0ZXIgYXQgaXRzIHB1biBvbiBhbGwgbHVucyAqLworCQlnZXRfc2NzaShob3N0X2luZGV4KVtzdWJzeXN0ZW1fcHVuKGhvc3RfaW5kZXgpXVtsdW5dID0gVFlQRV9JQk1fU0NTSV9BREFQVEVSOworCQlnZXRfbGRuKGhvc3RfaW5kZXgpW3N1YnN5c3RlbV9wdW4oaG9zdF9pbmRleCldW2x1bl0gPSBNQVhfTE9HX0RFVjsJLyogbWFrZSBzdXJlLCB0aGUgc3Vic3lzdGVtCisJCQkJCQkJCQkJCSAgIGxkbiBpcyBhY3RpdmUgZm9yIGFsbAorCQkJCQkJCQkJCQkgICBsdW5zLiAqLworCX0KKwlwcm9iZV9kaXNwbGF5KDApOwkvKiBTdXBlcmNvb2wgZGlzcGxheSB1c2FnZSBkdXJpbmcgU0NTSS1wcm9iaW5nLiAqLworCS8qIFRoaXMgbWFrZXMgc2Vuc2UsIHdoZW4gYm9vdGluZyB3aXRob3V0IGFueSAqLworCS8qIG1vbml0b3IgY29ubmVjdGVkIG9uIG1vZGVsIFhYOTUuICovCisKKwkvKiBTVEVQIDE6ICovCisJYWRhcHRlcl9zcGVlZChob3N0X2luZGV4KSA9IGdsb2JhbF9hZGFwdGVyX3NwZWVkOworCXNwZWVkcnVuID0gYWRhcHRlcl9zcGVlZChob3N0X2luZGV4KTsKKwl3aGlsZSAoaW1tZWRpYXRlX2ZlYXR1cmUoaG9zdF9pbmRleCwgc3BlZWRydW4sIGFkYXB0ZXJfdGltZW91dCkgPT0gMikgeworCQlwcm9iZV9kaXNwbGF5KDEpOworCQlpZiAoc3BlZWRydW4gPT0gNykKKwkJCXBhbmljKCJJQk0gTUNBIFNDU0k6IENhbm5vdCBzZXQgU3luY2hyb25vdXMtVHJhbnNmZXItUmF0ZSFcbiIpOworCQlzcGVlZHJ1bisrOworCQlpZiAoc3BlZWRydW4gPiA3KQorCQkJc3BlZWRydW4gPSA3OworCX0KKwlhZGFwdGVyX3NwZWVkKGhvc3RfaW5kZXgpID0gc3BlZWRydW47CisJLyogR2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGFkYXB0ZXIsIG5lY2Vzc2FyeSBmb3IKKwkgKiBkZXZpY2Ugb3BlcmF0aW9uczogKi8KKwludW1fYnVzID0gcHJvYmVfYnVzX21vZGUoaG9zdF9pbmRleCk7CisKKwkvKiBudW1fYnVzIGNvbnRhaW5zIG9ubHkgdmFsaWQgZGF0YSBmb3IgdGhlIEYvVyBhZGFwdGVyISAqLworCWlmIChhZGFwdGVydHlwZSA9PSBJQk1fU0NTSTJfRlcpIHsJLyogRi9XIFNDU0kgYWRhcHRlcjogKi8KKwkJLyogRi9XIGFkYXB0ZXIgUFVOLXNwYWNlIGV4dGVuc2lvbiBldmFsdWF0aW9uOiAqLworCQlpZiAobnVtX2J1cykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiSUJNIE1DQSBTQ1NJOiBTZXBhcmF0ZSBidXMgbW9kZSAod2lkZS1hZGRyZXNzaW5nIGVuYWJsZWQpXG4iKTsKKwkJCXN1YnN5c3RlbV9tYXhpZChob3N0X2luZGV4KSA9IDE2OworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiSUJNIE1DQSBTQ1NJOiBDb21iaW5lZCBidXMgbW9kZSAod2lkZS1hZGRyZXNzaW5nIGRpc2FibGVkKVxuIik7CisJCQlzdWJzeXN0ZW1fbWF4aWQoaG9zdF9pbmRleCkgPSA4OworCQl9CisJCXByaW50ayhLRVJOX0lORk8gIklCTSBNQ0EgU0NTSTogU3luYy4tUmF0ZSAoRi9XOiAyMCwgSW50LjogMTAsIEV4dC46ICVzKSBNQnl0ZXMvc1xuIiwgaWJtcmF0ZShzcGVlZHJ1biwgYWRhcHRlcnR5cGUpKTsKKwl9IGVsc2UJCQkvKiBhbGwgb3RoZXIgSUJNIFNDU0kgYWRhcHRlcnM6ICovCisJCXByaW50ayhLRVJOX0lORk8gIklCTSBNQ0EgU0NTSTogU3luY2hyb25vdXMtU0NTSS1UcmFuc2Zlci1SYXRlOiAlcyBNQnl0ZXMvc1xuIiwgaWJtcmF0ZShzcGVlZHJ1biwgYWRhcHRlcnR5cGUpKTsKKworCS8qIGFzc2lnbiBjb3JyZWN0IFBVTiBkZXZpY2Ugc3BhY2UgKi8KKwltYXhfcHVuID0gc3Vic3lzdGVtX21heGlkKGhvc3RfaW5kZXgpOworCisjaWZkZWYgSU1fREVCVUdfUFJPQkUKKwlwcmludGsoIklCTSBNQ0EgU0NTSTogQ3VycmVudCBTQ1NJLWhvc3QgaW5kZXg6ICVkXG4iLCBob3N0X2luZGV4KTsKKwlwcmludGsoIklCTSBNQ0EgU0NTSTogUmVtb3ZpbmcgZGVmYXVsdCBsb2dpY2FsIFNDU0ktZGV2aWNlIG1hcHBpbmcuIik7CisjZWxzZQorCXByaW50ayhLRVJOX0lORk8gIklCTSBNQ0EgU0NTSTogRGV2LiBPcmRlcjogJXMsIE1hcHBpbmcgKHRha2VzIDwybWluKTogIiwgKGlibV9hbnNpX29yZGVyKSA/ICJBTlNJIiA6ICJOZXciKTsKKyNlbmRpZgorCWZvciAobGRuID0gMDsgbGRuIDwgTUFYX0xPR19ERVY7IGxkbisrKSB7CisJCXByb2JlX2Rpc3BsYXkoMSk7CisjaWZkZWYgSU1fREVCVUdfUFJPQkUKKwkJcHJpbnRrKCIuIik7CisjZW5kaWYKKwkJaW1tZWRpYXRlX2Fzc2lnbihob3N0X2luZGV4LCAwLCAwLCBsZG4sIFJFTU9WRV9MRE4pOwkvKiByZW1vdmUgbGRuICh3aGVyZXZlcikgKi8KKwl9CisJbHVuID0gMDsJCS8qIGRlZmF1bHQgbHVuIGlzIDAgKi8KKyNpZm5kZWYgSU1fREVCVUdfUFJPQkUKKwlwcmludGsoImNsZWFyZWQsIik7CisjZW5kaWYKKwkvKiBTVEVQIDI6ICovCisjaWZkZWYgSU1fREVCVUdfUFJPQkUKKwlwcmludGsoIlxuSUJNIE1DQSBTQ1NJOiBTY2FubmluZyBTQ1NJLWRldmljZXMuIik7CisjZW5kaWYKKwlmb3IgKGlkID0gMDsgaWQgPCBtYXhfcHVuOyBpZCsrKQorI2lmZGVmIENPTkZJR19TQ1NJX01VTFRJX0xVTgorCQlmb3IgKGx1biA9IDA7IGx1biA8IDg7IGx1bisrKQorI2VuZGlmCisJCXsKKwkJCXByb2JlX2Rpc3BsYXkoMSk7CisjaWZkZWYgSU1fREVCVUdfUFJPQkUKKwkJCXByaW50aygiLiIpOworI2VuZGlmCisJCQlpZiAoaWQgIT0gc3Vic3lzdGVtX3B1bihob3N0X2luZGV4KSkgeworCQkJCS8qIGlmIHB1biBpcyBub3QgdGhlIGFkYXB0ZXI6ICovCisJCQkJLyogc2V0IGxkbj0wIHRvIHB1bixsdW4gKi8KKwkJCQlpbW1lZGlhdGVfYXNzaWduKGhvc3RfaW5kZXgsIGlkLCBsdW4sIFBST0JFX0xETiwgU0VUX0xETik7CisJCQkJaWYgKGRldmljZV9pbnF1aXJ5KGhvc3RfaW5kZXgsIFBST0JFX0xETikpIHsJLyogcHJvYmUgZGV2aWNlICovCisJCQkJCWdldF9zY3NpKGhvc3RfaW5kZXgpW2lkXVtsdW5dID0gKHVuc2lnbmVkIGNoYXIpIChsZChob3N0X2luZGV4KVtQUk9CRV9MRE5dLmJ1ZlswXSk7CisJCQkJCS8qIGVudHJ5LCBldmVuIGZvciBOT19MVU4gKi8KKwkJCQkJaWYgKGxkKGhvc3RfaW5kZXgpW1BST0JFX0xETl0uYnVmWzBdICE9IFRZUEVfTk9fTFVOKQorCQkJCQkJY291bnRfZGV2aWNlcysrOwkvKiBhIGV4aXN0aW5nIGRldmljZSBpcyBmb3VuZCAqLworCQkJCX0KKwkJCQkvKiByZW1vdmUgbGRuICovCisJCQkJaW1tZWRpYXRlX2Fzc2lnbihob3N0X2luZGV4LCBpZCwgbHVuLCBQUk9CRV9MRE4sIFJFTU9WRV9MRE4pOworCQkJfQorCQl9CisjaWZuZGVmIElNX0RFQlVHX1BST0JFCisJcHJpbnRrKCJzY2FubmVkLCIpOworI2VuZGlmCisJLyogU1RFUCAzOiAqLworI2lmZGVmIElNX0RFQlVHX1BST0JFCisJcHJpbnRrKCJcbklCTSBNQ0EgU0NTSTogTWFwcGluZyBTQ1NJLWRldmljZXMuIik7CisjZW5kaWYKKwlsZG4gPSAwOworCWx1biA9IDA7CisjaWZkZWYgQ09ORklHX1NDU0lfTVVMVElfTFVOCisJZm9yIChsdW4gPSAwOyBsdW4gPCA4ICYmIGxkbiA8IE1BWF9MT0dfREVWOyBsdW4rKykKKyNlbmRpZgorCQlmb3IgKGlkID0gMDsgaWQgPCBtYXhfcHVuICYmIGxkbiA8IE1BWF9MT0dfREVWOyBpZCsrKSB7CisJCQlwcm9iZV9kaXNwbGF5KDEpOworI2lmZGVmIElNX0RFQlVHX1BST0JFCisJCQlwcmludGsoIi4iKTsKKyNlbmRpZgorCQkJaWYgKGlkICE9IHN1YnN5c3RlbV9wdW4oaG9zdF9pbmRleCkpIHsKKwkJCQlpZiAoZ2V0X3Njc2koaG9zdF9pbmRleClbaWRdW2x1bl0gIT0gVFlQRV9OT19MVU4gJiYgZ2V0X3Njc2koaG9zdF9pbmRleClbaWRdW2x1bl0gIT0gVFlQRV9OT19ERVZJQ0UpIHsKKwkJCQkJLyogT25seSBtYXAgaWYgYWNjZXB0ZWQgdHlwZS4gQWx3YXlzIGVudGVyIGZvcgorCQkJCQkgICBsdW4gPT0gMCB0byBnZXQgbm8gZ2FwcyBpbnRvIGxkbi1tYXBwaW5nIGZvciBsZG48Ny4gKi8KKwkJCQkJaW1tZWRpYXRlX2Fzc2lnbihob3N0X2luZGV4LCBpZCwgbHVuLCBsZG4sIFNFVF9MRE4pOworCQkJCQlnZXRfbGRuKGhvc3RfaW5kZXgpW2lkXVtsdW5dID0gbGRuOwkvKiBtYXAgbGRuICovCisJCQkJCWlmIChkZXZpY2VfZXhpc3RzKGhvc3RfaW5kZXgsIGxkbiwgJmxkKGhvc3RfaW5kZXgpW2xkbl0uYmxvY2tfbGVuZ3RoLCAmbGQoaG9zdF9pbmRleClbbGRuXS5kZXZpY2VfdHlwZSkpIHsKKyNpZmRlZiBDT05GSUdfSUJNTUNBX1NDU0lfREVWX1JFU0VUCisJCQkJCQlwcmludGsoInJlc2V0dGluZyBkZXZpY2UgYXQgbGRuPSV4IC4uLiAiLCBsZG4pOworCQkJCQkJaW1tZWRpYXRlX3Jlc2V0KGhvc3RfaW5kZXgsIGxkbik7CisjZW5kaWYKKwkJCQkJCWxkbisrOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyogZGV2aWNlIHZhbmlzaGVkLCBwcm9iYWJseSBiZWNhdXNlIHdlIGRvbid0IGtub3cgaG93IHRvCisJCQkJCQkgKiBoYW5kbGUgaXQgb3IgYmVjYXVzZSBpdCBoYXMgcHJvYmxlbXMgKi8KKwkJCQkJCWlmIChsdW4gPiAwKSB7CisJCQkJCQkJLyogcmVtb3ZlIG1hcHBpbmcgKi8KKwkJCQkJCQlnZXRfbGRuKGhvc3RfaW5kZXgpW2lkXVtsdW5dID0gVFlQRV9OT19ERVZJQ0U7CisJCQkJCQkJaW1tZWRpYXRlX2Fzc2lnbihob3N0X2luZGV4LCAwLCAwLCBsZG4sIFJFTU9WRV9MRE4pOworCQkJCQkJfSBlbHNlCisJCQkJCQkJbGRuKys7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGx1biA9PSAwKSB7CisJCQkJCS8qIG1hcCBsdW4gPT0gMCwgZXZlbiBpZiBubyBkZXZpY2UgZXhpc3RzICovCisJCQkJCWltbWVkaWF0ZV9hc3NpZ24oaG9zdF9pbmRleCwgaWQsIGx1biwgbGRuLCBTRVRfTEROKTsKKwkJCQkJZ2V0X2xkbihob3N0X2luZGV4KVtpZF1bbHVuXSA9IGxkbjsJLyogbWFwIGxkbiAqLworCQkJCQlsZG4rKzsKKwkJCQl9CisJCQl9CisJCX0KKwkvKiBTVEVQIDQ6ICovCisKKwkvKiBtYXAgcmVtYWluaW5nIGxkbnMgdG8gbm9uLWV4aXN0aW5nIGRldmljZXMgKi8KKwlmb3IgKGx1biA9IDE7IGx1biA8IDggJiYgbGRuIDwgTUFYX0xPR19ERVY7IGx1bisrKQorCQlmb3IgKGlkID0gMDsgaWQgPCBtYXhfcHVuICYmIGxkbiA8IE1BWF9MT0dfREVWOyBpZCsrKSB7CisJCQlpZiAoZ2V0X3Njc2koaG9zdF9pbmRleClbaWRdW2x1bl0gPT0gVFlQRV9OT19MVU4gfHwgZ2V0X3Njc2koaG9zdF9pbmRleClbaWRdW2x1bl0gPT0gVFlQRV9OT19ERVZJQ0UpIHsKKwkJCQlwcm9iZV9kaXNwbGF5KDEpOworCQkJCS8qIE1hcCByZW1haW5pbmcgbGRucyBvbmx5IHRvIE5PTi1leGlzdGluZyBwdW4sbHVuCisJCQkJICAgY29tYmluYXRpb25zIHRvIG1ha2Ugc3VyZSBhbiBpbnF1aXJ5IHdpbGwgZmFpbC4KKwkJCQkgICBGb3IgTVVMVElfTFVOLCBpdCBpcyBuZWVkZWQgdG8gYXZvaWQgYWRhcHRlciBhdXRvbm9tZQorCQkJCSAgIFNDU0ktcmVtYXBwaW5nLiAqLworCQkJCWltbWVkaWF0ZV9hc3NpZ24oaG9zdF9pbmRleCwgaWQsIGx1biwgbGRuLCBTRVRfTEROKTsKKwkJCQlnZXRfbGRuKGhvc3RfaW5kZXgpW2lkXVtsdW5dID0gbGRuOworCQkJCWxkbisrOworCQkJfQorCQl9CisjaWZuZGVmIElNX0RFQlVHX1BST0JFCisJcHJpbnRrKCJtYXBwZWQuIik7CisjZW5kaWYKKwlwcmludGsoIlxuIik7CisjaWZkZWYgSU1fREVCVUdfUFJPQkUKKwlpZiAoaWJtX2Fuc2lfb3JkZXIpCisJCXByaW50aygiSUJNIE1DQSBTQ1NJOiBEZXZpY2Ugb3JkZXI6IElCTS9BTlNJIChwdW49NyBpcyBmaXJzdCkuXG4iKTsKKwllbHNlCisJCXByaW50aygiSUJNIE1DQSBTQ1NJOiBEZXZpY2Ugb3JkZXI6IE5ldyBJbmR1c3RyeSBTdGFuZGFyZCAocHVuPTAgaXMgZmlyc3QpLlxuIik7CisjZW5kaWYKKworI2lmZGVmIElNX0RFQlVHX1BST0JFCisJLyogU2hvdyB0aGUgcGh5c2ljYWwgYW5kIGxvZ2ljYWwgbWFwcGluZyBkdXJpbmcgYm9vdC4gKi8KKwlwcmludGsoIklCTSBNQ0EgU0NTSTogRGV0ZXJtaW5lZCBTQ1NJLWRldmljZS1tYXBwaW5nOlxuIik7CisJcHJpbnRrKCIgICAgUGh5c2ljYWwgU0NTSS1EZXZpY2UgTWFwICAgICAgICAgICAgICAgTG9naWNhbCBTQ1NJLURldmljZSBNYXBcbiIpOworCXByaW50aygiSURcXExVTiAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgICAgICBJRFxcTFVOICAwICAxICAyICAzICA0ICA1ICA2ICA3XG4iKTsKKwlmb3IgKGlkID0gMDsgaWQgPCBtYXhfcHVuOyBpZCsrKSB7CisJCXByaW50aygiJTJkICAgICAiLCBpZCk7CisJCWZvciAobHVuID0gMDsgbHVuIDwgODsgbHVuKyspCisJCQlwcmludGsoIiUycyAiLCB0aV9wKGdldF9zY3NpKGhvc3RfaW5kZXgpW2lkXVtsdW5dKSk7CisJCXByaW50aygiICAgICAgJTJkICAgICAiLCBpZCk7CisJCWZvciAobHVuID0gMDsgbHVuIDwgODsgbHVuKyspCisJCQlwcmludGsoIiUycyAiLCB0aV9sKGdldF9sZG4oaG9zdF9pbmRleClbaWRdW2x1bl0pKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKyNlbmRpZgorCisJLyogYXNzaWduIHRvdGFsIG51bWJlciBvZiBmb3VuZCBTQ1NJLWRldmljZXMgdG8gdGhlIHN0YXRpc3RpY3Mgc3RydWN0ICovCisJSUJNX0RTKGhvc3RfaW5kZXgpLnRvdGFsX3Njc2lfZGV2aWNlcyA9IGNvdW50X2RldmljZXM7CisKKwkvKiBkZWNpZGUgZm9yIG91dHB1dCBpbiAvcHJvYy1maWxlc3lzdGVtLCBpZiB0aGUgY29uZmlndXJhdGlvbiBvZgorCSAgIFNDU0ktZGV2aWNlcyBtYWtlcyBkeW5hbWljYWwgcmVhc3NpZ25tZW50IG9mIGRldmljZXMgbmVjZXNzYXJ5ICovCisJaWYgKGNvdW50X2RldmljZXMgPj0gTUFYX0xPR19ERVYpCisJCUlCTV9EUyhob3N0X2luZGV4KS5keW5fZmxhZyA9IDE7CS8qIGR5bmFtaWNhbCBhc3NpZ25tZW50IGlzIG5lY2Vzc2FyeSAqLworCWVsc2UKKwkJSUJNX0RTKGhvc3RfaW5kZXgpLmR5bl9mbGFnID0gMDsJLyogZHluYW1pY2FsIGFzc2lnbm1lbnQgaXMgbm90IG5lY2Vzc2FyeSAqLworCisJLyogSWYgbm8gU0NTSS1kZXZpY2VzIGFyZSBhc3NpZ25lZCwgcmV0dXJuIDEgaW4gb3JkZXIgdG8gY2F1c2UgbWVzc2FnZS4gKi8KKwlpZiAobGRuID09IDApCisJCXByaW50aygiSUJNIE1DQSBTQ1NJOiBXYXJuaW5nOiBObyBTQ1NJLWRldmljZXMgZm91bmQvYXNzaWduZWQhXG4iKTsKKworCS8qIHJlc2V0IHRoZSBjb3VudGVycyBmb3Igc3RhdGlzdGljcyBvbiB0aGUgY3VycmVudCBhZGFwdGVyICovCisJSUJNX0RTKGhvc3RfaW5kZXgpLnNjYnMgPSAwOworCUlCTV9EUyhob3N0X2luZGV4KS5sb25nX3NjYnMgPSAwOworCUlCTV9EUyhob3N0X2luZGV4KS50b3RhbF9hY2Nlc3NlcyA9IDA7CisJSUJNX0RTKGhvc3RfaW5kZXgpLnRvdGFsX2ludGVycnVwdHMgPSAwOworCUlCTV9EUyhob3N0X2luZGV4KS5keW5hbWljYWxfYXNzaWdubWVudHMgPSAwOworCW1lbXNldChJQk1fRFMoaG9zdF9pbmRleCkubGRuX2FjY2VzcywgMHgwLCBzaXplb2YoSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl9hY2Nlc3MpKTsKKwltZW1zZXQoSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl9yZWFkX2FjY2VzcywgMHgwLCBzaXplb2YoSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl9yZWFkX2FjY2VzcykpOworCW1lbXNldChJQk1fRFMoaG9zdF9pbmRleCkubGRuX3dyaXRlX2FjY2VzcywgMHgwLCBzaXplb2YoSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl93cml0ZV9hY2Nlc3MpKTsKKwltZW1zZXQoSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl9pbnF1aXJ5X2FjY2VzcywgMHgwLCBzaXplb2YoSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl9pbnF1aXJ5X2FjY2VzcykpOworCW1lbXNldChJQk1fRFMoaG9zdF9pbmRleCkubGRuX21vZGVzZWxlY3RfYWNjZXNzLCAweDAsIHNpemVvZihJQk1fRFMoaG9zdF9pbmRleCkubGRuX21vZGVzZWxlY3RfYWNjZXNzKSk7CisJbWVtc2V0KElCTV9EUyhob3N0X2luZGV4KS5sZG5fYXNzaWdubWVudHMsIDB4MCwgc2l6ZW9mKElCTV9EUyhob3N0X2luZGV4KS5sZG5fYXNzaWdubWVudHMpKTsKKwlwcm9iZV9kaXNwbGF5KDApOworCXJldHVybjsKK30KKworc3RhdGljIGludCBkZXZpY2VfZXhpc3RzKGludCBob3N0X2luZGV4LCBpbnQgbGRuLCBpbnQgKmJsb2NrX2xlbmd0aCwgaW50ICpkZXZpY2VfdHlwZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJLyogaWYgbm8gdmFsaWQgZGV2aWNlIGZvdW5kLCByZXR1cm4gaW1tZWRpYXRlbHkgd2l0aCAwICovCisJaWYgKCEoZGV2aWNlX2lucXVpcnkoaG9zdF9pbmRleCwgbGRuKSkpCisJCXJldHVybiAwOworCWJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopICgmKGxkKGhvc3RfaW5kZXgpW2xkbl0uYnVmKSk7CisJaWYgKCpidWYgPT0gVFlQRV9ST00pIHsKKwkJKmRldmljZV90eXBlID0gVFlQRV9ST007CisJCSpibG9ja19sZW5ndGggPSAyMDQ4OwkvKiAoc3RhbmRhcmQgYmxvY2tzaXplIGZvciB5ZWxsb3ctL3JlZC1ib29rKSAqLworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCpidWYgPT0gVFlQRV9XT1JNKSB7CisJCSpkZXZpY2VfdHlwZSA9IFRZUEVfV09STTsKKwkJKmJsb2NrX2xlbmd0aCA9IDIwNDg7CisJCXJldHVybiAxOworCX0KKwlpZiAoKmJ1ZiA9PSBUWVBFX0RJU0spIHsKKwkJKmRldmljZV90eXBlID0gVFlQRV9ESVNLOworCQlpZiAocmVhZF9jYXBhY2l0eShob3N0X2luZGV4LCBsZG4pKSB7CisJCQkqYmxvY2tfbGVuZ3RoID0gKihidWYgKyA3KSArICgqKGJ1ZiArIDYpIDw8IDgpICsgKCooYnVmICsgNSkgPDwgMTYpICsgKCooYnVmICsgNCkgPDwgMjQpOworCQkJcmV0dXJuIDE7CisJCX0gZWxzZQorCQkJcmV0dXJuIDA7CisJfQorCWlmICgqYnVmID09IFRZUEVfTU9EKSB7CisJCSpkZXZpY2VfdHlwZSA9IFRZUEVfTU9EOworCQlpZiAocmVhZF9jYXBhY2l0eShob3N0X2luZGV4LCBsZG4pKSB7CisJCQkqYmxvY2tfbGVuZ3RoID0gKihidWYgKyA3KSArICgqKGJ1ZiArIDYpIDw8IDgpICsgKCooYnVmICsgNSkgPDwgMTYpICsgKCooYnVmICsgNCkgPDwgMjQpOworCQkJcmV0dXJuIDE7CisJCX0gZWxzZQorCQkJcmV0dXJuIDA7CisJfQorCWlmICgqYnVmID09IFRZUEVfVEFQRSkgeworCQkqZGV2aWNlX3R5cGUgPSBUWVBFX1RBUEU7CisJCSpibG9ja19sZW5ndGggPSAwOwkvKiBub3QgaW4gdXNlIChzZXR0aW5nIGJ5IG10IGFuZCBtdHN0IGluIG9wLikgKi8KKwkJcmV0dXJuIDE7CisJfQorCWlmICgqYnVmID09IFRZUEVfUFJPQ0VTU09SKSB7CisJCSpkZXZpY2VfdHlwZSA9IFRZUEVfUFJPQ0VTU09SOworCQkqYmxvY2tfbGVuZ3RoID0gMDsJLyogdGhleSBzZXQgdGhlaXIgc3R1ZmYgb24gZHJpdmVycyAqLworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCpidWYgPT0gVFlQRV9TQ0FOTkVSKSB7CisJCSpkZXZpY2VfdHlwZSA9IFRZUEVfU0NBTk5FUjsKKwkJKmJsb2NrX2xlbmd0aCA9IDA7CS8qIHRoZXkgc2V0IHRoZWlyIHN0dWZmIG9uIGRyaXZlcnMgKi8KKwkJcmV0dXJuIDE7CisJfQorCWlmICgqYnVmID09IFRZUEVfTUVESVVNX0NIQU5HRVIpIHsKKwkJKmRldmljZV90eXBlID0gVFlQRV9NRURJVU1fQ0hBTkdFUjsKKwkJKmJsb2NrX2xlbmd0aCA9IDA7CS8qIE9uZSBuZXZlciBrbm93cywgd2hhdCB0byBleHBlY3Qgb24gYSBtZWRpdW0KKwkJCQkJICAgY2hhbmdlciBkZXZpY2UuICovCisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW50ZXJuYWxfaWJtbWNhX3Njc2lfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCit7CisJaW50IGksIGosIGlvX2Jhc2UsIGlkX2Jhc2U7CisJY2hhciAqdG9rZW47CisKKwlpb19iYXNlID0gMDsKKwlpZF9iYXNlID0gMDsKKwlpZiAoc3RyKSB7CisJCWogPSAwOworCQl3aGlsZSAoKHRva2VuID0gc3Ryc2VwKCZzdHIsICIsIikpICE9IE5VTEwpIHsKKwkJCWlmICghc3RyY21wKHRva2VuLCAiYWN0aXZpdHkiKSkKKwkJCQlkaXNwbGF5X21vZGUgfD0gTEVEX0FDVElWSVRZOworCQkJaWYgKCFzdHJjbXAodG9rZW4sICJkaXNwbGF5IikpCisJCQkJZGlzcGxheV9tb2RlIHw9IExFRF9ESVNQOworCQkJaWYgKCFzdHJjbXAodG9rZW4sICJhZGlzcGxheSIpKQorCQkJCWRpc3BsYXlfbW9kZSB8PSBMRURfQURJU1A7CisJCQlpZiAoIXN0cmNtcCh0b2tlbiwgIm5vcm1hbCIpKQorCQkJCWlibV9hbnNpX29yZGVyID0gMDsKKwkJCWlmICghc3RyY21wKHRva2VuLCAiYW5zaSIpKQorCQkJCWlibV9hbnNpX29yZGVyID0gMTsKKwkJCWlmICghc3RyY21wKHRva2VuLCAiZmFzdCIpKQorCQkJCWdsb2JhbF9hZGFwdGVyX3NwZWVkID0gMDsKKwkJCWlmICghc3RyY21wKHRva2VuLCAibWVkaXVtIikpCisJCQkJZ2xvYmFsX2FkYXB0ZXJfc3BlZWQgPSA0OworCQkJaWYgKCFzdHJjbXAodG9rZW4sICJzbG93IikpCisJCQkJZ2xvYmFsX2FkYXB0ZXJfc3BlZWQgPSA3OworCQkJaWYgKCgqdG9rZW4gPT0gJy0nKSB8fCAoaXNkaWdpdCgqdG9rZW4pKSkgeworCQkJCWlmICghKGogJSAyKSAmJiAoaW9fYmFzZSA8IElNX01BWF9IT1NUUykpCisJCQkJCWlvX3BvcnRbaW9fYmFzZSsrXSA9IHNpbXBsZV9zdHJ0b3VsKHRva2VuLCBOVUxMLCAwKTsKKwkJCQlpZiAoKGogJSAyKSAmJiAoaWRfYmFzZSA8IElNX01BWF9IT1NUUykpCisJCQkJCXNjc2lfaWRbaWRfYmFzZSsrXSA9IHNpbXBsZV9zdHJ0b3VsKHRva2VuLCBOVUxMLCAwKTsKKwkJCQlqKys7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGludHMpIHsKKwkJZm9yIChpID0gMDsgaSA8IElNX01BWF9IT1NUUyAmJiAyICogaSArIDIgPCBpbnRzWzBdOyBpKyspIHsKKwkJCWlvX3BvcnRbaV0gPSBpbnRzWzIgKiBpICsgMl07CisJCQlzY3NpX2lkW2ldID0gaW50c1syICogaSArIDJdOworCQl9CisJfQorCXJldHVybjsKK30KKworc3RhdGljIGludCBpYm1tY2FfZ2V0aW5mbyhjaGFyICpidWYsIGludCBzbG90LCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQ7CisJaW50IGxlbiwgc3BlY2lhbGUsIGNvbm5lY3RvcmUsIGs7CisJdW5zaWduZWQgaW50IHBvc1s4XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBTY3NpX0hvc3QgKmRldiA9IGRldl9pZDsKKworCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJCisJc2hwbnQgPSBkZXY7CQkvKiBhc3NpZ24gaG9zdC1zdHJ1Y3R1cmUgdG8gbG9jYWwgcG9pbnRlciAqLworCWxlbiA9IDA7CQkvKiBzZXQgZmlsbGVkIHRleHQtYnVmZmVyIGluZGV4IHRvIDAgKi8KKwkvKiBnZXQgdGhlIF9zcGVjaWFsIGNvbnRlbnRzIG9mIHRoZSBob3N0ZGF0YSBzdHJ1Y3R1cmUgKi8KKwlzcGVjaWFsZSA9ICgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBzaHBudC0+aG9zdGRhdGEpLT5fc3BlY2lhbDsKKwljb25uZWN0b3JlID0gKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIHNocG50LT5ob3N0ZGF0YSktPl9jb25uZWN0b3Jfc2l6ZTsKKwlmb3IgKGsgPSAyOyBrIDwgNDsgaysrKQorCQlwb3Nba10gPSAoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgc2hwbnQtPmhvc3RkYXRhKS0+X3Bvc1trXTsKKwlpZiAoc3BlY2lhbGUgPT0gRk9SQ0VEX0RFVEVDVElPTikgewkvKiBmb3JjZWQgZGV0ZWN0aW9uICovCisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwKKwkJCSAgICAgICAiQWRhcHRlciBjYXRlZ29yeTogZm9yY2VkIGRldGVjdGVkXG4iICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIgIioqKiAgRm9yY2VkIGRldGVjdGVkIFNDU0kgQWRhcHRlciAgICoqKlxuIiAiKioqICBObyBjaGlwLWluZm9ybWF0aW9uIGF2YWlsYWJsZSAgKioqXG4iICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworCX0gZWxzZSBpZiAoc3BlY2lhbGUgPT0gSU5URUdSQVRFRF9TQ1NJKSB7CisJCS8qIGlmIHRoZSBpbnRlZ3JhdGVkIHN1YnN5c3RlbSBoYXMgYmVlbiBmb3VuZCBhdXRvbWF0aWNhbGx5OiAqLworCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sCisJCQkgICAgICAgIkFkYXB0ZXIgY2F0ZWdvcnk6IGludGVncmF0ZWRcbiIgIkNoaXAgcmV2aXNpb24gbGV2ZWw6ICVkXG4iICJDaGlwIHN0YXR1czogJXNcbiIgIjgga0J5dGUgTlZSQU0gc3RhdHVzOiAlc1xuIiwgKChwb3NbMl0gJiAweGYwKSA+PiA0KSwgKHBvc1syXSAmIDEpID8gImVuYWJsZWQiIDogImRpc2FibGVkIiwgKHBvc1syXSAmIDIpID8gImxvY2tlZCIgOiAiYWNjZXNzaWJsZSIpOworCX0gZWxzZSBpZiAoKHNwZWNpYWxlID49IDApICYmIChzcGVjaWFsZSA8IChzaXplb2Yoc3Vic3lzX2xpc3QpIC8gc2l6ZW9mKHN0cnVjdCBzdWJzeXNfbGlzdF9zdHJ1Y3QpKSkpIHsKKwkJLyogaWYgdGhlIHN1YnN5c3RlbSBpcyBhIHNsb3QgYWRhcHRlciAqLworCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJBZGFwdGVyIGNhdGVnb3J5OiBzbG90LWNhcmRcbiIgIlJPTSBTZWdtZW50IEFkZHJlc3M6ICIpOworCQlpZiAoKHBvc1syXSAmIDB4ZjApID09IDB4ZjApCisJCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJvZmZcbiIpOworCQllbHNlCisJCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIweCV4XG4iLCAoKHBvc1syXSAmIDB4ZjApIDw8IDEzKSArIDB4YzAwMDApOworCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJDaGlwIHN0YXR1czogJXNcbiIsIChwb3NbMl0gJiAxKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJBZGFwdGVyIEkvTyBPZmZzZXQ6IDB4JXhcbiIsICgocG9zWzJdICYgMHgwZSkgPDwgMikpOworCX0gZWxzZSB7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkFkYXB0ZXIgY2F0ZWdvcnk6IHVua25vd25cbiIpOworCX0KKwkvKiBjb21tb24gc3Vic3lzdGVtIGluZm9ybWF0aW9uIHRvIHdyaXRlIHRvIHRoZSBzbG90biBmaWxlICovCisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiU3Vic3lzdGVtIFBVTjogJWRcbiIsIHNocG50LT50aGlzX2lkKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJJL08gYmFzZSBhZGRyZXNzIHJhbmdlOiAweCV4LTB4JXhcbiIsICh1bnNpZ25lZCBpbnQpIChzaHBudC0+aW9fcG9ydCksICh1bnNpZ25lZCBpbnQpIChzaHBudC0+aW9fcG9ydCArIDcpKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJNQ0Etc2xvdCBzaXplOiAlZCBiaXRzIiwgY29ubmVjdG9yZSk7CisJLyogTm93IG1ha2Ugc3VyZSwgdGhlIGJ1ZmZlcmxlbmd0aCBpcyBkZXZpZGFibGUgYnkgNCB0byBhdm9pZAorCSAqIHBhZ2luZyBwcm9ibGVtcyBvZiB0aGUgYnVmZmVyLiAqLworCXdoaWxlIChsZW4gJSBzaXplb2YoaW50KSAhPSAoc2l6ZW9mKGludCkgLSAxKSkKKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiICIpOworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlxuIik7CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaHBudC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCisJcmV0dXJuIGxlbjsKK30KKworaW50IGlibW1jYV9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICogc2NzaV90ZW1wbGF0ZSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudDsKKwlpbnQgcG9ydCwgaWQsIGksIGosIGssIGxpc3Rfc2l6ZSwgc2xvdDsKKwlpbnQgZGV2aWNlc19vbl9pcnFfMTEgPSAwOworCWludCBkZXZpY2VzX29uX2lycV8xNCA9IDA7CisJaW50IElSUTE0X3JlZ2lzdGVyZWQgPSAwOworCWludCBJUlExMV9yZWdpc3RlcmVkID0gMDsKKworCWZvdW5kID0gMDsJCS8qIG1ha2UgYWJzb2x1dGVseSBzdXJlLCB0aGF0IGZvdW5kIGlzIHNldCB0byAwICovCisKKwkvKiBGaXJzdCBvZiBhbGwsIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZHJpdmVyLiBUaGlzIGlzCisJICogaW1wb3J0YW50IHRvIGFsbG93IGJldHRlciB1c2VyIGJ1Z3JlcG9ydHMgaW4gY2FzZSBvZiBhbHJlYWR5CisJICogaGF2aW5nIHByb2JsZW1zIHdpdGggdGhlIE1DQV9idXMgcHJvYmluZy4gKi8KKwlwcmludGsoS0VSTl9JTkZPICJJQk0gTUNBIFNDU0k6IFZlcnNpb24gJXNcbiIsIElCTU1DQV9TQ1NJX0RSSVZFUl9WRVJTSU9OKTsKKwkvKiBpZiB0aGlzIGlzIG5vdCBNQ0EgbWFjaGluZSwgcmV0dXJuICJub3RoaW5nIGZvdW5kIiAqLworCWlmICghTUNBX2J1cykgeworCQlwcmludGsoS0VSTl9JTkZPICJJQk0gTUNBIFNDU0k6ICBObyBNaWNyb2NoYW5uZWwtYnVzIHByZXNlbnQgLS0+IEFib3J0aW5nLlxuIiAiICAgICAgCSAgICAgVGhpcyBtYWNoaW5lIGRvZXMgbm90IGhhdmUgYW55IElCTSBNQ0EtYnVzXG4iICIgICAgCSAgICAgb3IgdGhlIE1DQS1LZXJuZWwtc3VwcG9ydCBpcyBub3QgZW5hYmxlZCFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBNT0RVTEUKKwkvKiBJZiB0aGUgZHJpdmVyIGlzIHJ1biBhcyBtb2R1bGUsIHJlYWQgZnJvbSBjb25mLm1vZHVsZXMgb3IgY21kLWxpbmUgKi8KKwlpZiAoYm9vdF9vcHRpb25zKQorCQlvcHRpb25fc2V0dXAoYm9vdF9vcHRpb25zKTsKKyNlbmRpZgorCisJLyogZ2V0IGludGVycnVwdCByZXF1ZXN0IGxldmVsICovCisJaWYgKHJlcXVlc3RfaXJxKElNX0lSUSwgaW50ZXJydXB0X2hhbmRsZXIsIFNBX1NISVJRLCAiaWJtbWNhc2NzaSIsIGhvc3RzKSkgeworCQlwcmludGsoS0VSTl9FUlIgIklCTSBNQ0EgU0NTSTogVW5hYmxlIHRvIGdldCBzaGFyZWQgSVJRICVkLlxuIiwgSU1fSVJRKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlCisJCUlSUTE0X3JlZ2lzdGVyZWQrKzsKKworCS8qIGlmIGlibW1jYXNjc2kgc2V0dXAgb3B0aW9uIHdhcyBwYXNzZWQgdG8ga2VybmVsLCByZXR1cm4gImZvdW5kIiAqLworCWZvciAoaSA9IDA7IGkgPCBJTV9NQVhfSE9TVFM7IGkrKykKKwkJaWYgKGlvX3BvcnRbaV0gPiAwICYmIHNjc2lfaWRbaV0gPj0gMCAmJiBzY3NpX2lkW2ldIDwgOCkgeworCQkJcHJpbnRrKCJJQk0gTUNBIFNDU0k6IGZvcmNlZCBkZXRlY3RlZCBTQ1NJIEFkYXB0ZXIsIGlvPTB4JXgsIHNjc2kgaWQ9JWQuXG4iLCBpb19wb3J0W2ldLCBzY3NpX2lkW2ldKTsKKwkJCWlmICgoc2hwbnQgPSBpYm1tY2FfcmVnaXN0ZXIoc2NzaV90ZW1wbGF0ZSwgaW9fcG9ydFtpXSwgc2NzaV9pZFtpXSwgRk9SQ0VEX0RFVEVDVElPTiwgImZvcmNlZCBkZXRlY3RlZCBTQ1NJIEFkYXB0ZXIiKSkpIHsKKwkJCQlmb3IgKGsgPSAyOyBrIDwgNzsgaysrKQorCQkJCQkoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgc2hwbnQtPmhvc3RkYXRhKS0+X3Bvc1trXSA9IDA7CisJCQkJKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIHNocG50LT5ob3N0ZGF0YSktPl9zcGVjaWFsID0gRk9SQ0VEX0RFVEVDVElPTjsKKwkJCQltY2Ffc2V0X2FkYXB0ZXJfbmFtZShNQ0FfSU5URUdTQ1NJLCAiZm9yY2VkIGRldGVjdGVkIFNDU0kgQWRhcHRlciIpOworCQkJCW1jYV9zZXRfYWRhcHRlcl9wcm9jZm4oTUNBX0lOVEVHU0NTSSwgKE1DQV9Qcm9jRm4pIGlibW1jYV9nZXRpbmZvLCBzaHBudCk7CisJCQkJbWNhX21hcmtfYXNfdXNlZChNQ0FfSU5URUdTQ1NJKTsKKwkJCQlkZXZpY2VzX29uX2lycV8xNCsrOworCQkJfQorCQl9CisJaWYgKGZvdW5kKQorCQlyZXR1cm4gZm91bmQ7CisKKwkvKiBUaGUgUE9TMi1yZWdpc3RlciBvZiBhbGwgUFMvMiBtb2RlbCBTQ1NJLXN1YnN5c3RlbXMgaGFzIHRoZSBmb2xsb3dpbmcKKwkgKiBpbnRlcnByZXRhdGlvbiBvZiBiaXRzOgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgNyAtIDQgOiBDaGlwIFJldmlzaW9uIElEIChSZWxlYXNlKQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgMyAtIDIgOiBSZXNlcnZlZAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgMSAgICAgOiA4ayBOVlJBTSBEaXNhYmxlZAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgMCAgICAgOiBDaGlwIEVuYWJsZSAoRU4tU2lnbmFsKQorCSAqIFRoZSBQT1MzLXJlZ2lzdGVyIGlzIGludGVycHJldGVkIGFzIGZvbGxvd3M6CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCA3IC0gNSA6IFNDU0kgSUQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0IDQgICAgIDogUmVzZXJ2ZWQgPSAwCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCAzIC0gMCA6IFJlc2VydmVkID0gMAorCSAqICh0YWtlbiBmcm9tICJJQk0sIFBTLzIgSGFyZHdhcmUgSW50ZXJmYWNlIFRlY2huaWNhbCBSZWZlcmVuY2UsIENvbW1vbgorCSAqIEludGVyZmFjZXMgKDE5OTEpIikuCisJICogSW4gc2hvcnQgd29yZHMsIHRoaXMgbWVhbnMsIHRoYXQgSUJNIFBTLzIgbWFjaGluZXMgb25seSBzdXBwb3J0CisJICogMSBzaW5nbGUgc3Vic3lzdGVtIGJ5IGRlZmF1bHQuIFRoZSBzbG90LWFkYXB0ZXJzIG11c3QgaGF2ZSBhbm90aGVyCisJICogY29uZmlndXJhdGlvbiBvbiBwb3MyLiBIZXJlLCBvbmUgaGFzIHRvIGFzc3VtZSB0aGUgZm9sbG93aW5nCisJICogdGhpbmdzIGZvciBQT1MyLXJlZ2lzdGVyOgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgNyAtIDQgOiBDaGlwIFJldmlzaW9uIElEIChSZWxlYXNlKQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgMyAtIDEgOiBwb3J0IG9mZnNldCBmYWN0b3IKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0IDAgICAgIDogQ2hpcCBFbmFibGUgKEVOLVNpZ25hbCkKKwkgKiBBcyBJIGZvdW5kIGEgcGF0Y2ggaGVyZSwgc2V0dGluZyB0aGUgSU8tcmVnaXN0ZXJzIHRvIDB4MzU0MCBmb3JjZWQsCisJICogYXMgdGhlcmUgd2FzIGEgMHgwNSBpbiBQT1MyIG9uIGEgbW9kZWwgNTYsIEkgYXNzdW1lLCB0aGF0IHRoZQorCSAqIHBvcnQgMHgzNTQwIG11c3QgYmUgZml4IGZvciBpbnRlZ3JhdGVkIFNDU0ktY29udHJvbGxlcnMuCisJICogT2ssIHRoaXMgZGlzY292ZXJ5IGxlYWRzIHRvIHRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb246IChNLkxhbmcpICovCisKKwkvKiBmaXJzdCBsb29rIGZvciB0aGUgSUJNIFNDU0kgaW50ZWdyYXRlZCBzdWJzeXN0ZW0gb24gdGhlIG1vdGhlcmJvYXJkICovCisJZm9yIChqID0gMDsgaiA8IDg7IGorKykJLyogcmVhZCB0aGUgcG9zLWluZm9ybWF0aW9uICovCisJCXBvc1tqXSA9IG1jYV9yZWFkX3N0b3JlZF9wb3MoTUNBX0lOVEVHU0NTSSwgaik7CisJLyogcG9zMiA9IHBvczMgPSAweGZmIGlmIHRoZXJlIGlzIG5vIGludGVncmF0ZWQgU0NTSS1zdWJzeXN0ZW0gcHJlc2VudCwgYnV0CisJICogaWYgd2UgaWdub3JlIHRoZSBzZXR0aW5ncyBvZiBhbGwgc3Vycm91bmRpbmcgcG9zIHJlZ2lzdGVycywgaXQgaXMgbm90CisJICogY29tcGxldGVseSBzdWZmaWNpZW50IHRvIG9ubHkgY2hlY2sgcG9zMiBhbmQgcG9zMy4gKi8KKwkvKiBUaGVyZWZvcmUsIG5vdyB0aGUgZm9sbG93aW5nIGlmIHN0YXRlbWVudCBpcyB1c2VkIHRvCisJICogbWFrZSBzdXJlLCB3ZSBzZWUgYSByZWFsIGludGVncmF0ZWQgb25ib2FyZCBTQ1NJLWludGVyZmFjZSBhbmQgbm8KKwkgKiBpbnRlcm5hbCBzeXN0ZW0gaW5mb3JtYXRpb24sIHdoaWNoIGdldHMgbWFwcGVkIHRvIHNvbWUgcG9zIHJlZ2lzdGVycworCSAqIG9uIG1vZGVscyA5NXh4LiAqLworCWlmICgoIXBvc1swXSAmJiAhcG9zWzFdICYmIHBvc1syXSA+IDAgJiYgcG9zWzNdID4gMCAmJiAhcG9zWzRdICYmICFwb3NbNV0gJiYgIXBvc1s2XSAmJiAhcG9zWzddKSB8fCAocG9zWzBdID09IDB4ZmYgJiYgcG9zWzFdID09IDB4ZmYgJiYgcG9zWzJdIDwgMHhmZiAmJiBwb3NbM10gPCAweGZmICYmIHBvc1s0XSA9PSAweGZmICYmIHBvc1s1XSA9PSAweGZmICYmIHBvc1s2XSA9PSAweGZmICYmIHBvc1s3XSA9PSAweGZmKSkgeworCQlpZiAoKHBvc1syXSAmIDEpID09IDEpCS8qIGlzIHRoZSBzdWJzeXN0ZW0gY2hpcCBlbmFibGVkID8gKi8KKwkJCXBvcnQgPSBJTV9JT19QT1JUOworCQllbHNlIHsJCS8qIGlmIGRpc2FibGVkLCBubyBJUlFzIHdpbGwgYmUgZ2VuZXJhdGVkLCBhcyB0aGUgY2hpcCB3b24ndAorCQkJCSAqIGxpc3RlbiB0byB0aGUgaW5jb21pbmcgY29tbWFuZHMgYW5kIHdpbGwgZG8gcmVhbGx5IG5vdGhpbmcsCisJCQkJICogZXhjZXB0IGZvciBsaXN0ZW5pbmcgdG8gdGhlIHBvcy1yZWdpc3RlciBzZXR0aW5ncy4gSWYgdGhpcworCQkJCSAqIGhhcHBlbnMsIEkgbmVlZCB0byBodWdlbHkgdGhpbmsgYWJvdXQgaXQsIGFzIG9uZSBoYXMgdG8KKwkJCQkgKiB3cml0ZSBzb21ldGhpbmcgdG8gdGhlIE1DQS1CdXMgcG9zIHJlZ2lzdGVyIGluIG9yZGVyIHRvCisJCQkJICogZW5hYmxlIHRoZSBjaGlwLiBOb3JtYWxseSwgSUJNLVNDU0kgd29uJ3QgcGFzcyB0aGUgUE9TVCwKKwkJCQkgKiB3aGVuIHRoZSBjaGlwIGlzIGRpc2FibGVkIChzZWUgSUJNIHRlY2guIHJlZi4pLiAqLworCQkJcG9ydCA9IElNX0lPX1BPUlQ7CS8qIGFueXdheSwgc2V0IHRoZSBwb3J0bnVtYmVyIGFuZCB3YXJuICovCisJCQlwcmludGsoIklCTSBNQ0EgU0NTSTogV0FSTklORyAtIFlvdXIgU0NTSS1zdWJzeXN0ZW0gaXMgZGlzYWJsZWQhXG4iICIgICAgICAgICAgICAgIFNDU0ktb3BlcmF0aW9ucyBtYXkgbm90IHdvcmsuXG4iKTsKKwkJfQorCQlpZCA9IChwb3NbM10gJiAweGUwKSA+PiA1OwkvKiB0aGlzIGlzIGNvcnJlY3QgYW5kIHJlcHJlc2VudHMgdGhlIFBVTiAqLworCQkvKiBnaXZlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBzdWJzeXN0ZW0uIFRoaXMgaGVscHMgbWUKKwkJICogYWRkaXRpb25hbGx5IGR1cmluZyBkZWJ1Z2dpbmcgYW5kIGFuYWx5emluZyBidWctcmVwb3J0cy4gKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiSUJNIE1DQSBTQ1NJOiBJQk0gSW50ZWdyYXRlZCBTQ1NJIENvbnRyb2xsZXIgZmZvdW5kLCBpbz0weCV4LCBzY3NpIGlkPSVkLFxuIiwgcG9ydCwgaWQpOworCQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgICAgICAgIGNoaXAgcmV2Lj0lZCwgOEsgTlZSQU09JXMsIHN1YnN5c3RlbT0lc1xuIiwgKChwb3NbMl0gJiAweGYwKSA+PiA0KSwgKHBvc1syXSAmIDIpID8gImxvY2tlZCIgOiAiYWNjZXNzaWJsZSIsIChwb3NbMl0gJiAxKSA/ICJlbmFibGVkLiIgOiAiZGlzYWJsZWQuIik7CisKKwkJLyogcmVnaXN0ZXIgdGhlIGZvdW5kIGludGVncmF0ZWQgU0NTSS1zdWJzeXN0ZW0gKi8KKwkJaWYgKChzaHBudCA9IGlibW1jYV9yZWdpc3RlcihzY3NpX3RlbXBsYXRlLCBwb3J0LCBpZCwgSU5URUdSQVRFRF9TQ1NJLCAiSUJNIEludGVncmF0ZWQgU0NTSSBDb250cm9sbGVyIikpKSAKKwkJeworCQkJZm9yIChrID0gMjsgayA8IDc7IGsrKykKKwkJCQkoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgc2hwbnQtPmhvc3RkYXRhKS0+X3Bvc1trXSA9IHBvc1trXTsKKwkJCSgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBzaHBudC0+aG9zdGRhdGEpLT5fc3BlY2lhbCA9IElOVEVHUkFURURfU0NTSTsKKwkJCW1jYV9zZXRfYWRhcHRlcl9uYW1lKE1DQV9JTlRFR1NDU0ksICJJQk0gSW50ZWdyYXRlZCBTQ1NJIENvbnRyb2xsZXIiKTsKKwkJCW1jYV9zZXRfYWRhcHRlcl9wcm9jZm4oTUNBX0lOVEVHU0NTSSwgKE1DQV9Qcm9jRm4pIGlibW1jYV9nZXRpbmZvLCBzaHBudCk7CisJCQltY2FfbWFya19hc191c2VkKE1DQV9JTlRFR1NDU0kpOworCQkJZGV2aWNlc19vbl9pcnFfMTQrKzsKKwkJfQorCX0KKworCS8qIG5vdyBsb29rIGZvciBvdGhlciBhZGFwdGVycyBpbiBNQ0Egc2xvdHMsICovCisJLyogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Yga25vd24gSUJNLVNDU0ktc3Vic3lzdGVtIHR5cGVzICovCisJLyogc2VlIHRoZSBwb3NbMl0gZGVwZW5kZW5jZSB0byBnZXQgdGhlIGFkYXB0ZXIgcG9ydC1vZmZzZXQuICovCisJbGlzdF9zaXplID0gc2l6ZW9mKHN1YnN5c19saXN0KSAvIHNpemVvZihzdHJ1Y3Qgc3Vic3lzX2xpc3Rfc3RydWN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgbGlzdF9zaXplOyBpKyspIHsKKwkJLyogc2NhbiBlYWNoIHNsb3QgZm9yIGEgZml0dGluZyBhZGFwdGVyIGlkICovCisJCXNsb3QgPSAwOwkvKiBzdGFydCBhdCBzbG90IDAgKi8KKwkJd2hpbGUgKChzbG90ID0gbWNhX2ZpbmRfYWRhcHRlcihzdWJzeXNfbGlzdFtpXS5tY2FfaWQsIHNsb3QpKQorCQkgICAgICAgIT0gTUNBX05PVEZPVU5EKSB7CS8qIHNjYW4gdGhyb3VnaCBhbGwgc2xvdHMgKi8KKwkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCS8qIHJlYWQgdGhlIHBvcy1pbmZvcm1hdGlvbiAqLworCQkJCXBvc1tqXSA9IG1jYV9yZWFkX3N0b3JlZF9wb3Moc2xvdCwgaik7CisJCQlpZiAoKHBvc1syXSAmIDEpID09IDEpCisJCQkJLyogaXMgdGhlIHN1YnN5c3RlbSBjaGlwIGVuYWJsZWQgPyAqLworCQkJCS8qIChleHBsYW5hdGlvbnMgc2VlIGFib3ZlKSAqLworCQkJCXBvcnQgPSBJTV9JT19QT1JUICsgKChwb3NbMl0gJiAweDBlKSA8PCAyKTsKKwkJCWVsc2UgeworCQkJCS8qIGFueXdheSwgc2V0IHRoZSBwb3J0bnVtYmVyIGFuZCB3YXJuICovCisJCQkJcG9ydCA9IElNX0lPX1BPUlQgKyAoKHBvc1syXSAmIDB4MGUpIDw8IDIpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIklCTSBNQ0EgU0NTSTogV0FSTklORyAtIFlvdXIgU0NTSS1zdWJzeXN0ZW0gaXMgZGlzYWJsZWQhXG4iKTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIgICAgICAgICAgICAgIFNDU0ktb3BlcmF0aW9ucyBtYXkgbm90IHdvcmsuXG4iKTsKKwkJCX0KKwkJCWlmICgoaSA9PSBJQk1fU0NTSTJfRlcpICYmIChwb3NbNl0gIT0gMCkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIklCTSBNQ0EgU0NTSTogRVJST1IgLSBXcm9uZyBQT1MoNiktcmVnaXN0ZXIgc2V0dGluZyFcbiIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICBJbXBvc3NpYmxlIHRvIGRldGVybWluZSBhZGFwdGVyIFBVTiFcbiIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICBHdWVzc2luZyBhZGFwdGVyIFBVTiA9IDcuXG4iKTsKKwkJCQlpZCA9IDc7CisJCQl9IGVsc2UgeworCQkJCWlkID0gKHBvc1szXSAmIDB4ZTApID4+IDU7CS8qIGdldCBzdWJzeXN0ZW0gUFVOICovCisJCQkJaWYgKGkgPT0gSUJNX1NDU0kyX0ZXKSB7CisJCQkJCWlkIHw9IChwb3NbM10gJiAweDEwKSA+PiAxOwkvKiBnZXQgc3Vic3lzdGVtIFBVTiBoaWdoLWJpdAorCQkJCQkJCQkJICogZm9yIEYvVyBhZGFwdGVycyAqLworCQkJCX0KKwkJCX0KKwkJCWlmICgoaSA9PSBJQk1fU0NTSTJfRlcpICYmIChwb3NbNF0gJiAweDAxKSAmJiAocG9zWzZdID09IDApKSB7CisJCQkJLyogSVJRMTEgaXMgdXNlZCBieSBTQ1NJLTIgRi9XIEFkYXB0ZXIvQSAqLworCQkJCXByaW50ayhLRVJOX0RFQlVHICJJQk0gTUNBIFNDU0k6IFNDU0ktMiBGL1cgYWRhcHRlciBuZWVkcyBJUlEgMTEuXG4iKTsKKwkJCQkvKiBnZXQgaW50ZXJydXB0IHJlcXVlc3QgbGV2ZWwgKi8KKwkJCQlpZiAocmVxdWVzdF9pcnEoSU1fSVJRX0ZXLCBpbnRlcnJ1cHRfaGFuZGxlciwgU0FfU0hJUlEsICJpYm1tY2FzY3NpIiwgaG9zdHMpKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiSUJNIE1DQSBTQ1NJOiBVbmFibGUgdG8gZ2V0IHNoYXJlZCBJUlEgJWQuXG4iLCBJTV9JUlFfRlcpOworCQkJCX0gZWxzZQorCQkJCQlJUlExMV9yZWdpc3RlcmVkKys7CisJCQl9CisJCQlwcmludGsoS0VSTl9JTkZPICJJQk0gTUNBIFNDU0k6ICVzIGZvdW5kIGluIHNsb3QgJWQsIGlvPTB4JXgsIHNjc2kgaWQ9JWQsXG4iLCBzdWJzeXNfbGlzdFtpXS5kZXNjcmlwdGlvbiwgc2xvdCArIDEsIHBvcnQsIGlkKTsKKwkJCWlmICgocG9zWzJdICYgMHhmMCkgPT0gMHhmMCkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyIgICAgICAgICAgICAgIFJPTSBBZGRyLj1vZmYsIik7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgICAgICAgICAgICAgUk9NIEFkZHIuPTB4JXgsIiwgKChwb3NbMl0gJiAweGYwKSA8PCAxMykgKyAweGMwMDAwKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgcG9ydC1vZmZzZXQ9MHgleCwgc3Vic3lzdGVtPSVzXG4iLCAoKHBvc1syXSAmIDB4MGUpIDw8IDIpLCAocG9zWzJdICYgMSkgPyAiZW5hYmxlZC4iIDogImRpc2FibGVkLiIpOworCisJCQkvKiByZWdpc3RlciB0aGUgaG9zdGFkYXB0ZXIgKi8KKwkJCWlmICgoc2hwbnQgPSBpYm1tY2FfcmVnaXN0ZXIoc2NzaV90ZW1wbGF0ZSwgcG9ydCwgaWQsIGksIHN1YnN5c19saXN0W2ldLmRlc2NyaXB0aW9uKSkpIHsKKwkJCQlmb3IgKGsgPSAyOyBrIDwgODsgaysrKQorCQkJCQkoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgc2hwbnQtPmhvc3RkYXRhKS0+X3Bvc1trXSA9IHBvc1trXTsKKwkJCQkoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgc2hwbnQtPmhvc3RkYXRhKS0+X3NwZWNpYWwgPSBpOworCQkJCW1jYV9zZXRfYWRhcHRlcl9uYW1lKHNsb3QsIHN1YnN5c19saXN0W2ldLmRlc2NyaXB0aW9uKTsKKwkJCQltY2Ffc2V0X2FkYXB0ZXJfcHJvY2ZuKHNsb3QsIChNQ0FfUHJvY0ZuKSBpYm1tY2FfZ2V0aW5mbywgc2hwbnQpOworCQkJCW1jYV9tYXJrX2FzX3VzZWQoc2xvdCk7CisJCQkJaWYgKChpID09IElCTV9TQ1NJMl9GVykgJiYgKHBvc1s0XSAmIDB4MDEpICYmIChwb3NbNl0gPT0gMCkpCisJCQkJCWRldmljZXNfb25faXJxXzExKys7CisJCQkJZWxzZQorCQkJCQlkZXZpY2VzX29uX2lycV8xNCsrOworCQkJfQorCQkJc2xvdCsrOwkvKiBhZHZhbmNlIHRvIG5leHQgc2xvdCAqLworCQl9CQkvKiBhZHZhbmNlIHRvIG5leHQgYWRhcHRlciBpZCBpbiB0aGUgbGlzdCBvZiBJQk0tU0NTSS1zdWJzeXN0ZW1zICovCisJfQorCisJLyogbm93IGNoZWNrIGZvciBTQ1NJLWFkYXB0ZXJzLCBtYXBwZWQgdG8gdGhlIGludGVncmF0ZWQgU0NTSQorCSAqIGFyZWEuIEUuZy4gYSBXL0NhY2hlIGluIE1DQS1zbG90IDkoISkuIERvIHRoZSBjaGVjayBjb3JyZWN0IGhlcmUsCisJICogYXMgdGhpcyBpcyBhIGtub3duIGVmZmVjdCBvbiBzb21lIG1vZGVscyA5NXh4LiAqLworCWxpc3Rfc2l6ZSA9IHNpemVvZihzdWJzeXNfbGlzdCkgLyBzaXplb2Yoc3RydWN0IHN1YnN5c19saXN0X3N0cnVjdCk7CisJZm9yIChpID0gMDsgaSA8IGxpc3Rfc2l6ZTsgaSsrKSB7CisJCS8qIHNjYW4gZWFjaCBzbG90IGZvciBhIGZpdHRpbmcgYWRhcHRlciBpZCAqLworCQlzbG90ID0gbWNhX2ZpbmRfYWRhcHRlcihzdWJzeXNfbGlzdFtpXS5tY2FfaWQsIE1DQV9JTlRFR1NDU0kpOworCQlpZiAoc2xvdCAhPSBNQ0FfTk9URk9VTkQpIHsJLyogc2NhbiB0aHJvdWdoIGFsbCBzbG90cyAqLworCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykJLyogcmVhZCB0aGUgcG9zLWluZm9ybWF0aW9uICovCisJCQkJcG9zW2pdID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCBqKTsKKwkJCWlmICgocG9zWzJdICYgMSkgPT0gMSkgewkvKiBpcyB0aGUgc3Vic3lzdGVtIGNoaXAgZW5hYmxlZCA/ICovCisJCQkJLyogKGV4cGxhbmF0aW9ucyBzZWUgYWJvdmUpICovCisJCQkJcG9ydCA9IElNX0lPX1BPUlQgKyAoKHBvc1syXSAmIDB4MGUpIDw8IDIpOworCQkJfSBlbHNlIHsJLyogYW55d2F5LCBzZXQgdGhlIHBvcnRudW1iZXIgYW5kIHdhcm4gKi8KKwkJCQlwb3J0ID0gSU1fSU9fUE9SVCArICgocG9zWzJdICYgMHgwZSkgPDwgMik7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSUJNIE1DQSBTQ1NJOiBXQVJOSU5HIC0gWW91ciBTQ1NJLXN1YnN5c3RlbSBpcyBkaXNhYmxlZCFcbiIpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAgICAgICAgICAgICAgU0NTSS1vcGVyYXRpb25zIG1heSBub3Qgd29yay5cbiIpOworCQkJfQorCQkJaWYgKChpID09IElCTV9TQ1NJMl9GVykgJiYgKHBvc1s2XSAhPSAwKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiSUJNIE1DQSBTQ1NJOiBFUlJPUiAtIFdyb25nIFBPUyg2KS1yZWdpc3RlciBzZXR0aW5nIVxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICAiICAgICAgICAgICAgICBJbXBvc3NpYmxlIHRvIGRldGVybWluZSBhZGFwdGVyIFBVTiFcbiIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICBHdWVzc2luZyBhZGFwdGVyIFBVTiA9IDcuXG4iKTsKKwkJCQlpZCA9IDc7CisJCQl9IGVsc2UgeworCQkJCWlkID0gKHBvc1szXSAmIDB4ZTApID4+IDU7CS8qIGdldCBzdWJzeXN0ZW0gUFVOICovCisJCQkJaWYgKGkgPT0gSUJNX1NDU0kyX0ZXKQorCQkJCQlpZCB8PSAocG9zWzNdICYgMHgxMCkgPj4gMTsJLyogZ2V0IHN1YnN5c3RlbSBQVU4gaGlnaC1iaXQKKwkJCQkJCQkJCSAqIGZvciBGL1cgYWRhcHRlcnMgKi8KKwkJCX0KKwkJCWlmICgoaSA9PSBJQk1fU0NTSTJfRlcpICYmIChwb3NbNF0gJiAweDAxKSAmJiAocG9zWzZdID09IDApKSB7CisJCQkJLyogSVJRMTEgaXMgdXNlZCBieSBTQ1NJLTIgRi9XIEFkYXB0ZXIvQSAqLworCQkJCXByaW50ayhLRVJOX0RFQlVHICAiSUJNIE1DQSBTQ1NJOiBTQ1NJLTIgRi9XIGFkYXB0ZXIgbmVlZHMgSVJRIDExLlxuIik7CisJCQkJLyogZ2V0IGludGVycnVwdCByZXF1ZXN0IGxldmVsICovCisJCQkJaWYgKHJlcXVlc3RfaXJxKElNX0lSUV9GVywgaW50ZXJydXB0X2hhbmRsZXIsIFNBX1NISVJRLCAiaWJtbWNhc2NzaSIsIGhvc3RzKSkKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJJQk0gTUNBIFNDU0k6IFVuYWJsZSB0byBnZXQgc2hhcmVkIElSUSAlZC5cbiIsIElNX0lSUV9GVyk7CisJCQkJZWxzZQorCQkJCQlJUlExMV9yZWdpc3RlcmVkKys7CisJCQl9CisJCQlwcmludGsoS0VSTl9JTkZPICJJQk0gTUNBIFNDU0k6ICVzIGZvdW5kIGluIHNsb3QgJWQsIGlvPTB4JXgsIHNjc2kgaWQ9JWQsXG4iLCBzdWJzeXNfbGlzdFtpXS5kZXNjcmlwdGlvbiwgc2xvdCArIDEsIHBvcnQsIGlkKTsKKwkJCWlmICgocG9zWzJdICYgMHhmMCkgPT0gMHhmMCkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiICAgICAgICAgICAgICBST00gQWRkci49b2ZmLCIpOworCQkJZWxzZQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIgICAgICAgICAgICAgIFJPTSBBZGRyLj0weCV4LCIsICgocG9zWzJdICYgMHhmMCkgPDwgMTMpICsgMHhjMDAwMCk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiIHBvcnQtb2Zmc2V0PTB4JXgsIHN1YnN5c3RlbT0lc1xuIiwgKChwb3NbMl0gJiAweDBlKSA8PCAyKSwgKHBvc1syXSAmIDEpID8gImVuYWJsZWQuIiA6ICJkaXNhYmxlZC4iKTsKKworCQkJLyogcmVnaXN0ZXIgdGhlIGhvc3RhZGFwdGVyICovCisJCQlpZiAoKHNocG50ID0gaWJtbWNhX3JlZ2lzdGVyKHNjc2lfdGVtcGxhdGUsIHBvcnQsIGlkLCBpLCBzdWJzeXNfbGlzdFtpXS5kZXNjcmlwdGlvbikpKSB7CisJCQkJZm9yIChrID0gMjsgayA8IDc7IGsrKykKKwkJCQkJKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIHNocG50LT5ob3N0ZGF0YSktPl9wb3Nba10gPSBwb3Nba107CisJCQkJKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIHNocG50LT5ob3N0ZGF0YSktPl9zcGVjaWFsID0gaTsKKwkJCQltY2Ffc2V0X2FkYXB0ZXJfbmFtZShzbG90LCBzdWJzeXNfbGlzdFtpXS5kZXNjcmlwdGlvbik7CisJCQkJbWNhX3NldF9hZGFwdGVyX3Byb2NmbihzbG90LCAoTUNBX1Byb2NGbikgaWJtbWNhX2dldGluZm8sIHNocG50KTsKKwkJCQltY2FfbWFya19hc191c2VkKHNsb3QpOworCQkJCWlmICgoaSA9PSBJQk1fU0NTSTJfRlcpICYmIChwb3NbNF0gJiAweDAxKSAmJiAocG9zWzZdID09IDApKQorCQkJCQlkZXZpY2VzX29uX2lycV8xMSsrOworCQkJCWVsc2UKKwkJCQkJZGV2aWNlc19vbl9pcnFfMTQrKzsKKwkJCX0KKwkJCXNsb3QrKzsJLyogYWR2YW5jZSB0byBuZXh0IHNsb3QgKi8KKwkJfQkJLyogYWR2YW5jZSB0byBuZXh0IGFkYXB0ZXIgaWQgaW4gdGhlIGxpc3Qgb2YgSUJNLVNDU0ktc3Vic3lzdGVtcyAqLworCX0KKwlpZiAoSVJRMTFfcmVnaXN0ZXJlZCAmJiAhZGV2aWNlc19vbl9pcnFfMTEpCisJCWZyZWVfaXJxKElNX0lSUV9GVywgaG9zdHMpOwkvKiBubyBkZXZpY2VzIG9uIElSUSAxMSAqLworCWlmIChJUlExNF9yZWdpc3RlcmVkICYmICFkZXZpY2VzX29uX2lycV8xNCkKKwkJZnJlZV9pcnEoSU1fSVJRLCBob3N0cyk7CS8qIG5vIGRldmljZXMgb24gSVJRIDE0ICovCisJaWYgKCFkZXZpY2VzX29uX2lycV8xMSAmJiAhZGV2aWNlc19vbl9pcnFfMTQpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIklCTSBNQ0EgU0NTSTogTm8gSUJNIFNDU0ktc3Vic3lzdGVtIGFkYXB0ZXIgYXR0YWNoZWQuXG4iKTsKKwlyZXR1cm4gZm91bmQ7CQkvKiByZXR1cm4gdGhlIG51bWJlciBvZiBmb3VuZCBTQ1NJIGhvc3RzLiBTaG91bGQgYmUgMSBvciAwLiAqLworfQorCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqaWJtbWNhX3JlZ2lzdGVyKFNjc2lfSG9zdF9UZW1wbGF0ZSAqIHNjc2lfdGVtcGxhdGUsIGludCBwb3J0LCBpbnQgaWQsIGludCBhZGFwdGVydHlwZSwgY2hhciAqaG9zdG5hbWUpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQ7CisJaW50IGksIGo7CisJdW5zaWduZWQgaW50IGN0cmw7CisKKwkvKiBjaGVjayBJL08gcmVnaW9uICovCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwb3J0LCBJTV9OX0lPX1BPUlQsIGhvc3RuYW1lKSkgeworCQlwcmludGsoS0VSTl9FUlIgIklCTSBNQ0EgU0NTSTogVW5hYmxlIHRvIGdldCBJL08gcmVnaW9uIDB4JXgtMHgleCAoJWQgcG9ydHMpLlxuIiwgcG9ydCwgcG9ydCArIElNX05fSU9fUE9SVCAtIDEsIElNX05fSU9fUE9SVCk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIHJlZ2lzdGVyIGhvc3QgKi8KKwlzaHBudCA9IHNjc2lfcmVnaXN0ZXIoc2NzaV90ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEpKTsKKwlpZiAoIXNocG50KSB7CisJCXByaW50ayhLRVJOX0VSUiAiSUJNIE1DQSBTQ1NJOiBVbmFibGUgdG8gcmVnaXN0ZXIgaG9zdC5cbiIpOworCQlyZWxlYXNlX3JlZ2lvbihwb3J0LCBJTV9OX0lPX1BPUlQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiByZXF1ZXN0IEkvTyByZWdpb24gKi8KKwlob3N0c1tmb3VuZF0gPSBzaHBudDsJLyogYWRkIG5ldyBmb3VuZCBob3N0YWRhcHRlciB0byB0aGUgbGlzdCAqLworCXNwZWNpYWwoZm91bmQpID0gYWRhcHRlcnR5cGU7CS8qIGltcG9ydGFudCBhc3NpZ25tZW50IG9yIGVsc2UgY3Jhc2ghICovCisJc3Vic3lzdGVtX2Nvbm5lY3Rvcl9zaXplKGZvdW5kKSA9IDA7CS8qIHByZXNldCBzbG90LXNpemUgKi8KKwlzaHBudC0+aXJxID0gSU1fSVJROwkvKiBhc3NpZ24gbmVjZXNzYXJ5IHN0dWZmIGZvciB0aGUgYWRhcHRlciAqLworCXNocG50LT5pb19wb3J0ID0gcG9ydDsKKwlzaHBudC0+bl9pb19wb3J0ID0gSU1fTl9JT19QT1JUOworCXNocG50LT50aGlzX2lkID0gaWQ7CisJc2hwbnQtPm1heF9pZCA9IDg7CS8qIDggUFVOcyBhcmUgZGVmYXVsdCAqLworCS8qIG5vdywgdGhlIFNDU0ktc3Vic3lzdGVtIGlzIGNvbm5lY3RlZCB0byBMaW51eCAqLworCisJY3RybCA9ICh1bnNpZ25lZCBpbnQpIChpbmIoSU1fQ1RSX1JFRyhmb3VuZCkpKTsJLyogZ2V0IGNvbnRyb2wtcmVnaXN0ZXIgc3RhdHVzICovCisjaWZkZWYgSU1fREVCVUdfUFJPQkUKKwlwcmludGsoIklCTSBNQ0EgU0NTSTogQ29udHJvbCBSZWdpc3RlciBjb250ZW50czogJXgsIHN0YXR1czogJXhcbiIsIGN0cmwsIGluYihJTV9TVEFUX1JFRyhmb3VuZCkpKTsKKwlwcmludGsoIklCTSBNQ0EgU0NTSTogVGhpcyBhZGFwdGVycycgUE9TLXJlZ2lzdGVyczogIik7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJcHJpbnRrKCIleCAiLCBwb3NbaV0pOworCXByaW50aygiXG4iKTsKKyNlbmRpZgorCXJlc2V0X3N0YXR1cyhmb3VuZCkgPSBJTV9SRVNFVF9OT1RfSU5fUFJPR1JFU1M7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykJLyogcmVzZXQgdGhlIHRhYmxlcyAqLworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJZ2V0X2xkbihmb3VuZClbaV1bal0gPSBNQVhfTE9HX0RFVjsKKworCS8qIGNoZWNrIHdoaWNoIGxvZ2ljYWwgZGV2aWNlcyBleGlzdCAqLworCS8qIGFmdGVyIHRoaXMgbGluZSwgbG9jYWwgaW50ZXJydXB0aW5nIGlzIHBvc3NpYmxlOiAqLworCWxvY2FsX2NoZWNraW5nX3BoYXNlX2ZsYWcoZm91bmQpID0gMTsKKwljaGVja19kZXZpY2VzKGZvdW5kLCBhZGFwdGVydHlwZSk7CS8qIGNhbGwgYnkgdmFsdWUsIHVzaW5nIHRoZSBnbG9iYWwgdmFyaWFibGUgaG9zdHMgKi8KKwlsb2NhbF9jaGVja2luZ19waGFzZV9mbGFnKGZvdW5kKSA9IDA7CisJZm91bmQrKzsJCS8qIG5vdyBpbmNyZWFzZSBpbmRleCB0byBiZSBwcmVwYXJlZCBmb3IgbmV4dCBmb3VuZCBzdWJzeXN0ZW0gKi8KKwkvKiBhbiBpYm0gbWNhIHN1YnN5c3RlbSBoYXMgYmVlbiBkZXRlY3RlZCAqLworCXJldHVybiBzaHBudDsKK30KKworc3RhdGljIGludCBpYm1tY2FfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlyZWxlYXNlX3JlZ2lvbihzaHBudC0+aW9fcG9ydCwgc2hwbnQtPm5faW9fcG9ydCk7CisJaWYgKCEoLS1mb3VuZCkpCisJCWZyZWVfaXJxKHNocG50LT5pcnEsIGhvc3RzKTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGZvbGxvd2luZyByb3V0aW5lIGlzIHRoZSBTQ1NJIGNvbW1hbmQgcXVldWUgZm9yIHRoZSBtaWRsZXZlbCBkcml2ZXIgKi8KK3N0YXRpYyBpbnQgaWJtbWNhX3F1ZXVlY29tbWFuZChTY3NpX0NtbmQgKiBjbWQsIHZvaWQgKCpkb25lKSAoU2NzaV9DbW5kICopKQoreworCXVuc2lnbmVkIGludCBsZG47CisJdW5zaWduZWQgaW50IHNjc2lfY21kOworCXN0cnVjdCBpbV9zY2IgKnNjYjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudDsKKwlpbnQgY3VycmVudF9sZG47CisJaW50IGlkLCBsdW47CisJaW50IHRhcmdldDsKKwlpbnQgaG9zdF9pbmRleDsKKwlpbnQgbWF4X3B1bjsKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNsOworCisJc2hwbnQgPSBjbWQtPmRldmljZS0+aG9zdDsKKwkvKiBzZWFyY2ggZm9yIHRoZSByaWdodCBob3N0YWRhcHRlciAqLworCWZvciAoaG9zdF9pbmRleCA9IDA7IGhvc3RzW2hvc3RfaW5kZXhdICYmIGhvc3RzW2hvc3RfaW5kZXhdLT5ob3N0X25vICE9IHNocG50LT5ob3N0X25vOyBob3N0X2luZGV4KyspOworCisJaWYgKCFob3N0c1tob3N0X2luZGV4XSkgewkvKiBpbnZhbGlkIGhvc3RhZGFwdGVyIGRlc2NyaXB0b3IgYWRkcmVzcyAqLworCQljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQlpZiAoZG9uZSkKKwkJCWRvbmUoY21kKTsKKwkJcmV0dXJuIDA7CisJfQorCW1heF9wdW4gPSBzdWJzeXN0ZW1fbWF4aWQoaG9zdF9pbmRleCk7CisJaWYgKGlibV9hbnNpX29yZGVyKSB7CisJCXRhcmdldCA9IG1heF9wdW4gLSAxIC0gY21kLT5kZXZpY2UtPmlkOworCQlpZiAoKHRhcmdldCA8PSBzdWJzeXN0ZW1fcHVuKGhvc3RfaW5kZXgpKSAmJiAoY21kLT5kZXZpY2UtPmlkIDw9IHN1YnN5c3RlbV9wdW4oaG9zdF9pbmRleCkpKQorCQkJdGFyZ2V0LS07CisJCWVsc2UgaWYgKCh0YXJnZXQgPj0gc3Vic3lzdGVtX3B1bihob3N0X2luZGV4KSkgJiYgKGNtZC0+ZGV2aWNlLT5pZCA+PSBzdWJzeXN0ZW1fcHVuKGhvc3RfaW5kZXgpKSkKKwkJCXRhcmdldCsrOworCX0gZWxzZQorCQl0YXJnZXQgPSBjbWQtPmRldmljZS0+aWQ7CisKKwkvKiBpZiAodGFyZ2V0LGx1bikgaXMgTk8gTFVOIG9yIG5vdCBleGlzdGluZyBhdCBhbGwsIHJldHVybiBlcnJvciAqLworCWlmICgoZ2V0X3Njc2koaG9zdF9pbmRleClbdGFyZ2V0XVtjbWQtPmRldmljZS0+bHVuXSA9PSBUWVBFX05PX0xVTikgfHwgKGdldF9zY3NpKGhvc3RfaW5kZXgpW3RhcmdldF1bY21kLT5kZXZpY2UtPmx1bl0gPT0gVFlQRV9OT19ERVZJQ0UpKSB7CisJCWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCWlmIChkb25lKQorCQkJZG9uZShjbWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKmlmICh0YXJnZXQsbHVuKSB1bmFzc2lnbmVkLCBkbyBmdXJ0aGVyIGNoZWNrcy4uLiAqLworCWxkbiA9IGdldF9sZG4oaG9zdF9pbmRleClbdGFyZ2V0XVtjbWQtPmRldmljZS0+bHVuXTsKKwlpZiAobGRuID49IE1BWF9MT0dfREVWKSB7CS8qIG9uIGludmFsaWQgbGRuIGRvIHNwZWNpYWwgc3R1ZmYgKi8KKwkJaWYgKGxkbiA+IE1BWF9MT0dfREVWKSB7CS8qIGR5bmFtaWNhbCByZW1hcHBpbmcgaWYgbGRuIHVuYXNzaWduZWQgKi8KKwkJCWN1cnJlbnRfbGRuID0gbmV4dF9sZG4oaG9zdF9pbmRleCk7CS8qIHN0b3AtdmFsdWUgZm9yIG9uZSBjaXJjbGUgKi8KKwkJCXdoaWxlIChsZChob3N0X2luZGV4KVtuZXh0X2xkbihob3N0X2luZGV4KV0uY21kKSB7CS8qIHNlYXJjaCBmb3IgYSBvY2N1cGllZCwgYnV0IG5vdCBpbiAqLworCQkJCS8qIGNvbW1hbmQtcHJvY2Vzc2luZyBsZG4uICovCisJCQkJbmV4dF9sZG4oaG9zdF9pbmRleCkrKzsKKwkJCQlpZiAobmV4dF9sZG4oaG9zdF9pbmRleCkgPj0gTUFYX0xPR19ERVYpCisJCQkJCW5leHRfbGRuKGhvc3RfaW5kZXgpID0gNzsKKwkJCQlpZiAoY3VycmVudF9sZG4gPT0gbmV4dF9sZG4oaG9zdF9pbmRleCkpIHsJLyogT25lIGNpcmNsZSBkb25lID8gKi8KKwkJCQkJLyogbm8gbm9uLXByb2Nlc3NpbmcgbGRuIGZvdW5kICovCisJCQkJCXByaW50aygiSUJNIE1DQSBTQ1NJOiBDYW5ub3QgYXNzaWduIFNDU0ktZGV2aWNlIGR5bmFtaWNhbGx5IVxuIiAiICAgICAgICAgICAgICBPbiBsZG4gNy0xNCBTQ1NJLWNvbW1hbmRzIGV2ZXJ5d2hlcmUgaW4gcHJvZ3Jlc3MuXG4iICIgICAgICAgICAgICAgIFJlcG9ydGluZyBESURfTk9fQ09OTkVDVCBmb3IgZGV2aWNlICglZCwlZCkuXG4iLCB0YXJnZXQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCQkJCQljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OwkvKiByZXR1cm4gbm8gY29ubmVjdCAqLworCQkJCQlpZiAoZG9uZSkKKwkJCQkJCWRvbmUoY21kKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCisJCQkvKiB1bm1hcCBub24tcHJvY2Vzc2luZyBsZG4gKi8KKwkJCWZvciAoaWQgPSAwOyBpZCA8IG1heF9wdW47IGlkKyspCisJCQkJZm9yIChsdW4gPSAwOyBsdW4gPCA4OyBsdW4rKykgeworCQkJCQlpZiAoZ2V0X2xkbihob3N0X2luZGV4KVtpZF1bbHVuXSA9PSBuZXh0X2xkbihob3N0X2luZGV4KSkgeworCQkJCQkJZ2V0X2xkbihob3N0X2luZGV4KVtpZF1bbHVuXSA9IFRZUEVfTk9fREVWSUNFOworCQkJCQkJZ2V0X3Njc2koaG9zdF9pbmRleClbaWRdW2x1bl0gPSBUWVBFX05PX0RFVklDRTsKKwkJCQkJCS8qIHVubWFwIGVudHJ5ICovCisJCQkJCX0KKwkJCQl9CisJCQkvKiBzZXQgcmVkdWNlZCBpbnRlcnJ1cHRfaGFuZGxlci1tb2RlIGZvciBjaGVja2luZyAqLworCQkJbG9jYWxfY2hlY2tpbmdfcGhhc2VfZmxhZyhob3N0X2luZGV4KSA9IDE7CisJCQkvKiBtYXAgZm91bmQgbGRuIHRvIHB1bixsdW4gKi8KKwkJCWdldF9sZG4oaG9zdF9pbmRleClbdGFyZ2V0XVtjbWQtPmRldmljZS0+bHVuXSA9IG5leHRfbGRuKGhvc3RfaW5kZXgpOworCQkJLyogY2hhbmdlIGxkbiB0byB0aGUgcmlnaHQgdmFsdWUsIHRoYXQgaXMgbm93IG5leHRfbGRuICovCisJCQlsZG4gPSBuZXh0X2xkbihob3N0X2luZGV4KTsKKwkJCS8qIHVuYXNzaWduIGFsbCBsZG5zIChwdW4sbHVuLGxkbiBkb2VzIG5vdCBtYXR0ZXIgZm9yIHJlbW92ZSkgKi8KKwkJCWltbWVkaWF0ZV9hc3NpZ24oaG9zdF9pbmRleCwgMCwgMCwgMCwgUkVNT1ZFX0xETik7CisJCQkvKiBzZXQgb25seSBMRE4gZm9yIHJlbWFwcGVkIGRldmljZSAqLworCQkJaW1tZWRpYXRlX2Fzc2lnbihob3N0X2luZGV4LCB0YXJnZXQsIGNtZC0+ZGV2aWNlLT5sdW4sIGxkbiwgU0VUX0xETik7CisJCQkvKiBnZXQgZGV2aWNlIGluZm9ybWF0aW9uIGZvciBsZFtsZG5dICovCisJCQlpZiAoZGV2aWNlX2V4aXN0cyhob3N0X2luZGV4LCBsZG4sICZsZChob3N0X2luZGV4KVtsZG5dLmJsb2NrX2xlbmd0aCwgJmxkKGhvc3RfaW5kZXgpW2xkbl0uZGV2aWNlX3R5cGUpKSB7CisJCQkJbGQoaG9zdF9pbmRleClbbGRuXS5jbWQgPSBOVUxMOwkvKiBUbyBwcmV2ZW50IHBhbmljIHNldCAwLCBiZWNhdXNlCisJCQkJCQkJCSAgIGRldmljZXMgdGhhdCB3ZXJlIG5vdCBhc3NpZ25lZCwKKwkJCQkJCQkJICAgc2hvdWxkIGhhdmUgbm90aGluZyBpbiBwcm9ncmVzcy4gKi8KKwkJCQlnZXRfc2NzaShob3N0X2luZGV4KVt0YXJnZXRdW2NtZC0+ZGV2aWNlLT5sdW5dID0gbGQoaG9zdF9pbmRleClbbGRuXS5kZXZpY2VfdHlwZTsKKwkJCQkvKiBpbmNyZWFzZSBhc3NpZ25tZW50IGNvdW50ZXJzIGZvciBzdGF0aXN0aWNzIGluIC9wcm9jICovCisJCQkJSUJNX0RTKGhvc3RfaW5kZXgpLmR5bmFtaWNhbF9hc3NpZ25tZW50cysrOworCQkJCUlCTV9EUyhob3N0X2luZGV4KS5sZG5fYXNzaWdubWVudHNbbGRuXSsrOworCQkJfSBlbHNlCisJCQkJLyogcGFuaWMgaGVyZSwgYmVjYXVzZSBhIGRldmljZSwgZm91bmQgYXQgYm9vdHRpbWUgaGFzCisJCQkJICAgdmFuaXNoZWQgKi8KKwkJCQlwYW5pYygiSUJNIE1DQSBTQ1NJOiBsZG49MHgleCwgU0NTSS1kZXZpY2Ugb24gKCVkLCVkKSB2YW5pc2hlZCFcbiIsIGxkbiwgdGFyZ2V0LCBjbWQtPmRldmljZS0+bHVuKTsKKwkJCS8qIHVuYXNzaWduIGFnYWluIGFsbCBsZG5zIChwdW4sbHVuLGxkbiBkb2VzIG5vdCBtYXR0ZXIgZm9yIHJlbW92ZSkgKi8KKwkJCWltbWVkaWF0ZV9hc3NpZ24oaG9zdF9pbmRleCwgMCwgMCwgMCwgUkVNT1ZFX0xETik7CisJCQkvKiByZW1hcCBhbGwgbGRucywgYXMgd3JpdHRlbiBpbiB0aGUgcHVuL2x1biB0YWJsZSAqLworCQkJbHVuID0gMDsKKyNpZmRlZiBDT05GSUdfU0NTSV9NVUxUSV9MVU4KKwkJCWZvciAobHVuID0gMDsgbHVuIDwgODsgbHVuKyspCisjZW5kaWYKKwkJCQlmb3IgKGlkID0gMDsgaWQgPCBtYXhfcHVuOyBpZCsrKSB7CisJCQkJCWlmIChnZXRfbGRuKGhvc3RfaW5kZXgpW2lkXVtsdW5dIDw9IE1BWF9MT0dfREVWKQorCQkJCQkJaW1tZWRpYXRlX2Fzc2lnbihob3N0X2luZGV4LCBpZCwgbHVuLCBnZXRfbGRuKGhvc3RfaW5kZXgpW2lkXVtsdW5dLCBTRVRfTEROKTsKKwkJCQl9CisJCQkvKiBzZXQgYmFjayB0byBub3JtYWwgaW50ZXJydXB0X2hhbmRsaW5nICovCisJCQlsb2NhbF9jaGVja2luZ19waGFzZV9mbGFnKGhvc3RfaW5kZXgpID0gMDsKKyNpZmRlZiBJTV9ERUJVR19QUk9CRQorCQkJLyogSW5mb3JtYXRpb24gb24gc3lzbG9nIHRlcm1pbmFsICovCisJCQlwcmludGsoIklCTSBNQ0EgU0NTSTogbGRuPTB4JXggZHluYW1pY2FsbHkgcmVhc3NpZ25lZCB0byAoJWQsJWQpLlxuIiwgbGRuLCB0YXJnZXQsIGNtZC0+ZGV2aWNlLT5sdW4pOworI2VuZGlmCisJCQkvKiBpbmNyZWFzZSBuZXh0X2xkbiBmb3IgbmV4dCBkeW5hbWljYWwgYXNzaWdubWVudCAqLworCQkJbmV4dF9sZG4oaG9zdF9pbmRleCkrKzsKKwkJCWlmIChuZXh0X2xkbihob3N0X2luZGV4KSA+PSBNQVhfTE9HX0RFVikKKwkJCQluZXh0X2xkbihob3N0X2luZGV4KSA9IDc7CisJCX0gZWxzZSB7CS8qIHdhbGwgYWdhaW5zdCBMaW51eCBhY2Nlc3NlcyB0byB0aGUgc3Vic3lzdGVtIGFkYXB0ZXIgKi8KKwkJCWNtZC0+cmVzdWx0ID0gRElEX0JBRF9UQVJHRVQgPDwgMTY7CisJCQlpZiAoZG9uZSkKKwkJCQlkb25lKGNtZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qdmVyaWZ5IHRoZXJlIGlzIG5vIGNvbW1hbmQgYWxyZWFkeSBpbiBwcm9ncmVzcyBmb3IgdGhpcyBsb2cgZGV2ICovCisJaWYgKGxkKGhvc3RfaW5kZXgpW2xkbl0uY21kKQorCQlwYW5pYygiSUJNIE1DQSBTQ1NJOiBjbWQgYWxyZWFkeSBpbiBwcm9ncmVzcyBmb3IgdGhpcyBsZG4uXG4iKTsKKworCS8qc2F2ZSBkb25lIGluIGNtZCwgYW5kIHNhdmUgY21kIGZvciB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwljbWQtPnNjc2lfZG9uZSA9IGRvbmU7CisJbGQoaG9zdF9pbmRleClbbGRuXS5jbWQgPSBjbWQ7CisKKwkvKmZpbGwgc2NiIGluZm9ybWF0aW9uIGluZGVwZW5kZW50IG9mIHRoZSBzY3NpIGNvbW1hbmQgKi8KKwlzY2IgPSAmKGxkKGhvc3RfaW5kZXgpW2xkbl0uc2NiKTsKKwlsZChob3N0X2luZGV4KVtsZG5dLnRzYi5kZXZfc3RhdHVzID0gMDsKKwlzY2ItPmVuYWJsZSA9IElNX1JFUE9SVF9UU0JfT05MWV9PTl9FUlJPUiB8IElNX1JFVFJZX0VOQUJMRTsKKwlzY2ItPnRzYl9hZHIgPSBpc2FfdmlydF90b19idXMoJihsZChob3N0X2luZGV4KVtsZG5dLnRzYikpOworCXNjc2lfY21kID0gY21kLT5jbW5kWzBdOworCisJaWYgKGNtZC0+dXNlX3NnKSB7CisJCWkgPSBjbWQtPnVzZV9zZzsKKwkJc2wgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIChjbWQtPnJlcXVlc3RfYnVmZmVyKTsKKwkJaWYgKGkgPiAxNikKKwkJCXBhbmljKCJJQk0gTUNBIFNDU0k6IHNjYXR0ZXItZ2F0aGVyIGxpc3QgdG9vIGxvbmcuXG4iKTsKKwkJd2hpbGUgKC0taSA+PSAwKSB7CisJCQlsZChob3N0X2luZGV4KVtsZG5dLnNnZVtpXS5hZGRyZXNzID0gKHZvaWQgKikgKGlzYV9wYWdlX3RvX2J1cyhzbFtpXS5wYWdlKSArIHNsW2ldLm9mZnNldCk7CisJCQlsZChob3N0X2luZGV4KVtsZG5dLnNnZVtpXS5ieXRlX2xlbmd0aCA9IHNsW2ldLmxlbmd0aDsKKwkJfQorCQlzY2ItPmVuYWJsZSB8PSBJTV9QT0lOVEVSX1RPX0xJU1Q7CisJCXNjYi0+c3lzX2J1Zl9hZHIgPSBpc2FfdmlydF90b19idXMoJihsZChob3N0X2luZGV4KVtsZG5dLnNnZVswXSkpOworCQlzY2ItPnN5c19idWZfbGVuZ3RoID0gY21kLT51c2Vfc2cgKiBzaXplb2Yoc3RydWN0IGltX3NnZSk7CisJfSBlbHNlIHsKKwkJc2NiLT5zeXNfYnVmX2FkciA9IGlzYV92aXJ0X3RvX2J1cyhjbWQtPnJlcXVlc3RfYnVmZmVyKTsKKwkJLyogcmVjZW50IExpbnV4IG1pZGxldmVsIFNDU0kgcGxhY2VzIDEwMjQgYnl0ZSBmb3IgaW5xdWlyeQorCQkgKiBjb21tYW5kLiBGYXIgdG9vIG11Y2ggZm9yIG9sZCBQUy8yIGhhcmR3YXJlLiAqLworCQlzd2l0Y2ggKHNjc2lfY21kKSB7CisJCQkvKiBhdm9pZCBjb21tYW5kIGVycm9ycyBieSBzZXR0aW5nIGJ1ZmZlcmxlbmd0aHMgdG8KKwkJCSAqIEFOU0ktc3RhbmRhcmQuIEJld2FyZSBvZiBmb3JjaW5nIGl0IHRvIDI1NSwKKwkJCSAqIHRoaXMgY291bGQgU0VHViB0aGUga2VybmVsISEhICovCisJCWNhc2UgSU5RVUlSWToKKwkJY2FzZSBSRVFVRVNUX1NFTlNFOgorCQljYXNlIE1PREVfU0VOU0U6CisJCWNhc2UgTU9ERV9TRUxFQ1Q6CisJCQlpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPiAyNTUpCisJCQkJc2NiLT5zeXNfYnVmX2xlbmd0aCA9IDI1NTsKKwkJCWVsc2UKKwkJCQlzY2ItPnN5c19idWZfbGVuZ3RoID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCQlicmVhazsKKwkJY2FzZSBURVNUX1VOSVRfUkVBRFk6CisJCQlzY2ItPnN5c19idWZfbGVuZ3RoID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc2NiLT5zeXNfYnVmX2xlbmd0aCA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCQkJYnJlYWs7CisJCX0KKwl9CisJLypmaWxsIHNjYiBpbmZvcm1hdGlvbiBkZXBlbmRlbnQgb24gc2NzaSBjb21tYW5kICovCisKKyNpZmRlZiBJTV9ERUJVR19DTUQKKwlwcmludGsoImlzc3VlIHNjc2kgY21kPSUwMnggdG8gbGRuPSVkXG4iLCBzY3NpX2NtZCwgbGRuKTsKKyNlbmRpZgorCisJLyogZm9yIHNwZWNpZmljIGRldmljZS10eXBlIGRlYnVnZ2luZzogKi8KKyNpZmRlZiBJTV9ERUJVR19DTURfU1BFQ19ERVYKKwlpZiAobGQoaG9zdF9pbmRleClbbGRuXS5kZXZpY2VfdHlwZSA9PSBJTV9ERUJVR19DTURfREVWSUNFKQorCQlwcmludGsoIihTQ1NJLWRldmljZS10eXBlPTB4JXgpIGlzc3VlIHNjc2kgY21kPSUwMnggdG8gbGRuPSVkXG4iLCBsZChob3N0X2luZGV4KVtsZG5dLmRldmljZV90eXBlLCBzY3NpX2NtZCwgbGRuKTsKKyNlbmRpZgorCisJLyogZm9yIHBvc3NpYmxlIHBhbmljcyBzdG9yZSBjdXJyZW50IGNvbW1hbmQgKi8KKwlsYXN0X3Njc2lfY29tbWFuZChob3N0X2luZGV4KVtsZG5dID0gc2NzaV9jbWQ7CisJbGFzdF9zY3NpX3R5cGUoaG9zdF9pbmRleClbbGRuXSA9IElNX1NDQjsKKwkvKiB1cGRhdGUgc3RhdGlzdGljYWwgaW5mbyAqLworCUlCTV9EUyhob3N0X2luZGV4KS50b3RhbF9hY2Nlc3NlcysrOworCUlCTV9EUyhob3N0X2luZGV4KS5sZG5fYWNjZXNzW2xkbl0rKzsKKworCXN3aXRjaCAoc2NzaV9jbWQpIHsKKwljYXNlIFJFQURfNjoKKwljYXNlIFdSSVRFXzY6CisJY2FzZSBSRUFEXzEwOgorCWNhc2UgV1JJVEVfMTA6CisJY2FzZSBSRUFEXzEyOgorCWNhc2UgV1JJVEVfMTI6CisJCS8qIERpc3Rpbmd1aXNoIGJldHdlZW4gZGlzayBhbmQgb3RoZXIgZGV2aWNlcy4gT25seSBkaXNrcyAodGhhdCBhcmUgdGhlCisJCSAgIG1vc3QgZnJlcXVlbnRseSBhY2Nlc3NlZCBkZXZpY2VzKSBzaG91bGQgYmUgc3VwcG9ydGVkIGJ5IHRoZQorCQkgICBJQk0tU0NTSS1TdWJzeXN0ZW0gY29tbWFuZHMuICovCisJCXN3aXRjaCAobGQoaG9zdF9pbmRleClbbGRuXS5kZXZpY2VfdHlwZSkgeworCQljYXNlIFRZUEVfRElTSzoJLyogZm9yIGhhcmRkaXNrcyBlbnRlciBoZXJlIC4uLiAqLworCQljYXNlIFRZUEVfTU9EOgkvKiAuLi4gdHJ5IGl0IGFsc28gZm9yIE1PLWRyaXZlcyAoc2VuZCBmbGFtZXMgYXMgKi8KKwkJCS8qICAgICB5b3UgbGlrZSwgaWYgdGhpcyB3b24ndCB3b3JrLikgKi8KKwkJCWlmIChzY3NpX2NtZCA9PSBSRUFEXzYgfHwgc2NzaV9jbWQgPT0gUkVBRF8xMCB8fCBzY3NpX2NtZCA9PSBSRUFEXzEyKSB7CisJCQkJLyogcmVhZCBjb21tYW5kIHByZXBhcmF0aW9ucyAqLworCQkJCXNjYi0+ZW5hYmxlIHw9IElNX1JFQURfQ09OVFJPTDsKKwkJCQlJQk1fRFMoaG9zdF9pbmRleCkubGRuX3JlYWRfYWNjZXNzW2xkbl0rKzsJLyogaW5jcmVhc2UgUkVBRC1hY2Nlc3Mgb24gbGRuIHN0YXQuICovCisJCQkJc2NiLT5jb21tYW5kID0gSU1fUkVBRF9EQVRBX0NNRCB8IElNX05PX0RJU0NPTk5FQ1Q7CisJCQl9IGVsc2UgewkvKiB3cml0ZSBjb21tYW5kIHByZXBhcmF0aW9ucyAqLworCQkJCUlCTV9EUyhob3N0X2luZGV4KS5sZG5fd3JpdGVfYWNjZXNzW2xkbl0rKzsJLyogaW5jcmVhc2Ugd3JpdGUtY291bnQgb24gbGRuIHN0YXQuICovCisJCQkJc2NiLT5jb21tYW5kID0gSU1fV1JJVEVfREFUQV9DTUQgfCBJTV9OT19ESVNDT05ORUNUOworCQkJfQorCQkJaWYgKHNjc2lfY21kID09IFJFQURfNiB8fCBzY3NpX2NtZCA9PSBXUklURV82KSB7CisJCQkJc2NiLT51MS5sb2dfYmxrX2FkciA9ICgoKHVuc2lnbmVkKSBjbWQtPmNtbmRbM10pIDw8IDApIHwgKCgodW5zaWduZWQpIGNtZC0+Y21uZFsyXSkgPDwgOCkgfCAoKCgodW5zaWduZWQpIGNtZC0+Y21uZFsxXSkgJiAweDFmKSA8PCAxNik7CisJCQkJc2NiLT51Mi5ibGsuY291bnQgPSAodW5zaWduZWQpIGNtZC0+Y21uZFs0XTsKKwkJCX0gZWxzZSB7CisJCQkJc2NiLT51MS5sb2dfYmxrX2FkciA9ICgoKHVuc2lnbmVkKSBjbWQtPmNtbmRbNV0pIDw8IDApIHwgKCgodW5zaWduZWQpIGNtZC0+Y21uZFs0XSkgPDwgOCkgfCAoKCh1bnNpZ25lZCkgY21kLT5jbW5kWzNdKSA8PCAxNikgfCAoKCh1bnNpZ25lZCkgY21kLT5jbW5kWzJdKSA8PCAyNCk7CisJCQkJc2NiLT51Mi5ibGsuY291bnQgPSAoKCh1bnNpZ25lZCkgY21kLT5jbW5kWzhdKSA8PCAwKSB8ICgoKHVuc2lnbmVkKSBjbWQtPmNtbmRbN10pIDw8IDgpOworCQkJfQorCQkJbGFzdF9zY3NpX2xvZ2ljYWxfYmxvY2soaG9zdF9pbmRleClbbGRuXSA9IHNjYi0+dTEubG9nX2Jsa19hZHI7CisJCQlsYXN0X3Njc2lfYmxvY2tjb3VudChob3N0X2luZGV4KVtsZG5dID0gc2NiLT51Mi5ibGsuY291bnQ7CisJCQlzY2ItPnUyLmJsay5sZW5ndGggPSBsZChob3N0X2luZGV4KVtsZG5dLmJsb2NrX2xlbmd0aDsKKwkJCWJyZWFrOworCQkJLyogZm9yIG90aGVyIGRldmljZXMsIGVudGVyIGhlcmUuIE90aGVyIHR5cGVzIGFyZSBub3Qga25vd24gYnkKKwkJCSAgIExpbnV4ISBUWVBFX05PX0xVTiBpcyBmb3JiaWRkZW4gYXMgdmFsaWQgZGV2aWNlLiAqLworCQljYXNlIFRZUEVfUk9NOgorCQljYXNlIFRZUEVfVEFQRToKKwkJY2FzZSBUWVBFX1BST0NFU1NPUjoKKwkJY2FzZSBUWVBFX1dPUk06CisJCWNhc2UgVFlQRV9TQ0FOTkVSOgorCQljYXNlIFRZUEVfTUVESVVNX0NIQU5HRVI6CisJCQkvKiBJZiB0aGVyZSBpcyBhIHNlcXVlbnRpYWwtZGV2aWNlLCBJQk0gcmVjb21tZW5kcyB0byB1c2UKKwkJCSAgIElNX09USEVSX1NDU0lfQ01EX0NNRCBpbnN0ZWFkIG9mIHN1YnN5c3RlbSBSRUFEL1dSSVRFLgorCQkJICAgVGhpcyBpbmNsdWRlcyBDRC1ST00gZGV2aWNlcywgdG9vLCBkdWUgdG8gdGhlIHBhcnRpYWwgc2VxdWVudGlhbAorCQkJICAgcmVhZCBjYXBhYmlsaXRpZXMuICovCisJCQlzY2ItPmNvbW1hbmQgPSBJTV9PVEhFUl9TQ1NJX0NNRF9DTUQ7CisJCQlpZiAoc2NzaV9jbWQgPT0gUkVBRF82IHx8IHNjc2lfY21kID09IFJFQURfMTAgfHwgc2NzaV9jbWQgPT0gUkVBRF8xMikKKwkJCQkvKiBlbmFibGUgUkVBRCAqLworCQkJCXNjYi0+ZW5hYmxlIHw9IElNX1JFQURfQ09OVFJPTDsKKwkJCXNjYi0+ZW5hYmxlIHw9IElNX0JZUEFTU19CVUZGRVI7CisJCQlzY2ItPnUxLnNjc2lfY21kX2xlbmd0aCA9IGNtZC0+Y21kX2xlbjsKKwkJCW1lbWNweShzY2ItPnUyLnNjc2lfY29tbWFuZCwgY21kLT5jbW5kLCBjbWQtPmNtZF9sZW4pOworCQkJbGFzdF9zY3NpX3R5cGUoaG9zdF9pbmRleClbbGRuXSA9IElNX0xPTkdfU0NCOworCQkJLyogUmVhZC93cml0ZSBvbiB0aGlzIG5vbi1kaXNrIGRldmljZXMgaXMgYWxzbyBkaXNwbGF5d29ydGh5LAorCQkJICAgc28gZmxhc2gtdXAgdGhlIExFRC9kaXNwbGF5LiAqLworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJTlFVSVJZOgorCQlJQk1fRFMoaG9zdF9pbmRleCkubGRuX2lucXVpcnlfYWNjZXNzW2xkbl0rKzsKKwkJc2NiLT5jb21tYW5kID0gSU1fREVWSUNFX0lOUVVJUllfQ01EOworCQlzY2ItPmVuYWJsZSB8PSBJTV9SRUFEX0NPTlRST0wgfCBJTV9TVVBSRVNTX0VYQ0VQVElPTl9TSE9SVCB8IElNX0JZUEFTU19CVUZGRVI7CisJCXNjYi0+dTEubG9nX2Jsa19hZHIgPSAwOworCQlicmVhazsKKwljYXNlIFRFU1RfVU5JVF9SRUFEWToKKwkJc2NiLT5jb21tYW5kID0gSU1fT1RIRVJfU0NTSV9DTURfQ01EOworCQlzY2ItPmVuYWJsZSB8PSBJTV9SRUFEX0NPTlRST0wgfCBJTV9TVVBSRVNTX0VYQ0VQVElPTl9TSE9SVCB8IElNX0JZUEFTU19CVUZGRVI7CisJCXNjYi0+dTEubG9nX2Jsa19hZHIgPSAwOworCQlzY2ItPnUxLnNjc2lfY21kX2xlbmd0aCA9IDY7CisJCW1lbWNweShzY2ItPnUyLnNjc2lfY29tbWFuZCwgY21kLT5jbW5kLCA2KTsKKwkJbGFzdF9zY3NpX3R5cGUoaG9zdF9pbmRleClbbGRuXSA9IElNX0xPTkdfU0NCOworCQlicmVhazsKKwljYXNlIFJFQURfQ0FQQUNJVFk6CisJCS8qIHRoZSBsZW5ndGggb2Ygc3lzdGVtIG1lbW9yeSBidWZmZXIgbXVzdCBiZSBleGFjdGx5IDggYnl0ZXMgKi8KKwkJc2NiLT5jb21tYW5kID0gSU1fUkVBRF9DQVBBQ0lUWV9DTUQ7CisJCXNjYi0+ZW5hYmxlIHw9IElNX1JFQURfQ09OVFJPTCB8IElNX0JZUEFTU19CVUZGRVI7CisJCWlmIChzY2ItPnN5c19idWZfbGVuZ3RoID4gOCkKKwkJCXNjYi0+c3lzX2J1Zl9sZW5ndGggPSA4OworCQlicmVhazsKKwkJLyogQ29tbWFuZHMgdGhhdCBuZWVkIHJlYWQtb25seS1tb2RlIChzeXN0ZW0gPC0gZGV2aWNlKTogKi8KKwljYXNlIFJFUVVFU1RfU0VOU0U6CisJCXNjYi0+Y29tbWFuZCA9IElNX1JFUVVFU1RfU0VOU0VfQ01EOworCQlzY2ItPmVuYWJsZSB8PSBJTV9SRUFEX0NPTlRST0wgfCBJTV9TVVBSRVNTX0VYQ0VQVElPTl9TSE9SVCB8IElNX0JZUEFTU19CVUZGRVI7CisJCWJyZWFrOworCQkvKiBDb21tYW5kcyB0aGF0IG5lZWQgd3JpdGUtb25seS1tb2RlIChzeXN0ZW0gLT4gZGV2aWNlKTogKi8KKwljYXNlIE1PREVfU0VMRUNUOgorCWNhc2UgTU9ERV9TRUxFQ1RfMTA6CisJCUlCTV9EUyhob3N0X2luZGV4KS5sZG5fbW9kZXNlbGVjdF9hY2Nlc3NbbGRuXSsrOworCQlzY2ItPmNvbW1hbmQgPSBJTV9PVEhFUl9TQ1NJX0NNRF9DTUQ7CisJCXNjYi0+ZW5hYmxlIHw9IElNX1NVUFJFU1NfRVhDRVBUSU9OX1NIT1JUIHwgSU1fQllQQVNTX0JVRkZFUjsJLypTZWxlY3QgbmVlZHMgV1JJVEUtZW5hYmxlZCAqLworCQlzY2ItPnUxLnNjc2lfY21kX2xlbmd0aCA9IGNtZC0+Y21kX2xlbjsKKwkJbWVtY3B5KHNjYi0+dTIuc2NzaV9jb21tYW5kLCBjbWQtPmNtbmQsIGNtZC0+Y21kX2xlbik7CisJCWxhc3Rfc2NzaV90eXBlKGhvc3RfaW5kZXgpW2xkbl0gPSBJTV9MT05HX1NDQjsKKwkJYnJlYWs7CisJCS8qIEZvciBvdGhlciBjb21tYW5kcywgcmVhZC1vbmx5IGlzIHVzZWZ1bC4gTW9zdCBvdGhlciBjb21tYW5kcyBhcmUKKwkJICAgcnVubmluZyB3aXRob3V0IGFuIGlucHV0LWRhdGEtYmxvY2suICovCisJZGVmYXVsdDoKKwkJc2NiLT5jb21tYW5kID0gSU1fT1RIRVJfU0NTSV9DTURfQ01EOworCQlzY2ItPmVuYWJsZSB8PSBJTV9SRUFEX0NPTlRST0wgfCBJTV9TVVBSRVNTX0VYQ0VQVElPTl9TSE9SVCB8IElNX0JZUEFTU19CVUZGRVI7CisJCXNjYi0+dTEuc2NzaV9jbWRfbGVuZ3RoID0gY21kLT5jbWRfbGVuOworCQltZW1jcHkoc2NiLT51Mi5zY3NpX2NvbW1hbmQsIGNtZC0+Y21uZCwgY21kLT5jbWRfbGVuKTsKKwkJbGFzdF9zY3NpX3R5cGUoaG9zdF9pbmRleClbbGRuXSA9IElNX0xPTkdfU0NCOworCQlicmVhazsKKwl9CisJLyppc3N1ZSBzY2IgY29tbWFuZCwgYW5kIHJldHVybiAqLworCWlmICgrK2Rpc2tfcndfaW5fcHJvZ3Jlc3MgPT0gMSkKKwkJUFMyX0RJU0tfTEVEX09OKHNocG50LT5ob3N0X25vLCB0YXJnZXQpOworCisJaWYgKGxhc3Rfc2NzaV90eXBlKGhvc3RfaW5kZXgpW2xkbl0gPT0gSU1fTE9OR19TQ0IpIHsKKwkJaXNzdWVfY21kKGhvc3RfaW5kZXgsIGlzYV92aXJ0X3RvX2J1cyhzY2IpLCBJTV9MT05HX1NDQiB8IGxkbik7CisJCUlCTV9EUyhob3N0X2luZGV4KS5sb25nX3NjYnMrKzsKKwl9IGVsc2UgeworCQlpc3N1ZV9jbWQoaG9zdF9pbmRleCwgaXNhX3ZpcnRfdG9fYnVzKHNjYiksIElNX1NDQiB8IGxkbik7CisJCUlCTV9EUyhob3N0X2luZGV4KS5zY2JzKys7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlibW1jYV9hYm9ydChTY3NpX0NtbmQgKiBjbWQpCit7CisJLyogQWJvcnQgZG9lcyBub3Qgd29yaywgYXMgdGhlIGFkYXB0ZXIgbmV2ZXIgZ2VuZXJhdGVzIGFuIGludGVycnVwdCBvbgorCSAqIHdoYXRldmVyIHNpdHVhdGlvbiBpcyBzaW11bGF0ZWQsIGV2ZW4gd2hlbiByZWFsbHkgcGVuZGluZyBjb21tYW5kcworCSAqIGFyZSBydW5uaW5nIG9uIHRoZSBhZGFwdGVycycgaGFyZHdhcmUgISAqLworCisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQ7CisJdW5zaWduZWQgaW50IGxkbjsKKwl2b2lkICgqc2F2ZWRfZG9uZSkgKFNjc2lfQ21uZCAqKTsKKwlpbnQgdGFyZ2V0OworCWludCBob3N0X2luZGV4OworCWludCBtYXhfcHVuOworCXVuc2lnbmVkIGxvbmcgaW1tX2NvbW1hbmQ7CisKKyNpZmRlZiBJTV9ERUJVR19QUk9CRQorCXByaW50aygiSUJNIE1DQSBTQ1NJOiBBYm9ydCBzdWJyb3V0aW5lIGNhbGxlZC4uLlxuIik7CisjZW5kaWYKKworCXNocG50ID0gY21kLT5kZXZpY2UtPmhvc3Q7CisJLyogc2VhcmNoIGZvciB0aGUgcmlnaHQgaG9zdGFkYXB0ZXIgKi8KKwlmb3IgKGhvc3RfaW5kZXggPSAwOyBob3N0c1tob3N0X2luZGV4XSAmJiBob3N0c1tob3N0X2luZGV4XS0+aG9zdF9ubyAhPSBzaHBudC0+aG9zdF9ubzsgaG9zdF9pbmRleCsrKTsKKworCWlmICghaG9zdHNbaG9zdF9pbmRleF0pIHsJLyogaW52YWxpZCBob3N0YWRhcHRlciBkZXNjcmlwdG9yIGFkZHJlc3MgKi8KKwkJY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJaWYgKGNtZC0+c2NzaV9kb25lKQorCQkJKGNtZC0+c2NzaV9kb25lKSAoY21kKTsKKwkJc2hwbnQgPSBjbWQtPmRldmljZS0+aG9zdDsKKyNpZmRlZiBJTV9ERUJVR19QUk9CRQorCQlwcmludGsoS0VSTl9ERUJVRyAiSUJNIE1DQSBTQ1NJOiBBYm9ydCBhZGFwdGVyIHNlbGVjdGlvbiBmYWlsZWQhXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisJbWF4X3B1biA9IHN1YnN5c3RlbV9tYXhpZChob3N0X2luZGV4KTsKKwlpZiAoaWJtX2Fuc2lfb3JkZXIpIHsKKwkJdGFyZ2V0ID0gbWF4X3B1biAtIDEgLSBjbWQtPmRldmljZS0+aWQ7CisJCWlmICgodGFyZ2V0IDw9IHN1YnN5c3RlbV9wdW4oaG9zdF9pbmRleCkpICYmIChjbWQtPmRldmljZS0+aWQgPD0gc3Vic3lzdGVtX3B1bihob3N0X2luZGV4KSkpCisJCQl0YXJnZXQtLTsKKwkJZWxzZSBpZiAoKHRhcmdldCA+PSBzdWJzeXN0ZW1fcHVuKGhvc3RfaW5kZXgpKSAmJiAoY21kLT5kZXZpY2UtPmlkID49IHN1YnN5c3RlbV9wdW4oaG9zdF9pbmRleCkpKQorCQkJdGFyZ2V0Kys7CisJfSBlbHNlCisJCXRhcmdldCA9IGNtZC0+ZGV2aWNlLT5pZDsKKworCS8qIGdldCBsb2dpY2FsIGRldmljZSBudW1iZXIsIGFuZCBkaXNhYmxlIHN5c3RlbSBpbnRlcnJ1cHRzICovCisJcHJpbnRrKEtFUk5fV0FSTklORyAiSUJNIE1DQSBTQ1NJOiBTZW5kaW5nIGFib3J0IHRvIGRldmljZSBwdW49JWQsIGx1bj0lZC5cbiIsIHRhcmdldCwgY21kLT5kZXZpY2UtPmx1bik7CisJbGRuID0gZ2V0X2xkbihob3N0X2luZGV4KVt0YXJnZXRdW2NtZC0+ZGV2aWNlLT5sdW5dOworCisJLyppZiBjbWQgZm9yIHRoaXMgbGRuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLCBubyBuZWVkIHRvIGFib3J0ICovCisJaWYgKCFsZChob3N0X2luZGV4KVtsZG5dLmNtZCkgeworCQkgICAgcmV0dXJuIFNVQ0NFU1M7CisJfQorCisJLyogQ2xlYXIgbGQuY21kLCBzYXZlIGRvbmUgZnVuY3Rpb24sIGluc3RhbGwgaW50ZXJuYWwgZG9uZSwKKwkgKiBzZW5kIGFib3J0IGltbWVkaWF0ZSBjb21tYW5kICh0aGlzIGVuYWJsZXMgc3lzLiBpbnRlcnJ1cHRzKSwKKwkgKiBhbmQgd2FpdCB1bnRpbCB0aGUgaW50ZXJydXB0IGFycml2ZXMuCisJICovCisJc2F2ZWRfZG9uZSA9IGNtZC0+c2NzaV9kb25lOworCWNtZC0+c2NzaV9kb25lID0gaW50ZXJuYWxfZG9uZTsKKwljbWQtPlNDcC5TdGF0dXMgPSAwOworCWxhc3Rfc2NzaV9jb21tYW5kKGhvc3RfaW5kZXgpW2xkbl0gPSBJTV9BQk9SVF9JTU1fQ01EOworCWxhc3Rfc2NzaV90eXBlKGhvc3RfaW5kZXgpW2xkbl0gPSBJTV9JTU1fQ01EOworCWltbV9jb21tYW5kID0gaW5sKElNX0NNRF9SRUcoaG9zdF9pbmRleCkpOworCWltbV9jb21tYW5kICY9ICh1bnNpZ25lZCBsb25nKSAoMHhmZmZmMDAwMCk7CS8qIG1hc2sgcmVzZXJ2ZWQgc3R1ZmYgKi8KKwlpbW1fY29tbWFuZCB8PSAodW5zaWduZWQgbG9uZykgKElNX0FCT1JUX0lNTV9DTUQpOworCS8qIG11c3Qgd2FpdCBmb3IgYXR0ZW50aW9uIHJlZyBub3QgYnVzeSAqLworCS8qIEZJWE1FIC0gdGltZW91dCwgcG9saXRlbmVzcyAqLworCXdoaWxlICgxKSB7CisJCWlmICghKGluYihJTV9TVEFUX1JFRyhob3N0X2luZGV4KSkgJiBJTV9CVVNZKSkKKwkJCWJyZWFrOworCX0KKwkvKiB3cml0ZSByZWdpc3RlcnMgYW5kIGVuYWJsZSBzeXN0ZW0gaW50ZXJydXB0cyAqLworCW91dGwoaW1tX2NvbW1hbmQsIElNX0NNRF9SRUcoaG9zdF9pbmRleCkpOworCW91dGIoSU1fSU1NX0NNRCB8IGxkbiwgSU1fQVRUTl9SRUcoaG9zdF9pbmRleCkpOworI2lmZGVmIElNX0RFQlVHX1BST0JFCisJcHJpbnRrKCJJQk0gTUNBIFNDU0k6IEFib3J0IHF1ZXVlZCB0byBhZGFwdGVyLi4uXG4iKTsKKyNlbmRpZgorCXNwaW5fdW5sb2NrX2lycShzaHBudC0+aG9zdF9sb2NrKTsKKwl3aGlsZSAoIWNtZC0+U0NwLlN0YXR1cykKKwkJeWllbGQoKTsKKwlzcGluX2xvY2tfaXJxKHNocG50LT5ob3N0X2xvY2spOworCWNtZC0+c2NzaV9kb25lID0gc2F2ZWRfZG9uZTsKKyNpZmRlZiBJTV9ERUJVR19QUk9CRQorCXByaW50aygiSUJNIE1DQSBTQ1NJOiBBYm9ydCByZXR1cm5lZCB3aXRoIGFkYXB0ZXIgcmVzcG9uc2UuLi5cbiIpOworI2VuZGlmCisKKwkvKmlmIGFib3J0IHdlbnQgd2VsbCwgY2FsbCBzYXZlZCBkb25lLCB0aGVuIHJldHVybiBzdWNjZXNzIG9yIGVycm9yICovCisJaWYgKGNtZC0+cmVzdWx0ID09IChESURfQUJPUlQgPDwgMTYpKSAKKwl7CisJCWNtZC0+cmVzdWx0IHw9IERJRF9BQk9SVCA8PCAxNjsKKwkJaWYgKGNtZC0+c2NzaV9kb25lKQorCQkJKGNtZC0+c2NzaV9kb25lKSAoY21kKTsKKwkJbGQoaG9zdF9pbmRleClbbGRuXS5jbWQgPSBOVUxMOworI2lmZGVmIElNX0RFQlVHX1BST0JFCisJCXByaW50aygiSUJNIE1DQSBTQ1NJOiBBYm9ydCBmaW5pc2hlZCB3aXRoIHN1Y2Nlc3MuXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gU1VDQ0VTUzsKKwl9IGVsc2UgeworCQljbWQtPnJlc3VsdCB8PSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJaWYgKGNtZC0+c2NzaV9kb25lKQorCQkJKGNtZC0+c2NzaV9kb25lKSAoY21kKTsKKwkJbGQoaG9zdF9pbmRleClbbGRuXS5jbWQgPSBOVUxMOworI2lmZGVmIElNX0RFQlVHX1BST0JFCisJCXByaW50aygiSUJNIE1DQSBTQ1NJOiBBYm9ydCBmYWlsZWQuXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gRkFJTEVEOworCX0KK30KKworc3RhdGljIGludCBpYm1tY2FfaG9zdF9yZXNldChTY3NpX0NtbmQgKiBjbWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQ7CisJU2NzaV9DbW5kICpjbWRfYWlkOworCWludCB0aWNrcywgaTsKKwlpbnQgaG9zdF9pbmRleDsKKwl1bnNpZ25lZCBsb25nIGltbV9jb21tYW5kOworCisJaWYgKGNtZCA9PSBOVUxMKQorCQlCVUcoKTsKKworCXRpY2tzID0gSU1fUkVTRVRfREVMQVkgKiBIWjsKKwlzaHBudCA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCS8qIHNlYXJjaCBmb3IgdGhlIHJpZ2h0IGhvc3RhZGFwdGVyICovCisJZm9yIChob3N0X2luZGV4ID0gMDsgaG9zdHNbaG9zdF9pbmRleF0gJiYgaG9zdHNbaG9zdF9pbmRleF0tPmhvc3Rfbm8gIT0gc2hwbnQtPmhvc3Rfbm87IGhvc3RfaW5kZXgrKyk7CisKKwlpZiAoIWhvc3RzW2hvc3RfaW5kZXhdKQkvKiBpbnZhbGlkIGhvc3RhZGFwdGVyIGRlc2NyaXB0b3IgYWRkcmVzcyAqLworCQlyZXR1cm4gRkFJTEVEOworCisJaWYgKGxvY2FsX2NoZWNraW5nX3BoYXNlX2ZsYWcoaG9zdF9pbmRleCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSUJNIE1DQSBTQ1NJOiB1bmFibGUgdG8gcmVzZXQgd2hpbGUgY2hlY2tpbmcgZGV2aWNlcy5cbiIpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCS8qIGlzc3VlIHJlc2V0IGltbWVkaWF0ZSBjb21tYW5kIHRvIHN1YnN5c3RlbSwgYW5kIHdhaXQgZm9yIGludGVycnVwdCAqLworCXByaW50aygiSUJNIE1DQSBTQ1NJOiByZXNldHRpbmcgYWxsIGRldmljZXMuXG4iKTsKKwlyZXNldF9zdGF0dXMoaG9zdF9pbmRleCkgPSBJTV9SRVNFVF9JTl9QUk9HUkVTUzsKKwlsYXN0X3Njc2lfY29tbWFuZChob3N0X2luZGV4KVsweGZdID0gSU1fUkVTRVRfSU1NX0NNRDsKKwlsYXN0X3Njc2lfdHlwZShob3N0X2luZGV4KVsweGZdID0gSU1fSU1NX0NNRDsKKwlpbW1fY29tbWFuZCA9IGlubChJTV9DTURfUkVHKGhvc3RfaW5kZXgpKTsKKwlpbW1fY29tbWFuZCAmPSAodW5zaWduZWQgbG9uZykgKDB4ZmZmZjAwMDApOwkvKiBtYXNrIHJlc2VydmVkIHN0dWZmICovCisJaW1tX2NvbW1hbmQgfD0gKHVuc2lnbmVkIGxvbmcpIChJTV9SRVNFVF9JTU1fQ01EKTsKKwkvKiBtdXN0IHdhaXQgZm9yIGF0dGVudGlvbiByZWcgbm90IGJ1c3kgKi8KKwl3aGlsZSAoMSkgeworCQlpZiAoIShpbmIoSU1fU1RBVF9SRUcoaG9zdF9pbmRleCkpICYgSU1fQlVTWSkpCisJCQlicmVhazsKKwkJc3Bpbl91bmxvY2tfaXJxKHNocG50LT5ob3N0X2xvY2spOworCQl5aWVsZCgpOworCQlzcGluX2xvY2tfaXJxKHNocG50LT5ob3N0X2xvY2spOworCX0KKwkvKndyaXRlIHJlZ2lzdGVycyBhbmQgZW5hYmxlIHN5c3RlbSBpbnRlcnJ1cHRzICovCisJb3V0bChpbW1fY29tbWFuZCwgSU1fQ01EX1JFRyhob3N0X2luZGV4KSk7CisJb3V0YihJTV9JTU1fQ01EIHwgMHhmLCBJTV9BVFROX1JFRyhob3N0X2luZGV4KSk7CisJLyogd2FpdCBmb3IgaW50ZXJydXB0IGZpbmlzaGVkIG9yIGludHJfc3RhdCByZWdpc3RlciB0byBiZSBzZXQsIGFzIHRoZQorCSAqIGludGVycnVwdCB3aWxsIG5vdCBiZSBleGVjdXRlZCwgd2hpbGUgd2UgYXJlIGluIGhlcmUhICovCisJIAorCS8qIEZJWE1FOiBUaGlzIGlzIHJlYWxseSByZWFsbHkgaWNreSB3ZSBzbyB3YW50IGEgc2xlZXBpbmcgdmVyc2lvbiBvZiB0aGlzICEgKi8KKwl3aGlsZSAocmVzZXRfc3RhdHVzKGhvc3RfaW5kZXgpID09IElNX1JFU0VUX0lOX1BST0dSRVNTICYmIC0tdGlja3MgJiYgKChpbmIoSU1fSU5UUl9SRUcoaG9zdF9pbmRleCkpICYgMHg4ZikgIT0gMHg4ZikpIHsKKwkJdWRlbGF5KCgxICsgOTk5IC8gSFopICogMTAwMCk7CisJCWJhcnJpZXIoKTsKKwl9CisJLyogaWYgcmVzZXQgZGlkIG5vdCBjb21wbGV0ZSwganVzdCByZXR1cm4gYW4gZXJyb3IgKi8KKwlpZiAoIXRpY2tzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSUJNIE1DQSBTQ1NJOiByZXNldCBkaWQgbm90IGNvbXBsZXRlIHdpdGhpbiAlZCBzZWNvbmRzLlxuIiwgSU1fUkVTRVRfREVMQVkpOworCQlyZXNldF9zdGF0dXMoaG9zdF9pbmRleCkgPSBJTV9SRVNFVF9GSU5JU0hFRF9GQUlMOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCWlmICgoaW5iKElNX0lOVFJfUkVHKGhvc3RfaW5kZXgpKSAmIDB4OGYpID09IDB4OGYpIHsKKwkJLyogYW5hbHlzaXMgZG9uZSBieSB0aGlzIHJvdXRpbmUgYW5kIG5vdCBieSB0aGUgaW50ci1yb3V0aW5lICovCisJCWlmIChpbmIoSU1fSU5UUl9SRUcoaG9zdF9pbmRleCkpID09IDB4YWYpCisJCQlyZXNldF9zdGF0dXMoaG9zdF9pbmRleCkgPSBJTV9SRVNFVF9GSU5JU0hFRF9PS19OT19JTlQ7CisJCWVsc2UgaWYgKGluYihJTV9JTlRSX1JFRyhob3N0X2luZGV4KSkgPT0gMHhjZikKKwkJCXJlc2V0X3N0YXR1cyhob3N0X2luZGV4KSA9IElNX1JFU0VUX0ZJTklTSEVEX0ZBSUw7CisJCWVsc2UJCS8qIGZhaWxlZCwgNGdldCBpdCAqLworCQkJcmVzZXRfc3RhdHVzKGhvc3RfaW5kZXgpID0gSU1fUkVTRVRfTk9UX0lOX1BST0dSRVNTX05PX0lOVDsKKwkJb3V0YihJTV9FT0kgfCAweGYsIElNX0FUVE5fUkVHKGhvc3RfaW5kZXgpKTsKKwl9CisKKwkvKiBpZiByZXNldCBmYWlsZWQsIGp1c3QgcmV0dXJuIGFuIGVycm9yICovCisJaWYgKHJlc2V0X3N0YXR1cyhob3N0X2luZGV4KSA9PSBJTV9SRVNFVF9GSU5JU0hFRF9GQUlMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSUJNIE1DQSBTQ1NJOiByZXNldCBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwkvKiBzbyByZXNldCBmaW5pc2hlZCBvayAtIGNhbGwgb3V0c3RhbmRpbmcgZG9uZSdzLCBhbmQgcmV0dXJuIHN1Y2Nlc3MgKi8KKwlwcmludGsoS0VSTl9JTkZPICJJQk0gTUNBIFNDU0k6IFJlc2V0IHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xPR19ERVY7IGkrKykgeworCQljbWRfYWlkID0gbGQoaG9zdF9pbmRleClbaV0uY21kOworCQlpZiAoY21kX2FpZCAmJiBjbWRfYWlkLT5zY3NpX2RvbmUpIHsKKwkJCWxkKGhvc3RfaW5kZXgpW2ldLmNtZCA9IE5VTEw7CisJCQljbWRfYWlkLT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7CisJCX0KKwl9CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgaWJtbWNhX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKmluZm8pCit7CisJaW50IHNpemUgPSBjYXBhY2l0eTsKKwlpbmZvWzBdID0gNjQ7CisJaW5mb1sxXSA9IDMyOworCWluZm9bMl0gPSBzaXplIC8gKGluZm9bMF0gKiBpbmZvWzFdKTsKKwlpZiAoaW5mb1syXSA+PSAxMDI0KSB7CisJCWluZm9bMF0gPSAxMjg7CisJCWluZm9bMV0gPSA2MzsKKwkJaW5mb1syXSA9IHNpemUgLyAoaW5mb1swXSAqIGluZm9bMV0pOworCQlpZiAoaW5mb1syXSA+PSAxMDI0KSB7CisJCQlpbmZvWzBdID0gMjU1OworCQkJaW5mb1sxXSA9IDYzOworCQkJaW5mb1syXSA9IHNpemUgLyAoaW5mb1swXSAqIGluZm9bMV0pOworCQkJaWYgKGluZm9bMl0gPj0gMTAyNCkKKwkJCQlpbmZvWzJdID0gMTAyMzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogY2FsY3VsYXRlIHBlcmNlbnRhZ2Ugb2YgdG90YWwgYWNjZXNzZXMgb24gYSBsZG4gKi8KK3N0YXRpYyBpbnQgbGRuX2FjY2Vzc19sb2FkKGludCBob3N0X2luZGV4LCBpbnQgbGRuKQoreworCWlmIChJQk1fRFMoaG9zdF9pbmRleCkudG90YWxfYWNjZXNzZXMgPT0gMCkKKwkJcmV0dXJuICgwKTsKKwlpZiAoSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl9hY2Nlc3NbbGRuXSA9PSAwKQorCQlyZXR1cm4gKDApOworCXJldHVybiAoSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl9hY2Nlc3NbbGRuXSAqIDEwMCkgLyBJQk1fRFMoaG9zdF9pbmRleCkudG90YWxfYWNjZXNzZXM7Cit9CisKKy8qIGNhbGN1bGF0ZSB0b3RhbCBhbW91bnQgb2Ygci93LWFjY2Vzc2VzICovCitzdGF0aWMgaW50IGxkbl9hY2Nlc3NfdG90YWxfcmVhZF93cml0ZShpbnQgaG9zdF9pbmRleCkKK3sKKwlpbnQgYTsKKwlpbnQgaTsKKworCWEgPSAwOworCWZvciAoaSA9IDA7IGkgPD0gTUFYX0xPR19ERVY7IGkrKykKKwkJYSArPSBJQk1fRFMoaG9zdF9pbmRleCkubGRuX3JlYWRfYWNjZXNzW2ldICsgSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl93cml0ZV9hY2Nlc3NbaV07CisJcmV0dXJuIChhKTsKK30KKworc3RhdGljIGludCBsZG5fYWNjZXNzX3RvdGFsX2lucXVpcnkoaW50IGhvc3RfaW5kZXgpCit7CisJaW50IGE7CisJaW50IGk7CisKKwlhID0gMDsKKwlmb3IgKGkgPSAwOyBpIDw9IE1BWF9MT0dfREVWOyBpKyspCisJCWEgKz0gSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl9pbnF1aXJ5X2FjY2Vzc1tpXTsKKwlyZXR1cm4gKGEpOworfQorCitzdGF0aWMgaW50IGxkbl9hY2Nlc3NfdG90YWxfbW9kZXNlbGVjdChpbnQgaG9zdF9pbmRleCkKK3sKKwlpbnQgYTsKKwlpbnQgaTsKKworCWEgPSAwOworCWZvciAoaSA9IDA7IGkgPD0gTUFYX0xPR19ERVY7IGkrKykKKwkJYSArPSBJQk1fRFMoaG9zdF9pbmRleCkubGRuX21vZGVzZWxlY3RfYWNjZXNzW2ldOworCXJldHVybiAoYSk7Cit9CisKKy8qIHJvdXRpbmUgdG8gZGlzcGxheSBpbmZvIGluIHRoZSBwcm9jLWZzLXN0cnVjdHVyZSAoYSBkZWx1eGUgZmVhdHVyZSkgKi8KK3N0YXRpYyBpbnQgaWJtbWNhX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworCWludCBsZW4gPSAwOworCWludCBpLCBpZCwgbHVuLCBob3N0X2luZGV4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG1heF9wdW47CisKKwlmb3IgKGkgPSAwOyBob3N0c1tpXSAmJiBob3N0c1tpXSAhPSBzaHBudDsgaSsrKTsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0c1tpXS0+aG9zdF9sb2NrLCBmbGFncyk7CS8qIENoZWNrIGl0ICovCisJaG9zdF9pbmRleCA9IGk7CisJaWYgKCFzaHBudCkgeworCQlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJcbklCTSBNQ0EgU0NTSTogQ2FuJ3QgZmluZCBhZGFwdGVyIGZvciBob3N0IG51bWJlciAlZFxuIiwKKwkJCQlzaHBudC0+aG9zdF9ubyk7CisJCXJldHVybiBsZW47CisJfQorCW1heF9wdW4gPSBzdWJzeXN0ZW1fbWF4aWQoaG9zdF9pbmRleCk7CisKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJcbiAgICAgICAgICAgICBJQk0tU0NTSS1TdWJzeXN0ZW0tTGludXgtRHJpdmVyLCBWZXJzaW9uICVzXG5cblxuIiwgSUJNTUNBX1NDU0lfRFJJVkVSX1ZFUlNJT04pOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiBTQ1NJIEFjY2Vzcy1TdGF0aXN0aWNzOlxuIik7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAgICAgICAgRGV2aWNlIFNjYW5uaW5nIE9yZGVyLi4uLjogJXNcbiIsIChpYm1fYW5zaV9vcmRlcikgPyAiSUJNL0FOU0kiIDogIk5ldyBJbmR1c3RyeSBTdGFuZGFyZCIpOworI2lmZGVmIENPTkZJR19TQ1NJX01VTFRJX0xVTgorCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAgICAgICAgICAgICAgIE11bHRpcGxlIExVTiBwcm9iaW5nLi4uLi46IFllc1xuIik7CisjZWxzZQorCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAgICAgICAgICAgICAgIE11bHRpcGxlIExVTiBwcm9iaW5nLi4uLi46IE5vXG4iKTsKKyNlbmRpZgorCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAgICAgICAgICAgICAgIFRoaXMgSG9zdG51bWJlci4uLi4uLi4uLi46ICVkXG4iLCBzaHBudC0+aG9zdF9ubyk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAgICAgICAgQmFzZSBJL08tUG9ydC4uLi4uLi4uLi4uLjogMHgleFxuIiwgKHVuc2lnbmVkIGludCkgKElNX0NNRF9SRUcoaG9zdF9pbmRleCkpKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgICAgICAgICAgICAgICAoU2hhcmVkKSBJUlEuLi4uLi4uLi4uLi4uOiAlZFxuIiwgSU1fSVJRKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgICAgICAgICAgICAgICBUb3RhbCBJbnRlcnJ1cHRzLi4uLi4uLi4uOiAlZFxuIiwgSUJNX0RTKGhvc3RfaW5kZXgpLnRvdGFsX2ludGVycnVwdHMpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAgICAgICAgICAgICAgIFRvdGFsIFNDU0kgQWNjZXNzZXMuLi4uLi46ICVkXG4iLCBJQk1fRFMoaG9zdF9pbmRleCkudG90YWxfYWNjZXNzZXMpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAgICAgICAgICAgICAgIFRvdGFsIHNob3J0IFNDQnMuLi4uLi4uLi46ICVkXG4iLCBJQk1fRFMoaG9zdF9pbmRleCkuc2Nicyk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAgICAgICAgVG90YWwgbG9uZyBTQ0JzLi4uLi4uLi4uLjogJWRcbiIsIElCTV9EUyhob3N0X2luZGV4KS5sb25nX3NjYnMpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAgICAgICAgICAgICAgICAgVG90YWwgU0NTSSBSRUFEL1dSSVRFLi46ICVkXG4iLCBsZG5fYWNjZXNzX3RvdGFsX3JlYWRfd3JpdGUoaG9zdF9pbmRleCkpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAgICAgICAgICAgICAgICAgVG90YWwgU0NTSSBJbnF1aXJpZXMuLi46ICVkXG4iLCBsZG5fYWNjZXNzX3RvdGFsX2lucXVpcnkoaG9zdF9pbmRleCkpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAgICAgICAgICAgICAgICAgVG90YWwgU0NTSSBNb2Rlc2VsZWN0cy46ICVkXG4iLCBsZG5fYWNjZXNzX3RvdGFsX21vZGVzZWxlY3QoaG9zdF9pbmRleCkpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAgICAgICAgICAgICAgICAgVG90YWwgU0NTSSBvdGhlciBjbWRzLi46ICVkXG4iLCBJQk1fRFMoaG9zdF9pbmRleCkudG90YWxfYWNjZXNzZXMgLSBsZG5fYWNjZXNzX3RvdGFsX3JlYWRfd3JpdGUoaG9zdF9pbmRleCkKKwkJICAgICAgIC0gbGRuX2FjY2Vzc190b3RhbF9tb2Rlc2VsZWN0KGhvc3RfaW5kZXgpCisJCSAgICAgICAtIGxkbl9hY2Nlc3NfdG90YWxfaW5xdWlyeShob3N0X2luZGV4KSk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAgICAgICAgVG90YWwgU0NTSSBjb21tYW5kIGZhaWxzLjogJWRcblxuIiwgSUJNX0RTKGhvc3RfaW5kZXgpLnRvdGFsX2Vycm9ycyk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiIExvZ2ljYWwtRGV2aWNlLU51bWJlciAoTEROKSBBY2Nlc3MtU3RhdGlzdGljczpcbiIpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAgICAgICAgIExETiB8IEFjY2Vzc2VzIFslJV0gfCAgIFJFQUQgICAgfCAgIFdSSVRFICAgfCBBU1NJR05NRU5UU1xuIik7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAtLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLVxuIik7CisJZm9yIChpID0gMDsgaSA8PSBNQVhfTE9HX0RFVjsgaSsrKQorCQlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgICAgICAgICAlMlggIHwgICAgJTNkICAgICAgIHwgICU4ZCB8ICAlOGQgfCAlOGRcbiIsIGksIGxkbl9hY2Nlc3NfbG9hZChob3N0X2luZGV4LCBpKSwgSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl9yZWFkX2FjY2Vzc1tpXSwgSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl93cml0ZV9hY2Nlc3NbaV0sIElCTV9EUyhob3N0X2luZGV4KS5sZG5fYXNzaWdubWVudHNbaV0pOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIik7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiIER5bmFtaWNhbC1MRE4tQXNzaWdubWVudC1TdGF0aXN0aWNzOlxuIik7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAgICAgICAgTnVtYmVyIG9mIHBoeXNpY2FsIFNDU0ktZGV2aWNlcy4uOiAlZCAoKyBBZGFwdGVyKVxuIiwgSUJNX0RTKGhvc3RfaW5kZXgpLnRvdGFsX3Njc2lfZGV2aWNlcyk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAgICAgICAgRHluYW1pY2FsIEFzc2lnbm1lbnQgbmVjZXNzYXJ5Li4uOiAlc1xuIiwgSUJNX0RTKGhvc3RfaW5kZXgpLmR5bl9mbGFnID8gIlllcyIgOiAiTm8gIik7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAgICAgICAgTmV4dCBMRE4gdG8gYmUgYXNzaWduZWQuLi4uLi4uLi4uOiAweCV4XG4iLCBuZXh0X2xkbihob3N0X2luZGV4KSk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAgICAgICAgRHluYW1pY2FsIGFzc2lnbm1lbnRzIGRvbmUgeWV0Li4uOiAlZFxuIiwgSUJNX0RTKGhvc3RfaW5kZXgpLmR5bmFtaWNhbF9hc3NpZ25tZW50cyk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiXG4gQ3VycmVudCBTQ1NJLURldmljZS1NYXBwaW5nOlxuIik7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICBQaHlzaWNhbCBTQ1NJLURldmljZSBNYXAgICAgICAgICAgICAgICBMb2dpY2FsIFNDU0ktRGV2aWNlIE1hcFxuIik7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgIElEXFxMVU4gIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgICAgICAgSURcXExVTiAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgN1xuIik7CisJZm9yIChpZCA9IDA7IGlkIDwgbWF4X3B1bjsgaWQrKykgeworCQlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgICAgJTJkICAgICAiLCBpZCk7CisJCWZvciAobHVuID0gMDsgbHVuIDwgODsgbHVuKyspCisJCQlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIlMnMgIiwgdGlfcChnZXRfc2NzaShob3N0X2luZGV4KVtpZF1bbHVuXSkpOworCQlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgICAgICAlMmQgICAgICIsIGlkKTsKKwkJZm9yIChsdW4gPSAwOyBsdW4gPCA4OyBsdW4rKykKKwkJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiUycyAiLCB0aV9sKGdldF9sZG4oaG9zdF9pbmRleClbaWRdW2x1bl0pKTsKKwkJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiXG4iKTsKKwl9CisKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIoQSA9IElCTS1TdWJzeXN0ZW0sIEQgPSBIYXJkZGlzaywgVCA9IFRhcGVkcml2ZSwgUCA9IFByb2Nlc3NvciwgVyA9IFdPUk0sXG4iKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgUiA9IENELVJPTSwgUyA9IFNjYW5uZXIsIE0gPSBNTy1Ecml2ZSwgQyA9IE1lZGl1bS1DaGFuZ2VyLCArID0gdW5wcm92aWRlZCBMVU4sXG4iKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgLSA9IG5vdGhpbmcgZm91bmQsIG5vdGhpbmcgYXNzaWduZWQgb3IgdW5wcm9iZWQgTFVOKVxuXG4iKTsKKworCSpzdGFydCA9IGJ1ZmZlciArIG9mZnNldDsKKwlsZW4gLT0gb2Zmc2V0OworCWlmIChsZW4gPiBsZW5ndGgpCisJCWxlbiA9IGxlbmd0aDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNocG50LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IG9wdGlvbl9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGludHNbSU1fTUFYX0hPU1RTXTsKKwljaGFyICpjdXIgPSBzdHI7CisJaW50IGkgPSAxOworCisJd2hpbGUgKGN1ciAmJiBpc2RpZ2l0KCpjdXIpICYmIGkgPD0gSU1fTUFYX0hPU1RTKSB7CisJCWludHNbaSsrXSA9IHNpbXBsZV9zdHJ0b3VsKGN1ciwgTlVMTCwgMCk7CisJCWlmICgoY3VyID0gc3RyY2hyKGN1ciwgJywnKSkgIT0gTlVMTCkKKwkJCWN1cisrOworCX0KKwlpbnRzWzBdID0gaSAtIDE7CisJaW50ZXJuYWxfaWJtbWNhX3Njc2lfc2V0dXAoY3VyLCBpbnRzKTsKKwlyZXR1cm4gMDsKK30KKworX19zZXR1cCgiaWJtbWNhc2NzaT0iLCBvcHRpb25fc2V0dXApOworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKyAgICAgICAgICAucHJvY19uYW1lICAgICAgPSAiaWJtbWNhIiwKKwkgIC5wcm9jX2luZm8JICA9IGlibW1jYV9wcm9jX2luZm8sCisgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIklCTSBTQ1NJLVN1YnN5c3RlbSIsCisgICAgICAgICAgLmRldGVjdCAgICAgICAgID0gaWJtbWNhX2RldGVjdCwKKyAgICAgICAgICAucmVsZWFzZSAgICAgICAgPSBpYm1tY2FfcmVsZWFzZSwKKyAgICAgICAgICAucXVldWVjb21tYW5kICAgPSBpYm1tY2FfcXVldWVjb21tYW5kLAorCSAgLmVoX2Fib3J0X2hhbmRsZXIgPSBpYm1tY2FfYWJvcnQsCisJICAuZWhfaG9zdF9yZXNldF9oYW5kbGVyID0gaWJtbWNhX2hvc3RfcmVzZXQsCisgICAgICAgICAgLmJpb3NfcGFyYW0gICAgID0gaWJtbWNhX2Jpb3NwYXJhbSwKKyAgICAgICAgICAuY2FuX3F1ZXVlICAgICAgPSAxNiwKKyAgICAgICAgICAudGhpc19pZCAgICAgICAgPSA3LAorICAgICAgICAgIC5zZ190YWJsZXNpemUgICA9IDE2LAorICAgICAgICAgIC5jbWRfcGVyX2x1biAgICA9IDEsCisgICAgICAgICAgLnVzZV9jbHVzdGVyaW5nID0gRU5BQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtbWNhLmggYi9kcml2ZXJzL3Njc2kvaWJtbWNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ2OGY2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pYm1tY2EuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogTG93IExldmVsIERyaXZlciBmb3IgdGhlIElCTSBNaWNyb2NoYW5uZWwgU0NTSSBTdWJzeXN0ZW0KKyAqIChIZWFkZXJmaWxlLCBzZWUgRG9jdW1lbnRhdGlvbi9zY3NpL2libW1jYS50eHQgZm9yIGRlc2NyaXB0aW9uIG9mIHRoZQorICogSUJNIE1DQSBTQ1NJLWRyaXZlci4KKyAqIEZvciB1c2UgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHdpdGhpbiB0aGUgTGludXgta2VybmVsIHByb2plY3QuCisgKiBUaGlzIGluY2x1ZGUgZmlsZSB3b3JrcyBvbmx5IGNvcnJlY3RseSB3aXRoIGtlcm5lbCAyLjQuMCBvciBoaWdoZXIhISEgKi8KKworI2lmbmRlZiBfSUJNTUNBX0gKKyNkZWZpbmUgX0lCTU1DQV9ICisKKy8qIENvbW1vbiBmb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgYWxsIExpbnV4LXZlcnNpb25zOiAqLworCisvKiBJbnRlcmZhY2VzIHRvIHRoZSBtaWRsZXZlbCBMaW51eCBTQ1NJIGRyaXZlciAqLworc3RhdGljIGludCBpYm1tY2FfZGV0ZWN0IChTY3NpX0hvc3RfVGVtcGxhdGUgKik7CitzdGF0aWMgaW50IGlibW1jYV9yZWxlYXNlIChzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIGludCBpYm1tY2FfcXVldWVjb21tYW5kIChTY3NpX0NtbmQgKiwgdm9pZCAoKmRvbmUpIChTY3NpX0NtbmQgKikpOworc3RhdGljIGludCBpYm1tY2FfYWJvcnQgKFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgaWJtbWNhX2hvc3RfcmVzZXQgKFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgaWJtbWNhX2Jpb3NwYXJhbSAoc3RydWN0IHNjc2lfZGV2aWNlICosIHN0cnVjdCBibG9ja19kZXZpY2UgKiwgc2VjdG9yX3QsIGludCAqKTsKKworI2VuZGlmIC8qIF9JQk1NQ0FfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libXZzY3NpL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMjQ3YjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACitvYmotJChDT05GSUdfU0NTSV9JQk1WU0NTSSkJKz0gaWJtdnNjc2ljLm8KKworaWJtdnNjc2ljLXkJCQkrPSBpYm12c2NzaS5vCitpYm12c2NzaWMtJChDT05GSUdfUFBDX0lTRVJJRVMpCSs9IGlzZXJpZXNfdnNjc2kubyAKK2libXZzY3NpYy0kKENPTkZJR19QUENfUFNFUklFUykJKz0gcnBhX3ZzY3NpLm8gCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuYyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OWY3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuYwpAQCAtMCwwICsxLDE0NzMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogaWJtdnNjc2kuYworICogKEMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMTk5NCwgMjAwNAorICogQXV0aG9yczogQ29saW4gRGVWaWxiaXNzIChkZXZpbGJpc0B1cy5pYm0uY29tKQorICogICAgICAgICAgU2FudGlhZ28gTGVvbiAoc2FudGlsQHVzLmlibS5jb20pCisgKiAgICAgICAgICBEYXZlIEJvdXRjaGVyIChzbGVkZG9nQHVzLmlibS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcKKyAqIFVTQQorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRW11bGF0aW9uIG9mIGEgU0NTSSBob3N0IGFkYXB0ZXIgZm9yIFZpcnR1YWwgSS9PIGRldmljZXMKKyAqCisgKiBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgU0NTSSBhZGFwdGVyIGltcGxlbWVudGVkIGJ5IHRoZSBJQk0KKyAqIFBvd2VyNSBmaXJtd2FyZS4gIFRoYXQgU0NTSSBhZGFwdGVyIGlzIG5vdCBhIHBoeXNpY2FsIGFkYXB0ZXIsCisgKiBidXQgYWxsb3dzIExpbnV4IFNDU0kgcGVyaXBoZXJhbCBkcml2ZXJzIHRvIGRpcmVjdGx5CisgKiBhY2Nlc3MgZGV2aWNlcyBpbiBhbm90aGVyIGxvZ2ljYWwgcGFydGl0aW9uIG9uIHRoZSBwaHlzaWNhbCBzeXN0ZW0uCisgKgorICogVGhlIHZpcnR1YWwgYWRhcHRlcihzKSBhcmUgcHJlc2VudCBpbiB0aGUgb3BlbiBmaXJtd2FyZSBkZXZpY2UKKyAqIHRyZWUganVzdCBsaWtlIHJlYWwgYWRhcHRlcnMuCisgKgorICogT25lIG9mIHRoZSBjYXBhYmlsaXRpZXMgcHJvdmlkZWQgb24gdGhlc2Ugc3lzdGVtcyBpcyB0aGUgYWJpbGl0eQorICogdG8gRE1BIGJldHdlZW4gcGFydGl0aW9ucy4gIFRoZSBhcmNoaXRlY3R1cmUgc3RhdGVzIHRoYXQgZm9yIFZTQ1NJLAorICogdGhlIHNlcnZlciBzaWRlIGlzIGFsbG93ZWQgdG8gRE1BIHRvIGFuZCBmcm9tIHRoZSBjbGllbnQuICBUaGUgY2xpZW50CisgKiBpcyBuZXZlciB0cnVzdGVkIHRvIERNQSB0byBvciBmcm9tIHRoZSBzZXJ2ZXIgZGlyZWN0bHkuCisgKgorICogTWVzc2FnZXMgYXJlIHNlbnQgYmV0d2VlbiBwYXJ0aXRpb25zIG9uIGEgIkNvbW1hbmQvUmVzcG9uc2UgUXVldWUiIAorICogKENSUSksIHdoaWNoIGlzIGp1c3QgYSBidWZmZXIgb2YgMTYgYnl0ZSBlbnRyaWVzIGluIHRoZSByZWNlaXZlcidzIAorICogU2VuZGVycyBjYW5ub3QgYWNjZXNzIHRoZSBidWZmZXIgZGlyZWN0bHksIGJ1dCBzZW5kIG1lc3NhZ2VzIGJ5CisgKiBtYWtpbmcgYSBoeXBlcnZpc29yIGNhbGwgYW5kIHBhc3NpbmcgaW4gdGhlIDE2IGJ5dGVzLiAgVGhlIGh5cGVydmlzb3IKKyAqIHB1dHMgdGhlIG1lc3NhZ2UgaW4gdGhlIG5leHQgMTYgYnl0ZSBzcGFjZSBpbiByb3VuZC1yb2JiaW4gZmFzaGlvbiwKKyAqIHR1cm5zIG9uIHRoZSBoaWdoIG9yZGVyIGJpdCBvZiB0aGUgbWVzc2FnZSAodGhlIHZhbGlkIGJpdCksIGFuZCAKKyAqIGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQgdG8gdGhlIHJlY2VpdmVyIChpZiBpbnRlcnJ1cHRzIGFyZSB0dXJuZWQgb24uKSAKKyAqIFRoZSByZWNlaXZlciBqdXN0IHR1cm5zIG9mZiB0aGUgdmFsaWQgYml0IHdoZW4gdGhleSBoYXZlIGNvcGllZCBvdXQKKyAqIHRoZSBtZXNzYWdlLgorICoKKyAqIFRoZSBWU0NTSSBjbGllbnQgYnVpbGRzIGEgU0NTSSBSZW1vdGUgUHJvdG9jb2wgKFNSUCkgSW5mb3JtYXRpb24gVW5pdAorICogKElVKSAoYXMgZGVmaW5lZCBpbiB0aGUgVDEwIHN0YW5kYXJkIGF2YWlsYWJsZSBhdCB3d3cudDEwLm9yZyksIGdldHMgCisgKiBhIERNQSBhZGRyZXNzIGZvciB0aGUgbWVzc2FnZSwgYW5kIHNlbmRzIGl0IHRvIHRoZSBzZXJ2ZXIgYXMgdGhlCisgKiBwYXlsb2FkIG9mIGEgQ1JRIG1lc3NhZ2UuICBUaGUgc2VydmVyIERNQXMgdGhlIFNSUCBJVSBhbmQgcHJvY2Vzc2VzIGl0LAorICogaW5jbHVkaW5nIGRvaW5nIGFueSBhZGRpdGlvbmFsIGRhdGEgdHJhbnNmZXJzLiAgV2hlbiBpdCBpcyBkb25lLCBpdAorICogRE1BcyB0aGUgU1JQIHJlc3BvbnNlIGJhY2sgdG8gdGhlIHNhbWUgYWRkcmVzcyBhcyB0aGUgcmVxdWVzdCBjYW1lIGZyb20sCisgKiBhbmQgc2VuZHMgYSBDUlEgbWVzc2FnZSBiYWNrIHRvIGluZm9ybSB0aGUgY2xpZW50IHRoYXQgdGhlIHJlcXVlc3QgaGFzCisgKiBjb21wbGV0ZWQuCisgKgorICogTm90ZSB0aGF0IHNvbWUgb2YgdGhlIHVuZGVybHlpbmcgaW5mcmFzdHJ1Y3R1cmUgaXMgZGlmZmVyZW50IGJldHdlZW4KKyAqIG1hY2hpbmVzIGNvbmZvcm1pbmcgdG8gdGhlICJSUy82MDAwIFBsYXRmb3JtIEFyY2hpdGVjdHVyZSIgKFJQQSkgYW5kCisgKiB0aGUgb2xkZXIgaVNlcmllcyBoeXBlcnZpc29yIG1vZGVscy4gIFRvIHN1cHBvcnQgYm90aCwgc29tZSBsb3cgbGV2ZWwKKyAqIHJvdXRpbmVzIGhhdmUgYmVlbiBicm9rZW4gb3V0IGludG8gcnBhX3ZzY3NpLmMgYW5kIGlzZXJpZXNfdnNjc2kuYy4KKyAqIFRoZSBNYWtlZmlsZSBzaG91bGQgcGljayBvbmUsIG5vdCB0d28sIG5vdCB6ZXJvLCBvZiB0aGVzZS4KKyAqCisgKiBUT0RPOiBUaGlzIGlzIGN1cnJlbnRseSBwcmV0dHkgdGllZCB0byB0aGUgSUJNIGkvcFNlcmllcyBoeXBlcnZpc29yCisgKiBpbnRlcmZhY2VzLiAgSXQgd291bGQgYmUgcmVhbGx5IG5pY2UgdG8gYWJzdHJhY3QgdGhpcyBhYm92ZSBhbiBSRE1BCisgKiBsYXllci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3Zpby5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSAiaWJtdnNjc2kuaCIKKworLyogVGhlIHZhbHVlcyBiZWxvdyBhcmUgc29tZXdoYXQgYXJiaXRyYXJ5IGRlZmF1bHQgdmFsdWVzLCBidXQgCisgKiBPUy80MDAgd2lsbCB1c2UgMyBidXNzZXMgKGRpc2tzLCBDRHMsIHRhcGVzLCBJIHRoaW5rLikKKyAqIE5vdGUgdGhhdCB0aGVyZSBhcmUgMyBiaXRzIG9mIGNoYW5uZWwgdmFsdWUsIDYgYml0cyBvZiBpZCwgYW5kCisgKiA1IGJpdHMgb2YgTFVOLgorICovCitzdGF0aWMgaW50IG1heF9pZCA9IDY0Oworc3RhdGljIGludCBtYXhfY2hhbm5lbCA9IDM7CitzdGF0aWMgaW50IGluaXRfdGltZW91dCA9IDU7CitzdGF0aWMgaW50IG1heF9yZXF1ZXN0cyA9IDUwOworCisjZGVmaW5lIElCTVZTQ1NJX1ZFUlNJT04gIjEuNS41IgorCitNT0RVTEVfREVTQ1JJUFRJT04oIklCTSBWaXJ0dWFsIFNDU0kiKTsKK01PRFVMRV9BVVRIT1IoIkRhdmUgQm91dGNoZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKElCTVZTQ1NJX1ZFUlNJT04pOworCittb2R1bGVfcGFyYW1fbmFtZWQobWF4X2lkLCBtYXhfaWQsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfaWQsICJMYXJnZXN0IElEIHZhbHVlIGZvciBlYWNoIGNoYW5uZWwiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChtYXhfY2hhbm5lbCwgbWF4X2NoYW5uZWwsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfY2hhbm5lbCwgIkxhcmdlc3QgY2hhbm5lbCB2YWx1ZSIpOworbW9kdWxlX3BhcmFtX25hbWVkKGluaXRfdGltZW91dCwgaW5pdF90aW1lb3V0LCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoaW5pdF90aW1lb3V0LCAiSW5pdGlhbGl6YXRpb24gdGltZW91dCBpbiBzZWNvbmRzIik7Cittb2R1bGVfcGFyYW1fbmFtZWQobWF4X3JlcXVlc3RzLCBtYXhfcmVxdWVzdHMsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfcmVxdWVzdHMsICJNYXhpbXVtIHJlcXVlc3RzIGZvciB0aGlzIGFkYXB0ZXIiKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSb3V0aW5lcyBmb3IgdGhlIGV2ZW50IHBvb2wgYW5kIGV2ZW50IHN0cnVjdHMKKyAqLworLyoqCisgKiBpbml0aWFsaXplX2V2ZW50X3Bvb2w6IC0gQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyB0aGUgZXZlbnQgcG9vbCBmb3IgYSBob3N0CisgKiBAcG9vbDoJZXZlbnRfcG9vbCB0byBiZSBpbml0aWFsaXplZAorICogQHNpemU6CU51bWJlciBvZiBldmVudHMgaW4gcG9vbAorICogQGhvc3RkYXRhOglpYm12c2NzaV9ob3N0X2RhdGEgd2hvIG93bnMgdGhlIGV2ZW50IHBvb2wKKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcy4KKyovCitzdGF0aWMgaW50IGluaXRpYWxpemVfZXZlbnRfcG9vbChzdHJ1Y3QgZXZlbnRfcG9vbCAqcG9vbCwKKwkJCQkgaW50IHNpemUsIHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhKQoreworCWludCBpOworCisJcG9vbC0+c2l6ZSA9IHNpemU7CisJcG9vbC0+bmV4dCA9IDA7CisJcG9vbC0+ZXZlbnRzID0ga21hbGxvYyhwb29sLT5zaXplICogc2l6ZW9mKCpwb29sLT5ldmVudHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvb2wtPmV2ZW50cykKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHBvb2wtPmV2ZW50cywgMHgwMCwgcG9vbC0+c2l6ZSAqIHNpemVvZigqcG9vbC0+ZXZlbnRzKSk7CisKKwlwb29sLT5pdV9zdG9yYWdlID0KKwkgICAgZG1hX2FsbG9jX2NvaGVyZW50KGhvc3RkYXRhLT5kZXYsCisJCQkgICAgICAgcG9vbC0+c2l6ZSAqIHNpemVvZigqcG9vbC0+aXVfc3RvcmFnZSksCisJCQkgICAgICAgJnBvb2wtPml1X3Rva2VuLCAwKTsKKwlpZiAoIXBvb2wtPml1X3N0b3JhZ2UpIHsKKwkJa2ZyZWUocG9vbC0+ZXZlbnRzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZm9yIChpID0gMDsgaSA8IHBvb2wtPnNpemU7ICsraSkgeworCQlzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqZXZ0ID0gJnBvb2wtPmV2ZW50c1tpXTsKKwkJbWVtc2V0KCZldnQtPmNycSwgMHgwMCwgc2l6ZW9mKGV2dC0+Y3JxKSk7CisJCWF0b21pY19zZXQoJmV2dC0+ZnJlZSwgMSk7CisJCWV2dC0+Y3JxLnZhbGlkID0gMHg4MDsKKwkJZXZ0LT5jcnEuSVVfbGVuZ3RoID0gc2l6ZW9mKCpldnQtPnhmZXJfaXUpOworCQlldnQtPmNycS5JVV9kYXRhX3B0ciA9IHBvb2wtPml1X3Rva2VuICsgCisJCQlzaXplb2YoKmV2dC0+eGZlcl9pdSkgKiBpOworCQlldnQtPnhmZXJfaXUgPSBwb29sLT5pdV9zdG9yYWdlICsgaTsKKwkJZXZ0LT5ob3N0ZGF0YSA9IGhvc3RkYXRhOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHJlbGVhc2VfZXZlbnRfcG9vbDogLSBGcmVlcyBtZW1vcnkgb2YgYW4gZXZlbnQgcG9vbCBvZiBhIGhvc3QKKyAqIEBwb29sOglldmVudF9wb29sIHRvIGJlIHJlbGVhc2VkCisgKiBAaG9zdGRhdGE6CWlibXZzY3NpX2hvc3RfZGF0YSB3aG8gb3ducyB0aGUgZXZlbiBwb29sCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MuCisqLworc3RhdGljIHZvaWQgcmVsZWFzZV9ldmVudF9wb29sKHN0cnVjdCBldmVudF9wb29sICpwb29sLAorCQkJICAgICAgIHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhKQoreworCWludCBpLCBpbl91c2UgPSAwOworCWZvciAoaSA9IDA7IGkgPCBwb29sLT5zaXplOyArK2kpCisJCWlmIChhdG9taWNfcmVhZCgmcG9vbC0+ZXZlbnRzW2ldLmZyZWUpICE9IDEpCisJCQkrK2luX3VzZTsKKwlpZiAoaW5fdXNlKQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiaWJtdnNjc2k6IHJlbGVhc2luZyBldmVudCBwb29sIHdpdGggJWQgIgorCQkgICAgICAgImV2ZW50cyBzdGlsbCBpbiB1c2U/XG4iLCBpbl91c2UpOworCWtmcmVlKHBvb2wtPmV2ZW50cyk7CisJZG1hX2ZyZWVfY29oZXJlbnQoaG9zdGRhdGEtPmRldiwKKwkJCSAgcG9vbC0+c2l6ZSAqIHNpemVvZigqcG9vbC0+aXVfc3RvcmFnZSksCisJCQkgIHBvb2wtPml1X3N0b3JhZ2UsIHBvb2wtPml1X3Rva2VuKTsKK30KKworLyoqCisgKiB2YWxpZF9ldmVudF9zdHJ1Y3Q6IC0gRGV0ZXJtaW5lcyBpZiBldmVudCBpcyB2YWxpZC4KKyAqIEBwb29sOglldmVudF9wb29sIHRoYXQgY29udGFpbnMgdGhlIGV2ZW50CisgKiBAZXZ0OglzcnBfZXZlbnRfc3RydWN0IHRvIGJlIGNoZWNrZWQgZm9yIHZhbGlkaXR5CisgKgorICogUmV0dXJucyB6ZXJvIGlmIGV2ZW50IGlzIGludmFsaWQsIG9uZSBvdGhlcndpc2UuCisqLworc3RhdGljIGludCB2YWxpZF9ldmVudF9zdHJ1Y3Qoc3RydWN0IGV2ZW50X3Bvb2wgKnBvb2wsCisJCQkJc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKmV2dCkKK3sKKwlpbnQgaW5kZXggPSBldnQgLSBwb29sLT5ldmVudHM7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBwb29sLT5zaXplKQkvKiBvdXRzaWRlIG9mIGJvdW5kcyAqLworCQlyZXR1cm4gMDsKKwlpZiAoZXZ0ICE9IHBvb2wtPmV2ZW50cyArIGluZGV4KQkvKiB1bmFsaWduZWQgKi8KKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogaWJtdnNjc2lfZnJlZS1ldmVudF9zdHJ1Y3Q6IC0gQ2hhbmdlcyBzdGF0dXMgb2YgZXZlbnQgdG8gImZyZWUiCisgKiBAcG9vbDoJZXZlbnRfcG9vbCB0aGF0IGNvbnRhaW5zIHRoZSBldmVudAorICogQGV2dDoJc3JwX2V2ZW50X3N0cnVjdCB0byBiZSBtb2RpZmllZAorICoKKyovCitzdGF0aWMgdm9pZCBmcmVlX2V2ZW50X3N0cnVjdChzdHJ1Y3QgZXZlbnRfcG9vbCAqcG9vbCwKKwkJCQkgICAgICAgc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKmV2dCkKK3sKKwlpZiAoIXZhbGlkX2V2ZW50X3N0cnVjdChwb29sLCBldnQpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImlibXZzY3NpOiBGcmVlaW5nIGludmFsaWQgZXZlbnRfc3RydWN0ICVwICIKKwkJICAgICAgICIobm90IGluIHBvb2wgJXApXG4iLCBldnQsIHBvb2wtPmV2ZW50cyk7CisJCXJldHVybjsKKwl9CisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZldnQtPmZyZWUpICE9IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaWJtdnNjc2k6IEZyZWVpbmcgZXZlbnRfc3RydWN0ICVwICIKKwkJICAgICAgICJ3aGljaCBpcyBub3QgaW4gdXNlIVxuIiwgZXZ0KTsKKwkJcmV0dXJuOworCX0KK30KKworLyoqCisgKiBnZXRfZXZ0X3N0cnVjdDogLSBHZXRzIHRoZSBuZXh0IGZyZWUgZXZlbnQgaW4gcG9vbAorICogQHBvb2w6CWV2ZW50X3Bvb2wgdGhhdCBjb250YWlucyB0aGUgZXZlbnRzIHRvIGJlIHNlYXJjaGVkCisgKgorICogUmV0dXJucyB0aGUgbmV4dCBldmVudCBpbiAiZnJlZSIgc3RhdGUsIGFuZCBOVUxMIGlmIG5vbmUgYXJlIGZyZWUuCisgKiBOb3RlIHRoYXQgbm8gc3luY2hyb25pemF0aW9uIGlzIGRvbmUgaGVyZSwgd2UgYXNzdW1lIHRoZSBob3N0X2xvY2sKKyAqIHdpbGwgc3luY3Job256ZSB0aGluZ3MuCisqLworc3RhdGljIHN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICpnZXRfZXZlbnRfc3RydWN0KHN0cnVjdCBldmVudF9wb29sICpwb29sKQoreworCWludCBpOworCWludCBwb29sc2l6ZSA9IHBvb2wtPnNpemU7CisJaW50IG9mZnNldCA9IHBvb2wtPm5leHQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9vbHNpemU7IGkrKykgeworCQlvZmZzZXQgPSAob2Zmc2V0ICsgMSkgJSBwb29sc2l6ZTsKKwkJaWYgKCFhdG9taWNfZGVjX2lmX3Bvc2l0aXZlKCZwb29sLT5ldmVudHNbb2Zmc2V0XS5mcmVlKSkgeworCQkJcG9vbC0+bmV4dCA9IG9mZnNldDsKKwkJCXJldHVybiAmcG9vbC0+ZXZlbnRzW29mZnNldF07CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9FUlIgImlibXZzY3NpOiBmb3VuZCBubyBldmVudCBzdHJ1Y3QgaW4gcG9vbCFcbiIpOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIGluaXRfZXZlbnRfc3RydWN0OiBJbml0aWFsaXplIGZpZWxkcyBpbiBhbiBldmVudCBzdHJ1Y3QgdGhhdCBhcmUgYWx3YXlzIAorICogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkLgorICogQGV2dDogICAgICAgIFRoZSBldmVudAorICogQGRvbmU6ICAgICAgIFJvdXRpbmUgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyByZXNwb25kZWQgdG8KKyAqIEBmb3JtYXQ6ICAgICBTUlAgb3IgTUFEIGZvcm1hdAorICogQHRpbWVvdXQ6ICAgIHRpbWVvdXQgdmFsdWUgc2V0IGluIHRoZSBDUlEKKyAqLworc3RhdGljIHZvaWQgaW5pdF9ldmVudF9zdHJ1Y3Qoc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKmV2dF9zdHJ1Y3QsCisJCQkgICAgICB2b2lkICgqZG9uZSkgKHN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICopLAorCQkJICAgICAgdTggZm9ybWF0LAorCQkJICAgICAgaW50IHRpbWVvdXQpCit7CisJZXZ0X3N0cnVjdC0+Y21uZCA9IE5VTEw7CisJZXZ0X3N0cnVjdC0+Y21uZF9kb25lID0gTlVMTDsKKwlldnRfc3RydWN0LT5zeW5jX3NycCA9IE5VTEw7CisJZXZ0X3N0cnVjdC0+Y3JxLmZvcm1hdCA9IGZvcm1hdDsKKwlldnRfc3RydWN0LT5jcnEudGltZW91dCA9IHRpbWVvdXQ7CisJZXZ0X3N0cnVjdC0+ZG9uZSA9IGRvbmU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUm91dGluZXMgZm9yIHJlY2VpdmluZyBTQ1NJIHJlc3BvbnNlcyBmcm9tIHRoZSBob3N0aW5nIHBhcnRpdGlvbgorICovCisKKy8qKgorICogc2V0X3NycF9kaXJlY3Rpb246IFNldCB0aGUgZmllbGRzIGluIHRoZSBzcnAgcmVsYXRlZCB0byBkYXRhCisgKiAgICAgZGlyZWN0aW9uIGFuZCBudW1iZXIgb2YgYnVmZmVycyBiYXNlZCBvbiB0aGUgZGlyZWN0aW9uIGluCisgKiAgICAgdGhlIHNjc2lfY21uZCBhbmQgdGhlIG51bWJlciBvZiBidWZmZXJzCisgKi8KK3N0YXRpYyB2b2lkIHNldF9zcnBfZGlyZWN0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCSAgICAgIHN0cnVjdCBzcnBfY21kICpzcnBfY21kLCAKKwkJCSAgICAgIGludCBudW1idWYpCit7CisJaWYgKG51bWJ1ZiA9PSAwKQorCQlyZXR1cm47CisJCisJaWYgKG51bWJ1ZiA9PSAxKSB7CisJCWlmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpCisJCQlzcnBfY21kLT5kYXRhX291dF9mb3JtYXQgPSBTUlBfRElSRUNUX0JVRkZFUjsKKwkJZWxzZSAKKwkJCXNycF9jbWQtPmRhdGFfaW5fZm9ybWF0ID0gU1JQX0RJUkVDVF9CVUZGRVI7CisJfSBlbHNlIHsKKwkJaWYgKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgeworCQkJc3JwX2NtZC0+ZGF0YV9vdXRfZm9ybWF0ID0gU1JQX0lORElSRUNUX0JVRkZFUjsKKwkJCXNycF9jbWQtPmRhdGFfb3V0X2NvdW50ID0gbnVtYnVmOworCQl9IGVsc2UgeworCQkJc3JwX2NtZC0+ZGF0YV9pbl9mb3JtYXQgPSBTUlBfSU5ESVJFQ1RfQlVGRkVSOworCQkJc3JwX2NtZC0+ZGF0YV9pbl9jb3VudCA9IG51bWJ1ZjsKKwkJfQorCX0KK30KKworLyoqCisgKiB1bm1hcF9jbWRfZGF0YTogLSBVbm1hcCBkYXRhIHBvaW50ZWQgaW4gc3JwX2NtZCBiYXNlZCBvbiB0aGUgZm9ybWF0CisgKiBAY21kOglzcnBfY21kIHdob3NlIGFkZGl0aW9uYWxfZGF0YSBtZW1iZXIgd2lsbCBiZSB1bm1hcHBlZAorICogQGRldjoJZGV2aWNlIGZvciB3aGljaCB0aGUgbWVtb3J5IGlzIG1hcHBlZAorICoKKyovCitzdGF0aWMgdm9pZCB1bm1hcF9jbWRfZGF0YShzdHJ1Y3Qgc3JwX2NtZCAqY21kLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisKKwlpZiAoKGNtZC0+ZGF0YV9vdXRfZm9ybWF0ID09IFNSUF9OT19CVUZGRVIpICYmCisJICAgIChjbWQtPmRhdGFfaW5fZm9ybWF0ID09IFNSUF9OT19CVUZGRVIpKQorCQlyZXR1cm47CisJZWxzZSBpZiAoKGNtZC0+ZGF0YV9vdXRfZm9ybWF0ID09IFNSUF9ESVJFQ1RfQlVGRkVSKSB8fAorCQkgKGNtZC0+ZGF0YV9pbl9mb3JtYXQgPT0gU1JQX0RJUkVDVF9CVUZGRVIpKSB7CisJCXN0cnVjdCBtZW1vcnlfZGVzY3JpcHRvciAqZGF0YSA9CisJCQkoc3RydWN0IG1lbW9yeV9kZXNjcmlwdG9yICopY21kLT5hZGRpdGlvbmFsX2RhdGE7CisJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBkYXRhLT52aXJ0dWFsX2FkZHJlc3MsIGRhdGEtPmxlbmd0aCwKKwkJCQkgRE1BX0JJRElSRUNUSU9OQUwpOworCX0gZWxzZSB7CisJCXN0cnVjdCBpbmRpcmVjdF9kZXNjcmlwdG9yICppbmRpcmVjdCA9CisJCQkoc3RydWN0IGluZGlyZWN0X2Rlc2NyaXB0b3IgKiljbWQtPmFkZGl0aW9uYWxfZGF0YTsKKwkJaW50IG51bV9tYXBwZWQgPSBpbmRpcmVjdC0+aGVhZC5sZW5ndGggLyAKKwkJCXNpemVvZihpbmRpcmVjdC0+bGlzdFswXSk7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fbWFwcGVkOyArK2kpIHsKKwkJCXN0cnVjdCBtZW1vcnlfZGVzY3JpcHRvciAqZGF0YSA9ICZpbmRpcmVjdC0+bGlzdFtpXTsKKwkJCWRtYV91bm1hcF9zaW5nbGUoZGV2LAorCQkJCQkgZGF0YS0+dmlydHVhbF9hZGRyZXNzLAorCQkJCQkgZGF0YS0+bGVuZ3RoLCBETUFfQklESVJFQ1RJT05BTCk7CisJCX0KKwl9Cit9CisKKy8qKgorICogbWFwX3NnX2RhdGE6IC0gTWFwcyBkbWEgZm9yIGEgc2NhdHRlcmxpc3QgYW5kIGluaXRpYWxpemVzIGRlY3JpcHRvciBmaWVsZHMKKyAqIEBjbWQ6CVNjc2lfQ21uZCB3aXRoIHRoZSBzY2F0dGVybGlzdAorICogQHNycF9jbWQ6CXNycF9jbWQgdGhhdCBjb250YWlucyB0aGUgbWVtb3J5IGRlc2NyaXB0b3IKKyAqIEBkZXY6CWRldmljZSBmb3Igd2hpY2ggdG8gbWFwIGRtYSBtZW1vcnkKKyAqCisgKiBDYWxsZWQgYnkgbWFwX2RhdGFfZm9yX3NycF9jbWQoKSB3aGVuIGJ1aWxkaW5nIHNycCBjbWQgZnJvbSBzY3NpIGNtZC4KKyAqIFJldHVybnMgMSBvbiBzdWNjZXNzLgorKi8KK3N0YXRpYyBpbnQgbWFwX3NnX2RhdGEoc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkgICAgICAgc3RydWN0IHNycF9jbWQgKnNycF9jbWQsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKworCWludCBpLCBzZ19tYXBwZWQ7CisJdTY0IHRvdGFsX2xlbmd0aCA9IDA7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IGNtZC0+cmVxdWVzdF9idWZmZXI7CisJc3RydWN0IG1lbW9yeV9kZXNjcmlwdG9yICpkYXRhID0KKwkgICAgKHN0cnVjdCBtZW1vcnlfZGVzY3JpcHRvciAqKXNycF9jbWQtPmFkZGl0aW9uYWxfZGF0YTsKKwlzdHJ1Y3QgaW5kaXJlY3RfZGVzY3JpcHRvciAqaW5kaXJlY3QgPQorCSAgICAoc3RydWN0IGluZGlyZWN0X2Rlc2NyaXB0b3IgKilkYXRhOworCisJc2dfbWFwcGVkID0gZG1hX21hcF9zZyhkZXYsIHNnLCBjbWQtPnVzZV9zZywgRE1BX0JJRElSRUNUSU9OQUwpOworCisJaWYgKHNnX21hcHBlZCA9PSAwKQorCQlyZXR1cm4gMDsKKworCXNldF9zcnBfZGlyZWN0aW9uKGNtZCwgc3JwX2NtZCwgc2dfbWFwcGVkKTsKKworCS8qIHNwZWNpYWwgY2FzZTsgd2UgY2FuIHVzZSBhIHNpbmdsZSBkaXJlY3QgZGVzY3JpcHRvciAqLworCWlmIChzZ19tYXBwZWQgPT0gMSkgeworCQlkYXRhLT52aXJ0dWFsX2FkZHJlc3MgPSBzZ19kbWFfYWRkcmVzcygmc2dbMF0pOworCQlkYXRhLT5sZW5ndGggPSBzZ19kbWFfbGVuKCZzZ1swXSk7CisJCWRhdGEtPm1lbW9yeV9oYW5kbGUgPSAwOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoc2dfbWFwcGVkID4gTUFYX0lORElSRUNUX0JVRlMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaWJtdnNjc2k6IE1vcmUgdGhhbiAlZCBtYXBwZWQgc2cgZW50cmllcywgZ290ICVkXG4iLAorCQkgICAgICAgTUFYX0lORElSRUNUX0JVRlMsIHNnX21hcHBlZCk7CisJCXJldHVybiAwOworCX0KKworCWluZGlyZWN0LT5oZWFkLnZpcnR1YWxfYWRkcmVzcyA9IDA7CisJaW5kaXJlY3QtPmhlYWQubGVuZ3RoID0gc2dfbWFwcGVkICogc2l6ZW9mKGluZGlyZWN0LT5saXN0WzBdKTsKKwlpbmRpcmVjdC0+aGVhZC5tZW1vcnlfaGFuZGxlID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgc2dfbWFwcGVkOyArK2kpIHsKKwkJc3RydWN0IG1lbW9yeV9kZXNjcmlwdG9yICpkZXNjciA9ICZpbmRpcmVjdC0+bGlzdFtpXTsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19lbnRyeSA9ICZzZ1tpXTsKKwkJZGVzY3ItPnZpcnR1YWxfYWRkcmVzcyA9IHNnX2RtYV9hZGRyZXNzKHNnX2VudHJ5KTsKKwkJZGVzY3ItPmxlbmd0aCA9IHNnX2RtYV9sZW4oc2dfZW50cnkpOworCQlkZXNjci0+bWVtb3J5X2hhbmRsZSA9IDA7CisJCXRvdGFsX2xlbmd0aCArPSBzZ19kbWFfbGVuKHNnX2VudHJ5KTsKKwl9CisJaW5kaXJlY3QtPnRvdGFsX2xlbmd0aCA9IHRvdGFsX2xlbmd0aDsKKworCXJldHVybiAxOworfQorCisvKioKKyAqIG1hcF9zaW5nbGVfZGF0YTogLSBNYXBzIG1lbW9yeSBhbmQgaW5pdGlhbGl6ZXMgbWVtb3J5IGRlY3JpcHRvciBmaWVsZHMKKyAqIEBjbWQ6CXN0cnVjdCBzY3NpX2NtbmQgd2l0aCB0aGUgbWVtb3J5IHRvIGJlIG1hcHBlZAorICogQHNycF9jbWQ6CXNycF9jbWQgdGhhdCBjb250YWlucyB0aGUgbWVtb3J5IGRlc2NyaXB0b3IKKyAqIEBkZXY6CWRldmljZSBmb3Igd2hpY2ggdG8gbWFwIGRtYSBtZW1vcnkKKyAqCisgKiBDYWxsZWQgYnkgbWFwX2RhdGFfZm9yX3NycF9jbWQoKSB3aGVuIGJ1aWxkaW5nIHNycCBjbWQgZnJvbSBzY3NpIGNtZC4KKyAqIFJldHVybnMgMSBvbiBzdWNjZXNzLgorKi8KK3N0YXRpYyBpbnQgbWFwX3NpbmdsZV9kYXRhKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCSAgIHN0cnVjdCBzcnBfY21kICpzcnBfY21kLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1lbW9yeV9kZXNjcmlwdG9yICpkYXRhID0KKwkgICAgKHN0cnVjdCBtZW1vcnlfZGVzY3JpcHRvciAqKXNycF9jbWQtPmFkZGl0aW9uYWxfZGF0YTsKKworCWRhdGEtPnZpcnR1YWxfYWRkcmVzcyA9CisJCWRtYV9tYXBfc2luZ2xlKGRldiwgY21kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCSAgICAgICBjbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCSAgICAgICBETUFfQklESVJFQ1RJT05BTCk7CisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRhdGEtPnZpcnR1YWxfYWRkcmVzcykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaWJtdnNjc2k6IFVuYWJsZSB0byBtYXAgcmVxdWVzdF9idWZmZXIgZm9yIGNvbW1hbmQhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWRhdGEtPmxlbmd0aCA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCWRhdGEtPm1lbW9yeV9oYW5kbGUgPSAwOworCisJc2V0X3NycF9kaXJlY3Rpb24oY21kLCBzcnBfY21kLCAxKTsKKworCXJldHVybiAxOworfQorCisvKioKKyAqIG1hcF9kYXRhX2Zvcl9zcnBfY21kOiAtIENhbGxzIGZ1bmN0aW9ucyB0byBtYXAgZGF0YSBmb3Igc3JwIGNtZHMKKyAqIEBjbWQ6CXN0cnVjdCBzY3NpX2NtbmQgd2l0aCB0aGUgbWVtb3J5IHRvIGJlIG1hcHBlZAorICogQHNycF9jbWQ6CXNycF9jbWQgdGhhdCBjb250YWlucyB0aGUgbWVtb3J5IGRlc2NyaXB0b3IKKyAqIEBkZXY6CWRtYSBkZXZpY2UgZm9yIHdoaWNoIHRvIG1hcCBkbWEgbWVtb3J5CisgKgorICogQ2FsbGVkIGJ5IHNjc2lfY21kX3RvX3NycF9jbWQoKSB3aGVuIGNvbnZlcnRpbmcgc2NzaSBjbWRzIHRvIHNycCBjbWRzIAorICogUmV0dXJucyAxIG9uIHN1Y2Nlc3MuCisqLworc3RhdGljIGludCBtYXBfZGF0YV9mb3Jfc3JwX2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQkJc3RydWN0IHNycF9jbWQgKnNycF9jbWQsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzd2l0Y2ggKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pIHsKKwljYXNlIERNQV9GUk9NX0RFVklDRToKKwljYXNlIERNQV9UT19ERVZJQ0U6CisJCWJyZWFrOworCWNhc2UgRE1BX05PTkU6CisJCXJldHVybiAxOworCWNhc2UgRE1BX0JJRElSRUNUSU9OQUw6CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImlibXZzY3NpOiBDYW4ndCBtYXAgRE1BX0JJRElSRUNUSU9OQUwgdG8gcmVhZC93cml0ZVxuIik7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImlibXZzY3NpOiBVbmtub3duIGRhdGEgZGlyZWN0aW9uIDB4JTAyeDsgY2FuJ3QgbWFwIVxuIiwKKwkJICAgICAgIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWNtZC0+cmVxdWVzdF9idWZmZXIpCisJCXJldHVybiAxOworCWlmIChjbWQtPnVzZV9zZykKKwkJcmV0dXJuIG1hcF9zZ19kYXRhKGNtZCwgc3JwX2NtZCwgZGV2KTsKKwlyZXR1cm4gbWFwX3NpbmdsZV9kYXRhKGNtZCwgc3JwX2NtZCwgZGV2KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSb3V0aW5lcyBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nIFNSUHMKKyAqLworLyoqCisgKiBpYm12c2NzaV9zZW5kX3NycF9ldmVudDogLSBUcmFuc2Zvcm1zIGV2ZW50IHRvIHU2NCBhcnJheSBhbmQgY2FsbHMgc2VuZF9jcnEoKQorICogQGV2dF9zdHJ1Y3Q6CWV2dF9zdHJ1Y3QgdG8gYmUgc2VudAorICogQGhvc3RkYXRhOglpYm12c2NzaV9ob3N0X2RhdGEgb2YgaG9zdAorICoKKyAqIFJldHVybnMgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gaWJtdnNjc2lfc2VuZF9jcnEoKS4gKFplcm8gZm9yIHN1Y2Nlc3MpCisgKiBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCBob3N0X2xvY2sgaXMgaGVsZCBmb3Igc3luY2hyb25pemF0aW9uCisqLworc3RhdGljIGludCBpYm12c2NzaV9zZW5kX3NycF9ldmVudChzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqZXZ0X3N0cnVjdCwKKwkJCQkgICBzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kOworCXU2NCAqY3JxX2FzX3U2NCA9ICh1NjQgKikgJmV2dF9zdHJ1Y3QtPmNycTsKKwlpbnQgcmM7CisKKwkvKiBJZiB3ZSBoYXZlIGV4aGF1c3RlZCBvdXIgcmVxdWVzdCBsaW1pdCwganVzdCBmYWlsIHRoaXMgcmVxdWVzdC4KKwkgKiBOb3RlIHRoYXQgdGhlcmUgYXJlIHJhcmUgY2FzZXMgaW52b2x2aW5nIGRyaXZlciBnZW5lcmF0ZWQgcmVxdWVzdHMgCisJICogKHN1Y2ggYXMgdGFzayBtYW5hZ2VtZW50IHJlcXVlc3RzKSB0aGF0IHRoZSBtaWQgbGF5ZXIgbWF5IHRoaW5rIHdlCisJICogY2FuIGhhbmRsZSBtb3JlIHJlcXVlc3RzIChjYW5fcXVldWUpIHdoZW4gd2UgYWN0dWFsbHkgY2FuJ3QKKwkgKi8KKwlpZiAoKGV2dF9zdHJ1Y3QtPmNycS5mb3JtYXQgPT0gVklPU1JQX1NSUF9GT1JNQVQpICYmCisJICAgIChhdG9taWNfZGVjX2lmX3Bvc2l0aXZlKCZob3N0ZGF0YS0+cmVxdWVzdF9saW1pdCkgPCAwKSkgeworCQkvKiBTZWUgaWYgdGhlIGFkYXB0ZXIgaXMgZGlzYWJsZWQgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZob3N0ZGF0YS0+cmVxdWVzdF9saW1pdCkgPCAwKQorCQkJZ290byBzZW5kX2Vycm9yOworCQorCQlwcmludGsoS0VSTl9XQVJOSU5HIAorCQkgICAgICAgImlibXZzY3NpOiBXYXJuaW5nLCByZXF1ZXN0X2xpbWl0IGV4Y2VlZGVkXG4iKTsKKwkJdW5tYXBfY21kX2RhdGEoJmV2dF9zdHJ1Y3QtPml1LnNycC5jbWQsCisJCQkgICAgICAgaG9zdGRhdGEtPmRldik7CisJCWZyZWVfZXZlbnRfc3RydWN0KCZob3N0ZGF0YS0+cG9vbCwgZXZ0X3N0cnVjdCk7CisJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCX0KKworCS8qIENvcHkgdGhlIElVIGludG8gdGhlIHRyYW5zZmVyIGFyZWEgKi8KKwkqZXZ0X3N0cnVjdC0+eGZlcl9pdSA9IGV2dF9zdHJ1Y3QtPml1OworCWV2dF9zdHJ1Y3QtPnhmZXJfaXUtPnNycC5nZW5lcmljLnRhZyA9ICh1NjQpZXZ0X3N0cnVjdDsKKworCS8qIEFkZCB0aGlzIHRvIHRoZSBzZW50IGxpc3QuICBXZSBuZWVkIHRvIGRvIHRoaXMgCisJICogYmVmb3JlIHdlIGFjdHVhbGx5IHNlbmQgCisJICogaW4gY2FzZSBpdCBjb21lcyBiYWNrIFJFQUxMWSBmYXN0CisJICovCisJbGlzdF9hZGRfdGFpbCgmZXZ0X3N0cnVjdC0+bGlzdCwgJmhvc3RkYXRhLT5zZW50KTsKKworCWlmICgocmMgPQorCSAgICAgaWJtdnNjc2lfc2VuZF9jcnEoaG9zdGRhdGEsIGNycV9hc191NjRbMF0sIGNycV9hc191NjRbMV0pKSAhPSAwKSB7CisJCWxpc3RfZGVsKCZldnRfc3RydWN0LT5saXN0KTsKKworCQlwcmludGsoS0VSTl9FUlIgImlibXZzY3NpOiBmYWlsZWQgdG8gc2VuZCBldmVudCBzdHJ1Y3QgcmMgJWRcbiIsCisJCSAgICAgICByYyk7CisJCWdvdG8gc2VuZF9lcnJvcjsKKwl9CisKKwlyZXR1cm4gMDsKKworIHNlbmRfZXJyb3I6CisJdW5tYXBfY21kX2RhdGEoJmV2dF9zdHJ1Y3QtPml1LnNycC5jbWQsIGhvc3RkYXRhLT5kZXYpOworCisJaWYgKChjbW5kID0gZXZ0X3N0cnVjdC0+Y21uZCkgIT0gTlVMTCkgeworCQljbW5kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCWV2dF9zdHJ1Y3QtPmNtbmRfZG9uZShjbW5kKTsKKwl9IGVsc2UgaWYgKGV2dF9zdHJ1Y3QtPmRvbmUpCisJCWV2dF9zdHJ1Y3QtPmRvbmUoZXZ0X3N0cnVjdCk7CisJCisJZnJlZV9ldmVudF9zdHJ1Y3QoJmhvc3RkYXRhLT5wb29sLCBldnRfc3RydWN0KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoYW5kbGVfY21kX3JzcDogLSAgSGFuZGxlIHJlc3BvbnNlcyBmcm9tIGNvbW1hbmRzCisgKiBAZXZ0X3N0cnVjdDoJc3JwX2V2ZW50X3N0cnVjdCB0byBiZSBoYW5kbGVkCisgKgorICogVXNlZCBhcyBhIGNhbGxiYWNrIGJ5IHdoZW4gc2VuZGluZyBzY3NpIGNtZHMuCisgKiBHZXRzIGNhbGxlZCBieSBpYm12c2NzaV9oYW5kbGVfY3JxKCkKKyovCitzdGF0aWMgdm9pZCBoYW5kbGVfY21kX3JzcChzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqZXZ0X3N0cnVjdCkKK3sKKwlzdHJ1Y3Qgc3JwX3JzcCAqcnNwID0gJmV2dF9zdHJ1Y3QtPnhmZXJfaXUtPnNycC5yc3A7CisJc3RydWN0IHNjc2lfY21uZCAqY21uZCA9IGV2dF9zdHJ1Y3QtPmNtbmQ7CisKKwlpZiAodW5saWtlbHkocnNwLT50eXBlICE9IFNSUF9SU1BfVFlQRSkpIHsKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCQkgICAgICAgImlibXZzY3NpOiBiYWQgU1JQIFJTUCB0eXBlICVkXG4iLAorCQkJICAgICAgIHJzcC0+dHlwZSk7CisJfQorCQorCWlmIChjbW5kKSB7CisJCWNtbmQtPnJlc3VsdCA9IHJzcC0+c3RhdHVzOworCQlpZiAoKChjbW5kLT5yZXN1bHQgPj4gMSkgJiAweDFmKSA9PSBDSEVDS19DT05ESVRJT04pCisJCQltZW1jcHkoY21uZC0+c2Vuc2VfYnVmZmVyLAorCQkJICAgICAgIHJzcC0+c2Vuc2VfYW5kX3Jlc3BvbnNlX2RhdGEsCisJCQkgICAgICAgcnNwLT5zZW5zZV9kYXRhX2xpc3RfbGVuZ3RoKTsKKwkJdW5tYXBfY21kX2RhdGEoJmV2dF9zdHJ1Y3QtPml1LnNycC5jbWQsIAorCQkJICAgICAgIGV2dF9zdHJ1Y3QtPmhvc3RkYXRhLT5kZXYpOworCisJCWlmIChyc3AtPmRvb3ZlcikKKwkJCWNtbmQtPnJlc2lkID0gcnNwLT5kYXRhX291dF9yZXNpZHVhbF9jb3VudDsKKwkJZWxzZSBpZiAocnNwLT5kaW92ZXIpCisJCQljbW5kLT5yZXNpZCA9IHJzcC0+ZGF0YV9pbl9yZXNpZHVhbF9jb3VudDsKKwl9CisKKwlpZiAoZXZ0X3N0cnVjdC0+Y21uZF9kb25lKQorCQlldnRfc3RydWN0LT5jbW5kX2RvbmUoY21uZCk7Cit9CisKKy8qKgorICogbHVuX2Zyb21fZGV2OiAtIFJldHVybnMgdGhlIGx1biBvZiB0aGUgc2NzaSBkZXZpY2UKKyAqIEBkZXY6CXN0cnVjdCBzY3NpX2RldmljZQorICoKKyovCitzdGF0aWMgaW5saW5lIHUxNiBsdW5fZnJvbV9kZXYoc3RydWN0IHNjc2lfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICgweDIgPDwgMTQpIHwgKGRldi0+aWQgPDwgOCkgfCAoZGV2LT5jaGFubmVsIDw8IDUpIHwgZGV2LT5sdW47Cit9CisKKy8qKgorICogaWJtdnNjc2lfcXVldWU6IC0gVGhlIHF1ZXVlY29tbWFuZCBmdW5jdGlvbiBvZiB0aGUgc2NzaSB0ZW1wbGF0ZSAKKyAqIEBjbWQ6CXN0cnVjdCBzY3NpX2NtbmQgdG8gYmUgZXhlY3V0ZWQKKyAqIEBkb25lOglDYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBjbWQgaXMgY29tcGxldGVkCisqLworc3RhdGljIGludCBpYm12c2NzaV9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21uZCwKKwkJCQkgdm9pZCAoKmRvbmUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCXN0cnVjdCBzcnBfY21kICpzcnBfY21kOworCXN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICpldnRfc3RydWN0OworCXN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhID0KKwkJKHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKikmY21uZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwl1MTYgbHVuID0gbHVuX2Zyb21fZGV2KGNtbmQtPmRldmljZSk7CisKKwlldnRfc3RydWN0ID0gZ2V0X2V2ZW50X3N0cnVjdCgmaG9zdGRhdGEtPnBvb2wpOworCWlmICghZXZ0X3N0cnVjdCkKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisKKwlpbml0X2V2ZW50X3N0cnVjdChldnRfc3RydWN0LAorCQkJICBoYW5kbGVfY21kX3JzcCwKKwkJCSAgVklPU1JQX1NSUF9GT1JNQVQsCisJCQkgIGNtbmQtPnRpbWVvdXQpOworCisJZXZ0X3N0cnVjdC0+Y21uZCA9IGNtbmQ7CisJZXZ0X3N0cnVjdC0+Y21uZF9kb25lID0gZG9uZTsKKworCS8qIFNldCB1cCB0aGUgYWN0dWFsIFNSUCBJVSAqLworCXNycF9jbWQgPSAmZXZ0X3N0cnVjdC0+aXUuc3JwLmNtZDsKKwltZW1zZXQoc3JwX2NtZCwgMHgwMCwgc2l6ZW9mKCpzcnBfY21kKSk7CisJc3JwX2NtZC0+dHlwZSA9IFNSUF9DTURfVFlQRTsKKwltZW1jcHkoc3JwX2NtZC0+Y2RiLCBjbW5kLT5jbW5kLCBzaXplb2YoY21uZC0+Y21uZCkpOworCXNycF9jbWQtPmx1biA9ICgodTY0KSBsdW4pIDw8IDQ4OworCisJaWYgKCFtYXBfZGF0YV9mb3Jfc3JwX2NtZChjbW5kLCBzcnBfY21kLCBob3N0ZGF0YS0+ZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgImlibXZzY3NpOiBjb3VsZG4ndCBjb252ZXJ0IGNtZCB0byBzcnBfY21kXG4iKTsKKwkJZnJlZV9ldmVudF9zdHJ1Y3QoJmhvc3RkYXRhLT5wb29sLCBldnRfc3RydWN0KTsKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisJfQorCisJLyogRml4IHVwIGRtYSBhZGRyZXNzIG9mIHRoZSBidWZmZXIgaXRzZWxmICovCisJaWYgKChzcnBfY21kLT5kYXRhX291dF9mb3JtYXQgPT0gU1JQX0lORElSRUNUX0JVRkZFUikgfHwKKwkgICAgKHNycF9jbWQtPmRhdGFfaW5fZm9ybWF0ID09IFNSUF9JTkRJUkVDVF9CVUZGRVIpKSB7CisJCXN0cnVjdCBpbmRpcmVjdF9kZXNjcmlwdG9yICppbmRpcmVjdCA9CisJCSAgICAoc3RydWN0IGluZGlyZWN0X2Rlc2NyaXB0b3IgKilzcnBfY21kLT5hZGRpdGlvbmFsX2RhdGE7CisJCWluZGlyZWN0LT5oZWFkLnZpcnR1YWxfYWRkcmVzcyA9IGV2dF9zdHJ1Y3QtPmNycS5JVV9kYXRhX3B0ciArCisJCSAgICBvZmZzZXRvZihzdHJ1Y3Qgc3JwX2NtZCwgYWRkaXRpb25hbF9kYXRhKSArCisJCSAgICBvZmZzZXRvZihzdHJ1Y3QgaW5kaXJlY3RfZGVzY3JpcHRvciwgbGlzdCk7CisJfQorCisJcmV0dXJuIGlibXZzY3NpX3NlbmRfc3JwX2V2ZW50KGV2dF9zdHJ1Y3QsIGhvc3RkYXRhKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSb3V0aW5lcyBmb3IgZHJpdmVyIGluaXRpYWxpemF0aW9uCisgKi8KKy8qKgorICogYWRhcHRlcl9pbmZvX3JzcDogLSBIYW5kbGUgcmVzcG9uc2UgdG8gTUFEIGFkYXB0ZXIgaW5mbyByZXF1ZXN0CisgKiBAZXZ0X3N0cnVjdDoJc3JwX2V2ZW50X3N0cnVjdCB3aXRoIHRoZSByZXNwb25zZQorICoKKyAqIFVzZWQgYXMgYSAiZG9uZSIgY2FsbGJhY2sgYnkgd2hlbiBzZW5kaW5nIGFkYXB0ZXJfaW5mby4gR2V0cyBjYWxsZWQKKyAqIGJ5IGlibXZzY3NpX2hhbmRsZV9jcnEoKQorKi8KK3N0YXRpYyB2b2lkIGFkYXB0ZXJfaW5mb19yc3Aoc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKmV2dF9zdHJ1Y3QpCit7CisJc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEgPSBldnRfc3RydWN0LT5ob3N0ZGF0YTsKKwlkbWFfdW5tYXBfc2luZ2xlKGhvc3RkYXRhLT5kZXYsCisJCQkgZXZ0X3N0cnVjdC0+aXUubWFkLmFkYXB0ZXJfaW5mby5idWZmZXIsCisJCQkgZXZ0X3N0cnVjdC0+aXUubWFkLmFkYXB0ZXJfaW5mby5jb21tb24ubGVuZ3RoLAorCQkJIERNQV9CSURJUkVDVElPTkFMKTsKKworCWlmIChldnRfc3RydWN0LT54ZmVyX2l1LT5tYWQuYWRhcHRlcl9pbmZvLmNvbW1vbi5zdGF0dXMpIHsKKwkJcHJpbnRrKCJpYm12c2NzaTogZXJyb3IgJWQgZ2V0dGluZyBhZGFwdGVyIGluZm9cbiIsCisJCSAgICAgICBldnRfc3RydWN0LT54ZmVyX2l1LT5tYWQuYWRhcHRlcl9pbmZvLmNvbW1vbi5zdGF0dXMpOworCX0gZWxzZSB7CisJCXByaW50aygiaWJtdnNjc2k6IGhvc3Qgc3JwIHZlcnNpb246ICVzLCAiCisJCSAgICAgICAiaG9zdCBwYXJ0aXRpb24gJXMgKCVkKSwgT1MgJWQsIG1heCBpbyAldVxuIiwKKwkJICAgICAgIGhvc3RkYXRhLT5tYWRhcHRlcl9pbmZvLnNycF92ZXJzaW9uLAorCQkgICAgICAgaG9zdGRhdGEtPm1hZGFwdGVyX2luZm8ucGFydGl0aW9uX25hbWUsCisJCSAgICAgICBob3N0ZGF0YS0+bWFkYXB0ZXJfaW5mby5wYXJ0aXRpb25fbnVtYmVyLAorCQkgICAgICAgaG9zdGRhdGEtPm1hZGFwdGVyX2luZm8ub3NfdHlwZSwKKwkJICAgICAgIGhvc3RkYXRhLT5tYWRhcHRlcl9pbmZvLnBvcnRfbWF4X3R4dVswXSk7CisJCQorCQlpZiAoaG9zdGRhdGEtPm1hZGFwdGVyX2luZm8ucG9ydF9tYXhfdHh1WzBdKSAKKwkJCWhvc3RkYXRhLT5ob3N0LT5tYXhfc2VjdG9ycyA9IAorCQkJCWhvc3RkYXRhLT5tYWRhcHRlcl9pbmZvLnBvcnRfbWF4X3R4dVswXSA+PiA5OworCX0KK30KKworLyoqCisgKiBzZW5kX21hZF9hZGFwdGVyX2luZm86IC0gU2VuZHMgdGhlIG1hZCBhZGFwdGVyIGluZm8gcmVxdWVzdAorICogICAgICBhbmQgc3RvcmVzIHRoZSByZXN1bHQgc28gaXQgY2FuIGJlIHJldHJpZXZlZCB3aXRoCisgKiAgICAgIHN5c2ZzLiAgV2UgQ09VTEQgY29uc2lkZXIgY2F1c2luZyBhIGZhaWx1cmUgaWYgdGhlCisgKiAgICAgIHJldHVybmVkIFNSUCB2ZXJzaW9uIGRvZXNuJ3QgbWF0Y2ggb3Vycy4KKyAqIEBob3N0ZGF0YToJaWJtdnNjc2lfaG9zdF9kYXRhIG9mIGhvc3QKKyAqIAorICogUmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwuCisqLworc3RhdGljIHZvaWQgc2VuZF9tYWRfYWRhcHRlcl9pbmZvKHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhKQoreworCXN0cnVjdCB2aW9zcnBfYWRhcHRlcl9pbmZvICpyZXE7CisJc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKmV2dF9zdHJ1Y3Q7CisJCisJbWVtc2V0KCZob3N0ZGF0YS0+bWFkYXB0ZXJfaW5mbywgMHgwMCwgc2l6ZW9mKGhvc3RkYXRhLT5tYWRhcHRlcl9pbmZvKSk7CisJCisJZXZ0X3N0cnVjdCA9IGdldF9ldmVudF9zdHJ1Y3QoJmhvc3RkYXRhLT5wb29sKTsKKwlpZiAoIWV2dF9zdHJ1Y3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpYm12c2NzaTogY291bGRuJ3QgYWxsb2NhdGUgYW4gZXZlbnQgIgorCQkgICAgICAgImZvciBBREFQVEVSX0lORk9fUkVRIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpbml0X2V2ZW50X3N0cnVjdChldnRfc3RydWN0LAorCQkJICBhZGFwdGVyX2luZm9fcnNwLAorCQkJICBWSU9TUlBfTUFEX0ZPUk1BVCwKKwkJCSAgaW5pdF90aW1lb3V0ICogSFopOworCQorCXJlcSA9ICZldnRfc3RydWN0LT5pdS5tYWQuYWRhcHRlcl9pbmZvOworCW1lbXNldChyZXEsIDB4MDAsIHNpemVvZigqcmVxKSk7CisJCisJcmVxLT5jb21tb24udHlwZSA9IFZJT1NSUF9BREFQVEVSX0lORk9fVFlQRTsKKwlyZXEtPmNvbW1vbi5sZW5ndGggPSBzaXplb2YoaG9zdGRhdGEtPm1hZGFwdGVyX2luZm8pOworCXJlcS0+YnVmZmVyID0gZG1hX21hcF9zaW5nbGUoaG9zdGRhdGEtPmRldiwKKwkJCQkgICAgICZob3N0ZGF0YS0+bWFkYXB0ZXJfaW5mbywKKwkJCQkgICAgIHNpemVvZihob3N0ZGF0YS0+bWFkYXB0ZXJfaW5mbyksCisJCQkJICAgICBETUFfQklESVJFQ1RJT05BTCk7CisKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IocmVxLT5idWZmZXIpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImlibXZzY3NpOiBVbmFibGUgdG8gbWFwIHJlcXVlc3RfYnVmZmVyICIKKwkJICAgICAgICJmb3IgYWRhcHRlcl9pbmZvIVxuIik7CisJCWZyZWVfZXZlbnRfc3RydWN0KCZob3N0ZGF0YS0+cG9vbCwgZXZ0X3N0cnVjdCk7CisJCXJldHVybjsKKwl9CisJCisJaWYgKGlibXZzY3NpX3NlbmRfc3JwX2V2ZW50KGV2dF9zdHJ1Y3QsIGhvc3RkYXRhKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJpYm12c2NzaTogY291bGRuJ3Qgc2VuZCBBREFQVEVSX0lORk9fUkVRIVxuIik7Cit9OworCisvKioKKyAqIGxvZ2luX3JzcDogLSBIYW5kbGUgcmVzcG9uc2UgdG8gU1JQIGxvZ2luIHJlcXVlc3QKKyAqIEBldnRfc3RydWN0OglzcnBfZXZlbnRfc3RydWN0IHdpdGggdGhlIHJlc3BvbnNlCisgKgorICogVXNlZCBhcyBhICJkb25lIiBjYWxsYmFjayBieSB3aGVuIHNlbmRpbmcgc3JwX2xvZ2luLiBHZXRzIGNhbGxlZAorICogYnkgaWJtdnNjc2lfaGFuZGxlX2NycSgpCisqLworc3RhdGljIHZvaWQgbG9naW5fcnNwKHN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICpldnRfc3RydWN0KQoreworCXN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhID0gZXZ0X3N0cnVjdC0+aG9zdGRhdGE7CisJc3dpdGNoIChldnRfc3RydWN0LT54ZmVyX2l1LT5zcnAuZ2VuZXJpYy50eXBlKSB7CisJY2FzZSBTUlBfTE9HSU5fUlNQX1RZUEU6CS8qIGl0IHdvcmtlZCEgKi8KKwkJYnJlYWs7CisJY2FzZSBTUlBfTE9HSU5fUkVKX1RZUEU6CS8qIHJlZnVzZWQhICovCisJCXByaW50ayhLRVJOX0lORk8gImlibXZzY3NpOiBTUlBfTE9HSU5fUkVRIHJlamVjdGVkXG4iKTsKKwkJLyogTG9naW4gZmFpbGVkLiAgKi8KKwkJYXRvbWljX3NldCgmaG9zdGRhdGEtPnJlcXVlc3RfbGltaXQsIC0xKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImlibXZzY3NpOiBJbnZhbGlkIGxvZ2luIHJlc3BvbnNlIHR5cGVjb2RlIDB4JTAyeCFcbiIsCisJCSAgICAgICBldnRfc3RydWN0LT54ZmVyX2l1LT5zcnAuZ2VuZXJpYy50eXBlKTsKKwkJLyogTG9naW4gZmFpbGVkLiAgKi8KKwkJYXRvbWljX3NldCgmaG9zdGRhdGEtPnJlcXVlc3RfbGltaXQsIC0xKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ayhLRVJOX0lORk8gImlibXZzY3NpOiBTUlBfTE9HSU4gc3VjY2VlZGVkXG4iKTsKKworCWlmIChldnRfc3RydWN0LT54ZmVyX2l1LT5zcnAubG9naW5fcnNwLnJlcXVlc3RfbGltaXRfZGVsdGEgPgorCSAgICAobWF4X3JlcXVlc3RzIC0gMikpCisJCWV2dF9zdHJ1Y3QtPnhmZXJfaXUtPnNycC5sb2dpbl9yc3AucmVxdWVzdF9saW1pdF9kZWx0YSA9CisJCSAgICBtYXhfcmVxdWVzdHMgLSAyOworCisJLyogTm93IHdlIGtub3cgd2hhdCB0aGUgcmVhbCByZXF1ZXN0LWxpbWl0IGlzICovCisJYXRvbWljX3NldCgmaG9zdGRhdGEtPnJlcXVlc3RfbGltaXQsCisJCSAgIGV2dF9zdHJ1Y3QtPnhmZXJfaXUtPnNycC5sb2dpbl9yc3AucmVxdWVzdF9saW1pdF9kZWx0YSk7CisKKwlob3N0ZGF0YS0+aG9zdC0+Y2FuX3F1ZXVlID0KKwkgICAgZXZ0X3N0cnVjdC0+eGZlcl9pdS0+c3JwLmxvZ2luX3JzcC5yZXF1ZXN0X2xpbWl0X2RlbHRhIC0gMjsKKworCWlmIChob3N0ZGF0YS0+aG9zdC0+Y2FuX3F1ZXVlIDwgMSkgeworCQlwcmludGsoS0VSTl9FUlIgImlibXZzY3NpOiBJbnZhbGlkIHJlcXVlc3RfbGltaXRfZGVsdGFcbiIpOworCQlyZXR1cm47CisJfQorCisJc2VuZF9tYWRfYWRhcHRlcl9pbmZvKGhvc3RkYXRhKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogc2VuZF9zcnBfbG9naW46IC0gU2VuZHMgdGhlIHNycCBsb2dpbgorICogQGhvc3RkYXRhOglpYm12c2NzaV9ob3N0X2RhdGEgb2YgaG9zdAorICogCisgKiBSZXR1cm5zIHplcm8gaWYgc3VjY2Vzc2Z1bC4KKyovCitzdGF0aWMgaW50IHNlbmRfc3JwX2xvZ2luKHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhKQoreworCWludCByYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzcnBfbG9naW5fcmVxICpsb2dpbjsKKwlzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqZXZ0X3N0cnVjdCA9IGdldF9ldmVudF9zdHJ1Y3QoJmhvc3RkYXRhLT5wb29sKTsKKwlpZiAoIWV2dF9zdHJ1Y3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaWJtdnNjc2k6IGNvdWxkbid0IGFsbG9jYXRlIGFuIGV2ZW50IGZvciBsb2dpbiByZXEhXG4iKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlpbml0X2V2ZW50X3N0cnVjdChldnRfc3RydWN0LAorCQkJICBsb2dpbl9yc3AsCisJCQkgIFZJT1NSUF9TUlBfRk9STUFULAorCQkJICBpbml0X3RpbWVvdXQgKiBIWik7CisKKwlsb2dpbiA9ICZldnRfc3RydWN0LT5pdS5zcnAubG9naW5fcmVxOworCWxvZ2luLT50eXBlID0gU1JQX0xPR0lOX1JFUV9UWVBFOworCWxvZ2luLT5tYXhfcmVxdWVzdGVkX2luaXRpYXRvcl90b190YXJnZXRfaXVsZW4gPSBzaXplb2YodW5pb24gc3JwX2l1KTsKKwlsb2dpbi0+cmVxdWlyZWRfYnVmZmVyX2Zvcm1hdHMgPSAweDAwMDY7CisJCisJLyogU3RhcnQgb3V0IHdpdGggYSByZXF1ZXN0IGxpbWl0IG9mIDEsIHNpbmNlIHRoaXMgaXMgbmVnb3RpYXRlZCBpbgorCSAqIHRoZSBsb2dpbiByZXF1ZXN0IHdlIGFyZSBqdXN0IHNlbmRpbmcKKwkgKi8KKwlhdG9taWNfc2V0KCZob3N0ZGF0YS0+cmVxdWVzdF9saW1pdCwgMSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmMgPSBpYm12c2NzaV9zZW5kX3NycF9ldmVudChldnRfc3RydWN0LCBob3N0ZGF0YSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworfTsKKworLyoqCisgKiBzeW5jX2NvbXBsZXRpb246IFNpZ25hbCB0aGF0IGEgc3luY2hyb25vdXMgY29tbWFuZCBoYXMgY29tcGxldGVkCisgKiBOb3RlIHRoYXQgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhpcyBjYWxsLCB0aGUgZXZ0X3N0cnVjdCBpcyBmcmVlZC4KKyAqIHRoZSBjYWxsZXIgd2FpdGluZyBvbiB0aGlzIGNvbXBsZXRpb24gc2hvdWxkbid0IHRvdWNoIHRoZSBldnRfc3RydWN0CisgKiBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgc3luY19jb21wbGV0aW9uKHN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICpldnRfc3RydWN0KQoreworCS8qIGNvcHkgdGhlIHJlc3BvbnNlIGJhY2sgKi8KKwlpZiAoZXZ0X3N0cnVjdC0+c3luY19zcnApCisJCSpldnRfc3RydWN0LT5zeW5jX3NycCA9ICpldnRfc3RydWN0LT54ZmVyX2l1OworCQorCWNvbXBsZXRlKCZldnRfc3RydWN0LT5jb21wKTsKK30KKworLyoqCisgKiBpYm12c2NzaV9hYm9ydDogQWJvcnQgYSBjb21tYW5kLi4uZnJvbSBzY3NpIGhvc3QgdGVtcGxhdGUKKyAqIHNlbmQgdGhpcyBvdmVyIHRvIHRoZSBzZXJ2ZXIgYW5kIHdhaXQgc3luY2hyb25vdXNseSBmb3IgdGhlIHJlc3BvbnNlCisgKi8KK3N0YXRpYyBpbnQgaWJtdnNjc2lfZWhfYWJvcnRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEgPQorCSAgICAoc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3Qgc3JwX3Rza19tZ210ICp0c2tfbWdtdDsKKwlzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqZXZ0OworCXN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICp0bXBfZXZ0LCAqZm91bmRfZXZ0OworCXVuaW9uIHZpb3NycF9pdSBzcnBfcnNwOworCWludCByc3BfcmM7CisJdTE2IGx1biA9IGx1bl9mcm9tX2RldihjbWQtPmRldmljZSk7CisKKwkvKiBGaXJzdCwgZmluZCB0aGlzIGNvbW1hbmQgaW4gb3VyIHNlbnQgbGlzdCBzbyB3ZSBjYW4gZmlndXJlCisJICogb3V0IHRoZSBjb3JyZWN0IHRhZworCSAqLworCWZvdW5kX2V2dCA9IE5VTEw7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfZXZ0LCAmaG9zdGRhdGEtPnNlbnQsIGxpc3QpIHsKKwkJaWYgKHRtcF9ldnQtPmNtbmQgPT0gY21kKSB7CisJCQlmb3VuZF9ldnQgPSB0bXBfZXZ0OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kX2V2dCkgCisJCXJldHVybiBGQUlMRUQ7CisKKwlldnQgPSBnZXRfZXZlbnRfc3RydWN0KCZob3N0ZGF0YS0+cG9vbCk7CisJaWYgKGV2dCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWJtdnNjc2k6IGZhaWxlZCB0byBhbGxvY2F0ZSBhYm9ydCBldmVudFxuIik7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCQorCWluaXRfZXZlbnRfc3RydWN0KGV2dCwKKwkJCSAgc3luY19jb21wbGV0aW9uLAorCQkJICBWSU9TUlBfU1JQX0ZPUk1BVCwKKwkJCSAgaW5pdF90aW1lb3V0ICogSFopOworCisJdHNrX21nbXQgPSAmZXZ0LT5pdS5zcnAudHNrX21nbXQ7CisJCisJLyogU2V0IHVwIGFuIGFib3J0IFNSUCBjb21tYW5kICovCisJbWVtc2V0KHRza19tZ210LCAweDAwLCBzaXplb2YoKnRza19tZ210KSk7CisJdHNrX21nbXQtPnR5cGUgPSBTUlBfVFNLX01HTVRfVFlQRTsKKwl0c2tfbWdtdC0+bHVuID0gKCh1NjQpIGx1bikgPDwgNDg7CisJdHNrX21nbXQtPnRhc2tfbWdtdF9mbGFncyA9IDB4MDE7CS8qIEFCT1JUIFRBU0sgKi8KKwl0c2tfbWdtdC0+bWFuYWdlZF90YXNrX3RhZyA9ICh1NjQpIGZvdW5kX2V2dDsKKworCXByaW50ayhLRVJOX0lORk8gImlibXZzY3NpOiBhYm9ydGluZyBjb21tYW5kLiBsdW4gMHglbHgsIHRhZyAweCVseFxuIiwKKwkgICAgICAgdHNrX21nbXQtPmx1biwgdHNrX21nbXQtPm1hbmFnZWRfdGFza190YWcpOworCisJZXZ0LT5zeW5jX3NycCA9ICZzcnBfcnNwOworCWluaXRfY29tcGxldGlvbigmZXZ0LT5jb21wKTsKKwlpZiAoaWJtdnNjc2lfc2VuZF9zcnBfZXZlbnQoZXZ0LCBob3N0ZGF0YSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgImlibXZzY3NpOiBmYWlsZWQgdG8gc2VuZCBhYm9ydCgpIGV2ZW50XG4iKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoaG9zdGRhdGEtPmhvc3QtPmhvc3RfbG9jayk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmZXZ0LT5jb21wKTsKKwlzcGluX2xvY2tfaXJxKGhvc3RkYXRhLT5ob3N0LT5ob3N0X2xvY2spOworCisJLyogbWFrZSBzdXJlIHdlIGdvdCBhIGdvb2QgcmVzcG9uc2UgKi8KKwlpZiAodW5saWtlbHkoc3JwX3JzcC5zcnAuZ2VuZXJpYy50eXBlICE9IFNSUF9SU1BfVFlQRSkpIHsKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCQkgICAgICAgImlibXZzY3NpOiBhYm9ydCBiYWQgU1JQIFJTUCB0eXBlICVkXG4iLAorCQkJICAgICAgIHNycF9yc3Auc3JwLmdlbmVyaWMudHlwZSk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJaWYgKHNycF9yc3Auc3JwLnJzcC5yc3B2YWxpZCkKKwkJcnNwX3JjID0gKigoaW50ICopc3JwX3JzcC5zcnAucnNwLnNlbnNlX2FuZF9yZXNwb25zZV9kYXRhKTsKKwllbHNlCisJCXJzcF9yYyA9IHNycF9yc3Auc3JwLnJzcC5zdGF0dXM7CisKKwlpZiAocnNwX3JjKSB7CisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIAorCQkgICAgICAgImlibXZzY3NpOiBhYm9ydCBjb2RlICVkIGZvciB0YXNrIHRhZyAweCVseFxuIiwKKwkJCSAgICAgICByc3BfcmMsCisJCQkgICAgICAgdHNrX21nbXQtPm1hbmFnZWRfdGFza190YWcpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCS8qIEJlY2F1c2Ugd2UgZHJvcHBlZCB0aGUgc3BpbmxvY2sgYWJvdmUsIGl0J3MgcG9zc2libGUKKwkgKiBUaGUgZXZlbnQgaXMgbm8gbG9uZ2VyIGluIG91ciBsaXN0LiAgTWFrZSBzdXJlIGl0IGRpZG4ndAorCSAqIGNvbXBsZXRlIHdoaWxlIHdlIHdlcmUgYWJvcnRpbmcKKwkgKi8KKwlmb3VuZF9ldnQgPSBOVUxMOworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX2V2dCwgJmhvc3RkYXRhLT5zZW50LCBsaXN0KSB7CisJCWlmICh0bXBfZXZ0LT5jbW5kID09IGNtZCkgeworCQkJZm91bmRfZXZ0ID0gdG1wX2V2dDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGZvdW5kX2V2dCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJpYm12c2NzaTogYWJvcnRlZCB0YXNrIHRhZyAweCVseCBjb21wbGV0ZWRcbiIsCisJCSAgICAgICB0c2tfbWdtdC0+bWFuYWdlZF90YXNrX3RhZyk7CisJCXJldHVybiBTVUNDRVNTOworCX0KKworCXByaW50ayhLRVJOX0lORk8KKwkgICAgICAgImlibXZzY3NpOiBzdWNjZXNzZnVsbHkgYWJvcnRlZCB0YXNrIHRhZyAweCVseFxuIiwKKwkgICAgICAgdHNrX21nbXQtPm1hbmFnZWRfdGFza190YWcpOworCisJY21kLT5yZXN1bHQgPSAoRElEX0FCT1JUIDw8IDE2KTsKKwlsaXN0X2RlbCgmZm91bmRfZXZ0LT5saXN0KTsKKwl1bm1hcF9jbWRfZGF0YSgmZm91bmRfZXZ0LT5pdS5zcnAuY21kLCBmb3VuZF9ldnQtPmhvc3RkYXRhLT5kZXYpOworCWZyZWVfZXZlbnRfc3RydWN0KCZmb3VuZF9ldnQtPmhvc3RkYXRhLT5wb29sLCBmb3VuZF9ldnQpOworCWF0b21pY19pbmMoJmhvc3RkYXRhLT5yZXF1ZXN0X2xpbWl0KTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgKiBpYm12c2NzaV9laF9kZXZpY2VfcmVzZXRfaGFuZGxlcjogUmVzZXQgYSBzaW5nbGUgTFVOLi4uZnJvbSBzY3NpIGhvc3QgCisgKiB0ZW1wbGF0ZSBzZW5kIHRoaXMgb3ZlciB0byB0aGUgc2VydmVyIGFuZCB3YWl0IHN5bmNocm9ub3VzbHkgZm9yIHRoZSAKKyAqIHJlc3BvbnNlCisgKi8KK3N0YXRpYyBpbnQgaWJtdnNjc2lfZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhID0KKwkgICAgKHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlzdHJ1Y3Qgc3JwX3Rza19tZ210ICp0c2tfbWdtdDsKKwlzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqZXZ0OworCXN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICp0bXBfZXZ0LCAqcG9zOworCXVuaW9uIHZpb3NycF9pdSBzcnBfcnNwOworCWludCByc3BfcmM7CisJdTE2IGx1biA9IGx1bl9mcm9tX2RldihjbWQtPmRldmljZSk7CisKKwlldnQgPSBnZXRfZXZlbnRfc3RydWN0KCZob3N0ZGF0YS0+cG9vbCk7CisJaWYgKGV2dCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWJtdnNjc2k6IGZhaWxlZCB0byBhbGxvY2F0ZSByZXNldCBldmVudFxuIik7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCQorCWluaXRfZXZlbnRfc3RydWN0KGV2dCwKKwkJCSAgc3luY19jb21wbGV0aW9uLAorCQkJICBWSU9TUlBfU1JQX0ZPUk1BVCwKKwkJCSAgaW5pdF90aW1lb3V0ICogSFopOworCisJdHNrX21nbXQgPSAmZXZ0LT5pdS5zcnAudHNrX21nbXQ7CisKKwkvKiBTZXQgdXAgYSBsdW4gcmVzZXQgU1JQIGNvbW1hbmQgKi8KKwltZW1zZXQodHNrX21nbXQsIDB4MDAsIHNpemVvZigqdHNrX21nbXQpKTsKKwl0c2tfbWdtdC0+dHlwZSA9IFNSUF9UU0tfTUdNVF9UWVBFOworCXRza19tZ210LT5sdW4gPSAoKHU2NCkgbHVuKSA8PCA0ODsKKwl0c2tfbWdtdC0+dGFza19tZ210X2ZsYWdzID0gMHgwODsJLyogTFVOIFJFU0VUICovCisKKwlwcmludGsoS0VSTl9JTkZPICJpYm12c2NzaTogcmVzZXR0aW5nIGRldmljZS4gbHVuIDB4JWx4XG4iLAorCSAgICAgICB0c2tfbWdtdC0+bHVuKTsKKworCWV2dC0+c3luY19zcnAgPSAmc3JwX3JzcDsKKwlpbml0X2NvbXBsZXRpb24oJmV2dC0+Y29tcCk7CisJaWYgKGlibXZzY3NpX3NlbmRfc3JwX2V2ZW50KGV2dCwgaG9zdGRhdGEpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpYm12c2NzaTogZmFpbGVkIHRvIHNlbmQgcmVzZXQgZXZlbnRcbiIpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCXNwaW5fdW5sb2NrX2lycShob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZldnQtPmNvbXApOworCXNwaW5fbG9ja19pcnEoaG9zdGRhdGEtPmhvc3QtPmhvc3RfbG9jayk7CisKKwkvKiBtYWtlIHN1cmUgd2UgZ290IGEgZ29vZCByZXNwb25zZSAqLworCWlmICh1bmxpa2VseShzcnBfcnNwLnNycC5nZW5lcmljLnR5cGUgIT0gU1JQX1JTUF9UWVBFKSkgeworCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCSAgICAgICAiaWJtdnNjc2k6IHJlc2V0IGJhZCBTUlAgUlNQIHR5cGUgJWRcbiIsCisJCQkgICAgICAgc3JwX3JzcC5zcnAuZ2VuZXJpYy50eXBlKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlpZiAoc3JwX3JzcC5zcnAucnNwLnJzcHZhbGlkKQorCQlyc3BfcmMgPSAqKChpbnQgKilzcnBfcnNwLnNycC5yc3Auc2Vuc2VfYW5kX3Jlc3BvbnNlX2RhdGEpOworCWVsc2UKKwkJcnNwX3JjID0gc3JwX3JzcC5zcnAucnNwLnN0YXR1czsKKworCWlmIChyc3BfcmMpIHsKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCQkgICAgICAgImlibXZzY3NpOiByZXNldCBjb2RlICVkIGZvciB0YXNrIHRhZyAweCVseFxuIiwKKwkJICAgICAgIHJzcF9yYywKKwkJCSAgICAgICB0c2tfbWdtdC0+bWFuYWdlZF90YXNrX3RhZyk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJLyogV2UgbmVlZCB0byBmaW5kIGFsbCBjb21tYW5kcyBmb3IgdGhpcyBMVU4gdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbgorCSAqIHJlc3BvbmRlZCB0bywgYW5kIGZhaWwgdGhlbSB3aXRoIERJRF9SRVNFVAorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0bXBfZXZ0LCBwb3MsICZob3N0ZGF0YS0+c2VudCwgbGlzdCkgeworCQlpZiAoKHRtcF9ldnQtPmNtbmQpICYmICh0bXBfZXZ0LT5jbW5kLT5kZXZpY2UgPT0gY21kLT5kZXZpY2UpKSB7CisJCQlpZiAodG1wX2V2dC0+Y21uZCkKKwkJCQl0bXBfZXZ0LT5jbW5kLT5yZXN1bHQgPSAoRElEX1JFU0VUIDw8IDE2KTsKKwkJCWxpc3RfZGVsKCZ0bXBfZXZ0LT5saXN0KTsKKwkJCXVubWFwX2NtZF9kYXRhKCZ0bXBfZXZ0LT5pdS5zcnAuY21kLCB0bXBfZXZ0LT5ob3N0ZGF0YS0+ZGV2KTsKKwkJCWZyZWVfZXZlbnRfc3RydWN0KCZ0bXBfZXZ0LT5ob3N0ZGF0YS0+cG9vbCwKKwkJCQkJCSAgIHRtcF9ldnQpOworCQkJYXRvbWljX2luYygmaG9zdGRhdGEtPnJlcXVlc3RfbGltaXQpOworCQkJaWYgKHRtcF9ldnQtPmNtbmRfZG9uZSkKKwkJCQl0bXBfZXZ0LT5jbW5kX2RvbmUodG1wX2V2dC0+Y21uZCk7CisJCQllbHNlIGlmICh0bXBfZXZ0LT5kb25lKQorCQkJCXRtcF9ldnQtPmRvbmUodG1wX2V2dCk7CisJCX0KKwl9CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICogcHVyZ2VfcmVxdWVzdHM6IE91ciB2aXJ0dWFsIGFkYXB0ZXIganVzdCBzaHV0IGRvd24uICBwdXJnZSBhbnkgc2VudCByZXF1ZXN0cworICogQGhvc3RkYXRhOiAgICB0aGUgYWRhcHRlcgorICovCitzdGF0aWMgdm9pZCBwdXJnZV9yZXF1ZXN0cyhzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSkKK3sKKwlzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqdG1wX2V2dCwgKnBvczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdGRhdGEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0bXBfZXZ0LCBwb3MsICZob3N0ZGF0YS0+c2VudCwgbGlzdCkgeworCQlsaXN0X2RlbCgmdG1wX2V2dC0+bGlzdCk7CisJCWlmICh0bXBfZXZ0LT5jbW5kKSB7CisJCQl0bXBfZXZ0LT5jbW5kLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJCXVubWFwX2NtZF9kYXRhKCZ0bXBfZXZ0LT5pdS5zcnAuY21kLCAKKwkJCQkgICAgICAgdG1wX2V2dC0+aG9zdGRhdGEtPmRldik7CisJCQlpZiAodG1wX2V2dC0+Y21uZF9kb25lKQorCQkJCXRtcF9ldnQtPmNtbmRfZG9uZSh0bXBfZXZ0LT5jbW5kKTsKKwkJfSBlbHNlIHsKKwkJCWlmICh0bXBfZXZ0LT5kb25lKSB7CisJCQkJdG1wX2V2dC0+ZG9uZSh0bXBfZXZ0KTsKKwkJCX0KKwkJfQorCQlmcmVlX2V2ZW50X3N0cnVjdCgmdG1wX2V2dC0+aG9zdGRhdGEtPnBvb2wsIHRtcF9ldnQpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3RkYXRhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBpYm12c2NzaV9oYW5kbGVfY3JxOiAtIEhhbmRsZXMgYW5kIGZyZWVzIHJlY2VpdmVkIGV2ZW50cyBpbiB0aGUgQ1JRCisgKiBAY3JxOglDb21tYW5kL1Jlc3BvbnNlIHF1ZXVlCisgKiBAaG9zdGRhdGE6CWlibXZzY3NpX2hvc3RfZGF0YSBvZiBob3N0CisgKgorKi8KK3ZvaWQgaWJtdnNjc2lfaGFuZGxlX2NycShzdHJ1Y3Qgdmlvc3JwX2NycSAqY3JxLAorCQkJIHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKmV2dF9zdHJ1Y3QgPQorCSAgICAoc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKiljcnEtPklVX2RhdGFfcHRyOworCXN3aXRjaCAoY3JxLT52YWxpZCkgeworCWNhc2UgMHhDMDoJCS8qIGluaXRpYWxpemF0aW9uICovCisJCXN3aXRjaCAoY3JxLT5mb3JtYXQpIHsKKwkJY2FzZSAweDAxOgkvKiBJbml0aWFsaXphdGlvbiBtZXNzYWdlICovCisJCQlwcmludGsoS0VSTl9JTkZPICJpYm12c2NzaTogcGFydG5lciBpbml0aWFsaXplZFxuIik7CisJCQkvKiBTZW5kIGJhY2sgYSByZXNwb25zZSAqLworCQkJaWYgKGlibXZzY3NpX3NlbmRfY3JxKGhvc3RkYXRhLAorCQkJCQkgICAgICAweEMwMDIwMDAwMDAwMDAwMDBMTCwgMCkgPT0gMCkgeworCQkJCS8qIE5vdyBsb2dpbiAqLworCQkJCXNlbmRfc3JwX2xvZ2luKGhvc3RkYXRhKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICJpYm12c2NzaTogVW5hYmxlIHRvIHNlbmQgaW5pdCByc3BcbiIpOworCQkJfQorCisJCQlicmVhazsKKwkJY2FzZSAweDAyOgkvKiBJbml0aWFsaXphdGlvbiByZXNwb25zZSAqLworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICJpYm12c2NzaTogcGFydG5lciBpbml0aWFsaXphdGlvbiBjb21wbGV0ZVxuIik7CisKKwkJCS8qIE5vdyBsb2dpbiAqLworCQkJc2VuZF9zcnBfbG9naW4oaG9zdGRhdGEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgImlibXZzY3NpOiB1bmtub3duIGNycSBtZXNzYWdlIHR5cGVcbiIpOworCQl9CisJCXJldHVybjsKKwljYXNlIDB4RkY6CQkvKiBIeXBlcnZpc29yIHRlbGxpbmcgdXMgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkICovCisJCXByaW50ayhLRVJOX0lORk8gImlibXZzY3NpOiBWaXJ0dWFsIGFkYXB0ZXIgZmFpbGVkIVxuIik7CisKKwkJYXRvbWljX3NldCgmaG9zdGRhdGEtPnJlcXVlc3RfbGltaXQsIC0xKTsKKwkJcHVyZ2VfcmVxdWVzdHMoaG9zdGRhdGEpOworCQlpYm12c2NzaV9yZXNldF9jcnFfcXVldWUoJmhvc3RkYXRhLT5xdWV1ZSwgaG9zdGRhdGEpOworCQlyZXR1cm47CisJY2FzZSAweDgwOgkJLyogcmVhbCBwYXlsb2FkICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImlibXZzY3NpOiBnb3QgYW4gaW52YWxpZCBtZXNzYWdlIHR5cGUgMHglMDJ4XG4iLAorCQkgICAgICAgY3JxLT52YWxpZCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBUaGUgb25seSBraW5kIG9mIHBheWxvYWQgQ1JRcyB3ZSBzaG91bGQgZ2V0IGFyZSByZXNwb25zZXMgdG8KKwkgKiB0aGluZ3Mgd2Ugc2VuZC4gTWFrZSBzdXJlIHRoaXMgcmVzcG9uc2UgaXMgdG8gc29tZXRoaW5nIHdlCisJICogYWN0dWFsbHkgc2VudAorCSAqLworCWlmICghdmFsaWRfZXZlbnRfc3RydWN0KCZob3N0ZGF0YS0+cG9vbCwgZXZ0X3N0cnVjdCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaWJtdnNjc2k6IHJldHVybmVkIGNvcnJlbGF0aW9uX3Rva2VuIDB4JXAgaXMgaW52YWxpZCFcbiIsCisJCSAgICAgICAodm9pZCAqKWNycS0+SVVfZGF0YV9wdHIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZldnRfc3RydWN0LT5mcmVlKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJpYm12c2NzaTogcmVjZWl2ZWQgZHVwbGljYXRlICBjb3JyZWxhdGlvbl90b2tlbiAweCVwIVxuIiwKKwkJICAgICAgICh2b2lkICopY3JxLT5JVV9kYXRhX3B0cik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY3JxLT5mb3JtYXQgPT0gVklPU1JQX1NSUF9GT1JNQVQpCisJCWF0b21pY19hZGQoZXZ0X3N0cnVjdC0+eGZlcl9pdS0+c3JwLnJzcC5yZXF1ZXN0X2xpbWl0X2RlbHRhLAorCQkJICAgJmhvc3RkYXRhLT5yZXF1ZXN0X2xpbWl0KTsKKworCWlmIChldnRfc3RydWN0LT5kb25lKQorCQlldnRfc3RydWN0LT5kb25lKGV2dF9zdHJ1Y3QpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaWJtdnNjc2k6IHJldHVybmVkIGRvbmUoKSBpcyBOVUxMOyBub3QgcnVubmluZyBpdCFcbiIpOworCisJLyoKKwkgKiBMb2NrIHRoZSBob3N0X2xvY2sgYmVmb3JlIG1lc3Npbmcgd2l0aCB0aGVzZSBzdHJ1Y3R1cmVzLCBzaW5jZSB3ZQorCSAqIGFyZSBydW5uaW5nIGluIGEgdGFzayBjb250ZXh0CisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoZXZ0X3N0cnVjdC0+aG9zdGRhdGEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCZldnRfc3RydWN0LT5saXN0KTsKKwlmcmVlX2V2ZW50X3N0cnVjdCgmZXZ0X3N0cnVjdC0+aG9zdGRhdGEtPnBvb2wsIGV2dF9zdHJ1Y3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZXZ0X3N0cnVjdC0+aG9zdGRhdGEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIGlibXZzY3NpX2dldF9ob3N0X2NvbmZpZzogU2VuZCB0aGUgY29tbWFuZCB0byB0aGUgc2VydmVyIHRvIGdldCBob3N0CisgKiBjb25maWd1cmF0aW9uIGRhdGEuICBUaGUgZGF0YSBpcyBvcGFxdWUgdG8gdXMuCisgKi8KK3N0YXRpYyBpbnQgaWJtdnNjc2lfZG9faG9zdF9jb25maWcoc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEsCisJCQkJICAgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCB2aW9zcnBfaG9zdF9jb25maWcgKmhvc3RfY29uZmlnOworCXN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICpldnRfc3RydWN0OworCWludCByYzsKKworCWV2dF9zdHJ1Y3QgPSBnZXRfZXZlbnRfc3RydWN0KCZob3N0ZGF0YS0+cG9vbCk7CisJaWYgKCFldnRfc3RydWN0KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImlibXZzY3NpOiBjb3VsZCd0IGFsbG9jYXRlIGV2ZW50IGZvciBIT1NUX0NPTkZJRyFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaW5pdF9ldmVudF9zdHJ1Y3QoZXZ0X3N0cnVjdCwKKwkJCSAgc3luY19jb21wbGV0aW9uLAorCQkJICBWSU9TUlBfTUFEX0ZPUk1BVCwKKwkJCSAgaW5pdF90aW1lb3V0ICogSFopOworCisJaG9zdF9jb25maWcgPSAmZXZ0X3N0cnVjdC0+aXUubWFkLmhvc3RfY29uZmlnOworCisJLyogU2V0IHVwIGEgbHVuIHJlc2V0IFNSUCBjb21tYW5kICovCisJbWVtc2V0KGhvc3RfY29uZmlnLCAweDAwLCBzaXplb2YoKmhvc3RfY29uZmlnKSk7CisJaG9zdF9jb25maWctPmNvbW1vbi50eXBlID0gVklPU1JQX0hPU1RfQ09ORklHX1RZUEU7CisJaG9zdF9jb25maWctPmNvbW1vbi5sZW5ndGggPSBsZW5ndGg7CisJaG9zdF9jb25maWctPmJ1ZmZlciA9IGRtYV9tYXBfc2luZ2xlKGhvc3RkYXRhLT5kZXYsIGJ1ZmZlciwgbGVuZ3RoLAorCQkJCQkgICAgRE1BX0JJRElSRUNUSU9OQUwpOworCisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGhvc3RfY29uZmlnLT5idWZmZXIpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImlibXZzY3NpOiBkbWFfbWFwcGluZyBlcnJvciAiICJnZXR0aW5nIGhvc3QgY29uZmlnXG4iKTsKKwkJZnJlZV9ldmVudF9zdHJ1Y3QoJmhvc3RkYXRhLT5wb29sLCBldnRfc3RydWN0KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWluaXRfY29tcGxldGlvbigmZXZ0X3N0cnVjdC0+Y29tcCk7CisJcmMgPSBpYm12c2NzaV9zZW5kX3NycF9ldmVudChldnRfc3RydWN0LCBob3N0ZGF0YSk7CisJaWYgKHJjID09IDApIHsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmZXZ0X3N0cnVjdC0+Y29tcCk7CisJCWRtYV91bm1hcF9zaW5nbGUoaG9zdGRhdGEtPmRldiwgaG9zdF9jb25maWctPmJ1ZmZlciwKKwkJCQkgbGVuZ3RoLCBETUFfQklESVJFQ1RJT05BTCk7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHN5c2ZzIGF0dHJpYnV0ZXMKKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19ob3N0X3NycF92ZXJzaW9uKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSA9CisJICAgIChzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICopc2hvc3QtPmhvc3RkYXRhOworCWludCBsZW47CisKKwlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLAorCQkgICAgICAgaG9zdGRhdGEtPm1hZGFwdGVyX2luZm8uc3JwX3ZlcnNpb24pOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBpYm12c2NzaV9ob3N0X3NycF92ZXJzaW9uID0geworCS5hdHRyID0geworCQkgLm5hbWUgPSAic3JwX3ZlcnNpb24iLAorCQkgLm1vZGUgPSBTX0lSVUdPLAorCQkgfSwKKwkuc2hvdyA9IHNob3dfaG9zdF9zcnBfdmVyc2lvbiwKK307CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaG9zdF9wYXJ0aXRpb25fbmFtZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsCisJCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGNsYXNzX2Rldik7CisJc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEgPQorCSAgICAoc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqKXNob3N0LT5ob3N0ZGF0YTsKKwlpbnQgbGVuOworCisJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwKKwkJICAgICAgIGhvc3RkYXRhLT5tYWRhcHRlcl9pbmZvLnBhcnRpdGlvbl9uYW1lKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgaWJtdnNjc2lfaG9zdF9wYXJ0aXRpb25fbmFtZSA9IHsKKwkuYXR0ciA9IHsKKwkJIC5uYW1lID0gInBhcnRpdGlvbl9uYW1lIiwKKwkJIC5tb2RlID0gU19JUlVHTywKKwkJIH0sCisJLnNob3cgPSBzaG93X2hvc3RfcGFydGl0aW9uX25hbWUsCit9OworCitzdGF0aWMgc3NpemVfdCBzaG93X2hvc3RfcGFydGl0aW9uX251bWJlcihzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsCisJCQkJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSA9CisJICAgIChzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICopc2hvc3QtPmhvc3RkYXRhOworCWludCBsZW47CisKKwlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLAorCQkgICAgICAgaG9zdGRhdGEtPm1hZGFwdGVyX2luZm8ucGFydGl0aW9uX251bWJlcik7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlIGlibXZzY3NpX2hvc3RfcGFydGl0aW9uX251bWJlciA9IHsKKwkuYXR0ciA9IHsKKwkJIC5uYW1lID0gInBhcnRpdGlvbl9udW1iZXIiLAorCQkgLm1vZGUgPSBTX0lSVUdPLAorCQkgfSwKKwkuc2hvdyA9IHNob3dfaG9zdF9wYXJ0aXRpb25fbnVtYmVyLAorfTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19ob3N0X21hZF92ZXJzaW9uKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSA9CisJICAgIChzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICopc2hvc3QtPmhvc3RkYXRhOworCWludCBsZW47CisKKwlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLAorCQkgICAgICAgaG9zdGRhdGEtPm1hZGFwdGVyX2luZm8ubWFkX3ZlcnNpb24pOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBpYm12c2NzaV9ob3N0X21hZF92ZXJzaW9uID0geworCS5hdHRyID0geworCQkgLm5hbWUgPSAibWFkX3ZlcnNpb24iLAorCQkgLm1vZGUgPSBTX0lSVUdPLAorCQkgfSwKKwkuc2hvdyA9IHNob3dfaG9zdF9tYWRfdmVyc2lvbiwKK307CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaG9zdF9vc190eXBlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSA9CisJICAgIChzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICopc2hvc3QtPmhvc3RkYXRhOworCWludCBsZW47CisKKwlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBob3N0ZGF0YS0+bWFkYXB0ZXJfaW5mby5vc190eXBlKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgaWJtdnNjc2lfaG9zdF9vc190eXBlID0geworCS5hdHRyID0geworCQkgLm5hbWUgPSAib3NfdHlwZSIsCisJCSAubW9kZSA9IFNfSVJVR08sCisJCSB9LAorCS5zaG93ID0gc2hvd19ob3N0X29zX3R5cGUsCit9OworCitzdGF0aWMgc3NpemVfdCBzaG93X2hvc3RfY29uZmlnKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSA9CisJICAgIChzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICopc2hvc3QtPmhvc3RkYXRhOworCisJLyogcmV0dXJucyBudWxsLXRlcm1pbmF0ZWQgaG9zdCBjb25maWcgZGF0YSAqLworCWlmIChpYm12c2NzaV9kb19ob3N0X2NvbmZpZyhob3N0ZGF0YSwgYnVmLCBQQUdFX1NJWkUpID09IDApCisJCXJldHVybiBzdHJsZW4oYnVmKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgaWJtdnNjc2lfaG9zdF9jb25maWcgPSB7CisJLmF0dHIgPSB7CisJCSAubmFtZSA9ICJjb25maWciLAorCQkgLm1vZGUgPSBTX0lSVUdPLAorCQkgfSwKKwkuc2hvdyA9IHNob3dfaG9zdF9jb25maWcsCit9OworCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKmlibXZzY3NpX2F0dHJzW10gPSB7CisJJmlibXZzY3NpX2hvc3Rfc3JwX3ZlcnNpb24sCisJJmlibXZzY3NpX2hvc3RfcGFydGl0aW9uX25hbWUsCisJJmlibXZzY3NpX2hvc3RfcGFydGl0aW9uX251bWJlciwKKwkmaWJtdnNjc2lfaG9zdF9tYWRfdmVyc2lvbiwKKwkmaWJtdnNjc2lfaG9zdF9vc190eXBlLAorCSZpYm12c2NzaV9ob3N0X2NvbmZpZywKKwlOVUxMCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNDU0kgZHJpdmVyIHJlZ2lzdHJhdGlvbgorICovCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAorCS5uYW1lID0gIklCTSBQT1dFUiBWaXJ0dWFsIFNDU0kgQWRhcHRlciAiIElCTVZTQ1NJX1ZFUlNJT04sCisJLnByb2NfbmFtZSA9ICJpYm12c2NzaSIsCisJLnF1ZXVlY29tbWFuZCA9IGlibXZzY3NpX3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlciA9IGlibXZzY3NpX2VoX2Fib3J0X2hhbmRsZXIsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gaWJtdnNjc2lfZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIsCisJLmNtZF9wZXJfbHVuID0gMTYsCisJLmNhbl9xdWV1ZSA9IDEsCQkvKiBVcGRhdGVkIGFmdGVyIFNSUF9MT0dJTiAqLworCS50aGlzX2lkID0gLTEsCisJLnNnX3RhYmxlc2l6ZSA9IE1BWF9JTkRJUkVDVF9CVUZTLAorCS51c2VfY2x1c3RlcmluZyA9IEVOQUJMRV9DTFVTVEVSSU5HLAorCS5zaG9zdF9hdHRycyA9IGlibXZzY3NpX2F0dHJzLAorfTsKKworLyoqCisgKiBDYWxsZWQgYnkgYnVzIGNvZGUgZm9yIGVhY2ggYWRhcHRlcgorICovCitzdGF0aWMgaW50IGlibXZzY3NpX3Byb2JlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2LCBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGE7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmdmRldi0+ZGV2OworCXVuc2lnbmVkIGxvbmcgd2FpdF9zd2l0Y2ggPSAwOworCisJdmRldi0+ZGV2LmRyaXZlcl9kYXRhID0gTlVMTDsKKworCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmRyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKCpob3N0ZGF0YSkpOworCWlmICghaG9zdCkgeworCQlwcmludGsoS0VSTl9FUlIgImlibXZzY3NpOiBjb3VsZG4ndCBhbGxvY2F0ZSBob3N0IGRhdGFcbiIpOworCQlnb3RvIHNjc2lfaG9zdF9hbGxvY19mYWlsZWQ7CisJfQorCisJaG9zdGRhdGEgPSAoc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqKWhvc3QtPmhvc3RkYXRhOworCW1lbXNldChob3N0ZGF0YSwgMHgwMCwgc2l6ZW9mKCpob3N0ZGF0YSkpOworCUlOSVRfTElTVF9IRUFEKCZob3N0ZGF0YS0+c2VudCk7CisJaG9zdGRhdGEtPmhvc3QgPSBob3N0OworCWhvc3RkYXRhLT5kZXYgPSBkZXY7CisJYXRvbWljX3NldCgmaG9zdGRhdGEtPnJlcXVlc3RfbGltaXQsIC0xKTsKKwlob3N0ZGF0YS0+aG9zdC0+bWF4X3NlY3RvcnMgPSAzMiAqIDg7IC8qIGRlZmF1bHQgbWF4IEkvTyAzMiBwYWdlcyAqLworCisJaWYgKGlibXZzY3NpX2luaXRfY3JxX3F1ZXVlKCZob3N0ZGF0YS0+cXVldWUsIGhvc3RkYXRhLAorCQkJCSAgICBtYXhfcmVxdWVzdHMpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpYm12c2NzaTogY291bGRuJ3QgaW5pdGlhbGl6ZSBjcnFcbiIpOworCQlnb3RvIGluaXRfY3JxX2ZhaWxlZDsKKwl9CisJaWYgKGluaXRpYWxpemVfZXZlbnRfcG9vbCgmaG9zdGRhdGEtPnBvb2wsIG1heF9yZXF1ZXN0cywgaG9zdGRhdGEpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpYm12c2NzaTogY291bGRuJ3QgaW5pdGlhbGl6ZSBldmVudCBwb29sXG4iKTsKKwkJZ290byBpbml0X3Bvb2xfZmFpbGVkOworCX0KKworCWhvc3QtPm1heF9sdW4gPSA4OworCWhvc3QtPm1heF9pZCA9IG1heF9pZDsKKwlob3N0LT5tYXhfY2hhbm5lbCA9IG1heF9jaGFubmVsOworCisJaWYgKHNjc2lfYWRkX2hvc3QoaG9zdGRhdGEtPmhvc3QsIGhvc3RkYXRhLT5kZXYpKQorCQlnb3RvIGFkZF9ob3N0X2ZhaWxlZDsKKworCS8qIFRyeSB0byBzZW5kIGFuIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UuICBOb3RlIHRoYXQgdGhpcyBpcyBhbGxvd2VkCisJICogdG8gZmFpbCBpZiB0aGUgb3RoZXIgZW5kIGlzIG5vdCBhY2l2ZS4gIEluIHRoYXQgY2FzZSB3ZSBkb24ndAorCSAqIHdhbnQgdG8gc2NhbgorCSAqLworCWlmIChpYm12c2NzaV9zZW5kX2NycShob3N0ZGF0YSwgMHhDMDAxMDAwMDAwMDAwMDAwTEwsIDApID09IDApIHsKKwkJLyoKKwkJICogV2FpdCBhcm91bmQgbWF4IGluaXRfdGltZW91dCBzZWNzIGZvciB0aGUgYWRhcHRlciB0byBmaW5pc2gKKwkJICogaW5pdGlhbGl6aW5nLiBXaGVuIHdlIGFyZSBkb25lIGluaXRpYWxpemluZywgd2Ugd2lsbCBoYXZlIGEKKwkJICogdmFsaWQgcmVxdWVzdF9saW1pdC4gIFdlIGRvbid0IHdhbnQgTGludXggc2Nhbm5pbmcgYmVmb3JlCisJCSAqIHdlIGFyZSByZWFkeS4KKwkJICovCisJCWZvciAod2FpdF9zd2l0Y2ggPSBqaWZmaWVzICsgKGluaXRfdGltZW91dCAqIEhaKTsKKwkJICAgICB0aW1lX2JlZm9yZShqaWZmaWVzLCB3YWl0X3N3aXRjaCkgJiYKKwkJICAgICBhdG9taWNfcmVhZCgmaG9zdGRhdGEtPnJlcXVlc3RfbGltaXQpIDwgMjspIHsKKworCQkJbXNsZWVwKDEwKTsKKwkJfQorCisJCS8qIGlmIHdlIG5vdyBoYXZlIGEgdmFsaWQgcmVxdWVzdF9saW1pdCwgaW5pdGlhdGUgYSBzY2FuICovCisJCWlmIChhdG9taWNfcmVhZCgmaG9zdGRhdGEtPnJlcXVlc3RfbGltaXQpID4gMCkKKwkJCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCX0KKworCXZkZXYtPmRldi5kcml2ZXJfZGF0YSA9IGhvc3RkYXRhOworCXJldHVybiAwOworCisgICAgICBhZGRfaG9zdF9mYWlsZWQ6CisJcmVsZWFzZV9ldmVudF9wb29sKCZob3N0ZGF0YS0+cG9vbCwgaG9zdGRhdGEpOworICAgICAgaW5pdF9wb29sX2ZhaWxlZDoKKwlpYm12c2NzaV9yZWxlYXNlX2NycV9xdWV1ZSgmaG9zdGRhdGEtPnF1ZXVlLCBob3N0ZGF0YSwgbWF4X3JlcXVlc3RzKTsKKyAgICAgIGluaXRfY3JxX2ZhaWxlZDoKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworICAgICAgc2NzaV9ob3N0X2FsbG9jX2ZhaWxlZDoKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgaWJtdnNjc2lfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQoreworCXN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhID0gdmRldi0+ZGV2LmRyaXZlcl9kYXRhOworCXJlbGVhc2VfZXZlbnRfcG9vbCgmaG9zdGRhdGEtPnBvb2wsIGhvc3RkYXRhKTsKKwlpYm12c2NzaV9yZWxlYXNlX2NycV9xdWV1ZSgmaG9zdGRhdGEtPnF1ZXVlLCBob3N0ZGF0YSwKKwkJCQkgICBtYXhfcmVxdWVzdHMpOworCQorCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdGRhdGEtPmhvc3QpOworCXNjc2lfaG9zdF9wdXQoaG9zdGRhdGEtPmhvc3QpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWJtdnNjc2lfZGV2aWNlX3RhYmxlOiBVc2VkIGJ5IHZpby5jIHRvIG1hdGNoIGRldmljZXMgaW4gdGhlIGRldmljZSB0cmVlIHdlIAorICogc3VwcG9ydC4KKyAqLworc3RhdGljIHN0cnVjdCB2aW9fZGV2aWNlX2lkIGlibXZzY3NpX2RldmljZV90YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyJ2c2NzaSIsICJJQk0sdi1zY3NpIn0sCisJezAsfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh2aW8sIGlibXZzY3NpX2RldmljZV90YWJsZSk7CitzdGF0aWMgc3RydWN0IHZpb19kcml2ZXIgaWJtdnNjc2lfZHJpdmVyID0geworCS5uYW1lID0gImlibXZzY3NpIiwKKwkuaWRfdGFibGUgPSBpYm12c2NzaV9kZXZpY2VfdGFibGUsCisJLnByb2JlID0gaWJtdnNjc2lfcHJvYmUsCisJLnJlbW92ZSA9IGlibXZzY3NpX3JlbW92ZQorfTsKKworaW50IF9faW5pdCBpYm12c2NzaV9tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiB2aW9fcmVnaXN0ZXJfZHJpdmVyKCZpYm12c2NzaV9kcml2ZXIpOworfQorCit2b2lkIF9fZXhpdCBpYm12c2NzaV9tb2R1bGVfZXhpdCh2b2lkKQoreworCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmaWJtdnNjc2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaWJtdnNjc2lfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoaWJtdnNjc2lfbW9kdWxlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmggYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDMwYjcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogaWJtdnNjc2kuaAorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMTk5NCwgMjAwMworICogQXV0aG9yczogQ29saW4gRGVWaWxiaXNzIChkZXZpbGJpc0B1cy5pYm0uY29tKQorICogICAgICAgICAgU2FudGlhZ28gTGVvbiAoc2FudGlsQHVzLmlibS5jb20pCisgKiAgICAgICAgICBEYXZlIEJvdXRjaGVyIChzbGVkZG9nQHVzLmlibS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcKKyAqIFVTQQorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRW11bGF0aW9uIG9mIGEgU0NTSSBob3N0IGFkYXB0ZXIgZm9yIFZpcnR1YWwgSS9PIGRldmljZXMKKyAqCisgKiBUaGlzIGRyaXZlciBhbGxvd3MgdGhlIExpbnV4IFNDU0kgcGVyaXBoZXJhbCBkcml2ZXJzIHRvIGRpcmVjdGx5CisgKiBhY2Nlc3MgZGV2aWNlcyBpbiB0aGUgaG9zdGluZyBwYXJ0aXRpb24sIGVpdGhlciBvbiBhbiBpU2VyaWVzCisgKiBoeXBlcnZpc29yIHN5c3RlbSBvciBhIGNvbnZlcmdlZCBoeXBlcnZpc29yIHN5c3RlbS4KKyAqLworI2lmbmRlZiBJQk1WU0NTSV9ICisjZGVmaW5lIElCTVZTQ1NJX0gKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSAidmlvc3JwLmgiCisKK3N0cnVjdCBzY3NpX2NtbmQ7CitzdHJ1Y3QgU2NzaV9Ib3N0OworCisvKiBOdW1iZXIgb2YgaW5kaXJlY3QgYnVmcy4uLnRoZSBsaXN0IG9mIHRoZXNlIGhhcyB0byBmaXQgaW4gdGhlCisgKiBhZGRpdGlvbmFsIGRhdGEgb2YgdGhlIHNycF9jbWQgc3RydWN0IGFsb25nIHdpdGggdGhlIGluZGlyZWN0CisgKiBkZXNjcmlwdG9yCisgKi8KKyNkZWZpbmUgTUFYX0lORElSRUNUX0JVRlMgMTAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEYXRhIFN0cnVjdHVyZXMKKyAqLworLyogYW4gUlBBIGNvbW1hbmQvcmVzcG9uc2UgdHJhbnNwb3J0IHF1ZXVlICovCitzdHJ1Y3QgY3JxX3F1ZXVlIHsKKwlzdHJ1Y3Qgdmlvc3JwX2NycSAqbXNnczsKKwlpbnQgc2l6ZSwgY3VyOworCWRtYV9hZGRyX3QgbXNnX3Rva2VuOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKKy8qIGEgdW5pdCBvZiB3b3JrIGZvciB0aGUgaG9zdGluZyBwYXJ0aXRpb24gKi8KK3N0cnVjdCBzcnBfZXZlbnRfc3RydWN0IHsKKwl1bmlvbiB2aW9zcnBfaXUgKnhmZXJfaXU7CisJc3RydWN0IHNjc2lfY21uZCAqY21uZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdm9pZCAoKmRvbmUpIChzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqKTsKKwlzdHJ1Y3Qgdmlvc3JwX2NycSBjcnE7CisJc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGE7CisJYXRvbWljX3QgZnJlZTsKKwl1bmlvbiB2aW9zcnBfaXUgaXU7CisJdm9pZCAoKmNtbmRfZG9uZSkgKHN0cnVjdCBzY3NpX2NtbmQgKik7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcDsKKwl1bmlvbiB2aW9zcnBfaXUgKnN5bmNfc3JwOworfTsKKworLyogYSBwb29sIG9mIGV2ZW50IHN0cnVjdHMgZm9yIHVzZSAqLworc3RydWN0IGV2ZW50X3Bvb2wgeworCXN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICpldmVudHM7CisJdTMyIHNpemU7CisJaW50IG5leHQ7CisJdW5pb24gdmlvc3JwX2l1ICppdV9zdG9yYWdlOworCWRtYV9hZGRyX3QgaXVfdG9rZW47Cit9OworCisvKiBhbGwgZHJpdmVyIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgaG9zdCBhZGFwdGVyICovCitzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhIHsKKwlhdG9taWNfdCByZXF1ZXN0X2xpbWl0OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZXZlbnRfcG9vbCBwb29sOworCXN0cnVjdCBjcnFfcXVldWUgcXVldWU7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHNycF90YXNrOworCXN0cnVjdCBsaXN0X2hlYWQgc2VudDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXN0cnVjdCBtYWRfYWRhcHRlcl9pbmZvX2RhdGEgbWFkYXB0ZXJfaW5mbzsKK307CisKKy8qIHJvdXRpbmVzIGZvciBtYW5hZ2luZyBhIGNvbW1hbmQvcmVzcG9uc2UgcXVldWUgKi8KK2ludCBpYm12c2NzaV9pbml0X2NycV9xdWV1ZShzdHJ1Y3QgY3JxX3F1ZXVlICpxdWV1ZSwKKwkJCSAgICBzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSwKKwkJCSAgICBpbnQgbWF4X3JlcXVlc3RzKTsKK3ZvaWQgaWJtdnNjc2lfcmVsZWFzZV9jcnFfcXVldWUoc3RydWN0IGNycV9xdWV1ZSAqcXVldWUsCisJCQkJc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEsCisJCQkJaW50IG1heF9yZXF1ZXN0cyk7Cit2b2lkIGlibXZzY3NpX3Jlc2V0X2NycV9xdWV1ZShzdHJ1Y3QgY3JxX3F1ZXVlICpxdWV1ZSwKKwkJCSAgICAgIHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhKTsKKwordm9pZCBpYm12c2NzaV9oYW5kbGVfY3JxKHN0cnVjdCB2aW9zcnBfY3JxICpjcnEsCisJCQkgc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEpOworaW50IGlibXZzY3NpX3NlbmRfY3JxKHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhLAorCQkgICAgICB1NjQgd29yZDEsIHU2NCB3b3JkMik7CisKKyNlbmRpZgkJCQkvKiBJQk1WU0NTSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaXNlcmllc192c2NzaS5jIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2lzZXJpZXNfdnNjc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTIwMmYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2lzZXJpZXNfdnNjc2kuYwpAQCAtMCwwICsxLDE0NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBpU2VyaWVzX3ZzY3NpLmMKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDE5OTQsIDIwMDMKKyAqIEF1dGhvcnM6IENvbGluIERlVmlsYmlzcyAoZGV2aWxiaXNAdXMuaWJtLmNvbSkKKyAqICAgICAgICAgIFNhbnRpYWdvIExlb24gKHNhbnRpbEB1cy5pYm0uY29tKQorICogICAgICAgICAgRGF2ZSBCb3V0Y2hlciAoc2xlZGRvZ0B1cy5pYm0uY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3CisgKiBVU0EKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGlTZXJpZXMtc3BlY2lmaWMgZnVuY3Rpb25zIG9mIHRoZSBTQ1NJIGhvc3QgYWRhcHRlciBmb3IgVmlydHVhbCBJL08gZGV2aWNlcworICoKKyAqIFRoaXMgZHJpdmVyIGFsbG93cyB0aGUgTGludXggU0NTSSBwZXJpcGhlcmFsIGRyaXZlcnMgdG8gZGlyZWN0bHkKKyAqIGFjY2VzcyBkZXZpY2VzIGluIHRoZSBob3N0aW5nIHBhcnRpdGlvbiwgZWl0aGVyIG9uIGFuIGlTZXJpZXMKKyAqIGh5cGVydmlzb3Igc3lzdGVtIG9yIGEgY29udmVyZ2VkIGh5cGVydmlzb3Igc3lzdGVtLgorICovCisKKyNpbmNsdWRlIDxhc20vaVNlcmllcy92aW8uaD4KKyNpbmNsdWRlIDxhc20vaVNlcmllcy9IdkxwRXZlbnQuaD4KKyNpbmNsdWRlIDxhc20vaVNlcmllcy9IdlR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lTZXJpZXMvSHZMcENvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS92aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlICJpYm12c2NzaS5oIgorCisvKiBnbG9iYWwgdmFyaWFibGVzICovCitzdGF0aWMgc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqc2luZ2xlX2hvc3RfZGF0YTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSb3V0aW5lcyBmb3IgZGlyZWN0IGludGVycGFydGl0aW9uIGludGVyYWN0aW9uCisgKi8KK3N0cnVjdCBzcnBfbHBfZXZlbnQgeworCXN0cnVjdCBIdkxwRXZlbnQgbHBldnQ7CS8qIDB4MDAtMHgxNyAgICAgICAgICAqLworCXUzMiByZXNlcnZlZDE7CQkvKiAweDE4LTB4MUI7IHVudXNlZCAgKi8KKwl1MTYgdmVyc2lvbjsJCS8qIDB4MUMtMHgxRDsgdW51c2VkICAqLworCXUxNiBzdWJ0eXBlX3JjOwkJLyogMHgxRS0weDFGOyB1bnVzZWQgICovCisJc3RydWN0IHZpb3NycF9jcnEgY3JxOwkvKiAweDIwLTB4M0YgICAgICAgICAgKi8KK307CisKKy8qKiAKKyAqIHN0YW5kYXJkIGludGVyZmFjZSBmb3IgaGFuZGxpbmcgbG9naWNhbCBwYXJ0aXRpb24gZXZlbnRzLgorICovCitzdGF0aWMgdm9pZCBpYm12c2NzaV9oYW5kbGVfZXZlbnQoc3RydWN0IEh2THBFdmVudCAqbHBldnQpCit7CisJc3RydWN0IHNycF9scF9ldmVudCAqZXZ0ID0gKHN0cnVjdCBzcnBfbHBfZXZlbnQgKilscGV2dDsKKworCWlmICghZXZ0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWJtdnNjc2k6IHJlY2VpdmVkIG51bGwgZXZlbnRcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHNpbmdsZV9ob3N0X2RhdGEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJpYm12c2NzaTogcmVjZWl2ZWQgZXZlbnQsIG5vIGFkYXB0ZXIgcHJlc2VudFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpYm12c2NzaV9oYW5kbGVfY3JxKCZldnQtPmNycSwgc2luZ2xlX2hvc3RfZGF0YSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUm91dGluZXMgZm9yIGRyaXZlciBpbml0aWFsaXphdGlvbgorICovCitpbnQgaWJtdnNjc2lfaW5pdF9jcnFfcXVldWUoc3RydWN0IGNycV9xdWV1ZSAqcXVldWUsCisJCQkgICAgc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEsCisJCQkgICAgaW50IG1heF9yZXF1ZXN0cykKK3sKKwlpbnQgcmM7CisKKwlzaW5nbGVfaG9zdF9kYXRhID0gaG9zdGRhdGE7CisJcmMgPSB2aW9wYXRoX29wZW4odmlvcGF0aF9ob3N0THAsIHZpb21ham9yc3VidHlwZV9zY3NpLCAwKTsKKwlpZiAocmMgPCAwKSB7CisJCXByaW50aygidmlvcGF0aF9vcGVuIGZhaWxlZCB3aXRoIHJjICVkIGluIG9wZW5fZXZlbnRfcGF0aFxuIiwKKwkJICAgICAgIHJjKTsKKwkJZ290byB2aW9wYXRoX29wZW5fZmFpbGVkOworCX0KKworCXJjID0gdmlvX3NldEhhbmRsZXIodmlvbWFqb3JzdWJ0eXBlX3Njc2ksIGlibXZzY3NpX2hhbmRsZV9ldmVudCk7CisJaWYgKHJjIDwgMCkgeworCQlwcmludGsoInZpb19zZXRIYW5kbGVyIGZhaWxlZCB3aXRoIHJjICVkIGluIG9wZW5fZXZlbnRfcGF0aFxuIiwKKwkJICAgICAgIHJjKTsKKwkJZ290byB2aW9fc2V0SGFuZGxlcl9mYWlsZWQ7CisJfQorCXJldHVybiAwOworCisgICAgICB2aW9fc2V0SGFuZGxlcl9mYWlsZWQ6CisJdmlvcGF0aF9jbG9zZSh2aW9wYXRoX2hvc3RMcCwgdmlvbWFqb3JzdWJ0eXBlX3Njc2ksIG1heF9yZXF1ZXN0cyk7CisgICAgICB2aW9wYXRoX29wZW5fZmFpbGVkOgorCXJldHVybiAtMTsKK30KKwordm9pZCBpYm12c2NzaV9yZWxlYXNlX2NycV9xdWV1ZShzdHJ1Y3QgY3JxX3F1ZXVlICpxdWV1ZSwKKwkJCQlzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSwKKwkJCQlpbnQgbWF4X3JlcXVlc3RzKQoreworCXZpb19jbGVhckhhbmRsZXIodmlvbWFqb3JzdWJ0eXBlX3Njc2kpOworCXZpb3BhdGhfY2xvc2UodmlvcGF0aF9ob3N0THAsIHZpb21ham9yc3VidHlwZV9zY3NpLCBtYXhfcmVxdWVzdHMpOworfQorCisvKioKKyAqIHJlc2V0X2NycV9xdWV1ZTogLSByZXNldHMgYSBjcnEgYWZ0ZXIgYSBmYWlsdXJlCisgKiBAcXVldWU6CWNycV9xdWV1ZSB0byBpbml0aWFsaXplIGFuZCByZWdpc3RlcgorICogQGhvc3RkYXRhOglpYm12c2NzaV9ob3N0X2RhdGEgb2YgaG9zdAorICoKKyAqIG5vLW9wIGZvciBpU2VyaWVzCisgKi8KK3ZvaWQgaWJtdnNjc2lfcmVzZXRfY3JxX3F1ZXVlKHN0cnVjdCBjcnFfcXVldWUgKnF1ZXVlLAorCQkJICAgICAgc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEpCit7Cit9CisKKy8qKgorICogaWJtdnNjc2lfc2VuZF9jcnE6IC0gU2VuZCBhIENSUQorICogQGhvc3RkYXRhOgl0aGUgYWRhcHRlcgorICogQHdvcmQxOgl0aGUgZmlyc3QgNjQgYml0cyBvZiB0aGUgZGF0YQorICogQHdvcmQyOgl0aGUgc2Vjb25kIDY0IGJpdHMgb2YgdGhlIGRhdGEKKyAqLworaW50IGlibXZzY3NpX3NlbmRfY3JxKHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhLCB1NjQgd29yZDEsIHU2NCB3b3JkMikKK3sKKwlzaW5nbGVfaG9zdF9kYXRhID0gaG9zdGRhdGE7CisJcmV0dXJuIEh2Q2FsbEV2ZW50X3NpZ25hbExwRXZlbnRGYXN0KHZpb3BhdGhfaG9zdExwLAorCQkJCQkgICAgIEh2THBFdmVudF9UeXBlX1ZpcnR1YWxJbywKKwkJCQkJICAgICB2aW9tYWpvcnN1YnR5cGVfc2NzaSwKKwkJCQkJICAgICBIdkxwRXZlbnRfQWNrSW5kX05vQWNrLAorCQkJCQkgICAgIEh2THBFdmVudF9BY2tUeXBlX0ltbWVkaWF0ZUFjaywKKwkJCQkJICAgICB2aW9wYXRoX3NvdXJjZWluc3QodmlvcGF0aF9ob3N0THApLAorCQkJCQkgICAgIHZpb3BhdGhfdGFyZ2V0aW5zdCh2aW9wYXRoX2hvc3RMcCksCisJCQkJCSAgICAgMCwKKwkJCQkJICAgICBWSU9WRVJTSU9OIDw8IDE2LCB3b3JkMSwgd29yZDIsIDAsCisJCQkJCSAgICAgMCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvcnBhX3ZzY3NpLmMgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvcnBhX3ZzY3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBjYjkwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9ycGFfdnNjc2kuYwpAQCAtMCwwICsxLDI2MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBycGFfdnNjc2kuYworICogKEMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMTk5NCwgMjAwMworICogQXV0aG9yczogQ29saW4gRGVWaWxiaXNzIChkZXZpbGJpc0B1cy5pYm0uY29tKQorICogICAgICAgICAgU2FudGlhZ28gTGVvbiAoc2FudGlsQHVzLmlibS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcKKyAqIFVTQQorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUlBBLXNwZWNpZmljIGZ1bmN0aW9ucyBvZiB0aGUgU0NTSSBob3N0IGFkYXB0ZXIgZm9yIFZpcnR1YWwgSS9PIGRldmljZXMKKyAqCisgKiBUaGlzIGRyaXZlciBhbGxvd3MgdGhlIExpbnV4IFNDU0kgcGVyaXBoZXJhbCBkcml2ZXJzIHRvIGRpcmVjdGx5CisgKiBhY2Nlc3MgZGV2aWNlcyBpbiB0aGUgaG9zdGluZyBwYXJ0aXRpb24sIGVpdGhlciBvbiBhbiBpU2VyaWVzCisgKiBoeXBlcnZpc29yIHN5c3RlbSBvciBhIGNvbnZlcmdlZCBoeXBlcnZpc29yIHN5c3RlbS4KKyAqLworCisjaW5jbHVkZSA8YXNtL3Zpby5oPgorI2luY2x1ZGUgPGFzbS9pb21tdS5oPgorI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgImlibXZzY3NpLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUm91dGluZXMgZm9yIG1hbmFnaW5nIHRoZSBjb21tYW5kL3Jlc3BvbnNlIHF1ZXVlCisgKi8KKy8qKgorICogaWJtdnNjc2lfaGFuZGxlX2V2ZW50OiAtIEludGVycnVwdCBoYW5kbGVyIGZvciBjcnEgZXZlbnRzCisgKiBAaXJxOgludW1iZXIgb2YgaXJxIHRvIGhhbmRsZSwgbm90IHVzZWQKKyAqIEBkZXZfaW5zdGFuY2U6IGlibXZzY3NpX2hvc3RfZGF0YSBvZiBob3N0IHRoYXQgcmVjZWl2ZWQgaW50ZXJydXB0CisgKiBAcmVnczoJcHRfcmVncyB3aXRoIHJlZ2lzdGVycworICoKKyAqIERpc2FibGVzIGludGVycnVwdHMgYW5kIHNjaGVkdWxlcyBzcnBfdGFzaworICogQWx3YXlzIHJldHVybnMgSVJRX0hBTkRMRUQKKyAqLworc3RhdGljIGlycXJldHVybl90IGlibXZzY3NpX2hhbmRsZV9ldmVudChpbnQgaXJxLAorCQkJCQkgdm9pZCAqZGV2X2luc3RhbmNlLAorCQkJCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEgPQorCSAgICAoc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqKWRldl9pbnN0YW5jZTsKKwl2aW9fZGlzYWJsZV9pbnRlcnJ1cHRzKHRvX3Zpb19kZXYoaG9zdGRhdGEtPmRldikpOworCXRhc2tsZXRfc2NoZWR1bGUoJmhvc3RkYXRhLT5zcnBfdGFzayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIHJlbGVhc2VfY3JxX3F1ZXVlOiAtIERlYWxsb2NhdGVzIGRhdGEgYW5kIHVucmVnaXN0ZXJzIENSUQorICogQHF1ZXVlOgljcnFfcXVldWUgdG8gaW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIKKyAqIEBob3N0X2RhdGE6CWlibXZzY3NpX2hvc3RfZGF0YSBvZiBob3N0CisgKgorICogRnJlZXMgaXJxLCBkZWFsbG9jYXRlcyBhIHBhZ2UgZm9yIG1lc3NhZ2VzLCB1bm1hcHMgZG1hLCBhbmQgdW5yZWdpc3RlcnMKKyAqIHRoZSBjcnEgd2l0aCB0aGUgaHlwZXJ2aXNvci4KKyAqLwordm9pZCBpYm12c2NzaV9yZWxlYXNlX2NycV9xdWV1ZShzdHJ1Y3QgY3JxX3F1ZXVlICpxdWV1ZSwKKwkJCQlzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSwKKwkJCQlpbnQgbWF4X3JlcXVlc3RzKQoreworCWxvbmcgcmM7CisJc3RydWN0IHZpb19kZXYgKnZkZXYgPSB0b192aW9fZGV2KGhvc3RkYXRhLT5kZXYpOworCWZyZWVfaXJxKHZkZXYtPmlycSwgKHZvaWQgKilob3N0ZGF0YSk7CisJdGFza2xldF9raWxsKCZob3N0ZGF0YS0+c3JwX3Rhc2spOworCWRvIHsKKwkJcmMgPSBwbHBhcl9oY2FsbF9ub3JldHMoSF9GUkVFX0NSUSwgdmRldi0+dW5pdF9hZGRyZXNzKTsKKwl9IHdoaWxlICgocmMgPT0gSF9CdXN5KSB8fCAoSF9pc0xvbmdCdXN5KHJjKSkpOworCWRtYV91bm1hcF9zaW5nbGUoaG9zdGRhdGEtPmRldiwKKwkJCSBxdWV1ZS0+bXNnX3Rva2VuLAorCQkJIHF1ZXVlLT5zaXplICogc2l6ZW9mKCpxdWV1ZS0+bXNncyksIERNQV9CSURJUkVDVElPTkFMKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcXVldWUtPm1zZ3MpOworfQorCisvKioKKyAqIGNycV9xdWV1ZV9uZXh0X2NycTogLSBSZXR1cm5zIHRoZSBuZXh0IGVudHJ5IGluIG1lc3NhZ2UgcXVldWUKKyAqIEBxdWV1ZToJY3JxX3F1ZXVlIHRvIHVzZQorICoKKyAqIFJldHVybnMgcG9pbnRlciB0byBuZXh0IGVudHJ5IGluIHF1ZXVlLCBvciBOVUxMIGlmIHRoZXJlIGFyZSBubyBuZXcgCisgKiBlbnRyaWVkIGluIHRoZSBDUlEuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgdmlvc3JwX2NycSAqY3JxX3F1ZXVlX25leHRfY3JxKHN0cnVjdCBjcnFfcXVldWUgKnF1ZXVlKQoreworCXN0cnVjdCB2aW9zcnBfY3JxICpjcnE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+bG9jaywgZmxhZ3MpOworCWNycSA9ICZxdWV1ZS0+bXNnc1txdWV1ZS0+Y3VyXTsKKwlpZiAoY3JxLT52YWxpZCAmIDB4ODApIHsKKwkJaWYgKCsrcXVldWUtPmN1ciA9PSBxdWV1ZS0+c2l6ZSkKKwkJCXF1ZXVlLT5jdXIgPSAwOworCX0gZWxzZQorCQljcnEgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gY3JxOworfQorCisvKioKKyAqIGlibXZzY3NpX3NlbmRfY3JxOiAtIFNlbmQgYSBDUlEKKyAqIEBob3N0ZGF0YToJdGhlIGFkYXB0ZXIKKyAqIEB3b3JkMToJdGhlIGZpcnN0IDY0IGJpdHMgb2YgdGhlIGRhdGEKKyAqIEB3b3JkMjoJdGhlIHNlY29uZCA2NCBiaXRzIG9mIHRoZSBkYXRhCisgKi8KK2ludCBpYm12c2NzaV9zZW5kX2NycShzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSwgdTY0IHdvcmQxLCB1NjQgd29yZDIpCit7CisJc3RydWN0IHZpb19kZXYgKnZkZXYgPSB0b192aW9fZGV2KGhvc3RkYXRhLT5kZXYpOworCisJcmV0dXJuIHBscGFyX2hjYWxsX25vcmV0cyhIX1NFTkRfQ1JRLCB2ZGV2LT51bml0X2FkZHJlc3MsIHdvcmQxLCB3b3JkMik7Cit9CisKKy8qKgorICogaWJtdnNjc2lfdGFzazogLSBQcm9jZXNzIHNycHMgYXN5bmNocm9ub3VzbHkKKyAqIEBkYXRhOglpYm12c2NzaV9ob3N0X2RhdGEgb2YgaG9zdAorICovCitzdGF0aWMgdm9pZCBpYm12c2NzaV90YXNrKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqKWRhdGE7CisJc3RydWN0IHZpb19kZXYgKnZkZXYgPSB0b192aW9fZGV2KGhvc3RkYXRhLT5kZXYpOworCXN0cnVjdCB2aW9zcnBfY3JxICpjcnE7CisJaW50IGRvbmUgPSAwOworCisJd2hpbGUgKCFkb25lKSB7CisJCS8qIFB1bGwgYWxsIHRoZSB2YWxpZCBtZXNzYWdlcyBvZmYgdGhlIENSUSAqLworCQl3aGlsZSAoKGNycSA9IGNycV9xdWV1ZV9uZXh0X2NycSgmaG9zdGRhdGEtPnF1ZXVlKSkgIT0gTlVMTCkgeworCQkJaWJtdnNjc2lfaGFuZGxlX2NycShjcnEsIGhvc3RkYXRhKTsKKwkJCWNycS0+dmFsaWQgPSAweDAwOworCQl9CisKKwkJdmlvX2VuYWJsZV9pbnRlcnJ1cHRzKHZkZXYpOworCQlpZiAoKGNycSA9IGNycV9xdWV1ZV9uZXh0X2NycSgmaG9zdGRhdGEtPnF1ZXVlKSkgIT0gTlVMTCkgeworCQkJdmlvX2Rpc2FibGVfaW50ZXJydXB0cyh2ZGV2KTsKKwkJCWlibXZzY3NpX2hhbmRsZV9jcnEoY3JxLCBob3N0ZGF0YSk7CisJCQljcnEtPnZhbGlkID0gMHgwMDsKKwkJfSBlbHNlIHsKKwkJCWRvbmUgPSAxOworCQl9CisJfQorfQorCisvKioKKyAqIGluaXRpYWxpemVfY3JxX3F1ZXVlOiAtIEluaXRpYWxpemVzIGFuZCByZWdpc3RlcnMgQ1JRIHdpdGggaHlwZXJ2aXNvcgorICogQHF1ZXVlOgljcnFfcXVldWUgdG8gaW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIKKyAqIEBob3N0ZGF0YToJaWJtdnNjc2lfaG9zdF9kYXRhIG9mIGhvc3QKKyAqCisgKiBBbGxvY2F0ZXMgYSBwYWdlIGZvciBtZXNzYWdlcywgbWFwcyBpdCBmb3IgZG1hLCBhbmQgcmVnaXN0ZXJzCisgKiB0aGUgY3JxIHdpdGggdGhlIGh5cGVydmlzb3IuCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcy4KKyAqLworaW50IGlibXZzY3NpX2luaXRfY3JxX3F1ZXVlKHN0cnVjdCBjcnFfcXVldWUgKnF1ZXVlLAorCQkJICAgIHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhLAorCQkJICAgIGludCBtYXhfcmVxdWVzdHMpCit7CisJaW50IHJjOworCXN0cnVjdCB2aW9fZGV2ICp2ZGV2ID0gdG9fdmlvX2Rldihob3N0ZGF0YS0+ZGV2KTsKKworCXF1ZXVlLT5tc2dzID0gKHN0cnVjdCB2aW9zcnBfY3JxICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCisJaWYgKCFxdWV1ZS0+bXNncykKKwkJZ290byBtYWxsb2NfZmFpbGVkOworCXF1ZXVlLT5zaXplID0gUEFHRV9TSVpFIC8gc2l6ZW9mKCpxdWV1ZS0+bXNncyk7CisKKwlxdWV1ZS0+bXNnX3Rva2VuID0gZG1hX21hcF9zaW5nbGUoaG9zdGRhdGEtPmRldiwgcXVldWUtPm1zZ3MsCisJCQkJCSAgcXVldWUtPnNpemUgKiBzaXplb2YoKnF1ZXVlLT5tc2dzKSwKKwkJCQkJICBETUFfQklESVJFQ1RJT05BTCk7CisKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IocXVldWUtPm1zZ190b2tlbikpCisJCWdvdG8gbWFwX2ZhaWxlZDsKKworCXJjID0gcGxwYXJfaGNhbGxfbm9yZXRzKEhfUkVHX0NSUSwKKwkJCQl2ZGV2LT51bml0X2FkZHJlc3MsCisJCQkJcXVldWUtPm1zZ190b2tlbiwgUEFHRV9TSVpFKTsKKwlpZiAocmMgPT0gMikgeworCQkvKiBBZGFwdGVyIGlzIGdvb2QsIGJ1dCBvdGhlciBlbmQgaXMgbm90IHJlYWR5ICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImlibXZzY3NpOiBQYXJ0bmVyIGFkYXB0ZXIgbm90IHJlYWR5XG4iKTsKKwl9IGVsc2UgaWYgKHJjICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaWJtdnNjc2k6IEVycm9yICVkIG9wZW5pbmcgYWRhcHRlclxuIiwgcmMpOworCQlnb3RvIHJlZ19jcnFfZmFpbGVkOworCX0KKworCWlmIChyZXF1ZXN0X2lycSh2ZGV2LT5pcnEsCisJCQlpYm12c2NzaV9oYW5kbGVfZXZlbnQsCisJCQkwLCAiaWJtdnNjc2kiLCAodm9pZCAqKWhvc3RkYXRhKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWJtdnNjc2k6IGNvdWxkbid0IHJlZ2lzdGVyIGlycSAweCV4XG4iLAorCQkgICAgICAgdmRldi0+aXJxKTsKKwkJZ290byByZXFfaXJxX2ZhaWxlZDsKKwl9CisKKwlyYyA9IHZpb19lbmFibGVfaW50ZXJydXB0cyh2ZGV2KTsKKwlpZiAocmMgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgImlibXZzY3NpOiAgRXJyb3IgJWQgZW5hYmxpbmcgaW50ZXJydXB0cyEhIVxuIiwKKwkJICAgICAgIHJjKTsKKwkJZ290byByZXFfaXJxX2ZhaWxlZDsKKwl9CisKKwlxdWV1ZS0+Y3VyID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmcXVldWUtPmxvY2spOworCisJdGFza2xldF9pbml0KCZob3N0ZGF0YS0+c3JwX3Rhc2ssICh2b2lkICopaWJtdnNjc2lfdGFzaywKKwkJICAgICAodW5zaWduZWQgbG9uZylob3N0ZGF0YSk7CisKKwlyZXR1cm4gMDsKKworICAgICAgcmVxX2lycV9mYWlsZWQ6CisJZG8geworCQlyYyA9IHBscGFyX2hjYWxsX25vcmV0cyhIX0ZSRUVfQ1JRLCB2ZGV2LT51bml0X2FkZHJlc3MpOworCX0gd2hpbGUgKChyYyA9PSBIX0J1c3kpIHx8IChIX2lzTG9uZ0J1c3kocmMpKSk7CisgICAgICByZWdfY3JxX2ZhaWxlZDoKKwlkbWFfdW5tYXBfc2luZ2xlKGhvc3RkYXRhLT5kZXYsCisJCQkgcXVldWUtPm1zZ190b2tlbiwKKwkJCSBxdWV1ZS0+c2l6ZSAqIHNpemVvZigqcXVldWUtPm1zZ3MpLCBETUFfQklESVJFQ1RJT05BTCk7CisgICAgICBtYXBfZmFpbGVkOgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylxdWV1ZS0+bXNncyk7CisgICAgICBtYWxsb2NfZmFpbGVkOgorCXJldHVybiAtMTsKK30KKworLyoqCisgKiByZXNldF9jcnFfcXVldWU6IC0gcmVzZXRzIGEgY3JxIGFmdGVyIGEgZmFpbHVyZQorICogQHF1ZXVlOgljcnFfcXVldWUgdG8gaW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIKKyAqIEBob3N0ZGF0YToJaWJtdnNjc2lfaG9zdF9kYXRhIG9mIGhvc3QKKyAqCisgKi8KK3ZvaWQgaWJtdnNjc2lfcmVzZXRfY3JxX3F1ZXVlKHN0cnVjdCBjcnFfcXVldWUgKnF1ZXVlLAorCQkJICAgICAgc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEpCit7CisJaW50IHJjOworCXN0cnVjdCB2aW9fZGV2ICp2ZGV2ID0gdG9fdmlvX2Rldihob3N0ZGF0YS0+ZGV2KTsKKworCS8qIENsb3NlIHRoZSBDUlEgKi8KKwlkbyB7CisJCXJjID0gcGxwYXJfaGNhbGxfbm9yZXRzKEhfRlJFRV9DUlEsIHZkZXYtPnVuaXRfYWRkcmVzcyk7CisJfSB3aGlsZSAoKHJjID09IEhfQnVzeSkgfHwgKEhfaXNMb25nQnVzeShyYykpKTsKKworCS8qIENsZWFuIG91dCB0aGUgcXVldWUgKi8KKwltZW1zZXQocXVldWUtPm1zZ3MsIDB4MDAsIFBBR0VfU0laRSk7CisJcXVldWUtPmN1ciA9IDA7CisKKwkvKiBBbmQgcmUtb3BlbiBpdCBhZ2FpbiAqLworCXJjID0gcGxwYXJfaGNhbGxfbm9yZXRzKEhfUkVHX0NSUSwKKwkJCQl2ZGV2LT51bml0X2FkZHJlc3MsCisJCQkJcXVldWUtPm1zZ190b2tlbiwgUEFHRV9TSVpFKTsKKwlpZiAocmMgPT0gMikgeworCQkvKiBBZGFwdGVyIGlzIGdvb2QsIGJ1dCBvdGhlciBlbmQgaXMgbm90IHJlYWR5ICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImlibXZzY3NpOiBQYXJ0bmVyIGFkYXB0ZXIgbm90IHJlYWR5XG4iKTsKKwl9IGVsc2UgaWYgKHJjICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgImlibXZzY3NpOiBjb3VsZG4ndCByZWdpc3RlciBjcnEtLXJjIDB4JXhcbiIsIHJjKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvc3JwLmggYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvc3JwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk1MmMxYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9zcnAuaApAQCAtMCwwICsxLDIyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogc3JwLmggLS0gU0NTSSBSRE1BIFByb3RvY29sIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogV3JpdHRlbiBCeTogQ29saW4gRGV2aWxiaXMsIElCTSBDb3Jwb3JhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ29weXJpZ2h0IChDKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgICAqLworLyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgICAqLworLyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgICAqLworLyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgICAqLworLyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgICAqLworLyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgICAqLworLyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgICAqLworLyogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgICAqLworLyogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBmaWxlIGNvbnRhaW5zIHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zIGZvciB0aGUgU0NTSSBSRE1BIFByb3RvY29sICAqLworLyogKFNSUCkgYXMgZGVmaW5lZCBpbiB0aGUgVDEwIHN0YW5kYXJkIGF2YWlsYWJsZSBhdCB3d3cudDEwLm9yZy4gIFRoaXMgICAgICAqLworLyogZmlsZSB3YXMgYmFzZWQgb24gdGhlIDE2YSB2ZXJzaW9uIG9mIHRoZSBzdGFuZGFyZCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBTUlBfSAorI2RlZmluZSBTUlBfSAorCisjZGVmaW5lIFBBQ0tFRCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorCitlbnVtIHNycF90eXBlcyB7CisJU1JQX0xPR0lOX1JFUV9UWVBFID0gMHgwMCwKKwlTUlBfTE9HSU5fUlNQX1RZUEUgPSAweEMwLAorCVNSUF9MT0dJTl9SRUpfVFlQRSA9IDB4ODAsCisJU1JQX0lfTE9HT1VUX1RZUEUgPSAweDAzLAorCVNSUF9UX0xPR09VVF9UWVBFID0gMHg4MCwKKwlTUlBfVFNLX01HTVRfVFlQRSA9IDB4MDEsCisJU1JQX0NNRF9UWVBFID0gMHgwMiwKKwlTUlBfUlNQX1RZUEUgPSAweEMxLAorCVNSUF9DUkVEX1JFUV9UWVBFID0gMHg4MSwKKwlTUlBfQ1JFRF9SU1BfVFlQRSA9IDB4NDEsCisJU1JQX0FFUl9SRVFfVFlQRSA9IDB4ODIsCisJU1JQX0FFUl9SU1BfVFlQRSA9IDB4NDIKK307CisKK2VudW0gc3JwX2Rlc2NyaXB0b3JfZm9ybWF0cyB7CisJU1JQX05PX0JVRkZFUiA9IDB4MDAsCisJU1JQX0RJUkVDVF9CVUZGRVIgPSAweDAxLAorCVNSUF9JTkRJUkVDVF9CVUZGRVIgPSAweDAyCit9OworCitzdHJ1Y3QgbWVtb3J5X2Rlc2NyaXB0b3IgeworCXU2NCB2aXJ0dWFsX2FkZHJlc3M7CisJdTMyIG1lbW9yeV9oYW5kbGU7CisJdTMyIGxlbmd0aDsKK307CisKK3N0cnVjdCBpbmRpcmVjdF9kZXNjcmlwdG9yIHsKKwlzdHJ1Y3QgbWVtb3J5X2Rlc2NyaXB0b3IgaGVhZDsKKwl1MzIgdG90YWxfbGVuZ3RoOworCXN0cnVjdCBtZW1vcnlfZGVzY3JpcHRvciBsaXN0WzFdIFBBQ0tFRDsKK307CisKK3N0cnVjdCBzcnBfZ2VuZXJpYyB7CisJdTggdHlwZTsKKwl1OCByZXNlcnZlZDFbN107CisJdTY0IHRhZzsKK307CisKK3N0cnVjdCBzcnBfbG9naW5fcmVxIHsKKwl1OCB0eXBlOworCXU4IHJlc2VydmVkMVs3XTsKKwl1NjQgdGFnOworCXUzMiBtYXhfcmVxdWVzdGVkX2luaXRpYXRvcl90b190YXJnZXRfaXVsZW47CisJdTMyIHJlc2VydmVkMjsKKwl1MTYgcmVxdWlyZWRfYnVmZmVyX2Zvcm1hdHM7CisJdTggcmVzZXJ2ZWQzOjY7CisJdTggbXVsdGlfY2hhbm5lbF9hY3Rpb246MjsKKwl1OCByZXNlcnZlZDQ7CisJdTMyIHJlc2VydmVkNTsKKwl1OCBpbml0aWF0b3JfcG9ydF9pZGVudGlmaWVyWzE2XTsKKwl1OCB0YXJnZXRfcG9ydF9pZGVudGlmaWVyWzE2XTsKK307CisKK3N0cnVjdCBzcnBfbG9naW5fcnNwIHsKKwl1OCB0eXBlOworCXU4IHJlc2VydmVkMVszXTsKKwl1MzIgcmVxdWVzdF9saW1pdF9kZWx0YTsKKwl1NjQgdGFnOworCXUzMiBtYXhfaW5pdGlhdG9yX3RvX3RhcmdldF9pdWxlbjsKKwl1MzIgbWF4X3RhcmdldF90b19pbml0aWF0b3JfaXVsZW47CisJdTE2IHN1cHBvcnRlZF9idWZmZXJfZm9ybWF0czsKKwl1OCByZXNlcnZlZDI6NjsKKwl1OCBtdWx0aV9jaGFubmVsX3Jlc3VsdDoyOworCXU4IHJlc2VydmVkMzsKKwl1OCByZXNlcnZlZDRbMjRdOworfTsKKworc3RydWN0IHNycF9sb2dpbl9yZWogeworCXU4IHR5cGU7CisJdTggcmVzZXJ2ZWQxWzNdOworCXUzMiByZWFzb247CisJdTY0IHRhZzsKKwl1NjQgcmVzZXJ2ZWQyOworCXUxNiBzdXBwb3J0ZWRfYnVmZmVyX2Zvcm1hdHM7CisJdTggcmVzZXJ2ZWQzWzZdOworfTsKKworc3RydWN0IHNycF9pX2xvZ291dCB7CisJdTggdHlwZTsKKwl1OCByZXNlcnZlZDFbN107CisJdTY0IHRhZzsKK307CisKK3N0cnVjdCBzcnBfdF9sb2dvdXQgeworCXU4IHR5cGU7CisJdTggcmVzZXJ2ZWQxWzNdOworCXUzMiByZWFzb247CisJdTY0IHRhZzsKK307CisKK3N0cnVjdCBzcnBfdHNrX21nbXQgeworCXU4IHR5cGU7CisJdTggcmVzZXJ2ZWQxWzddOworCXU2NCB0YWc7CisJdTMyIHJlc2VydmVkMjsKKwl1NjQgbHVuIFBBQ0tFRDsKKwl1OCByZXNlcnZlZDM7CisJdTggcmVzZXJ2ZWQ0OworCXU4IHRhc2tfbWdtdF9mbGFnczsKKwl1OCByZXNlcnZlZDU7CisJdTY0IG1hbmFnZWRfdGFza190YWc7CisJdTY0IHJlc2VydmVkNjsKK307CisKK3N0cnVjdCBzcnBfY21kIHsKKwl1OCB0eXBlOworCXUzMiByZXNlcnZlZDEgUEFDS0VEOworCXU4IGRhdGFfb3V0X2Zvcm1hdDo0OworCXU4IGRhdGFfaW5fZm9ybWF0OjQ7CisJdTggZGF0YV9vdXRfY291bnQ7CisJdTggZGF0YV9pbl9jb3VudDsKKwl1NjQgdGFnOworCXUzMiByZXNlcnZlZDI7CisJdTY0IGx1biBQQUNLRUQ7CisJdTggcmVzZXJ2ZWQzOworCXU4IHJlc2VydmVkNDo1OworCXU4IHRhc2tfYXR0cmlidXRlOjM7CisJdTggcmVzZXJ2ZWQ1OworCXU4IGFkZGl0aW9uYWxfY2RiX2xlbjsKKwl1OCBjZGJbMTZdOworCXU4IGFkZGl0aW9uYWxfZGF0YVsweDEwMCAtIDB4MzBdOworfTsKKworc3RydWN0IHNycF9yc3AgeworCXU4IHR5cGU7CisJdTggcmVzZXJ2ZWQxWzNdOworCXUzMiByZXF1ZXN0X2xpbWl0X2RlbHRhOworCXU2NCB0YWc7CisJdTE2IHJlc2VydmVkMjsKKwl1OCByZXNlcnZlZDM6MjsKKwl1OCBkaXVuZGVyOjE7CisJdTggZGlvdmVyOjE7CisJdTggZG91bmRlcjoxOworCXU4IGRvb3ZlcjoxOworCXU4IHNuc3ZhbGlkOjE7CisJdTggcnNwdmFsaWQ6MTsKKwl1OCBzdGF0dXM7CisJdTMyIGRhdGFfaW5fcmVzaWR1YWxfY291bnQ7CisJdTMyIGRhdGFfb3V0X3Jlc2lkdWFsX2NvdW50OworCXUzMiBzZW5zZV9kYXRhX2xpc3RfbGVuZ3RoOworCXUzMiByZXNwb25zZV9kYXRhX2xpc3RfbGVuZ3RoOworCXU4IHNlbnNlX2FuZF9yZXNwb25zZV9kYXRhWzE4XTsKK307CisKK3N0cnVjdCBzcnBfY3JlZF9yZXEgeworCXU4IHR5cGU7CisJdTggcmVzZXJ2ZWQxWzNdOworCXUzMiByZXF1ZXN0X2xpbWl0X2RlbHRhOworCXU2NCB0YWc7Cit9OworCitzdHJ1Y3Qgc3JwX2NyZWRfcnNwIHsKKwl1OCB0eXBlOworCXU4IHJlc2VydmVkMVs3XTsKKwl1NjQgdGFnOworfTsKKworc3RydWN0IHNycF9hZXJfcmVxIHsKKwl1OCB0eXBlOworCXU4IHJlc2VydmVkMVszXTsKKwl1MzIgcmVxdWVzdF9saW1pdF9kZWx0YTsKKwl1NjQgdGFnOworCXUzMiByZXNlcnZlZDI7CisJdTY0IGx1bjsKKwl1MzIgc2Vuc2VfZGF0YV9saXN0X2xlbmd0aDsKKwl1MzIgcmVzZXJ2ZWQzOworCXU4IHNlbnNlX2RhdGFbMjBdOworfTsKKworc3RydWN0IHNycF9hZXJfcnNwIHsKKwl1OCB0eXBlOworCXU4IHJlc2VydmVkMVs3XTsKKwl1NjQgdGFnOworfTsKKwordW5pb24gc3JwX2l1IHsKKwlzdHJ1Y3Qgc3JwX2dlbmVyaWMgZ2VuZXJpYzsKKwlzdHJ1Y3Qgc3JwX2xvZ2luX3JlcSBsb2dpbl9yZXE7CisJc3RydWN0IHNycF9sb2dpbl9yc3AgbG9naW5fcnNwOworCXN0cnVjdCBzcnBfbG9naW5fcmVqIGxvZ2luX3JlajsKKwlzdHJ1Y3Qgc3JwX2lfbG9nb3V0IGlfbG9nb3V0OworCXN0cnVjdCBzcnBfdF9sb2dvdXQgdF9sb2dvdXQ7CisJc3RydWN0IHNycF90c2tfbWdtdCB0c2tfbWdtdDsKKwlzdHJ1Y3Qgc3JwX2NtZCBjbWQ7CisJc3RydWN0IHNycF9yc3AgcnNwOworCXN0cnVjdCBzcnBfY3JlZF9yZXEgY3JlZF9yZXE7CisJc3RydWN0IHNycF9jcmVkX3JzcCBjcmVkX3JzcDsKKwlzdHJ1Y3Qgc3JwX2Flcl9yZXEgYWVyX3JlcTsKKwlzdHJ1Y3Qgc3JwX2Flcl9yc3AgYWVyX3JzcDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libXZzY3NpL3Zpb3NycC5oIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL3Zpb3NycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNmJiYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvdmlvc3JwLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHNycC5oIC0tIFNDU0kgUkRNQSBQcm90b2NvbCBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFdyaXR0ZW4gQnk6IENvbGluIERldmlsYmlzLCBJQk0gQ29ycG9yYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIENvcHlyaWdodCAoQykgMjAwMyBJQk0gQ29ycG9yYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICAgKi8KKy8qIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICAgKi8KKy8qIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICAgKi8KKy8qIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICAgKi8KKy8qIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICAgKi8KKy8qIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICAgKi8KKy8qIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICAgKi8KKy8qIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgICAgKi8KKy8qIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgZmlsZSBjb250YWlucyBzdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucyBmb3IgSUJNIFJQQSAoUlMvNjAwMCAgICAgICAgKi8KKy8qIHBsYXRmb3JtIGFyY2hpdGVjdHVyZSkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNSUCAoU0NTSSBSRE1BIFByb3RvY29sKSAgICAgKi8KKy8qIHN0YW5kYXJkLiAgU1JQIGlzIHVzZWQgb24gSUJNIGlTZXJpZXMgYW5kIHBTZXJpZXMgcGxhdGZvcm1zIHRvIHNlbmQgU0NTSSAgKi8KKy8qIGNvbW1hbmRzIGJldHdlZW4gbG9naWNhbCBwYXJ0aXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFNSUCBJbmZvcm1hdGlvbiBVbml0cyAoSVVzKSBhcmUgc2VudCBvbiBhICJDb21tYW5kL1Jlc3BvbnNlIFF1ZXVlIiAoQ1JRKSAgKi8KKy8qIGJldHdlZW4gcGFydGl0aW9ucy4gIFRoZSBkZWZpbml0aW9ucyBpbiB0aGlzIGZpbGUgYXJlIGFyY2hpdGVjdGVkLCAgICAgICAgKi8KKy8qIGFuZCBjYW5ub3QgYmUgY2hhbmdlZCB3aXRob3V0IGJyZWFraW5nIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciB2ZXJzaW9ucyAgKi8KKy8qIG9mIExpbnV4IGFuZCBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcyAoQUlYLCBPUy80MDApIHRoYXQgdGFsayB0aGlzIHByb3RvY29sKi8KKy8qIGJldHdlZW4gbG9naWNhbCBwYXJ0aXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgVklPU1JQX0gKKyNkZWZpbmUgVklPU1JQX0gKKyNpbmNsdWRlICJzcnAuaCIKKworZW51bSB2aW9zcnBfY3JxX2Zvcm1hdHMgeworCVZJT1NSUF9TUlBfRk9STUFUID0gMHgwMSwKKwlWSU9TUlBfTUFEX0ZPUk1BVCA9IDB4MDIsCisJVklPU1JQX09TNDAwX0ZPUk1BVCA9IDB4MDMsCisJVklPU1JQX0FJWF9GT1JNQVQgPSAweDA0LAorCVZJT1NSUF9MSU5VWF9GT1JNQVQgPSAweDA2LAorCVZJT1NSUF9JTkxJTkVfRk9STUFUID0gMHgwNworfTsKKworc3RydWN0IHZpb3NycF9jcnEgeworCXU4IHZhbGlkOwkJLyogdXNlZCBieSBSUEEgKi8KKwl1OCBmb3JtYXQ7CQkvKiBTQ1NJIHZzIG91dC1vZi1iYW5kICovCisJdTggcmVzZXJ2ZWQ7CisJdTggc3RhdHVzOwkJLyogbm9uLXNjc2kgZmFpbHVyZT8gKGUuZy4gRE1BIGZhaWx1cmUpICovCisJdTE2IHRpbWVvdXQ7CQkvKiBpbiBzZWNvbmRzICovCisJdTE2IElVX2xlbmd0aDsJCS8qIGluIGJ5dGVzICovCisJdTY0IElVX2RhdGFfcHRyOwkvKiB0aGUgVENFIGZvciB0cmFuc2ZlcnJpbmcgZGF0YSAqLworfTsKKworLyogTUFEcyBhcmUgTWFuYWdlbWVudCByZXF1ZXN0cyBhYm92ZSBhbmQgYmV5b25kIHRoZSBJVXMgZGVmaW5lZCBpbiB0aGUgU1JQCisgKiBzdGFuZGFyZC4gIAorICovCitlbnVtIHZpb3NycF9tYWRfdHlwZXMgeworCVZJT1NSUF9FTVBUWV9JVV9UWVBFID0gMHgwMSwKKwlWSU9TUlBfRVJST1JfTE9HX1RZUEUgPSAweDAyLAorCVZJT1NSUF9BREFQVEVSX0lORk9fVFlQRSA9IDB4MDMsCisJVklPU1JQX0hPU1RfQ09ORklHX1RZUEUgPSAweDA0Cit9OworCisvKiAKKyAqIENvbW1vbiBNQUQgaGVhZGVyCisgKi8KK3N0cnVjdCBtYWRfY29tbW9uIHsKKwl1MzIgdHlwZTsKKwl1MTYgc3RhdHVzOworCXUxNiBsZW5ndGg7CisJdTY0IHRhZzsKK307CisKKy8qCisgKiBBbGwgU1JQIChhbmQgTUFEKSByZXF1ZXN0cyBub3JtYWxseSBmbG93IGZyb20gdGhlCisgKiBjbGllbnQgdG8gdGhlIHNlcnZlci4gIFRoZXJlIGlzIG5vIHdheSBmb3IgdGhlIHNlcnZlciB0byBzZW5kCisgKiBhbiBhc3luY2hyb25vdXMgbWVzc2FnZSBiYWNrIHRvIHRoZSBjbGllbnQuICBUaGUgRW1wdHkgSVUgaXMgdXNlZAorICogdG8gaGFuZyBvdXQgYSBtZWFuaW5nbGVzcyByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgc28gdGhhdCBpdCBjYW4gcmVzcG9uZAorICogYXN5bmNocm91b3VzbHkgd2l0aCBzb21ldGhpbmcgbGlrZSBhIFNDU0kgQUVSIAorICovCitzdHJ1Y3Qgdmlvc3JwX2VtcHR5X2l1IHsKKwlzdHJ1Y3QgbWFkX2NvbW1vbiBjb21tb247CisJdTY0IGJ1ZmZlcjsKKwl1MzIgcG9ydDsKK307CisKK3N0cnVjdCB2aW9zcnBfZXJyb3JfbG9nIHsKKwlzdHJ1Y3QgbWFkX2NvbW1vbiBjb21tb247CisJdTY0IGJ1ZmZlcjsKK307CisKK3N0cnVjdCB2aW9zcnBfYWRhcHRlcl9pbmZvIHsKKwlzdHJ1Y3QgbWFkX2NvbW1vbiBjb21tb247CisJdTY0IGJ1ZmZlcjsKK307CisKK3N0cnVjdCB2aW9zcnBfaG9zdF9jb25maWcgeworCXN0cnVjdCBtYWRfY29tbW9uIGNvbW1vbjsKKwl1NjQgYnVmZmVyOworfTsKKwordW5pb24gbWFkX2l1IHsKKwlzdHJ1Y3Qgdmlvc3JwX2VtcHR5X2l1IGVtcHR5X2l1OworCXN0cnVjdCB2aW9zcnBfZXJyb3JfbG9nIGVycm9yX2xvZzsKKwlzdHJ1Y3Qgdmlvc3JwX2FkYXB0ZXJfaW5mbyBhZGFwdGVyX2luZm87CisJc3RydWN0IHZpb3NycF9ob3N0X2NvbmZpZyBob3N0X2NvbmZpZzsKK307CisKK3VuaW9uIHZpb3NycF9pdSB7CisJdW5pb24gc3JwX2l1IHNycDsKKwl1bmlvbiBtYWRfaXUgbWFkOworfTsKKworc3RydWN0IG1hZF9hZGFwdGVyX2luZm9fZGF0YSB7CisJY2hhciBzcnBfdmVyc2lvbls4XTsKKwljaGFyIHBhcnRpdGlvbl9uYW1lWzk2XTsKKwl1MzIgcGFydGl0aW9uX251bWJlcjsKKwl1MzIgbWFkX3ZlcnNpb247CisJdTMyIG9zX3R5cGU7CisJdTMyIHBvcnRfbWF4X3R4dVs4XTsJLyogcGVyLXBvcnQgbWF4aW11bSB0cmFuc2ZlciAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWRlLXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9pZGUtc2NzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMjQ4NmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaWRlLXNjc2kuYwpAQCAtMCwwICsxLDExNzQgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL3Njc2kvaWRlLXNjc2kuYwlWZXJzaW9uIDAuOQkJSnVsICAgNCwgMTk5OQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiAtIDE5OTkgR2FkaSBPeG1hbiA8Z2FkaW9AbmV0dmlzaW9uLm5ldC5pbD4KKyAqLworCisvKgorICogRW11bGF0aW9uIG9mIGEgU0NTSSBob3N0IGFkYXB0ZXIgZm9yIElERSBBVEFQSSBkZXZpY2VzLgorICoKKyAqIFdpdGggdGhpcyBkcml2ZXIsIG9uZSBjYW4gdXNlIHRoZSBMaW51eCBTQ1NJIGRyaXZlcnMgaW5zdGVhZCBvZiB0aGUKKyAqIG5hdGl2ZSBJREUgQVRBUEkgZHJpdmVycy4KKyAqCisgKiBWZXIgMC4xICAgRGVjICAzIDk2ICAgSW5pdGlhbCB2ZXJzaW9uLgorICogVmVyIDAuMiAgIEphbiAyNiA5NyAgIEZpeGVkIGJ1ZyBpbiBjbGVhbnVwX21vZHVsZSgpIGFuZCBhZGRlZCBlbXVsYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgb2YgTU9ERV9TRU5TRV82L01PREVfU0VMRUNUXzYgZm9yIGNkcm9tcy4gVGhhbmtzCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIEphbm9zIEZhcmthcyBmb3IgcG9pbnRpbmcgdGhpcyBvdXQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgQXZvaWQgdXNpbmcgYml0ZmllbGRzIGluIHN0cnVjdHVyZXMgZm9yIG02OGsuCisgKiAgICAgICAgICAgICAgICAgICAgICAgQWRkZWQgU2NhdHRlci9HYXRoZXIgYW5kIERNQSBzdXBwb3J0LgorICogVmVyIDAuNCAgIERlYyAgNyA5NyAgIEFkZCBzdXBwb3J0IGZvciBBVEFQSSBQRC9DRCBkcml2ZXMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgVXNlIHZhcmlhYmxlIHRpbWVvdXQgZm9yIGVhY2ggY29tbWFuZC4KKyAqIFZlciAwLjUgICBKYW4gIDIgOTggICBGaXggcHJldmlvdXMgUEQvQ0Qgc3VwcG9ydC4KKyAqICAgICAgICAgICAgICAgICAgICAgICBBbGxvdyBkaXNhYmxpbmcgb2YgU0NTSS02IHRvIFNDU0ktMTAgdHJhbnNmb3JtYXRpb24uCisgKiBWZXIgMC42ICAgSmFuIDI3IDk4ICAgQWxsb3cgZGlzYWJsaW5nIG9mIFNDU0kgY29tbWFuZCB0cmFuc2xhdGlvbiBsYXllcgorICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgYWNjZXNzIHRocm91Z2ggL2Rldi9zZy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBGaXggTU9ERV9TRU5TRV82L01PREVfU0VMRUNUXzYvSU5RVUlSWSB0cmFuc2xhdGlvbi4KKyAqIFZlciAwLjcgICBEZWMgMDQgOTggICBJZ25vcmUgY29tbWFuZHMgd2hlcmUgbHVuICE9IDAgdG8gYXZvaWQgbXVsdGlwbGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uIG9mIGRldmljZXMgd2l0aCBDT05GSUdfU0NTSV9NVUxUSV9MVU4KKyAqIFZlciAwLjggICBGZWIgMDUgOTkgICBPcHRpY2FsIG1lZGlhIG5lZWQgdHJhbnNsYXRpb24gdG9vLiBSZXZlcnNlIDAuNy4KKyAqIFZlciAwLjkgICBKdWwgMDQgOTkgICBGaXggYSBidWcgaW4gU0dfU0VUX1RSQU5TRk9STS4KKyAqIFZlciAwLjkxICBKdW4gMTAgMDIgICBGaXggIm9mZiBieSBvbmUiIGVycm9yIGluIHRyYW5zZm9ybXMKKyAqIFZlciAwLjkyICBEZWMgMzEgMDIgICBJbXBsZW1lbnQgbmV3IFNDU0kgbWlkIGxldmVsIEFQSQorICovCisKKyNkZWZpbmUgSURFU0NTSV9WRVJTSU9OICIwLjkyIgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisjaW5jbHVkZSA8c2NzaS9zZy5oPgorCisjZGVmaW5lIElERVNDU0lfREVCVUdfTE9HCQkwCisKK3R5cGVkZWYgc3RydWN0IGlkZXNjc2lfcGNfcyB7CisJdTggY1sxMl07CQkJCS8qIEFjdHVhbCBwYWNrZXQgYnl0ZXMgKi8KKwlpbnQgcmVxdWVzdF90cmFuc2ZlcjsJCQkvKiBCeXRlcyB0byB0cmFuc2ZlciAqLworCWludCBhY3R1YWxseV90cmFuc2ZlcnJlZDsJCS8qIEJ5dGVzIGFjdHVhbGx5IHRyYW5zZmVycmVkICovCisJaW50IGJ1ZmZlcl9zaXplOwkJCS8qIFNpemUgb2Ygb3VyIGRhdGEgYnVmZmVyICovCisJc3RydWN0IHJlcXVlc3QgKnJxOwkJCS8qIFRoZSBjb3JyZXNwb25kaW5nIHJlcXVlc3QgKi8KKwl1OCAqYnVmZmVyOwkJCQkvKiBEYXRhIGJ1ZmZlciAqLworCXU4ICpjdXJyZW50X3Bvc2l0aW9uOwkJCS8qIFBvaW50ZXIgaW50byB0aGUgYWJvdmUgYnVmZmVyICovCisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsJCQkvKiBTY2F0dGVyIGdhdGhlciB0YWJsZSAqLworCWludCBiX2NvdW50OwkJCQkvKiBCeXRlcyB0cmFuc2ZlcnJlZCBmcm9tIGN1cnJlbnQgZW50cnkgKi8KKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2NtZDsJCS8qIFNDU0kgY29tbWFuZCAqLworCXZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopOwkvKiBTY3NpIGNvbXBsZXRpb24gcm91dGluZSAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkJLyogU3RhdHVzL0FjdGlvbiBmbGFncyAqLworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsJCQkvKiBDb21tYW5kIHRpbWVvdXQgKi8KK30gaWRlc2NzaV9wY190OworCisvKgorICoJUGFja2V0IGNvbW1hbmQgc3RhdHVzIGJpdHMuCisgKi8KKyNkZWZpbmUgUENfRE1BX0lOX1BST0dSRVNTCQkwCS8qIDEgd2hpbGUgRE1BIGluIHByb2dyZXNzICovCisjZGVmaW5lIFBDX1dSSVRJTkcJCQkxCS8qIERhdGEgZGlyZWN0aW9uICovCisjZGVmaW5lIFBDX1RSQU5TRk9STQkJCTIJLyogdHJhbnNmb3JtIFNDU0kgY29tbWFuZHMgKi8KKyNkZWZpbmUgUENfVElNRURPVVQJCQkzCS8qIGNvbW1hbmQgdGltZWQgb3V0ICovCisjZGVmaW5lIFBDX0RNQV9PSwkJCTQJLyogVXNlIERNQSAqLworCisvKgorICoJU0NTSSBjb21tYW5kIHRyYW5zZm9ybWF0aW9uIGxheWVyCisgKi8KKyNkZWZpbmUgSURFU0NTSV9UUkFOU0ZPUk0JCTAJLyogRW5hYmxlL0Rpc2FibGUgdHJhbnNmb3JtYXRpb24gKi8KKyNkZWZpbmUgSURFU0NTSV9TR19UUkFOU0ZPUk0JCTEJLyogL2Rldi9zZyB0cmFuc2Zvcm1hdGlvbiAqLworCisvKgorICoJTG9nIGZsYWdzCisgKi8KKyNkZWZpbmUgSURFU0NTSV9MT0dfQ01ECQkJMAkvKiBMb2cgU0NTSSBjb21tYW5kcyAqLworCit0eXBlZGVmIHN0cnVjdCBpZGVfc2NzaV9vYmogeworCWlkZV9kcml2ZV90CQkqZHJpdmU7CisJaWRlX2RyaXZlcl90CQkqZHJpdmVyOworCXN0cnVjdCBnZW5kaXNrCQkqZGlzazsKKwlzdHJ1Y3QgU2NzaV9Ib3N0CSpob3N0OworCisJaWRlc2NzaV9wY190ICpwYzsJCQkvKiBDdXJyZW50IHBhY2tldCBjb21tYW5kICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsJCQkvKiBTdGF0dXMvQWN0aW9uIGZsYWdzICovCisJdW5zaWduZWQgbG9uZyB0cmFuc2Zvcm07CQkvKiBTQ1NJIGNtZCB0cmFuc2xhdGlvbiBsYXllciAqLworCXVuc2lnbmVkIGxvbmcgbG9nOwkJCS8qIGxvZyBmbGFncyAqLworfSBpZGVzY3NpX3Njc2lfdDsKKworc3RhdGljIERFQ0xBUkVfTVVURVgoaWRlc2NzaV9yZWZfc2VtKTsKKworI2RlZmluZSBpZGVfc2NzaV9nKGRpc2spIFwKKwljb250YWluZXJfb2YoKGRpc2spLT5wcml2YXRlX2RhdGEsIHN0cnVjdCBpZGVfc2NzaV9vYmosIGRyaXZlcikKKworc3RhdGljIHN0cnVjdCBpZGVfc2NzaV9vYmogKmlkZV9zY3NpX2dldChzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlzdHJ1Y3QgaWRlX3Njc2lfb2JqICpzY3NpID0gTlVMTDsKKworCWRvd24oJmlkZXNjc2lfcmVmX3NlbSk7CisJc2NzaSA9IGlkZV9zY3NpX2coZGlzayk7CisJaWYgKHNjc2kpCisJCXNjc2lfaG9zdF9nZXQoc2NzaS0+aG9zdCk7CisJdXAoJmlkZXNjc2lfcmVmX3NlbSk7CisJcmV0dXJuIHNjc2k7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9zY3NpX3B1dChzdHJ1Y3QgaWRlX3Njc2lfb2JqICpzY3NpKQoreworCWRvd24oJmlkZXNjc2lfcmVmX3NlbSk7CisJc2NzaV9ob3N0X3B1dChzY3NpLT5ob3N0KTsKKwl1cCgmaWRlc2NzaV9yZWZfc2VtKTsKK30KKworc3RhdGljIGlubGluZSBpZGVzY3NpX3Njc2lfdCAqc2NzaWhvc3RfdG9faWRlc2NzaShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXJldHVybiAoaWRlc2NzaV9zY3NpX3QqKSAoJmhvc3RbMV0pOworfQorCitzdGF0aWMgaW5saW5lIGlkZXNjc2lfc2NzaV90ICpkcml2ZV90b19pZGVzY3NpKGlkZV9kcml2ZV90ICppZGVfZHJpdmUpCit7CisJcmV0dXJuIHNjc2lob3N0X3RvX2lkZXNjc2koaWRlX2RyaXZlLT5kcml2ZXJfZGF0YSk7Cit9CisKKy8qCisgKglQZXIgQVRBUEkgZGV2aWNlIHN0YXR1cyBiaXRzLgorICovCisjZGVmaW5lIElERVNDU0lfRFJRX0lOVEVSUlVQVAkJMAkvKiBEUlEgaW50ZXJydXB0IGRldmljZSAqLworCisvKgorICoJaWRlLXNjc2kgcmVxdWVzdHMuCisgKi8KKyNkZWZpbmUgSURFU0NTSV9QQ19SUQkJCTkwCisKK3N0YXRpYyB2b2lkIGlkZXNjc2lfZGlzY2FyZF9kYXRhIChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGludCBiY291bnQpCit7CisJd2hpbGUgKGJjb3VudC0tKQorCQkodm9pZCkgSFdJRihkcml2ZSktPklOQihJREVfREFUQV9SRUcpOworfQorCitzdGF0aWMgdm9pZCBpZGVzY3NpX291dHB1dF96ZXJvcyAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBpbnQgYmNvdW50KQoreworCXdoaWxlIChiY291bnQtLSkKKwkJSFdJRihkcml2ZSktPk9VVEIoMCwgSURFX0RBVEFfUkVHKTsKK30KKworLyoKKyAqCVBJTyBkYXRhIHRyYW5zZmVyIHJvdXRpbmVzIHVzaW5nIHRoZSBzY2F0dGVyIGdhdGhlciB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQgaWRlc2NzaV9pbnB1dF9idWZmZXJzIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZXNjc2lfcGNfdCAqcGMsIHVuc2lnbmVkIGludCBiY291bnQpCit7CisJaW50IGNvdW50OworCWNoYXIgKmJ1ZjsKKworCXdoaWxlIChiY291bnQpIHsKKwkJaWYgKHBjLT5zZyAtIChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgcGMtPnNjc2lfY21kLT5yZXF1ZXN0X2J1ZmZlciA+IHBjLT5zY3NpX2NtZC0+dXNlX3NnKSB7CisJCQlwcmludGsgKEtFUk5fRVJSICJpZGUtc2NzaTogc2NhdHRlciBnYXRoZXIgdGFibGUgdG9vIHNtYWxsLCBkaXNjYXJkaW5nIGRhdGFcbiIpOworCQkJaWRlc2NzaV9kaXNjYXJkX2RhdGEgKGRyaXZlLCBiY291bnQpOworCQkJcmV0dXJuOworCQl9CisJCWNvdW50ID0gbWluKHBjLT5zZy0+bGVuZ3RoIC0gcGMtPmJfY291bnQsIGJjb3VudCk7CisJCWJ1ZiA9IHBhZ2VfYWRkcmVzcyhwYy0+c2ctPnBhZ2UpICsgcGMtPnNnLT5vZmZzZXQ7CisJCWRyaXZlLT5od2lmLT5hdGFwaV9pbnB1dF9ieXRlcyhkcml2ZSwgYnVmICsgcGMtPmJfY291bnQsIGNvdW50KTsKKwkJYmNvdW50IC09IGNvdW50OyBwYy0+Yl9jb3VudCArPSBjb3VudDsKKwkJaWYgKHBjLT5iX2NvdW50ID09IHBjLT5zZy0+bGVuZ3RoKSB7CisJCQlwYy0+c2crKzsKKwkJCXBjLT5iX2NvdW50ID0gMDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaWRlc2NzaV9vdXRwdXRfYnVmZmVycyAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVzY3NpX3BjX3QgKnBjLCB1bnNpZ25lZCBpbnQgYmNvdW50KQoreworCWludCBjb3VudDsKKwljaGFyICpidWY7CisKKwl3aGlsZSAoYmNvdW50KSB7CisJCWlmIChwYy0+c2cgLSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIHBjLT5zY3NpX2NtZC0+cmVxdWVzdF9idWZmZXIgPiBwYy0+c2NzaV9jbWQtPnVzZV9zZykgeworCQkJcHJpbnRrIChLRVJOX0VSUiAiaWRlLXNjc2k6IHNjYXR0ZXIgZ2F0aGVyIHRhYmxlIHRvbyBzbWFsbCwgcGFkZGluZyB3aXRoIHplcm9zXG4iKTsKKwkJCWlkZXNjc2lfb3V0cHV0X3plcm9zIChkcml2ZSwgYmNvdW50KTsKKwkJCXJldHVybjsKKwkJfQorCQljb3VudCA9IG1pbihwYy0+c2ctPmxlbmd0aCAtIHBjLT5iX2NvdW50LCBiY291bnQpOworCQlidWYgPSBwYWdlX2FkZHJlc3MocGMtPnNnLT5wYWdlKSArIHBjLT5zZy0+b2Zmc2V0OworCQlkcml2ZS0+aHdpZi0+YXRhcGlfb3V0cHV0X2J5dGVzKGRyaXZlLCBidWYgKyBwYy0+Yl9jb3VudCwgY291bnQpOworCQliY291bnQgLT0gY291bnQ7IHBjLT5iX2NvdW50ICs9IGNvdW50OworCQlpZiAocGMtPmJfY291bnQgPT0gcGMtPnNnLT5sZW5ndGgpIHsKKwkJCXBjLT5zZysrOworCQkJcGMtPmJfY291bnQgPSAwOworCQl9CisJfQorfQorCisvKgorICoJTW9zdCBvZiB0aGUgU0NTSSBjb21tYW5kcyBhcmUgc3VwcG9ydGVkIGRpcmVjdGx5IGJ5IEFUQVBJIGRldmljZXMuCisgKglpZGVzY3NpX3RyYW5zZm9ybV9wYyBoYW5kbGVzIHRoZSBmZXcgZXhjZXB0aW9ucy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlkZXNjc2lfdHJhbnNmb3JtX3BjMSAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVzY3NpX3BjX3QgKnBjKQoreworCXU4ICpjID0gcGMtPmMsICpzY3NpX2J1ZiA9IHBjLT5idWZmZXIsICpzYyA9IHBjLT5zY3NpX2NtZC0+Y21uZDsKKwljaGFyICphdGFwaV9idWY7CisKKwlpZiAoIXRlc3RfYml0KFBDX1RSQU5TRk9STSwgJnBjLT5mbGFncykpCisJCXJldHVybjsKKwlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV9jZHJvbSB8fCBkcml2ZS0+bWVkaWEgPT0gaWRlX29wdGljYWwpIHsKKwkJaWYgKGNbMF0gPT0gUkVBRF82IHx8IGNbMF0gPT0gV1JJVEVfNikgeworCQkJY1s4XSA9IGNbNF07CQljWzVdID0gY1szXTsJCWNbNF0gPSBjWzJdOworCQkJY1szXSA9IGNbMV0gJiAweDFmOwljWzJdID0gMDsJCWNbMV0gJj0gMHhlMDsKKwkJCWNbMF0gKz0gKFJFQURfMTAgLSBSRUFEXzYpOworCQl9CisJCWlmIChjWzBdID09IE1PREVfU0VOU0UgfHwgY1swXSA9PSBNT0RFX1NFTEVDVCkgeworCQkJdW5zaWduZWQgc2hvcnQgbmV3X2xlbjsKKwkJCWlmICghc2NzaV9idWYpCisJCQkJcmV0dXJuOworCQkJaWYgKChhdGFwaV9idWYgPSBrbWFsbG9jKHBjLT5idWZmZXJfc2l6ZSArIDQsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQkJCXJldHVybjsKKwkJCW1lbXNldChhdGFwaV9idWYsIDAsIHBjLT5idWZmZXJfc2l6ZSArIDQpOworCQkJbWVtc2V0IChjLCAwLCAxMik7CisJCQljWzBdID0gc2NbMF0gfCAweDQwOworCQkJY1sxXSA9IHNjWzFdOworCQkJY1syXSA9IHNjWzJdOworCQkJbmV3X2xlbiA9IHNjWzRdICsgNDsKKwkJCWNbOF0gPSBuZXdfbGVuOworCQkJY1s3XSA9IG5ld19sZW4gPj4gODsKKwkJCWNbOV0gPSBzY1s1XTsKKwkJCWlmIChjWzBdID09IE1PREVfU0VMRUNUXzEwKSB7CisJCQkJYXRhcGlfYnVmWzFdID0gc2NzaV9idWZbMF07CS8qIE1vZGUgZGF0YSBsZW5ndGggKi8KKwkJCQlhdGFwaV9idWZbMl0gPSBzY3NpX2J1ZlsxXTsJLyogTWVkaXVtIHR5cGUgKi8KKwkJCQlhdGFwaV9idWZbM10gPSBzY3NpX2J1ZlsyXTsJLyogRGV2aWNlIHNwZWNpZmljIHBhcmFtZXRlciAqLworCQkJCWF0YXBpX2J1Zls3XSA9IHNjc2lfYnVmWzNdOwkvKiBCbG9jayBkZXNjcmlwdG9yIGxlbmd0aCAqLworCQkJCW1lbWNweShhdGFwaV9idWYgKyA4LCBzY3NpX2J1ZiArIDQsIHBjLT5idWZmZXJfc2l6ZSAtIDQpOworCQkJfQorCQkJcGMtPmJ1ZmZlciA9IGF0YXBpX2J1ZjsKKwkJCXBjLT5yZXF1ZXN0X3RyYW5zZmVyICs9IDQ7CisJCQlwYy0+YnVmZmVyX3NpemUgKz0gNDsKKwkJfQorCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGlkZXNjc2lfdHJhbnNmb3JtX3BjMiAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVzY3NpX3BjX3QgKnBjKQoreworCXU4ICphdGFwaV9idWYgPSBwYy0+YnVmZmVyOworCXU4ICpzYyA9IHBjLT5zY3NpX2NtZC0+Y21uZDsKKwl1OCAqc2NzaV9idWYgPSBwYy0+c2NzaV9jbWQtPnJlcXVlc3RfYnVmZmVyOworCisJaWYgKCF0ZXN0X2JpdChQQ19UUkFOU0ZPUk0sICZwYy0+ZmxhZ3MpKQorCQlyZXR1cm47CisJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfY2Ryb20gfHwgZHJpdmUtPm1lZGlhID09IGlkZV9vcHRpY2FsKSB7CisJCWlmIChwYy0+Y1swXSA9PSBNT0RFX1NFTlNFXzEwICYmIHNjWzBdID09IE1PREVfU0VOU0UpIHsKKwkJCXNjc2lfYnVmWzBdID0gYXRhcGlfYnVmWzFdOwkJLyogTW9kZSBkYXRhIGxlbmd0aCAqLworCQkJc2NzaV9idWZbMV0gPSBhdGFwaV9idWZbMl07CQkvKiBNZWRpdW0gdHlwZSAqLworCQkJc2NzaV9idWZbMl0gPSBhdGFwaV9idWZbM107CQkvKiBEZXZpY2Ugc3BlY2lmaWMgcGFyYW1ldGVyICovCisJCQlzY3NpX2J1ZlszXSA9IGF0YXBpX2J1Zls3XTsJCS8qIEJsb2NrIGRlc2NyaXB0b3IgbGVuZ3RoICovCisJCQltZW1jcHkoc2NzaV9idWYgKyA0LCBhdGFwaV9idWYgKyA4LCBwYy0+cmVxdWVzdF90cmFuc2ZlciAtIDgpOworCQl9CisJCWlmIChwYy0+Y1swXSA9PSBJTlFVSVJZKSB7CisJCQlzY3NpX2J1ZlsyXSB8PSAyOwkJCS8qIGFuc2lfcmV2aXNpb24gKi8KKwkJCXNjc2lfYnVmWzNdID0gKHNjc2lfYnVmWzNdICYgMHhmMCkgfCAyOwkvKiByZXNwb25zZSBkYXRhIGZvcm1hdCAqLworCQl9CisJfQorCWlmIChhdGFwaV9idWYgJiYgYXRhcGlfYnVmICE9IHNjc2lfYnVmKQorCQlrZnJlZShhdGFwaV9idWYpOworfQorCitzdGF0aWMgdm9pZCBoZXhkdW1wKHU4ICp4LCBpbnQgbGVuKQoreworCWludCBpOworCisJcHJpbnRrKCJbICIpOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJcHJpbnRrKCIleCAiLCB4W2ldKTsKKwlwcmludGsoIl1cbiIpOworfQorCitzdGF0aWMgaW50IGlkZXNjc2lfY2hlY2tfY29uZGl0aW9uKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKmZhaWxlZF9jb21tYW5kKQoreworCWlkZXNjc2lfc2NzaV90ICpzY3NpID0gZHJpdmVfdG9faWRlc2NzaShkcml2ZSk7CisJaWRlc2NzaV9wY190ICAgKnBjOworCXN0cnVjdCByZXF1ZXN0ICpycTsKKwl1OCAgICAgICAgICAgICAqYnVmOworCisJLyogc3R1ZmYgYSBzZW5zZSByZXF1ZXN0IGluIGZyb250IG9mIG91ciBjdXJyZW50IHJlcXVlc3QgKi8KKwlwYyA9IGttYWxsb2MgKHNpemVvZiAoaWRlc2NzaV9wY190KSwgR0ZQX0FUT01JQyk7CisJcnEgPSBrbWFsbG9jIChzaXplb2YgKHN0cnVjdCByZXF1ZXN0KSwgR0ZQX0FUT01JQyk7CisJYnVmID0ga21hbGxvYyhTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsIEdGUF9BVE9NSUMpOworCWlmIChwYyA9PSBOVUxMIHx8IHJxID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKKwkJaWYgKHBjKSBrZnJlZShwYyk7CisJCWlmIChycSkga2ZyZWUocnEpOworCQlpZiAoYnVmKSBrZnJlZShidWYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0IChwYywgMCwgc2l6ZW9mIChpZGVzY3NpX3BjX3QpKTsKKwltZW1zZXQgKGJ1ZiwgMCwgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKKwlpZGVfaW5pdF9kcml2ZV9jbWQocnEpOworCXJxLT5zcGVjaWFsID0gKGNoYXIgKikgcGM7CisJcGMtPnJxID0gcnE7CisJcGMtPmJ1ZmZlciA9IGJ1ZjsKKwlwYy0+Y1swXSA9IFJFUVVFU1RfU0VOU0U7CisJcGMtPmNbNF0gPSBwYy0+cmVxdWVzdF90cmFuc2ZlciA9IHBjLT5idWZmZXJfc2l6ZSA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKKwlycS0+ZmxhZ3MgPSBSRVFfU0VOU0U7CisJcGMtPnRpbWVvdXQgPSBqaWZmaWVzICsgV0FJVF9SRUFEWTsKKwkvKiBOT1RFISBTYXZlIHRoZSBmYWlsZWQgcGFja2V0IGNvbW1hbmQgaW4gInJxLT5idWZmZXIiICovCisJcnEtPmJ1ZmZlciA9ICh2b2lkICopIGZhaWxlZF9jb21tYW5kLT5zcGVjaWFsOworCXBjLT5zY3NpX2NtZCA9ICgoaWRlc2NzaV9wY190ICopIGZhaWxlZF9jb21tYW5kLT5zcGVjaWFsKS0+c2NzaV9jbWQ7CisJaWYgKHRlc3RfYml0KElERVNDU0lfTE9HX0NNRCwgJnNjc2ktPmxvZykpIHsKKwkJcHJpbnRrICgiaWRlLXNjc2k6ICVzOiBxdWV1ZSBjbWQgPSAiLCBkcml2ZS0+bmFtZSk7CisJCWhleGR1bXAocGMtPmMsIDYpOworCX0KKwlycS0+cnFfZGlzayA9IHNjc2ktPmRpc2s7CisJcmV0dXJuIGlkZV9kb19kcml2ZV9jbWQoZHJpdmUsIHJxLCBpZGVfcHJlZW1wdCk7Cit9CisKK3N0YXRpYyBpbnQgaWRlc2NzaV9lbmRfcmVxdWVzdChpZGVfZHJpdmVfdCAqLCBpbnQsIGludCk7CisKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QKK2lkZXNjc2lfYXRhcGlfZXJyb3IoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHU4IHN0YXQsIHU4IGVycikKK3sKKwlpZiAoSFdJRihkcml2ZSktPklOQihJREVfU1RBVFVTX1JFRykgJiAoQlVTWV9TVEFUfERSUV9TVEFUKSkKKwkJLyogZm9yY2UgYW4gYWJvcnQgKi8KKwkJSFdJRihkcml2ZSktPk9VVEIoV0lOX0lETEVJTU1FRElBVEUsSURFX0NPTU1BTkRfUkVHKTsKKworCXJxLT5lcnJvcnMrKzsKKworCWlkZXNjc2lfZW5kX3JlcXVlc3QoZHJpdmUsIDAsIDApOworCisJcmV0dXJuIGlkZV9zdG9wcGVkOworfQorCitzdGF0aWMgaWRlX3N0YXJ0c3RvcF90CitpZGVzY3NpX2F0YXBpX2Fib3J0KGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQoreworI2lmIElERVNDU0lfREVCVUdfTE9HCisJcHJpbnRrKEtFUk5fV0FSTklORyAiaWRlc2NzaV9hdGFwaV9hYm9ydCBjYWxsZWQgZm9yICVsdVxuIiwKKwkJCSgoaWRlc2NzaV9wY190ICopIHJxLT5zcGVjaWFsKS0+c2NzaV9jbWQtPnNlcmlhbF9udW1iZXIpOworI2VuZGlmCisJcnEtPmVycm9ycyB8PSBFUlJPUl9NQVg7CisKKwlpZGVzY3NpX2VuZF9yZXF1ZXN0KGRyaXZlLCAwLCAwKTsKKworCXJldHVybiBpZGVfc3RvcHBlZDsKK30KKworc3RhdGljIGludCBpZGVzY3NpX2VuZF9yZXF1ZXN0IChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCB1cHRvZGF0ZSwgaW50IG5yc2VjcykKK3sKKwlpZGVzY3NpX3Njc2lfdCAqc2NzaSA9IGRyaXZlX3RvX2lkZXNjc2koZHJpdmUpOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwlpZGVzY3NpX3BjX3QgKnBjID0gKGlkZXNjc2lfcGNfdCAqKSBycS0+c3BlY2lhbDsKKwlpbnQgbG9nID0gdGVzdF9iaXQoSURFU0NTSV9MT0dfQ01ELCAmc2NzaS0+bG9nKTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXU4ICpzY3NpX2J1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCEocnEtPmZsYWdzICYgKFJFUV9TUEVDSUFMfFJFUV9TRU5TRSkpKSB7CisJCWlkZV9lbmRfcmVxdWVzdChkcml2ZSwgdXB0b2RhdGUsIG5yc2Vjcyk7CisJCXJldHVybiAwOworCX0KKwlpZGVfZW5kX2RyaXZlX2NtZCAoZHJpdmUsIDAsIDApOworCWlmIChycS0+ZmxhZ3MgJiBSRVFfU0VOU0UpIHsKKwkJaWRlc2NzaV9wY190ICpvcGMgPSAoaWRlc2NzaV9wY190ICopIHJxLT5idWZmZXI7CisJCWlmIChsb2cpIHsKKwkJCXByaW50ayAoImlkZS1zY3NpOiAlczogd3JhcCB1cCBjaGVjayAlbHUsIHJzdCA9ICIsIGRyaXZlLT5uYW1lLCBvcGMtPnNjc2lfY21kLT5zZXJpYWxfbnVtYmVyKTsKKwkJCWhleGR1bXAocGMtPmJ1ZmZlciwxNik7CisJCX0KKwkJbWVtY3B5KCh2b2lkICopIG9wYy0+c2NzaV9jbWQtPnNlbnNlX2J1ZmZlciwgcGMtPmJ1ZmZlciwgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKKwkJa2ZyZWUocGMtPmJ1ZmZlcik7CisJCWtmcmVlKHBjKTsKKwkJa2ZyZWUocnEpOworCQlwYyA9IG9wYzsKKwkJcnEgPSBwYy0+cnE7CisJCXBjLT5zY3NpX2NtZC0+cmVzdWx0ID0gKENIRUNLX0NPTkRJVElPTiA8PCAxKSB8CisJCQkJCSgodGVzdF9iaXQoUENfVElNRURPVVQsICZwYy0+ZmxhZ3MpP0RJRF9USU1FX09VVDpESURfT0spIDw8IDE2KTsKKwl9IGVsc2UgaWYgKHRlc3RfYml0KFBDX1RJTUVET1VULCAmcGMtPmZsYWdzKSkgeworCQlpZiAobG9nKQorCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgImlkZS1zY3NpOiAlczogdGltZWQgb3V0IGZvciAlbHVcbiIsCisJCQkJCWRyaXZlLT5uYW1lLCBwYy0+c2NzaV9jbWQtPnNlcmlhbF9udW1iZXIpOworCQlwYy0+c2NzaV9jbWQtPnJlc3VsdCA9IERJRF9USU1FX09VVCA8PCAxNjsKKwl9IGVsc2UgaWYgKHJxLT5lcnJvcnMgPj0gRVJST1JfTUFYKSB7CisJCXBjLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlpZiAobG9nKQorCQkJcHJpbnRrICgiaWRlLXNjc2k6ICVzOiBJL08gZXJyb3IgZm9yICVsdVxuIiwgZHJpdmUtPm5hbWUsIHBjLT5zY3NpX2NtZC0+c2VyaWFsX251bWJlcik7CisJfSBlbHNlIGlmIChycS0+ZXJyb3JzKSB7CisJCWlmIChsb2cpCisJCQlwcmludGsgKCJpZGUtc2NzaTogJXM6IGNoZWNrIGNvbmRpdGlvbiBmb3IgJWx1XG4iLCBkcml2ZS0+bmFtZSwgcGMtPnNjc2lfY21kLT5zZXJpYWxfbnVtYmVyKTsKKwkJaWYgKCFpZGVzY3NpX2NoZWNrX2NvbmRpdGlvbihkcml2ZSwgcnEpKQorCQkJLyogd2Ugc3RhcnRlZCBhIHJlcXVlc3Qgc2Vuc2UsIHNvIHdlJ2xsIGJlIGJhY2ssIGV4aXQgZm9yIG5vdyAqLworCQkJcmV0dXJuIDA7CisJCXBjLT5zY3NpX2NtZC0+cmVzdWx0ID0gKENIRUNLX0NPTkRJVElPTiA8PCAxKSB8IChESURfT0sgPDwgMTYpOworCX0gZWxzZSB7CisJCXBjLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCQlpZGVzY3NpX3RyYW5zZm9ybV9wYzIgKGRyaXZlLCBwYyk7CisJCWlmIChsb2cpIHsKKwkJCXByaW50ayAoImlkZS1zY3NpOiAlczogc3VjICVsdSIsIGRyaXZlLT5uYW1lLCBwYy0+c2NzaV9jbWQtPnNlcmlhbF9udW1iZXIpOworCQkJaWYgKCF0ZXN0X2JpdChQQ19XUklUSU5HLCAmcGMtPmZsYWdzKSAmJiBwYy0+YWN0dWFsbHlfdHJhbnNmZXJyZWQgJiYgcGMtPmFjdHVhbGx5X3RyYW5zZmVycmVkIDw9IDEwMjQgJiYgcGMtPmJ1ZmZlcikgeworCQkJCXByaW50aygiLCByc3QgPSAiKTsKKwkJCQlzY3NpX2J1ZiA9IHBjLT5zY3NpX2NtZC0+cmVxdWVzdF9idWZmZXI7CisJCQkJaGV4ZHVtcChzY3NpX2J1ZiwgbWluX3QodW5zaWduZWQsIDE2LCBwYy0+c2NzaV9jbWQtPnJlcXVlc3RfYnVmZmxlbikpOworCQkJfSBlbHNlIHByaW50aygiXG4iKTsKKwkJfQorCX0KKwlob3N0ID0gcGMtPnNjc2lfY21kLT5kZXZpY2UtPmhvc3Q7CisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcGMtPmRvbmUocGMtPnNjc2lfY21kKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWtmcmVlKHBjKTsKKwlrZnJlZShycSk7CisJc2NzaS0+cGMgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3RpbWVvdXQoaWRlc2NzaV9wY190ICpwYykKK3sKKwlyZXR1cm4gbWF4X3QodW5zaWduZWQgbG9uZywgV0FJVF9DTUQsIHBjLT50aW1lb3V0IC0gamlmZmllcyk7Cit9CisKK3N0YXRpYyBpbnQgaWRlc2NzaV9leHBpcnkoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZXNjc2lfc2NzaV90ICpzY3NpID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCWlkZXNjc2lfcGNfdCAgICpwYyAgID0gc2NzaS0+cGM7CisKKyNpZiBJREVTQ1NJX0RFQlVHX0xPRworCXByaW50ayhLRVJOX1dBUk5JTkcgImlkZXNjc2lfZXhwaXJ5IGNhbGxlZCBmb3IgJWx1IGF0ICVsdVxuIiwgcGMtPnNjc2lfY21kLT5zZXJpYWxfbnVtYmVyLCBqaWZmaWVzKTsKKyNlbmRpZgorCXNldF9iaXQoUENfVElNRURPVVQsICZwYy0+ZmxhZ3MpOworCisJcmV0dXJuIDA7CQkJCQkvKiB3ZSBkbyBub3Qgd2FudCB0aGUgaWRlIHN1YnN5c3RlbSB0byByZXRyeSAqLworfQorCisvKgorICoJT3VyIGludGVycnVwdCBoYW5kbGVyLgorICovCitzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGlkZXNjc2lfcGNfaW50ciAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZXNjc2lfc2NzaV90ICpzY3NpID0gZHJpdmVfdG9faWRlc2NzaShkcml2ZSk7CisJaWRlc2NzaV9wY190ICpwYz1zY3NpLT5wYzsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBwYy0+cnE7CisJYXRhcGlfYmNvdW50X3QgYmNvdW50OworCWF0YXBpX3N0YXR1c190IHN0YXR1czsKKwlhdGFwaV9pcmVhc29uX3QgaXJlYXNvbjsKKwlhdGFwaV9mZWF0dXJlX3QgZmVhdHVyZTsKKworCXVuc2lnbmVkIGludCB0ZW1wOworCisjaWYgSURFU0NTSV9ERUJVR19MT0cKKwlwcmludGsgKEtFUk5fSU5GTyAiaWRlLXNjc2k6IFJlYWNoZWQgaWRlc2NzaV9wY19pbnRyIGludGVycnVwdCBoYW5kbGVyXG4iKTsKKyNlbmRpZiAvKiBJREVTQ1NJX0RFQlVHX0xPRyAqLworCisJaWYgKHRlc3RfYml0KFBDX1RJTUVET1VULCAmcGMtPmZsYWdzKSl7CisjaWYgSURFU0NTSV9ERUJVR19MT0cKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaWRlc2NzaV9wY19pbnRyOiBnb3QgdGltZWQgb3V0IHBhY2tldCAgJWx1IGF0ICVsdVxuIiwKKwkJCQlwYy0+c2NzaV9jbWQtPnNlcmlhbF9udW1iZXIsIGppZmZpZXMpOworI2VuZGlmCisJCS8qIGVuZCB0aGlzIHJlcXVlc3Qgbm93IC0gc2NzaSBzaG91bGQgcmV0cnkgaXQqLworCQlpZGVzY3NpX2VuZF9yZXF1ZXN0IChkcml2ZSwgMSwgMCk7CisJCXJldHVybiBpZGVfc3RvcHBlZDsKKwl9CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCAoUENfRE1BX0lOX1BST0dSRVNTLCAmcGMtPmZsYWdzKSkgeworI2lmIElERVNDU0lfREVCVUdfTE9HCisJCXByaW50ayAoImlkZS1zY3NpOiAlczogRE1BIGNvbXBsZXRlXG4iLCBkcml2ZS0+bmFtZSk7CisjZW5kaWYgLyogSURFU0NTSV9ERUJVR19MT0cgKi8KKwkJcGMtPmFjdHVhbGx5X3RyYW5zZmVycmVkPXBjLT5yZXF1ZXN0X3RyYW5zZmVyOworCQkodm9pZCkgSFdJRihkcml2ZSktPmlkZV9kbWFfZW5kKGRyaXZlKTsKKwl9CisKKwlmZWF0dXJlLmFsbCA9IDA7CisJLyogQ2xlYXIgdGhlIGludGVycnVwdCAqLworCXN0YXR1cy5hbGwgPSBIV0lGKGRyaXZlKS0+SU5CKElERV9TVEFUVVNfUkVHKTsKKworCWlmICghc3RhdHVzLmIuZHJxKSB7CisJCS8qIE5vIG1vcmUgaW50ZXJydXB0cyAqLworCQlpZiAodGVzdF9iaXQoSURFU0NTSV9MT0dfQ01ELCAmc2NzaS0+bG9nKSkKKwkJCXByaW50ayAoS0VSTl9JTkZPICJQYWNrZXQgY29tbWFuZCBjb21wbGV0ZWQsICVkIGJ5dGVzIHRyYW5zZmVycmVkXG4iLCBwYy0+YWN0dWFsbHlfdHJhbnNmZXJyZWQpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCWlmIChzdGF0dXMuYi5jaGVjaykKKwkJCXJxLT5lcnJvcnMrKzsKKwkJaWRlc2NzaV9lbmRfcmVxdWVzdCAoZHJpdmUsIDEsIDApOworCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisJfQorCWJjb3VudC5iLmxvdwk9IEhXSUYoZHJpdmUpLT5JTkIoSURFX0JDT1VOVExfUkVHKTsKKwliY291bnQuYi5oaWdoCT0gSFdJRihkcml2ZSktPklOQihJREVfQkNPVU5USF9SRUcpOworCWlyZWFzb24uYWxsCT0gSFdJRihkcml2ZSktPklOQihJREVfSVJFQVNPTl9SRUcpOworCisJaWYgKGlyZWFzb24uYi5jb2QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtc2NzaTogQ29EICE9IDAgaW4gaWRlc2NzaV9wY19pbnRyXG4iKTsKKwkJcmV0dXJuIGlkZV9kb19yZXNldCAoZHJpdmUpOworCX0KKwlpZiAoaXJlYXNvbi5iLmlvKSB7CisJCXRlbXAgPSBwYy0+YWN0dWFsbHlfdHJhbnNmZXJyZWQgKyBiY291bnQuYWxsOworCQlpZiAodGVtcCA+IHBjLT5yZXF1ZXN0X3RyYW5zZmVyKSB7CisJCQlpZiAodGVtcCA+IHBjLT5idWZmZXJfc2l6ZSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiaWRlLXNjc2k6IFRoZSBzY3NpIHdhbnRzIHRvICIKKwkJCQkJInNlbmQgdXMgbW9yZSBkYXRhIHRoYW4gZXhwZWN0ZWQgIgorCQkJCQkiLSBkaXNjYXJkaW5nIGRhdGFcbiIpOworCQkJCXRlbXAgPSBwYy0+YnVmZmVyX3NpemUgLSBwYy0+YWN0dWFsbHlfdHJhbnNmZXJyZWQ7CisJCQkJaWYgKHRlbXApIHsKKwkJCQkJY2xlYXJfYml0KFBDX1dSSVRJTkcsICZwYy0+ZmxhZ3MpOworCQkJCQlpZiAocGMtPnNnKQorCQkJCQkJaWRlc2NzaV9pbnB1dF9idWZmZXJzKGRyaXZlLCBwYywgdGVtcCk7CisJCQkJCWVsc2UKKwkJCQkJCWRyaXZlLT5od2lmLT5hdGFwaV9pbnB1dF9ieXRlcyhkcml2ZSwgcGMtPmN1cnJlbnRfcG9zaXRpb24sIHRlbXApOworCQkJCQlwcmludGsoS0VSTl9FUlIgImlkZS1zY3NpOiB0cmFuc2ZlcnJlZCAlZCBvZiAlZCBieXRlc1xuIiwgdGVtcCwgYmNvdW50LmFsbCk7CisJCQkJfQorCQkJCXBjLT5hY3R1YWxseV90cmFuc2ZlcnJlZCArPSB0ZW1wOworCQkJCXBjLT5jdXJyZW50X3Bvc2l0aW9uICs9IHRlbXA7CisJCQkJaWRlc2NzaV9kaXNjYXJkX2RhdGEoZHJpdmUsIGJjb3VudC5hbGwgLSB0ZW1wKTsKKwkJCQlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZpZGVzY3NpX3BjX2ludHIsIGdldF90aW1lb3V0KHBjKSwgaWRlc2NzaV9leHBpcnkpOworCQkJCXJldHVybiBpZGVfc3RhcnRlZDsKKwkJCX0KKyNpZiBJREVTQ1NJX0RFQlVHX0xPRworCQkJcHJpbnRrIChLRVJOX05PVElDRSAiaWRlLXNjc2k6IFRoZSBzY3NpIHdhbnRzIHRvIHNlbmQgdXMgbW9yZSBkYXRhIHRoYW4gZXhwZWN0ZWQgLSBhbGxvd2luZyB0cmFuc2ZlclxuIik7CisjZW5kaWYgLyogSURFU0NTSV9ERUJVR19MT0cgKi8KKwkJfQorCX0KKwlpZiAoaXJlYXNvbi5iLmlvKSB7CisJCWNsZWFyX2JpdChQQ19XUklUSU5HLCAmcGMtPmZsYWdzKTsKKwkJaWYgKHBjLT5zZykKKwkJCWlkZXNjc2lfaW5wdXRfYnVmZmVycyhkcml2ZSwgcGMsIGJjb3VudC5hbGwpOworCQllbHNlCisJCQlIV0lGKGRyaXZlKS0+YXRhcGlfaW5wdXRfYnl0ZXMoZHJpdmUsIHBjLT5jdXJyZW50X3Bvc2l0aW9uLCBiY291bnQuYWxsKTsKKwl9IGVsc2UgeworCQlzZXRfYml0KFBDX1dSSVRJTkcsICZwYy0+ZmxhZ3MpOworCQlpZiAocGMtPnNnKQorCQkJaWRlc2NzaV9vdXRwdXRfYnVmZmVycyAoZHJpdmUsIHBjLCBiY291bnQuYWxsKTsKKwkJZWxzZQorCQkJSFdJRihkcml2ZSktPmF0YXBpX291dHB1dF9ieXRlcyhkcml2ZSwgcGMtPmN1cnJlbnRfcG9zaXRpb24sIGJjb3VudC5hbGwpOworCX0KKwkvKiBVcGRhdGUgdGhlIGN1cnJlbnQgcG9zaXRpb24gKi8KKwlwYy0+YWN0dWFsbHlfdHJhbnNmZXJyZWQgKz0gYmNvdW50LmFsbDsKKwlwYy0+Y3VycmVudF9wb3NpdGlvbiArPSBiY291bnQuYWxsOworCisJLyogQW5kIHNldCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgYWdhaW4gKi8KKwlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZpZGVzY3NpX3BjX2ludHIsIGdldF90aW1lb3V0KHBjKSwgaWRlc2NzaV9leHBpcnkpOworCXJldHVybiBpZGVfc3RhcnRlZDsKK30KKworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGVzY3NpX3RyYW5zZmVyX3BjKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJaWRlc2NzaV9zY3NpX3QgKnNjc2kgPSBkcml2ZV90b19pZGVzY3NpKGRyaXZlKTsKKwlpZGVzY3NpX3BjX3QgKnBjID0gc2NzaS0+cGM7CisJYXRhcGlfaXJlYXNvbl90IGlyZWFzb247CisJaWRlX3N0YXJ0c3RvcF90IHN0YXJ0c3RvcDsKKworCWlmIChpZGVfd2FpdF9zdGF0KCZzdGFydHN0b3AsZHJpdmUsRFJRX1NUQVQsQlVTWV9TVEFULFdBSVRfUkVBRFkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWRlLXNjc2k6IFN0cmFuZ2UsIHBhY2tldCBjb21tYW5kICIKKwkJCSJpbml0aWF0ZWQgeWV0IERSUSBpc24ndCBhc3NlcnRlZFxuIik7CisJCXJldHVybiBzdGFydHN0b3A7CisJfQorCWlyZWFzb24uYWxsCT0gSFdJRihkcml2ZSktPklOQihJREVfSVJFQVNPTl9SRUcpOworCWlmICghaXJlYXNvbi5iLmNvZCB8fCBpcmVhc29uLmIuaW8pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtc2NzaTogKElPLENvRCkgIT0gKDAsMSkgd2hpbGUgIgorCQkJCSJpc3N1aW5nIGEgcGFja2V0IGNvbW1hbmRcbiIpOworCQlyZXR1cm4gaWRlX2RvX3Jlc2V0IChkcml2ZSk7CisJfQorCWlmIChIV0dST1VQKGRyaXZlKS0+aGFuZGxlciAhPSBOVUxMKQorCQlCVUcoKTsKKwkvKiBTZXQgdGhlIGludGVycnVwdCByb3V0aW5lICovCisJaWRlX3NldF9oYW5kbGVyKGRyaXZlLCAmaWRlc2NzaV9wY19pbnRyLCBnZXRfdGltZW91dChwYyksIGlkZXNjc2lfZXhwaXJ5KTsKKwkvKiBTZW5kIHRoZSBhY3R1YWwgcGFja2V0ICovCisJZHJpdmUtPmh3aWYtPmF0YXBpX291dHB1dF9ieXRlcyhkcml2ZSwgc2NzaS0+cGMtPmMsIDEyKTsKKwlpZiAodGVzdF9iaXQgKFBDX0RNQV9PSywgJnBjLT5mbGFncykpIHsKKwkJc2V0X2JpdCAoUENfRE1BX0lOX1BST0dSRVNTLCAmcGMtPmZsYWdzKTsKKwkJaHdpZi0+ZG1hX3N0YXJ0KGRyaXZlKTsKKwl9CisJcmV0dXJuIGlkZV9zdGFydGVkOworfQorCitzdGF0aWMgaW5saW5lIGludCBpZGVzY3NpX3NldF9kaXJlY3Rpb24oaWRlc2NzaV9wY190ICpwYykKK3sKKwlzd2l0Y2ggKHBjLT5jWzBdKSB7CisJCWNhc2UgUkVBRF82OiBjYXNlIFJFQURfMTA6IGNhc2UgUkVBRF8xMjoKKwkJCWNsZWFyX2JpdChQQ19XUklUSU5HLCAmcGMtPmZsYWdzKTsKKwkJCXJldHVybiAwOworCQljYXNlIFdSSVRFXzY6IGNhc2UgV1JJVEVfMTA6IGNhc2UgV1JJVEVfMTI6CisJCQlzZXRfYml0KFBDX1dSSVRJTkcsICZwYy0+ZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaWRlc2NzaV9tYXBfc2coaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVzY3NpX3BjX3QgKnBjKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCAqc2NzaV9zZzsKKwlpbnQgc2VnbWVudHM7CisKKwlpZiAoIXBjLT5yZXF1ZXN0X3RyYW5zZmVyIHx8IHBjLT5yZXF1ZXN0X3RyYW5zZmVyICUgMTAyNCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoaWRlc2NzaV9zZXRfZGlyZWN0aW9uKHBjKSkKKwkJcmV0dXJuIDE7CisKKwlzZyA9IGh3aWYtPnNnX3RhYmxlOworCXNjc2lfc2cgPSBwYy0+c2NzaV9jbWQtPnJlcXVlc3RfYnVmZmVyOworCXNlZ21lbnRzID0gcGMtPnNjc2lfY21kLT51c2Vfc2c7CisKKwlpZiAoc2VnbWVudHMgPiBod2lmLT5zZ19tYXhfbmVudHMpCisJCXJldHVybiAxOworCisJaWYgKCFzZWdtZW50cykgeworCQlod2lmLT5zZ19uZW50cyA9IDE7CisJCXNnX2luaXRfb25lKHNnLCBwYy0+c2NzaV9jbWQtPnJlcXVlc3RfYnVmZmVyLCBwYy0+cmVxdWVzdF90cmFuc2Zlcik7CisJfSBlbHNlIHsKKwkJaHdpZi0+c2dfbmVudHMgPSBzZWdtZW50czsKKwkJbWVtY3B5KHNnLCBzY3NpX3NnLCBzaXplb2YoKnNnKSAqIHNlZ21lbnRzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUlzc3VlIGEgcGFja2V0IGNvbW1hbmQKKyAqLworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGVzY3NpX2lzc3VlX3BjIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZXNjc2lfcGNfdCAqcGMpCit7CisJaWRlc2NzaV9zY3NpX3QgKnNjc2kgPSBkcml2ZV90b19pZGVzY3NpKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJYXRhcGlfZmVhdHVyZV90IGZlYXR1cmU7CisJYXRhcGlfYmNvdW50X3QgYmNvdW50OworCisJc2NzaS0+cGM9cGM7CQkJCQkJCS8qIFNldCB0aGUgY3VycmVudCBwYWNrZXQgY29tbWFuZCAqLworCXBjLT5hY3R1YWxseV90cmFuc2ZlcnJlZD0wOwkJCQkJLyogV2UgaGF2ZW4ndCB0cmFuc2ZlcnJlZCBhbnkgZGF0YSB5ZXQgKi8KKwlwYy0+Y3VycmVudF9wb3NpdGlvbj1wYy0+YnVmZmVyOworCWJjb3VudC5hbGwgPSBtaW4ocGMtPnJlcXVlc3RfdHJhbnNmZXIsIDYzICogMTAyNCk7CQkvKiBSZXF1ZXN0IHRvIHRyYW5zZmVyIHRoZSBlbnRpcmUgYnVmZmVyIGF0IG9uY2UgKi8KKworCWZlYXR1cmUuYWxsID0gMDsKKwlpZiAoZHJpdmUtPnVzaW5nX2RtYSAmJiAhaWRlc2NzaV9tYXBfc2coZHJpdmUsIHBjKSkgeworCQlod2lmLT5zZ19tYXBwZWQgPSAxOworCQlmZWF0dXJlLmIuZG1hID0gIWh3aWYtPmRtYV9zZXR1cChkcml2ZSk7CisJCWh3aWYtPnNnX21hcHBlZCA9IDA7CisJfQorCisJU0VMRUNUX0RSSVZFKGRyaXZlKTsKKwlpZiAoSURFX0NPTlRST0xfUkVHKQorCQlIV0lGKGRyaXZlKS0+T1VUQihkcml2ZS0+Y3RsLCBJREVfQ09OVFJPTF9SRUcpOworCisJSFdJRihkcml2ZSktPk9VVEIoZmVhdHVyZS5hbGwsIElERV9GRUFUVVJFX1JFRyk7CisJSFdJRihkcml2ZSktPk9VVEIoYmNvdW50LmIuaGlnaCwgSURFX0JDT1VOVEhfUkVHKTsKKwlIV0lGKGRyaXZlKS0+T1VUQihiY291bnQuYi5sb3csIElERV9CQ09VTlRMX1JFRyk7CisKKwlpZiAoZmVhdHVyZS5iLmRtYSkKKwkJc2V0X2JpdChQQ19ETUFfT0ssICZwYy0+ZmxhZ3MpOworCisJaWYgKHRlc3RfYml0KElERVNDU0lfRFJRX0lOVEVSUlVQVCwgJnNjc2ktPmZsYWdzKSkgeworCQlpZiAoSFdHUk9VUChkcml2ZSktPmhhbmRsZXIgIT0gTlVMTCkKKwkJCUJVRygpOworCQlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZpZGVzY3NpX3RyYW5zZmVyX3BjLAorCQkJCWdldF90aW1lb3V0KHBjKSwgaWRlc2NzaV9leHBpcnkpOworCQkvKiBJc3N1ZSB0aGUgcGFja2V0IGNvbW1hbmQgKi8KKwkJSFdJRihkcml2ZSktPk9VVEIoV0lOX1BBQ0tFVENNRCwgSURFX0NPTU1BTkRfUkVHKTsKKwkJcmV0dXJuIGlkZV9zdGFydGVkOworCX0gZWxzZSB7CisJCS8qIElzc3VlIHRoZSBwYWNrZXQgY29tbWFuZCAqLworCQlIV0lGKGRyaXZlKS0+T1VUQihXSU5fUEFDS0VUQ01ELCBJREVfQ09NTUFORF9SRUcpOworCQlyZXR1cm4gaWRlc2NzaV90cmFuc2Zlcl9wYyhkcml2ZSk7CisJfQorfQorCisvKgorICoJaWRlc2NzaV9kb19yZXF1ZXN0IGlzIG91ciByZXF1ZXN0IGhhbmRsaW5nIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGlkZXNjc2lfZG9fcmVxdWVzdCAoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHNlY3Rvcl90IGJsb2NrKQoreworI2lmIElERVNDU0lfREVCVUdfTE9HCisJcHJpbnRrIChLRVJOX0lORk8gInJxX3N0YXR1czogJWQsIGRldjogJXMsIGNtZDogJXgsIGVycm9yczogJWRcbiIscnEtPnJxX3N0YXR1cywgcnEtPnJxX2Rpc2stPmRpc2tfbmFtZSxycS0+Y21kWzBdLHJxLT5lcnJvcnMpOworCXByaW50ayAoS0VSTl9JTkZPICJzZWN0b3I6ICVsZCwgbnJfc2VjdG9yczogJWxkLCBjdXJyZW50X25yX3NlY3RvcnM6ICVkXG4iLHJxLT5zZWN0b3IscnEtPm5yX3NlY3RvcnMscnEtPmN1cnJlbnRfbnJfc2VjdG9ycyk7CisjZW5kaWYgLyogSURFU0NTSV9ERUJVR19MT0cgKi8KKworCWlmIChycS0+ZmxhZ3MgJiAoUkVRX1NQRUNJQUx8UkVRX1NFTlNFKSkgeworCQlyZXR1cm4gaWRlc2NzaV9pc3N1ZV9wYyAoZHJpdmUsIChpZGVzY3NpX3BjX3QgKikgcnEtPnNwZWNpYWwpOworCX0KKwlibGtfZHVtcF9ycV9mbGFncyhycSwgImlkZS1zY3NpOiB1bnN1cCBjb21tYW5kIik7CisJaWRlc2NzaV9lbmRfcmVxdWVzdCAoZHJpdmUsIDAsIDApOworCXJldHVybiBpZGVfc3RvcHBlZDsKK30KKworc3RhdGljIHZvaWQgaWRlc2NzaV9hZGRfc2V0dGluZ3MoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZXNjc2lfc2NzaV90ICpzY3NpID0gZHJpdmVfdG9faWRlc2NzaShkcml2ZSk7CisKKy8qCisgKgkJCWRyaXZlCXNldHRpbmcgbmFtZQlyZWFkL3dyaXRlCWlvY3RsCWlvY3RsCQlkYXRhIHR5cGUJbWluCW1heAltdWxfZmFjdG9yCWRpdl9mYWN0b3IJZGF0YSBwb2ludGVyCQlzZXQgZnVuY3Rpb24KKyAqLworCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJImJpb3NfY3lsIiwJU0VUVElOR19SVywJLTEsCS0xLAkJVFlQRV9JTlQsCTAsCTEwMjMsCTEsCQkxLAkJJmRyaXZlLT5iaW9zX2N5bCwJTlVMTCk7CisJaWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkiYmlvc19oZWFkIiwJU0VUVElOR19SVywJLTEsCS0xLAkJVFlQRV9CWVRFLAkwLAkyNTUsCTEsCQkxLAkJJmRyaXZlLT5iaW9zX2hlYWQsCU5VTEwpOworCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJImJpb3Nfc2VjdCIsCVNFVFRJTkdfUlcsCS0xLAktMSwJCVRZUEVfQllURSwJMCwJNjMsCTEsCQkxLAkJJmRyaXZlLT5iaW9zX3NlY3QsCU5VTEwpOworCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJInRyYW5zZm9ybSIsCVNFVFRJTkdfUlcsCS0xLAktMSwJCVRZUEVfSU5ULAkwLAkzLAkxLAkJMSwJCSZzY3NpLT50cmFuc2Zvcm0sCU5VTEwpOworCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJImxvZyIsCQlTRVRUSU5HX1JXLAktMSwJLTEsCQlUWVBFX0lOVCwJMCwJMSwJMSwJCTEsCQkmc2NzaS0+bG9nLAkJTlVMTCk7Cit9CisKKy8qCisgKglEcml2ZXIgaW5pdGlhbGl6YXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIGlkZXNjc2lfc2V0dXAgKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRlc2NzaV9zY3NpX3QgKnNjc2kpCit7CisJRFJJVkVSKGRyaXZlKS0+YnVzeSsrOworCWlmIChkcml2ZS0+aWQgJiYgKGRyaXZlLT5pZC0+Y29uZmlnICYgMHgwMDYwKSA9PSAweDIwKQorCQlzZXRfYml0IChJREVTQ1NJX0RSUV9JTlRFUlJVUFQsICZzY3NpLT5mbGFncyk7CisJc2V0X2JpdChJREVTQ1NJX1RSQU5TRk9STSwgJnNjc2ktPnRyYW5zZm9ybSk7CisJY2xlYXJfYml0KElERVNDU0lfU0dfVFJBTlNGT1JNLCAmc2NzaS0+dHJhbnNmb3JtKTsKKyNpZiBJREVTQ1NJX0RFQlVHX0xPRworCXNldF9iaXQoSURFU0NTSV9MT0dfQ01ELCAmc2NzaS0+bG9nKTsKKyNlbmRpZiAvKiBJREVTQ1NJX0RFQlVHX0xPRyAqLworCWlkZXNjc2lfYWRkX3NldHRpbmdzKGRyaXZlKTsKKwlEUklWRVIoZHJpdmUpLT5idXN5LS07Cit9CisKK3N0YXRpYyBpbnQgaWRlc2NzaV9jbGVhbnVwIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2NzaWhvc3QgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlkZV9zY3NpX29iaiAqc2NzaSA9IHNjc2lob3N0X3RvX2lkZXNjc2koc2NzaWhvc3QpOworCXN0cnVjdCBnZW5kaXNrICpnID0gc2NzaS0+ZGlzazsKKworCWlmIChpZGVfdW5yZWdpc3Rlcl9zdWJkcml2ZXIoZHJpdmUpKQorCQlyZXR1cm4gMTsKKworCWlkZV91bnJlZ2lzdGVyX3JlZ2lvbihnKTsKKworCWRyaXZlLT5kcml2ZXJfZGF0YSA9IE5VTEw7CisJZy0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlwdXRfZGlzayhnKTsKKworCXNjc2lfcmVtb3ZlX2hvc3Qoc2NzaWhvc3QpOworCWlkZV9zY3NpX3B1dChzY3NpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlkZXNjc2lfYXR0YWNoKGlkZV9kcml2ZV90ICpkcml2ZSk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGlkZV9wcm9jX2VudHJ5X3QgaWRlc2NzaV9wcm9jW10gPSB7CisJeyAiY2FwYWNpdHkiLCBTX0lGUkVHfFNfSVJVR08sIHByb2NfaWRlX3JlYWRfY2FwYWNpdHksIE5VTEwgfSwKKwl7IE5VTEwsIDAsIE5VTEwsIE5VTEwgfQorfTsKKyNlbHNlCisjIGRlZmluZSBpZGVzY3NpX3Byb2MJTlVMTAorI2VuZGlmCisKKy8qCisgKglJREUgc3ViZHJpdmVyIGZ1bmN0aW9ucywgcmVnaXN0ZXJlZCB3aXRoIGlkZS5jCisgKi8KK3N0YXRpYyBpZGVfZHJpdmVyX3QgaWRlc2NzaV9kcml2ZXIgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gImlkZS1zY3NpIiwKKwkudmVyc2lvbgkJPSBJREVTQ1NJX1ZFUlNJT04sCisJLm1lZGlhCQkJPSBpZGVfc2NzaSwKKwkuYnVzeQkJCT0gMCwKKwkuc3VwcG9ydHNfZHNjX292ZXJsYXAJPSAwLAorCS5wcm9jCQkJPSBpZGVzY3NpX3Byb2MsCisJLmF0dGFjaAkJCT0gaWRlc2NzaV9hdHRhY2gsCisJLmNsZWFudXAJCT0gaWRlc2NzaV9jbGVhbnVwLAorCS5kb19yZXF1ZXN0CQk9IGlkZXNjc2lfZG9fcmVxdWVzdCwKKwkuZW5kX3JlcXVlc3QJCT0gaWRlc2NzaV9lbmRfcmVxdWVzdCwKKwkuZXJyb3IgICAgICAgICAgICAgICAgICA9IGlkZXNjc2lfYXRhcGlfZXJyb3IsCisJLmFib3J0ICAgICAgICAgICAgICAgICAgPSBpZGVzY3NpX2F0YXBpX2Fib3J0LAorCS5kcml2ZXMJCQk9IExJU1RfSEVBRF9JTklUKGlkZXNjc2lfZHJpdmVyLmRyaXZlcyksCit9OworCitzdGF0aWMgaW50IGlkZXNjc2lfaWRlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrOworCXN0cnVjdCBpZGVfc2NzaV9vYmogKnNjc2k7CisJaWRlX2RyaXZlX3QgKmRyaXZlOworCisJaWYgKCEoc2NzaSA9IGlkZV9zY3NpX2dldChkaXNrKSkpCisJCXJldHVybiAtRU5YSU87CisKKwlkcml2ZSA9IHNjc2ktPmRyaXZlOworCisJZHJpdmUtPnVzYWdlKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZGVzY3NpX2lkZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzazsKKwlzdHJ1Y3QgaWRlX3Njc2lfb2JqICpzY3NpID0gaWRlX3Njc2lfZyhkaXNrKTsKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSBzY3NpLT5kcml2ZTsKKworCWRyaXZlLT51c2FnZS0tOworCisJaWRlX3Njc2lfcHV0KHNjc2kpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWRlc2NzaV9pZGVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gaW5vZGUtPmlfYmRldjsKKwlzdHJ1Y3QgaWRlX3Njc2lfb2JqICpzY3NpID0gaWRlX3Njc2lfZyhiZGV2LT5iZF9kaXNrKTsKKwlyZXR1cm4gZ2VuZXJpY19pZGVfaW9jdGwoc2NzaS0+ZHJpdmUsIGZpbGUsIGJkZXYsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyBpZGVzY3NpX29wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gaWRlc2NzaV9pZGVfb3BlbiwKKwkucmVsZWFzZQk9IGlkZXNjc2lfaWRlX3JlbGVhc2UsCisJLmlvY3RsCQk9IGlkZXNjc2lfaWRlX2lvY3RsLAorfTsKKworc3RhdGljIGludCBpZGVzY3NpX2F0dGFjaChpZGVfZHJpdmVfdCAqZHJpdmUpOworCitzdGF0aWMgaW50IGlkZXNjc2lfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqIHNkcCkKK3sKKwkvKiBDb25maWd1cmUgZGV0ZWN0ZWQgZGV2aWNlICovCisJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RwLCBNU0dfU0lNUExFX1RBRywgc2RwLT5ob3N0LT5jbWRfcGVyX2x1bik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICppZGVzY3NpX2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJcmV0dXJuICJTQ1NJIGhvc3QgYWRhcHRlciBlbXVsYXRpb24gZm9yIElERSBBVEFQSSBkZXZpY2VzIjsKK30KKworc3RhdGljIGludCBpZGVzY3NpX2lvY3RsIChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldiwgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlpZGVzY3NpX3Njc2lfdCAqc2NzaSA9IHNjc2lob3N0X3RvX2lkZXNjc2koZGV2LT5ob3N0KTsKKworCWlmIChjbWQgPT0gU0dfU0VUX1RSQU5TRk9STSkgeworCQlpZiAoYXJnKQorCQkJc2V0X2JpdChJREVTQ1NJX1NHX1RSQU5TRk9STSwgJnNjc2ktPnRyYW5zZm9ybSk7CisJCWVsc2UKKwkJCWNsZWFyX2JpdChJREVTQ1NJX1NHX1RSQU5TRk9STSwgJnNjc2ktPnRyYW5zZm9ybSk7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoY21kID09IFNHX0dFVF9UUkFOU0ZPUk0pCisJCXJldHVybiBwdXRfdXNlcih0ZXN0X2JpdChJREVTQ1NJX1NHX1RSQU5TRk9STSwgJnNjc2ktPnRyYW5zZm9ybSksIChpbnQgX191c2VyICopIGFyZyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNob3VsZF90cmFuc2Zvcm0oaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJaWRlc2NzaV9zY3NpX3QgKnNjc2kgPSBkcml2ZV90b19pZGVzY3NpKGRyaXZlKTsKKworCS8qIHRoaXMgd2FzIGEgbGF5ZXJpbmcgdmlvbGF0aW9uIGFuZCB3ZSBjYW4ndCBzdXBwb3J0IGl0CisJICAgYW55bW9yZSwgc29ycnkuICovCisjaWYgMAorCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gY21kLT5yZXF1ZXN0LT5ycV9kaXNrOworCisJaWYgKGRpc2spIHsKKwkJc3RydWN0IFNjc2lfRGV2aWNlX1RlbXBsYXRlICoqcCA9IGRpc2stPnByaXZhdGVfZGF0YTsKKwkJaWYgKHN0cmNtcCgoKnApLT5zY3NpX2RyaXZlcmZzX2RyaXZlci5uYW1lLCAic2ciKSA9PSAwKQorCQkJcmV0dXJuIHRlc3RfYml0KElERVNDU0lfU0dfVFJBTlNGT1JNLCAmc2NzaS0+dHJhbnNmb3JtKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gdGVzdF9iaXQoSURFU0NTSV9UUkFOU0ZPUk0sICZzY3NpLT50cmFuc2Zvcm0pOworfQorCitzdGF0aWMgaW50IGlkZXNjc2lfcXVldWUgKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCWlkZXNjc2lfc2NzaV90ICpzY3NpID0gc2NzaWhvc3RfdG9faWRlc2NzaShob3N0KTsKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSBzY3NpLT5kcml2ZTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBOVUxMOworCWlkZXNjc2lfcGNfdCAqcGMgPSBOVUxMOworCisJaWYgKCFkcml2ZSkgeworCQlwcmludGsgKEtFUk5fRVJSICJpZGUtc2NzaTogZHJpdmUgaWQgJWQgbm90IHByZXNlbnRcbiIsIGNtZC0+ZGV2aWNlLT5pZCk7CisJCWdvdG8gYWJvcnQ7CisJfQorCXNjc2kgPSBkcml2ZV90b19pZGVzY3NpKGRyaXZlKTsKKwlwYyA9IGttYWxsb2MgKHNpemVvZiAoaWRlc2NzaV9wY190KSwgR0ZQX0FUT01JQyk7CisJcnEgPSBrbWFsbG9jIChzaXplb2YgKHN0cnVjdCByZXF1ZXN0KSwgR0ZQX0FUT01JQyk7CisJaWYgKHJxID09IE5VTEwgfHwgcGMgPT0gTlVMTCkgeworCQlwcmludGsgKEtFUk5fRVJSICJpZGUtc2NzaTogJXM6IG91dCBvZiBtZW1vcnlcbiIsIGRyaXZlLT5uYW1lKTsKKwkJZ290byBhYm9ydDsKKwl9CisKKwltZW1zZXQgKHBjLT5jLCAwLCAxMik7CisJcGMtPmZsYWdzID0gMDsKKwlwYy0+cnEgPSBycTsKKwltZW1jcHkgKHBjLT5jLCBjbWQtPmNtbmQsIGNtZC0+Y21kX2xlbik7CisJaWYgKGNtZC0+dXNlX3NnKSB7CisJCXBjLT5idWZmZXIgPSBOVUxMOworCQlwYy0+c2cgPSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCX0gZWxzZSB7CisJCXBjLT5idWZmZXIgPSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCQlwYy0+c2cgPSBOVUxMOworCX0KKwlwYy0+Yl9jb3VudCA9IDA7CisJcGMtPnJlcXVlc3RfdHJhbnNmZXIgPSBwYy0+YnVmZmVyX3NpemUgPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwlwYy0+c2NzaV9jbWQgPSBjbWQ7CisJcGMtPmRvbmUgPSBkb25lOworCXBjLT50aW1lb3V0ID0gamlmZmllcyArIGNtZC0+dGltZW91dF9wZXJfY29tbWFuZDsKKworCWlmIChzaG91bGRfdHJhbnNmb3JtKGRyaXZlLCBjbWQpKQorCQlzZXRfYml0KFBDX1RSQU5TRk9STSwgJnBjLT5mbGFncyk7CisJaWRlc2NzaV90cmFuc2Zvcm1fcGMxIChkcml2ZSwgcGMpOworCisJaWYgKHRlc3RfYml0KElERVNDU0lfTE9HX0NNRCwgJnNjc2ktPmxvZykpIHsKKwkJcHJpbnRrICgiaWRlLXNjc2k6ICVzOiBxdWUgJWx1LCBjbWQgPSAiLCBkcml2ZS0+bmFtZSwgY21kLT5zZXJpYWxfbnVtYmVyKTsKKwkJaGV4ZHVtcChjbWQtPmNtbmQsIGNtZC0+Y21kX2xlbik7CisJCWlmIChtZW1jbXAocGMtPmMsIGNtZC0+Y21uZCwgY21kLT5jbWRfbGVuKSkgeworCQkJcHJpbnRrICgiaWRlLXNjc2k6ICVzOiBxdWUgJWx1LCB0c2wgPSAiLCBkcml2ZS0+bmFtZSwgY21kLT5zZXJpYWxfbnVtYmVyKTsKKwkJCWhleGR1bXAocGMtPmMsIDEyKTsKKwkJfQorCX0KKworCWlkZV9pbml0X2RyaXZlX2NtZCAocnEpOworCXJxLT5zcGVjaWFsID0gKGNoYXIgKikgcGM7CisJcnEtPmZsYWdzID0gUkVRX1NQRUNJQUw7CisJc3Bpbl91bmxvY2tfaXJxKGhvc3QtPmhvc3RfbG9jayk7CisJcnEtPnJxX2Rpc2sgPSBzY3NpLT5kaXNrOworCSh2b2lkKSBpZGVfZG9fZHJpdmVfY21kIChkcml2ZSwgcnEsIGlkZV9lbmQpOworCXNwaW5fbG9ja19pcnEoaG9zdC0+aG9zdF9sb2NrKTsKKwlyZXR1cm4gMDsKK2Fib3J0OgorCWlmIChwYykga2ZyZWUgKHBjKTsKKwlpZiAocnEpIGtmcmVlIChycSk7CisJY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJZG9uZShjbWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlkZXNjc2lfZWhfYWJvcnQgKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlpZGVzY3NpX3Njc2lfdCAqc2NzaSAgPSBzY3NpaG9zdF90b19pZGVzY3NpKGNtZC0+ZGV2aWNlLT5ob3N0KTsKKwlpZGVfZHJpdmVfdCAgICAqZHJpdmUgPSBzY3NpLT5kcml2ZTsKKwlpbnQJCWJ1c3k7CisJaW50ICAgICAgICAgICAgIHJldCAgID0gRkFJTEVEOworCisJLyogSW4gaWRlc2NzaV9laF9hYm9ydCB3ZSB0cnkgdG8gZ2VudGx5IHByeSBvdXIgY29tbWFuZCBmcm9tIHRoZSBpZGUgc3Vic3lzdGVtICovCisKKwlpZiAodGVzdF9iaXQoSURFU0NTSV9MT0dfQ01ELCAmc2NzaS0+bG9nKSkKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgImlkZS1zY3NpOiBhYm9ydCBjYWxsZWQgZm9yICVsdVxuIiwgY21kLT5zZXJpYWxfbnVtYmVyKTsKKworCWlmICghZHJpdmUpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgImlkZS1zY3NpOiBEcml2ZSBub3Qgc2V0IGluIGlkZXNjc2lfZWhfYWJvcnRcbiIpOworCQlXQVJOX09OKDEpOworCQlnb3RvIG5vX2RyaXZlOworCX0KKworCS8qIEZpcnN0IGdpdmUgaXQgc29tZSBtb3JlIHRpbWUsIGhvdyBtdWNoIGlzICJyaWdodCIgaXMgaGFyZCB0byBzYXkgOi0oICovCisKKwlidXN5ID0gaWRlX3dhaXRfbm90X2J1c3koSFdJRihkcml2ZSksIDEwMCk7CS8qIEZJWE1FIC0gdXNlcyBtZGVsYXkgd2hpY2ggY2F1c2VzIGxhdGVuY3k/ICovCisJaWYgKHRlc3RfYml0KElERVNDU0lfTE9HX0NNRCwgJnNjc2ktPmxvZykpCisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJpZGUtc2NzaTogZHJpdmUgZGlkJXMgYmVjb21lIHJlYWR5XG4iLCBidXN5PyIgbm90IjoiIik7CisKKwlzcGluX2xvY2tfaXJxKCZpZGVfbG9jayk7CisKKwkvKiBJZiB0aGVyZSBpcyBubyBwYyBydW5uaW5nIHdlJ3JlIGRvbmUgKG91ciBpbnRlcnJ1cHQgdG9vayBjYXJlIG9mIGl0KSAqLworCWlmICghc2NzaS0+cGMpIHsKKwkJcmV0ID0gU1VDQ0VTUzsKKwkJZ290byBpZGVfdW5sb2NrOworCX0KKworCS8qIEl0J3Mgc29tZXdoZXJlIGluIGZsaWdodC4gRG9lcyBpZGUgc3Vic3lzdGVtIGFncmVlPyAqLworCWlmIChzY3NpLT5wYy0+c2NzaV9jbWQtPnNlcmlhbF9udW1iZXIgPT0gY21kLT5zZXJpYWxfbnVtYmVyICYmICFidXN5ICYmCisJICAgIGVsdl9xdWV1ZV9lbXB0eShkcml2ZS0+cXVldWUpICYmIEhXR1JPVVAoZHJpdmUpLT5ycSAhPSBzY3NpLT5wYy0+cnEpIHsKKwkJLyoKKwkJICogRklYTUUgLSBub3Qgc3VyZSB0aGlzIGNvbmRpdGlvbiBjYW4gZXZlciBvY2N1cgorCQkgKi8KKwkJcHJpbnRrIChLRVJOX0VSUiAiaWRlLXNjc2k6IGNtZCBhYm9ydGVkIVxuIik7CisKKwkJaWYgKHNjc2ktPnBjLT5ycS0+ZmxhZ3MgJiBSRVFfU0VOU0UpCisJCQlrZnJlZShzY3NpLT5wYy0+YnVmZmVyKTsKKwkJa2ZyZWUoc2NzaS0+cGMtPnJxKTsKKwkJa2ZyZWUoc2NzaS0+cGMpOworCQlzY3NpLT5wYyA9IE5VTEw7CisKKwkJcmV0ID0gU1VDQ0VTUzsKKwl9CisKK2lkZV91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxKCZpZGVfbG9jayk7Citub19kcml2ZToKKwlpZiAodGVzdF9iaXQoSURFU0NTSV9MT0dfQ01ELCAmc2NzaS0+bG9nKSkKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgImlkZS1zY3NpOiBhYm9ydCByZXR1cm5zICVzXG4iLCByZXQgPT0gU1VDQ0VTUz8ic3VjY2VzcyI6ImZhaWxlZCIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpZGVzY3NpX2VoX3Jlc2V0IChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IHJlcXVlc3QgKnJlcTsKKwlpZGVzY3NpX3Njc2lfdCAqc2NzaSAgPSBzY3NpaG9zdF90b19pZGVzY3NpKGNtZC0+ZGV2aWNlLT5ob3N0KTsKKwlpZGVfZHJpdmVfdCAgICAqZHJpdmUgPSBzY3NpLT5kcml2ZTsKKwlpbnQgICAgICAgICAgICAgcmVhZHkgPSAwOworCWludCAgICAgICAgICAgICByZXQgICA9IFNVQ0NFU1M7CisKKwkvKiBJbiBpZGVzY3NpX2VoX3Jlc2V0IHdlIGZvcmNlZnVsbHkgcmVtb3ZlIHRoZSBjb21tYW5kIGZyb20gdGhlIGlkZSBzdWJzeXN0ZW0gYW5kIHJlc2V0IHRoZSBkZXZpY2UuICovCisKKwlpZiAodGVzdF9iaXQoSURFU0NTSV9MT0dfQ01ELCAmc2NzaS0+bG9nKSkKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgImlkZS1zY3NpOiByZXNldCBjYWxsZWQgZm9yICVsdVxuIiwgY21kLT5zZXJpYWxfbnVtYmVyKTsKKworCWlmICghZHJpdmUpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgImlkZS1zY3NpOiBEcml2ZSBub3Qgc2V0IGluIGlkZXNjc2lfZWhfcmVzZXRcbiIpOworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCXNwaW5fbG9ja19pcnEoJmlkZV9sb2NrKTsKKworCWlmICghc2NzaS0+cGMgfHwgKHJlcSA9IHNjc2ktPnBjLT5ycSkgIT0gSFdHUk9VUChkcml2ZSktPnJxIHx8ICFIV0dST1VQKGRyaXZlKS0+aGFuZGxlcikgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAiaWRlLXNjc2k6IE5vIGFjdGl2ZSByZXF1ZXN0IGluIGlkZXNjc2lfZWhfcmVzZXRcbiIpOworCQlzcGluX3VubG9jaygmaWRlX2xvY2spOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCS8qIGtpbGwgY3VycmVudCByZXF1ZXN0ICovCisJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChyZXEpOworCWVuZF90aGF0X3JlcXVlc3RfbGFzdChyZXEpOworCWlmIChyZXEtPmZsYWdzICYgUkVRX1NFTlNFKQorCQlrZnJlZShzY3NpLT5wYy0+YnVmZmVyKTsKKwlrZnJlZShzY3NpLT5wYyk7CisJc2NzaS0+cGMgPSBOVUxMOworCWtmcmVlKHJlcSk7CisKKwkvKiBub3cgbnVrZSB0aGUgZHJpdmUgcXVldWUgKi8KKwl3aGlsZSAoKHJlcSA9IGVsdl9uZXh0X3JlcXVlc3QoZHJpdmUtPnF1ZXVlKSkpIHsKKwkJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChyZXEpOworCQllbmRfdGhhdF9yZXF1ZXN0X2xhc3QocmVxKTsKKwl9CisKKwlIV0dST1VQKGRyaXZlKS0+cnEgPSBOVUxMOworCUhXR1JPVVAoZHJpdmUpLT5oYW5kbGVyID0gTlVMTDsKKwlIV0dST1VQKGRyaXZlKS0+YnVzeSA9IDE7CQkvKiB3aWxsIHNldCB0aGlzIHRvIHplcm8gd2hlbiBpZGUgcmVzZXQgZmluaXNoZWQgKi8KKwlzcGluX3VubG9ja19pcnEoJmlkZV9sb2NrKTsKKworCWlkZV9kb19yZXNldChkcml2ZSk7CisKKwkvKiBpZGVfZG9fcmVzZXQgc3RhcnRzIGEgcG9sbGluZyBoYW5kbGVyIHdoaWNoIHJlc3RhcnRzIGl0c2VsZiBldmVyeSA1MG1zIHVudGlsIHRoZSByZXNldCBmaW5pc2hlcyAqLworCisJZG8geworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycShjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrKTsKKwkJc2NoZWR1bGVfdGltZW91dChIWi8yMCk7CisJCXNwaW5fbG9ja19pcnEoY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jayk7CisJfSB3aGlsZSAoIEhXR1JPVVAoZHJpdmUpLT5oYW5kbGVyICk7CisKKwlyZWFkeSA9IGRyaXZlX2lzX3JlYWR5KGRyaXZlKTsKKwlIV0dST1VQKGRyaXZlKS0+YnVzeS0tOworCWlmICghcmVhZHkpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiaWRlLXNjc2k6IHJlc2V0IGZhaWxlZCFcbiIpOworCQlyZXQgPSBGQUlMRUQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpZGVzY3NpX2Jpb3Moc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQlzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICpwYXJtKQoreworCWlkZXNjc2lfc2NzaV90ICppZGVzY3NpID0gc2NzaWhvc3RfdG9faWRlc2NzaShzZGV2LT5ob3N0KTsKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSBpZGVzY3NpLT5kcml2ZTsKKworCWlmIChkcml2ZS0+Ymlvc19jeWwgJiYgZHJpdmUtPmJpb3NfaGVhZCAmJiBkcml2ZS0+Ymlvc19zZWN0KSB7CisJCXBhcm1bMF0gPSBkcml2ZS0+Ymlvc19oZWFkOworCQlwYXJtWzFdID0gZHJpdmUtPmJpb3Nfc2VjdDsKKwkJcGFybVsyXSA9IGRyaXZlLT5iaW9zX2N5bDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGlkZXNjc2lfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9ICJpZGVzY3NpIiwKKwkuaW5mbwkJCT0gaWRlc2NzaV9pbmZvLAorCS5zbGF2ZV9jb25maWd1cmUgICAgICAgID0gaWRlc2NzaV9zbGF2ZV9jb25maWd1cmUsCisJLmlvY3RsCQkJPSBpZGVzY3NpX2lvY3RsLAorCS5xdWV1ZWNvbW1hbmQJCT0gaWRlc2NzaV9xdWV1ZSwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IGlkZXNjc2lfZWhfYWJvcnQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlciAgPSBpZGVzY3NpX2VoX3Jlc2V0LAorCS5iaW9zX3BhcmFtCQk9IGlkZXNjc2lfYmlvcywKKwkuY2FuX3F1ZXVlCQk9IDQwLAorCS50aGlzX2lkCQk9IC0xLAorCS5zZ190YWJsZXNpemUJCT0gMjU2LAorCS5jbWRfcGVyX2x1bgkJPSA1LAorCS5tYXhfc2VjdG9ycwkJPSAxMjgsCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORywKKwkuZW11bGF0ZWQJCT0gMSwKKwkucHJvY19uYW1lCQk9ICJpZGUtc2NzaSIsCit9OworCitzdGF0aWMgaW50IGlkZXNjc2lfYXR0YWNoKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVzY3NpX3Njc2lfdCAqaWRlc2NzaTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXN0cnVjdCBnZW5kaXNrICpnOworCXN0YXRpYyBpbnQgd2FybmVkOworCWludCBlcnIgPSAtRU5PTUVNOworCisJaWYgKCF3YXJuZWQgJiYgZHJpdmUtPm1lZGlhID09IGlkZV9jZHJvbSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpZGUtc2NzaSBpcyBkZXByZWNhdGVkIGZvciBjZCBidXJuaW5nISBVc2UgaWRlLWNkIGFuZCBnaXZlIGRldj0vZGV2L2hkWCBhcyBkZXZpY2VcbiIpOworCQl3YXJuZWQgPSAxOworCX0KKworCWlmICghc3Ryc3RyKCJpZGUtc2NzaSIsIGRyaXZlLT5kcml2ZXJfcmVxKSB8fAorCSAgICAhZHJpdmUtPnByZXNlbnQgfHwKKwkgICAgZHJpdmUtPm1lZGlhID09IGlkZV9kaXNrIHx8CisJICAgICEoaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmaWRlc2NzaV90ZW1wbGF0ZSxzaXplb2YoaWRlc2NzaV9zY3NpX3QpKSkpCisJCXJldHVybiAxOworCisJZyA9IGFsbG9jX2Rpc2soMSA8PCBQQVJUTl9CSVRTKTsKKwlpZiAoIWcpCisJCWdvdG8gb3V0X2hvc3RfcHV0OworCisJaWRlX2luaXRfZGlzayhnLCBkcml2ZSk7CisKKwlob3N0LT5tYXhfaWQgPSAxOworCisjaWYgSURFU0NTSV9ERUJVR19MT0cKKwlpZiAoZHJpdmUtPmlkLT5sYXN0X2x1bikKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogaWQtPmxhc3RfbHVuPSV1XG4iLCBkcml2ZS0+bmFtZSwgZHJpdmUtPmlkLT5sYXN0X2x1bik7CisjZW5kaWYKKwlpZiAoKGRyaXZlLT5pZC0+bGFzdF9sdW4gJiAweDcpICE9IDcpCisJCWhvc3QtPm1heF9sdW4gPSAoZHJpdmUtPmlkLT5sYXN0X2x1biAmIDB4NykgKyAxOworCWVsc2UKKwkJaG9zdC0+bWF4X2x1biA9IDE7CisKKwlkcml2ZS0+ZHJpdmVyX2RhdGEgPSBob3N0OworCWlkZXNjc2kgPSBzY3NpaG9zdF90b19pZGVzY3NpKGhvc3QpOworCWlkZXNjc2ktPmRyaXZlID0gZHJpdmU7CisJaWRlc2NzaS0+ZHJpdmVyID0gJmlkZXNjc2lfZHJpdmVyOworCWlkZXNjc2ktPmhvc3QgPSBob3N0OworCWlkZXNjc2ktPmRpc2sgPSBnOworCWctPnByaXZhdGVfZGF0YSA9ICZpZGVzY3NpLT5kcml2ZXI7CisJZXJyID0gaWRlX3JlZ2lzdGVyX3N1YmRyaXZlcihkcml2ZSwgJmlkZXNjc2lfZHJpdmVyKTsKKwlpZiAoIWVycikgeworCQlpZGVzY3NpX3NldHVwIChkcml2ZSwgaWRlc2NzaSk7CisJCWctPmZvcHMgPSAmaWRlc2NzaV9vcHM7CisJCWlkZV9yZWdpc3Rlcl9yZWdpb24oZyk7CisJCWVyciA9IHNjc2lfYWRkX2hvc3QoaG9zdCwgJmRyaXZlLT5nZW5kZXYpOworCQlpZiAoIWVycikgeworCQkJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggb24gZXJyb3IgKi8KKwkJaWRlX3VucmVnaXN0ZXJfcmVnaW9uKGcpOworCQlpZGVfdW5yZWdpc3Rlcl9zdWJkcml2ZXIoZHJpdmUpOworCX0KKworCXB1dF9kaXNrKGcpOworb3V0X2hvc3RfcHV0OgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9pZGVzY3NpX21vZHVsZSh2b2lkKQoreworCXJldHVybiBpZGVfcmVnaXN0ZXJfZHJpdmVyKCZpZGVzY3NpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2lkZXNjc2lfbW9kdWxlKHZvaWQpCit7CisJaWRlX3VucmVnaXN0ZXJfZHJpdmVyKCZpZGVzY3NpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfaWRlc2NzaV9tb2R1bGUpOworbW9kdWxlX2V4aXQoZXhpdF9pZGVzY3NpX21vZHVsZSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaW1tLmMgYi9kcml2ZXJzL3Njc2kvaW1tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3ZjJjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pbW0uYwpAQCAtMCwwICsxLDEzMDAgQEAKKy8qIGltbS5jICAgLS0gIGxvdyBsZXZlbCBkcml2ZXIgZm9yIHRoZSBJT01FR0EgTWF0Y2hNYWtlcgorICogcGFyYWxsZWwgcG9ydCBTQ1NJIGhvc3QgYWRhcHRlci4KKyAqIAorICogKFRoZSBJTU0gaXMgdGhlIGVtYmVkZGVkIGNvbnRyb2xsZXIgaW4gdGhlIFpJUCBQbHVzIGRyaXZlLikKKyAqIAorICogQ3VycmVudCBNYWludGFpbmVyOiBEYXZpZCBDYW1wYmVsbCAoUGVydGgsIFdlc3Rlcm4gQXVzdHJhbGlhKQorICogICAgICAgICAgICAgICAgICAgICBjYW1wYmVsbEB0b3JxdWUubmV0CisgKgorICogTXkgdW5vZmZpY2FsIGNvbXBhbnkgYWNyb255bSBsaXN0IGlzIDIxIHBhZ2VzIGxvbmc6CisgKiAgICAgIEZMQTogICAgRm91ciBsZXR0ZXIgYWNyb255bSB3aXRoIGJ1aWx0IGluIGZhY2lsaXR5IGZvcgorICogICAgICAgICAgICAgIGZ1dHVyZSBleHBhbnNpb24gdG8gZml2ZSBsZXR0ZXJzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworLyogVGhlIGZvbGxvd2luZyAjZGVmaW5lIGlzIHRvIGF2b2lkIGEgY2xhc2ggd2l0aCBob3N0cy5jICovCisjZGVmaW5lIElNTV9QUk9CRV9TUFAgICAweDAwMDEKKyNkZWZpbmUgSU1NX1BST0JFX1BTMiAgIDB4MDAwMgorI2RlZmluZSBJTU1fUFJPQkVfRUNSICAgMHgwMDEwCisjZGVmaW5lIElNTV9QUk9CRV9FUFAxNyAweDAxMDAKKyNkZWZpbmUgSU1NX1BST0JFX0VQUDE5IDB4MDIwMAorCisKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgcGFyZGV2aWNlICpkZXY7CS8qIFBhcnBvcnQgZGV2aWNlIGVudHJ5ICAgICAgICAgKi8KKwlpbnQgYmFzZTsJCS8qIEFjdHVhbCBwb3J0IGFkZHJlc3MgICAgICAgICAgKi8KKwlpbnQgYmFzZV9oaTsJCS8qIEhpIEJhc2UgYWRkcmVzcyBmb3IgRUNQLUlTQSBjaGlwc2V0ICovCisJaW50IG1vZGU7CQkvKiBUcmFuc2ZlciBtb2RlICAgICAgICAgICAgICAgICovCisJc3RydWN0IHNjc2lfY21uZCAqY3VyX2NtZDsJLyogQ3VycmVudCBxdWV1ZWQgY29tbWFuZCAgICAgICAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBpbW1fdHE7CS8qIFBvbGxpbmcgaW50ZXJydXB0IHN0dWZmICAgICAgICovCisJdW5zaWduZWQgbG9uZyBqc3RhcnQ7CS8qIEppZmZpZXMgYXQgc3RhcnQgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBmYWlsZWQ6MTsJLyogRmFpbHVyZSBmbGFnICAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGRwOjE7CQkvKiBEYXRhIHBoYXNlIHByZXNlbnQgICAgICAgICAgICovCisJdW5zaWduZWQgcmQ6MTsJCS8qIFJlYWQgZGF0YSBpbiBkYXRhIHBoYXNlICAgICAgKi8KKwl1bnNpZ25lZCB3YW50ZWQ6MTsJLyogUGFycG9ydCBzaGFyaW5nIGJ1c3kgZmxhZyAgICAqLworCXdhaXRfcXVldWVfaGVhZF90ICp3YWl0aW5nOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfSBpbW1fc3RydWN0OworCitzdGF0aWMgdm9pZCBpbW1fcmVzZXRfcHVsc2UodW5zaWduZWQgaW50IGJhc2UpOworc3RhdGljIGludCBkZXZpY2VfY2hlY2soaW1tX3N0cnVjdCAqZGV2KTsKKworI2luY2x1ZGUgImltbS5oIgorCitzdGF0aWMgaW5saW5lIGltbV9zdHJ1Y3QgKmltbV9kZXYoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlyZXR1cm4gKihpbW1fc3RydWN0ICoqKSZob3N0LT5ob3N0ZGF0YTsKK30KKworc3RhdGljIERFRklORV9TUElOTE9DSyhhcmJpdHJhdGlvbl9sb2NrKTsKKworc3RhdGljIHZvaWQgZ290X2l0KGltbV9zdHJ1Y3QgKmRldikKK3sKKwlkZXYtPmJhc2UgPSBkZXYtPmRldi0+cG9ydC0+YmFzZTsKKwlpZiAoZGV2LT5jdXJfY21kKQorCQlkZXYtPmN1cl9jbWQtPlNDcC5waGFzZSA9IDE7CisJZWxzZQorCQl3YWtlX3VwKGRldi0+d2FpdGluZyk7Cit9CisKK3N0YXRpYyB2b2lkIGltbV93YWtldXAodm9pZCAqcmVmKQoreworCWltbV9zdHJ1Y3QgKmRldiA9IChpbW1fc3RydWN0ICopIHJlZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFyYml0cmF0aW9uX2xvY2ssIGZsYWdzKTsKKwlpZiAoZGV2LT53YW50ZWQpIHsKKwkJcGFycG9ydF9jbGFpbShkZXYtPmRldik7CisJCWdvdF9pdChkZXYpOworCQlkZXYtPndhbnRlZCA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyYml0cmF0aW9uX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBpbW1fcGJfY2xhaW0oaW1tX3N0cnVjdCAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJlcyA9IDE7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFyYml0cmF0aW9uX2xvY2ssIGZsYWdzKTsKKwlpZiAocGFycG9ydF9jbGFpbShkZXYtPmRldikgPT0gMCkgeworCQlnb3RfaXQoZGV2KTsKKwkJcmVzID0gMDsKKwl9CisJZGV2LT53YW50ZWQgPSByZXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXJiaXRyYXRpb25fbG9jaywgZmxhZ3MpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIGltbV9wYl9kaXNtaXNzKGltbV9zdHJ1Y3QgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB3YW50ZWQ7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFyYml0cmF0aW9uX2xvY2ssIGZsYWdzKTsKKwl3YW50ZWQgPSBkZXYtPndhbnRlZDsKKwlkZXYtPndhbnRlZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXJiaXRyYXRpb25fbG9jaywgZmxhZ3MpOworCWlmICghd2FudGVkKQorCQlwYXJwb3J0X3JlbGVhc2UoZGV2LT5kZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW1tX3BiX3JlbGVhc2UoaW1tX3N0cnVjdCAqZGV2KQoreworCXBhcnBvcnRfcmVsZWFzZShkZXYtPmRldik7Cit9CisKKy8qIFRoaXMgaXMgdG8gZ2l2ZSB0aGUgaW1tIGRyaXZlciBhIHdheSB0byBtb2RpZnkgdGhlIHRpbWluZ3MgKGFuZCBvdGhlcgorICogcGFyYW1ldGVycykgYnkgd3JpdGluZyB0byB0aGUgL3Byb2Mvc2NzaS9pbW0vMCBmaWxlLgorICogVmVyeSBzaW1wbGUgbWV0aG9kIHJlYWxseS4uLiAoVG9vIHNpbXBsZSwgbm8gZXJyb3IgY2hlY2tpbmcgOiggKQorICogUmVhc29uOiBLZXJuZWwgaGFja2VycyBIQVRFIGhhdmluZyB0byB1bmxvYWQgYW5kIHJlbG9hZCBtb2R1bGVzIGZvcgorICogdGVzdGluZy4uLgorICogQWxzbyBnaXZlcyBhIG1ldGhvZCB0byB1c2UgYSBzY3JpcHQgdG8gb2J0YWluIG9wdGltdW0gdGltaW5ncyAoVE9ETykKKyAqLworc3RhdGljIGlubGluZSBpbnQgaW1tX3Byb2Nfd3JpdGUoaW1tX3N0cnVjdCAqZGV2LCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCit7CisJdW5zaWduZWQgbG9uZyB4OworCisJaWYgKChsZW5ndGggPiA1KSAmJiAoc3RybmNtcChidWZmZXIsICJtb2RlPSIsIDUpID09IDApKSB7CisJCXggPSBzaW1wbGVfc3RydG91bChidWZmZXIgKyA1LCBOVUxMLCAwKTsKKwkJZGV2LT5tb2RlID0geDsKKwkJcmV0dXJuIGxlbmd0aDsKKwl9CisJcHJpbnRrKCJpbW0gL3Byb2M6IGludmFsaWQgdmFyaWFibGVcbiIpOworCXJldHVybiAoLUVJTlZBTCk7Cit9CisKK3N0YXRpYyBpbnQgaW1tX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwKKwkJCW9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworCWltbV9zdHJ1Y3QgKmRldiA9IGltbV9kZXYoaG9zdCk7CisJaW50IGxlbiA9IDA7CisKKwlpZiAoaW5vdXQpCisJCXJldHVybiBpbW1fcHJvY193cml0ZShkZXYsIGJ1ZmZlciwgbGVuZ3RoKTsKKworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIlZlcnNpb24gOiAlc1xuIiwgSU1NX1ZFUlNJT04pOworCWxlbiArPQorCSAgICBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIlBhcnBvcnQgOiAlc1xuIiwKKwkJICAgIGRldi0+ZGV2LT5wb3J0LT5uYW1lKTsKKwlsZW4gKz0KKwkgICAgc3ByaW50ZihidWZmZXIgKyBsZW4sICJNb2RlICAgIDogJXNcbiIsCisJCSAgICBJTU1fTU9ERV9TVFJJTkdbZGV2LT5tb2RlXSk7CisKKwkvKiBSZXF1ZXN0IGZvciBiZXlvbmQgZW5kIG9mIGJ1ZmZlciAqLworCWlmIChvZmZzZXQgPiBsZW4pCisJCXJldHVybiAwOworCisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCWxlbiAtPSBvZmZzZXQ7CisJaWYgKGxlbiA+IGxlbmd0aCkKKwkJbGVuID0gbGVuZ3RoOworCXJldHVybiBsZW47Cit9CisKKyNpZiBJTU1fREVCVUcgPiAwCisjZGVmaW5lIGltbV9mYWlsKHgseSkgcHJpbnRrKCJpbW06IGltbV9mYWlsKCVpKSBmcm9tICVzIGF0IGxpbmUgJWRcbiIsXAorCSAgIHksIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBpbW1fZmFpbF9mdW5jKHgseSk7CitzdGF0aWMgaW5saW5lIHZvaWQKK2ltbV9mYWlsX2Z1bmMoaW1tX3N0cnVjdCAqZGV2LCBpbnQgZXJyb3JfY29kZSkKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK2ltbV9mYWlsKGltbV9zdHJ1Y3QgKmRldiwgaW50IGVycm9yX2NvZGUpCisjZW5kaWYKK3sKKwkvKiBJZiB3ZSBmYWlsIGEgZGV2aWNlIHRoZW4gd2UgdHJhc2ggc3RhdHVzIC8gbWVzc2FnZSBieXRlcyAqLworCWlmIChkZXYtPmN1cl9jbWQpIHsKKwkJZGV2LT5jdXJfY21kLT5yZXN1bHQgPSBlcnJvcl9jb2RlIDw8IDE2OworCQlkZXYtPmZhaWxlZCA9IDE7CisJfQorfQorCisvKgorICogV2FpdCBmb3IgdGhlIGhpZ2ggYml0IHRvIGJlIHNldC4KKyAqIAorICogSW4gcHJpbmNpcGxlLCB0aGlzIGNvdWxkIGJlIHRpZWQgdG8gYW4gaW50ZXJydXB0LCBidXQgdGhlIGFkYXB0ZXIKKyAqIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGRlc2lnbmVkIHRvIHN1cHBvcnQgaW50ZXJydXB0cy4gIFdlIHNwaW4gb24KKyAqIHRoZSAweDgwIHJlYWR5IGJpdC4gCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGltbV93YWl0KGltbV9zdHJ1Y3QgKmRldikKK3sKKwlpbnQgazsKKwl1bnNpZ25lZCBzaG9ydCBwcGIgPSBkZXYtPmJhc2U7CisJdW5zaWduZWQgY2hhciByOworCisJd19jdHIocHBiLCAweDBjKTsKKworCWsgPSBJTU1fU1BJTl9UTU87CisJZG8geworCQlyID0gcl9zdHIocHBiKTsKKwkJay0tOworCQl1ZGVsYXkoMSk7CisJfQorCXdoaWxlICghKHIgJiAweDgwKSAmJiAoaykpOworCisJLyoKKwkgKiBTVFIgcmVnaXN0ZXIgKExQVCBiYXNlKzEpIHRvIFNDU0kgbWFwcGluZzoKKwkgKgorCSAqIFNUUiAgICAgIGltbSAgICAgaW1tCisJICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgKiAweDgwICAgICBTX1JFUSAgIFNfUkVRCisJICogMHg0MCAgICAgIVNfQlNZICAoPz8/PykKKwkgKiAweDIwICAgICAhU19DRCAgICFTX0NECisJICogMHgxMCAgICAgIVNfSU8gICAhU19JTworCSAqIDB4MDggICAgICg/Pz8/KSAgIVNfQlNZCisJICoKKwkgKiBpbW0gICAgICBpbW0gICAgIG1lYW5pbmcKKwkgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJICogMHhmMCAgICAgMHhiOCAgICBCaXQgbWFzaworCSAqIDB4YzAgICAgIDB4ODggICAgWklQIHdhbnRzIG1vcmUgZGF0YQorCSAqIDB4ZDAgICAgIDB4OTggICAgWklQIHdhbnRzIHRvIHNlbmQgbW9yZSBkYXRhCisJICogMHhlMCAgICAgMHhhOCAgICBaSVAgaXMgZXhwZWN0aW5nIFNDU0kgY29tbWFuZCBkYXRhCisJICogMHhmMCAgICAgMHhiOCAgICBlbmQgb2YgdHJhbnNmZXIsIFpJUCBpcyBzZW5kaW5nIHN0YXR1cworCSAqLworCXdfY3RyKHBwYiwgMHgwNCk7CisJaWYgKGspCisJCXJldHVybiAociAmIDB4YjgpOworCisJLyogQ291bnRlciBleHBpcmVkIC0gVGltZSBvdXQgb2NjdXJyZWQgKi8KKwlpbW1fZmFpbChkZXYsIERJRF9USU1FX09VVCk7CisJcHJpbnRrKCJpbW0gdGltZW91dCBpbiBpbW1fd2FpdFxuIik7CisJcmV0dXJuIDA7CQkvKiBjb21tYW5kIHRpbWVkIG91dCAqLworfQorCitzdGF0aWMgaW50IGltbV9uZWdvdGlhdGUoaW1tX3N0cnVjdCAqIHRtcCkKK3sKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgaXMgc3VwcG9zZWRseSB0aGUgSUVFRSAxMjg0LTE5OTQgbmVnb3RpYXRlCisJICogc2VxdWVuY2UuIEkgaGF2ZSB5ZXQgdG8gb2J0YWluIGEgY29weSBvZiB0aGUgYWJvdmUgc3RhbmRhcmQKKwkgKiBzbyB0aGlzIGlzIGEgYml0IG9mIGEgZ3Vlc3MuLi4KKwkgKgorCSAqIEEgZmFpciBjaHVuayBvZiB0aGlzIGlzIGJhc2VkIG9uIHRoZSBMaW51eCBwYXJwb3J0IGltcGxlbWVudGF0aW9uCisJICogb2YgSUVFRSAxMjg0LgorCSAqCisJICogUmV0dXJuIDAgaWYgZGF0YSBhdmFpbGFibGUKKwkgKiAgICAgICAgMSBpZiBubyBkYXRhIGF2YWlsYWJsZQorCSAqLworCisJdW5zaWduZWQgc2hvcnQgYmFzZSA9IHRtcC0+YmFzZTsKKwl1bnNpZ25lZCBjaGFyIGEsIG1vZGU7CisKKwlzd2l0Y2ggKHRtcC0+bW9kZSkgeworCWNhc2UgSU1NX05JQkJMRToKKwkJbW9kZSA9IDB4MDA7CisJCWJyZWFrOworCWNhc2UgSU1NX1BTMjoKKwkJbW9kZSA9IDB4MDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXdfY3RyKGJhc2UsIDB4MDQpOworCXVkZWxheSg1KTsKKwl3X2R0cihiYXNlLCBtb2RlKTsKKwl1ZGVsYXkoMTAwKTsKKwl3X2N0cihiYXNlLCAweDA2KTsKKwl1ZGVsYXkoNSk7CisJYSA9IChyX3N0cihiYXNlKSAmIDB4MjApID8gMCA6IDE7CisJdWRlbGF5KDUpOworCXdfY3RyKGJhc2UsIDB4MDcpOworCXVkZWxheSg1KTsKKwl3X2N0cihiYXNlLCAweDA2KTsKKworCWlmIChhKSB7CisJCXByaW50aworCQkgICAgKCJJTU06IElFRUUxMjg0IG5lZ290aWF0ZSBpbmRpY2F0ZXMgbm8gZGF0YSBhdmFpbGFibGUuXG4iKTsKKwkJaW1tX2ZhaWwodG1wLCBESURfRVJST1IpOworCX0KKwlyZXR1cm4gYTsKK30KKworLyogCisgKiBDbGVhciBFUFAgdGltZW91dCBiaXQuIAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZXBwX3Jlc2V0KHVuc2lnbmVkIHNob3J0IHBwYikKK3sKKwlpbnQgaTsKKworCWkgPSByX3N0cihwcGIpOworCXdfc3RyKHBwYiwgaSk7CisJd19zdHIocHBiLCBpICYgMHhmZSk7Cit9CisKKy8qIAorICogV2FpdCBmb3IgZW1wdHkgRUNQIGZpZm8gKGlmIHdlIGFyZSBpbiBFQ1AgZmlmbyBtb2RlIG9ubHkpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlY3Bfc3luYyhpbW1fc3RydWN0ICpkZXYpCit7CisJaW50IGksIHBwYl9oaSA9IGRldi0+YmFzZV9oaTsKKworCWlmIChwcGJfaGkgPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKChyX2VjcihwcGJfaGkpICYgMHhlMCkgPT0gMHg2MCkgewkvKiBtb2RlIDAxMSA9PSBFQ1AgZmlmbyBtb2RlICovCisJCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQkJaWYgKHJfZWNyKHBwYl9oaSkgJiAweDAxKQorCQkJCXJldHVybjsKKwkJCXVkZWxheSg1KTsKKwkJfQorCQlwcmludGsoImltbTogRUNQIHN5bmMgZmFpbGVkIGFzIGRhdGEgc3RpbGwgcHJlc2VudCBpbiBGSUZPLlxuIik7CisJfQorfQorCitzdGF0aWMgaW50IGltbV9ieXRlX291dCh1bnNpZ25lZCBzaG9ydCBiYXNlLCBjb25zdCBjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisJaW50IGk7CisKKwl3X2N0cihiYXNlLCAweDQpOwkvKiBhcHBhcmVudGx5IGEgc2FuZSBtb2RlICovCisJZm9yIChpID0gbGVuID4+IDE7IGk7IGktLSkgeworCQl3X2R0cihiYXNlLCAqYnVmZmVyKyspOworCQl3X2N0cihiYXNlLCAweDUpOwkvKiBEcm9wIFNUUk9CRSBsb3cgKi8KKwkJd19kdHIoYmFzZSwgKmJ1ZmZlcisrKTsKKwkJd19jdHIoYmFzZSwgMHgwKTsJLyogU1RST0JFIGhpZ2ggKyBJTklUIGxvdyAqLworCX0KKwl3X2N0cihiYXNlLCAweDQpOwkvKiBhcHBhcmVudGx5IGEgc2FuZSBtb2RlICovCisJcmV0dXJuIDE7CQkvKiBBbGwgd2VudCB3ZWxsIC0gd2UgaG9wZSEgKi8KK30KKworc3RhdGljIGludCBpbW1fbmliYmxlX2luKHVuc2lnbmVkIHNob3J0IGJhc2UsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyIGw7CisJaW50IGk7CisKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgaXMgYmFzZWQgb24gZG9jdW1lbnRlZCB0aW1pbmcgc2lnbmFscworCSAqLworCXdfY3RyKGJhc2UsIDB4NCk7CisJZm9yIChpID0gbGVuOyBpOyBpLS0pIHsKKwkJd19jdHIoYmFzZSwgMHg2KTsKKwkJbCA9IChyX3N0cihiYXNlKSAmIDB4ZjApID4+IDQ7CisJCXdfY3RyKGJhc2UsIDB4NSk7CisJCSpidWZmZXIrKyA9IChyX3N0cihiYXNlKSAmIDB4ZjApIHwgbDsKKwkJd19jdHIoYmFzZSwgMHg0KTsKKwl9CisJcmV0dXJuIDE7CQkvKiBBbGwgd2VudCB3ZWxsIC0gd2UgaG9wZSEgKi8KK30KKworc3RhdGljIGludCBpbW1fYnl0ZV9pbih1bnNpZ25lZCBzaG9ydCBiYXNlLCBjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisJaW50IGk7CisKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgaXMgYmFzZWQgb24gZG9jdW1lbnRlZCB0aW1pbmcgc2lnbmFscworCSAqLworCXdfY3RyKGJhc2UsIDB4NCk7CisJZm9yIChpID0gbGVuOyBpOyBpLS0pIHsKKwkJd19jdHIoYmFzZSwgMHgyNik7CisJCSpidWZmZXIrKyA9IHJfZHRyKGJhc2UpOworCQl3X2N0cihiYXNlLCAweDI1KTsKKwl9CisJcmV0dXJuIDE7CQkvKiBBbGwgd2VudCB3ZWxsIC0gd2UgaG9wZSEgKi8KK30KKworc3RhdGljIGludCBpbW1fb3V0KGltbV9zdHJ1Y3QgKmRldiwgY2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIHNob3J0IHBwYiA9IGRldi0+YmFzZTsKKwlpbnQgciA9IGltbV93YWl0KGRldik7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0OgorCSAqIGEpIHRoZSBTQ1NJIGJ1cyBpcyBCVVNZIChkZXZpY2Ugc3RpbGwgbGlzdGVuaW5nKQorCSAqIGIpIHRoZSBkZXZpY2UgaXMgbGlzdGVuaW5nCisJICovCisJaWYgKChyICYgMHgxOCkgIT0gMHgwOCkgeworCQlpbW1fZmFpbChkZXYsIERJRF9FUlJPUik7CisJCXByaW50aygiSU1NOiByZXR1cm5lZCBTQ1NJIHN0YXR1cyAlMnhcbiIsIHIpOworCQlyZXR1cm4gMDsKKwl9CisJc3dpdGNoIChkZXYtPm1vZGUpIHsKKwljYXNlIElNTV9FUFBfMzI6CisJY2FzZSBJTU1fRVBQXzE2OgorCWNhc2UgSU1NX0VQUF84OgorCQllcHBfcmVzZXQocHBiKTsKKwkJd19jdHIocHBiLCAweDQpOworI2lmZGVmIENPTkZJR19TQ1NJX0laSVBfRVBQMTYKKwkJaWYgKCEoKChsb25nKSBidWZmZXIgfCBsZW4pICYgMHgwMSkpCisJCQlvdXRzdyhwcGIgKyA0LCBidWZmZXIsIGxlbiA+PiAxKTsKKyNlbHNlCisJCWlmICghKCgobG9uZykgYnVmZmVyIHwgbGVuKSAmIDB4MDMpKQorCQkJb3V0c2wocHBiICsgNCwgYnVmZmVyLCBsZW4gPj4gMik7CisjZW5kaWYKKwkJZWxzZQorCQkJb3V0c2IocHBiICsgNCwgYnVmZmVyLCBsZW4pOworCQl3X2N0cihwcGIsIDB4Yyk7CisJCXIgPSAhKHJfc3RyKHBwYikgJiAweDAxKTsKKwkJd19jdHIocHBiLCAweGMpOworCQllY3Bfc3luYyhkZXYpOworCQlicmVhazsKKworCWNhc2UgSU1NX05JQkJMRToKKwljYXNlIElNTV9QUzI6CisJCS8qIDggYml0IG91dHB1dCwgd2l0aCBhIGxvb3AgKi8KKwkJciA9IGltbV9ieXRlX291dChwcGIsIGJ1ZmZlciwgbGVuKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoIklNTTogYnVnIGluIGltbV9vdXQoKVxuIik7CisJCXIgPSAwOworCX0KKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBpbW1faW4oaW1tX3N0cnVjdCAqZGV2LCBjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisJdW5zaWduZWQgc2hvcnQgcHBiID0gZGV2LT5iYXNlOworCWludCByID0gaW1tX3dhaXQoZGV2KTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQ6CisJICogYSkgdGhlIFNDU0kgYnVzIGlzIEJVU1kgKGRldmljZSBzdGlsbCBsaXN0ZW5pbmcpCisJICogYikgdGhlIGRldmljZSBpcyBzZW5kaW5nIGRhdGEKKwkgKi8KKwlpZiAoKHIgJiAweDE4KSAhPSAweDE4KSB7CisJCWltbV9mYWlsKGRldiwgRElEX0VSUk9SKTsKKwkJcmV0dXJuIDA7CisJfQorCXN3aXRjaCAoZGV2LT5tb2RlKSB7CisJY2FzZSBJTU1fTklCQkxFOgorCQkvKiA0IGJpdCBpbnB1dCwgd2l0aCBhIGxvb3AgKi8KKwkJciA9IGltbV9uaWJibGVfaW4ocHBiLCBidWZmZXIsIGxlbik7CisJCXdfY3RyKHBwYiwgMHhjKTsKKwkJYnJlYWs7CisKKwljYXNlIElNTV9QUzI6CisJCS8qIDggYml0IGlucHV0LCB3aXRoIGEgbG9vcCAqLworCQlyID0gaW1tX2J5dGVfaW4ocHBiLCBidWZmZXIsIGxlbik7CisJCXdfY3RyKHBwYiwgMHhjKTsKKwkJYnJlYWs7CisKKwljYXNlIElNTV9FUFBfMzI6CisJY2FzZSBJTU1fRVBQXzE2OgorCWNhc2UgSU1NX0VQUF84OgorCQllcHBfcmVzZXQocHBiKTsKKwkJd19jdHIocHBiLCAweDI0KTsKKyNpZmRlZiBDT05GSUdfU0NTSV9JWklQX0VQUDE2CisJCWlmICghKCgobG9uZykgYnVmZmVyIHwgbGVuKSAmIDB4MDEpKQorCQkJaW5zdyhwcGIgKyA0LCBidWZmZXIsIGxlbiA+PiAxKTsKKyNlbHNlCisJCWlmICghKCgobG9uZykgYnVmZmVyIHwgbGVuKSAmIDB4MDMpKQorCQkJaW5zbChwcGIgKyA0LCBidWZmZXIsIGxlbiA+PiAyKTsKKyNlbmRpZgorCQllbHNlCisJCQlpbnNiKHBwYiArIDQsIGJ1ZmZlciwgbGVuKTsKKwkJd19jdHIocHBiLCAweDJjKTsKKwkJciA9ICEocl9zdHIocHBiKSAmIDB4MDEpOworCQl3X2N0cihwcGIsIDB4MmMpOworCQllY3Bfc3luYyhkZXYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiSU1NOiBidWcgaW4gaW1tX2lucygpXG4iKTsKKwkJciA9IDA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBpbW1fY3BwKHVuc2lnbmVkIHNob3J0IHBwYiwgdW5zaWduZWQgY2hhciBiKQoreworCS8qCisJICogQ29tbWVudHMgb24gdWRlbGF5IHZhbHVlcyByZWZlciB0byB0aGUKKwkgKiBDb21tYW5kIFBhY2tldCBQcm90b2NvbCAoQ1BQKSB0aW1pbmcgZGlhZ3JhbS4KKwkgKi8KKworCXVuc2lnbmVkIGNoYXIgczEsIHMyLCBzMzsKKwl3X2N0cihwcGIsIDB4MGMpOworCXVkZWxheSgyKTsJCS8qIDEgdXNlYyAtIGluZmluaXRlICovCisJd19kdHIocHBiLCAweGFhKTsKKwl1ZGVsYXkoMTApOwkJLyogNyB1c2VjIC0gaW5maW5pdGUgKi8KKwl3X2R0cihwcGIsIDB4NTUpOworCXVkZWxheSgxMCk7CQkvKiA3IHVzZWMgLSBpbmZpbml0ZSAqLworCXdfZHRyKHBwYiwgMHgwMCk7CisJdWRlbGF5KDEwKTsJCS8qIDcgdXNlYyAtIGluZmluaXRlICovCisJd19kdHIocHBiLCAweGZmKTsKKwl1ZGVsYXkoMTApOwkJLyogNyB1c2VjIC0gaW5maW5pdGUgKi8KKwlzMSA9IHJfc3RyKHBwYikgJiAweGI4OworCXdfZHRyKHBwYiwgMHg4Nyk7CisJdWRlbGF5KDEwKTsJCS8qIDcgdXNlYyAtIGluZmluaXRlICovCisJczIgPSByX3N0cihwcGIpICYgMHhiODsKKwl3X2R0cihwcGIsIDB4NzgpOworCXVkZWxheSgxMCk7CQkvKiA3IHVzZWMgLSBpbmZpbml0ZSAqLworCXMzID0gcl9zdHIocHBiKSAmIDB4Mzg7CisJLyoKKwkgKiBWYWx1ZXMgZm9yIGIgYXJlOgorCSAqIDAwMDAgMDBhYSAgICBBc3NpZ24gYWRkcmVzcyBhYSB0byBjdXJyZW50IGRldmljZQorCSAqIDAwMTAgMDBhYSAgICBTZWxlY3QgZGV2aWNlIGFhIGluIEVQUCBXaW5ib25kIG1vZGUKKwkgKiAwMDEwIDEwYWEgICAgU2VsZWN0IGRldmljZSBhYSBpbiBFUFAgbW9kZQorCSAqIDAwMTEgeHh4eCAgICBEZXNlbGVjdCBhbGwgZGV2aWNlcworCSAqIDAxMTAgMDBhYSAgICBUZXN0IGRldmljZSBhYQorCSAqIDExMDEgMDBhYSAgICBTZWxlY3QgZGV2aWNlIGFhIGluIEVDUCBtb2RlCisJICogMTExMCAwMGFhICAgIFNlbGVjdCBkZXZpY2UgYWEgaW4gQ29tcGF0aWJsZSBtb2RlCisJICovCisJd19kdHIocHBiLCBiKTsKKwl1ZGVsYXkoMik7CQkvKiAxIHVzZWMgLSBpbmZpbml0ZSAqLworCXdfY3RyKHBwYiwgMHgwYyk7CisJdWRlbGF5KDEwKTsJCS8qIDcgdXNlYyAtIGluZmluaXRlICovCisJd19jdHIocHBiLCAweDBkKTsKKwl1ZGVsYXkoMik7CQkvKiAxIHVzZWMgLSBpbmZpbml0ZSAqLworCXdfY3RyKHBwYiwgMHgwYyk7CisJdWRlbGF5KDEwKTsJCS8qIDcgdXNlYyAtIGluZmluaXRlICovCisJd19kdHIocHBiLCAweGZmKTsKKwl1ZGVsYXkoMTApOwkJLyogNyB1c2VjIC0gaW5maW5pdGUgKi8KKworCS8qCisJICogVGhlIGZvbGxvd2luZyB0YWJsZSBpcyBlbGVjdHJpY2FsIHBpbiB2YWx1ZXMuCisJICogKEJTWSBpcyBpbnZlcnRlZCBhdCB0aGUgQ1RSIHJlZ2lzdGVyKQorCSAqCisJICogICAgICAgQlNZICBBQ0sgIFBPdXQgU0VMICBGYXVsdAorCSAqIFMxICAgIDAgICAgWCAgICAxICAgIDEgICAgMQorCSAqIFMyICAgIDEgICAgWCAgICAwICAgIDEgICAgMQorCSAqIFMzICAgIEwgICAgWCAgICAxICAgIDEgICAgUworCSAqCisJICogTCA9PiBMYXN0IGRldmljZSBpbiBjaGFpbgorCSAqIFMgPT4gU2VsZWN0ZWQKKwkgKgorCSAqIE9ic2VydmVyZWQgdmFsdWVzIGZvciBTMSxTMixTMyBhcmU6CisJICogRGlzY29ubmVjdCA9PiBmOC81OC83OAorCSAqIENvbm5lY3QgICAgPT4gZjgvNTgvNzAKKwkgKi8KKwlpZiAoKHMxID09IDB4YjgpICYmIChzMiA9PSAweDE4KSAmJiAoczMgPT0gMHgzMCkpCisJCXJldHVybiAxOwkvKiBDb25uZWN0ZWQgKi8KKwlpZiAoKHMxID09IDB4YjgpICYmIChzMiA9PSAweDE4KSAmJiAoczMgPT0gMHgzOCkpCisJCXJldHVybiAwOwkvKiBEaXNjb25uZWN0ZWQgKi8KKworCXJldHVybiAtMTsJCS8qIE5vIGRldmljZSBwcmVzZW50ICovCit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGltbV9jb25uZWN0KGltbV9zdHJ1Y3QgKmRldiwgaW50IGZsYWcpCit7CisJdW5zaWduZWQgc2hvcnQgcHBiID0gZGV2LT5iYXNlOworCisJaW1tX2NwcChwcGIsIDB4ZTApOwkvKiBTZWxlY3QgZGV2aWNlIDAgaW4gY29tcGF0aWJsZSBtb2RlICovCisJaW1tX2NwcChwcGIsIDB4MzApOwkvKiBEaXNjb25uZWN0IGFsbCBkZXZpY2VzICovCisKKwlpZiAoKGRldi0+bW9kZSA9PSBJTU1fRVBQXzgpIHx8CisJICAgIChkZXYtPm1vZGUgPT0gSU1NX0VQUF8xNikgfHwKKwkgICAgKGRldi0+bW9kZSA9PSBJTU1fRVBQXzMyKSkKKwkJcmV0dXJuIGltbV9jcHAocHBiLCAweDI4KTsJLyogU2VsZWN0IGRldmljZSAwIGluIEVQUCBtb2RlICovCisJcmV0dXJuIGltbV9jcHAocHBiLCAweGUwKTsJLyogU2VsZWN0IGRldmljZSAwIGluIGNvbXBhdGlibGUgbW9kZSAqLworfQorCitzdGF0aWMgdm9pZCBpbW1fZGlzY29ubmVjdChpbW1fc3RydWN0ICpkZXYpCit7CisJaW1tX2NwcChkZXYtPmJhc2UsIDB4MzApOwkvKiBEaXNjb25uZWN0IGFsbCBkZXZpY2VzICovCit9CisKK3N0YXRpYyBpbnQgaW1tX3NlbGVjdChpbW1fc3RydWN0ICpkZXYsIGludCB0YXJnZXQpCit7CisJaW50IGs7CisJdW5zaWduZWQgc2hvcnQgcHBiID0gZGV2LT5iYXNlOworCisJLyoKKwkgKiBGaXJzdGx5IHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vdGhpbmcKKwkgKiBob2xkaW5nIG9udG8gdGhlIFNDU0kgYnVzLgorCSAqLworCXdfY3RyKHBwYiwgMHhjKTsKKworCWsgPSBJTU1fU0VMRUNUX1RNTzsKKwlkbyB7CisJCWstLTsKKwl9IHdoaWxlICgocl9zdHIocHBiKSAmIDB4MDgpICYmIChrKSk7CisKKwlpZiAoIWspCisJCXJldHVybiAwOworCisJLyoKKwkgKiBOb3cgYXNzZXJ0IHRoZSBTQ1NJIElEIChIT1NUIGFuZCBUQVJHRVQpIG9uIHRoZSBkYXRhIGJ1cworCSAqLworCXdfY3RyKHBwYiwgMHg0KTsKKwl3X2R0cihwcGIsIDB4ODAgfCAoMSA8PCB0YXJnZXQpKTsKKwl1ZGVsYXkoMSk7CisKKwkvKgorCSAqIERlYXNzZXJ0IFNFTElOIGZpcnN0IGZvbGxvd2VkIGJ5IFNUUk9CRQorCSAqLworCXdfY3RyKHBwYiwgMHhjKTsKKwl3X2N0cihwcGIsIDB4ZCk7CisKKwkvKgorCSAqIEFDSyBzaG91bGQgZHJvcCBsb3cgd2hpbGUgU0VMSU4gaXMgZGVhc3NlcnRlZC4KKwkgKiBGQVVMVCBzaG91bGQgZHJvcCBsb3cgd2hlbiB0aGUgU0NTSSBkZXZpY2UgbGF0Y2hlcyB0aGUgYnVzLgorCSAqLworCWsgPSBJTU1fU0VMRUNUX1RNTzsKKwlkbyB7CisJCWstLTsKKwl9CisJd2hpbGUgKCEocl9zdHIocHBiKSAmIDB4MDgpICYmIChrKSk7CisKKwkvKgorCSAqIFBsYWNlIHRoZSBpbnRlcmZhY2UgYmFjayBpbnRvIGEgc2FuZSBzdGF0ZSAoc3RhdHVzIG1vZGUpCisJICovCisJd19jdHIocHBiLCAweGMpOworCXJldHVybiAoaykgPyAxIDogMDsKK30KKworc3RhdGljIGludCBpbW1faW5pdChpbW1fc3RydWN0ICpkZXYpCit7CisJaWYgKGltbV9jb25uZWN0KGRldiwgMCkgIT0gMSkKKwkJcmV0dXJuIC1FSU87CisJaW1tX3Jlc2V0X3B1bHNlKGRldi0+YmFzZSk7CisJdWRlbGF5KDEwMDApOwkvKiBEZWxheSB0byBhbGxvdyBkZXZpY2VzIHRvIHNldHRsZSAqLworCWltbV9kaXNjb25uZWN0KGRldik7CisJdWRlbGF5KDEwMDApOwkvKiBBbm90aGVyIGRlbGF5IHRvIGFsbG93IGRldmljZXMgdG8gc2V0dGxlICovCisJcmV0dXJuIGRldmljZV9jaGVjayhkZXYpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpbW1fc2VuZF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlpbW1fc3RydWN0ICpkZXYgPSBpbW1fZGV2KGNtZC0+ZGV2aWNlLT5ob3N0KTsKKwlpbnQgazsKKworCS8qIE5PVEU6IElNTSB1c2VzIGJ5dGUgcGFpcnMgKi8KKwlmb3IgKGsgPSAwOyBrIDwgY21kLT5jbWRfbGVuOyBrICs9IDIpCisJCWlmICghaW1tX291dChkZXYsICZjbWQtPmNtbmRba10sIDIpKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGUgYnVsayBmbGFnIGVuYWJsZXMgc29tZSBvcHRpbWlzYXRpb25zIGluIHRoZSBkYXRhIHRyYW5zZmVyIGxvb3BzLAorICogaXQgc2hvdWxkIGJlIHRydWUgZm9yIGFueSBjb21tYW5kIHRoYXQgdHJhbnNmZXJzIGRhdGEgaW4gaW50ZWdyYWwKKyAqIG51bWJlcnMgb2Ygc2VjdG9ycy4KKyAqIAorICogVGhlIGRyaXZlciBhcHBlYXJzIHRvIHJlbWFpbiBzdGFibGUgaWYgd2Ugc3BlZWQgdXAgdGhlIHBhcmFsbGVsIHBvcnQKKyAqIGkvbyBpbiB0aGlzIGZ1bmN0aW9uLCBidXQgbm90IGVsc2V3aGVyZS4KKyAqLworc3RhdGljIGludCBpbW1fY29tcGxldGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJLyogUmV0dXJuIGNvZGVzOgorCSAqIC0xICAgICBFcnJvcgorCSAqICAwICAgICBUb2xkIHRvIHNjaGVkdWxlCisJICogIDEgICAgIEZpbmlzaGVkIGRhdGEgdHJhbnNmZXIKKwkgKi8KKwlpbW1fc3RydWN0ICpkZXYgPSBpbW1fZGV2KGNtZC0+ZGV2aWNlLT5ob3N0KTsKKwl1bnNpZ25lZCBzaG9ydCBwcGIgPSBkZXYtPmJhc2U7CisJdW5zaWduZWQgbG9uZyBzdGFydF9qaWZmaWVzID0gamlmZmllczsKKworCXVuc2lnbmVkIGNoYXIgciwgdjsKKwlpbnQgZmFzdCwgYnVsaywgc3RhdHVzOworCisJdiA9IGNtZC0+Y21uZFswXTsKKwlidWxrID0gKCh2ID09IFJFQURfNikgfHwKKwkJKHYgPT0gUkVBRF8xMCkgfHwgKHYgPT0gV1JJVEVfNikgfHwgKHYgPT0gV1JJVEVfMTApKTsKKworCS8qCisJICogV2Ugb25seSBnZXQgaGVyZSBpZiB0aGUgZHJpdmUgaXMgcmVhZHkgdG8gY29tdW5pY2F0ZSwKKwkgKiBoZW5jZSBubyBuZWVkIGZvciBhIGZ1bGwgaW1tX3dhaXQuCisJICovCisJd19jdHIocHBiLCAweDBjKTsKKwlyID0gKHJfc3RyKHBwYikgJiAweGI4KTsKKworCS8qCisJICogd2hpbGUgKGRldmljZSBpcyBub3QgcmVhZHkgdG8gc2VuZCBzdGF0dXMgYnl0ZSkKKwkgKiAgICAgbG9vcDsKKwkgKi8KKwl3aGlsZSAociAhPSAodW5zaWduZWQgY2hhcikgMHhiOCkgeworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGJlZW4gcnVubmluZyBmb3IgbW9yZSB0aGFuIGEgZnVsbCB0aW1lciB0aWNrCisJCSAqIHRoZW4gdGFrZSBhIHJlc3QuCisJCSAqLworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGFydF9qaWZmaWVzICsgMSkpCisJCQlyZXR1cm4gMDsKKworCQkvKgorCQkgKiBGQUlMIGlmOgorCQkgKiBhKSBEcml2ZSBzdGF0dXMgaXMgc2NyZXd5ICghcmVhZHkgJiYgIXByZXNlbnQpCisJCSAqIGIpIERyaXZlIGlzIHJlcXVlc3Rpbmcvc2VuZGluZyBtb3JlIGRhdGEgdGhhbiBleHBlY3RlZAorCQkgKi8KKwkJaWYgKCgociAmIDB4ODgpICE9IDB4ODgpIHx8IChjbWQtPlNDcC50aGlzX3Jlc2lkdWFsIDw9IDApKSB7CisJCQlpbW1fZmFpbChkZXYsIERJRF9FUlJPUik7CisJCQlyZXR1cm4gLTE7CS8qIEVSUk9SX1JFVFVSTiAqLworCQl9CisJCS8qIGRldGVybWluZSBpZiB3ZSBzaG91bGQgdXNlIGJ1cnN0IEkvTyAqLworCQlpZiAoZGV2LT5yZCA9PSAwKSB7CisJCQlmYXN0ID0gKGJ1bGsKKwkJCQkmJiAoY21kLT5TQ3AudGhpc19yZXNpZHVhbCA+PQorCQkJCSAgICBJTU1fQlVSU1RfU0laRSkpID8gSU1NX0JVUlNUX1NJWkUgOiAyOworCQkJc3RhdHVzID0gaW1tX291dChkZXYsIGNtZC0+U0NwLnB0ciwgZmFzdCk7CisJCX0gZWxzZSB7CisJCQlmYXN0ID0gKGJ1bGsKKwkJCQkmJiAoY21kLT5TQ3AudGhpc19yZXNpZHVhbCA+PQorCQkJCSAgICBJTU1fQlVSU1RfU0laRSkpID8gSU1NX0JVUlNUX1NJWkUgOiAxOworCQkJc3RhdHVzID0gaW1tX2luKGRldiwgY21kLT5TQ3AucHRyLCBmYXN0KTsKKwkJfQorCisJCWNtZC0+U0NwLnB0ciArPSBmYXN0OworCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsIC09IGZhc3Q7CisKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCWltbV9mYWlsKGRldiwgRElEX0JVU19CVVNZKTsKKwkJCXJldHVybiAtMTsJLyogRVJST1JfUkVUVVJOICovCisJCX0KKwkJaWYgKGNtZC0+U0NwLmJ1ZmZlciAmJiAhY21kLT5TQ3AudGhpc19yZXNpZHVhbCkgeworCQkJLyogaWYgc2NhdHRlci9nYXRoZXIsIGFkdmFuY2UgdG8gdGhlIG5leHQgc2VnbWVudCAqLworCQkJaWYgKGNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwtLSkgeworCQkJCWNtZC0+U0NwLmJ1ZmZlcisrOworCQkJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPQorCQkJCSAgICBjbWQtPlNDcC5idWZmZXItPmxlbmd0aDsKKwkJCQljbWQtPlNDcC5wdHIgPQorCQkJCSAgICBwYWdlX2FkZHJlc3MoY21kLT5TQ3AuYnVmZmVyLT5wYWdlKSArCisJCQkJICAgIGNtZC0+U0NwLmJ1ZmZlci0+b2Zmc2V0OworCisJCQkJLyoKKwkJCQkgKiBNYWtlIHN1cmUgdGhhdCB3ZSB0cmFuc2ZlciBldmVuIG51bWJlciBvZiBieXRlcworCQkJCSAqIG90aGVyd2lzZSBpdCBtYWtlcyBpbW1fYnl0ZV9vdXQoKSBtZXNzeS4KKwkJCQkgKi8KKwkJCQlpZiAoY21kLT5TQ3AudGhpc19yZXNpZHVhbCAmIDB4MDEpCisJCQkJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwrKzsKKwkJCX0KKwkJfQorCQkvKiBOb3cgY2hlY2sgdG8gc2VlIGlmIHRoZSBkcml2ZSBpcyByZWFkeSB0byBjb211bmljYXRlICovCisJCXdfY3RyKHBwYiwgMHgwYyk7CisJCXIgPSAocl9zdHIocHBiKSAmIDB4YjgpOworCisJCS8qIElmIG5vdCwgZHJvcCBiYWNrIGRvd24gdG8gdGhlIHNjaGVkdWxlciBhbmQgd2FpdCBhIHRpbWVyIHRpY2sgKi8KKwkJaWYgKCEociAmIDB4ODApKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOwkJLyogRklOSVNIX1JFVFVSTiAqLworfQorCisvKgorICogU2luY2UgdGhlIElNTSBpdHNlbGYgZG9lc24ndCBnZW5lcmF0ZSBpbnRlcnJ1cHRzLCB3ZSB1c2UKKyAqIHRoZSBzY2hlZHVsZXIncyB0YXNrIHF1ZXVlIHRvIGdlbmVyYXRlIGEgc3RyZWFtIG9mIGNhbGwtYmFja3MgYW5kCisgKiBjb21wbGV0ZSB0aGUgcmVxdWVzdCB3aGVuIHRoZSBkcml2ZSBpcyByZWFkeS4KKyAqLworc3RhdGljIHZvaWQgaW1tX2ludGVycnVwdCh2b2lkICpkYXRhKQoreworCWltbV9zdHJ1Y3QgKmRldiA9IChpbW1fc3RydWN0ICopIGRhdGE7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gZGV2LT5jdXJfY21kOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjbWQtPmRldmljZS0+aG9zdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFjbWQpIHsKKwkJcHJpbnRrKCJJTU06IGJ1ZyBpbiBpbW1faW50ZXJydXB0XG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoaW1tX2VuZ2luZShkZXYsIGNtZCkpIHsKKwkJSU5JVF9XT1JLKCZkZXYtPmltbV90cSwgaW1tX2ludGVycnVwdCwgKHZvaWQgKikgZGV2KTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkZXYtPmltbV90cSwgMSk7CisJCXJldHVybjsKKwl9CisJLyogQ29tbWFuZCBtdXN0IG9mIGNvbXBsZXRlZCBoZW5jZSBpdCBpcyBzYWZlIHRvIGxldCBnby4uLiAqLworI2lmIElNTV9ERUJVRyA+IDAKKwlzd2l0Y2ggKChjbWQtPnJlc3VsdCA+PiAxNikgJiAweGZmKSB7CisJY2FzZSBESURfT0s6CisJCWJyZWFrOworCWNhc2UgRElEX05PX0NPTk5FQ1Q6CisJCXByaW50aygiaW1tOiBubyBkZXZpY2UgYXQgU0NTSSBJRCAlaVxuIiwgY21kLT5kZXZpY2UtPmlkKTsKKwkJYnJlYWs7CisJY2FzZSBESURfQlVTX0JVU1k6CisJCXByaW50aygiaW1tOiBCVVMgQlVTWSAtIEVQUCB0aW1lb3V0IGRldGVjdGVkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBESURfVElNRV9PVVQ6CisJCXByaW50aygiaW1tOiB1bmtub3duIHRpbWVvdXRcbiIpOworCQlicmVhazsKKwljYXNlIERJRF9BQk9SVDoKKwkJcHJpbnRrKCJpbW06IHRvbGQgdG8gYWJvcnRcbiIpOworCQlicmVhazsKKwljYXNlIERJRF9QQVJJVFk6CisJCXByaW50aygiaW1tOiBwYXJpdHkgZXJyb3IgKD8/PylcbiIpOworCQlicmVhazsKKwljYXNlIERJRF9FUlJPUjoKKwkJcHJpbnRrKCJpbW06IGludGVybmFsIGRyaXZlciBlcnJvclxuIik7CisJCWJyZWFrOworCWNhc2UgRElEX1JFU0VUOgorCQlwcmludGsoImltbTogdG9sZCB0byByZXNldCBkZXZpY2VcbiIpOworCQlicmVhazsKKwljYXNlIERJRF9CQURfSU5UUjoKKwkJcHJpbnRrKCJpbW06IGJhZCBpbnRlcnJ1cHQgKD8/PylcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoImltbTogYmFkIHJldHVybiBjb2RlICglMDJ4KVxuIiwKKwkJICAgICAgIChjbWQtPnJlc3VsdCA+PiAxNikgJiAweGZmKTsKKwl9CisjZW5kaWYKKworCWlmIChjbWQtPlNDcC5waGFzZSA+IDEpCisJCWltbV9kaXNjb25uZWN0KGRldik7CisKKwlpbW1fcGJfZGlzbWlzcyhkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJZGV2LT5jdXJfY21kID0gTlVMTDsKKwljbWQtPnNjc2lfZG9uZShjbWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGltbV9lbmdpbmUoaW1tX3N0cnVjdCAqZGV2LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJdW5zaWduZWQgc2hvcnQgcHBiID0gZGV2LT5iYXNlOworCXVuc2lnbmVkIGNoYXIgbCA9IDAsIGggPSAwOworCWludCByZXR2LCB4OworCisJLyogRmlyc3QgY2hlY2sgZm9yIGFueSBlcnJvcnMgdGhhdCBtYXkgaGF2ZSBvY2N1cnJlZAorCSAqIEhlcmUgd2UgY2hlY2sgZm9yIGludGVybmFsIGVycm9ycworCSAqLworCWlmIChkZXYtPmZhaWxlZCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGNtZC0+U0NwLnBoYXNlKSB7CisJY2FzZSAwOgkJLyogUGhhc2UgMCAtIFdhaXRpbmcgZm9yIHBhcnBvcnQgKi8KKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGV2LT5qc3RhcnQgKyBIWikpIHsKKwkJCS8qCisJCQkgKiBXZSB3YWl0ZWQgbW9yZSB0aGFuIGEgc2Vjb25kCisJCQkgKiBmb3IgcGFycG9ydCB0byBjYWxsIHVzCisJCQkgKi8KKwkJCWltbV9mYWlsKGRldiwgRElEX0JVU19CVVNZKTsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiAxOwkvKiB3YWl0IHVudGlsIGltbV93YWtldXAgY2xhaW1zIHBhcnBvcnQgKi8KKwkJLyogUGhhc2UgMSAtIENvbm5lY3RlZCAqLworCWNhc2UgMToKKwkJaW1tX2Nvbm5lY3QoZGV2LCBDT05ORUNUX0VQUF9NQVlCRSk7CisJCWNtZC0+U0NwLnBoYXNlKys7CisKKwkJLyogUGhhc2UgMiAtIFdlIGFyZSBub3cgdGFsa2luZyB0byB0aGUgc2NzaSBidXMgKi8KKwljYXNlIDI6CisJCWlmICghaW1tX3NlbGVjdChkZXYsIGNtZC0+ZGV2aWNlLT5pZCkpIHsKKwkJCWltbV9mYWlsKGRldiwgRElEX05PX0NPTk5FQ1QpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY21kLT5TQ3AucGhhc2UrKzsKKworCQkvKiBQaGFzZSAzIC0gUmVhZHkgdG8gYWNjZXB0IGEgY29tbWFuZCAqLworCWNhc2UgMzoKKwkJd19jdHIocHBiLCAweDBjKTsKKwkJaWYgKCEocl9zdHIocHBiKSAmIDB4ODApKQorCQkJcmV0dXJuIDE7CisKKwkJaWYgKCFpbW1fc2VuZF9jb21tYW5kKGNtZCkpCisJCQlyZXR1cm4gMDsKKwkJY21kLT5TQ3AucGhhc2UrKzsKKworCQkvKiBQaGFzZSA0IC0gU2V0dXAgc2NhdHRlci9nYXRoZXIgYnVmZmVycyAqLworCWNhc2UgNDoKKwkJaWYgKGNtZC0+dXNlX3NnKSB7CisJCQkvKiBpZiBtYW55IGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZSwgc3RhcnQgZmlsbGluZyB0aGUgZmlyc3QgKi8KKwkJCWNtZC0+U0NwLmJ1ZmZlciA9CisJCQkgICAgKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCQkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IGNtZC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCQkJY21kLT5TQ3AucHRyID0KKwkJCSAgICBwYWdlX2FkZHJlc3MoY21kLT5TQ3AuYnVmZmVyLT5wYWdlKSArCisJCQkgICAgY21kLT5TQ3AuYnVmZmVyLT5vZmZzZXQ7CisJCX0gZWxzZSB7CisJCQkvKiBlbHNlIGZpbGwgdGhlIG9ubHkgYXZhaWxhYmxlIGJ1ZmZlciAqLworCQkJY21kLT5TQ3AuYnVmZmVyID0gTlVMTDsKKwkJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJCWNtZC0+U0NwLnB0ciA9IGNtZC0+cmVxdWVzdF9idWZmZXI7CisJCX0KKwkJY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IGNtZC0+dXNlX3NnIC0gMTsKKwkJY21kLT5TQ3AucGhhc2UrKzsKKwkJaWYgKGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgJiAweDAxKQorCQkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCsrOworCQkvKiBQaGFzZSA1IC0gUHJlLURhdGEgdHJhbnNmZXIgc3RhZ2UgKi8KKwljYXNlIDU6CisJCS8qIFNwaW4gbG9jayBmb3IgQlVTWSAqLworCQl3X2N0cihwcGIsIDB4MGMpOworCQlpZiAoIShyX3N0cihwcGIpICYgMHg4MCkpCisJCQlyZXR1cm4gMTsKKworCQkvKiBSZXF1aXJlIG5lZ290aWF0aW9uIGZvciByZWFkIHJlcXVlc3RzICovCisJCXggPSAocl9zdHIocHBiKSAmIDB4YjgpOworCQlkZXYtPnJkID0gKHggJiAweDEwKSA/IDEgOiAwOworCQlkZXYtPmRwID0gKHggJiAweDIwKSA/IDAgOiAxOworCisJCWlmICgoZGV2LT5kcCkgJiYgKGRldi0+cmQpKQorCQkJaWYgKGltbV9uZWdvdGlhdGUoZGV2KSkKKwkJCQlyZXR1cm4gMDsKKwkJY21kLT5TQ3AucGhhc2UrKzsKKworCQkvKiBQaGFzZSA2IC0gRGF0YSB0cmFuc2ZlciBzdGFnZSAqLworCWNhc2UgNjoKKwkJLyogU3BpbiBsb2NrIGZvciBCVVNZICovCisJCXdfY3RyKHBwYiwgMHgwYyk7CisJCWlmICghKHJfc3RyKHBwYikgJiAweDgwKSkKKwkJCXJldHVybiAxOworCisJCWlmIChkZXYtPmRwKSB7CisJCQlyZXR2ID0gaW1tX2NvbXBsZXRpb24oY21kKTsKKwkJCWlmIChyZXR2ID09IC0xKQorCQkJCXJldHVybiAwOworCQkJaWYgKHJldHYgPT0gMCkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCQljbWQtPlNDcC5waGFzZSsrOworCisJCS8qIFBoYXNlIDcgLSBQb3N0IGRhdGEgdHJhbnNmZXIgc3RhZ2UgKi8KKwljYXNlIDc6CisJCWlmICgoZGV2LT5kcCkgJiYgKGRldi0+cmQpKSB7CisJCQlpZiAoKGRldi0+bW9kZSA9PSBJTU1fTklCQkxFKSB8fCAoZGV2LT5tb2RlID09IElNTV9QUzIpKSB7CisJCQkJd19jdHIocHBiLCAweDQpOworCQkJCXdfY3RyKHBwYiwgMHhjKTsKKwkJCQl3X2N0cihwcGIsIDB4ZSk7CisJCQkJd19jdHIocHBiLCAweDQpOworCQkJfQorCQl9CisJCWNtZC0+U0NwLnBoYXNlKys7CisKKwkJLyogUGhhc2UgOCAtIFJlYWQgc3RhdHVzL21lc3NhZ2UgKi8KKwljYXNlIDg6CisJCS8qIENoZWNrIGZvciBkYXRhIG92ZXJydW4gKi8KKwkJaWYgKGltbV93YWl0KGRldikgIT0gKHVuc2lnbmVkIGNoYXIpIDB4YjgpIHsKKwkJCWltbV9mYWlsKGRldiwgRElEX0VSUk9SKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChpbW1fbmVnb3RpYXRlKGRldikpCisJCQlyZXR1cm4gMDsKKwkJaWYgKGltbV9pbihkZXYsICZsLCAxKSkgewkvKiByZWFkIHN0YXR1cyBieXRlICovCisJCQkvKiBDaGVjayBmb3Igb3B0aW9uYWwgbWVzc2FnZSBieXRlICovCisJCQlpZiAoaW1tX3dhaXQoZGV2KSA9PSAodW5zaWduZWQgY2hhcikgMHhiOCkKKwkJCQlpbW1faW4oZGV2LCAmaCwgMSk7CisJCQljbWQtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpICsgKGwgJiBTVEFUVVNfTUFTSyk7CisJCX0KKwkJaWYgKChkZXYtPm1vZGUgPT0gSU1NX05JQkJMRSkgfHwgKGRldi0+bW9kZSA9PSBJTU1fUFMyKSkgeworCQkJd19jdHIocHBiLCAweDQpOworCQkJd19jdHIocHBiLCAweGMpOworCQkJd19jdHIocHBiLCAweGUpOworCQkJd19jdHIocHBiLCAweDQpOworCQl9CisJCXJldHVybiAwOwkvKiBGaW5pc2hlZCAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiaW1tOiBJbnZhbGlkIHNjc2kgcGhhc2VcbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbW1fcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJaW1tX3N0cnVjdCAqZGV2ID0gaW1tX2RldihjbWQtPmRldmljZS0+aG9zdCk7CisKKwlpZiAoZGV2LT5jdXJfY21kKSB7CisJCXByaW50aygiSU1NOiBidWcgaW4gaW1tX3F1ZXVlY29tbWFuZFxuIik7CisJCXJldHVybiAwOworCX0KKwlkZXYtPmZhaWxlZCA9IDA7CisJZGV2LT5qc3RhcnQgPSBqaWZmaWVzOworCWRldi0+Y3VyX2NtZCA9IGNtZDsKKwljbWQtPnNjc2lfZG9uZSA9IGRvbmU7CisJY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CS8qIGRlZmF1bHQgcmV0dXJuIGNvZGUgKi8KKwljbWQtPlNDcC5waGFzZSA9IDA7CS8qIGJ1cyBmcmVlICovCisKKwlJTklUX1dPUksoJmRldi0+aW1tX3RxLCBpbW1faW50ZXJydXB0LCBkZXYpOworCXNjaGVkdWxlX3dvcmsoJmRldi0+aW1tX3RxKTsKKworCWltbV9wYl9jbGFpbShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBcHBhcmVudGx5IHRoZSBkaXNrLT5jYXBhY2l0eSBhdHRyaWJ1dGUgaXMgb2ZmIGJ5IDEgc2VjdG9yIAorICogZm9yIGFsbCBkaXNrIGRyaXZlcy4gIFdlIGFkZCB0aGUgb25lIGhlcmUsIGJ1dCBpdCBzaG91bGQgcmVhbGx5CisgKiBiZSBkb25lIGluIHNkLmMuICBFdmVuIGlmIGl0IGdldHMgZml4ZWQgdGhlcmUsIHRoaXMgd2lsbCBzdGlsbAorICogd29yay4KKyAqLworc3RhdGljIGludCBpbW1fYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LAorCQkJIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgaXBbXSkKK3sKKwlpcFswXSA9IDB4NDA7CisJaXBbMV0gPSAweDIwOworCWlwWzJdID0gKCh1bnNpZ25lZCBsb25nKSBjYXBhY2l0eSArIDEpIC8gKGlwWzBdICogaXBbMV0pOworCWlmIChpcFsyXSA+IDEwMjQpIHsKKwkJaXBbMF0gPSAweGZmOworCQlpcFsxXSA9IDB4M2Y7CisJCWlwWzJdID0gKCh1bnNpZ25lZCBsb25nKSBjYXBhY2l0eSArIDEpIC8gKGlwWzBdICogaXBbMV0pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbW1fYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCWltbV9zdHJ1Y3QgKmRldiA9IGltbV9kZXYoY21kLT5kZXZpY2UtPmhvc3QpOworCS8qCisJICogVGhlcmUgaXMgbm8gbWV0aG9kIGZvciBhYm9ydGluZyBjb21tYW5kcyBzaW5jZSBJb21lZ2EKKwkgKiBoYXZlIHRpZWQgdGhlIFNDU0lfTUVTU0FHRSBsaW5lIGhpZ2ggaW4gdGhlIGludGVyZmFjZQorCSAqLworCisJc3dpdGNoIChjbWQtPlNDcC5waGFzZSkgeworCWNhc2UgMDoJCS8qIERvIG5vdCBoYXZlIGFjY2VzcyB0byBwYXJwb3J0ICovCisJY2FzZSAxOgkJLyogSGF2ZSBub3QgY29ubmVjdGVkIHRvIGludGVyZmFjZSAqLworCQlkZXYtPmN1cl9jbWQgPSBOVUxMOwkvKiBGb3JnZXQgdGhlIHByb2JsZW0gKi8KKwkJcmV0dXJuIFNVQ0NFU1M7CisJCWJyZWFrOworCWRlZmF1bHQ6CQkvKiBTQ1NJIGNvbW1hbmQgc2VudCwgY2FuIG5vdCBhYm9ydCAqLworCQlyZXR1cm4gRkFJTEVEOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGltbV9yZXNldF9wdWxzZSh1bnNpZ25lZCBpbnQgYmFzZSkKK3sKKwl3X2N0cihiYXNlLCAweDA0KTsKKwl3X2R0cihiYXNlLCAweDQwKTsKKwl1ZGVsYXkoMSk7CisJd19jdHIoYmFzZSwgMHgwYyk7CisJd19jdHIoYmFzZSwgMHgwZCk7CisJdWRlbGF5KDUwKTsKKwl3X2N0cihiYXNlLCAweDBjKTsKKwl3X2N0cihiYXNlLCAweDA0KTsKK30KKworc3RhdGljIGludCBpbW1fcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCWltbV9zdHJ1Y3QgKmRldiA9IGltbV9kZXYoY21kLT5kZXZpY2UtPmhvc3QpOworCisJaWYgKGNtZC0+U0NwLnBoYXNlKQorCQlpbW1fZGlzY29ubmVjdChkZXYpOworCWRldi0+Y3VyX2NtZCA9IE5VTEw7CS8qIEZvcmdldCB0aGUgcHJvYmxlbSAqLworCisJaW1tX2Nvbm5lY3QoZGV2LCBDT05ORUNUX05PUk1BTCk7CisJaW1tX3Jlc2V0X3B1bHNlKGRldi0+YmFzZSk7CisJdWRlbGF5KDEwMDApOwkJLyogZGV2aWNlIHNldHRsZSBkZWxheSAqLworCWltbV9kaXNjb25uZWN0KGRldik7CisJdWRlbGF5KDEwMDApOwkJLyogZGV2aWNlIHNldHRsZSBkZWxheSAqLworCXJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgaW50IGRldmljZV9jaGVjayhpbW1fc3RydWN0ICpkZXYpCit7CisJLyogVGhpcyByb3V0aW5lIGxvb2tzIGZvciBhIGRldmljZSBhbmQgdGhlbiBhdHRlbXB0cyB0byB1c2UgRVBQCisJICAgdG8gc2VuZCBhIGNvbW1hbmQuIElmIGFsbCBnb2VzIGFzIHBsYW5uZWQgdGhlbiBFUFAgaXMgYXZhaWxhYmxlLiAqLworCisJc3RhdGljIGNoYXIgY21kWzZdID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisJaW50IGxvb3AsIG9sZF9tb2RlLCBzdGF0dXMsIGssIHBwYiA9IGRldi0+YmFzZTsKKwl1bnNpZ25lZCBjaGFyIGw7CisKKwlvbGRfbW9kZSA9IGRldi0+bW9kZTsKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgODsgbG9vcCsrKSB7CisJCS8qIEF0dGVtcHQgdG8gdXNlIEVQUCBmb3IgVGVzdCBVbml0IFJlYWR5ICovCisJCWlmICgocHBiICYgMHgwMDA3KSA9PSAweDAwMDApCisJCQlkZXYtPm1vZGUgPSBJTU1fRVBQXzMyOworCisJICAgICAgc2Vjb25kX3Bhc3M6CisJCWltbV9jb25uZWN0KGRldiwgQ09OTkVDVF9FUFBfTUFZQkUpOworCQkvKiBTZWxlY3QgU0NTSSBkZXZpY2UgKi8KKwkJaWYgKCFpbW1fc2VsZWN0KGRldiwgbG9vcCkpIHsKKwkJCWltbV9kaXNjb25uZWN0KGRldik7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmludGsoImltbTogRm91bmQgZGV2aWNlIGF0IElEICVpLCBBdHRlbXB0aW5nIHRvIHVzZSAlc1xuIiwKKwkJICAgICAgIGxvb3AsIElNTV9NT0RFX1NUUklOR1tkZXYtPm1vZGVdKTsKKworCQkvKiBTZW5kIFNDU0kgY29tbWFuZCAqLworCQlzdGF0dXMgPSAxOworCQl3X2N0cihwcGIsIDB4MGMpOworCQlmb3IgKGwgPSAwOyAobCA8IDMpICYmIChzdGF0dXMpOyBsKyspCisJCQlzdGF0dXMgPSBpbW1fb3V0KGRldiwgJmNtZFtsIDw8IDFdLCAyKTsKKworCQlpZiAoIXN0YXR1cykgeworCQkJaW1tX2Rpc2Nvbm5lY3QoZGV2KTsKKwkJCWltbV9jb25uZWN0KGRldiwgQ09OTkVDVF9FUFBfTUFZQkUpOworCQkJaW1tX3Jlc2V0X3B1bHNlKGRldi0+YmFzZSk7CisJCQl1ZGVsYXkoMTAwMCk7CisJCQlpbW1fZGlzY29ubmVjdChkZXYpOworCQkJdWRlbGF5KDEwMDApOworCQkJaWYgKGRldi0+bW9kZSA9PSBJTU1fRVBQXzMyKSB7CisJCQkJZGV2LT5tb2RlID0gb2xkX21vZGU7CisJCQkJZ290byBzZWNvbmRfcGFzczsKKwkJCX0KKwkJCXByaW50aygiaW1tOiBVbmFibGUgdG8gZXN0YWJsaXNoIGNvbW11bmljYXRpb25cbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJd19jdHIocHBiLCAweDBjKTsKKworCQlrID0gMTAwMDAwMDsJLyogMSBTZWNvbmQgKi8KKwkJZG8geworCQkJbCA9IHJfc3RyKHBwYik7CisJCQlrLS07CisJCQl1ZGVsYXkoMSk7CisJCX0gd2hpbGUgKCEobCAmIDB4ODApICYmIChrKSk7CisKKwkJbCAmPSAweGI4OworCisJCWlmIChsICE9IDB4YjgpIHsKKwkJCWltbV9kaXNjb25uZWN0KGRldik7CisJCQlpbW1fY29ubmVjdChkZXYsIENPTk5FQ1RfRVBQX01BWUJFKTsKKwkJCWltbV9yZXNldF9wdWxzZShkZXYtPmJhc2UpOworCQkJdWRlbGF5KDEwMDApOworCQkJaW1tX2Rpc2Nvbm5lY3QoZGV2KTsKKwkJCXVkZWxheSgxMDAwKTsKKwkJCWlmIChkZXYtPm1vZGUgPT0gSU1NX0VQUF8zMikgeworCQkJCWRldi0+bW9kZSA9IG9sZF9tb2RlOworCQkJCWdvdG8gc2Vjb25kX3Bhc3M7CisJCQl9CisJCQlwcmludGsKKwkJCSAgICAoImltbTogVW5hYmxlIHRvIGVzdGFibGlzaCBjb21tdW5pY2F0aW9uXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWltbV9kaXNjb25uZWN0KGRldik7CisJCXByaW50aworCQkgICAgKCJpbW06IENvbW11bmljYXRpb24gZXN0YWJsaXNoZWQgYXQgMHgleCB3aXRoIElEICVpIHVzaW5nICVzXG4iLAorCQkgICAgIHBwYiwgbG9vcCwgSU1NX01PREVfU1RSSU5HW2Rldi0+bW9kZV0pOworCQlpbW1fY29ubmVjdChkZXYsIENPTk5FQ1RfRVBQX01BWUJFKTsKKwkJaW1tX3Jlc2V0X3B1bHNlKGRldi0+YmFzZSk7CisJCXVkZWxheSgxMDAwKTsKKwkJaW1tX2Rpc2Nvbm5lY3QoZGV2KTsKKwkJdWRlbGF5KDEwMDApOworCQlyZXR1cm4gMDsKKwl9CisJcHJpbnRrKCJpbW06IE5vIGRldmljZXMgZm91bmRcbiIpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGltbV9hZGp1c3RfcXVldWUoc3RydWN0IHNjc2lfZGV2aWNlICpkZXZpY2UpCit7CisJYmxrX3F1ZXVlX2JvdW5jZV9saW1pdChkZXZpY2UtPnJlcXVlc3RfcXVldWUsIEJMS19CT1VOQ0VfSElHSCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGltbV90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkucHJvY19uYW1lCQk9ICJpbW0iLAorCS5wcm9jX2luZm8JCT0gaW1tX3Byb2NfaW5mbywKKwkubmFtZQkJCT0gIklvbWVnYSBWUEkyIChpbW0pIGludGVyZmFjZSIsCisJLnF1ZXVlY29tbWFuZAkJPSBpbW1fcXVldWVjb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gaW1tX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGltbV9yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCT0gaW1tX3Jlc2V0LAorCS5iaW9zX3BhcmFtCQk9IGltbV9iaW9zcGFyYW0sCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLmNhbl9xdWV1ZQkJPSAxLAorCS5zbGF2ZV9hbGxvYwkJPSBpbW1fYWRqdXN0X3F1ZXVlLAorCS51bmNoZWNrZWRfaXNhX2RtYQk9IDEsIC8qIGltbSBjYW5ub3QgZGVhbCB3aXRoIGhpZ2htZW0sIHNvCisJCQkJICAgICAgKiB0aGlzIGlzIGFuIGVhc3kgdHJpY2sgdG8gZW5zdXJlCisJCQkJICAgICAgKiBhbGwgaW8gcGFnZXMgZm9yIHRoaXMgaG9zdCByZXNpZGUKKwkJCQkgICAgICAqIGluIGxvdyBtZW1vcnkgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgIFBhcmFsbGVsIHBvcnQgcHJvYmluZyByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBMSVNUX0hFQUQoaW1tX2hvc3RzKTsKKworc3RhdGljIGludCBfX2ltbV9hdHRhY2goc3RydWN0IHBhcnBvcnQgKnBiKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJaW1tX3N0cnVjdCAqZGV2OworCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHdhaXRpbmcpOworCURFRklORV9XQUlUKHdhaXQpOworCWludCBwb3J0czsKKwlpbnQgbW9kZXMsIHBwYjsKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndhaXRpbmcpOworCisJZGV2ID0ga21hbGxvYyhzaXplb2YoaW1tX3N0cnVjdCksIEdGUF9LRVJORUwpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChkZXYsIDAsIHNpemVvZihpbW1fc3RydWN0KSk7CisKKwlkZXYtPmJhc2UgPSAtMTsKKwlkZXYtPm1vZGUgPSBJTU1fQVVUT0RFVEVDVDsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5saXN0KTsKKworCWRldi0+ZGV2ID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocGIsICJpbW0iLCBOVUxMLCBpbW1fd2FrZXVwLAorCQkJCQkJTlVMTCwgMCwgZGV2KTsKKworCWlmICghZGV2LT5kZXYpCisJCWdvdG8gb3V0OworCisKKwkvKiBDbGFpbSB0aGUgYnVzIHNvIGl0IHJlbWVtYmVycyB3aGF0IHdlIGRvIHRvIHRoZSBjb250cm9sCisJICogcmVnaXN0ZXJzLiBbIENUUiBhbmQgRUNQIF0KKwkgKi8KKwllcnIgPSAtRUJVU1k7CisJZGV2LT53YWl0aW5nID0gJndhaXRpbmc7CisJcHJlcGFyZV90b193YWl0KCZ3YWl0aW5nLCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCWlmIChpbW1fcGJfY2xhaW0oZGV2KSkKKwkJc2NoZWR1bGVfdGltZW91dCgzICogSFopOworCWlmIChkZXYtPndhbnRlZCkgeworCQlwcmludGsoS0VSTl9FUlIgImltbSVkOiBmYWlsZWQgdG8gY2xhaW0gcGFycG9ydCBiZWNhdXNlICIKKwkJCSJhIHBhcmRldmljZSBpcyBvd25pbmcgdGhlIHBvcnQgZm9yIHRvbyBsb25nICIKKwkJCSJ0aW1lIVxuIiwgcGItPm51bWJlcik7CisJCWltbV9wYl9kaXNtaXNzKGRldik7CisJCWRldi0+d2FpdGluZyA9IE5VTEw7CisJCWZpbmlzaF93YWl0KCZ3YWl0aW5nLCAmd2FpdCk7CisJCWdvdG8gb3V0MTsKKwl9CisJZGV2LT53YWl0aW5nID0gTlVMTDsKKwlmaW5pc2hfd2FpdCgmd2FpdGluZywgJndhaXQpOworCXBwYiA9IGRldi0+YmFzZSA9IGRldi0+ZGV2LT5wb3J0LT5iYXNlOworCWRldi0+YmFzZV9oaSA9IGRldi0+ZGV2LT5wb3J0LT5iYXNlX2hpOworCXdfY3RyKHBwYiwgMHgwYyk7CisJbW9kZXMgPSBkZXYtPmRldi0+cG9ydC0+bW9kZXM7CisKKwkvKiBNb2RlIGRldGVjdGlvbiB3b3JrcyB1cCB0aGUgY2hhaW4gb2Ygc3BlZWQKKwkgKiBUaGlzIGF2b2lkcyBhIG5hc3R5IGlmLXRoZW4tZWxzZS1pZi0uLi4gdHJlZQorCSAqLworCWRldi0+bW9kZSA9IElNTV9OSUJCTEU7CisKKwlpZiAobW9kZXMgJiBQQVJQT1JUX01PREVfVFJJU1RBVEUpCisJCWRldi0+bW9kZSA9IElNTV9QUzI7CisKKwkvKiBEb25lIGNvbmZpZ3VyYXRpb24gKi8KKworCWVyciA9IGltbV9pbml0KGRldik7CisKKwlpbW1fcGJfcmVsZWFzZShkZXYpOworCisJaWYgKGVycikKKwkJZ290byBvdXQxOworCisJLyogbm93IHRoZSBnbHVlIC4uLiAqLworCWlmIChkZXYtPm1vZGUgPT0gSU1NX05JQkJMRSB8fCBkZXYtPm1vZGUgPT0gSU1NX1BTMikKKwkJcG9ydHMgPSAzOworCWVsc2UKKwkJcG9ydHMgPSA4OworCisJSU5JVF9XT1JLKCZkZXYtPmltbV90cSwgaW1tX2ludGVycnVwdCwgZGV2KTsKKworCWVyciA9IC1FTk9NRU07CisJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmaW1tX3RlbXBsYXRlLCBzaXplb2YoaW1tX3N0cnVjdCAqKSk7CisJaWYgKCFob3N0KQorCQlnb3RvIG91dDE7CisJaG9zdC0+aW9fcG9ydCA9IHBiLT5iYXNlOworCWhvc3QtPm5faW9fcG9ydCA9IHBvcnRzOworCWhvc3QtPmRtYV9jaGFubmVsID0gLTE7CisJaG9zdC0+dW5pcXVlX2lkID0gcGItPm51bWJlcjsKKwkqKGltbV9zdHJ1Y3QgKiopJmhvc3QtPmhvc3RkYXRhID0gZGV2OworCWRldi0+aG9zdCA9IGhvc3Q7CisJbGlzdF9hZGRfdGFpbCgmZGV2LT5saXN0LCAmaW1tX2hvc3RzKTsKKwllcnIgPSBzY3NpX2FkZF9ob3N0KGhvc3QsIE5VTEwpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MjsKKwlzY3NpX3NjYW5faG9zdChob3N0KTsKKwlyZXR1cm4gMDsKKworb3V0MjoKKwlsaXN0X2RlbF9pbml0KCZkZXYtPmxpc3QpOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7CitvdXQxOgorCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT5kZXYpOworb3V0OgorCWtmcmVlKGRldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgaW1tX2F0dGFjaChzdHJ1Y3QgcGFycG9ydCAqcGIpCit7CisJX19pbW1fYXR0YWNoKHBiKTsKK30KKworc3RhdGljIHZvaWQgaW1tX2RldGFjaChzdHJ1Y3QgcGFycG9ydCAqcGIpCit7CisJaW1tX3N0cnVjdCAqZGV2OworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmaW1tX2hvc3RzLCBsaXN0KSB7CisJCWlmIChkZXYtPmRldi0+cG9ydCA9PSBwYikgeworCQkJbGlzdF9kZWxfaW5pdCgmZGV2LT5saXN0KTsKKwkJCXNjc2lfcmVtb3ZlX2hvc3QoZGV2LT5ob3N0KTsKKwkJCXNjc2lfaG9zdF9wdXQoZGV2LT5ob3N0KTsKKwkJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT5kZXYpOworCQkJa2ZyZWUoZGV2KTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBhcnBvcnRfZHJpdmVyIGltbV9kcml2ZXIgPSB7CisJLm5hbWUJPSAiaW1tIiwKKwkuYXR0YWNoCT0gaW1tX2F0dGFjaCwKKwkuZGV0YWNoCT0gaW1tX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGltbV9kcml2ZXJfaW5pdCh2b2lkKQoreworCXByaW50aygiaW1tOiBWZXJzaW9uICVzXG4iLCBJTU1fVkVSU0lPTik7CisJcmV0dXJuIHBhcnBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZpbW1fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGltbV9kcml2ZXJfZXhpdCh2b2lkKQoreworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJmltbV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbW1fZHJpdmVyX2luaXQpOworbW9kdWxlX2V4aXQoaW1tX2RyaXZlcl9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2ltbS5oIGIvZHJpdmVycy9zY3NpL2ltbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjM2FlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaW1tLmgKQEAgLTAsMCArMSwxNDQgQEAKKworLyogIERyaXZlciBmb3IgdGhlIElvbWVnYSBNYXRjaE1ha2VyIHBhcmFsbGVsIHBvcnQgU0NTSSBIQkEgZW1iZWRkZWQgaW4gCisgKiB0aGUgSW9tZWdhIFpJUCBQbHVzIGRyaXZlCisgKiAKKyAqIChjKSAxOTk4ICAgICBEYXZpZCBDYW1wYmVsbCAgICAgY2FtcGJlbGxAdG9ycXVlLm5ldAorICoKKyAqIFBsZWFzZSBub3RlIHRoYXQgSSBsaXZlIGluIFBlcnRoLCBXZXN0ZXJuIEF1c3RyYWxpYS4gR01UKzA4MDAKKyAqLworCisjaWZuZGVmIF9JTU1fSAorI2RlZmluZSBfSU1NX0gKKworI2RlZmluZSAgIElNTV9WRVJTSU9OICAgIjIuMDUgKGZvciBMaW51eCAyLjQuMCkiCisKKy8qIAorICogMTAgQXByIDE5OTggKEdvb2QgRnJpZGF5KSAtIFJlY2VpdmVkIEVOMTQ0MzAyIGJ5IGVtYWlsIGZyb20gSW9tZWdhLgorICogU2NhcnJ5IHRoaW5nIGlzIHRoZSBsZXZlbCBvZiBzdXBwb3J0IGZyb20gb25lIG9mIHRoZWlyIG1hbmFnZXJzLgorICogVGhlIG9udXMgaXMgbm93IG9uIHVzICh0aGUgZGV2ZWxvcGVycykgdG8gc2h1dCB1cCBhbmQgc3RhcnQgY29kaW5nLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTFBcHI5OCBbIDAuMTAgXQorICoKKyAqIC0tLSBTTklQIC0tLQorICoKKyAqIEl0IG1hbmFnZXMgdG8gZmluZCB0aGUgZHJpdmUgd2hpY2ggaXMgYSBnb29kIHN0YXJ0LiBXcml0aW5nIGRhdGEgZHVyaW5nCisgKiBkYXRhIHBoYXNlIGlzIGtub3duIHRvIGJlIGJyb2tlbiAoZHVlIHRvIHJlcXVpcmVtZW50cyBvZiB0d28gYnl0ZSB3cml0ZXMpLgorICogUmVtb3ZpbmcgIlBoYXNlIiBkZWJ1ZyBtZXNzYWdlcy4KKyAqCisgKiBQUzogVG9vayBmb3VyIGhvdXJzIG9mIGNvZGluZyBhZnRlciBJIGJvdWdodCBhIGRyaXZlLgorICogICAgICBBTlpBQyBEYXkgKEF1cyAiV2FyIFZldGVyYW5zIEhvbGlkYXkiKSAgMjVBcHI5OCBbIDAuMTQgXQorICoKKyAqIFRlbiBtaW51dGVzIGxhdGVyIGFmdGVyIGEgZmV3IGZpeGVzLi4uLiAoTElURVJBTExZISEhKQorICogSGF2ZSBtb3VudGVkIGRpc2ssIGNvcGllZCBmaWxlLCBkaXNtb3VudGVkIGRpc2ssIHJlbW91bnQgZGlzaywgZGlmZiBmaWxlCisgKiAgICAgICAgICAgICAgICAgICAgLS0tLS0gIEl0IGFjdHVhbGx5IHdvcmtzISEhIC0tLS0tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNUFwcjk4IFsgMC4xNSBdCisgKgorICogVHdlbnR5IG1pbnV0ZXMgb2YgbXVja2luZyBhcm91bmQsIHJlYXJhbmdlZCB0aGUgSUVFRSBuZWdvdGlhdGUgbWVjaGFuaXNtLgorICogTm93IGhhdmUgYnl0ZSBtb2RlIHdvcmtpbmcgKG9ubHkgRVBQIGFuZCBFQ1AgdG8gZ28gbm93Li4uIDo9KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjZBcHI5OCBbIDAuMTYgXQorICoKKyAqIFRoaXJ0eSBtaW51dGVzIG9mIGZ1cnRoZXIgY29kaW5nIHJlc3VsdHMgaW4gRVBQIHdvcmtpbmcgb24gbXkgbWFjaGluZS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3QXByOTggWyAwLjE3IF0KKyAqCisgKiBEdWUgdG8gd29yayBjb21taXRtZW50cyBhbmQgaW5hYmlsaXR5IHRvIGdldCBhICJ0cnVlIiBFQ1AgbW9kZSBmdW5jdGlvbmluZworICogSSBoYXZlIGRlY2lkZWQgdG8gY29kZSB0aGUgcGFycG9ydCBzdXBwb3J0IGludG8gaW1tLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDlKdW45OCBbIDAuMTggXQorICoKKyAqIERyaXZlciBpcyBub3cgb3V0IG9mIGJldGEgdGVzdGluZy4KKyAqIFN1cHBvcnQgZm9yIHBhcnBvcnQgaGFzIGJlZW4gYWRkZWQuCisgKiBOb3cgZGlzdHJpYnV0ZWQgd2l0aCB0aGUgcHBhIGRyaXZlci4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEySnVuOTggWyAyLjAwIF0KKyAqCisgKiBFcnIuLiBJdCBhcHBlYXJzIHRoYXQgaW1tLTIuMDAgd2FzIGJyb2tlbi4uLi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4SnVuOTggWyAyLjAxIF0KKyAqCisgKiBQYXRjaCBhcHBsaWVkIHRvIHN5bmMgdGhpcyBhZ2FpbnN0IHRoZSBMaW51eCAyLjEueCBrZXJuZWwgY29kZQorICogSW5jbHVkZWQgcWJvb3RfemlwLnNoCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMUp1bjk4IFsgMi4wMiBdCisgKgorICogT3RoZXIgY2xlYW4gdXBzIGluY2x1ZGUgdGhlIGZvbGxvdyBjaGFuZ2VzOgorICogICAgQ09ORklHX1NDU0lfUFBBX0hBVkVfUEVEQU5USUMgPT4gQ09ORklHX1NDU0lfSVpJUF9FUFAxNgorICogICAgYWRkZWQgQ09ORklHX1NDU0lfSVpJUF9TTE9XX0NUUiBvcHRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzIuMDNdCisgKiAgRml4IGtlcm5lbCBwYW5pYyBvbiBzY3NpIHRpbWVvdXQuCQkyMEF1ZzAwIFsyLjA0XQorICoKKyAqICBBdm9pZCBpb19yZXF1ZXN0X2xvY2sgcHJvYmxlbXMuCisgKiAgSm9obiBDYXZhbiA8am9obmNhdmFuQGhvbWUuY29tPgkJMTZOb3YwMCBbMi4wNV0KKyAqLworLyogLS0tLS0tIEVORCBPRiBVU0VSIENPTkZJR1VSQUJMRSBQQVJBTUVURVJTIC0tLS0tICovCisKKyNpbmNsdWRlICA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlICA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSAgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSAgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlICA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSAgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSAgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSAgPGFzbS9pby5oPgorI2luY2x1ZGUgIDxzY3NpL3Njc2lfaG9zdC5oPgorLyogYmF0dGVyaWVzIG5vdCBpbmNsdWRlZCA6LSkgKi8KKworLyoKKyAqIG1vZGVzIGluIHdoaWNoIHRoZSBkcml2ZXIgY2FuIG9wZXJhdGUgCisgKi8KKyNkZWZpbmUgICBJTU1fQVVUT0RFVEVDVCAgICAgICAgMAkvKiBBdXRvZGV0ZWN0IG1vZGUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgICBJTU1fTklCQkxFICAgICAgICAgICAgMQkvKiB3b3JrIGluIHN0YW5kYXJkIDQgYml0IG1vZGUgICAgKi8KKyNkZWZpbmUgICBJTU1fUFMyICAgICAgICAgICAgICAgMgkvKiBQUy8yIGJ5dGUgbW9kZSAgICAgICAgICovCisjZGVmaW5lICAgSU1NX0VQUF84ICAgICAgICAgICAgIDMJLyogRVBQIG1vZGUsIDggYml0ICAgICAgICAgICAgICAgICovCisjZGVmaW5lICAgSU1NX0VQUF8xNiAgICAgICAgICAgIDQJLyogRVBQIG1vZGUsIDE2IGJpdCAgICAgICAgICAgICAgICovCisjZGVmaW5lICAgSU1NX0VQUF8zMiAgICAgICAgICAgIDUJLyogRVBQIG1vZGUsIDMyIGJpdCAgICAgICAgICAgICAgICovCisjZGVmaW5lICAgSU1NX1VOS05PV04gICAgICAgICAgIDYJLyogSnVzdCBpbiBjYXNlLi4uICAgICAgICAgICAgICAgICovCisKK3N0YXRpYyBjaGFyICpJTU1fTU9ERV9TVFJJTkdbXSA9Cit7CisJW0lNTV9BVVRPREVURUNUXSA9ICJBdXRvZGV0ZWN0IiwKKwlbSU1NX05JQkJMRV0JID0gIlNQUCIsCisJW0lNTV9QUzJdCSA9ICJQUy8yIiwKKwlbSU1NX0VQUF84XQkgPSAiRVBQIDggYml0IiwKKwlbSU1NX0VQUF8xNl0JID0gIkVQUCAxNiBiaXQiLAorI2lmZGVmIENPTkZJR19TQ1NJX0laSVBfRVBQMTYKKwlbSU1NX0VQUF8zMl0JID0gIkVQUCAxNiBiaXQiLAorI2Vsc2UKKwlbSU1NX0VQUF8zMl0JID0gIkVQUCAzMiBiaXQiLAorI2VuZGlmCisJW0lNTV9VTktOT1dOXQkgPSAiVW5rbm93biIsCit9OworCisvKiBvdGhlciBvcHRpb25zICovCisjZGVmaW5lIElNTV9CVVJTVF9TSVpFCTUxMgkvKiBkYXRhIGJ1cnN0IHNpemUgKi8KKyNkZWZpbmUgSU1NX1NFTEVDVF9UTU8gIDUwMAkvKiA1MDAgaG93IGxvbmcgdG8gd2FpdCBmb3IgdGFyZ2V0ID8gKi8KKyNkZWZpbmUgSU1NX1NQSU5fVE1PICAgIDUwMDAJLyogNTAwMDAgaW1tX3dhaXQgbG9vcCBsaW1pdGVyICovCisjZGVmaW5lIElNTV9ERUJVRwkwCS8qIGRlYnVnZ2luZyBvcHRpb24gKi8KKyNkZWZpbmUgSU5fRVBQX01PREUoeCkgKHggPT0gSU1NX0VQUF84IHx8IHggPT0gSU1NX0VQUF8xNiB8fCB4ID09IElNTV9FUFBfMzIpCisKKy8qIGFyZ3MgdG8gaW1tX2Nvbm5lY3QgKi8KKyNkZWZpbmUgQ09OTkVDVF9FUFBfTUFZQkUgMQorI2RlZmluZSBDT05ORUNUX05PUk1BTCAgMAorCisjZGVmaW5lIHJfZHRyKHgpICAgICAgICAodW5zaWduZWQgY2hhcilpbmIoKHgpKQorI2RlZmluZSByX3N0cih4KSAgICAgICAgKHVuc2lnbmVkIGNoYXIpaW5iKCh4KSsxKQorI2RlZmluZSByX2N0cih4KSAgICAgICAgKHVuc2lnbmVkIGNoYXIpaW5iKCh4KSsyKQorI2RlZmluZSByX2VwcCh4KSAgICAgICAgKHVuc2lnbmVkIGNoYXIpaW5iKCh4KSs0KQorI2RlZmluZSByX2ZpZm8oeCkgICAgICAgKHVuc2lnbmVkIGNoYXIpaW5iKCh4KSkgICAvKiB4IG11c3QgYmUgYmFzZV9oaSAqLworCQkJCQkvKiBPbiBQQ0kgaXM6IGJhc2UrMHg0MDAgIT0gYmFzZV9oaSAqLworI2RlZmluZSByX2Vjcih4KSAgICAgICAgKHVuc2lnbmVkIGNoYXIpaW5iKCh4KSsyKSAvKiB4IG11c3QgYmUgYmFzZV9oaSAqLworCisjZGVmaW5lIHdfZHRyKHgseSkgICAgICBvdXRiKHksICh4KSkKKyNkZWZpbmUgd19zdHIoeCx5KSAgICAgIG91dGIoeSwgKHgpKzEpCisjZGVmaW5lIHdfZXBwKHgseSkgICAgICBvdXRiKHksICh4KSs0KQorI2RlZmluZSB3X2ZpZm8oeCx5KSAgICAgb3V0Yih5LCAoeCkpICAgICAvKiB4IG11c3QgYmUgYmFzZV9oaSAqLworI2RlZmluZSB3X2Vjcih4LHkpICAgICAgb3V0Yih5LCAoeCkrMHgyKSAvKiB4IG11c3QgYmUgYmFzZV9oaSAqLworCisjaWZkZWYgQ09ORklHX1NDU0lfSVpJUF9TTE9XX0NUUgorI2RlZmluZSB3X2N0cih4LHkpICAgICAgb3V0Yl9wKHksICh4KSsyKQorI2Vsc2UKKyNkZWZpbmUgd19jdHIoeCx5KSAgICAgIG91dGIoeSwgKHgpKzIpCisjZW5kaWYKKworc3RhdGljIGludCBpbW1fZW5naW5lKGltbV9zdHJ1Y3QgKiwgc3RydWN0IHNjc2lfY21uZCAqKTsKKworI2VuZGlmCQkJCS8qIF9JTU1fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2luMjAwMC5jIGIvZHJpdmVycy9zY3NpL2luMjAwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjAzNjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaW4yMDAwLmMKQEAgLTAsMCArMSwyMzIzIEBACisvKgorICogICAgaW4yMDAwLmMgLSAgTGludXggZGV2aWNlIGRyaXZlciBmb3IgdGhlCisgKiAgICAgICAgICAgICAgICBBbHdheXMgSU4yMDAwIElTQSBTQ1NJIGNhcmQuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2IEpvaG4gU2hpZmZsZXR0LCBHZW9Mb2cgQ29uc3VsdGluZworICogICAgam9obkBnZW9sb2cuY29tCisgKiAgICBqc2hpZmZsZUBuZXRjb20uY29tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEZvciB0aGUgYXZvaWRhbmNlIG9mIGRvdWJ0IHRoZSAicHJlZmVycmVkIGZvcm0iIG9mIHRoaXMgY29kZSBpcyBvbmUgd2hpY2gKKyAqIGlzIGluIGFuIG9wZW4gbm9uIHBhdGVudCBlbmN1bWJlcmVkIGZvcm1hdC4gV2hlcmUgY3J5cHRvZ3JhcGhpYyBrZXkgc2lnbmluZworICogZm9ybXMgcGFydCBvZiB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBleGVjdXRhYmxlIHRoZSBpbmZvcm1hdGlvbgorICogaW5jbHVkaW5nIGtleXMgbmVlZGVkIHRvIGdlbmVyYXRlIGFuIGVxdWl2YWxlbnRseSBmdW5jdGlvbmFsIGV4ZWN1dGFibGUKKyAqIGFyZSBkZWVtZWQgdG8gYmUgcGFydCBvZiB0aGUgc291cmNlIGNvZGUuCisgKgorICogRHJldyBFY2toYXJkdCdzIGV4Y2VsbGVudCAnR2VuZXJpYyBOQ1I1MzgwJyBzb3VyY2VzIHByb3ZpZGVkCisgKiBtdWNoIG9mIHRoZSBpbnNwaXJhdGlvbiBhbmQgc29tZSBvZiB0aGUgY29kZSBmb3IgdGhpcyBkcml2ZXIuCisgKiBUaGUgTGludXggSU4yMDAwIGRyaXZlciBkaXN0cmlidXRlZCBpbiB0aGUgTGludXgga2VybmVscyB0aHJvdWdoCisgKiB2ZXJzaW9uIDEuMi4xMyB3YXMgYW4gZXh0cmVtZWx5IHZhbHVhYmxlIHJlZmVyZW5jZSBvbiB0aGUgYXJjYW5lCisgKiAoYW5kIHN0aWxsIG15c3RlcmlvdXMpIHdvcmtpbmdzIG9mIHRoZSBJTjIwMDAncyBmaWZvLiBJdCBhbHNvCisgKiBpcyB3aGVyZSBJIGxpZnRlZCBpbjIwMDBfYmlvc3BhcmFtKCksIHRoZSBnaXN0IG9mIHRoZSBjYXJkCisgKiBkZXRlY3Rpb24gc2NoZW1lLCBhbmQgb3RoZXIgYml0cyBvZiBjb2RlLiBNYW55IHRoYW5rcyB0byB0aGUKKyAqIHRhbGVudGVkIGFuZCBjb3VyYWdlb3VzIHBlb3BsZSB3aG8gd3JvdGUsIGNvbnRyaWJ1dGVkIHRvLCBhbmQKKyAqIG1haW50YWluZWQgdGhhdCBkcml2ZXIgKGluY2x1ZGluZyBCcmFkIE1jTGVhbiwgU2hhdW4gU2F2YWdlLAorICogQmlsbCBFYXJuZXN0LCBMYXJyeSBEb29saXR0bGUsIFJvZ2VyIFN1bnNoaW5lLCBKb2huIEx1Y2tleSwKKyAqIE1hdHQgUG9zdGlmZiwgUGV0ZXIgTHUsIHplcnVjaGFAc2hlbGwucG9ydGFsLmNvbSwgYW5kIEVyaWMKKyAqIFlvdW5nZGFsZSkuIEkgc2hvdWxkIGFsc28gbWVudGlvbiB0aGUgZHJpdmVyIHdyaXR0ZW4gYnkKKyAqIEhhbWlzaCBNYWNkb25hbGQgZm9yIHRoZSAoR0FTUCEpIEFtaWdhIEEyMDkxIGNhcmQsIGluY2x1ZGVkCisgKiBpbiB0aGUgTGludXgtbTY4ayBkaXN0cmlidXRpb247IGl0IGdhdmUgbWUgYSBnb29kIGluaXRpYWwKKyAqIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHByb3BlciB3YXkgdG8gcnVuIGEgV0QzM2M5MyBjaGlwLCBhbmQgSQorICogZW5kZWQgdXAgc3RlYWxpbmcgbG90cyBvZiBjb2RlIGZyb20gaXQuCisgKgorICogX1RoaXNfIGRyaXZlciBpcyAoSSBmZWVsKSBhbiBpbXByb3ZlbWVudCBvdmVyIHRoZSBvbGQgb25lIGluCisgKiBzZXZlcmFsIHJlc3BlY3RzOgorICogICAgLSAgQWxsIHByb2JsZW1zIHJlbGF0aW5nIHRvIHRoZSBkYXRhIHNpemUgb2YgYSBTQ1NJIHJlcXVlc3QgYXJlCisgKiAgICAgICAgICBnb25lIChhcyBmYXIgYXMgSSBrbm93KS4gVGhlIG9sZCBkcml2ZXIgY291bGRuJ3QgaGFuZGxlCisgKiAgICAgICAgICBzd2FwcGluZyB0byBwYXJ0aXRpb25zIGJlY2F1c2UgdGhhdCBpbnZvbHZlZCA0ayBibG9ja3MsIG5vcgorICogICAgICAgICAgY291bGQgaXQgZGVhbCB3aXRoIHRoZSBzdC5jIHRhcGUgZHJpdmVyIHVubW9kaWZpZWQsIGJlY2F1c2UKKyAqICAgICAgICAgIHRoYXQgdXN1YWxseSBpbnZvbHZlZCA0ayAtIDMyayBibG9ja3MuIFRoZSBvbGQgZHJpdmVyIG5ldmVyCisgKiAgICAgICAgICBxdWl0ZSBnb3QgYXdheSBmcm9tIGEgbW9yYmlkIGRlcGVuZGVuY2Ugb24gMmsgYmxvY2sgc2l6ZXMgLQorICogICAgICAgICAgd2hpY2ggb2YgY291cnNlIGlzIHRoZSBzaXplIG9mIHRoZSBjYXJkJ3MgZmlmby4KKyAqCisgKiAgICAtICBUYXJnZXQgRGlzY29ubmVjdGlvbi9SZWNvbm5lY3Rpb24gaXMgbm93IHN1cHBvcnRlZC4gQW55CisgKiAgICAgICAgICBzeXN0ZW0gd2l0aCBtb3JlIHRoYW4gb25lIGRldmljZSBhY3RpdmUgb24gdGhlIFNDU0kgYnVzCisgKiAgICAgICAgICB3aWxsIGJlbmVmaXQgZnJvbSB0aGlzLiBUaGUgZHJpdmVyIGRlZmF1bHRzIHRvIHdoYXQgSSdtCisgKiAgICAgICAgICBjYWxsaW5nICdhZGFwdGl2ZSBkaXNjb25uZWN0JyAtIG1lYW5pbmcgdGhhdCBlYWNoIGNvbW1hbmQKKyAqICAgICAgICAgIGlzIGV2YWx1YXRlZCBpbmRpdmlkdWFsbHkgYXMgdG8gd2hldGhlciBvciBub3QgaXQgc2hvdWxkCisgKiAgICAgICAgICBiZSBydW4gd2l0aCB0aGUgb3B0aW9uIHRvIGRpc2Nvbm5lY3QvcmVzZWxlY3QgKGlmIHRoZQorICogICAgICAgICAgZGV2aWNlIGNob29zZXMpLCBvciBhcyBhICJTQ1NJLWJ1cy1ob2ciLgorICoKKyAqICAgIC0gIFN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXJzIGFyZSBub3cgc3VwcG9ydGVkLiBCZWNhdXNlIHRoZXJlCisgKiAgICAgICAgICBhcmUgYSBmZXcgZGV2aWNlcyAoYW5kIG1hbnkgaW1wcm9wZXJseSB0ZXJtaW5hdGVkIHN5c3RlbXMpCisgKiAgICAgICAgICB0aGF0IGNob2tlIHdoZW4gZG9pbmcgc3luYywgdGhlIGRlZmF1bHQgaXMgc3luYyBESVNBQkxFRAorICogICAgICAgICAgZm9yIGFsbCBkZXZpY2VzLiBUaGlzIGZhc3RlciBwcm90b2NvbCBjYW4gKGFuZCBzaG91bGQhKQorICogICAgICAgICAgYmUgZW5hYmxlZCBvbiBzZWxlY3RlZCBkZXZpY2VzIHZpYSB0aGUgY29tbWFuZC1saW5lLgorICoKKyAqICAgIC0gIFJ1bnRpbWUgb3BlcmF0aW5nIHBhcmFtZXRlcnMgY2FuIG5vdyBiZSBzcGVjaWZpZWQgdGhyb3VnaAorICogICAgICAgZWl0aGVyIHRoZSBMSUxPIG9yIHRoZSAnaW5zbW9kJyBjb21tYW5kIGxpbmUuIEZvciBMSUxPIGRvOgorICogICAgICAgICAgImluMjAwMD1ibGFoLGJsYWgsYmxhaCIKKyAqICAgICAgIGFuZCB3aXRoIGluc21vZCBnbyBsaWtlOgorICogICAgICAgICAgImluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL2luMjAwMC5vIHNldHVwX3N0cmluZ3M9YmxhaCxibGFoIgorICogICAgICAgVGhlIGRlZmF1bHRzIHNob3VsZCBiZSBnb29kIGZvciBtb3N0IHBlb3BsZS4gU2VlIHRoZSBjb21tZW50CisgKiAgICAgICBmb3IgJ3NldHVwX3N0cmluZ3MnIGJlbG93IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgLSAgVGhlIG9sZCBkcml2ZXIgcmVsaWVkIGV4Y2x1c2l2ZWx5IG9uIHdoYXQgdGhlIFdlc3Rlcm4gRGlnaXRhbAorICogICAgICAgICAgZG9jcyBjYWxsICJDb21iaW5hdGlvbiBMZXZlbCAyIENvbW1hbmRzIiwgd2hpY2ggYXJlIGEgZ3JlYXQKKyAqICAgICAgICAgIGlkZWEgaW4gdGhhdCB0aGUgQ1BVIGlzIHJlbGlldmVkIG9mIGEgbG90IG9mIGludGVycnVwdAorICogICAgICAgICAgb3ZlcmhlYWQuIEhvd2V2ZXIsIGJ5IGFjY2VwdGluZyBhIGNlcnRhaW4gKHVzZXItc2V0dGFibGUpCisgKiAgICAgICAgICBhbW91bnQgb2YgYWRkaXRpb25hbCBpbnRlcnJ1cHRzLCB0aGlzIGRyaXZlciBhY2hpZXZlcworICogICAgICAgICAgYmV0dGVyIGNvbnRyb2wgb3ZlciB0aGUgU0NTSSBidXMsIGFuZCBkYXRhIHRyYW5zZmVycyBhcmUKKyAqICAgICAgICAgIGFsbW9zdCBhcyBmYXN0IHdoaWxlIGJlaW5nIG11Y2ggZWFzaWVyIHRvIGRlZmluZSwgdHJhY2ssCisgKiAgICAgICAgICBhbmQgZGVidWcuCisgKgorICogICAgLSAgWW91IGNhbiBmb3JjZSBkZXRlY3Rpb24gb2YgYSBjYXJkIHdob3NlIEJJT1MgaGFzIGJlZW4gZGlzYWJsZWQuCisgKgorICogICAgLSAgTXVsdGlwbGUgSU4yMDAwIGNhcmRzIG1pZ2h0IGFsbW9zdCBiZSBzdXBwb3J0ZWQuIEkndmUgdHJpZWQgdG8KKyAqICAgICAgIGtlZXAgaXQgaW4gbWluZCwgYnV0IGhhdmUgbm8gd2F5IHRvIHRlc3QuLi4KKyAqCisgKgorICogVE9ETzoKKyAqICAgICAgIHRhZ2dlZCBxdWV1aW5nLiBtdWx0aXBsZSBjYXJkcy4KKyAqCisgKgorICogTk9URToKKyAqICAgICAgIFdoZW4gdXNpbmcgdGhpcyBvciBhbnkgb3RoZXIgU0NTSSBkcml2ZXIgYXMgYSBtb2R1bGUsIHlvdSdsbAorICogICAgICAgZmluZCB0aGF0IHdpdGggdGhlIHN0b2NrIGtlcm5lbCwgYXQgbW9zdCBfdHdvXyBTQ1NJIGhhcmQKKyAqICAgICAgIGRyaXZlcyB3aWxsIGJlIGxpbmtlZCBpbnRvIHRoZSBkZXZpY2UgbGlzdCAoaWUsIHVzYWJsZSkuCisgKiAgICAgICBJZiB5b3VyIElOMjAwMCBjYXJkIGhhcyBtb3JlIHRoYW4gMiBkaXNrcyBvbiBpdHMgYnVzLCB5b3UKKyAqICAgICAgIG1pZ2h0IHdhbnQgdG8gY2hhbmdlIHRoZSBkZWZpbmUgb2YgJ1NEX0VYVFJBX0RFVlMnIGluIHRoZQorICogICAgICAgJ2hvc3RzLmgnIGZpbGUgZnJvbSAyIHRvIHdoYXRldmVyIGlzIGFwcHJvcHJpYXRlLiBJdCB0b29rCisgKiAgICAgICBtZSBhIHdoaWxlIHRvIHRyYWNrIGRvd24gdGhpcyBzdXJwcmlzaW5nbHkgb2JzY3VyZSBhbmQKKyAqICAgICAgIHVuZG9jdW1lbnRlZCBsaXR0bGUgImZlYXR1cmUiLgorICoKKyAqCisgKiBQZW9wbGUgd2l0aCBidWcgcmVwb3J0cywgd2lzaC1saXN0cywgY29tcGxhaW50cywgY29tbWVudHMsCisgKiBvciBpbXByb3ZlbWVudHMgYXJlIGFza2VkIHRvIHBhaC1sZWVleiBlbWFpbCBtZSAoSm9obiBTaGlmZmxldHQpCisgKiBhdCBqb2huQGdlb2xvZy5jb20gb3IganNoaWZmbGVAbmV0Y29tLmNvbSEgSSdtIGFueGlvdXMgdG8gZ2V0CisgKiB0aGlzIHRoaW5nIGludG8gYXMgZ29vZCBhIHNoYXBlIGFzIHBvc3NpYmxlLCBhbmQgSSdtIHBvc2l0aXZlCisgKiB0aGVyZSBhcmUgbG90cyBvZiBsdXJraW5nIGJ1Z3MgYW5kICJTdHVwaWQgUGxhY2VzIi4KKyAqCisgKiBVcGRhdGVkIGZvciBMaW51eCAyLjUgYnkgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqCS0gVXNpbmcgbmV3X2VoIGhhbmRsZXIKKyAqCS0gSG9wZWZ1bGx5IGdvdCBhbGwgdGhlIGxvY2tpbmcgcmlnaHQgYWdhaW4KKyAqCVNlZSAiRklYTUUiIG5vdGVzIGZvciBpdGVtcyB0aGF0IGNvdWxkIGRvIHdpdGggbW9yZSB3b3JrCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjZGVmaW5lIElOMjAwMF9WRVJTSU9OICAgICIxLjMzLTIuNSIKKyNkZWZpbmUgSU4yMDAwX0RBVEUgICAgICAgIjIwMDIvMTEvMDMiCisKKyNpbmNsdWRlICJpbjIwMDAuaCIKKworCisvKgorICogJ3NldHVwX3N0cmluZ3MnIGlzIGEgc2luZ2xlIHN0cmluZyB1c2VkIHRvIHBhc3Mgb3BlcmF0aW5nIHBhcmFtZXRlcnMgYW5kCisgKiBzZXR0aW5ncyBmcm9tIHRoZSBrZXJuZWwvbW9kdWxlIGNvbW1hbmQtbGluZSB0byB0aGUgZHJpdmVyLiAnc2V0dXBfYXJnc1tdJworICogaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB0aGF0IGRlZmluZSB0aGUgY29tcGlsZS10aW1lIGRlZmF1bHQgdmFsdWVzIGZvcgorICogdGhlc2Ugc2V0dGluZ3MuIElmIExpbnV4IGJvb3RzIHdpdGggYSBMSUxPIG9yIGluc21vZCBjb21tYW5kLWxpbmUsIHRob3NlCisgKiBzZXR0aW5ncyBhcmUgY29tYmluZWQgd2l0aCAnc2V0dXBfYXJnc1tdJy4gTm90ZSB0aGF0IExJTE8gY29tbWFuZC1saW5lcworICogYXJlIHByZWZpeGVkIHdpdGggImluMjAwMD0iIHdoaWxlIGluc21vZCB1c2VzIGEgInNldHVwX3N0cmluZ3M9IiBwcmVmaXguCisgKiBUaGUgZHJpdmVyIHJlY29nbml6ZXMgdGhlIGZvbGxvd2luZyBrZXl3b3JkcyAobG93ZXIgY2FzZSByZXF1aXJlZCkgYW5kCisgKiBhcmd1bWVudHM6CisgKgorICogLSAgaW9wb3J0OmFkZHIgICAgLVdoZXJlIGFkZHIgaXMgSU8gYWRkcmVzcyBvZiBhICh1c3VhbGx5IFJPTS1sZXNzKSBjYXJkLgorICogLSAgbm9yZXNldCAgICAgICAgLU5vIG9wdGlvbmFsIGFyZ3MuIFByZXZlbnRzIFNDU0kgYnVzIHJlc2V0IGF0IGJvb3QgdGltZS4KKyAqIC0gIG5vc3luYzp4ICAgICAgIC14IGlzIGEgYml0bWFzayB3aGVyZSB0aGUgMXN0IDcgYml0cyBjb3JyZXNwb25kIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgICB0aGUgNyBwb3NzaWJsZSBTQ1NJIGRldmljZXMgKGJpdCAwIGZvciBkZXZpY2UgIzAsIGV0YykuCisgKiAgICAgICAgICAgICAgICAgICAgU2V0IGEgYml0IHRvIFBSRVZFTlQgc3luYyBuZWdvdGlhdGlvbiBvbiB0aGF0IGRldmljZS4KKyAqICAgICAgICAgICAgICAgICAgICBUaGUgZHJpdmVyIGRlZmF1bHQgaXMgc3luYyBESVNBQkxFRCBvbiBhbGwgZGV2aWNlcy4KKyAqIC0gIHBlcmlvZDpucyAgICAgIC1ucyBpcyB0aGUgbWluaW11bSAjIG9mIG5hbm9zZWNvbmRzIGluIGEgU0NTSSBkYXRhIHRyYW5zZmVyCisgKiAgICAgICAgICAgICAgICAgICAgcGVyaW9kLiBEZWZhdWx0IGlzIDUwMDsgYWNjZXB0YWJsZSB2YWx1ZXMgYXJlIDI1MCAtIDEwMDAuCisgKiAtICBkaXNjb25uZWN0OnggICAteCA9IDAgdG8gbmV2ZXIgYWxsb3cgZGlzY29ubmVjdHMsIDIgdG8gYWx3YXlzIGFsbG93IHRoZW0uCisgKiAgICAgICAgICAgICAgICAgICAgeCA9IDEgZG9lcyAnYWRhcHRpdmUnIGRpc2Nvbm5lY3RzLCB3aGljaCBpcyB0aGUgZGVmYXVsdAorICogICAgICAgICAgICAgICAgICAgIGFuZCBnZW5lcmFsbHkgdGhlIGJlc3QgY2hvaWNlLgorICogLSAgZGVidWc6eCAgICAgICAgLUlmICdERUJVR0dJTkdfT04nIGlzIGRlZmluZWQsIHggaXMgYSBiaXRtYXNrIHRoYXQgY2F1c2VzCisgKiAgICAgICAgICAgICAgICAgICAgdmFyaW91cyB0eXBlcyBvZiBkZWJ1ZyBvdXRwdXQgdG8gcHJpbnRlZCAtIHNlZSB0aGUgREJfeHh4CisgKiAgICAgICAgICAgICAgICAgICAgZGVmaW5lcyBpbiBpbjIwMDAuaAorICogLSAgcHJvYzp4ICAgICAgICAgLUlmICdQUk9DX0lOVEVSRkFDRScgaXMgZGVmaW5lZCwgeCBpcyBhIGJpdG1hc2sgdGhhdAorICogICAgICAgICAgICAgICAgICAgIGRldGVybWluZXMgaG93IHRoZSAvcHJvYyBpbnRlcmZhY2Ugd29ya3MgYW5kIHdoYXQgaXQKKyAqICAgICAgICAgICAgICAgICAgICBkb2VzIC0gc2VlIHRoZSBQUl94eHggZGVmaW5lcyBpbiBpbjIwMDAuaAorICoKKyAqIFN5bnRheCBOb3RlczoKKyAqIC0gIE51bWVyaWMgYXJndW1lbnRzIGNhbiBiZSBkZWNpbWFsIG9yIHRoZSAnMHgnIGZvcm0gb2YgaGV4IG5vdGF0aW9uLiBUaGVyZQorICogICAgX211c3RfIGJlIGEgY29sb24gYmV0d2VlbiBhIGtleXdvcmQgYW5kIGl0cyBudW1lcmljIGFyZ3VtZW50LCB3aXRoIG5vCisgKiAgICBzcGFjZXMuCisgKiAtICBLZXl3b3JkcyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcywgbm8gc3BhY2VzLCBpbiB0aGUgc3RhbmRhcmQga2VybmVsCisgKiAgICBjb21tYW5kLWxpbmUgbWFubmVyLgorICogLSAgQSBrZXl3b3JkIGluIHRoZSAnbnRoJyBjb21tYS1zZXBhcmF0ZWQgY29tbWFuZC1saW5lIG1lbWJlciB3aWxsIG92ZXJ3cml0ZQorICogICAgdGhlICdudGgnIGVsZW1lbnQgb2Ygc2V0dXBfYXJnc1tdLiBBIGJsYW5rIGNvbW1hbmQtbGluZSBtZW1iZXIgKGluCisgKiAgICBvdGhlciB3b3JkcywgYSBjb21tYSB3aXRoIG5vIHByZWNlZGluZyBrZXl3b3JkKSB3aWxsIF9ub3RfIG92ZXJ3cml0ZQorICogICAgdGhlIGNvcnJlc3BvbmRpbmcgc2V0dXBfYXJnc1tdIGVsZW1lbnQuCisgKgorICogQSBmZXcgTElMTyBleGFtcGxlcyAoZm9yIGluc21vZCwgdXNlICdzZXR1cF9zdHJpbmdzJyBpbnN0ZWFkIG9mICdpbjIwMDAnKToKKyAqIC0gIGluMjAwMD1pb3BvcnQ6MHgyMjAsbm9yZXNldAorICogLSAgaW4yMDAwPXBlcmlvZDoyNTAsZGlzY29ubmVjdDoyLG5vc3luYzoweDAzCisgKiAtICBpbjIwMDA9ZGVidWc6MHgxZQorICogLSAgaW4yMDAwPXByb2M6MworICovCisKKy8qIE5vcm1hbGx5LCBubyBkZWZhdWx0cyBhcmUgc3BlY2lmaWVkLi4uICovCitzdGF0aWMgY2hhciAqc2V0dXBfYXJnc1tdID0geyAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiIH07CisKKy8qIGZpbGxlZCBpbiBieSAnaW5zbW9kJyAqLworc3RhdGljIGNoYXIgKnNldHVwX3N0cmluZ3M7CisKK21vZHVsZV9wYXJhbShzZXR1cF9zdHJpbmdzLCBjaGFycCwgMCk7CisKK3N0YXRpYyBpbmxpbmUgdWNoYXIgcmVhZF8zMzkzKHN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKmhvc3RkYXRhLCB1Y2hhciByZWdfbnVtKQoreworCXdyaXRlMV9pbyhyZWdfbnVtLCBJT19XRF9BRERSKTsKKwlyZXR1cm4gcmVhZDFfaW8oSU9fV0RfREFUQSk7Cit9CisKKworI2RlZmluZSBSRUFEX0FVWF9TVEFUKCkgcmVhZDFfaW8oSU9fV0RfQVNSKQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV8zMzkzKHN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKmhvc3RkYXRhLCB1Y2hhciByZWdfbnVtLCB1Y2hhciB2YWx1ZSkKK3sKKwl3cml0ZTFfaW8ocmVnX251bSwgSU9fV0RfQUREUik7CisJd3JpdGUxX2lvKHZhbHVlLCBJT19XRF9EQVRBKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfMzM5M19jbWQoc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGEsIHVjaGFyIGNtZCkKK3sKKy8qICAgd2hpbGUgKFJFQURfQVVYX1NUQVQoKSAmIEFTUl9DSVApCisgICAgICBwcmludGsoInwiKTsqLworCXdyaXRlMV9pbyhXRF9DT01NQU5ELCBJT19XRF9BRERSKTsKKwl3cml0ZTFfaW8oY21kLCBJT19XRF9EQVRBKTsKK30KKworCitzdGF0aWMgdWNoYXIgcmVhZF8xX2J5dGUoc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGEpCit7CisJdWNoYXIgYXNyLCB4ID0gMDsKKworCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0NPTlRST0wsIENUUkxfSURJIHwgQ1RSTF9FREkgfCBDVFJMX1BPTExFRCk7CisJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9UUkFOU19JTkZPIHwgMHg4MCk7CisJZG8geworCQlhc3IgPSBSRUFEX0FVWF9TVEFUKCk7CisJCWlmIChhc3IgJiBBU1JfREJSKQorCQkJeCA9IHJlYWRfMzM5Myhob3N0ZGF0YSwgV0RfREFUQSk7CisJfSB3aGlsZSAoIShhc3IgJiBBU1JfSU5UKSk7CisJcmV0dXJuIHg7Cit9CisKKworc3RhdGljIHZvaWQgd3JpdGVfMzM5M19jb3VudChzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICpob3N0ZGF0YSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKwl3cml0ZTFfaW8oV0RfVFJBTlNGRVJfQ09VTlRfTVNCLCBJT19XRF9BRERSKTsKKwl3cml0ZTFfaW8oKHZhbHVlID4+IDE2KSwgSU9fV0RfREFUQSk7CisJd3JpdGUxX2lvKCh2YWx1ZSA+PiA4KSwgSU9fV0RfREFUQSk7CisJd3JpdGUxX2lvKHZhbHVlLCBJT19XRF9EQVRBKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkXzMzOTNfY291bnQoc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworCXdyaXRlMV9pbyhXRF9UUkFOU0ZFUl9DT1VOVF9NU0IsIElPX1dEX0FERFIpOworCXZhbHVlID0gcmVhZDFfaW8oSU9fV0RfREFUQSkgPDwgMTY7CisJdmFsdWUgfD0gcmVhZDFfaW8oSU9fV0RfREFUQSkgPDwgODsKKwl2YWx1ZSB8PSByZWFkMV9pbyhJT19XRF9EQVRBKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKworLyogVGhlIDMzYzkzIG5lZWRzIHRvIGJlIHRvbGQgd2hpY2ggZGlyZWN0aW9uIGEgY29tbWFuZCB0cmFuc2ZlcnMgaXRzCisgKiBkYXRhOyB3ZSB1c2UgdGhpcyBmdW5jdGlvbiB0byBmaWd1cmUgaXQgb3V0LiBSZXR1cm5zIHRydWUgaWYgdGhlcmUKKyAqIHdpbGwgYmUgYSBEQVRBX09VVCBwaGFzZSB3aXRoIHRoaXMgY29tbWFuZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICogKFRoYW5rcyB0byBKb2VyZyBEb3JjaGFpbiBmb3IgdGhlIHJlc2VhcmNoIGFuZCBzdWdnZXN0aW9uLikKKyAqLworc3RhdGljIGludCBpc19kaXJfb3V0KFNjc2lfQ21uZCAqIGNtZCkKK3sKKwlzd2l0Y2ggKGNtZC0+Y21uZFswXSkgeworCWNhc2UgV1JJVEVfNjoKKwljYXNlIFdSSVRFXzEwOgorCWNhc2UgV1JJVEVfMTI6CisJY2FzZSBXUklURV9MT05HOgorCWNhc2UgV1JJVEVfU0FNRToKKwljYXNlIFdSSVRFX0JVRkZFUjoKKwljYXNlIFdSSVRFX1ZFUklGWToKKwljYXNlIFdSSVRFX1ZFUklGWV8xMjoKKwljYXNlIENPTVBBUkU6CisJY2FzZSBDT1BZOgorCWNhc2UgQ09QWV9WRVJJRlk6CisJY2FzZSBTRUFSQ0hfRVFVQUw6CisJY2FzZSBTRUFSQ0hfSElHSDoKKwljYXNlIFNFQVJDSF9MT1c6CisJY2FzZSBTRUFSQ0hfRVFVQUxfMTI6CisJY2FzZSBTRUFSQ0hfSElHSF8xMjoKKwljYXNlIFNFQVJDSF9MT1dfMTI6CisJY2FzZSBGT1JNQVRfVU5JVDoKKwljYXNlIFJFQVNTSUdOX0JMT0NLUzoKKwljYXNlIFJFU0VSVkU6CisJY2FzZSBNT0RFX1NFTEVDVDoKKwljYXNlIE1PREVfU0VMRUNUXzEwOgorCWNhc2UgTE9HX1NFTEVDVDoKKwljYXNlIFNFTkRfRElBR05PU1RJQzoKKwljYXNlIENIQU5HRV9ERUZJTklUSU9OOgorCWNhc2UgVVBEQVRFX0JMT0NLOgorCWNhc2UgU0VUX1dJTkRPVzoKKwljYXNlIE1FRElVTV9TQ0FOOgorCWNhc2UgU0VORF9WT0xVTUVfVEFHOgorCWNhc2UgMHhlYToKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCisKKworc3RhdGljIHN0cnVjdCBzeF9wZXJpb2Qgc3hfdGFibGVbXSA9IHsKKwl7MSwgMHgyMH0sCisJezI1MiwgMHgyMH0sCisJezM3NiwgMHgzMH0sCisJezUwMCwgMHg0MH0sCisJezYyNCwgMHg1MH0sCisJezc1MiwgMHg2MH0sCisJezg3NiwgMHg3MH0sCisJezEwMDAsIDB4MDB9LAorCXswLCAwfQorfTsKKworc3RhdGljIGludCByb3VuZF9wZXJpb2QodW5zaWduZWQgaW50IHBlcmlvZCkKK3sKKwlpbnQgeDsKKworCWZvciAoeCA9IDE7IHN4X3RhYmxlW3hdLnBlcmlvZF9uczsgeCsrKSB7CisJCWlmICgocGVyaW9kIDw9IHN4X3RhYmxlW3ggLSAwXS5wZXJpb2RfbnMpICYmIChwZXJpb2QgPiBzeF90YWJsZVt4IC0gMV0ucGVyaW9kX25zKSkgeworCQkJcmV0dXJuIHg7CisJCX0KKwl9CisJcmV0dXJuIDc7Cit9CisKK3N0YXRpYyB1Y2hhciBjYWxjX3N5bmNfeGZlcih1bnNpZ25lZCBpbnQgcGVyaW9kLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXVjaGFyIHJlc3VsdDsKKworCXBlcmlvZCAqPSA0OwkJLyogY29udmVydCBTRFRSIGNvZGUgdG8gbnMgKi8KKwlyZXN1bHQgPSBzeF90YWJsZVtyb3VuZF9wZXJpb2QocGVyaW9kKV0ucmVnX3ZhbHVlOworCXJlc3VsdCB8PSAob2Zmc2V0IDwgT1BUSU1VTV9TWF9PRkYpID8gb2Zmc2V0IDogT1BUSU1VTV9TWF9PRkY7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisKK3N0YXRpYyB2b2lkIGluMjAwMF9leGVjdXRlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKTsKKworc3RhdGljIGludCBpbjIwMDBfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqIGNtZCwgdm9pZCAoKmRvbmUpIChTY3NpX0NtbmQgKikpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7CisJc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisJU2NzaV9DbW5kICp0bXA7CisKKwlpbnN0YW5jZSA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCWhvc3RkYXRhID0gKHN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKikgaW5zdGFuY2UtPmhvc3RkYXRhOworCisJREIoREJfUVVFVUVfQ09NTUFORCwgcHJpbnRrKCJRLSVkLSUwMngtJWxkKCIsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5jbW5kWzBdLCBjbWQtPnBpZCkpCisKKy8qIFNldCB1cCBhIGZldyBmaWVsZHMgaW4gdGhlIFNjc2lfQ21uZCBzdHJ1Y3R1cmUgZm9yIG91ciBvd24gdXNlOgorICogIC0gaG9zdF9zY3JpYmJsZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBjbWQgaW4gdGhlIGlucHV0IHF1ZXVlCisgKiAgLSBzY3NpX2RvbmUgcG9pbnRzIHRvIHRoZSByb3V0aW5lIHdlIGNhbGwgd2hlbiBhIGNtZCBpcyBmaW5pc2hlZAorICogIC0gcmVzdWx0IGlzIHdoYXQgeW91J2QgZXhwZWN0CisgKi8KKwkgICAgY21kLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwljbWQtPnNjc2lfZG9uZSA9IGRvbmU7CisJY21kLT5yZXN1bHQgPSAwOworCisvKiBXZSB1c2UgdGhlIFNjc2lfUG9pbnRlciBzdHJ1Y3R1cmUgdGhhdCdzIGluY2x1ZGVkIHdpdGggZWFjaCBjb21tYW5kCisgKiBhcyBhIHNjcmF0Y2hwYWQgKGFzIGl0J3MgaW50ZW5kZWQgdG8gYmUgdXNlZCEpLiBUaGUgaGFuZHkgdGhpbmcgYWJvdXQKKyAqIHRoZSBTQ3AueHh4IGZpZWxkcyBpcyB0aGF0IHRoZXkncmUgYWx3YXlzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuCisgKiBjbWQsIGFuZCBhcmUgcHJlc2VydmVkIGFjcm9zcyBkaXNjb25uZWN0LXJlc2VsZWN0LiBUaGlzIG1lYW5zIHdlCisgKiBjYW4gcHJldHR5IG11Y2ggaWdub3JlIFNBVkVfUE9JTlRFUlMgYW5kIFJFU1RPUkVfUE9JTlRFUlMgbWVzc2FnZXMKKyAqIGlmIHdlIGtlZXAgYWxsIHRoZSBjcml0aWNhbCBwb2ludGVycyBhbmQgY291bnRlcnMgaW4gU0NwOgorICogIC0gU0NwLnB0ciBpcyB0aGUgcG9pbnRlciBpbnRvIHRoZSBSQU0gYnVmZmVyCisgKiAgLSBTQ3AudGhpc19yZXNpZHVhbCBpcyB0aGUgc2l6ZSBvZiB0aGF0IGJ1ZmZlcgorICogIC0gU0NwLmJ1ZmZlciBwb2ludHMgdG8gdGhlIGN1cnJlbnQgc2NhdHRlci1nYXRoZXIgYnVmZmVyCisgKiAgLSBTQ3AuYnVmZmVyc19yZXNpZHVhbCB0ZWxscyB1cyBob3cgbWFueSBTLkcuIGJ1ZmZlcnMgdGhlcmUgYXJlCisgKiAgLSBTQ3AuaGF2ZV9kYXRhX2luIGhlbHBzIGtlZXAgdHJhY2sgb2YgPjIwNDggYnl0ZSB0cmFuc2ZlcnMKKyAqICAtIFNDcC5zZW50X2NvbW1hbmQgaXMgbm90IHVzZWQKKyAqICAtIFNDcC5waGFzZSByZWNvcmRzIHRoaXMgY29tbWFuZCdzIFNSQ0lEX0VSIGJpdCBzZXR0aW5nCisgKi8KKworCWlmIChjbWQtPnVzZV9zZykgeworCQljbWQtPlNDcC5idWZmZXIgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIGNtZC0+YnVmZmVyOworCQljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gY21kLT51c2Vfc2cgLSAxOworCQljbWQtPlNDcC5wdHIgPSAoY2hhciAqKSBwYWdlX2FkZHJlc3MoY21kLT5TQ3AuYnVmZmVyLT5wYWdlKSArIGNtZC0+U0NwLmJ1ZmZlci0+b2Zmc2V0OworCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gY21kLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJfSBlbHNlIHsKKwkJY21kLT5TQ3AuYnVmZmVyID0gTlVMTDsKKwkJY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IDA7CisJCWNtZC0+U0NwLnB0ciA9IChjaGFyICopIGNtZC0+cmVxdWVzdF9idWZmZXI7CisJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwl9CisJY21kLT5TQ3AuaGF2ZV9kYXRhX2luID0gMDsKKworLyogV2UgZG9uJ3Qgc2V0IFNDcC5waGFzZSBoZXJlIC0gdGhhdCdzIGRvbmUgaW4gaW4yMDAwX2V4ZWN1dGUoKSAqLworCisvKiBXRCBkb2NzIHN0YXRlIHRoYXQgYXQgdGhlIGNvbmNsdXNpb24gb2YgYSAiTEVWRUwyIiBjb21tYW5kLCB0aGUKKyAqIHN0YXR1cyBieXRlIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgTFVOIHJlZ2lzdGVyLiBBcHBhcmVudGx5LAorICogdGhpcyBpcyB0aGUgY2FzZSBvbmx5IGZvciAqdW5pbnRlcnJ1cHRlZCogTEVWRUwyIGNvbW1hbmRzISBJZgorICogdGhlcmUgYXJlIGFueSB1bmV4cGVjdGVkIHBoYXNlcyBlbnRlcmVkLCBldmVuIGlmIHRoZXkgYXJlIDEwMCUKKyAqIGxlZ2FsIChkaWZmZXJlbnQgZGV2aWNlcyBtYXkgY2hvb3NlIHRvIGRvIHRoaW5ncyBkaWZmZXJlbnRseSksCisgKiB0aGUgTEVWRUwyIGNvbW1hbmQgc2VxdWVuY2UgaXMgZXhpdGVkLiBUaGlzIG9mdGVuIG9jY3VycyBwcmlvcgorICogdG8gcmVjZWl2aW5nIHRoZSBzdGF0dXMgYnl0ZSwgaW4gd2hpY2ggY2FzZSB0aGUgZHJpdmVyIGRvZXMgYQorICogc3RhdHVzIHBoYXNlIGludGVycnVwdCBhbmQgZ2V0cyB0aGUgc3RhdHVzIGJ5dGUgb24gaXRzIG93bi4KKyAqIFdoaWxlIHN1Y2ggYSBjb21tYW5kIGNhbiB0aGVuIGJlICJyZXN1bWVkIiAoaWUgcmVzdGFydGVkIHRvCisgKiBmaW5pc2ggdXAgYXMgYSBMRVZFTDIgY29tbWFuZCksIHRoZSBMVU4gcmVnaXN0ZXIgd2lsbCBOT1QgYmUKKyAqIGEgdmFsaWQgc3RhdHVzIGJ5dGUgYXQgdGhlIGNvbW1hbmQncyBjb25jbHVzaW9uLCBhbmQgd2UgbXVzdAorICogdXNlIHRoZSBieXRlIG9idGFpbmVkIGR1cmluZyB0aGUgZWFybGllciBpbnRlcnJ1cHQuIEhlcmUsIHdlCisgKiBwcmVzZXQgU0NwLlN0YXR1cyB0byBhbiBpbGxlZ2FsIHZhbHVlICgweGZmKSBzbyB0aGF0IHdoZW4KKyAqIHRoaXMgY29tbWFuZCBmaW5hbGx5IGNvbXBsZXRlcywgd2UgY2FuIHRlbGwgd2hlcmUgdGhlIGFjdHVhbAorICogc3RhdHVzIGJ5dGUgaXMgc3RvcmVkLgorICovCisKKwljbWQtPlNDcC5TdGF0dXMgPSBJTExFR0FMX1NUQVRVU19CWVRFOworCisvKiBXZSBuZWVkIHRvIGRpc2FibGUgaW50ZXJydXB0cyBiZWZvcmUgbWVzc2luZyB3aXRoIHRoZSBpbnB1dAorICogcXVldWUgYW5kIGNhbGxpbmcgaW4yMDAwX2V4ZWN1dGUoKS4KKyAqLworCisJLyoKKwkgKiBBZGQgdGhlIGNtZCB0byB0aGUgZW5kIG9mICdpbnB1dF9RJy4gTm90ZSB0aGF0IFJFUVVFU1RfU0VOU0UKKwkgKiBjb21tYW5kcyBhcmUgYWRkZWQgdG8gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIHNvIHRoYXQgdGhlIGRlc2lyZWQKKwkgKiBzZW5zZSBkYXRhIGlzIG5vdCBsb3N0IGJlZm9yZSBSRVFVRVNUX1NFTlNFIGV4ZWN1dGVzLgorCSAqLworCisJaWYgKCEoaG9zdGRhdGEtPmlucHV0X1EpIHx8IChjbWQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkpIHsKKwkJY21kLT5ob3N0X3NjcmliYmxlID0gKHVjaGFyICopIGhvc3RkYXRhLT5pbnB1dF9ROworCQlob3N0ZGF0YS0+aW5wdXRfUSA9IGNtZDsKKwl9IGVsc2UgewkJLyogZmluZCB0aGUgZW5kIG9mIHRoZSBxdWV1ZSAqLworCQlmb3IgKHRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmlucHV0X1E7IHRtcC0+aG9zdF9zY3JpYmJsZTsgdG1wID0gKFNjc2lfQ21uZCAqKSB0bXAtPmhvc3Rfc2NyaWJibGUpOworCQl0bXAtPmhvc3Rfc2NyaWJibGUgPSAodWNoYXIgKikgY21kOworCX0KKworLyogV2Uga25vdyB0aGF0IHRoZXJlJ3MgYXQgbGVhc3Qgb25lIGNvbW1hbmQgaW4gJ2lucHV0X1EnIG5vdy4KKyAqIEdvIHNlZSBpZiBhbnkgb2YgdGhlbSBhcmUgcnVubmFibGUhCisgKi8KKworCWluMjAwMF9leGVjdXRlKGNtZC0+ZGV2aWNlLT5ob3N0KTsKKworCURCKERCX1FVRVVFX0NPTU1BTkQsIHByaW50aygiKVEtJWxkICIsIGNtZC0+cGlkKSkKKwkgICAgcmV0dXJuIDA7Cit9CisKKworCisvKgorICogVGhpcyByb3V0aW5lIGF0dGVtcHRzIHRvIHN0YXJ0IGEgc2NzaSBjb21tYW5kLiBJZiB0aGUgaG9zdF9jYXJkIGlzCisgKiBhbHJlYWR5IGNvbm5lY3RlZCwgd2UgZ2l2ZSB1cCBpbW1lZGlhdGVseS4gT3RoZXJ3aXNlLCBsb29rIHRocm91Z2gKKyAqIHRoZSBpbnB1dF9RLCB1c2luZyB0aGUgZmlyc3QgY29tbWFuZCB3ZSBmaW5kIHRoYXQncyBpbnRlbmRlZAorICogZm9yIGEgY3VycmVudGx5IG5vbi1idXN5IHRhcmdldC9sdW4uCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBhbHdheXMgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBhbHJlYWR5CisgKiBkaXNhYmxlZCAoZWl0aGVyIGZyb20gaW4yMDAwX3F1ZXVlY29tbWFuZCgpIG9yIGluMjAwMF9pbnRyKCkpLgorICovCitzdGF0aWMgdm9pZCBpbjIwMDBfZXhlY3V0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKwlzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICpob3N0ZGF0YTsKKwlTY3NpX0NtbmQgKmNtZCwgKnByZXY7CisJaW50IGk7CisJdW5zaWduZWQgc2hvcnQgKnNwOworCXVuc2lnbmVkIHNob3J0IGY7CisJdW5zaWduZWQgc2hvcnQgZmx1c2hidWZbMTZdOworCisKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKKworCURCKERCX0VYRUNVVEUsIHByaW50aygiRVgoIikpCisKKwkgICAgaWYgKGhvc3RkYXRhLT5zZWxlY3RpbmcgfHwgaG9zdGRhdGEtPmNvbm5lY3RlZCkgeworCisJCURCKERCX0VYRUNVVEUsIHByaW50aygiKUVYLTAgIikpCisKKwkJICAgIHJldHVybjsKKwl9CisKKwkvKgorCSAqIFNlYXJjaCB0aHJvdWdoIHRoZSBpbnB1dF9RIGZvciBhIGNvbW1hbmQgZGVzdGluZWQKKwkgKiBmb3IgYW4gaWRsZSB0YXJnZXQvbHVuLgorCSAqLworCisJY21kID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aW5wdXRfUTsKKwlwcmV2ID0gTlVMTDsKKwl3aGlsZSAoY21kKSB7CisJCWlmICghKGhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJiAoMSA8PCBjbWQtPmRldmljZS0+bHVuKSkpCisJCQlicmVhazsKKwkJcHJldiA9IGNtZDsKKwkJY21kID0gKFNjc2lfQ21uZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGU7CisJfQorCisJLyogcXVpdCBpZiBxdWV1ZSBlbXB0eSBvciBhbGwgcG9zc2libGUgdGFyZ2V0cyBhcmUgYnVzeSAqLworCisJaWYgKCFjbWQpIHsKKworCQlEQihEQl9FWEVDVVRFLCBwcmludGsoIilFWC0xICIpKQorCisJCSAgICByZXR1cm47CisJfQorCisJLyogIHJlbW92ZSBjb21tYW5kIGZyb20gcXVldWUgKi8KKworCWlmIChwcmV2KQorCQlwcmV2LT5ob3N0X3NjcmliYmxlID0gY21kLT5ob3N0X3NjcmliYmxlOworCWVsc2UKKwkJaG9zdGRhdGEtPmlucHV0X1EgPSAoU2NzaV9DbW5kICopIGNtZC0+aG9zdF9zY3JpYmJsZTsKKworI2lmZGVmIFBST0NfU1RBVElTVElDUworCWhvc3RkYXRhLT5jbWRfY250W2NtZC0+ZGV2aWNlLT5pZF0rKzsKKyNlbmRpZgorCisvKgorICogU3RhcnQgdGhlIHNlbGVjdGlvbiBwcm9jZXNzCisgKi8KKworCWlmIChpc19kaXJfb3V0KGNtZCkpCisJCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0RFU1RJTkFUSU9OX0lELCBjbWQtPmRldmljZS0+aWQpOworCWVsc2UKKwkJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfREVTVElOQVRJT05fSUQsIGNtZC0+ZGV2aWNlLT5pZCB8IERTVElEX0RQRCk7CisKKy8qIE5vdyB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hldGhlciBvciBub3QgdGhpcyBjb21tYW5kIGlzIGEgZ29vZAorICogY2FuZGlkYXRlIGZvciBkaXNjb25uZWN0L3Jlc2VsZWN0LiBXZSBndWVzcyB0byB0aGUgYmVzdCBvZiBvdXIKKyAqIGFiaWxpdHksIGJhc2VkIG9uIGEgc2V0IG9mIGhpZXJhcmNoaWNhbCBydWxlcy4gV2hlbiBzZXZlcmFsCisgKiBkZXZpY2VzIGFyZSBvcGVyYXRpbmcgc2ltdWx0YW5lb3VzbHksIGRpc2Nvbm5lY3RzIGFyZSB1c3VhbGx5CisgKiBhbiBhZHZhbnRhZ2UuIEluIGEgc2luZ2xlIGRldmljZSBzeXN0ZW0sIG9yIGlmIG9ubHkgMSBkZXZpY2UKKyAqIGlzIGJlaW5nIGFjY2Vzc2VkLCB0cmFuc2ZlcnMgdXN1YWxseSBnbyBmYXN0ZXIgaWYgZGlzY29ubmVjdHMKKyAqIGFyZSBub3QgYWxsb3dlZDoKKyAqCisgKiArIENvbW1hbmRzIHNob3VsZCBORVZFUiBkaXNjb25uZWN0IGlmIGhvc3RkYXRhLT5kaXNjb25uZWN0ID0KKyAqICAgRElTX05FVkVSICh0aGlzIGhvbGRzIGZvciB0YXBlIGRyaXZlcyBhbHNvKSwgYW5kIEFMV0FZUworICogICBkaXNjb25uZWN0IGlmIGhvc3RkYXRhLT5kaXNjb25uZWN0ID0gRElTX0FMV0FZUy4KKyAqICsgVGFwZSBkcml2ZSBjb21tYW5kcyBzaG91bGQgYWx3YXlzIGJlIGFsbG93ZWQgdG8gZGlzY29ubmVjdC4KKyAqICsgRGlzY29ubmVjdCBzaG91bGQgYmUgYWxsb3dlZCBpZiBkaXNjb25uZWN0ZWRfUSBpc24ndCBlbXB0eS4KKyAqICsgQ29tbWFuZHMgc2hvdWxkIE5PVCBkaXNjb25uZWN0IGlmIGlucHV0X1EgaXMgZW1wdHkuCisgKiArIERpc2Nvbm5lY3Qgc2hvdWxkIGJlIGFsbG93ZWQgaWYgdGhlcmUgYXJlIGNvbW1hbmRzIGluIGlucHV0X1EKKyAqICAgZm9yIGEgZGlmZmVyZW50IHRhcmdldC9sdW4uIEluIHRoaXMgY2FzZSwgdGhlIG90aGVyIGNvbW1hbmRzCisgKiAgIHNob3VsZCBiZSBtYWRlIGRpc2Nvbm5lY3QtYWJsZSwgaWYgbm90IGFscmVhZHkuCisgKgorICogSSBrbm93LCBJIGtub3cgLSB0aGlzIGNvZGUgd291bGQgZmx1bmsgbWUgb3V0IG9mIGFueQorICogIkMgUHJvZ3JhbW1pbmcgMTAxIiBjbGFzcyBldmVyIG9mZmVyZWQuIEJ1dCBpdCdzIGVhc3kKKyAqIHRvIGNoYW5nZSBhcm91bmQgYW5kIGV4cGVyaW1lbnQgd2l0aCBmb3Igbm93LgorICovCisKKwljbWQtPlNDcC5waGFzZSA9IDA7CS8qIGFzc3VtZSBubyBkaXNjb25uZWN0ICovCisJaWYgKGhvc3RkYXRhLT5kaXNjb25uZWN0ID09IERJU19ORVZFUikKKwkJZ290byBubzsKKwlpZiAoaG9zdGRhdGEtPmRpc2Nvbm5lY3QgPT0gRElTX0FMV0FZUykKKwkJZ290byB5ZXM7CisJaWYgKGNtZC0+ZGV2aWNlLT50eXBlID09IDEpCS8qIHRhcGUgZHJpdmU/ICovCisJCWdvdG8geWVzOworCWlmIChob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX1EpCS8qIG90aGVyIGNvbW1hbmRzIGRpc2Nvbm5lY3RlZD8gKi8KKwkJZ290byB5ZXM7CisJaWYgKCEoaG9zdGRhdGEtPmlucHV0X1EpKQkvKiBpbnB1dF9RIGVtcHR5PyAqLworCQlnb3RvIG5vOworCWZvciAocHJldiA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmlucHV0X1E7IHByZXY7IHByZXYgPSAoU2NzaV9DbW5kICopIHByZXYtPmhvc3Rfc2NyaWJibGUpIHsKKwkJaWYgKChwcmV2LT5kZXZpY2UtPmlkICE9IGNtZC0+ZGV2aWNlLT5pZCkgfHwgKHByZXYtPmRldmljZS0+bHVuICE9IGNtZC0+ZGV2aWNlLT5sdW4pKSB7CisJCQlmb3IgKHByZXYgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pbnB1dF9ROyBwcmV2OyBwcmV2ID0gKFNjc2lfQ21uZCAqKSBwcmV2LT5ob3N0X3NjcmliYmxlKQorCQkJCXByZXYtPlNDcC5waGFzZSA9IDE7CisJCQlnb3RvIHllczsKKwkJfQorCX0KKwlnb3RvIG5vOworCisgICAgICB5ZXM6CisJY21kLT5TQ3AucGhhc2UgPSAxOworCisjaWZkZWYgUFJPQ19TVEFUSVNUSUNTCisJaG9zdGRhdGEtPmRpc2NfYWxsb3dlZF9jbnRbY21kLT5kZXZpY2UtPmlkXSsrOworI2VuZGlmCisKKyAgICAgIG5vOgorCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX1NPVVJDRV9JRCwgKChjbWQtPlNDcC5waGFzZSkgPyBTUkNJRF9FUiA6IDApKTsKKworCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX1RBUkdFVF9MVU4sIGNtZC0+ZGV2aWNlLT5sdW4pOworCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX1NZTkNIUk9OT1VTX1RSQU5TRkVSLCBob3N0ZGF0YS0+c3luY194ZmVyW2NtZC0+ZGV2aWNlLT5pZF0pOworCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gfD0gKDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisKKwlpZiAoKGhvc3RkYXRhLT5sZXZlbDIgPD0gTDJfTk9ORSkgfHwgKGhvc3RkYXRhLT5zeW5jX3N0YXRbY21kLT5kZXZpY2UtPmlkXSA9PSBTU19VTlNFVCkpIHsKKworCQkvKgorCQkgKiBEbyBhICdTZWxlY3QtV2l0aC1BVE4nIGNvbW1hbmQuIFRoaXMgd2lsbCBlbmQgd2l0aAorCQkgKiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpbnRlcnJ1cHRzOgorCQkgKiAgICBDU1JfUkVTRUxfQU06ICBmYWlsdXJlIC0gY2FuIHRyeSBhZ2FpbiBsYXRlci4KKwkJICogICAgQ1NSX1RJTUVPVVQ6ICAgZmFpbHVyZSAtIGdpdmUgdXAuCisJCSAqICAgIENTUl9TRUxFQ1Q6ICAgIHN1Y2Nlc3MgLSBwcm9jZWVkLgorCQkgKi8KKworCQlob3N0ZGF0YS0+c2VsZWN0aW5nID0gY21kOworCisvKiBFdmVyeSB0YXJnZXQgaGFzIGl0cyBvd24gc3luY2hyb25vdXMgdHJhbnNmZXIgc2V0dGluZywga2VwdCBpbgorICogdGhlIHN5bmNfeGZlciBhcnJheSwgYW5kIGEgY29ycmVzcG9uZGluZyBzdGF0dXMgYnl0ZSBpbiBzeW5jX3N0YXRbXS4KKyAqIEVhY2ggdGFyZ2V0J3Mgc3luY19zdGF0W10gZW50cnkgaXMgaW5pdGlhbGl6ZWQgdG8gU1NfVU5TRVQsIGFuZCBpdHMKKyAqIHN5bmNfeGZlcltdIGVudHJ5IGlzIGluaXRpYWxpemVkIHRvIHRoZSBkZWZhdWx0L3NhZmUgdmFsdWUuIFNTX1VOU0VUCisgKiBtZWFucyB0aGF0IHRoZSBwYXJhbWV0ZXJzIGFyZSB1bmRldGVybWluZWQgYXMgeWV0LCBhbmQgdGhhdCB3ZQorICogbmVlZCB0byBzZW5kIGFuIFNEVFIgbWVzc2FnZSB0byB0aGlzIGRldmljZSBhZnRlciBzZWxlY3Rpb24gaXMKKyAqIGNvbXBsZXRlLiBXZSBzZXQgU1NfRklSU1QgdG8gdGVsbCB0aGUgaW50ZXJydXB0IHJvdXRpbmUgdG8gZG8gc28sCisgKiB1bmxlc3Mgd2UgZG9uJ3Qgd2FudCB0byBldmVuIF90cnlfIHN5bmNocm9ub3VzIHRyYW5zZmVyczogSW4gdGhpcworICogY2FzZSB3ZSBzZXQgU1NfU0VUIHRvIG1ha2UgdGhlIGRlZmF1bHRzIGZpbmFsLgorICovCisJCWlmIChob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gPT0gU1NfVU5TRVQpIHsKKwkJCWlmIChob3N0ZGF0YS0+c3luY19vZmYgJiAoMSA8PCBjbWQtPmRldmljZS0+aWQpKQorCQkJCWhvc3RkYXRhLT5zeW5jX3N0YXRbY21kLT5kZXZpY2UtPmlkXSA9IFNTX1NFVDsKKwkJCWVsc2UKKwkJCQlob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gPSBTU19GSVJTVDsKKwkJfQorCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1NFTEVDVElORzsKKwkJd3JpdGVfMzM5M19jb3VudChob3N0ZGF0YSwgMCk7CS8qIHRoaXMgZ3VhcmFudGVlcyBhIERBVEFfUEhBU0UgaW50ZXJydXB0ICovCisJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfU0VMX0FUTik7CisJfQorCisJZWxzZSB7CisKKwkJLyoKKwkJICogRG8gYSAnU2VsZWN0LVdpdGgtQVROLVhmZXInIGNvbW1hbmQuIFRoaXMgd2lsbCBlbmQgd2l0aAorCQkgKiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpbnRlcnJ1cHRzOgorCQkgKiAgICBDU1JfUkVTRUxfQU06ICBmYWlsdXJlIC0gY2FuIHRyeSBhZ2FpbiBsYXRlci4KKwkJICogICAgQ1NSX1RJTUVPVVQ6ICAgZmFpbHVyZSAtIGdpdmUgdXAuCisJCSAqICAgIGFueXRoaW5nIGVsc2U6IHN1Y2Nlc3MgLSBwcm9jZWVkLgorCQkgKi8KKworCQlob3N0ZGF0YS0+Y29ubmVjdGVkID0gY21kOworCQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9DT01NQU5EX1BIQVNFLCAwKTsKKworCQkvKiBjb3B5IGNvbW1hbmRfZGVzY3JpcHRvcl9ibG9jayBpbnRvIFdEIGNoaXAKKwkJICogKHRha2UgYWR2YW50YWdlIG9mIGF1dG8taW5jcmVtZW50aW5nKQorCQkgKi8KKworCQl3cml0ZTFfaW8oV0RfQ0RCXzEsIElPX1dEX0FERFIpOworCQlmb3IgKGkgPSAwOyBpIDwgY21kLT5jbWRfbGVuOyBpKyspCisJCQl3cml0ZTFfaW8oY21kLT5jbW5kW2ldLCBJT19XRF9EQVRBKTsKKworCQkvKiBUaGUgd2QzM2M5MyBvbmx5IGtub3dzIGFib3V0IEdyb3VwIDAsIDEsIGFuZCA1IGNvbW1hbmRzIHdoZW4KKwkJICogaXQncyBkb2luZyBhICdzZWxlY3QtYW5kLXRyYW5zZmVyJy4gVG8gYmUgc2FmZSwgd2Ugd3JpdGUgdGhlCisJCSAqIHNpemUgb2YgdGhlIENEQiBpbnRvIHRoZSBPV05fSUQgcmVnaXN0ZXIgZm9yIGV2ZXJ5IGNhc2UuIFRoaXMKKwkJICogd2F5IHRoZXJlIHdvbid0IGJlIHByb2JsZW1zIHdpdGggdmVuZG9yLXVuaXF1ZSwgYXVkaW8sIGV0Yy4KKwkJICovCisKKwkJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfT1dOX0lELCBjbWQtPmNtZF9sZW4pOworCisJCS8qIFdoZW4gZG9pbmcgYSBub24tZGlzY29ubmVjdCBjb21tYW5kLCB3ZSBjYW4gc2F2ZSBvdXJzZWx2ZXMgYSBEQVRBCisJCSAqIHBoYXNlIGludGVycnVwdCBsYXRlciBieSBzZXR0aW5nIGV2ZXJ5dGhpbmcgdXAgbm93LiBXaXRoIHdyaXRlcyB3ZQorCQkgKiBuZWVkIHRvIHByZS1maWxsIHRoZSBmaWZvOyBpZiB0aGVyZSdzIHJvb20gZm9yIHRoZSAzMiBmbHVzaCBieXRlcywKKwkJICogcHV0IHRoZW0gaW4gdGhlcmUgdG9vIC0gdGhhdCdsbCBhdm9pZCBhIGZpZm8gaW50ZXJydXB0LiBSZWFkcyBhcmUKKwkJICogc29tZXdoYXQgc2ltcGxlci4KKwkJICogS0xVREdFIE5PVEU6IEl0IHNlZW1zIHRoYXQgeW91IGNhbid0IGNvbXBsZXRlbHkgZmlsbCB0aGUgZmlmbyBoZXJlOgorCQkgKiBUaGlzIHJlc3VsdHMgaW4gdGhlIElPX0ZJRk9fQ09VTlQgcmVnaXN0ZXIgcm9sbGluZyBvdmVyIHRvIHplcm8sCisJCSAqIGFuZCBhcHBhcmVudGx5IHRoZSBnYXRlIGFycmF5IGxvZ2ljIHNlZXMgdGhpcyBhcyBlbXB0eSwgbm90IGZ1bGwsCisJCSAqIHNvIHRoZSAzMzkzIGNoaXAgaXMgbmV2ZXIgc2lnbmFsbGVkIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUKKwkJICogZmlmby4gT3IgbWF5YmUgaXQncyBzZWVuIGFzIGEgcGVybWFuZW50IGZpZm8gaW50ZXJydXB0IGNvbmRpdGlvbi4KKwkJICogUmVnYXJkbGVzcywgd2UgZml4IHRoaXMgYnkgdGVtcG9yYXJpbHkgcHJldGVuZGluZyB0aGF0IHRoZSBmaWZvCisJCSAqIGlzIDE2IGJ5dGVzIHNtYWxsZXIuIChJIHNlZSBub3cgdGhhdCB0aGUgb2xkIGRyaXZlciBoYXMgYSBjb21tZW50CisJCSAqIGFib3V0ICJkb24ndCBmaWxsIGNvbXBsZXRlbHkiIGluIGFuIGFuYWxvZ291cyBwbGFjZSAtIG11c3QgYmUgdGhlCisJCSAqIHNhbWUgZGVhbC4pIFRoaXMgcmVzdWx0cyBpbiBDRFJPTSwgc3dhcCBwYXJ0aXRpb25zLCBhbmQgdGFwZSBkcml2ZXMKKwkJICogbmVlZGluZyBhbiBleHRyYSBpbnRlcnJ1cHQgcGVyIHdyaXRlIGNvbW1hbmQgLSBJIHRoaW5rIHdlIGNhbiBsaXZlCisJCSAqIHdpdGggdGhhdCEKKwkJICovCisKKwkJaWYgKCEoY21kLT5TQ3AucGhhc2UpKSB7CisJCQl3cml0ZV8zMzkzX2NvdW50KGhvc3RkYXRhLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsKTsKKwkJCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0NPTlRST0wsIENUUkxfSURJIHwgQ1RSTF9FREkgfCBDVFJMX0JVUyk7CisJCQl3cml0ZTFfaW8oMCwgSU9fRklGT19XUklURSk7CS8qIGNsZWFyIGZpZm8gY291bnRlciwgd3JpdGUgbW9kZSAqLworCisJCQlpZiAoaXNfZGlyX291dChjbWQpKSB7CisJCQkJaG9zdGRhdGEtPmZpZm8gPSBGSV9GSUZPX1dSSVRJTkc7CisJCQkJaWYgKChpID0gY21kLT5TQ3AudGhpc19yZXNpZHVhbCkgPiAoSU4yMDAwX0ZJRk9fU0laRSAtIDE2KSkKKwkJCQkJaSA9IElOMjAwMF9GSUZPX1NJWkUgLSAxNjsKKwkJCQljbWQtPlNDcC5oYXZlX2RhdGFfaW4gPSBpOwkvKiB0aGlzIG11Y2ggZGF0YSBpbiBmaWZvICovCisJCQkJaSA+Pj0gMTsJLyogR3VscC4gQXNzdW1pbmcgbW9kdWxvIDIuICovCisJCQkJc3AgPSAodW5zaWduZWQgc2hvcnQgKikgY21kLT5TQ3AucHRyOworCQkJCWYgPSBob3N0ZGF0YS0+aW9fYmFzZSArIElPX0ZJRk87CisKKyNpZmRlZiBGQVNUX1dSSVRFX0lPCisKKwkJCQlGQVNUX1dSSVRFMl9JTygpOworI2Vsc2UKKwkJCQl3aGlsZSAoaS0tKQorCQkJCQl3cml0ZTJfaW8oKnNwKyssIElPX0ZJRk8pOworCisjZW5kaWYKKworCQkJCS8qIElzIHRoZXJlIHJvb20gZm9yIHRoZSBmbHVzaCBieXRlcz8gKi8KKworCQkJCWlmIChjbWQtPlNDcC5oYXZlX2RhdGFfaW4gPD0gKChJTjIwMDBfRklGT19TSVpFIC0gMTYpIC0gMzIpKSB7CisJCQkJCXNwID0gZmx1c2hidWY7CisJCQkJCWkgPSAxNjsKKworI2lmZGVmIEZBU1RfV1JJVEVfSU8KKworCQkJCQlGQVNUX1dSSVRFMl9JTygpOworI2Vsc2UKKwkJCQkJd2hpbGUgKGktLSkKKwkJCQkJCXdyaXRlMl9pbygwLCBJT19GSUZPKTsKKworI2VuZGlmCisKKwkJCQl9CisJCQl9CisKKwkJCWVsc2UgeworCQkJCXdyaXRlMV9pbygwLCBJT19GSUZPX1JFQUQpOwkvKiBwdXQgZmlmbyBpbiByZWFkIG1vZGUgKi8KKwkJCQlob3N0ZGF0YS0+ZmlmbyA9IEZJX0ZJRk9fUkVBRElORzsKKwkJCQljbWQtPlNDcC5oYXZlX2RhdGFfaW4gPSAwOwkvKiBub3RoaW5nIHRyYW5zZmVycmVkIHlldCAqLworCQkJfQorCisJCX0gZWxzZSB7CisJCQl3cml0ZV8zMzkzX2NvdW50KGhvc3RkYXRhLCAwKTsJLyogdGhpcyBndWFyYW50ZWVzIGEgREFUQV9QSEFTRSBpbnRlcnJ1cHQgKi8KKwkJfQorCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1JVTk5JTkdfTEVWRUwyOworCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX1NFTF9BVE5fWEZFUik7CisJfQorCisJLyoKKwkgKiBTaW5jZSB0aGUgU0NTSSBidXMgY2FuIGhhbmRsZSBvbmx5IDEgY29ubmVjdGlvbiBhdCBhIHRpbWUsCisJICogd2UgZ2V0IG91dCBvZiBoZXJlIG5vdy4gSWYgdGhlIHNlbGVjdGlvbiBmYWlscywgb3Igd2hlbgorCSAqIHRoZSBjb21tYW5kIGRpc2Nvbm5lY3RzLCB3ZSdsbCBjb21lIGJhY2sgdG8gdGhpcyByb3V0aW5lCisJICogdG8gc2VhcmNoIHRoZSBpbnB1dF9RIGFnYWluLi4uCisJICovCisKKwlEQihEQl9FWEVDVVRFLCBwcmludGsoIiVzJWxkKUVYLTIgIiwgKGNtZC0+U0NwLnBoYXNlKSA/ICJkOiIgOiAiIiwgY21kLT5waWQpKQorCit9CisKKworCitzdGF0aWMgdm9pZCB0cmFuc2Zlcl9waW8odWNoYXIgKiBidWYsIGludCBjbnQsIGludCBkYXRhX2luX2Rpciwgc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGEpCit7CisJdWNoYXIgYXNyOworCisJREIoREJfVFJBTlNGRVIsIHByaW50aygiKCVwLCVkLCVzKSIsIGJ1ZiwgY250LCBkYXRhX2luX2RpciA/ICJpbiIgOiAib3V0IikpCisKKwkgICAgd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfQ09OVFJPTCwgQ1RSTF9JREkgfCBDVFJMX0VESSB8IENUUkxfUE9MTEVEKTsKKwl3cml0ZV8zMzkzX2NvdW50KGhvc3RkYXRhLCBjbnQpOworCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfVFJBTlNfSU5GTyk7CisJaWYgKGRhdGFfaW5fZGlyKSB7CisJCWRvIHsKKwkJCWFzciA9IFJFQURfQVVYX1NUQVQoKTsKKwkJCWlmIChhc3IgJiBBU1JfREJSKQorCQkJCSpidWYrKyA9IHJlYWRfMzM5Myhob3N0ZGF0YSwgV0RfREFUQSk7CisJCX0gd2hpbGUgKCEoYXNyICYgQVNSX0lOVCkpOworCX0gZWxzZSB7CisJCWRvIHsKKwkJCWFzciA9IFJFQURfQVVYX1NUQVQoKTsKKwkJCWlmIChhc3IgJiBBU1JfREJSKQorCQkJCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0RBVEEsICpidWYrKyk7CisJCX0gd2hpbGUgKCEoYXNyICYgQVNSX0lOVCkpOworCX0KKworCS8qIE5vdGU6IHdlIGFyZSByZXR1cm5pbmcgd2l0aCB0aGUgaW50ZXJydXB0IFVOLWNsZWFyZWQuCisJICogU2luY2UgKHByZXN1bWFibHkpIGFuIGVudGlyZSBJL08gb3BlcmF0aW9uIGhhcworCSAqIGNvbXBsZXRlZCwgdGhlIGJ1cyBwaGFzZSBpcyBwcm9iYWJseSBkaWZmZXJlbnQsIGFuZAorCSAqIHRoZSBpbnRlcnJ1cHQgcm91dGluZSB3aWxsIGRpc2NvdmVyIHRoaXMgd2hlbiBpdAorCSAqIHJlc3BvbmRzIHRvIHRoZSB1bmNsZWFyZWQgaW50LgorCSAqLworCit9CisKKworCitzdGF0aWMgdm9pZCB0cmFuc2Zlcl9ieXRlcyhTY3NpX0NtbmQgKiBjbWQsIGludCBkYXRhX2luX2RpcikKK3sKKwlzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICpob3N0ZGF0YTsKKwl1bnNpZ25lZCBzaG9ydCAqc3A7CisJdW5zaWduZWQgc2hvcnQgZjsKKwlpbnQgaTsKKworCWhvc3RkYXRhID0gKHN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKikgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisvKiBOb3JtYWxseSwgeW91J2QgZXhwZWN0ICd0aGlzX3Jlc2lkdWFsJyB0byBiZSBub24temVybyBoZXJlLgorICogSW4gYSBzZXJpZXMgb2Ygc2NhdHRlci1nYXRoZXIgdHJhbnNmZXJzLCBob3dldmVyLCB0aGlzCisgKiByb3V0aW5lIHdpbGwgdXN1YWxseSBiZSBjYWxsZWQgd2l0aCAndGhpc19yZXNpZHVhbCcgZXF1YWwKKyAqIHRvIDAgYW5kICdidWZmZXJzX3Jlc2lkdWFsJyBub24temVyby4gVGhpcyBtZWFucyB0aGF0IGEKKyAqIHByZXZpb3VzIHRyYW5zZmVyIGNvbXBsZXRlZCwgY2xlYXJpbmcgJ3RoaXNfcmVzaWR1YWwnLCBhbmQKKyAqIG5vdyB3ZSBuZWVkIHRvIHNldHVwIHRoZSBuZXh0IHNjYXR0ZXItZ2F0aGVyIGJ1ZmZlciBhcyB0aGUKKyAqIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBmb3IgVEhJUyB0cmFuc2Zlci4KKyAqLworCWlmICghY21kLT5TQ3AudGhpc19yZXNpZHVhbCAmJiBjbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsKSB7CisJCSsrY21kLT5TQ3AuYnVmZmVyOworCQktLWNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw7CisJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBjbWQtPlNDcC5idWZmZXItPmxlbmd0aDsKKwkJY21kLT5TQ3AucHRyID0gcGFnZV9hZGRyZXNzKGNtZC0+U0NwLmJ1ZmZlci0+cGFnZSkgKyBjbWQtPlNDcC5idWZmZXItPm9mZnNldDsKKwl9CisKKy8qIFNldCB1cCBoYXJkd2FyZSByZWdpc3RlcnMgKi8KKworCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX1NZTkNIUk9OT1VTX1RSQU5TRkVSLCBob3N0ZGF0YS0+c3luY194ZmVyW2NtZC0+ZGV2aWNlLT5pZF0pOworCXdyaXRlXzMzOTNfY291bnQoaG9zdGRhdGEsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0NPTlRST0wsIENUUkxfSURJIHwgQ1RSTF9FREkgfCBDVFJMX0JVUyk7CisJd3JpdGUxX2lvKDAsIElPX0ZJRk9fV1JJVEUpOwkvKiB6ZXJvIGNvdW50ZXIsIGFzc3VtZSB3cml0ZSAqLworCisvKiBSZWFkaW5nIGlzIGVhc3kuIEp1c3QgaXNzdWUgdGhlIGNvbW1hbmQgYW5kIHJldHVybiAtIHdlJ2xsCisgKiBnZXQgYW4gaW50ZXJydXB0IGxhdGVyIHdoZW4gd2UgaGF2ZSBhY3R1YWwgZGF0YSB0byB3b3JyeSBhYm91dC4KKyAqLworCisJaWYgKGRhdGFfaW5fZGlyKSB7CisJCXdyaXRlMV9pbygwLCBJT19GSUZPX1JFQUQpOworCQlpZiAoKGhvc3RkYXRhLT5sZXZlbDIgPj0gTDJfREFUQSkgfHwgKGhvc3RkYXRhLT5sZXZlbDIgPT0gTDJfQkFTSUMgJiYgY21kLT5TQ3AucGhhc2UgPT0gMCkpIHsKKwkJCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0NPTU1BTkRfUEhBU0UsIDB4NDUpOworCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9TRUxfQVROX1hGRVIpOworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19SVU5OSU5HX0xFVkVMMjsKKwkJfSBlbHNlCisJCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX1RSQU5TX0lORk8pOworCQlob3N0ZGF0YS0+ZmlmbyA9IEZJX0ZJRk9fUkVBRElORzsKKwkJY21kLT5TQ3AuaGF2ZV9kYXRhX2luID0gMDsKKwkJcmV0dXJuOworCX0KKworLyogV3JpdGluZyBpcyBtb3JlIGludm9sdmVkIC0gd2UnbGwgc3RhcnQgdGhlIFdEIGNoaXAgYW5kIHdyaXRlIGFzCisgKiBtdWNoIGRhdGEgdG8gdGhlIGZpZm8gYXMgd2UgY2FuIHJpZ2h0IG5vdy4gTGF0ZXIgaW50ZXJydXB0cyB3aWxsCisgKiB3cml0ZSBhbnkgYnl0ZXMgdGhhdCBkb24ndCBtYWtlIGl0IGF0IHRoaXMgc3RhZ2UuCisgKi8KKworCWlmICgoaG9zdGRhdGEtPmxldmVsMiA+PSBMMl9EQVRBKSB8fCAoaG9zdGRhdGEtPmxldmVsMiA9PSBMMl9CQVNJQyAmJiBjbWQtPlNDcC5waGFzZSA9PSAwKSkgeworCQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9DT01NQU5EX1BIQVNFLCAweDQ1KTsKKwkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9TRUxfQVROX1hGRVIpOworCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1JVTk5JTkdfTEVWRUwyOworCX0gZWxzZQorCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX1RSQU5TX0lORk8pOworCWhvc3RkYXRhLT5maWZvID0gRklfRklGT19XUklUSU5HOworCXNwID0gKHVuc2lnbmVkIHNob3J0ICopIGNtZC0+U0NwLnB0cjsKKworCWlmICgoaSA9IGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpID4gSU4yMDAwX0ZJRk9fU0laRSkKKwkJaSA9IElOMjAwMF9GSUZPX1NJWkU7CisJY21kLT5TQ3AuaGF2ZV9kYXRhX2luID0gaTsKKwlpID4+PSAxOwkJLyogR3VscC4gV2UgYXNzdW1lIHRoaXNfcmVzaWR1YWwgaXMgbW9kdWxvIDIgKi8KKwlmID0gaG9zdGRhdGEtPmlvX2Jhc2UgKyBJT19GSUZPOworCisjaWZkZWYgRkFTVF9XUklURV9JTworCisJRkFTVF9XUklURTJfSU8oKTsKKyNlbHNlCisJd2hpbGUgKGktLSkKKwkJd3JpdGUyX2lvKCpzcCsrLCBJT19GSUZPKTsKKworI2VuZGlmCisKK30KKworCisvKiBXZSBuZWVkIHRvIHVzZSBzcGluX2xvY2tfaXJxc2F2ZSgpICYgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgpIGluIHRoaXMKKyAqIGZ1bmN0aW9uIGluIG9yZGVyIHRvIHdvcmsgaW4gYW4gU01QIGVudmlyb25tZW50LiAoSSdkIGJlIHN1cnByaXNlZAorICogaWYgdGhlIGRyaXZlciBpcyBldmVyIHVzZWQgYnkgYW55b25lIG9uIGEgcmVhbCBtdWx0aS1DUFUgbW90aGVyYm9hcmQsCisgKiBidXQgaXQgX2RvZXNfIG5lZWQgdG8gYmUgYWJsZSB0byBjb21waWxlIGFuZCBydW4gaW4gYW4gU01QIGtlcm5lbC4pCisgKi8KKworc3RhdGljIGlycXJldHVybl90IGluMjAwMF9pbnRyKGludCBpcnFudW0sIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSA9IGRldl9pZDsKKwlzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICpob3N0ZGF0YTsKKwlTY3NpX0NtbmQgKnBhdGNoLCAqY21kOworCXVjaGFyIGFzciwgc3IsIHBocywgaWQsIGx1biwgKnVjcCwgbXNnOworCWludCBpLCBqOworCXVuc2lnbmVkIGxvbmcgbGVuZ3RoOworCXVuc2lnbmVkIHNob3J0ICpzcDsKKwl1bnNpZ25lZCBzaG9ydCBmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKKworLyogR2V0IHRoZSBzcGluX2xvY2sgYW5kIGRpc2FibGUgZnVydGhlciBpbnRzLCBmb3IgU01QICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+aG9zdF9sb2NrLCBmbGFncyk7CisKKyNpZmRlZiBQUk9DX1NUQVRJU1RJQ1MKKwlob3N0ZGF0YS0+aW50X2NudCsrOworI2VuZGlmCisKKy8qIFRoZSBJTjIwMDAgY2FyZCBoYXMgMiBpbnRlcnJ1cHQgc291cmNlcyBPUidlZCBvbnRvIGl0cyBJUlEgbGluZSAtIHRoZQorICogV0QzMzkzIGNoaXAgYW5kIHRoZSAyayBmaWZvICh3aGljaCBpcyBhY3R1YWxseSBhIGR1YWwtcG9ydCBSQU0gY29tYmluZWQKKyAqIHdpdGggYSBiaWcgbG9naWMgYXJyYXksIHNvIGl0J3MgYSBsaXR0bGUgZGlmZmVyZW50IHRoYW4gd2hhdCB5b3UgbWlnaHQKKyAqIGV4cGVjdCkuIEFzIGZhciBhcyBJIGtub3csIHRoZXJlJ3Mgbm8gcmVhc29uIHRoYXQgQk9USCBjYW4ndCBiZSBhY3RpdmUKKyAqIGF0IHRoZSBzYW1lIHRpbWUsIGJ1dCB0aGVyZSdzIGEgcHJvYmxlbTogd2hpbGUgd2UgY2FuIHJlYWQgdGhlIDMzOTMKKyAqIHRvIHRlbGwgaWYgX2l0XyB3YW50cyBhbiBpbnRlcnJ1cHQsIEkgZG9uJ3Qga25vdyBvZiBhIHdheSB0byBhc2sgdGhlCisgKiBmaWZvIHRoZSBzYW1lIHF1ZXN0aW9uLiBUaGUgYmVzdCB3ZSBjYW4gZG8gaXMgY2hlY2sgdGhlIDMzOTMgYW5kIGlmCisgKiBpdCBfaXNuJ3RfIHRoZSBzb3VyY2Ugb2YgdGhlIGludGVycnVwdCwgdGhlbiB3ZSBjYW4gYmUgcHJldHR5IHN1cmUKKyAqIHRoYXQgdGhlIGZpZm8gaXMgdGhlIGN1bHByaXQuCisgKiAgVVBEQVRFOiBJIGhhdmUgaXQgb24gZ29vZCBhdXRob3JpdHkgKEJpbGwgRWFybmVzdCkgdGhhdCBiaXQgMCBvZiB0aGUKKyAqICAgICAgICAgIElPX0ZJRk9fQ09VTlQgcmVnaXN0ZXIgbWlycm9ycyB0aGUgZmlmbyBpbnRlcnJ1cHQgc3RhdGUuIEkKKyAqICAgICAgICAgIGFzc3VtZSB0aGF0IGJpdCBjbGVhciBtZWFucyBpbnRlcnJ1cHQgYWN0aXZlLiBBcyBpdCB0dXJucworICogICAgICAgICAgb3V0LCB0aGUgZHJpdmVyIHJlYWxseSBkb2Vzbid0IG5lZWQgdG8gY2hlY2sgZm9yIHRoaXMgYWZ0ZXIKKyAqICAgICAgICAgIGFsbCwgc28gbXkgcmVtYXJrcyBhYm92ZSBhYm91dCBhICdwcm9ibGVtJyBjYW4gc2FmZWx5IGJlCisgKiAgICAgICAgICBpZ25vcmVkLiBUaGUgd2F5IHRoZSBsb2dpYyBpcyBzZXQgdXAsIHRoZXJlJ3Mgbm8gYWR2YW50YWdlCisgKiAgICAgICAgICAodGhhdCBJIGNhbiBzZWUpIHRvIHdvcnJ5aW5nIGFib3V0IGl0LgorICoKKyAqIEl0IHNlZW1zIHRoYXQgdGhlIGZpZm8gaW50ZXJydXB0IHNpZ25hbCBpcyBuZWdhdGVkIHdoZW4gd2UgZXh0cmFjdAorICogYnl0ZXMgZHVyaW5nIHJlYWQgb3Igd3JpdGUgYnl0ZXMgZHVyaW5nIHdyaXRlLgorICogIC0gZmlmbyB3aWxsIGludGVycnVwdCB3aGVuIGRhdGEgaXMgbW92aW5nIGZyb20gaXQgdG8gdGhlIDMzOTMsIGFuZAorICogICAgdGhlcmUgYXJlIDMxIChvciBsZXNzPykgYnl0ZXMgbGVmdCB0byBnby4gVGhpcyBpcyBzb3J0IG9mIHNob3J0LQorICogICAgc2lnaHRlZDogd2hhdCBpZiB5b3UgZG9uJ3QgV0FOVCB0byBkbyBtb3JlPyBJbiBhbnkgY2FzZSwgb3VyCisgKiAgICByZXNwb25zZSBpcyB0byBwdXNoIG1vcmUgaW50byB0aGUgZmlmbyAtIGVpdGhlciBhY3R1YWwgZGF0YSBvcgorICogICAgZHVtbXkgYnl0ZXMgaWYgbmVlZCBiZS4gTm90ZSB0aGF0IHdlIGFwcGFyZW50bHkgaGF2ZSB0byB3cml0ZSBhdAorICogICAgbGVhc3QgMzIgYWRkaXRpb25hbCBieXRlcyB0byB0aGUgZmlmbyBhZnRlciBhbiBpbnRlcnJ1cHQgaW4gb3JkZXIKKyAqICAgIHRvIGdldCBpdCB0byByZWxlYXNlIHRoZSBvbmVzIGl0IHdhcyBob2xkaW5nIG9uIHRvIC0gd3JpdGluZyBmZXdlcgorICogICAgdGhhbiAzMiB3aWxsIHJlc3VsdCBpbiBhbm90aGVyIGZpZm8gaW50LgorICogIFVQREFURTogQWdhaW4sIGluZm8gZnJvbSBCaWxsIEVhcm5lc3QgbWFrZXMgdGhpcyBtb3JlIHVuZGVyc3RhbmRhYmxlOgorICogICAgICAgICAgMzIgYnl0ZXMgPSB0d28gY291bnRzIG9mIHRoZSBmaWZvIGNvdW50ZXIgcmVnaXN0ZXIuIEhlIHRlbGxzCisgKiAgICAgICAgICBtZSB0aGF0IHRoZSBmaWZvIGludGVycnVwdCBpcyBhIG5vbi1sYXRjaGluZyBzaWduYWwgZGVyaXZlZAorICogICAgICAgICAgZnJvbSBhIHN0cmFpZ2h0Zm9yd2FyZCBib29sZWFuIGludGVycHJldGF0aW9uIG9mIHRoZSA3CisgKiAgICAgICAgICBoaWdoZXN0IGJpdHMgb2YgdGhlIGZpZm8gY291bnRlciBhbmQgdGhlIGZpZm8tcmVhZC9maWZvLXdyaXRlCisgKiAgICAgICAgICBzdGF0ZS4gV2hvJ2QgYSB0aG91Z2h0PworICovCisKKwl3cml0ZTFfaW8oMCwgSU9fTEVEX09OKTsKKwlhc3IgPSBSRUFEX0FVWF9TVEFUKCk7CisJaWYgKCEoYXNyICYgQVNSX0lOVCkpIHsJLyogbm8gV0QzM2M5MyBpbnRlcnJ1cHQ/ICovCisKKy8qIE9rLiBUaGlzIGlzIGRlZmluaXRlbHkgYSBGSUZPLW9ubHkgaW50ZXJydXB0LgorICoKKyAqIElmIEZJX0ZJRk9fUkVBRElORyBpcyBzZXQsIHRoZXJlIGFyZSB1cCB0byAyMDQ4IGJ5dGVzIHdhaXRpbmcgdG8gYmUgcmVhZCwKKyAqIG1heWJlIG1vcmUgdG8gY29tZSBmcm9tIHRoZSBTQ1NJIGJ1cy4gUmVhZCBhcyBtYW55IGFzIHdlIGNhbiBvdXQgb2YgdGhlCisgKiBmaWZvIGFuZCBpbnRvIG1lbW9yeSBhdCB0aGUgbG9jYXRpb24gb2YgU0NwLnB0cltTQ3AuaGF2ZV9kYXRhX2luXSwgYW5kCisgKiB1cGRhdGUgaGF2ZV9kYXRhX2luIGFmdGVyd2FyZHMuCisgKgorICogSWYgd2UgaGF2ZSBGSV9GSUZPX1dSSVRJTkcsIHRoZSBGSUZPIGhhcyBhbG1vc3QgcnVuIG91dCBvZiBieXRlcyB0byBtb3ZlCisgKiBpbnRvIHRoZSBXRDMzOTMgY2hpcCAoSSB0aGluayB0aGUgaW50ZXJydXB0IGhhcHBlbnMgd2hlbiB0aGVyZSBhcmUgMzEKKyAqIGJ5dGVzIGxlZnQsIGJ1dCBpdCBtYXkgYmUgZmV3ZXIuLi4pLiBUaGUgMzM5MyBpcyBzdGlsbCB3YWl0aW5nLCBzbyB3ZQorICogc2hvdmUgc29tZSBtb3JlIGludG8gdGhlIGZpZm8sIHdoaWNoIGdldHMgdGhpbmdzIG1vdmluZyBhZ2Fpbi4gSWYgdGhlCisgKiBvcmlnaW5hbCBTQ1NJIGNvbW1hbmQgc3BlY2lmaWVkIG1vcmUgdGhhbiAyMDQ4IGJ5dGVzLCB0aGVyZSBtYXkgc3RpbGwKKyAqIGJlIHNvbWUgb2YgdGhhdCBkYXRhIGxlZnQ6IGZpbmUgLSB1c2UgaXQgKGZyb20gU0NwLnB0cltTQ3AuaGF2ZV9kYXRhX2luXSkuCisgKiBEb24ndCBmb3JnZXQgdG8gdXBkYXRlIGhhdmVfZGF0YV9pbi4gSWYgd2UndmUgYWxyZWFkeSB3cml0dGVuIG91dCB0aGUKKyAqIGVudGlyZSBidWZmZXIsIGZlZWQgMzIgZHVtbXkgYnl0ZXMgdG8gdGhlIGZpZm8gLSB0aGV5J3JlIG5lZWRlZCB0bworICogcHVzaCBvdXQgdGhlIHJlbWFpbmluZyByZWFsIGRhdGEuCisgKiAgICAoQmlnIHRoYW5rcyB0byBCaWxsIEVhcm5lc3QgZm9yIGdldHRpbmcgbWUgb3V0IG9mIHRoZSBtdWQgaW4gaGVyZS4pCisgKi8KKworCQljbWQgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5jb25uZWN0ZWQ7CS8qIGFzc3VtZSB3ZSdyZSBjb25uZWN0ZWQgKi8KKwkJQ0hFQ0tfTlVMTChjbWQsICJmaWZvX2ludCIpCisKKwkJICAgIGlmIChob3N0ZGF0YS0+ZmlmbyA9PSBGSV9GSUZPX1JFQURJTkcpIHsKKworCQkJREIoREJfRklGTywgcHJpbnRrKCJ7UjolMDJ4fSAiLCByZWFkMV9pbyhJT19GSUZPX0NPVU5UKSkpCisKKwkJCSAgICBzcCA9ICh1bnNpZ25lZCBzaG9ydCAqKSAoY21kLT5TQ3AucHRyICsgY21kLT5TQ3AuaGF2ZV9kYXRhX2luKTsKKwkJCWkgPSByZWFkMV9pbyhJT19GSUZPX0NPVU5UKSAmIDB4ZmU7CisJCQlpIDw8PSAyOwkvKiAjIG9mIHdvcmRzIHdhaXRpbmcgaW4gdGhlIGZpZm8gKi8KKwkJCWYgPSBob3N0ZGF0YS0+aW9fYmFzZSArIElPX0ZJRk87CisKKyNpZmRlZiBGQVNUX1JFQURfSU8KKworCQkJRkFTVF9SRUFEMl9JTygpOworI2Vsc2UKKwkJCXdoaWxlIChpLS0pCisJCQkJKnNwKysgPSByZWFkMl9pbyhJT19GSUZPKTsKKworI2VuZGlmCisKKwkJCWkgPSBzcCAtICh1bnNpZ25lZCBzaG9ydCAqKSAoY21kLT5TQ3AucHRyICsgY21kLT5TQ3AuaGF2ZV9kYXRhX2luKTsKKwkJCWkgPDw9IDE7CisJCQljbWQtPlNDcC5oYXZlX2RhdGFfaW4gKz0gaTsKKwkJfQorCisJCWVsc2UgaWYgKGhvc3RkYXRhLT5maWZvID09IEZJX0ZJRk9fV1JJVElORykgeworCisJCQlEQihEQl9GSUZPLCBwcmludGsoIntXOiUwMnh9ICIsIHJlYWQxX2lvKElPX0ZJRk9fQ09VTlQpKSkKKworLyogSWYgYWxsIGJ5dGVzIGhhdmUgYmVlbiB3cml0dGVuIHRvIHRoZSBmaWZvLCBmbHVzaCBvdXQgdGhlIHN0cmFnZ2xlcnMuCisgKiBOb3RlIHRoYXQgd2hpbGUgd3JpdGluZyAxNiBkdW1teSB3b3JkcyBzZWVtcyBhcmJpdHJhcnksIHdlIGRvbid0CisgKiBoYXZlIGFub3RoZXIgY2hvaWNlIHRoYXQgSSBjYW4gc2VlLiBXaGF0IHdlIHJlYWxseSB3YW50IGlzIHRvIHJlYWQKKyAqIHRoZSAzMzkzIHRyYW5zZmVyIGNvdW50IHJlZ2lzdGVyICh0aGF0IHdvdWxkIHRlbGwgdXMgaG93IG1hbnkgYnl0ZXMKKyAqIG5lZWRlZCBmbHVzaGluZyksIGJ1dCB0aGUgVFJBTlNGRVJfSU5GTyBjb21tYW5kIGhhc24ndCBjb21wbGV0ZWQKKyAqIHlldCAobm90IGVub3VnaCBieXRlcyEpIGFuZCB0aGF0IHJlZ2lzdGVyIHdvbid0IGJlIGFjY2Vzc2libGUuIFNvLAorICogd2UgdXNlIDE2IHdvcmRzIC0gYSBudW1iZXIgb2J0YWluZWQgdGhyb3VnaCB0cmlhbCBhbmQgZXJyb3IuCisgKiAgVVBEQVRFOiBCaWxsIHNheXMgdGhpcyBpcyBleGFjdGx5IHdoYXQgQWx3YXlzIGRvZXMsIHNvIHRoZXJlLgorICogICAgICAgICAgTW9yZSB0aGFua3MgZHVlIGhpbSBmb3IgaGVscCBpbiB0aGlzIHNlY3Rpb24uCisgKi8KKwkJCSAgICBpZiAoY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9PSBjbWQtPlNDcC5oYXZlX2RhdGFfaW4pIHsKKwkJCQlpID0gMTY7CisJCQkJd2hpbGUgKGktLSkJLyogd3JpdGUgMzIgZHVtbXkgYnl0ZXMgKi8KKwkJCQkJd3JpdGUyX2lvKDAsIElPX0ZJRk8pOworCQkJfQorCisvKiBJZiB0aGVyZSBhcmUgc3RpbGwgYnl0ZXMgbGVmdCBpbiB0aGUgU0NTSSBidWZmZXIsIHdyaXRlIGFzIG1hbnkgYXMgd2UKKyAqIGNhbiBvdXQgdG8gdGhlIGZpZm8uCisgKi8KKworCQkJZWxzZSB7CisJCQkJc3AgPSAodW5zaWduZWQgc2hvcnQgKikgKGNtZC0+U0NwLnB0ciArIGNtZC0+U0NwLmhhdmVfZGF0YV9pbik7CisJCQkJaSA9IGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgLSBjbWQtPlNDcC5oYXZlX2RhdGFfaW47CS8qIGJ5dGVzIHlldCB0byBnbyAqLworCQkJCWogPSByZWFkMV9pbyhJT19GSUZPX0NPVU5UKSAmIDB4ZmU7CisJCQkJaiA8PD0gMjsJLyogaG93IG1hbnkgd29yZHMgdGhlIGZpZm8gaGFzIHJvb20gZm9yICovCisJCQkJaWYgKChqIDw8IDEpID4gaSkKKwkJCQkJaiA9IChpID4+IDEpOworCQkJCXdoaWxlIChqLS0pCisJCQkJCXdyaXRlMl9pbygqc3ArKywgSU9fRklGTyk7CisKKwkJCQlpID0gc3AgLSAodW5zaWduZWQgc2hvcnQgKikgKGNtZC0+U0NwLnB0ciArIGNtZC0+U0NwLmhhdmVfZGF0YV9pbik7CisJCQkJaSA8PD0gMTsKKwkJCQljbWQtPlNDcC5oYXZlX2RhdGFfaW4gKz0gaTsKKwkJCX0KKwkJfQorCisJCWVsc2UgeworCQkJcHJpbnRrKCIqKiogU3B1cmlvdXMgRklGTyBpbnRlcnJ1cHQgKioqIik7CisJCX0KKworCQl3cml0ZTFfaW8oMCwgSU9fTEVEX09GRik7CisKKy8qIHJlbGVhc2UgdGhlIFNNUCBzcGluX2xvY2sgYW5kIHJlc3RvcmUgaXJxIHN0YXRlICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisvKiBUaGlzIGludGVycnVwdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSBXRDMzYzkzIGNoaXAuIFRoZSBmaWZvIGludGVycnVwdAorICogbWF5IGFsc28gYmUgYXNzZXJ0ZWQsIGJ1dCB3ZSBkb24ndCBib3RoZXIgdG8gY2hlY2sgaXQ6IHdlIGdldCBtb3JlCisgKiBkZXRhaWxlZCBpbmZvIGZyb20gRklGT19SRUFESU5HIGFuZCBGSUZPX1dSSVRJTkcgKHNlZSBiZWxvdykuCisgKi8KKworCWNtZCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmNvbm5lY3RlZDsJLyogYXNzdW1lIHdlJ3JlIGNvbm5lY3RlZCAqLworCXNyID0gcmVhZF8zMzkzKGhvc3RkYXRhLCBXRF9TQ1NJX1NUQVRVUyk7CS8qIGNsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KKwlwaHMgPSByZWFkXzMzOTMoaG9zdGRhdGEsIFdEX0NPTU1BTkRfUEhBU0UpOworCisJaWYgKCFjbWQgJiYgKHNyICE9IENTUl9SRVNFTF9BTSAmJiBzciAhPSBDU1JfVElNRU9VVCAmJiBzciAhPSBDU1JfU0VMRUNUKSkgeworCQlwcmludGsoIlxuTlI6d2QtaW50ci0xXG4iKTsKKwkJd3JpdGUxX2lvKDAsIElPX0xFRF9PRkYpOworCisvKiByZWxlYXNlIHRoZSBTTVAgc3Bpbl9sb2NrIGFuZCByZXN0b3JlIGlycSBzdGF0ZSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCURCKERCX0lOVFIsIHByaW50aygieyUwMng6JTAyeC0iLCBhc3IsIHNyKSkKKworLyogQWZ0ZXIgc3RhcnRpbmcgYSBGSUZPLWJhc2VkIHRyYW5zZmVyLCB0aGUgbmV4dCBfV0QzMzkzXyBpbnRlcnJ1cHQgaXMKKyAqIGd1YXJhbnRlZWQgdG8gYmUgaW4gcmVzcG9uc2UgdG8gdGhlIGNvbXBsZXRpb24gb2YgdGhlIHRyYW5zZmVyLgorICogSWYgd2Ugd2VyZSByZWFkaW5nLCB0aGVyZSdzIHByb2JhYmx5IGRhdGEgaW4gdGhlIGZpZm8gdGhhdCBuZWVkcworICogdG8gYmUgY29waWVkIGludG8gUkFNIC0gZG8gdGhhdCBoZXJlLiBBbHNvLCB3ZSBoYXZlIHRvIHVwZGF0ZQorICogJ3RoaXNfcmVzaWR1YWwnIGFuZCAncHRyJyBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlCisgKiBUUkFOU0ZFUl9DT1VOVCByZWdpc3RlciwgaW4gY2FzZSB0aGUgZGV2aWNlIGRlY2lkZWQgdG8gZG8gYW4KKyAqIGludGVybWVkaWF0ZSBkaXNjb25uZWN0IChhIGRldmljZSBtYXkgZG8gdGhpcyBpZiBpdCBoYXMgdG8KKyAqIGRvIGEgc2VlaywgIG9yIGp1c3QgdG8gYmUgbmljZSBhbmQgbGV0IG90aGVyIGRldmljZXMgaGF2ZQorICogc29tZSBidXMgdGltZSBkdXJpbmcgbG9uZyB0cmFuc2ZlcnMpLgorICogQWZ0ZXIgZG9pbmcgd2hhdGV2ZXIgaXMgbmVjZXNzYXJ5IHdpdGggdGhlIGZpZm8sIHdlIGdvIG9uIGFuZAorICogc2VydmljZSB0aGUgV0QzMzkzIGludGVycnVwdCBub3JtYWxseS4KKyAqLworCSAgICBpZiAoaG9zdGRhdGEtPmZpZm8gPT0gRklfRklGT19SRUFESU5HKSB7CisKKy8qIGJ1ZmZlciBpbmRleCA9IHN0YXJ0LW9mLWJ1ZmZlciArICMtb2YtYnl0ZXMtYWxyZWFkeS1yZWFkICovCisKKwkJc3AgPSAodW5zaWduZWQgc2hvcnQgKikgKGNtZC0+U0NwLnB0ciArIGNtZC0+U0NwLmhhdmVfZGF0YV9pbik7CisKKy8qIGJ5dGVzIHJlbWFpbmluZyBpbiBmaWZvID0gKHRvdGFsLXdhbnRlZCAtICMtbm90LWdvdCkgLSAjLWFscmVhZHktcmVhZCAqLworCisJCWkgPSAoY21kLT5TQ3AudGhpc19yZXNpZHVhbCAtIHJlYWRfMzM5M19jb3VudChob3N0ZGF0YSkpIC0gY21kLT5TQ3AuaGF2ZV9kYXRhX2luOworCQlpID4+PSAxOwkvKiBHdWxwLiBXZSBhc3N1bWUgdGhpcyB3aWxsIGFsd2F5cyBiZSBtb2R1bG8gMiAqLworCQlmID0gaG9zdGRhdGEtPmlvX2Jhc2UgKyBJT19GSUZPOworCisjaWZkZWYgRkFTVF9SRUFEX0lPCisKKwkJRkFTVF9SRUFEMl9JTygpOworI2Vsc2UKKwkJd2hpbGUgKGktLSkKKwkJCSpzcCsrID0gcmVhZDJfaW8oSU9fRklGTyk7CisKKyNlbmRpZgorCisJCWhvc3RkYXRhLT5maWZvID0gRklfRklGT19VTlVTRUQ7CisJCWxlbmd0aCA9IGNtZC0+U0NwLnRoaXNfcmVzaWR1YWw7CisJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPSByZWFkXzMzOTNfY291bnQoaG9zdGRhdGEpOworCQljbWQtPlNDcC5wdHIgKz0gKGxlbmd0aCAtIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworCisJCURCKERCX1RSQU5TRkVSLCBwcmludGsoIiglcCwlZCkiLCBjbWQtPlNDcC5wdHIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpKQorCisJfQorCisJZWxzZSBpZiAoaG9zdGRhdGEtPmZpZm8gPT0gRklfRklGT19XUklUSU5HKSB7CisJCWhvc3RkYXRhLT5maWZvID0gRklfRklGT19VTlVTRUQ7CisJCWxlbmd0aCA9IGNtZC0+U0NwLnRoaXNfcmVzaWR1YWw7CisJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPSByZWFkXzMzOTNfY291bnQoaG9zdGRhdGEpOworCQljbWQtPlNDcC5wdHIgKz0gKGxlbmd0aCAtIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworCisJCURCKERCX1RSQU5TRkVSLCBwcmludGsoIiglcCwlZCkiLCBjbWQtPlNDcC5wdHIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpKQorCisJfQorCisvKiBSZXNwb25kIHRvIHRoZSBzcGVjaWZpYyBXRDMzOTMgaW50ZXJydXB0IC0gdGhlcmUgYXJlIHF1aXRlIGEgZmV3ISAqLworCisJc3dpdGNoIChzcikgeworCisJY2FzZSBDU1JfVElNRU9VVDoKKwkJREIoREJfSU5UUiwgcHJpbnRrKCJUSU1FT1VUIikpCisKKwkJICAgIGlmIChob3N0ZGF0YS0+c3RhdGUgPT0gU19SVU5OSU5HX0xFVkVMMikKKwkJCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQllbHNlIHsKKwkJCWNtZCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPnNlbGVjdGluZzsJLyogZ2V0IGEgdmFsaWQgY21kICovCisJCQlDSEVDS19OVUxMKGNtZCwgImNzcl90aW1lb3V0IikKKwkJCSAgICBob3N0ZGF0YS0+c2VsZWN0aW5nID0gTlVMTDsKKwkJfQorCisJCWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOworCQljbWQtPnNjc2lfZG9uZShjbWQpOworCisvKiBXZSBhcmUgbm90IGNvbm5lY3RlZCB0byBhIHRhcmdldCAtIGNoZWNrIHRvIHNlZSBpZiB0aGVyZQorICogYXJlIGNvbW1hbmRzIHdhaXRpbmcgdG8gYmUgZXhlY3V0ZWQuCisgKi8KKworCQlpbjIwMDBfZXhlY3V0ZShpbnN0YW5jZSk7CisJCWJyZWFrOworCisKKy8qIE5vdGU6IHRoaXMgaW50ZXJydXB0IHNob3VsZCBub3Qgb2NjdXIgaW4gYSBMRVZFTDIgY29tbWFuZCAqLworCisJY2FzZSBDU1JfU0VMRUNUOgorCQlEQihEQl9JTlRSLCBwcmludGsoIlNFTEVDVCIpKQorCQkgICAgaG9zdGRhdGEtPmNvbm5lY3RlZCA9IGNtZCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPnNlbGVjdGluZzsKKwkJQ0hFQ0tfTlVMTChjbWQsICJjc3Jfc2VsZWN0IikKKwkJICAgIGhvc3RkYXRhLT5zZWxlY3RpbmcgPSBOVUxMOworCisJCS8qIGNvbnN0cnVjdCBhbiBJREVOVElGWSBtZXNzYWdlIHdpdGggY29ycmVjdCBkaXNjb25uZWN0IGJpdCAqLworCisJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMF0gPSAoMHg4MCB8IDB4MDAgfCBjbWQtPmRldmljZS0+bHVuKTsKKwkJaWYgKGNtZC0+U0NwLnBoYXNlKQorCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1swXSB8PSAweDQwOworCisJCWlmIChob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gPT0gU1NfRklSU1QpIHsKKyNpZmRlZiBTWU5DX0RFQlVHCisJCQlwcmludGsoIiBzZW5kaW5nIFNEVFIgIik7CisjZW5kaWYKKworCQkJaG9zdGRhdGEtPnN5bmNfc3RhdFtjbWQtPmRldmljZS0+aWRdID0gU1NfV0FJVElORzsKKworCQkJLyogdGFjayBvbiBhIDJuZCBtZXNzYWdlIHRvIGFzayBhYm91dCBzeW5jaHJvbm91cyB0cmFuc2ZlcnMgKi8KKworCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1sxXSA9IEVYVEVOREVEX01FU1NBR0U7CisJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzJdID0gMzsKKwkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbM10gPSBFWFRFTkRFRF9TRFRSOworCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1s0XSA9IE9QVElNVU1fU1hfUEVSIC8gNDsKKwkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbNV0gPSBPUFRJTVVNX1NYX09GRjsKKwkJCWhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSA2OworCQl9IGVsc2UKKwkJCWhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSAxOworCisJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQlicmVhazsKKworCisJY2FzZSBDU1JfWEZFUl9ET05FIHwgUEhTX0RBVEFfSU46CisJY2FzZSBDU1JfVU5FWFAgfCBQSFNfREFUQV9JTjoKKwljYXNlIENTUl9TUlZfUkVRIHwgUEhTX0RBVEFfSU46CisJCURCKERCX0lOVFIsIHByaW50aygiSU4tJWQuJWQiLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsLCBjbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsKSkKKwkJICAgIHRyYW5zZmVyX2J5dGVzKGNtZCwgREFUQV9JTl9ESVIpOworCQlpZiAoaG9zdGRhdGEtPnN0YXRlICE9IFNfUlVOTklOR19MRVZFTDIpCisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKKwkJYnJlYWs7CisKKworCWNhc2UgQ1NSX1hGRVJfRE9ORSB8IFBIU19EQVRBX09VVDoKKwljYXNlIENTUl9VTkVYUCB8IFBIU19EQVRBX09VVDoKKwljYXNlIENTUl9TUlZfUkVRIHwgUEhTX0RBVEFfT1VUOgorCQlEQihEQl9JTlRSLCBwcmludGsoIk9VVC0lZC4lZCIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwsIGNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpKQorCQkgICAgdHJhbnNmZXJfYnl0ZXMoY21kLCBEQVRBX09VVF9ESVIpOworCQlpZiAoaG9zdGRhdGEtPnN0YXRlICE9IFNfUlVOTklOR19MRVZFTDIpCisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKKwkJYnJlYWs7CisKKworLyogTm90ZTogdGhpcyBpbnRlcnJ1cHQgc2hvdWxkIG5vdCBvY2N1ciBpbiBhIExFVkVMMiBjb21tYW5kICovCisKKwljYXNlIENTUl9YRkVSX0RPTkUgfCBQSFNfQ09NTUFORDoKKwljYXNlIENTUl9VTkVYUCB8IFBIU19DT01NQU5EOgorCWNhc2UgQ1NSX1NSVl9SRVEgfCBQSFNfQ09NTUFORDoKKwkJREIoREJfSU5UUiwgcHJpbnRrKCJDTU5ELSUwMngsJWxkIiwgY21kLT5jbW5kWzBdLCBjbWQtPnBpZCkpCisJCSAgICB0cmFuc2Zlcl9waW8oY21kLT5jbW5kLCBjbWQtPmNtZF9sZW4sIERBVEFfT1VUX0RJUiwgaG9zdGRhdGEpOworCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKKwkJYnJlYWs7CisKKworCWNhc2UgQ1NSX1hGRVJfRE9ORSB8IFBIU19TVEFUVVM6CisJY2FzZSBDU1JfVU5FWFAgfCBQSFNfU1RBVFVTOgorCWNhc2UgQ1NSX1NSVl9SRVEgfCBQSFNfU1RBVFVTOgorCQlEQihEQl9JTlRSLCBwcmludGsoIlNUQVRVUz0iKSkKKworCQkgICAgY21kLT5TQ3AuU3RhdHVzID0gcmVhZF8xX2J5dGUoaG9zdGRhdGEpOworCQlEQihEQl9JTlRSLCBwcmludGsoIiUwMngiLCBjbWQtPlNDcC5TdGF0dXMpKQorCQkgICAgaWYgKGhvc3RkYXRhLT5sZXZlbDIgPj0gTDJfQkFTSUMpIHsKKwkJCXNyID0gcmVhZF8zMzkzKGhvc3RkYXRhLCBXRF9TQ1NJX1NUQVRVUyk7CS8qIGNsZWFyIGludGVycnVwdCAqLworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19SVU5OSU5HX0xFVkVMMjsKKwkJCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0NPTU1BTkRfUEhBU0UsIDB4NTApOworCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9TRUxfQVROX1hGRVIpOworCQl9IGVsc2UgeworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7CisJCX0KKwkJYnJlYWs7CisKKworCWNhc2UgQ1NSX1hGRVJfRE9ORSB8IFBIU19NRVNTX0lOOgorCWNhc2UgQ1NSX1VORVhQIHwgUEhTX01FU1NfSU46CisJY2FzZSBDU1JfU1JWX1JFUSB8IFBIU19NRVNTX0lOOgorCQlEQihEQl9JTlRSLCBwcmludGsoIk1TR19JTj0iKSkKKworCQkgICAgbXNnID0gcmVhZF8xX2J5dGUoaG9zdGRhdGEpOworCQlzciA9IHJlYWRfMzM5Myhob3N0ZGF0YSwgV0RfU0NTSV9TVEFUVVMpOwkvKiBjbGVhciBpbnRlcnJ1cHQgKi8KKworCQlob3N0ZGF0YS0+aW5jb21pbmdfbXNnW2hvc3RkYXRhLT5pbmNvbWluZ19wdHJdID0gbXNnOworCQlpZiAoaG9zdGRhdGEtPmluY29taW5nX21zZ1swXSA9PSBFWFRFTkRFRF9NRVNTQUdFKQorCQkJbXNnID0gRVhURU5ERURfTUVTU0FHRTsKKwkJZWxzZQorCQkJaG9zdGRhdGEtPmluY29taW5nX3B0ciA9IDA7CisKKwkJY21kLT5TQ3AuTWVzc2FnZSA9IG1zZzsKKwkJc3dpdGNoIChtc2cpIHsKKworCQljYXNlIENPTU1BTkRfQ09NUExFVEU6CisJCQlEQihEQl9JTlRSLCBwcmludGsoIkNDTVAtJWxkIiwgY21kLT5waWQpKQorCQkJICAgIHdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfTkVHQVRFX0FDSyk7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1BSRV9DTVBfRElTQzsKKwkJCWJyZWFrOworCisJCWNhc2UgU0FWRV9QT0lOVEVSUzoKKwkJCURCKERCX0lOVFIsIHByaW50aygiU0RQIikpCisJCQkgICAgd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9ORUdBVEVfQUNLKTsKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRVNUT1JFX1BPSU5URVJTOgorCQkJREIoREJfSU5UUiwgcHJpbnRrKCJSRFAiKSkKKwkJCSAgICBpZiAoaG9zdGRhdGEtPmxldmVsMiA+PSBMMl9CQVNJQykgeworCQkJCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0NPTU1BTkRfUEhBU0UsIDB4NDUpOworCQkJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfU0VMX0FUTl9YRkVSKTsKKwkJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1JVTk5JTkdfTEVWRUwyOworCQkJfSBlbHNlIHsKKwkJCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX05FR0FURV9BQ0spOworCQkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBESVNDT05ORUNUOgorCQkJREIoREJfSU5UUiwgcHJpbnRrKCJESVMiKSkKKwkJCSAgICBjbWQtPmRldmljZS0+ZGlzY29ubmVjdCA9IDE7CisJCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX05FR0FURV9BQ0spOworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19QUkVfVE1QX0RJU0M7CisJCQlicmVhazsKKworCQljYXNlIE1FU1NBR0VfUkVKRUNUOgorCQkJREIoREJfSU5UUiwgcHJpbnRrKCJSRUoiKSkKKyNpZmRlZiBTWU5DX0RFQlVHCisJCQkgICAgcHJpbnRrKCItUkVKLSIpOworI2VuZGlmCisJCQlpZiAoaG9zdGRhdGEtPnN5bmNfc3RhdFtjbWQtPmRldmljZS0+aWRdID09IFNTX1dBSVRJTkcpCisJCQkJaG9zdGRhdGEtPnN5bmNfc3RhdFtjbWQtPmRldmljZS0+aWRdID0gU1NfU0VUOworCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9ORUdBVEVfQUNLKTsKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBFWFRFTkRFRF9NRVNTQUdFOgorCQkJREIoREJfSU5UUiwgcHJpbnRrKCJFWFQiKSkKKworCQkJICAgIHVjcCA9IGhvc3RkYXRhLT5pbmNvbWluZ19tc2c7CisKKyNpZmRlZiBTWU5DX0RFQlVHCisJCQlwcmludGsoIiUwMngiLCB1Y3BbaG9zdGRhdGEtPmluY29taW5nX3B0cl0pOworI2VuZGlmCisJCQkvKiBJcyB0aGlzIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGV4dGVuZGVkIG1lc3NhZ2U/ICovCisKKwkJCWlmICgoaG9zdGRhdGEtPmluY29taW5nX3B0ciA+PSAyKSAmJiAoaG9zdGRhdGEtPmluY29taW5nX3B0ciA9PSAodWNwWzFdICsgMSkpKSB7CisKKwkJCQlzd2l0Y2ggKHVjcFsyXSkgewkvKiB3aGF0J3MgdGhlIEVYVEVOREVEIGNvZGU/ICovCisJCQkJY2FzZSBFWFRFTkRFRF9TRFRSOgorCQkJCQlpZCA9IGNhbGNfc3luY194ZmVyKHVjcFszXSwgdWNwWzRdKTsKKwkJCQkJaWYgKGhvc3RkYXRhLT5zeW5jX3N0YXRbY21kLT5kZXZpY2UtPmlkXSAhPSBTU19XQUlUSU5HKSB7CisKKy8qIEEgZGV2aWNlIGhhcyBzZW50IGFuIHVuc29saWNpdGVkIFNEVFIgbWVzc2FnZTsgcmF0aGVyIHRoYW4gZ28KKyAqIHRocm91Z2ggdGhlIGVmZm9ydCBvZiBkZWNvZGluZyBpdCBhbmQgdGhlbiBmaWd1cmluZyBvdXQgd2hhdAorICogb3VyIHJlcGx5IHNob3VsZCBiZSwgd2UncmUganVzdCBnb25uYSBzYXkgdGhhdCB3ZSBoYXZlIGEKKyAqIHN5bmNocm9ub3VzIGZpZm8gZGVwdGggb2YgMC4gVGhpcyB3aWxsIHJlc3VsdCBpbiBhc3luY2hyb25vdXMKKyAqIHRyYW5zZmVycyAtIG5vdCBpZGVhbCBidXQgc28gbXVjaCBlYXNpZXIuCisgKiBBY3R1YWxseSwgdGhpcyBpcyBPSyBiZWNhdXNlIGl0IGFzc3VyZXMgdXMgdGhhdCBpZiB3ZSBkb24ndAorICogc3BlY2lmaWNhbGx5IGFzayBmb3Igc3luYyB0cmFuc2ZlcnMsIHdlIHdvbid0IGRvIGFueS4KKyAqLworCisJCQkJCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX0FTU0VSVF9BVE4pOwkvKiB3YW50IE1FU1NfT1VUICovCisJCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzBdID0gRVhURU5ERURfTUVTU0FHRTsKKwkJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMV0gPSAzOworCQkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1syXSA9IEVYVEVOREVEX1NEVFI7CisJCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzNdID0gaG9zdGRhdGEtPmRlZmF1bHRfc3hfcGVyIC8gNDsKKwkJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbNF0gPSAwOworCQkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX2xlbiA9IDU7CisJCQkJCQlob3N0ZGF0YS0+c3luY194ZmVyW2NtZC0+ZGV2aWNlLT5pZF0gPSBjYWxjX3N5bmNfeGZlcihob3N0ZGF0YS0+ZGVmYXVsdF9zeF9wZXIgLyA0LCAwKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWhvc3RkYXRhLT5zeW5jX3hmZXJbY21kLT5kZXZpY2UtPmlkXSA9IGlkOworCQkJCQl9CisjaWZkZWYgU1lOQ19ERUJVRworCQkJCQlwcmludGsoInN5bmNfeGZlcj0lMDJ4IiwgaG9zdGRhdGEtPnN5bmNfeGZlcltjbWQtPmRldmljZS0+aWRdKTsKKyNlbmRpZgorCQkJCQlob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gPSBTU19TRVQ7CisJCQkJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfTkVHQVRFX0FDSyk7CisJCQkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQkJCQlicmVhazsKKwkJCQljYXNlIEVYVEVOREVEX1dEVFI6CisJCQkJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfQVNTRVJUX0FUTik7CS8qIHdhbnQgTUVTU19PVVQgKi8KKwkJCQkJcHJpbnRrKCJzZW5kaW5nIFdEVFIgIik7CisJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMF0gPSBFWFRFTkRFRF9NRVNTQUdFOworCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzFdID0gMjsKKwkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1syXSA9IEVYVEVOREVEX1dEVFI7CisJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbM10gPSAwOwkvKiA4IGJpdCB0cmFuc2ZlciB3aWR0aCAqLworCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbGVuID0gNDsKKwkJCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9ORUdBVEVfQUNLKTsKKwkJCQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfQVNTRVJUX0FUTik7CS8qIHdhbnQgTUVTU19PVVQgKi8KKwkJCQkJcHJpbnRrKCJSZWplY3RpbmcgVW5rbm93biBFeHRlbmRlZCBNZXNzYWdlKCUwMngpLiAiLCB1Y3BbMl0pOworCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzBdID0gTUVTU0FHRV9SRUpFQ1Q7CisJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSAxOworCQkJCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX05FR0FURV9BQ0spOworCQkJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWhvc3RkYXRhLT5pbmNvbWluZ19wdHIgPSAwOworCQkJfQorCisJCQkvKiBXZSBuZWVkIHRvIHJlYWQgbW9yZSBNRVNTX0lOIGJ5dGVzIGZvciB0aGUgZXh0ZW5kZWQgbWVzc2FnZSAqLworCisJCQllbHNlIHsKKwkJCQlob3N0ZGF0YS0+aW5jb21pbmdfcHRyKys7CisJCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9ORUdBVEVfQUNLKTsKKwkJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoIlJlamVjdGluZyBVbmtub3duIE1lc3NhZ2UoJTAyeCkgIiwgbXNnKTsKKwkJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfQVNTRVJUX0FUTik7CS8qIHdhbnQgTUVTU19PVVQgKi8KKwkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMF0gPSBNRVNTQUdFX1JFSkVDVDsKKwkJCWhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSAxOworCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9ORUdBVEVfQUNLKTsKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQl9CisJCWJyZWFrOworCisKKy8qIE5vdGU6IHRoaXMgaW50ZXJydXB0IHdpbGwgb2NjdXIgb25seSBhZnRlciBhIExFVkVMMiBjb21tYW5kICovCisKKwljYXNlIENTUl9TRUxfWEZFUl9ET05FOgorCisvKiBNYWtlIHN1cmUgdGhhdCByZXNlbGVjdGlvbiBpcyBlbmFibGVkIGF0IHRoaXMgcG9pbnQgLSBpdCBtYXkKKyAqIGhhdmUgYmVlbiB0dXJuZWQgb2ZmIGZvciB0aGUgY29tbWFuZCB0aGF0IGp1c3QgY29tcGxldGVkLgorICovCisKKwkJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfU09VUkNFX0lELCBTUkNJRF9FUik7CisJCWlmIChwaHMgPT0gMHg2MCkgeworCQkJREIoREJfSU5UUiwgcHJpbnRrKCJTWC1ET05FLSVsZCIsIGNtZC0+cGlkKSkKKwkJCSAgICBjbWQtPlNDcC5NZXNzYWdlID0gQ09NTUFORF9DT01QTEVURTsKKwkJCWx1biA9IHJlYWRfMzM5Myhob3N0ZGF0YSwgV0RfVEFSR0VUX0xVTik7CisJCQlEQihEQl9JTlRSLCBwcmludGsoIjolZC4lZCIsIGNtZC0+U0NwLlN0YXR1cywgbHVuKSkKKwkJCSAgICBob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKwkJCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19VTkNPTk5FQ1RFRDsKKwkJCWlmIChjbWQtPlNDcC5TdGF0dXMgPT0gSUxMRUdBTF9TVEFUVVNfQllURSkKKwkJCQljbWQtPlNDcC5TdGF0dXMgPSBsdW47CisJCQlpZiAoY21kLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UgJiYgY21kLT5TQ3AuU3RhdHVzICE9IEdPT0QpCisJCQkJY21kLT5yZXN1bHQgPSAoY21kLT5yZXN1bHQgJiAweDAwZmZmZikgfCAoRElEX0VSUk9SIDw8IDE2KTsKKwkJCWVsc2UKKwkJCQljbWQtPnJlc3VsdCA9IGNtZC0+U0NwLlN0YXR1cyB8IChjbWQtPlNDcC5NZXNzYWdlIDw8IDgpOworCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKworLyogV2UgYXJlIG5vIGxvbmdlciBjb25uZWN0ZWQgdG8gYSB0YXJnZXQgLSBjaGVjayB0byBzZWUgaWYKKyAqIHRoZXJlIGFyZSBjb21tYW5kcyB3YWl0aW5nIHRvIGJlIGV4ZWN1dGVkLgorICovCisKKwkJCWluMjAwMF9leGVjdXRlKGluc3RhbmNlKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50aygiJTAyeDolMDJ4OiUwMngtJWxkOiBVbmtub3duIFNFTF9YRkVSX0RPTkUgcGhhc2UhIS0tLSIsIGFzciwgc3IsIHBocywgY21kLT5waWQpOworCQl9CisJCWJyZWFrOworCisKKy8qIE5vdGU6IHRoaXMgaW50ZXJydXB0IHdpbGwgb2NjdXIgb25seSBhZnRlciBhIExFVkVMMiBjb21tYW5kICovCisKKwljYXNlIENTUl9TRFA6CisJCURCKERCX0lOVFIsIHByaW50aygiU0RQIikpCisJCSAgICBob3N0ZGF0YS0+c3RhdGUgPSBTX1JVTk5JTkdfTEVWRUwyOworCQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9DT01NQU5EX1BIQVNFLCAweDQxKTsKKwkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9TRUxfQVROX1hGRVIpOworCQlicmVhazsKKworCisJY2FzZSBDU1JfWEZFUl9ET05FIHwgUEhTX01FU1NfT1VUOgorCWNhc2UgQ1NSX1VORVhQIHwgUEhTX01FU1NfT1VUOgorCWNhc2UgQ1NSX1NSVl9SRVEgfCBQSFNfTUVTU19PVVQ6CisJCURCKERCX0lOVFIsIHByaW50aygiTVNHX09VVD0iKSkKKworLyogVG8gZ2V0IGhlcmUsIHdlJ3ZlIHByb2JhYmx5IHJlcXVlc3RlZCBNRVNTQUdFX09VVCBhbmQgaGF2ZQorICogYWxyZWFkeSBwdXQgdGhlIGNvcnJlY3QgYnl0ZXMgaW4gb3V0Z29pbmdfbXNnW10gYW5kIGZpbGxlZAorICogaW4gb3V0Z29pbmdfbGVuLiBXZSBzaW1wbHkgc2VuZCB0aGVtIG91dCB0byB0aGUgU0NTSSBidXMuCisgKiBTb21ldGltZXMgd2UgZ2V0IE1FU1NBR0VfT1VUIHBoYXNlIHdoZW4gd2UncmUgbm90IGV4cGVjdGluZworICogaXQgLSBsaWtlIHdoZW4gb3VyIFNEVFIgbWVzc2FnZSBpcyByZWplY3RlZCBieSBhIHRhcmdldC4gU29tZQorICogdGFyZ2V0cyBzZW5kIHRoZSBSRUpFQ1QgYmVmb3JlIHJlY2VpdmluZyBhbGwgb2YgdGhlIGV4dGVuZGVkCisgKiBtZXNzYWdlLCBhbmQgdGhlbiBzZWVtIHRvIGdvIGJhY2sgdG8gTUVTU0FHRV9PVVQgZm9yIGEgYnl0ZQorICogb3IgdHdvLiBOb3Qgc3VyZSB3aHksIG9yIGlmIEknbSBkb2luZyBzb21ldGhpbmcgd3JvbmcgdG8KKyAqIGNhdXNlIHRoaXMgdG8gaGFwcGVuLiBSZWdhcmRsZXNzLCBpdCBzZWVtcyB0aGF0IHNlbmRpbmcKKyAqIE5PUCBtZXNzYWdlcyBpbiB0aGVzZSBzaXR1YXRpb25zIHJlc3VsdHMgaW4gbm8gaGFybSBhbmQKKyAqIG1ha2VzIGV2ZXJ5b25lIGhhcHB5LgorICovCisJCSAgICBpZiAoaG9zdGRhdGEtPm91dGdvaW5nX2xlbiA9PSAwKSB7CisJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbGVuID0gMTsKKwkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMF0gPSBOT1A7CisJCX0KKwkJdHJhbnNmZXJfcGlvKGhvc3RkYXRhLT5vdXRnb2luZ19tc2csIGhvc3RkYXRhLT5vdXRnb2luZ19sZW4sIERBVEFfT1VUX0RJUiwgaG9zdGRhdGEpOworCQlEQihEQl9JTlRSLCBwcmludGsoIiUwMngiLCBob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzBdKSkKKwkJICAgIGhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSAwOworCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKKwkJYnJlYWs7CisKKworCWNhc2UgQ1NSX1VORVhQX0RJU0M6CisKKy8qIEkgdGhpbmsgSSd2ZSBzZWVuIHRoaXMgYWZ0ZXIgYSByZXF1ZXN0LXNlbnNlIHRoYXQgd2FzIGluIHJlc3BvbnNlCisgKiB0byBhbiBlcnJvciBjb25kaXRpb24sIGJ1dCBub3Qgc3VyZS4gV2UgY2VydGFpbmx5IG5lZWQgdG8gZG8KKyAqIHNvbWV0aGluZyB3aGVuIHdlIGdldCB0aGlzIGludGVycnVwdCAtIHRoZSBxdWVzdGlvbiBpcyAnd2hhdD8nLgorICogTGV0J3MgdGhpbmsgcG9zaXRpdmVseSwgYW5kIGFzc3VtZSBzb21lIGNvbW1hbmQgaGFzIGZpbmlzaGVkCisgKiBpbiBhIGxlZ2FsIG1hbm5lciAobGlrZSBhIGNvbW1hbmQgdGhhdCBwcm92b2tlcyBhIHJlcXVlc3Qtc2Vuc2UpLAorICogc28gd2UgdHJlYXQgaXQgYXMgYSBub3JtYWwgY29tbWFuZC1jb21wbGV0ZS1kaXNjb25uZWN0LgorICovCisKKworLyogTWFrZSBzdXJlIHRoYXQgcmVzZWxlY3Rpb24gaXMgZW5hYmxlZCBhdCB0aGlzIHBvaW50IC0gaXQgbWF5CisgKiBoYXZlIGJlZW4gdHVybmVkIG9mZiBmb3IgdGhlIGNvbW1hbmQgdGhhdCBqdXN0IGNvbXBsZXRlZC4KKyAqLworCisJCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX1NPVVJDRV9JRCwgU1JDSURfRVIpOworCQlpZiAoY21kID09IE5VTEwpIHsKKwkJCXByaW50aygiIC0gQWxyZWFkeSBkaXNjb25uZWN0ZWQhICIpOworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19VTkNPTk5FQ1RFRDsKKworLyogcmVsZWFzZSB0aGUgU01QIHNwaW5fbG9jayBhbmQgcmVzdG9yZSBpcnEgc3RhdGUgKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmhvc3RfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJCURCKERCX0lOVFIsIHByaW50aygiVU5FWFBfRElTQy0lbGQiLCBjbWQtPnBpZCkpCisJCSAgICBob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKwkJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmPSB+KDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfVU5DT05ORUNURUQ7CisJCWlmIChjbWQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSAmJiBjbWQtPlNDcC5TdGF0dXMgIT0gR09PRCkKKwkJCWNtZC0+cmVzdWx0ID0gKGNtZC0+cmVzdWx0ICYgMHgwMGZmZmYpIHwgKERJRF9FUlJPUiA8PCAxNik7CisJCWVsc2UKKwkJCWNtZC0+cmVzdWx0ID0gY21kLT5TQ3AuU3RhdHVzIHwgKGNtZC0+U0NwLk1lc3NhZ2UgPDwgOCk7CisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisKKy8qIFdlIGFyZSBubyBsb25nZXIgY29ubmVjdGVkIHRvIGEgdGFyZ2V0IC0gY2hlY2sgdG8gc2VlIGlmCisgKiB0aGVyZSBhcmUgY29tbWFuZHMgd2FpdGluZyB0byBiZSBleGVjdXRlZC4KKyAqLworCisJCWluMjAwMF9leGVjdXRlKGluc3RhbmNlKTsKKwkJYnJlYWs7CisKKworCWNhc2UgQ1NSX0RJU0M6CisKKy8qIE1ha2Ugc3VyZSB0aGF0IHJlc2VsZWN0aW9uIGlzIGVuYWJsZWQgYXQgdGhpcyBwb2ludCAtIGl0IG1heQorICogaGF2ZSBiZWVuIHR1cm5lZCBvZmYgZm9yIHRoZSBjb21tYW5kIHRoYXQganVzdCBjb21wbGV0ZWQuCisgKi8KKworCQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9TT1VSQ0VfSUQsIFNSQ0lEX0VSKTsKKwkJREIoREJfSU5UUiwgcHJpbnRrKCJESVNDLSVsZCIsIGNtZC0+cGlkKSkKKwkJICAgIGlmIChjbWQgPT0gTlVMTCkgeworCQkJcHJpbnRrKCIgLSBBbHJlYWR5IGRpc2Nvbm5lY3RlZCEgIik7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOworCQl9CisJCXN3aXRjaCAoaG9zdGRhdGEtPnN0YXRlKSB7CisJCWNhc2UgU19QUkVfQ01QX0RJU0M6CisJCQlob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKwkJCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19VTkNPTk5FQ1RFRDsKKwkJCURCKERCX0lOVFIsIHByaW50aygiOiVkIiwgY21kLT5TQ3AuU3RhdHVzKSkKKwkJCSAgICBpZiAoY21kLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UgJiYgY21kLT5TQ3AuU3RhdHVzICE9IEdPT0QpCisJCQkJY21kLT5yZXN1bHQgPSAoY21kLT5yZXN1bHQgJiAweDAwZmZmZikgfCAoRElEX0VSUk9SIDw8IDE2KTsKKwkJCWVsc2UKKwkJCQljbWQtPnJlc3VsdCA9IGNtZC0+U0NwLlN0YXR1cyB8IChjbWQtPlNDcC5NZXNzYWdlIDw8IDgpOworCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJCWJyZWFrOworCQljYXNlIFNfUFJFX1RNUF9ESVNDOgorCQljYXNlIFNfUlVOTklOR19MRVZFTDI6CisJCQljbWQtPmhvc3Rfc2NyaWJibGUgPSAodWNoYXIgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9ROworCQkJaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9RID0gY21kOworCQkJaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOworCisjaWZkZWYgUFJPQ19TVEFUSVNUSUNTCisJCQlob3N0ZGF0YS0+ZGlzY19kb25lX2NudFtjbWQtPmRldmljZS0+aWRdKys7CisjZW5kaWYKKworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoIioqKiBVbmV4cGVjdGVkIERJU0NPTk5FQ1QgaW50ZXJydXB0ISAqKioiKTsKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfVU5DT05ORUNURUQ7CisJCX0KKworLyogV2UgYXJlIG5vIGxvbmdlciBjb25uZWN0ZWQgdG8gYSB0YXJnZXQgLSBjaGVjayB0byBzZWUgaWYKKyAqIHRoZXJlIGFyZSBjb21tYW5kcyB3YWl0aW5nIHRvIGJlIGV4ZWN1dGVkLgorICovCisKKwkJaW4yMDAwX2V4ZWN1dGUoaW5zdGFuY2UpOworCQlicmVhazsKKworCisJY2FzZSBDU1JfUkVTRUxfQU06CisJCURCKERCX0lOVFIsIHByaW50aygiUkVTRUwiKSkKKworCQkgICAgLyogRmlyc3Qgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhpcyByZXNlbGVjdGlvbiBkaWRuJ3QgKi8KKwkJICAgIC8qIGhhcHBlbiBkdXJpbmcgQXJiaXRyYXRpb24vU2VsZWN0aW9uIG9mIHNvbWUgb3RoZXIgZGV2aWNlLiAqLworCQkgICAgLyogSWYgeWVzLCBwdXQgbG9zaW5nIGNvbW1hbmQgYmFjayBvbiB0b3Agb2YgaW5wdXRfUS4gKi8KKwkJICAgIGlmIChob3N0ZGF0YS0+bGV2ZWwyIDw9IEwyX05PTkUpIHsKKworCQkJaWYgKGhvc3RkYXRhLT5zZWxlY3RpbmcpIHsKKwkJCQljbWQgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5zZWxlY3Rpbmc7CisJCQkJaG9zdGRhdGEtPnNlbGVjdGluZyA9IE5VTEw7CisJCQkJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmPSB+KDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisJCQkJY21kLT5ob3N0X3NjcmliYmxlID0gKHVjaGFyICopIGhvc3RkYXRhLT5pbnB1dF9ROworCQkJCWhvc3RkYXRhLT5pbnB1dF9RID0gY21kOworCQkJfQorCQl9CisKKwkJZWxzZSB7CisKKwkJCWlmIChjbWQpIHsKKwkJCQlpZiAocGhzID09IDB4MDApIHsKKwkJCQkJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmPSB+KDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisJCQkJCWNtZC0+aG9zdF9zY3JpYmJsZSA9ICh1Y2hhciAqKSBob3N0ZGF0YS0+aW5wdXRfUTsKKwkJCQkJaG9zdGRhdGEtPmlucHV0X1EgPSBjbWQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRrKCItLS0lMDJ4OiUwMng6JTAyeC1UUk9VQkxFOiBJbnRydXNpdmUgUmVTZWxlY3QhLS0tIiwgYXNyLCBzciwgcGhzKTsKKwkJCQkJd2hpbGUgKDEpCisJCQkJCQlwcmludGsoIlxyIik7CisJCQkJfQorCQkJfQorCisJCX0KKworCQkvKiBPSyAtIGZpbmQgb3V0IHdoaWNoIGRldmljZSByZXNlbGVjdGVkIHVzLiAqLworCisJCWlkID0gcmVhZF8zMzkzKGhvc3RkYXRhLCBXRF9TT1VSQ0VfSUQpOworCQlpZCAmPSBTUkNJRF9NQVNLOworCisJCS8qIGFuZCBleHRyYWN0IHRoZSBsdW4gZnJvbSB0aGUgSUQgbWVzc2FnZS4gKE5vdGUgdGhhdCB3ZSBkb24ndAorCQkgKiBib3RoZXIgdG8gY2hlY2sgZm9yIGEgdmFsaWQgbWVzc2FnZSBoZXJlIC0gSSBndWVzcyB0aGlzIGlzCisJCSAqIG5vdCB0aGUgcmlnaHQgd2F5IHRvIGdvLCBidXQuLi4uKQorCQkgKi8KKworCQlsdW4gPSByZWFkXzMzOTMoaG9zdGRhdGEsIFdEX0RBVEEpOworCQlpZiAoaG9zdGRhdGEtPmxldmVsMiA8IEwyX1JFU0VMRUNUKQorCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9ORUdBVEVfQUNLKTsKKwkJbHVuICY9IDc7CisKKwkJLyogTm93IHdlIGxvb2sgZm9yIHRoZSBjb21tYW5kIHRoYXQncyByZWNvbm5lY3RpbmcuICovCisKKwkJY21kID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX1E7CisJCXBhdGNoID0gTlVMTDsKKwkJd2hpbGUgKGNtZCkgeworCQkJaWYgKGlkID09IGNtZC0+ZGV2aWNlLT5pZCAmJiBsdW4gPT0gY21kLT5kZXZpY2UtPmx1bikKKwkJCQlicmVhazsKKwkJCXBhdGNoID0gY21kOworCQkJY21kID0gKFNjc2lfQ21uZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGU7CisJCX0KKworCQkvKiBIbW0uIENvdWxkbid0IGZpbmQgYSB2YWxpZCBjb21tYW5kLi4uLiBXaGF0IHRvIGRvPyAqLworCisJCWlmICghY21kKSB7CisJCQlwcmludGsoIi0tLVRST1VCTEU6IHRhcmdldCAlZC4lZCBub3QgaW4gZGlzY29ubmVjdCBxdWV1ZS0tLSIsIGlkLCBsdW4pOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBPaywgZm91bmQgdGhlIGNvbW1hbmQgLSBub3cgc3RhcnQgaXQgdXAgYWdhaW4uICovCisKKwkJaWYgKHBhdGNoKQorCQkJcGF0Y2gtPmhvc3Rfc2NyaWJibGUgPSBjbWQtPmhvc3Rfc2NyaWJibGU7CisJCWVsc2UKKwkJCWhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfUSA9IChTY3NpX0NtbmQgKikgY21kLT5ob3N0X3NjcmliYmxlOworCQlob3N0ZGF0YS0+Y29ubmVjdGVkID0gY21kOworCisJCS8qIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgJ2luaXRpYWxpemVfU0NwKCknIG9yICdob3N0ZGF0YS0+YnVzeVtdJworCQkgKiBiZWNhdXNlIHRoZXNlIHRoaW5ncyBhcmUgcHJlc2VydmVkIG92ZXIgYSBkaXNjb25uZWN0LgorCQkgKiBCdXQgd2UgRE8gbmVlZCB0byBmaXggdGhlIERQRCBiaXQgc28gaXQncyBjb3JyZWN0IGZvciB0aGlzIGNvbW1hbmQuCisJCSAqLworCisJCWlmIChpc19kaXJfb3V0KGNtZCkpCisJCQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9ERVNUSU5BVElPTl9JRCwgY21kLT5kZXZpY2UtPmlkKTsKKwkJZWxzZQorCQkJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfREVTVElOQVRJT05fSUQsIGNtZC0+ZGV2aWNlLT5pZCB8IERTVElEX0RQRCk7CisJCWlmIChob3N0ZGF0YS0+bGV2ZWwyID49IEwyX1JFU0VMRUNUKSB7CisJCQl3cml0ZV8zMzkzX2NvdW50KGhvc3RkYXRhLCAwKTsJLyogd2Ugd2FudCBhIERBVEFfUEhBU0UgaW50ZXJydXB0ICovCisJCQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9DT01NQU5EX1BIQVNFLCAweDQ1KTsKKwkJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfU0VMX0FUTl9YRkVSKTsKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfUlVOTklOR19MRVZFTDI7CisJCX0gZWxzZQorCQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7CisKKwkJREIoREJfSU5UUiwgcHJpbnRrKCItJWxkIiwgY21kLT5waWQpKQorCQkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoIi0tVU5LTk9XTiBJTlRFUlJVUFQ6JTAyeDolMDJ4OiUwMngtLSIsIGFzciwgc3IsIHBocyk7CisJfQorCisJd3JpdGUxX2lvKDAsIElPX0xFRF9PRkYpOworCisJREIoREJfSU5UUiwgcHJpbnRrKCJ9ICIpKQorCisvKiByZWxlYXNlIHRoZSBTTVAgc3Bpbl9sb2NrIGFuZCByZXN0b3JlIGlycSBzdGF0ZSAqLworCSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworCisjZGVmaW5lIFJFU0VUX0NBUkQgICAgICAgICAwCisjZGVmaW5lIFJFU0VUX0NBUkRfQU5EX0JVUyAxCisjZGVmaW5lIEJfRkxBRyAweDgwCisKKy8qCisgKglDYWxsZXIgbXVzdCBob2xkIGluc3RhbmNlIGxvY2shCisgKi8KKworc3RhdGljIGludCByZXNldF9oYXJkd2FyZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgaW50IHR5cGUpCit7CisJc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisJaW50IHF0LCB4OworCisJaG9zdGRhdGEgPSAoc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisKKwl3cml0ZTFfaW8oMCwgSU9fTEVEX09OKTsKKwlpZiAodHlwZSA9PSBSRVNFVF9DQVJEX0FORF9CVVMpIHsKKwkJd3JpdGUxX2lvKDAsIElPX0NBUkRfUkVTRVQpOworCQl4ID0gcmVhZDFfaW8oSU9fSEFSRFdBUkUpOworCX0KKwl4ID0gcmVhZF8zMzkzKGhvc3RkYXRhLCBXRF9TQ1NJX1NUQVRVUyk7CS8qIGNsZWFyIGFueSBXRCBpbnRycHQgKi8KKwl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9PV05fSUQsIGluc3RhbmNlLT50aGlzX2lkIHwgT1dOSURfRUFGIHwgT1dOSURfUkFGIHwgT1dOSURfRlNfOCk7CisJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfQ09OVFJPTCwgQ1RSTF9JREkgfCBDVFJMX0VESSB8IENUUkxfUE9MTEVEKTsKKwl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9TWU5DSFJPTk9VU19UUkFOU0ZFUiwgY2FsY19zeW5jX3hmZXIoaG9zdGRhdGEtPmRlZmF1bHRfc3hfcGVyIC8gNCwgREVGQVVMVF9TWF9PRkYpKTsKKworCXdyaXRlMV9pbygwLCBJT19GSUZPX1dSSVRFKTsJLyogY2xlYXIgZmlmbyBjb3VudGVyICovCisJd3JpdGUxX2lvKDAsIElPX0ZJRk9fUkVBRCk7CS8qIHN0YXJ0IGZpZm8gb3V0IGluIHJlYWQgbW9kZSAqLworCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0NPTU1BTkQsIFdEX0NNRF9SRVNFVCk7CisJLyogRklYTUU6IHRpbWVvdXQgPz8gKi8KKwl3aGlsZSAoIShSRUFEX0FVWF9TVEFUKCkgJiBBU1JfSU5UKSkKKwkJY3B1X3JlbGF4KCk7CS8qIHdhaXQgZm9yIFJFU0VUIHRvIGNvbXBsZXRlICovCisKKwl4ID0gcmVhZF8zMzkzKGhvc3RkYXRhLCBXRF9TQ1NJX1NUQVRVUyk7CS8qIGNsZWFyIGludGVycnVwdCAqLworCisJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfUVVFVUVfVEFHLCAweGE1KTsJLyogYW55IHJhbmRvbSBudW1iZXIgKi8KKwlxdCA9IHJlYWRfMzM5Myhob3N0ZGF0YSwgV0RfUVVFVUVfVEFHKTsKKwlpZiAocXQgPT0gMHhhNSkgeworCQl4IHw9IEJfRkxBRzsKKwkJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfUVVFVUVfVEFHLCAwKTsKKwl9CisJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfVElNRU9VVF9QRVJJT0QsIFRJTUVPVVRfUEVSSU9EX1ZBTFVFKTsKKwl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9DT05UUk9MLCBDVFJMX0lESSB8IENUUkxfRURJIHwgQ1RSTF9QT0xMRUQpOworCXdyaXRlMV9pbygwLCBJT19MRURfT0ZGKTsKKwlyZXR1cm4geDsKK30KKworCisKK3N0YXRpYyBpbnQgaW4yMDAwX2J1c19yZXNldChTY3NpX0NtbmQgKiBjbWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7CisJc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisJaW50IHg7CisKKwlpbnN0YW5jZSA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCWhvc3RkYXRhID0gKHN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKikgaW5zdGFuY2UtPmhvc3RkYXRhOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkOiBSZXNldC4gIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCisJLyogZG8gc2NzaS1yZXNldCBoZXJlICovCisKKwlyZXNldF9oYXJkd2FyZShpbnN0YW5jZSwgUkVTRVRfQ0FSRF9BTkRfQlVTKTsKKwlmb3IgKHggPSAwOyB4IDwgODsgeCsrKSB7CisJCWhvc3RkYXRhLT5idXN5W3hdID0gMDsKKwkJaG9zdGRhdGEtPnN5bmNfeGZlclt4XSA9IGNhbGNfc3luY194ZmVyKERFRkFVTFRfU1hfUEVSIC8gNCwgREVGQVVMVF9TWF9PRkYpOworCQlob3N0ZGF0YS0+c3luY19zdGF0W3hdID0gU1NfVU5TRVQ7CS8qIHVzaW5nIGRlZmF1bHQgc3luYyB2YWx1ZXMgKi8KKwl9CisJaG9zdGRhdGEtPmlucHV0X1EgPSBOVUxMOworCWhvc3RkYXRhLT5zZWxlY3RpbmcgPSBOVUxMOworCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCWhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfUSA9IE5VTEw7CisJaG9zdGRhdGEtPnN0YXRlID0gU19VTkNPTk5FQ1RFRDsKKwlob3N0ZGF0YS0+ZmlmbyA9IEZJX0ZJRk9fVU5VU0VEOworCWhvc3RkYXRhLT5pbmNvbWluZ19wdHIgPSAwOworCWhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSAwOworCisJY21kLT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgaW4yMDAwX2hvc3RfcmVzZXQoU2NzaV9DbW5kICogY21kKQoreworCXJldHVybiBGQUlMRUQ7Cit9CisKK3N0YXRpYyBpbnQgaW4yMDAwX2RldmljZV9yZXNldChTY3NpX0NtbmQgKiBjbWQpCit7CisJcmV0dXJuIEZBSUxFRDsKK30KKworCitzdGF0aWMgaW50IGluMjAwMF9hYm9ydChTY3NpX0NtbmQgKiBjbWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7CisJc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisJU2NzaV9DbW5kICp0bXAsICpwcmV2OworCXVjaGFyIHNyLCBhc3I7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJaW5zdGFuY2UgPSBjbWQtPmRldmljZS0+aG9zdDsKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKKworCXByaW50ayhLRVJOX0RFQlVHICJzY3NpJWQ6IEFib3J0LSIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwlwcmludGsoIihhc3I9JTAyeCxjb3VudD0lbGQscmVzaWQ9JWQsYnVmX3Jlc2lkPSVkLGhhdmVfZGF0YT0lZCxGQz0lMDJ4KS0gIiwgUkVBRF9BVVhfU1RBVCgpLCByZWFkXzMzOTNfY291bnQoaG9zdGRhdGEpLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsLCBjbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsLCBjbWQtPlNDcC5oYXZlX2RhdGFfaW4sIHJlYWQxX2lvKElPX0ZJRk9fQ09VTlQpKTsKKworLyoKKyAqIENhc2UgMSA6IElmIHRoZSBjb21tYW5kIGhhc24ndCBiZWVuIGlzc3VlZCB5ZXQsIHdlIHNpbXBseSByZW1vdmUgaXQKKyAqICAgICBmcm9tIHRoZSBpbm91dF9RLgorICovCisKKwl0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pbnB1dF9ROworCXByZXYgPSBOVUxMOworCXdoaWxlICh0bXApIHsKKwkJaWYgKHRtcCA9PSBjbWQpIHsKKwkJCWlmIChwcmV2KQorCQkJCXByZXYtPmhvc3Rfc2NyaWJibGUgPSBjbWQtPmhvc3Rfc2NyaWJibGU7CisJCQljbWQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCQkJY21kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQ6IEFib3J0IC0gcmVtb3ZpbmcgY29tbWFuZCAlbGQgZnJvbSBpbnB1dF9RLiAiLCBpbnN0YW5jZS0+aG9zdF9ubywgY21kLT5waWQpOworCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJCXJldHVybiBTVUNDRVNTOworCQl9CisJCXByZXYgPSB0bXA7CisJCXRtcCA9IChTY3NpX0NtbmQgKikgdG1wLT5ob3N0X3NjcmliYmxlOworCX0KKworLyoKKyAqIENhc2UgMiA6IElmIHRoZSBjb21tYW5kIGlzIGNvbm5lY3RlZCwgd2UncmUgZ29pbmcgdG8gZmFpbCB0aGUgYWJvcnQKKyAqICAgICBhbmQgbGV0IHRoZSBoaWdoIGxldmVsIFNDU0kgZHJpdmVyIHJldHJ5IGF0IGEgbGF0ZXIgdGltZSBvcgorICogICAgIGlzc3VlIGEgcmVzZXQuCisgKgorICogICAgIFRpbWVvdXRzLCBhbmQgdGhlcmVmb3JlIGFib3J0ZWQgY29tbWFuZHMsIHdpbGwgYmUgaGlnaGx5IHVubGlrZWx5CisgKiAgICAgYW5kIGhhbmRsaW5nIHRoZW0gY2xlYW5seSBpbiB0aGlzIHNpdHVhdGlvbiB3b3VsZCBtYWtlIHRoZSBjb21tb24KKyAqICAgICBjYXNlIG9mIG5vcmVzZXRzIGxlc3MgZWZmaWNpZW50LCBhbmQgd291bGQgcG9sbHV0ZSBvdXIgY29kZS4gIFNvLAorICogICAgIHdlIGZhaWwuCisgKi8KKworCWlmIChob3N0ZGF0YS0+Y29ubmVjdGVkID09IGNtZCkgeworCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZDogQWJvcnRpbmcgY29ubmVjdGVkIGNvbW1hbmQgJWxkIC0gIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIGNtZC0+cGlkKTsKKworCQlwcmludGsoInNlbmRpbmcgd2QzM2M5MyBBQk9SVCBjb21tYW5kIC0gIik7CisJCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0NPTlRST0wsIENUUkxfSURJIHwgQ1RSTF9FREkgfCBDVFJMX1BPTExFRCk7CisJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfQUJPUlQpOworCisvKiBOb3cgd2UgaGF2ZSB0byBhdHRlbXB0IHRvIGZsdXNoIG91dCB0aGUgRklGTy4uLiAqLworCisJCXByaW50aygiZmx1c2hpbmcgZmlmbyAtICIpOworCQl0aW1lb3V0ID0gMTAwMDAwMDsKKwkJZG8geworCQkJYXNyID0gUkVBRF9BVVhfU1RBVCgpOworCQkJaWYgKGFzciAmIEFTUl9EQlIpCisJCQkJcmVhZF8zMzkzKGhvc3RkYXRhLCBXRF9EQVRBKTsKKwkJfSB3aGlsZSAoIShhc3IgJiBBU1JfSU5UKSAmJiB0aW1lb3V0LS0gPiAwKTsKKwkJc3IgPSByZWFkXzMzOTMoaG9zdGRhdGEsIFdEX1NDU0lfU1RBVFVTKTsKKwkJcHJpbnRrKCJhc3I9JTAyeCwgc3I9JTAyeCwgJWxkIGJ5dGVzIHVuLXRyYW5zZmVycmVkICh0aW1lb3V0PSVsZCkgLSAiLCBhc3IsIHNyLCByZWFkXzMzOTNfY291bnQoaG9zdGRhdGEpLCB0aW1lb3V0KTsKKworCQkvKgorCQkgKiBBYm9ydCBjb21tYW5kIHByb2Nlc3NlZC4KKwkJICogU3RpbGwgY29ubmVjdGVkLgorCQkgKiBXZSBtdXN0IGRpc2Nvbm5lY3QuCisJCSAqLworCisJCXByaW50aygic2VuZGluZyB3ZDMzYzkzIERJU0NPTk5FQ1QgY29tbWFuZCAtICIpOworCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX0RJU0NPTk5FQ1QpOworCisJCXRpbWVvdXQgPSAxMDAwMDAwOworCQlhc3IgPSBSRUFEX0FVWF9TVEFUKCk7CisJCXdoaWxlICgoYXNyICYgQVNSX0NJUCkgJiYgdGltZW91dC0tID4gMCkKKwkJCWFzciA9IFJFQURfQVVYX1NUQVQoKTsKKwkJc3IgPSByZWFkXzMzOTMoaG9zdGRhdGEsIFdEX1NDU0lfU1RBVFVTKTsKKwkJcHJpbnRrKCJhc3I9JTAyeCwgc3I9JTAyeC4iLCBhc3IsIHNyKTsKKworCQlob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKwkJaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfVU5DT05ORUNURUQ7CisJCWNtZC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworCQljbWQtPnNjc2lfZG9uZShjbWQpOworCisJCWluMjAwMF9leGVjdXRlKGluc3RhbmNlKTsKKworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisKKy8qCisgKiBDYXNlIDM6IElmIHRoZSBjb21tYW5kIGlzIGN1cnJlbnRseSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgYnVzLAorICogd2UncmUgbm90IGdvaW5nIHRvIGV4cGVuZCBtdWNoIGVmZm9ydCBoZXJlOiBMZXQncyBqdXN0IHJldHVybgorICogYW4gQUJPUlRfU05PT1pFIGFuZCBob3BlIGZvciB0aGUgYmVzdC4uLgorICovCisKKwlmb3IgKHRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9ROyB0bXA7IHRtcCA9IChTY3NpX0NtbmQgKikgdG1wLT5ob3N0X3NjcmliYmxlKQorCQlpZiAoY21kID09IHRtcCkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInNjc2klZDogdW5hYmxlIHRvIGFib3J0IGRpc2Nvbm5lY3RlZCBjb21tYW5kLlxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCQkJcmV0dXJuIEZBSUxFRDsKKwkJfQorCisvKgorICogQ2FzZSA0IDogSWYgd2UgcmVhY2hlZCB0aGlzIHBvaW50LCB0aGUgY29tbWFuZCB3YXMgbm90IGZvdW5kIGluIGFueSBvZgorICogICAgIHRoZSBxdWV1ZXMuCisgKgorICogV2UgcHJvYmFibHkgcmVhY2hlZCB0aGlzIHBvaW50IGJlY2F1c2Ugb2YgYW4gdW5saWtlbHkgcmFjZSBjb25kaXRpb24KKyAqIGJldHdlZW4gdGhlIGNvbW1hbmQgY29tcGxldGluZyBzdWNjZXNzZnVsbHkgYW5kIHRoZSBhYm9ydGlvbiBjb2RlLAorICogc28gd2Ugd29uJ3QgcGFuaWMsIGJ1dCB3ZSB3aWxsIG5vdGlmeSB0aGUgdXNlciBpbiBjYXNlIHNvbWV0aGluZyByZWFsbHkKKyAqIGJyb2tlLgorICovCisKKwlpbjIwMDBfZXhlY3V0ZShpbnN0YW5jZSk7CisKKwlwcmludGsoInNjc2klZDogd2FybmluZyA6IFNDU0kgY29tbWFuZCBwcm9iYWJseSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IiAiICAgICAgICAgYmVmb3JlIGFib3J0aW9uLiAiLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKworCisjZGVmaW5lIE1BWF9JTjIwMDBfSE9TVFMgMworI2RlZmluZSBNQVhfU0VUVVBfQVJHUyAoc2l6ZW9mKHNldHVwX2FyZ3MpIC8gc2l6ZW9mKGNoYXIgKikpCisjZGVmaW5lIFNFVFVQX0JVRkZFUl9TSVpFIDIwMAorc3RhdGljIGNoYXIgc2V0dXBfYnVmZmVyW1NFVFVQX0JVRkZFUl9TSVpFXTsKK3N0YXRpYyBjaGFyIHNldHVwX3VzZWRbTUFYX1NFVFVQX0FSR1NdOworc3RhdGljIGludCBkb25lX3NldHVwID0gMDsKKworc3RhdGljIHZvaWQgX19pbml0IGluMjAwMF9zZXR1cChjaGFyICpzdHIsIGludCAqaW50cykKK3sKKwlpbnQgaTsKKwljaGFyICpwMSwgKnAyOworCisJc3RybGNweShzZXR1cF9idWZmZXIsIHN0ciwgU0VUVVBfQlVGRkVSX1NJWkUpOworCXAxID0gc2V0dXBfYnVmZmVyOworCWkgPSAwOworCXdoaWxlICgqcDEgJiYgKGkgPCBNQVhfU0VUVVBfQVJHUykpIHsKKwkJcDIgPSBzdHJjaHIocDEsICcsJyk7CisJCWlmIChwMikgeworCQkJKnAyID0gJ1wwJzsKKwkJCWlmIChwMSAhPSBwMikKKwkJCQlzZXR1cF9hcmdzW2ldID0gcDE7CisJCQlwMSA9IHAyICsgMTsKKwkJCWkrKzsKKwkJfSBlbHNlIHsKKwkJCXNldHVwX2FyZ3NbaV0gPSBwMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfU0VUVVBfQVJHUzsgaSsrKQorCQlzZXR1cF91c2VkW2ldID0gMDsKKwlkb25lX3NldHVwID0gMTsKK30KKworCisvKiBjaGVja19zZXR1cF9hcmdzKCkgcmV0dXJucyBpbmRleCBpZiBrZXkgZm91bmQsIDAgaWYgbm90CisgKi8KKworc3RhdGljIGludCBfX2luaXQgY2hlY2tfc2V0dXBfYXJncyhjaGFyICprZXksIGludCAqdmFsLCBjaGFyICpidWYpCit7CisJaW50IHg7CisJY2hhciAqY3A7CisKKwlmb3IgKHggPSAwOyB4IDwgTUFYX1NFVFVQX0FSR1M7IHgrKykgeworCQlpZiAoc2V0dXBfdXNlZFt4XSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXN0cm5jbXAoc2V0dXBfYXJnc1t4XSwga2V5LCBzdHJsZW4oa2V5KSkpCisJCQlicmVhazsKKwl9CisJaWYgKHggPT0gTUFYX1NFVFVQX0FSR1MpCisJCXJldHVybiAwOworCXNldHVwX3VzZWRbeF0gPSAxOworCWNwID0gc2V0dXBfYXJnc1t4XSArIHN0cmxlbihrZXkpOworCSp2YWwgPSAtMTsKKwlpZiAoKmNwICE9ICc6JykKKwkJcmV0dXJuICsreDsKKwljcCsrOworCWlmICgoKmNwID49ICcwJykgJiYgKCpjcCA8PSAnOScpKSB7CisJCSp2YWwgPSBzaW1wbGVfc3RydG91bChjcCwgTlVMTCwgMCk7CisJfQorCXJldHVybiArK3g7Cit9CisKKworCisvKiBUaGUgImNvcnJlY3QiIChpZSBwb3J0YWJsZSkgd2F5IHRvIGFjY2VzcyBtZW1vcnktbWFwcGVkIGhhcmR3YXJlCisgKiBzdWNoIGFzIHRoZSBJTjIwMDAgRVBST00gYW5kIGRpcCBzd2l0Y2ggaXMgdGhyb3VnaCB0aGUgdXNlIG9mCisgKiBzcGVjaWFsIG1hY3JvcyBkZWNsYXJlZCBpbiAnYXNtL2lvLmgnLiBXZSB1c2UgcmVhZGIoKSBhbmQgcmVhZGwoKQorICogd2hlbiByZWFkaW5nIGZyb20gdGhlIGNhcmQncyBCSU9TIGFyZWEgaW4gaW4yMDAwX2RldGVjdCgpLgorICovCitzdGF0aWMgdTMyIGJpb3NfdGFiW10gaW4yMDAwX19JTklUREFUQSA9IHsKKwkweGM4MDAwLAorCTB4ZDAwMDAsCisJMHhkODAwMCwKKwkwCit9OworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmFzZV90YWJbXSBpbjIwMDBfX0lOSVREQVRBID0geworCTB4MjIwLAorCTB4MjAwLAorCTB4MTEwLAorCTB4MTAwLAorfTsKKworc3RhdGljIGludCBpbnRfdGFiW10gaW4yMDAwX19JTklUREFUQSA9IHsKKwkxNSwKKwkxNCwKKwkxMSwKKwkxMAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpbjIwMDBfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqIHRwbnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7CisJc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisJaW50IGRldGVjdF9jb3VudDsKKwlpbnQgYmlvczsKKwlpbnQgeDsKKwl1bnNpZ25lZCBzaG9ydCBiYXNlOworCXVjaGFyIHN3aXRjaGVzOworCXVjaGFyIGhyZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdmFsOworCWNoYXIgYnVmWzMyXTsKKworLyogVGhhbmtzIHRvIGhlbHAgZnJvbSBCaWxsIEVhcm5lc3QsIHByb2JpbmcgZm9yIElOMjAwMCBjYXJkcyBpcyBhCisgKiBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkIGFuZCBmb29sLXByb29mIG9wZXJhdGlvbi4gVGhlcmUgYXJlIDMKKyAqIHBvc3NpYmxlIGxvY2F0aW9ucyBmb3IgdGhlIElOMjAwMCBFUFJPTSBpbiBtZW1vcnkgc3BhY2UgLSBpZiB3ZQorICogZmluZCBhIEJJT1Mgc2lnbmF0dXJlLCB3ZSBjYW4gcmVhZCB0aGUgZGlwIHN3aXRjaCBzZXR0aW5ncyBmcm9tCisgKiB0aGUgYnl0ZSBhdCBCSU9TKzMyIChzaGFkb3dlZCBpbiBieSBsb2dpYyBvbiB0aGUgY2FyZCkuIEZyb20gMgorICogb2YgdGhlIHN3aXRjaCBiaXRzIHdlIGdldCB0aGUgY2FyZCdzIGFkZHJlc3MgaW4gSU8gc3BhY2UuIFRoZXJlJ3MKKyAqIGFuIGltYWdlIG9mIHRoZSBkaXAgc3dpdGNoIHRoZXJlLCBhbHNvLCBzbyB3ZSBoYXZlIGEgd2F5IHRvIGJhY2stCisgKiBjaGVjayB0aGF0IHRoaXMgcmVhbGx5IGlzIGFuIElOMjAwMCBjYXJkLiBWZXJ5IG5pZnR5LiBVc2UgdGhlCisgKiAnaW9wb3J0Onh4JyBjb21tYW5kLWxpbmUgcGFyYW1ldGVyIGlmIHlvdXIgQklPUyBFUFJPTSBpcyBhYnNlbnQKKyAqIG9yIGRpc2FibGVkLgorICovCisKKwlpZiAoIWRvbmVfc2V0dXAgJiYgc2V0dXBfc3RyaW5ncykKKwkJaW4yMDAwX3NldHVwKHNldHVwX3N0cmluZ3MsIE5VTEwpOworCisJZGV0ZWN0X2NvdW50ID0gMDsKKwlmb3IgKGJpb3MgPSAwOyBiaW9zX3RhYltiaW9zXTsgYmlvcysrKSB7CisJCWlmIChjaGVja19zZXR1cF9hcmdzKCJpb3BvcnQiLCAmdmFsLCBidWYpKSB7CisJCQliYXNlID0gdmFsOworCQkJc3dpdGNoZXMgPSB+aW5iKGJhc2UgKyBJT19TV0lUQ0hFUykgJiAweGZmOworCQkJcHJpbnRrKCJGb3JjaW5nIElOMjAwMCBkZXRlY3Rpb24gYXQgSU9wb3J0IDB4JXggIiwgYmFzZSk7CisJCQliaW9zID0gMjsKKwkJfQorLyoKKyAqIFRoZXJlIGhhdmUgYmVlbiBhIGNvdXBsZSBvZiBCSU9TIHZlcnNpb25zIHdpdGggZGlmZmVyZW50IGxheW91dHMKKyAqIGZvciB0aGUgb2J2aW91cyBJRCBzdHJpbmdzLiBXZSBsb29rIGZvciB0aGUgMiBtb3N0IGNvbW1vbiBvbmVzIGFuZAorICogaG9wZSB0aGF0IHRoZXkgY292ZXIgYWxsIHRoZSBjYXNlcy4uLgorICovCisJCWVsc2UgaWYgKGlzYV9yZWFkbChiaW9zX3RhYltiaW9zXSArIDB4MTApID09IDB4NDE1NjRmNGUgfHwgaXNhX3JlYWRsKGJpb3NfdGFiW2Jpb3NdICsgMHgzMCkgPT0gMHg2MTc3NmM0MSkgeworCQkJcHJpbnRrKCJGb3VuZCBJTjIwMDAgQklPUyBhdCAweCV4ICIsICh1bnNpZ25lZCBpbnQpIGJpb3NfdGFiW2Jpb3NdKTsKKworLyogUmVhZCB0aGUgc3dpdGNoIGltYWdlIHRoYXQncyBtYXBwZWQgaW50byBFUFJPTSBzcGFjZSAqLworCisJCQlzd2l0Y2hlcyA9IH4oKGlzYV9yZWFkYihiaW9zX3RhYltiaW9zXSArIDB4MjApICYgMHhmZikpOworCisvKiBGaW5kIG91dCB3aGVyZSB0aGUgSU8gc3BhY2UgaXMgKi8KKworCQkJeCA9IHN3aXRjaGVzICYgKFNXX0FERFIwIHwgU1dfQUREUjEpOworCQkJYmFzZSA9IGJhc2VfdGFiW3hdOworCisvKiBDaGVjayBmb3IgdGhlIElOMjAwMCBzaWduYXR1cmUgaW4gSU8gc3BhY2UuICovCisKKwkJCXggPSB+aW5iKGJhc2UgKyBJT19TV0lUQ0hFUykgJiAweGZmOworCQkJaWYgKHggIT0gc3dpdGNoZXMpIHsKKwkJCQlwcmludGsoIkJhZCBJTyBzaWduYXR1cmU6ICUwMnggdnMgJTAyeC5cbiIsIHgsIHN3aXRjaGVzKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSBlbHNlCisJCQljb250aW51ZTsKKworLyogT0suIFdlIGhhdmUgYSBiYXNlIGFkZHJlc3MgZm9yIHRoZSBJTyBwb3J0cyAtIHJ1biBhIGZldyBzYWZldHkgY2hlY2tzICovCisKKwkJaWYgKCEoc3dpdGNoZXMgJiBTV19CSVQ3KSkgewkvKiBJIF90aGlua18gYWxsIGNhcmRzIGRvIHRoaXMgKi8KKwkJCXByaW50aygiVGhlcmUgaXMgbm8gSU4tMjAwMCBTQ1NJIGNhcmQgYXQgSU9wb3J0IDB4JTAzeCFcbiIsIGJhc2UpOworCQkJY29udGludWU7CisJCX0KKworLyogTGV0J3MgYXNzdW1lIGFueSBoYXJkd2FyZSB2ZXJzaW9uIHdpbGwgd29yaywgYWx0aG91Z2ggdGhlIGRyaXZlcgorICogaGFzIG9ubHkgYmVlbiB0ZXN0ZWQgb24gMHgyMSwgMHgyMiwgMHgyNSwgMHgyNiwgYW5kIDB4MjcuIFdlJ2xsCisgKiBwcmludCBvdXQgdGhlIHJldiBudW1iZXIgZm9yIHJlZmVyZW5jZSBsYXRlciwgYnV0IGFjY2VwdCB0aGVtIGFsbC4KKyAqLworCisJCWhyZXYgPSBpbmIoYmFzZSArIElPX0hBUkRXQVJFKTsKKworCQkvKiBCaXQgMiB0ZWxscyB1cyBpZiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCAqLworCQlpZiAoc3dpdGNoZXMgJiBTV19ESVNJTlQpIHsKKwkJCXByaW50aygiVGhlIElOLTIwMDAgU0NTSSBjYXJkIGF0IElPcG9ydCAweCUwM3ggIiwgYmFzZSk7CisJCQlwcmludGsoImlzIG5vdCBjb25maWd1cmVkIGZvciBpbnRlcnJ1cHQgb3BlcmF0aW9uIVxuIik7CisJCQlwcmludGsoIlRoaXMgZHJpdmVyIHJlcXVpcmVzIGFuIGludGVycnVwdDogY2FuY2VsbGluZyBkZXRlY3Rpb24uXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKy8qIE9rLiBXZSBhY2NlcHQgdGhhdCB0aGVyZSdzIGFuIElOMjAwMCBhdCBpb2FkZHIgJ2Jhc2UnLiBOb3cKKyAqIGluaXRpYWxpemUgaXQuCisgKi8KKworCQl0cG50LT5wcm9jX25hbWUgPSAiaW4yMDAwIjsKKwkJaW5zdGFuY2UgPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIHNpemVvZihzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhKSk7CisJCWlmIChpbnN0YW5jZSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWRldGVjdF9jb3VudCsrOworCQlob3N0ZGF0YSA9IChzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKKwkJaW5zdGFuY2UtPmlvX3BvcnQgPSBob3N0ZGF0YS0+aW9fYmFzZSA9IGJhc2U7CisJCWhvc3RkYXRhLT5kaXBfc3dpdGNoID0gc3dpdGNoZXM7CisJCWhvc3RkYXRhLT5ocmV2ID0gaHJldjsKKworCQl3cml0ZTFfaW8oMCwgSU9fRklGT19XUklURSk7CS8qIGNsZWFyIGZpZm8gY291bnRlciAqLworCQl3cml0ZTFfaW8oMCwgSU9fRklGT19SRUFEKTsJLyogc3RhcnQgZmlmbyBvdXQgaW4gcmVhZCBtb2RlICovCisJCXdyaXRlMV9pbygwLCBJT19JTlRSX01BU0spOwkvKiBhbGxvdyBhbGwgaW50cyAqLworCQl4ID0gaW50X3RhYlsoc3dpdGNoZXMgJiAoU1dfSU5UMCB8IFNXX0lOVDEpKSA+PiBTV19JTlRfU0hJRlRdOworCQlpZiAocmVxdWVzdF9pcnEoeCwgaW4yMDAwX2ludHIsIFNBX0lOVEVSUlVQVCwgImluMjAwMCIsIGluc3RhbmNlKSkgeworCQkJcHJpbnRrKCJpbjIwMDBfZGV0ZWN0OiBVbmFibGUgdG8gYWxsb2NhdGUgSVJRLlxuIik7CisJCQlkZXRlY3RfY291bnQtLTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWluc3RhbmNlLT5pcnEgPSB4OworCQlpbnN0YW5jZS0+bl9pb19wb3J0ID0gMTM7CisJCXJlcXVlc3RfcmVnaW9uKGJhc2UsIDEzLCAiaW4yMDAwIik7CS8qIGxvY2sgaW4gdGhpcyBJTyBzcGFjZSBmb3Igb3VyIHVzZSAqLworCisJCWZvciAoeCA9IDA7IHggPCA4OyB4KyspIHsKKwkJCWhvc3RkYXRhLT5idXN5W3hdID0gMDsKKwkJCWhvc3RkYXRhLT5zeW5jX3hmZXJbeF0gPSBjYWxjX3N5bmNfeGZlcihERUZBVUxUX1NYX1BFUiAvIDQsIERFRkFVTFRfU1hfT0ZGKTsKKwkJCWhvc3RkYXRhLT5zeW5jX3N0YXRbeF0gPSBTU19VTlNFVDsJLyogdXNpbmcgZGVmYXVsdCBzeW5jIHZhbHVlcyAqLworI2lmZGVmIFBST0NfU1RBVElTVElDUworCQkJaG9zdGRhdGEtPmNtZF9jbnRbeF0gPSAwOworCQkJaG9zdGRhdGEtPmRpc2NfYWxsb3dlZF9jbnRbeF0gPSAwOworCQkJaG9zdGRhdGEtPmRpc2NfZG9uZV9jbnRbeF0gPSAwOworI2VuZGlmCisJCX0KKwkJaG9zdGRhdGEtPmlucHV0X1EgPSBOVUxMOworCQlob3N0ZGF0YS0+c2VsZWN0aW5nID0gTlVMTDsKKwkJaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisJCWhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfUSA9IE5VTEw7CisJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfVU5DT05ORUNURUQ7CisJCWhvc3RkYXRhLT5maWZvID0gRklfRklGT19VTlVTRUQ7CisJCWhvc3RkYXRhLT5sZXZlbDIgPSBMMl9CQVNJQzsKKwkJaG9zdGRhdGEtPmRpc2Nvbm5lY3QgPSBESVNfQURBUFRJVkU7CisJCWhvc3RkYXRhLT5hcmdzID0gREVCVUdfREVGQVVMVFM7CisJCWhvc3RkYXRhLT5pbmNvbWluZ19wdHIgPSAwOworCQlob3N0ZGF0YS0+b3V0Z29pbmdfbGVuID0gMDsKKwkJaG9zdGRhdGEtPmRlZmF1bHRfc3hfcGVyID0gREVGQVVMVF9TWF9QRVI7CisKKy8qIE9sZGVyIEJJT1MncyBoYWQgYSAnc3luYyBvbi9vZmYnIHN3aXRjaCAtIHVzZSBpdHMgc2V0dGluZyAqLworCisJCWlmIChpc2FfcmVhZGwoYmlvc190YWJbYmlvc10gKyAweDEwKSA9PSAweDQxNTY0ZjRlICYmIChzd2l0Y2hlcyAmIFNXX1NZTkNfRE9TNSkpCisJCQlob3N0ZGF0YS0+c3luY19vZmYgPSAweDAwOwkvKiBzeW5jIGRlZmF1bHRzIHRvIG9uICovCisJCWVsc2UKKwkJCWhvc3RkYXRhLT5zeW5jX29mZiA9IDB4ZmY7CS8qIHN5bmMgZGVmYXVsdHMgdG8gb2ZmICovCisKKyNpZmRlZiBQUk9DX0lOVEVSRkFDRQorCQlob3N0ZGF0YS0+cHJvYyA9IFBSX1ZFUlNJT04gfCBQUl9JTkZPIHwgUFJfU1RBVElTVElDUyB8IFBSX0NPTk5FQ1RFRCB8IFBSX0lOUFVUUSB8IFBSX0RJU0NRIHwgUFJfU1RPUDsKKyNpZmRlZiBQUk9DX1NUQVRJU1RJQ1MKKwkJaG9zdGRhdGEtPmludF9jbnQgPSAwOworI2VuZGlmCisjZW5kaWYKKworCQlpZiAoY2hlY2tfc2V0dXBfYXJncygibm9zeW5jIiwgJnZhbCwgYnVmKSkKKwkJCWhvc3RkYXRhLT5zeW5jX29mZiA9IHZhbDsKKworCQlpZiAoY2hlY2tfc2V0dXBfYXJncygicGVyaW9kIiwgJnZhbCwgYnVmKSkKKwkJCWhvc3RkYXRhLT5kZWZhdWx0X3N4X3BlciA9IHN4X3RhYmxlW3JvdW5kX3BlcmlvZCgodW5zaWduZWQgaW50KSB2YWwpXS5wZXJpb2RfbnM7CisKKwkJaWYgKGNoZWNrX3NldHVwX2FyZ3MoImRpc2Nvbm5lY3QiLCAmdmFsLCBidWYpKSB7CisJCQlpZiAoKHZhbCA+PSBESVNfTkVWRVIpICYmICh2YWwgPD0gRElTX0FMV0FZUykpCisJCQkJaG9zdGRhdGEtPmRpc2Nvbm5lY3QgPSB2YWw7CisJCQllbHNlCisJCQkJaG9zdGRhdGEtPmRpc2Nvbm5lY3QgPSBESVNfQURBUFRJVkU7CisJCX0KKworCQlpZiAoY2hlY2tfc2V0dXBfYXJncygibm9yZXNldCIsICZ2YWwsIGJ1ZikpCisJCQlob3N0ZGF0YS0+YXJncyBePSBBX05PX1NDU0lfUkVTRVQ7CisKKwkJaWYgKGNoZWNrX3NldHVwX2FyZ3MoImxldmVsMiIsICZ2YWwsIGJ1ZikpCisJCQlob3N0ZGF0YS0+bGV2ZWwyID0gdmFsOworCisJCWlmIChjaGVja19zZXR1cF9hcmdzKCJkZWJ1ZyIsICZ2YWwsIGJ1ZikpCisJCQlob3N0ZGF0YS0+YXJncyA9ICh2YWwgJiBEQl9NQVNLKTsKKworI2lmZGVmIFBST0NfSU5URVJGQUNFCisJCWlmIChjaGVja19zZXR1cF9hcmdzKCJwcm9jIiwgJnZhbCwgYnVmKSkKKwkJCWhvc3RkYXRhLT5wcm9jID0gdmFsOworI2VuZGlmCisKKworCQkvKiBGSVhNRTogbm90IHN0cmljdGx5IG5lZWRlZCBJIHRoaW5rIGJ1dCB0aGUgY2FsbGVkIGNvZGUgZXhwZWN0cworCQkgICB0byBiZSBsb2NrZWQgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoaW5zdGFuY2UtPmhvc3RfbG9jaywgZmxhZ3MpOworCQl4ID0gcmVzZXRfaGFyZHdhcmUoaW5zdGFuY2UsIChob3N0ZGF0YS0+YXJncyAmIEFfTk9fU0NTSV9SRVNFVCkgPyBSRVNFVF9DQVJEIDogUkVTRVRfQ0FSRF9BTkRfQlVTKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkJaG9zdGRhdGEtPm1pY3JvY29kZSA9IHJlYWRfMzM5Myhob3N0ZGF0YSwgV0RfQ0RCXzEpOworCQlpZiAoeCAmIDB4MDEpIHsKKwkJCWlmICh4ICYgQl9GTEFHKQorCQkJCWhvc3RkYXRhLT5jaGlwID0gQ19XRDMzQzkzQjsKKwkJCWVsc2UKKwkJCQlob3N0ZGF0YS0+Y2hpcCA9IENfV0QzM0M5M0E7CisJCX0gZWxzZQorCQkJaG9zdGRhdGEtPmNoaXAgPSBDX1dEMzNDOTM7CisKKwkJcHJpbnRrKCJkaXBfc3dpdGNoPSUwMnggaXJxPSVkIGlvcG9ydD0lMDJ4IGZsb3BweT0lcyBzeW5jL0RPUzU9JXMgIiwgKHN3aXRjaGVzICYgMHg3ZiksIGluc3RhbmNlLT5pcnEsIGhvc3RkYXRhLT5pb19iYXNlLCAoc3dpdGNoZXMgJiBTV19GTE9QUFkpID8gIlllcyIgOiAiTm8iLCAoc3dpdGNoZXMgJiBTV19TWU5DX0RPUzUpID8gIlllcyIgOiAiTm8iKTsKKwkJcHJpbnRrKCJoYXJkd2FyZV92ZXI9JTAyeCBjaGlwPSVzIG1pY3JvY29kZT0lMDJ4XG4iLCBocmV2LCAoaG9zdGRhdGEtPmNoaXAgPT0gQ19XRDMzQzkzKSA/ICJXRDMzYzkzIiA6IChob3N0ZGF0YS0+Y2hpcCA9PSBDX1dEMzNDOTNBKSA/ICJXRDMzYzkzQSIgOiAoaG9zdGRhdGEtPmNoaXAgPT0gQ19XRDMzQzkzQikgPyAiV0QzM2M5M0IiIDogInVua25vd24iLCBob3N0ZGF0YS0+bWljcm9jb2RlKTsKKyNpZmRlZiBERUJVR0dJTkdfT04KKwkJcHJpbnRrKCJzZXR1cF9hcmdzID0gIik7CisJCWZvciAoeCA9IDA7IHggPCBNQVhfU0VUVVBfQVJHUzsgeCsrKQorCQkJcHJpbnRrKCIlcywiLCBzZXR1cF9hcmdzW3hdKTsKKwkJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJCWlmIChob3N0ZGF0YS0+c3luY19vZmYgPT0gMHhmZikKKwkJCXByaW50aygiU3luYy10cmFuc2ZlciBESVNBQkxFRCBvbiBhbGwgZGV2aWNlczogRU5BQkxFIGZyb20gY29tbWFuZC1saW5lXG4iKTsKKwkJcHJpbnRrKCJJTjIwMDAgZHJpdmVyIHZlcnNpb24gJXMgLSAlc1xuIiwgSU4yMDAwX1ZFUlNJT04sIElOMjAwMF9EQVRFKTsKKwl9CisKKwlyZXR1cm4gZGV0ZWN0X2NvdW50OworfQorCitzdGF0aWMgaW50IGluMjAwMF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCWlmIChzaG9zdC0+aXJxKQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBzaG9zdCk7CisJaWYgKHNob3N0LT5pb19wb3J0ICYmIHNob3N0LT5uX2lvX3BvcnQpCisJCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKKwlyZXR1cm4gMDsKK30KKworLyogTk9URTogSSBsaWZ0ZWQgdGhpcyBmdW5jdGlvbiBzdHJhaWdodCBvdXQgb2YgdGhlIG9sZCBkcml2ZXIsCisgKiAgICAgICBhbmQgaGF2ZSBub3QgdGVzdGVkIGl0LiBQcmVzdW1hYmx5IGl0IGRvZXMgd2hhdCBpdCdzCisgKiAgICAgICBzdXBwb3NlZCB0byBkby4uLgorICovCisKK3N0YXRpYyBpbnQgaW4yMDAwX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKmlpbmZvKQoreworCWludCBzaXplOworCisJc2l6ZSA9IGNhcGFjaXR5OworCWlpbmZvWzBdID0gNjQ7CisJaWluZm9bMV0gPSAzMjsKKwlpaW5mb1syXSA9IHNpemUgPj4gMTE7CisKKy8qIFRoaXMgc2hvdWxkIGFwcHJveGltYXRlIHRoZSBsYXJnZSBkcml2ZSBoYW5kbGluZyB0aGF0IHRoZSBET1MgQVNQSSBtYW5hZ2VyCisgICB1c2VzLiAgRHJpdmVzIHZlcnkgbmVhciB0aGUgYm91bmRhcmllcyBtYXkgbm90IGJlIGhhbmRsZWQgY29ycmVjdGx5IChpLmUuCisgICBuZWFyIDIuMCBHYiBhbmQgNC4wIEdiKSAqLworCisJaWYgKGlpbmZvWzJdID4gMTAyNCkgeworCQlpaW5mb1swXSA9IDY0OworCQlpaW5mb1sxXSA9IDYzOworCQlpaW5mb1syXSA9ICh1bnNpZ25lZCBsb25nKSBjYXBhY2l0eSAvIChpaW5mb1swXSAqIGlpbmZvWzFdKTsKKwl9CisJaWYgKGlpbmZvWzJdID4gMTAyNCkgeworCQlpaW5mb1swXSA9IDEyODsKKwkJaWluZm9bMV0gPSA2MzsKKwkJaWluZm9bMl0gPSAodW5zaWduZWQgbG9uZykgY2FwYWNpdHkgLyAoaWluZm9bMF0gKiBpaW5mb1sxXSk7CisJfQorCWlmIChpaW5mb1syXSA+IDEwMjQpIHsKKwkJaWluZm9bMF0gPSAyNTU7CisJCWlpbmZvWzFdID0gNjM7CisJCWlpbmZvWzJdID0gKHVuc2lnbmVkIGxvbmcpIGNhcGFjaXR5IC8gKGlpbmZvWzBdICogaWluZm9bMV0pOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGluMjAwMF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBsZW4sIGludCBpbikKK3sKKworI2lmZGVmIFBST0NfSU5URVJGQUNFCisKKwljaGFyICpicDsKKwljaGFyIHRidWZbMTI4XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKmhkOworCVNjc2lfQ21uZCAqY21kOworCWludCB4LCBpOworCXN0YXRpYyBpbnQgc3RvcCA9IDA7CisKKwloZCA9IChzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKKworLyogSWYgJ2luJyBpcyBUUlVFIHdlIG5lZWQgdG8gX3JlYWRfIHRoZSBwcm9jIGZpbGUuIFdlIGFjY2VwdCB0aGUgZm9sbG93aW5nCisgKiBrZXl3b3JkcyAoc2FtZSBmb3JtYXQgYXMgY29tbWFuZC1saW5lLCBidXQgb25seSBPTkUgcGVyIHJlYWQpOgorICogICAgZGVidWcKKyAqICAgIGRpc2Nvbm5lY3QKKyAqICAgIHBlcmlvZAorICogICAgcmVzeW5jCisgKiAgICBwcm9jCisgKi8KKworCWlmIChpbikgeworCQlidWZbbGVuXSA9ICdcMCc7CisJCWJwID0gYnVmOworCQlpZiAoIXN0cm5jbXAoYnAsICJkZWJ1ZzoiLCA2KSkgeworCQkJYnAgKz0gNjsKKwkJCWhkLT5hcmdzID0gc2ltcGxlX3N0cnRvdWwoYnAsIE5VTEwsIDApICYgREJfTUFTSzsKKwkJfSBlbHNlIGlmICghc3RybmNtcChicCwgImRpc2Nvbm5lY3Q6IiwgMTEpKSB7CisJCQlicCArPSAxMTsKKwkJCXggPSBzaW1wbGVfc3RydG91bChicCwgTlVMTCwgMCk7CisJCQlpZiAoeCA8IERJU19ORVZFUiB8fCB4ID4gRElTX0FMV0FZUykKKwkJCQl4ID0gRElTX0FEQVBUSVZFOworCQkJaGQtPmRpc2Nvbm5lY3QgPSB4OworCQl9IGVsc2UgaWYgKCFzdHJuY21wKGJwLCAicGVyaW9kOiIsIDcpKSB7CisJCQlicCArPSA3OworCQkJeCA9IHNpbXBsZV9zdHJ0b3VsKGJwLCBOVUxMLCAwKTsKKwkJCWhkLT5kZWZhdWx0X3N4X3BlciA9IHN4X3RhYmxlW3JvdW5kX3BlcmlvZCgodW5zaWduZWQgaW50KSB4KV0ucGVyaW9kX25zOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKGJwLCAicmVzeW5jOiIsIDcpKSB7CisJCQlicCArPSA3OworCQkJeCA9IHNpbXBsZV9zdHJ0b3VsKGJwLCBOVUxMLCAwKTsKKwkJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisJCQkJaWYgKHggJiAoMSA8PCBpKSkKKwkJCQkJaGQtPnN5bmNfc3RhdFtpXSA9IFNTX1VOU0VUOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKGJwLCAicHJvYzoiLCA1KSkgeworCQkJYnAgKz0gNTsKKwkJCWhkLT5wcm9jID0gc2ltcGxlX3N0cnRvdWwoYnAsIE5VTEwsIDApOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKGJwLCAibGV2ZWwyOiIsIDcpKSB7CisJCQlicCArPSA3OworCQkJaGQtPmxldmVsMiA9IHNpbXBsZV9zdHJ0b3VsKGJwLCBOVUxMLCAwKTsKKwkJfQorCQlyZXR1cm4gbGVuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlicCA9IGJ1ZjsKKwkqYnAgPSAnXDAnOworCWlmIChoZC0+cHJvYyAmIFBSX1ZFUlNJT04pIHsKKwkJc3ByaW50Zih0YnVmLCAiXG5WZXJzaW9uICVzIC0gJXMuIENvbXBpbGVkICVzICVzIiwgSU4yMDAwX1ZFUlNJT04sIElOMjAwMF9EQVRFLCBfX0RBVEVfXywgX19USU1FX18pOworCQlzdHJjYXQoYnAsIHRidWYpOworCX0KKwlpZiAoaGQtPnByb2MgJiBQUl9JTkZPKSB7CisJCXNwcmludGYodGJ1ZiwgIlxuZGlwX3N3aXRjaD0lMDJ4OiBpcnE9JWQgaW89JTAyeCBmbG9wcHk9JXMgc3luYy9ET1M1PSVzIiwgKGhkLT5kaXBfc3dpdGNoICYgMHg3ZiksIGluc3RhbmNlLT5pcnEsIGhkLT5pb19iYXNlLCAoaGQtPmRpcF9zd2l0Y2ggJiAweDQwKSA/ICJZZXMiIDogIk5vIiwgKGhkLT5kaXBfc3dpdGNoICYgMHgyMCkgPyAiWWVzIiA6ICJObyIpOworCQlzdHJjYXQoYnAsIHRidWYpOworCQlzdHJjYXQoYnAsICJcbnN5bmNfeGZlcltdID0gICAgICAgIik7CisJCWZvciAoeCA9IDA7IHggPCA3OyB4KyspIHsKKwkJCXNwcmludGYodGJ1ZiwgIlx0JTAyeCIsIGhkLT5zeW5jX3hmZXJbeF0pOworCQkJc3RyY2F0KGJwLCB0YnVmKTsKKwkJfQorCQlzdHJjYXQoYnAsICJcbnN5bmNfc3RhdFtdID0gICAgICAgIik7CisJCWZvciAoeCA9IDA7IHggPCA3OyB4KyspIHsKKwkJCXNwcmludGYodGJ1ZiwgIlx0JTAyeCIsIGhkLT5zeW5jX3N0YXRbeF0pOworCQkJc3RyY2F0KGJwLCB0YnVmKTsKKwkJfQorCX0KKyNpZmRlZiBQUk9DX1NUQVRJU1RJQ1MKKwlpZiAoaGQtPnByb2MgJiBQUl9TVEFUSVNUSUNTKSB7CisJCXN0cmNhdChicCwgIlxuY29tbWFuZHMgaXNzdWVkOiAgICAiKTsKKwkJZm9yICh4ID0gMDsgeCA8IDc7IHgrKykgeworCQkJc3ByaW50Zih0YnVmLCAiXHQlbGQiLCBoZC0+Y21kX2NudFt4XSk7CisJCQlzdHJjYXQoYnAsIHRidWYpOworCQl9CisJCXN0cmNhdChicCwgIlxuZGlzY29ubmVjdHMgYWxsb3dlZDoiKTsKKwkJZm9yICh4ID0gMDsgeCA8IDc7IHgrKykgeworCQkJc3ByaW50Zih0YnVmLCAiXHQlbGQiLCBoZC0+ZGlzY19hbGxvd2VkX2NudFt4XSk7CisJCQlzdHJjYXQoYnAsIHRidWYpOworCQl9CisJCXN0cmNhdChicCwgIlxuZGlzY29ubmVjdHMgZG9uZTogICAiKTsKKwkJZm9yICh4ID0gMDsgeCA8IDc7IHgrKykgeworCQkJc3ByaW50Zih0YnVmLCAiXHQlbGQiLCBoZC0+ZGlzY19kb25lX2NudFt4XSk7CisJCQlzdHJjYXQoYnAsIHRidWYpOworCQl9CisJCXNwcmludGYodGJ1ZiwgIlxuaW50ZXJydXB0czogICAgICBcdCVsZCIsIGhkLT5pbnRfY250KTsKKwkJc3RyY2F0KGJwLCB0YnVmKTsKKwl9CisjZW5kaWYKKwlpZiAoaGQtPnByb2MgJiBQUl9DT05ORUNURUQpIHsKKwkJc3RyY2F0KGJwLCAiXG5jb25uZWN0ZWQ6ICAgICAiKTsKKwkJaWYgKGhkLT5jb25uZWN0ZWQpIHsKKwkJCWNtZCA9IChTY3NpX0NtbmQgKikgaGQtPmNvbm5lY3RlZDsKKwkJCXNwcmludGYodGJ1ZiwgIiAlbGQtJWQ6JWQoJTAyeCkiLCBjbWQtPnBpZCwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLCBjbWQtPmNtbmRbMF0pOworCQkJc3RyY2F0KGJwLCB0YnVmKTsKKwkJfQorCX0KKwlpZiAoaGQtPnByb2MgJiBQUl9JTlBVVFEpIHsKKwkJc3RyY2F0KGJwLCAiXG5pbnB1dF9ROiAgICAgICAiKTsKKwkJY21kID0gKFNjc2lfQ21uZCAqKSBoZC0+aW5wdXRfUTsKKwkJd2hpbGUgKGNtZCkgeworCQkJc3ByaW50Zih0YnVmLCAiICVsZC0lZDolZCglMDJ4KSIsIGNtZC0+cGlkLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sIGNtZC0+Y21uZFswXSk7CisJCQlzdHJjYXQoYnAsIHRidWYpOworCQkJY21kID0gKFNjc2lfQ21uZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGU7CisJCX0KKwl9CisJaWYgKGhkLT5wcm9jICYgUFJfRElTQ1EpIHsKKwkJc3RyY2F0KGJwLCAiXG5kaXNjb25uZWN0ZWRfUToiKTsKKwkJY21kID0gKFNjc2lfQ21uZCAqKSBoZC0+ZGlzY29ubmVjdGVkX1E7CisJCXdoaWxlIChjbWQpIHsKKwkJCXNwcmludGYodGJ1ZiwgIiAlbGQtJWQ6JWQoJTAyeCkiLCBjbWQtPnBpZCwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLCBjbWQtPmNtbmRbMF0pOworCQkJc3RyY2F0KGJwLCB0YnVmKTsKKwkJCWNtZCA9IChTY3NpX0NtbmQgKikgY21kLT5ob3N0X3NjcmliYmxlOworCQl9CisJfQorCWlmIChoZC0+cHJvYyAmIFBSX1RFU1QpIHsKKwkJOwkJLyogaW5zZXJ0IHlvdXIgb3duIGN1c3RvbSBmdW5jdGlvbiBoZXJlICovCisJfQorCXN0cmNhdChicCwgIlxuIik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+aG9zdF9sb2NrLCBmbGFncyk7CisJKnN0YXJ0ID0gYnVmOworCWlmIChzdG9wKSB7CisJCXN0b3AgPSAwOworCQlyZXR1cm4gMDsJLyogcmV0dXJuIDAgdG8gc2lnbmFsIGVuZC1vZi1maWxlICovCisJfQorCWlmIChvZmYgPiAweDQwMDAwKQkvKiBBTFdBWVMgc3RvcCBhZnRlciAyNTZrIGJ5dGVzIGhhdmUgYmVlbiByZWFkICovCisJCXN0b3AgPSAxOworCWlmIChoZC0+cHJvYyAmIFBSX1NUT1ApCS8qIHN0b3AgZXZlcnkgb3RoZXIgdGltZSAqLworCQlzdG9wID0gMTsKKwlyZXR1cm4gc3RybGVuKGJwKTsKKworI2Vsc2UJCQkJLyogUFJPQ19JTlRFUkZBQ0UgKi8KKworCXJldHVybiAwOworCisjZW5kaWYJCQkJLyogUFJPQ19JTlRFUkZBQ0UgKi8KKworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZSAgICAgICAJCT0gImluMjAwMCIsCisJLnByb2NfaW5mbyAgICAgICAJCT0gaW4yMDAwX3Byb2NfaW5mbywKKwkubmFtZSAgICAgICAgICAgIAkJPSAiQWx3YXlzIElOMjAwMCIsCisJLmRldGVjdCAgICAgICAgICAJCT0gaW4yMDAwX2RldGVjdCwgCisJLnJlbGVhc2UJCQk9IGluMjAwMF9yZWxlYXNlLAorCS5xdWV1ZWNvbW1hbmQgICAgCQk9IGluMjAwMF9xdWV1ZWNvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIJCT0gaW4yMDAwX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgkJPSBpbjIwMDBfYnVzX3Jlc2V0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcgk9IGluMjAwMF9kZXZpY2VfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IGluMjAwMF9ob3N0X3Jlc2V0LCAKKwkuYmlvc19wYXJhbSAgICAgIAkJPSBpbjIwMDBfYmlvc3BhcmFtLCAKKwkuY2FuX3F1ZXVlICAgICAgIAkJPSBJTjIwMDBfQ0FOX1EsCisJLnRoaXNfaWQgICAgICAgICAJCT0gSU4yMDAwX0hPU1RfSUQsCisJLnNnX3RhYmxlc2l6ZSAgICAJCT0gSU4yMDAwX1NHLAorCS5jbWRfcGVyX2x1biAgICAgCQk9IElOMjAwMF9DUEwsCisJLnVzZV9jbHVzdGVyaW5nICAJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorfTsKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2luMjAwMC5oIGIvZHJpdmVycy9zY3NpL2luMjAwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOWU0NWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaW4yMDAwLmgKQEAgLTAsMCArMSw0MTQgQEAKKy8qCisgKiAgICBpbjIwMDAuaCAtICBMaW51eCBkZXZpY2UgZHJpdmVyIGRlZmluaXRpb25zIGZvciB0aGUKKyAqICAgICAgICAgICAgICAgIEFsd2F5cyBJTjIwMDAgSVNBIFNDU0kgY2FyZC4KKyAqCisgKiAgICBJTVBPUlRBTlQ6IFRoaXMgZmlsZSBpcyBmb3IgdmVyc2lvbiAxLjMzIC0gMjYvQXVnLzE5OTgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYgSm9obiBTaGlmZmxldHQsIEdlb0xvZyBDb25zdWx0aW5nCisgKiAgICBqb2huQGdlb2xvZy5jb20KKyAqICAgIGpzaGlmZmxlQG5ldGNvbS5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgSU4yMDAwX0gKKyNkZWZpbmUgSU4yMDAwX0gKKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIFBST0NfSU5URVJGQUNFICAgICAvKiBhZGQgY29kZSBmb3IgL3Byb2Mvc2NzaS9pbjIwMDAveHh4IGludGVyZmFjZSAqLworI2lmZGVmICBQUk9DX0lOVEVSRkFDRQorI2RlZmluZSBQUk9DX1NUQVRJU1RJQ1MgICAgLyogYWRkIGNvZGUgZm9yIGtlZXBpbmcgdmFyaW91cyByZWFsIHRpbWUgc3RhdHMgKi8KKyNlbmRpZgorCisjZGVmaW5lIFNZTkNfREVCVUcgICAgICAgICAvKiBleHRyYSBpbmZvIG9uIHN5bmMgbmVnb3RpYXRpb24gcHJpbnRlZCAqLworI2RlZmluZSBERUJVR0dJTkdfT04gICAgICAgLyogZW5hYmxlIGNvbW1hbmQtbGluZSBkZWJ1Z2dpbmcgYml0bWFzayAqLworI2RlZmluZSBERUJVR19ERUZBVUxUUyAwICAgLyogZGVmYXVsdCBiaXRtYXNrIC0gY2hhbmdlIGZyb20gY29tbWFuZC1saW5lICovCisKKyNpZmRlZiBfX2kzODZfXworI2RlZmluZSBGQVNUX1JFQURfSU8gICAgICAgLyogTm8gcHJvYmxlbXMgd2l0aCB0aGVzZSBvbiBteSBtYWNoaW5lICovCisjZGVmaW5lIEZBU1RfV1JJVEVfSU8KKyNlbmRpZgorCisjaWZkZWYgREVCVUdHSU5HX09OCisjZGVmaW5lIERCKGYsYSkgaWYgKGhvc3RkYXRhLT5hcmdzICYgKGYpKSBhOworI2RlZmluZSBDSEVDS19OVUxMKHAscykgLyogaWYgKCEocCkpIHtwcmludGsoIlxuIik7IHdoaWxlICgxKSBwcmludGsoIk5QOiVzXHIiLChzKSk7fSAqLworI2Vsc2UKKyNkZWZpbmUgREIoZixhKQorI2RlZmluZSBDSEVDS19OVUxMKHAscykKKyNlbmRpZgorCisjZGVmaW5lIHVjaGFyIHVuc2lnbmVkIGNoYXIKKworI2RlZmluZSByZWFkMV9pbyhhKSAgICAgKGluYihob3N0ZGF0YS0+aW9fYmFzZSsoYSkpKQorI2RlZmluZSByZWFkMl9pbyhhKSAgICAgKGludyhob3N0ZGF0YS0+aW9fYmFzZSsoYSkpKQorI2RlZmluZSB3cml0ZTFfaW8oYixhKSAgKG91dGIoKGIpLGhvc3RkYXRhLT5pb19iYXNlKyhhKSkpCisjZGVmaW5lIHdyaXRlMl9pbyh3LGEpICAob3V0dygodyksaG9zdGRhdGEtPmlvX2Jhc2UrKGEpKSkKKworI2lmZGVmIF9faTM4Nl9fCisvKiBUaGVzZSBpbmxpbmUgYXNzZW1ibHkgZGVmaW5lcyBhcmUgZGVyaXZlZCBmcm9tIGEgcGF0Y2gKKyAqIHNlbnQgdG8gbWUgYnkgQmlsbCBFYXJuZXN0LiBIZSdzIGRvbmUgYSBsb3Qgb2YgdmVyeQorICogdmFsdWFibGUgdGhpbmtpbmcsIHRlc3RpbmcsIGFuZCBjb2RpbmcgZHVyaW5nIGhpcyBlZmZvcnQKKyAqIHRvIHNxdWVlemUgbW9yZSBzcGVlZCBvdXQgb2YgdGhpcyBkcml2ZXIuIEkgcmVhbGx5IHRoaW5rCisgKiB0aGF0IHdlIGFyZSBkb2luZyBJTyBhdCBjbG9zZSB0byB0aGUgbWF4aW11bSBub3cgd2l0aAorICogdGhlIGZpZm8uIChBbmQgeWVzLCBpbnN3IHVzZXMgJ2VkaScgd2hpbGUgb3V0c3cgdXNlcworICogJ2VzaScuIFRoYW5rcyBCaWxsISkKKyAqLworCisjZGVmaW5lIEZBU1RfUkVBRDJfSU8oKSAgICBcCisoeyBcCitpbnQgX19kdW1teV8xLF9fZHVtbXlfMjsgXAorICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJcbiBcCisgICBjbGQgICAgICAgICAgICAgICAgICAgIFxuIFwKKyAgIG9ybCAlJWVjeCwgJSVlY3ggICAgICAgXG4gXAorICAganogMWYgICAgICAgICAgICAgICAgICBcbiBcCisgICByZXAgICAgICAgICAgICAgICAgICAgIFxuIFwKKyAgIGluc3cgKCUlZHgpLCUlZXM6KCUlZWRpKSBcbiBcCisxOiAiICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICI9RCIgKHNwKSAsIj1jIiAoX19kdW1teV8xKSAsIj1kIiAoX19kdW1teV8yKSAgLyogb3V0cHV0ICovICAgXAorICAgOiAiMiIgKGYpLCAiMCIgKHNwKSwgIjEiIChpKSAgLyogaW5wdXQgKi8gICAgXAorICAgKTsgICAgICAgLyogdHJhc2hlZCAqLyBcCit9KQorCisjZGVmaW5lIEZBU1RfV1JJVEUyX0lPKCkgICBcCisoeyBcCitpbnQgX19kdW1teV8xLF9fZHVtbXlfMjsgXAorICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJcbiBcCisgICBjbGQgICAgICAgICAgICAgICAgICAgIFxuIFwKKyAgIG9ybCAlJWVjeCwgJSVlY3ggICAgICAgXG4gXAorICAganogMWYgICAgICAgICAgICAgICAgICBcbiBcCisgICByZXAgICAgICAgICAgICAgICAgICAgIFxuIFwKKyAgIG91dHN3ICUlZHM6KCUlZXNpKSwoJSVkeCkgXG4gXAorMTogIiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAiPVMiIChzcCkgLCI9YyIgKF9fZHVtbXlfMSkgLCI9ZCIgKF9fZHVtbXlfMikvKiBvdXRwdXQgKi8gICBcCisgICA6ICIyIiAoZiksICIwIiAoc3ApLCAiMSIgKGkpICAvKiBpbnB1dCAqLyAgICBcCisgICApOyAgICAgICAvKiB0cmFzaGVkICovIFwKK30pCisjZW5kaWYKKworLyogSU4yMDAwIGlvX3BvcnQgb2Zmc2V0cyAqLworI2RlZmluZSBJT19XRF9BU1IgICAgICAgMHgwMCAgICAgLyogUiAtIDMzOTMgYXV4c3RhdCByZWcgKi8KKyNkZWZpbmUgICAgIEFTUl9JTlQgICAgICAgIDB4ODAKKyNkZWZpbmUgICAgIEFTUl9MQ0kgICAgICAgIDB4NDAKKyNkZWZpbmUgICAgIEFTUl9CU1kgICAgICAgIDB4MjAKKyNkZWZpbmUgICAgIEFTUl9DSVAgICAgICAgIDB4MTAKKyNkZWZpbmUgICAgIEFTUl9QRSAgICAgICAgIDB4MDIKKyNkZWZpbmUgICAgIEFTUl9EQlIgICAgICAgIDB4MDEKKyNkZWZpbmUgSU9fV0RfQUREUiAgICAgIDB4MDAgICAgIC8qIFcgLSAzMzkzIGFkZHJlc3MgcmVnICovCisjZGVmaW5lIElPX1dEX0RBVEEgICAgICAweDAxICAgICAvKiBSL1cgLSByZXN0IG9mIDMzOTMgcmVncyAqLworI2RlZmluZSBJT19GSUZPICAgICAgICAgMHgwMiAgICAgLyogUi9XIC0gaW4yMDAwIGR1YWwtcG9ydCBmaWZvICgxNiBiaXRzKSAqLworI2RlZmluZSBJTjIwMDBfRklGT19TSVpFICAgMjA0OCAgLyogICAgZmlmbyBjYXBhY2l0eSBpbiBieXRlcyAqLworI2RlZmluZSBJT19DQVJEX1JFU0VUICAgMHgwMyAgICAgLyogVyAtIGluMjAwMCBzdGFydCBtYXN0ZXIgcmVzZXQgKi8KKyNkZWZpbmUgSU9fRklGT19DT1VOVCAgIDB4MDQgICAgIC8qIFIgLSBpbjIwMDAgZmlmbyBjb3VudGVyICovCisjZGVmaW5lIElPX0ZJRk9fV1JJVEUgICAweDA1ICAgICAvKiBXIC0gY2xlYXIgZmlmbyBjb3VudGVyLCBzdGFydCB3cml0ZSAqLworI2RlZmluZSBJT19GSUZPX1JFQUQgICAgMHgwNyAgICAgLyogVyAtIHN0YXJ0IGZpZm8gcmVhZCAqLworI2RlZmluZSBJT19MRURfT0ZGICAgICAgMHgwOCAgICAgLyogVyAtIHR1cm4gb2ZmIGluMjAwMCBhY3Rpdml0eSBMRUQgKi8KKyNkZWZpbmUgSU9fU1dJVENIRVMgICAgIDB4MDggICAgIC8qIFIgLSByZWFkIGluMjAwMCBkaXAgc3dpdGNoICovCisjZGVmaW5lICAgICBTV19BRERSMCAgICAgICAweDAxICAvKiAgICBiaXQgMCA9IGJpdCAwIG9mIGluZGV4IHRvIGlvIGFkZHIgKi8KKyNkZWZpbmUgICAgIFNXX0FERFIxICAgICAgIDB4MDIgIC8qICAgIGJpdCAxID0gYml0IDEgb2YgaW5kZXggaW8gYWRkciAqLworI2RlZmluZSAgICAgU1dfRElTSU5UICAgICAgMHgwNCAgLyogICAgYml0IDIgdHJ1ZSBpZiBpbnRzIGRpc2FibGVkICovCisjZGVmaW5lICAgICBTV19JTlQwICAgICAgICAweDA4ICAvKiAgICBiaXQgMyA9IGJpdCAwIG9mIGluZGV4IHRvIGludGVycnVwdCAqLworI2RlZmluZSAgICAgU1dfSU5UMSAgICAgICAgMHgxMCAgLyogICAgYml0IDQgPSBiaXQgMSBvZiBpbmRleCB0byBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICAgIFNXX0lOVF9TSElGVCAgIDMgICAgIC8qICAgIHNoaWZ0IHJpZ2h0IHRoaXMgYW1vdW50IHRvIHJpZ2h0IGp1c3RpZnkgaW50IGJpdHMgKi8KKyNkZWZpbmUgICAgIFNXX1NZTkNfRE9TNSAgIDB4MjAgIC8qICAgIGJpdCA1IHVzZWQgYnkgQWx3YXlzIEJJT1MgKi8KKyNkZWZpbmUgICAgIFNXX0ZMT1BQWSAgICAgIDB4NDAgIC8qICAgIGJpdCA2IHRydWUgaWYgZmxvcHB5IGVuYWJsZWQgKi8KKyNkZWZpbmUgICAgIFNXX0JJVDcgICAgICAgIDB4ODAgIC8qICAgIGJpdCA3IGhhcmR3aXJlZCB0cnVlIChncm91bmQpICovCisjZGVmaW5lIElPX0xFRF9PTiAgICAgICAweDA5ICAgICAvKiBXIC0gdHVybiBvbiBpbjIwMDAgYWN0aXZpdHkgTEVEICovCisjZGVmaW5lIElPX0hBUkRXQVJFICAgICAweDBhICAgICAvKiBSIC0gcmVhZCBpbjIwMDAgaGFyZHdhcmUgcmV2LCBzdG9wIHJlc2V0ICovCisjZGVmaW5lIElPX0lOVFJfTUFTSyAgICAweDBjICAgICAvKiBXIC0gaW4yMDAwIGludGVycnVwdCBtYXNrIHJlZyAqLworI2RlZmluZSAgICAgSU1BU0tfV0QgICAgICAgMHgwMSAgLyogICAgV0QzM2M5MyBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSAgICAgSU1BU0tfRklGTyAgICAgMHgwMiAgLyogICAgRklGTyBpbnRlcnJ1cHQgbWFzayAqLworCisvKiB3ZCByZWdpc3RlciBuYW1lcyAqLworI2RlZmluZSBXRF9PV05fSUQgICAgMHgwMAorI2RlZmluZSBXRF9DT05UUk9MICAgMHgwMQorI2RlZmluZSBXRF9USU1FT1VUX1BFUklPRCAgMHgwMgorI2RlZmluZSBXRF9DREJfMSAgICAgMHgwMworI2RlZmluZSBXRF9DREJfMiAgICAgMHgwNAorI2RlZmluZSBXRF9DREJfMyAgICAgMHgwNQorI2RlZmluZSBXRF9DREJfNCAgICAgMHgwNgorI2RlZmluZSBXRF9DREJfNSAgICAgMHgwNworI2RlZmluZSBXRF9DREJfNiAgICAgMHgwOAorI2RlZmluZSBXRF9DREJfNyAgICAgMHgwOQorI2RlZmluZSBXRF9DREJfOCAgICAgMHgwYQorI2RlZmluZSBXRF9DREJfOSAgICAgMHgwYgorI2RlZmluZSBXRF9DREJfMTAgICAgMHgwYworI2RlZmluZSBXRF9DREJfMTEgICAgMHgwZAorI2RlZmluZSBXRF9DREJfMTIgICAgMHgwZQorI2RlZmluZSBXRF9UQVJHRVRfTFVOICAgICAgMHgwZgorI2RlZmluZSBXRF9DT01NQU5EX1BIQVNFICAgMHgxMAorI2RlZmluZSBXRF9TWU5DSFJPTk9VU19UUkFOU0ZFUiAgMHgxMQorI2RlZmluZSBXRF9UUkFOU0ZFUl9DT1VOVF9NU0IgMHgxMgorI2RlZmluZSBXRF9UUkFOU0ZFUl9DT1VOVCAgMHgxMworI2RlZmluZSBXRF9UUkFOU0ZFUl9DT1VOVF9MU0IgMHgxNAorI2RlZmluZSBXRF9ERVNUSU5BVElPTl9JRCAgMHgxNQorI2RlZmluZSBXRF9TT1VSQ0VfSUQgICAgMHgxNgorI2RlZmluZSBXRF9TQ1NJX1NUQVRVUyAgICAgMHgxNworI2RlZmluZSBXRF9DT01NQU5EICAgICAgMHgxOAorI2RlZmluZSBXRF9EQVRBICAgICAgMHgxOQorI2RlZmluZSBXRF9RVUVVRV9UQUcgICAgMHgxYQorI2RlZmluZSBXRF9BVVhJTElBUllfU1RBVFVTICAgMHgxZgorCisvKiBXRCBjb21tYW5kcyAqLworI2RlZmluZSBXRF9DTURfUkVTRVQgICAgMHgwMAorI2RlZmluZSBXRF9DTURfQUJPUlQgICAgMHgwMQorI2RlZmluZSBXRF9DTURfQVNTRVJUX0FUTiAgMHgwMgorI2RlZmluZSBXRF9DTURfTkVHQVRFX0FDSyAgMHgwMworI2RlZmluZSBXRF9DTURfRElTQ09OTkVDVCAgMHgwNAorI2RlZmluZSBXRF9DTURfUkVTRUxFQ1QgICAgMHgwNQorI2RlZmluZSBXRF9DTURfU0VMX0FUTiAgICAgMHgwNgorI2RlZmluZSBXRF9DTURfU0VMICAgICAgMHgwNworI2RlZmluZSBXRF9DTURfU0VMX0FUTl9YRkVSICAgMHgwOAorI2RlZmluZSBXRF9DTURfU0VMX1hGRVIgICAgMHgwOQorI2RlZmluZSBXRF9DTURfUkVTRUxfUkVDRUlWRSAgMHgwYQorI2RlZmluZSBXRF9DTURfUkVTRUxfU0VORCAgMHgwYgorI2RlZmluZSBXRF9DTURfV0FJVF9TRUxfUkVDRUlWRSAweDBjCisjZGVmaW5lIFdEX0NNRF9UUkFOU19BRERSICAweDE4CisjZGVmaW5lIFdEX0NNRF9UUkFOU19JTkZPICAweDIwCisjZGVmaW5lIFdEX0NNRF9UUkFOU0ZFUl9QQUQgICAweDIxCisjZGVmaW5lIFdEX0NNRF9TQlRfTU9ERSAgICAweDgwCisKKy8qIFNDU0kgQnVzIFBoYXNlcyAqLworI2RlZmluZSBQSFNfREFUQV9PVVQgICAgMHgwMAorI2RlZmluZSBQSFNfREFUQV9JTiAgICAgMHgwMQorI2RlZmluZSBQSFNfQ09NTUFORCAgICAgMHgwMgorI2RlZmluZSBQSFNfU1RBVFVTICAgICAgMHgwMworI2RlZmluZSBQSFNfTUVTU19PVVQgICAgMHgwNgorI2RlZmluZSBQSFNfTUVTU19JTiAgICAgMHgwNworCisvKiBDb21tYW5kIFN0YXR1cyBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworCisgIC8qIHJlc2V0IHN0YXRlIGludGVycnVwdHMgKi8KKyNkZWZpbmUgQ1NSX1JFU0VUICAgIDB4MDAKKyNkZWZpbmUgQ1NSX1JFU0VUX0FGICAgIDB4MDEKKworICAvKiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gaW50ZXJydXB0cyAqLworI2RlZmluZSBDU1JfUkVTRUxFQ1QgICAgMHgxMAorI2RlZmluZSBDU1JfU0VMRUNUICAgICAgMHgxMQorI2RlZmluZSBDU1JfU0VMX1hGRVJfRE9ORSAgMHgxNgorI2RlZmluZSBDU1JfWEZFUl9ET05FICAgICAgMHgxOAorCisgIC8qIHBhdXNlZCBvciBhYm9ydGVkIGludGVycnVwdHMgKi8KKyNkZWZpbmUgQ1NSX01TR0lOICAgIDB4MjAKKyNkZWZpbmUgQ1NSX1NEUCAgICAgICAgIDB4MjEKKyNkZWZpbmUgQ1NSX1NFTF9BQk9SVCAgICAgIDB4MjIKKyNkZWZpbmUgQ1NSX1JFU0VMX0FCT1JUICAgIDB4MjUKKyNkZWZpbmUgQ1NSX1JFU0VMX0FCT1JUX0FNIDB4MjcKKyNkZWZpbmUgQ1NSX0FCT1JUICAgIDB4MjgKKworICAvKiB0ZXJtaW5hdGVkIGludGVycnVwdHMgKi8KKyNkZWZpbmUgQ1NSX0lOVkFMSUQgICAgIDB4NDAKKyNkZWZpbmUgQ1NSX1VORVhQX0RJU0MgICAgIDB4NDEKKyNkZWZpbmUgQ1NSX1RJTUVPVVQgICAgIDB4NDIKKyNkZWZpbmUgQ1NSX1BBUklUWSAgICAgIDB4NDMKKyNkZWZpbmUgQ1NSX1BBUklUWV9BVE4gICAgIDB4NDQKKyNkZWZpbmUgQ1NSX0JBRF9TVEFUVVMgICAgIDB4NDUKKyNkZWZpbmUgQ1NSX1VORVhQICAgIDB4NDgKKworICAvKiBzZXJ2aWNlIHJlcXVpcmVkIGludGVycnVwdHMgKi8KKyNkZWZpbmUgQ1NSX1JFU0VMICAgIDB4ODAKKyNkZWZpbmUgQ1NSX1JFU0VMX0FNICAgIDB4ODEKKyNkZWZpbmUgQ1NSX0RJU0MgICAgIDB4ODUKKyNkZWZpbmUgQ1NSX1NSVl9SRVEgICAgIDB4ODgKKworICAgLyogT3duIElEL0NEQiBTaXplIHJlZ2lzdGVyICovCisjZGVmaW5lIE9XTklEX0VBRiAgICAweDA4CisjZGVmaW5lIE9XTklEX0VIUCAgICAweDEwCisjZGVmaW5lIE9XTklEX1JBRiAgICAweDIwCisjZGVmaW5lIE9XTklEX0ZTXzggICAweDAwCisjZGVmaW5lIE9XTklEX0ZTXzEyICAweDQwCisjZGVmaW5lIE9XTklEX0ZTXzE2ICAweDgwCisKKyAgIC8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ1RSTF9IU1AgICAgIDB4MDEKKyNkZWZpbmUgQ1RSTF9IQSAgICAgIDB4MDIKKyNkZWZpbmUgQ1RSTF9JREkgICAgIDB4MDQKKyNkZWZpbmUgQ1RSTF9FREkgICAgIDB4MDgKKyNkZWZpbmUgQ1RSTF9ISFAgICAgIDB4MTAKKyNkZWZpbmUgQ1RSTF9QT0xMRUQgIDB4MDAKKyNkZWZpbmUgQ1RSTF9CVVJTVCAgIDB4MjAKKyNkZWZpbmUgQ1RSTF9CVVMgICAgIDB4NDAKKyNkZWZpbmUgQ1RSTF9ETUEgICAgIDB4ODAKKworICAgLyogVGltZW91dCBQZXJpb2QgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVElNRU9VVF9QRVJJT0RfVkFMVUUgIDIwICAgIC8qIHJlc3VsdHMgaW4gMjAwIG1zLiAqLworCisgICAvKiBTeW5jaHJvbm91cyBUcmFuc2ZlciBSZWdpc3RlciAqLworI2RlZmluZSBTVFJfRlNTICAgICAgMHg4MAorCisgICAvKiBEZXN0aW5hdGlvbiBJRCByZWdpc3RlciAqLworI2RlZmluZSBEU1RJRF9EUEQgICAgMHg0MAorI2RlZmluZSBEQVRBX09VVF9ESVIgMAorI2RlZmluZSBEQVRBX0lOX0RJUiAgMQorI2RlZmluZSBEU1RJRF9TQ0MgICAgMHg4MAorCisgICAvKiBTb3VyY2UgSUQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1JDSURfTUFTSyAgIDB4MDcKKyNkZWZpbmUgU1JDSURfU0lWICAgIDB4MDgKKyNkZWZpbmUgU1JDSURfRFNQICAgIDB4MjAKKyNkZWZpbmUgU1JDSURfRVMgICAgIDB4NDAKKyNkZWZpbmUgU1JDSURfRVIgICAgIDB4ODAKKworCisKKyNkZWZpbmUgSUxMRUdBTF9TVEFUVVNfQllURSAgIDB4ZmYKKworCisjZGVmaW5lIERFRkFVTFRfU1hfUEVSICAgICA1MDAgICAvKiAobnMpIGZhaXJseSBzYWZlICovCisjZGVmaW5lIERFRkFVTFRfU1hfT0ZGICAgICAwICAgICAvKiBha2EgYXN5bmMgKi8KKworI2RlZmluZSBPUFRJTVVNX1NYX1BFUiAgICAgMjUyICAgLyogKG5zKSBiZXN0IHdlIGNhbiBkbyAobXVsdC1vZi00KSAqLworI2RlZmluZSBPUFRJTVVNX1NYX09GRiAgICAgMTIgICAgLyogc2l6ZSBvZiBpbjIwMDAgZmlmbyAqLworCitzdHJ1Y3Qgc3hfcGVyaW9kIHsKKyAgIHVuc2lnbmVkIGludCAgIHBlcmlvZF9uczsKKyAgIHVjaGFyICAgICAgICAgIHJlZ192YWx1ZTsKKyAgIH07CisKKworc3RydWN0IElOMjAwMF9ob3N0ZGF0YSB7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqbmV4dDsKKyAgICB1Y2hhciAgICAgICAgICAgIGNoaXA7ICAgICAgICAgICAgIC8qIHdoYXQga2luZCBvZiB3ZDMzYzkzIGNoaXA/ICovCisgICAgdWNoYXIgICAgICAgICAgICBtaWNyb2NvZGU7ICAgICAgICAvKiBtaWNyb2NvZGUgcmV2IGlmICdCJyAqLworICAgIHVuc2lnbmVkIHNob3J0ICAgaW9fYmFzZTsgICAgICAgICAgLyogSU8gcG9ydCBiYXNlICovCisgICAgdW5zaWduZWQgaW50ICAgICBkaXBfc3dpdGNoOyAgICAgICAvKiBkaXAgc3dpdGNoIHNldHRpbmdzICovCisgICAgdW5zaWduZWQgaW50ICAgICBocmV2OyAgICAgICAgICAgICAvKiBoYXJkd2FyZSByZXZpc2lvbiBvZiBjYXJkICovCisgICAgdm9sYXRpbGUgdWNoYXIgICBidXN5WzhdOyAgICAgICAgICAvKiBpbmRleCA9IHRhcmdldCwgYml0ID0gbHVuICovCisgICAgdm9sYXRpbGUgU2NzaV9DbW5kICppbnB1dF9ROyAgICAgICAvKiBjb21tYW5kcyB3YWl0aW5nIHRvIGJlIHN0YXJ0ZWQgKi8KKyAgICB2b2xhdGlsZSBTY3NpX0NtbmQgKnNlbGVjdGluZzsgICAgIC8qIHRyeWluZyB0byBzZWxlY3QgdGhpcyBjb21tYW5kICovCisgICAgdm9sYXRpbGUgU2NzaV9DbW5kICpjb25uZWN0ZWQ7ICAgICAvKiBjdXJyZW50bHkgY29ubmVjdGVkIGNvbW1hbmQgKi8KKyAgICB2b2xhdGlsZSBTY3NpX0NtbmQgKmRpc2Nvbm5lY3RlZF9ROy8qIGNvbW1hbmRzIHdhaXRpbmcgZm9yIHJlY29ubmVjdCAqLworICAgIHVjaGFyICAgICAgICAgICAgc3RhdGU7ICAgICAgICAgICAgLyogd2hhdCB3ZSBhcmUgY3VycmVudGx5IGRvaW5nICovCisgICAgdWNoYXIgICAgICAgICAgICBmaWZvOyAgICAgICAgICAgICAvKiB3aGF0IHRoZSBGSUZPIGlzIHVwIHRvICovCisgICAgdWNoYXIgICAgICAgICAgICBsZXZlbDI7ICAgICAgICAgICAvKiBleHRlbnQgdG8gd2hpY2ggTGV2ZWwtMiBjb21tYW5kcyBhcmUgdXNlZCAqLworICAgIHVjaGFyICAgICAgICAgICAgZGlzY29ubmVjdDsgICAgICAgLyogZGlzY29ubmVjdC9yZXNlbGVjdCBwb2xpY3kgKi8KKyAgICB1bnNpZ25lZCBpbnQgICAgIGFyZ3M7ICAgICAgICAgICAgIC8qIHNldCBmcm9tIGNvbW1hbmQtbGluZSBhcmd1bWVudCAqLworICAgIHVjaGFyICAgICAgICAgICAgaW5jb21pbmdfbXNnWzhdOyAgLyogZmlsbGVkIGR1cmluZyBtZXNzYWdlX2luIHBoYXNlICovCisgICAgaW50ICAgICAgICAgICAgICBpbmNvbWluZ19wdHI7ICAgICAvKiBtYWlubHkgdXNlZCB3aXRoIEVYVEVOREVEIG1lc3NhZ2VzICovCisgICAgdWNoYXIgICAgICAgICAgICBvdXRnb2luZ19tc2dbOF07ICAvKiBzZW5kIHRoaXMgZHVyaW5nIG5leHQgbWVzc2FnZV9vdXQgKi8KKyAgICBpbnQgICAgICAgICAgICAgIG91dGdvaW5nX2xlbjsgICAgIC8qIGxlbmd0aCBvZiBvdXRnb2luZyBtZXNzYWdlICovCisgICAgdW5zaWduZWQgaW50ICAgICBkZWZhdWx0X3N4X3BlcjsgICAvKiBkZWZhdWx0IHRyYW5zZmVyIHBlcmlvZCBmb3IgU0NTSSBidXMgKi8KKyAgICB1Y2hhciAgICAgICAgICAgIHN5bmNfeGZlcls4XTsgICAgIC8qIHN5bmNfeGZlciByZWcgc2V0dGluZ3MgcGVyIHRhcmdldCAqLworICAgIHVjaGFyICAgICAgICAgICAgc3luY19zdGF0WzhdOyAgICAgLyogc3RhdHVzIG9mIHN5bmMgbmVnb3RpYXRpb24gcGVyIHRhcmdldCAqLworICAgIHVjaGFyICAgICAgICAgICAgc3luY19vZmY7ICAgICAgICAgLyogYml0IG1hc2s6IGRvbid0IHVzZSBzeW5jIHdpdGggdGhlc2UgdGFyZ2V0cyAqLworI2lmZGVmIFBST0NfSU5URVJGQUNFCisgICAgdWNoYXIgICAgICAgICAgICBwcm9jOyAgICAgICAgICAgICAvKiBiaXQgbWFzazogd2hhdCdzIGluIHByb2Mgb3V0cHV0ICovCisjaWZkZWYgUFJPQ19TVEFUSVNUSUNTCisgICAgdW5zaWduZWQgbG9uZyAgICBjbWRfY250WzhdOyAgICAgICAvKiAjIG9mIGNvbW1hbmRzIGlzc3VlZCBwZXIgdGFyZ2V0ICovCisgICAgdW5zaWduZWQgbG9uZyAgICBpbnRfY250OyAgICAgICAgICAvKiAjIG9mIGludGVycnVwdHMgc2VydmljZWQgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgIGRpc2NfYWxsb3dlZF9jbnRbOF07IC8qICMgb2YgZGlzY29ubmVjdHMgYWxsb3dlZCBwZXIgdGFyZ2V0ICovCisgICAgdW5zaWduZWQgbG9uZyAgICBkaXNjX2RvbmVfY250WzhdOyAvKiAjIG9mIGRpc2Nvbm5lY3RzIGRvbmUgcGVyIHRhcmdldCovCisjZW5kaWYKKyNlbmRpZgorICAgIH07CisKKworLyogZGVmaW5lcyBmb3IgaG9zdGRhdGEtPmNoaXAgKi8KKworI2RlZmluZSBDX1dEMzNDOTMgICAgICAgMAorI2RlZmluZSBDX1dEMzNDOTNBICAgICAgMQorI2RlZmluZSBDX1dEMzNDOTNCICAgICAgMgorI2RlZmluZSBDX1VOS05PV05fQ0hJUCAgMTAwCisKKy8qIGRlZmluZXMgZm9yIGhvc3RkYXRhLT5zdGF0ZSAqLworCisjZGVmaW5lIFNfVU5DT05ORUNURUQgICAgICAgICAwCisjZGVmaW5lIFNfU0VMRUNUSU5HICAgICAgICAgICAxCisjZGVmaW5lIFNfUlVOTklOR19MRVZFTDIgICAgICAyCisjZGVmaW5lIFNfQ09OTkVDVEVEICAgICAgICAgICAzCisjZGVmaW5lIFNfUFJFX1RNUF9ESVNDICAgICAgICA0CisjZGVmaW5lIFNfUFJFX0NNUF9ESVNDICAgICAgICA1CisKKy8qIGRlZmluZXMgZm9yIGhvc3RkYXRhLT5maWZvICovCisKKyNkZWZpbmUgRklfRklGT19VTlVTRUQgICAgICAgIDAKKyNkZWZpbmUgRklfRklGT19SRUFESU5HICAgICAgIDEKKyNkZWZpbmUgRklfRklGT19XUklUSU5HICAgICAgIDIKKworLyogZGVmaW5lcyBmb3IgaG9zdGRhdGEtPmxldmVsMiAqLworLyogTk9URTogb25seSB0aGUgZmlyc3QgMyBhcmUgdHJ1c3R3b3J0aHkgYXQgdGhpcyBwb2ludCAtCisgKiBoYXZpbmcgdHJvdWJsZSB3aGVuIG1vcmUgdGhhbiAxIGRldmljZSBpcyByZWFkaW5nL3dyaXRpbmcKKyAqIGF0IHRoZSBzYW1lIHRpbWUuLi4KKyAqLworCisjZGVmaW5lIEwyX05PTkUgICAgICAwICAvKiBubyBjb21iaW5hdGlvbiBjb21tYW5kcyAtIHdlIGdldCBsb3RzIG9mIGludHMgKi8KKyNkZWZpbmUgTDJfU0VMRUNUICAgIDEgIC8qIHN0YXJ0IHdpdGggU0VMX0FUTl9YRkVSLCBidXQgbmV2ZXIgcmVzdW1lIGl0ICovCisjZGVmaW5lIEwyX0JBU0lDICAgICAyICAvKiByZXN1bWUgYWZ0ZXIgU1RBVFVTIGludHMgJiBSRFAgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTDJfREFUQSAgICAgIDMgIC8qIHJlc3VtZSBhZnRlciBEQVRBX0lOL09VVCBpbnRzICovCisjZGVmaW5lIEwyX01PU1QgICAgICA0ICAvKiByZXN1bWUgYWZ0ZXIgYW55dGhpbmcgZXhjZXB0IGEgUkVTRUxFQ1QgaW50ICovCisjZGVmaW5lIEwyX1JFU0VMRUNUICA1ICAvKiByZXN1bWUgYWZ0ZXIgZXZlcnl0aGluZywgaW5jbHVkaW5nIFJFU0VMRUNUIGludHMgKi8KKyNkZWZpbmUgTDJfQUxMICAgICAgIDYgIC8qIGFsd2F5cyByZXN1bWUgKi8KKworLyogZGVmaW5lcyBmb3IgaG9zdGRhdGEtPmRpc2Nvbm5lY3QgKi8KKworI2RlZmluZSBESVNfTkVWRVIgICAgMAorI2RlZmluZSBESVNfQURBUFRJVkUgMQorI2RlZmluZSBESVNfQUxXQVlTICAgMgorCisvKiBkZWZpbmVzIGZvciBob3N0ZGF0YS0+YXJncyAqLworCisjZGVmaW5lIERCX1RFU1QgICAgICAgICAgICAgICAxPDwwCisjZGVmaW5lIERCX0ZJRk8gICAgICAgICAgICAgICAxPDwxCisjZGVmaW5lIERCX1FVRVVFX0NPTU1BTkQgICAgICAxPDwyCisjZGVmaW5lIERCX0VYRUNVVEUgICAgICAgICAgICAxPDwzCisjZGVmaW5lIERCX0lOVFIgICAgICAgICAgICAgICAxPDw0CisjZGVmaW5lIERCX1RSQU5TRkVSICAgICAgICAgICAxPDw1CisjZGVmaW5lIERCX01BU0sgICAgICAgICAgICAgICAweDNmCisKKyNkZWZpbmUgQV9OT19TQ1NJX1JFU0VUICAgICAgIDE8PDE1CisKKworLyogZGVmaW5lcyBmb3IgaG9zdGRhdGEtPnN5bmNfeGZlcltdICovCisKKyNkZWZpbmUgU1NfVU5TRVQgICAgIDAKKyNkZWZpbmUgU1NfRklSU1QgICAgIDEKKyNkZWZpbmUgU1NfV0FJVElORyAgIDIKKyNkZWZpbmUgU1NfU0VUICAgICAgIDMKKworLyogZGVmaW5lcyBmb3IgaG9zdGRhdGEtPnByb2MgKi8KKworI2RlZmluZSBQUl9WRVJTSU9OICAgMTw8MAorI2RlZmluZSBQUl9JTkZPICAgICAgMTw8MQorI2RlZmluZSBQUl9TVEFUSVNUSUNTIDE8PDIKKyNkZWZpbmUgUFJfQ09OTkVDVEVEIDE8PDMKKyNkZWZpbmUgUFJfSU5QVVRRICAgIDE8PDQKKyNkZWZpbmUgUFJfRElTQ1EgICAgIDE8PDUKKyNkZWZpbmUgUFJfVEVTVCAgICAgIDE8PDYKKyNkZWZpbmUgUFJfU1RPUCAgICAgIDE8PDcKKworCisjIGluY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyMgaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyMgZGVmaW5lIGluMjAwMF9fSU5JVEZVTkMoZnVuY3Rpb24pIF9faW5pdGZ1bmMoZnVuY3Rpb24pCisjIGRlZmluZSBpbjIwMDBfX0lOSVQgX19pbml0CisjIGRlZmluZSBpbjIwMDBfX0lOSVREQVRBIF9faW5pdGRhdGEKKyMgZGVmaW5lIENMSVNQSU5fTE9DSyhob3N0LGZsYWdzKSAgIHNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpCisjIGRlZmluZSBDTElTUElOX1VOTE9DSyhob3N0LGZsYWdzKSBzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgXAorCQkJCQkJCSAgIGZsYWdzKQorCitzdGF0aWMgaW50IGluMjAwMF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICopIGluMjAwMF9fSU5JVDsKK3N0YXRpYyBpbnQgaW4yMDAwX3F1ZXVlY29tbWFuZChTY3NpX0NtbmQgKiwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSk7CitzdGF0aWMgaW50IGluMjAwMF9hYm9ydChTY3NpX0NtbmQgKik7CitzdGF0aWMgdm9pZCBpbjIwMDBfc2V0dXAoY2hhciAqLCBpbnQgKikgaW4yMDAwX19JTklUOworc3RhdGljIGludCBpbjIwMDBfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICosCisJCXNlY3Rvcl90LCBpbnQgKik7CitzdGF0aWMgaW50IGluMjAwMF9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgaW4yMDAwX2J1c19yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IGluMjAwMF9kZXZpY2VfcmVzZXQoU2NzaV9DbW5kICopOworCisKKyNkZWZpbmUgSU4yMDAwX0NBTl9RICAgIDE2CisjZGVmaW5lIElOMjAwMF9TRyAgICAgICBTR19BTEwKKyNkZWZpbmUgSU4yMDAwX0NQTCAgICAgIDIKKyNkZWZpbmUgSU4yMDAwX0hPU1RfSUQgIDcKKworI2VuZGlmIC8qIElOMjAwMF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaW5pdGlvLmMgYi9kcml2ZXJzL3Njc2kvaW5pdGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdiNzRkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pbml0aW8uYwpAQCAtMCwwICsxLDMxODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW5pdGlvIDkxMDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0LTE5OTggSW5pdGlvIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDE5OTggQmFzIFZlcm1ldWxlbiA8YnZlcm1ldWxAYmxhY2tzdGFyLnhzNGFsbC5ubD4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgaW1tZWRpYXRlbHkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBXaGVyZSB0aGlzIFNvZnR3YXJlIGlzIGNvbWJpbmVkIHdpdGggc29mdHdhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIAorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYW5kIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIHdvdWxkIHJlcXVpcmUgdGhlIAorICogY29tYmluZWQgd29yayB0byBhbHNvIGJlIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMLCB0aGUgdGVybXMKKyAqIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSB3aWxsIGFwcGx5IGluIGFkZGl0aW9uIHRvIHRob3NlIG9mIHRoZQorICogR1BMIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBhbnkgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UgdGhhdAorICogY29uZmxpY3Qgd2l0aCwgb3IgYXJlIGV4cHJlc3NseSBwcm9oaWJpdGVkIGJ5LCB0aGUgR1BMLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCisgKiBUaGlzIGlzIHRoZSBMaW51eCBsb3ctbGV2ZWwgU0NTSSBkcml2ZXIgZm9yIEluaXRpbyBJTkktOVgwMFUvVVcgU0NTSSBob3N0CisgKiBhZGFwdGVycworICoKKyAqIDA4LzA2Lzk3IGhjCS0gdjEuMDFoCisgKgkJLSBTdXBwb3J0IGluaWMtOTQwIGFuZCBpbmljLTkzNQorICogMDkvMjYvOTcgaGMJLSB2MS4wMWkKKyAqCQktIE1ha2UgY29ycmVjdGlvbiBmcm9tIEouVy4gU2NodWx0eiBzdWdnZXN0aW9uCisgKiAxMC8xMy85NyBoYwktIFN1cHBvcnQgcmVzZXQgZnVuY3Rpb24KKyAqIDEwLzIxLzk3IGhjCS0gdjEuMDFqCisgKgkJLSBTdXBwb3J0IDMyIExVTiAoU0NTSSAzKQorICogMDEvMTQvOTggaGMJLSB2MS4wMWsKKyAqCQktIEZpeCBtZW1vcnkgYWxsb2NhdGlvbiBwcm9ibGVtCisgKiAwMy8wNC85OCBoYwktIHYxLjAxbAorICoJCS0gRml4IHRhcGUgcmV3aW5kIHdoaWNoIHdpbGwgaGFuZyB0aGUgc3lzdGVtIHByb2JsZW0KKyAqCQktIFNldCBjYW5fcXVldWUgdG8gdHVsX251bV9zY2IKKyAqIDA2LzI1Lzk4IGhjCS0gdjEuMDFtCisgKgkJLSBHZXQgaXQgd29yayBmb3Iga2VybmVsIHZlcnNpb24gPj0gMi4xLjc1CisgKgkJLSBEeW5hbWljIGFzc2lnbiBTQ1NJIGJ1cyByZXNldCBob2xkaW5nIHRpbWUgaW4gaW5pdF90dWxpcCgpCisgKiAwNy8wMi85OCBoYwktIHYxLjAxbgorICoJCS0gU3VwcG9ydCAwMDAyMTM0QQorICogMDgvMDcvOTggaGMgIC0gdjEuMDFvCisgKgkJLSBDaGFuZ2UgdGhlIHR1bF9hYm9ydF9zcmIgcm91dGluZSB0byB1c2Ugc2NzaV9kb25lLiA8MDE+CisgKiAwOS8wNy85OCBobCAgLSB2MS4wMgorICogICAgICAgICAgICAgIC0gQ2hhbmdlIHRoZSBJTkk5MTAwVSBkZWZpbmUgYW5kIHByb2NfZGlyX2VudHJ5IHRvCisgKiAgICAgICAgICAgICAgICByZWZsZWN0IHRoZSBuZXdlciBLZXJuZWwgMi4xLjExOCwgYnV0IHRoZSB2MS5vMW8KKyAqICAgICAgICAgICAgICAgIHNob3VsZCB3b3JrIHdpdGggS2VybmVsIDIuMS4xMTguCisgKiAwOS8yMC85OCB3aCAgLSB2MS4wMmEKKyAqICAgICAgICAgICAgICAtIFN1cHBvcnQgQWJvcnQgY29tbWFuZC4KKyAqICAgICAgICAgICAgICAtIEhhbmRsZSByZXNldCByb3V0aW5lLgorICogMDkvMjEvOTggaGwgIC0gdjEuMDMKKyAqICAgICAgICAgICAgICAtIHJlbW92ZSBjb21tZW50cy4KKyAqIDEyLzA5Lzk4IGJ2CS0gdjEuMDNhCisgKgkJLSBSZW1vdmVkIHVudXNlZCBjb2RlCisgKiAxMi8xMy85OCBidgktIHYxLjAzYgorICoJCS0gUmVtb3ZlIGNsaSgpIGxvY2tpbmcgZm9yIGtlcm5lbHMgPj0gMi4xLjk1LiBUaGlzIHVzZXMKKyAqCQkgIHNwaW5sb2NrcyB0byBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBwU1JCX2hlYWQgYW5kCisgKgkJICBwU1JCX3RhaWwgbWVtYmVycyBvZiB0aGUgSENTIHN0cnVjdHVyZS4KKyAqIDA5LzAxLzk5IGJ2CS0gdjEuMDNkCisgKgkJLSBGaXhlZCBhIGRlYWRsb2NrIHByb2JsZW0gaW4gU01QLgorICogMjEvMDEvOTkgYnYJLSB2MS4wM2UKKyAqCQktIEFkZCBzdXBwb3J0IGZvciB0aGUgRG9tZXggMzE5MlUgUENJIFNDU0kKKyAqCQkgIFRoaXMgaXMgYSBzbGlnaHRseSBtb2RpZmllZCBwYXRjaCBieQorICoJCSAgQnJpYW4gTWFjeSA8Ym1hY3lAc3Vuc2hpbmVjb21wdXRpbmcuY29tPgorICogMjIvMDIvOTkgYnYJLSB2MS4wM2YKKyAqCQktIERpZG4ndCBkZXRlY3QgdGhlIElOSUMtOTUwIGluIDIuMC54IGNvcnJlY3RseS4KKyAqCQkgIE5vdyBmaXhlZC4KKyAqIDA1LzA3Lzk5IGJ2CS0gdjEuMDNnCisgKgkJLSBDaGFuZ2VkIHRoZSBhc3N1bXB0aW9uIHRoYXQgSFogPSAxMDAKKyAqIDEwLzE3LzAzIG1jCS0gdjEuMDQKKyAqCQktIGFkZGVkIG5ldyBETUEgQVBJIHN1cHBvcnQKKyAqIDA2LzAxLzA0IGptZAktIHYxLjA0YQorICoJCS0gUmUtYWRkIHJlc2V0X2J1cyBzdXBwb3J0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKworI2luY2x1ZGUgImluaXRpby5oIgorCisjZGVmaW5lIFNFTlNFX1NJWkUJCTE0CisKKyNkZWZpbmUgaTkxdV9NQVhRVUVVRQkJMgorI2RlZmluZSBpOTF1X1JFVklEICJJbml0aW8gSU5JLTlYMDBVL1VXIFNDU0kgZGV2aWNlIGRyaXZlcjsgUmV2aXNpb246IDEuMDRhIgorCisjZGVmaW5lIElOSV9WRU5ET1JfSUQgICAweDExMDEJLyogSW5pdGlvJ3MgUENJIHZlbmRvciBJRCAgICAgICAqLworI2RlZmluZSBETVhfVkVORE9SX0lECTB4MTM0YQkvKiBEb21leCdzIFBDSSB2ZW5kb3IgSUQJKi8KKyNkZWZpbmUgSTk1MF9ERVZJQ0VfSUQJMHg5NTAwCS8qIEluaXRpbydzIGluaWMtOTUwIHByb2R1Y3QgSUQgICAqLworI2RlZmluZSBJOTQwX0RFVklDRV9JRAkweDk0MDAJLyogSW5pdGlvJ3MgaW5pYy05NDAgcHJvZHVjdCBJRCAgICovCisjZGVmaW5lIEk5MzVfREVWSUNFX0lECTB4OTQwMQkvKiBJbml0aW8ncyBpbmljLTkzNSBwcm9kdWN0IElEICAgKi8KKyNkZWZpbmUgSTkyMF9ERVZJQ0VfSUQJMHgwMDAyCS8qIEluaXRpbydzIG90aGVyIHByb2R1Y3QgSUQgICAgICAqLworCisjaWZkZWYgREVCVUdfaTkxdQorc3RhdGljIHVuc2lnbmVkIGludCBpOTF1X2RlYnVnID0gREVCVUdfREVGQVVMVDsKKyNlbmRpZgorCisjZGVmaW5lIFRVTFNaKHN6KSAgICAgKHNpemVvZihzeikgLyBzaXplb2Yoc3pbMF0pKQorI2RlZmluZSBUVUxfUkRXT1JEKHgseSkgICAgICAgICAoc2hvcnQpKGlubCgoaW50KSgoVUxPTkcpKChVTE9ORyl4KyhVQ0hBUil5KSkgKSkKKwordHlwZWRlZiBzdHJ1Y3QgUENJX0lEX1N0cnVjIHsKKwl1bnNpZ25lZCBzaG9ydCB2ZW5kb3JfaWQ7CisJdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkOworfSBQQ0lfSUQ7CisKK3N0YXRpYyBpbnQgdHVsX251bV9jaCA9IDQ7CS8qIE1heGltdW0gNCBhZGFwdGVycyAgICAgICAgICAgKi8KK3N0YXRpYyBpbnQgdHVsX251bV9zY2I7CitzdGF0aWMgaW50IHR1bF90YWdfZW5hYmxlID0gMTsKK3N0YXRpYyBTQ0IgKnR1bF9zY2I7CisKKyNpZmRlZiBERUJVR19pOTF1CitzdGF0aWMgaW50IHNldHVwX2RlYnVnID0gMDsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpOTF1U0NCUG9zdChCWVRFICogcEhjYiwgQllURSAqIHBTY2IpOworCitzdGF0aWMgY29uc3QgUENJX0lEIGk5MXVfcGNpX2RldmljZXNbXSA9IHsKKwl7IElOSV9WRU5ET1JfSUQsIEk5NTBfREVWSUNFX0lEIH0sCisJeyBJTklfVkVORE9SX0lELCBJOTQwX0RFVklDRV9JRCB9LAorCXsgSU5JX1ZFTkRPUl9JRCwgSTkzNV9ERVZJQ0VfSUQgfSwKKwl7IElOSV9WRU5ET1JfSUQsIEk5MjBfREVWSUNFX0lEIH0sCisJeyBETVhfVkVORE9SX0lELCBJOTIwX0RFVklDRV9JRCB9LAorfTsKKworI2RlZmluZSBERUJVR19JTlRFUlJVUFQgMAorI2RlZmluZSBERUJVR19RVUVVRSAgICAgMAorI2RlZmluZSBERUJVR19TVEFURSAgICAgMAorI2RlZmluZSBJTlRfRElTQwkwCisKKy8qLS0tIGV4dGVybmFsIGZ1bmN0aW9ucyAtLSovCitzdGF0aWMgdm9pZCB0dWxfc2UyX3dhaXQodm9pZCk7CisKKy8qLS0tIGZvcndhcmQgcmVmcmVuY2UgLS0tKi8KK3N0YXRpYyBTQ0IgKnR1bF9maW5kX2J1c3lfc2NiKEhDUyAqIHBDdXJIY2IsIFdPUkQgdGFybHVuKTsKK3N0YXRpYyBTQ0IgKnR1bF9maW5kX2RvbmVfc2NiKEhDUyAqIHBDdXJIY2IpOworCitzdGF0aWMgaW50IHR1bGlwX21haW4oSENTICogcEN1ckhjYik7CisKK3N0YXRpYyBpbnQgdHVsX25leHRfc3RhdGUoSENTICogcEN1ckhjYik7CitzdGF0aWMgaW50IHR1bF9zdGF0ZV8xKEhDUyAqIHBDdXJIY2IpOworc3RhdGljIGludCB0dWxfc3RhdGVfMihIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgdHVsX3N0YXRlXzMoSENTICogcEN1ckhjYik7CitzdGF0aWMgaW50IHR1bF9zdGF0ZV80KEhDUyAqIHBDdXJIY2IpOworc3RhdGljIGludCB0dWxfc3RhdGVfNShIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgdHVsX3N0YXRlXzYoSENTICogcEN1ckhjYik7CitzdGF0aWMgaW50IHR1bF9zdGF0ZV83KEhDUyAqIHBDdXJIY2IpOworc3RhdGljIGludCB0dWxfeGZlcl9kYXRhX2luKEhDUyAqIHBDdXJIY2IpOworc3RhdGljIGludCB0dWxfeGZlcl9kYXRhX291dChIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgdHVsX3hwYWRfaW4oSENTICogcEN1ckhjYik7CitzdGF0aWMgaW50IHR1bF94cGFkX291dChIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgdHVsX3N0YXR1c19tc2coSENTICogcEN1ckhjYik7CisKK3N0YXRpYyBpbnQgdHVsX21zZ2luKEhDUyAqIHBDdXJIY2IpOworc3RhdGljIGludCB0dWxfbXNnaW5fc3luYyhIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgdHVsX21zZ2luX2FjY2VwdChIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgdHVsX21zZ291dF9yZWplY3QoSENTICogcEN1ckhjYik7CitzdGF0aWMgaW50IHR1bF9tc2dpbl9leHRlbmQoSENTICogcEN1ckhjYik7CisKK3N0YXRpYyBpbnQgdHVsX21zZ291dF9pZGUoSENTICogcEN1ckhjYik7CitzdGF0aWMgaW50IHR1bF9tc2dvdXRfYWJvcnRfdGFyZyhIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgdHVsX21zZ291dF9hYm9ydF90YWcoSENTICogcEN1ckhjYik7CisKK3N0YXRpYyBpbnQgdHVsX2J1c19kZXZpY2VfcmVzZXQoSENTICogcEN1ckhjYik7CitzdGF0aWMgdm9pZCB0dWxfc2VsZWN0X2F0bihIQ1MgKiBwQ3VySGNiLCBTQ0IgKiBwQ3VyU2NiKTsKK3N0YXRpYyB2b2lkIHR1bF9zZWxlY3RfYXRuMyhIQ1MgKiBwQ3VySGNiLCBTQ0IgKiBwQ3VyU2NiKTsKK3N0YXRpYyB2b2lkIHR1bF9zZWxlY3RfYXRuX3N0b3AoSENTICogcEN1ckhjYiwgU0NCICogcEN1clNjYik7CitzdGF0aWMgaW50IGludF90dWxfYnVzZnJlZShIQ1MgKiBwQ3VySGNiKTsKK2ludCBpbnRfdHVsX3Njc2lfcnN0KEhDUyAqIHBDdXJIY2IpOworc3RhdGljIGludCBpbnRfdHVsX2JhZF9zZXEoSENTICogcEN1ckhjYik7CitzdGF0aWMgaW50IGludF90dWxfcmVzZWwoSENTICogcEN1ckhjYik7CitzdGF0aWMgaW50IHR1bF9zeW5jX2RvbmUoSENTICogcEN1ckhjYik7CitzdGF0aWMgaW50IHdkdHJfZG9uZShIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgd2FpdF90dWxpcChIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgdHVsX3dhaXRfZG9uZV9kaXNjKEhDUyAqIHBDdXJIY2IpOworc3RhdGljIGludCB0dWxfd2FpdF9kaXNjKEhDUyAqIHBDdXJIY2IpOworc3RhdGljIHZvaWQgdHVsaXBfc2NzaShIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgdHVsX3Bvc3Rfc2NzaV9yc3QoSENTICogcEN1ckhjYik7CisKK3N0YXRpYyB2b2lkIHR1bF9zZTJfZXdfZW4oV09SRCBDdXJCYXNlKTsKK3N0YXRpYyB2b2lkIHR1bF9zZTJfZXdfZHMoV09SRCBDdXJCYXNlKTsKK3N0YXRpYyBpbnQgdHVsX3NlMl9yZF9hbGwoV09SRCBDdXJCYXNlKTsKK3N0YXRpYyB2b2lkIHR1bF9zZTJfdXBkYXRlX2FsbChXT1JEIEN1ckJhc2UpOwkvKiBzZXR1cCBkZWZhdWx0IHBhdHRlcm4gKi8KK3N0YXRpYyB2b2lkIHR1bF9yZWFkX2VlcHJvbShXT1JEIEN1ckJhc2UpOworCisJCQkJLyogLS0tLSBFWFRFUk5BTCBWQVJJQUJMRVMgLS0tLSAqLworSENTIHR1bF9oY3NbTUFYX1NVUFBPUlRFRF9BREFQVEVSU107CisJCQkJLyogLS0tLSBJTlRFUk5BTCBWQVJJQUJMRVMgLS0tLSAqLworc3RhdGljIElOSV9BRFBUX1NUUlVDVCBpOTF1X2FkcHRbTUFYX1NVUFBPUlRFRF9BREFQVEVSU107CisKKy8qTlZSQU0gbnZyYW0sICpudnJhbXAgPSAmbnZyYW07ICovCitzdGF0aWMgTlZSQU0gaTkxdW52cmFtOworc3RhdGljIE5WUkFNICppOTF1bnZyYW1wOworCisKKworc3RhdGljIFVDSEFSIGk5MXVkZnROdlJhbVs2NF0gPQoreworLyotLS0tLS0tLS0tLSBoZWFkZXIgLS0tLS0tLS0tLS0qLworCTB4MjUsIDB4YzksCQkvKiBTaWduYXR1cmUgICAgKi8KKwkweDQwLAkJCS8qIFNpemUgICAgICAgICAqLworCTB4MDEsCQkJLyogUmV2aXNpb24gICAgICovCisJLyogLS0gSG9zdCBBZGFwdGVyIFN0cnVjdHVyZSAtLSAqLworCTB4OTUsCQkJLyogTW9kZWxCeXRlMCAgICovCisJMHgwMCwJCQkvKiBNb2RlbEJ5dGUxICAgKi8KKwkweDAwLAkJCS8qIE1vZGVsSW5mbyAgICAqLworCTB4MDEsCQkJLyogTnVtT2ZDaCAgICAgICovCisJTkJDMV9ERUZBVUxULAkJLyogQklPU0NvbmZpZzEgICovCisJMCwJCQkvKiBCSU9TQ29uZmlnMiAgKi8KKwkwLAkJCS8qIEhBQ29uZmlnMSAgICAqLworCTAsCQkJLyogSEFDb25maWcyICAgICovCisJLyogU0NTSSBjaGFubmVsIDAgYW5kIHRhcmdldCBTdHJ1Y3R1cmUgICovCisJNywJCQkvKiBTQ1NJaWQgICAgICAgKi8KKwlOQ0MxX0RFRkFVTFQsCQkvKiBTQ1NJY29uZmlnMSAgKi8KKwkwLAkJCS8qIFNDU0ljb25maWcyICAqLworCTB4MTAsCQkJLyogTnVtU0NTSXRhcmdldCAqLworCisJTlRDX0RFRkFVTFQsIE5UQ19ERUZBVUxULCBOVENfREVGQVVMVCwgTlRDX0RFRkFVTFQsCisJTlRDX0RFRkFVTFQsIE5UQ19ERUZBVUxULCBOVENfREVGQVVMVCwgTlRDX0RFRkFVTFQsCisJTlRDX0RFRkFVTFQsIE5UQ19ERUZBVUxULCBOVENfREVGQVVMVCwgTlRDX0RFRkFVTFQsCisJTlRDX0RFRkFVTFQsIE5UQ19ERUZBVUxULCBOVENfREVGQVVMVCwgTlRDX0RFRkFVTFQsCisKKwkvKiBTQ1NJIGNoYW5uZWwgMSBhbmQgdGFyZ2V0IFN0cnVjdHVyZSAgKi8KKwk3LAkJCS8qIFNDU0lpZCAgICAgICAqLworCU5DQzFfREVGQVVMVCwJCS8qIFNDU0ljb25maWcxICAqLworCTAsCQkJLyogU0NTSWNvbmZpZzIgICovCisJMHgxMCwJCQkvKiBOdW1TQ1NJdGFyZ2V0ICovCisKKwlOVENfREVGQVVMVCwgTlRDX0RFRkFVTFQsIE5UQ19ERUZBVUxULCBOVENfREVGQVVMVCwKKwlOVENfREVGQVVMVCwgTlRDX0RFRkFVTFQsIE5UQ19ERUZBVUxULCBOVENfREVGQVVMVCwKKwlOVENfREVGQVVMVCwgTlRDX0RFRkFVTFQsIE5UQ19ERUZBVUxULCBOVENfREVGQVVMVCwKKwlOVENfREVGQVVMVCwgTlRDX0RFRkFVTFQsIE5UQ19ERUZBVUxULCBOVENfREVGQVVMVCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDB9OwkJCS8qICAgICAgLSBDaGVja1N1bSAtICAgICAgICAgICAgKi8KKworCitzdGF0aWMgVUNIQVIgdHVsX3JhdGVfdGJsWzhdID0JLyogZmFzdCAyMCAgICAgICovCit7CisJCQkJLyogbmFub3NlY29uZCBkZXZpZGUgYnkgNCAqLworCTEyLAkJCS8qIDUwbnMsICAyME0gICAqLworCTE4LAkJCS8qIDc1bnMsICAxMy4zTSAqLworCTI1LAkJCS8qIDEwMG5zLCAxME0gICAqLworCTMxLAkJCS8qIDEyNW5zLCA4TSAgICAqLworCTM3LAkJCS8qIDE1MG5zLCA2LjZNICAqLworCTQzLAkJCS8qIDE3NW5zLCA1LjdNICAqLworCTUwLAkJCS8qIDIwMG5zLCA1TSAgICAqLworCTYyCQkJLyogMjUwbnMsIDRNICAgICovCit9OworCitzdGF0aWMgdm9pZCB0dWxfZG9fcGF1c2UodW5zaWduZWQgYW1vdW50KQorewkJCQkvKiBQYXVzZSBmb3IgYW1vdW50IGppZmZpZXMgKi8KKwl1bnNpZ25lZCBsb25nIHRoZV90aW1lID0gamlmZmllcyArIGFtb3VudDsKKworCXdoaWxlICh0aW1lX2JlZm9yZV9lcShqaWZmaWVzLCB0aGVfdGltZSkpOworfQorCisvKi0tIGZvcndhcmQgcmVmZXJlbmNlIC0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlVc2UgbWVtZW9yeSByZWZyZXNoIHRpbWUgICAgICAgIH4gMTV1cyAqIDIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0dWxfc2UyX3dhaXQodm9pZCkKK3sKKyNpZiAxCisJdWRlbGF5KDMwKTsKKyNlbHNlCisJVUNIQVIgcmVhZEJ5dGU7CisKKwlyZWFkQnl0ZSA9IFRVTF9SRCgwLCAweDYxKTsKKwlpZiAoKHJlYWRCeXRlICYgMHgxMCkgPT0gMHgxMCkgeworCQlmb3IgKDs7KSB7CisJCQlyZWFkQnl0ZSA9IFRVTF9SRCgwLCAweDYxKTsKKwkJCWlmICgocmVhZEJ5dGUgJiAweDEwKSA9PSAweDEwKQorCQkJCWJyZWFrOworCQl9CisJCWZvciAoOzspIHsKKwkJCXJlYWRCeXRlID0gVFVMX1JEKDAsIDB4NjEpOworCQkJaWYgKChyZWFkQnl0ZSAmIDB4MTApICE9IDB4MTApCisJCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKDs7KSB7CisJCQlyZWFkQnl0ZSA9IFRVTF9SRCgwLCAweDYxKTsKKwkJCWlmICgocmVhZEJ5dGUgJiAweDEwKSA9PSAweDEwKQorCQkJCWJyZWFrOworCQl9CisJCWZvciAoOzspIHsKKwkJCXJlYWRCeXRlID0gVFVMX1JEKDAsIDB4NjEpOworCQkJaWYgKChyZWFkQnl0ZSAmIDB4MTApICE9IDB4MTApCisJCQkJYnJlYWs7CisJCX0KKwl9CisjZW5kaWYKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgSW5wdXQ6IGluc3RydWN0aW9uIGZvciAgU2VyaWFsIEUyUFJPTQorCisgRVg6IHNlMl9yZCgwIGNhbGwgc2UyX2luc3RyKCkgdG8gc2VuZCBhZGRyZXNzIGFuZCByZWFkIGNvbW1hbmQKKworCSBTdGFydEJpdCAgT1BfQ29kZSAgIEFkZHJlc3MgICAgICAgICAgICAgICAgRGF0YQorCSAtLS0tLS0tLS0gLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLSAgICAgLS0tLS0tLQorCSAxICAgICAgICAgMSAsIDAgICAgIEE1LEE0LEEzLEEyLEExLEEwICAgICAgRDE1LUQwCisKKwkJICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkgfAorIENTIC0tLS0tKworCQkJKy0tKyAgKy0tKyAgKy0tKyAgKy0tKyAgKy0tKworCQkJXiAgfCAgXiAgfCAgXiAgfCAgXiAgfCAgXiAgfAorCQkJfCAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfAorIENMSyAtLS0tLS0tKyAgKy0tKyAgKy0tKyAgKy0tKyAgKy0tKyAgKy0tCisgKGxlYWRpbmcgZWRnZSB0cmlnZ2VyKQorCisJCSArLS0xLS0tLS0xLS0rCisJCSB8IFNCICAgIE9QICB8ICBPUCAgICBBNSAgICBBNAorIERJICAtLS0tKyAgICAgICAgICAgKy0tMC0tLS0tLS0tLS0tLS0tLS0tLQorIChhZGRyZXNzIGFuZCBjbWQgc2VudCB0byBudnJhbSkKKworCSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQkJCQkJCQkJCQkJfAorIERPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLQorIChkYXRhIHNlbnQgZnJvbSBudnJhbSkKKworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHR1bF9zZTJfaW5zdHIoV09SRCBDdXJCYXNlLCBVQ0hBUiBpbnN0cikKK3sKKwlpbnQgaTsKKwlVQ0hBUiBiOworCisJVFVMX1dSKEN1ckJhc2UgKyBUVUxfTlZSQU0sIFNFMkNTIHwgU0UyRE8pOwkvKiBjcytzdGFydCBiaXQgKi8KKwl0dWxfc2UyX3dhaXQoKTsKKwlUVUxfV1IoQ3VyQmFzZSArIFRVTF9OVlJBTSwgU0UyQ1MgfCBTRTJDTEsgfCBTRTJETyk7CS8qICtDTEsgKi8KKwl0dWxfc2UyX3dhaXQoKTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKGluc3RyICYgMHg4MCkKKwkJCWIgPSBTRTJDUyB8IFNFMkRPOwkvKiAtQ0xLK2RhdGFCaXQgKi8KKwkJZWxzZQorCQkJYiA9IFNFMkNTOwkvKiAtQ0xLICovCisJCVRVTF9XUihDdXJCYXNlICsgVFVMX05WUkFNLCBiKTsKKwkJdHVsX3NlMl93YWl0KCk7CisJCVRVTF9XUihDdXJCYXNlICsgVFVMX05WUkFNLCBiIHwgU0UyQ0xLKTsJLyogK0NMSyAqLworCQl0dWxfc2UyX3dhaXQoKTsKKwkJaW5zdHIgPDw9IDE7CisJfQorCVRVTF9XUihDdXJCYXNlICsgVFVMX05WUkFNLCBTRTJDUyk7CS8qIC1DTEsgKi8KKwl0dWxfc2UyX3dhaXQoKTsKKwlyZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9uIG5hbWUgIDogdHVsX3NlMl9ld19lbgorIERlc2NyaXB0aW9uICAgIDogRW5hYmxlIGVyYXNlL3dyaXRlIHN0YXRlIG9mIHNlcmlhbCBFRVBST00KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHVsX3NlMl9ld19lbihXT1JEIEN1ckJhc2UpCit7CisJdHVsX3NlMl9pbnN0cihDdXJCYXNlLCAweDMwKTsJLyogRVdFTiAqLworCVRVTF9XUihDdXJCYXNlICsgVFVMX05WUkFNLCAwKTsJCS8qIC1DUyAgKi8KKwl0dWxfc2UyX3dhaXQoKTsKKwlyZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIERpc2FibGUgZXJhc2Uvd3JpdGUgc3RhdGUgb2Ygc2VyaWFsIEVFUFJPTQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHVsX3NlMl9ld19kcyhXT1JEIEN1ckJhc2UpCit7CisJdHVsX3NlMl9pbnN0cihDdXJCYXNlLCAwKTsJLyogRVdEUyAqLworCVRVTF9XUihDdXJCYXNlICsgVFVMX05WUkFNLCAwKTsJCS8qIC1DUyAgKi8KKwl0dWxfc2UyX3dhaXQoKTsKKwlyZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCUlucHV0ICA6YWRkcmVzcyBvZiBTZXJpYWwgRTJQUk9NCisJT3V0cHV0IDp2YWx1ZSBzdG9yZWQgaW4gIFNlcmlhbCBFMlBST00KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitVU0hPUlQgdHVsX3NlMl9yZChXT1JEIEN1ckJhc2UsIFVMT05HIGFkcikKK3sKKwlVQ0hBUiBpbnN0ciwgcmVhZEJ5dGU7CisJVVNIT1JUIHJlYWRXb3JkOworCWludCBpOworCisJaW5zdHIgPSAoVUNIQVIpIChhZHIgfCAweDgwKTsKKwl0dWxfc2UyX2luc3RyKEN1ckJhc2UsIGluc3RyKTsJLyogUkVBRCBJTlNUUiAqLworCXJlYWRXb3JkID0gMDsKKworCWZvciAoaSA9IDE1OyBpID49IDA7IGktLSkgeworCQlUVUxfV1IoQ3VyQmFzZSArIFRVTF9OVlJBTSwgU0UyQ1MgfCBTRTJDTEspOwkvKiArQ0xLICovCisJCXR1bF9zZTJfd2FpdCgpOworCQlUVUxfV1IoQ3VyQmFzZSArIFRVTF9OVlJBTSwgU0UyQ1MpOwkvKiAtQ0xLICovCisKKwkJLyogc2FtcGxlIGRhdGEgYWZ0ZXIgdGhlIGZvbGxvd2luZyBlZGdlIG9mIGNsb2NrICAqLworCQlyZWFkQnl0ZSA9IFRVTF9SRChDdXJCYXNlLCBUVUxfTlZSQU0pOworCQlyZWFkQnl0ZSAmPSBTRTJESTsKKwkJcmVhZFdvcmQgKz0gKHJlYWRCeXRlIDw8IGkpOworCQl0dWxfc2UyX3dhaXQoKTsJLyogNi8yMC85NSAqLworCX0KKworCVRVTF9XUihDdXJCYXNlICsgVFVMX05WUkFNLCAwKTsJCS8qIG5vIGNoaXAgc2VsZWN0ICovCisJdHVsX3NlMl93YWl0KCk7CisJcmV0dXJuIHJlYWRXb3JkOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBJbnB1dDogbmV3IHZhbHVlIGluICBTZXJpYWwgRTJQUk9NLCBhZGRyZXNzIG9mIFNlcmlhbCBFMlBST00KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHR1bF9zZTJfd3IoV09SRCBDdXJCYXNlLCBVQ0hBUiBhZHIsIFVTSE9SVCB3cml0ZVdvcmQpCit7CisJVUNIQVIgcmVhZEJ5dGU7CisJVUNIQVIgaW5zdHI7CisJaW50IGk7CisKKwlpbnN0ciA9IChVQ0hBUikgKGFkciB8IDB4NDApOworCXR1bF9zZTJfaW5zdHIoQ3VyQmFzZSwgaW5zdHIpOwkvKiBXUklURSBJTlNUUiAqLworCWZvciAoaSA9IDE1OyBpID49IDA7IGktLSkgeworCQlpZiAod3JpdGVXb3JkICYgMHg4MDAwKQorCQkJVFVMX1dSKEN1ckJhc2UgKyBUVUxfTlZSQU0sIFNFMkNTIHwgU0UyRE8pOwkvKiAtQ0xLK2RhdGFCaXQgMSAqLworCQllbHNlCisJCQlUVUxfV1IoQ3VyQmFzZSArIFRVTF9OVlJBTSwgU0UyQ1MpOwkvKiAtQ0xLK2RhdGFCaXQgMCAqLworCQl0dWxfc2UyX3dhaXQoKTsKKwkJVFVMX1dSKEN1ckJhc2UgKyBUVUxfTlZSQU0sIFNFMkNTIHwgU0UyQ0xLKTsJLyogK0NMSyAqLworCQl0dWxfc2UyX3dhaXQoKTsKKwkJd3JpdGVXb3JkIDw8PSAxOworCX0KKwlUVUxfV1IoQ3VyQmFzZSArIFRVTF9OVlJBTSwgU0UyQ1MpOwkvKiAtQ0xLICovCisJdHVsX3NlMl93YWl0KCk7CisJVFVMX1dSKEN1ckJhc2UgKyBUVUxfTlZSQU0sIDApOwkJLyogLUNTICAqLworCXR1bF9zZTJfd2FpdCgpOworCisJVFVMX1dSKEN1ckJhc2UgKyBUVUxfTlZSQU0sIFNFMkNTKTsJLyogK0NTICAqLworCXR1bF9zZTJfd2FpdCgpOworCisJZm9yICg7OykgeworCQlUVUxfV1IoQ3VyQmFzZSArIFRVTF9OVlJBTSwgU0UyQ1MgfCBTRTJDTEspOwkvKiArQ0xLICovCisJCXR1bF9zZTJfd2FpdCgpOworCQlUVUxfV1IoQ3VyQmFzZSArIFRVTF9OVlJBTSwgU0UyQ1MpOwkvKiAtQ0xLICovCisJCXR1bF9zZTJfd2FpdCgpOworCQlpZiAoKHJlYWRCeXRlID0gVFVMX1JEKEN1ckJhc2UsIFRVTF9OVlJBTSkpICYgU0UyREkpCisJCQlicmVhazsJLyogd3JpdGUgY29tcGxldGUgKi8KKwl9CisJVFVMX1dSKEN1ckJhc2UgKyBUVUxfTlZSQU0sIDApOwkJLyogLUNTICovCisJcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFJlYWQgU0NTSSBIL0EgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZyb20gc2VyaWFsIEVFUFJPTQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHR1bF9zZTJfcmRfYWxsKFdPUkQgQ3VyQmFzZSkKK3sKKwlpbnQgaTsKKwlVTE9ORyBjaGtzdW0gPSAwOworCVVTSE9SVCAqbnA7CisKKwlpOTF1bnZyYW1wID0gJmk5MXVudnJhbTsKKwlucCA9IChVU0hPUlQgKikgaTkxdW52cmFtcDsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQkqbnArKyA9IHR1bF9zZTJfcmQoQ3VyQmFzZSwgaSk7CisJfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tSXMgc2lnbmF0dXJlICJpbmkiIG9rID8gLS0tLS0tLS0tLS0tLS0tLSovCisJaWYgKGk5MXVudnJhbXAtPk5WTV9TaWduYXR1cmUgIT0gSU5JX1NJR05BVFVSRSkKKwkJcmV0dXJuIC0xOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElzIGNrZWNrc3VtIG9rID8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbnAgPSAoVVNIT1JUICopIGk5MXVudnJhbXA7CisJZm9yIChpID0gMDsgaSA8IDMxOyBpKyspCisJCWNoa3N1bSArPSAqbnArKzsKKwlpZiAoaTkxdW52cmFtcC0+TlZNX0NoZWNrU3VtICE9IChVU0hPUlQpIGNoa3N1bSkKKwkJcmV0dXJuIC0xOworCXJldHVybiAxOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFVwZGF0ZSBTQ1NJIEgvQSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZnJvbSBzZXJpYWwgRUVQUk9NCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHR1bF9zZTJfdXBkYXRlX2FsbChXT1JEIEN1ckJhc2UpCit7CQkJCS8qIHNldHVwIGRlZmF1bHQgcGF0dGVybiAqLworCWludCBpOworCVVMT05HIGNoa3N1bSA9IDA7CisJVVNIT1JUICpucCwgKm5wMTsKKworCWk5MXVudnJhbXAgPSAmaTkxdW52cmFtOworCS8qIENhbGN1bGF0ZSBjaGVja3N1bSBmaXJzdCAqLworCW5wID0gKFVTSE9SVCAqKSBpOTF1ZGZ0TnZSYW07CisJZm9yIChpID0gMDsgaSA8IDMxOyBpKyspCisJCWNoa3N1bSArPSAqbnArKzsKKwkqbnAgPSAoVVNIT1JUKSBjaGtzdW07CisJdHVsX3NlMl9ld19lbihDdXJCYXNlKTsJLyogRW5hYmxlIHdyaXRlICAqLworCisJbnAgPSAoVVNIT1JUICopIGk5MXVkZnROdlJhbTsKKwlucDEgPSAoVVNIT1JUICopIGk5MXVudnJhbXA7CisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyssIG5wKyssIG5wMSsrKSB7CisJCWlmICgqbnAgIT0gKm5wMSkgeworCQkJdHVsX3NlMl93cihDdXJCYXNlLCBpLCAqbnApOworCQl9CisJfQorCisJdHVsX3NlMl9ld19kcyhDdXJCYXNlKTsJLyogRGlzYWJsZSB3cml0ZSAgICovCisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9uIG5hbWUgIDogcmVhZF9lZXByb20KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0dWxfcmVhZF9lZXByb20oV09SRCBDdXJCYXNlKQoreworCVVDSEFSIGdjdHJsOworCisJaTkxdW52cmFtcCA9ICZpOTF1bnZyYW07CisvKi0tLS0tLUVuYWJsZSBFRVByb20gcHJvZ3JhbW1pbmcgLS0tKi8KKwlnY3RybCA9IFRVTF9SRChDdXJCYXNlLCBUVUxfR0NUUkwpOworCVRVTF9XUihDdXJCYXNlICsgVFVMX0dDVFJMLCBnY3RybCB8IFRVTF9HQ1RSTF9FRVBST01fQklUKTsKKwlpZiAodHVsX3NlMl9yZF9hbGwoQ3VyQmFzZSkgIT0gMSkgeworCQl0dWxfc2UyX3VwZGF0ZV9hbGwoQ3VyQmFzZSk7CS8qIHNldHVwIGRlZmF1bHQgcGF0dGVybiAqLworCQl0dWxfc2UyX3JkX2FsbChDdXJCYXNlKTsJLyogbG9hZCBhZ2FpbiAgKi8KKwl9CisvKi0tLS0tLSBEaXNhYmxlIEVFUHJvbSBwcm9ncmFtbWluZyAtLS0qLworCWdjdHJsID0gVFVMX1JEKEN1ckJhc2UsIFRVTF9HQ1RSTCk7CisJVFVMX1dSKEN1ckJhc2UgKyBUVUxfR0NUUkwsIGdjdHJsICYgflRVTF9HQ1RSTF9FRVBST01fQklUKTsKK30JCQkJLyogcmVhZF9lZXByb20gKi8KKworaW50IEFkZGk5MXVfaW50b19BZGFwdGVyX3RhYmxlKFdPUkQgd0JJT1MsIFdPUkQgd0JBU0UsIEJZVEUgYkludGVycnVwdCwKKwkJCSAgICAgICBCWVRFIGJCdXMsIEJZVEUgYkRldmljZSkKK3sKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfU1VQUE9SVEVEX0FEQVBURVJTOyBpKyspIHsKKwkJaWYgKGk5MXVfYWRwdFtpXS5BRFBUX0JJT1MgPCB3QklPUykKKwkJCWNvbnRpbnVlOworCQlpZiAoaTkxdV9hZHB0W2ldLkFEUFRfQklPUyA9PSB3QklPUykgeworCQkJaWYgKGk5MXVfYWRwdFtpXS5BRFBUX0JBU0UgPT0gd0JBU0UpIHsKKwkJCQlpZiAoaTkxdV9hZHB0W2ldLkFEUFRfQnVzICE9IDB4RkYpCisJCQkJCXJldHVybiAxOworCQkJfSBlbHNlIGlmIChpOTF1X2FkcHRbaV0uQURQVF9CQVNFIDwgd0JBU0UpCisJCQkJCWNvbnRpbnVlOworCQl9CisJCWZvciAoaiA9IE1BWF9TVVBQT1JURURfQURBUFRFUlMgLSAxOyBqID4gaTsgai0tKSB7CisJCQlpOTF1X2FkcHRbal0uQURQVF9CQVNFID0gaTkxdV9hZHB0W2ogLSAxXS5BRFBUX0JBU0U7CisJCQlpOTF1X2FkcHRbal0uQURQVF9JTlRSID0gaTkxdV9hZHB0W2ogLSAxXS5BRFBUX0lOVFI7CisJCQlpOTF1X2FkcHRbal0uQURQVF9CSU9TID0gaTkxdV9hZHB0W2ogLSAxXS5BRFBUX0JJT1M7CisJCQlpOTF1X2FkcHRbal0uQURQVF9CdXMgPSBpOTF1X2FkcHRbaiAtIDFdLkFEUFRfQnVzOworCQkJaTkxdV9hZHB0W2pdLkFEUFRfRGV2aWNlID0gaTkxdV9hZHB0W2ogLSAxXS5BRFBUX0RldmljZTsKKwkJfQorCQlpOTF1X2FkcHRbaV0uQURQVF9CQVNFID0gd0JBU0U7CisJCWk5MXVfYWRwdFtpXS5BRFBUX0lOVFIgPSBiSW50ZXJydXB0OworCQlpOTF1X2FkcHRbaV0uQURQVF9CSU9TID0gd0JJT1M7CisJCWk5MXVfYWRwdFtpXS5BRFBUX0J1cyA9IGJCdXM7CisJCWk5MXVfYWRwdFtpXS5BRFBUX0RldmljZSA9IGJEZXZpY2U7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKwordm9pZCBpbml0X2k5MXVBZGFwdGVyX3RhYmxlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1NVUFBPUlRFRF9BREFQVEVSUzsgaSsrKSB7CS8qIEluaXRpYWxpemUgYWRhcHRlciBzdHJ1Y3R1cmUgKi8KKwkJaTkxdV9hZHB0W2ldLkFEUFRfQklPUyA9IDB4ZmZmZjsKKwkJaTkxdV9hZHB0W2ldLkFEUFRfQkFTRSA9IDB4ZmZmZjsKKwkJaTkxdV9hZHB0W2ldLkFEUFRfSU5UUiA9IDB4ZmY7CisJCWk5MXVfYWRwdFtpXS5BRFBUX0J1cyA9IDB4ZmY7CisJCWk5MXVfYWRwdFtpXS5BRFBUX0RldmljZSA9IDB4ZmY7CisJfQorCXJldHVybjsKK30KKwordm9pZCB0dWxfc3RvcF9ibShIQ1MgKiBwQ3VySGNiKQoreworCisJaWYgKFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1hTdGF0dXMpICYgWFBFTkQpIHsJLyogaWYgRE1BIHhmZXIgaXMgcGVuZGluZywgYWJvcnQgRE1BIHhmZXIgKi8KKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1hDbWQsIFRBWF9YX0FCVCB8IFRBWF9YX0NMUl9GSUZPKTsKKwkJLyogd2FpdCBBYm9ydCBETUEgeGZlciBkb25lICovCisJCXdoaWxlICgoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfSW50KSAmIFhBQlQpID09IDApOworCX0KKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwwLCBUU0NfRkxVU0hfRklGTyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGdldF90dWxpcFBDSUNvbmZpZyhIQ1MgKiBwQ3VySGNiLCBpbnQgY2hfaWR4KQoreworCXBDdXJIY2ItPkhDU19CYXNlID0gaTkxdV9hZHB0W2NoX2lkeF0uQURQVF9CQVNFOwkvKiBTdXBwbHkgYmFzZSBhZGRyZXNzICAqLworCXBDdXJIY2ItPkhDU19CSU9TID0gaTkxdV9hZHB0W2NoX2lkeF0uQURQVF9CSU9TOwkvKiBTdXBwbHkgQklPUyBhZGRyZXNzICAqLworCXBDdXJIY2ItPkhDU19JbnRyID0gaTkxdV9hZHB0W2NoX2lkeF0uQURQVF9JTlRSOwkvKiBTdXBwbHkgaW50ZXJydXB0IGxpbmUgKi8KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdHVsX3Jlc2V0X3Njc2koSENTICogcEN1ckhjYiwgaW50IHNlY29uZHMpCit7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDdHJsMCwgVFNDX1JTVF9CVVMpOworCisJd2hpbGUgKCEoKHBDdXJIY2ItPkhDU19KU0ludCA9IFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NJbnQpKSAmIFRTU19TQ1NJUlNUX0lOVCkpOworCS8qIHJlc2V0IHR1bGlwIGNoaXAgKi8KKworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TU2lnbmFsLCAwKTsKKworCS8qIFN0YWxsIGZvciBhIHdoaWxlLCB3YWl0IGZvciB0YXJnZXQncyBmaXJtd2FyZSByZWFkeSxtYWtlIGl0IDIgc2VjICEgKi8KKwkvKiBTT05ZIDUyMDAgdGFwZSBkcml2ZSB3b24ndCB3b3JrIGlmIG9ubHkgc3RhbGwgZm9yIDEgc2VjICovCisJdHVsX2RvX3BhdXNlKHNlY29uZHMgKiBIWik7CisKKwlUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TSW50KTsKKworCXJldHVybiAoU0NTSV9SRVNFVF9TVUNDRVNTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBpbml0X3R1bGlwKEhDUyAqIHBDdXJIY2IsIFNDQiAqIHNjYnAsIGludCB0dWxfbnVtX3NjYiwgQllURSAqIHBiQmlvc0FkciwgaW50IHNlY29uZHMpCit7CisJaW50IGk7CisJQllURSAqcHdGbGFnczsKKwlCWVRFICpwYkhlYWRzOworCVNDQiAqcFRtcFNjYiwgKnBQcmV2U2NiID0gTlVMTDsKKworCXBDdXJIY2ItPkhDU19OdW1TY2JzID0gdHVsX251bV9zY2I7CisJcEN1ckhjYi0+SENTX1NlbWFwaCA9IDE7CisJc3Bpbl9sb2NrX2luaXQoJnBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKTsKKwlwQ3VySGNiLT5IQ1NfSlNTdGF0dXMwID0gMDsKKwlwQ3VySGNiLT5IQ1NfU2NiID0gc2NicDsKKwlwQ3VySGNiLT5IQ1NfTnh0UGVuZCA9IHNjYnA7CisJcEN1ckhjYi0+SENTX054dEF2YWlsID0gc2NicDsKKwlmb3IgKGkgPSAwLCBwVG1wU2NiID0gc2NicDsgaSA8IHR1bF9udW1fc2NiOyBpKyssIHBUbXBTY2IrKykgeworCQlwVG1wU2NiLT5TQ0JfVGFnSWQgPSBpOworCQlpZiAoaSAhPSAwKQorCQkJcFByZXZTY2ItPlNDQl9OeHRTY2IgPSBwVG1wU2NiOworCQlwUHJldlNjYiA9IHBUbXBTY2I7CisJfQorCXBQcmV2U2NiLT5TQ0JfTnh0U2NiID0gTlVMTDsKKwlwQ3VySGNiLT5IQ1NfU2NiRW5kID0gcFRtcFNjYjsKKwlwQ3VySGNiLT5IQ1NfRmlyc3RBdmFpbCA9IHNjYnA7CisJcEN1ckhjYi0+SENTX0xhc3RBdmFpbCA9IHBQcmV2U2NiOworCXNwaW5fbG9ja19pbml0KCZwQ3VySGNiLT5IQ1NfQXZhaWxMb2NrKTsKKwlwQ3VySGNiLT5IQ1NfRmlyc3RQZW5kID0gTlVMTDsKKwlwQ3VySGNiLT5IQ1NfTGFzdFBlbmQgPSBOVUxMOworCXBDdXJIY2ItPkhDU19GaXJzdEJ1c3kgPSBOVUxMOworCXBDdXJIY2ItPkhDU19MYXN0QnVzeSA9IE5VTEw7CisJcEN1ckhjYi0+SENTX0ZpcnN0RG9uZSA9IE5VTEw7CisJcEN1ckhjYi0+SENTX0xhc3REb25lID0gTlVMTDsKKwlwQ3VySGNiLT5IQ1NfQWN0U2NiID0gTlVMTDsKKwlwQ3VySGNiLT5IQ1NfQWN0VGNzID0gTlVMTDsKKworCXR1bF9yZWFkX2VlcHJvbShwQ3VySGNiLT5IQ1NfQmFzZSk7CisvKi0tLS0tLS0tLS0gZ2V0IEgvQSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0qLworCWlmIChpOTF1bnZyYW1wLT5OVk1fU0NTSUluZm9bMF0uTlZNX051bU9mVGFyZyA9PSA4KQorCQlwQ3VySGNiLT5IQ1NfTWF4VGFyID0gODsKKwllbHNlCisJCXBDdXJIY2ItPkhDU19NYXhUYXIgPSAxNjsKKworCXBDdXJIY2ItPkhDU19Db25maWcgPSBpOTF1bnZyYW1wLT5OVk1fU0NTSUluZm9bMF0uTlZNX0NoQ29uZmlnMTsKKworCXBDdXJIY2ItPkhDU19TQ1NJX0lEID0gaTkxdW52cmFtcC0+TlZNX1NDU0lJbmZvWzBdLk5WTV9DaFNDU0lJRDsKKwlwQ3VySGNiLT5IQ1NfSWRNYXNrID0gfigxIDw8IHBDdXJIY2ItPkhDU19TQ1NJX0lEKTsKKworI2lmIENIS19QQVJJVFkKKwkvKiBFbmFibGUgcGFyaXR5IGVycm9yIHJlc3BvbnNlICovCisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1BDTUQsIFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1BDTUQpIHwgMHg0MCk7CisjZW5kaWYKKworCS8qIE1hc2sgYWxsIHRoZSBpbnRlcnJ1cHQgICAgICAgKi8KKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfTWFzaywgMHgxRik7CisKKwl0dWxfc3RvcF9ibShwQ3VySGNiKTsKKwkvKiAtLS0gSW5pdGlhbGl6ZSB0aGUgdHVsaXAgLS0tICovCisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDdHJsMCwgVFNDX1JTVF9DSElQKTsKKworCS8qIHByb2dyYW0gSEJBJ3MgU0NTSSBJRCAgICAgICAgKi8KKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU1Njc2lJZCwgcEN1ckhjYi0+SENTX1NDU0lfSUQgPDwgNCk7CisKKwkvKiBFbmFibGUgSW5pdGlhdG9yIE1vZGUgLHBoYXNlIGxhdGNoLGFsdGVybmF0ZSBzeW5jIHBlcmlvZCBtb2RlLAorCSAgIGRpc2FibGUgU0NTSSByZXNldCAqLworCWlmIChwQ3VySGNiLT5IQ1NfQ29uZmlnICYgSENDX0VOX1BBUikKKwkJcEN1ckhjYi0+SENTX1NDb25mMSA9IChUU0NfSU5JVERFRkFVTFQgfCBUU0NfRU5fU0NTSV9QQVIpOworCWVsc2UKKwkJcEN1ckhjYi0+SENTX1NDb25mMSA9IChUU0NfSU5JVERFRkFVTFQpOworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ29uZmlnLCBwQ3VySGNiLT5IQ1NfU0NvbmYxKTsKKworCS8qIEVuYWJsZSBIVyByZXNlbGVjdCAgICAgICAgICAgKi8KKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwxLCBUU0NfSFdfUkVTRUxFQ1QpOworCisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NQZXJpb2QsIDApOworCisJLyogc2VsZWN0aW9uIHRpbWUgb3V0ID0gMjUwIG1zICovCisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NUaW1lT3V0LCAxNTMpOworCisvKi0tLS0tLS0tLSBFbmFibGUgU0NTSSB0ZXJtaW5hdG9yIC0tLS0tKi8KKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfWEN0cmwsIChwQ3VySGNiLT5IQ1NfQ29uZmlnICYgKEhDQ19BQ1RfVEVSTTEgfCBIQ0NfQUNUX1RFUk0yKSkpOworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9HQ1RSTDEsCisJICAgICAgICgocEN1ckhjYi0+SENTX0NvbmZpZyAmIEhDQ19BVVRPX1RFUk0pID4+IDQpIHwgKFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX0dDVFJMMSkgJiAweEZFKSk7CisKKwlmb3IgKGkgPSAwLAorCSAgICAgcHdGbGFncyA9ICYgKGk5MXVudnJhbXAtPk5WTV9TQ1NJSW5mb1swXS5OVk1fVGFyZzBDb25maWcpLAorCSAgICAgcGJIZWFkcyA9IHBiQmlvc0FkciArIDB4MTgwOworCSAgICAgaSA8IHBDdXJIY2ItPkhDU19NYXhUYXI7CisJICAgICBpKyssIHB3RmxhZ3MrKykgeworCQlwQ3VySGNiLT5IQ1NfVGNzW2ldLlRDU19GbGFncyA9ICpwd0ZsYWdzICYgfihUQ0ZfU1lOQ19ET05FIHwgVENGX1dEVFJfRE9ORSk7CisJCWlmIChwQ3VySGNiLT5IQ1NfVGNzW2ldLlRDU19GbGFncyAmIFRDRl9FTl8yNTUpCisJCQlwQ3VySGNiLT5IQ1NfVGNzW2ldLlRDU19EcnZGbGFncyA9IFRDRl9EUlZfMjU1XzYzOworCQllbHNlCisJCQlwQ3VySGNiLT5IQ1NfVGNzW2ldLlRDU19EcnZGbGFncyA9IDA7CisJCXBDdXJIY2ItPkhDU19UY3NbaV0uVENTX0pTX1BlcmlvZCA9IDA7CisJCXBDdXJIY2ItPkhDU19UY3NbaV0uVENTX1NDb25maWcwID0gcEN1ckhjYi0+SENTX1NDb25mMTsKKwkJcEN1ckhjYi0+SENTX1Rjc1tpXS5UQ1NfRHJ2SGVhZCA9ICpwYkhlYWRzKys7CisJCWlmIChwQ3VySGNiLT5IQ1NfVGNzW2ldLlRDU19EcnZIZWFkID09IDI1NSkKKwkJCXBDdXJIY2ItPkhDU19UY3NbaV0uVENTX0RydkZsYWdzID0gVENGX0RSVl8yNTVfNjM7CisJCWVsc2UKKwkJCXBDdXJIY2ItPkhDU19UY3NbaV0uVENTX0RydkZsYWdzID0gMDsKKwkJcEN1ckhjYi0+SENTX1Rjc1tpXS5UQ1NfRHJ2U2VjdG9yID0gKnBiSGVhZHMrKzsKKwkJcEN1ckhjYi0+SENTX1Rjc1tpXS5UQ1NfRmxhZ3MgJj0gflRDRl9CVVNZOworCQlwQ3VySGNiLT5IQ1NfQWN0VGFnc1tpXSA9IDA7CisJCXBDdXJIY2ItPkhDU19NYXhUYWdzW2ldID0gMHhGRjsKKwl9CQkJLyogZm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXByaW50aygiaTkxdTogUENJIEJhc2U9MHglMDRYLCBJUlE9JWQsIEJJT1M9MHglMDRYMCwgU0NTSSBJRD0lZFxuIiwKKwkgICAgICAgcEN1ckhjYi0+SENTX0Jhc2UsIHBDdXJIY2ItPkhDU19JbnRyLAorCSAgICAgICBwQ3VySGNiLT5IQ1NfQklPUywgcEN1ckhjYi0+SENTX1NDU0lfSUQpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tIHJlc2V0IFNDU0kgQnVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJaWYgKHBDdXJIY2ItPkhDU19Db25maWcgJiBIQ0NfU0NTSV9SRVNFVCkgeworCQlwcmludGsoImk5MXU6IFJlc2V0IFNDU0kgQnVzIC4uLiBcbiIpOworCQl0dWxfcmVzZXRfc2NzaShwQ3VySGNiLCBzZWNvbmRzKTsKKwl9CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDRkcxLCAweDE3KTsKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ludEVuYWJsZSwgMHhFOSk7CisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NDQiAqdHVsX2FsbG9jX3NjYihIQ1MgKiBoY3NwKQoreworCVNDQiAqcFRtcFNjYjsKKwlVTE9ORyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKGhjc3AtPkhDU19BdmFpbExvY2spLCBmbGFncyk7CisJaWYgKChwVG1wU2NiID0gaGNzcC0+SENTX0ZpcnN0QXZhaWwpICE9IE5VTEwpIHsKKyNpZiBERUJVR19RVUVVRQorCQlwcmludGsoImZpbmQgc2NiIGF0ICUwOGx4XG4iLCAoVUxPTkcpIHBUbXBTY2IpOworI2VuZGlmCisJCWlmICgoaGNzcC0+SENTX0ZpcnN0QXZhaWwgPSBwVG1wU2NiLT5TQ0JfTnh0U2NiKSA9PSBOVUxMKQorCQkJaGNzcC0+SENTX0xhc3RBdmFpbCA9IE5VTEw7CisJCXBUbXBTY2ItPlNDQl9OeHRTY2IgPSBOVUxMOworCQlwVG1wU2NiLT5TQ0JfU3RhdHVzID0gU0NCX1JFTlQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihoY3NwLT5IQ1NfQXZhaWxMb2NrKSwgZmxhZ3MpOworCXJldHVybiAocFRtcFNjYik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHR1bF9yZWxlYXNlX3NjYihIQ1MgKiBoY3NwLCBTQ0IgKiBzY2JwKQoreworCVVMT05HIGZsYWdzOworCisjaWYgREVCVUdfUVVFVUUKKwlwcmludGsoIlJlbGVhc2UgU0NCICVseDsgIiwgKFVMT05HKSBzY2JwKTsKKyNlbmRpZgorCXNwaW5fbG9ja19pcnFzYXZlKCYoaGNzcC0+SENTX0F2YWlsTG9jayksIGZsYWdzKTsKKwlzY2JwLT5TQ0JfU3JiID0gTlVMTDsKKwlzY2JwLT5TQ0JfU3RhdHVzID0gMDsKKwlzY2JwLT5TQ0JfTnh0U2NiID0gTlVMTDsKKwlpZiAoaGNzcC0+SENTX0xhc3RBdmFpbCAhPSBOVUxMKSB7CisJCWhjc3AtPkhDU19MYXN0QXZhaWwtPlNDQl9OeHRTY2IgPSBzY2JwOworCQloY3NwLT5IQ1NfTGFzdEF2YWlsID0gc2NicDsKKwl9IGVsc2UgeworCQloY3NwLT5IQ1NfRmlyc3RBdmFpbCA9IHNjYnA7CisJCWhjc3AtPkhDU19MYXN0QXZhaWwgPSBzY2JwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaGNzcC0+SENTX0F2YWlsTG9jayksIGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHVsX2FwcGVuZF9wZW5kX3NjYihIQ1MgKiBwQ3VySGNiLCBTQ0IgKiBzY2JwKQoreworCisjaWYgREVCVUdfUVVFVUUKKwlwcmludGsoIkFwcGVuZCBwZW5kIFNDQiAlbHg7ICIsIChVTE9ORykgc2NicCk7CisjZW5kaWYKKwlzY2JwLT5TQ0JfU3RhdHVzID0gU0NCX1BFTkQ7CisJc2NicC0+U0NCX054dFNjYiA9IE5VTEw7CisJaWYgKHBDdXJIY2ItPkhDU19MYXN0UGVuZCAhPSBOVUxMKSB7CisJCXBDdXJIY2ItPkhDU19MYXN0UGVuZC0+U0NCX054dFNjYiA9IHNjYnA7CisJCXBDdXJIY2ItPkhDU19MYXN0UGVuZCA9IHNjYnA7CisJfSBlbHNlIHsKKwkJcEN1ckhjYi0+SENTX0ZpcnN0UGVuZCA9IHNjYnA7CisJCXBDdXJIY2ItPkhDU19MYXN0UGVuZCA9IHNjYnA7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0dWxfcHVzaF9wZW5kX3NjYihIQ1MgKiBwQ3VySGNiLCBTQ0IgKiBzY2JwKQoreworCisjaWYgREVCVUdfUVVFVUUKKwlwcmludGsoIlB1c2ggcGVuZCBTQ0IgJWx4OyAiLCAoVUxPTkcpIHNjYnApOworI2VuZGlmCisJc2NicC0+U0NCX1N0YXR1cyA9IFNDQl9QRU5EOworCWlmICgoc2NicC0+U0NCX054dFNjYiA9IHBDdXJIY2ItPkhDU19GaXJzdFBlbmQpICE9IE5VTEwpIHsKKwkJcEN1ckhjYi0+SENTX0ZpcnN0UGVuZCA9IHNjYnA7CisJfSBlbHNlIHsKKwkJcEN1ckhjYi0+SENTX0ZpcnN0UGVuZCA9IHNjYnA7CisJCXBDdXJIY2ItPkhDU19MYXN0UGVuZCA9IHNjYnA7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU0NCICp0dWxfZmluZF9maXJzdF9wZW5kX3NjYihIQ1MgKiBwQ3VySGNiKQoreworCVNDQiAqcEZpcnN0UGVuZDsKKworCisJcEZpcnN0UGVuZCA9IHBDdXJIY2ItPkhDU19GaXJzdFBlbmQ7CisJd2hpbGUgKHBGaXJzdFBlbmQgIT0gTlVMTCkgeworCQlpZiAocEZpcnN0UGVuZC0+U0NCX09wY29kZSAhPSBFeGVjU0NTSSkgeworCQkJcmV0dXJuIChwRmlyc3RQZW5kKTsKKwkJfQorCQlpZiAocEZpcnN0UGVuZC0+U0NCX1RhZ01zZyA9PSAwKSB7CisJCQlpZiAoKHBDdXJIY2ItPkhDU19BY3RUYWdzW3BGaXJzdFBlbmQtPlNDQl9UYXJnZXRdID09IDApICYmCisJCQkgICAgIShwQ3VySGNiLT5IQ1NfVGNzW3BGaXJzdFBlbmQtPlNDQl9UYXJnZXRdLlRDU19GbGFncyAmIFRDRl9CVVNZKSkgeworCQkJCXJldHVybiAocEZpcnN0UGVuZCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoKHBDdXJIY2ItPkhDU19BY3RUYWdzW3BGaXJzdFBlbmQtPlNDQl9UYXJnZXRdID49CisJCQkgIHBDdXJIY2ItPkhDU19NYXhUYWdzW3BGaXJzdFBlbmQtPlNDQl9UYXJnZXRdKSB8CisJCQkgICAgKHBDdXJIY2ItPkhDU19UY3NbcEZpcnN0UGVuZC0+U0NCX1RhcmdldF0uVENTX0ZsYWdzICYgVENGX0JVU1kpKSB7CisJCQkJcEZpcnN0UGVuZCA9IHBGaXJzdFBlbmQtPlNDQl9OeHRTY2I7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZXR1cm4gKHBGaXJzdFBlbmQpOworCQl9CisJCXBGaXJzdFBlbmQgPSBwRmlyc3RQZW5kLT5TQ0JfTnh0U2NiOworCX0KKworCisJcmV0dXJuIChwRmlyc3RQZW5kKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTQ0IgKnR1bF9wb3BfcGVuZF9zY2IoSENTICogcEN1ckhjYikKK3sKKwlTQ0IgKnBUbXBTY2I7CisKKwlpZiAoKHBUbXBTY2IgPSBwQ3VySGNiLT5IQ1NfRmlyc3RQZW5kKSAhPSBOVUxMKSB7CisJCWlmICgocEN1ckhjYi0+SENTX0ZpcnN0UGVuZCA9IHBUbXBTY2ItPlNDQl9OeHRTY2IpID09IE5VTEwpCisJCQlwQ3VySGNiLT5IQ1NfTGFzdFBlbmQgPSBOVUxMOworCQlwVG1wU2NiLT5TQ0JfTnh0U2NiID0gTlVMTDsKKwl9CisjaWYgREVCVUdfUVVFVUUKKwlwcmludGsoIlBvcCBwZW5kIFNDQiAlbHg7ICIsIChVTE9ORykgcFRtcFNjYik7CisjZW5kaWYKKwlyZXR1cm4gKHBUbXBTY2IpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHR1bF91bmxpbmtfcGVuZF9zY2IoSENTICogcEN1ckhjYiwgU0NCICogcEN1clNjYikKK3sKKwlTQ0IgKnBUbXBTY2IsICpwUHJldlNjYjsKKworI2lmIERFQlVHX1FVRVVFCisJcHJpbnRrKCJ1bmxpbmsgcGVuZCBTQ0IgJWx4OyAiLCAoVUxPTkcpIHBDdXJTY2IpOworI2VuZGlmCisKKwlwUHJldlNjYiA9IHBUbXBTY2IgPSBwQ3VySGNiLT5IQ1NfRmlyc3RQZW5kOworCXdoaWxlIChwVG1wU2NiICE9IE5VTEwpIHsKKwkJaWYgKHBDdXJTY2IgPT0gcFRtcFNjYikgewkvKiBVbmxpbmsgdGhpcyBTQ0IgICAgICAgICAgICAgICovCisJCQlpZiAocFRtcFNjYiA9PSBwQ3VySGNiLT5IQ1NfRmlyc3RQZW5kKSB7CisJCQkJaWYgKChwQ3VySGNiLT5IQ1NfRmlyc3RQZW5kID0gcFRtcFNjYi0+U0NCX054dFNjYikgPT0gTlVMTCkKKwkJCQkJcEN1ckhjYi0+SENTX0xhc3RQZW5kID0gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJcFByZXZTY2ItPlNDQl9OeHRTY2IgPSBwVG1wU2NiLT5TQ0JfTnh0U2NiOworCQkJCWlmIChwVG1wU2NiID09IHBDdXJIY2ItPkhDU19MYXN0UGVuZCkKKwkJCQkJcEN1ckhjYi0+SENTX0xhc3RQZW5kID0gcFByZXZTY2I7CisJCQl9CisJCQlwVG1wU2NiLT5TQ0JfTnh0U2NiID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCXBQcmV2U2NiID0gcFRtcFNjYjsKKwkJcFRtcFNjYiA9IHBUbXBTY2ItPlNDQl9OeHRTY2I7CisJfQorCXJldHVybjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHR1bF9hcHBlbmRfYnVzeV9zY2IoSENTICogcEN1ckhjYiwgU0NCICogc2NicCkKK3sKKworI2lmIERFQlVHX1FVRVVFCisJcHJpbnRrKCJhcHBlbmQgYnVzeSBTQ0IgJWx4OyAiLCAoVUxPTkcpIHNjYnApOworI2VuZGlmCisJaWYgKHNjYnAtPlNDQl9UYWdNc2cpCisJCXBDdXJIY2ItPkhDU19BY3RUYWdzW3NjYnAtPlNDQl9UYXJnZXRdKys7CisJZWxzZQorCQlwQ3VySGNiLT5IQ1NfVGNzW3NjYnAtPlNDQl9UYXJnZXRdLlRDU19GbGFncyB8PSBUQ0ZfQlVTWTsKKwlzY2JwLT5TQ0JfU3RhdHVzID0gU0NCX0JVU1k7CisJc2NicC0+U0NCX054dFNjYiA9IE5VTEw7CisJaWYgKHBDdXJIY2ItPkhDU19MYXN0QnVzeSAhPSBOVUxMKSB7CisJCXBDdXJIY2ItPkhDU19MYXN0QnVzeS0+U0NCX054dFNjYiA9IHNjYnA7CisJCXBDdXJIY2ItPkhDU19MYXN0QnVzeSA9IHNjYnA7CisJfSBlbHNlIHsKKwkJcEN1ckhjYi0+SENTX0ZpcnN0QnVzeSA9IHNjYnA7CisJCXBDdXJIY2ItPkhDU19MYXN0QnVzeSA9IHNjYnA7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU0NCICp0dWxfcG9wX2J1c3lfc2NiKEhDUyAqIHBDdXJIY2IpCit7CisJU0NCICpwVG1wU2NiOworCisKKwlpZiAoKHBUbXBTY2IgPSBwQ3VySGNiLT5IQ1NfRmlyc3RCdXN5KSAhPSBOVUxMKSB7CisJCWlmICgocEN1ckhjYi0+SENTX0ZpcnN0QnVzeSA9IHBUbXBTY2ItPlNDQl9OeHRTY2IpID09IE5VTEwpCisJCQlwQ3VySGNiLT5IQ1NfTGFzdEJ1c3kgPSBOVUxMOworCQlwVG1wU2NiLT5TQ0JfTnh0U2NiID0gTlVMTDsKKwkJaWYgKHBUbXBTY2ItPlNDQl9UYWdNc2cpCisJCQlwQ3VySGNiLT5IQ1NfQWN0VGFnc1twVG1wU2NiLT5TQ0JfVGFyZ2V0XS0tOworCQllbHNlCisJCQlwQ3VySGNiLT5IQ1NfVGNzW3BUbXBTY2ItPlNDQl9UYXJnZXRdLlRDU19GbGFncyAmPSB+VENGX0JVU1k7CisJfQorI2lmIERFQlVHX1FVRVVFCisJcHJpbnRrKCJQb3AgYnVzeSBTQ0IgJWx4OyAiLCAoVUxPTkcpIHBUbXBTY2IpOworI2VuZGlmCisJcmV0dXJuIChwVG1wU2NiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHVsX3VubGlua19idXN5X3NjYihIQ1MgKiBwQ3VySGNiLCBTQ0IgKiBwQ3VyU2NiKQoreworCVNDQiAqcFRtcFNjYiwgKnBQcmV2U2NiOworCisjaWYgREVCVUdfUVVFVUUKKwlwcmludGsoInVubGluayBidXN5IFNDQiAlbHg7ICIsIChVTE9ORykgcEN1clNjYik7CisjZW5kaWYKKworCXBQcmV2U2NiID0gcFRtcFNjYiA9IHBDdXJIY2ItPkhDU19GaXJzdEJ1c3k7CisJd2hpbGUgKHBUbXBTY2IgIT0gTlVMTCkgeworCQlpZiAocEN1clNjYiA9PSBwVG1wU2NiKSB7CS8qIFVubGluayB0aGlzIFNDQiAgICAgICAgICAgICAgKi8KKwkJCWlmIChwVG1wU2NiID09IHBDdXJIY2ItPkhDU19GaXJzdEJ1c3kpIHsKKwkJCQlpZiAoKHBDdXJIY2ItPkhDU19GaXJzdEJ1c3kgPSBwVG1wU2NiLT5TQ0JfTnh0U2NiKSA9PSBOVUxMKQorCQkJCQlwQ3VySGNiLT5IQ1NfTGFzdEJ1c3kgPSBOVUxMOworCQkJfSBlbHNlIHsKKwkJCQlwUHJldlNjYi0+U0NCX054dFNjYiA9IHBUbXBTY2ItPlNDQl9OeHRTY2I7CisJCQkJaWYgKHBUbXBTY2IgPT0gcEN1ckhjYi0+SENTX0xhc3RCdXN5KQorCQkJCQlwQ3VySGNiLT5IQ1NfTGFzdEJ1c3kgPSBwUHJldlNjYjsKKwkJCX0KKwkJCXBUbXBTY2ItPlNDQl9OeHRTY2IgPSBOVUxMOworCQkJaWYgKHBUbXBTY2ItPlNDQl9UYWdNc2cpCisJCQkJcEN1ckhjYi0+SENTX0FjdFRhZ3NbcFRtcFNjYi0+U0NCX1RhcmdldF0tLTsKKwkJCWVsc2UKKwkJCQlwQ3VySGNiLT5IQ1NfVGNzW3BUbXBTY2ItPlNDQl9UYXJnZXRdLlRDU19GbGFncyAmPSB+VENGX0JVU1k7CisJCQlicmVhazsKKwkJfQorCQlwUHJldlNjYiA9IHBUbXBTY2I7CisJCXBUbXBTY2IgPSBwVG1wU2NiLT5TQ0JfTnh0U2NiOworCX0KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTQ0IgKnR1bF9maW5kX2J1c3lfc2NiKEhDUyAqIHBDdXJIY2IsIFdPUkQgdGFybHVuKQoreworCVNDQiAqcFRtcFNjYiwgKnBQcmV2U2NiOworCVdPUkQgc2NicF90YXJsdW47CisKKworCXBQcmV2U2NiID0gcFRtcFNjYiA9IHBDdXJIY2ItPkhDU19GaXJzdEJ1c3k7CisJd2hpbGUgKHBUbXBTY2IgIT0gTlVMTCkgeworCQlzY2JwX3Rhcmx1biA9IChwVG1wU2NiLT5TQ0JfTHVuIDw8IDgpIHwgKHBUbXBTY2ItPlNDQl9UYXJnZXQpOworCQlpZiAoc2NicF90YXJsdW4gPT0gdGFybHVuKSB7CS8qIFVubGluayB0aGlzIFNDQiAgICAgICAgICAgICAgKi8KKwkJCWJyZWFrOworCQl9CisJCXBQcmV2U2NiID0gcFRtcFNjYjsKKwkJcFRtcFNjYiA9IHBUbXBTY2ItPlNDQl9OeHRTY2I7CisJfQorI2lmIERFQlVHX1FVRVVFCisJcHJpbnRrKCJmaW5kIGJ1c3kgU0NCICVseDsgIiwgKFVMT05HKSBwVG1wU2NiKTsKKyNlbmRpZgorCXJldHVybiAocFRtcFNjYik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHR1bF9hcHBlbmRfZG9uZV9zY2IoSENTICogcEN1ckhjYiwgU0NCICogc2NicCkKK3sKKworI2lmIERFQlVHX1FVRVVFCisJcHJpbnRrKCJhcHBlbmQgZG9uZSBTQ0IgJWx4OyAiLCAoVUxPTkcpIHNjYnApOworI2VuZGlmCisKKwlzY2JwLT5TQ0JfU3RhdHVzID0gU0NCX0RPTkU7CisJc2NicC0+U0NCX054dFNjYiA9IE5VTEw7CisJaWYgKHBDdXJIY2ItPkhDU19MYXN0RG9uZSAhPSBOVUxMKSB7CisJCXBDdXJIY2ItPkhDU19MYXN0RG9uZS0+U0NCX054dFNjYiA9IHNjYnA7CisJCXBDdXJIY2ItPkhDU19MYXN0RG9uZSA9IHNjYnA7CisJfSBlbHNlIHsKKwkJcEN1ckhjYi0+SENTX0ZpcnN0RG9uZSA9IHNjYnA7CisJCXBDdXJIY2ItPkhDU19MYXN0RG9uZSA9IHNjYnA7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU0NCICp0dWxfZmluZF9kb25lX3NjYihIQ1MgKiBwQ3VySGNiKQoreworCVNDQiAqcFRtcFNjYjsKKworCisJaWYgKChwVG1wU2NiID0gcEN1ckhjYi0+SENTX0ZpcnN0RG9uZSkgIT0gTlVMTCkgeworCQlpZiAoKHBDdXJIY2ItPkhDU19GaXJzdERvbmUgPSBwVG1wU2NiLT5TQ0JfTnh0U2NiKSA9PSBOVUxMKQorCQkJcEN1ckhjYi0+SENTX0xhc3REb25lID0gTlVMTDsKKwkJcFRtcFNjYi0+U0NCX054dFNjYiA9IE5VTEw7CisJfQorI2lmIERFQlVHX1FVRVVFCisJcHJpbnRrKCJmaW5kIGRvbmUgU0NCICVseDsgIiwgKFVMT05HKSBwVG1wU2NiKTsKKyNlbmRpZgorCXJldHVybiAocFRtcFNjYik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdHVsX2Fib3J0X3NyYihIQ1MgKiBwQ3VySGNiLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcmJwKQoreworCVVMT05HIGZsYWdzOworCVNDQiAqcFRtcFNjYiwgKnBQcmV2U2NiOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJihwQ3VySGNiLT5IQ1NfU2VtYXBoTG9jayksIGZsYWdzKTsKKworCWlmICgocEN1ckhjYi0+SENTX1NlbWFwaCA9PSAwKSAmJiAocEN1ckhjYi0+SENTX0FjdFNjYiA9PSBOVUxMKSkgeworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfTWFzaywgMHgxRik7CisJCS8qIGRpc2FibGUgSmFzbWluIFNDU0kgSW50ICAgICAgICAqLworCisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCisJCXR1bGlwX21haW4ocEN1ckhjYik7CisKKyAgICAgICAgCXNwaW5fbG9ja19pcnFzYXZlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisKKwkJcEN1ckhjYi0+SENTX1NlbWFwaCA9IDE7CisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9NYXNrLCAweDBGKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisKKwkJcmV0dXJuIFNDU0lfQUJPUlRfU05PT1pFOworCX0KKwlwUHJldlNjYiA9IHBUbXBTY2IgPSBwQ3VySGNiLT5IQ1NfRmlyc3RQZW5kOwkvKiBDaGVjayBQZW5kIHF1ZXVlICovCisJd2hpbGUgKHBUbXBTY2IgIT0gTlVMTCkgeworCQkvKiAwNy8yNy85OCAqLworCQlpZiAocFRtcFNjYi0+U0NCX1NyYiA9PSBzcmJwKSB7CisJCQlpZiAocFRtcFNjYiA9PSBwQ3VySGNiLT5IQ1NfQWN0U2NiKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCQkJCXJldHVybiBTQ1NJX0FCT1JUX0JVU1k7CisJCQl9IGVsc2UgaWYgKHBUbXBTY2IgPT0gcEN1ckhjYi0+SENTX0ZpcnN0UGVuZCkgeworCQkJCWlmICgocEN1ckhjYi0+SENTX0ZpcnN0UGVuZCA9IHBUbXBTY2ItPlNDQl9OeHRTY2IpID09IE5VTEwpCisJCQkJCXBDdXJIY2ItPkhDU19MYXN0UGVuZCA9IE5VTEw7CisJCQl9IGVsc2UgeworCQkJCXBQcmV2U2NiLT5TQ0JfTnh0U2NiID0gcFRtcFNjYi0+U0NCX054dFNjYjsKKwkJCQlpZiAocFRtcFNjYiA9PSBwQ3VySGNiLT5IQ1NfTGFzdFBlbmQpCisJCQkJCXBDdXJIY2ItPkhDU19MYXN0UGVuZCA9IHBQcmV2U2NiOworCQkJfQorCQkJcFRtcFNjYi0+U0NCX0hhU3RhdCA9IEhPU1RfQUJPUlRFRDsKKwkJCXBUbXBTY2ItPlNDQl9GbGFncyB8PSBTQ0ZfRE9ORTsKKwkJCWlmIChwVG1wU2NiLT5TQ0JfRmxhZ3MgJiBTQ0ZfUE9TVCkKKwkJCQkoKnBUbXBTY2ItPlNDQl9Qb3N0KSAoKEJZVEUgKikgcEN1ckhjYiwgKEJZVEUgKikgcFRtcFNjYik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisJCQlyZXR1cm4gU0NTSV9BQk9SVF9TVUNDRVNTOworCQl9CisJCXBQcmV2U2NiID0gcFRtcFNjYjsKKwkJcFRtcFNjYiA9IHBUbXBTY2ItPlNDQl9OeHRTY2I7CisJfQorCisJcFByZXZTY2IgPSBwVG1wU2NiID0gcEN1ckhjYi0+SENTX0ZpcnN0QnVzeTsJLyogQ2hlY2sgQnVzeSBxdWV1ZSAqLworCXdoaWxlIChwVG1wU2NiICE9IE5VTEwpIHsKKworCQlpZiAocFRtcFNjYi0+U0NCX1NyYiA9PSBzcmJwKSB7CisKKwkJCWlmIChwVG1wU2NiID09IHBDdXJIY2ItPkhDU19BY3RTY2IpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisJCQkJcmV0dXJuIFNDU0lfQUJPUlRfQlVTWTsKKwkJCX0gZWxzZSBpZiAocFRtcFNjYi0+U0NCX1RhZ01zZyA9PSAwKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCQkJCXJldHVybiBTQ1NJX0FCT1JUX0JVU1k7CisJCQl9IGVsc2UgeworCQkJCXBDdXJIY2ItPkhDU19BY3RUYWdzW3BUbXBTY2ItPlNDQl9UYXJnZXRdLS07CisJCQkJaWYgKHBUbXBTY2IgPT0gcEN1ckhjYi0+SENTX0ZpcnN0QnVzeSkgeworCQkJCQlpZiAoKHBDdXJIY2ItPkhDU19GaXJzdEJ1c3kgPSBwVG1wU2NiLT5TQ0JfTnh0U2NiKSA9PSBOVUxMKQorCQkJCQkJcEN1ckhjYi0+SENTX0xhc3RCdXN5ID0gTlVMTDsKKwkJCQl9IGVsc2UgeworCQkJCQlwUHJldlNjYi0+U0NCX054dFNjYiA9IHBUbXBTY2ItPlNDQl9OeHRTY2I7CisJCQkJCWlmIChwVG1wU2NiID09IHBDdXJIY2ItPkhDU19MYXN0QnVzeSkKKwkJCQkJCXBDdXJIY2ItPkhDU19MYXN0QnVzeSA9IHBQcmV2U2NiOworCQkJCX0KKwkJCQlwVG1wU2NiLT5TQ0JfTnh0U2NiID0gTlVMTDsKKworCisJCQkJcFRtcFNjYi0+U0NCX0hhU3RhdCA9IEhPU1RfQUJPUlRFRDsKKwkJCQlwVG1wU2NiLT5TQ0JfRmxhZ3MgfD0gU0NGX0RPTkU7CisJCQkJaWYgKHBUbXBTY2ItPlNDQl9GbGFncyAmIFNDRl9QT1NUKQorCQkJCQkoKnBUbXBTY2ItPlNDQl9Qb3N0KSAoKEJZVEUgKikgcEN1ckhjYiwgKEJZVEUgKikgcFRtcFNjYik7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCQkJCXJldHVybiBTQ1NJX0FCT1JUX1NVQ0NFU1M7CisJCQl9CisJCX0KKwkJcFByZXZTY2IgPSBwVG1wU2NiOworCQlwVG1wU2NiID0gcFRtcFNjYi0+U0NCX054dFNjYjsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCXJldHVybiAoU0NTSV9BQk9SVF9OT1RfUlVOTklORyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdHVsX2JhZF9zZXEoSENTICogcEN1ckhjYikKK3sKKwlTQ0IgKnBDdXJTY2I7CisKKwlwcmludGsoInR1bF9iYWRfc2VnIGM9JWRcbiIsIHBDdXJIY2ItPkhDU19JbmRleCk7CisKKwlpZiAoKHBDdXJTY2IgPSBwQ3VySGNiLT5IQ1NfQWN0U2NiKSAhPSBOVUxMKSB7CisJCXR1bF91bmxpbmtfYnVzeV9zY2IocEN1ckhjYiwgcEN1clNjYik7CisJCXBDdXJTY2ItPlNDQl9IYVN0YXQgPSBIT1NUX0JBRF9QSEFTOworCQlwQ3VyU2NiLT5TQ0JfVGFTdGF0ID0gMDsKKwkJdHVsX2FwcGVuZF9kb25lX3NjYihwQ3VySGNiLCBwQ3VyU2NiKTsKKwl9CisJdHVsX3N0b3BfYm0ocEN1ckhjYik7CisKKwl0dWxfcmVzZXRfc2NzaShwQ3VySGNiLCA4KTsJLyogNy8yOS85OCAqLworCisJcmV0dXJuICh0dWxfcG9zdF9zY3NpX3JzdChwQ3VySGNiKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdHVsX2RldmljZV9yZXNldChIQ1MgKiBwQ3VySGNiLCBzdHJ1Y3Qgc2NzaV9jbW5kICpwU3JiLAorCQl1bnNpZ25lZCBpbnQgdGFyZ2V0LCB1bnNpZ25lZCBpbnQgUmVzZXRGbGFncykKK3sKKwlVTE9ORyBmbGFnczsKKwlTQ0IgKnBTY2I7CisJc3Bpbl9sb2NrX2lycXNhdmUoJihwQ3VySGNiLT5IQ1NfU2VtYXBoTG9jayksIGZsYWdzKTsKKworCWlmIChSZXNldEZsYWdzICYgU0NTSV9SRVNFVF9BU1lOQ0hST05PVVMpIHsKKworCQlpZiAoKHBDdXJIY2ItPkhDU19TZW1hcGggPT0gMCkgJiYgKHBDdXJIY2ItPkhDU19BY3RTY2IgPT0gTlVMTCkpIHsKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9NYXNrLCAweDFGKTsKKwkJCS8qIGRpc2FibGUgSmFzbWluIFNDU0kgSW50ICAgICAgICAqLworCisgICAgICAgIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCisJCQl0dWxpcF9tYWluKHBDdXJIY2IpOworCisgICAgICAgIAkJc3Bpbl9sb2NrX2lycXNhdmUoJihwQ3VySGNiLT5IQ1NfU2VtYXBoTG9jayksIGZsYWdzKTsKKworCQkJcEN1ckhjYi0+SENTX1NlbWFwaCA9IDE7CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfTWFzaywgMHgwRik7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihwQ3VySGNiLT5IQ1NfU2VtYXBoTG9jayksIGZsYWdzKTsKKworCQkJcmV0dXJuIFNDU0lfUkVTRVRfU05PT1pFOworCQl9CisJCXBTY2IgPSBwQ3VySGNiLT5IQ1NfRmlyc3RCdXN5OwkvKiBDaGVjayBCdXN5IHF1ZXVlICovCisJCXdoaWxlIChwU2NiICE9IE5VTEwpIHsKKwkJCWlmIChwU2NiLT5TQ0JfU3JiID09IHBTcmIpCisJCQkJYnJlYWs7CisJCQlwU2NiID0gcFNjYi0+U0NCX054dFNjYjsKKwkJfQorCQlpZiAocFNjYiA9PSBOVUxMKSB7CisJCQlwcmludGsoIlVuYWJsZSB0byBSZXNldCAtIE5vIFNDQiBGb3VuZFxuIik7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihwQ3VySGNiLT5IQ1NfU2VtYXBoTG9jayksIGZsYWdzKTsKKwkJCXJldHVybiBTQ1NJX1JFU0VUX05PVF9SVU5OSU5HOworCQl9CisJfQorCWlmICgocFNjYiA9IHR1bF9hbGxvY19zY2IocEN1ckhjYikpID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCQlyZXR1cm4gU0NTSV9SRVNFVF9OT1RfUlVOTklORzsKKwl9CisJcFNjYi0+U0NCX09wY29kZSA9IEJ1c0RldlJzdDsKKwlwU2NiLT5TQ0JfRmxhZ3MgPSBTQ0ZfUE9TVDsKKwlwU2NiLT5TQ0JfVGFyZ2V0ID0gdGFyZ2V0OworCXBTY2ItPlNDQl9Nb2RlID0gMDsKKworCXBTY2ItPlNDQl9TcmIgPSBOVUxMOworCWlmIChSZXNldEZsYWdzICYgU0NTSV9SRVNFVF9TWU5DSFJPTk9VUykgeworCQlwU2NiLT5TQ0JfU3JiID0gcFNyYjsKKwl9CisJdHVsX3B1c2hfcGVuZF9zY2IocEN1ckhjYiwgcFNjYik7CS8qIHB1c2ggdGhpcyBTQ0IgdG8gUGVuZGluZyBxdWV1ZSAqLworCisJaWYgKHBDdXJIY2ItPkhDU19TZW1hcGggPT0gMSkgeworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfTWFzaywgMHgxRik7CisJCS8qIGRpc2FibGUgSmFzbWluIFNDU0kgSW50ICAgICAgICAqLworCQlwQ3VySGNiLT5IQ1NfU2VtYXBoID0gMDsKKworICAgICAgICAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCisJCXR1bGlwX21haW4ocEN1ckhjYik7CisKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCisJCXBDdXJIY2ItPkhDU19TZW1hcGggPSAxOworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfTWFzaywgMHgwRik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihwQ3VySGNiLT5IQ1NfU2VtYXBoTG9jayksIGZsYWdzKTsKKwlyZXR1cm4gU0NTSV9SRVNFVF9QRU5ESU5HOworfQorCitpbnQgdHVsX3Jlc2V0X3Njc2lfYnVzKEhDUyAqIHBDdXJIY2IpCit7CisJVUxPTkcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9NYXNrLCAweDFGKTsKKwlwQ3VySGNiLT5IQ1NfU2VtYXBoID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihwQ3VySGNiLT5IQ1NfU2VtYXBoTG9jayksIGZsYWdzKTsKKworCXR1bF9zdG9wX2JtKHBDdXJIY2IpOworCisJdHVsX3Jlc2V0X3Njc2kocEN1ckhjYiwgMik7CS8qIDcvMjkvOTggKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisJdHVsX3Bvc3Rfc2NzaV9yc3QocEN1ckhjYik7CisKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCisJdHVsaXBfbWFpbihwQ3VySGNiKTsKKworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCisJcEN1ckhjYi0+SENTX1NlbWFwaCA9IDE7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX01hc2ssIDB4MEYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihwQ3VySGNiLT5IQ1NfU2VtYXBoTG9jayksIGZsYWdzKTsKKwlyZXR1cm4gKFNDU0lfUkVTRVRfU1VDQ0VTUyB8IFNDU0lfUkVTRVRfSE9TVF9SRVNFVCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHR1bF9leGVjX3NjYihIQ1MgKiBwQ3VySGNiLCBTQ0IgKiBwQ3VyU2NiKQoreworCVVMT05HIGZsYWdzOworCisJcEN1clNjYi0+U0NCX01vZGUgPSAwOworCisJcEN1clNjYi0+U0NCX1NHSWR4ID0gMDsKKwlwQ3VyU2NiLT5TQ0JfU0dNYXggPSBwQ3VyU2NiLT5TQ0JfU0dMZW47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCisJdHVsX2FwcGVuZF9wZW5kX3NjYihwQ3VySGNiLCBwQ3VyU2NiKTsJLyogQXBwZW5kIHRoaXMgU0NCIHRvIFBlbmRpbmcgcXVldWUgKi8KKworLyogVlZWVlYgMDcvMjEvOTggKi8KKwlpZiAocEN1ckhjYi0+SENTX1NlbWFwaCA9PSAxKSB7CisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9NYXNrLCAweDFGKTsKKwkJLyogZGlzYWJsZSBKYXNtaW4gU0NTSSBJbnQgICAgICAgICovCisJCXBDdXJIY2ItPkhDU19TZW1hcGggPSAwOworCisgICAgICAgIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisKKwkJdHVsaXBfbWFpbihwQ3VySGNiKTsKKworICAgICAgICAJc3Bpbl9sb2NrX2lycXNhdmUoJihwQ3VySGNiLT5IQ1NfU2VtYXBoTG9jayksIGZsYWdzKTsKKworCQlwQ3VySGNiLT5IQ1NfU2VtYXBoID0gMTsKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX01hc2ssIDB4MEYpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHR1bF9pc3IoSENTICogcEN1ckhjYikKK3sKKwkvKiBFbnRlciBjcml0aWNhbCBzZWN0aW9uICAgICAgICovCisKKwlpZiAoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfSW50KSAmIFRTU19JTlRfUEVORElORykgeworCQlpZiAocEN1ckhjYi0+SENTX1NlbWFwaCA9PSAxKSB7CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfTWFzaywgMHgxRik7CisJCQkvKiBEaXNhYmxlIFR1bGlwIFNDU0kgSW50ICovCisJCQlwQ3VySGNiLT5IQ1NfU2VtYXBoID0gMDsKKworCQkJdHVsaXBfbWFpbihwQ3VySGNiKTsKKworCQkJcEN1ckhjYi0+SENTX1NlbWFwaCA9IDE7CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfTWFzaywgMHgwRik7CisJCQlyZXR1cm4gKDEpOworCQl9CisJfQorCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdHVsaXBfbWFpbihIQ1MgKiBwQ3VySGNiKQoreworCVNDQiAqcEN1clNjYjsKKworCWZvciAoOzspIHsKKworCQl0dWxpcF9zY3NpKHBDdXJIY2IpOwkvKiBDYWxsIHR1bGlwX3Njc2kgICAgICAgICAgICAgICovCisKKwkJd2hpbGUgKChwQ3VyU2NiID0gdHVsX2ZpbmRfZG9uZV9zY2IocEN1ckhjYikpICE9IE5VTEwpIHsJLyogZmluZCBkb25lIGVudHJ5ICovCisJCQlpZiAocEN1clNjYi0+U0NCX1RhU3RhdCA9PSBJTklfUVVFVUVfRlVMTCkgeworCQkJCXBDdXJIY2ItPkhDU19NYXhUYWdzW3BDdXJTY2ItPlNDQl9UYXJnZXRdID0KKwkJCQkgICAgcEN1ckhjYi0+SENTX0FjdFRhZ3NbcEN1clNjYi0+U0NCX1RhcmdldF0gLSAxOworCQkJCXBDdXJTY2ItPlNDQl9UYVN0YXQgPSAwOworCQkJCXR1bF9hcHBlbmRfcGVuZF9zY2IocEN1ckhjYiwgcEN1clNjYik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIShwQ3VyU2NiLT5TQ0JfTW9kZSAmIFNDTV9SU0VOUykpIHsJCS8qIG5vdCBpbiBhdXRvIHJlcS4gc2Vuc2UgbW9kZSAqLworCQkJCWlmIChwQ3VyU2NiLT5TQ0JfVGFTdGF0ID09IDIpIHsKKworCQkJCQkvKiBjbHIgc3luYy4gbmVnbyBmbGFnICovCisKKwkJCQkJaWYgKHBDdXJTY2ItPlNDQl9GbGFncyAmIFNDRl9TRU5TRSkgeworCQkJCQkJQllURSBsZW47CisJCQkJCQlsZW4gPSBwQ3VyU2NiLT5TQ0JfU2Vuc2VMZW47CisJCQkJCQlpZiAobGVuID09IDApCisJCQkJCQkJbGVuID0gMTsKKwkJCQkJCXBDdXJTY2ItPlNDQl9CdWZMZW4gPSBwQ3VyU2NiLT5TQ0JfU2Vuc2VMZW47CisJCQkJCQlwQ3VyU2NiLT5TQ0JfQnVmUHRyID0gcEN1clNjYi0+U0NCX1NlbnNlUHRyOworCQkJCQkJcEN1clNjYi0+U0NCX0ZsYWdzICY9IH4oU0NGX1NHIHwgU0NGX0RJUik7CS8qIGZvciB4ZmVyX2RhdGFfaW4gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgIHBDdXJTY2ItPlNDQl9GbGFncyB8PSBTQ0ZfTk9fRENISzsgICAgICAqLworCQkJCQkJLyogc28sIHdlIHdvbid0IHJlcG9ydCB3b3JuZyBkaXJlY3Rpb24gaW4geGZlcl9kYXRhX2luLAorCQkJCQkJICAgYW5kIHdvbid0IHJlcG9ydCBIT1NUX0RPX0RVIGluIHN0YXRlXzYgKi8KKwkJCQkJCXBDdXJTY2ItPlNDQl9Nb2RlID0gU0NNX1JTRU5TOworCQkJCQkJcEN1clNjYi0+U0NCX0lkZW50ICY9IDB4QkY7CS8qIERpc2FibGUgRGlzY29ubmVjdCAqLworCQkJCQkJcEN1clNjYi0+U0NCX1RhZ01zZyA9IDA7CisJCQkJCQlwQ3VyU2NiLT5TQ0JfVGFTdGF0ID0gMDsKKwkJCQkJCXBDdXJTY2ItPlNDQl9DREJMZW4gPSA2OworCQkJCQkJcEN1clNjYi0+U0NCX0NEQlswXSA9IFNDU0lDTURfUmVxdWVzdFNlbnNlOworCQkJCQkJcEN1clNjYi0+U0NCX0NEQlsxXSA9IDA7CisJCQkJCQlwQ3VyU2NiLT5TQ0JfQ0RCWzJdID0gMDsKKwkJCQkJCXBDdXJTY2ItPlNDQl9DREJbM10gPSAwOworCQkJCQkJcEN1clNjYi0+U0NCX0NEQls0XSA9IGxlbjsKKwkJCQkJCXBDdXJTY2ItPlNDQl9DREJbNV0gPSAwOworCQkJCQkJdHVsX3B1c2hfcGVuZF9zY2IocEN1ckhjYiwgcEN1clNjYik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CS8qIGluIHJlcXVlc3Qgc2Vuc2UgbW9kZSAqLworCisJCQkJaWYgKHBDdXJTY2ItPlNDQl9UYVN0YXQgPT0gMikgewkJLyogY2hlY2sgY29udGl0aW9uIHN0YXR1cyBhZ2FpbiBhZnRlciBzZW5kaW5nCisJCQkJCQkJCQkgICByZXF1c2V0IHNlbnNlIGNtZCAweDMgKi8KKwkJCQkJcEN1clNjYi0+U0NCX0hhU3RhdCA9IEhPU1RfQkFEX1BIQVM7CisJCQkJfQorCQkJCXBDdXJTY2ItPlNDQl9UYVN0YXQgPSAyOworCQkJfQorCQkJcEN1clNjYi0+U0NCX0ZsYWdzIHw9IFNDRl9ET05FOworCQkJaWYgKHBDdXJTY2ItPlNDQl9GbGFncyAmIFNDRl9QT1NUKSB7CisJCQkJKCpwQ3VyU2NiLT5TQ0JfUG9zdCkgKChCWVRFICopIHBDdXJIY2IsIChCWVRFICopIHBDdXJTY2IpOworCQkJfQorCQl9CQkvKiB3aGlsZSAqLworCisJCS8qIGZpbmRfYWN0aXZlOiAqLworCQlpZiAoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU1N0YXR1czApICYgVFNTX0lOVF9QRU5ESU5HKQorCQkJY29udGludWU7CisKKwkJaWYgKHBDdXJIY2ItPkhDU19BY3RTY2IpIHsJLyogcmV0dXJuIHRvIE9TIGFuZCB3YWl0IGZvciB4ZmVyX2RvbmVfSVNSL1NlbGVjdGVkX0lTUiAqLworCQkJcmV0dXJuIDE7CS8qIHJldHVybiB0byBPUywgZW5hYmxlIGludGVycnVwdCAqLworCQl9CisJCS8qIENoZWNrIHBlbmRpbmcgU0NCICAgICAgICAgICAgKi8KKwkJaWYgKHR1bF9maW5kX2ZpcnN0X3BlbmRfc2NiKHBDdXJIY2IpID09IE5VTEwpIHsKKwkJCXJldHVybiAxOwkvKiByZXR1cm4gdG8gT1MsIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwkJfQorCX0JCQkvKiBFbmQgb2YgZm9yIGxvb3AgKi8KKwkvKiBzdGF0ZW1lbnQgd29uJ3QgcmVhY2ggaGVyZSAqLworfQorCisKKworCisvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHR1bGlwX3Njc2koSENTICogcEN1ckhjYikKK3sKKwlTQ0IgKnBDdXJTY2I7CisJVENTICpwQ3VyVGNiOworCisJLyogbWFrZSBzdXJlIHRvIHNlcnZpY2UgaW50ZXJydXB0IGFzYXAgKi8KKworCWlmICgocEN1ckhjYi0+SENTX0pTU3RhdHVzMCA9IFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NTdGF0dXMwKSkgJiBUU1NfSU5UX1BFTkRJTkcpIHsKKworCQlwQ3VySGNiLT5IQ1NfUGhhc2UgPSBwQ3VySGNiLT5IQ1NfSlNTdGF0dXMwICYgVFNTX1BIX01BU0s7CisJCXBDdXJIY2ItPkhDU19KU1N0YXR1czEgPSBUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TU3RhdHVzMSk7CisJCXBDdXJIY2ItPkhDU19KU0ludCA9IFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NJbnQpOworCQlpZiAocEN1ckhjYi0+SENTX0pTSW50ICYgVFNTX1NDU0lSU1RfSU5UKSB7CS8qIFNDU0kgYnVzIHJlc2V0IGRldGVjdGVkICAgICAgKi8KKwkJCWludF90dWxfc2NzaV9yc3QocEN1ckhjYik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHBDdXJIY2ItPkhDU19KU0ludCAmIFRTU19SRVNFTF9JTlQpIHsJLyogaWYgc2VsZWN0ZWQvcmVzZWxlY3RlZCBpbnRlcnJ1cHQgKi8KKwkJCWlmIChpbnRfdHVsX3Jlc2VsKHBDdXJIY2IpID09IDApCisJCQkJdHVsX25leHRfc3RhdGUocEN1ckhjYik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHBDdXJIY2ItPkhDU19KU0ludCAmIFRTU19TRUxfVElNRU9VVCkgeworCQkJaW50X3R1bF9idXNmcmVlKHBDdXJIY2IpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChwQ3VySGNiLT5IQ1NfSlNJbnQgJiBUU1NfRElTQ19JTlQpIHsJLyogQlVTIGRpc2Nvbm5lY3Rpb24gICAgICAgICAgICAqLworCQkJaW50X3R1bF9idXNmcmVlKHBDdXJIY2IpOwkvKiB1bmV4cGVjdGVkIGJ1cyBmcmVlIG9yIHNlbCB0aW1lb3V0ICovCisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHBDdXJIY2ItPkhDU19KU0ludCAmIChUU1NfRlVOQ19DT01QIHwgVFNTX0JVU19TRVJWKSkgewkvKiBmdW5jIGNvbXBsZXRlIG9yIEJ1cyBzZXJ2aWNlICovCisJCQlpZiAoKHBDdXJTY2IgPSBwQ3VySGNiLT5IQ1NfQWN0U2NiKSAhPSBOVUxMKQorCQkJCXR1bF9uZXh0X3N0YXRlKHBDdXJIY2IpOworCQkJcmV0dXJuOworCQl9CisJfQorCWlmIChwQ3VySGNiLT5IQ1NfQWN0U2NiICE9IE5VTEwpCisJCXJldHVybjsKKworCWlmICgocEN1clNjYiA9IHR1bF9maW5kX2ZpcnN0X3BlbmRfc2NiKHBDdXJIY2IpKSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBwcm9ncmFtIEhCQSdzIFNDU0kgSUQgJiB0YXJnZXQgU0NTSSBJRCAqLworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TU2NzaUlkLAorCSAgICAgKHBDdXJIY2ItPkhDU19TQ1NJX0lEIDw8IDQpIHwgKHBDdXJTY2ItPlNDQl9UYXJnZXQgJiAweDBGKSk7CisJaWYgKHBDdXJTY2ItPlNDQl9PcGNvZGUgPT0gRXhlY1NDU0kpIHsKKwkJcEN1clRjYiA9ICZwQ3VySGNiLT5IQ1NfVGNzW3BDdXJTY2ItPlNDQl9UYXJnZXRdOworCisJCWlmIChwQ3VyU2NiLT5TQ0JfVGFnTXNnKQorCQkJcEN1clRjYi0+VENTX0RydkZsYWdzIHw9IFRDRl9EUlZfRU5fVEFHOworCQllbHNlCisJCQlwQ3VyVGNiLT5UQ1NfRHJ2RmxhZ3MgJj0gflRDRl9EUlZfRU5fVEFHOworCisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TUGVyaW9kLCBwQ3VyVGNiLT5UQ1NfSlNfUGVyaW9kKTsKKwkJaWYgKChwQ3VyVGNiLT5UQ1NfRmxhZ3MgJiAoVENGX1dEVFJfRE9ORSB8IFRDRl9OT19XRFRSKSkgPT0gMCkgewkvKiBkbyB3ZHRyIG5lZ290aWF0aW9uICAgICAgICAgICovCisJCQl0dWxfc2VsZWN0X2F0bl9zdG9wKHBDdXJIY2IsIHBDdXJTY2IpOworCQl9IGVsc2UgeworCQkJaWYgKChwQ3VyVGNiLT5UQ1NfRmxhZ3MgJiAoVENGX1NZTkNfRE9ORSB8IFRDRl9OT19TWU5DX05FR08pKSA9PSAwKSB7CS8qIGRvIHN5bmMgbmVnb3RpYXRpb24gICAgICAgICAgKi8KKwkJCQl0dWxfc2VsZWN0X2F0bl9zdG9wKHBDdXJIY2IsIHBDdXJTY2IpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocEN1clNjYi0+U0NCX1RhZ01zZykKKwkJCQkJdHVsX3NlbGVjdF9hdG4zKHBDdXJIY2IsIHBDdXJTY2IpOworCQkJCWVsc2UKKwkJCQkJdHVsX3NlbGVjdF9hdG4ocEN1ckhjYiwgcEN1clNjYik7CisJCQl9CisJCX0KKwkJaWYgKHBDdXJTY2ItPlNDQl9GbGFncyAmIFNDRl9QT0xMKSB7CisJCQl3aGlsZSAod2FpdF90dWxpcChwQ3VySGNiKSAhPSAtMSkgeworCQkJCWlmICh0dWxfbmV4dF9zdGF0ZShwQ3VySGNiKSA9PSAtMSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKHBDdXJTY2ItPlNDQl9PcGNvZGUgPT0gQnVzRGV2UnN0KSB7CisJCXR1bF9zZWxlY3RfYXRuX3N0b3AocEN1ckhjYiwgcEN1clNjYik7CisJCXBDdXJTY2ItPlNDQl9OeHRTdGF0ID0gODsKKwkJaWYgKHBDdXJTY2ItPlNDQl9GbGFncyAmIFNDRl9QT0xMKSB7CisJCQl3aGlsZSAod2FpdF90dWxpcChwQ3VySGNiKSAhPSAtMSkgeworCQkJCWlmICh0dWxfbmV4dF9zdGF0ZShwQ3VySGNiKSA9PSAtMSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKHBDdXJTY2ItPlNDQl9PcGNvZGUgPT0gQWJvcnRDbWQpIHsKKwkJaWYgKHR1bF9hYm9ydF9zcmIocEN1ckhjYiwgcEN1clNjYi0+U0NCX1NyYikgIT0gMCkgeworCisKKwkJCXR1bF91bmxpbmtfcGVuZF9zY2IocEN1ckhjYiwgcEN1clNjYik7CisKKwkJCXR1bF9yZWxlYXNlX3NjYihwQ3VySGNiLCBwQ3VyU2NiKTsKKwkJfSBlbHNlIHsKKwkJCXBDdXJTY2ItPlNDQl9PcGNvZGUgPSBCdXNEZXZSc3Q7CisJCQl0dWxfc2VsZWN0X2F0bl9zdG9wKHBDdXJIY2IsIHBDdXJTY2IpOworCQkJcEN1clNjYi0+U0NCX054dFN0YXQgPSA4OworCQl9CisKKy8qIDA4LzAzLzk4ICovCisJfSBlbHNlIHsKKwkJdHVsX3VubGlua19wZW5kX3NjYihwQ3VySGNiLCBwQ3VyU2NiKTsKKwkJcEN1clNjYi0+U0NCX0hhU3RhdCA9IDB4MTY7CS8qIGJhZCBjb21tYW5kICovCisJCXR1bF9hcHBlbmRfZG9uZV9zY2IocEN1ckhjYiwgcEN1clNjYik7CisJfQorCXJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHR1bF9uZXh0X3N0YXRlKEhDUyAqIHBDdXJIY2IpCit7CisJaW50IG5leHQ7CisKKwluZXh0ID0gcEN1ckhjYi0+SENTX0FjdFNjYi0+U0NCX054dFN0YXQ7CisJZm9yICg7OykgeworCQlzd2l0Y2ggKG5leHQpIHsKKwkJY2FzZSAxOgorCQkJbmV4dCA9IHR1bF9zdGF0ZV8xKHBDdXJIY2IpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCW5leHQgPSB0dWxfc3RhdGVfMihwQ3VySGNiKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQluZXh0ID0gdHVsX3N0YXRlXzMocEN1ckhjYik7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJbmV4dCA9IHR1bF9zdGF0ZV80KHBDdXJIY2IpOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCW5leHQgPSB0dWxfc3RhdGVfNShwQ3VySGNiKTsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQluZXh0ID0gdHVsX3N0YXRlXzYocEN1ckhjYik7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJbmV4dCA9IHR1bF9zdGF0ZV83KHBDdXJIY2IpOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCXJldHVybiAodHVsX2J1c19kZXZpY2VfcmVzZXQocEN1ckhjYikpOworCQlkZWZhdWx0OgorCQkJcmV0dXJuICh0dWxfYmFkX3NlcShwQ3VySGNiKSk7CisJCX0KKwkJaWYgKG5leHQgPD0gMCkKKwkJCXJldHVybiBuZXh0OworCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogc1RhdGUgYWZ0ZXIgc2VsZWN0aW9uIHdpdGggYXR0ZW50aW9uICYgc3RvcCAqLworaW50IHR1bF9zdGF0ZV8xKEhDUyAqIHBDdXJIY2IpCit7CisJU0NCICpwQ3VyU2NiID0gcEN1ckhjYi0+SENTX0FjdFNjYjsKKwlUQ1MgKnBDdXJUY2IgPSBwQ3VySGNiLT5IQ1NfQWN0VGNzOworI2lmIERFQlVHX1NUQVRFCisJcHJpbnRrKCItczEtIik7CisjZW5kaWYKKworCXR1bF91bmxpbmtfcGVuZF9zY2IocEN1ckhjYiwgcEN1clNjYik7CisJdHVsX2FwcGVuZF9idXN5X3NjYihwQ3VySGNiLCBwQ3VyU2NiKTsKKworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ29uZmlnLCBwQ3VyVGNiLT5UQ1NfU0NvbmZpZzApOworCS8qIEFUTiBvbiAqLworCWlmIChwQ3VySGNiLT5IQ1NfUGhhc2UgPT0gTVNHX09VVCkgeworCisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ3RybDEsIChUU0NfRU5fQlVTX0lOIHwgVFNDX0hXX1JFU0VMRUNUKSk7CisKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBwQ3VyU2NiLT5TQ0JfSWRlbnQpOworCisJCWlmIChwQ3VyU2NiLT5TQ0JfVGFnTXNnKSB7CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIHBDdXJTY2ItPlNDQl9UYWdNc2cpOworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBwQ3VyU2NiLT5TQ0JfVGFnSWQpOworCQl9CisJCWlmICgocEN1clRjYi0+VENTX0ZsYWdzICYgKFRDRl9XRFRSX0RPTkUgfCBUQ0ZfTk9fV0RUUikpID09IDApIHsKKworCQkJcEN1clRjYi0+VENTX0ZsYWdzIHw9IFRDRl9XRFRSX0RPTkU7CisKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgTVNHX0VYVEVORCk7CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIDIpOwkvKiBFeHRlbmRlZCBtc2cgbGVuZ3RoICovCisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIDMpOwkvKiBTeW5jIHJlcXVlc3QgKi8KKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgMSk7CS8qIFN0YXJ0IGZyb20gMTYgYml0cyAqLworCQl9IGVsc2UgaWYgKChwQ3VyVGNiLT5UQ1NfRmxhZ3MgJiAoVENGX1NZTkNfRE9ORSB8IFRDRl9OT19TWU5DX05FR08pKSA9PSAwKSB7CisKKwkJCXBDdXJUY2ItPlRDU19GbGFncyB8PSBUQ0ZfU1lOQ19ET05FOworCisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIE1TR19FWFRFTkQpOworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCAzKTsJLyogZXh0ZW5kZWQgbXNnIGxlbmd0aCAqLworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCAxKTsJLyogc3luYyByZXF1ZXN0ICovCisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIHR1bF9yYXRlX3RibFtwQ3VyVGNiLT5UQ1NfRmxhZ3MgJiBUQ0ZfU0NTSV9SQVRFXSk7CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIE1BWF9PRkZTRVQpOwkvKiBSRVEvQUNLIG9mZnNldCAqLworCQl9CisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfWEZfRklGT19PVVQpOworCQlpZiAod2FpdF90dWxpcChwQ3VySGNiKSA9PSAtMSkKKwkJCXJldHVybiAoLTEpOworCX0KKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwwLCBUU0NfRkxVU0hfRklGTyk7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NTaWduYWwsIChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TU2lnbmFsKSAmIChUU0NfU0VUX0FDSyB8IDcpKSk7CisJcmV0dXJuICgzKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogc3RhdGUgYWZ0ZXIgc2VsZWN0aW9uIHdpdGggYXR0ZW50aW9uICovCisvKiBzdGF0ZSBhZnRlciBzZWxlY3Rpb24gd2l0aCBhdHRlbnRpb24zICovCitpbnQgdHVsX3N0YXRlXzIoSENTICogcEN1ckhjYikKK3sKKwlTQ0IgKnBDdXJTY2IgPSBwQ3VySGNiLT5IQ1NfQWN0U2NiOworCVRDUyAqcEN1clRjYiA9IHBDdXJIY2ItPkhDU19BY3RUY3M7CisjaWYgREVCVUdfU1RBVEUKKwlwcmludGsoIi1zMi0iKTsKKyNlbmRpZgorCisJdHVsX3VubGlua19wZW5kX3NjYihwQ3VySGNiLCBwQ3VyU2NiKTsKKwl0dWxfYXBwZW5kX2J1c3lfc2NiKHBDdXJIY2IsIHBDdXJTY2IpOworCisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDb25maWcsIHBDdXJUY2ItPlRDU19TQ29uZmlnMCk7CisKKwlpZiAocEN1ckhjYi0+SENTX0pTU3RhdHVzMSAmIFRTU19DTURfUEhfQ01QKSB7CisJCXJldHVybiAoNCk7CisJfQorCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ3RybDAsIFRTQ19GTFVTSF9GSUZPKTsKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU1NpZ25hbCwgKFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NTaWduYWwpICYgKFRTQ19TRVRfQUNLIHwgNykpKTsKKwlyZXR1cm4gKDMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogc3RhdGUgYmVmb3JlIENEQiB4ZmVyIGlzIGRvbmUgKi8KK2ludCB0dWxfc3RhdGVfMyhIQ1MgKiBwQ3VySGNiKQoreworCVNDQiAqcEN1clNjYiA9IHBDdXJIY2ItPkhDU19BY3RTY2I7CisJVENTICpwQ3VyVGNiID0gcEN1ckhjYi0+SENTX0FjdFRjczsKKwlpbnQgaTsKKworI2lmIERFQlVHX1NUQVRFCisJcHJpbnRrKCItczMtIik7CisjZW5kaWYKKwlmb3IgKDs7KSB7CisJCXN3aXRjaCAocEN1ckhjYi0+SENTX1BoYXNlKSB7CisJCWNhc2UgQ01EX09VVDoJLyogQ29tbWFuZCBvdXQgcGhhc2UgICAgICAgICAgICAqLworCQkJZm9yIChpID0gMDsgaSA8IChpbnQpIHBDdXJTY2ItPlNDQl9DREJMZW47IGkrKykKKwkJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIHBDdXJTY2ItPlNDQl9DREJbaV0pOworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX09VVCk7CisJCQlpZiAod2FpdF90dWxpcChwQ3VySGNiKSA9PSAtMSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWlmIChwQ3VySGNiLT5IQ1NfUGhhc2UgPT0gQ01EX09VVCkgeworCQkJCXJldHVybiAodHVsX2JhZF9zZXEocEN1ckhjYikpOworCQkJfQorCQkJcmV0dXJuICg0KTsKKworCQljYXNlIE1TR19JTjoJLyogTWVzc2FnZSBpbiBwaGFzZSAgICAgICAgICAgICAqLworCQkJcEN1clNjYi0+U0NCX054dFN0YXQgPSAzOworCQkJaWYgKHR1bF9tc2dpbihwQ3VySGNiKSA9PSAtMSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1RBVFVTX0lOOgkvKiBTdGF0dXMgcGhhc2UgICAgICAgICAgICAgICAgICovCisJCQlpZiAodHVsX3N0YXR1c19tc2cocEN1ckhjYikgPT0gLTEpCisJCQkJcmV0dXJuICgtMSk7CisJCQlicmVhazsKKworCQljYXNlIE1TR19PVVQ6CS8qIE1lc3NhZ2Ugb3V0IHBoYXNlICAgICAgICAgICAgKi8KKwkJCWlmIChwQ3VyVGNiLT5UQ1NfRmxhZ3MgJiAoVENGX1NZTkNfRE9ORSB8IFRDRl9OT19TWU5DX05FR08pKSB7CisKKwkJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIE1TR19OT1ApOwkJLyogbXNnIG5vcCAqLworCQkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfWEZfRklGT19PVVQpOworCQkJCWlmICh3YWl0X3R1bGlwKHBDdXJIY2IpID09IC0xKQorCQkJCQlyZXR1cm4gKC0xKTsKKworCQkJfSBlbHNlIHsKKwkJCQlwQ3VyVGNiLT5UQ1NfRmxhZ3MgfD0gVENGX1NZTkNfRE9ORTsKKworCQkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgTVNHX0VYVEVORCk7CisJCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCAzKTsJLyogZXh0LiBtc2cgbGVuICovCisJCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCAxKTsJLyogc3luYyByZXF1ZXN0ICovCisJCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCB0dWxfcmF0ZV90YmxbcEN1clRjYi0+VENTX0ZsYWdzICYgVENGX1NDU0lfUkFURV0pOworCQkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgTUFYX09GRlNFVCk7CS8qIFJFUS9BQ0sgb2Zmc2V0ICovCisJCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX09VVCk7CisJCQkJaWYgKHdhaXRfdHVsaXAocEN1ckhjYikgPT0gLTEpCisJCQkJCXJldHVybiAoLTEpOworCQkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ3RybDAsIFRTQ19GTFVTSF9GSUZPKTsKKwkJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU1NpZ25hbCwgVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU1NpZ25hbCkgJiAoVFNDX1NFVF9BQ0sgfCA3KSk7CisKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gKHR1bF9iYWRfc2VxKHBDdXJIY2IpKTsKKwkJfQorCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHR1bF9zdGF0ZV80KEhDUyAqIHBDdXJIY2IpCit7CisJU0NCICpwQ3VyU2NiID0gcEN1ckhjYi0+SENTX0FjdFNjYjsKKworI2lmIERFQlVHX1NUQVRFCisJcHJpbnRrKCItczQtIik7CisjZW5kaWYKKwlpZiAoKHBDdXJTY2ItPlNDQl9GbGFncyAmIFNDRl9ESVIpID09IFNDRl9OT19YRikgeworCQlyZXR1cm4gKDYpOwkvKiBHbyB0byBzdGF0ZSA2ICAgICAgICAgICAgICAgICovCisJfQorCWZvciAoOzspIHsKKwkJaWYgKHBDdXJTY2ItPlNDQl9CdWZMZW4gPT0gMCkKKwkJCXJldHVybiAoNik7CS8qIEdvIHRvIHN0YXRlIDYgICAgICAgICAgICAgICAgKi8KKworCQlzd2l0Y2ggKHBDdXJIY2ItPkhDU19QaGFzZSkgeworCisJCWNhc2UgU1RBVFVTX0lOOgkvKiBTdGF0dXMgcGhhc2UgICAgICAgICAgICAgICAgICovCisJCQlpZiAoKHBDdXJTY2ItPlNDQl9GbGFncyAmIFNDRl9ESVIpICE9IDApIHsJLyogaWYgZGlyZWN0aW9uIGJpdCBzZXQgdGhlbiByZXBvcnQgZGF0YSB1bmRlcnJ1biAqLworCQkJCXBDdXJTY2ItPlNDQl9IYVN0YXQgPSBIT1NUX0RPX0RVOworCQkJfQorCQkJaWYgKCh0dWxfc3RhdHVzX21zZyhwQ3VySGNiKSkgPT0gLTEpCisJCQkJcmV0dXJuICgtMSk7CisJCQlicmVhazsKKworCQljYXNlIE1TR19JTjoJLyogTWVzc2FnZSBpbiBwaGFzZSAgICAgICAgICAgICAqLworCQkJcEN1clNjYi0+U0NCX054dFN0YXQgPSAweDQ7CisJCQlpZiAodHVsX21zZ2luKHBDdXJIY2IpID09IC0xKQorCQkJCXJldHVybiAoLTEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNU0dfT1VUOgkvKiBNZXNzYWdlIG91dCBwaGFzZSAgICAgICAgICAgICovCisJCQlpZiAocEN1ckhjYi0+SENTX0pTU3RhdHVzMCAmIFRTU19QQVJfRVJST1IpIHsKKwkJCQlwQ3VyU2NiLT5TQ0JfQnVmTGVuID0gMDsKKwkJCQlwQ3VyU2NiLT5TQ0JfSGFTdGF0ID0gSE9TVF9ET19EVTsKKwkJCQlpZiAodHVsX21zZ291dF9pZGUocEN1ckhjYikgPT0gLTEpCisJCQkJCXJldHVybiAoLTEpOworCQkJCXJldHVybiAoNik7CS8qIEdvIHRvIHN0YXRlIDYgICAgICAgICAgICAgICAgKi8KKwkJCX0gZWxzZSB7CisJCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBNU0dfTk9QKTsJCS8qIG1zZyBub3AgKi8KKwkJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX1hGX0ZJRk9fT1VUKTsKKwkJCQlpZiAod2FpdF90dWxpcChwQ3VySGNiKSA9PSAtMSkKKwkJCQkJcmV0dXJuICgtMSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIERBVEFfSU46CS8qIERhdGEgaW4gcGhhc2UgICAgICAgICAgICAgICAgKi8KKwkJCXJldHVybiAodHVsX3hmZXJfZGF0YV9pbihwQ3VySGNiKSk7CisKKwkJY2FzZSBEQVRBX09VVDoJLyogRGF0YSBvdXQgcGhhc2UgICAgICAgICAgICAgICAqLworCQkJcmV0dXJuICh0dWxfeGZlcl9kYXRhX291dChwQ3VySGNiKSk7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAodHVsX2JhZF9zZXEocEN1ckhjYikpOworCQl9CisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBzdGF0ZSBhZnRlciBkbWEgeGZlciBkb25lIG9yIHBoYXNlIGNoYW5nZSBiZWZvcmUgeGZlciBkb25lICovCitpbnQgdHVsX3N0YXRlXzUoSENTICogcEN1ckhjYikKK3sKKwlTQ0IgKnBDdXJTY2IgPSBwQ3VySGNiLT5IQ1NfQWN0U2NiOworCWxvbmcgY250LCB4Y250OwkJLyogY2Fubm90IHVzZSB1bnNpZ25lZCAhISBjb2RlOiBpZiAoeGNudCA8IDApICovCisKKyNpZiBERUJVR19TVEFURQorCXByaW50aygiLXM1LSIpOworI2VuZGlmCisvKi0tLS0tLSBnZXQgcmVtYWluaW5nIGNvdW50IC0tLS0tLS0qLworCisJY250ID0gVFVMX1JETE9ORyhwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NDbnQwKSAmIDB4MEZGRkZGRjsKKworCWlmIChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9YQ21kKSAmIDB4MjApIHsKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gREFUQV9JTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCQkvKiBjaGVjayBzY3NpIHBhcml0eSBlcnJvciAqLworCQlpZiAocEN1ckhjYi0+SENTX0pTU3RhdHVzMCAmIFRTU19QQVJfRVJST1IpIHsKKwkJCXBDdXJTY2ItPlNDQl9IYVN0YXQgPSBIT1NUX0RPX0RVOworCQl9CisJCWlmIChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9YU3RhdHVzKSAmIFhQRU5EKSB7CS8qIERNQSB4ZmVyIHBlbmRpbmcsIFNlbmQgU1RPUCAgKi8KKwkJCS8qIHRlbGwgSGFyZHdhcmUgIHNjc2kgeGZlciBoYXMgYmVlbiB0ZXJtaW5hdGVkICovCisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfWEN0cmwsIFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1hDdHJsKSB8IDB4ODApOworCQkJLyogd2FpdCB1bnRpbCBETUEgeGZlciBub3QgcGVuZGluZyAqLworCQkJd2hpbGUgKFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1hTdGF0dXMpICYgWFBFTkQpOworCQl9CisJfSBlbHNlIHsKKy8qLS0tLS0tLS0gREFUQSBPVVQgLS0tLS0tLS0tLS0qLworCQlpZiAoKFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NTdGF0dXMxKSAmIFRTU19YRkVSX0NNUCkgPT0gMCkgeworCQkJaWYgKHBDdXJIY2ItPkhDU19BY3RUY3MtPlRDU19KU19QZXJpb2QgJiBUU0NfV0lERV9TQ1NJKQorCQkJCWNudCArPSAoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU0ZpZm9DbnQpICYgMHgxRikgPDwgMTsKKwkJCWVsc2UKKwkJCQljbnQgKz0gKFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NGaWZvQ250KSAmIDB4MUYpOworCQl9CisJCWlmIChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9YU3RhdHVzKSAmIFhQRU5EKSB7CS8qIGlmIERNQSB4ZmVyIGlzIHBlbmRpbmcsIGFib3J0IERNQSB4ZmVyICovCisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfWENtZCwgVEFYX1hfQUJUKTsKKwkJCS8qIHdhaXQgQWJvcnQgRE1BIHhmZXIgZG9uZSAqLworCQkJd2hpbGUgKChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9JbnQpICYgWEFCVCkgPT0gMCk7CisJCX0KKwkJaWYgKChjbnQgPT0gMSkgJiYgKHBDdXJIY2ItPkhDU19QaGFzZSA9PSBEQVRBX09VVCkpIHsKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfWEZfRklGT19PVVQpOworCQkJaWYgKHdhaXRfdHVsaXAocEN1ckhjYikgPT0gLTEpIHsKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCX0KKwkJCWNudCA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAoKFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NTdGF0dXMxKSAmIFRTU19YRkVSX0NNUCkgPT0gMCkKKwkJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwwLCBUU0NfRkxVU0hfRklGTyk7CisJCX0KKwl9CisKKwlpZiAoY250ID09IDApIHsKKwkJcEN1clNjYi0+U0NCX0J1ZkxlbiA9IDA7CisJCXJldHVybiAoNik7CS8qIEdvIHRvIHN0YXRlIDYgICAgICAgICAgICAgICAgKi8KKwl9CisJLyogVXBkYXRlIGFjdGl2ZSBkYXRhIHBvaW50ZXIgKi8KKwl4Y250ID0gKGxvbmcpIHBDdXJTY2ItPlNDQl9CdWZMZW4gLSBjbnQ7CS8qIHhjbnQ9PSBieXRlcyBhbHJlYWR5IHhmZXJyZWQgKi8KKwlwQ3VyU2NiLT5TQ0JfQnVmTGVuID0gKFUzMikgY250OwkvKiBjbnQgPT0gYnl0ZXMgbGVmdCB0byBiZSB4ZmVycmVkICovCisJaWYgKHBDdXJTY2ItPlNDQl9GbGFncyAmIFNDRl9TRykgeworCQlyZWdpc3RlciBTRyAqc2dwOworCQlVTE9ORyBpOworCisJCXNncCA9ICZwQ3VyU2NiLT5TQ0JfU0dMaXN0W3BDdXJTY2ItPlNDQl9TR0lkeF07CisJCWZvciAoaSA9IHBDdXJTY2ItPlNDQl9TR0lkeDsgaSA8IHBDdXJTY2ItPlNDQl9TR01heDsgc2dwKyssIGkrKykgeworCQkJeGNudCAtPSAobG9uZykgc2dwLT5TR19MZW47CisJCQlpZiAoeGNudCA8IDApIHsJCS8qIHRoaXMgc2dwIHhmZXIgaGFsZiBkb25lICovCisJCQkJeGNudCArPSAobG9uZykgc2dwLT5TR19MZW47CS8qIHhjbnQgPT0gYnl0ZXMgeGZlcnJlZCBpbiB0aGlzIHNncCAqLworCQkJCXNncC0+U0dfUHRyICs9IChVMzIpIHhjbnQ7CS8qIG5ldyBwdHIgdG8gYmUgeGZlciAqLworCQkJCXNncC0+U0dfTGVuIC09IChVMzIpIHhjbnQ7CS8qIG5ldyBsZW4gdG8gYmUgeGZlciAqLworCQkJCXBDdXJTY2ItPlNDQl9CdWZQdHIgKz0gKChVMzIpIChpIC0gcEN1clNjYi0+U0NCX1NHSWR4KSA8PCAzKTsKKwkJCQkvKiBuZXcgU0cgdGFibGUgcHRyICovCisJCQkJcEN1clNjYi0+U0NCX1NHTGVuID0gKEJZVEUpIChwQ3VyU2NiLT5TQ0JfU0dNYXggLSBpKTsKKwkJCQkvKiBuZXcgU0cgdGFibGUgbGVuICovCisJCQkJcEN1clNjYi0+U0NCX1NHSWR4ID0gKFdPUkQpIGk7CisJCQkJLyogZm9yIG5leHQgZGlzYyBhbmQgY29tZSBpbiB0aGlzIGxvb3AgKi8KKwkJCQlyZXR1cm4gKDQpOwkvKiBHbyB0byBzdGF0ZSA0ICAgICAgICAgICAgICAgICovCisJCQl9CisJCQkvKiBlbHNlICh4Y250ID49IDAgLCBpLmUuIHRoaXMgc2dwIGFscmVhZHkgeGZlcnJlZCAqLworCQl9CQkvKiBmb3IgKi8KKwkJcmV0dXJuICg2KTsJLyogR28gdG8gc3RhdGUgNiAgICAgICAgICAgICAgICAqLworCX0gZWxzZSB7CisJCXBDdXJTY2ItPlNDQl9CdWZQdHIgKz0gKFUzMikgeGNudDsKKwl9CisJcmV0dXJuICg0KTsJCS8qIEdvIHRvIHN0YXRlIDQgICAgICAgICAgICAgICAgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHN0YXRlIGFmdGVyIERhdGEgcGhhc2UgKi8KK2ludCB0dWxfc3RhdGVfNihIQ1MgKiBwQ3VySGNiKQoreworCVNDQiAqcEN1clNjYiA9IHBDdXJIY2ItPkhDU19BY3RTY2I7CisKKyNpZiBERUJVR19TVEFURQorCXByaW50aygiLXM2LSIpOworI2VuZGlmCisJZm9yICg7OykgeworCQlzd2l0Y2ggKHBDdXJIY2ItPkhDU19QaGFzZSkgeworCQljYXNlIFNUQVRVU19JTjoJLyogU3RhdHVzIHBoYXNlICAgICAgICAgICAgICAgICAqLworCQkJaWYgKCh0dWxfc3RhdHVzX21zZyhwQ3VySGNiKSkgPT0gLTEpCisJCQkJcmV0dXJuICgtMSk7CisJCQlicmVhazsKKworCQljYXNlIE1TR19JTjoJLyogTWVzc2FnZSBpbiBwaGFzZSAgICAgICAgICAgICAqLworCQkJcEN1clNjYi0+U0NCX054dFN0YXQgPSA2OworCQkJaWYgKCh0dWxfbXNnaW4ocEN1ckhjYikpID09IC0xKQorCQkJCXJldHVybiAoLTEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNU0dfT1VUOgkvKiBNZXNzYWdlIG91dCBwaGFzZSAgICAgICAgICAgICovCisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIE1TR19OT1ApOwkJLyogbXNnIG5vcCAqLworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX09VVCk7CisJCQlpZiAod2FpdF90dWxpcChwQ3VySGNiKSA9PSAtMSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWJyZWFrOworCisJCWNhc2UgREFUQV9JTjoJLyogRGF0YSBpbiBwaGFzZSAgICAgICAgICAgICAgICAqLworCQkJcmV0dXJuICh0dWxfeHBhZF9pbihwQ3VySGNiKSk7CisKKwkJY2FzZSBEQVRBX09VVDoJLyogRGF0YSBvdXQgcGhhc2UgICAgICAgICAgICAgICAqLworCQkJcmV0dXJuICh0dWxfeHBhZF9vdXQocEN1ckhjYikpOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gKHR1bF9iYWRfc2VxKHBDdXJIY2IpKTsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfc3RhdGVfNyhIQ1MgKiBwQ3VySGNiKQoreworCWludCBjbnQsIGk7CisKKyNpZiBERUJVR19TVEFURQorCXByaW50aygiLXM3LSIpOworI2VuZGlmCisJLyogZmx1c2ggU0NTSSBGSUZPICovCisJY250ID0gVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU0ZpZm9DbnQpICYgMHgxRjsKKwlpZiAoY250KSB7CisJCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykKKwkJCVRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NGaWZvKTsKKwl9CisJc3dpdGNoIChwQ3VySGNiLT5IQ1NfUGhhc2UpIHsKKwljYXNlIERBVEFfSU46CQkvKiBEYXRhIGluIHBoYXNlICAgICAgICAgICAgICAgICovCisJY2FzZSBEQVRBX09VVDoJCS8qIERhdGEgb3V0IHBoYXNlICAgICAgICAgICAgICAgKi8KKwkJcmV0dXJuICh0dWxfYmFkX3NlcShwQ3VySGNiKSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuICg2KTsJLyogR28gdG8gc3RhdGUgNiAgICAgICAgICAgICAgICAqLworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfeGZlcl9kYXRhX2luKEhDUyAqIHBDdXJIY2IpCit7CisJU0NCICpwQ3VyU2NiID0gcEN1ckhjYi0+SENTX0FjdFNjYjsKKworCWlmICgocEN1clNjYi0+U0NCX0ZsYWdzICYgU0NGX0RJUikgPT0gU0NGX0RPVVQpIHsKKwkJcmV0dXJuICg2KTsJLyogd3JvbmcgZGlyZWN0aW9uICovCisJfQorCVRVTF9XUkxPTkcocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NudDAsIHBDdXJTY2ItPlNDQl9CdWZMZW4pOworCisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9ETUFfSU4pOwkvKiA3LzI1Lzk1ICovCisKKwlpZiAocEN1clNjYi0+U0NCX0ZsYWdzICYgU0NGX1NHKSB7CS8qIFMvRyB4ZmVyICovCisJCVRVTF9XUkxPTkcocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfWENudEgsICgoVUxPTkcpIHBDdXJTY2ItPlNDQl9TR0xlbikgPDwgMyk7CisJCVRVTF9XUkxPTkcocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfWEFkZEgsIHBDdXJTY2ItPlNDQl9CdWZQdHIpOworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfWENtZCwgVEFYX1NHX0lOKTsKKwl9IGVsc2UgeworCQlUVUxfV1JMT05HKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1hDbnRILCBwQ3VyU2NiLT5TQ0JfQnVmTGVuKTsKKwkJVFVMX1dSTE9ORyhwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9YQWRkSCwgcEN1clNjYi0+U0NCX0J1ZlB0cik7CisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9YQ21kLCBUQVhfWF9JTik7CisJfQorCXBDdXJTY2ItPlNDQl9OeHRTdGF0ID0gMHg1OworCXJldHVybiAoMCk7CQkvKiByZXR1cm4gdG8gT1MsIHdhaXQgeGZlciBkb25lICwgbGV0IGphc19pc3IgY29tZSBpbiAqLworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdHVsX3hmZXJfZGF0YV9vdXQoSENTICogcEN1ckhjYikKK3sKKwlTQ0IgKnBDdXJTY2IgPSBwQ3VySGNiLT5IQ1NfQWN0U2NiOworCisJaWYgKChwQ3VyU2NiLT5TQ0JfRmxhZ3MgJiBTQ0ZfRElSKSA9PSBTQ0ZfRElOKSB7CisJCXJldHVybiAoNik7CS8qIHdyb25nIGRpcmVjdGlvbiAqLworCX0KKwlUVUxfV1JMT05HKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbnQwLCBwQ3VyU2NiLT5TQ0JfQnVmTGVuKTsKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX1hGX0RNQV9PVVQpOworCisJaWYgKHBDdXJTY2ItPlNDQl9GbGFncyAmIFNDRl9TRykgewkvKiBTL0cgeGZlciAqLworCQlUVUxfV1JMT05HKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1hDbnRILCAoKFVMT05HKSBwQ3VyU2NiLT5TQ0JfU0dMZW4pIDw8IDMpOworCQlUVUxfV1JMT05HKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1hBZGRILCBwQ3VyU2NiLT5TQ0JfQnVmUHRyKTsKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1hDbWQsIFRBWF9TR19PVVQpOworCX0gZWxzZSB7CisJCVRVTF9XUkxPTkcocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfWENudEgsIHBDdXJTY2ItPlNDQl9CdWZMZW4pOworCQlUVUxfV1JMT05HKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1hBZGRILCBwQ3VyU2NiLT5TQ0JfQnVmUHRyKTsKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1hDbWQsIFRBWF9YX09VVCk7CisJfQorCisJcEN1clNjYi0+U0NCX054dFN0YXQgPSAweDU7CisJcmV0dXJuICgwKTsJCS8qIHJldHVybiB0byBPUywgd2FpdCB4ZmVyIGRvbmUgLCBsZXQgamFzX2lzciBjb21lIGluICovCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfeHBhZF9pbihIQ1MgKiBwQ3VySGNiKQoreworCVNDQiAqcEN1clNjYiA9IHBDdXJIY2ItPkhDU19BY3RTY2I7CisJVENTICpwQ3VyVGNiID0gcEN1ckhjYi0+SENTX0FjdFRjczsKKworCWlmICgocEN1clNjYi0+U0NCX0ZsYWdzICYgU0NGX0RJUikgIT0gU0NGX05PX0RDSEspIHsKKwkJcEN1clNjYi0+U0NCX0hhU3RhdCA9IEhPU1RfRE9fRFU7CS8qIG92ZXIgcnVuICAgICAgICAgICAgICovCisJfQorCWZvciAoOzspIHsKKwkJaWYgKHBDdXJUY2ItPlRDU19KU19QZXJpb2QgJiBUU0NfV0lERV9TQ1NJKQorCQkJVFVMX1dSTE9ORyhwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ250MCwgMik7CisJCWVsc2UKKwkJCVRVTF9XUkxPTkcocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NudDAsIDEpOworCisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfWEZfRklGT19JTik7CisJCWlmICgod2FpdF90dWxpcChwQ3VySGNiKSkgPT0gLTEpIHsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCWlmIChwQ3VySGNiLT5IQ1NfUGhhc2UgIT0gREFUQV9JTikgeworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDdHJsMCwgVFNDX0ZMVVNIX0ZJRk8pOworCQkJcmV0dXJuICg2KTsKKwkJfQorCQlUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TRmlmbyk7CisJfQorfQorCitpbnQgdHVsX3hwYWRfb3V0KEhDUyAqIHBDdXJIY2IpCit7CisJU0NCICpwQ3VyU2NiID0gcEN1ckhjYi0+SENTX0FjdFNjYjsKKwlUQ1MgKnBDdXJUY2IgPSBwQ3VySGNiLT5IQ1NfQWN0VGNzOworCisJaWYgKChwQ3VyU2NiLT5TQ0JfRmxhZ3MgJiBTQ0ZfRElSKSAhPSBTQ0ZfTk9fRENISykgeworCQlwQ3VyU2NiLT5TQ0JfSGFTdGF0ID0gSE9TVF9ET19EVTsJLyogb3ZlciBydW4gICAgICAgICAgICAgKi8KKwl9CisJZm9yICg7OykgeworCQlpZiAocEN1clRjYi0+VENTX0pTX1BlcmlvZCAmIFRTQ19XSURFX1NDU0kpCisJCQlUVUxfV1JMT05HKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbnQwLCAyKTsKKwkJZWxzZQorCQkJVFVMX1dSTE9ORyhwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ250MCwgMSk7CisKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCAwKTsKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX09VVCk7CisJCWlmICgod2FpdF90dWxpcChwQ3VySGNiKSkgPT0gLTEpIHsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCWlmIChwQ3VySGNiLT5IQ1NfUGhhc2UgIT0gREFUQV9PVVQpIHsJLyogRGlzYWJsZSB3aWRlIENQVSB0byBhbGxvdyByZWFkIDE2IGJpdHMgKi8KKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ3RybDEsIFRTQ19IV19SRVNFTEVDVCk7CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwwLCBUU0NfRkxVU0hfRklGTyk7CisJCQlyZXR1cm4gKDYpOworCQl9CisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdHVsX3N0YXR1c19tc2coSENTICogcEN1ckhjYikKK3sJCQkJLyogc3RhdHVzICYgTVNHX0lOICovCisJU0NCICpwQ3VyU2NiID0gcEN1ckhjYi0+SENTX0FjdFNjYjsKKwlCWVRFIG1zZzsKKworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfQ01EX0NPTVApOworCWlmICgod2FpdF90dWxpcChwQ3VySGNiKSkgPT0gLTEpIHsKKwkJcmV0dXJuICgtMSk7CisJfQorCS8qIGdldCBzdGF0dXMgKi8KKwlwQ3VyU2NiLT5TQ0JfVGFTdGF0ID0gVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU0ZpZm8pOworCisJaWYgKHBDdXJIY2ItPkhDU19QaGFzZSA9PSBNU0dfT1VUKSB7CisJCWlmIChwQ3VySGNiLT5IQ1NfSlNTdGF0dXMwICYgVFNTX1BBUl9FUlJPUikgeworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBNU0dfUEFSSVRZKTsKKwkJfSBlbHNlIHsKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgTVNHX05PUCk7CisJCX0KKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX09VVCk7CisJCXJldHVybiAod2FpdF90dWxpcChwQ3VySGNiKSk7CisJfQorCWlmIChwQ3VySGNiLT5IQ1NfUGhhc2UgPT0gTVNHX0lOKSB7CisJCW1zZyA9IFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NGaWZvKTsKKwkJaWYgKHBDdXJIY2ItPkhDU19KU1N0YXR1czAgJiBUU1NfUEFSX0VSUk9SKSB7CS8qIFBhcml0eSBlcnJvciAgICAgICAgICAgICAgICAgKi8KKwkJCWlmICgodHVsX21zZ2luX2FjY2VwdChwQ3VySGNiKSkgPT0gLTEpCisJCQkJcmV0dXJuICgtMSk7CisJCQlpZiAocEN1ckhjYi0+SENTX1BoYXNlICE9IE1TR19PVVQpCisJCQkJcmV0dXJuICh0dWxfYmFkX3NlcShwQ3VySGNiKSk7CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIE1TR19QQVJJVFkpOworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX09VVCk7CisJCQlyZXR1cm4gKHdhaXRfdHVsaXAocEN1ckhjYikpOworCQl9CisJCWlmIChtc2cgPT0gMCkgewkvKiBDb21tYW5kIGNvbXBsZXRlICAgICAgICAgICAgICovCisKKwkJCWlmICgocEN1clNjYi0+U0NCX1RhU3RhdCAmIDB4MTgpID09IDB4MTApIHsJLyogTm8gbGluayBzdXBwb3J0ICAgICAgICAgICAgICAqLworCQkJCXJldHVybiAodHVsX2JhZF9zZXEocEN1ckhjYikpOworCQkJfQorCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDdHJsMCwgVFNDX0ZMVVNIX0ZJRk8pOworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19NU0dfQUNDRVBUKTsKKwkJCXJldHVybiB0dWxfd2FpdF9kb25lX2Rpc2MocEN1ckhjYik7CisKKwkJfQorCQlpZiAoKG1zZyA9PSBNU0dfTElOS19DT01QKSB8fCAobXNnID09IE1TR19MSU5LX0ZMQUcpKSB7CisJCQlpZiAoKHBDdXJTY2ItPlNDQl9UYVN0YXQgJiAweDE4KSA9PSAweDEwKQorCQkJCXJldHVybiAodHVsX21zZ2luX2FjY2VwdChwQ3VySGNiKSk7CisJCX0KKwl9CisJcmV0dXJuICh0dWxfYmFkX3NlcShwQ3VySGNiKSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHNjc2kgYnVzIGZyZWUgKi8KK2ludCBpbnRfdHVsX2J1c2ZyZWUoSENTICogcEN1ckhjYikKK3sKKwlTQ0IgKnBDdXJTY2IgPSBwQ3VySGNiLT5IQ1NfQWN0U2NiOworCisJaWYgKHBDdXJTY2IgIT0gTlVMTCkgeworCQlpZiAocEN1clNjYi0+U0NCX1N0YXR1cyAmIFNDQl9TRUxFQ1QpIHsJCS8qIHNlbGVjdGlvbiB0aW1lb3V0ICovCisJCQl0dWxfdW5saW5rX3BlbmRfc2NiKHBDdXJIY2IsIHBDdXJTY2IpOworCQkJcEN1clNjYi0+U0NCX0hhU3RhdCA9IEhPU1RfU0VMX1RPVVQ7CisJCQl0dWxfYXBwZW5kX2RvbmVfc2NiKHBDdXJIY2IsIHBDdXJTY2IpOworCQl9IGVsc2UgewkvKiBVbmV4cGVjdGVkIGJ1cyBmcmVlICAgICAgICAgICovCisJCQl0dWxfdW5saW5rX2J1c3lfc2NiKHBDdXJIY2IsIHBDdXJTY2IpOworCQkJcEN1clNjYi0+U0NCX0hhU3RhdCA9IEhPU1RfQlVTX0ZSRUU7CisJCQl0dWxfYXBwZW5kX2RvbmVfc2NiKHBDdXJIY2IsIHBDdXJTY2IpOworCQl9CisJCXBDdXJIY2ItPkhDU19BY3RTY2IgPSBOVUxMOworCQlwQ3VySGNiLT5IQ1NfQWN0VGNzID0gTlVMTDsKKwl9CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDdHJsMCwgVFNDX0ZMVVNIX0ZJRk8pOwkJLyogRmx1c2ggU0NTSSBGSUZPICAqLworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ29uZmlnLCBUU0NfSU5JVERFRkFVTFQpOworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ3RybDEsIFRTQ19IV19SRVNFTEVDVCk7CS8qIEVuYWJsZSBIVyByZXNlbGVjdCAgICAgICAqLworCXJldHVybiAoLTEpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBzY3NpIGJ1cyByZXNldCAqLworaW50IGludF90dWxfc2NzaV9yc3QoSENTICogcEN1ckhjYikKK3sKKwlTQ0IgKnBDdXJTY2I7CisJaW50IGk7CisKKwkvKiBpZiBETUEgeGZlciBpcyBwZW5kaW5nLCBhYm9ydCBETUEgeGZlciAqLworCWlmIChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9YU3RhdHVzKSAmIDB4MDEpIHsKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1hDbWQsIFRBWF9YX0FCVCB8IFRBWF9YX0NMUl9GSUZPKTsKKwkJLyogd2FpdCBBYm9ydCBETUEgeGZlciBkb25lICovCisJCXdoaWxlICgoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfSW50KSAmIDB4MDQpID09IDApOworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwwLCBUU0NfRkxVU0hfRklGTyk7CisJfQorCS8qIEFib3J0IGFsbCBhY3RpdmUgJiBkaXNjb25uZWN0ZWQgc2NiICovCisJd2hpbGUgKChwQ3VyU2NiID0gdHVsX3BvcF9idXN5X3NjYihwQ3VySGNiKSkgIT0gTlVMTCkgeworCQlwQ3VyU2NiLT5TQ0JfSGFTdGF0ID0gSE9TVF9CQURfUEhBUzsKKwkJdHVsX2FwcGVuZF9kb25lX3NjYihwQ3VySGNiLCBwQ3VyU2NiKTsKKwl9CisJcEN1ckhjYi0+SENTX0FjdFNjYiA9IE5VTEw7CisJcEN1ckhjYi0+SENTX0FjdFRjcyA9IE5VTEw7CisKKwkvKiBjbHIgc3luYyBuZWdvLiBkb25lIGZsYWcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcEN1ckhjYi0+SENTX01heFRhcjsgaSsrKSB7CisJCXBDdXJIY2ItPkhDU19UY3NbaV0uVENTX0ZsYWdzICY9IH4oVENGX1NZTkNfRE9ORSB8IFRDRl9XRFRSX0RPTkUpOworCX0KKwlyZXR1cm4gKC0xKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogc2NzaSByZXNlbGVjdGlvbiAqLworaW50IGludF90dWxfcmVzZWwoSENTICogcEN1ckhjYikKK3sKKwlTQ0IgKnBDdXJTY2I7CisJVENTICpwQ3VyVGNiOworCUJZVEUgdGFnLCBtc2cgPSAwOworCUJZVEUgdGFyLCBsdW47CisKKwlpZiAoKHBDdXJTY2IgPSBwQ3VySGNiLT5IQ1NfQWN0U2NiKSAhPSBOVUxMKSB7CisJCWlmIChwQ3VyU2NiLT5TQ0JfU3RhdHVzICYgU0NCX1NFTEVDVCkgewkJLyogaWYgd2FpdGluZyBmb3Igc2VsZWN0aW9uIGNvbXBsZXRlICovCisJCQlwQ3VyU2NiLT5TQ0JfU3RhdHVzICY9IH5TQ0JfU0VMRUNUOworCQl9CisJCXBDdXJIY2ItPkhDU19BY3RTY2IgPSBOVUxMOworCX0KKwkvKiAtLS0tLS0tLS0gZ2V0IHRhcmdldCBpZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwl0YXIgPSBUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TQnVzSWQpOworCS8qIC0tLS0tLSBnZXQgTFVOIGZyb20gSWRlbnRpZnkgbWVzc2FnZS0tLS0tLS0tLS0tICovCisJbHVuID0gVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU0lkZW50KSAmIDB4MEY7CisJLyogMDcvMjIvOTggZnJvbSAweDFGIC0+IDB4MEYgKi8KKwlwQ3VyVGNiID0gJnBDdXJIY2ItPkhDU19UY3NbdGFyXTsKKwlwQ3VySGNiLT5IQ1NfQWN0VGNzID0gcEN1clRjYjsKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NvbmZpZywgcEN1clRjYi0+VENTX1NDb25maWcwKTsKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU1BlcmlvZCwgcEN1clRjYi0+VENTX0pTX1BlcmlvZCk7CisKKworCS8qIC0tLS0tLS0tLS0tLS0gdGFnIHF1ZXVlaW5nID8gLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWlmIChwQ3VyVGNiLT5UQ1NfRHJ2RmxhZ3MgJiBUQ0ZfRFJWX0VOX1RBRykgeworCQlpZiAoKHR1bF9tc2dpbl9hY2NlcHQocEN1ckhjYikpID09IC0xKQorCQkJcmV0dXJuICgtMSk7CisJCWlmIChwQ3VySGNiLT5IQ1NfUGhhc2UgIT0gTVNHX0lOKQorCQkJZ290byBub190YWc7CisJCVRVTF9XUkxPTkcocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NudDAsIDEpOworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX1hGX0ZJRk9fSU4pOworCQlpZiAoKHdhaXRfdHVsaXAocEN1ckhjYikpID09IC0xKQorCQkJcmV0dXJuICgtMSk7CisJCW1zZyA9IFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NGaWZvKTsJLyogUmVhZCBUYWcgTWVzc2FnZSAgICAqLworCisJCWlmICgobXNnIDwgTVNHX1NUQUcpIHx8IChtc2cgPiBNU0dfT1RBRykpCS8qIElzIHNpbXBsZSBUYWcgICAgICAqLworCQkJZ290byBub190YWc7CisKKwkJaWYgKCh0dWxfbXNnaW5fYWNjZXB0KHBDdXJIY2IpKSA9PSAtMSkKKwkJCXJldHVybiAoLTEpOworCisJCWlmIChwQ3VySGNiLT5IQ1NfUGhhc2UgIT0gTVNHX0lOKQorCQkJZ290byBub190YWc7CisKKwkJVFVMX1dSTE9ORyhwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ250MCwgMSk7CisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfWEZfRklGT19JTik7CisJCWlmICgod2FpdF90dWxpcChwQ3VySGNiKSkgPT0gLTEpCisJCQlyZXR1cm4gKC0xKTsKKwkJdGFnID0gVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU0ZpZm8pOwkvKiBSZWFkIFRhZyBJRCAgICAgICAqLworCQlwQ3VyU2NiID0gcEN1ckhjYi0+SENTX1NjYiArIHRhZzsKKwkJaWYgKChwQ3VyU2NiLT5TQ0JfVGFyZ2V0ICE9IHRhcikgfHwgKHBDdXJTY2ItPlNDQl9MdW4gIT0gbHVuKSkgeworCQkJcmV0dXJuIHR1bF9tc2dvdXRfYWJvcnRfdGFnKHBDdXJIY2IpOworCQl9CisJCWlmIChwQ3VyU2NiLT5TQ0JfU3RhdHVzICE9IFNDQl9CVVNZKSB7CS8qIDAzLzI0Lzk1ICAgICAgICAgICAgICovCisJCQlyZXR1cm4gdHVsX21zZ291dF9hYm9ydF90YWcocEN1ckhjYik7CisJCX0KKwkJcEN1ckhjYi0+SENTX0FjdFNjYiA9IHBDdXJTY2I7CisJCWlmICgodHVsX21zZ2luX2FjY2VwdChwQ3VySGNiKSkgPT0gLTEpCisJCQlyZXR1cm4gKC0xKTsKKwl9IGVsc2UgewkJLyogTm8gdGFnICAgICAgICAgICAgICAgKi8KKwkgICAgICBub190YWc6CisJCWlmICgocEN1clNjYiA9IHR1bF9maW5kX2J1c3lfc2NiKHBDdXJIY2IsIHRhciB8IChsdW4gPDwgOCkpKSA9PSBOVUxMKSB7CisJCQlyZXR1cm4gdHVsX21zZ291dF9hYm9ydF90YXJnKHBDdXJIY2IpOworCQl9CisJCXBDdXJIY2ItPkhDU19BY3RTY2IgPSBwQ3VyU2NiOworCQlpZiAoIShwQ3VyVGNiLT5UQ1NfRHJ2RmxhZ3MgJiBUQ0ZfRFJWX0VOX1RBRykpIHsKKwkJCWlmICgodHVsX21zZ2luX2FjY2VwdChwQ3VySGNiKSkgPT0gLTEpCisJCQkJcmV0dXJuICgtMSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBpbnRfdHVsX2JhZF9zZXEoSENTICogcEN1ckhjYikKK3sJCQkJLyogdGFyZ2V0IHdyb25nIHBoYXNlICAgICAgICAgICAqLworCVNDQiAqcEN1clNjYjsKKwlpbnQgaTsKKworCXR1bF9yZXNldF9zY3NpKHBDdXJIY2IsIDEwKTsKKworCXdoaWxlICgocEN1clNjYiA9IHR1bF9wb3BfYnVzeV9zY2IocEN1ckhjYikpICE9IE5VTEwpIHsKKwkJcEN1clNjYi0+U0NCX0hhU3RhdCA9IEhPU1RfQkFEX1BIQVM7CisJCXR1bF9hcHBlbmRfZG9uZV9zY2IocEN1ckhjYiwgcEN1clNjYik7CisJfQorCWZvciAoaSA9IDA7IGkgPCBwQ3VySGNiLT5IQ1NfTWF4VGFyOyBpKyspIHsKKwkJcEN1ckhjYi0+SENTX1Rjc1tpXS5UQ1NfRmxhZ3MgJj0gfihUQ0ZfU1lOQ19ET05FIHwgVENGX1dEVFJfRE9ORSk7CisJfQorCXJldHVybiAoLTEpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdHVsX21zZ291dF9hYm9ydF90YXJnKEhDUyAqIHBDdXJIY2IpCit7CisKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU1NpZ25hbCwgKChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TU2lnbmFsKSAmIChUU0NfU0VUX0FDSyB8IDcpKSB8IFRTQ19TRVRfQVROKSk7CisJaWYgKHR1bF9tc2dpbl9hY2NlcHQocEN1ckhjYikgPT0gLTEpCisJCXJldHVybiAoLTEpOworCWlmIChwQ3VySGNiLT5IQ1NfUGhhc2UgIT0gTVNHX09VVCkKKwkJcmV0dXJuICh0dWxfYmFkX3NlcShwQ3VySGNiKSk7CisKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIE1TR19BQk9SVCk7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX09VVCk7CisKKwlyZXR1cm4gdHVsX3dhaXRfZGlzYyhwQ3VySGNiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfbXNnb3V0X2Fib3J0X3RhZyhIQ1MgKiBwQ3VySGNiKQoreworCisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NTaWduYWwsICgoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU1NpZ25hbCkgJiAoVFNDX1NFVF9BQ0sgfCA3KSkgfCBUU0NfU0VUX0FUTikpOworCWlmICh0dWxfbXNnaW5fYWNjZXB0KHBDdXJIY2IpID09IC0xKQorCQlyZXR1cm4gKC0xKTsKKwlpZiAocEN1ckhjYi0+SENTX1BoYXNlICE9IE1TR19PVVQpCisJCXJldHVybiAodHVsX2JhZF9zZXEocEN1ckhjYikpOworCisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBNU0dfQUJPUlRfVEFHKTsKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX1hGX0ZJRk9fT1VUKTsKKworCXJldHVybiB0dWxfd2FpdF9kaXNjKHBDdXJIY2IpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdHVsX21zZ2luKEhDUyAqIHBDdXJIY2IpCit7CisJVENTICpwQ3VyVGNiOworCisJZm9yICg7OykgeworCisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ3RybDAsIFRTQ19GTFVTSF9GSUZPKTsKKworCQlUVUxfV1JMT05HKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbnQwLCAxKTsKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX0lOKTsKKwkJaWYgKCh3YWl0X3R1bGlwKHBDdXJIY2IpKSA9PSAtMSkKKwkJCXJldHVybiAoLTEpOworCisJCXN3aXRjaCAoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU0ZpZm8pKSB7CisJCWNhc2UgTVNHX0RJU0M6CS8qIERpc2Nvbm5lY3QgbXNnICovCisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX01TR19BQ0NFUFQpOworCisJCQlyZXR1cm4gdHVsX3dhaXRfZGlzYyhwQ3VySGNiKTsKKworCQljYXNlIE1TR19TRFA6CisJCWNhc2UgTVNHX1JFU1RPUkU6CisJCWNhc2UgTVNHX05PUDoKKwkJCXR1bF9tc2dpbl9hY2NlcHQocEN1ckhjYik7CisJCQlicmVhazsKKworCQljYXNlIE1TR19SRUo6CS8qIENsZWFyIEFUTiBmaXJzdCAgICAgICAgICAgICAgKi8KKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TU2lnbmFsLAorCQkJICAgICAgIChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TU2lnbmFsKSAmIChUU0NfU0VUX0FDSyB8IDcpKSk7CisJCQlwQ3VyVGNiID0gcEN1ckhjYi0+SENTX0FjdFRjczsKKwkJCWlmICgocEN1clRjYi0+VENTX0ZsYWdzICYgKFRDRl9TWU5DX0RPTkUgfCBUQ0ZfTk9fU1lOQ19ORUdPKSkgPT0gMCkgewkvKiBkbyBzeW5jIG5lZ28gKi8KKwkJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU1NpZ25hbCwgKChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TU2lnbmFsKSAmIChUU0NfU0VUX0FDSyB8IDcpKSB8IFRTQ19TRVRfQVROKSk7CisJCQl9CisJCQl0dWxfbXNnaW5fYWNjZXB0KHBDdXJIY2IpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNU0dfRVhURU5EOgkvKiBleHRlbmRlZCBtc2cgKi8KKwkJCXR1bF9tc2dpbl9leHRlbmQocEN1ckhjYik7CisJCQlicmVhazsKKworCQljYXNlIE1TR19JR05PUkVXSURFOgorCQkJdHVsX21zZ2luX2FjY2VwdChwQ3VySGNiKTsKKwkJCWJyZWFrOworCisJCQkvKiBnZXQgKi8KKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfWEZfRklGT19JTik7CisJCQlpZiAod2FpdF90dWxpcChwQ3VySGNiKSA9PSAtMSkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgMCk7CS8qIHB1dCBwYWQgICovCisJCQlUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TRmlmbyk7CS8qIGdldCBJR05PUkUgZmllbGQgKi8KKwkJCVRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NGaWZvKTsJLyogZ2V0IHBhZCAqLworCisJCQl0dWxfbXNnaW5fYWNjZXB0KHBDdXJIY2IpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNU0dfQ09NUDoKKwkJCXsKKwkJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwwLCBUU0NfRkxVU0hfRklGTyk7CisJCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19NU0dfQUNDRVBUKTsKKwkJCQlyZXR1cm4gdHVsX3dhaXRfZG9uZV9kaXNjKHBDdXJIY2IpOworCQkJfQorCQlkZWZhdWx0OgorCQkJdHVsX21zZ291dF9yZWplY3QocEN1ckhjYik7CisJCQlicmVhazsKKwkJfQorCQlpZiAocEN1ckhjYi0+SENTX1BoYXNlICE9IE1TR19JTikKKwkJCXJldHVybiAocEN1ckhjYi0+SENTX1BoYXNlKTsKKwl9CisJLyogc3RhdGVtZW50IHdvbid0IHJlYWNoIGhlcmUgKi8KK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfbXNnb3V0X3JlamVjdChIQ1MgKiBwQ3VySGNiKQoreworCisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NTaWduYWwsICgoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU1NpZ25hbCkgJiAoVFNDX1NFVF9BQ0sgfCA3KSkgfCBUU0NfU0VUX0FUTikpOworCisJaWYgKCh0dWxfbXNnaW5fYWNjZXB0KHBDdXJIY2IpKSA9PSAtMSkKKwkJcmV0dXJuICgtMSk7CisKKwlpZiAocEN1ckhjYi0+SENTX1BoYXNlID09IE1TR19PVVQpIHsKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBNU0dfUkVKKTsJCS8qIE1zZyByZWplY3QgICAgICAgICAgICovCisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfWEZfRklGT19PVVQpOworCQlyZXR1cm4gKHdhaXRfdHVsaXAocEN1ckhjYikpOworCX0KKwlyZXR1cm4gKHBDdXJIY2ItPkhDU19QaGFzZSk7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHR1bF9tc2dvdXRfaWRlKEhDUyAqIHBDdXJIY2IpCit7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBNU0dfSURFKTsJCS8qIEluaXRpYXRvciBEZXRlY3RlZCBFcnJvciAqLworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfWEZfRklGT19PVVQpOworCXJldHVybiAod2FpdF90dWxpcChwQ3VySGNiKSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfbXNnaW5fZXh0ZW5kKEhDUyAqIHBDdXJIY2IpCit7CisJQllURSBsZW4sIGlkeDsKKworCWlmICh0dWxfbXNnaW5fYWNjZXB0KHBDdXJIY2IpICE9IE1TR19JTikKKwkJcmV0dXJuIChwQ3VySGNiLT5IQ1NfUGhhc2UpOworCisJLyogR2V0IGV4dGVuZGVkIG1zZyBsZW5ndGggICAgICAqLworCVRVTF9XUkxPTkcocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NudDAsIDEpOworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfWEZfRklGT19JTik7CisJaWYgKHdhaXRfdHVsaXAocEN1ckhjYikgPT0gLTEpCisJCXJldHVybiAoLTEpOworCisJbGVuID0gVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU0ZpZm8pOworCXBDdXJIY2ItPkhDU19Nc2dbMF0gPSBsZW47CisJZm9yIChpZHggPSAxOyBsZW4gIT0gMDsgbGVuLS0pIHsKKworCQlpZiAoKHR1bF9tc2dpbl9hY2NlcHQocEN1ckhjYikpICE9IE1TR19JTikKKwkJCXJldHVybiAocEN1ckhjYi0+SENTX1BoYXNlKTsKKwkJVFVMX1dSTE9ORyhwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ250MCwgMSk7CisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfWEZfRklGT19JTik7CisJCWlmICh3YWl0X3R1bGlwKHBDdXJIY2IpID09IC0xKQorCQkJcmV0dXJuICgtMSk7CisJCXBDdXJIY2ItPkhDU19Nc2dbaWR4KytdID0gVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU0ZpZm8pOworCX0KKwlpZiAocEN1ckhjYi0+SENTX01zZ1sxXSA9PSAxKSB7CQkvKiBpZiBpdCdzIHN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXIgcmVxdWVzdCAqLworCQlpZiAocEN1ckhjYi0+SENTX01zZ1swXSAhPSAzKQkvKiBpZiBsZW5ndGggaXMgbm90IHJpZ2h0ICovCisJCQlyZXR1cm4gKHR1bF9tc2dvdXRfcmVqZWN0KHBDdXJIY2IpKTsKKwkJaWYgKHBDdXJIY2ItPkhDU19BY3RUY3MtPlRDU19GbGFncyAmIFRDRl9OT19TWU5DX05FR08pIHsJLyogU2V0IE9GRlNFVD0wIHRvIGRvIGFzeW5jLCBuZWdvIGJhY2sgKi8KKwkJCXBDdXJIY2ItPkhDU19Nc2dbM10gPSAwOworCQl9IGVsc2UgeworCQkJaWYgKCh0dWxfbXNnaW5fc3luYyhwQ3VySGNiKSA9PSAwKSAmJgorCQkJICAgIChwQ3VySGNiLT5IQ1NfQWN0VGNzLT5UQ1NfRmxhZ3MgJiBUQ0ZfU1lOQ19ET05FKSkgeworCQkJCXR1bF9zeW5jX2RvbmUocEN1ckhjYik7CisJCQkJcmV0dXJuICh0dWxfbXNnaW5fYWNjZXB0KHBDdXJIY2IpKTsKKwkJCX0KKwkJfQorCisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TU2lnbmFsLCAoKFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NTaWduYWwpICYgKFRTQ19TRVRfQUNLIHwgNykpIHwgVFNDX1NFVF9BVE4pKTsKKwkJaWYgKCh0dWxfbXNnaW5fYWNjZXB0KHBDdXJIY2IpKSAhPSBNU0dfT1VUKQorCQkJcmV0dXJuIChwQ3VySGNiLT5IQ1NfUGhhc2UpOworCQkvKiBzeW5jIG1zZyBvdXQgKi8KKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDdHJsMCwgVFNDX0ZMVVNIX0ZJRk8pOworCisJCXR1bF9zeW5jX2RvbmUocEN1ckhjYik7CisKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBNU0dfRVhURU5EKTsKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCAzKTsKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCAxKTsKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBwQ3VySGNiLT5IQ1NfTXNnWzJdKTsKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBwQ3VySGNiLT5IQ1NfTXNnWzNdKTsKKworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX1hGX0ZJRk9fT1VUKTsKKwkJcmV0dXJuICh3YWl0X3R1bGlwKHBDdXJIY2IpKTsKKwl9CisJaWYgKChwQ3VySGNiLT5IQ1NfTXNnWzBdICE9IDIpIHx8IChwQ3VySGNiLT5IQ1NfTXNnWzFdICE9IDMpKQorCQlyZXR1cm4gKHR1bF9tc2dvdXRfcmVqZWN0KHBDdXJIY2IpKTsKKwkvKiBpZiBpdCdzIFdJREUgREFUQSBYRkVSIFJFUSAgICovCisJaWYgKHBDdXJIY2ItPkhDU19BY3RUY3MtPlRDU19GbGFncyAmIFRDRl9OT19XRFRSKSB7CisJCXBDdXJIY2ItPkhDU19Nc2dbMl0gPSAwOworCX0gZWxzZSB7CisJCWlmIChwQ3VySGNiLT5IQ1NfTXNnWzJdID4gMikJLyogPiAzMiBiaXRzICAgICAgICAgICAgKi8KKwkJCXJldHVybiAodHVsX21zZ291dF9yZWplY3QocEN1ckhjYikpOworCQlpZiAocEN1ckhjYi0+SENTX01zZ1syXSA9PSAyKSB7CQkvKiA9PSAzMiAgICAgICAgICAgICAgICAqLworCQkJcEN1ckhjYi0+SENTX01zZ1syXSA9IDE7CisJCX0gZWxzZSB7CisJCQlpZiAoKHBDdXJIY2ItPkhDU19BY3RUY3MtPlRDU19GbGFncyAmIFRDRl9OT19XRFRSKSA9PSAwKSB7CisJCQkJd2R0cl9kb25lKHBDdXJIY2IpOworCQkJCWlmICgocEN1ckhjYi0+SENTX0FjdFRjcy0+VENTX0ZsYWdzICYgKFRDRl9TWU5DX0RPTkUgfCBUQ0ZfTk9fU1lOQ19ORUdPKSkgPT0gMCkKKwkJCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NTaWduYWwsICgoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU1NpZ25hbCkgJiAoVFNDX1NFVF9BQ0sgfCA3KSkgfCBUU0NfU0VUX0FUTikpOworCQkJCXJldHVybiAodHVsX21zZ2luX2FjY2VwdChwQ3VySGNiKSk7CisJCQl9CisJCX0KKwl9CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NTaWduYWwsICgoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU1NpZ25hbCkgJiAoVFNDX1NFVF9BQ0sgfCA3KSkgfCBUU0NfU0VUX0FUTikpOworCisJaWYgKHR1bF9tc2dpbl9hY2NlcHQocEN1ckhjYikgIT0gTVNHX09VVCkKKwkJcmV0dXJuIChwQ3VySGNiLT5IQ1NfUGhhc2UpOworCS8qIFdEVFIgbXNnIG91dCAgICAgICAgICAgICAgICAgKi8KKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIE1TR19FWFRFTkQpOworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgMik7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCAzKTsKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIHBDdXJIY2ItPkhDU19Nc2dbMl0pOworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfWEZfRklGT19PVVQpOworCXJldHVybiAod2FpdF90dWxpcChwQ3VySGNiKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdHVsX21zZ2luX3N5bmMoSENTICogcEN1ckhjYikKK3sKKwljaGFyIGRlZmF1bHRfcGVyaW9kOworCisJZGVmYXVsdF9wZXJpb2QgPSB0dWxfcmF0ZV90YmxbcEN1ckhjYi0+SENTX0FjdFRjcy0+VENTX0ZsYWdzICYgVENGX1NDU0lfUkFURV07CisJaWYgKHBDdXJIY2ItPkhDU19Nc2dbM10gPiBNQVhfT0ZGU0VUKSB7CisJCXBDdXJIY2ItPkhDU19Nc2dbM10gPSBNQVhfT0ZGU0VUOworCQlpZiAocEN1ckhjYi0+SENTX01zZ1syXSA8IGRlZmF1bHRfcGVyaW9kKSB7CisJCQlwQ3VySGNiLT5IQ1NfTXNnWzJdID0gZGVmYXVsdF9wZXJpb2Q7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAocEN1ckhjYi0+SENTX01zZ1syXSA+PSA1OSkgewkvKiBDaGFuZ2UgdG8gYXN5bmMgICAgICAgICAgICAgICovCisJCQlwQ3VySGNiLT5IQ1NfTXNnWzNdID0gMDsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisJLyogb2Zmc2V0IHJlcXVlc3RzIGFzeW5jaHJvbm91cyB0cmFuc2ZlcnMgPyAqLworCWlmIChwQ3VySGNiLT5IQ1NfTXNnWzNdID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChwQ3VySGNiLT5IQ1NfTXNnWzJdIDwgZGVmYXVsdF9wZXJpb2QpIHsKKwkJcEN1ckhjYi0+SENTX01zZ1syXSA9IGRlZmF1bHRfcGVyaW9kOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKHBDdXJIY2ItPkhDU19Nc2dbMl0gPj0gNTkpIHsKKwkJcEN1ckhjYi0+SENTX01zZ1szXSA9IDA7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdkdHJfZG9uZShIQ1MgKiBwQ3VySGNiKQoreworCXBDdXJIY2ItPkhDU19BY3RUY3MtPlRDU19GbGFncyAmPSB+VENGX1NZTkNfRE9ORTsKKwlwQ3VySGNiLT5IQ1NfQWN0VGNzLT5UQ1NfRmxhZ3MgfD0gVENGX1dEVFJfRE9ORTsKKworCXBDdXJIY2ItPkhDU19BY3RUY3MtPlRDU19KU19QZXJpb2QgPSAwOworCWlmIChwQ3VySGNiLT5IQ1NfTXNnWzJdKSB7CS8qIGlmIDE2IGJpdCAqLworCQlwQ3VySGNiLT5IQ1NfQWN0VGNzLT5UQ1NfSlNfUGVyaW9kIHw9IFRTQ19XSURFX1NDU0k7CisJfQorCXBDdXJIY2ItPkhDU19BY3RUY3MtPlRDU19TQ29uZmlnMCAmPSB+VFNDX0FMVF9QRVJJT0Q7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDb25maWcsIHBDdXJIY2ItPkhDU19BY3RUY3MtPlRDU19TQ29uZmlnMCk7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NQZXJpb2QsIHBDdXJIY2ItPkhDU19BY3RUY3MtPlRDU19KU19QZXJpb2QpOworCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdHVsX3N5bmNfZG9uZShIQ1MgKiBwQ3VySGNiKQoreworCWludCBpOworCisJcEN1ckhjYi0+SENTX0FjdFRjcy0+VENTX0ZsYWdzIHw9IFRDRl9TWU5DX0RPTkU7CisKKwlpZiAocEN1ckhjYi0+SENTX01zZ1szXSkgeworCQlwQ3VySGNiLT5IQ1NfQWN0VGNzLT5UQ1NfSlNfUGVyaW9kIHw9IHBDdXJIY2ItPkhDU19Nc2dbM107CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCWlmICh0dWxfcmF0ZV90YmxbaV0gPj0gcEN1ckhjYi0+SENTX01zZ1syXSkJLyogcGljayB0aGUgYmlnIG9uZSAqLworCQkJCWJyZWFrOworCQl9CisJCXBDdXJIY2ItPkhDU19BY3RUY3MtPlRDU19KU19QZXJpb2QgfD0gKGkgPDwgNCk7CisJCXBDdXJIY2ItPkhDU19BY3RUY3MtPlRDU19TQ29uZmlnMCB8PSBUU0NfQUxUX1BFUklPRDsKKwl9CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDb25maWcsIHBDdXJIY2ItPkhDU19BY3RUY3MtPlRDU19TQ29uZmlnMCk7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NQZXJpb2QsIHBDdXJIY2ItPkhDU19BY3RUY3MtPlRDU19KU19QZXJpb2QpOworCisJcmV0dXJuICgtMSk7Cit9CisKKworaW50IHR1bF9wb3N0X3Njc2lfcnN0KEhDUyAqIHBDdXJIY2IpCit7CisJU0NCICpwQ3VyU2NiOworCVRDUyAqcEN1clRjYjsKKwlpbnQgaTsKKworCXBDdXJIY2ItPkhDU19BY3RTY2IgPSBOVUxMOworCXBDdXJIY2ItPkhDU19BY3RUY3MgPSBOVUxMOworCXBDdXJIY2ItPkhDU19GbGFncyA9IDA7CisKKwl3aGlsZSAoKHBDdXJTY2IgPSB0dWxfcG9wX2J1c3lfc2NiKHBDdXJIY2IpKSAhPSBOVUxMKSB7CisJCXBDdXJTY2ItPlNDQl9IYVN0YXQgPSBIT1NUX0JBRF9QSEFTOworCQl0dWxfYXBwZW5kX2RvbmVfc2NiKHBDdXJIY2IsIHBDdXJTY2IpOworCX0KKwkvKiBjbGVhciBzeW5jIGRvbmUgZmxhZyAgICAgICAgICovCisJcEN1clRjYiA9ICZwQ3VySGNiLT5IQ1NfVGNzWzBdOworCWZvciAoaSA9IDA7IGkgPCBwQ3VySGNiLT5IQ1NfTWF4VGFyOyBwQ3VyVGNiKyssIGkrKykgeworCQlwQ3VyVGNiLT5UQ1NfRmxhZ3MgJj0gfihUQ0ZfU1lOQ19ET05FIHwgVENGX1dEVFJfRE9ORSk7CisJCS8qIEluaXRpYWxpemUgdGhlIHN5bmMuIHhmZXIgcmVnaXN0ZXIgdmFsdWVzIHRvIGFuIGFzeW4geGZlciAqLworCQlwQ3VyVGNiLT5UQ1NfSlNfUGVyaW9kID0gMDsKKwkJcEN1clRjYi0+VENTX1NDb25maWcwID0gcEN1ckhjYi0+SENTX1NDb25mMTsKKwkJcEN1ckhjYi0+SENTX0FjdFRhZ3NbMF0gPSAwOwkvKiAwNy8yMi85OCAqLworCQlwQ3VySGNiLT5IQ1NfVGNzW2ldLlRDU19GbGFncyAmPSB+VENGX0JVU1k7CS8qIDA3LzIyLzk4ICovCisJfQkJCS8qIGZvciAqLworCisJcmV0dXJuICgtMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHR1bF9zZWxlY3RfYXRuX3N0b3AoSENTICogcEN1ckhjYiwgU0NCICogcEN1clNjYikKK3sKKwlwQ3VyU2NiLT5TQ0JfU3RhdHVzIHw9IFNDQl9TRUxFQ1Q7CisJcEN1clNjYi0+U0NCX054dFN0YXQgPSAweDE7CisJcEN1ckhjYi0+SENTX0FjdFNjYiA9IHBDdXJTY2I7CisJcEN1ckhjYi0+SENTX0FjdFRjcyA9ICZwQ3VySGNiLT5IQ1NfVGNzW3BDdXJTY2ItPlNDQl9UYXJnZXRdOworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfU0VMQVROU1RPUCk7CisJcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHR1bF9zZWxlY3RfYXRuKEhDUyAqIHBDdXJIY2IsIFNDQiAqIHBDdXJTY2IpCit7CisJaW50IGk7CisKKwlwQ3VyU2NiLT5TQ0JfU3RhdHVzIHw9IFNDQl9TRUxFQ1Q7CisJcEN1clNjYi0+U0NCX054dFN0YXQgPSAweDI7CisKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIHBDdXJTY2ItPlNDQl9JZGVudCk7CisJZm9yIChpID0gMDsgaSA8IChpbnQpIHBDdXJTY2ItPlNDQl9DREJMZW47IGkrKykKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBwQ3VyU2NiLT5TQ0JfQ0RCW2ldKTsKKwlwQ3VySGNiLT5IQ1NfQWN0VGNzID0gJnBDdXJIY2ItPkhDU19UY3NbcEN1clNjYi0+U0NCX1RhcmdldF07CisJcEN1ckhjYi0+SENTX0FjdFNjYiA9IHBDdXJTY2I7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19TRUxfQVROKTsKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHR1bF9zZWxlY3RfYXRuMyhIQ1MgKiBwQ3VySGNiLCBTQ0IgKiBwQ3VyU2NiKQoreworCWludCBpOworCisJcEN1clNjYi0+U0NCX1N0YXR1cyB8PSBTQ0JfU0VMRUNUOworCXBDdXJTY2ItPlNDQl9OeHRTdGF0ID0gMHgyOworCisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBwQ3VyU2NiLT5TQ0JfSWRlbnQpOworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgcEN1clNjYi0+U0NCX1RhZ01zZyk7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBwQ3VyU2NiLT5TQ0JfVGFnSWQpOworCWZvciAoaSA9IDA7IGkgPCAoaW50KSBwQ3VyU2NiLT5TQ0JfQ0RCTGVuOyBpKyspCisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgcEN1clNjYi0+U0NCX0NEQltpXSk7CisJcEN1ckhjYi0+SENTX0FjdFRjcyA9ICZwQ3VySGNiLT5IQ1NfVGNzW3BDdXJTY2ItPlNDQl9UYXJnZXRdOworCXBDdXJIY2ItPkhDU19BY3RTY2IgPSBwQ3VyU2NiOworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfU0VMX0FUTjMpOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNDU0kgQnVzIERldmljZSBSZXNldCAqLworaW50IHR1bF9idXNfZGV2aWNlX3Jlc2V0KEhDUyAqIHBDdXJIY2IpCit7CisJU0NCICpwQ3VyU2NiID0gcEN1ckhjYi0+SENTX0FjdFNjYjsKKwlUQ1MgKnBDdXJUY2IgPSBwQ3VySGNiLT5IQ1NfQWN0VGNzOworCVNDQiAqcFRtcFNjYiwgKnBQcmV2U2NiOworCUJZVEUgdGFyOworCisJaWYgKHBDdXJIY2ItPkhDU19QaGFzZSAhPSBNU0dfT1VUKSB7CisJCXJldHVybiAoaW50X3R1bF9iYWRfc2VxKHBDdXJIY2IpKTsJLyogVW5leHBlY3RlZCBwaGFzZSAgICAgICAgICAgICAqLworCX0KKwl0dWxfdW5saW5rX3BlbmRfc2NiKHBDdXJIY2IsIHBDdXJTY2IpOworCXR1bF9yZWxlYXNlX3NjYihwQ3VySGNiLCBwQ3VyU2NiKTsKKworCisJdGFyID0gcEN1clNjYi0+U0NCX1RhcmdldDsJLyogdGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAqLworCXBDdXJUY2ItPlRDU19GbGFncyAmPSB+KFRDRl9TWU5DX0RPTkUgfCBUQ0ZfV0RUUl9ET05FIHwgVENGX0JVU1kpOworCS8qIGNsciBzeW5jLiBuZWdvICYgV0RUUiBmbGFncyAgMDcvMjIvOTggKi8KKworCS8qIGFib3J0IGFsbCBTQ0Igd2l0aCBzYW1lIHRhcmdldCAqLworCXBQcmV2U2NiID0gcFRtcFNjYiA9IHBDdXJIY2ItPkhDU19GaXJzdEJ1c3k7CS8qIENoZWNrIEJ1c3kgcXVldWUgKi8KKwl3aGlsZSAocFRtcFNjYiAhPSBOVUxMKSB7CisKKwkJaWYgKHBUbXBTY2ItPlNDQl9UYXJnZXQgPT0gdGFyKSB7CisJCQkvKiB1bmxpbmsgaXQgKi8KKwkJCWlmIChwVG1wU2NiID09IHBDdXJIY2ItPkhDU19GaXJzdEJ1c3kpIHsKKwkJCQlpZiAoKHBDdXJIY2ItPkhDU19GaXJzdEJ1c3kgPSBwVG1wU2NiLT5TQ0JfTnh0U2NiKSA9PSBOVUxMKQorCQkJCQlwQ3VySGNiLT5IQ1NfTGFzdEJ1c3kgPSBOVUxMOworCQkJfSBlbHNlIHsKKwkJCQlwUHJldlNjYi0+U0NCX054dFNjYiA9IHBUbXBTY2ItPlNDQl9OeHRTY2I7CisJCQkJaWYgKHBUbXBTY2IgPT0gcEN1ckhjYi0+SENTX0xhc3RCdXN5KQorCQkJCQlwQ3VySGNiLT5IQ1NfTGFzdEJ1c3kgPSBwUHJldlNjYjsKKwkJCX0KKwkJCXBUbXBTY2ItPlNDQl9IYVN0YXQgPSBIT1NUX0FCT1JURUQ7CisJCQl0dWxfYXBwZW5kX2RvbmVfc2NiKHBDdXJIY2IsIHBUbXBTY2IpOworCQl9CisJCS8qIFByZXZpb3VzIGhhdmVuJ3QgY2hhbmdlICAgICAgKi8KKwkJZWxzZSB7CisJCQlwUHJldlNjYiA9IHBUbXBTY2I7CisJCX0KKwkJcFRtcFNjYiA9IHBUbXBTY2ItPlNDQl9OeHRTY2I7CisJfQorCisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBNU0dfREVWUlNUKTsKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX1hGX0ZJRk9fT1VUKTsKKworCXJldHVybiB0dWxfd2FpdF9kaXNjKHBDdXJIY2IpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdHVsX21zZ2luX2FjY2VwdChIQ1MgKiBwQ3VySGNiKQoreworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfTVNHX0FDQ0VQVCk7CisJcmV0dXJuICh3YWl0X3R1bGlwKHBDdXJIY2IpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3YWl0X3R1bGlwKEhDUyAqIHBDdXJIY2IpCit7CisKKwl3aGlsZSAoISgocEN1ckhjYi0+SENTX0pTU3RhdHVzMCA9IFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NTdGF0dXMwKSkKKwkJICYgVFNTX0lOVF9QRU5ESU5HKSk7CisKKwlwQ3VySGNiLT5IQ1NfSlNJbnQgPSBUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TSW50KTsKKwlwQ3VySGNiLT5IQ1NfUGhhc2UgPSBwQ3VySGNiLT5IQ1NfSlNTdGF0dXMwICYgVFNTX1BIX01BU0s7CisJcEN1ckhjYi0+SENTX0pTU3RhdHVzMSA9IFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NTdGF0dXMxKTsKKworCWlmIChwQ3VySGNiLT5IQ1NfSlNJbnQgJiBUU1NfUkVTRUxfSU5UKSB7CS8qIGlmIFNDU0kgYnVzIHJlc2V0IGRldGVjdGVkICAgKi8KKwkJcmV0dXJuIChpbnRfdHVsX3Jlc2VsKHBDdXJIY2IpKTsKKwl9CisJaWYgKHBDdXJIY2ItPkhDU19KU0ludCAmIFRTU19TRUxfVElNRU9VVCkgewkvKiBpZiBzZWxlY3RlZC9yZXNlbGVjdGVkIHRpbWVvdXQgaW50ZXJydXB0ICovCisJCXJldHVybiAoaW50X3R1bF9idXNmcmVlKHBDdXJIY2IpKTsKKwl9CisJaWYgKHBDdXJIY2ItPkhDU19KU0ludCAmIFRTU19TQ1NJUlNUX0lOVCkgewkvKiBpZiBTQ1NJIGJ1cyByZXNldCBkZXRlY3RlZCAgICovCisJCXJldHVybiAoaW50X3R1bF9zY3NpX3JzdChwQ3VySGNiKSk7CisJfQorCWlmIChwQ3VySGNiLT5IQ1NfSlNJbnQgJiBUU1NfRElTQ19JTlQpIHsJLyogQlVTIGRpc2Nvbm5lY3Rpb24gICAgICAgICAgICAqLworCQlpZiAocEN1ckhjYi0+SENTX0ZsYWdzICYgSENGX0VYUEVDVF9ET05FX0RJU0MpIHsKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ3RybDAsIFRTQ19GTFVTSF9GSUZPKTsJCS8qIEZsdXNoIFNDU0kgRklGTyAgKi8KKwkJCXR1bF91bmxpbmtfYnVzeV9zY2IocEN1ckhjYiwgcEN1ckhjYi0+SENTX0FjdFNjYik7CisJCQlwQ3VySGNiLT5IQ1NfQWN0U2NiLT5TQ0JfSGFTdGF0ID0gMDsKKwkJCXR1bF9hcHBlbmRfZG9uZV9zY2IocEN1ckhjYiwgcEN1ckhjYi0+SENTX0FjdFNjYik7CisJCQlwQ3VySGNiLT5IQ1NfQWN0U2NiID0gTlVMTDsKKwkJCXBDdXJIY2ItPkhDU19BY3RUY3MgPSBOVUxMOworCQkJcEN1ckhjYi0+SENTX0ZsYWdzICY9IH5IQ0ZfRVhQRUNUX0RPTkVfRElTQzsKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ29uZmlnLCBUU0NfSU5JVERFRkFVTFQpOworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDdHJsMSwgVFNDX0hXX1JFU0VMRUNUKTsJLyogRW5hYmxlIEhXIHJlc2VsZWN0ICAgICAgICovCisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlpZiAocEN1ckhjYi0+SENTX0ZsYWdzICYgSENGX0VYUEVDVF9ESVNDKSB7CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwwLCBUU0NfRkxVU0hfRklGTyk7CQkvKiBGbHVzaCBTQ1NJIEZJRk8gICovCisJCQlwQ3VySGNiLT5IQ1NfQWN0U2NiID0gTlVMTDsKKwkJCXBDdXJIY2ItPkhDU19BY3RUY3MgPSBOVUxMOworCQkJcEN1ckhjYi0+SENTX0ZsYWdzICY9IH5IQ0ZfRVhQRUNUX0RJU0M7CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NvbmZpZywgVFNDX0lOSVRERUZBVUxUKTsKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ3RybDEsIFRTQ19IV19SRVNFTEVDVCk7CS8qIEVuYWJsZSBIVyByZXNlbGVjdCAgICAgICAqLworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJcmV0dXJuIChpbnRfdHVsX2J1c2ZyZWUocEN1ckhjYikpOworCX0KKwlpZiAocEN1ckhjYi0+SENTX0pTSW50ICYgKFRTU19GVU5DX0NPTVAgfCBUU1NfQlVTX1NFUlYpKSB7CisJCXJldHVybiAocEN1ckhjYi0+SENTX1BoYXNlKTsKKwl9CisJcmV0dXJuIChwQ3VySGNiLT5IQ1NfUGhhc2UpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfd2FpdF9kaXNjKEhDUyAqIHBDdXJIY2IpCit7CisKKwl3aGlsZSAoISgocEN1ckhjYi0+SENTX0pTU3RhdHVzMCA9IFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NTdGF0dXMwKSkKKwkJICYgVFNTX0lOVF9QRU5ESU5HKSk7CisKKworCXBDdXJIY2ItPkhDU19KU0ludCA9IFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NJbnQpOworCisJaWYgKHBDdXJIY2ItPkhDU19KU0ludCAmIFRTU19TQ1NJUlNUX0lOVCkgewkvKiBpZiBTQ1NJIGJ1cyByZXNldCBkZXRlY3RlZCAgICovCisJCXJldHVybiAoaW50X3R1bF9zY3NpX3JzdChwQ3VySGNiKSk7CisJfQorCWlmIChwQ3VySGNiLT5IQ1NfSlNJbnQgJiBUU1NfRElTQ19JTlQpIHsJLyogQlVTIGRpc2Nvbm5lY3Rpb24gICAgICAgICAgICAqLworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwwLCBUU0NfRkxVU0hfRklGTyk7CQkvKiBGbHVzaCBTQ1NJIEZJRk8gICovCisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ29uZmlnLCBUU0NfSU5JVERFRkFVTFQpOworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwxLCBUU0NfSFdfUkVTRUxFQ1QpOwkvKiBFbmFibGUgSFcgcmVzZWxlY3QgICAgICAgKi8KKwkJcEN1ckhjYi0+SENTX0FjdFNjYiA9IE5VTEw7CisJCXJldHVybiAoLTEpOworCX0KKwlyZXR1cm4gKHR1bF9iYWRfc2VxKHBDdXJIY2IpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfd2FpdF9kb25lX2Rpc2MoSENTICogcEN1ckhjYikKK3sKKworCisJd2hpbGUgKCEoKHBDdXJIY2ItPkhDU19KU1N0YXR1czAgPSBUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TU3RhdHVzMCkpCisJCSAmIFRTU19JTlRfUEVORElORykpOworCisJcEN1ckhjYi0+SENTX0pTSW50ID0gVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU0ludCk7CisKKworCWlmIChwQ3VySGNiLT5IQ1NfSlNJbnQgJiBUU1NfU0NTSVJTVF9JTlQpIHsJLyogaWYgU0NTSSBidXMgcmVzZXQgZGV0ZWN0ZWQgICAqLworCQlyZXR1cm4gKGludF90dWxfc2NzaV9yc3QocEN1ckhjYikpOworCX0KKwlpZiAocEN1ckhjYi0+SENTX0pTSW50ICYgVFNTX0RJU0NfSU5UKSB7CS8qIEJVUyBkaXNjb25uZWN0aW9uICAgICAgICAgICAgKi8KKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDdHJsMCwgVFNDX0ZMVVNIX0ZJRk8pOwkJLyogRmx1c2ggU0NTSSBGSUZPICAqLworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NvbmZpZywgVFNDX0lOSVRERUZBVUxUKTsKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDdHJsMSwgVFNDX0hXX1JFU0VMRUNUKTsJLyogRW5hYmxlIEhXIHJlc2VsZWN0ICAgICAgICovCisJCXR1bF91bmxpbmtfYnVzeV9zY2IocEN1ckhjYiwgcEN1ckhjYi0+SENTX0FjdFNjYik7CisKKwkJdHVsX2FwcGVuZF9kb25lX3NjYihwQ3VySGNiLCBwQ3VySGNiLT5IQ1NfQWN0U2NiKTsKKwkJcEN1ckhjYi0+SENTX0FjdFNjYiA9IE5VTEw7CisJCXJldHVybiAoLTEpOworCX0KKwlyZXR1cm4gKHR1bF9iYWRfc2VxKHBDdXJIY2IpKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGk5MXVfaW50cihpbnQgaXJxbm8sIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqZGV2ID0gZGV2X2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl0dWxfaXNyKChIQ1MgKilkZXYtPmJhc2UpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgdHVsX05ld1JldHVybk51bWJlck9mQWRhcHRlcnModm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcERldiA9IE5VTEw7CS8qIFN0YXJ0IGZyb20gbm9uZSAgICAgICAgICAgICAgKi8KKwlpbnQgaUFkYXB0ZXJzID0gMDsKKwlsb25nIGRSZWdWYWx1ZTsKKwlXT1JEIHdCSU9TOworCWludCBpID0gMDsKKworCWluaXRfaTkxdUFkYXB0ZXJfdGFibGUoKTsKKworCWZvciAoaSA9IDA7IGkgPCBUVUxTWihpOTF1X3BjaV9kZXZpY2VzKTsgaSsrKQorCXsKKwkJd2hpbGUgKChwRGV2ID0gcGNpX2ZpbmRfZGV2aWNlKGk5MXVfcGNpX2RldmljZXNbaV0udmVuZG9yX2lkLCBpOTF1X3BjaV9kZXZpY2VzW2ldLmRldmljZV9pZCwgcERldikpICE9IE5VTEwpIHsKKwkJCWlmIChwY2lfZW5hYmxlX2RldmljZShwRGV2KSkKKwkJCQljb250aW51ZTsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwRGV2LCAweDQ0LCAodTMyICopICYgZFJlZ1ZhbHVlKTsKKwkJCXdCSU9TID0gKFVXT1JEKSAoZFJlZ1ZhbHVlICYgMHhGRik7CisJCQlpZiAoKChkUmVnVmFsdWUgJiAweEZGMDApID4+IDgpID09IDB4RkYpCisJCQkJZFJlZ1ZhbHVlID0gMDsKKwkJCXdCSU9TID0gKHdCSU9TIDw8IDgpICsgKChVV09SRCkgKChkUmVnVmFsdWUgJiAweEZGMDApID4+IDgpKTsKKwkJCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBEZXYsIDB4ZmZmZmZmZmYpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCQkgICAgICAgImk5MXU6IENvdWxkIG5vdCBzZXQgMzIgYml0IERNQSBtYXNrXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKEFkZGk5MXVfaW50b19BZGFwdGVyX3RhYmxlKHdCSU9TLAorCQkJCQkJCShwRGV2LT5yZXNvdXJjZVswXS5zdGFydCksCisJCQkJCQkgICAgICAgCXBEZXYtPmlycSwKKwkJCQkJCSAgICAgICAJcERldi0+YnVzLT5udW1iZXIsCisJCQkJCSAgICAgICAJCShwRGV2LT5kZXZmbiA+PiAzKQorCQkgICAgCQkpID09IDApCisJCQkJaUFkYXB0ZXJzKys7CisJCX0KKwl9CisKKwlyZXR1cm4gKGlBZGFwdGVycyk7Cit9CisKK3N0YXRpYyBpbnQgaTkxdV9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqIHRwbnQpCit7CisJSENTICpwSENCOworCXN0cnVjdCBTY3NpX0hvc3QgKmhyZWc7CisJdW5zaWduZWQgbG9uZyBpOwkvKiAwMS8xNC85OCAgICAgICAgICAgICAgICAgICAgICovCisJaW50IG9rID0gMCwgaUFkYXB0ZXJzOworCVVMT05HIGRCaW9zQWRyOworCUJZVEUgKnBiQmlvc0FkcjsKKworCS8qIEdldCB0b3RhbCBudW1iZXIgb2YgYWRhcHRlcnMgaW4gdGhlIG1vdGhlcmJvYXJkICovCisJaUFkYXB0ZXJzID0gdHVsX05ld1JldHVybk51bWJlck9mQWRhcHRlcnMoKTsKKwlpZiAoaUFkYXB0ZXJzID09IDApCS8qIElmIG5vIHR1bGlwIGZvdW5kZWQsIHJldHVybiAqLworCQlyZXR1cm4gKDApOworCisJdHVsX251bV9jaCA9IChpQWRhcHRlcnMgPiB0dWxfbnVtX2NoKSA/IHR1bF9udW1fY2ggOiBpQWRhcHRlcnM7CisJLyogVXBkYXRlIGFjdHVhbGx5IGNoYW5uZWwgbnVtYmVyICovCisJaWYgKHR1bF90YWdfZW5hYmxlKSB7CS8qIDEuMDFpICAgICAgICAgICAgICAgICAgKi8KKwkJdHVsX251bV9zY2IgPSBNQVhfVEFSR0VUUyAqIGk5MXVfTUFYUVVFVUU7CisJfSBlbHNlIHsKKwkJdHVsX251bV9zY2IgPSBNQVhfVEFSR0VUUyArIDM7CS8qIDEtdGFwZSwgMS1DRF9ST00sIDEtIGV4dHJhICovCisJfQkJCS8qIFVwZGF0ZSBhY3R1YWxseSBTQ0JzIHBlciBhZGFwdGVyICovCisKKwkvKiBHZXQgdG90YWwgbWVtb3J5IG5lZWRlZCBmb3IgSENTICovCisJaSA9IHR1bF9udW1fY2ggKiBzaXplb2YoSENTKTsKKwltZW1zZXQoKHVuc2lnbmVkIGNoYXIgKikgJnR1bF9oY3NbMF0sIDAsIGkpOwkvKiBJbml0aWFsaXplIHR1bF9oY3MgMCAqLworCS8qIEdldCB0b3RhbCBtZW1vcnkgbmVlZGVkIGZvciBTQ0IgKi8KKworCWZvciAoOyB0dWxfbnVtX3NjYiA+PSBNQVhfVEFSR0VUUyArIDM7IHR1bF9udW1fc2NiLS0pIHsKKwkJaSA9IHR1bF9udW1fY2ggKiB0dWxfbnVtX3NjYiAqIHNpemVvZihTQ0IpOworCQlpZiAoKHR1bF9zY2IgPSAoU0NCICopIGttYWxsb2MoaSwgR0ZQX0FUT01JQyB8IEdGUF9ETUEpKSAhPSBOVUxMKQorCQkJYnJlYWs7CisJfQorCWlmICh0dWxfc2NiID09IE5VTEwpIHsKKwkJcHJpbnRrKCJpOTF1OiBTQ0IgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3JcbiIpOworCQlyZXR1cm4gKDApOworCX0KKwltZW1zZXQoKHVuc2lnbmVkIGNoYXIgKikgdHVsX3NjYiwgMCwgaSk7CisKKwlmb3IgKGkgPSAwLCBwSENCID0gJnR1bF9oY3NbMF07CQkvKiBHZXQgcG9pbnRlciBmb3IgY29udHJvbCBibG9jayAqLworCSAgICAgaSA8IHR1bF9udW1fY2g7CisJICAgICBpKyssIHBIQ0IrKykgeworCQlnZXRfdHVsaXBQQ0lDb25maWcocEhDQiwgaSk7CisKKwkJZEJpb3NBZHIgPSBwSENCLT5IQ1NfQklPUzsKKwkJZEJpb3NBZHIgPSAoZEJpb3NBZHIgPDwgNCk7CisKKwkJcGJCaW9zQWRyID0gcGh5c190b192aXJ0KGRCaW9zQWRyKTsKKworCQlpbml0X3R1bGlwKHBIQ0IsIHR1bF9zY2IgKyAoaSAqIHR1bF9udW1fc2NiKSwgdHVsX251bV9zY2IsIHBiQmlvc0FkciwgMTApOworCQlyZXF1ZXN0X3JlZ2lvbihwSENCLT5IQ1NfQmFzZSwgMjU2LCAiaTkxdSIpOyAvKiBSZWdpc3RlciAqLyAKKworCQlwSENCLT5IQ1NfSW5kZXggPSBpOwkvKiA3LzI5Lzk4ICovCisJCWhyZWcgPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIHNpemVvZihIQ1MpKTsKKwkJaWYoaHJlZyA9PSBOVUxMKSB7CisJCQlyZWxlYXNlX3JlZ2lvbihwSENCLT5IQ1NfQmFzZSwgMjU2KTsKKwkJCXJldHVybiAwOworCQl9CisJCWhyZWctPmlvX3BvcnQgPSBwSENCLT5IQ1NfQmFzZTsKKwkJaHJlZy0+bl9pb19wb3J0ID0gMHhmZjsKKwkJaHJlZy0+Y2FuX3F1ZXVlID0gdHVsX251bV9zY2I7CS8qIDAzLzA1Lzk4ICAgICAgICAgICAgICAgICAgICAgICovCisJCWhyZWctPnVuaXF1ZV9pZCA9IHBIQ0ItPkhDU19CYXNlOworCQlocmVnLT5tYXhfaWQgPSBwSENCLT5IQ1NfTWF4VGFyOworCQlocmVnLT5tYXhfbHVuID0gMzI7CS8qIDEwLzIxLzk3ICAgICAgICAgICAgICAgICAgICAgKi8KKwkJaHJlZy0+aXJxID0gcEhDQi0+SENTX0ludHI7CisJCWhyZWctPnRoaXNfaWQgPSBwSENCLT5IQ1NfU0NTSV9JRDsJLyogQXNzaWduIEhDUyBpbmRleCAgICAgICAgICAgKi8KKwkJaHJlZy0+YmFzZSA9ICh1bnNpZ25lZCBsb25nKXBIQ0I7CisJCWhyZWctPnNnX3RhYmxlc2l6ZSA9IFRPVEFMX1NHX0VOVFJZOwkvKiBNYXhpbXVuIHN1cHBvcnQgaXMgMzIgKi8KKworCQkvKiBJbml0aWFsIHR1bGlwIGNoaXAgICAgICAgICAgICovCisJCW9rID0gcmVxdWVzdF9pcnEocEhDQi0+SENTX0ludHIsIGk5MXVfaW50ciwgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsICJpOTF1IiwgaHJlZyk7CisJCWlmIChvayA8IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImk5MXU6IHVuYWJsZSB0byByZXF1ZXN0IElSUSAlZFxuXG4iLCBwSENCLT5IQ1NfSW50cik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXRwbnQtPnRoaXNfaWQgPSAtMTsKKwl0cG50LT5jYW5fcXVldWUgPSAxOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGk5MXVCdWlsZFNDQihIQ1MgKiBwSENCLCBTQ0IgKiBwU0NCLCBzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpCit7CQkJCS8qIENyZWF0ZSBjb3JyZXNwb25kaW5nIFNDQiAgICAgKi8KKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnBTcmJTRzsKKwlTRyAqcFNHOwkJLyogUG9pbnRlciB0byBTRyBsaXN0ICAgICAgICAgICAqLworCWludCBpOworCWxvbmcgVG90YWxMZW47CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCXBTQ0ItPlNDQl9Qb3N0ID0gaTkxdVNDQlBvc3Q7CS8qIGk5MXUncyBjYWxsYmFjayByb3V0aW5lICAgICAgKi8KKwlwU0NCLT5TQ0JfU3JiID0gU0NwbnQ7CisJcFNDQi0+U0NCX09wY29kZSA9IEV4ZWNTQ1NJOworCXBTQ0ItPlNDQl9GbGFncyA9IFNDRl9QT1NUOwkvKiBBZnRlciBTQ1NJIGRvbmUsIGNhbGwgcG9zdCByb3V0aW5lICovCisJcFNDQi0+U0NCX1RhcmdldCA9IFNDcG50LT5kZXZpY2UtPmlkOworCXBTQ0ItPlNDQl9MdW4gPSBTQ3BudC0+ZGV2aWNlLT5sdW47CisJcFNDQi0+U0NCX0lkZW50ID0gU0NwbnQtPmRldmljZS0+bHVuIHwgRElTQ19BTExPVzsKKworCXBTQ0ItPlNDQl9GbGFncyB8PSBTQ0ZfU0VOU0U7CS8qIFR1cm4gb24gYXV0byByZXF1ZXN0IHNlbnNlICAgKi8KKwlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKCZwSENCLT5wY2lfZGV2LT5kZXYsIFNDcG50LT5zZW5zZV9idWZmZXIsCisJCQkJICBTRU5TRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCXBTQ0ItPlNDQl9TZW5zZVB0ciA9IGNwdV90b19sZTMyKCh1MzIpZG1hX2FkZHIpOworCXBTQ0ItPlNDQl9TZW5zZUxlbiA9IGNwdV90b19sZTMyKFNFTlNFX1NJWkUpOworCVNDcG50LT5TQ3AucHRyID0gKGNoYXIgKikodW5zaWduZWQgbG9uZylkbWFfYWRkcjsKKworCXBTQ0ItPlNDQl9DREJMZW4gPSBTQ3BudC0+Y21kX2xlbjsKKwlwU0NCLT5TQ0JfSGFTdGF0ID0gMDsKKwlwU0NCLT5TQ0JfVGFTdGF0ID0gMDsKKwltZW1jcHkoJnBTQ0ItPlNDQl9DREJbMF0sICZTQ3BudC0+Y21uZCwgU0NwbnQtPmNtZF9sZW4pOworCisJaWYgKFNDcG50LT5kZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQpIHsJLyogVGFnIFN1cHBvcnQgICAgICAgICAgICAgICAgICAqLworCQlwU0NCLT5TQ0JfVGFnTXNnID0gU0lNUExFX1FVRVVFX1RBRzsJLyogRG8gc2ltcGxlIHRhZyBvbmx5ICAgKi8KKwl9IGVsc2UgeworCQlwU0NCLT5TQ0JfVGFnTXNnID0gMDsJLyogTm8gdGFnIHN1cHBvcnQgICAgICAgICAgICAgICAqLworCX0KKwkvKiB0b2RvIGhhbmRsZSBtYXBfc2cgZXJyb3IgKi8KKwlpZiAoU0NwbnQtPnVzZV9zZykgeworCQlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKCZwSENCLT5wY2lfZGV2LT5kZXYsICZwU0NCLT5TQ0JfU0dMaXN0WzBdLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgU0dfU3RydWMpICogVE9UQUxfU0dfRU5UUlksCisJCQkJCSAgRE1BX0JJRElSRUNUSU9OQUwpOworCQlwU0NCLT5TQ0JfQnVmUHRyID0gY3B1X3RvX2xlMzIoKHUzMilkbWFfYWRkcik7CisJCVNDcG50LT5TQ3AuZG1hX2hhbmRsZSA9IGRtYV9hZGRyOworCisJCXBTcmJTRyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCQlwU0NCLT5TQ0JfU0dMZW4gPSBkbWFfbWFwX3NnKCZwSENCLT5wY2lfZGV2LT5kZXYsIHBTcmJTRywKKwkJCQkJICAgICBTQ3BudC0+dXNlX3NnLCBTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCisJCXBTQ0ItPlNDQl9GbGFncyB8PSBTQ0ZfU0c7CS8qIFR1cm4gb24gU0cgbGlzdCBmbGFnICAgICAgICovCisJCWZvciAoaSA9IDAsIFRvdGFsTGVuID0gMCwgcFNHID0gJnBTQ0ItPlNDQl9TR0xpc3RbMF07CS8qIDEuMDFnICovCisJCSAgICAgaSA8IHBTQ0ItPlNDQl9TR0xlbjsgaSsrLCBwU0crKywgcFNyYlNHKyspIHsKKwkJCXBTRy0+U0dfUHRyID0gY3B1X3RvX2xlMzIoKHUzMilzZ19kbWFfYWRkcmVzcyhwU3JiU0cpKTsKKwkJCVRvdGFsTGVuICs9IHBTRy0+U0dfTGVuID0gY3B1X3RvX2xlMzIoKHUzMilzZ19kbWFfbGVuKHBTcmJTRykpOworCQl9CisKKwkJcFNDQi0+U0NCX0J1ZkxlbiA9IChTQ3BudC0+cmVxdWVzdF9idWZmbGVuID4gVG90YWxMZW4pID8KKwkJICAgIFRvdGFsTGVuIDogU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKwl9IGVsc2UgaWYgKFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4pIHsJCS8qIE5vbiBTRyAqLworCQlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKCZwSENCLT5wY2lfZGV2LT5kZXYsIFNDcG50LT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQkJICBTQ3BudC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCQkgIFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbik7CisJCVNDcG50LT5TQ3AuZG1hX2hhbmRsZSA9IGRtYV9hZGRyOworCQlwU0NCLT5TQ0JfQnVmUHRyID0gY3B1X3RvX2xlMzIoKHUzMilkbWFfYWRkcik7CisJCXBTQ0ItPlNDQl9CdWZMZW4gPSBjcHVfdG9fbGUzMigodTMyKVNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4pOworCQlwU0NCLT5TQ0JfU0dMZW4gPSAwOworCX0gZWxzZSB7CisJCXBTQ0ItPlNDQl9CdWZMZW4gPSAwOworCQlwU0NCLT5TQ0JfU0dMZW4gPSAwOworCX0KK30KKworc3RhdGljIGludCBpOTF1X3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCXZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCUhDUyAqcEhDQiA9IChIQ1MgKikgY21kLT5kZXZpY2UtPmhvc3QtPmJhc2U7CisJcmVnaXN0ZXIgU0NCICpwU0NCOworCisJY21kLT5zY3NpX2RvbmUgPSBkb25lOworCisJcFNDQiA9IHR1bF9hbGxvY19zY2IocEhDQik7CisJaWYgKCFwU0NCKQorCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKworCWk5MXVCdWlsZFNDQihwSENCLCBwU0NCLCBjbWQpOworCXR1bF9leGVjX3NjYihwSENCLCBwU0NCKTsKKwlyZXR1cm4gMDsKK30KKworI2lmIDAgLyogbm8gbmV3IEVIIHlldCAqLworLyoKKyAqICBBYm9ydCBhIHF1ZXVlZCBjb21tYW5kCisgKiAgKGNvbW1hbmRzIHRoYXQgYXJlIG9uIHRoZSBidXMgY2FuJ3QgYmUgYWJvcnRlZCBlYXNpbHkpCisgKi8KK3N0YXRpYyBpbnQgaTkxdV9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpCit7CisJSENTICpwSENCOworCisJcEhDQiA9IChIQ1MgKikgU0NwbnQtPmRldmljZS0+aG9zdC0+YmFzZTsKKwlyZXR1cm4gdHVsX2Fib3J0X3NyYihwSENCLCBTQ3BudCk7Cit9CisKKy8qCisgKiAgUmVzZXQgcmVnaXN0ZXJzLCByZXNldCBhIGhhbmdpbmcgYnVzIGFuZAorICogIGtpbGwgYWN0aXZlIGFuZCBkaXNjb25uZWN0ZWQgY29tbWFuZHMgZm9yIHRhcmdldCB3L28gc29mdCByZXNldAorICovCitzdGF0aWMgaW50IGk5MXVfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50LCB1bnNpZ25lZCBpbnQgcmVzZXRfZmxhZ3MpCit7CQkJCS8qIEkgbmVlZCBIb3N0IENvbnRyb2wgQmxvY2sgSW5mb3JtYXRpb24gKi8KKwlIQ1MgKnBIQ0I7CisKKwlwSENCID0gKEhDUyAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5iYXNlOworCisJaWYgKHJlc2V0X2ZsYWdzICYgKFNDU0lfUkVTRVRfU1VHR0VTVF9CVVNfUkVTRVQgfCBTQ1NJX1JFU0VUX1NVR0dFU1RfSE9TVF9SRVNFVCkpCisJCXJldHVybiB0dWxfcmVzZXRfc2NzaV9idXMocEhDQik7CisJZWxzZQorCQlyZXR1cm4gdHVsX2RldmljZV9yZXNldChwSENCLCBTQ3BudCwgU0NwbnQtPmRldmljZS0+aWQsIHJlc2V0X2ZsYWdzKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGk5MXVfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCkKK3sKKwlIQ1MgKnBIQ0I7CisKKwlwSENCID0gKEhDUyAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5iYXNlOworCXR1bF9yZXNldF9zY3NpKHBIQ0IsIDApOworCXJldHVybiBTVUNDRVNTOworfQorCisvKgorICogUmV0dXJuIHRoZSAibG9naWNhbCBnZW9tZXRyeSIKKyAqLworc3RhdGljIGludCBpOTF1X2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwKKwkJc2VjdG9yX3QgY2FwYWNpdHksIGludCAqaW5mb19hcnJheSkKK3sKKwlIQ1MgKnBIY2I7CQkvKiBQb2ludCB0byBIb3N0IGFkYXB0ZXIgY29udHJvbCBibG9jayAqLworCVRDUyAqcFRjYjsKKworCXBIY2IgPSAoSENTICopIHNkZXYtPmhvc3QtPmJhc2U7CisJcFRjYiA9ICZwSGNiLT5IQ1NfVGNzW3NkZXYtPmlkXTsKKworCWlmIChwVGNiLT5UQ1NfRHJ2SGVhZCkgeworCQlpbmZvX2FycmF5WzBdID0gcFRjYi0+VENTX0RydkhlYWQ7CisJCWluZm9fYXJyYXlbMV0gPSBwVGNiLT5UQ1NfRHJ2U2VjdG9yOworCQlpbmZvX2FycmF5WzJdID0gKHVuc2lnbmVkIGxvbmcpY2FwYWNpdHkgLyBwVGNiLT5UQ1NfRHJ2SGVhZCAvIHBUY2ItPlRDU19EcnZTZWN0b3I7CisJfSBlbHNlIHsKKwkJaWYgKHBUY2ItPlRDU19EcnZGbGFncyAmIFRDRl9EUlZfMjU1XzYzKSB7CisJCQlpbmZvX2FycmF5WzBdID0gMjU1OworCQkJaW5mb19hcnJheVsxXSA9IDYzOworCQkJaW5mb19hcnJheVsyXSA9ICh1bnNpZ25lZCBsb25nKWNhcGFjaXR5IC8gMjU1IC8gNjM7CisJCX0gZWxzZSB7CisJCQlpbmZvX2FycmF5WzBdID0gNjQ7CisJCQlpbmZvX2FycmF5WzFdID0gMzI7CisJCQlpbmZvX2FycmF5WzJdID0gKHVuc2lnbmVkIGxvbmcpY2FwYWNpdHkgPj4gMTE7CisJCX0KKwl9CisKKyNpZiBkZWZpbmVkKERFQlVHX0JJT1NQQVJBTSkKKwlpZiAoaTkxdV9kZWJ1ZyAmIGRlYnVnX2Jpb3NwYXJhbSkgeworCQlwcmludGsoImJpb3MgZ2VvbWV0cnk6IGhlYWQ9JWQsIHNlYz0lZCwgY3lsPSVkXG4iLAorCQkgICAgICAgaW5mb19hcnJheVswXSwgaW5mb19hcnJheVsxXSwgaW5mb19hcnJheVsyXSk7CisJCXByaW50aygiV0FSTklORzogY2hlY2ssIGlmIHRoZSBiaW9zIGdlb21ldHJ5IGlzIGNvcnJlY3QuXG4iKTsKKwl9CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpOTF1X3VubWFwX2NtbmQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHN0cnVjdCBzY3NpX2NtbmQgKmNtbmQpCit7CisJLyogYXV0byBzZW5zZSBidWZmZXIgKi8KKwlpZiAoY21uZC0+U0NwLnB0cikgeworCQlkbWFfdW5tYXBfc2luZ2xlKCZwY2lfZGV2LT5kZXYsCisJCQkJIChkbWFfYWRkcl90KSgodW5zaWduZWQgbG9uZyljbW5kLT5TQ3AucHRyKSwKKwkJCQkgU0VOU0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJY21uZC0+U0NwLnB0ciA9IE5VTEw7CisJfQorCisJLyogcmVxdWVzdCBidWZmZXIgKi8KKwlpZiAoY21uZC0+dXNlX3NnKSB7CisJCWRtYV91bm1hcF9zaW5nbGUoJnBjaV9kZXYtPmRldiwgY21uZC0+U0NwLmRtYV9oYW5kbGUsCisJCQkJIHNpemVvZihzdHJ1Y3QgU0dfU3RydWMpICogVE9UQUxfU0dfRU5UUlksCisJCQkJIERNQV9CSURJUkVDVElPTkFMKTsKKworCQlkbWFfdW5tYXBfc2coJnBjaV9kZXYtPmRldiwgY21uZC0+cmVxdWVzdF9idWZmZXIsCisJCQkgICAgIGNtbmQtPnVzZV9zZywKKwkJCSAgICAgY21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCX0gZWxzZSBpZiAoY21uZC0+cmVxdWVzdF9idWZmbGVuKSB7CisJCWRtYV91bm1hcF9zaW5nbGUoJnBjaV9kZXYtPmRldiwgY21uZC0+U0NwLmRtYV9oYW5kbGUsCisJCQkJIGNtbmQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkgY21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb24gbmFtZSAgOiBpOTF1U0NCUG9zdAorIERlc2NyaXB0aW9uICAgIDogVGhpcyBpcyBjYWxsYmFjayByb3V0aW5lIGJlIGNhbGxlZCB3aGVuIHR1bGlwIGZpbmlzaCBvbmUKKwkJCVNDU0kgY29tbWFuZC4KKyBJbnB1dCAgICAgICAgICA6IHBIQ0IgIC0gICAgICAgUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgY29udHJvbCBibG9jay4KKwkJICBwU0NCICAtICAgICAgIFBvaW50ZXIgdG8gU0NTSSBjb250cm9sIGJsb2NrLgorIE91dHB1dCAgICAgICAgIDogTm9uZS4KKyBSZXR1cm4gICAgICAgICA6IE5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGk5MXVTQ0JQb3N0KEJZVEUgKiBwSGNiLCBCWVRFICogcFNjYikKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpwU1JCOwkvKiBQb2ludGVyIHRvIFNDU0kgcmVxdWVzdCBibG9jayAqLworCUhDUyAqcEhDQjsKKwlTQ0IgKnBTQ0I7CisKKwlwSENCID0gKEhDUyAqKSBwSGNiOworCXBTQ0IgPSAoU0NCICopIHBTY2I7CisJaWYgKChwU1JCID0gcFNDQi0+U0NCX1NyYikgPT0gMCkgeworCQlwcmludGsoImk5MXVTQ0JQb3N0OiBTUkIgcG9pbnRlciBpcyBlbXB0eVxuIik7CisKKwkJdHVsX3JlbGVhc2Vfc2NiKHBIQ0IsIHBTQ0IpOwkvKiBSZWxlYXNlIFNDQiBmb3IgY3VycmVudCBjaGFubmVsICovCisJCXJldHVybjsKKwl9CisJc3dpdGNoIChwU0NCLT5TQ0JfSGFTdGF0KSB7CisJY2FzZSAweDA6CisJY2FzZSAweGE6CQkvKiBMaW5rZWQgY29tbWFuZCBjb21wbGV0ZSB3aXRob3V0IGVycm9yIGFuZCBsaW5rZWQgbm9ybWFsbHkgKi8KKwljYXNlIDB4YjoJCS8qIExpbmtlZCBjb21tYW5kIGNvbXBsZXRlIHdpdGhvdXQgZXJyb3IgaW50ZXJydXB0IGdlbmVyYXRlZCAqLworCQlwU0NCLT5TQ0JfSGFTdGF0ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIDB4MTE6CQkvKiBTZWxlY3Rpb24gdGltZSBvdXQtVGhlIGluaXRpYXRvciBzZWxlY3Rpb24gb3IgdGFyZ2V0CisJCQkJICAgcmVzZWxlY3Rpb24gd2FzIG5vdCBjb21wbGV0ZSB3aXRoaW4gdGhlIFNDU0kgVGltZSBvdXQgcGVyaW9kICovCisJCXBTQ0ItPlNDQl9IYVN0YXQgPSBESURfVElNRV9PVVQ7CisJCWJyZWFrOworCisJY2FzZSAweDE0OgkJLyogVGFyZ2V0IGJ1cyBwaGFzZSBzZXF1ZW5jZSBmYWlsdXJlLUFuIGludmFsaWQgYnVzIHBoYXNlIG9yIGJ1cworCQkJCSAgIHBoYXNlIHNlcXVlbmNlIHdhcyByZXF1ZXN0ZWQgYnkgdGhlIHRhcmdldC4gVGhlIGhvc3QgYWRhcHRlcgorCQkJCSAgIHdpbGwgZ2VuZXJhdGUgYSBTQ1NJIFJlc2V0IENvbmRpdGlvbiwgbm90aWZ5aW5nIHRoZSBob3N0IHdpdGgKKwkJCQkgICBhIFNDUkQgaW50ZXJydXB0ICovCisJCXBTQ0ItPlNDQl9IYVN0YXQgPSBESURfUkVTRVQ7CisJCWJyZWFrOworCisJY2FzZSAweDFhOgkJLyogU0NCIEFib3J0ZWQuIDA3LzIxLzk4ICovCisJCXBTQ0ItPlNDQl9IYVN0YXQgPSBESURfQUJPUlQ7CisJCWJyZWFrOworCisJY2FzZSAweDEyOgkJLyogRGF0YSBvdmVycnVuL3VuZGVycnVuLVRoZSB0YXJnZXQgYXR0ZW1wdGVkIHRvIHRyYW5zZmVyIG1vcmUgZGF0YQorCQkJCSAgIHRoYW4gd2FzIGFsbG9jYXRlZCBieSB0aGUgRGF0YSBMZW5ndGggZmllbGQgb3IgdGhlIHN1bSBvZiB0aGUKKwkJCQkgICBTY2F0dGVyIC8gR2F0aGVyIERhdGEgTGVuZ3RoIGZpZWxkcy4gKi8KKwljYXNlIDB4MTM6CQkvKiBVbmV4cGVjdGVkIGJ1cyBmcmVlLVRoZSB0YXJnZXQgZHJvcHBlZCB0aGUgU0NTSSBCU1kgYXQgYW4gdW5leHBlY3RlZCB0aW1lLiAqLworCWNhc2UgMHgxNjoJCS8qIEludmFsaWQgU0NCIE9wZXJhdGlvbiBDb2RlLiAqLworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJpbmk5MTAwdTogJXggJXhcbiIsIHBTQ0ItPlNDQl9IYVN0YXQsIHBTQ0ItPlNDQl9UYVN0YXQpOworCQlwU0NCLT5TQ0JfSGFTdGF0ID0gRElEX0VSUk9SOwkvKiBDb3VsZG4ndCBmaW5kIGFueSBiZXR0ZXIgKi8KKwkJYnJlYWs7CisJfQorCisJcFNSQi0+cmVzdWx0ID0gcFNDQi0+U0NCX1RhU3RhdCB8IChwU0NCLT5TQ0JfSGFTdGF0IDw8IDE2KTsKKworCWlmIChwU1JCID09IE5VTEwpIHsKKwkJcHJpbnRrKCJwU1JCIGlzIE5VTExcbiIpOworCX0KKworCWk5MXVfdW5tYXBfY21uZChwSENCLT5wY2lfZGV2LCBwU1JCKTsKKwlwU1JCLT5zY3NpX2RvbmUocFNSQik7CS8qIE5vdGlmeSBzeXN0ZW0gRE9ORSAgICAgICAgICAgKi8KKworCXR1bF9yZWxlYXNlX3NjYihwSENCLCBwU0NCKTsJLyogUmVsZWFzZSBTQ0IgZm9yIGN1cnJlbnQgY2hhbm5lbCAqLworfQorCisvKgorICogUmVsZWFzZSByZXNzb3VyY2VzCisgKi8KK3N0YXRpYyBpbnQgaTkxdV9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmhyZWcpCit7CisJZnJlZV9pcnEoaHJlZy0+aXJxLCBocmVnKTsKKwlyZWxlYXNlX3JlZ2lvbihocmVnLT5pb19wb3J0LCAyNTYpOworCXJldHVybiAwOworfQorTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQk9ICJJTkk5MTAwVSIsCisJLm5hbWUJCT0gaTkxdV9SRVZJRCwKKwkuZGV0ZWN0CQk9IGk5MXVfZGV0ZWN0LAorCS5yZWxlYXNlCT0gaTkxdV9yZWxlYXNlLAorCS5xdWV1ZWNvbW1hbmQJPSBpOTF1X3F1ZXVlY29tbWFuZCwKKy8vCS5hYm9ydAkJPSBpOTF1X2Fib3J0LAorLy8JLnJlc2V0CQk9IGk5MXVfcmVzZXQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyID0gaTkxdV9idXNfcmVzZXQsCisJLmJpb3NfcGFyYW0JPSBpOTF1X2Jpb3NwYXJhbSwKKwkuY2FuX3F1ZXVlCT0gMSwKKwkudGhpc19pZAk9IDEsCisJLnNnX3RhYmxlc2l6ZQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4gCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJPSBFTkFCTEVfQ0xVU1RFUklORywKK307CisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2luaXRpby5oIGIvZHJpdmVycy9zY3NpL2luaXRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmM2VkN2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaW5pdGlvLmgKQEAgLTAsMCArMSw3MzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW5pdGlvIDkxMDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0LTE5OTggSW5pdGlvIENvcnBvcmF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGltbWVkaWF0ZWx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogV2hlcmUgdGhpcyBTb2Z0d2FyZSBpcyBjb21iaW5lZCB3aXRoIHNvZnR3YXJlIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiAKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFuZCB0aGUgdGVybXMgb2YgdGhlIEdQTCB3b3VsZCByZXF1aXJlIHRoZSAKKyAqIGNvbWJpbmVkIHdvcmsgdG8gYWxzbyBiZSByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCwgdGhlIHRlcm1zCisgKiBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2Ugd2lsbCBhcHBseSBpbiBhZGRpdGlvbiB0byB0aG9zZSBvZiB0aGUKKyAqIEdQTCB3aXRoIHRoZSBleGNlcHRpb24gb2YgYW55IHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlIHRoYXQKKyAqIGNvbmZsaWN0IHdpdGgsIG9yIGFyZSBleHByZXNzbHkgcHJvaGliaXRlZCBieSwgdGhlIEdQTC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBVTE9ORyAgIHVuc2lnbmVkIGxvbmcKKyNkZWZpbmUgVVNIT1JUICB1bnNpZ25lZCBzaG9ydAorI2RlZmluZSBVQ0hBUiAgIHVuc2lnbmVkIGNoYXIKKyNkZWZpbmUgQllURSAgICB1bnNpZ25lZCBjaGFyCisjZGVmaW5lIFdPUkQgICAgdW5zaWduZWQgc2hvcnQKKyNkZWZpbmUgRFdPUkQgICB1bnNpZ25lZCBsb25nCisjZGVmaW5lIFVCWVRFICAgdW5zaWduZWQgY2hhcgorI2RlZmluZSBVV09SRCAgIHVuc2lnbmVkIHNob3J0CisjZGVmaW5lIFVEV09SRCAgdW5zaWduZWQgbG9uZworI2RlZmluZSBVMzIgICAgIHUzMgorCisjZGVmaW5lIFRPVEFMX1NHX0VOVFJZCQkzMgorI2RlZmluZSBNQVhfU1VQUE9SVEVEX0FEQVBURVJTICA4CisjZGVmaW5lIE1BWF9PRkZTRVQJCTE1CisjZGVmaW5lIE1BWF9UQVJHRVRTCQkxNgorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQgYmFzZTsKKwl1bnNpZ25lZCBzaG9ydCB2ZWM7Cit9IGk5MXVfY29uZmlnOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFR1bGlwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgU2V0ICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBUVUxfUFZJRCAgICAgICAgMHgwMAkvKiBWZW5kb3IgSUQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9QRElEICAgICAgICAweDAyCS8qIERldmljZSBJRCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1BDTUQgICAgICAgIDB4MDQJLyogQ29tbWFuZCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfUFNUVVMgICAgICAgMHgwNgkvKiBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9QUklEICAgICAgICAweDA4CS8qIFJldmlzaW9uIG51bWJlciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1BQSSAgICAgICAgIDB4MDkJLyogUHJvZ3JhbW1pbmcgaW50ZXJmYWNlICAgICAgICAqLworI2RlZmluZSBUVUxfUFNDICAgICAgICAgMHgwQQkvKiBTdWIgQ2xhc3MgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9QQkMgICAgICAgICAweDBCCS8qIEJhc2UgQ2xhc3MgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1BDTFMgICAgICAgIDB4MEMJLyogQ2FjaGUgbGluZSBzaXplICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfUExUUiAgICAgICAgMHgwRAkvKiBMYXRlbmN5IHRpbWVyICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9QSERUICAgICAgICAweDBFCS8qIEhlYWRlciB0eXBlICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1BCSVNUICAgICAgIDB4MEYJLyogQklTVCAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfUEJBRCAgICAgICAgMHgxMAkvKiBCYXNlIGFkZHJlc3MgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9QQkFEMSAgICAgICAweDE0CS8qIEJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1BCQUQyICAgICAgIDB4MTgJLyogQmFzZSBhZGRyZXNzICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfUEJBRDMgICAgICAgMHgxQwkvKiBCYXNlIGFkZHJlc3MgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9QQkFENCAgICAgICAweDIwCS8qIEJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1BCQUQ1ICAgICAgIDB4MjQJLyogQmFzZSBhZGRyZXNzICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfUFJTVkQgICAgICAgMHgyOAkvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9QUlNWRDEgICAgICAweDJDCS8qIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1BSQUQgICAgICAgIDB4MzAJLyogRXhwYW5zaW9uIFJPTSBiYXNlIGFkZHJlc3MgICAqLworI2RlZmluZSBUVUxfUFJTVkQyICAgICAgMHgzNAkvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9QUlNWRDMgICAgICAweDM4CS8qIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1BJTlRMICAgICAgIDB4M0MJLyogSW50ZXJydXB0IGxpbmUgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfUElOVFAgICAgICAgMHgzRAkvKiBJbnRlcnJ1cHQgcGluICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9QSUdOVCAgICAgICAweDNFCS8qIE1JTl9HTlQgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1BNR05UICAgICAgIDB4M0YJLyogTUFYX0dOVCAgICAgICAgICAgICAgICAgICAgICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEphc21pbiBSZWdpc3RlciBTZXQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFRVTF9IQUNGRzAgICAgICAweDQwCS8qIEgvQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDAgICAgICAgICAqLworI2RlZmluZSBUVUxfSEFDRkcxICAgICAgMHg0MQkvKiBIL0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX0hBQ0ZHMiAgICAgIDB4NDIJLyogSC9BIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAgICAgICAgICovCisKKyNkZWZpbmUgVFVMX1NEQ0ZHMCAgICAgIDB4NDQJLyogU0NTSSBEZXZpY2UgQ29uZmlndXJhdGlvbiAwICAgICAgICAgICovCisjZGVmaW5lIFRVTF9TRENGRzEgICAgICAweDQ1CS8qIFNDU0kgRGV2aWNlIENvbmZpZ3VyYXRpb24gMSAgICAgICAgICAqLworI2RlZmluZSBUVUxfU0RDRkcyICAgICAgMHg0NgkvKiBTQ1NJIERldmljZSBDb25maWd1cmF0aW9uIDIgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1NEQ0ZHMyAgICAgIDB4NDcJLyogU0NTSSBEZXZpY2UgQ29uZmlndXJhdGlvbiAzICAgICAgICAgICovCisKKyNkZWZpbmUgVFVMX0dJTlRTICAgICAgIDB4NTAJLyogR2xvYmFsIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgICAgICovCisjZGVmaW5lIFRVTF9HSU1TSyAgICAgICAweDUyCS8qIEdsb2JhbCBJbnRlcnJ1cHQgTUFTSyBSZWdpc3RlciAgICAgICAqLworI2RlZmluZSBUVUxfR0NUUkwgICAgICAgMHg1NAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX0dDVFJMX0VFUFJPTV9CSVQgICAgMHgwNAorI2RlZmluZSBUVUxfR0NUUkwxICAgICAgMHg1NQkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX0RNQUNGRyAgICAgIDB4NUIJLyogRE1BIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9OVlJBTSAgICAgICAweDVECS8qIE5vbi12b2xhdGlsZSBSQU0gcG9ydCAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFRVTF9TQ250MCAgICAgICAweDgwCS8qIDAwIFIvVyBUcmFuc2ZlciBDb3VudGVyIExvdyAgICAgICAgICAqLworI2RlZmluZSBUVUxfU0NudDEgICAgICAgMHg4MQkvKiAwMSBSL1cgVHJhbnNmZXIgQ291bnRlciBNaWQgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1NDbnQyICAgICAgIDB4ODIJLyogMDIgUi9XIFRyYW5zZmVyIENvdW50IEhpZ2ggICAgICAgICAgICovCisjZGVmaW5lIFRVTF9TRmlmb0NudCAgICAweDgzCS8qIDAzIFIgICBGSUZPIGNvdW50ZXIgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfU0ludEVuYWJsZSAgMHg4NAkvKiAwMyBXICAgSW50ZXJydXB0IGVuYmxlICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1NJbnQgICAgICAgIDB4ODQJLyogMDQgUiAgIEludGVycnVwdCBSZWdpc3RlciAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9TQ3RybDAgICAgICAweDg1CS8qIDA1IFcgICBDb250cm9sIDAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfU1N0YXR1czAgICAgMHg4NQkvKiAwNSBSICAgU3RhdHVzIDAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1NDdHJsMSAgICAgIDB4ODYJLyogMDYgVyAgIENvbnRyb2wgMSAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9TU3RhdHVzMSAgICAweDg2CS8qIDA2IFIgICBTdGF0dXMgMSAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfU0NvbmZpZyAgICAgMHg4NwkvKiAwNyBXICAgQ29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1NTdGF0dXMyICAgIDB4ODcJLyogMDcgUiAgIFN0YXR1cyAyICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9TUGVyaW9kICAgICAweDg4CS8qIDA4IFcgICBTeW5jLiBUcmFuc2ZlciBQZXJpb2QgJiBPZmZzZXQgKi8KKyNkZWZpbmUgVFVMX1NPZmZzZXQgICAgIDB4ODgJLyogMDggUiAgIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9TU2NzaUlkICAgICAweDg5CS8qIDA5IFcgICBTQ1NJIElEICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfU0J1c0lkICAgICAgMHg4OQkvKiAwOSBSICAgU0NTSSBCVVMgSUQgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1NUaW1lT3V0ICAgIDB4OEEJLyogMEEgVyAgIFNlbC9SZXNlbCBUaW1lIE91dCBSZWdpc3RlciAgICovCisjZGVmaW5lIFRVTF9TSWRlbnQgICAgICAweDhBCS8qIDBBIFIgICBJZGVudGlmeSBNZXNzYWdlIFJlZ2lzdGVyICAgICAqLworI2RlZmluZSBUVUxfU0F2YWlsICAgICAgMHg4QQkvKiAwQSBSICAgQXZhaWxpYWJsZSBDb3VudGVyIFJlZ2lzdGVyICAgKi8KKyNkZWZpbmUgVFVMX1NEYXRhICAgICAgIDB4OEIJLyogMEIgUi9XIFNDU0kgZGF0YSBpbi9vdXQgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9TRmlmbyAgICAgICAweDhDCS8qIDBDIFIvVyBGSUZPICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfU1NpZ25hbCAgICAgMHg5MAkvKiAxMCBSL1cgU0NTSSBzaWduYWwgaW4vb3V0ICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1NDbWQgICAgICAgIDB4OTEJLyogMTEgUi9XIENvbW1hbmQgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9TVGVzdDAgICAgICAweDkyCS8qIDEyIFIvVyBUZXN0MCAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfU1Rlc3QxICAgICAgMHg5MwkvKiAxMyBSL1cgVGVzdDEgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1NDRkcxCTB4OTQJLyogMTQgUi9XIENvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgVFVMX1hBZGRIICAgICAgIDB4QzAJLypETUEgVHJhbnNmZXIgUGh5c2ljYWwgQWRkcmVzcyAgICAgICAgICovCisjZGVmaW5lIFRVTF9YQWRkVyAgICAgICAweEM4CS8qRE1BIEN1cnJlbnQgVHJhbnNmZXIgUGh5c2ljYWwgQWRkcmVzcyAqLworI2RlZmluZSBUVUxfWENudEggICAgICAgMHhEMAkvKkRNQSBUcmFuc2ZlciBDb3VudGVyICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1hDbnRXICAgICAgIDB4RDQJLypETUEgQ3VycmVudCBUcmFuc2ZlciBDb3VudGVyICAgICAgICAgICovCisjZGVmaW5lIFRVTF9YQ21kICAgICAgICAweEQ4CS8qRE1BIENvbW1hbmQgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfSW50ICAgICAgICAgMHhEQwkvKkludGVycnVwdCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1hTdGF0dXMgICAgIDB4REQJLypETUEgc3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9NYXNrICAgICAgICAweEUwCS8qSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfWEN0cmwgICAgICAgMHhFNAkvKkRNQSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1hDdHJsMSAgICAgIDB4RTUJLypETUEgQ29udHJvbCBSZWdpc3RlciAxICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9YRmlmbyAgICAgICAweEU4CS8qRE1BIEZJRk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFRVTF9XQ3RybCAgICAgICAweEY3CS8qQnVzIG1hc3RlciB3YWl0IHN0YXRlIGNvbnRyb2wgICAgICAgICAqLworI2RlZmluZSBUVUxfREN0cmwgICAgICAgMHhGQgkvKkRNQSBkZWxheSBjb250cm9sICAgICAgICAgICAgICAgICAgICAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgYml0IGRlZmluaXRpb24gZm9yIENvbW1hbmQgcmVnaXN0ZXIgb2YgQ29uZmlndXJhdGlvbiBTcGFjZSBIZWFkZXIgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBCVVNNUyAgICAgICAgICAgMHgwNAkvKiBCVVMgTUFTVEVSIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSU9TUEEgICAgICAgICAgIDB4MDEJLyogSU8gU3BhY2UgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb21tYW5kIENvZGVzIG9mIFR1bGlwIFNDU0kgQ29tbWFuZCByZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgVFNDX0VOX1JFU0VMICAgIDB4ODAJLyogRW5hYmxlIFJlc2VsZWN0aW9uICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19DTURfQ09NUCAgICAweDg0CS8qIENvbW1hbmQgQ29tcGxldGUgU2VxdWVuY2UgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfU0VMICAgICAgICAgMHgwMQkvKiBTZWxlY3QgV2l0aG91dCBBVE4gU2VxdWVuY2UgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX1NFTF9BVE4gICAgIDB4MTEJLyogU2VsZWN0IFdpdGggQVROIFNlcXVlbmNlICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19TRUxfQVROX0RNQSAweDUxCS8qIFNlbGVjdCBXaXRoIEFUTiBTZXF1ZW5jZSB3aXRoIERNQSAgICAqLworI2RlZmluZSBUU0NfU0VMX0FUTjMgICAgMHgzMQkvKiBTZWxlY3QgV2l0aCBBVE4zIFNlcXVlbmNlICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX1NFTF9BVE5TVE9QIDB4MTIJLyogU2VsZWN0IFdpdGggQVROIGFuZCBTdG9wIFNlcXVlbmNlICAgICovCisjZGVmaW5lIFRTQ19TRUxBVE5TVE9QICAweDFFCS8qIFNlbGVjdCBXaXRoIEFUTiBhbmQgU3RvcCBTZXF1ZW5jZSAgICAqLworCisjZGVmaW5lIFRTQ19TRUxfQVROX0RJUkVDVF9JTiAgIDB4OTUJLyogU2VsZWN0IFdpdGggQVROIFNlcXVlbmNlICAgICAqLworI2RlZmluZSBUU0NfU0VMX0FUTl9ESVJFQ1RfT1VUICAweDE1CS8qIFNlbGVjdCBXaXRoIEFUTiBTZXF1ZW5jZSAgICAgKi8KKyNkZWZpbmUgVFNDX1NFTF9BVE4zX0RJUkVDVF9JTiAgMHhCNQkvKiBTZWxlY3QgV2l0aCBBVE4zIFNlcXVlbmNlICAgICovCisjZGVmaW5lIFRTQ19TRUxfQVROM19ESVJFQ1RfT1VUIDB4MzUJLyogU2VsZWN0IFdpdGggQVROMyBTZXF1ZW5jZSAgICAqLworI2RlZmluZSBUU0NfWEZfRE1BX09VVF9ESVJFQ1QgICAweDA2CS8qIERNQSBYZmVyIEluZm9tYXRpb24gb3V0ICAgICAgKi8KKyNkZWZpbmUgVFNDX1hGX0RNQV9JTl9ESVJFQ1QgICAgMHg4NgkvKiBETUEgWGZlciBJbmZvbWF0aW9uIGluICAgICAgICovCisKKyNkZWZpbmUgVFNDX1hGX0RNQV9PVVQgIDB4NDMJLyogRE1BIFhmZXIgSW5mb21hdGlvbiBvdXQgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19YRl9ETUFfSU4gICAweEMzCS8qIERNQSBYZmVyIEluZm9tYXRpb24gaW4gICAgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfWEZfRklGT19PVVQgMHgwMwkvKiBGSUZPIFhmZXIgSW5mb21hdGlvbiBvdXQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX1hGX0ZJRk9fSU4gIDB4ODMJLyogRklGTyBYZmVyIEluZm9tYXRpb24gaW4gICAgICAgICAgICAgICovCisKKyNkZWZpbmUgVFNDX01TR19BQ0NFUFQgIDB4MEYJLyogTWVzc2FnZSBBY2NlcHQgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBiaXQgZGVmaW5pdGlvbiBmb3IgVHVsaXAgU0NTSSBDb250cm9sIDAgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgVFNDX1JTVF9TRVEgICAgIDB4MjAJLyogUmVzZXQgc2VxdWVuY2UgY291bnRlciAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19GTFVTSF9GSUZPICAweDEwCS8qIEZsdXNoIEZJRk8gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfQUJUX0NNRCAgICAgMHgwNAkvKiBBYm9ydCBjb21tYW5kIChzZXF1ZW5jZSkgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX1JTVF9DSElQICAgIDB4MDIJLyogUmVzZXQgU0NTSSBDaGlwICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19SU1RfQlVTICAgICAweDAxCS8qIFJlc2V0IFNDU0kgQnVzICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogYml0IGRlZmluaXRpb24gZm9yIFR1bGlwIFNDU0kgQ29udHJvbCAxIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFRTQ19FTl9TQ0FNICAgICAweDgwCS8qIEVuYWJsZSBTQ0FNICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfVElNRVIgICAgICAgMHg0MAkvKiBTZWxlY3QgdGltZW91dCB1bml0ICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX0VOX1NDU0kyICAgIDB4MjAJLyogU0NTSS0yIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19QV0ROICAgICAgICAweDEwCS8qIFBvd2VyIGRvd24gbW9kZSAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfV0lERV9DUFUgICAgMHgwOAkvKiBXaWRlIENQVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX0hXX1JFU0VMRUNUIDB4MDQJLyogRW5hYmxlIEhXIHJlc2VsZWN0ICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19FTl9CVVNfT1VUICAweDAyCS8qIEVuYWJsZSBTQ1NJIGRhdGEgYnVzIG91dCBsYXRjaCAgICAgICAqLworI2RlZmluZSBUU0NfRU5fQlVTX0lOICAgMHgwMQkvKiBFbmFibGUgU0NTSSBkYXRhIGJ1cyBpbiBsYXRjaCAgICAgICAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIGJpdCBkZWZpbml0aW9uIGZvciBUdWxpcCBTQ1NJIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBUU0NfRU5fTEFUQ0ggICAgMHg4MAkvKiBFbmFibGUgcGhhc2UgbGF0Y2ggICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX0lOSVRJQVRPUiAgIDB4NDAJLyogSW5pdGlhdG9yIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19FTl9TQ1NJX1BBUiAweDIwCS8qIEVuYWJsZSBTQ1NJIHBhcml0eSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfRE1BXzhCSVQgICAgMHgxMAkvKiBBbHRlcm5hdGUgZG1hIDgtYml0cyBtb2RlICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX0RNQV8xNkJJVCAgIDB4MDgJLyogQWx0ZXJuYXRlIGRtYSAxNi1iaXRzIG1vZGUgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19FTl9XREFDSyAgICAweDA0CS8qIEVuYWJsZSBEQUNLIHdoaWxlIHdpZGUgU0NTSSB4ZmVyICAgICAqLworI2RlZmluZSBUU0NfQUxUX1BFUklPRCAgMHgwMgkvKiBBbHRlcm5hdGUgc3luYyBwZXJpb2QgbW9kZSAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX0RJU19TQ1NJUlNUIDB4MDEJLyogRGlzYWJsZSBTQ1NJIGJ1cyByZXNldCB1cyAgICAgICAgICAgICovCisKKyNkZWZpbmUgVFNDX0lOSVRERUZBVUxUIChUU0NfSU5JVElBVE9SIHwgVFNDX0VOX0xBVENIIHwgVFNDX0FMVF9QRVJJT0QgfCBUU0NfRElTX1NDU0lSU1QpCisKKyNkZWZpbmUgVFNDX1dJREVfU0NTSSAgIDB4ODAJLyogRW5hYmxlIFdpZGUgU0NTSSAgICAgICAgICAgICAgICAgICAgICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBiaXQgZGVmaW5pdGlvbiBmb3IgVHVsaXAgU0NTSSBzaWduYWwgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgVFNDX1JTVF9BQ0sgICAgIDB4MDAJLyogUmVsZWFzZSBBQ0sgc2lnbmFsICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19SU1RfQVROICAgICAweDAwCS8qIFJlbGVhc2UgQVROIHNpZ25hbCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfUlNUX0JTWSAgICAgMHgwMAkvKiBSZWxlYXNlIEJTWSBzaWduYWwgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBUU0NfU0VUX0FDSyAgICAgMHg0MAkvKiBBQ0sgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX1NFVF9BVE4gICAgIDB4MDgJLyogQVROIHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgVFNDX1JFUUkgICAgICAgIDB4ODAJLyogUkVRIHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19BQ0tJICAgICAgICAweDQwCS8qIEFDSyBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfQlNZSSAgICAgICAgMHgyMAkvKiBCU1kgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX1NFTEkgICAgICAgIDB4MTAJLyogU0VMIHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19BVE5JICAgICAgICAweDA4CS8qIEFUTiBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfTVNHSSAgICAgICAgMHgwNAkvKiBNU0cgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX0NESSAgICAgICAgIDB4MDIJLyogQy9EIHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19JT0kgICAgICAgICAweDAxCS8qIEkvTyBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBiaXQgZGVmaW5pdGlvbiBmb3IgVHVsaXAgU0NTSSBTdGF0dXMgMCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgVFNTX0lOVF9QRU5ESU5HIDB4ODAJLyogSW50ZXJydXB0IHBlbmRpbmcgICAgICAgICAgICAqLworI2RlZmluZSBUU1NfU0VRX0FDVElWRSAgMHg0MAkvKiBTZXF1ZW5jZXIgYWN0aXZlICAgICAgICAgICAgICovCisjZGVmaW5lIFRTU19YRkVSX0NOVCAgICAweDIwCS8qIFRyYW5zZmVyIGNvdW50ZXIgemVybyAgICAgICAgKi8KKyNkZWZpbmUgVFNTX0ZJRk9fRU1QVFkgIDB4MTAJLyogRklGTyBlbXB0eSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU1NfUEFSX0VSUk9SICAgMHgwOAkvKiBTQ1NJIHBhcml0eSBlcnJvciAgICAgICAgICAgICovCisjZGVmaW5lIFRTU19QSF9NQVNLICAgICAweDA3CS8qIFNDU0kgcGhhc2UgbWFzayAgICAgICAgICAgICAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIGJpdCBkZWZpbml0aW9uIGZvciBUdWxpcCBTQ1NJIFN0YXR1cyAxIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBUU1NfU1RBVFVTX1JDViAgMHgwOAkvKiBTdGF0dXMgcmVjZWl2ZWQgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTU19NU0dfU0VORCAgICAweDQwCS8qIE1lc3NhZ2Ugc2VudCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNTX0NNRF9QSF9DTVAgIDB4MjAJLyogY29tbWFuZCBwaGFzZSBkb25lICAgICAgICAgICAgICAqLworI2RlZmluZSBUU1NfREFUQV9QSF9DTVAgMHgxMAkvKiBEYXRhIHBoYXNlIGRvbmUgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTU19TVEFUVVNfU0VORCAweDA4CS8qIFN0YXR1cyBzZW50ICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNTX1hGRVJfQ01QICAgIDB4MDQJLyogVHJhbnNmZXIgY29tcGxldGVkICAgICAgICAgICAqLworI2RlZmluZSBUU1NfU0VMX0NNUCAgICAgMHgwMgkvKiBTZWxlY3Rpb24gY29tcGxldGVkICAgICAgICAgICovCisjZGVmaW5lIFRTU19BUkJfQ01QICAgICAweDAxCS8qIEFyYml0cmF0aW9uIGNvbXBsZXRlZCAgICAgICAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIGJpdCBkZWZpbml0aW9uIGZvciBUdWxpcCBTQ1NJIFN0YXR1cyAyIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBUU1NfQ01EX0FCVEVEICAgMHg4MAkvKiBDb21tYW5kIGFib3J0ZWQgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTU19PRkZTRVRfMCAgICAweDQwCS8qIE9mZnNldCBjb3VudGVyIHplcm8gICAgICAgICAgKi8KKyNkZWZpbmUgVFNTX0ZJRk9fRlVMTCAgIDB4MjAJLyogRklGTyBmdWxsICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU1NfVElNRU9VVF8wICAgMHgxMAkvKiBUaW1lb3V0IGNvdW50ZXIgemVybyAgICAgICAgICovCisjZGVmaW5lIFRTU19CVVNZX1JMUyAgICAweDA4CS8qIEJ1c3kgcmVsZWFzZSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNTX1BIX01JU01BVENIIDB4MDQJLyogUGhhc2UgbWlzbWF0Y2ggICAgICAgICAgICAgICAqLworI2RlZmluZSBUU1NfU0NTSV9CVVNfRU4gMHgwMgkvKiBTQ1NJIGRhdGEgYnVzIGVuYWJsZSAgICAgICAgICovCisjZGVmaW5lIFRTU19TQ1NJUlNUICAgICAweDAxCS8qIFNDU0kgYnVzIHJlc2V0IGluIHByb2dyZXNzICAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIGJpdCBkZWZpbml0aW9uIGZvciBUdWxpcCBTQ1NJIEludGVycnVwdCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBUU1NfUkVTRUxfSU5UICAgMHg4MAkvKiBSZXNlbGVjdGVkIGludGVycnVwdCAgICAgICAgICovCisjZGVmaW5lIFRTU19TRUxfVElNRU9VVCAweDQwCS8qIFNlbGVjdGVkL3Jlc2VsZWN0ZWQgdGltZW91dCAgKi8KKyNkZWZpbmUgVFNTX0JVU19TRVJWICAgIDB4MjAKKyNkZWZpbmUgVFNTX1NDU0lSU1RfSU5UIDB4MTAJLyogU0NTSSBidXMgcmVzZXQgZGV0ZWN0ZWQgICAgICAqLworI2RlZmluZSBUU1NfRElTQ19JTlQgICAgMHgwOAkvKiBEaXNjb25uZWN0ZWQgaW50ZXJydXB0ICAgICAgICovCisjZGVmaW5lIFRTU19TRUxfSU5UICAgICAweDA0CS8qIFNlbGVjdCBpbnRlcnJ1cHQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNTX1NDQU1fU0VMICAgIDB4MDIJLyogU0NBTSBzZWxlY3RlZCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU1NfRlVOQ19DT01QICAgMHgwMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogU0NTSSBQaGFzZSBDb2Rlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIERBVEFfT1VUICAgICAgICAwCisjZGVmaW5lIERBVEFfSU4gICAgICAgICAxCS8qIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ01EX09VVCAgICAgICAgIDIKKyNkZWZpbmUgU1RBVFVTX0lOICAgICAgIDMJLyogNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNU0dfT1VUICAgICAgICAgNgkvKiAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1TR19JTiAgICAgICAgICA3CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29tbWFuZCBDb2RlcyBvZiBUdWxpcCB4ZmVyIENvbW1hbmQgcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFRBWF9YX0ZPUkMgICAgICAweDAyCisjZGVmaW5lIFRBWF9YX0FCVCAgICAgICAweDA0CisjZGVmaW5lIFRBWF9YX0NMUl9GSUZPICAweDA4CisKKyNkZWZpbmUgVEFYX1hfSU4gICAgICAgIDB4MjEKKyNkZWZpbmUgVEFYX1hfT1VUICAgICAgIDB4MDEKKyNkZWZpbmUgVEFYX1NHX0lOICAgICAgIDB4QTEKKyNkZWZpbmUgVEFYX1NHX09VVCAgICAgIDB4ODEKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFR1bGlwIEludGVycnVwdCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBYQ01QICAgICAgICAgICAgMHgwMQorI2RlZmluZSBGQ01QICAgICAgICAgICAgMHgwMgorI2RlZmluZSBYQUJUICAgICAgICAgICAgMHgwNAorI2RlZmluZSBYRVJSICAgICAgICAgICAgMHgwOAorI2RlZmluZSBTQ01QICAgICAgICAgICAgMHgxMAorI2RlZmluZSBJUEVORCAgICAgICAgICAgMHg4MAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogVHVsaXAgRE1BIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFhQRU5EICAgICAgICAgICAweDAxCS8qIFRyYW5zZmVyIHBlbmRpbmcgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkVNUFRZICAgICAgICAgIDB4MDIJLyogRklGTyBlbXB0eSAgICAgICAgICAgICAgICAgICAqLworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIGJpdCBkZWZpbml0aW9uIGZvciBUVUxfR0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBFWFRTRyAgICAgICAgICAgMHg4MAorI2RlZmluZSBFWFRBRCAgICAgICAgICAgMHg2MAorI2RlZmluZSBTRUc0SyAgICAgICAgICAgMHgwOAorI2RlZmluZSBFRVBSRyAgICAgICAgICAgMHgwNAorI2RlZmluZSBNUk1VTCAgICAgICAgICAgMHgwMgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogYml0IGRlZmluaXRpb24gZm9yIFRVTF9OVlJBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNFMkNTICAgICAgICAgICAweDA4CisjZGVmaW5lIFNFMkNMSyAgICAgICAgICAweDA0CisjZGVmaW5lIFNFMkRPICAgICAgICAgICAweDAyCisjZGVmaW5lIFNFMkRJICAgICAgICAgICAweDAxCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICBTY2F0dGVyLUdhdGhlciBFbGVtZW50IFN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgU0dfU3RydWMgeworCVUzMiBTR19QdHI7CQkvKiBEYXRhIFBvaW50ZXIgKi8KKwlVMzIgU0dfTGVuOwkJLyogRGF0YSBMZW5ndGggKi8KK30gU0c7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQlTQ1NJIENvbnRyb2wgQmxvY2sKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IFNjc2lfQ3RybF9CbGsgeworCXN0cnVjdCBTY3NpX0N0cmxfQmxrICpTQ0JfTnh0U2NiOworCVVCWVRFIFNDQl9TdGF0dXM7CS8qNCAqLworCVVCWVRFIFNDQl9OeHRTdGF0OwkvKjUgKi8KKwlVQllURSBTQ0JfTW9kZTsJCS8qNiAqLworCVVCWVRFIFNDQl9Nc2dpbjsJLyo3IFNDQl9SZXMwICovCisJVVdPUkQgU0NCX1NHSWR4OwkvKjggKi8KKwlVV09SRCBTQ0JfU0dNYXg7CS8qQSAqLworI2lmZGVmIEFMUEhBCisJVTMyIFNDQl9SZXNlcnZlZFsyXTsJLypDICovCisjZWxzZQorCVUzMiBTQ0JfUmVzZXJ2ZWRbM107CS8qQyAqLworI2VuZGlmCisKKwlVMzIgU0NCX1hmZXJMZW47CS8qMTggQ3VycmVudCB4ZmVyIGxlbiAgICAgICAgICAgKi8KKwlVMzIgU0NCX1RvdFhMZW47CS8qMUMgVG90YWwgeGZlciBsZW4gICAgICAgICAgICAgKi8KKwlVMzIgU0NCX1BBZGRyOwkJLyoyMCBTQ0IgcGh5LiBBZGRyLiAqLworCisJVUJZVEUgU0NCX09wY29kZTsJLyoyNCBTQ0IgY29tbWFuZCBjb2RlICovCisJVUJZVEUgU0NCX0ZsYWdzOwkvKjI1IFNDQiBGbGFncyAqLworCVVCWVRFIFNDQl9UYXJnZXQ7CS8qMjYgVGFyZ2V0IElkICovCisJVUJZVEUgU0NCX0x1bjsJCS8qMjcgTHVuICovCisJVTMyIFNDQl9CdWZQdHI7CQkvKjI4IERhdGEgQnVmZmVyIFBvaW50ZXIgKi8KKwlVMzIgU0NCX0J1ZkxlbjsJCS8qMkMgRGF0YSBBbGxvY2F0aW9uIExlbmd0aCAqLworCVVCWVRFIFNDQl9TR0xlbjsJLyozMCBTRyBsaXN0ICMgKi8KKwlVQllURSBTQ0JfU2Vuc2VMZW47CS8qMzEgU2Vuc2UgQWxsb2NhdGlvbiBMZW5ndGggKi8KKwlVQllURSBTQ0JfSGFTdGF0OwkvKjMyICovCisJVUJZVEUgU0NCX1RhU3RhdDsJLyozMyAqLworCVVCWVRFIFNDQl9DREJMZW47CS8qMzQgQ0RCIExlbmd0aCAqLworCVVCWVRFIFNDQl9JZGVudDsJLyozNSBJZGVudGlmeSAqLworCVVCWVRFIFNDQl9UYWdNc2c7CS8qMzYgVGFnIE1lc3NhZ2UgKi8KKwlVQllURSBTQ0JfVGFnSWQ7CS8qMzcgUXVldWUgVGFnICovCisJVUJZVEUgU0NCX0NEQlsxMl07CS8qMzggKi8KKwlVMzIgU0NCX1NHUEFkZHI7CS8qNDQgU0cgTGlzdC9TZW5zZSBCdWYgcGh5LiBBZGRyLiAqLworCVUzMiBTQ0JfU2Vuc2VQdHI7CS8qNDggU2Vuc2UgZGF0YSBwb2ludGVyICovCisJdm9pZCAoKlNDQl9Qb3N0KSAoQllURSAqLCBCWVRFICopOwkvKjRDIFBPU1Qgcm91dGluZSAqLworCXN0cnVjdCBzY3NpX2NtbmQgKlNDQl9TcmI7CS8qNTAgU1JCIFBvaW50ZXIgKi8KKwlTRyBTQ0JfU0dMaXN0W1RPVEFMX1NHX0VOVFJZXTsJLyo1NCBTdGFydCBvZiBTRyBsaXN0ICovCit9IFNDQjsKKworLyogQml0IERlZmluaXRpb24gZm9yIFNDQl9TdGF0dXMgKi8KKyNkZWZpbmUgU0NCX1JFTlQgICAgICAgIDB4MDEKKyNkZWZpbmUgU0NCX1BFTkQgICAgICAgIDB4MDIKKyNkZWZpbmUgU0NCX0NPTlRJRyAgICAgIDB4MDQJLyogQ29udGlnZW50IEFsbGVnaWFuY2UgKi8KKyNkZWZpbmUgU0NCX1NFTEVDVCAgICAgIDB4MDgKKyNkZWZpbmUgU0NCX0JVU1kgICAgICAgIDB4MTAKKyNkZWZpbmUgU0NCX0RPTkUgICAgICAgIDB4MjAKKworCisvKiBPcGNvZGVzIG9mIFNDQl9PcGNvZGUgKi8KKyNkZWZpbmUgRXhlY1NDU0kgICAgICAgIDB4MQorI2RlZmluZSBCdXNEZXZSc3QgICAgICAgMHgyCisjZGVmaW5lIEFib3J0Q21kICAgICAgICAweDMKKworCisvKiBCaXQgRGVmaW5pdGlvbiBmb3IgU0NCX01vZGUgKi8KKyNkZWZpbmUgU0NNX1JTRU5TICAgICAgIDB4MDEJLyogcmVxdWVzdCBzZW5zZSBtb2RlICovCisKKworLyogQml0IERlZmluaXRpb24gZm9yIFNDQl9GbGFncyAqLworI2RlZmluZSBTQ0ZfRE9ORSAgICAgICAgMHgwMQorI2RlZmluZSBTQ0ZfUE9TVCAgICAgICAgMHgwMgorI2RlZmluZSBTQ0ZfU0VOU0UgICAgICAgMHgwNAorI2RlZmluZSBTQ0ZfRElSICAgICAgICAgMHgxOAorI2RlZmluZSBTQ0ZfTk9fRENISyAgICAgMHgwMAorI2RlZmluZSBTQ0ZfRElOICAgICAgICAgMHgwOAorI2RlZmluZSBTQ0ZfRE9VVCAgICAgICAgMHgxMAorI2RlZmluZSBTQ0ZfTk9fWEYgICAgICAgMHgxOAorI2RlZmluZSBTQ0ZfV1JfVkYgICAgICAgMHgyMAkvKiBXcml0ZSB2ZXJpZnkgdHVybiBvbiAgICAgICAgICovCisjZGVmaW5lIFNDRl9QT0xMICAgICAgICAweDQwCisjZGVmaW5lIFNDRl9TRyAgICAgICAgICAweDgwCisKKy8qIEVycm9yIENvZGVzIGZvciBTQ0JfSGFTdGF0ICovCisjZGVmaW5lIEhPU1RfU0VMX1RPVVQgICAweDExCisjZGVmaW5lIEhPU1RfRE9fRFUgICAgICAweDEyCisjZGVmaW5lIEhPU1RfQlVTX0ZSRUUgICAweDEzCisjZGVmaW5lIEhPU1RfQkFEX1BIQVMgICAweDE0CisjZGVmaW5lIEhPU1RfSU5WX0NNRCAgICAweDE2CisjZGVmaW5lIEhPU1RfQUJPUlRFRCAgICAweDFBCS8qIDA3LzIxLzk4ICovCisjZGVmaW5lIEhPU1RfU0NTSV9SU1QgICAweDFCCisjZGVmaW5lIEhPU1RfREVWX1JTVCAgICAweDFDCisKKy8qIEVycm9yIENvZGVzIGZvciBTQ0JfVGFTdGF0ICovCisjZGVmaW5lIFRBUkdFVF9DSEtDT05EICAweDAyCisjZGVmaW5lIFRBUkdFVF9CVVNZICAgICAweDA4CisjZGVmaW5lIElOSV9RVUVVRV9GVUxMCTB4MjgKKworLyogU0NTSSBNRVNTQUdFICovCisjZGVmaW5lIE1TR19DT01QICAgICAgICAweDAwCisjZGVmaW5lIE1TR19FWFRFTkQgICAgICAweDAxCisjZGVmaW5lIE1TR19TRFAgICAgICAgICAweDAyCisjZGVmaW5lIE1TR19SRVNUT1JFICAgICAweDAzCisjZGVmaW5lIE1TR19ESVNDICAgICAgICAweDA0CisjZGVmaW5lIE1TR19JREUgICAgICAgICAweDA1CisjZGVmaW5lIE1TR19BQk9SVCAgICAgICAweDA2CisjZGVmaW5lIE1TR19SRUogICAgICAgICAweDA3CisjZGVmaW5lIE1TR19OT1AgICAgICAgICAweDA4CisjZGVmaW5lIE1TR19QQVJJVFkgICAgICAweDA5CisjZGVmaW5lIE1TR19MSU5LX0NPTVAgICAweDBBCisjZGVmaW5lIE1TR19MSU5LX0ZMQUcgICAweDBCCisjZGVmaW5lIE1TR19ERVZSU1QgICAgICAweDBDCisjZGVmaW5lIE1TR19BQk9SVF9UQUcgICAweDBECisKKy8qIFF1ZXVlIHRhZyBtc2c6IFNpbXBsZV9xdXF1ZV90YWcsIEhlYWRfb2ZfcXVldWVfdGFnLCBPcmRlcmVkX3F1ZXVlX3RhZyAqLworI2RlZmluZSBNU0dfU1RBRyAgICAgICAgMHgyMAorI2RlZmluZSBNU0dfSFRBRyAgICAgICAgMHgyMQorI2RlZmluZSBNU0dfT1RBRyAgICAgICAgMHgyMgorCisjZGVmaW5lIE1TR19JR05PUkVXSURFICAweDIzCisKKyNkZWZpbmUgTVNHX0lERU5UICAgMHg4MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJVGFyZ2V0IERldmljZSBDb250cm9sIFN0cnVjdHVyZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgVGFyX0N0cmxfU3RydWMgeworCVVXT1JEIFRDU19GbGFnczsJLyogMCAqLworCVVCWVRFIFRDU19KU19QZXJpb2Q7CS8qIDIgKi8KKwlVQllURSBUQ1NfU0NvbmZpZzA7CS8qIDMgKi8KKworCVVXT1JEIFRDU19EcnZGbGFnczsJLyogNCAqLworCVVCWVRFIFRDU19EcnZIZWFkOwkvKiA2ICovCisJVUJZVEUgVENTX0RydlNlY3RvcjsJLyogNyAqLworfSBUQ1M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQlUYXJnZXQgRGV2aWNlIENvbnRyb2wgU3RydWN0dXJlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBCaXQgRGVmaW5pdGlvbiBmb3IgVENGX0ZsYWdzICovCisjZGVmaW5lIFRDRl9TQ1NJX1JBVEUgICAgICAgICAgIDB4MDAwNworI2RlZmluZSBUQ0ZfRU5fRElTQyAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgVENGX05PX1NZTkNfTkVHTyAgICAgICAgMHgwMDEwCisjZGVmaW5lIFRDRl9OT19XRFRSICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBUQ0ZfRU5fMjU1ICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgVENGX0VOX1NUQVJUICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFRDRl9XRFRSX0RPTkUgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBUQ0ZfU1lOQ19ET05FICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgVENGX0JVU1kgICAgICAgICAgICAgICAgMHgwNDAwCisKKworLyogQml0IERlZmluaXRpb24gZm9yIFRDRl9EcnZGbGFncyAqLworI2RlZmluZSBUQ0ZfRFJWX0JVU1kgICAgICAgICAgICAweDAxCS8qIEluZGljYXRlIHRhcmdldCBidXN5KGRyaXZlcikgKi8KKyNkZWZpbmUgVENGX0RSVl9FTl9UQUcgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFRDRl9EUlZfMjU1XzYzICAgICAgICAgIDB4MDQwMAorCit0eXBlZGVmIHN0cnVjdCBJOTF1X0FkcHRfU3RydWMgeworCVVXT1JEIEFEUFRfQklPUzsJLyogMCAqLworCVVXT1JEIEFEUFRfQkFTRTsJLyogMSAqLworCVVCWVRFIEFEUFRfQnVzOwkJLyogMiAqLworCVVCWVRFIEFEUFRfRGV2aWNlOwkvKiAzICovCisJVUJZVEUgQURQVF9JTlRSOwkvKiA0ICovCit9IElOSV9BRFBUX1NUUlVDVDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgICAgICBIb3N0IEFkYXB0ZXIgQ29udHJvbCBTdHJ1Y3R1cmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IEhhX0N0cmxfU3RydWMgeworCVVXT1JEIEhDU19CYXNlOwkJLyogMDAgKi8KKwlVV09SRCBIQ1NfQklPUzsJCS8qIDAyICovCisJVUJZVEUgSENTX0ludHI7CQkvKiAwNCAqLworCVVCWVRFIEhDU19TQ1NJX0lEOwkvKiAwNSAqLworCVVCWVRFIEhDU19NYXhUYXI7CS8qIDA2ICovCisJVUJZVEUgSENTX051bVNjYnM7CS8qIDA3ICovCisKKwlVQllURSBIQ1NfRmxhZ3M7CS8qIDA4ICovCisJVUJZVEUgSENTX0luZGV4OwkvKiAwOSAqLworCVVCWVRFIEhDU19IYUlkOwkJLyogMEEgKi8KKwlVQllURSBIQ1NfQ29uZmlnOwkvKiAwQiAqLworCVVXT1JEIEhDU19JZE1hc2s7CS8qIDBDICovCisJVUJZVEUgSENTX1NlbWFwaDsJLyogMEUgKi8KKwlVQllURSBIQ1NfUGhhc2U7CS8qIDBGICovCisJVUJZVEUgSENTX0pTU3RhdHVzMDsJLyogMTAgKi8KKwlVQllURSBIQ1NfSlNJbnQ7CS8qIDExICovCisJVUJZVEUgSENTX0pTU3RhdHVzMTsJLyogMTIgKi8KKwlVQllURSBIQ1NfU0NvbmYxOwkvKiAxMyAqLworCisJVUJZVEUgSENTX01zZ1s4XTsJLyogMTQgKi8KKwlTQ0IgKkhDU19OeHRBdmFpbDsJLyogMUMgKi8KKwlTQ0IgKkhDU19TY2I7CQkvKiAyMCAqLworCVNDQiAqSENTX1NjYkVuZDsJLyogMjQgKi8KKwlTQ0IgKkhDU19OeHRQZW5kOwkvKiAyOCAqLworCVNDQiAqSENTX054dENvbnRpZzsJLyogMkMgKi8KKwlTQ0IgKkhDU19BY3RTY2I7CS8qIDMwICovCisJVENTICpIQ1NfQWN0VGNzOwkvKiAzNCAqLworCisJU0NCICpIQ1NfRmlyc3RBdmFpbDsJLyogMzggKi8KKwlTQ0IgKkhDU19MYXN0QXZhaWw7CS8qIDNDICovCisJU0NCICpIQ1NfRmlyc3RQZW5kOwkvKiA0MCAqLworCVNDQiAqSENTX0xhc3RQZW5kOwkvKiA0NCAqLworCVNDQiAqSENTX0ZpcnN0QnVzeTsJLyogNDggKi8KKwlTQ0IgKkhDU19MYXN0QnVzeTsJLyogNEMgKi8KKwlTQ0IgKkhDU19GaXJzdERvbmU7CS8qIDUwICovCisJU0NCICpIQ1NfTGFzdERvbmU7CS8qIDU0ICovCisJVUJZVEUgSENTX01heFRhZ3NbMTZdOwkvKiA1OCAqLworCVVCWVRFIEhDU19BY3RUYWdzWzE2XTsJLyogNjggKi8KKwlUQ1MgSENTX1Rjc1tNQVhfVEFSR0VUU107CS8qIDc4ICovCisJc3BpbmxvY2tfdCBIQ1NfQXZhaWxMb2NrOworCXNwaW5sb2NrX3QgSENTX1NlbWFwaExvY2s7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7Cit9IEhDUzsKKworLyogQml0IERlZmluaXRpb24gZm9yIEhDQl9Db25maWcgKi8KKyNkZWZpbmUgSENDX1NDU0lfUkVTRVQgICAgICAgICAgMHgwMQorI2RlZmluZSBIQ0NfRU5fUEFSICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEhDQ19BQ1RfVEVSTTEgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgSENDX0FDVF9URVJNMiAgICAgICAgICAgMHgwOAorI2RlZmluZSBIQ0NfQVVUT19URVJNICAgICAgICAgICAweDEwCisjZGVmaW5lIEhDQ19FTl9QV1IgICAgICAgICAgICAgIDB4ODAKKworLyogQml0IERlZmluaXRpb24gZm9yIEhDQl9GbGFncyAqLworI2RlZmluZSBIQ0ZfRVhQRUNUX0RJU0MgICAgICAgICAweDAxCisjZGVmaW5lIEhDRl9FWFBFQ1RfU0VMRUNUICAgICAgIDB4MDIKKyNkZWZpbmUgSENGX0VYUEVDVF9SRVNFVCAgICAgICAgMHgxMAorI2RlZmluZSBIQ0ZfRVhQRUNUX0RPTkVfRElTQyAgICAweDIwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlTZXJpYWwgRUVQcm9tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfTlZSQU1fU0NTSSB7CS8qIFNDU0kgY2hhbm5lbCBjb25maWd1cmF0aW9uICAgKi8KKwlVQ0hBUiBOVk1fQ2hTQ1NJSUQ7CS8qIDBDaCAtPiBDaGFubmVsIFNDU0kgSUQgICAgICAgKi8KKwlVQ0hBUiBOVk1fQ2hDb25maWcxOwkvKiAwRGggLT4gQ2hhbm5lbCBjb25maWcgMSAgICAgICovCisJVUNIQVIgTlZNX0NoQ29uZmlnMjsJLyogMEVoIC0+IENoYW5uZWwgY29uZmlnIDIgICAgICAqLworCVVDSEFSIE5WTV9OdW1PZlRhcmc7CS8qIDBGaCAtPiBOdW1iZXIgb2YgU0NTSSB0YXJnZXQgKi8KKwkvKiBTQ1NJIHRhcmdldCBjb25maWd1cmF0aW9uICAgICovCisJVUNIQVIgTlZNX1RhcmcwQ29uZmlnOwkvKiAxMGggLT4gVGFyZ2V0IDAgY29uZmlndXJhdGlvbiAqLworCVVDSEFSIE5WTV9UYXJnMUNvbmZpZzsJLyogMTFoIC0+IFRhcmdldCAxIGNvbmZpZ3VyYXRpb24gKi8KKwlVQ0hBUiBOVk1fVGFyZzJDb25maWc7CS8qIDEyaCAtPiBUYXJnZXQgMiBjb25maWd1cmF0aW9uICovCisJVUNIQVIgTlZNX1RhcmczQ29uZmlnOwkvKiAxM2ggLT4gVGFyZ2V0IDMgY29uZmlndXJhdGlvbiAqLworCVVDSEFSIE5WTV9UYXJnNENvbmZpZzsJLyogMTRoIC0+IFRhcmdldCA0IGNvbmZpZ3VyYXRpb24gKi8KKwlVQ0hBUiBOVk1fVGFyZzVDb25maWc7CS8qIDE1aCAtPiBUYXJnZXQgNSBjb25maWd1cmF0aW9uICovCisJVUNIQVIgTlZNX1Rhcmc2Q29uZmlnOwkvKiAxNmggLT4gVGFyZ2V0IDYgY29uZmlndXJhdGlvbiAqLworCVVDSEFSIE5WTV9UYXJnN0NvbmZpZzsJLyogMTdoIC0+IFRhcmdldCA3IGNvbmZpZ3VyYXRpb24gKi8KKwlVQ0hBUiBOVk1fVGFyZzhDb25maWc7CS8qIDE4aCAtPiBUYXJnZXQgOCBjb25maWd1cmF0aW9uICovCisJVUNIQVIgTlZNX1Rhcmc5Q29uZmlnOwkvKiAxOWggLT4gVGFyZ2V0IDkgY29uZmlndXJhdGlvbiAqLworCVVDSEFSIE5WTV9UYXJnQUNvbmZpZzsJLyogMUFoIC0+IFRhcmdldCBBIGNvbmZpZ3VyYXRpb24gKi8KKwlVQ0hBUiBOVk1fVGFyZ0JDb25maWc7CS8qIDFCaCAtPiBUYXJnZXQgQiBjb25maWd1cmF0aW9uICovCisJVUNIQVIgTlZNX1RhcmdDQ29uZmlnOwkvKiAxQ2ggLT4gVGFyZ2V0IEMgY29uZmlndXJhdGlvbiAqLworCVVDSEFSIE5WTV9UYXJnRENvbmZpZzsJLyogMURoIC0+IFRhcmdldCBEIGNvbmZpZ3VyYXRpb24gKi8KKwlVQ0hBUiBOVk1fVGFyZ0VDb25maWc7CS8qIDFFaCAtPiBUYXJnZXQgRSBjb25maWd1cmF0aW9uICovCisJVUNIQVIgTlZNX1RhcmdGQ29uZmlnOwkvKiAxRmggLT4gVGFyZ2V0IEYgY29uZmlndXJhdGlvbiAqLworfSBOVlJBTV9TQ1NJOworCit0eXBlZGVmIHN0cnVjdCBfTlZSQU0geworLyotLS0tLS0tLS0taGVhZGVyIC0tLS0tLS0tLS0tLS0tLSovCisJVVNIT1JUIE5WTV9TaWduYXR1cmU7CS8qIDAsMTogU2lnbmF0dXJlICovCisJVUNIQVIgTlZNX1NpemU7CQkvKiAyOiAgIFNpemUgb2YgZGF0YSBzdHJ1Y3R1cmUgKi8KKwlVQ0hBUiBOVk1fUmV2aXNpb247CS8qIDM6ICAgUmV2aXNpb24gb2YgZGF0YSBzdHJ1Y3R1cmUgKi8KKwkvKiAtLS0tSG9zdCBBZGFwdGVyIFN0cnVjdHVyZSAtLS0tICovCisJVUNIQVIgTlZNX01vZGVsQnl0ZTA7CS8qIDQ6ICAgTW9kZWwgbnVtYmVyIChieXRlIDApICovCisJVUNIQVIgTlZNX01vZGVsQnl0ZTE7CS8qIDU6ICAgTW9kZWwgbnVtYmVyIChieXRlIDEpICovCisJVUNIQVIgTlZNX01vZGVsSW5mbzsJLyogNjogICBNb2RlbCBpbmZvcm1hdGlvbiAgICAgICAgICovCisJVUNIQVIgTlZNX051bU9mQ2g7CS8qIDc6ICAgTnVtYmVyIG9mIFNDU0kgY2hhbm5lbCAqLworCVVDSEFSIE5WTV9CSU9TQ29uZmlnMTsJLyogODogICBCSU9TIGNvbmZpZ3VyYXRpb24gMSAgKi8KKwlVQ0hBUiBOVk1fQklPU0NvbmZpZzI7CS8qIDk6ICAgQklPUyBjb25maWd1cmF0aW9uIDIgICovCisJVUNIQVIgTlZNX0hBQ29uZmlnMTsJLyogQTogICBIb2F0IGFkYXB0ZXIgY29uZmlndXJhdGlvbiAxICovCisJVUNIQVIgTlZNX0hBQ29uZmlnMjsJLyogQjogICBIb2F0IGFkYXB0ZXIgY29uZmlndXJhdGlvbiAyICovCisJTlZSQU1fU0NTSSBOVk1fU0NTSUluZm9bMl07CisJVUNIQVIgTlZNX3Jlc2VydmVkWzEwXTsKKwkvKiAtLS0tLS0tLS0tIENoZWNrU3VtIC0tLS0tLS0tLS0gICAgICAgKi8KKwlVU0hPUlQgTlZNX0NoZWNrU3VtOwkvKiAweDNFLCAweDNGOiBDaGVja3N1bSBvZiBOVlJhbSAgICAgICAgKi8KK30gTlZSQU0sICpQTlZSQU07CisKKy8qIEJpb3MgQ29uZmlndXJhdGlvbiBmb3IgbnZyYW0tPkJJT1NDb25maWcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE5CQzFfRU5BQkxFICAgICAgICAgICAgIDB4MDEJLyogQklPUyBlbmFibGUgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOQkMxXzhEUklWRSAgICAgICAgICAgICAweDAyCS8qIFN1cHBvcnQgbW9yZSB0aGFuIDIgZHJpdmVzICAgKi8KKyNkZWZpbmUgTkJDMV9SRU1PVkFCTEUgICAgICAgICAgMHgwNAkvKiBTdXBwb3J0IHJlbW92YWJsZSBkcml2ZSAgICAgICovCisjZGVmaW5lIE5CQzFfSU5UMTkgICAgICAgICAgICAgIDB4MDgJLyogSW50ZXJjZXB0IGludCAxOWggICAgICAgICAgICAqLworI2RlZmluZSBOQkMxX0JJT1NTQ0FOICAgICAgICAgICAweDEwCS8qIER5bmFtaWMgQklPUyBzY2FuICAgICAgICAgICAgKi8KKyNkZWZpbmUgTkJDMV9MVU5TVVBQT1JUICAgICAgICAgMHg0MAkvKiBTdXBwb3J0IExVTiAgICAgICAgICAgICAgICAgICovCisKKy8qIEhBIENvbmZpZ3VyYXRpb24gQnl0ZSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE5IQzFfQk9PVElETUFTSyAweDBGCS8qIEJvb3QgSUQgbnVtYmVyICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTkhDMV9MVU5NQVNLICAgIDB4NzAJLyogQm9vdCBMVU4gbnVtYmVyICAgICAgICAgICAgICAqLworI2RlZmluZSBOSEMxX0NIQU5NQVNLICAgMHg4MAkvKiBCb290IENoYW5uZWwgbnVtYmVyICAgICAgICAgICovCisKKy8qIEJpdCBkZWZpbml0aW9uIGZvciBudnJhbS0+U0NTSWNvbmZpZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE5DQzFfQlVTUkVTRVQgICAgICAgICAgIDB4MDEJLyogUmVzZXQgU0NTSSBidXMgYXQgcG93ZXIgdXAgICAqLworI2RlZmluZSBOQ0MxX1BBUklUWUNISyAgICAgICAgICAweDAyCS8qIFNDU0kgcGFyaXR5IGVuYWJsZSAgICAgICAgICAgKi8KKyNkZWZpbmUgTkNDMV9BQ1RURVJNMSAgICAgICAgICAgMHgwNAkvKiBFbmFibGUgYWN0aXZlIHRlcm1pbmF0b3IgMSAgICovCisjZGVmaW5lIE5DQzFfQUNUVEVSTTIgICAgICAgICAgIDB4MDgJLyogRW5hYmxlIGFjdGl2ZSB0ZXJtaW5hdG9yIDIgICAqLworI2RlZmluZSBOQ0MxX0FVVE9URVJNICAgICAgICAgICAweDEwCS8qIEVuYWJsZSBhdXRvIHRlcm1pbmF0b3IgICAgICAgKi8KKyNkZWZpbmUgTkNDMV9QV1JNR1IgICAgICAgICAgICAgMHg4MAkvKiBFbmFibGUgcG93ZXIgbWFuYWdlbWVudCAgICAgICovCisKKy8qIEJpdCBkZWZpbml0aW9uIGZvciBTQ1NJIFRhcmdldCBjb25maWd1cmF0aW9uIGJ5dGUgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE5UQ19ESVNDT05ORUNUICAgICAgICAgIDB4MDgJLyogRW5hYmxlIFNDU0kgZGlzY29ubmVjdCAgICAgICAqLworI2RlZmluZSBOVENfU1lOQyAgICAgICAgICAgICAgICAweDEwCS8qIFNZTkNfTkVHTyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTlRDX05PX1dEVFIgICAgICAgICAgICAgMHgyMAkvKiBTWU5DX05FR08gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE5UQ18xR0lHQSAgICAgICAgICAgICAgIDB4NDAJLyogMjU1IGhlYWQgLyA2MyBzZWN0b3JzICg2NC8zMikgKi8KKyNkZWZpbmUgTlRDX1NQSU5VUCAgICAgICAgICAgICAgMHg4MAkvKiBTdGFydCBkaXNrIGRyaXZlICAgICAgICAgICAgICovCisKKy8qICAgICAgRGVmYXVsdCBOVlJhbSB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElOSV9TSUdOQVRVUkUgICAgICAgICAgIDB4QzkyNQorI2RlZmluZSBOQkMxX0RFRkFVTFQgICAgICAgICAgICAoTkJDMV9FTkFCTEUpCisjZGVmaW5lIE5DQzFfREVGQVVMVCAgICAgICAgICAgIChOQ0MxX0JVU1JFU0VUIHwgTkNDMV9BVVRPVEVSTSB8IE5DQzFfUEFSSVRZQ0hLKQorI2RlZmluZSBOVENfREVGQVVMVCAgICAgICAgICAgICAoTlRDX05PX1dEVFIgfCBOVENfMUdJR0EgfCBOVENfRElTQ09OTkVDVCkKKworLyogU0NTSSByZWxhdGVkIGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRElTQ19OT1RfQUxMT1cgICAgICAgICAgMHg4MAkvKiBEaXNjb25uZWN0IGlzIG5vdCBhbGxvd2VkICAgICovCisjZGVmaW5lIERJU0NfQUxMT1cgICAgICAgICAgICAgIDB4QzAJLyogRGlzY29ubmVjdCBpcyBhbGxvd2VkICAgICAgICAqLworI2RlZmluZSBTQ1NJQ01EX1JlcXVlc3RTZW5zZSAgICAweDAzCisKK3R5cGVkZWYgc3RydWN0IF9IQ1NpbmZvIHsKKwlVTE9ORyBiYXNlOworCVVDSEFSIHZlYzsKKwlVQ0hBUiBiaW9zOwkJLyogSGlnaCBieXRlIG9mIEJJT1MgYWRkcmVzcyAqLworCVVTSE9SVCBCYXNlQW5kQmlvczsJLyogaGlnaCBieXRlOiBwSGNzSW5mby0+Ymlvcyxsb3cgYnl0ZTpwSGNzSW5mby0+YmFzZSAqLworfSBIQ1NJTkZPOworCisjZGVmaW5lIFRVTF9SRCh4LHkpICAgICAgICAgICAgIChVQ0hBUikoaW5iKCAgKGludCkoKFVMT05HKSh4K3kpKSApKQorI2RlZmluZSBUVUxfUkRMT05HKHgseSkgICAgICAgICAoVUxPTkcpKGlubCgoaW50KSgoVUxPTkcpKHgreSkpICkpCisjZGVmaW5lIFRVTF9XUiggICAgIGFkcixkYXRhKSAgIG91dGIoIChVQ0hBUikoZGF0YSksIChpbnQpKGFkcikpCisjZGVmaW5lIFRVTF9XUlNIT1JUKGFkcixkYXRhKSAgIG91dHcoIChVV09SRCkoZGF0YSksIChpbnQpKGFkcikpCisjZGVmaW5lIFRVTF9XUkxPTkcoIGFkcixkYXRhKSAgIG91dGwoIChVTE9ORykoZGF0YSksIChpbnQpKGFkcikpCisKKyNkZWZpbmUgU0NTSV9BQk9SVF9TTk9PWkUgMAorI2RlZmluZSBTQ1NJX0FCT1JUX1NVQ0NFU1MgMQorI2RlZmluZSBTQ1NJX0FCT1JUX1BFTkRJTkcgMgorI2RlZmluZSBTQ1NJX0FCT1JUX0JVU1kgMworI2RlZmluZSBTQ1NJX0FCT1JUX05PVF9SVU5OSU5HIDQKKyNkZWZpbmUgU0NTSV9BQk9SVF9FUlJPUiA1CisKKyNkZWZpbmUgU0NTSV9SRVNFVF9TTk9PWkUgMAorI2RlZmluZSBTQ1NJX1JFU0VUX1BVTlQgMQorI2RlZmluZSBTQ1NJX1JFU0VUX1NVQ0NFU1MgMgorI2RlZmluZSBTQ1NJX1JFU0VUX1BFTkRJTkcgMworI2RlZmluZSBTQ1NJX1JFU0VUX1dBS0VVUCA0CisjZGVmaW5lIFNDU0lfUkVTRVRfTk9UX1JVTk5JTkcgNQorI2RlZmluZSBTQ1NJX1JFU0VUX0VSUk9SIDYKKworI2RlZmluZSBTQ1NJX1JFU0VUX1NZTkNIUk9OT1VTCQkweDAxCisjZGVmaW5lIFNDU0lfUkVTRVRfQVNZTkNIUk9OT1VTCQkweDAyCisjZGVmaW5lIFNDU0lfUkVTRVRfU1VHR0VTVF9CVVNfUkVTRVQJMHgwNAorI2RlZmluZSBTQ1NJX1JFU0VUX1NVR0dFU1RfSE9TVF9SRVNFVAkweDA4CisKKyNkZWZpbmUgU0NTSV9SRVNFVF9CVVNfUkVTRVQgMHgxMDAKKyNkZWZpbmUgU0NTSV9SRVNFVF9IT1NUX1JFU0VUIDB4MjAwCisjZGVmaW5lIFNDU0lfUkVTRVRfQUNUSU9OICAgMHhmZgorCitleHRlcm4gdm9pZCBpbml0X2k5MXVBZGFwdGVyX3RhYmxlKHZvaWQpOworZXh0ZXJuIGludCBBZGRpOTF1X2ludG9fQWRhcHRlcl90YWJsZShXT1JELCBXT1JELCBCWVRFLCBCWVRFLCBCWVRFKTsKK2V4dGVybiBpbnQgdHVsX1JldHVybk51bWJlck9mQWRhcHRlcnModm9pZCk7CitleHRlcm4gdm9pZCBnZXRfdHVsaXBQQ0lDb25maWcoSENTICogcEhDQiwgaW50IGlDaGFubmVsX2luZGV4KTsKK2V4dGVybiBpbnQgaW5pdF90dWxpcChIQ1MgKiBwSENCLCBTQ0IgKiBwU0NCLCBpbnQgdHVsX251bV9zY2IsIEJZVEUgKiBwYkJpb3NBZHIsIGludCByZXNldF90aW1lKTsKK2V4dGVybiBTQ0IgKnR1bF9hbGxvY19zY2IoSENTICogcEhDQik7CitleHRlcm4gaW50IHR1bF9hYm9ydF9zcmIoSENTICogcEhDQiwgc3RydWN0IHNjc2lfY21uZCAqIHBTUkIpOworZXh0ZXJuIHZvaWQgdHVsX2V4ZWNfc2NiKEhDUyAqIHBIQ0IsIFNDQiAqIHBTQ0IpOworZXh0ZXJuIHZvaWQgdHVsX3JlbGVhc2Vfc2NiKEhDUyAqIHBIQ0IsIFNDQiAqIHBTQ0IpOworZXh0ZXJuIHZvaWQgdHVsX3N0b3BfYm0oSENTICogcEhDQik7CitleHRlcm4gaW50IHR1bF9yZXNldF9zY3NpKEhDUyAqIHBDdXJIY2IsIGludCBzZWNvbmRzKTsKK2V4dGVybiBpbnQgdHVsX2lzcihIQ1MgKiBwSENCKTsKK2V4dGVybiBpbnQgdHVsX3Jlc2V0KEhDUyAqIHBIQ0IsIHN0cnVjdCBzY3NpX2NtbmQgKiBwU1JCLCB1bnNpZ25lZCBjaGFyIHRhcmdldCk7CitleHRlcm4gaW50IHR1bF9yZXNldF9zY3NpX2J1cyhIQ1MgKiBwQ3VySGNiKTsKK2V4dGVybiBpbnQgdHVsX2RldmljZV9yZXNldChIQ1MgKiBwQ3VySGNiLCBzdHJ1Y3Qgc2NzaV9jbW5kICpwU3JiLAorCQl1bnNpZ25lZCBpbnQgdGFyZ2V0LCB1bnNpZ25lZCBpbnQgUmVzZXRGbGFncyk7CisJCQkJLyogLS0tLSBFWFRFUk5BTCBWQVJJQUJMRVMgLS0tLSAqLworZXh0ZXJuIEhDUyB0dWxfaGNzW107CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXByLmMgYi9kcml2ZXJzL3Njc2kvaXByLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0MTUzMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pcHIuYwpAQCAtMCwwICsxLDYwODMgQEAKKy8qCisgKiBpcHIuYyAtLSBkcml2ZXIgZm9yIElCTSBQb3dlciBMaW51eCBSQUlEIGFkYXB0ZXJzCisgKgorICogV3JpdHRlbiBCeTogQnJpYW4gS2luZyA8YnJraW5nQHVzLmlibS5jb20+LCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisvKgorICogTm90ZXM6CisgKgorICogVGhpcyBkcml2ZXIgaXMgdXNlZCB0byBjb250cm9sIHRoZSBmb2xsb3dpbmcgU0NTSSBhZGFwdGVyczoKKyAqCisgKiBJQk0gaVNlcmllczogNTcwMiwgNTcwMywgMjc4MCwgNTcwOSwgNTcwQSwgNTcwQgorICoKKyAqIElCTSBwU2VyaWVzOiBQQ0ktWCBEdWFsIENoYW5uZWwgVWx0cmEgMzIwIFNDU0kgUkFJRCBBZGFwdGVyCisgKiAgICAgICAgICAgICAgUENJLVggRHVhbCBDaGFubmVsIFVsdHJhIDMyMCBTQ1NJIEFkYXB0ZXIKKyAqICAgICAgICAgICAgICBQQ0ktWCBEdWFsIENoYW5uZWwgVWx0cmEgMzIwIFNDU0kgUkFJRCBFbmFibGVtZW50IENhcmQKKyAqICAgICAgICAgICAgICBFbWJlZGRlZCBTQ1NJIGFkYXB0ZXIgb24gcDYxNSBhbmQgcDY1NSBzeXN0ZW1zCisgKgorICogU3VwcG9ydGVkIEhhcmR3YXJlIEZlYXR1cmVzOgorICoJLSBVbHRyYSAzMjAgU0NTSSBjb250cm9sbGVyCisgKgktIFBDSS1YIGhvc3QgaW50ZXJmYWNlCisgKgktIEVtYmVkZGVkIFBvd2VyUEMgUklTQyBQcm9jZXNzb3IgYW5kIEhhcmR3YXJlIFhPUiBETUEgRW5naW5lCisgKgktIE5vbi1Wb2xhdGlsZSBXcml0ZSBDYWNoZQorICoJLSBTdXBwb3J0cyBhdHRhY2htZW50IG9mIG5vbi1SQUlEIGRpc2tzLCB0YXBlLCBhbmQgb3B0aWNhbCBkZXZpY2VzCisgKgktIFJBSUQgTGV2ZWxzIDAsIDUsIDEwCisgKgktIEhvdCBzcGFyZQorICoJLSBCYWNrZ3JvdW5kIFBhcml0eSBDaGVja2luZworICoJLSBCYWNrZ3JvdW5kIERhdGEgU2NydWJiaW5nCisgKgktIEFiaWxpdHkgdG8gaW5jcmVhc2UgdGhlIGNhcGFjaXR5IG9mIGFuIGV4aXN0aW5nIFJBSUQgNSBkaXNrIGFycmF5CisgKgkJYnkgYWRkaW5nIGRpc2tzCisgKgorICogRHJpdmVyIEZlYXR1cmVzOgorICoJLSBUYWdnZWQgY29tbWFuZCBxdWV1aW5nCisgKgktIEFkYXB0ZXIgbWljcm9jb2RlIGRvd25sb2FkCisgKgktIFBDSSBob3QgcGx1ZworICoJLSBTQ1NJIGRldmljZSBob3QgcGx1ZworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9yZXF1ZXN0Lmg+CisjaW5jbHVkZSAiaXByLmgiCisKKy8qCisgKiAgIEdsb2JhbCBEYXRhCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGlwcl9pb2FfaGVhZCA9IExJU1RfSEVBRF9JTklUKGlwcl9pb2FfaGVhZCk7CitzdGF0aWMgdW5zaWduZWQgaW50IGlwcl9sb2dfbGV2ZWwgPSBJUFJfREVGQVVMVF9MT0dfTEVWRUw7CitzdGF0aWMgdW5zaWduZWQgaW50IGlwcl9tYXhfc3BlZWQgPSAxOworc3RhdGljIGludCBpcHJfdGVzdG1vZGUgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBpcHJfZmFzdGZhaWwgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBpcHJfdHJhbnNvcF90aW1lb3V0ID0gSVBSX09QRVJBVElPTkFMX1RJTUVPVVQ7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlwcl9kcml2ZXJfbG9jayk7CisKKy8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIERNQSBjb250cm9sbGVyIGNoaXBzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGlwcl9jaGlwX2NmZ190IGlwcl9jaGlwX2NmZ1tdID0geworCXsgLyogR2Vtc3RvbmUgYW5kIENpdHJpbmUgKi8KKwkJLm1haWxib3ggPSAweDAwNDJDLAorCQkuY2FjaGVfbGluZV9zaXplID0gMHgyMCwKKwkJeworCQkJLnNldF9pbnRlcnJ1cHRfbWFza19yZWcgPSAweDAwMjJDLAorCQkJLmNscl9pbnRlcnJ1cHRfbWFza19yZWcgPSAweDAwMjMwLAorCQkJLnNlbnNlX2ludGVycnVwdF9tYXNrX3JlZyA9IDB4MDAyMkMsCisJCQkuY2xyX2ludGVycnVwdF9yZWcgPSAweDAwMjI4LAorCQkJLnNlbnNlX2ludGVycnVwdF9yZWcgPSAweDAwMjI0LAorCQkJLmlvYXJyaW5fcmVnID0gMHgwMDQwNCwKKwkJCS5zZW5zZV91cHJvY19pbnRlcnJ1cHRfcmVnID0gMHgwMDIxNCwKKwkJCS5zZXRfdXByb2NfaW50ZXJydXB0X3JlZyA9IDB4MDAyMTQsCisJCQkuY2xyX3Vwcm9jX2ludGVycnVwdF9yZWcgPSAweDAwMjE4CisJCX0KKwl9LAorCXsgLyogU25pcGUgYW5kIFNjYW1wICovCisJCS5tYWlsYm94ID0gMHgwMDUyQywKKwkJLmNhY2hlX2xpbmVfc2l6ZSA9IDB4MjAsCisJCXsKKwkJCS5zZXRfaW50ZXJydXB0X21hc2tfcmVnID0gMHgwMDI4OCwKKwkJCS5jbHJfaW50ZXJydXB0X21hc2tfcmVnID0gMHgwMDI4QywKKwkJCS5zZW5zZV9pbnRlcnJ1cHRfbWFza19yZWcgPSAweDAwMjg4LAorCQkJLmNscl9pbnRlcnJ1cHRfcmVnID0gMHgwMDI4NCwKKwkJCS5zZW5zZV9pbnRlcnJ1cHRfcmVnID0gMHgwMDI4MCwKKwkJCS5pb2FycmluX3JlZyA9IDB4MDA1MDQsCisJCQkuc2Vuc2VfdXByb2NfaW50ZXJydXB0X3JlZyA9IDB4MDAyOTAsCisJCQkuc2V0X3Vwcm9jX2ludGVycnVwdF9yZWcgPSAweDAwMjkwLAorCQkJLmNscl91cHJvY19pbnRlcnJ1cHRfcmVnID0gMHgwMDI5NAorCQl9CisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXByX2NoaXBfdCBpcHJfY2hpcFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9NWUxFWCwgUENJX0RFVklDRV9JRF9JQk1fR0VNU1RPTkUsICZpcHJfY2hpcF9jZmdbMF0gfSwKKwl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DSVRSSU5FLCAmaXByX2NoaXBfY2ZnWzBdIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fU05JUEUsICZpcHJfY2hpcF9jZmdbMV0gfSwKKwl7IFBDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfU0NBTVAsICZpcHJfY2hpcF9jZmdbMV0gfQorfTsKKworc3RhdGljIGludCBpcHJfbWF4X2J1c19zcGVlZHMgW10gPSB7CisJSVBSXzgwTUJzX1NDU0lfUkFURSwgSVBSX1UxNjBfU0NTSV9SQVRFLCBJUFJfVTMyMF9TQ1NJX1JBVEUKK307CisKK01PRFVMRV9BVVRIT1IoIkJyaWFuIEtpbmcgPGJya2luZ0B1cy5pYm0uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJQk0gUG93ZXIgUkFJRCBTQ1NJIEFkYXB0ZXIgRHJpdmVyIik7Cittb2R1bGVfcGFyYW1fbmFtZWQobWF4X3NwZWVkLCBpcHJfbWF4X3NwZWVkLCB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X3NwZWVkLCAiTWF4aW11bSBidXMgc3BlZWQgKDAtMikuIERlZmF1bHQ6IDE9VTE2MC4gU3BlZWRzOiAwPTgwIE1CL3MsIDE9VTE2MCwgMj1VMzIwIik7Cittb2R1bGVfcGFyYW1fbmFtZWQobG9nX2xldmVsLCBpcHJfbG9nX2xldmVsLCB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobG9nX2xldmVsLCAiU2V0IHRvIDAgLSA0IGZvciBpbmNyZWFzaW5nIHZlcmJvc2l0eSBvZiBkZXZpY2UgZHJpdmVyIik7Cittb2R1bGVfcGFyYW1fbmFtZWQodGVzdG1vZGUsIGlwcl90ZXN0bW9kZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGVzdG1vZGUsICJEQU5HRVJPVVMhISEgQWxsb3dzIHVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb25zIik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZmFzdGZhaWwsIGlwcl9mYXN0ZmFpbCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZmFzdGZhaWwsICJSZWR1Y2UgdGltZW91dHMgYW5kIHJldHJpZXMiKTsKK21vZHVsZV9wYXJhbV9uYW1lZCh0cmFuc29wX3RpbWVvdXQsIGlwcl90cmFuc29wX3RpbWVvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRyYW5zb3BfdGltZW91dCwgIlRpbWUgaW4gc2Vjb25kcyB0byB3YWl0IGZvciBhZGFwdGVyIHRvIGNvbWUgb3BlcmF0aW9uYWwgKGRlZmF1bHQ6IDMwMCkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKElQUl9EUklWRVJfVkVSU0lPTik7CisKK3N0YXRpYyBjb25zdCBjaGFyICppcHJfZ3BkZF9kZXZfZW5kX3N0YXRlc1tdID0geworCSJDb21tYW5kIGNvbXBsZXRlIiwKKwkiVGVybWluYXRlZCBieSBob3N0IiwKKwkiVGVybWluYXRlZCBieSBkZXZpY2UgcmVzZXQiLAorCSJUZXJtaW5hdGVkIGJ5IGJ1cyByZXNldCIsCisJIlVua25vd24iLAorCSJDb21tYW5kIG5vdCBzdGFydGVkIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlwcl9ncGRkX2Rldl9idXNfcGhhc2VzW10gPSB7CisJIkJ1cyBmcmVlIiwKKwkiQXJiaXRyYXRpb24iLAorCSJTZWxlY3Rpb24iLAorCSJNZXNzYWdlIG91dCIsCisJIkNvbW1hbmQiLAorCSJNZXNzYWdlIGluIiwKKwkiRGF0YSBvdXQiLAorCSJEYXRhIGluIiwKKwkiU3RhdHVzIiwKKwkiUmVzZWxlY3Rpb24iLAorCSJVbmtub3duIgorfTsKKworLyogIEEgY29uc3RhbnQgYXJyYXkgb2YgSU9BU0NzL1VSQ3MvRXJyb3IgTWVzc2FnZXMgKi8KK3N0YXRpYyBjb25zdAorc3RydWN0IGlwcl9lcnJvcl90YWJsZV90IGlwcl9lcnJvcl90YWJsZVtdID0geworCXsweDAwMDAwMDAwLCAxLCAxLAorCSI4MTU1OiBBbiB1bmtub3duIGVycm9yIHdhcyByZWNlaXZlZCJ9LAorCXsweDAwMzMwMDAwLCAwLCAwLAorCSJTb2Z0IHVuZGVybGVuZ3RoIGVycm9yIn0sCisJezB4MDA1QTAwMDAsIDAsIDAsCisJIkNvbW1hbmQgdG8gYmUgY2FuY2VsbGVkIG5vdCBmb3VuZCJ9LAorCXsweDAwODA4MDAwLCAwLCAwLAorCSJRdWFsaWZpZWQgc3VjY2VzcyJ9LAorCXsweDAxMDgwMDAwLCAxLCAxLAorCSJGRkZFOiBTb2Z0IGRldmljZSBidXMgZXJyb3IgcmVjb3ZlcmVkIGJ5IHRoZSBJT0EifSwKKwl7MHgwMTE3MDYwMCwgMCwgMSwKKwkiRkZGOTogRGV2aWNlIHNlY3RvciByZWFzc2lnbiBzdWNjZXNzZnVsIn0sCisJezB4MDExNzA5MDAsIDAsIDEsCisJIkZGRjc6IE1lZGlhIGVycm9yIHJlY292ZXJlZCBieSBkZXZpY2UgcmV3cml0ZSBwcm9jZWR1cmVzIn0sCisJezB4MDExODAyMDAsIDAsIDEsCisJIjcwMDE6IElPQSBzZWN0b3IgcmVhc3NpZ25tZW50IHN1Y2Nlc3NmdWwifSwKKwl7MHgwMTE4MDUwMCwgMCwgMSwKKwkiRkZGOTogU29mdCBtZWRpYSBlcnJvci4gU2VjdG9yIHJlYXNzaWdubWVudCByZWNvbW1lbmRlZCJ9LAorCXsweDAxMTgwNjAwLCAwLCAxLAorCSJGRkY3OiBNZWRpYSBlcnJvciByZWNvdmVyZWQgYnkgSU9BIHJld3JpdGUgcHJvY2VkdXJlcyJ9LAorCXsweDAxNDE4MDAwLCAwLCAxLAorCSJGRjNEOiBTb2Z0IFBDSSBidXMgZXJyb3IgcmVjb3ZlcmVkIGJ5IHRoZSBJT0EifSwKKwl7MHgwMTQ0MDAwMCwgMSwgMSwKKwkiRkZGNjogRGV2aWNlIGhhcmR3YXJlIGVycm9yIHJlY292ZXJlZCBieSB0aGUgSU9BIn0sCisJezB4MDE0NDgxMDAsIDAsIDEsCisJIkZGRjY6IERldmljZSBoYXJkd2FyZSBlcnJvciByZWNvdmVyZWQgYnkgdGhlIGRldmljZSJ9LAorCXsweDAxNDQ4MjAwLCAxLCAxLAorCSJGRjNEOiBTb2Z0IElPQSBlcnJvciByZWNvdmVyZWQgYnkgdGhlIElPQSJ9LAorCXsweDAxNDQ4MzAwLCAwLCAxLAorCSJGRkZBOiBVbmRlZmluZWQgZGV2aWNlIHJlc3BvbnNlIHJlY292ZXJlZCBieSB0aGUgSU9BIn0sCisJezB4MDE0QTAwMDAsIDEsIDEsCisJIkZGRjY6IERldmljZSBidXMgZXJyb3IsIG1lc3NhZ2Ugb3IgY29tbWFuZCBwaGFzZSJ9LAorCXsweDAxNUQwMDAwLCAwLCAxLAorCSJGRkY2OiBGYWlsdXJlIHByZWRpY3Rpb24gdGhyZXNob2xkIGV4Y2VlZGVkIn0sCisJezB4MDE1RDkyMDAsIDAsIDEsCisJIjgwMDk6IEltcGVuZGluZyBjYWNoZSBiYXR0ZXJ5IHBhY2sgZmFpbHVyZSJ9LAorCXsweDAyMDQwNDAwLCAwLCAwLAorCSIzNEZGOiBEaXNrIGRldmljZSBmb3JtYXQgaW4gcHJvZ3Jlc3MifSwKKwl7MHgwMjNGMDAwMCwgMCwgMCwKKwkiU3luY2hyb25pemF0aW9uIHJlcXVpcmVkIn0sCisJezB4MDI0RTAwMDAsIDAsIDAsCisJIk5vIHJlYWR5LCBJT0Egc2h1dGRvd24ifSwKKwl7MHgwMjVBMDAwMCwgMCwgMCwKKwkiTm90IHJlYWR5LCBJT0EgaGFzIGJlZW4gc2h1dGRvd24ifSwKKwl7MHgwMjY3MDEwMCwgMCwgMSwKKwkiMzAyMDogU3RvcmFnZSBzdWJzeXN0ZW0gY29uZmlndXJhdGlvbiBlcnJvciJ9LAorCXsweDAzMTEwQjAwLCAwLCAwLAorCSJGRkY1OiBNZWRpdW0gZXJyb3IsIGRhdGEgdW5yZWFkYWJsZSwgcmVjb21tZW5kIHJlYXNzaWduIn0sCisJezB4MDMxMTBDMDAsIDAsIDAsCisJIjcwMDA6IE1lZGl1bSBlcnJvciwgZGF0YSB1bnJlYWRhYmxlLCBkbyBub3QgcmVhc3NpZ24ifSwKKwl7MHgwMzMxMDAwMCwgMCwgMSwKKwkiRkZGMzogRGlzayBtZWRpYSBmb3JtYXQgYmFkIn0sCisJezB4MDQwNTAwMDAsIDAsIDEsCisJIjMwMDI6IEFkZHJlc3NlZCBkZXZpY2UgZmFpbGVkIHRvIHJlc3BvbmQgdG8gc2VsZWN0aW9uIn0sCisJezB4MDQwODAwMDAsIDEsIDEsCisJIjMxMDA6IERldmljZSBidXMgZXJyb3IifSwKKwl7MHgwNDA4MDEwMCwgMCwgMSwKKwkiMzEwOTogSU9BIHRpbWVkIG91dCBhIGRldmljZSBjb21tYW5kIn0sCisJezB4MDQwODgwMDAsIDAsIDAsCisJIjMxMjA6IFNDU0kgYnVzIGlzIG5vdCBvcGVyYXRpb25hbCJ9LAorCXsweDA0MTE4MDAwLCAwLCAxLAorCSI5MDAwOiBJT0EgcmVzZXJ2ZWQgYXJlYSBkYXRhIGNoZWNrIn0sCisJezB4MDQxMTgxMDAsIDAsIDEsCisJIjkwMDE6IElPQSByZXNlcnZlZCBhcmVhIGludmFsaWQgZGF0YSBwYXR0ZXJuIn0sCisJezB4MDQxMTgyMDAsIDAsIDEsCisJIjkwMDI6IElPQSByZXNlcnZlZCBhcmVhIExSQyBlcnJvciJ9LAorCXsweDA0MzIwMDAwLCAwLCAxLAorCSIxMDJFOiBPdXQgb2YgYWx0ZXJuYXRlIHNlY3RvcnMgZm9yIGRpc2sgc3RvcmFnZSJ9LAorCXsweDA0MzMwMDAwLCAxLCAxLAorCSJGRkY0OiBEYXRhIHRyYW5zZmVyIHVuZGVybGVuZ3RoIGVycm9yIn0sCisJezB4MDQzMzgwMDAsIDEsIDEsCisJIkZGRjQ6IERhdGEgdHJhbnNmZXIgb3Zlcmxlbmd0aCBlcnJvciJ9LAorCXsweDA0M0UwMTAwLCAwLCAxLAorCSIzNDAwOiBMb2dpY2FsIHVuaXQgZmFpbHVyZSJ9LAorCXsweDA0NDA4NTAwLCAwLCAxLAorCSJGRkY0OiBEZXZpY2UgbWljcm9jb2RlIGlzIGNvcnJ1cHQifSwKKwl7MHgwNDQxODAwMCwgMSwgMSwKKwkiODE1MDogUENJIGJ1cyBlcnJvciJ9LAorCXsweDA0NDMwMDAwLCAxLCAwLAorCSJVbnN1cHBvcnRlZCBkZXZpY2UgYnVzIG1lc3NhZ2UgcmVjZWl2ZWQifSwKKwl7MHgwNDQ0MDAwMCwgMSwgMSwKKwkiRkZGNDogRGlzayBkZXZpY2UgcHJvYmxlbSJ9LAorCXsweDA0NDQ4MjAwLCAxLCAxLAorCSI4MTUwOiBQZXJtYW5lbnQgSU9BIGZhaWx1cmUifSwKKwl7MHgwNDQ0ODMwMCwgMCwgMSwKKwkiMzAxMDogRGlzayBkZXZpY2UgcmV0dXJuZWQgd3JvbmcgcmVzcG9uc2UgdG8gSU9BIn0sCisJezB4MDQ0NDg0MDAsIDAsIDEsCisJIjgxNTE6IElPQSBtaWNyb2NvZGUgZXJyb3IifSwKKwl7MHgwNDQ0ODUwMCwgMCwgMCwKKwkiRGV2aWNlIGJ1cyBzdGF0dXMgZXJyb3IifSwKKwl7MHgwNDQ0ODYwMCwgMCwgMSwKKwkiODE1NzogSU9BIGVycm9yIHJlcXVpcmluZyBJT0EgcmVzZXQgdG8gcmVjb3ZlciJ9LAorCXsweDA0NDkwMDAwLCAwLCAwLAorCSJNZXNzYWdlIHJlamVjdCByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UifSwKKwl7MHgwNDQ0OTIwMCwgMCwgMSwKKwkiODAwODogQSBwZXJtYW5lbnQgY2FjaGUgYmF0dGVyeSBwYWNrIGZhaWx1cmUgb2NjdXJyZWQifSwKKwl7MHgwNDQ0QTAwMCwgMCwgMSwKKwkiOTA5MDogRGlzayB1bml0IGhhcyBiZWVuIG1vZGlmaWVkIGFmdGVyIHRoZSBsYXN0IGtub3duIHN0YXR1cyJ9LAorCXsweDA0NDRBMjAwLCAwLCAxLAorCSI5MDgxOiBJT0EgZGV0ZWN0ZWQgZGV2aWNlIGVycm9yIn0sCisJezB4MDQ0NEEzMDAsIDAsIDEsCisJIjkwODI6IElPQSBkZXRlY3RlZCBkZXZpY2UgZXJyb3IifSwKKwl7MHgwNDRBMDAwMCwgMSwgMSwKKwkiMzExMDogRGV2aWNlIGJ1cyBlcnJvciwgbWVzc2FnZSBvciBjb21tYW5kIHBoYXNlIn0sCisJezB4MDQ2NzA0MDAsIDAsIDEsCisJIjkwOTE6IEluY29ycmVjdCBoYXJkd2FyZSBjb25maWd1cmF0aW9uIGNoYW5nZSBoYXMgYmVlbiBkZXRlY3RlZCJ9LAorCXsweDA0NkUwMDAwLCAwLCAxLAorCSJGRkY0OiBDb21tYW5kIHRvIGxvZ2ljYWwgdW5pdCBmYWlsZWQifSwKKwl7MHgwNTI0MDAwMCwgMSwgMCwKKwkiSWxsZWdhbCByZXF1ZXN0LCBpbnZhbGlkIHJlcXVlc3QgdHlwZSBvciByZXF1ZXN0IHBhY2tldCJ9LAorCXsweDA1MjUwMDAwLCAwLCAwLAorCSJJbGxlZ2FsIHJlcXVlc3QsIGludmFsaWQgcmVzb3VyY2UgaGFuZGxlIn0sCisJezB4MDUyNjAwMDAsIDAsIDAsCisJIklsbGVnYWwgcmVxdWVzdCwgaW52YWxpZCBmaWVsZCBpbiBwYXJhbWV0ZXIgbGlzdCJ9LAorCXsweDA1MjYwMTAwLCAwLCAwLAorCSJJbGxlZ2FsIHJlcXVlc3QsIHBhcmFtZXRlciBub3Qgc3VwcG9ydGVkIn0sCisJezB4MDUyNjAyMDAsIDAsIDAsCisJIklsbGVnYWwgcmVxdWVzdCwgcGFyYW1ldGVyIHZhbHVlIGludmFsaWQifSwKKwl7MHgwNTJDMDAwMCwgMCwgMCwKKwkiSWxsZWdhbCByZXF1ZXN0LCBjb21tYW5kIHNlcXVlbmNlIGVycm9yIn0sCisJezB4MDYwNDA1MDAsIDAsIDEsCisJIjkwMzE6IEFycmF5IHByb3RlY3Rpb24gdGVtcG9yYXJpbHkgc3VzcGVuZGVkLCBwcm90ZWN0aW9uIHJlc3VtaW5nIn0sCisJezB4MDYwNDA2MDAsIDAsIDEsCisJIjkwNDA6IEFycmF5IHByb3RlY3Rpb24gdGVtcG9yYXJpbHkgc3VzcGVuZGVkLCBwcm90ZWN0aW9uIHJlc3VtaW5nIn0sCisJezB4MDYyOTAwMDAsIDAsIDEsCisJIkZGRkI6IFNDU0kgYnVzIHdhcyByZXNldCJ9LAorCXsweDA2MjkwNTAwLCAwLCAwLAorCSJGRkZFOiBTQ1NJIGJ1cyB0cmFuc2l0aW9uIHRvIHNpbmdsZSBlbmRlZCJ9LAorCXsweDA2MjkwNjAwLCAwLCAwLAorCSJGRkZFOiBTQ1NJIGJ1cyB0cmFuc2l0aW9uIHRvIExWRCJ9LAorCXsweDA2Mjk4MDAwLCAwLCAxLAorCSJGRkZCOiBTQ1NJIGJ1cyB3YXMgcmVzZXQgYnkgYW5vdGhlciBpbml0aWF0b3IifSwKKwl7MHgwNjNGMDMwMCwgMCwgMSwKKwkiMzAyOTogQSBkZXZpY2UgcmVwbGFjZW1lbnQgaGFzIG9jY3VycmVkIn0sCisJezB4MDY0QzgwMDAsIDAsIDEsCisJIjkwNTE6IElPQSBjYWNoZSBkYXRhIGV4aXN0cyBmb3IgYSBtaXNzaW5nIG9yIGZhaWxlZCBkZXZpY2UifSwKKwl7MHgwNjY3MDEwMCwgMCwgMSwKKwkiOTAyNTogRGlzayB1bml0IGlzIG5vdCBzdXBwb3J0ZWQgYXQgaXRzIHBoeXNpY2FsIGxvY2F0aW9uIn0sCisJezB4MDY2NzA2MDAsIDAsIDEsCisJIjMwMjA6IElPQSBkZXRlY3RlZCBhIFNDU0kgYnVzIGNvbmZpZ3VyYXRpb24gZXJyb3IifSwKKwl7MHgwNjY3ODAwMCwgMCwgMSwKKwkiMzE1MDogU0NTSSBidXMgY29uZmlndXJhdGlvbiBlcnJvciJ9LAorCXsweDA2NjkwMjAwLCAwLCAxLAorCSI5MDQxOiBBcnJheSBwcm90ZWN0aW9uIHRlbXBvcmFyaWx5IHN1c3BlbmRlZCJ9LAorCXsweDA2Njk4MjAwLCAwLCAxLAorCSI5MDQyOiBDb3JydXB0IGFycmF5IHBhcml0eSBkZXRlY3RlZCBvbiBzcGVjaWZpZWQgZGV2aWNlIn0sCisJezB4MDY2QjAyMDAsIDAsIDEsCisJIjkwMzA6IEFycmF5IG5vIGxvbmdlciBwcm90ZWN0ZWQgZHVlIHRvIG1pc3Npbmcgb3IgZmFpbGVkIGRpc2sgdW5pdCJ9LAorCXsweDA2NkI4MjAwLCAwLCAxLAorCSI5MDMyOiBBcnJheSBleHBvc2VkIGJ1dCBzdGlsbCBwcm90ZWN0ZWQifSwKKwl7MHgwNzI3MDAwMCwgMCwgMCwKKwkiRmFpbHVyZSBkdWUgdG8gb3RoZXIgZGV2aWNlIn0sCisJezB4MDcyNzgwMDAsIDAsIDEsCisJIjkwMDg6IElPQSBkb2VzIG5vdCBzdXBwb3J0IGZ1bmN0aW9ucyBleHBlY3RlZCBieSBkZXZpY2VzIn0sCisJezB4MDcyNzgxMDAsIDAsIDEsCisJIjkwMTA6IENhY2hlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGF0dGFjaGVkIGRldmljZXMgY2Fubm90IGJlIGZvdW5kIn0sCisJezB4MDcyNzgyMDAsIDAsIDEsCisJIjkwMTE6IENhY2hlIGRhdGEgYmVsb25ncyB0byBkZXZpY2VzIG90aGVyIHRoYW4gdGhvc2UgYXR0YWNoZWQifSwKKwl7MHgwNzI3ODQwMCwgMCwgMSwKKwkiOTAyMDogQXJyYXkgbWlzc2luZyAyIG9yIG1vcmUgZGV2aWNlcyB3aXRoIG9ubHkgMSBkZXZpY2UgcHJlc2VudCJ9LAorCXsweDA3Mjc4NTAwLCAwLCAxLAorCSI5MDIxOiBBcnJheSBtaXNzaW5nIDIgb3IgbW9yZSBkZXZpY2VzIHdpdGggMiBvciBtb3JlIGRldmljZXMgcHJlc2VudCJ9LAorCXsweDA3Mjc4NjAwLCAwLCAxLAorCSI5MDIyOiBFeHBvc2VkIGFycmF5IGlzIG1pc3NpbmcgYSByZXF1aXJlZCBkZXZpY2UifSwKKwl7MHgwNzI3ODcwMCwgMCwgMSwKKwkiOTAyMzogQXJyYXkgbWVtYmVyKHMpIG5vdCBhdCByZXF1aXJlZCBwaHlzaWNhbCBsb2NhdGlvbnMifSwKKwl7MHgwNzI3ODgwMCwgMCwgMSwKKwkiOTAyNDogQXJyYXkgbm90IGZ1bmN0aW9uYWwgZHVlIHRvIHByZXNlbnQgaGFyZHdhcmUgY29uZmlndXJhdGlvbiJ9LAorCXsweDA3Mjc4OTAwLCAwLCAxLAorCSI5MDI2OiBBcnJheSBub3QgZnVuY3Rpb25hbCBkdWUgdG8gcHJlc2VudCBoYXJkd2FyZSBjb25maWd1cmF0aW9uIn0sCisJezB4MDcyNzhBMDAsIDAsIDEsCisJIjkwMjc6IEFycmF5IGlzIG1pc3NpbmcgYSBkZXZpY2UgYW5kIHBhcml0eSBpcyBvdXQgb2Ygc3luYyJ9LAorCXsweDA3Mjc4QjAwLCAwLCAxLAorCSI5MDI4OiBNYXhpbXVtIG51bWJlciBvZiBhcnJheXMgYWxyZWFkeSBleGlzdCJ9LAorCXsweDA3Mjc4QzAwLCAwLCAxLAorCSI5MDUwOiBSZXF1aXJlZCBjYWNoZSBkYXRhIGNhbm5vdCBiZSBsb2NhdGVkIGZvciBhIGRpc2sgdW5pdCJ9LAorCXsweDA3Mjc4RDAwLCAwLCAxLAorCSI5MDUyOiBDYWNoZSBkYXRhIGV4aXN0cyBmb3IgYSBkZXZpY2UgdGhhdCBoYXMgYmVlbiBtb2RpZmllZCJ9LAorCXsweDA3Mjc4RjAwLCAwLCAxLAorCSI5MDU0OiBJT0EgcmVzb3VyY2VzIG5vdCBhdmFpbGFibGUgZHVlIHRvIHByZXZpb3VzIHByb2JsZW1zIn0sCisJezB4MDcyNzkxMDAsIDAsIDEsCisJIjkwOTI6IERpc2sgdW5pdCByZXF1aXJlcyBpbml0aWFsaXphdGlvbiBiZWZvcmUgdXNlIn0sCisJezB4MDcyNzkyMDAsIDAsIDEsCisJIjkwMjk6IEluY29ycmVjdCBoYXJkd2FyZSBjb25maWd1cmF0aW9uIGNoYW5nZSBoYXMgYmVlbiBkZXRlY3RlZCJ9LAorCXsweDA3Mjc5NjAwLCAwLCAxLAorCSI5MDYwOiBPbmUgb3IgbW9yZSBkaXNrIHBhaXJzIGFyZSBtaXNzaW5nIGZyb20gYW4gYXJyYXkifSwKKwl7MHgwNzI3OTcwMCwgMCwgMSwKKwkiOTA2MTogT25lIG9yIG1vcmUgZGlza3MgYXJlIG1pc3NpbmcgZnJvbSBhbiBhcnJheSJ9LAorCXsweDA3Mjc5ODAwLCAwLCAxLAorCSI5MDYyOiBPbmUgb3IgbW9yZSBkaXNrcyBhcmUgbWlzc2luZyBmcm9tIGFuIGFycmF5In0sCisJezB4MDcyNzk5MDAsIDAsIDEsCisJIjkwNjM6IE1heGltdW0gbnVtYmVyIG9mIGZ1bmN0aW9uYWwgYXJyYXlzIGhhcyBiZWVuIGV4Y2VlZGVkIn0sCisJezB4MEIyNjAwMDAsIDAsIDAsCisJIkFib3J0ZWQgY29tbWFuZCwgaW52YWxpZCBkZXNjcmlwdG9yIn0sCisJezB4MEI1QTAwMDAsIDAsIDAsCisJIkNvbW1hbmQgdGVybWluYXRlZCBieSBob3N0In0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXByX3Nlc190YWJsZV9lbnRyeSBpcHJfc2VzX3RhYmxlW10gPSB7CisJeyAiMjEwNC1ETDEgICAgICAgICIsICJYWFhYWFhYWFhYWFhYWFhYIiwgODAgfSwKKwl7ICIyMTA0LVRMMSAgICAgICAgIiwgIlhYWFhYWFhYWFhYWFhYWFgiLCA4MCB9LAorCXsgIkhTQlAwN00gUCBVMlNDU0kiLCAiWFhYWFhYWFhYWFhYWFhYWCIsIDgwIH0sIC8qIEhpZGl2ZSA3IHNsb3QgKi8KKwl7ICJIU0JQMDVNIFAgVTJTQ1NJIiwgIlhYWFhYWFhYWFhYWFhYWFgiLCA4MCB9LCAvKiBIaWRpdmUgNSBzbG90ICovCisJeyAiSFNCUDA1TSBTIFUyU0NTSSIsICJYWFhYWFhYWFhYWFhYWFhYIiwgODAgfSwgLyogQm93dGllICovCisJeyAiSFNCUDA2RSBBU1UyU0NTSSIsICJYWFhYWFhYWFhYWFhYWFhYIiwgODAgfSwgLyogTWFydGluRmVubmluZyAqLworCXsgIjIxMDQtRFUzICAgICAgICAiLCAiWFhYWFhYWFhYWFhYWFhYWCIsIDE2MCB9LAorCXsgIjIxMDQtVFUzICAgICAgICAiLCAiWFhYWFhYWFhYWFhYWFhYWCIsIDE2MCB9LAorCXsgIkhTQlAwNEMgUlNVMlNDU0kiLCAiWFhYWFhYWCpYWFhYWFhYWCIsIDE2MCB9LAorCXsgIkhTQlAwNkUgUlNVMlNDU0kiLCAiWFhYWFhYWCpYWFhYWFhYWCIsIDE2MCB9LAorCXsgIlN0ICBWMVMyICAgICAgICAiLCAiWFhYWFhYWFhYWFhYWFhYWCIsIDE2MCB9LAorCXsgIkhTQlBENE0gIFBVM1NDU0kiLCAiWFhYWFhYWCpYWFhYWFhYWCIsIDE2MCB9LAorCXsgIlZTQlBEMUggICBVM1NDU0kiLCAiWFhYWFhYWCpYWFhYWFhYWCIsIDE2MCB9Cit9OworCisvKgorICogIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyAqLworc3RhdGljIGludCBpcHJfcmVzZXRfYWxlcnQoc3RydWN0IGlwcl9jbW5kICopOworc3RhdGljIHZvaWQgaXByX3Byb2Nlc3NfY2NuKHN0cnVjdCBpcHJfY21uZCAqKTsKK3N0YXRpYyB2b2lkIGlwcl9wcm9jZXNzX2Vycm9yKHN0cnVjdCBpcHJfY21uZCAqKTsKK3N0YXRpYyB2b2lkIGlwcl9yZXNldF9pb2Ffam9iKHN0cnVjdCBpcHJfY21uZCAqKTsKK3N0YXRpYyB2b2lkIGlwcl9pbml0aWF0ZV9pb2FfcmVzZXQoc3RydWN0IGlwcl9pb2FfY2ZnICosCisJCQkJICAgZW51bSBpcHJfc2h1dGRvd25fdHlwZSk7CisKKyNpZmRlZiBDT05GSUdfU0NTSV9JUFJfVFJBQ0UKKy8qKgorICogaXByX3RyY19ob29rIC0gQWRkIGEgdHJhY2UgZW50cnkgdG8gdGhlIGRyaXZlciB0cmFjZQorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICogQHR5cGU6CQl0cmFjZSB0eXBlCisgKiBAYWRkX2RhdGE6CWFkZGl0aW9uYWwgZGF0YQorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfdHJjX2hvb2soc3RydWN0IGlwcl9jbW5kICppcHJfY21kLAorCQkJIHU4IHR5cGUsIHUzMiBhZGRfZGF0YSkKK3sKKwlzdHJ1Y3QgaXByX3RyYWNlX2VudHJ5ICp0cmFjZV9lbnRyeTsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCisJdHJhY2VfZW50cnkgPSAmaW9hX2NmZy0+dHJhY2VbaW9hX2NmZy0+dHJhY2VfaW5kZXgrK107CisJdHJhY2VfZW50cnktPnRpbWUgPSBqaWZmaWVzOworCXRyYWNlX2VudHJ5LT5vcF9jb2RlID0gaXByX2NtZC0+aW9hcmNiLmNtZF9wa3QuY2RiWzBdOworCXRyYWNlX2VudHJ5LT50eXBlID0gdHlwZTsKKwl0cmFjZV9lbnRyeS0+Y21kX2luZGV4ID0gaXByX2NtZC0+Y21kX2luZGV4OworCXRyYWNlX2VudHJ5LT5yZXNfaGFuZGxlID0gaXByX2NtZC0+aW9hcmNiLnJlc19oYW5kbGU7CisJdHJhY2VfZW50cnktPnUuYWRkX2RhdGEgPSBhZGRfZGF0YTsKK30KKyNlbHNlCisjZGVmaW5lIGlwcl90cmNfaG9vayhpcHJfY21kLCB0eXBlLCBhZGRfZGF0YSkgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworLyoqCisgKiBpcHJfcmVpbml0X2lwcl9jbW5kIC0gUmUtaW5pdGlhbGl6ZSBhbiBJUFIgQ21uZCBibG9jayBmb3IgcmV1c2UKKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX3JlaW5pdF9pcHJfY21uZChzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FyY2IgKmlvYXJjYiA9ICZpcHJfY21kLT5pb2FyY2I7CisJc3RydWN0IGlwcl9pb2FzYSAqaW9hc2EgPSAmaXByX2NtZC0+aW9hc2E7CisKKwltZW1zZXQoJmlvYXJjYi0+Y21kX3BrdCwgMCwgc2l6ZW9mKHN0cnVjdCBpcHJfY21kX3BrdCkpOworCWlvYXJjYi0+d3JpdGVfZGF0YV90cmFuc2Zlcl9sZW5ndGggPSAwOworCWlvYXJjYi0+cmVhZF9kYXRhX3RyYW5zZmVyX2xlbmd0aCA9IDA7CisJaW9hcmNiLT53cml0ZV9pb2FkbF9sZW4gPSAwOworCWlvYXJjYi0+cmVhZF9pb2FkbF9sZW4gPSAwOworCWlvYXNhLT5pb2FzYyA9IDA7CisJaW9hc2EtPnJlc2lkdWFsX2RhdGFfbGVuID0gMDsKKworCWlwcl9jbWQtPnNjc2lfY21kID0gTlVMTDsKKwlpcHJfY21kLT5zZW5zZV9idWZmZXJbMF0gPSAwOworCWlwcl9jbWQtPmRtYV91c2Vfc2cgPSAwOworfQorCisvKioKKyAqIGlwcl9pbml0X2lwcl9jbW5kIC0gSW5pdGlhbGl6ZSBhbiBJUFIgQ21uZCBibG9jaworICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfaW5pdF9pcHJfY21uZChzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJaXByX3JlaW5pdF9pcHJfY21uZChpcHJfY21kKTsKKwlpcHJfY21kLT51LnNjcmF0Y2ggPSAwOworCWlwcl9jbWQtPnNpYmxpbmcgPSBOVUxMOworCWluaXRfdGltZXIoJmlwcl9jbWQtPnRpbWVyKTsKK30KKworLyoqCisgKiBpcHJfZ2V0X2ZyZWVfaXByX2NtbmQgLSBHZXQgYSBmcmVlIElQUiBDbW5kIGJsb2NrCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJcG9pbnRlciB0byBpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqKi8KK3N0YXRpYworc3RydWN0IGlwcl9jbW5kICppcHJfZ2V0X2ZyZWVfaXByX2NtbmQoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKQoreworCXN0cnVjdCBpcHJfY21uZCAqaXByX2NtZDsKKworCWlwcl9jbWQgPSBsaXN0X2VudHJ5KGlvYV9jZmctPmZyZWVfcS5uZXh0LCBzdHJ1Y3QgaXByX2NtbmQsIHF1ZXVlKTsKKwlsaXN0X2RlbCgmaXByX2NtZC0+cXVldWUpOworCWlwcl9pbml0X2lwcl9jbW5kKGlwcl9jbWQpOworCisJcmV0dXJuIGlwcl9jbWQ7Cit9CisKKy8qKgorICogaXByX3VubWFwX3NnbGlzdCAtIFVubWFwIHNjYXR0ZXJsaXN0IGlmIG1hcHBlZAorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vdGhpbmcKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl91bm1hcF9zZ2xpc3Qoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJICAgICBzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IHNjc2lfY21uZCAqc2NzaV9jbWQgPSBpcHJfY21kLT5zY3NpX2NtZDsKKworCWlmIChpcHJfY21kLT5kbWFfdXNlX3NnKSB7CisJCWlmIChzY3NpX2NtZC0+dXNlX3NnID4gMCkgeworCQkJcGNpX3VubWFwX3NnKGlvYV9jZmctPnBkZXYsIHNjc2lfY21kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQkgICAgIHNjc2lfY21kLT51c2Vfc2csCisJCQkJICAgICBzY3NpX2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQl9IGVsc2UgeworCQkJcGNpX3VubWFwX3NpbmdsZShpb2FfY2ZnLT5wZGV2LCBpcHJfY21kLT5kbWFfaGFuZGxlLAorCQkJCQkgc2NzaV9jbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkJIHNjc2lfY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCX0KKwl9Cit9CisKKy8qKgorICogaXByX21hc2tfYW5kX2NsZWFyX2ludGVycnVwdHMgLSBNYXNrIGFsbCBhbmQgY2xlYXIgc3BlY2lmaWVkIGludGVycnVwdHMKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQGNscl9pbnRzOiAgICAgaW50ZXJydXB0cyB0byBjbGVhcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWFza3MgYWxsIGludGVycnVwdHMgb24gdGhlIGFkYXB0ZXIsIHRoZW4gY2xlYXJzIHRoZQorICogaW50ZXJydXB0cyBzcGVjaWZpZWQgaW4gdGhlIG1hc2sKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX21hc2tfYW5kX2NsZWFyX2ludGVycnVwdHMoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJCQkgIHUzMiBjbHJfaW50cykKK3sKKwl2b2xhdGlsZSB1MzIgaW50X3JlZzsKKworCS8qIFN0b3AgbmV3IGludGVycnVwdHMgKi8KKwlpb2FfY2ZnLT5hbGxvd19pbnRlcnJ1cHRzID0gMDsKKworCS8qIFNldCBpbnRlcnJ1cHQgbWFzayB0byBzdG9wIGFsbCBuZXcgaW50ZXJydXB0cyAqLworCXdyaXRlbCh+MCwgaW9hX2NmZy0+cmVncy5zZXRfaW50ZXJydXB0X21hc2tfcmVnKTsKKworCS8qIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMgKi8KKwl3cml0ZWwoY2xyX2ludHMsIGlvYV9jZmctPnJlZ3MuY2xyX2ludGVycnVwdF9yZWcpOworCWludF9yZWcgPSByZWFkbChpb2FfY2ZnLT5yZWdzLnNlbnNlX2ludGVycnVwdF9yZWcpOworfQorCisvKioKKyAqIGlwcl9zYXZlX3BjaXhfY21kX3JlZyAtIFNhdmUgUENJLVggY29tbWFuZCByZWdpc3RlcgorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTAgb24gc3VjY2VzcyAvIC1FSU8gb24gZmFpbHVyZQorICoqLworc3RhdGljIGludCBpcHJfc2F2ZV9wY2l4X2NtZF9yZWcoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKQoreworCWludCBwY2l4X2NtZF9yZWcgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGlvYV9jZmctPnBkZXYsIFBDSV9DQVBfSURfUENJWCk7CisKKwlpZiAocGNpeF9jbWRfcmVnID09IDApIHsKKwkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LCAiRmFpbGVkIHRvIHNhdmUgUENJLVggY29tbWFuZCByZWdpc3RlclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChwY2lfcmVhZF9jb25maWdfd29yZChpb2FfY2ZnLT5wZGV2LCBwY2l4X2NtZF9yZWcgKyBQQ0lfWF9DTUQsCisJCQkJICZpb2FfY2ZnLT5zYXZlZF9wY2l4X2NtZF9yZWcpICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgeworCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJGYWlsZWQgdG8gc2F2ZSBQQ0ktWCBjb21tYW5kIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaW9hX2NmZy0+c2F2ZWRfcGNpeF9jbWRfcmVnIHw9IFBDSV9YX0NNRF9EUEVSUl9FIHwgUENJX1hfQ01EX0VSTzsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpcHJfc2V0X3BjaXhfY21kX3JlZyAtIFNldHVwIFBDSS1YIGNvbW1hbmQgcmVnaXN0ZXIKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkwIG9uIHN1Y2Nlc3MgLyAtRUlPIG9uIGZhaWx1cmUKKyAqKi8KK3N0YXRpYyBpbnQgaXByX3NldF9wY2l4X2NtZF9yZWcoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKQoreworCWludCBwY2l4X2NtZF9yZWcgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGlvYV9jZmctPnBkZXYsIFBDSV9DQVBfSURfUENJWCk7CisKKwlpZiAocGNpeF9jbWRfcmVnKSB7CisJCWlmIChwY2lfd3JpdGVfY29uZmlnX3dvcmQoaW9hX2NmZy0+cGRldiwgcGNpeF9jbWRfcmVnICsgUENJX1hfQ01ELAorCQkJCQkgIGlvYV9jZmctPnNhdmVkX3BjaXhfY21kX3JlZykgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJGYWlsZWQgdG8gc2V0dXAgUENJLVggY29tbWFuZCByZWdpc3RlclxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwKKwkJCSJGYWlsZWQgdG8gc2V0dXAgUENJLVggY29tbWFuZCByZWdpc3RlclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlwcl9zY3NpX2VoX2RvbmUgLSBtaWQtbGF5ZXIgZG9uZSBmdW5jdGlvbiBmb3IgYWJvcnRlZCBvcHMKKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyIGZvcgorICogb3BzIGdlbmVyYXRlZCBieSB0aGUgU0NTSSBtaWQtbGF5ZXIgd2hpY2ggYXJlIGJlaW5nIGFib3J0ZWQuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9zY3NpX2VoX2RvbmUoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJc3RydWN0IHNjc2lfY21uZCAqc2NzaV9jbWQgPSBpcHJfY21kLT5zY3NpX2NtZDsKKworCXNjc2lfY21kLT5yZXN1bHQgfD0gKERJRF9FUlJPUiA8PCAxNik7CisKKwlpcHJfdW5tYXBfc2dsaXN0KGlvYV9jZmcsIGlwcl9jbWQpOworCXNjc2lfY21kLT5zY3NpX2RvbmUoc2NzaV9jbWQpOworCWxpc3RfYWRkX3RhaWwoJmlwcl9jbWQtPnF1ZXVlLCAmaW9hX2NmZy0+ZnJlZV9xKTsKK30KKworLyoqCisgKiBpcHJfZmFpbF9hbGxfb3BzIC0gRmFpbHMgYWxsIG91dHN0YW5kaW5nIG9wcy4KKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gZmFpbHMgYWxsIG91dHN0YW5kaW5nIG9wcy4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2ZhaWxfYWxsX29wcyhzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCit7CisJc3RydWN0IGlwcl9jbW5kICppcHJfY21kLCAqdGVtcDsKKworCUVOVEVSOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpcHJfY21kLCB0ZW1wLCAmaW9hX2NmZy0+cGVuZGluZ19xLCBxdWV1ZSkgeworCQlsaXN0X2RlbCgmaXByX2NtZC0+cXVldWUpOworCisJCWlwcl9jbWQtPmlvYXNhLmlvYXNjID0gY3B1X3RvX2JlMzIoSVBSX0lPQVNDX0lPQV9XQVNfUkVTRVQpOworCQlpcHJfY21kLT5pb2FzYS5pbGlkID0gY3B1X3RvX2JlMzIoSVBSX0RSSVZFUl9JTElEKTsKKworCQlpZiAoaXByX2NtZC0+c2NzaV9jbWQpCisJCQlpcHJfY21kLT5kb25lID0gaXByX3Njc2lfZWhfZG9uZTsKKworCQlpcHJfdHJjX2hvb2soaXByX2NtZCwgSVBSX1RSQUNFX0ZJTklTSCwgSVBSX0lPQVNDX0lPQV9XQVNfUkVTRVQpOworCQlkZWxfdGltZXIoJmlwcl9jbWQtPnRpbWVyKTsKKwkJaXByX2NtZC0+ZG9uZShpcHJfY21kKTsKKwl9CisKKwlMRUFWRTsKK30KKworLyoqCisgKiBpcHJfZG9fcmVxIC0gIFNlbmQgZHJpdmVyIGluaXRpYXRlZCByZXF1ZXN0cy4KKyAqIEBpcHJfY21kOgkJaXByIGNvbW1hbmQgc3RydWN0CisgKiBAZG9uZToJCQlkb25lIGZ1bmN0aW9uCisgKiBAdGltZW91dF9mdW5jOgl0aW1lb3V0IGZ1bmN0aW9uCisgKiBAdGltZW91dDoJCXRpbWVvdXQgdmFsdWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBzcGVjaWZpZWQgY29tbWFuZCB0byB0aGUgYWRhcHRlciB3aXRoIHRoZQorICogdGltZW91dCBnaXZlbi4gVGhlIGRvbmUgZnVuY3Rpb24gaXMgaW52b2tlZCBvbiBjb21tYW5kIGNvbXBsZXRpb24uCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9kb19yZXEoc3RydWN0IGlwcl9jbW5kICppcHJfY21kLAorCQkgICAgICAgdm9pZCAoKmRvbmUpIChzdHJ1Y3QgaXByX2NtbmQgKiksCisJCSAgICAgICB2b2lkICgqdGltZW91dF9mdW5jKSAoc3RydWN0IGlwcl9jbW5kICopLCB1MzIgdGltZW91dCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCisJbGlzdF9hZGRfdGFpbCgmaXByX2NtZC0+cXVldWUsICZpb2FfY2ZnLT5wZW5kaW5nX3EpOworCisJaXByX2NtZC0+ZG9uZSA9IGRvbmU7CisKKwlpcHJfY21kLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGlwcl9jbWQ7CisJaXByX2NtZC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0OworCWlwcl9jbWQtPnRpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKXRpbWVvdXRfZnVuYzsKKworCWFkZF90aW1lcigmaXByX2NtZC0+dGltZXIpOworCisJaXByX3RyY19ob29rKGlwcl9jbWQsIElQUl9UUkFDRV9TVEFSVCwgMCk7CisKKwltYigpOworCXdyaXRlbChiZTMyX3RvX2NwdShpcHJfY21kLT5pb2FyY2IuaW9hcmNiX2hvc3RfcGNpX2FkZHIpLAorCSAgICAgICBpb2FfY2ZnLT5yZWdzLmlvYXJyaW5fcmVnKTsKK30KKworLyoqCisgKiBpcHJfaW50ZXJuYWxfY21kX2RvbmUgLSBPcCBkb25lIGZ1bmN0aW9uIGZvciBhbiBpbnRlcm5hbGx5IGdlbmVyYXRlZCBvcC4KKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBvcCBkb25lIGZ1bmN0aW9uIGZvciBhbiBpbnRlcm5hbGx5IGdlbmVyYXRlZCwKKyAqIGJsb2NraW5nIG9wLiBJdCBzaW1wbHkgd2FrZXMgdGhlIHNsZWVwaW5nIHRocmVhZC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2ludGVybmFsX2NtZF9kb25lKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlpZiAoaXByX2NtZC0+c2libGluZykKKwkJaXByX2NtZC0+c2libGluZyA9IE5VTEw7CisJZWxzZQorCQljb21wbGV0ZSgmaXByX2NtZC0+Y29tcGxldGlvbik7Cit9CisKKy8qKgorICogaXByX3NlbmRfYmxvY2tpbmdfY21kIC0gU2VuZCBjb21tYW5kIGFuZCBzbGVlcCBvbiBpdHMgY29tcGxldGlvbi4KKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqIEB0aW1lb3V0X2Z1bmM6CWZ1bmN0aW9uIHRvIGludm9rZSBpZiBjb21tYW5kIHRpbWVzIG91dAorICogQHRpbWVvdXQ6CXRpbWVvdXQKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX3NlbmRfYmxvY2tpbmdfY21kKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCwKKwkJCQkgIHZvaWQgKCp0aW1lb3V0X2Z1bmMpIChzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpLAorCQkJCSAgdTMyIHRpbWVvdXQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKworCWluaXRfY29tcGxldGlvbigmaXByX2NtZC0+Y29tcGxldGlvbik7CisJaXByX2RvX3JlcShpcHJfY21kLCBpcHJfaW50ZXJuYWxfY21kX2RvbmUsIHRpbWVvdXRfZnVuYywgdGltZW91dCk7CisKKwlzcGluX3VubG9ja19pcnEoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZpcHJfY21kLT5jb21wbGV0aW9uKTsKKwlzcGluX2xvY2tfaXJxKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jayk7Cit9CisKKy8qKgorICogaXByX3NlbmRfaGNhbSAtIFNlbmQgYW4gSENBTSB0byB0aGUgYWRhcHRlci4KKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQHR5cGU6CQlIQ0FNIHR5cGUKKyAqIEBob3N0cmNiOglob3N0cmNiIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzZW5kIGEgSG9zdCBDb250cm9sbGVkIEFzeW5jIGNvbW1hbmQgdG8gdGhlIGFkYXB0ZXIuCisgKiBJZiBIQ0FNcyBhcmUgY3VycmVudGx5IG5vdCBhbGxvd2VkIHRvIGJlIGlzc3VlZCB0byB0aGUgYWRhcHRlciwgaXQgd2lsbAorICogcGxhY2UgdGhlIGhvc3RyY2Igb24gdGhlIGZyZWUgcXVldWUuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9zZW5kX2hjYW0oc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLCB1OCB0eXBlLAorCQkJICBzdHJ1Y3QgaXByX2hvc3RyY2IgKmhvc3RyY2IpCit7CisJc3RydWN0IGlwcl9jbW5kICppcHJfY21kOworCXN0cnVjdCBpcHJfaW9hcmNiICppb2FyY2I7CisKKwlpZiAoaW9hX2NmZy0+YWxsb3dfY21kcykgeworCQlpcHJfY21kID0gaXByX2dldF9mcmVlX2lwcl9jbW5kKGlvYV9jZmcpOworCQlsaXN0X2FkZF90YWlsKCZpcHJfY21kLT5xdWV1ZSwgJmlvYV9jZmctPnBlbmRpbmdfcSk7CisJCWxpc3RfYWRkX3RhaWwoJmhvc3RyY2ItPnF1ZXVlLCAmaW9hX2NmZy0+aG9zdHJjYl9wZW5kaW5nX3EpOworCisJCWlwcl9jbWQtPnUuaG9zdHJjYiA9IGhvc3RyY2I7CisJCWlvYXJjYiA9ICZpcHJfY21kLT5pb2FyY2I7CisKKwkJaW9hcmNiLT5yZXNfaGFuZGxlID0gY3B1X3RvX2JlMzIoSVBSX0lPQV9SRVNfSEFORExFKTsKKwkJaW9hcmNiLT5jbWRfcGt0LnJlcXVlc3RfdHlwZSA9IElQUl9SUVRZUEVfSENBTTsKKwkJaW9hcmNiLT5jbWRfcGt0LmNkYlswXSA9IElQUl9IT1NUX0NPTlRST0xMRURfQVNZTkM7CisJCWlvYXJjYi0+Y21kX3BrdC5jZGJbMV0gPSB0eXBlOworCQlpb2FyY2ItPmNtZF9wa3QuY2RiWzddID0gKHNpemVvZihob3N0cmNiLT5oY2FtKSA+PiA4KSAmIDB4ZmY7CisJCWlvYXJjYi0+Y21kX3BrdC5jZGJbOF0gPSBzaXplb2YoaG9zdHJjYi0+aGNhbSkgJiAweGZmOworCisJCWlvYXJjYi0+cmVhZF9kYXRhX3RyYW5zZmVyX2xlbmd0aCA9IGNwdV90b19iZTMyKHNpemVvZihob3N0cmNiLT5oY2FtKSk7CisJCWlvYXJjYi0+cmVhZF9pb2FkbF9sZW4gPSBjcHVfdG9fYmUzMihzaXplb2Yoc3RydWN0IGlwcl9pb2FkbF9kZXNjKSk7CisJCWlwcl9jbWQtPmlvYWRsWzBdLmZsYWdzX2FuZF9kYXRhX2xlbiA9CisJCQljcHVfdG9fYmUzMihJUFJfSU9BRExfRkxBR1NfUkVBRF9MQVNUIHwgc2l6ZW9mKGhvc3RyY2ItPmhjYW0pKTsKKwkJaXByX2NtZC0+aW9hZGxbMF0uYWRkcmVzcyA9IGNwdV90b19iZTMyKGhvc3RyY2ItPmhvc3RyY2JfZG1hKTsKKworCQlpZiAodHlwZSA9PSBJUFJfSENBTV9DREJfT1BfQ09ERV9DT05GSUdfQ0hBTkdFKQorCQkJaXByX2NtZC0+ZG9uZSA9IGlwcl9wcm9jZXNzX2NjbjsKKwkJZWxzZQorCQkJaXByX2NtZC0+ZG9uZSA9IGlwcl9wcm9jZXNzX2Vycm9yOworCisJCWlwcl90cmNfaG9vayhpcHJfY21kLCBJUFJfVFJBQ0VfU1RBUlQsIElQUl9JT0FfUkVTX0FERFIpOworCisJCW1iKCk7CisJCXdyaXRlbChiZTMyX3RvX2NwdShpcHJfY21kLT5pb2FyY2IuaW9hcmNiX2hvc3RfcGNpX2FkZHIpLAorCQkgICAgICAgaW9hX2NmZy0+cmVncy5pb2FycmluX3JlZyk7CisJfSBlbHNlIHsKKwkJbGlzdF9hZGRfdGFpbCgmaG9zdHJjYi0+cXVldWUsICZpb2FfY2ZnLT5ob3N0cmNiX2ZyZWVfcSk7CisJfQorfQorCisvKioKKyAqIGlwcl9pbml0X3Jlc19lbnRyeSAtIEluaXRpYWxpemUgYSByZXNvdXJjZSBlbnRyeSBzdHJ1Y3QuCisgKiBAcmVzOglyZXNvdXJjZSBlbnRyeSBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2luaXRfcmVzX2VudHJ5KHN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKnJlcykKK3sKKwlyZXMtPm5lZWRzX3N5bmNfY29tcGxldGUgPSAxOworCXJlcy0+aW5fZXJwID0gMDsKKwlyZXMtPmFkZF90b19tbCA9IDA7CisJcmVzLT5kZWxfZnJvbV9tbCA9IDA7CisJcmVzLT5yZXNldHRpbmdfZGV2aWNlID0gMDsKKwlyZXMtPnNkZXYgPSBOVUxMOworfQorCisvKioKKyAqIGlwcl9oYW5kbGVfY29uZmlnX2NoYW5nZSAtIEhhbmRsZSBhIGNvbmZpZyBjaGFuZ2UgZnJvbSB0aGUgYWRhcHRlcgorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKiBAaG9zdHJjYjoJaG9zdHJjYgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfaGFuZGxlX2NvbmZpZ19jaGFuZ2Uoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJICAgICAgc3RydWN0IGlwcl9ob3N0cmNiICpob3N0cmNiKQoreworCXN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKnJlcyA9IE5VTEw7CisJc3RydWN0IGlwcl9jb25maWdfdGFibGVfZW50cnkgKmNmZ3RlOworCXUzMiBpc19uZG4gPSAxOworCisJY2ZndGUgPSAmaG9zdHJjYi0+aGNhbS51LmNjbi5jZmd0ZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVzLCAmaW9hX2NmZy0+dXNlZF9yZXNfcSwgcXVldWUpIHsKKwkJaWYgKCFtZW1jbXAoJnJlcy0+Y2ZndGUucmVzX2FkZHIsICZjZmd0ZS0+cmVzX2FkZHIsCisJCQkgICAgc2l6ZW9mKGNmZ3RlLT5yZXNfYWRkcikpKSB7CisJCQlpc19uZG4gPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaXNfbmRuKSB7CisJCWlmIChsaXN0X2VtcHR5KCZpb2FfY2ZnLT5mcmVlX3Jlc19xKSkgeworCQkJaXByX3NlbmRfaGNhbShpb2FfY2ZnLAorCQkJCSAgICAgIElQUl9IQ0FNX0NEQl9PUF9DT0RFX0NPTkZJR19DSEFOR0UsCisJCQkJICAgICAgaG9zdHJjYik7CisJCQlyZXR1cm47CisJCX0KKworCQlyZXMgPSBsaXN0X2VudHJ5KGlvYV9jZmctPmZyZWVfcmVzX3EubmV4dCwKKwkJCQkgc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSwgcXVldWUpOworCisJCWxpc3RfZGVsKCZyZXMtPnF1ZXVlKTsKKwkJaXByX2luaXRfcmVzX2VudHJ5KHJlcyk7CisJCWxpc3RfYWRkX3RhaWwoJnJlcy0+cXVldWUsICZpb2FfY2ZnLT51c2VkX3Jlc19xKTsKKwl9CisKKwltZW1jcHkoJnJlcy0+Y2ZndGUsIGNmZ3RlLCBzaXplb2Yoc3RydWN0IGlwcl9jb25maWdfdGFibGVfZW50cnkpKTsKKworCWlmIChob3N0cmNiLT5oY2FtLm5vdGlmeV90eXBlID09IElQUl9IT1NUX1JDQl9OT1RJRl9UWVBFX1JFTV9FTlRSWSkgeworCQlpZiAocmVzLT5zZGV2KSB7CisJCQlyZXMtPnNkZXYtPmhvc3RkYXRhID0gTlVMTDsKKwkJCXJlcy0+ZGVsX2Zyb21fbWwgPSAxOworCQkJaWYgKGlvYV9jZmctPmFsbG93X21sX2FkZF9kZWwpCisJCQkJc2NoZWR1bGVfd29yaygmaW9hX2NmZy0+d29ya19xKTsKKwkJfSBlbHNlCisJCQlsaXN0X21vdmVfdGFpbCgmcmVzLT5xdWV1ZSwgJmlvYV9jZmctPmZyZWVfcmVzX3EpOworCX0gZWxzZSBpZiAoIXJlcy0+c2RldikgeworCQlyZXMtPmFkZF90b19tbCA9IDE7CisJCWlmIChpb2FfY2ZnLT5hbGxvd19tbF9hZGRfZGVsKQorCQkJc2NoZWR1bGVfd29yaygmaW9hX2NmZy0+d29ya19xKTsKKwl9CisKKwlpcHJfc2VuZF9oY2FtKGlvYV9jZmcsIElQUl9IQ0FNX0NEQl9PUF9DT0RFX0NPTkZJR19DSEFOR0UsIGhvc3RyY2IpOworfQorCisvKioKKyAqIGlwcl9wcm9jZXNzX2NjbiAtIE9wIGRvbmUgZnVuY3Rpb24gZm9yIGEgQ0NOLgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG9wIGRvbmUgZnVuY3Rpb24gZm9yIGEgY29uZmlndXJhdGlvbgorICogY2hhbmdlIG5vdGlmaWNhdGlvbiBob3N0IGNvbnRyb2xsZWQgYXN5bmMgZnJvbSB0aGUgYWRhcHRlci4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX3Byb2Nlc3NfY2NuKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCXN0cnVjdCBpcHJfaG9zdHJjYiAqaG9zdHJjYiA9IGlwcl9jbWQtPnUuaG9zdHJjYjsKKwl1MzIgaW9hc2MgPSBiZTMyX3RvX2NwdShpcHJfY21kLT5pb2FzYS5pb2FzYyk7CisKKwlsaXN0X2RlbCgmaG9zdHJjYi0+cXVldWUpOworCWxpc3RfYWRkX3RhaWwoJmlwcl9jbWQtPnF1ZXVlLCAmaW9hX2NmZy0+ZnJlZV9xKTsKKworCWlmIChpb2FzYykgeworCQlpZiAoaW9hc2MgIT0gSVBSX0lPQVNDX0lPQV9XQVNfUkVTRVQpCisJCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsCisJCQkJIkhvc3QgUkNCIGZhaWxlZCB3aXRoIElPQVNDOiAweCUwOFhcbiIsIGlvYXNjKTsKKworCQlpcHJfc2VuZF9oY2FtKGlvYV9jZmcsIElQUl9IQ0FNX0NEQl9PUF9DT0RFX0NPTkZJR19DSEFOR0UsIGhvc3RyY2IpOworCX0gZWxzZSB7CisJCWlwcl9oYW5kbGVfY29uZmlnX2NoYW5nZShpb2FfY2ZnLCBob3N0cmNiKTsKKwl9Cit9CisKKy8qKgorICogaXByX2xvZ192cGQgLSBMb2cgdGhlIHBhc3NlZCBWUEQgdG8gdGhlIGVycm9yIGxvZy4KKyAqIEB2cGlkczoJCQl2ZW5kb3IvcHJvZHVjdCBpZCBzdHJ1Y3QKKyAqIEBzZXJpYWxfbnVtOgkJc2VyaWFsIG51bWJlciBzdHJpbmcKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2xvZ192cGQoc3RydWN0IGlwcl9zdGRfaW5xX3ZwaWRzICp2cGlkcywgdTggKnNlcmlhbF9udW0pCit7CisJY2hhciBidWZmZXJbSVBSX1ZFTkRPUl9JRF9MRU4gKyBJUFJfUFJPRF9JRF9MRU4KKwkJICAgICsgSVBSX1NFUklBTF9OVU1fTEVOXTsKKworCW1lbWNweShidWZmZXIsIHZwaWRzLT52ZW5kb3JfaWQsIElQUl9WRU5ET1JfSURfTEVOKTsKKwltZW1jcHkoYnVmZmVyICsgSVBSX1ZFTkRPUl9JRF9MRU4sIHZwaWRzLT5wcm9kdWN0X2lkLAorCSAgICAgICBJUFJfUFJPRF9JRF9MRU4pOworCWJ1ZmZlcltJUFJfVkVORE9SX0lEX0xFTiArIElQUl9QUk9EX0lEX0xFTl0gPSAnXDAnOworCWlwcl9lcnIoIlZlbmRvci9Qcm9kdWN0IElEOiAlc1xuIiwgYnVmZmVyKTsKKworCW1lbWNweShidWZmZXIsIHNlcmlhbF9udW0sIElQUl9TRVJJQUxfTlVNX0xFTik7CisJYnVmZmVyW0lQUl9TRVJJQUxfTlVNX0xFTl0gPSAnXDAnOworCWlwcl9lcnIoIiAgICBTZXJpYWwgTnVtYmVyOiAlc1xuIiwgYnVmZmVyKTsKK30KKworLyoqCisgKiBpcHJfbG9nX2NhY2hlX2Vycm9yIC0gTG9nIGEgY2FjaGUgZXJyb3IuCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBob3N0cmNiOglob3N0cmNiIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfbG9nX2NhY2hlX2Vycm9yKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZywKKwkJCQlzdHJ1Y3QgaXByX2hvc3RyY2IgKmhvc3RyY2IpCit7CisJc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMDJfZXJyb3IgKmVycm9yID0KKwkJJmhvc3RyY2ItPmhjYW0udS5lcnJvci51LnR5cGVfMDJfZXJyb3I7CisKKwlpcHJfZXJyKCItLS0tLUN1cnJlbnQgQ29uZmlndXJhdGlvbi0tLS0tXG4iKTsKKwlpcHJfZXJyKCJDYWNoZSBEaXJlY3RvcnkgQ2FyZCBJbmZvcm1hdGlvbjpcbiIpOworCWlwcl9sb2dfdnBkKCZlcnJvci0+aW9hX3ZwaWRzLCBlcnJvci0+aW9hX3NuKTsKKwlpcHJfZXJyKCJBZGFwdGVyIENhcmQgSW5mb3JtYXRpb246XG4iKTsKKwlpcHJfbG9nX3ZwZCgmZXJyb3ItPmNmY192cGlkcywgZXJyb3ItPmNmY19zbik7CisKKwlpcHJfZXJyKCItLS0tLUV4cGVjdGVkIENvbmZpZ3VyYXRpb24tLS0tLVxuIik7CisJaXByX2VycigiQ2FjaGUgRGlyZWN0b3J5IENhcmQgSW5mb3JtYXRpb246XG4iKTsKKwlpcHJfbG9nX3ZwZCgmZXJyb3ItPmlvYV9sYXN0X2F0dGFjaGVkX3RvX2NmY192cGlkcywKKwkJICAgIGVycm9yLT5pb2FfbGFzdF9hdHRhY2hlZF90b19jZmNfc24pOworCWlwcl9lcnIoIkFkYXB0ZXIgQ2FyZCBJbmZvcm1hdGlvbjpcbiIpOworCWlwcl9sb2dfdnBkKCZlcnJvci0+Y2ZjX2xhc3RfYXR0YWNoZWRfdG9faW9hX3ZwaWRzLAorCQkgICAgZXJyb3ItPmNmY19sYXN0X2F0dGFjaGVkX3RvX2lvYV9zbik7CisKKwlpcHJfZXJyKCJBZGRpdGlvbmFsIElPQSBEYXRhOiAlMDhYICUwOFggJTA4WFxuIiwKKwkJICAgICBiZTMyX3RvX2NwdShlcnJvci0+aW9hX2RhdGFbMF0pLAorCQkgICAgIGJlMzJfdG9fY3B1KGVycm9yLT5pb2FfZGF0YVsxXSksCisJCSAgICAgYmUzMl90b19jcHUoZXJyb3ItPmlvYV9kYXRhWzJdKSk7Cit9CisKKy8qKgorICogaXByX2xvZ19jb25maWdfZXJyb3IgLSBMb2cgYSBjb25maWd1cmF0aW9uIGVycm9yLgorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKiBAaG9zdHJjYjoJaG9zdHJjYiBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2xvZ19jb25maWdfZXJyb3Ioc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJCSBzdHJ1Y3QgaXByX2hvc3RyY2IgKmhvc3RyY2IpCit7CisJaW50IGVycm9yc19sb2dnZWQsIGk7CisJc3RydWN0IGlwcl9ob3N0cmNiX2RldmljZV9kYXRhX2VudHJ5ICpkZXZfZW50cnk7CisJc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMDNfZXJyb3IgKmVycm9yOworCisJZXJyb3IgPSAmaG9zdHJjYi0+aGNhbS51LmVycm9yLnUudHlwZV8wM19lcnJvcjsKKwllcnJvcnNfbG9nZ2VkID0gYmUzMl90b19jcHUoZXJyb3ItPmVycm9yc19sb2dnZWQpOworCisJaXByX2VycigiRGV2aWNlIEVycm9ycyBEZXRlY3RlZC9Mb2dnZWQ6ICVkLyVkXG4iLAorCQliZTMyX3RvX2NwdShlcnJvci0+ZXJyb3JzX2RldGVjdGVkKSwgZXJyb3JzX2xvZ2dlZCk7CisKKwlkZXZfZW50cnkgPSBlcnJvci0+ZGV2X2VudHJ5OworCisJZm9yIChpID0gMDsgaSA8IGVycm9yc19sb2dnZWQ7IGkrKywgZGV2X2VudHJ5KyspIHsKKwkJaXByX2Vycl9zZXBhcmF0b3I7CisKKwkJaWYgKGRldl9lbnRyeS0+ZGV2X3Jlc19hZGRyLmJ1cyA+PSBJUFJfTUFYX05VTV9CVVNFUykgeworCQkJaXByX2VycigiRGV2aWNlICVkOiBtaXNzaW5nXG4iLCBpICsgMSk7CisJCX0gZWxzZSB7CisJCQlpcHJfZXJyKCJEZXZpY2UgJWQ6ICVkOiVkOiVkOiVkXG4iLCBpICsgMSwKKwkJCQlpb2FfY2ZnLT5ob3N0LT5ob3N0X25vLCBkZXZfZW50cnktPmRldl9yZXNfYWRkci5idXMsCisJCQkJZGV2X2VudHJ5LT5kZXZfcmVzX2FkZHIudGFyZ2V0LCBkZXZfZW50cnktPmRldl9yZXNfYWRkci5sdW4pOworCQl9CisJCWlwcl9sb2dfdnBkKCZkZXZfZW50cnktPmRldl92cGlkcywgZGV2X2VudHJ5LT5kZXZfc24pOworCisJCWlwcl9lcnIoIi0tLS0tTmV3IERldmljZSBJbmZvcm1hdGlvbi0tLS0tXG4iKTsKKwkJaXByX2xvZ192cGQoJmRldl9lbnRyeS0+bmV3X2Rldl92cGlkcywgZGV2X2VudHJ5LT5uZXdfZGV2X3NuKTsKKworCQlpcHJfZXJyKCJDYWNoZSBEaXJlY3RvcnkgQ2FyZCBJbmZvcm1hdGlvbjpcbiIpOworCQlpcHJfbG9nX3ZwZCgmZGV2X2VudHJ5LT5pb2FfbGFzdF93aXRoX2Rldl92cGlkcywKKwkJCSAgICBkZXZfZW50cnktPmlvYV9sYXN0X3dpdGhfZGV2X3NuKTsKKworCQlpcHJfZXJyKCJBZGFwdGVyIENhcmQgSW5mb3JtYXRpb246XG4iKTsKKwkJaXByX2xvZ192cGQoJmRldl9lbnRyeS0+Y2ZjX2xhc3Rfd2l0aF9kZXZfdnBpZHMsCisJCQkgICAgZGV2X2VudHJ5LT5jZmNfbGFzdF93aXRoX2Rldl9zbik7CisKKwkJaXByX2VycigiQWRkaXRpb25hbCBJT0EgRGF0YTogJTA4WCAlMDhYICUwOFggJTA4WCAlMDhYXG4iLAorCQkJYmUzMl90b19jcHUoZGV2X2VudHJ5LT5pb2FfZGF0YVswXSksCisJCQliZTMyX3RvX2NwdShkZXZfZW50cnktPmlvYV9kYXRhWzFdKSwKKwkJCWJlMzJfdG9fY3B1KGRldl9lbnRyeS0+aW9hX2RhdGFbMl0pLAorCQkJYmUzMl90b19jcHUoZGV2X2VudHJ5LT5pb2FfZGF0YVszXSksCisJCQliZTMyX3RvX2NwdShkZXZfZW50cnktPmlvYV9kYXRhWzRdKSk7CisJfQorfQorCisvKioKKyAqIGlwcl9sb2dfYXJyYXlfZXJyb3IgLSBMb2cgYW4gYXJyYXkgY29uZmlndXJhdGlvbiBlcnJvci4KKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQGhvc3RyY2I6CWhvc3RyY2Igc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9sb2dfYXJyYXlfZXJyb3Ioc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJCXN0cnVjdCBpcHJfaG9zdHJjYiAqaG9zdHJjYikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8wNF9lcnJvciAqZXJyb3I7CisJc3RydWN0IGlwcl9ob3N0cmNiX2FycmF5X2RhdGFfZW50cnkgKmFycmF5X2VudHJ5OworCWNvbnN0IHU4IHplcm9fc25bSVBSX1NFUklBTF9OVU1fTEVOXSA9IHsgWzAgLi4uIElQUl9TRVJJQUxfTlVNX0xFTi0xXSA9ICcwJyB9OworCisJZXJyb3IgPSAmaG9zdHJjYi0+aGNhbS51LmVycm9yLnUudHlwZV8wNF9lcnJvcjsKKworCWlwcl9lcnJfc2VwYXJhdG9yOworCisJaXByX2VycigiUkFJRCAlcyBBcnJheSBDb25maWd1cmF0aW9uOiAlZDolZDolZDolZFxuIiwKKwkJZXJyb3ItPnByb3RlY3Rpb25fbGV2ZWwsCisJCWlvYV9jZmctPmhvc3QtPmhvc3Rfbm8sCisJCWVycm9yLT5sYXN0X2Z1bmNfdnNldF9yZXNfYWRkci5idXMsCisJCWVycm9yLT5sYXN0X2Z1bmNfdnNldF9yZXNfYWRkci50YXJnZXQsCisJCWVycm9yLT5sYXN0X2Z1bmNfdnNldF9yZXNfYWRkci5sdW4pOworCisJaXByX2Vycl9zZXBhcmF0b3I7CisKKwlhcnJheV9lbnRyeSA9IGVycm9yLT5hcnJheV9tZW1iZXI7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTg7IGkrKykgeworCQlpZiAoIW1lbWNtcChhcnJheV9lbnRyeS0+c2VyaWFsX251bSwgemVyb19zbiwgSVBSX1NFUklBTF9OVU1fTEVOKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChiZTMyX3RvX2NwdShlcnJvci0+ZXhwb3NlZF9tb2RlX2FkbikgPT0gaSkgeworCQkJaXByX2VycigiRXhwb3NlZCBBcnJheSBNZW1iZXIgJWQ6XG4iLCBpKTsKKwkJfSBlbHNlIHsKKwkJCWlwcl9lcnIoIkFycmF5IE1lbWJlciAlZDpcbiIsIGkpOworCQl9CisKKwkJaXByX2xvZ192cGQoJmFycmF5X2VudHJ5LT52cGlkcywgYXJyYXlfZW50cnktPnNlcmlhbF9udW0pOworCisJCWlmIChhcnJheV9lbnRyeS0+ZGV2X3Jlc19hZGRyLmJ1cyA+PSBJUFJfTUFYX05VTV9CVVNFUykgeworCQkJaXByX2VycigiQ3VycmVudCBMb2NhdGlvbjogdW5rbm93blxuIik7CisJCX0gZWxzZSB7CisJCQlpcHJfZXJyKCJDdXJyZW50IExvY2F0aW9uOiAlZDolZDolZDolZFxuIiwKKwkJCQlpb2FfY2ZnLT5ob3N0LT5ob3N0X25vLAorCQkJCWFycmF5X2VudHJ5LT5kZXZfcmVzX2FkZHIuYnVzLAorCQkJCWFycmF5X2VudHJ5LT5kZXZfcmVzX2FkZHIudGFyZ2V0LAorCQkJCWFycmF5X2VudHJ5LT5kZXZfcmVzX2FkZHIubHVuKTsKKwkJfQorCisJCWlmIChhcnJheV9lbnRyeS0+ZGV2X3Jlc19hZGRyLmJ1cyA+PSBJUFJfTUFYX05VTV9CVVNFUykgeworCQkJaXByX2VycigiRXhwZWN0ZWQgTG9jYXRpb246IHVua25vd25cbiIpOworCQl9IGVsc2UgeworCQkJaXByX2VycigiRXhwZWN0ZWQgTG9jYXRpb246ICVkOiVkOiVkOiVkXG4iLAorCQkJCWlvYV9jZmctPmhvc3QtPmhvc3Rfbm8sCisJCQkJYXJyYXlfZW50cnktPmV4cGVjdGVkX2Rldl9yZXNfYWRkci5idXMsCisJCQkJYXJyYXlfZW50cnktPmV4cGVjdGVkX2Rldl9yZXNfYWRkci50YXJnZXQsCisJCQkJYXJyYXlfZW50cnktPmV4cGVjdGVkX2Rldl9yZXNfYWRkci5sdW4pOworCQl9CisKKwkJaXByX2Vycl9zZXBhcmF0b3I7CisKKwkJaWYgKGkgPT0gOSkKKwkJCWFycmF5X2VudHJ5ID0gZXJyb3ItPmFycmF5X21lbWJlcjI7CisJCWVsc2UKKwkJCWFycmF5X2VudHJ5Kys7CisJfQorfQorCisvKioKKyAqIGlwcl9sb2dfZ2VuZXJpY19lcnJvciAtIExvZyBhbiBhZGFwdGVyIGVycm9yLgorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKiBAaG9zdHJjYjoJaG9zdHJjYiBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2xvZ19nZW5lcmljX2Vycm9yKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZywKKwkJCQkgIHN0cnVjdCBpcHJfaG9zdHJjYiAqaG9zdHJjYikKK3sKKwlpbnQgaTsKKwlpbnQgaW9hX2RhdGFfbGVuID0gYmUzMl90b19jcHUoaG9zdHJjYi0+aGNhbS5sZW5ndGgpOworCisJaWYgKGlvYV9kYXRhX2xlbiA9PSAwKQorCQlyZXR1cm47CisKKwlpcHJfZXJyKCJJT0EgRXJyb3IgRGF0YTpcbiIpOworCWlwcl9lcnIoIk9mZnNldCAgICAwIDEgMiAzICA0IDUgNiA3ICA4IDkgQSBCICBDIEQgRSBGXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBpb2FfZGF0YV9sZW4gLyA0OyBpICs9IDQpIHsKKwkJaXByX2VycigiJTA4WDogJTA4WCAlMDhYICUwOFggJTA4WFxuIiwgaSo0LAorCQkJYmUzMl90b19jcHUoaG9zdHJjYi0+aGNhbS51LnJhdy5kYXRhW2ldKSwKKwkJCWJlMzJfdG9fY3B1KGhvc3RyY2ItPmhjYW0udS5yYXcuZGF0YVtpKzFdKSwKKwkJCWJlMzJfdG9fY3B1KGhvc3RyY2ItPmhjYW0udS5yYXcuZGF0YVtpKzJdKSwKKwkJCWJlMzJfdG9fY3B1KGhvc3RyY2ItPmhjYW0udS5yYXcuZGF0YVtpKzNdKSk7CisJfQorfQorCisvKioKKyAqIGlwcl9nZXRfZXJyb3IgLSBGaW5kIHRoZSBzcGVjZmllZCBJT0FTQyBpbiB0aGUgaXByX2Vycm9yX3RhYmxlLgorICogQGlvYXNjOglJT0FTQworICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIGluZGV4IG9mIGludG8gdGhlIGlwcl9lcnJvcl90YWJsZQorICogZm9yIHRoZSBzcGVjaWZpZWQgSU9BU0MuIElmIHRoZSBJT0FTQyBpcyBub3QgaW4gdGhlIHRhYmxlLAorICogMCB3aWxsIGJlIHJldHVybmVkLCB3aGljaCBwb2ludHMgdG8gdGhlIGVudHJ5IHVzZWQgZm9yIHVua25vd24gZXJyb3JzLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlpbmRleCBpbnRvIHRoZSBpcHJfZXJyb3JfdGFibGUKKyAqKi8KK3N0YXRpYyB1MzIgaXByX2dldF9lcnJvcih1MzIgaW9hc2MpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcHJfZXJyb3JfdGFibGUpOyBpKyspCisJCWlmIChpcHJfZXJyb3JfdGFibGVbaV0uaW9hc2MgPT0gaW9hc2MpCisJCQlyZXR1cm4gaTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlwcl9oYW5kbGVfbG9nX2RhdGEgLSBMb2cgYW4gYWRhcHRlciBlcnJvci4KKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQGhvc3RyY2I6CWhvc3RyY2Igc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBsb2dzIGFuIGFkYXB0ZXIgZXJyb3IgdG8gdGhlIHN5c3RlbS4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2hhbmRsZV9sb2dfZGF0YShzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQkJc3RydWN0IGlwcl9ob3N0cmNiICpob3N0cmNiKQoreworCXUzMiBpb2FzYzsKKwlpbnQgZXJyb3JfaW5kZXg7CisKKwlpZiAoaG9zdHJjYi0+aGNhbS5ub3RpZnlfdHlwZSAhPSBJUFJfSE9TVF9SQ0JfTk9USUZfVFlQRV9FUlJPUl9MT0dfRU5UUlkpCisJCXJldHVybjsKKworCWlmIChob3N0cmNiLT5oY2FtLm5vdGlmaWNhdGlvbnNfbG9zdCA9PSBJUFJfSE9TVF9SQ0JfTk9USUZJQ0FUSU9OU19MT1NUKQorCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJFcnJvciBub3RpZmljYXRpb25zIGxvc3RcbiIpOworCisJaW9hc2MgPSBiZTMyX3RvX2NwdShob3N0cmNiLT5oY2FtLnUuZXJyb3IuZmFpbGluZ19kZXZfaW9hc2MpOworCisJaWYgKGlvYXNjID09IElQUl9JT0FTQ19CVVNfV0FTX1JFU0VUIHx8CisJICAgIGlvYXNjID09IElQUl9JT0FTQ19CVVNfV0FTX1JFU0VUX0JZX09USEVSKSB7CisJCS8qIFRlbGwgdGhlIG1pZGxheWVyIHdlIGhhZCBhIGJ1cyByZXNldCBzbyBpdCB3aWxsIGhhbmRsZSB0aGUgVUEgcHJvcGVybHkgKi8KKwkJc2NzaV9yZXBvcnRfYnVzX3Jlc2V0KGlvYV9jZmctPmhvc3QsCisJCQkJICAgICAgaG9zdHJjYi0+aGNhbS51LmVycm9yLmZhaWxpbmdfZGV2X3Jlc19hZGRyLmJ1cyk7CisJfQorCisJZXJyb3JfaW5kZXggPSBpcHJfZ2V0X2Vycm9yKGlvYXNjKTsKKworCWlmICghaXByX2Vycm9yX3RhYmxlW2Vycm9yX2luZGV4XS5sb2dfaGNhbSkKKwkJcmV0dXJuOworCisJaWYgKGlwcl9pc19kZXZpY2UoJmhvc3RyY2ItPmhjYW0udS5lcnJvci5mYWlsaW5nX2Rldl9yZXNfYWRkcikpIHsKKwkJaXByX3Jlc19lcnIoaW9hX2NmZywgaG9zdHJjYi0+aGNhbS51LmVycm9yLmZhaWxpbmdfZGV2X3Jlc19hZGRyLAorCQkJICAgICIlc1xuIiwgaXByX2Vycm9yX3RhYmxlW2Vycm9yX2luZGV4XS5lcnJvcik7CisJfSBlbHNlIHsKKwkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LCAiJXNcbiIsCisJCQlpcHJfZXJyb3JfdGFibGVbZXJyb3JfaW5kZXhdLmVycm9yKTsKKwl9CisKKwkvKiBTZXQgaW5kaWNhdGlvbiB3ZSBoYXZlIGxvZ2dlZCBhbiBlcnJvciAqLworCWlvYV9jZmctPmVycm9yc19sb2dnZWQrKzsKKworCWlmIChpb2FfY2ZnLT5sb2dfbGV2ZWwgPCBJUFJfREVGQVVMVF9MT0dfTEVWRUwpCisJCXJldHVybjsKKworCXN3aXRjaCAoaG9zdHJjYi0+aGNhbS5vdmVybGF5X2lkKSB7CisJY2FzZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF8xOgorCQlpcHJfbG9nX2dlbmVyaWNfZXJyb3IoaW9hX2NmZywgaG9zdHJjYik7CisJCWJyZWFrOworCWNhc2UgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfMjoKKwkJaXByX2xvZ19jYWNoZV9lcnJvcihpb2FfY2ZnLCBob3N0cmNiKTsKKwkJYnJlYWs7CisJY2FzZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF8zOgorCQlpcHJfbG9nX2NvbmZpZ19lcnJvcihpb2FfY2ZnLCBob3N0cmNiKTsKKwkJYnJlYWs7CisJY2FzZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF80OgorCWNhc2UgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfNjoKKwkJaXByX2xvZ19hcnJheV9lcnJvcihpb2FfY2ZnLCBob3N0cmNiKTsKKwkJYnJlYWs7CisJY2FzZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF9ERUZBVUxUOgorCQlpcHJfbG9nX2dlbmVyaWNfZXJyb3IoaW9hX2NmZywgaG9zdHJjYik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwKKwkJCSJVbmtub3duIGVycm9yIHJlY2VpdmVkLiBPdmVybGF5IElEOiAlZFxuIiwKKwkJCWhvc3RyY2ItPmhjYW0ub3ZlcmxheV9pZCk7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBpcHJfcHJvY2Vzc19lcnJvciAtIE9wIGRvbmUgZnVuY3Rpb24gZm9yIGFuIGFkYXB0ZXIgZXJyb3IgbG9nLgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG9wIGRvbmUgZnVuY3Rpb24gZm9yIGFuIGVycm9yIGxvZyBob3N0CisgKiBjb250cm9sbGVkIGFzeW5jIGZyb20gdGhlIGFkYXB0ZXIuIEl0IHdpbGwgbG9nIHRoZSBlcnJvciBhbmQKKyAqIHNlbmQgdGhlIEhDQU0gYmFjayB0byB0aGUgYWRhcHRlci4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX3Byb2Nlc3NfZXJyb3Ioc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJc3RydWN0IGlwcl9ob3N0cmNiICpob3N0cmNiID0gaXByX2NtZC0+dS5ob3N0cmNiOworCXUzMiBpb2FzYyA9IGJlMzJfdG9fY3B1KGlwcl9jbWQtPmlvYXNhLmlvYXNjKTsKKworCWxpc3RfZGVsKCZob3N0cmNiLT5xdWV1ZSk7CisJbGlzdF9hZGRfdGFpbCgmaXByX2NtZC0+cXVldWUsICZpb2FfY2ZnLT5mcmVlX3EpOworCisJaWYgKCFpb2FzYykgeworCQlpcHJfaGFuZGxlX2xvZ19kYXRhKGlvYV9jZmcsIGhvc3RyY2IpOworCX0gZWxzZSBpZiAoaW9hc2MgIT0gSVBSX0lPQVNDX0lPQV9XQVNfUkVTRVQpIHsKKwkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LAorCQkJIkhvc3QgUkNCIGZhaWxlZCB3aXRoIElPQVNDOiAweCUwOFhcbiIsIGlvYXNjKTsKKwl9CisKKwlpcHJfc2VuZF9oY2FtKGlvYV9jZmcsIElQUl9IQ0FNX0NEQl9PUF9DT0RFX0xPR19EQVRBLCBob3N0cmNiKTsKK30KKworLyoqCisgKiBpcHJfdGltZW91dCAtICBBbiBpbnRlcm5hbGx5IGdlbmVyYXRlZCBvcCBoYXMgdGltZWQgb3V0LgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gYmxvY2tzIGhvc3QgcmVxdWVzdHMgYW5kIGluaXRpYXRlcyBhbgorICogYWRhcHRlciByZXNldC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX3RpbWVvdXQoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKworCUVOVEVSOworCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisKKwlpb2FfY2ZnLT5lcnJvcnNfbG9nZ2VkKys7CisJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LAorCQkiQWRhcHRlciBiZWluZyByZXNldCBkdWUgdG8gY29tbWFuZCB0aW1lb3V0LlxuIik7CisKKwlpZiAoV0FJVF9GT1JfRFVNUCA9PSBpb2FfY2ZnLT5zZHRfc3RhdGUpCisJCWlvYV9jZmctPnNkdF9zdGF0ZSA9IEdFVF9EVU1QOworCisJaWYgKCFpb2FfY2ZnLT5pbl9yZXNldF9yZWxvYWQgfHwgaW9hX2NmZy0+cmVzZXRfY21kID09IGlwcl9jbWQpCisJCWlwcl9pbml0aWF0ZV9pb2FfcmVzZXQoaW9hX2NmZywgSVBSX1NIVVRET1dOX05PTkUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCUxFQVZFOworfQorCisvKioKKyAqIGlwcl9vcGVyX3RpbWVvdXQgLSAgQWRhcHRlciB0aW1lZCBvdXQgdHJhbnNpdGlvbmluZyB0byBvcGVyYXRpb25hbAorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gYmxvY2tzIGhvc3QgcmVxdWVzdHMgYW5kIGluaXRpYXRlcyBhbgorICogYWRhcHRlciByZXNldC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX29wZXJfdGltZW91dChzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzID0gMDsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCisJRU5URVI7CisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWlvYV9jZmctPmVycm9yc19sb2dnZWQrKzsKKwlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsCisJCSJBZGFwdGVyIHRpbWVkIG91dCB0cmFuc2l0aW9uaW5nIHRvIG9wZXJhdGlvbmFsLlxuIik7CisKKwlpZiAoV0FJVF9GT1JfRFVNUCA9PSBpb2FfY2ZnLT5zZHRfc3RhdGUpCisJCWlvYV9jZmctPnNkdF9zdGF0ZSA9IEdFVF9EVU1QOworCisJaWYgKCFpb2FfY2ZnLT5pbl9yZXNldF9yZWxvYWQgfHwgaW9hX2NmZy0+cmVzZXRfY21kID09IGlwcl9jbWQpIHsKKwkJaWYgKGlwcl9mYXN0ZmFpbCkKKwkJCWlvYV9jZmctPnJlc2V0X3JldHJpZXMgKz0gSVBSX05VTV9SRVNFVF9SRUxPQURfUkVUUklFUzsKKwkJaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBJUFJfU0hVVERPV05fTk9ORSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCUxFQVZFOworfQorCisvKioKKyAqIGlwcl9yZXNldF9yZWxvYWQgLSBSZXNldC9SZWxvYWQgdGhlIElPQQorICogQGlvYV9jZmc6CQlpb2EgY29uZmlnIHN0cnVjdAorICogQHNodXRkb3duX3R5cGU6CXNodXRkb3duIHR5cGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgYWRhcHRlciBhbmQgcmUtaW5pdGlhbGl6ZXMgaXQuCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhbGwgbmV3IGhvc3QgY29tbWFuZHMgaGF2ZSBiZWVuIHN0b3BwZWQuCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJU1VDQ0VTUyAvIEZBSUxFRAorICoqLworc3RhdGljIGludCBpcHJfcmVzZXRfcmVsb2FkKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZywKKwkJCSAgICBlbnVtIGlwcl9zaHV0ZG93bl90eXBlIHNodXRkb3duX3R5cGUpCit7CisJaWYgKCFpb2FfY2ZnLT5pbl9yZXNldF9yZWxvYWQpCisJCWlwcl9pbml0aWF0ZV9pb2FfcmVzZXQoaW9hX2NmZywgc2h1dGRvd25fdHlwZSk7CisKKwlzcGluX3VubG9ja19pcnEoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrKTsKKwl3YWl0X2V2ZW50KGlvYV9jZmctPnJlc2V0X3dhaXRfcSwgIWlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCk7CisJc3Bpbl9sb2NrX2lycShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2spOworCisJLyogSWYgd2UgZ290IGhpdCB3aXRoIGEgaG9zdCByZXNldCB3aGlsZSB3ZSB3ZXJlIGFscmVhZHkgcmVzZXR0aW5nCisJIHRoZSBhZGFwdGVyIGZvciBzb21lIHJlYXNvbiwgYW5kIHRoZSByZXNldCBmYWlsZWQuICovCisJaWYgKGlvYV9jZmctPmlvYV9pc19kZWFkKSB7CisJCWlwcl90cmFjZTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgKiBpcHJfZmluZF9zZXNfZW50cnkgLSBGaW5kIG1hdGNoaW5nIFNFUyBpbiBTRVMgdGFibGUKKyAqIEByZXM6CXJlc291cmNlIGVudHJ5IHN0cnVjdCBvZiBTRVMKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJcG9pbnRlciB0byBTRVMgdGFibGUgZW50cnkgLyBOVUxMIG9uIGZhaWx1cmUKKyAqKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXByX3Nlc190YWJsZV9lbnRyeSAqCitpcHJfZmluZF9zZXNfZW50cnkoc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzKQoreworCWludCBpLCBqLCBtYXRjaGVzOworCWNvbnN0IHN0cnVjdCBpcHJfc2VzX3RhYmxlX2VudHJ5ICpzdGUgPSBpcHJfc2VzX3RhYmxlOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXByX3Nlc190YWJsZSk7IGkrKywgc3RlKyspIHsKKwkJZm9yIChqID0gMCwgbWF0Y2hlcyA9IDA7IGogPCBJUFJfUFJPRF9JRF9MRU47IGorKykgeworCQkJaWYgKHN0ZS0+Y29tcGFyZV9wcm9kdWN0X2lkX2J5dGVbal0gPT0gJ1gnKSB7CisJCQkJaWYgKHJlcy0+Y2ZndGUuc3RkX2lucV9kYXRhLnZwaWRzLnByb2R1Y3RfaWRbal0gPT0gc3RlLT5wcm9kdWN0X2lkW2pdKQorCQkJCQltYXRjaGVzKys7CisJCQkJZWxzZQorCQkJCQlicmVhazsKKwkJCX0gZWxzZQorCQkJCW1hdGNoZXMrKzsKKwkJfQorCisJCWlmIChtYXRjaGVzID09IElQUl9QUk9EX0lEX0xFTikKKwkJCXJldHVybiBzdGU7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogaXByX2dldF9tYXhfc2NzaV9zcGVlZCAtIERldGVybWluZSBtYXggU0NTSSBzcGVlZCBmb3IgYSBnaXZlbiBidXMKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQGJ1czoJCVNDU0kgYnVzCisgKiBAYnVzX3dpZHRoOglidXMgd2lkdGgKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKglTQ1NJIGJ1cyBzcGVlZCBpbiB1bml0cyBvZiAxMDBLSHosIDE2MDAgaXMgMTYwIE1IegorICoJRm9yIGEgMi1ieXRlIHdpZGUgU0NTSSBidXMsIHRoZSBtYXhpbXVtIHRyYW5zZmVyIHNwZWVkIGlzCisgKgl0d2ljZSB0aGUgbWF4aW11bSB0cmFuc2ZlciByYXRlIChlLmcuIGZvciBhIHdpZGUgZW5hYmxlZCBidXMsCisgKgltYXggMTYwTUh6ID0gbWF4IDMyME1CL3NlYykuCisgKiovCitzdGF0aWMgdTMyIGlwcl9nZXRfbWF4X3Njc2lfc3BlZWQoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLCB1OCBidXMsIHU4IGJ1c193aWR0aCkKK3sKKwlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXM7CisJY29uc3Qgc3RydWN0IGlwcl9zZXNfdGFibGVfZW50cnkgKnN0ZTsKKwl1MzIgbWF4X3hmZXJfcmF0ZSA9IElQUl9NQVhfU0NTSV9SQVRFKGJ1c193aWR0aCk7CisKKwkvKiBMb29wIHRocm91Z2ggZWFjaCBjb25maWcgdGFibGUgZW50cnkgaW4gdGhlIGNvbmZpZyB0YWJsZSBidWZmZXIgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcywgJmlvYV9jZmctPnVzZWRfcmVzX3EsIHF1ZXVlKSB7CisJCWlmICghKElQUl9JU19TRVNfREVWSUNFKHJlcy0+Y2ZndGUuc3RkX2lucV9kYXRhKSkpCisJCQljb250aW51ZTsKKworCQlpZiAoYnVzICE9IHJlcy0+Y2ZndGUucmVzX2FkZHIuYnVzKQorCQkJY29udGludWU7CisKKwkJaWYgKCEoc3RlID0gaXByX2ZpbmRfc2VzX2VudHJ5KHJlcykpKQorCQkJY29udGludWU7CisKKwkJbWF4X3hmZXJfcmF0ZSA9IChzdGUtPm1heF9idXNfc3BlZWRfbGltaXQgKiAxMCkgLyAoYnVzX3dpZHRoIC8gOCk7CisJfQorCisJcmV0dXJuIG1heF94ZmVyX3JhdGU7Cit9CisKKy8qKgorICogaXByX3dhaXRfaW9kYmdfYWNrIC0gV2FpdCBmb3IgYW4gSU9ERUJVRyBBQ0sgZnJvbSB0aGUgSU9BCisgKiBAaW9hX2NmZzoJCWlvYSBjb25maWcgc3RydWN0CisgKiBAbWF4X2RlbGF5OgkJbWF4IGRlbGF5IGluIG1pY3JvLXNlY29uZHMgdG8gd2FpdAorICoKKyAqIFdhaXRzIGZvciBhbiBJT0RFQlVHIEFDSyBmcm9tIHRoZSBJT0EsIGRvaW5nIGJ1c3kgbG9vcGluZy4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMCBvbiBzdWNjZXNzIC8gb3RoZXIgb24gZmFpbHVyZQorICoqLworc3RhdGljIGludCBpcHJfd2FpdF9pb2RiZ19hY2soc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLCBpbnQgbWF4X2RlbGF5KQoreworCXZvbGF0aWxlIHUzMiBwY2lpX3JlZzsKKwlpbnQgZGVsYXkgPSAxOworCisJLyogUmVhZCBpbnRlcnJ1cHQgcmVnIHVudGlsIElPQSBzaWduYWxzIElPIERlYnVnIEFja25vd2xlZGdlICovCisJd2hpbGUgKGRlbGF5IDwgbWF4X2RlbGF5KSB7CisJCXBjaWlfcmVnID0gcmVhZGwoaW9hX2NmZy0+cmVncy5zZW5zZV9pbnRlcnJ1cHRfcmVnKTsKKworCQlpZiAocGNpaV9yZWcgJiBJUFJfUENJSV9JT19ERUJVR19BQ0tOT1dMRURHRSkKKwkJCXJldHVybiAwOworCisJCS8qIHVkZWxheSBjYW5ub3QgYmUgdXNlZCBpZiBkZWxheSBpcyBtb3JlIHRoYW4gYSBmZXcgbWlsbGlzZWNvbmRzICovCisJCWlmICgoZGVsYXkgLyAxMDAwKSA+IE1BWF9VREVMQVlfTVMpCisJCQltZGVsYXkoZGVsYXkgLyAxMDAwKTsKKwkJZWxzZQorCQkJdWRlbGF5KGRlbGF5KTsKKworCQlkZWxheSArPSBkZWxheTsKKwl9CisJcmV0dXJuIC1FSU87Cit9CisKKy8qKgorICogaXByX2dldF9sZHVtcF9kYXRhX3NlY3Rpb24gLSBEdW1wIElPQSBtZW1vcnkKKyAqIEBpb2FfY2ZnOgkJCWlvYSBjb25maWcgc3RydWN0CisgKiBAc3RhcnRfYWRkcjoJCQlhZGFwdGVyIGFkZHJlc3MgdG8gZHVtcAorICogQGRlc3Q6CQkJCWRlc3RpbmF0aW9uIGtlcm5lbCBidWZmZXIKKyAqIEBsZW5ndGhfaW5fd29yZHM6CWxlbmd0aCB0byBkdW1wIGluIDQgYnl0ZSB3b3JkcworICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkwIG9uIHN1Y2Nlc3MgLyAtRUlPIG9uIGZhaWx1cmUKKyAqKi8KK3N0YXRpYyBpbnQgaXByX2dldF9sZHVtcF9kYXRhX3NlY3Rpb24oc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJCSAgICAgIHUzMiBzdGFydF9hZGRyLAorCQkJCSAgICAgIF9fYmUzMiAqZGVzdCwgdTMyIGxlbmd0aF9pbl93b3JkcykKK3sKKwl2b2xhdGlsZSB1MzIgdGVtcF9wY2lpX3JlZzsKKwlpbnQgaSwgZGVsYXkgPSAwOworCisJLyogV3JpdGUgSU9BIGludGVycnVwdCByZWcgc3RhcnRpbmcgTERVTVAgc3RhdGUgICovCisJd3JpdGVsKChJUFJfVVBST0NJX1JFU0VUX0FMRVJUIHwgSVBSX1VQUk9DSV9JT19ERUJVR19BTEVSVCksCisJICAgICAgIGlvYV9jZmctPnJlZ3Muc2V0X3Vwcm9jX2ludGVycnVwdF9yZWcpOworCisJLyogV2FpdCBmb3IgSU8gZGVidWcgYWNrbm93bGVkZ2UgKi8KKwlpZiAoaXByX3dhaXRfaW9kYmdfYWNrKGlvYV9jZmcsCisJCQkgICAgICAgSVBSX0xEVU1QX01BWF9MT05HX0FDS19ERUxBWV9JTl9VU0VDKSkgeworCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsCisJCQkiSU9BIGR1bXAgbG9uZyBkYXRhIHRyYW5zZmVyIHRpbWVvdXRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBTaWduYWwgTERVTVAgaW50ZXJsb2NrZWQgLSBjbGVhciBJTyBkZWJ1ZyBhY2sgKi8KKwl3cml0ZWwoSVBSX1BDSUlfSU9fREVCVUdfQUNLTk9XTEVER0UsCisJICAgICAgIGlvYV9jZmctPnJlZ3MuY2xyX2ludGVycnVwdF9yZWcpOworCisJLyogV3JpdGUgTWFpbGJveCB3aXRoIHN0YXJ0aW5nIGFkZHJlc3MgKi8KKwl3cml0ZWwoc3RhcnRfYWRkciwgaW9hX2NmZy0+aW9hX21haWxib3gpOworCisJLyogU2lnbmFsIGFkZHJlc3MgdmFsaWQgLSBjbGVhciBJT0EgUmVzZXQgYWxlcnQgKi8KKwl3cml0ZWwoSVBSX1VQUk9DSV9SRVNFVF9BTEVSVCwKKwkgICAgICAgaW9hX2NmZy0+cmVncy5jbHJfdXByb2NfaW50ZXJydXB0X3JlZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoX2luX3dvcmRzOyBpKyspIHsKKwkJLyogV2FpdCBmb3IgSU8gZGVidWcgYWNrbm93bGVkZ2UgKi8KKwkJaWYgKGlwcl93YWl0X2lvZGJnX2Fjayhpb2FfY2ZnLAorCQkJCSAgICAgICBJUFJfTERVTVBfTUFYX1NIT1JUX0FDS19ERUxBWV9JTl9VU0VDKSkgeworCQkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LAorCQkJCSJJT0EgZHVtcCBzaG9ydCBkYXRhIHRyYW5zZmVyIHRpbWVvdXRcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQkvKiBSZWFkIGRhdGEgZnJvbSBtYWlsYm94IGFuZCBpbmNyZW1lbnQgZGVzdGluYXRpb24gcG9pbnRlciAqLworCQkqZGVzdCA9IGNwdV90b19iZTMyKHJlYWRsKGlvYV9jZmctPmlvYV9tYWlsYm94KSk7CisJCWRlc3QrKzsKKworCQkvKiBGb3IgYWxsIGJ1dCB0aGUgbGFzdCB3b3JkIG9mIGRhdGEsIHNpZ25hbCBkYXRhIHJlY2VpdmVkICovCisJCWlmIChpIDwgKGxlbmd0aF9pbl93b3JkcyAtIDEpKSB7CisJCQkvKiBTaWduYWwgZHVtcCBkYXRhIHJlY2VpdmVkIC0gQ2xlYXIgSU8gZGVidWcgQWNrICovCisJCQl3cml0ZWwoSVBSX1BDSUlfSU9fREVCVUdfQUNLTk9XTEVER0UsCisJCQkgICAgICAgaW9hX2NmZy0+cmVncy5jbHJfaW50ZXJydXB0X3JlZyk7CisJCX0KKwl9CisKKwkvKiBTaWduYWwgZW5kIG9mIGJsb2NrIHRyYW5zZmVyLiBTZXQgcmVzZXQgYWxlcnQgdGhlbiBjbGVhciBJTyBkZWJ1ZyBhY2sgKi8KKwl3cml0ZWwoSVBSX1VQUk9DSV9SRVNFVF9BTEVSVCwKKwkgICAgICAgaW9hX2NmZy0+cmVncy5zZXRfdXByb2NfaW50ZXJydXB0X3JlZyk7CisKKwl3cml0ZWwoSVBSX1VQUk9DSV9JT19ERUJVR19BTEVSVCwKKwkgICAgICAgaW9hX2NmZy0+cmVncy5jbHJfdXByb2NfaW50ZXJydXB0X3JlZyk7CisKKwkvKiBTaWduYWwgZHVtcCBkYXRhIHJlY2VpdmVkIC0gQ2xlYXIgSU8gZGVidWcgQWNrICovCisJd3JpdGVsKElQUl9QQ0lJX0lPX0RFQlVHX0FDS05PV0xFREdFLAorCSAgICAgICBpb2FfY2ZnLT5yZWdzLmNscl9pbnRlcnJ1cHRfcmVnKTsKKworCS8qIFdhaXQgZm9yIElPQSB0byBzaWduYWwgTERVTVAgZXhpdCAtIElPQSByZXNldCBhbGVydCB3aWxsIGJlIGNsZWFyZWQgKi8KKwl3aGlsZSAoZGVsYXkgPCBJUFJfTERVTVBfTUFYX1NIT1JUX0FDS19ERUxBWV9JTl9VU0VDKSB7CisJCXRlbXBfcGNpaV9yZWcgPQorCQkgICAgcmVhZGwoaW9hX2NmZy0+cmVncy5zZW5zZV91cHJvY19pbnRlcnJ1cHRfcmVnKTsKKworCQlpZiAoISh0ZW1wX3BjaWlfcmVnICYgSVBSX1VQUk9DSV9SRVNFVF9BTEVSVCkpCisJCQlyZXR1cm4gMDsKKworCQl1ZGVsYXkoMTApOworCQlkZWxheSArPSAxMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19TQ1NJX0lQUl9EVU1QCisvKioKKyAqIGlwcl9zZHRfY29weSAtIENvcHkgU21hcnQgRHVtcCBUYWJsZSB0byBrZXJuZWwgYnVmZmVyCisgKiBAaW9hX2NmZzoJCWlvYSBjb25maWcgc3RydWN0CisgKiBAcGNpX2FkZHJlc3M6CWFkYXB0ZXIgYWRkcmVzcworICogQGxlbmd0aDoJCQlsZW5ndGggb2YgZGF0YSB0byBjb3B5CisgKgorICogQ29weSBkYXRhIGZyb20gUENJIGFkYXB0ZXIgdG8ga2VybmVsIGJ1ZmZlci4KKyAqIE5vdGU6IGxlbmd0aCBNVVNUIGJlIGEgNCBieXRlIG11bHRpcGxlCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMCBvbiBzdWNjZXNzIC8gb3RoZXIgb24gZmFpbHVyZQorICoqLworc3RhdGljIGludCBpcHJfc2R0X2NvcHkoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJdW5zaWduZWQgbG9uZyBwY2lfYWRkcmVzcywgdTMyIGxlbmd0aCkKK3sKKwlpbnQgYnl0ZXNfY29waWVkID0gMDsKKwlpbnQgY3VyX2xlbiwgcmMsIHJlbV9sZW4sIHJlbV9wYWdlX2xlbjsKKwlfX2JlMzIgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzID0gMDsKKwlzdHJ1Y3QgaXByX2lvYV9kdW1wICppb2FfZHVtcCA9ICZpb2FfY2ZnLT5kdW1wLT5pb2FfZHVtcDsKKworCXdoaWxlIChieXRlc19jb3BpZWQgPCBsZW5ndGggJiYKKwkgICAgICAgKGlvYV9kdW1wLT5oZHIubGVuICsgYnl0ZXNfY29waWVkKSA8IElQUl9NQVhfSU9BX0RVTVBfU0laRSkgeworCQlpZiAoaW9hX2R1bXAtPnBhZ2Vfb2Zmc2V0ID49IFBBR0VfU0laRSB8fAorCQkgICAgaW9hX2R1bXAtPnBhZ2Vfb2Zmc2V0ID09IDApIHsKKwkJCXBhZ2UgPSAoX19iZTMyICopX19nZXRfZnJlZV9wYWdlKEdGUF9BVE9NSUMpOworCisJCQlpZiAoIXBhZ2UpIHsKKwkJCQlpcHJfdHJhY2U7CisJCQkJcmV0dXJuIGJ5dGVzX2NvcGllZDsKKwkJCX0KKworCQkJaW9hX2R1bXAtPnBhZ2Vfb2Zmc2V0ID0gMDsKKwkJCWlvYV9kdW1wLT5pb2FfZGF0YVtpb2FfZHVtcC0+bmV4dF9wYWdlX2luZGV4XSA9IHBhZ2U7CisJCQlpb2FfZHVtcC0+bmV4dF9wYWdlX2luZGV4Kys7CisJCX0gZWxzZQorCQkJcGFnZSA9IGlvYV9kdW1wLT5pb2FfZGF0YVtpb2FfZHVtcC0+bmV4dF9wYWdlX2luZGV4IC0gMV07CisKKwkJcmVtX2xlbiA9IGxlbmd0aCAtIGJ5dGVzX2NvcGllZDsKKwkJcmVtX3BhZ2VfbGVuID0gUEFHRV9TSVpFIC0gaW9hX2R1bXAtPnBhZ2Vfb2Zmc2V0OworCQljdXJfbGVuID0gbWluKHJlbV9sZW4sIHJlbV9wYWdlX2xlbik7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJaWYgKGlvYV9jZmctPnNkdF9zdGF0ZSA9PSBBQk9SVF9EVU1QKSB7CisJCQlyYyA9IC1FSU87CisJCX0gZWxzZSB7CisJCQlyYyA9IGlwcl9nZXRfbGR1bXBfZGF0YV9zZWN0aW9uKGlvYV9jZmcsCisJCQkJCQkJcGNpX2FkZHJlc3MgKyBieXRlc19jb3BpZWQsCisJCQkJCQkJJnBhZ2VbaW9hX2R1bXAtPnBhZ2Vfb2Zmc2V0IC8gNF0sCisJCQkJCQkJKGN1cl9sZW4gLyBzaXplb2YodTMyKSkpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQlpZiAoIXJjKSB7CisJCQlpb2FfZHVtcC0+cGFnZV9vZmZzZXQgKz0gY3VyX2xlbjsKKwkJCWJ5dGVzX2NvcGllZCArPSBjdXJfbGVuOworCQl9IGVsc2UgeworCQkJaXByX3RyYWNlOworCQkJYnJlYWs7CisJCX0KKwkJc2NoZWR1bGUoKTsKKwl9CisKKwlyZXR1cm4gYnl0ZXNfY29waWVkOworfQorCisvKioKKyAqIGlwcl9pbml0X2R1bXBfZW50cnlfaGRyIC0gSW5pdGlhbGl6ZSBhIGR1bXAgZW50cnkgaGVhZGVyLgorICogQGhkcjoJZHVtcCBlbnRyeSBoZWFkZXIgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vdGhpbmcKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9pbml0X2R1bXBfZW50cnlfaGRyKHN0cnVjdCBpcHJfZHVtcF9lbnRyeV9oZWFkZXIgKmhkcikKK3sKKwloZHItPmV5ZV9jYXRjaGVyID0gSVBSX0RVTVBfRVlFX0NBVENIRVI7CisJaGRyLT5udW1fZWxlbXMgPSAxOworCWhkci0+b2Zmc2V0ID0gc2l6ZW9mKCpoZHIpOworCWhkci0+c3RhdHVzID0gSVBSX0RVTVBfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogaXByX2R1bXBfaW9hX3R5cGVfZGF0YSAtIEZpbGwgaW4gdGhlIGFkYXB0ZXIgdHlwZSBpbiB0aGUgZHVtcC4KKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQGRyaXZlcl9kdW1wOglkcml2ZXIgZHVtcCBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm90aGluZworICoqLworc3RhdGljIHZvaWQgaXByX2R1bXBfaW9hX3R5cGVfZGF0YShzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQkJICAgc3RydWN0IGlwcl9kcml2ZXJfZHVtcCAqZHJpdmVyX2R1bXApCit7CisJc3RydWN0IGlwcl9pbnF1aXJ5X3BhZ2UzICp1Y29kZV92cGQgPSAmaW9hX2NmZy0+dnBkX2Nicy0+cGFnZTNfZGF0YTsKKworCWlwcl9pbml0X2R1bXBfZW50cnlfaGRyKCZkcml2ZXJfZHVtcC0+aW9hX3R5cGVfZW50cnkuaGRyKTsKKwlkcml2ZXJfZHVtcC0+aW9hX3R5cGVfZW50cnkuaGRyLmxlbiA9CisJCXNpemVvZihzdHJ1Y3QgaXByX2R1bXBfaW9hX3R5cGVfZW50cnkpIC0KKwkJc2l6ZW9mKHN0cnVjdCBpcHJfZHVtcF9lbnRyeV9oZWFkZXIpOworCWRyaXZlcl9kdW1wLT5pb2FfdHlwZV9lbnRyeS5oZHIuZGF0YV90eXBlID0gSVBSX0RVTVBfREFUQV9UWVBFX0JJTkFSWTsKKwlkcml2ZXJfZHVtcC0+aW9hX3R5cGVfZW50cnkuaGRyLmlkID0gSVBSX0RVTVBfRFJJVkVSX1RZUEVfSUQ7CisJZHJpdmVyX2R1bXAtPmlvYV90eXBlX2VudHJ5LnR5cGUgPSBpb2FfY2ZnLT50eXBlOworCWRyaXZlcl9kdW1wLT5pb2FfdHlwZV9lbnRyeS5md192ZXJzaW9uID0gKHVjb2RlX3ZwZC0+bWFqb3JfcmVsZWFzZSA8PCAyNCkgfAorCQkodWNvZGVfdnBkLT5jYXJkX3R5cGUgPDwgMTYpIHwgKHVjb2RlX3ZwZC0+bWlub3JfcmVsZWFzZVswXSA8PCA4KSB8CisJCXVjb2RlX3ZwZC0+bWlub3JfcmVsZWFzZVsxXTsKKwlkcml2ZXJfZHVtcC0+aGRyLm51bV9lbnRyaWVzKys7Cit9CisKKy8qKgorICogaXByX2R1bXBfdmVyc2lvbl9kYXRhIC0gRmlsbCBpbiB0aGUgZHJpdmVyIHZlcnNpb24gaW4gdGhlIGR1bXAuCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBkcml2ZXJfZHVtcDoJZHJpdmVyIGR1bXAgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vdGhpbmcKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9kdW1wX3ZlcnNpb25fZGF0YShzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQkJICBzdHJ1Y3QgaXByX2RyaXZlcl9kdW1wICpkcml2ZXJfZHVtcCkKK3sKKwlpcHJfaW5pdF9kdW1wX2VudHJ5X2hkcigmZHJpdmVyX2R1bXAtPnZlcnNpb25fZW50cnkuaGRyKTsKKwlkcml2ZXJfZHVtcC0+dmVyc2lvbl9lbnRyeS5oZHIubGVuID0KKwkJc2l6ZW9mKHN0cnVjdCBpcHJfZHVtcF92ZXJzaW9uX2VudHJ5KSAtCisJCXNpemVvZihzdHJ1Y3QgaXByX2R1bXBfZW50cnlfaGVhZGVyKTsKKwlkcml2ZXJfZHVtcC0+dmVyc2lvbl9lbnRyeS5oZHIuZGF0YV90eXBlID0gSVBSX0RVTVBfREFUQV9UWVBFX0FTQ0lJOworCWRyaXZlcl9kdW1wLT52ZXJzaW9uX2VudHJ5Lmhkci5pZCA9IElQUl9EVU1QX0RSSVZFUl9WRVJTSU9OX0lEOworCXN0cmNweShkcml2ZXJfZHVtcC0+dmVyc2lvbl9lbnRyeS52ZXJzaW9uLCBJUFJfRFJJVkVSX1ZFUlNJT04pOworCWRyaXZlcl9kdW1wLT5oZHIubnVtX2VudHJpZXMrKzsKK30KKworLyoqCisgKiBpcHJfZHVtcF90cmFjZV9kYXRhIC0gRmlsbCBpbiB0aGUgSU9BIHRyYWNlIGluIHRoZSBkdW1wLgorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKiBAZHJpdmVyX2R1bXA6CWRyaXZlciBkdW1wIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub3RoaW5nCisgKiovCitzdGF0aWMgdm9pZCBpcHJfZHVtcF90cmFjZV9kYXRhKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZywKKwkJCQkgICBzdHJ1Y3QgaXByX2RyaXZlcl9kdW1wICpkcml2ZXJfZHVtcCkKK3sKKwlpcHJfaW5pdF9kdW1wX2VudHJ5X2hkcigmZHJpdmVyX2R1bXAtPnRyYWNlX2VudHJ5Lmhkcik7CisJZHJpdmVyX2R1bXAtPnRyYWNlX2VudHJ5Lmhkci5sZW4gPQorCQlzaXplb2Yoc3RydWN0IGlwcl9kdW1wX3RyYWNlX2VudHJ5KSAtCisJCXNpemVvZihzdHJ1Y3QgaXByX2R1bXBfZW50cnlfaGVhZGVyKTsKKwlkcml2ZXJfZHVtcC0+dHJhY2VfZW50cnkuaGRyLmRhdGFfdHlwZSA9IElQUl9EVU1QX0RBVEFfVFlQRV9CSU5BUlk7CisJZHJpdmVyX2R1bXAtPnRyYWNlX2VudHJ5Lmhkci5pZCA9IElQUl9EVU1QX1RSQUNFX0lEOworCW1lbWNweShkcml2ZXJfZHVtcC0+dHJhY2VfZW50cnkudHJhY2UsIGlvYV9jZmctPnRyYWNlLCBJUFJfVFJBQ0VfU0laRSk7CisJZHJpdmVyX2R1bXAtPmhkci5udW1fZW50cmllcysrOworfQorCisvKioKKyAqIGlwcl9kdW1wX2xvY2F0aW9uX2RhdGEgLSBGaWxsIGluIHRoZSBJT0EgbG9jYXRpb24gaW4gdGhlIGR1bXAuCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBkcml2ZXJfZHVtcDoJZHJpdmVyIGR1bXAgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vdGhpbmcKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9kdW1wX2xvY2F0aW9uX2RhdGEoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJCSAgIHN0cnVjdCBpcHJfZHJpdmVyX2R1bXAgKmRyaXZlcl9kdW1wKQoreworCWlwcl9pbml0X2R1bXBfZW50cnlfaGRyKCZkcml2ZXJfZHVtcC0+bG9jYXRpb25fZW50cnkuaGRyKTsKKwlkcml2ZXJfZHVtcC0+bG9jYXRpb25fZW50cnkuaGRyLmxlbiA9CisJCXNpemVvZihzdHJ1Y3QgaXByX2R1bXBfbG9jYXRpb25fZW50cnkpIC0KKwkJc2l6ZW9mKHN0cnVjdCBpcHJfZHVtcF9lbnRyeV9oZWFkZXIpOworCWRyaXZlcl9kdW1wLT5sb2NhdGlvbl9lbnRyeS5oZHIuZGF0YV90eXBlID0gSVBSX0RVTVBfREFUQV9UWVBFX0FTQ0lJOworCWRyaXZlcl9kdW1wLT5sb2NhdGlvbl9lbnRyeS5oZHIuaWQgPSBJUFJfRFVNUF9MT0NBVElPTl9JRDsKKwlzdHJjcHkoZHJpdmVyX2R1bXAtPmxvY2F0aW9uX2VudHJ5LmxvY2F0aW9uLCBpb2FfY2ZnLT5wZGV2LT5kZXYuYnVzX2lkKTsKKwlkcml2ZXJfZHVtcC0+aGRyLm51bV9lbnRyaWVzKys7Cit9CisKKy8qKgorICogaXByX2dldF9pb2FfZHVtcCAtIFBlcmZvcm0gYSBkdW1wIG9mIHRoZSBkcml2ZXIgYW5kIGFkYXB0ZXIuCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBkdW1wOgkJZHVtcCBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm90aGluZworICoqLworc3RhdGljIHZvaWQgaXByX2dldF9pb2FfZHVtcChzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsIHN0cnVjdCBpcHJfZHVtcCAqZHVtcCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIHNkdF93b3JkOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CisJc3RydWN0IGlwcl9kcml2ZXJfZHVtcCAqZHJpdmVyX2R1bXAgPSAmZHVtcC0+ZHJpdmVyX2R1bXA7CisJc3RydWN0IGlwcl9pb2FfZHVtcCAqaW9hX2R1bXAgPSAmZHVtcC0+aW9hX2R1bXA7CisJdTMyIG51bV9lbnRyaWVzLCBzdGFydF9vZmYsIGVuZF9vZmY7CisJdTMyIGJ5dGVzX3RvX2NvcHksIGJ5dGVzX2NvcGllZCwgcmM7CisJc3RydWN0IGlwcl9zZHQgKnNkdDsKKwlpbnQgaTsKKworCUVOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWlmIChpb2FfY2ZnLT5zZHRfc3RhdGUgIT0gR0VUX0RVTVApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJc3RhcnRfYWRkciA9IHJlYWRsKGlvYV9jZmctPmlvYV9tYWlsYm94KTsKKworCWlmICghaXByX3NkdF9pc19mbXQyKHN0YXJ0X2FkZHIpKSB7CisJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwKKwkJCSJJbnZhbGlkIGR1bXAgdGFibGUgZm9ybWF0OiAlbHhcbiIsIHN0YXJ0X2FkZHIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJEdW1wIG9mIElPQSBpbml0aWF0ZWRcbiIpOworCisJZHJpdmVyX2R1bXAtPmhkci5leWVfY2F0Y2hlciA9IElQUl9EVU1QX0VZRV9DQVRDSEVSOworCisJLyogSW5pdGlhbGl6ZSB0aGUgb3ZlcmFsbCBkdW1wIGhlYWRlciAqLworCWRyaXZlcl9kdW1wLT5oZHIubGVuID0gc2l6ZW9mKHN0cnVjdCBpcHJfZHJpdmVyX2R1bXApOworCWRyaXZlcl9kdW1wLT5oZHIubnVtX2VudHJpZXMgPSAxOworCWRyaXZlcl9kdW1wLT5oZHIuZmlyc3RfZW50cnlfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcHJfZHVtcF9oZWFkZXIpOworCWRyaXZlcl9kdW1wLT5oZHIuc3RhdHVzID0gSVBSX0RVTVBfU1RBVFVTX1NVQ0NFU1M7CisJZHJpdmVyX2R1bXAtPmhkci5vcyA9IElQUl9EVU1QX09TX0xJTlVYOworCWRyaXZlcl9kdW1wLT5oZHIuZHJpdmVyX25hbWUgPSBJUFJfRFVNUF9EUklWRVJfTkFNRTsKKworCWlwcl9kdW1wX3ZlcnNpb25fZGF0YShpb2FfY2ZnLCBkcml2ZXJfZHVtcCk7CisJaXByX2R1bXBfbG9jYXRpb25fZGF0YShpb2FfY2ZnLCBkcml2ZXJfZHVtcCk7CisJaXByX2R1bXBfaW9hX3R5cGVfZGF0YShpb2FfY2ZnLCBkcml2ZXJfZHVtcCk7CisJaXByX2R1bXBfdHJhY2VfZGF0YShpb2FfY2ZnLCBkcml2ZXJfZHVtcCk7CisKKwkvKiBVcGRhdGUgZHVtcF9oZWFkZXIgKi8KKwlkcml2ZXJfZHVtcC0+aGRyLmxlbiArPSBzaXplb2Yoc3RydWN0IGlwcl9kdW1wX2VudHJ5X2hlYWRlcik7CisKKwkvKiBJT0EgRHVtcCBlbnRyeSAqLworCWlwcl9pbml0X2R1bXBfZW50cnlfaGRyKCZpb2FfZHVtcC0+aGRyKTsKKwlpb2FfZHVtcC0+Zm9ybWF0ID0gSVBSX1NEVF9GTVQyOworCWlvYV9kdW1wLT5oZHIubGVuID0gMDsKKwlpb2FfZHVtcC0+aGRyLmRhdGFfdHlwZSA9IElQUl9EVU1QX0RBVEFfVFlQRV9CSU5BUlk7CisJaW9hX2R1bXAtPmhkci5pZCA9IElQUl9EVU1QX0lPQV9EVU1QX0lEOworCisJLyogRmlyc3QgZW50cmllcyBpbiBzZHQgYXJlIGFjdHVhbGx5IGEgbGlzdCBvZiBkdW1wIGFkZHJlc3NlcyBhbmQKKwkgbGVuZ3RocyB0byBnYXRoZXIgdGhlIHJlYWwgZHVtcCBkYXRhLiAgc2R0IHJlcHJlc2VudHMgdGhlIHBvaW50ZXIKKwkgdG8gdGhlIGlvYSBnZW5lcmF0ZWQgZHVtcCB0YWJsZS4gIER1bXAgZGF0YSB3aWxsIGJlIGV4dHJhY3RlZCBiYXNlZAorCSBvbiBlbnRyaWVzIGluIHRoaXMgdGFibGUgKi8KKwlzZHQgPSAmaW9hX2R1bXAtPnNkdDsKKworCXJjID0gaXByX2dldF9sZHVtcF9kYXRhX3NlY3Rpb24oaW9hX2NmZywgc3RhcnRfYWRkciwgKF9fYmUzMiAqKXNkdCwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBpcHJfc2R0KSAvIHNpemVvZihfX2JlMzIpKTsKKworCS8qIFNtYXJ0IER1bXAgdGFibGUgaXMgcmVhZHkgdG8gdXNlIGFuZCB0aGUgZmlyc3QgZW50cnkgaXMgdmFsaWQgKi8KKwlpZiAocmMgfHwgKGJlMzJfdG9fY3B1KHNkdC0+aGRyLnN0YXRlKSAhPSBJUFJfRk1UMl9TRFRfUkVBRFlfVE9fVVNFKSkgeworCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsCisJCQkiRHVtcCBvZiBJT0EgZmFpbGVkLiBEdW1wIHRhYmxlIG5vdCB2YWxpZDogJWQsICVYLlxuIiwKKwkJCXJjLCBiZTMyX3RvX2NwdShzZHQtPmhkci5zdGF0ZSkpOworCQlkcml2ZXJfZHVtcC0+aGRyLnN0YXR1cyA9IElQUl9EVU1QX1NUQVRVU19GQUlMRUQ7CisJCWlvYV9jZmctPnNkdF9zdGF0ZSA9IERVTVBfT0JUQUlORUQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCW51bV9lbnRyaWVzID0gYmUzMl90b19jcHUoc2R0LT5oZHIubnVtX2VudHJpZXNfdXNlZCk7CisKKwlpZiAobnVtX2VudHJpZXMgPiBJUFJfTlVNX1NEVF9FTlRSSUVTKQorCQludW1fZW50cmllcyA9IElQUl9OVU1fU0RUX0VOVFJJRVM7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykgeworCQlpZiAoaW9hX2R1bXAtPmhkci5sZW4gPiBJUFJfTUFYX0lPQV9EVU1QX1NJWkUpIHsKKwkJCWRyaXZlcl9kdW1wLT5oZHIuc3RhdHVzID0gSVBSX0RVTVBfU1RBVFVTX1FVQUxfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNkdC0+ZW50cnlbaV0uZmxhZ3MgJiBJUFJfU0RUX1ZBTElEX0VOVFJZKSB7CisJCQlzZHRfd29yZCA9IGJlMzJfdG9fY3B1KHNkdC0+ZW50cnlbaV0uYmFyX3N0cl9vZmZzZXQpOworCQkJc3RhcnRfb2ZmID0gc2R0X3dvcmQgJiBJUFJfRk1UMl9NQlhfQUREUl9NQVNLOworCQkJZW5kX29mZiA9IGJlMzJfdG9fY3B1KHNkdC0+ZW50cnlbaV0uZW5kX29mZnNldCk7CisKKwkJCWlmIChpcHJfc2R0X2lzX2ZtdDIoc2R0X3dvcmQpICYmIHNkdF93b3JkKSB7CisJCQkJYnl0ZXNfdG9fY29weSA9IGVuZF9vZmYgLSBzdGFydF9vZmY7CisJCQkJaWYgKGJ5dGVzX3RvX2NvcHkgPiBJUFJfTUFYX0lPQV9EVU1QX1NJWkUpIHsKKwkJCQkJc2R0LT5lbnRyeVtpXS5mbGFncyAmPSB+SVBSX1NEVF9WQUxJRF9FTlRSWTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJLyogQ29weSBkYXRhIGZyb20gYWRhcHRlciB0byBkcml2ZXIgYnVmZmVycyAqLworCQkJCWJ5dGVzX2NvcGllZCA9IGlwcl9zZHRfY29weShpb2FfY2ZnLCBzZHRfd29yZCwKKwkJCQkJCQkgICAgYnl0ZXNfdG9fY29weSk7CisKKwkJCQlpb2FfZHVtcC0+aGRyLmxlbiArPSBieXRlc19jb3BpZWQ7CisKKwkJCQlpZiAoYnl0ZXNfY29waWVkICE9IGJ5dGVzX3RvX2NvcHkpIHsKKwkJCQkJZHJpdmVyX2R1bXAtPmhkci5zdGF0dXMgPSBJUFJfRFVNUF9TVEFUVVNfUVVBTF9TVUNDRVNTOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJEdW1wIG9mIElPQSBjb21wbGV0ZWQuXG4iKTsKKworCS8qIFVwZGF0ZSBkdW1wX2hlYWRlciAqLworCWRyaXZlcl9kdW1wLT5oZHIubGVuICs9IGlvYV9kdW1wLT5oZHIubGVuOworCXdtYigpOworCWlvYV9jZmctPnNkdF9zdGF0ZSA9IERVTVBfT0JUQUlORUQ7CisJTEVBVkU7Cit9CisKKyNlbHNlCisjZGVmaW5lIGlwcl9nZXRfaW9hX2R1bXAoaW9hX2NmZywgZHVtcCkgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworLyoqCisgKiBpcHJfcmVsZWFzZV9kdW1wIC0gRnJlZSBhZGFwdGVyIGR1bXAgbWVtb3J5CisgKiBAa3JlZjoJa3JlZiBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKglub3RoaW5nCisgKiovCitzdGF0aWMgdm9pZCBpcHJfcmVsZWFzZV9kdW1wKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBpcHJfZHVtcCAqZHVtcCA9IGNvbnRhaW5lcl9vZihrcmVmLHN0cnVjdCBpcHJfZHVtcCxrcmVmKTsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBkdW1wLT5pb2FfY2ZnOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CisJaW50IGk7CisKKwlFTlRFUjsKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCWlvYV9jZmctPmR1bXAgPSBOVUxMOworCWlvYV9jZmctPnNkdF9zdGF0ZSA9IElOQUNUSVZFOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBkdW1wLT5pb2FfZHVtcC5uZXh0X3BhZ2VfaW5kZXg7IGkrKykKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBkdW1wLT5pb2FfZHVtcC5pb2FfZGF0YVtpXSk7CisKKwlrZnJlZShkdW1wKTsKKwlMRUFWRTsKK30KKworLyoqCisgKiBpcHJfd29ya2VyX3RocmVhZCAtIFdvcmtlciB0aHJlYWQKKyAqIEBkYXRhOgkJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqCisgKiBDYWxsZWQgYXQgdGFzayBsZXZlbCBmcm9tIGEgd29yayB0aHJlYWQuIFRoaXMgZnVuY3Rpb24gdGFrZXMgY2FyZQorICogb2YgYWRkaW5nIGFuZCByZW1vdmluZyBkZXZpY2UgZnJvbSB0aGUgbWlkLWxheWVyIGFzIGNvbmZpZ3VyYXRpb24KKyAqIGNoYW5nZXMgYXJlIGRldGVjdGVkIGJ5IHRoZSBhZGFwdGVyLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub3RoaW5nCisgKiovCitzdGF0aWMgdm9pZCBpcHJfd29ya2VyX3RocmVhZCh2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKKwlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXM7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCXN0cnVjdCBpcHJfZHVtcCAqZHVtcDsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBkYXRhOworCXU4IGJ1cywgdGFyZ2V0LCBsdW47CisJaW50IGRpZF93b3JrOworCisJRU5URVI7CisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWlmIChpb2FfY2ZnLT5zZHRfc3RhdGUgPT0gR0VUX0RVTVApIHsKKwkJZHVtcCA9IGlvYV9jZmctPmR1bXA7CisJCWlmICghZHVtcCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJCWtyZWZfZ2V0KCZkdW1wLT5rcmVmKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCQlpcHJfZ2V0X2lvYV9kdW1wKGlvYV9jZmcsIGR1bXApOworCQlrcmVmX3B1dCgmZHVtcC0+a3JlZiwgaXByX3JlbGVhc2VfZHVtcCk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJaWYgKGlvYV9jZmctPnNkdF9zdGF0ZSA9PSBEVU1QX09CVEFJTkVEKQorCQkJaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBJUFJfU0hVVERPV05fTk9ORSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworcmVzdGFydDoKKwlkbyB7CisJCWRpZF93b3JrID0gMDsKKwkJaWYgKCFpb2FfY2ZnLT5hbGxvd19jbWRzIHx8ICFpb2FfY2ZnLT5hbGxvd19tbF9hZGRfZGVsKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJCQlyZXR1cm47CisJCX0KKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcywgJmlvYV9jZmctPnVzZWRfcmVzX3EsIHF1ZXVlKSB7CisJCQlpZiAocmVzLT5kZWxfZnJvbV9tbCAmJiByZXMtPnNkZXYpIHsKKwkJCQlkaWRfd29yayA9IDE7CisJCQkJc2RldiA9IHJlcy0+c2RldjsKKwkJCQlpZiAoIXNjc2lfZGV2aWNlX2dldChzZGV2KSkgeworCQkJCQlyZXMtPnNkZXYgPSBOVUxMOworCQkJCQlsaXN0X21vdmVfdGFpbCgmcmVzLT5xdWV1ZSwgJmlvYV9jZmctPmZyZWVfcmVzX3EpOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJCQkJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2KTsKKwkJCQkJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOworCQkJCQlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gd2hpbGUoZGlkX3dvcmspOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXMsICZpb2FfY2ZnLT51c2VkX3Jlc19xLCBxdWV1ZSkgeworCQlpZiAocmVzLT5hZGRfdG9fbWwpIHsKKwkJCWJ1cyA9IHJlcy0+Y2ZndGUucmVzX2FkZHIuYnVzOworCQkJdGFyZ2V0ID0gcmVzLT5jZmd0ZS5yZXNfYWRkci50YXJnZXQ7CisJCQlsdW4gPSByZXMtPmNmZ3RlLnJlc19hZGRyLmx1bjsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCXNjc2lfYWRkX2RldmljZShpb2FfY2ZnLT5ob3N0LCBidXMsIHRhcmdldCwgbHVuKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJa29iamVjdF91ZXZlbnQoJmlvYV9jZmctPmhvc3QtPnNob3N0X2NsYXNzZGV2LmtvYmosIEtPQkpfQ0hBTkdFLCBOVUxMKTsKKwlMRUFWRTsKK30KKworI2lmZGVmIENPTkZJR19TQ1NJX0lQUl9UUkFDRQorLyoqCisgKiBpcHJfcmVhZF90cmFjZSAtIER1bXAgdGhlIGFkYXB0ZXIgdHJhY2UKKyAqIEBrb2JqOgkJa29iamVjdCBzdHJ1Y3QKKyAqIEBidWY6CQlidWZmZXIKKyAqIEBvZmY6CQlvZmZzZXQKKyAqIEBjb3VudDoJCWJ1ZmZlciBzaXplCisgKgorICogUmV0dXJuIHZhbHVlOgorICoJbnVtYmVyIG9mIGJ5dGVzIHByaW50ZWQgdG8gYnVmZmVyCisgKiovCitzdGF0aWMgc3NpemVfdCBpcHJfcmVhZF90cmFjZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLAorCQkJICAgICAgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYgPSBjb250YWluZXJfb2Yoa29iaixzdHJ1Y3QgY2xhc3NfZGV2aWNlLGtvYmopOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gKHN0cnVjdCBpcHJfaW9hX2NmZyAqKXNob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MgPSAwOworCWludCBzaXplID0gSVBSX1RSQUNFX1NJWkU7CisJY2hhciAqc3JjID0gKGNoYXIgKilpb2FfY2ZnLT50cmFjZTsKKworCWlmIChvZmYgPiBzaXplKQorCQlyZXR1cm4gMDsKKwlpZiAob2ZmICsgY291bnQgPiBzaXplKSB7CisJCXNpemUgLT0gb2ZmOworCQljb3VudCA9IHNpemU7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwltZW1jcHkoYnVmLCAmc3JjW29mZl0sIGNvdW50KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgaXByX3RyYWNlX2F0dHIgPSB7CisJLmF0dHIgPQl7CisJCS5uYW1lID0gInRyYWNlIiwKKwkJLm1vZGUgPSBTX0lSVUdPLAorCX0sCisJLnNpemUgPSAwLAorCS5yZWFkID0gaXByX3JlYWRfdHJhY2UsCit9OworI2VuZGlmCisKKy8qKgorICogaXByX3Nob3dfZndfdmVyc2lvbiAtIFNob3cgdGhlIGZpcm13YXJlIHZlcnNpb24KKyAqIEBjbGFzc19kZXY6CWNsYXNzIGRldmljZSBzdHJ1Y3QKKyAqIEBidWY6CQlidWZmZXIKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKgludW1iZXIgb2YgYnl0ZXMgcHJpbnRlZCB0byBidWZmZXIKKyAqKi8KK3N0YXRpYyBzc2l6ZV90IGlwcl9zaG93X2Z3X3ZlcnNpb24oc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjbGFzc19kZXYpOworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IChzdHJ1Y3QgaXByX2lvYV9jZmcgKilzaG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IGlwcl9pbnF1aXJ5X3BhZ2UzICp1Y29kZV92cGQgPSAmaW9hX2NmZy0+dnBkX2Nicy0+cGFnZTNfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MgPSAwOworCWludCBsZW47CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJTAyWCUwMlglMDJYJTAyWFxuIiwKKwkJICAgICAgIHVjb2RlX3ZwZC0+bWFqb3JfcmVsZWFzZSwgdWNvZGVfdnBkLT5jYXJkX3R5cGUsCisJCSAgICAgICB1Y29kZV92cGQtPm1pbm9yX3JlbGVhc2VbMF0sCisJCSAgICAgICB1Y29kZV92cGQtPm1pbm9yX3JlbGVhc2VbMV0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgaXByX2Z3X3ZlcnNpb25fYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPQkJImZ3X3ZlcnNpb24iLAorCQkubW9kZSA9CQlTX0lSVUdPLAorCX0sCisJLnNob3cgPSBpcHJfc2hvd19md192ZXJzaW9uLAorfTsKKworLyoqCisgKiBpcHJfc2hvd19sb2dfbGV2ZWwgLSBTaG93IHRoZSBhZGFwdGVyJ3MgZXJyb3IgbG9nZ2luZyBsZXZlbAorICogQGNsYXNzX2RldjoJY2xhc3MgZGV2aWNlIHN0cnVjdAorICogQGJ1ZjoJCWJ1ZmZlcgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAludW1iZXIgb2YgYnl0ZXMgcHJpbnRlZCB0byBidWZmZXIKKyAqKi8KK3N0YXRpYyBzc2l6ZV90IGlwcl9zaG93X2xvZ19sZXZlbChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGNsYXNzX2Rldik7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gKHN0cnVjdCBpcHJfaW9hX2NmZyAqKXNob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MgPSAwOworCWludCBsZW47CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGlvYV9jZmctPmxvZ19sZXZlbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCXJldHVybiBsZW47Cit9CisKKy8qKgorICogaXByX3N0b3JlX2xvZ19sZXZlbCAtIENoYW5nZSB0aGUgYWRhcHRlcidzIGVycm9yIGxvZ2dpbmcgbGV2ZWwKKyAqIEBjbGFzc19kZXY6CWNsYXNzIGRldmljZSBzdHJ1Y3QKKyAqIEBidWY6CQlidWZmZXIKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbnVtYmVyIG9mIGJ5dGVzIHByaW50ZWQgdG8gYnVmZmVyCisgKiovCitzdGF0aWMgc3NpemVfdCBpcHJfc3RvcmVfbG9nX2xldmVsKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwKKwkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGNsYXNzX2Rldik7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gKHN0cnVjdCBpcHJfaW9hX2NmZyAqKXNob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlpb2FfY2ZnLT5sb2dfbGV2ZWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJcmV0dXJuIHN0cmxlbihidWYpOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgaXByX2xvZ19sZXZlbF9hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9CQkibG9nX2xldmVsIiwKKwkJLm1vZGUgPQkJU19JUlVHTyB8IFNfSVdVU1IsCisJfSwKKwkuc2hvdyA9IGlwcl9zaG93X2xvZ19sZXZlbCwKKwkuc3RvcmUgPSBpcHJfc3RvcmVfbG9nX2xldmVsCit9OworCisvKioKKyAqIGlwcl9zdG9yZV9kaWFnbm9zdGljcyAtIElPQSBEaWFnbm9zdGljcyBpbnRlcmZhY2UKKyAqIEBjbGFzc19kZXY6CWNsYXNzX2RldmljZSBzdHJ1Y3QKKyAqIEBidWY6CQlidWZmZXIKKyAqIEBjb3VudDoJCWJ1ZmZlciBzaXplCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHJlc2V0IHRoZSBhZGFwdGVyIGFuZCB3YWl0IGEgcmVhc29uYWJsZQorICogYW1vdW50IG9mIHRpbWUgZm9yIGFueSBlcnJvcnMgdGhhdCB0aGUgYWRhcHRlciBtaWdodCBsb2cuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCWNvdW50IG9uIHN1Y2Nlc3MgLyBvdGhlciBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgc3NpemVfdCBpcHJfc3RvcmVfZGlhZ25vc3RpY3Moc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjbGFzc19kZXYpOworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IChzdHJ1Y3QgaXByX2lvYV9jZmcgKilzaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzID0gMDsKKwlpbnQgcmMgPSBjb3VudDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwl3YWl0X2V2ZW50KGlvYV9jZmctPnJlc2V0X3dhaXRfcSwgIWlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlpb2FfY2ZnLT5lcnJvcnNfbG9nZ2VkID0gMDsKKwlpcHJfaW5pdGlhdGVfaW9hX3Jlc2V0KGlvYV9jZmcsIElQUl9TSFVURE9XTl9OT1JNQUwpOworCisJaWYgKGlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJCXdhaXRfZXZlbnQoaW9hX2NmZy0+cmVzZXRfd2FpdF9xLCAhaW9hX2NmZy0+aW5fcmVzZXRfcmVsb2FkKTsKKworCQkvKiBXYWl0IGZvciBhIHNlY29uZCBmb3IgYW55IGVycm9ycyB0byBiZSBsb2dnZWQgKi8KKwkJbXNsZWVwKDEwMDApOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlpZiAoaW9hX2NmZy0+aW5fcmVzZXRfcmVsb2FkIHx8IGlvYV9jZmctPmVycm9yc19sb2dnZWQpCisJCXJjID0gLUVJTzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBpcHJfZGlhZ25vc3RpY3NfYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPQkJInJ1bl9kaWFnbm9zdGljcyIsCisJCS5tb2RlID0JCVNfSVdVU1IsCisJfSwKKwkuc3RvcmUgPSBpcHJfc3RvcmVfZGlhZ25vc3RpY3MKK307CisKKy8qKgorICogaXByX3N0b3JlX3Jlc2V0X2FkYXB0ZXIgLSBSZXNldCB0aGUgYWRhcHRlcgorICogQGNsYXNzX2RldjoJY2xhc3NfZGV2aWNlIHN0cnVjdAorICogQGJ1ZjoJCWJ1ZmZlcgorICogQGNvdW50OgkJYnVmZmVyIHNpemUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXQgdGhlIGFkYXB0ZXIuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCWNvdW50IG9uIHN1Y2Nlc3MgLyBvdGhlciBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgc3NpemVfdCBpcHJfc3RvcmVfcmVzZXRfYWRhcHRlcihzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopc2hvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKKwlpbnQgcmVzdWx0ID0gY291bnQ7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRUFDQ0VTOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlpZiAoIWlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCkKKwkJaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBJUFJfU0hVVERPV05fTk9STUFMKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJd2FpdF9ldmVudChpb2FfY2ZnLT5yZXNldF93YWl0X3EsICFpb2FfY2ZnLT5pbl9yZXNldF9yZWxvYWQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlIGlwcl9pb2FfcmVzZXRfYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPQkJInJlc2V0X2hvc3QiLAorCQkubW9kZSA9CQlTX0lXVVNSLAorCX0sCisJLnN0b3JlID0gaXByX3N0b3JlX3Jlc2V0X2FkYXB0ZXIKK307CisKKy8qKgorICogaXByX2FsbG9jX3Vjb2RlX2J1ZmZlciAtIEFsbG9jYXRlcyBhIG1pY3JvY29kZSBkb3dubG9hZCBidWZmZXIKKyAqIEBidWZfbGVuOgkJYnVmZmVyIGxlbmd0aAorICoKKyAqIEFsbG9jYXRlcyBhIERNQSdhYmxlIGJ1ZmZlciBpbiBjaHVua3MgYW5kIGFzc2VtYmxlcyBhIHNjYXR0ZXIvZ2F0aGVyCisgKiBsaXN0IHRvIHVzZSBmb3IgbWljcm9jb2RlIGRvd25sb2FkCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCXBvaW50ZXIgdG8gc2dsaXN0IC8gTlVMTCBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgc3RydWN0IGlwcl9zZ2xpc3QgKmlwcl9hbGxvY191Y29kZV9idWZmZXIoaW50IGJ1Zl9sZW4pCit7CisJaW50IHNnX3NpemUsIG9yZGVyLCBic2l6ZV9lbGVtLCBudW1fZWxlbSwgaSwgajsKKwlzdHJ1Y3QgaXByX3NnbGlzdCAqc2dsaXN0OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2NhdHRlcmxpc3Q7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkvKiBHZXQgdGhlIG1pbmltdW0gc2l6ZSBwZXIgc2NhdHRlci9nYXRoZXIgZWxlbWVudCAqLworCXNnX3NpemUgPSBidWZfbGVuIC8gKElQUl9NQVhfU0dMSVNUIC0gMSk7CisKKwkvKiBHZXQgdGhlIGFjdHVhbCBzaXplIHBlciBlbGVtZW50ICovCisJb3JkZXIgPSBnZXRfb3JkZXIoc2dfc2l6ZSk7CisKKwkvKiBEZXRlcm1pbmUgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgcGVyIGVsZW1lbnQgKi8KKwlic2l6ZV9lbGVtID0gUEFHRV9TSVpFICogKDEgPDwgb3JkZXIpOworCisJLyogRGV0ZXJtaW5lIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHNnIGVudHJpZXMgbmVlZGVkICovCisJaWYgKGJ1Zl9sZW4gJSBic2l6ZV9lbGVtKQorCQludW1fZWxlbSA9IChidWZfbGVuIC8gYnNpemVfZWxlbSkgKyAxOworCWVsc2UKKwkJbnVtX2VsZW0gPSBidWZfbGVuIC8gYnNpemVfZWxlbTsKKworCS8qIEFsbG9jYXRlIGEgc2NhdHRlci9nYXRoZXIgbGlzdCBmb3IgdGhlIERNQSAqLworCXNnbGlzdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcHJfc2dsaXN0KSArCisJCQkgKHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpICogKG51bV9lbGVtIC0gMSkpLAorCQkJIEdGUF9LRVJORUwpOworCisJaWYgKHNnbGlzdCA9PSBOVUxMKSB7CisJCWlwcl90cmFjZTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHNnbGlzdCwgMCwgc2l6ZW9mKHN0cnVjdCBpcHJfc2dsaXN0KSArCisJICAgICAgIChzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSAqIChudW1fZWxlbSAtIDEpKSk7CisKKwlzY2F0dGVybGlzdCA9IHNnbGlzdC0+c2NhdHRlcmxpc3Q7CisKKwlzZ2xpc3QtPm9yZGVyID0gb3JkZXI7CisJc2dsaXN0LT5udW1fc2cgPSBudW1fZWxlbTsKKworCS8qIEFsbG9jYXRlIGEgYnVuY2ggb2Ygc2cgZWxlbWVudHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VsZW07IGkrKykgeworCQlwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCwgb3JkZXIpOworCQlpZiAoIXBhZ2UpIHsKKwkJCWlwcl90cmFjZTsKKworCQkJLyogRnJlZSB1cCB3aGF0IHdlIGFscmVhZHkgYWxsb2NhdGVkICovCisJCQlmb3IgKGogPSBpIC0gMTsgaiA+PSAwOyBqLS0pCisJCQkJX19mcmVlX3BhZ2VzKHNjYXR0ZXJsaXN0W2pdLnBhZ2UsIG9yZGVyKTsKKwkJCWtmcmVlKHNnbGlzdCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCXNjYXR0ZXJsaXN0W2ldLnBhZ2UgPSBwYWdlOworCX0KKworCXJldHVybiBzZ2xpc3Q7Cit9CisKKy8qKgorICogaXByX2ZyZWVfdWNvZGVfYnVmZmVyIC0gRnJlZXMgYSBtaWNyb2NvZGUgZG93bmxvYWQgYnVmZmVyCisgKiBAcF9kbmxkOgkJc2NhdHRlci9nYXRoZXIgbGlzdCBwb2ludGVyCisgKgorICogRnJlZSBhIERNQSdhYmxlIHVjb2RlIGRvd25sb2FkIGJ1ZmZlciBwcmV2aW91c2x5IGFsbG9jYXRlZCB3aXRoCisgKiBpcHJfYWxsb2NfdWNvZGVfYnVmZmVyCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vdGhpbmcKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9mcmVlX3Vjb2RlX2J1ZmZlcihzdHJ1Y3QgaXByX3NnbGlzdCAqc2dsaXN0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNnbGlzdC0+bnVtX3NnOyBpKyspCisJCV9fZnJlZV9wYWdlcyhzZ2xpc3QtPnNjYXR0ZXJsaXN0W2ldLnBhZ2UsIHNnbGlzdC0+b3JkZXIpOworCisJa2ZyZWUoc2dsaXN0KTsKK30KKworLyoqCisgKiBpcHJfY29weV91Y29kZV9idWZmZXIgLSBDb3B5IHVzZXIgYnVmZmVyIHRvIGtlcm5lbCBidWZmZXIKKyAqIEBzZ2xpc3Q6CQlzY2F0dGVyL2dhdGhlciBsaXN0IHBvaW50ZXIKKyAqIEBidWZmZXI6CQlidWZmZXIgcG9pbnRlcgorICogQGxlbjoJCWJ1ZmZlciBsZW5ndGgKKyAqCisgKiBDb3B5IGEgbWljcm9jb2RlIGltYWdlIGZyb20gYSB1c2VyIGJ1ZmZlciBpbnRvIGEgYnVmZmVyIGFsbG9jYXRlZCBieQorICogaXByX2FsbG9jX3Vjb2RlX2J1ZmZlcgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkwIG9uIHN1Y2Nlc3MgLyBvdGhlciBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgaW50IGlwcl9jb3B5X3Vjb2RlX2J1ZmZlcihzdHJ1Y3QgaXByX3NnbGlzdCAqc2dsaXN0LAorCQkJCSB1OCAqYnVmZmVyLCB1MzIgbGVuKQoreworCWludCBic2l6ZV9lbGVtLCBpLCByZXN1bHQgPSAwOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2NhdHRlcmxpc3Q7CisJdm9pZCAqa2FkZHI7CisKKwkvKiBEZXRlcm1pbmUgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgcGVyIGVsZW1lbnQgKi8KKwlic2l6ZV9lbGVtID0gUEFHRV9TSVpFICogKDEgPDwgc2dsaXN0LT5vcmRlcik7CisKKwlzY2F0dGVybGlzdCA9IHNnbGlzdC0+c2NhdHRlcmxpc3Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgKGxlbiAvIGJzaXplX2VsZW0pOyBpKyssIGJ1ZmZlciArPSBic2l6ZV9lbGVtKSB7CisJCWthZGRyID0ga21hcChzY2F0dGVybGlzdFtpXS5wYWdlKTsKKwkJbWVtY3B5KGthZGRyLCBidWZmZXIsIGJzaXplX2VsZW0pOworCQlrdW5tYXAoc2NhdHRlcmxpc3RbaV0ucGFnZSk7CisKKwkJc2NhdHRlcmxpc3RbaV0ubGVuZ3RoID0gYnNpemVfZWxlbTsKKworCQlpZiAocmVzdWx0ICE9IDApIHsKKwkJCWlwcl90cmFjZTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwl9CisKKwlpZiAobGVuICUgYnNpemVfZWxlbSkgeworCQlrYWRkciA9IGttYXAoc2NhdHRlcmxpc3RbaV0ucGFnZSk7CisJCW1lbWNweShrYWRkciwgYnVmZmVyLCBsZW4gJSBic2l6ZV9lbGVtKTsKKwkJa3VubWFwKHNjYXR0ZXJsaXN0W2ldLnBhZ2UpOworCisJCXNjYXR0ZXJsaXN0W2ldLmxlbmd0aCA9IGxlbiAlIGJzaXplX2VsZW07CisJfQorCisJc2dsaXN0LT5idWZmZXJfbGVuID0gbGVuOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogaXByX21hcF91Y29kZV9idWZmZXIgLSBNYXAgYSBtaWNyb2NvZGUgZG93bmxvYWQgYnVmZmVyCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKiBAc2dsaXN0OgkJc2NhdHRlci9nYXRoZXIgbGlzdAorICogQGxlbjoJCXRvdGFsIGxlbmd0aCBvZiBkb3dubG9hZCBidWZmZXIKKyAqCisgKiBNYXBzIGEgbWljcm9jb2RlIGRvd25sb2FkIHNjYXR0ZXIvZ2F0aGVyIGxpc3QgZm9yIERNQSBhbmQKKyAqIGJ1aWxkcyB0aGUgSU9BREwuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTAgb24gc3VjY2VzcyAvIC1FSU8gb24gZmFpbHVyZQorICoqLworc3RhdGljIGludCBpcHJfbWFwX3Vjb2RlX2J1ZmZlcihzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQsCisJCQkJc3RydWN0IGlwcl9zZ2xpc3QgKnNnbGlzdCwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCXN0cnVjdCBpcHJfaW9hcmNiICppb2FyY2IgPSAmaXByX2NtZC0+aW9hcmNiOworCXN0cnVjdCBpcHJfaW9hZGxfZGVzYyAqaW9hZGwgPSBpcHJfY21kLT5pb2FkbDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNjYXR0ZXJsaXN0ID0gc2dsaXN0LT5zY2F0dGVybGlzdDsKKwlpbnQgaTsKKworCWlwcl9jbWQtPmRtYV91c2Vfc2cgPSBwY2lfbWFwX3NnKGlvYV9jZmctPnBkZXYsIHNjYXR0ZXJsaXN0LAorCQkJCQkgc2dsaXN0LT5udW1fc2csIERNQV9UT19ERVZJQ0UpOworCisJaW9hcmNiLT5jbWRfcGt0LmZsYWdzX2hpIHw9IElQUl9GTEFHU19ISV9XUklURV9OT1RfUkVBRDsKKwlpb2FyY2ItPndyaXRlX2RhdGFfdHJhbnNmZXJfbGVuZ3RoID0gY3B1X3RvX2JlMzIobGVuKTsKKwlpb2FyY2ItPndyaXRlX2lvYWRsX2xlbiA9CisJCWNwdV90b19iZTMyKHNpemVvZihzdHJ1Y3QgaXByX2lvYWRsX2Rlc2MpICogaXByX2NtZC0+ZG1hX3VzZV9zZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaXByX2NtZC0+ZG1hX3VzZV9zZzsgaSsrKSB7CisJCWlvYWRsW2ldLmZsYWdzX2FuZF9kYXRhX2xlbiA9CisJCQljcHVfdG9fYmUzMihJUFJfSU9BRExfRkxBR1NfV1JJVEUgfCBzZ19kbWFfbGVuKCZzY2F0dGVybGlzdFtpXSkpOworCQlpb2FkbFtpXS5hZGRyZXNzID0KKwkJCWNwdV90b19iZTMyKHNnX2RtYV9hZGRyZXNzKCZzY2F0dGVybGlzdFtpXSkpOworCX0KKworCWlmIChsaWtlbHkoaXByX2NtZC0+ZG1hX3VzZV9zZykpIHsKKwkJaW9hZGxbaS0xXS5mbGFnc19hbmRfZGF0YV9sZW4gfD0KKwkJCWNwdV90b19iZTMyKElQUl9JT0FETF9GTEFHU19MQVNUKTsKKwl9CisJZWxzZSB7CisJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwgInBjaV9tYXBfc2cgZmFpbGVkIVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlwcl9zdG9yZV91cGRhdGVfZncgLSBVcGRhdGUgdGhlIGZpcm13YXJlIG9uIHRoZSBhZGFwdGVyCisgKiBAY2xhc3NfZGV2OgljbGFzc19kZXZpY2Ugc3RydWN0CisgKiBAYnVmOgkJYnVmZmVyCisgKiBAY291bnQ6CQlidWZmZXIgc2l6ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCB1cGRhdGUgdGhlIGZpcm13YXJlIG9uIHRoZSBhZGFwdGVyLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAljb3VudCBvbiBzdWNjZXNzIC8gb3RoZXIgb24gZmFpbHVyZQorICoqLworc3RhdGljIHNzaXplX3QgaXByX3N0b3JlX3VwZGF0ZV9mdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopc2hvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBpcHJfdWNvZGVfaW1hZ2VfaGVhZGVyICppbWFnZV9oZHI7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeTsKKwlzdHJ1Y3QgaXByX3NnbGlzdCAqc2dsaXN0OworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKKwljaGFyIGZuYW1lWzEwMF07CisJY2hhciAqc3JjOworCWludCBsZW4sIHJlc3VsdCwgZG5sZF9zaXplOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCWxlbiA9IHNucHJpbnRmKGZuYW1lLCA5OSwgIiVzIiwgYnVmKTsKKwlmbmFtZVtsZW4tMV0gPSAnXDAnOworCisJaWYocmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksIGZuYW1lLCAmaW9hX2NmZy0+cGRldi0+ZGV2KSkgeworCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJGaXJtd2FyZSBmaWxlICVzIG5vdCBmb3VuZFxuIiwgZm5hbWUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpbWFnZV9oZHIgPSAoc3RydWN0IGlwcl91Y29kZV9pbWFnZV9oZWFkZXIgKilmd19lbnRyeS0+ZGF0YTsKKworCWlmIChiZTMyX3RvX2NwdShpbWFnZV9oZHItPmhlYWRlcl9sZW5ndGgpID4gZndfZW50cnktPnNpemUgfHwKKwkgICAgKGlvYV9jZmctPnZwZF9jYnMtPnBhZ2UzX2RhdGEuY2FyZF90eXBlICYmCisJICAgICBpb2FfY2ZnLT52cGRfY2JzLT5wYWdlM19kYXRhLmNhcmRfdHlwZSAhPSBpbWFnZV9oZHItPmNhcmRfdHlwZSkpIHsKKwkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LCAiSW52YWxpZCBtaWNyb2NvZGUgYnVmZmVyXG4iKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNyYyA9ICh1OCAqKWltYWdlX2hkciArIGJlMzJfdG9fY3B1KGltYWdlX2hkci0+aGVhZGVyX2xlbmd0aCk7CisJZG5sZF9zaXplID0gZndfZW50cnktPnNpemUgLSBiZTMyX3RvX2NwdShpbWFnZV9oZHItPmhlYWRlcl9sZW5ndGgpOworCXNnbGlzdCA9IGlwcl9hbGxvY191Y29kZV9idWZmZXIoZG5sZF9zaXplKTsKKworCWlmICghc2dsaXN0KSB7CisJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwgIk1pY3JvY29kZSBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmVzdWx0ID0gaXByX2NvcHlfdWNvZGVfYnVmZmVyKHNnbGlzdCwgc3JjLCBkbmxkX3NpemUpOworCisJaWYgKHJlc3VsdCkgeworCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsCisJCQkiTWljcm9jb2RlIGJ1ZmZlciBjb3B5IHRvIERNQSBidWZmZXIgZmFpbGVkXG4iKTsKKwkJaXByX2ZyZWVfdWNvZGVfYnVmZmVyKHNnbGlzdCk7CisJCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisKKwlpZiAoaW9hX2NmZy0+dWNvZGVfc2dsaXN0KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LAorCQkJIk1pY3JvY29kZSBkb3dubG9hZCBhbHJlYWR5IGluIHByb2dyZXNzXG4iKTsKKwkJaXByX2ZyZWVfdWNvZGVfYnVmZmVyKHNnbGlzdCk7CisJCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpb2FfY2ZnLT51Y29kZV9zZ2xpc3QgPSBzZ2xpc3Q7CisJaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBJUFJfU0hVVERPV05fTk9STUFMKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJd2FpdF9ldmVudChpb2FfY2ZnLT5yZXNldF93YWl0X3EsICFpb2FfY2ZnLT5pbl9yZXNldF9yZWxvYWQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlpb2FfY2ZnLT51Y29kZV9zZ2xpc3QgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWlwcl9mcmVlX3Vjb2RlX2J1ZmZlcihzZ2xpc3QpOworCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgaXByX3VwZGF0ZV9md19hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9CQkidXBkYXRlX2Z3IiwKKwkJLm1vZGUgPQkJU19JV1VTUiwKKwl9LAorCS5zdG9yZSA9IGlwcl9zdG9yZV91cGRhdGVfZncKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqaXByX2lvYV9hdHRyc1tdID0geworCSZpcHJfZndfdmVyc2lvbl9hdHRyLAorCSZpcHJfbG9nX2xldmVsX2F0dHIsCisJJmlwcl9kaWFnbm9zdGljc19hdHRyLAorCSZpcHJfaW9hX3Jlc2V0X2F0dHIsCisJJmlwcl91cGRhdGVfZndfYXR0ciwKKwlOVUxMLAorfTsKKworI2lmZGVmIENPTkZJR19TQ1NJX0lQUl9EVU1QCisvKioKKyAqIGlwcl9yZWFkX2R1bXAgLSBEdW1wIHRoZSBhZGFwdGVyCisgKiBAa29iajoJCWtvYmplY3Qgc3RydWN0CisgKiBAYnVmOgkJYnVmZmVyCisgKiBAb2ZmOgkJb2Zmc2V0CisgKiBAY291bnQ6CQlidWZmZXIgc2l6ZQorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCW51bWJlciBvZiBieXRlcyBwcmludGVkIHRvIGJ1ZmZlcgorICoqLworc3RhdGljIHNzaXplX3QgaXByX3JlYWRfZHVtcChzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLAorCQkJICAgICAgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYgPSBjb250YWluZXJfb2Yoa29iaixzdHJ1Y3QgY2xhc3NfZGV2aWNlLGtvYmopOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gKHN0cnVjdCBpcHJfaW9hX2NmZyAqKXNob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgaXByX2R1bXAgKmR1bXA7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzID0gMDsKKwljaGFyICpzcmM7CisJaW50IGxlbjsKKwlzaXplX3QgcmMgPSBjb3VudDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCWR1bXAgPSBpb2FfY2ZnLT5kdW1wOworCisJaWYgKGlvYV9jZmctPnNkdF9zdGF0ZSAhPSBEVU1QX09CVEFJTkVEIHx8ICFkdW1wKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCWtyZWZfZ2V0KCZkdW1wLT5rcmVmKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisKKwlpZiAob2ZmID4gZHVtcC0+ZHJpdmVyX2R1bXAuaGRyLmxlbikgeworCQlrcmVmX3B1dCgmZHVtcC0+a3JlZiwgaXByX3JlbGVhc2VfZHVtcCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChvZmYgKyBjb3VudCA+IGR1bXAtPmRyaXZlcl9kdW1wLmhkci5sZW4pIHsKKwkJY291bnQgPSBkdW1wLT5kcml2ZXJfZHVtcC5oZHIubGVuIC0gb2ZmOworCQlyYyA9IGNvdW50OworCX0KKworCWlmIChjb3VudCAmJiBvZmYgPCBzaXplb2YoZHVtcC0+ZHJpdmVyX2R1bXApKSB7CisJCWlmIChvZmYgKyBjb3VudCA+IHNpemVvZihkdW1wLT5kcml2ZXJfZHVtcCkpCisJCQlsZW4gPSBzaXplb2YoZHVtcC0+ZHJpdmVyX2R1bXApIC0gb2ZmOworCQllbHNlCisJCQlsZW4gPSBjb3VudDsKKwkJc3JjID0gKHU4ICopJmR1bXAtPmRyaXZlcl9kdW1wICsgb2ZmOworCQltZW1jcHkoYnVmLCBzcmMsIGxlbik7CisJCWJ1ZiArPSBsZW47CisJCW9mZiArPSBsZW47CisJCWNvdW50IC09IGxlbjsKKwl9CisKKwlvZmYgLT0gc2l6ZW9mKGR1bXAtPmRyaXZlcl9kdW1wKTsKKworCWlmIChjb3VudCAmJiBvZmYgPCBvZmZzZXRvZihzdHJ1Y3QgaXByX2lvYV9kdW1wLCBpb2FfZGF0YSkpIHsKKwkJaWYgKG9mZiArIGNvdW50ID4gb2Zmc2V0b2Yoc3RydWN0IGlwcl9pb2FfZHVtcCwgaW9hX2RhdGEpKQorCQkJbGVuID0gb2Zmc2V0b2Yoc3RydWN0IGlwcl9pb2FfZHVtcCwgaW9hX2RhdGEpIC0gb2ZmOworCQllbHNlCisJCQlsZW4gPSBjb3VudDsKKwkJc3JjID0gKHU4ICopJmR1bXAtPmlvYV9kdW1wICsgb2ZmOworCQltZW1jcHkoYnVmLCBzcmMsIGxlbik7CisJCWJ1ZiArPSBsZW47CisJCW9mZiArPSBsZW47CisJCWNvdW50IC09IGxlbjsKKwl9CisKKwlvZmYgLT0gb2Zmc2V0b2Yoc3RydWN0IGlwcl9pb2FfZHVtcCwgaW9hX2RhdGEpOworCisJd2hpbGUgKGNvdW50KSB7CisJCWlmICgob2ZmICYgUEFHRV9NQVNLKSAhPSAoKG9mZiArIGNvdW50KSAmIFBBR0VfTUFTSykpCisJCQlsZW4gPSBQQUdFX0FMSUdOKG9mZikgLSBvZmY7CisJCWVsc2UKKwkJCWxlbiA9IGNvdW50OworCQlzcmMgPSAodTggKilkdW1wLT5pb2FfZHVtcC5pb2FfZGF0YVsob2ZmICYgUEFHRV9NQVNLKSA+PiBQQUdFX1NISUZUXTsKKwkJc3JjICs9IG9mZiAmIH5QQUdFX01BU0s7CisJCW1lbWNweShidWYsIHNyYywgbGVuKTsKKwkJYnVmICs9IGxlbjsKKwkJb2ZmICs9IGxlbjsKKwkJY291bnQgLT0gbGVuOworCX0KKworCWtyZWZfcHV0KCZkdW1wLT5rcmVmLCBpcHJfcmVsZWFzZV9kdW1wKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaXByX2FsbG9jX2R1bXAgLSBQcmVwYXJlIGZvciBhZGFwdGVyIGR1bXAKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCTAgb24gc3VjY2VzcyAvIG90aGVyIG9uIGZhaWx1cmUKKyAqKi8KK3N0YXRpYyBpbnQgaXByX2FsbG9jX2R1bXAoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKQoreworCXN0cnVjdCBpcHJfZHVtcCAqZHVtcDsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MgPSAwOworCisJRU5URVI7CisJZHVtcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcHJfZHVtcCksIEdGUF9LRVJORUwpOworCisJaWYgKCFkdW1wKSB7CisJCWlwcl9lcnIoIkR1bXAgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KGR1bXAsIDAsIHNpemVvZihzdHJ1Y3QgaXByX2R1bXApKTsKKwlrcmVmX2luaXQoJmR1bXAtPmtyZWYpOworCWR1bXAtPmlvYV9jZmcgPSBpb2FfY2ZnOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWlmIChJTkFDVElWRSAhPSBpb2FfY2ZnLT5zZHRfc3RhdGUpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCQlrZnJlZShkdW1wKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW9hX2NmZy0+ZHVtcCA9IGR1bXA7CisJaW9hX2NmZy0+c2R0X3N0YXRlID0gV0FJVF9GT1JfRFVNUDsKKwlpZiAoaW9hX2NmZy0+aW9hX2lzX2RlYWQgJiYgIWlvYV9jZmctPmR1bXBfdGFrZW4pIHsKKwkJaW9hX2NmZy0+ZHVtcF90YWtlbiA9IDE7CisJCXNjaGVkdWxlX3dvcmsoJmlvYV9jZmctPndvcmtfcSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCUxFQVZFOworCXJldHVybiAwOworfQorCisvKioKKyAqIGlwcl9mcmVlX2R1bXAgLSBGcmVlIGFkYXB0ZXIgZHVtcCBtZW1vcnkKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCTAgb24gc3VjY2VzcyAvIG90aGVyIG9uIGZhaWx1cmUKKyAqKi8KK3N0YXRpYyBpbnQgaXByX2ZyZWVfZHVtcChzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCit7CisJc3RydWN0IGlwcl9kdW1wICpkdW1wOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CisKKwlFTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJZHVtcCA9IGlvYV9jZmctPmR1bXA7CisJaWYgKCFkdW1wKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW9hX2NmZy0+ZHVtcCA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCisJa3JlZl9wdXQoJmR1bXAtPmtyZWYsIGlwcl9yZWxlYXNlX2R1bXApOworCisJTEVBVkU7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXByX3dyaXRlX2R1bXAgLSBTZXR1cCBkdW1wIHN0YXRlIG9mIGFkYXB0ZXIKKyAqIEBrb2JqOgkJa29iamVjdCBzdHJ1Y3QKKyAqIEBidWY6CQlidWZmZXIKKyAqIEBvZmY6CQlvZmZzZXQKKyAqIEBjb3VudDoJCWJ1ZmZlciBzaXplCisgKgorICogUmV0dXJuIHZhbHVlOgorICoJbnVtYmVyIG9mIGJ5dGVzIHByaW50ZWQgdG8gYnVmZmVyCisgKiovCitzdGF0aWMgc3NpemVfdCBpcHJfd3JpdGVfZHVtcChzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLAorCQkJICAgICAgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYgPSBjb250YWluZXJfb2Yoa29iaixzdHJ1Y3QgY2xhc3NfZGV2aWNlLGtvYmopOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gKHN0cnVjdCBpcHJfaW9hX2NmZyAqKXNob3N0LT5ob3N0ZGF0YTsKKwlpbnQgcmM7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRUFDQ0VTOworCisJaWYgKGJ1ZlswXSA9PSAnMScpCisJCXJjID0gaXByX2FsbG9jX2R1bXAoaW9hX2NmZyk7CisJZWxzZSBpZiAoYnVmWzBdID09ICcwJykKKwkJcmMgPSBpcHJfZnJlZV9kdW1wKGlvYV9jZmcpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwllbHNlCisJCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGlwcl9kdW1wX2F0dHIgPSB7CisJLmF0dHIgPQl7CisJCS5uYW1lID0gImR1bXAiLAorCQkubW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSLAorCX0sCisJLnNpemUgPSAwLAorCS5yZWFkID0gaXByX3JlYWRfZHVtcCwKKwkud3JpdGUgPSBpcHJfd3JpdGVfZHVtcAorfTsKKyNlbHNlCitzdGF0aWMgaW50IGlwcl9mcmVlX2R1bXAoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKSB7IHJldHVybiAwOyB9OworI2VuZGlmCisKKy8qKgorICogaXByX2NoYW5nZV9xdWV1ZV9kZXB0aCAtIENoYW5nZSB0aGUgZGV2aWNlJ3MgcXVldWUgZGVwdGgKKyAqIEBzZGV2OglzY3NpIGRldmljZSBzdHJ1Y3QKKyAqIEBxZGVwdGg6CWRlcHRoIHRvIHNldAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlhY3R1YWwgZGVwdGggc2V0CisgKiovCitzdGF0aWMgaW50IGlwcl9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgcWRlcHRoKQoreworCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIHNjc2lfZ2V0X3RhZ190eXBlKHNkZXYpLCBxZGVwdGgpOworCXJldHVybiBzZGV2LT5xdWV1ZV9kZXB0aDsKK30KKworLyoqCisgKiBpcHJfY2hhbmdlX3F1ZXVlX3R5cGUgLSBDaGFuZ2UgdGhlIGRldmljZSdzIHF1ZXVlIHR5cGUKKyAqIEBkc2V2OgkJc2NzaSBkZXZpY2Ugc3RydWN0CisgKiBAdGFnX3R5cGU6CXR5cGUgb2YgdGFncyB0byB1c2UKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJYWN0dWFsIHF1ZXVlIHR5cGUgc2V0CisgKiovCitzdGF0aWMgaW50IGlwcl9jaGFuZ2VfcXVldWVfdHlwZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCB0YWdfdHlwZSkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCXJlcyA9IChzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICopc2Rldi0+aG9zdGRhdGE7CisKKwlpZiAocmVzKSB7CisJCWlmIChpcHJfaXNfZ3Njc2kocmVzKSAmJiBzZGV2LT50YWdnZWRfc3VwcG9ydGVkKSB7CisJCQkvKgorCQkJICogV2UgZG9uJ3QgYm90aGVyIHF1aWVzY2luZyB0aGUgZGV2aWNlIGhlcmUgc2luY2UgdGhlCisJCQkgKiBhZGFwdGVyIGZpcm13YXJlIGRvZXMgaXQgZm9yIHVzLgorCQkJICovCisJCQlzY3NpX3NldF90YWdfdHlwZShzZGV2LCB0YWdfdHlwZSk7CisKKwkJCWlmICh0YWdfdHlwZSkKKwkJCQlzY3NpX2FjdGl2YXRlX3RjcShzZGV2LCBzZGV2LT5xdWV1ZV9kZXB0aCk7CisJCQllbHNlCisJCQkJc2NzaV9kZWFjdGl2YXRlX3RjcShzZGV2LCBzZGV2LT5xdWV1ZV9kZXB0aCk7CisJCX0gZWxzZQorCQkJdGFnX3R5cGUgPSAwOworCX0gZWxzZQorCQl0YWdfdHlwZSA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJcmV0dXJuIHRhZ190eXBlOworfQorCisvKioKKyAqIGlwcl9zaG93X2FkYXB0ZXJfaGFuZGxlIC0gU2hvdyB0aGUgYWRhcHRlcidzIHJlc291cmNlIGhhbmRsZSBmb3IgdGhpcyBkZXZpY2UKKyAqIEBkZXY6CWRldmljZSBzdHJ1Y3QKKyAqIEBidWY6CWJ1ZmZlcgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAludW1iZXIgb2YgYnl0ZXMgcHJpbnRlZCB0byBidWZmZXIKKyAqKi8KK3N0YXRpYyBzc2l6ZV90IGlwcl9zaG93X2FkYXB0ZXJfaGFuZGxlKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gKHN0cnVjdCBpcHJfaW9hX2NmZyAqKXNkZXYtPmhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKnJlczsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MgPSAwOworCXNzaXplX3QgbGVuID0gLUVOWElPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlyZXMgPSAoc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqKXNkZXYtPmhvc3RkYXRhOworCWlmIChyZXMpCisJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJTA4WFxuIiwgcmVzLT5jZmd0ZS5yZXNfaGFuZGxlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGlwcl9hZGFwdGVyX2hhbmRsZV9hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9IAkiYWRhcHRlcl9oYW5kbGUiLAorCQkubW9kZSA9CQlTX0lSVVNSLAorCX0sCisJLnNob3cgPSBpcHJfc2hvd19hZGFwdGVyX2hhbmRsZQorfTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICppcHJfZGV2X2F0dHJzW10gPSB7CisJJmlwcl9hZGFwdGVyX2hhbmRsZV9hdHRyLAorCU5VTEwsCit9OworCisvKioKKyAqIGlwcl9iaW9zcGFyYW0gLSBSZXR1cm4gdGhlIEhTQyBtYXBwaW5nCisgKiBAc2RldjoJCQlzY3NpIGRldmljZSBzdHJ1Y3QKKyAqIEBibG9ja19kZXZpY2U6CWJsb2NrIGRldmljZSBwb2ludGVyCisgKiBAY2FwYWNpdHk6CQljYXBhY2l0eSBvZiB0aGUgZGV2aWNlCisgKiBAcGFybToJCQlBcnJheSBjb250YWluaW5nIHJldHVybmVkIEhTQyB2YWx1ZXMuCisgKgorICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgdGhlIEhTQyBwYXJtcyB0aGF0IGZkaXNrIHVzZXMuCisgKiBXZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSByZXR1cm4gc29tZXRoaW5nIHRoYXQgcGxhY2VzIHBhcnRpdGlvbnMKKyAqIG9uIDRrIGJvdW5kYXJpZXMgZm9yIGJlc3QgcGVyZm9ybWFuY2Ugd2l0aCB0aGUgSU9BLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkwIG9uIHN1Y2Nlc3MKKyAqKi8KK3N0YXRpYyBpbnQgaXByX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCQkgc3RydWN0IGJsb2NrX2RldmljZSAqYmxvY2tfZGV2aWNlLAorCQkJIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKnBhcm0pCit7CisJaW50IGhlYWRzLCBzZWN0b3JzOworCXNlY3Rvcl90IGN5bGluZGVyczsKKworCWhlYWRzID0gMTI4OworCXNlY3RvcnMgPSAzMjsKKworCWN5bGluZGVycyA9IGNhcGFjaXR5OworCXNlY3Rvcl9kaXYoY3lsaW5kZXJzLCAoMTI4ICogMzIpKTsKKworCS8qIHJldHVybiByZXN1bHQgKi8KKwlwYXJtWzBdID0gaGVhZHM7CisJcGFybVsxXSA9IHNlY3RvcnM7CisJcGFybVsyXSA9IGN5bGluZGVyczsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlwcl9zbGF2ZV9kZXN0cm95IC0gVW5jb25maWd1cmUgYSBTQ1NJIGRldmljZQorICogQHNkZXY6CXNjc2kgZGV2aWNlIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub3RoaW5nCisgKiovCitzdGF0aWMgdm9pZCBpcHJfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzOworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZzsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MgPSAwOworCisJaW9hX2NmZyA9IChzdHJ1Y3QgaXByX2lvYV9jZmcgKikgc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCXJlcyA9IChzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICopIHNkZXYtPmhvc3RkYXRhOworCWlmIChyZXMpIHsKKwkJc2Rldi0+aG9zdGRhdGEgPSBOVUxMOworCQlyZXMtPnNkZXYgPSBOVUxMOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7Cit9CisKKy8qKgorICogaXByX3NsYXZlX2NvbmZpZ3VyZSAtIENvbmZpZ3VyZSBhIFNDU0kgZGV2aWNlCisgKiBAc2RldjoJc2NzaSBkZXZpY2Ugc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBzcGVjaWZpZWQgc2NzaSBkZXZpY2UuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTAgb24gc3VjY2VzcworICoqLworc3RhdGljIGludCBpcHJfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopIHNkZXYtPmhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKnJlczsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlyZXMgPSBzZGV2LT5ob3N0ZGF0YTsKKwlpZiAocmVzKSB7CisJCWlmIChpcHJfaXNfYWZfZGFzZF9kZXZpY2UocmVzKSkKKwkJCXNkZXYtPnR5cGUgPSBUWVBFX1JBSUQ7CisJCWlmIChpcHJfaXNfYWZfZGFzZF9kZXZpY2UocmVzKSB8fCBpcHJfaXNfaW9hX3Jlc291cmNlKHJlcykpCisJCQlzZGV2LT5zY3NpX2xldmVsID0gNDsKKwkJaWYgKGlwcl9pc192c2V0X2RldmljZShyZXMpKSB7CisJCQlzZGV2LT50aW1lb3V0ID0gSVBSX1ZTRVRfUldfVElNRU9VVDsKKwkJCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhzZGV2LT5yZXF1ZXN0X3F1ZXVlLCBJUFJfVlNFVF9NQVhfU0VDVE9SUyk7CisJCX0KKwkJaWYgKElQUl9JU19EQVNEX0RFVklDRShyZXMtPmNmZ3RlLnN0ZF9pbnFfZGF0YSkpCisJCQlzZGV2LT5hbGxvd19yZXN0YXJ0ID0gMTsKKwkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RldiwgMCwgc2Rldi0+aG9zdC0+Y21kX3Blcl9sdW4pOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXByX3NsYXZlX2FsbG9jIC0gUHJlcGFyZSBmb3IgY29tbWFuZHMgdG8gYSBkZXZpY2UuCisgKiBAc2RldjoJc2NzaSBkZXZpY2Ugc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBzYXZlcyBhIHBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGVudHJ5CisgKiBpbiB0aGUgc2NzaSBkZXZpY2Ugc3RydWN0IGlmIHRoZSBkZXZpY2UgZXhpc3RzLiBXZQorICogY2FuIHRoZW4gdXNlIHRoaXMgcG9pbnRlciBpbiBpcHJfcXVldWVjb21tYW5kIHdoZW4KKyAqIGhhbmRsaW5nIG5ldyBjb21tYW5kcy4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMCBvbiBzdWNjZXNzCisgKiovCitzdGF0aWMgaW50IGlwcl9zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gKHN0cnVjdCBpcHJfaW9hX2NmZyAqKSBzZGV2LT5ob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXM7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOworCisJc2Rldi0+aG9zdGRhdGEgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVzLCAmaW9hX2NmZy0+dXNlZF9yZXNfcSwgcXVldWUpIHsKKwkJaWYgKChyZXMtPmNmZ3RlLnJlc19hZGRyLmJ1cyA9PSBzZGV2LT5jaGFubmVsKSAmJgorCQkgICAgKHJlcy0+Y2ZndGUucmVzX2FkZHIudGFyZ2V0ID09IHNkZXYtPmlkKSAmJgorCQkgICAgKHJlcy0+Y2ZndGUucmVzX2FkZHIubHVuID09IHNkZXYtPmx1bikpIHsKKwkJCXJlcy0+c2RldiA9IHNkZXY7CisJCQlyZXMtPmFkZF90b19tbCA9IDA7CisJCQlyZXMtPmluX2VycCA9IDA7CisJCQlzZGV2LT5ob3N0ZGF0YSA9IHJlczsKKwkJCXJlcy0+bmVlZHNfc3luY19jb21wbGV0ZSA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlwcl9laF9ob3N0X3Jlc2V0IC0gUmVzZXQgdGhlIGhvc3QgYWRhcHRlcgorICogQHNjc2lfY21kOglzY3NpIGNvbW1hbmQgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCVNVQ0NFU1MgLyBGQUlMRUQKKyAqKi8KK3N0YXRpYyBpbnQgaXByX2VoX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqIHNjc2lfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZzsKKwlpbnQgcmM7CisKKwlFTlRFUjsKKwlpb2FfY2ZnID0gKHN0cnVjdCBpcHJfaW9hX2NmZyAqKSBzY3NpX2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwKKwkJIkFkYXB0ZXIgYmVpbmcgcmVzZXQgYXMgYSByZXN1bHQgb2YgZXJyb3IgcmVjb3ZlcnkuXG4iKTsKKworCWlmIChXQUlUX0ZPUl9EVU1QID09IGlvYV9jZmctPnNkdF9zdGF0ZSkKKwkJaW9hX2NmZy0+c2R0X3N0YXRlID0gR0VUX0RVTVA7CisKKwlyYyA9IGlwcl9yZXNldF9yZWxvYWQoaW9hX2NmZywgSVBSX1NIVVRET1dOX0FCQlJFVik7CisKKwlMRUFWRTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaXByX2VoX2Rldl9yZXNldCAtIFJlc2V0IHRoZSBkZXZpY2UKKyAqIEBzY3NpX2NtZDoJc2NzaSBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXNzdWVzIGEgZGV2aWNlIHJlc2V0IHRvIHRoZSBhZmZlY3RlZCBkZXZpY2UuCisgKiBBIExVTiByZXNldCB3aWxsIGJlIHNlbnQgdG8gdGhlIGRldmljZSBmaXJzdC4gSWYgdGhhdCBkb2VzCisgKiBub3Qgd29yaywgYSB0YXJnZXQgcmVzZXQgd2lsbCBiZSBzZW50LgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCVNVQ0NFU1MgLyBGQUlMRUQKKyAqKi8KK3N0YXRpYyBpbnQgaXByX2VoX2Rldl9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICogc2NzaV9jbWQpCit7CisJc3RydWN0IGlwcl9jbW5kICppcHJfY21kOworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZzsKKwlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXM7CisJc3RydWN0IGlwcl9jbWRfcGt0ICpjbWRfcGt0OworCXUzMiBpb2FzYzsKKworCUVOVEVSOworCWlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopIHNjc2lfY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXJlcyA9IHNjc2lfY21kLT5kZXZpY2UtPmhvc3RkYXRhOworCisJaWYgKCFyZXMgfHwgKCFpcHJfaXNfZ3Njc2kocmVzKSAmJiAhaXByX2lzX3ZzZXRfZGV2aWNlKHJlcykpKQorCQlyZXR1cm4gRkFJTEVEOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgY3VycmVudGx5IGdvaW5nIHRocm91Z2ggcmVzZXQvcmVsb2FkLCByZXR1cm4gZmFpbGVkLiBUaGlzIHdpbGwgZm9yY2UgdGhlCisJICogbWlkLWxheWVyIHRvIGNhbGwgaXByX2VoX2hvc3RfcmVzZXQsIHdoaWNoIHdpbGwgdGhlbiBnbyB0byBzbGVlcCBhbmQgd2FpdCBmb3IgdGhlCisJICogcmVzZXQgdG8gY29tcGxldGUKKwkgKi8KKwlpZiAoaW9hX2NmZy0+aW5fcmVzZXRfcmVsb2FkKQorCQlyZXR1cm4gRkFJTEVEOworCWlmIChpb2FfY2ZnLT5pb2FfaXNfZGVhZCkKKwkJcmV0dXJuIEZBSUxFRDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaXByX2NtZCwgJmlvYV9jZmctPnBlbmRpbmdfcSwgcXVldWUpIHsKKwkJaWYgKGlwcl9jbWQtPmlvYXJjYi5yZXNfaGFuZGxlID09IHJlcy0+Y2ZndGUucmVzX2hhbmRsZSkgeworCQkJaWYgKGlwcl9jbWQtPnNjc2lfY21kKQorCQkJCWlwcl9jbWQtPmRvbmUgPSBpcHJfc2NzaV9laF9kb25lOworCQl9CisJfQorCisJcmVzLT5yZXNldHRpbmdfZGV2aWNlID0gMTsKKworCWlwcl9jbWQgPSBpcHJfZ2V0X2ZyZWVfaXByX2NtbmQoaW9hX2NmZyk7CisKKwlpcHJfY21kLT5pb2FyY2IucmVzX2hhbmRsZSA9IHJlcy0+Y2ZndGUucmVzX2hhbmRsZTsKKwljbWRfcGt0ID0gJmlwcl9jbWQtPmlvYXJjYi5jbWRfcGt0OworCWNtZF9wa3QtPnJlcXVlc3RfdHlwZSA9IElQUl9SUVRZUEVfSU9BQ01EOworCWNtZF9wa3QtPmNkYlswXSA9IElQUl9SRVNFVF9ERVZJQ0U7CisKKwlpcHJfc2Rldl9lcnIoc2NzaV9jbWQtPmRldmljZSwgIlJlc2V0dGluZyBkZXZpY2VcbiIpOworCWlwcl9zZW5kX2Jsb2NraW5nX2NtZChpcHJfY21kLCBpcHJfdGltZW91dCwgSVBSX0RFVklDRV9SRVNFVF9USU1FT1VUKTsKKworCWlvYXNjID0gYmUzMl90b19jcHUoaXByX2NtZC0+aW9hc2EuaW9hc2MpOworCisJcmVzLT5yZXNldHRpbmdfZGV2aWNlID0gMDsKKworCWxpc3RfYWRkX3RhaWwoJmlwcl9jbWQtPnF1ZXVlLCAmaW9hX2NmZy0+ZnJlZV9xKTsKKworCUxFQVZFOworCXJldHVybiAoSVBSX0lPQVNDX1NFTlNFX0tFWShpb2FzYykgPyBGQUlMRUQgOiBTVUNDRVNTKTsKK30KKworLyoqCisgKiBpcHJfYnVzX3Jlc2V0X2RvbmUgLSBPcCBkb25lIGZ1bmN0aW9uIGZvciBidXMgcmVzZXQuCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgb3AgZG9uZSBmdW5jdGlvbiBmb3IgYSBidXMgcmVzZXQKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2J1c19yZXNldF9kb25lKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCXN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKnJlczsKKworCUVOVEVSOworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVzLCAmaW9hX2NmZy0+dXNlZF9yZXNfcSwgcXVldWUpIHsKKwkJaWYgKCFtZW1jbXAoJnJlcy0+Y2ZndGUucmVzX2hhbmRsZSwgJmlwcl9jbWQtPmlvYXJjYi5yZXNfaGFuZGxlLAorCQkJICAgIHNpemVvZihyZXMtPmNmZ3RlLnJlc19oYW5kbGUpKSkgeworCQkJc2NzaV9yZXBvcnRfYnVzX3Jlc2V0KGlvYV9jZmctPmhvc3QsIHJlcy0+Y2ZndGUucmVzX2FkZHIuYnVzKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBJZiBhYm9ydCBoYXMgbm90IGNvbXBsZXRlZCwgaW5kaWNhdGUgdGhlIHJlc2V0IGhhcywgZWxzZSBjYWxsIHRoZQorCSAqIGFib3J0J3MgZG9uZSBmdW5jdGlvbiB0byB3YWtlIHRoZSBzbGVlcGluZyBlaCB0aHJlYWQKKwkgKi8KKwlpZiAoaXByX2NtZC0+c2libGluZy0+c2libGluZykKKwkJaXByX2NtZC0+c2libGluZy0+c2libGluZyA9IE5VTEw7CisJZWxzZQorCQlpcHJfY21kLT5zaWJsaW5nLT5kb25lKGlwcl9jbWQtPnNpYmxpbmcpOworCisJbGlzdF9hZGRfdGFpbCgmaXByX2NtZC0+cXVldWUsICZpb2FfY2ZnLT5mcmVlX3EpOworCUxFQVZFOworfQorCisvKioKKyAqIGlwcl9hYm9ydF90aW1lb3V0IC0gQW4gYWJvcnQgdGFzayBoYXMgdGltZWQgb3V0CisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHdoZW4gYW4gYWJvcnQgdGFzayB0aW1lcyBvdXQuIElmIHRoaXMKKyAqIGhhcHBlbnMgd2UgaXNzdWUgYSBidXMgcmVzZXQgc2luY2Ugd2UgaGF2ZSByZXNvdXJjZXMgdGllZAorICogdXAgdGhhdCBtdXN0IGJlIGZyZWVkIGJlZm9yZSByZXR1cm5pbmcgdG8gdGhlIG1pZGxheWVyLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9hYm9ydF90aW1lb3V0KHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2NtbmQgKnJlc2V0X2NtZDsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCXN0cnVjdCBpcHJfY21kX3BrdCAqY21kX3BrdDsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MgPSAwOworCisJRU5URVI7CisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlpZiAoaXByX2NtZC0+Y29tcGxldGlvbi5kb25lIHx8IGlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlpcHJfc2Rldl9lcnIoaXByX2NtZC0+dS5zZGV2LCAiQWJvcnQgdGltZWQgb3V0LiBSZXNldHRpbmcgYnVzXG4iKTsKKwlyZXNldF9jbWQgPSBpcHJfZ2V0X2ZyZWVfaXByX2NtbmQoaW9hX2NmZyk7CisJaXByX2NtZC0+c2libGluZyA9IHJlc2V0X2NtZDsKKwlyZXNldF9jbWQtPnNpYmxpbmcgPSBpcHJfY21kOworCXJlc2V0X2NtZC0+aW9hcmNiLnJlc19oYW5kbGUgPSBpcHJfY21kLT5pb2FyY2IucmVzX2hhbmRsZTsKKwljbWRfcGt0ID0gJnJlc2V0X2NtZC0+aW9hcmNiLmNtZF9wa3Q7CisJY21kX3BrdC0+cmVxdWVzdF90eXBlID0gSVBSX1JRVFlQRV9JT0FDTUQ7CisJY21kX3BrdC0+Y2RiWzBdID0gSVBSX1JFU0VUX0RFVklDRTsKKwljbWRfcGt0LT5jZGJbMl0gPSBJUFJfUkVTRVRfVFlQRV9TRUxFQ1QgfCBJUFJfQlVTX1JFU0VUOworCisJaXByX2RvX3JlcShyZXNldF9jbWQsIGlwcl9idXNfcmVzZXRfZG9uZSwgaXByX3RpbWVvdXQsIElQUl9ERVZJQ0VfUkVTRVRfVElNRU9VVCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCUxFQVZFOworfQorCisvKioKKyAqIGlwcl9jYW5jZWxfb3AgLSBDYW5jZWwgc3BlY2lmaWVkIG9wCisgKiBAc2NzaV9jbWQ6CXNjc2kgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbmNlbHMgc3BlY2lmaWVkIG9wLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCVNVQ0NFU1MgLyBGQUlMRUQKKyAqKi8KK3N0YXRpYyBpbnQgaXByX2NhbmNlbF9vcChzdHJ1Y3Qgc2NzaV9jbW5kICogc2NzaV9jbWQpCit7CisJc3RydWN0IGlwcl9jbW5kICppcHJfY21kOworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZzsKKwlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXM7CisJc3RydWN0IGlwcl9jbWRfcGt0ICpjbWRfcGt0OworCXUzMiBpb2FzYzsKKwlpbnQgb3BfZm91bmQgPSAwOworCisJRU5URVI7CisJaW9hX2NmZyA9IChzdHJ1Y3QgaXByX2lvYV9jZmcgKilzY3NpX2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlyZXMgPSBzY3NpX2NtZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKworCWlmICghcmVzIHx8ICghaXByX2lzX2dzY3NpKHJlcykgJiYgIWlwcl9pc192c2V0X2RldmljZShyZXMpKSkKKwkJcmV0dXJuIEZBSUxFRDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaXByX2NtZCwgJmlvYV9jZmctPnBlbmRpbmdfcSwgcXVldWUpIHsKKwkJaWYgKGlwcl9jbWQtPnNjc2lfY21kID09IHNjc2lfY21kKSB7CisJCQlpcHJfY21kLT5kb25lID0gaXByX3Njc2lfZWhfZG9uZTsKKwkJCW9wX2ZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFvcF9mb3VuZCkKKwkJcmV0dXJuIFNVQ0NFU1M7CisKKwlpcHJfY21kID0gaXByX2dldF9mcmVlX2lwcl9jbW5kKGlvYV9jZmcpOworCWlwcl9jbWQtPmlvYXJjYi5yZXNfaGFuZGxlID0gcmVzLT5jZmd0ZS5yZXNfaGFuZGxlOworCWNtZF9wa3QgPSAmaXByX2NtZC0+aW9hcmNiLmNtZF9wa3Q7CisJY21kX3BrdC0+cmVxdWVzdF90eXBlID0gSVBSX1JRVFlQRV9JT0FDTUQ7CisJY21kX3BrdC0+Y2RiWzBdID0gSVBSX0NBTkNFTF9BTExfUkVRVUVTVFM7CisJaXByX2NtZC0+dS5zZGV2ID0gc2NzaV9jbWQtPmRldmljZTsKKworCWlwcl9zZGV2X2VycihzY3NpX2NtZC0+ZGV2aWNlLCAiQWJvcnRpbmcgY29tbWFuZDogJTAyWFxuIiwgc2NzaV9jbWQtPmNtbmRbMF0pOworCWlwcl9zZW5kX2Jsb2NraW5nX2NtZChpcHJfY21kLCBpcHJfYWJvcnRfdGltZW91dCwgSVBSX0NBTkNFTF9BTExfVElNRU9VVCk7CisJaW9hc2MgPSBiZTMyX3RvX2NwdShpcHJfY21kLT5pb2FzYS5pb2FzYyk7CisKKwkvKgorCSAqIElmIHRoZSBhYm9ydCB0YXNrIHRpbWVkIG91dCBhbmQgd2Ugc2VudCBhIGJ1cyByZXNldCwgd2Ugd2lsbCBnZXQKKwkgKiBvbmUgdGhlIGZvbGxvd2luZyByZXNwb25zZXMgdG8gdGhlIGFib3J0CisJICovCisJaWYgKGlvYXNjID09IElQUl9JT0FTQ19CVVNfV0FTX1JFU0VUIHx8IGlvYXNjID09IElQUl9JT0FTQ19TWU5DX1JFUVVJUkVEKSB7CisJCWlvYXNjID0gMDsKKwkJaXByX3RyYWNlOworCX0KKworCWxpc3RfYWRkX3RhaWwoJmlwcl9jbWQtPnF1ZXVlLCAmaW9hX2NmZy0+ZnJlZV9xKTsKKwlyZXMtPm5lZWRzX3N5bmNfY29tcGxldGUgPSAxOworCisJTEVBVkU7CisJcmV0dXJuIChJUFJfSU9BU0NfU0VOU0VfS0VZKGlvYXNjKSA/IEZBSUxFRCA6IFNVQ0NFU1MpOworfQorCisvKioKKyAqIGlwcl9laF9hYm9ydCAtIEFib3J0IGEgc2luZ2xlIG9wCisgKiBAc2NzaV9jbWQ6CXNjc2kgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJU1VDQ0VTUyAvIEZBSUxFRAorICoqLworc3RhdGljIGludCBpcHJfZWhfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqIHNjc2lfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZzsKKworCUVOVEVSOworCWlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopIHNjc2lfY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJLyogSWYgd2UgYXJlIGN1cnJlbnRseSBnb2luZyB0aHJvdWdoIHJlc2V0L3JlbG9hZCwgcmV0dXJuIGZhaWxlZC4gVGhpcyB3aWxsIGZvcmNlIHRoZQorCSAgIG1pZC1sYXllciB0byBjYWxsIGlwcl9laF9ob3N0X3Jlc2V0LCB3aGljaCB3aWxsIHRoZW4gZ28gdG8gc2xlZXAgYW5kIHdhaXQgZm9yIHRoZQorCSAgIHJlc2V0IHRvIGNvbXBsZXRlICovCisJaWYgKGlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCkKKwkJcmV0dXJuIEZBSUxFRDsKKwlpZiAoaW9hX2NmZy0+aW9hX2lzX2RlYWQpCisJCXJldHVybiBGQUlMRUQ7CisJaWYgKCFzY3NpX2NtZC0+ZGV2aWNlLT5ob3N0ZGF0YSkKKwkJcmV0dXJuIEZBSUxFRDsKKworCUxFQVZFOworCXJldHVybiBpcHJfY2FuY2VsX29wKHNjc2lfY21kKTsKK30KKworLyoqCisgKiBpcHJfaGFuZGxlX290aGVyX2ludGVycnVwdCAtIEhhbmRsZSAib3RoZXIiIGludGVycnVwdHMKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQGludF9yZWc6CWludGVycnVwdCByZWdpc3RlcgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlJUlFfTk9ORSAvIElSUV9IQU5ETEVECisgKiovCitzdGF0aWMgaXJxcmV0dXJuX3QgaXByX2hhbmRsZV9vdGhlcl9pbnRlcnJ1cHQoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJCQkgICAgICB2b2xhdGlsZSB1MzIgaW50X3JlZykKK3sKKwlpcnFyZXR1cm5fdCByYyA9IElSUV9IQU5ETEVEOworCisJaWYgKGludF9yZWcgJiBJUFJfUENJSV9JT0FfVFJBTlNfVE9fT1BFUikgeworCQkvKiBNYXNrIHRoZSBpbnRlcnJ1cHQgKi8KKwkJd3JpdGVsKElQUl9QQ0lJX0lPQV9UUkFOU19UT19PUEVSLCBpb2FfY2ZnLT5yZWdzLnNldF9pbnRlcnJ1cHRfbWFza19yZWcpOworCisJCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KKwkJd3JpdGVsKElQUl9QQ0lJX0lPQV9UUkFOU19UT19PUEVSLCBpb2FfY2ZnLT5yZWdzLmNscl9pbnRlcnJ1cHRfcmVnKTsKKwkJaW50X3JlZyA9IHJlYWRsKGlvYV9jZmctPnJlZ3Muc2Vuc2VfaW50ZXJydXB0X3JlZyk7CisKKwkJbGlzdF9kZWwoJmlvYV9jZmctPnJlc2V0X2NtZC0+cXVldWUpOworCQlkZWxfdGltZXIoJmlvYV9jZmctPnJlc2V0X2NtZC0+dGltZXIpOworCQlpcHJfcmVzZXRfaW9hX2pvYihpb2FfY2ZnLT5yZXNldF9jbWQpOworCX0gZWxzZSB7CisJCWlmIChpbnRfcmVnICYgSVBSX1BDSUlfSU9BX1VOSVRfQ0hFQ0tFRCkKKwkJCWlvYV9jZmctPmlvYV91bml0X2NoZWNrZWQgPSAxOworCQllbHNlCisJCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsCisJCQkJIlBlcm1hbmVudCBJT0EgZmFpbHVyZS4gMHglMDhYXG4iLCBpbnRfcmVnKTsKKworCQlpZiAoV0FJVF9GT1JfRFVNUCA9PSBpb2FfY2ZnLT5zZHRfc3RhdGUpCisJCQlpb2FfY2ZnLT5zZHRfc3RhdGUgPSBHRVRfRFVNUDsKKworCQlpcHJfbWFza19hbmRfY2xlYXJfaW50ZXJydXB0cyhpb2FfY2ZnLCB+MCk7CisJCWlwcl9pbml0aWF0ZV9pb2FfcmVzZXQoaW9hX2NmZywgSVBSX1NIVVRET1dOX05PTkUpOworCX0KKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpcHJfaXNyIC0gSW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZQorICogQGlycToJaXJxIG51bWJlcgorICogQGRldnA6CXBvaW50ZXIgdG8gaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEByZWdzOglwdF9yZWdzIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlJUlFfTk9ORSAvIElSUV9IQU5ETEVECisgKiovCitzdGF0aWMgaXJxcmV0dXJuX3QgaXByX2lzcihpbnQgaXJxLCB2b2lkICpkZXZwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopZGV2cDsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MgPSAwOworCXZvbGF0aWxlIHUzMiBpbnRfcmVnLCBpbnRfbWFza19yZWc7CisJdTMyIGlvYXNjOworCXUxNiBjbWRfaW5kZXg7CisJc3RydWN0IGlwcl9jbW5kICppcHJfY21kOworCWlycXJldHVybl90IHJjID0gSVJRX05PTkU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCisJLyogSWYgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsIGlnbm9yZSB0aGUgaW50ZXJydXB0ICovCisJaWYgKCFpb2FfY2ZnLT5hbGxvd19pbnRlcnJ1cHRzKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWludF9tYXNrX3JlZyA9IHJlYWRsKGlvYV9jZmctPnJlZ3Muc2Vuc2VfaW50ZXJydXB0X21hc2tfcmVnKTsKKwlpbnRfcmVnID0gcmVhZGwoaW9hX2NmZy0+cmVncy5zZW5zZV9pbnRlcnJ1cHRfcmVnKSAmIH5pbnRfbWFza19yZWc7CisKKwkvKiBJZiBhbiBpbnRlcnJ1cHQgb24gdGhlIGFkYXB0ZXIgZGlkIG5vdCBvY2N1ciwgaWdub3JlIGl0ICovCisJaWYgKHVubGlrZWx5KChpbnRfcmVnICYgSVBSX1BDSUlfT1BFUl9JTlRFUlJVUFRTKSA9PSAwKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlpcHJfY21kID0gTlVMTDsKKworCQl3aGlsZSAoKGJlMzJfdG9fY3B1KCppb2FfY2ZnLT5ocnJxX2N1cnIpICYgSVBSX0hSUlFfVE9HR0xFX0JJVCkgPT0KKwkJICAgICAgIGlvYV9jZmctPnRvZ2dsZV9iaXQpIHsKKworCQkJY21kX2luZGV4ID0gKGJlMzJfdG9fY3B1KCppb2FfY2ZnLT5ocnJxX2N1cnIpICYKKwkJCQkgICAgIElQUl9IUlJRX1JFUV9SRVNQX0hBTkRMRV9NQVNLKSA+PiBJUFJfSFJSUV9SRVFfUkVTUF9IQU5ETEVfU0hJRlQ7CisKKwkJCWlmICh1bmxpa2VseShjbWRfaW5kZXggPj0gSVBSX05VTV9DTURfQkxLUykpIHsKKwkJCQlpb2FfY2ZnLT5lcnJvcnNfbG9nZ2VkKys7CisJCQkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LCAiSW52YWxpZCByZXNwb25zZSBoYW5kbGUgZnJvbSBJT0FcbiIpOworCisJCQkJaWYgKFdBSVRfRk9SX0RVTVAgPT0gaW9hX2NmZy0+c2R0X3N0YXRlKQorCQkJCQlpb2FfY2ZnLT5zZHRfc3RhdGUgPSBHRVRfRFVNUDsKKworCQkJCWlwcl9pbml0aWF0ZV9pb2FfcmVzZXQoaW9hX2NmZywgSVBSX1NIVVRET1dOX05PTkUpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisKKwkJCWlwcl9jbWQgPSBpb2FfY2ZnLT5pcHJfY21uZF9saXN0W2NtZF9pbmRleF07CisKKwkJCWlvYXNjID0gYmUzMl90b19jcHUoaXByX2NtZC0+aW9hc2EuaW9hc2MpOworCisJCQlpcHJfdHJjX2hvb2soaXByX2NtZCwgSVBSX1RSQUNFX0ZJTklTSCwgaW9hc2MpOworCisJCQlsaXN0X2RlbCgmaXByX2NtZC0+cXVldWUpOworCQkJZGVsX3RpbWVyKCZpcHJfY21kLT50aW1lcik7CisJCQlpcHJfY21kLT5kb25lKGlwcl9jbWQpOworCisJCQlyYyA9IElSUV9IQU5ETEVEOworCisJCQlpZiAoaW9hX2NmZy0+aHJycV9jdXJyIDwgaW9hX2NmZy0+aHJycV9lbmQpIHsKKwkJCQlpb2FfY2ZnLT5ocnJxX2N1cnIrKzsKKwkJCX0gZWxzZSB7CisJCQkJaW9hX2NmZy0+aHJycV9jdXJyID0gaW9hX2NmZy0+aHJycV9zdGFydDsKKwkJCQlpb2FfY2ZnLT50b2dnbGVfYml0IF49IDF1OworCQkJfQorCQl9CisKKwkJaWYgKGlwcl9jbWQgIT0gTlVMTCkgeworCQkJLyogQ2xlYXIgdGhlIFBDSSBpbnRlcnJ1cHQgKi8KKwkJCXdyaXRlbChJUFJfUENJSV9IUlJRX1VQREFURUQsIGlvYV9jZmctPnJlZ3MuY2xyX2ludGVycnVwdF9yZWcpOworCQkJaW50X3JlZyA9IHJlYWRsKGlvYV9jZmctPnJlZ3Muc2Vuc2VfaW50ZXJydXB0X3JlZykgJiB+aW50X21hc2tfcmVnOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKworCWlmICh1bmxpa2VseShyYyA9PSBJUlFfTk9ORSkpCisJCXJjID0gaXByX2hhbmRsZV9vdGhlcl9pbnRlcnJ1cHQoaW9hX2NmZywgaW50X3JlZyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGlwcl9idWlsZF9pb2FkbCAtIEJ1aWxkIGEgc2NhdHRlci9nYXRoZXIgbGlzdCBhbmQgbWFwIHRoZSBidWZmZXIKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkwIG9uIHN1Y2Nlc3MgLyAtMSBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgaW50IGlwcl9idWlsZF9pb2FkbChzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQkgICBzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJaW50IGk7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3Q7CisJdTMyIGxlbmd0aDsKKwl1MzIgaW9hZGxfZmxhZ3MgPSAwOworCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfY21kID0gaXByX2NtZC0+c2NzaV9jbWQ7CisJc3RydWN0IGlwcl9pb2FyY2IgKmlvYXJjYiA9ICZpcHJfY21kLT5pb2FyY2I7CisJc3RydWN0IGlwcl9pb2FkbF9kZXNjICppb2FkbCA9IGlwcl9jbWQtPmlvYWRsOworCisJbGVuZ3RoID0gc2NzaV9jbWQtPnJlcXVlc3RfYnVmZmxlbjsKKworCWlmIChsZW5ndGggPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2NzaV9jbWQtPnVzZV9zZykgeworCQlpcHJfY21kLT5kbWFfdXNlX3NnID0gcGNpX21hcF9zZyhpb2FfY2ZnLT5wZGV2LAorCQkJCQkJIHNjc2lfY21kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQkJCSBzY3NpX2NtZC0+dXNlX3NnLAorCQkJCQkJIHNjc2lfY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisKKwkJaWYgKHNjc2lfY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CisJCQlpb2FkbF9mbGFncyA9IElQUl9JT0FETF9GTEFHU19XUklURTsKKwkJCWlvYXJjYi0+Y21kX3BrdC5mbGFnc19oaSB8PSBJUFJfRkxBR1NfSElfV1JJVEVfTk9UX1JFQUQ7CisJCQlpb2FyY2ItPndyaXRlX2RhdGFfdHJhbnNmZXJfbGVuZ3RoID0gY3B1X3RvX2JlMzIobGVuZ3RoKTsKKwkJCWlvYXJjYi0+d3JpdGVfaW9hZGxfbGVuID0KKwkJCQljcHVfdG9fYmUzMihzaXplb2Yoc3RydWN0IGlwcl9pb2FkbF9kZXNjKSAqIGlwcl9jbWQtPmRtYV91c2Vfc2cpOworCQl9IGVsc2UgaWYgKHNjc2lfY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKKwkJCWlvYWRsX2ZsYWdzID0gSVBSX0lPQURMX0ZMQUdTX1JFQUQ7CisJCQlpb2FyY2ItPnJlYWRfZGF0YV90cmFuc2Zlcl9sZW5ndGggPSBjcHVfdG9fYmUzMihsZW5ndGgpOworCQkJaW9hcmNiLT5yZWFkX2lvYWRsX2xlbiA9CisJCQkJY3B1X3RvX2JlMzIoc2l6ZW9mKHN0cnVjdCBpcHJfaW9hZGxfZGVzYykgKiBpcHJfY21kLT5kbWFfdXNlX3NnKTsKKwkJfQorCisJCXNnbGlzdCA9IHNjc2lfY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKworCQlmb3IgKGkgPSAwOyBpIDwgaXByX2NtZC0+ZG1hX3VzZV9zZzsgaSsrKSB7CisJCQlpb2FkbFtpXS5mbGFnc19hbmRfZGF0YV9sZW4gPQorCQkJCWNwdV90b19iZTMyKGlvYWRsX2ZsYWdzIHwgc2dfZG1hX2xlbigmc2dsaXN0W2ldKSk7CisJCQlpb2FkbFtpXS5hZGRyZXNzID0KKwkJCQljcHVfdG9fYmUzMihzZ19kbWFfYWRkcmVzcygmc2dsaXN0W2ldKSk7CisJCX0KKworCQlpZiAobGlrZWx5KGlwcl9jbWQtPmRtYV91c2Vfc2cpKSB7CisJCQlpb2FkbFtpLTFdLmZsYWdzX2FuZF9kYXRhX2xlbiB8PQorCQkJCWNwdV90b19iZTMyKElQUl9JT0FETF9GTEFHU19MQVNUKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwgInBjaV9tYXBfc2cgZmFpbGVkIVxuIik7CisJfSBlbHNlIHsKKwkJaWYgKHNjc2lfY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CisJCQlpb2FkbF9mbGFncyA9IElQUl9JT0FETF9GTEFHU19XUklURTsKKwkJCWlvYXJjYi0+Y21kX3BrdC5mbGFnc19oaSB8PSBJUFJfRkxBR1NfSElfV1JJVEVfTk9UX1JFQUQ7CisJCQlpb2FyY2ItPndyaXRlX2RhdGFfdHJhbnNmZXJfbGVuZ3RoID0gY3B1X3RvX2JlMzIobGVuZ3RoKTsKKwkJCWlvYXJjYi0+d3JpdGVfaW9hZGxfbGVuID0gY3B1X3RvX2JlMzIoc2l6ZW9mKHN0cnVjdCBpcHJfaW9hZGxfZGVzYykpOworCQl9IGVsc2UgaWYgKHNjc2lfY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKKwkJCWlvYWRsX2ZsYWdzID0gSVBSX0lPQURMX0ZMQUdTX1JFQUQ7CisJCQlpb2FyY2ItPnJlYWRfZGF0YV90cmFuc2Zlcl9sZW5ndGggPSBjcHVfdG9fYmUzMihsZW5ndGgpOworCQkJaW9hcmNiLT5yZWFkX2lvYWRsX2xlbiA9IGNwdV90b19iZTMyKHNpemVvZihzdHJ1Y3QgaXByX2lvYWRsX2Rlc2MpKTsKKwkJfQorCisJCWlwcl9jbWQtPmRtYV9oYW5kbGUgPSBwY2lfbWFwX3NpbmdsZShpb2FfY2ZnLT5wZGV2LAorCQkJCQkJICAgICBzY3NpX2NtZC0+cmVxdWVzdF9idWZmZXIsIGxlbmd0aCwKKwkJCQkJCSAgICAgc2NzaV9jbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworCQlpZiAobGlrZWx5KCFwY2lfZG1hX21hcHBpbmdfZXJyb3IoaXByX2NtZC0+ZG1hX2hhbmRsZSkpKSB7CisJCQlpcHJfY21kLT5kbWFfdXNlX3NnID0gMTsKKwkJCWlvYWRsWzBdLmZsYWdzX2FuZF9kYXRhX2xlbiA9CisJCQkJY3B1X3RvX2JlMzIoaW9hZGxfZmxhZ3MgfCBsZW5ndGggfCBJUFJfSU9BRExfRkxBR1NfTEFTVCk7CisJCQlpb2FkbFswXS5hZGRyZXNzID0gY3B1X3RvX2JlMzIoaXByX2NtZC0+ZG1hX2hhbmRsZSk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJwY2lfbWFwX3NpbmdsZSBmYWlsZWQhXG4iKTsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qKgorICogaXByX2dldF90YXNrX2F0dHJpYnV0ZXMgLSBUcmFuc2xhdGUgU1BJIFEtVGFnIHRvIHRhc2sgYXR0cmlidXRlcworICogQHNjc2lfY21kOglzY3NpIGNvbW1hbmQgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCXRhc2sgYXR0cmlidXRlcworICoqLworc3RhdGljIHU4IGlwcl9nZXRfdGFza19hdHRyaWJ1dGVzKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfY21kKQoreworCXU4IHRhZ1syXTsKKwl1OCByYyA9IElQUl9GTEFHU19MT19VTlRBR0dFRF9UQVNLOworCisJaWYgKHNjc2lfcG9wdWxhdGVfdGFnX21zZyhzY3NpX2NtZCwgdGFnKSkgeworCQlzd2l0Y2ggKHRhZ1swXSkgeworCQljYXNlIE1TR19TSU1QTEVfVEFHOgorCQkJcmMgPSBJUFJfRkxBR1NfTE9fU0lNUExFX1RBU0s7CisJCQlicmVhazsKKwkJY2FzZSBNU0dfSEVBRF9UQUc6CisJCQlyYyA9IElQUl9GTEFHU19MT19IRUFEX09GX1FfVEFTSzsKKwkJCWJyZWFrOworCQljYXNlIE1TR19PUkRFUkVEX1RBRzoKKwkJCXJjID0gSVBSX0ZMQUdTX0xPX09SREVSRURfVEFTSzsKKwkJCWJyZWFrOworCQl9OworCX0KKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpcHJfZXJwX2RvbmUgLSBQcm9jZXNzIGNvbXBsZXRpb24gb2YgRVJQIGZvciBhIGRldmljZQorICogQGlwcl9jbWQ6CQlpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvcGllcyB0aGUgc2Vuc2UgYnVmZmVyIGludG8gdGhlIHNjc2lfY21kCisgKiBzdHJ1Y3QgYW5kIHB1c2hlcyB0aGUgc2NzaV9kb25lIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub3RoaW5nCisgKiovCitzdGF0aWMgdm9pZCBpcHJfZXJwX2RvbmUoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfY21kID0gaXByX2NtZC0+c2NzaV9jbWQ7CisJc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzID0gc2NzaV9jbWQtPmRldmljZS0+aG9zdGRhdGE7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKwl1MzIgaW9hc2MgPSBiZTMyX3RvX2NwdShpcHJfY21kLT5pb2FzYS5pb2FzYyk7CisKKwlpZiAoSVBSX0lPQVNDX1NFTlNFX0tFWShpb2FzYykgPiAwKSB7CisJCXNjc2lfY21kLT5yZXN1bHQgfD0gKERJRF9FUlJPUiA8PCAxNik7CisJCWlwcl9zZGV2X2VycihzY3NpX2NtZC0+ZGV2aWNlLAorCQkJICAgICAiUmVxdWVzdCBTZW5zZSBmYWlsZWQgd2l0aCBJT0FTQzogMHglMDhYXG4iLCBpb2FzYyk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KHNjc2lfY21kLT5zZW5zZV9idWZmZXIsIGlwcl9jbWQtPnNlbnNlX2J1ZmZlciwKKwkJICAgICAgIFNDU0lfU0VOU0VfQlVGRkVSU0laRSk7CisJfQorCisJaWYgKHJlcykgeworCQlyZXMtPm5lZWRzX3N5bmNfY29tcGxldGUgPSAxOworCQlyZXMtPmluX2VycCA9IDA7CisJfQorCWlwcl91bm1hcF9zZ2xpc3QoaW9hX2NmZywgaXByX2NtZCk7CisJbGlzdF9hZGRfdGFpbCgmaXByX2NtZC0+cXVldWUsICZpb2FfY2ZnLT5mcmVlX3EpOworCXNjc2lfY21kLT5zY3NpX2RvbmUoc2NzaV9jbWQpOworfQorCisvKioKKyAqIGlwcl9yZWluaXRfaXByX2NtbmRfZm9yX2VycCAtIFJlLWluaXRpYWxpemUgYSBjbW5kIGJsb2NrIHRvIGJlIHVzZWQgZm9yIEVSUAorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfcmVpbml0X2lwcl9jbW5kX2Zvcl9lcnAoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hcmNiICppb2FyY2I7CisJc3RydWN0IGlwcl9pb2FzYSAqaW9hc2E7CisKKwlpb2FyY2IgPSAmaXByX2NtZC0+aW9hcmNiOworCWlvYXNhID0gJmlwcl9jbWQtPmlvYXNhOworCisJbWVtc2V0KCZpb2FyY2ItPmNtZF9wa3QsIDAsIHNpemVvZihzdHJ1Y3QgaXByX2NtZF9wa3QpKTsKKwlpb2FyY2ItPndyaXRlX2RhdGFfdHJhbnNmZXJfbGVuZ3RoID0gMDsKKwlpb2FyY2ItPnJlYWRfZGF0YV90cmFuc2Zlcl9sZW5ndGggPSAwOworCWlvYXJjYi0+d3JpdGVfaW9hZGxfbGVuID0gMDsKKwlpb2FyY2ItPnJlYWRfaW9hZGxfbGVuID0gMDsKKwlpb2FzYS0+aW9hc2MgPSAwOworCWlvYXNhLT5yZXNpZHVhbF9kYXRhX2xlbiA9IDA7Cit9CisKKy8qKgorICogaXByX2VycF9yZXF1ZXN0X3NlbnNlIC0gU2VuZCByZXF1ZXN0IHNlbnNlIHRvIGEgZGV2aWNlCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBhIHJlcXVlc3Qgc2Vuc2UgdG8gYSBkZXZpY2UgYXMgYSByZXN1bHQKKyAqIG9mIGEgY2hlY2sgY29uZGl0aW9uLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub3RoaW5nCisgKiovCitzdGF0aWMgdm9pZCBpcHJfZXJwX3JlcXVlc3Rfc2Vuc2Uoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfY21kX3BrdCAqY21kX3BrdCA9ICZpcHJfY21kLT5pb2FyY2IuY21kX3BrdDsKKwl1MzIgaW9hc2MgPSBiZTMyX3RvX2NwdShpcHJfY21kLT5pb2FzYS5pb2FzYyk7CisKKwlpZiAoSVBSX0lPQVNDX1NFTlNFX0tFWShpb2FzYykgPiAwKSB7CisJCWlwcl9lcnBfZG9uZShpcHJfY21kKTsKKwkJcmV0dXJuOworCX0KKworCWlwcl9yZWluaXRfaXByX2NtbmRfZm9yX2VycChpcHJfY21kKTsKKworCWNtZF9wa3QtPnJlcXVlc3RfdHlwZSA9IElQUl9SUVRZUEVfU0NTSUNEQjsKKwljbWRfcGt0LT5jZGJbMF0gPSBSRVFVRVNUX1NFTlNFOworCWNtZF9wa3QtPmNkYls0XSA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKKwljbWRfcGt0LT5mbGFnc19oaSB8PSBJUFJfRkxBR1NfSElfU1lOQ19PVkVSUklERTsKKwljbWRfcGt0LT5mbGFnc19oaSB8PSBJUFJfRkxBR1NfSElfTk9fVUxFTl9DSEs7CisJY21kX3BrdC0+dGltZW91dCA9IGNwdV90b19iZTE2KElQUl9SRVFVRVNUX1NFTlNFX1RJTUVPVVQgLyBIWik7CisKKwlpcHJfY21kLT5pb2FkbFswXS5mbGFnc19hbmRfZGF0YV9sZW4gPQorCQljcHVfdG9fYmUzMihJUFJfSU9BRExfRkxBR1NfUkVBRF9MQVNUIHwgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKKwlpcHJfY21kLT5pb2FkbFswXS5hZGRyZXNzID0KKwkJY3B1X3RvX2JlMzIoaXByX2NtZC0+c2Vuc2VfYnVmZmVyX2RtYSk7CisKKwlpcHJfY21kLT5pb2FyY2IucmVhZF9pb2FkbF9sZW4gPQorCQljcHVfdG9fYmUzMihzaXplb2Yoc3RydWN0IGlwcl9pb2FkbF9kZXNjKSk7CisJaXByX2NtZC0+aW9hcmNiLnJlYWRfZGF0YV90cmFuc2Zlcl9sZW5ndGggPQorCQljcHVfdG9fYmUzMihTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOworCisJaXByX2RvX3JlcShpcHJfY21kLCBpcHJfZXJwX2RvbmUsIGlwcl90aW1lb3V0LAorCQkgICBJUFJfUkVRVUVTVF9TRU5TRV9USU1FT1VUICogMik7Cit9CisKKy8qKgorICogaXByX2VycF9jYW5jZWxfYWxsIC0gU2VuZCBjYW5jZWwgYWxsIHRvIGEgZGV2aWNlCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBhIGNhbmNlbCBhbGwgdG8gYSBkZXZpY2UgdG8gY2xlYXIgdGhlCisgKiBxdWV1ZS4gSWYgd2UgYXJlIHJ1bm5pbmcgVENRIG9uIHRoZSBkZXZpY2UsIFFFUlIgaXMgc2V0IHRvIDEsCisgKiB3aGljaCBtZWFucyBhbGwgb3V0c3RhbmRpbmcgb3BzIGhhdmUgYmVlbiBkcm9wcGVkIG9uIHRoZSBmbG9vci4KKyAqIENhbmNlbCBhbGwgd2lsbCByZXR1cm4gdGhlbSB0byB1cy4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm90aGluZworICoqLworc3RhdGljIHZvaWQgaXByX2VycF9jYW5jZWxfYWxsKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2NtZCA9IGlwcl9jbWQtPnNjc2lfY21kOworCXN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKnJlcyA9IHNjc2lfY21kLT5kZXZpY2UtPmhvc3RkYXRhOworCXN0cnVjdCBpcHJfY21kX3BrdCAqY21kX3BrdDsKKworCXJlcy0+aW5fZXJwID0gMTsKKworCWlwcl9yZWluaXRfaXByX2NtbmRfZm9yX2VycChpcHJfY21kKTsKKworCWlmICghc2NzaV9nZXRfdGFnX3R5cGUoc2NzaV9jbWQtPmRldmljZSkpIHsKKwkJaXByX2VycF9yZXF1ZXN0X3NlbnNlKGlwcl9jbWQpOworCQlyZXR1cm47CisJfQorCisJY21kX3BrdCA9ICZpcHJfY21kLT5pb2FyY2IuY21kX3BrdDsKKwljbWRfcGt0LT5yZXF1ZXN0X3R5cGUgPSBJUFJfUlFUWVBFX0lPQUNNRDsKKwljbWRfcGt0LT5jZGJbMF0gPSBJUFJfQ0FOQ0VMX0FMTF9SRVFVRVNUUzsKKworCWlwcl9kb19yZXEoaXByX2NtZCwgaXByX2VycF9yZXF1ZXN0X3NlbnNlLCBpcHJfdGltZW91dCwKKwkJICAgSVBSX0NBTkNFTF9BTExfVElNRU9VVCk7Cit9CisKKy8qKgorICogaXByX2R1bXBfaW9hc2EgLSBEdW1wIGNvbnRlbnRzIG9mIElPQVNBCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyIHdoZW4gb3BzCisgKiBmYWlsLiBJdCB3aWxsIGxvZyB0aGUgSU9BU0EgaWYgYXBwcm9wcmlhdGUuIE9ubHkgY2FsbGVkCisgKiBmb3IgR1BERCBvcHMuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9kdW1wX2lvYXNhKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZywKKwkJCSAgIHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlpbnQgaTsKKwl1MTYgZGF0YV9sZW47CisJdTMyIGlvYXNjOworCXN0cnVjdCBpcHJfaW9hc2EgKmlvYXNhID0gJmlwcl9jbWQtPmlvYXNhOworCV9fYmUzMiAqaW9hc2FfZGF0YSA9IChfX2JlMzIgKilpb2FzYTsKKwlpbnQgZXJyb3JfaW5kZXg7CisKKwlpb2FzYyA9IGJlMzJfdG9fY3B1KGlvYXNhLT5pb2FzYykgJiBJUFJfSU9BU0NfSU9BU0NfTUFTSzsKKworCWlmICgwID09IGlvYXNjKQorCQlyZXR1cm47CisKKwlpZiAoaW9hX2NmZy0+bG9nX2xldmVsIDwgSVBSX0RFRkFVTFRfTE9HX0xFVkVMKQorCQlyZXR1cm47CisKKwllcnJvcl9pbmRleCA9IGlwcl9nZXRfZXJyb3IoaW9hc2MpOworCisJaWYgKGlvYV9jZmctPmxvZ19sZXZlbCA8IElQUl9NQVhfTE9HX0xFVkVMKSB7CisJCS8qIERvbid0IGxvZyBhbiBlcnJvciBpZiB0aGUgSU9BIGFscmVhZHkgbG9nZ2VkIG9uZSAqLworCQlpZiAoaW9hc2EtPmlsaWQgIT0gMCkKKwkJCXJldHVybjsKKworCQlpZiAoaXByX2Vycm9yX3RhYmxlW2Vycm9yX2luZGV4XS5sb2dfaW9hc2EgPT0gMCkKKwkJCXJldHVybjsKKwl9CisKKwlpcHJfc2Rldl9lcnIoaXByX2NtZC0+c2NzaV9jbWQtPmRldmljZSwgIiVzXG4iLAorCQkgICAgIGlwcl9lcnJvcl90YWJsZVtlcnJvcl9pbmRleF0uZXJyb3IpOworCisJaWYgKChpb2FzYS0+dS5ncGRkLmVuZF9zdGF0ZSA8PSBBUlJBWV9TSVpFKGlwcl9ncGRkX2Rldl9lbmRfc3RhdGVzKSkgJiYKKwkgICAgKGlvYXNhLT51LmdwZGQuYnVzX3BoYXNlIDw9ICBBUlJBWV9TSVpFKGlwcl9ncGRkX2Rldl9idXNfcGhhc2VzKSkpIHsKKwkJaXByX3NkZXZfZXJyKGlwcl9jbWQtPnNjc2lfY21kLT5kZXZpY2UsCisJCQkgICAgICJEZXZpY2UgRW5kIHN0YXRlOiAlcyBQaGFzZTogJXNcbiIsCisJCQkgICAgIGlwcl9ncGRkX2Rldl9lbmRfc3RhdGVzW2lvYXNhLT51LmdwZGQuZW5kX3N0YXRlXSwKKwkJCSAgICAgaXByX2dwZGRfZGV2X2J1c19waGFzZXNbaW9hc2EtPnUuZ3BkZC5idXNfcGhhc2VdKTsKKwl9CisKKwlpZiAoc2l6ZW9mKHN0cnVjdCBpcHJfaW9hc2EpIDwgYmUxNl90b19jcHUoaW9hc2EtPnJldF9zdGF0X2xlbikpCisJCWRhdGFfbGVuID0gc2l6ZW9mKHN0cnVjdCBpcHJfaW9hc2EpOworCWVsc2UKKwkJZGF0YV9sZW4gPSBiZTE2X3RvX2NwdShpb2FzYS0+cmV0X3N0YXRfbGVuKTsKKworCWlwcl9lcnIoIklPQVNBIER1bXA6XG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBkYXRhX2xlbiAvIDQ7IGkgKz0gNCkgeworCQlpcHJfZXJyKCIlMDhYOiAlMDhYICUwOFggJTA4WCAlMDhYXG4iLCBpKjQsCisJCQliZTMyX3RvX2NwdShpb2FzYV9kYXRhW2ldKSwKKwkJCWJlMzJfdG9fY3B1KGlvYXNhX2RhdGFbaSsxXSksCisJCQliZTMyX3RvX2NwdShpb2FzYV9kYXRhW2krMl0pLAorCQkJYmUzMl90b19jcHUoaW9hc2FfZGF0YVtpKzNdKSk7CisJfQorfQorCisvKioKKyAqIGlwcl9nZW5fc2Vuc2UgLSBHZW5lcmF0ZSBTQ1NJIHNlbnNlIGRhdGEgZnJvbSBhbiBJT0FTQQorICogQGlvYXNhOgkJSU9BU0EKKyAqIEBzZW5zZV9idWY6CXNlbnNlIGRhdGEgYnVmZmVyCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9nZW5fc2Vuc2Uoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXUzMiBmYWlsaW5nX2xiYTsKKwl1OCAqc2Vuc2VfYnVmID0gaXByX2NtZC0+c2NzaV9jbWQtPnNlbnNlX2J1ZmZlcjsKKwlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXMgPSBpcHJfY21kLT5zY3NpX2NtZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgaXByX2lvYXNhICppb2FzYSA9ICZpcHJfY21kLT5pb2FzYTsKKwl1MzIgaW9hc2MgPSBiZTMyX3RvX2NwdShpb2FzYS0+aW9hc2MpOworCisJbWVtc2V0KHNlbnNlX2J1ZiwgMCwgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKKworCWlmIChpb2FzYyA+PSBJUFJfRklSU1RfRFJJVkVSX0lPQVNDKQorCQlyZXR1cm47CisKKwlpcHJfY21kLT5zY3NpX2NtZC0+cmVzdWx0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCisJaWYgKGlwcl9pc192c2V0X2RldmljZShyZXMpICYmCisJICAgIGlvYXNjID09IElQUl9JT0FTQ19NRURfRE9fTk9UX1JFQUxMT0MgJiYKKwkgICAgaW9hc2EtPnUudnNldC5mYWlsaW5nX2xiYV9oaSAhPSAwKSB7CisJCXNlbnNlX2J1ZlswXSA9IDB4NzI7CisJCXNlbnNlX2J1ZlsxXSA9IElQUl9JT0FTQ19TRU5TRV9LRVkoaW9hc2MpOworCQlzZW5zZV9idWZbMl0gPSBJUFJfSU9BU0NfU0VOU0VfQ09ERShpb2FzYyk7CisJCXNlbnNlX2J1ZlszXSA9IElQUl9JT0FTQ19TRU5TRV9RVUFMKGlvYXNjKTsKKworCQlzZW5zZV9idWZbN10gPSAxMjsKKwkJc2Vuc2VfYnVmWzhdID0gMDsKKwkJc2Vuc2VfYnVmWzldID0gMHgwQTsKKwkJc2Vuc2VfYnVmWzEwXSA9IDB4ODA7CisKKwkJZmFpbGluZ19sYmEgPSBiZTMyX3RvX2NwdShpb2FzYS0+dS52c2V0LmZhaWxpbmdfbGJhX2hpKTsKKworCQlzZW5zZV9idWZbMTJdID0gKGZhaWxpbmdfbGJhICYgMHhmZjAwMDAwMCkgPj4gMjQ7CisJCXNlbnNlX2J1ZlsxM10gPSAoZmFpbGluZ19sYmEgJiAweDAwZmYwMDAwKSA+PiAxNjsKKwkJc2Vuc2VfYnVmWzE0XSA9IChmYWlsaW5nX2xiYSAmIDB4MDAwMGZmMDApID4+IDg7CisJCXNlbnNlX2J1ZlsxNV0gPSBmYWlsaW5nX2xiYSAmIDB4MDAwMDAwZmY7CisKKwkJZmFpbGluZ19sYmEgPSBiZTMyX3RvX2NwdShpb2FzYS0+dS52c2V0LmZhaWxpbmdfbGJhX2xvKTsKKworCQlzZW5zZV9idWZbMTZdID0gKGZhaWxpbmdfbGJhICYgMHhmZjAwMDAwMCkgPj4gMjQ7CisJCXNlbnNlX2J1ZlsxN10gPSAoZmFpbGluZ19sYmEgJiAweDAwZmYwMDAwKSA+PiAxNjsKKwkJc2Vuc2VfYnVmWzE4XSA9IChmYWlsaW5nX2xiYSAmIDB4MDAwMGZmMDApID4+IDg7CisJCXNlbnNlX2J1ZlsxOV0gPSBmYWlsaW5nX2xiYSAmIDB4MDAwMDAwZmY7CisJfSBlbHNlIHsKKwkJc2Vuc2VfYnVmWzBdID0gMHg3MDsKKwkJc2Vuc2VfYnVmWzJdID0gSVBSX0lPQVNDX1NFTlNFX0tFWShpb2FzYyk7CisJCXNlbnNlX2J1ZlsxMl0gPSBJUFJfSU9BU0NfU0VOU0VfQ09ERShpb2FzYyk7CisJCXNlbnNlX2J1ZlsxM10gPSBJUFJfSU9BU0NfU0VOU0VfUVVBTChpb2FzYyk7CisKKwkJLyogSWxsZWdhbCByZXF1ZXN0ICovCisJCWlmICgoSVBSX0lPQVNDX1NFTlNFX0tFWShpb2FzYykgPT0gMHgwNSkgJiYKKwkJICAgIChiZTMyX3RvX2NwdShpb2FzYS0+aW9hc2Nfc3BlY2lmaWMpICYgSVBSX0ZJRUxEX1BPSU5URVJfVkFMSUQpKSB7CisJCQlzZW5zZV9idWZbN10gPSAxMDsJLyogYWRkaXRpb25hbCBsZW5ndGggKi8KKworCQkJLyogSU9BUkNCIHdhcyBpbiBlcnJvciAqLworCQkJaWYgKElQUl9JT0FTQ19TRU5TRV9DT0RFKGlvYXNjKSA9PSAweDI0KQorCQkJCXNlbnNlX2J1ZlsxNV0gPSAweEMwOworCQkJZWxzZQkvKiBQYXJhbWV0ZXIgZGF0YSB3YXMgaW52YWxpZCAqLworCQkJCXNlbnNlX2J1ZlsxNV0gPSAweDgwOworCisJCQlzZW5zZV9idWZbMTZdID0KKwkJCSAgICAoKElQUl9GSUVMRF9QT0lOVEVSX01BU0sgJgorCQkJICAgICAgYmUzMl90b19jcHUoaW9hc2EtPmlvYXNjX3NwZWNpZmljKSkgPj4gOCkgJiAweGZmOworCQkJc2Vuc2VfYnVmWzE3XSA9CisJCQkgICAgKElQUl9GSUVMRF9QT0lOVEVSX01BU0sgJgorCQkJICAgICBiZTMyX3RvX2NwdShpb2FzYS0+aW9hc2Nfc3BlY2lmaWMpKSAmIDB4ZmY7CisJCX0gZWxzZSB7CisJCQlpZiAoaW9hc2MgPT0gSVBSX0lPQVNDX01FRF9ET19OT1RfUkVBTExPQykgeworCQkJCWlmIChpcHJfaXNfdnNldF9kZXZpY2UocmVzKSkKKwkJCQkJZmFpbGluZ19sYmEgPSBiZTMyX3RvX2NwdShpb2FzYS0+dS52c2V0LmZhaWxpbmdfbGJhX2xvKTsKKwkJCQllbHNlCisJCQkJCWZhaWxpbmdfbGJhID0gYmUzMl90b19jcHUoaW9hc2EtPnUuZGFzZC5mYWlsaW5nX2xiYSk7CisKKwkJCQlzZW5zZV9idWZbMF0gfD0gMHg4MDsJLyogT3IgaW4gdGhlIFZhbGlkIGJpdCAqLworCQkJCXNlbnNlX2J1ZlszXSA9IChmYWlsaW5nX2xiYSAmIDB4ZmYwMDAwMDApID4+IDI0OworCQkJCXNlbnNlX2J1Zls0XSA9IChmYWlsaW5nX2xiYSAmIDB4MDBmZjAwMDApID4+IDE2OworCQkJCXNlbnNlX2J1Zls1XSA9IChmYWlsaW5nX2xiYSAmIDB4MDAwMGZmMDApID4+IDg7CisJCQkJc2Vuc2VfYnVmWzZdID0gZmFpbGluZ19sYmEgJiAweDAwMDAwMGZmOworCQkJfQorCisJCQlzZW5zZV9idWZbN10gPSA2OwkvKiBhZGRpdGlvbmFsIGxlbmd0aCAqLworCQl9CisJfQorfQorCisvKioKKyAqIGlwcl9lcnBfc3RhcnQgLSBQcm9jZXNzIGFuIGVycm9yIHJlc3BvbnNlIGZvciBhIFNDU0kgb3AKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0byBpbml0aWF0ZSBFUlAKKyAqIG9uIHRoZSBhZmZlY3RlZCBkZXZpY2UuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vdGhpbmcKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9lcnBfc3RhcnQoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJICAgICAgc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfY21kID0gaXByX2NtZC0+c2NzaV9jbWQ7CisJc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzID0gc2NzaV9jbWQtPmRldmljZS0+aG9zdGRhdGE7CisJdTMyIGlvYXNjID0gYmUzMl90b19jcHUoaXByX2NtZC0+aW9hc2EuaW9hc2MpOworCisJaWYgKCFyZXMpIHsKKwkJaXByX3Njc2lfZWhfZG9uZShpcHJfY21kKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpcHJfaXNfZ3Njc2kocmVzKSkKKwkJaXByX2R1bXBfaW9hc2EoaW9hX2NmZywgaXByX2NtZCk7CisJZWxzZQorCQlpcHJfZ2VuX3NlbnNlKGlwcl9jbWQpOworCisJc3dpdGNoIChpb2FzYyAmIElQUl9JT0FTQ19JT0FTQ19NQVNLKSB7CisJY2FzZSBJUFJfSU9BU0NfQUJPUlRFRF9DTURfVEVSTV9CWV9IT1NUOgorCQlzY3NpX2NtZC0+cmVzdWx0IHw9IChESURfSU1NX1JFVFJZIDw8IDE2KTsKKwkJYnJlYWs7CisJY2FzZSBJUFJfSU9BU0NfSVJfUkVTT1VSQ0VfSEFORExFOgorCQlzY3NpX2NtZC0+cmVzdWx0IHw9IChESURfTk9fQ09OTkVDVCA8PCAxNik7CisJCWJyZWFrOworCWNhc2UgSVBSX0lPQVNDX0hXX1NFTF9USU1FT1VUOgorCQlzY3NpX2NtZC0+cmVzdWx0IHw9IChESURfTk9fQ09OTkVDVCA8PCAxNik7CisJCXJlcy0+bmVlZHNfc3luY19jb21wbGV0ZSA9IDE7CisJCWJyZWFrOworCWNhc2UgSVBSX0lPQVNDX1NZTkNfUkVRVUlSRUQ6CisJCWlmICghcmVzLT5pbl9lcnApCisJCQlyZXMtPm5lZWRzX3N5bmNfY29tcGxldGUgPSAxOworCQlzY3NpX2NtZC0+cmVzdWx0IHw9IChESURfSU1NX1JFVFJZIDw8IDE2KTsKKwkJYnJlYWs7CisJY2FzZSBJUFJfSU9BU0NfTUVEX0RPX05PVF9SRUFMTE9DOiAvKiBwcmV2ZW50IHJldHJpZXMgKi8KKwkJc2NzaV9jbWQtPnJlc3VsdCB8PSAoRElEX1BBU1NUSFJPVUdIIDw8IDE2KTsKKwkJYnJlYWs7CisJY2FzZSBJUFJfSU9BU0NfQlVTX1dBU19SRVNFVDoKKwljYXNlIElQUl9JT0FTQ19CVVNfV0FTX1JFU0VUX0JZX09USEVSOgorCQkvKgorCQkgKiBSZXBvcnQgdGhlIGJ1cyByZXNldCBhbmQgYXNrIGZvciBhIHJldHJ5LiBUaGUgZGV2aWNlCisJCSAqIHdpbGwgZ2l2ZSBDQy9VQSB0aGUgbmV4dCBjb21tYW5kLgorCQkgKi8KKwkJaWYgKCFyZXMtPnJlc2V0dGluZ19kZXZpY2UpCisJCQlzY3NpX3JlcG9ydF9idXNfcmVzZXQoaW9hX2NmZy0+aG9zdCwgc2NzaV9jbWQtPmRldmljZS0+Y2hhbm5lbCk7CisJCXNjc2lfY21kLT5yZXN1bHQgfD0gKERJRF9FUlJPUiA8PCAxNik7CisJCXJlcy0+bmVlZHNfc3luY19jb21wbGV0ZSA9IDE7CisJCWJyZWFrOworCWNhc2UgSVBSX0lPQVNDX0hXX0RFVl9CVVNfU1RBVFVTOgorCQlzY3NpX2NtZC0+cmVzdWx0IHw9IElQUl9JT0FTQ19TRU5TRV9TVEFUVVMoaW9hc2MpOworCQlpZiAoSVBSX0lPQVNDX1NFTlNFX1NUQVRVUyhpb2FzYykgPT0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OKSB7CisJCQlpcHJfZXJwX2NhbmNlbF9hbGwoaXByX2NtZCk7CisJCQlyZXR1cm47CisJCX0KKwkJcmVzLT5uZWVkc19zeW5jX2NvbXBsZXRlID0gMTsKKwkJYnJlYWs7CisJY2FzZSBJUFJfSU9BU0NfTlJfSU5JVF9DTURfUkVRVUlSRUQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNjc2lfY21kLT5yZXN1bHQgfD0gKERJRF9FUlJPUiA8PCAxNik7CisJCWlmICghaXByX2lzX3ZzZXRfZGV2aWNlKHJlcykpCisJCQlyZXMtPm5lZWRzX3N5bmNfY29tcGxldGUgPSAxOworCQlicmVhazsKKwl9CisKKwlpcHJfdW5tYXBfc2dsaXN0KGlvYV9jZmcsIGlwcl9jbWQpOworCWxpc3RfYWRkX3RhaWwoJmlwcl9jbWQtPnF1ZXVlLCAmaW9hX2NmZy0+ZnJlZV9xKTsKKwlzY3NpX2NtZC0+c2NzaV9kb25lKHNjc2lfY21kKTsKK30KKworLyoqCisgKiBpcHJfc2NzaV9kb25lIC0gbWlkLWxheWVyIGRvbmUgZnVuY3Rpb24KKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyIGZvcgorICogb3BzIGdlbmVyYXRlZCBieSB0aGUgU0NTSSBtaWQtbGF5ZXIKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX3Njc2lfZG9uZShzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2NtZCA9IGlwcl9jbWQtPnNjc2lfY21kOworCXUzMiBpb2FzYyA9IGJlMzJfdG9fY3B1KGlwcl9jbWQtPmlvYXNhLmlvYXNjKTsKKworCXNjc2lfY21kLT5yZXNpZCA9IGJlMzJfdG9fY3B1KGlwcl9jbWQtPmlvYXNhLnJlc2lkdWFsX2RhdGFfbGVuKTsKKworCWlmIChsaWtlbHkoSVBSX0lPQVNDX1NFTlNFX0tFWShpb2FzYykgPT0gMCkpIHsKKwkJaXByX3VubWFwX3NnbGlzdChpb2FfY2ZnLCBpcHJfY21kKTsKKwkJbGlzdF9hZGRfdGFpbCgmaXByX2NtZC0+cXVldWUsICZpb2FfY2ZnLT5mcmVlX3EpOworCQlzY3NpX2NtZC0+c2NzaV9kb25lKHNjc2lfY21kKTsKKwl9IGVsc2UKKwkJaXByX2VycF9zdGFydChpb2FfY2ZnLCBpcHJfY21kKTsKK30KKworLyoqCisgKiBpcHJfc2F2ZV9pb2FmcF9tb2RlX3NlbGVjdCAtIFNhdmUgYWRhcHRlcnMgbW9kZSBzZWxlY3QgZGF0YQorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKiBAc2NzaV9jbWQ6CXNjc2kgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNhdmVzIG1vZGUgc2VsZWN0IGRhdGEgZm9yIHRoZSBhZGFwdGVyIHRvCisgKiB1c2UgZm9sbG93aW5nIGFuIGFkYXB0ZXIgcmVzZXQuCisgKgorICogUmV0dXJuIHZhbHVlOgorICoJMCBvbiBzdWNjZXNzIC8gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWSBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgaW50IGlwcl9zYXZlX2lvYWZwX21vZGVfc2VsZWN0KHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZywKKwkJCQkgICAgICAgc3RydWN0IHNjc2lfY21uZCAqc2NzaV9jbWQpCit7CisJaWYgKCFpb2FfY2ZnLT5zYXZlZF9tb2RlX3BhZ2VzKSB7CisJCWlvYV9jZmctPnNhdmVkX21vZGVfcGFnZXMgID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwcl9tb2RlX3BhZ2VzKSwKKwkJCQkJCSAgICAgR0ZQX0FUT01JQyk7CisJCWlmICghaW9hX2NmZy0+c2F2ZWRfbW9kZV9wYWdlcykgeworCQkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LAorCQkJCSJJT0EgbW9kZSBzZWxlY3QgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCQl9CisJfQorCisJbWVtY3B5KGlvYV9jZmctPnNhdmVkX21vZGVfcGFnZXMsIHNjc2lfY21kLT5idWZmZXIsIHNjc2lfY21kLT5jbW5kWzRdKTsKKwlpb2FfY2ZnLT5zYXZlZF9tb2RlX3BhZ2VfbGVuID0gc2NzaV9jbWQtPmNtbmRbNF07CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXByX3F1ZXVlY29tbWFuZCAtIFF1ZXVlIGEgbWlkLWxheWVyIHJlcXVlc3QKKyAqIEBzY3NpX2NtZDoJc2NzaSBjb21tYW5kIHN0cnVjdAorICogQGRvbmU6CQlkb25lIGZ1bmN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBxdWV1ZXMgYSByZXF1ZXN0IGdlbmVyYXRlZCBieSB0aGUgbWlkLWxheWVyLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCTAgb24gc3VjY2VzcworICoJU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZIGlmIGRldmljZSBpcyBidXN5CisgKglTQ1NJX01MUVVFVUVfSE9TVF9CVVNZIGlmIGhvc3QgaXMgYnVzeQorICoqLworc3RhdGljIGludCBpcHJfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfY21kLAorCQkJICAgIHZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmc7CisJc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzOworCXN0cnVjdCBpcHJfaW9hcmNiICppb2FyY2I7CisJc3RydWN0IGlwcl9jbW5kICppcHJfY21kOworCWludCByYyA9IDA7CisKKwlzY3NpX2NtZC0+c2NzaV9kb25lID0gZG9uZTsKKwlpb2FfY2ZnID0gKHN0cnVjdCBpcHJfaW9hX2NmZyAqKXNjc2lfY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXJlcyA9IHNjc2lfY21kLT5kZXZpY2UtPmhvc3RkYXRhOworCXNjc2lfY21kLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KTsKKworCS8qCisJICogV2UgYXJlIGN1cnJlbnRseSBibG9ja2luZyBhbGwgZGV2aWNlcyBkdWUgdG8gYSBob3N0IHJlc2V0CisJICogV2UgaGF2ZSB0b2xkIHRoZSBob3N0IHRvIHN0b3AgZ2l2aW5nIHVzIG5ldyByZXF1ZXN0cywgYnV0CisJICogRVJQIG9wcyBkb24ndCBjb3VudC4gRklYTUUKKwkgKi8KKwlpZiAodW5saWtlbHkoIWlvYV9jZmctPmFsbG93X2NtZHMgJiYgIWlvYV9jZmctPmlvYV9pc19kZWFkKSkKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisKKwkvKgorCSAqIEZJWE1FIC0gQ3JlYXRlIHNjc2lfc2V0X2hvc3Rfb2ZmbGluZSBpbnRlcmZhY2UKKwkgKiAgYW5kIHRoZSBpb2FfaXNfZGVhZCBjaGVjayBjYW4gYmUgcmVtb3ZlZAorCSAqLworCWlmICh1bmxpa2VseShpb2FfY2ZnLT5pb2FfaXNfZGVhZCB8fCAhcmVzKSkgeworCQltZW1zZXQoc2NzaV9jbWQtPnNlbnNlX2J1ZmZlciwgMCwgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKKwkJc2NzaV9jbWQtPnJlc3VsdCA9IChESURfTk9fQ09OTkVDVCA8PCAxNik7CisJCXNjc2lfY21kLT5zY3NpX2RvbmUoc2NzaV9jbWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpcHJfY21kID0gaXByX2dldF9mcmVlX2lwcl9jbW5kKGlvYV9jZmcpOworCWlvYXJjYiA9ICZpcHJfY21kLT5pb2FyY2I7CisJbGlzdF9hZGRfdGFpbCgmaXByX2NtZC0+cXVldWUsICZpb2FfY2ZnLT5wZW5kaW5nX3EpOworCisJbWVtY3B5KGlvYXJjYi0+Y21kX3BrdC5jZGIsIHNjc2lfY21kLT5jbW5kLCBzY3NpX2NtZC0+Y21kX2xlbik7CisJaXByX2NtZC0+c2NzaV9jbWQgPSBzY3NpX2NtZDsKKwlpb2FyY2ItPnJlc19oYW5kbGUgPSByZXMtPmNmZ3RlLnJlc19oYW5kbGU7CisJaXByX2NtZC0+ZG9uZSA9IGlwcl9zY3NpX2RvbmU7CisJaXByX3RyY19ob29rKGlwcl9jbWQsIElQUl9UUkFDRV9TVEFSVCwgSVBSX0dFVF9QSFlTX0xPQyhyZXMtPmNmZ3RlLnJlc19hZGRyKSk7CisKKwlpZiAoaXByX2lzX2dzY3NpKHJlcykgfHwgaXByX2lzX3ZzZXRfZGV2aWNlKHJlcykpIHsKKwkJaWYgKHNjc2lfY21kLT51bmRlcmZsb3cgPT0gMCkKKwkJCWlvYXJjYi0+Y21kX3BrdC5mbGFnc19oaSB8PSBJUFJfRkxBR1NfSElfTk9fVUxFTl9DSEs7CisKKwkJaWYgKHJlcy0+bmVlZHNfc3luY19jb21wbGV0ZSkgeworCQkJaW9hcmNiLT5jbWRfcGt0LmZsYWdzX2hpIHw9IElQUl9GTEFHU19ISV9TWU5DX0NPTVBMRVRFOworCQkJcmVzLT5uZWVkc19zeW5jX2NvbXBsZXRlID0gMDsKKwkJfQorCisJCWlvYXJjYi0+Y21kX3BrdC5mbGFnc19oaSB8PSBJUFJfRkxBR1NfSElfTk9fTElOS19ERVNDOworCQlpb2FyY2ItPmNtZF9wa3QuZmxhZ3NfbG8gfD0gSVBSX0ZMQUdTX0xPX0RFTEFZX0FGVEVSX1JTVDsKKwkJaW9hcmNiLT5jbWRfcGt0LmZsYWdzX2xvIHw9IElQUl9GTEFHU19MT19BTElHTkVEX0JGUjsKKwkJaW9hcmNiLT5jbWRfcGt0LmZsYWdzX2xvIHw9IGlwcl9nZXRfdGFza19hdHRyaWJ1dGVzKHNjc2lfY21kKTsKKwl9CisKKwlpZiAoc2NzaV9jbWQtPmNtbmRbMF0gPj0gMHhDMCAmJgorCSAgICAoIWlwcl9pc19nc2NzaShyZXMpIHx8IHNjc2lfY21kLT5jbW5kWzBdID09IElQUl9RVUVSWV9SU1JDX1NUQVRFKSkKKwkJaW9hcmNiLT5jbWRfcGt0LnJlcXVlc3RfdHlwZSA9IElQUl9SUVRZUEVfSU9BQ01EOworCisJaWYgKGlwcl9pc19pb2FfcmVzb3VyY2UocmVzKSAmJiBzY3NpX2NtZC0+Y21uZFswXSA9PSBNT0RFX1NFTEVDVCkKKwkJcmMgPSBpcHJfc2F2ZV9pb2FmcF9tb2RlX3NlbGVjdChpb2FfY2ZnLCBzY3NpX2NtZCk7CisKKwlpZiAobGlrZWx5KHJjID09IDApKQorCQlyYyA9IGlwcl9idWlsZF9pb2FkbChpb2FfY2ZnLCBpcHJfY21kKTsKKworCWlmIChsaWtlbHkocmMgPT0gMCkpIHsKKwkJbWIoKTsKKwkJd3JpdGVsKGJlMzJfdG9fY3B1KGlwcl9jbWQtPmlvYXJjYi5pb2FyY2JfaG9zdF9wY2lfYWRkciksCisJCSAgICAgICBpb2FfY2ZnLT5yZWdzLmlvYXJyaW5fcmVnKTsKKwl9IGVsc2UgeworCQkgbGlzdF9tb3ZlX3RhaWwoJmlwcl9jbWQtPnF1ZXVlLCAmaW9hX2NmZy0+ZnJlZV9xKTsKKwkJIHJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlwcl9pbmZvIC0gR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjYXJkL2RyaXZlcgorICogQHNjc2lfaG9zdDoJc2NzaSBob3N0IHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlwb2ludGVyIHRvIGJ1ZmZlciB3aXRoIGRlc2NyaXB0aW9uIHN0cmluZworICoqLworc3RhdGljIGNvbnN0IGNoYXIgKiBpcHJfaW9hX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdGF0aWMgY2hhciBidWZmZXJbNTEyXTsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmc7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzID0gMDsKKworCWlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopIGhvc3QtPmhvc3RkYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlzcHJpbnRmKGJ1ZmZlciwgIklCTSAlWCBTdG9yYWdlIEFkYXB0ZXIiLCBpb2FfY2ZnLT50eXBlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisKKwlyZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAorCS5uYW1lID0gIklQUiIsCisJLmluZm8gPSBpcHJfaW9hX2luZm8sCisJLnF1ZXVlY29tbWFuZCA9IGlwcl9xdWV1ZWNvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIgPSBpcHJfZWhfYWJvcnQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gaXByX2VoX2Rldl9yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyID0gaXByX2VoX2hvc3RfcmVzZXQsCisJLnNsYXZlX2FsbG9jID0gaXByX3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9jb25maWd1cmUgPSBpcHJfc2xhdmVfY29uZmlndXJlLAorCS5zbGF2ZV9kZXN0cm95ID0gaXByX3NsYXZlX2Rlc3Ryb3ksCisJLmNoYW5nZV9xdWV1ZV9kZXB0aCA9IGlwcl9jaGFuZ2VfcXVldWVfZGVwdGgsCisJLmNoYW5nZV9xdWV1ZV90eXBlID0gaXByX2NoYW5nZV9xdWV1ZV90eXBlLAorCS5iaW9zX3BhcmFtID0gaXByX2Jpb3NwYXJhbSwKKwkuY2FuX3F1ZXVlID0gSVBSX01BWF9DT01NQU5EUywKKwkudGhpc19pZCA9IC0xLAorCS5zZ190YWJsZXNpemUgPSBJUFJfTUFYX1NHTElTVCwKKwkubWF4X3NlY3RvcnMgPSBJUFJfSU9BX01BWF9TRUNUT1JTLAorCS5jbWRfcGVyX2x1biA9IElQUl9NQVhfQ01EX1BFUl9MVU4sCisJLnVzZV9jbHVzdGVyaW5nID0gRU5BQkxFX0NMVVNURVJJTkcsCisJLnNob3N0X2F0dHJzID0gaXByX2lvYV9hdHRycywKKwkuc2Rldl9hdHRycyA9IGlwcl9kZXZfYXR0cnMsCisJLnByb2NfbmFtZSA9IElQUl9OQU1FCit9OworCisjaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCitzdGF0aWMgY29uc3QgdTE2IGlwcl9ibG9ja2VkX3Byb2Nlc3NvcnNbXSA9IHsKKwlQVl9OT1JUSFNUQVIsCisJUFZfUFVMU0FSLAorCVBWX1BPV0VSNCwKKwlQVl9JQ0VTVEFSLAorCVBWX1NTVEFSLAorCVBWX1BPV0VSNHAsCisJUFZfNjMwLAorCVBWXzYzMHAKK307CisKKy8qKgorICogaXByX2ludmFsaWRfYWRhcHRlciAtIERldGVybWluZSBpZiB0aGlzIGFkYXB0ZXIgaXMgc3VwcG9ydGVkIG9uIHRoaXMgaGFyZHdhcmUKKyAqIEBpb2FfY2ZnOglpb2EgY2ZnIHN0cnVjdAorICoKKyAqIEFkYXB0ZXJzIHRoYXQgdXNlIEdlbXN0b25lIHJldmlzaW9uIDwgMy4xIGRvIG5vdCB3b3JrIHJlbGlhYmx5IG9uCisgKiBjZXJ0YWluIHBTZXJpZXMgaGFyZHdhcmUuIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4KKyAqIGFkYXB0ZXIgaXMgaW4gb25lIG9mIHRoZXNlIGNvbmZndXJhdGlvbnMgb3Igbm90LgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkxIGlmIGFkYXB0ZXIgaXMgbm90IHN1cHBvcnRlZCAvIDAgaWYgYWRhcHRlciBpcyBzdXBwb3J0ZWQKKyAqKi8KK3N0YXRpYyBpbnQgaXByX2ludmFsaWRfYWRhcHRlcihzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCit7CisJdTggcmV2X2lkOworCWludCBpOworCisJaWYgKGlvYV9jZmctPnR5cGUgPT0gMHg1NzAyKSB7CisJCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShpb2FfY2ZnLT5wZGV2LCBQQ0lfUkVWSVNJT05fSUQsCisJCQkJCSAmcmV2X2lkKSA9PSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKKwkJCWlmIChyZXZfaWQgPCA0KSB7CisJCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXByX2Jsb2NrZWRfcHJvY2Vzc29ycyk7IGkrKyl7CisJCQkJCWlmIChfX2lzX3Byb2Nlc3NvcihpcHJfYmxvY2tlZF9wcm9jZXNzb3JzW2ldKSkKKwkJCQkJCXJldHVybiAxOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGlwcl9pbnZhbGlkX2FkYXB0ZXIoaW9hX2NmZykgMAorI2VuZGlmCisKKy8qKgorICogaXByX2lvYV9icmluZ2Rvd25fZG9uZSAtIElPQSBicmluZyBkb3duIGNvbXBsZXRpb24uCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIGNvbXBsZXRpb24gb2YgYW4gYWRhcHRlciBicmluZyBkb3duLgorICogSXQgd2FrZXMgYW55IHJlc2V0IHNsZWVwZXJzLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlJUFJfUkNfSk9CX1JFVFVSTgorICoqLworc3RhdGljIGludCBpcHJfaW9hX2JyaW5nZG93bl9kb25lKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCisJRU5URVI7CisJaW9hX2NmZy0+aW5fcmVzZXRfcmVsb2FkID0gMDsKKwlpb2FfY2ZnLT5yZXNldF9yZXRyaWVzID0gMDsKKwlsaXN0X2FkZF90YWlsKCZpcHJfY21kLT5xdWV1ZSwgJmlvYV9jZmctPmZyZWVfcSk7CisJd2FrZV91cF9hbGwoJmlvYV9jZmctPnJlc2V0X3dhaXRfcSk7CisKKwlzcGluX3VubG9ja19pcnEoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrKTsKKwlzY3NpX3VuYmxvY2tfcmVxdWVzdHMoaW9hX2NmZy0+aG9zdCk7CisJc3Bpbl9sb2NrX2lycShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2spOworCUxFQVZFOworCisJcmV0dXJuIElQUl9SQ19KT0JfUkVUVVJOOworfQorCisvKioKKyAqIGlwcl9pb2FfcmVzZXRfZG9uZSAtIElPQSByZXNldCBjb21wbGV0aW9uLgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHRoZSBjb21wbGV0aW9uIG9mIGFuIGFkYXB0ZXIgcmVzZXQuCisgKiBJdCBzY2hlZHVsZXMgYW55IG5lY2Vzc2FyeSBtaWQtbGF5ZXIgYWRkL3JlbW92ZXMgYW5kCisgKiB3YWtlcyBhbnkgcmVzZXQgc2xlZXBlcnMuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCUlQUl9SQ19KT0JfUkVUVVJOCisgKiovCitzdGF0aWMgaW50IGlwcl9pb2FfcmVzZXRfZG9uZShzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKwlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXM7CisJc3RydWN0IGlwcl9ob3N0cmNiICpob3N0cmNiLCAqdGVtcDsKKwlpbnQgaSA9IDA7CisKKwlFTlRFUjsKKwlpb2FfY2ZnLT5pbl9yZXNldF9yZWxvYWQgPSAwOworCWlvYV9jZmctPmFsbG93X2NtZHMgPSAxOworCWlvYV9jZmctPnJlc2V0X2NtZCA9IE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcywgJmlvYV9jZmctPnVzZWRfcmVzX3EsIHF1ZXVlKSB7CisJCWlmIChpb2FfY2ZnLT5hbGxvd19tbF9hZGRfZGVsICYmIChyZXMtPmFkZF90b19tbCB8fCByZXMtPmRlbF9mcm9tX21sKSkgeworCQkJaXByX3RyYWNlOworCQkJYnJlYWs7CisJCX0KKwl9CisJc2NoZWR1bGVfd29yaygmaW9hX2NmZy0+d29ya19xKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3N0cmNiLCB0ZW1wLCAmaW9hX2NmZy0+aG9zdHJjYl9mcmVlX3EsIHF1ZXVlKSB7CisJCWxpc3RfZGVsKCZob3N0cmNiLT5xdWV1ZSk7CisJCWlmIChpKysgPCBJUFJfTlVNX0xPR19IQ0FNUykKKwkJCWlwcl9zZW5kX2hjYW0oaW9hX2NmZywgSVBSX0hDQU1fQ0RCX09QX0NPREVfTE9HX0RBVEEsIGhvc3RyY2IpOworCQllbHNlCisJCQlpcHJfc2VuZF9oY2FtKGlvYV9jZmcsIElQUl9IQ0FNX0NEQl9PUF9DT0RFX0NPTkZJR19DSEFOR0UsIGhvc3RyY2IpOworCX0KKworCWRldl9pbmZvKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJJT0EgaW5pdGlhbGl6ZWQuXG4iKTsKKworCWlvYV9jZmctPnJlc2V0X3JldHJpZXMgPSAwOworCWxpc3RfYWRkX3RhaWwoJmlwcl9jbWQtPnF1ZXVlLCAmaW9hX2NmZy0+ZnJlZV9xKTsKKwl3YWtlX3VwX2FsbCgmaW9hX2NmZy0+cmVzZXRfd2FpdF9xKTsKKworCXNwaW5fdW5sb2NrX2lycShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2spOworCXNjc2lfdW5ibG9ja19yZXF1ZXN0cyhpb2FfY2ZnLT5ob3N0KTsKKwlzcGluX2xvY2tfaXJxKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jayk7CisKKwlpZiAoIWlvYV9jZmctPmFsbG93X2NtZHMpCisJCXNjc2lfYmxvY2tfcmVxdWVzdHMoaW9hX2NmZy0+aG9zdCk7CisKKwlMRUFWRTsKKwlyZXR1cm4gSVBSX1JDX0pPQl9SRVRVUk47Cit9CisKKy8qKgorICogaXByX3NldF9zdXBfZGV2X2RmbHQgLSBJbml0aWFsaXplIGEgU2V0IFN1cHBvcnRlZCBEZXZpY2UgYnVmZmVyCisgKiBAc3VwcG9ydGVkX2RldjoJc3VwcG9ydGVkIGRldmljZSBzdHJ1Y3QKKyAqIEB2cGlkczoJCQl2ZW5kb3IgcHJvZHVjdCBpZCBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX3NldF9zdXBfZGV2X2RmbHQoc3RydWN0IGlwcl9zdXBwb3J0ZWRfZGV2aWNlICpzdXBwb3J0ZWRfZGV2LAorCQkJCSBzdHJ1Y3QgaXByX3N0ZF9pbnFfdnBpZHMgKnZwaWRzKQoreworCW1lbXNldChzdXBwb3J0ZWRfZGV2LCAwLCBzaXplb2Yoc3RydWN0IGlwcl9zdXBwb3J0ZWRfZGV2aWNlKSk7CisJbWVtY3B5KCZzdXBwb3J0ZWRfZGV2LT52cGlkcywgdnBpZHMsIHNpemVvZihzdHJ1Y3QgaXByX3N0ZF9pbnFfdnBpZHMpKTsKKwlzdXBwb3J0ZWRfZGV2LT5udW1fcmVjb3JkcyA9IDE7CisJc3VwcG9ydGVkX2Rldi0+ZGF0YV9sZW5ndGggPQorCQljcHVfdG9fYmUxNihzaXplb2Yoc3RydWN0IGlwcl9zdXBwb3J0ZWRfZGV2aWNlKSk7CisJc3VwcG9ydGVkX2Rldi0+cmVzZXJ2ZWQgPSAwOworfQorCisvKioKKyAqIGlwcl9zZXRfc3VwcG9ydGVkX2RldnMgLSBTZW5kIFNldCBTdXBwb3J0ZWQgRGV2aWNlcyBmb3IgYSBkZXZpY2UKKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmQgYSBTZXQgU3VwcG9ydGVkIERldmljZXMgdG8gdGhlIGFkYXB0ZXIKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJSVBSX1JDX0pPQl9DT05USU5VRSAvIElQUl9SQ19KT0JfUkVUVVJOCisgKiovCitzdGF0aWMgaW50IGlwcl9zZXRfc3VwcG9ydGVkX2RldnMoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJc3RydWN0IGlwcl9zdXBwb3J0ZWRfZGV2aWNlICpzdXBwX2RldiA9ICZpb2FfY2ZnLT52cGRfY2JzLT5zdXBwX2RldjsKKwlzdHJ1Y3QgaXByX2lvYWRsX2Rlc2MgKmlvYWRsID0gaXByX2NtZC0+aW9hZGw7CisJc3RydWN0IGlwcl9pb2FyY2IgKmlvYXJjYiA9ICZpcHJfY21kLT5pb2FyY2I7CisJc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzID0gaXByX2NtZC0+dS5yZXM7CisKKwlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9pb2FfcmVzZXRfZG9uZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUocmVzLCAmaW9hX2NmZy0+dXNlZF9yZXNfcSwgcXVldWUpIHsKKwkJaWYgKCFpcHJfaXNfYWZfZGFzZF9kZXZpY2UocmVzKSkKKwkJCWNvbnRpbnVlOworCisJCWlwcl9jbWQtPnUucmVzID0gcmVzOworCQlpcHJfc2V0X3N1cF9kZXZfZGZsdChzdXBwX2RldiwgJnJlcy0+Y2ZndGUuc3RkX2lucV9kYXRhLnZwaWRzKTsKKworCQlpb2FyY2ItPnJlc19oYW5kbGUgPSBjcHVfdG9fYmUzMihJUFJfSU9BX1JFU19IQU5ETEUpOworCQlpb2FyY2ItPmNtZF9wa3QuZmxhZ3NfaGkgfD0gSVBSX0ZMQUdTX0hJX1dSSVRFX05PVF9SRUFEOworCQlpb2FyY2ItPmNtZF9wa3QucmVxdWVzdF90eXBlID0gSVBSX1JRVFlQRV9JT0FDTUQ7CisKKwkJaW9hcmNiLT5jbWRfcGt0LmNkYlswXSA9IElQUl9TRVRfU1VQUE9SVEVEX0RFVklDRVM7CisJCWlvYXJjYi0+Y21kX3BrdC5jZGJbN10gPSAoc2l6ZW9mKHN0cnVjdCBpcHJfc3VwcG9ydGVkX2RldmljZSkgPj4gOCkgJiAweGZmOworCQlpb2FyY2ItPmNtZF9wa3QuY2RiWzhdID0gc2l6ZW9mKHN0cnVjdCBpcHJfc3VwcG9ydGVkX2RldmljZSkgJiAweGZmOworCisJCWlvYWRsLT5mbGFnc19hbmRfZGF0YV9sZW4gPSBjcHVfdG9fYmUzMihJUFJfSU9BRExfRkxBR1NfV1JJVEVfTEFTVCB8CisJCQkJCQkJc2l6ZW9mKHN0cnVjdCBpcHJfc3VwcG9ydGVkX2RldmljZSkpOworCQlpb2FkbC0+YWRkcmVzcyA9IGNwdV90b19iZTMyKGlvYV9jZmctPnZwZF9jYnNfZG1hICsKKwkJCQkJICAgICBvZmZzZXRvZihzdHJ1Y3QgaXByX21pc2NfY2JzLCBzdXBwX2RldikpOworCQlpb2FyY2ItPndyaXRlX2lvYWRsX2xlbiA9IGNwdV90b19iZTMyKHNpemVvZihzdHJ1Y3QgaXByX2lvYWRsX2Rlc2MpKTsKKwkJaW9hcmNiLT53cml0ZV9kYXRhX3RyYW5zZmVyX2xlbmd0aCA9CisJCQljcHVfdG9fYmUzMihzaXplb2Yoc3RydWN0IGlwcl9zdXBwb3J0ZWRfZGV2aWNlKSk7CisKKwkJaXByX2RvX3JlcShpcHJfY21kLCBpcHJfcmVzZXRfaW9hX2pvYiwgaXByX3RpbWVvdXQsCisJCQkgICBJUFJfU0VUX1NVUF9ERVZJQ0VfVElNRU9VVCk7CisKKwkJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfc2V0X3N1cHBvcnRlZF9kZXZzOworCQlyZXR1cm4gSVBSX1JDX0pPQl9SRVRVUk47CisJfQorCisJcmV0dXJuIElQUl9SQ19KT0JfQ09OVElOVUU7Cit9CisKKy8qKgorICogaXByX2dldF9tb2RlX3BhZ2UgLSBMb2NhdGUgc3BlY2lmaWVkIG1vZGUgcGFnZQorICogQG1vZGVfcGFnZXM6CW1vZGUgcGFnZSBidWZmZXIKKyAqIEBwYWdlX2NvZGU6CXBhZ2UgY29kZSB0byBmaW5kCisgKiBAbGVuOgkJbWluaW11bSByZXF1aXJlZCBsZW5ndGggZm9yIG1vZGUgcGFnZQorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlwb2ludGVyIHRvIG1vZGUgcGFnZSAvIE5VTEwgb24gZmFpbHVyZQorICoqLworc3RhdGljIHZvaWQgKmlwcl9nZXRfbW9kZV9wYWdlKHN0cnVjdCBpcHJfbW9kZV9wYWdlcyAqbW9kZV9wYWdlcywKKwkJCSAgICAgICB1MzIgcGFnZV9jb2RlLCB1MzIgbGVuKQoreworCXN0cnVjdCBpcHJfbW9kZV9wYWdlX2hkciAqbW9kZV9oZHI7CisJdTMyIHBhZ2VfbGVuZ3RoOworCXUzMiBsZW5ndGg7CisKKwlpZiAoIW1vZGVfcGFnZXMgfHwgKG1vZGVfcGFnZXMtPmhkci5sZW5ndGggPT0gMCkpCisJCXJldHVybiBOVUxMOworCisJbGVuZ3RoID0gKG1vZGVfcGFnZXMtPmhkci5sZW5ndGggKyAxKSAtIDQgLSBtb2RlX3BhZ2VzLT5oZHIuYmxvY2tfZGVzY19sZW47CisJbW9kZV9oZHIgPSAoc3RydWN0IGlwcl9tb2RlX3BhZ2VfaGRyICopCisJCShtb2RlX3BhZ2VzLT5kYXRhICsgbW9kZV9wYWdlcy0+aGRyLmJsb2NrX2Rlc2NfbGVuKTsKKworCXdoaWxlIChsZW5ndGgpIHsKKwkJaWYgKElQUl9HRVRfTU9ERV9QQUdFX0NPREUobW9kZV9oZHIpID09IHBhZ2VfY29kZSkgeworCQkJaWYgKG1vZGVfaGRyLT5wYWdlX2xlbmd0aCA+PSAobGVuIC0gc2l6ZW9mKHN0cnVjdCBpcHJfbW9kZV9wYWdlX2hkcikpKQorCQkJCXJldHVybiBtb2RlX2hkcjsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJcGFnZV9sZW5ndGggPSAoc2l6ZW9mKHN0cnVjdCBpcHJfbW9kZV9wYWdlX2hkcikgKworCQkJCSAgICAgICBtb2RlX2hkci0+cGFnZV9sZW5ndGgpOworCQkJbGVuZ3RoIC09IHBhZ2VfbGVuZ3RoOworCQkJbW9kZV9oZHIgPSAoc3RydWN0IGlwcl9tb2RlX3BhZ2VfaGRyICopCisJCQkJKCh1bnNpZ25lZCBsb25nKW1vZGVfaGRyICsgcGFnZV9sZW5ndGgpOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIGlwcl9jaGVja190ZXJtX3Bvd2VyIC0gQ2hlY2sgZm9yIHRlcm0gcG93ZXIgZXJyb3JzCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBtb2RlX3BhZ2VzOglJT0FGUCBtb2RlIHBhZ2VzIGJ1ZmZlcgorICoKKyAqIENoZWNrIHRoZSBJT0FGUCdzIG1vZGUgcGFnZSAyOCBmb3IgdGVybSBwb3dlciBlcnJvcnMKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm90aGluZworICoqLworc3RhdGljIHZvaWQgaXByX2NoZWNrX3Rlcm1fcG93ZXIoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJCSBzdHJ1Y3QgaXByX21vZGVfcGFnZXMgKm1vZGVfcGFnZXMpCit7CisJaW50IGk7CisJaW50IGVudHJ5X2xlbmd0aDsKKwlzdHJ1Y3QgaXByX2Rldl9idXNfZW50cnkgKmJ1czsKKwlzdHJ1Y3QgaXByX21vZGVfcGFnZTI4ICptb2RlX3BhZ2U7CisKKwltb2RlX3BhZ2UgPSBpcHJfZ2V0X21vZGVfcGFnZShtb2RlX3BhZ2VzLCAweDI4LAorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaXByX21vZGVfcGFnZTI4KSk7CisKKwllbnRyeV9sZW5ndGggPSBtb2RlX3BhZ2UtPmVudHJ5X2xlbmd0aDsKKworCWJ1cyA9IG1vZGVfcGFnZS0+YnVzOworCisJZm9yIChpID0gMDsgaSA8IG1vZGVfcGFnZS0+bnVtX2VudHJpZXM7IGkrKykgeworCQlpZiAoYnVzLT5mbGFncyAmIElQUl9TQ1NJX0FUVFJfTk9fVEVSTV9QV1IpIHsKKwkJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwKKwkJCQkiVGVybSBwb3dlciBpcyBhYnNlbnQgb24gc2NzaSBidXMgJWRcbiIsCisJCQkJYnVzLT5yZXNfYWRkci5idXMpOworCQl9CisKKwkJYnVzID0gKHN0cnVjdCBpcHJfZGV2X2J1c19lbnRyeSAqKSgoY2hhciAqKWJ1cyArIGVudHJ5X2xlbmd0aCk7CisJfQorfQorCisvKioKKyAqIGlwcl9zY3NpX2J1c19zcGVlZF9saW1pdCAtIExpbWl0IHRoZSBTQ1NJIHNwZWVkIGJhc2VkIG9uIFNFUyB0YWJsZQorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKgorICogTG9va3MgdGhyb3VnaCB0aGUgY29uZmlnIHRhYmxlIGNoZWNraW5nIGZvciBTRVMgZGV2aWNlcy4gSWYKKyAqIHRoZSBTRVMgZGV2aWNlIGlzIGluIHRoZSBTRVMgdGFibGUgaW5kaWNhdGluZyBhIG1heGltdW0gU0NTSQorICogYnVzIHNwZWVkLCB0aGUgc3BlZWQgaXMgbGltaXRlZCBmb3IgdGhlIGJ1cy4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX3Njc2lfYnVzX3NwZWVkX2xpbWl0KHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZykKK3sKKwl1MzIgbWF4X3hmZXJfcmF0ZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJUFJfTUFYX05VTV9CVVNFUzsgaSsrKSB7CisJCW1heF94ZmVyX3JhdGUgPSBpcHJfZ2V0X21heF9zY3NpX3NwZWVkKGlvYV9jZmcsIGksCisJCQkJCQkgICAgICAgaW9hX2NmZy0+YnVzX2F0dHJbaV0uYnVzX3dpZHRoKTsKKworCQlpZiAobWF4X3hmZXJfcmF0ZSA8IGlvYV9jZmctPmJ1c19hdHRyW2ldLm1heF94ZmVyX3JhdGUpCisJCQlpb2FfY2ZnLT5idXNfYXR0cltpXS5tYXhfeGZlcl9yYXRlID0gbWF4X3hmZXJfcmF0ZTsKKwl9Cit9CisKKy8qKgorICogaXByX21vZGlmeV9pb2FmcF9tb2RlX3BhZ2VfMjggLSBNb2RpZnkgSU9BRlAgTW9kZSBQYWdlIDI4CisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBtb2RlX3BhZ2VzOgltb2RlIHBhZ2UgMjggYnVmZmVyCisgKgorICogVXBkYXRlcyBtb2RlIHBhZ2UgMjggYmFzZWQgb24gZHJpdmVyIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX21vZGlmeV9pb2FmcF9tb2RlX3BhZ2VfMjgoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJCQkgIAlzdHJ1Y3QgaXByX21vZGVfcGFnZXMgKm1vZGVfcGFnZXMpCit7CisJaW50IGksIGVudHJ5X2xlbmd0aDsKKwlzdHJ1Y3QgaXByX2Rldl9idXNfZW50cnkgKmJ1czsKKwlzdHJ1Y3QgaXByX2J1c19hdHRyaWJ1dGVzICpidXNfYXR0cjsKKwlzdHJ1Y3QgaXByX21vZGVfcGFnZTI4ICptb2RlX3BhZ2U7CisKKwltb2RlX3BhZ2UgPSBpcHJfZ2V0X21vZGVfcGFnZShtb2RlX3BhZ2VzLCAweDI4LAorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaXByX21vZGVfcGFnZTI4KSk7CisKKwllbnRyeV9sZW5ndGggPSBtb2RlX3BhZ2UtPmVudHJ5X2xlbmd0aDsKKworCS8qIExvb3AgZm9yIGVhY2ggZGV2aWNlIGJ1cyBlbnRyeSAqLworCWZvciAoaSA9IDAsIGJ1cyA9IG1vZGVfcGFnZS0+YnVzOworCSAgICAgaSA8IG1vZGVfcGFnZS0+bnVtX2VudHJpZXM7CisJICAgICBpKyssIGJ1cyA9IChzdHJ1Y3QgaXByX2Rldl9idXNfZW50cnkgKikoKHU4ICopYnVzICsgZW50cnlfbGVuZ3RoKSkgeworCQlpZiAoYnVzLT5yZXNfYWRkci5idXMgPiBJUFJfTUFYX05VTV9CVVNFUykgeworCQkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LAorCQkJCSJJbnZhbGlkIHJlc291cmNlIGFkZHJlc3MgcmVwb3J0ZWQ6IDB4JTA4WFxuIiwKKwkJCQlJUFJfR0VUX1BIWVNfTE9DKGJ1cy0+cmVzX2FkZHIpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYnVzX2F0dHIgPSAmaW9hX2NmZy0+YnVzX2F0dHJbaV07CisJCWJ1cy0+ZXh0ZW5kZWRfcmVzZXRfZGVsYXkgPSBJUFJfRVhURU5ERURfUkVTRVRfREVMQVk7CisJCWJ1cy0+YnVzX3dpZHRoID0gYnVzX2F0dHItPmJ1c193aWR0aDsKKwkJYnVzLT5tYXhfeGZlcl9yYXRlID0gY3B1X3RvX2JlMzIoYnVzX2F0dHItPm1heF94ZmVyX3JhdGUpOworCQlidXMtPmZsYWdzICY9IH5JUFJfU0NTSV9BVFRSX1FBU19NQVNLOworCQlpZiAoYnVzX2F0dHItPnFhc19lbmFibGVkKQorCQkJYnVzLT5mbGFncyB8PSBJUFJfU0NTSV9BVFRSX0VOQUJMRV9RQVM7CisJCWVsc2UKKwkJCWJ1cy0+ZmxhZ3MgfD0gSVBSX1NDU0lfQVRUUl9ESVNBQkxFX1FBUzsKKwl9Cit9CisKKy8qKgorICogaXByX2J1aWxkX21vZGVfc2VsZWN0IC0gQnVpbGQgYSBtb2RlIHNlbGVjdCBjb21tYW5kCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKiBAcmVzX2hhbmRsZToJcmVzb3VyY2UgaGFuZGxlIHRvIHNlbmQgY29tbWFuZCB0bworICogQHBhcm06CQlCeXRlIDIgb2YgTW9kZSBTZW5zZSBjb21tYW5kCisgKiBAZG1hX2FkZHI6CURNQSBidWZmZXIgYWRkcmVzcworICogQHhmZXJfbGVuOglkYXRhIHRyYW5zZmVyIGxlbmd0aAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfYnVpbGRfbW9kZV9zZWxlY3Qoc3RydWN0IGlwcl9jbW5kICppcHJfY21kLAorCQkJCSAgX19iZTMyIHJlc19oYW5kbGUsIHU4IHBhcm0sIHUzMiBkbWFfYWRkciwKKwkJCQkgIHU4IHhmZXJfbGVuKQoreworCXN0cnVjdCBpcHJfaW9hZGxfZGVzYyAqaW9hZGwgPSBpcHJfY21kLT5pb2FkbDsKKwlzdHJ1Y3QgaXByX2lvYXJjYiAqaW9hcmNiID0gJmlwcl9jbWQtPmlvYXJjYjsKKworCWlvYXJjYi0+cmVzX2hhbmRsZSA9IHJlc19oYW5kbGU7CisJaW9hcmNiLT5jbWRfcGt0LnJlcXVlc3RfdHlwZSA9IElQUl9SUVRZUEVfU0NTSUNEQjsKKwlpb2FyY2ItPmNtZF9wa3QuZmxhZ3NfaGkgfD0gSVBSX0ZMQUdTX0hJX1dSSVRFX05PVF9SRUFEOworCWlvYXJjYi0+Y21kX3BrdC5jZGJbMF0gPSBNT0RFX1NFTEVDVDsKKwlpb2FyY2ItPmNtZF9wa3QuY2RiWzFdID0gcGFybTsKKwlpb2FyY2ItPmNtZF9wa3QuY2RiWzRdID0geGZlcl9sZW47CisKKwlpb2FkbC0+ZmxhZ3NfYW5kX2RhdGFfbGVuID0KKwkJY3B1X3RvX2JlMzIoSVBSX0lPQURMX0ZMQUdTX1dSSVRFX0xBU1QgfCB4ZmVyX2xlbik7CisJaW9hZGwtPmFkZHJlc3MgPSBjcHVfdG9fYmUzMihkbWFfYWRkcik7CisJaW9hcmNiLT53cml0ZV9pb2FkbF9sZW4gPSBjcHVfdG9fYmUzMihzaXplb2Yoc3RydWN0IGlwcl9pb2FkbF9kZXNjKSk7CisJaW9hcmNiLT53cml0ZV9kYXRhX3RyYW5zZmVyX2xlbmd0aCA9IGNwdV90b19iZTMyKHhmZXJfbGVuKTsKK30KKworLyoqCisgKiBpcHJfaW9hZnBfbW9kZV9zZWxlY3RfcGFnZTI4IC0gSXNzdWUgTW9kZSBTZWxlY3QgUGFnZSAyOCB0byBJT0EKKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgdGhlIFNDU0kgYnVzIGF0dHJpYnV0ZXMgYW5kIHNlbmRzCisgKiBhIE1vZGUgU2VsZWN0IGZvciBQYWdlIDI4IHRvIGFjdGl2YXRlIHRoZW0uCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCUlQUl9SQ19KT0JfUkVUVVJOCisgKiovCitzdGF0aWMgaW50IGlwcl9pb2FmcF9tb2RlX3NlbGVjdF9wYWdlMjgoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJc3RydWN0IGlwcl9tb2RlX3BhZ2VzICptb2RlX3BhZ2VzID0gJmlvYV9jZmctPnZwZF9jYnMtPm1vZGVfcGFnZXM7CisJaW50IGxlbmd0aDsKKworCUVOVEVSOworCWlmIChpb2FfY2ZnLT5zYXZlZF9tb2RlX3BhZ2VzKSB7CisJCW1lbWNweShtb2RlX3BhZ2VzLCBpb2FfY2ZnLT5zYXZlZF9tb2RlX3BhZ2VzLAorCQkgICAgICAgaW9hX2NmZy0+c2F2ZWRfbW9kZV9wYWdlX2xlbik7CisJCWxlbmd0aCA9IGlvYV9jZmctPnNhdmVkX21vZGVfcGFnZV9sZW47CisJfSBlbHNlIHsKKwkJaXByX3Njc2lfYnVzX3NwZWVkX2xpbWl0KGlvYV9jZmcpOworCQlpcHJfY2hlY2tfdGVybV9wb3dlcihpb2FfY2ZnLCBtb2RlX3BhZ2VzKTsKKwkJaXByX21vZGlmeV9pb2FmcF9tb2RlX3BhZ2VfMjgoaW9hX2NmZywgbW9kZV9wYWdlcyk7CisJCWxlbmd0aCA9IG1vZGVfcGFnZXMtPmhkci5sZW5ndGggKyAxOworCQltb2RlX3BhZ2VzLT5oZHIubGVuZ3RoID0gMDsKKwl9CisKKwlpcHJfYnVpbGRfbW9kZV9zZWxlY3QoaXByX2NtZCwgY3B1X3RvX2JlMzIoSVBSX0lPQV9SRVNfSEFORExFKSwgMHgxMSwKKwkJCSAgICAgIGlvYV9jZmctPnZwZF9jYnNfZG1hICsgb2Zmc2V0b2Yoc3RydWN0IGlwcl9taXNjX2NicywgbW9kZV9wYWdlcyksCisJCQkgICAgICBsZW5ndGgpOworCisJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfc2V0X3N1cHBvcnRlZF9kZXZzOworCWlwcl9jbWQtPnUucmVzID0gbGlzdF9lbnRyeShpb2FfY2ZnLT51c2VkX3Jlc19xLm5leHQsCisJCQkJICAgIHN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnksIHF1ZXVlKTsKKworCWlwcl9kb19yZXEoaXByX2NtZCwgaXByX3Jlc2V0X2lvYV9qb2IsIGlwcl90aW1lb3V0LCBJUFJfSU5URVJOQUxfVElNRU9VVCk7CisKKwlMRUFWRTsKKwlyZXR1cm4gSVBSX1JDX0pPQl9SRVRVUk47Cit9CisKKy8qKgorICogaXByX2J1aWxkX21vZGVfc2Vuc2UgLSBCdWlsZHMgYSBtb2RlIHNlbnNlIGNvbW1hbmQKKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqIEByZXM6CQlyZXNvdXJjZSBlbnRyeSBzdHJ1Y3QKKyAqIEBwYXJtOgkJQnl0ZSAyIG9mIG1vZGUgc2Vuc2UgY29tbWFuZAorICogQGRtYV9hZGRyOglETUEgYWRkcmVzcyBvZiBtb2RlIHNlbnNlIGJ1ZmZlcgorICogQHhmZXJfbGVuOglTaXplIG9mIERNQSBidWZmZXIKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2J1aWxkX21vZGVfc2Vuc2Uoc3RydWN0IGlwcl9jbW5kICppcHJfY21kLAorCQkJCSBfX2JlMzIgcmVzX2hhbmRsZSwKKwkJCQkgdTggcGFybSwgdTMyIGRtYV9hZGRyLCB1OCB4ZmVyX2xlbikKK3sKKwlzdHJ1Y3QgaXByX2lvYWRsX2Rlc2MgKmlvYWRsID0gaXByX2NtZC0+aW9hZGw7CisJc3RydWN0IGlwcl9pb2FyY2IgKmlvYXJjYiA9ICZpcHJfY21kLT5pb2FyY2I7CisKKwlpb2FyY2ItPnJlc19oYW5kbGUgPSByZXNfaGFuZGxlOworCWlvYXJjYi0+Y21kX3BrdC5jZGJbMF0gPSBNT0RFX1NFTlNFOworCWlvYXJjYi0+Y21kX3BrdC5jZGJbMl0gPSBwYXJtOworCWlvYXJjYi0+Y21kX3BrdC5jZGJbNF0gPSB4ZmVyX2xlbjsKKwlpb2FyY2ItPmNtZF9wa3QucmVxdWVzdF90eXBlID0gSVBSX1JRVFlQRV9TQ1NJQ0RCOworCisJaW9hZGwtPmZsYWdzX2FuZF9kYXRhX2xlbiA9CisJCWNwdV90b19iZTMyKElQUl9JT0FETF9GTEFHU19SRUFEX0xBU1QgfCB4ZmVyX2xlbik7CisJaW9hZGwtPmFkZHJlc3MgPSBjcHVfdG9fYmUzMihkbWFfYWRkcik7CisJaW9hcmNiLT5yZWFkX2lvYWRsX2xlbiA9IGNwdV90b19iZTMyKHNpemVvZihzdHJ1Y3QgaXByX2lvYWRsX2Rlc2MpKTsKKwlpb2FyY2ItPnJlYWRfZGF0YV90cmFuc2Zlcl9sZW5ndGggPSBjcHVfdG9fYmUzMih4ZmVyX2xlbik7Cit9CisKKy8qKgorICogaXByX2lvYWZwX21vZGVfc2Vuc2VfcGFnZTI4IC0gSXNzdWUgTW9kZSBTZW5zZSBQYWdlIDI4IHRvIElPQQorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZCBhIFBhZ2UgMjggbW9kZSBzZW5zZSB0byB0aGUgSU9BIHRvCisgKiByZXRyaWV2ZSBTQ1NJIGJ1cyBhdHRyaWJ1dGVzLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlJUFJfUkNfSk9CX1JFVFVSTgorICoqLworc3RhdGljIGludCBpcHJfaW9hZnBfbW9kZV9zZW5zZV9wYWdlMjgoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisKKwlFTlRFUjsKKwlpcHJfYnVpbGRfbW9kZV9zZW5zZShpcHJfY21kLCBjcHVfdG9fYmUzMihJUFJfSU9BX1JFU19IQU5ETEUpLAorCQkJICAgICAweDI4LCBpb2FfY2ZnLT52cGRfY2JzX2RtYSArCisJCQkgICAgIG9mZnNldG9mKHN0cnVjdCBpcHJfbWlzY19jYnMsIG1vZGVfcGFnZXMpLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGlwcl9tb2RlX3BhZ2VzKSk7CisKKwlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9pb2FmcF9tb2RlX3NlbGVjdF9wYWdlMjg7CisKKwlpcHJfZG9fcmVxKGlwcl9jbWQsIGlwcl9yZXNldF9pb2Ffam9iLCBpcHJfdGltZW91dCwgSVBSX0lOVEVSTkFMX1RJTUVPVVQpOworCisJTEVBVkU7CisJcmV0dXJuIElQUl9SQ19KT0JfUkVUVVJOOworfQorCisvKioKKyAqIGlwcl9pbml0X3Jlc190YWJsZSAtIEluaXRpYWxpemUgdGhlIHJlc291cmNlIHRhYmxlCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBsb29rcyB0aHJvdWdoIHRoZSBleGlzdGluZyByZXNvdXJjZSB0YWJsZSwgY29tcGFyaW5nCisgKiBpdCB3aXRoIHRoZSBjb25maWcgdGFibGUuIFRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIGNhcmUgb2Ygb2xkL25ldworICogZGV2aWNlcyBhbmQgc2NoZWR1bGUgYWRkaW5nL3JlbW92aW5nIHRoZW0gZnJvbSB0aGUgbWlkLWxheWVyCisgKiBhcyBhcHByb3ByaWF0ZS4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJSVBSX1JDX0pPQl9DT05USU5VRQorICoqLworc3RhdGljIGludCBpcHJfaW5pdF9yZXNfdGFibGUoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzLCAqdGVtcDsKKwlzdHJ1Y3QgaXByX2NvbmZpZ190YWJsZV9lbnRyeSAqY2ZndGU7CisJaW50IGZvdW5kLCBpOworCUxJU1RfSEVBRChvbGRfcmVzKTsKKworCUVOVEVSOworCWlmIChpb2FfY2ZnLT5jZmdfdGFibGUtPmhkci5mbGFncyAmIElQUl9VQ09ERV9ET1dOTE9BRF9SRVEpCisJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwgIk1pY3JvY29kZSBkb3dubG9hZCByZXF1aXJlZFxuIik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVzLCB0ZW1wLCAmaW9hX2NmZy0+dXNlZF9yZXNfcSwgcXVldWUpCisJCWxpc3RfbW92ZV90YWlsKCZyZXMtPnF1ZXVlLCAmb2xkX3Jlcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW9hX2NmZy0+Y2ZnX3RhYmxlLT5oZHIubnVtX2VudHJpZXM7IGkrKykgeworCQljZmd0ZSA9ICZpb2FfY2ZnLT5jZmdfdGFibGUtPmRldltpXTsKKwkJZm91bmQgPSAwOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXMsIHRlbXAsICZvbGRfcmVzLCBxdWV1ZSkgeworCQkJaWYgKCFtZW1jbXAoJnJlcy0+Y2ZndGUucmVzX2FkZHIsCisJCQkJICAgICZjZmd0ZS0+cmVzX2FkZHIsIHNpemVvZihjZmd0ZS0+cmVzX2FkZHIpKSkgeworCQkJCWxpc3RfbW92ZV90YWlsKCZyZXMtPnF1ZXVlLCAmaW9hX2NmZy0+dXNlZF9yZXNfcSk7CisJCQkJZm91bmQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKCFmb3VuZCkgeworCQkJaWYgKGxpc3RfZW1wdHkoJmlvYV9jZmctPmZyZWVfcmVzX3EpKSB7CisJCQkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LCAiVG9vIG1hbnkgZGV2aWNlcyBhdHRhY2hlZFxuIik7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWZvdW5kID0gMTsKKwkJCXJlcyA9IGxpc3RfZW50cnkoaW9hX2NmZy0+ZnJlZV9yZXNfcS5uZXh0LAorCQkJCQkgc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSwgcXVldWUpOworCQkJbGlzdF9tb3ZlX3RhaWwoJnJlcy0+cXVldWUsICZpb2FfY2ZnLT51c2VkX3Jlc19xKTsKKwkJCWlwcl9pbml0X3Jlc19lbnRyeShyZXMpOworCQkJcmVzLT5hZGRfdG9fbWwgPSAxOworCQl9CisKKwkJaWYgKGZvdW5kKQorCQkJbWVtY3B5KCZyZXMtPmNmZ3RlLCBjZmd0ZSwgc2l6ZW9mKHN0cnVjdCBpcHJfY29uZmlnX3RhYmxlX2VudHJ5KSk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcywgdGVtcCwgJm9sZF9yZXMsIHF1ZXVlKSB7CisJCWlmIChyZXMtPnNkZXYpIHsKKwkJCXJlcy0+ZGVsX2Zyb21fbWwgPSAxOworCQkJcmVzLT5zZGV2LT5ob3N0ZGF0YSA9IE5VTEw7CisJCQlsaXN0X21vdmVfdGFpbCgmcmVzLT5xdWV1ZSwgJmlvYV9jZmctPnVzZWRfcmVzX3EpOworCQl9IGVsc2UgeworCQkJbGlzdF9tb3ZlX3RhaWwoJnJlcy0+cXVldWUsICZpb2FfY2ZnLT5mcmVlX3Jlc19xKTsKKwkJfQorCX0KKworCWlwcl9jbWQtPmpvYl9zdGVwID0gaXByX2lvYWZwX21vZGVfc2Vuc2VfcGFnZTI4OworCisJTEVBVkU7CisJcmV0dXJuIElQUl9SQ19KT0JfQ09OVElOVUU7Cit9CisKKy8qKgorICogaXByX2lvYWZwX3F1ZXJ5X2lvYV9jZmcgLSBTZW5kIGEgUXVlcnkgSU9BIENvbmZpZyB0byB0aGUgYWRhcHRlci4KKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgUXVlcnkgSU9BIENvbmZpZ3VyYXRpb24gY29tbWFuZAorICogdG8gdGhlIGFkYXB0ZXIgdG8gcmV0cmlldmUgdGhlIElPQSBjb25maWd1cmF0aW9uIHRhYmxlLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlJUFJfUkNfSk9CX1JFVFVSTgorICoqLworc3RhdGljIGludCBpcHJfaW9hZnBfcXVlcnlfaW9hX2NmZyhzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKwlzdHJ1Y3QgaXByX2lvYXJjYiAqaW9hcmNiID0gJmlwcl9jbWQtPmlvYXJjYjsKKwlzdHJ1Y3QgaXByX2lvYWRsX2Rlc2MgKmlvYWRsID0gaXByX2NtZC0+aW9hZGw7CisJc3RydWN0IGlwcl9pbnF1aXJ5X3BhZ2UzICp1Y29kZV92cGQgPSAmaW9hX2NmZy0+dnBkX2Nicy0+cGFnZTNfZGF0YTsKKworCUVOVEVSOworCWRldl9pbmZvKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJBZGFwdGVyIGZpcm13YXJlIHZlcnNpb246ICUwMlglMDJYJTAyWCUwMlhcbiIsCisJCSB1Y29kZV92cGQtPm1ham9yX3JlbGVhc2UsIHVjb2RlX3ZwZC0+Y2FyZF90eXBlLAorCQkgdWNvZGVfdnBkLT5taW5vcl9yZWxlYXNlWzBdLCB1Y29kZV92cGQtPm1pbm9yX3JlbGVhc2VbMV0pOworCWlvYXJjYi0+Y21kX3BrdC5yZXF1ZXN0X3R5cGUgPSBJUFJfUlFUWVBFX0lPQUNNRDsKKwlpb2FyY2ItPnJlc19oYW5kbGUgPSBjcHVfdG9fYmUzMihJUFJfSU9BX1JFU19IQU5ETEUpOworCisJaW9hcmNiLT5jbWRfcGt0LmNkYlswXSA9IElQUl9RVUVSWV9JT0FfQ09ORklHOworCWlvYXJjYi0+Y21kX3BrdC5jZGJbN10gPSAoc2l6ZW9mKHN0cnVjdCBpcHJfY29uZmlnX3RhYmxlKSA+PiA4KSAmIDB4ZmY7CisJaW9hcmNiLT5jbWRfcGt0LmNkYls4XSA9IHNpemVvZihzdHJ1Y3QgaXByX2NvbmZpZ190YWJsZSkgJiAweGZmOworCisJaW9hcmNiLT5yZWFkX2lvYWRsX2xlbiA9IGNwdV90b19iZTMyKHNpemVvZihzdHJ1Y3QgaXByX2lvYWRsX2Rlc2MpKTsKKwlpb2FyY2ItPnJlYWRfZGF0YV90cmFuc2Zlcl9sZW5ndGggPQorCQljcHVfdG9fYmUzMihzaXplb2Yoc3RydWN0IGlwcl9jb25maWdfdGFibGUpKTsKKworCWlvYWRsLT5hZGRyZXNzID0gY3B1X3RvX2JlMzIoaW9hX2NmZy0+Y2ZnX3RhYmxlX2RtYSk7CisJaW9hZGwtPmZsYWdzX2FuZF9kYXRhX2xlbiA9CisJCWNwdV90b19iZTMyKElQUl9JT0FETF9GTEFHU19SRUFEX0xBU1QgfCBzaXplb2Yoc3RydWN0IGlwcl9jb25maWdfdGFibGUpKTsKKworCWlwcl9jbWQtPmpvYl9zdGVwID0gaXByX2luaXRfcmVzX3RhYmxlOworCisJaXByX2RvX3JlcShpcHJfY21kLCBpcHJfcmVzZXRfaW9hX2pvYiwgaXByX3RpbWVvdXQsIElQUl9JTlRFUk5BTF9USU1FT1VUKTsKKworCUxFQVZFOworCXJldHVybiBJUFJfUkNfSk9CX1JFVFVSTjsKK30KKworLyoqCisgKiBpcHJfaW9hZnBfaW5xdWlyeSAtIFNlbmQgYW4gSW5xdWlyeSB0byB0aGUgYWRhcHRlci4KKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gc2VuZHMgYW4gaW5xdWlyeSB0byB0aGUgYWRhcHRlci4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2lvYWZwX2lucXVpcnkoc3RydWN0IGlwcl9jbW5kICppcHJfY21kLCB1OCBmbGFncywgdTggcGFnZSwKKwkJCSAgICAgIHUzMiBkbWFfYWRkciwgdTggeGZlcl9sZW4pCit7CisJc3RydWN0IGlwcl9pb2FyY2IgKmlvYXJjYiA9ICZpcHJfY21kLT5pb2FyY2I7CisJc3RydWN0IGlwcl9pb2FkbF9kZXNjICppb2FkbCA9IGlwcl9jbWQtPmlvYWRsOworCisJRU5URVI7CisJaW9hcmNiLT5jbWRfcGt0LnJlcXVlc3RfdHlwZSA9IElQUl9SUVRZUEVfU0NTSUNEQjsKKwlpb2FyY2ItPnJlc19oYW5kbGUgPSBjcHVfdG9fYmUzMihJUFJfSU9BX1JFU19IQU5ETEUpOworCisJaW9hcmNiLT5jbWRfcGt0LmNkYlswXSA9IElOUVVJUlk7CisJaW9hcmNiLT5jbWRfcGt0LmNkYlsxXSA9IGZsYWdzOworCWlvYXJjYi0+Y21kX3BrdC5jZGJbMl0gPSBwYWdlOworCWlvYXJjYi0+Y21kX3BrdC5jZGJbNF0gPSB4ZmVyX2xlbjsKKworCWlvYXJjYi0+cmVhZF9pb2FkbF9sZW4gPSBjcHVfdG9fYmUzMihzaXplb2Yoc3RydWN0IGlwcl9pb2FkbF9kZXNjKSk7CisJaW9hcmNiLT5yZWFkX2RhdGFfdHJhbnNmZXJfbGVuZ3RoID0gY3B1X3RvX2JlMzIoeGZlcl9sZW4pOworCisJaW9hZGwtPmFkZHJlc3MgPSBjcHVfdG9fYmUzMihkbWFfYWRkcik7CisJaW9hZGwtPmZsYWdzX2FuZF9kYXRhX2xlbiA9CisJCWNwdV90b19iZTMyKElQUl9JT0FETF9GTEFHU19SRUFEX0xBU1QgfCB4ZmVyX2xlbik7CisKKwlpcHJfZG9fcmVxKGlwcl9jbWQsIGlwcl9yZXNldF9pb2Ffam9iLCBpcHJfdGltZW91dCwgSVBSX0lOVEVSTkFMX1RJTUVPVVQpOworCUxFQVZFOworfQorCisvKioKKyAqIGlwcl9pb2FmcF9wYWdlM19pbnF1aXJ5IC0gU2VuZCBhIFBhZ2UgMyBJbnF1aXJ5IHRvIHRoZSBhZGFwdGVyLgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgYSBQYWdlIDMgaW5xdWlyeSB0byB0aGUgYWRhcHRlcgorICogdG8gcmV0cmlldmUgc29mdHdhcmUgVlBEIGluZm9ybWF0aW9uLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlJUFJfUkNfSk9CX0NPTlRJTlVFIC8gSVBSX1JDX0pPQl9SRVRVUk4KKyAqKi8KK3N0YXRpYyBpbnQgaXByX2lvYWZwX3BhZ2UzX2lucXVpcnkoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJY2hhciB0eXBlWzVdOworCisJRU5URVI7CisKKwkvKiBHcmFiIHRoZSB0eXBlIG91dCBvZiB0aGUgVlBEIGFuZCBzdG9yZSBpdCBhd2F5ICovCisJbWVtY3B5KHR5cGUsIGlvYV9jZmctPnZwZF9jYnMtPmlvYV92cGQuc3RkX2lucV9kYXRhLnZwaWRzLnByb2R1Y3RfaWQsIDQpOworCXR5cGVbNF0gPSAnXDAnOworCWlvYV9jZmctPnR5cGUgPSBzaW1wbGVfc3RydG91bCgoY2hhciAqKXR5cGUsIE5VTEwsIDE2KTsKKworCWlwcl9jbWQtPmpvYl9zdGVwID0gaXByX2lvYWZwX3F1ZXJ5X2lvYV9jZmc7CisKKwlpcHJfaW9hZnBfaW5xdWlyeShpcHJfY21kLCAxLCAzLAorCQkJICBpb2FfY2ZnLT52cGRfY2JzX2RtYSArIG9mZnNldG9mKHN0cnVjdCBpcHJfbWlzY19jYnMsIHBhZ2UzX2RhdGEpLAorCQkJICBzaXplb2Yoc3RydWN0IGlwcl9pbnF1aXJ5X3BhZ2UzKSk7CisKKwlMRUFWRTsKKwlyZXR1cm4gSVBSX1JDX0pPQl9SRVRVUk47Cit9CisKKy8qKgorICogaXByX2lvYWZwX3N0ZF9pbnF1aXJ5IC0gU2VuZCBhIFN0YW5kYXJkIElucXVpcnkgdG8gdGhlIGFkYXB0ZXIuCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBhIHN0YW5kYXJkIGlucXVpcnkgdG8gdGhlIGFkYXB0ZXIuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCUlQUl9SQ19KT0JfUkVUVVJOCisgKiovCitzdGF0aWMgaW50IGlwcl9pb2FmcF9zdGRfaW5xdWlyeShzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKworCUVOVEVSOworCWlwcl9jbWQtPmpvYl9zdGVwID0gaXByX2lvYWZwX3BhZ2UzX2lucXVpcnk7CisKKwlpcHJfaW9hZnBfaW5xdWlyeShpcHJfY21kLCAwLCAwLAorCQkJICBpb2FfY2ZnLT52cGRfY2JzX2RtYSArIG9mZnNldG9mKHN0cnVjdCBpcHJfbWlzY19jYnMsIGlvYV92cGQpLAorCQkJICBzaXplb2Yoc3RydWN0IGlwcl9pb2FfdnBkKSk7CisKKwlMRUFWRTsKKwlyZXR1cm4gSVBSX1JDX0pPQl9SRVRVUk47Cit9CisKKy8qKgorICogaXByX2lvYWZwX2luZGVudGlmeV9ocnJxIC0gU2VuZCBJZGVudGlmeSBIb3N0IFJSUS4KKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmQgYW4gSWRlbnRpZnkgSG9zdCBSZXF1ZXN0IFJlc3BvbnNlIFF1ZXVlCisgKiBjb21tYW5kIHRvIGVzdGFibGlzaCB0aGUgSFJSUSB3aXRoIHRoZSBhZGFwdGVyLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlJUFJfUkNfSk9CX1JFVFVSTgorICoqLworc3RhdGljIGludCBpcHJfaW9hZnBfaW5kZW50aWZ5X2hycnEoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJc3RydWN0IGlwcl9pb2FyY2IgKmlvYXJjYiA9ICZpcHJfY21kLT5pb2FyY2I7CisKKwlFTlRFUjsKKwlkZXZfaW5mbygmaW9hX2NmZy0+cGRldi0+ZGV2LCAiU3RhcnRpbmcgSU9BIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlLlxuIik7CisKKwlpb2FyY2ItPmNtZF9wa3QuY2RiWzBdID0gSVBSX0lEX0hPU1RfUlJfUTsKKwlpb2FyY2ItPnJlc19oYW5kbGUgPSBjcHVfdG9fYmUzMihJUFJfSU9BX1JFU19IQU5ETEUpOworCisJaW9hcmNiLT5jbWRfcGt0LnJlcXVlc3RfdHlwZSA9IElQUl9SUVRZUEVfSU9BQ01EOworCWlvYXJjYi0+Y21kX3BrdC5jZGJbMl0gPQorCQkoKHUzMikgaW9hX2NmZy0+aG9zdF9ycnFfZG1hID4+IDI0KSAmIDB4ZmY7CisJaW9hcmNiLT5jbWRfcGt0LmNkYlszXSA9CisJCSgodTMyKSBpb2FfY2ZnLT5ob3N0X3JycV9kbWEgPj4gMTYpICYgMHhmZjsKKwlpb2FyY2ItPmNtZF9wa3QuY2RiWzRdID0KKwkJKCh1MzIpIGlvYV9jZmctPmhvc3RfcnJxX2RtYSA+PiA4KSAmIDB4ZmY7CisJaW9hcmNiLT5jbWRfcGt0LmNkYls1XSA9CisJCSgodTMyKSBpb2FfY2ZnLT5ob3N0X3JycV9kbWEpICYgMHhmZjsKKwlpb2FyY2ItPmNtZF9wa3QuY2RiWzddID0KKwkJKChzaXplb2YodTMyKSAqIElQUl9OVU1fQ01EX0JMS1MpID4+IDgpICYgMHhmZjsKKwlpb2FyY2ItPmNtZF9wa3QuY2RiWzhdID0KKwkJKHNpemVvZih1MzIpICogSVBSX05VTV9DTURfQkxLUykgJiAweGZmOworCisJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfaW9hZnBfc3RkX2lucXVpcnk7CisKKwlpcHJfZG9fcmVxKGlwcl9jbWQsIGlwcl9yZXNldF9pb2Ffam9iLCBpcHJfdGltZW91dCwgSVBSX0lOVEVSTkFMX1RJTUVPVVQpOworCisJTEVBVkU7CisJcmV0dXJuIElQUl9SQ19KT0JfUkVUVVJOOworfQorCisvKioKKyAqIGlwcl9yZXNldF90aW1lcl9kb25lIC0gQWRhcHRlciByZXNldCB0aW1lciBmdW5jdGlvbgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gYWRhcHRlciByZXNldCBwcm9jZXNzaW5nCisgKiBmb3IgdGltaW5nIGV2ZW50cy4gSWYgdGhlIHJlc2V0X2NtZCBwb2ludGVyIGluIHRoZSBJT0EKKyAqIGNvbmZpZyBzdHJ1Y3QgaXMgbm90IHRoaXMgYWRhcHRlcidzIHdlIGFyZSBkb2luZyBuZXN0ZWQKKyAqIHJlc2V0cyBhbmQgZmFpbF9hbGxfb3BzIHdpbGwgdGFrZSBjYXJlIG9mIGZyZWVpbmcgdGhlCisgKiBjb21tYW5kIGJsb2NrLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfcmVzZXRfdGltZXJfZG9uZShzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWlmIChpb2FfY2ZnLT5yZXNldF9jbWQgPT0gaXByX2NtZCkgeworCQlsaXN0X2RlbCgmaXByX2NtZC0+cXVldWUpOworCQlpcHJfY21kLT5kb25lKGlwcl9jbWQpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKK30KKworLyoqCisgKiBpcHJfcmVzZXRfc3RhcnRfdGltZXIgLSBTdGFydCBhIHRpbWVyIGZvciBhZGFwdGVyIHJlc2V0IGpvYgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICogQHRpbWVvdXQ6CXRpbWVvdXQgdmFsdWUKKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIGFkYXB0ZXIgcmVzZXQgcHJvY2Vzc2luZworICogZm9yIHRpbWluZyBldmVudHMuIElmIHRoZSByZXNldF9jbWQgcG9pbnRlciBpbiB0aGUgSU9BCisgKiBjb25maWcgc3RydWN0IGlzIG5vdCB0aGlzIGFkYXB0ZXIncyB3ZSBhcmUgZG9pbmcgbmVzdGVkCisgKiByZXNldHMgYW5kIGZhaWxfYWxsX29wcyB3aWxsIHRha2UgY2FyZSBvZiBmcmVlaW5nIHRoZQorICogY29tbWFuZCBibG9jay4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX3Jlc2V0X3N0YXJ0X3RpbWVyKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlsaXN0X2FkZF90YWlsKCZpcHJfY21kLT5xdWV1ZSwgJmlwcl9jbWQtPmlvYV9jZmctPnBlbmRpbmdfcSk7CisJaXByX2NtZC0+ZG9uZSA9IGlwcl9yZXNldF9pb2Ffam9iOworCisJaXByX2NtZC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBpcHJfY21kOworCWlwcl9jbWQtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgdGltZW91dDsKKwlpcHJfY21kLT50aW1lci5mdW5jdGlvbiA9ICh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSlpcHJfcmVzZXRfdGltZXJfZG9uZTsKKwlhZGRfdGltZXIoJmlwcl9jbWQtPnRpbWVyKTsKK30KKworLyoqCisgKiBpcHJfaW5pdF9pb2FfbWVtIC0gSW5pdGlhbGl6ZSBpb2FfY2ZnIGNvbnRyb2wgYmxvY2sKKyAqIEBpb2FfY2ZnOglpb2EgY2ZnIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub3RoaW5nCisgKiovCitzdGF0aWMgdm9pZCBpcHJfaW5pdF9pb2FfbWVtKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZykKK3sKKwltZW1zZXQoaW9hX2NmZy0+aG9zdF9ycnEsIDAsIHNpemVvZih1MzIpICogSVBSX05VTV9DTURfQkxLUyk7CisKKwkvKiBJbml0aWFsaXplIEhvc3QgUlJRIHBvaW50ZXJzICovCisJaW9hX2NmZy0+aHJycV9zdGFydCA9IGlvYV9jZmctPmhvc3RfcnJxOworCWlvYV9jZmctPmhycnFfZW5kID0gJmlvYV9jZmctPmhvc3RfcnJxW0lQUl9OVU1fQ01EX0JMS1MgLSAxXTsKKwlpb2FfY2ZnLT5ocnJxX2N1cnIgPSBpb2FfY2ZnLT5ocnJxX3N0YXJ0OworCWlvYV9jZmctPnRvZ2dsZV9iaXQgPSAxOworCisJLyogWmVybyBvdXQgY29uZmlnIHRhYmxlICovCisJbWVtc2V0KGlvYV9jZmctPmNmZ190YWJsZSwgMCwgc2l6ZW9mKHN0cnVjdCBpcHJfY29uZmlnX3RhYmxlKSk7Cit9CisKKy8qKgorICogaXByX3Jlc2V0X2VuYWJsZV9pb2EgLSBFbmFibGUgdGhlIElPQSBmb2xsb3dpbmcgYSByZXNldC4KKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlaW5pdGlhbGl6ZXMgc29tZSBjb250cm9sIGJsb2NrcyBhbmQKKyAqIGVuYWJsZXMgZGVzdHJ1Y3RpdmUgZGlhZ25vc3RpY3Mgb24gdGhlIGFkYXB0ZXIuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCUlQUl9SQ19KT0JfUkVUVVJOCisgKiovCitzdGF0aWMgaW50IGlwcl9yZXNldF9lbmFibGVfaW9hKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCXZvbGF0aWxlIHUzMiBpbnRfcmVnOworCisJRU5URVI7CisJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfaW9hZnBfaW5kZW50aWZ5X2hycnE7CisJaXByX2luaXRfaW9hX21lbShpb2FfY2ZnKTsKKworCWlvYV9jZmctPmFsbG93X2ludGVycnVwdHMgPSAxOworCWludF9yZWcgPSByZWFkbChpb2FfY2ZnLT5yZWdzLnNlbnNlX2ludGVycnVwdF9yZWcpOworCisJaWYgKGludF9yZWcgJiBJUFJfUENJSV9JT0FfVFJBTlNfVE9fT1BFUikgeworCQl3cml0ZWwoKElQUl9QQ0lJX0VSUk9SX0lOVEVSUlVQVFMgfCBJUFJfUENJSV9IUlJRX1VQREFURUQpLAorCQkgICAgICAgaW9hX2NmZy0+cmVncy5jbHJfaW50ZXJydXB0X21hc2tfcmVnKTsKKwkJaW50X3JlZyA9IHJlYWRsKGlvYV9jZmctPnJlZ3Muc2Vuc2VfaW50ZXJydXB0X21hc2tfcmVnKTsKKwkJcmV0dXJuIElQUl9SQ19KT0JfQ09OVElOVUU7CisJfQorCisJLyogRW5hYmxlIGRlc3RydWN0aXZlIGRpYWdub3N0aWNzIG9uIElPQSAqLworCXdyaXRlbChJUFJfRE9PUkJFTEwsIGlvYV9jZmctPnJlZ3Muc2V0X3Vwcm9jX2ludGVycnVwdF9yZWcpOworCisJd3JpdGVsKElQUl9QQ0lJX09QRVJfSU5URVJSVVBUUywgaW9hX2NmZy0+cmVncy5jbHJfaW50ZXJydXB0X21hc2tfcmVnKTsKKwlpbnRfcmVnID0gcmVhZGwoaW9hX2NmZy0+cmVncy5zZW5zZV9pbnRlcnJ1cHRfbWFza19yZWcpOworCisJZGV2X2luZm8oJmlvYV9jZmctPnBkZXYtPmRldiwgIkluaXRpYWxpemluZyBJT0EuXG4iKTsKKworCWlwcl9jbWQtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaXByX2NtZDsKKwlpcHJfY21kLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIChpcHJfdHJhbnNvcF90aW1lb3V0ICogSFopOworCWlwcl9jbWQtPnRpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKWlwcl9vcGVyX3RpbWVvdXQ7CisJaXByX2NtZC0+ZG9uZSA9IGlwcl9yZXNldF9pb2Ffam9iOworCWFkZF90aW1lcigmaXByX2NtZC0+dGltZXIpOworCWxpc3RfYWRkX3RhaWwoJmlwcl9jbWQtPnF1ZXVlLCAmaW9hX2NmZy0+cGVuZGluZ19xKTsKKworCUxFQVZFOworCXJldHVybiBJUFJfUkNfSk9CX1JFVFVSTjsKK30KKworLyoqCisgKiBpcHJfcmVzZXRfd2FpdF9mb3JfZHVtcCAtIFdhaXQgZm9yIGEgZHVtcCB0byB0aW1lb3V0LgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCB3aGVuIGFuIGFkYXB0ZXIgZHVtcCBoYXMgcnVuIG91dAorICogb2YgcHJvY2Vzc2luZyB0aW1lLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlJUFJfUkNfSk9CX0NPTlRJTlVFCisgKiovCitzdGF0aWMgaW50IGlwcl9yZXNldF93YWl0X2Zvcl9kdW1wKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCisJaWYgKGlvYV9jZmctPnNkdF9zdGF0ZSA9PSBHRVRfRFVNUCkKKwkJaW9hX2NmZy0+c2R0X3N0YXRlID0gQUJPUlRfRFVNUDsKKworCWlwcl9jbWQtPmpvYl9zdGVwID0gaXByX3Jlc2V0X2FsZXJ0OworCisJcmV0dXJuIElQUl9SQ19KT0JfQ09OVElOVUU7Cit9CisKKy8qKgorICogaXByX3VuaXRfY2hlY2tfbm9fZGF0YSAtIExvZyBhIHVuaXQgY2hlY2svbm8gZGF0YSBlcnJvciBsb2cKKyAqIEBpb2FfY2ZnOgkJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqCisgKiBMb2dzIGFuIGVycm9yIGluZGljYXRpbmcgdGhlIGFkYXB0ZXIgdW5pdCBjaGVja2VkLCBidXQgZm9yIHNvbWUKKyAqIHJlYXNvbiwgd2Ugd2VyZSB1bmFibGUgdG8gZmV0Y2ggdGhlIHVuaXQgY2hlY2sgYnVmZmVyLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub3RoaW5nCisgKiovCitzdGF0aWMgdm9pZCBpcHJfdW5pdF9jaGVja19ub19kYXRhKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZykKK3sKKwlpb2FfY2ZnLT5lcnJvcnNfbG9nZ2VkKys7CisJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LCAiSU9BIHVuaXQgY2hlY2sgd2l0aCBubyBkYXRhXG4iKTsKK30KKworLyoqCisgKiBpcHJfZ2V0X3VuaXRfY2hlY2tfYnVmZmVyIC0gR2V0IHRoZSB1bml0IGNoZWNrIGJ1ZmZlciBmcm9tIHRoZSBJT0EKKyAqIEBpb2FfY2ZnOgkJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqCisgKiBGZXRjaGVzIHRoZSB1bml0IGNoZWNrIGJ1ZmZlciBmcm9tIHRoZSBhZGFwdGVyIGJ5IGNsb2NraW5nIHRoZSBkYXRhCisgKiB0aHJvdWdoIHRoZSBtYWlsYm94IHJlZ2lzdGVyLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub3RoaW5nCisgKiovCitzdGF0aWMgdm9pZCBpcHJfZ2V0X3VuaXRfY2hlY2tfYnVmZmVyKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZykKK3sKKwl1bnNpZ25lZCBsb25nIG1haWxib3g7CisJc3RydWN0IGlwcl9ob3N0cmNiICpob3N0cmNiOworCXN0cnVjdCBpcHJfdWNfc2R0IHNkdDsKKwlpbnQgcmMsIGxlbmd0aDsKKworCW1haWxib3ggPSByZWFkbChpb2FfY2ZnLT5pb2FfbWFpbGJveCk7CisKKwlpZiAoIWlwcl9zZHRfaXNfZm10MihtYWlsYm94KSkgeworCQlpcHJfdW5pdF9jaGVja19ub19kYXRhKGlvYV9jZmcpOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KCZzZHQsIDAsIHNpemVvZihzdHJ1Y3QgaXByX3VjX3NkdCkpOworCXJjID0gaXByX2dldF9sZHVtcF9kYXRhX3NlY3Rpb24oaW9hX2NmZywgbWFpbGJveCwgKF9fYmUzMiAqKSAmc2R0LAorCQkJCQkoc2l6ZW9mKHN0cnVjdCBpcHJfdWNfc2R0KSkgLyBzaXplb2YoX19iZTMyKSk7CisKKwlpZiAocmMgfHwgKGJlMzJfdG9fY3B1KHNkdC5oZHIuc3RhdGUpICE9IElQUl9GTVQyX1NEVF9SRUFEWV9UT19VU0UpIHx8CisJICAgICEoc2R0LmVudHJ5WzBdLmZsYWdzICYgSVBSX1NEVF9WQUxJRF9FTlRSWSkpIHsKKwkJaXByX3VuaXRfY2hlY2tfbm9fZGF0YShpb2FfY2ZnKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEZpbmQgbGVuZ3RoIG9mIHRoZSBmaXJzdCBzZHQgZW50cnkgKFVDIGJ1ZmZlcikgKi8KKwlsZW5ndGggPSAoYmUzMl90b19jcHUoc2R0LmVudHJ5WzBdLmVuZF9vZmZzZXQpIC0KKwkJICBiZTMyX3RvX2NwdShzZHQuZW50cnlbMF0uYmFyX3N0cl9vZmZzZXQpKSAmIElQUl9GTVQyX01CWF9BRERSX01BU0s7CisKKwlob3N0cmNiID0gbGlzdF9lbnRyeShpb2FfY2ZnLT5ob3N0cmNiX2ZyZWVfcS5uZXh0LAorCQkJICAgICBzdHJ1Y3QgaXByX2hvc3RyY2IsIHF1ZXVlKTsKKwlsaXN0X2RlbCgmaG9zdHJjYi0+cXVldWUpOworCW1lbXNldCgmaG9zdHJjYi0+aGNhbSwgMCwgc2l6ZW9mKGhvc3RyY2ItPmhjYW0pKTsKKworCXJjID0gaXByX2dldF9sZHVtcF9kYXRhX3NlY3Rpb24oaW9hX2NmZywKKwkJCQkJYmUzMl90b19jcHUoc2R0LmVudHJ5WzBdLmJhcl9zdHJfb2Zmc2V0KSwKKwkJCQkJKF9fYmUzMiAqKSZob3N0cmNiLT5oY2FtLAorCQkJCQltaW4obGVuZ3RoLCAoaW50KXNpemVvZihob3N0cmNiLT5oY2FtKSkgLyBzaXplb2YoX19iZTMyKSk7CisKKwlpZiAoIXJjKQorCQlpcHJfaGFuZGxlX2xvZ19kYXRhKGlvYV9jZmcsIGhvc3RyY2IpOworCWVsc2UKKwkJaXByX3VuaXRfY2hlY2tfbm9fZGF0YShpb2FfY2ZnKTsKKworCWxpc3RfYWRkX3RhaWwoJmhvc3RyY2ItPnF1ZXVlLCAmaW9hX2NmZy0+aG9zdHJjYl9mcmVlX3EpOworfQorCisvKioKKyAqIGlwcl9yZXNldF9yZXN0b3JlX2NmZ19zcGFjZSAtIFJlc3RvcmUgUENJIGNvbmZpZyBzcGFjZS4KKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiByZXN0b3JlcyB0aGUgc2F2ZWQgUENJIGNvbmZpZyBzcGFjZSBvZgorICogdGhlIGFkYXB0ZXIsIGZhaWxzIGFsbCBvdXRzdGFuZGluZyBvcHMgYmFjayB0byB0aGUgY2FsbGVycywgYW5kCisgKiBmZXRjaGVzIHRoZSBkdW1wL3VuaXQgY2hlY2sgaWYgYXBwbGljYWJsZSB0byB0aGlzIHJlc2V0LgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlJUFJfUkNfSk9CX0NPTlRJTlVFIC8gSVBSX1JDX0pPQl9SRVRVUk4KKyAqKi8KK3N0YXRpYyBpbnQgaXByX3Jlc2V0X3Jlc3RvcmVfY2ZnX3NwYWNlKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCWludCByYzsKKworCUVOVEVSOworCXJjID0gcGNpX3Jlc3RvcmVfc3RhdGUoaW9hX2NmZy0+cGRldik7CisKKwlpZiAocmMgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJCWlwcl9jbWQtPmlvYXNhLmlvYXNjID0gY3B1X3RvX2JlMzIoSVBSX0lPQVNDX1BDSV9BQ0NFU1NfRVJST1IpOworCQlyZXR1cm4gSVBSX1JDX0pPQl9DT05USU5VRTsKKwl9CisKKwlpZiAoaXByX3NldF9wY2l4X2NtZF9yZWcoaW9hX2NmZykpIHsKKwkJaXByX2NtZC0+aW9hc2EuaW9hc2MgPSBjcHVfdG9fYmUzMihJUFJfSU9BU0NfUENJX0FDQ0VTU19FUlJPUik7CisJCXJldHVybiBJUFJfUkNfSk9CX0NPTlRJTlVFOworCX0KKworCWlwcl9mYWlsX2FsbF9vcHMoaW9hX2NmZyk7CisKKwlpZiAoaW9hX2NmZy0+aW9hX3VuaXRfY2hlY2tlZCkgeworCQlpb2FfY2ZnLT5pb2FfdW5pdF9jaGVja2VkID0gMDsKKwkJaXByX2dldF91bml0X2NoZWNrX2J1ZmZlcihpb2FfY2ZnKTsKKwkJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfcmVzZXRfYWxlcnQ7CisJCWlwcl9yZXNldF9zdGFydF90aW1lcihpcHJfY21kLCAwKTsKKwkJcmV0dXJuIElQUl9SQ19KT0JfUkVUVVJOOworCX0KKworCWlmIChpb2FfY2ZnLT5pbl9pb2FfYnJpbmdkb3duKSB7CisJCWlwcl9jbWQtPmpvYl9zdGVwID0gaXByX2lvYV9icmluZ2Rvd25fZG9uZTsKKwl9IGVsc2UgeworCQlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9yZXNldF9lbmFibGVfaW9hOworCisJCWlmIChHRVRfRFVNUCA9PSBpb2FfY2ZnLT5zZHRfc3RhdGUpIHsKKwkJCWlwcl9yZXNldF9zdGFydF90aW1lcihpcHJfY21kLCBJUFJfRFVNUF9USU1FT1VUKTsKKwkJCWlwcl9jbWQtPmpvYl9zdGVwID0gaXByX3Jlc2V0X3dhaXRfZm9yX2R1bXA7CisJCQlzY2hlZHVsZV93b3JrKCZpb2FfY2ZnLT53b3JrX3EpOworCQkJcmV0dXJuIElQUl9SQ19KT0JfUkVUVVJOOworCQl9CisJfQorCisJRU5URVI7CisJcmV0dXJuIElQUl9SQ19KT0JfQ09OVElOVUU7Cit9CisKKy8qKgorICogaXByX3Jlc2V0X3N0YXJ0X2Jpc3QgLSBSdW4gQklTVCBvbiB0aGUgYWRhcHRlci4KKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBydW5zIEJJU1Qgb24gdGhlIGFkYXB0ZXIsIHRoZW4gZGVsYXlzIDIgc2Vjb25kcy4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJSVBSX1JDX0pPQl9DT05USU5VRSAvIElQUl9SQ19KT0JfUkVUVVJOCisgKiovCitzdGF0aWMgaW50IGlwcl9yZXNldF9zdGFydF9iaXN0KHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCWludCByYzsKKworCUVOVEVSOworCXJjID0gcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGlvYV9jZmctPnBkZXYsIFBDSV9CSVNULCBQQ0lfQklTVF9TVEFSVCk7CisKKwlpZiAocmMgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJCWlwcl9jbWQtPmlvYXNhLmlvYXNjID0gY3B1X3RvX2JlMzIoSVBSX0lPQVNDX1BDSV9BQ0NFU1NfRVJST1IpOworCQlyYyA9IElQUl9SQ19KT0JfQ09OVElOVUU7CisJfSBlbHNlIHsKKwkJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfcmVzZXRfcmVzdG9yZV9jZmdfc3BhY2U7CisJCWlwcl9yZXNldF9zdGFydF90aW1lcihpcHJfY21kLCBJUFJfV0FJVF9GT1JfQklTVF9USU1FT1VUKTsKKwkJcmMgPSBJUFJfUkNfSk9CX1JFVFVSTjsKKwl9CisKKwlMRUFWRTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaXByX3Jlc2V0X2FsbG93ZWQgLSBRdWVyeSB3aGV0aGVyIG9yIG5vdCBJT0EgY2FuIGJlIHJlc2V0CisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMCBpZiByZXNldCBub3QgYWxsb3dlZCAvIG5vbi16ZXJvIGlmIHJlc2V0IGlzIGFsbG93ZWQKKyAqKi8KK3N0YXRpYyBpbnQgaXByX3Jlc2V0X2FsbG93ZWQoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKQoreworCXZvbGF0aWxlIHUzMiB0ZW1wX3JlZzsKKworCXRlbXBfcmVnID0gcmVhZGwoaW9hX2NmZy0+cmVncy5zZW5zZV9pbnRlcnJ1cHRfcmVnKTsKKwlyZXR1cm4gKCh0ZW1wX3JlZyAmIElQUl9QQ0lJX0NSSVRJQ0FMX09QRVJBVElPTikgPT0gMCk7Cit9CisKKy8qKgorICogaXByX3Jlc2V0X3dhaXRfdG9fc3RhcnRfYmlzdCAtIFdhaXQgZm9yIHBlcm1pc3Npb24gdG8gcmVzZXQgSU9BLgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciBhZGFwdGVyIHBlcm1pc3Npb24gdG8gcnVuIEJJU1QsCisgKiB0aGVuIHJ1bnMgQklTVC4gSWYgdGhlIGFkYXB0ZXIgZG9lcyBub3QgZ2l2ZSBwZXJtaXNzaW9uIGFmdGVyIGEKKyAqIHJlYXNvbmFibGUgdGltZSwgd2Ugd2lsbCByZXNldCB0aGUgYWRhcHRlciBhbnl3YXkuIFRoZSBpbXBhY3Qgb2YKKyAqIHJlc2V0dGluZyB0aGUgYWRhcHRlciB3aXRob3V0IHdhcm5pbmcgdGhlIGFkYXB0ZXIgaXMgdGhlIHJpc2sgb2YKKyAqIGxvc2luZyB0aGUgcGVyc2lzdGVudCBlcnJvciBsb2cgb24gdGhlIGFkYXB0ZXIuIElmIHRoZSBhZGFwdGVyIGlzCisgKiByZXNldCB3aGlsZSBpdCBpcyB3cml0aW5nIHRvIHRoZSBmbGFzaCBvbiB0aGUgYWRhcHRlciwgdGhlIGZsYXNoCisgKiBzZWdtZW50IHdpbGwgaGF2ZSBiYWQgRUNDIGFuZCBiZSB6ZXJvZWQuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCUlQUl9SQ19KT0JfQ09OVElOVUUgLyBJUFJfUkNfSk9CX1JFVFVSTgorICoqLworc3RhdGljIGludCBpcHJfcmVzZXRfd2FpdF90b19zdGFydF9iaXN0KHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCWludCByYyA9IElQUl9SQ19KT0JfUkVUVVJOOworCisJaWYgKCFpcHJfcmVzZXRfYWxsb3dlZChpb2FfY2ZnKSAmJiBpcHJfY21kLT51LnRpbWVfbGVmdCkgeworCQlpcHJfY21kLT51LnRpbWVfbGVmdCAtPSBJUFJfQ0hFQ0tfRk9SX1JFU0VUX1RJTUVPVVQ7CisJCWlwcl9yZXNldF9zdGFydF90aW1lcihpcHJfY21kLCBJUFJfQ0hFQ0tfRk9SX1JFU0VUX1RJTUVPVVQpOworCX0gZWxzZSB7CisJCWlwcl9jbWQtPmpvYl9zdGVwID0gaXByX3Jlc2V0X3N0YXJ0X2Jpc3Q7CisJCXJjID0gSVBSX1JDX0pPQl9DT05USU5VRTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaXByX3Jlc2V0X2FsZXJ0X3BhcnQyIC0gQWxlcnQgdGhlIGFkYXB0ZXIgb2YgYSBwZW5kaW5nIHJlc2V0CisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gYWxlcnRzIHRoZSBhZGFwdGVyIHRoYXQgaXQgd2lsbCBiZSByZXNldC4KKyAqIElmIG1lbW9yeSBzcGFjZSBpcyBub3QgY3VycmVudGx5IGVuYWJsZWQsIHByb2NlZWQgZGlyZWN0bHkKKyAqIHRvIHJ1bm5pbmcgQklTVCBvbiB0aGUgYWRhcHRlci4gVGhlIHRpbWVyIG11c3QgYWx3YXlzIGJlIHN0YXJ0ZWQKKyAqIHNvIHdlIGd1YXJhbnRlZSB3ZSBkbyBub3QgcnVuIEJJU1QgZnJvbSBpcHJfaXNyLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlJUFJfUkNfSk9CX1JFVFVSTgorICoqLworc3RhdGljIGludCBpcHJfcmVzZXRfYWxlcnQoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJdTE2IGNtZF9yZWc7CisJaW50IHJjOworCisJRU5URVI7CisJcmMgPSBwY2lfcmVhZF9jb25maWdfd29yZChpb2FfY2ZnLT5wZGV2LCBQQ0lfQ09NTUFORCwgJmNtZF9yZWcpOworCisJaWYgKChyYyA9PSBQQ0lCSU9TX1NVQ0NFU1NGVUwpICYmIChjbWRfcmVnICYgUENJX0NPTU1BTkRfTUVNT1JZKSkgeworCQlpcHJfbWFza19hbmRfY2xlYXJfaW50ZXJydXB0cyhpb2FfY2ZnLCB+MCk7CisJCXdyaXRlbChJUFJfVVBST0NJX1JFU0VUX0FMRVJULCBpb2FfY2ZnLT5yZWdzLnNldF91cHJvY19pbnRlcnJ1cHRfcmVnKTsKKwkJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfcmVzZXRfd2FpdF90b19zdGFydF9iaXN0OworCX0gZWxzZSB7CisJCWlwcl9jbWQtPmpvYl9zdGVwID0gaXByX3Jlc2V0X3N0YXJ0X2Jpc3Q7CisJfQorCisJaXByX2NtZC0+dS50aW1lX2xlZnQgPSBJUFJfV0FJVF9GT1JfUkVTRVRfVElNRU9VVDsKKwlpcHJfcmVzZXRfc3RhcnRfdGltZXIoaXByX2NtZCwgSVBSX0NIRUNLX0ZPUl9SRVNFVF9USU1FT1VUKTsKKworCUxFQVZFOworCXJldHVybiBJUFJfUkNfSk9CX1JFVFVSTjsKK30KKworLyoqCisgKiBpcHJfcmVzZXRfdWNvZGVfZG93bmxvYWRfZG9uZSAtIE1pY3JvY29kZSBkb3dubG9hZCBjb21wbGV0aW9uCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gdW5tYXBzIHRoZSBtaWNyb2NvZGUgZG93bmxvYWQgYnVmZmVyLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlJUFJfUkNfSk9CX0NPTlRJTlVFCisgKiovCitzdGF0aWMgaW50IGlwcl9yZXNldF91Y29kZV9kb3dubG9hZF9kb25lKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCXN0cnVjdCBpcHJfc2dsaXN0ICpzZ2xpc3QgPSBpb2FfY2ZnLT51Y29kZV9zZ2xpc3Q7CisKKwlwY2lfdW5tYXBfc2coaW9hX2NmZy0+cGRldiwgc2dsaXN0LT5zY2F0dGVybGlzdCwKKwkJICAgICBzZ2xpc3QtPm51bV9zZywgRE1BX1RPX0RFVklDRSk7CisKKwlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9yZXNldF9hbGVydDsKKwlyZXR1cm4gSVBSX1JDX0pPQl9DT05USU5VRTsKK30KKworLyoqCisgKiBpcHJfcmVzZXRfdWNvZGVfZG93bmxvYWQgLSBEb3dubG9hZCBtaWNyb2NvZGUgdG8gdGhlIGFkYXB0ZXIKKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBjaGVja3MgdG8gc2VlIGlmIGl0IHRoZXJlIGlzIG1pY3JvY29kZQorICogdG8gZG93bmxvYWQgdG8gdGhlIGFkYXB0ZXIuIElmIHRoZXJlIGlzLCBhIGRvd25sb2FkIGlzIHBlcmZvcm1lZC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJSVBSX1JDX0pPQl9DT05USU5VRSAvIElQUl9SQ19KT0JfUkVUVVJOCisgKiovCitzdGF0aWMgaW50IGlwcl9yZXNldF91Y29kZV9kb3dubG9hZChzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKwlzdHJ1Y3QgaXByX3NnbGlzdCAqc2dsaXN0ID0gaW9hX2NmZy0+dWNvZGVfc2dsaXN0OworCisJRU5URVI7CisJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfcmVzZXRfYWxlcnQ7CisKKwlpZiAoIXNnbGlzdCkKKwkJcmV0dXJuIElQUl9SQ19KT0JfQ09OVElOVUU7CisKKwlpcHJfY21kLT5pb2FyY2IucmVzX2hhbmRsZSA9IGNwdV90b19iZTMyKElQUl9JT0FfUkVTX0hBTkRMRSk7CisJaXByX2NtZC0+aW9hcmNiLmNtZF9wa3QucmVxdWVzdF90eXBlID0gSVBSX1JRVFlQRV9TQ1NJQ0RCOworCWlwcl9jbWQtPmlvYXJjYi5jbWRfcGt0LmNkYlswXSA9IFdSSVRFX0JVRkZFUjsKKwlpcHJfY21kLT5pb2FyY2IuY21kX3BrdC5jZGJbMV0gPSBJUFJfV1JfQlVGX0RPV05MT0FEX0FORF9TQVZFOworCWlwcl9jbWQtPmlvYXJjYi5jbWRfcGt0LmNkYls2XSA9IChzZ2xpc3QtPmJ1ZmZlcl9sZW4gJiAweGZmMDAwMCkgPj4gMTY7CisJaXByX2NtZC0+aW9hcmNiLmNtZF9wa3QuY2RiWzddID0gKHNnbGlzdC0+YnVmZmVyX2xlbiAmIDB4MDBmZjAwKSA+PiA4OworCWlwcl9jbWQtPmlvYXJjYi5jbWRfcGt0LmNkYls4XSA9IHNnbGlzdC0+YnVmZmVyX2xlbiAmIDB4MDAwMGZmOworCisJaWYgKGlwcl9tYXBfdWNvZGVfYnVmZmVyKGlwcl9jbWQsIHNnbGlzdCwgc2dsaXN0LT5idWZmZXJfbGVuKSkgeworCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIG1hcCBtaWNyb2NvZGUgZG93bmxvYWQgYnVmZmVyXG4iKTsKKwkJcmV0dXJuIElQUl9SQ19KT0JfQ09OVElOVUU7CisJfQorCisJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfcmVzZXRfdWNvZGVfZG93bmxvYWRfZG9uZTsKKworCWlwcl9kb19yZXEoaXByX2NtZCwgaXByX3Jlc2V0X2lvYV9qb2IsIGlwcl90aW1lb3V0LAorCQkgICBJUFJfV1JJVEVfQlVGRkVSX1RJTUVPVVQpOworCisJTEVBVkU7CisJcmV0dXJuIElQUl9SQ19KT0JfUkVUVVJOOworfQorCisvKioKKyAqIGlwcl9yZXNldF9zaHV0ZG93bl9pb2EgLSBTaHV0ZG93biB0aGUgYWRhcHRlcgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzc3VlcyBhbiBhZGFwdGVyIHNodXRkb3duIG9mIHRoZQorICogc3BlY2lmaWVkIHR5cGUgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIGFzIHBhcnQgb2YgdGhlCisgKiBhZGFwdGVyIHJlc2V0IGpvYi4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJSVBSX1JDX0pPQl9DT05USU5VRSAvIElQUl9SQ19KT0JfUkVUVVJOCisgKiovCitzdGF0aWMgaW50IGlwcl9yZXNldF9zaHV0ZG93bl9pb2Eoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJZW51bSBpcHJfc2h1dGRvd25fdHlwZSBzaHV0ZG93bl90eXBlID0gaXByX2NtZC0+dS5zaHV0ZG93bl90eXBlOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgcmMgPSBJUFJfUkNfSk9CX0NPTlRJTlVFOworCisJRU5URVI7CisJaWYgKHNodXRkb3duX3R5cGUgIT0gSVBSX1NIVVRET1dOX05PTkUgJiYgIWlvYV9jZmctPmlvYV9pc19kZWFkKSB7CisJCWlwcl9jbWQtPmlvYXJjYi5yZXNfaGFuZGxlID0gY3B1X3RvX2JlMzIoSVBSX0lPQV9SRVNfSEFORExFKTsKKwkJaXByX2NtZC0+aW9hcmNiLmNtZF9wa3QucmVxdWVzdF90eXBlID0gSVBSX1JRVFlQRV9JT0FDTUQ7CisJCWlwcl9jbWQtPmlvYXJjYi5jbWRfcGt0LmNkYlswXSA9IElQUl9JT0FfU0hVVERPV047CisJCWlwcl9jbWQtPmlvYXJjYi5jbWRfcGt0LmNkYlsxXSA9IHNodXRkb3duX3R5cGU7CisKKwkJaWYgKHNodXRkb3duX3R5cGUgPT0gSVBSX1NIVVRET1dOX0FCQlJFVikKKwkJCXRpbWVvdXQgPSBJUFJfQUJCUkVWX1NIVVRET1dOX1RJTUVPVVQ7CisJCWVsc2UgaWYgKHNodXRkb3duX3R5cGUgPT0gSVBSX1NIVVRET1dOX1BSRVBBUkVfRk9SX05PUk1BTCkKKwkJCXRpbWVvdXQgPSBJUFJfSU5URVJOQUxfVElNRU9VVDsKKwkJZWxzZQorCQkJdGltZW91dCA9IElQUl9TSFVURE9XTl9USU1FT1VUOworCisJCWlwcl9kb19yZXEoaXByX2NtZCwgaXByX3Jlc2V0X2lvYV9qb2IsIGlwcl90aW1lb3V0LCB0aW1lb3V0KTsKKworCQlyYyA9IElQUl9SQ19KT0JfUkVUVVJOOworCQlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9yZXNldF91Y29kZV9kb3dubG9hZDsKKwl9IGVsc2UKKwkJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfcmVzZXRfYWxlcnQ7CisKKwlMRUFWRTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaXByX3Jlc2V0X2lvYV9qb2IgLSBBZGFwdGVyIHJlc2V0IGpvYgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBqb2Igcm91dGVyIGZvciB0aGUgYWRhcHRlciByZXNldCBqb2IuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9yZXNldF9pb2Ffam9iKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwl1MzIgcmMsIGlvYXNjOworCXVuc2lnbmVkIGxvbmcgc2NyYXRjaCA9IGlwcl9jbWQtPnUuc2NyYXRjaDsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCisJZG8geworCQlpb2FzYyA9IGJlMzJfdG9fY3B1KGlwcl9jbWQtPmlvYXNhLmlvYXNjKTsKKworCQlpZiAoaW9hX2NmZy0+cmVzZXRfY21kICE9IGlwcl9jbWQpIHsKKwkJCS8qCisJCQkgKiBXZSBhcmUgZG9pbmcgbmVzdGVkIGFkYXB0ZXIgcmVzZXRzIGFuZCB0aGlzIGlzCisJCQkgKiBub3QgdGhlIGN1cnJlbnQgcmVzZXQgam9iLgorCQkJICovCisJCQlsaXN0X2FkZF90YWlsKCZpcHJfY21kLT5xdWV1ZSwgJmlvYV9jZmctPmZyZWVfcSk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoSVBSX0lPQVNDX1NFTlNFX0tFWShpb2FzYykpIHsKKwkJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwKKwkJCQkiMHglMDJYIGZhaWxlZCB3aXRoIElPQVNDOiAweCUwOFhcbiIsCisJCQkJaXByX2NtZC0+aW9hcmNiLmNtZF9wa3QuY2RiWzBdLCBpb2FzYyk7CisKKwkJCWlwcl9pbml0aWF0ZV9pb2FfcmVzZXQoaW9hX2NmZywgSVBSX1NIVVRET1dOX05PTkUpOworCQkJbGlzdF9hZGRfdGFpbCgmaXByX2NtZC0+cXVldWUsICZpb2FfY2ZnLT5mcmVlX3EpOworCQkJcmV0dXJuOworCQl9CisKKwkJaXByX3JlaW5pdF9pcHJfY21uZChpcHJfY21kKTsKKwkJaXByX2NtZC0+dS5zY3JhdGNoID0gc2NyYXRjaDsKKwkJcmMgPSBpcHJfY21kLT5qb2Jfc3RlcChpcHJfY21kKTsKKwl9IHdoaWxlKHJjID09IElQUl9SQ19KT0JfQ09OVElOVUUpOworfQorCisvKioKKyAqIF9pcHJfaW5pdGlhdGVfaW9hX3Jlc2V0IC0gSW5pdGlhdGUgYW4gYWRhcHRlciByZXNldAorICogQGlvYV9jZmc6CQlpb2EgY29uZmlnIHN0cnVjdAorICogQGpvYl9zdGVwOgkJZmlyc3Qgam9iIHN0ZXAgb2YgcmVzZXQgam9iCisgKiBAc2h1dGRvd25fdHlwZToJc2h1dGRvd24gdHlwZQorICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5pdGlhdGUgdGhlIHJlc2V0IG9mIHRoZSBnaXZlbiBhZGFwdGVyCisgKiBzdGFydGluZyBhdCB0aGUgc2VsZWN0ZWQgam9iIHN0ZXAuCisgKiBJZiB0aGUgY2FsbGVyIG5lZWRzIHRvIHdhaXQgb24gdGhlIGNvbXBsZXRpb24gb2YgdGhlIHJlc2V0LAorICogdGhlIGNhbGxlciBtdXN0IHNsZWVwIG9uIHRoZSByZXNldF93YWl0X3EuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIF9pcHJfaW5pdGlhdGVfaW9hX3Jlc2V0KHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZywKKwkJCQkgICAgaW50ICgqam9iX3N0ZXApIChzdHJ1Y3QgaXByX2NtbmQgKiksCisJCQkJICAgIGVudW0gaXByX3NodXRkb3duX3R5cGUgc2h1dGRvd25fdHlwZSkKK3sKKwlzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQ7CisKKwlpb2FfY2ZnLT5pbl9yZXNldF9yZWxvYWQgPSAxOworCWlvYV9jZmctPmFsbG93X2NtZHMgPSAwOworCXNjc2lfYmxvY2tfcmVxdWVzdHMoaW9hX2NmZy0+aG9zdCk7CisKKwlpcHJfY21kID0gaXByX2dldF9mcmVlX2lwcl9jbW5kKGlvYV9jZmcpOworCWlvYV9jZmctPnJlc2V0X2NtZCA9IGlwcl9jbWQ7CisJaXByX2NtZC0+am9iX3N0ZXAgPSBqb2Jfc3RlcDsKKwlpcHJfY21kLT51LnNodXRkb3duX3R5cGUgPSBzaHV0ZG93bl90eXBlOworCisJaXByX3Jlc2V0X2lvYV9qb2IoaXByX2NtZCk7Cit9CisKKy8qKgorICogaXByX2luaXRpYXRlX2lvYV9yZXNldCAtIEluaXRpYXRlIGFuIGFkYXB0ZXIgcmVzZXQKKyAqIEBpb2FfY2ZnOgkJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBzaHV0ZG93bl90eXBlOglzaHV0ZG93biB0eXBlCisgKgorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWF0ZSB0aGUgcmVzZXQgb2YgdGhlIGdpdmVuIGFkYXB0ZXIuCisgKiBJZiB0aGUgY2FsbGVyIG5lZWRzIHRvIHdhaXQgb24gdGhlIGNvbXBsZXRpb24gb2YgdGhlIHJlc2V0LAorICogdGhlIGNhbGxlciBtdXN0IHNsZWVwIG9uIHRoZSByZXNldF93YWl0X3EuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9pbml0aWF0ZV9pb2FfcmVzZXQoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJCSAgIGVudW0gaXByX3NodXRkb3duX3R5cGUgc2h1dGRvd25fdHlwZSkKK3sKKwlpZiAoaW9hX2NmZy0+aW9hX2lzX2RlYWQpCisJCXJldHVybjsKKworCWlmIChpb2FfY2ZnLT5pbl9yZXNldF9yZWxvYWQgJiYgaW9hX2NmZy0+c2R0X3N0YXRlID09IEdFVF9EVU1QKQorCQlpb2FfY2ZnLT5zZHRfc3RhdGUgPSBBQk9SVF9EVU1QOworCisJaWYgKGlvYV9jZmctPnJlc2V0X3JldHJpZXMrKyA+PSBJUFJfTlVNX1JFU0VUX1JFTE9BRF9SRVRSSUVTKSB7CisJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwKKwkJCSJJT0EgdGFrZW4gb2ZmbGluZSAtIGVycm9yIHJlY292ZXJ5IGZhaWxlZFxuIik7CisKKwkJaW9hX2NmZy0+cmVzZXRfcmV0cmllcyA9IDA7CisJCWlvYV9jZmctPmlvYV9pc19kZWFkID0gMTsKKworCQlpZiAoaW9hX2NmZy0+aW5faW9hX2JyaW5nZG93bikgeworCQkJaW9hX2NmZy0+cmVzZXRfY21kID0gTlVMTDsKKwkJCWlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCA9IDA7CisJCQlpcHJfZmFpbF9hbGxfb3BzKGlvYV9jZmcpOworCQkJd2FrZV91cF9hbGwoJmlvYV9jZmctPnJlc2V0X3dhaXRfcSk7CisKKwkJCXNwaW5fdW5sb2NrX2lycShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2spOworCQkJc2NzaV91bmJsb2NrX3JlcXVlc3RzKGlvYV9jZmctPmhvc3QpOworCQkJc3Bpbl9sb2NrX2lycShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2spOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJaW9hX2NmZy0+aW5faW9hX2JyaW5nZG93biA9IDE7CisJCQlzaHV0ZG93bl90eXBlID0gSVBSX1NIVVRET1dOX05PTkU7CisJCX0KKwl9CisKKwlfaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBpcHJfcmVzZXRfc2h1dGRvd25faW9hLAorCQkJCXNodXRkb3duX3R5cGUpOworfQorCisvKioKKyAqIGlwcl9wcm9iZV9pb2FfcGFydDIgLSBJbml0aWFsaXplcyBJT0FzIGZvdW5kIGluIGlwcl9wcm9iZV9pb2EoLi4pCisgKiBAaW9hX2NmZzoJaW9hIGNmZyBzdHJ1Y3QKKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpcyBpcyB0aGUgc2Vjb25kIHBoYXNlIG9mIGFkYXB0ZXIgaW50aWFsaXphdGlvbgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIGluaXRpbGl6aW5nIHRoZSBhZGFwdGVyIHRvIHRoZSBwb2ludAorICogd2hlcmUgaXQgY2FuIGFjY2VwdCBuZXcgY29tbWFuZHMuCisKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkwIG9uIHN1Y2VzcyAvIC1FSU8gb24gZmFpbHVyZQorICoqLworc3RhdGljIGludCBfX2RldmluaXQgaXByX3Byb2JlX2lvYV9wYXJ0MihzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCit7CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBsb25nIGhvc3RfbG9ja19mbGFncyA9IDA7CisKKwlFTlRFUjsKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGhvc3RfbG9ja19mbGFncyk7CisJZGV2X2RiZygmaW9hX2NmZy0+cGRldi0+ZGV2LCAiaW9hX2NmZyBhZHg6IDB4JXBcbiIsIGlvYV9jZmcpOworCV9pcHJfaW5pdGlhdGVfaW9hX3Jlc2V0KGlvYV9jZmcsIGlwcl9yZXNldF9lbmFibGVfaW9hLCBJUFJfU0hVVERPV05fTk9ORSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgaG9zdF9sb2NrX2ZsYWdzKTsKKwl3YWl0X2V2ZW50KGlvYV9jZmctPnJlc2V0X3dhaXRfcSwgIWlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBob3N0X2xvY2tfZmxhZ3MpOworCisJaWYgKGlvYV9jZmctPmlvYV9pc19kZWFkKSB7CisJCXJjID0gLUVJTzsKKwl9IGVsc2UgaWYgKGlwcl9pbnZhbGlkX2FkYXB0ZXIoaW9hX2NmZykpIHsKKwkJaWYgKCFpcHJfdGVzdG1vZGUpCisJCQlyYyA9IC1FSU87CisKKwkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LAorCQkJIkFkYXB0ZXIgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24uXG4iKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgaG9zdF9sb2NrX2ZsYWdzKTsKKworCUxFQVZFOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpcHJfZnJlZV9jbWRfYmxrcyAtIEZyZWVzIGNvbW1hbmQgYmxvY2tzIGFsbG9jYXRlZCBmb3IgYW4gYWRhcHRlcgorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9mcmVlX2NtZF9ibGtzKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJUFJfTlVNX0NNRF9CTEtTOyBpKyspIHsKKwkJaWYgKGlvYV9jZmctPmlwcl9jbW5kX2xpc3RbaV0pCisJCQlwY2lfcG9vbF9mcmVlKGlvYV9jZmctPmlwcl9jbWRfcG9vbCwKKwkJCQkgICAgICBpb2FfY2ZnLT5pcHJfY21uZF9saXN0W2ldLAorCQkJCSAgICAgIGlvYV9jZmctPmlwcl9jbW5kX2xpc3RfZG1hW2ldKTsKKworCQlpb2FfY2ZnLT5pcHJfY21uZF9saXN0W2ldID0gTlVMTDsKKwl9CisKKwlpZiAoaW9hX2NmZy0+aXByX2NtZF9wb29sKQorCQlwY2lfcG9vbF9kZXN0cm95IChpb2FfY2ZnLT5pcHJfY21kX3Bvb2wpOworCisJaW9hX2NmZy0+aXByX2NtZF9wb29sID0gTlVMTDsKK30KKworLyoqCisgKiBpcHJfZnJlZV9tZW0gLSBGcmVlcyBtZW1vcnkgYWxsb2NhdGVkIGZvciBhbiBhZGFwdGVyCisgKiBAaW9hX2NmZzoJaW9hIGNmZyBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm90aGluZworICoqLworc3RhdGljIHZvaWQgaXByX2ZyZWVfbWVtKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZykKK3sKKwlpbnQgaTsKKworCWtmcmVlKGlvYV9jZmctPnJlc19lbnRyaWVzKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGlvYV9jZmctPnBkZXYsIHNpemVvZihzdHJ1Y3QgaXByX21pc2NfY2JzKSwKKwkJCSAgICBpb2FfY2ZnLT52cGRfY2JzLCBpb2FfY2ZnLT52cGRfY2JzX2RtYSk7CisJaXByX2ZyZWVfY21kX2Jsa3MoaW9hX2NmZyk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChpb2FfY2ZnLT5wZGV2LCBzaXplb2YodTMyKSAqIElQUl9OVU1fQ01EX0JMS1MsCisJCQkgICAgaW9hX2NmZy0+aG9zdF9ycnEsIGlvYV9jZmctPmhvc3RfcnJxX2RtYSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChpb2FfY2ZnLT5wZGV2LCBzaXplb2Yoc3RydWN0IGlwcl9jb25maWdfdGFibGUpLAorCQkJICAgIGlvYV9jZmctPmNmZ190YWJsZSwKKwkJCSAgICBpb2FfY2ZnLT5jZmdfdGFibGVfZG1hKTsKKworCWZvciAoaSA9IDA7IGkgPCBJUFJfTlVNX0hDQU1TOyBpKyspIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChpb2FfY2ZnLT5wZGV2LAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGlwcl9ob3N0cmNiKSwKKwkJCQkgICAgaW9hX2NmZy0+aG9zdHJjYltpXSwKKwkJCQkgICAgaW9hX2NmZy0+aG9zdHJjYl9kbWFbaV0pOworCX0KKworCWlwcl9mcmVlX2R1bXAoaW9hX2NmZyk7CisJa2ZyZWUoaW9hX2NmZy0+c2F2ZWRfbW9kZV9wYWdlcyk7CisJa2ZyZWUoaW9hX2NmZy0+dHJhY2UpOworfQorCisvKioKKyAqIGlwcl9mcmVlX2FsbF9yZXNvdXJjZXMgLSBGcmVlIGFsbCBhbGxvY2F0ZWQgcmVzb3VyY2VzIGZvciBhbiBhZGFwdGVyLgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gZnJlZXMgYWxsIGFsbG9jYXRlZCByZXNvdXJjZXMgZm9yIHRoZQorICogc3BlY2lmaWVkIGFkYXB0ZXIuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9mcmVlX2FsbF9yZXNvdXJjZXMoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaW9hX2NmZy0+cGRldjsKKworCUVOVEVSOworCWZyZWVfaXJxKHBkZXYtPmlycSwgaW9hX2NmZyk7CisJaW91bm1hcChpb2FfY2ZnLT5oZHdfZG1hX3JlZ3MpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJaXByX2ZyZWVfbWVtKGlvYV9jZmcpOworCXNjc2lfaG9zdF9wdXQoaW9hX2NmZy0+aG9zdCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCUxFQVZFOworfQorCisvKioKKyAqIGlwcl9hbGxvY19jbWRfYmxrcyAtIEFsbG9jYXRlIGNvbW1hbmQgYmxvY2tzIGZvciBhbiBhZGFwdGVyCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMCBvbiBzdWNjZXNzIC8gLUVOT01FTSBvbiBhbGxvY2F0aW9uIGZhaWx1cmUKKyAqKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGlwcl9hbGxvY19jbWRfYmxrcyhzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCit7CisJc3RydWN0IGlwcl9jbW5kICppcHJfY21kOworCXN0cnVjdCBpcHJfaW9hcmNiICppb2FyY2I7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwlpbnQgaTsKKworCWlvYV9jZmctPmlwcl9jbWRfcG9vbCA9IHBjaV9wb29sX2NyZWF0ZSAoSVBSX05BTUUsIGlvYV9jZmctPnBkZXYsCisJCQkJCQkgc2l6ZW9mKHN0cnVjdCBpcHJfY21uZCksIDgsIDApOworCisJaWYgKCFpb2FfY2ZnLT5pcHJfY21kX3Bvb2wpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IElQUl9OVU1fQ01EX0JMS1M7IGkrKykgeworCQlpcHJfY21kID0gcGNpX3Bvb2xfYWxsb2MgKGlvYV9jZmctPmlwcl9jbWRfcG9vbCwgU0xBQl9LRVJORUwsICZkbWFfYWRkcik7CisKKwkJaWYgKCFpcHJfY21kKSB7CisJCQlpcHJfZnJlZV9jbWRfYmxrcyhpb2FfY2ZnKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJbWVtc2V0KGlwcl9jbWQsIDAsIHNpemVvZigqaXByX2NtZCkpOworCQlpb2FfY2ZnLT5pcHJfY21uZF9saXN0W2ldID0gaXByX2NtZDsKKwkJaW9hX2NmZy0+aXByX2NtbmRfbGlzdF9kbWFbaV0gPSBkbWFfYWRkcjsKKworCQlpb2FyY2IgPSAmaXByX2NtZC0+aW9hcmNiOworCQlpb2FyY2ItPmlvYXJjYl9ob3N0X3BjaV9hZGRyID0gY3B1X3RvX2JlMzIoZG1hX2FkZHIpOworCQlpb2FyY2ItPmhvc3RfcmVzcG9uc2VfaGFuZGxlID0gY3B1X3RvX2JlMzIoaSA8PCAyKTsKKwkJaW9hcmNiLT53cml0ZV9pb2FkbF9hZGRyID0KKwkJCWNwdV90b19iZTMyKGRtYV9hZGRyICsgb2Zmc2V0b2Yoc3RydWN0IGlwcl9jbW5kLCBpb2FkbCkpOworCQlpb2FyY2ItPnJlYWRfaW9hZGxfYWRkciA9IGlvYXJjYi0+d3JpdGVfaW9hZGxfYWRkcjsKKwkJaW9hcmNiLT5pb2FzYV9ob3N0X3BjaV9hZGRyID0KKwkJCWNwdV90b19iZTMyKGRtYV9hZGRyICsgb2Zmc2V0b2Yoc3RydWN0IGlwcl9jbW5kLCBpb2FzYSkpOworCQlpb2FyY2ItPmlvYXNhX2xlbiA9IGNwdV90b19iZTE2KHNpemVvZihzdHJ1Y3QgaXByX2lvYXNhKSk7CisJCWlwcl9jbWQtPmNtZF9pbmRleCA9IGk7CisJCWlwcl9jbWQtPmlvYV9jZmcgPSBpb2FfY2ZnOworCQlpcHJfY21kLT5zZW5zZV9idWZmZXJfZG1hID0gZG1hX2FkZHIgKworCQkJb2Zmc2V0b2Yoc3RydWN0IGlwcl9jbW5kLCBzZW5zZV9idWZmZXIpOworCisJCWxpc3RfYWRkX3RhaWwoJmlwcl9jbWQtPnF1ZXVlLCAmaW9hX2NmZy0+ZnJlZV9xKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpcHJfYWxsb2NfbWVtIC0gQWxsb2NhdGUgbWVtb3J5IGZvciBhbiBhZGFwdGVyCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMCBvbiBzdWNjZXNzIC8gbm9uLXplcm8gZm9yIGVycm9yCisgKiovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpcHJfYWxsb2NfbWVtKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZykKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGlvYV9jZmctPnBkZXY7CisJaW50IGksIHJjID0gLUVOT01FTTsKKworCUVOVEVSOworCWlvYV9jZmctPnJlc19lbnRyaWVzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSkgKgorCQkJCSAgICAgICBJUFJfTUFYX1BIWVNJQ0FMX0RFVlMsIEdGUF9LRVJORUwpOworCisJaWYgKCFpb2FfY2ZnLT5yZXNfZW50cmllcykKKwkJZ290byBvdXQ7CisKKwltZW1zZXQoaW9hX2NmZy0+cmVzX2VudHJpZXMsIDAsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5KSAqIElQUl9NQVhfUEhZU0lDQUxfREVWUyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSVBSX01BWF9QSFlTSUNBTF9ERVZTOyBpKyspCisJCWxpc3RfYWRkX3RhaWwoJmlvYV9jZmctPnJlc19lbnRyaWVzW2ldLnF1ZXVlLCAmaW9hX2NmZy0+ZnJlZV9yZXNfcSk7CisKKwlpb2FfY2ZnLT52cGRfY2JzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaW9hX2NmZy0+cGRldiwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgaXByX21pc2NfY2JzKSwKKwkJCQkJCSZpb2FfY2ZnLT52cGRfY2JzX2RtYSk7CisKKwlpZiAoIWlvYV9jZmctPnZwZF9jYnMpCisJCWdvdG8gb3V0X2ZyZWVfcmVzX2VudHJpZXM7CisKKwlpZiAoaXByX2FsbG9jX2NtZF9ibGtzKGlvYV9jZmcpKQorCQlnb3RvIG91dF9mcmVlX3ZwZF9jYnM7CisKKwlpb2FfY2ZnLT5ob3N0X3JycSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGlvYV9jZmctPnBkZXYsCisJCQkJCQkgc2l6ZW9mKHUzMikgKiBJUFJfTlVNX0NNRF9CTEtTLAorCQkJCQkJICZpb2FfY2ZnLT5ob3N0X3JycV9kbWEpOworCisJaWYgKCFpb2FfY2ZnLT5ob3N0X3JycSkKKwkJZ290byBvdXRfaXByX2ZyZWVfY21kX2Jsb2NrczsKKworCWlvYV9jZmctPmNmZ190YWJsZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGlvYV9jZmctPnBkZXYsCisJCQkJCQkgIHNpemVvZihzdHJ1Y3QgaXByX2NvbmZpZ190YWJsZSksCisJCQkJCQkgICZpb2FfY2ZnLT5jZmdfdGFibGVfZG1hKTsKKworCWlmICghaW9hX2NmZy0+Y2ZnX3RhYmxlKQorCQlnb3RvIG91dF9mcmVlX2hvc3RfcnJxOworCisJZm9yIChpID0gMDsgaSA8IElQUl9OVU1fSENBTVM7IGkrKykgeworCQlpb2FfY2ZnLT5ob3N0cmNiW2ldID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaW9hX2NmZy0+cGRldiwKKwkJCQkJCQkgICBzaXplb2Yoc3RydWN0IGlwcl9ob3N0cmNiKSwKKwkJCQkJCQkgICAmaW9hX2NmZy0+aG9zdHJjYl9kbWFbaV0pOworCisJCWlmICghaW9hX2NmZy0+aG9zdHJjYltpXSkKKwkJCWdvdG8gb3V0X2ZyZWVfaG9zdHJjYl9kbWE7CisKKwkJaW9hX2NmZy0+aG9zdHJjYltpXS0+aG9zdHJjYl9kbWEgPQorCQkJaW9hX2NmZy0+aG9zdHJjYl9kbWFbaV0gKyBvZmZzZXRvZihzdHJ1Y3QgaXByX2hvc3RyY2IsIGhjYW0pOworCQlsaXN0X2FkZF90YWlsKCZpb2FfY2ZnLT5ob3N0cmNiW2ldLT5xdWV1ZSwgJmlvYV9jZmctPmhvc3RyY2JfZnJlZV9xKTsKKwl9CisKKwlpb2FfY2ZnLT50cmFjZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcHJfdHJhY2VfZW50cnkpICoKKwkJCQkgSVBSX05VTV9UUkFDRV9FTlRSSUVTLCBHRlBfS0VSTkVMKTsKKworCWlmICghaW9hX2NmZy0+dHJhY2UpCisJCWdvdG8gb3V0X2ZyZWVfaG9zdHJjYl9kbWE7CisKKwltZW1zZXQoaW9hX2NmZy0+dHJhY2UsIDAsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaXByX3RyYWNlX2VudHJ5KSAqIElQUl9OVU1fVFJBQ0VfRU5UUklFUyk7CisKKwlyYyA9IDA7CitvdXQ6CisJTEVBVkU7CisJcmV0dXJuIHJjOworCitvdXRfZnJlZV9ob3N0cmNiX2RtYToKKwl3aGlsZSAoaS0tID4gMCkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZihzdHJ1Y3QgaXByX2hvc3RyY2IpLAorCQkJCSAgICBpb2FfY2ZnLT5ob3N0cmNiW2ldLAorCQkJCSAgICBpb2FfY2ZnLT5ob3N0cmNiX2RtYVtpXSk7CisJfQorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCBpcHJfY29uZmlnX3RhYmxlKSwKKwkJCSAgICBpb2FfY2ZnLT5jZmdfdGFibGUsIGlvYV9jZmctPmNmZ190YWJsZV9kbWEpOworb3V0X2ZyZWVfaG9zdF9ycnE6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2YodTMyKSAqIElQUl9OVU1fQ01EX0JMS1MsCisJCQkgICAgaW9hX2NmZy0+aG9zdF9ycnEsIGlvYV9jZmctPmhvc3RfcnJxX2RtYSk7CitvdXRfaXByX2ZyZWVfY21kX2Jsb2NrczoKKwlpcHJfZnJlZV9jbWRfYmxrcyhpb2FfY2ZnKTsKK291dF9mcmVlX3ZwZF9jYnM6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2Yoc3RydWN0IGlwcl9taXNjX2NicyksCisJCQkgICAgaW9hX2NmZy0+dnBkX2NicywgaW9hX2NmZy0+dnBkX2Nic19kbWEpOworb3V0X2ZyZWVfcmVzX2VudHJpZXM6CisJa2ZyZWUoaW9hX2NmZy0+cmVzX2VudHJpZXMpOworCWdvdG8gb3V0OworfQorCisvKioKKyAqIGlwcl9pbml0aWFsaXplX2J1c19hdHRyIC0gSW5pdGlhbGl6ZSBTQ1NJIGJ1cyBhdHRyaWJ1dGVzIHRvIGRlZmF1bHQgdmFsdWVzCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGlwcl9pbml0aWFsaXplX2J1c19hdHRyKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJUFJfTUFYX05VTV9CVVNFUzsgaSsrKSB7CisJCWlvYV9jZmctPmJ1c19hdHRyW2ldLmJ1cyA9IGk7CisJCWlvYV9jZmctPmJ1c19hdHRyW2ldLnFhc19lbmFibGVkID0gMDsKKwkJaW9hX2NmZy0+YnVzX2F0dHJbaV0uYnVzX3dpZHRoID0gSVBSX0RFRkFVTFRfQlVTX1dJRFRIOworCQlpZiAoaXByX21heF9zcGVlZCA8IEFSUkFZX1NJWkUoaXByX21heF9idXNfc3BlZWRzKSkKKwkJCWlvYV9jZmctPmJ1c19hdHRyW2ldLm1heF94ZmVyX3JhdGUgPSBpcHJfbWF4X2J1c19zcGVlZHNbaXByX21heF9zcGVlZF07CisJCWVsc2UKKwkJCWlvYV9jZmctPmJ1c19hdHRyW2ldLm1heF94ZmVyX3JhdGUgPSBJUFJfVTE2MF9TQ1NJX1JBVEU7CisJfQorfQorCisvKioKKyAqIGlwcl9pbml0X2lvYV9jZmcgLSBJbml0aWFsaXplIElPQSBjb25maWcgc3RydWN0CisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBob3N0OgkJc2NzaSBob3N0IHN0cnVjdAorICogQHBkZXY6CQlQQ0kgZGV2IHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaXByX2luaXRfaW9hX2NmZyhzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQkJICAgICAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWNvbnN0IHN0cnVjdCBpcHJfaW50ZXJydXB0X29mZnNldHMgKnA7CisJc3RydWN0IGlwcl9pbnRlcnJ1cHRzICp0OworCXZvaWQgX19pb21lbSAqYmFzZTsKKworCWlvYV9jZmctPmhvc3QgPSBob3N0OworCWlvYV9jZmctPnBkZXYgPSBwZGV2OworCWlvYV9jZmctPmxvZ19sZXZlbCA9IGlwcl9sb2dfbGV2ZWw7CisJc3ByaW50Zihpb2FfY2ZnLT5leWVfY2F0Y2hlciwgSVBSX0VZRUNBVENIRVIpOworCXNwcmludGYoaW9hX2NmZy0+dHJhY2Vfc3RhcnQsIElQUl9UUkFDRV9TVEFSVF9MQUJFTCk7CisJc3ByaW50Zihpb2FfY2ZnLT5pcHJfZnJlZV9sYWJlbCwgSVBSX0ZSRUVRX0xBQkVMKTsKKwlzcHJpbnRmKGlvYV9jZmctPmlwcl9wZW5kaW5nX2xhYmVsLCBJUFJfUEVORFFfTEFCRUwpOworCXNwcmludGYoaW9hX2NmZy0+Y2ZnX3RhYmxlX3N0YXJ0LCBJUFJfQ0ZHX1RCTF9TVEFSVCk7CisJc3ByaW50Zihpb2FfY2ZnLT5yZXNvdXJjZV90YWJsZV9sYWJlbCwgSVBSX1JFU19UQUJMRV9MQUJFTCk7CisJc3ByaW50Zihpb2FfY2ZnLT5pcHJfaGNhbV9sYWJlbCwgSVBSX0hDQU1fTEFCRUwpOworCXNwcmludGYoaW9hX2NmZy0+aXByX2NtZF9sYWJlbCwgSVBSX0NNRF9MQUJFTCk7CisKKwlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+ZnJlZV9xKTsKKwlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+cGVuZGluZ19xKTsKKwlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+aG9zdHJjYl9mcmVlX3EpOworCUlOSVRfTElTVF9IRUFEKCZpb2FfY2ZnLT5ob3N0cmNiX3BlbmRpbmdfcSk7CisJSU5JVF9MSVNUX0hFQUQoJmlvYV9jZmctPmZyZWVfcmVzX3EpOworCUlOSVRfTElTVF9IRUFEKCZpb2FfY2ZnLT51c2VkX3Jlc19xKTsKKwlJTklUX1dPUksoJmlvYV9jZmctPndvcmtfcSwgaXByX3dvcmtlcl90aHJlYWQsIGlvYV9jZmcpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlvYV9jZmctPnJlc2V0X3dhaXRfcSk7CisJaW9hX2NmZy0+c2R0X3N0YXRlID0gSU5BQ1RJVkU7CisKKwlpcHJfaW5pdGlhbGl6ZV9idXNfYXR0cihpb2FfY2ZnKTsKKworCWhvc3QtPm1heF9pZCA9IElQUl9NQVhfTlVNX1RBUkdFVFNfUEVSX0JVUzsKKwlob3N0LT5tYXhfbHVuID0gSVBSX01BWF9OVU1fTFVOU19QRVJfVEFSR0VUOworCWhvc3QtPm1heF9jaGFubmVsID0gSVBSX01BWF9CVVNfVE9fU0NBTjsKKwlob3N0LT51bmlxdWVfaWQgPSBob3N0LT5ob3N0X25vOworCWhvc3QtPm1heF9jbWRfbGVuID0gSVBSX01BWF9DREJfTEVOOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBpb2FfY2ZnKTsKKworCXAgPSAmaW9hX2NmZy0+Y2hpcF9jZmctPnJlZ3M7CisJdCA9ICZpb2FfY2ZnLT5yZWdzOworCWJhc2UgPSBpb2FfY2ZnLT5oZHdfZG1hX3JlZ3M7CisKKwl0LT5zZXRfaW50ZXJydXB0X21hc2tfcmVnID0gYmFzZSArIHAtPnNldF9pbnRlcnJ1cHRfbWFza19yZWc7CisJdC0+Y2xyX2ludGVycnVwdF9tYXNrX3JlZyA9IGJhc2UgKyBwLT5jbHJfaW50ZXJydXB0X21hc2tfcmVnOworCXQtPnNlbnNlX2ludGVycnVwdF9tYXNrX3JlZyA9IGJhc2UgKyBwLT5zZW5zZV9pbnRlcnJ1cHRfbWFza19yZWc7CisJdC0+Y2xyX2ludGVycnVwdF9yZWcgPSBiYXNlICsgcC0+Y2xyX2ludGVycnVwdF9yZWc7CisJdC0+c2Vuc2VfaW50ZXJydXB0X3JlZyA9IGJhc2UgKyBwLT5zZW5zZV9pbnRlcnJ1cHRfcmVnOworCXQtPmlvYXJyaW5fcmVnID0gYmFzZSArIHAtPmlvYXJyaW5fcmVnOworCXQtPnNlbnNlX3Vwcm9jX2ludGVycnVwdF9yZWcgPSBiYXNlICsgcC0+c2Vuc2VfdXByb2NfaW50ZXJydXB0X3JlZzsKKwl0LT5zZXRfdXByb2NfaW50ZXJydXB0X3JlZyA9IGJhc2UgKyBwLT5zZXRfdXByb2NfaW50ZXJydXB0X3JlZzsKKwl0LT5jbHJfdXByb2NfaW50ZXJydXB0X3JlZyA9IGJhc2UgKyBwLT5jbHJfdXByb2NfaW50ZXJydXB0X3JlZzsKK30KKworLyoqCisgKiBpcHJfZ2V0X2NoaXBfY2ZnIC0gRmluZCBhZGFwdGVyIGNoaXAgY29uZmlndXJhdGlvbgorICogQGRldl9pZDoJCVBDSSBkZXZpY2UgaWQgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCXB0ciB0byBjaGlwIGNvbmZpZyBvbiBzdWNjZXNzIC8gTlVMTCBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgY29uc3Qgc3RydWN0IGlwcl9jaGlwX2NmZ190ICogX19kZXZpbml0CitpcHJfZ2V0X2NoaXBfY2ZnKGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpkZXZfaWQpCit7CisJaW50IGk7CisKKwlpZiAoZGV2X2lkLT5kcml2ZXJfZGF0YSkKKwkJcmV0dXJuIChjb25zdCBzdHJ1Y3QgaXByX2NoaXBfY2ZnX3QgKilkZXZfaWQtPmRyaXZlcl9kYXRhOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXByX2NoaXApOyBpKyspCisJCWlmIChpcHJfY2hpcFtpXS52ZW5kb3IgPT0gZGV2X2lkLT52ZW5kb3IgJiYKKwkJICAgIGlwcl9jaGlwW2ldLmRldmljZSA9PSBkZXZfaWQtPmRldmljZSkKKwkJCXJldHVybiBpcHJfY2hpcFtpXS5jZmc7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogaXByX3Byb2JlX2lvYSAtIEFsbG9jYXRlcyBtZW1vcnkgYW5kIGRvZXMgZmlyc3Qgc3RhZ2Ugb2YgaW5pdGlhbGl6YXRpb24KKyAqIEBwZGV2OgkJUENJIGRldmljZSBzdHJ1Y3QKKyAqIEBkZXZfaWQ6CQlQQ0kgZGV2aWNlIGlkIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkwIG9uIHN1Y2Nlc3MgLyBub24temVybyBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpcHJfcHJvYmVfaW9hKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpkZXZfaWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJdW5zaWduZWQgbG9uZyBpcHJfcmVnc19wY2k7CisJdm9pZCBfX2lvbWVtICppcHJfcmVnczsKKwl1MzIgcmMgPSBQQ0lCSU9TX1NVQ0NFU1NGVUw7CisKKwlFTlRFUjsKKworCWlmICgocmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGVuYWJsZSBhZGFwdGVyXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIkZvdW5kIElPQSB3aXRoIElSUTogJWRcbiIsIHBkZXYtPmlycSk7CisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZkcml2ZXJfdGVtcGxhdGUsIHNpemVvZigqaW9hX2NmZykpOworCisJaWYgKCFob3N0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbGwgdG8gc2NzaV9ob3N0X2FsbG9jIGZhaWxlZCFcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2Rpc2FibGU7CisJfQorCisJaW9hX2NmZyA9IChzdHJ1Y3QgaXByX2lvYV9jZmcgKilob3N0LT5ob3N0ZGF0YTsKKwltZW1zZXQoaW9hX2NmZywgMCwgc2l6ZW9mKHN0cnVjdCBpcHJfaW9hX2NmZykpOworCisJaW9hX2NmZy0+Y2hpcF9jZmcgPSBpcHJfZ2V0X2NoaXBfY2ZnKGRldl9pZCk7CisKKwlpZiAoIWlvYV9jZmctPmNoaXBfY2ZnKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVua25vd24gYWRhcHRlciBjaGlwc2V0IDB4JTA0WCAweCUwNFhcbiIsCisJCQlkZXZfaWQtPnZlbmRvciwgZGV2X2lkLT5kZXZpY2UpOworCQlnb3RvIG91dF9zY3NpX2hvc3RfcHV0OworCX0KKworCWlwcl9yZWdzX3BjaSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKworCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBJUFJfTkFNRSk7CisJaWYgKHJjIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiQ291bGRuJ3QgcmVnaXN0ZXIgbWVtb3J5IHJhbmdlIG9mIHJlZ2lzdGVyc1xuIik7CisJCWdvdG8gb3V0X3Njc2lfaG9zdF9wdXQ7CisJfQorCisJaXByX3JlZ3MgPSBpb3JlbWFwKGlwcl9yZWdzX3BjaSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CisKKwlpZiAoIWlwcl9yZWdzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJDb3VsZG4ndCBtYXAgbWVtb3J5IHJhbmdlIG9mIHJlZ2lzdGVyc1xuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb25zOworCX0KKworCWlvYV9jZmctPmhkd19kbWFfcmVncyA9IGlwcl9yZWdzOworCWlvYV9jZmctPmhkd19kbWFfcmVnc19wY2kgPSBpcHJfcmVnc19wY2k7CisJaW9hX2NmZy0+aW9hX21haWxib3ggPSBpb2FfY2ZnLT5jaGlwX2NmZy0+bWFpbGJveCArIGlwcl9yZWdzOworCisJaXByX2luaXRfaW9hX2NmZyhpb2FfY2ZnLCBob3N0LCBwZGV2KTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBzZXQgUENJIERNQSBtYXNrXG4iKTsKKwkJZ290byBjbGVhbnVwX25vbWVtOworCX0KKworCXJjID0gcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsCisJCQkJICAgaW9hX2NmZy0+Y2hpcF9jZmctPmNhY2hlX2xpbmVfc2l6ZSk7CisKKwlpZiAocmMgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIldyaXRlIG9mIGNhY2hlIGxpbmUgc2l6ZSBmYWlsZWRcbiIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gY2xlYW51cF9ub21lbTsKKwl9CisKKwkvKiBTYXZlIGF3YXkgUENJIGNvbmZpZyBzcGFjZSBmb3IgdXNlIGZvbGxvd2luZyBJT0EgcmVzZXQgKi8KKwlyYyA9IHBjaV9zYXZlX3N0YXRlKHBkZXYpOworCisJaWYgKHJjICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gc2F2ZSBQQ0kgY29uZmlnIHNwYWNlXG4iKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGNsZWFudXBfbm9tZW07CisJfQorCisJaWYgKChyYyA9IGlwcl9zYXZlX3BjaXhfY21kX3JlZyhpb2FfY2ZnKSkpCisJCWdvdG8gY2xlYW51cF9ub21lbTsKKworCWlmICgocmMgPSBpcHJfc2V0X3BjaXhfY21kX3JlZyhpb2FfY2ZnKSkpCisJCWdvdG8gY2xlYW51cF9ub21lbTsKKworCXJjID0gaXByX2FsbG9jX21lbShpb2FfY2ZnKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJDb3VsZG4ndCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IGZvciBkZXZpY2UgZHJpdmVyIVxuIik7CisJCWdvdG8gY2xlYW51cF9ub21lbTsKKwl9CisKKwlpcHJfbWFza19hbmRfY2xlYXJfaW50ZXJydXB0cyhpb2FfY2ZnLCB+SVBSX1BDSUlfSU9BX1RSQU5TX1RPX09QRVIpOworCXJjID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBpcHJfaXNyLCBTQV9TSElSUSwgSVBSX05BTUUsIGlvYV9jZmcpOworCisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkbid0IHJlZ2lzdGVyIElSUSAlZCEgcmM9JWRcbiIsCisJCQlwZGV2LT5pcnEsIHJjKTsKKwkJZ290byBjbGVhbnVwX25vbG9nOworCX0KKworCXNwaW5fbG9jaygmaXByX2RyaXZlcl9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZpb2FfY2ZnLT5xdWV1ZSwgJmlwcl9pb2FfaGVhZCk7CisJc3Bpbl91bmxvY2soJmlwcl9kcml2ZXJfbG9jayk7CisKKwlMRUFWRTsKK291dDoKKwlyZXR1cm4gcmM7CisKK2NsZWFudXBfbm9sb2c6CisJaXByX2ZyZWVfbWVtKGlvYV9jZmcpOworY2xlYW51cF9ub21lbToKKwlpb3VubWFwKGlwcl9yZWdzKTsKK291dF9yZWxlYXNlX3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK291dF9zY3NpX2hvc3RfcHV0OgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7CitvdXRfZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJZ290byBvdXQ7Cit9CisKKy8qKgorICogaXByX3NjYW5fdnNldHMgLSBTY2FucyBmb3IgVlNFVCBkZXZpY2VzCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqCisgKiBEZXNjcmlwdGlvbjogU2luY2UgdGhlIFZTRVQgcmVzb3VyY2VzIGRvIG5vdCBmb2xsb3cgU0FNIGluIHRoYXQgd2UgY2FuIGhhdmUKKyAqIHNwYXJzZSBMVU5zIHdpdGggbm8gTFVOIDAsIHdlIGhhdmUgdG8gc2NhbiBmb3IgdGhlc2Ugb3Vyc2VsdmVzLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfc2Nhbl92c2V0cyhzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCit7CisJaW50IHRhcmdldCwgbHVuOworCisJZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPCBJUFJfTUFYX05VTV9UQVJHRVRTX1BFUl9CVVM7IHRhcmdldCsrKQorCQlmb3IgKGx1biA9IDA7IGx1biA8IElQUl9NQVhfTlVNX1ZTRVRfTFVOU19QRVJfVEFSR0VUOyBsdW4rKyApCisJCQlzY3NpX2FkZF9kZXZpY2UoaW9hX2NmZy0+aG9zdCwgSVBSX1ZTRVRfQlVTLCB0YXJnZXQsIGx1bik7Cit9CisKKy8qKgorICogaXByX2luaXRpYXRlX2lvYV9icmluZ2Rvd24gLSBCcmluZyBkb3duIGFuIGFkYXB0ZXIKKyAqIEBpb2FfY2ZnOgkJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBzaHV0ZG93bl90eXBlOglzaHV0ZG93biB0eXBlCisgKgorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWF0ZSBicmluZ2luZyBkb3duIHRoZSBhZGFwdGVyLgorICogVGhpcyBjb25zaXN0cyBvZiBpc3N1aW5nIGFuIElPQSBzaHV0ZG93biB0byB0aGUgYWRhcHRlcgorICogdG8gZmx1c2ggdGhlIGNhY2hlLCBhbmQgcnVubmluZyBCSVNULgorICogSWYgdGhlIGNhbGxlciBuZWVkcyB0byB3YWl0IG9uIHRoZSBjb21wbGV0aW9uIG9mIHRoZSByZXNldCwKKyAqIHRoZSBjYWxsZXIgbXVzdCBzbGVlcCBvbiB0aGUgcmVzZXRfd2FpdF9xLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfaW5pdGlhdGVfaW9hX2JyaW5nZG93bihzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQkJICAgICAgIGVudW0gaXByX3NodXRkb3duX3R5cGUgc2h1dGRvd25fdHlwZSkKK3sKKwlFTlRFUjsKKwlpZiAoaW9hX2NmZy0+c2R0X3N0YXRlID09IFdBSVRfRk9SX0RVTVApCisJCWlvYV9jZmctPnNkdF9zdGF0ZSA9IEFCT1JUX0RVTVA7CisJaW9hX2NmZy0+cmVzZXRfcmV0cmllcyA9IDA7CisJaW9hX2NmZy0+aW5faW9hX2JyaW5nZG93biA9IDE7CisJaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBzaHV0ZG93bl90eXBlKTsKKwlMRUFWRTsKK30KKworLyoqCisgKiBfX2lwcl9yZW1vdmUgLSBSZW1vdmUgYSBzaW5nbGUgYWRhcHRlcgorICogQHBkZXY6CXBjaSBkZXZpY2Ugc3RydWN0CisgKgorICogQWRhcHRlciBob3QgcGx1ZyByZW1vdmUgZW50cnkgcG9pbnQuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIF9faXByX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1bnNpZ25lZCBsb25nIGhvc3RfbG9ja19mbGFncyA9IDA7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCUVOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBob3N0X2xvY2tfZmxhZ3MpOworCWlwcl9pbml0aWF0ZV9pb2FfYnJpbmdkb3duKGlvYV9jZmcsIElQUl9TSFVURE9XTl9OT1JNQUwpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGhvc3RfbG9ja19mbGFncyk7CisJd2FpdF9ldmVudChpb2FfY2ZnLT5yZXNldF93YWl0X3EsICFpb2FfY2ZnLT5pbl9yZXNldF9yZWxvYWQpOworCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgaG9zdF9sb2NrX2ZsYWdzKTsKKworCXNwaW5fbG9jaygmaXByX2RyaXZlcl9sb2NrKTsKKwlsaXN0X2RlbCgmaW9hX2NmZy0+cXVldWUpOworCXNwaW5fdW5sb2NrKCZpcHJfZHJpdmVyX2xvY2spOworCisJaWYgKGlvYV9jZmctPnNkdF9zdGF0ZSA9PSBBQk9SVF9EVU1QKQorCQlpb2FfY2ZnLT5zZHRfc3RhdGUgPSBXQUlUX0ZPUl9EVU1QOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBob3N0X2xvY2tfZmxhZ3MpOworCisJaXByX2ZyZWVfYWxsX3Jlc291cmNlcyhpb2FfY2ZnKTsKKworCUxFQVZFOworfQorCisvKioKKyAqIGlwcl9yZW1vdmUgLSBJT0EgaG90IHBsdWcgcmVtb3ZlIGVudHJ5IHBvaW50CisgKiBAcGRldjoJcGNpIGRldmljZSBzdHJ1Y3QKKyAqCisgKiBBZGFwdGVyIGhvdCBwbHVnIHJlbW92ZSBlbnRyeSBwb2ludC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlFTlRFUjsKKworCWlvYV9jZmctPmFsbG93X2NtZHMgPSAwOworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJaXByX3JlbW92ZV90cmFjZV9maWxlKCZpb2FfY2ZnLT5ob3N0LT5zaG9zdF9jbGFzc2Rldi5rb2JqLAorCQkJICAgICAgJmlwcl90cmFjZV9hdHRyKTsKKwlpcHJfcmVtb3ZlX2R1bXBfZmlsZSgmaW9hX2NmZy0+aG9zdC0+c2hvc3RfY2xhc3NkZXYua29iaiwKKwkJCSAgICAgJmlwcl9kdW1wX2F0dHIpOworCXNjc2lfcmVtb3ZlX2hvc3QoaW9hX2NmZy0+aG9zdCk7CisKKwlfX2lwcl9yZW1vdmUocGRldik7CisKKwlMRUFWRTsKK30KKworLyoqCisgKiBpcHJfcHJvYmUgLSBBZGFwdGVyIGhvdCBwbHVnIGFkZCBlbnRyeSBwb2ludAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkwIG9uIHN1Y2Nlc3MgLyBub24temVybyBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpcHJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmc7CisJaW50IHJjOworCisJcmMgPSBpcHJfcHJvYmVfaW9hKHBkZXYsIGRldl9pZCk7CisKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlvYV9jZmcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJcmMgPSBpcHJfcHJvYmVfaW9hX3BhcnQyKGlvYV9jZmcpOworCisJaWYgKHJjKSB7CisJCV9faXByX3JlbW92ZShwZGV2KTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gc2NzaV9hZGRfaG9zdChpb2FfY2ZnLT5ob3N0LCAmcGRldi0+ZGV2KTsKKworCWlmIChyYykgeworCQlfX2lwcl9yZW1vdmUocGRldik7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IGlwcl9jcmVhdGVfdHJhY2VfZmlsZSgmaW9hX2NmZy0+aG9zdC0+c2hvc3RfY2xhc3NkZXYua29iaiwKKwkJCQkgICAmaXByX3RyYWNlX2F0dHIpOworCisJaWYgKHJjKSB7CisJCXNjc2lfcmVtb3ZlX2hvc3QoaW9hX2NmZy0+aG9zdCk7CisJCV9faXByX3JlbW92ZShwZGV2KTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gaXByX2NyZWF0ZV9kdW1wX2ZpbGUoJmlvYV9jZmctPmhvc3QtPnNob3N0X2NsYXNzZGV2LmtvYmosCisJCQkJICAgJmlwcl9kdW1wX2F0dHIpOworCisJaWYgKHJjKSB7CisJCWlwcl9yZW1vdmVfdHJhY2VfZmlsZSgmaW9hX2NmZy0+aG9zdC0+c2hvc3RfY2xhc3NkZXYua29iaiwKKwkJCQkgICAgICAmaXByX3RyYWNlX2F0dHIpOworCQlzY3NpX3JlbW92ZV9ob3N0KGlvYV9jZmctPmhvc3QpOworCQlfX2lwcl9yZW1vdmUocGRldik7CisJCXJldHVybiByYzsKKwl9CisKKwlzY3NpX3NjYW5faG9zdChpb2FfY2ZnLT5ob3N0KTsKKwlpcHJfc2Nhbl92c2V0cyhpb2FfY2ZnKTsKKwlzY3NpX2FkZF9kZXZpY2UoaW9hX2NmZy0+aG9zdCwgSVBSX0lPQV9CVVMsIElQUl9JT0FfVEFSR0VULCBJUFJfSU9BX0xVTik7CisJaW9hX2NmZy0+YWxsb3dfbWxfYWRkX2RlbCA9IDE7CisJc2NoZWR1bGVfd29yaygmaW9hX2NmZy0+d29ya19xKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpcHJfc2h1dGRvd24gLSBTaHV0ZG93biBoYW5kbGVyLgorICogQGRldjoJZGV2aWNlIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCB1cG9uIHN5c3RlbSBzaHV0ZG93bi9yZWJvb3QuIEl0IHdpbGwgaXNzdWUKKyAqIGFuIGFkYXB0ZXIgc2h1dGRvd24gdG8gdGhlIGFkYXB0ZXIgdG8gZmx1c2ggdGhlIHdyaXRlIGNhY2hlLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IHBjaV9nZXRfZHJ2ZGF0YSh0b19wY2lfZGV2KGRldikpOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCWlwcl9pbml0aWF0ZV9pb2FfYnJpbmdkb3duKGlvYV9jZmcsIElQUl9TSFVURE9XTl9OT1JNQUwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwl3YWl0X2V2ZW50KGlvYV9jZmctPnJlc2V0X3dhaXRfcSwgIWlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpcHJfcGNpX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfTVlMRVgsIFBDSV9ERVZJQ0VfSURfSUJNX0dFTVNUT05FLAorCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3MDIsCisJCTAsIDAsIChrZXJuZWxfdWxvbmdfdCkmaXByX2NoaXBfY2ZnWzBdIH0sCisJeyBQQ0lfVkVORE9SX0lEX01ZTEVYLCBQQ0lfREVWSUNFX0lEX0lCTV9HRU1TVE9ORSwKKwkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF81NzAzLAorCSAgICAgIDAsIDAsIChrZXJuZWxfdWxvbmdfdCkmaXByX2NoaXBfY2ZnWzBdIH0sCisJeyBQQ0lfVkVORE9SX0lEX01ZTEVYLCBQQ0lfREVWSUNFX0lEX0lCTV9HRU1TVE9ORSwKKwkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF81NzNELAorCSAgICAgIDAsIDAsIChrZXJuZWxfdWxvbmdfdCkmaXByX2NoaXBfY2ZnWzBdIH0sCisJeyBQQ0lfVkVORE9SX0lEX01ZTEVYLCBQQ0lfREVWSUNFX0lEX0lCTV9HRU1TVE9ORSwKKwkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF81NzNFLAorCSAgICAgIDAsIDAsIChrZXJuZWxfdWxvbmdfdCkmaXByX2NoaXBfY2ZnWzBdIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fQ0lUUklORSwKKwkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF81NzFCLAorCSAgICAgIDAsIDAsIChrZXJuZWxfdWxvbmdfdCkmaXByX2NoaXBfY2ZnWzBdIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fQ0lUUklORSwKKwkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF81NzJFLAorCSAgICAgIDAsIDAsIChrZXJuZWxfdWxvbmdfdCkmaXByX2NoaXBfY2ZnWzBdIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fQ0lUUklORSwKKwkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF81NzFBLAorCSAgICAgIDAsIDAsIChrZXJuZWxfdWxvbmdfdCkmaXByX2NoaXBfY2ZnWzBdIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fU05JUEUsCisJCVBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfMjc4MCwKKwkJMCwgMCwgKGtlcm5lbF91bG9uZ190KSZpcHJfY2hpcF9jZmdbMV0gfSwKKwl7IFBDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfU0NBTVAsCisJCVBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfNTcxRSwKKwkJMCwgMCwgKGtlcm5lbF91bG9uZ190KSZpcHJfY2hpcF9jZmdbMV0gfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaXByX3BjaV90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpcHJfZHJpdmVyID0geworCS5uYW1lID0gSVBSX05BTUUsCisJLmlkX3RhYmxlID0gaXByX3BjaV90YWJsZSwKKwkucHJvYmUgPSBpcHJfcHJvYmUsCisJLnJlbW92ZSA9IGlwcl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLnNodXRkb3duID0gaXByX3NodXRkb3duLAorCX0sCit9OworCisvKioKKyAqIGlwcl9pbml0IC0gTW9kdWxlIGVudHJ5IHBvaW50CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTAgb24gc3VjY2VzcyAvIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUKKyAqKi8KK3N0YXRpYyBpbnQgX19pbml0IGlwcl9pbml0KHZvaWQpCit7CisJaXByX2luZm8oIklCTSBQb3dlciBSQUlEIFNDU0kgRGV2aWNlIERyaXZlciB2ZXJzaW9uOiAlcyAlc1xuIiwKKwkJIElQUl9EUklWRVJfVkVSU0lPTiwgSVBSX0RSSVZFUl9EQVRFKTsKKworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmlwcl9kcml2ZXIpOworfQorCisvKioKKyAqIGlwcl9leGl0IC0gTW9kdWxlIHVubG9hZAorICoKKyAqIE1vZHVsZSB1bmxvYWQgZW50cnkgcG9pbnQuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBpcHJfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaXByX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGlwcl9pbml0KTsKK21vZHVsZV9leGl0KGlwcl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pcHIuaCBiL2RyaXZlcnMvc2NzaS9pcHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDZmNDI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lwci5oCkBAIC0wLDAgKzEsMTI2MSBAQAorLyoKKyAqIGlwci5oIC0tIGRyaXZlciBmb3IgSUJNIFBvd2VyIExpbnV4IFJBSUQgYWRhcHRlcnMKKyAqCisgKiBXcml0dGVuIEJ5OiBCcmlhbiBLaW5nIDxicmtpbmdAdXMuaWJtLmNvbT4sIElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4gLSBSZW1vdmVkIHNldmVyYWwgY2FyZWxlc3MgdTMyL2RtYV9hZGRyX3QgZXJyb3JzCisgKgkJCQl0aGF0IGJyb2tlIDY0Yml0IHBsYXRmb3Jtcy4KKyAqLworCisjaWZuZGVmIF9JUFJfSAorI2RlZmluZSBfSVBSX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKworLyoKKyAqIExpdGVyYWxzCisgKi8KKyNkZWZpbmUgSVBSX0RSSVZFUl9WRVJTSU9OICIyLjAuMTMiCisjZGVmaW5lIElQUl9EUklWRVJfREFURSAiKEZlYnJ1YXJ5IDIxLCAyMDA1KSIKKworLyoKKyAqIElQUl9EQkdfVFJBQ0U6IFNldHRpbmcgdGhpcyB0byAxIHdpbGwgdHVybiBvbiBzb21lIGdlbmVyYWwgZnVuY3Rpb24gdHJhY2luZworICoJCQlyZXN1bHRpbmcgaW4gYSBidW5jaCBvZiBleHRyYSBkZWJ1Z2dpbmcgcHJpbnRrcyB0byB0aGUgY29uc29sZQorICoKKyAqIElQUl9ERUJVRzoJU2V0dGluZyB0aGlzIHRvIDEgd2lsbCB0dXJuIG9uIHNvbWUgZXJyb3IgcGF0aCB0cmFjaW5nLgorICoJCQlFbmFibGVzIHRoZSBpcHJfdHJhY2UgbWFjcm8uCisgKi8KKyNpZmRlZiBJUFJfREVCVUdfQUxMCisjZGVmaW5lIElQUl9ERUJVRwkJCQkxCisjZGVmaW5lIElQUl9EQkdfVFJBQ0UJCQkxCisjZWxzZQorI2RlZmluZSBJUFJfREVCVUcJCQkJMAorI2RlZmluZSBJUFJfREJHX1RSQUNFCQkJMAorI2VuZGlmCisKKy8qCisgKiBJUFJfTUFYX0NNRF9QRVJfTFVOOiBUaGlzIGRlZmluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG91dHN0YW5kaW5nCisgKglvcHMgcGVyIGRldmljZSBmb3IgZGV2aWNlcyBub3QgcnVubmluZyB0YWdnZWQgY29tbWFuZCBxdWV1aW5nLgorICoJVGhpcyBjYW4gYmUgYWRqdXN0ZWQgYXQgcnVudGltZSB0aHJvdWdoIHN5c2ZzIGRldmljZSBhdHRyaWJ1dGVzLgorICovCisjZGVmaW5lIElQUl9NQVhfQ01EX1BFUl9MVU4JCQkJNgorCisvKgorICogSVBSX05VTV9CQVNFX0NNRF9CTEtTOiBUaGlzIGRlZmluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mCisgKglvcHMgdGhlIG1pZC1sYXllciBjYW4gc2VuZCB0byB0aGUgYWRhcHRlci4KKyAqLworI2RlZmluZSBJUFJfTlVNX0JBU0VfQ01EX0JMS1MJCQkJMTAwCisKKyNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzI3ODAJMHgwMjY0CisjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81NzAyCTB4MDI2NgorI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTcwMwkweDAyNzgKKyNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3MkUgIDB4MDI4RAorI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTczRSAgMHgwMkQzCisjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81NzNEICAweDAyRDQKKyNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3MUEJMHgwMkMwCisjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81NzFCCTB4MDJCRQorI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTcxRSAgMHgwMkJGCisKKyNkZWZpbmUgSVBSX05BTUUJCQkJImlwciIKKworLyoKKyAqIFJldHVybiBjb2RlcworICovCisjZGVmaW5lIElQUl9SQ19KT0JfQ09OVElOVUUJCTEKKyNkZWZpbmUgSVBSX1JDX0pPQl9SRVRVUk4JCTIKKworLyoKKyAqIElPQVNDcworICovCisjZGVmaW5lIElQUl9JT0FTQ19OUl9JTklUX0NNRF9SRVFVSVJFRAkJMHgwMjA0MDIwMAorI2RlZmluZSBJUFJfSU9BU0NfU1lOQ19SRVFVSVJFRAkJCTB4MDIzZjAwMDAKKyNkZWZpbmUgSVBSX0lPQVNDX01FRF9ET19OT1RfUkVBTExPQwkJMHgwMzExMEMwMAorI2RlZmluZSBJUFJfSU9BU0NfSFdfU0VMX1RJTUVPVVQJCQkweDA0MDUwMDAwCisjZGVmaW5lIElQUl9JT0FTQ19IV19ERVZfQlVTX1NUQVRVUwkJCTB4MDQ0NDg1MDAKKyNkZWZpbmUJSVBSX0lPQVNDX0lPQVNDX01BU0sJCQkweEZGRkZGRjAwCisjZGVmaW5lCUlQUl9JT0FTQ19TQ1NJX1NUQVRVU19NQVNLCQkweDAwMDAwMEZGCisjZGVmaW5lIElQUl9JT0FTQ19JUl9SRVNPVVJDRV9IQU5ETEUJCTB4MDUyNTAwMDAKKyNkZWZpbmUgSVBSX0lPQVNDX0JVU19XQVNfUkVTRVQJCQkweDA2MjkwMDAwCisjZGVmaW5lIElQUl9JT0FTQ19CVVNfV0FTX1JFU0VUX0JZX09USEVSCQkweDA2Mjk4MDAwCisjZGVmaW5lIElQUl9JT0FTQ19BQk9SVEVEX0NNRF9URVJNX0JZX0hPU1QJMHgwQjVBMDAwMAorCisjZGVmaW5lIElQUl9GSVJTVF9EUklWRVJfSU9BU0MJCQkweDEwMDAwMDAwCisjZGVmaW5lIElQUl9JT0FTQ19JT0FfV0FTX1JFU0VUCQkJMHgxMDAwMDAwMQorI2RlZmluZSBJUFJfSU9BU0NfUENJX0FDQ0VTU19FUlJPUgkJCTB4MTAwMDAwMDIKKworI2RlZmluZSBJUFJfTlVNX0xPR19IQ0FNUwkJCQkyCisjZGVmaW5lIElQUl9OVU1fQ0ZHX0NIR19IQ0FNUwkJCQkyCisjZGVmaW5lIElQUl9OVU1fSENBTVMJKElQUl9OVU1fTE9HX0hDQU1TICsgSVBSX05VTV9DRkdfQ0hHX0hDQU1TKQorI2RlZmluZSBJUFJfTUFYX05VTV9UQVJHRVRTX1BFUl9CVVMJCQkweDEwCisjZGVmaW5lIElQUl9NQVhfTlVNX0xVTlNfUEVSX1RBUkdFVAkJCTI1NgorI2RlZmluZSBJUFJfTUFYX05VTV9WU0VUX0xVTlNfUEVSX1RBUkdFVAk4CisjZGVmaW5lIElQUl9WU0VUX0JVUwkJCQkJMHhmZgorI2RlZmluZSBJUFJfSU9BX0JVUwkJCQkJCTB4ZmYKKyNkZWZpbmUgSVBSX0lPQV9UQVJHRVQJCQkJCTB4ZmYKKyNkZWZpbmUgSVBSX0lPQV9MVU4JCQkJCQkweGZmCisjZGVmaW5lIElQUl9NQVhfTlVNX0JVU0VTCQkJCTQKKyNkZWZpbmUgSVBSX01BWF9CVVNfVE9fU0NBTgkJCQlJUFJfTUFYX05VTV9CVVNFUworCisjZGVmaW5lIElQUl9OVU1fUkVTRVRfUkVMT0FEX1JFVFJJRVMJCTMKKworLyogV2UgbmVlZCByZXNvdXJjZXMgZm9yIEhDQU1TLCBJT0EgcmVzZXQsIElPQSBicmluZ2Rvd24sIGFuZCBFUlAgKi8KKyNkZWZpbmUgSVBSX05VTV9JTlRFUk5BTF9DTURfQkxLUwkoSVBSX05VTV9IQ0FNUyArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElQUl9OVU1fUkVTRVRfUkVMT0FEX1JFVFJJRVMgKyAxKSAqIDIpICsgMykKKworI2RlZmluZSBJUFJfTUFYX0NPTU1BTkRTCQlJUFJfTlVNX0JBU0VfQ01EX0JMS1MKKyNkZWZpbmUgSVBSX05VTV9DTURfQkxLUwkJKElQUl9OVU1fQkFTRV9DTURfQkxLUyArIFwKKwkJCQkJCUlQUl9OVU1fSU5URVJOQUxfQ01EX0JMS1MpCisKKyNkZWZpbmUgSVBSX01BWF9QSFlTSUNBTF9ERVZTCQkJCTE5MgorCisjZGVmaW5lIElQUl9NQVhfU0dMSVNUCQkJCQk2NAorI2RlZmluZSBJUFJfSU9BX01BWF9TRUNUT1JTCQkJCTMyNzY3CisjZGVmaW5lIElQUl9WU0VUX01BWF9TRUNUT1JTCQkJCTUxMgorI2RlZmluZSBJUFJfTUFYX0NEQl9MRU4JCQkJCTE2CisKKyNkZWZpbmUgSVBSX0RFRkFVTFRfQlVTX1dJRFRICQkJCTE2CisjZGVmaW5lIElQUl84ME1Cc19TQ1NJX1JBVEUJCSgoODAgKiAxMCkgLyAoSVBSX0RFRkFVTFRfQlVTX1dJRFRIIC8gOCkpCisjZGVmaW5lIElQUl9VMTYwX1NDU0lfUkFURQkoKDE2MCAqIDEwKSAvIChJUFJfREVGQVVMVF9CVVNfV0lEVEggLyA4KSkKKyNkZWZpbmUgSVBSX1UzMjBfU0NTSV9SQVRFCSgoMzIwICogMTApIC8gKElQUl9ERUZBVUxUX0JVU19XSURUSCAvIDgpKQorI2RlZmluZSBJUFJfTUFYX1NDU0lfUkFURSh3aWR0aCkgKCgzMjAgKiAxMCkgLyAoKHdpZHRoKSAvIDgpKQorCisjZGVmaW5lIElQUl9JT0FfUkVTX0hBTkRMRQkJCQkweGZmZmZmZmZmCisjZGVmaW5lIElQUl9JT0FfUkVTX0FERFIJCQkJMHgwMGZmZmZmZgorCisvKgorICogQWRhcHRlciBDb21tYW5kcworICovCisjZGVmaW5lIElQUl9RVUVSWV9SU1JDX1NUQVRFCQkJCTB4QzIKKyNkZWZpbmUgSVBSX1JFU0VUX0RFVklDRQkJCQkweEMzCisjZGVmaW5lCUlQUl9SRVNFVF9UWVBFX1NFTEVDVAkJCQkweDgwCisjZGVmaW5lCUlQUl9MVU5fUkVTRVQJCQkJCTB4NDAKKyNkZWZpbmUJSVBSX1RBUkdFVF9SRVNFVAkJCQkJMHgyMAorI2RlZmluZQlJUFJfQlVTX1JFU0VUCQkJCQkweDEwCisjZGVmaW5lIElQUl9JRF9IT1NUX1JSX1EJCQkJMHhDNAorI2RlZmluZSBJUFJfUVVFUllfSU9BX0NPTkZJRwkJCQkweEM1CisjZGVmaW5lIElQUl9DQU5DRUxfQUxMX1JFUVVFU1RTCQkJMHhDRQorI2RlZmluZSBJUFJfSE9TVF9DT05UUk9MTEVEX0FTWU5DCQkJMHhDRgorI2RlZmluZQlJUFJfSENBTV9DREJfT1BfQ09ERV9DT05GSUdfQ0hBTkdFCTB4MDEKKyNkZWZpbmUJSVBSX0hDQU1fQ0RCX09QX0NPREVfTE9HX0RBVEEJCTB4MDIKKyNkZWZpbmUgSVBSX1NFVF9TVVBQT1JURURfREVWSUNFUwkJCTB4RkIKKyNkZWZpbmUgSVBSX0lPQV9TSFVURE9XTgkJCQkweEY3CisjZGVmaW5lCUlQUl9XUl9CVUZfRE9XTkxPQURfQU5EX1NBVkUJCQkweDA1CisKKy8qCisgKiBUaW1lb3V0cworICovCisjZGVmaW5lIElQUl9TSFVURE9XTl9USU1FT1VUCQkJKGlwcl9mYXN0ZmFpbCA/IDYwICogSFogOiAxMCAqIDYwICogSFopCisjZGVmaW5lIElQUl9WU0VUX1JXX1RJTUVPVVQJCQkoaXByX2Zhc3RmYWlsID8gMzAgKiBIWiA6IDIgKiA2MCAqIEhaKQorI2RlZmluZSBJUFJfQUJCUkVWX1NIVVRET1dOX1RJTUVPVVQJCSgxMCAqIEhaKQorI2RlZmluZSBJUFJfREVWSUNFX1JFU0VUX1RJTUVPVVQJCShpcHJfZmFzdGZhaWwgPyAxMCAqIEhaIDogMzAgKiBIWikKKyNkZWZpbmUgSVBSX0NBTkNFTF9BTExfVElNRU9VVAkJKGlwcl9mYXN0ZmFpbCA/IDEwICogSFogOiAzMCAqIEhaKQorI2RlZmluZSBJUFJfQUJPUlRfVEFTS19USU1FT1VUCQkoaXByX2Zhc3RmYWlsID8gMTAgKiBIWiA6IDMwICogSFopCisjZGVmaW5lIElQUl9JTlRFUk5BTF9USU1FT1VUCQkJKGlwcl9mYXN0ZmFpbCA/IDEwICogSFogOiAzMCAqIEhaKQorI2RlZmluZSBJUFJfV1JJVEVfQlVGRkVSX1RJTUVPVVQJCSgxMCAqIDYwICogSFopCisjZGVmaW5lIElQUl9TRVRfU1VQX0RFVklDRV9USU1FT1VUCQkoMiAqIDYwICogSFopCisjZGVmaW5lIElQUl9SRVFVRVNUX1NFTlNFX1RJTUVPVVQJCSgxMCAqIEhaKQorI2RlZmluZSBJUFJfT1BFUkFUSU9OQUxfVElNRU9VVAkJKDUgKiA2MCkKKyNkZWZpbmUgSVBSX1dBSVRfRk9SX1JFU0VUX1RJTUVPVVQJCSgyICogSFopCisjZGVmaW5lIElQUl9DSEVDS19GT1JfUkVTRVRfVElNRU9VVAkJKEhaIC8gMTApCisjZGVmaW5lIElQUl9XQUlUX0ZPUl9CSVNUX1RJTUVPVVQJCSgyICogSFopCisjZGVmaW5lIElQUl9EVU1QX1RJTUVPVVQJCQkoMTUgKiBIWikKKworLyoKKyAqIFNDU0kgTGl0ZXJhbHMKKyAqLworI2RlZmluZSBJUFJfVkVORE9SX0lEX0xFTgkJCTgKKyNkZWZpbmUgSVBSX1BST0RfSURfTEVOCQkJCTE2CisjZGVmaW5lIElQUl9TRVJJQUxfTlVNX0xFTgkJCTgKKworLyoKKyAqIEhhcmR3YXJlIGxpdGVyYWxzCisgKi8KKyNkZWZpbmUgSVBSX0ZNVDJfTUJYX0FERFJfTUFTSwkJCQkweDBmZmZmZmZmCisjZGVmaW5lIElQUl9GTVQyX01CWF9CQVJfU0VMX01BU0sJCQkweGYwMDAwMDAwCisjZGVmaW5lIElQUl9GTVQyX01LUl9CQVJfU0VMX1NISUZUCQkJMjgKKyNkZWZpbmUgSVBSX0dFVF9GTVQyX0JBUl9TRUwobWJ4KSBcCisoKChtYngpICYgSVBSX0ZNVDJfTUJYX0JBUl9TRUxfTUFTSykgPj4gSVBSX0ZNVDJfTUtSX0JBUl9TRUxfU0hJRlQpCisjZGVmaW5lIElQUl9TRFRfRk1UMl9CQVIwX1NFTAkJCQkweDAKKyNkZWZpbmUgSVBSX1NEVF9GTVQyX0JBUjFfU0VMCQkJCTB4MQorI2RlZmluZSBJUFJfU0RUX0ZNVDJfQkFSMl9TRUwJCQkJMHgyCisjZGVmaW5lIElQUl9TRFRfRk1UMl9CQVIzX1NFTAkJCQkweDMKKyNkZWZpbmUgSVBSX1NEVF9GTVQyX0JBUjRfU0VMCQkJCTB4NAorI2RlZmluZSBJUFJfU0RUX0ZNVDJfQkFSNV9TRUwJCQkJMHg1CisjZGVmaW5lIElQUl9TRFRfRk1UMl9FWFBfUk9NX1NFTAkJCTB4OAorI2RlZmluZSBJUFJfRk1UMl9TRFRfUkVBRFlfVE9fVVNFCQkJMHhDNEQ0RTNGMgorI2RlZmluZSBJUFJfRE9PUkJFTEwJCQkJCTB4ODI4MDAwMDAKKworI2RlZmluZSBJUFJfUENJSV9JT0FfVFJBTlNfVE9fT1BFUgkJCSgweDgwMDAwMDAwID4+IDApCisjZGVmaW5lIElQUl9QQ0lJX0lPQVJDQl9YRkVSX0ZBSUxFRAkJCSgweDgwMDAwMDAwID4+IDMpCisjZGVmaW5lIElQUl9QQ0lJX0lPQV9VTklUX0NIRUNLRUQJCQkoMHg4MDAwMDAwMCA+PiA0KQorI2RlZmluZSBJUFJfUENJSV9OT19IT1NUX1JSUQkJCQkoMHg4MDAwMDAwMCA+PiA1KQorI2RlZmluZSBJUFJfUENJSV9DUklUSUNBTF9PUEVSQVRJT04JCQkoMHg4MDAwMDAwMCA+PiA2KQorI2RlZmluZSBJUFJfUENJSV9JT19ERUJVR19BQ0tOT1dMRURHRQkJKDB4ODAwMDAwMDAgPj4gNykKKyNkZWZpbmUgSVBSX1BDSUlfSU9BUlJJTl9MT1NUCQkJCSgweDgwMDAwMDAwID4+IDI3KQorI2RlZmluZSBJUFJfUENJSV9NTUlPX0VSUk9SCQkJCSgweDgwMDAwMDAwID4+IDI4KQorI2RlZmluZSBJUFJfUENJSV9QUk9DX0VSUl9TVEFURQkJCSgweDgwMDAwMDAwID4+IDI5KQorI2RlZmluZSBJUFJfUENJSV9IUlJRX1VQREFURUQJCQkJKDB4ODAwMDAwMDAgPj4gMzApCisjZGVmaW5lIElQUl9QQ0lJX0NPUkVfSVNTVUVEX1JTVF9SRVEJCSgweDgwMDAwMDAwID4+IDMxKQorCisjZGVmaW5lIElQUl9QQ0lJX0VSUk9SX0lOVEVSUlVQVFMgXAorKElQUl9QQ0lJX0lPQVJDQl9YRkVSX0ZBSUxFRCB8IElQUl9QQ0lJX0lPQV9VTklUX0NIRUNLRUQgfCBcCitJUFJfUENJSV9OT19IT1NUX1JSUSB8IElQUl9QQ0lJX0lPQVJSSU5fTE9TVCB8IElQUl9QQ0lJX01NSU9fRVJST1IpCisKKyNkZWZpbmUgSVBSX1BDSUlfT1BFUl9JTlRFUlJVUFRTIFwKKyhJUFJfUENJSV9FUlJPUl9JTlRFUlJVUFRTIHwgSVBSX1BDSUlfSFJSUV9VUERBVEVEIHwgSVBSX1BDSUlfSU9BX1RSQU5TX1RPX09QRVIpCisKKyNkZWZpbmUgSVBSX1VQUk9DSV9SRVNFVF9BTEVSVAkJCSgweDgwMDAwMDAwID4+IDcpCisjZGVmaW5lIElQUl9VUFJPQ0lfSU9fREVCVUdfQUxFUlQJCQkoMHg4MDAwMDAwMCA+PiA5KQorCisjZGVmaW5lIElQUl9MRFVNUF9NQVhfTE9OR19BQ0tfREVMQVlfSU5fVVNFQwkJMjAwMDAwCS8qIDIwMCBtcyAqLworI2RlZmluZSBJUFJfTERVTVBfTUFYX1NIT1JUX0FDS19ERUxBWV9JTl9VU0VDCQkyMDAwMDAJLyogMjAwIG1zICovCisKKy8qCisgKiBEdW1wIGxpdGVyYWxzCisgKi8KKyNkZWZpbmUgSVBSX01BWF9JT0FfRFVNUF9TSVpFCQkJCSg0ICogMTAyNCAqIDEwMjQpCisjZGVmaW5lIElQUl9OVU1fU0RUX0VOVFJJRVMJCQkJNTExCisjZGVmaW5lIElQUl9NQVhfTlVNX0RVTVBfUEFHRVMJKChJUFJfTUFYX0lPQV9EVU1QX1NJWkUgLyBQQUdFX1NJWkUpICsgMSkKKworLyoKKyAqIE1pc2MgbGl0ZXJhbHMKKyAqLworI2RlZmluZSBJUFJfTlVNX0lPQURMX0VOVFJJRVMJCQlJUFJfTUFYX1NHTElTVAorCisvKgorICogQWRhcHRlciBpbnRlcmZhY2UgdHlwZXMKKyAqLworCitzdHJ1Y3QgaXByX3Jlc19hZGRyIHsKKwl1OCByZXNlcnZlZDsKKwl1OCBidXM7CisJdTggdGFyZ2V0OworCXU4IGx1bjsKKyNkZWZpbmUgSVBSX0dFVF9QSFlTX0xPQyhyZXNfYWRkcikgXAorCSgoKHJlc19hZGRyKS5idXMgPDwgMTYpIHwgKChyZXNfYWRkcikudGFyZ2V0IDw8IDgpIHwgKHJlc19hZGRyKS5sdW4pCit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX3N0ZF9pbnFfdnBpZHMgeworCXU4IHZlbmRvcl9pZFtJUFJfVkVORE9SX0lEX0xFTl07CisJdTggcHJvZHVjdF9pZFtJUFJfUFJPRF9JRF9MRU5dOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaXByX3N0ZF9pbnFfZGF0YSB7CisJdTggcGVyaV9xdWFsX2Rldl90eXBlOworI2RlZmluZSBJUFJfU1REX0lOUV9QRVJJX1FVQUwocGVyaSkgKChwZXJpKSA+PiA1KQorI2RlZmluZSBJUFJfU1REX0lOUV9QRVJJX0RFVl9UWVBFKHBlcmkpICgocGVyaSkgJiAweDFGKQorCisJdTggcmVtb3ZlYWJsZV9tZWRpdW1fcnN2ZDsKKyNkZWZpbmUgSVBSX1NURF9JTlFfUkVNT1ZFQUJMRV9NRURJVU0gMHg4MAorCisjZGVmaW5lIElQUl9JU19EQVNEX0RFVklDRShzdGRfaW5xKSBcCisoKElQUl9TVERfSU5RX1BFUklfREVWX1RZUEUoKHN0ZF9pbnEpLnBlcmlfcXVhbF9kZXZfdHlwZSkgPT0gVFlQRV9ESVNLKSAmJiBcCishKCgoc3RkX2lucSkucmVtb3ZlYWJsZV9tZWRpdW1fcnN2ZCkgJiBJUFJfU1REX0lOUV9SRU1PVkVBQkxFX01FRElVTSkpCisKKyNkZWZpbmUgSVBSX0lTX1NFU19ERVZJQ0Uoc3RkX2lucSkgXAorKElQUl9TVERfSU5RX1BFUklfREVWX1RZUEUoKHN0ZF9pbnEpLnBlcmlfcXVhbF9kZXZfdHlwZSkgPT0gVFlQRV9FTkNMT1NVUkUpCisKKwl1OCB2ZXJzaW9uOworCXU4IGFlbl9uYWNhX2ZtdDsKKwl1OCBhZGRpdGlvbmFsX2xlbjsKKwl1OCBzY2NzX3JzdmQ7CisJdTggYnFfZW5jX211bHRpOworCXU4IHN5bmNfY21kcV9mbGFnczsKKworCXN0cnVjdCBpcHJfc3RkX2lucV92cGlkcyB2cGlkczsKKworCXU4IHJvc19yc3ZkX3JhbV9yc3ZkWzRdOworCisJdTggc2VyaWFsX251bVtJUFJfU0VSSUFMX05VTV9MRU5dOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGlwcl9jb25maWdfdGFibGVfZW50cnkgeworCXU4IHNlcnZpY2VfbGV2ZWw7CisJdTggYXJyYXlfaWQ7CisJdTggZmxhZ3M7CisjZGVmaW5lIElQUl9JU19JT0FfUkVTT1VSQ0UJMHg4MAorI2RlZmluZSBJUFJfSVNfQVJSQVlfTUVNQkVSIDB4MjAKKyNkZWZpbmUgSVBSX0lTX0hPVF9TUEFSRQkweDEwCisKKwl1OCByc3ZkX3N1YnR5cGU7CisjZGVmaW5lIElQUl9SRVNfU1VCVFlQRShyZXMpICgoKHJlcyktPmNmZ3RlLnJzdmRfc3VidHlwZSkgJiAweDBmKQorI2RlZmluZSBJUFJfU1VCVFlQRV9BRl9EQVNECQkJMAorI2RlZmluZSBJUFJfU1VCVFlQRV9HRU5FUklDX1NDU0kJMQorI2RlZmluZSBJUFJfU1VCVFlQRV9WT0xVTUVfU0VUCQkyCisKKwlzdHJ1Y3QgaXByX3Jlc19hZGRyIHJlc19hZGRyOworCV9fYmUzMiByZXNfaGFuZGxlOworCV9fYmUzMiByZXNlcnZlZDRbMl07CisJc3RydWN0IGlwcl9zdGRfaW5xX2RhdGEgc3RkX2lucV9kYXRhOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKK3N0cnVjdCBpcHJfY29uZmlnX3RhYmxlX2hkciB7CisJdTggbnVtX2VudHJpZXM7CisJdTggZmxhZ3M7CisjZGVmaW5lIElQUl9VQ09ERV9ET1dOTE9BRF9SRVEJMHgxMAorCV9fYmUxNiByZXNlcnZlZDsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKK3N0cnVjdCBpcHJfY29uZmlnX3RhYmxlIHsKKwlzdHJ1Y3QgaXByX2NvbmZpZ190YWJsZV9oZHIgaGRyOworCXN0cnVjdCBpcHJfY29uZmlnX3RhYmxlX2VudHJ5IGRldltJUFJfTUFYX1BIWVNJQ0FMX0RFVlNdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9ob3N0cmNiX2NmZ19jaF9ub3QgeworCXN0cnVjdCBpcHJfY29uZmlnX3RhYmxlX2VudHJ5IGNmZ3RlOworCXU4IHJlc2VydmVkWzkzNl07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX3N1cHBvcnRlZF9kZXZpY2UgeworCV9fYmUxNiBkYXRhX2xlbmd0aDsKKwl1OCByZXNlcnZlZDsKKwl1OCBudW1fcmVjb3JkczsKKwlzdHJ1Y3QgaXByX3N0ZF9pbnFfdnBpZHMgdnBpZHM7CisJdTggcmVzZXJ2ZWQyWzE2XTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKKy8qIENvbW1hbmQgcGFja2V0IHN0cnVjdHVyZSAqLworc3RydWN0IGlwcl9jbWRfcGt0IHsKKwlfX2JlMTYgcmVzZXJ2ZWQ7CQkvKiBSZXNlcnZlZCBieSBJT0EgKi8KKwl1OCByZXF1ZXN0X3R5cGU7CisjZGVmaW5lIElQUl9SUVRZUEVfU0NTSUNEQgkJMHgwMAorI2RlZmluZSBJUFJfUlFUWVBFX0lPQUNNRAkJMHgwMQorI2RlZmluZSBJUFJfUlFUWVBFX0hDQU0JCQkweDAyCisKKwl1OCBsdW50YXJfbHVudHJuOworCisJdTggZmxhZ3NfaGk7CisjZGVmaW5lIElQUl9GTEFHU19ISV9XUklURV9OT1RfUkVBRAkJMHg4MAorI2RlZmluZSBJUFJfRkxBR1NfSElfTk9fVUxFTl9DSEsJCTB4MjAKKyNkZWZpbmUgSVBSX0ZMQUdTX0hJX1NZTkNfT1ZFUlJJREUJCTB4MTAKKyNkZWZpbmUgSVBSX0ZMQUdTX0hJX1NZTkNfQ09NUExFVEUJCTB4MDgKKyNkZWZpbmUgSVBSX0ZMQUdTX0hJX05PX0xJTktfREVTQwkJMHgwNAorCisJdTggZmxhZ3NfbG87CisjZGVmaW5lIElQUl9GTEFHU19MT19BTElHTkVEX0JGUgkJMHgyMAorI2RlZmluZSBJUFJfRkxBR1NfTE9fREVMQVlfQUZURVJfUlNUCTB4MTAKKyNkZWZpbmUgSVBSX0ZMQUdTX0xPX1VOVEFHR0VEX1RBU0sJCTB4MDAKKyNkZWZpbmUgSVBSX0ZMQUdTX0xPX1NJTVBMRV9UQVNLCQkweDAyCisjZGVmaW5lIElQUl9GTEFHU19MT19PUkRFUkVEX1RBU0sJCTB4MDQKKyNkZWZpbmUgSVBSX0ZMQUdTX0xPX0hFQURfT0ZfUV9UQVNLCQkweDA2CisjZGVmaW5lIElQUl9GTEFHU19MT19BQ0FfVEFTSwkJCTB4MDgKKworCXU4IGNkYlsxNl07CisJX19iZTE2IHRpbWVvdXQ7Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCwgYWxpZ25lZCg0KSkpOworCisvKiBJT0EgUmVxdWVzdCBDb250cm9sIEJsb2NrICAgIDEyOCBieXRlcyAgKi8KK3N0cnVjdCBpcHJfaW9hcmNiIHsKKwlfX2JlMzIgaW9hcmNiX2hvc3RfcGNpX2FkZHI7CisJX19iZTMyIHJlc2VydmVkOworCV9fYmUzMiByZXNfaGFuZGxlOworCV9fYmUzMiBob3N0X3Jlc3BvbnNlX2hhbmRsZTsKKwlfX2JlMzIgcmVzZXJ2ZWQxOworCV9fYmUzMiByZXNlcnZlZDI7CisJX19iZTMyIHJlc2VydmVkMzsKKworCV9fYmUzMiB3cml0ZV9kYXRhX3RyYW5zZmVyX2xlbmd0aDsKKwlfX2JlMzIgcmVhZF9kYXRhX3RyYW5zZmVyX2xlbmd0aDsKKwlfX2JlMzIgd3JpdGVfaW9hZGxfYWRkcjsKKwlfX2JlMzIgd3JpdGVfaW9hZGxfbGVuOworCV9fYmUzMiByZWFkX2lvYWRsX2FkZHI7CisJX19iZTMyIHJlYWRfaW9hZGxfbGVuOworCisJX19iZTMyIGlvYXNhX2hvc3RfcGNpX2FkZHI7CisJX19iZTE2IGlvYXNhX2xlbjsKKwlfX2JlMTYgcmVzZXJ2ZWQ0OworCisJc3RydWN0IGlwcl9jbWRfcGt0IGNtZF9wa3Q7CisKKwlfX2JlMzIgYWRkX2NtZF9wYXJtc19sZW47CisJX19iZTMyIGFkZF9jbWRfcGFybXNbMTBdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9pb2FkbF9kZXNjIHsKKwlfX2JlMzIgZmxhZ3NfYW5kX2RhdGFfbGVuOworI2RlZmluZSBJUFJfSU9BRExfRkxBR1NfTUFTSwkJMHhmZjAwMDAwMAorI2RlZmluZSBJUFJfSU9BRExfR0VUX0ZMQUdTKHgpIChiZTMyX3RvX2NwdSh4KSAmIElQUl9JT0FETF9GTEFHU19NQVNLKQorI2RlZmluZSBJUFJfSU9BRExfREFUQV9MRU5fTUFTSwkJMHgwMGZmZmZmZgorI2RlZmluZSBJUFJfSU9BRExfR0VUX0RBVEFfTEVOKHgpIChiZTMyX3RvX2NwdSh4KSAmIElQUl9JT0FETF9EQVRBX0xFTl9NQVNLKQorI2RlZmluZSBJUFJfSU9BRExfRkxBR1NfUkVBRAkJMHg0ODAwMDAwMAorI2RlZmluZSBJUFJfSU9BRExfRkxBR1NfUkVBRF9MQVNUCTB4NDkwMDAwMDAKKyNkZWZpbmUgSVBSX0lPQURMX0ZMQUdTX1dSSVRFCQkweDY4MDAwMDAwCisjZGVmaW5lIElQUl9JT0FETF9GTEFHU19XUklURV9MQVNUCTB4NjkwMDAwMDAKKyNkZWZpbmUgSVBSX0lPQURMX0ZMQUdTX0xBU1QJCTB4MDEwMDAwMDAKKworCV9fYmUzMiBhZGRyZXNzOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoOCkpKTsKKworc3RydWN0IGlwcl9pb2FzYV92c2V0IHsKKwlfX2JlMzIgZmFpbGluZ19sYmFfaGk7CisJX19iZTMyIGZhaWxpbmdfbGJhX2xvOworCV9fYmUzMiBpb2FfZGF0YVsyMl07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX2lvYXNhX2FmX2Rhc2QgeworCV9fYmUzMiBmYWlsaW5nX2xiYTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKK3N0cnVjdCBpcHJfaW9hc2FfZ3BkZCB7CisJdTggZW5kX3N0YXRlOworCXU4IGJ1c19waGFzZTsKKwlfX2JlMTYgcmVzZXJ2ZWQ7CisJX19iZTMyIGlvYV9kYXRhWzIzXTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKK3N0cnVjdCBpcHJfaW9hc2FfcmF3IHsKKwlfX2JlMzIgaW9hX2RhdGFbMjRdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9pb2FzYSB7CisJX19iZTMyIGlvYXNjOworI2RlZmluZSBJUFJfSU9BU0NfU0VOU0VfS0VZKGlvYXNjKSAoKGlvYXNjKSA+PiAyNCkKKyNkZWZpbmUgSVBSX0lPQVNDX1NFTlNFX0NPREUoaW9hc2MpICgoKGlvYXNjKSAmIDB4MDBmZjAwMDApID4+IDE2KQorI2RlZmluZSBJUFJfSU9BU0NfU0VOU0VfUVVBTChpb2FzYykgKCgoaW9hc2MpICYgMHgwMDAwZmYwMCkgPj4gOCkKKyNkZWZpbmUgSVBSX0lPQVNDX1NFTlNFX1NUQVRVUyhpb2FzYykgKChpb2FzYykgJiAweDAwMDAwMGZmKQorCisJX19iZTE2IHJldF9zdGF0X2xlbjsJLyogTGVuZ3RoIG9mIHRoZSByZXR1cm5lZCBJT0FTQSAqLworCisJX19iZTE2IGF2YWlsX3N0YXRfbGVuOwkvKiBUb3RhbCBMZW5ndGggb2Ygc3RhdHVzIGF2YWlsYWJsZS4gKi8KKworCV9fYmUzMiByZXNpZHVhbF9kYXRhX2xlbjsJLyogbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBob3N0IGRhdGEgKi8KKwkvKiBidWZmZXJzIHRoYXQgd2VyZSBub3QgdXNlZCBieSB0aGUgSU9BUkNCIGNvbW1hbmQuICovCisKKwlfX2JlMzIgaWxpZDsKKyNkZWZpbmUgSVBSX05PX0lMSUQJCQkwCisjZGVmaW5lIElQUl9EUklWRVJfSUxJRAkJMHhmZmZmZmZmZgorCisJX19iZTMyIGZkX2lvYXNjOworCisJX19iZTMyIGZkX3BoeXNfbG9jYXRvcjsKKworCV9fYmUzMiBmZF9yZXNfaGFuZGxlOworCisJX19iZTMyIGlvYXNjX3NwZWNpZmljOwkvKiBzdGF0dXMgY29kZSBzcGVjaWZpYyBmaWVsZCAqLworI2RlZmluZSBJUFJfSU9BU0NfU1BFQ0lGSUNfTUFTSwkJMHgwMGZmZmZmZgorI2RlZmluZSBJUFJfRklFTERfUE9JTlRFUl9WQUxJRAkJKDB4ODAwMDAwMDAgPj4gOCkKKyNkZWZpbmUgSVBSX0ZJRUxEX1BPSU5URVJfTUFTSwkJMHgwMDAwZmZmZgorCisJdW5pb24geworCQlzdHJ1Y3QgaXByX2lvYXNhX3ZzZXQgdnNldDsKKwkJc3RydWN0IGlwcl9pb2FzYV9hZl9kYXNkIGRhc2Q7CisJCXN0cnVjdCBpcHJfaW9hc2FfZ3BkZCBncGRkOworCQlzdHJ1Y3QgaXByX2lvYXNhX3JhdyByYXc7CisJfSB1OworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9tb2RlX3Bhcm1faGRyIHsKKwl1OCBsZW5ndGg7CisJdTggbWVkaXVtX3R5cGU7CisJdTggZGV2aWNlX3NwZWNfcGFybXM7CisJdTggYmxvY2tfZGVzY19sZW47Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBpcHJfbW9kZV9wYWdlcyB7CisJc3RydWN0IGlwcl9tb2RlX3Bhcm1faGRyIGhkcjsKKwl1OCBkYXRhWzI1NSAtIHNpemVvZihzdHJ1Y3QgaXByX21vZGVfcGFybV9oZHIpXTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGlwcl9tb2RlX3BhZ2VfaGRyIHsKKwl1OCBwc19wYWdlX2NvZGU7CisjZGVmaW5lIElQUl9NT0RFX1BBR0VfUFMJMHg4MAorI2RlZmluZSBJUFJfR0VUX01PREVfUEFHRV9DT0RFKGhkcikgKChoZHIpLT5wc19wYWdlX2NvZGUgJiAweDNGKQorCXU4IHBhZ2VfbGVuZ3RoOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGlwcl9kZXZfYnVzX2VudHJ5IHsKKwlzdHJ1Y3QgaXByX3Jlc19hZGRyIHJlc19hZGRyOworCXU4IGZsYWdzOworI2RlZmluZSBJUFJfU0NTSV9BVFRSX0VOQUJMRV9RQVMJCQkweDgwCisjZGVmaW5lIElQUl9TQ1NJX0FUVFJfRElTQUJMRV9RQVMJCQkweDQwCisjZGVmaW5lIElQUl9TQ1NJX0FUVFJfUUFTX01BU0sJCQkJMHhDMAorI2RlZmluZSBJUFJfU0NTSV9BVFRSX0VOQUJMRV9UTQkJCQkweDIwCisjZGVmaW5lIElQUl9TQ1NJX0FUVFJfTk9fVEVSTV9QV1IJCQkweDEwCisjZGVmaW5lIElQUl9TQ1NJX0FUVFJfVE1fU1VQUE9SVEVECQkJMHgwOAorI2RlZmluZSBJUFJfU0NTSV9BVFRSX0xWRF9UT19TRV9OT1RfQUxMT1dFRAkweDA0CisKKwl1OCBzY3NpX2lkOworCXU4IGJ1c193aWR0aDsKKwl1OCBleHRlbmRlZF9yZXNldF9kZWxheTsKKyNkZWZpbmUgSVBSX0VYVEVOREVEX1JFU0VUX0RFTEFZCTcKKworCV9fYmUzMiBtYXhfeGZlcl9yYXRlOworCisJdTggc3BpbnVwX2RlbGF5OworCXU4IHJlc2VydmVkMzsKKwlfX2JlMTYgcmVzZXJ2ZWQ0OworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9tb2RlX3BhZ2UyOCB7CisJc3RydWN0IGlwcl9tb2RlX3BhZ2VfaGRyIGhkcjsKKwl1OCBudW1fZW50cmllczsKKwl1OCBlbnRyeV9sZW5ndGg7CisJc3RydWN0IGlwcl9kZXZfYnVzX2VudHJ5IGJ1c1swXTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGlwcl9pb2FfdnBkIHsKKwlzdHJ1Y3QgaXByX3N0ZF9pbnFfZGF0YSBzdGRfaW5xX2RhdGE7CisJdTggYXNjaWlfcGFydF9udW1bMTJdOworCXU4IHJlc2VydmVkWzQwXTsKKwl1OCBhc2NpaV9wbGFudF9jb2RlWzRdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaXByX2lucXVpcnlfcGFnZTMgeworCXU4IHBlcmlfcXVhbF9kZXZfdHlwZTsKKwl1OCBwYWdlX2NvZGU7CisJdTggcmVzZXJ2ZWQxOworCXU4IHBhZ2VfbGVuZ3RoOworCXU4IGFzY2lpX2xlbjsKKwl1OCByZXNlcnZlZDJbM107CisJdTggbG9hZF9pZFs0XTsKKwl1OCBtYWpvcl9yZWxlYXNlOworCXU4IGNhcmRfdHlwZTsKKwl1OCBtaW5vcl9yZWxlYXNlWzJdOworCXU4IHB0Zl9udW1iZXJbNF07CisJdTggcGF0Y2hfbnVtYmVyWzRdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaXByX2hvc3RyY2JfZGV2aWNlX2RhdGFfZW50cnkgeworCXN0cnVjdCBpcHJfc3RkX2lucV92cGlkcyBkZXZfdnBpZHM7CisJdTggZGV2X3NuW0lQUl9TRVJJQUxfTlVNX0xFTl07CisJc3RydWN0IGlwcl9yZXNfYWRkciBkZXZfcmVzX2FkZHI7CisJc3RydWN0IGlwcl9zdGRfaW5xX3ZwaWRzIG5ld19kZXZfdnBpZHM7CisJdTggbmV3X2Rldl9zbltJUFJfU0VSSUFMX05VTV9MRU5dOworCXN0cnVjdCBpcHJfc3RkX2lucV92cGlkcyBpb2FfbGFzdF93aXRoX2Rldl92cGlkczsKKwl1OCBpb2FfbGFzdF93aXRoX2Rldl9zbltJUFJfU0VSSUFMX05VTV9MRU5dOworCXN0cnVjdCBpcHJfc3RkX2lucV92cGlkcyBjZmNfbGFzdF93aXRoX2Rldl92cGlkczsKKwl1OCBjZmNfbGFzdF93aXRoX2Rldl9zbltJUFJfU0VSSUFMX05VTV9MRU5dOworCV9fYmUzMiBpb2FfZGF0YVs1XTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKK3N0cnVjdCBpcHJfaG9zdHJjYl9hcnJheV9kYXRhX2VudHJ5IHsKKwlzdHJ1Y3QgaXByX3N0ZF9pbnFfdnBpZHMgdnBpZHM7CisJdTggc2VyaWFsX251bVtJUFJfU0VSSUFMX05VTV9MRU5dOworCXN0cnVjdCBpcHJfcmVzX2FkZHIgZXhwZWN0ZWRfZGV2X3Jlc19hZGRyOworCXN0cnVjdCBpcHJfcmVzX2FkZHIgZGV2X3Jlc19hZGRyOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfZmZfZXJyb3IgeworCV9fYmUzMiBpb2FfZGF0YVsyNDZdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMDFfZXJyb3IgeworCV9fYmUzMiBzZWVrX2NvdW50ZXI7CisJX19iZTMyIHJlYWRfY291bnRlcjsKKwl1OCBzZW5zZV9kYXRhWzMyXTsKKwlfX2JlMzIgaW9hX2RhdGFbMjM2XTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKK3N0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzAyX2Vycm9yIHsKKwlzdHJ1Y3QgaXByX3N0ZF9pbnFfdnBpZHMgaW9hX3ZwaWRzOworCXU4IGlvYV9zbltJUFJfU0VSSUFMX05VTV9MRU5dOworCXN0cnVjdCBpcHJfc3RkX2lucV92cGlkcyBjZmNfdnBpZHM7CisJdTggY2ZjX3NuW0lQUl9TRVJJQUxfTlVNX0xFTl07CisJc3RydWN0IGlwcl9zdGRfaW5xX3ZwaWRzIGlvYV9sYXN0X2F0dGFjaGVkX3RvX2NmY192cGlkczsKKwl1OCBpb2FfbGFzdF9hdHRhY2hlZF90b19jZmNfc25bSVBSX1NFUklBTF9OVU1fTEVOXTsKKwlzdHJ1Y3QgaXByX3N0ZF9pbnFfdnBpZHMgY2ZjX2xhc3RfYXR0YWNoZWRfdG9faW9hX3ZwaWRzOworCXU4IGNmY19sYXN0X2F0dGFjaGVkX3RvX2lvYV9zbltJUFJfU0VSSUFMX05VTV9MRU5dOworCV9fYmUzMiBpb2FfZGF0YVszXTsKKwl1OCByZXNlcnZlZFs4NDRdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMDNfZXJyb3IgeworCXN0cnVjdCBpcHJfc3RkX2lucV92cGlkcyBpb2FfdnBpZHM7CisJdTggaW9hX3NuW0lQUl9TRVJJQUxfTlVNX0xFTl07CisJc3RydWN0IGlwcl9zdGRfaW5xX3ZwaWRzIGNmY192cGlkczsKKwl1OCBjZmNfc25bSVBSX1NFUklBTF9OVU1fTEVOXTsKKwlfX2JlMzIgZXJyb3JzX2RldGVjdGVkOworCV9fYmUzMiBlcnJvcnNfbG9nZ2VkOworCXU4IGlvYV9kYXRhWzEyXTsKKwlzdHJ1Y3QgaXByX2hvc3RyY2JfZGV2aWNlX2RhdGFfZW50cnkgZGV2X2VudHJ5WzNdOworCXU4IHJlc2VydmVkWzQ0NF07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8wNF9lcnJvciB7CisJc3RydWN0IGlwcl9zdGRfaW5xX3ZwaWRzIGlvYV92cGlkczsKKwl1OCBpb2Ffc25bSVBSX1NFUklBTF9OVU1fTEVOXTsKKwlzdHJ1Y3QgaXByX3N0ZF9pbnFfdnBpZHMgY2ZjX3ZwaWRzOworCXU4IGNmY19zbltJUFJfU0VSSUFMX05VTV9MRU5dOworCXU4IGlvYV9kYXRhWzEyXTsKKwlzdHJ1Y3QgaXByX2hvc3RyY2JfYXJyYXlfZGF0YV9lbnRyeSBhcnJheV9tZW1iZXJbMTBdOworCV9fYmUzMiBleHBvc2VkX21vZGVfYWRuOworCV9fYmUzMiBhcnJheV9pZDsKKwlzdHJ1Y3QgaXByX3N0ZF9pbnFfdnBpZHMgaW5jb21wX2Rldl92cGlkczsKKwl1OCBpbmNvbXBfZGV2X3NuW0lQUl9TRVJJQUxfTlVNX0xFTl07CisJX19iZTMyIGlvYV9kYXRhMjsKKwlzdHJ1Y3QgaXByX2hvc3RyY2JfYXJyYXlfZGF0YV9lbnRyeSBhcnJheV9tZW1iZXIyWzhdOworCXN0cnVjdCBpcHJfcmVzX2FkZHIgbGFzdF9mdW5jX3ZzZXRfcmVzX2FkZHI7CisJdTggdnNldF9zZXJpYWxfbnVtW0lQUl9TRVJJQUxfTlVNX0xFTl07CisJdTggcHJvdGVjdGlvbl9sZXZlbFs4XTsKKwl1OCByZXNlcnZlZFsxMjRdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9ob3N0cmNiX2Vycm9yIHsKKwlfX2JlMzIgZmFpbGluZ19kZXZfaW9hc2M7CisJc3RydWN0IGlwcl9yZXNfYWRkciBmYWlsaW5nX2Rldl9yZXNfYWRkcjsKKwlfX2JlMzIgZmFpbGluZ19kZXZfcmVzX2hhbmRsZTsKKwlfX2JlMzIgcHJjOworCXVuaW9uIHsKKwkJc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfZmZfZXJyb3IgdHlwZV9mZl9lcnJvcjsKKwkJc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMDFfZXJyb3IgdHlwZV8wMV9lcnJvcjsKKwkJc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMDJfZXJyb3IgdHlwZV8wMl9lcnJvcjsKKwkJc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMDNfZXJyb3IgdHlwZV8wM19lcnJvcjsKKwkJc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMDRfZXJyb3IgdHlwZV8wNF9lcnJvcjsKKwl9IHU7Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX2hvc3RyY2JfcmF3IHsKKwlfX2JlMzIgZGF0YVtzaXplb2Yoc3RydWN0IGlwcl9ob3N0cmNiX2Vycm9yKS9zaXplb2YoX19iZTMyKV07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX2hjYW0geworCXU4IG9wX2NvZGU7CisjZGVmaW5lIElQUl9IT1NUX1JDQl9PUF9DT0RFX0NPTkZJR19DSEFOR0UJCQkweEUxCisjZGVmaW5lIElQUl9IT1NUX1JDQl9PUF9DT0RFX0xPR19EQVRBCQkJCTB4RTIKKworCXU4IG5vdGlmeV90eXBlOworI2RlZmluZSBJUFJfSE9TVF9SQ0JfTk9USUZfVFlQRV9FWElTVElOR19DSEFOR0VECTB4MDAKKyNkZWZpbmUgSVBSX0hPU1RfUkNCX05PVElGX1RZUEVfTkVXX0VOVFJZCQkJMHgwMQorI2RlZmluZSBJUFJfSE9TVF9SQ0JfTk9USUZfVFlQRV9SRU1fRU5UUlkJCQkweDAyCisjZGVmaW5lIElQUl9IT1NUX1JDQl9OT1RJRl9UWVBFX0VSUk9SX0xPR19FTlRSWQkJMHgxMAorI2RlZmluZSBJUFJfSE9TVF9SQ0JfTk9USUZfVFlQRV9JTkZPUk1BVElPTl9FTlRSWQkweDExCisKKwl1OCBub3RpZmljYXRpb25zX2xvc3Q7CisjZGVmaW5lIElQUl9IT1NUX1JDQl9OT19OT1RJRklDQVRJT05TX0xPU1QJCQkwCisjZGVmaW5lIElQUl9IT1NUX1JDQl9OT1RJRklDQVRJT05TX0xPU1QJCQkJMHg4MAorCisJdTggZmxhZ3M7CisjZGVmaW5lIElQUl9IT1NUUkNCX0lOVEVSTkFMX09QRVIJMHg4MAorI2RlZmluZSBJUFJfSE9TVFJDQl9FUlJfUkVTUF9TRU5UCTB4NDAKKworCXU4IG92ZXJsYXlfaWQ7CisjZGVmaW5lIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzEJCQkJMHgwMQorI2RlZmluZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF8yCQkJCTB4MDIKKyNkZWZpbmUgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfMwkJCQkweDAzCisjZGVmaW5lIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzQJCQkJMHgwNAorI2RlZmluZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF82CQkJCTB4MDYKKyNkZWZpbmUgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfREVGQVVMVAkJCTB4RkYKKworCXU4IHJlc2VydmVkMVszXTsKKwlfX2JlMzIgaWxpZDsKKwlfX2JlMzIgdGltZV9zaW5jZV9sYXN0X2lvYV9yZXNldDsKKwlfX2JlMzIgcmVzZXJ2ZWQyOworCV9fYmUzMiBsZW5ndGg7CisKKwl1bmlvbiB7CisJCXN0cnVjdCBpcHJfaG9zdHJjYl9lcnJvciBlcnJvcjsKKwkJc3RydWN0IGlwcl9ob3N0cmNiX2NmZ19jaF9ub3QgY2NuOworCQlzdHJ1Y3QgaXByX2hvc3RyY2JfcmF3IHJhdzsKKwl9IHU7Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX2hvc3RyY2IgeworCXN0cnVjdCBpcHJfaGNhbSBoY2FtOworCWRtYV9hZGRyX3QgaG9zdHJjYl9kbWE7CisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKK307CisKKy8qIElQUiBzbWFydCBkdW1wIHRhYmxlIHN0cnVjdHVyZXMgKi8KK3N0cnVjdCBpcHJfc2R0X2VudHJ5IHsKKwlfX2JlMzIgYmFyX3N0cl9vZmZzZXQ7CisJX19iZTMyIGVuZF9vZmZzZXQ7CisJdTggZW50cnlfYnl0ZTsKKwl1OCByZXNlcnZlZFszXTsKKworCXU4IGZsYWdzOworI2RlZmluZSBJUFJfU0RUX0VORElBTgkJMHg4MAorI2RlZmluZSBJUFJfU0RUX1ZBTElEX0VOVFJZCTB4MjAKKworCXU4IHJlc3Y7CisJX19iZTE2IHByaW9yaXR5OworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9zZHRfaGVhZGVyIHsKKwlfX2JlMzIgc3RhdGU7CisJX19iZTMyIG51bV9lbnRyaWVzOworCV9fYmUzMiBudW1fZW50cmllc191c2VkOworCV9fYmUzMiBkdW1wX3NpemU7Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX3NkdCB7CisJc3RydWN0IGlwcl9zZHRfaGVhZGVyIGhkcjsKKwlzdHJ1Y3QgaXByX3NkdF9lbnRyeSBlbnRyeVtJUFJfTlVNX1NEVF9FTlRSSUVTXTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKK3N0cnVjdCBpcHJfdWNfc2R0IHsKKwlzdHJ1Y3QgaXByX3NkdF9oZWFkZXIgaGRyOworCXN0cnVjdCBpcHJfc2R0X2VudHJ5IGVudHJ5WzFdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworLyoKKyAqIERyaXZlciB0eXBlcworICovCitzdHJ1Y3QgaXByX2J1c19hdHRyaWJ1dGVzIHsKKwl1OCBidXM7CisJdTggcWFzX2VuYWJsZWQ7CisJdTggYnVzX3dpZHRoOworCXU4IHJlc2VydmVkOworCXUzMiBtYXhfeGZlcl9yYXRlOworfTsKKworc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSB7CisJc3RydWN0IGlwcl9jb25maWdfdGFibGVfZW50cnkgY2ZndGU7CisJdTggbmVlZHNfc3luY19jb21wbGV0ZToxOworCXU4IGluX2VycDoxOworCXU4IGFkZF90b19tbDoxOworCXU4IGRlbF9mcm9tX21sOjE7CisJdTggcmVzZXR0aW5nX2RldmljZToxOworCisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7Cit9OworCitzdHJ1Y3QgaXByX3Jlc291cmNlX2hkciB7CisJdTE2IG51bV9lbnRyaWVzOworCXUxNiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBpcHJfcmVzb3VyY2VfdGFibGUgeworCXN0cnVjdCBpcHJfcmVzb3VyY2VfaGRyIGhkcjsKKwlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5IGRldltJUFJfTUFYX1BIWVNJQ0FMX0RFVlNdOworfTsKKworc3RydWN0IGlwcl9taXNjX2NicyB7CisJc3RydWN0IGlwcl9pb2FfdnBkIGlvYV92cGQ7CisJc3RydWN0IGlwcl9pbnF1aXJ5X3BhZ2UzIHBhZ2UzX2RhdGE7CisJc3RydWN0IGlwcl9tb2RlX3BhZ2VzIG1vZGVfcGFnZXM7CisJc3RydWN0IGlwcl9zdXBwb3J0ZWRfZGV2aWNlIHN1cHBfZGV2OworfTsKKworc3RydWN0IGlwcl9pbnRlcnJ1cHRfb2Zmc2V0cyB7CisJdW5zaWduZWQgbG9uZyBzZXRfaW50ZXJydXB0X21hc2tfcmVnOworCXVuc2lnbmVkIGxvbmcgY2xyX2ludGVycnVwdF9tYXNrX3JlZzsKKwl1bnNpZ25lZCBsb25nIHNlbnNlX2ludGVycnVwdF9tYXNrX3JlZzsKKwl1bnNpZ25lZCBsb25nIGNscl9pbnRlcnJ1cHRfcmVnOworCisJdW5zaWduZWQgbG9uZyBzZW5zZV9pbnRlcnJ1cHRfcmVnOworCXVuc2lnbmVkIGxvbmcgaW9hcnJpbl9yZWc7CisJdW5zaWduZWQgbG9uZyBzZW5zZV91cHJvY19pbnRlcnJ1cHRfcmVnOworCXVuc2lnbmVkIGxvbmcgc2V0X3Vwcm9jX2ludGVycnVwdF9yZWc7CisJdW5zaWduZWQgbG9uZyBjbHJfdXByb2NfaW50ZXJydXB0X3JlZzsKK307CisKK3N0cnVjdCBpcHJfaW50ZXJydXB0cyB7CisJdm9pZCBfX2lvbWVtICpzZXRfaW50ZXJydXB0X21hc2tfcmVnOworCXZvaWQgX19pb21lbSAqY2xyX2ludGVycnVwdF9tYXNrX3JlZzsKKwl2b2lkIF9faW9tZW0gKnNlbnNlX2ludGVycnVwdF9tYXNrX3JlZzsKKwl2b2lkIF9faW9tZW0gKmNscl9pbnRlcnJ1cHRfcmVnOworCisJdm9pZCBfX2lvbWVtICpzZW5zZV9pbnRlcnJ1cHRfcmVnOworCXZvaWQgX19pb21lbSAqaW9hcnJpbl9yZWc7CisJdm9pZCBfX2lvbWVtICpzZW5zZV91cHJvY19pbnRlcnJ1cHRfcmVnOworCXZvaWQgX19pb21lbSAqc2V0X3Vwcm9jX2ludGVycnVwdF9yZWc7CisJdm9pZCBfX2lvbWVtICpjbHJfdXByb2NfaW50ZXJydXB0X3JlZzsKK307CisKK3N0cnVjdCBpcHJfY2hpcF9jZmdfdCB7CisJdTMyIG1haWxib3g7CisJdTggY2FjaGVfbGluZV9zaXplOworCXN0cnVjdCBpcHJfaW50ZXJydXB0X29mZnNldHMgcmVnczsKK307CisKK3N0cnVjdCBpcHJfY2hpcF90IHsKKwl1MTYgdmVuZG9yOworCXUxNiBkZXZpY2U7CisJY29uc3Qgc3RydWN0IGlwcl9jaGlwX2NmZ190ICpjZmc7Cit9OworCitlbnVtIGlwcl9zaHV0ZG93bl90eXBlIHsKKwlJUFJfU0hVVERPV05fTk9STUFMID0gMHgwMCwKKwlJUFJfU0hVVERPV05fUFJFUEFSRV9GT1JfTk9STUFMID0gMHg0MCwKKwlJUFJfU0hVVERPV05fQUJCUkVWID0gMHg4MCwKKwlJUFJfU0hVVERPV05fTk9ORSA9IDB4MTAwCit9OworCitzdHJ1Y3QgaXByX3RyYWNlX2VudHJ5IHsKKwl1MzIgdGltZTsKKworCXU4IG9wX2NvZGU7CisJdTggdHlwZTsKKyNkZWZpbmUgSVBSX1RSQUNFX1NUQVJUCQkJMHgwMAorI2RlZmluZSBJUFJfVFJBQ0VfRklOSVNICQkweGZmCisJdTE2IGNtZF9pbmRleDsKKworCV9fYmUzMiByZXNfaGFuZGxlOworCXVuaW9uIHsKKwkJdTMyIGlvYXNjOworCQl1MzIgYWRkX2RhdGE7CisJCXUzMiByZXNfYWRkcjsKKwl9IHU7Cit9OworCitzdHJ1Y3QgaXByX3NnbGlzdCB7CisJdTMyIG9yZGVyOworCXUzMiBudW1fc2c7CisJdTMyIGJ1ZmZlcl9sZW47CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNjYXR0ZXJsaXN0WzFdOworfTsKKworZW51bSBpcHJfc2R0X3N0YXRlIHsKKwlJTkFDVElWRSwKKwlXQUlUX0ZPUl9EVU1QLAorCUdFVF9EVU1QLAorCUFCT1JUX0RVTVAsCisJRFVNUF9PQlRBSU5FRAorfTsKKworLyogUGVyLWNvbnRyb2xsZXIgZGF0YSAqLworc3RydWN0IGlwcl9pb2FfY2ZnIHsKKwljaGFyIGV5ZV9jYXRjaGVyWzhdOworI2RlZmluZSBJUFJfRVlFQ0FUQ0hFUgkJCSJpcHJjZmciCisKKwlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlOworCisJdTggYWxsb3dfaW50ZXJydXB0czoxOworCXU4IGluX3Jlc2V0X3JlbG9hZDoxOworCXU4IGluX2lvYV9icmluZ2Rvd246MTsKKwl1OCBpb2FfdW5pdF9jaGVja2VkOjE7CisJdTggaW9hX2lzX2RlYWQ6MTsKKwl1OCBkdW1wX3Rha2VuOjE7CisJdTggYWxsb3dfY21kczoxOworCXU4IGFsbG93X21sX2FkZF9kZWw6MTsKKworCXUxNiB0eXBlOyAvKiBDQ0lOIG9mIHRoZSBjYXJkICovCisKKwl1OCBsb2dfbGV2ZWw7CisjZGVmaW5lIElQUl9NQVhfTE9HX0xFVkVMCQkJNAorI2RlZmluZSBJUFJfREVGQVVMVF9MT0dfTEVWRUwJCTIKKworI2RlZmluZSBJUFJfTlVNX1RSQUNFX0lOREVYX0JJVFMJOAorI2RlZmluZSBJUFJfTlVNX1RSQUNFX0VOVFJJRVMJCSgxIDw8IElQUl9OVU1fVFJBQ0VfSU5ERVhfQklUUykKKyNkZWZpbmUgSVBSX1RSQUNFX1NJWkUJKHNpemVvZihzdHJ1Y3QgaXByX3RyYWNlX2VudHJ5KSAqIElQUl9OVU1fVFJBQ0VfRU5UUklFUykKKwljaGFyIHRyYWNlX3N0YXJ0WzhdOworI2RlZmluZSBJUFJfVFJBQ0VfU1RBUlRfTEFCRUwJCQkidHJhY2UiCisJc3RydWN0IGlwcl90cmFjZV9lbnRyeSAqdHJhY2U7CisJdTMyIHRyYWNlX2luZGV4OklQUl9OVU1fVFJBQ0VfSU5ERVhfQklUUzsKKworCS8qCisJICogUXVldWUgZm9yIGZyZWUgY29tbWFuZCBibG9ja3MKKwkgKi8KKwljaGFyIGlwcl9mcmVlX2xhYmVsWzhdOworI2RlZmluZSBJUFJfRlJFRVFfTEFCRUwJCQkiZnJlZS1xIgorCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9xOworCisJLyoKKwkgKiBRdWV1ZSBmb3IgY29tbWFuZCBibG9ja3Mgb3V0c3RhbmRpbmcgdG8gdGhlIGFkYXB0ZXIKKwkgKi8KKwljaGFyIGlwcl9wZW5kaW5nX2xhYmVsWzhdOworI2RlZmluZSBJUFJfUEVORFFfTEFCRUwJCQkicGVuZC1xIgorCXN0cnVjdCBsaXN0X2hlYWQgcGVuZGluZ19xOworCisJY2hhciBjZmdfdGFibGVfc3RhcnRbOF07CisjZGVmaW5lIElQUl9DRkdfVEJMX1NUQVJUCQkiY2ZnIgorCXN0cnVjdCBpcHJfY29uZmlnX3RhYmxlICpjZmdfdGFibGU7CisJZG1hX2FkZHJfdCBjZmdfdGFibGVfZG1hOworCisJY2hhciByZXNvdXJjZV90YWJsZV9sYWJlbFs4XTsKKyNkZWZpbmUgSVBSX1JFU19UQUJMRV9MQUJFTAkJInJlc190YmwiCisJc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzX2VudHJpZXM7CisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX3Jlc19xOworCXN0cnVjdCBsaXN0X2hlYWQgdXNlZF9yZXNfcTsKKworCWNoYXIgaXByX2hjYW1fbGFiZWxbOF07CisjZGVmaW5lIElQUl9IQ0FNX0xBQkVMCQkJImhjYW1zIgorCXN0cnVjdCBpcHJfaG9zdHJjYiAqaG9zdHJjYltJUFJfTlVNX0hDQU1TXTsKKwlkbWFfYWRkcl90IGhvc3RyY2JfZG1hW0lQUl9OVU1fSENBTVNdOworCXN0cnVjdCBsaXN0X2hlYWQgaG9zdHJjYl9mcmVlX3E7CisJc3RydWN0IGxpc3RfaGVhZCBob3N0cmNiX3BlbmRpbmdfcTsKKworCV9fYmUzMiAqaG9zdF9ycnE7CisJZG1hX2FkZHJfdCBob3N0X3JycV9kbWE7CisjZGVmaW5lIElQUl9IUlJRX1JFUV9SRVNQX0hBTkRMRV9NQVNLCTB4ZmZmZmZmZmMKKyNkZWZpbmUgSVBSX0hSUlFfUkVTUF9CSVRfU0VUCQkJMHgwMDAwMDAwMgorI2RlZmluZSBJUFJfSFJSUV9UT0dHTEVfQklUCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgSVBSX0hSUlFfUkVRX1JFU1BfSEFORExFX1NISUZUCTIKKwl2b2xhdGlsZSBfX2JlMzIgKmhycnFfc3RhcnQ7CisJdm9sYXRpbGUgX19iZTMyICpocnJxX2VuZDsKKwl2b2xhdGlsZSBfX2JlMzIgKmhycnFfY3VycjsKKwl2b2xhdGlsZSB1MzIgdG9nZ2xlX2JpdDsKKworCXN0cnVjdCBpcHJfYnVzX2F0dHJpYnV0ZXMgYnVzX2F0dHJbSVBSX01BWF9OVU1fQlVTRVNdOworCisJY29uc3Qgc3RydWN0IGlwcl9jaGlwX2NmZ190ICpjaGlwX2NmZzsKKworCXZvaWQgX19pb21lbSAqaGR3X2RtYV9yZWdzOwkvKiBpb21hcHBlZCBQQ0kgbWVtb3J5IHNwYWNlICovCisJdW5zaWduZWQgbG9uZyBoZHdfZG1hX3JlZ3NfcGNpOwkvKiByYXcgUENJIG1lbW9yeSBzcGFjZSAqLworCXZvaWQgX19pb21lbSAqaW9hX21haWxib3g7CisJc3RydWN0IGlwcl9pbnRlcnJ1cHRzIHJlZ3M7CisKKwl1MTYgc2F2ZWRfcGNpeF9jbWRfcmVnOworCXUxNiByZXNldF9yZXRyaWVzOworCisJdTMyIGVycm9yc19sb2dnZWQ7CisKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBpcHJfc2dsaXN0ICp1Y29kZV9zZ2xpc3Q7CisJc3RydWN0IGlwcl9tb2RlX3BhZ2VzICpzYXZlZF9tb2RlX3BhZ2VzOworCXU4IHNhdmVkX21vZGVfcGFnZV9sZW47CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29ya19xOworCisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVzZXRfd2FpdF9xOworCisJc3RydWN0IGlwcl9kdW1wICpkdW1wOworCWVudW0gaXByX3NkdF9zdGF0ZSBzZHRfc3RhdGU7CisKKwlzdHJ1Y3QgaXByX21pc2NfY2JzICp2cGRfY2JzOworCWRtYV9hZGRyX3QgdnBkX2Nic19kbWE7CisKKwlzdHJ1Y3QgcGNpX3Bvb2wgKmlwcl9jbWRfcG9vbDsKKworCXN0cnVjdCBpcHJfY21uZCAqcmVzZXRfY21kOworCisJY2hhciBpcHJfY21kX2xhYmVsWzhdOworI2RlZmluZSBJUFJfQ01EX0xBQkVMCQkiaXByX2NtbmQiCisJc3RydWN0IGlwcl9jbW5kICppcHJfY21uZF9saXN0W0lQUl9OVU1fQ01EX0JMS1NdOworCXUzMiBpcHJfY21uZF9saXN0X2RtYVtJUFJfTlVNX0NNRF9CTEtTXTsKK307CisKK3N0cnVjdCBpcHJfY21uZCB7CisJc3RydWN0IGlwcl9pb2FyY2IgaW9hcmNiOworCXN0cnVjdCBpcHJfaW9hc2EgaW9hc2E7CisJc3RydWN0IGlwcl9pb2FkbF9kZXNjIGlvYWRsW0lQUl9OVU1fSU9BRExfRU5UUklFU107CisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2NtZDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXZvaWQgKCpkb25lKSAoc3RydWN0IGlwcl9jbW5kICopOworCWludCAoKmpvYl9zdGVwKSAoc3RydWN0IGlwcl9jbW5kICopOworCXUxNiBjbWRfaW5kZXg7CisJdTggc2Vuc2VfYnVmZmVyW1NDU0lfU0VOU0VfQlVGRkVSU0laRV07CisJZG1hX2FkZHJfdCBzZW5zZV9idWZmZXJfZG1hOworCXVuc2lnbmVkIHNob3J0IGRtYV91c2Vfc2c7CisJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOworCXN0cnVjdCBpcHJfY21uZCAqc2libGluZzsKKwl1bmlvbiB7CisJCWVudW0gaXByX3NodXRkb3duX3R5cGUgc2h1dGRvd25fdHlwZTsKKwkJc3RydWN0IGlwcl9ob3N0cmNiICpob3N0cmNiOworCQl1bnNpZ25lZCBsb25nIHRpbWVfbGVmdDsKKwkJdW5zaWduZWQgbG9uZyBzY3JhdGNoOworCQlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXM7CisJCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKwl9IHU7CisKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmc7Cit9OworCitzdHJ1Y3QgaXByX3Nlc190YWJsZV9lbnRyeSB7CisJY2hhciBwcm9kdWN0X2lkWzE3XTsKKwljaGFyIGNvbXBhcmVfcHJvZHVjdF9pZF9ieXRlWzE3XTsKKwl1MzIgbWF4X2J1c19zcGVlZF9saW1pdDsJLyogTUIvc2VjIGxpbWl0IGZvciB0aGlzIGJhY2twbGFuZSAqLworfTsKKworc3RydWN0IGlwcl9kdW1wX2hlYWRlciB7CisJdTMyIGV5ZV9jYXRjaGVyOworI2RlZmluZSBJUFJfRFVNUF9FWUVfQ0FUQ0hFUgkJMHhDNUQ0RTNGMgorCXUzMiBsZW47CisJdTMyIG51bV9lbnRyaWVzOworCXUzMiBmaXJzdF9lbnRyeV9vZmZzZXQ7CisJdTMyIHN0YXR1czsKKyNkZWZpbmUgSVBSX0RVTVBfU1RBVFVTX1NVQ0NFU1MJCQkwCisjZGVmaW5lIElQUl9EVU1QX1NUQVRVU19RVUFMX1NVQ0NFU1MJCTIKKyNkZWZpbmUgSVBSX0RVTVBfU1RBVFVTX0ZBSUxFRAkJCTB4ZmZmZmZmZmYKKwl1MzIgb3M7CisjZGVmaW5lIElQUl9EVU1QX09TX0xJTlVYCTB4NEM0RTU1NTgKKwl1MzIgZHJpdmVyX25hbWU7CisjZGVmaW5lIElQUl9EVU1QX0RSSVZFUl9OQU1FCTB4NDk1MDUyMzIKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKK3N0cnVjdCBpcHJfZHVtcF9lbnRyeV9oZWFkZXIgeworCXUzMiBleWVfY2F0Y2hlcjsKKyNkZWZpbmUgSVBSX0RVTVBfRVlFX0NBVENIRVIJCTB4QzVENEUzRjIKKwl1MzIgbGVuOworCXUzMiBudW1fZWxlbXM7CisJdTMyIG9mZnNldDsKKwl1MzIgZGF0YV90eXBlOworI2RlZmluZSBJUFJfRFVNUF9EQVRBX1RZUEVfQVNDSUkJMHg0MTUzNDM0OQorI2RlZmluZSBJUFJfRFVNUF9EQVRBX1RZUEVfQklOQVJZCTB4NDI0OTRFNDEKKwl1MzIgaWQ7CisjZGVmaW5lIElQUl9EVU1QX0lPQV9EVU1QX0lECQkweDQ5NEY0MTMxCisjZGVmaW5lIElQUl9EVU1QX0xPQ0FUSU9OX0lECQkweDRDNEY0MzQxCisjZGVmaW5lIElQUl9EVU1QX1RSQUNFX0lECQkweDU0NTI0MTQzCisjZGVmaW5lIElQUl9EVU1QX0RSSVZFUl9WRVJTSU9OX0lECTB4NDQ1MjU2NTIKKyNkZWZpbmUgSVBSX0RVTVBfRFJJVkVSX1RZUEVfSUQJMHg1NDU5NTA0NQorI2RlZmluZSBJUFJfRFVNUF9JT0FfQ1RSTF9CTEsJCTB4NDk0RjQzNDIKKyNkZWZpbmUgSVBSX0RVTVBfUEVORF9PUFMJCTB4NDE0RjUwNTMKKwl1MzIgc3RhdHVzOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9kdW1wX2xvY2F0aW9uX2VudHJ5IHsKKwlzdHJ1Y3QgaXByX2R1bXBfZW50cnlfaGVhZGVyIGhkcjsKKwl1OCBsb2NhdGlvbltCVVNfSURfU0laRV07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBpcHJfZHVtcF90cmFjZV9lbnRyeSB7CisJc3RydWN0IGlwcl9kdW1wX2VudHJ5X2hlYWRlciBoZHI7CisJdTMyIHRyYWNlW0lQUl9UUkFDRV9TSVpFIC8gc2l6ZW9mKHUzMildOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9kdW1wX3ZlcnNpb25fZW50cnkgeworCXN0cnVjdCBpcHJfZHVtcF9lbnRyeV9oZWFkZXIgaGRyOworCXU4IHZlcnNpb25bc2l6ZW9mKElQUl9EUklWRVJfVkVSU0lPTildOworfTsKKworc3RydWN0IGlwcl9kdW1wX2lvYV90eXBlX2VudHJ5IHsKKwlzdHJ1Y3QgaXByX2R1bXBfZW50cnlfaGVhZGVyIGhkcjsKKwl1MzIgdHlwZTsKKwl1MzIgZndfdmVyc2lvbjsKK307CisKK3N0cnVjdCBpcHJfZHJpdmVyX2R1bXAgeworCXN0cnVjdCBpcHJfZHVtcF9oZWFkZXIgaGRyOworCXN0cnVjdCBpcHJfZHVtcF92ZXJzaW9uX2VudHJ5IHZlcnNpb25fZW50cnk7CisJc3RydWN0IGlwcl9kdW1wX2xvY2F0aW9uX2VudHJ5IGxvY2F0aW9uX2VudHJ5OworCXN0cnVjdCBpcHJfZHVtcF9pb2FfdHlwZV9lbnRyeSBpb2FfdHlwZV9lbnRyeTsKKwlzdHJ1Y3QgaXByX2R1bXBfdHJhY2VfZW50cnkgdHJhY2VfZW50cnk7Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBpcHJfaW9hX2R1bXAgeworCXN0cnVjdCBpcHJfZHVtcF9lbnRyeV9oZWFkZXIgaGRyOworCXN0cnVjdCBpcHJfc2R0IHNkdDsKKwlfX2JlMzIgKmlvYV9kYXRhW0lQUl9NQVhfTlVNX0RVTVBfUEFHRVNdOworCXUzMiByZXNlcnZlZDsKKwl1MzIgbmV4dF9wYWdlX2luZGV4OworCXUzMiBwYWdlX29mZnNldDsKKwl1MzIgZm9ybWF0OworI2RlZmluZSBJUFJfU0RUX0ZNVDIJCTIKKyNkZWZpbmUgSVBSX1NEVF9VTktOT1dOCQkzCit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX2R1bXAgeworCXN0cnVjdCBrcmVmIGtyZWY7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnOworCXN0cnVjdCBpcHJfZHJpdmVyX2R1bXAgZHJpdmVyX2R1bXA7CisJc3RydWN0IGlwcl9pb2FfZHVtcCBpb2FfZHVtcDsKK307CisKK3N0cnVjdCBpcHJfZXJyb3JfdGFibGVfdCB7CisJdTMyIGlvYXNjOworCWludCBsb2dfaW9hc2E7CisJaW50IGxvZ19oY2FtOworCWNoYXIgKmVycm9yOworfTsKKworc3RydWN0IGlwcl9zb2Z0d2FyZV9pbnFfbGlkX2luZm8geworCV9fYmUzMiBsb2FkX2lkOworCV9fYmUzMiB0aW1lc3RhbXBbM107Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX3Vjb2RlX2ltYWdlX2hlYWRlciB7CisJX19iZTMyIGhlYWRlcl9sZW5ndGg7CisJX19iZTMyIGxpZF90YWJsZV9vZmZzZXQ7CisJdTggbWFqb3JfcmVsZWFzZTsKKwl1OCBjYXJkX3R5cGU7CisJdTggbWlub3JfcmVsZWFzZVsyXTsKKwl1OCByZXNlcnZlZFsyMF07CisJY2hhciBleWVjYXRjaGVyWzE2XTsKKwlfX2JlMzIgbnVtX2xpZHM7CisJc3RydWN0IGlwcl9zb2Z0d2FyZV9pbnFfbGlkX2luZm8gbGlkWzFdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworLyoKKyAqIE1hY3JvcworICovCisjaWYgSVBSX0RFQlVHCisjZGVmaW5lIElQUl9EQkdfQ01EKENNRCkgZG8geyBDTUQ7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBJUFJfREJHX0NNRChDTUQpCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TQ1NJX0lQUl9UUkFDRQorI2RlZmluZSBpcHJfY3JlYXRlX3RyYWNlX2ZpbGUoa29iaiwgYXR0cikgc3lzZnNfY3JlYXRlX2Jpbl9maWxlKGtvYmosIGF0dHIpCisjZGVmaW5lIGlwcl9yZW1vdmVfdHJhY2VfZmlsZShrb2JqLCBhdHRyKSBzeXNmc19yZW1vdmVfYmluX2ZpbGUoa29iaiwgYXR0cikKKyNlbHNlCisjZGVmaW5lIGlwcl9jcmVhdGVfdHJhY2VfZmlsZShrb2JqLCBhdHRyKSAwCisjZGVmaW5lIGlwcl9yZW1vdmVfdHJhY2VfZmlsZShrb2JqLCBhdHRyKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NDU0lfSVBSX0RVTVAKKyNkZWZpbmUgaXByX2NyZWF0ZV9kdW1wX2ZpbGUoa29iaiwgYXR0cikgc3lzZnNfY3JlYXRlX2Jpbl9maWxlKGtvYmosIGF0dHIpCisjZGVmaW5lIGlwcl9yZW1vdmVfZHVtcF9maWxlKGtvYmosIGF0dHIpIHN5c2ZzX3JlbW92ZV9iaW5fZmlsZShrb2JqLCBhdHRyKQorI2Vsc2UKKyNkZWZpbmUgaXByX2NyZWF0ZV9kdW1wX2ZpbGUoa29iaiwgYXR0cikgMAorI2RlZmluZSBpcHJfcmVtb3ZlX2R1bXBfZmlsZShrb2JqLCBhdHRyKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisvKgorICogRXJyb3IgbG9nZ2luZyBtYWNyb3MKKyAqLworI2RlZmluZSBpcHJfZXJyKC4uLikgcHJpbnRrKEtFUk5fRVJSIElQUl9OQU1FICI6ICJfX1ZBX0FSR1NfXykKKyNkZWZpbmUgaXByX2luZm8oLi4uKSBwcmludGsoS0VSTl9JTkZPIElQUl9OQU1FICI6ICJfX1ZBX0FSR1NfXykKKyNkZWZpbmUgaXByX2NyaXQoLi4uKSBwcmludGsoS0VSTl9DUklUIElQUl9OQU1FICI6ICJfX1ZBX0FSR1NfXykKKyNkZWZpbmUgaXByX3dhcm4oLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIElQUl9OQU1FIjogIl9fVkFfQVJHU19fKQorI2RlZmluZSBpcHJfZGJnKC4uLikgSVBSX0RCR19DTUQocHJpbnRrKEtFUk5fSU5GTyBJUFJfTkFNRSAiOiAiX19WQV9BUkdTX18pKQorCisjZGVmaW5lIGlwcl9zZGV2X3ByaW50ayhsZXZlbCwgc2RldiwgZm10LCAuLi4pIFwKKwlwcmludGsobGV2ZWwgSVBSX05BTUUgIjogJWQ6JWQ6JWQ6JWQ6ICIgZm10LCBzZGV2LT5ob3N0LT5ob3N0X25vLCBcCisJCXNkZXYtPmNoYW5uZWwsIHNkZXYtPmlkLCBzZGV2LT5sdW4sICMjX19WQV9BUkdTX18pCisKKyNkZWZpbmUgaXByX3NkZXZfZXJyKHNkZXYsIGZtdCwgLi4uKSBcCisJaXByX3NkZXZfcHJpbnRrKEtFUk5fRVJSLCBzZGV2LCBmbXQsICMjX19WQV9BUkdTX18pCisKKyNkZWZpbmUgaXByX3NkZXZfaW5mbyhzZGV2LCBmbXQsIC4uLikgXAorCWlwcl9zZGV2X3ByaW50ayhLRVJOX0lORk8sIHNkZXYsIGZtdCwgIyNfX1ZBX0FSR1NfXykKKworI2RlZmluZSBpcHJfc2Rldl9kYmcoc2RldiwgZm10LCAuLi4pIFwKKwlJUFJfREJHX0NNRChpcHJfc2Rldl9wcmludGsoS0VSTl9JTkZPLCBzZGV2LCBmbXQsICMjX19WQV9BUkdTX18pKQorCisjZGVmaW5lIGlwcl9yZXNfcHJpbnRrKGxldmVsLCBpb2FfY2ZnLCByZXMsIGZtdCwgLi4uKSBcCisJcHJpbnRrKGxldmVsIElQUl9OQU1FICI6ICVkOiVkOiVkOiVkOiAiIGZtdCwgaW9hX2NmZy0+aG9zdC0+aG9zdF9ubywgXAorCQlyZXMuYnVzLCByZXMudGFyZ2V0LCByZXMubHVuLCAjI19fVkFfQVJHU19fKQorCisjZGVmaW5lIGlwcl9yZXNfZXJyKGlvYV9jZmcsIHJlcywgZm10LCAuLi4pIFwKKwlpcHJfcmVzX3ByaW50ayhLRVJOX0VSUiwgaW9hX2NmZywgcmVzLCBmbXQsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIGlwcl9yZXNfZGJnKGlvYV9jZmcsIHJlcywgZm10LCAuLi4pIFwKKwlJUFJfREJHX0NNRChpcHJfcmVzX3ByaW50ayhLRVJOX0lORk8sIGlvYV9jZmcsIHJlcywgZm10LCAjI19fVkFfQVJHU19fKSkKKworI2RlZmluZSBpcHJfdHJhY2UgaXByX2RiZygiJXM6ICVzOiBMaW5lOiAlZFxuIixcCisJX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCisKKyNpZiBJUFJfREJHX1RSQUNFCisjZGVmaW5lIEVOVEVSIHByaW50ayhLRVJOX0lORk8gSVBSX05BTUUiOiBFbnRlcmluZyAlc1xuIiwgX19GVU5DVElPTl9fKQorI2RlZmluZSBMRUFWRSBwcmludGsoS0VSTl9JTkZPIElQUl9OQU1FIjogTGVhdmluZyAlc1xuIiwgX19GVU5DVElPTl9fKQorI2Vsc2UKKyNkZWZpbmUgRU5URVIKKyNkZWZpbmUgTEVBVkUKKyNlbmRpZgorCisjZGVmaW5lIGlwcl9lcnJfc2VwYXJhdG9yIFwKK2lwcl9lcnIoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpCisKKworLyoKKyAqIElubGluZXMKKyAqLworCisvKioKKyAqIGlwcl9pc19pb2FfcmVzb3VyY2UgLSBEZXRlcm1pbmUgaWYgYSByZXNvdXJjZSBpcyB0aGUgSU9BCisgKiBAcmVzOglyZXNvdXJjZSBlbnRyeSBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMSBpZiBJT0EgLyAwIGlmIG5vdCBJT0EKKyAqKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlwcl9pc19pb2FfcmVzb3VyY2Uoc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzKQoreworCXJldHVybiAocmVzLT5jZmd0ZS5mbGFncyAmIElQUl9JU19JT0FfUkVTT1VSQ0UpID8gMSA6IDA7Cit9CisKKy8qKgorICogaXByX2lzX2FmX2Rhc2RfZGV2aWNlIC0gRGV0ZXJtaW5lIGlmIGEgcmVzb3VyY2UgaXMgYW4gQUYgREFTRAorICogQHJlczoJcmVzb3VyY2UgZW50cnkgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTEgaWYgQUYgREFTRCAvIDAgaWYgbm90IEFGIERBU0QKKyAqKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlwcl9pc19hZl9kYXNkX2RldmljZShzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXMpCit7CisJaWYgKElQUl9JU19EQVNEX0RFVklDRShyZXMtPmNmZ3RlLnN0ZF9pbnFfZGF0YSkgJiYKKwkgICAgIWlwcl9pc19pb2FfcmVzb3VyY2UocmVzKSAmJgorCSAgICBJUFJfUkVTX1NVQlRZUEUocmVzKSA9PSBJUFJfU1VCVFlQRV9BRl9EQVNEKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKioKKyAqIGlwcl9pc192c2V0X2RldmljZSAtIERldGVybWluZSBpZiBhIHJlc291cmNlIGlzIGEgVlNFVAorICogQHJlczoJcmVzb3VyY2UgZW50cnkgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTEgaWYgVlNFVCAvIDAgaWYgbm90IFZTRVQKKyAqKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlwcl9pc192c2V0X2RldmljZShzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXMpCit7CisJaWYgKElQUl9JU19EQVNEX0RFVklDRShyZXMtPmNmZ3RlLnN0ZF9pbnFfZGF0YSkgJiYKKwkgICAgIWlwcl9pc19pb2FfcmVzb3VyY2UocmVzKSAmJgorCSAgICBJUFJfUkVTX1NVQlRZUEUocmVzKSA9PSBJUFJfU1VCVFlQRV9WT0xVTUVfU0VUKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKioKKyAqIGlwcl9pc19nc2NzaSAtIERldGVybWluZSBpZiBhIHJlc291cmNlIGlzIGEgZ2VuZXJpYyBzY3NpIHJlc291cmNlCisgKiBAcmVzOglyZXNvdXJjZSBlbnRyeSBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMSBpZiBHU0NTSSAvIDAgaWYgbm90IEdTQ1NJCisgKiovCitzdGF0aWMgaW5saW5lIGludCBpcHJfaXNfZ3Njc2koc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzKQoreworCWlmICghaXByX2lzX2lvYV9yZXNvdXJjZShyZXMpICYmCisJICAgIElQUl9SRVNfU1VCVFlQRShyZXMpID09IElQUl9TVUJUWVBFX0dFTkVSSUNfU0NTSSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpcHJfaXNfZGV2aWNlIC0gRGV0ZXJtaW5lIGlmIHJlc291cmNlIGFkZHJlc3MgaXMgdGhhdCBvZiBhIGRldmljZQorICogQHJlc19hZGRyOglyZXNvdXJjZSBhZGRyZXNzIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkxIGlmIEFGIC8gMCBpZiBub3QgQUYKKyAqKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlwcl9pc19kZXZpY2Uoc3RydWN0IGlwcl9yZXNfYWRkciAqcmVzX2FkZHIpCit7CisJaWYgKChyZXNfYWRkci0+YnVzIDwgSVBSX01BWF9OVU1fQlVTRVMpICYmCisJICAgIChyZXNfYWRkci0+dGFyZ2V0IDwgSVBSX01BWF9OVU1fVEFSR0VUU19QRVJfQlVTKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpcHJfc2R0X2lzX2ZtdDIgLSBEZXRlcm1pbmUgaWYgYSBTRFQgYWRkcmVzcyBpcyBpbiBmb3JtYXQgMgorICogQHNkdF93b3JkOglTRFQgYWRkcmVzcworICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkxIGlmIGZvcm1hdCAyIC8gMCBpZiBub3QKKyAqKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlwcl9zZHRfaXNfZm10Mih1MzIgc2R0X3dvcmQpCit7CisJdTMyIGJhcl9zZWwgPSBJUFJfR0VUX0ZNVDJfQkFSX1NFTChzZHRfd29yZCk7CisKKwlzd2l0Y2ggKGJhcl9zZWwpIHsKKwljYXNlIElQUl9TRFRfRk1UMl9CQVIwX1NFTDoKKwljYXNlIElQUl9TRFRfRk1UMl9CQVIxX1NFTDoKKwljYXNlIElQUl9TRFRfRk1UMl9CQVIyX1NFTDoKKwljYXNlIElQUl9TRFRfRk1UMl9CQVIzX1NFTDoKKwljYXNlIElQUl9TRFRfRk1UMl9CQVI0X1NFTDoKKwljYXNlIElQUl9TRFRfRk1UMl9CQVI1X1NFTDoKKwljYXNlIElQUl9TRFRfRk1UMl9FWFBfUk9NX1NFTDoKKwkJcmV0dXJuIDE7CisJfTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pcHMuYyBiL2RyaXZlcnMvc2NzaS9pcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDYwOTZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lwcy5jCkBAIC0wLDAgKzEsNzQ5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogaXBzLmMgLS0gZHJpdmVyIGZvciB0aGUgQWRhcHRlYyAvIElCTSBTZXJ2ZVJBSUQgY29udHJvbGxlciAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogV3JpdHRlbiBCeTogS2VpdGggTWl0Y2hlbGwsIElCTSBDb3Jwb3JhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgSmFjayBIYW1tZXIsIEFkYXB0ZWMsIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgRGF2aWQgSmVmZmVyeSwgQWRhcHRlYywgSW5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ29weXJpZ2h0IChDKSAyMDAwIElCTSBDb3Jwb3JhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ29weXJpZ2h0IChDKSAyMDAyLDIwMDMgQWRhcHRlYywgSW5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgICAqLworLyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgICAqLworLyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgICAqLworLyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgICAqLworLyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgICAqLworLyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgICAqLworLyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk8gV0FSUkFOVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SICAgICAgICAqLworLyogQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgICAgICAqLworLyogTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgICAgICAqLworLyogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyAgICAqLworLyogc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCAgICAgICAqLworLyogZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzICAgICAgICAqLworLyogZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvICAgICAqLworLyogdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgICAgICAgICAqLworLyogcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgICAqLworLyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMICAgICAgICAqLworLyogREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgICAqLworLyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICAgICAqLworLyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSAgICAqLworLyogVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEICAqLworLyogSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUyAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgICAqLworLyogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgICAqLworLyogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnVncy9Db21tZW50cy9TdWdnZXN0aW9ucyBhYm91dCB0aGlzIGRyaXZlciBzaG91bGQgYmUgbWFpbGVkIHRvOiAgICAgICAgICAqLworLyogICAgICBpcHNsaW51eEBhZGFwdGVjLmNvbSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRm9yIHN5c3RlbSBzdXBwb3J0IGlzc3VlcywgY29udGFjdCB5b3VyIGxvY2FsIElCTSBDdXN0b21lciBzdXBwb3J0LiAgICAgICAqLworLyogRGlyZWN0aW9ucyB0byBmaW5kIElCTSBDdXN0b21lciBTdXBwb3J0IGZvciBlYWNoIGNvdW50cnkgY2FuIGJlIGZvdW5kIGF0OiAqLworLyogICAgICBodHRwOi8vd3d3LmlibS5jb20vcGxhbmV0d2lkZS8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDaGFuZ2UgTG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAwLjk5LjAyICAtIEJyZWFrdXAgY29tbWFuZHMgdGhhdCBhcmUgYmlnZ2VyIHRoYW4gOCAqIHRoZSBzdHJpcGUgc2l6ZSAgICAgICovCisvKiAwLjk5LjAzICAtIE1ha2UgaW50ZXJydXB0IHJvdXRpbmUgaGFuZGxlIGFsbCBjb21wbGV0ZWQgcmVxdWVzdCBvbiB0aGUgICAgICovCisvKiAgICAgICAgICAgIGFkYXB0ZXIgbm90IGp1c3QgdGhlIGZpcnN0IG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAtIE1ha2Ugc3VyZSBwYXNzdGhydSBjb21tYW5kcyBnZXQgd29rZW4gdXAgaWYgd2UgcnVuIG91dCBvZiAgICAgICovCisvKiAgICAgICAgICAgIFNDQnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAtIFNlbmQgYWxsIG9mIHRoZSBjb21tYW5kcyBvbiB0aGUgcXVldWUgYXQgb25jZSByYXRoZXIgdGhhbiAgICAgICovCisvKiAgICAgICAgICAgIG9uZSBhdCBhIHRpbWUgc2luY2UgdGhlIGNhcmQgd2lsbCBzdXBwb3J0IGl0LiAgICAgICAgICAgICAgICAgICovCisvKiAwLjk5LjA0ICAtIEZpeCByYWNlIGNvbmRpdGlvbiBpbiB0aGUgcGFzc3RocnUgbWVjaGFuaXNtIC0tIHRoaXMgcmVxdWlyZWQgICovCisvKiAgICAgICAgICAgIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHV0aWxpdGllcyB0byBjaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAtIEZpeCBlcnJvciByZWNvdmVyeSBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAwLjk5LjA1ICAtIEZpeCBhbiBvb3BzIHdoZW4gd2UgZ2V0IGNlcnRhaW4gcGFzc3RocnUgY29tbWFuZHMgICAgICAgICAgICAgICovCisvKiAxLjAwLjAwICAtIEluaXRpYWwgUHVibGljIFJlbGVhc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIDAuOTkuMDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAzLjYwLjAwICAtIEJ1bXAgbWF4IGNvbW1hbmRzIHRvIDEyOCBmb3IgdXNlIHdpdGggZmlybXdhcmUgMy42MCAgICAgICAgICAgICovCisvKiAgICAgICAgICAtIENoYW5nZSB2ZXJzaW9uIHRvIDMuNjAgdG8gY29pbmNpZGUgd2l0aCByZWxlYXNlIG51bWJlcmluZy4gICAgICovCisvKiAzLjYwLjAxICAtIFJlbW92ZSBib2d1cyBlcnJvciBjaGVjayBpbiBwYXNzdGhydSByb3V0aW5lICAgICAgICAgICAgICAgICAgICovCisvKiAzLjYwLjAyICAtIE1ha2UgRENEQiBkaXJlY3Rpb24gYmFzZWQgb24gbG9va3VwIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAtIE9ubHkgYWxsb3cgb25lIERDREIgY29tbWFuZCB0byBhIFNDU0kgSUQgYXQgYSB0aW1lICAgICAgICAgICAgICovCisvKiA0LjAwLjAwICAtIEFkZCBzdXBwb3J0IGZvciBTZXJ2ZVJBSUQgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA0LjAwLjAxICAtIEFkZCBzdXBwb3J0IGZvciBGaXJzdCBGYWlsdXJlIERhdGEgQ2FwdHVyZSAgICAgICAgICAgICAgICAgICAgICovCisvKiA0LjAwLjAyICAtIEZpeCBwcm9ibGVtIHdpdGggUFQgRENEQiB3aXRoIG5vIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA0LjAwLjAzICAtIEFkZCBhbHRlcm5hdGl2ZSBwYXNzdGhydSBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAtIEFkZCBhYmlsaXR5IHRvIGZsYXNoIEJJT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA0LjAwLjA0ICAtIFJlbmFtZSBzdHJ1Y3R1cmVzL2NvbnN0YW50cyB0byBiZSBwcmVmaXhlZCB3aXRoIElQU18gICAgICAgICAgICovCisvKiA0LjAwLjA1ICAtIFJlbW92ZSB3aXNoX2Jsb2NrIGZyb20gaW5pdCByb3V0aW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAtIFVzZSBsaW51eC9zcGlubG9jay5oIGluc3RlYWQgb2YgYXNtL3NwaW5sb2NrLmggZm9yIGtlcm5lbHMgICAgICovCisvKiAgICAgICAgICAgIDIuMy4xOCBhbmQgbGF0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAtIFN5bmMgd2l0aCBvdGhlciBjaGFuZ2VzIGZyb20gdGhlIDIuMyBrZXJuZWxzICAgICAgICAgICAgICAgICAgICovCisvKiA0LjAwLjA2ICAtIEZpeCB0aW1lb3V0IHdpdGggaW5pdGlhbCBGRkRDIGNvbW1hbmQgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA0LjAwLjA2YSAtIFBvcnQgdG8gMi40ICh0cml2aWFsKSAtLSBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGluZnJhZGVhZC5vcmc+ICovCisvKiA0LjEwLjAwICAtIEFkZCBzdXBwb3J0IGZvciBTZXJ2ZVJBSUQgNE0vNEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA0LjEwLjEzICAtIEZpeCBmb3IgZHluYW1pYyB1bmxvYWQgYW5kIHByb2MgZmlsZSBzeXN0ZW0gICAgICAgICAgICAgICAgICAgICovCisvKiA0LjIwLjAzICAtIFJlbmFtZSB2ZXJzaW9uIHRvIGNvaW5jaWRlIHdpdGggbmV3IHJlbGVhc2Ugc2NoZWR1bGVzICAgICAgICAgICovCisvKiAgICAgICAgICAgIFBlcmZvcm1hbmNlIGZpeGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgIEZpeCB0cnVuY2F0aW9uIG9mIC9wcm9jIGZpbGVzIHdpdGggY2F0ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgIE1lcmdlIGluIGNoYW5nZXMgdGhyb3VnaCBrZXJuZWwgMi40LjB0ZXN0MWFjMjEgICAgICAgICAgICAgICAgICovCisvKiA0LjIwLjEzICAtIEZpeCBzb21lIGZhaWx1cmUgY2FzZXMgLyByZXNldCBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAtIEhvb2sgaW50byB0aGUgcmVib290X25vdGlmaWVyIHRvIGZsdXNoIHRoZSBjb250cm9sbGVyIGNhY2hlICAgICovCisvKiA0LjUwLjAxICAtIEZpeCBwcm9ibGVtIHdoZW4gdGhlcmUgaXMgYSBob2xlIGluIGxvZ2ljYWwgZHJpdmUgbnVtYmVyaW5nICAgICovCisvKiA0LjcwLjA5ICAtIFVzZSBhIENvbW1vbiAoIExhcmdlIEJ1ZmZlciApIGZvciBGbGFzaGluZyBmcm9tIHRoZSBKQ1JNIENEICAgICovCisvKiAgICAgICAgICAtIEFkZCBJUFNTRU5EIEZsYXNoIFN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAtIFNldCBTZW5zZSBEYXRhIGZvciBVbmtub3duIFNDU0kgQ29tbWFuZCAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAtIFVzZSBTbG90IE51bWJlciBmcm9tIE5WUkFNIFBhZ2UgNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAtIFJlc3RvcmUgY2FsbGVyJ3MgRENEQiBTdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA0LjcwLjEyICAtIENvcnJlY3RpdmUgYWN0aW9ucyBmb3IgYmFkIGNvbnRyb2xsZXIgKCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gKSovCisvKiA0LjcwLjEzICAtIERvbid0IFNlbmQgQ0RCJ3MgaWYgd2UgYWxyZWFkeSBrbm93IHRoZSBkZXZpY2UgaXMgbm90IHByZXNlbnQgICovCisvKiAgICAgICAgICAtIERvbid0IHJlbGVhc2UgSEEgTG9jayBpbiBpcHNfbmV4dCgpIHVudGlsIFNDIHRha2VuIG9mZiBxdWV1ZSAgICovCisvKiAgICAgICAgICAtIFVucmVnaXN0ZXIgU0NTSSBkZXZpY2UgaW4gaXBzX3JlbGVhc2UoKSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA0LjcwLjE1ICAtIEZpeCBCcmVha3VwIGZvciB2ZXJ5IGxhcmdlICggbm9uLVNHICkgcmVxdWVzdHMgaW4gaXBzX2RvbmUoKSAgICovCisvKiA0LjcxLjAwICAtIENoYW5nZSBhbGwgbWVtb3J5IGFsbG9jYXRpb25zIHRvIG5vdCB1c2UgR0ZQX0RNQSBmbGFnICAgICAgICAgICovCisvKiAgICAgICAgICAgIENvZGUgQ2xlYW4tVXAgZm9yIDIuNC54IGtlcm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA0LjcyLjAwICAtIEFsbG93IGZvciBhIFNjYXR0ZXItR2F0aGVyIEVsZW1lbnQgdG8gZXhjZWVkIE1BWF9YRkVSIFNpemUgICAgICovCisvKiA0LjcyLjAxICAtIEkvTyBNYXBwZWQgTWVtb3J5IHJlbGVhc2UgKCBzbyAiaW5zbW9kIGlwcyIgZG9lcyBub3QgRmFpbCApICAgICovCisvKiAgICAgICAgICAtIERvbid0IElzc3VlIEludGVybmFsIEZGREMgQ29tbWFuZCBpZiB0aGVyZSBhcmUgQWN0aXZlIENvbW1hbmRzICovCisvKiAgICAgICAgICAtIENsb3NlIFdpbmRvdyBmb3IgZ2V0dGluZyB0b28gbWFueSBJT0NUTCdzIGFjdGl2ZSAgICAgICAgICAgICAgICovCisvKiA0LjgwLjAwICAtIE1ha2UgaWE2NCBTYWZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA0LjgwLjA0ICAtIEVsaW1pbmF0ZSBjYWxscyB0byBzdHJ0b2soKSBpZiAyLjQueCBvciBncmVhdGVyICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAtIEFkanVzdG1lbnRzIHRvIERldmljZSBRdWV1ZSBEZXB0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA0LjgwLjE0ICAtIFRha2UgYWxsIHNlbWFwaG9yZXMgb2ZmIHN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAtIENsZWFuIFVwIE5ld19JT0NUTCBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA0LjgwLjIwICAtIFNldCBtYXhfc2VjdG9ycyBpbiBTY3NpX0hvc3Qgc3RydWN0dXJlICggaWYgPj0gMi40Ljcga2VybmVsICkgICovCisvKiAgICAgICAgICAtIDUgc2Vjb25kIGRlbGF5IG5lZWRlZCBhZnRlciByZXNldHRpbmcgYW4gaTk2MCBhZGFwdGVyICAgICAgICAgICovCisvKiA0LjgwLjI2ICAtIENsZWFuIHVwIHBvdGVudGlhbCBjb2RlIHByb2JsZW1zICggQXJqYW4ncyByZWNvbW1lbmRhdGlvbnMgKSAgICovCisvKiA0LjkwLjAxICAtIFZlcnNpb24gTWF0Y2hpbmcgZm9yIEZpcm1XYXJlLCBCSU9TLCBhbmQgRHJpdmVyICAgICAgICAgICAgICAgICovCisvKiA0LjkwLjA1ICAtIFVzZSBOZXcgUENJIEFyY2hpdGVjdHVyZSB0byBmYWNpbGl0YXRlIEhvdCBQbHVnIERldmVsb3BtZW50ICAgICovCisvKiA0LjkwLjA4ICAtIEluY3JlYXNlIERlbGF5cyBpbiBGbGFzaGluZyAoIFRyb21ib25lIE9ubHkgLSA0SCApICAgICAgICAgICAgICovCisvKiA0LjkwLjA4ICAtIERhdGEgQ29ycnVwdGlvbiBpZiBGaXJzdCBTY2F0dGVyIEdhdGhlciBFbGVtZW50IGlzID4gNjRLICAgICAgICovCisvKiA0LjkwLjExICAtIERvbid0IGFjdHVhbGx5IFJFU0VUIHVubGVzcyBpdCdzIHBoeXNpY2FsbHkgcmVxdWlyZWQgICAgICAgICAgICovCisvKiAgICAgICAgICAtIFJlbW92ZSB1bnVzZWQgY29tcGlsZSBvcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA1LjAwLjAxICAtIFNhcmFzb3RhICggNWkgKSBhZGFwdGVycyBtdXN0IGFsd2F5cyBiZSBzY2FubmVkIGZpcnN0ICAgICAgICAgICovCisvKiAgICAgICAgICAtIEdldCByaWQgb24gSU9DVExfTkVXX0NPTU1BTkQgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAtIEFkZCBFeHRlbmRlZCBEQ0RCIENvbW1hbmRzIGZvciBUYXBlIFN1cHBvcnQgaW4gNUkgICAgICAgICAgICAgICovCisvKiA1LjEwLjEyICAtIHVzZSBwY2lfZG1hIGludGVyZmFjZXMsIHVwZGF0ZSBmb3IgMi41IGtlcm5lbCBjaGFuZ2VzICAgICAgICAgICovCisvKiA1LjEwLjE1ICAtIHJlbW92ZSB1bnVzZWQgY29kZSAoc2VtLCBtYWNyb3MsIGV0Yy4pICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA1LjMwLjAwICAtIHVzZSBfX2RldmV4aXRfcCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA2LjAwLjAwICAtIEFkZCA2eCBBZGFwdGVycyBhbmQgQmF0dGVyeSBGbGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA2LjEwLjAwICAtIFJlbW92ZSAxRyBBZGRyZXNzaW5nIExpbWl0YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA2LjExLnh4ICAtIEdldCBWZXJzaW9uSW5mbyBidWZmZXIgb2ZmIHRoZSBzdGFjayAhICAgICAgICAgICAgICBERFRTIDYwNDAxICovCisvKiA2LjExLnh4ICAtIE1ha2UgTG9naWNhbCBEcml2ZSBJbmZvIHN0cnVjdHVyZSBzYWZlIGZvciBETUEgICAgICBERFRTIDYwNjM5ICovCisvKiA3LjEwLnh4ICAtIEFkZCBoaWdobWVtX2lvIGZsYWcgaW4gU0NTSSBUZW1wbGV0ZSBmb3IgMi40IGtlcm5lbHMgICAgICAgICAgICovCisvKiAgICAgICAgICAtIEZpeCBwYXRoL25hbWUgZm9yIHNjc2lfaG9zdHMuaCBpbmNsdWRlIGZvciAyLjYga2VybmVscyAgICAgICAgICovCisvKiAgICAgICAgICAtIEZpeCBzb3J0IG9yZGVyIG9mIDdrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAtIFJlbW92ZSAzIHVudXNlZCAiaW5saW5lIiBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb25kaXRpb25hbCBDb21waWxhdGlvbiBkaXJlY3RpdmVzIGZvciB0aGlzIGRyaXZlcjoKKyAqCisgKiBJUFNfREVCVUcgICAgICAgICAgICAtIFR1cm4gb24gZGVidWdnaW5nIGluZm8KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGRlYnVnOjxudW1iZXI+ICAgICAgIC0gU2V0IGRlYnVnIGxldmVsIHRvIDxudW1iZXI+CisgKiAgICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IG9ubHkgd29ya3Mgd2hlbiBJUFNfREVCVUcgY29tcGlsZSBkaXJlY3RpdmUgaXMgdXNlZC4KKyAqICAgICAgIDEgICAgICAgICAgICAgIC0gTm9ybWFsIGRlYnVnIG1lc3NhZ2VzCisgKiAgICAgICAyICAgICAgICAgICAgICAtIFZlcmJvc2UgZGVidWcgbWVzc2FnZXMKKyAqICAgICAgIDExICAgICAgICAgICAgIC0gTWV0aG9kIHRyYWNlIChub24gaW50ZXJydXB0KQorICogICAgICAgMTIgICAgICAgICAgICAgLSBNZXRob2QgdHJhY2UgKGluY2x1ZGVzIGludGVycnVwdCkKKyAqCisgKiBub2kybyAgICAgICAgICAgICAgICAtIERvbid0IHVzZSBJMk8gUXVldWVzIChTZXJ2ZVJBSUQgNCBvbmx5KQorICogbm9tbWFwICAgICAgICAgICAgICAgLSBEb24ndCB1c2UgbWVtb3J5IG1hcHBlZCBJL08KKyAqIGlvY3Rsc2l6ZSAgICAgICAgICAgIC0gSW5pdGlhbCBzaXplIG9mIHRoZSBJT0NUTCBidWZmZXIKKyAqLworCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPHNjc2kvc2cuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNpbmNsdWRlICJob3N0cy5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJpcHMuaCIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKworI2lmZGVmIE1PRFVMRQorc3RhdGljIGNoYXIgKmlwcyA9IE5VTEw7Cittb2R1bGVfcGFyYW0oaXBzLCBjaGFycCwgMCk7CisjZW5kaWYKKworLyoKKyAqIERSSVZFUl9WRVIKKyAqLworI2RlZmluZSBJUFNfVkVSU0lPTl9ISUdIICAgICAgICAiNy4xMCIKKyNkZWZpbmUgSVBTX1ZFUlNJT05fTE9XICAgICAgICAgIi4xOCAiCisKKyNpZiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX19pYTY0X18pICYmICFkZWZpbmVkKF9feDg2XzY0X18pCisjd2FybmluZyAiVGhpcyBkcml2ZXIgaGFzIG9ubHkgYmVlbiB0ZXN0ZWQgb24gdGhlIHg4Ni9pYTY0L3g4Nl82NCBwbGF0Zm9ybXMiCisjZW5kaWYKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNpbmNsdWRlIDxsaW51eC9ibGsuaD4KKyNpbmNsdWRlICJzZC5oIgorI2RlZmluZSBJUFNfU0dfQUREUkVTUyhzZykgICAgICAgKChzZyktPmFkZHJlc3MpCisjZGVmaW5lIElQU19MT0NLX1NBVkUobG9jayxmbGFncykgc3Bpbl9sb2NrX2lycXNhdmUoJmlvX3JlcXVlc3RfbG9jayxmbGFncykKKyNkZWZpbmUgSVBTX1VOTE9DS19SRVNUT1JFKGxvY2ssZmxhZ3MpIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvX3JlcXVlc3RfbG9jayxmbGFncykKKyNpZm5kZWYgX19kZXZleGl0X3AKKyNkZWZpbmUgX19kZXZleGl0X3AoeCkgeAorI2VuZGlmCisjZWxzZQorI2RlZmluZSBJUFNfU0dfQUREUkVTUyhzZykgICAgICAocGFnZV9hZGRyZXNzKChzZyktPnBhZ2UpID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlX2FkZHJlc3MoKHNnKS0+cGFnZSkrKHNnKS0+b2Zmc2V0IDogTlVMTCkKKyNkZWZpbmUgSVBTX0xPQ0tfU0FWRShsb2NrLGZsYWdzKSBkb3tzcGluX2xvY2sobG9jayk7KHZvaWQpZmxhZ3M7fXdoaWxlKDApCisjZGVmaW5lIElQU19VTkxPQ0tfUkVTVE9SRShsb2NrLGZsYWdzKSBkb3tzcGluX3VubG9jayhsb2NrKTsodm9pZClmbGFnczt9d2hpbGUoMCkKKyNlbmRpZgorCisjZGVmaW5lIElQU19ETUFfRElSKHNjYikgKCghc2NiLT5zY3NpX2NtZCB8fCBpcHNfaXNfcGFzc3RocnUoc2NiLT5zY3NpX2NtZCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFNDU0lfREFUQV9OT05FID09IHNjYi0+c2NzaV9jbWQtPnNjX2RhdGFfZGlyZWN0aW9uKSA/IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc2NzaV90b19wY2lfZG1hX2RpcihzY2ItPnNjc2lfY21kLT5zY19kYXRhX2RpcmVjdGlvbikpCisKKyNpZmRlZiBJUFNfREVCVUcKKyNkZWZpbmUgTUVUSE9EX1RSQUNFKHMsIGkpICAgIGlmIChpcHNfZGVidWcgPj0gKGkrMTApKSBwcmludGsoS0VSTl9OT1RJQ0UgcyAiXG4iKTsKKyNkZWZpbmUgREVCVUcoaSwgcykgICAgICAgICAgIGlmIChpcHNfZGVidWcgPj0gaSkgcHJpbnRrKEtFUk5fTk9USUNFIHMgIlxuIik7CisjZGVmaW5lIERFQlVHX1ZBUihpLCBzLCB2Li4uKSBpZiAoaXBzX2RlYnVnID49IGkpIHByaW50ayhLRVJOX05PVElDRSBzICJcbiIsIHYpOworI2Vsc2UKKyNkZWZpbmUgTUVUSE9EX1RSQUNFKHMsIGkpCisjZGVmaW5lIERFQlVHKGksIHMpCisjZGVmaW5lIERFQlVHX1ZBUihpLCBzLCB2Li4uKQorI2VuZGlmCisKKy8qCisgKiBGdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KK3N0YXRpYyBpbnQgaXBzX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKik7CitzdGF0aWMgaW50IGlwc19yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgaW50IGlwc19laF9hYm9ydChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IGlwc19laF9yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IGlwc19xdWV1ZShTY3NpX0NtbmQgKiwgdm9pZCAoKikoU2NzaV9DbW5kICopKTsKK3N0YXRpYyBjb25zdCBjaGFyICppcHNfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIGlycXJldHVybl90IGRvX2lwc2ludHIoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIGludCBpcHNfaGFpbml0KGlwc19oYV90ICopOworc3RhdGljIGludCBpcHNfbWFwX3N0YXR1cyhpcHNfaGFfdCAqLCBpcHNfc2NiX3QgKiwgaXBzX3N0YXRfdCAqKTsKK3N0YXRpYyBpbnQgaXBzX3NlbmRfd2FpdChpcHNfaGFfdCAqLCBpcHNfc2NiX3QgKiwgaW50LCBpbnQpOworc3RhdGljIGludCBpcHNfc2VuZF9jbWQoaXBzX2hhX3QgKiwgaXBzX3NjYl90ICopOworc3RhdGljIGludCBpcHNfb25saW5lKGlwc19oYV90ICosIGlwc19zY2JfdCAqKTsKK3N0YXRpYyBpbnQgaXBzX2lucXVpcnkoaXBzX2hhX3QgKiwgaXBzX3NjYl90ICopOworc3RhdGljIGludCBpcHNfcmRjYXAoaXBzX2hhX3QgKiwgaXBzX3NjYl90ICopOworc3RhdGljIGludCBpcHNfbXNlbnNlKGlwc19oYV90ICosIGlwc19zY2JfdCAqKTsKK3N0YXRpYyBpbnQgaXBzX3JlcXNlbihpcHNfaGFfdCAqLCBpcHNfc2NiX3QgKik7CitzdGF0aWMgaW50IGlwc19kZWFsbG9jYXRlc2NicyhpcHNfaGFfdCAqLCBpbnQpOworc3RhdGljIGludCBpcHNfYWxsb2NhdGVzY2JzKGlwc19oYV90ICopOworc3RhdGljIGludCBpcHNfcmVzZXRfY29wcGVyaGVhZChpcHNfaGFfdCAqKTsKK3N0YXRpYyBpbnQgaXBzX3Jlc2V0X2NvcHBlcmhlYWRfbWVtaW8oaXBzX2hhX3QgKik7CitzdGF0aWMgaW50IGlwc19yZXNldF9tb3JwaGV1cyhpcHNfaGFfdCAqKTsKK3N0YXRpYyBpbnQgaXBzX2lzc3VlX2NvcHBlcmhlYWQoaXBzX2hhX3QgKiwgaXBzX3NjYl90ICopOworc3RhdGljIGludCBpcHNfaXNzdWVfY29wcGVyaGVhZF9tZW1pbyhpcHNfaGFfdCAqLCBpcHNfc2NiX3QgKik7CitzdGF0aWMgaW50IGlwc19pc3N1ZV9pMm8oaXBzX2hhX3QgKiwgaXBzX3NjYl90ICopOworc3RhdGljIGludCBpcHNfaXNzdWVfaTJvX21lbWlvKGlwc19oYV90ICosIGlwc19zY2JfdCAqKTsKK3N0YXRpYyBpbnQgaXBzX2lzaW50cl9jb3BwZXJoZWFkKGlwc19oYV90ICopOworc3RhdGljIGludCBpcHNfaXNpbnRyX2NvcHBlcmhlYWRfbWVtaW8oaXBzX2hhX3QgKik7CitzdGF0aWMgaW50IGlwc19pc2ludHJfbW9ycGhldXMoaXBzX2hhX3QgKik7CitzdGF0aWMgaW50IGlwc193YWl0KGlwc19oYV90ICosIGludCwgaW50KTsKK3N0YXRpYyBpbnQgaXBzX3dyaXRlX2RyaXZlcl9zdGF0dXMoaXBzX2hhX3QgKiwgaW50KTsKK3N0YXRpYyBpbnQgaXBzX3JlYWRfYWRhcHRlcl9zdGF0dXMoaXBzX2hhX3QgKiwgaW50KTsKK3N0YXRpYyBpbnQgaXBzX3JlYWRfc3Vic3lzdGVtX3BhcmFtZXRlcnMoaXBzX2hhX3QgKiwgaW50KTsKK3N0YXRpYyBpbnQgaXBzX3JlYWRfY29uZmlnKGlwc19oYV90ICosIGludCk7CitzdGF0aWMgaW50IGlwc19jbGVhcl9hZGFwdGVyKGlwc19oYV90ICosIGludCk7CitzdGF0aWMgaW50IGlwc19yZWFkd3JpdGVfcGFnZTUoaXBzX2hhX3QgKiwgaW50LCBpbnQpOworc3RhdGljIGludCBpcHNfaW5pdF9jb3BwZXJoZWFkKGlwc19oYV90ICopOworc3RhdGljIGludCBpcHNfaW5pdF9jb3BwZXJoZWFkX21lbWlvKGlwc19oYV90ICopOworc3RhdGljIGludCBpcHNfaW5pdF9tb3JwaGV1cyhpcHNfaGFfdCAqKTsKK3N0YXRpYyBpbnQgaXBzX2lzaW5pdF9jb3BwZXJoZWFkKGlwc19oYV90ICopOworc3RhdGljIGludCBpcHNfaXNpbml0X2NvcHBlcmhlYWRfbWVtaW8oaXBzX2hhX3QgKik7CitzdGF0aWMgaW50IGlwc19pc2luaXRfbW9ycGhldXMoaXBzX2hhX3QgKik7CitzdGF0aWMgaW50IGlwc19lcmFzZV9iaW9zKGlwc19oYV90ICopOworc3RhdGljIGludCBpcHNfcHJvZ3JhbV9iaW9zKGlwc19oYV90ICosIGNoYXIgKiwgdWludDMyX3QsIHVpbnQzMl90KTsKK3N0YXRpYyBpbnQgaXBzX3ZlcmlmeV9iaW9zKGlwc19oYV90ICosIGNoYXIgKiwgdWludDMyX3QsIHVpbnQzMl90KTsKK3N0YXRpYyBpbnQgaXBzX2VyYXNlX2Jpb3NfbWVtaW8oaXBzX2hhX3QgKik7CitzdGF0aWMgaW50IGlwc19wcm9ncmFtX2Jpb3NfbWVtaW8oaXBzX2hhX3QgKiwgY2hhciAqLCB1aW50MzJfdCwgdWludDMyX3QpOworc3RhdGljIGludCBpcHNfdmVyaWZ5X2Jpb3NfbWVtaW8oaXBzX2hhX3QgKiwgY2hhciAqLCB1aW50MzJfdCwgdWludDMyX3QpOworc3RhdGljIGludCBpcHNfZmxhc2hfY29wcGVyaGVhZChpcHNfaGFfdCAqLCBpcHNfcGFzc3RocnVfdCAqLCBpcHNfc2NiX3QgKik7CitzdGF0aWMgaW50IGlwc19mbGFzaF9iaW9zKGlwc19oYV90ICosIGlwc19wYXNzdGhydV90ICosIGlwc19zY2JfdCAqKTsKK3N0YXRpYyBpbnQgaXBzX2ZsYXNoX2Zpcm13YXJlKGlwc19oYV90ICosIGlwc19wYXNzdGhydV90ICosIGlwc19zY2JfdCAqKTsKK3N0YXRpYyB2b2lkIGlwc19mcmVlX2ZsYXNoX2NvcHBlcmhlYWQoaXBzX2hhX3QgKiBoYSk7CitzdGF0aWMgdm9pZCBpcHNfZ2V0X2Jpb3NfdmVyc2lvbihpcHNfaGFfdCAqLCBpbnQpOworc3RhdGljIHZvaWQgaXBzX2lkZW50aWZ5X2NvbnRyb2xsZXIoaXBzX2hhX3QgKik7CitzdGF0aWMgdm9pZCBpcHNfY2hrc3RhdHVzKGlwc19oYV90ICosIElQU19TVEFUVVMgKik7CitzdGF0aWMgdm9pZCBpcHNfZW5hYmxlX2ludF9jb3BwZXJoZWFkKGlwc19oYV90ICopOworc3RhdGljIHZvaWQgaXBzX2VuYWJsZV9pbnRfY29wcGVyaGVhZF9tZW1pbyhpcHNfaGFfdCAqKTsKK3N0YXRpYyB2b2lkIGlwc19lbmFibGVfaW50X21vcnBoZXVzKGlwc19oYV90ICopOworc3RhdGljIGludCBpcHNfaW50cl9jb3BwZXJoZWFkKGlwc19oYV90ICopOworc3RhdGljIGludCBpcHNfaW50cl9tb3JwaGV1cyhpcHNfaGFfdCAqKTsKK3N0YXRpYyB2b2lkIGlwc19uZXh0KGlwc19oYV90ICosIGludCk7CitzdGF0aWMgdm9pZCBpcHNpbnRyX2Jsb2NraW5nKGlwc19oYV90ICosIHN0cnVjdCBpcHNfc2NiICopOworc3RhdGljIHZvaWQgaXBzaW50cl9kb25lKGlwc19oYV90ICosIHN0cnVjdCBpcHNfc2NiICopOworc3RhdGljIHZvaWQgaXBzX2RvbmUoaXBzX2hhX3QgKiwgaXBzX3NjYl90ICopOworc3RhdGljIHZvaWQgaXBzX2ZyZWUoaXBzX2hhX3QgKik7CitzdGF0aWMgdm9pZCBpcHNfaW5pdF9zY2IoaXBzX2hhX3QgKiwgaXBzX3NjYl90ICopOworc3RhdGljIHZvaWQgaXBzX2ZyZWVzY2IoaXBzX2hhX3QgKiwgaXBzX3NjYl90ICopOworc3RhdGljIHZvaWQgaXBzX3NldHVwX2Z1bmNsaXN0KGlwc19oYV90ICopOworc3RhdGljIHZvaWQgaXBzX3N0YXRpbml0KGlwc19oYV90ICopOworc3RhdGljIHZvaWQgaXBzX3N0YXRpbml0X21lbWlvKGlwc19oYV90ICopOworc3RhdGljIHZvaWQgaXBzX2ZpeF9mZmRjX3RpbWUoaXBzX2hhX3QgKiwgaXBzX3NjYl90ICosIHRpbWVfdCk7CitzdGF0aWMgdm9pZCBpcHNfZmZkY19yZXNldChpcHNfaGFfdCAqLCBpbnQpOworc3RhdGljIHZvaWQgaXBzX2ZmZGNfdGltZShpcHNfaGFfdCAqKTsKK3N0YXRpYyB1aW50MzJfdCBpcHNfc3RhdHVwZF9jb3BwZXJoZWFkKGlwc19oYV90ICopOworc3RhdGljIHVpbnQzMl90IGlwc19zdGF0dXBkX2NvcHBlcmhlYWRfbWVtaW8oaXBzX2hhX3QgKik7CitzdGF0aWMgdWludDMyX3QgaXBzX3N0YXR1cGRfbW9ycGhldXMoaXBzX2hhX3QgKik7CitzdGF0aWMgaXBzX3NjYl90ICppcHNfZ2V0c2NiKGlwc19oYV90ICopOworc3RhdGljIHZvaWQgaXBzX3B1dHFfc2NiX2hlYWQoaXBzX3NjYl9xdWV1ZV90ICosIGlwc19zY2JfdCAqKTsKK3N0YXRpYyB2b2lkIGlwc19wdXRxX3dhaXRfdGFpbChpcHNfd2FpdF9xdWV1ZV90ICosIFNjc2lfQ21uZCAqKTsKK3N0YXRpYyB2b2lkIGlwc19wdXRxX2NvcHBfdGFpbChpcHNfY29wcF9xdWV1ZV90ICosCisJCQkJICAgICAgaXBzX2NvcHBfd2FpdF9pdGVtX3QgKik7CitzdGF0aWMgaXBzX3NjYl90ICppcHNfcmVtb3ZlcV9zY2JfaGVhZChpcHNfc2NiX3F1ZXVlX3QgKik7CitzdGF0aWMgaXBzX3NjYl90ICppcHNfcmVtb3ZlcV9zY2IoaXBzX3NjYl9xdWV1ZV90ICosIGlwc19zY2JfdCAqKTsKK3N0YXRpYyBTY3NpX0NtbmQgKmlwc19yZW1vdmVxX3dhaXRfaGVhZChpcHNfd2FpdF9xdWV1ZV90ICopOworc3RhdGljIFNjc2lfQ21uZCAqaXBzX3JlbW92ZXFfd2FpdChpcHNfd2FpdF9xdWV1ZV90ICosIFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpcHNfY29wcF93YWl0X2l0ZW1fdCAqaXBzX3JlbW92ZXFfY29wcChpcHNfY29wcF9xdWV1ZV90ICosCisJCQkJCQkgICAgIGlwc19jb3BwX3dhaXRfaXRlbV90ICopOworc3RhdGljIGlwc19jb3BwX3dhaXRfaXRlbV90ICppcHNfcmVtb3ZlcV9jb3BwX2hlYWQoaXBzX2NvcHBfcXVldWVfdCAqKTsKKworc3RhdGljIGludCBpcHNfaXNfcGFzc3RocnUoU2NzaV9DbW5kICopOworc3RhdGljIGludCBpcHNfbWFrZV9wYXNzdGhydShpcHNfaGFfdCAqLCBTY3NpX0NtbmQgKiwgaXBzX3NjYl90ICosIGludCk7CitzdGF0aWMgaW50IGlwc191c3JjbWQoaXBzX2hhX3QgKiwgaXBzX3Bhc3N0aHJ1X3QgKiwgaXBzX3NjYl90ICopOworc3RhdGljIHZvaWQgaXBzX2NsZWFudXBfcGFzc3RocnUoaXBzX2hhX3QgKiwgaXBzX3NjYl90ICopOworc3RhdGljIHZvaWQgaXBzX3NjbWRfYnVmX3dyaXRlKFNjc2lfQ21uZCAqIHNjbWQsIHZvaWQgKmRhdGEsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIGlwc19zY21kX2J1Zl9yZWFkKFNjc2lfQ21uZCAqIHNjbWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7CisKK3N0YXRpYyBpbnQgaXBzX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50KTsKK3N0YXRpYyBpbnQgaXBzX2hvc3RfaW5mbyhpcHNfaGFfdCAqLCBjaGFyICosIG9mZl90LCBpbnQpOworc3RhdGljIHZvaWQgY29weV9tZW1faW5mbyhJUFNfSU5GT1NUUiAqLCBjaGFyICosIGludCk7CitzdGF0aWMgaW50IGNvcHlfaW5mbyhJUFNfSU5GT1NUUiAqLCBjaGFyICosIC4uLik7CitzdGF0aWMgaW50IGlwc19nZXRfdmVyc2lvbl9pbmZvKGlwc19oYV90ICogaGEsIGRtYV9hZGRyX3QsIGludCBpbnRyKTsKK3N0YXRpYyB2b2lkIGlwc192ZXJzaW9uX2NoZWNrKGlwc19oYV90ICogaGEsIGludCBpbnRyKTsKK3N0YXRpYyBpbnQgaXBzX2Fib3J0X2luaXQoaXBzX2hhX3QgKiBoYSwgaW50IGluZGV4KTsKK3N0YXRpYyBpbnQgaXBzX2luaXRfcGhhc2UyKGludCBpbmRleCk7CisKK3N0YXRpYyBpbnQgaXBzX2luaXRfcGhhc2UxKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBpbnQgKmluZGV4UHRyKTsKK3N0YXRpYyBpbnQgaXBzX3JlZ2lzdGVyX3Njc2koaW50IGluZGV4KTsKKworLyoKKyAqIGdsb2JhbCB2YXJpYWJsZXMKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgaXBzX25hbWVbXSA9ICJpcHMiOworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKmlwc19zaFtJUFNfTUFYX0FEQVBURVJTXTsJLyogQXJyYXkgb2YgaG9zdCBjb250cm9sbGVyIHN0cnVjdHVyZXMgKi8KK3N0YXRpYyBpcHNfaGFfdCAqaXBzX2hhW0lQU19NQVhfQURBUFRFUlNdOwkvKiBBcnJheSBvZiBIQSBzdHJ1Y3R1cmVzICovCitzdGF0aWMgdW5zaWduZWQgaW50IGlwc19uZXh0X2NvbnRyb2xsZXI7CitzdGF0aWMgdW5zaWduZWQgaW50IGlwc19udW1fY29udHJvbGxlcnM7CitzdGF0aWMgdW5zaWduZWQgaW50IGlwc19yZWxlYXNlZF9jb250cm9sbGVyczsKK3N0YXRpYyBpbnQgaXBzX2hvdHBsdWc7CitzdGF0aWMgaW50IGlwc19jbWRfdGltZW91dCA9IDYwOworc3RhdGljIGludCBpcHNfcmVzZXRfdGltZW91dCA9IDYwICogNTsKK3N0YXRpYyBpbnQgaXBzX2ZvcmNlX21lbWlvID0gMTsJCS8qIEFsd2F5cyB1c2UgTWVtb3J5IE1hcHBlZCBJL08gICAgKi8KK3N0YXRpYyBpbnQgaXBzX2ZvcmNlX2kybyA9IDE7CS8qIEFsd2F5cyB1c2UgSTJPIGNvbW1hbmQgZGVsaXZlcnkgKi8KK3N0YXRpYyBpbnQgaXBzX2lvY3Rsc2l6ZSA9IElQU19JT0NUTF9TSVpFOwkvKiBTaXplIG9mIHRoZSBpb2N0bCBidWZmZXIgICAgICAgICovCitzdGF0aWMgaW50IGlwc19jZF9ib290OwkJCS8qIEJvb3RpbmcgZnJvbSBNYW5hZ2VyIENEICAgICAgICAgKi8KK3N0YXRpYyBjaGFyICppcHNfRmxhc2hEYXRhID0gTlVMTDsJLyogQ0QgQm9vdCAtIEZsYXNoIERhdGEgQnVmZmVyICAgICAgKi8KK3N0YXRpYyBkbWFfYWRkcl90IGlwc19mbGFzaGJ1c2FkZHI7CitzdGF0aWMgbG9uZyBpcHNfRmxhc2hEYXRhSW5Vc2U7CQkvKiBDRCBCb290IC0gRmxhc2ggRGF0YSBJbiBVc2UgRmxhZyAqLworc3RhdGljIHVpbnQzMl90IE1heExpdGVDbWRzID0gMzI7CS8qIE1heCBBY3RpdmUgQ21kcyBmb3IgYSBMaXRlIEFkYXB0ZXIgKi8KK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgaXBzX2RyaXZlcl90ZW1wbGF0ZSA9IHsKKwkuZGV0ZWN0CQkJPSBpcHNfZGV0ZWN0LAorCS5yZWxlYXNlCQk9IGlwc19yZWxlYXNlLAorCS5pbmZvCQkJPSBpcHNfaW5mbywKKwkucXVldWVjb21tYW5kCQk9IGlwc19xdWV1ZSwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IGlwc19laF9hYm9ydCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCT0gaXBzX2VoX3Jlc2V0LAorCS5wcm9jX25hbWUJCT0gImlwcyIsCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJLnByb2NfaW5mbwkJPSBpcHNfcHJvY19pbmZvLAorCS5zbGF2ZV9jb25maWd1cmUJPSBpcHNfc2xhdmVfY29uZmlndXJlLAorI2Vsc2UKKwkucHJvY19pbmZvCQk9IGlwc19wcm9jMjRfaW5mbywKKwkuc2VsZWN0X3F1ZXVlX2RlcHRocwk9IGlwc19zZWxlY3RfcXVldWVfZGVwdGgsCisjZW5kaWYKKwkuYmlvc19wYXJhbQkJPSBpcHNfYmlvc3BhcmFtLAorCS50aGlzX2lkCQk9IC0xLAorCS5zZ190YWJsZXNpemUJCT0gSVBTX01BWF9TRywKKwkuY21kX3Blcl9sdW4JCT0gMywKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJLnVzZV9uZXdfZWhfY29kZQk9IDEsCisjZW5kaWYKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKSAgJiYgIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorICAgIC5oaWdobWVtX2lvICAgICAgICAgID0gMSwgICAKKyNlbmRpZgorfTsKKworc3RhdGljIElQU19ERUZJTkVfQ09NUEFUX1RBQkxFKCBDb21wYXRhYmxlICk7CS8qIFZlcnNpb24gQ29tcGF0YWJpbGl0eSBUYWJsZSAgICAgICovCisKKworLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIFNlcnZlUkFJRCBBZGFwdGVycyAqLworc3RhdGljIHN0cnVjdCAgcGNpX2RldmljZV9pZCAgaXBzX3BjaV90YWJsZVtdID0geworCXsgMHgxMDE0LCAweDAwMkUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAgfSwKKwl7IDB4MTAxNCwgMHgwMUJELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwIH0sCisJeyAweDkwMDUsIDB4MDI1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSggcGNpLCBpcHNfcGNpX3RhYmxlICk7CisKK3N0YXRpYyBjaGFyIGlwc19ob3RfcGx1Z19uYW1lW10gPSAiaXBzIjsKKyAgIAorc3RhdGljIGludCBfX2RldmluaXQgIGlwc19pbnNlcnRfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpcHNfcmVtb3ZlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldik7CisgICAKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpcHNfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBpcHNfaG90X3BsdWdfbmFtZSwKKwkuaWRfdGFibGUJPSBpcHNfcGNpX3RhYmxlLAorCS5wcm9iZQkJPSBpcHNfaW5zZXJ0X2RldmljZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGlwc19yZW1vdmVfZGV2aWNlKSwKK307CisgICAgICAgICAgIAorCisvKgorICogTmVjZXNzYXJ5IGZvcndhcmQgZnVuY3Rpb24gcHJvdG95cGVzCisgKi8KK3N0YXRpYyBpbnQgaXBzX2hhbHQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdWxvbmcgZXZlbnQsIHZvaWQgKmJ1Zik7CisKKyNkZWZpbmUgTUFYX0FEQVBURVJfTkFNRSAxNQorCitzdGF0aWMgY2hhciBpcHNfYWRhcHRlcl9uYW1lW11bMzBdID0geworCSJTZXJ2ZVJBSUQiLAorCSJTZXJ2ZVJBSUQgSUkiLAorCSJTZXJ2ZVJBSUQgb24gbW90aGVyYm9hcmQiLAorCSJTZXJ2ZVJBSUQgb24gbW90aGVyYm9hcmQiLAorCSJTZXJ2ZVJBSUQgM0giLAorCSJTZXJ2ZVJBSUQgM0wiLAorCSJTZXJ2ZVJBSUQgNEgiLAorCSJTZXJ2ZVJBSUQgNE0iLAorCSJTZXJ2ZVJBSUQgNEwiLAorCSJTZXJ2ZVJBSUQgNE14IiwKKwkiU2VydmVSQUlEIDRMeCIsCisJIlNlcnZlUkFJRCA1aSIsCisJIlNlcnZlUkFJRCA1aSIsCisJIlNlcnZlUkFJRCA2TSIsCisJIlNlcnZlUkFJRCA2aSIsCisJIlNlcnZlUkFJRCA3dCIsCisJIlNlcnZlUkFJRCA3ayIsCisJIlNlcnZlUkFJRCA3TSIKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaXBzX25vdGlmaWVyID0geworCWlwc19oYWx0LCBOVUxMLCAwCit9OworCisvKgorICogRGlyZWN0aW9uIHRhYmxlCisgKi8KK3N0YXRpYyBjaGFyIGlwc19jb21tYW5kX2RpcmVjdGlvbltdID0geworCUlQU19EQVRBX05PTkUsIElQU19EQVRBX05PTkUsIElQU19EQVRBX0lOLCBJUFNfREFUQV9JTiwgSVBTX0RBVEFfT1VULAorCUlQU19EQVRBX0lOLCBJUFNfREFUQV9JTiwgSVBTX0RBVEFfT1VULCBJUFNfREFUQV9JTiwgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX09VVCwgSVBTX0RBVEFfT1VULCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX0lOLCBJUFNfREFUQV9OT05FLCBJUFNfREFUQV9OT05FLCBJUFNfREFUQV9JTiwgSVBTX0RBVEFfT1VULAorCUlQU19EQVRBX0lOLCBJUFNfREFUQV9PVVQsIElQU19EQVRBX05PTkUsIElQU19EQVRBX05PTkUsIElQU19EQVRBX09VVCwKKwlJUFNfREFUQV9OT05FLCBJUFNfREFUQV9JTiwgSVBTX0RBVEFfTk9ORSwgSVBTX0RBVEFfSU4sIElQU19EQVRBX09VVCwKKwlJUFNfREFUQV9OT05FLCBJUFNfREFUQV9VTkssIElQU19EQVRBX0lOLCBJUFNfREFUQV9VTkssIElQU19EQVRBX0lOLAorCUlQU19EQVRBX1VOSywgSVBTX0RBVEFfT1VULCBJUFNfREFUQV9JTiwgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfSU4sIElQU19EQVRBX0lOLCBJUFNfREFUQV9PVVQsIElQU19EQVRBX05PTkUsIElQU19EQVRBX1VOSywKKwlJUFNfREFUQV9JTiwgSVBTX0RBVEFfT1VULCBJUFNfREFUQV9PVVQsIElQU19EQVRBX09VVCwgSVBTX0RBVEFfT1VULAorCUlQU19EQVRBX09VVCwgSVBTX0RBVEFfTk9ORSwgSVBTX0RBVEFfSU4sIElQU19EQVRBX05PTkUsIElQU19EQVRBX05PTkUsCisJSVBTX0RBVEFfSU4sIElQU19EQVRBX09VVCwgSVBTX0RBVEFfT1VULCBJUFNfREFUQV9PVVQsIElQU19EQVRBX09VVCwKKwlJUFNfREFUQV9JTiwgSVBTX0RBVEFfT1VULCBJUFNfREFUQV9JTiwgSVBTX0RBVEFfT1VULCBJUFNfREFUQV9PVVQsCisJSVBTX0RBVEFfT1VULCBJUFNfREFUQV9JTiwgSVBTX0RBVEFfSU4sIElQU19EQVRBX0lOLCBJUFNfREFUQV9OT05FLAorCUlQU19EQVRBX1VOSywgSVBTX0RBVEFfTk9ORSwgSVBTX0RBVEFfTk9ORSwgSVBTX0RBVEFfTk9ORSwgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX05PTkUsIElQU19EQVRBX09VVCwgSVBTX0RBVEFfSU4sIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX09VVCwgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX0lOLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfTk9ORSwgSVBTX0RBVEFfTk9ORSwgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9JTiwgSVBTX0RBVEFfTk9ORSwKKwlJUFNfREFUQV9PVVQsIElQU19EQVRBX1VOSywgSVBTX0RBVEFfTk9ORSwgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9PVVQsCisJSVBTX0RBVEFfT1VULCBJUFNfREFUQV9PVVQsIElQU19EQVRBX09VVCwgSVBTX0RBVEFfT1VULCBJUFNfREFUQV9OT05FLAorCUlQU19EQVRBX1VOSywgSVBTX0RBVEFfSU4sIElQU19EQVRBX09VVCwgSVBTX0RBVEFfSU4sIElQU19EQVRBX0lOLAorCUlQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfT1VULAorCUlQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19zZXR1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgc2V0dXAgcGFyYW1ldGVycyB0byB0aGUgZHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19zZXR1cChjaGFyICppcHNfc3RyKQoreworCisJaW50IGk7CisJY2hhciAqa2V5OworCWNoYXIgKnZhbHVlOworCUlQU19PUFRJT04gb3B0aW9uc1tdID0geworCQl7Im5vaTJvIiwgJmlwc19mb3JjZV9pMm8sIDB9LAorCQl7Im5vbW1hcCIsICZpcHNfZm9yY2VfbWVtaW8sIDB9LAorCQl7ImlvY3Rsc2l6ZSIsICZpcHNfaW9jdGxzaXplLCBJUFNfSU9DVExfU0laRX0sCisJCXsiY2Rib290IiwgJmlwc19jZF9ib290LCAwfSwKKwkJeyJtYXhjbWRzIiwgJk1heExpdGVDbWRzLCAzMn0sCisJfTsKKworCS8qIERvbid0IHVzZSBzdHJ0b2soKSBhbnltb3JlICggaWYgMi40IEtlcm5lbCBvciBiZXlvbmQgKSAqLworCS8qIFNlYXJjaCBmb3IgdmFsdWUgKi8KKwl3aGlsZSAoKGtleSA9IHN0cnNlcCgmaXBzX3N0ciwgIiwuIikpKSB7CisJCWlmICghKmtleSkKKwkJCWNvbnRpbnVlOworCQl2YWx1ZSA9IHN0cmNocihrZXksICc6Jyk7CisJCWlmICh2YWx1ZSkKKwkJCSp2YWx1ZSsrID0gJ1wwJzsKKwkJLyoKKwkJICogV2Ugbm93IGhhdmUga2V5L3ZhbHVlIHBhaXJzLgorCQkgKiBVcGRhdGUgdGhlIHZhcmlhYmxlcworCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IChzaXplb2YgKG9wdGlvbnMpIC8gc2l6ZW9mIChvcHRpb25zWzBdKSk7IGkrKykgeworCQkJaWYgKHN0cm5pY21wCisJCQkgICAgKGtleSwgb3B0aW9uc1tpXS5vcHRpb25fbmFtZSwKKwkJCSAgICAgc3RybGVuKG9wdGlvbnNbaV0ub3B0aW9uX25hbWUpKSA9PSAwKSB7CisJCQkJaWYgKHZhbHVlKQorCQkJCQkqb3B0aW9uc1tpXS5vcHRpb25fZmxhZyA9CisJCQkJCSAgICBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CisJCQkJZWxzZQorCQkJCQkqb3B0aW9uc1tpXS5vcHRpb25fZmxhZyA9CisJCQkJCSAgICBvcHRpb25zW2ldLm9wdGlvbl92YWx1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAoMSk7Cit9CisKK19fc2V0dXAoImlwcz0iLCBpcHNfc2V0dXApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfZGV0ZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIERldGVjdCBhbmQgaW5pdGlhbGl6ZSB0aGUgZHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URTogdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB1bmRlciB0aGUgaW9fcmVxdWVzdF9sb2NrIHNwaW5sb2NrICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKiBTSFQpCit7CisJaW50IGk7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19kZXRlY3QiLCAxKTsKKworI2lmZGVmIE1PRFVMRQorCWlmIChpcHMpCisJCWlwc19zZXR1cChpcHMpOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgaXBzX251bV9jb250cm9sbGVyczsgaSsrKSB7CisJCWlmIChpcHNfcmVnaXN0ZXJfc2NzaShpKSkKKwkJCWlwc19mcmVlKGlwc19oYVtpXSk7CisJCWlwc19yZWxlYXNlZF9jb250cm9sbGVycysrOworCX0KKwlpcHNfaG90cGx1ZyA9IDE7CisJcmV0dXJuIChpcHNfbnVtX2NvbnRyb2xsZXJzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgIGNvbmZpZ3VyZSB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgdG8gdXNlIHRoZSBmdW5jdGlvbnMgdGhhdCB3aWxsIHdvcmsgICAgKi8KKy8qICAgd2l0aCB0aGUgZm91bmQgdmVyc2lvbiBvZiB0aGUgYWRhcHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX3NldHVwX2Z1bmNsaXN0KGlwc19oYV90ICogaGEpCit7CisKKwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJICogU2V0dXAgRnVuY3Rpb25zCisJICovCisJaWYgKElQU19JU19NT1JQSEVVUyhoYSkgfHwgSVBTX0lTX01BUkNPKGhhKSkgeworCQkvKiBtb3JwaGV1cyAvIG1hcmNvIC8gc2VicmluZyAqLworCQloYS0+ZnVuYy5pc2ludHIgPSBpcHNfaXNpbnRyX21vcnBoZXVzOworCQloYS0+ZnVuYy5pc2luaXQgPSBpcHNfaXNpbml0X21vcnBoZXVzOworCQloYS0+ZnVuYy5pc3N1ZSA9IGlwc19pc3N1ZV9pMm9fbWVtaW87CisJCWhhLT5mdW5jLmluaXQgPSBpcHNfaW5pdF9tb3JwaGV1czsKKwkJaGEtPmZ1bmMuc3RhdHVwZCA9IGlwc19zdGF0dXBkX21vcnBoZXVzOworCQloYS0+ZnVuYy5yZXNldCA9IGlwc19yZXNldF9tb3JwaGV1czsKKwkJaGEtPmZ1bmMuaW50ciA9IGlwc19pbnRyX21vcnBoZXVzOworCQloYS0+ZnVuYy5lbmFibGVpbnQgPSBpcHNfZW5hYmxlX2ludF9tb3JwaGV1czsKKwl9IGVsc2UgaWYgKElQU19VU0VfTUVNSU8oaGEpKSB7CisJCS8qIGNvcHBlcmhlYWQgdy9NRU1JTyAqLworCQloYS0+ZnVuYy5pc2ludHIgPSBpcHNfaXNpbnRyX2NvcHBlcmhlYWRfbWVtaW87CisJCWhhLT5mdW5jLmlzaW5pdCA9IGlwc19pc2luaXRfY29wcGVyaGVhZF9tZW1pbzsKKwkJaGEtPmZ1bmMuaW5pdCA9IGlwc19pbml0X2NvcHBlcmhlYWRfbWVtaW87CisJCWhhLT5mdW5jLnN0YXR1cGQgPSBpcHNfc3RhdHVwZF9jb3BwZXJoZWFkX21lbWlvOworCQloYS0+ZnVuYy5zdGF0aW5pdCA9IGlwc19zdGF0aW5pdF9tZW1pbzsKKwkJaGEtPmZ1bmMucmVzZXQgPSBpcHNfcmVzZXRfY29wcGVyaGVhZF9tZW1pbzsKKwkJaGEtPmZ1bmMuaW50ciA9IGlwc19pbnRyX2NvcHBlcmhlYWQ7CisJCWhhLT5mdW5jLmVyYXNlYmlvcyA9IGlwc19lcmFzZV9iaW9zX21lbWlvOworCQloYS0+ZnVuYy5wcm9ncmFtYmlvcyA9IGlwc19wcm9ncmFtX2Jpb3NfbWVtaW87CisJCWhhLT5mdW5jLnZlcmlmeWJpb3MgPSBpcHNfdmVyaWZ5X2Jpb3NfbWVtaW87CisJCWhhLT5mdW5jLmVuYWJsZWludCA9IGlwc19lbmFibGVfaW50X2NvcHBlcmhlYWRfbWVtaW87CisJCWlmIChJUFNfVVNFX0kyT19ERUxJVkVSKGhhKSkKKwkJCWhhLT5mdW5jLmlzc3VlID0gaXBzX2lzc3VlX2kyb19tZW1pbzsKKwkJZWxzZQorCQkJaGEtPmZ1bmMuaXNzdWUgPSBpcHNfaXNzdWVfY29wcGVyaGVhZF9tZW1pbzsKKwl9IGVsc2UgeworCQkvKiBjb3BwZXJoZWFkICovCisJCWhhLT5mdW5jLmlzaW50ciA9IGlwc19pc2ludHJfY29wcGVyaGVhZDsKKwkJaGEtPmZ1bmMuaXNpbml0ID0gaXBzX2lzaW5pdF9jb3BwZXJoZWFkOworCQloYS0+ZnVuYy5pbml0ID0gaXBzX2luaXRfY29wcGVyaGVhZDsKKwkJaGEtPmZ1bmMuc3RhdHVwZCA9IGlwc19zdGF0dXBkX2NvcHBlcmhlYWQ7CisJCWhhLT5mdW5jLnN0YXRpbml0ID0gaXBzX3N0YXRpbml0OworCQloYS0+ZnVuYy5yZXNldCA9IGlwc19yZXNldF9jb3BwZXJoZWFkOworCQloYS0+ZnVuYy5pbnRyID0gaXBzX2ludHJfY29wcGVyaGVhZDsKKwkJaGEtPmZ1bmMuZXJhc2ViaW9zID0gaXBzX2VyYXNlX2Jpb3M7CisJCWhhLT5mdW5jLnByb2dyYW1iaW9zID0gaXBzX3Byb2dyYW1fYmlvczsKKwkJaGEtPmZ1bmMudmVyaWZ5YmlvcyA9IGlwc192ZXJpZnlfYmlvczsKKwkJaGEtPmZ1bmMuZW5hYmxlaW50ID0gaXBzX2VuYWJsZV9pbnRfY29wcGVyaGVhZDsKKworCQlpZiAoSVBTX1VTRV9JMk9fREVMSVZFUihoYSkpCisJCQloYS0+ZnVuYy5pc3N1ZSA9IGlwc19pc3N1ZV9pMm87CisJCWVsc2UKKwkJCWhhLT5mdW5jLmlzc3VlID0gaXBzX2lzc3VlX2NvcHBlcmhlYWQ7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcmVsZWFzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJlbW92ZSBhIGRyaXZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaCkKK3sKKwlpcHNfc2NiX3QgKnNjYjsKKwlpcHNfaGFfdCAqaGE7CisJaW50IGk7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19yZWxlYXNlIiwgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSVBTX01BWF9BREFQVEVSUyAmJiBpcHNfc2hbaV0gIT0gc2g7IGkrKykgOworCisJaWYgKGkgPT0gSVBTX01BWF9BREFQVEVSUykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiKCVzKSByZWxlYXNlLCBpbnZhbGlkIFNjc2lfSG9zdCBwb2ludGVyLlxuIiwgaXBzX25hbWUpOworCQlCVUcoKTsKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCisJaGEgPSBJUFNfSEEoc2gpOworCisJaWYgKCFoYSkKKwkJcmV0dXJuIChGQUxTRSk7CisKKwkvKiBmbHVzaCB0aGUgY2FjaGUgb24gdGhlIGNvbnRyb2xsZXIgKi8KKwlzY2IgPSAmaGEtPnNjYnNbaGEtPm1heF9jbWRzIC0gMV07CisKKwlpcHNfaW5pdF9zY2IoaGEsIHNjYik7CisKKwlzY2ItPnRpbWVvdXQgPSBpcHNfY21kX3RpbWVvdXQ7CisJc2NiLT5jZGJbMF0gPSBJUFNfQ01EX0ZMVVNIOworCisJc2NiLT5jbWQuZmx1c2hfY2FjaGUub3BfY29kZSA9IElQU19DTURfRkxVU0g7CisJc2NiLT5jbWQuZmx1c2hfY2FjaGUuY29tbWFuZF9pZCA9IElQU19DT01NQU5EX0lEKGhhLCBzY2IpOworCXNjYi0+Y21kLmZsdXNoX2NhY2hlLnN0YXRlID0gSVBTX05PUk1fU1RBVEU7CisJc2NiLT5jbWQuZmx1c2hfY2FjaGUucmVzZXJ2ZWQgPSAwOworCXNjYi0+Y21kLmZsdXNoX2NhY2hlLnJlc2VydmVkMiA9IDA7CisJc2NiLT5jbWQuZmx1c2hfY2FjaGUucmVzZXJ2ZWQzID0gMDsKKwlzY2ItPmNtZC5mbHVzaF9jYWNoZS5yZXNlcnZlZDQgPSAwOworCisJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsICJGbHVzaGluZyBDYWNoZS5cbiIpOworCisJLyogc2VuZCBjb21tYW5kICovCisJaWYgKGlwc19zZW5kX3dhaXQoaGEsIHNjYiwgaXBzX2NtZF90aW1lb3V0LCBJUFNfSU5UUl9PTikgPT0gSVBTX0ZBSUxVUkUpCisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LCAiSW5jb21wbGV0ZSBGbHVzaC5cbiIpOworCisJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsICJGbHVzaGluZyBDb21wbGV0ZS5cbiIpOworCisJaXBzX3NoW2ldID0gTlVMTDsKKwlpcHNfaGFbaV0gPSBOVUxMOworCisJLyogZnJlZSBleHRyYSBtZW1vcnkgKi8KKwlpcHNfZnJlZShoYSk7CisKKwkvKiBGcmVlIEkvTyBSZWdpb24gKi8KKwlpZiAoaGEtPmlvX2FkZHIpCisJCXJlbGVhc2VfcmVnaW9uKGhhLT5pb19hZGRyLCBoYS0+aW9fbGVuKTsKKworCS8qIGZyZWUgSVJRICovCisJZnJlZV9pcnEoaGEtPmlycSwgaGEpOworCisJSVBTX1JFTU9WRV9IT1NUKHNoKTsKKwlzY3NpX2hvc3RfcHV0KHNoKTsKKworCWlwc19yZWxlYXNlZF9jb250cm9sbGVycysrOworCisJcmV0dXJuIChGQUxTRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19oYWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUGVyZm9ybSBjbGVhbnVwIHdoZW4gdGhlIHN5c3RlbSByZWJvb3RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19oYWx0KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVsb25nIGV2ZW50LCB2b2lkICpidWYpCit7CisJaXBzX3NjYl90ICpzY2I7CisJaXBzX2hhX3QgKmhhOworCWludCBpOworCisJaWYgKChldmVudCAhPSBTWVNfUkVTVEFSVCkgJiYgKGV2ZW50ICE9IFNZU19IQUxUKSAmJgorCSAgICAoZXZlbnQgIT0gU1lTX1BPV0VSX09GRikpCisJCXJldHVybiAoTk9USUZZX0RPTkUpOworCisJZm9yIChpID0gMDsgaSA8IGlwc19uZXh0X2NvbnRyb2xsZXI7IGkrKykgeworCQloYSA9IChpcHNfaGFfdCAqKSBpcHNfaGFbaV07CisKKwkJaWYgKCFoYSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghaGEtPmFjdGl2ZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIGZsdXNoIHRoZSBjYWNoZSBvbiB0aGUgY29udHJvbGxlciAqLworCQlzY2IgPSAmaGEtPnNjYnNbaGEtPm1heF9jbWRzIC0gMV07CisKKwkJaXBzX2luaXRfc2NiKGhhLCBzY2IpOworCisJCXNjYi0+dGltZW91dCA9IGlwc19jbWRfdGltZW91dDsKKwkJc2NiLT5jZGJbMF0gPSBJUFNfQ01EX0ZMVVNIOworCisJCXNjYi0+Y21kLmZsdXNoX2NhY2hlLm9wX2NvZGUgPSBJUFNfQ01EX0ZMVVNIOworCQlzY2ItPmNtZC5mbHVzaF9jYWNoZS5jb21tYW5kX2lkID0gSVBTX0NPTU1BTkRfSUQoaGEsIHNjYik7CisJCXNjYi0+Y21kLmZsdXNoX2NhY2hlLnN0YXRlID0gSVBTX05PUk1fU1RBVEU7CisJCXNjYi0+Y21kLmZsdXNoX2NhY2hlLnJlc2VydmVkID0gMDsKKwkJc2NiLT5jbWQuZmx1c2hfY2FjaGUucmVzZXJ2ZWQyID0gMDsKKwkJc2NiLT5jbWQuZmx1c2hfY2FjaGUucmVzZXJ2ZWQzID0gMDsKKwkJc2NiLT5jbWQuZmx1c2hfY2FjaGUucmVzZXJ2ZWQ0ID0gMDsKKworCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgaGEtPnBjaWRldiwgIkZsdXNoaW5nIENhY2hlLlxuIik7CisKKwkJLyogc2VuZCBjb21tYW5kICovCisJCWlmIChpcHNfc2VuZF93YWl0KGhhLCBzY2IsIGlwc19jbWRfdGltZW91dCwgSVBTX0lOVFJfT04pID09CisJCSAgICBJUFNfRkFJTFVSRSkKKwkJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJCSAgICJJbmNvbXBsZXRlIEZsdXNoLlxuIik7CisJCWVsc2UKKwkJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJCSAgICJGbHVzaGluZyBDb21wbGV0ZS5cbiIpOworCX0KKworCXJldHVybiAoTk9USUZZX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2VoX2Fib3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBYm9ydCBhIGNvbW1hbmQgKHVzaW5nIHRoZSBuZXcgZXJyb3IgY29kZSBzdHVmZikgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOb3RlOiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHVuZGVyIHRoZSBpb19yZXF1ZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitpcHNfZWhfYWJvcnQoU2NzaV9DbW5kICogU0MpCit7CisJaXBzX2hhX3QgKmhhOworCWlwc19jb3BwX3dhaXRfaXRlbV90ICppdGVtOworCWludCByZXQ7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19laF9hYm9ydCIsIDEpOworCisJaWYgKCFTQykKKwkJcmV0dXJuIChGQUlMRUQpOworCisJaGEgPSAoaXBzX2hhX3QgKikgU0MtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlpZiAoIWhhKQorCQlyZXR1cm4gKEZBSUxFRCk7CisKKwlpZiAoIWhhLT5hY3RpdmUpCisJCXJldHVybiAoRkFJTEVEKTsKKworCWlmIChTQy0+c2VyaWFsX251bWJlciAhPSBTQy0+c2VyaWFsX251bWJlcl9hdF90aW1lb3V0KSB7CisJCS8qIEhNTSwgbG9va3MgbGlrZSBhIGJvZ3VzIGNvbW1hbmQgKi8KKwkJREVCVUcoMSwgIkFib3J0IGNhbGxlZCB3aXRoIGJvZ3VzIHNjc2kgY29tbWFuZCIpOworCisJCXJldHVybiAoRkFJTEVEKTsKKwl9CisKKwkvKiBTZWUgaWYgdGhlIGNvbW1hbmQgaXMgb24gdGhlIGNvcHAgcXVldWUgKi8KKwlpdGVtID0gaGEtPmNvcHBfd2FpdGxpc3QuaGVhZDsKKwl3aGlsZSAoKGl0ZW0pICYmIChpdGVtLT5zY3NpX2NtZCAhPSBTQykpCisJCWl0ZW0gPSBpdGVtLT5uZXh0OworCisJaWYgKGl0ZW0pIHsKKwkJLyogRm91bmQgaXQgKi8KKwkJaXBzX3JlbW92ZXFfY29wcCgmaGEtPmNvcHBfd2FpdGxpc3QsIGl0ZW0pOworCQlyZXQgPSAoU1VDQ0VTUyk7CisKKwkJLyogU2VlIGlmIHRoZSBjb21tYW5kIGlzIG9uIHRoZSB3YWl0IHF1ZXVlICovCisJfSBlbHNlIGlmIChpcHNfcmVtb3ZlcV93YWl0KCZoYS0+c2NiX3dhaXRsaXN0LCBTQykpIHsKKwkJLyogY29tbWFuZCBub3Qgc2VudCB5ZXQgKi8KKwkJcmV0ID0gKFNVQ0NFU1MpOworCX0gZWxzZSB7CisJCS8qIGNvbW1hbmQgbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBzZW50ICovCisJCXJldCA9IChGQUlMRUQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfZWhfcmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJlc2V0IHRoZSBjb250cm9sbGVyICh3aXRoIG5ldyBlaCBlcnJvciBjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URTogdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB1bmRlciB0aGUgaW9fcmVxdWVzdF9sb2NrIHNwaW5sb2NrICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2VoX3Jlc2V0KFNjc2lfQ21uZCAqIFNDKQoreworCWludCByZXQ7CisJaW50IGk7CisJaXBzX2hhX3QgKmhhOworCWlwc19zY2JfdCAqc2NiOworCWlwc19jb3BwX3dhaXRfaXRlbV90ICppdGVtOworCisJTUVUSE9EX1RSQUNFKCJpcHNfZWhfcmVzZXQiLCAxKTsKKworI2lmZGVmIE5PX0lQU19SRVNFVAorCXJldHVybiAoRkFJTEVEKTsKKyNlbHNlCisKKwlpZiAoIVNDKSB7CisJCURFQlVHKDEsICJSZXNldCBjYWxsZWQgd2l0aCBOVUxMIHNjc2kgY29tbWFuZCIpOworCisJCXJldHVybiAoRkFJTEVEKTsKKwl9CisKKwloYSA9IChpcHNfaGFfdCAqKSBTQy0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCWlmICghaGEpIHsKKwkJREVCVUcoMSwgIlJlc2V0IGNhbGxlZCB3aXRoIE5VTEwgaGEgc3RydWN0Iik7CisKKwkJcmV0dXJuIChGQUlMRUQpOworCX0KKworCWlmICghaGEtPmFjdGl2ZSkKKwkJcmV0dXJuIChGQUlMRUQpOworCisJLyogU2VlIGlmIHRoZSBjb21tYW5kIGlzIG9uIHRoZSBjb3BwIHF1ZXVlICovCisJaXRlbSA9IGhhLT5jb3BwX3dhaXRsaXN0LmhlYWQ7CisJd2hpbGUgKChpdGVtKSAmJiAoaXRlbS0+c2NzaV9jbWQgIT0gU0MpKQorCQlpdGVtID0gaXRlbS0+bmV4dDsKKworCWlmIChpdGVtKSB7CisJCS8qIEZvdW5kIGl0ICovCisJCWlwc19yZW1vdmVxX2NvcHAoJmhhLT5jb3BwX3dhaXRsaXN0LCBpdGVtKTsKKwkJcmV0dXJuIChTVUNDRVNTKTsKKwl9CisKKwkvKiBTZWUgaWYgdGhlIGNvbW1hbmQgaXMgb24gdGhlIHdhaXQgcXVldWUgKi8KKwlpZiAoaXBzX3JlbW92ZXFfd2FpdCgmaGEtPnNjYl93YWl0bGlzdCwgU0MpKSB7CisJCS8qIGNvbW1hbmQgbm90IHNlbnQgeWV0ICovCisJCXJldHVybiAoU1VDQ0VTUyk7CisJfQorCisJLyogQW4gZXhwbGFuYXRpb24gZm9yIHRoZSBjYXN1YWwgb2JzZXJ2ZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiBQYXJ0IG9mIHRoZSBmdW5jdGlvbiBvZiBhIFJBSUQgY29udHJvbGxlciBpcyBhdXRvbWF0aWMgZXJyb3IgICAgICAgICAqLworCS8qIGRldGVjdGlvbiBhbmQgcmVjb3ZlcnkuICBBcyBzdWNoLCB0aGUgb25seSBwcm9ibGVtIHRoYXQgcGh5c2ljYWxseSAgICovCisJLyogcmVzZXR0aW5nIGFuIGFkYXB0ZXIgd2lsbCBldmVyIGZpeCBpcyB3aGVuLCBmb3Igc29tZSByZWFzb24sICAgICAgICAgKi8KKwkvKiB0aGUgZHJpdmVyIGlzIG5vdCBzdWNjZXNzZnVsbHkgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBhZGFwdGVyLiAgICAgICAqLworCS8qIFRoZXJlZm9yZSwgd2Ugd2lsbCBhdHRlbXB0IHRvIGZsdXNoIHRoaXMgYWRhcHRlci4gIElmIHRoYXQgc3VjY2VlZHMsICovCisJLyogdGhlbiB0aGVyZSdzIG5vIHJlYWwgcHVycG9zZSBpbiBhIHBoeXNpY2FsIHJlc2V0LiBUaGlzIHdpbGwgY29tcGxldGUgKi8KKwkvKiBtdWNoIGZhc3RlciBhbmQgYXZvaWRzIGFueSBwcm9ibGVtcyB0aGF0IG1pZ2h0IGJlIGNhdXNlZCBieSBhICAgICAgICAqLworCS8qIHBoeXNpY2FsIHJlc2V0ICggc3VjaCBhcyBoYXZpbmcgdG8gZmFpbCBhbGwgdGhlIG91dHN0YW5kaW5nIEkvTydzICkuICovCisKKwlpZiAoaGEtPmlvY3RsX3Jlc2V0ID09IDApIHsJLyogSUYgTm90IGFuIElPQ1RMIFJlcXVlc3RlZCBSZXNldCAqLworCQlzY2IgPSAmaGEtPnNjYnNbaGEtPm1heF9jbWRzIC0gMV07CisKKwkJaXBzX2luaXRfc2NiKGhhLCBzY2IpOworCisJCXNjYi0+dGltZW91dCA9IGlwc19jbWRfdGltZW91dDsKKwkJc2NiLT5jZGJbMF0gPSBJUFNfQ01EX0ZMVVNIOworCisJCXNjYi0+Y21kLmZsdXNoX2NhY2hlLm9wX2NvZGUgPSBJUFNfQ01EX0ZMVVNIOworCQlzY2ItPmNtZC5mbHVzaF9jYWNoZS5jb21tYW5kX2lkID0gSVBTX0NPTU1BTkRfSUQoaGEsIHNjYik7CisJCXNjYi0+Y21kLmZsdXNoX2NhY2hlLnN0YXRlID0gSVBTX05PUk1fU1RBVEU7CisJCXNjYi0+Y21kLmZsdXNoX2NhY2hlLnJlc2VydmVkID0gMDsKKwkJc2NiLT5jbWQuZmx1c2hfY2FjaGUucmVzZXJ2ZWQyID0gMDsKKwkJc2NiLT5jbWQuZmx1c2hfY2FjaGUucmVzZXJ2ZWQzID0gMDsKKwkJc2NiLT5jbWQuZmx1c2hfY2FjaGUucmVzZXJ2ZWQ0ID0gMDsKKworCQkvKiBBdHRlbXB0IHRoZSBmbHVzaCBjb21tYW5kICovCisJCXJldCA9IGlwc19zZW5kX3dhaXQoaGEsIHNjYiwgaXBzX2NtZF90aW1lb3V0LCBJUFNfSU5UUl9JT1JMKTsKKwkJaWYgKHJldCA9PSBJUFNfU1VDQ0VTUykgeworCQkJSVBTX1BSSU5USyhLRVJOX05PVElDRSwgaGEtPnBjaWRldiwKKwkJCQkgICAiUmVzZXQgUmVxdWVzdCAtIEZsdXNoZWQgQ2FjaGVcbiIpOworCQkJcmV0dXJuIChTVUNDRVNTKTsKKwkJfQorCX0KKworCS8qIEVpdGhlciB3ZSBjYW4ndCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBhZGFwdGVyIG9yIGl0J3MgYW4gSU9DVEwgcmVxdWVzdCAqLworCS8qIGZyb20gYSB1dGlsaXR5LiAgQSBwaHlzaWNhbCByZXNldCBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludC4gICAgICAgICAgICAqLworCisJaGEtPmlvY3RsX3Jlc2V0ID0gMDsJLyogUmVzZXQgdGhlIElPQ1RMIFJlcXVlc3RlZCBSZXNldCBGbGFnICovCisKKwkvKgorCSAqIGNvbW1hbmQgbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBzZW50CisJICogcmVzZXQgdGhlIGNvbnRyb2xsZXIKKwkgKi8KKwlJUFNfUFJJTlRLKEtFUk5fTk9USUNFLCBoYS0+cGNpZGV2LCAiUmVzZXR0aW5nIGNvbnRyb2xsZXIuXG4iKTsKKwlyZXQgPSAoKmhhLT5mdW5jLnJlc2V0KSAoaGEpOworCisJaWYgKCFyZXQpIHsKKwkJU2NzaV9DbW5kICpzY3NpX2NtZDsKKworCQlJUFNfUFJJTlRLKEtFUk5fTk9USUNFLCBoYS0+cGNpZGV2LAorCQkJICAgIkNvbnRyb2xsZXIgcmVzZXQgZmFpbGVkIC0gY29udHJvbGxlciBub3cgb2ZmbGluZS5cbiIpOworCisJCS8qIE5vdyBmYWlsIGFsbCBvZiB0aGUgYWN0aXZlIGNvbW1hbmRzICovCisJCURFQlVHX1ZBUigxLCAiKCVzJWQpIEZhaWxpbmcgYWN0aXZlIGNvbW1hbmRzIiwKKwkJCSAgaXBzX25hbWUsIGhhLT5ob3N0X251bSk7CisKKwkJd2hpbGUgKChzY2IgPSBpcHNfcmVtb3ZlcV9zY2JfaGVhZCgmaGEtPnNjYl9hY3RpdmVsaXN0KSkpIHsKKwkJCXNjYi0+c2NzaV9jbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJCXNjYi0+c2NzaV9jbWQtPnNjc2lfZG9uZShzY2ItPnNjc2lfY21kKTsKKwkJCWlwc19mcmVlc2NiKGhhLCBzY2IpOworCQl9CisKKwkJLyogTm93IGZhaWwgYWxsIG9mIHRoZSBwZW5kaW5nIGNvbW1hbmRzICovCisJCURFQlVHX1ZBUigxLCAiKCVzJWQpIEZhaWxpbmcgcGVuZGluZyBjb21tYW5kcyIsCisJCQkgIGlwc19uYW1lLCBoYS0+aG9zdF9udW0pOworCisJCXdoaWxlICgoc2NzaV9jbWQgPSBpcHNfcmVtb3ZlcV93YWl0X2hlYWQoJmhhLT5zY2Jfd2FpdGxpc3QpKSkgeworCQkJc2NzaV9jbWQtPnJlc3VsdCA9IERJRF9FUlJPUjsKKwkJCXNjc2lfY21kLT5zY3NpX2RvbmUoc2NzaV9jbWQpOworCQl9CisKKwkJaGEtPmFjdGl2ZSA9IEZBTFNFOworCQlyZXR1cm4gKEZBSUxFRCk7CisJfQorCisJaWYgKCFpcHNfY2xlYXJfYWRhcHRlcihoYSwgSVBTX0lOVFJfSU9STCkpIHsKKwkJU2NzaV9DbW5kICpzY3NpX2NtZDsKKworCQlJUFNfUFJJTlRLKEtFUk5fTk9USUNFLCBoYS0+cGNpZGV2LAorCQkJICAgIkNvbnRyb2xsZXIgcmVzZXQgZmFpbGVkIC0gY29udHJvbGxlciBub3cgb2ZmbGluZS5cbiIpOworCisJCS8qIE5vdyBmYWlsIGFsbCBvZiB0aGUgYWN0aXZlIGNvbW1hbmRzICovCisJCURFQlVHX1ZBUigxLCAiKCVzJWQpIEZhaWxpbmcgYWN0aXZlIGNvbW1hbmRzIiwKKwkJCSAgaXBzX25hbWUsIGhhLT5ob3N0X251bSk7CisKKwkJd2hpbGUgKChzY2IgPSBpcHNfcmVtb3ZlcV9zY2JfaGVhZCgmaGEtPnNjYl9hY3RpdmVsaXN0KSkpIHsKKwkJCXNjYi0+c2NzaV9jbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJCXNjYi0+c2NzaV9jbWQtPnNjc2lfZG9uZShzY2ItPnNjc2lfY21kKTsKKwkJCWlwc19mcmVlc2NiKGhhLCBzY2IpOworCQl9CisKKwkJLyogTm93IGZhaWwgYWxsIG9mIHRoZSBwZW5kaW5nIGNvbW1hbmRzICovCisJCURFQlVHX1ZBUigxLCAiKCVzJWQpIEZhaWxpbmcgcGVuZGluZyBjb21tYW5kcyIsCisJCQkgIGlwc19uYW1lLCBoYS0+aG9zdF9udW0pOworCisJCXdoaWxlICgoc2NzaV9jbWQgPSBpcHNfcmVtb3ZlcV93YWl0X2hlYWQoJmhhLT5zY2Jfd2FpdGxpc3QpKSkgeworCQkJc2NzaV9jbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJCXNjc2lfY21kLT5zY3NpX2RvbmUoc2NzaV9jbWQpOworCQl9CisKKwkJaGEtPmFjdGl2ZSA9IEZBTFNFOworCQlyZXR1cm4gKEZBSUxFRCk7CisJfQorCisJLyogRkZEQyAqLworCWlmIChsZTMyX3RvX2NwdShoYS0+c3Vic3lzLT5wYXJhbVszXSkgJiAweDMwMDAwMCkgeworCQlzdHJ1Y3QgdGltZXZhbCB0djsKKworCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJaGEtPmxhc3RfZmZkYyA9IHR2LnR2X3NlYzsKKwkJaGEtPnJlc2V0X2NvdW50Kys7CisJCWlwc19mZmRjX3Jlc2V0KGhhLCBJUFNfSU5UUl9JT1JMKTsKKwl9CisKKwkvKiBOb3cgZmFpbCBhbGwgb2YgdGhlIGFjdGl2ZSBjb21tYW5kcyAqLworCURFQlVHX1ZBUigxLCAiKCVzJWQpIEZhaWxpbmcgYWN0aXZlIGNvbW1hbmRzIiwgaXBzX25hbWUsIGhhLT5ob3N0X251bSk7CisKKwl3aGlsZSAoKHNjYiA9IGlwc19yZW1vdmVxX3NjYl9oZWFkKCZoYS0+c2NiX2FjdGl2ZWxpc3QpKSkgeworCQlzY2ItPnNjc2lfY21kLT5yZXN1bHQgPQorCQkgICAgKERJRF9SRVNFVCA8PCAxNikgfCAoU1VHR0VTVF9SRVRSWSA8PCAyNCk7CisJCXNjYi0+c2NzaV9jbWQtPnNjc2lfZG9uZShzY2ItPnNjc2lfY21kKTsKKwkJaXBzX2ZyZWVzY2IoaGEsIHNjYik7CisJfQorCisJLyogUmVzZXQgRENEQiBhY3RpdmUgY29tbWFuZCBiaXRzICovCisJZm9yIChpID0gMTsgaSA8IGhhLT5uYnVzOyBpKyspCisJCWhhLT5kY2RiX2FjdGl2ZVtpIC0gMV0gPSAwOworCisJLyogUmVzZXQgdGhlIG51bWJlciBvZiBhY3RpdmUgSU9DVExzICovCisJaGEtPm51bV9pb2N0bCA9IDA7CisKKwlpcHNfbmV4dChoYSwgSVBTX0lOVFJfSU9STCk7CisKKwlyZXR1cm4gKFNVQ0NFU1MpOworI2VuZGlmCQkJCS8qIE5PX0lQU19SRVNFVCAqLworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19xdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgU2VuZCBhIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIExpbnV4IG9idGFpbnMgaW9fcmVxdWVzdF9sb2NrIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19xdWV1ZShTY3NpX0NtbmQgKiBTQywgdm9pZCAoKmRvbmUpIChTY3NpX0NtbmQgKikpCit7CisJaXBzX2hhX3QgKmhhOworCWlwc19wYXNzdGhydV90ICpwdDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3F1ZXVlIiwgMSk7CisKKwloYSA9IChpcHNfaGFfdCAqKSBTQy0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCWlmICghaGEpCisJCXJldHVybiAoMSk7CisKKwlpZiAoIWhhLT5hY3RpdmUpCisJCXJldHVybiAoRElEX0VSUk9SKTsKKworCWlmIChpcHNfaXNfcGFzc3RocnUoU0MpKSB7CisJCWlmIChoYS0+Y29wcF93YWl0bGlzdC5jb3VudCA9PSBJUFNfTUFYX0lPQ1RMX1FVRVVFKSB7CisJCQlTQy0+cmVzdWx0ID0gRElEX0JVU19CVVNZIDw8IDE2OworCQkJZG9uZShTQyk7CisKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9IGVsc2UgaWYgKGhhLT5zY2Jfd2FpdGxpc3QuY291bnQgPT0gSVBTX01BWF9RVUVVRSkgeworCQlTQy0+cmVzdWx0ID0gRElEX0JVU19CVVNZIDw8IDE2OworCQlkb25lKFNDKTsKKworCQlyZXR1cm4gKDApOworCX0KKworCVNDLT5zY3NpX2RvbmUgPSBkb25lOworCisJREVCVUdfVkFSKDIsICIoJXMlZCk6IGlwc19xdWV1ZTogY21kIDB4JVggKCVkICVkICVkKSIsCisJCSAgaXBzX25hbWUsCisJCSAgaGEtPmhvc3RfbnVtLAorCQkgIFNDLT5jbW5kWzBdLAorCQkgIFNDLT5kZXZpY2UtPmNoYW5uZWwsIFNDLT5kZXZpY2UtPmlkLCBTQy0+ZGV2aWNlLT5sdW4pOworCisJLyogQ2hlY2sgZm9yIGNvbW1hbmQgdG8gaW5pdGlhdG9yIElEcyAqLworCWlmICgoU0MtPmRldmljZS0+Y2hhbm5lbCA+IDApCisJICAgICYmIChTQy0+ZGV2aWNlLT5pZCA9PSBoYS0+aGFfaWRbU0MtPmRldmljZS0+Y2hhbm5lbF0pKSB7CisJCVNDLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJZG9uZShTQyk7CisKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlpZiAoaXBzX2lzX3Bhc3N0aHJ1KFNDKSkgeworCisJCWlwc19jb3BwX3dhaXRfaXRlbV90ICpzY3JhdGNoOworCisJCS8qIEEgUmVzZXQgSU9DVEwgaXMgb25seSBzZW50IGJ5IHRoZSBib290IENEIGluIGV4dHJlbWUgY2FzZXMuICAgICAgICAgICAqLworCQkvKiBUaGVyZSBjYW4gbmV2ZXIgYmUgYW55IHN5c3RlbSBhY3Rpdml0eSAoIG5ldHdvcmsgb3IgZGlzayApLCBidXQgY2hlY2sgKi8KKwkJLyogYW55d2F5IGp1c3QgYXMgYSBnb29kIHByYWN0aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCXB0ID0gKGlwc19wYXNzdGhydV90ICopIFNDLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJaWYgKChwdC0+Q29wcENQLmNtZC5yZXNldC5vcF9jb2RlID09IElQU19DTURfUkVTRVRfQ0hBTk5FTCkgJiYKKwkJICAgIChwdC0+Q29wcENQLmNtZC5yZXNldC5hZGFwdGVyX2ZsYWcgPT0gMSkpIHsKKwkJCWlmIChoYS0+c2NiX2FjdGl2ZWxpc3QuY291bnQgIT0gMCkgeworCQkJCVNDLT5yZXN1bHQgPSBESURfQlVTX0JVU1kgPDwgMTY7CisJCQkJZG9uZShTQyk7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCWhhLT5pb2N0bF9yZXNldCA9IDE7CS8qIFRoaXMgcmVzZXQgcmVxdWVzdCBpcyBmcm9tIGFuIElPQ1RMICovCisJCQlpcHNfZWhfcmVzZXQoU0MpOworCQkJU0MtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkJCVNDLT5zY3NpX2RvbmUoU0MpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCisJCS8qIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgc2NyaWJibGUgKi8KKwkJc2NyYXRjaCA9IGttYWxsb2Moc2l6ZW9mIChpcHNfY29wcF93YWl0X2l0ZW1fdCksIEdGUF9BVE9NSUMpOworCisJCWlmICghc2NyYXRjaCkgeworCQkJU0MtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJCWRvbmUoU0MpOworCisJCQlyZXR1cm4gKDApOworCQl9CisKKwkJc2NyYXRjaC0+c2NzaV9jbWQgPSBTQzsKKwkJc2NyYXRjaC0+bmV4dCA9IE5VTEw7CisKKwkJaXBzX3B1dHFfY29wcF90YWlsKCZoYS0+Y29wcF93YWl0bGlzdCwgc2NyYXRjaCk7CisJfSBlbHNlIHsKKwkJaXBzX3B1dHFfd2FpdF90YWlsKCZoYS0+c2NiX3dhaXRsaXN0LCBTQyk7CisJfQorCisJaXBzX25leHQoaGEsIElQU19JTlRSX0lPUkwpOworCisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2Jpb3NwYXJhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBTZXQgYmlvcyBnZW9tZXRyeSBmb3IgdGhlIGNvbnRyb2xsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQoraXBzX2Jpb3NwYXJhbShEaXNrICogZGlzaywga2Rldl90IGRldiwgaW50IGdlb21bXSkKK3sKKwlpcHNfaGFfdCAqaGEgPSAoaXBzX2hhX3QgKikgZGlzay0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBsb25nIGNhcGFjaXR5ID0gZGlzay0+Y2FwYWNpdHk7CisjZWxzZQoraXBzX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJICAgICAgc2VjdG9yX3QgY2FwYWNpdHksIGludCBnZW9tW10pCit7CisJaXBzX2hhX3QgKmhhID0gKGlwc19oYV90ICopIHNkZXYtPmhvc3QtPmhvc3RkYXRhOworI2VuZGlmCisJaW50IGhlYWRzOworCWludCBzZWN0b3JzOworCWludCBjeWxpbmRlcnM7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19iaW9zcGFyYW0iLCAxKTsKKworCWlmICghaGEpCisJCS8qID8hPyEgaG9zdCBhZGF0ZXIgaW5mbyBpbnZhbGlkICovCisJCXJldHVybiAoMCk7CisKKwlpZiAoIWhhLT5hY3RpdmUpCisJCXJldHVybiAoMCk7CisKKwlpZiAoIWlwc19yZWFkX2FkYXB0ZXJfc3RhdHVzKGhhLCBJUFNfSU5UUl9PTikpCisJCS8qID8hPyEgRW5xdWlyeSBjb21tYW5kIGZhaWxlZCAqLworCQlyZXR1cm4gKDApOworCisJaWYgKChjYXBhY2l0eSA+IDB4NDAwMDAwKSAmJiAoKGhhLT5lbnEtPnVjTWlzY0ZsYWcgJiAweDgpID09IDApKSB7CisJCWhlYWRzID0gSVBTX05PUk1fSEVBRFM7CisJCXNlY3RvcnMgPSBJUFNfTk9STV9TRUNUT1JTOworCX0gZWxzZSB7CisJCWhlYWRzID0gSVBTX0NPTVBfSEVBRFM7CisJCXNlY3RvcnMgPSBJUFNfQ09NUF9TRUNUT1JTOworCX0KKworCWN5bGluZGVycyA9ICh1bnNpZ25lZCBsb25nKSBjYXBhY2l0eSAvIChoZWFkcyAqIHNlY3RvcnMpOworCisJREVCVUdfVkFSKDIsICJHZW9tZXRyeTogaGVhZHM6ICVkLCBzZWN0b3JzOiAlZCwgY3lsaW5kZXJzOiAlZCIsCisJCSAgaGVhZHMsIHNlY3RvcnMsIGN5bGluZGVycyk7CisKKwlnZW9tWzBdID0gaGVhZHM7CisJZ2VvbVsxXSA9IHNlY3RvcnM7CisJZ2VvbVsyXSA9IGN5bGluZGVyczsKKworCXJldHVybiAoMCk7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKworLyogaXBzX3Byb2MyNF9pbmZvIGlzIGEgd3JhcHBlciBhcm91bmQgaXBzX3Byb2NfaW5mbyAqCisgKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSAyLjQgc2NzaSBwYXJhbWV0ZXJzICAgICovCitzdGF0aWMgaW50CitpcHNfcHJvYzI0X2luZm8oY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwKKwkJICAgICAgICAgICAgICBpbnQgaG9zdG5vLCBpbnQgZnVuYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBpcHNfbmV4dF9jb250cm9sbGVyOyBpKyspIHsKKwkJaWYgKGlwc19zaFtpXSAmJiBpcHNfc2hbaV0tPmhvc3Rfbm8gPT0gaG9zdG5vKSB7CisJCQlyZXR1cm4gaXBzX3Byb2NfaW5mbyhpcHNfc2hbaV0sIGJ1ZmZlciwgc3RhcnQsCisJCQkJCSAgICAgb2Zmc2V0LCBsZW5ndGgsIGZ1bmMpOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOwkKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3NlbGVjdF9xdWV1ZV9kZXB0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBTZWxlY3QgcXVldWUgZGVwdGhzIGZvciB0aGUgZGV2aWNlcyBvbiB0aGUgY29udG9sbGVyICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19zZWxlY3RfcXVldWVfZGVwdGgoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgU2NzaV9EZXZpY2UgKiBzY3NpX2RldnMpCit7CisJU2NzaV9EZXZpY2UgKmRldmljZTsKKwlpcHNfaGFfdCAqaGE7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgbWluOworCisJaGEgPSBJUFNfSEEoaG9zdCk7CisJbWluID0gaGEtPm1heF9jbWRzIC8gNDsKKworCWZvciAoZGV2aWNlID0gc2NzaV9kZXZzOyBkZXZpY2U7IGRldmljZSA9IGRldmljZS0+bmV4dCkgeworCQlpZiAoZGV2aWNlLT5ob3N0ID09IGhvc3QpIHsKKwkJCWlmICgoZGV2aWNlLT5jaGFubmVsID09IDApICYmIChkZXZpY2UtPnR5cGUgPT0gMCkpCisJCQkJY291bnQrKzsKKwkJfQorCX0KKworCWZvciAoZGV2aWNlID0gc2NzaV9kZXZzOyBkZXZpY2U7IGRldmljZSA9IGRldmljZS0+bmV4dCkgeworCQlpZiAoZGV2aWNlLT5ob3N0ID09IGhvc3QpIHsKKwkJCWlmICgoZGV2aWNlLT5jaGFubmVsID09IDApICYmIChkZXZpY2UtPnR5cGUgPT0gMCkpIHsKKwkJCQlkZXZpY2UtPnF1ZXVlX2RlcHRoID0KKwkJCQkgICAgKGhhLT5tYXhfY21kcyAtIDEpIC8gY291bnQ7CisJCQkJaWYgKGRldmljZS0+cXVldWVfZGVwdGggPCBtaW4pCisJCQkJCWRldmljZS0+cXVldWVfZGVwdGggPSBtaW47CisJCQl9IGVsc2UgeworCQkJCWRldmljZS0+cXVldWVfZGVwdGggPSAyOworCQkJfQorCisJCQlpZiAoZGV2aWNlLT5xdWV1ZV9kZXB0aCA8IDIpCisJCQkJZGV2aWNlLT5xdWV1ZV9kZXB0aCA9IDI7CisJCX0KKwl9Cit9CisKKyNlbHNlCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfc2xhdmVfY29uZmlndXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFNldCBxdWV1ZSBkZXB0aHMgb24gZGV2aWNlcyBvbmNlIHNjYW4gaXMgY29tcGxldGUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfc2xhdmVfY29uZmlndXJlKFNjc2lfRGV2aWNlICogU0RwdHIpCit7CisJaXBzX2hhX3QgKmhhOworCWludCBtaW47CisKKwloYSA9IElQU19IQShTRHB0ci0+aG9zdCk7CisJaWYgKFNEcHRyLT50YWdnZWRfc3VwcG9ydGVkICYmIFNEcHRyLT50eXBlID09IFRZUEVfRElTSykgeworCQltaW4gPSBoYS0+bWF4X2NtZHMgLyAyOworCQlpZiAoaGEtPmVucS0+dWNMb2dEcml2ZUNvdW50IDw9IDIpCisJCQltaW4gPSBoYS0+bWF4X2NtZHMgLSAxOworCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChTRHB0ciwgTVNHX09SREVSRURfVEFHLCBtaW4pOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBkb19pcHNpbnRyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFdyYXBwZXIgZm9yIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaXJxcmV0dXJuX3QKK2RvX2lwc2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJaXBzX2hhX3QgKmhhOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJaW50IGlycXN0YXR1czsKKworCU1FVEhPRF9UUkFDRSgiZG9faXBzaW50ciIsIDIpOworCisJaGEgPSAoaXBzX2hhX3QgKikgZGV2X2lkOworCWlmICghaGEpCisJCXJldHVybiBJUlFfTk9ORTsKKwlob3N0ID0gaXBzX3NoW2hhLT5ob3N0X251bV07CisJLyogaW50ZXJydXB0IGR1cmluZyBpbml0aWFsaXphdGlvbiAqLworCWlmICghaG9zdCkgeworCQkoKmhhLT5mdW5jLmludHIpIChoYSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlJUFNfTE9DS19TQVZFKGhvc3QtPmhvc3RfbG9jaywgY3B1X2ZsYWdzKTsKKworCWlmICghaGEtPmFjdGl2ZSkgeworCQlJUFNfVU5MT0NLX1JFU1RPUkUoaG9zdC0+aG9zdF9sb2NrLCBjcHVfZmxhZ3MpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaXJxc3RhdHVzID0gKCpoYS0+ZnVuYy5pbnRyKSAoaGEpOworCisJSVBTX1VOTE9DS19SRVNUT1JFKGhvc3QtPmhvc3RfbG9jaywgY3B1X2ZsYWdzKTsKKworCS8qIHN0YXJ0IHRoZSBuZXh0IGNvbW1hbmQgKi8KKwlpcHNfbmV4dChoYSwgSVBTX0lOVFJfT04pOworCXJldHVybiBJUlFfUkVUVkFMKGlycXN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19pbnRyX2NvcHBlcmhlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUG9sbGluZyBpbnRlcnJ1cHQgaGFuZGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEFTU1VNRVMgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK2lwc19pbnRyX2NvcHBlcmhlYWQoaXBzX2hhX3QgKiBoYSkKK3sKKwlpcHNfc3RhdF90ICpzcDsKKwlpcHNfc2NiX3QgKnNjYjsKKwlJUFNfU1RBVFVTIGNzdGF0dXM7CisJaW50IGludHJzdGF0dXM7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19pbnRyIiwgMik7CisKKwlpZiAoIWhhKQorCQlyZXR1cm4gMDsKKworCWlmICghaGEtPmFjdGl2ZSkKKwkJcmV0dXJuIDA7CisKKwlpbnRyc3RhdHVzID0gKCpoYS0+ZnVuYy5pc2ludHIpIChoYSk7CisKKwlpZiAoIWludHJzdGF0dXMpIHsKKwkJLyoKKwkJICogVW5leHBlY3RlZC9TaGFyZWQgaW50ZXJydXB0CisJCSAqLworCisJCXJldHVybiAwOworCX0KKworCXdoaWxlIChUUlVFKSB7CisJCXNwID0gJmhhLT5zcDsKKworCQlpbnRyc3RhdHVzID0gKCpoYS0+ZnVuYy5pc2ludHIpIChoYSk7CisKKwkJaWYgKCFpbnRyc3RhdHVzKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJCWNzdGF0dXMudmFsdWUgPSAoKmhhLT5mdW5jLnN0YXR1cGQpIChoYSk7CisKKwkJaWYgKGNzdGF0dXMuZmllbGRzLmNvbW1hbmRfaWQgPiAoSVBTX01BWF9DTURTIC0gMSkpIHsKKwkJCS8qIFNwdXJpb3VzIEludGVydXB0ID8gKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaXBzX2Noa3N0YXR1cyhoYSwgJmNzdGF0dXMpOworCQlzY2IgPSAoaXBzX3NjYl90ICopIHNwLT5zY2JfYWRkcjsKKworCQkvKgorCQkgKiB1c2UgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGZpbmlzaCB0aGluZ3MgdXAKKwkJICogTk9URTogaW50ZXJydXB0cyBhcmUgT0ZGIGZvciB0aGlzCisJCSAqLworCQkoKnNjYi0+Y2FsbGJhY2spIChoYSwgc2NiKTsKKwl9CQkJLyogZW5kIHdoaWxlICovCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19pbnRyX21vcnBoZXVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUG9sbGluZyBpbnRlcnJ1cHQgaGFuZGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEFTU1VNRVMgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK2lwc19pbnRyX21vcnBoZXVzKGlwc19oYV90ICogaGEpCit7CisJaXBzX3N0YXRfdCAqc3A7CisJaXBzX3NjYl90ICpzY2I7CisJSVBTX1NUQVRVUyBjc3RhdHVzOworCWludCBpbnRyc3RhdHVzOworCisJTUVUSE9EX1RSQUNFKCJpcHNfaW50cl9tb3JwaGV1cyIsIDIpOworCisJaWYgKCFoYSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWhhLT5hY3RpdmUpCisJCXJldHVybiAwOworCisJaW50cnN0YXR1cyA9ICgqaGEtPmZ1bmMuaXNpbnRyKSAoaGEpOworCisJaWYgKCFpbnRyc3RhdHVzKSB7CisJCS8qCisJCSAqIFVuZXhwZWN0ZWQvU2hhcmVkIGludGVycnVwdAorCQkgKi8KKworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoVFJVRSkgeworCQlzcCA9ICZoYS0+c3A7CisKKwkJaW50cnN0YXR1cyA9ICgqaGEtPmZ1bmMuaXNpbnRyKSAoaGEpOworCisJCWlmICghaW50cnN0YXR1cykKKwkJCWJyZWFrOworCQllbHNlCisJCQljc3RhdHVzLnZhbHVlID0gKCpoYS0+ZnVuYy5zdGF0dXBkKSAoaGEpOworCisJCWlmIChjc3RhdHVzLnZhbHVlID09IDB4ZmZmZmZmZmYpCisJCQkvKiBObyBtb3JlIHRvIHByb2Nlc3MgKi8KKwkJCWJyZWFrOworCisJCWlmIChjc3RhdHVzLmZpZWxkcy5jb21tYW5kX2lkID4gKElQU19NQVhfQ01EUyAtIDEpKSB7CisJCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgaGEtPnBjaWRldiwKKwkJCQkgICAiU3B1cmlvdXMgaW50ZXJydXB0OyBubyBjY2IuXG4iKTsKKworCQkJY29udGludWU7CisJCX0KKworCQlpcHNfY2hrc3RhdHVzKGhhLCAmY3N0YXR1cyk7CisJCXNjYiA9IChpcHNfc2NiX3QgKikgc3AtPnNjYl9hZGRyOworCisJCS8qCisJCSAqIHVzZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZmluaXNoIHRoaW5ncyB1cAorCQkgKiBOT1RFOiBpbnRlcnJ1cHRzIGFyZSBPRkYgZm9yIHRoaXMKKwkJICovCisJCSgqc2NiLT5jYWxsYmFjaykgKGhhLCBzY2IpOworCX0JCQkvKiBlbmQgd2hpbGUgKi8KKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBSZXR1cm4gaW5mbyBhYm91dCB0aGUgZHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNvbnN0IGNoYXIgKgoraXBzX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqU0gpCit7CisJc3RhdGljIGNoYXIgYnVmZmVyWzI1Nl07CisJY2hhciAqYnA7CisJaXBzX2hhX3QgKmhhOworCisJTUVUSE9EX1RSQUNFKCJpcHNfaW5mbyIsIDEpOworCisJaGEgPSBJUFNfSEEoU0gpOworCisJaWYgKCFoYSkKKwkJcmV0dXJuIChOVUxMKTsKKworCWJwID0gJmJ1ZmZlclswXTsKKwltZW1zZXQoYnAsIDAsIHNpemVvZiAoYnVmZmVyKSk7CisKKwlzcHJpbnRmKGJwLCAiJXMlcyVzIEJ1aWxkICVkIiwgIklCTSBQQ0kgU2VydmVSQUlEICIsCisJCUlQU19WRVJTSU9OX0hJR0gsIElQU19WRVJTSU9OX0xPVywgSVBTX0JVSUxEX0lERU5UKTsKKworCWlmIChoYS0+YWRfdHlwZSA+IDAgJiYgaGEtPmFkX3R5cGUgPD0gTUFYX0FEQVBURVJfTkFNRSkgeworCQlzdHJjYXQoYnAsICIgPCIpOworCQlzdHJjYXQoYnAsIGlwc19hZGFwdGVyX25hbWVbaGEtPmFkX3R5cGUgLSAxXSk7CisJCXN0cmNhdChicCwgIj4iKTsKKwl9CisKKwlyZXR1cm4gKGJwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3Byb2NfaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGUgcGFzc3RocnUgaW50ZXJmYWNlIGZvciB0aGUgZHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCSAgICAgIGludCBsZW5ndGgsIGludCBmdW5jKQoreworCWludCBpOworCWludCByZXQ7CisJaXBzX2hhX3QgKmhhID0gTlVMTDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3Byb2NfaW5mbyIsIDEpOworCisJLyogRmluZCBvdXIgaG9zdCBzdHJ1Y3R1cmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaXBzX25leHRfY29udHJvbGxlcjsgaSsrKSB7CisJCWlmIChpcHNfc2hbaV0pIHsKKwkJCWlmIChpcHNfc2hbaV0gPT0gaG9zdCkgeworCQkJCWhhID0gKGlwc19oYV90ICopIGlwc19zaFtpXS0+aG9zdGRhdGE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIWhhKQorCQlyZXR1cm4gKC1FSU5WQUwpOworCisJaWYgKGZ1bmMpIHsKKwkJLyogd3JpdGUgKi8KKwkJcmV0dXJuICgwKTsKKwl9IGVsc2UgeworCQkvKiByZWFkICovCisJCWlmIChzdGFydCkKKwkJCSpzdGFydCA9IGJ1ZmZlcjsKKworCQlyZXQgPSBpcHNfaG9zdF9pbmZvKGhhLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKworCQlyZXR1cm4gKHJldCk7CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEhlbHBlciBGdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19pc19wYXNzdGhydSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgRGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZWQgU0NTSSBjb21tYW5kIGlzIHJlYWxseSBhIHBhc3N0aHJ1IGNvbW1hbmQgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19pc19wYXNzdGhydShTY3NpX0NtbmQgKiBTQykKK3sKKwlNRVRIT0RfVFJBQ0UoImlwc19pc19wYXNzdGhydSIsIDEpOworCisJaWYgKCFTQykKKwkJcmV0dXJuICgwKTsKKworCWlmICgoU0MtPmNtbmRbMF0gPT0gSVBTX0lPQ1RMX0NPTU1BTkQpICYmCisJICAgIChTQy0+ZGV2aWNlLT5jaGFubmVsID09IDApICYmCisJICAgIChTQy0+ZGV2aWNlLT5pZCA9PSBJUFNfQURBUFRFUl9JRCkgJiYKKwkgICAgKFNDLT5kZXZpY2UtPmx1biA9PSAwKSAmJiBTQy0+cmVxdWVzdF9idWZmZXIpIHsKKwkJaWYgKCghU0MtPnVzZV9zZykgJiYgU0MtPnJlcXVlc3RfYnVmZmxlbiAmJgorCQkgICAgKCgoY2hhciAqKSBTQy0+cmVxdWVzdF9idWZmZXIpWzBdID09ICdDJykgJiYKKwkJICAgICgoKGNoYXIgKikgU0MtPnJlcXVlc3RfYnVmZmVyKVsxXSA9PSAnTycpICYmCisJCSAgICAoKChjaGFyICopIFNDLT5yZXF1ZXN0X2J1ZmZlcilbMl0gPT0gJ1AnKSAmJgorCQkgICAgKCgoY2hhciAqKSBTQy0+cmVxdWVzdF9idWZmZXIpWzNdID09ICdQJykpCisJCQlyZXR1cm4gMTsKKwkJZWxzZSBpZiAoU0MtPnVzZV9zZykgeworCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IFNDLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJCWNoYXIgKmJ1ZmZlciA9IElQU19TR19BRERSRVNTKHNnKTsKKwkJCWlmIChidWZmZXIgJiYgYnVmZmVyWzBdID09ICdDJyAmJiBidWZmZXJbMV0gPT0gJ08nICYmCisJCQkgICAgYnVmZmVyWzJdID09ICdQJyAmJiBidWZmZXJbM10gPT0gJ1AnKQorCQkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfYWxsb2NfcGFzc3RocnVfYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBhbGxvY2F0ZSBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggZm9yIHRoZSBpb2N0bCBkYXRhIGlmIHRoZSBpb2N0bCBidWZmZXIgICovCisvKiAgIGlzIHRvbyBzbWFsbCBvciBkb2Vzbid0IGV4aXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2FsbG9jX3Bhc3N0aHJ1X2J1ZmZlcihpcHNfaGFfdCAqIGhhLCBpbnQgbGVuZ3RoKQoreworCXZvaWQgKmJpZ2dlcl9idWY7CisJZG1hX2FkZHJfdCBkbWFfYnVzYWRkcjsKKworCWlmIChoYS0+aW9jdGxfZGF0YSAmJiBsZW5ndGggPD0gaGEtPmlvY3RsX2xlbikKKwkJcmV0dXJuIDA7CisJLyogdGhlcmUgaXMgbm8gYnVmZmVyIG9yIGl0J3Mgbm90IGJpZyBlbm91Z2gsIGFsbG9jYXRlIGEgbmV3IG9uZSAqLworCWJpZ2dlcl9idWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChoYS0+cGNpZGV2LCBsZW5ndGgsICZkbWFfYnVzYWRkcik7CisJaWYgKGJpZ2dlcl9idWYpIHsKKwkJLyogZnJlZSB0aGUgb2xkIG1lbW9yeSAqLworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wY2lkZXYsIGhhLT5pb2N0bF9sZW4sIGhhLT5pb2N0bF9kYXRhLAorCQkJCSAgICBoYS0+aW9jdGxfYnVzYWRkcik7CisJCS8qIHVzZSB0aGUgbmV3IG1lbW9yeSAqLworCQloYS0+aW9jdGxfZGF0YSA9IChjaGFyICopIGJpZ2dlcl9idWY7CisJCWhhLT5pb2N0bF9sZW4gPSBsZW5ndGg7CisJCWhhLT5pb2N0bF9idXNhZGRyID0gZG1hX2J1c2FkZHI7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX21ha2VfcGFzc3RocnUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBNYWtlIGEgcGFzc3RocnUgY29tbWFuZCBvdXQgb2YgdGhlIGluZm8gaW4gdGhlIFNjc2kgYmxvY2sgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX21ha2VfcGFzc3RocnUoaXBzX2hhX3QgKiBoYSwgU2NzaV9DbW5kICogU0MsIGlwc19zY2JfdCAqIHNjYiwgaW50IGludHIpCit7CisJaXBzX3Bhc3N0aHJ1X3QgKnB0OworCWludCBsZW5ndGggPSAwOworCWludCByZXQ7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19tYWtlX3Bhc3N0aHJ1IiwgMSk7CisKKwlpZiAoIVNDLT51c2Vfc2cpIHsKKwkJbGVuZ3RoID0gU0MtPnJlcXVlc3RfYnVmZmxlbjsKKwl9IGVsc2UgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gU0MtPnJlcXVlc3RfYnVmZmVyOworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IFNDLT51c2Vfc2c7IGkrKykKKwkJCWxlbmd0aCArPSBzZ1tpXS5sZW5ndGg7CisJfQorCWlmIChsZW5ndGggPCBzaXplb2YgKGlwc19wYXNzdGhydV90KSkgeworCQkvKiB3cm9uZyBzaXplICovCisJCURFQlVHX1ZBUigxLCAiKCVzJWQpIFBhc3N0aHJ1IHN0cnVjdHVyZSB3cm9uZyBzaXplIiwKKwkJCSAgaXBzX25hbWUsIGhhLT5ob3N0X251bSk7CisJCXJldHVybiAoSVBTX0ZBSUxVUkUpOworCX0KKwlpZiAoaXBzX2FsbG9jX3Bhc3N0aHJ1X2J1ZmZlcihoYSwgbGVuZ3RoKSkgeworCQkvKiBhbGxvY2F0aW9uIGZhaWx1cmUhICBJZiBoYS0+aW9jdGxfZGF0YSBleGlzdHMsIHVzZSBpdCB0byByZXR1cm4KKwkJICAgc29tZSBlcnJvciBjb2Rlcy4gIFJldHVybiBhIGZhaWxlZCBjb21tYW5kIHRvIHRoZSBzY3NpIGxheWVyLiAqLworCQlpZiAoaGEtPmlvY3RsX2RhdGEpIHsKKwkJCXB0ID0gKGlwc19wYXNzdGhydV90ICopIGhhLT5pb2N0bF9kYXRhOworCQkJaXBzX3NjbWRfYnVmX3JlYWQoU0MsIHB0LCBzaXplb2YgKGlwc19wYXNzdGhydV90KSk7CisJCQlwdC0+QmFzaWNTdGF0dXMgPSAweDBCOworCQkJcHQtPkV4dGVuZGVkU3RhdHVzID0gMHgwMDsKKwkJCWlwc19zY21kX2J1Zl93cml0ZShTQywgcHQsIHNpemVvZiAoaXBzX3Bhc3N0aHJ1X3QpKTsKKwkJfQorCQlyZXR1cm4gSVBTX0ZBSUxVUkU7CisJfQorCWhhLT5pb2N0bF9kYXRhc2l6ZSA9IGxlbmd0aDsKKworCWlwc19zY21kX2J1Zl9yZWFkKFNDLCBoYS0+aW9jdGxfZGF0YSwgaGEtPmlvY3RsX2RhdGFzaXplKTsKKwlwdCA9IChpcHNfcGFzc3RocnVfdCAqKSBoYS0+aW9jdGxfZGF0YTsKKworCS8qCisJICogU29tZSBub3RlcyBhYm91dCB0aGUgcGFzc3RocnUgaW50ZXJmYWNlIHVzZWQKKwkgKgorCSAqIElGIHRoZSBzY3NpIG9wX2NvZGUgPT0gMHgwZCB0aGVuIHdlIGFzc3VtZQorCSAqIHRoYXQgdGhlIGRhdGEgY2FtZSBhbG9uZyB3aXRoL2dvZXMgd2l0aCB0aGUKKwkgKiBwYWNrZXQgd2UgcmVjZWl2ZWQgZnJvbSB0aGUgc2cgZHJpdmVyLiBJbiB0aGlzCisJICogY2FzZSB0aGUgQ21kQlNpemUgZmllbGQgb2YgdGhlIHB0IHN0cnVjdHVyZSBpcworCSAqIHVzZWQgZm9yIHRoZSBzaXplIG9mIHRoZSBidWZmZXIuCisJICovCisKKwlzd2l0Y2ggKHB0LT5Db3BwQ21kKSB7CisJY2FzZSBJUFNfTlVNQ1RSTFM6CisJCW1lbWNweShoYS0+aW9jdGxfZGF0YSArIHNpemVvZiAoaXBzX3Bhc3N0aHJ1X3QpLAorCQkgICAgICAgJmlwc19udW1fY29udHJvbGxlcnMsIHNpemVvZiAoaW50KSk7CisJCWlwc19zY21kX2J1Zl93cml0ZShTQywgaGEtPmlvY3RsX2RhdGEsCisJCQkJICAgc2l6ZW9mIChpcHNfcGFzc3RocnVfdCkgKyBzaXplb2YgKGludCkpOworCQlTQy0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCisJCXJldHVybiAoSVBTX1NVQ0NFU1NfSU1NKTsKKworCWNhc2UgSVBTX0NPUFBVU1JDTUQ6CisJY2FzZSBJUFNfQ09QUElPQ0NNRDoKKwkJaWYgKFNDLT5jbW5kWzBdID09IElQU19JT0NUTF9DT01NQU5EKSB7CisJCQlpZiAobGVuZ3RoIDwgKHNpemVvZiAoaXBzX3Bhc3N0aHJ1X3QpICsgcHQtPkNtZEJTaXplKSkgeworCQkJCS8qIHdyb25nIHNpemUgKi8KKwkJCQlERUJVR19WQVIoMSwKKwkJCQkJICAiKCVzJWQpIFBhc3N0aHJ1IHN0cnVjdHVyZSB3cm9uZyBzaXplIiwKKwkJCQkJICBpcHNfbmFtZSwgaGEtPmhvc3RfbnVtKTsKKworCQkJCXJldHVybiAoSVBTX0ZBSUxVUkUpOworCQkJfQorCisJCQlpZiAoaGEtPmRldmljZV9pZCA9PSBJUFNfREVWSUNFSURfQ09QUEVSSEVBRCAmJgorCQkJICAgIHB0LT5Db3BwQ1AuY21kLmZsYXNoZncub3BfY29kZSA9PQorCQkJICAgIElQU19DTURfUldfQklPU0ZXKSB7CisJCQkJcmV0ID0gaXBzX2ZsYXNoX2NvcHBlcmhlYWQoaGEsIHB0LCBzY2IpOworCQkJCWlwc19zY21kX2J1Zl93cml0ZShTQywgaGEtPmlvY3RsX2RhdGEsCisJCQkJCQkgICBzaXplb2YgKGlwc19wYXNzdGhydV90KSk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCWlmIChpcHNfdXNyY21kKGhhLCBwdCwgc2NiKSkKKwkJCQlyZXR1cm4gKElQU19TVUNDRVNTKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKElQU19GQUlMVVJFKTsKKwkJfQorCisJCWJyZWFrOworCisJfQkJCS8qIGVuZCBzd2l0Y2ggKi8KKworCXJldHVybiAoSVBTX0ZBSUxVUkUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2ZsYXNoX2NvcHBlcmhlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEZsYXNoIHRoZSBCSU9TL0ZXIG9uIGEgQ29wcGVyaGVhZCBzdHlsZSBjb250cm9sbGVyICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2ZsYXNoX2NvcHBlcmhlYWQoaXBzX2hhX3QgKiBoYSwgaXBzX3Bhc3N0aHJ1X3QgKiBwdCwgaXBzX3NjYl90ICogc2NiKQoreworCWludCBkYXRhc2l6ZTsKKworCS8qIFRyb21ib25lIGlzIHRoZSBvbmx5IGNvcHBlcmhlYWQgdGhhdCBjYW4gZG8gcGFja2V0IGZsYXNoLCBidXQgb25seQorCSAqIGZvciBmaXJtd2FyZS4gTm8gb25lIHNhaWQgaXQgaGFkIHRvIG1ha2Ugc2VuY2UuICovCisJaWYgKElQU19JU19UUk9NQk9ORShoYSkgJiYgcHQtPkNvcHBDUC5jbWQuZmxhc2hmdy50eXBlID09IElQU19GV19JTUFHRSkgeworCQlpZiAoaXBzX3VzcmNtZChoYSwgcHQsIHNjYikpCisJCQlyZXR1cm4gSVBTX1NVQ0NFU1M7CisJCWVsc2UKKwkJCXJldHVybiBJUFNfRkFJTFVSRTsKKwl9CisJcHQtPkJhc2ljU3RhdHVzID0gMHgwQjsKKwlwdC0+RXh0ZW5kZWRTdGF0dXMgPSAwOworCXNjYi0+c2NzaV9jbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkvKiBJRiBpdCdzIE9LIHRvIFVzZSB0aGUgIkNEIEJPT1QiIEZsYXNoIEJ1ZmZlciwgdGhlbiB5b3UgY2FuICAgICAqLworCS8qIGF2b2lkIGFsbG9jYXRpbmcgYSBodWdlIGJ1ZmZlciBwZXIgYWRhcHRlciAoIHdoaWNoIGNhbiBmYWlsICkuICovCisJaWYgKHB0LT5Db3BwQ1AuY21kLmZsYXNoZncudHlwZSA9PSBJUFNfQklPU19JTUFHRSAmJgorCSAgICBwdC0+Q29wcENQLmNtZC5mbGFzaGZ3LmRpcmVjdGlvbiA9PSBJUFNfRVJBU0VfQklPUykgeworCQlwdC0+QmFzaWNTdGF0dXMgPSAwOworCQlyZXR1cm4gaXBzX2ZsYXNoX2Jpb3MoaGEsIHB0LCBzY2IpOworCX0gZWxzZSBpZiAocHQtPkNvcHBDUC5jbWQuZmxhc2hmdy5wYWNrZXRfbnVtID09IDApIHsKKwkJaWYgKGlwc19GbGFzaERhdGEgJiYgIXRlc3RfYW5kX3NldF9iaXQoMCwgJmlwc19GbGFzaERhdGFJblVzZSkpeworCQkJaGEtPmZsYXNoX2RhdGEgPSBpcHNfRmxhc2hEYXRhOworCQkJaGEtPmZsYXNoX2J1c2FkZHIgPSBpcHNfZmxhc2hidXNhZGRyOworCQkJaGEtPmZsYXNoX2xlbiA9IFBBR0VfU0laRSA8PCA3OworCQkJaGEtPmZsYXNoX2RhdGFzaXplID0gMDsKKwkJfSBlbHNlIGlmICghaGEtPmZsYXNoX2RhdGEpIHsKKwkJCWRhdGFzaXplID0gcHQtPkNvcHBDUC5jbWQuZmxhc2hmdy50b3RhbF9wYWNrZXRzICoKKwkJCSAgICBwdC0+Q29wcENQLmNtZC5mbGFzaGZ3LmNvdW50OworCQkJaGEtPmZsYXNoX2RhdGEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChoYS0+cGNpZGV2LAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgZGF0YXNpemUsCisJCQkJCQkJICAgICAgJmhhLT5mbGFzaF9idXNhZGRyKTsKKwkJCWlmICghaGEtPmZsYXNoX2RhdGEpeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBhbGxvY2F0ZSBhIGZsYXNoIGJ1ZmZlclxuIik7CisJCQkJcmV0dXJuIElQU19GQUlMVVJFOworCQkJfQorCQkJaGEtPmZsYXNoX2RhdGFzaXplID0gMDsKKwkJCWhhLT5mbGFzaF9sZW4gPSBkYXRhc2l6ZTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gSVBTX0ZBSUxVUkU7CisJfSBlbHNlIHsKKwkJaWYgKHB0LT5Db3BwQ1AuY21kLmZsYXNoZncuY291bnQgKyBoYS0+Zmxhc2hfZGF0YXNpemUgPgorCQkgICAgaGEtPmZsYXNoX2xlbikgeworCQkJaXBzX2ZyZWVfZmxhc2hfY29wcGVyaGVhZChoYSk7CisJCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgaGEtPnBjaWRldiwKKwkJCQkgICAiZmFpbGVkIHNpemUgc2FuaXR5IGNoZWNrXG4iKTsKKwkJCXJldHVybiBJUFNfRkFJTFVSRTsKKwkJfQorCX0KKwlpZiAoIWhhLT5mbGFzaF9kYXRhKQorCQlyZXR1cm4gSVBTX0ZBSUxVUkU7CisJcHQtPkJhc2ljU3RhdHVzID0gMDsKKwltZW1jcHkoJmhhLT5mbGFzaF9kYXRhW2hhLT5mbGFzaF9kYXRhc2l6ZV0sIHB0ICsgMSwKKwkgICAgICAgcHQtPkNvcHBDUC5jbWQuZmxhc2hmdy5jb3VudCk7CisJaGEtPmZsYXNoX2RhdGFzaXplICs9IHB0LT5Db3BwQ1AuY21kLmZsYXNoZncuY291bnQ7CisJaWYgKHB0LT5Db3BwQ1AuY21kLmZsYXNoZncucGFja2V0X251bSA9PQorCSAgICBwdC0+Q29wcENQLmNtZC5mbGFzaGZ3LnRvdGFsX3BhY2tldHMgLSAxKSB7CisJCWlmIChwdC0+Q29wcENQLmNtZC5mbGFzaGZ3LnR5cGUgPT0gSVBTX0JJT1NfSU1BR0UpCisJCQlyZXR1cm4gaXBzX2ZsYXNoX2Jpb3MoaGEsIHB0LCBzY2IpOworCQllbHNlIGlmIChwdC0+Q29wcENQLmNtZC5mbGFzaGZ3LnR5cGUgPT0gSVBTX0ZXX0lNQUdFKQorCQkJcmV0dXJuIGlwc19mbGFzaF9maXJtd2FyZShoYSwgcHQsIHNjYik7CisJfQorCXJldHVybiBJUFNfU1VDQ0VTU19JTU07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUm91dGluZSBOYW1lOiBpcHNfZmxhc2hfYmlvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgZmxhc2hlcyB0aGUgYmlvcyBvZiBhIGNvcHBlcmhlYWQgYWRhcHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfZmxhc2hfYmlvcyhpcHNfaGFfdCAqIGhhLCBpcHNfcGFzc3RocnVfdCAqIHB0LCBpcHNfc2NiX3QgKiBzY2IpCit7CisKKwlpZiAocHQtPkNvcHBDUC5jbWQuZmxhc2hmdy50eXBlID09IElQU19CSU9TX0lNQUdFICYmCisJICAgIHB0LT5Db3BwQ1AuY21kLmZsYXNoZncuZGlyZWN0aW9uID09IElQU19XUklURV9CSU9TKSB7CisJCWlmICgoIWhhLT5mdW5jLnByb2dyYW1iaW9zKSB8fCAoIWhhLT5mdW5jLmVyYXNlYmlvcykgfHwKKwkJICAgICghaGEtPmZ1bmMudmVyaWZ5YmlvcykpCisJCQlnb3RvIGVycm9yOworCQlpZiAoKCpoYS0+ZnVuYy5lcmFzZWJpb3MpIChoYSkpIHsKKwkJCURFQlVHX1ZBUigxLAorCQkJCSAgIiglcyVkKSBmbGFzaCBiaW9zIGZhaWxlZCAtIHVuYWJsZSB0byBlcmFzZSBmbGFzaCIsCisJCQkJICBpcHNfbmFtZSwgaGEtPmhvc3RfbnVtKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0gZWxzZQorCQkgICAgaWYgKCgqaGEtPmZ1bmMucHJvZ3JhbWJpb3MpIChoYSwKKwkJCQkJCSBoYS0+Zmxhc2hfZGF0YSArCisJCQkJCQkgSVBTX0JJT1NfSEVBREVSLAorCQkJCQkJIGhhLT5mbGFzaF9kYXRhc2l6ZSAtCisJCQkJCQkgSVBTX0JJT1NfSEVBREVSLCAwKSkgeworCQkJREVCVUdfVkFSKDEsCisJCQkJICAiKCVzJWQpIGZsYXNoIGJpb3MgZmFpbGVkIC0gdW5hYmxlIHRvIGZsYXNoIiwKKwkJCQkgIGlwc19uYW1lLCBoYS0+aG9zdF9udW0pOworCQkJZ290byBlcnJvcjsKKwkJfSBlbHNlCisJCSAgICBpZiAoKCpoYS0+ZnVuYy52ZXJpZnliaW9zKSAoaGEsCisJCQkJCQloYS0+Zmxhc2hfZGF0YSArCisJCQkJCQlJUFNfQklPU19IRUFERVIsCisJCQkJCQloYS0+Zmxhc2hfZGF0YXNpemUgLQorCQkJCQkJSVBTX0JJT1NfSEVBREVSLCAwKSkgeworCQkJREVCVUdfVkFSKDEsCisJCQkJICAiKCVzJWQpIGZsYXNoIGJpb3MgZmFpbGVkIC0gdW5hYmxlIHRvIHZlcmlmeSBmbGFzaCIsCisJCQkJICBpcHNfbmFtZSwgaGEtPmhvc3RfbnVtKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJaXBzX2ZyZWVfZmxhc2hfY29wcGVyaGVhZChoYSk7CisJCXJldHVybiBJUFNfU1VDQ0VTU19JTU07CisJfSBlbHNlIGlmIChwdC0+Q29wcENQLmNtZC5mbGFzaGZ3LnR5cGUgPT0gSVBTX0JJT1NfSU1BR0UgJiYKKwkJICAgcHQtPkNvcHBDUC5jbWQuZmxhc2hmdy5kaXJlY3Rpb24gPT0gSVBTX0VSQVNFX0JJT1MpIHsKKwkJaWYgKCFoYS0+ZnVuYy5lcmFzZWJpb3MpCisJCQlnb3RvIGVycm9yOworCQlpZiAoKCpoYS0+ZnVuYy5lcmFzZWJpb3MpIChoYSkpIHsKKwkJCURFQlVHX1ZBUigxLAorCQkJCSAgIiglcyVkKSBmbGFzaCBiaW9zIGZhaWxlZCAtIHVuYWJsZSB0byBlcmFzZSBmbGFzaCIsCisJCQkJICBpcHNfbmFtZSwgaGEtPmhvc3RfbnVtKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJcmV0dXJuIElQU19TVUNDRVNTX0lNTTsKKwl9CisgICAgICBlcnJvcjoKKwlwdC0+QmFzaWNTdGF0dXMgPSAweDBCOworCXB0LT5FeHRlbmRlZFN0YXR1cyA9IDB4MDA7CisJaXBzX2ZyZWVfZmxhc2hfY29wcGVyaGVhZChoYSk7CisJcmV0dXJuIElQU19GQUlMVVJFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfZmlsbF9zY2Jfc2dfc2luZ2xlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBGaWxsIGluIGEgc2luZ2xlIHNjYiBzZ19saXN0IGVsZW1lbnQgZnJvbSBhbiBhZGRyZXNzICAgICAgICAgICAgICAgICAgICovCisvKiAgIHJldHVybiBhIC0xIGlmIGEgYnJlYWt1cCBvY2N1cnJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2ZpbGxfc2NiX3NnX3NpbmdsZShpcHNfaGFfdCAqIGhhLCBkbWFfYWRkcl90IGJ1c2FkZHIsCisJCSAgICAgICBpcHNfc2NiX3QgKiBzY2IsIGludCBpbmR4LCB1bnNpZ25lZCBpbnQgZV9sZW4pCit7CisKKwlpbnQgcmV0X3ZhbCA9IDA7CisKKwlpZiAoKHNjYi0+ZGF0YV9sZW4gKyBlX2xlbikgPiBoYS0+bWF4X3hmZXIpIHsKKwkJZV9sZW4gPSBoYS0+bWF4X3hmZXIgLSBzY2ItPmRhdGFfbGVuOworCQlzY2ItPmJyZWFrdXAgPSBpbmR4OworCQkrK3NjYi0+c2dfYnJlYWs7CisJCXJldF92YWwgPSAtMTsKKwl9IGVsc2UgeworCQlzY2ItPmJyZWFrdXAgPSAwOworCQlzY2ItPnNnX2JyZWFrID0gMDsKKwl9CisJaWYgKElQU19VU0VfRU5IX1NHTElTVChoYSkpIHsKKwkJc2NiLT5zZ19saXN0LmVuaF9saXN0W2luZHhdLmFkZHJlc3NfbG8gPQorCQkgICAgY3B1X3RvX2xlMzIocGNpX2RtYV9sbzMyKGJ1c2FkZHIpKTsKKwkJc2NiLT5zZ19saXN0LmVuaF9saXN0W2luZHhdLmFkZHJlc3NfaGkgPQorCQkgICAgY3B1X3RvX2xlMzIocGNpX2RtYV9oaTMyKGJ1c2FkZHIpKTsKKwkJc2NiLT5zZ19saXN0LmVuaF9saXN0W2luZHhdLmxlbmd0aCA9IGNwdV90b19sZTMyKGVfbGVuKTsKKwl9IGVsc2UgeworCQlzY2ItPnNnX2xpc3Quc3RkX2xpc3RbaW5keF0uYWRkcmVzcyA9CisJCSAgICBjcHVfdG9fbGUzMihwY2lfZG1hX2xvMzIoYnVzYWRkcikpOworCQlzY2ItPnNnX2xpc3Quc3RkX2xpc3RbaW5keF0ubGVuZ3RoID0gY3B1X3RvX2xlMzIoZV9sZW4pOworCX0KKworCSsrc2NiLT5zZ19sZW47CisJc2NiLT5kYXRhX2xlbiArPSBlX2xlbjsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19mbGFzaF9maXJtd2FyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBmbGFzaGVzIHRoZSBmaXJtd2FyZSBvZiBhIGNvcHBlcmhlYWQgYWRhcHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19mbGFzaF9maXJtd2FyZShpcHNfaGFfdCAqIGhhLCBpcHNfcGFzc3RocnVfdCAqIHB0LCBpcHNfc2NiX3QgKiBzY2IpCit7CisJSVBTX1NHX0xJU1Qgc2dfbGlzdDsKKwl1aW50MzJfdCBjbWRfYnVzYWRkcjsKKworCWlmIChwdC0+Q29wcENQLmNtZC5mbGFzaGZ3LnR5cGUgPT0gSVBTX0ZXX0lNQUdFICYmCisJICAgIHB0LT5Db3BwQ1AuY21kLmZsYXNoZncuZGlyZWN0aW9uID09IElQU19XUklURV9GVykgeworCQltZW1zZXQoJnB0LT5Db3BwQ1AuY21kLCAwLCBzaXplb2YgKElQU19IT1NUX0NPTU1BTkQpKTsKKwkJcHQtPkNvcHBDUC5jbWQuZmxhc2hmdy5vcF9jb2RlID0gSVBTX0NNRF9ET1dOTE9BRDsKKwkJcHQtPkNvcHBDUC5jbWQuZmxhc2hmdy5jb3VudCA9IGNwdV90b19sZTMyKGhhLT5mbGFzaF9kYXRhc2l6ZSk7CisJfSBlbHNlIHsKKwkJcHQtPkJhc2ljU3RhdHVzID0gMHgwQjsKKwkJcHQtPkV4dGVuZGVkU3RhdHVzID0gMHgwMDsKKwkJaXBzX2ZyZWVfZmxhc2hfY29wcGVyaGVhZChoYSk7CisJCXJldHVybiBJUFNfRkFJTFVSRTsKKwl9CisJLyogU2F2ZSB0aGUgUy9HIGxpc3QgcG9pbnRlciBzbyBpdCBkb2Vzbid0IGdldCBjbG9iYmVyZWQgKi8KKwlzZ19saXN0Lmxpc3QgPSBzY2ItPnNnX2xpc3QubGlzdDsKKwljbWRfYnVzYWRkciA9IHNjYi0+c2NiX2J1c2FkZHI7CisJLyogY29weSBpbiB0aGUgQ1AgKi8KKwltZW1jcHkoJnNjYi0+Y21kLCAmcHQtPkNvcHBDUC5jbWQsIHNpemVvZiAoSVBTX0lPQ1RMX0NNRCkpOworCS8qIEZJWCBzdHVmZiB0aGF0IG1pZ2h0IGJlIHdyb25nICovCisJc2NiLT5zZ19saXN0Lmxpc3QgPSBzZ19saXN0Lmxpc3Q7CisJc2NiLT5zY2JfYnVzYWRkciA9IGNtZF9idXNhZGRyOworCXNjYi0+YnVzID0gc2NiLT5zY3NpX2NtZC0+ZGV2aWNlLT5jaGFubmVsOworCXNjYi0+dGFyZ2V0X2lkID0gc2NiLT5zY3NpX2NtZC0+ZGV2aWNlLT5pZDsKKwlzY2ItPmx1biA9IHNjYi0+c2NzaV9jbWQtPmRldmljZS0+bHVuOworCXNjYi0+c2dfbGVuID0gMDsKKwlzY2ItPmRhdGFfbGVuID0gMDsKKwlzY2ItPmZsYWdzID0gMDsKKwlzY2ItPm9wX2NvZGUgPSAwOworCXNjYi0+Y2FsbGJhY2sgPSBpcHNpbnRyX2RvbmU7CisJc2NiLT50aW1lb3V0ID0gaXBzX2NtZF90aW1lb3V0OworCisJc2NiLT5kYXRhX2xlbiA9IGhhLT5mbGFzaF9kYXRhc2l6ZTsKKwlzY2ItPmRhdGFfYnVzYWRkciA9CisJICAgIHBjaV9tYXBfc2luZ2xlKGhhLT5wY2lkZXYsIGhhLT5mbGFzaF9kYXRhLCBzY2ItPmRhdGFfbGVuLAorCQkJICAgSVBTX0RNQV9ESVIoc2NiKSk7CisJc2NiLT5mbGFncyB8PSBJUFNfU0NCX01BUF9TSU5HTEU7CisJc2NiLT5jbWQuZmxhc2hmdy5jb21tYW5kX2lkID0gSVBTX0NPTU1BTkRfSUQoaGEsIHNjYik7CisJc2NiLT5jbWQuZmxhc2hmdy5idWZmZXJfYWRkciA9IGNwdV90b19sZTMyKHNjYi0+ZGF0YV9idXNhZGRyKTsKKwlpZiAocHQtPlRpbWVPdXQpCisJCXNjYi0+dGltZW91dCA9IHB0LT5UaW1lT3V0OworCXNjYi0+c2NzaV9jbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwlyZXR1cm4gSVBTX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUm91dGluZSBOYW1lOiBpcHNfZnJlZV9mbGFzaF9jb3BwZXJoZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcmVsZWFzZSB0aGUgbWVtb3J5IHJlc291cmNlcyB1c2VkIHRvIGhvbGQgdGhlIGZsYXNoIGltYWdlICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX2ZyZWVfZmxhc2hfY29wcGVyaGVhZChpcHNfaGFfdCAqIGhhKQoreworCWlmIChoYS0+Zmxhc2hfZGF0YSA9PSBpcHNfRmxhc2hEYXRhKQorCQl0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJmlwc19GbGFzaERhdGFJblVzZSk7CisJZWxzZSBpZiAoaGEtPmZsYXNoX2RhdGEpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBjaWRldiwgaGEtPmZsYXNoX2xlbiwgaGEtPmZsYXNoX2RhdGEsCisJCQkJICAgIGhhLT5mbGFzaF9idXNhZGRyKTsKKwloYS0+Zmxhc2hfZGF0YSA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc191c3JjbWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUHJvY2VzcyBhIHVzZXIgY29tbWFuZCBhbmQgbWFrZSBpdCByZWFkeSB0byBzZW5kICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc191c3JjbWQoaXBzX2hhX3QgKiBoYSwgaXBzX3Bhc3N0aHJ1X3QgKiBwdCwgaXBzX3NjYl90ICogc2NiKQoreworCUlQU19TR19MSVNUIHNnX2xpc3Q7CisJdWludDMyX3QgY21kX2J1c2FkZHI7CisKKwlNRVRIT0RfVFJBQ0UoImlwc191c3JjbWQiLCAxKTsKKworCWlmICgoIXNjYikgfHwgKCFwdCkgfHwgKCFoYSkpCisJCXJldHVybiAoMCk7CisKKwkvKiBTYXZlIHRoZSBTL0cgbGlzdCBwb2ludGVyIHNvIGl0IGRvZXNuJ3QgZ2V0IGNsb2JiZXJlZCAqLworCXNnX2xpc3QubGlzdCA9IHNjYi0+c2dfbGlzdC5saXN0OworCWNtZF9idXNhZGRyID0gc2NiLT5zY2JfYnVzYWRkcjsKKwkvKiBjb3B5IGluIHRoZSBDUCAqLworCW1lbWNweSgmc2NiLT5jbWQsICZwdC0+Q29wcENQLmNtZCwgc2l6ZW9mIChJUFNfSU9DVExfQ01EKSk7CisJbWVtY3B5KCZzY2ItPmRjZGIsICZwdC0+Q29wcENQLmRjZGIsIHNpemVvZiAoSVBTX0RDREJfVEFCTEUpKTsKKworCS8qIEZJWCBzdHVmZiB0aGF0IG1pZ2h0IGJlIHdyb25nICovCisJc2NiLT5zZ19saXN0Lmxpc3QgPSBzZ19saXN0Lmxpc3Q7CisJc2NiLT5zY2JfYnVzYWRkciA9IGNtZF9idXNhZGRyOworCXNjYi0+YnVzID0gc2NiLT5zY3NpX2NtZC0+ZGV2aWNlLT5jaGFubmVsOworCXNjYi0+dGFyZ2V0X2lkID0gc2NiLT5zY3NpX2NtZC0+ZGV2aWNlLT5pZDsKKwlzY2ItPmx1biA9IHNjYi0+c2NzaV9jbWQtPmRldmljZS0+bHVuOworCXNjYi0+c2dfbGVuID0gMDsKKwlzY2ItPmRhdGFfbGVuID0gMDsKKwlzY2ItPmZsYWdzID0gMDsKKwlzY2ItPm9wX2NvZGUgPSAwOworCXNjYi0+Y2FsbGJhY2sgPSBpcHNpbnRyX2RvbmU7CisJc2NiLT50aW1lb3V0ID0gaXBzX2NtZF90aW1lb3V0OworCXNjYi0+Y21kLmJhc2ljX2lvLmNvbW1hbmRfaWQgPSBJUFNfQ09NTUFORF9JRChoYSwgc2NiKTsKKworCS8qIHdlIGRvbid0IHN1cHBvcnQgRENEQi9SRUFEL1dSSVRFIFNjYXR0ZXIgR2F0aGVyICovCisJaWYgKChzY2ItPmNtZC5iYXNpY19pby5vcF9jb2RlID09IElQU19DTURfUkVBRF9TRykgfHwKKwkgICAgKHNjYi0+Y21kLmJhc2ljX2lvLm9wX2NvZGUgPT0gSVBTX0NNRF9XUklURV9TRykgfHwKKwkgICAgKHNjYi0+Y21kLmJhc2ljX2lvLm9wX2NvZGUgPT0gSVBTX0NNRF9EQ0RCX1NHKSkKKwkJcmV0dXJuICgwKTsKKworCWlmIChwdC0+Q21kQlNpemUpIHsKKwkJc2NiLT5kYXRhX2xlbiA9IHB0LT5DbWRCU2l6ZTsKKwkJc2NiLT5kYXRhX2J1c2FkZHIgPSBoYS0+aW9jdGxfYnVzYWRkciArIHNpemVvZiAoaXBzX3Bhc3N0aHJ1X3QpOworCX0gZWxzZSB7CisJCXNjYi0+ZGF0YV9idXNhZGRyID0gMEw7CisJfQorCisJaWYgKHNjYi0+Y21kLmRjZGIub3BfY29kZSA9PSBJUFNfQ01EX0RDREIpCisJCXNjYi0+Y21kLmRjZGIuZGNkYl9hZGRyZXNzID0gY3B1X3RvX2xlMzIoc2NiLT5zY2JfYnVzYWRkciArCisJCQkJCQkJICh1bnNpZ25lZCBsb25nKSAmc2NiLT4KKwkJCQkJCQkgZGNkYiAtCisJCQkJCQkJICh1bnNpZ25lZCBsb25nKSBzY2IpOworCisJaWYgKHB0LT5DbWRCU2l6ZSkgeworCQlpZiAoc2NiLT5jbWQuZGNkYi5vcF9jb2RlID09IElQU19DTURfRENEQikKKwkJCXNjYi0+ZGNkYi5idWZmZXJfcG9pbnRlciA9CisJCQkgICAgY3B1X3RvX2xlMzIoc2NiLT5kYXRhX2J1c2FkZHIpOworCQllbHNlCisJCQlzY2ItPmNtZC5iYXNpY19pby5zZ19hZGRyID0KKwkJCSAgICBjcHVfdG9fbGUzMihzY2ItPmRhdGFfYnVzYWRkcik7CisJfQorCisJLyogc2V0IHRpbWVvdXRzICovCisJaWYgKHB0LT5UaW1lT3V0KSB7CisJCXNjYi0+dGltZW91dCA9IHB0LT5UaW1lT3V0OworCisJCWlmIChwdC0+VGltZU91dCA8PSAxMCkKKwkJCXNjYi0+ZGNkYi5jbWRfYXR0cmlidXRlIHw9IElQU19USU1FT1VUMTA7CisJCWVsc2UgaWYgKHB0LT5UaW1lT3V0IDw9IDYwKQorCQkJc2NiLT5kY2RiLmNtZF9hdHRyaWJ1dGUgfD0gSVBTX1RJTUVPVVQ2MDsKKwkJZWxzZQorCQkJc2NiLT5kY2RiLmNtZF9hdHRyaWJ1dGUgfD0gSVBTX1RJTUVPVVQyME07CisJfQorCisJLyogYXNzdW1lIHN1Y2Nlc3MgKi8KKwlzY2ItPnNjc2lfY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisKKwkvKiBzdWNjZXNzICovCisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2NsZWFudXBfcGFzc3RocnUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBDbGVhbnVwIGFmdGVyIGEgcGFzc3RocnUgY29tbWFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19jbGVhbnVwX3Bhc3N0aHJ1KGlwc19oYV90ICogaGEsIGlwc19zY2JfdCAqIHNjYikKK3sKKwlpcHNfcGFzc3RocnVfdCAqcHQ7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19jbGVhbnVwX3Bhc3N0aHJ1IiwgMSk7CisKKwlpZiAoKCFzY2IpIHx8ICghc2NiLT5zY3NpX2NtZCkgfHwgKCFzY2ItPnNjc2lfY21kLT5yZXF1ZXN0X2J1ZmZlcikpIHsKKwkJREVCVUdfVkFSKDEsICIoJXMlZCkgY291bGRuJ3QgY2xlYW51cCBhZnRlciBwYXNzdGhydSIsCisJCQkgIGlwc19uYW1lLCBoYS0+aG9zdF9udW0pOworCisJCXJldHVybjsKKwl9CisJcHQgPSAoaXBzX3Bhc3N0aHJ1X3QgKikgaGEtPmlvY3RsX2RhdGE7CisKKwkvKiBDb3B5IGRhdGEgYmFjayB0byB0aGUgdXNlciAqLworCWlmIChzY2ItPmNtZC5kY2RiLm9wX2NvZGUgPT0gSVBTX0NNRF9EQ0RCKQkvKiBDb3B5IERDREIgQmFjayB0byBDYWxsZXIncyBBcmVhICovCisJCW1lbWNweSgmcHQtPkNvcHBDUC5kY2RiLCAmc2NiLT5kY2RiLCBzaXplb2YgKElQU19EQ0RCX1RBQkxFKSk7CisKKwlwdC0+QmFzaWNTdGF0dXMgPSBzY2ItPmJhc2ljX3N0YXR1czsKKwlwdC0+RXh0ZW5kZWRTdGF0dXMgPSBzY2ItPmV4dGVuZGVkX3N0YXR1czsKKwlwdC0+QWRhcHRlclR5cGUgPSBoYS0+YWRfdHlwZTsKKworCWlmIChoYS0+ZGV2aWNlX2lkID09IElQU19ERVZJQ0VJRF9DT1BQRVJIRUFEICYmCisJICAgIChzY2ItPmNtZC5mbGFzaGZ3Lm9wX2NvZGUgPT0gSVBTX0NNRF9ET1dOTE9BRCB8fAorCSAgICAgc2NiLT5jbWQuZmxhc2hmdy5vcF9jb2RlID09IElQU19DTURfUldfQklPU0ZXKSkKKwkJaXBzX2ZyZWVfZmxhc2hfY29wcGVyaGVhZChoYSk7CisKKwlpcHNfc2NtZF9idWZfd3JpdGUoc2NiLT5zY3NpX2NtZCwgaGEtPmlvY3RsX2RhdGEsIGhhLT5pb2N0bF9kYXRhc2l6ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19ob3N0X2luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlIHBhc3N0aHJ1IGludGVyZmFjZSBmb3IgdGhlIGRyaXZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19ob3N0X2luZm8oaXBzX2hhX3QgKiBoYSwgY2hhciAqcHRyLCBvZmZfdCBvZmZzZXQsIGludCBsZW4pCit7CisJSVBTX0lORk9TVFIgaW5mbzsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2hvc3RfaW5mbyIsIDEpOworCisJaW5mby5idWZmZXIgPSBwdHI7CisJaW5mby5sZW5ndGggPSBsZW47CisJaW5mby5vZmZzZXQgPSBvZmZzZXQ7CisJaW5mby5wb3MgPSAwOworCWluZm8ubG9jYWxwb3MgPSAwOworCisJY29weV9pbmZvKCZpbmZvLCAiXG5JQk0gU2VydmVSQUlEIEdlbmVyYWwgSW5mb3JtYXRpb246XG5cbiIpOworCisJaWYgKChsZTMyX3RvX2NwdShoYS0+bnZyYW0tPnNpZ25hdHVyZSkgPT0gSVBTX05WUkFNX1A1X1NJRykgJiYKKwkgICAgKGxlMTZfdG9fY3B1KGhhLT5udnJhbS0+YWRhcHRlcl90eXBlKSAhPSAwKSkKKwkJY29weV9pbmZvKCZpbmZvLCAiXHRDb250cm9sbGVyIFR5cGUgICAgICAgICAgICAgICAgICAgOiAlc1xuIiwKKwkJCSAgaXBzX2FkYXB0ZXJfbmFtZVtoYS0+YWRfdHlwZSAtIDFdKTsKKwllbHNlCisJCWNvcHlfaW5mbygmaW5mbywKKwkJCSAgIlx0Q29udHJvbGxlciBUeXBlICAgICAgICAgICAgICAgICAgIDogVW5rbm93blxuIik7CisKKwlpZiAoaGEtPmlvX2FkZHIpCisJCWNvcHlfaW5mbygmaW5mbywKKwkJCSAgIlx0SU8gcmVnaW9uICAgICAgICAgICAgICAgICAgICAgICAgIDogMHglbHggKCVkIGJ5dGVzKVxuIiwKKwkJCSAgaGEtPmlvX2FkZHIsIGhhLT5pb19sZW4pOworCisJaWYgKGhhLT5tZW1fYWRkcikgeworCQljb3B5X2luZm8oJmluZm8sCisJCQkgICJcdE1lbW9yeSByZWdpb24gICAgICAgICAgICAgICAgICAgICA6IDB4JWx4ICglZCBieXRlcylcbiIsCisJCQkgIGhhLT5tZW1fYWRkciwgaGEtPm1lbV9sZW4pOworCQljb3B5X2luZm8oJmluZm8sCisJCQkgICJcdFNoYXJlZCBtZW1vcnkgYWRkcmVzcyAgICAgICAgICAgICA6IDB4JWx4XG4iLAorCQkJICBoYS0+bWVtX3B0cik7CisJfQorCisJY29weV9pbmZvKCZpbmZvLCAiXHRJUlEgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgOiAlZFxuIiwgaGEtPmlycSk7CisKKyAgICAvKiBGb3IgdGhlIE5leHQgMyBsaW5lcyBDaGVjayBmb3IgQmluYXJ5IDAgYXQgdGhlIGVuZCBhbmQgZG9uJ3QgaW5jbHVkZSBpdCBpZiBpdCdzIHRoZXJlLiAqLworICAgIC8qIFRoYXQga2VlcHMgZXZlcnl0aGluZyBoYXBweSBmb3IgInRleHQiIG9wZXJhdGlvbnMgb24gdGhlIHByb2MgZmlsZS4gICAgICAgICAgICAgICAgICAgICovCisKKwlpZiAobGUzMl90b19jcHUoaGEtPm52cmFtLT5zaWduYXR1cmUpID09IElQU19OVlJBTV9QNV9TSUcpIHsKKyAgICAgICAgaWYgKGhhLT5udnJhbS0+Ymlvc19sb3dbM10gPT0gMCkgeyAKKyAgICAgICAgICAgIGNvcHlfaW5mbygmaW5mbywKKwkJCSAgICAgICAgICAiXHRCSU9TIFZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgOiAlYyVjJWMlYyVjJWMlY1xuIiwKKwkJCSAgICAgICAgICBoYS0+bnZyYW0tPmJpb3NfaGlnaFswXSwgaGEtPm52cmFtLT5iaW9zX2hpZ2hbMV0sCisJCQkgICAgICAgICAgaGEtPm52cmFtLT5iaW9zX2hpZ2hbMl0sIGhhLT5udnJhbS0+Ymlvc19oaWdoWzNdLAorCQkJICAgICAgICAgIGhhLT5udnJhbS0+Ymlvc19sb3dbMF0sIGhhLT5udnJhbS0+Ymlvc19sb3dbMV0sCisJCQkgICAgICAgICAgaGEtPm52cmFtLT5iaW9zX2xvd1syXSk7CisKKyAgICAgICAgfSBlbHNlIHsKKwkJICAgIGNvcHlfaW5mbygmaW5mbywKKwkJCSAgICAgICAgICAiXHRCSU9TIFZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgOiAlYyVjJWMlYyVjJWMlYyVjXG4iLAorCQkJICAgICAgICAgIGhhLT5udnJhbS0+Ymlvc19oaWdoWzBdLCBoYS0+bnZyYW0tPmJpb3NfaGlnaFsxXSwKKwkJCSAgICAgICAgICBoYS0+bnZyYW0tPmJpb3NfaGlnaFsyXSwgaGEtPm52cmFtLT5iaW9zX2hpZ2hbM10sCisJCQkgICAgICAgICAgaGEtPm52cmFtLT5iaW9zX2xvd1swXSwgaGEtPm52cmFtLT5iaW9zX2xvd1sxXSwKKwkJCSAgICAgICAgICBoYS0+bnZyYW0tPmJpb3NfbG93WzJdLCBoYS0+bnZyYW0tPmJpb3NfbG93WzNdKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgaWYgKGhhLT5lbnEtPkNvZGVCbGtWZXJzaW9uWzddID09IDApIHsKKyAgICAgICAgY29weV9pbmZvKCZpbmZvLAorCQkgICAgICAgICAgIlx0RmlybXdhcmUgVmVyc2lvbiAgICAgICAgICAgICAgICAgIDogJWMlYyVjJWMlYyVjJWNcbiIsCisJCSAgICAgICAgICBoYS0+ZW5xLT5Db2RlQmxrVmVyc2lvblswXSwgaGEtPmVucS0+Q29kZUJsa1ZlcnNpb25bMV0sCisJCSAgICAgICAgICBoYS0+ZW5xLT5Db2RlQmxrVmVyc2lvblsyXSwgaGEtPmVucS0+Q29kZUJsa1ZlcnNpb25bM10sCisJCSAgICAgICAgICBoYS0+ZW5xLT5Db2RlQmxrVmVyc2lvbls0XSwgaGEtPmVucS0+Q29kZUJsa1ZlcnNpb25bNV0sCisJCSAgICAgICAgICBoYS0+ZW5xLT5Db2RlQmxrVmVyc2lvbls2XSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29weV9pbmZvKCZpbmZvLAorCQkgICAgICAgICAgIlx0RmlybXdhcmUgVmVyc2lvbiAgICAgICAgICAgICAgICAgIDogJWMlYyVjJWMlYyVjJWMlY1xuIiwKKwkJICAgICAgICAgIGhhLT5lbnEtPkNvZGVCbGtWZXJzaW9uWzBdLCBoYS0+ZW5xLT5Db2RlQmxrVmVyc2lvblsxXSwKKwkJICAgICAgICAgIGhhLT5lbnEtPkNvZGVCbGtWZXJzaW9uWzJdLCBoYS0+ZW5xLT5Db2RlQmxrVmVyc2lvblszXSwKKwkJICAgICAgICAgIGhhLT5lbnEtPkNvZGVCbGtWZXJzaW9uWzRdLCBoYS0+ZW5xLT5Db2RlQmxrVmVyc2lvbls1XSwKKwkJICAgICAgICAgIGhhLT5lbnEtPkNvZGVCbGtWZXJzaW9uWzZdLCBoYS0+ZW5xLT5Db2RlQmxrVmVyc2lvbls3XSk7CisgICAgfQorCisgICAgaWYgKGhhLT5lbnEtPkJvb3RCbGtWZXJzaW9uWzddID09IDApIHsKKyAgICAgICAgY29weV9pbmZvKCZpbmZvLAorCQkgICAgICAgICAgIlx0Qm9vdCBCbG9jayBWZXJzaW9uICAgICAgICAgICAgICAgIDogJWMlYyVjJWMlYyVjJWNcbiIsCisJCSAgICAgICAgICBoYS0+ZW5xLT5Cb290QmxrVmVyc2lvblswXSwgaGEtPmVucS0+Qm9vdEJsa1ZlcnNpb25bMV0sCisJCSAgICAgICAgICBoYS0+ZW5xLT5Cb290QmxrVmVyc2lvblsyXSwgaGEtPmVucS0+Qm9vdEJsa1ZlcnNpb25bM10sCisJCSAgICAgICAgICBoYS0+ZW5xLT5Cb290QmxrVmVyc2lvbls0XSwgaGEtPmVucS0+Qm9vdEJsa1ZlcnNpb25bNV0sCisJCSAgICAgICAgICBoYS0+ZW5xLT5Cb290QmxrVmVyc2lvbls2XSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29weV9pbmZvKCZpbmZvLAorCQkgICAgICAgICAgIlx0Qm9vdCBCbG9jayBWZXJzaW9uICAgICAgICAgICAgICAgIDogJWMlYyVjJWMlYyVjJWMlY1xuIiwKKwkJICAgICAgICAgIGhhLT5lbnEtPkJvb3RCbGtWZXJzaW9uWzBdLCBoYS0+ZW5xLT5Cb290QmxrVmVyc2lvblsxXSwKKwkJICAgICAgICAgIGhhLT5lbnEtPkJvb3RCbGtWZXJzaW9uWzJdLCBoYS0+ZW5xLT5Cb290QmxrVmVyc2lvblszXSwKKwkJICAgICAgICAgIGhhLT5lbnEtPkJvb3RCbGtWZXJzaW9uWzRdLCBoYS0+ZW5xLT5Cb290QmxrVmVyc2lvbls1XSwKKwkJICAgICAgICAgIGhhLT5lbnEtPkJvb3RCbGtWZXJzaW9uWzZdLCBoYS0+ZW5xLT5Cb290QmxrVmVyc2lvbls3XSk7CisgICAgfQorCisJY29weV9pbmZvKCZpbmZvLCAiXHREcml2ZXIgVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgOiAlcyVzXG4iLAorCQkgIElQU19WRVJTSU9OX0hJR0gsIElQU19WRVJTSU9OX0xPVyk7CisKKwljb3B5X2luZm8oJmluZm8sICJcdERyaXZlciBCdWlsZCAgICAgICAgICAgICAgICAgICAgICA6ICVkXG4iLAorCQkgIElQU19CVUlMRF9JREVOVCk7CisKKwljb3B5X2luZm8oJmluZm8sICJcdE1heCBQaHlzaWNhbCBEZXZpY2VzICAgICAgICAgICAgICA6ICVkXG4iLAorCQkgIGhhLT5lbnEtPnVjTWF4UGh5c2ljYWxEZXZpY2VzKTsKKwljb3B5X2luZm8oJmluZm8sICJcdE1heCBBY3RpdmUgQ29tbWFuZHMgICAgICAgICAgICAgICA6ICVkXG4iLAorCQkgIGhhLT5tYXhfY21kcyk7CisJY29weV9pbmZvKCZpbmZvLCAiXHRDdXJyZW50IFF1ZXVlZCBDb21tYW5kcyAgICAgICAgICAgOiAlZFxuIiwKKwkJICBoYS0+c2NiX3dhaXRsaXN0LmNvdW50KTsKKwljb3B5X2luZm8oJmluZm8sICJcdEN1cnJlbnQgQWN0aXZlIENvbW1hbmRzICAgICAgICAgICA6ICVkXG4iLAorCQkgIGhhLT5zY2JfYWN0aXZlbGlzdC5jb3VudCAtIGhhLT5udW1faW9jdGwpOworCWNvcHlfaW5mbygmaW5mbywgIlx0Q3VycmVudCBRdWV1ZWQgUFQgQ29tbWFuZHMgICAgICAgIDogJWRcbiIsCisJCSAgaGEtPmNvcHBfd2FpdGxpc3QuY291bnQpOworCWNvcHlfaW5mbygmaW5mbywgIlx0Q3VycmVudCBBY3RpdmUgUFQgQ29tbWFuZHMgICAgICAgIDogJWRcbiIsCisJCSAgaGEtPm51bV9pb2N0bCk7CisKKwljb3B5X2luZm8oJmluZm8sICJcbiIpOworCisJcmV0dXJuIChpbmZvLmxvY2FscG9zKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogY29weV9tZW1faW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBDb3B5IGRhdGEgaW50byBhbiBJUFNfSU5GT1NUUiBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2NvcHlfbWVtX2luZm8oSVBTX0lORk9TVFIgKiBpbmZvLCBjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCU1FVEhPRF9UUkFDRSgiY29weV9tZW1faW5mbyIsIDEpOworCisJaWYgKGluZm8tPnBvcyArIGxlbiA8IGluZm8tPm9mZnNldCkgeworCQlpbmZvLT5wb3MgKz0gbGVuOworCQlyZXR1cm47CisJfQorCisJaWYgKGluZm8tPnBvcyA8IGluZm8tPm9mZnNldCkgeworCQlkYXRhICs9IChpbmZvLT5vZmZzZXQgLSBpbmZvLT5wb3MpOworCQlsZW4gLT0gKGluZm8tPm9mZnNldCAtIGluZm8tPnBvcyk7CisJCWluZm8tPnBvcyArPSAoaW5mby0+b2Zmc2V0IC0gaW5mby0+cG9zKTsKKwl9CisKKwlpZiAoaW5mby0+bG9jYWxwb3MgKyBsZW4gPiBpbmZvLT5sZW5ndGgpCisJCWxlbiA9IGluZm8tPmxlbmd0aCAtIGluZm8tPmxvY2FscG9zOworCisJaWYgKGxlbiA+IDApIHsKKwkJbWVtY3B5KGluZm8tPmJ1ZmZlciArIGluZm8tPmxvY2FscG9zLCBkYXRhLCBsZW4pOworCQlpbmZvLT5wb3MgKz0gbGVuOworCQlpbmZvLT5sb2NhbHBvcyArPSBsZW47CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBjb3B5X2luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHByaW50ZiBzdHlsZSB3cmFwcGVyIGZvciBhbiBpbmZvIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50Citjb3B5X2luZm8oSVBTX0lORk9TVFIgKiBpbmZvLCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY2hhciBidWZbMTI4XTsKKwlpbnQgbGVuOworCisJTUVUSE9EX1RSQUNFKCJjb3B5X2luZm8iLCAxKTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbGVuID0gdnNwcmludGYoYnVmLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCWNvcHlfbWVtX2luZm8oaW5mbywgYnVmLCBsZW4pOworCisJcmV0dXJuIChsZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfaWRlbnRpZnlfY29udHJvbGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIElkZW50aWZ5IHRoaXMgY29udHJvbGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX2lkZW50aWZ5X2NvbnRyb2xsZXIoaXBzX2hhX3QgKiBoYSkKK3sKKwlNRVRIT0RfVFJBQ0UoImlwc19pZGVudGlmeV9jb250cm9sbGVyIiwgMSk7CisKKwlzd2l0Y2ggKGhhLT5kZXZpY2VfaWQpIHsKKwljYXNlIElQU19ERVZJQ0VJRF9DT1BQRVJIRUFEOgorCQlpZiAoaGEtPnJldmlzaW9uX2lkIDw9IElQU19SRVZJRF9TRVJWRVJBSUQpIHsKKwkJCWhhLT5hZF90eXBlID0gSVBTX0FEVFlQRV9TRVJWRVJBSUQ7CisJCX0gZWxzZSBpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9TRVJWRVJBSUQyKSB7CisJCQloYS0+YWRfdHlwZSA9IElQU19BRFRZUEVfU0VSVkVSQUlEMjsKKwkJfSBlbHNlIGlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX05BVkFKTykgeworCQkJaGEtPmFkX3R5cGUgPSBJUFNfQURUWVBFX05BVkFKTzsKKwkJfSBlbHNlIGlmICgoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9TRVJWRVJBSUQyKQorCQkJICAgJiYgKGhhLT5zbG90X251bSA9PSAwKSkgeworCQkJaGEtPmFkX3R5cGUgPSBJUFNfQURUWVBFX0tJT1dBOworCQl9IGVsc2UgaWYgKChoYS0+cmV2aXNpb25faWQgPj0gSVBTX1JFVklEX0NMQVJJTkVUUDEpICYmCisJCQkgICAoaGEtPnJldmlzaW9uX2lkIDw9IElQU19SRVZJRF9DTEFSSU5FVFAzKSkgeworCQkJaWYgKGhhLT5lbnEtPnVjTWF4UGh5c2ljYWxEZXZpY2VzID09IDE1KQorCQkJCWhhLT5hZF90eXBlID0gSVBTX0FEVFlQRV9TRVJWRVJBSUQzTDsKKwkJCWVsc2UKKwkJCQloYS0+YWRfdHlwZSA9IElQU19BRFRZUEVfU0VSVkVSQUlEMzsKKwkJfSBlbHNlIGlmICgoaGEtPnJldmlzaW9uX2lkID49IElQU19SRVZJRF9UUk9NQk9ORTMyKSAmJgorCQkJICAgKGhhLT5yZXZpc2lvbl9pZCA8PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkpIHsKKwkJCWhhLT5hZF90eXBlID0gSVBTX0FEVFlQRV9TRVJWRVJBSUQ0SDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSVBTX0RFVklDRUlEX01PUlBIRVVTOgorCQlzd2l0Y2ggKGhhLT5zdWJkZXZpY2VfaWQpIHsKKwkJY2FzZSBJUFNfU1VCREVWSUNFSURfNEw6CisJCQloYS0+YWRfdHlwZSA9IElQU19BRFRZUEVfU0VSVkVSQUlENEw7CisJCQlicmVhazsKKworCQljYXNlIElQU19TVUJERVZJQ0VJRF80TToKKwkJCWhhLT5hZF90eXBlID0gSVBTX0FEVFlQRV9TRVJWRVJBSUQ0TTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVBTX1NVQkRFVklDRUlEXzRNWDoKKwkJCWhhLT5hZF90eXBlID0gSVBTX0FEVFlQRV9TRVJWRVJBSUQ0TVg7CisJCQlicmVhazsKKworCQljYXNlIElQU19TVUJERVZJQ0VJRF80TFg6CisJCQloYS0+YWRfdHlwZSA9IElQU19BRFRZUEVfU0VSVkVSQUlENExYOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUFNfU1VCREVWSUNFSURfNUkyOgorCQkJaGEtPmFkX3R5cGUgPSBJUFNfQURUWVBFX1NFUlZFUkFJRDVJMjsKKwkJCWJyZWFrOworCisJCWNhc2UgSVBTX1NVQkRFVklDRUlEXzVJMToKKwkJCWhhLT5hZF90eXBlID0gSVBTX0FEVFlQRV9TRVJWRVJBSUQ1STE7CisJCQlicmVhazsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBJUFNfREVWSUNFSURfTUFSQ086CisJCXN3aXRjaCAoaGEtPnN1YmRldmljZV9pZCkgeworCQljYXNlIElQU19TVUJERVZJQ0VJRF82TToKKwkJCWhhLT5hZF90eXBlID0gSVBTX0FEVFlQRV9TRVJWRVJBSUQ2TTsKKwkJCWJyZWFrOworCQljYXNlIElQU19TVUJERVZJQ0VJRF82SToKKwkJCWhhLT5hZF90eXBlID0gSVBTX0FEVFlQRV9TRVJWRVJBSUQ2STsKKwkJCWJyZWFrOworCQljYXNlIElQU19TVUJERVZJQ0VJRF83azoKKwkJCWhhLT5hZF90eXBlID0gSVBTX0FEVFlQRV9TRVJWRVJBSUQ3azsKKwkJCWJyZWFrOworCQljYXNlIElQU19TVUJERVZJQ0VJRF83TToKKwkJCWhhLT5hZF90eXBlID0gSVBTX0FEVFlQRV9TRVJWRVJBSUQ3TTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2dldF9iaW9zX3ZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBHZXQgdGhlIEJJT1MgcmV2aXNpb24gbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19nZXRfYmlvc192ZXJzaW9uKGlwc19oYV90ICogaGEsIGludCBpbnRyKQoreworCWlwc19zY2JfdCAqc2NiOworCWludCByZXQ7CisJdWludDhfdCBtYWpvcjsKKwl1aW50OF90IG1pbm9yOworCXVpbnQ4X3Qgc3VibWlub3I7CisJdWludDhfdCAqYnVmZmVyOworCWNoYXIgaGV4RGlnaXRzW10gPQorCSAgICB7ICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ0EnLCAnQicsICdDJywKKyAgICAgJ0QnLCAnRScsICdGJyB9OworCisJTUVUSE9EX1RSQUNFKCJpcHNfZ2V0X2Jpb3NfdmVyc2lvbiIsIDEpOworCisJbWFqb3IgPSAwOworCW1pbm9yID0gMDsKKworCXN0cm5jcHkoaGEtPmJpb3NfdmVyc2lvbiwgIiAgICAgICA/IiwgOCk7CisKKwlpZiAoaGEtPmRldmljZV9pZCA9PSBJUFNfREVWSUNFSURfQ09QUEVSSEVBRCkgeworCQlpZiAoSVBTX1VTRV9NRU1JTyhoYSkpIHsKKwkJCS8qIE1lbW9yeSBNYXBwZWQgSS9PICovCisKKwkJCS8qIHRlc3QgMXN0IGJ5dGUgKi8KKwkJCXdyaXRlbCgwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxBUCk7CisJCQlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkJCWlmIChyZWFkYihoYS0+bWVtX3B0ciArIElQU19SRUdfRkxEUCkgIT0gMHg1NSkKKwkJCQlyZXR1cm47CisKKwkJCXdyaXRlbCgxLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxBUCk7CisJCQlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkJCWlmIChyZWFkYihoYS0+bWVtX3B0ciArIElQU19SRUdfRkxEUCkgIT0gMHhBQSkKKwkJCQlyZXR1cm47CisKKwkJCS8qIEdldCBNYWpvciB2ZXJzaW9uICovCisJCQl3cml0ZWwoMHgxRkYsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTEFQKTsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQkJbWFqb3IgPSByZWFkYihoYS0+bWVtX3B0ciArIElQU19SRUdfRkxEUCk7CisKKwkJCS8qIEdldCBNaW5vciB2ZXJzaW9uICovCisJCQl3cml0ZWwoMHgxRkUsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTEFQKTsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKwkJCW1pbm9yID0gcmVhZGIoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMRFApOworCisJCQkvKiBHZXQgU3ViTWlub3IgdmVyc2lvbiAqLworCQkJd3JpdGVsKDB4MUZELCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxBUCk7CisJCQlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisJCQlzdWJtaW5vciA9IHJlYWRiKGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTERQKTsKKworCQl9IGVsc2UgeworCQkJLyogUHJvZ3JhbW1lZCBJL08gKi8KKworCQkJLyogdGVzdCAxc3QgYnl0ZSAqLworCQkJb3V0bCgwLCBoYS0+aW9fYWRkciArIElQU19SRUdfRkxBUCk7CisJCQlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkJCWlmIChpbmIoaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApICE9IDB4NTUpCisJCQkJcmV0dXJuOworCisJCQlvdXRsKGNwdV90b19sZTMyKDEpLCBoYS0+aW9fYWRkciArIElQU19SRUdfRkxBUCk7CisJCQlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkJCWlmIChpbmIoaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApICE9IDB4QUEpCisJCQkJcmV0dXJuOworCisJCQkvKiBHZXQgTWFqb3IgdmVyc2lvbiAqLworCQkJb3V0bChjcHVfdG9fbGUzMigweDFGRiksIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTEFQKTsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQkJbWFqb3IgPSBpbmIoaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApOworCisJCQkvKiBHZXQgTWlub3IgdmVyc2lvbiAqLworCQkJb3V0bChjcHVfdG9fbGUzMigweDFGRSksIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTEFQKTsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQkJbWlub3IgPSBpbmIoaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApOworCisJCQkvKiBHZXQgU3ViTWlub3IgdmVyc2lvbiAqLworCQkJb3V0bChjcHVfdG9fbGUzMigweDFGRCksIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTEFQKTsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQkJc3VibWlub3IgPSBpbmIoaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApOworCisJCX0KKwl9IGVsc2UgeworCQkvKiBNb3JwaGV1cyBGYW1pbHkgLSBTZW5kIENvbW1hbmQgdG8gdGhlIGNhcmQgKi8KKworCQlidWZmZXIgPSBoYS0+aW9jdGxfZGF0YTsKKworCQltZW1zZXQoYnVmZmVyLCAwLCAweDEwMDApOworCisJCXNjYiA9ICZoYS0+c2Nic1toYS0+bWF4X2NtZHMgLSAxXTsKKworCQlpcHNfaW5pdF9zY2IoaGEsIHNjYik7CisKKwkJc2NiLT50aW1lb3V0ID0gaXBzX2NtZF90aW1lb3V0OworCQlzY2ItPmNkYlswXSA9IElQU19DTURfUldfQklPU0ZXOworCisJCXNjYi0+Y21kLmZsYXNoZncub3BfY29kZSA9IElQU19DTURfUldfQklPU0ZXOworCQlzY2ItPmNtZC5mbGFzaGZ3LmNvbW1hbmRfaWQgPSBJUFNfQ09NTUFORF9JRChoYSwgc2NiKTsKKwkJc2NiLT5jbWQuZmxhc2hmdy50eXBlID0gMTsKKwkJc2NiLT5jbWQuZmxhc2hmdy5kaXJlY3Rpb24gPSAwOworCQlzY2ItPmNtZC5mbGFzaGZ3LmNvdW50ID0gY3B1X3RvX2xlMzIoMHg4MDApOworCQlzY2ItPmNtZC5mbGFzaGZ3LnRvdGFsX3BhY2tldHMgPSAxOworCQlzY2ItPmNtZC5mbGFzaGZ3LnBhY2tldF9udW0gPSAwOworCQlzY2ItPmRhdGFfbGVuID0gMHgxMDAwOworCQlzY2ItPmNtZC5mbGFzaGZ3LmJ1ZmZlcl9hZGRyID0gaGEtPmlvY3RsX2J1c2FkZHI7CisKKwkJLyogaXNzdWUgdGhlIGNvbW1hbmQgKi8KKwkJaWYgKCgocmV0ID0KKwkJICAgICAgaXBzX3NlbmRfd2FpdChoYSwgc2NiLCBpcHNfY21kX3RpbWVvdXQsCisJCQkJICAgIGludHIpKSA9PSBJUFNfRkFJTFVSRSkKKwkJICAgIHx8IChyZXQgPT0gSVBTX1NVQ0NFU1NfSU1NKQorCQkgICAgfHwgKChzY2ItPmJhc2ljX3N0YXR1cyAmIElQU19HU0NfU1RBVFVTX01BU0spID4gMSkpIHsKKwkJCS8qIEVycm9yIG9jY3VycmVkICovCisKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICgoYnVmZmVyWzB4QzBdID09IDB4NTUpICYmIChidWZmZXJbMHhDMV0gPT0gMHhBQSkpIHsKKwkJCW1ham9yID0gYnVmZmVyWzB4MWZmICsgMHhDMF07CS8qIE9mZnNldCAweDFmZiBhZnRlciB0aGUgaGVhZGVyICgweGMwKSAqLworCQkJbWlub3IgPSBidWZmZXJbMHgxZmUgKyAweEMwXTsJLyogT2Zmc2V0IDB4MWZlIGFmdGVyIHRoZSBoZWFkZXIgKDB4YzApICovCisJCQlzdWJtaW5vciA9IGJ1ZmZlclsweDFmZCArIDB4QzBdOwkvKiBPZmZzZXQgMHgxZmQgYWZ0ZXIgdGhlIGhlYWRlciAoMHhjMCkgKi8KKwkJfSBlbHNlIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWhhLT5iaW9zX3ZlcnNpb25bMF0gPSBoZXhEaWdpdHNbKG1ham9yICYgMHhGMCkgPj4gNF07CisJaGEtPmJpb3NfdmVyc2lvblsxXSA9ICcuJzsKKwloYS0+Ymlvc192ZXJzaW9uWzJdID0gaGV4RGlnaXRzW21ham9yICYgMHgwRl07CisJaGEtPmJpb3NfdmVyc2lvblszXSA9IGhleERpZ2l0c1tzdWJtaW5vcl07CisJaGEtPmJpb3NfdmVyc2lvbls0XSA9ICcuJzsKKwloYS0+Ymlvc192ZXJzaW9uWzVdID0gaGV4RGlnaXRzWyhtaW5vciAmIDB4RjApID4+IDRdOworCWhhLT5iaW9zX3ZlcnNpb25bNl0gPSBoZXhEaWdpdHNbbWlub3IgJiAweDBGXTsKKwloYS0+Ymlvc192ZXJzaW9uWzddID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2hhaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBJbml0aWFsaXplIHRoZSBjb250cm9sbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEU6IEFzc3VtZXMgdG8gYmUgY2FsbGVkIGZyb20gd2l0aCBhIGxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19oYWluaXQoaXBzX2hhX3QgKiBoYSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2hhaW5pdCIsIDEpOworCisJaWYgKCFoYSkKKwkJcmV0dXJuICgwKTsKKworCWlmIChoYS0+ZnVuYy5zdGF0aW5pdCkKKwkJKCpoYS0+ZnVuYy5zdGF0aW5pdCkgKGhhKTsKKworCWlmIChoYS0+ZnVuYy5lbmFibGVpbnQpCisJCSgqaGEtPmZ1bmMuZW5hYmxlaW50KSAoaGEpOworCisJLyogU2VuZCBGRkRDICovCisJaGEtPnJlc2V0X2NvdW50ID0gMTsKKwlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwloYS0+bGFzdF9mZmRjID0gdHYudHZfc2VjOworCWlwc19mZmRjX3Jlc2V0KGhhLCBJUFNfSU5UUl9JT1JMKTsKKworCWlmICghaXBzX3JlYWRfY29uZmlnKGhhLCBJUFNfSU5UUl9JT1JMKSkgeworCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgaGEtPnBjaWRldiwKKwkJCSAgICJ1bmFibGUgdG8gcmVhZCBjb25maWcgZnJvbSBjb250cm9sbGVyLlxuIik7CisKKwkJcmV0dXJuICgwKTsKKwl9CisJLyogZW5kIGlmICovCisJaWYgKCFpcHNfcmVhZF9hZGFwdGVyX3N0YXR1cyhoYSwgSVBTX0lOVFJfSU9STCkpIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkgICAidW5hYmxlIHRvIHJlYWQgY29udHJvbGxlciBzdGF0dXMuXG4iKTsKKworCQlyZXR1cm4gKDApOworCX0KKworCS8qIElkZW50aWZ5IHRoaXMgY29udHJvbGxlciAqLworCWlwc19pZGVudGlmeV9jb250cm9sbGVyKGhhKTsKKworCWlmICghaXBzX3JlYWRfc3Vic3lzdGVtX3BhcmFtZXRlcnMoaGEsIElQU19JTlRSX0lPUkwpKSB7CisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJICAgInVuYWJsZSB0byByZWFkIHN1YnN5c3RlbSBwYXJhbWV0ZXJzLlxuIik7CisKKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKiB3cml0ZSBudnJhbSB1c2VyIHBhZ2UgNSAqLworCWlmICghaXBzX3dyaXRlX2RyaXZlcl9zdGF0dXMoaGEsIElQU19JTlRSX0lPUkwpKSB7CisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJICAgInVuYWJsZSB0byB3cml0ZSBkcml2ZXIgaW5mbyB0byBjb250cm9sbGVyLlxuIik7CisKKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKiBJZiB0aGVyZSBhcmUgTG9naWNhbCBEcml2ZXMgYW5kIGEgUmVzZXQgT2NjdXJyZWQsIHRoZW4gYW4gRXJhc2VTdHJpcGVMb2NrIGlzIE5lZWRlZCAqLworCWlmICgoaGEtPmNvbmYtPnVjTG9nRHJpdmVDb3VudCA+IDApICYmIChoYS0+cmVxdWlyZXNfZXNsID09IDEpKQorCQlpcHNfY2xlYXJfYWRhcHRlcihoYSwgSVBTX0lOVFJfSU9STCk7CisKKwkvKiBzZXQgbGltaXRzIG9uIFNJRCwgTFVOLCBCVVMgKi8KKwloYS0+bnRhcmdldHMgPSBJUFNfTUFYX1RBUkdFVFMgKyAxOworCWhhLT5ubHVuID0gMTsKKwloYS0+bmJ1cyA9IChoYS0+ZW5xLT51Y01heFBoeXNpY2FsRGV2aWNlcyAvIElQU19NQVhfVEFSR0VUUykgKyAxOworCisJc3dpdGNoIChoYS0+Y29uZi0+bG9naWNhbF9kcml2ZVswXS51Y1N0cmlwZVNpemUpIHsKKwljYXNlIDQ6CisJCWhhLT5tYXhfeGZlciA9IDB4MTAwMDA7CisJCWJyZWFrOworCisJY2FzZSA1OgorCQloYS0+bWF4X3hmZXIgPSAweDIwMDAwOworCQlicmVhazsKKworCWNhc2UgNjoKKwkJaGEtPm1heF94ZmVyID0gMHg0MDAwMDsKKwkJYnJlYWs7CisKKwljYXNlIDc6CisJZGVmYXVsdDoKKwkJaGEtPm1heF94ZmVyID0gMHg4MDAwMDsKKwkJYnJlYWs7CisJfQorCisJLyogc2V0dXAgbWF4IGNvbmN1cnJlbnQgY29tbWFuZHMgKi8KKwlpZiAobGUzMl90b19jcHUoaGEtPnN1YnN5cy0+cGFyYW1bNF0pICYgMHgxKSB7CisJCS8qIFVzZSB0aGUgbmV3IG1ldGhvZCAqLworCQloYS0+bWF4X2NtZHMgPSBoYS0+ZW5xLT51Y0NvbmN1cnJlbnRDbWRDb3VudDsKKwl9IGVsc2UgeworCQkvKiB1c2UgdGhlIG9sZCBtZXRob2QgKi8KKwkJc3dpdGNoIChoYS0+Y29uZi0+bG9naWNhbF9kcml2ZVswXS51Y1N0cmlwZVNpemUpIHsKKwkJY2FzZSA0OgorCQkJaGEtPm1heF9jbWRzID0gMzI7CisJCQlicmVhazsKKworCQljYXNlIDU6CisJCQloYS0+bWF4X2NtZHMgPSAxNjsKKwkJCWJyZWFrOworCisJCWNhc2UgNjoKKwkJCWhhLT5tYXhfY21kcyA9IDg7CisJCQlicmVhazsKKworCQljYXNlIDc6CisJCWRlZmF1bHQ6CisJCQloYS0+bWF4X2NtZHMgPSA0OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBMaW1pdCB0aGUgQWN0aXZlIENvbW1hbmRzIG9uIGEgTGl0ZSBBZGFwdGVyICovCisJaWYgKChoYS0+YWRfdHlwZSA9PSBJUFNfQURUWVBFX1NFUlZFUkFJRDNMKSB8fAorCSAgICAoaGEtPmFkX3R5cGUgPT0gSVBTX0FEVFlQRV9TRVJWRVJBSUQ0TCkgfHwKKwkgICAgKGhhLT5hZF90eXBlID09IElQU19BRFRZUEVfU0VSVkVSQUlENExYKSkgeworCQlpZiAoKGhhLT5tYXhfY21kcyA+IE1heExpdGVDbWRzKSAmJiAoTWF4TGl0ZUNtZHMpKQorCQkJaGEtPm1heF9jbWRzID0gTWF4TGl0ZUNtZHM7CisJfQorCisJLyogc2V0IGNvbnRyb2xsZXIgSURzICovCisJaGEtPmhhX2lkWzBdID0gSVBTX0FEQVBURVJfSUQ7CisJZm9yIChpID0gMTsgaSA8IGhhLT5uYnVzOyBpKyspIHsKKwkJaGEtPmhhX2lkW2ldID0gaGEtPmNvbmYtPmluaXRfaWRbaSAtIDFdICYgMHgxZjsKKwkJaGEtPmRjZGJfYWN0aXZlW2kgLSAxXSA9IDA7CisJfQorCisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX25leHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUYWtlIHRoZSBuZXh0IGNvbW1hbmQgb2ZmIHRoZSBxdWV1ZSBhbmQgc2VuZCBpdCB0byB0aGUgY29udHJvbGxlciAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19uZXh0KGlwc19oYV90ICogaGEsIGludCBpbnRyKQoreworCWlwc19zY2JfdCAqc2NiOworCVNjc2lfQ21uZCAqU0M7CisJU2NzaV9DbW5kICpwOworCVNjc2lfQ21uZCAqcTsKKwlpcHNfY29wcF93YWl0X2l0ZW1fdCAqaXRlbTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzID0gMDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCU1FVEhPRF9UUkFDRSgiaXBzX25leHQiLCAxKTsKKworCWlmICghaGEpCisJCXJldHVybjsKKwlob3N0ID0gaXBzX3NoW2hhLT5ob3N0X251bV07CisJLyoKKwkgKiBCbG9jayBhY2Nlc3MgdG8gdGhlIHF1ZXVlIGZ1bmN0aW9uIHNvCisJICogdGhpcyBjb21tYW5kIHdvbid0IHRpbWUgb3V0CisJICovCisJaWYgKGludHIgPT0gSVBTX0lOVFJfT04pCisJCUlQU19MT0NLX1NBVkUoaG9zdC0+aG9zdF9sb2NrLCBjcHVfZmxhZ3MpOworCisJaWYgKChoYS0+c3Vic3lzLT5wYXJhbVszXSAmIDB4MzAwMDAwKQorCSAgICAmJiAoaGEtPnNjYl9hY3RpdmVsaXN0LmNvdW50ID09IDApKSB7CisJCXN0cnVjdCB0aW1ldmFsIHR2OworCisJCWRvX2dldHRpbWVvZmRheSgmdHYpOworCisJCWlmICh0di50dl9zZWMgLSBoYS0+bGFzdF9mZmRjID4gSVBTX1NFQ1NfOEhPVVJTKSB7CisJCQloYS0+bGFzdF9mZmRjID0gdHYudHZfc2VjOworCQkJaXBzX2ZmZGNfdGltZShoYSk7CisJCX0KKwl9CisKKwkvKgorCSAqIFNlbmQgcGFzc3RocnUgY29tbWFuZHMKKwkgKiBUaGVzZSBoYXZlIHByaW9yaXR5IG92ZXIgbm9ybWFsIEkvTworCSAqIGJ1dCBzaG91bGRuJ3QgYWZmZWN0IHBlcmZvcm1hbmNlIHRvbyBtdWNoCisJICogc2luY2Ugd2UgbGltaXQgdGhlIG51bWJlciB0aGF0IGNhbiBiZSBhY3RpdmUKKwkgKiBvbiB0aGUgY2FyZCBhdCBhbnkgb25lIHRpbWUKKwkgKi8KKwl3aGlsZSAoKGhhLT5udW1faW9jdGwgPCBJUFNfTUFYX0lPQ1RMKSAmJgorCSAgICAgICAoaGEtPmNvcHBfd2FpdGxpc3QuaGVhZCkgJiYgKHNjYiA9IGlwc19nZXRzY2IoaGEpKSkgeworCisJCWl0ZW0gPSBpcHNfcmVtb3ZlcV9jb3BwX2hlYWQoJmhhLT5jb3BwX3dhaXRsaXN0KTsKKwkJaGEtPm51bV9pb2N0bCsrOworCQlpZiAoaW50ciA9PSBJUFNfSU5UUl9PTikKKwkJCUlQU19VTkxPQ0tfUkVTVE9SRShob3N0LT5ob3N0X2xvY2ssIGNwdV9mbGFncyk7CisJCXNjYi0+c2NzaV9jbWQgPSBpdGVtLT5zY3NpX2NtZDsKKwkJa2ZyZWUoaXRlbSk7CisKKwkJcmV0ID0gaXBzX21ha2VfcGFzc3RocnUoaGEsIHNjYi0+c2NzaV9jbWQsIHNjYiwgaW50cik7CisKKwkJaWYgKGludHIgPT0gSVBTX0lOVFJfT04pCisJCQlJUFNfTE9DS19TQVZFKGhvc3QtPmhvc3RfbG9jaywgY3B1X2ZsYWdzKTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSBJUFNfRkFJTFVSRToKKwkJCWlmIChzY2ItPnNjc2lfY21kKSB7CisJCQkJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQkJCXNjYi0+c2NzaV9jbWQtPnNjc2lfZG9uZShzY2ItPnNjc2lfY21kKTsKKwkJCX0KKworCQkJaXBzX2ZyZWVzY2IoaGEsIHNjYik7CisJCQlicmVhazsKKwkJY2FzZSBJUFNfU1VDQ0VTU19JTU06CisJCQlpZiAoc2NiLT5zY3NpX2NtZCkgeworCQkJCXNjYi0+c2NzaV9jbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkJCQlzY2ItPnNjc2lfY21kLT5zY3NpX2RvbmUoc2NiLT5zY3NpX2NtZCk7CisJCQl9CisKKwkJCWlwc19mcmVlc2NiKGhhLCBzY2IpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQkJLyogZW5kIGNhc2UgKi8KKworCQlpZiAocmV0ICE9IElQU19TVUNDRVNTKSB7CisJCQloYS0+bnVtX2lvY3RsLS07CisJCQljb250aW51ZTsKKwkJfQorCisJCXJldCA9IGlwc19zZW5kX2NtZChoYSwgc2NiKTsKKworCQlpZiAocmV0ID09IElQU19TVUNDRVNTKQorCQkJaXBzX3B1dHFfc2NiX2hlYWQoJmhhLT5zY2JfYWN0aXZlbGlzdCwgc2NiKTsKKwkJZWxzZQorCQkJaGEtPm51bV9pb2N0bC0tOworCisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgSVBTX0ZBSUxVUkU6CisJCQlpZiAoc2NiLT5zY3NpX2NtZCkgeworCQkJCXNjYi0+c2NzaV9jbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJCX0KKworCQkJaXBzX2ZyZWVzY2IoaGEsIHNjYik7CisJCQlicmVhazsKKwkJY2FzZSBJUFNfU1VDQ0VTU19JTU06CisJCQlpcHNfZnJlZXNjYihoYSwgc2NiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0JCS8qIGVuZCBjYXNlICovCisKKwl9CisKKwkvKgorCSAqIFNlbmQgIk5vcm1hbCIgSS9PIGNvbW1hbmRzCisJICovCisKKwlwID0gaGEtPnNjYl93YWl0bGlzdC5oZWFkOworCXdoaWxlICgocCkgJiYgKHNjYiA9IGlwc19nZXRzY2IoaGEpKSkgeworCQlpZiAoKHAtPmRldmljZS0+Y2hhbm5lbCA+IDApCisJCSAgICAmJiAoaGEtPgorCQkJZGNkYl9hY3RpdmVbcC0+ZGV2aWNlLT5jaGFubmVsIC0KKwkJCQkgICAgMV0gJiAoMSA8PCBwLT5kZXZpY2UtPmlkKSkpIHsKKwkJCWlwc19mcmVlc2NiKGhhLCBzY2IpOworCQkJcCA9IChTY3NpX0NtbmQgKikgcC0+aG9zdF9zY3JpYmJsZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcSA9IHA7CisJCVNDID0gaXBzX3JlbW92ZXFfd2FpdCgmaGEtPnNjYl93YWl0bGlzdCwgcSk7CisKKwkJaWYgKGludHIgPT0gSVBTX0lOVFJfT04pCisJCQlJUFNfVU5MT0NLX1JFU1RPUkUoaG9zdC0+aG9zdF9sb2NrLCBjcHVfZmxhZ3MpOwkvKiBVbmxvY2sgSEEgYWZ0ZXIgY29tbWFuZCBpcyB0YWtlbiBvZmYgcXVldWUgKi8KKworCQlTQy0+cmVzdWx0ID0gRElEX09LOworCQlTQy0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisKKwkJbWVtc2V0KFNDLT5zZW5zZV9idWZmZXIsIDAsIHNpemVvZiAoU0MtPnNlbnNlX2J1ZmZlcikpOworCisJCXNjYi0+dGFyZ2V0X2lkID0gU0MtPmRldmljZS0+aWQ7CisJCXNjYi0+bHVuID0gU0MtPmRldmljZS0+bHVuOworCQlzY2ItPmJ1cyA9IFNDLT5kZXZpY2UtPmNoYW5uZWw7CisJCXNjYi0+c2NzaV9jbWQgPSBTQzsKKwkJc2NiLT5icmVha3VwID0gMDsKKwkJc2NiLT5kYXRhX2xlbiA9IDA7CisJCXNjYi0+Y2FsbGJhY2sgPSBpcHNpbnRyX2RvbmU7CisJCXNjYi0+dGltZW91dCA9IGlwc19jbWRfdGltZW91dDsKKwkJbWVtc2V0KCZzY2ItPmNtZCwgMCwgMTYpOworCisJCS8qIGNvcHkgaW4gdGhlIENEQiAqLworCQltZW1jcHkoc2NiLT5jZGIsIFNDLT5jbW5kLCBTQy0+Y21kX2xlbik7CisKKwkJLyogTm93IGhhbmRsZSB0aGUgZGF0YSBidWZmZXIgKi8KKwkJaWYgKFNDLT51c2Vfc2cpIHsKKwkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJCQlpbnQgaTsKKworCQkJc2cgPSBTQy0+cmVxdWVzdF9idWZmZXI7CisJCQlzY2ItPnNnX2NvdW50ID0gcGNpX21hcF9zZyhoYS0+cGNpZGV2LCBzZywgU0MtPnVzZV9zZywKKwkJCQkJCSAgIHNjc2lfdG9fcGNpX2RtYV9kaXIoU0MtPgorCQkJCQkJCQkgICAgICAgc2NfZGF0YV9kaXJlY3Rpb24pKTsKKwkJCXNjYi0+ZmxhZ3MgfD0gSVBTX1NDQl9NQVBfU0c7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2NiLT5zZ19jb3VudDsgaSsrKSB7CisJCQkJaWYgKGlwc19maWxsX3NjYl9zZ19zaW5nbGUKKwkJCQkgICAgKGhhLCBzZ19kbWFfYWRkcmVzcygmc2dbaV0pLCBzY2IsIGksCisJCQkJICAgICBzZ19kbWFfbGVuKCZzZ1tpXSkpIDwgMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlzY2ItPmRjZGIudHJhbnNmZXJfbGVuZ3RoID0gc2NiLT5kYXRhX2xlbjsKKwkJfSBlbHNlIHsKKwkJCWlmIChTQy0+cmVxdWVzdF9idWZmbGVuKSB7CisJCQkJc2NiLT5kYXRhX2J1c2FkZHIgPQorCQkJCSAgICBwY2lfbWFwX3NpbmdsZShoYS0+cGNpZGV2LAorCQkJCQkJICAgU0MtPnJlcXVlc3RfYnVmZmVyLAorCQkJCQkJICAgU0MtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkJCSAgIHNjc2lfdG9fcGNpX2RtYV9kaXIoU0MtPgorCQkJCQkJCQkgICAgICAgc2NfZGF0YV9kaXJlY3Rpb24pKTsKKwkJCQlzY2ItPmZsYWdzIHw9IElQU19TQ0JfTUFQX1NJTkdMRTsKKwkJCQlpcHNfZmlsbF9zY2Jfc2dfc2luZ2xlKGhhLCBzY2ItPmRhdGFfYnVzYWRkciwKKwkJCQkJCSAgICAgICBzY2IsIDAsCisJCQkJCQkgICAgICAgU0MtPnJlcXVlc3RfYnVmZmxlbik7CisJCQkJc2NiLT5kY2RiLnRyYW5zZmVyX2xlbmd0aCA9IHNjYi0+ZGF0YV9sZW47CisJCQl9IGVsc2UgeworCQkJCXNjYi0+ZGF0YV9idXNhZGRyID0gMEw7CisJCQkJc2NiLT5zZ19sZW4gPSAwOworCQkJCXNjYi0+ZGF0YV9sZW4gPSAwOworCQkJCXNjYi0+ZGNkYi50cmFuc2Zlcl9sZW5ndGggPSAwOworCQkJfQorCisJCX0KKworCQlzY2ItPmRjZGIuY21kX2F0dHJpYnV0ZSA9CisJCSAgICBpcHNfY29tbWFuZF9kaXJlY3Rpb25bc2NiLT5zY3NpX2NtZC0+Y21uZFswXV07CisKKyAgICAgICAgLyogQWxsb3cgYSBXUklURSBCVUZGRVIgQ29tbWFuZCB0byBIYXZlIG5vIERhdGEgKi8KKyAgICAgICAgLyogVGhpcyBpcyBVc2VkIGJ5IFRhcGUgRmxhc2ggVXRpbGl0ZXMgICAgICAgICAgKi8KKyAgICAgICAgaWYgKChzY2ItPnNjc2lfY21kLT5jbW5kWzBdID09IFdSSVRFX0JVRkZFUikgJiYgKHNjYi0+ZGF0YV9sZW4gPT0gMCkpIAorICAgICAgICAgICAgc2NiLT5kY2RiLmNtZF9hdHRyaWJ1dGUgPSAwOyAgICAgICAgICAgICAgICAgIAorCisJCWlmICghKHNjYi0+ZGNkYi5jbWRfYXR0cmlidXRlICYgMHgzKSkKKwkJCXNjYi0+ZGNkYi50cmFuc2Zlcl9sZW5ndGggPSAwOworCisJCWlmIChzY2ItPmRhdGFfbGVuID49IElQU19NQVhfWEZFUikgeworCQkJc2NiLT5kY2RiLmNtZF9hdHRyaWJ1dGUgfD0gSVBTX1RSQU5TRkVSNjRLOworCQkJc2NiLT5kY2RiLnRyYW5zZmVyX2xlbmd0aCA9IDA7CisJCX0KKwkJaWYgKGludHIgPT0gSVBTX0lOVFJfT04pCisJCQlJUFNfTE9DS19TQVZFKGhvc3QtPmhvc3RfbG9jaywgY3B1X2ZsYWdzKTsKKworCQlyZXQgPSBpcHNfc2VuZF9jbWQoaGEsIHNjYik7CisKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSBJUFNfU1VDQ0VTUzoKKwkJCWlwc19wdXRxX3NjYl9oZWFkKCZoYS0+c2NiX2FjdGl2ZWxpc3QsIHNjYik7CisJCQlicmVhazsKKwkJY2FzZSBJUFNfRkFJTFVSRToKKwkJCWlmIChzY2ItPnNjc2lfY21kKSB7CisJCQkJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQkJCXNjYi0+c2NzaV9jbWQtPnNjc2lfZG9uZShzY2ItPnNjc2lfY21kKTsKKwkJCX0KKworCQkJaWYgKHNjYi0+YnVzKQorCQkJCWhhLT5kY2RiX2FjdGl2ZVtzY2ItPmJ1cyAtIDFdICY9CisJCQkJICAgIH4oMSA8PCBzY2ItPnRhcmdldF9pZCk7CisKKwkJCWlwc19mcmVlc2NiKGhhLCBzY2IpOworCQkJYnJlYWs7CisJCWNhc2UgSVBTX1NVQ0NFU1NfSU1NOgorCQkJaWYgKHNjYi0+c2NzaV9jbWQpCisJCQkJc2NiLT5zY3NpX2NtZC0+c2NzaV9kb25lKHNjYi0+c2NzaV9jbWQpOworCisJCQlpZiAoc2NiLT5idXMpCisJCQkJaGEtPmRjZGJfYWN0aXZlW3NjYi0+YnVzIC0gMV0gJj0KKwkJCQkgICAgfigxIDw8IHNjYi0+dGFyZ2V0X2lkKTsKKworCQkJaXBzX2ZyZWVzY2IoaGEsIHNjYik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CQkvKiBlbmQgY2FzZSAqLworCisJCXAgPSAoU2NzaV9DbW5kICopIHAtPmhvc3Rfc2NyaWJibGU7CisKKwl9CQkJLyogZW5kIHdoaWxlICovCisKKwlpZiAoaW50ciA9PSBJUFNfSU5UUl9PTikKKwkJSVBTX1VOTE9DS19SRVNUT1JFKGhvc3QtPmhvc3RfbG9jaywgY3B1X2ZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3B1dHFfc2NiX2hlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBZGQgYW4gaXRlbSB0byB0aGUgaGVhZCBvZiB0aGUgcXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFTU1VNRUQgdG8gYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBIQSBsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcHNfcHV0cV9zY2JfaGVhZChpcHNfc2NiX3F1ZXVlX3QgKiBxdWV1ZSwgaXBzX3NjYl90ICogaXRlbSkKK3sKKwlNRVRIT0RfVFJBQ0UoImlwc19wdXRxX3NjYl9oZWFkIiwgMSk7CisKKwlpZiAoIWl0ZW0pCisJCXJldHVybjsKKworCWl0ZW0tPnFfbmV4dCA9IHF1ZXVlLT5oZWFkOworCXF1ZXVlLT5oZWFkID0gaXRlbTsKKworCWlmICghcXVldWUtPnRhaWwpCisJCXF1ZXVlLT50YWlsID0gaXRlbTsKKworCXF1ZXVlLT5jb3VudCsrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcmVtb3ZlcV9zY2JfaGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJlbW92ZSB0aGUgaGVhZCBvZiB0aGUgcXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQVNTVU1FRCB0byBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIEhBIGxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlwc19zY2JfdCAqCitpcHNfcmVtb3ZlcV9zY2JfaGVhZChpcHNfc2NiX3F1ZXVlX3QgKiBxdWV1ZSkKK3sKKwlpcHNfc2NiX3QgKml0ZW07CisKKwlNRVRIT0RfVFJBQ0UoImlwc19yZW1vdmVxX3NjYl9oZWFkIiwgMSk7CisKKwlpdGVtID0gcXVldWUtPmhlYWQ7CisKKwlpZiAoIWl0ZW0pIHsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwlxdWV1ZS0+aGVhZCA9IGl0ZW0tPnFfbmV4dDsKKwlpdGVtLT5xX25leHQgPSBOVUxMOworCisJaWYgKHF1ZXVlLT50YWlsID09IGl0ZW0pCisJCXF1ZXVlLT50YWlsID0gTlVMTDsKKworCXF1ZXVlLT5jb3VudC0tOworCisJcmV0dXJuIChpdGVtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3JlbW92ZXFfc2NiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBSZW1vdmUgYW4gaXRlbSBmcm9tIGEgcXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFTU1VNRUQgdG8gYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBIQSBsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpcHNfc2NiX3QgKgoraXBzX3JlbW92ZXFfc2NiKGlwc19zY2JfcXVldWVfdCAqIHF1ZXVlLCBpcHNfc2NiX3QgKiBpdGVtKQoreworCWlwc19zY2JfdCAqcDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3JlbW92ZXFfc2NiIiwgMSk7CisKKwlpZiAoIWl0ZW0pCisJCXJldHVybiAoTlVMTCk7CisKKwlpZiAoaXRlbSA9PSBxdWV1ZS0+aGVhZCkgeworCQlyZXR1cm4gKGlwc19yZW1vdmVxX3NjYl9oZWFkKHF1ZXVlKSk7CisJfQorCisJcCA9IHF1ZXVlLT5oZWFkOworCisJd2hpbGUgKChwKSAmJiAoaXRlbSAhPSBwLT5xX25leHQpKQorCQlwID0gcC0+cV9uZXh0OworCisJaWYgKHApIHsKKwkJLyogZm91bmQgYSBtYXRjaCAqLworCQlwLT5xX25leHQgPSBpdGVtLT5xX25leHQ7CisKKwkJaWYgKCFpdGVtLT5xX25leHQpCisJCQlxdWV1ZS0+dGFpbCA9IHA7CisKKwkJaXRlbS0+cV9uZXh0ID0gTlVMTDsKKwkJcXVldWUtPmNvdW50LS07CisKKwkJcmV0dXJuIChpdGVtKTsKKwl9CisKKwlyZXR1cm4gKE5VTEwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcHV0cV93YWl0X3RhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEFkZCBhbiBpdGVtIHRvIHRoZSB0YWlsIG9mIHRoZSBxdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQVNTVU1FRCB0byBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIEhBIGxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19wdXRxX3dhaXRfdGFpbChpcHNfd2FpdF9xdWV1ZV90ICogcXVldWUsIFNjc2lfQ21uZCAqIGl0ZW0pCit7CisJTUVUSE9EX1RSQUNFKCJpcHNfcHV0cV93YWl0X3RhaWwiLCAxKTsKKworCWlmICghaXRlbSkKKwkJcmV0dXJuOworCisJaXRlbS0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisKKwlpZiAocXVldWUtPnRhaWwpCisJCXF1ZXVlLT50YWlsLT5ob3N0X3NjcmliYmxlID0gKGNoYXIgKikgaXRlbTsKKworCXF1ZXVlLT50YWlsID0gaXRlbTsKKworCWlmICghcXVldWUtPmhlYWQpCisJCXF1ZXVlLT5oZWFkID0gaXRlbTsKKworCXF1ZXVlLT5jb3VudCsrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcmVtb3ZlcV93YWl0X2hlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJlbW92ZSB0aGUgaGVhZCBvZiB0aGUgcXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQVNTVU1FRCB0byBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIEhBIGxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFNjc2lfQ21uZCAqCitpcHNfcmVtb3ZlcV93YWl0X2hlYWQoaXBzX3dhaXRfcXVldWVfdCAqIHF1ZXVlKQoreworCVNjc2lfQ21uZCAqaXRlbTsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3JlbW92ZXFfd2FpdF9oZWFkIiwgMSk7CisKKwlpdGVtID0gcXVldWUtPmhlYWQ7CisKKwlpZiAoIWl0ZW0pIHsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwlxdWV1ZS0+aGVhZCA9IChTY3NpX0NtbmQgKikgaXRlbS0+aG9zdF9zY3JpYmJsZTsKKwlpdGVtLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworCWlmIChxdWV1ZS0+dGFpbCA9PSBpdGVtKQorCQlxdWV1ZS0+dGFpbCA9IE5VTEw7CisKKwlxdWV1ZS0+Y291bnQtLTsKKworCXJldHVybiAoaXRlbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19yZW1vdmVxX3dhaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUmVtb3ZlIGFuIGl0ZW0gZnJvbSBhIHF1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBU1NVTUVEIHRvIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgSEEgbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgU2NzaV9DbW5kICoKK2lwc19yZW1vdmVxX3dhaXQoaXBzX3dhaXRfcXVldWVfdCAqIHF1ZXVlLCBTY3NpX0NtbmQgKiBpdGVtKQoreworCVNjc2lfQ21uZCAqcDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3JlbW92ZXFfd2FpdCIsIDEpOworCisJaWYgKCFpdGVtKQorCQlyZXR1cm4gKE5VTEwpOworCisJaWYgKGl0ZW0gPT0gcXVldWUtPmhlYWQpIHsKKwkJcmV0dXJuIChpcHNfcmVtb3ZlcV93YWl0X2hlYWQocXVldWUpKTsKKwl9CisKKwlwID0gcXVldWUtPmhlYWQ7CisKKwl3aGlsZSAoKHApICYmIChpdGVtICE9IChTY3NpX0NtbmQgKikgcC0+aG9zdF9zY3JpYmJsZSkpCisJCXAgPSAoU2NzaV9DbW5kICopIHAtPmhvc3Rfc2NyaWJibGU7CisKKwlpZiAocCkgeworCQkvKiBmb3VuZCBhIG1hdGNoICovCisJCXAtPmhvc3Rfc2NyaWJibGUgPSBpdGVtLT5ob3N0X3NjcmliYmxlOworCisJCWlmICghaXRlbS0+aG9zdF9zY3JpYmJsZSkKKwkJCXF1ZXVlLT50YWlsID0gcDsKKworCQlpdGVtLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwkJcXVldWUtPmNvdW50LS07CisKKwkJcmV0dXJuIChpdGVtKTsKKwl9CisKKwlyZXR1cm4gKE5VTEwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcHV0cV9jb3BwX3RhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEFkZCBhbiBpdGVtIHRvIHRoZSB0YWlsIG9mIHRoZSBxdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQVNTVU1FRCB0byBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIEhBIGxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19wdXRxX2NvcHBfdGFpbChpcHNfY29wcF9xdWV1ZV90ICogcXVldWUsIGlwc19jb3BwX3dhaXRfaXRlbV90ICogaXRlbSkKK3sKKwlNRVRIT0RfVFJBQ0UoImlwc19wdXRxX2NvcHBfdGFpbCIsIDEpOworCisJaWYgKCFpdGVtKQorCQlyZXR1cm47CisKKwlpdGVtLT5uZXh0ID0gTlVMTDsKKworCWlmIChxdWV1ZS0+dGFpbCkKKwkJcXVldWUtPnRhaWwtPm5leHQgPSBpdGVtOworCisJcXVldWUtPnRhaWwgPSBpdGVtOworCisJaWYgKCFxdWV1ZS0+aGVhZCkKKwkJcXVldWUtPmhlYWQgPSBpdGVtOworCisJcXVldWUtPmNvdW50Kys7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19yZW1vdmVxX2NvcHBfaGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUmVtb3ZlIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBU1NVTUVEIHRvIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgSEEgbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaXBzX2NvcHBfd2FpdF9pdGVtX3QgKgoraXBzX3JlbW92ZXFfY29wcF9oZWFkKGlwc19jb3BwX3F1ZXVlX3QgKiBxdWV1ZSkKK3sKKwlpcHNfY29wcF93YWl0X2l0ZW1fdCAqaXRlbTsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3JlbW92ZXFfY29wcF9oZWFkIiwgMSk7CisKKwlpdGVtID0gcXVldWUtPmhlYWQ7CisKKwlpZiAoIWl0ZW0pIHsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwlxdWV1ZS0+aGVhZCA9IGl0ZW0tPm5leHQ7CisJaXRlbS0+bmV4dCA9IE5VTEw7CisKKwlpZiAocXVldWUtPnRhaWwgPT0gaXRlbSkKKwkJcXVldWUtPnRhaWwgPSBOVUxMOworCisJcXVldWUtPmNvdW50LS07CisKKwlyZXR1cm4gKGl0ZW0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcmVtb3ZlcV9jb3BwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJlbW92ZSBhbiBpdGVtIGZyb20gYSBxdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQVNTVU1FRCB0byBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIEhBIGxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlwc19jb3BwX3dhaXRfaXRlbV90ICoKK2lwc19yZW1vdmVxX2NvcHAoaXBzX2NvcHBfcXVldWVfdCAqIHF1ZXVlLCBpcHNfY29wcF93YWl0X2l0ZW1fdCAqIGl0ZW0pCit7CisJaXBzX2NvcHBfd2FpdF9pdGVtX3QgKnA7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19yZW1vdmVxX2NvcHAiLCAxKTsKKworCWlmICghaXRlbSkKKwkJcmV0dXJuIChOVUxMKTsKKworCWlmIChpdGVtID09IHF1ZXVlLT5oZWFkKSB7CisJCXJldHVybiAoaXBzX3JlbW92ZXFfY29wcF9oZWFkKHF1ZXVlKSk7CisJfQorCisJcCA9IHF1ZXVlLT5oZWFkOworCisJd2hpbGUgKChwKSAmJiAoaXRlbSAhPSBwLT5uZXh0KSkKKwkJcCA9IHAtPm5leHQ7CisKKwlpZiAocCkgeworCQkvKiBmb3VuZCBhIG1hdGNoICovCisJCXAtPm5leHQgPSBpdGVtLT5uZXh0OworCisJCWlmICghaXRlbS0+bmV4dCkKKwkJCXF1ZXVlLT50YWlsID0gcDsKKworCQlpdGVtLT5uZXh0ID0gTlVMTDsKKwkJcXVldWUtPmNvdW50LS07CisKKwkJcmV0dXJuIChpdGVtKTsKKwl9CisKKwlyZXR1cm4gKE5VTEwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNpbnRyX2Jsb2NraW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEZpbmFsaXplIGFuIGludGVycnVwdCBmb3IgaW50ZXJuYWwgY29tbWFuZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzaW50cl9ibG9ja2luZyhpcHNfaGFfdCAqIGhhLCBpcHNfc2NiX3QgKiBzY2IpCit7CisJTUVUSE9EX1RSQUNFKCJpcHNpbnRyX2Jsb2NraW5nIiwgMik7CisKKwlpcHNfZnJlZXNjYihoYSwgc2NiKTsKKwlpZiAoKGhhLT53YWl0ZmxhZyA9PSBUUlVFKSAmJiAoaGEtPmNtZF9pbl9wcm9ncmVzcyA9PSBzY2ItPmNkYlswXSkpIHsKKwkJaGEtPndhaXRmbGFnID0gRkFMU0U7CisKKwkJcmV0dXJuOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzaW50cl9kb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBGaW5hbGl6ZSBhbiBpbnRlcnJ1cHQgZm9yIG5vbi1pbnRlcm5hbCBjb21tYW5kcyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc2ludHJfZG9uZShpcHNfaGFfdCAqIGhhLCBpcHNfc2NiX3QgKiBzY2IpCit7CisJTUVUSE9EX1RSQUNFKCJpcHNpbnRyX2RvbmUiLCAyKTsKKworCWlmICghc2NiKSB7CisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJICAgIlNwdXJpb3VzIGludGVycnVwdDsgc2NiIE5VTEwuXG4iKTsKKworCQlyZXR1cm47CisJfQorCisJaWYgKHNjYi0+c2NzaV9jbWQgPT0gTlVMTCkgeworCQkvKiB1bmV4cGVjdGVkIGludGVycnVwdCAqLworCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgaGEtPnBjaWRldiwKKwkJCSAgICJTcHVyaW91cyBpbnRlcnJ1cHQ7IHNjc2lfY21kIG5vdCBzZXQuXG4iKTsKKworCQlyZXR1cm47CisJfQorCisJaXBzX2RvbmUoaGEsIHNjYik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19kb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgRG8gaG91c2VrZWVwaW5nIG9uIGNvbXBsZXRlZCBjb21tYW5kcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFTU1VNRUQgdG8gYmUgY2FsbGVkIGZvcm0gd2l0aGluIHRoZSByZXF1ZXN0IGxvY2sgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcHNfZG9uZShpcHNfaGFfdCAqIGhhLCBpcHNfc2NiX3QgKiBzY2IpCit7CisJaW50IHJldDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2RvbmUiLCAxKTsKKworCWlmICghc2NiKQorCQlyZXR1cm47CisKKwlpZiAoKHNjYi0+c2NzaV9jbWQpICYmIChpcHNfaXNfcGFzc3RocnUoc2NiLT5zY3NpX2NtZCkpKSB7CisJCWlwc19jbGVhbnVwX3Bhc3N0aHJ1KGhhLCBzY2IpOworCQloYS0+bnVtX2lvY3RsLS07CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgY29tbWFuZCBoYWQgdG9vIG11Y2gKKwkJICogZGF0YSBhbmQgaGFkIHRvIGJlIGJyb2tlIHVwLiAgSWYgc28sIHF1ZXVlCisJCSAqIHRoZSByZXN0IG9mIHRoZSBkYXRhIGFuZCBjb250aW51ZS4KKwkJICovCisJCWlmICgoc2NiLT5icmVha3VwKSB8fCAoc2NiLT5zZ19icmVhaykpIHsKKwkJCS8qIHdlIGhhZCBhIGRhdGEgYnJlYWt1cCAqLworCQkJc2NiLT5kYXRhX2xlbiA9IDA7CisKKwkJCWlmIChzY2ItPnNnX2NvdW50KSB7CisJCQkJLyogUy9HIHJlcXVlc3QgKi8KKwkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCQkJCWludCBpcHNfc2dfaW5kZXggPSAwOworCQkJCWludCBzZ19kbWFfaW5kZXg7CisKKwkJCQlzZyA9IHNjYi0+c2NzaV9jbWQtPnJlcXVlc3RfYnVmZmVyOworCisJCQkJLyogU3BpbiBmb3J3YXJkIHRvIGxhc3QgZG1hIGNodW5rICovCisJCQkJc2dfZG1hX2luZGV4ID0gc2NiLT5icmVha3VwOworCisJCQkJLyogVGFrZSBjYXJlIG9mIHBvc3NpYmxlIHBhcnRpYWwgb24gbGFzdCBjaHVuayAqLworCQkJCWlwc19maWxsX3NjYl9zZ19zaW5nbGUoaGEsCisJCQkJCQkgICAgICAgc2dfZG1hX2FkZHJlc3MoJnNnCisJCQkJCQkJCSAgICAgIFtzZ19kbWFfaW5kZXhdKSwKKwkJCQkJCSAgICAgICBzY2IsIGlwc19zZ19pbmRleCsrLAorCQkJCQkJICAgICAgIHNnX2RtYV9sZW4oJnNnCisJCQkJCQkJCSAgW3NnX2RtYV9pbmRleF0pKTsKKworCQkJCWZvciAoOyBzZ19kbWFfaW5kZXggPCBzY2ItPnNnX2NvdW50OworCQkJCSAgICAgc2dfZG1hX2luZGV4KyspIHsKKwkJCQkJaWYgKGlwc19maWxsX3NjYl9zZ19zaW5nbGUKKwkJCQkJICAgIChoYSwKKwkJCQkJICAgICBzZ19kbWFfYWRkcmVzcygmc2dbc2dfZG1hX2luZGV4XSksCisJCQkJCSAgICAgc2NiLCBpcHNfc2dfaW5kZXgrKywKKwkJCQkJICAgICBzZ19kbWFfbGVuKCZzZ1tzZ19kbWFfaW5kZXhdKSkgPCAwKQorCQkJCQkJYnJlYWs7CisKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJLyogTm9uIFMvRyBSZXF1ZXN0ICovCisJCQkJKHZvaWQpIGlwc19maWxsX3NjYl9zZ19zaW5nbGUoaGEsCisJCQkJCQkJICAgICAgc2NiLT4KKwkJCQkJCQkgICAgICBkYXRhX2J1c2FkZHIgKworCQkJCQkJCSAgICAgIChzY2ItPnNnX2JyZWFrICoKKwkJCQkJCQkgICAgICAgaGEtPm1heF94ZmVyKSwKKwkJCQkJCQkgICAgICBzY2IsIDAsCisJCQkJCQkJICAgICAgc2NiLT5zY3NpX2NtZC0+CisJCQkJCQkJICAgICAgcmVxdWVzdF9idWZmbGVuIC0KKwkJCQkJCQkgICAgICAoc2NiLT5zZ19icmVhayAqCisJCQkJCQkJICAgICAgIGhhLT5tYXhfeGZlcikpOworCQkJfQorCisJCQlzY2ItPmRjZGIudHJhbnNmZXJfbGVuZ3RoID0gc2NiLT5kYXRhX2xlbjsKKwkJCXNjYi0+ZGNkYi5jbWRfYXR0cmlidXRlIHw9CisJCQkgICAgaXBzX2NvbW1hbmRfZGlyZWN0aW9uW3NjYi0+c2NzaV9jbWQtPmNtbmRbMF1dOworCisJCQlpZiAoIShzY2ItPmRjZGIuY21kX2F0dHJpYnV0ZSAmIDB4MykpCisJCQkJc2NiLT5kY2RiLnRyYW5zZmVyX2xlbmd0aCA9IDA7CisKKwkJCWlmIChzY2ItPmRhdGFfbGVuID49IElQU19NQVhfWEZFUikgeworCQkJCXNjYi0+ZGNkYi5jbWRfYXR0cmlidXRlIHw9IElQU19UUkFOU0ZFUjY0SzsKKwkJCQlzY2ItPmRjZGIudHJhbnNmZXJfbGVuZ3RoID0gMDsKKwkJCX0KKworCQkJcmV0ID0gaXBzX3NlbmRfY21kKGhhLCBzY2IpOworCisJCQlzd2l0Y2ggKHJldCkgeworCQkJY2FzZSBJUFNfRkFJTFVSRToKKwkJCQlpZiAoc2NiLT5zY3NpX2NtZCkgeworCQkJCQlzY2ItPnNjc2lfY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCQkJCXNjYi0+c2NzaV9jbWQtPnNjc2lfZG9uZShzY2ItPnNjc2lfY21kKTsKKwkJCQl9CisKKwkJCQlpcHNfZnJlZXNjYihoYSwgc2NiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSVBTX1NVQ0NFU1NfSU1NOgorCQkJCWlmIChzY2ItPnNjc2lfY21kKSB7CisJCQkJCXNjYi0+c2NzaV9jbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJCQkJc2NiLT5zY3NpX2NtZC0+c2NzaV9kb25lKHNjYi0+c2NzaV9jbWQpOworCQkJCX0KKworCQkJCWlwc19mcmVlc2NiKGhhLCBzY2IpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0JLyogZW5kIGNhc2UgKi8KKworCQkJcmV0dXJuOworCQl9CisJfQkJCS8qIGVuZCBpZiBwYXNzdGhydSAqLworCisJaWYgKHNjYi0+YnVzKSB7CisJCWhhLT5kY2RiX2FjdGl2ZVtzY2ItPmJ1cyAtIDFdICY9IH4oMSA8PCBzY2ItPnRhcmdldF9pZCk7CisJfQorCisJc2NiLT5zY3NpX2NtZC0+c2NzaV9kb25lKHNjYi0+c2NzaV9jbWQpOworCisJaXBzX2ZyZWVzY2IoaGEsIHNjYik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19tYXBfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTWFwIENvbnRyb2xsZXIgRXJyb3IgY29kZXMgdG8gTGludXggRXJyb3IgQ29kZXMgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19tYXBfc3RhdHVzKGlwc19oYV90ICogaGEsIGlwc19zY2JfdCAqIHNjYiwgaXBzX3N0YXRfdCAqIHNwKQoreworCWludCBlcnJjb2RlOworCWludCBkZXZpY2VfZXJyb3I7CisJdWludDMyX3QgdHJhbnNmZXJfbGVuOworCUlQU19EQ0RCX1RBQkxFX1RBUEUgKnRhcGVEQ0RCOworCisJTUVUSE9EX1RSQUNFKCJpcHNfbWFwX3N0YXR1cyIsIDEpOworCisJaWYgKHNjYi0+YnVzKSB7CisJCURFQlVHX1ZBUigyLAorCQkJICAiKCVzJWQpIFBoeXNpY2FsIGRldmljZSBlcnJvciAoJWQgJWQgJWQpOiAleCAleCwgU2Vuc2UgS2V5OiAleCwgQVNDOiAleCwgQVNDUTogJXgiLAorCQkJICBpcHNfbmFtZSwgaGEtPmhvc3RfbnVtLAorCQkJICBzY2ItPnNjc2lfY21kLT5kZXZpY2UtPmNoYW5uZWwsCisJCQkgIHNjYi0+c2NzaV9jbWQtPmRldmljZS0+aWQsIHNjYi0+c2NzaV9jbWQtPmRldmljZS0+bHVuLAorCQkJICBzY2ItPmJhc2ljX3N0YXR1cywgc2NiLT5leHRlbmRlZF9zdGF0dXMsCisJCQkgIHNjYi0+ZXh0ZW5kZWRfc3RhdHVzID09CisJCQkgIElQU19FUlJfQ0tDT05EID8gc2NiLT5kY2RiLnNlbnNlX2luZm9bMl0gJiAweGYgOiAwLAorCQkJICBzY2ItPmV4dGVuZGVkX3N0YXR1cyA9PQorCQkJICBJUFNfRVJSX0NLQ09ORCA/IHNjYi0+ZGNkYi5zZW5zZV9pbmZvWzEyXSA6IDAsCisJCQkgIHNjYi0+ZXh0ZW5kZWRfc3RhdHVzID09CisJCQkgIElQU19FUlJfQ0tDT05EID8gc2NiLT5kY2RiLnNlbnNlX2luZm9bMTNdIDogMCk7CisJfQorCisJLyogZGVmYXVsdCBkcml2ZXIgZXJyb3IgKi8KKwllcnJjb2RlID0gRElEX0VSUk9SOworCWRldmljZV9lcnJvciA9IDA7CisKKwlzd2l0Y2ggKHNjYi0+YmFzaWNfc3RhdHVzICYgSVBTX0dTQ19TVEFUVVNfTUFTSykgeworCWNhc2UgSVBTX0NNRF9USU1FT1VUOgorCQllcnJjb2RlID0gRElEX1RJTUVfT1VUOworCQlicmVhazsKKworCWNhc2UgSVBTX0lOVkFMX09QQ086CisJY2FzZSBJUFNfSU5WQUxfQ01EX0JMSzoKKwljYXNlIElQU19JTlZBTF9QQVJNX0JMSzoKKwljYXNlIElQU19MRF9FUlJPUjoKKwljYXNlIElQU19DTURfQ01QTFRfV0VSUk9SOgorCQlicmVhazsKKworCWNhc2UgSVBTX1BIWVNfRFJWX0VSUk9SOgorCQlzd2l0Y2ggKHNjYi0+ZXh0ZW5kZWRfc3RhdHVzKSB7CisJCWNhc2UgSVBTX0VSUl9TRUxfVE86CisJCQlpZiAoc2NiLT5idXMpCisJCQkJZXJyY29kZSA9IERJRF9OT19DT05ORUNUOworCisJCQlicmVhazsKKworCQljYXNlIElQU19FUlJfT1VfUlVOOgorCQkJaWYgKChzY2ItPmNtZC5kY2RiLm9wX2NvZGUgPT0gSVBTX0NNRF9FWFRFTkRFRF9EQ0RCKSB8fAorCQkJICAgIChzY2ItPmNtZC5kY2RiLm9wX2NvZGUgPT0KKwkJCSAgICAgSVBTX0NNRF9FWFRFTkRFRF9EQ0RCX1NHKSkgeworCQkJCXRhcGVEQ0RCID0gKElQU19EQ0RCX1RBQkxFX1RBUEUgKikgJiBzY2ItPmRjZGI7CisJCQkJdHJhbnNmZXJfbGVuID0gdGFwZURDREItPnRyYW5zZmVyX2xlbmd0aDsKKwkJCX0gZWxzZSB7CisJCQkJdHJhbnNmZXJfbGVuID0KKwkJCQkgICAgKHVpbnQzMl90KSBzY2ItPmRjZGIudHJhbnNmZXJfbGVuZ3RoOworCQkJfQorCisJCQlpZiAoKHNjYi0+YnVzKSAmJiAodHJhbnNmZXJfbGVuIDwgc2NiLT5kYXRhX2xlbikpIHsKKwkJCQkvKiBVbmRlcnJ1biAtIHNldCBkZWZhdWx0IHRvIG5vIGVycm9yICovCisJCQkJZXJyY29kZSA9IERJRF9PSzsKKworCQkJCS8qIFJlc3RyaWN0IGFjY2VzcyB0byBwaHlzaWNhbCBEQVNEICovCisJCQkJaWYgKChzY2ItPnNjc2lfY21kLT5jbW5kWzBdID09IElOUVVJUlkpICYmCisJCQkJICAgICgoKChjaGFyICopIHNjYi0+c2NzaV9jbWQtPgorCQkJCSAgICAgICBidWZmZXIpWzBdICYgMHgxZikgPT0gVFlQRV9ESVNLKSkgeworCQkJCQkvKiB1bmRlcmZsb3cgLS0gbm8gZXJyb3IgICAgICAgICAgICAgICAqLworCQkJCQkvKiByZXN0cmljdCBhY2Nlc3MgdG8gcGh5c2ljYWwgREFTRCAgICAqLworCQkJCQllcnJjb2RlID0gRElEX1RJTUVfT1VUOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQllcnJjb2RlID0gRElEX0VSUk9SOworCisJCQlicmVhazsKKworCQljYXNlIElQU19FUlJfUkVDT1ZFUlk6CisJCQkvKiBkb24ndCBmYWlsIHJlY292ZXJlZCBlcnJvcnMgKi8KKwkJCWlmIChzY2ItPmJ1cykKKwkJCQllcnJjb2RlID0gRElEX09LOworCisJCQlicmVhazsKKworCQljYXNlIElQU19FUlJfSE9TVF9SRVNFVDoKKwkJY2FzZSBJUFNfRVJSX0RFVl9SRVNFVDoKKwkJCWVycmNvZGUgPSBESURfUkVTRVQ7CisJCQlicmVhazsKKworCQljYXNlIElQU19FUlJfQ0tDT05EOgorCQkJaWYgKHNjYi0+YnVzKSB7CisJCQkJaWYgKChzY2ItPmNtZC5kY2RiLm9wX2NvZGUgPT0KKwkJCQkgICAgIElQU19DTURfRVhURU5ERURfRENEQikKKwkJCQkgICAgfHwgKHNjYi0+Y21kLmRjZGIub3BfY29kZSA9PQorCQkJCQlJUFNfQ01EX0VYVEVOREVEX0RDREJfU0cpKSB7CisJCQkJCXRhcGVEQ0RCID0KKwkJCQkJICAgIChJUFNfRENEQl9UQUJMRV9UQVBFICopICYgc2NiLT5kY2RiOworCQkJCQltZW1jcHkoc2NiLT5zY3NpX2NtZC0+c2Vuc2VfYnVmZmVyLAorCQkJCQkgICAgICAgdGFwZURDREItPnNlbnNlX2luZm8sCisJCQkJCSAgICAgICBzaXplb2YgKHNjYi0+c2NzaV9jbWQtPgorCQkJCQkJICAgICAgIHNlbnNlX2J1ZmZlcikpOworCQkJCX0gZWxzZSB7CisJCQkJCW1lbWNweShzY2ItPnNjc2lfY21kLT5zZW5zZV9idWZmZXIsCisJCQkJCSAgICAgICBzY2ItPmRjZGIuc2Vuc2VfaW5mbywKKwkJCQkJICAgICAgIHNpemVvZiAoc2NiLT5zY3NpX2NtZC0+CisJCQkJCQkgICAgICAgc2Vuc2VfYnVmZmVyKSk7CisJCQkJfQorCQkJCWRldmljZV9lcnJvciA9IDI7CS8qIGNoZWNrIGNvbmRpdGlvbiAqLworCQkJfQorCisJCQllcnJjb2RlID0gRElEX09LOworCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZXJyY29kZSA9IERJRF9FUlJPUjsKKwkJCWJyZWFrOworCisJCX0JCS8qIGVuZCBzd2l0Y2ggKi8KKwl9CQkJLyogZW5kIHN3aXRjaCAqLworCisJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gZGV2aWNlX2Vycm9yIHwgKGVycmNvZGUgPDwgMTYpOworCisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3NlbmRfd2FpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBTZW5kIGEgY29tbWFuZCB0byB0aGUgY29udHJvbGxlciBhbmQgd2FpdCBmb3IgaXQgdG8gcmV0dXJuICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlIEZGREMgVGltZSBTdGFtcCB1c2UgdGhpcyBmdW5jdGlvbiBmb3IgdGhlIGNhbGxiYWNrLCBidXQgZG9lc24ndCAgICAqLworLyogICBhY3R1YWxseSBuZWVkIHRvIHdhaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19zZW5kX3dhaXQoaXBzX2hhX3QgKiBoYSwgaXBzX3NjYl90ICogc2NiLCBpbnQgdGltZW91dCwgaW50IGludHIpCit7CisJaW50IHJldDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3NlbmRfd2FpdCIsIDEpOworCisJaWYgKGludHIgIT0gSVBTX0ZGREMpIHsJLyogV29uJ3QgYmUgV2FpdGluZyBpZiB0aGlzIGlzIGEgVGltZSBTdGFtcCAqLworCQloYS0+d2FpdGZsYWcgPSBUUlVFOworCQloYS0+Y21kX2luX3Byb2dyZXNzID0gc2NiLT5jZGJbMF07CisJfQorCXNjYi0+Y2FsbGJhY2sgPSBpcHNpbnRyX2Jsb2NraW5nOworCXJldCA9IGlwc19zZW5kX2NtZChoYSwgc2NiKTsKKworCWlmICgocmV0ID09IElQU19GQUlMVVJFKSB8fCAocmV0ID09IElQU19TVUNDRVNTX0lNTSkpCisJCXJldHVybiAocmV0KTsKKworCWlmIChpbnRyICE9IElQU19GRkRDKQkvKiBEb24ndCBXYWl0IGFyb3VuZCBpZiB0aGlzIGlzIGEgVGltZSBTdGFtcCAqLworCQlyZXQgPSBpcHNfd2FpdChoYSwgdGltZW91dCwgaW50cik7CisKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19zY21kX2J1Zl93cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV3JpdGUgZGF0YSB0byBTY3NpX0NtbmQgcmVxdWVzdF9idWZmZXIgYXQgcHJvcGVyIG9mZnNldHMgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19zY21kX2J1Zl93cml0ZShTY3NpX0NtbmQgKiBzY21kLCB2b2lkICpkYXRhLCB1bnNpZ25lZAorCQkgICBpbnQgY291bnQpCit7CisJaWYgKHNjbWQtPnVzZV9zZykgeworCQlpbnQgaTsKKwkJdW5zaWduZWQgaW50IG1pbl9jbnQsIHhmZXJfY250OworCQljaGFyICpjZGF0YSA9IChjaGFyICopIGRhdGE7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBzY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJZm9yIChpID0gMCwgeGZlcl9jbnQgPSAwOworCQkgICAgIChpIDwgc2NtZC0+dXNlX3NnKSAmJiAoeGZlcl9jbnQgPCBjb3VudCk7IGkrKykgeworCQkJaWYgKCFJUFNfU0dfQUREUkVTUygmc2dbaV0pKQorCQkJCXJldHVybjsKKwkJCW1pbl9jbnQgPSBtaW4oY291bnQgLSB4ZmVyX2NudCwgc2dbaV0ubGVuZ3RoKTsKKwkJCW1lbWNweShJUFNfU0dfQUREUkVTUygmc2dbaV0pLCAmY2RhdGFbeGZlcl9jbnRdLAorCQkJICAgICAgIG1pbl9jbnQpOworCQkJeGZlcl9jbnQgKz0gbWluX2NudDsKKwkJfQorCisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50IG1pbl9jbnQgPSBtaW4oY291bnQsIHNjbWQtPnJlcXVlc3RfYnVmZmxlbik7CisJCW1lbWNweShzY21kLT5yZXF1ZXN0X2J1ZmZlciwgZGF0YSwgbWluX2NudCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfc2NtZF9idWZfcmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHkgZGF0YSBmcm9tIGEgU2NzaV9DbW5kIHRvIGEgbmV3LCBsaW5lYXIgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcHNfc2NtZF9idWZfcmVhZChTY3NpX0NtbmQgKiBzY21kLCB2b2lkICpkYXRhLCB1bnNpZ25lZAorCQkgIGludCBjb3VudCkKK3sKKwlpZiAoc2NtZC0+dXNlX3NnKSB7CisJCWludCBpOworCQl1bnNpZ25lZCBpbnQgbWluX2NudCwgeGZlcl9jbnQ7CisJCWNoYXIgKmNkYXRhID0gKGNoYXIgKikgZGF0YTsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHNjbWQtPnJlcXVlc3RfYnVmZmVyOworCQlmb3IgKGkgPSAwLCB4ZmVyX2NudCA9IDA7CisJCSAgICAgKGkgPCBzY21kLT51c2Vfc2cpICYmICh4ZmVyX2NudCA8IGNvdW50KTsgaSsrKSB7CisJCQlpZiAoIUlQU19TR19BRERSRVNTKCZzZ1tpXSkpCisJCQkJcmV0dXJuOworCQkJbWluX2NudCA9IG1pbihjb3VudCAtIHhmZXJfY250LCBzZ1tpXS5sZW5ndGgpOworCQkJbWVtY3B5KCZjZGF0YVt4ZmVyX2NudF0sIElQU19TR19BRERSRVNTKCZzZ1tpXSksCisJCQkgICAgICAgbWluX2NudCk7CisJCQl4ZmVyX2NudCArPSBtaW5fY250OworCQl9CisKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBpbnQgbWluX2NudCA9IG1pbihjb3VudCwgc2NtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwkJbWVtY3B5KGRhdGEsIHNjbWQtPnJlcXVlc3RfYnVmZmVyLCBtaW5fY250KTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19zZW5kX2NtZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTWFwIFNDU0kgY29tbWFuZHMgdG8gU2VydmVSQUlEIGNvbW1hbmRzIGZvciBsb2dpY2FsIGRyaXZlcyAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19zZW5kX2NtZChpcHNfaGFfdCAqIGhhLCBpcHNfc2NiX3QgKiBzY2IpCit7CisJaW50IHJldDsKKwljaGFyICpzcDsKKwlpbnQgZGV2aWNlX2Vycm9yOworCUlQU19EQ0RCX1RBQkxFX1RBUEUgKnRhcGVEQ0RCOworCWludCBUaW1lT3V0OworCisJTUVUSE9EX1RSQUNFKCJpcHNfc2VuZF9jbWQiLCAxKTsKKworCXJldCA9IElQU19TVUNDRVNTOworCisJaWYgKCFzY2ItPnNjc2lfY21kKSB7CisJCS8qIGludGVybmFsIGNvbW1hbmQgKi8KKworCQlpZiAoc2NiLT5idXMgPiAwKSB7CisJCQkvKiBDb250cm9sbGVyIGNvbW1hbmRzIGNhbid0IGJlIGlzc3VlZCAqLworCQkJLyogdG8gcmVhbCBkZXZpY2VzIC0tIGZhaWwgdGhlbSAgICAgICAgKi8KKwkJCWlmICgoaGEtPndhaXRmbGFnID09IFRSVUUpICYmCisJCQkgICAgKGhhLT5jbWRfaW5fcHJvZ3Jlc3MgPT0gc2NiLT5jZGJbMF0pKSB7CisJCQkJaGEtPndhaXRmbGFnID0gRkFMU0U7CisJCQl9CisKKwkJCXJldHVybiAoMSk7CisJCX0KKwl9IGVsc2UgaWYgKChzY2ItPmJ1cyA9PSAwKSAmJiAoIWlwc19pc19wYXNzdGhydShzY2ItPnNjc2lfY21kKSkpIHsKKwkJLyogY29tbWFuZCB0byBsb2dpY2FsIGJ1cyAtLSBpbnRlcnByZXQgKi8KKwkJcmV0ID0gSVBTX1NVQ0NFU1NfSU1NOworCisJCXN3aXRjaCAoc2NiLT5zY3NpX2NtZC0+Y21uZFswXSkgeworCQljYXNlIEFMTE9XX01FRElVTV9SRU1PVkFMOgorCQljYXNlIFJFWkVST19VTklUOgorCQljYXNlIEVSQVNFOgorCQljYXNlIFdSSVRFX0ZJTEVNQVJLUzoKKwkJY2FzZSBTUEFDRToKKwkJCXNjYi0+c2NzaV9jbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJCWJyZWFrOworCisJCWNhc2UgU1RBUlRfU1RPUDoKKwkJCXNjYi0+c2NzaV9jbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKworCQljYXNlIFRFU1RfVU5JVF9SRUFEWToKKwkJY2FzZSBJTlFVSVJZOgorCQkJaWYgKHNjYi0+dGFyZ2V0X2lkID09IElQU19BREFQVEVSX0lEKSB7CisJCQkJLyoKKwkJCQkgKiBFaXRoZXIgd2UgaGF2ZSBhIFRVUgorCQkJCSAqIG9yIHdlIGhhdmUgYSBTQ1NJIGlucXVpcnkKKwkJCQkgKi8KKwkJCQlpZiAoc2NiLT5zY3NpX2NtZC0+Y21uZFswXSA9PSBURVNUX1VOSVRfUkVBRFkpCisJCQkJCXNjYi0+c2NzaV9jbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKworCQkJCWlmIChzY2ItPnNjc2lfY21kLT5jbW5kWzBdID09IElOUVVJUlkpIHsKKwkJCQkJSVBTX1NDU0lfSU5RX0RBVEEgaW5xdWlyeTsKKworCQkJCQltZW1zZXQoJmlucXVpcnksIDAsCisJCQkJCSAgICAgICBzaXplb2YgKElQU19TQ1NJX0lOUV9EQVRBKSk7CisKKwkJCQkJaW5xdWlyeS5EZXZpY2VUeXBlID0KKwkJCQkJICAgIElQU19TQ1NJX0lOUV9UWVBFX1BST0NFU1NPUjsKKwkJCQkJaW5xdWlyeS5EZXZpY2VUeXBlUXVhbGlmaWVyID0KKwkJCQkJICAgIElQU19TQ1NJX0lOUV9MVV9DT05ORUNURUQ7CisJCQkJCWlucXVpcnkuVmVyc2lvbiA9IElQU19TQ1NJX0lOUV9SRVYyOworCQkJCQlpbnF1aXJ5LlJlc3BvbnNlRGF0YUZvcm1hdCA9CisJCQkJCSAgICBJUFNfU0NTSV9JTlFfUkRfUkVWMjsKKwkJCQkJaW5xdWlyeS5BZGRpdGlvbmFsTGVuZ3RoID0gMzE7CisJCQkJCWlucXVpcnkuRmxhZ3NbMF0gPQorCQkJCQkgICAgSVBTX1NDU0lfSU5RX0FkZHJlc3MxNjsKKwkJCQkJaW5xdWlyeS5GbGFnc1sxXSA9CisJCQkJCSAgICBJUFNfU0NTSV9JTlFfV0J1czE2IHwKKwkJCQkJICAgIElQU19TQ1NJX0lOUV9TeW5jOworCQkJCQlzdHJuY3B5KGlucXVpcnkuVmVuZG9ySWQsICJJQk0gICAgICIsCisJCQkJCQk4KTsKKwkJCQkJc3RybmNweShpbnF1aXJ5LlByb2R1Y3RJZCwKKwkJCQkJCSJTRVJWRVJBSUQgICAgICAgIiwgMTYpOworCQkJCQlzdHJuY3B5KGlucXVpcnkuUHJvZHVjdFJldmlzaW9uTGV2ZWwsCisJCQkJCQkiMS4wMCIsIDQpOworCisJCQkJCWlwc19zY21kX2J1Zl93cml0ZShzY2ItPnNjc2lfY21kLAorCQkJCQkJCSAgICZpbnF1aXJ5LAorCQkJCQkJCSAgIHNpemVvZiAoaW5xdWlyeSkpOworCisJCQkJCXNjYi0+c2NzaV9jbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXNjYi0+Y21kLmxvZ2ljYWxfaW5mby5vcF9jb2RlID0gSVBTX0NNRF9HRVRfTERfSU5GTzsKKwkJCQlzY2ItPmNtZC5sb2dpY2FsX2luZm8uY29tbWFuZF9pZCA9IElQU19DT01NQU5EX0lEKGhhLCBzY2IpOworCQkJCXNjYi0+Y21kLmxvZ2ljYWxfaW5mby5yZXNlcnZlZCA9IDA7CisJCQkJc2NiLT5jbWQubG9naWNhbF9pbmZvLnJlc2VydmVkMiA9IDA7CisJCQkJc2NiLT5kYXRhX2xlbiA9IHNpemVvZiAoSVBTX0xEX0lORk8pOworCQkJCXNjYi0+ZGF0YV9idXNhZGRyID0gaGEtPmxvZ2ljYWxfZHJpdmVfaW5mb19kbWFfYWRkcjsKKwkJCQlzY2ItPmZsYWdzID0gMDsKKwkJCQlzY2ItPmNtZC5sb2dpY2FsX2luZm8uYnVmZmVyX2FkZHIgPSBzY2ItPmRhdGFfYnVzYWRkcjsKKwkJCQlyZXQgPSBJUFNfU1VDQ0VTUzsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBSRVFVRVNUX1NFTlNFOgorCQkJaXBzX3JlcXNlbihoYSwgc2NiKTsKKwkJCXNjYi0+c2NzaV9jbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVBRF82OgorCQljYXNlIFdSSVRFXzY6CisJCQlpZiAoIXNjYi0+c2dfbGVuKSB7CisJCQkJc2NiLT5jbWQuYmFzaWNfaW8ub3BfY29kZSA9CisJCQkJICAgIChzY2ItPnNjc2lfY21kLT5jbW5kWzBdID09CisJCQkJICAgICBSRUFEXzYpID8gSVBTX0NNRF9SRUFEIDogSVBTX0NNRF9XUklURTsKKwkJCQlzY2ItPmNtZC5iYXNpY19pby5lbmhhbmNlZF9zZyA9IDA7CisJCQkJc2NiLT5jbWQuYmFzaWNfaW8uc2dfYWRkciA9CisJCQkJICAgIGNwdV90b19sZTMyKHNjYi0+ZGF0YV9idXNhZGRyKTsKKwkJCX0gZWxzZSB7CisJCQkJc2NiLT5jbWQuYmFzaWNfaW8ub3BfY29kZSA9CisJCQkJICAgIChzY2ItPnNjc2lfY21kLT5jbW5kWzBdID09CisJCQkJICAgICBSRUFEXzYpID8gSVBTX0NNRF9SRUFEX1NHIDoKKwkJCQkgICAgSVBTX0NNRF9XUklURV9TRzsKKwkJCQlzY2ItPmNtZC5iYXNpY19pby5lbmhhbmNlZF9zZyA9CisJCQkJICAgIElQU19VU0VfRU5IX1NHTElTVChoYSkgPyAweEZGIDogMDsKKwkJCQlzY2ItPmNtZC5iYXNpY19pby5zZ19hZGRyID0KKwkJCQkgICAgY3B1X3RvX2xlMzIoc2NiLT5zZ19idXNhZGRyKTsKKwkJCX0KKworCQkJc2NiLT5jbWQuYmFzaWNfaW8uc2VnbWVudF80RyA9IDA7CisJCQlzY2ItPmNtZC5iYXNpY19pby5jb21tYW5kX2lkID0gSVBTX0NPTU1BTkRfSUQoaGEsIHNjYik7CisJCQlzY2ItPmNtZC5iYXNpY19pby5sb2dfZHJ2ID0gc2NiLT50YXJnZXRfaWQ7CisJCQlzY2ItPmNtZC5iYXNpY19pby5zZ19jb3VudCA9IHNjYi0+c2dfbGVuOworCisJCQlpZiAoc2NiLT5jbWQuYmFzaWNfaW8ubGJhKQorCQkJCXNjYi0+Y21kLmJhc2ljX2lvLmxiYSA9CisJCQkJICAgIGNwdV90b19sZTMyKGxlMzJfdG9fY3B1CisJCQkJCQkoc2NiLT5jbWQuYmFzaWNfaW8ubGJhKSArCisJCQkJCQlsZTE2X3RvX2NwdShzY2ItPmNtZC5iYXNpY19pby4KKwkJCQkJCQkgICAgc2VjdG9yX2NvdW50KSk7CisJCQllbHNlCisJCQkJc2NiLT5jbWQuYmFzaWNfaW8ubGJhID0KKwkJCQkgICAgKCgoc2NiLT5zY3NpX2NtZC0+CisJCQkJICAgICAgIGNtbmRbMV0gJiAweDFmKSA8PCAxNikgfCAoc2NiLT5zY3NpX2NtZC0+CisJCQkJCQkJCSBjbW5kWzJdIDw8IDgpIHwKKwkJCQkgICAgIChzY2ItPnNjc2lfY21kLT5jbW5kWzNdKSk7CisKKwkJCXNjYi0+Y21kLmJhc2ljX2lvLnNlY3Rvcl9jb3VudCA9CisJCQkgICAgY3B1X3RvX2xlMTYoc2NiLT5kYXRhX2xlbiAvIElQU19CTEtTSVpFKTsKKworCQkJaWYgKGxlMTZfdG9fY3B1KHNjYi0+Y21kLmJhc2ljX2lvLnNlY3Rvcl9jb3VudCkgPT0gMCkKKwkJCQlzY2ItPmNtZC5iYXNpY19pby5zZWN0b3JfY291bnQgPQorCQkJCSAgICBjcHVfdG9fbGUxNigyNTYpOworCisJCQlyZXQgPSBJUFNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVBRF8xMDoKKwkJY2FzZSBXUklURV8xMDoKKwkJCWlmICghc2NiLT5zZ19sZW4pIHsKKwkJCQlzY2ItPmNtZC5iYXNpY19pby5vcF9jb2RlID0KKwkJCQkgICAgKHNjYi0+c2NzaV9jbWQtPmNtbmRbMF0gPT0KKwkJCQkgICAgIFJFQURfMTApID8gSVBTX0NNRF9SRUFEIDogSVBTX0NNRF9XUklURTsKKwkJCQlzY2ItPmNtZC5iYXNpY19pby5lbmhhbmNlZF9zZyA9IDA7CisJCQkJc2NiLT5jbWQuYmFzaWNfaW8uc2dfYWRkciA9CisJCQkJICAgIGNwdV90b19sZTMyKHNjYi0+ZGF0YV9idXNhZGRyKTsKKwkJCX0gZWxzZSB7CisJCQkJc2NiLT5jbWQuYmFzaWNfaW8ub3BfY29kZSA9CisJCQkJICAgIChzY2ItPnNjc2lfY21kLT5jbW5kWzBdID09CisJCQkJICAgICBSRUFEXzEwKSA/IElQU19DTURfUkVBRF9TRyA6CisJCQkJICAgIElQU19DTURfV1JJVEVfU0c7CisJCQkJc2NiLT5jbWQuYmFzaWNfaW8uZW5oYW5jZWRfc2cgPQorCQkJCSAgICBJUFNfVVNFX0VOSF9TR0xJU1QoaGEpID8gMHhGRiA6IDA7CisJCQkJc2NiLT5jbWQuYmFzaWNfaW8uc2dfYWRkciA9CisJCQkJICAgIGNwdV90b19sZTMyKHNjYi0+c2dfYnVzYWRkcik7CisJCQl9CisKKwkJCXNjYi0+Y21kLmJhc2ljX2lvLnNlZ21lbnRfNEcgPSAwOworCQkJc2NiLT5jbWQuYmFzaWNfaW8uY29tbWFuZF9pZCA9IElQU19DT01NQU5EX0lEKGhhLCBzY2IpOworCQkJc2NiLT5jbWQuYmFzaWNfaW8ubG9nX2RydiA9IHNjYi0+dGFyZ2V0X2lkOworCQkJc2NiLT5jbWQuYmFzaWNfaW8uc2dfY291bnQgPSBzY2ItPnNnX2xlbjsKKworCQkJaWYgKHNjYi0+Y21kLmJhc2ljX2lvLmxiYSkKKwkJCQlzY2ItPmNtZC5iYXNpY19pby5sYmEgPQorCQkJCSAgICBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdQorCQkJCQkJKHNjYi0+Y21kLmJhc2ljX2lvLmxiYSkgKworCQkJCQkJbGUxNl90b19jcHUoc2NiLT5jbWQuYmFzaWNfaW8uCisJCQkJCQkJICAgIHNlY3Rvcl9jb3VudCkpOworCQkJZWxzZQorCQkJCXNjYi0+Y21kLmJhc2ljX2lvLmxiYSA9CisJCQkJICAgICgoc2NiLT5zY3NpX2NtZC0+Y21uZFsyXSA8PCAyNCkgfCAoc2NiLT4KKwkJCQkJCQkJICAgICAgIHNjc2lfY21kLT4KKwkJCQkJCQkJICAgICAgIGNtbmRbM10KKwkJCQkJCQkJICAgICAgIDw8IDE2KSB8CisJCQkJICAgICAoc2NiLT5zY3NpX2NtZC0+Y21uZFs0XSA8PCA4KSB8IHNjYi0+CisJCQkJICAgICBzY3NpX2NtZC0+Y21uZFs1XSk7CisKKwkJCXNjYi0+Y21kLmJhc2ljX2lvLnNlY3Rvcl9jb3VudCA9CisJCQkgICAgY3B1X3RvX2xlMTYoc2NiLT5kYXRhX2xlbiAvIElQU19CTEtTSVpFKTsKKworCQkJaWYgKGNwdV90b19sZTE2KHNjYi0+Y21kLmJhc2ljX2lvLnNlY3Rvcl9jb3VudCkgPT0gMCkgeworCQkJCS8qCisJCQkJICogVGhpcyBpcyBhIG51bGwgY29uZGl0aW9uCisJCQkJICogd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZworCQkJCSAqIHNvIGp1c3QgcmV0dXJuCisJCQkJICovCisJCQkJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCQkJfSBlbHNlCisJCQkJcmV0ID0gSVBTX1NVQ0NFU1M7CisKKwkJCWJyZWFrOworCisJCWNhc2UgUkVTRVJWRToKKwkJY2FzZSBSRUxFQVNFOgorCQkJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCQkJYnJlYWs7CisKKwkJY2FzZSBNT0RFX1NFTlNFOgorCQkJc2NiLT5jbWQuYmFzaWNfaW8ub3BfY29kZSA9IElQU19DTURfRU5RVUlSWTsKKwkJCXNjYi0+Y21kLmJhc2ljX2lvLmNvbW1hbmRfaWQgPSBJUFNfQ09NTUFORF9JRChoYSwgc2NiKTsKKwkJCXNjYi0+Y21kLmJhc2ljX2lvLnNlZ21lbnRfNEcgPSAwOworCQkJc2NiLT5jbWQuYmFzaWNfaW8uZW5oYW5jZWRfc2cgPSAwOworCQkJc2NiLT5kYXRhX2xlbiA9IHNpemVvZiAoKmhhLT5lbnEpOworCQkJc2NiLT5jbWQuYmFzaWNfaW8uc2dfYWRkciA9IGhhLT5lbnFfYnVzYWRkcjsKKwkJCXJldCA9IElQU19TVUNDRVNTOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRUFEX0NBUEFDSVRZOgorCQkJc2NiLT5jbWQubG9naWNhbF9pbmZvLm9wX2NvZGUgPSBJUFNfQ01EX0dFVF9MRF9JTkZPOworCQkJc2NiLT5jbWQubG9naWNhbF9pbmZvLmNvbW1hbmRfaWQgPSBJUFNfQ09NTUFORF9JRChoYSwgc2NiKTsKKwkJCXNjYi0+Y21kLmxvZ2ljYWxfaW5mby5yZXNlcnZlZCA9IDA7CisJCQlzY2ItPmNtZC5sb2dpY2FsX2luZm8ucmVzZXJ2ZWQyID0gMDsKKwkJCXNjYi0+Y21kLmxvZ2ljYWxfaW5mby5yZXNlcnZlZDMgPSAwOworCQkJc2NiLT5kYXRhX2xlbiA9IHNpemVvZiAoSVBTX0xEX0lORk8pOworCQkJc2NiLT5kYXRhX2J1c2FkZHIgPSBoYS0+bG9naWNhbF9kcml2ZV9pbmZvX2RtYV9hZGRyOworCQkJc2NiLT5mbGFncyA9IDA7CisJCQlzY2ItPmNtZC5sb2dpY2FsX2luZm8uYnVmZmVyX2FkZHIgPSBzY2ItPmRhdGFfYnVzYWRkcjsKKwkJCXJldCA9IElQU19TVUNDRVNTOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRU5EX0RJQUdOT1NUSUM6CisJCWNhc2UgUkVBU1NJR05fQkxPQ0tTOgorCQljYXNlIEZPUk1BVF9VTklUOgorCQljYXNlIFNFRUtfMTA6CisJCWNhc2UgVkVSSUZZOgorCQljYXNlIFJFQURfREVGRUNUX0RBVEE6CisJCWNhc2UgUkVBRF9CVUZGRVI6CisJCWNhc2UgV1JJVEVfQlVGRkVSOgorCQkJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qIFNldCB0aGUgUmV0dXJuIEluZm8gdG8gYXBwZWFyIGxpa2UgdGhlIENvbW1hbmQgd2FzICovCisJCQkvKiBhdHRlbXB0ZWQsIGEgQ2hlY2sgQ29uZGl0aW9uIG9jY3VycmVkLCBhbmQgU2Vuc2UgICAqLworCQkJLyogRGF0YSBpbmRpY2F0aW5nIGFuIEludmFsaWQgQ0RCIE9wQ29kZSBpcyByZXR1cm5lZC4gKi8KKwkJCXNwID0gKGNoYXIgKikgc2NiLT5zY3NpX2NtZC0+c2Vuc2VfYnVmZmVyOworCQkJbWVtc2V0KHNwLCAwLCBzaXplb2YgKHNjYi0+c2NzaV9jbWQtPnNlbnNlX2J1ZmZlcikpOworCisJCQlzcFswXSA9IDB4NzA7CS8qIEVycm9yIENvZGUgICAgICAgICAgICAgICAqLworCQkJc3BbMl0gPSBJTExFR0FMX1JFUVVFU1Q7CS8qIFNlbnNlIEtleSA1IElsbGVnYWwgUmVxLiAqLworCQkJc3BbN10gPSAweDBBOwkvKiBBZGRpdGlvbmFsIFNlbnNlIExlbmd0aCAgKi8KKwkJCXNwWzEyXSA9IDB4MjA7CS8qIEFTQyA9IEludmFsaWQgT3BDb2RlICAgICAqLworCQkJc3BbMTNdID0gMHgwMDsJLyogQVNDUSAgICAgICAgICAgICAgICAgICAgICovCisKKwkJCWRldmljZV9lcnJvciA9IDI7CS8qIEluZGljYXRlIENoZWNrIENvbmRpdGlvbiAqLworCQkJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gZGV2aWNlX2Vycm9yIHwgKERJRF9PSyA8PCAxNik7CisJCQlicmVhazsKKwkJfQkJLyogZW5kIHN3aXRjaCAqLworCX0KKwkvKiBlbmQgaWYgKi8KKwlpZiAocmV0ID09IElQU19TVUNDRVNTX0lNTSkKKwkJcmV0dXJuIChyZXQpOworCisJLyogc2V0dXAgRENEQiAqLworCWlmIChzY2ItPmJ1cyA+IDApIHsKKworCQkvKiBJZiB3ZSBhbHJlYWR5IGtub3cgdGhlIERldmljZSBpcyBOb3QgdGhlcmUsIG5vIG5lZWQgdG8gYXR0ZW1wdCBhIENvbW1hbmQgICAqLworCQkvKiBUaGlzIGFsc28gcHJvdGVjdHMgYW4gTlQgRmFpbE92ZXIgQ29udHJvbGxlciBmcm9tIGdldHRpbmcgQ0RCJ3Mgc2VudCB0byBpdCAqLworCQlpZiAoaGEtPmNvbmYtPmRldltzY2ItPmJ1cyAtIDFdW3NjYi0+dGFyZ2V0X2lkXS51Y1N0YXRlID09IDApIHsKKwkJCXNjYi0+c2NzaV9jbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQkJcmV0dXJuIChJUFNfU1VDQ0VTU19JTU0pOworCQl9CisKKwkJaGEtPmRjZGJfYWN0aXZlW3NjYi0+YnVzIC0gMV0gfD0gKDEgPDwgc2NiLT50YXJnZXRfaWQpOworCQlzY2ItPmNtZC5kY2RiLmNvbW1hbmRfaWQgPSBJUFNfQ09NTUFORF9JRChoYSwgc2NiKTsKKwkJc2NiLT5jbWQuZGNkYi5kY2RiX2FkZHJlc3MgPSBjcHVfdG9fbGUzMihzY2ItPnNjYl9idXNhZGRyICsKKwkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpICZzY2ItPgorCQkJCQkJCSBkY2RiIC0KKwkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpIHNjYik7CisJCXNjYi0+Y21kLmRjZGIucmVzZXJ2ZWQgPSAwOworCQlzY2ItPmNtZC5kY2RiLnJlc2VydmVkMiA9IDA7CisJCXNjYi0+Y21kLmRjZGIucmVzZXJ2ZWQzID0gMDsKKwkJc2NiLT5jbWQuZGNkYi5zZWdtZW50XzRHID0gMDsKKwkJc2NiLT5jbWQuZGNkYi5lbmhhbmNlZF9zZyA9IDA7CisKKwkJVGltZU91dCA9IHNjYi0+c2NzaV9jbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQ7CisKKwkJaWYgKGhhLT5zdWJzeXMtPnBhcmFtWzRdICYgMHgwMDEwMDAwMCkgewkvKiBJZiBORVcgVGFwZSBEQ0RCIGlzIFN1cHBvcnRlZCAqLworCQkJaWYgKCFzY2ItPnNnX2xlbikgeworCQkJCXNjYi0+Y21kLmRjZGIub3BfY29kZSA9IElQU19DTURfRVhURU5ERURfRENEQjsKKwkJCX0gZWxzZSB7CisJCQkJc2NiLT5jbWQuZGNkYi5vcF9jb2RlID0KKwkJCQkgICAgSVBTX0NNRF9FWFRFTkRFRF9EQ0RCX1NHOworCQkJCXNjYi0+Y21kLmRjZGIuZW5oYW5jZWRfc2cgPQorCQkJCSAgICBJUFNfVVNFX0VOSF9TR0xJU1QoaGEpID8gMHhGRiA6IDA7CisJCQl9CisKKwkJCXRhcGVEQ0RCID0gKElQU19EQ0RCX1RBQkxFX1RBUEUgKikgJiBzY2ItPmRjZGI7CS8qIFVzZSBTYW1lIERhdGEgQXJlYSBhcyBPbGQgRENEQiBTdHJ1Y3QgKi8KKwkJCXRhcGVEQ0RCLT5kZXZpY2VfYWRkcmVzcyA9CisJCQkgICAgKChzY2ItPmJ1cyAtIDEpIDw8IDQpIHwgc2NiLT50YXJnZXRfaWQ7CisJCQl0YXBlRENEQi0+Y21kX2F0dHJpYnV0ZSB8PSBJUFNfRElTQ09OTkVDVF9BTExPV0VEOworCQkJdGFwZURDREItPmNtZF9hdHRyaWJ1dGUgJj0gfklQU19UUkFOU0ZFUjY0SzsJLyogQWx3YXlzIFR1cm4gT0ZGIDY0SyBTaXplIEZsYWcgKi8KKworCQkJaWYgKFRpbWVPdXQpIHsKKwkJCQlpZiAoVGltZU91dCA8ICgxMCAqIEhaKSkKKwkJCQkJdGFwZURDREItPmNtZF9hdHRyaWJ1dGUgfD0gSVBTX1RJTUVPVVQxMDsJLyogVGltZU91dCBpcyAxMCBTZWNvbmRzICovCisJCQkJZWxzZSBpZiAoVGltZU91dCA8ICg2MCAqIEhaKSkKKwkJCQkJdGFwZURDREItPmNtZF9hdHRyaWJ1dGUgfD0gSVBTX1RJTUVPVVQ2MDsJLyogVGltZU91dCBpcyA2MCBTZWNvbmRzICovCisJCQkJZWxzZSBpZiAoVGltZU91dCA8ICgxMjAwICogSFopKQorCQkJCQl0YXBlRENEQi0+Y21kX2F0dHJpYnV0ZSB8PSBJUFNfVElNRU9VVDIwTTsJLyogVGltZU91dCBpcyAyMCBNaW51dGVzICovCisJCQl9CisKKwkJCXRhcGVEQ0RCLT5jZGJfbGVuZ3RoID0gc2NiLT5zY3NpX2NtZC0+Y21kX2xlbjsKKwkJCXRhcGVEQ0RCLT5yZXNlcnZlZF9mb3JfTFVOID0gMDsKKwkJCXRhcGVEQ0RCLT50cmFuc2Zlcl9sZW5ndGggPSBzY2ItPmRhdGFfbGVuOworCQkJaWYgKHNjYi0+Y21kLmRjZGIub3BfY29kZSA9PSBJUFNfQ01EX0VYVEVOREVEX0RDREJfU0cpCisJCQkJdGFwZURDREItPmJ1ZmZlcl9wb2ludGVyID0KKwkJCQkgICAgY3B1X3RvX2xlMzIoc2NiLT5zZ19idXNhZGRyKTsKKwkJCWVsc2UKKwkJCQl0YXBlRENEQi0+YnVmZmVyX3BvaW50ZXIgPQorCQkJCSAgICBjcHVfdG9fbGUzMihzY2ItPmRhdGFfYnVzYWRkcik7CisJCQl0YXBlRENEQi0+c2dfY291bnQgPSBzY2ItPnNnX2xlbjsKKwkJCXRhcGVEQ0RCLT5zZW5zZV9sZW5ndGggPSBzaXplb2YgKHRhcGVEQ0RCLT5zZW5zZV9pbmZvKTsKKwkJCXRhcGVEQ0RCLT5zY3NpX3N0YXR1cyA9IDA7CisJCQl0YXBlRENEQi0+cmVzZXJ2ZWQgPSAwOworCQkJbWVtY3B5KHRhcGVEQ0RCLT5zY3NpX2NkYiwgc2NiLT5zY3NpX2NtZC0+Y21uZCwKKwkJCSAgICAgICBzY2ItPnNjc2lfY21kLT5jbWRfbGVuKTsKKwkJfSBlbHNlIHsKKwkJCWlmICghc2NiLT5zZ19sZW4pIHsKKwkJCQlzY2ItPmNtZC5kY2RiLm9wX2NvZGUgPSBJUFNfQ01EX0RDREI7CisJCQl9IGVsc2UgeworCQkJCXNjYi0+Y21kLmRjZGIub3BfY29kZSA9IElQU19DTURfRENEQl9TRzsKKwkJCQlzY2ItPmNtZC5kY2RiLmVuaGFuY2VkX3NnID0KKwkJCQkgICAgSVBTX1VTRV9FTkhfU0dMSVNUKGhhKSA/IDB4RkYgOiAwOworCQkJfQorCisJCQlzY2ItPmRjZGIuZGV2aWNlX2FkZHJlc3MgPQorCQkJICAgICgoc2NiLT5idXMgLSAxKSA8PCA0KSB8IHNjYi0+dGFyZ2V0X2lkOworCQkJc2NiLT5kY2RiLmNtZF9hdHRyaWJ1dGUgfD0gSVBTX0RJU0NPTk5FQ1RfQUxMT1dFRDsKKworCQkJaWYgKFRpbWVPdXQpIHsKKwkJCQlpZiAoVGltZU91dCA8ICgxMCAqIEhaKSkKKwkJCQkJc2NiLT5kY2RiLmNtZF9hdHRyaWJ1dGUgfD0gSVBTX1RJTUVPVVQxMDsJLyogVGltZU91dCBpcyAxMCBTZWNvbmRzICovCisJCQkJZWxzZSBpZiAoVGltZU91dCA8ICg2MCAqIEhaKSkKKwkJCQkJc2NiLT5kY2RiLmNtZF9hdHRyaWJ1dGUgfD0gSVBTX1RJTUVPVVQ2MDsJLyogVGltZU91dCBpcyA2MCBTZWNvbmRzICovCisJCQkJZWxzZSBpZiAoVGltZU91dCA8ICgxMjAwICogSFopKQorCQkJCQlzY2ItPmRjZGIuY21kX2F0dHJpYnV0ZSB8PSBJUFNfVElNRU9VVDIwTTsJLyogVGltZU91dCBpcyAyMCBNaW51dGVzICovCisJCQl9CisKKwkJCXNjYi0+ZGNkYi50cmFuc2Zlcl9sZW5ndGggPSBzY2ItPmRhdGFfbGVuOworCQkJaWYgKHNjYi0+ZGNkYi5jbWRfYXR0cmlidXRlICYgSVBTX1RSQU5TRkVSNjRLKQorCQkJCXNjYi0+ZGNkYi50cmFuc2Zlcl9sZW5ndGggPSAwOworCQkJaWYgKHNjYi0+Y21kLmRjZGIub3BfY29kZSA9PSBJUFNfQ01EX0RDREJfU0cpCisJCQkJc2NiLT5kY2RiLmJ1ZmZlcl9wb2ludGVyID0KKwkJCQkgICAgY3B1X3RvX2xlMzIoc2NiLT5zZ19idXNhZGRyKTsKKwkJCWVsc2UKKwkJCQlzY2ItPmRjZGIuYnVmZmVyX3BvaW50ZXIgPQorCQkJCSAgICBjcHVfdG9fbGUzMihzY2ItPmRhdGFfYnVzYWRkcik7CisJCQlzY2ItPmRjZGIuY2RiX2xlbmd0aCA9IHNjYi0+c2NzaV9jbWQtPmNtZF9sZW47CisJCQlzY2ItPmRjZGIuc2Vuc2VfbGVuZ3RoID0gc2l6ZW9mIChzY2ItPmRjZGIuc2Vuc2VfaW5mbyk7CisJCQlzY2ItPmRjZGIuc2dfY291bnQgPSBzY2ItPnNnX2xlbjsKKwkJCXNjYi0+ZGNkYi5yZXNlcnZlZCA9IDA7CisJCQltZW1jcHkoc2NiLT5kY2RiLnNjc2lfY2RiLCBzY2ItPnNjc2lfY21kLT5jbW5kLAorCQkJICAgICAgIHNjYi0+c2NzaV9jbWQtPmNtZF9sZW4pOworCQkJc2NiLT5kY2RiLnNjc2lfc3RhdHVzID0gMDsKKwkJCXNjYi0+ZGNkYi5yZXNlcnZlZDJbMF0gPSAwOworCQkJc2NiLT5kY2RiLnJlc2VydmVkMlsxXSA9IDA7CisJCQlzY2ItPmRjZGIucmVzZXJ2ZWQyWzJdID0gMDsKKwkJfQorCX0KKworCXJldHVybiAoKCpoYS0+ZnVuYy5pc3N1ZSkgKGhhLCBzY2IpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2Noa19zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBDaGVjayB0aGUgc3RhdHVzIG9mIGNvbW1hbmRzIHRvIGxvZ2ljYWwgZHJpdmVzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEFzc3VtZWQgdG8gYmUgY2FsbGVkIHdpdGggdGhlIEhBIGxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19jaGtzdGF0dXMoaXBzX2hhX3QgKiBoYSwgSVBTX1NUQVRVUyAqIHBzdGF0dXMpCit7CisJaXBzX3NjYl90ICpzY2I7CisJaXBzX3N0YXRfdCAqc3A7CisJdWludDhfdCBiYXNpY19zdGF0dXM7CisJdWludDhfdCBleHRfc3RhdHVzOworCWludCBlcnJjb2RlOworCisJTUVUSE9EX1RSQUNFKCJpcHNfY2hrc3RhdHVzIiwgMSk7CisKKwlzY2IgPSAmaGEtPnNjYnNbcHN0YXR1cy0+ZmllbGRzLmNvbW1hbmRfaWRdOworCXNjYi0+YmFzaWNfc3RhdHVzID0gYmFzaWNfc3RhdHVzID0KKwkgICAgcHN0YXR1cy0+ZmllbGRzLmJhc2ljX3N0YXR1cyAmIElQU19CQVNJQ19TVEFUVVNfTUFTSzsKKwlzY2ItPmV4dGVuZGVkX3N0YXR1cyA9IGV4dF9zdGF0dXMgPSBwc3RhdHVzLT5maWVsZHMuZXh0ZW5kZWRfc3RhdHVzOworCisJc3AgPSAmaGEtPnNwOworCXNwLT5yZXNpZHVlX2xlbiA9IDA7CisJc3AtPnNjYl9hZGRyID0gKHZvaWQgKikgc2NiOworCisJLyogUmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIGFjdGl2ZSBxdWV1ZSAqLworCWlwc19yZW1vdmVxX3NjYigmaGEtPnNjYl9hY3RpdmVsaXN0LCBzY2IpOworCisJaWYgKCFzY2ItPnNjc2lfY21kKQorCQkvKiBpbnRlcm5hbCBjb21tYW5kcyBhcmUgaGFuZGxlZCBpbiBkb19pcHNpbnRyICovCisJCXJldHVybjsKKworCURFQlVHX1ZBUigyLCAiKCVzJWQpIGlwc19jaGtzdGF0dXM6IGNtZCAweCVYIGlkICVkICglZCAlZCAlZCkiLAorCQkgIGlwc19uYW1lLAorCQkgIGhhLT5ob3N0X251bSwKKwkJICBzY2ItPmNkYlswXSwKKwkJICBzY2ItPmNtZC5iYXNpY19pby5jb21tYW5kX2lkLAorCQkgIHNjYi0+YnVzLCBzY2ItPnRhcmdldF9pZCwgc2NiLT5sdW4pOworCisJaWYgKChzY2ItPnNjc2lfY21kKSAmJiAoaXBzX2lzX3Bhc3N0aHJ1KHNjYi0+c2NzaV9jbWQpKSkKKwkJLyogcGFzc3RocnUgLSBqdXN0IHJldHVybnMgdGhlIHJhdyByZXN1bHQgKi8KKwkJcmV0dXJuOworCisJZXJyY29kZSA9IERJRF9PSzsKKworCWlmICgoKGJhc2ljX3N0YXR1cyAmIElQU19HU0NfU1RBVFVTX01BU0spID09IElQU19DTURfU1VDQ0VTUykgfHwKKwkgICAgKChiYXNpY19zdGF0dXMgJiBJUFNfR1NDX1NUQVRVU19NQVNLKSA9PSBJUFNfQ01EX1JFQ09WRVJFRF9FUlJPUikpIHsKKworCQlpZiAoc2NiLT5idXMgPT0gMCkgeworCQkJaWYgKChiYXNpY19zdGF0dXMgJiBJUFNfR1NDX1NUQVRVU19NQVNLKSA9PQorCQkJICAgIElQU19DTURfUkVDT1ZFUkVEX0VSUk9SKSB7CisJCQkJREVCVUdfVkFSKDEsCisJCQkJCSAgIiglcyVkKSBSZWNvdmVyZWQgTG9naWNhbCBEcml2ZSBFcnJvciBPcENvZGU6ICV4LCBCU0I6ICV4LCBFU0I6ICV4IiwKKwkJCQkJICBpcHNfbmFtZSwgaGEtPmhvc3RfbnVtLAorCQkJCQkgIHNjYi0+Y21kLmJhc2ljX2lvLm9wX2NvZGUsCisJCQkJCSAgYmFzaWNfc3RhdHVzLCBleHRfc3RhdHVzKTsKKwkJCX0KKworCQkJc3dpdGNoIChzY2ItPnNjc2lfY21kLT5jbW5kWzBdKSB7CisJCQljYXNlIEFMTE9XX01FRElVTV9SRU1PVkFMOgorCQkJY2FzZSBSRVpFUk9fVU5JVDoKKwkJCWNhc2UgRVJBU0U6CisJCQljYXNlIFdSSVRFX0ZJTEVNQVJLUzoKKwkJCWNhc2UgU1BBQ0U6CisJCQkJZXJyY29kZSA9IERJRF9FUlJPUjsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTVEFSVF9TVE9QOgorCQkJCWJyZWFrOworCisJCQljYXNlIFRFU1RfVU5JVF9SRUFEWToKKwkJCQlpZiAoIWlwc19vbmxpbmUoaGEsIHNjYikpIHsKKwkJCQkJZXJyY29kZSA9IERJRF9USU1FX09VVDsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSU5RVUlSWToKKwkJCQlpZiAoaXBzX29ubGluZShoYSwgc2NiKSkgeworCQkJCQlpcHNfaW5xdWlyeShoYSwgc2NiKTsKKwkJCQl9IGVsc2UgeworCQkJCQllcnJjb2RlID0gRElEX1RJTUVfT1VUOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBSRVFVRVNUX1NFTlNFOgorCQkJCWlwc19yZXFzZW4oaGEsIHNjYik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkVBRF82OgorCQkJY2FzZSBXUklURV82OgorCQkJY2FzZSBSRUFEXzEwOgorCQkJY2FzZSBXUklURV8xMDoKKwkJCWNhc2UgUkVTRVJWRToKKwkJCWNhc2UgUkVMRUFTRToKKwkJCQlicmVhazsKKworCQkJY2FzZSBNT0RFX1NFTlNFOgorCQkJCWlmICghaXBzX29ubGluZShoYSwgc2NiKQorCQkJCSAgICB8fCAhaXBzX21zZW5zZShoYSwgc2NiKSkgeworCQkJCQllcnJjb2RlID0gRElEX0VSUk9SOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBSRUFEX0NBUEFDSVRZOgorCQkJCWlmIChpcHNfb25saW5lKGhhLCBzY2IpKQorCQkJCQlpcHNfcmRjYXAoaGEsIHNjYik7CisJCQkJZWxzZSB7CisJCQkJCWVycmNvZGUgPSBESURfVElNRV9PVVQ7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFNFTkRfRElBR05PU1RJQzoKKwkJCWNhc2UgUkVBU1NJR05fQkxPQ0tTOgorCQkJCWJyZWFrOworCisJCQljYXNlIEZPUk1BVF9VTklUOgorCQkJCWVycmNvZGUgPSBESURfRVJST1I7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU0VFS18xMDoKKwkJCWNhc2UgVkVSSUZZOgorCQkJY2FzZSBSRUFEX0RFRkVDVF9EQVRBOgorCQkJY2FzZSBSRUFEX0JVRkZFUjoKKwkJCWNhc2UgV1JJVEVfQlVGRkVSOgorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWVycmNvZGUgPSBESURfRVJST1I7CisJCQl9CS8qIGVuZCBzd2l0Y2ggKi8KKworCQkJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gZXJyY29kZSA8PCAxNjsKKwkJfSBlbHNlIHsJLyogYnVzID09IDAgKi8KKwkJCS8qIHJlc3RyaWN0IGFjY2VzcyB0byBwaHlzaWNhbCBkcml2ZXMgKi8KKwkJCWlmICgoc2NiLT5zY3NpX2NtZC0+Y21uZFswXSA9PSBJTlFVSVJZKSAmJgorCQkJICAgICgoKChjaGFyICopIHNjYi0+c2NzaV9jbWQtPmJ1ZmZlcilbMF0gJiAweDFmKSA9PQorCQkJICAgICBUWVBFX0RJU0spKSB7CisKKwkJCQlzY2ItPnNjc2lfY21kLT5yZXN1bHQgPSBESURfVElNRV9PVVQgPDwgMTY7CisJCQl9CisJCX0JCS8qIGVsc2UgKi8KKwl9IGVsc2UgewkJLyogcmVjb3ZlcmVkIGVycm9yIC8gc3VjY2VzcyAqLworCQlpZiAoc2NiLT5idXMgPT0gMCkgeworCQkJREVCVUdfVkFSKDEsCisJCQkJICAiKCVzJWQpIFVucmVjb3ZlcmVkIExvZ2ljYWwgRHJpdmUgRXJyb3IgT3BDb2RlOiAleCwgQlNCOiAleCwgRVNCOiAleCIsCisJCQkJICBpcHNfbmFtZSwgaGEtPmhvc3RfbnVtLAorCQkJCSAgc2NiLT5jbWQuYmFzaWNfaW8ub3BfY29kZSwgYmFzaWNfc3RhdHVzLAorCQkJCSAgZXh0X3N0YXR1cyk7CisJCX0KKworCQlpcHNfbWFwX3N0YXR1cyhoYSwgc2NiLCBzcCk7CisJfQkJCS8qIGVsc2UgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX29ubGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBEZXRlcm1pbmUgaWYgYSBsb2dpY2FsIGRyaXZlIGlzIG9ubGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX29ubGluZShpcHNfaGFfdCAqIGhhLCBpcHNfc2NiX3QgKiBzY2IpCit7CisJTUVUSE9EX1RSQUNFKCJpcHNfb25saW5lIiwgMSk7CisKKwlpZiAoc2NiLT50YXJnZXRfaWQgPj0gSVBTX01BWF9MRCkKKwkJcmV0dXJuICgwKTsKKworCWlmICgoc2NiLT5iYXNpY19zdGF0dXMgJiBJUFNfR1NDX1NUQVRVU19NQVNLKSA+IDEpIHsKKwkJbWVtc2V0KGhhLT5sb2dpY2FsX2RyaXZlX2luZm8sIDAsIHNpemVvZiAoSVBTX0xEX0lORk8pKTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlpZiAoaGEtPmxvZ2ljYWxfZHJpdmVfaW5mby0+ZHJpdmVfaW5mb1tzY2ItPnRhcmdldF9pZF0uc3RhdGUgIT0KKwkgICAgSVBTX0xEX09GRkxJTkUKKwkgICAgJiYgaGEtPmxvZ2ljYWxfZHJpdmVfaW5mby0+ZHJpdmVfaW5mb1tzY2ItPnRhcmdldF9pZF0uc3RhdGUgIT0KKwkgICAgSVBTX0xEX0ZSRUUKKwkgICAgJiYgaGEtPmxvZ2ljYWxfZHJpdmVfaW5mby0+ZHJpdmVfaW5mb1tzY2ItPnRhcmdldF9pZF0uc3RhdGUgIT0KKwkgICAgSVBTX0xEX0NSUworCSAgICAmJiBoYS0+bG9naWNhbF9kcml2ZV9pbmZvLT5kcml2ZV9pbmZvW3NjYi0+dGFyZ2V0X2lkXS5zdGF0ZSAhPQorCSAgICBJUFNfTERfU1lTKQorCQlyZXR1cm4gKDEpOworCWVsc2UKKwkJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2lucXVpcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBTaW11bGF0ZSBhbiBpbnF1aXJ5IGNvbW1hbmQgdG8gYSBsb2dpY2FsIGRyaXZlICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2lucXVpcnkoaXBzX2hhX3QgKiBoYSwgaXBzX3NjYl90ICogc2NiKQoreworCUlQU19TQ1NJX0lOUV9EQVRBIGlucXVpcnk7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19pbnF1aXJ5IiwgMSk7CisKKwltZW1zZXQoJmlucXVpcnksIDAsIHNpemVvZiAoSVBTX1NDU0lfSU5RX0RBVEEpKTsKKworCWlucXVpcnkuRGV2aWNlVHlwZSA9IElQU19TQ1NJX0lOUV9UWVBFX0RBU0Q7CisJaW5xdWlyeS5EZXZpY2VUeXBlUXVhbGlmaWVyID0gSVBTX1NDU0lfSU5RX0xVX0NPTk5FQ1RFRDsKKwlpbnF1aXJ5LlZlcnNpb24gPSBJUFNfU0NTSV9JTlFfUkVWMjsKKwlpbnF1aXJ5LlJlc3BvbnNlRGF0YUZvcm1hdCA9IElQU19TQ1NJX0lOUV9SRF9SRVYyOworCWlucXVpcnkuQWRkaXRpb25hbExlbmd0aCA9IDMxOworCWlucXVpcnkuRmxhZ3NbMF0gPSBJUFNfU0NTSV9JTlFfQWRkcmVzczE2OworCWlucXVpcnkuRmxhZ3NbMV0gPQorCSAgICBJUFNfU0NTSV9JTlFfV0J1czE2IHwgSVBTX1NDU0lfSU5RX1N5bmMgfCBJUFNfU0NTSV9JTlFfQ21kUXVlOworCXN0cm5jcHkoaW5xdWlyeS5WZW5kb3JJZCwgIklCTSAgICAgIiwgOCk7CisJc3RybmNweShpbnF1aXJ5LlByb2R1Y3RJZCwgIlNFUlZFUkFJRCAgICAgICAiLCAxNik7CisJc3RybmNweShpbnF1aXJ5LlByb2R1Y3RSZXZpc2lvbkxldmVsLCAiMS4wMCIsIDQpOworCisJaXBzX3NjbWRfYnVmX3dyaXRlKHNjYi0+c2NzaV9jbWQsICZpbnF1aXJ5LCBzaXplb2YgKGlucXVpcnkpKTsKKworCXJldHVybiAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19yZGNhcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgU2ltdWxhdGUgYSByZWFkIGNhcGFjaXR5IGNvbW1hbmQgdG8gYSBsb2dpY2FsIGRyaXZlICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19yZGNhcChpcHNfaGFfdCAqIGhhLCBpcHNfc2NiX3QgKiBzY2IpCit7CisJSVBTX1NDU0lfQ0FQQUNJVFkgY2FwOworCisJTUVUSE9EX1RSQUNFKCJpcHNfcmRjYXAiLCAxKTsKKworCWlmIChzY2ItPnNjc2lfY21kLT5idWZmbGVuIDwgOCkKKwkJcmV0dXJuICgwKTsKKworCWNhcC5sYmEgPQorCSAgICBjcHVfdG9fYmUzMihsZTMyX3RvX2NwdQorCQkJKGhhLT5sb2dpY2FsX2RyaXZlX2luZm8tPgorCQkJIGRyaXZlX2luZm9bc2NiLT50YXJnZXRfaWRdLnNlY3Rvcl9jb3VudCkgLSAxKTsKKwljYXAubGVuID0gY3B1X3RvX2JlMzIoKHVpbnQzMl90KSBJUFNfQkxLU0laRSk7CisKKwlpcHNfc2NtZF9idWZfd3JpdGUoc2NiLT5zY3NpX2NtZCwgJmNhcCwgc2l6ZW9mIChjYXApKTsKKworCXJldHVybiAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19tc2Vuc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgU2ltdWxhdGUgYSBtb2RlIHNlbnNlIGNvbW1hbmQgdG8gYSBsb2dpY2FsIGRyaXZlICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19tc2Vuc2UoaXBzX2hhX3QgKiBoYSwgaXBzX3NjYl90ICogc2NiKQoreworCXVpbnQxNl90IGhlYWRzOworCXVpbnQxNl90IHNlY3RvcnM7CisJdWludDMyX3QgY3lsaW5kZXJzOworCUlQU19TQ1NJX01PREVfUEFHRV9EQVRBIG1kYXRhOworCisJTUVUSE9EX1RSQUNFKCJpcHNfbXNlbnNlIiwgMSk7CisKKwlpZiAobGUzMl90b19jcHUoaGEtPmVucS0+dWxEcml2ZVNpemVbc2NiLT50YXJnZXRfaWRdKSA+IDB4NDAwMDAwICYmCisJICAgIChoYS0+ZW5xLT51Y01pc2NGbGFnICYgMHg4KSA9PSAwKSB7CisJCWhlYWRzID0gSVBTX05PUk1fSEVBRFM7CisJCXNlY3RvcnMgPSBJUFNfTk9STV9TRUNUT1JTOworCX0gZWxzZSB7CisJCWhlYWRzID0gSVBTX0NPTVBfSEVBRFM7CisJCXNlY3RvcnMgPSBJUFNfQ09NUF9TRUNUT1JTOworCX0KKworCWN5bGluZGVycyA9CisJICAgIChsZTMyX3RvX2NwdShoYS0+ZW5xLT51bERyaXZlU2l6ZVtzY2ItPnRhcmdldF9pZF0pIC0KKwkgICAgIDEpIC8gKGhlYWRzICogc2VjdG9ycyk7CisKKwltZW1zZXQoJm1kYXRhLCAwLCBzaXplb2YgKElQU19TQ1NJX01PREVfUEFHRV9EQVRBKSk7CisKKwltZGF0YS5oZHIuQmxvY2tEZXNjTGVuZ3RoID0gODsKKworCXN3aXRjaCAoc2NiLT5zY3NpX2NtZC0+Y21uZFsyXSAmIDB4M2YpIHsKKwljYXNlIDB4MDM6CQkvKiBwYWdlIDMgKi8KKwkJbWRhdGEucGRhdGEucGczLlBhZ2VDb2RlID0gMzsKKwkJbWRhdGEucGRhdGEucGczLlBhZ2VMZW5ndGggPSBzaXplb2YgKElQU19TQ1NJX01PREVfUEFHRTMpOworCQltZGF0YS5oZHIuRGF0YUxlbmd0aCA9CisJCSAgICAzICsgbWRhdGEuaGRyLkJsb2NrRGVzY0xlbmd0aCArIG1kYXRhLnBkYXRhLnBnMy5QYWdlTGVuZ3RoOworCQltZGF0YS5wZGF0YS5wZzMuVHJhY2tzUGVyWm9uZSA9IDA7CisJCW1kYXRhLnBkYXRhLnBnMy5BbHRTZWN0b3JzUGVyWm9uZSA9IDA7CisJCW1kYXRhLnBkYXRhLnBnMy5BbHRUcmFja3NQZXJab25lID0gMDsKKwkJbWRhdGEucGRhdGEucGczLkFsdFRyYWNrc1BlclZvbHVtZSA9IDA7CisJCW1kYXRhLnBkYXRhLnBnMy5TZWN0b3JzUGVyVHJhY2sgPSBjcHVfdG9fYmUxNihzZWN0b3JzKTsKKwkJbWRhdGEucGRhdGEucGczLkJ5dGVzUGVyU2VjdG9yID0gY3B1X3RvX2JlMTYoSVBTX0JMS1NJWkUpOworCQltZGF0YS5wZGF0YS5wZzMuSW50ZXJsZWF2ZSA9IGNwdV90b19iZTE2KDEpOworCQltZGF0YS5wZGF0YS5wZzMuVHJhY2tTa2V3ID0gMDsKKwkJbWRhdGEucGRhdGEucGczLkN5bGluZGVyU2tldyA9IDA7CisJCW1kYXRhLnBkYXRhLnBnMy5mbGFncyA9IElQU19TQ1NJX01QM19Tb2Z0U2VjdG9yOworCQlicmVhazsKKworCWNhc2UgMHg0OgorCQltZGF0YS5wZGF0YS5wZzQuUGFnZUNvZGUgPSA0OworCQltZGF0YS5wZGF0YS5wZzQuUGFnZUxlbmd0aCA9IHNpemVvZiAoSVBTX1NDU0lfTU9ERV9QQUdFNCk7CisJCW1kYXRhLmhkci5EYXRhTGVuZ3RoID0KKwkJICAgIDMgKyBtZGF0YS5oZHIuQmxvY2tEZXNjTGVuZ3RoICsgbWRhdGEucGRhdGEucGc0LlBhZ2VMZW5ndGg7CisJCW1kYXRhLnBkYXRhLnBnNC5DeWxpbmRlcnNIaWdoID0KKwkJICAgIGNwdV90b19iZTE2KChjeWxpbmRlcnMgPj4gOCkgJiAweEZGRkYpOworCQltZGF0YS5wZGF0YS5wZzQuQ3lsaW5kZXJzTG93ID0gKGN5bGluZGVycyAmIDB4RkYpOworCQltZGF0YS5wZGF0YS5wZzQuSGVhZHMgPSBoZWFkczsKKwkJbWRhdGEucGRhdGEucGc0LldyaXRlUHJlY29tcEhpZ2ggPSAwOworCQltZGF0YS5wZGF0YS5wZzQuV3JpdGVQcmVjb21wTG93ID0gMDsKKwkJbWRhdGEucGRhdGEucGc0LlJlZHVjZWRXcml0ZUN1cnJlbnRIaWdoID0gMDsKKwkJbWRhdGEucGRhdGEucGc0LlJlZHVjZWRXcml0ZUN1cnJlbnRMb3cgPSAwOworCQltZGF0YS5wZGF0YS5wZzQuU3RlcFJhdGUgPSBjcHVfdG9fYmUxNigxKTsKKwkJbWRhdGEucGRhdGEucGc0LkxhbmRpbmdab25lSGlnaCA9IDA7CisJCW1kYXRhLnBkYXRhLnBnNC5MYW5kaW5nWm9uZUxvdyA9IDA7CisJCW1kYXRhLnBkYXRhLnBnNC5mbGFncyA9IDA7CisJCW1kYXRhLnBkYXRhLnBnNC5Sb3RhdGlvbmFsT2Zmc2V0ID0gMDsKKwkJbWRhdGEucGRhdGEucGc0Lk1lZGl1bVJvdGF0aW9uUmF0ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgMHg4OgorCQltZGF0YS5wZGF0YS5wZzguUGFnZUNvZGUgPSA4OworCQltZGF0YS5wZGF0YS5wZzguUGFnZUxlbmd0aCA9IHNpemVvZiAoSVBTX1NDU0lfTU9ERV9QQUdFOCk7CisJCW1kYXRhLmhkci5EYXRhTGVuZ3RoID0KKwkJICAgIDMgKyBtZGF0YS5oZHIuQmxvY2tEZXNjTGVuZ3RoICsgbWRhdGEucGRhdGEucGc4LlBhZ2VMZW5ndGg7CisJCS8qIGV2ZXJ5dGhpbmcgZWxzZSBpcyBsZWZ0IHNldCB0byAwICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuICgwKTsKKwl9CQkJLyogZW5kIHN3aXRjaCAqLworCisJaXBzX3NjbWRfYnVmX3dyaXRlKHNjYi0+c2NzaV9jbWQsICZtZGF0YSwgc2l6ZW9mIChtZGF0YSkpOworCisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3JlcXNlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBTaW11bGF0ZSBhIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZCB0byBhIGxvZ2ljYWwgZHJpdmUgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX3JlcXNlbihpcHNfaGFfdCAqIGhhLCBpcHNfc2NiX3QgKiBzY2IpCit7CisJSVBTX1NDU0lfUkVRU0VOIHJlcXNlbjsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3JlcXNlbiIsIDEpOworCisJbWVtc2V0KCZyZXFzZW4sIDAsIHNpemVvZiAoSVBTX1NDU0lfUkVRU0VOKSk7CisKKwlyZXFzZW4uUmVzcG9uc2VDb2RlID0KKwkgICAgSVBTX1NDU0lfUkVRU0VOX1ZBTElEIHwgSVBTX1NDU0lfUkVRU0VOX0NVUlJFTlRfRVJSOworCXJlcXNlbi5BZGRpdGlvbmFsTGVuZ3RoID0gMTA7CisJcmVxc2VuLkFkZGl0aW9uYWxTZW5zZUNvZGUgPSBJUFNfU0NTSV9SRVFTRU5fTk9fU0VOU0U7CisJcmVxc2VuLkFkZGl0aW9uYWxTZW5zZUNvZGVRdWFsID0gSVBTX1NDU0lfUkVRU0VOX05PX1NFTlNFOworCisJaXBzX3NjbWRfYnVmX3dyaXRlKHNjYi0+c2NzaV9jbWQsICZyZXFzZW4sIHNpemVvZiAocmVxc2VuKSk7CisKKwlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEZyZWUgYW55IGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhpcyBjb250cm9sbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX2ZyZWUoaXBzX2hhX3QgKiBoYSkKK3sKKworCU1FVEhPRF9UUkFDRSgiaXBzX2ZyZWUiLCAxKTsKKworCWlmIChoYSkgeworCQlpZiAoaGEtPmVucSkgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChoYS0+cGNpZGV2LCBzaXplb2YoSVBTX0VOUSksCisJCQkJCSAgICBoYS0+ZW5xLCBoYS0+ZW5xX2J1c2FkZHIpOworCQkJaGEtPmVucSA9IE5VTEw7CisJCX0KKworCQlpZiAoaGEtPmNvbmYpIHsKKwkJCWtmcmVlKGhhLT5jb25mKTsKKwkJCWhhLT5jb25mID0gTlVMTDsKKwkJfQorCisJCWlmIChoYS0+YWRhcHQpIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBjaWRldiwKKwkJCQkJICAgIHNpemVvZiAoSVBTX0FEQVBURVIpICsKKwkJCQkJICAgIHNpemVvZiAoSVBTX0lPX0NNRCksIGhhLT5hZGFwdCwKKwkJCQkJICAgIGhhLT5hZGFwdC0+aHdfc3RhdHVzX3N0YXJ0KTsKKwkJCWhhLT5hZGFwdCA9IE5VTEw7CisJCX0KKworCQlpZiAoaGEtPmxvZ2ljYWxfZHJpdmVfaW5mbykgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChoYS0+cGNpZGV2LAorCQkJCQkgICAgc2l6ZW9mIChJUFNfTERfSU5GTyksCisJCQkJCSAgICBoYS0+bG9naWNhbF9kcml2ZV9pbmZvLAorCQkJCQkgICAgaGEtPmxvZ2ljYWxfZHJpdmVfaW5mb19kbWFfYWRkcik7CisJCQloYS0+bG9naWNhbF9kcml2ZV9pbmZvID0gTlVMTDsKKwkJfQorCisJCWlmIChoYS0+bnZyYW0pIHsKKwkJCWtmcmVlKGhhLT5udnJhbSk7CisJCQloYS0+bnZyYW0gPSBOVUxMOworCQl9CisKKwkJaWYgKGhhLT5zdWJzeXMpIHsKKwkJCWtmcmVlKGhhLT5zdWJzeXMpOworCQkJaGEtPnN1YnN5cyA9IE5VTEw7CisJCX0KKworCQlpZiAoaGEtPmlvY3RsX2RhdGEpIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBjaWRldiwgaGEtPmlvY3RsX2xlbiwKKwkJCQkJICAgIGhhLT5pb2N0bF9kYXRhLCBoYS0+aW9jdGxfYnVzYWRkcik7CisJCQloYS0+aW9jdGxfZGF0YSA9IE5VTEw7CisJCQloYS0+aW9jdGxfZGF0YXNpemUgPSAwOworCQkJaGEtPmlvY3RsX2xlbiA9IDA7CisJCX0KKwkJaXBzX2RlYWxsb2NhdGVzY2JzKGhhLCBoYS0+bWF4X2NtZHMpOworCisJCS8qIGZyZWUgbWVtb3J5IG1hcHBlZCAoaWYgYXBwbGljYWJsZSkgKi8KKwkJaWYgKGhhLT5tZW1fcHRyKSB7CisJCQlpb3VubWFwKGhhLT5pb3JlbWFwX3B0cik7CisJCQloYS0+aW9yZW1hcF9wdHIgPSBOVUxMOworCQkJaGEtPm1lbV9wdHIgPSBOVUxMOworCQl9CisKKwkJaWYgKGhhLT5tZW1fYWRkcikKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbihoYS0+bWVtX2FkZHIsIGhhLT5tZW1fbGVuKTsKKwkJaGEtPm1lbV9hZGRyID0gMDsKKworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2RlYWxsb2NhdGVzY2JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBGcmVlIHRoZSBjb21tYW5kIGJsb2NrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2RlYWxsb2NhdGVzY2JzKGlwc19oYV90ICogaGEsIGludCBjbWRzKQoreworCWlmIChoYS0+c2NicykgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wY2lkZXYsCisJCQkJICAgIElQU19TR0xJU1RfU0laRShoYSkgKiBJUFNfTUFYX1NHICogY21kcywKKwkJCQkgICAgaGEtPnNjYnMtPnNnX2xpc3QubGlzdCwKKwkJCQkgICAgaGEtPnNjYnMtPnNnX2J1c2FkZHIpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wY2lkZXYsIHNpemVvZiAoaXBzX3NjYl90KSAqIGNtZHMsCisJCQkJICAgIGhhLT5zY2JzLCBoYS0+c2Nicy0+c2NiX2J1c2FkZHIpOworCQloYS0+c2NicyA9IE5VTEw7CisJfQkJCS8qIGVuZCBpZiAqLworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfYWxsb2NhdGVzY2JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEFsbG9jYXRlIHRoZSBjb21tYW5kIGJsb2NrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfYWxsb2NhdGVzY2JzKGlwc19oYV90ICogaGEpCit7CisJaXBzX3NjYl90ICpzY2JfcDsKKwlJUFNfU0dfTElTVCBpcHNfc2c7CisJaW50IGk7CisJZG1hX2FkZHJfdCBjb21tYW5kX2RtYSwgc2dfZG1hOworCisJTUVUSE9EX1RSQUNFKCJpcHNfYWxsb2NhdGVzY2JzIiwgMSk7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBTQ0JzICovCisJaGEtPnNjYnMgPQorCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChoYS0+cGNpZGV2LCBoYS0+bWF4X2NtZHMgKiBzaXplb2YgKGlwc19zY2JfdCksCisJCQkJICZjb21tYW5kX2RtYSk7CisJaWYgKGhhLT5zY2JzID09IE5VTEwpCisJCXJldHVybiAwOworCWlwc19zZy5saXN0ID0KKwkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGEtPnBjaWRldiwKKwkJCQkgSVBTX1NHTElTVF9TSVpFKGhhKSAqIElQU19NQVhfU0cgKgorCQkJCSBoYS0+bWF4X2NtZHMsICZzZ19kbWEpOworCWlmIChpcHNfc2cubGlzdCA9PSBOVUxMKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBjaWRldiwKKwkJCQkgICAgaGEtPm1heF9jbWRzICogc2l6ZW9mIChpcHNfc2NiX3QpLCBoYS0+c2NicywKKwkJCQkgICAgY29tbWFuZF9kbWEpOworCQlyZXR1cm4gMDsKKwl9CisKKwltZW1zZXQoaGEtPnNjYnMsIDAsIGhhLT5tYXhfY21kcyAqIHNpemVvZiAoaXBzX3NjYl90KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaGEtPm1heF9jbWRzOyBpKyspIHsKKwkJc2NiX3AgPSAmaGEtPnNjYnNbaV07CisJCXNjYl9wLT5zY2JfYnVzYWRkciA9IGNvbW1hbmRfZG1hICsgc2l6ZW9mIChpcHNfc2NiX3QpICogaTsKKwkJLyogc2V0IHVwIFMvRyBsaXN0ICovCisJCWlmIChJUFNfVVNFX0VOSF9TR0xJU1QoaGEpKSB7CisJCQlzY2JfcC0+c2dfbGlzdC5lbmhfbGlzdCA9CisJCQkgICAgaXBzX3NnLmVuaF9saXN0ICsgaSAqIElQU19NQVhfU0c7CisJCQlzY2JfcC0+c2dfYnVzYWRkciA9CisJCQkgICAgc2dfZG1hICsgSVBTX1NHTElTVF9TSVpFKGhhKSAqIElQU19NQVhfU0cgKiBpOworCQl9IGVsc2UgeworCQkJc2NiX3AtPnNnX2xpc3Quc3RkX2xpc3QgPQorCQkJICAgIGlwc19zZy5zdGRfbGlzdCArIGkgKiBJUFNfTUFYX1NHOworCQkJc2NiX3AtPnNnX2J1c2FkZHIgPQorCQkJICAgIHNnX2RtYSArIElQU19TR0xJU1RfU0laRShoYSkgKiBJUFNfTUFYX1NHICogaTsKKwkJfQorCisJCS8qIGFkZCB0byB0aGUgZnJlZSBsaXN0ICovCisJCWlmIChpIDwgaGEtPm1heF9jbWRzIC0gMSkgeworCQkJc2NiX3AtPnFfbmV4dCA9IGhhLT5zY2JfZnJlZWxpc3Q7CisJCQloYS0+c2NiX2ZyZWVsaXN0ID0gc2NiX3A7CisJCX0KKwl9CisKKwkvKiBzdWNjZXNzICovCisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2luaXRfc2NiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBJbml0aWFsaXplIGEgQ0NCIHRvIGRlZmF1bHQgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19pbml0X3NjYihpcHNfaGFfdCAqIGhhLCBpcHNfc2NiX3QgKiBzY2IpCit7CisJSVBTX1NHX0xJU1Qgc2dfbGlzdDsKKwl1aW50MzJfdCBjbWRfYnVzYWRkciwgc2dfYnVzYWRkcjsKKwlNRVRIT0RfVFJBQ0UoImlwc19pbml0X3NjYiIsIDEpOworCisJaWYgKHNjYiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzZ19saXN0Lmxpc3QgPSBzY2ItPnNnX2xpc3QubGlzdDsKKwljbWRfYnVzYWRkciA9IHNjYi0+c2NiX2J1c2FkZHI7CisJc2dfYnVzYWRkciA9IHNjYi0+c2dfYnVzYWRkcjsKKwkvKiB6ZXJvIGZpbGwgKi8KKwltZW1zZXQoc2NiLCAwLCBzaXplb2YgKGlwc19zY2JfdCkpOworCW1lbXNldChoYS0+ZHVtbXksIDAsIHNpemVvZiAoSVBTX0lPX0NNRCkpOworCisJLyogSW5pdGlhbGl6ZSBkdW1teSBjb21tYW5kIGJ1Y2tldCAqLworCWhhLT5kdW1teS0+b3BfY29kZSA9IDB4RkY7CisJaGEtPmR1bW15LT5jY3NhciA9IGNwdV90b19sZTMyKGhhLT5hZGFwdC0+aHdfc3RhdHVzX3N0YXJ0CisJCQkJICAgICAgICsgc2l6ZW9mIChJUFNfQURBUFRFUikpOworCWhhLT5kdW1teS0+Y29tbWFuZF9pZCA9IElQU19NQVhfQ01EUzsKKworCS8qIHNldCBidXMgYWRkcmVzcyBvZiBzY2IgKi8KKwlzY2ItPnNjYl9idXNhZGRyID0gY21kX2J1c2FkZHI7CisJc2NiLT5zZ19idXNhZGRyID0gc2dfYnVzYWRkcjsKKwlzY2ItPnNnX2xpc3QubGlzdCA9IHNnX2xpc3QubGlzdDsKKworCS8qIE5lcHR1bmUgRml4ICovCisJc2NiLT5jbWQuYmFzaWNfaW8uY2NjciA9IGNwdV90b19sZTMyKCh1aW50MzJfdCkgSVBTX0JJVF9JTEUpOworCXNjYi0+Y21kLmJhc2ljX2lvLmNjc2FyID0gY3B1X3RvX2xlMzIoaGEtPmFkYXB0LT5od19zdGF0dXNfc3RhcnQKKwkJCQkJICAgICAgKyBzaXplb2YgKElQU19BREFQVEVSKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19nZXRfc2NiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgSW5pdGlhbGl6ZSBhIENDQiB0byBkZWZhdWx0IHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBU1NVTUVEIHRvIGJlIGNhbGxsZWQgZnJvbSB3aXRoaW4gYSBsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaXBzX3NjYl90ICoKK2lwc19nZXRzY2IoaXBzX2hhX3QgKiBoYSkKK3sKKwlpcHNfc2NiX3QgKnNjYjsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2dldHNjYiIsIDEpOworCisJaWYgKChzY2IgPSBoYS0+c2NiX2ZyZWVsaXN0KSA9PSBOVUxMKSB7CisKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwloYS0+c2NiX2ZyZWVsaXN0ID0gc2NiLT5xX25leHQ7CisJc2NiLT5mbGFncyA9IDA7CisJc2NiLT5xX25leHQgPSBOVUxMOworCisJaXBzX2luaXRfc2NiKGhhLCBzY2IpOworCisJcmV0dXJuIChzY2IpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfZnJlZV9zY2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJldHVybiBhbiB1bnVzZWQgQ0NCIGJhY2sgdG8gdGhlIGZyZWUgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQVNTVU1FRCB0byBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19mcmVlc2NiKGlwc19oYV90ICogaGEsIGlwc19zY2JfdCAqIHNjYikKK3sKKworCU1FVEhPRF9UUkFDRSgiaXBzX2ZyZWVzY2IiLCAxKTsKKwlpZiAoc2NiLT5mbGFncyAmIElQU19TQ0JfTUFQX1NHKQorCQlwY2lfdW5tYXBfc2coaGEtPnBjaWRldiwgc2NiLT5zY3NpX2NtZC0+cmVxdWVzdF9idWZmZXIsCisJCQkgICAgIHNjYi0+c2NzaV9jbWQtPnVzZV9zZywgSVBTX0RNQV9ESVIoc2NiKSk7CisJZWxzZSBpZiAoc2NiLT5mbGFncyAmIElQU19TQ0JfTUFQX1NJTkdMRSkKKwkJcGNpX3VubWFwX3NpbmdsZShoYS0+cGNpZGV2LCBzY2ItPmRhdGFfYnVzYWRkciwgc2NiLT5kYXRhX2xlbiwKKwkJCQkgSVBTX0RNQV9ESVIoc2NiKSk7CisKKwkvKiBjaGVjayB0byBtYWtlIHN1cmUgdGhpcyBpcyBub3Qgb3VyICJzcGVjaWFsIiBzY2IgKi8KKwlpZiAoSVBTX0NPTU1BTkRfSUQoaGEsIHNjYikgPCAoaGEtPm1heF9jbWRzIC0gMSkpIHsKKwkJc2NiLT5xX25leHQgPSBoYS0+c2NiX2ZyZWVsaXN0OworCQloYS0+c2NiX2ZyZWVsaXN0ID0gc2NiOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2lzaW5pdF9jb3BwZXJoZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBJcyBjb250cm9sbGVyIGluaXRpYWxpemVkID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2lzaW5pdF9jb3BwZXJoZWFkKGlwc19oYV90ICogaGEpCit7CisJdWludDhfdCBzY3ByOworCXVpbnQ4X3QgaXNyOworCisJTUVUSE9EX1RSQUNFKCJpcHNfaXNpbml0X2NvcHBlcmhlYWQiLCAxKTsKKworCWlzciA9IGluYihoYS0+aW9fYWRkciArIElQU19SRUdfSElTUik7CisJc2NwciA9IGluYihoYS0+aW9fYWRkciArIElQU19SRUdfU0NQUik7CisKKwlpZiAoKChpc3IgJiBJUFNfQklUX0VJKSA9PSAwKSAmJiAoKHNjcHIgJiBJUFNfQklUX0VCTSkgPT0gMCkpCisJCXJldHVybiAoMCk7CisJZWxzZQorCQlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfaXNpbml0X2NvcHBlcmhlYWRfbWVtaW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIElzIGNvbnRyb2xsZXIgaW5pdGlhbGl6ZWQgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfaXNpbml0X2NvcHBlcmhlYWRfbWVtaW8oaXBzX2hhX3QgKiBoYSkKK3sKKwl1aW50OF90IGlzciA9IDA7CisJdWludDhfdCBzY3ByOworCisJTUVUSE9EX1RSQUNFKCJpcHNfaXNfaW5pdF9jb3BwZXJoZWFkX21lbWlvIiwgMSk7CisKKwlpc3IgPSByZWFkYihoYS0+bWVtX3B0ciArIElQU19SRUdfSElTUik7CisJc2NwciA9IHJlYWRiKGhhLT5tZW1fcHRyICsgSVBTX1JFR19TQ1BSKTsKKworCWlmICgoKGlzciAmIElQU19CSVRfRUkpID09IDApICYmICgoc2NwciAmIElQU19CSVRfRUJNKSA9PSAwKSkKKwkJcmV0dXJuICgwKTsKKwllbHNlCisJCXJldHVybiAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19pc2luaXRfbW9ycGhldXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgSXMgY29udHJvbGxlciBpbml0aWFsaXplZCA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19pc2luaXRfbW9ycGhldXMoaXBzX2hhX3QgKiBoYSkKK3sKKwl1aW50MzJfdCBwb3N0OworCXVpbnQzMl90IGJpdHM7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19pc19pbml0X21vcnBoZXVzIiwgMSk7CisKKwlwb3N0ID0gcmVhZGwoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0k5NjBfTVNHMCk7CisJYml0cyA9IHJlYWRsKGhhLT5tZW1fcHRyICsgSVBTX1JFR19JMk9fSElSKTsKKworCWlmIChwb3N0ID09IDApCisJCXJldHVybiAoMCk7CisJZWxzZSBpZiAoYml0cyAmIDB4MykKKwkJcmV0dXJuICgwKTsKKwllbHNlCisJCXJldHVybiAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19lbmFibGVfaW50X2NvcHBlcmhlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFR1cm4gb24gaW50ZXJydXB0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX2VuYWJsZV9pbnRfY29wcGVyaGVhZChpcHNfaGFfdCAqIGhhKQoreworCU1FVEhPRF9UUkFDRSgiaXBzX2VuYWJsZV9pbnRfY29wcGVyaGVhZCIsIDEpOworCisJb3V0YihoYS0+aW9fYWRkciArIElQU19SRUdfSElTUiwgSVBTX0JJVF9FSSk7CisJaW5iKGhhLT5pb19hZGRyICsgSVBTX1JFR19ISVNSKTsJLypFbnN1cmUgUENJIFBvc3RpbmcgQ29tcGxldGVzKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2VuYWJsZV9pbnRfY29wcGVyaGVhZF9tZW1pbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVHVybiBvbiBpbnRlcnJ1cHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcHNfZW5hYmxlX2ludF9jb3BwZXJoZWFkX21lbWlvKGlwc19oYV90ICogaGEpCit7CisJTUVUSE9EX1RSQUNFKCJpcHNfZW5hYmxlX2ludF9jb3BwZXJoZWFkX21lbWlvIiwgMSk7CisKKwl3cml0ZWIoSVBTX0JJVF9FSSwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0hJU1IpOworCXJlYWRiKGhhLT5tZW1fcHRyICsgSVBTX1JFR19ISVNSKTsJLypFbnN1cmUgUENJIFBvc3RpbmcgQ29tcGxldGVzKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2VuYWJsZV9pbnRfbW9ycGhldXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVHVybiBvbiBpbnRlcnJ1cHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcHNfZW5hYmxlX2ludF9tb3JwaGV1cyhpcHNfaGFfdCAqIGhhKQoreworCXVpbnQzMl90IE9pbXI7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19lbmFibGVfaW50X21vcnBoZXVzIiwgMSk7CisKKwlPaW1yID0gcmVhZGwoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0k5NjBfT0lNUik7CisJT2ltciAmPSB+MHgwODsKKwl3cml0ZWwoT2ltciwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0k5NjBfT0lNUik7CisJcmVhZGwoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0k5NjBfT0lNUik7CS8qRW5zdXJlIFBDSSBQb3N0aW5nIENvbXBsZXRlcyovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19pbml0X2NvcHBlcmhlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgSW5pdGlhbGl6ZSBhIGNvcHBlcmhlYWQgY29udHJvbGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19pbml0X2NvcHBlcmhlYWQoaXBzX2hhX3QgKiBoYSkKK3sKKwl1aW50OF90IElzcjsKKwl1aW50OF90IENic3A7CisJdWludDhfdCBQb3N0Qnl0ZVtJUFNfTUFYX1BPU1RfQllURVNdOworCXVpbnQ4X3QgQ29uZmlnQnl0ZVtJUFNfTUFYX0NPTkZJR19CWVRFU107CisJaW50IGksIGo7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19pbml0X2NvcHBlcmhlYWQiLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBJUFNfTUFYX1BPU1RfQllURVM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgNDU7IGorKykgeworCQkJSXNyID0gaW5iKGhhLT5pb19hZGRyICsgSVBTX1JFR19ISVNSKTsKKwkJCWlmIChJc3IgJiBJUFNfQklUX0dISSkKKwkJCQlicmVhazsKKworCQkJLyogRGVsYXkgZm9yIDEgU2Vjb25kICovCisJCQlNREVMQVkoSVBTX09ORV9TRUMpOworCQl9CisKKwkJaWYgKGogPj0gNDUpCisJCQkvKiBlcnJvciBvY2N1cnJlZCAqLworCQkJcmV0dXJuICgwKTsKKworCQlQb3N0Qnl0ZVtpXSA9IGluYihoYS0+aW9fYWRkciArIElQU19SRUdfSVNQUik7CisJCW91dGIoSXNyLCBoYS0+aW9fYWRkciArIElQU19SRUdfSElTUik7CisJfQorCisJaWYgKFBvc3RCeXRlWzBdIDwgSVBTX0dPT0RfUE9TVF9TVEFUVVMpIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkgICAicmVzZXQgY29udHJvbGxlciBmYWlscyAocG9zdCBzdGF0dXMgJXggJXgpLlxuIiwKKwkJCSAgIFBvc3RCeXRlWzBdLCBQb3N0Qnl0ZVsxXSk7CisKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgSVBTX01BWF9DT05GSUdfQllURVM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgMjQwOyBqKyspIHsKKwkJCUlzciA9IGluYihoYS0+aW9fYWRkciArIElQU19SRUdfSElTUik7CisJCQlpZiAoSXNyICYgSVBTX0JJVF9HSEkpCisJCQkJYnJlYWs7CisKKwkJCS8qIERlbGF5IGZvciAxIFNlY29uZCAqLworCQkJTURFTEFZKElQU19PTkVfU0VDKTsKKwkJfQorCisJCWlmIChqID49IDI0MCkKKwkJCS8qIGVycm9yIG9jY3VycmVkICovCisJCQlyZXR1cm4gKDApOworCisJCUNvbmZpZ0J5dGVbaV0gPSBpbmIoaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0lTUFIpOworCQlvdXRiKElzciwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0hJU1IpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAyNDA7IGkrKykgeworCQlDYnNwID0gaW5iKGhhLT5pb19hZGRyICsgSVBTX1JFR19DQlNQKTsKKworCQlpZiAoKENic3AgJiBJUFNfQklUX09QKSA9PSAwKQorCQkJYnJlYWs7CisKKwkJLyogRGVsYXkgZm9yIDEgU2Vjb25kICovCisJCU1ERUxBWShJUFNfT05FX1NFQyk7CisJfQorCisJaWYgKGkgPj0gMjQwKQorCQkvKiByZXNldCBmYWlsZWQgKi8KKwkJcmV0dXJuICgwKTsKKworCS8qIHNldHVwIENDQ1IgKi8KKwlvdXRsKGNwdV90b19sZTMyKDB4MTAxMCksIGhhLT5pb19hZGRyICsgSVBTX1JFR19DQ0NSKTsKKworCS8qIEVuYWJsZSBidXNtYXN0ZXJpbmcgKi8KKwlvdXRiKElQU19CSVRfRUJNLCBoYS0+aW9fYWRkciArIElQU19SRUdfU0NQUik7CisKKwlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQkvKiBmaXggZm9yIGFuYWNvbmRhNjQgKi8KKwkJb3V0bCgwLCBoYS0+aW9fYWRkciArIElQU19SRUdfTkRBRSk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyAqLworCW91dGIoSVBTX0JJVF9FSSwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0hJU1IpOworCisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2luaXRfY29wcGVyaGVhZF9tZW1pbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBJbml0aWFsaXplIGEgY29wcGVyaGVhZCBjb250cm9sbGVyIHdpdGggbWVtb3J5IG1hcHBlZCBJL08gICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2luaXRfY29wcGVyaGVhZF9tZW1pbyhpcHNfaGFfdCAqIGhhKQoreworCXVpbnQ4X3QgSXNyID0gMDsKKwl1aW50OF90IENic3A7CisJdWludDhfdCBQb3N0Qnl0ZVtJUFNfTUFYX1BPU1RfQllURVNdOworCXVpbnQ4X3QgQ29uZmlnQnl0ZVtJUFNfTUFYX0NPTkZJR19CWVRFU107CisJaW50IGksIGo7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19pbml0X2NvcHBlcmhlYWRfbWVtaW8iLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBJUFNfTUFYX1BPU1RfQllURVM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgNDU7IGorKykgeworCQkJSXNyID0gcmVhZGIoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0hJU1IpOworCQkJaWYgKElzciAmIElQU19CSVRfR0hJKQorCQkJCWJyZWFrOworCisJCQkvKiBEZWxheSBmb3IgMSBTZWNvbmQgKi8KKwkJCU1ERUxBWShJUFNfT05FX1NFQyk7CisJCX0KKworCQlpZiAoaiA+PSA0NSkKKwkJCS8qIGVycm9yIG9jY3VycmVkICovCisJCQlyZXR1cm4gKDApOworCisJCVBvc3RCeXRlW2ldID0gcmVhZGIoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0lTUFIpOworCQl3cml0ZWIoSXNyLCBoYS0+bWVtX3B0ciArIElQU19SRUdfSElTUik7CisJfQorCisJaWYgKFBvc3RCeXRlWzBdIDwgSVBTX0dPT0RfUE9TVF9TVEFUVVMpIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkgICAicmVzZXQgY29udHJvbGxlciBmYWlscyAocG9zdCBzdGF0dXMgJXggJXgpLlxuIiwKKwkJCSAgIFBvc3RCeXRlWzBdLCBQb3N0Qnl0ZVsxXSk7CisKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgSVBTX01BWF9DT05GSUdfQllURVM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgMjQwOyBqKyspIHsKKwkJCUlzciA9IHJlYWRiKGhhLT5tZW1fcHRyICsgSVBTX1JFR19ISVNSKTsKKwkJCWlmIChJc3IgJiBJUFNfQklUX0dISSkKKwkJCQlicmVhazsKKworCQkJLyogRGVsYXkgZm9yIDEgU2Vjb25kICovCisJCQlNREVMQVkoSVBTX09ORV9TRUMpOworCQl9CisKKwkJaWYgKGogPj0gMjQwKQorCQkJLyogZXJyb3Igb2NjdXJyZWQgKi8KKwkJCXJldHVybiAoMCk7CisKKwkJQ29uZmlnQnl0ZVtpXSA9IHJlYWRiKGhhLT5tZW1fcHRyICsgSVBTX1JFR19JU1BSKTsKKwkJd3JpdGViKElzciwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0hJU1IpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAyNDA7IGkrKykgeworCQlDYnNwID0gcmVhZGIoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0NCU1ApOworCisJCWlmICgoQ2JzcCAmIElQU19CSVRfT1ApID09IDApCisJCQlicmVhazsKKworCQkvKiBEZWxheSBmb3IgMSBTZWNvbmQgKi8KKwkJTURFTEFZKElQU19PTkVfU0VDKTsKKwl9CisKKwlpZiAoaSA+PSAyNDApCisJCS8qIGVycm9yIG9jY3VycmVkICovCisJCXJldHVybiAoMCk7CisKKwkvKiBzZXR1cCBDQ0NSICovCisJd3JpdGVsKDB4MTAxMCwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0NDQ1IpOworCisJLyogRW5hYmxlIGJ1c21hc3RlcmluZyAqLworCXdyaXRlYihJUFNfQklUX0VCTSwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX1NDUFIpOworCisJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJLyogZml4IGZvciBhbmFjb25kYTY0ICovCisJCXdyaXRlbCgwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfTkRBRSk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyAqLworCXdyaXRlYihJUFNfQklUX0VJLCBoYS0+bWVtX3B0ciArIElQU19SRUdfSElTUik7CisKKwkvKiBpZiB3ZSBnZXQgaGVyZSB0aGVuIGV2ZXJ5dGhpbmcgd2VudCBPSyAqLworCXJldHVybiAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19pbml0X21vcnBoZXVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgSW5pdGlhbGl6ZSBhIG1vcnBoZXVzIGNvbnRyb2xsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19pbml0X21vcnBoZXVzKGlwc19oYV90ICogaGEpCit7CisJdWludDMyX3QgUG9zdDsKKwl1aW50MzJfdCBDb25maWc7CisJdWludDMyX3QgSXNyOworCXVpbnQzMl90IE9pbXI7CisJaW50IGk7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19pbml0X21vcnBoZXVzIiwgMSk7CisKKwkvKiBXYWl0IHVwIHRvIDQ1IHNlY3MgZm9yIFBvc3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDU7IGkrKykgeworCQlJc3IgPSByZWFkbChoYS0+bWVtX3B0ciArIElQU19SRUdfSTJPX0hJUik7CisKKwkJaWYgKElzciAmIElQU19CSVRfSTk2MF9NU0cwSSkKKwkJCWJyZWFrOworCisJCS8qIERlbGF5IGZvciAxIFNlY29uZCAqLworCQlNREVMQVkoSVBTX09ORV9TRUMpOworCX0KKworCWlmIChpID49IDQ1KSB7CisJCS8qIGVycm9yIG9jY3VycmVkICovCisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJICAgInRpbWVvdXQgd2FpdGluZyBmb3IgcG9zdC5cbiIpOworCisJCXJldHVybiAoMCk7CisJfQorCisJUG9zdCA9IHJlYWRsKGhhLT5tZW1fcHRyICsgSVBTX1JFR19JOTYwX01TRzApOworCisJaWYgKFBvc3QgPT0gMHg0RjAwKSB7CS8qIElmIEZsYXNoaW5nIHRoZSBCYXR0ZXJ5IFBJQyAgICAgICAgICovCisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJICAgIkZsYXNoaW5nIEJhdHRlcnkgUElDLCBQbGVhc2Ugd2FpdCAuLi5cbiIpOworCisJCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgYml0ICovCisJCUlzciA9ICh1aW50MzJfdCkgSVBTX0JJVF9JOTYwX01TRzBJOworCQl3cml0ZWwoSXNyLCBoYS0+bWVtX3B0ciArIElQU19SRUdfSTJPX0hJUik7CisKKwkJZm9yIChpID0gMDsgaSA8IDEyMDsgaSsrKSB7CS8qICAgIFdhaXQgVXAgdG8gMiBNaW4uIGZvciBDb21wbGV0aW9uICovCisJCQlQb3N0ID0gcmVhZGwoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0k5NjBfTVNHMCk7CisJCQlpZiAoUG9zdCAhPSAweDRGMDApCisJCQkJYnJlYWs7CisJCQkvKiBEZWxheSBmb3IgMSBTZWNvbmQgKi8KKwkJCU1ERUxBWShJUFNfT05FX1NFQyk7CisJCX0KKworCQlpZiAoaSA+PSAxMjApIHsKKwkJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJCSAgICJ0aW1lb3V0IHdhaXRpbmcgZm9yIEJhdHRlcnkgUElDIEZsYXNoXG4iKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKworCX0KKworCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgYml0ICovCisJSXNyID0gKHVpbnQzMl90KSBJUFNfQklUX0k5NjBfTVNHMEk7CisJd3JpdGVsKElzciwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0kyT19ISVIpOworCisJaWYgKFBvc3QgPCAoSVBTX0dPT0RfUE9TVF9TVEFUVVMgPDwgOCkpIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkgICAicmVzZXQgY29udHJvbGxlciBmYWlscyAocG9zdCBzdGF0dXMgJXgpLlxuIiwgUG9zdCk7CisKKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKiBXYWl0IHVwIHRvIDI0MCBzZWNzIGZvciBjb25maWcgYnl0ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjQwOyBpKyspIHsKKwkJSXNyID0gcmVhZGwoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0kyT19ISVIpOworCisJCWlmIChJc3IgJiBJUFNfQklUX0k5NjBfTVNHMUkpCisJCQlicmVhazsKKworCQkvKiBEZWxheSBmb3IgMSBTZWNvbmQgKi8KKwkJTURFTEFZKElQU19PTkVfU0VDKTsKKwl9CisKKwlpZiAoaSA+PSAyNDApIHsKKwkJLyogZXJyb3Igb2NjdXJyZWQgKi8KKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkgICAidGltZW91dCB3YWl0aW5nIGZvciBjb25maWcuXG4iKTsKKworCQlyZXR1cm4gKDApOworCX0KKworCUNvbmZpZyA9IHJlYWRsKGhhLT5tZW1fcHRyICsgSVBTX1JFR19JOTYwX01TRzEpOworCisJLyogQ2xlYXIgaW50ZXJydXB0IGJpdCAqLworCUlzciA9ICh1aW50MzJfdCkgSVBTX0JJVF9JOTYwX01TRzFJOworCXdyaXRlbChJc3IsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19JMk9fSElSKTsKKworCS8qIFR1cm4gb24gdGhlIGludGVycnVwdHMgKi8KKwlPaW1yID0gcmVhZGwoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0k5NjBfT0lNUik7CisJT2ltciAmPSB+MHg4OworCXdyaXRlbChPaW1yLCBoYS0+bWVtX3B0ciArIElQU19SRUdfSTk2MF9PSU1SKTsKKworCS8qIGlmIHdlIGdldCBoZXJlIHRoZW4gZXZlcnl0aGluZyB3ZW50IE9LICovCisKKwkvKiBTaW5jZSB3ZSBkaWQgYSBSRVNFVCwgYW4gRXJhc2VTdHJpcGVMb2NrIG1heSBiZSBuZWVkZWQgKi8KKwlpZiAoUG9zdCA9PSAweEVGMTApIHsKKwkJaWYgKChDb25maWcgPT0gMHgwMDBGKSB8fCAoQ29uZmlnID09IDB4MDAwOSkpCisJCQloYS0+cmVxdWlyZXNfZXNsID0gMTsKKwl9CisKKwlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcmVzZXRfY29wcGVyaGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJlc2V0IHRoZSBjb250cm9sbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfcmVzZXRfY29wcGVyaGVhZChpcHNfaGFfdCAqIGhhKQoreworCWludCByZXNldF9jb3VudGVyOworCisJTUVUSE9EX1RSQUNFKCJpcHNfcmVzZXRfY29wcGVyaGVhZCIsIDEpOworCisJREVCVUdfVkFSKDEsICIoJXMlZCkgaXBzX3Jlc2V0X2NvcHBlcmhlYWQ6IGlvIGFkZHI6ICV4LCBpcnE6ICVkIiwKKwkJICBpcHNfbmFtZSwgaGEtPmhvc3RfbnVtLCBoYS0+aW9fYWRkciwgaGEtPmlycSk7CisKKwlyZXNldF9jb3VudGVyID0gMDsKKworCXdoaWxlIChyZXNldF9jb3VudGVyIDwgMikgeworCQlyZXNldF9jb3VudGVyKys7CisKKwkJb3V0YihJUFNfQklUX1JTVCwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX1NDUFIpOworCisJCS8qIERlbGF5IGZvciAxIFNlY29uZCAqLworCQlNREVMQVkoSVBTX09ORV9TRUMpOworCisJCW91dGIoMCwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX1NDUFIpOworCisJCS8qIERlbGF5IGZvciAxIFNlY29uZCAqLworCQlNREVMQVkoSVBTX09ORV9TRUMpOworCisJCWlmICgoKmhhLT5mdW5jLmluaXQpIChoYSkpCisJCQlicmVhazsKKwkJZWxzZSBpZiAocmVzZXRfY291bnRlciA+PSAyKSB7CisKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcmVzZXRfY29wcGVyaGVhZF9tZW1pbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJlc2V0IHRoZSBjb250cm9sbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfcmVzZXRfY29wcGVyaGVhZF9tZW1pbyhpcHNfaGFfdCAqIGhhKQoreworCWludCByZXNldF9jb3VudGVyOworCisJTUVUSE9EX1RSQUNFKCJpcHNfcmVzZXRfY29wcGVyaGVhZF9tZW1pbyIsIDEpOworCisJREVCVUdfVkFSKDEsICIoJXMlZCkgaXBzX3Jlc2V0X2NvcHBlcmhlYWRfbWVtaW86IG1lbSBhZGRyOiAleCwgaXJxOiAlZCIsCisJCSAgaXBzX25hbWUsIGhhLT5ob3N0X251bSwgaGEtPm1lbV9hZGRyLCBoYS0+aXJxKTsKKworCXJlc2V0X2NvdW50ZXIgPSAwOworCisJd2hpbGUgKHJlc2V0X2NvdW50ZXIgPCAyKSB7CisJCXJlc2V0X2NvdW50ZXIrKzsKKworCQl3cml0ZWIoSVBTX0JJVF9SU1QsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19TQ1BSKTsKKworCQkvKiBEZWxheSBmb3IgMSBTZWNvbmQgKi8KKwkJTURFTEFZKElQU19PTkVfU0VDKTsKKworCQl3cml0ZWIoMCwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX1NDUFIpOworCisJCS8qIERlbGF5IGZvciAxIFNlY29uZCAqLworCQlNREVMQVkoSVBTX09ORV9TRUMpOworCisJCWlmICgoKmhhLT5mdW5jLmluaXQpIChoYSkpCisJCQlicmVhazsKKwkJZWxzZSBpZiAocmVzZXRfY291bnRlciA+PSAyKSB7CisKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcmVzZXRfbW9ycGhldXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJlc2V0IHRoZSBjb250cm9sbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfcmVzZXRfbW9ycGhldXMoaXBzX2hhX3QgKiBoYSkKK3sKKwlpbnQgcmVzZXRfY291bnRlcjsKKwl1aW50OF90IGp1bms7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19yZXNldF9tb3JwaGV1cyIsIDEpOworCisJREVCVUdfVkFSKDEsICIoJXMlZCkgaXBzX3Jlc2V0X21vcnBoZXVzOiBtZW0gYWRkcjogJXgsIGlycTogJWQiLAorCQkgIGlwc19uYW1lLCBoYS0+aG9zdF9udW0sIGhhLT5tZW1fYWRkciwgaGEtPmlycSk7CisKKwlyZXNldF9jb3VudGVyID0gMDsKKworCXdoaWxlIChyZXNldF9jb3VudGVyIDwgMikgeworCQlyZXNldF9jb3VudGVyKys7CisKKwkJd3JpdGVsKDB4ODAwMDAwMDAsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19JOTYwX0lEUik7CisKKwkJLyogRGVsYXkgZm9yIDUgU2Vjb25kcyAqLworCQlNREVMQVkoNSAqIElQU19PTkVfU0VDKTsKKworCQkvKiBEbyBhIFBDSSBjb25maWcgcmVhZCB0byB3YWl0IGZvciBhZGFwdGVyICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGhhLT5wY2lkZXYsIDQsICZqdW5rKTsKKworCQlpZiAoKCpoYS0+ZnVuYy5pbml0KSAoaGEpKQorCQkJYnJlYWs7CisJCWVsc2UgaWYgKHJlc2V0X2NvdW50ZXIgPj0gMikgeworCisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3N0YXRpbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBJbml0aWFsaXplIHRoZSBzdGF0dXMgcXVldWVzIG9uIHRoZSBjb250cm9sbGVyICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19zdGF0aW5pdChpcHNfaGFfdCAqIGhhKQoreworCXVpbnQzMl90IHBoeXNfc3RhdHVzX3N0YXJ0OworCisJTUVUSE9EX1RSQUNFKCJpcHNfc3RhdGluaXQiLCAxKTsKKworCWhhLT5hZGFwdC0+cF9zdGF0dXNfc3RhcnQgPSBoYS0+YWRhcHQtPnN0YXR1czsKKwloYS0+YWRhcHQtPnBfc3RhdHVzX2VuZCA9IGhhLT5hZGFwdC0+c3RhdHVzICsgSVBTX01BWF9DTURTOworCWhhLT5hZGFwdC0+cF9zdGF0dXNfdGFpbCA9IGhhLT5hZGFwdC0+c3RhdHVzOworCisJcGh5c19zdGF0dXNfc3RhcnQgPSBoYS0+YWRhcHQtPmh3X3N0YXR1c19zdGFydDsKKwlvdXRsKGNwdV90b19sZTMyKHBoeXNfc3RhdHVzX3N0YXJ0KSwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX1NRU1IpOworCW91dGwoY3B1X3RvX2xlMzIocGh5c19zdGF0dXNfc3RhcnQgKyBJUFNfU1RBVFVTX1FfU0laRSksCisJICAgICBoYS0+aW9fYWRkciArIElQU19SRUdfU1FFUik7CisJb3V0bChjcHVfdG9fbGUzMihwaHlzX3N0YXR1c19zdGFydCArIElQU19TVEFUVVNfU0laRSksCisJICAgICBoYS0+aW9fYWRkciArIElQU19SRUdfU1FIUik7CisJb3V0bChjcHVfdG9fbGUzMihwaHlzX3N0YXR1c19zdGFydCksIGhhLT5pb19hZGRyICsgSVBTX1JFR19TUVRSKTsKKworCWhhLT5hZGFwdC0+aHdfc3RhdHVzX3RhaWwgPSBwaHlzX3N0YXR1c19zdGFydDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3N0YXRpbml0X21lbWlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBJbml0aWFsaXplIHRoZSBzdGF0dXMgcXVldWVzIG9uIHRoZSBjb250cm9sbGVyICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19zdGF0aW5pdF9tZW1pbyhpcHNfaGFfdCAqIGhhKQoreworCXVpbnQzMl90IHBoeXNfc3RhdHVzX3N0YXJ0OworCisJTUVUSE9EX1RSQUNFKCJpcHNfc3RhdGluaXRfbWVtaW8iLCAxKTsKKworCWhhLT5hZGFwdC0+cF9zdGF0dXNfc3RhcnQgPSBoYS0+YWRhcHQtPnN0YXR1czsKKwloYS0+YWRhcHQtPnBfc3RhdHVzX2VuZCA9IGhhLT5hZGFwdC0+c3RhdHVzICsgSVBTX01BWF9DTURTOworCWhhLT5hZGFwdC0+cF9zdGF0dXNfdGFpbCA9IGhhLT5hZGFwdC0+c3RhdHVzOworCisJcGh5c19zdGF0dXNfc3RhcnQgPSBoYS0+YWRhcHQtPmh3X3N0YXR1c19zdGFydDsKKwl3cml0ZWwocGh5c19zdGF0dXNfc3RhcnQsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19TUVNSKTsKKwl3cml0ZWwocGh5c19zdGF0dXNfc3RhcnQgKyBJUFNfU1RBVFVTX1FfU0laRSwKKwkgICAgICAgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX1NRRVIpOworCXdyaXRlbChwaHlzX3N0YXR1c19zdGFydCArIElQU19TVEFUVVNfU0laRSwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX1NRSFIpOworCXdyaXRlbChwaHlzX3N0YXR1c19zdGFydCwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX1NRVFIpOworCisJaGEtPmFkYXB0LT5od19zdGF0dXNfdGFpbCA9IHBoeXNfc3RhdHVzX3N0YXJ0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfc3RhdHVwZF9jb3BwZXJoZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJlbW92ZSBhbiBlbGVtZW50IGZyb20gdGhlIHN0YXR1cyBxdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWludDMyX3QKK2lwc19zdGF0dXBkX2NvcHBlcmhlYWQoaXBzX2hhX3QgKiBoYSkKK3sKKwlNRVRIT0RfVFJBQ0UoImlwc19zdGF0dXBkX2NvcHBlcmhlYWQiLCAxKTsKKworCWlmIChoYS0+YWRhcHQtPnBfc3RhdHVzX3RhaWwgIT0gaGEtPmFkYXB0LT5wX3N0YXR1c19lbmQpIHsKKwkJaGEtPmFkYXB0LT5wX3N0YXR1c190YWlsKys7CisJCWhhLT5hZGFwdC0+aHdfc3RhdHVzX3RhaWwgKz0gc2l6ZW9mIChJUFNfU1RBVFVTKTsKKwl9IGVsc2UgeworCQloYS0+YWRhcHQtPnBfc3RhdHVzX3RhaWwgPSBoYS0+YWRhcHQtPnBfc3RhdHVzX3N0YXJ0OworCQloYS0+YWRhcHQtPmh3X3N0YXR1c190YWlsID0gaGEtPmFkYXB0LT5od19zdGF0dXNfc3RhcnQ7CisJfQorCisJb3V0bChjcHVfdG9fbGUzMihoYS0+YWRhcHQtPmh3X3N0YXR1c190YWlsKSwKKwkgICAgIGhhLT5pb19hZGRyICsgSVBTX1JFR19TUVRSKTsKKworCXJldHVybiAoaGEtPmFkYXB0LT5wX3N0YXR1c190YWlsLT52YWx1ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19zdGF0dXBkX2NvcHBlcmhlYWRfbWVtaW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSB0aGUgc3RhdHVzIHF1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1aW50MzJfdAoraXBzX3N0YXR1cGRfY29wcGVyaGVhZF9tZW1pbyhpcHNfaGFfdCAqIGhhKQoreworCU1FVEhPRF9UUkFDRSgiaXBzX3N0YXR1cGRfY29wcGVyaGVhZF9tZW1pbyIsIDEpOworCisJaWYgKGhhLT5hZGFwdC0+cF9zdGF0dXNfdGFpbCAhPSBoYS0+YWRhcHQtPnBfc3RhdHVzX2VuZCkgeworCQloYS0+YWRhcHQtPnBfc3RhdHVzX3RhaWwrKzsKKwkJaGEtPmFkYXB0LT5od19zdGF0dXNfdGFpbCArPSBzaXplb2YgKElQU19TVEFUVVMpOworCX0gZWxzZSB7CisJCWhhLT5hZGFwdC0+cF9zdGF0dXNfdGFpbCA9IGhhLT5hZGFwdC0+cF9zdGF0dXNfc3RhcnQ7CisJCWhhLT5hZGFwdC0+aHdfc3RhdHVzX3RhaWwgPSBoYS0+YWRhcHQtPmh3X3N0YXR1c19zdGFydDsKKwl9CisKKwl3cml0ZWwoaGEtPmFkYXB0LT5od19zdGF0dXNfdGFpbCwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX1NRVFIpOworCisJcmV0dXJuIChoYS0+YWRhcHQtPnBfc3RhdHVzX3RhaWwtPnZhbHVlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3N0YXR1cGRfbW9ycGhldXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBSZW1vdmUgYW4gZWxlbWVudCBmcm9tIHRoZSBzdGF0dXMgcXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVpbnQzMl90CitpcHNfc3RhdHVwZF9tb3JwaGV1cyhpcHNfaGFfdCAqIGhhKQoreworCXVpbnQzMl90IHZhbDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3N0YXR1cGRfbW9ycGhldXMiLCAxKTsKKworCXZhbCA9IHJlYWRsKGhhLT5tZW1fcHRyICsgSVBTX1JFR19JMk9fT1VUTVNHUSk7CisKKwlyZXR1cm4gKHZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19pc3N1ZV9jb3BwZXJoZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgU2VuZCBhIGNvbW1hbmQgZG93biB0byB0aGUgY29udHJvbGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19pc3N1ZV9jb3BwZXJoZWFkKGlwc19oYV90ICogaGEsIGlwc19zY2JfdCAqIHNjYikKK3sKKwl1aW50MzJfdCBUaW1lT3V0OworCXVpbnQzMl90IHZhbDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2lzc3VlX2NvcHBlcmhlYWQiLCAxKTsKKworCWlmIChzY2ItPnNjc2lfY21kKSB7CisJCURFQlVHX1ZBUigyLCAiKCVzJWQpIGlwc19pc3N1ZTogY21kIDB4JVggaWQgJWQgKCVkICVkICVkKSIsCisJCQkgIGlwc19uYW1lLAorCQkJICBoYS0+aG9zdF9udW0sCisJCQkgIHNjYi0+Y2RiWzBdLAorCQkJICBzY2ItPmNtZC5iYXNpY19pby5jb21tYW5kX2lkLAorCQkJICBzY2ItPmJ1cywgc2NiLT50YXJnZXRfaWQsIHNjYi0+bHVuKTsKKwl9IGVsc2UgeworCQlERUJVR19WQVIoMiwgS0VSTl9OT1RJQ0UgIiglcyVkKSBpcHNfaXNzdWU6IGxvZ2ljYWwgY21kIGlkICVkIiwKKwkJCSAgaXBzX25hbWUsIGhhLT5ob3N0X251bSwgc2NiLT5jbWQuYmFzaWNfaW8uY29tbWFuZF9pZCk7CisJfQorCisJVGltZU91dCA9IDA7CisKKwl3aGlsZSAoKHZhbCA9CisJCWxlMzJfdG9fY3B1KGlubChoYS0+aW9fYWRkciArIElQU19SRUdfQ0NDUikpKSAmIElQU19CSVRfU0VNKSB7CisJCXVkZWxheSgxMDAwKTsKKworCQlpZiAoKytUaW1lT3V0ID49IElQU19TRU1fVElNRU9VVCkgeworCQkJaWYgKCEodmFsICYgSVBTX0JJVF9TVEFSVF9TVE9QKSkKKwkJCQlicmVhazsKKworCQkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkJICAgImlwc19pc3N1ZSB2YWwgWzB4JXhdLlxuIiwgdmFsKTsKKwkJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJCSAgICJpcHNfaXNzdWUgc2VtYXBob3JlIGNoayB0aW1lb3V0LlxuIik7CisKKwkJCXJldHVybiAoSVBTX0ZBSUxVUkUpOworCQl9CQkvKiBlbmQgaWYgKi8KKwl9CQkJLyogZW5kIHdoaWxlICovCisKKwlvdXRsKGNwdV90b19sZTMyKHNjYi0+c2NiX2J1c2FkZHIpLCBoYS0+aW9fYWRkciArIElQU19SRUdfQ0NTQVIpOworCW91dHcoY3B1X3RvX2xlMzIoSVBTX0JJVF9TVEFSVF9DTUQpLCBoYS0+aW9fYWRkciArIElQU19SRUdfQ0NDUik7CisKKwlyZXR1cm4gKElQU19TVUNDRVNTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2lzc3VlX2NvcHBlcmhlYWRfbWVtaW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBTZW5kIGEgY29tbWFuZCBkb3duIHRvIHRoZSBjb250cm9sbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2lzc3VlX2NvcHBlcmhlYWRfbWVtaW8oaXBzX2hhX3QgKiBoYSwgaXBzX3NjYl90ICogc2NiKQoreworCXVpbnQzMl90IFRpbWVPdXQ7CisJdWludDMyX3QgdmFsOworCisJTUVUSE9EX1RSQUNFKCJpcHNfaXNzdWVfY29wcGVyaGVhZF9tZW1pbyIsIDEpOworCisJaWYgKHNjYi0+c2NzaV9jbWQpIHsKKwkJREVCVUdfVkFSKDIsICIoJXMlZCkgaXBzX2lzc3VlOiBjbWQgMHglWCBpZCAlZCAoJWQgJWQgJWQpIiwKKwkJCSAgaXBzX25hbWUsCisJCQkgIGhhLT5ob3N0X251bSwKKwkJCSAgc2NiLT5jZGJbMF0sCisJCQkgIHNjYi0+Y21kLmJhc2ljX2lvLmNvbW1hbmRfaWQsCisJCQkgIHNjYi0+YnVzLCBzY2ItPnRhcmdldF9pZCwgc2NiLT5sdW4pOworCX0gZWxzZSB7CisJCURFQlVHX1ZBUigyLCAiKCVzJWQpIGlwc19pc3N1ZTogbG9naWNhbCBjbWQgaWQgJWQiLAorCQkJICBpcHNfbmFtZSwgaGEtPmhvc3RfbnVtLCBzY2ItPmNtZC5iYXNpY19pby5jb21tYW5kX2lkKTsKKwl9CisKKwlUaW1lT3V0ID0gMDsKKworCXdoaWxlICgodmFsID0gcmVhZGwoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0NDQ1IpKSAmIElQU19CSVRfU0VNKSB7CisJCXVkZWxheSgxMDAwKTsKKworCQlpZiAoKytUaW1lT3V0ID49IElQU19TRU1fVElNRU9VVCkgeworCQkJaWYgKCEodmFsICYgSVBTX0JJVF9TVEFSVF9TVE9QKSkKKwkJCQlicmVhazsKKworCQkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkJICAgImlwc19pc3N1ZSB2YWwgWzB4JXhdLlxuIiwgdmFsKTsKKwkJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJCSAgICJpcHNfaXNzdWUgc2VtYXBob3JlIGNoayB0aW1lb3V0LlxuIik7CisKKwkJCXJldHVybiAoSVBTX0ZBSUxVUkUpOworCQl9CQkvKiBlbmQgaWYgKi8KKwl9CQkJLyogZW5kIHdoaWxlICovCisKKwl3cml0ZWwoc2NiLT5zY2JfYnVzYWRkciwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0NDU0FSKTsKKwl3cml0ZWwoSVBTX0JJVF9TVEFSVF9DTUQsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19DQ0NSKTsKKworCXJldHVybiAoSVBTX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfaXNzdWVfaTJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFNlbmQgYSBjb21tYW5kIGRvd24gdG8gdGhlIGNvbnRyb2xsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfaXNzdWVfaTJvKGlwc19oYV90ICogaGEsIGlwc19zY2JfdCAqIHNjYikKK3sKKworCU1FVEhPRF9UUkFDRSgiaXBzX2lzc3VlX2kybyIsIDEpOworCisJaWYgKHNjYi0+c2NzaV9jbWQpIHsKKwkJREVCVUdfVkFSKDIsICIoJXMlZCkgaXBzX2lzc3VlOiBjbWQgMHglWCBpZCAlZCAoJWQgJWQgJWQpIiwKKwkJCSAgaXBzX25hbWUsCisJCQkgIGhhLT5ob3N0X251bSwKKwkJCSAgc2NiLT5jZGJbMF0sCisJCQkgIHNjYi0+Y21kLmJhc2ljX2lvLmNvbW1hbmRfaWQsCisJCQkgIHNjYi0+YnVzLCBzY2ItPnRhcmdldF9pZCwgc2NiLT5sdW4pOworCX0gZWxzZSB7CisJCURFQlVHX1ZBUigyLCAiKCVzJWQpIGlwc19pc3N1ZTogbG9naWNhbCBjbWQgaWQgJWQiLAorCQkJICBpcHNfbmFtZSwgaGEtPmhvc3RfbnVtLCBzY2ItPmNtZC5iYXNpY19pby5jb21tYW5kX2lkKTsKKwl9CisKKwlvdXRsKGNwdV90b19sZTMyKHNjYi0+c2NiX2J1c2FkZHIpLCBoYS0+aW9fYWRkciArIElQU19SRUdfSTJPX0lOTVNHUSk7CisKKwlyZXR1cm4gKElQU19TVUNDRVNTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2lzc3VlX2kyb19tZW1pbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBTZW5kIGEgY29tbWFuZCBkb3duIHRvIHRoZSBjb250cm9sbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2lzc3VlX2kyb19tZW1pbyhpcHNfaGFfdCAqIGhhLCBpcHNfc2NiX3QgKiBzY2IpCit7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19pc3N1ZV9pMm9fbWVtaW8iLCAxKTsKKworCWlmIChzY2ItPnNjc2lfY21kKSB7CisJCURFQlVHX1ZBUigyLCAiKCVzJWQpIGlwc19pc3N1ZTogY21kIDB4JVggaWQgJWQgKCVkICVkICVkKSIsCisJCQkgIGlwc19uYW1lLAorCQkJICBoYS0+aG9zdF9udW0sCisJCQkgIHNjYi0+Y2RiWzBdLAorCQkJICBzY2ItPmNtZC5iYXNpY19pby5jb21tYW5kX2lkLAorCQkJICBzY2ItPmJ1cywgc2NiLT50YXJnZXRfaWQsIHNjYi0+bHVuKTsKKwl9IGVsc2UgeworCQlERUJVR19WQVIoMiwgIiglcyVkKSBpcHNfaXNzdWU6IGxvZ2ljYWwgY21kIGlkICVkIiwKKwkJCSAgaXBzX25hbWUsIGhhLT5ob3N0X251bSwgc2NiLT5jbWQuYmFzaWNfaW8uY29tbWFuZF9pZCk7CisJfQorCisJd3JpdGVsKHNjYi0+c2NiX2J1c2FkZHIsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19JMk9fSU5NU0dRKTsKKworCXJldHVybiAoSVBTX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfaXNpbnRyX2NvcHBlcmhlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRlc3QgdG8gc2VlIGlmIGFuIGludGVycnVwdCBpcyBmb3IgdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfaXNpbnRyX2NvcHBlcmhlYWQoaXBzX2hhX3QgKiBoYSkKK3sKKwl1aW50OF90IElzcjsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2lzaW50cl9jb3BwZXJoZWFkIiwgMik7CisKKwlJc3IgPSBpbmIoaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0hJU1IpOworCisJaWYgKElzciA9PSAweEZGKQorCQkvKiA/IT8hIE5vdGhpbmcgcmVhbGx5IHRoZXJlICovCisJCXJldHVybiAoMCk7CisKKwlpZiAoSXNyICYgSVBTX0JJVF9TQ0UpCisJCXJldHVybiAoMSk7CisJZWxzZSBpZiAoSXNyICYgKElQU19CSVRfU1FPIHwgSVBTX0JJVF9HSEkpKSB7CisJCS8qIHN0YXR1cyBxdWV1ZSBvdmVyZmxvdyBvciBHSEkgKi8KKwkJLyoganVzdCBjbGVhciB0aGUgaW50ZXJydXB0ICovCisJCW91dGIoSXNyLCBoYS0+aW9fYWRkciArIElQU19SRUdfSElTUik7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2lzaW50cl9jb3BwZXJoZWFkX21lbWlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUZXN0IHRvIHNlZSBpZiBhbiBpbnRlcnJ1cHQgaXMgZm9yIHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2lzaW50cl9jb3BwZXJoZWFkX21lbWlvKGlwc19oYV90ICogaGEpCit7CisJdWludDhfdCBJc3I7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19pc2ludHJfbWVtaW8iLCAyKTsKKworCUlzciA9IHJlYWRiKGhhLT5tZW1fcHRyICsgSVBTX1JFR19ISVNSKTsKKworCWlmIChJc3IgPT0gMHhGRikKKwkJLyogPyE/ISBOb3RoaW5nIHJlYWxseSB0aGVyZSAqLworCQlyZXR1cm4gKDApOworCisJaWYgKElzciAmIElQU19CSVRfU0NFKQorCQlyZXR1cm4gKDEpOworCWVsc2UgaWYgKElzciAmIChJUFNfQklUX1NRTyB8IElQU19CSVRfR0hJKSkgeworCQkvKiBzdGF0dXMgcXVldWUgb3ZlcmZsb3cgb3IgR0hJICovCisJCS8qIGp1c3QgY2xlYXIgdGhlIGludGVycnVwdCAqLworCQl3cml0ZWIoSXNyLCBoYS0+bWVtX3B0ciArIElQU19SRUdfSElTUik7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2lzaW50cl9tb3JwaGV1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUZXN0IHRvIHNlZSBpZiBhbiBpbnRlcnJ1cHQgaXMgZm9yIHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2lzaW50cl9tb3JwaGV1cyhpcHNfaGFfdCAqIGhhKQoreworCXVpbnQzMl90IElzcjsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2lzaW50cl9tb3JwaGV1cyIsIDIpOworCisJSXNyID0gcmVhZGwoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0kyT19ISVIpOworCisJaWYgKElzciAmIElQU19CSVRfSTJPX09QUUkpCisJCXJldHVybiAoMSk7CisJZWxzZQorCQlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfd2FpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFdhaXQgZm9yIGEgY29tbWFuZCB0byBjb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfd2FpdChpcHNfaGFfdCAqIGhhLCBpbnQgdGltZSwgaW50IGludHIpCit7CisJaW50IHJldDsKKwlpbnQgZG9uZTsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3dhaXQiLCAxKTsKKworCXJldCA9IElQU19GQUlMVVJFOworCWRvbmUgPSBGQUxTRTsKKworCXRpbWUgKj0gSVBTX09ORV9TRUM7CS8qIGNvbnZlcnQgc2Vjb25kcyAqLworCisJd2hpbGUgKCh0aW1lID4gMCkgJiYgKCFkb25lKSkgeworCQlpZiAoaW50ciA9PSBJUFNfSU5UUl9PTikgeworCQkJaWYgKGhhLT53YWl0ZmxhZyA9PSBGQUxTRSkgeworCQkJCXJldCA9IElQU19TVUNDRVNTOworCQkJCWRvbmUgPSBUUlVFOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKGludHIgPT0gSVBTX0lOVFJfSU9STCkgeworCQkJaWYgKGhhLT53YWl0ZmxhZyA9PSBGQUxTRSkgeworCQkJCS8qCisJCQkJICogY29udHJvbGxlciBnZW5lcmF0ZWQgYW4gaW50ZXJydXB0IHRvCisJCQkJICogYWNrbm93bGVkZ2UgY29tcGxldGlvbiBvZiB0aGUgY29tbWFuZAorCQkJCSAqIGFuZCBpcHNfaW50cigpIGhhcyBzZXJ2aWNlZCB0aGUgaW50ZXJydXB0LgorCQkJCSAqLworCQkJCXJldCA9IElQU19TVUNDRVNTOworCQkJCWRvbmUgPSBUUlVFOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogTk9URTogd2UgYWxyZWFkeSBoYXZlIHRoZSBpb19yZXF1ZXN0X2xvY2sgc28KKwkJCSAqIGV2ZW4gaWYgd2UgZ2V0IGFuIGludGVycnVwdCBpdCB3b24ndCBnZXQgc2VydmljZWQKKwkJCSAqIHVudGlsIGFmdGVyIHdlIGZpbmlzaC4KKwkJCSAqLworCisJCQkoKmhhLT5mdW5jLmludHIpIChoYSk7CisJCX0KKworCQkvKiBUaGlzIGxvb2tzIGxpa2UgYSB2ZXJ5IGV2aWwgbG9vcCwgYnV0IGl0IG9ubHkgZG9lcyB0aGlzIGR1cmluZyBzdGFydC11cCAqLworCQl1ZGVsYXkoMTAwMCk7CisJCXRpbWUtLTsKKwl9CisKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc193cml0ZV9kcml2ZXJfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgV3JpdGUgT1MvRHJpdmVyIHZlcnNpb24gdG8gUGFnZSA1IG9mIHRoZSBudnJhbSBvbiB0aGUgY29udHJvbGxlciAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc193cml0ZV9kcml2ZXJfc3RhdHVzKGlwc19oYV90ICogaGEsIGludCBpbnRyKQoreworCU1FVEhPRF9UUkFDRSgiaXBzX3dyaXRlX2RyaXZlcl9zdGF0dXMiLCAxKTsKKworCWlmICghaXBzX3JlYWR3cml0ZV9wYWdlNShoYSwgRkFMU0UsIGludHIpKSB7CisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJICAgInVuYWJsZSB0byByZWFkIE5WUkFNIHBhZ2UgNS5cbiIpOworCisJCXJldHVybiAoMCk7CisJfQorCisJLyogY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBwYWdlIGhhcyBhIHZhbGlkICovCisJLyogc2lnbmF0dXJlICovCisJaWYgKGxlMzJfdG9fY3B1KGhhLT5udnJhbS0+c2lnbmF0dXJlKSAhPSBJUFNfTlZSQU1fUDVfU0lHKSB7CisJCURFQlVHX1ZBUigxLAorCQkJICAiKCVzJWQpIE5WUkFNIHBhZ2UgNSBoYXMgYW4gaW52YWxpZCBzaWduYXR1cmU6ICVYLiIsCisJCQkgIGlwc19uYW1lLCBoYS0+aG9zdF9udW0sIGhhLT5udnJhbS0+c2lnbmF0dXJlKTsKKwkJaGEtPm52cmFtLT5zaWduYXR1cmUgPSBJUFNfTlZSQU1fUDVfU0lHOworCX0KKworCURFQlVHX1ZBUigyLAorCQkgICIoJXMlZCkgQWQgVHlwZTogJWQsIEFkIFNsb3Q6ICVkLCBCSU9TOiAlYyVjJWMlYyAlYyVjJWMlYy4iLAorCQkgIGlwc19uYW1lLCBoYS0+aG9zdF9udW0sIGxlMTZfdG9fY3B1KGhhLT5udnJhbS0+YWRhcHRlcl90eXBlKSwKKwkJICBoYS0+bnZyYW0tPmFkYXB0ZXJfc2xvdCwgaGEtPm52cmFtLT5iaW9zX2hpZ2hbMF0sCisJCSAgaGEtPm52cmFtLT5iaW9zX2hpZ2hbMV0sIGhhLT5udnJhbS0+Ymlvc19oaWdoWzJdLAorCQkgIGhhLT5udnJhbS0+Ymlvc19oaWdoWzNdLCBoYS0+bnZyYW0tPmJpb3NfbG93WzBdLAorCQkgIGhhLT5udnJhbS0+Ymlvc19sb3dbMV0sIGhhLT5udnJhbS0+Ymlvc19sb3dbMl0sCisJCSAgaGEtPm52cmFtLT5iaW9zX2xvd1szXSk7CisKKwlpcHNfZ2V0X2Jpb3NfdmVyc2lvbihoYSwgaW50cik7CisKKwkvKiBjaGFuZ2UgdmFsdWVzIChhcyBuZWVkZWQpICovCisJaGEtPm52cmFtLT5vcGVyYXRpbmdfc3lzdGVtID0gSVBTX09TX0xJTlVYOworCWhhLT5udnJhbS0+YWRhcHRlcl90eXBlID0gaGEtPmFkX3R5cGU7CisJc3RybmNweSgoY2hhciAqKSBoYS0+bnZyYW0tPmRyaXZlcl9oaWdoLCBJUFNfVkVSU0lPTl9ISUdILCA0KTsKKwlzdHJuY3B5KChjaGFyICopIGhhLT5udnJhbS0+ZHJpdmVyX2xvdywgSVBTX1ZFUlNJT05fTE9XLCA0KTsKKwlzdHJuY3B5KChjaGFyICopIGhhLT5udnJhbS0+Ymlvc19oaWdoLCBoYS0+Ymlvc192ZXJzaW9uLCA0KTsKKwlzdHJuY3B5KChjaGFyICopIGhhLT5udnJhbS0+Ymlvc19sb3csIGhhLT5iaW9zX3ZlcnNpb24gKyA0LCA0KTsKKworCWlwc192ZXJzaW9uX2NoZWNrKGhhLCBpbnRyKTsJLyogQ2hlY2sgQklPUy9GVy9Ecml2ZXIgVmVyc2lvbnMgKi8KKworCS8qIG5vdyB1cGRhdGUgdGhlIHBhZ2UgKi8KKwlpZiAoIWlwc19yZWFkd3JpdGVfcGFnZTUoaGEsIFRSVUUsIGludHIpKSB7CisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJICAgInVuYWJsZSB0byB3cml0ZSBOVlJBTSBwYWdlIDUuXG4iKTsKKworCQlyZXR1cm4gKDApOworCX0KKworCS8qIElGIE5WUkFNIFBhZ2UgNSBpcyBPSywgVXNlIGl0IGZvciBTbG90IE51bWJlciBJbmZvIEJlY2F1c2UgTGludXggRG9lc24ndCBEbyBTbG90cyAqLworCWhhLT5zbG90X251bSA9IGhhLT5udnJhbS0+YWRhcHRlcl9zbG90OworCisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3JlYWRfYWRhcHRlcl9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBEbyBhbiBJbnF1aXJ5IGNvbW1hbmQgdG8gdGhlIGFkYXB0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX3JlYWRfYWRhcHRlcl9zdGF0dXMoaXBzX2hhX3QgKiBoYSwgaW50IGludHIpCit7CisJaXBzX3NjYl90ICpzY2I7CisJaW50IHJldDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3JlYWRfYWRhcHRlcl9zdGF0dXMiLCAxKTsKKworCXNjYiA9ICZoYS0+c2Nic1toYS0+bWF4X2NtZHMgLSAxXTsKKworCWlwc19pbml0X3NjYihoYSwgc2NiKTsKKworCXNjYi0+dGltZW91dCA9IGlwc19jbWRfdGltZW91dDsKKwlzY2ItPmNkYlswXSA9IElQU19DTURfRU5RVUlSWTsKKworCXNjYi0+Y21kLmJhc2ljX2lvLm9wX2NvZGUgPSBJUFNfQ01EX0VOUVVJUlk7CisJc2NiLT5jbWQuYmFzaWNfaW8uY29tbWFuZF9pZCA9IElQU19DT01NQU5EX0lEKGhhLCBzY2IpOworCXNjYi0+Y21kLmJhc2ljX2lvLnNnX2NvdW50ID0gMDsKKwlzY2ItPmNtZC5iYXNpY19pby5sYmEgPSAwOworCXNjYi0+Y21kLmJhc2ljX2lvLnNlY3Rvcl9jb3VudCA9IDA7CisJc2NiLT5jbWQuYmFzaWNfaW8ubG9nX2RydiA9IDA7CisJc2NiLT5kYXRhX2xlbiA9IHNpemVvZiAoKmhhLT5lbnEpOworCXNjYi0+Y21kLmJhc2ljX2lvLnNnX2FkZHIgPSBoYS0+ZW5xX2J1c2FkZHI7CisKKwkvKiBzZW5kIGNvbW1hbmQgKi8KKwlpZiAoKChyZXQgPQorCSAgICAgIGlwc19zZW5kX3dhaXQoaGEsIHNjYiwgaXBzX2NtZF90aW1lb3V0LCBpbnRyKSkgPT0gSVBTX0ZBSUxVUkUpCisJICAgIHx8IChyZXQgPT0gSVBTX1NVQ0NFU1NfSU1NKQorCSAgICB8fCAoKHNjYi0+YmFzaWNfc3RhdHVzICYgSVBTX0dTQ19TVEFUVVNfTUFTSykgPiAxKSkKKwkJcmV0dXJuICgwKTsKKworCXJldHVybiAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19yZWFkX3N1YnN5c3RlbV9wYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUmVhZCBzdWJzeXN0ZW0gcGFyYW1ldGVycyBmcm9tIHRoZSBhZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19yZWFkX3N1YnN5c3RlbV9wYXJhbWV0ZXJzKGlwc19oYV90ICogaGEsIGludCBpbnRyKQoreworCWlwc19zY2JfdCAqc2NiOworCWludCByZXQ7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19yZWFkX3N1YnN5c3RlbV9wYXJhbWV0ZXJzIiwgMSk7CisKKwlzY2IgPSAmaGEtPnNjYnNbaGEtPm1heF9jbWRzIC0gMV07CisKKwlpcHNfaW5pdF9zY2IoaGEsIHNjYik7CisKKwlzY2ItPnRpbWVvdXQgPSBpcHNfY21kX3RpbWVvdXQ7CisJc2NiLT5jZGJbMF0gPSBJUFNfQ01EX0dFVF9TVUJTWVM7CisKKwlzY2ItPmNtZC5iYXNpY19pby5vcF9jb2RlID0gSVBTX0NNRF9HRVRfU1VCU1lTOworCXNjYi0+Y21kLmJhc2ljX2lvLmNvbW1hbmRfaWQgPSBJUFNfQ09NTUFORF9JRChoYSwgc2NiKTsKKwlzY2ItPmNtZC5iYXNpY19pby5zZ19jb3VudCA9IDA7CisJc2NiLT5jbWQuYmFzaWNfaW8ubGJhID0gMDsKKwlzY2ItPmNtZC5iYXNpY19pby5zZWN0b3JfY291bnQgPSAwOworCXNjYi0+Y21kLmJhc2ljX2lvLmxvZ19kcnYgPSAwOworCXNjYi0+ZGF0YV9sZW4gPSBzaXplb2YgKCpoYS0+c3Vic3lzKTsKKwlzY2ItPmNtZC5iYXNpY19pby5zZ19hZGRyID0gaGEtPmlvY3RsX2J1c2FkZHI7CisKKwkvKiBzZW5kIGNvbW1hbmQgKi8KKwlpZiAoKChyZXQgPQorCSAgICAgIGlwc19zZW5kX3dhaXQoaGEsIHNjYiwgaXBzX2NtZF90aW1lb3V0LCBpbnRyKSkgPT0gSVBTX0ZBSUxVUkUpCisJICAgIHx8IChyZXQgPT0gSVBTX1NVQ0NFU1NfSU1NKQorCSAgICB8fCAoKHNjYi0+YmFzaWNfc3RhdHVzICYgSVBTX0dTQ19TVEFUVVNfTUFTSykgPiAxKSkKKwkJcmV0dXJuICgwKTsKKworCW1lbWNweShoYS0+c3Vic3lzLCBoYS0+aW9jdGxfZGF0YSwgc2l6ZW9mKCpoYS0+c3Vic3lzKSk7CisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3JlYWRfY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBSZWFkIHRoZSBjb25maWd1cmF0aW9uIG9uIHRoZSBhZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX3JlYWRfY29uZmlnKGlwc19oYV90ICogaGEsIGludCBpbnRyKQoreworCWlwc19zY2JfdCAqc2NiOworCWludCBpOworCWludCByZXQ7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19yZWFkX2NvbmZpZyIsIDEpOworCisJLyogc2V0IGRlZmF1bHRzIGZvciBpbml0aWF0b3IgSURzICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJaGEtPmNvbmYtPmluaXRfaWRbaV0gPSA3OworCisJc2NiID0gJmhhLT5zY2JzW2hhLT5tYXhfY21kcyAtIDFdOworCisJaXBzX2luaXRfc2NiKGhhLCBzY2IpOworCisJc2NiLT50aW1lb3V0ID0gaXBzX2NtZF90aW1lb3V0OworCXNjYi0+Y2RiWzBdID0gSVBTX0NNRF9SRUFEX0NPTkY7CisKKwlzY2ItPmNtZC5iYXNpY19pby5vcF9jb2RlID0gSVBTX0NNRF9SRUFEX0NPTkY7CisJc2NiLT5jbWQuYmFzaWNfaW8uY29tbWFuZF9pZCA9IElQU19DT01NQU5EX0lEKGhhLCBzY2IpOworCXNjYi0+ZGF0YV9sZW4gPSBzaXplb2YgKCpoYS0+Y29uZik7CisJc2NiLT5jbWQuYmFzaWNfaW8uc2dfYWRkciA9IGhhLT5pb2N0bF9idXNhZGRyOworCisJLyogc2VuZCBjb21tYW5kICovCisJaWYgKCgocmV0ID0KKwkgICAgICBpcHNfc2VuZF93YWl0KGhhLCBzY2IsIGlwc19jbWRfdGltZW91dCwgaW50cikpID09IElQU19GQUlMVVJFKQorCSAgICB8fCAocmV0ID09IElQU19TVUNDRVNTX0lNTSkKKwkgICAgfHwgKChzY2ItPmJhc2ljX3N0YXR1cyAmIElQU19HU0NfU1RBVFVTX01BU0spID4gMSkpIHsKKworCQltZW1zZXQoaGEtPmNvbmYsIDAsIHNpemVvZiAoSVBTX0NPTkYpKTsKKworCQkvKiByZXNldCBpbml0aWF0b3IgSURzICovCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQloYS0+Y29uZi0+aW5pdF9pZFtpXSA9IDc7CisKKwkJLyogQWxsb3cgQ29tcGxldGVkIHdpdGggRXJyb3JzLCBzbyBKQ1JNIGNhbiBhY2Nlc3MgdGhlIEFkYXB0ZXIgdG8gZml4IHRoZSBwcm9ibGVtcyAqLworCQlpZiAoKHNjYi0+YmFzaWNfc3RhdHVzICYgSVBTX0dTQ19TVEFUVVNfTUFTSykgPT0KKwkJICAgIElQU19DTURfQ01QTFRfV0VSUk9SKQorCQkJcmV0dXJuICgxKTsKKworCQlyZXR1cm4gKDApOworCX0KKwkKKwltZW1jcHkoaGEtPmNvbmYsIGhhLT5pb2N0bF9kYXRhLCBzaXplb2YoKmhhLT5jb25mKSk7CisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3JlYWR3cml0ZV9wYWdlNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBSZWFkIG52cmFtIHBhZ2UgNSBmcm9tIHRoZSBhZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX3JlYWR3cml0ZV9wYWdlNShpcHNfaGFfdCAqIGhhLCBpbnQgd3JpdGUsIGludCBpbnRyKQoreworCWlwc19zY2JfdCAqc2NiOworCWludCByZXQ7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19yZWFkd3JpdGVfcGFnZTUiLCAxKTsKKworCXNjYiA9ICZoYS0+c2Nic1toYS0+bWF4X2NtZHMgLSAxXTsKKworCWlwc19pbml0X3NjYihoYSwgc2NiKTsKKworCXNjYi0+dGltZW91dCA9IGlwc19jbWRfdGltZW91dDsKKwlzY2ItPmNkYlswXSA9IElQU19DTURfUldfTlZSQU1fUEFHRTsKKworCXNjYi0+Y21kLm52cmFtLm9wX2NvZGUgPSBJUFNfQ01EX1JXX05WUkFNX1BBR0U7CisJc2NiLT5jbWQubnZyYW0uY29tbWFuZF9pZCA9IElQU19DT01NQU5EX0lEKGhhLCBzY2IpOworCXNjYi0+Y21kLm52cmFtLnBhZ2UgPSA1OworCXNjYi0+Y21kLm52cmFtLndyaXRlID0gd3JpdGU7CisJc2NiLT5jbWQubnZyYW0ucmVzZXJ2ZWQgPSAwOworCXNjYi0+Y21kLm52cmFtLnJlc2VydmVkMiA9IDA7CisJc2NiLT5kYXRhX2xlbiA9IHNpemVvZiAoKmhhLT5udnJhbSk7CisJc2NiLT5jbWQubnZyYW0uYnVmZmVyX2FkZHIgPSBoYS0+aW9jdGxfYnVzYWRkcjsKKwlpZiAod3JpdGUpCisJCW1lbWNweShoYS0+aW9jdGxfZGF0YSwgaGEtPm52cmFtLCBzaXplb2YoKmhhLT5udnJhbSkpOworCQorCS8qIGlzc3VlIHRoZSBjb21tYW5kICovCisJaWYgKCgocmV0ID0KKwkgICAgICBpcHNfc2VuZF93YWl0KGhhLCBzY2IsIGlwc19jbWRfdGltZW91dCwgaW50cikpID09IElQU19GQUlMVVJFKQorCSAgICB8fCAocmV0ID09IElQU19TVUNDRVNTX0lNTSkKKwkgICAgfHwgKChzY2ItPmJhc2ljX3N0YXR1cyAmIElQU19HU0NfU1RBVFVTX01BU0spID4gMSkpIHsKKworCQltZW1zZXQoaGEtPm52cmFtLCAwLCBzaXplb2YgKElQU19OVlJBTV9QNSkpOworCisJCXJldHVybiAoMCk7CisJfQorCWlmICghd3JpdGUpCisJCW1lbWNweShoYS0+bnZyYW0sIGhhLT5pb2N0bF9kYXRhLCBzaXplb2YoKmhhLT5udnJhbSkpOworCXJldHVybiAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19jbGVhcl9hZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQ2xlYXIgdGhlIHN0cmlwZSBsb2NrIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19jbGVhcl9hZGFwdGVyKGlwc19oYV90ICogaGEsIGludCBpbnRyKQoreworCWlwc19zY2JfdCAqc2NiOworCWludCByZXQ7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19jbGVhcl9hZGFwdGVyIiwgMSk7CisKKwlzY2IgPSAmaGEtPnNjYnNbaGEtPm1heF9jbWRzIC0gMV07CisKKwlpcHNfaW5pdF9zY2IoaGEsIHNjYik7CisKKwlzY2ItPnRpbWVvdXQgPSBpcHNfcmVzZXRfdGltZW91dDsKKwlzY2ItPmNkYlswXSA9IElQU19DTURfQ09ORklHX1NZTkM7CisKKwlzY2ItPmNtZC5jb25maWdfc3luYy5vcF9jb2RlID0gSVBTX0NNRF9DT05GSUdfU1lOQzsKKwlzY2ItPmNtZC5jb25maWdfc3luYy5jb21tYW5kX2lkID0gSVBTX0NPTU1BTkRfSUQoaGEsIHNjYik7CisJc2NiLT5jbWQuY29uZmlnX3N5bmMuY2hhbm5lbCA9IDA7CisJc2NiLT5jbWQuY29uZmlnX3N5bmMuc291cmNlX3RhcmdldCA9IElQU19QT0NMOworCXNjYi0+Y21kLmNvbmZpZ19zeW5jLnJlc2VydmVkID0gMDsKKwlzY2ItPmNtZC5jb25maWdfc3luYy5yZXNlcnZlZDIgPSAwOworCXNjYi0+Y21kLmNvbmZpZ19zeW5jLnJlc2VydmVkMyA9IDA7CisKKwkvKiBpc3N1ZSBjb21tYW5kICovCisJaWYgKCgocmV0ID0KKwkgICAgICBpcHNfc2VuZF93YWl0KGhhLCBzY2IsIGlwc19yZXNldF90aW1lb3V0LCBpbnRyKSkgPT0gSVBTX0ZBSUxVUkUpCisJICAgIHx8IChyZXQgPT0gSVBTX1NVQ0NFU1NfSU1NKQorCSAgICB8fCAoKHNjYi0+YmFzaWNfc3RhdHVzICYgSVBTX0dTQ19TVEFUVVNfTUFTSykgPiAxKSkKKwkJcmV0dXJuICgwKTsKKworCS8qIHNlbmQgdW5sb2NrIHN0cmlwZSBjb21tYW5kICovCisJaXBzX2luaXRfc2NiKGhhLCBzY2IpOworCisJc2NiLT5jZGJbMF0gPSBJUFNfQ01EX0VSUk9SX1RBQkxFOworCXNjYi0+dGltZW91dCA9IGlwc19yZXNldF90aW1lb3V0OworCisJc2NiLT5jbWQudW5sb2NrX3N0cmlwZS5vcF9jb2RlID0gSVBTX0NNRF9FUlJPUl9UQUJMRTsKKwlzY2ItPmNtZC51bmxvY2tfc3RyaXBlLmNvbW1hbmRfaWQgPSBJUFNfQ09NTUFORF9JRChoYSwgc2NiKTsKKwlzY2ItPmNtZC51bmxvY2tfc3RyaXBlLmxvZ19kcnYgPSAwOworCXNjYi0+Y21kLnVubG9ja19zdHJpcGUuY29udHJvbCA9IElQU19DU0w7CisJc2NiLT5jbWQudW5sb2NrX3N0cmlwZS5yZXNlcnZlZCA9IDA7CisJc2NiLT5jbWQudW5sb2NrX3N0cmlwZS5yZXNlcnZlZDIgPSAwOworCXNjYi0+Y21kLnVubG9ja19zdHJpcGUucmVzZXJ2ZWQzID0gMDsKKworCS8qIGlzc3VlIGNvbW1hbmQgKi8KKwlpZiAoKChyZXQgPQorCSAgICAgIGlwc19zZW5kX3dhaXQoaGEsIHNjYiwgaXBzX2NtZF90aW1lb3V0LCBpbnRyKSkgPT0gSVBTX0ZBSUxVUkUpCisJICAgIHx8IChyZXQgPT0gSVBTX1NVQ0NFU1NfSU1NKQorCSAgICB8fCAoKHNjYi0+YmFzaWNfc3RhdHVzICYgSVBTX0dTQ19TVEFUVVNfTUFTSykgPiAxKSkKKwkJcmV0dXJuICgwKTsKKworCXJldHVybiAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19mZmRjX3Jlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgRkZEQzogd3JpdGUgcmVzZXQgaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcHNfZmZkY19yZXNldChpcHNfaGFfdCAqIGhhLCBpbnQgaW50cikKK3sKKwlpcHNfc2NiX3QgKnNjYjsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2ZmZGNfcmVzZXQiLCAxKTsKKworCXNjYiA9ICZoYS0+c2Nic1toYS0+bWF4X2NtZHMgLSAxXTsKKworCWlwc19pbml0X3NjYihoYSwgc2NiKTsKKworCXNjYi0+dGltZW91dCA9IGlwc19jbWRfdGltZW91dDsKKwlzY2ItPmNkYlswXSA9IElQU19DTURfRkZEQzsKKwlzY2ItPmNtZC5mZmRjLm9wX2NvZGUgPSBJUFNfQ01EX0ZGREM7CisJc2NiLT5jbWQuZmZkYy5jb21tYW5kX2lkID0gSVBTX0NPTU1BTkRfSUQoaGEsIHNjYik7CisJc2NiLT5jbWQuZmZkYy5yZXNldF9jb3VudCA9IGhhLT5yZXNldF9jb3VudDsKKwlzY2ItPmNtZC5mZmRjLnJlc2V0X3R5cGUgPSAweDgwOworCisJLyogY29udmVydCB0aW1lIHRvIHdoYXQgdGhlIGNhcmQgd2FudHMgKi8KKwlpcHNfZml4X2ZmZGNfdGltZShoYSwgc2NiLCBoYS0+bGFzdF9mZmRjKTsKKworCS8qIGlzc3VlIGNvbW1hbmQgKi8KKwlpcHNfc2VuZF93YWl0KGhhLCBzY2IsIGlwc19jbWRfdGltZW91dCwgaW50cik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19mZmRjX3RpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgRkZEQzogd3JpdGUgdGltZSBpbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcHNfZmZkY190aW1lKGlwc19oYV90ICogaGEpCit7CisJaXBzX3NjYl90ICpzY2I7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19mZmRjX3RpbWUiLCAxKTsKKworCURFQlVHX1ZBUigxLCAiKCVzJWQpIFNlbmRpbmcgdGltZSB1cGRhdGUuIiwgaXBzX25hbWUsIGhhLT5ob3N0X251bSk7CisKKwlzY2IgPSAmaGEtPnNjYnNbaGEtPm1heF9jbWRzIC0gMV07CisKKwlpcHNfaW5pdF9zY2IoaGEsIHNjYik7CisKKwlzY2ItPnRpbWVvdXQgPSBpcHNfY21kX3RpbWVvdXQ7CisJc2NiLT5jZGJbMF0gPSBJUFNfQ01EX0ZGREM7CisJc2NiLT5jbWQuZmZkYy5vcF9jb2RlID0gSVBTX0NNRF9GRkRDOworCXNjYi0+Y21kLmZmZGMuY29tbWFuZF9pZCA9IElQU19DT01NQU5EX0lEKGhhLCBzY2IpOworCXNjYi0+Y21kLmZmZGMucmVzZXRfY291bnQgPSAwOworCXNjYi0+Y21kLmZmZGMucmVzZXRfdHlwZSA9IDA7CisKKwkvKiBjb252ZXJ0IHRpbWUgdG8gd2hhdCB0aGUgY2FyZCB3YW50cyAqLworCWlwc19maXhfZmZkY190aW1lKGhhLCBzY2IsIGhhLT5sYXN0X2ZmZGMpOworCisJLyogaXNzdWUgY29tbWFuZCAqLworCWlwc19zZW5kX3dhaXQoaGEsIHNjYiwgaXBzX2NtZF90aW1lb3V0LCBJUFNfRkZEQyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19maXhfZmZkY190aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEFkanVzdCB0aW1lX3QgdG8gd2hhdCB0aGUgY2FyZCB3YW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX2ZpeF9mZmRjX3RpbWUoaXBzX2hhX3QgKiBoYSwgaXBzX3NjYl90ICogc2NiLCB0aW1lX3QgY3VycmVudF90aW1lKQoreworCWxvbmcgZGF5czsKKwlsb25nIHJlbTsKKwlpbnQgaTsKKwlpbnQgeWVhcjsKKwlpbnQgeWxlYXA7CisJaW50IHllYXJfbGVuZ3Roc1syXSA9IHsgSVBTX0RBWVNfTk9STUFMX1lFQVIsIElQU19EQVlTX0xFQVBfWUVBUiB9OworCWludCBtb250aF9sZW5ndGhzWzEyXVsyXSA9IHsgezMxLCAzMX0sCisJezI4LCAyOX0sCisJezMxLCAzMX0sCisJezMwLCAzMH0sCisJezMxLCAzMX0sCisJezMwLCAzMH0sCisJezMxLCAzMX0sCisJezMxLCAzMX0sCisJezMwLCAzMH0sCisJezMxLCAzMX0sCisJezMwLCAzMH0sCisJezMxLCAzMX0KKwl9OworCisJTUVUSE9EX1RSQUNFKCJpcHNfZml4X2ZmZGNfdGltZSIsIDEpOworCisJZGF5cyA9IGN1cnJlbnRfdGltZSAvIElQU19TRUNTX0RBWTsKKwlyZW0gPSBjdXJyZW50X3RpbWUgJSBJUFNfU0VDU19EQVk7CisKKwlzY2ItPmNtZC5mZmRjLmhvdXIgPSAocmVtIC8gSVBTX1NFQ1NfSE9VUik7CisJcmVtID0gcmVtICUgSVBTX1NFQ1NfSE9VUjsKKwlzY2ItPmNtZC5mZmRjLm1pbnV0ZSA9IChyZW0gLyBJUFNfU0VDU19NSU4pOworCXNjYi0+Y21kLmZmZGMuc2Vjb25kID0gKHJlbSAlIElQU19TRUNTX01JTik7CisKKwl5ZWFyID0gSVBTX0VQT0NIX1lFQVI7CisJd2hpbGUgKGRheXMgPCAwIHx8IGRheXMgPj0geWVhcl9sZW5ndGhzW3lsZWFwID0gSVBTX0lTX0xFQVBfWUVBUih5ZWFyKV0pIHsKKwkJaW50IG5ld3k7CisKKwkJbmV3eSA9IHllYXIgKyAoZGF5cyAvIElQU19EQVlTX05PUk1BTF9ZRUFSKTsKKwkJaWYgKGRheXMgPCAwKQorCQkJLS1uZXd5OworCQlkYXlzIC09IChuZXd5IC0geWVhcikgKiBJUFNfREFZU19OT1JNQUxfWUVBUiArCisJCSAgICBJUFNfTlVNX0xFQVBfWUVBUlNfVEhST1VHSChuZXd5IC0gMSkgLQorCQkgICAgSVBTX05VTV9MRUFQX1lFQVJTX1RIUk9VR0goeWVhciAtIDEpOworCQl5ZWFyID0gbmV3eTsKKwl9CisKKwlzY2ItPmNtZC5mZmRjLnllYXJIID0geWVhciAvIDEwMDsKKwlzY2ItPmNtZC5mZmRjLnllYXJMID0geWVhciAlIDEwMDsKKworCWZvciAoaSA9IDA7IGRheXMgPj0gbW9udGhfbGVuZ3Roc1tpXVt5bGVhcF07ICsraSkKKwkJZGF5cyAtPSBtb250aF9sZW5ndGhzW2ldW3lsZWFwXTsKKworCXNjYi0+Y21kLmZmZGMubW9udGggPSBpICsgMTsKKwlzY2ItPmNtZC5mZmRjLmRheSA9IGRheXMgKyAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQklPUyBGbGFzaCBSb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfZXJhc2VfYmlvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBFcmFzZSB0aGUgQklPUyBvbiB0aGUgYWRhcHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2VyYXNlX2Jpb3MoaXBzX2hhX3QgKiBoYSkKK3sKKwlpbnQgdGltZW91dDsKKwl1aW50OF90IHN0YXR1cyA9IDA7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19lcmFzZV9iaW9zIiwgMSk7CisKKwlzdGF0dXMgPSAwOworCisJLyogQ2xlYXIgdGhlIHN0YXR1cyByZWdpc3RlciAqLworCW91dGwoMCwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMQVApOworCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwlvdXRiKDB4NTAsIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTERQKTsKKwlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJLyogRXJhc2UgU2V0dXAgKi8KKwlvdXRiKDB4MjAsIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTERQKTsKKwlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJLyogRXJhc2UgQ29uZmlybSAqLworCW91dGIoMHhEMCwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApOworCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkvKiBFcmFzZSBTdGF0dXMgKi8KKwlvdXRiKDB4NzAsIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTERQKTsKKwlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJdGltZW91dCA9IDgwMDAwOwkvKiA4MCBzZWNvbmRzICovCisKKwl3aGlsZSAodGltZW91dCA+IDApIHsKKwkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkgeworCQkJb3V0bCgwLCBoYS0+aW9fYWRkciArIElQU19SRUdfRkxBUCk7CisJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCQl9CisKKwkJc3RhdHVzID0gaW5iKGhhLT5pb19hZGRyICsgSVBTX1JFR19GTERQKTsKKworCQlpZiAoc3RhdHVzICYgMHg4MCkKKwkJCWJyZWFrOworCisJCU1ERUxBWSgxKTsKKwkJdGltZW91dC0tOworCX0KKworCS8qIGNoZWNrIGZvciB0aW1lb3V0ICovCisJaWYgKHRpbWVvdXQgPD0gMCkgeworCQkvKiB0aW1lb3V0ICovCisKKwkJLyogdHJ5IHRvIHN1c3BlbmQgdGhlIGVyYXNlICovCisJCW91dGIoMHhCMCwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApOworCQlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQkvKiB3YWl0IGZvciAxMCBzZWNvbmRzICovCisJCXRpbWVvdXQgPSAxMDAwMDsKKwkJd2hpbGUgKHRpbWVvdXQgPiAwKSB7CisJCQlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KSB7CisJCQkJb3V0bCgwLCBoYS0+aW9fYWRkciArIElQU19SRUdfRkxBUCk7CisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKwkJCX0KKworCQkJc3RhdHVzID0gaW5iKGhhLT5pb19hZGRyICsgSVBTX1JFR19GTERQKTsKKworCQkJaWYgKHN0YXR1cyAmIDB4QzApCisJCQkJYnJlYWs7CisKKwkJCU1ERUxBWSgxKTsKKwkJCXRpbWVvdXQtLTsKKwkJfQorCisJCXJldHVybiAoMSk7CisJfQorCisJLyogY2hlY2sgZm9yIHZhbGlkIFZQUCAqLworCWlmIChzdGF0dXMgJiAweDA4KQorCQkvKiBWUFAgZmFpbHVyZSAqLworCQlyZXR1cm4gKDEpOworCisJLyogY2hlY2sgZm9yIHN1Y2Nlc2Z1bCBmbGFzaCAqLworCWlmIChzdGF0dXMgJiAweDMwKQorCQkvKiBzZXF1ZW5jZSBlcnJvciAqLworCQlyZXR1cm4gKDEpOworCisJLyogT3RoZXJ3aXNlLCB3ZSB3ZXJlIHN1Y2Nlc3NmdWwgKi8KKwkvKiBjbGVhciBzdGF0dXMgKi8KKwlvdXRiKDB4NTAsIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTERQKTsKKwlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJLyogZW5hYmxlIHJlYWRzICovCisJb3V0YigweEZGLCBoYS0+aW9fYWRkciArIElQU19SRUdfRkxEUCk7CisJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19lcmFzZV9iaW9zX21lbWlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEVyYXNlIHRoZSBCSU9TIG9uIHRoZSBhZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfZXJhc2VfYmlvc19tZW1pbyhpcHNfaGFfdCAqIGhhKQoreworCWludCB0aW1lb3V0OworCXVpbnQ4X3Qgc3RhdHVzOworCisJTUVUSE9EX1RSQUNFKCJpcHNfZXJhc2VfYmlvc19tZW1pbyIsIDEpOworCisJc3RhdHVzID0gMDsKKworCS8qIENsZWFyIHRoZSBzdGF0dXMgcmVnaXN0ZXIgKi8KKwl3cml0ZWwoMCwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMQVApOworCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwl3cml0ZWIoMHg1MCwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMRFApOworCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkvKiBFcmFzZSBTZXR1cCAqLworCXdyaXRlYigweDIwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxEUCk7CisJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCS8qIEVyYXNlIENvbmZpcm0gKi8KKwl3cml0ZWIoMHhEMCwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMRFApOworCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkvKiBFcmFzZSBTdGF0dXMgKi8KKwl3cml0ZWIoMHg3MCwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMRFApOworCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwl0aW1lb3V0ID0gODAwMDA7CS8qIDgwIHNlY29uZHMgKi8KKworCXdoaWxlICh0aW1lb3V0ID4gMCkgeworCQlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KSB7CisJCQl3cml0ZWwoMCwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMQVApOworCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKwkJfQorCisJCXN0YXR1cyA9IHJlYWRiKGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTERQKTsKKworCQlpZiAoc3RhdHVzICYgMHg4MCkKKwkJCWJyZWFrOworCisJCU1ERUxBWSgxKTsKKwkJdGltZW91dC0tOworCX0KKworCS8qIGNoZWNrIGZvciB0aW1lb3V0ICovCisJaWYgKHRpbWVvdXQgPD0gMCkgeworCQkvKiB0aW1lb3V0ICovCisKKwkJLyogdHJ5IHRvIHN1c3BlbmQgdGhlIGVyYXNlICovCisJCXdyaXRlYigweEIwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxEUCk7CisJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJCS8qIHdhaXQgZm9yIDEwIHNlY29uZHMgKi8KKwkJdGltZW91dCA9IDEwMDAwOworCQl3aGlsZSAodGltZW91dCA+IDApIHsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpIHsKKwkJCQl3cml0ZWwoMCwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMQVApOworCQkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisJCQl9CisKKwkJCXN0YXR1cyA9IHJlYWRiKGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTERQKTsKKworCQkJaWYgKHN0YXR1cyAmIDB4QzApCisJCQkJYnJlYWs7CisKKwkJCU1ERUxBWSgxKTsKKwkJCXRpbWVvdXQtLTsKKwkJfQorCisJCXJldHVybiAoMSk7CisJfQorCisJLyogY2hlY2sgZm9yIHZhbGlkIFZQUCAqLworCWlmIChzdGF0dXMgJiAweDA4KQorCQkvKiBWUFAgZmFpbHVyZSAqLworCQlyZXR1cm4gKDEpOworCisJLyogY2hlY2sgZm9yIHN1Y2Nlc2Z1bCBmbGFzaCAqLworCWlmIChzdGF0dXMgJiAweDMwKQorCQkvKiBzZXF1ZW5jZSBlcnJvciAqLworCQlyZXR1cm4gKDEpOworCisJLyogT3RoZXJ3aXNlLCB3ZSB3ZXJlIHN1Y2Nlc3NmdWwgKi8KKwkvKiBjbGVhciBzdGF0dXMgKi8KKwl3cml0ZWIoMHg1MCwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMRFApOworCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkvKiBlbmFibGUgcmVhZHMgKi8KKwl3cml0ZWIoMHhGRiwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMRFApOworCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcHJvZ3JhbV9iaW9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBQcm9ncmFtIHRoZSBCSU9TIG9uIHRoZSBhZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX3Byb2dyYW1fYmlvcyhpcHNfaGFfdCAqIGhhLCBjaGFyICpidWZmZXIsIHVpbnQzMl90IGJ1ZmZlcnNpemUsCisJCSB1aW50MzJfdCBvZmZzZXQpCit7CisJaW50IGk7CisJaW50IHRpbWVvdXQ7CisJdWludDhfdCBzdGF0dXMgPSAwOworCisJTUVUSE9EX1RSQUNFKCJpcHNfcHJvZ3JhbV9iaW9zIiwgMSk7CisKKwlzdGF0dXMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGJ1ZmZlcnNpemU7IGkrKykgeworCQkvKiB3cml0ZSBhIGJ5dGUgKi8KKwkJb3V0bChjcHVfdG9fbGUzMihpICsgb2Zmc2V0KSwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMQVApOworCQlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQlvdXRiKDB4NDAsIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTERQKTsKKwkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkJb3V0YihidWZmZXJbaV0sIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTERQKTsKKwkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkJLyogd2FpdCB1cCB0byBvbmUgc2Vjb25kICovCisJCXRpbWVvdXQgPSAxMDAwOworCQl3aGlsZSAodGltZW91dCA+IDApIHsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpIHsKKwkJCQlvdXRsKDAsIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTEFQKTsKKwkJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCQkJfQorCisJCQlzdGF0dXMgPSBpbmIoaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApOworCisJCQlpZiAoc3RhdHVzICYgMHg4MCkKKwkJCQlicmVhazsKKworCQkJTURFTEFZKDEpOworCQkJdGltZW91dC0tOworCQl9CisKKwkJaWYgKHRpbWVvdXQgPT0gMCkgeworCQkJLyogdGltZW91dCBlcnJvciAqLworCQkJb3V0bCgwLCBoYS0+aW9fYWRkciArIElQU19SRUdfRkxBUCk7CisJCQlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkJCW91dGIoMHhGRiwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApOworCQkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJCQlyZXR1cm4gKDEpOworCQl9CisKKwkJLyogY2hlY2sgdGhlIHN0YXR1cyAqLworCQlpZiAoc3RhdHVzICYgMHgxOCkgeworCQkJLyogcHJvZ3JhbW1pbmcgZXJyb3IgKi8KKwkJCW91dGwoMCwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMQVApOworCQkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJCQlvdXRiKDB4RkYsIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTERQKTsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQkJcmV0dXJuICgxKTsKKwkJfQorCX0JCQkvKiBlbmQgZm9yICovCisKKwkvKiBFbmFibGUgcmVhZGluZyAqLworCW91dGwoMCwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMQVApOworCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwlvdXRiKDB4RkYsIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTERQKTsKKwlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3Byb2dyYW1fYmlvc19tZW1pbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUHJvZ3JhbSB0aGUgQklPUyBvbiB0aGUgYWRhcHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19wcm9ncmFtX2Jpb3NfbWVtaW8oaXBzX2hhX3QgKiBoYSwgY2hhciAqYnVmZmVyLCB1aW50MzJfdCBidWZmZXJzaXplLAorCQkgICAgICAgdWludDMyX3Qgb2Zmc2V0KQoreworCWludCBpOworCWludCB0aW1lb3V0OworCXVpbnQ4X3Qgc3RhdHVzID0gMDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3Byb2dyYW1fYmlvc19tZW1pbyIsIDEpOworCisJc3RhdHVzID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBidWZmZXJzaXplOyBpKyspIHsKKwkJLyogd3JpdGUgYSBieXRlICovCisJCXdyaXRlbChpICsgb2Zmc2V0LCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxBUCk7CisJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJCXdyaXRlYigweDQwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxEUCk7CisJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJCXdyaXRlYihidWZmZXJbaV0sIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTERQKTsKKwkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkJLyogd2FpdCB1cCB0byBvbmUgc2Vjb25kICovCisJCXRpbWVvdXQgPSAxMDAwOworCQl3aGlsZSAodGltZW91dCA+IDApIHsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpIHsKKwkJCQl3cml0ZWwoMCwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMQVApOworCQkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisJCQl9CisKKwkJCXN0YXR1cyA9IHJlYWRiKGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTERQKTsKKworCQkJaWYgKHN0YXR1cyAmIDB4ODApCisJCQkJYnJlYWs7CisKKwkJCU1ERUxBWSgxKTsKKwkJCXRpbWVvdXQtLTsKKwkJfQorCisJCWlmICh0aW1lb3V0ID09IDApIHsKKwkJCS8qIHRpbWVvdXQgZXJyb3IgKi8KKwkJCXdyaXRlbCgwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxBUCk7CisJCQlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkJCXdyaXRlYigweEZGLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxEUCk7CisJCQlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkJCXJldHVybiAoMSk7CisJCX0KKworCQkvKiBjaGVjayB0aGUgc3RhdHVzICovCisJCWlmIChzdGF0dXMgJiAweDE4KSB7CisJCQkvKiBwcm9ncmFtbWluZyBlcnJvciAqLworCQkJd3JpdGVsKDAsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTEFQKTsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQkJd3JpdGViKDB4RkYsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTERQKTsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQkJcmV0dXJuICgxKTsKKwkJfQorCX0JCQkvKiBlbmQgZm9yICovCisKKwkvKiBFbmFibGUgcmVhZGluZyAqLworCXdyaXRlbCgwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxBUCk7CisJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCXdyaXRlYigweEZGLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxEUCk7CisJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc192ZXJpZnlfYmlvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFZlcmlmeSB0aGUgQklPUyBvbiB0aGUgYWRhcHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfdmVyaWZ5X2Jpb3MoaXBzX2hhX3QgKiBoYSwgY2hhciAqYnVmZmVyLCB1aW50MzJfdCBidWZmZXJzaXplLAorCQl1aW50MzJfdCBvZmZzZXQpCit7CisJdWludDhfdCBjaGVja3N1bTsKKwlpbnQgaTsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3ZlcmlmeV9iaW9zIiwgMSk7CisKKwkvKiB0ZXN0IDFzdCBieXRlICovCisJb3V0bCgwLCBoYS0+aW9fYWRkciArIElQU19SRUdfRkxBUCk7CisJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCWlmIChpbmIoaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApICE9IDB4NTUpCisJCXJldHVybiAoMSk7CisKKwlvdXRsKGNwdV90b19sZTMyKDEpLCBoYS0+aW9fYWRkciArIElQU19SRUdfRkxBUCk7CisJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKwlpZiAoaW5iKGhhLT5pb19hZGRyICsgSVBTX1JFR19GTERQKSAhPSAweEFBKQorCQlyZXR1cm4gKDEpOworCisJY2hlY2tzdW0gPSAweGZmOworCWZvciAoaSA9IDI7IGkgPCBidWZmZXJzaXplOyBpKyspIHsKKworCQlvdXRsKGNwdV90b19sZTMyKGkgKyBvZmZzZXQpLCBoYS0+aW9fYWRkciArIElQU19SRUdfRkxBUCk7CisJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJCWNoZWNrc3VtID0gKHVpbnQ4X3QpIGNoZWNrc3VtICsgaW5iKGhhLT5pb19hZGRyICsgSVBTX1JFR19GTERQKTsKKwl9CisKKwlpZiAoY2hlY2tzdW0gIT0gMCkKKwkJLyogZmFpbHVyZSAqLworCQlyZXR1cm4gKDEpOworCWVsc2UKKwkJLyogc3VjY2VzcyAqLworCQlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfdmVyaWZ5X2Jpb3NfbWVtaW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBWZXJpZnkgdGhlIEJJT1Mgb24gdGhlIGFkYXB0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX3ZlcmlmeV9iaW9zX21lbWlvKGlwc19oYV90ICogaGEsIGNoYXIgKmJ1ZmZlciwgdWludDMyX3QgYnVmZmVyc2l6ZSwKKwkJICAgICAgdWludDMyX3Qgb2Zmc2V0KQoreworCXVpbnQ4X3QgY2hlY2tzdW07CisJaW50IGk7CisKKwlNRVRIT0RfVFJBQ0UoImlwc192ZXJpZnlfYmlvc19tZW1pbyIsIDEpOworCisJLyogdGVzdCAxc3QgYnl0ZSAqLworCXdyaXRlbCgwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxBUCk7CisJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCWlmIChyZWFkYihoYS0+bWVtX3B0ciArIElQU19SRUdfRkxEUCkgIT0gMHg1NSkKKwkJcmV0dXJuICgxKTsKKworCXdyaXRlbCgxLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxBUCk7CisJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKwlpZiAocmVhZGIoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMRFApICE9IDB4QUEpCisJCXJldHVybiAoMSk7CisKKwljaGVja3N1bSA9IDB4ZmY7CisJZm9yIChpID0gMjsgaSA8IGJ1ZmZlcnNpemU7IGkrKykgeworCisJCXdyaXRlbChpICsgb2Zmc2V0LCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxBUCk7CisJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJCWNoZWNrc3VtID0KKwkJICAgICh1aW50OF90KSBjaGVja3N1bSArIHJlYWRiKGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTERQKTsKKwl9CisKKwlpZiAoY2hlY2tzdW0gIT0gMCkKKwkJLyogZmFpbHVyZSAqLworCQlyZXR1cm4gKDEpOworCWVsc2UKKwkJLyogc3VjY2VzcyAqLworCQlyZXR1cm4gKDApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgIFJvdXRpbmUgTmFtZTogaXBzX3ZlcnNpb25fY2hlY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIERlcGVuZGVuY2llczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgQXNzdW1lcyB0aGF0IGlwc19yZWFkX2FkYXB0ZXJfc3RhdHVzKCkgaXMgY2FsbGVkIGZpcnN0IGZpbGxpbmcgaW4gICAgICovCisvKiAgICAgdGhlIGRhdGEgZm9yIFN1YlN5c3RlbSBQYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgQ2FsbGVkIGZyb20gaXBzX3dyaXRlX2RyaXZlcl9zdGF0dXMoKSBzbyBpdCBhbHNvIGFzc3VtZXMgTlZSQU0gUGFnZSA1ICovCisvKiAgICAgRGF0YSBpcyBhdmFpbGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZAoraXBzX3ZlcnNpb25fY2hlY2soaXBzX2hhX3QgKiBoYSwgaW50IGludHIpCit7CisJSVBTX1ZFUlNJT05fREFUQSAqVmVyc2lvbkluZm87CisJdWludDhfdCBGaXJtd2FyZVZlcnNpb25bSVBTX0NPTVBBVF9JRF9MRU5HVEggKyAxXTsKKwl1aW50OF90IEJpb3NWZXJzaW9uW0lQU19DT01QQVRfSURfTEVOR1RIICsgMV07CisJaW50IE1hdGNoRXJyb3I7CisJaW50IHJjOworCWNoYXIgQmlvc1N0cmluZ1sxMF07CisJY2hhciBGaXJtd2FyZVN0cmluZ1sxMF07CisKKwlNRVRIT0RfVFJBQ0UoImlwc192ZXJzaW9uX2NoZWNrIiwgMSk7CisKKwlWZXJzaW9uSW5mbyA9ICggSVBTX1ZFUlNJT05fREFUQSAqICkgaGEtPmlvY3RsX2RhdGE7CisKKwltZW1zZXQoRmlybXdhcmVWZXJzaW9uLCAwLCBJUFNfQ09NUEFUX0lEX0xFTkdUSCArIDEpOworCW1lbXNldChCaW9zVmVyc2lvbiwgMCwgSVBTX0NPTVBBVF9JRF9MRU5HVEggKyAxKTsKKworCS8qIEdldCB0aGUgQ29tcGF0aWJsZSBCSU9TIFZlcnNpb24gZnJvbSBOVlJBTSBQYWdlIDUgKi8KKwltZW1jcHkoQmlvc1ZlcnNpb24sIGhhLT5udnJhbS0+Qmlvc0NvbXBhdGliaWxpdHlJRCwKKwkgICAgICAgSVBTX0NPTVBBVF9JRF9MRU5HVEgpOworCisJcmMgPSBJUFNfRkFJTFVSRTsKKwlpZiAoaGEtPnN1YnN5cy0+cGFyYW1bNF0gJiBJUFNfR0VUX1ZFUlNJT05fU1VQUE9SVCkgewkvKiBJZiBWZXJzaW9uaW5nIGlzIFN1cHBvcnRlZCAqLworCQkvKiBHZXQgdGhlIFZlcnNpb24gSW5mbyB3aXRoIGEgR2V0IFZlcnNpb24gQ29tbWFuZCAqLworCQltZW1zZXQoIFZlcnNpb25JbmZvLCAwLCBzaXplb2YgKElQU19WRVJTSU9OX0RBVEEpKTsKKwkJcmMgPSBpcHNfZ2V0X3ZlcnNpb25faW5mbyhoYSwgaGEtPmlvY3RsX2J1c2FkZHIsIGludHIpOworCQlpZiAocmMgPT0gSVBTX1NVQ0NFU1MpCisJCQltZW1jcHkoRmlybXdhcmVWZXJzaW9uLCBWZXJzaW9uSW5mby0+Y29tcGF0aWJpbGl0eUlkLAorCQkJICAgICAgIElQU19DT01QQVRfSURfTEVOR1RIKTsKKwl9CisKKwlpZiAocmMgIT0gSVBTX1NVQ0NFU1MpIHsJLyogSWYgRGF0YSBOb3QgT2J0YWluYWJsZSBmcm9tIGEgR2V0VmVyc2lvbiBDb21tYW5kICovCisJCS8qIEdldCB0aGUgRmlybXdhcmUgVmVyc2lvbiBmcm9tIEVucXVpcnkgRGF0YSAqLworCQltZW1jcHkoRmlybXdhcmVWZXJzaW9uLCBoYS0+ZW5xLT5Db2RlQmxrVmVyc2lvbiwKKwkJICAgICAgIElQU19DT01QQVRfSURfTEVOR1RIKTsKKwl9CisKKwkvKiBwcmludGsoS0VSTl9XQVJOSU5HICJBZGFwdGVyJ3MgQklPUyBWZXJzaW9uICA9ICVzXG4iLCBCaW9zVmVyc2lvbik7ICAgICAgICAgICovCisJLyogcHJpbnRrKEtFUk5fV0FSTklORyAiQklPUyBDb21wYXRpYmxlIFZlcnNpb24gPSAlc1xuIiwgSVBTX0NPTVBBVF9CSU9TKTsgICAgICAqLworCS8qIHByaW50ayhLRVJOX1dBUk5JTkcgIkFkYXB0ZXIncyBGaXJtd2FyZSBWZXJzaW9uICA9ICVzXG4iLCBGaXJtd2FyZVZlcnNpb24pOyAgKi8KKwkvKiBwcmludGsoS0VSTl9XQVJOSU5HICJGaXJtd2FyZSBDb21wYXRpYmxlIFZlcnNpb24gPSAlcyBcbiIsIENvbXBhdGFibGVbIGhhLT5udnJhbS0+YWRhcHRlcl90eXBlIF0pOyAqLworCisJTWF0Y2hFcnJvciA9IDA7CisKKwlpZiAoc3RybmNtcAorCSAgICAoRmlybXdhcmVWZXJzaW9uLCBDb21wYXRhYmxlW2hhLT5udnJhbS0+YWRhcHRlcl90eXBlXSwKKwkgICAgIElQU19DT01QQVRfSURfTEVOR1RIKSAhPSAwKQorCQlNYXRjaEVycm9yID0gMTsKKworCWlmIChzdHJuY21wKEJpb3NWZXJzaW9uLCBJUFNfQ09NUEFUX0JJT1MsIElQU19DT01QQVRfSURfTEVOR1RIKSAhPSAwKQorCQlNYXRjaEVycm9yID0gMTsKKworCWhhLT5udnJhbS0+dmVyc2lvbmluZyA9IDE7CS8qIEluZGljYXRlIHRoZSBEcml2ZXIgU3VwcG9ydHMgVmVyc2lvbmluZyAqLworCisJaWYgKE1hdGNoRXJyb3IpIHsKKwkJaGEtPm52cmFtLT52ZXJzaW9uX21pc21hdGNoID0gMTsKKwkJaWYgKGlwc19jZF9ib290ID09IDApIHsKKwkJCXN0cm5jcHkoJkJpb3NTdHJpbmdbMF0sIGhhLT5udnJhbS0+Ymlvc19oaWdoLCA0KTsKKwkJCXN0cm5jcHkoJkJpb3NTdHJpbmdbNF0sIGhhLT5udnJhbS0+Ymlvc19sb3csIDQpOworCQkJQmlvc1N0cmluZ1s4XSA9IDA7CisKKwkJCXN0cm5jcHkoJkZpcm13YXJlU3RyaW5nWzBdLCBoYS0+ZW5xLT5Db2RlQmxrVmVyc2lvbiwgOCk7CisJCQlGaXJtd2FyZVN0cmluZ1s4XSA9IDA7CisKKwkJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJCSAgICJXYXJuaW5nICEgISAhIFNlcnZlUkFJRCBWZXJzaW9uIE1pc21hdGNoXG4iKTsKKwkJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJCSAgICJCaW9zID0gJXMsIEZpcm13YXJlID0gJXMsIERldmljZSBEcml2ZXIgPSAlcyVzXG4iLAorCQkJCSAgIEJpb3NTdHJpbmcsIEZpcm13YXJlU3RyaW5nLCBJUFNfVkVSU0lPTl9ISUdILAorCQkJCSAgIElQU19WRVJTSU9OX0xPVyk7CisJCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgaGEtPnBjaWRldiwKKwkJCQkgICAiVGhlc2UgbGV2ZWxzIHNob3VsZCBtYXRjaCB0byBhdm9pZCBwb3NzaWJsZSBjb21wYXRpYmlsaXR5IHByb2JsZW1zLlxuIik7CisJCX0KKwl9IGVsc2UgeworCQloYS0+bnZyYW0tPnZlcnNpb25fbWlzbWF0Y2ggPSAwOworCX0KKworCXJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICBSb3V0aW5lIE5hbWU6IGlwc19nZXRfdmVyc2lvbl9pbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIElzc3VlIGFuIGludGVybmFsIEdFVFZFUlNJT04gQ29tbWFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIDAgaWYgU3VjY2Vzc2Z1bCwgZWxzZSBub24temVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludAoraXBzX2dldF92ZXJzaW9uX2luZm8oaXBzX2hhX3QgKiBoYSwgZG1hX2FkZHJfdCBCdWZmZXIsIGludCBpbnRyKQoreworCWlwc19zY2JfdCAqc2NiOworCWludCByYzsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2dldF92ZXJzaW9uX2luZm8iLCAxKTsKKworCXNjYiA9ICZoYS0+c2Nic1toYS0+bWF4X2NtZHMgLSAxXTsKKworCWlwc19pbml0X3NjYihoYSwgc2NiKTsKKworCXNjYi0+dGltZW91dCA9IGlwc19jbWRfdGltZW91dDsKKwlzY2ItPmNkYlswXSA9IElQU19DTURfR0VUX1ZFUlNJT05fSU5GTzsKKwlzY2ItPmNtZC52ZXJzaW9uX2luZm8ub3BfY29kZSA9IElQU19DTURfR0VUX1ZFUlNJT05fSU5GTzsKKwlzY2ItPmNtZC52ZXJzaW9uX2luZm8uY29tbWFuZF9pZCA9IElQU19DT01NQU5EX0lEKGhhLCBzY2IpOworCXNjYi0+Y21kLnZlcnNpb25faW5mby5yZXNlcnZlZCA9IDA7CisJc2NiLT5jbWQudmVyc2lvbl9pbmZvLmNvdW50ID0gc2l6ZW9mIChJUFNfVkVSU0lPTl9EQVRBKTsKKwlzY2ItPmNtZC52ZXJzaW9uX2luZm8ucmVzZXJ2ZWQyID0gMDsKKwlzY2ItPmRhdGFfbGVuID0gc2l6ZW9mIChJUFNfVkVSU0lPTl9EQVRBKTsKKwlzY2ItPmRhdGFfYnVzYWRkciA9IEJ1ZmZlcjsKKwlzY2ItPmNtZC52ZXJzaW9uX2luZm8uYnVmZmVyX2FkZHIgPSBCdWZmZXI7CisJc2NiLT5mbGFncyA9IDA7CisKKwkvKiBpc3N1ZSBjb21tYW5kICovCisJcmMgPSBpcHNfc2VuZF93YWl0KGhhLCBzY2IsIGlwc19jbWRfdGltZW91dCwgaW50cik7CisJcmV0dXJuIChyYyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19hYm9ydF9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGNsZWFudXAgcm91dGluZSBmb3IgYSBmYWlsZWQgYWRhcHRlciBpbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2Fib3J0X2luaXQoaXBzX2hhX3QgKiBoYSwgaW50IGluZGV4KQoreworCWhhLT5hY3RpdmUgPSAwOworCWlwc19mcmVlKGhhKTsKKwlpcHNfaGFbaW5kZXhdID0gTlVMTDsKKwlpcHNfc2hbaW5kZXhdID0gTlVMTDsKKwlyZXR1cm4gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19zaGlmdF9jb250cm9sbGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGhlbHBlciBmdW5jdGlvbiBmb3Igb3JkZXJpbmcgYWRhcHRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19zaGlmdF9jb250cm9sbGVycyhpbnQgbG93aW5kZXgsIGludCBoaWdoaW5kZXgpCit7CisJaXBzX2hhX3QgKmhhX3NhdiA9IGlwc19oYVtoaWdoaW5kZXhdOworCXN0cnVjdCBTY3NpX0hvc3QgKnNoX3NhdiA9IGlwc19zaFtoaWdoaW5kZXhdOworCWludCBpOworCisJZm9yIChpID0gaGlnaGluZGV4OyBpID4gbG93aW5kZXg7IGktLSkgeworCQlpcHNfaGFbaV0gPSBpcHNfaGFbaSAtIDFdOworCQlpcHNfc2hbaV0gPSBpcHNfc2hbaSAtIDFdOworCQlpcHNfaGFbaV0tPmhvc3RfbnVtID0gaTsKKwl9CisJaGFfc2F2LT5ob3N0X251bSA9IGxvd2luZGV4OworCWlwc19oYVtsb3dpbmRleF0gPSBoYV9zYXY7CisJaXBzX3NoW2xvd2luZGV4XSA9IHNoX3NhdjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX29yZGVyX2NvbnRyb2xsZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcGxhY2UgY29udHJvbGxlcnMgaXMgdGhlICJwcm9wZXIiIGJvb3Qgb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX29yZGVyX2NvbnRyb2xsZXJzKHZvaWQpCit7CisJaW50IGksIGosIHRtcCwgcG9zaXRpb24gPSAwOworCUlQU19OVlJBTV9QNSAqbnZyYW07CisJaWYgKCFpcHNfaGFbMF0pCisJCXJldHVybjsKKwludnJhbSA9IGlwc19oYVswXS0+bnZyYW07CisKKwlpZiAobnZyYW0tPmFkYXB0ZXJfb3JkZXJbMF0pIHsKKwkJZm9yIChpID0gMTsgaSA8PSBudnJhbS0+YWRhcHRlcl9vcmRlclswXTsgaSsrKSB7CisJCQlmb3IgKGogPSBwb3NpdGlvbjsgaiA8IGlwc19udW1fY29udHJvbGxlcnM7IGorKykgeworCQkJCXN3aXRjaCAoaXBzX2hhW2pdLT5hZF90eXBlKSB7CisJCQkJY2FzZSBJUFNfQURUWVBFX1NFUlZFUkFJRDZNOgorCQkJCWNhc2UgSVBTX0FEVFlQRV9TRVJWRVJBSUQ3TToKKwkJCQkJaWYgKG52cmFtLT5hZGFwdGVyX29yZGVyW2ldID09ICdNJykgeworCQkJCQkJaXBzX3NoaWZ0X2NvbnRyb2xsZXJzKHBvc2l0aW9uLAorCQkJCQkJCQkgICAgICBqKTsKKwkJCQkJCXBvc2l0aW9uKys7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJUFNfQURUWVBFX1NFUlZFUkFJRDRMOgorCQkJCWNhc2UgSVBTX0FEVFlQRV9TRVJWRVJBSUQ0TToKKwkJCQljYXNlIElQU19BRFRZUEVfU0VSVkVSQUlENE1YOgorCQkJCWNhc2UgSVBTX0FEVFlQRV9TRVJWRVJBSUQ0TFg6CisJCQkJCWlmIChudnJhbS0+YWRhcHRlcl9vcmRlcltpXSA9PSAnTicpIHsKKwkJCQkJCWlwc19zaGlmdF9jb250cm9sbGVycyhwb3NpdGlvbiwKKwkJCQkJCQkJICAgICAgaik7CisJCQkJCQlwb3NpdGlvbisrOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSVBTX0FEVFlQRV9TRVJWRVJBSUQ2SToKKwkJCQljYXNlIElQU19BRFRZUEVfU0VSVkVSQUlENUkyOgorCQkJCWNhc2UgSVBTX0FEVFlQRV9TRVJWRVJBSUQ1STE6CisJCQkJY2FzZSBJUFNfQURUWVBFX1NFUlZFUkFJRDdrOgorCQkJCQlpZiAobnZyYW0tPmFkYXB0ZXJfb3JkZXJbaV0gPT0gJ1MnKSB7CisJCQkJCQlpcHNfc2hpZnRfY29udHJvbGxlcnMocG9zaXRpb24sCisJCQkJCQkJCSAgICAgIGopOworCQkJCQkJcG9zaXRpb24rKzsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIElQU19BRFRZUEVfU0VSVkVSQUlEOgorCQkJCWNhc2UgSVBTX0FEVFlQRV9TRVJWRVJBSUQyOgorCQkJCWNhc2UgSVBTX0FEVFlQRV9OQVZBSk86CisJCQkJY2FzZSBJUFNfQURUWVBFX0tJT1dBOgorCQkJCWNhc2UgSVBTX0FEVFlQRV9TRVJWRVJBSUQzTDoKKwkJCQljYXNlIElQU19BRFRZUEVfU0VSVkVSQUlEMzoKKwkJCQljYXNlIElQU19BRFRZUEVfU0VSVkVSQUlENEg6CisJCQkJCWlmIChudnJhbS0+YWRhcHRlcl9vcmRlcltpXSA9PSAnQScpIHsKKwkJCQkJCWlwc19zaGlmdF9jb250cm9sbGVycyhwb3NpdGlvbiwKKwkJCQkJCQkJICAgICAgaik7CisJCQkJCQlwb3NpdGlvbisrOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBpZiBhZGFwdGVyX29yZGVyWzBdLCB0aGVuIG9yZGVyaW5nIGlzIGNvbXBsZXRlICovCisJCXJldHVybjsKKwl9CisJLyogb2xkIGJpb3MsIHVzZSBvbGRlciBvcmRlcmluZyAqLworCXRtcCA9IDA7CisJZm9yIChpID0gcG9zaXRpb247IGkgPCBpcHNfbnVtX2NvbnRyb2xsZXJzOyBpKyspIHsKKwkJaWYgKGlwc19oYVtpXS0+YWRfdHlwZSA9PSBJUFNfQURUWVBFX1NFUlZFUkFJRDVJMiB8fAorCQkgICAgaXBzX2hhW2ldLT5hZF90eXBlID09IElQU19BRFRZUEVfU0VSVkVSQUlENUkxKSB7CisJCQlpcHNfc2hpZnRfY29udHJvbGxlcnMocG9zaXRpb24sIGkpOworCQkJcG9zaXRpb24rKzsKKwkJCXRtcCA9IDE7CisJCX0KKwl9CisJLyogaWYgdGhlcmUgd2VyZSBubyA1SSBjYXJkcywgdGhlbiBkb24ndCBkbyBhbnkgZXh0cmEgb3JkZXJpbmcgKi8KKwlpZiAoIXRtcCkKKwkJcmV0dXJuOworCWZvciAoaSA9IHBvc2l0aW9uOyBpIDwgaXBzX251bV9jb250cm9sbGVyczsgaSsrKSB7CisJCWlmIChpcHNfaGFbaV0tPmFkX3R5cGUgPT0gSVBTX0FEVFlQRV9TRVJWRVJBSUQ0TCB8fAorCQkgICAgaXBzX2hhW2ldLT5hZF90eXBlID09IElQU19BRFRZUEVfU0VSVkVSQUlENE0gfHwKKwkJICAgIGlwc19oYVtpXS0+YWRfdHlwZSA9PSBJUFNfQURUWVBFX1NFUlZFUkFJRDRMWCB8fAorCQkgICAgaXBzX2hhW2ldLT5hZF90eXBlID09IElQU19BRFRZUEVfU0VSVkVSQUlENE1YKSB7CisJCQlpcHNfc2hpZnRfY29udHJvbGxlcnMocG9zaXRpb24sIGkpOworCQkJcG9zaXRpb24rKzsKKwkJfQorCX0KKworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3JlZ2lzdGVyX3Njc2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcGVyZm9ybSBhbnkgcmVnaXN0cmF0aW9uIGFuZCBzZXR1cCB3aXRoIHRoZSBzY3NpIGxheWVyICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfcmVnaXN0ZXJfc2NzaShpbnQgaW5kZXgpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2g7CisJaXBzX2hhX3QgKmhhLCAqb2xkaGEgPSBpcHNfaGFbaW5kZXhdOworCXNoID0gc2NzaV9ob3N0X2FsbG9jKCZpcHNfZHJpdmVyX3RlbXBsYXRlLCBzaXplb2YgKGlwc19oYV90KSk7CisJaWYgKCFzaCkgeworCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgb2xkaGEtPnBjaWRldiwKKwkJCSAgICJVbmFibGUgdG8gcmVnaXN0ZXIgY29udHJvbGxlciB3aXRoIFNDU0kgc3Vic3lzdGVtXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwloYSA9IElQU19IQShzaCk7CisJbWVtY3B5KGhhLCBvbGRoYSwgc2l6ZW9mIChpcHNfaGFfdCkpOworCWZyZWVfaXJxKG9sZGhhLT5pcnEsIG9sZGhhKTsKKwkvKiBJbnN0YWxsIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aXRoIHRoZSBuZXcgaGEgKi8KKwlpZiAocmVxdWVzdF9pcnEoaGEtPmlycSwgZG9faXBzaW50ciwgU0FfU0hJUlEsIGlwc19uYW1lLCBoYSkpIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkgICAiVW5hYmxlIHRvIGluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXJcbiIpOworCQlzY3NpX2hvc3RfcHV0KHNoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWtmcmVlKG9sZGhhKTsKKwlpcHNfc2hbaW5kZXhdID0gc2g7CisJaXBzX2hhW2luZGV4XSA9IGhhOworCUlQU19TQ1NJX1NFVF9ERVZJQ0Uoc2gsIGhhKTsKKworCS8qIFN0b3JlIGF3YXkgbmVlZGVkIHZhbHVlcyBmb3IgbGF0ZXIgdXNlICovCisJc2gtPmlvX3BvcnQgPSBoYS0+aW9fYWRkcjsKKwlzaC0+bl9pb19wb3J0ID0gaGEtPmlvX2FkZHIgPyAyNTUgOiAwOworCXNoLT51bmlxdWVfaWQgPSAoaGEtPmlvX2FkZHIpID8gaGEtPmlvX2FkZHIgOiBoYS0+bWVtX2FkZHI7CisJc2gtPmlycSA9IGhhLT5pcnE7CisJc2gtPnNnX3RhYmxlc2l6ZSA9IHNoLT5ob3N0dC0+c2dfdGFibGVzaXplOworCXNoLT5jYW5fcXVldWUgPSBzaC0+aG9zdHQtPmNhbl9xdWV1ZTsKKwlzaC0+Y21kX3Blcl9sdW4gPSBzaC0+aG9zdHQtPmNtZF9wZXJfbHVuOworCXNoLT51bmNoZWNrZWRfaXNhX2RtYSA9IHNoLT5ob3N0dC0+dW5jaGVja2VkX2lzYV9kbWE7CisJc2gtPnVzZV9jbHVzdGVyaW5nID0gc2gtPmhvc3R0LT51c2VfY2x1c3RlcmluZzsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsNykKKwlzaC0+bWF4X3NlY3RvcnMgPSAxMjg7CisjZW5kaWYKKworCXNoLT5tYXhfaWQgPSBoYS0+bnRhcmdldHM7CisJc2gtPm1heF9sdW4gPSBoYS0+bmx1bjsKKwlzaC0+bWF4X2NoYW5uZWwgPSBoYS0+bmJ1cyAtIDE7CisJc2gtPmNhbl9xdWV1ZSA9IGhhLT5tYXhfY21kcyAtIDE7CisKKwlJUFNfQUREX0hPU1Qoc2gsIE5VTEwpOworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgIFJvdXRpbmUgTmFtZTogaXBzX3JlbW92ZV9kZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUmVtb3ZlIG9uZSBBZGFwdGVyICggSG90IFBsdWdnaW5nICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBfX2RldmV4aXQKK2lwc19yZW1vdmVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCWludCBpOworCXN0cnVjdCBTY3NpX0hvc3QgKnNoOworCWlwc19oYV90ICpoYTsKKworCWZvciAoaSA9IDA7IGkgPCBJUFNfTUFYX0FEQVBURVJTOyBpKyspIHsKKwkJaGEgPSBpcHNfaGFbaV07CisJCWlmIChoYSkgeworCQkJaWYgKChwY2lfZGV2LT5idXMtPm51bWJlciA9PSBoYS0+cGNpZGV2LT5idXMtPm51bWJlcikgJiYKKwkJCSAgICAocGNpX2Rldi0+ZGV2Zm4gPT0gaGEtPnBjaWRldi0+ZGV2Zm4pKSB7CisJCQkJc2ggPSBpcHNfc2hbaV07CisJCQkJaXBzX3JlbGVhc2Uoc2gpOworCQkJfQorCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfbW9kdWxlX2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBmdW5jdGlvbiBjYWxsZWQgb24gbW9kdWxlIGxvYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgX19pbml0CitpcHNfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpZiAocGNpX21vZHVsZV9pbml0KCZpcHNfcGNpX2RyaXZlcikgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpcHNfZHJpdmVyX3RlbXBsYXRlLm1vZHVsZSA9IFRISVNfTU9EVUxFOworCWlwc19vcmRlcl9jb250cm9sbGVycygpOworCWlmIChJUFNfUkVHSVNURVJfSE9TVFMoJmlwc19kcml2ZXJfdGVtcGxhdGUpKSB7CisJCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaXBzX3BjaV9kcml2ZXIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZpcHNfbm90aWZpZXIpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfbW9kdWxlX2V4aXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBmdW5jdGlvbiBjYWxsZWQgb24gbW9kdWxlIHVubG9hZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9fZXhpdAoraXBzX21vZHVsZV9leGl0KHZvaWQpCit7CisJSVBTX1VOUkVHSVNURVJfSE9TVFMoJmlwc19kcml2ZXJfdGVtcGxhdGUpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaXBzX3BjaV9kcml2ZXIpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZpcHNfbm90aWZpZXIpOworfQorCittb2R1bGVfaW5pdChpcHNfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoaXBzX21vZHVsZV9leGl0KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICBSb3V0aW5lIE5hbWU6IGlwc19pbnNlcnRfZGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIEFkZCBPbmUgQWRhcHRlciAoIEhvdCBQbHVnICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIDAgaWYgU3VjY2Vzc2Z1bCwgZWxzZSBub24temVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBfX2RldmluaXQKK2lwc19pbnNlcnRfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWludCBpbmRleDsKKwlpbnQgcmM7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19pbnNlcnRfZGV2aWNlIiwgMSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpKQorCQlyZXR1cm4gLTE7CisKKwlyYyA9IGlwc19pbml0X3BoYXNlMShwY2lfZGV2LCAmaW5kZXgpOworCWlmIChyYyA9PSBTVUNDRVNTKQorCQlyYyA9IGlwc19pbml0X3BoYXNlMihpbmRleCk7CisKKwlpZiAoaXBzX2hvdHBsdWcpCisJCWlmIChpcHNfcmVnaXN0ZXJfc2NzaShpbmRleCkpIHsKKwkJCWlwc19mcmVlKGlwc19oYVtpbmRleF0pOworCQkJcmMgPSAtMTsKKwkJfQorCisJaWYgKHJjID09IFNVQ0NFU1MpCisJCWlwc19udW1fY29udHJvbGxlcnMrKzsKKworCWlwc19uZXh0X2NvbnRyb2xsZXIgPSBpcHNfbnVtX2NvbnRyb2xsZXJzOworCXJldHVybiByYzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICBSb3V0aW5lIE5hbWU6IGlwc19pbml0X3BoYXNlMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIEFkYXB0ZXIgSW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIDAgaWYgU3VjY2Vzc2Z1bCwgZWxzZSBub24temVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludAoraXBzX2luaXRfcGhhc2UxKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBpbnQgKmluZGV4UHRyKQoreworCWlwc19oYV90ICpoYTsKKwl1aW50MzJfdCBpb19hZGRyOworCXVpbnQzMl90IG1lbV9hZGRyOworCXVpbnQzMl90IGlvX2xlbjsKKwl1aW50MzJfdCBtZW1fbGVuOworCXVpbnQ4X3QgcmV2aXNpb25faWQ7CisJdWludDhfdCBidXM7CisJdWludDhfdCBmdW5jOworCXVpbnQ4X3QgaXJxOworCXVpbnQxNl90IHN1YmRldmljZV9pZDsKKwlpbnQgajsKKwlpbnQgaW5kZXg7CisJZG1hX2FkZHJfdCBkbWFfYWRkcmVzczsKKwljaGFyIF9faW9tZW0gKmlvcmVtYXBfcHRyOworCWNoYXIgX19pb21lbSAqbWVtX3B0cjsKKwl1aW50MzJfdCBJc0RlYWQ7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19pbml0X3BoYXNlMSIsIDEpOworCWluZGV4ID0gSVBTX01BWF9BREFQVEVSUzsKKwlmb3IgKGogPSAwOyBqIDwgSVBTX01BWF9BREFQVEVSUzsgaisrKSB7CisJCWlmIChpcHNfaGFbal0gPT0gMCkgeworCQkJaW5kZXggPSBqOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaW5kZXggPj0gSVBTX01BWF9BREFQVEVSUykKKwkJcmV0dXJuIC0xOworCisJLyogc3R1ZmYgdGhhdCB3ZSBnZXQgaW4gZGV2ICovCisJaXJxID0gcGNpX2Rldi0+aXJxOworCWJ1cyA9IHBjaV9kZXYtPmJ1cy0+bnVtYmVyOworCWZ1bmMgPSBwY2lfZGV2LT5kZXZmbjsKKworCS8qIEluaXQgTUVNL0lPIGFkZHJlc3NlcyB0byAwICovCisJbWVtX2FkZHIgPSAwOworCWlvX2FkZHIgPSAwOworCW1lbV9sZW4gPSAwOworCWlvX2xlbiA9IDA7CisKKwlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisJCWlmICghcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIGopKQorCQkJYnJlYWs7CisKKwkJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwY2lfZGV2LCBqKSAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJCWlvX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2Rldiwgaik7CisJCQlpb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIGopOworCQl9IGVsc2UgeworCQkJbWVtX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2Rldiwgaik7CisJCQltZW1fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCBqKTsKKwkJfQorCX0KKworCS8qIHNldHVwIG1lbW9yeSBtYXBwZWQgYXJlYSAoaWYgYXBwbGljYWJsZSkgKi8KKwlpZiAobWVtX2FkZHIpIHsKKwkJdWludDMyX3QgYmFzZTsKKwkJdWludDMyX3Qgb2ZmczsKKworCQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihtZW1fYWRkciwgbWVtX2xlbiwgImlwcyIpKSB7CisJCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgcGNpX2RldiwKKwkJCQkgICAiQ291bGRuJ3QgYWxsb2NhdGUgSU8gTWVtb3J5IHNwYWNlICV4IGxlbiAlZC5cbiIsCisJCQkJICAgbWVtX2FkZHIsIG1lbV9sZW4pOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJYmFzZSA9IG1lbV9hZGRyICYgUEFHRV9NQVNLOworCQlvZmZzID0gbWVtX2FkZHIgLSBiYXNlOworCQlpb3JlbWFwX3B0ciA9IGlvcmVtYXAoYmFzZSwgUEFHRV9TSVpFKTsKKwkJbWVtX3B0ciA9IGlvcmVtYXBfcHRyICsgb2ZmczsKKwl9IGVsc2UgeworCQlpb3JlbWFwX3B0ciA9IE5VTEw7CisJCW1lbV9wdHIgPSBOVUxMOworCX0KKworCS8qIHNldHVwIEkvTyBtYXBwZWQgYXJlYSAoaWYgYXBwbGljYWJsZSkgKi8KKwlpZiAoaW9fYWRkcikgeworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvX2FkZHIsIGlvX2xlbiwgImlwcyIpKSB7CisJCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgcGNpX2RldiwKKwkJCQkgICAiQ291bGRuJ3QgYWxsb2NhdGUgSU8gc3BhY2UgJXggbGVuICVkLlxuIiwKKwkJCQkgICBpb19hZGRyLCBpb19sZW4pOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJLyogZ2V0IHRoZSByZXZpc2lvbiBJRCAqLworCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZyZXZpc2lvbl9pZCkpIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIHBjaV9kZXYsICJDYW4ndCBnZXQgcmV2aXNpb24gaWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXN1YmRldmljZV9pZCA9IHBjaV9kZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisKKwkvKiBmb3VuZCBhIGNvbnRyb2xsZXIgKi8KKwloYSA9IGttYWxsb2Moc2l6ZW9mIChpcHNfaGFfdCksIEdGUF9LRVJORUwpOworCWlmIChoYSA9PSBOVUxMKSB7CisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBwY2lfZGV2LAorCQkJICAgIlVuYWJsZSB0byBhbGxvY2F0ZSB0ZW1wb3JhcnkgaGEgc3RydWN0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbXNldChoYSwgMCwgc2l6ZW9mIChpcHNfaGFfdCkpOworCisJaXBzX3NoW2luZGV4XSA9IE5VTEw7CisJaXBzX2hhW2luZGV4XSA9IGhhOworCWhhLT5hY3RpdmUgPSAxOworCisJLyogU3RvcmUgaW5mbyBpbiBIQSBzdHJ1Y3R1cmUgKi8KKwloYS0+aXJxID0gaXJxOworCWhhLT5pb19hZGRyID0gaW9fYWRkcjsKKwloYS0+aW9fbGVuID0gaW9fbGVuOworCWhhLT5tZW1fYWRkciA9IG1lbV9hZGRyOworCWhhLT5tZW1fbGVuID0gbWVtX2xlbjsKKwloYS0+bWVtX3B0ciA9IG1lbV9wdHI7CisJaGEtPmlvcmVtYXBfcHRyID0gaW9yZW1hcF9wdHI7CisJaGEtPmhvc3RfbnVtID0gKHVpbnQzMl90KSBpbmRleDsKKwloYS0+cmV2aXNpb25faWQgPSByZXZpc2lvbl9pZDsKKwloYS0+c2xvdF9udW0gPSBQQ0lfU0xPVChwY2lfZGV2LT5kZXZmbik7CisJaGEtPmRldmljZV9pZCA9IHBjaV9kZXYtPmRldmljZTsKKwloYS0+c3ViZGV2aWNlX2lkID0gc3ViZGV2aWNlX2lkOworCWhhLT5wY2lkZXYgPSBwY2lfZGV2OworCisJLyoKKwkgKiBTZXQgdGhlIHBjaV9kZXYncyBkbWFfbWFzay4gIE5vdCBhbGwgYWRhcHRlcnMgc3VwcG9ydCA2NGJpdAorCSAqIGFkZHJlc3Npbmcgc28gZG9uJ3QgZW5hYmxlIGl0IGlmIHRoZSBhZGFwdGVyIGNhbid0IHN1cHBvcnQKKwkgKiBpdCEgIEFsc28sIGRvbid0IHVzZSA2NGJpdCBhZGRyZXNzaW5nIGlmIGRtYSBhZGRyZXNzZXMKKwkgKiBhcmUgZ3VhcmFudGVlZCB0byBiZSA8IDRHLgorCSAqLworCWlmIChJUFNfRU5BQkxFX0RNQTY0ICYmIElQU19IQVNfRU5IX1NHTElTVChoYSkgJiYKKwkgICAgIXBjaV9zZXRfZG1hX21hc2soaGEtPnBjaWRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSkgeworCQkoaGEpLT5mbGFncyB8PSBJUFNfSEFfRU5IX1NHOworCX0gZWxzZSB7CisJCWlmIChwY2lfc2V0X2RtYV9tYXNrKGhhLT5wY2lkZXYsIDB4ZmZmZmZmZmZVTEwpICE9IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBzZXQgRE1BIE1hc2tcbiIpOworCQkJcmV0dXJuIGlwc19hYm9ydF9pbml0KGhhLCBpbmRleCk7CisJCX0KKwl9CisJaWYoaXBzX2NkX2Jvb3QgJiYgIWlwc19GbGFzaERhdGEpeworCQlpcHNfRmxhc2hEYXRhID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2RldiwgUEFHRV9TSVpFIDw8IDcsCisJCQkJCQkgICAgICZpcHNfZmxhc2hidXNhZGRyKTsKKwl9CisKKwloYS0+ZW5xID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2Rldiwgc2l6ZW9mIChJUFNfRU5RKSwKKwkJCQkgICAgICAgJmhhLT5lbnFfYnVzYWRkcik7CisJaWYgKCFoYS0+ZW5xKSB7CisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBwY2lfZGV2LAorCQkJICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBob3N0IGlucXVpcnkgc3RydWN0dXJlXG4iKTsKKwkJcmV0dXJuIGlwc19hYm9ydF9pbml0KGhhLCBpbmRleCk7CisJfQorCisJaGEtPmFkYXB0ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2Rldiwgc2l6ZW9mIChJUFNfQURBUFRFUikgKworCQkJCQkgc2l6ZW9mIChJUFNfSU9fQ01EKSwgJmRtYV9hZGRyZXNzKTsKKwlpZiAoIWhhLT5hZGFwdCkgeworCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgcGNpX2RldiwKKwkJCSAgICJVbmFibGUgdG8gYWxsb2NhdGUgaG9zdCBhZGFwdCAmIGR1bW15IHN0cnVjdHVyZXNcbiIpOworCQlyZXR1cm4gaXBzX2Fib3J0X2luaXQoaGEsIGluZGV4KTsKKwl9CisJaGEtPmFkYXB0LT5od19zdGF0dXNfc3RhcnQgPSBkbWFfYWRkcmVzczsKKwloYS0+ZHVtbXkgPSAodm9pZCAqKSAoaGEtPmFkYXB0ICsgMSk7CisKKworCisJaGEtPmxvZ2ljYWxfZHJpdmVfaW5mbyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBjaV9kZXYsIHNpemVvZiAoSVBTX0xEX0lORk8pLCAmZG1hX2FkZHJlc3MpOworCWlmICghaGEtPmxvZ2ljYWxfZHJpdmVfaW5mbykgeworCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgcGNpX2RldiwKKwkJCSAgICJVbmFibGUgdG8gYWxsb2NhdGUgbG9naWNhbCBkcml2ZSBpbmZvIHN0cnVjdHVyZVxuIik7CisJCXJldHVybiBpcHNfYWJvcnRfaW5pdChoYSwgaW5kZXgpOworCX0KKwloYS0+bG9naWNhbF9kcml2ZV9pbmZvX2RtYV9hZGRyID0gZG1hX2FkZHJlc3M7CisKKworCWhhLT5jb25mID0ga21hbGxvYyhzaXplb2YgKElQU19DT05GKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWhhLT5jb25mKSB7CisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBwY2lfZGV2LAorCQkJICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBob3N0IGNvbmYgc3RydWN0dXJlXG4iKTsKKwkJcmV0dXJuIGlwc19hYm9ydF9pbml0KGhhLCBpbmRleCk7CisJfQorCisJaGEtPm52cmFtID0ga21hbGxvYyhzaXplb2YgKElQU19OVlJBTV9QNSksIEdGUF9LRVJORUwpOworCisJaWYgKCFoYS0+bnZyYW0pIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIHBjaV9kZXYsCisJCQkgICAiVW5hYmxlIHRvIGFsbG9jYXRlIGhvc3QgTlZSQU0gc3RydWN0dXJlXG4iKTsKKwkJcmV0dXJuIGlwc19hYm9ydF9pbml0KGhhLCBpbmRleCk7CisJfQorCisJaGEtPnN1YnN5cyA9IGttYWxsb2Moc2l6ZW9mIChJUFNfU1VCU1lTKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWhhLT5zdWJzeXMpIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIHBjaV9kZXYsCisJCQkgICAiVW5hYmxlIHRvIGFsbG9jYXRlIGhvc3Qgc3Vic3lzdGVtIHN0cnVjdHVyZVxuIik7CisJCXJldHVybiBpcHNfYWJvcnRfaW5pdChoYSwgaW5kZXgpOworCX0KKworCS8qIHRoZSBpb2N0bCBidWZmZXIgaXMgbm93IHVzZWQgZHVyaW5nIGFkYXB0ZXIgaW5pdGlhbGl6YXRpb24sIHNvIGl0cworCSAqIHN1Y2Nlc3NmdWwgYWxsb2NhdGlvbiBpcyBub3cgcmVxdWlyZWQgKi8KKwlpZiAoaXBzX2lvY3Rsc2l6ZSA8IFBBR0VfU0laRSkKKwkJaXBzX2lvY3Rsc2l6ZSA9IFBBR0VfU0laRTsKKworCWhhLT5pb2N0bF9kYXRhID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2RldiwgaXBzX2lvY3Rsc2l6ZSwKKwkJCQkJICAgICAgJmhhLT5pb2N0bF9idXNhZGRyKTsKKwloYS0+aW9jdGxfbGVuID0gaXBzX2lvY3Rsc2l6ZTsKKwlpZiAoIWhhLT5pb2N0bF9kYXRhKSB7CisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBwY2lfZGV2LAorCQkJICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBJT0NUTCBkYXRhXG4iKTsKKwkJcmV0dXJuIGlwc19hYm9ydF9pbml0KGhhLCBpbmRleCk7CisJfQorCisJLyoKKwkgKiBTZXR1cCBGdW5jdGlvbnMKKwkgKi8KKwlpcHNfc2V0dXBfZnVuY2xpc3QoaGEpOworCisJaWYgKChJUFNfSVNfTU9SUEhFVVMoaGEpKSB8fCAoSVBTX0lTX01BUkNPKGhhKSkpIHsKKwkJLyogSWYgTW9ycGhldXMgYXBwZWFycyBkZWFkLCByZXNldCBpdCAqLworCQlJc0RlYWQgPSByZWFkbChoYS0+bWVtX3B0ciArIElQU19SRUdfSTk2MF9NU0cxKTsKKwkJaWYgKElzRGVhZCA9PSAweERFQURCRUVGKSB7CisJCQlpcHNfcmVzZXRfbW9ycGhldXMoaGEpOworCQl9CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBjYXJkIGlmIGl0IGlzbid0IGFscmVhZHkKKwkgKi8KKworCWlmICghKCpoYS0+ZnVuYy5pc2luaXQpIChoYSkpIHsKKwkJaWYgKCEoKmhhLT5mdW5jLmluaXQpIChoYSkpIHsKKwkJCS8qCisJCQkgKiBJbml0aWFsaXphdGlvbiBmYWlsZWQKKwkJCSAqLworCQkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIHBjaV9kZXYsCisJCQkJICAgIlVuYWJsZSB0byBpbml0aWFsaXplIGNvbnRyb2xsZXJcbiIpOworCQkJcmV0dXJuIGlwc19hYm9ydF9pbml0KGhhLCBpbmRleCk7CisJCX0KKwl9CisKKwkqaW5kZXhQdHIgPSBpbmRleDsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICBSb3V0aW5lIE5hbWU6IGlwc19pbml0X3BoYXNlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIEFkYXB0ZXIgSW5pdGlhbGl6YXRpb24gUGhhc2UgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIDAgaWYgU3VjY2Vzc2Z1bCwgZWxzZSBub24temVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludAoraXBzX2luaXRfcGhhc2UyKGludCBpbmRleCkKK3sKKwlpcHNfaGFfdCAqaGE7CisKKwloYSA9IGlwc19oYVtpbmRleF07CisKKwlNRVRIT0RfVFJBQ0UoImlwc19pbml0X3BoYXNlMiIsIDEpOworCWlmICghaGEtPmFjdGl2ZSkgeworCQlpcHNfaGFbaW5kZXhdID0gTlVMTDsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEluc3RhbGwgdGhlIGludGVycnVwdCBoYW5kbGVyICovCisJaWYgKHJlcXVlc3RfaXJxKGhhLT5pcnEsIGRvX2lwc2ludHIsIFNBX1NISVJRLCBpcHNfbmFtZSwgaGEpKSB7CisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJICAgIlVuYWJsZSB0byBpbnN0YWxsIGludGVycnVwdCBoYW5kbGVyXG4iKTsKKwkJcmV0dXJuIGlwc19hYm9ydF9pbml0KGhhLCBpbmRleCk7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBhIHRlbXBvcmFyeSBTQ0IgZm9yIGluaXRpYWxpemF0aW9uCisJICovCisJaGEtPm1heF9jbWRzID0gMTsKKwlpZiAoIWlwc19hbGxvY2F0ZXNjYnMoaGEpKSB7CisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBhIENDQlxuIik7CisJCWZyZWVfaXJxKGhhLT5pcnEsIGhhKTsKKwkJcmV0dXJuIGlwc19hYm9ydF9pbml0KGhhLCBpbmRleCk7CisJfQorCisJaWYgKCFpcHNfaGFpbml0KGhhKSkgeworCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgaGEtPnBjaWRldiwKKwkJCSAgICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBjb250cm9sbGVyXG4iKTsKKwkJZnJlZV9pcnEoaGEtPmlycSwgaGEpOworCQlyZXR1cm4gaXBzX2Fib3J0X2luaXQoaGEsIGluZGV4KTsKKwl9CisJLyogRnJlZSB0aGUgdGVtcG9yYXJ5IFNDQiAqLworCWlwc19kZWFsbG9jYXRlc2NicyhoYSwgMSk7CisKKwkvKiBhbGxvY2F0ZSBDQ0JzICovCisJaWYgKCFpcHNfYWxsb2NhdGVzY2JzKGhhKSkgeworCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgaGEtPnBjaWRldiwKKwkJCSAgICJVbmFibGUgdG8gYWxsb2NhdGUgQ0NCc1xuIik7CisJCWZyZWVfaXJxKGhhLT5pcnEsIGhhKTsKKwkJcmV0dXJuIGlwc19hYm9ydF9pbml0KGhhLCBpbmRleCk7CisJfQorCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDkpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisjZW5kaWYKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJJQk0gU2VydmVSQUlEIEFkYXB0ZXIgRHJpdmVyICIgSVBTX1ZFUl9TVFJJTkcpOworCisjaWZkZWYgTU9EVUxFX1ZFUlNJT04KK01PRFVMRV9WRVJTSU9OKElQU19WRVJfU1RSSU5HKTsKKyNlbmRpZgorCisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgYWxtb3N0IGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCisgKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKKyAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBmaWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWluZGVudC1sZXZlbDogMgorICogYy1icmFjZS1pbWFnaW5hcnktb2Zmc2V0OiAwCisgKiBjLWJyYWNlLW9mZnNldDogLTIKKyAqIGMtYXJnZGVjbC1pbmRlbnQ6IDIKKyAqIGMtbGFiZWwtb2Zmc2V0OiAtMgorICogYy1jb250aW51ZWQtc3RhdGVtZW50LW9mZnNldDogMgorICogYy1jb250aW51ZWQtYnJhY2Utb2Zmc2V0OiAwCisgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKyAqIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXBzLmggYi9kcml2ZXJzL3Njc2kvaXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2YTc2MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pcHMuaApAQCAtMCwwICsxLDEyOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGlwcy5oIC0tIGRyaXZlciBmb3IgdGhlIEFkYXB0ZWMgLyBJQk0gU2VydmVSQUlEIGNvbnRyb2xsZXIgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFdyaXR0ZW4gQnk6IEtlaXRoIE1pdGNoZWxsLCBJQk0gQ29ycG9yYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIEphY2sgSGFtbWVyLCBBZGFwdGVjLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIERhdmlkIEplZmZlcnksIEFkYXB0ZWMsIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5OSBJQk0gQ29ycG9yYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIENvcHlyaWdodCAoQykgMjAwMyBBZGFwdGVjLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAgICovCisvKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAgICovCisvKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgICAgICovCisvKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAgICovCisvKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgICovCisvKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAgICovCisvKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOTyBXQVJSQU5UWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgICAgICAgICovCisvKiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCAgICAgICovCisvKiBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCAgICAgICovCisvKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzICAgICovCisvKiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kICAgICAgICovCisvKiBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgICAgICAgICovCisvKiBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gICAgICovCisvKiB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCAgICAgICAgICovCisvKiBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBESVNDTEFJTUVSIE9GIExJQUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSAgICovCisvKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgICAgICAgICovCisvKiBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCAgICovCisvKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgICAgICovCisvKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFICAgICovCisvKiBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgICovCisvKiBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAgICovCisvKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAgICovCisvKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCdWdzL0NvbW1lbnRzL1N1Z2dlc3Rpb25zIHNob3VsZCBiZSBtYWlsZWQgdG86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGlwc2xpbnV4QGFkYXB0ZWMuY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0lQU19IXworICAgI2RlZmluZSBfSVBTX0hfCisKKyAgICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorICAgI2luY2x1ZGUgPGFzbS9pby5oPgorCisgICAvKgorICAgICogU29tZSBoYW5keSBtYWNyb3MKKyAgICAqLworICAgI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMjApIHx8IGRlZmluZWQgQ09ORklHX0hJR0hJTworICAgICAgI2RlZmluZSBJUFNfSElHSElPCisgICAjZW5kaWYKKworICAgI2RlZmluZSBJUFNfSEEoeCkgICAgICAgICAgICAgICAgICAgKChpcHNfaGFfdCAqKSB4LT5ob3N0ZGF0YSkKKyAgICNkZWZpbmUgSVBTX0NPTU1BTkRfSUQoaGEsIHNjYikgICAgIChpbnQpIChzY2IgLSBoYS0+c2NicykKKyAgICNkZWZpbmUgSVBTX0lTX1RST01CT05FKGhhKSAgICAgICAgICgoKGhhLT5kZXZpY2VfaWQgPT0gSVBTX0RFVklDRUlEX0NPUFBFUkhFQUQpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhhLT5yZXZpc2lvbl9pZCA+PSBJUFNfUkVWSURfVFJPTUJPTkUzMikgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGEtPnJldmlzaW9uX2lkIDw9IElQU19SRVZJRF9UUk9NQk9ORTY0KSkgPyAxIDogMCkKKyAgICNkZWZpbmUgSVBTX0lTX0NMQVJJTkVUKGhhKSAgICAgICAgICgoKGhhLT5kZXZpY2VfaWQgPT0gSVBTX0RFVklDRUlEX0NPUFBFUkhFQUQpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhhLT5yZXZpc2lvbl9pZCA+PSBJUFNfUkVWSURfQ0xBUklORVRQMSkgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGEtPnJldmlzaW9uX2lkIDw9IElQU19SRVZJRF9DTEFSSU5FVFAzKSkgPyAxIDogMCkKKyAgICNkZWZpbmUgSVBTX0lTX01PUlBIRVVTKGhhKSAgICAgICAgIChoYS0+ZGV2aWNlX2lkID09IElQU19ERVZJQ0VJRF9NT1JQSEVVUykKKyAgICNkZWZpbmUgSVBTX0lTX01BUkNPKGhhKSAgICAgICAgICAgIChoYS0+ZGV2aWNlX2lkID09IElQU19ERVZJQ0VJRF9NQVJDTykKKyAgICNkZWZpbmUgSVBTX1VTRV9JMk9fREVMSVZFUihoYSkgICAgICgoSVBTX0lTX01PUlBIRVVTKGhhKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJUFNfSVNfVFJPTUJPTkUoaGEpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpcHNfZm9yY2VfaTJvKSkpID8gMSA6IDApCisgICAjZGVmaW5lIElQU19VU0VfTUVNSU8oaGEpICAgICAgICAgICAoKElQU19JU19NT1JQSEVVUyhoYSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElQU19JU19UUk9NQk9ORShoYSkgfHwgSVBTX0lTX0NMQVJJTkVUKGhhKSkgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlwc19mb3JjZV9tZW1pbykpKSA/IDEgOiAwKQorCisgICAgI2RlZmluZSBJUFNfSEFTX0VOSF9TR0xJU1QoaGEpICAgIChJUFNfSVNfTU9SUEhFVVMoaGEpIHx8IElQU19JU19NQVJDTyhoYSkpCisgICAgI2RlZmluZSBJUFNfVVNFX0VOSF9TR0xJU1QoaGEpICAgICgoaGEpLT5mbGFncyAmIElQU19IQV9FTkhfU0cpCisgICAgI2RlZmluZSBJUFNfU0dMSVNUX1NJWkUoaGEpICAgICAgIChJUFNfVVNFX0VOSF9TR0xJU1QoaGEpID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSVBTX0VOSF9TR19MSVNUKSA6IHNpemVvZihJUFNfU1REX1NHX0xJU1QpKQorCisgICAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDQpCisgICAgICAjZGVmaW5lIHBjaV9zZXRfZG1hX21hc2soZGV2LG1hc2spICggbWFzayA+IDB4ZmZmZmZmZmYgPyAxOjAgKQorICAgICAgI2RlZmluZSBzY3NpX3NldF9wY2lfZGV2aWNlKHNoLGRldikgKDApCisgICAjZW5kaWYKKworICAgI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorICAgCisgICAgICAjaWZuZGVmIGlycXJldHVybl90CisgICAgICAgICB0eXBlZGVmIHZvaWQgaXJxcmV0dXJuX3Q7CisgICAgICAjZW5kaWYgCisgICAgICAKKyAgICAgICNkZWZpbmUgSVJRX05PTkUKKyAgICAgICNkZWZpbmUgSVJRX0hBTkRMRUQKKyAgICAgICNkZWZpbmUgSVJRX1JFVFZBTCh4KQorICAgICAgI2RlZmluZSBJUFNfUkVHSVNURVJfSE9TVFMoU0hUKSAgICAgIHNjc2lfcmVnaXN0ZXJfbW9kdWxlKE1PRFVMRV9TQ1NJX0hBLFNIVCkKKyAgICAgICNkZWZpbmUgSVBTX1VOUkVHSVNURVJfSE9TVFMoU0hUKSAgICBzY3NpX3VucmVnaXN0ZXJfbW9kdWxlKE1PRFVMRV9TQ1NJX0hBLFNIVCkKKyAgICAgICNkZWZpbmUgSVBTX0FERF9IT1NUKHNob3N0LGRldmljZSkKKyAgICAgICNkZWZpbmUgSVBTX1JFTU9WRV9IT1NUKHNob3N0KQorICAgICAgI2RlZmluZSBJUFNfU0NTSV9TRVRfREVWSUNFKHNoLGhhKSAgIHNjc2lfc2V0X3BjaV9kZXZpY2Uoc2gsIChoYSktPnBjaWRldikKKyAgICAgICNkZWZpbmUgSVBTX1BSSU5USyhsZXZlbCwgcGNpZGV2LCBmb3JtYXQsIGFyZy4uLikgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHByaW50ayhsZXZlbCAiJXMgJXM6IiBmb3JtYXQgLCAiaXBzIiAsICAgICBcCisgICAgICAgICAgICAocGNpZGV2KS0+c2xvdF9uYW1lICwgIyMgYXJnKQorICAgICAgI2RlZmluZSBzY3NpX2hvc3RfYWxsb2Moc2gsc2l6ZSkgICAgICAgICBzY3NpX3JlZ2lzdGVyKHNoLHNpemUpCisgICAgICAjZGVmaW5lIHNjc2lfaG9zdF9wdXQoc2gpICAgICAgICAgICAgIHNjc2lfdW5yZWdpc3RlcihzaCkKKyAgICNlbHNlCisgICAgICAjZGVmaW5lIElQU19SRUdJU1RFUl9IT1NUUyhTSFQpICAgICAgKCFpcHNfZGV0ZWN0KFNIVCkpCisgICAgICAjZGVmaW5lIElQU19VTlJFR0lTVEVSX0hPU1RTKFNIVCkKKyAgICAgICNkZWZpbmUgSVBTX0FERF9IT1NUKHNob3N0LGRldmljZSkgICBkbyB7IHNjc2lfYWRkX2hvc3Qoc2hvc3QsZGV2aWNlKTsgc2NzaV9zY2FuX2hvc3Qoc2hvc3QpOyB9IHdoaWxlICgwKQorICAgICAgI2RlZmluZSBJUFNfUkVNT1ZFX0hPU1Qoc2hvc3QpICAgICAgIHNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpCisgICAgICAjZGVmaW5lIElQU19TQ1NJX1NFVF9ERVZJQ0Uoc2gsaGEpICAgc2NzaV9zZXRfZGV2aWNlKHNoLCAmKGhhKS0+cGNpZGV2LT5kZXYpCisgICAgICAjZGVmaW5lIElQU19QUklOVEsobGV2ZWwsIHBjaWRldiwgZm9ybWF0LCBhcmcuLi4pICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkZXZfcHJpbnRrKGxldmVsICwgJigocGNpZGV2KS0+ZGV2KSAsIGZvcm1hdCAsICMjIGFyZykKKyAgICNlbmRpZgorCisgICAjaWZuZGVmIE1ERUxBWQorICAgICAgI2RlZmluZSBNREVMQVkgbWRlbGF5CisgICAjZW5kaWYKKworICAgI2lmbmRlZiBtaW4KKyAgICAgICNkZWZpbmUgbWluKHgseSkgKCh4KSA8ICh5KSA/IHggOiB5KQorICAgI2VuZGlmCisKKyAgICNkZWZpbmUgcGNpX2RtYV9oaTMyKGEpICAgICAgICAgKChhID4+IDE2KSA+PiAxNikKKyAgICNkZWZpbmUgcGNpX2RtYV9sbzMyKGEpICAgICAgICAgKGEgJiAweGZmZmZmZmZmKQorCisgICAjaWYgKEJJVFNfUEVSX0xPTkcgPiAzMikgfHwgKGRlZmluZWQgQ09ORklHX0hJR0hNRU02NEcgJiYgZGVmaW5lZCBJUFNfSElHSElPKQorICAgICAgI2RlZmluZSBJUFNfRU5BQkxFX0RNQTY0ICAgICAgICAoMSkKKyAgICNlbHNlCisgICAgICAjZGVmaW5lIElQU19FTkFCTEVfRE1BNjQgICAgICAgICgwKQorICAgI2VuZGlmCisKKyAgIC8qCisgICAgKiBBZGFwdGVyIGFkZHJlc3MgbWFwIGVxdWF0ZXMKKyAgICAqLworICAgI2RlZmluZSBJUFNfUkVHX0hJU1IgICAgICAgICAgICAgICAgIDB4MDggICAgLyogSG9zdCBJbnRlcnJ1cHQgU3RhdHVzIFJlZyAgICovCisgICAjZGVmaW5lIElQU19SRUdfQ0NTQVIgICAgICAgICAgICAgICAgMHgxMCAgICAvKiBDbWQgQ2hhbm5lbCBTeXN0ZW0gQWRkciBSZWcgKi8KKyAgICNkZWZpbmUgSVBTX1JFR19DQ0NSICAgICAgICAgICAgICAgICAweDE0ICAgIC8qIENtZCBDaGFubmVsIENvbnRyb2wgUmVnICAgICAqLworICAgI2RlZmluZSBJUFNfUkVHX1NRSFIgICAgICAgICAgICAgICAgIDB4MjAgICAgLyogU3RhdHVzIFEgSGVhZCBSZWcgICAgICAgICAgICovCisgICAjZGVmaW5lIElQU19SRUdfU1FUUiAgICAgICAgICAgICAgICAgMHgyNCAgICAvKiBTdGF0dXMgUSBUYWlsIFJlZyAgICAgICAgICAgKi8KKyAgICNkZWZpbmUgSVBTX1JFR19TUUVSICAgICAgICAgICAgICAgICAweDI4ICAgIC8qIFN0YXR1cyBRIEVuZCBSZWcgICAgICAgICAgICAqLworICAgI2RlZmluZSBJUFNfUkVHX1NRU1IgICAgICAgICAgICAgICAgIDB4MkMgICAgLyogU3RhdHVzIFEgU3RhcnQgUmVnICAgICAgICAgICovCisgICAjZGVmaW5lIElQU19SRUdfU0NQUiAgICAgICAgICAgICAgICAgMHgwNSAgICAvKiBTdWJzeXN0ZW0gY29udHJvbCBwb3J0IHJlZyAgKi8KKyAgICNkZWZpbmUgSVBTX1JFR19JU1BSICAgICAgICAgICAgICAgICAweDA2ICAgIC8qIGludGVycnVwdCBzdGF0dXMgcG9ydCByZWcgICAqLworICAgI2RlZmluZSBJUFNfUkVHX0NCU1AgICAgICAgICAgICAgICAgIDB4MDcgICAgLyogQ0JTUCByZWdpc3RlciAgICAgICAgICAgICAgICovCisgICAjZGVmaW5lIElQU19SRUdfRkxBUCAgICAgICAgICAgICAgICAgMHgxOCAgICAvKiBGbGFzaCBhZGRyZXNzIHBvcnQgICAgICAgICAgKi8KKyAgICNkZWZpbmUgSVBTX1JFR19GTERQICAgICAgICAgICAgICAgICAweDFDICAgIC8qIEZsYXNoIGRhdGEgcG9ydCAgICAgICAgICAgICAqLworICAgI2RlZmluZSBJUFNfUkVHX05EQUUgICAgICAgICAgICAgICAgIDB4MzggICAgLyogQW5hY29uZGEgNjQgTkRBRSBSZWdpc3RlciAgICovCisgICAjZGVmaW5lIElQU19SRUdfSTJPX0lOTVNHUSAgICAgICAgICAgMHg0MCAgICAvKiBJMk8gSW5ib3VuZCBNZXNzYWdlIFF1ZXVlICAgKi8KKyAgICNkZWZpbmUgSVBTX1JFR19JMk9fT1VUTVNHUSAgICAgICAgICAweDQ0ICAgIC8qIEkyTyBPdXRib3VuZCBNZXNzYWdlIFF1ZXVlICAqLworICAgI2RlZmluZSBJUFNfUkVHX0kyT19ISVIgICAgICAgICAgICAgIDB4MzAgICAgLyogSTJPIEludGVycnVwdCBTdGF0dXMgICAgICAgICovCisgICAjZGVmaW5lIElQU19SRUdfSTk2MF9JRFIgICAgICAgICAgICAgMHgyMCAgICAvKiBpOTYwIEluYm91bmQgRG9vcmJlbGwgICAgICAgKi8KKyAgICNkZWZpbmUgSVBTX1JFR19JOTYwX01TRzAgICAgICAgICAgICAweDE4ICAgIC8qIGk5NjAgT3V0Ym91bmQgUmVnIDAgICAgICAgICAqLworICAgI2RlZmluZSBJUFNfUkVHX0k5NjBfTVNHMSAgICAgICAgICAgIDB4MUMgICAgLyogaTk2MCBPdXRib3VuZCBSZWcgMSAgICAgICAgICovCisgICAjZGVmaW5lIElQU19SRUdfSTk2MF9PSU1SICAgICAgICAgICAgMHgzNCAgICAvKiBpOTYwIE91Ym91bmQgSW50IE1hc2sgUmVnICAgKi8KKworICAgLyoKKyAgICAqIEFkYXB0ZXIgcmVnaXN0ZXIgYml0IGVxdWF0ZXMKKyAgICAqLworICAgI2RlZmluZSBJUFNfQklUX0dISSAgICAgICAgICAgICAgICAgIDB4MDQgICAgLyogSElTUiBHZW5lcmFsIEhvc3QgSW50ZXJydXB0ICovCisgICAjZGVmaW5lIElQU19CSVRfU1FPICAgICAgICAgICAgICAgICAgMHgwMiAgICAvKiBISVNSIFN0YXR1cyBRIE92ZXJmbG93ICAgICAgKi8KKyAgICNkZWZpbmUgSVBTX0JJVF9TQ0UgICAgICAgICAgICAgICAgICAweDAxICAgIC8qIEhJU1IgU3RhdHVzIENoYW5uZWwgRW5xdWV1ZSAqLworICAgI2RlZmluZSBJUFNfQklUX1NFTSAgICAgICAgICAgICAgICAgIDB4MDggICAgLyogQ0NDUiBTZW1hcGhvcmUgQml0ICAgICAgICAgICovCisgICAjZGVmaW5lIElQU19CSVRfSUxFICAgICAgICAgICAgICAgICAgMHgxMCAgICAvKiBDQ0NSIElMRSBCaXQgICAgICAgICAgICAgICAgKi8KKyAgICNkZWZpbmUgSVBTX0JJVF9TVEFSVF9DTUQgICAgICAgICAgICAweDEwMUEgIC8qIENDQ1IgU3RhcnQgQ29tbWFuZCBDaGFubmVsICAqLworICAgI2RlZmluZSBJUFNfQklUX1NUQVJUX1NUT1AgICAgICAgICAgIDB4MDAwMiAgLyogQ0NDUiBTdGFydC9TdG9wIEJpdCAgICAgICAgICovCisgICAjZGVmaW5lIElQU19CSVRfUlNUICAgICAgICAgICAgICAgICAgMHg4MCAgICAvKiBTQ1BSIFJlc2V0IEJpdCAgICAgICAgICAgICAgKi8KKyAgICNkZWZpbmUgSVBTX0JJVF9FQk0gICAgICAgICAgICAgICAgICAweDAyICAgIC8qIFNDUFIgRW5hYmxlIEJ1cyBNYXN0ZXIgICAgICAqLworICAgI2RlZmluZSBJUFNfQklUX0VJICAgICAgICAgICAgICAgICAgIDB4ODAgICAgLyogSElTUiBFbmFibGUgSW50ZXJydXB0cyAgICAgICovCisgICAjZGVmaW5lIElQU19CSVRfT1AgICAgICAgICAgICAgICAgICAgMHgwMSAgICAvKiBPUCBiaXQgaW4gQ0JTUCAgICAgICAgICAgICAgKi8KKyAgICNkZWZpbmUgSVBTX0JJVF9JMk9fT1BRSSAgICAgICAgICAgICAweDA4ICAgIC8qIEdlbmVyYWwgSG9zdCBJbnRlcnJ1cHQgICAgICAqLworICAgI2RlZmluZSBJUFNfQklUX0k5NjBfTVNHMEkgICAgICAgICAgIDB4MDEgICAgLyogTWVzc2FnZSBSZWdpc3RlciAwIEludGVycnVwdCovCisgICAjZGVmaW5lIElQU19CSVRfSTk2MF9NU0cxSSAgICAgICAgICAgMHgwMiAgICAvKiBNZXNzYWdlIFJlZ2lzdGVyIDEgSW50ZXJydXB0Ki8KKworICAgLyoKKyAgICAqIEFkYXB0ZXIgQ29tbWFuZCBJRCBFcXVhdGVzCisgICAgKi8KKyAgICNkZWZpbmUgSVBTX0NNRF9HRVRfTERfSU5GTyAgICAgICAgICAweDE5CisgICAjZGVmaW5lIElQU19DTURfR0VUX1NVQlNZUyAgICAgICAgICAgMHg0MAorICAgI2RlZmluZSBJUFNfQ01EX1JFQURfQ09ORiAgICAgICAgICAgIDB4MzgKKyAgICNkZWZpbmUgSVBTX0NNRF9SV19OVlJBTV9QQUdFICAgICAgICAweEJDCisgICAjZGVmaW5lIElQU19DTURfUkVBRCAgICAgICAgICAgICAgICAgMHgwMgorICAgI2RlZmluZSBJUFNfQ01EX1dSSVRFICAgICAgICAgICAgICAgIDB4MDMKKyAgICNkZWZpbmUgSVBTX0NNRF9GRkRDICAgICAgICAgICAgICAgICAweEQ3CisgICAjZGVmaW5lIElQU19DTURfRU5RVUlSWSAgICAgICAgICAgICAgMHgwNQorICAgI2RlZmluZSBJUFNfQ01EX0ZMVVNIICAgICAgICAgICAgICAgIDB4MEEKKyAgICNkZWZpbmUgSVBTX0NNRF9SRUFEX1NHICAgICAgICAgICAgICAweDgyCisgICAjZGVmaW5lIElQU19DTURfV1JJVEVfU0cgICAgICAgICAgICAgMHg4MworICAgI2RlZmluZSBJUFNfQ01EX0RDREIgICAgICAgICAgICAgICAgIDB4MDQKKyAgICNkZWZpbmUgSVBTX0NNRF9EQ0RCX1NHICAgICAgICAgICAgICAweDg0CisgICAjZGVmaW5lIElQU19DTURfRVhURU5ERURfRENEQiAJICAgIDB4OTUKKyAgICNkZWZpbmUgSVBTX0NNRF9FWFRFTkRFRF9EQ0RCX1NHCSAgICAweDk2CisgICAjZGVmaW5lIElQU19DTURfQ09ORklHX1NZTkMgICAgICAgICAgMHg1OAorICAgI2RlZmluZSBJUFNfQ01EX0VSUk9SX1RBQkxFICAgICAgICAgIDB4MTcKKyAgICNkZWZpbmUgSVBTX0NNRF9ET1dOTE9BRCAgICAgICAgICAgICAweDIwCisgICAjZGVmaW5lIElQU19DTURfUldfQklPU0ZXICAgICAgICAgICAgMHgyMgorICAgI2RlZmluZSBJUFNfQ01EX0dFVF9WRVJTSU9OX0lORk8gICAgIDB4QzYKKyAgICNkZWZpbmUgSVBTX0NNRF9SRVNFVF9DSEFOTkVMICAgICAgICAweDFBICAKKworICAgLyoKKyAgICAqIEFkYXB0ZXIgRXF1YXRlcworICAgICovCisgICAjZGVmaW5lIElQU19DU0wgICAgICAgICAgICAgICAgICAgICAgMHhGRgorICAgI2RlZmluZSBJUFNfUE9DTCAgICAgICAgICAgICAgICAgICAgIDB4MzAKKyAgICNkZWZpbmUgSVBTX05PUk1fU1RBVEUgICAgICAgICAgICAgICAweDAwCisgICAjZGVmaW5lIElQU19NQVhfQURBUFRFUl9UWVBFUyAgICAgICAgMworICAgI2RlZmluZSBJUFNfTUFYX0FEQVBURVJTICAgICAgICAgICAgIDE2CisgICAjZGVmaW5lIElQU19NQVhfSU9DVEwgICAgICAgICAgICAgICAgMQorICAgI2RlZmluZSBJUFNfTUFYX0lPQ1RMX1FVRVVFICAgICAgICAgIDgKKyAgICNkZWZpbmUgSVBTX01BWF9RVUVVRSAgICAgICAgICAgICAgICAxMjgKKyAgICNkZWZpbmUgSVBTX0JMS1NJWkUgICAgICAgICAgICAgICAgICA1MTIKKyAgICNkZWZpbmUgSVBTX01BWF9TRyAgICAgICAgICAgICAgICAgICAxNworICAgI2RlZmluZSBJUFNfTUFYX0xEICAgICAgICAgICAgICAgICAgIDgKKyAgICNkZWZpbmUgSVBTX01BWF9DSEFOTkVMUyAgICAgICAgICAgICA0CisgICAjZGVmaW5lIElQU19NQVhfVEFSR0VUUyAgICAgICAgICAgICAgMTUKKyAgICNkZWZpbmUgSVBTX01BWF9DSFVOS1MgICAgICAgICAgICAgICAxNgorICAgI2RlZmluZSBJUFNfTUFYX0NNRFMgICAgICAgICAgICAgICAgIDEyOAorICAgI2RlZmluZSBJUFNfTUFYX1hGRVIgICAgICAgICAgICAgICAgIDB4MTAwMDAKKyAgICNkZWZpbmUgSVBTX05WUkFNX1A1X1NJRyAgICAgICAgICAgICAweEZGRERCQjk5CisgICAjZGVmaW5lIElQU19NQVhfUE9TVF9CWVRFUyAgICAgICAgICAgMHgwMgorICAgI2RlZmluZSBJUFNfTUFYX0NPTkZJR19CWVRFUyAgICAgICAgIDB4MDIKKyAgICNkZWZpbmUgSVBTX0dPT0RfUE9TVF9TVEFUVVMgICAgICAgICAweDgwCisgICAjZGVmaW5lIElQU19TRU1fVElNRU9VVCAgICAgICAgICAgICAgMjAwMAorICAgI2RlZmluZSBJUFNfSU9DVExfQ09NTUFORCAgICAgICAgICAgIDB4MEQKKyAgICNkZWZpbmUgSVBTX0lOVFJfT04gICAgICAgICAgICAgICAgICAwCisgICAjZGVmaW5lIElQU19JTlRSX0lPUkwgICAgICAgICAgICAgICAgMQorICAgI2RlZmluZSBJUFNfRkZEQyAgICAgICAgICAgICAgICAgICAgIDk5CisgICAjZGVmaW5lIElQU19BREFQVEVSX0lEICAgICAgICAgICAgICAgMHhGCisgICAjZGVmaW5lIElQU19WRU5ET1JJRF9JQk0gICAgICAgICAgICAgMHgxMDE0CisgICAjZGVmaW5lIElQU19WRU5ET1JJRF9BREFQVEVDICAgICAgICAgMHg5MDA1CisgICAjZGVmaW5lIElQU19ERVZJQ0VJRF9DT1BQRVJIRUFEICAgICAgMHgwMDJFCisgICAjZGVmaW5lIElQU19ERVZJQ0VJRF9NT1JQSEVVUyAgICAgICAgMHgwMUJECisgICAjZGVmaW5lIElQU19ERVZJQ0VJRF9NQVJDTyAgICAgICAgICAgMHgwMjUwCisgICAjZGVmaW5lIElQU19TVUJERVZJQ0VJRF80TSAgICAgICAgICAgMHgwMUJFCisgICAjZGVmaW5lIElQU19TVUJERVZJQ0VJRF80TCAgICAgICAgICAgMHgwMUJGCisgICAjZGVmaW5lIElQU19TVUJERVZJQ0VJRF80TVggICAgICAgICAgMHgwMjA4CisgICAjZGVmaW5lIElQU19TVUJERVZJQ0VJRF80TFggICAgICAgICAgMHgwMjBFCisgICAjZGVmaW5lIElQU19TVUJERVZJQ0VJRF81STIgICAgICAgICAgMHgwMjU5CisgICAjZGVmaW5lIElQU19TVUJERVZJQ0VJRF81STEgICAgICAgICAgMHgwMjU4CisgICAjZGVmaW5lIElQU19TVUJERVZJQ0VJRF82TSAgICAgICAgICAgMHgwMjc5CisgICAjZGVmaW5lIElQU19TVUJERVZJQ0VJRF82SSAgICAgICAgICAgMHgwMjhDCisgICAjZGVmaW5lIElQU19TVUJERVZJQ0VJRF83ayAgICAgICAgICAgMHgwMjhFCisgICAjZGVmaW5lIElQU19TVUJERVZJQ0VJRF83TSAgICAgICAgICAgMHgwMjhGCisgICAjZGVmaW5lIElQU19JT0NUTF9TSVpFICAgICAgICAgICAgICAgODE5MgorICAgI2RlZmluZSBJUFNfU1RBVFVTX1NJWkUgICAgICAgICAgICAgIDQKKyAgICNkZWZpbmUgSVBTX1NUQVRVU19RX1NJWkUgICAgICAgICAgICAoSVBTX01BWF9DTURTKzEpICogSVBTX1NUQVRVU19TSVpFCisgICAjZGVmaW5lIElQU19JTUFHRV9TSVpFICAgICAgICAgICAgICAgNTAwICogMTAyNAorICAgI2RlZmluZSBJUFNfTUVNTUFQX1NJWkUgICAgICAgICAgICAgIDEyOAorICAgI2RlZmluZSBJUFNfT05FX01TRUMgICAgICAgICAgICAgICAgIDEKKyAgICNkZWZpbmUgSVBTX09ORV9TRUMgICAgICAgICAgICAgICAgICAxMDAwCisKKyAgIC8qCisgICAgKiBHZW9tZXRyeSBTZXR0aW5ncworICAgICovCisgICAjZGVmaW5lIElQU19DT01QX0hFQURTICAgICAgICAgICAgICAgMTI4CisgICAjZGVmaW5lIElQU19DT01QX1NFQ1RPUlMgICAgICAgICAgICAgMzIKKyAgICNkZWZpbmUgSVBTX05PUk1fSEVBRFMgICAgICAgICAgICAgICAyNTQKKyAgICNkZWZpbmUgSVBTX05PUk1fU0VDVE9SUyAgICAgICAgICAgICA2MworCisgICAvKgorICAgICogQWRhcHRlciBCYXNpYyBTdGF0dXMgQ29kZXMKKyAgICAqLworICAgI2RlZmluZSBJUFNfQkFTSUNfU1RBVFVTX01BU0sgICAgICAgIDB4RkYKKyAgICNkZWZpbmUgSVBTX0dTQ19TVEFUVVNfTUFTSyAgICAgICAgICAweDBGCisgICAjZGVmaW5lIElQU19DTURfU1VDQ0VTUyAgICAgICAgICAgICAgMHgwMAorICAgI2RlZmluZSBJUFNfQ01EX1JFQ09WRVJFRF9FUlJPUiAgICAgIDB4MDEKKyAgICNkZWZpbmUgSVBTX0lOVkFMX09QQ08gICAgICAgICAgICAgICAweDAzCisgICAjZGVmaW5lIElQU19JTlZBTF9DTURfQkxLICAgICAgICAgICAgMHgwNAorICAgI2RlZmluZSBJUFNfSU5WQUxfUEFSTV9CTEsgICAgICAgICAgIDB4MDUKKyAgICNkZWZpbmUgSVBTX0JVU1kgICAgICAgICAgICAgICAgICAgICAweDA4CisgICAjZGVmaW5lIElQU19DTURfQ01QTFRfV0VSUk9SICAgICAgICAgMHgwQworICAgI2RlZmluZSBJUFNfTERfRVJST1IgICAgICAgICAgICAgICAgIDB4MEQKKyAgICNkZWZpbmUgSVBTX0NNRF9USU1FT1VUICAgICAgICAgICAgICAweDBFCisgICAjZGVmaW5lIElQU19QSFlTX0RSVl9FUlJPUiAgICAgICAgICAgMHgwRgorCisgICAvKgorICAgICogQWRhcHRlciBFeHRlbmRlZCBTdGF0dXMgRXF1YXRlcworICAgICovCisgICAjZGVmaW5lIElQU19FUlJfU0VMX1RPICAgICAgICAgICAgICAgMHhGMAorICAgI2RlZmluZSBJUFNfRVJSX09VX1JVTiAgICAgICAgICAgICAgIDB4RjIKKyAgICNkZWZpbmUgSVBTX0VSUl9IT1NUX1JFU0VUICAgICAgICAgICAweEY3CisgICAjZGVmaW5lIElQU19FUlJfREVWX1JFU0VUICAgICAgICAgICAgMHhGOAorICAgI2RlZmluZSBJUFNfRVJSX1JFQ09WRVJZICAgICAgICAgICAgIDB4RkMKKyAgICNkZWZpbmUgSVBTX0VSUl9DS0NPTkQgICAgICAgICAgICAgICAweEZGCisKKyAgIC8qCisgICAgKiBPcGVyYXRpbmcgU3lzdGVtIERlZmluZXMKKyAgICAqLworICAgI2RlZmluZSBJUFNfT1NfV0lORE9XU19OVCAgICAgICAgICAgIDB4MDEKKyAgICNkZWZpbmUgSVBTX09TX05FVFdBUkUgICAgICAgICAgICAgICAweDAyCisgICAjZGVmaW5lIElQU19PU19PUEVOU0VSVkVSICAgICAgICAgICAgMHgwMworICAgI2RlZmluZSBJUFNfT1NfVU5JWFdBUkUgICAgICAgICAgICAgIDB4MDQKKyAgICNkZWZpbmUgSVBTX09TX1NPTEFSSVMgICAgICAgICAgICAgICAweDA1CisgICAjZGVmaW5lIElQU19PU19PUzIgICAgICAgICAgICAgICAgICAgMHgwNgorICAgI2RlZmluZSBJUFNfT1NfTElOVVggICAgICAgICAgICAgICAgIDB4MDcKKyAgICNkZWZpbmUgSVBTX09TX0ZSRUVCU0QgICAgICAgICAgICAgICAweDA4CisKKyAgIC8qCisgICAgKiBBZGFwdGVyIFJldmlzaW9uIElEJ3MKKyAgICAqLworICAgI2RlZmluZSBJUFNfUkVWSURfU0VSVkVSQUlEICAgICAgICAgIDB4MDIKKyAgICNkZWZpbmUgSVBTX1JFVklEX05BVkFKTyAgICAgICAgICAgICAweDAzCisgICAjZGVmaW5lIElQU19SRVZJRF9TRVJWRVJBSUQyICAgICAgICAgMHgwNAorICAgI2RlZmluZSBJUFNfUkVWSURfQ0xBUklORVRQMSAgICAgICAgIDB4MDUKKyAgICNkZWZpbmUgSVBTX1JFVklEX0NMQVJJTkVUUDIgICAgICAgICAweDA3CisgICAjZGVmaW5lIElQU19SRVZJRF9DTEFSSU5FVFAzICAgICAgICAgMHgwRAorICAgI2RlZmluZSBJUFNfUkVWSURfVFJPTUJPTkUzMiAgICAgICAgIDB4MEYKKyAgICNkZWZpbmUgSVBTX1JFVklEX1RST01CT05FNjQgICAgICAgICAweDEwCisKKyAgIC8qCisgICAgKiBOVlJBTSBQYWdlIDUgQWRhcHRlciBEZWZpbmVzCisgICAgKi8KKyAgICNkZWZpbmUgSVBTX0FEVFlQRV9TRVJWRVJBSUQgICAgICAgICAweDAxCisgICAjZGVmaW5lIElQU19BRFRZUEVfU0VSVkVSQUlEMiAgICAgICAgMHgwMgorICAgI2RlZmluZSBJUFNfQURUWVBFX05BVkFKTyAgICAgICAgICAgIDB4MDMKKyAgICNkZWZpbmUgSVBTX0FEVFlQRV9LSU9XQSAgICAgICAgICAgICAweDA0CisgICAjZGVmaW5lIElQU19BRFRZUEVfU0VSVkVSQUlEMyAgICAgICAgMHgwNQorICAgI2RlZmluZSBJUFNfQURUWVBFX1NFUlZFUkFJRDNMICAgICAgIDB4MDYKKyAgICNkZWZpbmUgSVBTX0FEVFlQRV9TRVJWRVJBSUQ0SCAgICAgICAweDA3CisgICAjZGVmaW5lIElQU19BRFRZUEVfU0VSVkVSQUlENE0gICAgICAgMHgwOAorICAgI2RlZmluZSBJUFNfQURUWVBFX1NFUlZFUkFJRDRMICAgICAgIDB4MDkKKyAgICNkZWZpbmUgSVBTX0FEVFlQRV9TRVJWRVJBSUQ0TVggICAgICAweDBBCisgICAjZGVmaW5lIElQU19BRFRZUEVfU0VSVkVSQUlENExYICAgICAgMHgwQgorICAgI2RlZmluZSBJUFNfQURUWVBFX1NFUlZFUkFJRDVJMiAgICAgIDB4MEMKKyAgICNkZWZpbmUgSVBTX0FEVFlQRV9TRVJWRVJBSUQ1STEgICAgICAweDBECisgICAjZGVmaW5lIElQU19BRFRZUEVfU0VSVkVSQUlENk0gICAgICAgMHgwRQorICAgI2RlZmluZSBJUFNfQURUWVBFX1NFUlZFUkFJRDZJICAgICAgIDB4MEYKKyAgICNkZWZpbmUgSVBTX0FEVFlQRV9TRVJWRVJBSUQ3dCAgICAgICAweDEwCisgICAjZGVmaW5lIElQU19BRFRZUEVfU0VSVkVSQUlEN2sgICAgICAgMHgxMQorICAgI2RlZmluZSBJUFNfQURUWVBFX1NFUlZFUkFJRDdNICAgICAgIDB4MTIKKworICAgLyoKKyAgICAqIEFkYXB0ZXIgQ29tbWFuZC9TdGF0dXMgUGFja2V0IERlZmluaXRpb25zCisgICAgKi8KKyAgICNkZWZpbmUgSVBTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAweDAxIC8qIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgICAgICAgKi8KKyAgICNkZWZpbmUgSVBTX1NVQ0NFU1NfSU1NICAgICAgICAgICAgICAweDAyIC8qIFN1Y2Nlc3MgLSBJbW1lZGlhdGVseSAgICAgICAgKi8KKyAgICNkZWZpbmUgSVBTX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAweDA0IC8qIENvbXBsZXRlZCB3aXRoIEVycm9yICAgICAgICAgKi8KKworICAgLyoKKyAgICAqIExvZ2ljYWwgRHJpdmUgRXF1YXRlcworICAgICovCisgICAjZGVmaW5lIElQU19MRF9PRkZMSU5FICAgICAgICAgICAgICAgMHgwMgorICAgI2RlZmluZSBJUFNfTERfT0tBWSAgICAgICAgICAgICAgICAgIDB4MDMKKyAgICNkZWZpbmUgSVBTX0xEX0ZSRUUgICAgICAgICAgICAgICAgICAweDAwCisgICAjZGVmaW5lIElQU19MRF9TWVMgICAgICAgICAgICAgICAgICAgMHgwNgorICAgI2RlZmluZSBJUFNfTERfQ1JTICAgICAgICAgICAgICAgICAgIDB4MjQKKworICAgLyoKKyAgICAqIERDREIgVGFibGUgRXF1YXRlcworICAgICovCisgICAjZGVmaW5lIElQU19OT19ESVNDT05ORUNUICAgICAgICAgICAgMHgwMAorICAgI2RlZmluZSBJUFNfRElTQ09OTkVDVF9BTExPV0VEICAgICAgIDB4ODAKKyAgICNkZWZpbmUgSVBTX05PX0FVVE9fUkVRU0VOICAgICAgICAgICAweDQwCisgICAjZGVmaW5lIElQU19EQVRBX05PTkUgICAgICAgICAgICAgICAgMHgwMAorICAgI2RlZmluZSBJUFNfREFUQV9VTksgICAgICAgICAgICAgICAgIDB4MDAKKyAgICNkZWZpbmUgSVBTX0RBVEFfSU4gICAgICAgICAgICAgICAgICAweDAxCisgICAjZGVmaW5lIElQU19EQVRBX09VVCAgICAgICAgICAgICAgICAgMHgwMgorICAgI2RlZmluZSBJUFNfVFJBTlNGRVI2NEsgICAgICAgICAgICAgIDB4MDgKKyAgICNkZWZpbmUgSVBTX05PVElNRU9VVCAgICAgICAgICAgICAgICAweDAwCisgICAjZGVmaW5lIElQU19USU1FT1VUMTAgICAgICAgICAgICAgICAgMHgxMAorICAgI2RlZmluZSBJUFNfVElNRU9VVDYwICAgICAgICAgICAgICAgIDB4MjAKKyAgICNkZWZpbmUgSVBTX1RJTUVPVVQyME0gICAgICAgICAgICAgICAweDMwCisKKyAgIC8qCisgICAgKiBTQ1NJIElucXVpcnkgRGF0YSBGbGFncworICAgICovCisgICAjZGVmaW5lIElQU19TQ1NJX0lOUV9UWVBFX0RBU0QgICAgICAgMHgwMAorICAgI2RlZmluZSBJUFNfU0NTSV9JTlFfVFlQRV9QUk9DRVNTT1IgIDB4MDMKKyAgICNkZWZpbmUgSVBTX1NDU0lfSU5RX0xVX0NPTk5FQ1RFRCAgICAweDAwCisgICAjZGVmaW5lIElQU19TQ1NJX0lOUV9SRF9SRVYyICAgICAgICAgMHgwMgorICAgI2RlZmluZSBJUFNfU0NTSV9JTlFfUkVWMiAgICAgICAgICAgIDB4MDIKKyAgICNkZWZpbmUgSVBTX1NDU0lfSU5RX1JFVjMgICAgICAgICAgICAweDAzCisgICAjZGVmaW5lIElQU19TQ1NJX0lOUV9BZGRyZXNzMTYgICAgICAgMHgwMQorICAgI2RlZmluZSBJUFNfU0NTSV9JTlFfQWRkcmVzczMyICAgICAgIDB4MDIKKyAgICNkZWZpbmUgSVBTX1NDU0lfSU5RX01lZENoYW5nZXIgICAgICAweDA4CisgICAjZGVmaW5lIElQU19TQ1NJX0lOUV9NdWx0aVBvcnQgICAgICAgMHgxMAorICAgI2RlZmluZSBJUFNfU0NTSV9JTlFfRW5jU2VydiAgICAgICAgIDB4NDAKKyAgICNkZWZpbmUgSVBTX1NDU0lfSU5RX1NvZnRSZXNldCAgICAgICAweDAxCisgICAjZGVmaW5lIElQU19TQ1NJX0lOUV9DbWRRdWUgICAgICAgICAgMHgwMgorICAgI2RlZmluZSBJUFNfU0NTSV9JTlFfTGlua2VkICAgICAgICAgIDB4MDgKKyAgICNkZWZpbmUgSVBTX1NDU0lfSU5RX1N5bmMgICAgICAgICAgICAweDEwCisgICAjZGVmaW5lIElQU19TQ1NJX0lOUV9XQnVzMTYgICAgICAgICAgMHgyMAorICAgI2RlZmluZSBJUFNfU0NTSV9JTlFfV0J1czMyICAgICAgICAgIDB4NDAKKyAgICNkZWZpbmUgSVBTX1NDU0lfSU5RX1JlbEFkciAgICAgICAgICAweDgwCisKKyAgIC8qCisgICAgKiBTQ1NJIFJlcXVlc3QgU2Vuc2UgRGF0YSBGbGFncworICAgICovCisgICAjZGVmaW5lIElQU19TQ1NJX1JFUVNFTl9WQUxJRCAgICAgICAgMHg4MAorICAgI2RlZmluZSBJUFNfU0NTSV9SRVFTRU5fQ1VSUkVOVF9FUlIgIDB4NzAKKyAgICNkZWZpbmUgSVBTX1NDU0lfUkVRU0VOX05PX1NFTlNFICAgICAweDAwCisKKyAgIC8qCisgICAgKiBTQ1NJIE1vZGUgUGFnZSBFcXVhdGVzCisgICAgKi8KKyAgICNkZWZpbmUgSVBTX1NDU0lfTVAzX1NvZnRTZWN0b3IgICAgICAweDAxCisgICAjZGVmaW5lIElQU19TQ1NJX01QM19IYXJkU2VjdG9yICAgICAgMHgwMgorICAgI2RlZmluZSBJUFNfU0NTSV9NUDNfUmVtb3ZlYWJsZSAgICAgIDB4MDQKKyAgICNkZWZpbmUgSVBTX1NDU0lfTVAzX0FsbG9jYXRlU3VyZmFjZSAweDA4CisKKyAgIC8qCisgICAgKiBIQSBGbGFncworICAgICovCisKKyAgICNkZWZpbmUgSVBTX0hBX0VOSF9TRyAgICAgICAgICAgICAgICAweDEKKworICAgLyoKKyAgICAqIFNDQiBGbGFncworICAgICovCisgICAjZGVmaW5lIElQU19TQ0JfTUFQX1NHICAgICAgICAgICAgICAgMHgwMDAwOAorICAgI2RlZmluZSBJUFNfU0NCX01BUF9TSU5HTEUgICAgICAgICAgIDBYMDAwMTAKKworICAgLyoKKyAgICAqIFBhc3N0aHJ1IHN0dWZmCisgICAgKi8KKyAgICNkZWZpbmUgSVBTX0NPUFBVU1JDTUQgICAgICAgICAgICAgICgoJ0MnPDw4KSB8IDY1KQorICAgI2RlZmluZSBJUFNfQ09QUElPQ0NNRCAgICAgICAgICAgICAgKCgnQyc8PDgpIHwgNjYpCisgICAjZGVmaW5lIElQU19OVU1DVFJMUyAgICAgICAgICAgICAgICAoKCdDJzw8OCkgfCA2OCkKKyAgICNkZWZpbmUgSVBTX0NUUkxJTkZPICAgICAgICAgICAgICAgICgoJ0MnPDw4KSB8IDY5KQorCisgICAvKiBmbGFzaGluZyBkZWZpbmVzICovCisgICAjZGVmaW5lIElQU19GV19JTUFHRSAgICAgICAgICAgICAgICAweDAwCisgICAjZGVmaW5lIElQU19CSU9TX0lNQUdFICAgICAgICAgICAgICAweDAxCisgICAjZGVmaW5lIElQU19XUklURV9GVyAgICAgICAgICAgICAgICAweDAxCisgICAjZGVmaW5lIElQU19XUklURV9CSU9TICAgICAgICAgICAgICAweDAyCisgICAjZGVmaW5lIElQU19FUkFTRV9CSU9TICAgICAgICAgICAgICAweDAzCisgICAjZGVmaW5lIElQU19CSU9TX0hFQURFUiAgICAgICAgICAgICAweEMwCisKKyAgIC8qIHRpbWUgb3JpZW50ZWQgc3R1ZmYgKi8KKyAgICNkZWZpbmUgSVBTX0lTX0xFQVBfWUVBUih5KSAgICAgICAgICAgKCgoeSAlIDQgPT0gMCkgJiYgKCh5ICUgMTAwICE9IDApIHx8ICh5ICUgNDAwID09IDApKSkgPyAxIDogMCkKKyAgICNkZWZpbmUgSVBTX05VTV9MRUFQX1lFQVJTX1RIUk9VR0goeSkgKCh5KSAvIDQgLSAoeSkgLyAxMDAgKyAoeSkgLyA0MDApCisKKyAgICNkZWZpbmUgSVBTX1NFQ1NfTUlOICAgICAgICAgICAgICAgICA2MAorICAgI2RlZmluZSBJUFNfU0VDU19IT1VSICAgICAgICAgICAgICAgIDM2MDAKKyAgICNkZWZpbmUgSVBTX1NFQ1NfOEhPVVJTICAgICAgICAgICAgICAyODgwMAorICAgI2RlZmluZSBJUFNfU0VDU19EQVkgICAgICAgICAgICAgICAgIDg2NDAwCisgICAjZGVmaW5lIElQU19EQVlTX05PUk1BTF9ZRUFSICAgICAgICAgMzY1CisgICAjZGVmaW5lIElQU19EQVlTX0xFQVBfWUVBUiAgICAgICAgICAgMzY2CisgICAjZGVmaW5lIElQU19FUE9DSF9ZRUFSICAgICAgICAgICAgICAgMTk3MAorCisgICAvKgorICAgICogU2NzaV9Ib3N0IFRlbXBsYXRlCisgICAgKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyAgIHN0YXRpYyBpbnQgaXBzX3Byb2MyNF9pbmZvKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50LCBpbnQpOworICAgc3RhdGljIHZvaWQgaXBzX3NlbGVjdF9xdWV1ZV9kZXB0aChzdHJ1Y3QgU2NzaV9Ib3N0ICosIFNjc2lfRGV2aWNlICopOworICAgc3RhdGljIGludCBpcHNfYmlvc3BhcmFtKERpc2sgKmRpc2ssIGtkZXZfdCBkZXYsIGludCBnZW9tW10pOworI2Vsc2UKKyAgIHN0YXRpYyBpbnQgaXBzX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50KTsKKyAgIHN0YXRpYyBpbnQgaXBzX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgZ2VvbVtdKTsKKyAgIHN0YXRpYyBpbnQgaXBzX3NsYXZlX2NvbmZpZ3VyZShTY3NpX0RldmljZSAqU0RwdHIpOworI2VuZGlmCisKKy8qCisgKiBSYWlkIENvbW1hbmQgRm9ybWF0cworICovCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50OF90ICBvcF9jb2RlOworICAgdWludDhfdCAgY29tbWFuZF9pZDsKKyAgIHVpbnQ4X3QgIGxvZ19kcnY7CisgICB1aW50OF90ICBzZ19jb3VudDsKKyAgIHVpbnQzMl90IGxiYTsKKyAgIHVpbnQzMl90IHNnX2FkZHI7CisgICB1aW50MTZfdCBzZWN0b3JfY291bnQ7CisgICB1aW50OF90ICBzZWdtZW50XzRHOworICAgdWludDhfdCAgZW5oYW5jZWRfc2c7CisgICB1aW50MzJfdCBjY3NhcjsKKyAgIHVpbnQzMl90IGNjY3I7Cit9IElQU19JT19DTUQsICpQSVBTX0lPX0NNRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgb3BfY29kZTsKKyAgIHVpbnQ4X3QgIGNvbW1hbmRfaWQ7CisgICB1aW50MTZfdCByZXNlcnZlZDsKKyAgIHVpbnQzMl90IHJlc2VydmVkMjsKKyAgIHVpbnQzMl90IGJ1ZmZlcl9hZGRyOworICAgdWludDMyX3QgcmVzZXJ2ZWQzOworICAgdWludDMyX3QgY2NzYXI7CisgICB1aW50MzJfdCBjY2NyOworfSBJUFNfTERfQ01ELCAqUElQU19MRF9DTUQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgIG9wX2NvZGU7CisgICB1aW50OF90ICBjb21tYW5kX2lkOworICAgdWludDhfdCAgcmVzZXJ2ZWQ7CisgICB1aW50OF90ICByZXNlcnZlZDI7CisgICB1aW50MzJfdCByZXNlcnZlZDM7CisgICB1aW50MzJfdCBidWZmZXJfYWRkcjsKKyAgIHVpbnQzMl90IHJlc2VydmVkNDsKK30gSVBTX0lPQ1RMX0NNRCwgKlBJUFNfSU9DVExfQ01EOyAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgb3BfY29kZTsKKyAgIHVpbnQ4X3QgIGNvbW1hbmRfaWQ7CisgICB1aW50OF90ICBjaGFubmVsOworICAgdWludDhfdCAgcmVzZXJ2ZWQzOworICAgdWludDhfdCAgcmVzZXJ2ZWQ0OworICAgdWludDhfdCAgcmVzZXJ2ZWQ1OworICAgdWludDhfdCAgcmVzZXJ2ZWQ2OworICAgdWludDhfdCAgcmVzZXJ2ZWQ3OworICAgdWludDhfdCAgcmVzZXJ2ZWQ4OworICAgdWludDhfdCAgcmVzZXJ2ZWQ5OworICAgdWludDhfdCAgcmVzZXJ2ZWQxMDsKKyAgIHVpbnQ4X3QgIHJlc2VydmVkMTE7CisgICB1aW50OF90ICByZXNlcnZlZDEyOworICAgdWludDhfdCAgcmVzZXJ2ZWQxMzsKKyAgIHVpbnQ4X3QgIHJlc2VydmVkMTQ7CisgICB1aW50OF90ICBhZGFwdGVyX2ZsYWc7Cit9IElQU19SRVNFVF9DTUQsICpQSVBTX1JFU0VUX0NNRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgb3BfY29kZTsKKyAgIHVpbnQ4X3QgIGNvbW1hbmRfaWQ7CisgICB1aW50MTZfdCByZXNlcnZlZDsKKyAgIHVpbnQzMl90IHJlc2VydmVkMjsKKyAgIHVpbnQzMl90IGRjZGJfYWRkcmVzczsKKyAgIHVpbnQxNl90IHJlc2VydmVkMzsKKyAgIHVpbnQ4X3QgIHNlZ21lbnRfNEc7CisgICB1aW50OF90ICBlbmhhbmNlZF9zZzsKKyAgIHVpbnQzMl90IGNjc2FyOworICAgdWludDMyX3QgY2NjcjsKK30gSVBTX0RDREJfQ01ELCAqUElQU19EQ0RCX0NNRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgb3BfY29kZTsKKyAgIHVpbnQ4X3QgIGNvbW1hbmRfaWQ7CisgICB1aW50OF90ICBjaGFubmVsOworICAgdWludDhfdCAgc291cmNlX3RhcmdldDsKKyAgIHVpbnQzMl90IHJlc2VydmVkOworICAgdWludDMyX3QgcmVzZXJ2ZWQyOworICAgdWludDMyX3QgcmVzZXJ2ZWQzOworICAgdWludDMyX3QgY2NzYXI7CisgICB1aW50MzJfdCBjY2NyOworfSBJUFNfQ1NfQ01ELCAqUElQU19DU19DTUQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgIG9wX2NvZGU7CisgICB1aW50OF90ICBjb21tYW5kX2lkOworICAgdWludDhfdCAgbG9nX2RydjsKKyAgIHVpbnQ4X3QgIGNvbnRyb2w7CisgICB1aW50MzJfdCByZXNlcnZlZDsKKyAgIHVpbnQzMl90IHJlc2VydmVkMjsKKyAgIHVpbnQzMl90IHJlc2VydmVkMzsKKyAgIHVpbnQzMl90IGNjc2FyOworICAgdWludDMyX3QgY2NjcjsKK30gSVBTX1VTX0NNRCwgKlBJUFNfVVNfQ01EOworCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50OF90ICBvcF9jb2RlOworICAgdWludDhfdCAgY29tbWFuZF9pZDsKKyAgIHVpbnQ4X3QgIHJlc2VydmVkOworICAgdWludDhfdCAgc3RhdGU7CisgICB1aW50MzJfdCByZXNlcnZlZDI7CisgICB1aW50MzJfdCByZXNlcnZlZDM7CisgICB1aW50MzJfdCByZXNlcnZlZDQ7CisgICB1aW50MzJfdCBjY3NhcjsKKyAgIHVpbnQzMl90IGNjY3I7Cit9IElQU19GQ19DTUQsICpQSVBTX0ZDX0NNRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgb3BfY29kZTsKKyAgIHVpbnQ4X3QgIGNvbW1hbmRfaWQ7CisgICB1aW50OF90ICByZXNlcnZlZDsKKyAgIHVpbnQ4X3QgIGRlc2M7CisgICB1aW50MzJfdCByZXNlcnZlZDI7CisgICB1aW50MzJfdCBidWZmZXJfYWRkcjsKKyAgIHVpbnQzMl90IHJlc2VydmVkMzsKKyAgIHVpbnQzMl90IGNjc2FyOworICAgdWludDMyX3QgY2NjcjsKK30gSVBTX1NUQVRVU19DTUQsICpQSVBTX1NUQVRVU19DTUQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgIG9wX2NvZGU7CisgICB1aW50OF90ICBjb21tYW5kX2lkOworICAgdWludDhfdCAgcGFnZTsKKyAgIHVpbnQ4X3QgIHdyaXRlOworICAgdWludDMyX3QgcmVzZXJ2ZWQ7CisgICB1aW50MzJfdCBidWZmZXJfYWRkcjsKKyAgIHVpbnQzMl90IHJlc2VydmVkMjsKKyAgIHVpbnQzMl90IGNjc2FyOworICAgdWludDMyX3QgY2NjcjsKK30gSVBTX05WUkFNX0NNRCwgKlBJUFNfTlZSQU1fQ01EOworCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgICB1aW50OF90ICBvcF9jb2RlOworICAgIHVpbnQ4X3QgIGNvbW1hbmRfaWQ7CisgICAgdWludDE2X3QgcmVzZXJ2ZWQ7CisgICAgdWludDMyX3QgY291bnQ7CisgICAgdWludDMyX3QgYnVmZmVyX2FkZHI7CisgICAgdWludDMyX3QgcmVzZXJ2ZWQyOworfSBJUFNfVkVSU0lPTl9JTkZPLCAqUElQU19WRVJTSU9OX0lORk87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgIG9wX2NvZGU7CisgICB1aW50OF90ICBjb21tYW5kX2lkOworICAgdWludDhfdCAgcmVzZXRfY291bnQ7CisgICB1aW50OF90ICByZXNldF90eXBlOworICAgdWludDhfdCAgc2Vjb25kOworICAgdWludDhfdCAgbWludXRlOworICAgdWludDhfdCAgaG91cjsKKyAgIHVpbnQ4X3QgIGRheTsKKyAgIHVpbnQ4X3QgIHJlc2VydmVkMVs0XTsKKyAgIHVpbnQ4X3QgIG1vbnRoOworICAgdWludDhfdCAgeWVhckg7CisgICB1aW50OF90ICB5ZWFyTDsKKyAgIHVpbnQ4X3QgIHJlc2VydmVkMjsKK30gSVBTX0ZGRENfQ01ELCAqUElQU19GRkRDX0NNRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgb3BfY29kZTsKKyAgIHVpbnQ4X3QgIGNvbW1hbmRfaWQ7CisgICB1aW50OF90ICB0eXBlOworICAgdWludDhfdCAgZGlyZWN0aW9uOworICAgdWludDMyX3QgY291bnQ7CisgICB1aW50MzJfdCBidWZmZXJfYWRkcjsKKyAgIHVpbnQ4X3QgIHRvdGFsX3BhY2tldHM7CisgICB1aW50OF90ICBwYWNrZXRfbnVtOworICAgdWludDE2X3QgcmVzZXJ2ZWQ7Cit9IElQU19GTEFTSEZXX0NNRCwgKlBJUFNfRkxBU0hGV19DTUQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgIG9wX2NvZGU7CisgICB1aW50OF90ICBjb21tYW5kX2lkOworICAgdWludDhfdCAgdHlwZTsKKyAgIHVpbnQ4X3QgIGRpcmVjdGlvbjsKKyAgIHVpbnQzMl90IGNvdW50OworICAgdWludDMyX3QgYnVmZmVyX2FkZHI7CisgICB1aW50MzJfdCBvZmZzZXQ7Cit9IElQU19GTEFTSEJJT1NfQ01ELCAqUElQU19GTEFTSEJJT1NfQ01EOworCit0eXBlZGVmIHVuaW9uIHsKKyAgIElQU19JT19DTUQgICAgICAgICBiYXNpY19pbzsKKyAgIElQU19MRF9DTUQgICAgICAgICBsb2dpY2FsX2luZm87CisgICBJUFNfSU9DVExfQ01EICAgICAgaW9jdGxfaW5mbzsKKyAgIElQU19EQ0RCX0NNRCAgICAgICBkY2RiOworICAgSVBTX0NTX0NNRCAgICAgICAgIGNvbmZpZ19zeW5jOworICAgSVBTX1VTX0NNRCAgICAgICAgIHVubG9ja19zdHJpcGU7CisgICBJUFNfRkNfQ01EICAgICAgICAgZmx1c2hfY2FjaGU7CisgICBJUFNfU1RBVFVTX0NNRCAgICAgc3RhdHVzOworICAgSVBTX05WUkFNX0NNRCAgICAgIG52cmFtOworICAgSVBTX0ZGRENfQ01EICAgICAgIGZmZGM7CisgICBJUFNfRkxBU0hGV19DTUQgICAgZmxhc2hmdzsKKyAgIElQU19GTEFTSEJJT1NfQ01EICBmbGFzaGJpb3M7CisgICBJUFNfVkVSU0lPTl9JTkZPICAgdmVyc2lvbl9pbmZvOworICAgSVBTX1JFU0VUX0NNRCAgICAgIHJlc2V0OworfSBJUFNfSE9TVF9DT01NQU5ELCAqUElQU19IT1NUX0NPTU1BTkQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgIGxvZ2ljYWxfaWQ7CisgICB1aW50OF90ICByZXNlcnZlZDsKKyAgIHVpbnQ4X3QgIHJhaWRfbGV2ZWw7CisgICB1aW50OF90ICBzdGF0ZTsKKyAgIHVpbnQzMl90IHNlY3Rvcl9jb3VudDsKK30gSVBTX0RSSVZFX0lORk8sICpQSVBTX0RSSVZFX0lORk87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgICAgICAgbm9fb2ZfbG9nX2RyaXZlOworICAgdWludDhfdCAgICAgICByZXNlcnZlZFszXTsKKyAgIElQU19EUklWRV9JTkZPIGRyaXZlX2luZm9bSVBTX01BWF9MRF07Cit9IElQU19MRF9JTkZPLCAqUElQU19MRF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50OF90ICAgZGV2aWNlX2FkZHJlc3M7CisgICB1aW50OF90ICAgY21kX2F0dHJpYnV0ZTsKKyAgIHVpbnQxNl90ICB0cmFuc2Zlcl9sZW5ndGg7CisgICB1aW50MzJfdCAgYnVmZmVyX3BvaW50ZXI7CisgICB1aW50OF90ICAgY2RiX2xlbmd0aDsKKyAgIHVpbnQ4X3QgICBzZW5zZV9sZW5ndGg7CisgICB1aW50OF90ICAgc2dfY291bnQ7CisgICB1aW50OF90ICAgcmVzZXJ2ZWQ7CisgICB1aW50OF90ICAgc2NzaV9jZGJbMTJdOworICAgdWludDhfdCAgIHNlbnNlX2luZm9bNjRdOworICAgdWludDhfdCAgIHNjc2lfc3RhdHVzOworICAgdWludDhfdCAgIHJlc2VydmVkMlszXTsKK30gSVBTX0RDREJfVEFCTEUsICpQSVBTX0RDREJfVEFCTEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgICBkZXZpY2VfYWRkcmVzczsKKyAgIHVpbnQ4X3QgICBjbWRfYXR0cmlidXRlOworICAgdWludDhfdCAgIGNkYl9sZW5ndGg7CisgICB1aW50OF90ICAgcmVzZXJ2ZWRfZm9yX0xVTjsgCSAKKyAgIHVpbnQzMl90ICB0cmFuc2Zlcl9sZW5ndGg7CisgICB1aW50MzJfdCAgYnVmZmVyX3BvaW50ZXI7CisgICB1aW50MTZfdCAgc2dfY291bnQ7CisgICB1aW50OF90ICAgc2Vuc2VfbGVuZ3RoOworICAgdWludDhfdCAgIHNjc2lfc3RhdHVzOworICAgdWludDMyX3QgIHJlc2VydmVkOworICAgdWludDhfdCAgIHNjc2lfY2RiWzE2XTsKKyAgIHVpbnQ4X3QgICBzZW5zZV9pbmZvWzU2XTsKK30gSVBTX0RDREJfVEFCTEVfVEFQRSwgKlBJUFNfRENEQl9UQUJMRV9UQVBFOworCit0eXBlZGVmIHVuaW9uIHsKKyAgIHN0cnVjdCB7CisgICAgICB2b2xhdGlsZSB1aW50OF90ICByZXNlcnZlZDsKKyAgICAgIHZvbGF0aWxlIHVpbnQ4X3QgIGNvbW1hbmRfaWQ7CisgICAgICB2b2xhdGlsZSB1aW50OF90ICBiYXNpY19zdGF0dXM7CisgICAgICB2b2xhdGlsZSB1aW50OF90ICBleHRlbmRlZF9zdGF0dXM7CisgICB9IGZpZWxkczsKKworICAgdm9sYXRpbGUgdWludDMyX3QgICAgdmFsdWU7Cit9IElQU19TVEFUVVMsICpQSVBTX1NUQVRVUzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgSVBTX1NUQVRVUyAgICAgICAgICAgc3RhdHVzW0lQU19NQVhfQ01EUyArIDFdOworICAgdm9sYXRpbGUgUElQU19TVEFUVVMgcF9zdGF0dXNfc3RhcnQ7CisgICB2b2xhdGlsZSBQSVBTX1NUQVRVUyBwX3N0YXR1c19lbmQ7CisgICB2b2xhdGlsZSBQSVBTX1NUQVRVUyBwX3N0YXR1c190YWlsOworICAgdm9sYXRpbGUgdWludDMyX3QgICAgaHdfc3RhdHVzX3N0YXJ0OworICAgdm9sYXRpbGUgdWludDMyX3QgICAgaHdfc3RhdHVzX3RhaWw7Cit9IElQU19BREFQVEVSLCAqUElQU19BREFQVEVSOworCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50OF90ICB1Y0xvZ0RyaXZlQ291bnQ7CisgICB1aW50OF90ICB1Y01pc2NGbGFnOworICAgdWludDhfdCAgdWNTTFRGbGFnOworICAgdWludDhfdCAgdWNCU1RGbGFnOworICAgdWludDhfdCAgdWNQd3JDaGdDbnQ7CisgICB1aW50OF90ICB1Y1dyb25nQWRyQ250OworICAgdWludDhfdCAgdWNVbmlkZW50Q250OworICAgdWludDhfdCAgdWNOVnJhbURldkNoZ0NudDsKKyAgIHVpbnQ4X3QgIENvZGVCbGtWZXJzaW9uWzhdOworICAgdWludDhfdCAgQm9vdEJsa1ZlcnNpb25bOF07CisgICB1aW50MzJfdCB1bERyaXZlU2l6ZVtJUFNfTUFYX0xEXTsKKyAgIHVpbnQ4X3QgIHVjQ29uY3VycmVudENtZENvdW50OworICAgdWludDhfdCAgdWNNYXhQaHlzaWNhbERldmljZXM7CisgICB1aW50MTZfdCB1c0ZsYXNoUmVwZ21Db3VudDsKKyAgIHVpbnQ4X3QgIHVjRGVmdW5jdERpc2tDb3VudDsKKyAgIHVpbnQ4X3QgIHVjUmVidWlsZEZsYWc7CisgICB1aW50OF90ICB1Y09mZmxpbmVMb2dEcnZDb3VudDsKKyAgIHVpbnQ4X3QgIHVjQ3JpdGljYWxEcnZDb3VudDsKKyAgIHVpbnQxNl90IHVzQ29uZmlnVXBkYXRlQ291bnQ7CisgICB1aW50OF90ICB1Y0Jsa0ZsYWc7CisgICB1aW50OF90ICByZXNlcnZlZDsKKyAgIHVpbnQxNl90IHVzQWRkckRlYWREaXNrW0lQU19NQVhfQ0hBTk5FTFMgKiAoSVBTX01BWF9UQVJHRVRTICsgMSldOworfSBJUFNfRU5RLCAqUElQU19FTlE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgIHVjSW5pdGlhdG9yOworICAgdWludDhfdCAgdWNQYXJhbWV0ZXJzOworICAgdWludDhfdCAgdWNNaXNjRmxhZzsKKyAgIHVpbnQ4X3QgIHVjU3RhdGU7CisgICB1aW50MzJfdCB1bEJsb2NrQ291bnQ7CisgICB1aW50OF90ICB1Y0RldmljZUlkWzI4XTsKK30gSVBTX0RFVlNUQVRFLCAqUElQU19ERVZTVEFURTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgdWNDaG47CisgICB1aW50OF90ICB1Y1RndDsKKyAgIHVpbnQxNl90IHVjUmVzZXJ2ZWQ7CisgICB1aW50MzJfdCB1bFN0YXJ0U2VjdDsKKyAgIHVpbnQzMl90IHVsTm9PZlNlY3RzOworfSBJUFNfQ0hVTkssICpQSVBTX0NIVU5LOworCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50MTZfdCB1Y1VzZXJGaWVsZDsKKyAgIHVpbnQ4X3QgIHVjU3RhdGU7CisgICB1aW50OF90ICB1Y1JhaWRDYWNoZVBhcmFtOworICAgdWludDhfdCAgdWNOb09mQ2h1bmtVbml0czsKKyAgIHVpbnQ4X3QgIHVjU3RyaXBlU2l6ZTsKKyAgIHVpbnQ4X3QgIHVjUGFyYW1zOworICAgdWludDhfdCAgdWNSZXNlcnZlZDsKKyAgIHVpbnQzMl90IHVsTG9nRHJ2U2l6ZTsKKyAgIElQU19DSFVOSyBjaHVua1tJUFNfTUFYX0NIVU5LU107Cit9IElQU19MRCwgKlBJUFNfTEQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgIGJvYXJkX2Rpc2NbOF07CisgICB1aW50OF90ICBwcm9jZXNzb3JbOF07CisgICB1aW50OF90ICB1Y05vQ2hhblR5cGU7CisgICB1aW50OF90ICB1Y05vSG9zdEludFR5cGU7CisgICB1aW50OF90ICB1Y0NvbXByZXNzaW9uOworICAgdWludDhfdCAgdWNOdnJhbVR5cGU7CisgICB1aW50MzJfdCB1bE52cmFtU2l6ZTsKK30gSVBTX0hBUkRXQVJFLCAqUElQU19IQVJEV0FSRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgICAgICAgdWNMb2dEcml2ZUNvdW50OworICAgdWludDhfdCAgICAgICAgdWNEYXRlRDsKKyAgIHVpbnQ4X3QgICAgICAgIHVjRGF0ZU07CisgICB1aW50OF90ICAgICAgICB1Y0RhdGVZOworICAgdWludDhfdCAgICAgICAgaW5pdF9pZFs0XTsKKyAgIHVpbnQ4X3QgICAgICAgIGhvc3RfaWRbMTJdOworICAgdWludDhfdCAgICAgICAgdGltZV9zaWduWzhdOworICAgdWludDMyX3QgICAgICAgVXNlck9wdDsKKyAgIHVpbnQxNl90ICAgICAgIHVzZXJfZmllbGQ7CisgICB1aW50OF90ICAgICAgICB1Y1JlYnVpbGRSYXRlOworICAgdWludDhfdCAgICAgICAgdWNSZXNlcnZlOworICAgSVBTX0hBUkRXQVJFICAgaGFyZHdhcmVfZGlzYzsKKyAgIElQU19MRCAgICAgICAgIGxvZ2ljYWxfZHJpdmVbSVBTX01BWF9MRF07CisgICBJUFNfREVWU1RBVEUgICBkZXZbSVBTX01BWF9DSEFOTkVMU11bSVBTX01BWF9UQVJHRVRTKzFdOworICAgdWludDhfdCAgICAgICAgcmVzZXJ2ZWRbNTEyXTsKK30gSVBTX0NPTkYsICpQSVBTX0NPTkY7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQzMl90ICBzaWduYXR1cmU7CisgICB1aW50OF90ICAgcmVzZXJ2ZWQxOworICAgdWludDhfdCAgIGFkYXB0ZXJfc2xvdDsKKyAgIHVpbnQxNl90ICBhZGFwdGVyX3R5cGU7CisgICB1aW50OF90ICAgY3RybF9iaW9zWzhdOworICAgdWludDhfdCAgIHZlcnNpb25pbmc7ICAgICAgICAgICAgICAgICAgIC8qIDEgPSBWZXJzaW9uaW5nIFN1cHBvcnRlZCwgZWxzZSAwICovCisgICB1aW50OF90ICAgdmVyc2lvbl9taXNtYXRjaDsgICAgICAgICAgICAgLyogMSA9IFZlcnNpb25pbmcgTWlzTWF0Y2gsICBlbHNlIDAgKi8KKyAgIHVpbnQ4X3QgICByZXNlcnZlZDI7CisgICB1aW50OF90ICAgb3BlcmF0aW5nX3N5c3RlbTsKKyAgIHVpbnQ4X3QgICBkcml2ZXJfaGlnaFs0XTsKKyAgIHVpbnQ4X3QgICBkcml2ZXJfbG93WzRdOworICAgdWludDhfdCAgIEJpb3NDb21wYXRpYmlsaXR5SURbOF07CisgICB1aW50OF90ICAgUmVzZXJ2ZWRGb3JPUzJbOF07CisgICB1aW50OF90ICAgYmlvc19oaWdoWzRdOyAgICAgICAgICAgICAgICAgLyogQWRhcHRlcidzIEZsYXNoZWQgQklPUyBWZXJzaW9uICAgKi8KKyAgIHVpbnQ4X3QgICBiaW9zX2xvd1s0XTsKKyAgIHVpbnQ4X3QgICBhZGFwdGVyX29yZGVyWzE2XTsgICAgICAgICAgICAvKiBCSU9TIFRlbGxpbmcgdXMgdGhlIFNvcnQgT3JkZXIgICAqLworICAgdWludDhfdCAgIEZpbGxlcls2MF07Cit9IElQU19OVlJBTV9QNSwgKlBJUFNfTlZSQU1fUDU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRGF0YSByZXR1cm5lZCBmcm9tIGEgR2V0VmVyc2lvbiBDb21tYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3ViU3lzdGVtIFBhcmFtZXRlcls0XSAgICAgICovCisjZGVmaW5lICBJUFNfR0VUX1ZFUlNJT05fU1VQUE9SVCAweDAwMDE4MDAwICAvKiBNYXNrIGZvciBWZXJzaW9uaW5nIFN1cHBvcnQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgICB1aW50MzJfdCAgcmV2aXNpb247CisgICB1aW50OF90ICAgYm9vdEJsa1ZlcnNpb25bMzJdOworICAgdWludDhfdCAgIGJvb3RCbGtBdHRyaWJ1dGVzWzRdOworICAgdWludDhfdCAgIGNvZGVCbGtWZXJzaW9uWzMyXTsKKyAgIHVpbnQ4X3QgICBiaW9zVmVyc2lvblszMl07CisgICB1aW50OF90ICAgYmlvc0F0dHJpYnV0ZXNbNF07CisgICB1aW50OF90ICAgY29tcGF0aWJpbGl0eUlkWzMyXTsKKyAgIHVpbnQ4X3QgICByZXNlcnZlZFs0XTsKK30gSVBTX1ZFUlNJT05fREFUQTsKKworCit0eXBlZGVmIHN0cnVjdCBfSVBTX1NVQlNZUyB7CisgICB1aW50MzJfdCAgcGFyYW1bMTI4XTsKK30gSVBTX1NVQlNZUywgKlBJUFNfU1VCU1lTOworCisvKioKKyAqKiBTQ1NJIFN0cnVjdHVyZXMKKyAqKi8KKworLyoKKyAqIElucXVpcnkgRGF0YSBGb3JtYXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgIERldmljZVR5cGU7CisgICB1aW50OF90ICAgRGV2aWNlVHlwZVF1YWxpZmllcjsKKyAgIHVpbnQ4X3QgICBWZXJzaW9uOworICAgdWludDhfdCAgIFJlc3BvbnNlRGF0YUZvcm1hdDsKKyAgIHVpbnQ4X3QgICBBZGRpdGlvbmFsTGVuZ3RoOworICAgdWludDhfdCAgIFJlc2VydmVkOworICAgdWludDhfdCAgIEZsYWdzWzJdOworICAgdWludDhfdCAgIFZlbmRvcklkWzhdOworICAgdWludDhfdCAgIFByb2R1Y3RJZFsxNl07CisgICB1aW50OF90ICAgUHJvZHVjdFJldmlzaW9uTGV2ZWxbNF07CisgICB1aW50OF90ICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm92aWRlcyBOVUxMIHRlcm1pbmF0b3IgdG8gbmFtZSAqLworfSBJUFNfU0NTSV9JTlFfREFUQSwgKlBJUFNfU0NTSV9JTlFfREFUQTsKKworLyoKKyAqIFJlYWQgQ2FwYWNpdHkgRGF0YSBGb3JtYXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDMyX3QgbGJhOworICAgdWludDMyX3QgbGVuOworfSBJUFNfU0NTSV9DQVBBQ0lUWTsKKworLyoKKyAqIFJlcXVlc3QgU2Vuc2UgRGF0YSBGb3JtYXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgUmVzcG9uc2VDb2RlOworICAgdWludDhfdCAgU2VnbWVudE51bWJlcjsKKyAgIHVpbnQ4X3QgIEZsYWdzOworICAgdWludDhfdCAgSW5mb3JtYXRpb25bNF07CisgICB1aW50OF90ICBBZGRpdGlvbmFsTGVuZ3RoOworICAgdWludDhfdCAgQ29tbWFuZFNwZWNpZmljWzRdOworICAgdWludDhfdCAgQWRkaXRpb25hbFNlbnNlQ29kZTsKKyAgIHVpbnQ4X3QgIEFkZGl0aW9uYWxTZW5zZUNvZGVRdWFsOworICAgdWludDhfdCAgRlJVQ29kZTsKKyAgIHVpbnQ4X3QgIFNlbnNlS2V5U3BlY2lmaWNbM107Cit9IElQU19TQ1NJX1JFUVNFTjsKKworLyoKKyAqIFNlbnNlIERhdGEgRm9ybWF0IC0gUGFnZSAzCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgIFBhZ2VDb2RlOworICAgdWludDhfdCAgUGFnZUxlbmd0aDsKKyAgIHVpbnQxNl90IFRyYWNrc1BlclpvbmU7CisgICB1aW50MTZfdCBBbHRTZWN0b3JzUGVyWm9uZTsKKyAgIHVpbnQxNl90IEFsdFRyYWNrc1BlclpvbmU7CisgICB1aW50MTZfdCBBbHRUcmFja3NQZXJWb2x1bWU7CisgICB1aW50MTZfdCBTZWN0b3JzUGVyVHJhY2s7CisgICB1aW50MTZfdCBCeXRlc1BlclNlY3RvcjsKKyAgIHVpbnQxNl90IEludGVybGVhdmU7CisgICB1aW50MTZfdCBUcmFja1NrZXc7CisgICB1aW50MTZfdCBDeWxpbmRlclNrZXc7CisgICB1aW50OF90ICBmbGFnczsKKyAgIHVpbnQ4X3QgIHJlc2VydmVkWzNdOworfSBJUFNfU0NTSV9NT0RFX1BBR0UzOworCisvKgorICogU2Vuc2UgRGF0YSBGb3JtYXQgLSBQYWdlIDQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgUGFnZUNvZGU7CisgICB1aW50OF90ICBQYWdlTGVuZ3RoOworICAgdWludDE2X3QgQ3lsaW5kZXJzSGlnaDsKKyAgIHVpbnQ4X3QgIEN5bGluZGVyc0xvdzsKKyAgIHVpbnQ4X3QgIEhlYWRzOworICAgdWludDE2X3QgV3JpdGVQcmVjb21wSGlnaDsKKyAgIHVpbnQ4X3QgIFdyaXRlUHJlY29tcExvdzsKKyAgIHVpbnQxNl90IFJlZHVjZWRXcml0ZUN1cnJlbnRIaWdoOworICAgdWludDhfdCAgUmVkdWNlZFdyaXRlQ3VycmVudExvdzsKKyAgIHVpbnQxNl90IFN0ZXBSYXRlOworICAgdWludDE2X3QgTGFuZGluZ1pvbmVIaWdoOworICAgdWludDhfdCAgTGFuZGluZ1pvbmVMb3c7CisgICB1aW50OF90ICBmbGFnczsKKyAgIHVpbnQ4X3QgIFJvdGF0aW9uYWxPZmZzZXQ7CisgICB1aW50OF90ICBSZXNlcnZlZDsKKyAgIHVpbnQxNl90IE1lZGl1bVJvdGF0aW9uUmF0ZTsKKyAgIHVpbnQ4X3QgIFJlc2VydmVkMlsyXTsKK30gSVBTX1NDU0lfTU9ERV9QQUdFNDsKKworLyoKKyAqIFNlbnNlIERhdGEgRm9ybWF0IC0gUGFnZSA4CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgIFBhZ2VDb2RlOworICAgdWludDhfdCAgUGFnZUxlbmd0aDsKKyAgIHVpbnQ4X3QgIGZsYWdzOworICAgdWludDhfdCAgUmV0ZW50UHJpbzsKKyAgIHVpbnQxNl90IERpc1ByZWZldGNoTGVuOworICAgdWludDE2X3QgTWluUHJlZmV0Y2hMZW47CisgICB1aW50MTZfdCBNYXhQcmVmZXRjaExlbjsKKyAgIHVpbnQxNl90IE1heFByZWZldGNoQ2VpbGluZzsKK30gSVBTX1NDU0lfTU9ERV9QQUdFODsKKworLyoKKyAqIFNlbnNlIERhdGEgRm9ybWF0IC0gQmxvY2sgRGVzY3JpcHRvciAoREFTRCkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDMyX3QgTnVtYmVyT2ZCbG9ja3M7CisgICB1aW50OF90ICBEZW5zaXR5Q29kZTsKKyAgIHVpbnQxNl90IEJsb2NrTGVuZ3RoSGlnaDsKKyAgIHVpbnQ4X3QgIEJsb2NrTGVuZ3RoTG93OworfSBJUFNfU0NTSV9NT0RFX1BBR0VfQkxLREVTQzsKKworLyoKKyAqIFNlbnNlIERhdGEgRm9ybWF0IC0gTW9kZSBQYWdlIEhlYWRlcgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50OF90ICBEYXRhTGVuZ3RoOworICAgdWludDhfdCAgTWVkaXVtVHlwZTsKKyAgIHVpbnQ4X3QgIFJlc2VydmVkOworICAgdWludDhfdCAgQmxvY2tEZXNjTGVuZ3RoOworfSBJUFNfU0NTSV9NT0RFX1BBR0VfSEVBREVSOworCit0eXBlZGVmIHN0cnVjdCB7CisgICBJUFNfU0NTSV9NT0RFX1BBR0VfSEVBREVSICBoZHI7CisgICBJUFNfU0NTSV9NT0RFX1BBR0VfQkxLREVTQyBibGtkZXNjOworCisgICB1bmlvbiB7CisgICAgICBJUFNfU0NTSV9NT0RFX1BBR0UzIHBnMzsKKyAgICAgIElQU19TQ1NJX01PREVfUEFHRTQgcGc0OworICAgICAgSVBTX1NDU0lfTU9ERV9QQUdFOCBwZzg7CisgICB9IHBkYXRhOworfSBJUFNfU0NTSV9NT0RFX1BBR0VfREFUQTsKKworLyoKKyAqIFNjYXR0ZXIgR2F0aGVyIGxpc3QgZm9ybWF0CisgKi8KK3R5cGVkZWYgc3RydWN0IGlwc19zZ2xpc3QgeworICAgdWludDMyX3QgYWRkcmVzczsKKyAgIHVpbnQzMl90IGxlbmd0aDsKK30gSVBTX1NURF9TR19MSVNUOworCit0eXBlZGVmIHN0cnVjdCBpcHNfZW5oX3NnbGlzdCB7CisgICB1aW50MzJfdCBhZGRyZXNzX2xvOworICAgdWludDMyX3QgYWRkcmVzc19oaTsKKyAgIHVpbnQzMl90IGxlbmd0aDsKKyAgIHVpbnQzMl90IHJlc2VydmVkOworfSBJUFNfRU5IX1NHX0xJU1Q7CisKK3R5cGVkZWYgdW5pb24geworICAgdm9pZCAgICAgICAgICAgICAqbGlzdDsKKyAgIElQU19TVERfU0dfTElTVCAgKnN0ZF9saXN0OworICAgSVBTX0VOSF9TR19MSVNUICAqZW5oX2xpc3Q7Cit9IElQU19TR19MSVNUOworCit0eXBlZGVmIHN0cnVjdCBfSVBTX0lORk9TVFIgeworICAgY2hhciAqYnVmZmVyOworICAgaW50ICAgbGVuZ3RoOworICAgaW50ICAgb2Zmc2V0OworICAgaW50ICAgcG9zOworICAgaW50ICAgbG9jYWxwb3M7Cit9IElQU19JTkZPU1RSOworCit0eXBlZGVmIHN0cnVjdCB7CisgICBjaGFyICpvcHRpb25fbmFtZTsKKyAgIGludCAgKm9wdGlvbl9mbGFnOworICAgaW50ICAgb3B0aW9uX3ZhbHVlOworfSBJUFNfT1BUSU9OOworCisvKgorICogU3RhdHVzIEluZm8KKyAqLwordHlwZWRlZiBzdHJ1Y3QgaXBzX3N0YXQgeworICAgdWludDMyX3QgcmVzaWR1ZV9sZW47CisgICB2b2lkICAgICAqc2NiX2FkZHI7CisgICB1aW50OF90ICBwYWRkaW5nWzEyIC0gc2l6ZW9mKHZvaWQgKildOworfSBpcHNfc3RhdF90OworCisvKgorICogU0NCIFF1ZXVlIEZvcm1hdAorICovCit0eXBlZGVmIHN0cnVjdCBpcHNfc2NiX3F1ZXVlIHsKKyAgIHN0cnVjdCBpcHNfc2NiICpoZWFkOworICAgc3RydWN0IGlwc19zY2IgKnRhaWw7CisgICBpbnQgICAgICAgICAgICAgY291bnQ7Cit9IGlwc19zY2JfcXVldWVfdDsKKworLyoKKyAqIFdhaXQgcXVldWVfZm9ybWF0CisgKi8KK3R5cGVkZWYgc3RydWN0IGlwc193YWl0X3F1ZXVlIHsKKyAgIFNjc2lfQ21uZCAgICAgICpoZWFkOworICAgU2NzaV9DbW5kICAgICAgKnRhaWw7CisgICBpbnQgICAgICAgICAgICAgY291bnQ7Cit9IGlwc193YWl0X3F1ZXVlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGlwc19jb3BwX3dhaXRfaXRlbSB7CisgICBTY3NpX0NtbmQgICAgICAgICAgICAgICAgICpzY3NpX2NtZDsKKyAgIHN0cnVjdCBpcHNfY29wcF93YWl0X2l0ZW0gKm5leHQ7Cit9IGlwc19jb3BwX3dhaXRfaXRlbV90OworCit0eXBlZGVmIHN0cnVjdCBpcHNfY29wcF9xdWV1ZSB7CisgICBzdHJ1Y3QgaXBzX2NvcHBfd2FpdF9pdGVtICpoZWFkOworICAgc3RydWN0IGlwc19jb3BwX3dhaXRfaXRlbSAqdGFpbDsKKyAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OworfSBpcHNfY29wcF9xdWV1ZV90OworCisvKiBmb3J3YXJkIGRlY2wgZm9yIGhvc3Qgc3RydWN0dXJlICovCitzdHJ1Y3QgaXBzX2hhOworCit0eXBlZGVmIHN0cnVjdCB7CisgICBpbnQgICAgICAgKCpyZXNldCkoc3RydWN0IGlwc19oYSAqKTsKKyAgIGludCAgICAgICAoKmlzc3VlKShzdHJ1Y3QgaXBzX2hhICosIHN0cnVjdCBpcHNfc2NiICopOworICAgaW50ICAgICAgICgqaXNpbml0KShzdHJ1Y3QgaXBzX2hhICopOworICAgaW50ICAgICAgICgqaXNpbnRyKShzdHJ1Y3QgaXBzX2hhICopOworICAgaW50ICAgICAgICgqaW5pdCkoc3RydWN0IGlwc19oYSAqKTsKKyAgIGludCAgICAgICAoKmVyYXNlYmlvcykoc3RydWN0IGlwc19oYSAqKTsKKyAgIGludCAgICAgICAoKnByb2dyYW1iaW9zKShzdHJ1Y3QgaXBzX2hhICosIGNoYXIgKiwgdWludDMyX3QsIHVpbnQzMl90KTsKKyAgIGludCAgICAgICAoKnZlcmlmeWJpb3MpKHN0cnVjdCBpcHNfaGEgKiwgY2hhciAqLCB1aW50MzJfdCwgdWludDMyX3QpOworICAgdm9pZCAgICAgICgqc3RhdGluaXQpKHN0cnVjdCBpcHNfaGEgKik7CisgICBpbnQgICAgICAgKCppbnRyKShzdHJ1Y3QgaXBzX2hhICopOworICAgdm9pZCAgICAgICgqZW5hYmxlaW50KShzdHJ1Y3QgaXBzX2hhICopOworICAgdWludDMyX3QgKCpzdGF0dXBkKShzdHJ1Y3QgaXBzX2hhICopOworfSBpcHNfaHdfZnVuY190OworCit0eXBlZGVmIHN0cnVjdCBpcHNfaGEgeworICAgdWludDhfdCAgICAgICAgICAgIGhhX2lkW0lQU19NQVhfQ0hBTk5FTFMrMV07CisgICB1aW50MzJfdCAgICAgICAgICAgZGNkYl9hY3RpdmVbSVBTX01BWF9DSEFOTkVMU107CisgICB1aW50MzJfdCAgICAgICAgICAgaW9fYWRkcjsgICAgICAgICAgICAvKiBCYXNlIEkvTyBhZGRyZXNzICAgICAgICAgICAqLworICAgdWludDhfdCAgICAgICAgICAgIGlycTsgICAgICAgICAgICAgICAgLyogSVJRIGZvciBhZGFwdGVyICAgICAgICAgICAgKi8KKyAgIHVpbnQ4X3QgICAgICAgICAgICBudGFyZ2V0czsgICAgICAgICAgIC8qIE51bWJlciBvZiB0YXJnZXRzICAgICAgICAgICovCisgICB1aW50OF90ICAgICAgICAgICAgbmJ1czsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYnVzZXMgICAgICAgICAgICAqLworICAgdWludDhfdCAgICAgICAgICAgIG5sdW47ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIEx1bnMgICAgICAgICAgICAgKi8KKyAgIHVpbnQxNl90ICAgICAgICAgICBhZF90eXBlOyAgICAgICAgICAgIC8qIEFkYXB0ZXIgdHlwZSAgICAgICAgICAgICAgICovCisgICB1aW50MTZfdCAgICAgICAgICAgaG9zdF9udW07ICAgICAgICAgICAvKiBBZGFwdGVyIG51bWJlciAgICAgICAgICAgICAqLworICAgdWludDMyX3QgICAgICAgICAgIG1heF94ZmVyOyAgICAgICAgICAgLyogTWF4aW11bSBYZmVyIHNpemUgICAgICAgICAgKi8KKyAgIHVpbnQzMl90ICAgICAgICAgICBtYXhfY21kczsgICAgICAgICAgIC8qIE1heCBjb25jdXJyZW50IGNvbW1hbmRzICAgICovCisgICB1aW50MzJfdCAgICAgICAgICAgbnVtX2lvY3RsOyAgICAgICAgICAvKiBOdW1iZXIgb2YgSW9jdGxzICAgICAgICAgICAqLworICAgaXBzX3N0YXRfdCAgICAgICAgIHNwOyAgICAgICAgICAgICAgICAgLyogU3RhdHVzIHBhY2tlciBwb2ludGVyICAgICAgKi8KKyAgIHN0cnVjdCBpcHNfc2NiICAgICpzY2JzOyAgICAgICAgICAgICAgIC8qIEFycmF5IG9mIGFsbCBDQ0JTICAgICAgICAgICovCisgICBzdHJ1Y3QgaXBzX3NjYiAgICAqc2NiX2ZyZWVsaXN0OyAgICAgICAvKiBTQ0IgZnJlZSBsaXN0ICAgICAgICAgICAgICAqLworICAgaXBzX3dhaXRfcXVldWVfdCAgIHNjYl93YWl0bGlzdDsgICAgICAgLyogUGVuZGluZyBTQ0IgbGlzdCAgICAgICAgICAgKi8KKyAgIGlwc19jb3BwX3F1ZXVlX3QgICBjb3BwX3dhaXRsaXN0OyAgICAgIC8qIFBlbmRpbmcgUFQgbGlzdCAgICAgICAgICAgICovCisgICBpcHNfc2NiX3F1ZXVlX3QgICAgc2NiX2FjdGl2ZWxpc3Q7ICAgICAvKiBBY3RpdmUgU0NCIGxpc3QgICAgICAgICAgICAqLworICAgSVBTX0lPX0NNRCAgICAgICAgKmR1bW15OyAgICAgICAgICAgICAgLyogZHVtbXkgY29tbWFuZCAgICAgICAgICAgICAgKi8KKyAgIElQU19BREFQVEVSICAgICAgICphZGFwdDsgICAgICAgICAgICAgIC8qIEFkYXB0ZXIgc3RhdHVzIGFyZWEgICAgICAgICovCisgICBJUFNfTERfSU5GTyAgICAgICAqbG9naWNhbF9kcml2ZV9pbmZvOyAvKiBBZGFwdGVyIExvZ2ljYWwgRHJpdmUgSW5mbyAqLworICAgZG1hX2FkZHJfdCAgICAgICAgIGxvZ2ljYWxfZHJpdmVfaW5mb19kbWFfYWRkcjsgLyogTG9naWNhbCBEcml2ZSBJbmZvIERNQSBBZGRyZXNzICovCisgICBJUFNfRU5RICAgICAgICAgICAqZW5xOyAgICAgICAgICAgICAgICAvKiBBZGFwdGVyIEVucXVpcnkgZGF0YSAgICAgICAqLworICAgSVBTX0NPTkYgICAgICAgICAgKmNvbmY7ICAgICAgICAgICAgICAgLyogQWRhcHRlciBjb25maWcgZGF0YSAgICAgICAgKi8KKyAgIElQU19OVlJBTV9QNSAgICAgICpudnJhbTsgICAgICAgICAgICAgIC8qIE5WUkFNIHBhZ2UgNSBkYXRhICAgICAgICAgICovCisgICBJUFNfU1VCU1lTICAgICAgICAqc3Vic3lzOyAgICAgICAgICAgICAvKiBTdWJzeXN0ZW0gcGFyYW1ldGVycyAgICAgICAqLworICAgY2hhciAgICAgICAgICAgICAgKmlvY3RsX2RhdGE7ICAgICAgICAgLyogSU9DVEwgZGF0YSBhcmVhICAgICAgICAgICAgKi8KKyAgIHVpbnQzMl90ICAgICAgICAgICBpb2N0bF9kYXRhc2l6ZTsgICAgIC8qIElPQ1RMIGRhdGEgc2l6ZSAgICAgICAgICAgICovCisgICB1aW50MzJfdCAgICAgICAgICAgY21kX2luX3Byb2dyZXNzOyAgICAvKiBDdXJyZW50IGNvbW1hbmQgaW4gcHJvZ3Jlc3MqLworICAgaW50ICAgICAgICAgICAgICAgIGZsYWdzOyAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgIHVpbnQ4X3QgICAgICAgICAgICB3YWl0ZmxhZzsgICAgICAgICAgIC8qIGFyZSB3ZSB3YWl0aW5nIGZvciBjbWQgICAgICovCisgICB1aW50OF90ICAgICAgICAgICAgYWN0aXZlOworICAgaW50ICAgICAgICAgICAgICAgIGlvY3RsX3Jlc2V0OyAgICAgICAgLyogSU9DVEwgUmVxdWVzdGVkIFJlc2V0IEZsYWcgKi8KKyAgIHVpbnQxNl90ICAgICAgICAgICByZXNldF9jb3VudDsgICAgICAgIC8qIG51bWJlciBvZiByZXNldHMgICAgICAgICAgICovCisgICB0aW1lX3QgICAgICAgICAgICAgbGFzdF9mZmRjOyAgICAgICAgICAvKiBsYXN0IHRpbWUgd2Ugc2VudCBmZmRjIGluZm8qLworICAgdWludDhfdCAgICAgICAgICAgIHJldmlzaW9uX2lkOyAgICAgICAgLyogUmV2aXNpb24gbGV2ZWwgICAgICAgICAgICAgKi8KKyAgIHVpbnQxNl90ICAgICAgICAgICBkZXZpY2VfaWQ7ICAgICAgICAgIC8qIFBDSSBkZXZpY2UgSUQgICAgICAgICAgICAgICovCisgICB1aW50OF90ICAgICAgICAgICAgc2xvdF9udW07ICAgICAgICAgICAvKiBQQ0kgU2xvdCBOdW1iZXIgICAgICAgICAgICAqLworICAgdWludDE2X3QgICAgICAgICAgIHN1YmRldmljZV9pZDsgICAgICAgLyogU3Vic3lzdGVtIGRldmljZSBJRCAgICAgICAgKi8KKyAgIGludCAgICAgICAgICAgICAgICBpb2N0bF9sZW47ICAgICAgICAgIC8qIHNpemUgb2YgaW9jdGwgYnVmZmVyICAgICAgICovCisgICBkbWFfYWRkcl90ICAgICAgICAgaW9jdGxfYnVzYWRkcjsgICAgICAvKiBkbWEgYWRkcmVzcyBvZiBpb2N0bCBidWZmZXIqLworICAgdWludDhfdCAgICAgICAgICAgIGJpb3NfdmVyc2lvbls4XTsgICAgLyogQklPUyBSZXZpc2lvbiAgICAgICAgICAgICAgKi8KKyAgIHVpbnQzMl90ICAgICAgICAgICBtZW1fYWRkcjsgICAgICAgICAgIC8qIE1lbW9yeSBtYXBwZWQgYWRkcmVzcyAgICAgICovCisgICB1aW50MzJfdCAgICAgICAgICAgaW9fbGVuOyAgICAgICAgICAgICAvKiBTaXplIG9mIElPIEFkZHJlc3MgICAgICAgICAqLworICAgdWludDMyX3QgICAgICAgICAgIG1lbV9sZW47ICAgICAgICAgICAgLyogU2l6ZSBvZiBtZW1vcnkgYWRkcmVzcyAgICAgKi8KKyAgIGNoYXIgICAgICAgICAgICAgIF9faW9tZW0gKm1lbV9wdHI7ICAgIC8qIE1lbW9yeSBtYXBwZWQgUHRyICAgICAgICAgICovCisgICBjaGFyICAgICAgICAgICAgICBfX2lvbWVtICppb3JlbWFwX3B0cjsvKiBpb3JlbWFwcGVkIG1lbW9yeSBwb2ludGVyICAqLworICAgaXBzX2h3X2Z1bmNfdCAgICAgIGZ1bmM7ICAgICAgICAgICAgICAgLyogaHcgZnVuY3Rpb24gcG9pbnRlcnMgICAgICAgKi8KKyAgIHN0cnVjdCBwY2lfZGV2ICAgICpwY2lkZXY7ICAgICAgICAgICAgIC8qIFBDSSBkZXZpY2UgaGFuZGxlICAgICAgICAgICovCisgICBjaGFyICAgICAgICAgICAgICAqZmxhc2hfZGF0YTsgICAgICAgICAvKiBTYXZlIEFyZWEgZm9yIGZsYXNoIGRhdGEgICAqLworICAgaW50ICAgICAgICAgICAgICAgIGZsYXNoX2xlbjsgICAgICAgICAgLyogbGVuZ3RoIG9mIGZsYXNoIGJ1ZmZlciAgICAgKi8KKyAgIHUzMiAgICAgICAgICAgICAgICBmbGFzaF9kYXRhc2l6ZTsgICAgIC8qIFNhdmUgQXJlYSBmb3IgZmxhc2ggZGF0YSBzaXplICovCisgICBkbWFfYWRkcl90ICAgICAgICAgZmxhc2hfYnVzYWRkcjsgICAgICAvKiBkbWEgYWRkcmVzcyBvZiBmbGFzaCBidWZmZXIqLworICAgZG1hX2FkZHJfdCAgICAgICAgIGVucV9idXNhZGRyOyAgICAgICAgLyogZG1hIGFkZHJlc3Mgb2YgZW5xIHN0cnVjdCAgKi8KKyAgIHVpbnQ4X3QgICAgICAgICAgICByZXF1aXJlc19lc2w7ICAgICAgIC8qIFJlcXVpcmVzIGFuIEVyYXNlU3RyaXBlTG9jayAqLworfSBpcHNfaGFfdDsKKwordHlwZWRlZiB2b2lkICgqaXBzX3NjYl9jYWxsYmFjaykgKGlwc19oYV90ICosIHN0cnVjdCBpcHNfc2NiICopOworCisvKgorICogU0NCIEZvcm1hdAorICovCit0eXBlZGVmIHN0cnVjdCBpcHNfc2NiIHsKKyAgIElQU19IT1NUX0NPTU1BTkQgIGNtZDsKKyAgIElQU19EQ0RCX1RBQkxFICAgIGRjZGI7CisgICB1aW50OF90ICAgICAgICAgICB0YXJnZXRfaWQ7CisgICB1aW50OF90ICAgICAgICAgICBidXM7CisgICB1aW50OF90ICAgICAgICAgICBsdW47CisgICB1aW50OF90ICAgICAgICAgICBjZGJbMTJdOworICAgdWludDMyX3QgICAgICAgICAgc2NiX2J1c2FkZHI7CisgICB1aW50MzJfdCAgICAgICAgICBvbGRfZGF0YV9idXNhZGRyOyAgLy8gT2Jzb2xldGUsIGJ1dCBrZXB0IGZvciBvbGQgdXRpbGl0eSBjb21wYXRpYmlsaXR5CisgICB1aW50MzJfdCAgICAgICAgICB0aW1lb3V0OworICAgdWludDhfdCAgICAgICAgICAgYmFzaWNfc3RhdHVzOworICAgdWludDhfdCAgICAgICAgICAgZXh0ZW5kZWRfc3RhdHVzOworICAgdWludDhfdCAgICAgICAgICAgYnJlYWt1cDsKKyAgIHVpbnQ4X3QgICAgICAgICAgIHNnX2JyZWFrOworICAgdWludDMyX3QgICAgICAgICAgZGF0YV9sZW47CisgICB1aW50MzJfdCAgICAgICAgICBzZ19sZW47CisgICB1aW50MzJfdCAgICAgICAgICBmbGFnczsKKyAgIHVpbnQzMl90ICAgICAgICAgIG9wX2NvZGU7CisgICBJUFNfU0dfTElTVCAgICAgICBzZ19saXN0OworICAgU2NzaV9DbW5kICAgICAgICAqc2NzaV9jbWQ7CisgICBzdHJ1Y3QgaXBzX3NjYiAgICpxX25leHQ7CisgICBpcHNfc2NiX2NhbGxiYWNrICBjYWxsYmFjazsKKyAgIHVpbnQzMl90ICAgICAgICAgIHNnX2J1c2FkZHI7CisgICBpbnQgICAgICAgICAgICAgICBzZ19jb3VudDsKKyAgIGRtYV9hZGRyX3QgICAgICAgIGRhdGFfYnVzYWRkcjsKK30gaXBzX3NjYl90OworCit0eXBlZGVmIHN0cnVjdCBpcHNfc2NiX3B0IHsKKyAgIElQU19IT1NUX0NPTU1BTkQgIGNtZDsKKyAgIElQU19EQ0RCX1RBQkxFICAgIGRjZGI7CisgICB1aW50OF90ICAgICAgICAgICB0YXJnZXRfaWQ7CisgICB1aW50OF90ICAgICAgICAgICBidXM7CisgICB1aW50OF90ICAgICAgICAgICBsdW47CisgICB1aW50OF90ICAgICAgICAgICBjZGJbMTJdOworICAgdWludDMyX3QgICAgICAgICAgc2NiX2J1c2FkZHI7CisgICB1aW50MzJfdCAgICAgICAgICBkYXRhX2J1c2FkZHI7CisgICB1aW50MzJfdCAgICAgICAgICB0aW1lb3V0OworICAgdWludDhfdCAgICAgICAgICAgYmFzaWNfc3RhdHVzOworICAgdWludDhfdCAgICAgICAgICAgZXh0ZW5kZWRfc3RhdHVzOworICAgdWludDE2X3QgICAgICAgICAgYnJlYWt1cDsKKyAgIHVpbnQzMl90ICAgICAgICAgIGRhdGFfbGVuOworICAgdWludDMyX3QgICAgICAgICAgc2dfbGVuOworICAgdWludDMyX3QgICAgICAgICAgZmxhZ3M7CisgICB1aW50MzJfdCAgICAgICAgICBvcF9jb2RlOworICAgSVBTX1NHX0xJU1QgICAgICAqc2dfbGlzdDsKKyAgIFNjc2lfQ21uZCAgICAgICAgKnNjc2lfY21kOworICAgc3RydWN0IGlwc19zY2IgICAqcV9uZXh0OworICAgaXBzX3NjYl9jYWxsYmFjayAgY2FsbGJhY2s7Cit9IGlwc19zY2JfcHRfdDsKKworLyoKKyAqIFBhc3N0aHJ1IENvbW1hbmQgRm9ybWF0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgICAgICAgQ29wcElEWzRdOworICAgdWludDMyX3QgICAgICBDb3BwQ21kOworICAgdWludDMyX3QgICAgICBQdEJ1ZmZlcjsKKyAgIHVpbnQ4X3QgICAgICAqQ21kQnVmZmVyOworICAgdWludDMyX3QgICAgICBDbWRCU2l6ZTsKKyAgIGlwc19zY2JfcHRfdCAgQ29wcENQOworICAgdWludDMyX3QgICAgICBUaW1lT3V0OworICAgdWludDhfdCAgICAgICBCYXNpY1N0YXR1czsKKyAgIHVpbnQ4X3QgICAgICAgRXh0ZW5kZWRTdGF0dXM7CisgICB1aW50OF90ICAgICAgIEFkYXB0ZXJUeXBlOworICAgdWludDhfdCAgICAgICByZXNlcnZlZDsKK30gaXBzX3Bhc3N0aHJ1X3Q7CisKKyNlbmRpZgorCisvKiBUaGUgVmVyc2lvbiBJbmZvcm1hdGlvbiBiZWxvdyBnZXRzIGNyZWF0ZWQgYnkgU0VEIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy4gKi8KKy8qIERvIG5vdCBtb2RpZnkgdGhlIG5leHQgbGluZTsgaXQncyB3aGF0IFNFRCBpcyBsb29raW5nIGZvciB0byBkbyB0aGUgaW5zZXJ0LiAqLworLyogVmVyc2lvbiBJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBWRVJTSU9OLkggLS0gdmVyc2lvbiBudW1iZXJzIGFuZCBjb3B5cmlnaHQgbm90aWNlcyBpbiB2YXJpb3VzIGZvcm1hdHMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSVBTX1ZFUl9NQUpPUiA3CisjZGVmaW5lIElQU19WRVJfTUFKT1JfU1RSSU5HICI3IgorI2RlZmluZSBJUFNfVkVSX01JTk9SIDEwCisjZGVmaW5lIElQU19WRVJfTUlOT1JfU1RSSU5HICIxMCIKKyNkZWZpbmUgSVBTX1ZFUl9CVUlMRCAxOAorI2RlZmluZSBJUFNfVkVSX0JVSUxEX1NUUklORyAiMTgiCisjZGVmaW5lIElQU19WRVJfU1RSSU5HICI3LjEwLjE4IgorI2RlZmluZSBJUFNfUkVMRUFTRV9JRCAweDAwMDIwMDAwCisjZGVmaW5lIElQU19CVUlMRF9JREVOVCA3MzEKKyNkZWZpbmUgSVBTX0xFR0FMQ09QWVJJR0hUX1NUUklORyAiKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMTk5NCwgMjAwMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iCisjZGVmaW5lIElQU19BREFQVEVDQ09QWVJJR0hUX1NUUklORyAiKGMpIENvcHlyaWdodCBBZGFwdGVjLCBJbmMuIDIwMDIgdG8gMjAwNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iCisjZGVmaW5lIElQU19ERUxMQ09QWVJJR0hUX1NUUklORyAiKGMpIENvcHlyaWdodCBEZWxsIDIwMDQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIgorI2RlZmluZSBJUFNfTlRfTEVHQUxDT1BZUklHSFRfU1RSSU5HICIoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAxOTk0LCAyMDAyLiIKKworLyogVmVyc2lvbiBudW1iZXJzIGZvciB2YXJpb3VzIGFkYXB0ZXJzICovCisjZGVmaW5lIElQU19WRVJfU0VSVkVSQUlEMSAiMi4yNS4wMSIKKyNkZWZpbmUgSVBTX1ZFUl9TRVJWRVJBSUQyICIyLjg4LjEzIgorI2RlZmluZSBJUFNfVkVSX05BVkFKTyAiMi44OC4xMyIKKyNkZWZpbmUgSVBTX1ZFUl9TRVJWRVJBSUQzICI2LjEwLjI0IgorI2RlZmluZSBJUFNfVkVSX1NFUlZFUkFJRDRIICI3LjEwLjExIgorI2RlZmluZSBJUFNfVkVSX1NFUlZFUkFJRDRNTHggIjcuMTAuMTgiCisjZGVmaW5lIElQU19WRVJfU0FSQVNPVEEgIjcuMTAuMTgiCisjZGVmaW5lIElQU19WRVJfTUFSQ08gIjcuMTAuMTgiCisjZGVmaW5lIElQU19WRVJfU0VCUklORyAiNy4xMC4xOCIKKyNkZWZpbmUgSVBTX1ZFUl9LRVlXRVNUICI3LjEwLjE4IgorCisvKiBDb21wYXRhYmlsaXR5IElEcyBmb3IgdmFyaW91cyBhZGFwdGVycyAqLworI2RlZmluZSBJUFNfQ09NUEFUX1VOS05PV04gIiIKKyNkZWZpbmUgSVBTX0NPTVBBVF9DVVJSRU5UICJLVzcxMCIKKyNkZWZpbmUgSVBTX0NPTVBBVF9TRVJWRVJBSUQxICIyLjI1LjAxIgorI2RlZmluZSBJUFNfQ09NUEFUX1NFUlZFUkFJRDIgIjIuODguMTMiCisjZGVmaW5lIElQU19DT01QQVRfTkFWQUpPICAiMi44OC4xMyIKKyNkZWZpbmUgSVBTX0NPTVBBVF9LSU9XQSAiMi44OC4xMyIKKyNkZWZpbmUgSVBTX0NPTVBBVF9TRVJWRVJBSUQzSCAgIlNCNjEwIgorI2RlZmluZSBJUFNfQ09NUEFUX1NFUlZFUkFJRDNMICAiU0I2MTAiCisjZGVmaW5lIElQU19DT01QQVRfU0VSVkVSQUlENEggICJLVzcxMCIKKyNkZWZpbmUgSVBTX0NPTVBBVF9TRVJWRVJBSUQ0TSAgIktXNzEwIgorI2RlZmluZSBJUFNfQ09NUEFUX1NFUlZFUkFJRDRMICAiS1c3MTAiCisjZGVmaW5lIElQU19DT01QQVRfU0VSVkVSQUlENE14ICJLVzcxMCIKKyNkZWZpbmUgSVBTX0NPTVBBVF9TRVJWRVJBSUQ0THggIktXNzEwIgorI2RlZmluZSBJUFNfQ09NUEFUX1NBUkFTT1RBICAgICAiS1c3MTAiCisjZGVmaW5lIElQU19DT01QQVRfTUFSQ08gICAgICAgICJLVzcxMCIKKyNkZWZpbmUgSVBTX0NPTVBBVF9TRUJSSU5HICAgICAgIktXNzEwIgorI2RlZmluZSBJUFNfQ09NUEFUX1RBTVBBICAgICAgICAiS1c3MTAiCisjZGVmaW5lIElQU19DT01QQVRfS0VZV0VTVCAgICAgICJLVzcxMCIKKyNkZWZpbmUgSVBTX0NPTVBBVF9CSU9TICJLVzcxMCIKKworI2RlZmluZSBJUFNfQ09NUEFUX01BWF9BREFQVEVSX1RZUEUgMTgKKyNkZWZpbmUgSVBTX0NPTVBBVF9JRF9MRU5HVEggOAorCisjZGVmaW5lIElQU19ERUZJTkVfQ09NUEFUX1RBQkxFKHRhYmxlbmFtZSkgXAorICAgY2hhciB0YWJsZW5hbWVbSVBTX0NPTVBBVF9NQVhfQURBUFRFUl9UWVBFXSBbSVBTX0NPTVBBVF9JRF9MRU5HVEhdID0geyBcCisgICAgICBJUFNfQ09NUEFUX1VOS05PV04sIFwKKyAgICAgIElQU19DT01QQVRfU0VSVkVSQUlEMSwgXAorICAgICAgSVBTX0NPTVBBVF9TRVJWRVJBSUQyLCBcCisgICAgICBJUFNfQ09NUEFUX05BVkFKTywgXAorICAgICAgSVBTX0NPTVBBVF9LSU9XQSwgXAorICAgICAgSVBTX0NPTVBBVF9TRVJWRVJBSUQzSCwgXAorICAgICAgSVBTX0NPTVBBVF9TRVJWRVJBSUQzTCwgXAorICAgICAgSVBTX0NPTVBBVF9TRVJWRVJBSUQ0SCwgXAorICAgICAgSVBTX0NPTVBBVF9TRVJWRVJBSUQ0TSwgXAorICAgICAgSVBTX0NPTVBBVF9TRVJWRVJBSUQ0TCwgXAorICAgICAgSVBTX0NPTVBBVF9TRVJWRVJBSUQ0TXgsIFwKKyAgICAgIElQU19DT01QQVRfU0VSVkVSQUlENEx4LCBcCisgICAgICBJUFNfQ09NUEFUX1NBUkFTT1RBLCAgICAgICAgIC8qIG9uZS1jaGFubmVsIHZhcmlldHkgb2YgU0FSQVNPVEEgKi8gIFwKKyAgICAgIElQU19DT01QQVRfU0FSQVNPVEEsICAgICAgICAgLyogdHdvLWNoYW5uZWwgdmFyaWV0eSBvZiBTQVJBU09UQSAqLyAgXAorICAgICAgSVBTX0NPTVBBVF9NQVJDTywgXAorICAgICAgSVBTX0NPTVBBVF9TRUJSSU5HLCBcCisgICAgICBJUFNfQ09NUEFUX1RBTVBBLCBcCisgICAgICBJUFNfQ09NUEFUX0tFWVdFU1QgXAorICAgfQorCisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgYWxtb3N0IGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCisgKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKKyAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBmaWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWluZGVudC1sZXZlbDogMgorICogYy1icmFjZS1pbWFnaW5hcnktb2Zmc2V0OiAwCisgKiBjLWJyYWNlLW9mZnNldDogLTIKKyAqIGMtYXJnZGVjbC1pbmRlbnQ6IDIKKyAqIGMtbGFiZWwtb2Zmc2V0OiAtMgorICogYy1jb250aW51ZWQtc3RhdGVtZW50LW9mZnNldDogMgorICogYy1jb250aW51ZWQtYnJhY2Utb2Zmc2V0OiAwCisgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKyAqIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvamF6el9lc3AuYyBiL2RyaXZlcnMvc2NzaS9qYXp6X2VzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NDJmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvamF6el9lc3AuYwpAQCAtMCwwICsxLDMyOSBAQAorLyoKKyAqIGphenpfZXNwLmM6IERyaXZlciBmb3IgU0NTSSBjaGlwIG9uIE1pcHMgTWFnbnVtIEJvYXJkcyAoSkFaWiBhcmNoaXRlY3R1cmUpCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk3IFRob21hcyBCb2dlbmRvZXJmZXIgKHRzYm9nZW5kQGFscGhhLmZyYW5rZW4uZGUpCisgKgorICogamF6el9lc3AgaXMgYmFzZWQgb24gRGF2aWQgUy4gTWlsbGVyJ3MgRVNQIGRyaXZlciBhbmQgY3liZXJfZXNwCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJOQ1I1M0M5eC5oIgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9qYXp6Lmg+CisjaW5jbHVkZSA8YXNtL2phenpkbWEuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCitzdGF0aWMgaW50ICBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCk7CitzdGF0aWMgaW50ICBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKnNwKTsKK3N0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiB2YWRkcmVzcywgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiB2YWRkcmVzcywgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKTsKK3N0YXRpYyB2b2lkIGRtYV9tbXVfZ2V0X3Njc2lfb25lIChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCk7CitzdGF0aWMgdm9pZCBkbWFfbW11X2dldF9zY3NpX3NnbCAoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc3ApOworc3RhdGljIHZvaWQgZG1hX21tdV9yZWxlYXNlX3Njc2lfb25lIChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCk7CitzdGF0aWMgdm9pZCBkbWFfbW11X3JlbGVhc2Vfc2NzaV9zZ2wgKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKnNwKTsKK3N0YXRpYyB2b2lkIGRtYV9hZHZhbmNlX3NnIChzdHJ1Y3Qgc2NzaV9jbW5kICpzcCk7CitzdGF0aWMgdm9pZCBkbWFfbGVkX29mZihzdHJ1Y3QgTkNSX0VTUCAqKTsKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb24oc3RydWN0IE5DUl9FU1AgKik7CisKKworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlclsxNl07CisJCQkJLyogVGhpcyBpcyB3aGVyZSBhbGwgY29tbWFuZHMgYXJlIHB1dAorCQkJCSAqIGJlZm9yZSB0aGV5IGFyZSB0cmFzZmVyZWQgdG8gdGhlIEVTUCBjaGlwCisJCQkJICogdmlhIFBJTy4KKwkJCQkgKi8KKworaW50IGphenpfZXNwX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQpOworc3RhdGljIGludCBqYXp6X2VzcF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCWlmIChzaG9zdC0+aXJxKQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBOVUxMKTsKKwlpZiAoc2hvc3QtPmRtYV9jaGFubmVsICE9IDB4ZmYpCisJCWZyZWVfZG1hKHNob3N0LT5kbWFfY2hhbm5lbCk7CisJaWYgKHNob3N0LT5pb19wb3J0ICYmIHNob3N0LT5uX2lvX3BvcnQpCisJCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKKwlzY3NpX3VucmVnaXN0ZXIoc2hvc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJqYXp6X2VzcCIsCisJLnByb2NfaW5mbwkJPSAmZXNwX3Byb2NfaW5mbywKKwkubmFtZQkJCT0gIkVTUCAxMDAvMTAwYS8yMDAiLAorCS5kZXRlY3QJCQk9IGphenpfZXNwX2RldGVjdCwKKwkuc2xhdmVfYWxsb2MJCT0gZXNwX3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9kZXN0cm95CQk9IGVzcF9zbGF2ZV9kZXN0cm95LAorCS5yZWxlYXNlCQk9IGphenpfZXNwX3JlbGVhc2UsCisJLmluZm8JCQk9IGVzcF9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gZXNwX3F1ZXVlLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gZXNwX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGVzcF9yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IDcsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorfTsKKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZXRlY3Rpb24gKi8KK3N0YXRpYyBpbnQgamF6el9lc3BfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCit7CisgICAgc3RydWN0IE5DUl9FU1AgKmVzcDsKKyAgICBzdHJ1Y3QgQ29uZmlnRGV2ICplc3BfZGV2OworCisgICAgLyoKKyAgICAgKiBmaXJzdCBhc3N1bXB0aW9uIGl0IGlzIHRoZXJlOi0pCisgICAgICovCisgICAgaWYgKDEpIHsKKwllc3BfZGV2ID0gMDsKKwllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgKHZvaWQgKikgZXNwX2Rldik7CisJCisJLyogRG8gY29tbWFuZCB0cmFuc2ZlciB3aXRoIHByb2dyYW1tZWQgSS9PICovCisJZXNwLT5kb19waW9fY21kcyA9IDE7CisJCisJLyogUmVxdWlyZWQgZnVuY3Rpb25zICovCisJZXNwLT5kbWFfYnl0ZXNfc2VudCA9ICZkbWFfYnl0ZXNfc2VudDsKKwllc3AtPmRtYV9jYW5fdHJhbnNmZXIgPSAmZG1hX2Nhbl90cmFuc2ZlcjsKKwllc3AtPmRtYV9kdW1wX3N0YXRlID0gJmRtYV9kdW1wX3N0YXRlOworCWVzcC0+ZG1hX2luaXRfcmVhZCA9ICZkbWFfaW5pdF9yZWFkOworCWVzcC0+ZG1hX2luaXRfd3JpdGUgPSAmZG1hX2luaXRfd3JpdGU7CisJZXNwLT5kbWFfaW50c19vZmYgPSAmZG1hX2ludHNfb2ZmOworCWVzcC0+ZG1hX2ludHNfb24gPSAmZG1hX2ludHNfb247CisJZXNwLT5kbWFfaXJxX3AgPSAmZG1hX2lycV9wOworCWVzcC0+ZG1hX3BvcnRzX3AgPSAmZG1hX3BvcnRzX3A7CisJZXNwLT5kbWFfc2V0dXAgPSAmZG1hX3NldHVwOworCisJLyogT3B0aW9uYWwgZnVuY3Rpb25zICovCisJZXNwLT5kbWFfYmFycmllciA9IDA7CisJZXNwLT5kbWFfZHJhaW4gPSAwOworCWVzcC0+ZG1hX2ludmFsaWRhdGUgPSAwOworCWVzcC0+ZG1hX2lycV9lbnRyeSA9IDA7CisJZXNwLT5kbWFfaXJxX2V4aXQgPSAwOworCWVzcC0+ZG1hX3BvbGwgPSAwOworCWVzcC0+ZG1hX3Jlc2V0ID0gMDsKKwllc3AtPmRtYV9sZWRfb2ZmID0gJmRtYV9sZWRfb2ZmOworCWVzcC0+ZG1hX2xlZF9vbiA9ICZkbWFfbGVkX29uOworCQorCS8qIHZpcnR1YWwgRE1BIGZ1bmN0aW9ucyAqLworCWVzcC0+ZG1hX21tdV9nZXRfc2NzaV9vbmUgPSAmZG1hX21tdV9nZXRfc2NzaV9vbmU7CisJZXNwLT5kbWFfbW11X2dldF9zY3NpX3NnbCA9ICZkbWFfbW11X2dldF9zY3NpX3NnbDsKKwllc3AtPmRtYV9tbXVfcmVsZWFzZV9zY3NpX29uZSA9ICZkbWFfbW11X3JlbGVhc2Vfc2NzaV9vbmU7CisJZXNwLT5kbWFfbW11X3JlbGVhc2Vfc2NzaV9zZ2wgPSAmZG1hX21tdV9yZWxlYXNlX3Njc2lfc2dsOworCWVzcC0+ZG1hX2FkdmFuY2Vfc2cgPSAmZG1hX2FkdmFuY2Vfc2c7CisKKworCS8qIFNDU0kgY2hpcCBzcGVlZCAqLworCWVzcC0+Y2ZyZXEgPSA0MDAwMDAwMDsKKworCS8qIAorCSAqIHdlIGRvbid0IGdpdmUgdGhlIGFkZHJlc3Mgb2YgRE1BIGNoYW5uZWwsIGJ1dCB0aGUgbnVtYmVyCisJICogb2YgRE1BIGNoYW5uZWwsIHNvIHdlIGNhbiB1c2UgdGhlIGphenogRE1BIGZ1bmN0aW9ucworCSAqIAorCSAqLworCWVzcC0+ZHJlZ3MgPSBKQVpaX1NDU0lfRE1BOworCQorCS8qIEVTUCByZWdpc3RlciBiYXNlICovCisJZXNwLT5lcmVncyA9IChzdHJ1Y3QgRVNQX3JlZ3MgKikoSkFaWl9TQ1NJX0JBU0UpOworCQorCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIgKi8KKwllc3AtPmVzcF9jb21tYW5kID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKiljbWRfYnVmZmVyOworCQorCS8qIGdldCB2aXJ0dWFsIGRtYSBhZGRyZXNzIGZvciBjb21tYW5kIGJ1ZmZlciAqLworCWVzcC0+ZXNwX2NvbW1hbmRfZHZtYSA9IHZkbWFfYWxsb2MoQ1BIWVNBRERSKGNtZF9idWZmZXIpLCBzaXplb2YgKGNtZF9idWZmZXIpKTsKKwkKKwllc3AtPmlycSA9IEpBWlpfU0NTSV9JUlE7CisJcmVxdWVzdF9pcnEoSkFaWl9TQ1NJX0lSUSwgZXNwX2ludHIsIFNBX0lOVEVSUlVQVCwgIkpBWlogU0NTSSIsCisJICAgICAgICAgICAgZXNwLT5laG9zdCk7CisKKwkvKgorCSAqIEZJWE1FLCBsb29rIGlmIHRoZSBzY3NpIGlkIGlzIGF2YWlsYWJsZSBmcm9tIE5WUkFNCisJICovCisJZXNwLT5zY3NpX2lkID0gNzsKKwkJCisJLyogQ2hlY2sgZm9yIGRpZmZlcmVudGlhbCBTQ1NJLWJ1cyAqLworCS8qIFdoYXQgaXMgdGhpcyBzdHVmZj8gKi8KKwllc3AtPmRpZmYgPSAwOworCisJZXNwX2luaXRpYWxpemUoZXNwKTsKKwkKKwlwcmludGsoIkVTUDogVG90YWwgb2YgJWQgRVNQIGhvc3RzIGZvdW5kLCAlZCBhY3R1YWxseSBpbiB1c2UuXG4iLCBuZXNwcyxlc3BzX2luX3VzZSk7CisJZXNwc19ydW5uaW5nID0gZXNwc19pbl91c2U7CisJcmV0dXJuIGVzcHNfaW5fdXNlOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRE1BIEZ1bmN0aW9ucyAqLworc3RhdGljIGludCBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCkKK3sKKyAgICByZXR1cm4gZmlmb19jb3VudDsKK30KKworc3RhdGljIGludCBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKnNwKQoreworICAgIC8qCisgICAgICogbWF4aW11bSBETUEgc2l6ZSBpcyAxTUIKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBsb25nIHN6ID0gc3AtPlNDcC50aGlzX3Jlc2lkdWFsOworICAgIGlmKHN6ID4gMHgxMDAwMDApCisJc3ogPSAweDEwMDAwMDsKKyAgICByZXR1cm4gc3o7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisgICAgCisgICAgRVNQTE9HKCgiZXNwJWQ6IGRtYSAtLSBlbmFibGUgPCUwOHg+IHJlc2lkdWUgPCUwOHhcbiIsCisJICAgIGVzcC0+ZXNwX2lkLCB2ZG1hX2dldF9lbmFibGUoKGludCllc3AtPmRyZWdzKSwgdmRtYV9nZXRfcmVzaWR1ZSgoaW50KWVzcC0+ZHJlZ3MpKSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgdmFkZHJlc3MsIGludCBsZW5ndGgpCit7CisgICAgZG1hX2NhY2hlX3diYWNrX2ludiAoKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHZkbWFfbG9nMnBoeXModmFkZHJlc3MpKSwgbGVuZ3RoKTsKKyAgICB2ZG1hX2Rpc2FibGUgKChpbnQpZXNwLT5kcmVncyk7CisgICAgdmRtYV9zZXRfbW9kZSAoKGludCllc3AtPmRyZWdzLCBETUFfTU9ERV9SRUFEKTsKKyAgICB2ZG1hX3NldF9hZGRyICgoaW50KWVzcC0+ZHJlZ3MsIHZhZGRyZXNzKTsKKyAgICB2ZG1hX3NldF9jb3VudCAoKGludCllc3AtPmRyZWdzLCBsZW5ndGgpOworICAgIHZkbWFfZW5hYmxlICgoaW50KWVzcC0+ZHJlZ3MpOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiB2YWRkcmVzcywgaW50IGxlbmd0aCkKK3sKKyAgICBkbWFfY2FjaGVfd2JhY2tfaW52ICgodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQodmRtYV9sb2cycGh5cyh2YWRkcmVzcykpLCBsZW5ndGgpOyAgICAKKyAgICB2ZG1hX2Rpc2FibGUgKChpbnQpZXNwLT5kcmVncyk7ICAgIAorICAgIHZkbWFfc2V0X21vZGUgKChpbnQpZXNwLT5kcmVncywgRE1BX01PREVfV1JJVEUpOworICAgIHZkbWFfc2V0X2FkZHIgKChpbnQpZXNwLT5kcmVncywgdmFkZHJlc3MpOworICAgIHZkbWFfc2V0X2NvdW50ICgoaW50KWVzcC0+ZHJlZ3MsIGxlbmd0aCk7CisgICAgdmRtYV9lbmFibGUgKChpbnQpZXNwLT5kcmVncyk7ICAgIAorfQorCitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKyAgICBkaXNhYmxlX2lycShlc3AtPmlycSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisgICAgZW5hYmxlX2lycShlc3AtPmlycSk7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisgICAgcmV0dXJuIChlc3BfcmVhZChlc3AtPmVyZWdzLT5lc3Bfc3RhdHVzKSAmIEVTUF9TVEFUX0lOVFIpOworfQorCitzdGF0aWMgaW50IGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisgICAgaW50IGVuYWJsZSA9IHZkbWFfZ2V0X2VuYWJsZSgoaW50KWVzcC0+ZHJlZ3MpOworICAgIAorICAgIHJldHVybiAoZW5hYmxlICYgUjQwMzBfQ0hOTF9FTkFCTEUpOworfQorCitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpCit7CisgICAgLyogCisgICAgICogT24gdGhlIFNwYXJjLCBETUFfU1RfV1JJVEUgbWVhbnMgIm1vdmUgZGF0YSBmcm9tIGRldmljZSB0byBtZW1vcnkiCisgICAgICogc28gd2hlbiAod3JpdGUpIGlzIHRydWUsIGl0IGFjdHVhbGx5IG1lYW5zIFJFQUQhCisgICAgICovCisgICAgaWYod3JpdGUpeworCWRtYV9pbml0X3JlYWQoZXNwLCBhZGRyLCBjb3VudCk7CisgICAgfSBlbHNlIHsKKwlkbWFfaW5pdF93cml0ZShlc3AsIGFkZHIsIGNvdW50KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9tbXVfZ2V0X3Njc2lfb25lIChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCkKK3sKKyAgICBzcC0+U0NwLmhhdmVfZGF0YV9pbiA9IHZkbWFfYWxsb2MoQ1BIWVNBRERSKHNwLT5TQ3AuYnVmZmVyKSwgc3AtPlNDcC50aGlzX3Jlc2lkdWFsKTsKKyAgICBzcC0+U0NwLnB0ciA9IChjaGFyICopKCh1bnNpZ25lZCBsb25nKXNwLT5TQ3AuaGF2ZV9kYXRhX2luKTsKK30KKworc3RhdGljIHZvaWQgZG1hX21tdV9nZXRfc2NzaV9zZ2wgKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKnNwKQoreworICAgIGludCBzeiA9IHNwLT5TQ3AuYnVmZmVyc19yZXNpZHVhbDsKKyAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBzcC0+U0NwLmJ1ZmZlcjsKKyAgICAKKyAgICB3aGlsZSAoc3ogPj0gMCkgeworCXNnW3N6XS5kbWFfYWRkcmVzcyA9IHZkbWFfYWxsb2MoQ1BIWVNBRERSKHBhZ2VfYWRkcmVzcyhzZ1tzel0ucGFnZSkgKyBzZ1tzel0ub2Zmc2V0KSwgc2dbc3pdLmxlbmd0aCk7CisJc3otLTsKKyAgICB9CisgICAgc3AtPlNDcC5wdHI9KGNoYXIgKikoc3AtPlNDcC5idWZmZXItPmRtYV9hZGRyZXNzKTsKK30gICAgCisKK3N0YXRpYyB2b2lkIGRtYV9tbXVfcmVsZWFzZV9zY3NpX29uZSAoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc3ApCit7CisgICAgdmRtYV9mcmVlKHNwLT5TQ3AuaGF2ZV9kYXRhX2luKTsKK30KKworc3RhdGljIHZvaWQgZG1hX21tdV9yZWxlYXNlX3Njc2lfc2dsIChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCkKK3sKKyAgICBpbnQgc3ogPSBzcC0+dXNlX3NnIC0gMTsKKyAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNwLT5idWZmZXI7CisJCQkKKyAgICB3aGlsZShzeiA+PSAwKSB7CisJdmRtYV9mcmVlKHNnW3N6XS5kbWFfYWRkcmVzcyk7CisJc3otLTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9hZHZhbmNlX3NnIChzdHJ1Y3Qgc2NzaV9jbW5kICpzcCkKK3sKKyAgICBzcC0+U0NwLnB0ciA9IChjaGFyICopKHNwLT5TQ3AuYnVmZmVyLT5kbWFfYWRkcmVzcyk7Cit9CisKKyNkZWZpbmUgSkFaWl9IRENfTEVEICAgMHhlMDAwZDEwMCAvKiBGSVhNRSwgZmluZCBjb3JyZWN0IGFkZHJlc3MgKi8KKworc3RhdGljIHZvaWQgZG1hX2xlZF9vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKyNpZiAwICAgIAorICAgICoodW5zaWduZWQgY2hhciAqKUpBWlpfSERDX0xFRCA9IDA7CisjZW5kaWYgICAgCit9CisKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb24oc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sgICAgCisjaWYgMCAgICAKKyAgICAqKHVuc2lnbmVkIGNoYXIgKilKQVpaX0hEQ19MRUQgPSAxOworI2VuZGlmICAgIAorfQorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQkJPSAiamF6el9lc3AiLAorCS5wcm9jX2luZm8JCT0gZXNwX3Byb2NfaW5mbywKKwkubmFtZQkJCT0gIkVTUCAxMDAvMTAwYS8yMDAiLAorCS5kZXRlY3QJCQk9IGphenpfZXNwX2RldGVjdCwKKwkuc2xhdmVfYWxsb2MJCT0gZXNwX3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9kZXN0cm95CQk9IGVzcF9zbGF2ZV9kZXN0cm95LAorCS5yZWxlYXNlCQk9IGphenpfZXNwX3JlbGVhc2UsCisJLmluZm8JCQk9IGVzcF9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gZXNwX3F1ZXVlLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gZXNwX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGVzcF9yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IDcsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorfTsKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xhc2k3MDAuYyBiL2RyaXZlcnMvc2NzaS9sYXNpNzAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmMjUwYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9sYXNpNzAwLmMKQEAgLTAsMCArMSwxODkgQEAKKy8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogOCAtKi0gKi8KKworLyogUEFSSVNDIExBU0kgZHJpdmVyIGZvciB0aGUgNTNjNzAwIGNoaXAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgSmFtZXMuQm90dG9tbGV5QEhhbnNlblBhcnRuZXJzaGlwLmNvbQorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiogIAorKiogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyoqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqKgorKiogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqKgorKiogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyoqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoKKyAqIE1hbnkgdGhhbmtzIHRvIFJpY2hhcmQgSGlyc3QgPHJoaXJzdEBsaW51eGNhcmUuY29tPiBmb3IgcGF0aWVudGx5CisgKiBkZWJ1Z2dpbmcgdGhpcyBkcml2ZXIgb24gdGhlIHBhcmlzYyBhcmNoaXRlY3R1cmUgYW5kIHN1Z2dlc3RpbmcKKyAqIG1hbnkgaW1wcm92ZW1lbnRzIGFuZCBidWcgZml4ZXMuCisgKgorICogVGhhbmtzIGFsc28gZ28gdG8gTGludXhjYXJlIEluYy4gZm9yIHByb3ZpZGluZyBzZXZlcmFsIFBBUklTQworICogbWFjaGluZXMgZm9yIG1lIHRvIGRlYnVnIHRoZSBkcml2ZXIgb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3BhcmlzYy1kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vZGVsYXkuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5oPgorCisjaW5jbHVkZSAiNTNjNzAwLmgiCisKK01PRFVMRV9BVVRIT1IoIkphbWVzIEJvdHRvbWxleSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJsYXNpNzAwIFNDU0kgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgTEFTSV83MDBfU1ZFUlNJT04gMHgwMDA3MQorI2RlZmluZSBMQVNJXzcxMF9TVkVSU0lPTiAweDAwMDgyCisKKyNkZWZpbmUgTEFTSTcwMF9JRF9UQUJMRSB7CQkJXAorCS5od190eXBlCT0gSFBIV19GSU8sCQlcCisJLnN2ZXJzaW9uCT0gTEFTSV83MDBfU1ZFUlNJT04sCVwKKwkuaHZlcnNpb24JPSBIVkVSU0lPTl9BTllfSUQsCVwKKwkuaHZlcnNpb25fcmV2CT0gSFZFUlNJT05fUkVWX0FOWV9JRCwJXAorfQorCisjZGVmaW5lIExBU0k3MTBfSURfVEFCTEUgewkJCVwKKwkuaHdfdHlwZQk9IEhQSFdfRklPLAkJXAorCS5zdmVyc2lvbgk9IExBU0lfNzEwX1NWRVJTSU9OLAlcCisJLmh2ZXJzaW9uCT0gSFZFUlNJT05fQU5ZX0lELAlcCisJLmh2ZXJzaW9uX3Jldgk9IEhWRVJTSU9OX1JFVl9BTllfSUQsCVwKK30KKworI2RlZmluZSBMQVNJNzAwX0NMT0NLCTI1CisjZGVmaW5lIExBU0k3MTBfQ0xPQ0sJNDAKKyNkZWZpbmUgTEFTSV9TQ1NJX0NPUkVfT0ZGU0VUIDB4MTAwCisKK3N0YXRpYyBzdHJ1Y3QgcGFyaXNjX2RldmljZV9pZCBsYXNpNzAwX2lkc1tdID0geworCUxBU0k3MDBfSURfVEFCTEUsCisJTEFTSTcxMF9JRF9UQUJMRSwKKwl7IDAgfQorfTsKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgbGFzaTcwMF90ZW1wbGF0ZSA9IHsKKwkubmFtZQkJPSAiTEFTSSBTQ1NJIDUzYzcwMCIsCisJLnByb2NfbmFtZQk9ICJsYXNpNzAwIiwKKwkudGhpc19pZAk9IDcsCisJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBhcmlzYywgbGFzaTcwMF9pZHMpOworCitzdGF0aWMgaW50IF9faW5pdAorbGFzaTcwMF9wcm9iZShzdHJ1Y3QgcGFyaXNjX2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGRldi0+aHBhICsgTEFTSV9TQ1NJX0NPUkVfT0ZGU0VUOworCXN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGE7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKworCWhvc3RkYXRhID0ga21hbGxvYyhzaXplb2YoKmhvc3RkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFob3N0ZGF0YSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgaG9zdCBkYXRhXG4iLAorCQkgICAgICAgZGV2LT5kZXYuYnVzX2lkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChob3N0ZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycykpOworCisJaG9zdGRhdGEtPmRldiA9ICZkZXYtPmRldjsKKwlkbWFfc2V0X21hc2soJmRldi0+ZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJaG9zdGRhdGEtPmJhc2UgPSBpb3JlbWFwKGJhc2UsIDB4MTAwKTsKKwlob3N0ZGF0YS0+ZGlmZmVyZW50aWFsID0gMDsKKworCWlmIChkZXYtPmlkLnN2ZXJzaW9uID09IExBU0lfNzAwX1NWRVJTSU9OKSB7CisJCWhvc3RkYXRhLT5jbG9jayA9IExBU0k3MDBfQ0xPQ0s7CisJCWhvc3RkYXRhLT5mb3JjZV9sZV9vbl9iZSA9IDE7CisJfSBlbHNlIHsKKwkJaG9zdGRhdGEtPmNsb2NrID0gTEFTSTcxMF9DTE9DSzsKKwkJaG9zdGRhdGEtPmZvcmNlX2xlX29uX2JlID0gMDsKKwkJaG9zdGRhdGEtPmNoaXA3MTAgPSAxOworCQlob3N0ZGF0YS0+ZG1vZGVfZXh0cmEgPSBETU9ERV9GQzI7CisJfQorCisJTkNSXzcwMF9zZXRfbWVtX21hcHBlZChob3N0ZGF0YSk7CisKKwlob3N0ID0gTkNSXzcwMF9kZXRlY3QoJmxhc2k3MDBfdGVtcGxhdGUsIGhvc3RkYXRhLCAmZGV2LT5kZXYpOworCWlmICghaG9zdCkKKwkJZ290byBvdXRfa2ZyZWU7CisJaG9zdC0+dGhpc19pZCA9IDc7CisJaG9zdC0+aXJxID0gZGV2LT5pcnE7CisJaWYocmVxdWVzdF9pcnEoZGV2LT5pcnEsIE5DUl83MDBfaW50ciwgU0FfU0hJUlEsICJsYXNpNzAwIiwgaG9zdCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsYXNpNzAwOiByZXF1ZXN0X2lycSBmYWlsZWQhXG4iKTsKKwkJZ290byBvdXRfcHV0X2hvc3Q7CisJfQorCisJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgaG9zdCk7CisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisKKwlyZXR1cm4gMDsKKworIG91dF9wdXRfaG9zdDoKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworIG91dF9rZnJlZToKKwlpb3VubWFwKGhvc3RkYXRhLT5iYXNlKTsKKwlrZnJlZShob3N0ZGF0YSk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0CitsYXNpNzAwX2RyaXZlcl9yZW1vdmUoc3RydWN0IHBhcmlzY19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7CisJc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSA9IAorCQkoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICopaG9zdC0+aG9zdGRhdGFbMF07CisKKwlzY3NpX3JlbW92ZV9ob3N0KGhvc3QpOworCU5DUl83MDBfcmVsZWFzZShob3N0KTsKKwlmcmVlX2lycShob3N0LT5pcnEsIGhvc3QpOworCWlvdW5tYXAoaG9zdGRhdGEtPmJhc2UpOworCWtmcmVlKGhvc3RkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBhcmlzY19kcml2ZXIgbGFzaTcwMF9kcml2ZXIgPSB7CisJLm5hbWUgPQkJIkxhc2kgU0NTSSIsCisJLmlkX3RhYmxlID0JbGFzaTcwMF9pZHMsCisJLnByb2JlID0JbGFzaTcwMF9wcm9iZSwKKwkucmVtb3ZlID0JX19kZXZleGl0X3AobGFzaTcwMF9kcml2ZXJfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitsYXNpNzAwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfcGFyaXNjX2RyaXZlcigmbGFzaTcwMF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2xhc2k3MDBfZXhpdCh2b2lkKQoreworCXVucmVnaXN0ZXJfcGFyaXNjX2RyaXZlcigmbGFzaTcwMF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChsYXNpNzAwX2luaXQpOworbW9kdWxlX2V4aXQobGFzaTcwMF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJhdGEtY29yZS5jIGIvZHJpdmVycy9zY3NpL2xpYmF0YS1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1ZDNhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9saWJhdGEtY29yZS5jCkBAIC0wLDAgKzEsNDAyNCBAQAorLyoKKyAgIGxpYmF0YS1jb3JlLmMgLSBoZWxwZXIgbGlicmFyeSBmb3IgQVRBCisKKyAgIENvcHlyaWdodCAyMDAzLTIwMDQgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgIENvcHlyaWdodCAyMDAzLTIwMDQgSmVmZiBHYXJ6aWsKKworICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgT3BlbgorICAgU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMSB0aGF0IGNhbiBiZSBmb3VuZCBhdAorICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMS4xLnR4dCBhbmQgaXMgaW5jbHVkZWQgaGVyZWluCisgICBieSByZWZlcmVuY2UuCisKKyAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCisgICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpIGFzIGRpc3RyaWJ1dGVkCisgICBpbiB0aGUga2VybmVsIHNvdXJjZSBDT1BZSU5HIGZpbGUsIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YKKyAgIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdworICAgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICAgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCisgICB0aGUgT1NMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZAorICAgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLgorICAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91cgorICAgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBPU0wgb3IgdGhlIEdQTC4KKworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgInNjc2lfcHJpdi5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgImxpYmF0YS5oIgorCitzdGF0aWMgdW5zaWduZWQgaW50IGF0YV9idXN5X3NsZWVwIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIHRtb3V0X3BhdCwKKwkJCSAgICAJICAgIHVuc2lnbmVkIGxvbmcgdG1vdXQpOworc3RhdGljIHZvaWQgYXRhX3NldF9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgYXRhX2Rldl9zZXRfeGZlcm1vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmRldik7CitzdGF0aWMgdW5zaWduZWQgaW50IGF0YV9nZXRfbW9kZV9tYXNrKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGludCBzaGlmdCk7CitzdGF0aWMgaW50IGZnYih1MzIgYml0bWFwKTsKK3N0YXRpYyBpbnQgYXRhX2Nob29zZV94ZmVyX21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQl1OCAqeGZlcl9tb2RlX291dCwKKwkJCQl1bnNpZ25lZCBpbnQgKnhmZXJfc2hpZnRfb3V0KTsKK3N0YXRpYyBpbnQgYXRhX3FjX2NvbXBsZXRlX25vb3Aoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywgdTggZHJ2X3N0YXQpOworc3RhdGljIHZvaWQgX19hdGFfcWNfY29tcGxldGUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX3VuaXF1ZV9pZCA9IDE7CitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmF0YV93cTsKKworTU9EVUxFX0FVVEhPUigiSmVmZiBHYXJ6aWsiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTGlicmFyeSBtb2R1bGUgZm9yIEFUQSBkZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKKy8qKgorICoJYXRhX3RmX2xvYWQgLSBzZW5kIHRhc2tmaWxlIHJlZ2lzdGVycyB0byBob3N0IGNvbnRyb2xsZXIKKyAqCUBhcDogUG9ydCB0byB3aGljaCBvdXRwdXQgaXMgc2VudAorICoJQHRmOiBBVEEgdGFza2ZpbGUgcmVnaXN0ZXIgc2V0CisgKgorICoJT3V0cHV0cyBBVEEgdGFza2ZpbGUgdG8gc3RhbmRhcmQgQVRBIGhvc3QgY29udHJvbGxlci4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gY2FsbGVyLgorICovCisKK3N0YXRpYyB2b2lkIGF0YV90Zl9sb2FkX3BpbyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwlzdHJ1Y3QgYXRhX2lvcG9ydHMgKmlvYWRkciA9ICZhcC0+aW9hZGRyOworCXVuc2lnbmVkIGludCBpc19hZGRyID0gdGYtPmZsYWdzICYgQVRBX1RGTEFHX0lTQUREUjsKKworCWlmICh0Zi0+Y3RsICE9IGFwLT5sYXN0X2N0bCkgeworCQlvdXRiKHRmLT5jdGwsIGlvYWRkci0+Y3RsX2FkZHIpOworCQlhcC0+bGFzdF9jdGwgPSB0Zi0+Y3RsOworCQlhdGFfd2FpdF9pZGxlKGFwKTsKKwl9CisKKwlpZiAoaXNfYWRkciAmJiAodGYtPmZsYWdzICYgQVRBX1RGTEFHX0xCQTQ4KSkgeworCQlvdXRiKHRmLT5ob2JfZmVhdHVyZSwgaW9hZGRyLT5mZWF0dXJlX2FkZHIpOworCQlvdXRiKHRmLT5ob2JfbnNlY3QsIGlvYWRkci0+bnNlY3RfYWRkcik7CisJCW91dGIodGYtPmhvYl9sYmFsLCBpb2FkZHItPmxiYWxfYWRkcik7CisJCW91dGIodGYtPmhvYl9sYmFtLCBpb2FkZHItPmxiYW1fYWRkcik7CisJCW91dGIodGYtPmhvYl9sYmFoLCBpb2FkZHItPmxiYWhfYWRkcik7CisJCVZQUklOVEsoImhvYjogZmVhdCAweCVYIG5zZWN0IDB4JVgsIGxiYSAweCVYIDB4JVggMHglWFxuIiwKKwkJCXRmLT5ob2JfZmVhdHVyZSwKKwkJCXRmLT5ob2JfbnNlY3QsCisJCQl0Zi0+aG9iX2xiYWwsCisJCQl0Zi0+aG9iX2xiYW0sCisJCQl0Zi0+aG9iX2xiYWgpOworCX0KKworCWlmIChpc19hZGRyKSB7CisJCW91dGIodGYtPmZlYXR1cmUsIGlvYWRkci0+ZmVhdHVyZV9hZGRyKTsKKwkJb3V0Yih0Zi0+bnNlY3QsIGlvYWRkci0+bnNlY3RfYWRkcik7CisJCW91dGIodGYtPmxiYWwsIGlvYWRkci0+bGJhbF9hZGRyKTsKKwkJb3V0Yih0Zi0+bGJhbSwgaW9hZGRyLT5sYmFtX2FkZHIpOworCQlvdXRiKHRmLT5sYmFoLCBpb2FkZHItPmxiYWhfYWRkcik7CisJCVZQUklOVEsoImZlYXQgMHglWCBuc2VjdCAweCVYIGxiYSAweCVYIDB4JVggMHglWFxuIiwKKwkJCXRmLT5mZWF0dXJlLAorCQkJdGYtPm5zZWN0LAorCQkJdGYtPmxiYWwsCisJCQl0Zi0+bGJhbSwKKwkJCXRmLT5sYmFoKTsKKwl9CisKKwlpZiAodGYtPmZsYWdzICYgQVRBX1RGTEFHX0RFVklDRSkgeworCQlvdXRiKHRmLT5kZXZpY2UsIGlvYWRkci0+ZGV2aWNlX2FkZHIpOworCQlWUFJJTlRLKCJkZXZpY2UgMHglWFxuIiwgdGYtPmRldmljZSk7CisJfQorCisJYXRhX3dhaXRfaWRsZShhcCk7Cit9CisKKy8qKgorICoJYXRhX3RmX2xvYWRfbW1pbyAtIHNlbmQgdGFza2ZpbGUgcmVnaXN0ZXJzIHRvIGhvc3QgY29udHJvbGxlcgorICoJQGFwOiBQb3J0IHRvIHdoaWNoIG91dHB1dCBpcyBzZW50CisgKglAdGY6IEFUQSB0YXNrZmlsZSByZWdpc3RlciBzZXQKKyAqCisgKglPdXRwdXRzIEFUQSB0YXNrZmlsZSB0byBzdGFuZGFyZCBBVEEgaG9zdCBjb250cm9sbGVyIHVzaW5nIE1NSU8uCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIGNhbGxlci4KKyAqLworCitzdGF0aWMgdm9pZCBhdGFfdGZfbG9hZF9tbWlvKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCXN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyID0gJmFwLT5pb2FkZHI7CisJdW5zaWduZWQgaW50IGlzX2FkZHIgPSB0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfSVNBRERSOworCisJaWYgKHRmLT5jdGwgIT0gYXAtPmxhc3RfY3RsKSB7CisJCXdyaXRlYih0Zi0+Y3RsLCAodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIuY3RsX2FkZHIpOworCQlhcC0+bGFzdF9jdGwgPSB0Zi0+Y3RsOworCQlhdGFfd2FpdF9pZGxlKGFwKTsKKwl9CisKKwlpZiAoaXNfYWRkciAmJiAodGYtPmZsYWdzICYgQVRBX1RGTEFHX0xCQTQ4KSkgeworCQl3cml0ZWIodGYtPmhvYl9mZWF0dXJlLCAodm9pZCBfX2lvbWVtICopIGlvYWRkci0+ZmVhdHVyZV9hZGRyKTsKKwkJd3JpdGViKHRmLT5ob2JfbnNlY3QsICh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5uc2VjdF9hZGRyKTsKKwkJd3JpdGViKHRmLT5ob2JfbGJhbCwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPmxiYWxfYWRkcik7CisJCXdyaXRlYih0Zi0+aG9iX2xiYW0sICh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5sYmFtX2FkZHIpOworCQl3cml0ZWIodGYtPmhvYl9sYmFoLCAodm9pZCBfX2lvbWVtICopIGlvYWRkci0+bGJhaF9hZGRyKTsKKwkJVlBSSU5USygiaG9iOiBmZWF0IDB4JVggbnNlY3QgMHglWCwgbGJhIDB4JVggMHglWCAweCVYXG4iLAorCQkJdGYtPmhvYl9mZWF0dXJlLAorCQkJdGYtPmhvYl9uc2VjdCwKKwkJCXRmLT5ob2JfbGJhbCwKKwkJCXRmLT5ob2JfbGJhbSwKKwkJCXRmLT5ob2JfbGJhaCk7CisJfQorCisJaWYgKGlzX2FkZHIpIHsKKwkJd3JpdGViKHRmLT5mZWF0dXJlLCAodm9pZCBfX2lvbWVtICopIGlvYWRkci0+ZmVhdHVyZV9hZGRyKTsKKwkJd3JpdGViKHRmLT5uc2VjdCwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPm5zZWN0X2FkZHIpOworCQl3cml0ZWIodGYtPmxiYWwsICh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5sYmFsX2FkZHIpOworCQl3cml0ZWIodGYtPmxiYW0sICh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5sYmFtX2FkZHIpOworCQl3cml0ZWIodGYtPmxiYWgsICh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5sYmFoX2FkZHIpOworCQlWUFJJTlRLKCJmZWF0IDB4JVggbnNlY3QgMHglWCBsYmEgMHglWCAweCVYIDB4JVhcbiIsCisJCQl0Zi0+ZmVhdHVyZSwKKwkJCXRmLT5uc2VjdCwKKwkJCXRmLT5sYmFsLAorCQkJdGYtPmxiYW0sCisJCQl0Zi0+bGJhaCk7CisJfQorCisJaWYgKHRmLT5mbGFncyAmIEFUQV9URkxBR19ERVZJQ0UpIHsKKwkJd3JpdGViKHRmLT5kZXZpY2UsICh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5kZXZpY2VfYWRkcik7CisJCVZQUklOVEsoImRldmljZSAweCVYXG4iLCB0Zi0+ZGV2aWNlKTsKKwl9CisKKwlhdGFfd2FpdF9pZGxlKGFwKTsKK30KKwordm9pZCBhdGFfdGZfbG9hZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfTU1JTykKKwkJYXRhX3RmX2xvYWRfbW1pbyhhcCwgdGYpOworCWVsc2UKKwkJYXRhX3RmX2xvYWRfcGlvKGFwLCB0Zik7Cit9CisKKy8qKgorICoJYXRhX2V4ZWNfY29tbWFuZCAtIGlzc3VlIEFUQSBjb21tYW5kIHRvIGhvc3QgY29udHJvbGxlcgorICoJQGFwOiBwb3J0IHRvIHdoaWNoIGNvbW1hbmQgaXMgYmVpbmcgaXNzdWVkCisgKglAdGY6IEFUQSB0YXNrZmlsZSByZWdpc3RlciBzZXQKKyAqCisgKglJc3N1ZXMgUElPL01NSU8gd3JpdGUgdG8gQVRBIGNvbW1hbmQgcmVnaXN0ZXIsIHdpdGggcHJvcGVyCisgKglzeW5jaHJvbml6YXRpb24gd2l0aCBpbnRlcnJ1cHQgaGFuZGxlciAvIG90aGVyIHRocmVhZHMuCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKi8KKworc3RhdGljIHZvaWQgYXRhX2V4ZWNfY29tbWFuZF9waW8oc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpCit7CisJRFBSSU5USygiYXRhJXU6IGNtZCAweCVYXG4iLCBhcC0+aWQsIHRmLT5jb21tYW5kKTsKKworICAgICAgIAlvdXRiKHRmLT5jb21tYW5kLCBhcC0+aW9hZGRyLmNvbW1hbmRfYWRkcik7CisJYXRhX3BhdXNlKGFwKTsKK30KKworCisvKioKKyAqCWF0YV9leGVjX2NvbW1hbmRfbW1pbyAtIGlzc3VlIEFUQSBjb21tYW5kIHRvIGhvc3QgY29udHJvbGxlcgorICoJQGFwOiBwb3J0IHRvIHdoaWNoIGNvbW1hbmQgaXMgYmVpbmcgaXNzdWVkCisgKglAdGY6IEFUQSB0YXNrZmlsZSByZWdpc3RlciBzZXQKKyAqCisgKglJc3N1ZXMgTU1JTyB3cml0ZSB0byBBVEEgY29tbWFuZCByZWdpc3Rlciwgd2l0aCBwcm9wZXIKKyAqCXN5bmNocm9uaXphdGlvbiB3aXRoIGludGVycnVwdCBoYW5kbGVyIC8gb3RoZXIgdGhyZWFkcy4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqLworCitzdGF0aWMgdm9pZCBhdGFfZXhlY19jb21tYW5kX21taW8oc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpCit7CisJRFBSSU5USygiYXRhJXU6IGNtZCAweCVYXG4iLCBhcC0+aWQsIHRmLT5jb21tYW5kKTsKKworICAgICAgIAl3cml0ZWIodGYtPmNvbW1hbmQsICh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5jb21tYW5kX2FkZHIpOworCWF0YV9wYXVzZShhcCk7Cit9CisKK3ZvaWQgYXRhX2V4ZWNfY29tbWFuZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfTU1JTykKKwkJYXRhX2V4ZWNfY29tbWFuZF9tbWlvKGFwLCB0Zik7CisJZWxzZQorCQlhdGFfZXhlY19jb21tYW5kX3BpbyhhcCwgdGYpOworfQorCisvKioKKyAqCWF0YV9leGVjIC0gaXNzdWUgQVRBIGNvbW1hbmQgdG8gaG9zdCBjb250cm9sbGVyCisgKglAYXA6IHBvcnQgdG8gd2hpY2ggY29tbWFuZCBpcyBiZWluZyBpc3N1ZWQKKyAqCUB0ZjogQVRBIHRhc2tmaWxlIHJlZ2lzdGVyIHNldAorICoKKyAqCUlzc3VlcyBQSU8vTU1JTyB3cml0ZSB0byBBVEEgY29tbWFuZCByZWdpc3Rlciwgd2l0aCBwcm9wZXIKKyAqCXN5bmNocm9uaXphdGlvbiB3aXRoIGludGVycnVwdCBoYW5kbGVyIC8gb3RoZXIgdGhyZWFkcy4KKyAqCisgKglMT0NLSU5HOgorICoJT2J0YWlucyBob3N0X3NldCBsb2NrLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGFfZXhlYyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRFBSSU5USygiYXRhJXU6IGNtZCAweCVYXG4iLCBhcC0+aWQsIHRmLT5jb21tYW5kKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXAtPmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7CisJYXAtPm9wcy0+ZXhlY19jb21tYW5kKGFwLCB0Zik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXAtPmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICoJYXRhX3RmX3RvX2hvc3QgLSBpc3N1ZSBBVEEgdGFza2ZpbGUgdG8gaG9zdCBjb250cm9sbGVyCisgKglAYXA6IHBvcnQgdG8gd2hpY2ggY29tbWFuZCBpcyBiZWluZyBpc3N1ZWQKKyAqCUB0ZjogQVRBIHRhc2tmaWxlIHJlZ2lzdGVyIHNldAorICoKKyAqCUlzc3VlcyBBVEEgdGFza2ZpbGUgcmVnaXN0ZXIgc2V0IHRvIEFUQSBob3N0IGNvbnRyb2xsZXIsCisgKgl3aXRoIHByb3BlciBzeW5jaHJvbml6YXRpb24gd2l0aCBpbnRlcnJ1cHQgaGFuZGxlciBhbmQKKyAqCW90aGVyIHRocmVhZHMuCisgKgorICoJTE9DS0lORzoKKyAqCU9idGFpbnMgaG9zdF9zZXQgbG9jay4KKyAqLworCitzdGF0aWMgdm9pZCBhdGFfdGZfdG9faG9zdChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwlhcC0+b3BzLT50Zl9sb2FkKGFwLCB0Zik7CisKKwlhdGFfZXhlYyhhcCwgdGYpOworfQorCisvKioKKyAqCWF0YV90Zl90b19ob3N0X25vbG9jayAtIGlzc3VlIEFUQSB0YXNrZmlsZSB0byBob3N0IGNvbnRyb2xsZXIKKyAqCUBhcDogcG9ydCB0byB3aGljaCBjb21tYW5kIGlzIGJlaW5nIGlzc3VlZAorICoJQHRmOiBBVEEgdGFza2ZpbGUgcmVnaXN0ZXIgc2V0CisgKgorICoJSXNzdWVzIEFUQSB0YXNrZmlsZSByZWdpc3RlciBzZXQgdG8gQVRBIGhvc3QgY29udHJvbGxlciwKKyAqCXdpdGggcHJvcGVyIHN5bmNocm9uaXphdGlvbiB3aXRoIGludGVycnVwdCBoYW5kbGVyIGFuZAorICoJb3RoZXIgdGhyZWFkcy4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqLworCit2b2lkIGF0YV90Zl90b19ob3N0X25vbG9jayhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwlhcC0+b3BzLT50Zl9sb2FkKGFwLCB0Zik7CisJYXAtPm9wcy0+ZXhlY19jb21tYW5kKGFwLCB0Zik7Cit9CisKKy8qKgorICoJYXRhX3RmX3JlYWQgLSBpbnB1dCBkZXZpY2UncyBBVEEgdGFza2ZpbGUgc2hhZG93IHJlZ2lzdGVycworICoJQGFwOiBQb3J0IGZyb20gd2hpY2ggaW5wdXQgaXMgcmVhZAorICoJQHRmOiBBVEEgdGFza2ZpbGUgcmVnaXN0ZXIgc2V0IGZvciBzdG9yaW5nIGlucHV0CisgKgorICoJUmVhZHMgQVRBIHRhc2tmaWxlIHJlZ2lzdGVycyBmb3IgY3VycmVudGx5LXNlbGVjdGVkIGRldmljZQorICoJaW50byBAdGYuCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIGNhbGxlci4KKyAqLworCitzdGF0aWMgdm9pZCBhdGFfdGZfcmVhZF9waW8oc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpCit7CisJc3RydWN0IGF0YV9pb3BvcnRzICppb2FkZHIgPSAmYXAtPmlvYWRkcjsKKworCXRmLT5uc2VjdCA9IGluYihpb2FkZHItPm5zZWN0X2FkZHIpOworCXRmLT5sYmFsID0gaW5iKGlvYWRkci0+bGJhbF9hZGRyKTsKKwl0Zi0+bGJhbSA9IGluYihpb2FkZHItPmxiYW1fYWRkcik7CisJdGYtPmxiYWggPSBpbmIoaW9hZGRyLT5sYmFoX2FkZHIpOworCXRmLT5kZXZpY2UgPSBpbmIoaW9hZGRyLT5kZXZpY2VfYWRkcik7CisKKwlpZiAodGYtPmZsYWdzICYgQVRBX1RGTEFHX0xCQTQ4KSB7CisJCW91dGIodGYtPmN0bCB8IEFUQV9IT0IsIGlvYWRkci0+Y3RsX2FkZHIpOworCQl0Zi0+aG9iX2ZlYXR1cmUgPSBpbmIoaW9hZGRyLT5lcnJvcl9hZGRyKTsKKwkJdGYtPmhvYl9uc2VjdCA9IGluYihpb2FkZHItPm5zZWN0X2FkZHIpOworCQl0Zi0+aG9iX2xiYWwgPSBpbmIoaW9hZGRyLT5sYmFsX2FkZHIpOworCQl0Zi0+aG9iX2xiYW0gPSBpbmIoaW9hZGRyLT5sYmFtX2FkZHIpOworCQl0Zi0+aG9iX2xiYWggPSBpbmIoaW9hZGRyLT5sYmFoX2FkZHIpOworCX0KK30KKworLyoqCisgKglhdGFfdGZfcmVhZF9tbWlvIC0gaW5wdXQgZGV2aWNlJ3MgQVRBIHRhc2tmaWxlIHNoYWRvdyByZWdpc3RlcnMKKyAqCUBhcDogUG9ydCBmcm9tIHdoaWNoIGlucHV0IGlzIHJlYWQKKyAqCUB0ZjogQVRBIHRhc2tmaWxlIHJlZ2lzdGVyIHNldCBmb3Igc3RvcmluZyBpbnB1dAorICoKKyAqCVJlYWRzIEFUQSB0YXNrZmlsZSByZWdpc3RlcnMgZm9yIGN1cnJlbnRseS1zZWxlY3RlZCBkZXZpY2UKKyAqCWludG8gQHRmIHZpYSBNTUlPLgorICoKKyAqCUxPQ0tJTkc6CisgKglJbmhlcml0ZWQgZnJvbSBjYWxsZXIuCisgKi8KKworc3RhdGljIHZvaWQgYXRhX3RmX3JlYWRfbW1pbyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwlzdHJ1Y3QgYXRhX2lvcG9ydHMgKmlvYWRkciA9ICZhcC0+aW9hZGRyOworCisJdGYtPm5zZWN0ID0gcmVhZGIoKHZvaWQgX19pb21lbSAqKWlvYWRkci0+bnNlY3RfYWRkcik7CisJdGYtPmxiYWwgPSByZWFkYigodm9pZCBfX2lvbWVtICopaW9hZGRyLT5sYmFsX2FkZHIpOworCXRmLT5sYmFtID0gcmVhZGIoKHZvaWQgX19pb21lbSAqKWlvYWRkci0+bGJhbV9hZGRyKTsKKwl0Zi0+bGJhaCA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKilpb2FkZHItPmxiYWhfYWRkcik7CisJdGYtPmRldmljZSA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKilpb2FkZHItPmRldmljZV9hZGRyKTsKKworCWlmICh0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfTEJBNDgpIHsKKwkJd3JpdGViKHRmLT5jdGwgfCBBVEFfSE9CLCAodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIuY3RsX2FkZHIpOworCQl0Zi0+aG9iX2ZlYXR1cmUgPSByZWFkYigodm9pZCBfX2lvbWVtICopaW9hZGRyLT5lcnJvcl9hZGRyKTsKKwkJdGYtPmhvYl9uc2VjdCA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKilpb2FkZHItPm5zZWN0X2FkZHIpOworCQl0Zi0+aG9iX2xiYWwgPSByZWFkYigodm9pZCBfX2lvbWVtICopaW9hZGRyLT5sYmFsX2FkZHIpOworCQl0Zi0+aG9iX2xiYW0gPSByZWFkYigodm9pZCBfX2lvbWVtICopaW9hZGRyLT5sYmFtX2FkZHIpOworCQl0Zi0+aG9iX2xiYWggPSByZWFkYigodm9pZCBfX2lvbWVtICopaW9hZGRyLT5sYmFoX2FkZHIpOworCX0KK30KKwordm9pZCBhdGFfdGZfcmVhZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfTU1JTykKKwkJYXRhX3RmX3JlYWRfbW1pbyhhcCwgdGYpOworCWVsc2UKKwkJYXRhX3RmX3JlYWRfcGlvKGFwLCB0Zik7Cit9CisKKy8qKgorICoJYXRhX2NoZWNrX3N0YXR1c19waW8gLSBSZWFkIGRldmljZSBzdGF0dXMgcmVnICYgY2xlYXIgaW50ZXJydXB0CisgKglAYXA6IHBvcnQgd2hlcmUgdGhlIGRldmljZSBpcworICoKKyAqCVJlYWRzIEFUQSB0YXNrZmlsZSBzdGF0dXMgcmVnaXN0ZXIgZm9yIGN1cnJlbnRseS1zZWxlY3RlZCBkZXZpY2UKKyAqCWFuZCByZXR1cm4gaXQncyB2YWx1ZS4gVGhpcyBhbHNvIGNsZWFycyBwZW5kaW5nIGludGVycnVwdHMKKyAqICAgICAgZnJvbSB0aGlzIGRldmljZQorICoKKyAqCUxPQ0tJTkc6CisgKglJbmhlcml0ZWQgZnJvbSBjYWxsZXIuCisgKi8KK3N0YXRpYyB1OCBhdGFfY2hlY2tfc3RhdHVzX3BpbyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXJldHVybiBpbmIoYXAtPmlvYWRkci5zdGF0dXNfYWRkcik7Cit9CisKKy8qKgorICoJYXRhX2NoZWNrX3N0YXR1c19tbWlvIC0gUmVhZCBkZXZpY2Ugc3RhdHVzIHJlZyAmIGNsZWFyIGludGVycnVwdAorICoJQGFwOiBwb3J0IHdoZXJlIHRoZSBkZXZpY2UgaXMKKyAqCisgKglSZWFkcyBBVEEgdGFza2ZpbGUgc3RhdHVzIHJlZ2lzdGVyIGZvciBjdXJyZW50bHktc2VsZWN0ZWQgZGV2aWNlCisgKgl2aWEgTU1JTyBhbmQgcmV0dXJuIGl0J3MgdmFsdWUuIFRoaXMgYWxzbyBjbGVhcnMgcGVuZGluZyBpbnRlcnJ1cHRzCisgKiAgICAgIGZyb20gdGhpcyBkZXZpY2UKKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gY2FsbGVyLgorICovCitzdGF0aWMgdTggYXRhX2NoZWNrX3N0YXR1c19tbWlvKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisgICAgICAgCXJldHVybiByZWFkYigodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIuc3RhdHVzX2FkZHIpOworfQorCit1OCBhdGFfY2hlY2tfc3RhdHVzKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX01NSU8pCisJCXJldHVybiBhdGFfY2hlY2tfc3RhdHVzX21taW8oYXApOworCXJldHVybiBhdGFfY2hlY2tfc3RhdHVzX3BpbyhhcCk7Cit9CisKK3U4IGF0YV9hbHRzdGF0dXMoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlpZiAoYXAtPm9wcy0+Y2hlY2tfYWx0c3RhdHVzKQorCQlyZXR1cm4gYXAtPm9wcy0+Y2hlY2tfYWx0c3RhdHVzKGFwKTsKKworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKQorCQlyZXR1cm4gcmVhZGIoKHZvaWQgX19pb21lbSAqKWFwLT5pb2FkZHIuYWx0c3RhdHVzX2FkZHIpOworCXJldHVybiBpbmIoYXAtPmlvYWRkci5hbHRzdGF0dXNfYWRkcik7Cit9CisKK3U4IGF0YV9jaGtfZXJyKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJaWYgKGFwLT5vcHMtPmNoZWNrX2VycikKKwkJcmV0dXJuIGFwLT5vcHMtPmNoZWNrX2VycihhcCk7CisKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfTU1JTykgeworCQlyZXR1cm4gcmVhZGIoKHZvaWQgX19pb21lbSAqKSBhcC0+aW9hZGRyLmVycm9yX2FkZHIpOworCX0KKwlyZXR1cm4gaW5iKGFwLT5pb2FkZHIuZXJyb3JfYWRkcik7Cit9CisKKy8qKgorICoJYXRhX3RmX3RvX2ZpcyAtIENvbnZlcnQgQVRBIHRhc2tmaWxlIHRvIFNBVEEgRklTIHN0cnVjdHVyZQorICoJQHRmOiBUYXNrZmlsZSB0byBjb252ZXJ0CisgKglAZmlzOiBCdWZmZXIgaW50byB3aGljaCBkYXRhIHdpbGwgb3V0cHV0CisgKglAcG1wOiBQb3J0IG11bHRpcGxpZXIgcG9ydAorICoKKyAqCUNvbnZlcnRzIGEgc3RhbmRhcmQgQVRBIHRhc2tmaWxlIHRvIGEgU2VyaWFsIEFUQQorICoJRklTIHN0cnVjdHVyZSAoUmVnaXN0ZXIgLSBIb3N0IHRvIERldmljZSkuCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIGNhbGxlci4KKyAqLworCit2b2lkIGF0YV90Zl90b19maXMoc3RydWN0IGF0YV90YXNrZmlsZSAqdGYsIHU4ICpmaXMsIHU4IHBtcCkKK3sKKwlmaXNbMF0gPSAweDI3OwkvKiBSZWdpc3RlciAtIEhvc3QgdG8gRGV2aWNlIEZJUyAqLworCWZpc1sxXSA9IChwbXAgJiAweGYpIHwgKDEgPDwgNyk7IC8qIFBvcnQgbXVsdGlwbGllciBudW1iZXIsCisJCQkJCSAgICBiaXQgNyBpbmRpY2F0ZXMgQ29tbWFuZCBGSVMgKi8KKwlmaXNbMl0gPSB0Zi0+Y29tbWFuZDsKKwlmaXNbM10gPSB0Zi0+ZmVhdHVyZTsKKworCWZpc1s0XSA9IHRmLT5sYmFsOworCWZpc1s1XSA9IHRmLT5sYmFtOworCWZpc1s2XSA9IHRmLT5sYmFoOworCWZpc1s3XSA9IHRmLT5kZXZpY2U7CisKKwlmaXNbOF0gPSB0Zi0+aG9iX2xiYWw7CisJZmlzWzldID0gdGYtPmhvYl9sYmFtOworCWZpc1sxMF0gPSB0Zi0+aG9iX2xiYWg7CisJZmlzWzExXSA9IHRmLT5ob2JfZmVhdHVyZTsKKworCWZpc1sxMl0gPSB0Zi0+bnNlY3Q7CisJZmlzWzEzXSA9IHRmLT5ob2JfbnNlY3Q7CisJZmlzWzE0XSA9IDA7CisJZmlzWzE1XSA9IHRmLT5jdGw7CisKKwlmaXNbMTZdID0gMDsKKwlmaXNbMTddID0gMDsKKwlmaXNbMThdID0gMDsKKwlmaXNbMTldID0gMDsKK30KKworLyoqCisgKglhdGFfdGZfZnJvbV9maXMgLSBDb252ZXJ0IFNBVEEgRklTIHRvIEFUQSB0YXNrZmlsZQorICoJQGZpczogQnVmZmVyIGZyb20gd2hpY2ggZGF0YSB3aWxsIGJlIGlucHV0CisgKglAdGY6IFRhc2tmaWxlIHRvIG91dHB1dAorICoKKyAqCUNvbnZlcnRzIGEgc3RhbmRhcmQgQVRBIHRhc2tmaWxlIHRvIGEgU2VyaWFsIEFUQQorICoJRklTIHN0cnVjdHVyZSAoUmVnaXN0ZXIgLSBIb3N0IHRvIERldmljZSkuCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIGNhbGxlci4KKyAqLworCit2b2lkIGF0YV90Zl9mcm9tX2Zpcyh1OCAqZmlzLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwl0Zi0+Y29tbWFuZAk9IGZpc1syXTsJLyogc3RhdHVzICovCisJdGYtPmZlYXR1cmUJPSBmaXNbM107CS8qIGVycm9yICovCisKKwl0Zi0+bGJhbAk9IGZpc1s0XTsKKwl0Zi0+bGJhbQk9IGZpc1s1XTsKKwl0Zi0+bGJhaAk9IGZpc1s2XTsKKwl0Zi0+ZGV2aWNlCT0gZmlzWzddOworCisJdGYtPmhvYl9sYmFsCT0gZmlzWzhdOworCXRmLT5ob2JfbGJhbQk9IGZpc1s5XTsKKwl0Zi0+aG9iX2xiYWgJPSBmaXNbMTBdOworCisJdGYtPm5zZWN0CT0gZmlzWzEyXTsKKwl0Zi0+aG9iX25zZWN0CT0gZmlzWzEzXTsKK30KKworLyoqCisgKglhdGFfcHJvdF90b19jbWQgLSBkZXRlcm1pbmUgd2hpY2ggcmVhZC93cml0ZSBvcGNvZGVzIHRvIHVzZQorICoJQHByb3RvY29sOiBBVEFfUFJPVF94eHggdGFza2ZpbGUgcHJvdG9jb2wKKyAqCUBsYmE0ODogdHJ1ZSBpcyBsYmE0OCBpcyBwcmVzZW50CisgKgorICoJR2l2ZW4gbmVjZXNzYXJ5IGlucHV0LCBkZXRlcm1pbmUgd2hpY2ggcmVhZC93cml0ZSBjb21tYW5kcworICoJdG8gdXNlIHRvIHRyYW5zZmVyIGRhdGEuCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUuCisgKi8KK3N0YXRpYyBpbnQgYXRhX3Byb3RfdG9fY21kKGludCBwcm90b2NvbCwgaW50IGxiYTQ4KQoreworCWludCByY21kID0gMCwgd2NtZCA9IDA7CisKKwlzd2l0Y2ggKHByb3RvY29sKSB7CisJY2FzZSBBVEFfUFJPVF9QSU86CisJCWlmIChsYmE0OCkgeworCQkJcmNtZCA9IEFUQV9DTURfUElPX1JFQURfRVhUOworCQkJd2NtZCA9IEFUQV9DTURfUElPX1dSSVRFX0VYVDsKKwkJfSBlbHNlIHsKKwkJCXJjbWQgPSBBVEFfQ01EX1BJT19SRUFEOworCQkJd2NtZCA9IEFUQV9DTURfUElPX1dSSVRFOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBVEFfUFJPVF9ETUE6CisJCWlmIChsYmE0OCkgeworCQkJcmNtZCA9IEFUQV9DTURfUkVBRF9FWFQ7CisJCQl3Y21kID0gQVRBX0NNRF9XUklURV9FWFQ7CisJCX0gZWxzZSB7CisJCQlyY21kID0gQVRBX0NNRF9SRUFEOworCQkJd2NtZCA9IEFUQV9DTURfV1JJVEU7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIHJjbWQgfCAod2NtZCA8PCA4KTsKK30KKworLyoqCisgKglhdGFfZGV2X3NldF9wcm90b2NvbCAtIHNldCB0YXNrZmlsZSBwcm90b2NvbCBhbmQgci93IGNvbW1hbmRzCisgKglAZGV2OiBkZXZpY2UgdG8gZXhhbWluZSBhbmQgY29uZmlndXJlCisgKgorICoJRXhhbWluZSB0aGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24sIGFmdGVyIHdlIGhhdmUKKyAqCXJlYWQgdGhlIGlkZW50aWZ5LWRldmljZSBwYWdlIGFuZCBjb25maWd1cmVkIHRoZQorICoJZGF0YSB0cmFuc2ZlciBtb2RlLiAgU2V0IGludGVybmFsIHN0YXRlIHJlbGF0ZWQgdG8KKyAqCXRoZSBBVEEgdGFza2ZpbGUgcHJvdG9jb2wgKHBpbywgcGlvIG11bHQsIGRtYSwgZXRjLikKKyAqCWFuZCBjYWxjdWxhdGUgdGhlIHByb3BlciByZWFkL3dyaXRlIGNvbW1hbmRzIHRvIHVzZS4KKyAqCisgKglMT0NLSU5HOgorICoJY2FsbGVyLgorICovCitzdGF0aWMgdm9pZCBhdGFfZGV2X3NldF9wcm90b2NvbChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQoreworCWludCBwaW8gPSAoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19QSU8pOworCWludCBsYmE0OCA9IChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX0xCQTQ4KTsKKwlpbnQgcHJvdG8sIGNtZDsKKworCWlmIChwaW8pCisJCXByb3RvID0gZGV2LT54ZmVyX3Byb3RvY29sID0gQVRBX1BST1RfUElPOworCWVsc2UKKwkJcHJvdG8gPSBkZXYtPnhmZXJfcHJvdG9jb2wgPSBBVEFfUFJPVF9ETUE7CisKKwljbWQgPSBhdGFfcHJvdF90b19jbWQocHJvdG8sIGxiYTQ4KTsKKwlpZiAoY21kIDwgMCkKKwkJQlVHKCk7CisKKwlkZXYtPnJlYWRfY21kID0gY21kICYgMHhmZjsKKwlkZXYtPndyaXRlX2NtZCA9IChjbWQgPj4gOCkgJiAweGZmOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIHhmZXJfbW9kZV9zdHJbXSA9IHsKKwkiVURNQS8xNiIsCisJIlVETUEvMjUiLAorCSJVRE1BLzMzIiwKKwkiVURNQS80NCIsCisJIlVETUEvNjYiLAorCSJVRE1BLzEwMCIsCisJIlVETUEvMTMzIiwKKwkiVURNQTciLAorCSJNV0RNQTAiLAorCSJNV0RNQTEiLAorCSJNV0RNQTIiLAorCSJQSU8wIiwKKwkiUElPMSIsCisJIlBJTzIiLAorCSJQSU8zIiwKKwkiUElPNCIsCit9OworCisvKioKKyAqCWF0YV91ZG1hX3N0cmluZyAtIGNvbnZlcnQgVURNQSBiaXQgb2Zmc2V0IHRvIHN0cmluZworICoJQG1hc2s6IG1hc2sgb2YgYml0cyBzdXBwb3J0ZWQ7IG9ubHkgaGlnaGVzdCBiaXQgY291bnRzLgorICoKKyAqCURldGVybWluZSBzdHJpbmcgd2hpY2ggcmVwcmVzZW50cyB0aGUgaGlnaGVzdCBzcGVlZAorICoJKGhpZ2hlc3QgYml0IGluIEB1ZG1hX21hc2spLgorICoKKyAqCUxPQ0tJTkc6CisgKglOb25lLgorICoKKyAqCVJFVFVSTlM6CisgKglDb25zdGFudCBDIHN0cmluZyByZXByZXNlbnRpbmcgaGlnaGVzdCBzcGVlZCBsaXN0ZWQgaW4KKyAqCUB1ZG1hX21hc2ssIG9yIHRoZSBjb25zdGFudCBDIHN0cmluZyAiPG4vYT4iLgorICovCisKK3N0YXRpYyBjb25zdCBjaGFyICphdGFfbW9kZV9zdHJpbmcodW5zaWduZWQgaW50IG1hc2spCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSA3OyBpID49IDA7IGktLSkKKwkJaWYgKG1hc2sgJiAoMSA8PCBpKSkKKwkJCWdvdG8gb3V0OworCWZvciAoaSA9IEFUQV9TSElGVF9NV0RNQSArIDI7IGkgPj0gQVRBX1NISUZUX01XRE1BOyBpLS0pCisJCWlmIChtYXNrICYgKDEgPDwgaSkpCisJCQlnb3RvIG91dDsKKwlmb3IgKGkgPSBBVEFfU0hJRlRfUElPICsgNDsgaSA+PSBBVEFfU0hJRlRfUElPOyBpLS0pCisJCWlmIChtYXNrICYgKDEgPDwgaSkpCisJCQlnb3RvIG91dDsKKworCXJldHVybiAiPG4vYT4iOworCitvdXQ6CisJcmV0dXJuIHhmZXJfbW9kZV9zdHJbaV07Cit9CisKKy8qKgorICoJYXRhX3Bpb19kZXZjaGsgLSBQQVRBIGRldmljZSBwcmVzZW5jZSBkZXRlY3Rpb24KKyAqCUBhcDogQVRBIGNoYW5uZWwgdG8gZXhhbWluZQorICoJQGRldmljZTogRGV2aWNlIHRvIGV4YW1pbmUgKHN0YXJ0aW5nIGF0IHplcm8pCisgKgorICoJVGhpcyB0ZWNobmlxdWUgd2FzIG9yaWdpbmFsbHkgZGVzY3JpYmVkIGluCisgKglIYWxlIExhbmRpcydzIEFUQURSVlIgKHd3dy5hdGEtYXRhcGkuY29tKSwgYW5kCisgKglsYXRlciBmb3VuZCBpdHMgd2F5IGludG8gdGhlIEFUQS9BVEFQSSBzcGVjLgorICoKKyAqCVdyaXRlIGEgcGF0dGVybiB0byB0aGUgQVRBIHNoYWRvdyByZWdpc3RlcnMsCisgKglhbmQgaWYgYSBkZXZpY2UgaXMgcHJlc2VudCwgaXQgd2lsbCByZXNwb25kIGJ5CisgKgljb3JyZWN0bHkgc3RvcmluZyBhbmQgZWNob2luZyBiYWNrIHRoZQorICoJQVRBIHNoYWRvdyByZWdpc3RlciBjb250ZW50cy4KKyAqCisgKglMT0NLSU5HOgorICoJY2FsbGVyLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX3Bpb19kZXZjaGsoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgZGV2aWNlKQoreworCXN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyID0gJmFwLT5pb2FkZHI7CisJdTggbnNlY3QsIGxiYWw7CisKKwlhcC0+b3BzLT5kZXZfc2VsZWN0KGFwLCBkZXZpY2UpOworCisJb3V0YigweDU1LCBpb2FkZHItPm5zZWN0X2FkZHIpOworCW91dGIoMHhhYSwgaW9hZGRyLT5sYmFsX2FkZHIpOworCisJb3V0YigweGFhLCBpb2FkZHItPm5zZWN0X2FkZHIpOworCW91dGIoMHg1NSwgaW9hZGRyLT5sYmFsX2FkZHIpOworCisJb3V0YigweDU1LCBpb2FkZHItPm5zZWN0X2FkZHIpOworCW91dGIoMHhhYSwgaW9hZGRyLT5sYmFsX2FkZHIpOworCisJbnNlY3QgPSBpbmIoaW9hZGRyLT5uc2VjdF9hZGRyKTsKKwlsYmFsID0gaW5iKGlvYWRkci0+bGJhbF9hZGRyKTsKKworCWlmICgobnNlY3QgPT0gMHg1NSkgJiYgKGxiYWwgPT0gMHhhYSkpCisJCXJldHVybiAxOwkvKiB3ZSBmb3VuZCBhIGRldmljZSAqLworCisJcmV0dXJuIDA7CQkvKiBub3RoaW5nIGZvdW5kICovCit9CisKKy8qKgorICoJYXRhX21taW9fZGV2Y2hrIC0gUEFUQSBkZXZpY2UgcHJlc2VuY2UgZGV0ZWN0aW9uCisgKglAYXA6IEFUQSBjaGFubmVsIHRvIGV4YW1pbmUKKyAqCUBkZXZpY2U6IERldmljZSB0byBleGFtaW5lIChzdGFydGluZyBhdCB6ZXJvKQorICoKKyAqCVRoaXMgdGVjaG5pcXVlIHdhcyBvcmlnaW5hbGx5IGRlc2NyaWJlZCBpbgorICoJSGFsZSBMYW5kaXMncyBBVEFEUlZSICh3d3cuYXRhLWF0YXBpLmNvbSksIGFuZAorICoJbGF0ZXIgZm91bmQgaXRzIHdheSBpbnRvIHRoZSBBVEEvQVRBUEkgc3BlYy4KKyAqCisgKglXcml0ZSBhIHBhdHRlcm4gdG8gdGhlIEFUQSBzaGFkb3cgcmVnaXN0ZXJzLAorICoJYW5kIGlmIGEgZGV2aWNlIGlzIHByZXNlbnQsIGl0IHdpbGwgcmVzcG9uZCBieQorICoJY29ycmVjdGx5IHN0b3JpbmcgYW5kIGVjaG9pbmcgYmFjayB0aGUKKyAqCUFUQSBzaGFkb3cgcmVnaXN0ZXIgY29udGVudHMuCisgKgorICoJTE9DS0lORzoKKyAqCWNhbGxlci4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGF0YV9tbWlvX2RldmNoayhzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgZGV2aWNlKQoreworCXN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyID0gJmFwLT5pb2FkZHI7CisJdTggbnNlY3QsIGxiYWw7CisKKwlhcC0+b3BzLT5kZXZfc2VsZWN0KGFwLCBkZXZpY2UpOworCisJd3JpdGViKDB4NTUsICh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5uc2VjdF9hZGRyKTsKKwl3cml0ZWIoMHhhYSwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPmxiYWxfYWRkcik7CisKKwl3cml0ZWIoMHhhYSwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPm5zZWN0X2FkZHIpOworCXdyaXRlYigweDU1LCAodm9pZCBfX2lvbWVtICopIGlvYWRkci0+bGJhbF9hZGRyKTsKKworCXdyaXRlYigweDU1LCAodm9pZCBfX2lvbWVtICopIGlvYWRkci0+bnNlY3RfYWRkcik7CisJd3JpdGViKDB4YWEsICh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5sYmFsX2FkZHIpOworCisJbnNlY3QgPSByZWFkYigodm9pZCBfX2lvbWVtICopIGlvYWRkci0+bnNlY3RfYWRkcik7CisJbGJhbCA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5sYmFsX2FkZHIpOworCisJaWYgKChuc2VjdCA9PSAweDU1KSAmJiAobGJhbCA9PSAweGFhKSkKKwkJcmV0dXJuIDE7CS8qIHdlIGZvdW5kIGEgZGV2aWNlICovCisKKwlyZXR1cm4gMDsJCS8qIG5vdGhpbmcgZm91bmQgKi8KK30KKworLyoqCisgKglhdGFfZGV2Y2hrIC0gUEFUQSBkZXZpY2UgcHJlc2VuY2UgZGV0ZWN0aW9uCisgKglAYXA6IEFUQSBjaGFubmVsIHRvIGV4YW1pbmUKKyAqCUBkZXZpY2U6IERldmljZSB0byBleGFtaW5lIChzdGFydGluZyBhdCB6ZXJvKQorICoKKyAqCURpc3BhdGNoIEFUQSBkZXZpY2UgcHJlc2VuY2UgZGV0ZWN0aW9uLCBkZXBlbmRpbmcKKyAqCW9uIHdoZXRoZXIgd2UgYXJlIHVzaW5nIFBJTyBvciBNTUlPIHRvIHRhbGsgdG8gdGhlCisgKglBVEEgc2hhZG93IHJlZ2lzdGVycy4KKyAqCisgKglMT0NLSU5HOgorICoJY2FsbGVyLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX2RldmNoayhzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgZGV2aWNlKQoreworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKQorCQlyZXR1cm4gYXRhX21taW9fZGV2Y2hrKGFwLCBkZXZpY2UpOworCXJldHVybiBhdGFfcGlvX2RldmNoayhhcCwgZGV2aWNlKTsKK30KKworLyoqCisgKglhdGFfZGV2X2NsYXNzaWZ5IC0gZGV0ZXJtaW5lIGRldmljZSB0eXBlIGJhc2VkIG9uIEFUQS1zcGVjIHNpZ25hdHVyZQorICoJQHRmOiBBVEEgdGFza2ZpbGUgcmVnaXN0ZXIgc2V0IGZvciBkZXZpY2UgdG8gYmUgaWRlbnRpZmllZAorICoKKyAqCURldGVybWluZSBmcm9tIHRhc2tmaWxlIHJlZ2lzdGVyIGNvbnRlbnRzIHdoZXRoZXIgYSBkZXZpY2UgaXMKKyAqCUFUQSBvciBBVEFQSSwgYXMgcGVyICJTaWduYXR1cmUgYW5kIHBlcnNpc3RlbmNlIiBzZWN0aW9uCisgKglvZiBBVEEvUEkgc3BlYyAodm9sdW1lIDEsIHNlY3QgNS4xNCkuCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUuCisgKgorICoJUkVUVVJOUzoKKyAqCURldmljZSB0eXBlLCAlQVRBX0RFVl9BVEEsICVBVEFfREVWX0FUQVBJLCBvciAlQVRBX0RFVl9VTktOT1dOCisgKgl0aGUgZXZlbnQgb2YgZmFpbHVyZS4KKyAqLworCit1bnNpZ25lZCBpbnQgYXRhX2Rldl9jbGFzc2lmeShzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwkvKiBBcHBsZSdzIG9wZW4gc291cmNlIERhcndpbiBjb2RlIGhpbnRzIHRoYXQgc29tZSBkZXZpY2VzIG9ubHkKKwkgKiBwdXQgYSBwcm9wZXIgc2lnbmF0dXJlIGludG8gdGhlIExCQSBtaWQvaGlnaCByZWdpc3RlcnMsCisJICogU28sIHdlIG9ubHkgY2hlY2sgdGhvc2UuICBJdCdzIHN1ZmZpY2llbnQgZm9yIHVuaXF1ZW5lc3MuCisJICovCisKKwlpZiAoKCh0Zi0+bGJhbSA9PSAwKSAmJiAodGYtPmxiYWggPT0gMCkpIHx8CisJICAgICgodGYtPmxiYW0gPT0gMHgzYykgJiYgKHRmLT5sYmFoID09IDB4YzMpKSkgeworCQlEUFJJTlRLKCJmb3VuZCBBVEEgZGV2aWNlIGJ5IHNpZ1xuIik7CisJCXJldHVybiBBVEFfREVWX0FUQTsKKwl9CisKKwlpZiAoKCh0Zi0+bGJhbSA9PSAweDE0KSAmJiAodGYtPmxiYWggPT0gMHhlYikpIHx8CisJICAgICgodGYtPmxiYW0gPT0gMHg2OSkgJiYgKHRmLT5sYmFoID09IDB4OTYpKSkgeworCQlEUFJJTlRLKCJmb3VuZCBBVEFQSSBkZXZpY2UgYnkgc2lnXG4iKTsKKwkJcmV0dXJuIEFUQV9ERVZfQVRBUEk7CisJfQorCisJRFBSSU5USygidW5rbm93biBkZXZpY2VcbiIpOworCXJldHVybiBBVEFfREVWX1VOS05PV047Cit9CisKKy8qKgorICoJYXRhX2Rldl90cnlfY2xhc3NpZnkgLSBQYXJzZSByZXR1cm5lZCBBVEEgZGV2aWNlIHNpZ25hdHVyZQorICoJQGFwOiBBVEEgY2hhbm5lbCB0byBleGFtaW5lCisgKglAZGV2aWNlOiBEZXZpY2UgdG8gZXhhbWluZSAoc3RhcnRpbmcgYXQgemVybykKKyAqCisgKglBZnRlciBhbiBldmVudCAtLSBTUlNULCBFLkQuRC4sIG9yIFNBVEEgQ09NUkVTRVQgLS0gb2NjdXJzLAorICoJYW4gQVRBL0FUQVBJLWRlZmluZWQgc2V0IG9mIHZhbHVlcyBpcyBwbGFjZWQgaW4gdGhlIEFUQQorICoJc2hhZG93IHJlZ2lzdGVycywgaW5kaWNhdGluZyB0aGUgcmVzdWx0cyBvZiBkZXZpY2UgZGV0ZWN0aW9uCisgKglhbmQgZGlhZ25vc3RpY3MuCisgKgorICoJU2VsZWN0IHRoZSBBVEEgZGV2aWNlLCBhbmQgcmVhZCB0aGUgdmFsdWVzIGZyb20gdGhlIEFUQSBzaGFkb3cKKyAqCXJlZ2lzdGVycy4gIFRoZW4gcGFyc2UgYWNjb3JkaW5nIHRvIHRoZSBFcnJvciByZWdpc3RlciB2YWx1ZSwKKyAqCWFuZCB0aGUgc3BlYy1kZWZpbmVkIHZhbHVlcyBleGFtaW5lZCBieSBhdGFfZGV2X2NsYXNzaWZ5KCkuCisgKgorICoJTE9DS0lORzoKKyAqCWNhbGxlci4KKyAqLworCitzdGF0aWMgdTggYXRhX2Rldl90cnlfY2xhc3NpZnkoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IGRldmljZSkKK3sKKwlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gJmFwLT5kZXZpY2VbZGV2aWNlXTsKKwlzdHJ1Y3QgYXRhX3Rhc2tmaWxlIHRmOworCXVuc2lnbmVkIGludCBjbGFzczsKKwl1OCBlcnI7CisKKwlhcC0+b3BzLT5kZXZfc2VsZWN0KGFwLCBkZXZpY2UpOworCisJbWVtc2V0KCZ0ZiwgMCwgc2l6ZW9mKHRmKSk7CisKKwllcnIgPSBhdGFfY2hrX2VycihhcCk7CisJYXAtPm9wcy0+dGZfcmVhZChhcCwgJnRmKTsKKworCWRldi0+Y2xhc3MgPSBBVEFfREVWX05PTkU7CisKKwkvKiBzZWUgaWYgZGV2aWNlIHBhc3NlZCBkaWFncyAqLworCWlmIChlcnIgPT0gMSkKKwkJLyogZG8gbm90aGluZyAqLyA7CisJZWxzZSBpZiAoKGRldmljZSA9PSAwKSAmJiAoZXJyID09IDB4ODEpKQorCQkvKiBkbyBub3RoaW5nICovIDsKKwllbHNlCisJCXJldHVybiBlcnI7CisKKwkvKiBkZXRlcm1pbmUgaWYgZGV2aWNlIGlmIEFUQSBvciBBVEFQSSAqLworCWNsYXNzID0gYXRhX2Rldl9jbGFzc2lmeSgmdGYpOworCWlmIChjbGFzcyA9PSBBVEFfREVWX1VOS05PV04pCisJCXJldHVybiBlcnI7CisJaWYgKChjbGFzcyA9PSBBVEFfREVWX0FUQSkgJiYgKGF0YV9jaGtfc3RhdHVzKGFwKSA9PSAwKSkKKwkJcmV0dXJuIGVycjsKKworCWRldi0+Y2xhc3MgPSBjbGFzczsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICoJYXRhX2Rldl9pZF9zdHJpbmcgLSBDb252ZXJ0IElERU5USUZZIERFVklDRSBwYWdlIGludG8gc3RyaW5nCisgKglAaWQ6IElERU5USUZZIERFVklDRSByZXN1bHRzIHdlIHdpbGwgZXhhbWluZQorICoJQHM6IHN0cmluZyBpbnRvIHdoaWNoIGRhdGEgaXMgb3V0cHV0CisgKglAb2ZzOiBvZmZzZXQgaW50byBpZGVudGlmeSBkZXZpY2UgcGFnZQorICoJQGxlbjogbGVuZ3RoIG9mIHN0cmluZyB0byByZXR1cm4uIG11c3QgYmUgYW4gZXZlbiBudW1iZXIuCisgKgorICoJVGhlIHN0cmluZ3MgaW4gdGhlIElERU5USUZZIERFVklDRSBwYWdlIGFyZSBicm9rZW4gdXAgaW50bworICoJMTYtYml0IGNodW5rcy4gIFJ1biB0aHJvdWdoIHRoZSBzdHJpbmcsIGFuZCBvdXRwdXQgZWFjaAorICoJOC1iaXQgY2h1bmsgbGluZWFybHksIHJlZ2FyZGxlc3Mgb2YgcGxhdGZvcm0uCisgKgorICoJTE9DS0lORzoKKyAqCWNhbGxlci4KKyAqLworCit2b2lkIGF0YV9kZXZfaWRfc3RyaW5nKHUxNiAqaWQsIHVuc2lnbmVkIGNoYXIgKnMsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgb2ZzLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGludCBjOworCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJYyA9IGlkW29mc10gPj4gODsKKwkJKnMgPSBjOworCQlzKys7CisKKwkJYyA9IGlkW29mc10gJiAweGZmOworCQkqcyA9IGM7CisJCXMrKzsKKworCQlvZnMrKzsKKwkJbGVuIC09IDI7CisJfQorfQorCit2b2lkIGF0YV9ub29wX2Rldl9zZWxlY3QgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBkZXZpY2UpCit7Cit9CisKKy8qKgorICoJYXRhX3N0ZF9kZXZfc2VsZWN0IC0gU2VsZWN0IGRldmljZSAwLzEgb24gQVRBIGJ1cworICoJQGFwOiBBVEEgY2hhbm5lbCB0byBtYW5pcHVsYXRlCisgKglAZGV2aWNlOiBBVEEgZGV2aWNlIChudW1iZXJlZCBmcm9tIHplcm8pIHRvIHNlbGVjdAorICoKKyAqCVVzZSB0aGUgbWV0aG9kIGRlZmluZWQgaW4gdGhlIEFUQSBzcGVjaWZpY2F0aW9uIHRvCisgKgltYWtlIGVpdGhlciBkZXZpY2UgMCwgb3IgZGV2aWNlIDEsIGFjdGl2ZSBvbiB0aGUKKyAqCUFUQSBjaGFubmVsLgorICoKKyAqCUxPQ0tJTkc6CisgKgljYWxsZXIuCisgKi8KKwordm9pZCBhdGFfc3RkX2Rldl9zZWxlY3QgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBkZXZpY2UpCit7CisJdTggdG1wOworCisJaWYgKGRldmljZSA9PSAwKQorCQl0bXAgPSBBVEFfREVWSUNFX09CUzsKKwllbHNlCisJCXRtcCA9IEFUQV9ERVZJQ0VfT0JTIHwgQVRBX0RFVjE7CisKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfTU1JTykgeworCQl3cml0ZWIodG1wLCAodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIuZGV2aWNlX2FkZHIpOworCX0gZWxzZSB7CisJCW91dGIodG1wLCBhcC0+aW9hZGRyLmRldmljZV9hZGRyKTsKKwl9CisJYXRhX3BhdXNlKGFwKTsJCS8qIG5lZWRlZDsgYWxzbyBmbHVzaGVzLCBmb3IgbW1pbyAqLworfQorCisvKioKKyAqCWF0YV9kZXZfc2VsZWN0IC0gU2VsZWN0IGRldmljZSAwLzEgb24gQVRBIGJ1cworICoJQGFwOiBBVEEgY2hhbm5lbCB0byBtYW5pcHVsYXRlCisgKglAZGV2aWNlOiBBVEEgZGV2aWNlIChudW1iZXJlZCBmcm9tIHplcm8pIHRvIHNlbGVjdAorICoJQHdhaXQ6IG5vbi16ZXJvIHRvIHdhaXQgZm9yIFN0YXR1cyByZWdpc3RlciBCU1kgYml0IHRvIGNsZWFyCisgKglAY2FuX3NsZWVwOiBub24temVybyBpZiBjb250ZXh0IGFsbG93cyBzbGVlcGluZworICoKKyAqCVVzZSB0aGUgbWV0aG9kIGRlZmluZWQgaW4gdGhlIEFUQSBzcGVjaWZpY2F0aW9uIHRvCisgKgltYWtlIGVpdGhlciBkZXZpY2UgMCwgb3IgZGV2aWNlIDEsIGFjdGl2ZSBvbiB0aGUKKyAqCUFUQSBjaGFubmVsLgorICoKKyAqCVRoaXMgaXMgYSBoaWdoLWxldmVsIHZlcnNpb24gb2YgYXRhX3N0ZF9kZXZfc2VsZWN0KCksCisgKgl3aGljaCBhZGRpdGlvbmFsbHkgcHJvdmlkZXMgdGhlIHNlcnZpY2VzIG9mIGluc2VydGluZworICoJdGhlIHByb3BlciBwYXVzZXMgYW5kIHN0YXR1cyBwb2xsaW5nLCB3aGVyZSBuZWVkZWQuCisgKgorICoJTE9DS0lORzoKKyAqCWNhbGxlci4KKyAqLworCit2b2lkIGF0YV9kZXZfc2VsZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBkZXZpY2UsCisJCQkgICB1bnNpZ25lZCBpbnQgd2FpdCwgdW5zaWduZWQgaW50IGNhbl9zbGVlcCkKK3sKKwlWUFJJTlRLKCJFTlRFUiwgYXRhJXU6IGRldmljZSAldSwgd2FpdCAldVxuIiwKKwkJYXAtPmlkLCBkZXZpY2UsIHdhaXQpOworCisJaWYgKHdhaXQpCisJCWF0YV93YWl0X2lkbGUoYXApOworCisJYXAtPm9wcy0+ZGV2X3NlbGVjdChhcCwgZGV2aWNlKTsKKworCWlmICh3YWl0KSB7CisJCWlmIChjYW5fc2xlZXAgJiYgYXAtPmRldmljZVtkZXZpY2VdLmNsYXNzID09IEFUQV9ERVZfQVRBUEkpCisJCQltc2xlZXAoMTUwKTsKKwkJYXRhX3dhaXRfaWRsZShhcCk7CisJfQorfQorCisvKioKKyAqCWF0YV9kdW1wX2lkIC0gSURFTlRJRlkgREVWSUNFIGluZm8gZGVidWdnaW5nIG91dHB1dAorICoJQGRldjogRGV2aWNlIHdob3NlIElERU5USUZZIERFVklDRSBwYWdlIHdlIHdpbGwgZHVtcAorICoKKyAqCUR1bXAgc2VsZWN0ZWQgMTYtYml0IHdvcmRzIGZyb20gYSBkZXRlY3RlZCBkZXZpY2UncworICoJSURFTlRJRlkgUEFHRSBwYWdlLgorICoKKyAqCUxPQ0tJTkc6CisgKgljYWxsZXIuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGF0YV9kdW1wX2lkKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCit7CisJRFBSSU5USygiNDk9PTB4JTA0eCAgIgorCQkiNTM9PTB4JTA0eCAgIgorCQkiNjM9PTB4JTA0eCAgIgorCQkiNjQ9PTB4JTA0eCAgIgorCQkiNzU9PTB4JTA0eCAgXG4iLAorCQlkZXYtPmlkWzQ5XSwKKwkJZGV2LT5pZFs1M10sCisJCWRldi0+aWRbNjNdLAorCQlkZXYtPmlkWzY0XSwKKwkJZGV2LT5pZFs3NV0pOworCURQUklOVEsoIjgwPT0weCUwNHggICIKKwkJIjgxPT0weCUwNHggICIKKwkJIjgyPT0weCUwNHggICIKKwkJIjgzPT0weCUwNHggICIKKwkJIjg0PT0weCUwNHggIFxuIiwKKwkJZGV2LT5pZFs4MF0sCisJCWRldi0+aWRbODFdLAorCQlkZXYtPmlkWzgyXSwKKwkJZGV2LT5pZFs4M10sCisJCWRldi0+aWRbODRdKTsKKwlEUFJJTlRLKCI4OD09MHglMDR4ICAiCisJCSI5Mz09MHglMDR4XG4iLAorCQlkZXYtPmlkWzg4XSwKKwkJZGV2LT5pZFs5M10pOworfQorCisvKioKKyAqCWF0YV9kZXZfaWRlbnRpZnkgLSBvYnRhaW4gSURFTlRJRlkgeCBERVZJQ0UgcGFnZQorICoJQGFwOiBwb3J0IG9uIHdoaWNoIGRldmljZSB3ZSB3aXNoIHRvIHByb2JlIHJlc2lkZXMKKyAqCUBkZXZpY2U6IGRldmljZSBidXMgYWRkcmVzcywgc3RhcnRpbmcgYXQgemVybworICoKKyAqCUZvbGxvd2luZyBidXMgcmVzZXQsIHdlIGlzc3VlIHRoZSBJREVOVElGWSBbUEFDS0VUXSBERVZJQ0UKKyAqCWNvbW1hbmQsIGFuZCByZWFkIGJhY2sgdGhlIDUxMi1ieXRlIGRldmljZSBpbmZvcm1hdGlvbiBwYWdlLgorICoJVGhlIGRldmljZSBpbmZvcm1hdGlvbiBwYWdlIGlzIGZlZCB0byB1cyB2aWEgdGhlIHN0YW5kYXJkCisgKglQSU8tSU4gcHJvdG9jb2wsIGJ1dCB3ZSBoYW5kLWNvZGUgaXQgaGVyZS4gKFRPRE86IGludmVzdGlnYXRlCisgKgl1c2luZyBzdGFuZGFyZCBQSU8tSU4gcGF0aHMpCisgKgorICoJQWZ0ZXIgcmVhZGluZyB0aGUgZGV2aWNlIGluZm9ybWF0aW9uIHBhZ2UsIHdlIHVzZSBzZXZlcmFsCisgKgliaXRzIG9mIGluZm9ybWF0aW9uIGZyb20gaXQgdG8gaW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZXMKKyAqCXRoYXQgd2lsbCBiZSB1c2VkIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlIGF0YV9kZXZpY2UuCisgKglPdGhlciBkYXRhIGZyb20gdGhlIGluZm8gcGFnZSBpcyB1c2VkIHRvIGRpc3F1YWxpZnkgY2VydGFpbgorICoJb2xkZXIgQVRBIGRldmljZXMgd2UgZG8gbm90IHdpc2ggdG8gc3VwcG9ydC4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gY2FsbGVyLiAgU29tZSBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRoaXMgZnVuY3Rpb24KKyAqCW9idGFpbiB0aGUgaG9zdF9zZXQgbG9jay4KKyAqLworCitzdGF0aWMgdm9pZCBhdGFfZGV2X2lkZW50aWZ5KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBkZXZpY2UpCit7CisJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9ICZhcC0+ZGV2aWNlW2RldmljZV07CisJdW5zaWduZWQgaW50IGk7CisJdTE2IHRtcDsKKwl1bnNpZ25lZCBsb25nIHhmZXJfbW9kZXM7CisJdTggc3RhdHVzOworCXVuc2lnbmVkIGludCB1c2luZ19lZGQ7CisJREVDTEFSRV9DT01QTEVUSU9OKHdhaXQpOworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlpZiAoIWF0YV9kZXZfcHJlc2VudChkZXYpKSB7CisJCURQUklOVEsoIkVOVEVSL0VYSVQgKGhvc3QgJXUsIGRldiAldSkgLS0gbm9kZXZcbiIsCisJCQlhcC0+aWQsIGRldmljZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoYXAtPmZsYWdzICYgKEFUQV9GTEFHX1NSU1QgfCBBVEFfRkxBR19TQVRBX1JFU0VUKSkKKwkJdXNpbmdfZWRkID0gMDsKKwllbHNlCisJCXVzaW5nX2VkZCA9IDE7CisKKwlEUFJJTlRLKCJFTlRFUiwgaG9zdCAldSwgZGV2ICV1XG4iLCBhcC0+aWQsIGRldmljZSk7CisKKwlhc3NlcnQgKGRldi0+Y2xhc3MgPT0gQVRBX0RFVl9BVEEgfHwgZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQVBJIHx8CisJCWRldi0+Y2xhc3MgPT0gQVRBX0RFVl9OT05FKTsKKworCWF0YV9kZXZfc2VsZWN0KGFwLCBkZXZpY2UsIDEsIDEpOyAvKiBzZWxlY3QgZGV2aWNlIDAvMSAqLworCisJcWMgPSBhdGFfcWNfbmV3X2luaXQoYXAsIGRldik7CisJQlVHX09OKHFjID09IE5VTEwpOworCisJYXRhX3NnX2luaXRfb25lKHFjLCBkZXYtPmlkLCBzaXplb2YoZGV2LT5pZCkpOworCXFjLT5kbWFfZGlyID0gRE1BX0ZST01fREVWSUNFOworCXFjLT50Zi5wcm90b2NvbCA9IEFUQV9QUk9UX1BJTzsKKwlxYy0+bnNlY3QgPSAxOworCityZXRyeToKKwlpZiAoZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQSkgeworCQlxYy0+dGYuY29tbWFuZCA9IEFUQV9DTURfSURfQVRBOworCQlEUFJJTlRLKCJkbyBBVEEgaWRlbnRpZnlcbiIpOworCX0gZWxzZSB7CisJCXFjLT50Zi5jb21tYW5kID0gQVRBX0NNRF9JRF9BVEFQSTsKKwkJRFBSSU5USygiZG8gQVRBUEkgaWRlbnRpZnlcbiIpOworCX0KKworCXFjLT53YWl0aW5nID0gJndhaXQ7CisJcWMtPmNvbXBsZXRlX2ZuID0gYXRhX3FjX2NvbXBsZXRlX25vb3A7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXAtPmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7CisJcmMgPSBhdGFfcWNfaXNzdWUocWMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwLT5ob3N0X3NldC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXQ7CisJZWxzZQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ3YWl0KTsKKworCXN0YXR1cyA9IGF0YV9jaGtfc3RhdHVzKGFwKTsKKwlpZiAoc3RhdHVzICYgQVRBX0VSUikgeworCQkvKgorCQkgKiBhcmchICBFREQgd29ya3MgZm9yIGFsbCB0ZXN0IGNhc2VzLCBidXQgc2VlbXMgdG8gcmV0dXJuCisJCSAqIHRoZSBBVEEgc2lnbmF0dXJlIGZvciBzb21lIEFUQVBJIGRldmljZXMuICBVbnRpbCB0aGUKKwkJICogcmVhc29uIGZvciB0aGlzIGlzIGZvdW5kIGFuZCBmaXhlZCwgd2UgZml4IHVwIHRoZSBtZXNzCisJCSAqIGhlcmUuICBJZiBJREVOVElGWSBERVZJQ0UgcmV0dXJucyBjb21tYW5kIGFib3J0ZWQKKwkJICogKGFzIEFUQVBJIGRldmljZXMgZG8pLCB0aGVuIHdlIGlzc3VlIGFuCisJCSAqIElERU5USUZZIFBBQ0tFVCBERVZJQ0UuCisJCSAqCisJCSAqIEFUQSBzb2Z0d2FyZSByZXNldCAoU1JTVCwgdGhlIGRlZmF1bHQpIGRvZXMgbm90IGFwcGVhcgorCQkgKiB0byBoYXZlIHRoaXMgcHJvYmxlbS4KKwkJICovCisJCWlmICgodXNpbmdfZWRkKSAmJiAocWMtPnRmLmNvbW1hbmQgPT0gQVRBX0NNRF9JRF9BVEEpKSB7CisJCQl1OCBlcnIgPSBhdGFfY2hrX2VycihhcCk7CisJCQlpZiAoZXJyICYgQVRBX0FCT1JURUQpIHsKKwkJCQlkZXYtPmNsYXNzID0gQVRBX0RFVl9BVEFQSTsKKwkJCQlxYy0+Y3Vyc2cgPSAwOworCQkJCXFjLT5jdXJzZ19vZnMgPSAwOworCQkJCXFjLT5jdXJzZWN0ID0gMDsKKwkJCQlxYy0+bnNlY3QgPSAxOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCX0KKwkJZ290byBlcnJfb3V0OworCX0KKworCXN3YXBfYnVmX2xlMTYoZGV2LT5pZCwgQVRBX0lEX1dPUkRTKTsKKworCS8qIHByaW50IGRldmljZSBjYXBhYmlsaXRpZXMgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAiYXRhJXU6IGRldiAldSBjZmcgIgorCSAgICAgICAiNDk6JTA0eCA4MjolMDR4IDgzOiUwNHggODQ6JTA0eCA4NTolMDR4IDg2OiUwNHggODc6JTA0eCA4ODolMDR4XG4iLAorCSAgICAgICBhcC0+aWQsIGRldmljZSwgZGV2LT5pZFs0OV0sCisJICAgICAgIGRldi0+aWRbODJdLCBkZXYtPmlkWzgzXSwgZGV2LT5pZFs4NF0sCisJICAgICAgIGRldi0+aWRbODVdLCBkZXYtPmlkWzg2XSwgZGV2LT5pZFs4N10sCisJICAgICAgIGRldi0+aWRbODhdKTsKKworCS8qCisJICogY29tbW9uIEFUQSwgQVRBUEkgZmVhdHVyZSB0ZXN0cworCSAqLworCisJLyogd2UgcmVxdWlyZSBMQkEgYW5kIERNQSBzdXBwb3J0IChiaXRzIDggJiA5IG9mIHdvcmQgNDkpICovCisJaWYgKCFhdGFfaWRfaGFzX2RtYShkZXYtPmlkKSB8fCAhYXRhX2lkX2hhc19sYmEoZGV2LT5pZCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImF0YSV1OiBubyBkbWEvbGJhXG4iLCBhcC0+aWQpOworCQlnb3RvIGVycl9vdXRfbm9zdXA7CisJfQorCisJLyogcXVpY2stbi1kaXJ0eSBmaW5kIG1heCB0cmFuc2ZlciBtb2RlOyBmb3IgcHJpbnRrIG9ubHkgKi8KKwl4ZmVyX21vZGVzID0gZGV2LT5pZFtBVEFfSURfVURNQV9NT0RFU107CisJaWYgKCF4ZmVyX21vZGVzKQorCQl4ZmVyX21vZGVzID0gKGRldi0+aWRbQVRBX0lEX01XRE1BX01PREVTXSkgPDwgQVRBX1NISUZUX01XRE1BOworCWlmICgheGZlcl9tb2RlcykgeworCQl4ZmVyX21vZGVzID0gKGRldi0+aWRbQVRBX0lEX1BJT19NT0RFU10pIDw8IChBVEFfU0hJRlRfUElPICsgMyk7CisJCXhmZXJfbW9kZXMgfD0gKDB4NyA8PCBBVEFfU0hJRlRfUElPKTsKKwl9CisKKwlhdGFfZHVtcF9pZChkZXYpOworCisJLyogQVRBLXNwZWNpZmljIGZlYXR1cmUgdGVzdHMgKi8KKwlpZiAoZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQSkgeworCQlpZiAoIWF0YV9pZF9pc19hdGEoZGV2LT5pZCkpCS8qIHNhbml0eSBjaGVjayAqLworCQkJZ290byBlcnJfb3V0X25vc3VwOworCisJCXRtcCA9IGRldi0+aWRbQVRBX0lEX01BSk9SX1ZFUl07CisJCWZvciAoaSA9IDE0OyBpID49IDE7IGktLSkKKwkJCWlmICh0bXAgJiAoMSA8PCBpKSkKKwkJCQlicmVhazsKKworCQkvKiB3ZSByZXF1aXJlIGF0IGxlYXN0IEFUQS0zICovCisJCWlmIChpIDwgMykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgImF0YSV1OiBubyBBVEEtM1xuIiwgYXAtPmlkKTsKKwkJCWdvdG8gZXJyX291dF9ub3N1cDsKKwkJfQorCisJCWlmIChhdGFfaWRfaGFzX2xiYTQ4KGRldi0+aWQpKSB7CisJCQlkZXYtPmZsYWdzIHw9IEFUQV9ERkxBR19MQkE0ODsKKwkJCWRldi0+bl9zZWN0b3JzID0gYXRhX2lkX3U2NChkZXYtPmlkLCAxMDApOworCQl9IGVsc2UgeworCQkJZGV2LT5uX3NlY3RvcnMgPSBhdGFfaWRfdTMyKGRldi0+aWQsIDYwKTsKKwkJfQorCisJCWFwLT5ob3N0LT5tYXhfY21kX2xlbiA9IDE2OworCisJCS8qIHByaW50IGRldmljZSBpbmZvIHRvIGRtZXNnICovCisJCXByaW50ayhLRVJOX0lORk8gImF0YSV1OiBkZXYgJXUgQVRBLCBtYXggJXMsICVMdSBzZWN0b3JzOiVzXG4iLAorCQkgICAgICAgYXAtPmlkLCBkZXZpY2UsCisJCSAgICAgICBhdGFfbW9kZV9zdHJpbmcoeGZlcl9tb2RlcyksCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWRldi0+bl9zZWN0b3JzLAorCQkgICAgICAgZGV2LT5mbGFncyAmIEFUQV9ERkxBR19MQkE0OCA/ICIgbGJhNDgiIDogIiIpOworCX0KKworCS8qIEFUQVBJLXNwZWNpZmljIGZlYXR1cmUgdGVzdHMgKi8KKwllbHNlIHsKKwkJaWYgKGF0YV9pZF9pc19hdGEoZGV2LT5pZCkpCQkvKiBzYW5pdHkgY2hlY2sgKi8KKwkJCWdvdG8gZXJyX291dF9ub3N1cDsKKworCQlyYyA9IGF0YXBpX2NkYl9sZW4oZGV2LT5pZCk7CisJCWlmICgocmMgPCAxMikgfHwgKHJjID4gQVRBUElfQ0RCX0xFTikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImF0YSV1OiB1bnN1cHBvcnRlZCBDREIgbGVuXG4iLCBhcC0+aWQpOworCQkJZ290byBlcnJfb3V0X25vc3VwOworCQl9CisJCWFwLT5jZGJfbGVuID0gKHVuc2lnbmVkIGludCkgcmM7CisJCWFwLT5ob3N0LT5tYXhfY21kX2xlbiA9ICh1bnNpZ25lZCBjaGFyKSBhcC0+Y2RiX2xlbjsKKworCQkvKiBwcmludCBkZXZpY2UgaW5mbyB0byBkbWVzZyAqLworCQlwcmludGsoS0VSTl9JTkZPICJhdGEldTogZGV2ICV1IEFUQVBJLCBtYXggJXNcbiIsCisJCSAgICAgICBhcC0+aWQsIGRldmljZSwKKwkJICAgICAgIGF0YV9tb2RlX3N0cmluZyh4ZmVyX21vZGVzKSk7CisJfQorCisJRFBSSU5USygiRVhJVCwgZHJ2X3N0YXQgPSAweCV4XG4iLCBhdGFfY2hrX3N0YXR1cyhhcCkpOworCXJldHVybjsKKworZXJyX291dF9ub3N1cDoKKwlwcmludGsoS0VSTl9XQVJOSU5HICJhdGEldTogZGV2ICV1IG5vdCBzdXBwb3J0ZWQsIGlnbm9yaW5nXG4iLAorCSAgICAgICBhcC0+aWQsIGRldmljZSk7CitlcnJfb3V0OgorCWRldi0+Y2xhc3MrKzsJLyogY29udmVydHMgQVRBX0RFVl94eHggaW50byBBVEFfREVWX3h4eF9VTlNVUCAqLworCURQUklOVEsoIkVYSVQsIGVyclxuIik7Cit9CisKKy8qKgorICoJYXRhX2J1c19wcm9iZSAtIFJlc2V0IGFuZCBwcm9iZSBBVEEgYnVzCisgKglAYXA6IEJ1cyB0byBwcm9iZQorICoKKyAqCUxPQ0tJTkc6CisgKgorICoJUkVUVVJOUzoKKyAqCVplcm8gb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IuCisgKi8KKworc3RhdGljIGludCBhdGFfYnVzX3Byb2JlKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdW5zaWduZWQgaW50IGksIGZvdW5kID0gMDsKKworCWFwLT5vcHMtPnBoeV9yZXNldChhcCk7CisJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX1BPUlRfRElTQUJMRUQpCisJCWdvdG8gZXJyX291dDsKKworCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykgeworCQlhdGFfZGV2X2lkZW50aWZ5KGFwLCBpKTsKKwkJaWYgKGF0YV9kZXZfcHJlc2VudCgmYXAtPmRldmljZVtpXSkpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWlmIChhcC0+b3BzLT5kZXZfY29uZmlnKQorCQkJCWFwLT5vcHMtPmRldl9jb25maWcoYXAsICZhcC0+ZGV2aWNlW2ldKTsKKwkJfQorCX0KKworCWlmICgoIWZvdW5kKSB8fCAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRCkpCisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCisJYXRhX3NldF9tb2RlKGFwKTsKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRCkKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9kaXNhYmxlOgorCWFwLT5vcHMtPnBvcnRfZGlzYWJsZShhcCk7CitlcnJfb3V0OgorCXJldHVybiAtMTsKK30KKworLyoqCisgKglhdGFfcG9ydF9wcm9iZSAtCisgKglAYXA6CisgKgorICoJTE9DS0lORzoKKyAqLworCit2b2lkIGF0YV9wb3J0X3Byb2JlKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJYXAtPmZsYWdzICY9IH5BVEFfRkxBR19QT1JUX0RJU0FCTEVEOworfQorCisvKioKKyAqCV9fc2F0YV9waHlfcmVzZXQgLQorICoJQGFwOgorICoKKyAqCUxPQ0tJTkc6CisgKgorICovCit2b2lkIF9fc2F0YV9waHlfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl1MzIgc3N0YXR1czsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgKEhaICogNSk7CisKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfU0FUQV9SRVNFVCkgeworCQlzY3Jfd3JpdGUoYXAsIFNDUl9DT05UUk9MLCAweDMwMSk7IC8qIGlzc3VlIHBoeSB3YWtlL3Jlc2V0ICovCisJCXNjcl9yZWFkKGFwLCBTQ1JfU1RBVFVTKTsJLyogZHVtbXkgcmVhZDsgZmx1c2ggKi8KKwkJdWRlbGF5KDQwMCk7CQkJLyogRklYTUU6IGEgZ3Vlc3MgKi8KKwl9CisJc2NyX3dyaXRlKGFwLCBTQ1JfQ09OVFJPTCwgMHgzMDApOwkvKiBpc3N1ZSBwaHkgd2FrZS9jbGVhciByZXNldCAqLworCisJLyogd2FpdCBmb3IgcGh5IHRvIGJlY29tZSByZWFkeSwgaWYgbmVjZXNzYXJ5ICovCisJZG8geworCQltc2xlZXAoMjAwKTsKKwkJc3N0YXR1cyA9IHNjcl9yZWFkKGFwLCBTQ1JfU1RBVFVTKTsKKwkJaWYgKChzc3RhdHVzICYgMHhmKSAhPSAxKQorCQkJYnJlYWs7CisJfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpOworCisJLyogVE9ETzogcGh5IGxheWVyIHdpdGggcG9sbGluZywgdGltZW91dHMsIGV0Yy4gKi8KKwlpZiAoc2F0YV9kZXZfcHJlc2VudChhcCkpCisJCWF0YV9wb3J0X3Byb2JlKGFwKTsKKwllbHNlIHsKKwkJc3N0YXR1cyA9IHNjcl9yZWFkKGFwLCBTQ1JfU1RBVFVTKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYXRhJXU6IG5vIGRldmljZSBmb3VuZCAocGh5IHN0YXQgJTA4eClcbiIsCisJCSAgICAgICBhcC0+aWQsIHNzdGF0dXMpOworCQlhdGFfcG9ydF9kaXNhYmxlKGFwKTsKKwl9CisKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRCkKKwkJcmV0dXJuOworCisJaWYgKGF0YV9idXN5X3NsZWVwKGFwLCBBVEFfVE1PVVRfQk9PVF9RVUlDSywgQVRBX1RNT1VUX0JPT1QpKSB7CisJCWF0YV9wb3J0X2Rpc2FibGUoYXApOworCQlyZXR1cm47CisJfQorCisJYXAtPmNibCA9IEFUQV9DQkxfU0FUQTsKK30KKworLyoqCisgKglfX3NhdGFfcGh5X3Jlc2V0IC0KKyAqCUBhcDoKKyAqCisgKglMT0NLSU5HOgorICoKKyAqLwordm9pZCBzYXRhX3BoeV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCV9fc2F0YV9waHlfcmVzZXQoYXApOworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19QT1JUX0RJU0FCTEVEKQorCQlyZXR1cm47CisJYXRhX2J1c19yZXNldChhcCk7Cit9CisKKy8qKgorICoJYXRhX3BvcnRfZGlzYWJsZSAtCisgKglAYXA6CisgKgorICoJTE9DS0lORzoKKyAqLworCit2b2lkIGF0YV9wb3J0X2Rpc2FibGUoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlhcC0+ZGV2aWNlWzBdLmNsYXNzID0gQVRBX0RFVl9OT05FOworCWFwLT5kZXZpY2VbMV0uY2xhc3MgPSBBVEFfREVWX05PTkU7CisJYXAtPmZsYWdzIHw9IEFUQV9GTEFHX1BPUlRfRElTQUJMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzaGlmdDsKKwl1OCBiYXNlOworfSB4ZmVyX21vZGVfY2xhc3Nlc1tdID0geworCXsgQVRBX1NISUZUX1VETUEsCVhGRVJfVURNQV8wIH0sCisJeyBBVEFfU0hJRlRfTVdETUEsCVhGRVJfTVdfRE1BXzAgfSwKKwl7IEFUQV9TSElGVF9QSU8sCVhGRVJfUElPXzAgfSwKK307CisKK3N0YXRpYyBpbmxpbmUgdTggYmFzZV9mcm9tX3NoaWZ0KHVuc2lnbmVkIGludCBzaGlmdCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHhmZXJfbW9kZV9jbGFzc2VzKTsgaSsrKQorCQlpZiAoeGZlcl9tb2RlX2NsYXNzZXNbaV0uc2hpZnQgPT0gc2hpZnQpCisJCQlyZXR1cm4geGZlcl9tb2RlX2NsYXNzZXNbaV0uYmFzZTsKKworCXJldHVybiAweGZmOworfQorCitzdGF0aWMgdm9pZCBhdGFfZGV2X3NldF9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCit7CisJaW50IG9mcywgaWR4OworCXU4IGJhc2U7CisKKwlpZiAoIWF0YV9kZXZfcHJlc2VudChkZXYpIHx8IChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19QT1JUX0RJU0FCTEVEKSkKKwkJcmV0dXJuOworCisJaWYgKGRldi0+eGZlcl9zaGlmdCA9PSBBVEFfU0hJRlRfUElPKQorCQlkZXYtPmZsYWdzIHw9IEFUQV9ERkxBR19QSU87CisKKwlhdGFfZGV2X3NldF94ZmVybW9kZShhcCwgZGV2KTsKKworCWJhc2UgPSBiYXNlX2Zyb21fc2hpZnQoZGV2LT54ZmVyX3NoaWZ0KTsKKwlvZnMgPSBkZXYtPnhmZXJfbW9kZSAtIGJhc2U7CisJaWR4ID0gb2ZzICsgZGV2LT54ZmVyX3NoaWZ0OworCVdBUk5fT04oaWR4ID49IEFSUkFZX1NJWkUoeGZlcl9tb2RlX3N0cikpOworCisJRFBSSU5USygiaWR4PSVkIHhmZXJfc2hpZnQ9JXUsIHhmZXJfbW9kZT0weCV4LCBiYXNlPTB4JXgsIG9mZnNldD0lZFxuIiwKKwkJaWR4LCBkZXYtPnhmZXJfc2hpZnQsIChpbnQpZGV2LT54ZmVyX21vZGUsIChpbnQpYmFzZSwgb2ZzKTsKKworCXByaW50ayhLRVJOX0lORk8gImF0YSV1OiBkZXYgJXUgY29uZmlndXJlZCBmb3IgJXNcbiIsCisJCWFwLT5pZCwgZGV2LT5kZXZubywgeGZlcl9tb2RlX3N0cltpZHhdKTsKK30KKworc3RhdGljIGludCBhdGFfaG9zdF9zZXRfcGlvKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdW5zaWduZWQgaW50IG1hc2s7CisJaW50IHgsIGk7CisJdTggYmFzZSwgeGZlcl9tb2RlOworCisJbWFzayA9IGF0YV9nZXRfbW9kZV9tYXNrKGFwLCBBVEFfU0hJRlRfUElPKTsKKwl4ID0gZmdiKG1hc2spOworCWlmICh4IDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdGEldTogbm8gUElPIHN1cHBvcnRcbiIsIGFwLT5pZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwliYXNlID0gYmFzZV9mcm9tX3NoaWZ0KEFUQV9TSElGVF9QSU8pOworCXhmZXJfbW9kZSA9IGJhc2UgKyB4OworCisJRFBSSU5USygiYmFzZSAweCV4IHhmZXJfbW9kZSAweCV4IG1hc2sgMHgleCB4ICVkXG4iLAorCQkoaW50KWJhc2UsIChpbnQpeGZlcl9tb2RlLCBtYXNrLCB4KTsKKworCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykgeworCQlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gJmFwLT5kZXZpY2VbaV07CisJCWlmIChhdGFfZGV2X3ByZXNlbnQoZGV2KSkgeworCQkJZGV2LT5waW9fbW9kZSA9IHhmZXJfbW9kZTsKKwkJCWRldi0+eGZlcl9tb2RlID0geGZlcl9tb2RlOworCQkJZGV2LT54ZmVyX3NoaWZ0ID0gQVRBX1NISUZUX1BJTzsKKwkJCWlmIChhcC0+b3BzLT5zZXRfcGlvbW9kZSkKKwkJCQlhcC0+b3BzLT5zZXRfcGlvbW9kZShhcCwgZGV2KTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdGFfaG9zdF9zZXRfZG1hKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHU4IHhmZXJfbW9kZSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgeGZlcl9zaGlmdCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykgeworCQlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gJmFwLT5kZXZpY2VbaV07CisJCWlmIChhdGFfZGV2X3ByZXNlbnQoZGV2KSkgeworCQkJZGV2LT5kbWFfbW9kZSA9IHhmZXJfbW9kZTsKKwkJCWRldi0+eGZlcl9tb2RlID0geGZlcl9tb2RlOworCQkJZGV2LT54ZmVyX3NoaWZ0ID0geGZlcl9zaGlmdDsKKwkJCWlmIChhcC0+b3BzLT5zZXRfZG1hbW9kZSkKKwkJCQlhcC0+b3BzLT5zZXRfZG1hbW9kZShhcCwgZGV2KTsKKwkJfQorCX0KK30KKworLyoqCisgKglhdGFfc2V0X21vZGUgLSBQcm9ncmFtIHRpbWluZ3MgYW5kIGlzc3VlIFNFVCBGRUFUVVJFUyAtIFhGRVIKKyAqCUBhcDogcG9ydCBvbiB3aGljaCB0aW1pbmdzIHdpbGwgYmUgcHJvZ3JhbW1lZAorICoKKyAqCUxPQ0tJTkc6CisgKgorICovCitzdGF0aWMgdm9pZCBhdGFfc2V0X21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgeGZlcl9zaGlmdDsKKwl1OCB4ZmVyX21vZGU7CisJaW50IHJjOworCisJLyogc3RlcCAxOiBhbHdheXMgc2V0IGhvc3QgUElPIHRpbWluZ3MgKi8KKwlyYyA9IGF0YV9ob3N0X3NldF9waW8oYXApOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OworCisJLyogc3RlcCAyOiBjaG9vc2UgdGhlIGJlc3QgZGF0YSB4ZmVyIG1vZGUgKi8KKwl4ZmVyX21vZGUgPSB4ZmVyX3NoaWZ0ID0gMDsKKwlyYyA9IGF0YV9jaG9vc2VfeGZlcl9tb2RlKGFwLCAmeGZlcl9tb2RlLCAmeGZlcl9zaGlmdCk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXQ7CisKKwkvKiBzdGVwIDM6IGlmIHRoYXQgeGZlciBtb2RlIGlzbid0IFBJTywgc2V0IGhvc3QgRE1BIHRpbWluZ3MgKi8KKwlpZiAoeGZlcl9zaGlmdCAhPSBBVEFfU0hJRlRfUElPKQorCQlhdGFfaG9zdF9zZXRfZG1hKGFwLCB4ZmVyX21vZGUsIHhmZXJfc2hpZnQpOworCisJLyogc3RlcCA0OiB1cGRhdGUgZGV2aWNlcycgeGZlciBtb2RlICovCisJYXRhX2Rldl9zZXRfbW9kZShhcCwgJmFwLT5kZXZpY2VbMF0pOworCWF0YV9kZXZfc2V0X21vZGUoYXAsICZhcC0+ZGV2aWNlWzFdKTsKKworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19QT1JUX0RJU0FCTEVEKQorCQlyZXR1cm47CisKKwlpZiAoYXAtPm9wcy0+cG9zdF9zZXRfbW9kZSkKKwkJYXAtPm9wcy0+cG9zdF9zZXRfbW9kZShhcCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSAmYXAtPmRldmljZVtpXTsKKwkJYXRhX2Rldl9zZXRfcHJvdG9jb2woZGV2KTsKKwl9CisKKwlyZXR1cm47CisKK2Vycl9vdXQ6CisJYXRhX3BvcnRfZGlzYWJsZShhcCk7Cit9CisKKy8qKgorICoJYXRhX2J1c3lfc2xlZXAgLSBzbGVlcCB1bnRpbCBCU1kgY2xlYXJzLCBvciB0aW1lb3V0CisgKglAYXA6IHBvcnQgY29udGFpbmluZyBzdGF0dXMgcmVnaXN0ZXIgdG8gYmUgcG9sbGVkCisgKglAdG1vdXRfcGF0OiBpbXBhdGllbmNlIHRpbWVvdXQKKyAqCUB0bW91dDogb3ZlcmFsbCB0aW1lb3V0CisgKgorICoJTE9DS0lORzoKKyAqCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBhdGFfYnVzeV9zbGVlcCAoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyB0bW91dF9wYXQsCisJCQkgICAgCSAgICB1bnNpZ25lZCBsb25nIHRtb3V0KQoreworCXVuc2lnbmVkIGxvbmcgdGltZXJfc3RhcnQsIHRpbWVvdXQ7CisJdTggc3RhdHVzOworCisJc3RhdHVzID0gYXRhX2J1c3lfd2FpdChhcCwgQVRBX0JVU1ksIDMwMCk7CisJdGltZXJfc3RhcnQgPSBqaWZmaWVzOworCXRpbWVvdXQgPSB0aW1lcl9zdGFydCArIHRtb3V0X3BhdDsKKwl3aGlsZSAoKHN0YXR1cyAmIEFUQV9CVVNZKSAmJiAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpKSB7CisJCW1zbGVlcCg1MCk7CisJCXN0YXR1cyA9IGF0YV9idXN5X3dhaXQoYXAsIEFUQV9CVVNZLCAzKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgQVRBX0JVU1kpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImF0YSV1IGlzIHNsb3cgdG8gcmVzcG9uZCwgIgorCQkgICAgICAgInBsZWFzZSBiZSBwYXRpZW50XG4iLCBhcC0+aWQpOworCisJdGltZW91dCA9IHRpbWVyX3N0YXJ0ICsgdG1vdXQ7CisJd2hpbGUgKChzdGF0dXMgJiBBVEFfQlVTWSkgJiYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSkgeworCQltc2xlZXAoNTApOworCQlzdGF0dXMgPSBhdGFfY2hrX3N0YXR1cyhhcCk7CisJfQorCisJaWYgKHN0YXR1cyAmIEFUQV9CVVNZKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXRhJXUgZmFpbGVkIHRvIHJlc3BvbmQgKCVsdSBzZWNzKVxuIiwKKwkJICAgICAgIGFwLT5pZCwgdG1vdXQgLyBIWik7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdGFfYnVzX3Bvc3RfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IGRldm1hc2spCit7CisJc3RydWN0IGF0YV9pb3BvcnRzICppb2FkZHIgPSAmYXAtPmlvYWRkcjsKKwl1bnNpZ25lZCBpbnQgZGV2MCA9IGRldm1hc2sgJiAoMSA8PCAwKTsKKwl1bnNpZ25lZCBpbnQgZGV2MSA9IGRldm1hc2sgJiAoMSA8PCAxKTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwkvKiBpZiBkZXZpY2UgMCB3YXMgZm91bmQgaW4gYXRhX2RldmNoaywgd2FpdCBmb3IgaXRzCisJICogQlNZIGJpdCB0byBjbGVhcgorCSAqLworCWlmIChkZXYwKQorCQlhdGFfYnVzeV9zbGVlcChhcCwgQVRBX1RNT1VUX0JPT1RfUVVJQ0ssIEFUQV9UTU9VVF9CT09UKTsKKworCS8qIGlmIGRldmljZSAxIHdhcyBmb3VuZCBpbiBhdGFfZGV2Y2hrLCB3YWl0IGZvcgorCSAqIHJlZ2lzdGVyIGFjY2VzcywgdGhlbiB3YWl0IGZvciBCU1kgdG8gY2xlYXIKKwkgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIEFUQV9UTU9VVF9CT09UOworCXdoaWxlIChkZXYxKSB7CisJCXU4IG5zZWN0LCBsYmFsOworCisJCWFwLT5vcHMtPmRldl9zZWxlY3QoYXAsIDEpOworCQlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfTU1JTykgeworCQkJbnNlY3QgPSByZWFkYigodm9pZCBfX2lvbWVtICopIGlvYWRkci0+bnNlY3RfYWRkcik7CisJCQlsYmFsID0gcmVhZGIoKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPmxiYWxfYWRkcik7CisJCX0gZWxzZSB7CisJCQluc2VjdCA9IGluYihpb2FkZHItPm5zZWN0X2FkZHIpOworCQkJbGJhbCA9IGluYihpb2FkZHItPmxiYWxfYWRkcik7CisJCX0KKwkJaWYgKChuc2VjdCA9PSAxKSAmJiAobGJhbCA9PSAxKSkKKwkJCWJyZWFrOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJZGV2MSA9IDA7CisJCQlicmVhazsKKwkJfQorCQltc2xlZXAoNTApOwkvKiBnaXZlIGRyaXZlIGEgYnJlYXRoZXIgKi8KKwl9CisJaWYgKGRldjEpCisJCWF0YV9idXN5X3NsZWVwKGFwLCBBVEFfVE1PVVRfQk9PVF9RVUlDSywgQVRBX1RNT1VUX0JPT1QpOworCisJLyogaXMgYWxsIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8gKi8KKwlhcC0+b3BzLT5kZXZfc2VsZWN0KGFwLCAwKTsKKwlpZiAoZGV2MSkKKwkJYXAtPm9wcy0+ZGV2X3NlbGVjdChhcCwgMSk7CisJaWYgKGRldjApCisJCWFwLT5vcHMtPmRldl9zZWxlY3QoYXAsIDApOworfQorCisvKioKKyAqCWF0YV9idXNfZWRkIC0KKyAqCUBhcDoKKyAqCisgKglMT0NLSU5HOgorICoKKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGF0YV9idXNfZWRkKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IGF0YV90YXNrZmlsZSB0ZjsKKworCS8qIHNldCB1cCBleGVjdXRlLWRldmljZS1kaWFnIChidXMgcmVzZXQpIHRhc2tmaWxlICovCisJLyogYWxzbywgdGFrZSBpbnRlcnJ1cHRzIHRvIGEga25vd24gc3RhdGUgKGRpc2FibGVkKSAqLworCURQUklOVEsoImV4ZWN1dGUtZGV2aWNlLWRpYWdcbiIpOworCWF0YV90Zl9pbml0KGFwLCAmdGYsIDApOworCXRmLmN0bCB8PSBBVEFfTklFTjsKKwl0Zi5jb21tYW5kID0gQVRBX0NNRF9FREQ7CisJdGYucHJvdG9jb2wgPSBBVEFfUFJPVF9OT0RBVEE7CisKKwkvKiBkbyBidXMgcmVzZXQgKi8KKwlhdGFfdGZfdG9faG9zdChhcCwgJnRmKTsKKworCS8qIHNwZWMgc2F5cyBhdCBsZWFzdCAybXMuICBidXQgd2hvIGtub3dzIHdpdGggdGhvc2UKKwkgKiBjcmF6eSBBVEFQSSBkZXZpY2VzLi4uCisJICovCisJbXNsZWVwKDE1MCk7CisKKwlyZXR1cm4gYXRhX2J1c3lfc2xlZXAoYXAsIEFUQV9UTU9VVF9CT09UX1FVSUNLLCBBVEFfVE1PVVRfQk9PVCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX2J1c19zb2Z0cmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgZGV2bWFzaykKK3sKKwlzdHJ1Y3QgYXRhX2lvcG9ydHMgKmlvYWRkciA9ICZhcC0+aW9hZGRyOworCisJRFBSSU5USygiYXRhJXU6IGJ1cyByZXNldCB2aWEgU1JTVFxuIiwgYXAtPmlkKTsKKworCS8qIHNvZnR3YXJlIHJlc2V0LiAgY2F1c2VzIGRldjAgdG8gYmUgc2VsZWN0ZWQgKi8KKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfTU1JTykgeworCQl3cml0ZWIoYXAtPmN0bCwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPmN0bF9hZGRyKTsKKwkJdWRlbGF5KDIwKTsJLyogRklYTUU6IGZsdXNoICovCisJCXdyaXRlYihhcC0+Y3RsIHwgQVRBX1NSU1QsICh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5jdGxfYWRkcik7CisJCXVkZWxheSgyMCk7CS8qIEZJWE1FOiBmbHVzaCAqLworCQl3cml0ZWIoYXAtPmN0bCwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPmN0bF9hZGRyKTsKKwl9IGVsc2UgeworCQlvdXRiKGFwLT5jdGwsIGlvYWRkci0+Y3RsX2FkZHIpOworCQl1ZGVsYXkoMTApOworCQlvdXRiKGFwLT5jdGwgfCBBVEFfU1JTVCwgaW9hZGRyLT5jdGxfYWRkcik7CisJCXVkZWxheSgxMCk7CisJCW91dGIoYXAtPmN0bCwgaW9hZGRyLT5jdGxfYWRkcik7CisJfQorCisJLyogc3BlYyBtYW5kYXRlcyAiPj0gMm1zIiBiZWZvcmUgY2hlY2tpbmcgc3RhdHVzLgorCSAqIFdlIHdhaXQgMTUwbXMsIGJlY2F1c2UgdGhhdCB3YXMgdGhlIG1hZ2ljIGRlbGF5IHVzZWQgZm9yCisJICogQVRBUEkgZGV2aWNlcyBpbiBIYWxlIExhbmRpcydzIEFUQURSVlIsIGZvciB0aGUgcGVyaW9kIG9mIHRpbWUKKwkgKiBiZXR3ZWVuIHdoZW4gdGhlIEFUQSBjb21tYW5kIHJlZ2lzdGVyIGlzIHdyaXR0ZW4sIGFuZCB0aGVuCisJICogc3RhdHVzIGlzIGNoZWNrZWQuICBCZWNhdXNlIHdhaXRpbmcgZm9yICJhIHdoaWxlIiBiZWZvcmUKKwkgKiBjaGVja2luZyBzdGF0dXMgaXMgZmluZSwgcG9zdCBTUlNULCB3ZSBwZXJmb3JtIHRoaXMgbWFnaWMKKwkgKiBkZWxheSBoZXJlIGFzIHdlbGwuCisJICovCisJbXNsZWVwKDE1MCk7CisKKwlhdGFfYnVzX3Bvc3RfcmVzZXQoYXAsIGRldm1hc2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX2J1c19yZXNldCAtIHJlc2V0IGhvc3QgcG9ydCBhbmQgYXNzb2NpYXRlZCBBVEEgY2hhbm5lbAorICoJQGFwOiBwb3J0IHRvIHJlc2V0CisgKgorICoJVGhpcyBpcyB0eXBpY2FsbHkgdGhlIGZpcnN0IHRpbWUgd2UgYWN0dWFsbHkgc3RhcnQgaXNzdWluZworICoJY29tbWFuZHMgdG8gdGhlIEFUQSBjaGFubmVsLiAgV2Ugd2FpdCBmb3IgQlNZIHRvIGNsZWFyLCB0aGVuCisgKglpc3N1ZSBFWEVDVVRFIERFVklDRSBESUFHTk9TVElDIGNvbW1hbmQsIHBvbGxpbmcgZm9yIGl0cworICoJcmVzdWx0LiAgRGV0ZXJtaW5lIHdoYXQgZGV2aWNlcywgaWYgYW55LCBhcmUgb24gdGhlIGNoYW5uZWwKKyAqCWJ5IGxvb2tpbmcgYXQgdGhlIGRldmljZSAwLzEgZXJyb3IgcmVnaXN0ZXIuICBMb29rIGF0IHRoZSBzaWduYXR1cmUKKyAqCXN0b3JlZCBpbiBlYWNoIGRldmljZSdzIHRhc2tmaWxlIHJlZ2lzdGVycywgdG8gZGV0ZXJtaW5lIGlmCisgKgl0aGUgZGV2aWNlIGlzIEFUQSBvciBBVEFQSS4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gY2FsbGVyLiAgU29tZSBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRoaXMgZnVuY3Rpb24KKyAqCW9idGFpbiB0aGUgaG9zdF9zZXQgbG9jay4KKyAqCisgKglTSURFIEVGRkVDVFM6CisgKglTZXRzIEFUQV9GTEFHX1BPUlRfRElTQUJMRUQgaWYgYnVzIHJlc2V0IGZhaWxzLgorICovCisKK3ZvaWQgYXRhX2J1c19yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyID0gJmFwLT5pb2FkZHI7CisJdW5zaWduZWQgaW50IHNsYXZlX3Bvc3NpYmxlID0gYXAtPmZsYWdzICYgQVRBX0ZMQUdfU0xBVkVfUE9TUzsKKwl1OCBlcnI7CisJdW5zaWduZWQgaW50IGRldjAsIGRldjEgPSAwLCByYyA9IDAsIGRldm1hc2sgPSAwOworCisJRFBSSU5USygiRU5URVIsIGhvc3QgJXUsIHBvcnQgJXVcbiIsIGFwLT5pZCwgYXAtPnBvcnRfbm8pOworCisJLyogZGV0ZXJtaW5lIGlmIGRldmljZSAwLzEgYXJlIHByZXNlbnQgKi8KKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfU0FUQV9SRVNFVCkKKwkJZGV2MCA9IDE7CisJZWxzZSB7CisJCWRldjAgPSBhdGFfZGV2Y2hrKGFwLCAwKTsKKwkJaWYgKHNsYXZlX3Bvc3NpYmxlKQorCQkJZGV2MSA9IGF0YV9kZXZjaGsoYXAsIDEpOworCX0KKworCWlmIChkZXYwKQorCQlkZXZtYXNrIHw9ICgxIDw8IDApOworCWlmIChkZXYxKQorCQlkZXZtYXNrIHw9ICgxIDw8IDEpOworCisJLyogc2VsZWN0IGRldmljZSAwIGFnYWluICovCisJYXAtPm9wcy0+ZGV2X3NlbGVjdChhcCwgMCk7CisKKwkvKiBpc3N1ZSBidXMgcmVzZXQgKi8KKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfU1JTVCkKKwkJcmMgPSBhdGFfYnVzX3NvZnRyZXNldChhcCwgZGV2bWFzayk7CisJZWxzZSBpZiAoKGFwLT5mbGFncyAmIEFUQV9GTEFHX1NBVEFfUkVTRVQpID09IDApIHsKKwkJLyogc2V0IHVwIGRldmljZSBjb250cm9sICovCisJCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKQorCQkJd3JpdGViKGFwLT5jdGwsICh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5jdGxfYWRkcik7CisJCWVsc2UKKwkJCW91dGIoYXAtPmN0bCwgaW9hZGRyLT5jdGxfYWRkcik7CisJCXJjID0gYXRhX2J1c19lZGQoYXApOworCX0KKworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OworCisJLyoKKwkgKiBkZXRlcm1pbmUgYnkgc2lnbmF0dXJlIHdoZXRoZXIgd2UgaGF2ZSBBVEEgb3IgQVRBUEkgZGV2aWNlcworCSAqLworCWVyciA9IGF0YV9kZXZfdHJ5X2NsYXNzaWZ5KGFwLCAwKTsKKwlpZiAoKHNsYXZlX3Bvc3NpYmxlKSAmJiAoZXJyICE9IDB4ODEpKQorCQlhdGFfZGV2X3RyeV9jbGFzc2lmeShhcCwgMSk7CisKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyAqLworCWlmIChhcC0+aW9hZGRyLmN0bF9hZGRyKQkvKiBGSVhNRTogaGFjay4gY3JlYXRlIGEgaG9vayBpbnN0ZWFkICovCisJCWF0YV9pcnFfb24oYXApOworCisJLyogaXMgZG91YmxlLXNlbGVjdCByZWFsbHkgbmVjZXNzYXJ5PyAqLworCWlmIChhcC0+ZGV2aWNlWzFdLmNsYXNzICE9IEFUQV9ERVZfTk9ORSkKKwkJYXAtPm9wcy0+ZGV2X3NlbGVjdChhcCwgMSk7CisJaWYgKGFwLT5kZXZpY2VbMF0uY2xhc3MgIT0gQVRBX0RFVl9OT05FKQorCQlhcC0+b3BzLT5kZXZfc2VsZWN0KGFwLCAwKTsKKworCS8qIGlmIG5vIGRldmljZXMgd2VyZSBkZXRlY3RlZCwgZGlzYWJsZSB0aGlzIHBvcnQgKi8KKwlpZiAoKGFwLT5kZXZpY2VbMF0uY2xhc3MgPT0gQVRBX0RFVl9OT05FKSAmJgorCSAgICAoYXAtPmRldmljZVsxXS5jbGFzcyA9PSBBVEFfREVWX05PTkUpKQorCQlnb3RvIGVycl9vdXQ7CisKKwlpZiAoYXAtPmZsYWdzICYgKEFUQV9GTEFHX1NBVEFfUkVTRVQgfCBBVEFfRkxBR19TUlNUKSkgeworCQkvKiBzZXQgdXAgZGV2aWNlIGNvbnRyb2wgZm9yIEFUQV9GTEFHX1NBVEFfUkVTRVQgKi8KKwkJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX01NSU8pCisJCQl3cml0ZWIoYXAtPmN0bCwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPmN0bF9hZGRyKTsKKwkJZWxzZQorCQkJb3V0YihhcC0+Y3RsLCBpb2FkZHItPmN0bF9hZGRyKTsKKwl9CisKKwlEUFJJTlRLKCJFWElUXG4iKTsKKwlyZXR1cm47CisKK2Vycl9vdXQ6CisJcHJpbnRrKEtFUk5fRVJSICJhdGEldTogZGlzYWJsaW5nIHBvcnRcbiIsIGFwLT5pZCk7CisJYXAtPm9wcy0+cG9ydF9kaXNhYmxlKGFwKTsKKworCURQUklOVEsoIkVYSVRcbiIpOworfQorCitzdGF0aWMgdm9pZCBhdGFfcHJfYmxhY2tsaXN0ZWQoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmRldikKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICJhdGEldTogZGV2ICV1IGlzIG9uIERNQSBibGFja2xpc3QsIGRpc2FibGluZyBETUFcbiIsCisJCWFwLT5pZCwgZGV2LT5kZXZubyk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogYXRhX2RtYV9ibGFja2xpc3QgW10gPSB7CisJIldEQyBBQzExMDAwSCIsCisJIldEQyBBQzIyMTAwSCIsCisJIldEQyBBQzMyNTAwSCIsCisJIldEQyBBQzMzMTAwSCIsCisJIldEQyBBQzMxNjAwSCIsCisJIldEQyBBQzMyMTAwSCIsCisJIldEQyBBQzIzMjAwTCIsCisJIkNvbXBhcSBDUkQtODI0MUIiLAorCSJDUkQtODQwMEIiLAorCSJDUkQtODQ4MEIiLAorCSJDUkQtODQ4MkIiLAorIAkiQ1JELTg0IiwKKwkiU2FuRGlzayBTRFAzQiIsCisJIlNhbkRpc2sgU0RQM0ItNjQiLAorCSJTQU5ZTyBDRC1ST00gQ1JEIiwKKwkiSElUQUNISSBDRFItOCIsCisJIkhJVEFDSEkgQ0RSLTgzMzUiLAorCSJISVRBQ0hJIENEUi04NDM1IiwKKwkiVG9zaGliYSBDRC1ST00gWE0tNjIwMkIiLAorCSJDRC01MzJFLUEiLAorCSJFLUlERSBDRC1ST00gQ1ItODQwIiwKKwkiQ0QtUk9NIERyaXZlL0Y1QSIsCisJIldQSSBDREQtODIwIiwKKwkiU0FNU1VORyBDRC1ST00gU0MtMTQ4QyIsCisJIlNBTVNVTkcgQ0QtUk9NIFNDIiwKKwkiU2FuRGlzayBTRFAzQi02NCIsCisJIlNBTVNVTkcgQ0QtUk9NIFNOLTEyNCIsCisJIkFUQVBJIENELVJPTSBEUklWRSA0MFggTUFYSU1VTSIsCisJIl9ORUMgRFY1ODAwQSIsCit9OworCitzdGF0aWMgaW50IGF0YV9kbWFfYmxhY2tsaXN0ZWQoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBjaGFyIG1vZGVsX251bVs0MF07CisJY2hhciAqczsKKwl1bnNpZ25lZCBpbnQgbGVuOworCWludCBpOworCisJYXRhX2Rldl9pZF9zdHJpbmcoZGV2LT5pZCwgbW9kZWxfbnVtLCBBVEFfSURfUFJPRF9PRlMsCisJCQkgIHNpemVvZihtb2RlbF9udW0pKTsKKwlzID0gJm1vZGVsX251bVswXTsKKwlsZW4gPSBzdHJubGVuKHMsIHNpemVvZihtb2RlbF9udW0pKTsKKworCS8qIEFUQVBJIHNwZWNpZmllcyB0aGF0IGVtcHR5IHNwYWNlIGlzIGJsYW5rLWZpbGxlZDsgcmVtb3ZlIGJsYW5rcyAqLworCXdoaWxlICgobGVuID4gMCkgJiYgKHNbbGVuIC0gMV0gPT0gJyAnKSkgeworCQlsZW4tLTsKKwkJc1tsZW5dID0gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhdGFfZG1hX2JsYWNrbGlzdCk7IGkrKykKKwkJaWYgKCFzdHJuY21wKGF0YV9kbWFfYmxhY2tsaXN0W2ldLCBzLCBsZW4pKQorCQkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBhdGFfZ2V0X21vZGVfbWFzayhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBpbnQgc2hpZnQpCit7CisJc3RydWN0IGF0YV9kZXZpY2UgKm1hc3RlciwgKnNsYXZlOworCXVuc2lnbmVkIGludCBtYXNrOworCisJbWFzdGVyID0gJmFwLT5kZXZpY2VbMF07CisJc2xhdmUgPSAmYXAtPmRldmljZVsxXTsKKworCWFzc2VydCAoYXRhX2Rldl9wcmVzZW50KG1hc3RlcikgfHwgYXRhX2Rldl9wcmVzZW50KHNsYXZlKSk7CisKKwlpZiAoc2hpZnQgPT0gQVRBX1NISUZUX1VETUEpIHsKKwkJbWFzayA9IGFwLT51ZG1hX21hc2s7CisJCWlmIChhdGFfZGV2X3ByZXNlbnQobWFzdGVyKSkgeworCQkJbWFzayAmPSAobWFzdGVyLT5pZFtBVEFfSURfVURNQV9NT0RFU10gJiAweGZmKTsKKwkJCWlmIChhdGFfZG1hX2JsYWNrbGlzdGVkKGFwLCBtYXN0ZXIpKSB7CisJCQkJbWFzayA9IDA7CisJCQkJYXRhX3ByX2JsYWNrbGlzdGVkKGFwLCBtYXN0ZXIpOworCQkJfQorCQl9CisJCWlmIChhdGFfZGV2X3ByZXNlbnQoc2xhdmUpKSB7CisJCQltYXNrICY9IChzbGF2ZS0+aWRbQVRBX0lEX1VETUFfTU9ERVNdICYgMHhmZik7CisJCQlpZiAoYXRhX2RtYV9ibGFja2xpc3RlZChhcCwgc2xhdmUpKSB7CisJCQkJbWFzayA9IDA7CisJCQkJYXRhX3ByX2JsYWNrbGlzdGVkKGFwLCBzbGF2ZSk7CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZiAoc2hpZnQgPT0gQVRBX1NISUZUX01XRE1BKSB7CisJCW1hc2sgPSBhcC0+bXdkbWFfbWFzazsKKwkJaWYgKGF0YV9kZXZfcHJlc2VudChtYXN0ZXIpKSB7CisJCQltYXNrICY9IChtYXN0ZXItPmlkW0FUQV9JRF9NV0RNQV9NT0RFU10gJiAweDA3KTsKKwkJCWlmIChhdGFfZG1hX2JsYWNrbGlzdGVkKGFwLCBtYXN0ZXIpKSB7CisJCQkJbWFzayA9IDA7CisJCQkJYXRhX3ByX2JsYWNrbGlzdGVkKGFwLCBtYXN0ZXIpOworCQkJfQorCQl9CisJCWlmIChhdGFfZGV2X3ByZXNlbnQoc2xhdmUpKSB7CisJCQltYXNrICY9IChzbGF2ZS0+aWRbQVRBX0lEX01XRE1BX01PREVTXSAmIDB4MDcpOworCQkJaWYgKGF0YV9kbWFfYmxhY2tsaXN0ZWQoYXAsIHNsYXZlKSkgeworCQkJCW1hc2sgPSAwOworCQkJCWF0YV9wcl9ibGFja2xpc3RlZChhcCwgc2xhdmUpOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYgKHNoaWZ0ID09IEFUQV9TSElGVF9QSU8pIHsKKwkJbWFzayA9IGFwLT5waW9fbWFzazsKKwkJaWYgKGF0YV9kZXZfcHJlc2VudChtYXN0ZXIpKSB7CisJCQkvKiBzcGVjIGRvZXNuJ3QgcmV0dXJuIGV4cGxpY2l0IHN1cHBvcnQgZm9yCisJCQkgKiBQSU8wLTIsIHNvIHdlIGZha2UgaXQKKwkJCSAqLworCQkJdTE2IHRtcF9tb2RlID0gbWFzdGVyLT5pZFtBVEFfSURfUElPX01PREVTXSAmIDB4MDM7CisJCQl0bXBfbW9kZSA8PD0gMzsKKwkJCXRtcF9tb2RlIHw9IDB4NzsKKwkJCW1hc2sgJj0gdG1wX21vZGU7CisJCX0KKwkJaWYgKGF0YV9kZXZfcHJlc2VudChzbGF2ZSkpIHsKKwkJCS8qIHNwZWMgZG9lc24ndCByZXR1cm4gZXhwbGljaXQgc3VwcG9ydCBmb3IKKwkJCSAqIFBJTzAtMiwgc28gd2UgZmFrZSBpdAorCQkJICovCisJCQl1MTYgdG1wX21vZGUgPSBzbGF2ZS0+aWRbQVRBX0lEX1BJT19NT0RFU10gJiAweDAzOworCQkJdG1wX21vZGUgPDw9IDM7CisJCQl0bXBfbW9kZSB8PSAweDc7CisJCQltYXNrICY9IHRtcF9tb2RlOworCQl9CisJfQorCWVsc2UgeworCQltYXNrID0gMHhmZmZmZmZmZjsgLyogc2h1dCB1cCBjb21waWxlciB3YXJuaW5nICovCisJCUJVRygpOworCX0KKworCXJldHVybiBtYXNrOworfQorCisvKiBmaW5kIGdyZWF0ZXN0IGJpdCAqLworc3RhdGljIGludCBmZ2IodTMyIGJpdG1hcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgeCA9IC0xOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCWlmIChiaXRtYXAgJiAoMSA8PCBpKSkKKwkJCXggPSBpOworCisJcmV0dXJuIHg7Cit9CisKKy8qKgorICoJYXRhX2Nob29zZV94ZmVyX21vZGUgLSBhdHRlbXB0IHRvIGZpbmQgYmVzdCB0cmFuc2ZlciBtb2RlCisgKglAYXA6IFBvcnQgZm9yIHdoaWNoIGFuIHhmZXIgbW9kZSB3aWxsIGJlIHNlbGVjdGVkCisgKglAeGZlcl9tb2RlX291dDogKG91dHB1dCkgU0VUIEZFQVRVUkVTIC0gWEZFUiBNT0RFIGNvZGUKKyAqCUB4ZmVyX3NoaWZ0X291dDogKG91dHB1dCkgYml0IHNoaWZ0IHRoYXQgc2VsZWN0cyB0aGlzIG1vZGUKKyAqCisgKglMT0NLSU5HOgorICoKKyAqCVJFVFVSTlM6CisgKglaZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGVycm9yLgorICovCisKK3N0YXRpYyBpbnQgYXRhX2Nob29zZV94ZmVyX21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQl1OCAqeGZlcl9tb2RlX291dCwKKwkJCQl1bnNpZ25lZCBpbnQgKnhmZXJfc2hpZnRfb3V0KQoreworCXVuc2lnbmVkIGludCBtYXNrLCBzaGlmdDsKKwlpbnQgeCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHhmZXJfbW9kZV9jbGFzc2VzKTsgaSsrKSB7CisJCXNoaWZ0ID0geGZlcl9tb2RlX2NsYXNzZXNbaV0uc2hpZnQ7CisJCW1hc2sgPSBhdGFfZ2V0X21vZGVfbWFzayhhcCwgc2hpZnQpOworCisJCXggPSBmZ2IobWFzayk7CisJCWlmICh4ID49IDApIHsKKwkJCSp4ZmVyX21vZGVfb3V0ID0geGZlcl9tb2RlX2NsYXNzZXNbaV0uYmFzZSArIHg7CisJCQkqeGZlcl9zaGlmdF9vdXQgPSBzaGlmdDsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC0xOworfQorCisvKioKKyAqCWF0YV9kZXZfc2V0X3hmZXJtb2RlIC0gSXNzdWUgU0VUIEZFQVRVUkVTIC0gWEZFUiBNT0RFIGNvbW1hbmQKKyAqCUBhcDogUG9ydCBhc3NvY2lhdGVkIHdpdGggZGV2aWNlIEBkZXYKKyAqCUBkZXY6IERldmljZSB0byB3aGljaCBjb21tYW5kIHdpbGwgYmUgc2VudAorICoKKyAqCUxPQ0tJTkc6CisgKi8KKworc3RhdGljIHZvaWQgYXRhX2Rldl9zZXRfeGZlcm1vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmRldikKK3sKKwlERUNMQVJFX0NPTVBMRVRJT04od2FpdCk7CisJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIHNldCB1cCBzZXQtZmVhdHVyZXMgdGFza2ZpbGUgKi8KKwlEUFJJTlRLKCJzZXQgZmVhdHVyZXMgLSB4ZmVyIG1vZGVcbiIpOworCisJcWMgPSBhdGFfcWNfbmV3X2luaXQoYXAsIGRldik7CisJQlVHX09OKHFjID09IE5VTEwpOworCisJcWMtPnRmLmNvbW1hbmQgPSBBVEFfQ01EX1NFVF9GRUFUVVJFUzsKKwlxYy0+dGYuZmVhdHVyZSA9IFNFVEZFQVRVUkVTX1hGRVI7CisJcWMtPnRmLmZsYWdzIHw9IEFUQV9URkxBR19JU0FERFIgfCBBVEFfVEZMQUdfREVWSUNFOworCXFjLT50Zi5wcm90b2NvbCA9IEFUQV9QUk9UX05PREFUQTsKKwlxYy0+dGYubnNlY3QgPSBkZXYtPnhmZXJfbW9kZTsKKworCXFjLT53YWl0aW5nID0gJndhaXQ7CisJcWMtPmNvbXBsZXRlX2ZuID0gYXRhX3FjX2NvbXBsZXRlX25vb3A7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXAtPmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7CisJcmMgPSBhdGFfcWNfaXNzdWUocWMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwLT5ob3N0X3NldC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHJjKQorCQlhdGFfcG9ydF9kaXNhYmxlKGFwKTsKKwllbHNlCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOworCisJRFBSSU5USygiRVhJVFxuIik7Cit9CisKKy8qKgorICoJYXRhX3NnX2NsZWFuIC0KKyAqCUBxYzoKKyAqCisgKglMT0NLSU5HOgorICovCisKK3N0YXRpYyB2b2lkIGF0YV9zZ19jbGVhbihzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHFjLT5zZzsKKwlpbnQgZGlyID0gcWMtPmRtYV9kaXI7CisKKwlhc3NlcnQocWMtPmZsYWdzICYgQVRBX1FDRkxBR19ETUFNQVApOworCWFzc2VydChzZyAhPSBOVUxMKTsKKworCWlmIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX1NJTkdMRSkKKwkJYXNzZXJ0KHFjLT5uX2VsZW0gPT0gMSk7CisKKwlEUFJJTlRLKCJ1bm1hcHBpbmcgJXUgc2cgZWxlbWVudHNcbiIsIHFjLT5uX2VsZW0pOworCisJaWYgKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfU0cpCisJCWRtYV91bm1hcF9zZyhhcC0+aG9zdF9zZXQtPmRldiwgc2csIHFjLT5uX2VsZW0sIGRpcik7CisJZWxzZQorCQlkbWFfdW5tYXBfc2luZ2xlKGFwLT5ob3N0X3NldC0+ZGV2LCBzZ19kbWFfYWRkcmVzcygmc2dbMF0pLAorCQkJCSBzZ19kbWFfbGVuKCZzZ1swXSksIGRpcik7CisKKwlxYy0+ZmxhZ3MgJj0gfkFUQV9RQ0ZMQUdfRE1BTUFQOworCXFjLT5zZyA9IE5VTEw7Cit9CisKKy8qKgorICoJYXRhX2ZpbGxfc2cgLSBGaWxsIFBDSSBJREUgUFJEIHRhYmxlCisgKglAcWM6IE1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0YXNrZmlsZSB0byBiZSB0cmFuc2ZlcnJlZAorICoKKyAqCUxPQ0tJTkc6CisgKgorICovCitzdGF0aWMgdm9pZCBhdGFfZmlsbF9zZyhzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBxYy0+c2c7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwl1bnNpZ25lZCBpbnQgaWR4LCBuZWxlbTsKKworCWFzc2VydChzZyAhPSBOVUxMKTsKKwlhc3NlcnQocWMtPm5fZWxlbSA+IDApOworCisJaWR4ID0gMDsKKwlmb3IgKG5lbGVtID0gcWMtPm5fZWxlbTsgbmVsZW07IG5lbGVtLS0sc2crKykgeworCQl1MzIgYWRkciwgb2Zmc2V0OworCQl1MzIgc2dfbGVuLCBsZW47CisKKwkJLyogZGV0ZXJtaW5lIGlmIHBoeXNpY2FsIERNQSBhZGRyIHNwYW5zIDY0SyBib3VuZGFyeS4KKwkJICogTm90ZSBoL3cgZG9lc24ndCBzdXBwb3J0IDY0LWJpdCwgc28gd2UgdW5jb25kaXRpb25hbGx5CisJCSAqIHRydW5jYXRlIGRtYV9hZGRyX3QgdG8gdTMyLgorCQkgKi8KKwkJYWRkciA9ICh1MzIpIHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJc2dfbGVuID0gc2dfZG1hX2xlbihzZyk7CisKKwkJd2hpbGUgKHNnX2xlbikgeworCQkJb2Zmc2V0ID0gYWRkciAmIDB4ZmZmZjsKKwkJCWxlbiA9IHNnX2xlbjsKKwkJCWlmICgob2Zmc2V0ICsgc2dfbGVuKSA+IDB4MTAwMDApCisJCQkJbGVuID0gMHgxMDAwMCAtIG9mZnNldDsKKworCQkJYXAtPnByZFtpZHhdLmFkZHIgPSBjcHVfdG9fbGUzMihhZGRyKTsKKwkJCWFwLT5wcmRbaWR4XS5mbGFnc19sZW4gPSBjcHVfdG9fbGUzMihsZW4gJiAweGZmZmYpOworCQkJVlBSSU5USygiUFJEWyV1XSA9ICgweCVYLCAweCVYKVxuIiwgaWR4LCBhZGRyLCBsZW4pOworCisJCQlpZHgrKzsKKwkJCXNnX2xlbiAtPSBsZW47CisJCQlhZGRyICs9IGxlbjsKKwkJfQorCX0KKworCWlmIChpZHgpCisJCWFwLT5wcmRbaWR4IC0gMV0uZmxhZ3NfbGVuIHw9IGNwdV90b19sZTMyKEFUQV9QUkRfRU9UKTsKK30KKy8qKgorICoJYXRhX2NoZWNrX2F0YXBpX2RtYSAtIENoZWNrIHdoZXRoZXIgQVRBUEkgRE1BIGNhbiBiZSBzdXBwb3J0ZWQKKyAqCUBxYzogTWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRhc2tmaWxlIHRvIGNoZWNrCisgKgorICoJTE9DS0lORzoKKyAqCVJFVFVSTlM6IDAgd2hlbiBBVEFQSSBETUEgY2FuIGJlIHVzZWQKKyAqICAgICAgICAgICAgICAgbm9uemVybyBvdGhlcndpc2UKKyAqLworaW50IGF0YV9jaGVja19hdGFwaV9kbWEoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCWludCByYyA9IDA7IC8qIEFzc3VtZSBBVEFQSSBETUEgaXMgT0sgYnkgZGVmYXVsdCAqLworCisJaWYgKGFwLT5vcHMtPmNoZWNrX2F0YXBpX2RtYSkKKwkJcmMgPSBhcC0+b3BzLT5jaGVja19hdGFwaV9kbWEocWMpOworCisJcmV0dXJuIHJjOworfQorLyoqCisgKglhdGFfcWNfcHJlcCAtIFByZXBhcmUgdGFza2ZpbGUgZm9yIHN1Ym1pc3Npb24KKyAqCUBxYzogTWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRhc2tmaWxlIHRvIGJlIHByZXBhcmVkCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKi8KK3ZvaWQgYXRhX3FjX3ByZXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlpZiAoIShxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0RNQU1BUCkpCisJCXJldHVybjsKKworCWF0YV9maWxsX3NnKHFjKTsKK30KKwordm9pZCBhdGFfc2dfaW5pdF9vbmUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmbGVuKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisKKwlxYy0+ZmxhZ3MgfD0gQVRBX1FDRkxBR19TSU5HTEU7CisKKwltZW1zZXQoJnFjLT5zZ2VudCwgMCwgc2l6ZW9mKHFjLT5zZ2VudCkpOworCXFjLT5zZyA9ICZxYy0+c2dlbnQ7CisJcWMtPm5fZWxlbSA9IDE7CisJcWMtPmJ1Zl92aXJ0ID0gYnVmOworCisJc2cgPSBxYy0+c2c7CisJc2ctPnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoYnVmKTsKKwlzZy0+b2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpIGJ1ZiAmIH5QQUdFX01BU0s7CisJc2dfZG1hX2xlbihzZykgPSBidWZsZW47Cit9CisKK3ZvaWQgYXRhX3NnX2luaXQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJIHVuc2lnbmVkIGludCBuX2VsZW0pCit7CisJcWMtPmZsYWdzIHw9IEFUQV9RQ0ZMQUdfU0c7CisJcWMtPnNnID0gc2c7CisJcWMtPm5fZWxlbSA9IG5fZWxlbTsKK30KKworLyoqCisgKglhdGFfc2dfc2V0dXBfb25lIC0KKyAqCUBxYzoKKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqCisgKglSRVRVUk5TOgorICoKKyAqLworCitzdGF0aWMgaW50IGF0YV9zZ19zZXR1cF9vbmUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCWludCBkaXIgPSBxYy0+ZG1hX2RpcjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gcWMtPnNnOworCWRtYV9hZGRyX3QgZG1hX2FkZHJlc3M7CisKKwlkbWFfYWRkcmVzcyA9IGRtYV9tYXBfc2luZ2xlKGFwLT5ob3N0X3NldC0+ZGV2LCBxYy0+YnVmX3ZpcnQsCisJCQkJICAgICBzZ19kbWFfbGVuKHNnKSwgZGlyKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZG1hX2FkZHJlc3MpKQorCQlyZXR1cm4gLTE7CisKKwlzZ19kbWFfYWRkcmVzcyhzZykgPSBkbWFfYWRkcmVzczsKKworCURQUklOVEsoIm1hcHBlZCBidWZmZXIgb2YgJWQgYnl0ZXMgZm9yICVzXG4iLCBzZ19kbWFfbGVuKHNnKSwKKwkJcWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFID8gIndyaXRlIiA6ICJyZWFkIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhdGFfc2dfc2V0dXAgLQorICoJQHFjOgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICoKKyAqCVJFVFVSTlM6CisgKgorICovCisKK3N0YXRpYyBpbnQgYXRhX3NnX3NldHVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gcWMtPnNnOworCWludCBuX2VsZW0sIGRpcjsKKworCVZQUklOVEsoIkVOVEVSLCBhdGEldVxuIiwgYXAtPmlkKTsKKwlhc3NlcnQocWMtPmZsYWdzICYgQVRBX1FDRkxBR19TRyk7CisKKwlkaXIgPSBxYy0+ZG1hX2RpcjsKKwluX2VsZW0gPSBkbWFfbWFwX3NnKGFwLT5ob3N0X3NldC0+ZGV2LCBzZywgcWMtPm5fZWxlbSwgZGlyKTsKKwlpZiAobl9lbGVtIDwgMSkKKwkJcmV0dXJuIC0xOworCisJRFBSSU5USygiJWQgc2cgZWxlbWVudHMgbWFwcGVkXG4iLCBuX2VsZW0pOworCisJcWMtPm5fZWxlbSA9IG5fZWxlbTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCWF0YV9waW9fcG9sbCAtCisgKglAYXA6CisgKgorICoJTE9DS0lORzoKKyAqCisgKglSRVRVUk5TOgorICoKKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhdGFfcGlvX3BvbGwoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl1OCBzdGF0dXM7CisJdW5zaWduZWQgaW50IHBvbGxfc3RhdGUgPSBQSU9fU1RfVU5LTk9XTjsKKwl1bnNpZ25lZCBpbnQgcmVnX3N0YXRlID0gUElPX1NUX1VOS05PV047CisJY29uc3QgdW5zaWduZWQgaW50IHRtb3V0X3N0YXRlID0gUElPX1NUX1RNT1VUOworCisJc3dpdGNoIChhcC0+cGlvX3Rhc2tfc3RhdGUpIHsKKwljYXNlIFBJT19TVDoKKwljYXNlIFBJT19TVF9QT0xMOgorCQlwb2xsX3N0YXRlID0gUElPX1NUX1BPTEw7CisJCXJlZ19zdGF0ZSA9IFBJT19TVDsKKwkJYnJlYWs7CisJY2FzZSBQSU9fU1RfTEFTVDoKKwljYXNlIFBJT19TVF9MQVNUX1BPTEw6CisJCXBvbGxfc3RhdGUgPSBQSU9fU1RfTEFTVF9QT0xMOworCQlyZWdfc3RhdGUgPSBQSU9fU1RfTEFTVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKworCXN0YXR1cyA9IGF0YV9jaGtfc3RhdHVzKGFwKTsKKwlpZiAoc3RhdHVzICYgQVRBX0JVU1kpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgYXAtPnBpb190YXNrX3RpbWVvdXQpKSB7CisJCQlhcC0+cGlvX3Rhc2tfc3RhdGUgPSB0bW91dF9zdGF0ZTsKKwkJCXJldHVybiAwOworCQl9CisJCWFwLT5waW9fdGFza19zdGF0ZSA9IHBvbGxfc3RhdGU7CisJCXJldHVybiBBVEFfU0hPUlRfUEFVU0U7CisJfQorCisJYXAtPnBpb190YXNrX3N0YXRlID0gcmVnX3N0YXRlOworCXJldHVybiAwOworfQorCisvKioKKyAqCWF0YV9waW9fY29tcGxldGUgLQorICoJQGFwOgorICoKKyAqCUxPQ0tJTkc6CisgKi8KKworc3RhdGljIHZvaWQgYXRhX3Bpb19jb21wbGV0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCXU4IGRydl9zdGF0OworCisJLyoKKwkgKiBUaGlzIGlzIHB1cmVseSBodWVyaXN0aWMuICBUaGlzIGlzIGEgZmFzdCBwYXRoLgorCSAqIFNvbWV0aW1lcyB3aGVuIHdlIGVudGVyLCBCU1kgd2lsbCBiZSBjbGVhcmVkIGluCisJICogYSBjaGstc3RhdHVzIG9yIHR3by4gIElmIG5vdCwgdGhlIGRyaXZlIGlzIHByb2JhYmx5IHNlZWtpbmcKKwkgKiBvciBzb21ldGhpbmcuICBTbm9vemUgZm9yIGEgY291cGxlIG1zZWNzLCB0aGVuCisJICogY2hrLXN0YXR1cyBhZ2Fpbi4gIElmIHN0aWxsIGJ1c3ksIGZhbGwgYmFjayB0bworCSAqIFBJT19TVF9QT0xMIHN0YXRlLgorCSAqLworCWRydl9zdGF0ID0gYXRhX2J1c3lfd2FpdChhcCwgQVRBX0JVU1kgfCBBVEFfRFJRLCAxMCk7CisJaWYgKGRydl9zdGF0ICYgKEFUQV9CVVNZIHwgQVRBX0RSUSkpIHsKKwkJbXNsZWVwKDIpOworCQlkcnZfc3RhdCA9IGF0YV9idXN5X3dhaXQoYXAsIEFUQV9CVVNZIHwgQVRBX0RSUSwgMTApOworCQlpZiAoZHJ2X3N0YXQgJiAoQVRBX0JVU1kgfCBBVEFfRFJRKSkgeworCQkJYXAtPnBpb190YXNrX3N0YXRlID0gUElPX1NUX0xBU1RfUE9MTDsKKwkJCWFwLT5waW9fdGFza190aW1lb3V0ID0gamlmZmllcyArIEFUQV9UTU9VVF9QSU87CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlkcnZfc3RhdCA9IGF0YV93YWl0X2lkbGUoYXApOworCWlmICghYXRhX29rKGRydl9zdGF0KSkgeworCQlhcC0+cGlvX3Rhc2tfc3RhdGUgPSBQSU9fU1RfRVJSOworCQlyZXR1cm47CisJfQorCisJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKKwlhc3NlcnQocWMgIT0gTlVMTCk7CisKKwlhcC0+cGlvX3Rhc2tfc3RhdGUgPSBQSU9fU1RfSURMRTsKKworCWF0YV9pcnFfb24oYXApOworCisJYXRhX3FjX2NvbXBsZXRlKHFjLCBkcnZfc3RhdCk7Cit9CisKK3ZvaWQgc3dhcF9idWZfbGUxNih1MTYgKmJ1ZiwgdW5zaWduZWQgaW50IGJ1Zl93b3JkcykKK3sKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBidWZfd29yZHM7IGkrKykKKwkJYnVmW2ldID0gbGUxNl90b19jcHUoYnVmW2ldKTsKKyNlbmRpZiAvKiBfX0JJR19FTkRJQU4gKi8KK30KKworc3RhdGljIHZvaWQgYXRhX21taW9fZGF0YV94ZmVyKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgYnVmbGVuLCBpbnQgd3JpdGVfZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgd29yZHMgPSBidWZsZW4gPj4gMTsKKwl1MTYgKmJ1ZjE2ID0gKHUxNiAqKSBidWY7CisJdm9pZCBfX2lvbWVtICptbWlvID0gKHZvaWQgX19pb21lbSAqKWFwLT5pb2FkZHIuZGF0YV9hZGRyOworCisJaWYgKHdyaXRlX2RhdGEpIHsKKwkJZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspCisJCQl3cml0ZXcobGUxNl90b19jcHUoYnVmMTZbaV0pLCBtbWlvKTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykKKwkJCWJ1ZjE2W2ldID0gY3B1X3RvX2xlMTYocmVhZHcobW1pbykpOworCX0KK30KKworc3RhdGljIHZvaWQgYXRhX3Bpb19kYXRhX3hmZXIoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJICAgICAgdW5zaWduZWQgaW50IGJ1ZmxlbiwgaW50IHdyaXRlX2RhdGEpCit7CisJdW5zaWduZWQgaW50IGR3b3JkcyA9IGJ1ZmxlbiA+PiAxOworCisJaWYgKHdyaXRlX2RhdGEpCisJCW91dHN3KGFwLT5pb2FkZHIuZGF0YV9hZGRyLCBidWYsIGR3b3Jkcyk7CisJZWxzZQorCQlpbnN3KGFwLT5pb2FkZHIuZGF0YV9hZGRyLCBidWYsIGR3b3Jkcyk7Cit9CisKK3N0YXRpYyB2b2lkIGF0YV9kYXRhX3hmZXIoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJICB1bnNpZ25lZCBpbnQgYnVmbGVuLCBpbnQgZG9fd3JpdGUpCit7CisJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX01NSU8pCisJCWF0YV9tbWlvX2RhdGFfeGZlcihhcCwgYnVmLCBidWZsZW4sIGRvX3dyaXRlKTsKKwllbHNlCisJCWF0YV9waW9fZGF0YV94ZmVyKGFwLCBidWYsIGJ1ZmxlbiwgZG9fd3JpdGUpOworfQorCitzdGF0aWMgdm9pZCBhdGFfcGlvX3NlY3RvcihzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCWludCBkb193cml0ZSA9IChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBxYy0+c2c7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworCWlmIChxYy0+Y3Vyc2VjdCA9PSAocWMtPm5zZWN0IC0gMSkpCisJCWFwLT5waW9fdGFza19zdGF0ZSA9IFBJT19TVF9MQVNUOworCisJcGFnZSA9IHNnW3FjLT5jdXJzZ10ucGFnZTsKKwlvZmZzZXQgPSBzZ1txYy0+Y3Vyc2ddLm9mZnNldCArIHFjLT5jdXJzZ19vZnMgKiBBVEFfU0VDVF9TSVpFOworCisJLyogZ2V0IHRoZSBjdXJyZW50IHBhZ2UgYW5kIG9mZnNldCAqLworCXBhZ2UgPSBudGhfcGFnZShwYWdlLCAob2Zmc2V0ID4+IFBBR0VfU0hJRlQpKTsKKwlvZmZzZXQgJT0gUEFHRV9TSVpFOworCisJYnVmID0ga21hcChwYWdlKSArIG9mZnNldDsKKworCXFjLT5jdXJzZWN0Kys7CisJcWMtPmN1cnNnX29mcysrOworCisJaWYgKChxYy0+Y3Vyc2dfb2ZzICogQVRBX1NFQ1RfU0laRSkgPT0gc2dfZG1hX2xlbigmc2dbcWMtPmN1cnNnXSkpIHsKKwkJcWMtPmN1cnNnKys7CisJCXFjLT5jdXJzZ19vZnMgPSAwOworCX0KKworCURQUklOVEsoImRhdGEgJXNcbiIsIHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSA/ICJ3cml0ZSIgOiAicmVhZCIpOworCisJLyogZG8gdGhlIGFjdHVhbCBkYXRhIHRyYW5zZmVyICovCisJZG9fd3JpdGUgPSAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFKTsKKwlhdGFfZGF0YV94ZmVyKGFwLCBidWYsIEFUQV9TRUNUX1NJWkUsIGRvX3dyaXRlKTsKKworCWt1bm1hcChwYWdlKTsKK30KKworc3RhdGljIHZvaWQgX19hdGFwaV9waW9fYnl0ZXMoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywgdW5zaWduZWQgaW50IGJ5dGVzKQoreworCWludCBkb193cml0ZSA9IChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBxYy0+c2c7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdW5zaWduZWQgaW50IG9mZnNldCwgY291bnQ7CisKKwlpZiAocWMtPmN1cmJ5dGVzID09IHFjLT5uYnl0ZXMgLSBieXRlcykKKwkJYXAtPnBpb190YXNrX3N0YXRlID0gUElPX1NUX0xBU1Q7CisKK25leHRfc2c6CisJc2cgPSAmcWMtPnNnW3FjLT5jdXJzZ107CisKK25leHRfcGFnZToKKwlwYWdlID0gc2ctPnBhZ2U7CisJb2Zmc2V0ID0gc2ctPm9mZnNldCArIHFjLT5jdXJzZ19vZnM7CisKKwkvKiBnZXQgdGhlIGN1cnJlbnQgcGFnZSBhbmQgb2Zmc2V0ICovCisJcGFnZSA9IG50aF9wYWdlKHBhZ2UsIChvZmZzZXQgPj4gUEFHRV9TSElGVCkpOworCW9mZnNldCAlPSBQQUdFX1NJWkU7CisKKwljb3VudCA9IG1pbihzZ19kbWFfbGVuKHNnKSAtIHFjLT5jdXJzZ19vZnMsIGJ5dGVzKTsKKworCS8qIGRvbid0IGNyb3NzIHBhZ2UgYm91bmRhcmllcyAqLworCWNvdW50ID0gbWluKGNvdW50LCAodW5zaWduZWQgaW50KVBBR0VfU0laRSAtIG9mZnNldCk7CisKKwlidWYgPSBrbWFwKHBhZ2UpICsgb2Zmc2V0OworCisJYnl0ZXMgLT0gY291bnQ7CisJcWMtPmN1cmJ5dGVzICs9IGNvdW50OworCXFjLT5jdXJzZ19vZnMgKz0gY291bnQ7CisKKwlpZiAocWMtPmN1cnNnX29mcyA9PSBzZ19kbWFfbGVuKHNnKSkgeworCQlxYy0+Y3Vyc2crKzsKKwkJcWMtPmN1cnNnX29mcyA9IDA7CisJfQorCisJRFBSSU5USygiZGF0YSAlc1xuIiwgcWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFID8gIndyaXRlIiA6ICJyZWFkIik7CisKKwkvKiBkbyB0aGUgYWN0dWFsIGRhdGEgdHJhbnNmZXIgKi8KKwlhdGFfZGF0YV94ZmVyKGFwLCBidWYsIGNvdW50LCBkb193cml0ZSk7CisKKwlrdW5tYXAocGFnZSk7CisKKwlpZiAoYnl0ZXMpIHsKKwkJaWYgKHFjLT5jdXJzZ19vZnMgPCBzZ19kbWFfbGVuKHNnKSkKKwkJCWdvdG8gbmV4dF9wYWdlOworCQlnb3RvIG5leHRfc2c7CisJfQorfQorCitzdGF0aWMgdm9pZCBhdGFwaV9waW9fYnl0ZXMoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSBxYy0+ZGV2OworCXVuc2lnbmVkIGludCBpcmVhc29uLCBiY19sbywgYmNfaGksIGJ5dGVzOworCWludCBpX3dyaXRlLCBkb193cml0ZSA9IChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpID8gMSA6IDA7CisKKwlhcC0+b3BzLT50Zl9yZWFkKGFwLCAmcWMtPnRmKTsKKwlpcmVhc29uID0gcWMtPnRmLm5zZWN0OworCWJjX2xvID0gcWMtPnRmLmxiYW07CisJYmNfaGkgPSBxYy0+dGYubGJhaDsKKwlieXRlcyA9IChiY19oaSA8PCA4KSB8IGJjX2xvOworCisJLyogc2hhbGwgYmUgY2xlYXJlZCB0byB6ZXJvLCBpbmRpY2F0aW5nIHhmZXIgb2YgZGF0YSAqLworCWlmIChpcmVhc29uICYgKDEgPDwgMCkpCisJCWdvdG8gZXJyX291dDsKKworCS8qIG1ha2Ugc3VyZSB0cmFuc2ZlciBkaXJlY3Rpb24gbWF0Y2hlcyBleHBlY3RlZCAqLworCWlfd3JpdGUgPSAoKGlyZWFzb24gJiAoMSA8PCAxKSkgPT0gMCkgPyAxIDogMDsKKwlpZiAoZG9fd3JpdGUgIT0gaV93cml0ZSkKKwkJZ290byBlcnJfb3V0OworCisJX19hdGFwaV9waW9fYnl0ZXMocWMsIGJ5dGVzKTsKKworCXJldHVybjsKKworZXJyX291dDoKKwlwcmludGsoS0VSTl9JTkZPICJhdGEldTogZGV2ICV1OiBBVEFQSSBjaGVjayBmYWlsZWRcbiIsCisJICAgICAgYXAtPmlkLCBkZXYtPmRldm5vKTsKKwlhcC0+cGlvX3Rhc2tfc3RhdGUgPSBQSU9fU1RfRVJSOworfQorCisvKioKKyAqCWF0YV9waW9fc2VjdG9yIC0KKyAqCUBhcDoKKyAqCisgKglMT0NLSU5HOgorICovCisKK3N0YXRpYyB2b2lkIGF0YV9waW9fYmxvY2soc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCXU4IHN0YXR1czsKKworCS8qCisJICogVGhpcyBpcyBwdXJlbHkgaHVlcmlzdGljLiAgVGhpcyBpcyBhIGZhc3QgcGF0aC4KKwkgKiBTb21ldGltZXMgd2hlbiB3ZSBlbnRlciwgQlNZIHdpbGwgYmUgY2xlYXJlZCBpbgorCSAqIGEgY2hrLXN0YXR1cyBvciB0d28uICBJZiBub3QsIHRoZSBkcml2ZSBpcyBwcm9iYWJseSBzZWVraW5nCisJICogb3Igc29tZXRoaW5nLiAgU25vb3plIGZvciBhIGNvdXBsZSBtc2VjcywgdGhlbgorCSAqIGNoay1zdGF0dXMgYWdhaW4uICBJZiBzdGlsbCBidXN5LCBmYWxsIGJhY2sgdG8KKwkgKiBQSU9fU1RfUE9MTCBzdGF0ZS4KKwkgKi8KKwlzdGF0dXMgPSBhdGFfYnVzeV93YWl0KGFwLCBBVEFfQlVTWSwgNSk7CisJaWYgKHN0YXR1cyAmIEFUQV9CVVNZKSB7CisJCW1zbGVlcCgyKTsKKwkJc3RhdHVzID0gYXRhX2J1c3lfd2FpdChhcCwgQVRBX0JVU1ksIDEwKTsKKwkJaWYgKHN0YXR1cyAmIEFUQV9CVVNZKSB7CisJCQlhcC0+cGlvX3Rhc2tfc3RhdGUgPSBQSU9fU1RfUE9MTDsKKwkJCWFwLT5waW9fdGFza190aW1lb3V0ID0gamlmZmllcyArIEFUQV9UTU9VVF9QSU87CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOworCWFzc2VydChxYyAhPSBOVUxMKTsKKworCWlmIChpc19hdGFwaV90YXNrZmlsZSgmcWMtPnRmKSkgeworCQkvKiBubyBtb3JlIGRhdGEgdG8gdHJhbnNmZXIgb3IgdW5zdXBwb3J0ZWQgQVRBUEkgY29tbWFuZCAqLworCQlpZiAoKHN0YXR1cyAmIEFUQV9EUlEpID09IDApIHsKKwkJCWFwLT5waW9fdGFza19zdGF0ZSA9IFBJT19TVF9JRExFOworCisJCQlhdGFfaXJxX29uKGFwKTsKKworCQkJYXRhX3FjX2NvbXBsZXRlKHFjLCBzdGF0dXMpOworCQkJcmV0dXJuOworCQl9CisKKwkJYXRhcGlfcGlvX2J5dGVzKHFjKTsKKwl9IGVsc2UgeworCQkvKiBoYW5kbGUgQlNZPTAsIERSUT0wIGFzIGVycm9yICovCisJCWlmICgoc3RhdHVzICYgQVRBX0RSUSkgPT0gMCkgeworCQkJYXAtPnBpb190YXNrX3N0YXRlID0gUElPX1NUX0VSUjsKKwkJCXJldHVybjsKKwkJfQorCisJCWF0YV9waW9fc2VjdG9yKHFjKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF0YV9waW9fZXJyb3Ioc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCXU4IGRydl9zdGF0OworCisJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKKwlhc3NlcnQocWMgIT0gTlVMTCk7CisKKwlkcnZfc3RhdCA9IGF0YV9jaGtfc3RhdHVzKGFwKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJhdGEldTogUElPIGVycm9yLCBkcnZfc3RhdCAweCV4XG4iLAorCSAgICAgICBhcC0+aWQsIGRydl9zdGF0KTsKKworCWFwLT5waW9fdGFza19zdGF0ZSA9IFBJT19TVF9JRExFOworCisJYXRhX2lycV9vbihhcCk7CisKKwlhdGFfcWNfY29tcGxldGUocWMsIGRydl9zdGF0IHwgQVRBX0VSUik7Cit9CisKK3N0YXRpYyB2b2lkIGF0YV9waW9fdGFzayh2b2lkICpfZGF0YSkKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gX2RhdGE7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gMDsKKworCXN3aXRjaCAoYXAtPnBpb190YXNrX3N0YXRlKSB7CisJY2FzZSBQSU9fU1RfSURMRToKKwkJcmV0dXJuOworCisJY2FzZSBQSU9fU1Q6CisJCWF0YV9waW9fYmxvY2soYXApOworCQlicmVhazsKKworCWNhc2UgUElPX1NUX0xBU1Q6CisJCWF0YV9waW9fY29tcGxldGUoYXApOworCQlicmVhazsKKworCWNhc2UgUElPX1NUX1BPTEw6CisJY2FzZSBQSU9fU1RfTEFTVF9QT0xMOgorCQl0aW1lb3V0ID0gYXRhX3Bpb19wb2xsKGFwKTsKKwkJYnJlYWs7CisKKwljYXNlIFBJT19TVF9UTU9VVDoKKwljYXNlIFBJT19TVF9FUlI6CisJCWF0YV9waW9fZXJyb3IoYXApOworCQlyZXR1cm47CisJfQorCisJaWYgKHRpbWVvdXQpCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhhdGFfd3EsICZhcC0+cGlvX3Rhc2ssCisJCQkJICAgdGltZW91dCk7CisJZWxzZQorCQlxdWV1ZV93b3JrKGF0YV93cSwgJmFwLT5waW9fdGFzayk7Cit9CisKK3N0YXRpYyB2b2lkIGF0YXBpX3JlcXVlc3Rfc2Vuc2Uoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJREVDTEFSRV9DT01QTEVUSU9OKHdhaXQpOworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlEUFJJTlRLKCJBVEFQSSByZXF1ZXN0IHNlbnNlXG4iKTsKKworCXFjID0gYXRhX3FjX25ld19pbml0KGFwLCBkZXYpOworCUJVR19PTihxYyA9PSBOVUxMKTsKKworCS8qIEZJWE1FOiBpcyB0aGlzIG5lZWRlZD8gKi8KKwltZW1zZXQoY21kLT5zZW5zZV9idWZmZXIsIDAsIHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpOworCisJYXRhX3NnX2luaXRfb25lKHFjLCBjbWQtPnNlbnNlX2J1ZmZlciwgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisJcWMtPmRtYV9kaXIgPSBETUFfRlJPTV9ERVZJQ0U7CisKKwltZW1zZXQoJnFjLT5jZGIsIDAsIHNpemVvZihhcC0+Y2RiX2xlbikpOworCXFjLT5jZGJbMF0gPSBSRVFVRVNUX1NFTlNFOworCXFjLT5jZGJbNF0gPSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkU7CisKKwlxYy0+dGYuZmxhZ3MgfD0gQVRBX1RGTEFHX0lTQUREUiB8IEFUQV9URkxBR19ERVZJQ0U7CisJcWMtPnRmLmNvbW1hbmQgPSBBVEFfQ01EX1BBQ0tFVDsKKworCXFjLT50Zi5wcm90b2NvbCA9IEFUQV9QUk9UX0FUQVBJOworCXFjLT50Zi5sYmFtID0gKDggKiAxMDI0KSAmIDB4ZmY7CisJcWMtPnRmLmxiYWggPSAoOCAqIDEwMjQpID4+IDg7CisJcWMtPm5ieXRlcyA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKKworCXFjLT53YWl0aW5nID0gJndhaXQ7CisJcWMtPmNvbXBsZXRlX2ZuID0gYXRhX3FjX2NvbXBsZXRlX25vb3A7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXAtPmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7CisJcmMgPSBhdGFfcWNfaXNzdWUocWMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwLT5ob3N0X3NldC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHJjKQorCQlhdGFfcG9ydF9kaXNhYmxlKGFwKTsKKwllbHNlCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOworCisJRFBSSU5USygiRVhJVFxuIik7Cit9CisKKy8qKgorICoJYXRhX3FjX3RpbWVvdXQgLSBIYW5kbGUgdGltZW91dCBvZiBxdWV1ZWQgY29tbWFuZAorICoJQHFjOiBDb21tYW5kIHRoYXQgdGltZWQgb3V0CisgKgorICoJU29tZSBwYXJ0IG9mIHRoZSBrZXJuZWwgKGN1cnJlbnRseSwgb25seSB0aGUgU0NTSSBsYXllcikKKyAqCWhhcyBub3RpY2VkIHRoYXQgdGhlIGFjdGl2ZSBjb21tYW5kIG9uIHBvcnQgQGFwIGhhcyBub3QKKyAqCWNvbXBsZXRlZCBhZnRlciBhIHNwZWNpZmllZCBsZW5ndGggb2YgdGltZS4gIEhhbmRsZSB0aGlzCisgKgljb25kaXRpb24gYnkgZGlzYWJsaW5nIERNQSAoaWYgbmVjZXNzYXJ5KSBhbmQgY29tcGxldGluZworICoJdHJhbnNhY3Rpb25zLCB3aXRoIGVycm9yIGlmIG5lY2Vzc2FyeS4KKyAqCisgKglUaGlzIGFsc28gaGFuZGxlcyB0aGUgY2FzZSBvZiB0aGUgImxvc3QgaW50ZXJydXB0Iiwgd2hlcmUKKyAqCWZvciBzb21lIHJlYXNvbiAocG9zc2libHkgaGFyZHdhcmUgYnVnLCBwb3NzaWJseSBkcml2ZXIgYnVnKQorICoJYW4gaW50ZXJydXB0IHdhcyBub3QgZGVsaXZlcmVkIHRvIHRoZSBkcml2ZXIsIGV2ZW4gdGhvdWdoIHRoZQorICoJdHJhbnNhY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAqCisgKglMT0NLSU5HOgorICovCisKK3N0YXRpYyB2b2lkIGF0YV9xY190aW1lb3V0KHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gcWMtPmRldjsKKwl1OCBob3N0X3N0YXQgPSAwLCBkcnZfc3RhdDsKKworCURQUklOVEsoIkVOVEVSXG4iKTsKKworCS8qIEZJWE1FOiBkb2Vzbid0IHRoaXMgY29uZmxpY3Qgd2l0aCB0aW1lb3V0IGhhbmRsaW5nPyAqLworCWlmIChxYy0+ZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQVBJICYmIHFjLT5zY3NpY21kKSB7CisJCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHFjLT5zY3NpY21kOworCisJCWlmICghc2NzaV9laF9lZmxhZ3NfY2hrKGNtZCwgU0NTSV9FSF9DQU5DRUxfQ01EKSkgeworCisJCQkvKiBmaW5pc2ggY29tcGxldGluZyBvcmlnaW5hbCBjb21tYW5kICovCisJCQlfX2F0YV9xY19jb21wbGV0ZShxYyk7CisKKwkJCWF0YXBpX3JlcXVlc3Rfc2Vuc2UoYXAsIGRldiwgY21kKTsKKworCQkJY21kLT5yZXN1bHQgPSAoQ0hFQ0tfQ09ORElUSU9OIDw8IDEpIHwgKERJRF9PSyA8PCAxNik7CisJCQlzY3NpX2ZpbmlzaF9jb21tYW5kKGNtZCk7CisKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogaGFjayBhbGVydCEgIFdlIGNhbm5vdCB1c2UgdGhlIHN1cHBsaWVkIGNvbXBsZXRpb24KKwkgKiBmdW5jdGlvbiBmcm9tIGluc2lkZSB0aGUgLT5laF9zdHJhdGVneV9oYW5kbGVyKCkgdGhyZWFkLgorCSAqIGxpYmF0YSBpcyB0aGUgb25seSB1c2VyIG9mIC0+ZWhfc3RyYXRlZ3lfaGFuZGxlcigpIGluCisJICogYW55IGtlcm5lbCwgc28gdGhlIGRlZmF1bHQgc2NzaV9kb25lKCkgYXNzdW1lcyBpdCBpcworCSAqIG5vdCBiZWluZyBjYWxsZWQgZnJvbSB0aGUgU0NTSSBFSC4KKwkgKi8KKwlxYy0+c2NzaWRvbmUgPSBzY3NpX2ZpbmlzaF9jb21tYW5kOworCisJc3dpdGNoIChxYy0+dGYucHJvdG9jb2wpIHsKKworCWNhc2UgQVRBX1BST1RfRE1BOgorCWNhc2UgQVRBX1BST1RfQVRBUElfRE1BOgorCQlob3N0X3N0YXQgPSBhcC0+b3BzLT5ibWRtYV9zdGF0dXMoYXApOworCisJCS8qIGJlZm9yZSB3ZSBkbyBhbnl0aGluZyBlbHNlLCBjbGVhciBETUEtU3RhcnQgYml0ICovCisJCWFwLT5vcHMtPmJtZG1hX3N0b3AoYXApOworCisJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJZGVmYXVsdDoKKwkJYXRhX2FsdHN0YXR1cyhhcCk7CisJCWRydl9zdGF0ID0gYXRhX2Noa19zdGF0dXMoYXApOworCisJCS8qIGFjayBibWRtYSBpcnEgZXZlbnRzICovCisJCWFwLT5vcHMtPmlycV9jbGVhcihhcCk7CisKKwkJcHJpbnRrKEtFUk5fRVJSICJhdGEldTogY29tbWFuZCAweCV4IHRpbWVvdXQsIHN0YXQgMHgleCBob3N0X3N0YXQgMHgleFxuIiwKKwkJICAgICAgIGFwLT5pZCwgcWMtPnRmLmNvbW1hbmQsIGRydl9zdGF0LCBob3N0X3N0YXQpOworCisJCS8qIGNvbXBsZXRlIHRhc2tmaWxlIHRyYW5zYWN0aW9uICovCisJCWF0YV9xY19jb21wbGV0ZShxYywgZHJ2X3N0YXQpOworCQlicmVhazsKKwl9CitvdXQ6CisJRFBSSU5USygiRVhJVFxuIik7Cit9CisKKy8qKgorICoJYXRhX2VuZ190aW1lb3V0IC0gSGFuZGxlIHRpbWVvdXQgb2YgcXVldWVkIGNvbW1hbmQKKyAqCUBhcDogUG9ydCBvbiB3aGljaCB0aW1lZC1vdXQgY29tbWFuZCBpcyBhY3RpdmUKKyAqCisgKglTb21lIHBhcnQgb2YgdGhlIGtlcm5lbCAoY3VycmVudGx5LCBvbmx5IHRoZSBTQ1NJIGxheWVyKQorICoJaGFzIG5vdGljZWQgdGhhdCB0aGUgYWN0aXZlIGNvbW1hbmQgb24gcG9ydCBAYXAgaGFzIG5vdAorICoJY29tcGxldGVkIGFmdGVyIGEgc3BlY2lmaWVkIGxlbmd0aCBvZiB0aW1lLiAgSGFuZGxlIHRoaXMKKyAqCWNvbmRpdGlvbiBieSBkaXNhYmxpbmcgRE1BIChpZiBuZWNlc3NhcnkpIGFuZCBjb21wbGV0aW5nCisgKgl0cmFuc2FjdGlvbnMsIHdpdGggZXJyb3IgaWYgbmVjZXNzYXJ5LgorICoKKyAqCVRoaXMgYWxzbyBoYW5kbGVzIHRoZSBjYXNlIG9mIHRoZSAibG9zdCBpbnRlcnJ1cHQiLCB3aGVyZQorICoJZm9yIHNvbWUgcmVhc29uIChwb3NzaWJseSBoYXJkd2FyZSBidWcsIHBvc3NpYmx5IGRyaXZlciBidWcpCisgKglhbiBpbnRlcnJ1cHQgd2FzIG5vdCBkZWxpdmVyZWQgdG8gdGhlIGRyaXZlciwgZXZlbiB0aG91Z2ggdGhlCisgKgl0cmFuc2FjdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICoKKyAqCUxPQ0tJTkc6CisgKglJbmhlcml0ZWQgZnJvbSBTQ1NJIGxheWVyIChub25lLCBjYW4gc2xlZXApCisgKi8KKwordm9pZCBhdGFfZW5nX3RpbWVvdXQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCisJRFBSSU5USygiRU5URVJcbiIpOworCisJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKKwlpZiAoIXFjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXRhJXU6IEJVRzogdGltZW91dCB3aXRob3V0IGNvbW1hbmRcbiIsCisJCSAgICAgICBhcC0+aWQpOworCQlnb3RvIG91dDsKKwl9CisKKwlhdGFfcWNfdGltZW91dChxYyk7CisKK291dDoKKwlEUFJJTlRLKCJFWElUXG4iKTsKK30KKworLyoqCisgKglhdGFfcWNfbmV3IC0gUmVxdWVzdCBhbiBhdmFpbGFibGUgQVRBIGNvbW1hbmQsIGZvciBxdWV1ZWluZworICoJQGFwOiBQb3J0IGFzc29jaWF0ZWQgd2l0aCBkZXZpY2UgQGRldgorICoJQGRldjogRGV2aWNlIGZyb20gd2hvbSB3ZSByZXF1ZXN0IGFuIGF2YWlsYWJsZSBjb21tYW5kIHN0cnVjdHVyZQorICoKKyAqCUxPQ0tJTkc6CisgKi8KKworc3RhdGljIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqYXRhX3FjX25ldyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMgPSBOVUxMOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfUVVFVUU7IGkrKykKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGksICZhcC0+cWFjdGl2ZSkpIHsKKwkJCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBpKTsKKwkJCWJyZWFrOworCQl9CisKKwlpZiAocWMpCisJCXFjLT50YWcgPSBpOworCisJcmV0dXJuIHFjOworfQorCisvKioKKyAqCWF0YV9xY19uZXdfaW5pdCAtIFJlcXVlc3QgYW4gYXZhaWxhYmxlIEFUQSBjb21tYW5kLCBhbmQgaW5pdGlhbGl6ZSBpdAorICoJQGFwOiBQb3J0IGFzc29jaWF0ZWQgd2l0aCBkZXZpY2UgQGRldgorICoJQGRldjogRGV2aWNlIGZyb20gd2hvbSB3ZSByZXF1ZXN0IGFuIGF2YWlsYWJsZSBjb21tYW5kIHN0cnVjdHVyZQorICoKKyAqCUxPQ0tJTkc6CisgKi8KKworc3RydWN0IGF0YV9xdWV1ZWRfY21kICphdGFfcWNfbmV3X2luaXQoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQkgICAgICBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisKKwlxYyA9IGF0YV9xY19uZXcoYXApOworCWlmIChxYykgeworCQlxYy0+c2cgPSBOVUxMOworCQlxYy0+ZmxhZ3MgPSAwOworCQlxYy0+c2NzaWNtZCA9IE5VTEw7CisJCXFjLT5hcCA9IGFwOworCQlxYy0+ZGV2ID0gZGV2OworCQlxYy0+Y3Vyc2VjdCA9IHFjLT5jdXJzZyA9IHFjLT5jdXJzZ19vZnMgPSAwOworCQlxYy0+bnNlY3QgPSAwOworCQlxYy0+bmJ5dGVzID0gcWMtPmN1cmJ5dGVzID0gMDsKKworCQlhdGFfdGZfaW5pdChhcCwgJnFjLT50ZiwgZGV2LT5kZXZubyk7CisKKwkJaWYgKGRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfTEJBNDgpCisJCQlxYy0+dGYuZmxhZ3MgfD0gQVRBX1RGTEFHX0xCQTQ4OworCX0KKworCXJldHVybiBxYzsKK30KKworc3RhdGljIGludCBhdGFfcWNfY29tcGxldGVfbm9vcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLCB1OCBkcnZfc3RhdCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19hdGFfcWNfY29tcGxldGUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXVuc2lnbmVkIGludCB0YWcsIGRvX2NsZWFyID0gMDsKKworCXFjLT5mbGFncyA9IDA7CisJdGFnID0gcWMtPnRhZzsKKwlpZiAobGlrZWx5KGF0YV90YWdfdmFsaWQodGFnKSkpIHsKKwkJaWYgKHRhZyA9PSBhcC0+YWN0aXZlX3RhZykKKwkJCWFwLT5hY3RpdmVfdGFnID0gQVRBX1RBR19QT0lTT047CisJCXFjLT50YWcgPSBBVEFfVEFHX1BPSVNPTjsKKwkJZG9fY2xlYXIgPSAxOworCX0KKworCWlmIChxYy0+d2FpdGluZykgeworCQlzdHJ1Y3QgY29tcGxldGlvbiAqd2FpdGluZyA9IHFjLT53YWl0aW5nOworCQlxYy0+d2FpdGluZyA9IE5VTEw7CisJCWNvbXBsZXRlKHdhaXRpbmcpOworCX0KKworCWlmIChsaWtlbHkoZG9fY2xlYXIpKQorCQljbGVhcl9iaXQodGFnLCAmYXAtPnFhY3RpdmUpOworfQorCisvKioKKyAqCWF0YV9xY19mcmVlIC0gZnJlZSB1bnVzZWQgYXRhX3F1ZXVlZF9jbWQKKyAqCUBxYzogQ29tbWFuZCB0byBjb21wbGV0ZQorICoKKyAqCURlc2lnbmVkIHRvIGZyZWUgdW51c2VkIGF0YV9xdWV1ZWRfY21kIG9iamVjdAorICoJaW4gY2FzZSBzb21ldGhpbmcgcHJldmVudHMgdXNpbmcgaXQuCisgKgorICoJTE9DS0lORzoKKyAqCisgKi8KK3ZvaWQgYXRhX3FjX2ZyZWUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlhc3NlcnQocWMgIT0gTlVMTCk7CS8qIGF0YV9xY19mcm9tX3RhZyBfbWlnaHRfIHJldHVybiBOVUxMICovCisJYXNzZXJ0KHFjLT53YWl0aW5nID09IE5VTEwpOwkvKiBub3RoaW5nIHNob3VsZCBiZSB3YWl0aW5nICovCisKKwlfX2F0YV9xY19jb21wbGV0ZShxYyk7Cit9CisKKy8qKgorICoJYXRhX3FjX2NvbXBsZXRlIC0gQ29tcGxldGUgYW4gYWN0aXZlIEFUQSBjb21tYW5kCisgKglAcWM6IENvbW1hbmQgdG8gY29tcGxldGUKKyAqCUBkcnZfc3RhdDogQVRBIHN0YXR1cyByZWdpc3RlciBjb250ZW50cworICoKKyAqCUxPQ0tJTkc6CisgKgorICovCisKK3ZvaWQgYXRhX3FjX2NvbXBsZXRlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsIHU4IGRydl9zdGF0KQoreworCWludCByYzsKKworCWFzc2VydChxYyAhPSBOVUxMKTsJLyogYXRhX3FjX2Zyb21fdGFnIF9taWdodF8gcmV0dXJuIE5VTEwgKi8KKwlhc3NlcnQocWMtPmZsYWdzICYgQVRBX1FDRkxBR19BQ1RJVkUpOworCisJaWYgKGxpa2VseShxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0RNQU1BUCkpCisJCWF0YV9zZ19jbGVhbihxYyk7CisKKwkvKiBjYWxsIGNvbXBsZXRpb24gY2FsbGJhY2sgKi8KKwlyYyA9IHFjLT5jb21wbGV0ZV9mbihxYywgZHJ2X3N0YXQpOworCisJLyogaWYgY2FsbGJhY2sgaW5kaWNhdGVzIG5vdCB0byBjb21wbGV0ZSBjb21tYW5kIChub24temVybyksCisJICogcmV0dXJuIGltbWVkaWF0ZWx5CisJICovCisJaWYgKHJjICE9IDApCisJCXJldHVybjsKKworCV9fYXRhX3FjX2NvbXBsZXRlKHFjKTsKKworCVZQUklOVEsoIkVYSVRcbiIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdGFfc2hvdWxkX2RtYV9tYXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCisJc3dpdGNoIChxYy0+dGYucHJvdG9jb2wpIHsKKwljYXNlIEFUQV9QUk9UX0RNQToKKwljYXNlIEFUQV9QUk9UX0FUQVBJX0RNQToKKwkJcmV0dXJuIDE7CisKKwljYXNlIEFUQV9QUk9UX0FUQVBJOgorCWNhc2UgQVRBX1BST1RfUElPOgorCWNhc2UgQVRBX1BST1RfUElPX01VTFQ6CisJCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19QSU9fRE1BKQorCQkJcmV0dXJuIDE7CisKKwkJLyogZmFsbCB0aHJvdWdoICovCisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBuZXZlciByZWFjaGVkICovCit9CisKKy8qKgorICoJYXRhX3FjX2lzc3VlIC0gaXNzdWUgdGFza2ZpbGUgdG8gZGV2aWNlCisgKglAcWM6IGNvbW1hbmQgdG8gaXNzdWUgdG8gZGV2aWNlCisgKgorICoJUHJlcGFyZSBhbiBBVEEgY29tbWFuZCB0byBzdWJtaXNzaW9uIHRvIGRldmljZS4KKyAqCVRoaXMgaW5jbHVkZXMgbWFwcGluZyB0aGUgZGF0YSBpbnRvIGEgRE1BLWFibGUKKyAqCWFyZWEsIGZpbGxpbmcgaW4gdGhlIFMvRyB0YWJsZSwgYW5kIGZpbmFsbHkKKyAqCXdyaXRpbmcgdGhlIHRhc2tmaWxlIHRvIGhhcmR3YXJlLCBzdGFydGluZyB0aGUgY29tbWFuZC4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqCisgKglSRVRVUk5TOgorICoJWmVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBlcnJvci4KKyAqLworCitpbnQgYXRhX3FjX2lzc3VlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKworCWlmIChhdGFfc2hvdWxkX2RtYV9tYXAocWMpKSB7CisJCWlmIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX1NHKSB7CisJCQlpZiAoYXRhX3NnX3NldHVwKHFjKSkKKwkJCQlnb3RvIGVycl9vdXQ7CisJCX0gZWxzZSBpZiAocWMtPmZsYWdzICYgQVRBX1FDRkxBR19TSU5HTEUpIHsKKwkJCWlmIChhdGFfc2dfc2V0dXBfb25lKHFjKSkKKwkJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwl9IGVsc2UgeworCQlxYy0+ZmxhZ3MgJj0gfkFUQV9RQ0ZMQUdfRE1BTUFQOworCX0KKworCWFwLT5vcHMtPnFjX3ByZXAocWMpOworCisJcWMtPmFwLT5hY3RpdmVfdGFnID0gcWMtPnRhZzsKKwlxYy0+ZmxhZ3MgfD0gQVRBX1FDRkxBR19BQ1RJVkU7CisKKwlyZXR1cm4gYXAtPm9wcy0+cWNfaXNzdWUocWMpOworCitlcnJfb3V0OgorCXJldHVybiAtMTsKK30KKworLyoqCisgKglhdGFfcWNfaXNzdWVfcHJvdCAtIGlzc3VlIHRhc2tmaWxlIHRvIGRldmljZSBpbiBwcm90by1kZXBlbmRlbnQgbWFubmVyCisgKglAcWM6IGNvbW1hbmQgdG8gaXNzdWUgdG8gZGV2aWNlCisgKgorICoJVXNpbmcgdmFyaW91cyBsaWJhdGEgZnVuY3Rpb25zIGFuZCBob29rcywgdGhpcyBmdW5jdGlvbgorICoJc3RhcnRzIGFuIEFUQSBjb21tYW5kLiAgQVRBIGNvbW1hbmRzIGFyZSBncm91cGVkIGludG8KKyAqCWNsYXNzZXMgY2FsbGVkICJwcm90b2NvbHMiLCBhbmQgaXNzdWluZyBlYWNoIHR5cGUgb2YgcHJvdG9jb2wKKyAqCWlzIHNsaWdodGx5IGRpZmZlcmVudC4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqCisgKglSRVRVUk5TOgorICoJWmVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBlcnJvci4KKyAqLworCitpbnQgYXRhX3FjX2lzc3VlX3Byb3Qoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCisJYXRhX2Rldl9zZWxlY3QoYXAsIHFjLT5kZXYtPmRldm5vLCAxLCAwKTsKKworCXN3aXRjaCAocWMtPnRmLnByb3RvY29sKSB7CisJY2FzZSBBVEFfUFJPVF9OT0RBVEE6CisJCWF0YV90Zl90b19ob3N0X25vbG9jayhhcCwgJnFjLT50Zik7CisJCWJyZWFrOworCisJY2FzZSBBVEFfUFJPVF9ETUE6CisJCWFwLT5vcHMtPnRmX2xvYWQoYXAsICZxYy0+dGYpOwkgLyogbG9hZCB0ZiByZWdpc3RlcnMgKi8KKwkJYXAtPm9wcy0+Ym1kbWFfc2V0dXAocWMpOwkgICAgLyogc2V0IHVwIGJtZG1hICovCisJCWFwLT5vcHMtPmJtZG1hX3N0YXJ0KHFjKTsJICAgIC8qIGluaXRpYXRlIGJtZG1hICovCisJCWJyZWFrOworCisJY2FzZSBBVEFfUFJPVF9QSU86IC8qIGxvYWQgdGYgcmVnaXN0ZXJzLCBpbml0aWF0ZSBwb2xsaW5nIHBpbyAqLworCQlhdGFfcWNfc2V0X3BvbGxpbmcocWMpOworCQlhdGFfdGZfdG9faG9zdF9ub2xvY2soYXAsICZxYy0+dGYpOworCQlhcC0+cGlvX3Rhc2tfc3RhdGUgPSBQSU9fU1Q7CisJCXF1ZXVlX3dvcmsoYXRhX3dxLCAmYXAtPnBpb190YXNrKTsKKwkJYnJlYWs7CisKKwljYXNlIEFUQV9QUk9UX0FUQVBJOgorCQlhdGFfcWNfc2V0X3BvbGxpbmcocWMpOworCQlhdGFfdGZfdG9faG9zdF9ub2xvY2soYXAsICZxYy0+dGYpOworCQlxdWV1ZV93b3JrKGF0YV93cSwgJmFwLT5wYWNrZXRfdGFzayk7CisJCWJyZWFrOworCisJY2FzZSBBVEFfUFJPVF9BVEFQSV9OT0RBVEE6CisJCWF0YV90Zl90b19ob3N0X25vbG9jayhhcCwgJnFjLT50Zik7CisJCXF1ZXVlX3dvcmsoYXRhX3dxLCAmYXAtPnBhY2tldF90YXNrKTsKKwkJYnJlYWs7CisKKwljYXNlIEFUQV9QUk9UX0FUQVBJX0RNQToKKwkJYXAtPm9wcy0+dGZfbG9hZChhcCwgJnFjLT50Zik7CSAvKiBsb2FkIHRmIHJlZ2lzdGVycyAqLworCQlhcC0+b3BzLT5ibWRtYV9zZXR1cChxYyk7CSAgICAvKiBzZXQgdXAgYm1kbWEgKi8KKwkJcXVldWVfd29yayhhdGFfd3EsICZhcC0+cGFja2V0X3Rhc2spOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhdGFfYm1kbWFfc2V0dXAgLSBTZXQgdXAgUENJIElERSBCTURNQSB0cmFuc2FjdGlvbgorICoJQHFjOiBJbmZvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEFUQSB0cmFuc2FjdGlvbi4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqLworCitzdGF0aWMgdm9pZCBhdGFfYm1kbWFfc2V0dXBfbW1pbyAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXVuc2lnbmVkIGludCBydyA9IChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpOworCXU4IGRtYWN0bDsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSAodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIuYm1kbWFfYWRkcjsKKworCS8qIGxvYWQgUFJEIHRhYmxlIGFkZHIuICovCisJbWIoKTsJLyogbWFrZSBzdXJlIFBSRCB0YWJsZSB3cml0ZXMgYXJlIHZpc2libGUgdG8gY29udHJvbGxlciAqLworCXdyaXRlbChhcC0+cHJkX2RtYSwgbW1pbyArIEFUQV9ETUFfVEFCTEVfT0ZTKTsKKworCS8qIHNwZWNpZnkgZGF0YSBkaXJlY3Rpb24sIHRyaXBsZS1jaGVjayBzdGFydCBiaXQgaXMgY2xlYXIgKi8KKwlkbWFjdGwgPSByZWFkYihtbWlvICsgQVRBX0RNQV9DTUQpOworCWRtYWN0bCAmPSB+KEFUQV9ETUFfV1IgfCBBVEFfRE1BX1NUQVJUKTsKKwlpZiAoIXJ3KQorCQlkbWFjdGwgfD0gQVRBX0RNQV9XUjsKKwl3cml0ZWIoZG1hY3RsLCBtbWlvICsgQVRBX0RNQV9DTUQpOworCisJLyogaXNzdWUgci93IGNvbW1hbmQgKi8KKwlhcC0+b3BzLT5leGVjX2NvbW1hbmQoYXAsICZxYy0+dGYpOworfQorCisvKioKKyAqCWF0YV9ibWRtYV9zdGFydCAtIFN0YXJ0IGEgUENJIElERSBCTURNQSB0cmFuc2FjdGlvbgorICoJQHFjOiBJbmZvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEFUQSB0cmFuc2FjdGlvbi4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqLworCitzdGF0aWMgdm9pZCBhdGFfYm1kbWFfc3RhcnRfbW1pbyAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXZvaWQgX19pb21lbSAqbW1pbyA9ICh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5ibWRtYV9hZGRyOworCXU4IGRtYWN0bDsKKworCS8qIHN0YXJ0IGhvc3QgRE1BIHRyYW5zYWN0aW9uICovCisJZG1hY3RsID0gcmVhZGIobW1pbyArIEFUQV9ETUFfQ01EKTsKKwl3cml0ZWIoZG1hY3RsIHwgQVRBX0RNQV9TVEFSVCwgbW1pbyArIEFUQV9ETUFfQ01EKTsKKworCS8qIFN0cmljdGx5LCBvbmUgbWF5IHdpc2ggdG8gaXNzdWUgYSByZWFkYigpIGhlcmUsIHRvCisJICogZmx1c2ggdGhlIG1taW8gd3JpdGUuICBIb3dldmVyLCBjb250cm9sIGFsc28gcGFzc2VzCisJICogdG8gdGhlIGhhcmR3YXJlIGF0IHRoaXMgcG9pbnQsIGFuZCBpdCB3aWxsIGludGVycnVwdAorCSAqIHVzIHdoZW4gd2UgYXJlIHRvIHJlc3VtZSBjb250cm9sLiAgU28sIGluIGVmZmVjdCwKKwkgKiB3ZSBkb24ndCBjYXJlIHdoZW4gdGhlIG1taW8gd3JpdGUgZmx1c2hlcy4KKwkgKiBGdXJ0aGVyLCBhIHJlYWQgb2YgdGhlIERNQSBzdGF0dXMgcmVnaXN0ZXIgX2ltbWVkaWF0ZWx5XworCSAqIGZvbGxvd2luZyB0aGUgd3JpdGUgbWF5IG5vdCBiZSB3aGF0IGNlcnRhaW4gZmxha3kgaGFyZHdhcmUKKwkgKiBpcyBleHBlY3RlZCwgc28gSSB0aGluayBpdCBpcyBiZXN0IHRvIG5vdCBhZGQgYSByZWFkYigpCisJICogd2l0aG91dCBmaXJzdCBhbGwgdGhlIE1NSU8gQVRBIGNhcmRzL21vYm9zLgorCSAqIE9yIG1heWJlIEknbSBqdXN0IGJlaW5nIHBhcmFub2lkLgorCSAqLworfQorCisvKioKKyAqCWF0YV9ibWRtYV9zZXR1cF9waW8gLSBTZXQgdXAgUENJIElERSBCTURNQSB0cmFuc2FjdGlvbiAoUElPKQorICoJQHFjOiBJbmZvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEFUQSB0cmFuc2FjdGlvbi4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqLworCitzdGF0aWMgdm9pZCBhdGFfYm1kbWFfc2V0dXBfcGlvIChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJdW5zaWduZWQgaW50IHJ3ID0gKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSk7CisJdTggZG1hY3RsOworCisJLyogbG9hZCBQUkQgdGFibGUgYWRkci4gKi8KKwlvdXRsKGFwLT5wcmRfZG1hLCBhcC0+aW9hZGRyLmJtZG1hX2FkZHIgKyBBVEFfRE1BX1RBQkxFX09GUyk7CisKKwkvKiBzcGVjaWZ5IGRhdGEgZGlyZWN0aW9uLCB0cmlwbGUtY2hlY2sgc3RhcnQgYml0IGlzIGNsZWFyICovCisJZG1hY3RsID0gaW5iKGFwLT5pb2FkZHIuYm1kbWFfYWRkciArIEFUQV9ETUFfQ01EKTsKKwlkbWFjdGwgJj0gfihBVEFfRE1BX1dSIHwgQVRBX0RNQV9TVEFSVCk7CisJaWYgKCFydykKKwkJZG1hY3RsIHw9IEFUQV9ETUFfV1I7CisJb3V0YihkbWFjdGwsIGFwLT5pb2FkZHIuYm1kbWFfYWRkciArIEFUQV9ETUFfQ01EKTsKKworCS8qIGlzc3VlIHIvdyBjb21tYW5kICovCisJYXAtPm9wcy0+ZXhlY19jb21tYW5kKGFwLCAmcWMtPnRmKTsKK30KKworLyoqCisgKglhdGFfYm1kbWFfc3RhcnRfcGlvIC0gU3RhcnQgYSBQQ0kgSURFIEJNRE1BIHRyYW5zYWN0aW9uIChQSU8pCisgKglAcWM6IEluZm8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgQVRBIHRyYW5zYWN0aW9uLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3N0YXRpYyB2b2lkIGF0YV9ibWRtYV9zdGFydF9waW8gKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwl1OCBkbWFjdGw7CisKKwkvKiBzdGFydCBob3N0IERNQSB0cmFuc2FjdGlvbiAqLworCWRtYWN0bCA9IGluYihhcC0+aW9hZGRyLmJtZG1hX2FkZHIgKyBBVEFfRE1BX0NNRCk7CisJb3V0YihkbWFjdGwgfCBBVEFfRE1BX1NUQVJULAorCSAgICAgYXAtPmlvYWRkci5ibWRtYV9hZGRyICsgQVRBX0RNQV9DTUQpOworfQorCit2b2lkIGF0YV9ibWRtYV9zdGFydChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCWlmIChxYy0+YXAtPmZsYWdzICYgQVRBX0ZMQUdfTU1JTykKKwkJYXRhX2JtZG1hX3N0YXJ0X21taW8ocWMpOworCWVsc2UKKwkJYXRhX2JtZG1hX3N0YXJ0X3BpbyhxYyk7Cit9CisKK3ZvaWQgYXRhX2JtZG1hX3NldHVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJaWYgKHFjLT5hcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKQorCQlhdGFfYm1kbWFfc2V0dXBfbW1pbyhxYyk7CisJZWxzZQorCQlhdGFfYm1kbWFfc2V0dXBfcGlvKHFjKTsKK30KKwordm9pZCBhdGFfYm1kbWFfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisgICAgaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX01NSU8pIHsKKyAgICAgICAgdm9pZCBfX2lvbWVtICptbWlvID0gKCh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5ibWRtYV9hZGRyKSArIEFUQV9ETUFfU1RBVFVTOworICAgICAgICB3cml0ZWIocmVhZGIobW1pbyksIG1taW8pOworICAgIH0gZWxzZSB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciA9IGFwLT5pb2FkZHIuYm1kbWFfYWRkciArIEFUQV9ETUFfU1RBVFVTOworICAgICAgICBvdXRiKGluYihhZGRyKSwgYWRkcik7CisgICAgfQorCit9CisKK3U4IGF0YV9ibWRtYV9zdGF0dXMoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl1OCBob3N0X3N0YXQ7CisJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX01NSU8pIHsKKwkJdm9pZCBfX2lvbWVtICptbWlvID0gKHZvaWQgX19pb21lbSAqKSBhcC0+aW9hZGRyLmJtZG1hX2FkZHI7CisJCWhvc3Rfc3RhdCA9IHJlYWRiKG1taW8gKyBBVEFfRE1BX1NUQVRVUyk7CisJfSBlbHNlCisJaG9zdF9zdGF0ID0gaW5iKGFwLT5pb2FkZHIuYm1kbWFfYWRkciArIEFUQV9ETUFfU1RBVFVTKTsKKwlyZXR1cm4gaG9zdF9zdGF0OworfQorCit2b2lkIGF0YV9ibWRtYV9zdG9wKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX01NSU8pIHsKKwkJdm9pZCBfX2lvbWVtICptbWlvID0gKHZvaWQgX19pb21lbSAqKSBhcC0+aW9hZGRyLmJtZG1hX2FkZHI7CisKKwkJLyogY2xlYXIgc3RhcnQvc3RvcCBiaXQgKi8KKwkJd3JpdGViKHJlYWRiKG1taW8gKyBBVEFfRE1BX0NNRCkgJiB+QVRBX0RNQV9TVEFSVCwKKwkJCW1taW8gKyBBVEFfRE1BX0NNRCk7CisJfSBlbHNlIHsKKwkJLyogY2xlYXIgc3RhcnQvc3RvcCBiaXQgKi8KKwkJb3V0YihpbmIoYXAtPmlvYWRkci5ibWRtYV9hZGRyICsgQVRBX0RNQV9DTUQpICYgfkFUQV9ETUFfU1RBUlQsCisJCQlhcC0+aW9hZGRyLmJtZG1hX2FkZHIgKyBBVEFfRE1BX0NNRCk7CisJfQorCisJLyogb25lLVBJTy1jeWNsZSBndWFyYW50ZWVkIHdhaXQsIHBlciBzcGVjLCBmb3IgSERNQTE6MCB0cmFuc2l0aW9uICovCisJYXRhX2FsdHN0YXR1cyhhcCk7ICAgICAgICAvKiBkdW1teSByZWFkICovCit9CisKKy8qKgorICoJYXRhX2hvc3RfaW50ciAtIEhhbmRsZSBob3N0IGludGVycnVwdCBmb3IgZ2l2ZW4gKHBvcnQsIHRhc2spCisgKglAYXA6IFBvcnQgb24gd2hpY2ggaW50ZXJydXB0IGFycml2ZWQgKHBvc3NpYmx5Li4uKQorICoJQHFjOiBUYXNrZmlsZSBjdXJyZW50bHkgYWN0aXZlIGluIGVuZ2luZQorICoKKyAqCUhhbmRsZSBob3N0IGludGVycnVwdCBmb3IgZ2l2ZW4gcXVldWVkIGNvbW1hbmQuICBDdXJyZW50bHksCisgKglvbmx5IERNQSBpbnRlcnJ1cHRzIGFyZSBoYW5kbGVkLiAgQWxsIG90aGVyIGNvbW1hbmRzIGFyZQorICoJaGFuZGxlZCB2aWEgcG9sbGluZyB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgKG5JRU4gYml0KS4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqCisgKglSRVRVUk5TOgorICoJT25lIGlmIGludGVycnVwdCB3YXMgaGFuZGxlZCwgemVybyBpZiBub3QgKHNoYXJlZCBpcnEpLgorICovCisKK2lubGluZSB1bnNpZ25lZCBpbnQgYXRhX2hvc3RfaW50ciAoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQkgICBzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXU4IHN0YXR1cywgaG9zdF9zdGF0OworCisJc3dpdGNoIChxYy0+dGYucHJvdG9jb2wpIHsKKworCWNhc2UgQVRBX1BST1RfRE1BOgorCWNhc2UgQVRBX1BST1RfQVRBUElfRE1BOgorCWNhc2UgQVRBX1BST1RfQVRBUEk6CisJCS8qIGNoZWNrIHN0YXR1cyBvZiBETUEgZW5naW5lICovCisJCWhvc3Rfc3RhdCA9IGFwLT5vcHMtPmJtZG1hX3N0YXR1cyhhcCk7CisJCVZQUklOVEsoImF0YSV1OiBob3N0X3N0YXQgMHglWFxuIiwgYXAtPmlkLCBob3N0X3N0YXQpOworCisJCS8qIGlmIGl0J3Mgbm90IG91ciBpcnEuLi4gKi8KKwkJaWYgKCEoaG9zdF9zdGF0ICYgQVRBX0RNQV9JTlRSKSkKKwkJCWdvdG8gaWRsZV9pcnE7CisKKwkJLyogYmVmb3JlIHdlIGRvIGFueXRoaW5nIGVsc2UsIGNsZWFyIERNQS1TdGFydCBiaXQgKi8KKwkJYXAtPm9wcy0+Ym1kbWFfc3RvcChhcCk7CisKKwkJLyogZmFsbCB0aHJvdWdoICovCisKKwljYXNlIEFUQV9QUk9UX0FUQVBJX05PREFUQToKKwljYXNlIEFUQV9QUk9UX05PREFUQToKKwkJLyogY2hlY2sgYWx0c3RhdHVzICovCisJCXN0YXR1cyA9IGF0YV9hbHRzdGF0dXMoYXApOworCQlpZiAoc3RhdHVzICYgQVRBX0JVU1kpCisJCQlnb3RvIGlkbGVfaXJxOworCisJCS8qIGNoZWNrIG1haW4gc3RhdHVzLCBjbGVhcmluZyBJTlRSUSAqLworCQlzdGF0dXMgPSBhdGFfY2hrX3N0YXR1cyhhcCk7CisJCWlmICh1bmxpa2VseShzdGF0dXMgJiBBVEFfQlVTWSkpCisJCQlnb3RvIGlkbGVfaXJxOworCQlEUFJJTlRLKCJhdGEldTogcHJvdG9jb2wgJWQgKGRldl9zdGF0IDB4JVgpXG4iLAorCQkJYXAtPmlkLCBxYy0+dGYucHJvdG9jb2wsIHN0YXR1cyk7CisKKwkJLyogYWNrIGJtZG1hIGlycSBldmVudHMgKi8KKwkJYXAtPm9wcy0+aXJxX2NsZWFyKGFwKTsKKworCQkvKiBjb21wbGV0ZSB0YXNrZmlsZSB0cmFuc2FjdGlvbiAqLworCQlhdGFfcWNfY29tcGxldGUocWMsIHN0YXR1cyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZ290byBpZGxlX2lycTsKKwl9CisKKwlyZXR1cm4gMTsJLyogaXJxIGhhbmRsZWQgKi8KKworaWRsZV9pcnE6CisJYXAtPnN0YXRzLmlkbGVfaXJxKys7CisKKyNpZmRlZiBBVEFfSVJRX1RSQVAKKwlpZiAoKGFwLT5zdGF0cy5pZGxlX2lycSAlIDEwMDApID09IDApIHsKKwkJaGFuZGxlZCA9IDE7CisJCWF0YV9pcnFfYWNrKGFwLCAwKTsgLyogZGVidWcgdHJhcCAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdGElZDogaXJxIHRyYXBcbiIsIGFwLT5pZCk7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7CS8qIGlycSBub3QgaGFuZGxlZCAqLworfQorCisvKioKKyAqCWF0YV9pbnRlcnJ1cHQgLSBEZWZhdWx0IEFUQSBob3N0IGludGVycnVwdCBoYW5kbGVyCisgKglAaXJxOiBpcnEgbGluZQorICoJQGRldl9pbnN0YW5jZTogcG9pbnRlciB0byBvdXIgaG9zdCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqCUByZWdzOiB1bnVzZWQKKyAqCisgKglMT0NLSU5HOgorICoKKyAqCVJFVFVSTlM6CisgKgorICovCisKK2lycXJldHVybl90IGF0YV9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBkZXZfaW5zdGFuY2U7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBUT0RPOiBtYWtlIF9pcnFzYXZlIGNvbmRpdGlvbmFsIG9uIHg4NiBQQ0kgSURFIGxlZ2FjeSBtb2RlICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaG9zdF9zZXQtPm5fcG9ydHM7IGkrKykgeworCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwOworCisJCWFwID0gaG9zdF9zZXQtPnBvcnRzW2ldOworCQlpZiAoYXAgJiYgKCEoYXAtPmZsYWdzICYgQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRCkpKSB7CisJCQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCisJCQlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOworCQkJaWYgKHFjICYmICghKHFjLT50Zi5jdGwgJiBBVEFfTklFTikpKQorCQkJCWhhbmRsZWQgfD0gYXRhX2hvc3RfaW50cihhcCwgcWMpOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdF9zZXQtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKioKKyAqCWF0YXBpX3BhY2tldF90YXNrIC0gV3JpdGUgQ0RCIGJ5dGVzIHRvIGhhcmR3YXJlCisgKglAX2RhdGE6IFBvcnQgdG8gd2hpY2ggQVRBUEkgZGV2aWNlIGlzIGF0dGFjaGVkLgorICoKKyAqCVdoZW4gZGV2aWNlIGhhcyBpbmRpY2F0ZWQgaXRzIHJlYWRpbmVzcyB0byBhY2NlcHQKKyAqCWEgQ0RCLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gIFNlbmQgdGhlIENEQi4KKyAqCUlmIERNQSBpcyB0byBiZSBwZXJmb3JtZWQsIGV4aXQgaW1tZWRpYXRlbHkuCisgKglPdGhlcndpc2UsIHdlIGFyZSBpbiBwb2xsaW5nIG1vZGUsIHNvIHBvbGwKKyAqCXN0YXR1cyB1bmRlciBvcGVyYXRpb24gc3VjY2VlZHMgb3IgZmFpbHMuCisgKgorICoJTE9DS0lORzoKKyAqCUtlcm5lbCB0aHJlYWQgY29udGV4dCAobWF5IHNsZWVwKQorICovCisKK3N0YXRpYyB2b2lkIGF0YXBpX3BhY2tldF90YXNrKHZvaWQgKl9kYXRhKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBfZGF0YTsKKwlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCXU4IHN0YXR1czsKKworCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7CisJYXNzZXJ0KHFjICE9IE5VTEwpOworCWFzc2VydChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0FDVElWRSk7CisKKwkvKiBzbGVlcC13YWl0IGZvciBCU1kgdG8gY2xlYXIgKi8KKwlEUFJJTlRLKCJidXN5IHdhaXRcbiIpOworCWlmIChhdGFfYnVzeV9zbGVlcChhcCwgQVRBX1RNT1VUX0NEQl9RVUlDSywgQVRBX1RNT1VUX0NEQikpCisJCWdvdG8gZXJyX291dDsKKworCS8qIG1ha2Ugc3VyZSBEUlEgaXMgc2V0ICovCisJc3RhdHVzID0gYXRhX2Noa19zdGF0dXMoYXApOworCWlmICgoc3RhdHVzICYgKEFUQV9CVVNZIHwgQVRBX0RSUSkpICE9IEFUQV9EUlEpCisJCWdvdG8gZXJyX291dDsKKworCS8qIHNlbmQgU0NTSSBjZGIgKi8KKwlEUFJJTlRLKCJzZW5kIGNkYlxuIik7CisJYXNzZXJ0KGFwLT5jZGJfbGVuID49IDEyKTsKKwlhdGFfZGF0YV94ZmVyKGFwLCBxYy0+Y2RiLCBhcC0+Y2RiX2xlbiwgMSk7CisKKwkvKiBpZiB3ZSBhcmUgRE1BJ2luZywgaXJxIGhhbmRsZXIgdGFrZXMgb3ZlciBmcm9tIGhlcmUgKi8KKwlpZiAocWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX0FUQVBJX0RNQSkKKwkJYXAtPm9wcy0+Ym1kbWFfc3RhcnQocWMpOwkgICAgLyogaW5pdGlhdGUgYm1kbWEgKi8KKworCS8qIG5vbi1kYXRhIGNvbW1hbmRzIGFyZSBhbHNvIGhhbmRsZWQgdmlhIGlycSAqLworCWVsc2UgaWYgKHFjLT50Zi5wcm90b2NvbCA9PSBBVEFfUFJPVF9BVEFQSV9OT0RBVEEpIHsKKwkJLyogZG8gbm90aGluZyAqLworCX0KKworCS8qIFBJTyBjb21tYW5kcyBhcmUgaGFuZGxlZCBieSBwb2xsaW5nICovCisJZWxzZSB7CisJCWFwLT5waW9fdGFza19zdGF0ZSA9IFBJT19TVDsKKwkJcXVldWVfd29yayhhdGFfd3EsICZhcC0+cGlvX3Rhc2spOworCX0KKworCXJldHVybjsKKworZXJyX291dDoKKwlhdGFfcWNfY29tcGxldGUocWMsIEFUQV9FUlIpOworfQorCitpbnQgYXRhX3BvcnRfc3RhcnQgKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gYXAtPmhvc3Rfc2V0LT5kZXY7CisKKwlhcC0+cHJkID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgQVRBX1BSRF9UQkxfU1osICZhcC0+cHJkX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhcC0+cHJkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCURQUklOVEsoInByZCBhbGxvYywgdmlydCAlcCwgZG1hICVsbHhcbiIsIGFwLT5wcmQsICh1bnNpZ25lZCBsb25nIGxvbmcpIGFwLT5wcmRfZG1hKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGF0YV9wb3J0X3N0b3AgKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gYXAtPmhvc3Rfc2V0LT5kZXY7CisKKwlkbWFfZnJlZV9jb2hlcmVudChkZXYsIEFUQV9QUkRfVEJMX1NaLCBhcC0+cHJkLCBhcC0+cHJkX2RtYSk7Cit9CisKKy8qKgorICoJYXRhX2hvc3RfcmVtb3ZlIC0gVW5yZWdpc3RlciBTQ1NJIGhvc3Qgc3RydWN0dXJlIHdpdGggdXBwZXIgbGF5ZXJzCisgKglAYXA6IFBvcnQgdG8gdW5yZWdpc3RlcgorICoJQGRvX3VucmVnaXN0ZXI6IDEgaWYgd2UgZnVsbHkgdW5yZWdpc3RlciwgMCB0byBqdXN0IHN0b3AgdGhlIHBvcnQKKyAqCisgKglMT0NLSU5HOgorICovCisKK3N0YXRpYyB2b2lkIGF0YV9ob3N0X3JlbW92ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgZG9fdW5yZWdpc3RlcikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaCA9IGFwLT5ob3N0OworCisJRFBSSU5USygiRU5URVJcbiIpOworCisJaWYgKGRvX3VucmVnaXN0ZXIpCisJCXNjc2lfcmVtb3ZlX2hvc3Qoc2gpOworCisJYXAtPm9wcy0+cG9ydF9zdG9wKGFwKTsKK30KKworLyoqCisgKglhdGFfaG9zdF9pbml0IC0gSW5pdGlhbGl6ZSBhbiBhdGFfcG9ydCBzdHJ1Y3R1cmUKKyAqCUBhcDogU3RydWN0dXJlIHRvIGluaXRpYWxpemUKKyAqCUBob3N0OiBhc3NvY2lhdGVkIFNDU0kgbWlkLWxheWVyIHN0cnVjdHVyZQorICoJQGhvc3Rfc2V0OiBDb2xsZWN0aW9uIG9mIGhvc3RzIHRvIHdoaWNoIEBhcCBiZWxvbmdzCisgKglAZW50OiBQcm9iZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSBsb3ctbGV2ZWwgZHJpdmVyCisgKglAcG9ydF9ubzogUG9ydCBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXRhX3BvcnQKKyAqCisgKglMT0NLSU5HOgorICoKKyAqLworCitzdGF0aWMgdm9pZCBhdGFfaG9zdF9pbml0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsCisJCQkgIHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0LAorCQkJICBzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqZW50LCB1bnNpZ25lZCBpbnQgcG9ydF9ubykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWhvc3QtPm1heF9pZCA9IDE2OworCWhvc3QtPm1heF9sdW4gPSAxOworCWhvc3QtPm1heF9jaGFubmVsID0gMTsKKwlob3N0LT51bmlxdWVfaWQgPSBhdGFfdW5pcXVlX2lkKys7CisJaG9zdC0+bWF4X2NtZF9sZW4gPSAxMjsKKwlzY3NpX3NldF9kZXZpY2UoaG9zdCwgZW50LT5kZXYpOworCXNjc2lfYXNzaWduX2xvY2soaG9zdCwgJmhvc3Rfc2V0LT5sb2NrKTsKKworCWFwLT5mbGFncyA9IEFUQV9GTEFHX1BPUlRfRElTQUJMRUQ7CisJYXAtPmlkID0gaG9zdC0+dW5pcXVlX2lkOworCWFwLT5ob3N0ID0gaG9zdDsKKwlhcC0+Y3RsID0gQVRBX0RFVkNUTF9PQlM7CisJYXAtPmhvc3Rfc2V0ID0gaG9zdF9zZXQ7CisJYXAtPnBvcnRfbm8gPSBwb3J0X25vOworCWFwLT5oYXJkX3BvcnRfbm8gPQorCQllbnQtPmxlZ2FjeV9tb2RlID8gZW50LT5oYXJkX3BvcnRfbm8gOiBwb3J0X25vOworCWFwLT5waW9fbWFzayA9IGVudC0+cGlvX21hc2s7CisJYXAtPm13ZG1hX21hc2sgPSBlbnQtPm13ZG1hX21hc2s7CisJYXAtPnVkbWFfbWFzayA9IGVudC0+dWRtYV9tYXNrOworCWFwLT5mbGFncyB8PSBlbnQtPmhvc3RfZmxhZ3M7CisJYXAtPm9wcyA9IGVudC0+cG9ydF9vcHM7CisJYXAtPmNibCA9IEFUQV9DQkxfTk9ORTsKKwlhcC0+YWN0aXZlX3RhZyA9IEFUQV9UQUdfUE9JU09OOworCWFwLT5sYXN0X2N0bCA9IDB4RkY7CisKKwlJTklUX1dPUksoJmFwLT5wYWNrZXRfdGFzaywgYXRhcGlfcGFja2V0X3Rhc2ssIGFwKTsKKwlJTklUX1dPUksoJmFwLT5waW9fdGFzaywgYXRhX3Bpb190YXNrLCBhcCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspCisJCWFwLT5kZXZpY2VbaV0uZGV2bm8gPSBpOworCisjaWZkZWYgQVRBX0lSUV9UUkFQCisJYXAtPnN0YXRzLnVuaGFuZGxlZF9pcnEgPSAxOworCWFwLT5zdGF0cy5pZGxlX2lycSA9IDE7CisjZW5kaWYKKworCW1lbWNweSgmYXAtPmlvYWRkciwgJmVudC0+cG9ydFtwb3J0X25vXSwgc2l6ZW9mKHN0cnVjdCBhdGFfaW9wb3J0cykpOworfQorCisvKioKKyAqCWF0YV9ob3N0X2FkZCAtIEF0dGFjaCBsb3ctbGV2ZWwgQVRBIGRyaXZlciB0byBzeXN0ZW0KKyAqCUBlbnQ6IEluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IGxvdy1sZXZlbCBkcml2ZXIKKyAqCUBob3N0X3NldDogQ29sbGVjdGlvbnMgb2YgcG9ydHMgdG8gd2hpY2ggd2UgYWRkCisgKglAcG9ydF9ubzogUG9ydCBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaG9zdAorICoKKyAqCUxPQ0tJTkc6CisgKgorICoJUkVUVVJOUzoKKyAqCisgKi8KKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydCAqIGF0YV9ob3N0X2FkZChzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqZW50LAorCQkJCSAgICAgIHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0LAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBwb3J0X25vKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IGF0YV9wb3J0ICphcDsKKwlpbnQgcmM7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYyhlbnQtPnNodCwgc2l6ZW9mKHN0cnVjdCBhdGFfcG9ydCkpOworCWlmICghaG9zdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlhcCA9IChzdHJ1Y3QgYXRhX3BvcnQgKikgJmhvc3QtPmhvc3RkYXRhWzBdOworCisJYXRhX2hvc3RfaW5pdChhcCwgaG9zdCwgaG9zdF9zZXQsIGVudCwgcG9ydF9ubyk7CisKKwlyYyA9IGFwLT5vcHMtPnBvcnRfc3RhcnQoYXApOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OworCisJcmV0dXJuIGFwOworCitlcnJfb3V0OgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICoJYXRhX2RldmljZV9hZGQgLQorICoJQGVudDoKKyAqCisgKglMT0NLSU5HOgorICoKKyAqCVJFVFVSTlM6CisgKgorICovCisKK2ludCBhdGFfZGV2aWNlX2FkZChzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqZW50KQoreworCXVuc2lnbmVkIGludCBjb3VudCA9IDAsIGk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZW50LT5kZXY7CisJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQ7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisJLyogYWxsb2MgYSBjb250YWluZXIgZm9yIG91ciBsaXN0IG9mIEFUQSBwb3J0cyAoYnVzZXMpICovCisJaG9zdF9zZXQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXRhX2hvc3Rfc2V0KSArCisJCQkgICAoZW50LT5uX3BvcnRzICogc2l6ZW9mKHZvaWQgKikpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhvc3Rfc2V0KQorCQlyZXR1cm4gMDsKKwltZW1zZXQoaG9zdF9zZXQsIDAsIHNpemVvZihzdHJ1Y3QgYXRhX2hvc3Rfc2V0KSArIChlbnQtPm5fcG9ydHMgKiBzaXplb2Yodm9pZCAqKSkpOworCXNwaW5fbG9ja19pbml0KCZob3N0X3NldC0+bG9jayk7CisKKwlob3N0X3NldC0+ZGV2ID0gZGV2OworCWhvc3Rfc2V0LT5uX3BvcnRzID0gZW50LT5uX3BvcnRzOworCWhvc3Rfc2V0LT5pcnEgPSBlbnQtPmlycTsKKwlob3N0X3NldC0+bW1pb19iYXNlID0gZW50LT5tbWlvX2Jhc2U7CisJaG9zdF9zZXQtPnByaXZhdGVfZGF0YSA9IGVudC0+cHJpdmF0ZV9kYXRhOworCWhvc3Rfc2V0LT5vcHMgPSBlbnQtPnBvcnRfb3BzOworCisJLyogcmVnaXN0ZXIgZWFjaCBwb3J0IGJvdW5kIHRvIHRoaXMgZGV2aWNlICovCisJZm9yIChpID0gMDsgaSA8IGVudC0+bl9wb3J0czsgaSsrKSB7CisJCXN0cnVjdCBhdGFfcG9ydCAqYXA7CisJCXVuc2lnbmVkIGxvbmcgeGZlcl9tb2RlX21hc2s7CisKKwkJYXAgPSBhdGFfaG9zdF9hZGQoZW50LCBob3N0X3NldCwgaSk7CisJCWlmICghYXApCisJCQlnb3RvIGVycl9vdXQ7CisKKwkJaG9zdF9zZXQtPnBvcnRzW2ldID0gYXA7CisJCXhmZXJfbW9kZV9tYXNrID0oYXAtPnVkbWFfbWFzayA8PCBBVEFfU0hJRlRfVURNQSkgfAorCQkJCShhcC0+bXdkbWFfbWFzayA8PCBBVEFfU0hJRlRfTVdETUEpIHwKKwkJCQkoYXAtPnBpb19tYXNrIDw8IEFUQV9TSElGVF9QSU8pOworCisJCS8qIHByaW50IHBlci1wb3J0IGluZm8gdG8gZG1lc2cgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiYXRhJXU6ICVjQVRBIG1heCAlcyBjbWQgMHglbFggY3RsIDB4JWxYICIKKwkJCQkgImJtZG1hIDB4JWxYIGlycSAlbHVcbiIsCisJCQlhcC0+aWQsCisJCQlhcC0+ZmxhZ3MgJiBBVEFfRkxBR19TQVRBID8gJ1MnIDogJ1AnLAorCQkJYXRhX21vZGVfc3RyaW5nKHhmZXJfbW9kZV9tYXNrKSwKKwkgICAgICAgCQlhcC0+aW9hZGRyLmNtZF9hZGRyLAorCSAgICAgICAJCWFwLT5pb2FkZHIuY3RsX2FkZHIsCisJICAgICAgIAkJYXAtPmlvYWRkci5ibWRtYV9hZGRyLAorCSAgICAgICAJCWVudC0+aXJxKTsKKworCQlhdGFfY2hrX3N0YXR1cyhhcCk7CisJCWhvc3Rfc2V0LT5vcHMtPmlycV9jbGVhcihhcCk7CisJCWNvdW50Kys7CisJfQorCisJaWYgKCFjb3VudCkgeworCQlrZnJlZShob3N0X3NldCk7CisJCXJldHVybiAwOworCX0KKworCS8qIG9idGFpbiBpcnEsIHRoYXQgaXMgc2hhcmVkIGJldHdlZW4gY2hhbm5lbHMgKi8KKwlpZiAocmVxdWVzdF9pcnEoZW50LT5pcnEsIGVudC0+cG9ydF9vcHMtPmlycV9oYW5kbGVyLCBlbnQtPmlycV9mbGFncywKKwkJCURSVl9OQU1FLCBob3N0X3NldCkpCisJCWdvdG8gZXJyX291dDsKKworCS8qIHBlcmZvcm0gZWFjaCBwcm9iZSBzeW5jaHJvbm91c2x5ICovCisJRFBSSU5USygicHJvYmUgYmVnaW5cbiIpOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXN0cnVjdCBhdGFfcG9ydCAqYXA7CisJCWludCByYzsKKworCQlhcCA9IGhvc3Rfc2V0LT5wb3J0c1tpXTsKKworCQlEUFJJTlRLKCJhdGEldTogcHJvYmUgYmVnaW5cbiIsIGFwLT5pZCk7CisJCXJjID0gYXRhX2J1c19wcm9iZShhcCk7CisJCURQUklOVEsoImF0YSV1OiBwcm9iZSBlbmRcbiIsIGFwLT5pZCk7CisKKwkJaWYgKHJjKSB7CisJCQkvKiBGSVhNRTogZG8gc29tZXRoaW5nIHVzZWZ1bCBoZXJlPworCQkJICogQ3VycmVudCBsaWJhdGEgYmVoYXZpb3Igd2lsbAorCQkJICogdGVhciBkb3duIGV2ZXJ5dGhpbmcgd2hlbgorCQkJICogdGhlIG1vZHVsZSBpcyByZW1vdmVkCisJCQkgKiBvciB0aGUgaC93IGlzIHVucGx1Z2dlZC4KKwkJCSAqLworCQl9CisKKwkJcmMgPSBzY3NpX2FkZF9ob3N0KGFwLT5ob3N0LCBkZXYpOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYXRhJXU6IHNjc2lfYWRkX2hvc3QgZmFpbGVkXG4iLAorCQkJICAgICAgIGFwLT5pZCk7CisJCQkvKiBGSVhNRTogZG8gc29tZXRoaW5nIHVzZWZ1bCBoZXJlICovCisJCQkvKiBGSVhNRTogaGFuZGxlIHVuY29uZGl0aW9uYWwgY2FsbHMgdG8KKwkJCSAqIHNjc2lfc2Nhbl9ob3N0IGFuZCBhdGFfaG9zdF9yZW1vdmUsIGJlbG93LAorCQkJICogYXQgdGhlIHZlcnkgbGVhc3QKKwkJCSAqLworCQl9CisJfQorCisJLyogcHJvYmVzIGFyZSBkb25lLCBub3cgc2NhbiBlYWNoIHBvcnQncyBkaXNrKHMpICovCisJRFBSSU5USygicHJvYmUgYmVnaW5cbiIpOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBob3N0X3NldC0+cG9ydHNbaV07CisKKwkJc2NzaV9zY2FuX2hvc3QoYXAtPmhvc3QpOworCX0KKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGhvc3Rfc2V0KTsKKworCVZQUklOVEsoIkVYSVQsIHJldHVybmluZyAldVxuIiwgZW50LT5uX3BvcnRzKTsKKwlyZXR1cm4gZW50LT5uX3BvcnRzOyAvKiBzdWNjZXNzICovCisKK2Vycl9vdXQ6CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJYXRhX2hvc3RfcmVtb3ZlKGhvc3Rfc2V0LT5wb3J0c1tpXSwgMSk7CisJCXNjc2lfaG9zdF9wdXQoaG9zdF9zZXQtPnBvcnRzW2ldLT5ob3N0KTsKKwl9CisJa2ZyZWUoaG9zdF9zZXQpOworCVZQUklOVEsoIkVYSVQsIHJldHVybmluZyAwXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhdGFfc2NzaV9yZWxlYXNlIC0gU0NTSSBsYXllciBjYWxsYmFjayBob29rIGZvciBob3N0IHVubG9hZAorICoJQGhvc3Q6IGxpYmF0YSBob3N0IHRvIGJlIHVubG9hZGVkCisgKgorICoJUGVyZm9ybXMgYWxsIGR1dGllcyBuZWNlc3NhcnkgdG8gc2h1dCBkb3duIGEgbGliYXRhIHBvcnQuLi4KKyAqCUtpbGwgcG9ydCBrdGhyZWFkLCBkaXNhYmxlIHBvcnQsIGFuZCByZWxlYXNlIHJlc291cmNlcy4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gU0NTSSBsYXllci4KKyAqCisgKglSRVRVUk5TOgorICoJT25lLgorICovCisKK2ludCBhdGFfc2NzaV9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IChzdHJ1Y3QgYXRhX3BvcnQgKikgJmhvc3QtPmhvc3RkYXRhWzBdOworCisJRFBSSU5USygiRU5URVJcbiIpOworCisJYXAtPm9wcy0+cG9ydF9kaXNhYmxlKGFwKTsKKwlhdGFfaG9zdF9yZW1vdmUoYXAsIDApOworCisJRFBSSU5USygiRVhJVFxuIik7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICoJYXRhX3N0ZF9wb3J0cyAtIGluaXRpYWxpemUgaW9hZGRyIHdpdGggc3RhbmRhcmQgcG9ydCBvZmZzZXRzLgorICoJQGlvYWRkcjogSU8gYWRkcmVzcyBzdHJ1Y3R1cmUgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqLwordm9pZCBhdGFfc3RkX3BvcnRzKHN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyKQoreworCWlvYWRkci0+ZGF0YV9hZGRyID0gaW9hZGRyLT5jbWRfYWRkciArIEFUQV9SRUdfREFUQTsKKwlpb2FkZHItPmVycm9yX2FkZHIgPSBpb2FkZHItPmNtZF9hZGRyICsgQVRBX1JFR19FUlI7CisJaW9hZGRyLT5mZWF0dXJlX2FkZHIgPSBpb2FkZHItPmNtZF9hZGRyICsgQVRBX1JFR19GRUFUVVJFOworCWlvYWRkci0+bnNlY3RfYWRkciA9IGlvYWRkci0+Y21kX2FkZHIgKyBBVEFfUkVHX05TRUNUOworCWlvYWRkci0+bGJhbF9hZGRyID0gaW9hZGRyLT5jbWRfYWRkciArIEFUQV9SRUdfTEJBTDsKKwlpb2FkZHItPmxiYW1fYWRkciA9IGlvYWRkci0+Y21kX2FkZHIgKyBBVEFfUkVHX0xCQU07CisJaW9hZGRyLT5sYmFoX2FkZHIgPSBpb2FkZHItPmNtZF9hZGRyICsgQVRBX1JFR19MQkFIOworCWlvYWRkci0+ZGV2aWNlX2FkZHIgPSBpb2FkZHItPmNtZF9hZGRyICsgQVRBX1JFR19ERVZJQ0U7CisJaW9hZGRyLT5zdGF0dXNfYWRkciA9IGlvYWRkci0+Y21kX2FkZHIgKyBBVEFfUkVHX1NUQVRVUzsKKwlpb2FkZHItPmNvbW1hbmRfYWRkciA9IGlvYWRkci0+Y21kX2FkZHIgKyBBVEFfUkVHX0NNRDsKK30KKworc3RhdGljIHN0cnVjdCBhdGFfcHJvYmVfZW50ICoKK2F0YV9wcm9iZV9lbnRfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydCkKK3sKKwlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50OworCisJcHJvYmVfZW50ID0ga21hbGxvYyhzaXplb2YoKnByb2JlX2VudCksIEdGUF9LRVJORUwpOworCWlmICghcHJvYmVfZW50KSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiKCVzKTogb3V0IG9mIG1lbW9yeVxuIiwKKwkJICAgICAgIGtvYmplY3RfbmFtZSgmKGRldi0+a29iaikpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHByb2JlX2VudCwgMCwgc2l6ZW9mKCpwcm9iZV9lbnQpKTsKKworCUlOSVRfTElTVF9IRUFEKCZwcm9iZV9lbnQtPm5vZGUpOworCXByb2JlX2VudC0+ZGV2ID0gZGV2OworCisJcHJvYmVfZW50LT5zaHQgPSBwb3J0LT5zaHQ7CisJcHJvYmVfZW50LT5ob3N0X2ZsYWdzID0gcG9ydC0+aG9zdF9mbGFnczsKKwlwcm9iZV9lbnQtPnBpb19tYXNrID0gcG9ydC0+cGlvX21hc2s7CisJcHJvYmVfZW50LT5td2RtYV9tYXNrID0gcG9ydC0+bXdkbWFfbWFzazsKKwlwcm9iZV9lbnQtPnVkbWFfbWFzayA9IHBvcnQtPnVkbWFfbWFzazsKKwlwcm9iZV9lbnQtPnBvcnRfb3BzID0gcG9ydC0+cG9ydF9vcHM7CisKKwlyZXR1cm4gcHJvYmVfZW50OworfQorCisjaWZkZWYgQ09ORklHX1BDSQorc3RydWN0IGF0YV9wcm9iZV9lbnQgKgorYXRhX3BjaV9pbml0X25hdGl2ZV9tb2RlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqKnBvcnQpCit7CisJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCA9CisJCWF0YV9wcm9iZV9lbnRfYWxsb2MocGNpX2Rldl90b19kZXYocGRldiksIHBvcnRbMF0pOworCWlmICghcHJvYmVfZW50KQorCQlyZXR1cm4gTlVMTDsKKworCXByb2JlX2VudC0+bl9wb3J0cyA9IDI7CisJcHJvYmVfZW50LT5pcnEgPSBwZGV2LT5pcnE7CisJcHJvYmVfZW50LT5pcnFfZmxhZ3MgPSBTQV9TSElSUTsKKworCXByb2JlX2VudC0+cG9ydFswXS5jbWRfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlwcm9iZV9lbnQtPnBvcnRbMF0uYWx0c3RhdHVzX2FkZHIgPQorCXByb2JlX2VudC0+cG9ydFswXS5jdGxfYWRkciA9CisJCXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKSB8IEFUQV9QQ0lfQ1RMX09GUzsKKwlwcm9iZV9lbnQtPnBvcnRbMF0uYm1kbWFfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA0KTsKKworCXByb2JlX2VudC0+cG9ydFsxXS5jbWRfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKKwlwcm9iZV9lbnQtPnBvcnRbMV0uYWx0c3RhdHVzX2FkZHIgPQorCXByb2JlX2VudC0+cG9ydFsxXS5jdGxfYWRkciA9CisJCXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKSB8IEFUQV9QQ0lfQ1RMX09GUzsKKwlwcm9iZV9lbnQtPnBvcnRbMV0uYm1kbWFfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA0KSArIDg7CisKKwlhdGFfc3RkX3BvcnRzKCZwcm9iZV9lbnQtPnBvcnRbMF0pOworCWF0YV9zdGRfcG9ydHMoJnByb2JlX2VudC0+cG9ydFsxXSk7CisKKwlyZXR1cm4gcHJvYmVfZW50OworfQorCitzdGF0aWMgc3RydWN0IGF0YV9wcm9iZV9lbnQgKgorYXRhX3BjaV9pbml0X2xlZ2FjeV9tb2RlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqKnBvcnQsCisgICAgc3RydWN0IGF0YV9wcm9iZV9lbnQgKipwcGUyKQoreworCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQsICpwcm9iZV9lbnQyOworCisJcHJvYmVfZW50ID0gYXRhX3Byb2JlX2VudF9hbGxvYyhwY2lfZGV2X3RvX2RldihwZGV2KSwgcG9ydFswXSk7CisJaWYgKCFwcm9iZV9lbnQpCisJCXJldHVybiBOVUxMOworCXByb2JlX2VudDIgPSBhdGFfcHJvYmVfZW50X2FsbG9jKHBjaV9kZXZfdG9fZGV2KHBkZXYpLCBwb3J0WzFdKTsKKwlpZiAoIXByb2JlX2VudDIpIHsKKwkJa2ZyZWUocHJvYmVfZW50KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcHJvYmVfZW50LT5uX3BvcnRzID0gMTsKKwlwcm9iZV9lbnQtPmlycSA9IDE0OworCisJcHJvYmVfZW50LT5oYXJkX3BvcnRfbm8gPSAwOworCXByb2JlX2VudC0+bGVnYWN5X21vZGUgPSAxOworCisJcHJvYmVfZW50Mi0+bl9wb3J0cyA9IDE7CisJcHJvYmVfZW50Mi0+aXJxID0gMTU7CisKKwlwcm9iZV9lbnQyLT5oYXJkX3BvcnRfbm8gPSAxOworCXByb2JlX2VudDItPmxlZ2FjeV9tb2RlID0gMTsKKworCXByb2JlX2VudC0+cG9ydFswXS5jbWRfYWRkciA9IDB4MWYwOworCXByb2JlX2VudC0+cG9ydFswXS5hbHRzdGF0dXNfYWRkciA9CisJcHJvYmVfZW50LT5wb3J0WzBdLmN0bF9hZGRyID0gMHgzZjY7CisJcHJvYmVfZW50LT5wb3J0WzBdLmJtZG1hX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNCk7CisKKwlwcm9iZV9lbnQyLT5wb3J0WzBdLmNtZF9hZGRyID0gMHgxNzA7CisJcHJvYmVfZW50Mi0+cG9ydFswXS5hbHRzdGF0dXNfYWRkciA9CisJcHJvYmVfZW50Mi0+cG9ydFswXS5jdGxfYWRkciA9IDB4Mzc2OworCXByb2JlX2VudDItPnBvcnRbMF0uYm1kbWFfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA0KSs4OworCisJYXRhX3N0ZF9wb3J0cygmcHJvYmVfZW50LT5wb3J0WzBdKTsKKwlhdGFfc3RkX3BvcnRzKCZwcm9iZV9lbnQyLT5wb3J0WzBdKTsKKworCSpwcGUyID0gcHJvYmVfZW50MjsKKwlyZXR1cm4gcHJvYmVfZW50OworfQorCisvKioKKyAqCWF0YV9wY2lfaW5pdF9vbmUgLSBJbml0aWFsaXplL3JlZ2lzdGVyIFBDSSBJREUgaG9zdCBjb250cm9sbGVyCisgKglAcGRldjogQ29udHJvbGxlciB0byBiZSBpbml0aWFsaXplZAorICoJQHBvcnRfaW5mbzogSW5mb3JtYXRpb24gZnJvbSBsb3ctbGV2ZWwgaG9zdCBkcml2ZXIKKyAqCUBuX3BvcnRzOiBOdW1iZXIgb2YgcG9ydHMgYXR0YWNoZWQgdG8gaG9zdCBjb250cm9sbGVyCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIFBDSSBsYXllciAobWF5IHNsZWVwKS4KKyAqCisgKglSRVRVUk5TOgorICoKKyAqLworCitpbnQgYXRhX3BjaV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBhdGFfcG9ydF9pbmZvICoqcG9ydF9pbmZvLAorCQkgICAgICB1bnNpZ25lZCBpbnQgbl9wb3J0cykKK3sKKwlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50LCAqcHJvYmVfZW50MiA9IE5VTEw7CisJc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRbMl07CisJdTggdG1wOCwgbWFzazsKKwl1bnNpZ25lZCBpbnQgbGVnYWN5X21vZGUgPSAwOworCWludCBkaXNhYmxlX2Rldl9vbl9lcnIgPSAxOworCWludCByYzsKKworCURQUklOVEsoIkVOVEVSXG4iKTsKKworCXBvcnRbMF0gPSBwb3J0X2luZm9bMF07CisJaWYgKG5fcG9ydHMgPiAxKQorCQlwb3J0WzFdID0gcG9ydF9pbmZvWzFdOworCWVsc2UKKwkJcG9ydFsxXSA9IHBvcnRbMF07CisKKwlpZiAoKHBvcnRbMF0tPmhvc3RfZmxhZ3MgJiBBVEFfRkxBR19OT19MRUdBQ1kpID09IDAKKwkgICAgJiYgKHBkZXYtPmNsYXNzID4+IDgpID09IFBDSV9DTEFTU19TVE9SQUdFX0lERSkgeworCQkvKiBUT0RPOiBzdXBwb3J0IHRyYW5zaXRpb25pbmcgdG8gbmF0aXZlIG1vZGU/ICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DTEFTU19QUk9HLCAmdG1wOCk7CisJCW1hc2sgPSAoMSA8PCAyKSB8ICgxIDw8IDApOworCQlpZiAoKHRtcDggJiBtYXNrKSAhPSBtYXNrKQorCQkJbGVnYWN5X21vZGUgPSAoMSA8PCAzKTsKKwl9CisKKwkvKiBGSVhNRS4uLiAqLworCWlmICgoIWxlZ2FjeV9tb2RlKSAmJiAobl9wb3J0cyA+IDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXRhOiBCVUc6IG5hdGl2ZSBtb2RlLCBuX3BvcnRzID4gMVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChyYykgeworCQlkaXNhYmxlX2Rldl9vbl9lcnIgPSAwOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJaWYgKGxlZ2FjeV9tb2RlKSB7CisJCWlmICghcmVxdWVzdF9yZWdpb24oMHgxZjAsIDgsICJsaWJhdGEiKSkgeworCQkJc3RydWN0IHJlc291cmNlICpjb25mbGljdCwgcmVzOworCQkJcmVzLnN0YXJ0ID0gMHgxZjA7CisJCQlyZXMuZW5kID0gMHgxZjAgKyA4IC0gMTsKKwkJCWNvbmZsaWN0ID0gX19fX3JlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgJnJlcyk7CisJCQlpZiAoIXN0cmNtcChjb25mbGljdC0+bmFtZSwgImxpYmF0YSIpKQorCQkJCWxlZ2FjeV9tb2RlIHw9ICgxIDw8IDApOworCQkJZWxzZSB7CisJCQkJZGlzYWJsZV9kZXZfb25fZXJyID0gMDsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdGE6IDB4MWYwIElERSBwb3J0IGJ1c3lcbiIpOworCQkJfQorCQl9IGVsc2UKKwkJCWxlZ2FjeV9tb2RlIHw9ICgxIDw8IDApOworCisJCWlmICghcmVxdWVzdF9yZWdpb24oMHgxNzAsIDgsICJsaWJhdGEiKSkgeworCQkJc3RydWN0IHJlc291cmNlICpjb25mbGljdCwgcmVzOworCQkJcmVzLnN0YXJ0ID0gMHgxNzA7CisJCQlyZXMuZW5kID0gMHgxNzAgKyA4IC0gMTsKKwkJCWNvbmZsaWN0ID0gX19fX3JlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgJnJlcyk7CisJCQlpZiAoIXN0cmNtcChjb25mbGljdC0+bmFtZSwgImxpYmF0YSIpKQorCQkJCWxlZ2FjeV9tb2RlIHw9ICgxIDw8IDEpOworCQkJZWxzZSB7CisJCQkJZGlzYWJsZV9kZXZfb25fZXJyID0gMDsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdGE6IDB4MTcwIElERSBwb3J0IGJ1c3lcbiIpOworCQkJfQorCQl9IGVsc2UKKwkJCWxlZ2FjeV9tb2RlIHw9ICgxIDw8IDEpOworCX0KKworCS8qIHdlIGhhdmUgbGVnYWN5IG1vZGUsIGJ1dCBhbGwgcG9ydHMgYXJlIHVuYXZhaWxhYmxlICovCisJaWYgKGxlZ2FjeV9tb2RlID09ICgxIDw8IDMpKSB7CisJCXJjID0gLUVCVVNZOworCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwl9CisKKwlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKworCWlmIChsZWdhY3lfbW9kZSkgeworCQlwcm9iZV9lbnQgPSBhdGFfcGNpX2luaXRfbGVnYWN5X21vZGUocGRldiwgcG9ydCwgJnByb2JlX2VudDIpOworCX0gZWxzZQorCQlwcm9iZV9lbnQgPSBhdGFfcGNpX2luaXRfbmF0aXZlX21vZGUocGRldiwgcG9ydCk7CisJaWYgKCFwcm9iZV9lbnQpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCS8qIEZJWE1FOiBjaGVjayBhdGFfZGV2aWNlX2FkZCByZXR1cm4gKi8KKwlpZiAobGVnYWN5X21vZGUpIHsKKwkJaWYgKGxlZ2FjeV9tb2RlICYgKDEgPDwgMCkpCisJCQlhdGFfZGV2aWNlX2FkZChwcm9iZV9lbnQpOworCQlpZiAobGVnYWN5X21vZGUgJiAoMSA8PCAxKSkKKwkJCWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudDIpOworCX0gZWxzZQorCQlhdGFfZGV2aWNlX2FkZChwcm9iZV9lbnQpOworCisJa2ZyZWUocHJvYmVfZW50KTsKKwlrZnJlZShwcm9iZV9lbnQyKTsKKworCXJldHVybiAwOworCitlcnJfb3V0X3JlZ2lvbnM6CisJaWYgKGxlZ2FjeV9tb2RlICYgKDEgPDwgMCkpCisJCXJlbGVhc2VfcmVnaW9uKDB4MWYwLCA4KTsKKwlpZiAobGVnYWN5X21vZGUgJiAoMSA8PCAxKSkKKwkJcmVsZWFzZV9yZWdpb24oMHgxNzAsIDgpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfb3V0OgorCWlmIChkaXNhYmxlX2Rldl9vbl9lcnIpCisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoJYXRhX3BjaV9yZW1vdmVfb25lIC0gUENJIGxheWVyIGNhbGxiYWNrIGZvciBkZXZpY2UgcmVtb3ZhbAorICoJQHBkZXY6IFBDSSBkZXZpY2UgdGhhdCB3YXMgcmVtb3ZlZAorICoKKyAqCVBDSSBsYXllciBpbmRpY2F0ZXMgdG8gbGliYXRhIHZpYSB0aGlzIGhvb2sgdGhhdAorICoJaG90LXVucGx1ZyBvciBtb2R1bGUgdW5sb2FkIGV2ZW50IGhhcyBvY2N1cmVkLgorICoJSGFuZGxlIHRoaXMgYnkgdW5yZWdpc3RlcmluZyBhbGwgb2JqZWN0cyBhc3NvY2lhdGVkCisgKgl3aXRoIHRoaXMgUENJIGRldmljZS4gIEZyZWUgdGhvc2Ugb2JqZWN0cy4gIFRoZW4gZmluYWxseQorICoJcmVsZWFzZSBQQ0kgcmVzb3VyY2VzIGFuZCBkaXNhYmxlIGRldmljZS4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gUENJIGxheWVyIChtYXkgc2xlZXApLgorICovCisKK3ZvaWQgYXRhX3BjaV9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwY2lfZGV2X3RvX2RldihwZGV2KTsKKwlzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhdGFfcG9ydCAqYXA7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaG9zdF9zZXQtPm5fcG9ydHM7IGkrKykgeworCQlhcCA9IGhvc3Rfc2V0LT5wb3J0c1tpXTsKKworCQlzY3NpX3JlbW92ZV9ob3N0KGFwLT5ob3N0KTsKKwl9CisKKwlmcmVlX2lycShob3N0X3NldC0+aXJxLCBob3N0X3NldCk7CisJaWYgKGhvc3Rfc2V0LT5vcHMtPmhvc3Rfc3RvcCkKKwkJaG9zdF9zZXQtPm9wcy0+aG9zdF9zdG9wKGhvc3Rfc2V0KTsKKwlpZiAoaG9zdF9zZXQtPm1taW9fYmFzZSkKKwkJaW91bm1hcChob3N0X3NldC0+bW1pb19iYXNlKTsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0X3NldC0+bl9wb3J0czsgaSsrKSB7CisJCWFwID0gaG9zdF9zZXQtPnBvcnRzW2ldOworCisJCWF0YV9zY3NpX3JlbGVhc2UoYXAtPmhvc3QpOworCisJCWlmICgoYXAtPmZsYWdzICYgQVRBX0ZMQUdfTk9fTEVHQUNZKSA9PSAwKSB7CisJCQlzdHJ1Y3QgYXRhX2lvcG9ydHMgKmlvYWRkciA9ICZhcC0+aW9hZGRyOworCisJCQlpZiAoaW9hZGRyLT5jbWRfYWRkciA9PSAweDFmMCkKKwkJCQlyZWxlYXNlX3JlZ2lvbigweDFmMCwgOCk7CisJCQllbHNlIGlmIChpb2FkZHItPmNtZF9hZGRyID09IDB4MTcwKQorCQkJCXJlbGVhc2VfcmVnaW9uKDB4MTcwLCA4KTsKKwkJfQorCisJCXNjc2lfaG9zdF9wdXQoYXAtPmhvc3QpOworCX0KKworCWtmcmVlKGhvc3Rfc2V0KTsKKworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworfQorCisvKiBtb3ZlIHRvIFBDSSBzdWJzeXN0ZW0gKi8KK2ludCBwY2lfdGVzdF9jb25maWdfYml0cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHBjaV9iaXRzICpiaXRzKQoreworCXVuc2lnbmVkIGxvbmcgdG1wID0gMDsKKworCXN3aXRjaCAoYml0cy0+d2lkdGgpIHsKKwljYXNlIDE6IHsKKwkJdTggdG1wOCA9IDA7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIGJpdHMtPnJlZywgJnRtcDgpOworCQl0bXAgPSB0bXA4OworCQlicmVhazsKKwl9CisJY2FzZSAyOiB7CisJCXUxNiB0bXAxNiA9IDA7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIGJpdHMtPnJlZywgJnRtcDE2KTsKKwkJdG1wID0gdG1wMTY7CisJCWJyZWFrOworCX0KKwljYXNlIDQ6IHsKKwkJdTMyIHRtcDMyID0gMDsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGJpdHMtPnJlZywgJnRtcDMyKTsKKwkJdG1wID0gdG1wMzI7CisJCWJyZWFrOworCX0KKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRtcCAmPSBiaXRzLT5tYXNrOworCisJcmV0dXJuICh0bXAgPT0gYml0cy0+dmFsKSA/IDEgOiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworCisvKioKKyAqCWF0YV9pbml0IC0KKyAqCisgKglMT0NLSU5HOgorICoKKyAqCVJFVFVSTlM6CisgKgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGF0YV9pbml0KHZvaWQpCit7CisJYXRhX3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgiYXRhIik7CisJaWYgKCFhdGFfd3EpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpbnRrKEtFUk5fREVCVUcgImxpYmF0YSB2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIiBsb2FkZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF0YV9leGl0KHZvaWQpCit7CisJZGVzdHJveV93b3JrcXVldWUoYXRhX3dxKTsKK30KKworbW9kdWxlX2luaXQoYXRhX2luaXQpOworbW9kdWxlX2V4aXQoYXRhX2V4aXQpOworCisvKgorICogbGliYXRhIGlzIGVzc2VudGlhbGx5IGEgbGlicmFyeSBvZiBpbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zIGZvcgorICogbG93LWxldmVsIEFUQSBob3N0IGNvbnRyb2xsZXIgZHJpdmVycy4gIEFzIHN1Y2gsIHRoZSBBUEkvQUJJIGlzCisgKiBsaWtlbHkgdG8gY2hhbmdlIGFzIG5ldyBkcml2ZXJzIGFyZSBhZGRlZCBhbmQgdXBkYXRlZC4KKyAqIERvIG5vdCBkZXBlbmQgb24gQUJJL0FQSSBzdGFiaWxpdHkuCisgKi8KKworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3N0ZF9iaW9zX3BhcmFtKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zdGRfcG9ydHMpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2RldmljZV9hZGQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NnX2luaXQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NnX2luaXRfb25lKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9xY19jb21wbGV0ZSk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfcWNfaXNzdWVfcHJvdCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfZW5nX3RpbWVvdXQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3RmX2xvYWQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3RmX3JlYWQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX25vb3BfZGV2X3NlbGVjdCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc3RkX2Rldl9zZWxlY3QpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3RmX3RvX2Zpcyk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfdGZfZnJvbV9maXMpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2NoZWNrX3N0YXR1cyk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfYWx0c3RhdHVzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9jaGtfZXJyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9leGVjX2NvbW1hbmQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BvcnRfc3RhcnQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BvcnRfc3RvcCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfaW50ZXJydXB0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9xY19wcmVwKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9zZXR1cCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfYm1kbWFfc3RhcnQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2JtZG1hX2lycV9jbGVhcik7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfYm1kbWFfc3RhdHVzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9zdG9wKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9wb3J0X3Byb2JlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNhdGFfcGh5X3Jlc2V0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKF9fc2F0YV9waHlfcmVzZXQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2J1c19yZXNldCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfcG9ydF9kaXNhYmxlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX2lvY3RsKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX3F1ZXVlY21kKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX2Vycm9yKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX3NsYXZlX2NvbmZpZyk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2NzaV9yZWxlYXNlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9ob3N0X2ludHIpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2Rldl9jbGFzc2lmeSk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfZGV2X2lkX3N0cmluZyk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2NzaV9zaW11bGF0ZSk7CisKKyNpZmRlZiBDT05GSUdfUENJCitFWFBPUlRfU1lNQk9MX0dQTChwY2lfdGVzdF9jb25maWdfYml0cyk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX2luaXRfbmF0aXZlX21vZGUpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BjaV9pbml0X29uZSk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX3JlbW92ZV9vbmUpOworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJhdGEtc2NzaS5jIGIvZHJpdmVycy9zY3NpL2xpYmF0YS1zY3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU1ZTU0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9saWJhdGEtc2NzaS5jCkBAIC0wLDAgKzEsMTU5MyBAQAorLyoKKyAgIGxpYmF0YS1zY3NpLmMgLSBoZWxwZXIgbGlicmFyeSBmb3IgQVRBCisKKyAgIENvcHlyaWdodCAyMDAzLTIwMDQgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgIENvcHlyaWdodCAyMDAzLTIwMDQgSmVmZiBHYXJ6aWsKKworICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgT3BlbgorICAgU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMSB0aGF0IGNhbiBiZSBmb3VuZCBhdAorICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMS4xLnR4dCBhbmQgaXMgaW5jbHVkZWQgaGVyZWluCisgICBieSByZWZlcmVuY2UuCisKKyAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCisgICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpIGFzIGRpc3RyaWJ1dGVkCisgICBpbiB0aGUga2VybmVsIHNvdXJjZSBDT1BZSU5HIGZpbGUsIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YKKyAgIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdworICAgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICAgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCisgICB0aGUgT1NMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZAorICAgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLgorICAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91cgorICAgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBPU0wgb3IgdGhlIEdQTC4KKworICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJsaWJhdGEuaCIKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgKCphdGFfeGxhdF9mdW5jX3QpKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsIHU4ICpzY3NpY21kKTsKK3N0YXRpYyBzdHJ1Y3QgYXRhX2RldmljZSAqCithdGFfc2NzaV9maW5kX2RldihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkZXYpOworCisKKy8qKgorICoJYXRhX3N0ZF9iaW9zX3BhcmFtIC0gZ2VuZXJpYyBiaW9zIGhlYWQvc2VjdG9yL2N5bGluZGVyIGNhbGN1bGF0b3IgdXNlZCBieSBzZC4KKyAqCUBzZGV2OiBTQ1NJIGRldmljZSBmb3Igd2hpY2ggQklPUyBnZW9tZXRyeSBpcyB0byBiZSBkZXRlcm1pbmVkCisgKglAYmRldjogYmxvY2sgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBAc2RldgorICoJQGNhcGFjaXR5OiBjYXBhY2l0eSBvZiBTQ1NJIGRldmljZQorICoJQGdlb206IGxvY2F0aW9uIHRvIHdoaWNoIGdlb21ldHJ5IHdpbGwgYmUgb3V0cHV0CisgKgorICoJR2VuZXJpYyBiaW9zIGhlYWQvc2VjdG9yL2N5bGluZGVyIGNhbGN1bGF0b3IKKyAqCXVzZWQgYnkgc2QuIE1vc3QgQklPU2VzIG5vd2FkYXlzIGV4cGVjdCBhIFhYWC8yNTUvMTYgIChDSFMpCisgKgltYXBwaW5nLiBTb21lIHNpdHVhdGlvbnMgbWF5IGFyaXNlIHdoZXJlIHRoZSBkaXNrIGlzIG5vdAorICoJYm9vdGFibGUgaWYgdGhpcyBpcyBub3QgdXNlZC4KKyAqCisgKglMT0NLSU5HOgorICoJRGVmaW5lZCBieSB0aGUgU0NTSSBsYXllci4gIFdlIGRvbid0IHJlYWxseSBjYXJlLgorICoKKyAqCVJFVFVSTlM6CisgKglaZXJvLgorICovCitpbnQgYXRhX3N0ZF9iaW9zX3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJICAgICAgIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgZ2VvbVtdKQoreworCWdlb21bMF0gPSAyNTU7CisJZ2VvbVsxXSA9IDYzOworCXNlY3Rvcl9kaXYoY2FwYWNpdHksIDI1NSo2Myk7CisJZ2VvbVsyXSA9IGNhcGFjaXR5OworCisJcmV0dXJuIDA7Cit9CisKK2ludCBhdGFfc2NzaV9pb2N0bChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkZXYsIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcDsKKwlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OworCWludCB2YWwgPSAtRUlOVkFMLCByYyA9IC1FSU5WQUw7CisKKwlhcCA9IChzdHJ1Y3QgYXRhX3BvcnQgKikgJnNjc2lkZXYtPmhvc3QtPmhvc3RkYXRhWzBdOworCWlmICghYXApCisJCWdvdG8gb3V0OworCisJZGV2ID0gYXRhX3Njc2lfZmluZF9kZXYoYXAsIHNjc2lkZXYpOworCWlmICghZGV2KSB7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFUQV9JT0NfR0VUX0lPMzI6CisJCXZhbCA9IDA7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmdmFsLCAxKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgQVRBX0lPQ19TRVRfSU8zMjoKKwkJdmFsID0gKHVuc2lnbmVkIGxvbmcpIGFyZzsKKwkJaWYgKHZhbCAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmMgPSAtRU5PVFRZOworCQlicmVhazsKKwl9CisKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoJYXRhX3Njc2lfcWNfbmV3IC0gYWNxdWlyZSBuZXcgYXRhX3F1ZXVlZF9jbWQgcmVmZXJlbmNlCisgKglAYXA6IEFUQSBwb3J0IHRvIHdoaWNoIHRoZSBuZXcgY29tbWFuZCBpcyBhdHRhY2hlZAorICoJQGRldjogQVRBIGRldmljZSB0byB3aGljaCB0aGUgbmV3IGNvbW1hbmQgaXMgYXR0YWNoZWQKKyAqCUBjbWQ6IFNDU0kgY29tbWFuZCB0aGF0IG9yaWdpbmF0ZWQgdGhpcyBBVEEgY29tbWFuZAorICoJQGRvbmU6IFNDU0kgY29tbWFuZCBjb21wbGV0aW9uIGZ1bmN0aW9uCisgKgorICoJT2J0YWluIGEgcmVmZXJlbmNlIHRvIGFuIHVudXNlZCBhdGFfcXVldWVkX2NtZCBzdHJ1Y3R1cmUsCisgKgl3aGljaCBpcyB0aGUgYmFzaWMgbGliYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSBzaW5nbGUKKyAqCUFUQSBjb21tYW5kIHNlbnQgdG8gdGhlIGhhcmR3YXJlLgorICoKKyAqCUlmIGEgY29tbWFuZCB3YXMgYXZhaWxhYmxlLCBmaWxsIGluIHRoZSBTQ1NJLXNwZWNpZmljCisgKglwb3J0aW9ucyBvZiB0aGUgc3RydWN0dXJlIHdpdGggaW5mb3JtYXRpb24gb24gdGhlCisgKgljdXJyZW50IGNvbW1hbmQuCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKgorICoJUkVUVVJOUzoKKyAqCUNvbW1hbmQgYWxsb2NhdGVkLCBvciAlTlVMTCBpZiBub25lIGF2YWlsYWJsZS4KKyAqLworc3RydWN0IGF0YV9xdWV1ZWRfY21kICphdGFfc2NzaV9xY19uZXcoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQkgICAgICAgc3RydWN0IGF0YV9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJCSAgICAgICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCisJcWMgPSBhdGFfcWNfbmV3X2luaXQoYXAsIGRldik7CisJaWYgKHFjKSB7CisJCXFjLT5zY3NpY21kID0gY21kOworCQlxYy0+c2NzaWRvbmUgPSBkb25lOworCisJCWlmIChjbWQtPnVzZV9zZykgeworCQkJcWMtPnNnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCQkJcWMtPm5fZWxlbSA9IGNtZC0+dXNlX3NnOworCQl9IGVsc2UgeworCQkJcWMtPnNnID0gJnFjLT5zZ2VudDsKKwkJCXFjLT5uX2VsZW0gPSAxOworCQl9CisJfSBlbHNlIHsKKwkJY21kLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KSB8IChRVUVVRV9GVUxMIDw8IDEpOworCQlkb25lKGNtZCk7CisJfQorCisJcmV0dXJuIHFjOworfQorCisvKioKKyAqCWF0YV90b19zZW5zZV9lcnJvciAtIGNvbnZlcnQgQVRBIGVycm9yIHRvIFNDU0kgZXJyb3IKKyAqCUBxYzogQ29tbWFuZCB0aGF0IHdlIGFyZSBlcnJvcmluZyBvdXQKKyAqCUBkcnZfc3RhdDogdmFsdWUgY29udGFpbmVkIGluIEFUQSBzdGF0dXMgcmVnaXN0ZXIKKyAqCisgKglDb252ZXJ0cyBhbiBBVEEgZXJyb3IgaW50byBhIFNDU0kgZXJyb3IuIFdoaWxlIHdlIGFyZSBhdCBpdAorICoJd2UgZGVjb2RlIGFuZCBkdW1wIHRoZSBBVEEgZXJyb3IgZm9yIHRoZSB1c2VyIHNvIHRoYXQgdGhleQorICoJaGF2ZSBzb21lIGlkZWEgd2hhdCByZWFsbHkgaGFwcGVuZWQgYXQgdGhlIG5vbiBtYWtlLWJlbGlldmUKKyAqCWxheWVyLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3ZvaWQgYXRhX3RvX3NlbnNlX2Vycm9yKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsIHU4IGRydl9zdGF0KQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHFjLT5zY3NpY21kOworCXU4IGVyciA9IDA7CisJdW5zaWduZWQgY2hhciAqc2IgPSBjbWQtPnNlbnNlX2J1ZmZlcjsKKwkvKiBCYXNlZCBvbiB0aGUgM3dhcmUgZHJpdmVyIHRyYW5zbGF0aW9uIHRhYmxlICovCisJc3RhdGljIHVuc2lnbmVkIGNoYXIgc2Vuc2VfdGFibGVbXVs0XSA9IHsKKwkJLyogQkJEfEVDQ3xJRHxNQVIgKi8KKwkJezB4ZDEsIAkJQUJPUlRFRF9DT01NQU5ELCAweDAwLCAweDAwfSwgCS8vIERldmljZSBidXN5ICAgICAgICAgICAgICAgICAgQWJvcnRlZCBjb21tYW5kCisJCS8qIEJCRHxFQ0N8SUQgKi8KKwkJezB4ZDAsICAJQUJPUlRFRF9DT01NQU5ELCAweDAwLCAweDAwfSwgCS8vIERldmljZSBidXN5ICAgICAgICAgICAgICAgICAgQWJvcnRlZCBjb21tYW5kCisJCS8qIEVDQ3xNQ3xNQVJLICovCisJCXsweDYxLCAJCUhBUkRXQVJFX0VSUk9SLCAweDAwLCAweDAwfSwgCS8vIERldmljZSBmYXVsdCAgICAgICAgICAgICAgICAgSGFyZHdhcmUgZXJyb3IKKwkJLyogSUNSQ3xBQlJUICovCQkvKiBOQjogSUNSQyAmICFBQlJUIGlzIEJCRCAqLworCQl7MHg4NCwgCQlBQk9SVEVEX0NPTU1BTkQsIDB4NDcsIDB4MDB9LCAJLy8gRGF0YSBDUkMgZXJyb3IgICAgICAgICAgICAgICBTQ1NJIHBhcml0eSBlcnJvcgorCQkvKiBNQ3xJRHxBQlJUfFRSSzB8TUFSSyAqLworCQl7MHgzNywgCQlOT1RfUkVBRFksIDB4MDQsIDB4MDB9LCAJLy8gVW5pdCBvZmZsaW5lICAgICAgICAgICAgICAgICBOb3QgcmVhZHkKKwkJLyogTUNSfE1BUksgKi8KKwkJezB4MDksIAkJTk9UX1JFQURZLCAweDA0LCAweDAwfSwgCS8vIFVucmVjb3ZlcmVkIGRpc2sgZXJyb3IgICAgICAgTm90IHJlYWR5CisJCS8qICBCYWQgYWRkcmVzcyBtYXJrICovCisJCXsweDAxLCAJCU1FRElVTV9FUlJPUiwgMHgxMywgMHgwMH0sIAkvLyBBZGRyZXNzIG1hcmsgbm90IGZvdW5kICAgICAgIEFkZHJlc3MgbWFyayBub3QgZm91bmQgZm9yIGRhdGEgZmllbGQKKwkJLyogVFJLMCAqLworCQl7MHgwMiwgCQlIQVJEV0FSRV9FUlJPUiwgMHgwMCwgMHgwMH0sIAkvLyBUcmFjayAwIG5vdCBmb3VuZAkJICBIYXJkd2FyZSBlcnJvcgorCQkvKiBBYm9ydCAmICFJQ1JDICovCisJCXsweDA0LCAJCUFCT1JURURfQ09NTUFORCwgMHgwMCwgMHgwMH0sIAkvLyBBYm9ydGVkIGNvbW1hbmQgICAgICAgICAgICAgIEFib3J0ZWQgY29tbWFuZAorCQkvKiBNZWRpYSBjaGFuZ2UgcmVxdWVzdCAqLworCQl7MHgwOCwgCQlOT1RfUkVBRFksIDB4MDQsIDB4MDB9LCAJLy8gTWVkaWEgY2hhbmdlIHJlcXVlc3QJICBGSVhNRTogZmFraW5nIG9mZmxpbmUKKwkJLyogU1JWICovCisJCXsweDEwLCAJCUFCT1JURURfQ09NTUFORCwgMHgxNCwgMHgwMH0sIAkvLyBJRCBub3QgZm91bmQgICAgICAgICAgICAgICAgIFJlY29yZGVkIGVudGl0eSBub3QgZm91bmQKKwkJLyogTWVkaWEgY2hhbmdlICovCisJCXsweDA4LCAgCU5PVF9SRUFEWSwgMHgwNCwgMHgwMH0sIAkvLyBNZWRpYSBjaGFuZ2UJCSAgRklYTUU6IGZha2luZyBvZmZsaW5lCisJCS8qIEVDQyAqLworCQl7MHg0MCwgCQlNRURJVU1fRVJST1IsIDB4MTEsIDB4MDR9LCAJLy8gVW5jb3JyZWN0YWJsZSBFQ0MgZXJyb3IgICAgICBVbnJlY292ZXJlZCByZWFkIGVycm9yCisJCS8qIEJCRCAtIGJsb2NrIG1hcmtlZCBiYWQgKi8KKwkJezB4ODAsIAkJTUVESVVNX0VSUk9SLCAweDExLCAweDA0fSwgCS8vIEJsb2NrIG1hcmtlZCBiYWQJCSAgTWVkaXVtIGVycm9yLCB1bnJlY292ZXJlZCByZWFkIGVycm9yCisJCXsweEZGLCAweEZGLCAweEZGLCAweEZGfSwgLy8gRU5EIG1hcmsKKwl9OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHN0YXRfdGFibGVbXVs0XSA9IHsKKwkJLyogTXVzdCBiZSBmaXJzdCBiZWNhdXNlIEJVU1kgbWVhbnMgbm8gb3RoZXIgYml0cyB2YWxpZCAqLworCQl7MHg4MCwgCQlBQk9SVEVEX0NPTU1BTkQsIDB4NDcsIDB4MDB9LAkvLyBCdXN5LCBmYWtlIHBhcml0eSBmb3Igbm93CisJCXsweDIwLCAJCUhBUkRXQVJFX0VSUk9SLCAgMHgwMCwgMHgwMH0sIAkvLyBEZXZpY2UgZmF1bHQKKwkJezB4MDgsIAkJQUJPUlRFRF9DT01NQU5ELCAweDQ3LCAweDAwfSwJLy8gVGltZWQgb3V0IGluIHhmZXIsIGZha2UgcGFyaXR5IGZvciBub3cKKwkJezB4MDQsIAkJUkVDT1ZFUkVEX0VSUk9SLCAweDExLCAweDAwfSwJLy8gUmVjb3ZlcmVkIEVDQyBlcnJvcgkgIE1lZGl1bSBlcnJvciwgcmVjb3ZlcmVkCisJCXsweEZGLCAweEZGLCAweEZGLCAweEZGfSwgLy8gRU5EIG1hcmsKKwl9OworCWludCBpID0gMDsKKworCWNtZC0+cmVzdWx0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCisJLyoKKwkgKglJcyB0aGlzIGFuIGVycm9yIHdlIGNhbiBwcm9jZXNzL3BhcnNlCisJICovCisKKwlpZihkcnZfc3RhdCAmIEFUQV9FUlIpCisJCS8qIFJlYWQgdGhlIGVyciBiaXRzICovCisJCWVyciA9IGF0YV9jaGtfZXJyKHFjLT5hcCk7CisKKwkvKiBEaXNwbGF5IHRoZSBBVEEgbGV2ZWwgZXJyb3IgaW5mbyAqLworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJXU6IHN0YXR1cz0weCUwMnggeyAiLCBxYy0+YXAtPmlkLCBkcnZfc3RhdCk7CisJaWYoZHJ2X3N0YXQgJiAweDgwKQorCXsKKwkJcHJpbnRrKCJCdXN5ICIpOworCQllcnIgPSAwOwkvKiBEYXRhIGlzIG5vdCB2YWxpZCBpbiB0aGlzIGNhc2UgKi8KKwl9CisJZWxzZSB7CisJCWlmKGRydl9zdGF0ICYgMHg0MCkJcHJpbnRrKCJEcml2ZVJlYWR5ICIpOworCQlpZihkcnZfc3RhdCAmIDB4MjApCXByaW50aygiRGV2aWNlRmF1bHQgIik7CisJCWlmKGRydl9zdGF0ICYgMHgxMCkJcHJpbnRrKCJTZWVrQ29tcGxldGUgIik7CisJCWlmKGRydl9zdGF0ICYgMHgwOCkJcHJpbnRrKCJEYXRhUmVxdWVzdCAiKTsKKwkJaWYoZHJ2X3N0YXQgJiAweDA0KQlwcmludGsoIkNvcnJlY3RlZEVycm9yICIpOworCQlpZihkcnZfc3RhdCAmIDB4MDIpCXByaW50aygiSW5kZXggIik7CisJCWlmKGRydl9zdGF0ICYgMHgwMSkJcHJpbnRrKCJFcnJvciAiKTsKKwl9CisJcHJpbnRrKCJ9XG4iKTsKKworCWlmKGVycikKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImF0YSV1OiBlcnJvcj0weCUwMnggeyAiLCBxYy0+YXAtPmlkLCBlcnIpOworCQlpZihlcnIgJiAweDA0KQkJcHJpbnRrKCJEcml2ZVN0YXR1c0Vycm9yICIpOworCQlpZihlcnIgJiAweDgwKQorCQl7CisJCQlpZihlcnIgJiAweDA0KQorCQkJCXByaW50aygiQmFkQ1JDICIpOworCQkJZWxzZQorCQkJCXByaW50aygiU2VjdG9yICIpOworCQl9CisJCWlmKGVyciAmIDB4NDApCQlwcmludGsoIlVuY29ycmVjdGFibGVFcnJvciAiKTsKKwkJaWYoZXJyICYgMHgxMCkJCXByaW50aygiU2VjdG9ySWROb3RGb3VuZCAiKTsKKwkJaWYoZXJyICYgMHgwMikJCXByaW50aygiVHJhY2taZXJvTm90Rm91bmQgIik7CisJCWlmKGVyciAmIDB4MDEpCQlwcmludGsoIkFkZHJNYXJrTm90Rm91bmQgIik7CisJCXByaW50aygifVxuIik7CisKKwkJLyogU2hvdWxkIHdlIGR1bXAgc2VjdG9yIGluZm8gaGVyZSB0b28gPz8gKi8KKwl9CisKKworCS8qIExvb2sgZm9yIGVyciAqLworCXdoaWxlKHNlbnNlX3RhYmxlW2ldWzBdICE9IDB4RkYpCisJeworCQkvKiBMb29rIGZvciBiZXN0IG1hdGNoZXMgZmlyc3QgKi8KKwkJaWYoKHNlbnNlX3RhYmxlW2ldWzBdICYgZXJyKSA9PSBzZW5zZV90YWJsZVtpXVswXSkKKwkJeworCQkJc2JbMF0gPSAweDcwOworCQkJc2JbMl0gPSBzZW5zZV90YWJsZVtpXVsxXTsKKwkJCXNiWzddID0gMHgwYTsKKwkJCXNiWzEyXSA9IHNlbnNlX3RhYmxlW2ldWzJdOworCQkJc2JbMTNdID0gc2Vuc2VfdGFibGVbaV1bM107CisJCQlyZXR1cm47CisJCX0KKwkJaSsrOworCX0KKwkvKiBObyBpbW1lZGlhdGUgbWF0Y2ggKi8KKwlpZihlcnIpCisJCXByaW50ayhLRVJOX0RFQlVHICJhdGEldTogbm8gc2Vuc2UgdHJhbnNsYXRpb24gZm9yIDB4JTAyeFxuIiwgcWMtPmFwLT5pZCwgZXJyKTsKKworCWkgPSAwOworCS8qIEZhbGwgYmFjayB0byBpbnRlcnByZXRpbmcgc3RhdHVzIGJpdHMgKi8KKwl3aGlsZShzdGF0X3RhYmxlW2ldWzBdICE9IDB4RkYpCisJeworCQlpZihzdGF0X3RhYmxlW2ldWzBdICYgZHJ2X3N0YXQpCisJCXsKKwkJCXNiWzBdID0gMHg3MDsKKwkJCXNiWzJdID0gc3RhdF90YWJsZVtpXVsxXTsKKwkJCXNiWzddID0gMHgwYTsKKwkJCXNiWzEyXSA9IHN0YXRfdGFibGVbaV1bMl07CisJCQlzYlsxM10gPSBzdGF0X3RhYmxlW2ldWzNdOworCQkJcmV0dXJuOworCQl9CisJCWkrKzsKKwl9CisJLyogTm8gZXJyb3IgPz8gKi8KKwlwcmludGsoS0VSTl9FUlIgImF0YSV1OiBjYWxsZWQgd2l0aCBubyBlcnJvciAoJTAyWCkhXG4iLCBxYy0+YXAtPmlkLCBkcnZfc3RhdCk7CisJLyogYWRkaXRpb25hbC1zZW5zZS1jb2RlWy1xdWFsaWZpZXJdICovCisKKwlzYlswXSA9IDB4NzA7CisJc2JbMl0gPSBNRURJVU1fRVJST1I7CisJc2JbN10gPSAweDBBOworCWlmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IFNDU0lfREFUQV9SRUFEKSB7CisJCXNiWzEyXSA9IDB4MTE7IC8qICJ1bnJlY292ZXJlZCByZWFkIGVycm9yIiAqLworCQlzYlsxM10gPSAweDA0OworCX0gZWxzZSB7CisJCXNiWzEyXSA9IDB4MEM7IC8qICJ3cml0ZSBlcnJvciAtICAgICAgICAgICAgICovCisJCXNiWzEzXSA9IDB4MDI7IC8qICBhdXRvLXJlYWxsb2NhdGlvbiBmYWlsZWQiICovCisJfQorfQorCisvKioKKyAqCWF0YV9zY3NpX3NsYXZlX2NvbmZpZyAtIFNldCBTQ1NJIGRldmljZSBhdHRyaWJ1dGVzCisgKglAc2RldjogU0NTSSBkZXZpY2UgdG8gZXhhbWluZQorICoKKyAqCVRoaXMgaXMgY2FsbGVkIGJlZm9yZSB3ZSBhY3R1YWxseSBzdGFydCByZWFkaW5nCisgKglhbmQgd3JpdGluZyB0byB0aGUgZGV2aWNlLCB0byBjb25maWd1cmUgY2VydGFpbgorICoJU0NTSSBtaWQtbGF5ZXIgYmVoYXZpb3JzLgorICoKKyAqCUxPQ0tJTkc6CisgKglEZWZpbmVkIGJ5IFNDU0kgbGF5ZXIuICBXZSBkb24ndCByZWFsbHkgY2FyZS4KKyAqLworCitpbnQgYXRhX3Njc2lfc2xhdmVfY29uZmlnKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzZGV2LT51c2VfMTBfZm9yX3J3ID0gMTsKKwlzZGV2LT51c2VfMTBfZm9yX21zID0gMTsKKworCWJsa19xdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhzZGV2LT5yZXF1ZXN0X3F1ZXVlLCBMSUJBVEFfTUFYX1BSRCk7CisKKwlpZiAoc2Rldi0+aWQgPCBBVEFfTUFYX0RFVklDRVMpIHsKKwkJc3RydWN0IGF0YV9wb3J0ICphcDsKKwkJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKKworCQlhcCA9IChzdHJ1Y3QgYXRhX3BvcnQgKikgJnNkZXYtPmhvc3QtPmhvc3RkYXRhWzBdOworCQlkZXYgPSAmYXAtPmRldmljZVtzZGV2LT5pZF07CisKKwkJLyogVE9ETzogMTAyNCBpcyBhbiBhcmJpdHJhcnkgbnVtYmVyLCBub3QgdGhlCisJCSAqIGhhcmR3YXJlIG1heGltdW0uICBUaGlzIHNob3VsZCBiZSBpbmNyZWFzZWQgdG8KKwkJICogNjU1MzQgd2hlbiBKZW5zIEF4Ym9lJ3MgcGF0Y2ggZm9yIGR5bmFtaWNhbGx5CisJCSAqIGRldGVybWluaW5nIG1heF9zZWN0b3JzIGlzIG1lcmdlZC4KKwkJICovCisJCWlmICgoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19MQkE0OCkgJiYKKwkJICAgICgoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19MT0NLX1NFQ1RPUlMpID09IDApKSB7CisJCQlzZGV2LT5ob3N0LT5tYXhfc2VjdG9ycyA9IDIwNDg7CisJCQlibGtfcXVldWVfbWF4X3NlY3RvcnMoc2Rldi0+cmVxdWVzdF9xdWV1ZSwgMjA0OCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsJLyogc2NzaSBsYXllciBkb2Vzbid0IGNoZWNrIHJldHVybiB2YWx1ZSwgc2lnaCAqLworfQorCisvKioKKyAqCWF0YV9zY3NpX2Vycm9yIC0gU0NTSSBsYXllciBlcnJvciBoYW5kbGVyIGNhbGxiYWNrCisgKglAaG9zdDogU0NTSSBob3N0IG9uIHdoaWNoIGVycm9yIG9jY3VycmVkCisgKgorICoJSGFuZGxlcyBTQ1NJLWxheWVyLXRocm93biBlcnJvciBldmVudHMuCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIFNDU0kgbGF5ZXIgKG5vbmUsIGNhbiBzbGVlcCkKKyAqCisgKglSRVRVUk5TOgorICoJWmVyby4KKyAqLworCitpbnQgYXRhX3Njc2lfZXJyb3Ioc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwOworCisJRFBSSU5USygiRU5URVJcbiIpOworCisJYXAgPSAoc3RydWN0IGF0YV9wb3J0ICopICZob3N0LT5ob3N0ZGF0YVswXTsKKwlhcC0+b3BzLT5lbmdfdGltZW91dChhcCk7CisKKwkvKiBUT0RPOiB0aGlzIGlzIHBlci1jb21tYW5kOyB3aGVuIHF1ZXVlaW5nIGlzIHN1cHBvcnRlZAorCSAqIHRoaXMgY29kZSB3aWxsIGVpdGhlciBjaGFuZ2Ugb3IgbW92ZSB0byBhIG1vcmUKKwkgKiBhcHByb3ByaWF0ZSBwbGFjZQorCSAqLworCWhvc3QtPmhvc3RfZmFpbGVkLS07CisKKwlEUFJJTlRLKCJFWElUXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhdGFfc2NzaV9mbHVzaF94bGF0IC0gVHJhbnNsYXRlIFNDU0kgU1lOQ0hST05JWkUgQ0FDSEUgY29tbWFuZAorICoJQHFjOiBTdG9yYWdlIGZvciB0cmFuc2xhdGVkIEFUQSB0YXNrZmlsZQorICoJQHNjc2ljbWQ6IFNDU0kgY29tbWFuZCB0byB0cmFuc2xhdGUgKGlnbm9yZWQpCisgKgorICoJU2V0cyB1cCBhbiBBVEEgdGFza2ZpbGUgdG8gaXNzdWUgRkxVU0ggQ0FDSEUgb3IKKyAqCUZMVVNIIENBQ0hFIEVYVC4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqCisgKglSRVRVUk5TOgorICoJWmVybyBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvci4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGF0YV9zY3NpX2ZsdXNoX3hsYXQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywgdTggKnNjc2ljbWQpCit7CisJc3RydWN0IGF0YV90YXNrZmlsZSAqdGYgPSAmcWMtPnRmOworCisJdGYtPmZsYWdzIHw9IEFUQV9URkxBR19ERVZJQ0U7CisJdGYtPnByb3RvY29sID0gQVRBX1BST1RfTk9EQVRBOworCisJaWYgKCh0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfTEJBNDgpICYmCisJICAgIChhdGFfaWRfaGFzX2ZsdXNoX2V4dChxYy0+ZGV2LT5pZCkpKQorCQl0Zi0+Y29tbWFuZCA9IEFUQV9DTURfRkxVU0hfRVhUOworCWVsc2UKKwkJdGYtPmNvbW1hbmQgPSBBVEFfQ01EX0ZMVVNIOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX3Njc2lfdmVyaWZ5X3hsYXQgLSBUcmFuc2xhdGUgU0NTSSBWRVJJRlkgY29tbWFuZCBpbnRvIGFuIEFUQSBvbmUKKyAqCUBxYzogU3RvcmFnZSBmb3IgdHJhbnNsYXRlZCBBVEEgdGFza2ZpbGUKKyAqCUBzY3NpY21kOiBTQ1NJIGNvbW1hbmQgdG8gdHJhbnNsYXRlCisgKgorICoJQ29udmVydHMgU0NTSSBWRVJJRlkgY29tbWFuZCB0byBhbiBBVEEgUkVBRCBWRVJJRlkgY29tbWFuZC4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqCisgKglSRVRVUk5TOgorICoJWmVybyBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvci4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGF0YV9zY3NpX3ZlcmlmeV94bGF0KHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsIHU4ICpzY3NpY21kKQoreworCXN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmID0gJnFjLT50ZjsKKwl1bnNpZ25lZCBpbnQgbGJhNDggPSB0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfTEJBNDg7CisJdTY0IGRldl9zZWN0b3JzID0gcWMtPmRldi0+bl9zZWN0b3JzOworCXU2NCBzZWN0ID0gMDsKKwl1MzIgbl9zZWN0ID0gMDsKKworCXRmLT5mbGFncyB8PSBBVEFfVEZMQUdfSVNBRERSIHwgQVRBX1RGTEFHX0RFVklDRTsKKwl0Zi0+cHJvdG9jb2wgPSBBVEFfUFJPVF9OT0RBVEE7CisJdGYtPmRldmljZSB8PSBBVEFfTEJBOworCisJaWYgKHNjc2ljbWRbMF0gPT0gVkVSSUZZKSB7CisJCXNlY3QgfD0gKCh1NjQpc2NzaWNtZFsyXSkgPDwgMjQ7CisJCXNlY3QgfD0gKCh1NjQpc2NzaWNtZFszXSkgPDwgMTY7CisJCXNlY3QgfD0gKCh1NjQpc2NzaWNtZFs0XSkgPDwgODsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21kWzVdKTsKKworCQluX3NlY3QgfD0gKCh1MzIpc2NzaWNtZFs3XSkgPDwgODsKKwkJbl9zZWN0IHw9ICgodTMyKXNjc2ljbWRbOF0pOworCX0KKworCWVsc2UgaWYgKHNjc2ljbWRbMF0gPT0gVkVSSUZZXzE2KSB7CisJCXNlY3QgfD0gKCh1NjQpc2NzaWNtZFsyXSkgPDwgNTY7CisJCXNlY3QgfD0gKCh1NjQpc2NzaWNtZFszXSkgPDwgNDg7CisJCXNlY3QgfD0gKCh1NjQpc2NzaWNtZFs0XSkgPDwgNDA7CisJCXNlY3QgfD0gKCh1NjQpc2NzaWNtZFs1XSkgPDwgMzI7CisJCXNlY3QgfD0gKCh1NjQpc2NzaWNtZFs2XSkgPDwgMjQ7CisJCXNlY3QgfD0gKCh1NjQpc2NzaWNtZFs3XSkgPDwgMTY7CisJCXNlY3QgfD0gKCh1NjQpc2NzaWNtZFs4XSkgPDwgODsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21kWzldKTsKKworCQluX3NlY3QgfD0gKCh1MzIpc2NzaWNtZFsxMF0pIDw8IDI0OworCQluX3NlY3QgfD0gKCh1MzIpc2NzaWNtZFsxMV0pIDw8IDE2OworCQluX3NlY3QgfD0gKCh1MzIpc2NzaWNtZFsxMl0pIDw8IDg7CisJCW5fc2VjdCB8PSAoKHUzMilzY3NpY21kWzEzXSk7CisJfQorCisJZWxzZQorCQlyZXR1cm4gMTsKKworCWlmICghbl9zZWN0KQorCQlyZXR1cm4gMTsKKwlpZiAoc2VjdCA+PSBkZXZfc2VjdG9ycykKKwkJcmV0dXJuIDE7CisJaWYgKChzZWN0ICsgbl9zZWN0KSA+IGRldl9zZWN0b3JzKQorCQlyZXR1cm4gMTsKKwlpZiAobGJhNDgpIHsKKwkJaWYgKG5fc2VjdCA+ICg2NCAqIDEwMjQpKQorCQkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJaWYgKG5fc2VjdCA+IDI1NikKKwkJCXJldHVybiAxOworCX0KKworCWlmIChsYmE0OCkgeworCQl0Zi0+Y29tbWFuZCA9IEFUQV9DTURfVkVSSUZZX0VYVDsKKworCQl0Zi0+aG9iX25zZWN0ID0gKG5fc2VjdCA+PiA4KSAmIDB4ZmY7CisKKwkJdGYtPmhvYl9sYmFoID0gKHNlY3QgPj4gNDApICYgMHhmZjsKKwkJdGYtPmhvYl9sYmFtID0gKHNlY3QgPj4gMzIpICYgMHhmZjsKKwkJdGYtPmhvYl9sYmFsID0gKHNlY3QgPj4gMjQpICYgMHhmZjsKKwl9IGVsc2UgeworCQl0Zi0+Y29tbWFuZCA9IEFUQV9DTURfVkVSSUZZOworCisJCXRmLT5kZXZpY2UgfD0gKHNlY3QgPj4gMjQpICYgMHhmOworCX0KKworCXRmLT5uc2VjdCA9IG5fc2VjdCAmIDB4ZmY7CisKKwl0Zi0+bGJhaCA9IChzZWN0ID4+IDE2KSAmIDB4ZmY7CisJdGYtPmxiYW0gPSAoc2VjdCA+PiA4KSAmIDB4ZmY7CisJdGYtPmxiYWwgPSBzZWN0ICYgMHhmZjsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCWF0YV9zY3NpX3J3X3hsYXQgLSBUcmFuc2xhdGUgU0NTSSByL3cgY29tbWFuZCBpbnRvIGFuIEFUQSBvbmUKKyAqCUBxYzogU3RvcmFnZSBmb3IgdHJhbnNsYXRlZCBBVEEgdGFza2ZpbGUKKyAqCUBzY3NpY21kOiBTQ1NJIGNvbW1hbmQgdG8gdHJhbnNsYXRlCisgKgorICoJQ29udmVydHMgYW55IG9mIHNpeCBTQ1NJIHJlYWQvd3JpdGUgY29tbWFuZHMgaW50byB0aGUKKyAqCUFUQSBjb3VudGVycGFydCwgaW5jbHVkaW5nIHN0YXJ0aW5nIHNlY3RvciAoTEJBKSwKKyAqCXNlY3RvciBjb3VudCwgYW5kIHRha2luZyBpbnRvIGFjY291bnQgdGhlIGRldmljZSdzIExCQTQ4CisgKglzdXBwb3J0LgorICoKKyAqCUNvbW1hbmRzICVSRUFEXzYsICVSRUFEXzEwLCAlUkVBRF8xNiwgJVdSSVRFXzYsICVXUklURV8xMCwgYW5kCisgKgklV1JJVEVfMTYgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKgorICoJUkVUVVJOUzoKKyAqCVplcm8gb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBhdGFfc2NzaV9yd194bGF0KHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsIHU4ICpzY3NpY21kKQoreworCXN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmID0gJnFjLT50ZjsKKwl1bnNpZ25lZCBpbnQgbGJhNDggPSB0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfTEJBNDg7CisKKwl0Zi0+ZmxhZ3MgfD0gQVRBX1RGTEFHX0lTQUREUiB8IEFUQV9URkxBR19ERVZJQ0U7CisJdGYtPnByb3RvY29sID0gcWMtPmRldi0+eGZlcl9wcm90b2NvbDsKKwl0Zi0+ZGV2aWNlIHw9IEFUQV9MQkE7CisKKwlpZiAoc2NzaWNtZFswXSA9PSBSRUFEXzEwIHx8IHNjc2ljbWRbMF0gPT0gUkVBRF82IHx8CisJICAgIHNjc2ljbWRbMF0gPT0gUkVBRF8xNikgeworCQl0Zi0+Y29tbWFuZCA9IHFjLT5kZXYtPnJlYWRfY21kOworCX0gZWxzZSB7CisJCXRmLT5jb21tYW5kID0gcWMtPmRldi0+d3JpdGVfY21kOworCQl0Zi0+ZmxhZ3MgfD0gQVRBX1RGTEFHX1dSSVRFOworCX0KKworCWlmIChzY3NpY21kWzBdID09IFJFQURfMTAgfHwgc2NzaWNtZFswXSA9PSBXUklURV8xMCkgeworCQlpZiAobGJhNDgpIHsKKwkJCXRmLT5ob2JfbnNlY3QgPSBzY3NpY21kWzddOworCQkJdGYtPmhvYl9sYmFsID0gc2NzaWNtZFsyXTsKKworCQkJcWMtPm5zZWN0ID0gKCh1bnNpZ25lZCBpbnQpc2NzaWNtZFs3XSA8PCA4KSB8CisJCQkJCXNjc2ljbWRbOF07CisJCX0gZWxzZSB7CisJCQkvKiBpZiB3ZSBkb24ndCBzdXBwb3J0IExCQTQ4IGFkZHJlc3NpbmcsIHRoZSByZXF1ZXN0CisJCQkgKiAtbWF5LSBiZSB0b28gbGFyZ2UuICovCisJCQlpZiAoKHNjc2ljbWRbMl0gJiAweGYwKSB8fCBzY3NpY21kWzddKQorCQkJCXJldHVybiAxOworCisJCQkvKiBzdG9yZXMgTEJBMjc6MjQgaW4gbG93ZXIgNCBiaXRzIG9mIGRldmljZSByZWcgKi8KKwkJCXRmLT5kZXZpY2UgfD0gc2NzaWNtZFsyXTsKKworCQkJcWMtPm5zZWN0ID0gc2NzaWNtZFs4XTsKKwkJfQorCisJCXRmLT5uc2VjdCA9IHNjc2ljbWRbOF07CisJCXRmLT5sYmFsID0gc2NzaWNtZFs1XTsKKwkJdGYtPmxiYW0gPSBzY3NpY21kWzRdOworCQl0Zi0+bGJhaCA9IHNjc2ljbWRbM107CisKKwkJVlBSSU5USygidGVuLWJ5dGUgY29tbWFuZFxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChzY3NpY21kWzBdID09IFJFQURfNiB8fCBzY3NpY21kWzBdID09IFdSSVRFXzYpIHsKKwkJcWMtPm5zZWN0ID0gdGYtPm5zZWN0ID0gc2NzaWNtZFs0XTsKKwkJdGYtPmxiYWwgPSBzY3NpY21kWzNdOworCQl0Zi0+bGJhbSA9IHNjc2ljbWRbMl07CisJCXRmLT5sYmFoID0gc2NzaWNtZFsxXSAmIDB4MWY7IC8qIG1hc2sgb3V0IHJlc2VydmVkIGJpdHMgKi8KKworCQlWUFJJTlRLKCJzaXgtYnl0ZSBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNjc2ljbWRbMF0gPT0gUkVBRF8xNiB8fCBzY3NpY21kWzBdID09IFdSSVRFXzE2KSB7CisJCS8qIHJ1bGUgb3V0IGltcG9zc2libGUgTEJBcyBhbmQgc2VjdG9yIGNvdW50cyAqLworCQlpZiAoc2NzaWNtZFsyXSB8fCBzY3NpY21kWzNdIHx8IHNjc2ljbWRbMTBdIHx8IHNjc2ljbWRbMTFdKQorCQkJcmV0dXJuIDE7CisKKwkJaWYgKGxiYTQ4KSB7CisJCQl0Zi0+aG9iX25zZWN0ID0gc2NzaWNtZFsxMl07CisJCQl0Zi0+aG9iX2xiYWwgPSBzY3NpY21kWzZdOworCQkJdGYtPmhvYl9sYmFtID0gc2NzaWNtZFs1XTsKKwkJCXRmLT5ob2JfbGJhaCA9IHNjc2ljbWRbNF07CisKKwkJCXFjLT5uc2VjdCA9ICgodW5zaWduZWQgaW50KXNjc2ljbWRbMTJdIDw8IDgpIHwKKwkJCQkJc2NzaWNtZFsxM107CisJCX0gZWxzZSB7CisJCQkvKiBvbmNlIGFnYWluLCBmaWx0ZXIgb3V0IGltcG9zc2libGUgbm9uLXplcm8gdmFsdWVzICovCisJCQlpZiAoc2NzaWNtZFs0XSB8fCBzY3NpY21kWzVdIHx8IHNjc2ljbWRbMTJdIHx8CisJCQkgICAgKHNjc2ljbWRbNl0gJiAweGYwKSkKKwkJCQlyZXR1cm4gMTsKKworCQkJLyogc3RvcmVzIExCQTI3OjI0IGluIGxvd2VyIDQgYml0cyBvZiBkZXZpY2UgcmVnICovCisJCQl0Zi0+ZGV2aWNlIHw9IHNjc2ljbWRbNl07CisKKwkJCXFjLT5uc2VjdCA9IHNjc2ljbWRbMTNdOworCQl9CisKKwkJdGYtPm5zZWN0ID0gc2NzaWNtZFsxM107CisJCXRmLT5sYmFsID0gc2NzaWNtZFs5XTsKKwkJdGYtPmxiYW0gPSBzY3NpY21kWzhdOworCQl0Zi0+bGJhaCA9IHNjc2ljbWRbN107CisKKwkJVlBSSU5USygic2l4dGVlbi1ieXRlIGNvbW1hbmRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlEUFJJTlRLKCJuby1ieXRlIGNvbW1hbmRcbiIpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGF0YV9zY3NpX3FjX2NvbXBsZXRlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsIHU4IGRydl9zdGF0KQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHFjLT5zY3NpY21kOworCisJaWYgKHVubGlrZWx5KGRydl9zdGF0ICYgKEFUQV9FUlIgfCBBVEFfQlVTWSB8IEFUQV9EUlEpKSkKKwkJYXRhX3RvX3NlbnNlX2Vycm9yKHFjLCBkcnZfc3RhdCk7CisJZWxzZQorCQljbWQtPnJlc3VsdCA9IFNBTV9TVEFUX0dPT0Q7CisKKwlxYy0+c2NzaWRvbmUoY21kKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCWF0YV9zY3NpX3RyYW5zbGF0ZSAtIFRyYW5zbGF0ZSB0aGVuIGlzc3VlIFNDU0kgY29tbWFuZCB0byBBVEEgZGV2aWNlCisgKglAYXA6IEFUQSBwb3J0IHRvIHdoaWNoIHRoZSBjb21tYW5kIGlzIGFkZHJlc3NlZAorICoJQGRldjogQVRBIGRldmljZSB0byB3aGljaCB0aGUgY29tbWFuZCBpcyBhZGRyZXNzZWQKKyAqCUBjbWQ6IFNDU0kgY29tbWFuZCB0byBleGVjdXRlCisgKglAZG9uZTogU0NTSSBjb21tYW5kIGNvbXBsZXRpb24gZnVuY3Rpb24KKyAqCUB4bGF0X2Z1bmM6IEFjdG9yIHdoaWNoIHRyYW5zbGF0ZXMgQGNtZCB0byBhbiBBVEEgdGFza2ZpbGUKKyAqCisgKglPdXIgLT5xdWV1ZWNvbW1hbmQoKSBmdW5jdGlvbiBoYXMgZGVjaWRlZCB0aGF0IHRoZSBTQ1NJCisgKgljb21tYW5kIGlzc3VlZCBjYW4gYmUgZGlyZWN0bHkgdHJhbnNsYXRlZCBpbnRvIGFuIEFUQQorICoJY29tbWFuZCwgcmF0aGVyIHRoYW4gaGFuZGxlZCBpbnRlcm5hbGx5LgorICoKKyAqCVRoaXMgZnVuY3Rpb24gc2V0cyB1cCBhbiBhdGFfcXVldWVkX2NtZCBzdHJ1Y3R1cmUgZm9yIHRoZQorICoJU0NTSSBjb21tYW5kLCBhbmQgc2VuZHMgdGhhdCBhdGFfcXVldWVkX2NtZCB0byB0aGUgaGFyZHdhcmUuCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKi8KKworc3RhdGljIHZvaWQgYXRhX3Njc2lfdHJhbnNsYXRlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQkgICAgICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSwKKwkJCSAgICAgIGF0YV94bGF0X2Z1bmNfdCB4bGF0X2Z1bmMpCit7CisJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKKwl1OCAqc2NzaWNtZCA9IGNtZC0+Y21uZDsKKworCVZQUklOVEsoIkVOVEVSXG4iKTsKKworCXFjID0gYXRhX3Njc2lfcWNfbmV3KGFwLCBkZXYsIGNtZCwgZG9uZSk7CisJaWYgKCFxYykKKwkJcmV0dXJuOworCisJLyogZGF0YSBpcyBwcmVzZW50OyBkbWEtbWFwIGl0ICovCisJaWYgKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gU0NTSV9EQVRBX1JFQUQgfHwKKwkgICAgY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBTQ1NJX0RBVEFfV1JJVEUpIHsKKwkJaWYgKHVubGlrZWx5KGNtZC0+cmVxdWVzdF9idWZmbGVuIDwgMSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImF0YSV1KCV1KTogV0FSTklORzogemVybyBsZW4gci93IHJlcVxuIiwKKwkJCSAgICAgICBhcC0+aWQsIGRldi0+ZGV2bm8pOworCQkJZ290byBlcnJfb3V0OworCQl9CisKKwkJaWYgKGNtZC0+dXNlX3NnKQorCQkJYXRhX3NnX2luaXQocWMsIGNtZC0+cmVxdWVzdF9idWZmZXIsIGNtZC0+dXNlX3NnKTsKKwkJZWxzZQorCQkJYXRhX3NnX2luaXRfb25lKHFjLCBjbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCQljbWQtPnJlcXVlc3RfYnVmZmxlbik7CisKKwkJcWMtPmRtYV9kaXIgPSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uOworCX0KKworCXFjLT5jb21wbGV0ZV9mbiA9IGF0YV9zY3NpX3FjX2NvbXBsZXRlOworCisJaWYgKHhsYXRfZnVuYyhxYywgc2NzaWNtZCkpCisJCWdvdG8gZXJyX291dDsKKworCS8qIHNlbGVjdCBkZXZpY2UsIHNlbmQgY29tbWFuZCB0byBoYXJkd2FyZSAqLworCWlmIChhdGFfcWNfaXNzdWUocWMpKQorCQlnb3RvIGVycl9vdXQ7CisKKwlWUFJJTlRLKCJFWElUXG4iKTsKKwlyZXR1cm47CisKK2Vycl9vdXQ6CisJYXRhX3FjX2ZyZWUocWMpOworCWF0YV9iYWRfY2RiKGNtZCwgZG9uZSk7CisJRFBSSU5USygiRVhJVCAtIGJhZGNtZFxuIik7Cit9CisKKy8qKgorICoJYXRhX3Njc2lfcmJ1Zl9nZXQgLSBNYXAgcmVzcG9uc2UgYnVmZmVyLgorICoJQGNtZDogU0NTSSBjb21tYW5kIGNvbnRhaW5pbmcgYnVmZmVyIHRvIGJlIG1hcHBlZC4KKyAqCUBidWZfb3V0OiBQb2ludGVyIHRvIG1hcHBlZCBhcmVhLgorICoKKyAqCU1hcHMgYnVmZmVyIGNvbnRhaW5lZCB3aXRoaW4gU0NTSSBjb21tYW5kIEBjbWQuCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKgorICoJUkVUVVJOUzoKKyAqCUxlbmd0aCBvZiByZXNwb25zZSBidWZmZXIuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBhdGFfc2NzaV9yYnVmX2dldChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHU4ICoqYnVmX291dCkKK3sKKwl1OCAqYnVmOworCXVuc2lnbmVkIGludCBidWZsZW47CisKKwlpZiAoY21kLT51c2Vfc2cpIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKworCQlzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJYnVmID0ga21hcF9hdG9taWMoc2ctPnBhZ2UsIEtNX1VTRVIwKSArIHNnLT5vZmZzZXQ7CisJCWJ1ZmxlbiA9IHNnLT5sZW5ndGg7CisJfSBlbHNlIHsKKwkJYnVmID0gY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJYnVmbGVuID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJfQorCisJKmJ1Zl9vdXQgPSBidWY7CisJcmV0dXJuIGJ1ZmxlbjsKK30KKworLyoqCisgKglhdGFfc2NzaV9yYnVmX3B1dCAtIFVubWFwIHJlc3BvbnNlIGJ1ZmZlci4KKyAqCUBjbWQ6IFNDU0kgY29tbWFuZCBjb250YWluaW5nIGJ1ZmZlciB0byBiZSB1bm1hcHBlZC4KKyAqCUBidWY6IGJ1ZmZlciB0byB1bm1hcAorICoKKyAqCVVubWFwcyByZXNwb25zZSBidWZmZXIgY29udGFpbmVkIHdpdGhpbiBAY21kLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGFfc2NzaV9yYnVmX3B1dChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHU4ICpidWYpCit7CisJaWYgKGNtZC0+dXNlX3NnKSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisKKwkJc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIGNtZC0+cmVxdWVzdF9idWZmZXI7CisJCWt1bm1hcF9hdG9taWMoYnVmIC0gc2ctPm9mZnNldCwgS01fVVNFUjApOworCX0KK30KKworLyoqCisgKglhdGFfc2NzaV9yYnVmX2ZpbGwgLSB3cmFwcGVyIGZvciBTQ1NJIGNvbW1hbmQgc2ltdWxhdG9ycworICoJQGFyZ3M6IGRldmljZSBJREVOVElGWSBkYXRhIC8gU0NTSSBjb21tYW5kIG9mIGludGVyZXN0LgorICoJQGFjdG9yOiBDYWxsYmFjayBob29rIGZvciBkZXNpcmVkIFNDU0kgY29tbWFuZCBzaW11bGF0b3IKKyAqCisgKglUYWtlcyBjYXJlIG9mIHRoZSBoYXJkIHdvcmsgb2Ygc2ltdWxhdGluZyBhIFNDU0kgY29tbWFuZC4uLgorICoJTWFwcGluZyB0aGUgcmVzcG9uc2UgYnVmZmVyLCBjYWxsaW5nIHRoZSBjb21tYW5kJ3MgaGFuZGxlciwKKyAqCWFuZCBoYW5kbGluZyB0aGUgaGFuZGxlcidzIHJldHVybiB2YWx1ZS4gIFRoaXMgcmV0dXJuIHZhbHVlCisgKglpbmRpY2F0ZXMgd2hldGhlciB0aGUgaGFuZGxlciB3aXNoZXMgdGhlIFNDU0kgY29tbWFuZCB0byBiZQorICoJY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgb3Igbm90LgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3ZvaWQgYXRhX3Njc2lfcmJ1Zl9maWxsKHN0cnVjdCBhdGFfc2NzaV9hcmdzICphcmdzLAorCQkgICAgICAgIHVuc2lnbmVkIGludCAoKmFjdG9yKSAoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsCisJCQkgICAgIAkJICAgdTggKnJidWYsIHVuc2lnbmVkIGludCBidWZsZW4pKQoreworCXU4ICpyYnVmOworCXVuc2lnbmVkIGludCBidWZsZW4sIHJjOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IGFyZ3MtPmNtZDsKKworCWJ1ZmxlbiA9IGF0YV9zY3NpX3JidWZfZ2V0KGNtZCwgJnJidWYpOworCW1lbXNldChyYnVmLCAwLCBidWZsZW4pOworCXJjID0gYWN0b3IoYXJncywgcmJ1ZiwgYnVmbGVuKTsKKwlhdGFfc2NzaV9yYnVmX3B1dChjbWQsIHJidWYpOworCisJaWYgKHJjKQorCQlhdGFfYmFkX2NkYihjbWQsIGFyZ3MtPmRvbmUpOworCWVsc2UgeworCQljbWQtPnJlc3VsdCA9IFNBTV9TVEFUX0dPT0Q7CisJCWFyZ3MtPmRvbmUoY21kKTsKKwl9Cit9CisKKy8qKgorICoJYXRhX3Njc2lvcF9pbnFfc3RkIC0gU2ltdWxhdGUgSU5RVUlSWSBjb21tYW5kCisgKglAYXJnczogZGV2aWNlIElERU5USUZZIGRhdGEgLyBTQ1NJIGNvbW1hbmQgb2YgaW50ZXJlc3QuCisgKglAcmJ1ZjogUmVzcG9uc2UgYnVmZmVyLCB0byB3aGljaCBzaW11bGF0ZWQgU0NTSSBjbWQgb3V0cHV0IGlzIHNlbnQuCisgKglAYnVmbGVuOiBSZXNwb25zZSBidWZmZXIgbGVuZ3RoLgorICoKKyAqCVJldHVybnMgc3RhbmRhcmQgZGV2aWNlIGlkZW50aWZpY2F0aW9uIGRhdGEgYXNzb2NpYXRlZAorICoJd2l0aCBub24tRVZQRCBJTlFVSVJZIGNvbW1hbmQgb3V0cHV0LgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3Vuc2lnbmVkIGludCBhdGFfc2NzaW9wX2lucV9zdGQoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsIHU4ICpyYnVmLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBidWZsZW4pCit7CisJdTggaGRyW10gPSB7CisJCVRZUEVfRElTSywKKwkJMCwKKwkJMHg1LAkvKiBjbGFpbSBTUEMtMyB2ZXJzaW9uIGNvbXBhdGliaWxpdHkgKi8KKwkJMiwKKwkJOTUgLSA0CisJfTsKKworCS8qIHNldCBzY3NpIHJlbW92ZWFibGUgKFJNQikgYml0IHBlciBhdGEgYml0ICovCisJaWYgKGF0YV9pZF9yZW1vdmVhYmxlKGFyZ3MtPmlkKSkKKwkJaGRyWzFdIHw9ICgxIDw8IDcpOworCisJVlBSSU5USygiRU5URVJcbiIpOworCisJbWVtY3B5KHJidWYsIGhkciwgc2l6ZW9mKGhkcikpOworCisJaWYgKGJ1ZmxlbiA+IDM1KSB7CisJCW1lbWNweSgmcmJ1Zls4XSwgIkFUQSAgICAgIiwgOCk7CisJCWF0YV9kZXZfaWRfc3RyaW5nKGFyZ3MtPmlkLCAmcmJ1ZlsxNl0sIEFUQV9JRF9QUk9EX09GUywgMTYpOworCQlhdGFfZGV2X2lkX3N0cmluZyhhcmdzLT5pZCwgJnJidWZbMzJdLCBBVEFfSURfRldfUkVWX09GUywgNCk7CisJCWlmIChyYnVmWzMyXSA9PSAwIHx8IHJidWZbMzJdID09ICcgJykKKwkJCW1lbWNweSgmcmJ1ZlszMl0sICJuL2EgIiwgNCk7CisJfQorCisJaWYgKGJ1ZmxlbiA+IDYzKSB7CisJCWNvbnN0IHU4IHZlcnNpb25zW10gPSB7CisJCQkweDYwLAkvKiBTQU0tMyAobm8gdmVyc2lvbiBjbGFpbWVkKSAqLworCisJCQkweDAzLAorCQkJMHgyMCwJLyogU0JDLTIgKG5vIHZlcnNpb24gY2xhaW1lZCkgKi8KKworCQkJMHgwMiwKKwkJCTB4NjAJLyogU1BDLTMgKG5vIHZlcnNpb24gY2xhaW1lZCkgKi8KKwkJfTsKKworCQltZW1jcHkocmJ1ZiArIDU5LCB2ZXJzaW9ucywgc2l6ZW9mKHZlcnNpb25zKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX3Njc2lvcF9pbnFfMDAgLSBTaW11bGF0ZSBJTlFVSVJZIEVWUEQgcGFnZSAwLCBsaXN0IG9mIHBhZ2VzCisgKglAYXJnczogZGV2aWNlIElERU5USUZZIGRhdGEgLyBTQ1NJIGNvbW1hbmQgb2YgaW50ZXJlc3QuCisgKglAcmJ1ZjogUmVzcG9uc2UgYnVmZmVyLCB0byB3aGljaCBzaW11bGF0ZWQgU0NTSSBjbWQgb3V0cHV0IGlzIHNlbnQuCisgKglAYnVmbGVuOiBSZXNwb25zZSBidWZmZXIgbGVuZ3RoLgorICoKKyAqCVJldHVybnMgbGlzdCBvZiBpbnF1aXJ5IEVWUEQgcGFnZXMgYXZhaWxhYmxlLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3Vuc2lnbmVkIGludCBhdGFfc2NzaW9wX2lucV8wMChzdHJ1Y3QgYXRhX3Njc2lfYXJncyAqYXJncywgdTggKnJidWYsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgYnVmbGVuKQoreworCWNvbnN0IHU4IHBhZ2VzW10gPSB7CisJCTB4MDAsCS8qIHBhZ2UgMHgwMCwgdGhpcyBwYWdlICovCisJCTB4ODAsCS8qIHBhZ2UgMHg4MCwgdW5pdCBzZXJpYWwgbm8gcGFnZSAqLworCQkweDgzCS8qIHBhZ2UgMHg4MywgZGV2aWNlIGlkZW50IHBhZ2UgKi8KKwl9OworCXJidWZbM10gPSBzaXplb2YocGFnZXMpOwkvKiBudW1iZXIgb2Ygc3VwcG9ydGVkIEVWUEQgcGFnZXMgKi8KKworCWlmIChidWZsZW4gPiA2KQorCQltZW1jcHkocmJ1ZiArIDQsIHBhZ2VzLCBzaXplb2YocGFnZXMpKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCWF0YV9zY3Npb3BfaW5xXzgwIC0gU2ltdWxhdGUgSU5RVUlSWSBFVlBEIHBhZ2UgODAsIGRldmljZSBzZXJpYWwgbnVtYmVyCisgKglAYXJnczogZGV2aWNlIElERU5USUZZIGRhdGEgLyBTQ1NJIGNvbW1hbmQgb2YgaW50ZXJlc3QuCisgKglAcmJ1ZjogUmVzcG9uc2UgYnVmZmVyLCB0byB3aGljaCBzaW11bGF0ZWQgU0NTSSBjbWQgb3V0cHV0IGlzIHNlbnQuCisgKglAYnVmbGVuOiBSZXNwb25zZSBidWZmZXIgbGVuZ3RoLgorICoKKyAqCVJldHVybnMgQVRBIGRldmljZSBzZXJpYWwgbnVtYmVyLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3Vuc2lnbmVkIGludCBhdGFfc2NzaW9wX2lucV84MChzdHJ1Y3QgYXRhX3Njc2lfYXJncyAqYXJncywgdTggKnJidWYsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgYnVmbGVuKQoreworCWNvbnN0IHU4IGhkcltdID0geworCQkwLAorCQkweDgwLAkJCS8qIHRoaXMgcGFnZSBjb2RlICovCisJCTAsCisJCUFUQV9TRVJOT19MRU4sCQkvKiBwYWdlIGxlbiAqLworCX07CisJbWVtY3B5KHJidWYsIGhkciwgc2l6ZW9mKGhkcikpOworCisJaWYgKGJ1ZmxlbiA+IChBVEFfU0VSTk9fTEVOICsgNCAtIDEpKQorCQlhdGFfZGV2X2lkX3N0cmluZyhhcmdzLT5pZCwgKHVuc2lnbmVkIGNoYXIgKikgJnJidWZbNF0sCisJCQkJICBBVEFfSURfU0VSTk9fT0ZTLCBBVEFfU0VSTk9fTEVOKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqaW5xXzgzX3N0ciA9ICJMaW51eCBBVEEtU0NTSSBzaW11bGF0b3IiOworCisvKioKKyAqCWF0YV9zY3Npb3BfaW5xXzgzIC0gU2ltdWxhdGUgSU5RVUlSWSBFVlBEIHBhZ2UgODMsIGRldmljZSBpZGVudGl0eQorICoJQGFyZ3M6IGRldmljZSBJREVOVElGWSBkYXRhIC8gU0NTSSBjb21tYW5kIG9mIGludGVyZXN0LgorICoJQHJidWY6IFJlc3BvbnNlIGJ1ZmZlciwgdG8gd2hpY2ggc2ltdWxhdGVkIFNDU0kgY21kIG91dHB1dCBpcyBzZW50LgorICoJQGJ1ZmxlbjogUmVzcG9uc2UgYnVmZmVyIGxlbmd0aC4KKyAqCisgKglSZXR1cm5zIGRldmljZSBpZGVudGlmaWNhdGlvbi4gIEN1cnJlbnRseSBoYXJkY29kZWQgdG8KKyAqCXJldHVybiAiTGludXggQVRBLVNDU0kgc2ltdWxhdG9yIi4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqLworCit1bnNpZ25lZCBpbnQgYXRhX3Njc2lvcF9pbnFfODMoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsIHU4ICpyYnVmLAorCQkJICAgICAgdW5zaWduZWQgaW50IGJ1ZmxlbikKK3sKKwlyYnVmWzFdID0gMHg4MzsJCQkvKiB0aGlzIHBhZ2UgY29kZSAqLworCXJidWZbM10gPSA0ICsgc3RybGVuKGlucV84M19zdHIpOwkvKiBwYWdlIGxlbiAqLworCisJLyogb3VyIG9uZSBhbmQgb25seSBpZGVudGlmaWNhdGlvbiBkZXNjcmlwdG9yICh2ZW5kb3Itc3BlY2lmaWMpICovCisJaWYgKGJ1ZmxlbiA+IChzdHJsZW4oaW5xXzgzX3N0cikgKyA0ICsgNCAtIDEpKSB7CisJCXJidWZbNCArIDBdID0gMjsJLyogY29kZSBzZXQ6IEFTQ0lJICovCisJCXJidWZbNCArIDNdID0gc3RybGVuKGlucV84M19zdHIpOworCQltZW1jcHkocmJ1ZiArIDQgKyA0LCBpbnFfODNfc3RyLCBzdHJsZW4oaW5xXzgzX3N0cikpOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqCWF0YV9zY3Npb3Bfbm9vcCAtCisgKglAYXJnczogZGV2aWNlIElERU5USUZZIGRhdGEgLyBTQ1NJIGNvbW1hbmQgb2YgaW50ZXJlc3QuCisgKglAcmJ1ZjogUmVzcG9uc2UgYnVmZmVyLCB0byB3aGljaCBzaW11bGF0ZWQgU0NTSSBjbWQgb3V0cHV0IGlzIHNlbnQuCisgKglAYnVmbGVuOiBSZXNwb25zZSBidWZmZXIgbGVuZ3RoLgorICoKKyAqCU5vIG9wZXJhdGlvbi4gIFNpbXBseSByZXR1cm5zIHN1Y2Nlc3MgdG8gY2FsbGVyLCB0byBpbmRpY2F0ZQorICoJdGhhdCB0aGUgY2FsbGVyIHNob3VsZCBzdWNjZXNzZnVsbHkgY29tcGxldGUgdGhpcyBTQ1NJIGNvbW1hbmQuCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKi8KKwordW5zaWduZWQgaW50IGF0YV9zY3Npb3Bfbm9vcChzdHJ1Y3QgYXRhX3Njc2lfYXJncyAqYXJncywgdTggKnJidWYsCisJCQkgICAgdW5zaWduZWQgaW50IGJ1ZmxlbikKK3sKKwlWUFJJTlRLKCJFTlRFUlxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX21zZW5zZV9wdXNoIC0gUHVzaCBkYXRhIG9udG8gTU9ERSBTRU5TRSBkYXRhIG91dHB1dCBidWZmZXIKKyAqCUBwdHJfaW86IChpbnB1dC9vdXRwdXQpIExvY2F0aW9uIHRvIHN0b3JlIG1vcmUgb3V0cHV0IGRhdGEKKyAqCUBsYXN0OiBFbmQgb2Ygb3V0cHV0IGRhdGEgYnVmZmVyCisgKglAYnVmOiBQb2ludGVyIHRvIEJMT0IgYmVpbmcgYWRkZWQgdG8gb3V0cHV0IGJ1ZmZlcgorICoJQGJ1ZmxlbjogTGVuZ3RoIG9mIEJMT0IKKyAqCisgKglTdG9yZSBNT0RFIFNFTlNFIGRhdGEgb24gYW4gb3V0cHV0IGJ1ZmZlci4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZS4KKyAqLworCitzdGF0aWMgdm9pZCBhdGFfbXNlbnNlX3B1c2godTggKipwdHJfaW8sIGNvbnN0IHU4ICpsYXN0LAorCQkJICAgIGNvbnN0IHU4ICpidWYsIHVuc2lnbmVkIGludCBidWZsZW4pCit7CisJdTggKnB0ciA9ICpwdHJfaW87CisKKwlpZiAoKHB0ciArIGJ1ZmxlbiAtIDEpID4gbGFzdCkKKwkJcmV0dXJuOworCisJbWVtY3B5KHB0ciwgYnVmLCBidWZsZW4pOworCisJcHRyICs9IGJ1ZmxlbjsKKworCSpwdHJfaW8gPSBwdHI7Cit9CisKKy8qKgorICoJYXRhX21zZW5zZV9jYWNoaW5nIC0gU2ltdWxhdGUgTU9ERSBTRU5TRSBjYWNoaW5nIGluZm8gcGFnZQorICoJQGlkOiBkZXZpY2UgSURFTlRJRlkgZGF0YQorICoJQHB0cl9pbzogKGlucHV0L291dHB1dCkgTG9jYXRpb24gdG8gc3RvcmUgbW9yZSBvdXRwdXQgZGF0YQorICoJQGxhc3Q6IEVuZCBvZiBvdXRwdXQgZGF0YSBidWZmZXIKKyAqCisgKglHZW5lcmF0ZSBhIGNhY2hpbmcgaW5mbyBwYWdlLCB3aGljaCBjb25kaXRpb25hbGx5IGluZGljYXRlcworICoJd3JpdGUgY2FjaGluZyB0byB0aGUgU0NTSSBsYXllciwgZGVwZW5kaW5nIG9uIGRldmljZQorICoJY2FwYWJpbGl0aWVzLgorICoKKyAqCUxPQ0tJTkc6CisgKglOb25lLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX21zZW5zZV9jYWNoaW5nKHUxNiAqaWQsIHU4ICoqcHRyX2lvLAorCQkJCSAgICAgICBjb25zdCB1OCAqbGFzdCkKK3sKKwl1OCBwYWdlW10gPSB7CisJCTB4OCwJCQkJLyogcGFnZSBjb2RlICovCisJCTB4MTIsCQkJCS8qIHBhZ2UgbGVuZ3RoICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDEwIHplcm9lcyAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCQkvKiA4IHplcm9lcyAqLworCX07CisKKwlpZiAoYXRhX2lkX3djYWNoZV9lbmFibGVkKGlkKSkKKwkJcGFnZVsyXSB8PSAoMSA8PCAyKTsJLyogd3JpdGUgY2FjaGUgZW5hYmxlICovCisJaWYgKCFhdGFfaWRfcmFoZWFkX2VuYWJsZWQoaWQpKQorCQlwYWdlWzEyXSB8PSAoMSA8PCA1KTsJLyogZGlzYWJsZSByZWFkIGFoZWFkICovCisKKwlhdGFfbXNlbnNlX3B1c2gocHRyX2lvLCBsYXN0LCBwYWdlLCBzaXplb2YocGFnZSkpOworCXJldHVybiBzaXplb2YocGFnZSk7Cit9CisKKy8qKgorICoJYXRhX21zZW5zZV9jdGxfbW9kZSAtIFNpbXVsYXRlIE1PREUgU0VOU0UgY29udHJvbCBtb2RlIHBhZ2UKKyAqCUBkZXY6IERldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBNT0RFIFNFTlNFIGNvbW1hbmQKKyAqCUBwdHJfaW86IChpbnB1dC9vdXRwdXQpIExvY2F0aW9uIHRvIHN0b3JlIG1vcmUgb3V0cHV0IGRhdGEKKyAqCUBsYXN0OiBFbmQgb2Ygb3V0cHV0IGRhdGEgYnVmZmVyCisgKgorICoJR2VuZXJhdGUgYSBnZW5lcmljIE1PREUgU0VOU0UgY29udHJvbCBtb2RlIHBhZ2UuCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBhdGFfbXNlbnNlX2N0bF9tb2RlKHU4ICoqcHRyX2lvLCBjb25zdCB1OCAqbGFzdCkKK3sKKwljb25zdCB1OCBwYWdlW10gPSB7MHhhLCAweGEsIDYsIDAsIDAsIDAsIDAsIDAsIDB4ZmYsIDB4ZmYsIDAsIDMwfTsKKworCS8qIGJ5dGUgMjogc2V0IHRoZSBkZXNjcmlwdG9yIGZvcm1hdCBzZW5zZSBkYXRhIGJpdCAoYml0IDIpCisJICogc2luY2Ugd2UgbmVlZCB0byBzdXBwb3J0IHJldHVybmluZyB0aGlzIGZvcm1hdCBmb3IgU0FUCisJICogY29tbWFuZHMgYW5kIGFueSBTQ1NJIGNvbW1hbmRzIGFnYWluc3QgYSA0OGIgTEJBIGRldmljZS4KKwkgKi8KKworCWF0YV9tc2Vuc2VfcHVzaChwdHJfaW8sIGxhc3QsIHBhZ2UsIHNpemVvZihwYWdlKSk7CisJcmV0dXJuIHNpemVvZihwYWdlKTsKK30KKworLyoqCisgKglhdGFfbXNlbnNlX3J3X3JlY292ZXJ5IC0gU2ltdWxhdGUgTU9ERSBTRU5TRSByL3cgZXJyb3IgcmVjb3ZlcnkgcGFnZQorICoJQGRldjogRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIE1PREUgU0VOU0UgY29tbWFuZAorICoJQHB0cl9pbzogKGlucHV0L291dHB1dCkgTG9jYXRpb24gdG8gc3RvcmUgbW9yZSBvdXRwdXQgZGF0YQorICoJQGxhc3Q6IEVuZCBvZiBvdXRwdXQgZGF0YSBidWZmZXIKKyAqCisgKglHZW5lcmF0ZSBhIGdlbmVyaWMgTU9ERSBTRU5TRSByL3cgZXJyb3IgcmVjb3ZlcnkgcGFnZS4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGF0YV9tc2Vuc2VfcndfcmVjb3ZlcnkodTggKipwdHJfaW8sIGNvbnN0IHU4ICpsYXN0KQoreworCWNvbnN0IHU4IHBhZ2VbXSA9IHsKKwkJMHgxLAkJCSAgLyogcGFnZSBjb2RlICovCisJCTB4YSwJCQkgIC8qIHBhZ2UgbGVuZ3RoICovCisJCSgxIDw8IDcpIHwgKDEgPDwgNiksCSAgLyogbm90ZSBhdXRvIHIvdyByZWFsbG9jYXRpb24gKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCAvKiA5IHplcm9lcyAqLworCX07CisKKwlhdGFfbXNlbnNlX3B1c2gocHRyX2lvLCBsYXN0LCBwYWdlLCBzaXplb2YocGFnZSkpOworCXJldHVybiBzaXplb2YocGFnZSk7Cit9CisKKy8qKgorICoJYXRhX3Njc2lvcF9tb2RlX3NlbnNlIC0gU2ltdWxhdGUgTU9ERSBTRU5TRSA2LCAxMCBjb21tYW5kcworICoJQGFyZ3M6IGRldmljZSBJREVOVElGWSBkYXRhIC8gU0NTSSBjb21tYW5kIG9mIGludGVyZXN0LgorICoJQHJidWY6IFJlc3BvbnNlIGJ1ZmZlciwgdG8gd2hpY2ggc2ltdWxhdGVkIFNDU0kgY21kIG91dHB1dCBpcyBzZW50LgorICoJQGJ1ZmxlbjogUmVzcG9uc2UgYnVmZmVyIGxlbmd0aC4KKyAqCisgKglTaW11bGF0ZSBNT0RFIFNFTlNFIGNvbW1hbmRzLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3Vuc2lnbmVkIGludCBhdGFfc2NzaW9wX21vZGVfc2Vuc2Uoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsIHU4ICpyYnVmLAorCQkJCSAgdW5zaWduZWQgaW50IGJ1ZmxlbikKK3sKKwl1OCAqc2NzaWNtZCA9IGFyZ3MtPmNtZC0+Y21uZCwgKnAsICpsYXN0OworCXVuc2lnbmVkIGludCBwYWdlX2NvbnRyb2wsIHNpeF9ieXRlLCBvdXRwdXRfbGVuOworCisJVlBSSU5USygiRU5URVJcbiIpOworCisJc2l4X2J5dGUgPSAoc2NzaWNtZFswXSA9PSBNT0RFX1NFTlNFKTsKKworCS8qIHdlIG9ubHkgc3VwcG9ydCBzYXZlZCBhbmQgY3VycmVudCB2YWx1ZXMgKHdoaWNoIHdlIHRyZWF0CisJICogaW4gdGhlIHNhbWUgbWFubmVyKQorCSAqLworCXBhZ2VfY29udHJvbCA9IHNjc2ljbWRbMl0gPj4gNjsKKwlpZiAoKHBhZ2VfY29udHJvbCAhPSAwKSAmJiAocGFnZV9jb250cm9sICE9IDMpKQorCQlyZXR1cm4gMTsKKworCWlmIChzaXhfYnl0ZSkKKwkJb3V0cHV0X2xlbiA9IDQ7CisJZWxzZQorCQlvdXRwdXRfbGVuID0gODsKKworCXAgPSByYnVmICsgb3V0cHV0X2xlbjsKKwlsYXN0ID0gcmJ1ZiArIGJ1ZmxlbiAtIDE7CisKKwlzd2l0Y2goc2NzaWNtZFsyXSAmIDB4M2YpIHsKKwljYXNlIDB4MDE6CQkvKiByL3cgZXJyb3IgcmVjb3ZlcnkgKi8KKwkJb3V0cHV0X2xlbiArPSBhdGFfbXNlbnNlX3J3X3JlY292ZXJ5KCZwLCBsYXN0KTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDg6CQkvKiBjYWNoaW5nICovCisJCW91dHB1dF9sZW4gKz0gYXRhX21zZW5zZV9jYWNoaW5nKGFyZ3MtPmlkLCAmcCwgbGFzdCk7CisJCWJyZWFrOworCisJY2FzZSAweDBhOiB7CQkvKiBjb250cm9sIG1vZGUgKi8KKwkJb3V0cHV0X2xlbiArPSBhdGFfbXNlbnNlX2N0bF9tb2RlKCZwLCBsYXN0KTsKKwkJYnJlYWs7CisJCX0KKworCWNhc2UgMHgzZjoJCS8qIGFsbCBwYWdlcyAqLworCQlvdXRwdXRfbGVuICs9IGF0YV9tc2Vuc2VfcndfcmVjb3ZlcnkoJnAsIGxhc3QpOworCQlvdXRwdXRfbGVuICs9IGF0YV9tc2Vuc2VfY2FjaGluZyhhcmdzLT5pZCwgJnAsIGxhc3QpOworCQlvdXRwdXRfbGVuICs9IGF0YV9tc2Vuc2VfY3RsX21vZGUoJnAsIGxhc3QpOworCQlicmVhazsKKworCWRlZmF1bHQ6CQkvKiBpbnZhbGlkIHBhZ2UgY29kZSAqLworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoc2l4X2J5dGUpIHsKKwkJb3V0cHV0X2xlbi0tOworCQlyYnVmWzBdID0gb3V0cHV0X2xlbjsKKwl9IGVsc2UgeworCQlvdXRwdXRfbGVuIC09IDI7CisJCXJidWZbMF0gPSBvdXRwdXRfbGVuID4+IDg7CisJCXJidWZbMV0gPSBvdXRwdXRfbGVuOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqCWF0YV9zY3Npb3BfcmVhZF9jYXAgLSBTaW11bGF0ZSBSRUFEIENBUEFDSVRZWyAxNl0gY29tbWFuZHMKKyAqCUBhcmdzOiBkZXZpY2UgSURFTlRJRlkgZGF0YSAvIFNDU0kgY29tbWFuZCBvZiBpbnRlcmVzdC4KKyAqCUByYnVmOiBSZXNwb25zZSBidWZmZXIsIHRvIHdoaWNoIHNpbXVsYXRlZCBTQ1NJIGNtZCBvdXRwdXQgaXMgc2VudC4KKyAqCUBidWZsZW46IFJlc3BvbnNlIGJ1ZmZlciBsZW5ndGguCisgKgorICoJU2ltdWxhdGUgUkVBRCBDQVBBQ0lUWSBjb21tYW5kcy4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqLworCit1bnNpZ25lZCBpbnQgYXRhX3Njc2lvcF9yZWFkX2NhcChzdHJ1Y3QgYXRhX3Njc2lfYXJncyAqYXJncywgdTggKnJidWYsCisJCQkgICAgICAgIHVuc2lnbmVkIGludCBidWZsZW4pCit7CisJdTY0IG5fc2VjdG9yczsKKwl1MzIgdG1wOworCisJVlBSSU5USygiRU5URVJcbiIpOworCisJaWYgKGF0YV9pZF9oYXNfbGJhNDgoYXJncy0+aWQpKQorCQluX3NlY3RvcnMgPSBhdGFfaWRfdTY0KGFyZ3MtPmlkLCAxMDApOworCWVsc2UKKwkJbl9zZWN0b3JzID0gYXRhX2lkX3UzMihhcmdzLT5pZCwgNjApOworCW5fc2VjdG9ycy0tOwkJLyogQVRBIFRvdGFsVXNlclNlY3RvcnMgLSAxICovCisKKwl0bXAgPSBuX3NlY3RvcnM7CS8qIG5vdGU6IHRydW5jYXRlcywgaWYgbGJhNDggKi8KKwlpZiAoYXJncy0+Y21kLT5jbW5kWzBdID09IFJFQURfQ0FQQUNJVFkpIHsKKwkJLyogc2VjdG9yIGNvdW50LCAzMi1iaXQgKi8KKwkJcmJ1ZlswXSA9IHRtcCA+PiAoOCAqIDMpOworCQlyYnVmWzFdID0gdG1wID4+ICg4ICogMik7CisJCXJidWZbMl0gPSB0bXAgPj4gKDggKiAxKTsKKwkJcmJ1ZlszXSA9IHRtcDsKKworCQkvKiBzZWN0b3Igc2l6ZSAqLworCQl0bXAgPSBBVEFfU0VDVF9TSVpFOworCQlyYnVmWzZdID0gdG1wID4+IDg7CisJCXJidWZbN10gPSB0bXA7CisKKwl9IGVsc2UgeworCQkvKiBzZWN0b3IgY291bnQsIDY0LWJpdCAqLworCQlyYnVmWzJdID0gbl9zZWN0b3JzID4+ICg4ICogNyk7CisJCXJidWZbM10gPSBuX3NlY3RvcnMgPj4gKDggKiA2KTsKKwkJcmJ1Zls0XSA9IG5fc2VjdG9ycyA+PiAoOCAqIDUpOworCQlyYnVmWzVdID0gbl9zZWN0b3JzID4+ICg4ICogNCk7CisJCXJidWZbNl0gPSB0bXAgPj4gKDggKiAzKTsKKwkJcmJ1Zls3XSA9IHRtcCA+PiAoOCAqIDIpOworCQlyYnVmWzhdID0gdG1wID4+ICg4ICogMSk7CisJCXJidWZbOV0gPSB0bXA7CisKKwkJLyogc2VjdG9yIHNpemUgKi8KKwkJdG1wID0gQVRBX1NFQ1RfU0laRTsKKwkJcmJ1ZlsxMl0gPSB0bXAgPj4gODsKKwkJcmJ1ZlsxM10gPSB0bXA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX3Njc2lvcF9yZXBvcnRfbHVucyAtIFNpbXVsYXRlIFJFUE9SVCBMVU5TIGNvbW1hbmQKKyAqCUBhcmdzOiBkZXZpY2UgSURFTlRJRlkgZGF0YSAvIFNDU0kgY29tbWFuZCBvZiBpbnRlcmVzdC4KKyAqCUByYnVmOiBSZXNwb25zZSBidWZmZXIsIHRvIHdoaWNoIHNpbXVsYXRlZCBTQ1NJIGNtZCBvdXRwdXQgaXMgc2VudC4KKyAqCUBidWZsZW46IFJlc3BvbnNlIGJ1ZmZlciBsZW5ndGguCisgKgorICoJU2ltdWxhdGUgUkVQT1JUIExVTlMgY29tbWFuZC4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqLworCit1bnNpZ25lZCBpbnQgYXRhX3Njc2lvcF9yZXBvcnRfbHVucyhzdHJ1Y3QgYXRhX3Njc2lfYXJncyAqYXJncywgdTggKnJidWYsCisJCQkJICAgdW5zaWduZWQgaW50IGJ1ZmxlbikKK3sKKwlWUFJJTlRLKCJFTlRFUlxuIik7CisJcmJ1ZlszXSA9IDg7CS8qIGp1c3Qgb25lIGx1biwgTFVOIDAsIHNpemUgOCBieXRlcyAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX3Njc2lfYmFkY21kIC0gRW5kIGEgU0NTSSByZXF1ZXN0IHdpdGggYW4gZXJyb3IKKyAqCUBjbWQ6IFNDU0kgcmVxdWVzdCB0byBiZSBoYW5kbGVkCisgKglAZG9uZTogU0NTSSBjb21tYW5kIGNvbXBsZXRpb24gZnVuY3Rpb24KKyAqCUBhc2M6IFNDU0ktZGVmaW5lZCBhZGRpdGlvbmFsIHNlbnNlIGNvZGUKKyAqCUBhc2NxOiBTQ1NJLWRlZmluZWQgYWRkaXRpb25hbCBzZW5zZSBjb2RlIHF1YWxpZmllcgorICoKKyAqCUhlbHBlciBmdW5jdGlvbiB0aGF0IGNvbXBsZXRlcyBhIFNDU0kgY29tbWFuZCB3aXRoCisgKgklU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OLCB3aXRoIGEgc2Vuc2Uga2V5ICVJTExFR0FMX1JFUVVFU1QKKyAqCWFuZCB0aGUgc3BlY2lmaWVkIGFkZGl0aW9uYWwgc2Vuc2UgY29kZXMuCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKi8KKwordm9pZCBhdGFfc2NzaV9iYWRjbWQoc3RydWN0IHNjc2lfY21uZCAqY21kLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSwgdTggYXNjLCB1OCBhc2NxKQoreworCURQUklOVEsoIkVOVEVSXG4iKTsKKwljbWQtPnJlc3VsdCA9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKworCWNtZC0+c2Vuc2VfYnVmZmVyWzBdID0gMHg3MDsKKwljbWQtPnNlbnNlX2J1ZmZlclsyXSA9IElMTEVHQUxfUkVRVUVTVDsKKwljbWQtPnNlbnNlX2J1ZmZlcls3XSA9IDE0IC0gODsJLyogYWRkbmwuIHNlbnNlIGxlbi4gRklYTUU6IGNvcnJlY3Q/ICovCisJY21kLT5zZW5zZV9idWZmZXJbMTJdID0gYXNjOworCWNtZC0+c2Vuc2VfYnVmZmVyWzEzXSA9IGFzY3E7CisKKwlkb25lKGNtZCk7Cit9CisKK3N0YXRpYyBpbnQgYXRhcGlfcWNfY29tcGxldGUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywgdTggZHJ2X3N0YXQpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gcWMtPnNjc2ljbWQ7CisKKwlpZiAodW5saWtlbHkoZHJ2X3N0YXQgJiAoQVRBX0VSUiB8IEFUQV9CVVNZIHwgQVRBX0RSUSkpKSB7CisJCURQUklOVEsoInJlcXVlc3QgY2hlY2sgY29uZGl0aW9uXG4iKTsKKworCQljbWQtPnJlc3VsdCA9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKworCQlxYy0+c2NzaWRvbmUoY21kKTsKKworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQl1OCAqc2NzaWNtZCA9IGNtZC0+Y21uZDsKKworCQlpZiAoc2NzaWNtZFswXSA9PSBJTlFVSVJZKSB7CisJCQl1OCAqYnVmID0gTlVMTDsKKwkJCXVuc2lnbmVkIGludCBidWZsZW47CisKKwkJCWJ1ZmxlbiA9IGF0YV9zY3NpX3JidWZfZ2V0KGNtZCwgJmJ1Zik7CisJCQlidWZbMl0gPSAweDU7CisJCQlidWZbM10gPSAoYnVmWzNdICYgMHhmMCkgfCAyOworCQkJYXRhX3Njc2lfcmJ1Zl9wdXQoY21kLCBidWYpOworCQl9CisJCWNtZC0+cmVzdWx0ID0gU0FNX1NUQVRfR09PRDsKKwl9CisKKwlxYy0+c2NzaWRvbmUoY21kKTsKKworCXJldHVybiAwOworfQorLyoqCisgKglhdGFwaV94bGF0IC0gSW5pdGlhbGl6ZSBQQUNLRVQgdGFza2ZpbGUKKyAqCUBxYzogY29tbWFuZCBzdHJ1Y3R1cmUgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqCUBzY3NpY21kOiBTQ1NJIENEQiBhc3NvY2lhdGVkIHdpdGggdGhpcyBQQUNLRVQgY29tbWFuZAorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICoKKyAqCVJFVFVSTlM6CisgKglaZXJvIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGZhaWx1cmUuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBhdGFwaV94bGF0KHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsIHU4ICpzY3NpY21kKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHFjLT5zY3NpY21kOworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSBxYy0+ZGV2OworCWludCB1c2luZ19waW8gPSAoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19QSU8pOworCWludCBub2RhdGEgPSAoY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBTQ1NJX0RBVEFfTk9ORSk7CisKKwlpZiAoIXVzaW5nX3BpbykKKwkJLyogQ2hlY2sgd2hldGhlciBBVEFQSSBETUEgaXMgc2FmZSAqLworCQlpZiAoYXRhX2NoZWNrX2F0YXBpX2RtYShxYykpCisJCQl1c2luZ19waW8gPSAxOworCisJbWVtY3B5KCZxYy0+Y2RiLCBzY3NpY21kLCBxYy0+YXAtPmNkYl9sZW4pOworCisJcWMtPmNvbXBsZXRlX2ZuID0gYXRhcGlfcWNfY29tcGxldGU7CisKKwlxYy0+dGYuZmxhZ3MgfD0gQVRBX1RGTEFHX0lTQUREUiB8IEFUQV9URkxBR19ERVZJQ0U7CisJaWYgKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gU0NTSV9EQVRBX1dSSVRFKSB7CisJCXFjLT50Zi5mbGFncyB8PSBBVEFfVEZMQUdfV1JJVEU7CisJCURQUklOVEsoImRpcmVjdGlvbjogd3JpdGVcbiIpOworCX0KKworCXFjLT50Zi5jb21tYW5kID0gQVRBX0NNRF9QQUNLRVQ7CisKKwkvKiBubyBkYXRhLCBvciBQSU8gZGF0YSB4ZmVyICovCisJaWYgKHVzaW5nX3BpbyB8fCBub2RhdGEpIHsKKwkJaWYgKG5vZGF0YSkKKwkJCXFjLT50Zi5wcm90b2NvbCA9IEFUQV9QUk9UX0FUQVBJX05PREFUQTsKKwkJZWxzZQorCQkJcWMtPnRmLnByb3RvY29sID0gQVRBX1BST1RfQVRBUEk7CisJCXFjLT50Zi5sYmFtID0gKDggKiAxMDI0KSAmIDB4ZmY7CisJCXFjLT50Zi5sYmFoID0gKDggKiAxMDI0KSA+PiA4OworCX0KKworCS8qIERNQSBkYXRhIHhmZXIgKi8KKwllbHNlIHsKKwkJcWMtPnRmLnByb3RvY29sID0gQVRBX1BST1RfQVRBUElfRE1BOworCQlxYy0+dGYuZmVhdHVyZSB8PSBBVEFQSV9QS1RfRE1BOworCisjaWZkZWYgQVRBUElfRU5BQkxFX0RNQURJUgorCQkvKiBzb21lIFNBVEEgYnJpZGdlcyBuZWVkIHVzIHRvIGluZGljYXRlIGRhdGEgeGZlciBkaXJlY3Rpb24gKi8KKwkJaWYgKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gIT0gU0NTSV9EQVRBX1dSSVRFKQorCQkJcWMtPnRmLmZlYXR1cmUgfD0gQVRBUElfRE1BRElSOworI2VuZGlmCisJfQorCisJcWMtPm5ieXRlcyA9IGNtZC0+YnVmZmxlbjsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCWF0YV9zY3NpX2ZpbmRfZGV2IC0gbG9va3VwIGF0YV9kZXZpY2UgZnJvbSBzY3NpX2NtbmQKKyAqCUBhcDogQVRBIHBvcnQgdG8gd2hpY2ggdGhlIGRldmljZSBpcyBhdHRhY2hlZAorICoJQHNjc2lkZXY6IFNDU0kgZGV2aWNlIGZyb20gd2hpY2ggd2UgZGVyaXZlIHRoZSBBVEEgZGV2aWNlCisgKgorICoJR2l2ZW4gdmFyaW91cyBpbmZvcm1hdGlvbiBwcm92aWRlZCBpbiBzdHJ1Y3Qgc2NzaV9jbW5kLAorICoJbWFwIHRoYXQgb250byBhbiBBVEEgYnVzLCBhbmQgdXNpbmcgdGhhdCBtYXBwaW5nCisgKglkZXRlcm1pbmUgd2hpY2ggYXRhX2RldmljZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCisgKglTQ1NJIGNvbW1hbmQgdG8gYmUgc2VudC4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqCisgKglSRVRVUk5TOgorICoJQXNzb2NpYXRlZCBBVEEgZGV2aWNlLCBvciAlTlVMTCBpZiBub3QgZm91bmQuCisgKi8KKworc3RhdGljIHN0cnVjdCBhdGFfZGV2aWNlICoKK2F0YV9zY3NpX2ZpbmRfZGV2KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldikKK3sKKwlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OworCisJLyogc2tpcCBjb21tYW5kcyBub3QgYWRkcmVzc2VkIHRvIHRhcmdldHMgd2Ugc2ltdWxhdGUgKi8KKwlpZiAobGlrZWx5KHNjc2lkZXYtPmlkIDwgQVRBX01BWF9ERVZJQ0VTKSkKKwkJZGV2ID0gJmFwLT5kZXZpY2Vbc2NzaWRldi0+aWRdOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodW5saWtlbHkoKHNjc2lkZXYtPmNoYW5uZWwgIT0gMCkgfHwKKwkJICAgICAoc2NzaWRldi0+bHVuICE9IDApKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodW5saWtlbHkoIWF0YV9kZXZfcHJlc2VudChkZXYpKSkKKwkJcmV0dXJuIE5VTEw7CisKKyNpZm5kZWYgQVRBX0VOQUJMRV9BVEFQSQorCWlmICh1bmxpa2VseShkZXYtPmNsYXNzID09IEFUQV9ERVZfQVRBUEkpKQorCQlyZXR1cm4gTlVMTDsKKyNlbmRpZgorCisJcmV0dXJuIGRldjsKK30KKworLyoqCisgKglhdGFfZ2V0X3hsYXRfZnVuYyAtIGNoZWNrIGlmIFNDU0kgdG8gQVRBIHRyYW5zbGF0aW9uIGlzIHBvc3NpYmxlCisgKglAZGV2OiBBVEEgZGV2aWNlCisgKglAY21kOiBTQ1NJIGNvbW1hbmQgb3Bjb2RlIHRvIGNvbnNpZGVyCisgKgorICoJTG9vayB1cCB0aGUgU0NTSSBjb21tYW5kIGdpdmVuLCBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCisgKglTQ1NJIGNvbW1hbmQgaXMgdG8gYmUgdHJhbnNsYXRlZCBvciBzaW11bGF0ZWQuCisgKgorICoJUkVUVVJOUzoKKyAqCVBvaW50ZXIgdG8gdHJhbnNsYXRpb24gZnVuY3Rpb24gaWYgcG9zc2libGUsICVOVUxMIGlmIG5vdC4KKyAqLworCitzdGF0aWMgaW5saW5lIGF0YV94bGF0X2Z1bmNfdCBhdGFfZ2V0X3hsYXRfZnVuYyhzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCB1OCBjbWQpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJFQURfNjoKKwljYXNlIFJFQURfMTA6CisJY2FzZSBSRUFEXzE2OgorCisJY2FzZSBXUklURV82OgorCWNhc2UgV1JJVEVfMTA6CisJY2FzZSBXUklURV8xNjoKKwkJcmV0dXJuIGF0YV9zY3NpX3J3X3hsYXQ7CisKKwljYXNlIFNZTkNIUk9OSVpFX0NBQ0hFOgorCQlpZiAoYXRhX3RyeV9mbHVzaF9jYWNoZShkZXYpKQorCQkJcmV0dXJuIGF0YV9zY3NpX2ZsdXNoX3hsYXQ7CisJCWJyZWFrOworCisJY2FzZSBWRVJJRlk6CisJY2FzZSBWRVJJRllfMTY6CisJCXJldHVybiBhdGFfc2NzaV92ZXJpZnlfeGxhdDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKglhdGFfc2NzaV9kdW1wX2NkYiAtIGR1bXAgU0NTSSBjb21tYW5kIGNvbnRlbnRzIHRvIGRtZXNnCisgKglAYXA6IEFUQSBwb3J0IHRvIHdoaWNoIHRoZSBjb21tYW5kIHdhcyBiZWluZyBzZW50CisgKglAY21kOiBTQ1NJIGNvbW1hbmQgdG8gZHVtcAorICoKKyAqCVByaW50cyB0aGUgY29udGVudHMgb2YgYSBTQ1NJIGNvbW1hbmQgdmlhIHByaW50aygpLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGFfc2NzaV9kdW1wX2NkYihzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworI2lmZGVmIEFUQV9ERUJVRworCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldiA9IGNtZC0+ZGV2aWNlOworCXU4ICpzY3NpY21kID0gY21kLT5jbW5kOworCisJRFBSSU5USygiQ0RCICgldTolZCwlZCwlZCkgJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCWFwLT5pZCwKKwkJc2NzaWRldi0+Y2hhbm5lbCwgc2NzaWRldi0+aWQsIHNjc2lkZXYtPmx1biwKKwkJc2NzaWNtZFswXSwgc2NzaWNtZFsxXSwgc2NzaWNtZFsyXSwgc2NzaWNtZFszXSwKKwkJc2NzaWNtZFs0XSwgc2NzaWNtZFs1XSwgc2NzaWNtZFs2XSwgc2NzaWNtZFs3XSwKKwkJc2NzaWNtZFs4XSk7CisjZW5kaWYKK30KKworLyoqCisgKglhdGFfc2NzaV9xdWV1ZWNtZCAtIElzc3VlIFNDU0kgY2RiIHRvIGxpYmF0YS1tYW5hZ2VkIGRldmljZQorICoJQGNtZDogU0NTSSBjb21tYW5kIHRvIGJlIHNlbnQKKyAqCUBkb25lOiBDb21wbGV0aW9uIGZ1bmN0aW9uLCBjYWxsZWQgd2hlbiBjb21tYW5kIGlzIGNvbXBsZXRlCisgKgorICoJSW4gc29tZSBjYXNlcywgdGhpcyBmdW5jdGlvbiB0cmFuc2xhdGVzIFNDU0kgY29tbWFuZHMgaW50bworICoJQVRBIHRhc2tmaWxlcywgYW5kIHF1ZXVlcyB0aGUgdGFza2ZpbGVzIHRvIGJlIHNlbnQgdG8KKyAqCWhhcmR3YXJlLiAgSW4gb3RoZXIgY2FzZXMsIHRoaXMgZnVuY3Rpb24gc2ltdWxhdGVzIGEKKyAqCVNDU0kgZGV2aWNlIGJ5IGV2YWx1YXRpbmcgYW5kIHJlc3BvbmRpbmcgdG8gY2VydGFpbgorICoJU0NTSSBjb21tYW5kcy4gIFRoaXMgY3JlYXRlcyB0aGUgb3ZlcmFsbCBlZmZlY3Qgb2YKKyAqCUFUQSBhbmQgQVRBUEkgZGV2aWNlcyBhcHBlYXJpbmcgYXMgU0NTSSBkZXZpY2VzLgorICoKKyAqCUxPQ0tJTkc6CisgKglSZWxlYXNlcyBzY3NpLWxheWVyLWhlbGQgbG9jaywgYW5kIG9idGFpbnMgaG9zdF9zZXQgbG9jay4KKyAqCisgKglSRVRVUk5TOgorICoJWmVyby4KKyAqLworCitpbnQgYXRhX3Njc2lfcXVldWVjbWQoc3RydWN0IHNjc2lfY21uZCAqY21kLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwOworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2ID0gY21kLT5kZXZpY2U7CisKKwlhcCA9IChzdHJ1Y3QgYXRhX3BvcnQgKikgJnNjc2lkZXYtPmhvc3QtPmhvc3RkYXRhWzBdOworCisJYXRhX3Njc2lfZHVtcF9jZGIoYXAsIGNtZCk7CisKKwlkZXYgPSBhdGFfc2NzaV9maW5kX2RldihhcCwgc2NzaWRldik7CisJaWYgKHVubGlrZWx5KCFkZXYpKSB7CisJCWNtZC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwkJZG9uZShjbWQpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaWYgKGRldi0+Y2xhc3MgPT0gQVRBX0RFVl9BVEEpIHsKKwkJYXRhX3hsYXRfZnVuY190IHhsYXRfZnVuYyA9IGF0YV9nZXRfeGxhdF9mdW5jKGRldiwKKwkJCQkJCQkgICAgICBjbWQtPmNtbmRbMF0pOworCisJCWlmICh4bGF0X2Z1bmMpCisJCQlhdGFfc2NzaV90cmFuc2xhdGUoYXAsIGRldiwgY21kLCBkb25lLCB4bGF0X2Z1bmMpOworCQllbHNlCisJCQlhdGFfc2NzaV9zaW11bGF0ZShkZXYtPmlkLCBjbWQsIGRvbmUpOworCX0gZWxzZQorCQlhdGFfc2NzaV90cmFuc2xhdGUoYXAsIGRldiwgY21kLCBkb25lLCBhdGFwaV94bGF0KTsKKworb3V0X3VubG9jazoKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhdGFfc2NzaV9zaW11bGF0ZSAtIHNpbXVsYXRlIFNDU0kgY29tbWFuZCBvbiBBVEEgZGV2aWNlCisgKglAaWQ6IGN1cnJlbnQgSURFTlRJRlkgZGF0YSBmb3IgdGFyZ2V0IGRldmljZS4KKyAqCUBjbWQ6IFNDU0kgY29tbWFuZCBiZWluZyBzZW50IHRvIGRldmljZS4KKyAqCUBkb25lOiBTQ1NJIGNvbW1hbmQgY29tcGxldGlvbiBmdW5jdGlvbi4KKyAqCisgKglJbnRlcnByZXRzIGFuZCBkaXJlY3RseSBleGVjdXRlcyBhIHNlbGVjdCBsaXN0IG9mIFNDU0kgY29tbWFuZHMKKyAqCXRoYXQgY2FuIGJlIGhhbmRsZWQgaW50ZXJuYWxseS4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqLworCit2b2lkIGF0YV9zY3NpX3NpbXVsYXRlKHUxNiAqaWQsCisJCSAgICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJICAgICAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3RydWN0IGF0YV9zY3NpX2FyZ3MgYXJnczsKKwl1OCAqc2NzaWNtZCA9IGNtZC0+Y21uZDsKKworCWFyZ3MuaWQgPSBpZDsKKwlhcmdzLmNtZCA9IGNtZDsKKwlhcmdzLmRvbmUgPSBkb25lOworCisJc3dpdGNoKHNjc2ljbWRbMF0pIHsKKwkJLyogbm8tb3AncywgY29tcGxldGUgd2l0aCBzdWNjZXNzICovCisJCWNhc2UgU1lOQ0hST05JWkVfQ0FDSEU6CisJCWNhc2UgUkVaRVJPX1VOSVQ6CisJCWNhc2UgU0VFS182OgorCQljYXNlIFNFRUtfMTA6CisJCWNhc2UgVEVTVF9VTklUX1JFQURZOgorCQljYXNlIEZPUk1BVF9VTklUOgkJLyogRklYTUU6IGNvcnJlY3Q/ICovCisJCWNhc2UgU0VORF9ESUFHTk9TVElDOgkJLyogRklYTUU6IGNvcnJlY3Q/ICovCisJCQlhdGFfc2NzaV9yYnVmX2ZpbGwoJmFyZ3MsIGF0YV9zY3Npb3Bfbm9vcCk7CisJCQlicmVhazsKKworCQljYXNlIElOUVVJUlk6CisJCQlpZiAoc2NzaWNtZFsxXSAmIDIpCSAgICAgICAgICAgLyogaXMgQ21kRHQgc2V0PyAgKi8KKwkJCQlhdGFfYmFkX2NkYihjbWQsIGRvbmUpOworCQkJZWxzZSBpZiAoKHNjc2ljbWRbMV0gJiAxKSA9PSAwKSAgICAvKiBpcyBFVlBEIGNsZWFyPyAqLworCQkJCWF0YV9zY3NpX3JidWZfZmlsbCgmYXJncywgYXRhX3Njc2lvcF9pbnFfc3RkKTsKKwkJCWVsc2UgaWYgKHNjc2ljbWRbMl0gPT0gMHgwMCkKKwkJCQlhdGFfc2NzaV9yYnVmX2ZpbGwoJmFyZ3MsIGF0YV9zY3Npb3BfaW5xXzAwKTsKKwkJCWVsc2UgaWYgKHNjc2ljbWRbMl0gPT0gMHg4MCkKKwkJCQlhdGFfc2NzaV9yYnVmX2ZpbGwoJmFyZ3MsIGF0YV9zY3Npb3BfaW5xXzgwKTsKKwkJCWVsc2UgaWYgKHNjc2ljbWRbMl0gPT0gMHg4MykKKwkJCQlhdGFfc2NzaV9yYnVmX2ZpbGwoJmFyZ3MsIGF0YV9zY3Npb3BfaW5xXzgzKTsKKwkJCWVsc2UKKwkJCQlhdGFfYmFkX2NkYihjbWQsIGRvbmUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNT0RFX1NFTlNFOgorCQljYXNlIE1PREVfU0VOU0VfMTA6CisJCQlhdGFfc2NzaV9yYnVmX2ZpbGwoJmFyZ3MsIGF0YV9zY3Npb3BfbW9kZV9zZW5zZSk7CisJCQlicmVhazsKKworCQljYXNlIE1PREVfU0VMRUNUOgkvKiB1bmNvbmRpdGlvbmFsbHkgcmV0dXJuICovCisJCWNhc2UgTU9ERV9TRUxFQ1RfMTA6CS8qIGJhZC1maWVsZC1pbi1jZGIgKi8KKwkJCWF0YV9iYWRfY2RiKGNtZCwgZG9uZSk7CisJCQlicmVhazsKKworCQljYXNlIFJFQURfQ0FQQUNJVFk6CisJCQlhdGFfc2NzaV9yYnVmX2ZpbGwoJmFyZ3MsIGF0YV9zY3Npb3BfcmVhZF9jYXApOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVJWSUNFX0FDVElPTl9JTjoKKwkJCWlmICgoc2NzaWNtZFsxXSAmIDB4MWYpID09IFNBSV9SRUFEX0NBUEFDSVRZXzE2KQorCQkJCWF0YV9zY3NpX3JidWZfZmlsbCgmYXJncywgYXRhX3Njc2lvcF9yZWFkX2NhcCk7CisJCQllbHNlCisJCQkJYXRhX2JhZF9jZGIoY21kLCBkb25lKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVQT1JUX0xVTlM6CisJCQlhdGFfc2NzaV9yYnVmX2ZpbGwoJmFyZ3MsIGF0YV9zY3Npb3BfcmVwb3J0X2x1bnMpOworCQkJYnJlYWs7CisKKwkJLyogbWFuZGFudG9yeSBjb21tYW5kcyB3ZSBoYXZlbid0IGltcGxlbWVudGVkIHlldCAqLworCQljYXNlIFJFUVVFU1RfU0VOU0U6CisKKwkJLyogYWxsIG90aGVyIGNvbW1hbmRzICovCisJCWRlZmF1bHQ6CisJCQlhdGFfYmFkX3Njc2lvcChjbWQsIGRvbmUpOworCQkJYnJlYWs7CisJfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliYXRhLmggYi9kcml2ZXJzL3Njc2kvbGliYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxODIyNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9saWJhdGEuaApAQCAtMCwwICsxLDg5IEBACisvKgorICAgbGliYXRhLmggLSBoZWxwZXIgbGlicmFyeSBmb3IgQVRBCisKKyAgIENvcHlyaWdodCAyMDAzLTIwMDQgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgIENvcHlyaWdodCAyMDAzLTIwMDQgSmVmZiBHYXJ6aWsKKworICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgT3BlbgorICAgU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMSB0aGF0IGNhbiBiZSBmb3VuZCBhdAorICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMS4xLnR4dCBhbmQgaXMgaW5jbHVkZWQgaGVyZWluCisgICBieSByZWZlcmVuY2UuCisKKyAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCisgICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpIGFzIGRpc3RyaWJ1dGVkCisgICBpbiB0aGUga2VybmVsIHNvdXJjZSBDT1BZSU5HIGZpbGUsIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YKKyAgIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdworICAgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICAgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCisgICB0aGUgT1NMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZAorICAgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLgorICAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91cgorICAgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBPU0wgb3IgdGhlIEdQTC4KKworICovCisKKyNpZm5kZWYgX19MSUJBVEFfSF9fCisjZGVmaW5lIF9fTElCQVRBX0hfXworCisjZGVmaW5lIERSVl9OQU1FCSJsaWJhdGEiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjEwIgkvKiBtdXN0IGJlIGV4YWN0bHkgZm91ciBjaGFycyAqLworCitzdHJ1Y3QgYXRhX3Njc2lfYXJncyB7CisJdTE2CQkJKmlkOworCXN0cnVjdCBzY3NpX2NtbmQJKmNtZDsKKwl2b2lkCQkJKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopOworfTsKKworLyogbGliYXRhLWNvcmUuYyAqLworZXh0ZXJuIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqYXRhX3FjX25ld19pbml0KHN0cnVjdCBhdGFfcG9ydCAqYXAsCisJCQkJICAgICAgc3RydWN0IGF0YV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBhdGFfcWNfZnJlZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKK2V4dGVybiBpbnQgYXRhX3FjX2lzc3VlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworZXh0ZXJuIGludCBhdGFfY2hlY2tfYXRhcGlfZG1hKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworZXh0ZXJuIHZvaWQgYXRhX2Rldl9zZWxlY3Qoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB3YWl0LCB1bnNpZ25lZCBpbnQgY2FuX3NsZWVwKTsKK2V4dGVybiB2b2lkIGF0YV90Zl90b19ob3N0X25vbG9jayhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Zik7CitleHRlcm4gdm9pZCBzd2FwX2J1Zl9sZTE2KHUxNiAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmX3dvcmRzKTsKKworCisvKiBsaWJhdGEtc2NzaS5jICovCitleHRlcm4gdm9pZCBhdGFfdG9fc2Vuc2VfZXJyb3Ioc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywgdTggZHJ2X3N0YXQpOworZXh0ZXJuIGludCBhdGFfc2NzaV9lcnJvcihzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYXRhX3Njc2lvcF9pbnFfc3RkKHN0cnVjdCBhdGFfc2NzaV9hcmdzICphcmdzLCB1OCAqcmJ1ZiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgYnVmbGVuKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBhdGFfc2NzaW9wX2lucV8wMChzdHJ1Y3QgYXRhX3Njc2lfYXJncyAqYXJncywgdTggKnJidWYsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgYnVmbGVuKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBhdGFfc2NzaW9wX2lucV84MChzdHJ1Y3QgYXRhX3Njc2lfYXJncyAqYXJncywgdTggKnJidWYsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgYnVmbGVuKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYXRhX3Njc2lvcF9pbnFfODMoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsIHU4ICpyYnVmLAorCQkJICAgICAgdW5zaWduZWQgaW50IGJ1Zmxlbik7CitleHRlcm4gdW5zaWduZWQgaW50IGF0YV9zY3Npb3Bfbm9vcChzdHJ1Y3QgYXRhX3Njc2lfYXJncyAqYXJncywgdTggKnJidWYsCisJCQkgICAgdW5zaWduZWQgaW50IGJ1Zmxlbik7CitleHRlcm4gdW5zaWduZWQgaW50IGF0YV9zY3Npb3Bfc3luY19jYWNoZShzdHJ1Y3QgYXRhX3Njc2lfYXJncyAqYXJncywgdTggKnJidWYsCisJCQkJICB1bnNpZ25lZCBpbnQgYnVmbGVuKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYXRhX3Njc2lvcF9tb2RlX3NlbnNlKHN0cnVjdCBhdGFfc2NzaV9hcmdzICphcmdzLCB1OCAqcmJ1ZiwKKwkJCQkgIHVuc2lnbmVkIGludCBidWZsZW4pOworZXh0ZXJuIHVuc2lnbmVkIGludCBhdGFfc2NzaW9wX3JlYWRfY2FwKHN0cnVjdCBhdGFfc2NzaV9hcmdzICphcmdzLCB1OCAqcmJ1ZiwKKwkJCSAgICAgICAgdW5zaWduZWQgaW50IGJ1Zmxlbik7CitleHRlcm4gdW5zaWduZWQgaW50IGF0YV9zY3Npb3BfcmVwb3J0X2x1bnMoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsIHU4ICpyYnVmLAorCQkJCSAgIHVuc2lnbmVkIGludCBidWZsZW4pOworZXh0ZXJuIHZvaWQgYXRhX3Njc2lfYmFkY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCSAgICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSwKKwkJCSAgICB1OCBhc2MsIHU4IGFzY3EpOworZXh0ZXJuIHZvaWQgYXRhX3Njc2lfcmJ1Zl9maWxsKHN0cnVjdCBhdGFfc2NzaV9hcmdzICphcmdzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAoKmFjdG9yKSAoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKnJidWYsIHVuc2lnbmVkIGludCBidWZsZW4pKTsKKworc3RhdGljIGlubGluZSB2b2lkIGF0YV9iYWRfc2NzaW9wKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJYXRhX3Njc2lfYmFkY21kKGNtZCwgZG9uZSwgMHgyMCwgMHgwMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGFfYmFkX2NkYihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCWF0YV9zY3NpX2JhZGNtZChjbWQsIGRvbmUsIDB4MjQsIDB4MDApOworfQorCisjZW5kaWYgLyogX19MSUJBVEFfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWFjNTNjOTQuYyBiL2RyaXZlcnMvc2NzaS9tYWM1M2M5NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZjJhMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbWFjNTNjOTQuYwpAQCAtMCwwICsxLDU4MiBAQAorLyoKKyAqIFNDU0kgbG93LWxldmVsIGRyaXZlciBmb3IgdGhlIDUzYzk0IFNDU0kgYnVzIGFkYXB0b3IgZm91bmQKKyAqIG9uIFBvd2VyIE1hY2ludG9zaCBjb21wdXRlcnMsIGNvbnRyb2xsaW5nIHRoZSBleHRlcm5hbCBTQ1NJIGNoYWluLgorICogV2UgYXNzdW1lIHRoZSA1M2M5NCBpcyBjb25uZWN0ZWQgdG8gYSBEQkRNQSAoZGVzY3JpcHRvci1iYXNlZCBETUEpCisgKiBjb250cm9sbGVyLgorICoKKyAqIFBhdWwgTWFja2VycmFzLCBBdWd1c3QgMTk5Ni4KKyAqIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9kYmRtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaW8uaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNpbmNsdWRlICJtYWM1M2M5NC5oIgorCitlbnVtIGZzY19waGFzZSB7CisJaWRsZSwKKwlzZWxlY3RpbmcsCisJZGF0YWluZywKKwljb21wbGV0aW5nLAorCWJ1c2ZyZWVpbmcsCit9OworCitzdHJ1Y3QgZnNjX3N0YXRlIHsKKwlzdHJ1Y3QJbWFjNTNjOTRfcmVncyBfX2lvbWVtICpyZWdzOworCWludAlpbnRyOworCXN0cnVjdAlkYmRtYV9yZWdzIF9faW9tZW0gKmRtYTsKKwlpbnQJZG1haW50cjsKKwlpbnQJY2xrX2ZyZXE7CisJc3RydWN0CVNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpyZXF1ZXN0X3E7CisJc3RydWN0IHNjc2lfY21uZCAqcmVxdWVzdF9xdGFpbDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjdXJyZW50X3JlcTsJCS8qIHJlcSB3ZSdyZSBjdXJyZW50bHkgd29ya2luZyBvbiAqLworCWVudW0gZnNjX3BoYXNlIHBoYXNlOwkJLyogd2hhdCB3ZSdyZSBjdXJyZW50bHkgdHJ5aW5nIHRvIGRvICovCisJc3RydWN0IGRiZG1hX2NtZCAqZG1hX2NtZHM7CS8qIHNwYWNlIGZvciBkYmRtYSBjb21tYW5kcywgYWxpZ25lZCAqLworCXZvaWQJKmRtYV9jbWRfc3BhY2U7CisJc3RydWN0CXBjaV9kZXYgKnBkZXY7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwlzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2OworfTsKKworc3RhdGljIHZvaWQgbWFjNTNjOTRfaW5pdChzdHJ1Y3QgZnNjX3N0YXRlICopOworc3RhdGljIHZvaWQgbWFjNTNjOTRfc3RhcnQoc3RydWN0IGZzY19zdGF0ZSAqKTsKK3N0YXRpYyB2b2lkIG1hYzUzYzk0X2ludGVycnVwdChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgaXJxcmV0dXJuX3QgZG9fbWFjNTNjOTRfaW50ZXJydXB0KGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0YXRpYyB2b2lkIGNtZF9kb25lKHN0cnVjdCBmc2Nfc3RhdGUgKiwgaW50IHJlc3VsdCk7CitzdGF0aWMgdm9pZCBzZXRfZG1hX2NtZHMoc3RydWN0IGZzY19zdGF0ZSAqLCBzdHJ1Y3Qgc2NzaV9jbW5kICopOworCisKK3N0YXRpYyBpbnQgbWFjNTNjOTRfcXVldWUoc3RydWN0IHNjc2lfY21uZCAqY21kLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgZnNjX3N0YXRlICpzdGF0ZTsKKworI2lmIDAKKwlpZiAoY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CisJCWludCBpOworCQlwcmludGsoS0VSTl9ERUJVRyAibWFjNTNjOTRfcXVldWUgJXA6IGNvbW1hbmQgaXMiLCBjbWQpOworCQlmb3IgKGkgPSAwOyBpIDwgY21kLT5jbWRfbGVuOyArK2kpCisJCQlwcmludGsoIiAlLjJ4IiwgY21kLT5jbW5kW2ldKTsKKwkJcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyAidXNlX3NnPSVkIHJlcXVlc3RfYnVmZmxlbj0lZCByZXF1ZXN0X2J1ZmZlcj0lcFxuIiwKKwkJICAgICAgIGNtZC0+dXNlX3NnLCBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgY21kLT5yZXF1ZXN0X2J1ZmZlcik7CisJfQorI2VuZGlmCisKKwljbWQtPnNjc2lfZG9uZSA9IGRvbmU7CisJY21kLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworCXN0YXRlID0gKHN0cnVjdCBmc2Nfc3RhdGUgKikgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJaWYgKHN0YXRlLT5yZXF1ZXN0X3EgPT0gTlVMTCkKKwkJc3RhdGUtPnJlcXVlc3RfcSA9IGNtZDsKKwllbHNlCisJCXN0YXRlLT5yZXF1ZXN0X3F0YWlsLT5ob3N0X3NjcmliYmxlID0gKHZvaWQgKikgY21kOworCXN0YXRlLT5yZXF1ZXN0X3F0YWlsID0gY21kOworCisJaWYgKHN0YXRlLT5waGFzZSA9PSBpZGxlKQorCQltYWM1M2M5NF9zdGFydChzdGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWM1M2M5NF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJcmV0dXJuIEZBSUxFRDsKK30KKworc3RhdGljIGludCBtYWM1M2M5NF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgZnNjX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgZnNjX3N0YXRlICopIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgbWFjNTNjOTRfcmVncyBfX2lvbWVtICpyZWdzID0gc3RhdGUtPnJlZ3M7CisJc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqZG1hID0gc3RhdGUtPmRtYTsKKworCXdyaXRlbCgoUlVOfFBBVVNFfEZMVVNIfFdBS0UpIDw8IDE2LCAmZG1hLT5jb250cm9sKTsKKwl3cml0ZWIoQ01EX1NDU0lfUkVTRVQsICZyZWdzLT5jb21tYW5kKTsJLyogYXNzZXJ0IFJTVCAqLworCXVkZWxheSgxMDApOwkJCS8qIGxlYXZlIGl0IG9uIGZvciBhIHdoaWxlICg+PSAyNXVzKSAqLworCXdyaXRlYihDTURfUkVTRVQsICZyZWdzLT5jb21tYW5kKTsKKwl1ZGVsYXkoMjApOworCW1hYzUzYzk0X2luaXQoc3RhdGUpOworCXdyaXRlYihDTURfTk9QLCAmcmVncy0+Y29tbWFuZCk7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIG1hYzUzYzk0X2luaXQoc3RydWN0IGZzY19zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IG1hYzUzYzk0X3JlZ3MgX19pb21lbSAqcmVncyA9IHN0YXRlLT5yZWdzOworCXN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKmRtYSA9IHN0YXRlLT5kbWE7CisJaW50IHg7CisKKwl3cml0ZWIoc3RhdGUtPmhvc3QtPnRoaXNfaWQgfCBDRjFfUEFSX0VOQUJMRSwgJnJlZ3MtPmNvbmZpZzEpOworCXdyaXRlYihUSU1PX1ZBTCgyNTApLCAmcmVncy0+c2VsX3RpbWVvdXQpOwkvKiAyNTBtcyAqLworCXdyaXRlYihDTEtGX1ZBTChzdGF0ZS0+Y2xrX2ZyZXEpLCAmcmVncy0+Y2xrX2ZhY3Rvcik7CisJd3JpdGViKENGMl9GRUFUVVJFX0VOLCAmcmVncy0+Y29uZmlnMik7CisJd3JpdGViKDAsICZyZWdzLT5jb25maWczKTsKKwl3cml0ZWIoMCwgJnJlZ3MtPnN5bmNfcGVyaW9kKTsKKwl3cml0ZWIoMCwgJnJlZ3MtPnN5bmNfb2Zmc2V0KTsKKwl4ID0gcmVhZGIoJnJlZ3MtPmludGVycnVwdCk7CisJd3JpdGVsKChSVU58UEFVU0V8RkxVU0h8V0FLRSkgPDwgMTYsICZkbWEtPmNvbnRyb2wpOworfQorCisvKgorICogU3RhcnQgdGhlIG5leHQgY29tbWFuZCBmb3IgYSA1M0M5NC4KKyAqIFNob3VsZCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICovCitzdGF0aWMgdm9pZCBtYWM1M2M5NF9zdGFydChzdHJ1Y3QgZnNjX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJc3RydWN0IG1hYzUzYzk0X3JlZ3MgX19pb21lbSAqcmVncyA9IHN0YXRlLT5yZWdzOworCWludCBpOworCisJaWYgKHN0YXRlLT5waGFzZSAhPSBpZGxlIHx8IHN0YXRlLT5jdXJyZW50X3JlcSAhPSBOVUxMKQorCQlwYW5pYygiaW5hcHByb3ByaWF0ZSBtYWM1M2M5NF9zdGFydCAoc3RhdGU9JXApIiwgc3RhdGUpOworCWlmIChzdGF0ZS0+cmVxdWVzdF9xID09IE5VTEwpCisJCXJldHVybjsKKwlzdGF0ZS0+Y3VycmVudF9yZXEgPSBjbWQgPSBzdGF0ZS0+cmVxdWVzdF9xOworCXN0YXRlLT5yZXF1ZXN0X3EgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGU7CisKKwkvKiBPZmYgd2UgZ28gKi8KKwl3cml0ZWIoMCwgJnJlZ3MtPmNvdW50X2xvKTsKKwl3cml0ZWIoMCwgJnJlZ3MtPmNvdW50X21pZCk7CisJd3JpdGViKDAsICZyZWdzLT5jb3VudF9oaSk7CisJd3JpdGViKENNRF9OT1AgKyBDTURfRE1BX01PREUsICZyZWdzLT5jb21tYW5kKTsKKwl1ZGVsYXkoMSk7CisJd3JpdGViKENNRF9GTFVTSCwgJnJlZ3MtPmNvbW1hbmQpOworCXVkZWxheSgxKTsKKwl3cml0ZWIoY21kLT5kZXZpY2UtPmlkLCAmcmVncy0+ZGVzdF9pZCk7CisJd3JpdGViKDAsICZyZWdzLT5zeW5jX3BlcmlvZCk7CisJd3JpdGViKDAsICZyZWdzLT5zeW5jX29mZnNldCk7CisKKwkvKiBsb2FkIHRoZSBjb21tYW5kIGludG8gdGhlIEZJRk8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgY21kLT5jbWRfbGVuOyArK2kpCisJCXdyaXRlYihjbWQtPmNtbmRbaV0sICZyZWdzLT5maWZvKTsKKworCS8qIGRvIHNlbGVjdCB3aXRob3V0IEFUTiBYWFggKi8KKwl3cml0ZWIoQ01EX1NFTEVDVCwgJnJlZ3MtPmNvbW1hbmQpOworCXN0YXRlLT5waGFzZSA9IHNlbGVjdGluZzsKKworCWlmIChjbWQtPnVzZV9zZyA+IDAgfHwgY21kLT5yZXF1ZXN0X2J1ZmZsZW4gIT0gMCkKKwkJc2V0X2RtYV9jbWRzKHN0YXRlLCBjbWQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZG9fbWFjNTNjOTRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBTY3NpX0hvc3QgKmRldiA9ICgoc3RydWN0IGZzY19zdGF0ZSAqKSBkZXZfaWQpLT5jdXJyZW50X3JlcS0+ZGV2aWNlLT5ob3N0OworCQorCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJbWFjNTNjOTRfaW50ZXJydXB0KGlycSwgZGV2X2lkLCBwdHJlZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIG1hYzUzYzk0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpwdHJlZ3MpCit7CisJc3RydWN0IGZzY19zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGZzY19zdGF0ZSAqKSBkZXZfaWQ7CisJc3RydWN0IG1hYzUzYzk0X3JlZ3MgX19pb21lbSAqcmVncyA9IHN0YXRlLT5yZWdzOworCXN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKmRtYSA9IHN0YXRlLT5kbWE7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gc3RhdGUtPmN1cnJlbnRfcmVxOworCWludCBuYiwgc3RhdCwgc2VxLCBpbnRyOworCXN0YXRpYyBpbnQgbWFjNTNjOTRfZXJyb3JzOworCisJLyoKKwkgKiBBcHBhcmVudGx5LCByZWFkaW5nIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIgdW5sYXRjaGVzCisJICogdGhlIHN0YXR1cyBhbmQgc2VxdWVuY2Ugc3RlcCByZWdpc3RlcnMuCisJICovCisJc2VxID0gcmVhZGIoJnJlZ3MtPnNlcXN0ZXApOworCXN0YXQgPSByZWFkYigmcmVncy0+c3RhdHVzKTsKKwlpbnRyID0gcmVhZGIoJnJlZ3MtPmludGVycnVwdCk7CisKKyNpZiAwCisJcHJpbnRrKEtFUk5fREVCVUcgIm1hYzUzYzk0X2ludHIsIGludHI9JXggc3RhdD0leCBzZXE9JXggcGhhc2U9JWRcbiIsCisJICAgICAgIGludHIsIHN0YXQsIHNlcSwgc3RhdGUtPnBoYXNlKTsKKyNlbmRpZgorCisJaWYgKGludHIgJiBJTlRSX1JFU0VUKSB7CisJCS8qIFNDU0kgYnVzIHdhcyByZXNldCAqLworCQlwcmludGsoS0VSTl9JTkZPICJleHRlcm5hbCBTQ1NJIGJ1cyByZXNldCBkZXRlY3RlZFxuIik7CisJCXdyaXRlYihDTURfTk9QLCAmcmVncy0+Y29tbWFuZCk7CisJCXdyaXRlbChSVU4gPDwgMTYsICZkbWEtPmNvbnRyb2wpOwkvKiBzdG9wIGRtYSAqLworCQljbWRfZG9uZShzdGF0ZSwgRElEX1JFU0VUIDw8IDE2KTsKKwkJcmV0dXJuOworCX0KKwlpZiAoaW50ciAmIElOVFJfSUxMX0NNRCkgeworCQlwcmludGsoS0VSTl9FUlIgIjUzYzk0OiBpbnZhbGlkIGNtZCwgaW50cj0leCBzdGF0PSV4IHNlcT0leCBwaGFzZT0lZFxuIiwKKwkJICAgICAgIGludHIsIHN0YXQsIHNlcSwgc3RhdGUtPnBoYXNlKTsKKwkJY21kX2RvbmUoc3RhdGUsIERJRF9FUlJPUiA8PCAxNik7CisJCXJldHVybjsKKwl9CisJaWYgKHN0YXQgJiBTVEFUX0VSUk9SKSB7CisjaWYgMAorCQkvKiBYWFggdGhlc2Ugc2VlbSB0byBiZSBoYXJtbGVzcz8gKi8KKwkJcHJpbnRrKCI1M2M5NDogYmFkIGVycm9yLCBpbnRyPSV4IHN0YXQ9JXggc2VxPSV4IHBoYXNlPSVkXG4iLAorCQkgICAgICAgaW50ciwgc3RhdCwgc2VxLCBzdGF0ZS0+cGhhc2UpOworI2VuZGlmCisJCSsrbWFjNTNjOTRfZXJyb3JzOworCQl3cml0ZWIoQ01EX05PUCArIENNRF9ETUFfTU9ERSwgJnJlZ3MtPmNvbW1hbmQpOworCX0KKwlpZiAoY21kID09IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIjUzYzk0OiBpbnRlcnJ1cHQgd2l0aCBubyBjb21tYW5kIGFjdGl2ZT9cbiIpOworCQlyZXR1cm47CisJfQorCWlmIChzdGF0ICYgU1RBVF9QQVJJVFkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtYWM1M2M5NDogcGFyaXR5IGVycm9yXG4iKTsKKwkJY21kX2RvbmUoc3RhdGUsIERJRF9QQVJJVFkgPDwgMTYpOworCQlyZXR1cm47CisJfQorCXN3aXRjaCAoc3RhdGUtPnBoYXNlKSB7CisJY2FzZSBzZWxlY3Rpbmc6CisJCWlmIChpbnRyICYgSU5UUl9ESVNDT05ORUNUKSB7CisJCQkvKiBzZWxlY3Rpb24gdGltZWQgb3V0ICovCisJCQljbWRfZG9uZShzdGF0ZSwgRElEX0JBRF9UQVJHRVQgPDwgMTYpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChpbnRyICE9IElOVFJfQlVTX1NFUlYgKyBJTlRSX0RPTkUpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJnb3QgaW50ciAleCBkdXJpbmcgc2VsZWN0aW9uXG4iLCBpbnRyKTsKKwkJCWNtZF9kb25lKHN0YXRlLCBESURfRVJST1IgPDwgMTYpOworCQkJcmV0dXJuOworCQl9CisJCWlmICgoc2VxICYgU1NfTUFTSykgIT0gU1NfRE9ORSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInNlcSBzdGVwICV4IGFmdGVyIGNvbW1hbmRcbiIsIHNlcSk7CisJCQljbWRfZG9uZShzdGF0ZSwgRElEX0VSUk9SIDw8IDE2KTsKKwkJCXJldHVybjsKKwkJfQorCQl3cml0ZWIoQ01EX05PUCwgJnJlZ3MtPmNvbW1hbmQpOworCQkvKiBzZXQgRE1BIGNvbnRyb2xsZXIgZ29pbmcgaWYgYW55IGRhdGEgdG8gdHJhbnNmZXIgKi8KKwkJaWYgKChzdGF0ICYgKFNUQVRfTVNHfFNUQVRfQ0QpKSA9PSAwCisJCSAgICAmJiAoY21kLT51c2Vfc2cgPiAwIHx8IGNtZC0+cmVxdWVzdF9idWZmbGVuICE9IDApKSB7CisJCQluYiA9IGNtZC0+U0NwLnRoaXNfcmVzaWR1YWw7CisJCQlpZiAobmIgPiAweGZmZjApCisJCQkJbmIgPSAweGZmZjA7CisJCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsIC09IG5iOworCQkJd3JpdGViKG5iLCAmcmVncy0+Y291bnRfbG8pOworCQkJd3JpdGViKG5iID4+IDgsICZyZWdzLT5jb3VudF9taWQpOworCQkJd3JpdGViKENNRF9ETUFfTU9ERSArIENNRF9OT1AsICZyZWdzLT5jb21tYW5kKTsKKwkJCXdyaXRlbCh2aXJ0X3RvX3BoeXMoc3RhdGUtPmRtYV9jbWRzKSwgJmRtYS0+Y21kcHRyKTsKKwkJCXdyaXRlbCgoUlVOIDw8IDE2KSB8IFJVTiwgJmRtYS0+Y29udHJvbCk7CisJCQl3cml0ZWIoQ01EX0RNQV9NT0RFICsgQ01EX1hGRVJfREFUQSwgJnJlZ3MtPmNvbW1hbmQpOworCQkJc3RhdGUtPnBoYXNlID0gZGF0YWluZzsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKChzdGF0ICYgU1RBVF9QSEFTRSkgPT0gU1RBVF9DRCArIFNUQVRfSU8pIHsKKwkJCS8qIHVwIHRvIHN0YXR1cyBwaGFzZSBhbHJlYWR5ICovCisJCQl3cml0ZWIoQ01EX0lfQ09NUExFVEUsICZyZWdzLT5jb21tYW5kKTsKKwkJCXN0YXRlLT5waGFzZSA9IGNvbXBsZXRpbmc7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiaW4gdW5leHBlY3RlZCBwaGFzZSAleCBhZnRlciBjbWRcbiIsCisJCQkgICAgICAgc3RhdCAmIFNUQVRfUEhBU0UpOworCQkJY21kX2RvbmUoc3RhdGUsIERJRF9FUlJPUiA8PCAxNik7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGRhdGFpbmc6CisJCWlmIChpbnRyICE9IElOVFJfQlVTX1NFUlYpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJnb3QgaW50ciAleCBiZWZvcmUgc3RhdHVzXG4iLCBpbnRyKTsKKwkJCWNtZF9kb25lKHN0YXRlLCBESURfRVJST1IgPDwgMTYpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChjbWQtPlNDcC50aGlzX3Jlc2lkdWFsICE9IDAKKwkJICAgICYmIChzdGF0ICYgKFNUQVRfTVNHfFNUQVRfQ0QpKSA9PSAwKSB7CisJCQkvKiBTZXQgdXAgdGhlIGNvdW50IHJlZ3MgdG8gdHJhbnNmZXIgbW9yZSAqLworCQkJbmIgPSBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsOworCQkJaWYgKG5iID4gMHhmZmYwKQorCQkJCW5iID0gMHhmZmYwOworCQkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCAtPSBuYjsKKwkJCXdyaXRlYihuYiwgJnJlZ3MtPmNvdW50X2xvKTsKKwkJCXdyaXRlYihuYiA+PiA4LCAmcmVncy0+Y291bnRfbWlkKTsKKwkJCXdyaXRlYihDTURfRE1BX01PREUgKyBDTURfTk9QLCAmcmVncy0+Y29tbWFuZCk7CisJCQl3cml0ZWIoQ01EX0RNQV9NT0RFICsgQ01EX1hGRVJfREFUQSwgJnJlZ3MtPmNvbW1hbmQpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKChzdGF0ICYgU1RBVF9QSEFTRSkgIT0gU1RBVF9DRCArIFNUQVRfSU8pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJpbnRyICV4IGJlZm9yZSBkYXRhIHhmZXIgY29tcGxldGVcbiIsIGludHIpOworCQl9CisJCXdyaXRlbChSVU4gPDwgMTYsICZkbWEtPmNvbnRyb2wpOwkvKiBzdG9wIGRtYSAqLworCQlpZiAoY21kLT51c2Vfc2cgIT0gMCkgeworCQkJcGNpX3VubWFwX3NnKHN0YXRlLT5wZGV2LAorCQkJCShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCWNtZC0+dXNlX3NnLCBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJfSBlbHNlIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoc3RhdGUtPnBkZXYsIHN0YXRlLT5kbWFfYWRkciwKKwkJCQljbWQtPnJlcXVlc3RfYnVmZmxlbiwgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCX0KKwkJLyogc2hvdWxkIGNoZWNrIGRtYSBzdGF0dXMgKi8KKwkJd3JpdGViKENNRF9JX0NPTVBMRVRFLCAmcmVncy0+Y29tbWFuZCk7CisJCXN0YXRlLT5waGFzZSA9IGNvbXBsZXRpbmc7CisJCWJyZWFrOworCWNhc2UgY29tcGxldGluZzoKKwkJaWYgKGludHIgIT0gSU5UUl9ET05FKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiZ290IGludHIgJXggb24gY29tcGxldGlvblxuIiwgaW50cik7CisJCQljbWRfZG9uZShzdGF0ZSwgRElEX0VSUk9SIDw8IDE2KTsKKwkJCXJldHVybjsKKwkJfQorCQljbWQtPlNDcC5TdGF0dXMgPSByZWFkYigmcmVncy0+Zmlmbyk7CisJCWNtZC0+U0NwLk1lc3NhZ2UgPSByZWFkYigmcmVncy0+Zmlmbyk7CisJCWNtZC0+cmVzdWx0ID0gQ01EX0FDQ0VQVF9NU0c7CisJCXdyaXRlYihDTURfQUNDRVBUX01TRywgJnJlZ3MtPmNvbW1hbmQpOworCQlzdGF0ZS0+cGhhc2UgPSBidXNmcmVlaW5nOworCQlicmVhazsKKwljYXNlIGJ1c2ZyZWVpbmc6CisJCWlmIChpbnRyICE9IElOVFJfRElTQ09OTkVDVCkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgImdvdCBpbnRyICV4IHdoZW4gZXhwZWN0ZWQgZGlzY29ubmVjdFxuIiwgaW50cik7CisJCX0KKwkJY21kX2RvbmUoc3RhdGUsIChESURfT0sgPDwgMTYpICsgKGNtZC0+U0NwLk1lc3NhZ2UgPDwgOCkKKwkJCSArIGNtZC0+U0NwLlN0YXR1cyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJkb24ndCBrbm93IGFib3V0IHBoYXNlICVkXG4iLCBzdGF0ZS0+cGhhc2UpOworCX0KK30KKworc3RhdGljIHZvaWQgY21kX2RvbmUoc3RydWN0IGZzY19zdGF0ZSAqc3RhdGUsIGludCByZXN1bHQpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCisJY21kID0gc3RhdGUtPmN1cnJlbnRfcmVxOworCWlmIChjbWQgIT0gMCkgeworCQljbWQtPnJlc3VsdCA9IHJlc3VsdDsKKwkJKCpjbWQtPnNjc2lfZG9uZSkoY21kKTsKKwkJc3RhdGUtPmN1cnJlbnRfcmVxID0gTlVMTDsKKwl9CisJc3RhdGUtPnBoYXNlID0gaWRsZTsKKwltYWM1M2M5NF9zdGFydChzdGF0ZSk7Cit9CisKKy8qCisgKiBTZXQgdXAgRE1BIGNvbW1hbmRzIGZvciB0cmFuc2ZlcnJpbmcgZGF0YS4KKyAqLworc3RhdGljIHZvaWQgc2V0X2RtYV9jbWRzKHN0cnVjdCBmc2Nfc3RhdGUgKnN0YXRlLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJaW50IGksIGRtYV9jbWQsIHRvdGFsOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2NsOworCXN0cnVjdCBkYmRtYV9jbWQgKmRjbWRzOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJdTMyIGRtYV9sZW47CisKKwlkbWFfY21kID0gY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFID8KKwkJCU9VVFBVVF9NT1JFIDogSU5QVVRfTU9SRTsKKwlkY21kcyA9IHN0YXRlLT5kbWFfY21kczsKKwlpZiAoY21kLT51c2Vfc2cgPiAwKSB7CisJCWludCBuc2VnOworCisJCXRvdGFsID0gMDsKKwkJc2NsID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBjbWQtPmJ1ZmZlcjsKKwkJbnNlZyA9IHBjaV9tYXBfc2coc3RhdGUtPnBkZXYsIHNjbCwgY21kLT51c2Vfc2csCisJCQkJY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCWZvciAoaSA9IDA7IGkgPCBuc2VnOyArK2kpIHsKKwkJCWRtYV9hZGRyID0gc2dfZG1hX2FkZHJlc3Moc2NsKTsKKwkJCWRtYV9sZW4gPSBzZ19kbWFfbGVuKHNjbCk7CisJCQlpZiAoZG1hX2xlbiA+IDB4ZmZmZikKKwkJCQlwYW5pYygibWFjNTNjOTQ6IHNjYXR0ZXJsaXN0IGVsZW1lbnQgPj0gNjRrIik7CisJCQl0b3RhbCArPSBkbWFfbGVuOworCQkJc3RfbGUxNigmZGNtZHMtPnJlcV9jb3VudCwgZG1hX2xlbik7CisJCQlzdF9sZTE2KCZkY21kcy0+Y29tbWFuZCwgZG1hX2NtZCk7CisJCQlzdF9sZTMyKCZkY21kcy0+cGh5X2FkZHIsIGRtYV9hZGRyKTsKKwkJCWRjbWRzLT54ZmVyX3N0YXR1cyA9IDA7CisJCQkrK3NjbDsKKwkJCSsrZGNtZHM7CisJCX0KKwl9IGVsc2UgeworCQl0b3RhbCA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCQlpZiAodG90YWwgPiAweGZmZmYpCisJCQlwYW5pYygibWFjNTNjOTQ6IHRyYW5zZmVyIHNpemUgPj0gNjRrIik7CisJCWRtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUoc3RhdGUtPnBkZXYsIGNtZC0+cmVxdWVzdF9idWZmZXIsCisJCQkJCSAgdG90YWwsIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQlzdGF0ZS0+ZG1hX2FkZHIgPSBkbWFfYWRkcjsKKwkJc3RfbGUxNigmZGNtZHMtPnJlcV9jb3VudCwgdG90YWwpOworCQlzdF9sZTMyKCZkY21kcy0+cGh5X2FkZHIsIGRtYV9hZGRyKTsKKwkJZGNtZHMtPnhmZXJfc3RhdHVzID0gMDsKKwkJKytkY21kczsKKwl9CisJZG1hX2NtZCArPSBPVVRQVVRfTEFTVCAtIE9VVFBVVF9NT1JFOworCXN0X2xlMTYoJmRjbWRzWy0xXS5jb21tYW5kLCBkbWFfY21kKTsKKwlzdF9sZTE2KCZkY21kcy0+Y29tbWFuZCwgREJETUFfU1RPUCk7CisJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IHRvdGFsOworfQorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBtYWM1M2M5NF90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCT0gIjUzYzk0IiwKKwkubmFtZQkJPSAiNTNDOTQiLAorCS5xdWV1ZWNvbW1hbmQJPSBtYWM1M2M5NF9xdWV1ZSwKKwkuZWhfYWJvcnRfaGFuZGxlciA9IG1hYzUzYzk0X2Fib3J0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIgPSBtYWM1M2M5NF9ob3N0X3Jlc2V0LAorCS5jYW5fcXVldWUJPSAxLAorCS50aGlzX2lkCT0gNywKKwkuc2dfdGFibGVzaXplCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorfTsKKworc3RhdGljIGludCBtYWM1M2M5NF9wcm9iZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IG1hY2lvX2dldF9vZl9ub2RlKG1kZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gbWFjaW9fZ2V0X3BjaV9kZXYobWRldik7CisJc3RydWN0IGZzY19zdGF0ZSAqc3RhdGU7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwl2b2lkICpkbWFfY21kX3NwYWNlOworCXVuc2lnbmVkIGNoYXIgKmNsa3Byb3A7CisJaW50IHByb3BsZW47CisKKwlpZiAobWFjaW9fcmVzb3VyY2VfY291bnQobWRldikgIT0gMiB8fCBtYWNpb19pcnFfY291bnQobWRldikgIT0gMikgeworCQlwcmludGsoS0VSTl9FUlIgIm1hYzUzYzk0OiBleHBlY3RlZCAyIGFkZHJzIGFuZCBpbnRycyAoZ290ICVkLyVkKVxuIiwKKwkJICAgICAgIG5vZGUtPm5fYWRkcnMsIG5vZGUtPm5faW50cnMpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAobWFjaW9fcmVxdWVzdF9yZXNvdXJjZXMobWRldiwgIm1hYzUzYzk0IikgIT0gMCkgeworICAgICAgIAkJcHJpbnRrKEtFUk5fRVJSICJtYWM1M2M5NDogdW5hYmxlIHRvIHJlcXVlc3QgbWVtb3J5IHJlc291cmNlcyIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworICAgICAgIAlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZtYWM1M2M5NF90ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBmc2Nfc3RhdGUpKTsKKwlpZiAoaG9zdCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWFjNTNjOTQ6IGNvdWxkbid0IHJlZ2lzdGVyIGhvc3QiKTsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisKKwlzdGF0ZSA9IChzdHJ1Y3QgZnNjX3N0YXRlICopIGhvc3QtPmhvc3RkYXRhOworCW1hY2lvX3NldF9kcnZkYXRhKG1kZXYsIHN0YXRlKTsKKwlzdGF0ZS0+aG9zdCA9IGhvc3Q7CisJc3RhdGUtPnBkZXYgPSBwZGV2OworCXN0YXRlLT5tZGV2ID0gbWRldjsKKworCXN0YXRlLT5yZWdzID0gKHN0cnVjdCBtYWM1M2M5NF9yZWdzIF9faW9tZW0gKikKKwkJaW9yZW1hcChtYWNpb19yZXNvdXJjZV9zdGFydChtZGV2LCAwKSwgMHgxMDAwKTsKKwlzdGF0ZS0+aW50ciA9IG1hY2lvX2lycShtZGV2LCAwKTsKKwlzdGF0ZS0+ZG1hID0gKHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKikKKwkJaW9yZW1hcChtYWNpb19yZXNvdXJjZV9zdGFydChtZGV2LCAxKSwgMHgxMDAwKTsKKwlzdGF0ZS0+ZG1haW50ciA9IG1hY2lvX2lycShtZGV2LCAxKTsKKwlpZiAoc3RhdGUtPnJlZ3MgPT0gTlVMTCB8fCBzdGF0ZS0+ZG1hID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtYWM1M2M5NDogaW9yZW1hcCBmYWlsZWQgZm9yICVzXG4iLAorCQkgICAgICAgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKyAgICAgICAJY2xrcHJvcCA9IGdldF9wcm9wZXJ0eShub2RlLCAiY2xvY2stZnJlcXVlbmN5IiwgJnByb3BsZW4pOworICAgICAgIAlpZiAoY2xrcHJvcCA9PSBOVUxMIHx8IHByb3BsZW4gIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGdldCBjbG9jayBmcmVxdWVuY3ksICIKKyAgICAgICAJCSAgICAgICAiYXNzdW1pbmcgMjVNSHpcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisgICAgICAgCQlzdGF0ZS0+Y2xrX2ZyZXEgPSAyNTAwMDAwMDsKKyAgICAgICAJfSBlbHNlCisgICAgICAgCQlzdGF0ZS0+Y2xrX2ZyZXEgPSAqKGludCAqKWNsa3Byb3A7CisKKyAgICAgICAJLyogU3BhY2UgZm9yIGRtYSBjb21tYW5kIGxpc3Q6ICsxIGZvciBzdG9wIGNvbW1hbmQsCisgICAgICAgCSAqICsxIHRvIGFsbG93IGZvciBhbGlnbmluZy4KKwkgKiBYWFggRklYTUU6IFVzZSBETUEgY29uc2lzdGVudCByb3V0aW5lcworCSAqLworICAgICAgIAlkbWFfY21kX3NwYWNlID0ga21hbGxvYygoaG9zdC0+c2dfdGFibGVzaXplICsgMikgKgorICAgICAgIAkJCQlzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCksIEdGUF9LRVJORUwpOworICAgICAgIAlpZiAoZG1hX2NtZF9zcGFjZSA9PSAwKSB7CisgICAgICAgCQlwcmludGsoS0VSTl9FUlIgIm1hYzUzYzk0OiBjb3VsZG4ndCBhbGxvY2F0ZSBkbWEgIgorICAgICAgIAkJICAgICAgICJjb21tYW5kIHNwYWNlIGZvciAlc1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKyAgICAgICAJCWdvdG8gb3V0X2ZyZWU7CisgICAgICAgCX0KKwlzdGF0ZS0+ZG1hX2NtZHMgPSAoc3RydWN0IGRiZG1hX2NtZCAqKURCRE1BX0FMSUdOKGRtYV9jbWRfc3BhY2UpOworCW1lbXNldChzdGF0ZS0+ZG1hX2NtZHMsIDAsIChob3N0LT5zZ190YWJsZXNpemUgKyAxKQorCSAgICAgICAqIHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKSk7CisJc3RhdGUtPmRtYV9jbWRfc3BhY2UgPSBkbWFfY21kX3NwYWNlOworCisJbWFjNTNjOTRfaW5pdChzdGF0ZSk7CisKKwlpZiAocmVxdWVzdF9pcnEoc3RhdGUtPmludHIsIGRvX21hYzUzYzk0X2ludGVycnVwdCwgMCwgIjUzQzk0Iiwgc3RhdGUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWFjNTNDOTQ6IGNhbid0IGdldCBpcnEgJWQgZm9yICVzXG4iLAorCQkgICAgICAgc3RhdGUtPmludHIsIG5vZGUtPmZ1bGxfbmFtZSk7CisJCWdvdG8gb3V0X2ZyZWVfZG1hOworCX0KKworCS8qIFhYWCBGSVhNRTogaGFuZGxlIGZhaWx1cmUgKi8KKwlzY3NpX2FkZF9ob3N0KGhvc3QsICZtZGV2LT5vZmRldi5kZXYpOworCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCisJcmV0dXJuIDA7CisKKyBvdXRfZnJlZV9kbWE6CisJa2ZyZWUoc3RhdGUtPmRtYV9jbWRfc3BhY2UpOworIG91dF9mcmVlOgorCWlmIChzdGF0ZS0+ZG1hICE9IE5VTEwpCisJCWlvdW5tYXAoc3RhdGUtPmRtYSk7CisJaWYgKHN0YXRlLT5yZWdzICE9IE5VTEwpCisJCWlvdW5tYXAoc3RhdGUtPnJlZ3MpOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7Cisgb3V0X3JlbGVhc2U6CisJbWFjaW9fcmVsZWFzZV9yZXNvdXJjZXMobWRldik7CisKKwlyZXR1cm4gIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgbWFjNTNjOTRfcmVtb3ZlKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYpCit7CisJc3RydWN0IGZzY19zdGF0ZSAqZnAgPSAoc3RydWN0IGZzY19zdGF0ZSAqKW1hY2lvX2dldF9kcnZkYXRhKG1kZXYpOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBmcC0+aG9zdDsKKworCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CisKKwlmcmVlX2lycShmcC0+aW50ciwgZnApOworCisJaWYgKGZwLT5yZWdzKQorCQlpb3VubWFwKCh2b2lkICopIGZwLT5yZWdzKTsKKwlpZiAoZnAtPmRtYSkKKwkJaW91bm1hcCgodm9pZCAqKSBmcC0+ZG1hKTsKKwlrZnJlZShmcC0+ZG1hX2NtZF9zcGFjZSk7CisKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworCisJbWFjaW9fcmVsZWFzZV9yZXNvdXJjZXMobWRldik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IG9mX21hdGNoIG1hYzUzYzk0X21hdGNoW10gPSAKK3sKKwl7CisJLm5hbWUgCQk9ICI1M2M5NCIsCisJLnR5cGUJCT0gT0ZfQU5ZX01BVENILAorCS5jb21wYXRpYmxlCT0gT0ZfQU5ZX01BVENICisJfSwKKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFjaW9fZHJpdmVyIG1hYzUzYzk0X2RyaXZlciA9IAoreworCS5uYW1lIAkJPSAibWFjNTNjOTQiLAorCS5tYXRjaF90YWJsZQk9IG1hYzUzYzk0X21hdGNoLAorCS5wcm9iZQkJPSBtYWM1M2M5NF9wcm9iZSwKKwkucmVtb3ZlCQk9IG1hYzUzYzk0X3JlbW92ZSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9tYWM1M2M5NCh2b2lkKQoreworCXJldHVybiBtYWNpb19yZWdpc3Rlcl9kcml2ZXIoJm1hYzUzYzk0X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X21hYzUzYzk0KHZvaWQpCit7CisJcmV0dXJuIG1hY2lvX3VucmVnaXN0ZXJfZHJpdmVyKCZtYWM1M2M5NF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbml0X21hYzUzYzk0KTsKK21vZHVsZV9leGl0KGV4aXRfbWFjNTNjOTQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlBvd2VyTWFjIDUzYzk0IFNDU0kgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJQYXVsIE1hY2tlcnJhcyA8cGF1bHVzQHNhbWJhLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tYWM1M2M5NC5oIGIvZHJpdmVycy9zY3NpL21hYzUzYzk0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFkMjRlNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9tYWM1M2M5NC5oCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogbWFjNTNjOTQuaDogZGVmaW5pdGlvbnMgZm9yIHRoZSBkcml2ZXIgZm9yIHRoZSA1M2M5NCBTQ1NJIGJ1cyBhZGFwdG9yCisgKiBmb3VuZCBvbiBQb3dlciBNYWNpbnRvc2ggY29tcHV0ZXJzLCBjb250cm9sbGluZyB0aGUgZXh0ZXJuYWwgU0NTSSBjaGFpbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMuCisgKi8KKyNpZm5kZWYgX01BQzUzQzk0X0gKKyNkZWZpbmUgX01BQzUzQzk0X0gKKworLyoKKyAqIFJlZ2lzdGVycyBpbiB0aGUgNTNDOTQgY29udHJvbGxlci4KKyAqLworCitzdHJ1Y3QgbWFjNTNjOTRfcmVncyB7CisJdW5zaWduZWQgY2hhcgljb3VudF9sbzsKKwljaGFyIHBhZDBbMTVdOworCXVuc2lnbmVkIGNoYXIJY291bnRfbWlkOworCWNoYXIgcGFkMVsxNV07CisJdW5zaWduZWQgY2hhcglmaWZvOworCWNoYXIgcGFkMlsxNV07CisJdW5zaWduZWQgY2hhcgljb21tYW5kOworCWNoYXIgcGFkM1sxNV07CisJdW5zaWduZWQgY2hhcglzdGF0dXM7CisJY2hhciBwYWQ0WzE1XTsKKwl1bnNpZ25lZCBjaGFyCWludGVycnVwdDsKKwljaGFyIHBhZDVbMTVdOworCXVuc2lnbmVkIGNoYXIJc2Vxc3RlcDsKKwljaGFyIHBhZDZbMTVdOworCXVuc2lnbmVkIGNoYXIJZmxhZ3M7CisJY2hhciBwYWQ3WzE1XTsKKwl1bnNpZ25lZCBjaGFyCWNvbmZpZzE7CisJY2hhciBwYWQ4WzE1XTsKKwl1bnNpZ25lZCBjaGFyCWNsa19mYWN0b3I7CisJY2hhciBwYWQ5WzE1XTsKKwl1bnNpZ25lZCBjaGFyCXRlc3Q7CisJY2hhciBwYWQxMFsxNV07CisJdW5zaWduZWQgY2hhcgljb25maWcyOworCWNoYXIgcGFkMTFbMTVdOworCXVuc2lnbmVkIGNoYXIJY29uZmlnMzsKKwljaGFyIHBhZDEyWzE1XTsKKwl1bnNpZ25lZCBjaGFyCWNvbmZpZzQ7CisJY2hhciBwYWQxM1sxNV07CisJdW5zaWduZWQgY2hhcgljb3VudF9oaTsKKwljaGFyIHBhZDE0WzE1XTsKKwl1bnNpZ25lZCBjaGFyCWZpZm9fcmVzOworCWNoYXIgcGFkMTVbMTVdOworfTsKKworLyoKKyAqIEFsdGVybmF0ZSBmdW5jdGlvbnMgZm9yIHNvbWUgcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIGRlc3RfaWQJCXN0YXR1cworI2RlZmluZSBzZWxfdGltZW91dAlpbnRlcnJ1cHQKKyNkZWZpbmUgc3luY19wZXJpb2QJc2Vxc3RlcAorI2RlZmluZSBzeW5jX29mZnNldAlmbGFncworCisvKgorICogQml0cyBpbiBjb21tYW5kIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIENNRF9ETUFfTU9ERQkweDgwCisjZGVmaW5lIENNRF9NT0RFX01BU0sJMHg3MAorI2RlZmluZSBDTURfTU9ERV9JTklUCTB4MTAKKyNkZWZpbmUgQ01EX01PREVfVEFSRwkweDIwCisjZGVmaW5lIENNRF9NT0RFX0RJU0MJMHg0MAorCisjZGVmaW5lIENNRF9OT1AJCTAKKyNkZWZpbmUgQ01EX0ZMVVNICTEKKyNkZWZpbmUgQ01EX1JFU0VUCTIKKyNkZWZpbmUgQ01EX1NDU0lfUkVTRVQJMworCisjZGVmaW5lIENNRF9YRkVSX0RBVEEJMHgxMAorI2RlZmluZSBDTURfSV9DT01QTEVURQkweDExCisjZGVmaW5lIENNRF9BQ0NFUFRfTVNHCTB4MTIKKyNkZWZpbmUgQ01EX1hGRVJfUEFECTB4MTgKKyNkZWZpbmUgQ01EX1NFVF9BVE4JMHgxYQorI2RlZmluZSBDTURfQ0xSX0FUTgkweDFiCisKKyNkZWZpbmUgQ01EX1NFTkRfTVNHCTB4MjAKKyNkZWZpbmUgQ01EX1NFTkRfU1RBVFVTCTB4MjEKKyNkZWZpbmUgQ01EX1NFTkRfREFUQQkweDIyCisjZGVmaW5lIENNRF9ESVNDX1NFUQkweDIzCisjZGVmaW5lIENNRF9URVJNSU5BVEUJMHgyNAorI2RlZmluZSBDTURfVF9DT01QTEVURQkweDI1CisjZGVmaW5lIENNRF9ESVNDT05ORUNUCTB4MjcKKyNkZWZpbmUgQ01EX1JFQ1ZfTVNHCTB4MjgKKyNkZWZpbmUgQ01EX1JFQ1ZfQ0RCCTB4MjkKKyNkZWZpbmUgQ01EX1JFQ1ZfREFUQQkweDJhCisjZGVmaW5lIENNRF9SRUNWX0NNRAkweDJiCisjZGVmaW5lIENNRF9BQk9SVF9ETUEJMHgwNAorCisjZGVmaW5lIENNRF9SRVNFTEVDVAkweDQwCisjZGVmaW5lIENNRF9TRUxFQ1QJMHg0MQorI2RlZmluZSBDTURfU0VMRUNUX0FUTgkweDQyCisjZGVmaW5lIENNRF9TRUxBVE5fU1RPUAkweDQzCisjZGVmaW5lIENNRF9FTkFCTEVfU0VMCTB4NDQKKyNkZWZpbmUgQ01EX0RJU0FCTEVfU0VMCTB4NDUKKyNkZWZpbmUgQ01EX1NFTF9BVE4zCTB4NDYKKyNkZWZpbmUgQ01EX1JFU0VMX0FUTjMJMHg0NworCisvKgorICogQml0cyBpbiBzdGF0dXMgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU1RBVF9JUlEJMHg4MAorI2RlZmluZSBTVEFUX0VSUk9SCTB4NDAKKyNkZWZpbmUgU1RBVF9QQVJJVFkJMHgyMAorI2RlZmluZSBTVEFUX1RDX1pFUk8JMHgxMAorI2RlZmluZSBTVEFUX0RPTkUJMHgwOAorI2RlZmluZSBTVEFUX1BIQVNFCTB4MDcKKyNkZWZpbmUgU1RBVF9NU0cJMHgwNAorI2RlZmluZSBTVEFUX0NECQkweDAyCisjZGVmaW5lIFNUQVRfSU8JCTB4MDEKKworLyoKKyAqIEJpdHMgaW4gaW50ZXJydXB0IHJlZ2lzdGVyLgorICovCisjZGVmaW5lIElOVFJfUkVTRVQJMHg4MAkvKiBTQ1NJIGJ1cyB3YXMgcmVzZXQgKi8KKyNkZWZpbmUgSU5UUl9JTExfQ01ECTB4NDAJLyogaWxsZWdhbCBjb21tYW5kICovCisjZGVmaW5lIElOVFJfRElTQ09OTkVDVAkweDIwCS8qIHdlIGdvdCBkaXNjb25uZWN0ZWQgKi8KKyNkZWZpbmUgSU5UUl9CVVNfU0VSVgkweDEwCS8qIGJ1cyBzZXJ2aWNlIHJlcXVlc3RlZCAqLworI2RlZmluZSBJTlRSX0RPTkUJMHgwOAkvKiBmdW5jdGlvbiBjb21wbGV0ZWQgKi8KKyNkZWZpbmUgSU5UUl9SRVNFTEVDVEVECTB4MDQJLyogd2Ugd2VyZSByZXNlbGVjdGVkICovCisjZGVmaW5lIElOVFJfU0VMX0FUTgkweDAyCS8qIHdlIHdlcmUgc2VsZWN0ZWQsIEFUTiBhc3NlcnRlZCAqLworI2RlZmluZSBJTlRSX1NFTEVDVAkweDAxCS8qIHdlIHdlcmUgc2VsZWN0ZWQsIEFUTiBuZWdhdGVkICovCisKKy8qCisgKiBFbmNvZGluZyBmb3IgdGhlIHNlbGVjdCB0aW1lb3V0LgorICovCisjZGVmaW5lIFRJTU9fVkFMKHgpCSgoeCkgKiA1MDAwIC8gNzY4MikKKworLyoKKyAqIEJpdHMgaW4gc2VxdWVuY2Ugc3RlcCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBTU19NQVNLCQk3CisjZGVmaW5lIFNTX0FSQl9TRUwJMAkvKiBTZWxlY3Rpb24gJiBhcmJpdHJhdGlvbiBjb21wbGV0ZSAqLworI2RlZmluZSBTU19NU0dfU0VOVAkxCS8qIE9uZSBtZXNzYWdlIGJ5dGUgc2VudCAqLworI2RlZmluZSBTU19OT1RfQ01ECTIJLyogTm90IGluIGNvbW1hbmQgcGhhc2UgKi8KKyNkZWZpbmUgU1NfUEhBU0VfQ0hHCTMJLyogRWFybHkgcGhhc2UgY2hhbmdlLCBjbWQgYnl0ZXMgbG9zdCAqLworI2RlZmluZSBTU19ET05FCQk0CS8qIENvbW1hbmQgd2FzIHNlbnQgT0sgKi8KKworLyoKKyAqIEVuY29kaW5nIGZvciBzeW5jIHRyYW5zZmVyIHBlcmlvZC4KKyAqLworI2RlZmluZSBTWU5DUF9NQVNLCTB4MWYKKyNkZWZpbmUgU1lOQ1BfTUlOCTQKKyNkZWZpbmUgU1lOQ1BfTUFYCTMxCisKKy8qCisgKiBCaXRzIGluIGZsYWdzIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIEZMQUdTX0ZJRk9fTEVWCTB4MWYKKyNkZWZpbmUgRkxBR1NfU0VRX1NURVAJMHhlMAorCisvKgorICogRW5jb2RpbmcgZm9yIHN5bmMgb2Zmc2V0LgorICovCisjZGVmaW5lIFNZTkNPX01BU0sJMHgwZgorI2RlZmluZSBTWU5DT19BU1NfQ1RSTAkweDMwCS8qIFJFUS9BQ0sgYXNzZXJ0aW9uIGNvbnRyb2wgKi8KKyNkZWZpbmUgU1lOQ09fTkVHX0NUUkwJMHhjMAkvKiBSRVEvQUNLIG5lZ2F0aW9uIGNvbnRyb2wgKi8KKworLyoKKyAqIEJpdHMgaW4gY29uZmlnMSByZWdpc3Rlci4KKyAqLworI2RlZmluZSBDRjFfU0xPV19DQUJMRQkweDgwCS8qIFNsb3cgY2FibGUgbW9kZSAqLworI2RlZmluZSBDRjFfTk9fUkVTX1JFUAkweDQwCS8qIERpc2FibGUgU0NTSSByZXNldCByZXBvcnRzICovCisjZGVmaW5lIENGMV9QQVJfVEVTVAkweDIwCS8qIFBhcml0eSB0ZXN0IG1vZGUgZW5hYmxlICovCisjZGVmaW5lIENGMV9QQVJfRU5BQkxFCTB4MTAJLyogRW5hYmxlIHBhcml0eSBjaGVja3MgKi8KKyNkZWZpbmUgQ0YxX1RFU1QJMHgwOAkvKiBDaGlwIHRlc3RzICovCisjZGVmaW5lIENGMV9NWV9JRAkweDA3CS8qIENvbnRyb2xsZXIncyBhZGRyZXNzIG9uIGJ1cyAqLworCisvKgorICogRW5jb2RpbmcgZm9yIGNsa19mYWN0b3IgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgQ0xLRl9NQVNLCTcKKyNkZWZpbmUgQ0xLRl9WQUwoZnJlcSkJKCgoKGZyZXEpICsgNDk5OTk5OSkgLyA1MDAwMDAwKSAmIENMS0ZfTUFTSykKKworLyoKKyAqIEJpdHMgaW4gdGVzdCBtb2RlIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFRFU1RfVEFSR0VUCTEJLyogdGFyZ2V0IHRlc3QgbW9kZSAqLworI2RlZmluZSBURVNUX0lOSVRJQVRPUgkyCS8qIGluaXRpYXRvciB0ZXN0IG1vZGUgKi8KKyNkZWZpbmUgVEVTVF9UUklTVEFURQk0CS8qIHRyaXN0YXRlIChoaS16KSB0ZXN0IG1vZGUgKi8KKworLyoKKyAqIEJpdHMgaW4gY29uZmlnMiByZWdpc3Rlci4KKyAqLworI2RlZmluZSBDRjJfUkZCCQkweDgwCisjZGVmaW5lIENGMl9GRUFUVVJFX0VOCTB4NDAJLyogZW5hYmxlIGZlYXR1cmVzIC8gcGhhc2UgbGF0Y2ggKi8KKyNkZWZpbmUgQ0YyX0JZVEVDVFJMCTB4MjAKKyNkZWZpbmUgQ0YyX0RSRVFfSElaCTB4MTAKKyNkZWZpbmUgQ0YyX1NDU0kyCTB4MDgKKyNkZWZpbmUgQ0YyX1BBUl9BQk9SVAkweDA0CS8qIGJhZCBwYXJpdHkgdGFyZ2V0IGFib3J0ICovCisjZGVmaW5lIENGMl9SRUdfUEFSRVJSCTB4MDIJLyogcmVnaXN0ZXIgcGFyaXR5IGVycm9yICovCisjZGVmaW5lIENGMl9ETUFfUEFSRVJSCTB4MDEJLyogRE1BIHBhcml0eSBlcnJvciAqLworCisvKgorICogQml0cyBpbiB0aGUgY29uZmlnMyByZWdpc3Rlci4KKyAqLworI2RlZmluZSBDRjNfSURfTVNHX0NISwkweDgwCisjZGVmaW5lIENGM18zQl9NU0dTCTB4NDAKKyNkZWZpbmUgQ0YzX0NEQjEwCTB4MjAKKyNkZWZpbmUgQ0YzX0ZBU1RTQ1NJCTB4MTAJLyogZW5hYmxlIGZhc3QgU0NTSSBzdXBwb3J0ICovCisjZGVmaW5lIENGM19GQVNUQ0xPQ0sJMHgwOAorI2RlZmluZSBDRjNfU0FWRVJFU0lECTB4MDQKKyNkZWZpbmUgQ0YzX0FMVF9ETUEJMHgwMgorI2RlZmluZSBDRjNfVEhSRVNIXzgJMHgwMQorCisvKgorICogQml0cyBpbiB0aGUgY29uZmlnNCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBDRjRfRUFOCQkweDA0CisjZGVmaW5lIENGNF9URVNUCTB4MDIKKyNkZWZpbmUgQ0Y0X0JCVEUJMHgwMQorCisjZW5kaWYgLyogX01BQzUzQzk0X0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tYWNfZXNwLmMgYi9kcml2ZXJzL3Njc2kvbWFjX2VzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NGM4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbWFjX2VzcC5jCkBAIC0wLDAgKzEsNzU0IEBACisvKgorICogNjhrIG1hYyA1M2M5WzQ2XSBzY3NpIGRyaXZlcgorICoKKyAqIGNvcHlyaWdodCAoYykgMTk5OCwgRGF2aWQgV2VpcyB3ZWlzZDM0NThAdW5pLmVkdQorICoKKyAqIGRlYnVnZ2luZyBvbiBRdWFkcmEgODAwIGFuZCA2NjBBViBNaWNoYWVsIFNjaG1pdHosIERhdmUgS2lsemVyIDcvOTgKKyAqCisgKiBiYXNlZCBsb29zZWx5IG9uIGN5YmVyX2VzcC5jCisgKi8KKworLyogdGhlc2UgYXJlIHVudXNlZCBmb3Igbm93ICovCisjZGVmaW5lIG15cmVhZGwoYWRkcikgKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIChhZGRyKSkKKyNkZWZpbmUgbXl3cml0ZWwoYiwgYWRkcikgKCgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoYWRkcikpID0gKGIpKQorCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJOQ1I1M0M5eC5oIgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2ludHMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaHcuaD4KKyNpbmNsdWRlIDxhc20vbWFjX3ZpYS5oPgorCisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNpbnRvc2guaD4KKworLyogI2RlZmluZSBERUJVR19NQUNfRVNQICovCisKKyNkZWZpbmUgbWFjX3R1cm5vbl9pcnEoeCkJbWFjX2VuYWJsZV9pcnEoeCkKKyNkZWZpbmUgbWFjX3R1cm5vZmZfaXJxKHgpCW1hY19kaXNhYmxlX2lycSh4KQorCitleHRlcm4gdm9pZCBlc3BfaGFuZGxlKHN0cnVjdCBOQ1JfRVNQICplc3ApOworZXh0ZXJuIHZvaWQgbWFjX2VzcF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnByZWdzKTsKKworc3RhdGljIGludCAgZG1hX2J5dGVzX3NlbnQoc3RydWN0IE5DUl9FU1AgKiBlc3AsIGludCBmaWZvX2NvdW50KTsKK3N0YXRpYyBpbnQgIGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKiBlc3AsIFNjc2lfQ21uZCAqc3ApOworc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKiBlc3ApOworc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqIGVzcCwgY2hhciAqIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICogZXNwLCBjaGFyICogdmFkZHJlc3MsIGludCBsZW5ndGgpOworc3RhdGljIHZvaWQgZG1hX2ludHNfb2ZmKHN0cnVjdCBOQ1JfRVNQICogZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICogZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqIGVzcCk7CitzdGF0aWMgaW50ICBkbWFfaXJxX3BfcXVpY2soc3RydWN0IE5DUl9FU1AgKiBlc3ApOworc3RhdGljIHZvaWQgZG1hX2xlZF9vZmYoc3RydWN0IE5DUl9FU1AgKiBlc3ApOworc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICogZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSk7CitzdGF0aWMgdm9pZCBkbWFfc2V0dXBfcXVpY2soc3RydWN0IE5DUl9FU1AgKiBlc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKTsKKworc3RhdGljIGludCBlc3BfZGFmYl9kbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKiBlc3BkZXYpOworc3RhdGljIGludCBlc3BfaW9zYl9kbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKiBlc3BkZXYpOworCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzE2XTsKKwkJCQkvKiBUaGlzIGlzIHdoZXJlIGFsbCBjb21tYW5kcyBhcmUgcHV0CisJCQkJICogYmVmb3JlIHRoZXkgYXJlIHRyYW5zZmVycmVkIHRvIHRoZSBFU1AgY2hpcAorCQkJCSAqIHZpYSBQSU8uCisJCQkJICovCisKK3N0YXRpYyBpbnQgZXNwX2luaXRpYWxpemVkID0gMDsKKworc3RhdGljIGludCBzZXR1cF9udW1fZXNwcyA9IC0xOworc3RhdGljIGludCBzZXR1cF9kaXNjb25uZWN0ID0gLTE7CitzdGF0aWMgaW50IHNldHVwX25vc3luYyA9IC0xOworc3RhdGljIGludCBzZXR1cF9jYW5fcXVldWUgPSAtMTsKK3N0YXRpYyBpbnQgc2V0dXBfY21kX3Blcl9sdW4gPSAtMTsKK3N0YXRpYyBpbnQgc2V0dXBfc2dfdGFibGVzaXplID0gLTE7CisjaWZkZWYgU1VQUE9SVF9UQUdTCitzdGF0aWMgaW50IHNldHVwX3VzZV90YWdnZWRfcXVldWluZyA9IC0xOworI2VuZGlmCitzdGF0aWMgaW50IHNldHVwX2hvc3RpZCA9IC0xOworCisvKgorICogRXhwZXJpbWVudGFsIEVTUCBpbnRoYW5kbGVyOyBjaGVjayBtYWNpbnRzLmMgdG8gbWFrZSBzdXJlIGRldl9pZCBpcyAKKyAqIHNldCB1cCBwcm9wZXJseSEKKyAqLworCit2b2lkIG1hY19lc3BfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpwcmVncykKK3sKKwlzdHJ1Y3QgTkNSX0VTUCAqZXNwID0gKHN0cnVjdCBOQ1JfRVNQICopIGRldl9pZDsKKwlpbnQgaXJxX3AgPSAwOworCisJLyogSGFuZGxlIHRoZSBvbmUgRVNQIGludGVycnVwdCBzaG93aW5nIGF0IHRoaXMgSVJRIGxldmVsLiAqLworCWlmKCgoZXNwKS0+aXJxICYgMHhmZikgPT0gaXJxKSB7CisJLyoKKwkgKiBEZWJ1ZyAuLgorCSAqLworCQlpcnFfcCA9IGVzcC0+ZG1hX2lycV9wKGVzcCk7CisJIAlwcmludGsoIm1hY19lc3A6IGlycV9wICV4IGN1cnJlbnQgJXAgZGlzY29ubmVjdGVkICVwXG4iLAorCSAJCWlycV9wLCBlc3AtPmN1cnJlbnRfU0MsIGVzcC0+ZGlzY29ubmVjdGVkX1NDKTsKKwkgCQkKKwkJLyoKKwkJICogTWFjOiBpZiB3ZSdyZSBoZXJlLCBpdCdzIGFuIEVTUCBpbnRlcnJ1cHQgZm9yIHN1cmUhCisJCSAqLworCQlpZigoZXNwLT5jdXJyZW50X1NDIHx8IGVzcC0+ZGlzY29ubmVjdGVkX1NDKSkgeworCQkJZXNwLT5kbWFfaW50c19vZmYoZXNwKTsKKworCQkJRVNQSVJRKCgiSSVkKCIsIGVzcC0+ZXNwX2lkKSk7CisJCQllc3BfaGFuZGxlKGVzcCk7CisJCQlFU1BJUlEoKCIpIikpOworCisJCQllc3AtPmRtYV9pbnRzX29uKGVzcCk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBEZWJ1ZyBob29rczsgdXNlIGZvciBwbGF5aW5nIHdpdGggdGhlIGludGVycnVwdCBmbGFnIHRlc3RpbmcgYW5kIGludGVycnVwdAorICogYWNrbm93bGVkZ2Ugb24gdGhlIHZhcmlvdXMgbWFjaGluZXMKKyAqLworCit2b2lkIHNjc2lfZXNwX3BvbGxlZChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpwcmVncykKK3sKKwlpZiAoZXNwX2luaXRpYWxpemVkID09IDApCisJCXJldHVybjsKKworCW1hY19lc3BfaW50cihpcnEsIGRldl9pZCwgcHJlZ3MpOworfQorCit2b2lkIGZha2VfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpwcmVncykKK3sKKyNpZmRlZiBERUJVR19NQUNfRVNQCisJcHJpbnRrKCJtYWNfZXNwOiBnb3QgaXJxXG4iKTsKKyNlbmRpZgorCisJbWFjX2VzcF9pbnRyKGlycSwgZGV2X2lkLCBwcmVncyk7Cit9CisKK2lycXJldHVybl90IGZha2VfZHJxKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnByZWdzKQoreworCXByaW50aygibWFjX2VzcDogZ290IGRycVxuIik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjZGVmaW5lIERSSVZFUl9TRVRVUAorCisvKgorICogRnVuY3Rpb24gOiBtYWNfZXNwX3NldHVwKGNoYXIgKnN0cikKKyAqCisgKiBQdXJwb3NlIDogYm9vdGVyIGNvbW1hbmQgbGluZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgb3ZlcnJpZGVzIGFycmF5LAorICoKKyAqIElucHV0cyA6IHN0ciAtIHBhcmFtZXRlcnMsIHNlcGFyYXRlZCBieSBjb21tYXMuCisgKgorICogQ3VycmVudGx5IHVudXNlZCBpbiB0aGUgbmV3IGRyaXZlcjsgbmVlZCB0byBhZGQgc2V0dGFibGUgcGFyYW1ldGVycyB0byB0aGUgCisgKiBkZXRlY3QgZnVuY3Rpb24uCisgKgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IG1hY19lc3Bfc2V0dXAoY2hhciAqc3RyKSB7CisjaWZkZWYgRFJJVkVSX1NFVFVQCisJLyogRm9ybWF0IG9mIG1hYzUzYzl4IHBhcmFtZXRlciBpczoKKwkgKiAgIG1hYzUzYzl4PTxudW1fZXNwcz4sPGRpc2Nvbm5lY3Q+LDxub3N5bmM+LDxjYW5fcXVldWU+LDxjbWRfcGVyX2x1bj4sPHNnX3RhYmxlc2l6ZT4sPGhvc3RpZD4sPHVzZV90YWdzPgorCSAqIE5lZ2F0aXZlIHZhbHVlcyBtZWFuIGRvbid0IGNoYW5nZS4KKwkgKi8KKwkKKwljaGFyICp0aGlzX29wdDsKKwlsb25nIG9wdDsKKworCXRoaXNfb3B0ID0gc3Ryc2VwICgmc3RyLCAiLCIpOworCWlmKHRoaXNfb3B0KSB7CisJCW9wdCA9IHNpbXBsZV9zdHJ0b2woIHRoaXNfb3B0LCBOVUxMLCAwICk7CisKKwkJaWYgKG9wdCA+PSAwICYmIG9wdCA8PSAyKQorCQkJc2V0dXBfbnVtX2VzcHMgPSBvcHQ7CisJCWVsc2UgaWYgKG9wdCA+IDIpCisJCQlwcmludGsoICJtYWNfZXNwX3NldHVwOiBpbnZhbGlkIG51bWJlciBvZiBob3N0cyAlbGQgIVxuIiwgb3B0ICk7CisKKwkJdGhpc19vcHQgPSBzdHJzZXAgKCZzdHIsICIsIik7CisJfQorCWlmKHRoaXNfb3B0KSB7CisJCW9wdCA9IHNpbXBsZV9zdHJ0b2woIHRoaXNfb3B0LCBOVUxMLCAwICk7CisJCisJCWlmIChvcHQgPiAwKQorCQkJc2V0dXBfZGlzY29ubmVjdCA9IG9wdDsKKworCQl0aGlzX29wdCA9IHN0cnNlcCAoJnN0ciwgIiwiKTsKKwl9CisJaWYodGhpc19vcHQpIHsKKwkJb3B0ID0gc2ltcGxlX3N0cnRvbCggdGhpc19vcHQsIE5VTEwsIDAgKTsKKworCQlpZiAob3B0ID49IDApCisJCQlzZXR1cF9ub3N5bmMgPSBvcHQ7CisKKwkJdGhpc19vcHQgPSBzdHJzZXAgKCZzdHIsICIsIik7CisJfQorCWlmKHRoaXNfb3B0KSB7CisJCW9wdCA9IHNpbXBsZV9zdHJ0b2woIHRoaXNfb3B0LCBOVUxMLCAwICk7CisKKwkJaWYgKG9wdCA+IDApCisJCQlzZXR1cF9jYW5fcXVldWUgPSBvcHQ7CisKKwkJdGhpc19vcHQgPSBzdHJzZXAgKCZzdHIsICIsIik7CisJfQorCWlmKHRoaXNfb3B0KSB7CisJCW9wdCA9IHNpbXBsZV9zdHJ0b2woIHRoaXNfb3B0LCBOVUxMLCAwICk7CisKKwkJaWYgKG9wdCA+IDApCisJCQlzZXR1cF9jbWRfcGVyX2x1biA9IG9wdDsKKworCQl0aGlzX29wdCA9IHN0cnNlcCAoJnN0ciwgIiwiKTsKKwl9CisJaWYodGhpc19vcHQpIHsKKwkJb3B0ID0gc2ltcGxlX3N0cnRvbCggdGhpc19vcHQsIE5VTEwsIDAgKTsKKworCQlpZiAob3B0ID49IDApIHsKKwkJCXNldHVwX3NnX3RhYmxlc2l6ZSA9IG9wdDsKKwkJCS8qIE11c3QgYmUgPD0gU0dfQUxMICgyNTUpICovCisJCQlpZiAoc2V0dXBfc2dfdGFibGVzaXplID4gU0dfQUxMKQorCQkJCXNldHVwX3NnX3RhYmxlc2l6ZSA9IFNHX0FMTDsKKwkJfQorCisJCXRoaXNfb3B0ID0gc3Ryc2VwICgmc3RyLCAiLCIpOworCX0KKwlpZih0aGlzX29wdCkgeworCQlvcHQgPSBzaW1wbGVfc3RydG9sKCB0aGlzX29wdCwgTlVMTCwgMCApOworCisJCS8qIE11c3QgYmUgYmV0d2VlbiAwIGFuZCA3ICovCisJCWlmIChvcHQgPj0gMCAmJiBvcHQgPD0gNykKKwkJCXNldHVwX2hvc3RpZCA9IG9wdDsKKwkJZWxzZSBpZiAob3B0ID4gNykKKwkJCXByaW50ayggIm1hY19lc3Bfc2V0dXA6IGludmFsaWQgaG9zdCBJRCAlbGQgIVxuIiwgb3B0KTsKKworCQl0aGlzX29wdCA9IHN0cnNlcCAoJnN0ciwgIiwiKTsKKwl9CisjaWZkZWYgU1VQUE9SVF9UQUdTCisJaWYodGhpc19vcHQpIHsKKwkJb3B0ID0gc2ltcGxlX3N0cnRvbCggdGhpc19vcHQsIE5VTEwsIDAgKTsKKwkJaWYgKG9wdCA+PSAwKQorCQkJc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nID0gISFvcHQ7CisJfQorI2VuZGlmCisjZW5kaWYKKwlyZXR1cm4gMTsgCit9CisKK19fc2V0dXAoIm1hYzUzYzl4PSIsIG1hY19lc3Bfc2V0dXApOworCisKKy8qCisgKiBFU1AgYWRkcmVzcyAnZGV0ZWN0aW9uJworICovCisKK3Vuc2lnbmVkIGxvbmcgZ2V0X2Jhc2UoaW50IGNoaXBfbnVtKQoreworCS8qCisJICogdXNpbmcgdGhlIGNoaXBfbnVtIGFuZCBtYWMgbW9kZWwsIGZpZ3VyZSBvdXQgd2hlcmUgdGhlCisJICogY2hpcHMgYXJlIG1hcHBlZAorCSAqLworCisJdW5zaWduZWQgbG9uZyBpb19iYXNlID0gMHg1MGYwMDAwMDsKKwl1bnNpZ25lZCBpbnQgc2Vjb25kX29mZnNldCA9IDB4NDAyOworCXVuc2lnbmVkIGxvbmcgc2NzaV9sb2MgPSAwOworCisJc3dpdGNoIChtYWNpbnRvc2hfY29uZmlnLT5zY3NpX3R5cGUpIHsKKworCS8qIDk1MCwgOTAwLCA3MDAgKi8KKwljYXNlIE1BQ19TQ1NJX1FVQURSQTI6CisJCXNjc2lfbG9jID0gIGlvX2Jhc2UgKyAweGYwMDAgKyAoKGNoaXBfbnVtID09IDApID8gMCA6IHNlY29uZF9vZmZzZXQpOworCQlicmVhazsKKworCS8qIGF2J3MgKi8KKwljYXNlIE1BQ19TQ1NJX1FVQURSQTM6CisJCXNjc2lfbG9jID0gaW9fYmFzZSArIDB4MTgwMDAgKyAoKGNoaXBfbnVtID09IDApID8gMCA6IHNlY29uZF9vZmZzZXQpOworCQlicmVhazsKKworCS8qIG1vc3QgcXVhZHJhL2NlbnRyaXMgbW9kZWxzIGFyZSBsaWtlIHRoaXMgKi8JCisJY2FzZSBNQUNfU0NTSV9RVUFEUkE6CisJCXNjc2lfbG9jID0gaW9fYmFzZSArIDB4MTAwMDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJtYWNfZXNwOiBnZXRfYmFzZTogaGl0IGRlZmF1bHQhXG4iKTsKKwkJc2NzaV9sb2MgPSBpb19iYXNlICsgMHgxMDAwMDsKKwkJYnJlYWs7CisKKwl9IC8qIHN3aXRjaCAqLworCisJcHJpbnRrKCJtYWNfZXNwOiBpbyBiYXNlIGF0IDB4JWx4XG4iLCBzY3NpX2xvYyk7CisKKwlyZXR1cm4gc2NzaV9sb2M7Cit9CisKKy8qCisgKiBNb2RlbCBkZXBlbmRlbnQgRVNQIHNldHVwCisgKi8KKworaW50IG1hY19lc3BfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqIHRwbnQpCit7CisJaW50IHF1aWNrID0gMDsKKwlpbnQgY2hpcG51bSwgY2hpcHNwcmVzZW50ID0gMDsKKyNpZiAwCisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworI2VuZGlmCisKKwlpZiAoZXNwX2luaXRpYWxpemVkID4gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiB3aGF0IGRvIHdlIGhhdmUgaW4gdGhpcyBtYWNoaW5lLi4uICovCisJaWYgKE1BQ0hXX1BSRVNFTlQoTUFDX1NDU0lfOTYpKSB7CisJCWNoaXBzcHJlc2VudCArKzsKKwl9CisKKwlpZiAoTUFDSFdfUFJFU0VOVChNQUNfU0NTSV85Nl8yKSkgeworCQljaGlwc3ByZXNlbnQgKys7CisJfQorCisJLyogbnVtYmVyIG9mIEVTUHMgcHJlc2VudCA/ICovCisJaWYgKHNldHVwX251bV9lc3BzID49IDApIHsKKwkgIGlmIChjaGlwc3ByZXNlbnQgPj0gc2V0dXBfbnVtX2VzcHMpCisJICAgIGNoaXBzcHJlc2VudCA9IHNldHVwX251bV9lc3BzOworCSAgZWxzZQorCSAgICBwcmludGsoIm1hY19lc3BfZGV0ZWN0OiBudW1faG9zdHMgZGV0ZWN0ZWQgJWQgc2V0dXAgJWQgXG4iLAorCQkgICBjaGlwc3ByZXNlbnQsIHNldHVwX251bV9lc3BzKTsKKwl9CisKKwkvKiBUT0RPOiBhZGQgZGlzY29ubmVjdCAvIG5vc3luYyBmbGFncyAqLworCisJLyogc2V0dXAgdmFyaWFibGVzICovCisJdHBudC0+Y2FuX3F1ZXVlID0KKwkgIChzZXR1cF9jYW5fcXVldWUgPiAwKSA/IHNldHVwX2Nhbl9xdWV1ZSA6IDc7CisJdHBudC0+Y21kX3Blcl9sdW4gPQorCSAgKHNldHVwX2NtZF9wZXJfbHVuID4gMCkgPyBzZXR1cF9jbWRfcGVyX2x1biA6IDE7CisJdHBudC0+c2dfdGFibGVzaXplID0gCisJICAoc2V0dXBfc2dfdGFibGVzaXplID49IDApID8gc2V0dXBfc2dfdGFibGVzaXplIDogU0dfQUxMOworCisJaWYgKHNldHVwX2hvc3RpZCA+PSAwKQorCSAgdHBudC0+dGhpc19pZCA9IHNldHVwX2hvc3RpZDsKKwllbHNlIHsKKwkgIC8qIHVzZSA3IGFzIGRlZmF1bHQgKi8KKwkgIHRwbnQtPnRoaXNfaWQgPSA3OworCX0KKworI2lmZGVmIFNVUFBPUlRfVEFHUworCWlmIChzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcgPCAwKQorCQlzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcgPSBERUZBVUxUX1VTRV9UQUdHRURfUVVFVUlORzsKKyNlbmRpZgorCisJZm9yIChjaGlwbnVtID0gMDsgY2hpcG51bSA8IGNoaXBzcHJlc2VudDsgY2hpcG51bSArKykgeworCQlzdHJ1Y3QgTkNSX0VTUCAqIGVzcDsKKworCQllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgKHZvaWQgKikgTlVMTCk7CisJCWVzcC0+ZXJlZ3MgPSAoc3RydWN0IEVTUF9yZWdzICopIGdldF9iYXNlKGNoaXBudW0pOworCisJCWVzcC0+ZG1hX2lycV9wID0gJmVzcF9kYWZiX2RtYV9pcnFfcDsKKwkJaWYgKGNoaXBudW0gPT0gMCkgeworCisJCQlpZiAobWFjaW50b3NoX2NvbmZpZy0+c2NzaV90eXBlID09IE1BQ19TQ1NJX1FVQURSQSkgeworCQkJCS8qIG1vc3QgbWFjaGluZXMgZXhjZXB0IHRob3NlIGJlbG93IDotKSAqLworCQkJCXF1aWNrID0gMTsKKwkJCQllc3AtPmRtYV9pcnFfcCA9ICZlc3BfaW9zYl9kbWFfaXJxX3A7CisJCQl9IGVsc2UgaWYgKG1hY2ludG9zaF9jb25maWctPnNjc2lfdHlwZSA9PSBNQUNfU0NTSV9RVUFEUkEzKSB7CisJCQkJLyogbW9zdGx5IGF2J3MgKi8KKwkJCQlxdWljayA9IDA7CisJCQl9IGVsc2UgeworCQkJCS8qIHE5NTAsIDkwMCwgNzAwICovCisJCQkJcXVpY2sgPSAxOworCQkJCW91dF9iZTMyKDB4Zjk4MDAwMjQsIDB4MWQxKTsKKwkJCQllc3AtPmRyZWdzID0gKHZvaWQgKikgMHhmOTgwMDAyNDsKKwkJCX0KKworCQl9IGVsc2UgeyAvKiBjaGlwbnVtICovCisKKwkJCXF1aWNrID0gMTsKKwkJCW91dF9iZTMyKDB4Zjk4MDAwMjgsIDB4MWQxKTsKKwkJCWVzcC0+ZHJlZ3MgPSAodm9pZCAqKSAweGY5ODAwMDI4OworCisJCX0gLyogY2hpcG51bSA9PSAwICovCisKKwkJLyogdXNlIHBpbyBmb3IgY29tbWFuZCBieXRlczsgcGlvIGZvciBtZXNzYWdlL2RhdGE6IFRCSSAqLworCQllc3AtPmRvX3Bpb19jbWRzID0gMTsKKworCQkvKiBTZXQgdGhlIGNvbW1hbmQgYnVmZmVyICovCisJCWVzcC0+ZXNwX2NvbW1hbmQgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciopIGNtZF9idWZmZXI7CisJCWVzcC0+ZXNwX2NvbW1hbmRfZHZtYSA9IChfX3UzMikgY21kX2J1ZmZlcjsKKworCQkvKiB2YXJpb3VzIGZ1bmN0aW9ucyAqLworCQllc3AtPmRtYV9ieXRlc19zZW50ID0gJmRtYV9ieXRlc19zZW50OworCQllc3AtPmRtYV9jYW5fdHJhbnNmZXIgPSAmZG1hX2Nhbl90cmFuc2ZlcjsKKwkJZXNwLT5kbWFfZHVtcF9zdGF0ZSA9ICZkbWFfZHVtcF9zdGF0ZTsKKwkJZXNwLT5kbWFfaW5pdF9yZWFkID0gTlVMTDsKKwkJZXNwLT5kbWFfaW5pdF93cml0ZSA9IE5VTEw7CisJCWVzcC0+ZG1hX2ludHNfb2ZmID0gJmRtYV9pbnRzX29mZjsKKwkJZXNwLT5kbWFfaW50c19vbiA9ICZkbWFfaW50c19vbjsKKworCQllc3AtPmRtYV9wb3J0c19wID0gJmRtYV9wb3J0c19wOworCisKKwkJLyogT3B0aW9uYWwgZnVuY3Rpb25zICovCisJCWVzcC0+ZG1hX2JhcnJpZXIgPSBOVUxMOworCQllc3AtPmRtYV9kcmFpbiA9IE5VTEw7CisJCWVzcC0+ZG1hX2ludmFsaWRhdGUgPSBOVUxMOworCQllc3AtPmRtYV9pcnFfZW50cnkgPSBOVUxMOworCQllc3AtPmRtYV9pcnFfZXhpdCA9IE5VTEw7CisJCWVzcC0+ZG1hX2xlZF9vbiA9IE5VTEw7CisJCWVzcC0+ZG1hX2xlZF9vZmYgPSBOVUxMOworCQllc3AtPmRtYV9wb2xsID0gTlVMTDsKKwkJZXNwLT5kbWFfcmVzZXQgPSBOVUxMOworCisJCS8qIFNDU0kgY2hpcCBzcGVlZCAqLworCQkvKiBiZWxvdyBlc3AtPmNmcmVxID0gNDAwMDAwMDA7ICovCisKKworCQlpZiAocXVpY2spIHsKKwkJCS8qICdxdWljaycgbWVhbnMgdGhlcmUncyBoYW5kc2hha2UgZ2x1ZSBsb2dpYyBsaWtlIGluIHRoZSA1MzgwIGNhc2UgKi8KKwkJCWVzcC0+ZG1hX3NldHVwID0gJmRtYV9zZXR1cF9xdWljazsKKwkJfSBlbHNlIHsKKwkJCWVzcC0+ZG1hX3NldHVwID0gJmRtYV9zZXR1cDsKKwkJfQorCisJCWlmIChjaGlwbnVtID09IDApIHsKKworCQkJZXNwLT5pcnEgPSBJUlFfTUFDX1NDU0k7CisKKwkJCXJlcXVlc3RfaXJxKElSUV9NQUNfU0NTSSwgZXNwX2ludHIsIDAsICJNYWMgRVNQIFNDU0kiLCBlc3AtPmVob3N0KTsKKyNpZiAwCS8qIGNvbmZsaWN0cyB3aXRoIElPUCBBREIgKi8KKwkJCXJlcXVlc3RfaXJxKElSUV9NQUNfU0NTSURSUSwgZmFrZV9kcnEsIDAsICJNYWMgRVNQIERSUSIsIGVzcC0+ZWhvc3QpOworI2VuZGlmCisKKwkJCWlmIChtYWNpbnRvc2hfY29uZmlnLT5zY3NpX3R5cGUgPT0gTUFDX1NDU0lfUVVBRFJBKSB7CisJCQkJZXNwLT5jZnJlcSA9IDE2NTAwMDAwOworCQkJfSBlbHNlIHsKKwkJCQllc3AtPmNmcmVxID0gMjUwMDAwMDA7CisJCQl9CisKKworCQl9IGVsc2UgeyAvKiBjaGlwbnVtID09IDEgKi8KKworCQkJZXNwLT5pcnEgPSBJUlFfTUFDX1NDU0lEUlE7CisjaWYgMAkvKiBjb25mbGljdHMgd2l0aCBJT1AgQURCICovCisJCQlyZXF1ZXN0X2lycShJUlFfTUFDX1NDU0lEUlEsIGVzcF9pbnRyLCAwLCAiTWFjIEVTUCBTQ1NJIDIiLCBlc3AtPmVob3N0KTsKKyNlbmRpZgorCisJCQllc3AtPmNmcmVxID0gMjUwMDAwMDA7CisKKwkJfQorCisJCWlmIChxdWljaykgeworCQkJcHJpbnRrKCJlc3A6IHVzaW5nIHF1aWNrIHZlcnNpb25cbiIpOworCQl9CisKKwkJcHJpbnRrKCJlc3A6IGFkZHIgYXQgMHglcFxuIiwgZXNwLT5lcmVncyk7CisKKwkJZXNwLT5zY3NpX2lkID0gNzsKKwkJZXNwLT5kaWZmID0gMDsKKworCQllc3BfaW5pdGlhbGl6ZShlc3ApOworCisJfSAvKiBmb3IgY2hpcG51bSAqLworCisJaWYgKGNoaXBzcHJlc2VudCkKKwkJcHJpbnRrKCJcbm1hY19lc3A6ICVkIGVzcCBjb250cm9sbGVycyBmb3VuZFxuIiwgY2hpcHNwcmVzZW50KTsKKworCWVzcF9pbml0aWFsaXplZCA9IGNoaXBzcHJlc2VudDsKKworCXJldHVybiBjaGlwc3ByZXNlbnQ7Cit9CisKK3N0YXRpYyBpbnQgbWFjX2VzcF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCWlmIChzaG9zdC0+aXJxKQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBOVUxMKTsKKwlpZiAoc2hvc3QtPmlvX3BvcnQgJiYgc2hvc3QtPm5faW9fcG9ydCkKKwkJcmVsZWFzZV9yZWdpb24oc2hvc3QtPmlvX3BvcnQsIHNob3N0LT5uX2lvX3BvcnQpOworCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJJ3ZlIGJlZW4gd29uZGVyaW5nIHdoYXQgdGhpcyBpcyBzdXBwb3NlZCB0byBkbywgZm9yIHNvbWUgdGltZS4gVGFsa2luZyAKKyAqIHRvIEFsbGVuIEJyaWdnczogVGhlc2UgbWFjaGluZXMgaGF2ZSBhbiBleHRyYSByZWdpc3RlciBzb21lcGxhY2Ugd2hlcmUgdGhlCisgKiBEUlEgcGluIG9mIHRoZSBFU1AgY2FuIGJlIG1vbml0b3JlZC4gVGhhdCBpc24ndCB1c2VmdWwgZm9yIGRldGVybWluaW5nIAorICogYW55dGhpbmcgZWxzZSAoc3VjaCBhcyByZXNlbGVjdCBpbnRlcnJ1cHQgb3Igb3RoZXIgbWFnaWMpIHRob3VnaC4gCisgKiBNYXliZSBtYWtlIHRoZSBzZW1hbnRpY3Mgc2hvdWxkIGJlIGNoYW5nZWQgbGlrZSAKKyAqIGlmIChlc3AtPmN1cnJlbnRfU0MpCisgKgkuLi4gY2hlY2sgRFJRIGZsYWcgLi4uCisgKiBlbHNlIAorICoJLi4uIGRpc2Nvbm5lY3RlZCwgY2hlY2sgcGVuZGluZyBWSUEgaW50ZXJydXB0IC4uLgorICoKKyAqIFRoZXJlJ3MgYSBwcm9ibGVtIHdpdGggdXNpbmcgdGhlIGRhYmYgZmxhZyBvciBtYWNfaXJxX3BlbmRpbmcoKSBoZXJlOiBib3RoCisgKiBzZWVtIHRvIHJldHVybiAxIGV2ZW4gdGhvdWdoIG5vIGludGVycnVwdCBpcyBjdXJyZW50bHkgcGVuZGluZywgcmVzdWx0aW5nCisgKiBpbiBlc3BfZXhlY19jbWQoKSBob2xkaW5nIG9mZiB0aGUgbmV4dCBjb21tYW5kLCBhbmQgcG9zc2libHkgaW5maW5pdGUgbG9vcHMKKyAqIGluIGVzcF9pbnRyKCkuIAorICogU2hvcnQgdGVybSBmaXg6IGp1c3QgdXNlIGVzcF9zdGF0dXMgJiBFU1BfU1RBVF9JTlRSIGhlcmUsIGFzIGxvbmcgYXMgd2UKKyAqIHVzZSBzaW1wbGUgUElPLiBUaGUgRFJRIHN0YXR1cyB3aWxsIGJlIGltcG9ydGFudCB3aGVuIGltcGxlbWVudGluZyBwc2V1ZG8KKyAqIERNQSBtb2RlIChzZXQgdXAgRVNQIHRyYW5zZmVyIGNvdW50LCByZXR1cm4sIGRvIGEgYmF0Y2ggb2YgYnl0ZXMgaW4gUElPIG9yIAorICogJ2hhcmR3YXJlIGhhbmRzaGFrZScgbW9kZSB1cG9uIERSUSkuCisgKiBJZiB5b3UgcGxhbiBvbiBjaGFuZ2luZyB0aGlzIChpLmUuIHRvIHNhdmUgdGhlIGVzcF9zdGF0dXMgcmVnaXN0ZXIgYWNjZXNzIGluIAorICogZmF2b3Igb2YgYSBWSUEgcmVnaXN0ZXIgYWNjZXNzIG9yIGEgc2hhZG93IHJlZ2lzdGVyIGZvciB0aGUgSUZSKSwgbWFrZSBzdXJlCisgKiB0byB0cnkgYSBkZWJ1ZyB2ZXJzaW9uIG9mIHRoaXMgZmlyc3QgdG8gbW9uaXRvciB3aGF0IHJlZ2lzdGVycyB3b3VsZCBiZSBhIGdvb2QKKyAqIGluZGljYXRvciBvZiB0aGUgRVNQIGludGVycnVwdC4KKyAqLworCitzdGF0aWMgaW50IGVzcF9kYWZiX2RtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqIGVzcCkKK3sKKwl1bnNpZ25lZCBpbnQgcmV0OworCWludCBzcmVnID0gZXNwX3JlYWQoZXNwLT5lcmVncy0+ZXNwX3N0YXR1cyk7CisKKyNpZmRlZiBERUJVR19NQUNfRVNQCisJcHJpbnRrKCJtYWNfZXNwOiBlc3BfZGFmYl9kbWFfaXJxX3AgZGFmYiAlZCBpcnEgJWRcbiIsIAorCQlyZWFkbChlc3AtPmRyZWdzKSwgbWFjX2lycV9wZW5kaW5nKElSUV9NQUNfU0NTSSkpOworI2VuZGlmCisKKwlzcmVnICY9IEVTUF9TVEFUX0lOVFI7CisKKwkvKgorCSAqIG1heWJlIHdvcmtpbmc7IHRoaXMgaXMgZXNzZW50aWFsbHkgd2hhdCdzIHVzZWQgZm9yIGlvc2JfZG1hX2lycV9wCisJICovCisJaWYgKHNyZWcpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIGRpZG4ndCB3b3JrIC4uLgorCSAqLworI2lmIDAKKwlpZiAoZXNwLT5jdXJyZW50X1NDKQorCQlyZXQgPSByZWFkbChlc3AtPmRyZWdzKSAmIDB4MjAwOworCWVsc2UgaWYgKGVzcC0+ZGlzY29ubmVjdGVkX1NDKQorCQlyZXQgPSAxOyAvKiBzcmVnID8/ICovCisJZWxzZQorCQlyZXQgPSBtYWNfaXJxX3BlbmRpbmcoSVJRX01BQ19TQ1NJKTsKKworCXJldHVybihyZXQpOworI2VuZGlmCisKK30KKworLyoKKyAqIFNlZSBhYm92ZTogdGVzdGluZyBtYWNfaXJxX3BlbmRpbmcgYWx3YXlzIHJldHVybmVkIDggKFNDU0kgSVJRKSByZWdhcmRsZXNzIAorICogb2YgdGhlIGFjdHVhbCBFU1Agc3RhdHVzLgorICovCisKK3N0YXRpYyBpbnQgZXNwX2lvc2JfZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICogZXNwKQoreworCWludCByZXQgID0gbWFjX2lycV9wZW5kaW5nKElSUV9NQUNfU0NTSSkgfHwgbWFjX2lycV9wZW5kaW5nKElSUV9NQUNfU0NTSURSUSk7CisJaW50IHNyZWcgPSBlc3BfcmVhZChlc3AtPmVyZWdzLT5lc3Bfc3RhdHVzKTsKKworI2lmZGVmIERFQlVHX01BQ19FU1AKKwlwcmludGsoIm1hY19lc3A6IGRtYV9pcnFfcCBkcnEgJWQgaXJxICVkIHNyZWcgJXggY3VyciAlcCBkaXNjICVwXG4iLCAKKwkJbWFjX2lycV9wZW5kaW5nKElSUV9NQUNfU0NTSURSUSksIG1hY19pcnFfcGVuZGluZyhJUlFfTUFDX1NDU0kpLCAKKwkJc3JlZywgZXNwLT5jdXJyZW50X1NDLCBlc3AtPmRpc2Nvbm5lY3RlZF9TQyk7CisjZW5kaWYKKworCXNyZWcgJj0gRVNQX1NUQVRfSU5UUjsKKworCWlmIChzcmVnKQorCQlyZXR1cm4gKHNyZWcpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIHNlZW1zIHRvIGJlIE9LIGZvciBQSU8gYXQgbGVhc3QgLi4uIHVzdWFsbHkgMCBhZnRlciBQSU8uCisgKi8KKworc3RhdGljIGludCBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqIGVzcCwgaW50IGZpZm9fY291bnQpCit7CisKKyNpZmRlZiBERUJVR19NQUNfRVNQCisJcHJpbnRrKCJtYWNfZXNwOiBkbWEgYnl0ZXMgc2VudCA9ICV4XG4iLCBmaWZvX2NvdW50KTsKKyNlbmRpZgorCisJcmV0dXJuIGZpZm9fY291bnQ7Cit9CisKKy8qCisgKiBkbWFfY2FuX3RyYW5zZmVyIGlzIHVzZWQgdG8gc3dpdGNoIGJldHdlZW4gRE1BIGFuZCBQSU8sIGlmIERNQSAocHNldWRvKQorICogaXMgZXZlciBpbXBsZW1lbnRlZC4gUmV0dXJuaW5nIDAgaGVyZSB3aWxsIHVzZSBQSU8uCisgKi8KKworc3RhdGljIGludCBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICogZXNwLCBTY3NpX0NtbmQgKiBzcCkKK3sKKwl1bnNpZ25lZCBsb25nIHN6ID0gc3AtPlNDcC50aGlzX3Jlc2lkdWFsOworI2lmIDAJLyogbm8gRE1BIHlldDsgbWFrZSBjb25kaXRpb25hbCAqLworCWlmIChzeiA+IDB4MTAwMDAwMDApIHsKKwkJc3ogPSAweDEwMDAwMDAwOworCX0KKwlwcmludGsoIm1hY19lc3A6IGRtYSBjYW4gdHJhbnNmZXIgPSAwbHgleFxuIiwgc3opOworI2Vsc2UKKworI2lmZGVmIERFQlVHX01BQ19FU1AKKwlwcmludGsoIm1hY19lc3A6IHBpbyB0byB0cmFuc2ZlciA9ICVsZFxuIiwgc3opOworI2VuZGlmCisKKwlzeiA9IDA7CisjZW5kaWYKKwlyZXR1cm4gc3o7Cit9CisKKy8qCisgKiBOb3QgeWV0IC4uLgorICovCisKK3N0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICogZXNwKQoreworI2lmZGVmIERFQlVHX01BQ19FU1AKKwlwcmludGsoIm1hY19lc3A6IGRtYV9kdW1wX3N0YXRlOiBjYWxsZWRcbiIpOworI2VuZGlmCisjaWYgMAorCUVTUExPRygoImVzcCVkOiBkbWEgLS0gY29uZF9yZWc8JTAyeD5cbiIsCisJCWVzcC0+ZXNwX2lkLCAoKHN0cnVjdCBtYWNfZG1hX3JlZ2lzdGVycyAqKQorCQkoZXNwLT5kcmVncykpLT5jb25kX3JlZykpOworI2VuZGlmCit9CisKKy8qCisgKiBETUEgc2V0dXA6IHNob3VsZCBiZSB1c2VkIHRvIHNldCB1cCB0aGUgRVNQIHRyYW5zZmVyIGNvdW50IGZvciBwc2V1ZG8KKyAqIERNQSB0cmFuc2ZlcnM7IG5lZWQgYSBEUlEgdHJhbnNmZXIgZnVuY3Rpb24gdG8gZG8gdGhlIGFjdHVhbCB0cmFuc2ZlcgorICovCisKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKiBlc3AsIGNoYXIgKiB2YWRkcmVzcywgaW50IGxlbmd0aCkKK3sKKwlwcmludGsoIm1hY19lc3A6IGRtYV9pbml0X3JlYWRcbiIpOworfQorCisKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICogZXNwLCBjaGFyICogdmFkZHJlc3MsIGludCBsZW5ndGgpCit7CisJcHJpbnRrKCJtYWNfZXNwOiBkbWFfaW5pdF93cml0ZVxuIik7Cit9CisKKworc3RhdGljIHZvaWQgZG1hX2ludHNfb2ZmKHN0cnVjdCBOQ1JfRVNQICogZXNwKQoreworCW1hY190dXJub2ZmX2lycShlc3AtPmlycSk7Cit9CisKKworc3RhdGljIHZvaWQgZG1hX2ludHNfb24oc3RydWN0IE5DUl9FU1AgKiBlc3ApCit7CisJbWFjX3R1cm5vbl9pcnEoZXNwLT5pcnEpOworfQorCisvKgorICogZ2VuZXJpYyBkbWFfaXJxX3AoKSwgdW51c2VkCisgKi8KKworc3RhdGljIGludCBkbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKiBlc3ApCit7CisJaW50IGkgPSBlc3BfcmVhZChlc3AtPmVyZWdzLT5lc3Bfc3RhdHVzKTsKKworI2lmZGVmIERFQlVHX01BQ19FU1AKKwlwcmludGsoIm1hY19lc3A6IGRtYV9pcnFfcCBzdGF0dXMgJWRcbiIsIGkpOworI2VuZGlmCisKKwlyZXR1cm4gKGkgJiBFU1BfU1RBVF9JTlRSKTsKK30KKworc3RhdGljIGludCBkbWFfaXJxX3BfcXVpY2soc3RydWN0IE5DUl9FU1AgKiBlc3ApCit7CisJLyoKKwkgKiBDb3BpZWQgZnJvbSBpb3NiX2RtYV9pcnFfcCgpCisJICovCisJaW50IHJldCAgPSBtYWNfaXJxX3BlbmRpbmcoSVJRX01BQ19TQ1NJKSB8fCBtYWNfaXJxX3BlbmRpbmcoSVJRX01BQ19TQ1NJRFJRKTsKKwlpbnQgc3JlZyA9IGVzcF9yZWFkKGVzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpOworCisjaWZkZWYgREVCVUdfTUFDX0VTUAorCXByaW50aygibWFjX2VzcDogZG1hX2lycV9wIGRycSAlZCBpcnEgJWQgc3JlZyAleCBjdXJyICVwIGRpc2MgJXBcbiIsIAorCQltYWNfaXJxX3BlbmRpbmcoSVJRX01BQ19TQ1NJRFJRKSwgbWFjX2lycV9wZW5kaW5nKElSUV9NQUNfU0NTSSksIAorCQlzcmVnLCBlc3AtPmN1cnJlbnRfU0MsIGVzcC0+ZGlzY29ubmVjdGVkX1NDKTsKKyNlbmRpZgorCisJc3JlZyAmPSBFU1BfU1RBVF9JTlRSOworCisJaWYgKHNyZWcpCisJCXJldHVybiAoc3JlZyk7CisJZWxzZQorCQlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgdm9pZCBkbWFfbGVkX29mZihzdHJ1Y3QgTkNSX0VTUCAqIGVzcCkKK3sKKyNpZmRlZiBERUJVR19NQUNfRVNQCisJcHJpbnRrKCJtYWNfZXNwOiBkbWFfbGVkX29mZjogY2FsbGVkXG4iKTsKKyNlbmRpZgorfQorCisKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb24oc3RydWN0IE5DUl9FU1AgKiBlc3ApCit7CisjaWZkZWYgREVCVUdfTUFDX0VTUAorCXByaW50aygibWFjX2VzcDogZG1hX2xlZF9vbjogY2FsbGVkXG4iKTsKKyNlbmRpZgorfQorCisKK3N0YXRpYyBpbnQgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKiBlc3ApCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICogZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSkKK3sKKworI2lmZGVmIERFQlVHX01BQ19FU1AKKwlwcmludGsoIm1hY19lc3A6IGRtYV9zZXR1cFxuIik7CisjZW5kaWYKKworCWlmICh3cml0ZSkgeworCQlkbWFfaW5pdF9yZWFkKGVzcCwgKGNoYXIgKikgYWRkciwgY291bnQpOworCX0gZWxzZSB7CisJCWRtYV9pbml0X3dyaXRlKGVzcCwgKGNoYXIgKikgYWRkciwgY291bnQpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBkbWFfc2V0dXBfcXVpY2soc3RydWN0IE5DUl9FU1AgKiBlc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQoreworI2lmZGVmIERFQlVHX01BQ19FU1AKKwlwcmludGsoIm1hY19lc3A6IGRtYV9zZXR1cF9xdWlja1xuIik7CisjZW5kaWYKK30KKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQkJPSAibWFjX2VzcCIsCisJLm5hbWUJCQk9ICJNYWMgNTNDOXggU0NTSSIsCisJLmRldGVjdAkJCT0gbWFjX2VzcF9kZXRlY3QsCisJLnNsYXZlX2FsbG9jCQk9IGVzcF9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfZGVzdHJveQkJPSBlc3Bfc2xhdmVfZGVzdHJveSwKKwkucmVsZWFzZQkJPSBtYWNfZXNwX3JlbGVhc2UsCisJLmluZm8JCQk9IGVzcF9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gZXNwX3F1ZXVlLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gZXNwX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGVzcF9yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IDcsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HCit9OworCisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWFjX3Njc2kuYyBiL2RyaXZlcnMvc2NzaS9tYWNfc2NzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZmQxN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbWFjX3Njc2kuYwpAQCAtMCwwICsxLDYwNSBAQAorLyoKKyAqIEdlbmVyaWMgTWFjaW50b3NoIE5DUjUzODAgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDE5OTgsIE1pY2hhZWwgU2NobWl0eiA8bXNjaG1pdHpAbGJsLmdvdj4KKyAqCisgKiBkZXJpdmVkIGluIHBhcnQgZnJvbToKKyAqLworLyoKKyAqIEdlbmVyaWMgR2VuZXJpYyBOQ1I1MzgwIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAxOTk1LCBSdXNzZWxsIEtpbmcKKyAqCisgKiBBTFBIQSBSRUxFQVNFIDEuCisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0CisgKgorICogTkNSIDUzODAgRmFtaWx5CisgKiBTQ1NJIFByb3RvY29sIENvbnRyb2xsZXIKKyAqIERhdGFib29rCisgKgorICogTkNSIE1pY3JvZWxlY3Ryb25pY3MKKyAqIDE2MzUgQWVyb3BsYXphIERyaXZlCisgKiBDb2xvcmFkbyBTcHJpbmdzLCBDTyA4MDkxNgorICogMSsgKDcxOSkgNTc4LTM0MDAKKyAqIDErICg4MDApIDMzNC01NDU0CisgKi8KKworLyoKKyAqICRMb2c6IG1hY19OQ1I1MzgwLmMsdiAkCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2ludG9zaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNpbnRzLmg+CisjaW5jbHVkZSA8YXNtL21hY2h3Lmg+CisjaW5jbHVkZSA8YXNtL21hY192aWEuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgIm1hY19zY3NpLmgiCisjaW5jbHVkZSAiTkNSNTM4MC5oIgorCisjaWYgMAorI2RlZmluZSBOREVCVUcgKE5ERUJVR19JTlRSIHwgTkRFQlVHX1BTRVVET19ETUEgfCBOREVCVUdfQVJCSVRSQVRJT04gfCBOREVCVUdfU0VMRUNUSU9OIHwgTkRFQlVHX1JFU0VMRUNUSU9OKQorI2Vsc2UKKyNkZWZpbmUgTkRFQlVHIChOREVCVUdfQUJPUlQpCisjZW5kaWYKKworI2RlZmluZSBSRVNFVF9CT09UCisjZGVmaW5lIERSSVZFUl9TRVRVUAorCisjZGVmaW5lCUVOQUJMRV9JUlEoKQltYWNfZW5hYmxlX2lycSggSVJRX01BQ19TQ1NJICk7IAorI2RlZmluZQlESVNBQkxFX0lSUSgpCW1hY19kaXNhYmxlX2lycSggSVJRX01BQ19TQ1NJICk7CisKK2V4dGVybiB2b2lkIHZpYV9zY3NpX2NsZWFyKHZvaWQpOworCisjaWZkZWYgUkVTRVRfQk9PVAorc3RhdGljIHZvaWQgbWFjX3Njc2lfcmVzZXRfYm9vdChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSk7CisjZW5kaWYKKworc3RhdGljIGludCBzZXR1cF9jYWxsZWQgPSAwOworc3RhdGljIGludCBzZXR1cF9jYW5fcXVldWUgPSAtMTsKK3N0YXRpYyBpbnQgc2V0dXBfY21kX3Blcl9sdW4gPSAtMTsKK3N0YXRpYyBpbnQgc2V0dXBfc2dfdGFibGVzaXplID0gLTE7CitzdGF0aWMgaW50IHNldHVwX3VzZV9wZG1hID0gLTE7CisjaWZkZWYgU1VQUE9SVF9UQUdTCitzdGF0aWMgaW50IHNldHVwX3VzZV90YWdnZWRfcXVldWluZyA9IC0xOworI2VuZGlmCitzdGF0aWMgaW50IHNldHVwX2hvc3RpZCA9IC0xOworCisvKiBUaW1lIChpbiBqaWZmaWVzKSB0byB3YWl0IGFmdGVyIGEgcmVzZXQ7IHRoZSBTQ1NJIHN0YW5kYXJkIGNhbGxzIGZvciAyNTBtcywKKyAqIHdlIHVzdWFsbHkgZG8gMC41cyB0byBiZSBvbiB0aGUgc2FmZSBzaWRlLiBCdXQgVG9zaGliYSBDRC1ST01zIG9uY2UgbW9yZQorICogbmVlZCB0ZW4gdGltZXMgdGhlIHN0YW5kYXJkIHZhbHVlLi4uICovCisjZGVmaW5lIFRPU0hJQkFfREVMQVkKKworI2lmZGVmIFRPU0hJQkFfREVMQVkKKyNkZWZpbmUJQUZURVJfUkVTRVRfREVMQVkJKDUqSFovMikKKyNlbHNlCisjZGVmaW5lCUFGVEVSX1JFU0VUX0RFTEFZCShIWi8yKQorI2VuZGlmCisKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICptYWNfc2NzaV9yZWdwID0gTlVMTDsKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICptYWNfc2NzaV9kcnEgID0gTlVMTDsKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICptYWNfc2NzaV9ub2RycSA9IE5VTEw7CisKKworLyoKKyAqIE5DUiA1MzgwIHJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbnMKKyAqLworCisjaWYgMAorLyogRGVidWcgdmVyc2lvbnMgKi8KKyNkZWZpbmUgQ1RSTChwLHYpICgqY3RybCA9ICh2KSkKKworc3RhdGljIGNoYXIgbWFjc2NzaV9yZWFkKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBpbnQgcmVnKQoreworICBpbnQgaW9iYXNlID0gaW5zdGFuY2UtPmlvX3BvcnQ7CisgIGludCBpOworICBpbnQgKmN0cmwgPSAmKChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKWluc3RhbmNlLT5ob3N0ZGF0YSktPmN0cmw7CisKKyAgQ1RSTChpb2Jhc2UsIDApOworICBpID0gaW5fOChpb2Jhc2UgKyAocmVnPDw0KSk7CisgIENUUkwoaW9iYXNlLCAweDQwKTsKKworICByZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgbWFjc2NzaV93cml0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgaW50IHJlZywgaW50IHZhbHVlKQoreworICBpbnQgaW9iYXNlID0gaW5zdGFuY2UtPmlvX3BvcnQ7CisgIGludCAqY3RybCA9ICYoKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopaW5zdGFuY2UtPmhvc3RkYXRhKS0+Y3RybDsKKworICBDVFJMKGlvYmFzZSwgMCk7CisgIG91dF84KGlvYmFzZSArIChyZWc8PDQpLCB2YWx1ZSk7CisgIENUUkwoaW9iYXNlLCAweDQwKTsKK30KKyNlbHNlCisKKy8qIEZhc3QgdmVyc2lvbnMgKi8KK3N0YXRpYyBfX2lubGluZV9fIGNoYXIgbWFjc2NzaV9yZWFkKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBpbnQgcmVnKQoreworICByZXR1cm4gaW5fOChpbnN0YW5jZS0+aW9fcG9ydCArIChyZWc8PDQpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBtYWNzY3NpX3dyaXRlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBpbnQgcmVnLCBpbnQgdmFsdWUpCit7CisgIG91dF84KGluc3RhbmNlLT5pb19wb3J0ICsgKHJlZzw8NCksIHZhbHVlKTsKK30KKyNlbmRpZgorCisKKy8qCisgKiBGdW5jdGlvbiA6IG1hY19zY3NpX3NldHVwKGNoYXIgKnN0cikKKyAqCisgKiBQdXJwb3NlIDogYm9vdGVyIGNvbW1hbmQgbGluZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgb3ZlcnJpZGVzIGFycmF5LAorICoKKyAqIElucHV0cyA6IHN0ciAtIGNvbW1hIGRlbGltaXRlZCBsaXN0IG9mIG9wdGlvbnMKKyAqCisgKi8KKworc3RhdGljIGludCBfX2luaXQgbWFjX3Njc2lfc2V0dXAoY2hhciAqc3RyKSB7CisjaWZkZWYgRFJJVkVSX1NFVFVQCQorCWludCBpbnRzWzddOworCQorCSh2b2lkKWdldF9vcHRpb25zKCBzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCQorCWlmIChzZXR1cF9jYWxsZWQrKyB8fCBpbnRzWzBdIDwgMSB8fCBpbnRzWzBdID4gNikgeworCSAgICBwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpOiA8bWFjNTM4MD4iCisJCSIgVXNhZ2U6IG1hYzUzODA9PGNhbl9xdWV1ZT5bLDxjbWRfcGVyX2x1bj4sPHNnX3RhYmxlc2l6ZT4sPGhvc3RpZD4sPHVzZV90YWdzPiw8dXNlX3BkbWE+XVxuIik7CisJICAgIHByaW50ayhLRVJOX0FMRVJUICJzY3NpOiA8bWFjNTM4MD4gQmFkIFBlbmd1aW4gcGFyYW1ldGVycz9cbiIpOworCSAgICByZXR1cm4gMDsKKwl9CisJICAgIAorCWlmIChpbnRzWzBdID49IDEpIHsKKwkJaWYgKGludHNbMV0gPiAwKQorCQkJLyogbm8gbGltaXRzIG9uIHRoaXMsIGp1c3QgPiAwICovCisJCQlzZXR1cF9jYW5fcXVldWUgPSBpbnRzWzFdOworCX0KKwlpZiAoaW50c1swXSA+PSAyKSB7CisJCWlmIChpbnRzWzJdID4gMCkKKwkJCXNldHVwX2NtZF9wZXJfbHVuID0gaW50c1syXTsKKwl9CisJaWYgKGludHNbMF0gPj0gMykgeworCQlpZiAoaW50c1szXSA+PSAwKSB7CisJCQlzZXR1cF9zZ190YWJsZXNpemUgPSBpbnRzWzNdOworCQkJLyogTXVzdCBiZSA8PSBTR19BTEwgKDI1NSkgKi8KKwkJCWlmIChzZXR1cF9zZ190YWJsZXNpemUgPiBTR19BTEwpCisJCQkJc2V0dXBfc2dfdGFibGVzaXplID0gU0dfQUxMOworCQl9CisJfQorCWlmIChpbnRzWzBdID49IDQpIHsKKwkJLyogTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDcgKi8KKwkJaWYgKGludHNbNF0gPj0gMCAmJiBpbnRzWzRdIDw9IDcpCisJCQlzZXR1cF9ob3N0aWQgPSBpbnRzWzRdOworCQllbHNlIGlmIChpbnRzWzRdID4gNykKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1hY19zY3NpX3NldHVwOiBpbnZhbGlkIGhvc3QgSUQgJWQgIVxuIiwgaW50c1s0XSApOworCX0KKyNpZmRlZiBTVVBQT1JUX1RBR1MJCisJaWYgKGludHNbMF0gPj0gNSkgeworCQlpZiAoaW50c1s1XSA+PSAwKQorCQkJc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nID0gISFpbnRzWzVdOworCX0KKwkKKwlpZiAoaW50c1swXSA9PSA2KSB7CisJICAgIGlmIChpbnRzWzZdID49IDApCisJCXNldHVwX3VzZV9wZG1hID0gaW50c1s2XTsKKwl9CisjZWxzZQorCWlmIChpbnRzWzBdID09IDUpIHsKKwkgICAgaWYgKGludHNbNV0gPj0gMCkKKwkJc2V0dXBfdXNlX3BkbWEgPSBpbnRzWzVdOworCX0KKyNlbmRpZiAvKiBTVVBQT1JUX1RBR1MgKi8KKwkKKyNlbmRpZiAvKiBEUklWRVJfU0VUVVAgKi8KKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgibWFjNTM4MD0iLCBtYWNfc2NzaV9zZXR1cCk7CisKKy8qCisgKiBJZiB5b3Ugd2FudCB0byBmaW5kIHRoZSBpbnN0YW5jZSB3aXRoIChrKWdkYiAuLi4KKyAqLworI2lmIE5ERUJVRworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKmRlZmF1bHRfaW5zdGFuY2U7CisjZW5kaWYKKworLyoKKyAqIEZ1bmN0aW9uIDogaW50IG1hY3Njc2lfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqIHRwbnQpCisgKgorICogUHVycG9zZSA6IGluaXRpYWxpemVzIG1hYyBOQ1I1MzgwIGRyaXZlciBiYXNlZCBvbiB0aGUKKyAqCWNvbW1hbmQgbGluZSAvIGNvbXBpbGUgdGltZSBwb3J0IGFuZCBpcnEgZGVmaW5pdGlvbnMuCisgKgorICogSW5wdXRzIDogdHBudCAtIHRlbXBsYXRlIGZvciB0aGlzIFNDU0kgYWRhcHRlci4KKyAqCisgKiBSZXR1cm5zIDogMSBpZiBhIGhvc3QgYWRhcHRlciB3YXMgZm91bmQsIDAgaWYgbm90LgorICoKKyAqLworIAoraW50IG1hY3Njc2lfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqIHRwbnQpCit7CisgICAgc3RhdGljIGludCBjYWxsZWQgPSAwOworICAgIGludCBmbGFncyA9IDA7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7CisKKyAgICBpZiAoIU1BQ0hfSVNfTUFDIHx8IGNhbGxlZCkKKwlyZXR1cm4oIDAgKTsKKworICAgIGlmIChtYWNpbnRvc2hfY29uZmlnLT5zY3NpX3R5cGUgIT0gTUFDX1NDU0lfT0xEKQorCXJldHVybiggMCApOworCisgICAgLyogc2V0dXAgdmFyaWFibGVzICovCisgICAgdHBudC0+Y2FuX3F1ZXVlID0KKwkoc2V0dXBfY2FuX3F1ZXVlID4gMCkgPyBzZXR1cF9jYW5fcXVldWUgOiBDQU5fUVVFVUU7CisgICAgdHBudC0+Y21kX3Blcl9sdW4gPQorCShzZXR1cF9jbWRfcGVyX2x1biA+IDApID8gc2V0dXBfY21kX3Blcl9sdW4gOiBDTURfUEVSX0xVTjsKKyAgICB0cG50LT5zZ190YWJsZXNpemUgPSAKKwkoc2V0dXBfc2dfdGFibGVzaXplID49IDApID8gc2V0dXBfc2dfdGFibGVzaXplIDogU0dfVEFCTEVTSVpFOworCisgICAgaWYgKHNldHVwX2hvc3RpZCA+PSAwKQorCXRwbnQtPnRoaXNfaWQgPSBzZXR1cF9ob3N0aWQ7CisgICAgZWxzZSB7CisJLyogdXNlIDcgYXMgZGVmYXVsdCAqLworCXRwbnQtPnRoaXNfaWQgPSA3OworICAgIH0KKworI2lmZGVmIFNVUFBPUlRfVEFHUworICAgIGlmIChzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcgPCAwKQorCXNldHVwX3VzZV90YWdnZWRfcXVldWluZyA9IFVTRV9UQUdHRURfUVVFVUlORzsKKyNlbmRpZgorCisgICAgLyogT25jZSB3ZSBzdXBwb3J0IG11bHRpcGxlIDUzODBzIChlLmcuIER1b0RvY2spIHdlJ2xsIGRvCisgICAgICAgc29tZXRoaW5nIGRpZmZlcmVudCBoZXJlICovCisgICAgaW5zdGFuY2UgPSBzY3NpX3JlZ2lzdGVyICh0cG50LCBzaXplb2Yoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEpKTsKKyNpZiBOREVCVUcKKyAgICBkZWZhdWx0X2luc3RhbmNlID0gaW5zdGFuY2U7CisjZW5kaWYKKyAgICAKKyAgICBpZiAobWFjaW50b3NoX2NvbmZpZy0+aWRlbnQgPT0gTUFDX01PREVMX0lJRlgpIHsKKwltYWNfc2NzaV9yZWdwICA9IHZpYTErMHg4MDAwOworCW1hY19zY3NpX2RycSAgID0gdmlhMSsweEUwMDA7CisJbWFjX3Njc2lfbm9kcnEgPSB2aWExKzB4QzAwMDsKKwkvKiBUaGUgSUlGWCBzaG91bGQgYmUgYWJsZSB0byBkbyB0cnVlIERNQSwgYnV0IHBzZXVkby1kbWEgZG9lc24ndCB3b3JrICovCisJZmxhZ3MgPSBGTEFHX05PX1BTRVVET19ETUE7CisgICAgfSBlbHNlIHsKKwltYWNfc2NzaV9yZWdwICA9IHZpYTErMHgxMDAwMDsKKwltYWNfc2NzaV9kcnEgICA9IHZpYTErMHg2MDAwOworCW1hY19zY3NpX25vZHJxID0gdmlhMSsweDEyMDAwOworICAgIH0KKworICAgIGlmICghIHNldHVwX3VzZV9wZG1hKQorCWZsYWdzID0gRkxBR19OT19QU0VVRE9fRE1BOworCQorICAgIGluc3RhbmNlLT5pb19wb3J0ID0gKHVuc2lnbmVkIGxvbmcpIG1hY19zY3NpX3JlZ3A7CisgICAgaW5zdGFuY2UtPmlycSA9IElSUV9NQUNfU0NTSTsKKworI2lmZGVmIFJFU0VUX0JPT1QgICAKKyAgICBtYWNfc2NzaV9yZXNldF9ib290KGluc3RhbmNlKTsKKyNlbmRpZgorICAgIAorICAgIE5DUjUzODBfaW5pdChpbnN0YW5jZSwgZmxhZ3MpOworCisgICAgaW5zdGFuY2UtPm5faW9fcG9ydCA9IDI1NTsKKworICAgICgoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKilpbnN0YW5jZS0+aG9zdGRhdGEpLT5jdHJsID0gMDsKKworICAgIGlmIChpbnN0YW5jZS0+aXJxICE9IFNDU0lfSVJRX05PTkUpCisJaWYgKHJlcXVlc3RfaXJxKGluc3RhbmNlLT5pcnEsIE5DUjUzODBfaW50ciwgSVJRX0ZMR19TTE9XLCAKKwkJIm5jcjUzODAiLCBpbnN0YW5jZSkpIHsKKwkgICAgcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkOiBJUlElZCBub3QgZnJlZSwgaW50ZXJydXB0cyBkaXNhYmxlZFxuIiwKKwkJICAgaW5zdGFuY2UtPmhvc3Rfbm8sIGluc3RhbmNlLT5pcnEpOworCSAgICBpbnN0YW5jZS0+aXJxID0gU0NTSV9JUlFfTk9ORTsKKwl9CisKKyAgICBwcmludGsoS0VSTl9JTkZPICJzY3NpJWQ6IGdlbmVyaWMgNTM4MCBhdCBwb3J0ICVsWCBpcnEiLCBpbnN0YW5jZS0+aG9zdF9ubywgaW5zdGFuY2UtPmlvX3BvcnQpOworICAgIGlmIChpbnN0YW5jZS0+aXJxID09IFNDU0lfSVJRX05PTkUpCisJcHJpbnRrIChLRVJOX0lORk8gInMgZGlzYWJsZWQiKTsKKyAgICBlbHNlCisJcHJpbnRrIChLRVJOX0lORk8gIiAlZCIsIGluc3RhbmNlLT5pcnEpOworICAgIHByaW50ayhLRVJOX0lORk8gIiBvcHRpb25zIENBTl9RVUVVRT0lZCBDTURfUEVSX0xVTj0lZCByZWxlYXNlPSVkIiwKKwkgICBpbnN0YW5jZS0+Y2FuX3F1ZXVlLCBpbnN0YW5jZS0+Y21kX3Blcl9sdW4sIE1BQ1NDU0lfUFVCTElDX1JFTEVBU0UpOworICAgIHByaW50ayhLRVJOX0lORk8gIlxuc2NzaSVkOiIsIGluc3RhbmNlLT5ob3N0X25vKTsKKyAgICBOQ1I1MzgwX3ByaW50X29wdGlvbnMoaW5zdGFuY2UpOworICAgIHByaW50aygiXG4iKTsKKyAgICBjYWxsZWQgPSAxOworICAgIHJldHVybiAxOworfQorCitpbnQgbWFjc2NzaV9yZWxlYXNlIChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpZiAoc2hwbnQtPmlycSAhPSBTQ1NJX0lSUV9OT05FKQorCQlmcmVlX2lycSAoc2hwbnQtPmlycSwgTkNSNTM4MF9pbnRyKTsKKwlOQ1I1MzgwX2V4aXQoc2hwbnQpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBSRVNFVF9CT09UCisvKgorICogT3VyICdidXMgcmVzZXQgb24gYm9vdCcgZnVuY3Rpb24KKyAqLworCitzdGF0aWMgdm9pZCBtYWNfc2NzaV9yZXNldF9ib290KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworCXVuc2lnbmVkIGxvbmcgZW5kOworCisJTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisJTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisJCisJLyoKKwkgKiBEbyBhIFNDU0kgcmVzZXQgdG8gY2xlYW4gdXAgdGhlIGJ1cyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIE5vIG1lc3NpbmcKKwkgKiB3aXRoIHRoZSBxdWV1ZXMsIGludGVycnVwdHMsIG9yIGxvY2tzIG5lY2Vzc2FyeSBoZXJlLgorCSAqLworCisJcHJpbnRrKEtFUk5fSU5GTyAiTWFjaW50b3NoIFNDU0k6IHJlc2V0dGluZyB0aGUgU0NTSSBidXMuLi4iICk7CisKKwkvKiBzd2l0Y2ggb2ZmIFNDU0kgSVJRIC0gY2F0Y2ggYW4gaW50ZXJydXB0IHdpdGhvdXQgSVJRIGJpdCBzZXQgZWxzZSAqLworCW1hY19kaXNhYmxlX2lycShJUlFfTUFDX1NDU0kpOworCisJLyogZ2V0IGluIHBoYXNlICovCisJTkNSNTM4MF93cml0ZSggVEFSR0VUX0NPTU1BTkRfUkVHLAorCQkgICAgICBQSEFTRV9TUl9UT19UQ1IoIE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSApKTsKKworCS8qIGFzc2VydCBSU1QgKi8KKwlOQ1I1MzgwX3dyaXRlKCBJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9SU1QgKTsKKwkvKiBUaGUgbWluLiByZXNldCBob2xkIHRpbWUgaXMgMjV1cywgc28gNDB1cyBzaG91bGQgYmUgZW5vdWdoICovCisJdWRlbGF5KCA1MCApOworCS8qIHJlc2V0IFJTVCBhbmQgaW50ZXJydXB0ICovCisJTkNSNTM4MF93cml0ZSggSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSApOworCU5DUjUzODBfcmVhZCggUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcgKTsKKworCWZvciggZW5kID0gamlmZmllcyArIEFGVEVSX1JFU0VUX0RFTEFZOyB0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmQpOyApCisJCWJhcnJpZXIoKTsKKworCS8qIHN3aXRjaCBvbiBTQ1NJIElSUSBhZ2FpbiAqLworCW1hY19lbmFibGVfaXJxKElSUV9NQUNfU0NTSSk7CisKKwlwcmludGsoS0VSTl9JTkZPICIgZG9uZVxuIiApOworfQorI2VuZGlmCisKK2NvbnN0IGNoYXIgKiBtYWNzY3NpX2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKnNwbnQpIHsKKwlyZXR1cm4gIiI7Cit9CisKKy8qIAorICAgUHNldWRvLURNQTogKE92ZSBFZGx1bmQpCisgICBUaGUgY29kZSBhdHRlbXB0cyB0byBjYXRjaCBidXMgZXJyb3JzIHRoYXQgb2NjdXIgaWYgb25lIGZvciBleGFtcGxlCisgICAidHJpcHMgb3ZlciB0aGUgY2FibGUiLgorICAgWFhYOiBTaW5jZSBidXMgZXJyb3JzIGluIHRoZSBQRE1BIHJvdXRpbmVzIG5ldmVyIGhhcHBlbiBvbiBteSAKKyAgIGNvbXB1dGVyLCB0aGUgYnVzIGVycm9yIGNvZGUgaXMgdW50ZXN0ZWQuIAorICAgSWYgdGhlIGNvZGUgd29ya3MgYXMgaW50ZW5kZWQsIGEgYnVzIGVycm9yIHJlc3VsdHMgaW4gUHNldWRvLURNQSAKKyAgIGJlZWluZyBkaXNhYmxlZCwgbWVhbmluZyB0aGF0IHRoZSBkcml2ZXIgc3dpdGNoZXMgdG8gc2xvdyBoYW5kc2hha2UuIAorICAgSWYgYnVzIGVycm9ycyBhcmUgTk9UIGV4dHJlbWVseSByYXJlLCB0aGlzIGhhcyB0byBiZSBjaGFuZ2VkLiAKKyovCisKKyNkZWZpbmUgQ1BfSU9fVE9fTUVNKHMsZCxsZW4pCQkJCVwKK19fYXNtX18gX192b2xhdGlsZV9fCQkJCQlcCisgICAgKCIgICAgY21wLncgICM0LCUyXG4iCQkJCVwKKyAgICAgIiAgICBibHMgICAgOGZcbiIJCQkJCVwKKyAgICAgIiAgICBtb3ZlLncgJTEsJSVkMFxuIgkJCQlcCisgICAgICIgICAgbmVnLmIgICUlZDBcbiIJCQkJXAorICAgICAiICAgIGFuZC53ICAjMywlJWQwXG4iCQkJCVwKKyAgICAgIiAgICBzdWIudyAgJSVkMCwlMlxuIgkJCQlcCisgICAgICIgICAgYnJhICAgIDJmXG4iCQkJCQlcCisgICAgICIgMTogbW92ZS5iICglMCksKCUxKStcbiIJCQkJXAorICAgICAiIDI6IGRiZiAgICAlJWQwLDFiXG4iCQkJCVwKKyAgICAgIiAgICBtb3ZlLncgJTIsJSVkMFxuIgkJCQlcCisgICAgICIgICAgbHNyLncgICM1LCUlZDBcbiIJCQkJXAorICAgICAiICAgIGJyYSAgICA0ZlxuIgkJCQkJXAorICAgICAiIDM6IG1vdmUubCAoJTApLCglMSkrXG4iCQkJCVwKKyAgICAgIjMxOiBtb3ZlLmwgKCUwKSwoJTEpK1xuIgkJCQlcCisgICAgICIzMjogbW92ZS5sICglMCksKCUxKStcbiIJCQkJXAorICAgICAiMzM6IG1vdmUubCAoJTApLCglMSkrXG4iCQkJCVwKKyAgICAgIjM0OiBtb3ZlLmwgKCUwKSwoJTEpK1xuIgkJCQlcCisgICAgICIzNTogbW92ZS5sICglMCksKCUxKStcbiIJCQkJXAorICAgICAiMzY6IG1vdmUubCAoJTApLCglMSkrXG4iCQkJCVwKKyAgICAgIjM3OiBtb3ZlLmwgKCUwKSwoJTEpK1xuIgkJCQlcCisgICAgICIgNDogZGJmICAgICUlZDAsM2JcbiIJCQkJXAorICAgICAiICAgIG1vdmUudyAlMiwlJWQwXG4iCQkJCVwKKyAgICAgIiAgICBsc3IudyAgIzIsJSVkMFxuIgkJCQlcCisgICAgICIgICAgYW5kLncgICM3LCUlZDBcbiIJCQkJXAorICAgICAiICAgIGJyYSAgICA2ZlxuIgkJCQkJXAorICAgICAiIDU6IG1vdmUubCAoJTApLCglMSkrXG4iCQkJCVwKKyAgICAgIiA2OiBkYmYgICAgJSVkMCw1YlxuIgkJCQlcCisgICAgICIgICAgYW5kLncgICMzLCUyXG4iCQkJCVwKKyAgICAgIiAgICBicmEgICAgOGZcbiIJCQkJCVwKKyAgICAgIiA3OiBtb3ZlLmIgKCUwKSwoJTEpK1xuIgkJCQlcCisgICAgICIgODogZGJmICAgICUyLDdiXG4iCQkJCVwKKyAgICAgIiAgICBtb3ZlcS5sICMwLCAlMlxuIgkJCQlcCisgICAgICIgOTogXG4iCQkJCQkJXAorICAgICAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJCQlcCisgICAgICIgICAgLmV2ZW5cbiIJCQkJCVwKKyAgICAgIjkwOiBtb3ZlcS5sICMxLCAlMlxuIgkJCQlcCisgICAgICIgICAganJhIDliXG4iCQkJCQlcCisgICAgICIucHJldmlvdXNcbiIJCQkJCVwKKyAgICAgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCQlcCisgICAgICIgICAuYWxpZ24gNFxuIgkJCQkJXAorICAgICAiICAgLmxvbmcgIDFiLDkwYlxuIgkJCQlcCisgICAgICIgICAubG9uZyAgM2IsOTBiXG4iCQkJCVwKKyAgICAgIiAgIC5sb25nIDMxYiw5MGJcbiIJCQkJXAorICAgICAiICAgLmxvbmcgMzJiLDkwYlxuIgkJCQlcCisgICAgICIgICAubG9uZyAzM2IsOTBiXG4iCQkJCVwKKyAgICAgIiAgIC5sb25nIDM0Yiw5MGJcbiIJCQkJXAorICAgICAiICAgLmxvbmcgMzViLDkwYlxuIgkJCQlcCisgICAgICIgICAubG9uZyAzNmIsOTBiXG4iCQkJCVwKKyAgICAgIiAgIC5sb25nIDM3Yiw5MGJcbiIJCQkJXAorICAgICAiICAgLmxvbmcgIDViLDkwYlxuIgkJCQlcCisgICAgICIgICAubG9uZyAgN2IsOTBiXG4iCQkJCVwKKyAgICAgIi5wcmV2aW91cyIJCQkJCVwKKyAgICAgOiAiPWEiKHMpLCAiPWEiKGQpLCAiPWQiKGxlbikJCQlcCisgICAgIDogIjAiKHMpLCAiMSIoZCksICIyIihsZW4pCQkJCVwKKyAgICAgOiAiZDAiKQorCisKK3N0YXRpYyBpbnQgbWFjc2NzaV9wcmVhZCAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsCisJCQkgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbikKK3sKKyAgIHVuc2lnbmVkIGNoYXIgKmQ7CisgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpzOworCisgICBOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKyAgIE5DUjUzODBfc2V0dXAoaW5zdGFuY2UpOworCisgICBzID0gbWFjX3Njc2lfZHJxKzB4NjA7CisgICBkID0gZHN0OworCisvKiBUaGVzZSBjb25kaXRpb25zIGFyZSBkZXJpdmVkIGZyb20gTWFjT1MgKi8KKworICAgd2hpbGUgKCEoTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRykgJiBCQVNSX0RSUSkgCisgICAgICAgICAmJiAhKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIFNSX1JFUSkpCisgICAgICA7CisgICBpZiAoIShOQ1I1MzgwX3JlYWQoQlVTX0FORF9TVEFUVVNfUkVHKSAmIEJBU1JfRFJRKSAKKyAgICAgICAgICYmIChOQ1I1MzgwX3JlYWQoQlVTX0FORF9TVEFUVVNfUkVHKSAmIEJBU1JfUEhBU0VfTUFUQ0gpKSB7CisgICAgICBwcmludGsoS0VSTl9FUlIgIkVycm9yIGluIG1hY3Njc2lfcHJlYWRcbiIpOworICAgICAgcmV0dXJuIC0xOworICAgfQorCisgICBDUF9JT19UT19NRU0ocywgZCwgbGVuKTsKKyAgIAorICAgaWYgKGxlbiAhPSAwKSB7CisgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgIkJ1cyBlcnJvciBpbiBtYWNzY3NpX3ByZWFkXG4iKTsKKyAgICAgIHJldHVybiAtMTsKKyAgIH0KKyAgIAorICAgcmV0dXJuIDA7Cit9CisKKworI2RlZmluZSBDUF9NRU1fVE9fSU8ocyxkLGxlbikJCQkJXAorX19hc21fXyBfX3ZvbGF0aWxlX18JCQkJCVwKKyAgICAoIiAgICBjbXAudyAgIzQsJTJcbiIJCQkJXAorICAgICAiICAgIGJscyAgICA4ZlxuIgkJCQkJXAorICAgICAiICAgIG1vdmUudyAlMCwlJWQwXG4iCQkJCVwKKyAgICAgIiAgICBuZWcuYiAgJSVkMFxuIgkJCQlcCisgICAgICIgICAgYW5kLncgICMzLCUlZDBcbiIJCQkJXAorICAgICAiICAgIHN1Yi53ICAlJWQwLCUyXG4iCQkJCVwKKyAgICAgIiAgICBicmEgICAgMmZcbiIJCQkJCVwKKyAgICAgIiAxOiBtb3ZlLmIgKCUwKSssKCUxKVxuIgkJCQlcCisgICAgICIgMjogZGJmICAgICUlZDAsMWJcbiIJCQkJXAorICAgICAiICAgIG1vdmUudyAlMiwlJWQwXG4iCQkJCVwKKyAgICAgIiAgICBsc3IudyAgIzUsJSVkMFxuIgkJCQlcCisgICAgICIgICAgYnJhICAgIDRmXG4iCQkJCQlcCisgICAgICIgMzogbW92ZS5sICglMCkrLCglMSlcbiIJCQkJXAorICAgICAiMzE6IG1vdmUubCAoJTApKywoJTEpXG4iCQkJCVwKKyAgICAgIjMyOiBtb3ZlLmwgKCUwKSssKCUxKVxuIgkJCQlcCisgICAgICIzMzogbW92ZS5sICglMCkrLCglMSlcbiIJCQkJXAorICAgICAiMzQ6IG1vdmUubCAoJTApKywoJTEpXG4iCQkJCVwKKyAgICAgIjM1OiBtb3ZlLmwgKCUwKSssKCUxKVxuIgkJCQlcCisgICAgICIzNjogbW92ZS5sICglMCkrLCglMSlcbiIJCQkJXAorICAgICAiMzc6IG1vdmUubCAoJTApKywoJTEpXG4iCQkJCVwKKyAgICAgIiA0OiBkYmYgICAgJSVkMCwzYlxuIgkJCQlcCisgICAgICIgICAgbW92ZS53ICUyLCUlZDBcbiIJCQkJXAorICAgICAiICAgIGxzci53ICAjMiwlJWQwXG4iCQkJCVwKKyAgICAgIiAgICBhbmQudyAgIzcsJSVkMFxuIgkJCQlcCisgICAgICIgICAgYnJhICAgIDZmXG4iCQkJCQlcCisgICAgICIgNTogbW92ZS5sICglMCkrLCglMSlcbiIJCQkJXAorICAgICAiIDY6IGRiZiAgICAlJWQwLDViXG4iCQkJCVwKKyAgICAgIiAgICBhbmQudyAgIzMsJTJcbiIJCQkJXAorICAgICAiICAgIGJyYSAgICA4ZlxuIgkJCQkJXAorICAgICAiIDc6IG1vdmUuYiAoJTApKywoJTEpXG4iCQkJCVwKKyAgICAgIiA4OiBkYmYgICAgJTIsN2JcbiIJCQkJXAorICAgICAiICAgIG1vdmVxLmwgIzAsICUyXG4iCQkJCVwKKyAgICAgIiA5OiBcbiIJCQkJCQlcCisgICAgICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJCVwKKyAgICAgIiAgICAuZXZlblxuIgkJCQkJXAorICAgICAiOTA6IG1vdmVxLmwgIzEsICUyXG4iCQkJCVwKKyAgICAgIiAgICBqcmEgOWJcbiIJCQkJCVwKKyAgICAgIi5wcmV2aW91c1xuIgkJCQkJXAorICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgkJCVwKKyAgICAgIiAgIC5hbGlnbiA0XG4iCQkJCQlcCisgICAgICIgICAubG9uZyAgMWIsOTBiXG4iCQkJCVwKKyAgICAgIiAgIC5sb25nICAzYiw5MGJcbiIJCQkJXAorICAgICAiICAgLmxvbmcgMzFiLDkwYlxuIgkJCQlcCisgICAgICIgICAubG9uZyAzMmIsOTBiXG4iCQkJCVwKKyAgICAgIiAgIC5sb25nIDMzYiw5MGJcbiIJCQkJXAorICAgICAiICAgLmxvbmcgMzRiLDkwYlxuIgkJCQlcCisgICAgICIgICAubG9uZyAzNWIsOTBiXG4iCQkJCVwKKyAgICAgIiAgIC5sb25nIDM2Yiw5MGJcbiIJCQkJXAorICAgICAiICAgLmxvbmcgMzdiLDkwYlxuIgkJCQlcCisgICAgICIgICAubG9uZyAgNWIsOTBiXG4iCQkJCVwKKyAgICAgIiAgIC5sb25nICA3Yiw5MGJcbiIJCQkJXAorICAgICAiLnByZXZpb3VzIgkJCQkJXAorICAgICA6ICI9YSIocyksICI9YSIoZCksICI9ZCIobGVuKQkJCVwKKyAgICAgOiAiMCIocyksICIxIihkKSwgIjIiKGxlbikJCQkJXAorICAgICA6ICJkMCIpCisKK3N0YXRpYyBpbnQgbWFjc2NzaV9wd3JpdGUgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLAorCQkJCSAgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgbGVuKQoreworICAgdW5zaWduZWQgY2hhciAqczsKKyAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmQ7CisKKyAgIE5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworICAgTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisKKyAgIHMgPSBzcmM7CisgICBkID0gbWFjX3Njc2lfZHJxOworICAgCisvKiBUaGVzZSBjb25kaXRpb25zIGFyZSBkZXJpdmVkIGZyb20gTWFjT1MgKi8KKworICAgd2hpbGUgKCEoTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRykgJiBCQVNSX0RSUSkgCisgICAgICAgICAmJiAoIShOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9SRVEpIAorICAgICAgICAgICAgfHwgKE5DUjUzODBfcmVhZChCVVNfQU5EX1NUQVRVU19SRUcpICYgQkFTUl9QSEFTRV9NQVRDSCkpKSAKKyAgICAgIDsKKyAgIGlmICghKE5DUjUzODBfcmVhZChCVVNfQU5EX1NUQVRVU19SRUcpICYgQkFTUl9EUlEpKSB7CisgICAgICBwcmludGsoS0VSTl9FUlIgIkVycm9yIGluIG1hY3Njc2lfcHdyaXRlXG4iKTsKKyAgICAgIHJldHVybiAtMTsKKyAgIH0KKworICAgQ1BfTUVNX1RPX0lPKHMsIGQsIGxlbik7ICAgCisKKyAgIGlmIChsZW4gIT0gMCkgeworICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICJCdXMgZXJyb3IgaW4gbWFjc2NzaV9wd3JpdGVcbiIpOworICAgICAgcmV0dXJuIC0xOworICAgfQorICAgCisgICByZXR1cm4gMDsKK30KKworCisvKiBUaGVzZSBjb250cm9sIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGdlbmVyaWMgNTM4MCBjb3JlICovCisjZGVmaW5lIEFVVE9TRU5TRQorI2RlZmluZSBQU0VVRE9fRE1BCisKKyNpbmNsdWRlICJOQ1I1MzgwLmMiCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCQk9ICJNYWM1MzgwIiwKKwkucHJvY19pbmZvCQkJPSBtYWNzY3NpX3Byb2NfaW5mbywKKwkubmFtZQkJCQk9ICJNYWNpbnRvc2ggTkNSNTM4MCBTQ1NJIiwKKwkuZGV0ZWN0CQkJCT0gbWFjc2NzaV9kZXRlY3QsCisJLnJlbGVhc2UJCQk9IG1hY3Njc2lfcmVsZWFzZSwKKwkuaW5mbwkJCQk9IG1hY3Njc2lfaW5mbywKKwkucXVldWVjb21tYW5kCQkJPSBtYWNzY3NpX3F1ZXVlX2NvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIJCT0gbWFjc2NzaV9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJCT0gbWFjc2NzaV9idXNfcmVzZXQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyCT0gbWFjc2NzaV9kZXZpY2VfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgkJPSBtYWNzY3NpX2hvc3RfcmVzZXQsCisJLmNhbl9xdWV1ZQkJCT0gQ0FOX1FVRVVFLAorCS50aGlzX2lkCQkJPSA3LAorCS5zZ190YWJsZXNpemUJCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCQk9IENNRF9QRVJfTFVOLAorCS51bmNoZWNrZWRfaXNhX2RtYQkJPSAwLAorCS51c2VfY2x1c3RlcmluZwkJCT0gRElTQUJMRV9DTFVTVEVSSU5HCit9OworCisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21hY19zY3NpLmggYi9kcml2ZXJzL3Njc2kvbWFjX3Njc2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2FiMmMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL21hY19zY3NpLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIEN1bWFuYSBHZW5lcmljIE5DUjUzODAgZHJpdmVyIGRlZmluZXMKKyAqCisgKiBDb3B5cmlnaHQgMTk5MywgRHJldyBFY2toYXJkdAorICoJVmlzaW9uYXJ5IENvbXB1dGluZworICoJKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyAqCWRyZXdAY29sb3JhZG8uZWR1CisgKiAgICAgICsxICgzMDMpIDQ0MC00ODk0CisgKgorICogQUxQSEEgUkVMRUFTRSAxLgorICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgY29uc3VsdAorICoKKyAqIE5DUiA1MzgwIEZhbWlseQorICogU0NTSSBQcm90b2NvbCBDb250cm9sbGVyCisgKiBEYXRhYm9vaworICoKKyAqIE5DUiBNaWNyb2VsZWN0cm9uaWNzCisgKiAxNjM1IEFlcm9wbGF6YSBEcml2ZQorICogQ29sb3JhZG8gU3ByaW5ncywgQ08gODA5MTYKKyAqIDErICg3MTkpIDU3OC0zNDAwCisgKiAxKyAoODAwKSAzMzQtNTQ1NAorICovCisKKy8qCisgKiAkTG9nOiBjdW1hbmFfTkNSNTM4MC5oLHYgJAorICovCisKKyNpZm5kZWYgTUFDX05DUjUzODBfSAorI2RlZmluZSBNQUNfTkNSNTM4MF9ICisKKyNkZWZpbmUgTUFDU0NTSV9QVUJMSUNfUkVMRUFTRSAyCisKKyNpZm5kZWYgQVNNCisKKyNpZm5kZWYgQ01EX1BFUl9MVU4KKyNkZWZpbmUgQ01EX1BFUl9MVU4gMgorI2VuZGlmCisKKyNpZm5kZWYgQ0FOX1FVRVVFCisjZGVmaW5lIENBTl9RVUVVRSAxNgorI2VuZGlmCisKKyNpZm5kZWYgU0dfVEFCTEVTSVpFCisjZGVmaW5lIFNHX1RBQkxFU0laRSBTR19OT05FCisjZW5kaWYKKworI2lmbmRlZiBVU0VfVEFHR0VEX1FVRVVJTkcKKyNkZWZpbmUJVVNFX1RBR0dFRF9RVUVVSU5HIDAKKyNlbmRpZgorCisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CisKKyNpZm5kZWYgSE9TVFNfQworCisjZGVmaW5lIE5DUjUzODBfaW1wbGVtZW50YXRpb25fZmllbGRzIFwKKyAgICBpbnQgcG9ydCwgY3RybAorCisjZGVmaW5lIE5DUjUzODBfbG9jYWxfZGVjbGFyZSgpIFwKKyAgICAgICAgc3RydWN0IFNjc2lfSG9zdCAqX2luc3RhbmNlCisKKyNkZWZpbmUgTkNSNTM4MF9zZXR1cChpbnN0YW5jZSkgXAorICAgICAgICBfaW5zdGFuY2UgPSBpbnN0YW5jZQorCisjZGVmaW5lIE5DUjUzODBfcmVhZChyZWcpIG1hY3Njc2lfcmVhZChfaW5zdGFuY2UsIHJlZykKKyNkZWZpbmUgTkNSNTM4MF93cml0ZShyZWcsIHZhbHVlKSBtYWNzY3NpX3dyaXRlKF9pbnN0YW5jZSwgcmVnLCB2YWx1ZSkKKworI2RlZmluZSBOQ1I1MzgwX3ByZWFkIAltYWNzY3NpX3ByZWFkCisjZGVmaW5lIE5DUjUzODBfcHdyaXRlIAltYWNzY3NpX3B3cml0ZQorCQorI2RlZmluZSBOQ1I1MzgwX2ludHIgbWFjc2NzaV9pbnRyCisjZGVmaW5lIE5DUjUzODBfcXVldWVfY29tbWFuZCBtYWNzY3NpX3F1ZXVlX2NvbW1hbmQKKyNkZWZpbmUgTkNSNTM4MF9hYm9ydCBtYWNzY3NpX2Fib3J0CisjZGVmaW5lIE5DUjUzODBfYnVzX3Jlc2V0IG1hY3Njc2lfYnVzX3Jlc2V0CisjZGVmaW5lIE5DUjUzODBfZGV2aWNlX3Jlc2V0IG1hY3Njc2lfZGV2aWNlX3Jlc2V0CisjZGVmaW5lIE5DUjUzODBfaG9zdF9yZXNldCBtYWNzY3NpX2hvc3RfcmVzZXQKKyNkZWZpbmUgTkNSNTM4MF9wcm9jX2luZm8gbWFjc2NzaV9wcm9jX2luZm8KKworI2RlZmluZSBCT0FSRF9OT1JNQUwJMAorI2RlZmluZSBCT0FSRF9OQ1I1M0M0MDAJMQorCisjZW5kaWYgLyogbmRlZiBIT1NUU19DICovCisjZW5kaWYgLyogbmRlZiBBU00gKi8KKyNlbmRpZiAvKiBNQUNfTkNSNTM4MF9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tY2FfNTNjOXguYyBiL2RyaXZlcnMvc2NzaS9tY2FfNTNjOXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTRjNzU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL21jYV81M2M5eC5jCkBAIC0wLDAgKzEsNTIwIEBACisvKiBtY2FfNTNjOXguYzogRHJpdmVyIGZvciB0aGUgU0NTSSBhZGFwdGVyIGZvdW5kIG9uIE5DUiAzNXh4CisgKiAgKGFuZCBtYXliZSBzb21lIG90aGVyKSBNaWNyb2NoYW5uZWwgbWFjaGluZXMKKyAqCisgKiBDb2RlIHRha2VuIG1vc3RseSBmcm9tIEN5YmVyc3Rvcm0gU0NTSSBkcml2ZXJzCisgKiAgIENvcHlyaWdodCAoQykgMTk5NiBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKQorICoKKyAqIEhhY2tlZCB0byB3b3JrIHdpdGggdGhlIE5DUiBNQ0Egc3R1ZmYgYnkgVHltbSBUd2lsbG1hbiAodHltbUBjb21wdXRlci5vcmcpCisgKgorICogVGhlIEN5YmVyU3Rvcm0gU0NTSSBkcml2ZXIgKGFuZCB0aGlzIGRyaXZlcikgaXMgYmFzZWQgb24gRGF2aWQgUy4gTWlsbGVyJ3MKKyAqICAgRVNQIGRyaXZlciAgKiBmb3IgdGhlIFNwYXJjIGNvbXB1dGVycy4gCisgKiAKKyAqIFNwZWNpYWwgdGhhbmtzIHRvIEtlbiBTdGV3YXJ0IGF0IFN5bWJpb3MgKExTSSkgZm9yIGhlbHBpbmcgd2l0aCBpbmZvIG9uCisgKiAgdGhlIDg2QzAxLiAgSSB3YXMgb24gdGhlIGJyaW5rIG9mIGdvaW5nIGdhLWdhLi4uCisgKgorICogQWxzbyB0aGFua3MgdG8gSmVzcGVyIFNrb3YgZm9yIGhlbHBpbmcgbWUgd2l0aCBpbmZvIG9uIGhvdyB0aGUgQW1pZ2EKKyAqICBkb2VzIHRoaW5ncy4uLgorICovCisKKy8qCisgKiBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHNldCB1cCB0byB1c2Ugb25lIDUzYzl4IGNhcmQgYXQgYSB0aW1lOyBpdCBjb3VsZCBiZSAKKyAqICBjaGFuZ2VkIGZhaXJseSBlYXNpbHkgdG8gZGV0ZWN0L3VzZSBtb3JlIHRoYW4gb25lLCBidXQgSSdtIG5vdCB0b28gc3VyZSBob3cKKyAqICBtYW55IGNhcmRzIHRoYXQgdXNlIHRoZSA1M2M5eCBvbiBNQ0Egc3lzdGVtcyB0aGVyZSBhcmUgKGlmLCBpbiBmYWN0LCB0aGVyZQorICogIGFyZSBjYXJkcyB0aGF0IHVzZSB0aGVtLCBvdGhlciB0aGFuIHRoZSBvbmUgYnVpbHQgaW50byBzb21lIE5DUiBzeXN0ZW1zKS4uLgorICogIElmIGFueW9uZSByZXF1ZXN0cyB0aGlzLCBJJ2xsIHRocm93IGl0IGluLCBvdGhlcndpc2UgaXQncyBub3Qgd29ydGggdGhlCisgKiAgZWZmb3J0LgorICovCisKKy8qCisgKiBJbmZvIG9uIHRoZSA4NkMwMSBNQ0EgaW50ZXJmYWNlIGNoaXAgYXQgdGhlIGJvdHRvbSwgaWYgeW91IGNhcmUgZW5vdWdoIHRvCisgKiAgbG9vay4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS1sZWdhY3kuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgIk5DUjUzQzl4LmgiCisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tY2FfZG1hLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworLyoKKyAqIEZyb20gaWJtbWNhLmMgKElCTSBzY3NpIGNvbnRyb2xsZXIgY2FyZCBkcml2ZXIpIC0tIHVzZWQgZm9yIHR1cm5pbmcgUFMyIGRpc2sKKyAqICBhY3Rpdml0eSBMRUQgb24gYW5kIG9mZgorICovCisKKyNkZWZpbmUgUFMyX1NZU19DVFIJMHg5MgorCisvKiBQb3J0cyB0aGUgbmNyJ3MgNTNjOTQgY2FuIGJlIHB1dCBhdDsgaW5kZXhlZCBieSBwb3MgcmVnaXN0ZXIgdmFsdWUgKi8KKworI2RlZmluZSBNQ0FfNTNDOVhfSU9fUE9SVFMgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMCwgMHgwMjQwLCAweDAzNDAsIDB4MDQwMCwgXAorCSAgICAgICAgICAgICAgICAgMHgwNDIwLCAweDMyNDAsIDB4ODI0MCwgMHhBMjQwLCBcCisJICAgICAgICAgICAgICAgIH0KKwkJCQorLyoKKyAqIFN1cHBvc2VkbHkgdGhlcmUgd2VyZSBzb21lIGNhcmRzIHB1dCB0b2dldGhlciB3aXRoIHRoZSAnYzl4IGFuZCA4NmMwMS4gIElmCisgKiAgIHRoZXkgaGF2ZSBkaWZmZXJlbnQgSUQncyBmcm9tIHRoZSBvbmVzIG9uIHRoZSAzNTAwIHNlcmllcyBtYWNoaW5lcywgCisgKiAgIHlvdSBjYW4gYWRkIHRoZW0gaGVyZSBhbmQgaG9wZWZ1bGx5IHRoaW5ncyB3aWxsIHdvcmsgb3V0LgorICovCisJCQkKKyNkZWZpbmUgTUNBXzUzQzlYX0lEUyB7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDdGNEMsIFwKKwkJCSAweDAwMDAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworc3RhdGljIGludCAgZG1hX2J5dGVzX3NlbnQoc3RydWN0IE5DUl9FU1AgKiwgaW50KTsKK3N0YXRpYyBpbnQgIGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKiwgU2NzaV9DbW5kICopOworc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKik7CitzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICosIF9fdTMyLCBpbnQpOworc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKiwgX191MzIsIGludCk7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKik7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqKTsKK3N0YXRpYyBpbnQgIGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqKTsKK3N0YXRpYyBpbnQgIGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICopOworc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICosIF9fdTMyLCBpbnQsIGludCk7CitzdGF0aWMgdm9pZCBkbWFfbGVkX29uKHN0cnVjdCBOQ1JfRVNQICopOworc3RhdGljIHZvaWQgZG1hX2xlZF9vZmYoc3RydWN0IE5DUl9FU1AgKik7CisKKy8qIFRoaXMgaXMgd2hlcmUgYWxsIGNvbW1hbmRzIGFyZSBwdXQgYmVmb3JlIHRoZXkgYXJlIHRyYXNmZXJlZCB0byB0aGUgCisgKiAgNTNjOXggdmlhIFBJTy4KKyAqLworCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzE2XTsKKworLyoKKyAqIFdlIGtlZXAgdGhlIHN0cnVjdHVyZSB0aGF0IGlzIHVzZWQgdG8gYWNjZXNzIHRoZSByZWdpc3RlcnMgb24gdGhlIDUzYzl4CisgKiAgaGVyZS4KKyAqLworCitzdGF0aWMgc3RydWN0IEVTUF9yZWdzIGVyZWdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGV0ZWN0aW9uICovCitzdGF0aWMgaW50IG1jYV9lc3BfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCkKK3sKKwlzdHJ1Y3QgTkNSX0VTUCAqZXNwOworCXN0YXRpYyBpbnQgaW9fcG9ydF9ieV9wb3NbXSA9IE1DQV81M0M5WF9JT19QT1JUUzsKKwlpbnQgbWNhXzUzYzl4X2lkc1tdID0gTUNBXzUzQzlYX0lEUzsKKwlpbnQgKmlkX3RvX2NoZWNrID0gbWNhXzUzYzl4X2lkczsKKwlpbnQgc2xvdDsKKwlpbnQgcG9zWzNdOworCXVuc2lnbmVkIGludCB0bXBfaW9fYWRkcjsKKwl1bnNpZ25lZCBjaGFyIHRtcF9ieXRlOworCisKKwlpZiAoIU1DQV9idXMpCisJCXJldHVybiAwOworCisJd2hpbGUgKCppZF90b19jaGVjaykgeyAKKwkJaWYgKChzbG90ID0gbWNhX2ZpbmRfYWRhcHRlcigqaWRfdG9fY2hlY2ssIDApKSAhPQorCQkgIE1DQV9OT1RGT1VORCkgCisJCXsKKwkJCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCAodm9pZCAqKSBOVUxMKTsKKworCQkJcG9zWzBdID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCAyKTsKKwkJCXBvc1sxXSA9IG1jYV9yZWFkX3N0b3JlZF9wb3Moc2xvdCwgMyk7CisJCQlwb3NbMl0gPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDQpOworCisJCQllc3AtPmVyZWdzID0gJmVyZWdzOworCisJCQkvKgorCQkJICogSU8gcG9ydCBiYXNlIGlzIGdpdmVuIGluIHRoZSBmaXJzdCAobm9uLUlEKSBwb3MKKwkJCSAqICByZWdpc3RlciwgbGlrZSBzbzoKKwkJCSAqCisJCQkgKiAgQml0cyAzICAyICAxICAgICAgIElPIGJhc2UKKwkJCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCSAqICAgICAgIDAgIDAgIDAgICAgICAgPGRpc2FibGVkPgorCQkJICogICAgICAgMCAgMCAgMSAgICAgICAweDAyNDAKKwkJCSAqICAgICAgIDAgIDEgIDAgICAgICAgMHgwMzQwCisJCQkgKiAgICAgICAwICAxICAxICAgICAgIDB4MDQwMAorCQkJICogICAgICAgMSAgMCAgMCAgICAgICAweDA0MjAKKwkJCSAqICAgICAgIDEgIDAgIDEgICAgICAgMHgzMjQwCisJCQkgKiAgICAgICAxICAxICAwICAgICAgIDB4ODI0MAorCQkJICogICAgICAgMSAgMSAgMSAgICAgICAweEEyNDAKKwkJCSAqLworCisJCQl0bXBfaW9fYWRkciA9CisJCQkgIGlvX3BvcnRfYnlfcG9zWyhwb3NbMF0gJiAweDBFKSA+PiAxXTsKKworCQkJZXNwLT5lcmVncy0+aW9fYWRkciA9IHRtcF9pb19hZGRyICsgMHgxMDsKKworICAgICAgCQkJaWYgKGVzcC0+ZXJlZ3MtPmlvX2FkZHIgPT0gMHgwMDAwKSB7IAorICAgICAgICAJCQlwcmludGsoIkFkYXB0ZXIgaXMgZGlzYWJsZWQuXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElSUSBpcyBzcGVjaWZpZWQgaW4gYml0cyA0IGFuZCA1OgorCQkJICoKKwkJCSAqICBCaXRzICA0ICA1ICAgICAgICBJUlEKKwkJCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkgKiAgICAgICAgMCAgMCAgICAgICAgIDMKKwkJCSAqICAgICAgICAwICAxICAgICAgICAgNQorCQkJICogICAgICAgIDEgIDAgICAgICAgICA3CisJCQkgKiAgICAgICAgMSAgMSAgICAgICAgIDkKKwkJCSAqLworCisgICAgICAJCQllc3AtPmlycSA9ICgocG9zWzBdICYgMHgzMCkgPj4gMykgKyAzOworCisJCQkvKgorCQkJICogRE1BIGNoYW5uZWwgaXMgaW4gdGhlIGxvdyAzIGJpdHMgb2YgdGhlIHNlY29uZAorCQkJICogIFBPUyByZWdpc3RlcgorCQkJICovCisKKwkJCWVzcC0+ZG1hID0gcG9zWzFdICYgNzsKKwkJCWVzcC0+c2xvdCA9IHNsb3Q7CisKKwkJCWlmIChyZXF1ZXN0X2lycShlc3AtPmlycSwgZXNwX2ludHIsIDAsCisJCQkgIk5DUiA1M2M5eCBTQ1NJIiwgZXNwLT5laG9zdCkpCisJCQl7CisJCQkJcHJpbnRrKCJVbmFibGUgdG8gcmVxdWVzdCBJUlEgJWQuXG4iLCBlc3AtPmlycSk7CisJCQkJZXNwX2RlYWxsb2NhdGUoZXNwKTsKKwkJCQlzY3NpX3VucmVnaXN0ZXIoZXNwLT5laG9zdCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKyAJCQlpZiAocmVxdWVzdF9kbWEoZXNwLT5kbWEsICJOQ1IgNTNjOXggU0NTSSIpKSB7CisJCQkJcHJpbnRrKCJVbmFibGUgdG8gcmVxdWVzdCBETUEgY2hhbm5lbCAlZC5cbiIsCisJCQkJIGVzcC0+ZG1hKTsKKwkJCQlmcmVlX2lycShlc3AtPmlycSwgZXNwX2ludHIpOworCQkJCWVzcF9kZWFsbG9jYXRlKGVzcCk7CisJCQkJc2NzaV91bnJlZ2lzdGVyKGVzcC0+ZWhvc3QpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlyZXF1ZXN0X3JlZ2lvbih0bXBfaW9fYWRkciwgMzIsICJOQ1IgNTNjOXggU0NTSSIpOworCisJCQkvKgorCQkJICogODZDMDEgaGFuZGxlcyBETUEsIElPIG1vZGUsIGZyb20gYWRkcmVzcworCQkJICogIChiYXNlICsgMHgwYSkKKwkJCSAqLworCisJCQltY2FfZGlzYWJsZV9kbWEoZXNwLT5kbWEpOworCQkJbWNhX3NldF9kbWFfaW8oZXNwLT5kbWEsIHRtcF9pb19hZGRyICsgMHgwYSk7CisJCQltY2FfZW5hYmxlX2RtYShlc3AtPmRtYSk7CisgCisJCQkvKiBUZWxsIHRoZSA4NkMwMSB0byBnaXZlIHVzIGludGVycnVwdHMgKi8KKworCQkJdG1wX2J5dGUgPSBpbmIodG1wX2lvX2FkZHIgKyAweDAyKSB8IDB4NDA7CisJCQlvdXRiKHRtcF9ieXRlLCB0bXBfaW9fYWRkciArIDB4MDIpOyAKKworCQkJLyoKKwkJCSAqIFNjc2kgSUQgLS0gZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyLCBoaQorCQkJICogIDIgYml0czsgYWRkIDQgdG8gdGhpcyBudW1iZXIgdG8gZ2V0IHRoZQorCQkJICogIElECisJCQkgKi8KKworCQkJZXNwLT5zY3NpX2lkID0gKChwb3NbMl0gJiAweEMwKSA+PiA2KSArIDQ7CisKKwkJCS8qIERvIGNvbW1hbmQgdHJhbnNmZXIgd2l0aCBwcm9ncmFtbWVkIEkvTyAqLworCisJCQllc3AtPmRvX3Bpb19jbWRzID0gMTsKKworCQkJLyogUmVxdWlyZWQgZnVuY3Rpb25zICovCisKKwkJCWVzcC0+ZG1hX2J5dGVzX3NlbnQgPSAmZG1hX2J5dGVzX3NlbnQ7CisJCQllc3AtPmRtYV9jYW5fdHJhbnNmZXIgPSAmZG1hX2Nhbl90cmFuc2ZlcjsKKwkJCWVzcC0+ZG1hX2R1bXBfc3RhdGUgPSAmZG1hX2R1bXBfc3RhdGU7CisJCQllc3AtPmRtYV9pbml0X3JlYWQgPSAmZG1hX2luaXRfcmVhZDsKKwkJCWVzcC0+ZG1hX2luaXRfd3JpdGUgPSAmZG1hX2luaXRfd3JpdGU7CisJCQllc3AtPmRtYV9pbnRzX29mZiA9ICZkbWFfaW50c19vZmY7CisJCQllc3AtPmRtYV9pbnRzX29uID0gJmRtYV9pbnRzX29uOworCQkJZXNwLT5kbWFfaXJxX3AgPSAmZG1hX2lycV9wOworCQkJZXNwLT5kbWFfcG9ydHNfcCA9ICZkbWFfcG9ydHNfcDsKKwkJCWVzcC0+ZG1hX3NldHVwID0gJmRtYV9zZXR1cDsKKworCQkJLyogT3B0aW9uYWwgZnVuY3Rpb25zICovCisKKwkJCWVzcC0+ZG1hX2JhcnJpZXIgPSBOVUxMOworCQkJZXNwLT5kbWFfZHJhaW4gPSBOVUxMOworCQkJZXNwLT5kbWFfaW52YWxpZGF0ZSA9IE5VTEw7CisJCQllc3AtPmRtYV9pcnFfZW50cnkgPSBOVUxMOworCQkJZXNwLT5kbWFfaXJxX2V4aXQgPSBOVUxMOworCQkJZXNwLT5kbWFfbGVkX29uID0gZG1hX2xlZF9vbjsKKwkJCWVzcC0+ZG1hX2xlZF9vZmYgPSBkbWFfbGVkX29mZjsKKwkJCWVzcC0+ZG1hX3BvbGwgPSBOVUxMOworCQkJZXNwLT5kbWFfcmVzZXQgPSBOVUxMOworCisJCQkvKiBTZXQgdGhlIGNvbW1hbmQgYnVmZmVyICovCisKKwkJCWVzcC0+ZXNwX2NvbW1hbmQgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciopCisJCQkgIGNtZF9idWZmZXI7CisJIAkJZXNwLT5lc3BfY29tbWFuZF9kdm1hID0gaXNhX3ZpcnRfdG9fYnVzKGNtZF9idWZmZXIpOworCisJCQkvKiBTQ1NJIGNoaXAgc3BlZWQgKi8KKworCQkJZXNwLT5jZnJlcSA9IDI1MDAwMDAwOworCisJCQkvKiBEaWZmZXJlbnRpYWwgU0NTST8gSSB0aGluayBub3QuICovCisKKwkJCWVzcC0+ZGlmZiA9IDA7CisKKwkJCWVzcF9pbml0aWFsaXplKGVzcCk7CisKKyAgICAgIAkJCXByaW50aygiIEFkYXB0ZXIgZm91bmQgaW4gc2xvdCAlMmQ6IGlvIHBvcnQgMHgleCAiCisJCQkgICJpcnEgJWQgZG1hIGNoYW5uZWwgJWRcbiIsIHNsb3QgKyAxLCB0bXBfaW9fYWRkciwKKwkJCSAgIGVzcC0+aXJxLCBlc3AtPmRtYSk7CisKKwkJCW1jYV9zZXRfYWRhcHRlcl9uYW1lKHNsb3QsICJOQ1IgNTNDOVggU0NTSSBBZGFwdGVyIik7CisJCQltY2FfbWFya19hc191c2VkKHNsb3QpOworCisJCQlicmVhazsKKwkJfQorICAgIAorCQlpZF90b19jaGVjaysrOworCX0KKworCXJldHVybiBlc3BzX2luX3VzZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBSZWxlYXNlICovCisKK3N0YXRpYyBpbnQgbWNhX2VzcF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RydWN0IE5DUl9FU1AgKmVzcCA9IChzdHJ1Y3QgTkNSX0VTUCAqKWhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGNoYXIgdG1wX2J5dGU7CisKKwllc3BfZGVhbGxvY2F0ZShlc3ApOworCS8qCisJICogVGVsbCB0aGUgODZDMDEgdG8gc3RvcCBzZW5kaW5nIGludGVycnVwdHMKKwkgKi8KKworCXRtcF9ieXRlID0gaW5iKGVzcC0+ZXJlZ3MtPmlvX2FkZHIgLSAweDBFKTsKKwl0bXBfYnl0ZSAmPSB+MHg0MDsKKwlvdXRiKHRtcF9ieXRlLCBlc3AtPmVyZWdzLT5pb19hZGRyIC0gMHgwRSk7CisKKwlmcmVlX2lycShlc3AtPmlycSwgZXNwX2ludHIpOworCWZyZWVfZG1hKGVzcC0+ZG1hKTsKKworCW1jYV9tYXJrX2FzX3VudXNlZChlc3AtPnNsb3QpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERNQSBGdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgZG1hX2J5dGVzX3NlbnQoc3RydWN0IE5DUl9FU1AgKmVzcCwgaW50IGZpZm9fY291bnQpCit7CisJLyogQXNrIHRoZSA1M2M5eC4gIEl0IGtub3dzLiAqLworCisJcmV0dXJuIGZpZm9fY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2Nhbl90cmFuc2ZlcihzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKQoreworCS8qIAorCSAqIFRoZSBNQ0EgZG1hIGNoYW5uZWxzIGNhbiBvbmx5IGRvIHVwIHRvIDEyOEsgYnl0ZXMgYXQgYSB0aW1lLgorICAgICAgICAgKiAgKDE2IGJpdCBtb2RlKQorCSAqLworCisJdW5zaWduZWQgbG9uZyBzeiA9IHNwLT5TQ3AudGhpc19yZXNpZHVhbDsKKwlpZihzeiA+IDB4MjAwMDApCisJCXN6ID0gMHgyMDAwMDsKKwlyZXR1cm4gc3o7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJLyoKKwkgKiBEb2Vzbid0IHF1aXRlIG1hdGNoIHVwIHRvIHRoZSBvdGhlciBkcml2ZXJzLCBidXQgd2UgZG8gd2hhdCB3ZQorCSAqICBjYW4uCisJICovCisKKwlFU1BMT0coKCJlc3AlZDogZG1hIGNoYW5uZWwgPCVkPlxuIiwgZXNwLT5lc3BfaWQsIGVzcC0+ZG1hKSk7CisJRVNQTE9HKCgiYnl0ZXMgbGVmdCB0byBkbWE6ICVkXG4iLCBtY2FfZ2V0X2RtYV9yZXNpZHVlKGVzcC0+ZG1hKSkpOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisKKwltY2FfZGlzYWJsZV9kbWEoZXNwLT5kbWEpOworCW1jYV9zZXRfZG1hX21vZGUoZXNwLT5kbWEsIE1DQV9ETUFfTU9ERV9YRkVSIHwgTUNBX0RNQV9NT0RFXzE2IHwKKwkgIE1DQV9ETUFfTU9ERV9JTyk7CisJbWNhX3NldF9kbWFfYWRkcihlc3AtPmRtYSwgYWRkcik7CisJbWNhX3NldF9kbWFfY291bnQoZXNwLT5kbWEsIGxlbmd0aCAvIDIpOyAvKiAhISEgKi8KKwltY2FfZW5hYmxlX2RtYShlc3AtPmRtYSk7CisKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKworCW1jYV9kaXNhYmxlX2RtYShlc3AtPmRtYSk7CisJbWNhX3NldF9kbWFfbW9kZShlc3AtPmRtYSwgTUNBX0RNQV9NT0RFX1hGRVIgfCBNQ0FfRE1BX01PREVfV1JJVEUgfAorCSAgTUNBX0RNQV9NT0RFXzE2IHwgTUNBX0RNQV9NT0RFX0lPKTsKKwltY2Ffc2V0X2RtYV9hZGRyKGVzcC0+ZG1hLCBhZGRyKTsKKwltY2Ffc2V0X2RtYV9jb3VudChlc3AtPmRtYSwgbGVuZ3RoIC8gMik7IC8qICEhISAqLworCW1jYV9lbmFibGVfZG1hKGVzcC0+ZG1hKTsKKworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwkvKgorCSAqIFRlbGwgdGhlICdDMDEgdG8gc2h1dCB1cC4gIEFsbCBpbnRlcnJ1cHRzIGFyZSByb3V0ZWQgdGhyb3VnaCBpdC4KKwkgKi8KKworCW91dGIoaW5iKGVzcC0+ZXJlZ3MtPmlvX2FkZHIgLSAweDBFKSAmIH4weDQwLAorCSBlc3AtPmVyZWdzLT5pb19hZGRyIC0gMHgwRSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJLyoKKwkgKiBPay4gIFlvdSBjYW4gc3BlYWsgYWdhaW4uCisJICovCisKKwlvdXRiKGluYihlc3AtPmVyZWdzLT5pb19hZGRyIC0gMHgwRSkgfCAweDQwLAorCSBlc3AtPmVyZWdzLT5pb19hZGRyIC0gMHgwRSk7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJLyoKKwkgKiBEYXZlTSBzYXlzIHRoYXQgdGhpcyBzaG91bGQgcmV0dXJuIGEgInllcyIgaWYgdGhlcmUgaXMgYW4gaW50ZXJydXB0CisJICogIG9yIGEgRE1BIGVycm9yIG9jY3VycmVkLiAgSSBjb3BpZWQgdGhlIEFtaWdhIGRyaXZlcidzIHNlbWFudGljcywKKwkgKiAgdGhvdWdoLCBiZWNhdXNlIGl0IHNlZW1zIHRvIHdvcmsgYW5kIHdlIGNhbid0IHJlYWxseSB0ZWxsIGlmCisJICogIGEgRE1BIGVycm9yIGhhcHBlbmVkLiAgVGhpcyBnaXZlcyB0aGUgInllcyIgaWYgdGhlIHNjc2kgY2hpcAorCSAqICBpcyBzZW5kaW5nIGFuIGludGVycnVwdCBhbmQgbm8gRE1BIGFjdGl2aXR5IGlzIHRha2luZyBwbGFjZQorCSAqLworCisJcmV0dXJuICghKGluYihlc3AtPmVyZWdzLT5pb19hZGRyIC0gMHgwNCkgJiAxKSAmJgorCSAhKGluYihlc3AtPmVyZWdzLT5pb19hZGRyIC0gMHgwNCkgJiAyKSApOyAKK30KKworc3RhdGljIGludCBkbWFfcG9ydHNfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIGludGVycnVwdHMgYXJlIGVuYWJsZWQgb24gdGhlICdDMDEgKGluIGNhc2UgYWJvcnQKKwkgKiAgaXMgZW50ZXJlZCBtdWx0aXBsZSB0aW1lcywgc28gd2Ugb25seSBkbyB0aGUgYWJvcnQgb25jZSkKKwkgKi8KKworCXJldHVybiAoaW5iKGVzcC0+ZXJlZ3MtPmlvX2FkZHIgLSAweDBFKSAmIDB4NDApID8gMTowOworfQorCitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpCit7CisJaWYod3JpdGUpeworCQlkbWFfaW5pdF93cml0ZShlc3AsIGFkZHIsIGNvdW50KTsKKwl9IGVsc2UgeworCQlkbWFfaW5pdF9yZWFkKGVzcCwgYWRkciwgY291bnQpOworCX0KK30KKworLyoKKyAqIFRoZXNlIHdpbGwgbm90IHBsYXkgbmljZWx5IHdpdGggb3RoZXIgZGlzayBjb250cm9sbGVycyB0aGF0IHRyeSB0byB1c2UgdGhlCisgKiAgZGlzayBhY3RpdmUgTEVELi4uIGJ1dCB3aGF0IGNhbiB5b3UgZG8/ICBEb24ndCBhbnN3ZXIgdGhhdC4KKyAqCisgKiBTdG9sZW4gc2hhbWVsZXNzbHkgZnJvbSBpYm1tY2EuYyAtLSBJQk0gTWljcm9jaGFubmVsIFNDU0kgYWRhcHRlciBkcml2ZXIKKyAqCisgKi8KKworc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCW91dGIoaW5iKFBTMl9TWVNfQ1RSKSB8IDB4YzAsIFBTMl9TWVNfQ1RSKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2xlZF9vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlvdXRiKGluYihQUzJfU1lTX0NUUikgJiAweDNmLCBQUzJfU1lTX0NUUik7Cit9CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gIm1jYV81M2M5eCIsCisJLm5hbWUJCQk9ICJOQ1IgNTNjOXggU0NTSSIsCisJLmRldGVjdAkJCT0gbWNhX2VzcF9kZXRlY3QsCisJLnNsYXZlX2FsbG9jCQk9IGVzcF9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfZGVzdHJveQkJPSBlc3Bfc2xhdmVfZGVzdHJveSwKKwkucmVsZWFzZQkJPSBtY2FfZXNwX3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSBlc3BfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBlc3BfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZXNwX3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gMSwKKwkudW5jaGVja2VkX2lzYV9kbWEJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcKK307CisKKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKKy8qCisgKiBPSywgaGVyZSdzIHRoZSBnb29kcyBJIHByb21pc2VkLiAgVGhlIE5DUiA4NkMwMSBpcyBhbiBNQ0EgaW50ZXJmYWNlIGNoaXAgCisgKiAgdGhhdCBoYW5kbGVzIGVuYWJsaW5nL2RpYWJsaW5nIElSUSwgZG1hIGludGVyZmFjaW5nLCBJTyBwb3J0IHNlbGVjdGlvbgorICogIGFuZCBvdGhlciBmdW4gc3R1ZmYuICBJdCB0YWtlcyB1cCAxNiBhZGRyZXNzZXMsIGFuZCB0aGUgY2hpcCBpdCBpcworICogIGNvbm5uZWN0ZWQgdG8gZ2V0cyB0aGUgZm9sbG93aW5nIDE2LiAgUmVnaXN0ZXJzIGFyZSBhcyBmb2xsb3dzOgorICoKKyAqIE9mZnNldHMgMC0xIDogQ2FyZCBJRAorICoKKyAqIE9mZnNldCAgICAyIDogTW9kZSBlbmFibGUgcmVnaXN0ZXIgLS0KKyAqICAgICAgICAgICAgICAgIEJpdCAgICA3IDogRGF0YSBXb3JkIHdpZHRoICgxID0gMTYsIDAgPSA4KQorICoJCSAgQml0ICAgIDYgOiBJUlEgZW5hYmxlICgxID0gZW5hYmxlZCkKKyAqICAgICAgICAgICAgICAgIEJpdHMgNSw0IDogSVJRIHNlbGVjdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAwIDogSVJRIDMKKyAqCQkJICAgICAgICAwICAxIDogSVJRIDUKKyAqIAkJCQkxICAwIDogSVJRIDcKKyAqICAJCQkJMSAgMSA6IElSUSA5CisgKiAgICAgICAgICAgICAgICBCaXRzIDMtMSA6IEJhc2UgQWRkcmVzcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAwICAwICAwIDogPGRpc2FibGVkPgorICogCQkJICAgICAwICAwICAxIDogMHgwMjQwCisgKiAgICAJCQkgICAgIDAgIDEgIDAgOiAweDAzNDAKKyAqICAgICAJCQkgICAgIDAgIDEgIDEgOiAweDA0MDAKKyAqIAkJCSAgICAgMSAgMCAgMCA6IDB4MDQyMAorICogCQkJICAgICAxICAwICAxIDogMHgzMjQwCisgKiAJCQkgICAgIDEgIDEgIDAgOiAweDgyNDAKKyAqIAkJCSAgICAgMSAgMSAgMSA6IDB4QTI0MAorICoJCSAgQml0ICAgIDAgOiBDYXJkIGVuYWJsZSAoMSA9IGVuYWJsZWQpCisgKgorICogT2Zmc2V0ICAgIDMgOiBETUEgY29udHJvbCByZWdpc3RlciAtLQorICogICAgICAgICAgICAgICAgQml0ICAgIDcgOiBETUEgZW5hYmxlICgxID0gZW5hYmxlZCkKKyAqICAgICAgICAgICAgICAgIEJpdHMgNiw1IDogUHJlZW10IENvdW50IFNlbGVjdCAodHJhbnNmZXJzIHRvIGNvbXBsZXRlIGFmdGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQzAxIGhhcyBiZWVuIHByZWVtcHRlZCBvbiBNQ0EgYnVzKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAwIDogMAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAxIDogMQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAwIDogMworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAxIDogNworICogIChhbGwgdGhlc2Ugd2Fja3kgbnVtYmVyczsgSSdtIHN1cmUgdGhlcmUncyBhIHJlYXNvbiBzb21ld2hlcmUpCisgKiAgICAgICAgICAgICAgICBCaXQgICAgNCA6IEZhaXJuZXNzIGVuYWJsZSAoMSA9IGZhaXIgYnVzIHByaW9yaXR5KQorICogICAgICAgICAgICAgICAgQml0cyAzLTAgOiBBcmJpdHJhdGlvbiBsZXZlbCAoMC0xNSBjb25zZWN1dGl2ZSkKKyAqIAorICogT2Zmc2V0ICAgIDQgOiBHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICAgIEJpdHMgNy0zIDogVXNlciBkZWZpbmFibGUgKGhlcmUsIDcsNiBhcmUgU0NTSSBJRCkKKyAqICAgICAgICAgICAgICAgIEJpdHMgMi0wIDogcmVzZXJ2ZWQKKyAqCisgKiBPZmZzZXQgICAxMCA6IERNQSBkZWNvZGUgcmVnaXN0ZXIgKHVzZWQgZm9yIElPIGJhc2VkIERNQTsgYWxzbyBjYW4gZG8KKyAqICAgICAgICAgICAgICAgIFBJTyB0aHJvdWdoIHRoaXMgcG9ydCkKKyAqCisgKiBPZmZzZXQgICAxMiA6IFN0YXR1cworICogICAgICAgICAgICAgICAgQml0cyA3LTIgOiByZXNlcnZlZAorICogICAgICAgICAgICAgICAgQml0ICAgIDEgOiBETUEgcGVuZGluZyAoMSA9IHBlbmRpbmcpCisgKiAgICAgICAgICAgICAgICBCaXQgICAgMCA6IElSUSBwZW5kaW5nICgwID0gcGVuZGluZykKKyAqCisgKiBFeGNpdGluZywgaHVoPyAgCisgKgorICovICAgICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDcwN2IyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmMKQEAgLTAsMCArMSw1MTIyIEBACisvKgorICoKKyAqCQkJTGludXggTWVnYVJBSUQgZGV2aWNlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCCpIDIwMDIgIExTSSBMb2dpYyBDb3Jwb3JhdGlvbi4KKyAqCisgKgkgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoJICAtIGZpeGVzCisgKgkgIC0gc3BlZWQtdXBzIChsaXN0IGhhbmRsaW5nIGZpeGVzLCBpc3N1ZWRfbGlzdCwgb3B0aW1pemF0aW9ucy4pCisgKgkgIC0gbG90cyBvZiBjbGVhbnVwcy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgIENocmlzdG9waCBIZWxsd2lnICA8aGNoQGxzdC5kZT4KKyAqCSAgLSBuZXctc3R5bGUsIGhvdHBsdWctYXdhcmUgcGNpIHByb2JpbmcgYW5kIHNjc2kgcmVnaXN0cmF0aW9uCisgKgorICogVmVyc2lvbiA6IHYyLjAwLjMgKEZlYiAxOSwgMjAwMykgLSBBdHVsIE11a2tlciA8QXR1bC5NdWtrZXJAbHNpbC5jb20+CisgKgorICogRGVzY3JpcHRpb246IExpbnV4IGRldmljZSBkcml2ZXIgZm9yIExTSSBMb2dpYyBNZWdhUkFJRCBjb250cm9sbGVyCisgKgorICogU3VwcG9ydGVkIGNvbnRyb2xsZXJzOiBNZWdhUkFJRCA0MTgsIDQyOCwgNDM4LCA0NjYsIDc2MiwgNDY3LCA0NzEsIDQ5MCwgNDkzCisgKgkJCQkJNTE4LCA1MjAsIDUzMSwgNTMyCisgKgorICogVGhpcyBkcml2ZXIgaXMgc3VwcG9ydGVkIGJ5IExTSSBMb2dpYywgd2l0aCBhc3Npc3RhbmNlIGZyb20gUmVkIEhhdCwgRGVsbCwKKyAqIGFuZCBvdGhlcnMuIFBsZWFzZSBzZW5kIHVwZGF0ZXMgdG8gdGhlIG1haWxpbmcgbGlzdAorICogbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcgLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSAibWVnYXJhaWQuaCIKKworI2RlZmluZSBNRUdBUkFJRF9NT0RVTEVfVkVSU0lPTiAiMi4wMC4zIgorCitNT0RVTEVfQVVUSE9SICgiTFNJIExvZ2ljIENvcnBvcmF0aW9uIik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJMU0kgTG9naWMgTWVnYVJBSUQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSAoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oTUVHQVJBSURfTU9EVUxFX1ZFUlNJT04pOworCitzdGF0aWMgdW5zaWduZWQgaW50IG1heF9jbWRfcGVyX2x1biA9IERFRl9DTURfUEVSX0xVTjsKK21vZHVsZV9wYXJhbShtYXhfY21kX3Blcl9sdW4sIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfY21kX3Blcl9sdW4sICJNYXhpbXVtIG51bWJlciBvZiBjb21tYW5kcyB3aGljaCBjYW4gYmUgaXNzdWVkIHRvIGEgc2luZ2xlIExVTiAoZGVmYXVsdD1ERUZfQ01EX1BFUl9MVU49NjMpIik7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbnQgbWF4X3NlY3RvcnNfcGVyX2lvID0gTUFYX1NFQ1RPUlNfUEVSX0lPOworbW9kdWxlX3BhcmFtKG1heF9zZWN0b3JzX3Blcl9pbywgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X3NlY3RvcnNfcGVyX2lvLCAiTWF4aW11bSBudW1iZXIgb2Ygc2VjdG9ycyBwZXIgSS9PIHJlcXVlc3QgKGRlZmF1bHQ9TUFYX1NFQ1RPUlNfUEVSX0lPPTEyOCkiKTsKKworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaW50IG1heF9tYm94X2J1c3lfd2FpdCA9IE1CT1hfQlVTWV9XQUlUOworbW9kdWxlX3BhcmFtKG1heF9tYm94X2J1c3lfd2FpdCwgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X21ib3hfYnVzeV93YWl0LCAiTWF4aW11bSB3YWl0IGZvciBtYWlsYm94IGluIG1pY3Jvc2Vjb25kcyBpZiBidXN5IChkZWZhdWx0PU1CT1hfQlVTWV9XQUlUPTEwKSIpOworCisjZGVmaW5lIFJESU5ET09SKGFkYXB0ZXIpCQlyZWFkbCgoYWRhcHRlciktPmJhc2UgKyAweDIwKQorI2RlZmluZSBSRE9VVERPT1IoYWRhcHRlcikJCXJlYWRsKChhZGFwdGVyKS0+YmFzZSArIDB4MkMpCisjZGVmaW5lIFdSSU5ET09SKGFkYXB0ZXIsdmFsdWUpCQl3cml0ZWwodmFsdWUsIChhZGFwdGVyKS0+YmFzZSArIDB4MjApCisjZGVmaW5lIFdST1VURE9PUihhZGFwdGVyLHZhbHVlKQl3cml0ZWwodmFsdWUsIChhZGFwdGVyKS0+YmFzZSArIDB4MkMpCisKKy8qCisgKiBHbG9iYWwgdmFyaWFibGVzCisgKi8KKworc3RhdGljIGludCBoYmFfY291bnQ7CitzdGF0aWMgYWRhcHRlcl90ICpoYmFfc29mdF9zdGF0ZVtNQVhfQ09OVFJPTExFUlNdOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqbWVnYV9wcm9jX2Rpcl9lbnRyeTsKKworLyogRm9yIGNvbnRyb2xsZXIgcmUtb3JkZXJpbmcgKi8KK3N0YXRpYyBzdHJ1Y3QgbWVnYV9oYmFzIG1lZ2FfaGJhc1tNQVhfQ09OVFJPTExFUlNdOworCisvKgorICogVGhlIEZpbGUgT3BlcmF0aW9ucyBzdHJ1Y3R1cmUgZm9yIHRoZSBzZXJpYWwvaW9jdGwgaW50ZXJmYWNlIG9mIHRoZSBkcml2ZXIKKyAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWVnYWRldl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW9jdGwJCT0gbWVnYWRldl9pb2N0bCwKKwkub3BlbgkJPSBtZWdhZGV2X29wZW4sCit9OworCisvKgorICogQXJyYXkgdG8gc3RydWN0dXJlcyBmb3Igc3RvcmluZyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyb2xsZXJzLiBUaGlzCisgKiBpbmZvcm1hdGlvbiBpcyBzZW50IHRvIHRoZSB1c2VyIGxldmVsIGFwcGxpY2F0aW9ucywgd2hlbiB0aGV5IGRvIGFuIGlvY3RsCisgKiBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIHN0cnVjdCBtY29udHJvbGxlciBtY29udHJvbGxlcltNQVhfQ09OVFJPTExFUlNdOworCisvKiBUaGUgY3VycmVudCBkcml2ZXIgdmVyc2lvbiAqLworc3RhdGljIHUzMiBkcml2ZXJfdmVyID0gMHgwMjAwMDAwMDsKKworLyogbWFqb3IgbnVtYmVyIHVzZWQgYnkgdGhlIGRldmljZSBmb3IgY2hhcmFjdGVyIGludGVyZmFjZSAqLworc3RhdGljIGludCBtYWpvcjsKKworI2RlZmluZSBJU19SQUlEX0NIKGhiYSwgY2gpCSgoKGhiYSktPm1lZ2FfY2hfY2xhc3MgPj4gKGNoKSkgJiAweDAxKQorCisKKy8qCisgKiBEZWJ1ZyB2YXJpYWJsZSB0byBwcmludCBzb21lIGRpYWdub3N0aWMgbWVzc2FnZXMKKyAqLworc3RhdGljIGludCB0cmFjZV9sZXZlbDsKKworLyoqCisgKiBtZWdhX3NldHVwX21haWxib3goKQorICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKgorICogQWxsb2NhdGVzIGEgOCBieXRlIGFsaWduZWQgbWVtb3J5IGZvciB0aGUgaGFuZHNoYWtlIG1haWxib3guCisgKi8KK3N0YXRpYyBpbnQKK21lZ2Ffc2V0dXBfbWFpbGJveChhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgbG9uZwlhbGlnbjsKKworCWFkYXB0ZXItPnVuYV9tYm94NjQgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5kZXYsCisJCQlzaXplb2YobWJveDY0X3QpLCAmYWRhcHRlci0+dW5hX21ib3g2NF9kbWEpOworCisJaWYoICFhZGFwdGVyLT51bmFfbWJveDY0ICkgcmV0dXJuIC0xOworCQkKKwlhZGFwdGVyLT5tYm94ID0gJmFkYXB0ZXItPnVuYV9tYm94NjQtPm1ib3g7CisKKwlhZGFwdGVyLT5tYm94ID0gKG1ib3hfdCAqKSgoKCh1bnNpZ25lZCBsb25nKSBhZGFwdGVyLT5tYm94KSArIDE1KSAmCisJCQkofjBVTCBeIDB4RlVMKSk7CisKKwlhZGFwdGVyLT5tYm94NjQgPSAobWJveDY0X3QgKikoKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXItPm1ib3gpIC0gOCk7CisKKwlhbGlnbiA9ICgodm9pZCAqKWFkYXB0ZXItPm1ib3gpIC0gKCh2b2lkICopJmFkYXB0ZXItPnVuYV9tYm94NjQtPm1ib3gpOworCisJYWRhcHRlci0+bWJveF9kbWEgPSBhZGFwdGVyLT51bmFfbWJveDY0X2RtYSArIDggKyBhbGlnbjsKKworCS8qCisJICogUmVnaXN0ZXIgdGhlIG1haWxib3ggaWYgdGhlIGNvbnRyb2xsZXIgaXMgYW4gaW8tbWFwcGVkIGNvbnRyb2xsZXIKKwkgKi8KKwlpZiggYWRhcHRlci0+ZmxhZyAmIEJPQVJEX0lPTUFQICkgeworCisJCW91dGJfcChhZGFwdGVyLT5tYm94X2RtYSAmIDB4RkYsCisJCQkJYWRhcHRlci0+aG9zdC0+aW9fcG9ydCArIE1CT1hfUE9SVDApOworCisJCW91dGJfcCgoYWRhcHRlci0+bWJveF9kbWEgPj4gOCkgJiAweEZGLAorCQkJCWFkYXB0ZXItPmhvc3QtPmlvX3BvcnQgKyBNQk9YX1BPUlQxKTsKKworCQlvdXRiX3AoKGFkYXB0ZXItPm1ib3hfZG1hID4+IDE2KSAmIDB4RkYsCisJCQkJYWRhcHRlci0+aG9zdC0+aW9fcG9ydCArIE1CT1hfUE9SVDIpOworCisJCW91dGJfcCgoYWRhcHRlci0+bWJveF9kbWEgPj4gMjQpICYgMHhGRiwKKwkJCQlhZGFwdGVyLT5ob3N0LT5pb19wb3J0ICsgTUJPWF9QT1JUMyk7CisKKwkJb3V0Yl9wKEVOQUJMRV9NQk9YX0JZVEUsCisJCQkJYWRhcHRlci0+aG9zdC0+aW9fcG9ydCArIEVOQUJMRV9NQk9YX1JFR0lPTik7CisKKwkJaXJxX2FjayhhZGFwdGVyKTsKKworCQlpcnFfZW5hYmxlKGFkYXB0ZXIpOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBtZWdhX3F1ZXJ5X2FkYXB0ZXIoKQorICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKgorICogSXNzdWUgdGhlIGFkYXB0ZXIgaW5xdWlyeSBjb21tYW5kcyB0byB0aGUgY29udHJvbGxlciBhbmQgZmluZCBvdXQKKyAqIGluZm9ybWF0aW9uIGFuZCBwYXJhbWV0ZXIgYWJvdXQgdGhlIGRldmljZXMgYXR0YWNoZWQKKyAqLworc3RhdGljIGludAorbWVnYV9xdWVyeV9hZGFwdGVyKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlkbWFfYWRkcl90CXByb2RfaW5mb19kbWFfaGFuZGxlOworCW1lZ2FfaW5xdWlyeTMJKmlucXVpcnkzOworCXU4CXJhd19tYm94W3NpemVvZihzdHJ1Y3QgbWJveF9vdXQpXTsKKwltYm94X3QJKm1ib3g7CisJaW50CXJldHZhbDsKKworCS8qIEluaXRpYWxpemUgYWRhcHRlciBpbnF1aXJ5IG1haWxib3ggKi8KKworCW1ib3ggPSAobWJveF90ICopcmF3X21ib3g7CisKKwltZW1zZXQoKHZvaWQgKilhZGFwdGVyLT5tZWdhX2J1ZmZlciwgMCwgTUVHQV9CVUZGRVJfU0laRSk7CisJbWVtc2V0KCZtYm94LT5tX291dCwgMCwgc2l6ZW9mKHJhd19tYm94KSk7CisKKwkvKgorCSAqIFRyeSB0byBpc3N1ZSBJbnF1aXJ5MyBjb21tYW5kCisJICogaWYgbm90IHN1Y2NlZWRlZCwgdGhlbiBpc3N1ZSBNRUdBX01CT1hDTURfQURBUFRFUklOUSBjb21tYW5kIGFuZAorCSAqIHVwZGF0ZSBlbnF1aXJ5MyBzdHJ1Y3R1cmUKKwkgKi8KKwltYm94LT5tX291dC54ZmVyYWRkciA9ICh1MzIpYWRhcHRlci0+YnVmX2RtYV9oYW5kbGU7CisKKwlpbnF1aXJ5MyA9IChtZWdhX2lucXVpcnkzICopYWRhcHRlci0+bWVnYV9idWZmZXI7CisKKwlyYXdfbWJveFswXSA9IEZDX05FV19DT05GSUc7CQkvKiBpLmUuIG1ib3gtPmNtZD0weEExICovCisJcmF3X21ib3hbMl0gPSBOQ19TVUJPUF9FTlFVSVJZMzsJLyogaS5lLiAweDBGICovCisJcmF3X21ib3hbM10gPSBFTlEzX0dFVF9TT0xJQ0lURURfRlVMTDsJLyogaS5lLiAweDAyICovCisKKwkvKiBJc3N1ZSBhIGJsb2NraW5nIGNvbW1hbmQgdG8gdGhlIGNhcmQgKi8KKwlpZiAoKHJldHZhbCA9IGlzc3VlX3NjYl9ibG9jayhhZGFwdGVyLCByYXdfbWJveCkpKSB7CisJCS8qIHRoZSBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgNDBsZCAqLworCisJCW1yYWlkX2V4dF9pbnF1aXJ5CSpleHRfaW5xOworCQltcmFpZF9pbnF1aXJ5CQkqaW5xOworCQlkbWFfYWRkcl90CQlkbWFfaGFuZGxlOworCisJCWV4dF9pbnEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5kZXYsCisJCQkJc2l6ZW9mKG1yYWlkX2V4dF9pbnF1aXJ5KSwgJmRtYV9oYW5kbGUpOworCisJCWlmKCBleHRfaW5xID09IE5VTEwgKSByZXR1cm4gLTE7CisKKwkJaW5xID0gJmV4dF9pbnEtPnJhaWRfaW5xOworCisJCW1ib3gtPm1fb3V0LnhmZXJhZGRyID0gKHUzMilkbWFfaGFuZGxlOworCisJCS8qaXNzdWUgb2xkIDB4MDQgY29tbWFuZCB0byBhZGFwdGVyICovCisJCW1ib3gtPm1fb3V0LmNtZCA9IE1FR0FfTUJPWENNRF9BRFBFWFRJTlE7CisKKwkJaXNzdWVfc2NiX2Jsb2NrKGFkYXB0ZXIsIHJhd19tYm94KTsKKworCQkvKgorCQkgKiB1cGRhdGUgRW5xdWlyeTMgYW5kIFByb2R1Y3RJbmZvIHN0cnVjdHVyZXMgd2l0aAorCQkgKiBtcmFpZF9pbnF1aXJ5IHN0cnVjdHVyZQorCQkgKi8KKwkJbWVnYV84X3RvXzQwbGQoaW5xLCBpbnF1aXJ5MywKKwkJCQkobWVnYV9wcm9kdWN0X2luZm8gKikmYWRhcHRlci0+cHJvZHVjdF9pbmZvKTsKKworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPmRldiwgc2l6ZW9mKG1yYWlkX2V4dF9pbnF1aXJ5KSwKKwkJCQlleHRfaW5xLCBkbWFfaGFuZGxlKTsKKworCX0gZWxzZSB7CQkvKmFkYXB0ZXIgc3VwcG9ydHMgNDBsZCAqLworCQlhZGFwdGVyLT5mbGFnIHw9IEJPQVJEXzQwTEQ7CisKKwkJLyoKKwkJICogZ2V0IHByb2R1Y3RfaW5mbywgd2hpY2ggaXMgc3RhdGljIGluZm9ybWF0aW9uIGFuZCB3aWxsIGJlCisJCSAqIHVuY2hhbmdlZAorCQkgKi8KKwkJcHJvZF9pbmZvX2RtYV9oYW5kbGUgPSBwY2lfbWFwX3NpbmdsZShhZGFwdGVyLT5kZXYsICh2b2lkICopCisJCQkJJmFkYXB0ZXItPnByb2R1Y3RfaW5mbywKKwkJCQlzaXplb2YobWVnYV9wcm9kdWN0X2luZm8pLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCW1ib3gtPm1fb3V0LnhmZXJhZGRyID0gcHJvZF9pbmZvX2RtYV9oYW5kbGU7CisKKwkJcmF3X21ib3hbMF0gPSBGQ19ORVdfQ09ORklHOwkvKiBpLmUuIG1ib3gtPmNtZD0weEExICovCisJCXJhd19tYm94WzJdID0gTkNfU1VCT1BfUFJPRFVDVF9JTkZPOwkvKiBpLmUuIDB4MEUgKi8KKworCQlpZiAoKHJldHZhbCA9IGlzc3VlX3NjYl9ibG9jayhhZGFwdGVyLCByYXdfbWJveCkpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiBQcm9kdWN0X2luZm8gY21kIGZhaWxlZCB3aXRoIGVycm9yOiAlZFxuIiwKKwkJCQlyZXR2YWwpOworCisJCXBjaV91bm1hcF9zaW5nbGUoYWRhcHRlci0+ZGV2LCBwcm9kX2luZm9fZG1hX2hhbmRsZSwKKwkJCQlzaXplb2YobWVnYV9wcm9kdWN0X2luZm8pLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCX0KKworCisJLyoKKwkgKiBrZXJuZWwgc2NhbnMgdGhlIGNoYW5uZWxzIGZyb20gMCB0byA8PSBtYXhfY2hhbm5lbAorCSAqLworCWFkYXB0ZXItPmhvc3QtPm1heF9jaGFubmVsID0KKwkJYWRhcHRlci0+cHJvZHVjdF9pbmZvLm5jaGFubmVscyArIE5WSVJUX0NIQU4gLTE7CisKKwlhZGFwdGVyLT5ob3N0LT5tYXhfaWQgPSAxNjsJLyogbWF4IHRhcmdldHMgcGVyIGNoYW5uZWwgKi8KKworCWFkYXB0ZXItPmhvc3QtPm1heF9sdW4gPSA3OwkvKiBVcHRvIDcgbHVucyBmb3Igbm9uIGRpc2sgZGV2aWNlcyAqLworCisJYWRhcHRlci0+aG9zdC0+Y21kX3Blcl9sdW4gPSBtYXhfY21kX3Blcl9sdW47CisKKwlhZGFwdGVyLT5udW1sZHJ2ID0gaW5xdWlyeTMtPm51bV9sZHJ2OworCisJYWRhcHRlci0+bWF4X2NtZHMgPSBhZGFwdGVyLT5wcm9kdWN0X2luZm8ubWF4X2NvbW1hbmRzOworCisJaWYoYWRhcHRlci0+bWF4X2NtZHMgPiBNQVhfQ09NTUFORFMpCisJCWFkYXB0ZXItPm1heF9jbWRzID0gTUFYX0NPTU1BTkRTOworCisJYWRhcHRlci0+aG9zdC0+Y2FuX3F1ZXVlID0gYWRhcHRlci0+bWF4X2NtZHMgLSAxOworCisJLyoKKwkgKiBHZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNjYXR0ZXItZ2F0aGVyIGVsZW1lbnRzIHN1cHBvcnRlZCBieSB0aGlzCisJICogZmlybXdhcmUKKwkgKi8KKwltZWdhX2dldF9tYXhfc2dsKGFkYXB0ZXIpOworCisJYWRhcHRlci0+aG9zdC0+c2dfdGFibGVzaXplID0gYWRhcHRlci0+c2dsZW47CisKKworCS8qIHVzZSBIUCBmaXJtd2FyZSBhbmQgYmlvcyB2ZXJzaW9uIGVuY29kaW5nICovCisJaWYgKGFkYXB0ZXItPnByb2R1Y3RfaW5mby5zdWJzeXN2aWQgPT0gSFBfU1VCU1lTX1ZJRCkgeworCQlzcHJpbnRmIChhZGFwdGVyLT5md192ZXJzaW9uLCAiJWMlZCVkLiVkJWQiLAorCQkJIGFkYXB0ZXItPnByb2R1Y3RfaW5mby5md192ZXJzaW9uWzJdLAorCQkJIGFkYXB0ZXItPnByb2R1Y3RfaW5mby5md192ZXJzaW9uWzFdID4+IDgsCisJCQkgYWRhcHRlci0+cHJvZHVjdF9pbmZvLmZ3X3ZlcnNpb25bMV0gJiAweDBmLAorCQkJIGFkYXB0ZXItPnByb2R1Y3RfaW5mby5md192ZXJzaW9uWzBdID4+IDgsCisJCQkgYWRhcHRlci0+cHJvZHVjdF9pbmZvLmZ3X3ZlcnNpb25bMF0gJiAweDBmKTsKKwkJc3ByaW50ZiAoYWRhcHRlci0+Ymlvc192ZXJzaW9uLCAiJWMlZCVkLiVkJWQiLAorCQkJIGFkYXB0ZXItPnByb2R1Y3RfaW5mby5iaW9zX3ZlcnNpb25bMl0sCisJCQkgYWRhcHRlci0+cHJvZHVjdF9pbmZvLmJpb3NfdmVyc2lvblsxXSA+PiA4LAorCQkJIGFkYXB0ZXItPnByb2R1Y3RfaW5mby5iaW9zX3ZlcnNpb25bMV0gJiAweDBmLAorCQkJIGFkYXB0ZXItPnByb2R1Y3RfaW5mby5iaW9zX3ZlcnNpb25bMF0gPj4gOCwKKwkJCSBhZGFwdGVyLT5wcm9kdWN0X2luZm8uYmlvc192ZXJzaW9uWzBdICYgMHgwZik7CisJfSBlbHNlIHsKKwkJbWVtY3B5KGFkYXB0ZXItPmZ3X3ZlcnNpb24sCisJCQkJKGNoYXIgKilhZGFwdGVyLT5wcm9kdWN0X2luZm8uZndfdmVyc2lvbiwgNCk7CisJCWFkYXB0ZXItPmZ3X3ZlcnNpb25bNF0gPSAwOworCisJCW1lbWNweShhZGFwdGVyLT5iaW9zX3ZlcnNpb24sCisJCQkJKGNoYXIgKilhZGFwdGVyLT5wcm9kdWN0X2luZm8uYmlvc192ZXJzaW9uLCA0KTsKKworCQlhZGFwdGVyLT5iaW9zX3ZlcnNpb25bNF0gPSAwOworCX0KKworCXByaW50ayhLRVJOX05PVElDRSAibWVnYXJhaWQ6IFslczolc10gZGV0ZWN0ZWQgJWQgbG9naWNhbCBkcml2ZXMuXG4iLAorCQlhZGFwdGVyLT5md192ZXJzaW9uLCBhZGFwdGVyLT5iaW9zX3ZlcnNpb24sIGFkYXB0ZXItPm51bWxkcnYpOworCisJLyoKKwkgKiBEbyB3ZSBzdXBwb3J0IGV4dGVuZGVkICg+MTAgYnl0ZXMpIGNkYnMKKwkgKi8KKwlhZGFwdGVyLT5zdXBwb3J0X2V4dF9jZGIgPSBtZWdhX3N1cHBvcnRfZXh0X2NkYihhZGFwdGVyKTsKKwlpZiAoYWRhcHRlci0+c3VwcG9ydF9leHRfY2RiKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIm1lZ2FyYWlkOiBzdXBwb3J0cyBleHRlbmRlZCBDREJzLlxuIik7CisKKworCXJldHVybiAwOworfQorCisvKioKKyAqIG1lZ2FfcnVucGVuZHEoKQorICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKgorICogUnVucyB0aHJvdWdoIHRoZSBsaXN0IG9mIHBlbmRpbmcgcmVxdWVzdHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbWVnYV9ydW5wZW5kcShhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJaWYoIWxpc3RfZW1wdHkoJmFkYXB0ZXItPnBlbmRpbmdfbGlzdCkpCisJCV9fbWVnYV9ydW5wZW5kcShhZGFwdGVyKTsKK30KKworLyoKKyAqIG1lZ2FyYWlkX3F1ZXVlKCkKKyAqIEBzY21kIC0gSXNzdWUgdGhpcyBzY3NpIGNvbW1hbmQKKyAqIEBkb25lIC0gdGhlIGNhbGxiYWNrIGhvb2sgaW50byB0aGUgc2NzaSBtaWQtbGF5ZXIKKyAqCisgKiBUaGUgY29tbWFuZCBxdWV1aW5nIGVudHJ5IHBvaW50IGZvciB0aGUgbWlkLWxheWVyLgorICovCitzdGF0aWMgaW50CittZWdhcmFpZF9xdWV1ZShTY3NpX0NtbmQgKnNjbWQsIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpCit7CisJYWRhcHRlcl90CSphZGFwdGVyOworCXNjYl90CSpzY2I7CisJaW50CWJ1c3k9MDsKKworCWFkYXB0ZXIgPSAoYWRhcHRlcl90ICopc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCXNjbWQtPnNjc2lfZG9uZSA9IGRvbmU7CisKKworCS8qCisJICogQWxsb2NhdGUgYW5kIGJ1aWxkIGEgU0NCIHJlcXVlc3QKKwkgKiBidXN5IGZsYWcgd2lsbCBiZSBzZXQgaWYgbWVnYV9idWlsZF9jbWQoKSBjb21tYW5kIGNvdWxkIG5vdAorCSAqIGFsbG9jYXRlIHNjYi4gV2Ugd2lsbCByZXR1cm4gbm9uLXplcm8gc3RhdHVzIGluIHRoYXQgY2FzZS4KKwkgKiBOT1RFOiBzY2IgY2FuIGJlIG51bGwgZXZlbiB0aG91Z2ggY2VydGFpbiBjb21tYW5kcyBjb21wbGV0ZWQKKwkgKiBzdWNjZXNzZnVsbHksIGUuZy4sIE1PREVfU0VOU0UgYW5kIFRFU1RfVU5JVF9SRUFEWSwgd2Ugd291bGQKKwkgKiByZXR1cm4gMCBpbiB0aGF0IGNhc2UuCisJICovCisKKwlzY2IgPSBtZWdhX2J1aWxkX2NtZChhZGFwdGVyLCBzY21kLCAmYnVzeSk7CisKKwlpZihzY2IpIHsKKwkJc2NiLT5zdGF0ZSB8PSBTQ0JfUEVORFE7CisJCWxpc3RfYWRkX3RhaWwoJnNjYi0+bGlzdCwgJmFkYXB0ZXItPnBlbmRpbmdfbGlzdCk7CisKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhlIEhCQSBpcyBpbiBxdWllc2NlbnQgc3RhdGUsIGUuZy4sIGR1cmluZyBhCisJCSAqIGRlbGV0ZSBsb2dpY2FsIGRyaXZlIG9wZXJ0aW9uLiBJZiBpdCBpcywgZG9uJ3QgcnVuCisJCSAqIHRoZSBwZW5kaW5nX2xpc3QuCisJCSAqLworCQlpZihhdG9taWNfcmVhZCgmYWRhcHRlci0+cXVpZXNjZW50KSA9PSAwKSB7CisJCQltZWdhX3J1bnBlbmRxKGFkYXB0ZXIpOworCQl9CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBidXN5OworfQorCisvKioKKyAqIG1lZ2FfYWxsb2NhdGVfc2NiKCkKKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICogQGNtZCAtIHNjc2kgY29tbWFuZCBmcm9tIHRoZSBtaWQtbGF5ZXIKKyAqCisgKiBBbGxvY2F0ZSBhIFNDQiBzdHJ1Y3R1cmUuIFRoaXMgaXMgdGhlIGNlbnRyYWwgc3RydWN0dXJlIGZvciBjb250cm9sbGVyCisgKiBjb21tYW5kcy4KKyAqLworc3RhdGljIGlubGluZSBzY2JfdCAqCittZWdhX2FsbG9jYXRlX3NjYihhZGFwdGVyX3QgKmFkYXB0ZXIsIFNjc2lfQ21uZCAqY21kKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmYWRhcHRlci0+ZnJlZV9saXN0OworCXNjYl90CSpzY2I7CisKKwkvKiBVbmxpbmsgY29tbWFuZCBmcm9tIEZyZWUgTGlzdCAqLworCWlmKCAhbGlzdF9lbXB0eShoZWFkKSApIHsKKworCQlzY2IgPSBsaXN0X2VudHJ5KGhlYWQtPm5leHQsIHNjYl90LCBsaXN0KTsKKworCQlsaXN0X2RlbF9pbml0KGhlYWQtPm5leHQpOworCisJCXNjYi0+c3RhdGUgPSBTQ0JfQUNUSVZFOworCQlzY2ItPmNtZCA9IGNtZDsKKwkJc2NiLT5kbWFfdHlwZSA9IE1FR0FfRE1BX1RZUEVfTk9ORTsKKworCQlyZXR1cm4gc2NiOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIG1lZ2FfZ2V0X2xkcnZfbnVtKCkKKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICogQGNtZCAtIHNjc2kgbWlkIGxheWVyIGNvbW1hbmQKKyAqIEBjaGFubmVsIC0gY2hhbm5lbCBvbiB0aGUgY29udHJvbGxlcgorICoKKyAqIENhbGN1bGF0ZSB0aGUgbG9naWNhbCBkcml2ZSBudW1iZXIgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGluIHNjc2kgY29tbWFuZAorICogYW5kIHRoZSBjaGFubmVsIG51bWJlci4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK21lZ2FfZ2V0X2xkcnZfbnVtKGFkYXB0ZXJfdCAqYWRhcHRlciwgU2NzaV9DbW5kICpjbWQsIGludCBjaGFubmVsKQoreworCWludAkJdGd0OworCWludAkJbGRydl9udW07CisKKwl0Z3QgPSBjbWQtPmRldmljZS0+aWQ7CisJCisJaWYgKCB0Z3QgPiBhZGFwdGVyLT50aGlzX2lkICkKKwkJdGd0LS07CS8qIHdlIGRvIG5vdCBnZXQgaW5xdWlyZXMgZm9yIGluaXRpYXRvciBpZCAqLworCisJbGRydl9udW0gPSAoY2hhbm5lbCAqIDE1KSArIHRndDsKKworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGEgbG9naWNhbCBkcml2ZSB3aXRoIGJvb3QgZW5hYmxlZCwgcHJvamVjdCBpdCBmaXJzdAorCSAqLworCWlmKCBhZGFwdGVyLT5ib290X2xkcnZfZW5hYmxlZCApIHsKKwkJaWYoIGxkcnZfbnVtID09IDAgKSB7CisJCQlsZHJ2X251bSA9IGFkYXB0ZXItPmJvb3RfbGRydjsKKwkJfQorCQllbHNlIHsKKwkJCWlmKCBsZHJ2X251bSA8PSBhZGFwdGVyLT5ib290X2xkcnYgKSB7CisJCQkJbGRydl9udW0tLTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogSWYgImRlbGV0ZSBsb2dpY2FsIGRyaXZlIiBmZWF0dXJlIGlzIGVuYWJsZWQgb24gdGhpcyBjb250cm9sbGVyLgorCSAqIERvIG9ubHkgaWYgYXQgbGVhc3Qgb25lIGRlbGV0ZSBsb2dpY2FsIGRyaXZlIG9wZXJhdGlvbiB3YXMgZG9uZS4KKwkgKgorCSAqIEFsc28sIGFmdGVyIGxvZ2ljYWwgZHJpdmUgZGVsZXRpb24sIGluc3RlYWQgb2YgbG9naWNhbCBkcml2ZSBudW1iZXIsCisJICogdGhlIHZhbHVlIHJldHVybmVkIHNob3VsZCBiZSAweDgwK2xvZ2ljYWwgZHJpdmUgaWQuCisJICoKKwkgKiBUaGVzZSBpcyB2YWxpZCBvbmx5IGZvciBJTyBjb21tYW5kcy4KKwkgKi8KKworCWlmIChhZGFwdGVyLT5zdXBwb3J0X3JhbmRvbV9kZWwgJiYgYWRhcHRlci0+cmVhZF9sZGlkbWFwICkKKwkJc3dpdGNoIChjbWQtPmNtbmRbMF0pIHsKKwkJY2FzZSBSRUFEXzY6CS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIFdSSVRFXzY6CS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIFJFQURfMTA6CS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIFdSSVRFXzEwOgorCQkJbGRydl9udW0gKz0gMHg4MDsKKwkJfQorCisJcmV0dXJuIGxkcnZfbnVtOworfQorCisvKioKKyAqIG1lZ2FfYnVpbGRfY21kKCkKKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICogQGNtZCAtIFByZXBhcmUgdXNpbmcgdGhpcyBzY3NpIGNvbW1hbmQKKyAqIEBidXN5IC0gYnVzeSBmbGFnIGlmIG5vIHJlc291cmNlcworICoKKyAqIFByZXBhcmVzIGEgY29tbWFuZCBhbmQgc2NhdHRlciBnYXRoZXIgbGlzdCBmb3IgdGhlIGNvbnRyb2xsZXIuIFRoaXMgcm91dGluZQorICogYWxzbyBmaW5kcyBvdXQgaWYgdGhlIGNvbW1hbmRzIGlzIGludGVuZGVkIGZvciBhIGxvZ2ljYWwgZHJpdmUgb3IgYQorICogcGh5c2ljYWwgZGV2aWNlIGFuZCBwcmVwYXJlcyB0aGUgY29udHJvbGxlciBjb21tYW5kIGFjY29yZGluZ2x5LgorICoKKyAqIFdlIGFsc28gcmUtb3JkZXIgdGhlIGxvZ2ljYWwgZHJpdmVzIGFuZCBwaHlzaWNhbCBkZXZpY2VzIGJhc2VkIG9uIHRoZWlyCisgKiBib290IHNldHRpbmdzLgorICovCitzdGF0aWMgc2NiX3QgKgorbWVnYV9idWlsZF9jbWQoYWRhcHRlcl90ICphZGFwdGVyLCBTY3NpX0NtbmQgKmNtZCwgaW50ICpidXN5KQoreworCW1lZ2FfZXh0X3Bhc3N0aHJ1CSplcHRocnU7CisJbWVnYV9wYXNzdGhydQkqcHRocnU7CisJc2NiX3QJKnNjYjsKKwltYm94X3QJKm1ib3g7CisJbG9uZwlzZWc7CisJY2hhcglpc2xvZ2ljYWw7CisJaW50CW1heF9sZHJ2X251bTsKKwlpbnQJY2hhbm5lbCA9IDA7CisJaW50CXRhcmdldCA9IDA7CisJaW50CWxkcnZfbnVtID0gMDsgICAvKiBsb2dpY2FsIGRyaXZlIG51bWJlciAqLworCisKKwkvKgorCSAqIGZpbHRlciB0aGUgaW50ZXJuYWwgYW5kIGlvY3RsIGNvbW1hbmRzCisJICovCisJaWYoKGNtZC0+Y21uZFswXSA9PSBNRUdBX0lOVEVSTkFMX0NNRCkpIHsKKwkJcmV0dXJuIGNtZC0+YnVmZmVyOworCX0KKworCisJLyoKKwkgKiBXZSBrbm93IHdoYXQgY2hhbm5lbHMgb3VyIGxvZ2ljYWwgZHJpdmVzIGFyZSBvbiAtIG1lZ2FfZmluZF9jYXJkKCkKKwkgKi8KKwlpc2xvZ2ljYWwgPSBhZGFwdGVyLT5sb2dkcnZfY2hhbltjbWQtPmRldmljZS0+Y2hhbm5lbF07CisKKwkvKgorCSAqIFRoZSB0aGVvcnk6IElmIHBoeXNpY2FsIGRyaXZlIGlzIGNob3NlbiBmb3IgYm9vdCwgYWxsIHRoZSBwaHlzaWNhbAorCSAqIGRldmljZXMgYXJlIGV4cG9ydGVkIGJlZm9yZSB0aGUgbG9naWNhbCBkcml2ZXMsIG90aGVyd2lzZSBwaHlzaWNhbAorCSAqIGRldmljZXMgYXJlIHB1c2hlZCBhZnRlciBsb2dpY2FsIGRyaXZlcywgaW4gd2hpY2ggY2FzZSAtIEtlcm5lbCBzZWVzCisJICogdGhlIHBoeXNpY2FsIGRldmljZXMgb24gdmlydHVhbCBjaGFubmVsIHdoaWNoIGlzIG9idmlvdXNseSBjb252ZXJ0ZWQKKwkgKiB0byBhY3R1YWwgY2hhbm5lbCBvbiB0aGUgSEJBLgorCSAqLworCWlmKCBhZGFwdGVyLT5ib290X3BkcnZfZW5hYmxlZCApIHsKKwkJaWYoIGlzbG9naWNhbCApIHsKKwkJCS8qIGxvZ2ljYWwgY2hhbm5lbCAqLworCQkJY2hhbm5lbCA9IGNtZC0+ZGV2aWNlLT5jaGFubmVsIC0KKwkJCQlhZGFwdGVyLT5wcm9kdWN0X2luZm8ubmNoYW5uZWxzOworCQl9CisJCWVsc2UgeworCQkJLyogdGhpcyBpcyBwaHlzaWNhbCBjaGFubmVsICovCisJCQljaGFubmVsID0gY21kLT5kZXZpY2UtPmNoYW5uZWw7IAorCQkJdGFyZ2V0ID0gY21kLT5kZXZpY2UtPmlkOworCisJCQkvKgorCQkJICogYm9vdCBmcm9tIGEgcGh5c2ljYWwgZGlzaywgdGhhdCBkaXNrIG5lZWRzIHRvIGJlCisJCQkgKiBleHBvc2VkIGZpcnN0IElGIGJvdGggdGhlIGNoYW5uZWxzIGFyZSBTQ1NJLCB0aGVuCisJCQkgKiBib290aW5nIGZyb20gdGhlIHNlY29uZCBjaGFubmVsIGlzIG5vdCBhbGxvd2VkLgorCQkJICovCisJCQlpZiggdGFyZ2V0ID09IDAgKSB7CisJCQkJdGFyZ2V0ID0gYWRhcHRlci0+Ym9vdF9wZHJ2X3RndDsKKwkJCX0KKwkJCWVsc2UgaWYoIHRhcmdldCA9PSBhZGFwdGVyLT5ib290X3BkcnZfdGd0ICkgeworCQkJCXRhcmdldCA9IDA7CisJCQl9CisJCX0KKwl9CisJZWxzZSB7CisJCWlmKCBpc2xvZ2ljYWwgKSB7CisJCQkvKiB0aGlzIGlzIHRoZSBsb2dpY2FsIGNoYW5uZWwgKi8KKwkJCWNoYW5uZWwgPSBjbWQtPmRldmljZS0+Y2hhbm5lbDsJCisJCX0KKwkJZWxzZSB7CisJCQkvKiBwaHlzaWNhbCBjaGFubmVsICovCisJCQljaGFubmVsID0gY21kLT5kZXZpY2UtPmNoYW5uZWwgLSBOVklSVF9DSEFOOwkKKwkJCXRhcmdldCA9IGNtZC0+ZGV2aWNlLT5pZDsKKwkJfQorCX0KKworCisJaWYoaXNsb2dpY2FsKSB7CisKKwkJLyogaGF2ZSBqdXN0IExVTiAwIGZvciBlYWNoIHRhcmdldCBvbiB2aXJ0dWFsIGNoYW5uZWxzICovCisJCWlmIChjbWQtPmRldmljZS0+bHVuKSB7CisJCQljbWQtPnJlc3VsdCA9IChESURfQkFEX1RBUkdFVCA8PCAxNik7CisJCQljbWQtPnNjc2lfZG9uZShjbWQpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlsZHJ2X251bSA9IG1lZ2FfZ2V0X2xkcnZfbnVtKGFkYXB0ZXIsIGNtZCwgY2hhbm5lbCk7CisKKworCQltYXhfbGRydl9udW0gPSAoYWRhcHRlci0+ZmxhZyAmIEJPQVJEXzQwTEQpID8KKwkJCU1BWF9MT0dJQ0FMX0RSSVZFU180MExEIDogTUFYX0xPR0lDQUxfRFJJVkVTXzhMRDsKKworCQkvKgorCQkgKiBtYXhfbGRydl9udW0gaW5jcmVhc2VzIGJ5IDB4ODAgaWYgc29tZSBsb2dpY2FsIGRyaXZlIHdhcworCQkgKiBkZWxldGVkLgorCQkgKi8KKwkJaWYoYWRhcHRlci0+cmVhZF9sZGlkbWFwKQorCQkJbWF4X2xkcnZfbnVtICs9IDB4ODA7CisKKwkJaWYobGRydl9udW0gPiBtYXhfbGRydl9udW0gKSB7CisJCQljbWQtPnJlc3VsdCA9IChESURfQkFEX1RBUkdFVCA8PCAxNik7CisJCQljbWQtPnNjc2lfZG9uZShjbWQpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCX0KKwllbHNlIHsKKwkJaWYoIGNtZC0+ZGV2aWNlLT5sdW4gPiA3KSB7CisJCQkvKgorCQkJICogRG8gbm90IHN1cHBvcnQgbHVuID43IGZvciBwaHlzaWNhbGx5IGFjY2Vzc2VkCisJCQkgKiBkZXZpY2VzCisJCQkgKi8KKwkJCWNtZC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwkJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCS8qCisJICoKKwkgKiBMb2dpY2FsIGRyaXZlIGNvbW1hbmRzCisJICoKKwkgKi8KKwlpZihpc2xvZ2ljYWwpIHsKKwkJc3dpdGNoIChjbWQtPmNtbmRbMF0pIHsKKwkJY2FzZSBURVNUX1VOSVRfUkVBRFk6CisJCQltZW1zZXQoY21kLT5yZXF1ZXN0X2J1ZmZlciwgMCwgY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCisjaWYgTUVHQV9IQVZFX0NMVVNURVJJTkcKKwkJCS8qCisJCQkgKiBEbyB3ZSBzdXBwb3J0IGNsdXN0ZXJpbmcgYW5kIGlzIHRoZSBzdXBwb3J0IGVuYWJsZWQKKwkJCSAqIElmIG5vLCByZXR1cm4gc3VjY2VzcyBhbHdheXMKKwkJCSAqLworCQkJaWYoICFhZGFwdGVyLT5oYXNfY2x1c3RlciApIHsKKwkJCQljbWQtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpOworCQkJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCWlmKCEoc2NiID0gbWVnYV9hbGxvY2F0ZV9zY2IoYWRhcHRlciwgY21kKSkpIHsKKwkJCQkqYnVzeSA9IDE7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCXNjYi0+cmF3X21ib3hbMF0gPSBNRUdBX0NMVVNURVJfQ01EOworCQkJc2NiLT5yYXdfbWJveFsyXSA9IE1FR0FfUkVTRVJWQVRJT05fU1RBVFVTOworCQkJc2NiLT5yYXdfbWJveFszXSA9IGxkcnZfbnVtOworCisJCQlzY2ItPmRtYV9kaXJlY3Rpb24gPSBQQ0lfRE1BX05PTkU7CisKKwkJCXJldHVybiBzY2I7CisjZWxzZQorCQkJY21kLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KTsKKwkJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCQlyZXR1cm4gTlVMTDsKKyNlbmRpZgorCisJCWNhc2UgTU9ERV9TRU5TRToKKwkJCW1lbXNldChjbWQtPnJlcXVlc3RfYnVmZmVyLCAwLCBjbWQtPmNtbmRbNF0pOworCQkJY21kLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KTsKKwkJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCQlyZXR1cm4gTlVMTDsKKworCQljYXNlIFJFQURfQ0FQQUNJVFk6CisJCWNhc2UgSU5RVUlSWToKKworCQkJaWYoIShhZGFwdGVyLT5mbGFnICYgKDFMIDw8IGNtZC0+ZGV2aWNlLT5jaGFubmVsKSkpIHsKKworCQkJCXByaW50ayhLRVJOX05PVElDRQorCQkJCQkic2NzaSVkOiBzY2FubmluZyBzY3NpIGNoYW5uZWwgJWQgIiwKKwkJCQkJCWFkYXB0ZXItPmhvc3QtPmhvc3Rfbm8sCisJCQkJCQljbWQtPmRldmljZS0+Y2hhbm5lbCk7CisJCQkJcHJpbnRrKCJmb3IgbG9naWNhbCBkcml2ZXMuXG4iKTsKKworCQkJCWFkYXB0ZXItPmZsYWcgfD0gKDFMIDw8IGNtZC0+ZGV2aWNlLT5jaGFubmVsKTsKKwkJCX0KKworCQkJLyogQWxsb2NhdGUgYSBTQ0IgYW5kIGluaXRpYWxpemUgcGFzc3RocnUgKi8KKwkJCWlmKCEoc2NiID0gbWVnYV9hbGxvY2F0ZV9zY2IoYWRhcHRlciwgY21kKSkpIHsKKwkJCQkqYnVzeSA9IDE7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlwdGhydSA9IHNjYi0+cHRocnU7CisKKwkJCW1ib3ggPSAobWJveF90ICopc2NiLT5yYXdfbWJveDsKKwkJCW1lbXNldChtYm94LCAwLCBzaXplb2Yoc2NiLT5yYXdfbWJveCkpOworCQkJbWVtc2V0KHB0aHJ1LCAwLCBzaXplb2YobWVnYV9wYXNzdGhydSkpOworCisJCQlwdGhydS0+dGltZW91dCA9IDA7CisJCQlwdGhydS0+YXJzID0gMTsKKwkJCXB0aHJ1LT5yZXFzZW5zZWxlbiA9IDE0OworCQkJcHRocnUtPmlzbG9naWNhbCA9IDE7CisJCQlwdGhydS0+bG9nZHJ2ID0gbGRydl9udW07CisJCQlwdGhydS0+Y2RibGVuID0gY21kLT5jbWRfbGVuOworCQkJbWVtY3B5KHB0aHJ1LT5jZGIsIGNtZC0+Y21uZCwgY21kLT5jbWRfbGVuKTsKKworCQkJaWYoIGFkYXB0ZXItPmhhc182NGJpdF9hZGRyICkgeworCQkJCW1ib3gtPm1fb3V0LmNtZCA9IE1FR0FfTUJPWENNRF9QQVNTVEhSVTY0OworCQkJfQorCQkJZWxzZSB7CisJCQkJbWJveC0+bV9vdXQuY21kID0gTUVHQV9NQk9YQ01EX1BBU1NUSFJVOworCQkJfQorCisJCQlzY2ItPmRtYV9kaXJlY3Rpb24gPSBQQ0lfRE1BX0ZST01ERVZJQ0U7CisKKwkJCXB0aHJ1LT5udW1zZ2VsZW1lbnRzID0gbWVnYV9idWlsZF9zZ2xpc3QoYWRhcHRlciwgc2NiLAorCQkJCSZwdGhydS0+ZGF0YXhmZXJhZGRyLCAmcHRocnUtPmRhdGF4ZmVybGVuKTsKKworCQkJbWJveC0+bV9vdXQueGZlcmFkZHIgPSBzY2ItPnB0aHJ1X2RtYV9hZGRyOworCisJCQlyZXR1cm4gc2NiOworCisJCWNhc2UgUkVBRF82OgorCQljYXNlIFdSSVRFXzY6CisJCWNhc2UgUkVBRF8xMDoKKwkJY2FzZSBXUklURV8xMDoKKwkJY2FzZSBSRUFEXzEyOgorCQljYXNlIFdSSVRFXzEyOgorCisJCQkvKiBBbGxvY2F0ZSBhIFNDQiBhbmQgaW5pdGlhbGl6ZSBtYWlsYm94ICovCisJCQlpZighKHNjYiA9IG1lZ2FfYWxsb2NhdGVfc2NiKGFkYXB0ZXIsIGNtZCkpKSB7CisJCQkJKmJ1c3kgPSAxOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJbWJveCA9IChtYm94X3QgKilzY2ItPnJhd19tYm94OworCisJCQltZW1zZXQobWJveCwgMCwgc2l6ZW9mKHNjYi0+cmF3X21ib3gpKTsKKwkJCW1ib3gtPm1fb3V0LmxvZ2RydiA9IGxkcnZfbnVtOworCisJCQkvKgorCQkJICogQSBsaXR0bGUgaGFjazogMm5kIGJpdCBpcyB6ZXJvIGZvciBhbGwgc2NzaSByZWFkCisJCQkgKiBjb21tYW5kcyBhbmQgaXMgc2V0IGZvciBhbGwgc2NzaSB3cml0ZSBjb21tYW5kcworCQkJICovCisJCQlpZiggYWRhcHRlci0+aGFzXzY0Yml0X2FkZHIgKSB7CisJCQkJbWJveC0+bV9vdXQuY21kID0gKCpjbWQtPmNtbmQgJiAweDAyKSA/CisJCQkJCU1FR0FfTUJPWENNRF9MV1JJVEU2NDoKKwkJCQkJTUVHQV9NQk9YQ01EX0xSRUFENjQgOworCQkJfQorCQkJZWxzZSB7CisJCQkJbWJveC0+bV9vdXQuY21kID0gKCpjbWQtPmNtbmQgJiAweDAyKSA/CisJCQkJCU1FR0FfTUJPWENNRF9MV1JJVEU6CisJCQkJCU1FR0FfTUJPWENNRF9MUkVBRCA7CisJCQl9CisKKwkJCS8qCisJCQkgKiA2LWJ5dGUgUkVBRCgweDA4KSBvciBXUklURSgweDBBKSBjZGIKKwkJCSAqLworCQkJaWYoIGNtZC0+Y21kX2xlbiA9PSA2ICkgeworCQkJCW1ib3gtPm1fb3V0Lm51bXNlY3RvcnMgPSAodTMyKSBjbWQtPmNtbmRbNF07CisJCQkJbWJveC0+bV9vdXQubGJhID0KKwkJCQkJKCh1MzIpY21kLT5jbW5kWzFdIDw8IDE2KSB8CisJCQkJCSgodTMyKWNtZC0+Y21uZFsyXSA8PCA4KSB8CisJCQkJCSh1MzIpY21kLT5jbW5kWzNdOworCisJCQkJbWJveC0+bV9vdXQubGJhICY9IDB4MUZGRkZGOworCisjaWYgTUVHQV9IQVZFX1NUQVRTCisJCQkJLyoKKwkJCQkgKiBUYWtlIG1vZHVsbyAweDgwLCBzaW5jZSB0aGUgbG9naWNhbCBkcml2ZQorCQkJCSAqIG51bWJlciBpbmNyZWFzZXMgYnkgMHg4MCB3aGVuIGEgbG9naWNhbAorCQkJCSAqIGRyaXZlIHdhcyBkZWxldGVkCisJCQkJICovCisJCQkJaWYgKCpjbWQtPmNtbmQgPT0gUkVBRF82KSB7CisJCQkJCWFkYXB0ZXItPm5yZWFkc1tsZHJ2X251bSUweDgwXSsrOworCQkJCQlhZGFwdGVyLT5ucmVhZGJsb2Nrc1tsZHJ2X251bSUweDgwXSArPQorCQkJCQkJbWJveC0+bV9vdXQubnVtc2VjdG9yczsKKwkJCQl9IGVsc2UgeworCQkJCQlhZGFwdGVyLT5ud3JpdGVzW2xkcnZfbnVtJTB4ODBdKys7CisJCQkJCWFkYXB0ZXItPm53cml0ZWJsb2Nrc1tsZHJ2X251bSUweDgwXSArPQorCQkJCQkJbWJveC0+bV9vdXQubnVtc2VjdG9yczsKKwkJCQl9CisjZW5kaWYKKwkJCX0KKworCQkJLyoKKwkJCSAqIDEwLWJ5dGUgUkVBRCgweDI4KSBvciBXUklURSgweDJBKSBjZGIKKwkJCSAqLworCQkJaWYoIGNtZC0+Y21kX2xlbiA9PSAxMCApIHsKKwkJCQltYm94LT5tX291dC5udW1zZWN0b3JzID0KKwkJCQkJKHUzMiljbWQtPmNtbmRbOF0gfAorCQkJCQkoKHUzMiljbWQtPmNtbmRbN10gPDwgOCk7CisJCQkJbWJveC0+bV9vdXQubGJhID0KKwkJCQkJKCh1MzIpY21kLT5jbW5kWzJdIDw8IDI0KSB8CisJCQkJCSgodTMyKWNtZC0+Y21uZFszXSA8PCAxNikgfAorCQkJCQkoKHUzMiljbWQtPmNtbmRbNF0gPDwgOCkgfAorCQkJCQkodTMyKWNtZC0+Y21uZFs1XTsKKworI2lmIE1FR0FfSEFWRV9TVEFUUworCQkJCWlmICgqY21kLT5jbW5kID09IFJFQURfMTApIHsKKwkJCQkJYWRhcHRlci0+bnJlYWRzW2xkcnZfbnVtJTB4ODBdKys7CisJCQkJCWFkYXB0ZXItPm5yZWFkYmxvY2tzW2xkcnZfbnVtJTB4ODBdICs9CisJCQkJCQltYm94LT5tX291dC5udW1zZWN0b3JzOworCQkJCX0gZWxzZSB7CisJCQkJCWFkYXB0ZXItPm53cml0ZXNbbGRydl9udW0lMHg4MF0rKzsKKwkJCQkJYWRhcHRlci0+bndyaXRlYmxvY2tzW2xkcnZfbnVtJTB4ODBdICs9CisJCQkJCQltYm94LT5tX291dC5udW1zZWN0b3JzOworCQkJCX0KKyNlbmRpZgorCQkJfQorCisJCQkvKgorCQkJICogMTItYnl0ZSBSRUFEKDB4QTgpIG9yIFdSSVRFKDB4QUEpIGNkYgorCQkJICovCisJCQlpZiggY21kLT5jbWRfbGVuID09IDEyICkgeworCQkJCW1ib3gtPm1fb3V0LmxiYSA9CisJCQkJCSgodTMyKWNtZC0+Y21uZFsyXSA8PCAyNCkgfAorCQkJCQkoKHUzMiljbWQtPmNtbmRbM10gPDwgMTYpIHwKKwkJCQkJKCh1MzIpY21kLT5jbW5kWzRdIDw8IDgpIHwKKwkJCQkJKHUzMiljbWQtPmNtbmRbNV07CisKKwkJCQltYm94LT5tX291dC5udW1zZWN0b3JzID0KKwkJCQkJKCh1MzIpY21kLT5jbW5kWzZdIDw8IDI0KSB8CisJCQkJCSgodTMyKWNtZC0+Y21uZFs3XSA8PCAxNikgfAorCQkJCQkoKHUzMiljbWQtPmNtbmRbOF0gPDwgOCkgfAorCQkJCQkodTMyKWNtZC0+Y21uZFs5XTsKKworI2lmIE1FR0FfSEFWRV9TVEFUUworCQkJCWlmICgqY21kLT5jbW5kID09IFJFQURfMTIpIHsKKwkJCQkJYWRhcHRlci0+bnJlYWRzW2xkcnZfbnVtJTB4ODBdKys7CisJCQkJCWFkYXB0ZXItPm5yZWFkYmxvY2tzW2xkcnZfbnVtJTB4ODBdICs9CisJCQkJCQltYm94LT5tX291dC5udW1zZWN0b3JzOworCQkJCX0gZWxzZSB7CisJCQkJCWFkYXB0ZXItPm53cml0ZXNbbGRydl9udW0lMHg4MF0rKzsKKwkJCQkJYWRhcHRlci0+bndyaXRlYmxvY2tzW2xkcnZfbnVtJTB4ODBdICs9CisJCQkJCQltYm94LT5tX291dC5udW1zZWN0b3JzOworCQkJCX0KKyNlbmRpZgorCQkJfQorCisJCQkvKgorCQkJICogSWYgaXQgaXMgYSByZWFkIGNvbW1hbmQKKwkJCSAqLworCQkJaWYoICgqY21kLT5jbW5kICYgMHgwRikgPT0gMHgwOCApIHsKKwkJCQlzY2ItPmRtYV9kaXJlY3Rpb24gPSBQQ0lfRE1BX0ZST01ERVZJQ0U7CisJCQl9CisJCQllbHNlIHsKKwkJCQlzY2ItPmRtYV9kaXJlY3Rpb24gPSBQQ0lfRE1BX1RPREVWSUNFOworCQkJfQorCisJCQkvKiBDYWxjdWxhdGUgU2NhdHRlci1HYXRoZXIgaW5mbyAqLworCQkJbWJveC0+bV9vdXQubnVtc2dlbGVtZW50cyA9IG1lZ2FfYnVpbGRfc2dsaXN0KGFkYXB0ZXIsIHNjYiwKKwkJCQkJKHUzMiAqKSZtYm94LT5tX291dC54ZmVyYWRkciwgKHUzMiAqKSZzZWcpOworCisJCQlyZXR1cm4gc2NiOworCisjaWYgTUVHQV9IQVZFX0NMVVNURVJJTkcKKwkJY2FzZSBSRVNFUlZFOgkvKiBGYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBSRUxFQVNFOgorCisJCQkvKgorCQkJICogRG8gd2Ugc3VwcG9ydCBjbHVzdGVyaW5nIGFuZCBpcyB0aGUgc3VwcG9ydCBlbmFibGVkCisJCQkgKi8KKwkJCWlmKCAhIGFkYXB0ZXItPmhhc19jbHVzdGVyICkgeworCisJCQkJY21kLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOworCQkJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCS8qIEFsbG9jYXRlIGEgU0NCIGFuZCBpbml0aWFsaXplIG1haWxib3ggKi8KKwkJCWlmKCEoc2NiID0gbWVnYV9hbGxvY2F0ZV9zY2IoYWRhcHRlciwgY21kKSkpIHsKKwkJCQkqYnVzeSA9IDE7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCXNjYi0+cmF3X21ib3hbMF0gPSBNRUdBX0NMVVNURVJfQ01EOworCQkJc2NiLT5yYXdfbWJveFsyXSA9ICggKmNtZC0+Y21uZCA9PSBSRVNFUlZFICkgPworCQkJCU1FR0FfUkVTRVJWRV9MRCA6IE1FR0FfUkVMRUFTRV9MRDsKKworCQkJc2NiLT5yYXdfbWJveFszXSA9IGxkcnZfbnVtOworCisJCQlzY2ItPmRtYV9kaXJlY3Rpb24gPSBQQ0lfRE1BX05PTkU7CisKKwkJCXJldHVybiBzY2I7CisjZW5kaWYKKworCQlkZWZhdWx0OgorCQkJY21kLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOworCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJLyoKKwkgKiBQYXNzdGhydSBkcml2ZSBjb21tYW5kcworCSAqLworCWVsc2UgeworCQkvKiBBbGxvY2F0ZSBhIFNDQiBhbmQgaW5pdGlhbGl6ZSBwYXNzdGhydSAqLworCQlpZighKHNjYiA9IG1lZ2FfYWxsb2NhdGVfc2NiKGFkYXB0ZXIsIGNtZCkpKSB7CisJCQkqYnVzeSA9IDE7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1ib3ggPSAobWJveF90ICopc2NiLT5yYXdfbWJveDsKKwkJbWVtc2V0KG1ib3gsIDAsIHNpemVvZihzY2ItPnJhd19tYm94KSk7CisKKwkJaWYoIGFkYXB0ZXItPnN1cHBvcnRfZXh0X2NkYiApIHsKKworCQkJZXB0aHJ1ID0gbWVnYV9wcmVwYXJlX2V4dHBhc3N0aHJ1KGFkYXB0ZXIsIHNjYiwgY21kLAorCQkJCQljaGFubmVsLCB0YXJnZXQpOworCisJCQltYm94LT5tX291dC5jbWQgPSBNRUdBX01CT1hDTURfRVhUUFRIUlU7CisKKwkJCW1ib3gtPm1fb3V0LnhmZXJhZGRyID0gc2NiLT5lcHRocnVfZG1hX2FkZHI7CisKKwkJfQorCQllbHNlIHsKKworCQkJcHRocnUgPSBtZWdhX3ByZXBhcmVfcGFzc3RocnUoYWRhcHRlciwgc2NiLCBjbWQsCisJCQkJCWNoYW5uZWwsIHRhcmdldCk7CisKKwkJCS8qIEluaXRpYWxpemUgbWFpbGJveCAqLworCQkJaWYoIGFkYXB0ZXItPmhhc182NGJpdF9hZGRyICkgeworCQkJCW1ib3gtPm1fb3V0LmNtZCA9IE1FR0FfTUJPWENNRF9QQVNTVEhSVTY0OworCQkJfQorCQkJZWxzZSB7CisJCQkJbWJveC0+bV9vdXQuY21kID0gTUVHQV9NQk9YQ01EX1BBU1NUSFJVOworCQkJfQorCisJCQltYm94LT5tX291dC54ZmVyYWRkciA9IHNjYi0+cHRocnVfZG1hX2FkZHI7CisKKwkJfQorCQlyZXR1cm4gc2NiOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworCisvKioKKyAqIG1lZ2FfcHJlcGFyZV9wYXNzdGhydSgpCisgKiBAYWRhcHRlciAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqIEBzY2IgLSBvdXIgc2NzaSBjb250cm9sIGJsb2NrCisgKiBAY21kIC0gc2NzaSBjb21tYW5kIGZyb20gdGhlIG1pZC1sYXllcgorICogQGNoYW5uZWwgLSBhY3R1YWwgY2hhbm5lbCBvbiB0aGUgY29udHJvbGxlcgorICogQHRhcmdldCAtIGFjdHVhbCBpZCBvbiB0aGUgY29udHJvbGxlci4KKyAqCisgKiBwcmVwYXJlIGEgY29tbWFuZCBmb3IgdGhlIHNjc2kgcGh5c2ljYWwgZGV2aWNlcy4KKyAqLworc3RhdGljIG1lZ2FfcGFzc3RocnUgKgorbWVnYV9wcmVwYXJlX3Bhc3N0aHJ1KGFkYXB0ZXJfdCAqYWRhcHRlciwgc2NiX3QgKnNjYiwgU2NzaV9DbW5kICpjbWQsCisJCWludCBjaGFubmVsLCBpbnQgdGFyZ2V0KQoreworCW1lZ2FfcGFzc3RocnUgKnB0aHJ1OworCisJcHRocnUgPSBzY2ItPnB0aHJ1OworCW1lbXNldChwdGhydSwgMCwgc2l6ZW9mIChtZWdhX3Bhc3N0aHJ1KSk7CisKKwkvKiAwPTZzZWMvMT02MHNlYy8yPTEwbWluLzM9M2hycyAqLworCXB0aHJ1LT50aW1lb3V0ID0gMjsKKworCXB0aHJ1LT5hcnMgPSAxOworCXB0aHJ1LT5yZXFzZW5zZWxlbiA9IDE0OworCXB0aHJ1LT5pc2xvZ2ljYWwgPSAwOworCisJcHRocnUtPmNoYW5uZWwgPSAoYWRhcHRlci0+ZmxhZyAmIEJPQVJEXzQwTEQpID8gMCA6IGNoYW5uZWw7CisKKwlwdGhydS0+dGFyZ2V0ID0gKGFkYXB0ZXItPmZsYWcgJiBCT0FSRF80MExEKSA/CisJCShjaGFubmVsIDw8IDQpIHwgdGFyZ2V0IDogdGFyZ2V0OworCisJcHRocnUtPmNkYmxlbiA9IGNtZC0+Y21kX2xlbjsKKwlwdGhydS0+bG9nZHJ2ID0gY21kLT5kZXZpY2UtPmx1bjsKKworCW1lbWNweShwdGhydS0+Y2RiLCBjbWQtPmNtbmQsIGNtZC0+Y21kX2xlbik7CisKKwkvKiBOb3Qgc3VyZSBhYm91dCB0aGUgZGlyZWN0aW9uICovCisJc2NiLT5kbWFfZGlyZWN0aW9uID0gUENJX0RNQV9CSURJUkVDVElPTkFMOworCisJLyogU3BlY2lhbCBDb2RlIGZvciBIYW5kbGluZyBSRUFEX0NBUEEvIElOUSB1c2luZyBib3VuY2UgYnVmZmVycyAqLworCXN3aXRjaCAoY21kLT5jbW5kWzBdKSB7CisJY2FzZSBJTlFVSVJZOgorCWNhc2UgUkVBRF9DQVBBQ0lUWToKKwkJaWYoIShhZGFwdGVyLT5mbGFnICYgKDFMIDw8IGNtZC0+ZGV2aWNlLT5jaGFubmVsKSkpIHsKKworCQkJcHJpbnRrKEtFUk5fTk9USUNFCisJCQkJInNjc2klZDogc2Nhbm5pbmcgc2NzaSBjaGFubmVsICVkIFtQJWRdICIsCisJCQkJCWFkYXB0ZXItPmhvc3QtPmhvc3Rfbm8sCisJCQkJCWNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjaGFubmVsKTsKKwkJCXByaW50aygiZm9yIHBoeXNpY2FsIGRldmljZXMuXG4iKTsKKworCQkJYWRhcHRlci0+ZmxhZyB8PSAoMUwgPDwgY21kLT5kZXZpY2UtPmNoYW5uZWwpOworCQl9CisJCS8qIEZhbGwgdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJCXB0aHJ1LT5udW1zZ2VsZW1lbnRzID0gbWVnYV9idWlsZF9zZ2xpc3QoYWRhcHRlciwgc2NiLAorCQkJCSZwdGhydS0+ZGF0YXhmZXJhZGRyLCAmcHRocnUtPmRhdGF4ZmVybGVuKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBwdGhydTsKK30KKworCisvKioKKyAqIG1lZ2FfcHJlcGFyZV9leHRwYXNzdGhydSgpCisgKiBAYWRhcHRlciAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqIEBzY2IgLSBvdXIgc2NzaSBjb250cm9sIGJsb2NrCisgKiBAY21kIC0gc2NzaSBjb21tYW5kIGZyb20gdGhlIG1pZC1sYXllcgorICogQGNoYW5uZWwgLSBhY3R1YWwgY2hhbm5lbCBvbiB0aGUgY29udHJvbGxlcgorICogQHRhcmdldCAtIGFjdHVhbCBpZCBvbiB0aGUgY29udHJvbGxlci4KKyAqCisgKiBwcmVwYXJlIGEgY29tbWFuZCBmb3IgdGhlIHNjc2kgcGh5c2ljYWwgZGV2aWNlcy4gVGhpcyByb3VudGluZSBwcmVwYXJlcworICogY29tbWFuZHMgZm9yIGRldmljZXMgd2hpY2ggY2FuIHRha2UgZXh0ZW5kZWQgQ0RCcyAoPjEwIGJ5dGVzKQorICovCitzdGF0aWMgbWVnYV9leHRfcGFzc3RocnUgKgorbWVnYV9wcmVwYXJlX2V4dHBhc3N0aHJ1KGFkYXB0ZXJfdCAqYWRhcHRlciwgc2NiX3QgKnNjYiwgU2NzaV9DbW5kICpjbWQsCisJCWludCBjaGFubmVsLCBpbnQgdGFyZ2V0KQoreworCW1lZ2FfZXh0X3Bhc3N0aHJ1CSplcHRocnU7CisKKwllcHRocnUgPSBzY2ItPmVwdGhydTsKKwltZW1zZXQoZXB0aHJ1LCAwLCBzaXplb2YobWVnYV9leHRfcGFzc3RocnUpKTsKKworCS8qIDA9NnNlYy8xPTYwc2VjLzI9MTBtaW4vMz0zaHJzICovCisJZXB0aHJ1LT50aW1lb3V0ID0gMjsKKworCWVwdGhydS0+YXJzID0gMTsKKwllcHRocnUtPnJlcXNlbnNlbGVuID0gMTQ7CisJZXB0aHJ1LT5pc2xvZ2ljYWwgPSAwOworCisJZXB0aHJ1LT5jaGFubmVsID0gKGFkYXB0ZXItPmZsYWcgJiBCT0FSRF80MExEKSA/IDAgOiBjaGFubmVsOworCWVwdGhydS0+dGFyZ2V0ID0gKGFkYXB0ZXItPmZsYWcgJiBCT0FSRF80MExEKSA/CisJCShjaGFubmVsIDw8IDQpIHwgdGFyZ2V0IDogdGFyZ2V0OworCisJZXB0aHJ1LT5jZGJsZW4gPSBjbWQtPmNtZF9sZW47CisJZXB0aHJ1LT5sb2dkcnYgPSBjbWQtPmRldmljZS0+bHVuOworCisJbWVtY3B5KGVwdGhydS0+Y2RiLCBjbWQtPmNtbmQsIGNtZC0+Y21kX2xlbik7CisKKwkvKiBOb3Qgc3VyZSBhYm91dCB0aGUgZGlyZWN0aW9uICovCisJc2NiLT5kbWFfZGlyZWN0aW9uID0gUENJX0RNQV9CSURJUkVDVElPTkFMOworCisJc3dpdGNoKGNtZC0+Y21uZFswXSkgeworCWNhc2UgSU5RVUlSWToKKwljYXNlIFJFQURfQ0FQQUNJVFk6CisJCWlmKCEoYWRhcHRlci0+ZmxhZyAmICgxTCA8PCBjbWQtPmRldmljZS0+Y2hhbm5lbCkpKSB7CisKKwkJCXByaW50ayhLRVJOX05PVElDRQorCQkJCSJzY3NpJWQ6IHNjYW5uaW5nIHNjc2kgY2hhbm5lbCAlZCBbUCVkXSAiLAorCQkJCQlhZGFwdGVyLT5ob3N0LT5ob3N0X25vLAorCQkJCQljbWQtPmRldmljZS0+Y2hhbm5lbCwgY2hhbm5lbCk7CisJCQlwcmludGsoImZvciBwaHlzaWNhbCBkZXZpY2VzLlxuIik7CisKKwkJCWFkYXB0ZXItPmZsYWcgfD0gKDFMIDw8IGNtZC0+ZGV2aWNlLT5jaGFubmVsKTsKKwkJfQorCQkvKiBGYWxsIHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQllcHRocnUtPm51bXNnZWxlbWVudHMgPSBtZWdhX2J1aWxkX3NnbGlzdChhZGFwdGVyLCBzY2IsCisJCQkJJmVwdGhydS0+ZGF0YXhmZXJhZGRyLCAmZXB0aHJ1LT5kYXRheGZlcmxlbik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcHRocnU7Cit9CisKK3N0YXRpYyB2b2lkCitfX21lZ2FfcnVucGVuZHEoYWRhcHRlcl90ICphZGFwdGVyKQoreworCXNjYl90ICpzY2I7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqbmV4dDsKKworCS8qIElzc3VlIGFueSBwZW5kaW5nIGNvbW1hbmRzIHRvIHRoZSBjYXJkICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbmV4dCwgJmFkYXB0ZXItPnBlbmRpbmdfbGlzdCkgeworCisJCXNjYiA9IGxpc3RfZW50cnkocG9zLCBzY2JfdCwgbGlzdCk7CisKKwkJaWYoICEoc2NiLT5zdGF0ZSAmIFNDQl9JU1NVRUQpICkgeworCisJCQlpZiggaXNzdWVfc2NiKGFkYXB0ZXIsIHNjYikgIT0gMCApCisJCQkJcmV0dXJuOworCQl9CisJfQorCisJcmV0dXJuOworfQorCisKKy8qKgorICogaXNzdWVfc2NiKCkKKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICogQHNjYiAtIHNjc2kgY29udHJvbCBibG9jaworICoKKyAqIFBvc3QgYSBjb21tYW5kIHRvIHRoZSBjYXJkIGlmIHRoZSBtYWlsYm94IGlzIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHJldHVybgorICogYnVzeS4gV2UgYWxzbyB0YWtlIHRoZSBzY2IgZnJvbSB0aGUgcGVuZGluZyBsaXN0IGlmIHRoZSBtYWlsYm94IGlzCisgKiBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBpbnQKK2lzc3VlX3NjYihhZGFwdGVyX3QgKmFkYXB0ZXIsIHNjYl90ICpzY2IpCit7CisJdm9sYXRpbGUgbWJveDY0X3QJKm1ib3g2NCA9IGFkYXB0ZXItPm1ib3g2NDsKKwl2b2xhdGlsZSBtYm94X3QJCSptYm94ID0gYWRhcHRlci0+bWJveDsKKwl1bnNpZ25lZCBpbnQJaSA9IDA7CisKKwlpZih1bmxpa2VseShtYm94LT5tX2luLmJ1c3kpKSB7CisJCWRvIHsKKwkJCXVkZWxheSgxKTsKKwkJCWkrKzsKKwkJfSB3aGlsZSggbWJveC0+bV9pbi5idXN5ICYmIChpIDwgbWF4X21ib3hfYnVzeV93YWl0KSApOworCisJCWlmKG1ib3gtPm1faW4uYnVzeSkgcmV0dXJuIC0xOworCX0KKworCS8qIENvcHkgbWFpbGJveCBkYXRhIGludG8gaG9zdCBzdHJ1Y3R1cmUgKi8KKwltZW1jcHkoKGNoYXIgKikmbWJveC0+bV9vdXQsIChjaGFyICopc2NiLT5yYXdfbWJveCwgCisJCQlzaXplb2Yoc3RydWN0IG1ib3hfb3V0KSk7CisKKwltYm94LT5tX291dC5jbWRpZCA9IHNjYi0+aWR4OwkvKiBTZXQgY21kaWQgKi8KKwltYm94LT5tX2luLmJ1c3kgPSAxOwkJLyogU2V0IGJ1c3kgKi8KKworCisJLyoKKwkgKiBJbmNyZW1lbnQgdGhlIHBlbmRpbmcgcXVldWUgY291bnRlcgorCSAqLworCWF0b21pY19pbmMoJmFkYXB0ZXItPnBlbmRfY21kcyk7CisKKwlzd2l0Y2ggKG1ib3gtPm1fb3V0LmNtZCkgeworCWNhc2UgTUVHQV9NQk9YQ01EX0xSRUFENjQ6CisJY2FzZSBNRUdBX01CT1hDTURfTFdSSVRFNjQ6CisJY2FzZSBNRUdBX01CT1hDTURfUEFTU1RIUlU2NDoKKwljYXNlIE1FR0FfTUJPWENNRF9FWFRQVEhSVToKKwkJbWJveDY0LT54ZmVyX3NlZ21lbnRfbG8gPSBtYm94LT5tX291dC54ZmVyYWRkcjsKKwkJbWJveDY0LT54ZmVyX3NlZ21lbnRfaGkgPSAwOworCQltYm94LT5tX291dC54ZmVyYWRkciA9IDB4RkZGRkZGRkY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1ib3g2NC0+eGZlcl9zZWdtZW50X2xvID0gMDsKKwkJbWJveDY0LT54ZmVyX3NlZ21lbnRfaGkgPSAwOworCX0KKworCS8qCisJICogcG9zdCB0aGUgY29tbWFuZAorCSAqLworCXNjYi0+c3RhdGUgfD0gU0NCX0lTU1VFRDsKKworCWlmKCBsaWtlbHkoYWRhcHRlci0+ZmxhZyAmIEJPQVJEX01FTU1BUCkgKSB7CisJCW1ib3gtPm1faW4ucG9sbCA9IDA7CisJCW1ib3gtPm1faW4uYWNrID0gMDsKKwkJV1JJTkRPT1IoYWRhcHRlciwgYWRhcHRlci0+bWJveF9kbWEgfCAweDEpOworCX0KKwllbHNlIHsKKwkJaXJxX2VuYWJsZShhZGFwdGVyKTsKKwkJaXNzdWVfY29tbWFuZChhZGFwdGVyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdhaXQgdW50aWwgdGhlIGNvbnRyb2xsZXIncyBtYWlsYm94IGlzIGF2YWlsYWJsZQorICovCitzdGF0aWMgaW5saW5lIGludAorbWVnYV9idXN5d2FpdF9tYm94IChhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJaWYgKGFkYXB0ZXItPm1ib3gtPm1faW4uYnVzeSkKKwkJcmV0dXJuIF9fbWVnYV9idXN5d2FpdF9tYm94KGFkYXB0ZXIpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGlzc3VlX3NjYl9ibG9jaygpCisgKiBAYWRhcHRlciAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqIEByYXdfbWJveCAtIHRoZSBtYWlsYm94CisgKgorICogSXNzdWUgYSBzY2IgaW4gc3luY2hyb25vdXMgYW5kIG5vbi1pbnRlcnJ1cHQgbW9kZQorICovCitzdGF0aWMgaW50Citpc3N1ZV9zY2JfYmxvY2soYWRhcHRlcl90ICphZGFwdGVyLCB1X2NoYXIgKnJhd19tYm94KQoreworCXZvbGF0aWxlIG1ib3g2NF90ICptYm94NjQgPSBhZGFwdGVyLT5tYm94NjQ7CisJdm9sYXRpbGUgbWJveF90ICptYm94ID0gYWRhcHRlci0+bWJveDsKKwl1OAlieXRlOworCisJLyogV2FpdCB1bnRpbCBtYWlsYm94IGlzIGZyZWUgKi8KKwlpZihtZWdhX2J1c3l3YWl0X21ib3ggKGFkYXB0ZXIpKQorCQlnb3RvIGJ1Z19ibG9ja2VkX21haWxib3g7CisKKwkvKiBDb3B5IG1haWxib3ggZGF0YSBpbnRvIGhvc3Qgc3RydWN0dXJlICovCisJbWVtY3B5KChjaGFyICopIG1ib3gsIHJhd19tYm94LCBzaXplb2Yoc3RydWN0IG1ib3hfb3V0KSk7CisJbWJveC0+bV9vdXQuY21kaWQgPSAweEZFOworCW1ib3gtPm1faW4uYnVzeSA9IDE7CisKKwlzd2l0Y2ggKHJhd19tYm94WzBdKSB7CisJY2FzZSBNRUdBX01CT1hDTURfTFJFQUQ2NDoKKwljYXNlIE1FR0FfTUJPWENNRF9MV1JJVEU2NDoKKwljYXNlIE1FR0FfTUJPWENNRF9QQVNTVEhSVTY0OgorCWNhc2UgTUVHQV9NQk9YQ01EX0VYVFBUSFJVOgorCQltYm94NjQtPnhmZXJfc2VnbWVudF9sbyA9IG1ib3gtPm1fb3V0LnhmZXJhZGRyOworCQltYm94NjQtPnhmZXJfc2VnbWVudF9oaSA9IDA7CisJCW1ib3gtPm1fb3V0LnhmZXJhZGRyID0gMHhGRkZGRkZGRjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWJveDY0LT54ZmVyX3NlZ21lbnRfbG8gPSAwOworCQltYm94NjQtPnhmZXJfc2VnbWVudF9oaSA9IDA7CisJfQorCisJaWYoIGxpa2VseShhZGFwdGVyLT5mbGFnICYgQk9BUkRfTUVNTUFQKSApIHsKKwkJbWJveC0+bV9pbi5wb2xsID0gMDsKKwkJbWJveC0+bV9pbi5hY2sgPSAwOworCQltYm94LT5tX2luLm51bXN0YXR1cyA9IDB4RkY7CisJCW1ib3gtPm1faW4uc3RhdHVzID0gMHhGRjsKKwkJV1JJTkRPT1IoYWRhcHRlciwgYWRhcHRlci0+bWJveF9kbWEgfCAweDEpOworCisJCXdoaWxlKCh2b2xhdGlsZSB1OCltYm94LT5tX2luLm51bXN0YXR1cyA9PSAweEZGKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJbWJveC0+bV9pbi5udW1zdGF0dXMgPSAweEZGOworCisJCXdoaWxlKCAodm9sYXRpbGUgdTgpbWJveC0+bV9pbi5wb2xsICE9IDB4NzcgKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJbWJveC0+bV9pbi5wb2xsID0gMDsKKwkJbWJveC0+bV9pbi5hY2sgPSAweDc3OworCisJCVdSSU5ET09SKGFkYXB0ZXIsIGFkYXB0ZXItPm1ib3hfZG1hIHwgMHgyKTsKKworCQl3aGlsZShSRElORE9PUihhZGFwdGVyKSAmIDB4MikKKwkJCWNwdV9yZWxheCgpOworCX0KKwllbHNlIHsKKwkJaXJxX2Rpc2FibGUoYWRhcHRlcik7CisJCWlzc3VlX2NvbW1hbmQoYWRhcHRlcik7CisKKwkJd2hpbGUgKCEoKGJ5dGUgPSBpcnFfc3RhdGUoYWRhcHRlcikpICYgSU5UUl9WQUxJRCkpCisJCQljcHVfcmVsYXgoKTsKKworCQlzZXRfaXJxX3N0YXRlKGFkYXB0ZXIsIGJ5dGUpOworCQlpcnFfZW5hYmxlKGFkYXB0ZXIpOworCQlpcnFfYWNrKGFkYXB0ZXIpOworCX0KKworCXJldHVybiBtYm94LT5tX2luLnN0YXR1czsKKworYnVnX2Jsb2NrZWRfbWFpbGJveDoKKwlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZDogQmxvY2tlZCBtYWlsYm94Li4uLi4uISFcbiIpOworCXVkZWxheSAoMTAwMCk7CisJcmV0dXJuIC0xOworfQorCisKKy8qKgorICogbWVnYXJhaWRfaXNyX2lvbWFwcGVkKCkKKyAqIEBpcnEgLSBpcnEKKyAqIEBkZXZwIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICogQHJlZ3MgLSB1bnVzZWQKKyAqCisgKiBJbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBpby1tYXBwZWQgY29udHJvbGxlcnMuCisgKiBGaW5kIG91dCBpZiBvdXIgZGV2aWNlIGlzIGludGVycnVwdGluZy4gSWYgeWVzLCBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0CisgKiBhbmQgc2VydmljZSB0aGUgY29tcGxldGVkIGNvbW1hbmRzLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK21lZ2FyYWlkX2lzcl9pb21hcHBlZChpbnQgaXJxLCB2b2lkICpkZXZwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlhZGFwdGVyX3QJKmFkYXB0ZXIgPSBkZXZwOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdTgJc3RhdHVzOworCXU4CW5zdGF0dXM7CisJdTgJY29tcGxldGVkW01BWF9GSVJNV0FSRV9TVEFUVVNdOworCXU4CWJ5dGU7CisJaW50CWhhbmRsZWQgPSAwOworCisKKwkvKgorCSAqIGxvb3AgdGlsbCBGL1cgaGFzIG1vcmUgY29tbWFuZHMgZm9yIHVzIHRvIGNvbXBsZXRlLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisKKwlkbyB7CisJCS8qIENoZWNrIGlmIGEgdmFsaWQgaW50ZXJydXB0IGlzIHBlbmRpbmcgKi8KKwkJYnl0ZSA9IGlycV9zdGF0ZShhZGFwdGVyKTsKKwkJaWYoIChieXRlICYgVkFMSURfSU5UUl9CWVRFKSA9PSAwICkgeworCQkJLyoKKwkJCSAqIE5vIG1vcmUgcGVuZGluZyBjb21tYW5kcworCQkJICovCisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwkJc2V0X2lycV9zdGF0ZShhZGFwdGVyLCBieXRlKTsKKworCQl3aGlsZSgobnN0YXR1cyA9ICh2b2xhdGlsZSB1OClhZGFwdGVyLT5tYm94LT5tX2luLm51bXN0YXR1cykKKwkJCQk9PSAweEZGKQorCQkJY3B1X3JlbGF4KCk7CisJCWFkYXB0ZXItPm1ib3gtPm1faW4ubnVtc3RhdHVzID0gMHhGRjsKKworCQlzdGF0dXMgPSBhZGFwdGVyLT5tYm94LT5tX2luLnN0YXR1czsKKworCQkvKgorCQkgKiBkZWNyZW1lbnQgdGhlIHBlbmRpbmcgcXVldWUgY291bnRlcgorCQkgKi8KKwkJYXRvbWljX3N1Yihuc3RhdHVzLCAmYWRhcHRlci0+cGVuZF9jbWRzKTsKKworCQltZW1jcHkoY29tcGxldGVkLCAodm9pZCAqKWFkYXB0ZXItPm1ib3gtPm1faW4uY29tcGxldGVkLCAKKwkJCQluc3RhdHVzKTsKKworCQkvKiBBY2tub3dsZWRnZSBpbnRlcnJ1cHQgKi8KKwkJaXJxX2FjayhhZGFwdGVyKTsKKworCQltZWdhX2NtZF9kb25lKGFkYXB0ZXIsIGNvbXBsZXRlZCwgbnN0YXR1cywgc3RhdHVzKTsKKworCQltZWdhX3J1bmRvbmVxKGFkYXB0ZXIpOworCisJCWhhbmRsZWQgPSAxOworCisJCS8qIExvb3AgdGhyb3VnaCBhbnkgcGVuZGluZyByZXF1ZXN0cyAqLworCQlpZihhdG9taWNfcmVhZCgmYWRhcHRlci0+cXVpZXNjZW50KSA9PSAwKSB7CisJCQltZWdhX3J1bnBlbmRxKGFkYXB0ZXIpOworCQl9CisKKwl9IHdoaWxlKDEpOworCisgb3V0X3VubG9jazoKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisKKy8qKgorICogbWVnYXJhaWRfaXNyX21lbW1hcHBlZCgpCisgKiBAaXJxIC0gaXJxCisgKiBAZGV2cCAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqIEByZWdzIC0gdW51c2VkCisgKgorICogSW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgbWVtb3J5LW1hcHBlZCBjb250cm9sbGVycy4KKyAqIEZpbmQgb3V0IGlmIG91ciBkZXZpY2UgaXMgaW50ZXJydXB0aW5nLiBJZiB5ZXMsIGFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQKKyAqIGFuZCBzZXJ2aWNlIHRoZSBjb21wbGV0ZWQgY29tbWFuZHMuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorbWVnYXJhaWRfaXNyX21lbW1hcHBlZChpbnQgaXJxLCB2b2lkICpkZXZwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlhZGFwdGVyX3QJKmFkYXB0ZXIgPSBkZXZwOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdTgJc3RhdHVzOworCXUzMglkd29yZCA9IDA7CisJdTgJbnN0YXR1czsKKwl1OAljb21wbGV0ZWRbTUFYX0ZJUk1XQVJFX1NUQVRVU107CisJaW50CWhhbmRsZWQgPSAwOworCisKKwkvKgorCSAqIGxvb3AgdGlsbCBGL1cgaGFzIG1vcmUgY29tbWFuZHMgZm9yIHVzIHRvIGNvbXBsZXRlLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisKKwlkbyB7CisJCS8qIENoZWNrIGlmIGEgdmFsaWQgaW50ZXJydXB0IGlzIHBlbmRpbmcgKi8KKwkJZHdvcmQgPSBSRE9VVERPT1IoYWRhcHRlcik7CisJCWlmKGR3b3JkICE9IDB4MTAwMDEyMzQpIHsKKwkJCS8qCisJCQkgKiBObyBtb3JlIHBlbmRpbmcgY29tbWFuZHMKKwkJCSAqLworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJCVdST1VURE9PUihhZGFwdGVyLCAweDEwMDAxMjM0KTsKKworCQl3aGlsZSgobnN0YXR1cyA9ICh2b2xhdGlsZSB1OClhZGFwdGVyLT5tYm94LT5tX2luLm51bXN0YXR1cykKKwkJCQk9PSAweEZGKSB7CisJCQljcHVfcmVsYXgoKTsKKwkJfQorCQlhZGFwdGVyLT5tYm94LT5tX2luLm51bXN0YXR1cyA9IDB4RkY7CisKKwkJc3RhdHVzID0gYWRhcHRlci0+bWJveC0+bV9pbi5zdGF0dXM7CisKKwkJLyoKKwkJICogZGVjcmVtZW50IHRoZSBwZW5kaW5nIHF1ZXVlIGNvdW50ZXIKKwkJICovCisJCWF0b21pY19zdWIobnN0YXR1cywgJmFkYXB0ZXItPnBlbmRfY21kcyk7CisKKwkJbWVtY3B5KGNvbXBsZXRlZCwgKHZvaWQgKilhZGFwdGVyLT5tYm94LT5tX2luLmNvbXBsZXRlZCwgCisJCQkJbnN0YXR1cyk7CisKKwkJLyogQWNrbm93bGVkZ2UgaW50ZXJydXB0ICovCisJCVdSSU5ET09SKGFkYXB0ZXIsIDB4Mik7CisKKwkJaGFuZGxlZCA9IDE7CisKKwkJd2hpbGUoIFJESU5ET09SKGFkYXB0ZXIpICYgMHgwMiApIGNwdV9yZWxheCgpOworCisJCW1lZ2FfY21kX2RvbmUoYWRhcHRlciwgY29tcGxldGVkLCBuc3RhdHVzLCBzdGF0dXMpOworCisJCW1lZ2FfcnVuZG9uZXEoYWRhcHRlcik7CisKKwkJLyogTG9vcCB0aHJvdWdoIGFueSBwZW5kaW5nIHJlcXVlc3RzICovCisJCWlmKGF0b21pY19yZWFkKCZhZGFwdGVyLT5xdWllc2NlbnQpID09IDApIHsKKwkJCW1lZ2FfcnVucGVuZHEoYWRhcHRlcik7CisJCX0KKworCX0gd2hpbGUoMSk7CisKKyBvdXRfdW5sb2NrOgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisvKioKKyAqIG1lZ2FfY21kX2RvbmUoKQorICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKiBAY29tcGxldGVkIC0gYXJyYXkgb2YgaWRzIG9mIGNvbXBsZXRlZCBjb21tYW5kcworICogQG5zdGF0dXMgLSBudW1iZXIgb2YgY29tcGxldGVkIGNvbW1hbmRzCisgKiBAc3RhdHVzIC0gc3RhdHVzIG9mIHRoZSBsYXN0IGNvbW1hbmQgY29tcGxldGVkCisgKgorICogQ29tcGxldGUgdGhlIGNvbWFtbmRzIGFuZCBjYWxsIHRoZSBzY3NpIG1pZC1sYXllciBjYWxsYmFjayBob29rcy4KKyAqLworc3RhdGljIHZvaWQKK21lZ2FfY21kX2RvbmUoYWRhcHRlcl90ICphZGFwdGVyLCB1OCBjb21wbGV0ZWRbXSwgaW50IG5zdGF0dXMsIGludCBzdGF0dXMpCit7CisJbWVnYV9leHRfcGFzc3RocnUJKmVwdGhydSA9IE5VTEw7CisJc3RydWN0IHNjYXR0ZXJsaXN0CSpzZ2w7CisJU2NzaV9DbW5kCSpjbWQgPSBOVUxMOworCW1lZ2FfcGFzc3RocnUJKnB0aHJ1ID0gTlVMTDsKKwltYm94X3QJKm1ib3ggPSBOVUxMOworCXU4CWM7CisJc2NiX3QJKnNjYjsKKwlpbnQJaXNsb2dpY2FsOworCWludAljbWRpZDsKKwlpbnQJaTsKKworCS8qCisJICogZm9yIGFsbCB0aGUgY29tbWFuZHMgY29tcGxldGVkLCBjYWxsIHRoZSBtaWQtbGF5ZXIgY2FsbGJhY2sgcm91dGluZQorCSAqIGFuZCBmcmVlIHRoZSBzY2IuCisJICovCisJZm9yKCBpID0gMDsgaSA8IG5zdGF0dXM7IGkrKyApIHsKKworCQljbWRpZCA9IGNvbXBsZXRlZFtpXTsKKworCQlpZiggY21kaWQgPT0gQ01ESURfSU5UX0NNRFMgKSB7IC8qIGludGVybmFsIGNvbW1hbmQgKi8KKwkJCXNjYiA9ICZhZGFwdGVyLT5pbnRfc2NiOworCQkJY21kID0gc2NiLT5jbWQ7CisJCQltYm94ID0gKG1ib3hfdCAqKXNjYi0+cmF3X21ib3g7CisKKwkJCS8qCisJCQkgKiBJbnRlcm5hbCBjb21tYW5kIGludGVyZmFjZSBkbyBub3QgZmlyZSB0aGUgZXh0ZW5kZWQKKwkJCSAqIHBhc3N0aHJ1IG9yIDY0LWJpdCBwYXNzdGhydQorCQkJICovCisJCQlwdGhydSA9IHNjYi0+cHRocnU7CisKKwkJfQorCQllbHNlIHsKKwkJCXNjYiA9ICZhZGFwdGVyLT5zY2JfbGlzdFtjbWRpZF07CisKKwkJCS8qCisJCQkgKiBNYWtlIHN1cmUgZi93IGhhcyBjb21wbGV0ZWQgYSB2YWxpZCBjb21tYW5kCisJCQkgKi8KKwkJCWlmKCAhKHNjYi0+c3RhdGUgJiBTQ0JfSVNTVUVEKSB8fCBzY2ItPmNtZCA9PSBOVUxMICkgeworCQkJCXByaW50ayhLRVJOX0NSSVQKKwkJCQkJIm1lZ2FyYWlkOiBpbnZhbGlkIGNvbW1hbmQgIik7CisJCQkJcHJpbnRrKCJJZCAlZCwgc2NiLT5zdGF0ZToleCwgc2NzaSBjbWQ6JXBcbiIsCisJCQkJCWNtZGlkLCBzY2ItPnN0YXRlLCBzY2ItPmNtZCk7CisKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFdhcyBhIGFib3J0IGlzc3VlZCBmb3IgdGhpcyBjb21tYW5kCisJCQkgKi8KKwkJCWlmKCBzY2ItPnN0YXRlICYgU0NCX0FCT1JUICkgeworCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJtZWdhcmFpZDogYWJvcnRlZCBjbWQgJWx4WyV4XSBjb21wbGV0ZS5cbiIsCisJCQkJCXNjYi0+Y21kLT5zZXJpYWxfbnVtYmVyLCBzY2ItPmlkeCk7CisKKwkJCQlzY2ItPmNtZC0+cmVzdWx0ID0gKERJRF9BQk9SVCA8PCAxNik7CisKKwkJCQlsaXN0X2FkZF90YWlsKFNDU0lfTElTVChzY2ItPmNtZCksCisJCQkJCQkmYWRhcHRlci0+Y29tcGxldGVkX2xpc3QpOworCisJCQkJbWVnYV9mcmVlX3NjYihhZGFwdGVyLCBzY2IpOworCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBXYXMgYSByZXNldCBpc3N1ZWQgZm9yIHRoaXMgY29tbWFuZAorCQkJICovCisJCQlpZiggc2NiLT5zdGF0ZSAmIFNDQl9SRVNFVCApIHsKKworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkibWVnYXJhaWQ6IHJlc2V0IGNtZCAlbHhbJXhdIGNvbXBsZXRlLlxuIiwKKwkJCQkJc2NiLT5jbWQtPnNlcmlhbF9udW1iZXIsIHNjYi0+aWR4KTsKKworCQkJCXNjYi0+Y21kLT5yZXN1bHQgPSAoRElEX1JFU0VUIDw8IDE2KTsKKworCQkJCWxpc3RfYWRkX3RhaWwoU0NTSV9MSVNUKHNjYi0+Y21kKSwKKwkJCQkJCSZhZGFwdGVyLT5jb21wbGV0ZWRfbGlzdCk7CisKKwkJCQltZWdhX2ZyZWVfc2NiIChhZGFwdGVyLCBzY2IpOworCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWNtZCA9IHNjYi0+Y21kOworCQkJcHRocnUgPSBzY2ItPnB0aHJ1OworCQkJZXB0aHJ1ID0gc2NiLT5lcHRocnU7CisJCQltYm94ID0gKG1ib3hfdCAqKXNjYi0+cmF3X21ib3g7CisKKyNpZiBNRUdBX0hBVkVfU1RBVFMKKwkJCXsKKworCQkJaW50CWxvZ2RydiA9IG1ib3gtPm1fb3V0LmxvZ2RydjsKKworCQkJaXNsb2dpY2FsID0gYWRhcHRlci0+bG9nZHJ2X2NoYW5bY21kLT5jaGFubmVsXTsKKwkJCS8qCisJCQkgKiBNYWludGFpbiBhbiBlcnJvciBjb3VudGVyIGZvciB0aGUgbG9naWNhbCBkcml2ZS4KKwkJCSAqIFNvbWUgYXBwbGljYXRpb24gbGlrZSBTTk1QIGFnZW50IG5lZWQgc3VjaAorCQkJICogc3RhdGlzdGljcworCQkJICovCisJCQlpZiggc3RhdHVzICYmIGlzbG9naWNhbCAmJiAoY21kLT5jbW5kWzBdID09IFJFQURfNiB8fAorCQkJCQkJY21kLT5jbW5kWzBdID09IFJFQURfMTAgfHwKKwkJCQkJCWNtZC0+Y21uZFswXSA9PSBSRUFEXzEyKSkgeworCQkJCS8qCisJCQkJICogTG9naWNhbCBkcml2ZSBudW1iZXIgaW5jcmVhc2VzIGJ5IDB4ODAgd2hlbgorCQkJCSAqIGEgbG9naWNhbCBkcml2ZSBpcyBkZWxldGVkCisJCQkJICovCisJCQkJYWRhcHRlci0+cmRfZXJyb3JzW2xvZ2RydiUweDgwXSsrOworCQkJfQorCisJCQlpZiggc3RhdHVzICYmIGlzbG9naWNhbCAmJiAoY21kLT5jbW5kWzBdID09IFdSSVRFXzYgfHwKKwkJCQkJCWNtZC0+Y21uZFswXSA9PSBXUklURV8xMCB8fAorCQkJCQkJY21kLT5jbW5kWzBdID09IFdSSVRFXzEyKSkgeworCQkJCS8qCisJCQkJICogTG9naWNhbCBkcml2ZSBudW1iZXIgaW5jcmVhc2VzIGJ5IDB4ODAgd2hlbgorCQkJCSAqIGEgbG9naWNhbCBkcml2ZSBpcyBkZWxldGVkCisJCQkJICovCisJCQkJYWRhcHRlci0+d3JfZXJyb3JzW2xvZ2RydiUweDgwXSsrOworCQkJfQorCisJCQl9CisjZW5kaWYKKwkJfQorCisJCS8qCisJCSAqIERvIG5vdCByZXR1cm4gdGhlIHByZXNlbmNlIG9mIGhhcmQgZGlzayBvbiB0aGUgY2hhbm5lbCBzbywKKwkJICogaW5xdWlyeSBzZW50LCBhbmQgcmV0dXJuZWQgZGF0YT09aGFyZCBkaXNrIG9yIHJlbW92YWJsZQorCQkgKiBoYXJkIGRpc2sgYW5kIG5vdCBsb2dpY2FsLCByZXF1ZXN0IHNob3VsZCByZXR1cm4gZmFpbHVyZSEgLQorCQkgKiBQSgorCQkgKi8KKwkJaXNsb2dpY2FsID0gYWRhcHRlci0+bG9nZHJ2X2NoYW5bY21kLT5kZXZpY2UtPmNoYW5uZWxdOworCQlpZiggY21kLT5jbW5kWzBdID09IElOUVVJUlkgJiYgIWlzbG9naWNhbCApIHsKKworCQkJaWYoIGNtZC0+dXNlX3NnICkgeworCQkJCXNnbCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikKKwkJCQkJY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKworCQkJCWlmKCBzZ2wtPnBhZ2UgKSB7CisJCQkJCWMgPSAqKHVuc2lnbmVkIGNoYXIgKikKKwkJCQkJcGFnZV9hZGRyZXNzKCgmc2dsWzBdKS0+cGFnZSkgKworCQkJCQkoJnNnbFswXSktPm9mZnNldDsgCisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCQkibWVnYXJhaWQ6IGludmFsaWQgc2cuXG4iKTsKKwkJCQkJYyA9IDA7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJYyA9ICoodTggKiljbWQtPnJlcXVlc3RfYnVmZmVyOworCQkJfQorCisJCQlpZihJU19SQUlEX0NIKGFkYXB0ZXIsIGNtZC0+ZGV2aWNlLT5jaGFubmVsKSAmJgorCQkJCQkoKGMgJiAweDFGICkgPT0gVFlQRV9ESVNLKSkgeworCQkJCXN0YXR1cyA9IDB4RjA7CisJCQl9CisJCX0KKworCQkvKiBjbGVhciByZXN1bHQ7IG90aGVyd2lzZSwgc3VjY2VzcyByZXR1cm5zIGNvcnJ1cHQgdmFsdWUgKi8KKwkJY21kLT5yZXN1bHQgPSAwOworCisJCS8qIENvbnZlcnQgTWVnYVJBSUQgc3RhdHVzIHRvIExpbnV4IGVycm9yIGNvZGUgKi8KKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSAweDAwOgkvKiBTVUNDRVNTICwgaS5lLiBTQ1NJX1NUQVRVU19HT09EICovCisJCQljbWQtPnJlc3VsdCB8PSAoRElEX09LIDw8IDE2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgMHgwMjoJLyogRVJST1JfQUJPUlRFRCwgaS5lLgorCQkJCSAgIFNDU0lfU1RBVFVTX0NIRUNLX0NPTkRJVElPTiAqLworCisJCQkvKiBzZXQgc2Vuc2VfYnVmZmVyIGFuZCByZXN1bHQgZmllbGRzICovCisJCQlpZiggbWJveC0+bV9vdXQuY21kID09IE1FR0FfTUJPWENNRF9QQVNTVEhSVSB8fAorCQkJCW1ib3gtPm1fb3V0LmNtZCA9PSBNRUdBX01CT1hDTURfUEFTU1RIUlU2NCApIHsKKworCQkJCW1lbWNweShjbWQtPnNlbnNlX2J1ZmZlciwgcHRocnUtPnJlcXNlbnNlYXJlYSwKKwkJCQkJCTE0KTsKKworCQkJCWNtZC0+cmVzdWx0ID0gKERSSVZFUl9TRU5TRSA8PCAyNCkgfAorCQkJCQkoRElEX09LIDw8IDE2KSB8CisJCQkJCShDSEVDS19DT05ESVRJT04gPDwgMSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAobWJveC0+bV9vdXQuY21kID09IE1FR0FfTUJPWENNRF9FWFRQVEhSVSkgeworCisJCQkJCW1lbWNweShjbWQtPnNlbnNlX2J1ZmZlciwKKwkJCQkJCWVwdGhydS0+cmVxc2Vuc2VhcmVhLCAxNCk7CisKKwkJCQkJY21kLT5yZXN1bHQgPSAoRFJJVkVSX1NFTlNFIDw8IDI0KSB8CisJCQkJCQkoRElEX09LIDw8IDE2KSB8CisJCQkJCQkoQ0hFQ0tfQ09ORElUSU9OIDw8IDEpOworCQkJCX0gZWxzZSB7CisJCQkJCWNtZC0+c2Vuc2VfYnVmZmVyWzBdID0gMHg3MDsKKwkJCQkJY21kLT5zZW5zZV9idWZmZXJbMl0gPSBBQk9SVEVEX0NPTU1BTkQ7CisJCQkJCWNtZC0+cmVzdWx0IHw9IChDSEVDS19DT05ESVRJT04gPDwgMSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAweDA4OgkvKiBFUlJfREVTVF9EUklWRV9GQUlMRUQsIGkuZS4KKwkJCQkgICBTQ1NJX1NUQVRVU19CVVNZICovCisJCQljbWQtPnJlc3VsdCB8PSAoRElEX0JVU19CVVNZIDw8IDE2KSB8IHN0YXR1czsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisjaWYgTUVHQV9IQVZFX0NMVVNURVJJTkcKKwkJCS8qCisJCQkgKiBJZiBURVNUX1VOSVRfUkVBRFkgZmFpbHMsIHdlIGtub3cKKwkJCSAqIE1FR0FfUkVTRVJWQVRJT05fU1RBVFVTIGZhaWxlZAorCQkJICovCisJCQlpZiggY21kLT5jbW5kWzBdID09IFRFU1RfVU5JVF9SRUFEWSApIHsKKwkJCQljbWQtPnJlc3VsdCB8PSAoRElEX0VSUk9SIDw8IDE2KSB8CisJCQkJCShSRVNFUlZBVElPTl9DT05GTElDVCA8PCAxKTsKKwkJCX0KKwkJCWVsc2UKKwkJCS8qCisJCQkgKiBFcnJvciBjb2RlIHJldHVybmVkIGlzIDEgaWYgUmVzZXJ2ZSBvciBSZWxlYXNlCisJCQkgKiBmYWlsZWQgb3IgdGhlIGlucHV0IHBhcmFtZXRlciBpcyBpbnZhbGlkCisJCQkgKi8KKwkJCWlmKCBzdGF0dXMgPT0gMSAmJgorCQkJCShjbWQtPmNtbmRbMF0gPT0gUkVTRVJWRSB8fAorCQkJCQkgY21kLT5jbW5kWzBdID09IFJFTEVBU0UpICkgeworCisJCQkJY21kLT5yZXN1bHQgfD0gKERJRF9FUlJPUiA8PCAxNikgfAorCQkJCQkoUkVTRVJWQVRJT05fQ09ORkxJQ1QgPDwgMSk7CisJCQl9CisJCQllbHNlCisjZW5kaWYKKwkJCQljbWQtPnJlc3VsdCB8PSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpfHN0YXR1czsKKwkJfQorCisJCS8qCisJCSAqIE9ubHkgZnJlZSBTQ0JzIGZvciB0aGUgY29tbWFuZHMgY29taW5nIGRvd24gZnJvbSB0aGUKKwkJICogbWlkLWxheWVyLCBub3QgZm9yIHdoaWNoIHdlcmUgaXNzdWVkIGludGVybmFsbHkKKwkJICoKKwkJICogRm9yIGludGVybmFsIGNvbW1hbmQsIHJlc3RvcmUgdGhlIHN0YXR1cyByZXR1cm5lZCBieSB0aGUKKwkJICogZmlybXdhcmUgc28gdGhhdCB1c2VyIGNhbiBpbnRlcnByZXQgaXQuCisJCSAqLworCQlpZiggY21kaWQgPT0gQ01ESURfSU5UX0NNRFMgKSB7IC8qIGludGVybmFsIGNvbW1hbmQgKi8KKwkJCWNtZC0+cmVzdWx0ID0gc3RhdHVzOworCisJCQkvKgorCQkJICogUmVtb3ZlIHRoZSBpbnRlcm5hbCBjb21tYW5kIGZyb20gdGhlIHBlbmRpbmcgbGlzdAorCQkJICovCisJCQlsaXN0X2RlbF9pbml0KCZzY2ItPmxpc3QpOworCQkJc2NiLT5zdGF0ZSA9IFNDQl9GUkVFOworCQl9CisJCWVsc2UgeworCQkJbWVnYV9mcmVlX3NjYihhZGFwdGVyLCBzY2IpOworCQl9CisKKwkJLyogQWRkIFNjc2lfQ29tbWFuZCB0byBlbmQgb2YgY29tcGxldGVkIHF1ZXVlICovCisJCWxpc3RfYWRkX3RhaWwoU0NTSV9MSVNUKGNtZCksICZhZGFwdGVyLT5jb21wbGV0ZWRfbGlzdCk7CisJfQorfQorCisKKy8qCisgKiBtZWdhX3J1bnBlbmRxKCkKKyAqCisgKiBSdW4gdGhyb3VnaCB0aGUgbGlzdCBvZiBjb21wbGV0ZWQgcmVxdWVzdHMgYW5kIGZpbmlzaCBpdAorICovCitzdGF0aWMgdm9pZAorbWVnYV9ydW5kb25lcSAoYWRhcHRlcl90ICphZGFwdGVyKQoreworCVNjc2lfQ21uZCAqY21kOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKworCWxpc3RfZm9yX2VhY2gocG9zLCAmYWRhcHRlci0+Y29tcGxldGVkX2xpc3QpIHsKKworCQlTY3NpX1BvaW50ZXIqIHNwb3MgPSAoU2NzaV9Qb2ludGVyICopcG9zOworCisJCWNtZCA9IGxpc3RfZW50cnkoc3BvcywgU2NzaV9DbW5kLCBTQ3ApOworCQljbWQtPnNjc2lfZG9uZShjbWQpOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZhZGFwdGVyLT5jb21wbGV0ZWRfbGlzdCk7Cit9CisKKworLyoKKyAqIEZyZWUgYSBTQ0Igc3RydWN0dXJlCisgKiBOb3RlOiBXZSBhc3N1bWUgdGhlIHNjc2kgY29tbWFuZHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2NiIGlzIG5vdCBmcmVlIHlldC4KKyAqLworc3RhdGljIHZvaWQKK21lZ2FfZnJlZV9zY2IoYWRhcHRlcl90ICphZGFwdGVyLCBzY2JfdCAqc2NiKQoreworCXN3aXRjaCggc2NiLT5kbWFfdHlwZSApIHsKKworCWNhc2UgTUVHQV9ETUFfVFlQRV9OT05FOgorCQlicmVhazsKKworCWNhc2UgTUVHQV9CVUxLX0RBVEE6CisJCXBjaV91bm1hcF9wYWdlKGFkYXB0ZXItPmRldiwgc2NiLT5kbWFfaF9idWxrZGF0YSwKKwkJCXNjYi0+Y21kLT5yZXF1ZXN0X2J1ZmZsZW4sIHNjYi0+ZG1hX2RpcmVjdGlvbik7CisJCWJyZWFrOworCisJY2FzZSBNRUdBX1NHTElTVDoKKwkJcGNpX3VubWFwX3NnKGFkYXB0ZXItPmRldiwgc2NiLT5jbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJc2NiLT5jbWQtPnVzZV9zZywgc2NiLT5kbWFfZGlyZWN0aW9uKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFJlbW92ZSBmcm9tIHRoZSBwZW5kaW5nIGxpc3QKKwkgKi8KKwlsaXN0X2RlbF9pbml0KCZzY2ItPmxpc3QpOworCisJLyogTGluayB0aGUgc2NiIGJhY2sgaW50byBmcmVlIGxpc3QgKi8KKwlzY2ItPnN0YXRlID0gU0NCX0ZSRUU7CisJc2NiLT5jbWQgPSBOVUxMOworCisJbGlzdF9hZGQoJnNjYi0+bGlzdCwgJmFkYXB0ZXItPmZyZWVfbGlzdCk7Cit9CisKKworc3RhdGljIGludAorX19tZWdhX2J1c3l3YWl0X21ib3ggKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwl2b2xhdGlsZSBtYm94X3QgKm1ib3ggPSBhZGFwdGVyLT5tYm94OworCWxvbmcgY291bnRlcjsKKworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCAxMDAwMDsgY291bnRlcisrKSB7CisJCWlmICghbWJveC0+bV9pbi5idXN5KQorCQkJcmV0dXJuIDA7CisJCXVkZWxheSgxMDApOyB5aWVsZCgpOworCX0KKwlyZXR1cm4gLTE7CQkvKiBnaXZlIHVwIGFmdGVyIDEgc2Vjb25kICovCit9CisKKy8qCisgKiBDb3BpZXMgZGF0YSB0byBTR0xJU1QKKyAqIE5vdGU6IEZvciA2NCBiaXQgY2FyZHMsIHdlIG5lZWQgYSBtaW5pbXVtIG9mIG9uZSBTRyBlbGVtZW50IGZvciByZWFkL3dyaXRlCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FfYnVpbGRfc2dsaXN0KGFkYXB0ZXJfdCAqYWRhcHRlciwgc2NiX3QgKnNjYiwgdTMyICpidWYsIHUzMiAqbGVuKQoreworCXN0cnVjdCBzY2F0dGVybGlzdAkqc2dsOworCXN0cnVjdCBwYWdlCSpwYWdlOworCXVuc2lnbmVkIGxvbmcJb2Zmc2V0OworCVNjc2lfQ21uZAkqY21kOworCWludAlzZ2NudDsKKwlpbnQJaWR4OworCisJY21kID0gc2NiLT5jbWQ7CisKKwkvKiBTY2F0dGVyLWdhdGhlciBub3QgdXNlZCAqLworCWlmKCAhY21kLT51c2Vfc2cgKSB7CisKKwkJcGFnZSA9IHZpcnRfdG9fcGFnZShjbWQtPnJlcXVlc3RfYnVmZmVyKTsKKwkJb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoY21kLT5yZXF1ZXN0X2J1ZmZlcik7CisKKwkJc2NiLT5kbWFfaF9idWxrZGF0YSA9IHBjaV9tYXBfcGFnZShhZGFwdGVyLT5kZXYsCisJCQkJCQkgIHBhZ2UsIG9mZnNldCwKKwkJCQkJCSAgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCQkgIHNjYi0+ZG1hX2RpcmVjdGlvbik7CisJCXNjYi0+ZG1hX3R5cGUgPSBNRUdBX0JVTEtfREFUQTsKKworCQkvKgorCQkgKiBXZSBuZWVkIHRvIGhhbmRsZSBzcGVjaWFsIDY0LWJpdCBjb21tYW5kcyB0aGF0IG5lZWQgYQorCQkgKiBtaW5pbXVtIG9mIDEgU0cKKwkJICovCisJCWlmKCBhZGFwdGVyLT5oYXNfNjRiaXRfYWRkciApIHsKKwkJCXNjYi0+c2dsNjRbMF0uYWRkcmVzcyA9IHNjYi0+ZG1hX2hfYnVsa2RhdGE7CisJCQlzY2ItPnNnbDY0WzBdLmxlbmd0aCA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCQkJKmJ1ZiA9ICh1MzIpc2NiLT5zZ2xfZG1hX2FkZHI7CisJCQkqbGVuID0gKHUzMiljbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJCXJldHVybiAxOworCQl9CisJCWVsc2UgeworCQkJKmJ1ZiA9ICh1MzIpc2NiLT5kbWFfaF9idWxrZGF0YTsKKwkJCSpsZW4gPSAodTMyKWNtZC0+cmVxdWVzdF9idWZmbGVuOworCQl9CisJCXJldHVybiAwOworCX0KKworCXNnbCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPnJlcXVlc3RfYnVmZmVyOworCisJLyoKKwkgKiBDb3B5IFNjYXR0ZXItR2F0aGVyIGxpc3QgaW5mbyBpbnRvIGNvbnRyb2xsZXIgc3RydWN0dXJlLgorCSAqCisJICogVGhlIG51bWJlciBvZiBzZyBlbGVtZW50cyByZXR1cm5lZCBtdXN0IG5vdCBleGNlZWQgb3VyIGxpbWl0CisJICovCisJc2djbnQgPSBwY2lfbWFwX3NnKGFkYXB0ZXItPmRldiwgc2dsLCBjbWQtPnVzZV9zZywKKwkJCXNjYi0+ZG1hX2RpcmVjdGlvbik7CisKKwlzY2ItPmRtYV90eXBlID0gTUVHQV9TR0xJU1Q7CisKKwlpZiggc2djbnQgPiBhZGFwdGVyLT5zZ2xlbiApIEJVRygpOworCisJZm9yKCBpZHggPSAwOyBpZHggPCBzZ2NudDsgaWR4KyssIHNnbCsrICkgeworCisJCWlmKCBhZGFwdGVyLT5oYXNfNjRiaXRfYWRkciApIHsKKwkJCXNjYi0+c2dsNjRbaWR4XS5hZGRyZXNzID0gc2dfZG1hX2FkZHJlc3Moc2dsKTsKKwkJCXNjYi0+c2dsNjRbaWR4XS5sZW5ndGggPSBzZ19kbWFfbGVuKHNnbCk7CisJCX0KKwkJZWxzZSB7CisJCQlzY2ItPnNnbFtpZHhdLmFkZHJlc3MgPSBzZ19kbWFfYWRkcmVzcyhzZ2wpOworCQkJc2NiLT5zZ2xbaWR4XS5sZW5ndGggPSBzZ19kbWFfbGVuKHNnbCk7CisJCX0KKwl9CisKKwkvKiBSZXNldCBwb2ludGVyIGFuZCBsZW5ndGggZmllbGRzICovCisJKmJ1ZiA9IHNjYi0+c2dsX2RtYV9hZGRyOworCisJLyoKKwkgKiBGb3IgcGFzc3RocnUgY29tbWFuZCwgZGF0YXhmZXJsZW4gbXVzdCBiZSBzZXQsIGV2ZW4gZm9yIGNvbW1hbmRzCisJICogd2l0aCBhIHNnIGxpc3QKKwkgKi8KKwkqbGVuID0gKHUzMiljbWQtPnJlcXVlc3RfYnVmZmxlbjsKKworCS8qIFJldHVybiBjb3VudCBvZiBTRyByZXF1ZXN0cyAqLworCXJldHVybiBzZ2NudDsKK30KKworCisvKgorICogbWVnYV84X3RvXzQwbGQoKQorICoKKyAqIHRha2VzIGFsbCBpbmZvIGluIEFkYXB0ZXJJbnF1aXJ5IHN0cnVjdHVyZSBhbmQgcHV0cyBpdCBpbnRvIFByb2R1Y3RJbmZvIGFuZAorICogRW5xdWlyeTMgc3RydWN0dXJlcyBmb3IgbGF0ZXIgdXNlCisgKi8KK3N0YXRpYyB2b2lkCittZWdhXzhfdG9fNDBsZChtcmFpZF9pbnF1aXJ5ICppbnF1aXJ5LCBtZWdhX2lucXVpcnkzICplbnF1aXJ5MywKKwkJbWVnYV9wcm9kdWN0X2luZm8gKnByb2R1Y3RfaW5mbykKK3sKKwlpbnQgaTsKKworCXByb2R1Y3RfaW5mby0+bWF4X2NvbW1hbmRzID0gaW5xdWlyeS0+YWRhcHRlcl9pbmZvLm1heF9jb21tYW5kczsKKwllbnF1aXJ5My0+cmVidWlsZF9yYXRlID0gaW5xdWlyeS0+YWRhcHRlcl9pbmZvLnJlYnVpbGRfcmF0ZTsKKwlwcm9kdWN0X2luZm8tPm5jaGFubmVscyA9IGlucXVpcnktPmFkYXB0ZXJfaW5mby5uY2hhbm5lbHM7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXByb2R1Y3RfaW5mby0+ZndfdmVyc2lvbltpXSA9CisJCQlpbnF1aXJ5LT5hZGFwdGVyX2luZm8uZndfdmVyc2lvbltpXTsKKworCQlwcm9kdWN0X2luZm8tPmJpb3NfdmVyc2lvbltpXSA9CisJCQlpbnF1aXJ5LT5hZGFwdGVyX2luZm8uYmlvc192ZXJzaW9uW2ldOworCX0KKwllbnF1aXJ5My0+Y2FjaGVfZmx1c2hfaW50ZXJ2YWwgPQorCQlpbnF1aXJ5LT5hZGFwdGVyX2luZm8uY2FjaGVfZmx1c2hfaW50ZXJ2YWw7CisKKwlwcm9kdWN0X2luZm8tPmRyYW1fc2l6ZSA9IGlucXVpcnktPmFkYXB0ZXJfaW5mby5kcmFtX3NpemU7CisKKwllbnF1aXJ5My0+bnVtX2xkcnYgPSBpbnF1aXJ5LT5sb2dkcnZfaW5mby5udW1fbGRydjsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTE9HSUNBTF9EUklWRVNfOExEOyBpKyspIHsKKwkJZW5xdWlyeTMtPmxkcnZfc2l6ZVtpXSA9IGlucXVpcnktPmxvZ2Rydl9pbmZvLmxkcnZfc2l6ZVtpXTsKKwkJZW5xdWlyeTMtPmxkcnZfcHJvcFtpXSA9IGlucXVpcnktPmxvZ2Rydl9pbmZvLmxkcnZfcHJvcFtpXTsKKwkJZW5xdWlyeTMtPmxkcnZfc3RhdGVbaV0gPSBpbnF1aXJ5LT5sb2dkcnZfaW5mby5sZHJ2X3N0YXRlW2ldOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAoTUFYX1BIWVNJQ0FMX0RSSVZFUyk7IGkrKykKKwkJZW5xdWlyeTMtPnBkcnZfc3RhdGVbaV0gPSBpbnF1aXJ5LT5wZHJ2X2luZm8ucGRydl9zdGF0ZVtpXTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCittZWdhX2ZyZWVfc2dsKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlzY2JfdAkqc2NiOworCWludAlpOworCisJZm9yKGkgPSAwOyBpIDwgYWRhcHRlci0+bWF4X2NtZHM7IGkrKykgeworCisJCXNjYiA9ICZhZGFwdGVyLT5zY2JfbGlzdFtpXTsKKworCQlpZiggc2NiLT5zZ2w2NCApIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+ZGV2LAorCQkJCXNpemVvZihtZWdhX3NnbDY0KSAqIGFkYXB0ZXItPnNnbGVuLAorCQkJCXNjYi0+c2dsNjQsCisJCQkJc2NiLT5zZ2xfZG1hX2FkZHIpOworCisJCQlzY2ItPnNnbDY0ID0gTlVMTDsKKwkJfQorCisJCWlmKCBzY2ItPnB0aHJ1ICkgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5kZXYsIHNpemVvZihtZWdhX3Bhc3N0aHJ1KSwKKwkJCQlzY2ItPnB0aHJ1LCBzY2ItPnB0aHJ1X2RtYV9hZGRyKTsKKworCQkJc2NiLT5wdGhydSA9IE5VTEw7CisJCX0KKworCQlpZiggc2NiLT5lcHRocnUgKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPmRldiwKKwkJCQlzaXplb2YobWVnYV9leHRfcGFzc3RocnUpLAorCQkJCXNjYi0+ZXB0aHJ1LCBzY2ItPmVwdGhydV9kbWFfYWRkcik7CisKKwkJCXNjYi0+ZXB0aHJ1ID0gTlVMTDsKKwkJfQorCisJfQorfQorCisKKy8qCisgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhcmQvZHJpdmVyCisgKi8KK2NvbnN0IGNoYXIgKgorbWVnYXJhaWRfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0YXRpYyBjaGFyIGJ1ZmZlcls1MTJdOworCWFkYXB0ZXJfdCAqYWRhcHRlcjsKKworCWFkYXB0ZXIgPSAoYWRhcHRlcl90ICopaG9zdC0+aG9zdGRhdGE7CisKKwlzcHJpbnRmIChidWZmZXIsCisJCSAiTFNJIExvZ2ljIE1lZ2FSQUlEICVzICVkIGNvbW1hbmRzICVkIHRhcmdzICVkIGNoYW5zICVkIGx1bnMiLAorCQkgYWRhcHRlci0+ZndfdmVyc2lvbiwgYWRhcHRlci0+cHJvZHVjdF9pbmZvLm1heF9jb21tYW5kcywKKwkJIGFkYXB0ZXItPmhvc3QtPm1heF9pZCwgYWRhcHRlci0+aG9zdC0+bWF4X2NoYW5uZWwsCisJCSBhZGFwdGVyLT5ob3N0LT5tYXhfbHVuKTsKKwlyZXR1cm4gYnVmZmVyOworfQorCisvKgorICogQWJvcnQgYSBwcmV2aW91cyBTQ1NJIHJlcXVlc3QuIE9ubHkgY29tbWFuZHMgb24gdGhlIHBlbmRpbmcgbGlzdCBjYW4gYmUKKyAqIGFib3J0ZWQuIEFsbCB0aGUgY29tbWFuZHMgaXNzdWVkIHRvIHRoZSBGL1cgbXVzdCBjb21wbGV0ZS4KKyAqLworc3RhdGljIGludAorbWVnYXJhaWRfYWJvcnQoU2NzaV9DbW5kICpjbWQpCit7CisJYWRhcHRlcl90CSphZGFwdGVyOworCWludAkJcnZhbDsKKworCWFkYXB0ZXIgPSAoYWRhcHRlcl90ICopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJcnZhbCA9ICBtZWdhcmFpZF9hYm9ydF9hbmRfcmVzZXQoYWRhcHRlciwgY21kLCBTQ0JfQUJPUlQpOworCisJLyoKKwkgKiBUaGlzIGlzIHJlcXVpcmVkIGhlcmUgdG8gY29tcGxldGUgYW55IGNvbXBsZXRlZCByZXF1ZXN0cworCSAqIHRvIGJlIGNvbW11bmljYXRlZCBvdmVyIHRvIHRoZSBtaWQgbGF5ZXIuCisJICovCisJbWVnYV9ydW5kb25lcShhZGFwdGVyKTsKKworCXJldHVybiBydmFsOworfQorCisKK3N0YXRpYyBpbnQKK21lZ2FyYWlkX3Jlc2V0KFNjc2lfQ21uZCAqY21kKQoreworCWFkYXB0ZXJfdAkqYWRhcHRlcjsKKwltZWdhY21kX3QJbWM7CisJaW50CQlydmFsOworCisJYWRhcHRlciA9IChhZGFwdGVyX3QgKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKyNpZiBNRUdBX0hBVkVfQ0xVU1RFUklORworCW1jLmNtZCA9IE1FR0FfQ0xVU1RFUl9DTUQ7CisJbWMub3Bjb2RlID0gTUVHQV9SRVNFVF9SRVNFUlZBVElPTlM7CisKKwlzcGluX3VubG9ja19pcnEoJmFkYXB0ZXItPmxvY2spOworCWlmKCBtZWdhX2ludGVybmFsX2NvbW1hbmQoYWRhcHRlciwgTE9DS19JTlQsICZtYywgTlVMTCkgIT0gMCApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJtZWdhcmFpZDogcmVzZXJ2YXRpb24gcmVzZXQgZmFpbGVkLlxuIik7CisJfQorCWVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJtZWdhcmFpZDogcmVzZXJ2YXRpb24gcmVzZXQuXG4iKTsKKwl9CisJc3Bpbl9sb2NrX2lycSgmYWRhcHRlci0+bG9jayk7CisjZW5kaWYKKworCXJ2YWwgPSAgbWVnYXJhaWRfYWJvcnRfYW5kX3Jlc2V0KGFkYXB0ZXIsIGNtZCwgU0NCX1JFU0VUKTsKKworCS8qCisJICogVGhpcyBpcyByZXF1aXJlZCBoZXJlIHRvIGNvbXBsZXRlIGFueSBjb21wbGV0ZWQgcmVxdWVzdHMKKwkgKiB0byBiZSBjb21tdW5pY2F0ZWQgb3ZlciB0byB0aGUgbWlkIGxheWVyLgorCSAqLworCW1lZ2FfcnVuZG9uZXEoYWRhcHRlcik7CisKKwlyZXR1cm4gcnZhbDsKK30KKworCisKKy8qKgorICogbWVnYXJhaWRfYWJvcnRfYW5kX3Jlc2V0KCkKKyAqIEBhZGFwdGVyIC0gbWVnYXJhaWQgc29mdCBzdGF0ZQorICogQGNtZCAtIHNjc2kgY29tbWFuZCB0byBiZSBhYm9ydGVkIG9yIHJlc2V0CisgKiBAYW9yIC0gYWJvcnQgb3IgcmVzZXQgZmxhZworICoKKyAqIFRyeSB0byBsb2NhdGUgdGhlIHNjc2kgY29tbWFuZCBpbiB0aGUgcGVuZGluZyBxdWV1ZS4gSWYgZm91bmQgYW5kIGlzIG5vdAorICogaXNzdWVkIHRvIHRoZSBjb250cm9sbGVyLCBhYm9ydC9yZXNldCBpdC4gT3RoZXJ3aXNlIHJldHVybiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FyYWlkX2Fib3J0X2FuZF9yZXNldChhZGFwdGVyX3QgKmFkYXB0ZXIsIFNjc2lfQ21uZCAqY21kLCBpbnQgYW9yKQoreworCXN0cnVjdCBsaXN0X2hlYWQJKnBvcywgKm5leHQ7CisJc2NiX3QJCQkqc2NiOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWQ6ICVzLSVseCBjbWQ9JXggPGM9JWQgdD0lZCBsPSVkPlxuIiwKKwkgICAgIChhb3IgPT0gU0NCX0FCT1JUKT8gIkFCT1JUSU5HIjoiUkVTRVQiLCBjbWQtPnNlcmlhbF9udW1iZXIsCisJICAgICBjbWQtPmNtbmRbMF0sIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCAKKwkgICAgIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisKKwlpZihsaXN0X2VtcHR5KCZhZGFwdGVyLT5wZW5kaW5nX2xpc3QpKQorCQlyZXR1cm4gRkFMU0U7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuZXh0LCAmYWRhcHRlci0+cGVuZGluZ19saXN0KSB7CisKKwkJc2NiID0gbGlzdF9lbnRyeShwb3MsIHNjYl90LCBsaXN0KTsKKworCQlpZiAoc2NiLT5jbWQgPT0gY21kKSB7IC8qIEZvdW5kIGNvbW1hbmQgKi8KKworCQkJc2NiLT5zdGF0ZSB8PSBhb3I7CisKKwkJCS8qCisJCQkgKiBDaGVjayBpZiB0aGlzIGNvbW1hbmQgaGFzIGZpcm1hcmUgb3dlbmVyc2hpcC4gSWYKKwkJCSAqIHllcywgd2UgY2Fubm90IHJlc2V0IHRoaXMgY29tbWFuZC4gV2hlbmV2ZXIsIGYvdworCQkJICogY29tcGxldGVzIHRoaXMgY29tbWFuZCwgd2Ugd2lsbCByZXR1cm4gYXBwcm9wcmlhdGUKKwkJCSAqIHN0YXR1cyBmcm9tIElTUi4KKwkJCSAqLworCQkJaWYoIHNjYi0+c3RhdGUgJiBTQ0JfSVNTVUVEICkgeworCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkibWVnYXJhaWQ6ICVzLSVseFsleF0sIGZ3IG93bmVyLlxuIiwKKwkJCQkJKGFvcj09U0NCX0FCT1JUKSA/ICJBQk9SVElORyI6IlJFU0VUIiwKKwkJCQkJY21kLT5zZXJpYWxfbnVtYmVyLCBzY2ItPmlkeCk7CisKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQllbHNlIHsKKworCQkJCS8qCisJCQkJICogTm90IHlldCBpc3N1ZWQhIFJlbW92ZSBmcm9tIHRoZSBwZW5kaW5nCisJCQkJICogbGlzdAorCQkJCSAqLworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJIm1lZ2FyYWlkOiAlcy0lbHhbJXhdLCBkcml2ZXIgb3duZXIuXG4iLAorCQkJCQkoYW9yPT1TQ0JfQUJPUlQpID8gIkFCT1JUSU5HIjoiUkVTRVQiLAorCQkJCQljbWQtPnNlcmlhbF9udW1iZXIsIHNjYi0+aWR4KTsKKworCQkJCW1lZ2FfZnJlZV9zY2IoYWRhcHRlciwgc2NiKTsKKworCQkJCWlmKCBhb3IgPT0gU0NCX0FCT1JUICkgeworCQkJCQljbWQtPnJlc3VsdCA9IChESURfQUJPUlQgPDwgMTYpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJY21kLT5yZXN1bHQgPSAoRElEX1JFU0VUIDw8IDE2KTsKKwkJCQl9CisKKwkJCQlsaXN0X2FkZF90YWlsKFNDU0lfTElTVChjbWQpLAorCQkJCQkJJmFkYXB0ZXItPmNvbXBsZXRlZF9saXN0KTsKKworCQkJCXJldHVybiBUUlVFOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW5saW5lIGludAorbWFrZV9sb2NhbF9wZGV2KGFkYXB0ZXJfdCAqYWRhcHRlciwgc3RydWN0IHBjaV9kZXYgKipwZGV2KQoreworCSpwZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9kZXYpLCBHRlBfS0VSTkVMKTsKKworCWlmKCAqcGRldiA9PSBOVUxMICkgcmV0dXJuIC0xOworCisJbWVtY3B5KCpwZGV2LCBhZGFwdGVyLT5kZXYsIHNpemVvZihzdHJ1Y3QgcGNpX2RldikpOworCisJaWYoIHBjaV9zZXRfZG1hX21hc2soKnBkZXYsIDB4ZmZmZmZmZmYpICE9IDAgKSB7CisJCWtmcmVlKCpwZGV2KTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZyZWVfbG9jYWxfcGRldihzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlrZnJlZShwZGV2KTsKK30KKworLyoqCisgKiBtZWdhX2FsbG9jYXRlX2lucXVpcnkoKQorICogQGRtYV9oYW5kbGUgLSBoYW5kbGUgcmV0dXJuZWQgZm9yIGRtYSBhZGRyZXNzCisgKiBAcGRldiAtIGhhbmRsZSB0byBwY2kgZGV2aWNlCisgKgorICogYWxsb2NhdGVzIG1lbW9yeSBmb3IgaW5xdWlyeSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkICoKK21lZ2FfYWxsb2NhdGVfaW5xdWlyeShkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlyZXR1cm4gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKG1lZ2FfaW5xdWlyeTMpLCBkbWFfaGFuZGxlKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQKK21lZ2FfZnJlZV9pbnF1aXJ5KHZvaWQgKmlucXVpcnksIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2YobWVnYV9pbnF1aXJ5MyksIGlucXVpcnksIGRtYV9oYW5kbGUpOworfQorCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworLyogRm9sbG93aW5nIGNvZGUgaGFuZGxlcyAvcHJvYyBmcyAgKi8KKworI2RlZmluZSBDUkVBVEVfUkVBRF9QUk9DKHN0cmluZywgZnVuYykJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShzdHJpbmcsCVwKKwkJCQkJU19JUlVTUiB8IFNfSUZSRUcsCQlcCisJCQkJCWNvbnRyb2xsZXJfcHJvY19kaXJfZW50cnksCVwKKwkJCQkJZnVuYywgYWRhcHRlcikKKworLyoqCisgKiBtZWdhX2NyZWF0ZV9wcm9jX2VudHJ5KCkKKyAqIEBpbmRleCAtIGluZGV4IGluIHNvZnQgc3RhdGUgYXJyYXkKKyAqIEBwYXJlbnQgLSBwYXJlbnQgbm9kZSBmb3IgdGhpcyAvcHJvYyBlbnRyeQorICoKKyAqIENyZWF0ZXMgL3Byb2MgZW50cmllcyBmb3Igb3VyIGNvbnRyb2xsZXJzLgorICovCitzdGF0aWMgdm9pZAorbWVnYV9jcmVhdGVfcHJvY19lbnRyeShpbnQgaW5kZXgsIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyZW50KQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqY29udHJvbGxlcl9wcm9jX2Rpcl9lbnRyeSA9IE5VTEw7CisJdTgJCXN0cmluZ1s2NF0gPSB7IDAgfTsKKwlhZGFwdGVyX3QJKmFkYXB0ZXIgPSBoYmFfc29mdF9zdGF0ZVtpbmRleF07CisKKwlzcHJpbnRmKHN0cmluZywgImhiYSVkIiwgYWRhcHRlci0+aG9zdC0+aG9zdF9ubyk7CisKKwljb250cm9sbGVyX3Byb2NfZGlyX2VudHJ5ID0KKwkJYWRhcHRlci0+Y29udHJvbGxlcl9wcm9jX2Rpcl9lbnRyeSA9IHByb2NfbWtkaXIoc3RyaW5nLCBwYXJlbnQpOworCisJaWYoIWNvbnRyb2xsZXJfcHJvY19kaXJfZW50cnkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiXG5tZWdhcmFpZDogcHJvY19ta2RpciBmYWlsZWRcbiIpOworCQlyZXR1cm47CisJfQorCWFkYXB0ZXItPnByb2NfcmVhZCA9IENSRUFURV9SRUFEX1BST0MoImNvbmZpZyIsIHByb2NfcmVhZF9jb25maWcpOworCWFkYXB0ZXItPnByb2Nfc3RhdCA9IENSRUFURV9SRUFEX1BST0MoInN0YXQiLCBwcm9jX3JlYWRfc3RhdCk7CisJYWRhcHRlci0+cHJvY19tYm94ID0gQ1JFQVRFX1JFQURfUFJPQygibWFpbGJveCIsIHByb2NfcmVhZF9tYm94KTsKKyNpZiBNRUdBX0hBVkVfRU5IX1BST0MKKwlhZGFwdGVyLT5wcm9jX3JyID0gQ1JFQVRFX1JFQURfUFJPQygicmVidWlsZC1yYXRlIiwgcHJvY19yZWJ1aWxkX3JhdGUpOworCWFkYXB0ZXItPnByb2NfYmF0dGVyeSA9IENSRUFURV9SRUFEX1BST0MoImJhdHRlcnktc3RhdHVzIiwKKwkJCXByb2NfYmF0dGVyeSk7CisKKwkvKgorCSAqIERpc3BsYXkgZWFjaCBwaHlzaWNhbCBkcml2ZSBvbiBpdHMgY2hhbm5lbAorCSAqLworCWFkYXB0ZXItPnByb2NfcGRydnN0YXRbMF0gPSBDUkVBVEVfUkVBRF9QUk9DKCJkaXNrZHJpdmVzLWNoMCIsCisJCQkJCXByb2NfcGRydl9jaDApOworCWFkYXB0ZXItPnByb2NfcGRydnN0YXRbMV0gPSBDUkVBVEVfUkVBRF9QUk9DKCJkaXNrZHJpdmVzLWNoMSIsCisJCQkJCXByb2NfcGRydl9jaDEpOworCWFkYXB0ZXItPnByb2NfcGRydnN0YXRbMl0gPSBDUkVBVEVfUkVBRF9QUk9DKCJkaXNrZHJpdmVzLWNoMiIsCisJCQkJCXByb2NfcGRydl9jaDIpOworCWFkYXB0ZXItPnByb2NfcGRydnN0YXRbM10gPSBDUkVBVEVfUkVBRF9QUk9DKCJkaXNrZHJpdmVzLWNoMyIsCisJCQkJCXByb2NfcGRydl9jaDMpOworCisJLyoKKwkgKiBEaXNwbGF5IGEgc2V0IG9mIHVwIHRvIDEwIGxvZ2ljYWwgZHJpdmUgdGhyb3VnaCBlYWNoIG9mIGZvbGxvd2luZworCSAqIC9wcm9jIGVudHJpZXMKKwkgKi8KKwlhZGFwdGVyLT5wcm9jX3JkcnZzdGF0WzBdID0gQ1JFQVRFX1JFQURfUFJPQygicmFpZGRyaXZlcy0wLTkiLAorCQkJCQlwcm9jX3JkcnZfMTApOworCWFkYXB0ZXItPnByb2NfcmRydnN0YXRbMV0gPSBDUkVBVEVfUkVBRF9QUk9DKCJyYWlkZHJpdmVzLTEwLTE5IiwKKwkJCQkJcHJvY19yZHJ2XzIwKTsKKwlhZGFwdGVyLT5wcm9jX3JkcnZzdGF0WzJdID0gQ1JFQVRFX1JFQURfUFJPQygicmFpZGRyaXZlcy0yMC0yOSIsCisJCQkJCXByb2NfcmRydl8zMCk7CisJYWRhcHRlci0+cHJvY19yZHJ2c3RhdFszXSA9IENSRUFURV9SRUFEX1BST0MoInJhaWRkcml2ZXMtMzAtMzkiLAorCQkJCQlwcm9jX3JkcnZfNDApOworI2VuZGlmCit9CisKKworLyoqCisgKiBwcm9jX3JlYWRfY29uZmlnKCkKKyAqIEBwYWdlIC0gYnVmZmVyIHRvIHdyaXRlIHRoZSBkYXRhIGluCisgKiBAc3RhcnQgLSB3aGVyZSB0aGUgYWN0dWFsIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiBpbiBwYWdlCisgKiBAb2Zmc2V0IC0gc2FtZSBtZWFuaW5nIGFzIHRoZSByZWFkIHN5c3RlbSBjYWxsCisgKiBAY291bnQgLSBzYW1lIG1lYW5pbmcgYXMgdGhlIHJlYWQgc3lzdGVtIGNhbGwKKyAqIEBlb2YgLSBzZXQgaWYgbm8gbW9yZSBkYXRhIG5lZWRzIHRvIGJlIHJldHVybmVkCisgKiBAZGF0YSAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiBEaXNwbGF5IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyBpbnQKK3Byb2NfcmVhZF9jb25maWcoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwgaW50ICplb2YsCisJCXZvaWQgKmRhdGEpCit7CisKKwlhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoYWRhcHRlcl90ICopZGF0YTsKKwlpbnQgbGVuID0gMDsKKworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiJXMiLCBNRUdBUkFJRF9WRVJTSU9OKTsKKworCWlmKGFkYXB0ZXItPnByb2R1Y3RfaW5mby5wcm9kdWN0X25hbWVbMF0pCisJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiJXNcbiIsCisJCQkJYWRhcHRlci0+cHJvZHVjdF9pbmZvLnByb2R1Y3RfbmFtZSk7CisKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIkNvbnRyb2xsZXIgVHlwZTogIik7CisKKwlpZiggYWRhcHRlci0+ZmxhZyAmIEJPQVJEX01FTU1BUCApIHsKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sCisJCQkiNDM4LzQ2Ni80NjcvNDcxLzQ5My81MTgvNTIwLzUzMS81MzJcbiIpOworCX0KKwllbHNlIHsKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sCisJCQkiNDE4LzQyOC80MzRcbiIpOworCX0KKworCWlmKGFkYXB0ZXItPmZsYWcgJiBCT0FSRF80MExEKSB7CisJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLAorCQkJCSJDb250cm9sbGVyIFN1cHBvcnRzIDQwIExvZ2ljYWwgRHJpdmVzXG4iKTsKKwl9CisKKwlpZihhZGFwdGVyLT5mbGFnICYgQk9BUkRfNjRCSVQpIHsKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sCisJCSJDb250cm9sbGVyIGNhcGFibGUgb2YgNjQtYml0IG1lbW9yeSBhZGRyZXNzaW5nXG4iKTsKKwl9CisJaWYoIGFkYXB0ZXItPmhhc182NGJpdF9hZGRyICkgeworCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwKKwkJCSJDb250cm9sbGVyIHVzaW5nIDY0LWJpdCBtZW1vcnkgYWRkcmVzc2luZ1xuIik7CisJfQorCWVsc2UgeworCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwKKwkJCSJDb250cm9sbGVyIGlzIG5vdCB1c2luZyA2NC1iaXQgbWVtb3J5IGFkZHJlc3NpbmdcbiIpOworCX0KKworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiQmFzZSA9ICUwOGx4LCBJcnEgPSAlZCwgIiwgYWRhcHRlci0+YmFzZSwKKwkJCWFkYXB0ZXItPmhvc3QtPmlycSk7CisKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIkxvZ2ljYWwgRHJpdmVzID0gJWQsIENoYW5uZWxzID0gJWRcbiIsCisJCQlhZGFwdGVyLT5udW1sZHJ2LCBhZGFwdGVyLT5wcm9kdWN0X2luZm8ubmNoYW5uZWxzKTsKKworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiVmVyc2lvbiA9JXM6JXMsIERSQU0gPSAlZE1iXG4iLAorCQkJYWRhcHRlci0+ZndfdmVyc2lvbiwgYWRhcHRlci0+Ymlvc192ZXJzaW9uLAorCQkJYWRhcHRlci0+cHJvZHVjdF9pbmZvLmRyYW1fc2l6ZSk7CisKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwKKwkJIkNvbnRyb2xsZXIgUXVldWUgRGVwdGggPSAlZCwgRHJpdmVyIFF1ZXVlIERlcHRoID0gJWRcbiIsCisJCWFkYXB0ZXItPnByb2R1Y3RfaW5mby5tYXhfY29tbWFuZHMsIGFkYXB0ZXItPm1heF9jbWRzKTsKKworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAic3VwcG9ydF9leHRfY2RiICAgID0gJWRcbiIsCisJCQlhZGFwdGVyLT5zdXBwb3J0X2V4dF9jZGIpOworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAic3VwcG9ydF9yYW5kb21fZGVsID0gJWRcbiIsCisJCQlhZGFwdGVyLT5zdXBwb3J0X3JhbmRvbV9kZWwpOworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiYm9vdF9sZHJ2X2VuYWJsZWQgID0gJWRcbiIsCisJCQlhZGFwdGVyLT5ib290X2xkcnZfZW5hYmxlZCk7CisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJib290X2xkcnYgICAgICAgICAgPSAlZFxuIiwKKwkJCWFkYXB0ZXItPmJvb3RfbGRydik7CisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJib290X3BkcnZfZW5hYmxlZCAgPSAlZFxuIiwKKwkJCWFkYXB0ZXItPmJvb3RfcGRydl9lbmFibGVkKTsKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgImJvb3RfcGRydl9jaCAgICAgICA9ICVkXG4iLAorCQkJYWRhcHRlci0+Ym9vdF9wZHJ2X2NoKTsKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgImJvb3RfcGRydl90Z3QgICAgICA9ICVkXG4iLAorCQkJYWRhcHRlci0+Ym9vdF9wZHJ2X3RndCk7CisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJxdWllc2NlbnQgICAgICAgICAgPSAlZFxuIiwKKwkJCWF0b21pY19yZWFkKCZhZGFwdGVyLT5xdWllc2NlbnQpKTsKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgImhhc19jbHVzdGVyICAgICAgICA9ICVkXG4iLAorCQkJYWRhcHRlci0+aGFzX2NsdXN0ZXIpOworCisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJcbk1vZHVsZSBQYXJhbWV0ZXJzOlxuIik7CisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJtYXhfY21kX3Blcl9sdW4gICAgPSAlZFxuIiwKKwkJCW1heF9jbWRfcGVyX2x1bik7CisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJtYXhfc2VjdG9yc19wZXJfaW8gPSAlZFxuIiwKKwkJCW1heF9zZWN0b3JzX3Blcl9pbyk7CisKKwkqZW9mID0gMTsKKworCXJldHVybiBsZW47Cit9CisKKworCisvKioKKyAqIHByb2NfcmVhZF9zdGF0KCkKKyAqIEBwYWdlIC0gYnVmZmVyIHRvIHdyaXRlIHRoZSBkYXRhIGluCisgKiBAc3RhcnQgLSB3aGVyZSB0aGUgYWN0dWFsIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiBpbiBwYWdlCisgKiBAb2Zmc2V0IC0gc2FtZSBtZWFuaW5nIGFzIHRoZSByZWFkIHN5c3RlbSBjYWxsCisgKiBAY291bnQgLSBzYW1lIG1lYW5pbmcgYXMgdGhlIHJlYWQgc3lzdGVtIGNhbGwKKyAqIEBlb2YgLSBzZXQgaWYgbm8gbW9yZSBkYXRhIG5lZWRzIHRvIGJlIHJldHVybmVkCisgKiBAZGF0YSAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiBEaWFwbGF5IHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBJL08gYWN0aXZpdHkuCisgKi8KK3N0YXRpYyBpbnQKK3Byb2NfcmVhZF9zdGF0KGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsIGludCAqZW9mLAorCQl2b2lkICpkYXRhKQoreworCWFkYXB0ZXJfdAkqYWRhcHRlcjsKKwlpbnQJbGVuOworCWludAlpOworCisJaSA9IDA7CS8qIGF2b2lkIGNvbXBpbGF0aW9uIHdhcm5pbmdzICovCisJbGVuID0gMDsKKwlhZGFwdGVyID0gKGFkYXB0ZXJfdCAqKWRhdGE7CisKKwlsZW4gPSBzcHJpbnRmKHBhZ2UsICJTdGF0aXN0aWNhbCBJbmZvcm1hdGlvbiBmb3IgdGhpcyBjb250cm9sbGVyXG4iKTsKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgInBlbmRfY21kcyA9ICVkXG4iLAorCQkJYXRvbWljX3JlYWQoJmFkYXB0ZXItPnBlbmRfY21kcykpOworI2lmIE1FR0FfSEFWRV9TVEFUUworCWZvcihpID0gMDsgaSA8IGFkYXB0ZXItPm51bWxkcnY7IGkrKykgeworCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIkxvZ2ljYWwgRHJpdmUgJWQ6XG4iLCBpKTsKKworCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwKKwkJCSJcdFJlYWRzIElzc3VlZCA9ICVsdSwgV3JpdGVzIElzc3VlZCA9ICVsdVxuIiwKKwkJCWFkYXB0ZXItPm5yZWFkc1tpXSwgYWRhcHRlci0+bndyaXRlc1tpXSk7CisKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sCisJCQkiXHRTZWN0b3JzIFJlYWQgPSAlbHUsIFNlY3RvcnMgV3JpdHRlbiA9ICVsdVxuIiwKKwkJCWFkYXB0ZXItPm5yZWFkYmxvY2tzW2ldLCBhZGFwdGVyLT5ud3JpdGVibG9ja3NbaV0pOworCisJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLAorCQkJIlx0UmVhZCBlcnJvcnMgPSAlbHUsIFdyaXRlIGVycm9ycyA9ICVsdVxuXG4iLAorCQkJYWRhcHRlci0+cmRfZXJyb3JzW2ldLCBhZGFwdGVyLT53cl9lcnJvcnNbaV0pOworCX0KKyNlbHNlCisJbGVuICs9IHNwcmludGYocGFnZStsZW4sCisJCQkiSU8gYW5kIGVycm9yIGNvdW50ZXJzIG5vdCBjb21waWxlZCBpbiBkcml2ZXIuXG4iKTsKKyNlbmRpZgorCisJKmVvZiA9IDE7CisKKwlyZXR1cm4gbGVuOworfQorCisKKy8qKgorICogcHJvY19yZWFkX21ib3goKQorICogQHBhZ2UgLSBidWZmZXIgdG8gd3JpdGUgdGhlIGRhdGEgaW4KKyAqIEBzdGFydCAtIHdoZXJlIHRoZSBhY3R1YWwgZGF0YSBoYXMgYmVlbiB3cml0dGVuIGluIHBhZ2UKKyAqIEBvZmZzZXQgLSBzYW1lIG1lYW5pbmcgYXMgdGhlIHJlYWQgc3lzdGVtIGNhbGwKKyAqIEBjb3VudCAtIHNhbWUgbWVhbmluZyBhcyB0aGUgcmVhZCBzeXN0ZW0gY2FsbAorICogQGVvZiAtIHNldCBpZiBubyBtb3JlIGRhdGEgbmVlZHMgdG8gYmUgcmV0dXJuZWQKKyAqIEBkYXRhIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICoKKyAqIERpc3BsYXkgbWFpbGJveCBpbmZvcm1hdGlvbiBmb3IgdGhlIGxhc3QgY29tbWFuZCBpc3N1ZWQuIFRoaXMgaW5mb3JtYXRpb24KKyAqIGlzIGdvb2QgZm9yIGRlYnVnZ2luZy4KKyAqLworc3RhdGljIGludAorcHJvY19yZWFkX21ib3goY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwgaW50ICplb2YsCisJCXZvaWQgKmRhdGEpCit7CisKKwlhZGFwdGVyX3QJKmFkYXB0ZXIgPSAoYWRhcHRlcl90ICopZGF0YTsKKwl2b2xhdGlsZSBtYm94X3QJKm1ib3ggPSBhZGFwdGVyLT5tYm94OworCWludAlsZW4gPSAwOworCisJbGVuID0gc3ByaW50ZihwYWdlLCAiQ29udGVudHMgb2YgTWFpbCBCb3ggU3RydWN0dXJlXG4iKTsKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiAgRncgQ29tbWFuZCAgID0gMHglMDJ4XG4iLCAKKwkJCW1ib3gtPm1fb3V0LmNtZCk7CisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIgIENtZCBTZXF1ZW5jZSA9IDB4JTAyeFxuIiwgCisJCQltYm94LT5tX291dC5jbWRpZCk7CisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIgIE5vIG9mIFNlY3RvcnM9ICUwNGRcbiIsIAorCQkJbWJveC0+bV9vdXQubnVtc2VjdG9ycyk7CisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIgIExCQSAgICAgICAgICA9IDB4JTAyeFxuIiwgCisJCQltYm94LT5tX291dC5sYmEpOworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiICBEVEEgICAgICAgICAgPSAweCUwOHhcbiIsIAorCQkJbWJveC0+bV9vdXQueGZlcmFkZHIpOworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiICBMb2dpY2FsIERyaXZlPSAweCUwMnhcbiIsIAorCQkJbWJveC0+bV9vdXQubG9nZHJ2KTsKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiAgTm8gb2YgU0cgRWxtdD0gMHglMDJ4XG4iLAorCQkJbWJveC0+bV9vdXQubnVtc2dlbGVtZW50cyk7CisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIgIEJ1c3kgICAgICAgICA9ICUwMXhcbiIsIAorCQkJbWJveC0+bV9pbi5idXN5KTsKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiAgU3RhdHVzICAgICAgID0gMHglMDJ4XG4iLCAKKwkJCW1ib3gtPm1faW4uc3RhdHVzKTsKKworCSplb2YgPSAxOworCisJcmV0dXJuIGxlbjsKK30KKworCisvKioKKyAqIHByb2NfcmVidWlsZF9yYXRlKCkKKyAqIEBwYWdlIC0gYnVmZmVyIHRvIHdyaXRlIHRoZSBkYXRhIGluCisgKiBAc3RhcnQgLSB3aGVyZSB0aGUgYWN0dWFsIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiBpbiBwYWdlCisgKiBAb2Zmc2V0IC0gc2FtZSBtZWFuaW5nIGFzIHRoZSByZWFkIHN5c3RlbSBjYWxsCisgKiBAY291bnQgLSBzYW1lIG1lYW5pbmcgYXMgdGhlIHJlYWQgc3lzdGVtIGNhbGwKKyAqIEBlb2YgLSBzZXQgaWYgbm8gbW9yZSBkYXRhIG5lZWRzIHRvIGJlIHJldHVybmVkCisgKiBAZGF0YSAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiBEaXNwbGF5IGN1cnJlbnQgcmVidWlsZCByYXRlCisgKi8KK3N0YXRpYyBpbnQKK3Byb2NfcmVidWlsZF9yYXRlKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsIGludCAqZW9mLAorCQl2b2lkICpkYXRhKQoreworCWFkYXB0ZXJfdAkqYWRhcHRlciA9IChhZGFwdGVyX3QgKilkYXRhOworCWRtYV9hZGRyX3QJZG1hX2hhbmRsZTsKKwljYWRkcl90CQlpbnF1aXJ5OworCXN0cnVjdCBwY2lfZGV2CSpwZGV2OworCWludAlsZW4gPSAwOworCisJaWYoIG1ha2VfbG9jYWxfcGRldihhZGFwdGVyLCAmcGRldikgIT0gMCApIHsKKwkJKmVvZiA9IDE7CisJCXJldHVybiBsZW47CisJfQorCisJaWYoIChpbnF1aXJ5ID0gbWVnYV9hbGxvY2F0ZV9pbnF1aXJ5KCZkbWFfaGFuZGxlLCBwZGV2KSkgPT0gTlVMTCApIHsKKwkJZnJlZV9sb2NhbF9wZGV2KHBkZXYpOworCQkqZW9mID0gMTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlpZiggbWVnYV9hZGFwaW5xKGFkYXB0ZXIsIGRtYV9oYW5kbGUpICE9IDAgKSB7CisKKwkJbGVuID0gc3ByaW50ZihwYWdlLCAiQWRhcHRlciBpbnF1aXJ5IGZhaWxlZC5cbiIpOworCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkOiBpbnF1aXJ5IGZhaWxlZC5cbiIpOworCisJCW1lZ2FfZnJlZV9pbnF1aXJ5KGlucXVpcnksIGRtYV9oYW5kbGUsIHBkZXYpOworCisJCWZyZWVfbG9jYWxfcGRldihwZGV2KTsKKworCQkqZW9mID0gMTsKKworCQlyZXR1cm4gbGVuOworCX0KKworCWlmKCBhZGFwdGVyLT5mbGFnICYgQk9BUkRfNDBMRCApIHsKKwkJbGVuID0gc3ByaW50ZihwYWdlLCAiUmVidWlsZCBSYXRlOiBbJWQlJV1cbiIsCisJCQkoKG1lZ2FfaW5xdWlyeTMgKilpbnF1aXJ5KS0+cmVidWlsZF9yYXRlKTsKKwl9CisJZWxzZSB7CisJCWxlbiA9IHNwcmludGYocGFnZSwgIlJlYnVpbGQgUmF0ZTogWyVkJSVdXG4iLAorCQkJKChtcmFpZF9leHRfaW5xdWlyeSAqKQorCQkJaW5xdWlyeSktPnJhaWRfaW5xLmFkYXB0ZXJfaW5mby5yZWJ1aWxkX3JhdGUpOworCX0KKworCisJbWVnYV9mcmVlX2lucXVpcnkoaW5xdWlyeSwgZG1hX2hhbmRsZSwgcGRldik7CisKKwlmcmVlX2xvY2FsX3BkZXYocGRldik7CisKKwkqZW9mID0gMTsKKworCXJldHVybiBsZW47Cit9CisKKworLyoqCisgKiBwcm9jX2JhdHRlcnkoKQorICogQHBhZ2UgLSBidWZmZXIgdG8gd3JpdGUgdGhlIGRhdGEgaW4KKyAqIEBzdGFydCAtIHdoZXJlIHRoZSBhY3R1YWwgZGF0YSBoYXMgYmVlbiB3cml0dGVuIGluIHBhZ2UKKyAqIEBvZmZzZXQgLSBzYW1lIG1lYW5pbmcgYXMgdGhlIHJlYWQgc3lzdGVtIGNhbGwKKyAqIEBjb3VudCAtIHNhbWUgbWVhbmluZyBhcyB0aGUgcmVhZCBzeXN0ZW0gY2FsbAorICogQGVvZiAtIHNldCBpZiBubyBtb3JlIGRhdGEgbmVlZHMgdG8gYmUgcmV0dXJuZWQKKyAqIEBkYXRhIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICoKKyAqIERpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhdHRlcnkgbW9kdWxlIG9uIHRoZSBjb250cm9sbGVyLgorICovCitzdGF0aWMgaW50Citwcm9jX2JhdHRlcnkoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwgaW50ICplb2YsCisJCXZvaWQgKmRhdGEpCit7CisJYWRhcHRlcl90CSphZGFwdGVyID0gKGFkYXB0ZXJfdCAqKWRhdGE7CisJZG1hX2FkZHJfdAlkbWFfaGFuZGxlOworCWNhZGRyX3QJCWlucXVpcnk7CisJc3RydWN0IHBjaV9kZXYJKnBkZXY7CisJdTgJYmF0dGVyeV9zdGF0dXMgPSAwOworCWNoYXIJc3RyWzI1Nl07CisJaW50CWxlbiA9IDA7CisKKwlpZiggbWFrZV9sb2NhbF9wZGV2KGFkYXB0ZXIsICZwZGV2KSAhPSAwICkgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlpZiggKGlucXVpcnkgPSBtZWdhX2FsbG9jYXRlX2lucXVpcnkoJmRtYV9oYW5kbGUsIHBkZXYpKSA9PSBOVUxMICkgeworCQlmcmVlX2xvY2FsX3BkZXYocGRldik7CisJCSplb2YgPSAxOworCQlyZXR1cm4gbGVuOworCX0KKworCWlmKCBtZWdhX2FkYXBpbnEoYWRhcHRlciwgZG1hX2hhbmRsZSkgIT0gMCApIHsKKworCQlsZW4gPSBzcHJpbnRmKHBhZ2UsICJBZGFwdGVyIGlucXVpcnkgZmFpbGVkLlxuIik7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWQ6IGlucXVpcnkgZmFpbGVkLlxuIik7CisKKwkJbWVnYV9mcmVlX2lucXVpcnkoaW5xdWlyeSwgZG1hX2hhbmRsZSwgcGRldik7CisKKwkJZnJlZV9sb2NhbF9wZGV2KHBkZXYpOworCisJCSplb2YgPSAxOworCisJCXJldHVybiBsZW47CisJfQorCisJaWYoIGFkYXB0ZXItPmZsYWcgJiBCT0FSRF80MExEICkgeworCQliYXR0ZXJ5X3N0YXR1cyA9ICgobWVnYV9pbnF1aXJ5MyAqKWlucXVpcnkpLT5iYXR0ZXJ5X3N0YXR1czsKKwl9CisJZWxzZSB7CisJCWJhdHRlcnlfc3RhdHVzID0gKChtcmFpZF9leHRfaW5xdWlyeSAqKWlucXVpcnkpLT4KKwkJCXJhaWRfaW5xLmFkYXB0ZXJfaW5mby5iYXR0ZXJ5X3N0YXR1czsKKwl9CisKKwkvKgorCSAqIERlY29kZSB0aGUgYmF0dGVyeSBzdGF0dXMKKwkgKi8KKwlzcHJpbnRmKHN0ciwgIkJhdHRlcnkgU3RhdHVzOlslZF0iLCBiYXR0ZXJ5X3N0YXR1cyk7CisKKwlpZihiYXR0ZXJ5X3N0YXR1cyA9PSBNRUdBX0JBVFRfQ0hBUkdFX0RPTkUpCisJCXN0cmNhdChzdHIsICIgQ2hhcmdlIERvbmUiKTsKKworCWlmKGJhdHRlcnlfc3RhdHVzICYgTUVHQV9CQVRUX01PRFVMRV9NSVNTSU5HKQorCQlzdHJjYXQoc3RyLCAiIE1vZHVsZSBNaXNzaW5nIik7CisJCisJaWYoYmF0dGVyeV9zdGF0dXMgJiBNRUdBX0JBVFRfTE9XX1ZPTFRBR0UpCisJCXN0cmNhdChzdHIsICIgTG93IFZvbHRhZ2UiKTsKKwkKKwlpZihiYXR0ZXJ5X3N0YXR1cyAmIE1FR0FfQkFUVF9URU1QX0hJR0gpCisJCXN0cmNhdChzdHIsICIgVGVtcGVyYXR1cmUgSGlnaCIpOworCQorCWlmKGJhdHRlcnlfc3RhdHVzICYgTUVHQV9CQVRUX1BBQ0tfTUlTU0lORykKKwkJc3RyY2F0KHN0ciwgIiBQYWNrIE1pc3NpbmciKTsKKwkKKwlpZihiYXR0ZXJ5X3N0YXR1cyAmIE1FR0FfQkFUVF9DSEFSR0VfSU5QUk9HKQorCQlzdHJjYXQoc3RyLCAiIENoYXJnZSBJbi1wcm9ncmVzcyIpOworCQorCWlmKGJhdHRlcnlfc3RhdHVzICYgTUVHQV9CQVRUX0NIQVJHRV9GQUlMKQorCQlzdHJjYXQoc3RyLCAiIENoYXJnZSBGYWlsIik7CisJCisJaWYoYmF0dGVyeV9zdGF0dXMgJiBNRUdBX0JBVFRfQ1lDTEVTX0VYQ0VFREVEKQorCQlzdHJjYXQoc3RyLCAiIEN5Y2xlcyBFeGNlZWRlZCIpOworCisJbGVuID0gc3ByaW50ZihwYWdlLCAiJXNcbiIsIHN0cik7CisKKworCW1lZ2FfZnJlZV9pbnF1aXJ5KGlucXVpcnksIGRtYV9oYW5kbGUsIHBkZXYpOworCisJZnJlZV9sb2NhbF9wZGV2KHBkZXYpOworCisJKmVvZiA9IDE7CisKKwlyZXR1cm4gbGVuOworfQorCisKKy8qKgorICogcHJvY19wZHJ2X2NoMCgpCisgKiBAcGFnZSAtIGJ1ZmZlciB0byB3cml0ZSB0aGUgZGF0YSBpbgorICogQHN0YXJ0IC0gd2hlcmUgdGhlIGFjdHVhbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gaW4gcGFnZQorICogQG9mZnNldCAtIHNhbWUgbWVhbmluZyBhcyB0aGUgcmVhZCBzeXN0ZW0gY2FsbAorICogQGNvdW50IC0gc2FtZSBtZWFuaW5nIGFzIHRoZSByZWFkIHN5c3RlbSBjYWxsCisgKiBAZW9mIC0gc2V0IGlmIG5vIG1vcmUgZGF0YSBuZWVkcyB0byBiZSByZXR1cm5lZAorICogQGRhdGEgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKgorICogRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGh5c2ljYWwgZHJpdmVzIG9uIHBoeXNpY2FsIGNoYW5uZWwgMC4KKyAqLworc3RhdGljIGludAorcHJvY19wZHJ2X2NoMChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGNvdW50LCBpbnQgKmVvZiwKKwkJdm9pZCAqZGF0YSkKK3sKKwlhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoYWRhcHRlcl90ICopZGF0YTsKKworCSplb2YgPSAxOworCisJcmV0dXJuIChwcm9jX3BkcnYoYWRhcHRlciwgcGFnZSwgMCkpOworfQorCisKKy8qKgorICogcHJvY19wZHJ2X2NoMSgpCisgKiBAcGFnZSAtIGJ1ZmZlciB0byB3cml0ZSB0aGUgZGF0YSBpbgorICogQHN0YXJ0IC0gd2hlcmUgdGhlIGFjdHVhbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gaW4gcGFnZQorICogQG9mZnNldCAtIHNhbWUgbWVhbmluZyBhcyB0aGUgcmVhZCBzeXN0ZW0gY2FsbAorICogQGNvdW50IC0gc2FtZSBtZWFuaW5nIGFzIHRoZSByZWFkIHN5c3RlbSBjYWxsCisgKiBAZW9mIC0gc2V0IGlmIG5vIG1vcmUgZGF0YSBuZWVkcyB0byBiZSByZXR1cm5lZAorICogQGRhdGEgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKgorICogRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGh5c2ljYWwgZHJpdmVzIG9uIHBoeXNpY2FsIGNoYW5uZWwgMS4KKyAqLworc3RhdGljIGludAorcHJvY19wZHJ2X2NoMShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGNvdW50LCBpbnQgKmVvZiwKKwkJdm9pZCAqZGF0YSkKK3sKKwlhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoYWRhcHRlcl90ICopZGF0YTsKKworCSplb2YgPSAxOworCisJcmV0dXJuIChwcm9jX3BkcnYoYWRhcHRlciwgcGFnZSwgMSkpOworfQorCisKKy8qKgorICogcHJvY19wZHJ2X2NoMigpCisgKiBAcGFnZSAtIGJ1ZmZlciB0byB3cml0ZSB0aGUgZGF0YSBpbgorICogQHN0YXJ0IC0gd2hlcmUgdGhlIGFjdHVhbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gaW4gcGFnZQorICogQG9mZnNldCAtIHNhbWUgbWVhbmluZyBhcyB0aGUgcmVhZCBzeXN0ZW0gY2FsbAorICogQGNvdW50IC0gc2FtZSBtZWFuaW5nIGFzIHRoZSByZWFkIHN5c3RlbSBjYWxsCisgKiBAZW9mIC0gc2V0IGlmIG5vIG1vcmUgZGF0YSBuZWVkcyB0byBiZSByZXR1cm5lZAorICogQGRhdGEgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKgorICogRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGh5c2ljYWwgZHJpdmVzIG9uIHBoeXNpY2FsIGNoYW5uZWwgMi4KKyAqLworc3RhdGljIGludAorcHJvY19wZHJ2X2NoMihjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGNvdW50LCBpbnQgKmVvZiwKKwkJdm9pZCAqZGF0YSkKK3sKKwlhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoYWRhcHRlcl90ICopZGF0YTsKKworCSplb2YgPSAxOworCisJcmV0dXJuIChwcm9jX3BkcnYoYWRhcHRlciwgcGFnZSwgMikpOworfQorCisKKy8qKgorICogcHJvY19wZHJ2X2NoMygpCisgKiBAcGFnZSAtIGJ1ZmZlciB0byB3cml0ZSB0aGUgZGF0YSBpbgorICogQHN0YXJ0IC0gd2hlcmUgdGhlIGFjdHVhbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gaW4gcGFnZQorICogQG9mZnNldCAtIHNhbWUgbWVhbmluZyBhcyB0aGUgcmVhZCBzeXN0ZW0gY2FsbAorICogQGNvdW50IC0gc2FtZSBtZWFuaW5nIGFzIHRoZSByZWFkIHN5c3RlbSBjYWxsCisgKiBAZW9mIC0gc2V0IGlmIG5vIG1vcmUgZGF0YSBuZWVkcyB0byBiZSByZXR1cm5lZAorICogQGRhdGEgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKgorICogRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGh5c2ljYWwgZHJpdmVzIG9uIHBoeXNpY2FsIGNoYW5uZWwgMy4KKyAqLworc3RhdGljIGludAorcHJvY19wZHJ2X2NoMyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGNvdW50LCBpbnQgKmVvZiwKKwkJdm9pZCAqZGF0YSkKK3sKKwlhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoYWRhcHRlcl90ICopZGF0YTsKKworCSplb2YgPSAxOworCisJcmV0dXJuIChwcm9jX3BkcnYoYWRhcHRlciwgcGFnZSwgMykpOworfQorCisKKy8qKgorICogcHJvY19wZHJ2KCkKKyAqIEBwYWdlIC0gYnVmZmVyIHRvIHdyaXRlIHRoZSBkYXRhIGluCisgKiBAYWRhcHRlciAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiBEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBwaHlzaWNhbCBkcml2ZXMuCisgKi8KK3N0YXRpYyBpbnQKK3Byb2NfcGRydihhZGFwdGVyX3QgKmFkYXB0ZXIsIGNoYXIgKnBhZ2UsIGludCBjaGFubmVsKQoreworCWRtYV9hZGRyX3QJZG1hX2hhbmRsZTsKKwljaGFyCQkqc2NzaV9pbnE7CisJZG1hX2FkZHJfdAlzY3NpX2lucV9kbWFfaGFuZGxlOworCWNhZGRyX3QJCWlucXVpcnk7CisJc3RydWN0IHBjaV9kZXYJKnBkZXY7CisJdTgJKnBkcnZfc3RhdGU7CisJdTgJc3RhdGU7CisJaW50CXRndDsKKwlpbnQJbWF4X2NoYW5uZWxzOworCWludAlsZW4gPSAwOworCWNoYXIJc3RyWzgwXTsKKwlpbnQJaTsKKworCWlmKCBtYWtlX2xvY2FsX3BkZXYoYWRhcHRlciwgJnBkZXYpICE9IDAgKSB7CisJCXJldHVybiBsZW47CisJfQorCisJaWYoIChpbnF1aXJ5ID0gbWVnYV9hbGxvY2F0ZV9pbnF1aXJ5KCZkbWFfaGFuZGxlLCBwZGV2KSkgPT0gTlVMTCApIHsKKwkJZ290byBmcmVlX3BkZXY7CisJfQorCisJaWYoIG1lZ2FfYWRhcGlucShhZGFwdGVyLCBkbWFfaGFuZGxlKSAhPSAwICkgeworCQlsZW4gPSBzcHJpbnRmKHBhZ2UsICJBZGFwdGVyIGlucXVpcnkgZmFpbGVkLlxuIik7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWQ6IGlucXVpcnkgZmFpbGVkLlxuIik7CisKKwkJZ290byBmcmVlX2lucXVpcnk7CisJfQorCisKKwlzY3NpX2lucSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIDI1NiwgJnNjc2lfaW5xX2RtYV9oYW5kbGUpOworCisJaWYoIHNjc2lfaW5xID09IE5VTEwgKSB7CisJCWxlbiA9IHNwcmludGYocGFnZSwgIm1lbW9yeSBub3QgYXZhaWxhYmxlIGZvciBzY3NpIGlucS5cbiIpOworCisJCWdvdG8gZnJlZV9pbnF1aXJ5OworCX0KKworCWlmKCBhZGFwdGVyLT5mbGFnICYgQk9BUkRfNDBMRCApIHsKKwkJcGRydl9zdGF0ZSA9ICgobWVnYV9pbnF1aXJ5MyAqKWlucXVpcnkpLT5wZHJ2X3N0YXRlOworCX0KKwllbHNlIHsKKwkJcGRydl9zdGF0ZSA9ICgobXJhaWRfZXh0X2lucXVpcnkgKilpbnF1aXJ5KS0+CisJCQlyYWlkX2lucS5wZHJ2X2luZm8ucGRydl9zdGF0ZTsKKwl9CisKKwltYXhfY2hhbm5lbHMgPSBhZGFwdGVyLT5wcm9kdWN0X2luZm8ubmNoYW5uZWxzOworCisJaWYoIGNoYW5uZWwgPj0gbWF4X2NoYW5uZWxzICkgeworCQlnb3RvIGZyZWVfcGNpOworCX0KKworCWZvciggdGd0ID0gMDsgdGd0IDw9IE1BWF9UQVJHRVQ7IHRndCsrICkgeworCisJCWkgPSBjaGFubmVsKjE2ICsgdGd0OworCisJCXN0YXRlID0gKihwZHJ2X3N0YXRlICsgaSk7CisKKwkJc3dpdGNoKCBzdGF0ZSAmIDB4MEYgKSB7CisKKwkJY2FzZSBQRFJWX09OTElORToKKwkJCXNwcmludGYoc3RyLAorCQkJIkNoYW5uZWw6JTJkIElkOiUyZCBTdGF0ZTogT25saW5lIiwKKwkJCQljaGFubmVsLCB0Z3QpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQRFJWX0ZBSUxFRDoKKwkJCXNwcmludGYoc3RyLAorCQkJIkNoYW5uZWw6JTJkIElkOiUyZCBTdGF0ZTogRmFpbGVkIiwKKwkJCQljaGFubmVsLCB0Z3QpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQRFJWX1JCTEQ6CisJCQlzcHJpbnRmKHN0ciwKKwkJCSJDaGFubmVsOiUyZCBJZDolMmQgU3RhdGU6IFJlYnVpbGQiLAorCQkJCWNoYW5uZWwsIHRndCk7CisJCQlicmVhazsKKworCQljYXNlIFBEUlZfSE9UU1BBUkU6CisJCQlzcHJpbnRmKHN0ciwKKwkJCSJDaGFubmVsOiUyZCBJZDolMmQgU3RhdGU6IEhvdCBzcGFyZSIsCisJCQkJY2hhbm5lbCwgdGd0KTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHN0ciwKKwkJCSJDaGFubmVsOiUyZCBJZDolMmQgU3RhdGU6IFVuLWNvbmZpZ3VyZWQiLAorCQkJCWNoYW5uZWwsIHRndCk7CisJCQlicmVhazsKKworCQl9CisKKwkJLyoKKwkJICogVGhpcyBpbnRlcmZhY2UgZGlzcGxheXMgaW5xdWlyaWVzIGZvciBkaXNrIGRyaXZlcworCQkgKiBvbmx5LiBJbnF1cmllcyBmb3IgbG9naWNhbCBkcml2ZXMgYW5kIG5vbi1kaXNrCisJCSAqIGRldmljZXMgYXJlIGF2YWlsYWJsZSB0aHJvdWdoIC9wcm9jL3Njc2kvc2NzaQorCQkgKi8KKwkJbWVtc2V0KHNjc2lfaW5xLCAwLCAyNTYpOworCQlpZiggbWVnYV9pbnRlcm5hbF9kZXZfaW5xdWlyeShhZGFwdGVyLCBjaGFubmVsLCB0Z3QsCisJCQkJc2NzaV9pbnFfZG1hX2hhbmRsZSkgfHwKKwkJCQkoc2NzaV9pbnFbMF0gJiAweDFGKSAhPSBUWVBFX0RJU0sgKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIENoZWNrIGZvciBvdmVyZmxvdy4gV2UgcHJpbnQgbGVzcyB0aGFuIDI0MAorCQkgKiBjaGFyYWN0ZXJzIGZvciBpbnF1aXJ5CisJCSAqLworCQlpZiggKGxlbiArIDI0MCkgPj0gUEFHRV9TSVpFICkgYnJlYWs7CisKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIlcy5cbiIsIHN0cik7CisKKwkJbGVuICs9IG1lZ2FfcHJpbnRfaW5xdWlyeShwYWdlK2xlbiwgc2NzaV9pbnEpOworCX0KKworZnJlZV9wY2k6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCAyNTYsIHNjc2lfaW5xLCBzY3NpX2lucV9kbWFfaGFuZGxlKTsKK2ZyZWVfaW5xdWlyeToKKwltZWdhX2ZyZWVfaW5xdWlyeShpbnF1aXJ5LCBkbWFfaGFuZGxlLCBwZGV2KTsKK2ZyZWVfcGRldjoKKwlmcmVlX2xvY2FsX3BkZXYocGRldik7CisKKwlyZXR1cm4gbGVuOworfQorCisKKy8qCisgKiBEaXNwbGF5IHNjc2kgaW5xdWlyeQorICovCitzdGF0aWMgaW50CittZWdhX3ByaW50X2lucXVpcnkoY2hhciAqcGFnZSwgY2hhciAqc2NzaV9pbnEpCit7CisJaW50CWxlbiA9IDA7CisJaW50CWk7CisKKwlsZW4gPSBzcHJpbnRmKHBhZ2UsICIgIFZlbmRvcjogIik7CisJZm9yKCBpID0gODsgaSA8IDE2OyBpKysgKSB7CisJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiJWMiLCBzY3NpX2lucVtpXSk7CisJfQorCisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIgIE1vZGVsOiAiKTsKKworCWZvciggaSA9IDE2OyBpIDwgMzI7IGkrKyApIHsKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIlYyIsIHNjc2lfaW5xW2ldKTsKKwl9CisKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiAgUmV2OiAiKTsKKworCWZvciggaSA9IDMyOyBpIDwgMzY7IGkrKyApIHsKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIlYyIsIHNjc2lfaW5xW2ldKTsKKwl9CisKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIlxuIik7CisKKwlpID0gc2NzaV9pbnFbMF0gJiAweDFmOworCisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIgIFR5cGU6ICAgJXMgIiwKKwkJaSA8IE1BWF9TQ1NJX0RFVklDRV9DT0RFID8gc2NzaV9kZXZpY2VfdHlwZXNbaV0gOgorCQkgICAiVW5rbm93biAgICAgICAgICAiKTsKKworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLAorCSIgICAgICAgICAgICAgICAgIEFOU0kgU0NTSSByZXZpc2lvbjogJTAyeCIsIHNjc2lfaW5xWzJdICYgMHgwNyk7CisKKwlpZiggKHNjc2lfaW5xWzJdICYgMHgwNykgPT0gMSAmJiAoc2NzaV9pbnFbM10gJiAweDBmKSA9PSAxICkKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIgQ0NTXG4iKTsKKwllbHNlCisJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiXG4iKTsKKworCXJldHVybiBsZW47Cit9CisKKworLyoqCisgKiBwcm9jX3JkcnZfMTAoKQorICogQHBhZ2UgLSBidWZmZXIgdG8gd3JpdGUgdGhlIGRhdGEgaW4KKyAqIEBzdGFydCAtIHdoZXJlIHRoZSBhY3R1YWwgZGF0YSBoYXMgYmVlbiB3cml0dGVuIGluIHBhZ2UKKyAqIEBvZmZzZXQgLSBzYW1lIG1lYW5pbmcgYXMgdGhlIHJlYWQgc3lzdGVtIGNhbGwKKyAqIEBjb3VudCAtIHNhbWUgbWVhbmluZyBhcyB0aGUgcmVhZCBzeXN0ZW0gY2FsbAorICogQGVvZiAtIHNldCBpZiBubyBtb3JlIGRhdGEgbmVlZHMgdG8gYmUgcmV0dXJuZWQKKyAqIEBkYXRhIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICoKKyAqIERpc3BsYXkgcmVhbCB0aW1lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2dpY2FsIGRyaXZlcyAwIHRocm91Z2ggOS4KKyAqLworc3RhdGljIGludAorcHJvY19yZHJ2XzEwKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsIGludCAqZW9mLAorCQl2b2lkICpkYXRhKQoreworCWFkYXB0ZXJfdCAqYWRhcHRlciA9IChhZGFwdGVyX3QgKilkYXRhOworCisJKmVvZiA9IDE7CisKKwlyZXR1cm4gKHByb2NfcmRydihhZGFwdGVyLCBwYWdlLCAwLCA5KSk7Cit9CisKKworLyoqCisgKiBwcm9jX3JkcnZfMjAoKQorICogQHBhZ2UgLSBidWZmZXIgdG8gd3JpdGUgdGhlIGRhdGEgaW4KKyAqIEBzdGFydCAtIHdoZXJlIHRoZSBhY3R1YWwgZGF0YSBoYXMgYmVlbiB3cml0dGVuIGluIHBhZ2UKKyAqIEBvZmZzZXQgLSBzYW1lIG1lYW5pbmcgYXMgdGhlIHJlYWQgc3lzdGVtIGNhbGwKKyAqIEBjb3VudCAtIHNhbWUgbWVhbmluZyBhcyB0aGUgcmVhZCBzeXN0ZW0gY2FsbAorICogQGVvZiAtIHNldCBpZiBubyBtb3JlIGRhdGEgbmVlZHMgdG8gYmUgcmV0dXJuZWQKKyAqIEBkYXRhIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICoKKyAqIERpc3BsYXkgcmVhbCB0aW1lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2dpY2FsIGRyaXZlcyAwIHRocm91Z2ggOS4KKyAqLworc3RhdGljIGludAorcHJvY19yZHJ2XzIwKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsIGludCAqZW9mLAorCQl2b2lkICpkYXRhKQoreworCWFkYXB0ZXJfdCAqYWRhcHRlciA9IChhZGFwdGVyX3QgKilkYXRhOworCisJKmVvZiA9IDE7CisKKwlyZXR1cm4gKHByb2NfcmRydihhZGFwdGVyLCBwYWdlLCAxMCwgMTkpKTsKK30KKworCisvKioKKyAqIHByb2NfcmRydl8zMCgpCisgKiBAcGFnZSAtIGJ1ZmZlciB0byB3cml0ZSB0aGUgZGF0YSBpbgorICogQHN0YXJ0IC0gd2hlcmUgdGhlIGFjdHVhbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gaW4gcGFnZQorICogQG9mZnNldCAtIHNhbWUgbWVhbmluZyBhcyB0aGUgcmVhZCBzeXN0ZW0gY2FsbAorICogQGNvdW50IC0gc2FtZSBtZWFuaW5nIGFzIHRoZSByZWFkIHN5c3RlbSBjYWxsCisgKiBAZW9mIC0gc2V0IGlmIG5vIG1vcmUgZGF0YSBuZWVkcyB0byBiZSByZXR1cm5lZAorICogQGRhdGEgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKgorICogRGlzcGxheSByZWFsIHRpbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvZ2ljYWwgZHJpdmVzIDAgdGhyb3VnaCA5LgorICovCitzdGF0aWMgaW50Citwcm9jX3JkcnZfMzAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwgaW50ICplb2YsCisJCXZvaWQgKmRhdGEpCit7CisJYWRhcHRlcl90ICphZGFwdGVyID0gKGFkYXB0ZXJfdCAqKWRhdGE7CisKKwkqZW9mID0gMTsKKworCXJldHVybiAocHJvY19yZHJ2KGFkYXB0ZXIsIHBhZ2UsIDIwLCAyOSkpOworfQorCisKKy8qKgorICogcHJvY19yZHJ2XzQwKCkKKyAqIEBwYWdlIC0gYnVmZmVyIHRvIHdyaXRlIHRoZSBkYXRhIGluCisgKiBAc3RhcnQgLSB3aGVyZSB0aGUgYWN0dWFsIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiBpbiBwYWdlCisgKiBAb2Zmc2V0IC0gc2FtZSBtZWFuaW5nIGFzIHRoZSByZWFkIHN5c3RlbSBjYWxsCisgKiBAY291bnQgLSBzYW1lIG1lYW5pbmcgYXMgdGhlIHJlYWQgc3lzdGVtIGNhbGwKKyAqIEBlb2YgLSBzZXQgaWYgbm8gbW9yZSBkYXRhIG5lZWRzIHRvIGJlIHJldHVybmVkCisgKiBAZGF0YSAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiBEaXNwbGF5IHJlYWwgdGltZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9naWNhbCBkcml2ZXMgMCB0aHJvdWdoIDkuCisgKi8KK3N0YXRpYyBpbnQKK3Byb2NfcmRydl80MChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGNvdW50LCBpbnQgKmVvZiwKKwkJdm9pZCAqZGF0YSkKK3sKKwlhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoYWRhcHRlcl90ICopZGF0YTsKKworCSplb2YgPSAxOworCisJcmV0dXJuIChwcm9jX3JkcnYoYWRhcHRlciwgcGFnZSwgMzAsIDM5KSk7Cit9CisKKworLyoqCisgKiBwcm9jX3JkcnYoKQorICogQHBhZ2UgLSBidWZmZXIgdG8gd3JpdGUgdGhlIGRhdGEgaW4KKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICogQHN0YXJ0IC0gc3RhcnRpbmcgbG9naWNhbCBkcml2ZSB0byBkaXNwbGF5CisgKiBAZW5kIC0gZW5kaW5nIGxvZ2ljYWwgZHJpdmUgdG8gZGlzcGxheQorICoKKyAqIFdlIGRvIG5vdCBwcmludCB0aGUgaW5xdWlyeSBpbmZvcm1hdGlvbiBzaW5jZSBpdHMgYWxyZWFkeSBhdmFpbGFibGUgdGhyb3VnaAorICogL3Byb2Mvc2NzaS9zY3NpIGludGVyZmFjZQorICovCitzdGF0aWMgaW50Citwcm9jX3JkcnYoYWRhcHRlcl90ICphZGFwdGVyLCBjaGFyICpwYWdlLCBpbnQgc3RhcnQsIGludCBlbmQgKQoreworCWRtYV9hZGRyX3QJZG1hX2hhbmRsZTsKKwlsb2dkcnZfcGFyYW0JKmxwYXJhbTsKKwltZWdhY21kX3QJbWM7CisJY2hhcgkJKmRpc2tfYXJyYXk7CisJZG1hX2FkZHJfdAlkaXNrX2FycmF5X2RtYV9oYW5kbGU7CisJY2FkZHJfdAkJaW5xdWlyeTsKKwlzdHJ1Y3QgcGNpX2RldgkqcGRldjsKKwl1OAkqcmRydl9zdGF0ZTsKKwlpbnQJbnVtX2xkcnY7CisJdTMyCWFycmF5X3N6OworCWludAlsZW4gPSAwOworCWludAlpOworCisJaWYoIG1ha2VfbG9jYWxfcGRldihhZGFwdGVyLCAmcGRldikgIT0gMCApIHsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlpZiggKGlucXVpcnkgPSBtZWdhX2FsbG9jYXRlX2lucXVpcnkoJmRtYV9oYW5kbGUsIHBkZXYpKSA9PSBOVUxMICkgeworCQlmcmVlX2xvY2FsX3BkZXYocGRldik7CisJCXJldHVybiBsZW47CisJfQorCisJaWYoIG1lZ2FfYWRhcGlucShhZGFwdGVyLCBkbWFfaGFuZGxlKSAhPSAwICkgeworCisJCWxlbiA9IHNwcmludGYocGFnZSwgIkFkYXB0ZXIgaW5xdWlyeSBmYWlsZWQuXG4iKTsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZDogaW5xdWlyeSBmYWlsZWQuXG4iKTsKKworCQltZWdhX2ZyZWVfaW5xdWlyeShpbnF1aXJ5LCBkbWFfaGFuZGxlLCBwZGV2KTsKKworCQlmcmVlX2xvY2FsX3BkZXYocGRldik7CisKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwltZW1zZXQoJm1jLCAwLCBzaXplb2YobWVnYWNtZF90KSk7CisKKwlpZiggYWRhcHRlci0+ZmxhZyAmIEJPQVJEXzQwTEQgKSB7CisJCWFycmF5X3N6ID0gc2l6ZW9mKGRpc2tfYXJyYXlfNDBsZCk7CisKKwkJcmRydl9zdGF0ZSA9ICgobWVnYV9pbnF1aXJ5MyAqKWlucXVpcnkpLT5sZHJ2X3N0YXRlOworCisJCW51bV9sZHJ2ID0gKChtZWdhX2lucXVpcnkzICopaW5xdWlyeSktPm51bV9sZHJ2OworCX0KKwllbHNlIHsKKwkJYXJyYXlfc3ogPSBzaXplb2YoZGlza19hcnJheV84bGQpOworCisJCXJkcnZfc3RhdGUgPSAoKG1yYWlkX2V4dF9pbnF1aXJ5ICopaW5xdWlyeSktPgorCQkJcmFpZF9pbnEubG9nZHJ2X2luZm8ubGRydl9zdGF0ZTsKKworCQludW1fbGRydiA9ICgobXJhaWRfZXh0X2lucXVpcnkgKilpbnF1aXJ5KS0+CisJCQlyYWlkX2lucS5sb2dkcnZfaW5mby5udW1fbGRydjsKKwl9CisKKwlkaXNrX2FycmF5ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgYXJyYXlfc3osCisJCQkmZGlza19hcnJheV9kbWFfaGFuZGxlKTsKKworCWlmKCBkaXNrX2FycmF5ID09IE5VTEwgKSB7CisJCWxlbiA9IHNwcmludGYocGFnZSwgIm1lbW9yeSBub3QgYXZhaWxhYmxlLlxuIik7CisKKwkJbWVnYV9mcmVlX2lucXVpcnkoaW5xdWlyeSwgZG1hX2hhbmRsZSwgcGRldik7CisKKwkJZnJlZV9sb2NhbF9wZGV2KHBkZXYpOworCisJCXJldHVybiBsZW47CisJfQorCisJbWMueGZlcmFkZHIgPSAodTMyKWRpc2tfYXJyYXlfZG1hX2hhbmRsZTsKKworCWlmKCBhZGFwdGVyLT5mbGFnICYgQk9BUkRfNDBMRCApIHsKKwkJbWMuY21kID0gRkNfTkVXX0NPTkZJRzsKKwkJbWMub3Bjb2RlID0gT1BfRENNRF9SRUFEX0NPTkZJRzsKKworCQlpZiggbWVnYV9pbnRlcm5hbF9jb21tYW5kKGFkYXB0ZXIsIExPQ0tfSU5ULCAmbWMsIE5VTEwpICkgeworCisJCQlsZW4gPSBzcHJpbnRmKHBhZ2UsICI0MExEIHJlYWQgY29uZmlnIGZhaWxlZC5cbiIpOworCisJCQltZWdhX2ZyZWVfaW5xdWlyeShpbnF1aXJ5LCBkbWFfaGFuZGxlLCBwZGV2KTsKKworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBhcnJheV9zeiwgZGlza19hcnJheSwKKwkJCQkJZGlza19hcnJheV9kbWFfaGFuZGxlKTsKKworCQkJZnJlZV9sb2NhbF9wZGV2KHBkZXYpOworCisJCQlyZXR1cm4gbGVuOworCQl9CisKKwl9CisJZWxzZSB7CisJCW1jLmNtZCA9IE5FV19SRUFEX0NPTkZJR184TEQ7CisKKwkJaWYoIG1lZ2FfaW50ZXJuYWxfY29tbWFuZChhZGFwdGVyLCBMT0NLX0lOVCwgJm1jLCBOVUxMKSApIHsKKworCQkJbWMuY21kID0gUkVBRF9DT05GSUdfOExEOworCisJCQlpZiggbWVnYV9pbnRlcm5hbF9jb21tYW5kKGFkYXB0ZXIsIExPQ0tfSU5ULCAmbWMsCisJCQkJCQlOVUxMKSApeworCisJCQkJbGVuID0gc3ByaW50ZihwYWdlLAorCQkJCQkiOExEIHJlYWQgY29uZmlnIGZhaWxlZC5cbiIpOworCisJCQkJbWVnYV9mcmVlX2lucXVpcnkoaW5xdWlyeSwgZG1hX2hhbmRsZSwgcGRldik7CisKKwkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIGFycmF5X3N6LAorCQkJCQkJZGlza19hcnJheSwKKwkJCQkJCWRpc2tfYXJyYXlfZG1hX2hhbmRsZSk7CisKKwkJCQlmcmVlX2xvY2FsX3BkZXYocGRldik7CisKKwkJCQlyZXR1cm4gbGVuOworCQkJfQorCQl9CisJfQorCisJZm9yKCBpID0gc3RhcnQ7IGkgPCAoIChlbmQrMSA8IG51bV9sZHJ2KSA/IGVuZCsxIDogbnVtX2xkcnYgKTsgaSsrICkgeworCisJCWlmKCBhZGFwdGVyLT5mbGFnICYgQk9BUkRfNDBMRCApIHsKKwkJCWxwYXJhbSA9CisJCQkmKChkaXNrX2FycmF5XzQwbGQgKilkaXNrX2FycmF5KS0+bGRydltpXS5scGFyYW07CisJCX0KKwkJZWxzZSB7CisJCQlscGFyYW0gPQorCQkJJigoZGlza19hcnJheV84bGQgKilkaXNrX2FycmF5KS0+bGRydltpXS5scGFyYW07CisJCX0KKworCQkvKgorCQkgKiBDaGVjayBmb3Igb3ZlcmZsb3cuIFdlIHByaW50IGxlc3MgdGhhbiAyNDAgY2hhcmFjdGVycyBmb3IKKwkJICogaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBsb2dpY2FsIGRyaXZlLgorCQkgKi8KKwkJaWYoIChsZW4gKyAyNDApID49IFBBR0VfU0laRSApIGJyZWFrOworCisJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiTG9naWNhbCBkcml2ZTolMmQ6LCAiLCBpKTsKKworCQlzd2l0Y2goIHJkcnZfc3RhdGVbaV0gJiAweDBGICkgeworCQljYXNlIFJEUlZfT0ZGTElORToKKwkJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAic3RhdGU6IG9mZmxpbmUiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkRSVl9ERUdSQURFRDoKKwkJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAic3RhdGU6IGRlZ3JhZGVkIik7CisJCQlicmVhazsKKworCQljYXNlIFJEUlZfT1BUSU1BTDoKKwkJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAic3RhdGU6IG9wdGltYWwiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkRSVl9ERUxFVEVEOgorCQkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJzdGF0ZTogZGVsZXRlZCIpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAic3RhdGU6IHVua25vd24iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogQ2hlY2sgaWYgY2hlY2sgY29uc2lzdGVuY3kgb3IgaW5pdGlhbGl6YXRpb24gaXMgZ29pbmcgb24KKwkJICogZm9yIHRoaXMgbG9naWNhbCBkcml2ZS4KKwkJICovCisJCWlmKCAocmRydl9zdGF0ZVtpXSAmIDB4RjApID09IDB4MjAgKSB7CisJCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwKKwkJCQkJIiwgY2hlY2stY29uc2lzdGVuY3kgaW4gcHJvZ3Jlc3MiKTsKKwkJfQorCQllbHNlIGlmKCAocmRydl9zdGF0ZVtpXSAmIDB4RjApID09IDB4MTAgKSB7CisJCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwKKwkJCQkJIiwgaW5pdGlhbGl6YXRpb24gaW4gcHJvZ3Jlc3MiKTsKKwkJfQorCQkKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJcbiIpOworCisJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiU3BhbiBkZXB0aDolM2QsICIsCisJCQkJbHBhcmFtLT5zcGFuX2RlcHRoKTsKKworCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIlJBSUQgbGV2ZWw6JTNkLCAiLAorCQkJCWxwYXJhbS0+bGV2ZWwpOworCisJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiU3RyaXBlIHNpemU6JTNkLCAiLAorCQkJCWxwYXJhbS0+c3RyaXBlX3N6ID8gbHBhcmFtLT5zdHJpcGVfc3ovMjogMTI4KTsKKworCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIlJvdyBzaXplOiUzZFxuIiwKKwkJCQlscGFyYW0tPnJvd19zaXplKTsKKworCisJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiUmVhZCBQb2xpY3k6ICIpOworCisJCXN3aXRjaChscGFyYW0tPnJlYWRfYWhlYWQpIHsKKworCQljYXNlIE5PX1JFQURfQUhFQUQ6CisJCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIk5vIHJlYWQgYWhlYWQsICIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRUFEX0FIRUFEOgorCQkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJSZWFkIGFoZWFkLCAiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQURBUF9SRUFEX0FIRUFEOgorCQkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJBZGFwdGl2ZSwgIik7CisJCQlicmVhazsKKworCQl9CisKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJXcml0ZSBQb2xpY3k6ICIpOworCisJCXN3aXRjaChscGFyYW0tPndyaXRlX21vZGUpIHsKKworCQljYXNlIFdSTU9ERV9XUklURV9USFJVOgorCQkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJXcml0ZSB0aHJ1LCAiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV1JNT0RFX1dSSVRFX0JBQ0s6CisJCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIldyaXRlIGJhY2ssICIpOworCQkJYnJlYWs7CisJCX0KKworCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIkNhY2hlIFBvbGljeTogIik7CisKKwkJc3dpdGNoKGxwYXJhbS0+ZGlyZWN0X2lvKSB7CisKKwkJY2FzZSBDQUNIRURfSU86CisJCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIkNhY2hlZCBJT1xuXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRElSRUNUX0lPOgorCQkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJEaXJlY3QgSU9cblxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCW1lZ2FfZnJlZV9pbnF1aXJ5KGlucXVpcnksIGRtYV9oYW5kbGUsIHBkZXYpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBhcnJheV9zeiwgZGlza19hcnJheSwKKwkJCWRpc2tfYXJyYXlfZG1hX2hhbmRsZSk7CisKKwlmcmVlX2xvY2FsX3BkZXYocGRldik7CisKKwlyZXR1cm4gbGVuOworfQorCisjZW5kaWYKKworCisvKioKKyAqIG1lZ2FyYWlkX2Jpb3NwYXJhbSgpCisgKgorICogUmV0dXJuIHRoZSBkaXNrIGdlb21ldHJ5IGZvciBhIHBhcnRpY3VsYXIgZGlzaworICovCitzdGF0aWMgaW50CittZWdhcmFpZF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkgICAgc2VjdG9yX3QgY2FwYWNpdHksIGludCBnZW9tW10pCit7CisJYWRhcHRlcl90CSphZGFwdGVyOworCXVuc2lnbmVkIGNoYXIJKmJoOworCWludAloZWFkczsKKwlpbnQJc2VjdG9yczsKKwlpbnQJY3lsaW5kZXJzOworCWludAlydmFsOworCisJLyogR2V0IHBvaW50ZXIgdG8gaG9zdCBjb25maWcgc3RydWN0dXJlICovCisJYWRhcHRlciA9IChhZGFwdGVyX3QgKilzZGV2LT5ob3N0LT5ob3N0ZGF0YTsKKworCWlmIChJU19SQUlEX0NIKGFkYXB0ZXIsIHNkZXYtPmNoYW5uZWwpKSB7CisJCQkvKiBEZWZhdWx0IGhlYWRzICg2NCkgJiBzZWN0b3JzICgzMikgKi8KKwkJCWhlYWRzID0gNjQ7CisJCQlzZWN0b3JzID0gMzI7CisJCQljeWxpbmRlcnMgPSAodWxvbmcpY2FwYWNpdHkgLyAoaGVhZHMgKiBzZWN0b3JzKTsKKworCQkJLyoKKwkJCSAqIEhhbmRsZSBleHRlbmRlZCB0cmFuc2xhdGlvbiBzaXplIGZvciBsb2dpY2FsIGRyaXZlcworCQkJICogPiAxR2IKKwkJCSAqLworCQkJaWYgKCh1bG9uZyljYXBhY2l0eSA+PSAweDIwMDAwMCkgeworCQkJCWhlYWRzID0gMjU1OworCQkJCXNlY3RvcnMgPSA2MzsKKwkJCQljeWxpbmRlcnMgPSAodWxvbmcpY2FwYWNpdHkgLyAoaGVhZHMgKiBzZWN0b3JzKTsKKwkJCX0KKworCQkJLyogcmV0dXJuIHJlc3VsdCAqLworCQkJZ2VvbVswXSA9IGhlYWRzOworCQkJZ2VvbVsxXSA9IHNlY3RvcnM7CisJCQlnZW9tWzJdID0gY3lsaW5kZXJzOworCX0KKwllbHNlIHsKKwkJYmggPSBzY3NpX2Jpb3NfcHRhYmxlKGJkZXYpOworCisJCWlmKCBiaCApIHsKKwkJCXJ2YWwgPSBzY3NpX3BhcnRzaXplKGJoLCBjYXBhY2l0eSwKKwkJCQkJICAgICZnZW9tWzJdLCAmZ2VvbVswXSwgJmdlb21bMV0pOworCQkJa2ZyZWUoYmgpOworCQkJaWYoIHJ2YWwgIT0gLTEgKQorCQkJCXJldHVybiBydmFsOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkibWVnYXJhaWQ6IGludmFsaWQgcGFydGl0aW9uIG9uIHRoaXMgZGlzayBvbiBjaGFubmVsICVkXG4iLAorCQkJCXNkZXYtPmNoYW5uZWwpOworCisJCS8qIERlZmF1bHQgaGVhZHMgKDY0KSAmIHNlY3RvcnMgKDMyKSAqLworCQloZWFkcyA9IDY0OworCQlzZWN0b3JzID0gMzI7CisJCWN5bGluZGVycyA9ICh1bG9uZyljYXBhY2l0eSAvIChoZWFkcyAqIHNlY3RvcnMpOworCisJCS8qIEhhbmRsZSBleHRlbmRlZCB0cmFuc2xhdGlvbiBzaXplIGZvciBsb2dpY2FsIGRyaXZlcyA+IDFHYiAqLworCQlpZiAoKHVsb25nKWNhcGFjaXR5ID49IDB4MjAwMDAwKSB7CisJCQloZWFkcyA9IDI1NTsKKwkJCXNlY3RvcnMgPSA2MzsKKwkJCWN5bGluZGVycyA9ICh1bG9uZyljYXBhY2l0eSAvIChoZWFkcyAqIHNlY3RvcnMpOworCQl9CisKKwkJLyogcmV0dXJuIHJlc3VsdCAqLworCQlnZW9tWzBdID0gaGVhZHM7CisJCWdlb21bMV0gPSBzZWN0b3JzOworCQlnZW9tWzJdID0gY3lsaW5kZXJzOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIG1lZ2FfaW5pdF9zY2IoKQorICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKgorICogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgdmFyaW91cyBwb2ludGVycyBpbiB0aGUgc2NiIHN0cnVjdHVyZXM6CisgKiBzY2F0dGVyLWdhdGhlciBsaXN0IHBvaW50ZXIsIHBhc3N0aHJ1IGFuZCBleHRlbmRlZCBwYXNzdGhydSBzdHJ1Y3R1cmUKKyAqIHBvaW50ZXJzLgorICovCitzdGF0aWMgaW50CittZWdhX2luaXRfc2NiKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlzY2JfdAkqc2NiOworCWludAlpOworCisJZm9yKCBpID0gMDsgaSA8IGFkYXB0ZXItPm1heF9jbWRzOyBpKysgKSB7CisKKwkJc2NiID0gJmFkYXB0ZXItPnNjYl9saXN0W2ldOworCisJCXNjYi0+c2dsNjQgPSBOVUxMOworCQlzY2ItPnNnbCA9IE5VTEw7CisJCXNjYi0+cHRocnUgPSBOVUxMOworCQlzY2ItPmVwdGhydSA9IE5VTEw7CisJfQorCisJZm9yKCBpID0gMDsgaSA8IGFkYXB0ZXItPm1heF9jbWRzOyBpKysgKSB7CisKKwkJc2NiID0gJmFkYXB0ZXItPnNjYl9saXN0W2ldOworCisJCXNjYi0+aWR4ID0gaTsKKworCQlzY2ItPnNnbDY0ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+ZGV2LAorCQkJCXNpemVvZihtZWdhX3NnbDY0KSAqIGFkYXB0ZXItPnNnbGVuLAorCQkJCSZzY2ItPnNnbF9kbWFfYWRkcik7CisKKwkJc2NiLT5zZ2wgPSAobWVnYV9zZ2xpc3QgKilzY2ItPnNnbDY0OworCisJCWlmKCAhc2NiLT5zZ2wgKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJSQUlEOiBDYW4ndCBhbGxvY2F0ZSBzZ2xpc3QuXG4iKTsKKwkJCW1lZ2FfZnJlZV9zZ2woYWRhcHRlcik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlzY2ItPnB0aHJ1ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+ZGV2LAorCQkJCXNpemVvZihtZWdhX3Bhc3N0aHJ1KSwKKwkJCQkmc2NiLT5wdGhydV9kbWFfYWRkcik7CisKKwkJaWYoICFzY2ItPnB0aHJ1ICkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUkFJRDogQ2FuJ3QgYWxsb2NhdGUgcGFzc3RocnUuXG4iKTsKKwkJCW1lZ2FfZnJlZV9zZ2woYWRhcHRlcik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlzY2ItPmVwdGhydSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPmRldiwKKwkJCQlzaXplb2YobWVnYV9leHRfcGFzc3RocnUpLAorCQkJCSZzY2ItPmVwdGhydV9kbWFfYWRkcik7CisKKwkJaWYoICFzY2ItPmVwdGhydSApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkiQ2FuJ3QgYWxsb2NhdGUgZXh0ZW5kZWQgcGFzc3RocnUuXG4iKTsKKwkJCW1lZ2FfZnJlZV9zZ2woYWRhcHRlcik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCisJCXNjYi0+ZG1hX3R5cGUgPSBNRUdBX0RNQV9UWVBFX05PTkU7CisKKwkJLyoKKwkJICogTGluayB0byBmcmVlIGxpc3QKKwkJICogbG9jayBub3QgcmVxdWlyZWQgc2luY2Ugd2UgYXJlIGxvYWRpbmcgdGhlIGRyaXZlciwgc28gbm8KKwkJICogY29tbWFuZHMgcG9zc2libGUgcmlnaHQgbm93LgorCQkgKi8KKwkJc2NiLT5zdGF0ZSA9IFNDQl9GUkVFOworCQlzY2ItPmNtZCA9IE5VTEw7CisJCWxpc3RfYWRkKCZzY2ItPmxpc3QsICZhZGFwdGVyLT5mcmVlX2xpc3QpOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qKgorICogbWVnYWRldl9vcGVuKCkKKyAqIEBpbm9kZSAtIHVudXNlZAorICogQGZpbGVwIC0gdW51c2VkCisgKgorICogUm91dGluZXMgZm9yIHRoZSBjaGFyYWN0ZXIvaW9jdGwgaW50ZXJmYWNlIHRvIHRoZSBkcml2ZXIuIEZpbmQgb3V0IGlmIHRoaXMKKyAqIGlzIGEgdmFsaWQgb3Blbi4gSWYgeWVzLCBpbmNyZW1lbnQgdGhlIG1vZHVsZSB1c2UgY291bnQgc28gdGhhdCBpdCBjYW5ub3QKKyAqIGJlIHVubG9hZGVkLgorICovCitzdGF0aWMgaW50CittZWdhZGV2X29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlcCkKK3sKKwkvKgorCSAqIE9ubHkgYWxsb3cgc3VwZXJ1c2VyIHRvIGFjY2VzcyBwcml2YXRlIGlvY3RsIGludGVyZmFjZQorCSAqLworCWlmKCAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSApIHJldHVybiAtRUFDQ0VTOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBtZWdhZGV2X2lvY3RsKCkKKyAqIEBpbm9kZSAtIE91ciBkZXZpY2UgaW5vZGUKKyAqIEBmaWxlcCAtIHVudXNlZAorICogQGNtZCAtIGlvY3RsIGNvbW1hbmQKKyAqIEBhcmcgLSB1c2VyIGJ1ZmZlcgorICoKKyAqIGlvY3RsIGVudHJ5IHBvaW50IGZvciBvdXIgcHJpdmF0ZSBpb2N0bCBpbnRlcmZhY2UuIFdlIG1vdmUgdGhlIGRhdGEgaW4gZnJvbQorICogdGhlIHVzZXIgc3BhY2UsIHByZXBhcmUgdGhlIGNvbW1hbmQgKGlmIG5lY2Vzc2FyeSwgY29udmVydCB0aGUgb2xkIE1JTUQKKyAqIGlvY3RsIHRvIG5ldyBpb2N0bCBjb21tYW5kKSwgYW5kIGlzc3VlIGEgc3luY2hyb25vdXMgY29tbWFuZCB0byB0aGUKKyAqIGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FkZXZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlhZGFwdGVyX3QJKmFkYXB0ZXI7CisJbml0aW9jdGxfdAl1aW9jOworCWludAkJYWRhcG5vOworCWludAkJcnZhbDsKKwltZWdhX3Bhc3N0aHJ1CV9fdXNlciAqdXB0aHJ1OwkvKiB1c2VyIGFkZHJlc3MgZm9yIHBhc3N0aHJ1ICovCisJbWVnYV9wYXNzdGhydQkqcHRocnU7CQkvKiBjb3B5IHVzZXIgcGFzc3RocnUgaGVyZSAqLworCWRtYV9hZGRyX3QJcHRocnVfZG1hX2huZGw7CisJdm9pZAkJKmRhdGEgPSBOVUxMOwkvKiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkICovCisJZG1hX2FkZHJfdAlkYXRhX2RtYV9obmRsOwkvKiBkbWEgaGFuZGxlIGZvciBkYXRhIHhmZXIgYXJlYSAqLworCW1lZ2FjbWRfdAltYzsKKwltZWdhc3RhdF90CV9fdXNlciAqdXN0YXRzOworCWludAkJbnVtX2xkcnY7CisJdTMyCQl1eGZlcmFkZHIgPSAwOworCXN0cnVjdCBwY2lfZGV2CSpwZGV2OworCisJdXN0YXRzID0gTlVMTDsgLyogYXZvaWQgY29tcGlsYXRpb24gd2FybmluZ3MgKi8KKwludW1fbGRydiA9IDA7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBvbmx5IFVTQ1NJQ01EIGFyZSBpc3N1ZWQgdGhyb3VnaCB0aGlzIGludGVyZmFjZS4KKwkgKiBNSU1EIGFwcGxpY2F0aW9uIHdvdWxkIHN0aWxsIGZpcmUgZGlmZmVyZW50IGNvbW1hbmQuCisJICovCisJaWYoIChfSU9DX1RZUEUoY21kKSAhPSBNRUdBSU9DX01BR0lDKSAmJiAoY21kICE9IFVTQ1NJQ01EKSApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBDaGVjayBhbmQgY29udmVydCBhIHBvc3NpYmxlIE1JTUQgY29tbWFuZCB0byBOSVQgY29tbWFuZC4KKwkgKiBtZWdhX21fdG9fbigpIGNvcGllcyB0aGUgZGF0YSBmcm9tIHRoZSB1c2VyIHNwYWNlLCBzbyB3ZSBkbyBub3QKKwkgKiBoYXZlIHRvIGRvIGl0IGhlcmUuCisJICogTk9URTogV2Ugd2lsbCBuZWVkIHNvbWUgdXNlciBhZGRyZXNzIHRvIGNvcHlvdXQgdGhlIGRhdGEsIHRoZXJlZm9yZQorCSAqIHRoZSBpbnRlZmFjZSBsYXllciB3aWxsIGFsc28gcHJvdmlkZSB1cyB3aXRoIHRoZSByZXF1aXJlZCB1c2VyCisJICogYWRkcmVzc2VzLgorCSAqLworCW1lbXNldCgmdWlvYywgMCwgc2l6ZW9mKG5pdGlvY3RsX3QpKTsKKwlpZiggKHJ2YWwgPSBtZWdhX21fdG9fbiggKHZvaWQgX191c2VyICopYXJnLCAmdWlvYykpICE9IDAgKQorCQlyZXR1cm4gcnZhbDsKKworCisJc3dpdGNoKCB1aW9jLm9wY29kZSApIHsKKworCWNhc2UgR0VUX0RSSVZFUl9WRVI6CisJCWlmKCBwdXRfdXNlcihkcml2ZXJfdmVyLCAodTMyIF9fdXNlciAqKXVpb2MudWlvY191YWRkcikgKQorCQkJcmV0dXJuICgtRUZBVUxUKTsKKworCQlicmVhazsKKworCWNhc2UgR0VUX05fQURBUDoKKwkJaWYoIHB1dF91c2VyKGhiYV9jb3VudCwgKHUzMiBfX3VzZXIgKil1aW9jLnVpb2NfdWFkZHIpICkKKwkJCXJldHVybiAoLUVGQVVMVCk7CisKKwkJLyoKKwkJICogU2h1Y2tzLiBNSU1EIGludGVyZmFjZSByZXR1cm5zIGEgcG9zaXRpdmUgdmFsdWUgZm9yIG51bWJlcgorCQkgKiBvZiBhZGFwdGVycy4gVE9ETzogQ2hhbmdlIGl0IHRvIHJldHVybiAwIHdoZW4gdGhlcmUgaXMgbm8KKwkJICogYXBwbGljYXRpbyB1c2luZyBtaW1kIGludGVyZmFjZS4KKwkJICovCisJCXJldHVybiBoYmFfY291bnQ7CisKKwljYXNlIEdFVF9BREFQX0lORk86CisKKwkJLyoKKwkJICogV2hpY2ggYWRhcHRlcgorCQkgKi8KKwkJaWYoIChhZGFwbm8gPSBHRVRBREFQKHVpb2MuYWRhcG5vKSkgPj0gaGJhX2NvdW50ICkKKwkJCXJldHVybiAoLUVOT0RFVik7CisKKwkJaWYoIGNvcHlfdG9fdXNlcih1aW9jLnVpb2NfdWFkZHIsIG1jb250cm9sbGVyK2FkYXBubywKKwkJCQlzaXplb2Yoc3RydWN0IG1jb250cm9sbGVyKSkgKQorCQkJcmV0dXJuICgtRUZBVUxUKTsKKwkJYnJlYWs7CisKKyNpZiBNRUdBX0hBVkVfU1RBVFMKKworCWNhc2UgR0VUX1NUQVRTOgorCQkvKgorCQkgKiBXaGljaCBhZGFwdGVyCisJCSAqLworCQlpZiggKGFkYXBubyA9IEdFVEFEQVAodWlvYy5hZGFwbm8pKSA+PSBoYmFfY291bnQgKQorCQkJcmV0dXJuICgtRU5PREVWKTsKKworCQlhZGFwdGVyID0gaGJhX3NvZnRfc3RhdGVbYWRhcG5vXTsKKworCQl1c3RhdHMgPSB1aW9jLnVpb2NfdWFkZHI7CisKKwkJaWYoIGNvcHlfZnJvbV91c2VyKCZudW1fbGRydiwgJnVzdGF0cy0+bnVtX2xkcnYsIHNpemVvZihpbnQpKSApCisJCQlyZXR1cm4gKC1FRkFVTFQpOworCisJCS8qCisJCSAqIENoZWNrIGZvciB0aGUgdmFsaWRpdHkgb2YgdGhlIGxvZ2ljYWwgZHJpdmUgbnVtYmVyCisJCSAqLworCQlpZiggbnVtX2xkcnYgPj0gTUFYX0xPR0lDQUxfRFJJVkVTXzQwTEQgKSByZXR1cm4gLUVJTlZBTDsKKworCQlpZiggY29weV90b191c2VyKHVzdGF0cy0+bnJlYWRzLCBhZGFwdGVyLT5ucmVhZHMsCisJCQkJCW51bV9sZHJ2KnNpemVvZih1MzIpKSApCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiggY29weV90b191c2VyKHVzdGF0cy0+bnJlYWRibG9ja3MsIGFkYXB0ZXItPm5yZWFkYmxvY2tzLAorCQkJCQludW1fbGRydipzaXplb2YodTMyKSkgKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYoIGNvcHlfdG9fdXNlcih1c3RhdHMtPm53cml0ZXMsIGFkYXB0ZXItPm53cml0ZXMsCisJCQkJCW51bV9sZHJ2KnNpemVvZih1MzIpKSApCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiggY29weV90b191c2VyKHVzdGF0cy0+bndyaXRlYmxvY2tzLCBhZGFwdGVyLT5ud3JpdGVibG9ja3MsCisJCQkJCW51bV9sZHJ2KnNpemVvZih1MzIpKSApCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiggY29weV90b191c2VyKHVzdGF0cy0+cmRfZXJyb3JzLCBhZGFwdGVyLT5yZF9lcnJvcnMsCisJCQkJCW51bV9sZHJ2KnNpemVvZih1MzIpKSApCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiggY29weV90b191c2VyKHVzdGF0cy0+d3JfZXJyb3JzLCBhZGFwdGVyLT53cl9lcnJvcnMsCisJCQkJCW51bV9sZHJ2KnNpemVvZih1MzIpKSApCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gMDsKKworI2VuZGlmCisJY2FzZSBNQk9YX0NNRDoKKworCQkvKgorCQkgKiBXaGljaCBhZGFwdGVyCisJCSAqLworCQlpZiggKGFkYXBubyA9IEdFVEFEQVAodWlvYy5hZGFwbm8pKSA+PSBoYmFfY291bnQgKQorCQkJcmV0dXJuICgtRU5PREVWKTsKKworCQlhZGFwdGVyID0gaGJhX3NvZnRfc3RhdGVbYWRhcG5vXTsKKworCQkvKgorCQkgKiBEZWxldGlvbiBvZiBsb2dpY2FsIGRyaXZlIGlzIGEgc3BlY2lhbCBjYXNlLiBUaGUgYWRhcHRlcgorCQkgKiBzaG91bGQgYmUgcXVpZXNjZW50IGJlZm9yZSB0aGlzIGNvbW1hbmQgaXMgaXNzdWVkLgorCQkgKi8KKwkJaWYoIHVpb2MudWlvY19ybWJveFswXSA9PSBGQ19ERUxfTE9HRFJWICYmCisJCQkJdWlvYy51aW9jX3JtYm94WzJdID09IE9QX0RFTF9MT0dEUlYgKSB7CisKKwkJCS8qCisJCQkgKiBEbyB3ZSBzdXBwb3J0IHRoaXMgZmVhdHVyZQorCQkJICovCisJCQlpZiggIWFkYXB0ZXItPnN1cHBvcnRfcmFuZG9tX2RlbCApIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZDogbG9nZHJ2ICIpOworCQkJCXByaW50aygiZGVsZXRlIG9uIG5vbi1zdXBwb3J0aW5nIEYvVy5cbiIpOworCisJCQkJcmV0dXJuICgtRUlOVkFMKTsKKwkJCX0KKworCQkJcnZhbCA9IG1lZ2FfZGVsX2xvZ2RydiggYWRhcHRlciwgdWlvYy51aW9jX3JtYm94WzNdICk7CisKKwkJCWlmKCBydmFsID09IDAgKSB7CisJCQkJbWVtc2V0KCZtYywgMCwgc2l6ZW9mKG1lZ2FjbWRfdCkpOworCisJCQkJbWMuc3RhdHVzID0gcnZhbDsKKworCQkJCXJ2YWwgPSBtZWdhX25fdG9fbSgodm9pZCBfX3VzZXIgKilhcmcsICZtYyk7CisJCQl9CisKKwkJCXJldHVybiBydmFsOworCQl9CisJCS8qCisJCSAqIFRoaXMgaW50ZXJmYWNlIG9ubHkgc3VwcG9ydCB0aGUgcmVndWxhciBwYXNzdGhydSBjb21tYW5kcy4KKwkJICogUmVqZWN0IGV4dGVuZGVkIHBhc3N0aHJ1IGFuZCA2NC1iaXQgcGFzc3RocnUKKwkJICovCisJCWlmKCB1aW9jLnVpb2Nfcm1ib3hbMF0gPT0gTUVHQV9NQk9YQ01EX1BBU1NUSFJVNjQgfHwKKwkJCXVpb2MudWlvY19ybWJveFswXSA9PSBNRUdBX01CT1hDTURfRVhUUFRIUlUgKSB7CisKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkOiByZWplY3RlZCBwYXNzdGhydS5cbiIpOworCisJCQlyZXR1cm4gKC1FSU5WQUwpOworCQl9CisKKwkJLyoKKwkJICogRm9yIGFsbCBpbnRlcm5hbCBjb21tYW5kcywgdGhlIGJ1ZmZlciBtdXN0IGJlIGFsbG9jYXRlZCBpbgorCQkgKiA8NEdCIGFkZHJlc3MgcmFuZ2UKKwkJICovCisJCWlmKCBtYWtlX2xvY2FsX3BkZXYoYWRhcHRlciwgJnBkZXYpICE9IDAgKQorCQkJcmV0dXJuIC1FSU87CisKKwkJLyogSXMgaXQgYSBwYXNzdGhydSBjb21tYW5kIG9yIGEgRENNRCAqLworCQlpZiggdWlvYy51aW9jX3JtYm94WzBdID09IE1FR0FfTUJPWENNRF9QQVNTVEhSVSApIHsKKwkJCS8qIFBhc3N0aHJ1IGNvbW1hbmRzICovCisKKwkJCXB0aHJ1ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwKKwkJCQkJc2l6ZW9mKG1lZ2FfcGFzc3RocnUpLAorCQkJCQkmcHRocnVfZG1hX2huZGwpOworCisJCQlpZiggcHRocnUgPT0gTlVMTCApIHsKKwkJCQlmcmVlX2xvY2FsX3BkZXYocGRldik7CisJCQkJcmV0dXJuICgtRU5PTUVNKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFRoZSB1c2VyIHBhc3N0aHJ1IHN0cnVjdHVyZQorCQkJICovCisJCQl1cHRocnUgPSAobWVnYV9wYXNzdGhydSBfX3VzZXIgKilNQk9YKHVpb2MpLT54ZmVyYWRkcjsKKworCQkJLyoKKwkJCSAqIENvcHkgaW4gdGhlIHVzZXIgcGFzc3RocnUgaGVyZS4KKwkJCSAqLworCQkJaWYoIGNvcHlfZnJvbV91c2VyKHB0aHJ1LCB1cHRocnUsCisJCQkJCQlzaXplb2YobWVnYV9wYXNzdGhydSkpICkgeworCisJCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LAorCQkJCQkJc2l6ZW9mKG1lZ2FfcGFzc3RocnUpLCBwdGhydSwKKwkJCQkJCXB0aHJ1X2RtYV9obmRsKTsKKworCQkJCWZyZWVfbG9jYWxfcGRldihwZGV2KTsKKworCQkJCXJldHVybiAoLUVGQVVMVCk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJcyB0aGVyZSBhIGRhdGEgdHJhbnNmZXIKKwkJCSAqLworCQkJaWYoIHB0aHJ1LT5kYXRheGZlcmxlbiApIHsKKwkJCQlkYXRhID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwKKwkJCQkJCXB0aHJ1LT5kYXRheGZlcmxlbiwKKwkJCQkJCSZkYXRhX2RtYV9obmRsKTsKKworCQkJCWlmKCBkYXRhID09IE5VTEwgKSB7CisJCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwKKwkJCQkJCQlzaXplb2YobWVnYV9wYXNzdGhydSksCisJCQkJCQkJcHRocnUsCisJCQkJCQkJcHRocnVfZG1hX2huZGwpOworCisJCQkJCWZyZWVfbG9jYWxfcGRldihwZGV2KTsKKworCQkJCQlyZXR1cm4gKC1FTk9NRU0pOworCQkJCX0KKworCQkJCS8qCisJCQkJICogU2F2ZSB0aGUgdXNlciBhZGRyZXNzIGFuZCBwb2ludCB0aGUga2VybmVsCisJCQkJICogYWRkcmVzcyBhdCBqdXN0IGFsbG9jYXRlZCBtZW1vcnkKKwkJCQkgKi8KKwkJCQl1eGZlcmFkZHIgPSBwdGhydS0+ZGF0YXhmZXJhZGRyOworCQkJCXB0aHJ1LT5kYXRheGZlcmFkZHIgPSBkYXRhX2RtYV9obmRsOworCQkJfQorCisKKwkJCS8qCisJCQkgKiBJcyBkYXRhIGNvbWluZyBkb3duLXN0cmVhbQorCQkJICovCisJCQlpZiggcHRocnUtPmRhdGF4ZmVybGVuICYmICh1aW9jLmZsYWdzICYgVUlPQ19XUikgKSB7CisJCQkJLyoKKwkJCQkgKiBHZXQgdGhlIHVzZXIgZGF0YQorCQkJCSAqLworCQkJCWlmKCBjb3B5X2Zyb21fdXNlcihkYXRhLCAoY2hhciBfX3VzZXIgKil1eGZlcmFkZHIsCisJCQkJCQkJcHRocnUtPmRhdGF4ZmVybGVuKSApIHsKKwkJCQkJcnZhbCA9ICgtRUZBVUxUKTsKKwkJCQkJZ290byBmcmVlbWVtX2FuZF9yZXR1cm47CisJCQkJfQorCQkJfQorCisJCQltZW1zZXQoJm1jLCAwLCBzaXplb2YobWVnYWNtZF90KSk7CisKKwkJCW1jLmNtZCA9IE1FR0FfTUJPWENNRF9QQVNTVEhSVTsKKwkJCW1jLnhmZXJhZGRyID0gKHUzMilwdGhydV9kbWFfaG5kbDsKKworCQkJLyoKKwkJCSAqIElzc3VlIHRoZSBjb21tYW5kCisJCQkgKi8KKwkJCW1lZ2FfaW50ZXJuYWxfY29tbWFuZChhZGFwdGVyLCBMT0NLX0lOVCwgJm1jLCBwdGhydSk7CisKKwkJCXJ2YWwgPSBtZWdhX25fdG9fbSgodm9pZCBfX3VzZXIgKilhcmcsICZtYyk7CisKKwkJCWlmKCBydmFsICkgZ290byBmcmVlbWVtX2FuZF9yZXR1cm47CisKKworCQkJLyoKKwkJCSAqIElzIGRhdGEgZ29pbmcgdXAtc3RyZWFtCisJCQkgKi8KKwkJCWlmKCBwdGhydS0+ZGF0YXhmZXJsZW4gJiYgKHVpb2MuZmxhZ3MgJiBVSU9DX1JEKSApIHsKKwkJCQlpZiggY29weV90b191c2VyKChjaGFyIF9fdXNlciAqKXV4ZmVyYWRkciwgZGF0YSwKKwkJCQkJCQlwdGhydS0+ZGF0YXhmZXJsZW4pICkgeworCQkJCQlydmFsID0gKC1FRkFVTFQpOworCQkJCX0KKwkJCX0KKworCQkJLyoKKwkJCSAqIFNlbmQgdGhlIHJlcXVlc3Qgc2Vuc2UgZGF0YSBhbHNvLCBpcnJlc3BlY3RpdmUgb2YKKwkJCSAqIHdoZXRoZXIgdGhlIHVzZXIgaGFzIGFza2VkIGZvciBpdCBvciBub3QuCisJCQkgKi8KKwkJCWNvcHlfdG9fdXNlcih1cHRocnUtPnJlcXNlbnNlYXJlYSwKKwkJCQkJcHRocnUtPnJlcXNlbnNlYXJlYSwgMTQpOworCitmcmVlbWVtX2FuZF9yZXR1cm46CisJCQlpZiggcHRocnUtPmRhdGF4ZmVybGVuICkgeworCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwKKwkJCQkJCXB0aHJ1LT5kYXRheGZlcmxlbiwgZGF0YSwKKwkJCQkJCWRhdGFfZG1hX2huZGwpOworCQkJfQorCisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZihtZWdhX3Bhc3N0aHJ1KSwKKwkJCQkJcHRocnUsIHB0aHJ1X2RtYV9obmRsKTsKKworCQkJZnJlZV9sb2NhbF9wZGV2KHBkZXYpOworCisJCQlyZXR1cm4gcnZhbDsKKwkJfQorCQllbHNlIHsKKwkJCS8qIERDTUQgY29tbWFuZHMgKi8KKworCQkJLyoKKwkJCSAqIElzIHRoZXJlIGEgZGF0YSB0cmFuc2ZlcgorCQkJICovCisJCQlpZiggdWlvYy54ZmVybGVuICkgeworCQkJCWRhdGEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LAorCQkJCQkJdWlvYy54ZmVybGVuLCAmZGF0YV9kbWFfaG5kbCk7CisKKwkJCQlpZiggZGF0YSA9PSBOVUxMICkgeworCQkJCQlmcmVlX2xvY2FsX3BkZXYocGRldik7CisJCQkJCXJldHVybiAoLUVOT01FTSk7CisJCQkJfQorCisJCQkJdXhmZXJhZGRyID0gTUJPWCh1aW9jKS0+eGZlcmFkZHI7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJcyBkYXRhIGNvbWluZyBkb3duLXN0cmVhbQorCQkJICovCisJCQlpZiggdWlvYy54ZmVybGVuICYmICh1aW9jLmZsYWdzICYgVUlPQ19XUikgKSB7CisJCQkJLyoKKwkJCQkgKiBHZXQgdGhlIHVzZXIgZGF0YQorCQkJCSAqLworCQkJCWlmKCBjb3B5X2Zyb21fdXNlcihkYXRhLCAoY2hhciBfX3VzZXIgKil1eGZlcmFkZHIsCisJCQkJCQkJdWlvYy54ZmVybGVuKSApIHsKKworCQkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsCisJCQkJCQkJdWlvYy54ZmVybGVuLAorCQkJCQkJCWRhdGEsIGRhdGFfZG1hX2huZGwpOworCisJCQkJCWZyZWVfbG9jYWxfcGRldihwZGV2KTsKKworCQkJCQlyZXR1cm4gKC1FRkFVTFQpOworCQkJCX0KKwkJCX0KKworCQkJbWVtY3B5KCZtYywgTUJPWCh1aW9jKSwgc2l6ZW9mKG1lZ2FjbWRfdCkpOworCisJCQltYy54ZmVyYWRkciA9ICh1MzIpZGF0YV9kbWFfaG5kbDsKKworCQkJLyoKKwkJCSAqIElzc3VlIHRoZSBjb21tYW5kCisJCQkgKi8KKwkJCW1lZ2FfaW50ZXJuYWxfY29tbWFuZChhZGFwdGVyLCBMT0NLX0lOVCwgJm1jLCBOVUxMKTsKKworCQkJcnZhbCA9IG1lZ2Ffbl90b19tKCh2b2lkIF9fdXNlciAqKWFyZywgJm1jKTsKKworCQkJaWYoIHJ2YWwgKSB7CisJCQkJaWYoIHVpb2MueGZlcmxlbiApIHsKKwkJCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LAorCQkJCQkJCXVpb2MueGZlcmxlbiwgZGF0YSwKKwkJCQkJCQlkYXRhX2RtYV9obmRsKTsKKwkJCQl9CisKKwkJCQlmcmVlX2xvY2FsX3BkZXYocGRldik7CisKKwkJCQlyZXR1cm4gcnZhbDsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElzIGRhdGEgZ29pbmcgdXAtc3RyZWFtCisJCQkgKi8KKwkJCWlmKCB1aW9jLnhmZXJsZW4gJiYgKHVpb2MuZmxhZ3MgJiBVSU9DX1JEKSApIHsKKwkJCQlpZiggY29weV90b191c2VyKChjaGFyIF9fdXNlciAqKXV4ZmVyYWRkciwgZGF0YSwKKwkJCQkJCQl1aW9jLnhmZXJsZW4pICkgeworCisJCQkJCXJ2YWwgPSAoLUVGQVVMVCk7CisJCQkJfQorCQkJfQorCisJCQlpZiggdWlvYy54ZmVybGVuICkgeworCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwKKwkJCQkJCXVpb2MueGZlcmxlbiwgZGF0YSwKKwkJCQkJCWRhdGFfZG1hX2huZGwpOworCQkJfQorCisJCQlmcmVlX2xvY2FsX3BkZXYocGRldik7CisKKwkJCXJldHVybiBydmFsOworCQl9CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKC1FSU5WQUwpOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIG1lZ2FfbV90b19uKCkKKyAqIEBhcmcgLSB1c2VyIGFkZHJlc3MKKyAqIEB1aW9jIC0gbmV3IGlvY3RsIHN0cnVjdHVyZQorICoKKyAqIEEgdGhpbiBsYXllciB0byBjb252ZXJ0IG9sZGVyIG1pbWQgaW50ZXJmYWNlIGlvY3RsIHN0cnVjdHVyZSB0byBOSVQgaW9jdGwKKyAqIHN0cnVjdHVyZQorICoKKyAqIENvbnZlcnRzIHRoZSBvbGRlciBtaW1kIGlvY3RsIHN0cnVjdHVyZSB0byBuZXdlciBOSVQgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FfbV90b19uKHZvaWQgX191c2VyICphcmcsIG5pdGlvY3RsX3QgKnVpb2MpCit7CisJc3RydWN0IHVpb2N0bF90CXVpb2NfbWltZDsKKwljaGFyCXNpZ25hdHVyZVs4XSA9IHswfTsKKwl1OAlvcGNvZGU7CisJdTgJc3Vib3Bjb2RlOworCisKKwkvKgorCSAqIGNoZWNrIGlzIHRoZSBhcHBsaWNhdGlvbiBjb25mb3JtcyB0byBOSVQuIFdlIGRvIG5vdCBoYXZlIHRvIGRvIG11Y2gKKwkgKiBpbiB0aGF0IGNhc2UuCisJICogV2UgZXhwbG9pdCB0aGUgZmFjdCB0aGF0IHRoZSBzaWduYXR1cmUgaXMgc3RvcmVkIGluIHRoZSB2ZXJ5CisJICogYmVnaW5pbmcgb2YgdGhlIHN0cnVjdHVyZS4KKwkgKi8KKworCWlmKCBjb3B5X2Zyb21fdXNlcihzaWduYXR1cmUsIGFyZywgNykgKQorCQlyZXR1cm4gKC1FRkFVTFQpOworCisJaWYoIG1lbWNtcChzaWduYXR1cmUsICJNRUdBTklUIiwgNykgPT0gMCApIHsKKworCQkvKgorCQkgKiBOT1RFIE5PVEU6IFRoZSBuaXQgaW9jdGwgaXMgc3RpbGwgdW5kZXIgZmx1eCBiZWNhdXNlIG9mCisJCSAqIGNoYW5nZSBvZiBtYWlsYm94IGRlZmluaXRpb24sIGluIEhQRS4gTm8gYXBwbGljYXRpb25zIHlldAorCQkgKiB1c2UgdGhpcyBpbnRlcmZhY2UgYW5kIGxldCdzIG5vdCBoYXZlIGFwcGxpY2F0aW9ucyB1c2UgdGhpcworCQkgKiBpbnRlcmZhY2UgdGlsbCB0aGUgbmV3IHNwZWNpZml0aW9ucyBhcmUgaW4gcGxhY2UuCisJCSAqLworCQlyZXR1cm4gLUVJTlZBTDsKKyNpZiAwCisJCWlmKCBjb3B5X2Zyb21fdXNlcih1aW9jLCBhcmcsIHNpemVvZihuaXRpb2N0bF90KSkgKQorCQkJcmV0dXJuICgtRUZBVUxUKTsKKwkJcmV0dXJuIDA7CisjZW5kaWYKKwl9CisKKwkvKgorCSAqIEVsc2UgYXNzdW1lIHdlIGhhdmUgbWltZCB1aW9jdGxfdCBhcyBhcmcuIENvbnZlcnQgdG8gbml0aW9jdGxfdAorCSAqCisJICogR2V0IHRoZSB1c2VyIGlvY3RsIHN0cnVjdHVyZQorCSAqLworCWlmKCBjb3B5X2Zyb21fdXNlcigmdWlvY19taW1kLCBhcmcsIHNpemVvZihzdHJ1Y3QgdWlvY3RsX3QpKSApCisJCXJldHVybiAoLUVGQVVMVCk7CisKKworCS8qCisJICogR2V0IHRoZSBvcGNvZGUgYW5kIHN1Ym9wY29kZSBmb3IgdGhlIGNvbW1hbmRzCisJICovCisJb3Bjb2RlID0gdWlvY19taW1kLnVpLmZjcy5vcGNvZGU7CisJc3Vib3Bjb2RlID0gdWlvY19taW1kLnVpLmZjcy5zdWJvcGNvZGU7CisKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgMHg4MjoKKworCQlzd2l0Y2ggKHN1Ym9wY29kZSkgeworCisJCWNhc2UgTUVHQUlPQ19RRFJWUlZFUjoJLyogUXVlcnkgZHJpdmVyIHZlcnNpb24gKi8KKwkJCXVpb2MtPm9wY29kZSA9IEdFVF9EUklWRVJfVkVSOworCQkJdWlvYy0+dWlvY191YWRkciA9IHVpb2NfbWltZC5kYXRhOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRUdBSU9DX1FOQURBUDoJLyogR2V0ICMgb2YgYWRhcHRlcnMgKi8KKwkJCXVpb2MtPm9wY29kZSA9IEdFVF9OX0FEQVA7CisJCQl1aW9jLT51aW9jX3VhZGRyID0gdWlvY19taW1kLmRhdGE7CisJCQlicmVhazsKKworCQljYXNlIE1FR0FJT0NfUUFEQVBJTkZPOgkvKiBHZXQgYWRhcHRlciBpbmZvcm1hdGlvbiAqLworCQkJdWlvYy0+b3Bjb2RlID0gR0VUX0FEQVBfSU5GTzsKKwkJCXVpb2MtPmFkYXBubyA9IHVpb2NfbWltZC51aS5mY3MuYWRhcG5vOworCQkJdWlvYy0+dWlvY191YWRkciA9IHVpb2NfbWltZC5kYXRhOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybigtRUlOVkFMKTsKKwkJfQorCisJCWJyZWFrOworCisKKwljYXNlIDB4ODE6CisKKwkJdWlvYy0+b3Bjb2RlID0gTUJPWF9DTUQ7CisJCXVpb2MtPmFkYXBubyA9IHVpb2NfbWltZC51aS5mY3MuYWRhcG5vOworCisJCW1lbWNweSh1aW9jLT51aW9jX3JtYm94LCB1aW9jX21pbWQubWJveCwgMTgpOworCisJCXVpb2MtPnhmZXJsZW4gPSB1aW9jX21pbWQudWkuZmNzLmxlbmd0aDsKKworCQlpZiggdWlvY19taW1kLm91dGxlbiApIHVpb2MtPmZsYWdzID0gVUlPQ19SRDsKKwkJaWYoIHVpb2NfbWltZC5pbmxlbiApIHVpb2MtPmZsYWdzIHw9IFVJT0NfV1I7CisKKwkJYnJlYWs7CisKKwljYXNlIDB4ODA6CisKKwkJdWlvYy0+b3Bjb2RlID0gTUJPWF9DTUQ7CisJCXVpb2MtPmFkYXBubyA9IHVpb2NfbWltZC51aS5mY3MuYWRhcG5vOworCisJCW1lbWNweSh1aW9jLT51aW9jX3JtYm94LCB1aW9jX21pbWQubWJveCwgMTgpOworCisJCS8qCisJCSAqIENob29zZSB0aGUgeGZlcmxlbiBiaWdnZXIgb2YgaW5wdXQgYW5kIG91dHB1dCBkYXRhCisJCSAqLworCQl1aW9jLT54ZmVybGVuID0gdWlvY19taW1kLm91dGxlbiA+IHVpb2NfbWltZC5pbmxlbiA/CisJCQl1aW9jX21pbWQub3V0bGVuIDogdWlvY19taW1kLmlubGVuOworCisJCWlmKCB1aW9jX21pbWQub3V0bGVuICkgdWlvYy0+ZmxhZ3MgPSBVSU9DX1JEOworCQlpZiggdWlvY19taW1kLmlubGVuICkgdWlvYy0+ZmxhZ3MgfD0gVUlPQ19XUjsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAoLUVJTlZBTCk7CisKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG1lZ2Ffbl90b19tKCkKKyAqIEBhcmcgLSB1c2VyIGFkZHJlc3MKKyAqIEBtYyAtIG1haWxib3ggY29tbWFuZAorICoKKyAqIFVwZGF0ZXMgdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiB0byB0aGUgYXBwbGljYXRpb24sIGRlcGVuZGluZyBvbiBhcHBsaWNhdGlvbgorICogY29uZm9ybXMgdG8gb2xkZXIgbWltZCBpb2N0bCBpbnRlcmZhY2Ugb3IgbmV3ZXIgTklUIGlvY3RsIGludGVyZmFjZQorICovCitzdGF0aWMgaW50CittZWdhX25fdG9fbSh2b2lkIF9fdXNlciAqYXJnLCBtZWdhY21kX3QgKm1jKQoreworCW5pdGlvY3RsX3QJX191c2VyICp1aW9jcDsKKwltZWdhY21kX3QJX191c2VyICp1bWM7CisJbWVnYV9wYXNzdGhydQlfX3VzZXIgKnVwdGhydTsKKwlzdHJ1Y3QgdWlvY3RsX3QJX191c2VyICp1aW9jX21pbWQ7CisJY2hhcglzaWduYXR1cmVbOF0gPSB7MH07CisKKwkvKgorCSAqIGNoZWNrIGlzIHRoZSBhcHBsaWNhdGlvbiBjb25mb3JtcyB0byBOSVQuCisJICovCisJaWYoIGNvcHlfZnJvbV91c2VyKHNpZ25hdHVyZSwgYXJnLCA3KSApCisJCXJldHVybiAtRUZBVUxUOworCisJaWYoIG1lbWNtcChzaWduYXR1cmUsICJNRUdBTklUIiwgNykgPT0gMCApIHsKKworCQl1aW9jcCA9IGFyZzsKKworCQlpZiggcHV0X3VzZXIobWMtPnN0YXR1cywgKHU4IF9fdXNlciAqKSZNQk9YX1AodWlvY3ApLT5zdGF0dXMpICkKKwkJCXJldHVybiAoLUVGQVVMVCk7CisKKwkJaWYoIG1jLT5jbWQgPT0gTUVHQV9NQk9YQ01EX1BBU1NUSFJVICkgeworCisJCQl1bWMgPSBNQk9YX1AodWlvY3ApOworCisJCQlpZiAoZ2V0X3VzZXIodXB0aHJ1LCAobWVnYV9wYXNzdGhydSBfX3VzZXIgKiBfX3VzZXIgKikmdW1jLT54ZmVyYWRkcikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmKCBwdXRfdXNlcihtYy0+c3RhdHVzLCAodTggX191c2VyICopJnVwdGhydS0+c2NzaXN0YXR1cykpCisJCQkJcmV0dXJuICgtRUZBVUxUKTsKKwkJfQorCX0KKwllbHNlIHsKKwkJdWlvY19taW1kID0gYXJnOworCisJCWlmKCBwdXRfdXNlcihtYy0+c3RhdHVzLCAodTggX191c2VyICopJnVpb2NfbWltZC0+bWJveFsxN10pICkKKwkJCXJldHVybiAoLUVGQVVMVCk7CisKKwkJaWYoIG1jLT5jbWQgPT0gTUVHQV9NQk9YQ01EX1BBU1NUSFJVICkgeworCisJCQl1bWMgPSAobWVnYWNtZF90IF9fdXNlciAqKXVpb2NfbWltZC0+bWJveDsKKworCQkJaWYgKGdldF91c2VyKHVwdGhydSwgKG1lZ2FfcGFzc3RocnUgX191c2VyICogX191c2VyICopJnVtYy0+eGZlcmFkZHIpKQorCQkJCXJldHVybiAoLUVGQVVMVCk7CisKKwkJCWlmKCBwdXRfdXNlcihtYy0+c3RhdHVzLCAodTggX191c2VyICopJnVwdGhydS0+c2NzaXN0YXR1cykgKQorCQkJCXJldHVybiAoLUVGQVVMVCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogTUVHQVJBSUQgJ0ZXJyBjb21tYW5kcy4KKyAqLworCisvKioKKyAqIG1lZ2FfaXNfYmlvc19lbmFibGVkKCkKKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICoKKyAqIGlzc3VlIGNvbW1hbmQgdG8gZmluZCBvdXQgaWYgdGhlIEJJT1MgaXMgZW5hYmxlZCBmb3IgdGhpcyBjb250cm9sbGVyCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FfaXNfYmlvc19lbmFibGVkKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBjaGFyCXJhd19tYm94W3NpemVvZihzdHJ1Y3QgbWJveF9vdXQpXTsKKwltYm94X3QJKm1ib3g7CisJaW50CXJldDsKKworCW1ib3ggPSAobWJveF90ICopcmF3X21ib3g7CisKKwltZW1zZXQoJm1ib3gtPm1fb3V0LCAwLCBzaXplb2YocmF3X21ib3gpKTsKKworCW1lbXNldCgodm9pZCAqKWFkYXB0ZXItPm1lZ2FfYnVmZmVyLCAwLCBNRUdBX0JVRkZFUl9TSVpFKTsKKworCW1ib3gtPm1fb3V0LnhmZXJhZGRyID0gKHUzMilhZGFwdGVyLT5idWZfZG1hX2hhbmRsZTsKKworCXJhd19tYm94WzBdID0gSVNfQklPU19FTkFCTEVEOworCXJhd19tYm94WzJdID0gR0VUX0JJT1M7CisKKworCXJldCA9IGlzc3VlX3NjYl9ibG9jayhhZGFwdGVyLCByYXdfbWJveCk7CisKKwlyZXR1cm4gKihjaGFyICopYWRhcHRlci0+bWVnYV9idWZmZXI7Cit9CisKKworLyoqCisgKiBtZWdhX2VudW1fcmFpZF9zY3NpKCkKKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICoKKyAqIEZpbmQgb3V0IHdoYXQgY2hhbm5lbHMgYXJlIFJBSUQvU0NTSS4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvCisgKiBkaWZmZXJlbnRpYXRlIHRoZSB2aXJ0dWFsIGNoYW5uZWxzIGFuZCBwaHlzaWNhbCBjaGFubmVscyBhbmQgdG8gc3VwcG9ydAorICogUk9NQiBmZWF0dXJlIGFuZCBub24tZGlzayBkZXZpY2VzLgorICovCitzdGF0aWMgdm9pZAorbWVnYV9lbnVtX3JhaWRfc2NzaShhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgY2hhciByYXdfbWJveFtzaXplb2Yoc3RydWN0IG1ib3hfb3V0KV07CisJbWJveF90ICptYm94OworCWludCBpOworCisJbWJveCA9IChtYm94X3QgKilyYXdfbWJveDsKKworCW1lbXNldCgmbWJveC0+bV9vdXQsIDAsIHNpemVvZihyYXdfbWJveCkpOworCisJLyoKKwkgKiBpc3N1ZSBjb21tYW5kIHRvIGZpbmQgb3V0IHdoYXQgY2hhbm5lbHMgYXJlIHJhaWQvc2NzaQorCSAqLworCXJhd19tYm94WzBdID0gQ0hOTF9DTEFTUzsKKwlyYXdfbWJveFsyXSA9IEdFVF9DSE5MX0NMQVNTOworCisJbWVtc2V0KCh2b2lkICopYWRhcHRlci0+bWVnYV9idWZmZXIsIDAsIE1FR0FfQlVGRkVSX1NJWkUpOworCisJbWJveC0+bV9vdXQueGZlcmFkZHIgPSAodTMyKWFkYXB0ZXItPmJ1Zl9kbWFfaGFuZGxlOworCisJLyoKKwkgKiBOb24tUk9NQiBmaXJtd2FyZSBmYWlsIHRoaXMgY29tbWFuZCwgc28gYWxsIGNoYW5uZWxzCisJICogbXVzdCBiZSBzaG93biBSQUlECisJICovCisJYWRhcHRlci0+bWVnYV9jaF9jbGFzcyA9IDB4RkY7CisKKwlpZighaXNzdWVfc2NiX2Jsb2NrKGFkYXB0ZXIsIHJhd19tYm94KSkgeworCQlhZGFwdGVyLT5tZWdhX2NoX2NsYXNzID0gKigoY2hhciAqKWFkYXB0ZXItPm1lZ2FfYnVmZmVyKTsKKworCX0KKworCWZvciggaSA9IDA7IGkgPCBhZGFwdGVyLT5wcm9kdWN0X2luZm8ubmNoYW5uZWxzOyBpKysgKSB7IAorCQlpZiggKGFkYXB0ZXItPm1lZ2FfY2hfY2xhc3MgPj4gaSkgJiAweDAxICkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAibWVnYXJhaWQ6IGNoYW5uZWxbJWRdIGlzIHJhaWQuXG4iLAorCQkJCQlpKTsKKwkJfQorCQllbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIm1lZ2FyYWlkOiBjaGFubmVsWyVkXSBpcyBzY3NpLlxuIiwKKwkJCQkJaSk7CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisKKworLyoqCisgKiBtZWdhX2dldF9ib290X2RydigpCisgKiBAYWRhcHRlciAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiBGaW5kIG91dCB3aGljaCBkZXZpY2UgaXMgdGhlIGJvb3QgZGV2aWNlLiBOb3RlLCBhbnkgbG9naWNhbCBkcml2ZSBvciBhbnkKKyAqIHBoeWljYWwgZGV2aWNlIChlLmcuLCBhIENEUk9NKSBjYW4gYmUgZGVzaWduYXRlZCBhcyBhIGJvb3QgZGV2aWNlLgorICovCitzdGF0aWMgdm9pZAorbWVnYV9nZXRfYm9vdF9kcnYoYWRhcHRlcl90ICphZGFwdGVyKQoreworCXN0cnVjdCBwcml2YXRlX2Jpb3NfZGF0YQkqcHJ2X2Jpb3NfZGF0YTsKKwl1bnNpZ25lZCBjaGFyCXJhd19tYm94W3NpemVvZihzdHJ1Y3QgbWJveF9vdXQpXTsKKwltYm94X3QJKm1ib3g7CisJdTE2CWNrc3VtID0gMDsKKwl1OAkqY2tzdW1fcDsKKwl1OAlib290X3BkcnY7CisJaW50CWk7CisKKwltYm94ID0gKG1ib3hfdCAqKXJhd19tYm94OworCisJbWVtc2V0KCZtYm94LT5tX291dCwgMCwgc2l6ZW9mKHJhd19tYm94KSk7CisKKwlyYXdfbWJveFswXSA9IEJJT1NfUFZUX0RBVEE7CisJcmF3X21ib3hbMl0gPSBHRVRfQklPU19QVlRfREFUQTsKKworCW1lbXNldCgodm9pZCAqKWFkYXB0ZXItPm1lZ2FfYnVmZmVyLCAwLCBNRUdBX0JVRkZFUl9TSVpFKTsKKworCW1ib3gtPm1fb3V0LnhmZXJhZGRyID0gKHUzMilhZGFwdGVyLT5idWZfZG1hX2hhbmRsZTsKKworCWFkYXB0ZXItPmJvb3RfbGRydl9lbmFibGVkID0gMDsKKwlhZGFwdGVyLT5ib290X2xkcnYgPSAwOworCisJYWRhcHRlci0+Ym9vdF9wZHJ2X2VuYWJsZWQgPSAwOworCWFkYXB0ZXItPmJvb3RfcGRydl9jaCA9IDA7CisJYWRhcHRlci0+Ym9vdF9wZHJ2X3RndCA9IDA7CisKKwlpZihpc3N1ZV9zY2JfYmxvY2soYWRhcHRlciwgcmF3X21ib3gpID09IDApIHsKKwkJcHJ2X2Jpb3NfZGF0YSA9CisJCQkoc3RydWN0IHByaXZhdGVfYmlvc19kYXRhICopYWRhcHRlci0+bWVnYV9idWZmZXI7CisKKwkJY2tzdW0gPSAwOworCQlja3N1bV9wID0gKGNoYXIgKilwcnZfYmlvc19kYXRhOworCQlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKyApIHsKKwkJCWNrc3VtICs9ICh1MTYpKCpja3N1bV9wKyspOworCQl9CisKKwkJaWYgKHBydl9iaW9zX2RhdGEtPmNrc3VtID09ICh1MTYpKDAtY2tzdW0pICkgeworCisJCQkvKgorCQkJICogSWYgTVNCIGlzIHNldCwgYSBwaHlzaWNhbCBkcml2ZSBpcyBzZXQgYXMgYm9vdAorCQkJICogZGV2aWNlCisJCQkgKi8KKwkJCWlmKCBwcnZfYmlvc19kYXRhLT5ib290X2RydiAmIDB4ODAgKSB7CisJCQkJYWRhcHRlci0+Ym9vdF9wZHJ2X2VuYWJsZWQgPSAxOworCQkJCWJvb3RfcGRydiA9IHBydl9iaW9zX2RhdGEtPmJvb3RfZHJ2ICYgMHg3RjsKKwkJCQlhZGFwdGVyLT5ib290X3BkcnZfY2ggPSBib290X3BkcnYgLyAxNjsKKwkJCQlhZGFwdGVyLT5ib290X3BkcnZfdGd0ID0gYm9vdF9wZHJ2ICUgMTY7CisJCQl9CisJCQllbHNlIHsKKwkJCQlhZGFwdGVyLT5ib290X2xkcnZfZW5hYmxlZCA9IDE7CisJCQkJYWRhcHRlci0+Ym9vdF9sZHJ2ID0gcHJ2X2Jpb3NfZGF0YS0+Ym9vdF9kcnY7CisJCQl9CisJCX0KKwl9CisKK30KKworLyoqCisgKiBtZWdhX3N1cHBvcnRfcmFuZG9tX2RlbCgpCisgKiBAYWRhcHRlciAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiBGaW5kIG91dCBpZiB0aGlzIGNvbnRyb2xsZXIgc3VwcG9ydHMgcmFuZG9tIGRlbGV0aW9uIGFuZCBhZGRpdGlvbiBvZgorICogbG9naWNhbCBkcml2ZXMKKyAqLworc3RhdGljIGludAorbWVnYV9zdXBwb3J0X3JhbmRvbV9kZWwoYWRhcHRlcl90ICphZGFwdGVyKQoreworCXVuc2lnbmVkIGNoYXIgcmF3X21ib3hbc2l6ZW9mKHN0cnVjdCBtYm94X291dCldOworCW1ib3hfdCAqbWJveDsKKwlpbnQgcnZhbDsKKworCW1ib3ggPSAobWJveF90ICopcmF3X21ib3g7CisKKwltZW1zZXQoJm1ib3gtPm1fb3V0LCAwLCBzaXplb2YocmF3X21ib3gpKTsKKworCS8qCisJICogaXNzdWUgY29tbWFuZAorCSAqLworCXJhd19tYm94WzBdID0gRkNfREVMX0xPR0RSVjsKKwlyYXdfbWJveFsyXSA9IE9QX1NVUF9ERUxfTE9HRFJWOworCisJcnZhbCA9IGlzc3VlX3NjYl9ibG9jayhhZGFwdGVyLCByYXdfbWJveCk7CisKKwlyZXR1cm4gIXJ2YWw7Cit9CisKKworLyoqCisgKiBtZWdhX3N1cHBvcnRfZXh0X2NkYigpCisgKiBAYWRhcHRlciAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiBGaW5kIG91dCBpZiB0aGlzIGZpcm13YXJlIHN1cHBvcnQgY2RibGVuID4gMTAKKyAqLworc3RhdGljIGludAorbWVnYV9zdXBwb3J0X2V4dF9jZGIoYWRhcHRlcl90ICphZGFwdGVyKQoreworCXVuc2lnbmVkIGNoYXIgcmF3X21ib3hbc2l6ZW9mKHN0cnVjdCBtYm94X291dCldOworCW1ib3hfdCAqbWJveDsKKwlpbnQgcnZhbDsKKworCW1ib3ggPSAobWJveF90ICopcmF3X21ib3g7CisKKwltZW1zZXQoJm1ib3gtPm1fb3V0LCAwLCBzaXplb2YocmF3X21ib3gpKTsKKwkvKgorCSAqIGlzc3VlIGNvbW1hbmQgdG8gZmluZCBvdXQgaWYgY29udHJvbGxlciBzdXBwb3J0cyBleHRlbmRlZCBDREJzLgorCSAqLworCXJhd19tYm94WzBdID0gMHhBNDsKKwlyYXdfbWJveFsyXSA9IDB4MTY7CisKKwlydmFsID0gaXNzdWVfc2NiX2Jsb2NrKGFkYXB0ZXIsIHJhd19tYm94KTsKKworCXJldHVybiAhcnZhbDsKK30KKworCisvKioKKyAqIG1lZ2FfZGVsX2xvZ2RydigpCisgKiBAYWRhcHRlciAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqIEBsb2dkcnYgLSBsb2dpY2FsIGRyaXZlIHRvIGJlIGRlbGV0ZWQKKyAqCisgKiBEZWxldGUgdGhlIHNwZWNpZmllZCBsb2dpY2FsIGRyaXZlLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHVzZXIKKyAqIGFwcCB0byBsZXQgdGhlIE9TIGtub3cgYWJvdXQgdGhpcyBvcGVyYXRpb24uCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FfZGVsX2xvZ2RydihhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBsb2dkcnYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzY2JfdCAqc2NiOworCWludCBydmFsOworCisJLyoKKwkgKiBTdG9wIHNlbmRpbmcgY29tbWFuZHMgdG8gdGhlIGNvbnRyb2xsZXIsIHF1ZXVlIHRoZW0gaW50ZXJuYWxseS4KKwkgKiBXaGVuIGRlbGV0aW9uIGlzIGNvbXBsZXRlLCBJU1Igd2lsbCBmbHVzaCB0aGUgcXVldWUuCisJICovCisJYXRvbWljX3NldCgmYWRhcHRlci0+cXVpZXNjZW50LCAxKTsKKworCS8qCisJICogV2FpdCB0aWxsIGFsbCB0aGUgaXNzdWVkIGNvbW1hbmRzIGFyZSBjb21wbGV0ZSBhbmQgdGhlcmUgYXJlIG5vCisJICogY29tbWFuZHMgaW4gdGhlIHBlbmRpbmcgcXVldWUKKwkgKi8KKwl3aGlsZSAoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnBlbmRfY21kcykgPiAwIHx8CisJICAgICAgICFsaXN0X2VtcHR5KCZhZGFwdGVyLT5wZW5kaW5nX2xpc3QpKQorCQltc2xlZXAoMTAwMCk7CS8qIHNsZWVwIGZvciAxcyAqLworCisJcnZhbCA9IG1lZ2FfZG9fZGVsX2xvZ2RydihhZGFwdGVyLCBsb2dkcnYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogSWYgZGVsZXRlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgYWRkIDB4ODAgdG8gdGhlIGxvZ2ljYWwgZHJpdmUKKwkgKiBpZHMgZm9yIGNvbW1hbmRzIGluIHRoZSBwZW5kaW5nIHF1ZXVlLgorCSAqLworCWlmIChhZGFwdGVyLT5yZWFkX2xkaWRtYXApIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCQlsaXN0X2Zvcl9lYWNoKHBvcywgJmFkYXB0ZXItPnBlbmRpbmdfbGlzdCkgeworCQkJc2NiID0gbGlzdF9lbnRyeShwb3MsIHNjYl90LCBsaXN0KTsKKwkJCWlmIChzY2ItPnB0aHJ1LT5sb2dkcnYgPCAweDgwICkKKwkJCQlzY2ItPnB0aHJ1LT5sb2dkcnYgKz0gMHg4MDsKKwkJfQorCX0KKworCWF0b21pY19zZXQoJmFkYXB0ZXItPnF1aWVzY2VudCwgMCk7CisKKwltZWdhX3J1bnBlbmRxKGFkYXB0ZXIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKKworc3RhdGljIGludAorbWVnYV9kb19kZWxfbG9nZHJ2KGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IGxvZ2RydikKK3sKKwltZWdhY21kX3QJbWM7CisJaW50CXJ2YWw7CisKKwltZW1zZXQoICZtYywgMCwgc2l6ZW9mKG1lZ2FjbWRfdCkpOworCisJbWMuY21kID0gRkNfREVMX0xPR0RSVjsKKwltYy5vcGNvZGUgPSBPUF9ERUxfTE9HRFJWOworCW1jLnN1Ym9wY29kZSA9IGxvZ2RydjsKKworCXJ2YWwgPSBtZWdhX2ludGVybmFsX2NvbW1hbmQoYWRhcHRlciwgTE9DS19JTlQsICZtYywgTlVMTCk7CisKKwkvKiBsb2cgdGhpcyBldmVudCAqLworCWlmKHJ2YWwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWQ6IERlbGV0ZSBMRC0lZCBmYWlsZWQuIiwgbG9nZHJ2KTsKKwkJcmV0dXJuIHJ2YWw7CisJfQorCisJLyoKKwkgKiBBZnRlciBkZWxldGluZyBmaXJzdCBsb2dpY2FsIGRyaXZlLCB0aGUgbG9naWNhbCBkcml2ZXMgbXVzdCBiZQorCSAqIGFkZHJlc3NlZCBieSBhZGRpbmcgMHg4MCB0byB0aGUgbG9naWNhbCBkcml2ZSBpZC4KKwkgKi8KKwlhZGFwdGVyLT5yZWFkX2xkaWRtYXAgPSAxOworCisJcmV0dXJuIHJ2YWw7Cit9CisKKworLyoqCisgKiBtZWdhX2dldF9tYXhfc2dsKCkKKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICoKKyAqIEZpbmQgb3V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBzY2F0dGVyLWdhdGhlciBlbGVtZW50cyBzdXBwb3J0ZWQgYnkgdGhpcworICogdmVyc2lvbiBvZiB0aGUgZmlybXdhcmUKKyAqLworc3RhdGljIHZvaWQKK21lZ2FfZ2V0X21heF9zZ2woYWRhcHRlcl90ICphZGFwdGVyKQoreworCXVuc2lnbmVkIGNoYXIJcmF3X21ib3hbc2l6ZW9mKHN0cnVjdCBtYm94X291dCldOworCW1ib3hfdAkqbWJveDsKKworCW1ib3ggPSAobWJveF90ICopcmF3X21ib3g7CisKKwltZW1zZXQobWJveCwgMCwgc2l6ZW9mKHJhd19tYm94KSk7CisKKwltZW1zZXQoKHZvaWQgKilhZGFwdGVyLT5tZWdhX2J1ZmZlciwgMCwgTUVHQV9CVUZGRVJfU0laRSk7CisKKwltYm94LT5tX291dC54ZmVyYWRkciA9ICh1MzIpYWRhcHRlci0+YnVmX2RtYV9oYW5kbGU7CisKKwlyYXdfbWJveFswXSA9IE1BSU5fTUlTQ19PUENPREU7CisJcmF3X21ib3hbMl0gPSBHRVRfTUFYX1NHX1NVUFBPUlQ7CisKKworCWlmKCBpc3N1ZV9zY2JfYmxvY2soYWRhcHRlciwgcmF3X21ib3gpICkgeworCQkvKgorCQkgKiBmL3cgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGNvbW1hbmQuIENob29zZSB0aGUgZGVmYXVsdCB2YWx1ZQorCQkgKi8KKwkJYWRhcHRlci0+c2dsZW4gPSBNSU5fU0dMSVNUOworCX0KKwllbHNlIHsKKwkJYWRhcHRlci0+c2dsZW4gPSAqKChjaGFyICopYWRhcHRlci0+bWVnYV9idWZmZXIpOworCQkKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoaXMgaXMgbm90IG1vcmUgdGhhbiB0aGUgcmVzb3VyY2VzIHdlIGFyZQorCQkgKiBwbGFubmluZyB0byBhbGxvY2F0ZQorCQkgKi8KKwkJaWYgKCBhZGFwdGVyLT5zZ2xlbiA+IE1BWF9TR0xJU1QgKQorCQkJYWRhcHRlci0+c2dsZW4gPSBNQVhfU0dMSVNUOworCX0KKworCXJldHVybjsKK30KKworCisvKioKKyAqIG1lZ2Ffc3VwcG9ydF9jbHVzdGVyKCkKKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICoKKyAqIEZpbmQgb3V0IGlmIHRoaXMgZmlybXdhcmUgc3VwcG9ydCBjbHVzdGVyIGNhbGxzLgorICovCitzdGF0aWMgaW50CittZWdhX3N1cHBvcnRfY2x1c3RlcihhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgY2hhcglyYXdfbWJveFtzaXplb2Yoc3RydWN0IG1ib3hfb3V0KV07CisJbWJveF90CSptYm94OworCisJbWJveCA9IChtYm94X3QgKilyYXdfbWJveDsKKworCW1lbXNldChtYm94LCAwLCBzaXplb2YocmF3X21ib3gpKTsKKworCW1lbXNldCgodm9pZCAqKWFkYXB0ZXItPm1lZ2FfYnVmZmVyLCAwLCBNRUdBX0JVRkZFUl9TSVpFKTsKKworCW1ib3gtPm1fb3V0LnhmZXJhZGRyID0gKHUzMilhZGFwdGVyLT5idWZfZG1hX2hhbmRsZTsKKworCS8qCisJICogVHJ5IHRvIGdldCB0aGUgaW5pdGlhdG9yIGlkLiBUaGlzIGNvbW1hbmQgd2lsbCBzdWNjZWVkIGlmZiB0aGUKKwkgKiBjbHVzdGVyaW5nIGlzIGF2YWlsYWJsZSBvbiB0aGlzIEhCQS4KKwkgKi8KKwlyYXdfbWJveFswXSA9IE1FR0FfR0VUX1RBUkdFVF9JRDsKKworCWlmKCBpc3N1ZV9zY2JfYmxvY2soYWRhcHRlciwgcmF3X21ib3gpID09IDAgKSB7CisKKwkJLyoKKwkJICogQ2x1c3RlciBzdXBwb3J0IGF2YWlsYWJsZS4gR2V0IHRoZSBpbml0aWF0b3IgdGFyZ2V0IGlkLgorCQkgKiBUZWxsIG91ciBpZCB0byBtaWQtbGF5ZXIgdG9vLgorCQkgKi8KKwkJYWRhcHRlci0+dGhpc19pZCA9ICoodTMyICopYWRhcHRlci0+bWVnYV9idWZmZXI7CisJCWFkYXB0ZXItPmhvc3QtPnRoaXNfaWQgPSBhZGFwdGVyLT50aGlzX2lkOworCisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qKgorICogbWVnYV9hZGFwaW5xKCkKKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICogQGRtYV9oYW5kbGUgLSBETUEgYWRkcmVzcyBvZiB0aGUgYnVmZmVyCisgKgorICogSXNzdWUgaW50ZXJuYWwgY29tYW1uZHMgd2hpbGUgaW50ZXJydXB0cyBhcmUgYXZhaWxhYmxlLgorICogV2Ugb25seSBpc3N1ZSBkaXJlY3QgbWFpbGJveCBjb21tYW5kcyBmcm9tIHdpdGhpbiB0aGUgZHJpdmVyLiBpb2N0bCgpCisgKiBpbnRlcmZhY2UgdXNpbmcgdGhlc2Ugcm91dGluZXMgY2FuIGlzc3VlIHBhc3N0aHJ1IGNvbW1hbmRzLgorICovCitzdGF0aWMgaW50CittZWdhX2FkYXBpbnEoYWRhcHRlcl90ICphZGFwdGVyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCit7CisJbWVnYWNtZF90CW1jOworCisJbWVtc2V0KCZtYywgMCwgc2l6ZW9mKG1lZ2FjbWRfdCkpOworCisJaWYoIGFkYXB0ZXItPmZsYWcgJiBCT0FSRF80MExEICkgeworCQltYy5jbWQgPSBGQ19ORVdfQ09ORklHOworCQltYy5vcGNvZGUgPSBOQ19TVUJPUF9FTlFVSVJZMzsKKwkJbWMuc3Vib3Bjb2RlID0gRU5RM19HRVRfU09MSUNJVEVEX0ZVTEw7CisJfQorCWVsc2UgeworCQltYy5jbWQgPSBNRUdBX01CT1hDTURfQURQRVhUSU5ROworCX0KKworCW1jLnhmZXJhZGRyID0gKHUzMilkbWFfaGFuZGxlOworCisJaWYgKCBtZWdhX2ludGVybmFsX2NvbW1hbmQoYWRhcHRlciwgTE9DS19JTlQsICZtYywgTlVMTCkgIT0gMCApIHsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qKiBtZWdhX2ludGVybmFsX2Rldl9pbnF1aXJ5KCkKKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICogQGNoIC0gY2hhbm5lbCBmb3IgdGhpcyBkZXZpY2UKKyAqIEB0Z3QgLSBJRCBvZiB0aGlzIGRldmljZQorICogQGJ1Zl9kbWFfaGFuZGxlIC0gRE1BIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcgorICoKKyAqIElzc3VlIHRoZSBzY3NpIGlucXVpcnkgZm9yIHRoZSBzcGVjaWZpZWQgZGV2aWNlLgorICovCitzdGF0aWMgaW50CittZWdhX2ludGVybmFsX2Rldl9pbnF1aXJ5KGFkYXB0ZXJfdCAqYWRhcHRlciwgdTggY2gsIHU4IHRndCwKKwkJZG1hX2FkZHJfdCBidWZfZG1hX2hhbmRsZSkKK3sKKwltZWdhX3Bhc3N0aHJ1CSpwdGhydTsKKwlkbWFfYWRkcl90CXB0aHJ1X2RtYV9oYW5kbGU7CisJbWVnYWNtZF90CW1jOworCWludAkJcnZhbDsKKwlzdHJ1Y3QgcGNpX2RldgkqcGRldjsKKworCisJLyoKKwkgKiBGb3IgYWxsIGludGVybmFsIGNvbW1hbmRzLCB0aGUgYnVmZmVyIG11c3QgYmUgYWxsb2NhdGVkIGluIDw0R0IKKwkgKiBhZGRyZXNzIHJhbmdlCisJICovCisJaWYoIG1ha2VfbG9jYWxfcGRldihhZGFwdGVyLCAmcGRldikgIT0gMCApIHJldHVybiAtMTsKKworCXB0aHJ1ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKG1lZ2FfcGFzc3RocnUpLAorCQkJJnB0aHJ1X2RtYV9oYW5kbGUpOworCisJaWYoIHB0aHJ1ID09IE5VTEwgKSB7CisJCWZyZWVfbG9jYWxfcGRldihwZGV2KTsKKwkJcmV0dXJuIC0xOworCX0KKworCXB0aHJ1LT50aW1lb3V0ID0gMjsKKwlwdGhydS0+YXJzID0gMTsKKwlwdGhydS0+cmVxc2Vuc2VsZW4gPSAxNDsKKwlwdGhydS0+aXNsb2dpY2FsID0gMDsKKworCXB0aHJ1LT5jaGFubmVsID0gKGFkYXB0ZXItPmZsYWcgJiBCT0FSRF80MExEKSA/IDAgOiBjaDsKKworCXB0aHJ1LT50YXJnZXQgPSAoYWRhcHRlci0+ZmxhZyAmIEJPQVJEXzQwTEQpID8gKGNoIDw8IDQpfHRndCA6IHRndDsKKworCXB0aHJ1LT5jZGJsZW4gPSA2OworCisJcHRocnUtPmNkYlswXSA9IElOUVVJUlk7CisJcHRocnUtPmNkYlsxXSA9IDA7CisJcHRocnUtPmNkYlsyXSA9IDA7CisJcHRocnUtPmNkYlszXSA9IDA7CisJcHRocnUtPmNkYls0XSA9IDI1NTsKKwlwdGhydS0+Y2RiWzVdID0gMDsKKworCisJcHRocnUtPmRhdGF4ZmVyYWRkciA9ICh1MzIpYnVmX2RtYV9oYW5kbGU7CisJcHRocnUtPmRhdGF4ZmVybGVuID0gMjU2OworCisJbWVtc2V0KCZtYywgMCwgc2l6ZW9mKG1lZ2FjbWRfdCkpOworCisJbWMuY21kID0gTUVHQV9NQk9YQ01EX1BBU1NUSFJVOworCW1jLnhmZXJhZGRyID0gKHUzMilwdGhydV9kbWFfaGFuZGxlOworCisJcnZhbCA9IG1lZ2FfaW50ZXJuYWxfY29tbWFuZChhZGFwdGVyLCBMT0NLX0lOVCwgJm1jLCBwdGhydSk7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZihtZWdhX3Bhc3N0aHJ1KSwgcHRocnUsCisJCQlwdGhydV9kbWFfaGFuZGxlKTsKKworCWZyZWVfbG9jYWxfcGRldihwZGV2KTsKKworCXJldHVybiBydmFsOworfQorCisKKy8qKgorICogbWVnYV9pbnRlcm5hbF9jb21tYW5kKCkKKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICogQGxzIC0gdGhlIHNjb3BlIG9mIHRoZSBleGNsdXNpb24gbG9jay4KKyAqIEBtYyAtIHRoZSBtYWlsYm94IGNvbW1hbmQKKyAqIEBwdGhydSAtIFBhc3N0aHJ1IHN0cnVjdHVyZSBmb3IgRENEQiBjb21tYW5kcworICoKKyAqIElzc3VlIHRoZSBpbnRlcm5hbCBjb21tYW5kcyBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAqIFRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBwYXNzdGhydSBzdHJ1Y3R1cmUgaWYgdGhlIGNvbW1hbmQKKyAqIHRvIGJlIGZpcmVkIGlzIGEgcGFzc3RocnUgY29tbWFuZAorICoKKyAqIGxvY2tzY29wZSBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGFjcXVpcmVkIHRoZSBsb2NrLiBPZgorICogY291cnNlLCB0aGUgY2FsbGVyIG11c3Qga25vdyB3aGljaCBsb2NrIHdlIGFyZSB0YWxraW5nIGFib3V0LgorICoKKyAqIE5vdGU6IHBhcmFtZXRlciAncHRocnUnIGlzIG51bGwgZm9yIG5vbi1wYXNzdGhydSBjb21tYW5kcy4KKyAqLworc3RhdGljIGludAorbWVnYV9pbnRlcm5hbF9jb21tYW5kKGFkYXB0ZXJfdCAqYWRhcHRlciwgbG9ja3Njb3BlX3QgbHMsIG1lZ2FjbWRfdCAqbWMsCisJCW1lZ2FfcGFzc3RocnUgKnB0aHJ1ICkKK3sKKwlTY3NpX0NtbmQJKnNjbWQ7CisJc3RydWN0CXNjc2lfZGV2aWNlICpzZGV2OworCXVuc2lnbmVkIGxvbmcJZmxhZ3MgPSAwOworCXNjYl90CSpzY2I7CisJaW50CXJ2YWw7CisKKwkvKgorCSAqIFRoZSBpbnRlcm5hbCBjb21tYW5kcyBzaGFyZSBvbmUgY29tbWFuZCBpZCBhbmQgaGVuY2UgYXJlCisJICogc2VyaWFsaXplZC4gVGhpcyBpcyBzbyBiZWNhdXNlIHdlIHdhbnQgdG8gcmVzZXJ2ZSBtYXhpbXVtIG51bWJlciBvZgorCSAqIGF2YWlsYWJsZSBjb21tYW5kIGlkcyBmb3IgdGhlIEkvTyBjb21tYW5kcy4KKwkgKi8KKwlkb3duKCZhZGFwdGVyLT5pbnRfbXR4KTsKKworCXNjYiA9ICZhZGFwdGVyLT5pbnRfc2NiOworCW1lbXNldChzY2IsIDAsIHNpemVvZihzY2JfdCkpOworCisJc2NtZCA9ICZhZGFwdGVyLT5pbnRfc2NtZDsKKwltZW1zZXQoc2NtZCwgMCwgc2l6ZW9mKFNjc2lfQ21uZCkpOworCisJc2RldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY3NpX2RldmljZSksIEdGUF9LRVJORUwpOworCW1lbXNldChzZGV2LCAwLCBzaXplb2Yoc3RydWN0IHNjc2lfZGV2aWNlKSk7CisJc2NtZC0+ZGV2aWNlID0gc2RldjsKKworCXNjbWQtPmRldmljZS0+aG9zdCA9IGFkYXB0ZXItPmhvc3Q7CisJc2NtZC0+YnVmZmVyID0gKHZvaWQgKilzY2I7CisJc2NtZC0+Y21uZFswXSA9IE1FR0FfSU5URVJOQUxfQ01EOworCisJc2NiLT5zdGF0ZSB8PSBTQ0JfQUNUSVZFOworCXNjYi0+Y21kID0gc2NtZDsKKworCW1lbWNweShzY2ItPnJhd19tYm94LCBtYywgc2l6ZW9mKG1lZ2FjbWRfdCkpOworCisJLyoKKwkgKiBJcyBpdCBhIHBhc3N0aHJ1IGNvbW1hbmQKKwkgKi8KKwlpZiggbWMtPmNtZCA9PSBNRUdBX01CT1hDTURfUEFTU1RIUlUgKSB7CisKKwkJc2NiLT5wdGhydSA9IHB0aHJ1OworCX0KKworCXNjYi0+aWR4ID0gQ01ESURfSU5UX0NNRFM7CisKKwlzY21kLT5zdGF0ZSA9IDA7CisKKwkvKgorCSAqIEdldCB0aGUgbG9jayBvbmx5IGlmIHRoZSBjYWxsZXIgaGFzIG5vdCBhY3F1aXJlZCBpdCBhbHJlYWR5CisJICovCisJaWYoIGxzID09IExPQ0tfSU5UICkgc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKworCW1lZ2FyYWlkX3F1ZXVlKHNjbWQsIG1lZ2FfaW50ZXJuYWxfZG9uZSk7CisKKwlpZiggbHMgPT0gTE9DS19JTlQgKSBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFdhaXQgdGlsbCB0aGlzIGNvbW1hbmQgZmluaXNoZXMuIERvIG5vdCB1c2UKKwkgKiB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKS4gSXQgY2F1c2VzIHBhbmljIGlmIENUUkwtQyBpcyBoaXQgd2hlbgorCSAqIGR1bXBpbmcgZS5nLiwgcGh5c2ljYWwgZGlzayBpbmZvcm1hdGlvbiB0aHJvdWdoIC9wcm9jIGludGVyZmFjZS4KKwkgKi8KKyNpZiAwCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGFkYXB0ZXItPmludF93YWl0cSwgc2NtZC0+c3RhdGUpOworI2VuZGlmCisJd2FpdF9ldmVudChhZGFwdGVyLT5pbnRfd2FpdHEsIHNjbWQtPnN0YXRlKTsKKworCXJ2YWwgPSBzY21kLT5yZXN1bHQ7CisJbWMtPnN0YXR1cyA9IHNjbWQtPnJlc3VsdDsKKwlrZnJlZShzZGV2KTsKKworCS8qCisJICogUHJpbnQgYSBkZWJ1ZyBtZXNzYWdlIGZvciBhbGwgZmFpbGVkIGNvbW1hbmRzLiBBcHBsaWNhdGlvbnMgY2FuIHVzZQorCSAqIHRoaXMgaW5mb3JtYXRpb24uCisJICovCisJaWYoIHNjbWQtPnJlc3VsdCAmJiB0cmFjZV9sZXZlbCApIHsKKwkJcHJpbnRrKCJtZWdhcmFpZDogY21kIFsleCwgJXgsICV4XSBzdGF0dXM6WyV4XVxuIiwKKwkJCW1jLT5jbWQsIG1jLT5vcGNvZGUsIG1jLT5zdWJvcGNvZGUsIHNjbWQtPnJlc3VsdCk7CisJfQorCisJdXAoJmFkYXB0ZXItPmludF9tdHgpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKKworLyoqCisgKiBtZWdhX2ludGVybmFsX2RvbmUoKQorICogQHNjbWQgLSBpbnRlcm5hbCBzY3NpIGNvbW1hbmQKKyAqCisgKiBDYWxsYmFjayByb3V0aW5lIGZvciBpbnRlcm5hbCBjb21tYW5kcy4KKyAqLworc3RhdGljIHZvaWQKK21lZ2FfaW50ZXJuYWxfZG9uZShTY3NpX0NtbmQgKnNjbWQpCit7CisJYWRhcHRlcl90CSphZGFwdGVyOworCisJYWRhcHRlciA9IChhZGFwdGVyX3QgKilzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJc2NtZC0+c3RhdGUgPSAxOyAvKiB0aHJlYWQgd2FpdGluZyBmb3IgaXRzIGNvbW1hbmQgdG8gY29tcGxldGUgKi8KKworCS8qCisJICogU2VlIGNvbW1lbnQgaW4gbWVnYV9pbnRlcm5hbF9jb21tYW5kKCkgcm91dGluZSBmb3IKKwkgKiB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKQorCSAqLworI2lmIDAKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFkYXB0ZXItPmludF93YWl0cSk7CisjZW5kaWYKKwl3YWtlX3VwKCZhZGFwdGVyLT5pbnRfd2FpdHEpOworCit9CisKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgbWVnYXJhaWRfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJCT0gIk1lZ2FSQUlEIiwKKwkucHJvY19uYW1lCQkJPSAibWVnYXJhaWQiLAorCS5pbmZvCQkJCT0gbWVnYXJhaWRfaW5mbywKKwkucXVldWVjb21tYW5kCQkJPSBtZWdhcmFpZF9xdWV1ZSwJCisJLmJpb3NfcGFyYW0JCQk9IG1lZ2FyYWlkX2Jpb3NwYXJhbSwKKwkubWF4X3NlY3RvcnMJCQk9IE1BWF9TRUNUT1JTX1BFUl9JTywKKwkuY2FuX3F1ZXVlCQkJPSBNQVhfQ09NTUFORFMsCisJLnRoaXNfaWQJCQk9IERFRkFVTFRfSU5JVElBVE9SX0lELAorCS5zZ190YWJsZXNpemUJCQk9IE1BWF9TR0xJU1QsCisJLmNtZF9wZXJfbHVuCQkJPSBERUZfQ01EX1BFUl9MVU4sCisJLnVzZV9jbHVzdGVyaW5nCQkJPSBFTkFCTEVfQ0xVU1RFUklORywKKwkuZWhfYWJvcnRfaGFuZGxlcgkJPSBtZWdhcmFpZF9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIJPSBtZWdhcmFpZF9yZXNldCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJCT0gbWVnYXJhaWRfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgkJPSBtZWdhcmFpZF9yZXNldCwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CittZWdhcmFpZF9wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCWFkYXB0ZXJfdCAqYWRhcHRlcjsKKwl1bnNpZ25lZCBsb25nIG1lZ2FfYmFzZXBvcnQsIHRiYXNlLCBmbGFnID0gMDsKKwl1MTYgc3Vic3lzaWQsIHN1YnN5c3ZpZDsKKwl1OCBwY2lfYnVzLCBwY2lfZGV2X2Z1bmM7CisJaW50IGlycSwgaSwgajsKKwlpbnQgZXJyb3IgPSAtRU5PREVWOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlnb3RvIG91dDsKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCXBjaV9idXMgPSBwZGV2LT5idXMtPm51bWJlcjsKKwlwY2lfZGV2X2Z1bmMgPSBwZGV2LT5kZXZmbjsKKworCS8qCisJICogVGhlIG1lZ2FyYWlkMyBzdHVmZiByZXBvcnRzIHRoZSBJRCBvZiB0aGUgSW50ZWwgcGFydCB3aGljaCBpcyBub3QKKwkgKiByZW1vdGVseSBzcGVjaWZpYyB0byB0aGUgbWVnYXJhaWQKKwkgKi8KKwlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfSU5URUwpIHsKKwkJdTE2IG1hZ2ljOworCQkvKgorCQkgKiBEb24ndCBmYWxsIG92ZXIgdGhlIENvbXBhcSBtYW5hZ2VtZW50IGNhcmRzIHVzaW5nIHRoZSBzYW1lCisJCSAqIFBDSSBpZGVudGlmaWVyCisJCSAqLworCQlpZiAocGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0NPTVBBUSAmJgorCQkgICAgcGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweEMwMDApCisJCSAgIAlyZXR1cm4gLUVOT0RFVjsKKwkJLyogTm93IGNoZWNrIHRoZSBtYWdpYyBzaWduYXR1cmUgYnl0ZSAqLworCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09ORl9BTUlTSUcsICZtYWdpYyk7CisJCWlmIChtYWdpYyAhPSBIQkFfU0lHTkFUVVJFXzQ3MSAmJiBtYWdpYyAhPSBIQkFfU0lHTkFUVVJFKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCS8qIE9rIGl0IGlzIHByb2JhYmx5IGEgbWVnYXJhaWQgKi8KKwl9CisKKwkvKgorCSAqIEZvciB0aGVzZSB2ZW5kb3IgYW5kIGRldmljZSBpZHMsIHNpZ25hdHVyZSBvZmZzZXRzIGFyZSBub3QKKwkgKiB2YWxpZCBhbmQgNjQgYml0IGlzIGltcGxpY2l0CisJICovCisJaWYgKGlkLT5kcml2ZXJfZGF0YSAmIEJPQVJEXzY0QklUKQorCQlmbGFnIHw9IEJPQVJEXzY0QklUOworCWVsc2UgeworCQl1MzIgbWFnaWM2NDsKKworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0NPTkZfQU1JU0lHNjQsICZtYWdpYzY0KTsKKwkJaWYgKG1hZ2ljNjQgPT0gSEJBX1NJR05BVFVSRV82NEJJVCkKKwkJCWZsYWcgfD0gQk9BUkRfNjRCSVQ7CisJfQorCisJc3Vic3lzdmlkID0gcGRldi0+c3Vic3lzdGVtX3ZlbmRvcjsKKwlzdWJzeXNpZCA9IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIm1lZ2FyYWlkOiBmb3VuZCAweCU0LjA0eDoweCU0LjA0eDpidXMgJWQ6IiwKKwkJaWQtPnZlbmRvciwgaWQtPmRldmljZSwgcGNpX2J1cyk7CisKKwlwcmludGsoInNsb3QgJWQ6ZnVuYyAlZFxuIiwKKwkJUENJX1NMT1QocGNpX2Rldl9mdW5jKSwgUENJX0ZVTkMocGNpX2Rldl9mdW5jKSk7CisKKwkvKiBSZWFkIHRoZSBiYXNlIHBvcnQgYW5kIElSUSBmcm9tIFBDSSAqLworCW1lZ2FfYmFzZXBvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJaXJxID0gcGRldi0+aXJxOworCisJdGJhc2UgPSBtZWdhX2Jhc2Vwb3J0OworCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkgeworCQlmbGFnIHw9IEJPQVJEX01FTU1BUDsKKworCQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihtZWdhX2Jhc2Vwb3J0LCAxMjgsICJtZWdhcmFpZCIpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZDogbWVtIHJlZ2lvbiBidXN5IVxuIik7CisJCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKKwkJfQorCisJCW1lZ2FfYmFzZXBvcnQgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKG1lZ2FfYmFzZXBvcnQsIDEyOCk7CisJCWlmICghbWVnYV9iYXNlcG9ydCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJtZWdhcmFpZDogY291bGQgbm90IG1hcCBoYmEgbWVtb3J5XG4iKTsKKwkJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOworCQl9CisJfSBlbHNlIHsKKwkJZmxhZyB8PSBCT0FSRF9JT01BUDsKKwkJbWVnYV9iYXNlcG9ydCArPSAweDEwOworCisJCWlmICghcmVxdWVzdF9yZWdpb24obWVnYV9iYXNlcG9ydCwgMTYsICJtZWdhcmFpZCIpKQorCQkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJLyogSW5pdGlhbGl6ZSBTQ1NJIEhvc3Qgc3RydWN0dXJlICovCisJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmbWVnYXJhaWRfdGVtcGxhdGUsIHNpemVvZihhZGFwdGVyX3QpKTsKKwlpZiAoIWhvc3QpCisJCWdvdG8gb3V0X2lvdW5tYXA7CisKKwlhZGFwdGVyID0gKGFkYXB0ZXJfdCAqKWhvc3QtPmhvc3RkYXRhOworCW1lbXNldChhZGFwdGVyLCAwLCBzaXplb2YoYWRhcHRlcl90KSk7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UKKwkJInNjc2klZDpGb3VuZCBNZWdhUkFJRCBjb250cm9sbGVyIGF0IDB4JWx4LCBJUlE6JWRcbiIsCisJCWhvc3QtPmhvc3Rfbm8sIG1lZ2FfYmFzZXBvcnQsIGlycSk7CisKKwlhZGFwdGVyLT5iYXNlID0gbWVnYV9iYXNlcG9ydDsKKworCUlOSVRfTElTVF9IRUFEKCZhZGFwdGVyLT5mcmVlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZhZGFwdGVyLT5wZW5kaW5nX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZhZGFwdGVyLT5jb21wbGV0ZWRfbGlzdCk7CisKKwlhZGFwdGVyLT5mbGFnID0gZmxhZzsKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+bG9jayk7CisJc2NzaV9hc3NpZ25fbG9jayhob3N0LCAmYWRhcHRlci0+bG9jayk7CisKKwlob3N0LT5jbWRfcGVyX2x1biA9IG1heF9jbWRfcGVyX2x1bjsKKwlob3N0LT5tYXhfc2VjdG9ycyA9IG1heF9zZWN0b3JzX3Blcl9pbzsKKworCWFkYXB0ZXItPmRldiA9IHBkZXY7CisJYWRhcHRlci0+aG9zdCA9IGhvc3Q7CisKKwlhZGFwdGVyLT5ob3N0LT5pcnEgPSBpcnE7CisKKwlpZiAoZmxhZyAmIEJPQVJEX01FTU1BUCkKKwkJYWRhcHRlci0+aG9zdC0+YmFzZSA9IHRiYXNlOworCWVsc2UgeworCQlhZGFwdGVyLT5ob3N0LT5pb19wb3J0ID0gdGJhc2U7CisJCWFkYXB0ZXItPmhvc3QtPm5faW9fcG9ydCA9IDE2OworCX0KKworCWFkYXB0ZXItPmhvc3QtPnVuaXF1ZV9pZCA9IChwY2lfYnVzIDw8IDgpIHwgcGNpX2Rldl9mdW5jOworCisJLyoKKwkgKiBBbGxvY2F0ZSBidWZmZXIgdG8gaXNzdWUgaW50ZXJuYWwgY29tbWFuZHMuCisJICovCisJYWRhcHRlci0+bWVnYV9idWZmZXIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5kZXYsCisJCU1FR0FfQlVGRkVSX1NJWkUsICZhZGFwdGVyLT5idWZfZG1hX2hhbmRsZSk7CisJaWYgKCFhZGFwdGVyLT5tZWdhX2J1ZmZlcikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZDogb3V0IG9mIFJBTS5cbiIpOworCQlnb3RvIG91dF9ob3N0X3B1dDsKKwl9CisKKwlhZGFwdGVyLT5zY2JfbGlzdCA9IGttYWxsb2Moc2l6ZW9mKHNjYl90KSAqIE1BWF9DT01NQU5EUywgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZGFwdGVyLT5zY2JfbGlzdCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZDogb3V0IG9mIFJBTS5cbiIpOworCQlnb3RvIG91dF9mcmVlX2NtZF9idWZmZXI7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKGlycSwgKGFkYXB0ZXItPmZsYWcgJiBCT0FSRF9NRU1NQVApID8KKwkJCQltZWdhcmFpZF9pc3JfbWVtbWFwcGVkIDogbWVnYXJhaWRfaXNyX2lvbWFwcGVkLAorCQkJCQlTQV9TSElSUSwgIm1lZ2FyYWlkIiwgYWRhcHRlcikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiBDb3VsZG4ndCByZWdpc3RlciBJUlEgJWQhXG4iLCBpcnEpOworCQlnb3RvIG91dF9mcmVlX3NjYl9saXN0OworCX0KKworCWlmIChtZWdhX3NldHVwX21haWxib3goYWRhcHRlcikpCisJCWdvdG8gb3V0X2ZyZWVfaXJxOworCisJaWYgKG1lZ2FfcXVlcnlfYWRhcHRlcihhZGFwdGVyKSkKKwkJZ290byBvdXRfZnJlZV9tYm94OworCisJLyoKKwkgKiBIYXZlIGNoZWNrcyBmb3Igc29tZSBidWdneSBmL3cKKwkgKi8KKwlpZiAoKHN1YnN5c2lkID09IDB4MTExMSkgJiYgKHN1YnN5c3ZpZCA9PSAweDExMTEpKSB7CisJCS8qCisJCSAqIFdoaWNoIGZpcm13YXJlCisJCSAqLworCQlpZiAoIXN0cmNtcChhZGFwdGVyLT5md192ZXJzaW9uLCAiMy4wMCIpIHx8CisJCQkJIXN0cmNtcChhZGFwdGVyLT5md192ZXJzaW9uLCAiMy4wMSIpKSB7CisKKwkJCXByaW50ayggS0VSTl9XQVJOSU5HCisJCQkJIm1lZ2FyYWlkOiBZb3VyICBjYXJkIGlzIGEgRGVsbCBQRVJDICIKKwkJCQkiMi9TQyBSQUlEIGNvbnRyb2xsZXIgd2l0aCAgIgorCQkJCSJmaXJtd2FyZVxubWVnYXJhaWQ6IDMuMDAgb3IgMy4wMS4gICIKKwkJCQkiVGhpcyBkcml2ZXIgaXMga25vd24gdG8gaGF2ZSAiCisJCQkJImNvcnJ1cHRpb24gaXNzdWVzXG5tZWdhcmFpZDogd2l0aCAiCisJCQkJInRob3NlIGZpcm13YXJlIHZlcnNpb25zIG9uIHRoaXMgIgorCQkJCSJzcGVjaWZpYyBjYXJkLiAgSW4gb3JkZXJcbm1lZ2FyYWlkOiAiCisJCQkJInRvIHByb3RlY3QgeW91ciBkYXRhLCBwbGVhc2UgdXBncmFkZSAiCisJCQkJInlvdXIgZmlybXdhcmUgdG8gdmVyc2lvblxubWVnYXJhaWQ6ICIKKwkJCQkiMy4xMCBvciBsYXRlciwgYXZhaWxhYmxlIGZyb20gdGhlICIKKwkJCQkiRGVsbCBUZWNobmljYWwgU3VwcG9ydCB3ZWJcbiIKKwkJCQkibWVnYXJhaWQ6IHNpdGUgYXRcbmh0dHA6Ly9zdXBwb3J0LiIKKwkJCQkiZGVsbC5jb20vdXMvZW4vZmlsZWxpYi9kb3dubG9hZC8iCisJCQkJImluZGV4LmFzcD9maWxlaWQ9Mjk0MFxuIgorCQkJKTsKKwkJfQorCX0KKworCS8qCisJICogSWYgd2UgaGF2ZSBhIEhQIDFNKDB4NjBFNykvMk0oMHg2MEU4KSBjb250cm9sbGVyIHdpdGgKKwkgKiBmaXJtd2FyZSBILjAxLjA3LCBILjAxLjA4LCBhbmQgSC4wMS4wOSBkaXNhYmxlIDY0IGJpdAorCSAqIHN1cHBvcnQsIHNpbmNlIHRoaXMgZmlybXdhcmUgY2Fubm90IGhhbmRsZSA2NCBiaXQKKwkgKiBhZGRyZXNzaW5nCisJICovCisJaWYgKChzdWJzeXN2aWQgPT0gSFBfU1VCU1lTX1ZJRCkgJiYKKwkgICAgKChzdWJzeXNpZCA9PSAweDYwRTcpIHx8IChzdWJzeXNpZCA9PSAweDYwRTgpKSkgeworCQkvKgorCQkgKiB3aGljaCBmaXJtd2FyZQorCQkgKi8KKwkJaWYgKCFzdHJjbXAoYWRhcHRlci0+ZndfdmVyc2lvbiwgIkgwMS4wNyIpIHx8CisJCSAgICAhc3RyY21wKGFkYXB0ZXItPmZ3X3ZlcnNpb24sICJIMDEuMDgiKSB8fAorCQkgICAgIXN0cmNtcChhZGFwdGVyLT5md192ZXJzaW9uLCAiSDAxLjA5IikgKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJIm1lZ2FyYWlkOiBGaXJtd2FyZSBILjAxLjA3LCAiCisJCQkJIkguMDEuMDgsIGFuZCBILjAxLjA5IG9uIDFNLzJNICIKKwkJCQkiY29udHJvbGxlcnNcbiIKKwkJCQkibWVnYXJhaWQ6IGRvIG5vdCBzdXBwb3J0IDY0IGJpdCAiCisJCQkJImFkZHJlc3NpbmcuXG5tZWdhcmFpZDogRElTQUJMSU5HICIKKwkJCQkiNjQgYml0IHN1cHBvcnQuXG4iKTsKKwkJCWFkYXB0ZXItPmZsYWcgJj0gfkJPQVJEXzY0QklUOworCQl9CisJfQorCisJaWYgKG1lZ2FfaXNfYmlvc19lbmFibGVkKGFkYXB0ZXIpKQorCQltZWdhX2hiYXNbaGJhX2NvdW50XS5pc19iaW9zX2VuYWJsZWQgPSAxOworCW1lZ2FfaGJhc1toYmFfY291bnRdLmhvc3RkYXRhX2FkZHIgPSBhZGFwdGVyOworCisJLyoKKwkgKiBGaW5kIG91dCB3aGljaCBjaGFubmVsIGlzIHJhaWQgYW5kIHdoaWNoIGlzIHNjc2kuIFRoaXMgaXMKKwkgKiBmb3IgUk9NQiBzdXBwb3J0LgorCSAqLworCW1lZ2FfZW51bV9yYWlkX3Njc2koYWRhcHRlcik7CisKKwkvKgorCSAqIEZpbmQgb3V0IGlmIGEgbG9naWNhbCBkcml2ZSBpcyBzZXQgYXMgdGhlIGJvb3QgZHJpdmUuIElmCisJICogdGhlcmUgaXMgb25lLCB3aWxsIG1ha2UgdGhhdCBhcyB0aGUgZmlyc3QgbG9naWNhbCBkcml2ZS4KKwkgKiBST01COiBEbyB3ZSBoYXZlIHRvIGJvb3QgZnJvbSBhIHBoeXNpY2FsIGRyaXZlLiBUaGVuIGFsbAorCSAqIHRoZSBwaHlzaWNhbCBkcml2ZXMgd291bGQgYXBwZWFyIGJlZm9yZSB0aGUgbG9naWNhbCBkaXNrcy4KKwkgKiBFbHNlLCBhbGwgdGhlIHBoeXNpY2FsIGRyaXZlcyB3b3VsZCBiZSBleHBvcnRlZCB0byB0aGUgbWlkCisJICogbGF5ZXIgYWZ0ZXIgbG9naWNhbCBkcml2ZXMuCisJICovCisJbWVnYV9nZXRfYm9vdF9kcnYoYWRhcHRlcik7CisKKwlpZiAoYWRhcHRlci0+Ym9vdF9wZHJ2X2VuYWJsZWQpIHsKKwkJaiA9IGFkYXB0ZXItPnByb2R1Y3RfaW5mby5uY2hhbm5lbHM7CisJCWZvciggaSA9IDA7IGkgPCBqOyBpKysgKQorCQkJYWRhcHRlci0+bG9nZHJ2X2NoYW5baV0gPSAwOworCQlmb3IoIGkgPSBqOyBpIDwgTlZJUlRfQ0hBTiArIGo7IGkrKyApCisJCQlhZGFwdGVyLT5sb2dkcnZfY2hhbltpXSA9IDE7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IE5WSVJUX0NIQU47IGkrKykKKwkJCWFkYXB0ZXItPmxvZ2Rydl9jaGFuW2ldID0gMTsKKwkJZm9yIChpID0gTlZJUlRfQ0hBTjsgaSA8IE1BWF9DSEFOTkVMUytOVklSVF9DSEFOOyBpKyspCisJCQlhZGFwdGVyLT5sb2dkcnZfY2hhbltpXSA9IDA7CisJCWFkYXB0ZXItPm1lZ2FfY2hfY2xhc3MgPDw9IE5WSVJUX0NIQU47CisJfQorCisJLyoKKwkgKiBEbyB3ZSBzdXBwb3J0IHJhbmRvbSBkZWxldGlvbiBhbmQgYWRkaXRpb24gb2YgbG9naWNhbAorCSAqIGRyaXZlcworCSAqLworCWFkYXB0ZXItPnJlYWRfbGRpZG1hcCA9IDA7CS8qIHNldCBpdCBhZnRlciBmaXJzdCBsb2dkcnYKKwkJCQkJCSAgIGRlbGV0ZSBjbWQgKi8KKwlhZGFwdGVyLT5zdXBwb3J0X3JhbmRvbV9kZWwgPSBtZWdhX3N1cHBvcnRfcmFuZG9tX2RlbChhZGFwdGVyKTsKKworCS8qIEluaXRpYWxpemUgU0NCcyAqLworCWlmIChtZWdhX2luaXRfc2NiKGFkYXB0ZXIpKQorCQlnb3RvIG91dF9mcmVlX21ib3g7CisKKwkvKgorCSAqIFJlc2V0IHRoZSBwZW5kaW5nIGNvbW1hbmRzIGNvdW50ZXIKKwkgKi8KKwlhdG9taWNfc2V0KCZhZGFwdGVyLT5wZW5kX2NtZHMsIDApOworCisJLyoKKwkgKiBSZXNldCB0aGUgYWRhcHRlciBxdWllc2NlbnQgZmxhZworCSAqLworCWF0b21pY19zZXQoJmFkYXB0ZXItPnF1aWVzY2VudCwgMCk7CisKKwloYmFfc29mdF9zdGF0ZVtoYmFfY291bnRdID0gYWRhcHRlcjsKKworCS8qCisJICogRmlsbCBpbiB0aGUgc3RydWN0dXJlIHdoaWNoIG5lZWRzIHRvIGJlIHBhc3NlZCBiYWNrIHRvIHRoZQorCSAqIGFwcGxpY2F0aW9uIHdoZW4gaXQgZG9lcyBhbiBpb2N0bCgpIGZvciBjb250cm9sbGVyIHJlbGF0ZWQKKwkgKiBpbmZvcm1hdGlvbi4KKwkgKi8KKwlpID0gaGJhX2NvdW50OworCisJbWNvbnRyb2xsZXJbaV0uYmFzZSA9IG1lZ2FfYmFzZXBvcnQ7CisJbWNvbnRyb2xsZXJbaV0uaXJxID0gaXJxOworCW1jb250cm9sbGVyW2ldLm51bWxkcnYgPSBhZGFwdGVyLT5udW1sZHJ2OworCW1jb250cm9sbGVyW2ldLnBjaWJ1cyA9IHBjaV9idXM7CisJbWNvbnRyb2xsZXJbaV0ucGNpZGV2ID0gaWQtPmRldmljZTsKKwltY29udHJvbGxlcltpXS5wY2lmdW4gPSBQQ0lfRlVOQyAocGNpX2Rldl9mdW5jKTsKKwltY29udHJvbGxlcltpXS5wY2lpZCA9IC0xOworCW1jb250cm9sbGVyW2ldLnBjaXZlbmRvciA9IGlkLT52ZW5kb3I7CisJbWNvbnRyb2xsZXJbaV0ucGNpc2xvdCA9IFBDSV9TTE9UKHBjaV9kZXZfZnVuYyk7CisJbWNvbnRyb2xsZXJbaV0udWlkID0gKHBjaV9idXMgPDwgOCkgfCBwY2lfZGV2X2Z1bmM7CisKKworCS8qIFNldCB0aGUgTW9kZSBvZiBhZGRyZXNzaW5nIHRvIDY0IGJpdCBpZiB3ZSBjYW4gKi8KKwlpZiAoKGFkYXB0ZXItPmZsYWcgJiBCT0FSRF82NEJJVCkgJiYgKHNpemVvZihkbWFfYWRkcl90KSA9PSA4KSkgeworCQlwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCk7CisJCWFkYXB0ZXItPmhhc182NGJpdF9hZGRyID0gMTsKKwl9IGVsc2UgIHsKKwkJcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmKTsKKwkJYWRhcHRlci0+aGFzXzY0Yml0X2FkZHIgPSAwOworCX0KKwkJCisJaW5pdF9NVVRFWCgmYWRhcHRlci0+aW50X210eCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYWRhcHRlci0+aW50X3dhaXRxKTsKKworCWFkYXB0ZXItPnRoaXNfaWQgPSBERUZBVUxUX0lOSVRJQVRPUl9JRDsKKwlhZGFwdGVyLT5ob3N0LT50aGlzX2lkID0gREVGQVVMVF9JTklUSUFUT1JfSUQ7CisKKyNpZiBNRUdBX0hBVkVfQ0xVU1RFUklORworCS8qCisJICogSXMgY2x1c3RlciBzdXBwb3J0IGVuYWJsZWQgb24gdGhpcyBjb250cm9sbGVyCisJICogTm90ZTogSW4gYSBjbHVzdGVyIHRoZSBIQkFzICggdGhlIGluaXRpYXRvcnMgKSB3aWxsIGhhdmUKKwkgKiBkaWZmZXJlbnQgdGFyZ2V0IElEcyBhbmQgd2UgY2Fubm90IGFzc3VtZSBpdCB0byBiZSA3LiBDYWxsCisJICogdG8gbWVnYV9zdXBwb3J0X2NsdXN0ZXIoKSB3aWxsIGdldCB0aGUgdGFyZ2V0IGlkcyBhbHNvIGlmCisJICogdGhlIGNsdXN0ZXIgc3VwcG9ydCBpcyBhdmFpbGFibGUKKwkgKi8KKwlhZGFwdGVyLT5oYXNfY2x1c3RlciA9IG1lZ2Ffc3VwcG9ydF9jbHVzdGVyKGFkYXB0ZXIpOworCWlmIChhZGFwdGVyLT5oYXNfY2x1c3RlcikgeworCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCSJtZWdhcmFpZDogQ2x1c3RlciBkcml2ZXIsIGluaXRpYXRvciBpZDolZFxuIiwKKwkJCWFkYXB0ZXItPnRoaXNfaWQpOworCX0KKyNlbmRpZgorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOworCisJbWVnYV9jcmVhdGVfcHJvY19lbnRyeShoYmFfY291bnQsIG1lZ2FfcHJvY19kaXJfZW50cnkpOworCisJZXJyb3IgPSBzY3NpX2FkZF9ob3N0KGhvc3QsICZwZGV2LT5kZXYpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfZnJlZV9tYm94OworCisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisJaGJhX2NvdW50Kys7CisJcmV0dXJuIDA7CisKKyBvdXRfZnJlZV9tYm94OgorCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+ZGV2LCBzaXplb2YobWJveDY0X3QpLAorCQkJYWRhcHRlci0+dW5hX21ib3g2NCwgYWRhcHRlci0+dW5hX21ib3g2NF9kbWEpOworIG91dF9mcmVlX2lycToKKwlmcmVlX2lycShhZGFwdGVyLT5ob3N0LT5pcnEsIGFkYXB0ZXIpOworIG91dF9mcmVlX3NjYl9saXN0OgorCWtmcmVlKGFkYXB0ZXItPnNjYl9saXN0KTsKKyBvdXRfZnJlZV9jbWRfYnVmZmVyOgorCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+ZGV2LCBNRUdBX0JVRkZFUl9TSVpFLAorCQkJYWRhcHRlci0+bWVnYV9idWZmZXIsIGFkYXB0ZXItPmJ1Zl9kbWFfaGFuZGxlKTsKKyBvdXRfaG9zdF9wdXQ6CisJc2NzaV9ob3N0X3B1dChob3N0KTsKKyBvdXRfaW91bm1hcDoKKwlpZiAoZmxhZyAmIEJPQVJEX01FTU1BUCkKKwkJaW91bm1hcCgodm9pZCAqKW1lZ2FfYmFzZXBvcnQpOworIG91dF9yZWxlYXNlX3JlZ2lvbjoKKwlpZiAoZmxhZyAmIEJPQVJEX01FTU1BUCkKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHRiYXNlLCAxMjgpOworCWVsc2UKKwkJcmVsZWFzZV9yZWdpb24obWVnYV9iYXNlcG9ydCwgMTYpOworIG91dF9kaXNhYmxlX2RldmljZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cisgb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQKK19fbWVnYXJhaWRfc2h1dGRvd24oYWRhcHRlcl90ICphZGFwdGVyKQoreworCXVfY2hhcglyYXdfbWJveFtzaXplb2Yoc3RydWN0IG1ib3hfb3V0KV07CisJbWJveF90CSptYm94ID0gKG1ib3hfdCAqKXJhd19tYm94OworCWludAlpOworCisJLyogRmx1c2ggYWRhcHRlciBjYWNoZSAqLworCW1lbXNldCgmbWJveC0+bV9vdXQsIDAsIHNpemVvZihyYXdfbWJveCkpOworCXJhd19tYm94WzBdID0gRkxVU0hfQURBUFRFUjsKKworCWZyZWVfaXJxKGFkYXB0ZXItPmhvc3QtPmlycSwgYWRhcHRlcik7CisKKwkvKiBJc3N1ZSBhIGJsb2NraW5nIChpbnRlcnJ1cHRzIGRpc2FibGVkKSBjb21tYW5kIHRvIHRoZSBjYXJkICovCisJaXNzdWVfc2NiX2Jsb2NrKGFkYXB0ZXIsIHJhd19tYm94KTsKKworCS8qIEZsdXNoIGRpc2tzIGNhY2hlICovCisJbWVtc2V0KCZtYm94LT5tX291dCwgMCwgc2l6ZW9mKHJhd19tYm94KSk7CisJcmF3X21ib3hbMF0gPSBGTFVTSF9TWVNURU07CisKKwkvKiBJc3N1ZSBhIGJsb2NraW5nIChpbnRlcnJ1cHRzIGRpc2FibGVkKSBjb21tYW5kIHRvIHRoZSBjYXJkICovCisJaXNzdWVfc2NiX2Jsb2NrKGFkYXB0ZXIsIHJhd19tYm94KTsKKwkKKwlpZiAoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnBlbmRfY21kcykgPiAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZDogcGVuZGluZyBjb21tYW5kcyEhXG4iKTsKKworCS8qCisJICogSGF2ZSBhIGRlbGlicmF0ZSBkZWxheSB0byBtYWtlIHN1cmUgYWxsIHRoZSBjYWNoZXMgYXJlCisJICogYWN0dWFsbHkgZmx1c2hlZC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IDEwOyBpKyspCisJCW1kZWxheSgxMDAwKTsKK30KKworc3RhdGljIHZvaWQKK21lZ2FyYWlkX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoYWRhcHRlcl90ICopaG9zdC0+aG9zdGRhdGE7CisJY2hhcglidWZbMTJdID0geyAwIH07CisKKwlzY3NpX3JlbW92ZV9ob3N0KGhvc3QpOworCisJX19tZWdhcmFpZF9zaHV0ZG93bihhZGFwdGVyKTsKKworCS8qIEZyZWUgb3VyIHJlc291cmNlcyAqLworCWlmIChhZGFwdGVyLT5mbGFnICYgQk9BUkRfTUVNTUFQKSB7CisJCWlvdW5tYXAoKHZvaWQgKilhZGFwdGVyLT5iYXNlKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGFkYXB0ZXItPmhvc3QtPmJhc2UsIDEyOCk7CisJfSBlbHNlCisJCXJlbGVhc2VfcmVnaW9uKGFkYXB0ZXItPmJhc2UsIDE2KTsKKworCW1lZ2FfZnJlZV9zZ2woYWRhcHRlcik7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWlmIChhZGFwdGVyLT5jb250cm9sbGVyX3Byb2NfZGlyX2VudHJ5KSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJzdGF0IiwgYWRhcHRlci0+Y29udHJvbGxlcl9wcm9jX2Rpcl9lbnRyeSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJjb25maWciLAorCQkJCWFkYXB0ZXItPmNvbnRyb2xsZXJfcHJvY19kaXJfZW50cnkpOworCQlyZW1vdmVfcHJvY19lbnRyeSgibWFpbGJveCIsCisJCQkJYWRhcHRlci0+Y29udHJvbGxlcl9wcm9jX2Rpcl9lbnRyeSk7CisjaWYgTUVHQV9IQVZFX0VOSF9QUk9DCisJCXJlbW92ZV9wcm9jX2VudHJ5KCJyZWJ1aWxkLXJhdGUiLAorCQkJCWFkYXB0ZXItPmNvbnRyb2xsZXJfcHJvY19kaXJfZW50cnkpOworCQlyZW1vdmVfcHJvY19lbnRyeSgiYmF0dGVyeS1zdGF0dXMiLAorCQkJCWFkYXB0ZXItPmNvbnRyb2xsZXJfcHJvY19kaXJfZW50cnkpOworCisJCXJlbW92ZV9wcm9jX2VudHJ5KCJkaXNrZHJpdmVzLWNoMCIsCisJCQkJYWRhcHRlci0+Y29udHJvbGxlcl9wcm9jX2Rpcl9lbnRyeSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJkaXNrZHJpdmVzLWNoMSIsCisJCQkJYWRhcHRlci0+Y29udHJvbGxlcl9wcm9jX2Rpcl9lbnRyeSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJkaXNrZHJpdmVzLWNoMiIsCisJCQkJYWRhcHRlci0+Y29udHJvbGxlcl9wcm9jX2Rpcl9lbnRyeSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJkaXNrZHJpdmVzLWNoMyIsCisJCQkJYWRhcHRlci0+Y29udHJvbGxlcl9wcm9jX2Rpcl9lbnRyeSk7CisKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInJhaWRkcml2ZXMtMC05IiwKKwkJCQlhZGFwdGVyLT5jb250cm9sbGVyX3Byb2NfZGlyX2VudHJ5KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInJhaWRkcml2ZXMtMTAtMTkiLAorCQkJCWFkYXB0ZXItPmNvbnRyb2xsZXJfcHJvY19kaXJfZW50cnkpOworCQlyZW1vdmVfcHJvY19lbnRyeSgicmFpZGRyaXZlcy0yMC0yOSIsCisJCQkJYWRhcHRlci0+Y29udHJvbGxlcl9wcm9jX2Rpcl9lbnRyeSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJyYWlkZHJpdmVzLTMwLTM5IiwKKwkJCQlhZGFwdGVyLT5jb250cm9sbGVyX3Byb2NfZGlyX2VudHJ5KTsKKyNlbmRpZgorCQlzcHJpbnRmKGJ1ZiwgImhiYSVkIiwgYWRhcHRlci0+aG9zdC0+aG9zdF9ubyk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KGJ1ZiwgbWVnYV9wcm9jX2Rpcl9lbnRyeSk7CisJfQorI2VuZGlmCisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPmRldiwgTUVHQV9CVUZGRVJfU0laRSwKKwkJCWFkYXB0ZXItPm1lZ2FfYnVmZmVyLCBhZGFwdGVyLT5idWZfZG1hX2hhbmRsZSk7CisJa2ZyZWUoYWRhcHRlci0+c2NiX2xpc3QpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+ZGV2LCBzaXplb2YobWJveDY0X3QpLAorCQkJYWRhcHRlci0+dW5hX21ib3g2NCwgYWRhcHRlci0+dW5hX21ib3g2NF9kbWEpOworCisJc2NzaV9ob3N0X3B1dChob3N0KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwloYmFfY291bnQtLTsKK30KKworc3RhdGljIHZvaWQKK21lZ2FyYWlkX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcGNpX2dldF9kcnZkYXRhKHRvX3BjaV9kZXYoZGV2KSk7CisJYWRhcHRlcl90ICphZGFwdGVyID0gKGFkYXB0ZXJfdCAqKWhvc3QtPmhvc3RkYXRhOworCisJX19tZWdhcmFpZF9zaHV0ZG93bihhZGFwdGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG1lZ2FyYWlkX3BjaV90YmxbXSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9ERUxMLCBQQ0lfREVWSUNFX0lEX0RJU0NPVkVSWSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfREVMTCwgUENJX0RFVklDRV9JRF9QRVJDNF9ESSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQk9BUkRfNjRCSVR9LAorCXtQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9QRVJDNF9RQ19WRVJERSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQk9BUkRfNjRCSVR9LAorCXtQQ0lfVkVORE9SX0lEX0FNSSwgUENJX0RFVklDRV9JRF9BTUlfTUVHQVJBSUQsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX0FNSSwgUENJX0RFVklDRV9JRF9BTUlfTUVHQVJBSUQyLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9BTUksIFBDSV9ERVZJQ0VfSURfQU1JX01FR0FSQUlEMywKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfQU1JX01FR0FSQUlEMywKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX0FNSV9NRUdBUkFJRDMsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXswLH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbWVnYXJhaWRfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBtZWdhcmFpZF9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJtZWdhcmFpZCIsCisJLmlkX3RhYmxlCT0gbWVnYXJhaWRfcGNpX3RibCwKKwkucHJvYmUJCT0gbWVnYXJhaWRfcHJvYmVfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobWVnYXJhaWRfcmVtb3ZlX29uZSksCisJLmRyaXZlcgkJPSB7CisJCS5zaHV0ZG93biA9IG1lZ2FyYWlkX3NodXRkb3duLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtZWdhcmFpZF9pbml0KHZvaWQpCit7CisJaW50IGVycm9yOworCisJaWYgKChtYXhfY21kX3Blcl9sdW4gPD0gMCkgfHwgKG1heF9jbWRfcGVyX2x1biA+IE1BWF9DTURfUEVSX0xVTikpCisJCW1heF9jbWRfcGVyX2x1biA9IE1BWF9DTURfUEVSX0xVTjsKKwlpZiAobWF4X21ib3hfYnVzeV93YWl0ID4gTUJPWF9CVVNZX1dBSVQpCisJCW1heF9tYm94X2J1c3lfd2FpdCA9IE1CT1hfQlVTWV9XQUlUOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwltZWdhX3Byb2NfZGlyX2VudHJ5ID0gcHJvY19ta2RpcigibWVnYXJhaWQiLCAmcHJvY19yb290KTsKKwlpZiAoIW1lZ2FfcHJvY19kaXJfZW50cnkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJtZWdhcmFpZDogZmFpbGVkIHRvIGNyZWF0ZSBtZWdhcmFpZCByb290XG4iKTsKKwl9CisjZW5kaWYKKwllcnJvciA9IHBjaV9tb2R1bGVfaW5pdCgmbWVnYXJhaWRfcGNpX2RyaXZlcik7CisJaWYgKGVycm9yKSB7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwkJcmVtb3ZlX3Byb2NfZW50cnkoIm1lZ2FyYWlkIiwgJnByb2Nfcm9vdCk7CisjZW5kaWYKKwkJcmV0dXJuIGVycm9yOworCX0KKworCS8qCisJICogUmVnaXN0ZXIgdGhlIGRyaXZlciBhcyBhIGNoYXJhY3RlciBkZXZpY2UsIGZvciBhcHBsaWNhdGlvbnMKKwkgKiB0byBhY2Nlc3MgaXQgZm9yIGlvY3Rscy4KKwkgKiBGaXJzdCBhcmd1bWVudCAobWFqb3IpIHRvIHJlZ2lzdGVyX2NocmRldiBpbXBsaWVzIGEgZHluYW1pYworCSAqIG1ham9yIG51bWJlciBhbGxvY2F0aW9uLgorCSAqLworCW1ham9yID0gcmVnaXN0ZXJfY2hyZGV2KDAsICJtZWdhZGV2IiwgJm1lZ2FkZXZfZm9wcyk7CisJaWYgKCFtYWpvcikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJIm1lZ2FyYWlkOiBmYWlsZWQgdG8gcmVnaXN0ZXIgY2hhciBkZXZpY2VcbiIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWVnYXJhaWRfZXhpdCh2b2lkKQoreworCS8qCisJICogVW5yZWdpc3RlciB0aGUgY2hhcmFjdGVyIGRldmljZSBpbnRlcmZhY2UgdG8gdGhlIGRyaXZlci4KKwkgKi8KKwl1bnJlZ2lzdGVyX2NocmRldihtYWpvciwgIm1lZ2FkZXYiKTsKKworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbWVnYXJhaWRfcGNpX2RyaXZlcik7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXJlbW92ZV9wcm9jX2VudHJ5KCJtZWdhcmFpZCIsICZwcm9jX3Jvb3QpOworI2VuZGlmCit9CisKK21vZHVsZV9pbml0KG1lZ2FyYWlkX2luaXQpOworbW9kdWxlX2V4aXQobWVnYXJhaWRfZXhpdCk7CisKKy8qIHZpOiBzZXQgdHM9OCBzdz04IHR3PTc4OiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmggYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjVjNGRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmgKQEAgLTAsMCArMSwxMDcxIEBACisjaWZuZGVmIF9fTUVHQVJBSURfSF9fCisjZGVmaW5lIF9fTUVHQVJBSURfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisKKyNkZWZpbmUgTUVHQVJBSURfVkVSU0lPTglcCisJInYyLjAwLjMgKFJlbGVhc2UgRGF0ZTogV2VkIEZlYiAxOSAwODo1MTozMCBFU1QgMjAwMylcbiIKKworLyoKKyAqIERyaXZlciBmZWF0dXJlcyAtIGNoYW5nZSB0aGUgdmFsdWVzIHRvIGVuYWJsZSBvciBkaXNhYmxlIGZlYXR1cmVzIGluIHRoZQorICogZHJpdmVyLgorICovCisKKy8qCisgKiBDb21hbmQgY29hbGVzY2luZyAtIFRoaXMgZmVhdHVyZSBhbGxvd3MgdGhlIGRyaXZlciB0byBiZSBhYmxlIHRvIGNvbWJpbmUKKyAqIHR3byBvciBtb3JlIGNvbW1hbmRzIGFuZCBpc3N1ZSBhcyBvbmUgY29tbWFuZCBpbiBvcmRlciB0byBib29zdCBJL08KKyAqIHBlcmZvcm1hbmNlLiBVc2VmdWwgaWYgdGhlIG5hdHVyZSBvZiB0aGUgSS9PIGlzIHNlcXVlbnRpYWwuIEl0IGlzIG5vdCB2ZXJ5CisgKiB1c2VmdWwgZm9yIHJhbmRvbSBuYXR1cmVkIEkvT3MuCisgKi8KKyNkZWZpbmUgTUVHQV9IQVZFX0NPQUxFU0NJTkcJMAorCisvKgorICogQ2x1c3RlcmluZyBzdXBwb3J0IC0gU2V0IHRoaXMgZmxhZyBpZiB5b3UgYXJlIHBsYW5uaW5nIHRvIHVzZSB0aGUKKyAqIGNsdXN0ZXJpbmcgc2VydmljZXMgcHJvdmlkZWQgYnkgdGhlIG1lZ2FyYWlkIGNvbnRyb2xsZXJzIGFuZCBwbGFubmluZyB0bworICogc2V0dXAgYSBjbHVzdGVyCisgKi8KKyNkZWZpbmUgTUVHQV9IQVZFX0NMVVNURVJJTkcJMQorCisvKgorICogRHJpdmVyIHN0YXRpc3RpY3MgLSBTZXQgdGhpcyBmbGFnIGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBzdGF0aWNzIGFib3V0CisgKiBudW1iZXIgb2YgSS9PIGNvbXBsZXRlZCBvbiBlYWNoIGxvZ2ljYWwgZHJpdmUgYW5kIGhvdyBtYW55IGludGVycnVwdHMKKyAqIGdlbmVyYXRlZC4gSWYgZW5hYmxlZCwgdGhpcyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgdGhyb3VnaCAvcHJvYworICogaW50ZXJmYWNlIGFuZCB0aHJvdWdoIHRoZSBwcml2YXRlIGlvY3RsLiBTZXR0aW5nIHRoaXMgZmxhZyBoYXMgYQorICogcGVyZm9ybWFuY2UgcGVuYWx0eS4KKyAqLworI2RlZmluZSBNRUdBX0hBVkVfU1RBVFMJCTAKKworLyoKKyAqIEVuaGFuY2VkIC9wcm9jIGludGVyZmFjZSAtIFRoaXMgZmVhdHVyZSB3aWxsIGFsbG93IHlvdSB0byBoYXZlIGEgbW9yZQorICogZGV0YWlsZWQgL3Byb2MgaW50ZXJmYWNlIGZvciBtZWdhcmFpZCBkcml2ZXIuIEUuZy4sIGEgcmVhbCB0aW1lIHVwZGF0ZSBvZgorICogdGhlIHN0YXR1cyBvZiB0aGUgbG9naWNhbCBkcml2ZXMsIGJhdHRlcnkgc3RhdHVzLCBwaHlzaWNhbCBkcml2ZXMgZXRjLgorICovCisjZGVmaW5lIE1FR0FfSEFWRV9FTkhfUFJPQwkxCisKKyNkZWZpbmUgTUFYX0RFVl9UWVBFCTMyCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMJCTB4MTAwMAorI2VuZGlmCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9BTUkKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BTUkJCTB4MTAxRQorI2VuZGlmCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9ERUxMCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfREVMTAkJMHgxMDI4CisjZW5kaWYKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0lOVEVMCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSU5URUwJCTB4ODA4NgorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9BTUlfTUVHQVJBSUQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTUlfTUVHQVJBSUQJMHg5MDEwCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0FNSV9NRUdBUkFJRDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTUlfTUVHQVJBSUQyCTB4OTA2MAorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9BTUlfTUVHQVJBSUQzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1JX01FR0FSQUlEMwkweDE5NjAKKyNlbmRpZgorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRElTQ09WRVJZCQkweDAwMEUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QRVJDNF9ESQkJMHgwMDBGCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEVSQzRfUUNfVkVSREUJMHgwNDA3CisKKy8qIFN1Yi1TeXN0ZW0gVmVuZG9yIElEcyAqLworI2RlZmluZQlBTUlfU1VCU1lTX1ZJRAkJCTB4MTAxRQorI2RlZmluZSBERUxMX1NVQlNZU19WSUQJCQkweDEwMjgKKyNkZWZpbmUJSFBfU1VCU1lTX1ZJRAkJCTB4MTAzQworI2RlZmluZSBMU0lfU1VCU1lTX1ZJRAkJCTB4MTAwMAorI2RlZmluZSBJTlRFTF9TVUJTWVNfVklECQkweDgwODYKKworI2RlZmluZSBIQkFfU0lHTkFUVVJFCSAgICAgIAkJMHgzMzQ0CisjZGVmaW5lIEhCQV9TSUdOQVRVUkVfNDcxCSAgCTB4Q0NDQworI2RlZmluZSBIQkFfU0lHTkFUVVJFXzY0QklUCQkweDAyOTkKKworI2RlZmluZSBNQk9YX0JVU1lfV0FJVAkJCTEwCS8qIHdhaXQgZm9yIHVwIHRvIDEwIHVzZWMgZm9yCisJCQkJCQkgICBtYWlsYm94IHRvIGJlIGZyZWUgKi8KKyNkZWZpbmUgREVGQVVMVF9JTklUSUFUT1JfSUQJNworCisjZGVmaW5lIE1BWF9TR0xJU1QJCTY0CS8qIG1heCBzdXBwb3J0ZWQgaW4gZi93ICovCisjZGVmaW5lIE1JTl9TR0xJU1QJCTI2CS8qIGd1YXJhbnRlZWQgdG8gc3VwcG9ydCB0aGVzZSBtYW55ICovCisjZGVmaW5lIE1BWF9DT01NQU5EUwkJMTI2CisjZGVmaW5lIENNRElEX0lOVF9DTURTCQlNQVhfQ09NTUFORFMrMQkvKiBtYWtlIHN1cmUgQ01ESURfSU5UX0NNRFMKKwkJCQkJIAlpcyBsZXNzIHRoYW4gbWF4IGNvbW1hbmRzCisJCQkJCQlzdXBwb3J0ZWQgYnkgYW55IGYvdyAqLworCisjZGVmaW5lIE1BWF9DREJfTEVOCSAgICAgCTEwCisjZGVmaW5lIE1BWF9FWFRfQ0RCX0xFTgkJMTYJLyogd2Ugc3VwcG9ydCBjZGIgbGVuZ3RoIHVwIHRvIDE2ICovCisKKyNkZWZpbmUgREVGX0NNRF9QRVJfTFVOCQk2MworI2RlZmluZSBNQVhfQ01EX1BFUl9MVU4JCU1BWF9DT01NQU5EUworI2RlZmluZSBNQVhfRklSTVdBUkVfU1RBVFVTCTQ2CisjZGVmaW5lIE1BWF9YRkVSX1BFUl9DTUQJKDY0KjEwMjQpCisjZGVmaW5lIE1BWF9TRUNUT1JTX1BFUl9JTwkxMjgKKworI2RlZmluZSBNQVhfTE9HSUNBTF9EUklWRVNfNDBMRAkJNDAKKyNkZWZpbmUgRkNfTUFYX1BIWVNJQ0FMX0RFVklDRVMJCTI1NgorI2RlZmluZSBNQVhfTE9HSUNBTF9EUklWRVNfOExECQk4CisjZGVmaW5lIE1BWF9DSEFOTkVMUwkJCTUKKyNkZWZpbmUgTUFYX1RBUkdFVAkJCTE1CisjZGVmaW5lIE1BWF9QSFlTSUNBTF9EUklWRVMJCU1BWF9DSEFOTkVMUypNQVhfVEFSR0VUCisjZGVmaW5lIE1BWF9ST1dfU0laRV80MExECQkzMgorI2RlZmluZSBNQVhfUk9XX1NJWkVfOExECQk4CisjZGVmaW5lIE1BWF9TUEFOX0RFUFRICQkJOAorCisjZGVmaW5lIE5WSVJUX0NIQU4JCTQJLyogIyBvZiB2aXJ0dWFsIGNoYW5uZWxzIHRvIHJlcHJlc2VudAorCQkJCQkgICB1cCB0byA2MCBsb2dpY2FsIGRyaXZlcyAqLworc3RydWN0IG1ib3hfb3V0IHsKKwkvKiAweDAgKi8gdTggY21kOworCS8qIDB4MSAqLyB1OCBjbWRpZDsKKwkvKiAweDIgKi8gdTE2IG51bXNlY3RvcnM7CisJLyogMHg0ICovIHUzMiBsYmE7CisJLyogMHg4ICovIHUzMiB4ZmVyYWRkcjsKKwkvKiAweEMgKi8gdTggbG9nZHJ2OworCS8qIDB4RCAqLyB1OCBudW1zZ2VsZW1lbnRzOworCS8qIDB4RSAqLyB1OCByZXN2ZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbWJveF9pbiB7CisJLyogMHhGICovIHZvbGF0aWxlIHU4IGJ1c3k7CisJLyogMHgxMCAqLyB2b2xhdGlsZSB1OCBudW1zdGF0dXM7CisJLyogMHgxMSAqLyB2b2xhdGlsZSB1OCBzdGF0dXM7CisJLyogMHgxMiAqLyB2b2xhdGlsZSB1OCBjb21wbGV0ZWRbTUFYX0ZJUk1XQVJFX1NUQVRVU107CisJdm9sYXRpbGUgdTggcG9sbDsKKwl2b2xhdGlsZSB1OCBhY2s7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBtYm94X291dAltX291dDsKKwlzdHJ1Y3QgbWJveF9pbgltX2luOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbWJveF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIHhmZXJfc2VnbWVudF9sbzsKKwl1MzIgeGZlcl9zZWdtZW50X2hpOworCW1ib3hfdCBtYm94OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbWJveDY0X3Q7CisKKworLyoKKyAqIFBhc3N0aHJ1IGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTUFYX1JFUV9TRU5TRV9MRU4gICAgICAgMHgyMAorCit0eXBlZGVmIHN0cnVjdCB7CisJdTggdGltZW91dDozOwkJLyogMD02c2VjLzE9NjBzZWMvMj0xMG1pbi8zPTNocnMgKi8KKwl1OCBhcnM6MTsKKwl1OCByZXNlcnZlZDozOworCXU4IGlzbG9naWNhbDoxOworCXU4IGxvZ2RydjsJCS8qIGlmIGlzbG9naWNhbCA9PSAxICovCisJdTggY2hhbm5lbDsJCS8qIGlmIGlzbG9naWNhbCA9PSAwICovCisJdTggdGFyZ2V0OwkJLyogaWYgaXNsb2dpY2FsID09IDAgKi8KKwl1OCBxdWV1ZXRhZzsJCS8qIHVudXNlZCAqLworCXU4IHF1ZXVlYWN0aW9uOwkJLyogdW51c2VkICovCisJdTggY2RiW01BWF9DREJfTEVOXTsKKwl1OCBjZGJsZW47CisJdTggcmVxc2Vuc2VsZW47CisJdTggcmVxc2Vuc2VhcmVhW01BWF9SRVFfU0VOU0VfTEVOXTsKKwl1OCBudW1zZ2VsZW1lbnRzOworCXU4IHNjc2lzdGF0dXM7CisJdTMyIGRhdGF4ZmVyYWRkcjsKKwl1MzIgZGF0YXhmZXJsZW47Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtZWdhX3Bhc3N0aHJ1OworCisKKy8qCisgKiBFeHRlbmRlZCBwYXNzdGhydTogc3VwcG9ydCBDREIgPiAxMCBieXRlcworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTggdGltZW91dDozOwkJLyogMD02c2VjLzE9NjBzZWMvMj0xMG1pbi8zPTNocnMgKi8KKwl1OCBhcnM6MTsKKwl1OCByc3ZkMToxOworCXU4IGNkX3JvbToxOworCXU4IHJzdmQyOjE7CisJdTggaXNsb2dpY2FsOjE7CisJdTggbG9nZHJ2OwkJLyogaWYgaXNsb2dpY2FsID09IDEgKi8KKwl1OCBjaGFubmVsOwkJLyogaWYgaXNsb2dpY2FsID09IDAgKi8KKwl1OCB0YXJnZXQ7CQkvKiBpZiBpc2xvZ2ljYWwgPT0gMCAqLworCXU4IHF1ZXVldGFnOwkJLyogdW51c2VkICovCisJdTggcXVldWVhY3Rpb247CQkvKiB1bnVzZWQgKi8KKwl1OCBjZGJsZW47CisJdTggcnN2ZDM7CisJdTggY2RiW01BWF9FWFRfQ0RCX0xFTl07CisJdTggbnVtc2dlbGVtZW50czsKKwl1OCBzdGF0dXM7CisJdTggcmVxc2Vuc2VsZW47CisJdTggcmVxc2Vuc2VhcmVhW01BWF9SRVFfU0VOU0VfTEVOXTsKKwl1OCByc3ZkNDsKKwl1MzIgZGF0YXhmZXJhZGRyOworCXUzMiBkYXRheGZlcmxlbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1lZ2FfZXh0X3Bhc3N0aHJ1OworCit0eXBlZGVmIHN0cnVjdCB7CisJdTY0IGFkZHJlc3M7CisJdTMyIGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1lZ2Ffc2dsNjQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgYWRkcmVzczsKKwl1MzIgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbWVnYV9zZ2xpc3Q7CisKKworLyogUXVldWVkIGNvbW1hbmQgZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWludAlpZHg7CisJdTMyCXN0YXRlOworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwl1OAlyYXdfbWJveFs2Nl07CisJdTMyCWRtYV90eXBlOworCXUzMglkbWFfZGlyZWN0aW9uOworCisJU2NzaV9DbW5kCSpjbWQ7CisJZG1hX2FkZHJfdAlkbWFfaF9idWxrZGF0YTsKKwlkbWFfYWRkcl90CWRtYV9oX3NnZGF0YTsKKworCW1lZ2Ffc2dsaXN0CSpzZ2w7CisJbWVnYV9zZ2w2NAkqc2dsNjQ7CisJZG1hX2FkZHJfdAlzZ2xfZG1hX2FkZHI7CisKKwltZWdhX3Bhc3N0aHJ1CQkqcHRocnU7CisJZG1hX2FkZHJfdAkJcHRocnVfZG1hX2FkZHI7CisJbWVnYV9leHRfcGFzc3RocnUJKmVwdGhydTsKKwlkbWFfYWRkcl90CQllcHRocnVfZG1hX2FkZHI7Cit9IHNjYl90OworCisvKgorICogRmxhZ3MgdG8gZm9sbG93IHRoZSBzY2IgYXMgaXQgdHJhbnNpdGlvbnMgYmV0d2VlbiB2YXJpb3VzIHN0YWdlcworICovCisjZGVmaW5lIFNDQl9GUkVFCTB4MDAwMAkvKiBvbiB0aGUgZnJlZSBsaXN0ICovCisjZGVmaW5lIFNDQl9BQ1RJVkUJMHgwMDAxCS8qIG9mZiB0aGUgZnJlZSBsaXN0ICovCisjZGVmaW5lIFNDQl9QRU5EUQkweDAwMDIJLyogb24gdGhlIHBlbmRpbmcgcXVldWUgKi8KKyNkZWZpbmUgU0NCX0lTU1VFRAkweDAwMDQJLyogaXNzdWVkIC0gb3duZXIgZi93ICovCisjZGVmaW5lIFNDQl9BQk9SVAkweDAwMDgJLyogR290IGFuIGFib3J0IGZvciB0aGlzIG9uZSAqLworI2RlZmluZSBTQ0JfUkVTRVQJMHgwMDEwCS8qIEdvdCBhIHJlc2V0IGZvciB0aGlzIG9uZSAqLworCisvKgorICogVXRpbGl0aWVzIGRlY2xhcmUgdGhpcyBzdHJjdHVyZSBzaXplIGFzIDEwMjQgYnl0ZXMuIFNvIG1vcmUgZmllbGRzIGNhbgorICogYmUgYWRkZWQgaW4gZnV0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyCWRhdGFfc2l6ZTsgLyogY3VycmVudCBzaXplIGluIGJ5dGVzIChub3QgaW5jbHVkaW5nIHJlc3ZkKSAqLworCisJdTMyCWNvbmZpZ19zaWduYXR1cmU7CisJCS8qIEN1cnJlbnQgdmFsdWUgaXMgMHgwMDI4MjAwOAorCQkgKiAweDI4PU1BWF9MT0dJQ0FMX0RSSVZFUywKKwkJICogMHgyMD1OdW1iZXIgb2Ygc3RyaXBlcyBhbmQKKwkJICogMHgwOD1OdW1iZXIgb2Ygc3BhbnMgKi8KKworCXU4CWZ3X3ZlcnNpb25bMTZdOwkJLyogcHJpbnRhYmxlIEFTQ0kgc3RyaW5nICovCisJdTgJYmlvc192ZXJzaW9uWzE2XTsJLyogcHJpbnRhYmxlIEFTQ0kgc3RyaW5nICovCisJdTgJcHJvZHVjdF9uYW1lWzgwXTsJLyogcHJpbnRhYmxlIEFTQ0kgc3RyaW5nICovCisKKwl1OAltYXhfY29tbWFuZHM7CQkvKiBNYXguIGNvbmN1cnJlbnQgY29tbWFuZHMgc3VwcG9ydGVkICovCisJdTgJbmNoYW5uZWxzOwkJLyogTnVtYmVyIG9mIFNDU0kgQ2hhbm5lbHMgZGV0ZWN0ZWQgKi8KKwl1OAlmY19sb29wX3ByZXNlbnQ7CS8qIE51bWJlciBvZiBGaWJyZSBMb29wcyBkZXRlY3RlZCAqLworCXU4CW1lbV90eXBlOwkJLyogRURPLCBGUE0sIFNEUkFNIGV0YyAqLworCisJdTMyCXNpZ25hdHVyZTsKKwl1MTYJZHJhbV9zaXplOwkJLyogSW4gdGVybXMgb2YgTUIgKi8KKwl1MTYJc3Vic3lzaWQ7CisKKwl1MTYJc3Vic3lzdmlkOworCXU4CW5vdGlmeV9jb3VudGVyczsKKwl1OAlwYWQxa1s4ODldOwkJLyogMTM1ICsgODg5IHJlc3ZkID0gMTAyNCB0b3RhbCBzaXplICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtZWdhX3Byb2R1Y3RfaW5mbzsKKworc3RydWN0IG5vdGlmeSB7CisJdTMyIGdsb2JhbF9jb3VudGVyOwkvKiBBbnkgY2hhbmdlIGluY3JlbWVudHMgdGhpcyBjb3VudGVyICovCisKKwl1OCBwYXJhbV9jb3VudGVyOwkvKiBJbmRpY2F0ZXMgYW55IHBhcmFtcyBjaGFuZ2VkICAqLworCXU4IHBhcmFtX2lkOwkJLyogUGFyYW0gbW9kaWZpZWQgLSBkZWZpbmVkIGJlbG93ICovCisJdTE2IHBhcmFtX3ZhbDsJCS8qIE5ldyB2YWwgb2YgbGFzdCBwYXJhbSBtb2RpZmllZCAqLworCisJdTggd3JpdGVfY29uZmlnX2NvdW50ZXI7CS8qIHdyaXRlIGNvbmZpZyBvY2N1cnJlZCAqLworCXU4IHdyaXRlX2NvbmZpZ19yc3ZkWzNdOworCisJdTggbGRydl9vcF9jb3VudGVyOwkvKiBJbmRpY2F0ZXMgbGRydiBvcCBzdGFydGVkL2NvbXBsZXRlZCAqLworCXU4IGxkcnZfb3BpZDsJCS8qIGxkcnYgbnVtICovCisJdTggbGRydl9vcGNtZDsJCS8qIGxkcnYgb3BlcmF0aW9uIC0gZGVmaW5lZCBiZWxvdyAqLworCXU4IGxkcnZfb3BzdGF0dXM7CS8qIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uICovCisKKwl1OCBsZHJ2X3N0YXRlX2NvdW50ZXI7CS8qIEluZGljYXRlcyBjaGFuZ2Ugb2YgbGRydiBzdGF0ZSAqLworCXU4IGxkcnZfc3RhdGVfaWQ7CQkvKiBsZHJ2IG51bSAqLworCXU4IGxkcnZfc3RhdGVfbmV3OwkvKiBOZXcgc3RhdGUgKi8KKwl1OCBsZHJ2X3N0YXRlX29sZDsJLyogb2xkIHN0YXRlICovCisKKwl1OCBwZHJ2X3N0YXRlX2NvdW50ZXI7CS8qIEluZGljYXRlcyBjaGFuZ2Ugb2YgbGRydiBzdGF0ZSAqLworCXU4IHBkcnZfc3RhdGVfaWQ7CQkvKiBwZHJ2IGlkICovCisJdTggcGRydl9zdGF0ZV9uZXc7CS8qIE5ldyBzdGF0ZSAqLworCXU4IHBkcnZfc3RhdGVfb2xkOwkvKiBvbGQgc3RhdGUgKi8KKworCXU4IHBkcnZfZm10X2NvdW50ZXI7CS8qIEluZGljYXRlcyBwZHJ2IGZvcm1hdCBzdGFydGVkL292ZXIgKi8KKwl1OCBwZHJ2X2ZtdF9pZDsJCS8qIHBkcnYgaWQgKi8KKwl1OCBwZHJ2X2ZtdF92YWw7CQkvKiBmb3JtYXQgc3RhcnRlZC9vdmVyICovCisJdTggcGRydl9mbXRfcnN2ZDsKKworCXU4IHRhcmdfeGZlcl9jb3VudGVyOwkvKiBJbmRpY2F0ZXMgU0NTSS0yIFhmZXIgcmF0ZSBjaGFuZ2UgKi8KKwl1OCB0YXJnX3hmZXJfaWQ7CS8qIHBkcnYgSWQgICovCisJdTggdGFyZ194ZmVyX3ZhbDsJCS8qIG5ldyBYZmVyIHBhcmFtcyBvZiBsYXN0IHBkcnYgKi8KKwl1OCB0YXJnX3hmZXJfcnN2ZDsKKworCXU4IGZjbG9vcF9pZF9jaGdfY291bnRlcjsJLyogSW5kaWNhdGVzIGxvb3BpZCBjaGFuZ2VkICovCisJdTggZmNsb29waWRfcGRydmlkOwkJLyogcGRydiBpZCAqLworCXU4IGZjbG9vcF9pZDA7CQkJLyogbG9vcGlkIG9uIGZjIGxvb3AgMCAqLworCXU4IGZjbG9vcF9pZDE7CQkJLyogbG9vcGlkIG9uIGZjIGxvb3AgMSAqLworCisJdTggZmNsb29wX3N0YXRlX2NvdW50ZXI7CS8qIEluZGljYXRlcyBsb29wIHN0YXRlIGNoYW5nZWQgKi8KKwl1OCBmY2xvb3Bfc3RhdGUwOwkJLyogc3RhdGUgb2YgZmMgbG9vcCAwICovCisJdTggZmNsb29wX3N0YXRlMTsJCS8qIHN0YXRlIG9mIGZjIGxvb3AgMSAqLworCXU4IGZjbG9vcF9zdGF0ZV9yc3ZkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgTUFYX05PVElGWV9TSVpFICAgICAweDgwCisjZGVmaW5lIENVUl9OT1RJRllfU0laRSAgICAgc2l6ZW9mKHN0cnVjdCBub3RpZnkpCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIJZGF0YV9zaXplOyAvKiBjdXJyZW50IHNpemUgaW4gYnl0ZXMgKG5vdCBpbmNsdWRpbmcgcmVzdmQpICovCisKKwlzdHJ1Y3Qgbm90aWZ5IG5vdGlmeTsKKworCXU4CW5vdGlmeV9yc3ZkW01BWF9OT1RJRllfU0laRSAtIENVUl9OT1RJRllfU0laRV07CisKKwl1OAlyZWJ1aWxkX3JhdGU7CQkvKiBSZWJ1aWxkIHJhdGUgKDAlIC0gMTAwJSkgKi8KKwl1OAljYWNoZV9mbHVzaF9pbnRlcnZhbDsJLyogSW4gdGVybXMgb2YgU2Vjb25kcyAqLworCXU4CXNlbnNlX2FsZXJ0OworCXU4CWRyaXZlX2luc2VydF9jb3VudDsJLyogZHJpdmUgaW5zZXJ0aW9uIGNvdW50ICovCisKKwl1OAliYXR0ZXJ5X3N0YXR1czsKKwl1OAludW1fbGRydjsJCS8qIE5vLiBvZiBMb2cgRHJpdmVzIGNvbmZpZ3VyZWQgKi8KKwl1OAlyZWNvbl9zdGF0ZVtNQVhfTE9HSUNBTF9EUklWRVNfNDBMRCAvIDhdOwkvKiBTdGF0ZSBvZgorCQkJCQkJCSAgIHJlY29uc3RydWN0ICovCisJdTE2CWxkcnZfb3Bfc3RhdHVzW01BWF9MT0dJQ0FMX0RSSVZFU180MExEIC8gOF07IC8qIGxvZ2RydgorCQkJCQkJCQkgU3RhdHVzICovCisKKwl1MzIJbGRydl9zaXplW01BWF9MT0dJQ0FMX0RSSVZFU180MExEXTsvKiBTaXplIG9mIGVhY2ggbG9nIGRydiAqLworCXU4CWxkcnZfcHJvcFtNQVhfTE9HSUNBTF9EUklWRVNfNDBMRF07CisJdTgJbGRydl9zdGF0ZVtNQVhfTE9HSUNBTF9EUklWRVNfNDBMRF07LyogU3RhdGUgb2YgbG9nIGRyaXZlcyAqLworCXU4CXBkcnZfc3RhdGVbRkNfTUFYX1BIWVNJQ0FMX0RFVklDRVNdOy8qIFN0YXRlIG9mIHBoeXMgZHJ2cy4gKi8KKwl1MTYJcGRydl9mb3JtYXRbRkNfTUFYX1BIWVNJQ0FMX0RFVklDRVMgLyAxNl07CisKKwl1OAl0YXJnX3hmZXJbODBdOwkvKiBwaHlzIGRldmljZSB0cmFuc2ZlciByYXRlICovCisJdTgJcGFkMWtbMjYzXTsJLyogNzYxICsgMjYzcmVzZXJ2ZWQgPSAxMDI0IGJ5dGVzIHRvdGFsIHNpemUgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1lZ2FfaW5xdWlyeTM7CisKKworLyogU3RydWN0dXJlcyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXU4CW1heF9jb21tYW5kczsJLyogTWF4IGNvbmN1cnJlbnQgY29tbWFuZHMgc3VwcG9ydGVkICovCisJdTgJcmVidWlsZF9yYXRlOwkvKiBSZWJ1aWxkIHJhdGUgLSAwJSB0aHJ1IDEwMCUgKi8KKwl1OAltYXhfdGFyZ19wZXJfY2hhbjsJLyogTWF4IHRhcmcgcGVyIGNoYW5uZWwgKi8KKwl1OAluY2hhbm5lbHM7CS8qIE51bWJlciBvZiBjaGFubmVscyBvbiBIQkEgKi8KKwl1OAlmd192ZXJzaW9uWzRdOwkvKiBGaXJtd2FyZSB2ZXJzaW9uICovCisJdTE2CWFnZV9vZl9mbGFzaDsJLyogTnVtYmVyIG9mIHRpbWVzIEZXIGhhcyBiZWVuIGZsYXNoZWQgKi8KKwl1OAljaGlwX3NldF92YWx1ZTsJLyogQ29udGVudHMgb2YgMHhDMDAwMDgzMiAqLworCXU4CWRyYW1fc2l6ZTsJLyogSW4gTUIgKi8KKwl1OAljYWNoZV9mbHVzaF9pbnRlcnZhbDsJLyogaW4gc2Vjb25kcyAqLworCXU4CWJpb3NfdmVyc2lvbls0XTsKKwl1OAlib2FyZF90eXBlOworCXU4CXNlbnNlX2FsZXJ0OworCXU4CXdyaXRlX2NvbmZpZ19jb3VudDsJLyogSW5jcmVhc2Ugd2l0aCBldmVyeSBjb25maWd1cmF0aW9uCisJCQkJCSAgIGNoYW5nZSAqLworCXU4CWRyaXZlX2luc2VydGVkX2NvdW50OwkvKiBJbmNyZWFzZSB3aXRoIGV2ZXJ5IGRyaXZlIGluc2VydGVkCisJCQkJCSAqLworCXU4CWluc2VydGVkX2RyaXZlOwkvKiBDaGFubmVsOklkIG9mIGluc2VydGVkIGRyaXZlICovCisJdTgJYmF0dGVyeV9zdGF0dXM7CS8qCisJCQkJICogQklUIDA6IGJhdHRlcnkgbW9kdWxlIG1pc3NpbmcKKwkJCQkgKiBCSVQgMTogVkJBRAorCQkJCSAqIEJJVCAyOiB0ZW1wcmF0dXJlIGhpZ2gKKwkJCQkgKiBCSVQgMzogYmF0dGVyeSBwYWNrIG1pc3NpbmcKKwkJCQkgKiBCSVQgNCw1OgorCQkJCSAqICAgMDAgLSBjaGFyZ2UgY29tcGxldGUKKwkJCQkgKiAgIDAxIC0gZmFzdCBjaGFyZ2UgaW4gcHJvZ3Jlc3MKKwkJCQkgKiAgIDEwIC0gZmFzdCBjaGFyZ2UgZmFpbAorCQkJCSAqICAgMTEgLSB1bmRlZmluZWQKKwkJCQkgKiBCaXQgNjogY291bnRlciA+IDEwMDAKKwkJCQkgKiBCaXQgNzogVW5kZWZpbmVkCisJCQkJICovCisJdTgJZGVjX2ZhdWx0X2J1c19pbmZvOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbWVnYV9hZHBfaW5mbzsKKworCit0eXBlZGVmIHN0cnVjdCB7CisJdTgJbnVtX2xkcnY7CS8qIE51bWJlciBvZiBsb2dpY2FsIGRyaXZlcyBjb25maWd1cmVkICovCisJdTgJcnN2ZFszXTsKKwl1MzIJbGRydl9zaXplW01BWF9MT0dJQ0FMX0RSSVZFU184TERdOworCXU4CWxkcnZfcHJvcFtNQVhfTE9HSUNBTF9EUklWRVNfOExEXTsKKwl1OAlsZHJ2X3N0YXRlW01BWF9MT0dJQ0FMX0RSSVZFU184TERdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbWVnYV9sZHJ2X2luZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1OAlwZHJ2X3N0YXRlW01BWF9QSFlTSUNBTF9EUklWRVNdOworCXU4CXJzdmQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtZWdhX3BkcnZfaW5mbzsKKworLyogUkFJRCBpbnF1aXJ5OiBNYWlsYm94IGNvbW1hbmQgMHgwNSovCit0eXBlZGVmIHN0cnVjdCB7CisJbWVnYV9hZHBfaW5mbwlhZGFwdGVyX2luZm87CisJbWVnYV9sZHJ2X2luZm8JbG9nZHJ2X2luZm87CisJbWVnYV9wZHJ2X2luZm8JcGRydl9pbmZvOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbXJhaWRfaW5xdWlyeTsKKworCisvKiBSQUlEIGV4dGVuZGVkIGlucXVpcnk6IE1haWxib3ggY29tbWFuZCAweDA0Ki8KK3R5cGVkZWYgc3RydWN0IHsKKwltcmFpZF9pbnF1aXJ5CXJhaWRfaW5xOworCXUxNglwaHlzX2Rydl9mb3JtYXRbTUFYX0NIQU5ORUxTXTsKKwl1OAlzdGFja19hdHRuOworCXU4CW1vZGVtX3N0YXR1czsKKwl1OAlyc3ZkWzJdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbXJhaWRfZXh0X2lucXVpcnk7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCXU4CWNoYW5uZWw7CisJdTgJdGFyZ2V0OworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBhZHBfZGV2aWNlOworCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyCQlzdGFydF9ibGs7CS8qIHN0YXJ0aW5nIGJsb2NrICovCisJdTMyCQludW1fYmxrczsJLyogIyBvZiBibG9ja3MgKi8KKwlhZHBfZGV2aWNlCWRldmljZVtNQVhfUk9XX1NJWkVfNDBMRF07Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGFkcF9zcGFuXzQwbGQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIJCXN0YXJ0X2JsazsJLyogc3RhcnRpbmcgYmxvY2sgKi8KKwl1MzIJCW51bV9ibGtzOwkvKiAjIG9mIGJsb2NrcyAqLworCWFkcF9kZXZpY2UJZGV2aWNlW01BWF9ST1dfU0laRV84TERdOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBhZHBfc3Bhbl84bGQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1OAlzcGFuX2RlcHRoOwkvKiBUb3RhbCAjIG9mIHNwYW5zICovCisJdTgJbGV2ZWw7CQkvKiBSQUlEIGxldmVsICovCisJdTgJcmVhZF9haGVhZDsJLyogcmVhZCBhaGVhZCwgbm8gcmVhZCBhaGVhZCwgYWRhcHRpdmUgcmVhZAorCQkJCSAgIGFoZWFkICovCisJdTgJc3RyaXBlX3N6OwkvKiBFbmNvZGVkIHN0cmlwZSBzaXplICovCisJdTgJc3RhdHVzOwkJLyogU3RhdHVzIG9mIHRoZSBsb2dpY2FsIGRyaXZlICovCisJdTgJd3JpdGVfbW9kZTsJLyogd3JpdGUgbW9kZSwgd3JpdGVfdGhyb3VnaC93cml0ZV9iYWNrICovCisJdTgJZGlyZWN0X2lvOwkvKiBkaXJlY3QgaW8gb3IgdGhyb3VnaCBjYWNoZSAqLworCXU4CXJvd19zaXplOwkvKiBOdW1iZXIgb2Ygc3RyaXBlcyBpbiBhIHJvdyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbG9nZHJ2X3BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJbG9nZHJ2X3BhcmFtCWxwYXJhbTsKKwlhZHBfc3Bhbl80MGxkCXNwYW5bTUFYX1NQQU5fREVQVEhdOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBsb2dkcnZfNDBsZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWxvZ2Rydl9wYXJhbQlscGFyYW07CisJYWRwX3NwYW5fOGxkCXNwYW5bTUFYX1NQQU5fREVQVEhdOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBsb2dkcnZfOGxkOworCit0eXBlZGVmIHN0cnVjdCB7CisJdTgJdHlwZTsJCS8qIFR5cGUgb2YgdGhlIGRldmljZSAqLworCXU4CWN1cl9zdGF0dXM7CS8qIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBkZXZpY2UgKi8KKwl1OAl0YWdfZGVwdGg7CS8qIExldmVsIG9mIHRhZ2dpbmcgKi8KKwl1OAlzeW5jX25lZzsJLyogc3luYyBuZWdvdGlhdGlvbiAtIEVOQUJMRSBvciBESVNCQUxFICovCisJdTMyCXNpemU7CQkvKiBjb25maWd1cmFibGUgc2l6ZSBpbiB0ZXJtcyBvZiA1MTIgYnl0ZQorCQkJCSAgIGJsb2NrcyAqLworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwaHlzX2RydjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXU4CQlubG9nX2RyaXZlczsJCS8qIG51bWJlciBvZiBsb2dpY2FsIGRyaXZlcyAqLworCXU4CQlyZXN2ZFszXTsKKwlsb2dkcnZfNDBsZAlsZHJ2W01BWF9MT0dJQ0FMX0RSSVZFU180MExEXTsKKwlwaHlzX2RydglwZHJ2W01BWF9QSFlTSUNBTF9EUklWRVNdOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBkaXNrX2FycmF5XzQwbGQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1OAkJbmxvZ19kcml2ZXM7CS8qIG51bWJlciBvZiBsb2dpY2FsIGRyaXZlcyAqLworCXU4CQlyZXN2ZFszXTsKKwlsb2dkcnZfOGxkCWxkcnZbTUFYX0xPR0lDQUxfRFJJVkVTXzhMRF07CisJcGh5c19kcnYJcGRydltNQVhfUEhZU0lDQUxfRFJJVkVTXTsKK31fX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZGlza19hcnJheV84bGQ7CisKKworLyoKKyAqIFVzZXIgaW9jdGwgc3RydWN0dXJlLgorICogVGhpcyBzdHJ1Y3R1cmUgd2lsbCBiZSB1c2VkIGZvciBUcmFkaXRpb25hbCBNZXRob2QgaW9jdGwgaW50ZXJmYWNlCisgKiBjb21tYW5kcyAoMHg4MCksQWx0ZXJuYXRlIEJ1ZmZlciBNZXRob2QgKDB4ODEpIGlvY3RsIGNvbW1hbmRzIGFuZCB0aGUKKyAqIERyaXZlciBpb2N0bHMuCisgKiBUaGUgRHJpdmVyIGlvY3RsIGludGVyZmFjZSBoYW5kbGVzIHRoZSBjb21tYW5kcyBhdCB0aGUgZHJpdmVyIGxldmVsLAorICogd2l0aG91dCBiZWluZyBzZW50IHRvIHRoZSBjYXJkLgorICovCisvKiBzeXN0ZW0gY2FsbCBpbXBvc2VkIGxpbWl0LiBDaGFuZ2UgYWNjb3JkaW5nbHkgKi8KKyNkZWZpbmUgSU9DVExfTUFYX0RBVEFMRU4gICAgICAgNDA5NgorCitzdHJ1Y3QgdWlvY3RsX3QgeworCXUzMiBpbmxlbjsKKwl1MzIgb3V0bGVuOworCXVuaW9uIHsKKwkJdTggZmNhWzE2XTsKKwkJc3RydWN0IHsKKwkJCXU4IG9wY29kZTsKKwkJCXU4IHN1Ym9wY29kZTsKKwkJCXUxNiBhZGFwbm87CisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCQkJdTggKmJ1ZmZlcjsKKwkJCXU4IHBhZFs0XTsKKyNlbmRpZgorI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKwkJCXU4ICpidWZmZXI7CisjZW5kaWYKKwkJCXUzMiBsZW5ndGg7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGZjczsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1aTsKKwl1OCBtYm94WzE4XTsJCS8qIDE2IGJ5dGVzICsgMiBzdGF0dXMgYnl0ZXMgKi8KKwltZWdhX3Bhc3N0aHJ1IHB0aHJ1OworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKwljaGFyIF9fdXNlciAqZGF0YTsJCS8qIGJ1ZmZlciA8PSA0MDk2IGZvciAweDgwIGNvbW1hbmRzICovCisJY2hhciBwYWRbNF07CisjZW5kaWYKKyNpZiBCSVRTX1BFUl9MT05HID09IDY0CisJY2hhciBfX3VzZXIgKmRhdGE7CisjZW5kaWYKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKgorICogc3RydWN0IG1jb250cm9sbGVyIGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udHJvbGxlcnMgaW4gdGhlCisgKiBzeXN0ZW0uIEl0cyB1cHRvIHRoZSBhcHBsaWNhdGlvbiBob3cgdG8gdXNlIHRoZSBpbmZvcm1hdGlvbi4gV2UgYXJlIHBhc3NpbmcKKyAqIGFzIG11Y2ggaW5mbyBhYm91dCB0aGUgY2FyZHMgYXMgcG9zc2libGUgYW5kIHVzZWZ1bC4gQmVmb3JlIGlzc3VpbmcgdGhlCisgKiBjYWxsIHRvIGZpbmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhcmRzLCB0aGUgYXBwbGljYWl0b24gbmVlZHMgdG8gaXNzdWUgYQorICogaW9jdGwgZmlyc3QgdG8gZmluZCBvdXQgdGhlIG51bWJlciBvZiBjb250cm9sbGVycyBpbiB0aGUgc3lzdGVtLgorICovCisjZGVmaW5lIE1BWF9DT05UUk9MTEVSUyAzMgorCitzdHJ1Y3QgbWNvbnRyb2xsZXIgeworCXU2NCBiYXNlOworCXU4IGlycTsKKwl1OCBudW1sZHJ2OworCXU4IHBjaWJ1czsKKwl1MTYgcGNpZGV2OworCXU4IHBjaWZ1bjsKKwl1MTYgcGNpaWQ7CisJdTE2IHBjaXZlbmRvcjsKKwl1OCBwY2lzbG90OworCXUzMiB1aWQ7Cit9OworCisvKgorICogbWFpbGJveCBzdHJ1Y3R1cmUgdXNlZCBmb3IgaW50ZXJuYWwgY29tbWFuZHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXU4CWNtZDsKKwl1OAljbWRpZDsKKwl1OAlvcGNvZGU7CisJdTgJc3Vib3Bjb2RlOworCXUzMglsYmE7CisJdTMyCXhmZXJhZGRyOworCXU4CWxvZ2RydjsKKwl1OAlyc3ZkWzNdOworCXU4CW51bXN0YXR1czsKKwl1OAlzdGF0dXM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtZWdhY21kX3Q7CisKKy8qCisgKiBEZWZpbmVzIGZvciBEcml2ZXIgSU9DVEwgaW50ZXJmYWNlCisgKi8KKyNkZWZpbmUgTUVHQUlPQ19NQUdJQyAgCSdtJworCisjZGVmaW5lIE1FR0FJT0NfUU5BREFQCQknbScJLyogUXVlcnkgIyBvZiBhZGFwdGVycyAqLworI2RlZmluZSBNRUdBSU9DX1FEUlZSVkVSCSdlJwkvKiBRdWVyeSBkcml2ZXIgdmVyc2lvbiAqLworI2RlZmluZSBNRUdBSU9DX1FBREFQSU5GTyAgIAknZycJLyogUXVlcnkgYWRhcHRlciBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBNS0FEQVAoYWRhcG5vKQkgIAkoTUVHQUlPQ19NQUdJQyA8PCA4IHwgKGFkYXBubykgKQorI2RlZmluZSBHRVRBREFQKG1rYWRhcCkJIAkoIChta2FkYXApIF4gTUVHQUlPQ19NQUdJQyA8PCA4ICkKKworLyoKKyAqIERlZmluaXRpb24gZm9yIHRoZSBuZXcgaW9jdGwgaW50ZXJmYWNlIChOSVQpCisgKi8KKworLyoKKyAqIFZlbmRvciBzcGVjaWZpYyBHcm91cC03IGNvbW1hbmRzCisgKi8KKyNkZWZpbmUgVkVORE9SX1NQRUNJRklDX0NPTU1BTkRTCTB4RTAKKyNkZWZpbmUgTUVHQV9JTlRFUk5BTF9DTUQJCVZFTkRPUl9TUEVDSUZJQ19DT01NQU5EUyArIDB4MDEKKworLyoKKyAqIFRoZSBpb2N0bCBjb21tYW5kLiBObyBvdGhlciBjb21tYW5kIHNoYWxsIGJlIHVzZWQgZm9yIHRoaXMgaW50ZXJmYWNlCisgKi8KKyNkZWZpbmUgVVNDU0lDTUQJVkVORE9SX1NQRUNJRklDX0NPTU1BTkRTCisKKy8qCisgKiBEYXRhIGRpcmVjdGlvbiBmbGFncworICovCisjZGVmaW5lIFVJT0NfUkQJCTB4MDAwMDEKKyNkZWZpbmUgVUlPQ19XUgkJMHgwMDAwMgorCisvKgorICogaW9jdGwgb3Bjb2RlcworICovCisjZGVmaW5lIE1CT1hfQ01ECTB4MDAwMDAJLyogRENNRCBvciBwYXNzdGhydSBjb21tYW5kICovCisjZGVmaW5lIEdFVF9EUklWRVJfVkVSCTB4MTAwMDAJLyogR2V0IGRyaXZlciB2ZXJzaW9uICovCisjZGVmaW5lIEdFVF9OX0FEQVAJMHgyMDAwMAkvKiBHZXQgbnVtYmVyIG9mIGFkYXB0ZXJzICovCisjZGVmaW5lIEdFVF9BREFQX0lORk8JMHgzMDAwMAkvKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBhZGFwdGVyICovCisjZGVmaW5lIEdFVF9DQVAJCTB4NDAwMDAJLyogR2V0IGlvY3RsIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBHRVRfU1RBVFMJMHg1MDAwMAkvKiBHZXQgc3RhdGlzdGljcywgaW5jbHVkaW5nIGVycm9yIGluZm8gKi8KKworCisvKgorICogVGhlIGlvY3RsIHN0cnVjdHVyZS4KKyAqIE1CT1ggbWFjcm8gY29udmVydHMgYSBuaXRpb2N0bF90IHN0cnVjdHVyZSB0byBtZWdhY21kX3QgcG9pbnRlciBhbmQKKyAqIE1CT1hfUCBtYWNybyBjb252ZXJ0cyBhIG5pdGlvY3RsX3QgcG9pbnRlciB0byBtZWdhY21kX3QgcG9pbnRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIJCXNpZ25hdHVyZVs4XTsJLyogTXVzdCBjb250YWluICJNRUdBTklUIiAqLworCXUzMgkJb3Bjb2RlOwkJLyogb3Bjb2RlIGZvciB0aGUgY29tbWFuZCAqLworCXUzMgkJYWRhcG5vOwkJLyogYWRhcHRlciBudW1iZXIgKi8KKwl1bmlvbiB7CisJCXU4CV9fcmF3X21ib3hbMThdOworCQl2b2lkIF9fdXNlciAqX191YWRkcjsgLyogeGZlcmFkZHIgZm9yIG5vbi1tYm94IGNtZHMgKi8KKwl9X191YTsKKworI2RlZmluZSB1aW9jX3JtYm94CV9fdWEuX19yYXdfbWJveAorI2RlZmluZSBNQk9YKHVpb2MpCSgobWVnYWNtZF90ICopJigodWlvYykuX191YS5fX3Jhd19tYm94WzBdKSkKKyNkZWZpbmUgTUJPWF9QKHVpb2MpCSgobWVnYWNtZF90IF9fdXNlciAqKSYoKHVpb2MpLT5fX3VhLl9fcmF3X21ib3hbMF0pKQorI2RlZmluZSB1aW9jX3VhZGRyCV9fdWEuX191YWRkcgorCisJdTMyCQl4ZmVybGVuOwkvKiB4ZmVybGVuIGZvciBEQ01EIGFuZCBub24tbWJveAorCQkJCQkgICBjb21tYW5kcyAqLworCXUzMgkJZmxhZ3M7CQkvKiBkYXRhIGRpcmVjdGlvbiBmbGFncyAqLworfW5pdGlvY3RsX3Q7CisKKworLyoKKyAqIEkvTyBzdGF0aXN0aWNzIGZvciBzb21lIGFwcGxpY2F0aW9ucyBsaWtlIFNOTVAgYWdlbnQuIFRoZSBjYWxsZXIgbXVzdAorICogcHJvdmlkZSB0aGUgbnVtYmVyIG9mIGxvZ2ljYWwgZHJpdmVzIGZvciB3aGljaCBzdGF0dXMgc2hvdWxkIGJlIHJlcG9ydGVkLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJaW50CW51bV9sZHJ2OwkvKiBOdW1iZXIgZm9yIGxvZ2ljYWwgZHJpdmVzIGZvciB3aGljaCB0aGUKKwkJCQkgICBzdGF0dXMgc2hvdWxkIGJlIHJlcG9ydGVkLiAqLworCXUzMglucmVhZHNbTUFYX0xPR0lDQUxfRFJJVkVTXzQwTERdOwkvKiBudW1iZXIgb2YgcmVhZHMgZm9yCisJCQkJCQkJZWFjaCBsb2dpY2FsIGRyaXZlICovCisJdTMyCW5yZWFkYmxvY2tzW01BWF9MT0dJQ0FMX0RSSVZFU180MExEXTsJLyogbnVtYmVyIG9mIGJsb2NrcworCQkJCQkJCXJlYWQgZm9yIGVhY2ggbG9naWNhbAorCQkJCQkJCWRyaXZlICovCisJdTMyCW53cml0ZXNbTUFYX0xPR0lDQUxfRFJJVkVTXzQwTERdOwkvKiBudW1iZXIgb2Ygd3JpdGVzCisJCQkJCQkJZm9yIGVhY2ggbG9naWNhbAorCQkJCQkJCWRyaXZlICovCisJdTMyCW53cml0ZWJsb2Nrc1tNQVhfTE9HSUNBTF9EUklWRVNfNDBMRF07CS8qIG51bWJlciBvZiBibG9ja3MKKwkJCQkJCQl3cml0ZXMgZm9yIGVhY2gKKwkJCQkJCQlsb2dpY2FsIGRyaXZlICovCisJdTMyCXJkX2Vycm9yc1tNQVhfTE9HSUNBTF9EUklWRVNfNDBMRF07CS8qIG51bWJlciBvZiByZWFkCisJCQkJCQkJICAgZXJyb3JzIGZvciBlYWNoCisJCQkJCQkJICAgbG9naWNhbCBkcml2ZSAqLworCXUzMgl3cl9lcnJvcnNbTUFYX0xPR0lDQUxfRFJJVkVTXzQwTERdOwkvKiBudW1iZXIgb2Ygd3JpdGUKKwkJCQkJCQkgICBlcnJvcnMgZm9yIGVhY2gKKwkJCQkJCQkgICBsb2dpY2FsIGRyaXZlICovCit9bWVnYXN0YXRfdDsKKworCitzdHJ1Y3QgcHJpdmF0ZV9iaW9zX2RhdGEgeworCXU4CWdlb21ldHJ5OjQ7CS8qCisJCQkJICogYml0cyAwLTMgLSBCSU9TIGdlb21ldHJ5CisJCQkJICogMHgwMDAxIC0gMUdCCisJCQkJICogMHgwMDEwIC0gMkdCCisJCQkJICogMHgxMDAwIC0gOEdCCisJCQkJICogT3RoZXJzIHZhbHVlcyBhcmUgaW52YWxpZAorCQkJCQkJCSAqLworCXU4CXVudXNlZDo0OwkvKiBiaXRzIDQtNyBhcmUgdW51c2VkICovCisJdTgJYm9vdF9kcnY7CS8qCisJCQkJICogbG9naWNhbCBkcml2ZSBzZXQgYXMgYm9vdCBkcml2ZQorCQkJCSAqIDAuLjcgLSBmb3IgOExEIGNhcmRzCisJCQkJICogMC4uMzkgLSBmb3IgNDBMRCBjYXJkcworCQkJCSAqLworCXU4CXJzdmRbMTJdOworCXUxNglja3N1bTsJLyogMC0oc3VtIG9mIGZpcnN0IDEzIGJ5dGVzIG9mIHRoaXMgc3RydWN0dXJlKSAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworCisKKy8qCisgKiBNYWlsYm94IGFuZCBmaXJtd2FyZSBjb21tYW5kcyBhbmQgc3Vib3Bjb2RlcyB1c2VkIGluIHRoaXMgZHJpdmVyLgorICovCisKKyNkZWZpbmUgTUVHQV9NQk9YQ01EX0xSRUFECTB4MDEKKyNkZWZpbmUgTUVHQV9NQk9YQ01EX0xXUklURQkweDAyCisjZGVmaW5lIE1FR0FfTUJPWENNRF9QQVNTVEhSVQkweDAzCisjZGVmaW5lIE1FR0FfTUJPWENNRF9BRFBFWFRJTlEJMHgwNAorI2RlZmluZSBNRUdBX01CT1hDTURfQURBUFRFUklOUQkweDA1CisjZGVmaW5lIE1FR0FfTUJPWENNRF9MUkVBRDY0CTB4QTcKKyNkZWZpbmUgTUVHQV9NQk9YQ01EX0xXUklURTY0CTB4QTgKKyNkZWZpbmUgTUVHQV9NQk9YQ01EX1BBU1NUSFJVNjQJMHhDMworI2RlZmluZSBNRUdBX01CT1hDTURfRVhUUFRIUlUJMHhFMworCisjZGVmaW5lIE1BSU5fTUlTQ19PUENPREUJMHhBNAkvKiBmL3cgbWlzYyBvcGNvZGUgKi8KKyNkZWZpbmUgR0VUX01BWF9TR19TVVBQT1JUCTB4MDEJLyogZ2V0IG1heCBzZyBsZW4gc3VwcG9ydGVkIGJ5IGYvdyAqLworCisjZGVmaW5lIEZDX05FV19DT05GSUcJCTB4QTEKKyNkZWZpbmUgTkNfU1VCT1BfUFJPRFVDVF9JTkZPCTB4MEUKKyNkZWZpbmUgTkNfU1VCT1BfRU5RVUlSWTMJMHgwRgorI2RlZmluZSBFTlEzX0dFVF9TT0xJQ0lURURfRlVMTAkweDAyCisjZGVmaW5lIE9QX0RDTURfUkVBRF9DT05GSUcJMHgwNAorI2RlZmluZSBORVdfUkVBRF9DT05GSUdfOExECTB4NjcKKyNkZWZpbmUgUkVBRF9DT05GSUdfOExECQkweDA3CisjZGVmaW5lIEZMVVNIX0FEQVBURVIJCTB4MEEKKyNkZWZpbmUgRkxVU0hfU1lTVEVNCQkweEZFCisKKy8qCisgKiBDb21tYW5kIGZvciByYW5kb20gZGVsZXRpb24gb2YgbG9naWNhbCBkcml2ZXMKKyAqLworI2RlZmluZQlGQ19ERUxfTE9HRFJWCQkweEE0CS8qIGYvdyBjb21tYW5kICovCisjZGVmaW5lCU9QX1NVUF9ERUxfTE9HRFJWCTB4MkEJLyogaXMgZmVhdHVyZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgT1BfR0VUX0xESURfTUFQCQkweDE4CS8qIGdldCBsZGlkIGFuZCBsb2dkcnYgbnVtYmVyIG1hcCAqLworI2RlZmluZSBPUF9ERUxfTE9HRFJWCQkweDFDCS8qIGRlbGV0ZSBsb2dpY2FsIGRyaXZlICovCisKKy8qCisgKiBCSU9TIGNvbW1hbmRzCisgKi8KKyNkZWZpbmUgSVNfQklPU19FTkFCTEVECQkweDYyCisjZGVmaW5lIEdFVF9CSU9TCQkweDAxCisjZGVmaW5lIENITkxfQ0xBU1MJCTB4QTkKKyNkZWZpbmUgR0VUX0NITkxfQ0xBU1MJCTB4MDAKKyNkZWZpbmUgU0VUX0NITkxfQ0xBU1MJCTB4MDEKKyNkZWZpbmUgQ0hfUkFJRAkJCTB4MDEKKyNkZWZpbmUgQ0hfU0NTSQkJCTB4MDAKKyNkZWZpbmUgQklPU19QVlRfREFUQQkJMHg0MAorI2RlZmluZSBHRVRfQklPU19QVlRfREFUQQkweDAwCisKKworLyoKKyAqIENvbW1hbmRzIHRvIHN1cHBvcnQgY2x1c3RlcmluZworICovCisjZGVmaW5lIE1FR0FfR0VUX1RBUkdFVF9JRAkweDdECisjZGVmaW5lIE1FR0FfQ0xVU1RFUl9PUAkJMHg3MAorI2RlZmluZSBNRUdBX0dFVF9DTFVTVEVSX01PREUJMHgwMgorI2RlZmluZSBNRUdBX0NMVVNURVJfQ01ECTB4NkUKKyNkZWZpbmUgTUVHQV9SRVNFUlZFX0xECQkweDAxCisjZGVmaW5lIE1FR0FfUkVMRUFTRV9MRAkJMHgwMgorI2RlZmluZSBNRUdBX1JFU0VUX1JFU0VSVkFUSU9OUwkweDAzCisjZGVmaW5lIE1FR0FfUkVTRVJWQVRJT05fU1RBVFVTCTB4MDQKKyNkZWZpbmUgTUVHQV9SRVNFUlZFX1BECQkweDA1CisjZGVmaW5lIE1FR0FfUkVMRUFTRV9QRAkJMHgwNgorCisKKy8qCisgKiBNb2R1bGUgYmF0dGVyeSBzdGF0dXMKKyAqLworI2RlZmluZSBNRUdBX0JBVFRfTU9EVUxFX01JU1NJTkcJMHgwMQorI2RlZmluZSBNRUdBX0JBVFRfTE9XX1ZPTFRBR0UJCTB4MDIKKyNkZWZpbmUgTUVHQV9CQVRUX1RFTVBfSElHSAkJMHgwNAorI2RlZmluZSBNRUdBX0JBVFRfUEFDS19NSVNTSU5HCQkweDA4CisjZGVmaW5lIE1FR0FfQkFUVF9DSEFSR0VfTUFTSwkJMHgzMAorI2RlZmluZSBNRUdBX0JBVFRfQ0hBUkdFX0RPTkUJCTB4MDAKKyNkZWZpbmUgTUVHQV9CQVRUX0NIQVJHRV9JTlBST0cJCTB4MTAKKyNkZWZpbmUgTUVHQV9CQVRUX0NIQVJHRV9GQUlMCQkweDIwCisjZGVmaW5lIE1FR0FfQkFUVF9DWUNMRVNfRVhDRUVERUQJMHg0MAorCisvKgorICogUGh5c2ljYWwgZHJpdmUgc3RhdGVzLgorICovCisjZGVmaW5lIFBEUlZfVU5DTkYJMAorI2RlZmluZSBQRFJWX09OTElORQkzCisjZGVmaW5lIFBEUlZfRkFJTEVECTQKKyNkZWZpbmUgUERSVl9SQkxECTUKKyNkZWZpbmUgUERSVl9IT1RTUEFSRQk2CisKKworLyoKKyAqIFJhaWQgbG9naWNhbCBkcml2ZSBzdGF0ZXMuCisgKi8KKyNkZWZpbmUgUkRSVl9PRkZMSU5FCTAKKyNkZWZpbmUgUkRSVl9ERUdSQURFRAkxCisjZGVmaW5lIFJEUlZfT1BUSU1BTAkyCisjZGVmaW5lIFJEUlZfREVMRVRFRAkzCisKKy8qCisgKiBSZWFkLCB3cml0ZSBhbmQgY2FjaGUgcG9saWNpZXMKKyAqLworI2RlZmluZSBOT19SRUFEX0FIRUFECQkwCisjZGVmaW5lIFJFQURfQUhFQUQJCTEKKyNkZWZpbmUgQURBUF9SRUFEX0FIRUFECQkyCisjZGVmaW5lIFdSTU9ERV9XUklURV9USFJVCTAKKyNkZWZpbmUgV1JNT0RFX1dSSVRFX0JBQ0sJMQorI2RlZmluZSBDQUNIRURfSU8JCTAKKyNkZWZpbmUgRElSRUNUX0lPCQkxCisKKworI2RlZmluZSBTQ1NJX0xJU1Qoc2NwKSAoKHN0cnVjdCBsaXN0X2hlYWQgKikoJihzY3ApLT5TQ3ApKQorCisvKgorICogRWFjaCBjb250cm9sbGVyJ3Mgc29mdCBzdGF0ZQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJaW50CXRoaXNfaWQ7CS8qIG91ciBpZCwgbWF5IHNldCB0byBkaWZmZXJlbnQgdGhhbiA3IGlmCisJCQkJICAgY2x1c3RlcmluZyBpcyBhdmFpbGFibGUgKi8KKwl1MzIJZmxhZzsKKworCXVuc2lnbmVkIGxvbmcJYmFzZTsKKworCS8qIG1ib3g2NCB3aXRoIG1ib3ggbm90IGFsaWduZWQgb24gMTYtYnl0ZSBib3VuZHJ5ICovCisJbWJveDY0X3QJKnVuYV9tYm94NjQ7CisJZG1hX2FkZHJfdAl1bmFfbWJveDY0X2RtYTsKKworCXZvbGF0aWxlIG1ib3g2NF90CSptYm94NjQ7LyogcHRyIHRvIDY0LWJpdCBtYWlsYm94ICovCisJdm9sYXRpbGUgbWJveF90CQkqbWJveDsJLyogcHRyIHRvIHN0YW5kYXJkIG1haWxib3ggKi8KKwlkbWFfYWRkcl90CQltYm94X2RtYTsKKworCXN0cnVjdCBwY2lfZGV2CSpkZXY7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCWZyZWVfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXBlbmRpbmdfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWNvbXBsZXRlZF9saXN0OworCisJc3RydWN0IFNjc2lfSG9zdAkqaG9zdDsKKworI2RlZmluZSBNRUdBX0JVRkZFUl9TSVpFICgyKjEwMjQpCisJdTgJCSptZWdhX2J1ZmZlcjsKKwlkbWFfYWRkcl90CWJ1Zl9kbWFfaGFuZGxlOworCisJbWVnYV9wcm9kdWN0X2luZm8JcHJvZHVjdF9pbmZvOworCisJdTgJCW1heF9jbWRzOworCXNjYl90CQkqc2NiX2xpc3Q7CisKKwlhdG9taWNfdAlwZW5kX2NtZHM7CS8qIG1haW50YWluIGEgY291bnRlciBmb3IgcGVuZGluZworCQkJCQkgICBjb21tYW5kcyBpbiBmaXJtd2FyZSAqLworCisjaWYgTUVHQV9IQVZFX1NUQVRTCisJdTMyCW5yZWFkc1tNQVhfTE9HSUNBTF9EUklWRVNfNDBMRF07CisJdTMyCW5yZWFkYmxvY2tzW01BWF9MT0dJQ0FMX0RSSVZFU180MExEXTsKKwl1MzIJbndyaXRlc1tNQVhfTE9HSUNBTF9EUklWRVNfNDBMRF07CisJdTMyCW53cml0ZWJsb2Nrc1tNQVhfTE9HSUNBTF9EUklWRVNfNDBMRF07CisJdTMyCXJkX2Vycm9yc1tNQVhfTE9HSUNBTF9EUklWRVNfNDBMRF07CisJdTMyCXdyX2Vycm9yc1tNQVhfTE9HSUNBTF9EUklWRVNfNDBMRF07CisjZW5kaWYKKworCS8qIEhvc3QgYWRhcHRlciBwYXJhbWV0ZXJzICovCisJdTgJbnVtbGRydjsKKwl1OAlmd192ZXJzaW9uWzddOworCXU4CWJpb3NfdmVyc2lvbls3XTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJc3RydWN0IHByb2NfZGlyX2VudHJ5CSpjb250cm9sbGVyX3Byb2NfZGlyX2VudHJ5OworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY19yZWFkOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY19zdGF0OworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY19tYm94OworCisjaWYgTUVHQV9IQVZFX0VOSF9QUk9DCisJc3RydWN0IHByb2NfZGlyX2VudHJ5CSpwcm9jX3JyOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY19iYXR0ZXJ5OworI2RlZmluZSBNQVhfUFJPQ19DSEFOTkVMUwk0CisJc3RydWN0IHByb2NfZGlyX2VudHJ5CSpwcm9jX3BkcnZzdGF0W01BWF9QUk9DX0NIQU5ORUxTXTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKnByb2NfcmRydnN0YXRbTUFYX1BST0NfQ0hBTk5FTFNdOworI2VuZGlmCisKKyNlbmRpZgorCisJaW50CWhhc182NGJpdF9hZGRyOwkJLyogYXJlIHdlIHVzaW5nIDY0LWJpdCBhZGRyZXNzaW5nICovCisJaW50CXN1cHBvcnRfZXh0X2NkYjsKKwlpbnQJYm9vdF9sZHJ2X2VuYWJsZWQ7CisJaW50CWJvb3RfbGRydjsKKwlpbnQJYm9vdF9wZHJ2X2VuYWJsZWQ7CS8qIGJvb3QgZnJvbSBwaHlzaWNhbCBkcml2ZSAqLworCWludAlib290X3BkcnZfY2g7CQkvKiBib290IHBoeXNpY2FsIGRyaXZlIGNoYW5uZWwgKi8KKwlpbnQJYm9vdF9wZHJ2X3RndDsJCS8qIGJvb3QgcGh5c2ljYWwgZHJpdmUgdGFyZ2V0ICovCisKKworCWludAlzdXBwb3J0X3JhbmRvbV9kZWw7CS8qIERvIHdlIHN1cHBvcnQgcmFuZG9tIGRlbGV0aW9uIG9mCisJCQkJCSAgIGxvZ2RydnMgKi8KKwlpbnQJcmVhZF9sZGlkbWFwOwkvKiBzZXQgYWZ0ZXIgbG9naWNhbCBkcml2ZSBkZWx0aW9uLiBUaGUKKwkJCQkgICBsb2dpY2FsIGRyaXZlIG51bWJlciBtdXN0IGJlIHJlYWQgZnJvbSB0aGUKKwkJCQkgICBtYXAgKi8KKwlhdG9taWNfdAlxdWllc2NlbnQ7CS8qIGEgc3RhZ2UgcmVhY2hlZCB3aGVuIGRlbGV0ZSBsb2dpY2FsCisJCQkJCSAgIGRyaXZlIG5lZWRzIHRvIGJlIGRvbmUuIFN0b3AKKwkJCQkJICAgc2VuZGluZyByZXF1ZXN0cyB0byB0aGUgaGJhIHRpbGwKKwkJCQkJICAgZGVsZXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQgKi8KKwlzcGlubG9ja190CWxvY2s7CisKKwl1OAlsb2dkcnZfY2hhbltNQVhfQ0hBTk5FTFMrTlZJUlRfQ0hBTl07IC8qIGxvZ2ljYWwgZHJpdmUgYXJlIG9uCisJCQkJCQkJd2hhdCBjaGFubmVscy4gKi8KKwlpbnQJbWVnYV9jaF9jbGFzczsKKworCXU4CXNnbGVuOwkvKiBmL3cgc3VwcG9ydGVkIHNjYXR0ZXItZ2F0aGVyIGxpc3QgbGVuZ3RoICovCisKKwlzY2JfdAkJCWludF9zY2I7CisJU2NzaV9DbW5kCQlpbnRfc2NtZDsKKwlzdHJ1Y3Qgc2VtYXBob3JlCWludF9tdHg7CS8qIFRvIHN5bmNocm9uaXplIHRoZSBpbnRlcm5hbAorCQkJCQkJY29tbWFuZHMgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAlpbnRfd2FpdHE7CS8qIHdhaXQgcXVldWUgZm9yIGludGVybmFsCisJCQkJCQkgY21kcyAqLworCisJaW50CWhhc19jbHVzdGVyOwkvKiBjbHVzdGVyIHN1cHBvcnQgb24gdGhpcyBIQkEgKi8KK31hZGFwdGVyX3Q7CisKKworc3RydWN0IG1lZ2FfaGJhcyB7CisJaW50IGlzX2Jpb3NfZW5hYmxlZDsKKwlhZGFwdGVyX3QgKmhvc3RkYXRhX2FkZHI7Cit9OworCisKKy8qCisgKiBGb3Igc3RhdGUgZmxhZy4gRG8gbm90IHVzZSBMU0IoOCBiaXRzKSB3aGljaCBhcmUKKyAqIHJlc2VydmVkIGZvciBzdG9yaW5nIGluZm8gYWJvdXQgY2hhbm5lbHMuCisgKi8KKyNkZWZpbmUgSU5fQUJPUlQJMHg4MDAwMDAwMEwKKyNkZWZpbmUgSU5fUkVTRVQJMHg0MDAwMDAwMEwKKyNkZWZpbmUgQk9BUkRfTUVNTUFQCTB4MjAwMDAwMDBMCisjZGVmaW5lIEJPQVJEX0lPTUFQCTB4MTAwMDAwMDBMCisjZGVmaW5lIEJPQVJEXzQwTEQgICAJMHgwODAwMDAwMEwKKyNkZWZpbmUgQk9BUkRfNjRCSVQJMHgwNDAwMDAwMEwKKworI2RlZmluZSBJTlRSX1ZBTElECQkJMHg0MAorCisjZGVmaW5lIFBDSV9DT05GX0FNSVNJRwkJCTB4YTAKKyNkZWZpbmUgUENJX0NPTkZfQU1JU0lHNjQJCTB4YTQKKworCisjZGVmaW5lIE1FR0FfRE1BX1RZUEVfTk9ORQkJMHhGRkZGCisjZGVmaW5lIE1FR0FfQlVMS19EQVRBCQkJMHgwMDAxCisjZGVmaW5lIE1FR0FfU0dMSVNUCQkJMHgwMDAyCisKKy8qCisgKiBsb2Nrc2NvcGUgZGVmaW5pdGlvbnMsIGNhbGxlcnMgY2FuIHNwZWNpZnkgdGhlIGxvY2sgc2NvcGUgd2l0aCB0aGlzIGRhdGEKKyAqIHR5cGUuIExPQ0tfSU5UIHdvdWxkIG1lYW4gdGhlIGNhbGxlciBoYXMgbm90IGFjcXVpcmVkIHRoZSBsb2NrIGJlZm9yZQorICogbWFraW5nIHRoZSBjYWxsIGFuZCBMT0NLX0VYVCB3b3VsZCBtZWFuIG90aGVyd2lzZS4KKyAqLwordHlwZWRlZiBlbnVtIHsgTE9DS19JTlQsIExPQ0tfRVhUIH0gbG9ja3Njb3BlX3Q7CisKKy8qCisgKiBQYXJhbWV0ZXJzIGZvciB0aGUgaW8tbWFwcGVkIGNvbnRyb2xsZXJzCisgKi8KKworLyogSS9PIFBvcnQgb2Zmc2V0cyAqLworI2RlZmluZSBDTURfUE9SVAkgCTB4MDAKKyNkZWZpbmUgQUNLX1BPUlQJIAkweDAwCisjZGVmaW5lIFRPR0dMRV9QT1JUCQkweDAxCisjZGVmaW5lIElOVFJfUE9SVAkgIAkweDBhCisKKyNkZWZpbmUgTUJPWF9CVVNZX1BPUlQgICAgIAkweDAwCisjZGVmaW5lIE1CT1hfUE9SVDAJIAkweDA0CisjZGVmaW5lIE1CT1hfUE9SVDEJIAkweDA1CisjZGVmaW5lIE1CT1hfUE9SVDIJIAkweDA2CisjZGVmaW5lIE1CT1hfUE9SVDMJIAkweDA3CisjZGVmaW5lIEVOQUJMRV9NQk9YX1JFR0lPTiAJMHgwQgorCisvKiBJL08gUG9ydCBWYWx1ZXMgKi8KKyNkZWZpbmUgSVNTVUVfQllURQkgCTB4MTAKKyNkZWZpbmUgQUNLX0JZVEUJICAgCTB4MDgKKyNkZWZpbmUgRU5BQkxFX0lOVFJfQllURSAgIAkweGMwCisjZGVmaW5lIERJU0FCTEVfSU5UUl9CWVRFICAJMHgwMAorI2RlZmluZSBWQUxJRF9JTlRSX0JZVEUgICAgCTB4NDAKKyNkZWZpbmUgTUJPWF9CVVNZX0JZVEUgICAgIAkweDEwCisjZGVmaW5lIEVOQUJMRV9NQk9YX0JZVEUgICAJMHgwMAorCisKKy8qIFNldHVwIHNvbWUgcG9ydCBtYWNyb3MgaGVyZSAqLworI2RlZmluZSBpc3N1ZV9jb21tYW5kKGFkYXB0ZXIpCVwKKwkJb3V0Yl9wKElTU1VFX0JZVEUsIChhZGFwdGVyKS0+YmFzZSArIENNRF9QT1JUKQorCisjZGVmaW5lIGlycV9zdGF0ZShhZGFwdGVyKQlpbmJfcCgoYWRhcHRlciktPmJhc2UgKyBJTlRSX1BPUlQpCisKKyNkZWZpbmUgc2V0X2lycV9zdGF0ZShhZGFwdGVyLCB2YWx1ZSkJXAorCQlvdXRiX3AoKHZhbHVlKSwgKGFkYXB0ZXIpLT5iYXNlICsgSU5UUl9QT1JUKQorCisjZGVmaW5lIGlycV9hY2soYWRhcHRlcikJXAorCQlvdXRiX3AoQUNLX0JZVEUsIChhZGFwdGVyKS0+YmFzZSArIEFDS19QT1JUKQorCisjZGVmaW5lIGlycV9lbmFibGUoYWRhcHRlcikJXAorCW91dGJfcChFTkFCTEVfSU5UUl9CWVRFLCAoYWRhcHRlciktPmJhc2UgKyBUT0dHTEVfUE9SVCkKKworI2RlZmluZSBpcnFfZGlzYWJsZShhZGFwdGVyKQlcCisJb3V0Yl9wKERJU0FCTEVfSU5UUl9CWVRFLCAoYWRhcHRlciktPmJhc2UgKyBUT0dHTEVfUE9SVCkKKworCisvKgorICogVGhpcyBpcyBvdXIgU1lTREVQIGFyZWEuIEFsbCBrZXJuZWwgc3BlY2lmaWMgZGV0YWlsIHNob3VsZCBiZSBwbGFjZWQgaGVyZSAtCisgKiBhcyBtdWNoIGFzIHBvc3NpYmxlCisgKi8KKworLyoKKyAqIEVuZCBvZiBTWVNERVAgYXJlYQorICovCisKK2NvbnN0IGNoYXIgKm1lZ2FyYWlkX2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKik7CisKK3N0YXRpYyBpbnQgbWVnYV9xdWVyeV9hZGFwdGVyKGFkYXB0ZXJfdCAqKTsKK3N0YXRpYyBpbnQgaXNzdWVfc2NiKGFkYXB0ZXJfdCAqLCBzY2JfdCAqKTsKK3N0YXRpYyBpbnQgbWVnYV9zZXR1cF9tYWlsYm94KGFkYXB0ZXJfdCAqKTsKKworc3RhdGljIGludCBtZWdhcmFpZF9xdWV1ZSAoU2NzaV9DbW5kICosIHZvaWQgKCopKFNjc2lfQ21uZCAqKSk7CitzdGF0aWMgc2NiX3QgKiBtZWdhX2J1aWxkX2NtZChhZGFwdGVyX3QgKiwgU2NzaV9DbW5kICosIGludCAqKTsKK3N0YXRpYyB2b2lkIF9fbWVnYV9ydW5wZW5kcShhZGFwdGVyX3QgKik7CitzdGF0aWMgaW50IGlzc3VlX3NjYl9ibG9jayhhZGFwdGVyX3QgKiwgdV9jaGFyICopOworCitzdGF0aWMgaXJxcmV0dXJuX3QgbWVnYXJhaWRfaXNyX21lbW1hcHBlZChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgaXJxcmV0dXJuX3QgbWVnYXJhaWRfaXNyX2lvbWFwcGVkKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKKworc3RhdGljIHZvaWQgbWVnYV9mcmVlX3NjYihhZGFwdGVyX3QgKiwgc2NiX3QgKik7CisKK3N0YXRpYyBpbnQgbWVnYXJhaWRfYWJvcnQoU2NzaV9DbW5kICopOworc3RhdGljIGludCBtZWdhcmFpZF9yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IG1lZ2FyYWlkX2Fib3J0X2FuZF9yZXNldChhZGFwdGVyX3QgKiwgU2NzaV9DbW5kICosIGludCk7CitzdGF0aWMgaW50IG1lZ2FyYWlkX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLAorCQlzZWN0b3JfdCwgaW50IFtdKTsKK3N0YXRpYyBpbnQgbWVnYV9wcmludF9pbnF1aXJ5KGNoYXIgKiwgY2hhciAqKTsKKworc3RhdGljIGludCBtZWdhX2J1aWxkX3NnbGlzdCAoYWRhcHRlcl90ICphZGFwdGVyLCBzY2JfdCAqc2NiLAorCQkJICAgICAgdTMyICpidWZmZXIsIHUzMiAqbGVuZ3RoKTsKK3N0YXRpYyBpbnQgX19tZWdhX2J1c3l3YWl0X21ib3ggKGFkYXB0ZXJfdCAqKTsKK3N0YXRpYyB2b2lkIG1lZ2FfcnVuZG9uZXEgKGFkYXB0ZXJfdCAqKTsKK3N0YXRpYyB2b2lkIG1lZ2FfY21kX2RvbmUoYWRhcHRlcl90ICosIHU4IFtdLCBpbnQsIGludCk7CitzdGF0aWMgaW5saW5lIHZvaWQgbWVnYV9mcmVlX3NnbCAoYWRhcHRlcl90ICphZGFwdGVyKTsKK3N0YXRpYyB2b2lkIG1lZ2FfOF90b180MGxkIChtcmFpZF9pbnF1aXJ5ICppbnF1aXJ5LAorCQltZWdhX2lucXVpcnkzICplbnF1aXJ5MywgbWVnYV9wcm9kdWN0X2luZm8gKik7CisKK3N0YXRpYyBpbnQgbWVnYWRldl9vcGVuIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgaW50IG1lZ2FkZXZfaW9jdGwgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsCisJCXVuc2lnbmVkIGxvbmcpOworc3RhdGljIGludCBtZWdhX21fdG9fbih2b2lkIF9fdXNlciAqLCBuaXRpb2N0bF90ICopOworc3RhdGljIGludCBtZWdhX25fdG9fbSh2b2lkIF9fdXNlciAqLCBtZWdhY21kX3QgKik7CisKK3N0YXRpYyBpbnQgbWVnYV9pbml0X3NjYiAoYWRhcHRlcl90ICopOworCitzdGF0aWMgaW50IG1lZ2FfaXNfYmlvc19lbmFibGVkIChhZGFwdGVyX3QgKik7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIHZvaWQgbWVnYV9jcmVhdGVfcHJvY19lbnRyeShpbnQsIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKTsKK3N0YXRpYyBpbnQgcHJvY19yZWFkX2NvbmZpZyhjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCAqLCB2b2lkICopOworc3RhdGljIGludCBwcm9jX3JlYWRfc3RhdChjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCAqLCB2b2lkICopOworc3RhdGljIGludCBwcm9jX3JlYWRfbWJveChjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCAqLCB2b2lkICopOworc3RhdGljIGludCBwcm9jX3JlYnVpbGRfcmF0ZShjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCAqLCB2b2lkICopOworc3RhdGljIGludCBwcm9jX2JhdHRlcnkoY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgcHJvY19wZHJ2X2NoMChjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCAqLCB2b2lkICopOworc3RhdGljIGludCBwcm9jX3BkcnZfY2gxKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50ICosIHZvaWQgKik7CitzdGF0aWMgaW50IHByb2NfcGRydl9jaDIoY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgcHJvY19wZHJ2X2NoMyhjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCAqLCB2b2lkICopOworc3RhdGljIGludCBwcm9jX3BkcnYoYWRhcHRlcl90ICosIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgcHJvY19yZHJ2XzEwKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50ICosIHZvaWQgKik7CitzdGF0aWMgaW50IHByb2NfcmRydl8yMChjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCAqLCB2b2lkICopOworc3RhdGljIGludCBwcm9jX3JkcnZfMzAoY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgcHJvY19yZHJ2XzQwKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50ICosIHZvaWQgKik7CitzdGF0aWMgaW50IHByb2NfcmRydihhZGFwdGVyX3QgKiwgY2hhciAqLCBpbnQsIGludCk7CisjZW5kaWYKKworc3RhdGljIGludCBtZWdhX2FkYXBpbnEoYWRhcHRlcl90ICosIGRtYV9hZGRyX3QpOworc3RhdGljIGludCBtZWdhX2ludGVybmFsX2Rldl9pbnF1aXJ5KGFkYXB0ZXJfdCAqLCB1OCwgdTgsIGRtYV9hZGRyX3QpOworCitzdGF0aWMgaW50IG1lZ2Ffc3VwcG9ydF9leHRfY2RiKGFkYXB0ZXJfdCAqKTsKK3N0YXRpYyBtZWdhX3Bhc3N0aHJ1KiBtZWdhX3ByZXBhcmVfcGFzc3RocnUoYWRhcHRlcl90ICosIHNjYl90ICosCisJCVNjc2lfQ21uZCAqLCBpbnQsIGludCk7CitzdGF0aWMgbWVnYV9leHRfcGFzc3RocnUqIG1lZ2FfcHJlcGFyZV9leHRwYXNzdGhydShhZGFwdGVyX3QgKiwKKwkJc2NiX3QgKiwgU2NzaV9DbW5kICosIGludCwgaW50KTsKK3N0YXRpYyB2b2lkIG1lZ2FfZW51bV9yYWlkX3Njc2koYWRhcHRlcl90ICopOworc3RhdGljIHZvaWQgbWVnYV9nZXRfYm9vdF9kcnYoYWRhcHRlcl90ICopOworc3RhdGljIGludCBtZWdhX3N1cHBvcnRfcmFuZG9tX2RlbChhZGFwdGVyX3QgKik7CitzdGF0aWMgaW50IG1lZ2FfZGVsX2xvZ2RydihhZGFwdGVyX3QgKiwgaW50KTsKK3N0YXRpYyBpbnQgbWVnYV9kb19kZWxfbG9nZHJ2KGFkYXB0ZXJfdCAqLCBpbnQpOworc3RhdGljIHZvaWQgbWVnYV9nZXRfbWF4X3NnbChhZGFwdGVyX3QgKik7CitzdGF0aWMgaW50IG1lZ2FfaW50ZXJuYWxfY29tbWFuZChhZGFwdGVyX3QgKiwgbG9ja3Njb3BlX3QsIG1lZ2FjbWRfdCAqLAorCQltZWdhX3Bhc3N0aHJ1ICopOworc3RhdGljIHZvaWQgbWVnYV9pbnRlcm5hbF9kb25lKFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgbWVnYV9zdXBwb3J0X2NsdXN0ZXIoYWRhcHRlcl90ICopOworI2VuZGlmCisKKy8qIHZpOiBzZXQgdHM9OCBzdz04IHR3PTc4OiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL0tjb25maWcubWVnYXJhaWQgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvS2NvbmZpZy5tZWdhcmFpZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTdkNTkxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL0tjb25maWcubWVnYXJhaWQKQEAgLTAsMCArMSw3OCBAQAorY29uZmlnIE1FR0FSQUlEX05FV0dFTgorCWJvb2wgIkxTSSBMb2dpYyBOZXcgR2VuZXJhdGlvbiBSQUlEIERldmljZSBEcml2ZXJzIgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kKKwloZWxwCisJTFNJIExvZ2ljIFJBSUQgRGV2aWNlIERyaXZlcnMKKworY29uZmlnIE1FR0FSQUlEX01NCisJdHJpc3RhdGUgIkxTSSBMb2dpYyBNYW5hZ2VtZW50IE1vZHVsZSAoTmV3IERyaXZlcikiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSSAmJiBNRUdBUkFJRF9ORVdHRU4KKwloZWxwCisJTWFuYWdlbWVudCBNb2R1bGUgcHJvdmlkZXMgaW9jdGwsIHN5c2ZzIHN1cHBvcnQgZm9yIExTSSBMb2dpYworCVJBSUQgY29udHJvbGxlcnMuCisJVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1lZ2FyYWlkX21tCisKKworY29uZmlnIE1FR0FSQUlEX01BSUxCT1gKKwl0cmlzdGF0ZSAiTFNJIExvZ2ljIE1lZ2FSQUlEIERyaXZlciAoTmV3IERyaXZlcikiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSSAmJiBNRUdBUkFJRF9NTQorCWhlbHAKKwlMaXN0IG9mIHN1cHBvcnRlZCBjb250cm9sbGVycworCisJT0VNCVByb2R1Y3QgTmFtZQkJVklEIDpESUQgOlNWSUQ6U1NJRAorCS0tLQktLS0tLS0tLS0tLS0JCS0tLS0gLS0tLSAtLS0tIC0tLS0KKwlEZWxsIFBFUkMzL1FDCQkJMTAxRToxOTYwOjEwMjg6MDQ3MQorCURlbGwgUEVSQzMvREMJCQkxMDFFOjE5NjA6MTAyODowNDkzCisJRGVsbCBQRVJDMy9TQwkJCTEwMUU6MTk2MDoxMDI4OjA0NzUKKwlEZWxsIFBFUkMzL0RpCQkJMTAyODowMDBFOjEwMjg6MDEyMworCURlbGwgUEVSQzQvU0MJCQkxMDAwOjE5NjA6MTAyODowNTIwCisJRGVsbCBQRVJDNC9EQwkJCTEwMDA6MTk2MDoxMDI4OjA1MTgKKwlEZWxsIFBFUkM0L1FDCQkJMTAwMDowNDA3OjEwMjg6MDUzMQorCURlbGwgUEVSQzQvRGkJCQkxMDI4OjAwMEY6MTAyODowMTRBCisJRGVsbCBQRVJDIDRlL1NpCQkJMTAyODowMDEzOjEwMjg6MDE2YworCURlbGwgUEVSQyA0ZS9EaQkJCTEwMjg6MDAxMzoxMDI4OjAxNmQKKwlEZWxsIFBFUkMgNGUvRGkJCQkxMDI4OjAwMTM6MTAyODowMTZlCisJRGVsbCBQRVJDIDRlL0RpCQkJMTAyODowMDEzOjEwMjg6MDE2ZgorCURlbGwgUEVSQyA0ZS9EaQkJCTEwMjg6MDAxMzoxMDI4OjAxNzAKKwlEZWxsIFBFUkMgNGUvREMJCQkxMDAwOjA0MDg6MTAyODowMDAyCisJRGVsbCBQRVJDIDRlL1NDCQkJMTAwMDowNDA4OjEwMjg6MDAwMQorCUxTSSBNZWdhUkFJRCBTQ1NJIDMyMC0wCQkxMDAwOjE5NjA6MTAwMDpBNTIwCisJTFNJIE1lZ2FSQUlEIFNDU0kgMzIwLTEJCTEwMDA6MTk2MDoxMDAwOjA1MjAKKwlMU0kgTWVnYVJBSUQgU0NTSSAzMjAtMgkJMTAwMDoxOTYwOjEwMDA6MDUxOAorCUxTSSBNZWdhUkFJRCBTQ1NJIDMyMC0wWAkxMDAwOjA0MDc6MTAwMDowNTMwCisJTFNJIE1lZ2FSQUlEIFNDU0kgMzIwLTJYCTEwMDA6MDQwNzoxMDAwOjA1MzIKKwlMU0kgTWVnYVJBSUQgU0NTSSAzMjAtNFgJMTAwMDowNDA3OjEwMDA6MDUzMQorCUxTSSBNZWdhUkFJRCBTQ1NJIDMyMC0xRQkxMDAwOjA0MDg6MTAwMDowMDAxCisJTFNJIE1lZ2FSQUlEIFNDU0kgMzIwLTJFCTEwMDA6MDQwODoxMDAwOjAwMDIKKwlMU0kgTWVnYVJBSUQgU0FUQSAxNTAtNAkJMTAwMDoxOTYwOjEwMDA6NDUyMworCUxTSSBNZWdhUkFJRCBTQVRBIDE1MC02CQkxMDAwOjE5NjA6MTAwMDowNTIzCisJTFNJIE1lZ2FSQUlEIFNBVEEgMzAwLTRYCTEwMDA6MDQwOToxMDAwOjMwMDQKKwlMU0kgTWVnYVJBSUQgU0FUQSAzMDAtOFgJMTAwMDowNDA5OjEwMDA6MzAwOAorCUlOVEVMIFJBSUQgQ29udHJvbGxlciBTUkNVNDJYCTEwMDA6MDQwNzo4MDg2OjA1MzIKKwlJTlRFTCBSQUlEIENvbnRyb2xsZXIgU1JDUzE2CTEwMDA6MTk2MDo4MDg2OjA1MjMKKwlJTlRFTCBSQUlEIENvbnRyb2xsZXIgU1JDVTQyRQkxMDAwOjA0MDg6ODA4NjowMDAyCisJSU5URUwgUkFJRCBDb250cm9sbGVyIFNSQ1pDUlgJMTAwMDowNDA3OjgwODY6MDUzMAorCUlOVEVMIFJBSUQgQ29udHJvbGxlciBTUkNTMjhYCTEwMDA6MDQwOTo4MDg2OjMwMDgKKwlJTlRFTCBSQUlEIENvbnRyb2xsZXIgU1JPTUJVNDJFCTEwMDA6MDQwODo4MDg2OjM0MzEKKwlJTlRFTCBSQUlEIENvbnRyb2xsZXIgU1JPTUJVNDJFCTEwMDA6MDQwODo4MDg2OjM0OTkKKwlJTlRFTCBSQUlEIENvbnRyb2xsZXIgU1JDVTUxTAkxMDAwOjE5NjA6ODA4NjowNTIwCisJRlNDIE1lZ2FSQUlEIFBDSSBFeHByZXNzIFJPTUIJMTAwMDowNDA4OjE3MzQ6MTA2NQorCUFDRVIgTWVnYVJBSUQgUk9NQi0yRQkJMTAwMDowNDA4OjEwMjU6MDA0RAorCU5FQyBNZWdhUkFJRCBQQ0kgRXhwcmVzcyBST01CCTEwMDA6MDQwODoxMDMzOjgyODcKKworCVRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCW1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtZWdhcmFpZF9tYm94CisKK2lmIE1FR0FSQUlEX05FV0dFTj1uCitjb25maWcgTUVHQVJBSURfTEVHQUNZCisJdHJpc3RhdGUgIkxTSSBMb2dpYyBMZWdhY3kgTWVnYVJBSUQgRHJpdmVyIgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kKKwloZWxwCisJVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIExTSSBNZWdhUkFJRCA0MTgsIDQyOCwgNDM4LCA0NjYsIDc2MiwgNDkwCisJYW5kIDQ2NyBTQ1NJIGhvc3QgYWRhcHRlcnMuIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydCB0aGUgYWxsIFUzMjAKKwlSQUlEIGNvbnRyb2xsZXJzCisKKwlUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwltb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWVnYXJhaWQKK2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkOTlmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai0kKENPTkZJR19NRUdBUkFJRF9NTSkJKz0gbWVnYXJhaWRfbW0ubworb2JqLSQoQ09ORklHX01FR0FSQUlEX01BSUxCT1gpCSs9IG1lZ2FyYWlkX21ib3gubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21ib3hfZGVmcy5oIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21ib3hfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNTI4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWJveF9kZWZzLmgKQEAgLTAsMCArMSw3OTAgQEAKKy8qCisgKgorICoJCQlMaW51eCBNZWdhUkFJRCBVbmlmaWVkIGRldmljZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCAgTFNJIExvZ2ljIENvcnBvcmF0aW9uLgorICoKKyAqCSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCSAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCSAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRklMRQkJOiBtYm94X2RlZnMuaAorICoKKyAqLworI2lmbmRlZiBfTVJBSURfTUJPWF9ERUZTX0hfCisjZGVmaW5lIF9NUkFJRF9NQk9YX0RFRlNfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBDb21tYW5kcyBhbmQgc3RhdGVzIGZvciBtYWlsYm94IGJhc2VkIGNvbnRyb2xsZXJzCisgKi8KKworI2RlZmluZSBNQk9YQ01EX0xSRUFECQkweDAxCisjZGVmaW5lIE1CT1hDTURfTFdSSVRFCQkweDAyCisjZGVmaW5lIE1CT1hDTURfUEFTU1RIUlUJMHgwMworI2RlZmluZSBNQk9YQ01EX0FEUEVYVElOUQkweDA0CisjZGVmaW5lIE1CT1hDTURfQURBUFRFUklOUQkweDA1CisjZGVmaW5lIE1CT1hDTURfTFJFQUQ2NAkJMHhBNworI2RlZmluZSBNQk9YQ01EX0xXUklURTY0CTB4QTgKKyNkZWZpbmUgTUJPWENNRF9QQVNTVEhSVTY0CTB4QzMKKyNkZWZpbmUgTUJPWENNRF9FWFRQVEhSVQkweEUzCisKKyNkZWZpbmUgTUFJTl9NSVNDX09QQ09ERQkweEE0CisjZGVmaW5lIEdFVF9NQVhfU0dfU1VQUE9SVAkweDAxCisjZGVmaW5lIFNVUFBPUlRfRVhUX0NEQgkJMHgxNgorCisjZGVmaW5lIEZDX05FV19DT05GSUcJCTB4QTEKKyNkZWZpbmUgTkNfU1VCT1BfUFJPRFVDVF9JTkZPCTB4MEUKKyNkZWZpbmUgTkNfU1VCT1BfRU5RVUlSWTMJMHgwRgorI2RlZmluZSBFTlEzX0dFVF9TT0xJQ0lURURfRlVMTAkweDAyCisjZGVmaW5lIE9QX0RDTURfUkVBRF9DT05GSUcJMHgwNAorI2RlZmluZSBORVdfUkVBRF9DT05GSUdfOExECTB4NjcKKyNkZWZpbmUgUkVBRF9DT05GSUdfOExECQkweDA3CisjZGVmaW5lIEZMVVNIX0FEQVBURVIJCTB4MEEKKyNkZWZpbmUgRkxVU0hfU1lTVEVNCQkweEZFCisKKy8qCisgKiBDb21tYW5kIGZvciByYW5kb20gZGVsZXRpb24gb2YgbG9naWNhbCBkcml2ZXMKKyAqLworI2RlZmluZQlGQ19ERUxfTE9HRFJWCQkweEE0CisjZGVmaW5lCU9QX1NVUF9ERUxfTE9HRFJWCTB4MkEKKyNkZWZpbmUgT1BfR0VUX0xESURfTUFQCQkweDE4CisjZGVmaW5lIE9QX0RFTF9MT0dEUlYJCTB4MUMKKworLyoKKyAqIEJJT1MgY29tbWFuZHMKKyAqLworI2RlZmluZSBJU19CSU9TX0VOQUJMRUQJCTB4NjIKKyNkZWZpbmUgR0VUX0JJT1MJCTB4MDEKKyNkZWZpbmUgQ0hOTF9DTEFTUwkJMHhBOQorI2RlZmluZSBHRVRfQ0hOTF9DTEFTUwkJMHgwMAorI2RlZmluZSBTRVRfQ0hOTF9DTEFTUwkJMHgwMQorI2RlZmluZSBDSF9SQUlECQkJMHgwMQorI2RlZmluZSBDSF9TQ1NJCQkJMHgwMAorI2RlZmluZSBCSU9TX1BWVF9EQVRBCQkweDQwCisjZGVmaW5lIEdFVF9CSU9TX1BWVF9EQVRBCTB4MDAKKworCisvKgorICogQ29tbWFuZHMgdG8gc3VwcG9ydCBjbHVzdGVyaW5nCisgKi8KKyNkZWZpbmUgR0VUX1RBUkdFVF9JRAkJMHg3RAorI2RlZmluZSBDTFVTVEVSX09QCQkweDcwCisjZGVmaW5lIEdFVF9DTFVTVEVSX01PREUJMHgwMgorI2RlZmluZSBDTFVTVEVSX0NNRAkJMHg2RQorI2RlZmluZSBSRVNFUlZFX0xECQkweDAxCisjZGVmaW5lIFJFTEVBU0VfTEQJCTB4MDIKKyNkZWZpbmUgUkVTRVRfUkVTRVJWQVRJT05TCTB4MDMKKyNkZWZpbmUgUkVTRVJWQVRJT05fU1RBVFVTCTB4MDQKKyNkZWZpbmUgUkVTRVJWRV9QRAkJMHgwNQorI2RlZmluZSBSRUxFQVNFX1BECQkweDA2CisKKworLyoKKyAqIE1vZHVsZSBiYXR0ZXJ5IHN0YXR1cworICovCisjZGVmaW5lIEJBVFRFUllfTU9EVUxFX01JU1NJTkcJCTB4MDEKKyNkZWZpbmUgQkFUVEVSWV9MT1dfVk9MVEFHRQkJMHgwMgorI2RlZmluZSBCQVRURVJZX1RFTVBfSElHSAkJMHgwNAorI2RlZmluZSBCQVRURVJZX1BBQ0tfTUlTU0lORwkJMHgwOAorI2RlZmluZSBCQVRURVJZX0NIQVJHRV9NQVNLCQkweDMwCisjZGVmaW5lIEJBVFRFUllfQ0hBUkdFX0RPTkUJCTB4MDAKKyNkZWZpbmUgQkFUVEVSWV9DSEFSR0VfSU5QUk9HCQkweDEwCisjZGVmaW5lIEJBVFRFUllfQ0hBUkdFX0ZBSUwJCTB4MjAKKyNkZWZpbmUgQkFUVEVSWV9DWUNMRVNfRVhDRUVERUQJCTB4NDAKKworLyoKKyAqIFBoeXNpY2FsIGRyaXZlIHN0YXRlcy4KKyAqLworI2RlZmluZSBQRFJWX1VOQ05GCTAKKyNkZWZpbmUgUERSVl9PTkxJTkUJMworI2RlZmluZSBQRFJWX0ZBSUxFRAk0CisjZGVmaW5lIFBEUlZfUkJMRAk1CisjZGVmaW5lIFBEUlZfSE9UU1BBUkUJNgorCisKKy8qCisgKiBSYWlkIGxvZ2ljYWwgZHJpdmUgc3RhdGVzLgorICovCisjZGVmaW5lIFJEUlZfT0ZGTElORQkwCisjZGVmaW5lIFJEUlZfREVHUkFERUQJMQorI2RlZmluZSBSRFJWX09QVElNQUwJMgorI2RlZmluZSBSRFJWX0RFTEVURUQJMworCisvKgorICogUmVhZCwgd3JpdGUgYW5kIGNhY2hlIHBvbGljaWVzCisgKi8KKyNkZWZpbmUgTk9fUkVBRF9BSEVBRAkJMAorI2RlZmluZSBSRUFEX0FIRUFECQkxCisjZGVmaW5lIEFEQVBfUkVBRF9BSEVBRAkJMgorI2RlZmluZSBXUk1PREVfV1JJVEVfVEhSVQkwCisjZGVmaW5lIFdSTU9ERV9XUklURV9CQUNLCTEKKyNkZWZpbmUgQ0FDSEVEX0lPCQkwCisjZGVmaW5lIERJUkVDVF9JTwkJMQorCisjZGVmaW5lIE1BWF9MT0dJQ0FMX0RSSVZFU184TEQJCTgKKyNkZWZpbmUgTUFYX0xPR0lDQUxfRFJJVkVTXzQwTEQJCTQwCisjZGVmaW5lIEZDX01BWF9QSFlTSUNBTF9ERVZJQ0VTCQkyNTYKKyNkZWZpbmUgTUFYX01CT1hfQ0hBTk5FTFMJCTUKKyNkZWZpbmUgTUFYX01CT1hfVEFSR0VUCQkJMTUKKyNkZWZpbmUgTUJPWF9NQVhfUEhZU0lDQUxfRFJJVkVTCU1BWF9NQk9YX0NIQU5ORUxTKk1BWF9NQk9YX1RBUkdFVAorI2RlZmluZSBNQVhfUk9XX1NJWkVfNDBMRAkJMzIKKyNkZWZpbmUgTUFYX1JPV19TSVpFXzhMRAkJOAorI2RlZmluZSBTUEFOX0RFUFRIXzhfU1BBTlMJCTgKKyNkZWZpbmUgU1BBTl9ERVBUSF80X1NQQU5TCQk0CisjZGVmaW5lIE1BWF9SRVFfU0VOU0VfTEVOCQkweDIwCisKKworCisvKioKKyAqIHN0cnVjdCBtYm94X3QgLSBEcml2ZXIgYW5kIGYvdyBoYW5kc2hha2Ugc3RydWN0dXJlLgorICogQGNtZAkJOiBmaXJtd2FyZSBjb21tYW5kCisgKiBAY21kaWQJOiBjb21tYW5kIGlkCisgKiBAbnVtc2VjdG9ycwk6IG51bWJlciBvZiBzZWN0b3JzIHRvIGJlIHRyYW5zZmVycmVkCisgKiBAbGJhCQk6IExvZ2ljYWwgQmxvY2sgQWRkcmVzcyBvbiBMRAorICogQHhmZXJhZGRyCTogRE1BIGFkZHJlc3MgZm9yIGRhdGEgdHJhbnNmZXIKKyAqIEBsb2dkcnYJOiBsb2dpY2FsIGRyaXZlIG51bWJlcgorICogQG51bXNnZQk6IG51bWJlciBvZiBzY2F0dGVyIGdhdGhlciBlbGVtZW50cyBpbiBzZyBsaXN0CisgKiBAcmVzdmQJOiByZXNlcnZlZAorICogQGJ1c3kJOiBmL3cgYnVzeSwgbXVzdCB3YWl0IHRvIGlzc3VlIG1vcmUgY29tbWFuZHMuCisgKiBAbnVtc3RhdHVzCTogbnVtYmVyIG9mIGNvbW1hbmRzIGNvbXBsZXRlZC4KKyAqIEBzdGF0dXMJOiBzdGF0dXMgb2YgdGhlIGNvbW1hbmRzIGNvbXBsZXRlZAorICogQGNvbXBsZXRlZAk6IGFycmF5IG9mIGNvbXBsZXRlZCBjb21tYW5kIGlkcy4KKyAqIEBwb2xsCTogcG9sbCBhbmQgYWNrIHNlcXVlbmNlCisgKiBAYWNrCQk6IHBvbGwgYW5kIGFjayBzZXF1ZW5jZQorICoKKyAqIFRoZSBjZW50cmFsIGhhbmRzaGFrZSBzdHJ1Y3R1cmUgYmV0d2VlbiB0aGUgZHJpdmVyIGFuZCB0aGUgZmlybXdhcmUuIFRoaXMKKyAqIHN0cnVjdHVyZSBtdXN0IGJlIGFsbG9jYXRlZCBieSB0aGUgZHJpdmVyIGFuZCBhbGlnbmVkIGF0IDgtYnl0ZSBib3VuZGFyeS4KKyAqLworI2RlZmluZSBNQk9YX01BWF9GSVJNV0FSRV9TVEFUVVMJNDYKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90CQljbWQ7CisJdWludDhfdAkJY21kaWQ7CisJdWludDE2X3QJbnVtc2VjdG9yczsKKwl1aW50MzJfdAlsYmE7CisJdWludDMyX3QJeGZlcmFkZHI7CisJdWludDhfdAkJbG9nZHJ2OworCXVpbnQ4X3QJCW51bXNnZTsKKwl1aW50OF90CQlyZXN2ZDsKKwl1aW50OF90CQlidXN5OworCXVpbnQ4X3QJCW51bXN0YXR1czsKKwl1aW50OF90CQlzdGF0dXM7CisJdWludDhfdAkJY29tcGxldGVkW01CT1hfTUFYX0ZJUk1XQVJFX1NUQVRVU107CisJdWludDhfdAkJcG9sbDsKKwl1aW50OF90CQlhY2s7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtYm94X3Q7CisKKworLyoqCisgKiBtYm94NjRfdCAtIDY0LWJpdCBleHRlbnNpb24gZm9yIHRoZSBtYWlsYm94CisgKiBAc2VnbWVudF9sbwk6IHRoZSBsb3cgMzItYml0cyBvZiB0aGUgYWRkcmVzcyBvZiB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdAorICogQHNlZ21lbnRfaGkJOiB0aGUgdXBwZXIgMzItYml0cyBvZiB0aGUgYWRkcmVzcyBvZiB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdAorICogQG1ib3gJOiAzMi1iaXQgbWFpbGJveCwgd2hvc2UgeGZlcmFkZGVyIGZpZWxkIG11c3QgYmUgc2V0IHRvCisgKgkJMHhGRkZGRkZGRgorICoKKyAqIFRoaXMgaXMgdGhlIGV4dGVuc2lvbiBvZiB0aGUgMzItYml0IG1haWxib3ggdG8gYmUgYWJsZSB0byBwZXJmb3JtIERNQQorICogYmV5b25kIDRHQiBhZGRyZXNzIHJhbmdlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QJeGZlcmFkZHJfbG87CisJdWludDMyX3QJeGZlcmFkZHJfaGk7CisJbWJveF90CQltYm94MzI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtYm94NjRfdDsKKworLyoKKyAqIG1haWxib3ggc3RydWN0dXJlIHVzZWQgZm9yIGludGVybmFsIGNvbW1hbmRzCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1OAljbWQ7CisJdTgJY21kaWQ7CisJdTgJb3Bjb2RlOworCXU4CXN1Ym9wY29kZTsKKwl1MzIJbGJhOworCXUzMgl4ZmVyYWRkcjsKKwl1OAlsb2dkcnY7CisJdTgJcnN2ZFszXTsKKwl1OAludW1zdGF0dXM7CisJdTgJc3RhdHVzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgaW50X21ib3hfdDsKKworLyoqCisgKiBtcmFpZF9wYXNzdGhydV90IC0gcGFzc3RocnUgc3RydWN0dXJlIHRvIGlzc3VlIGNvbW1hbmRzIHRvIHBoeXNpY2FsIGRldmljZXMKKyAqIEB0aW1lb3V0CQk6IGNvbW1hbmQgdGltZW91dCwgMD02c2VjLCAxPTYwc2VjLCAyPTEwbWluLCAzPTNocgorICogQGFycwkJCTogc2V0IGlmIEFSUyByZXF1aXJlZCBhZnRlciBjaGVjayBjb25kaXRpb24KKyAqIEBpc2xvZ2ljYWwJCTogc2V0IGlmIGNvbW1hbmQgbWVhbnQgZm9yIGxvZ2ljYWwgZGV2aWNlcworICogQGxvZ2RydgkJOiBsb2dpY2FsIGRyaXZlIG51bWJlciBpZiBjb21tYW5kIGZvciBMRAorICogQGNoYW5uZWwJCTogQ2hhbm5lbCBvbiB3aGljaCBwaHlzaWNhbCBkZXZpY2UgaXMgbG9jYXRlZAorICogQHRhcmdldAkJOiBTQ1NJIHRhcmdldCBvZiB0aGUgZGV2aWNlCisgKiBAcXVldWV0YWcJCTogdW51c2VkCisgKiBAcXVldWVhY3Rpb24JCTogdW51c2VkCisgKiBAY2RiCQkJOiBTQ1NJIENEQgorICogQGNkYmxlbgkJOiBsZW5ndGggb2YgdGhlIENEQgorICogQHJlcXNlbnNlbGVuCQk6IGFtb3VudCBvZiByZXF1ZXN0IHNlbnNlIGRhdGEgdG8gYmUgcmV0dXJuZWQKKyAqIEByZXFzZW5zZWFyZWEJOiBTZW5zZSBpbmZvcm1hdGlvbiBidWZmZXIKKyAqIEBudW1zZ2UJCTogbnVtYmVyIG9mIHNjYXR0ZXItZ2F0aGVyIGVsZW1lbnRzIGluIHRoZSBzZyBsaXN0CisgKiBAc2NzaXN0YXR1cwkJOiBTQ1NJIHN0YXR1cyBvZiB0aGUgY29tbWFuZCBjb21wbGV0ZWQuCisgKiBAZGF0YXhmZXJhZGRyCTogRE1BIGRhdGEgdHJhbnNmZXIgYWRkcmVzcworICogQGRhdGF4ZmVybGVuCQk6IGFtb3VudCBvZiB0aGUgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QJCXRpbWVvdXQJCTozOworCXVpbnQ4X3QJCWFycwkJOjE7CisJdWludDhfdAkJcmVzZXJ2ZWQJOjM7CisJdWludDhfdAkJaXNsb2dpY2FsCToxOworCXVpbnQ4X3QJCWxvZ2RydjsKKwl1aW50OF90CQljaGFubmVsOworCXVpbnQ4X3QJCXRhcmdldDsKKwl1aW50OF90CQlxdWV1ZXRhZzsKKwl1aW50OF90CQlxdWV1ZWFjdGlvbjsKKwl1aW50OF90CQljZGJbMTBdOworCXVpbnQ4X3QJCWNkYmxlbjsKKwl1aW50OF90CQlyZXFzZW5zZWxlbjsKKwl1aW50OF90CQlyZXFzZW5zZWFyZWFbTUFYX1JFUV9TRU5TRV9MRU5dOworCXVpbnQ4X3QJCW51bXNnZTsKKwl1aW50OF90CQlzY3Npc3RhdHVzOworCXVpbnQzMl90CWRhdGF4ZmVyYWRkcjsKKwl1aW50MzJfdAlkYXRheGZlcmxlbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1yYWlkX3Bhc3N0aHJ1X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKworCXVpbnQzMl90CQlkYXRheGZlcmFkZHJfbG87CisJdWludDMyX3QJCWRhdGF4ZmVyYWRkcl9oaTsKKwltcmFpZF9wYXNzdGhydV90CXB0aHJ1MzI7CisKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1lZ2FfcGFzc3RocnU2NF90OworCisvKioKKyAqIG1yYWlkX2VwYXNzdGhydV90IC0gcGFzc3RocnUgc3RydWN0dXJlIHRvIGlzc3VlIGNvbW1hbmRzIHRvIHBoeXNpY2FsIGRldmljZXMKKyAqIEB0aW1lb3V0CQk6IGNvbW1hbmQgdGltZW91dCwgMD02c2VjLCAxPTYwc2VjLCAyPTEwbWluLCAzPTNocgorICogQGFycwkJCTogc2V0IGlmIEFSUyByZXF1aXJlZCBhZnRlciBjaGVjayBjb25kaXRpb24KKyAqIEByc3ZkMQkJOiByZXNlcnZlZCBmaWVsZAorICogQGNkX3JvbQkJOiAoPykKKyAqIEByc3ZkMgkJOiByZXNlcnZlZCBmaWVsZAorICogQGlzbG9naWNhbAkJOiBzZXQgaWYgY29tbWFuZCBtZWFudCBmb3IgbG9naWNhbCBkZXZpY2VzCisgKiBAbG9nZHJ2CQk6IGxvZ2ljYWwgZHJpdmUgbnVtYmVyIGlmIGNvbW1hbmQgZm9yIExECisgKiBAY2hhbm5lbAkJOiBDaGFubmVsIG9uIHdoaWNoIHBoeXNpY2FsIGRldmljZSBpcyBsb2NhdGVkCisgKiBAdGFyZ2V0CQk6IFNDU0kgdGFyZ2V0IG9mIHRoZSBkZXZpY2UKKyAqIEBxdWV1ZXRhZwkJOiB1bnVzZWQKKyAqIEBxdWV1ZWFjdGlvbgkJOiB1bnVzZWQKKyAqIEBjZGJsZW4JCTogbGVuZ3RoIG9mIHRoZSBDREIKKyAqIEByc3ZkMwkJOiByZXNlcnZlZCBmaWVsZAorICogQGNkYgkJCTogU0NTSSBDREIKKyAqIEBudW1zZ2UJCTogbnVtYmVyIG9mIHNjYXR0ZXItZ2F0aGVyIGVsZW1lbnRzIGluIHRoZSBzZyBsaXN0CisgKiBAc3RhdHVzCQk6IFNDU0kgc3RhdHVzIG9mIHRoZSBjb21tYW5kIGNvbXBsZXRlZC4KKyAqIEByZXFzZW5zZWxlbgkJOiBhbW91bnQgb2YgcmVxdWVzdCBzZW5zZSBkYXRhIHRvIGJlIHJldHVybmVkCisgKiBAcmVxc2Vuc2VhcmVhCTogU2Vuc2UgaW5mb3JtYXRpb24gYnVmZmVyCisgKiBAcnN2ZDQJCTogcmVzZXJ2ZWQgZmllbGQKKyAqIEBkYXRheGZlcmFkZHIJOiBETUEgZGF0YSB0cmFuc2ZlciBhZGRyZXNzCisgKiBAZGF0YXhmZXJsZW4JCTogYW1vdW50IG9mIHRoZSBkYXRhIHRvIGJlIHRyYW5zZmVycmVkLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdAkJdGltZW91dAkJOjM7CisJdWludDhfdAkJYXJzCQk6MTsKKwl1aW50OF90CQlyc3ZkMQkJOjE7CisJdWludDhfdAkJY2Rfcm9tCQk6MTsKKwl1aW50OF90CQlyc3ZkMgkJOjE7CisJdWludDhfdAkJaXNsb2dpY2FsCToxOworCXVpbnQ4X3QJCWxvZ2RydjsKKwl1aW50OF90CQljaGFubmVsOworCXVpbnQ4X3QJCXRhcmdldDsKKwl1aW50OF90CQlxdWV1ZXRhZzsKKwl1aW50OF90CQlxdWV1ZWFjdGlvbjsKKwl1aW50OF90CQljZGJsZW47CisJdWludDhfdAkJcnN2ZDM7CisJdWludDhfdAkJY2RiWzE2XTsKKwl1aW50OF90CQludW1zZ2U7CisJdWludDhfdAkJc3RhdHVzOworCXVpbnQ4X3QJCXJlcXNlbnNlbGVuOworCXVpbnQ4X3QJCXJlcXNlbnNlYXJlYVtNQVhfUkVRX1NFTlNFX0xFTl07CisJdWludDhfdAkJcnN2ZDQ7CisJdWludDMyX3QJZGF0YXhmZXJhZGRyOworCXVpbnQzMl90CWRhdGF4ZmVybGVuOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbXJhaWRfZXBhc3N0aHJ1X3Q7CisKKworLyoqCisgKiBtcmFpZF9waW5mb190IC0gcHJvZHVjdCBpbmZvLCBzdGF0aWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyb2xsZXIKKyAqIEBkYXRhX3NpemUJCTogY3VycmVudCBzaXplIGluIGJ5dGVzIChub3QgaW5jbHVkaW5nIHJlc3ZkKQorICogQGNvbmZpZ19zaWduYXR1cmUJOiBDdXJyZW50IHZhbHVlIGlzIDB4MDAyODIwMDgKKyAqIEBmd192ZXJzaW9uCQk6IEZpcm13YXJlIHZlcnNpb24KKyAqIEBiaW9zX3ZlcnNpb24JOiB2ZXJzaW9uIG9mIHRoZSBCSU9TCisgKiBAcHJvZHVjdF9uYW1lCTogTmFtZSBnaXZlbiB0byB0aGUgY29udHJvbGxlcgorICogQG1heF9jb21tYW5kcwk6IE1heGltdW0gY29uY3VycmVudCBjb21tYW5kcyBzdXBwb3J0ZWQKKyAqIEBuY2hhbm5lbHMJCTogTnVtYmVyIG9mIFNDU0kgQ2hhbm5lbHMgZGV0ZWN0ZWQKKyAqIEBmY19sb29wX3ByZXNlbnQJOiBOdW1iZXIgb2YgRmlicmUgTG9vcHMgZGV0ZWN0ZWQKKyAqIEBtZW1fdHlwZQkJOiBFRE8sIEZQTSwgU0RSQU0gZXRjCisgKiBAc2lnbmF0dXJlCQk6CisgKiBAZHJhbV9zaXplCQk6IEluIHRlcm1zIG9mIE1CCisgKiBAc3Vic3lzaWQJCTogZGV2aWNlIFBDSSBzdWJzeXN0ZW0gSUQKKyAqIEBzdWJzeXN2aWQJCTogZGV2aWNlIFBDSSBzdWJzeXN0ZW0gdmVuZG9yIElECisgKiBAbm90aWZ5X2NvdW50ZXJzCToKKyAqIEBwYWQxawkJOiAxMzUgKyA4ODkgcmVzdmQgPSAxMDI0IHRvdGFsIHNpemUKKyAqCisgKiBUaGlzIHN0cnVjdHVyZXMgaG9sZHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250cm9sbGVyIHdoaWNoIGlzIG5vdAorICogZXhwZWN0ZWQgdG8gY2hhbmdlIGR5bmFtaWNhbGx5LgorICoKKyAqIFRoZSBjdXJyZW50IHZhbHVlIG9mIGNvbmZpZyBzaWduYXR1cmUgaXMgMHgwMDI4MjAwODoKKyAqIDB4MjggPSBNQVhfTE9HSUNBTF9EUklWRVMsCisgKiAweDIwID0gTnVtYmVyIG9mIHN0cmlwZXMgYW5kCisgKiAweDA4ID0gTnVtYmVyIG9mIHNwYW5zCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdAlkYXRhX3NpemU7CisJdWludDMyX3QJY29uZmlnX3NpZ25hdHVyZTsKKwl1aW50OF90CQlmd192ZXJzaW9uWzE2XTsKKwl1aW50OF90CQliaW9zX3ZlcnNpb25bMTZdOworCXVpbnQ4X3QJCXByb2R1Y3RfbmFtZVs4MF07CisJdWludDhfdAkJbWF4X2NvbW1hbmRzOworCXVpbnQ4X3QJCW5jaGFubmVsczsKKwl1aW50OF90CQlmY19sb29wX3ByZXNlbnQ7CisJdWludDhfdAkJbWVtX3R5cGU7CisJdWludDMyX3QJc2lnbmF0dXJlOworCXVpbnQxNl90CWRyYW1fc2l6ZTsKKwl1aW50MTZfdAlzdWJzeXNpZDsKKwl1aW50MTZfdAlzdWJzeXN2aWQ7CisJdWludDhfdAkJbm90aWZ5X2NvdW50ZXJzOworCXVpbnQ4X3QJCXBhZDFrWzg4OV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtcmFpZF9waW5mb190OworCisKKy8qKgorICogbXJhaWRfbm90aWZ5X3QgLSB0aGUgbm90aWZpY2F0aW9uIHN0cnVjdHVyZQorICogQGdsb2JhbF9jb3VudGVyCQk6IEFueSBjaGFuZ2UgaW5jcmVtZW50cyB0aGlzIGNvdW50ZXIKKyAqIEBwYXJhbV9jb3VudGVyCQk6IEluZGljYXRlcyBhbnkgcGFyYW1zIGNoYW5nZWQKKyAqIEBwYXJhbV9pZAkJCTogUGFyYW0gbW9kaWZpZWQgLSBkZWZpbmVkIGJlbG93CisgKiBAcGFyYW1fdmFsCQkJOiBOZXcgdmFsIG9mIGxhc3QgcGFyYW0gbW9kaWZpZWQKKyAqIEB3cml0ZV9jb25maWdfY291bnRlcgk6IHdyaXRlIGNvbmZpZyBvY2N1cnJlZAorICogQHdyaXRlX2NvbmZpZ19yc3ZkCQk6CisgKiBAbGRydl9vcF9jb3VudGVyCQk6IEluZGljYXRlcyBsZHJ2IG9wIHN0YXJ0ZWQvY29tcGxldGVkCisgKiBAbGRydl9vcGlkCQkJOiBsZHJ2IG51bQorICogQGxkcnZfb3BjbWQJCQk6IGxkcnYgb3BlcmF0aW9uIC0gZGVmaW5lZCBiZWxvdworICogQGxkcnZfb3BzdGF0dXMJCTogc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24KKyAqIEBsZHJ2X3N0YXRlX2NvdW50ZXIJCTogSW5kaWNhdGVzIGNoYW5nZSBvZiBsZHJ2IHN0YXRlCisgKiBAbGRydl9zdGF0ZV9pZAkJOiBsZHJ2IG51bQorICogQGxkcnZfc3RhdGVfbmV3CQk6IE5ldyBzdGF0ZQorICogQGxkcnZfc3RhdGVfb2xkCQk6IG9sZCBzdGF0ZQorICogQHBkcnZfc3RhdGVfY291bnRlcgkJOiBJbmRpY2F0ZXMgY2hhbmdlIG9mIGxkcnYgc3RhdGUKKyAqIEBwZHJ2X3N0YXRlX2lkCQk6IHBkcnYgaWQKKyAqIEBwZHJ2X3N0YXRlX25ldwkJOiBOZXcgc3RhdGUKKyAqIEBwZHJ2X3N0YXRlX29sZAkJOiBvbGQgc3RhdGUKKyAqIEBwZHJ2X2ZtdF9jb3VudGVyCQk6IEluZGljYXRlcyBwZHJ2IGZvcm1hdCBzdGFydGVkL292ZXIKKyAqIEBwZHJ2X2ZtdF9pZAkJCTogcGRydiBpZAorICogQHBkcnZfZm10X3ZhbAkJOiBmb3JtYXQgc3RhcnRlZC9vdmVyCisgKiBAcGRydl9mbXRfcnN2ZAkJOgorICogQHRhcmdfeGZlcl9jb3VudGVyCQk6IEluZGljYXRlcyBTQ1NJLTIgWGZlciByYXRlIGNoYW5nZQorICogQHRhcmdfeGZlcl9pZAkJOiBwZHJ2IElkCisgKiBAdGFyZ194ZmVyX3ZhbAkJOiBuZXcgWGZlciBwYXJhbXMgb2YgbGFzdCBwZHJ2CisgKiBAdGFyZ194ZmVyX3JzdmQJCToKKyAqIEBmY2xvb3BfaWRfY2hnX2NvdW50ZXIJOiBJbmRpY2F0ZXMgbG9vcGlkIGNoYW5nZWQKKyAqIEBmY2xvb3BpZF9wZHJ2aWQJCTogcGRydiBpZAorICogQGZjbG9vcF9pZDAJCQk6IGxvb3BpZCBvbiBmYyBsb29wIDAKKyAqIEBmY2xvb3BfaWQxCQkJOiBsb29waWQgb24gZmMgbG9vcCAxCisgKiBAZmNsb29wX3N0YXRlX2NvdW50ZXIJOiBJbmRpY2F0ZXMgbG9vcCBzdGF0ZSBjaGFuZ2VkCisgKiBAZmNsb29wX3N0YXRlMAkJOiBzdGF0ZSBvZiBmYyBsb29wIDAKKyAqIEBmY2xvb3Bfc3RhdGUxCQk6IHN0YXRlIG9mIGZjIGxvb3AgMQorICogQGZjbG9vcF9zdGF0ZV9yc3ZkCQk6CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdAlnbG9iYWxfY291bnRlcjsKKwl1aW50OF90CQlwYXJhbV9jb3VudGVyOworCXVpbnQ4X3QJCXBhcmFtX2lkOworCXVpbnQxNl90CXBhcmFtX3ZhbDsKKwl1aW50OF90CQl3cml0ZV9jb25maWdfY291bnRlcjsKKwl1aW50OF90CQl3cml0ZV9jb25maWdfcnN2ZFszXTsKKwl1aW50OF90CQlsZHJ2X29wX2NvdW50ZXI7CisJdWludDhfdAkJbGRydl9vcGlkOworCXVpbnQ4X3QJCWxkcnZfb3BjbWQ7CisJdWludDhfdAkJbGRydl9vcHN0YXR1czsKKwl1aW50OF90CQlsZHJ2X3N0YXRlX2NvdW50ZXI7CisJdWludDhfdAkJbGRydl9zdGF0ZV9pZDsKKwl1aW50OF90CQlsZHJ2X3N0YXRlX25ldzsKKwl1aW50OF90CQlsZHJ2X3N0YXRlX29sZDsKKwl1aW50OF90CQlwZHJ2X3N0YXRlX2NvdW50ZXI7CisJdWludDhfdAkJcGRydl9zdGF0ZV9pZDsKKwl1aW50OF90CQlwZHJ2X3N0YXRlX25ldzsKKwl1aW50OF90CQlwZHJ2X3N0YXRlX29sZDsKKwl1aW50OF90CQlwZHJ2X2ZtdF9jb3VudGVyOworCXVpbnQ4X3QJCXBkcnZfZm10X2lkOworCXVpbnQ4X3QJCXBkcnZfZm10X3ZhbDsKKwl1aW50OF90CQlwZHJ2X2ZtdF9yc3ZkOworCXVpbnQ4X3QJCXRhcmdfeGZlcl9jb3VudGVyOworCXVpbnQ4X3QJCXRhcmdfeGZlcl9pZDsKKwl1aW50OF90CQl0YXJnX3hmZXJfdmFsOworCXVpbnQ4X3QJCXRhcmdfeGZlcl9yc3ZkOworCXVpbnQ4X3QJCWZjbG9vcF9pZF9jaGdfY291bnRlcjsKKwl1aW50OF90CQlmY2xvb3BpZF9wZHJ2aWQ7CisJdWludDhfdAkJZmNsb29wX2lkMDsKKwl1aW50OF90CQlmY2xvb3BfaWQxOworCXVpbnQ4X3QJCWZjbG9vcF9zdGF0ZV9jb3VudGVyOworCXVpbnQ4X3QJCWZjbG9vcF9zdGF0ZTA7CisJdWludDhfdAkJZmNsb29wX3N0YXRlMTsKKwl1aW50OF90CQlmY2xvb3Bfc3RhdGVfcnN2ZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1yYWlkX25vdGlmeV90OworCisKKy8qKgorICogbXJhaWRfaW5xdWlyeTNfdCAtIGVucXVpcnkgZm9yIGRldmljZSBpbmZvcm1hdGlvbgorICoKKyAqIEBkYXRhX3NpemUJCTogY3VycmVudCBzaXplIGluIGJ5dGVzIChub3QgaW5jbHVkaW5nIHJlc3ZkKQorICogQG5vdGlmeQkJOgorICogQG5vdGlmeV9yc3ZkCQk6CisgKiBAcmVidWlsZF9yYXRlCTogcmVidWlsZCByYXRlICgwJSAtIDEwMCUpCisgKiBAY2FjaGVfZmx1c2hfaW50CTogY2FjaGUgZmx1c2ggaW50ZXJ2YWwgaW4gc2Vjb25kcworICogQHNlbnNlX2FsZXJ0CQk6CisgKiBAZHJpdmVfaW5zZXJ0X2NvdW50CTogZHJpdmUgaW5zZXJ0aW9uIGNvdW50CisgKiBAYmF0dGVyeV9zdGF0dXMJOgorICogQG51bV9sZHJ2CQk6IG5vLiBvZiBMb2cgRHJpdmVzIGNvbmZpZ3VyZWQKKyAqIEByZWNvbl9zdGF0ZQkJOiBzdGF0ZSBvZiByZWNvbnN0cnVjdAorICogQGxkcnZfb3Bfc3RhdHVzCTogbG9nZHJ2IFN0YXR1cworICogQGxkcnZfc2l6ZQkJOiBzaXplIG9mIGVhY2ggbG9nIGRydgorICogQGxkcnZfcHJvcAkJOgorICogQGxkcnZfc3RhdGUJCTogc3RhdGUgb2YgbG9nIGRyaXZlcworICogQHBkcnZfc3RhdGUJCTogc3RhdGUgb2YgcGh5cyBkcnZzLgorICogQHBkcnZfZm9ybWF0CQk6CisgKiBAdGFyZ194ZmVyCQk6IHBoeXMgZGV2aWNlIHRyYW5zZmVyIHJhdGUKKyAqIEBwYWQxawkJOiA3NjEgKyAyNjNyZXNlcnZlZCA9IDEwMjQgYnl0ZXMgdG90YWwgc2l6ZQorICovCisjZGVmaW5lIE1BWF9OT1RJRllfU0laRQkJMHg4MAorI2RlZmluZSBDVVJfTk9USUZZX1NJWkUJCXNpemVvZihtcmFpZF9ub3RpZnlfdCkKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90CWRhdGFfc2l6ZTsKKworCW1yYWlkX25vdGlmeV90CW5vdGlmeTsKKworCXVpbnQ4X3QJCW5vdGlmeV9yc3ZkW01BWF9OT1RJRllfU0laRSAtIENVUl9OT1RJRllfU0laRV07CisKKwl1aW50OF90CQlyZWJ1aWxkX3JhdGU7CisJdWludDhfdAkJY2FjaGVfZmx1c2hfaW50OworCXVpbnQ4X3QJCXNlbnNlX2FsZXJ0OworCXVpbnQ4X3QJCWRyaXZlX2luc2VydF9jb3VudDsKKworCXVpbnQ4X3QJCWJhdHRlcnlfc3RhdHVzOworCXVpbnQ4X3QJCW51bV9sZHJ2OworCXVpbnQ4X3QJCXJlY29uX3N0YXRlW01BWF9MT0dJQ0FMX0RSSVZFU180MExEIC8gOF07CisJdWludDE2X3QJbGRydl9vcF9zdGF0dXNbTUFYX0xPR0lDQUxfRFJJVkVTXzQwTEQgLyA4XTsKKworCXVpbnQzMl90CWxkcnZfc2l6ZVtNQVhfTE9HSUNBTF9EUklWRVNfNDBMRF07CisJdWludDhfdAkJbGRydl9wcm9wW01BWF9MT0dJQ0FMX0RSSVZFU180MExEXTsKKwl1aW50OF90CQlsZHJ2X3N0YXRlW01BWF9MT0dJQ0FMX0RSSVZFU180MExEXTsKKwl1aW50OF90CQlwZHJ2X3N0YXRlW0ZDX01BWF9QSFlTSUNBTF9ERVZJQ0VTXTsKKwl1aW50MTZfdAlwZHJ2X2Zvcm1hdFtGQ19NQVhfUEhZU0lDQUxfREVWSUNFUyAvIDE2XTsKKworCXVpbnQ4X3QJCXRhcmdfeGZlcls4MF07CisJdWludDhfdAkJcGFkMWtbMjYzXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1yYWlkX2lucXVpcnkzX3Q7CisKKworLyoqCisgKiBtcmFpZF9hZGFwaW5mb190IC0gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFkYXB0ZXIKKyAqIEBtYXhfY29tbWFuZHMJCTogbWF4IGNvbmN1cnJlbnQgY29tbWFuZHMgc3VwcG9ydGVkCisgKiBAcmVidWlsZF9yYXRlCQk6IHJlYnVpbGQgcmF0ZSAtIDAlIHRocnUgMTAwJQorICogQG1heF90YXJnX3Blcl9jaGFuCQk6IG1heCB0YXJnIHBlciBjaGFubmVsCisgKiBAbmNoYW5uZWxzCQkJOiBudW1iZXIgb2YgY2hhbm5lbHMgb24gSEJBCisgKiBAZndfdmVyc2lvbgkJCTogZmlybXdhcmUgdmVyc2lvbgorICogQGFnZV9vZl9mbGFzaAkJOiBudW1iZXIgb2YgdGltZXMgRlcgaGFzIGJlZW4gZmxhc2hlZAorICogQGNoaXBfc2V0X3ZhbHVlCQk6IGNvbnRlbnRzIG9mIDB4QzAwMDA4MzIKKyAqIEBkcmFtX3NpemUJCQk6IGluIE1CCisgKiBAY2FjaGVfZmx1c2hfaW50ZXJ2YWwJOiBpbiBzZWNvbmRzCisgKiBAYmlvc192ZXJzaW9uCQk6CisgKiBAYm9hcmRfdHlwZQkJCToKKyAqIEBzZW5zZV9hbGVydAkJCToKKyAqIEB3cml0ZV9jb25maWdfY291bnQJCTogaW5jcmVhc2Ugd2l0aCBldmVyeSBjb25maWd1cmF0aW9uIGNoYW5nZQorICogQGRyaXZlX2luc2VydGVkX2NvdW50CTogaW5jcmVhc2Ugd2l0aCBldmVyeSBkcml2ZSBpbnNlcnRlZAorICogQGluc2VydGVkX2RyaXZlCQk6IGNoYW5uZWw6SWQgb2YgaW5zZXJ0ZWQgZHJpdmUKKyAqIEBiYXR0ZXJ5X3N0YXR1cwkJOiBiaXQgMDogYmF0dGVyeSBtb2R1bGUgbWlzc2luZworICoJCQkJYml0IDE6IFZCQUQKKyAqCQkJCWJpdCAyOiB0ZW1wcmF0dXJlIGhpZ2gKKyAqCQkJCWJpdCAzOiBiYXR0ZXJ5IHBhY2sgbWlzc2luZworICoJCQkJYml0IDQsNToKKyAqCQkJCQkwMCAtIGNoYXJnZSBjb21wbGV0ZQorICoJCQkJCTAxIC0gZmFzdCBjaGFyZ2UgaW4gcHJvZ3Jlc3MKKyAqCQkJCQkxMCAtIGZhc3QgY2hhcmdlIGZhaWwKKyAqCQkJCQkxMSAtIHVuZGVmaW5lZAorICoJCQkJYml0IDY6IGNvdW50ZXIgPiAxMDAwCisgKgkJCQliaXQgNzogVW5kZWZpbmVkCisgKiBAZGVjX2ZhdWx0X2J1c19pbmZvCQk6CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90CQltYXhfY29tbWFuZHM7CisJdWludDhfdAkJcmVidWlsZF9yYXRlOworCXVpbnQ4X3QJCW1heF90YXJnX3Blcl9jaGFuOworCXVpbnQ4X3QJCW5jaGFubmVsczsKKwl1aW50OF90CQlmd192ZXJzaW9uWzRdOworCXVpbnQxNl90CWFnZV9vZl9mbGFzaDsKKwl1aW50OF90CQljaGlwX3NldF92YWx1ZTsKKwl1aW50OF90CQlkcmFtX3NpemU7CisJdWludDhfdAkJY2FjaGVfZmx1c2hfaW50ZXJ2YWw7CisJdWludDhfdAkJYmlvc192ZXJzaW9uWzRdOworCXVpbnQ4X3QJCWJvYXJkX3R5cGU7CisJdWludDhfdAkJc2Vuc2VfYWxlcnQ7CisJdWludDhfdAkJd3JpdGVfY29uZmlnX2NvdW50OworCXVpbnQ4X3QJCWJhdHRlcnlfc3RhdHVzOworCXVpbnQ4X3QJCWRlY19mYXVsdF9idXNfaW5mbzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1yYWlkX2FkYXBpbmZvX3Q7CisKKworLyoqCisgKiBtcmFpZF9sZHJ2X2luZm9fdCAtIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2dpY2FsIGRyaXZlcworICogQG5sZHJ2CTogTnVtYmVyIG9mIGxvZ2ljYWwgZHJpdmVzIGNvbmZpZ3VyZWQKKyAqIEByc3ZkCToKKyAqIEBzaXplCTogc2l6ZSBvZiBlYWNoIGxvZ2ljYWwgZHJpdmUKKyAqIEBwcm9wCToKKyAqIEBzdGF0ZQk6IHN0YXRlIG9mIGVhY2ggbG9naWNhbCBkcml2ZQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdAkJbmxkcnY7CisJdWludDhfdAkJcnN2ZFszXTsKKwl1aW50MzJfdAlzaXplW01BWF9MT0dJQ0FMX0RSSVZFU184TERdOworCXVpbnQ4X3QJCXByb3BbTUFYX0xPR0lDQUxfRFJJVkVTXzhMRF07CisJdWludDhfdAkJc3RhdGVbTUFYX0xPR0lDQUxfRFJJVkVTXzhMRF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtcmFpZF9sZHJ2X2luZm9fdDsKKworCisvKioKKyAqIG1yYWlkX3BkcnZfaW5mb190IC0gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBoeXNpY2FsIGRyaXZlcworICogQHBkcnZfc3RhdGUJOiBzdGF0ZSBvZiBlYWNoIHBoeXNpY2FsIGRyaXZlCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90CQlwZHJ2X3N0YXRlW01CT1hfTUFYX1BIWVNJQ0FMX0RSSVZFU107CisJdWludDhfdAkJcnN2ZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1yYWlkX3BkcnZfaW5mb190OworCisKKy8qKgorICogbXJhaWRfaW5xdWlyeV90IC0gUkFJRCBpbnF1aXJ5LCBtYWlsYm94IGNvbW1hbmQgMHgwNQorICogQG1yYWlkX2FkYXBpbmZvX3QJOiBhZGFwdGVyIGluZm9ybWF0aW9uCisgKiBAbXJhaWRfbGRydl9pbmZvX3QJOiBsb2dpY2FsIGRyaXZlcyBpbmZvcm1hdGlvbgorICogQG1yYWlkX3BkcnZfaW5mb190CTogcGh5c2ljYWwgZHJpdmVzIGluZm9ybWF0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwltcmFpZF9hZGFwaW5mb190CWFkYXB0ZXJfaW5mbzsKKwltcmFpZF9sZHJ2X2luZm9fdAlsb2dkcnZfaW5mbzsKKwltcmFpZF9wZHJ2X2luZm9fdAlwZHJ2X2luZm87Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtcmFpZF9pbnF1aXJ5X3Q7CisKKworLyoqCisgKiBtcmFpZF9leHRpbnFfdCAtIFJBSUQgZXh0ZW5kZWQgaW5xdWlyeSwgbWFpbGJveCBjb21tYW5kIDB4MDQKKyAqCisgKiBAcmFpZF9pbnEJCTogcmFpZCBpbnF1aXJ5CisgKiBAcGh5c19kcnZfZm9ybWF0CToKKyAqIEBzdGFja19hdHRuCQk6CisgKiBAbW9kZW1fc3RhdHVzCToKKyAqIEByc3ZkCQk6CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwltcmFpZF9pbnF1aXJ5X3QJcmFpZF9pbnE7CisJdWludDE2X3QJcGh5c19kcnZfZm9ybWF0W01BWF9NQk9YX0NIQU5ORUxTXTsKKwl1aW50OF90CQlzdGFja19hdHRuOworCXVpbnQ4X3QJCW1vZGVtX3N0YXR1czsKKwl1aW50OF90CQlyc3ZkWzJdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbXJhaWRfZXh0aW5xX3Q7CisKKworLyoqCisgKiBhZGFwX2RldmljZV90IC0gZGV2aWNlIGluZm9ybWF0aW9uCisgKiBAY2hhbm5lbAk6IGNoYW5uZWwgZnBvciB0aGUgZGV2aWNlCisgKiBAdGFyZ2V0CTogdGFyZ2V0IElEIG9mIHRoZSBkZXZpY2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QJCWNoYW5uZWw7CisJdWludDhfdAkJdGFyZ2V0OworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBhZGFwX2RldmljZV90OworCisKKy8qKgorICogYWRhcF9zcGFuXzQwbGRfdCAtIDQwTEQgc3BhbgorICogQHN0YXJ0X2Jsawk6IHN0YXJ0aW5nIGJsb2NrCisgKiBAbnVtX2Jsa3MJOiBudW1iZXIgb2YgYmxvY2tzCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdAlzdGFydF9ibGs7CisJdWludDMyX3QJbnVtX2Jsa3M7CisJYWRhcF9kZXZpY2VfdAlkZXZpY2VbTUFYX1JPV19TSVpFXzQwTERdOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBhZGFwX3NwYW5fNDBsZF90OworCisKKy8qKgorICogYWRhcF9zcGFuXzhsZF90IC0gOExEIHNwYW4KKyAqIEBzdGFydF9ibGsJOiBzdGFydGluZyBibG9jaworICogQG51bV9ibGtzCTogbnVtYmVyIG9mIGJsb2NrcworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QJc3RhcnRfYmxrOworCXVpbnQzMl90CW51bV9ibGtzOworCWFkYXBfZGV2aWNlX3QJZGV2aWNlW01BWF9ST1dfU0laRV84TERdOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBhZGFwX3NwYW5fOGxkX3Q7CisKKworLyoqCisgKiBsb2dkcnZfcGFyYW1fdCAtIGxvZ2ljYWwgZHJpdmVzIHBhcmFtZXRlcnMKKyAqCisgKiBAc3Bhbl9kZXB0aAk6IHRvdGFsIG51bWJlciBvZiBzcGFucworICogQGxldmVsCTogUkFJRCBsZXZlbAorICogQHJlYWRfYWhlYWQJOiByZWFkIGFoZWFkLCBubyByZWFkIGFoZWFkLCBhZGFwdGl2ZSByZWFkIGFoZWFkCisgKiBAc3RyaXBlX3N6CTogZW5jb2RlZCBzdHJpcGUgc2l6ZQorICogQHN0YXR1cwk6IHN0YXR1cyBvZiB0aGUgbG9naWNhbCBkcml2ZQorICogQHdyaXRlX21vZGUJOiB3cml0ZSBtb2RlLCB3cml0ZV90aHJvdWdoL3dyaXRlX2JhY2sKKyAqIEBkaXJlY3RfaW8JOiBkaXJlY3QgaW8gb3IgdGhyb3VnaCBjYWNoZQorICogQHJvd19zaXplCTogbnVtYmVyIG9mIHN0cmlwZXMgaW4gYSByb3cKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QJCXNwYW5fZGVwdGg7CisJdWludDhfdAkJbGV2ZWw7CisJdWludDhfdAkJcmVhZF9haGVhZDsKKwl1aW50OF90CQlzdHJpcGVfc3o7CisJdWludDhfdAkJc3RhdHVzOworCXVpbnQ4X3QJCXdyaXRlX21vZGU7CisJdWludDhfdAkJZGlyZWN0X2lvOworCXVpbnQ4X3QJCXJvd19zaXplOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbG9nZHJ2X3BhcmFtX3Q7CisKKworLyoqCisgKiBsb2dkcnZfNDBsZF90IC0gbG9naWNhbCBkcml2ZSBkZWZpbml0aW9uIGZvciA0MExEIGNvbnRyb2xsZXJzCisgKiBAbHBhcmFtCTogbG9naWNhbCBkcml2ZXMgcGFyYW1ldGVycworICogQHNwYW4JOiBzcGFuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlsb2dkcnZfcGFyYW1fdAkJbHBhcmFtOworCWFkYXBfc3Bhbl80MGxkX3QJc3BhbltTUEFOX0RFUFRIXzhfU1BBTlNdOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBsb2dkcnZfNDBsZF90OworCisKKy8qKgorICogbG9nZHJ2XzhsZF9zcGFuOF90IC0gbG9naWNhbCBkcml2ZSBkZWZpbml0aW9uIGZvciA4TEQgY29udHJvbGxlcnMKKyAqIEBscGFyYW0JOiBsb2dpY2FsIGRyaXZlcyBwYXJhbWV0ZXJzCisgKiBAc3Bhbgk6IHNwYW4KKyAqCisgKiA4LUxEIGxvZ2ljYWwgZHJpdmUgd2l0aCB1cHRvIDggc3BhbnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWxvZ2Rydl9wYXJhbV90CWxwYXJhbTsKKwlhZGFwX3NwYW5fOGxkX3QJc3BhbltTUEFOX0RFUFRIXzhfU1BBTlNdOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBsb2dkcnZfOGxkX3NwYW44X3Q7CisKKworLyoqCisgKiBsb2dkcnZfOGxkX3NwYW40X3QgLSBsb2dpY2FsIGRyaXZlIGRlZmluaXRpb24gZm9yIDhMRCBjb250cm9sbGVycworICogQGxwYXJhbQk6IGxvZ2ljYWwgZHJpdmVzIHBhcmFtZXRlcnMKKyAqIEBzcGFuCTogc3BhbgorICoKKyAqIDgtTEQgbG9naWNhbCBkcml2ZSB3aXRoIHVwdG8gNCBzcGFucworICovCit0eXBlZGVmIHN0cnVjdCB7CisJbG9nZHJ2X3BhcmFtX3QJbHBhcmFtOworCWFkYXBfc3Bhbl84bGRfdAlzcGFuW1NQQU5fREVQVEhfNF9TUEFOU107Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGxvZ2Rydl84bGRfc3BhbjRfdDsKKworCisvKioKKyAqIHBoeXNfZHJpdmVfdCAtIHBoeXNpY2FsIGRldmljZSBpbmZvcm1hdGlvbgorICogQHR5cGUJOiBUeXBlIG9mIHRoZSBkZXZpY2UKKyAqIEBjdXJfc3RhdHVzCTogY3VycmVudCBzdGF0dXMgb2YgdGhlIGRldmljZQorICogQHRhZ19kZXB0aAk6IExldmVsIG9mIHRhZ2dpbmcKKyAqIEBzeW5jX25lZwk6IHN5bmMgbmVnb3RpYXRpb24gLSBFTkFCTEUgb3IgRElTQkFMRQorICogQHNpemUJOiBjb25maWd1cmFibGUgc2l6ZSBpbiB0ZXJtcyBvZiA1MTIgYnl0ZQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdAkJdHlwZTsKKwl1aW50OF90CQljdXJfc3RhdHVzOworCXVpbnQ4X3QJCXRhZ19kZXB0aDsKKwl1aW50OF90CQlzeW5jX25lZzsKKwl1aW50MzJfdAlzaXplOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwaHlzX2RyaXZlX3Q7CisKKworLyoqCisgKiBkaXNrX2FycmF5XzQwbGRfdCAtIGRpc2sgYXJyYXkgZm9yIDQwTEQgY29udHJvbGxlcnMKKyAqIEBudW1sZHJ2CTogbnVtYmVyIG9mIGxvZ2ljYWwgZHJpdmVzCisgKiBAcmVzdmQJOgorICogQGxkcnYJOiBsb2dpY2FsIGRyaXZlcyBpbmZvcm1hdGlvbgorICogQHBkcnYJOiBwaHlzaWNhbCBkcml2ZXMgaW5mb3JtYXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QJCW51bWxkcnY7CisJdWludDhfdAkJcmVzdmRbM107CisJbG9nZHJ2XzQwbGRfdAlsZHJ2W01BWF9MT0dJQ0FMX0RSSVZFU180MExEXTsKKwlwaHlzX2RyaXZlX3QJcGRydltNQk9YX01BWF9QSFlTSUNBTF9EUklWRVNdOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBkaXNrX2FycmF5XzQwbGRfdDsKKworCisvKioKKyAqIGRpc2tfYXJyYXlfOGxkX3NwYW44X3QgLSBkaXNrIGFycmF5IGZvciA4TEQgY29udHJvbGxlcnMKKyAqIEBudW1sZHJ2CTogbnVtYmVyIG9mIGxvZ2ljYWwgZHJpdmVzCisgKiBAcmVzdmQJOgorICogQGxkcnYJOiBsb2dpY2FsIGRyaXZlcyBpbmZvcm1hdGlvbgorICogQHBkcnYJOiBwaHlzaWNhbCBkcml2ZXMgaW5mb3JtYXRpb24KKyAqCisgKiBEaXNrIGFycmF5IGZvciA4TEQgbG9naWNhbCBkcml2ZXMgd2l0aCB1cHRvIDggc3BhbnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QJCQludW1sZHJ2OworCXVpbnQ4X3QJCQlyZXN2ZFszXTsKKwlsb2dkcnZfOGxkX3NwYW44X3QJbGRydltNQVhfTE9HSUNBTF9EUklWRVNfOExEXTsKKwlwaHlzX2RyaXZlX3QJCXBkcnZbTUJPWF9NQVhfUEhZU0lDQUxfRFJJVkVTXTsKK31fX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZGlza19hcnJheV84bGRfc3BhbjhfdDsKKworCisvKioKKyAqIGRpc2tfYXJyYXlfOGxkX3NwYW40X3QgLSBkaXNrIGFycmF5IGZvciA4TEQgY29udHJvbGxlcnMKKyAqIEBudW1sZHJ2CTogbnVtYmVyIG9mIGxvZ2ljYWwgZHJpdmVzCisgKiBAcmVzdmQJOgorICogQGxkcnYJOiBsb2dpY2FsIGRyaXZlcyBpbmZvcm1hdGlvbgorICogQHBkcnYJOiBwaHlzaWNhbCBkcml2ZXMgaW5mb3JtYXRpb24KKyAqCisgKiBEaXNrIGFycmF5IGZvciA4TEQgbG9naWNhbCBkcml2ZXMgd2l0aCB1cHRvIDQgc3BhbnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QJCQludW1sZHJ2OworCXVpbnQ4X3QJCQlyZXN2ZFszXTsKKwlsb2dkcnZfOGxkX3NwYW40X3QJbGRydltNQVhfTE9HSUNBTF9EUklWRVNfOExEXTsKKwlwaHlzX2RyaXZlX3QJCXBkcnZbTUJPWF9NQVhfUEhZU0lDQUxfRFJJVkVTXTsKK31fX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZGlza19hcnJheV84bGRfc3BhbjRfdDsKKworCisvKioKKyAqIHByaXZhdGVfYmlvc19kYXRhIC0gYmlvcyBwcml2YXRlIGRhdGEgZm9yIGJvb3QgZGV2aWNlcworICogQGdlb21ldHJ5CTogYml0cyAwLTMgLSBCSU9TIGdlb21ldHJ5LCAweDAwMDEgLSAxR0IsIDB4MDAxMCAtIDJHQiwKKyAqCQkweDEwMDAgLSA4R0IsIE90aGVycyB2YWx1ZXMgYXJlIGludmFsaWQKKyAqIEB1bnVzZWQJOiBiaXRzIDQtNyBhcmUgdW51c2VkCisgKiBAYm9vdF9kcnYJOiBsb2dpY2FsIGRyaXZlIHNldCBhcyBib290IGRyaXZlLCAwLi43IC0gZm9yIDhMRCBjYXJkcywKKyAqIAkJMC4uMzkgLSBmb3IgNDBMRCBjYXJkcworICogQGNrc3VtCTogMC0oc3VtIG9mIGZpcnN0IDEzIGJ5dGVzIG9mIHRoaXMgc3RydWN0dXJlKQorICovCitzdHJ1Y3QgcHJpdmF0ZV9iaW9zX2RhdGEgeworCXVpbnQ4X3QJCWdlb21ldHJ5CTo0OworCXVpbnQ4X3QJCXVudXNlZAkJOjQ7CisJdWludDhfdAkJYm9vdF9kcnY7CisJdWludDhfdAkJcnN2ZFsxMl07CisJdWludDE2X3QJY2tzdW07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisvKioKKyAqIG1ib3hfc2dsNjQgLSA2NC1iaXQgc2NhdHRlciBsaXN0IGZvciBtYWlsYm94IGJhc2VkIGNvbnRyb2xsZXJzCisgKiBAYWRkcmVzcwk6IGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcgorICogQGxlbmd0aAk6IGRhdGEgdHJhbnNmZXIgbGVuZ3RoCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50NjRfdAlhZGRyZXNzOworCXVpbnQzMl90CWxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1ib3hfc2dsNjQ7CisKKy8qKgorICogbWJveF9zZ2wzMiAtIDMyLWJpdCBzY2F0dGVyIGxpc3QgZm9yIG1haWxib3ggYmFzZWQgY29udHJvbGxlcnMKKyAqIEBhZGRyZXNzCTogYWRkcmVzcyBvZiB0aGUgYnVmZmVyCisgKiBAbGVuZ3RoCTogZGF0YSB0cmFuc2ZlciBsZW5ndGgKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90CWFkZHJlc3M7CisJdWludDMyX3QJbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbWJveF9zZ2wzMjsKKworI2VuZGlmCQkvLyBfTVJBSURfTUJPWF9ERUZTX0hfCisKKy8qIHZpbTogc2V0IHRzPTggc3c9OCB0dz03ODogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhX2NvbW1vbi5oIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5NjlhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhX2NvbW1vbi5oCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICoKKyAqCQkJTGludXggTWVnYVJBSUQgZGV2aWNlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0ICBMU0kgTG9naWMgQ29ycG9yYXRpb24uCisgKgorICoJICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCSAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGSUxFCQk6IG1lZ2FfY29tbW9uLmgKKyAqCisgKiBMaWJhcmF5IG9mIGNvbW1vbiByb3V0aW5lIHVzZWQgYnkgYWxsIGxvdy1sZXZlbCBtZWdhcmFpZCBkcml2ZXJzCisgKi8KKworI2lmbmRlZiBfTUVHQV9DT01NT05fSF8KKyNkZWZpbmUgX01FR0FfQ09NTU9OX0hfCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKworI2RlZmluZSBMU0lfTUFYX0NIQU5ORUxTCQkxNgorI2RlZmluZSBMU0lfTUFYX0xPR0lDQUxfRFJJVkVTXzY0TEQJKDY0KzEpCisKKworLyoqCisgKiBzY2JfdCAtIHNjc2kgY29tbWFuZCBjb250cm9sIGJsb2NrCisgKiBAcGFyYW0gY2NiCQk6IGNvbW1hbmQgY29udHJvbCBibG9jayBmb3IgaW5kaXZpZHVhbCBkcml2ZXIKKyAqIEBwYXJhbSBsaXN0CQk6IGxpc3Qgb2YgY29udHJvbCBibG9ja3MKKyAqIEBwYXJhbSBncAkJOiBnZW5lcmFsIHB1cnBvc2UgZmllbGQgZm9yIExMRHMKKyAqIEBwYXJhbSBzbm8JCTogYWxsIFNDQnMgaGF2ZSBhIHNlcmlhbCBudW1iZXIKKyAqIEBwYXJhbSBzY3AJCTogYXNzb2NpYXRlZCBzY3NpIGNvbW1hbmQKKyAqIEBwYXJhbSBzdGF0ZQkJOiBjdXJyZW50IHN0YXRlIG9mIHNjYgorICogQHBhcmFtIGRtYV9kaXIJOiBkaXJlY3Rpb24gb2YgZGF0YSB0cmFuc2ZlcgorICogQHBhcmFtIGRtYV90eXBlCTogdHJhbnNmZXIgd2l0aCBzZyBsaXN0LCBidWZmZXIsIG9yIG5vIGRhdGEgdHJhbnNmZXIKKyAqIEBwYXJhbSBkZXZfY2hhbm5lbAk6IGFjdHVhbCBjaGFubmVsIG9uIHRoZSBkZXZpY2UKKyAqIEBwYXJhbSBkZXZfdGFyZ2V0CTogYWN0dWFsIHRhcmdldCBvbiB0aGUgZGV2aWNlCisgKiBAcGFyYW0gc3RhdHVzCTogY29tcGxldGlvbiBzdGF0dXMKKyAqCisgKiBUaGlzIGlzIG91ciBjZW50cmFsIGRhdGEgc3RydWN0dXJlIHRvIGlzc3VlIGNvbW1hbmRzIHRoZSBlYWNoIGRyaXZlci4KKyAqIERyaXZlciBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZXMgYXJlIG1haW50YWluZWQgaW4gdGhlIGNjYiBmaWVsZC4KKyAqIHNjYiBwcm92aWRlcyBhIGZpZWxkICdncCcsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IExMRCBmb3IgaXRzIG93biBwdXJwb3NlcworICoKKyAqIGRldl9jaGFubmVsIGFuZCBkZXZfdGFyZ2V0IG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgYWN0dWFsIGNoYW5uZWwgYW5kCisgKiB0YXJnZXQgb24gdGhlIGNvbnRyb2xsZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwljYWRkcl90CQkJY2NiOworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwl1bnNpZ25lZCBsb25nCQlncDsKKwl1bnNpZ25lZCBpbnQJCXNubzsKKwlzdHJ1Y3Qgc2NzaV9jbW5kCSpzY3A7CisJdWludDMyX3QJCXN0YXRlOworCXVpbnQzMl90CQlkbWFfZGlyZWN0aW9uOworCXVpbnQzMl90CQlkbWFfdHlwZTsKKwl1aW50MTZfdAkJZGV2X2NoYW5uZWw7CisJdWludDE2X3QJCWRldl90YXJnZXQ7CisJdWludDMyX3QJCXN0YXR1czsKK30gc2NiX3Q7CisKKy8qCisgKiBTQ0Igc3RhdGVzIGFzIGl0IHRyYW5zaXRpb25zIGZyb20gb25lIHN0YXRlIHRvIGFub3RoZXIKKyAqLworI2RlZmluZSBTQ0JfRlJFRQkweDAwMDAJLyogb24gdGhlIGZyZWUgbGlzdCAqLworI2RlZmluZSBTQ0JfQUNUSVZFCTB4MDAwMQkvKiBvZmYgdGhlIGZyZWUgbGlzdCAqLworI2RlZmluZSBTQ0JfUEVORFEJMHgwMDAyCS8qIG9uIHRoZSBwZW5kaW5nIHF1ZXVlICovCisjZGVmaW5lIFNDQl9JU1NVRUQJMHgwMDA0CS8qIGlzc3VlZCAtIG93bmVyIGYvdyAqLworI2RlZmluZSBTQ0JfQUJPUlQJMHgwMDA4CS8qIEdvdCBhbiBhYm9ydCBmb3IgdGhpcyBvbmUgKi8KKyNkZWZpbmUgU0NCX1JFU0VUCTB4MDAxMAkvKiBHb3QgYSByZXNldCBmb3IgdGhpcyBvbmUgKi8KKworLyoKKyAqIERNQSB0eXBlcyBmb3Igc2NiCisgKi8KKyNkZWZpbmUgTVJBSURfRE1BX05PTkUJMHgwMDAwCS8qIG5vIGRhdGEgdHJhbnNmZXIgZm9yIHRoaXMgY29tbWFuZCAqLworI2RlZmluZSBNUkFJRF9ETUFfV1NHCTB4MDAwMQkvKiBkYXRhIHRyYW5zZmVyIHVzaW5nIGEgc2cgbGlzdCAqLworI2RlZmluZSBNUkFJRF9ETUFfV0JVRgkweDAwMDIJLyogZGF0YSB0cmFuc2ZlciB1c2luZyBhIGNvbnRpZ3VvdXMgYnVmZmVyICovCisKKworLyoqCisgKiBzdHJ1Y3QgYWRhcHRlcl90IC0gZHJpdmVyJ3MgaW5pdGlhbGl6YXRpb24gc3RydWN0dXJlCisgKiBAcGFyYW0gZHBjX2gJCQk6IHRhc2tsZXQgaGFuZGxlCisgKiBAcGFyYW0gcGRldgkJCTogcGNpIGNvbmZpZ3VyYXRpb24gcG9pbnRlciBmb3Iga2VybmVsCisgKiBAcGFyYW0gaG9zdAkJCTogcG9pbnRlciB0byBob3N0IHN0cnVjdHVyZSBvZiBtaWQtbGF5ZXIKKyAqIEBwYXJhbSBob3N0X2xvY2sJCTogcG9pbnRlciB0byBhcHByb3ByaWF0ZSBsb2NrCisgKiBAcGFyYW0gbG9jawkJCTogc3luY2hyb25pemF0aW9uIGxvY2sgZm9yIG1pZC1sYXllciBhbmQgZHJpdmVyCisgKiBAcGFyYW0gcXVpZXNjZW50CQk6IGRyaXZlciBpcyBxdWllc2NlbnQgZm9yIG5vdy4KKyAqIEBwYXJhbSBvdXRzdGFuZGluZ19jbWRzCTogbnVtYmVyIG9mIGNvbW1hbmRzIHBlbmRpbmcgaW4gdGhlIGRyaXZlcgorICogQHBhcmFtIGtzY2JfbGlzdAkJOiBwb2ludGVyIHRvIHRoZSBidWxrIG9mIFNDQnMgcG9pbnRlcnMgZm9yIElPCisgKiBAcGFyYW0ga3NjYl9wb29sCQk6IHBvb2wgb2YgZnJlZSBzY2JzIGZvciBJTworICogQHBhcmFtIGtzY2JfcG9vbF9sb2NrCTogbG9jayBmb3IgcG9vbCBvZiBmcmVlIHNjYnMKKyAqIEBwYXJhbSBwZW5kX2xpc3QJCTogcGVuZGluZyBjb21tYW5kcyBsaXN0CisgKiBAcGFyYW0gcGVuZF9saXN0X2xvY2sJOiBleGx1c2lvbiBsb2NrIGZvciBwZW5kaW5nIGNvbW1hbmRzIGxpc3QKKyAqIEBwYXJhbSBjb21wbGV0ZWRfbGlzdAk6IGxpc3Qgb2YgY29tcGxldGVkIGNvbW1hbmRzCisgKiBAcGFyYW0gY29tcGxldGVkX2xpc3RfbG9jawk6IGV4Y2x1c2lvbiBsb2NrIGZvciBsaXN0IG9mIGNvbXBsZXRlZCBjb21tYW5kcworICogQHBhcmFtIHNnbGVuCQkJOiBtYXggc2cgZWxlbWVudHMgc3VwcG9ydGVkCisgKiBAcGFyYW0gZGV2aWNlX2lkcwkJOiB0byBjb252ZXJ0IGtlcm5lbCBkZXZpY2UgYWRkciB0byBvdXIgZGV2aWNlcy4KKyAqIEBwYXJhbSByYWlkX2RldmljZQkJOiByYWlkIGFkYXB0ZXIgc3BlY2lmaWMgcG9pbnRlcgorICogQHBhcmFtIG1heF9jaGFubmVsCQk6IG1heGltdW0gY2hhbm5lbCBudW1iZXIgc3VwcG9ydGVkIC0gaW5jbHVzaXZlCisgKiBAcGFyYW0gbWF4X3RhcmdldAkJOiBtYXggdGFyZ2V0IHN1cHBvcnRlZCAtIGluY2x1c2l2ZQorICogQHBhcmFtIG1heF9sdW4JCTogbWF4IGx1biBzdXBwb3J0ZWQgLSBpbmNsdXNpdmUKKyAqIEBwYXJhbSB1bmlxdWVfaWQJCTogdW5pcXVlIGlkZW50aWZpZXIgZm9yIGVhY2ggYWRhcHRlcgorICogQHBhcmFtIGlycQkJCTogSVJRIGZvciB0aGlzIGFkYXB0ZXIKKyAqIEBwYXJhbSBpdG8JCQk6IGludGVybmFsIHRpbWVvdXQgdmFsdWUsICgtMSkgbWVhbnMgbm8gdGltZW91dAorICogQHBhcmFtIGlidWYJCQk6IGJ1ZmZlciB0byBpc3N1ZSBpbnRlcm5hbCBjb21tYW5kcworICogQHBhcmFtIGlidWZfZG1hX2gJCTogZG1hIGhhbmRsZSBmb3IgdGhlIGFib3ZlIGJ1ZmZlcgorICogQHBhcmFtIHVzY2JfbGlzdAkJOiBTQ0IgcG9pbnRlcnMgZm9yIHVzZXIgY21kcywgY29tbW9uIG1nbXQgbW9kdWxlCisgKiBAcGFyYW0gdXNjYl9wb29sCQk6IHBvb2wgb2YgU0NCcyBmb3IgdXNlciBjb21tYW5kcworICogQHBhcmFtIHVzY2JfcG9vbF9sb2NrCTogZXhjbHVzaW9uIGxvY2sgZm9yIHRoZXNlIFNDQnMKKyAqIEBwYXJhbSBtYXhfY21kcwkJOiBtYXggb3V0c3RhbmRpbmcgY29tbWFuZHMKKyAqIEBwYXJhbSBmd192ZXJzaW9uCQk6IGZpcm13YXJlIHZlcnNpb24KKyAqIEBwYXJhbSBiaW9zX3ZlcnNpb24JCTogYmlvcyB2ZXJzaW9uCisgKiBAcGFyYW0gbWF4X2NkYl9zegkJOiBiaWdnZXN0IENEQiBzaXplIHN1cHBvcnRlZC4KKyAqIEBwYXJhbSBoYQkJCTogaXMgaGlnaCBhdmFpbGFiaWxpdHkgcHJlc2VudCAtIGNsdXN0ZXJpbmcKKyAqIEBwYXJhbSBpbml0X2lkCQk6IGluaXRpYXRvciBJRCwgdGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIDcKKyAqIEBwYXJhbSBtYXhfc2VjdG9ycwkJOiBtYXggc2VjdG9ycyBwZXIgcmVxdWVzdAorICogQHBhcmFtIGNtZF9wZXJfbHVuCQk6IG1heCBvdXRzdGFuZGluZyBjb21tYW5kcyBwZXIgTFVOCisgKiBAcGFyYW0gYmVpbmdfZGV0YWNoZWQJOiBzZXQgd2hlbiB1bmxvYWRpbmcsIG5vIG1vcmUgbWdtdCBjYWxscworICoKKyAqCisgKiBtcmFpZF9zZXR1cF9kZXZpY2VfbWFwKCkgY2FuIGJlIGNhbGxlZCBhbnl0aW1lIGFmdGVyIHRoZSBkZXZpY2UgbWFwIGlzCisgKiBhdmFpbGFibGUgYW5kIE1SQUlEX0dFVF9ERVZJQ0VfTUFQKCkgY2FuIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgbWFwcGluZyBpcworICogcmVxdWlyZWQsIHVzdWFsbHkgZnJvbSBMTEQncyBxdWV1ZSBlbnRyeSBwb2ludC4gVGhlIGZvcm1hciBBUEkgc2V0cyB1cCB0aGUKKyAqIE1SQUlEX0lTX0xPR0lDQUwoYWRhcHRlcl90ICosIHN0cnVjdCBzY3NpX2NtbmQgKikgdG8gZmluZCBvdXQgaWYgdGhlCisgKiBkZXZpY2UgaW4gcXVlc3Rpb24gaXMgYSBsb2dpY2FsIGRyaXZlLgorICoKKyAqIHF1aWVzY2VudCBmbGFnIHNob3VsZCBiZSBzZXQgYnkgdGhlIGRyaXZlciBpZiBpdCBpcyBub3QgYWNjZXB0aW5nIG1vcmUKKyAqIGNvbW1hbmRzCisgKgorICogTk9URTogVGhlIGZpZWxkcyBvZiB0aGlzIHN0cnVjdHVyZXMgYXJlIHBsYWNlZCB0byBtaW5pbWl6ZSBjYWNoZSBtaXNzZXMKKyAqLworCisvLyBhbW91bnQgb2Ygc3BhY2UgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIGJpb3MgYW5kIGZpcm13YXJlIHZlcnNpb24gc3RyaW5ncworI2RlZmluZSBWRVJTSU9OX1NJWkUJMTYKKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlkcGNfaDsKKwlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CisJc3RydWN0IFNjc2lfSG9zdAkqaG9zdDsKKwlzcGlubG9ja190CQkqaG9zdF9sb2NrOworCXNwaW5sb2NrX3QJCWxvY2s7CisJdWludDhfdAkJCXF1aWVzY2VudDsKKwlpbnQJCQlvdXRzdGFuZGluZ19jbWRzOworCXNjYl90CQkJKmtzY2JfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWtzY2JfcG9vbDsKKwlzcGlubG9ja190CQlrc2NiX3Bvb2xfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXBlbmRfbGlzdDsKKwlzcGlubG9ja190CQlwZW5kX2xpc3RfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWNvbXBsZXRlZF9saXN0OworCXNwaW5sb2NrX3QJCWNvbXBsZXRlZF9saXN0X2xvY2s7CisJdWludDE2X3QJCXNnbGVuOworCWludAkJCWRldmljZV9pZHNbTFNJX01BWF9DSEFOTkVMU10KKwkJCQkJW0xTSV9NQVhfTE9HSUNBTF9EUklWRVNfNjRMRF07CisJY2FkZHJfdAkJCXJhaWRfZGV2aWNlOworCXVpbnQ4X3QJCQltYXhfY2hhbm5lbDsKKwl1aW50MTZfdAkJbWF4X3RhcmdldDsKKwl1aW50OF90CQkJbWF4X2x1bjsKKworCXVpbnQzMl90CQl1bmlxdWVfaWQ7CisJdWludDhfdAkJCWlycTsKKwl1aW50OF90CQkJaXRvOworCWNhZGRyX3QJCQlpYnVmOworCWRtYV9hZGRyX3QJCWlidWZfZG1hX2g7CisJc2NiX3QJCQkqdXNjYl9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJdXNjYl9wb29sOworCXNwaW5sb2NrX3QJCXVzY2JfcG9vbF9sb2NrOworCWludAkJCW1heF9jbWRzOworCXVpbnQ4X3QJCQlmd192ZXJzaW9uW1ZFUlNJT05fU0laRV07CisJdWludDhfdAkJCWJpb3NfdmVyc2lvbltWRVJTSU9OX1NJWkVdOworCXVpbnQ4X3QJCQltYXhfY2RiX3N6OworCXVpbnQ4X3QJCQloYTsKKwl1aW50MTZfdAkJaW5pdF9pZDsKKwl1aW50MTZfdAkJbWF4X3NlY3RvcnM7CisJdWludDE2X3QJCWNtZF9wZXJfbHVuOworCWF0b21pY190CQliZWluZ19kZXRhY2hlZDsKK30gYWRhcHRlcl90OworCisjZGVmaW5lIFNDU0lfRlJFRV9MSVNUX0xPQ0soYWRhcHRlcikJKCZhZGFwdGVyLT5rc2NiX3Bvb2xfbG9jaykKKyNkZWZpbmUgVVNFUl9GUkVFX0xJU1RfTE9DSyhhZGFwdGVyKQkoJmFkYXB0ZXItPnVzY2JfcG9vbF9sb2NrKQorI2RlZmluZSBQRU5ESU5HX0xJU1RfTE9DSyhhZGFwdGVyKQkoJmFkYXB0ZXItPnBlbmRfbGlzdF9sb2NrKQorI2RlZmluZSBDT01QTEVURURfTElTVF9MT0NLKGFkYXB0ZXIpCSgmYWRhcHRlci0+Y29tcGxldGVkX2xpc3RfbG9jaykKKworCisvLyBjb252ZXJzaW9uIGZyb20gc2NzaSBjb21tYW5kCisjZGVmaW5lIFNDUDJIT1NUKHNjcCkJCQkoc2NwKS0+ZGV2aWNlLT5ob3N0CS8vIHRvIGhvc3QKKyNkZWZpbmUgU0NQMkhPU1REQVRBKHNjcCkJCVNDUDJIT1NUKHNjcCktPmhvc3RkYXRhCS8vIHRvIHNvZnQgc3RhdGUKKyNkZWZpbmUgU0NQMkNIQU5ORUwoc2NwKQkJKHNjcCktPmRldmljZS0+Y2hhbm5lbAkvLyB0byBjaGFubmVsCisjZGVmaW5lIFNDUDJUQVJHRVQoc2NwKQkJCShzY3ApLT5kZXZpY2UtPmlkCS8vIHRvIHRhcmdldAorI2RlZmluZSBTQ1AyTFVOKHNjcCkJCQkoc2NwKS0+ZGV2aWNlLT5sdW4JLy8gdG8gTFVOCisKKy8vIGdlbmVyaWMgbWFjcm8gdG8gY29udmVydCBzY3NpIGNvbW1hbmQgYW5kIGhvc3QgdG8gY29udHJvbGxlcidzIHNvZnQgc3RhdGUKKyNkZWZpbmUgU0NTSUhPU1QyQURBUChob3N0KQkoKChjYWRkcl90ICopKGhvc3QtPmhvc3RkYXRhKSlbMF0pCisjZGVmaW5lIFNDUDJBREFQVEVSKHNjcCkJKGFkYXB0ZXJfdCAqKVNDU0lIT1NUMkFEQVAoU0NQMkhPU1Qoc2NwKSkKKworCisvKioKKyAqIE1SQUlEX0dFVF9ERVZJQ0VfTUFQIC0gZGV2aWNlIGlkcworICogQHBhcmFtIGFkcAkJLSBBZGFwdGVyJ3Mgc29mdCBzdGF0ZQorICogQHBhcmFtIHNjcAkJLSBtaWQtbGF5ZXIgc2NzaSBjb21tYW5kIHBvaW50ZXIKKyAqIEBwYXJhbSBwX2NoYW4JLSBwaHlzaWNhbCBjaGFubmVsIG9uIHRoZSBjb250cm9sbGVyCisgKiBAcGFyYW0gdGFyZ2V0CS0gdGFyZ2V0IGlkIG9mIHRoZSBkZXZpY2Ugb3IgbG9naWNhbCBkcml2ZSBudW1iZXIKKyAqIEBwYXJhbSBpc2xvZ2ljYWwJLSBzZXQgaWYgdGhlIGNvbW1hbmQgaXMgZm9yIHRoZSBsb2dpY2FsIGRyaXZlCisgKgorICogTWFjcm8gdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgZGV2aWNlIGNsYXNzLCBsb2dpY2FsIG9yIHBoeXNpY2FsIGFuZAorICogdGhlIGNvcnJlc3BvbmRpbmcgcGh5c2ljYWwgY2hhbm5lbCBhbmQgdGFyZ2V0IG9yIGxvZ2ljYWwgZHJpdmUgbnVtYmVyCisgKiovCisjZGVmaW5lIE1SQUlEX0lTX0xPR0lDQUwoYWRwLCBzY3ApCVwKKwkoU0NQMkNIQU5ORUwoc2NwKSA9PSAoYWRwKS0+bWF4X2NoYW5uZWwpID8gMSA6IDAKKworI2RlZmluZSBNUkFJRF9JU19MT0dJQ0FMX1NERVYoYWRwLCBzZGV2KQlcCisJKHNkZXYtPmNoYW5uZWwgPT0gKGFkcCktPm1heF9jaGFubmVsKSA/IDEgOiAwCisKKyNkZWZpbmUgTVJBSURfR0VUX0RFVklDRV9NQVAoYWRwLCBzY3AsIHBfY2hhbiwgdGFyZ2V0LCBpc2xvZ2ljYWwpCVwKKwkvKgkJCQkJCQkJXAorCSAqIElzIHRoZSByZXF1ZXN0IGNvbWluZyBmb3IgdGhlIHZpcnR1YWwgY2hhbm5lbAkJXAorCSAqLwkJCQkJCQkJXAorCWlzbG9naWNhbCA9IE1SQUlEX0lTX0xPR0lDQUwoYWRwLCBzY3ApOwkJCQlcCisJCQkJCQkJCQlcCisJLyoJCQkJCQkJCVwKKwkgKiBHZXQgYW4gaW5kZXggaW50byBvdXIgdGFibGUgb2YgZHJpdmUgaWRzIG1hcHBpbmcJCVwKKwkgKi8JCQkJCQkJCVwKKwlpZiAoaXNsb2dpY2FsKSB7CQkJCQkJXAorCQlwX2NoYW4gPSAweEZGOwkJCQkJCVwKKwkJdGFyZ2V0ID0JCQkJCQlcCisJCShhZHApLT5kZXZpY2VfaWRzWyhhZHApLT5tYXhfY2hhbm5lbF1bU0NQMlRBUkdFVChzY3ApXTsJXAorCX0JCQkJCQkJCVwKKwllbHNlIHsJCQkJCQkJCVwKKwkJcF9jaGFuID0gKChhZHApLT5kZXZpY2VfaWRzW1NDUDJDSEFOTkVMKHNjcCldCQlcCisJCQkJCVtTQ1AyVEFSR0VUKHNjcCldID4+IDgpICYgMHhGRjsJXAorCQl0YXJnZXQgPSAoKGFkcCktPmRldmljZV9pZHNbU0NQMkNIQU5ORUwoc2NwKV0JCVwKKwkJCQkJW1NDUDJUQVJHRVQoc2NwKV0gJiAweEZGKTsJXAorCX0KKworLyoKKyAqICMjIyBIZWxwZXIgcm91dGluZXMgIyMjCisgKi8KKyNkZWZpbmUgTFNJX0RCR0xWTCBtcmFpZF9kZWJ1Z19sZXZlbAkvLyBlYWNoIExMRCBtdXN0IGRlZmluZSBhIGdsb2JhbAorIAkJCQkJLy8gbXJhaWRfZGVidWdfbGV2ZWwKKworI2lmZGVmIERFQlVHCisjaWYgZGVmaW5lZCAoX0FTU0VSVF9QQU5JQykKKyNkZWZpbmUgQVNTRVJUX0FDVElPTglwYW5pYworI2Vsc2UKKyNkZWZpbmUgQVNTRVJUX0FDVElPTglwcmludGsKKyNlbmRpZgorCisjZGVmaW5lIEFTU0VSVChleHByZXNzaW9uKQkJCQkJCVwKKwlpZiAoIShleHByZXNzaW9uKSkgewkJCQkJCVwKKwlBU1NFUlRfQUNUSU9OKCJhc3NlcnRpb24gZmFpbGVkOiglcyksIGZpbGU6ICVzLCBsaW5lOiAlZDolc1xuIiwJXAorCQkJI2V4cHJlc3Npb24sIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsJXAorCX0KKyNlbHNlCisjZGVmaW5lIEFTU0VSVChleHByZXNzaW9uKQorI2VuZGlmCisKKy8qCisgKiBzdHJ1Y3QgbXJhaWRfcGNpX2JsayAtIHN0cnVjdHVyZSBob2xkcyBETUEgbWVtb3J5IGJsb2NrIGluZm8KKyAqIEBwYXJhbSB2YWRkcgkJOiB2aXJ0dWFsIGFkZHJlc3MgdG8gYSBtZW1vcnkgYmxvY2sKKyAqIEBwYXJhbSBkbWFfYWRkcgk6IERNQSBoYW5kbGUgdG8gYSBtZW1vcnkgYmxvY2sKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBmaWxsZWQgdXAgZm9yIHRoZSBjYWxsZXIuIEl0IGlzIHRoZSByZXNwb25zaWJpbHR5IG9mIHRoZQorICogY2FsbGVyIHRvIGFsbG9jYXRlIHRoaXMgYXJyYXkgYmlnIGVub3VnaCB0byBzdG9yZSBhZGRyZXNzZXMgZm9yIGFsbAorICogcmVxdWVzdGVkIGVsZW1lbnRzCisgKi8KK3N0cnVjdCBtcmFpZF9wY2lfYmxrIHsKKwljYWRkcl90CQl2YWRkcjsKKwlkbWFfYWRkcl90CWRtYV9hZGRyOworfTsKKworI2VuZGlmIC8vIF9NRUdBX0NPTU1PTl9IXworCisvLyB2aW06IHNldCB0cz04IHN3PTggdHc9Nzg6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfaW9jdGwuaCBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYWVlMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfaW9jdGwuaApAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAqCisgKgkJCUxpbnV4IE1lZ2FSQUlEIGRldmljZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCAgTFNJIExvZ2ljIENvcnBvcmF0aW9uLgorICoKKyAqCSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCSAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCSAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRklMRQkJOiBtZWdhcmFpZF9pb2N0bC5oCisgKgorICogRGVmaW5pdGlvbnMgdG8gaW50ZXJmYWNlIHdpdGggdXNlciBsZXZlbCBhcHBsaWNhdGlvbnMKKyAqLworCisjaWZuZGVmIF9NRUdBUkFJRF9JT0NUTF9IXworI2RlZmluZSBfTUVHQVJBSURfSU9DVExfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSAibWJveF9kZWZzLmgiCisKKy8qKgorICogY29uX2xvZygpIC0gY29uc29sZSBsb2cgcm91dGluZQorICogQHBhcmFtIGxldmVsCQk6IGluZGljYXRlcyB0aGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UuCisgKiBAZnBhcmFtIG10CQk6IGZvcm1hdCBzdHJpbmcKKyAqCisgKiBjb25fbG9nIGRpc3BsYXlzIHRoZSBlcnJvciBtZXNzYWdlcyBvbiB0aGUgY29uc29sZSBiYXNlZCBvbiB0aGUgY3VycmVudAorICogZGVidWcgbGV2ZWwuIEFsc28gaXQgYXR0YWNoZXMgdGhlIGFwcHJvcHJpYXRlIGtlcm5lbCBzZXZlcml0eSBsZXZlbCB3aXRoCisgKiB0aGUgbWVzc2FnZS4KKyAqCisgKgorICogY29uc29sZ2UgbWVzc2FnZXMgZGVidWcgbGV2ZWxzCisgKi8KKyNkZWZpbmUJQ0xfQU5OCQkwCS8qIHByaW50IHVuY29uZGl0aW9uYWxseSwgYW5ub3VuY2VtZW50cyAqLworI2RlZmluZSBDTF9ETEVWRUwxCTEJLyogZGVidWcgbGV2ZWwgMSwgaW5mb3JtYXRpdmUgKi8KKyNkZWZpbmUgQ0xfRExFVkVMMgkyCS8qIGRlYnVnIGxldmVsIDIsIHZlcmJvc2UgKi8KKyNkZWZpbmUgQ0xfRExFVkVMMwkzCS8qIGRlYnVnIGxldmVsIDMsIHZlcnkgdmVyYm9zZSAqLworCisjZGVmaW5lCWNvbl9sb2cobGV2ZWwsIGZtdCkgaWYgKExTSV9EQkdMVkwgPj0gbGV2ZWwpIHByaW50ayBmbXQ7CisKKy8qCisgKiBEZWZpbml0aW9ucyAmIERlY2xhcmF0aW9ucyBuZWVkZWQgdG8gdXNlIGNvbW1vbiBtYW5hZ2VtZW50IG1vZHVsZQorICovCisKKyNkZWZpbmUgTUVHQUlPQ19NQUdJQwkJJ20nCisjZGVmaW5lIE1FR0FJT0NDTUQJCV9JT1dSKE1FR0FJT0NfTUFHSUMsIDAsIG1pbWRfdCkKKworI2RlZmluZSBNRUdBSU9DX1FOQURBUAkJJ20nCS8qIFF1ZXJ5ICMgb2YgYWRhcHRlcnMJCSovCisjZGVmaW5lIE1FR0FJT0NfUURSVlJWRVIJJ2UnCS8qIFF1ZXJ5IGRyaXZlciB2ZXJzaW9uCQkqLworI2RlZmluZSBNRUdBSU9DX1FBREFQSU5GTyAgIAknZycJLyogUXVlcnkgYWRhcHRlciBpbmZvcm1hdGlvbgkqLworCisjZGVmaW5lIFVTQ1NJQ01ECQkweDgwCisjZGVmaW5lIFVJT0NfUkQJCQkweDAwMDAxCisjZGVmaW5lIFVJT0NfV1IJCQkweDAwMDAyCisKKyNkZWZpbmUgTUJPWF9DTUQJCTB4MDAwMDAKKyNkZWZpbmUgR0VUX0RSSVZFUl9WRVIJCTB4MTAwMDAKKyNkZWZpbmUgR0VUX05fQURBUAkJMHgyMDAwMAorI2RlZmluZSBHRVRfQURBUF9JTkZPCQkweDMwMDAwCisjZGVmaW5lIEdFVF9DQVAJCQkweDQwMDAwCisjZGVmaW5lIEdFVF9TVEFUUwkJMHg1MDAwMAorI2RlZmluZSBHRVRfSU9DVExfVkVSU0lPTgkweDAxCisKKyNkZWZpbmUgRVhUX0lPQ1RMX1NJR05fU1oJMTYKKyNkZWZpbmUgRVhUX0lPQ1RMX1NJR04JCSIkJF9FWFREX0lPQ1RMXyQkIgorCisjZGVmaW5lCU1CT1hfTEVHQUNZCQkweDAwCQkvKiBpb2N0bCBoYXMgbGVnYWN5IG1ib3gqLworI2RlZmluZSBNQk9YX0hQRQkJMHgwMQkJLyogaW9jdGwgaGFzIGhwZSBtYm94CSovCisKKyNkZWZpbmUJQVBQVFlQRV9NSU1ECQkweDAwCQkvKiBvbGQgZXhpc3RpbmcgYXBwcwkqLworI2RlZmluZSBBUFBUWVBFX1VJT0MJCTB4MDEJCS8qIG5ldyBhcHBzIHVzaW5nIHVpb2MJKi8KKworI2RlZmluZSBJT0NUTF9JU1NVRQkJMHgwMDAwMDAwMQkvKiBJc3N1ZSBpb2N0bAkJKi8KKyNkZWZpbmUgSU9DVExfQUJPUlQJCTB4MDAwMDAwMDIJLyogQWJvcnQgcHJldmlvdXMgaW9jdGwJKi8KKworI2RlZmluZSBEUlZSVFlQRV9NQk9YCQkweDAwMDAwMDAxCS8qIHJlZ3VsYXIgbWJveCBkcml2ZXIJKi8KKyNkZWZpbmUgRFJWUlRZUEVfSFBFCQkweDAwMDAwMDAyCS8qIG5ldyBocGUgZHJpdmVyCSovCisKKyNkZWZpbmUgTUtBREFQKGFkYXBubykJKE1FR0FJT0NfTUFHSUMgPDwgOCB8IChhZGFwbm8pICkKKyNkZWZpbmUgR0VUQURBUChta2FkYXApCSgobWthZGFwKSBeIE1FR0FJT0NfTUFHSUMgPDwgOCkKKworI2RlZmluZSBNQVhfRE1BX1BPT0xTCQk1CQkvKiA0aywgOGssIDE2aywgMzJrLCA2NGsqLworCisKKy8qKgorICogc3RydWN0IHVpb2NfdCAtIHRoZSBjb21tb24gaW9jdGwgcGFja2V0IHN0cnVjdHVyZQorICoKKyAqIEBzaWduYXR1cmUJOiBNdXN0IGJlICIkJF9FWFREX0lPQ1RMXyQkIgorICogQG1iX3R5cGUJOiBUeXBlIG9mIHRoZSBtYWlsIGJveCAoTUJfTEVHQUNZIG9yIE1CX0hQRSkKKyAqIEBhcHBfdHlwZQk6IFR5cGUgb2YgdGhlIGlzc3VpbmcgYXBwbGljYXRpb24gKGV4aXN0aW5nIG9yIG5ldykKKyAqIEBvcGNvZGUJOiBPcGNvZGUgb2YgdGhlIGNvbW1hbmQKKyAqIEBhZGFwbm8JOiBBZGFwdGVyIG51bWJlcgorICogQGNtZGJ1Zgk6IFBvaW50ZXIgdG8gYnVmZmVyIC0gY2FuIHBvaW50IHRvIG1ib3ggb3IgcGxhaW4gZGF0YSBidWZmZXIKKyAqIEB4ZmVybGVuCTogeGZlcmxlbiBmb3IgRENNRCBhbmQgbm9uIG1haWxib3ggY29tbWFuZHMKKyAqIEBkYXRhX2Rpcgk6IERpcmVjdGlvbiBvZiB0aGUgZGF0YSB0cmFuc2ZlcgorICogQHN0YXR1cwk6IFN0YXR1cyBmcm9tIHRoZSBkcml2ZXIKKyAqIEByZXNlcnZlZAk6IHJlc2VydmVkIGJ5dGVzIGZvciBmdXR1cmUgZXhwYW5zaW9uCisgKgorICogQHVzZXJfZGF0YQk6IHVzZXIgZGF0YSB0cmFuc2ZlciBhZGRyZXNzIGlzIHNhdmVkIGluIHRoaXMKKyAqIEB1c2VyX2RhdGFfbGVuOiBsZW5ndGggb2YgdGhlIGRhdGEgYnVmZmVyIHNlbnQgYnkgdXNlciBhcHAKKyAqIEB1c2VyX3B0aHJ1CTogdXNlciBwYXNzdGhydSBhZGRyZXNzIGlzIHNhdmVzIGluIHRoaXMgKG51bGwgaWYgRENNRCkKKyAqIEBwdGhydTMyCToga2VybmVsIGFkZHJlc3MgcGFzc3RocnUgKGFsbG9jYXRlZCBwZXIga2lvYykKKyAqIEBwdGhydTMyX2gJOiBwaHlzaWNhbGwgYWRkcmVzcyBvZiBAcHRocnUzMgorICogQGxpc3QJOiBmb3Iga2lvYyBmcmVlIHBvb2wgbGlzdCBtYWludGVuYW5jZQorICogQGRvbmUJOiBjYWxsIGJhY2sgcm91dGluZSBmb3IgbGxkcyB0byBjYWxsIHdoZW4ga2lvYyBpcyBjb21wbGV0ZWQKKyAqIEBidWZfdmFkZHIJOiBkbWEgcG9vbCBidWZmZXIgYXR0YWNoZWQgdG8ga2lvYyBmb3IgZGF0YSB0cmFuc2ZlcgorICogQGJ1Zl9wYWRkcgk6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGRtYSBwb29sIGJ1ZmZlcgorICogQHBvb2xfaW5kZXgJOiBpbmRleCBvZiB0aGUgZG1hIHBvb2wgdGhhdCBAYnVmX3ZhZGRyIGlzIHRha2VuIGZyb20KKyAqIEBmcmVlX2J1Zgk6IGluZGljYXRlcyBpZiBidWZmZXIgbmVlZHMgdG8gYmUgZnJlZWQgYWZ0ZXIga2lvYyBjb21wbGV0ZXMKKyAqCisgKiBOb3RlCQk6IEFsbCBMU0kgZHJpdmVycyB1bmRlcnN0YW5kIG9ubHkgdGhpcyBwYWNrZXQuIEFueSBvdGhlcgorICoJCTogZm9ybWF0IHNlbnQgYnkgYXBwbGljYXRpb25zIHdvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGlzLgorICovCit0eXBlZGVmIHN0cnVjdCB1aW9jIHsKKworLyogVXNlciBBcHBzOiAqLworCisJdWludDhfdAkJCXNpZ25hdHVyZVtFWFRfSU9DVExfU0lHTl9TWl07CisJdWludDE2X3QJCW1iX3R5cGU7CisJdWludDE2X3QJCWFwcF90eXBlOworCXVpbnQzMl90CQlvcGNvZGU7CisJdWludDMyX3QJCWFkYXBubzsKKwl1aW50NjRfdAkJY21kYnVmOworCXVpbnQzMl90CQl4ZmVybGVuOworCXVpbnQzMl90CQlkYXRhX2RpcjsKKwlpbnQzMl90CQkJc3RhdHVzOworCXVpbnQ4X3QJCQlyZXNlcnZlZFsxMjhdOworCisvKiBEcml2ZXIgRGF0YTogKi8KKwl2b2lkIF9fdXNlciAqCQl1c2VyX2RhdGE7CisJdWludDMyX3QJCXVzZXJfZGF0YV9sZW47CisJbXJhaWRfcGFzc3RocnVfdAlfX3VzZXIgKnVzZXJfcHRocnU7CisKKwltcmFpZF9wYXNzdGhydV90CSpwdGhydTMyOworCWRtYV9hZGRyX3QJCXB0aHJ1MzJfaDsKKworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwl2b2lkCQkJKCpkb25lKShzdHJ1Y3QgdWlvYyopOworCisJY2FkZHJfdAkJCWJ1Zl92YWRkcjsKKwlkbWFfYWRkcl90CQlidWZfcGFkZHI7CisJaW50OF90CQkJcG9vbF9pbmRleDsKKwl1aW50OF90CQkJZnJlZV9idWY7CisKKwl1aW50OF90CQkJdGltZWRvdXQ7CisKK30gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTAyNCkscGFja2VkKSkgdWlvY190OworCisKKy8qKgorICogc3RydWN0IG1yYWlkX2hiYV9pbmZvIC0gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyb2xsZXIKKyAqCisgKiBAcGFyYW0gcGNpX3ZlbmRvcl9pZAkJOiBQQ0kgdmVuZG9yIGlkCisgKiBAcGFyYW0gcGNpX2RldmljZV9pZAkJOiBQQ0kgZGV2aWNlIGlkCisgKiBAcGFyYW0gc3Vic3lzdGVtX3ZlbmRvcl9pZAk6IFBDSSBzdWJzeXN0ZW0gdmVuZG9yIGlkCisgKiBAcGFyYW0gc3Vic3lzdGVtX2RldmljZV9pZAk6IFBDSSBzdWJzeXN0ZW0gZGV2aWNlIGlkCisgKiBAcGFyYW0gYmFzZXBvcnQJCTogYmFzZSBwb3J0IG9mIGhiYSBtZW1vcnkKKyAqIEBwYXJhbSBwY2lfYnVzCQk6IFBDSSBidXMKKyAqIEBwYXJhbSBwY2lfZGV2X2ZuCQk6IFBDSSBkZXZpY2UvZnVuY3Rpb24gdmFsdWVzCisgKiBAcGFyYW0gaXJxCQkJOiBpbnRlcnJ1cHQgdmVjdG9yIGZvciB0aGUgZGV2aWNlCisgKgorICogRXh0ZW5kZWQgaW5mb3JtYXRpb24gb2YgMjU2IGJ5dGVzIGFib3V0IHRoZSBjb250cm9sbGVyLiBBbGlnbiBvbiB0aGUgc2luZ2xlCisgKiBieXRlIGJvdW5kYXJ5IHNvIHRoYXQgMzItYml0IGFwcGxpY2F0aW9ucyBjYW4gYmUgcnVuIG9uIDY0LWJpdCBwbGF0Zm9ybQorICogZHJpdmVycyB3aXRob3VnIHJlLWNvbXBpbGF0aW9uLgorICogTk9URTogcmVkdWNlIHRoZSBudW1iZXIgb2YgcmVzZXJ2ZWQgYnl0ZXMgd2hlbmV2ZXIgbmV3IGZpZWxkIGFyZSBhZGRlZCwgc28KKyAqIHRoYXQgdG90YWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIHJlbWFpbnMgMjU2IGJ5dGVzLgorICovCit0eXBlZGVmIHN0cnVjdCBtcmFpZF9oYmFfaW5mbyB7CisKKwl1aW50MTZfdAlwY2lfdmVuZG9yX2lkOworCXVpbnQxNl90CXBjaV9kZXZpY2VfaWQ7CisJdWludDE2X3QJc3Vic3lzX3ZlbmRvcl9pZDsKKwl1aW50MTZfdAlzdWJzeXNfZGV2aWNlX2lkOworCisJdWludDY0X3QJYmFzZXBvcnQ7CisJdWludDhfdAkJcGNpX2J1czsKKwl1aW50OF90CQlwY2lfZGV2X2ZuOworCXVpbnQ4X3QJCXBjaV9zbG90OworCXVpbnQ4X3QJCWlycTsKKworCXVpbnQzMl90CXVuaXF1ZV9pZDsKKwl1aW50MzJfdAlob3N0X25vOworCisJdWludDhfdAkJbnVtX2xkcnY7Cit9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDI1NiksIHBhY2tlZCkpIG1yYWlkX2hiYV9pbmZvX3Q7CisKKworLyoqCisgKiBtY29udHJvbGxlcgk6IGFkYXB0ZXIgaW5mbyBzdHJ1Y3R1cmUgZm9yIG9sZCBtaW1kX3QgYXBwcworICoKKyAqIEBiYXNlCTogYmFzZSBhZGRyZXNzCisgKiBAaXJxCQk6IGlycSBudW1iZXIKKyAqIEBudW1sZHJ2CTogbnVtYmVyIG9mIGxvZ2ljYWwgZHJpdmVzCisgKiBAcGNpYnVzCTogcGNpIGJ1cworICogQHBjaWRldgk6IHBjaSBkZXZpY2UKKyAqIEBwY2lmdW4JOiBwY2kgZnVuY3Rpb24KKyAqIEBwY2lpZAk6IHBjaSBpZAorICogQHBjaXZlbmRvcgk6IHZlbmRvciBpZAorICogQHBjaXNsb3QJOiBzbG90IG51bWJlcgorICogQHVpZAkJOiB1bmlxdWUgaWQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWNvbnRyb2xsZXIgeworCisJdWludDY0X3QJYmFzZTsKKwl1aW50OF90CQlpcnE7CisJdWludDhfdAkJbnVtbGRydjsKKwl1aW50OF90CQlwY2lidXM7CisJdWludDE2X3QJcGNpZGV2OworCXVpbnQ4X3QJCXBjaWZ1bjsKKwl1aW50MTZfdAlwY2lpZDsKKwl1aW50MTZfdAlwY2l2ZW5kb3I7CisJdWludDhfdAkJcGNpc2xvdDsKKwl1aW50MzJfdAl1aWQ7CisKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1jb250cm9sbGVyX3Q7CisKKworLyoqCisgKiBtbV9kbWFwb29sX3QJOiBSZXByZXNlbnRzIG9uZSBkbWEgcG9vbCB3aXRoIGp1c3Qgb25lIGJ1ZmZlcgorICoKKyAqIEB2YWRkcgk6IFZpcnR1YWwgYWRkcmVzcworICogQHBhZGRyCTogRE1BIHBoeXNpY2FsbCBhZGRyZXNzCisgKiBAYnVmc2l6ZQk6IEluIEtCIC0gNCA9IDRrLCA4ID0gOGsgZXRjLgorICogQGhhbmRsZQk6IEhhbmRsZSB0byB0aGUgZG1hIHBvb2wKKyAqIEBsb2NrCTogbG9jayB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlIHBvb2wKKyAqIEBpbl91c2UJOiBJZiBwb29sIGFscmVhZHkgaW4gdXNlLCBhdHRhY2ggbmV3IGJsb2NrCisgKi8KK3R5cGVkZWYgc3RydWN0IG1tX2RtYXBvb2wgeworCWNhZGRyX3QJCXZhZGRyOworCWRtYV9hZGRyX3QJcGFkZHI7CisJdWludDMyX3QJYnVmX3NpemU7CisJc3RydWN0IGRtYV9wb29sCSpoYW5kbGU7CisJc3BpbmxvY2tfdAlsb2NrOworCXVpbnQ4X3QJCWluX3VzZTsKK30gbW1fZG1hcG9vbF90OworCisKKy8qKgorICogbXJhaWRfbW1hZHBfdDogU3RydWN0dXJlIHRoYXQgZHJpdmVycyBwYXNzIGR1cmluZyAodW4pcmVnaXN0cmF0aW9uCisgKgorICogQHVuaXF1ZV9pZAkJOiBBbnkgdW5pcXVlIGlkICh1c3VhbGx5IFBDSSBidXMrZGV2K2ZuKQorICogQGRydnJfdHlwZQkJOiBtZWdhcmFpZCBvciBocGUgKERSVlJUWVBFX01CT1ggb3IgRFJWUlRZUEVfSFBFKQorICogQGRydl9kYXRhCQk6IERyaXZlciBzcGVjaWZpYzsgbm90IHRvdWNoZWQgYnkgdGhlIGNvbW1vbiBtb2R1bGUKKyAqIEB0aW1lb3V0CQk6IHRpbWVvdXQgZm9yIGlzc3VlZCBraW9jcworICogQG1heF9raW9jCQk6IE1heGltdW0gaW9jdGwgcGFja2V0cyBhY2NlcHRhYmxlIGJ5IHRoZSBsbGQKKyAqIEBwZGV2CQk6IHBjaSBkZXY7IHVzZWQgZm9yIGFsbG9jYXRpbmcgZG1hJ2JsZSBtZW1vcnkKKyAqIEBpc3N1ZV91aW9jCQk6IERyaXZlciBzdXBwbGllZCByb3V0aW5lIHRvIGlzc3VlIHVpb2NfdCBjb21tYW5kcworICoJCQk6IGlzc3VlX3Vpb2MoZHJ2cl9kYXRhLCBraW9jLCBJU1NVRS9BQk9SVCwgdWlvY19kb25lKQorICogQHF1aWVzY2VudAkJOiBmbGFnIHRvIGluZGljYXRlIGlmIGlvY3RsIGNhbiBiZSBpc3N1ZWQgdG8gdGhpcyBhZHAKKyAqIEBsaXN0CQk6IGF0dGFjaCB3aXRoIHRoZSBnbG9iYWwgbGlzdCBvZiBhZGFwdGVycworICogQGtpb2NfbGlzdAkJOiBibG9jayBvZiBtZW0gZm9yIEBtYXhfa2lvYyBudW1iZXIgb2Yga2lvY3MKKyAqIEBraW9jX3Bvb2wJCTogcG9vbCBvZiBmcmVlIGtpb2NzCisgKiBAa2lvY19wb29sX2xvY2sJOiBwcm90ZWN0aW9uIGZvciBmcmVlIHBvb2wKKyAqIEBraW9jX3NlbWFwaG9yZQk6IHNvIGFzIG5vdCB0byBleGNlZWQgQG1heF9raW9jIHBhcmFsbGVsIGlvY3RscworICogQG1ib3hfbGlzdAkJOiBibG9jayBvZiBtZW0gZm9yIEBtYXhfa2lvYyBudW1iZXIgb2YgbWJveGVzCisgKiBAcHRocnVfZG1hX3Bvb2wJOiBETUEgcG9vbCB0byBhbGxvY2F0ZSBwYXNzdGhydSBwYWNrZXRzCisgKiBAZG1hX3Bvb2xfbGlzdAk6IGFycmF5IG9mIGRtYSBwb29scworICovCisKK3R5cGVkZWYgc3RydWN0IG1yYWlkX21tYWRwIHsKKworLyogRmlsbGVkIGJ5IGRyaXZlciAqLworCisJdWludDMyX3QJCXVuaXF1ZV9pZDsKKwl1aW50MzJfdAkJZHJ2cl90eXBlOworCXVuc2lnbmVkIGxvbmcJCWRydnJfZGF0YTsKKwl1aW50MTZfdAkJdGltZW91dDsKKwl1aW50OF90CQkJbWF4X2tpb2M7CisKKwlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CisKKwlpbnQoKmlzc3VlX3Vpb2MpKHVuc2lnbmVkIGxvbmcsIHVpb2NfdCAqLCB1aW50MzJfdCk7CisKKy8qIE1haW50YWluZWQgYnkgY29tbW9uIG1vZHVsZSAqLworCXVpbnQzMl90CQlxdWllc2NlbnQ7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJdWlvY190CQkJKmtpb2NfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWtpb2NfcG9vbDsKKwlzcGlubG9ja190CQlraW9jX3Bvb2xfbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlCWtpb2Nfc2VtYXBob3JlOworCisJbWJveDY0X3QJCSptYm94X2xpc3Q7CisJc3RydWN0IGRtYV9wb29sCQkqcHRocnVfZG1hX3Bvb2w7CisJbW1fZG1hcG9vbF90CQlkbWFfcG9vbF9saXN0W01BWF9ETUFfUE9PTFNdOworCit9IG1yYWlkX21tYWRwX3Q7CisKK2ludCBtcmFpZF9tbV9yZWdpc3Rlcl9hZHAobXJhaWRfbW1hZHBfdCAqKTsKK2ludCBtcmFpZF9tbV91bnJlZ2lzdGVyX2FkcCh1aW50MzJfdCk7Cit1aW50MzJfdCBtcmFpZF9tbV9hZGFwdGVyX2FwcF9oYW5kbGUodWludDMyX3QpOworCisjZW5kaWYgLyogX01FR0FSQUlEX0lPQ1RMX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbWJveC5jIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21ib3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzhmYTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21ib3guYwpAQCAtMCwwICsxLDQyNzYgQEAKKy8qCisgKgorICoJCQlMaW51eCBNZWdhUkFJRCBkZXZpY2UgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgIExTSSBMb2dpYyBDb3Jwb3JhdGlvbi4KKyAqCisgKgkgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZJTEUJCTogbWVnYXJhaWRfbWJveC5jCisgKiBWZXJzaW9uCTogdjIuMjAuNC41IChGZWIgMDMgMjAwNSkKKyAqCisgKiBBdXRob3JzOgorICogCUF0dWwgTXVra2VyCQk8QXR1bC5NdWtrZXJAbHNpbC5jb20+CisgKiAJU3JlZW5pdmFzIEJhZ2Fsa290ZQk8U3JlZW5pdmFzLkJhZ2Fsa290ZUBsc2lsLmNvbT4KKyAqIAlNYW5vaiBKb3NlCQk8TWFub2ouSm9zZUBsc2lsLmNvbT4KKyAqCisgKiBMaXN0IG9mIHN1cHBvcnRlZCBjb250cm9sbGVycworICoKKyAqIE9FTQlQcm9kdWN0IE5hbWUJCQlWSUQJRElECVNTVklECVNTSUQKKyAqIC0tLQktLS0tLS0tLS0tLS0JCQktLS0JLS0tCS0tLS0JLS0tLQorICogRGVsbCBQRVJDMy9RQwkJCTEwMUUJMTk2MAkxMDI4CTA0NzEKKyAqIERlbGwgUEVSQzMvREMJCQkxMDFFCTE5NjAJMTAyOAkwNDkzCisgKiBEZWxsIFBFUkMzL1NDCQkJMTAxRQkxOTYwCTEwMjgJMDQ3NQorICogRGVsbCBQRVJDMy9EaQkJCTEwMjgJMTk2MAkxMDI4CTAxMjMKKyAqIERlbGwgUEVSQzQvU0MJCQkxMDAwCTE5NjAJMTAyOAkwNTIwCisgKiBEZWxsIFBFUkM0L0RDCQkJMTAwMAkxOTYwCTEwMjgJMDUxOAorICogRGVsbCBQRVJDNC9RQwkJCTEwMDAJMDQwNwkxMDI4CTA1MzEKKyAqIERlbGwgUEVSQzQvRGkJCQkxMDI4CTAwMEYJMTAyOAkwMTRBCisgKiBEZWxsIFBFUkMgNGUvU2kJCQkxMDI4CTAwMTMJMTAyOAkwMTZjCisgKiBEZWxsIFBFUkMgNGUvRGkJCQkxMDI4CTAwMTMJMTAyOAkwMTZkCisgKiBEZWxsIFBFUkMgNGUvRGkJCQkxMDI4CTAwMTMJMTAyOAkwMTZlCisgKiBEZWxsIFBFUkMgNGUvRGkJCQkxMDI4CTAwMTMJMTAyOAkwMTZmCisgKiBEZWxsIFBFUkMgNGUvRGkJCQkxMDI4CTAwMTMJMTAyOAkwMTcwCisgKiBEZWxsIFBFUkMgNGUvREMJCQkxMDAwCTA0MDgJMTAyOAkwMDAyCisgKiBEZWxsIFBFUkMgNGUvU0MJCQkxMDAwCTA0MDgJMTAyOAkwMDAxCisgKgorICoKKyAqIExTSSBNZWdhUkFJRCBTQ1NJIDMyMC0wCQkxMDAwCTE5NjAJMTAwMAlBNTIwCisgKiBMU0kgTWVnYVJBSUQgU0NTSSAzMjAtMQkJMTAwMAkxOTYwCTEwMDAJMDUyMAorICogTFNJIE1lZ2FSQUlEIFNDU0kgMzIwLTIJCTEwMDAJMTk2MAkxMDAwCTA1MTgKKyAqIExTSSBNZWdhUkFJRCBTQ1NJIDMyMC0wWAkJMTAwMAkwNDA3CTEwMDAJMDUzMAorICogTFNJIE1lZ2FSQUlEIFNDU0kgMzIwLTJYCQkxMDAwCTA0MDcJMTAwMAkwNTMyCisgKiBMU0kgTWVnYVJBSUQgU0NTSSAzMjAtNFgJCTEwMDAJMDQwNwkxMDAwCTA1MzEKKyAqIExTSSBNZWdhUkFJRCBTQ1NJIDMyMC0xRQkJMTAwMAkwNDA4CTEwMDAJMDAwMQorICogTFNJIE1lZ2FSQUlEIFNDU0kgMzIwLTJFCQkxMDAwCTA0MDgJMTAwMAkwMDAyCisgKiBMU0kgTWVnYVJBSUQgU0FUQSAxNTAtNAkJMTAwMAkxOTYwCTEwMDAJNDUyMworICogTFNJIE1lZ2FSQUlEIFNBVEEgMTUwLTYJCTEwMDAJMTk2MAkxMDAwCTA1MjMKKyAqIExTSSBNZWdhUkFJRCBTQVRBIDMwMC00WAkJMTAwMAkwNDA5CTEwMDAJMzAwNAorICogTFNJIE1lZ2FSQUlEIFNBVEEgMzAwLThYCQkxMDAwCTA0MDkJMTAwMAkzMDA4CisgKgorICogSU5URUwgUkFJRCBDb250cm9sbGVyIFNSQ1U0MlgJMTAwMAkwNDA3CTgwODYJMDUzMgorICogSU5URUwgUkFJRCBDb250cm9sbGVyIFNSQ1MxNgkJMTAwMAkxOTYwCTgwODYJMDUyMworICogSU5URUwgUkFJRCBDb250cm9sbGVyIFNSQ1U0MkUJMTAwMAkwNDA4CTgwODYJMDAwMgorICogSU5URUwgUkFJRCBDb250cm9sbGVyIFNSQ1pDUlgJMTAwMAkwNDA3CTgwODYJMDUzMAorICogSU5URUwgUkFJRCBDb250cm9sbGVyIFNSQ1MyOFgJMTAwMAkwNDA5CTgwODYJMzAwOAorICogSU5URUwgUkFJRCBDb250cm9sbGVyIFNST01CVTQyRQkxMDAwCTA0MDgJODA4NgkzNDMxCisgKiBJTlRFTCBSQUlEIENvbnRyb2xsZXIgU1JPTUJVNDJFCTEwMDAJMDQwOAk4MDg2CTM0OTkKKyAqIElOVEVMIFJBSUQgQ29udHJvbGxlciBTUkNVNTFMCTEwMDAJMTk2MAk4MDg2CTA1MjAKKyAqCisgKiBGU0MJTWVnYVJBSUQgUENJIEV4cHJlc3MgUk9NQgkxMDAwCTA0MDgJMTczNAkxMDY1CisgKgorICogQUNFUglNZWdhUkFJRCBST01CLTJFCQkxMDAwCTA0MDgJMTAyNQkwMDRECisgKgorICogTkVDCU1lZ2FSQUlEIFBDSSBFeHByZXNzIFJPTUIJMTAwMAkwNDA4CTEwMzMJODI4NworICoKKyAqIEZvciBoaXN0b3J5IG9mIGNoYW5nZXMsIHNlZSBEb2N1bWVudGF0aW9uL0NoYW5nZUxvZy5tZWdhcmFpZAorICovCisKKyNpbmNsdWRlICJtZWdhcmFpZF9tYm94LmgiCisKK3N0YXRpYyBpbnQgbWVnYXJhaWRfaW5pdCh2b2lkKTsKK3N0YXRpYyB2b2lkIG1lZ2FyYWlkX2V4aXQodm9pZCk7CisKK3N0YXRpYyBpbnQgbWVnYXJhaWRfcHJvYmVfb25lKHN0cnVjdCBwY2lfZGV2KiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7CitzdGF0aWMgdm9pZCBtZWdhcmFpZF9kZXRhY2hfb25lKHN0cnVjdCBwY2lfZGV2ICopOworc3RhdGljIHZvaWQgbWVnYXJhaWRfbWJveF9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICopOworCitzdGF0aWMgaW50IG1lZ2FyYWlkX2lvX2F0dGFjaChhZGFwdGVyX3QgKik7CitzdGF0aWMgdm9pZCBtZWdhcmFpZF9pb19kZXRhY2goYWRhcHRlcl90ICopOworCitzdGF0aWMgaW50IG1lZ2FyYWlkX2luaXRfbWJveChhZGFwdGVyX3QgKik7CitzdGF0aWMgdm9pZCBtZWdhcmFpZF9maW5pX21ib3goYWRhcHRlcl90ICopOworCitzdGF0aWMgaW50IG1lZ2FyYWlkX2FsbG9jX2NtZF9wYWNrZXRzKGFkYXB0ZXJfdCAqKTsKK3N0YXRpYyB2b2lkIG1lZ2FyYWlkX2ZyZWVfY21kX3BhY2tldHMoYWRhcHRlcl90ICopOworCitzdGF0aWMgaW50IG1lZ2FyYWlkX21ib3hfc2V0dXBfZG1hX3Bvb2xzKGFkYXB0ZXJfdCAqKTsKK3N0YXRpYyB2b2lkIG1lZ2FyYWlkX21ib3hfdGVhcmRvd25fZG1hX3Bvb2xzKGFkYXB0ZXJfdCAqKTsKKworc3RhdGljIGludCBtZWdhcmFpZF9zeXNmc19hbGxvY19yZXNvdXJjZXMoYWRhcHRlcl90ICopOworc3RhdGljIHZvaWQgbWVnYXJhaWRfc3lzZnNfZnJlZV9yZXNvdXJjZXMoYWRhcHRlcl90ICopOworCitzdGF0aWMgaW50IG1lZ2FyYWlkX2Fib3J0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyBpbnQgbWVnYXJhaWRfcmVzZXRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICopOworCitzdGF0aWMgaW50IG1ib3hfcG9zdF9zeW5jX2NtZChhZGFwdGVyX3QgKiwgdWludDhfdCBbXSk7CitzdGF0aWMgaW50IG1ib3hfcG9zdF9zeW5jX2NtZF9mYXN0KGFkYXB0ZXJfdCAqLCB1aW50OF90IFtdKTsKK3N0YXRpYyBpbnQgbWVnYXJhaWRfYnVzeXdhaXRfbWJveChtcmFpZF9kZXZpY2VfdCAqKTsKK3N0YXRpYyBpbnQgbWVnYXJhaWRfbWJveF9wcm9kdWN0X2luZm8oYWRhcHRlcl90ICopOworc3RhdGljIGludCBtZWdhcmFpZF9tYm94X2V4dGVuZGVkX2NkYihhZGFwdGVyX3QgKik7CitzdGF0aWMgaW50IG1lZ2FyYWlkX21ib3hfc3VwcG9ydF9oYShhZGFwdGVyX3QgKiwgdWludDE2X3QgKik7CitzdGF0aWMgaW50IG1lZ2FyYWlkX21ib3hfc3VwcG9ydF9yYW5kb21fZGVsKGFkYXB0ZXJfdCAqKTsKK3N0YXRpYyBpbnQgbWVnYXJhaWRfbWJveF9nZXRfbWF4X3NnKGFkYXB0ZXJfdCAqKTsKK3N0YXRpYyB2b2lkIG1lZ2FyYWlkX21ib3hfZW51bV9yYWlkX3Njc2koYWRhcHRlcl90ICopOworc3RhdGljIHZvaWQgbWVnYXJhaWRfbWJveF9mbHVzaF9jYWNoZShhZGFwdGVyX3QgKik7CisKK3N0YXRpYyB2b2lkIG1lZ2FyYWlkX21ib3hfZGlzcGxheV9zY2IoYWRhcHRlcl90ICosIHNjYl90ICopOworc3RhdGljIHZvaWQgbWVnYXJhaWRfbWJveF9zZXR1cF9kZXZpY2VfbWFwKGFkYXB0ZXJfdCAqKTsKKworc3RhdGljIGludCBtZWdhcmFpZF9xdWV1ZV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKiwKKwkJdm9pZCAoKikoc3RydWN0IHNjc2lfY21uZCAqKSk7CitzdGF0aWMgc2NiX3QgKm1lZ2FyYWlkX21ib3hfYnVpbGRfY21kKGFkYXB0ZXJfdCAqLCBzdHJ1Y3Qgc2NzaV9jbW5kICosIGludCAqKTsKK3N0YXRpYyB2b2lkIG1lZ2FyYWlkX21ib3hfcnVucGVuZHEoYWRhcHRlcl90ICosIHNjYl90ICopOworc3RhdGljIHZvaWQgbWVnYXJhaWRfbWJveF9wcmVwYXJlX3B0aHJ1KGFkYXB0ZXJfdCAqLCBzY2JfdCAqLAorCQlzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIHZvaWQgbWVnYXJhaWRfbWJveF9wcmVwYXJlX2VwdGhydShhZGFwdGVyX3QgKiwgc2NiX3QgKiwKKwkJc3RydWN0IHNjc2lfY21uZCAqKTsKKworc3RhdGljIGlycXJldHVybl90IG1lZ2FyYWlkX2lzcihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CisKK3N0YXRpYyB2b2lkIG1lZ2FyYWlkX21ib3hfZHBjKHVuc2lnbmVkIGxvbmcpOworCitzdGF0aWMgc3NpemVfdCBtZWdhcmFpZF9zeXNmc19zaG93X2FwcF9obmRsKHN0cnVjdCBjbGFzc19kZXZpY2UgKiwgY2hhciAqKTsKK3N0YXRpYyBzc2l6ZV90IG1lZ2FyYWlkX3N5c2ZzX3Nob3dfbGRudW0oc3RydWN0IGRldmljZSAqLCBjaGFyICopOworCitzdGF0aWMgaW50IG1lZ2FyYWlkX2NtbV9yZWdpc3RlcihhZGFwdGVyX3QgKik7CitzdGF0aWMgaW50IG1lZ2FyYWlkX2NtbV91bnJlZ2lzdGVyKGFkYXB0ZXJfdCAqKTsKK3N0YXRpYyBpbnQgbWVnYXJhaWRfbWJveF9tbV9oYW5kbGVyKHVuc2lnbmVkIGxvbmcsIHVpb2NfdCAqLCB1aW50MzJfdCk7CitzdGF0aWMgaW50IG1lZ2FyYWlkX21ib3hfbW1fY29tbWFuZChhZGFwdGVyX3QgKiwgdWlvY190ICopOworc3RhdGljIHZvaWQgbWVnYXJhaWRfbWJveF9tbV9kb25lKGFkYXB0ZXJfdCAqLCBzY2JfdCAqKTsKK3N0YXRpYyBpbnQgZ2F0aGVyX2hiYWluZm8oYWRhcHRlcl90ICosIG1yYWlkX2hiYV9pbmZvX3QgKik7CitzdGF0aWMgaW50IHdhaXRfdGlsbF9md19lbXB0eShhZGFwdGVyX3QgKik7CisKKworCitNT0RVTEVfQVVUSE9SKCJMU0kgTG9naWMgQ29ycG9yYXRpb24iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTFNJIExvZ2ljIE1lZ2FSQUlEIE1haWxib3ggRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihNRUdBUkFJRF9WRVJTSU9OKTsKKworLyoKKyAqICMjIyBtb2R1bGVzIHBhcmFtZXRlcnMgZm9yIGRyaXZlciAjIyMKKyAqLworCisvKioKKyAqIFNldCB0byBlbmFibGUgZHJpdmVyIHRvIGV4cG9zZSB1bmNvbmZpZ3VyZWQgZGlzayB0byBrZXJuZWwKKyAqLworc3RhdGljIGludCBtZWdhcmFpZF9leHBvc2VfdW5jb25mX2Rpc2tzID0gMDsKK21vZHVsZV9wYXJhbV9uYW1lZCh1bmNvbmZfZGlza3MsIG1lZ2FyYWlkX2V4cG9zZV91bmNvbmZfZGlza3MsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHVuY29uZl9kaXNrcywKKwkiU2V0IHRvIGV4cG9zZSB1bmNvbmZpZ3VyZWQgZGlza3MgdG8ga2VybmVsIChkZWZhdWx0PTApIik7CisKKy8qKgorICogZHJpdmVyIHdhaXQgdGltZSBpZiB0aGUgYWRhcHRlcidzIG1haWxib3ggaXMgYnVzeQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IG1heF9tYm94X2J1c3lfd2FpdCA9IE1CT1hfQlVTWV9XQUlUOworbW9kdWxlX3BhcmFtX25hbWVkKGJ1c3lfd2FpdCwgbWF4X21ib3hfYnVzeV93YWl0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhidXN5X3dhaXQsCisJIk1heCB3YWl0IGZvciBtYWlsYm94IGluIG1pY3Jvc2Vjb25kcyBpZiBidXN5IChkZWZhdWx0PTEwKSIpOworCisvKioKKyAqIG51bWJlciBvZiBzZWN0b3JzIHBlciBJTyBjb21tYW5kCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWVnYXJhaWRfbWF4X3NlY3RvcnMgPSBNQk9YX01BWF9TRUNUT1JTOworbW9kdWxlX3BhcmFtX25hbWVkKG1heF9zZWN0b3JzLCBtZWdhcmFpZF9tYXhfc2VjdG9ycywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X3NlY3RvcnMsCisJIk1heGltdW0gbnVtYmVyIG9mIHNlY3RvcnMgcGVyIElPIGNvbW1hbmQgKGRlZmF1bHQ9MTI4KSIpOworCisvKioKKyAqIG51bWJlciBvZiBjb21tYW5kcyBwZXIgbG9naWNhbCB1bml0CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWVnYXJhaWRfY21kX3Blcl9sdW4gPSBNQk9YX0RFRl9DTURfUEVSX0xVTjsKK21vZHVsZV9wYXJhbV9uYW1lZChjbWRfcGVyX2x1biwgbWVnYXJhaWRfY21kX3Blcl9sdW4sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGNtZF9wZXJfbHVuLAorCSJNYXhpbXVtIG51bWJlciBvZiBjb21tYW5kcyBwZXIgbG9naWNhbCB1bml0IChkZWZhdWx0PTY0KSIpOworCisKKy8qKgorICogRmFzdCBkcml2ZXIgbG9hZCBvcHRpb24sIHNraXAgc2Nhbm5pbmcgZm9yIHBoeXNpY2FsIGRldmljZXMgZHVyaW5nIGxvYWQuCisgKiBUaGlzIHdvdWxkIHJlc3VsdCBpbiBub24tZGlzayBkZXZpY2VzIGJlaW5nIHNraXBwZWQgZHVyaW5nIGRyaXZlciBsb2FkCisgKiB0aW1lLiBUaGVzZSBjYW4gYmUgbGF0ZXIgYWRkZWQgdGhvdWdoLCB1c2luZyAvcHJvYy9zY3NpL3Njc2kKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBtZWdhcmFpZF9mYXN0X2xvYWQgPSAwOworbW9kdWxlX3BhcmFtX25hbWVkKGZhc3RfbG9hZCwgbWVnYXJhaWRfZmFzdF9sb2FkLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmYXN0X2xvYWQsCisJIkZhc3RlciBsb2FkaW5nIG9mIHRoZSBkcml2ZXIsIHNraXBzIHBoeXNpY2FsIGRldmljZXMhIChkZWZhdWx0PTApIik7CisKKworLyoqCisgKiBtcmFpZF9kZWJ1ZyBsZXZlbCAtIHRocmVzaG9sZCBmb3IgYW1vdW50IG9mIGluZm9ybWF0aW9uIHRvIGJlIGRpc3BsYXllZCBieQorICogdGhlIGRyaXZlci4gVGhpcyBsZXZlbCBjYW4gYmUgY2hhbmdlZCB0aHJvdWdoIG1vZHVsZXMgcGFyYW1ldGVycywgaW9jdGwgb3IKKyAqIHN5c2ZzL3Byb2MgaW50ZXJmYWNlLiBCeSBkZWZhdWx0LCBwcmludCB0aGUgYW5ub3VuY2VtZW50IG1lc3NhZ2VzIG9ubHkuCisgKi8KK2ludCBtcmFpZF9kZWJ1Z19sZXZlbCA9IENMX0FOTjsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Z19sZXZlbCwgbXJhaWRfZGVidWdfbGV2ZWwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX2xldmVsLCAiRGVidWcgbGV2ZWwgZm9yIGRyaXZlciAoZGVmYXVsdD0wKSIpOworCisvKgorICogIyMjIGdsb2JhbCBkYXRhICMjIworICovCitzdGF0aWMgdWludDhfdCBtZWdhcmFpZF9tYm94X3ZlcnNpb25bOF0gPQorCXsgMHgwMiwgMHgyMCwgMHgwNCwgMHgwNSwgMiwgMywgMjAsIDUgfTsKKworCisvKgorICogUENJIHRhYmxlIGZvciBhbGwgc3VwcG9ydGVkIGNvbnRyb2xsZXJzLgorICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpX2lkX3RhYmxlX2dbXSA9ICB7CisJeworCQlQQ0lfVkVORE9SX0lEX0RFTEwsCisJCVBDSV9ERVZJQ0VfSURfUEVSQzRfRElfRElTQ09WRVJZLAorCQlQQ0lfVkVORE9SX0lEX0RFTEwsCisJCVBDSV9TVUJTWVNfSURfUEVSQzRfRElfRElTQ09WRVJZLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9QRVJDNF9TQywKKwkJUENJX1ZFTkRPUl9JRF9ERUxMLAorCQlQQ0lfU1VCU1lTX0lEX1BFUkM0X1NDLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9QRVJDNF9EQywKKwkJUENJX1ZFTkRPUl9JRF9ERUxMLAorCQlQQ0lfU1VCU1lTX0lEX1BFUkM0X0RDLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9QRVJDNF9RQywKKwkJUENJX1ZFTkRPUl9JRF9ERUxMLAorCQlQQ0lfU1VCU1lTX0lEX1BFUkM0X1FDLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0RFTEwsCisJCVBDSV9ERVZJQ0VfSURfUEVSQzRfRElfRVZFUkdMQURFUywKKwkJUENJX1ZFTkRPUl9JRF9ERUxMLAorCQlQQ0lfU1VCU1lTX0lEX1BFUkM0X0RJX0VWRVJHTEFERVMsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfREVMTCwKKwkJUENJX0RFVklDRV9JRF9QRVJDNEVfU0lfQklHQkVORCwKKwkJUENJX1ZFTkRPUl9JRF9ERUxMLAorCQlQQ0lfU1VCU1lTX0lEX1BFUkM0RV9TSV9CSUdCRU5ELAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0RFTEwsCisJCVBDSV9ERVZJQ0VfSURfUEVSQzRFX0RJX0tPQlVLLAorCQlQQ0lfVkVORE9SX0lEX0RFTEwsCisJCVBDSV9TVUJTWVNfSURfUEVSQzRFX0RJX0tPQlVLLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0RFTEwsCisJCVBDSV9ERVZJQ0VfSURfUEVSQzRFX0RJX0NPUlZFVFRFLAorCQlQQ0lfVkVORE9SX0lEX0RFTEwsCisJCVBDSV9TVUJTWVNfSURfUEVSQzRFX0RJX0NPUlZFVFRFLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0RFTEwsCisJCVBDSV9ERVZJQ0VfSURfUEVSQzRFX0RJX0VYUEVESVRJT04sCisJCVBDSV9WRU5ET1JfSURfREVMTCwKKwkJUENJX1NVQlNZU19JRF9QRVJDNEVfRElfRVhQRURJVElPTiwKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9ERUxMLAorCQlQQ0lfREVWSUNFX0lEX1BFUkM0RV9ESV9HVUFEQUxVUEUsCisJCVBDSV9WRU5ET1JfSURfREVMTCwKKwkJUENJX1NVQlNZU19JRF9QRVJDNEVfRElfR1VBREFMVVBFLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9QRVJDNEVfRENfMzIwXzJFLAorCQlQQ0lfVkVORE9SX0lEX0RFTEwsCisJCVBDSV9TVUJTWVNfSURfUEVSQzRFX0RDXzMyMF8yRSwKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9ERVZJQ0VfSURfUEVSQzRFX1NDXzMyMF8xRSwKKwkJUENJX1ZFTkRPUl9JRF9ERUxMLAorCQlQQ0lfU1VCU1lTX0lEX1BFUkM0RV9TQ18zMjBfMUUsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfQU1JLAorCQlQQ0lfREVWSUNFX0lEX0FNSV9NRUdBUkFJRDMsCisJCVBDSV9WRU5ET1JfSURfREVMTCwKKwkJUENJX1NVQlNZU19JRF9QRVJDM19RQywKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9BTUksCisJCVBDSV9ERVZJQ0VfSURfQU1JX01FR0FSQUlEMywKKwkJUENJX1ZFTkRPUl9JRF9ERUxMLAorCQlQQ0lfU1VCU1lTX0lEX1BFUkMzX0RDLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0FNSSwKKwkJUENJX0RFVklDRV9JRF9BTUlfTUVHQVJBSUQzLAorCQlQQ0lfVkVORE9SX0lEX0RFTEwsCisJCVBDSV9TVUJTWVNfSURfUEVSQzNfU0MsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfQU1JLAorCQlQQ0lfREVWSUNFX0lEX0FNSV9NRUdBUkFJRDMsCisJCVBDSV9WRU5ET1JfSURfQU1JLAorCQlQQ0lfU1VCU1lTX0lEX1BFUkMzX1NDLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0FNSSwKKwkJUENJX0RFVklDRV9JRF9BTUlfTUVHQVJBSUQzLAorCQlQQ0lfVkVORE9SX0lEX0FNSSwKKwkJUENJX1NVQlNZU19JRF9QRVJDM19EQywKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9ERVZJQ0VfSURfTUVHQVJBSURfU0NTSV8zMjBfMCwKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0NTSV8zMjBfMCwKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9ERVZJQ0VfSURfTUVHQVJBSURfU0NTSV8zMjBfMSwKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0NTSV8zMjBfMSwKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9ERVZJQ0VfSURfTUVHQVJBSURfU0NTSV8zMjBfMiwKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0NTSV8zMjBfMiwKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9ERVZJQ0VfSURfTUVHQVJBSURfU0NTSV8zMjBfMHgsCisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX1NDU0lfMzIwXzB4LAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQ1NJXzMyMF8yeCwKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0NTSV8zMjBfMngsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX01FR0FSQUlEX1NDU0lfMzIwXzR4LAorCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX1NVQlNZU19JRF9NRUdBUkFJRF9TQ1NJXzMyMF80eCwKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9ERVZJQ0VfSURfTUVHQVJBSURfU0NTSV8zMjBfMUUsCisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX1NDU0lfMzIwXzFFLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQ1NJXzMyMF8yRSwKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0NTSV8zMjBfMkUsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX01FR0FSQUlEX0k0XzEzM19SQUlELAorCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX1NVQlNZU19JRF9NRUdBUkFJRF9JNF8xMzNfUkFJRCwKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9ERVZJQ0VfSURfTUVHQVJBSURfU0FUQV8xNTBfNCwKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0FUQV8xNTBfNCwKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9ERVZJQ0VfSURfTUVHQVJBSURfU0FUQV8xNTBfNiwKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0FUQV8xNTBfNiwKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9ERVZJQ0VfSURfTUVHQVJBSURfU0FUQV8zMDBfNHgsCisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX1NBVEFfMzAwXzR4LAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQVRBXzMwMF84eCwKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0FUQV8zMDBfOHgsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX0lOVEVMX1JBSURfU1JDVTQyWCwKKwkJUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJUENJX1NVQlNZU19JRF9JTlRFTF9SQUlEX1NSQ1U0MlgsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX0lOVEVMX1JBSURfU1JDUzE2LAorCQlQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQlQQ0lfU1VCU1lTX0lEX0lOVEVMX1JBSURfU1JDUzE2LAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9JTlRFTF9SQUlEX1NSQ1U0MkUsCisJCVBDSV9WRU5ET1JfSURfSU5URUwsCisJCVBDSV9TVUJTWVNfSURfSU5URUxfUkFJRF9TUkNVNDJFLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9JTlRFTF9SQUlEX1NSQ1pDUlgsCisJCVBDSV9WRU5ET1JfSURfSU5URUwsCisJCVBDSV9TVUJTWVNfSURfSU5URUxfUkFJRF9TUkNaQ1JYLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9JTlRFTF9SQUlEX1NSQ1MyOFgsCisJCVBDSV9WRU5ET1JfSURfSU5URUwsCisJCVBDSV9TVUJTWVNfSURfSU5URUxfUkFJRF9TUkNTMjhYLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9JTlRFTF9SQUlEX1NST01CVTQyRV9BTElFRiwKKwkJUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJUENJX1NVQlNZU19JRF9JTlRFTF9SQUlEX1NST01CVTQyRV9BTElFRiwKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9ERVZJQ0VfSURfSU5URUxfUkFJRF9TUk9NQlU0MkVfSEFSV0lDSCwKKwkJUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJUENJX1NVQlNZU19JRF9JTlRFTF9SQUlEX1NST01CVTQyRV9IQVJXSUNILAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9JTlRFTF9SQUlEX1NSQ1U0MUxfTEFLRV9TSEVURUssCisJCVBDSV9WRU5ET1JfSURfSU5URUwsCisJCVBDSV9TVUJTWVNfSURfSU5URUxfUkFJRF9TUkNVNDFMX0xBS0VfU0hFVEVLLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9GU0NfTUVHQVJBSURfUENJX0VYUFJFU1NfUk9NQiwKKwkJUENJX1NVQlNZU19JRF9GU0MsCisJCVBDSV9TVUJTWVNfSURfRlNDX01FR0FSQUlEX1BDSV9FWFBSRVNTX1JPTUIsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX01FR0FSQUlEX0FDRVJfUk9NQl8yRSwKKwkJUENJX1ZFTkRPUl9JRF9BSSwKKwkJUENJX1NVQlNZU19JRF9NRUdBUkFJRF9BQ0VSX1JPTUJfMkUsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX01FR0FSQUlEX05FQ19ST01CXzJFLAorCQlQQ0lfVkVORE9SX0lEX05FQywKKwkJUENJX1NVQlNZU19JRF9NRUdBUkFJRF9ORUNfUk9NQl8yRSwKKwl9LAorCXswfQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwY2lfaWRfdGFibGVfZyk7CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG1lZ2FyYWlkX3BjaV9kcml2ZXJfZyA9IHsKKwkubmFtZQkJPSAibWVnYXJhaWQiLAorCS5pZF90YWJsZQk9IHBjaV9pZF90YWJsZV9nLAorCS5wcm9iZQkJPSBtZWdhcmFpZF9wcm9iZV9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtZWdhcmFpZF9kZXRhY2hfb25lKSwKKwkuZHJpdmVyCQk9IHsKKwkJLnNodXRkb3duCT0gbWVnYXJhaWRfbWJveF9zaHV0ZG93biwKKwl9Cit9OworCisKKworLy8gZGVmaW5pdGlvbnMgZm9yIHRoZSBkZXZpY2UgYXR0cmlidXRlcyBmb3IgZXhwb3J0aW5nIGxvZ2ljYWwgZHJpdmUgbnVtYmVyCisvLyBmb3IgYSBzY3NpIGFkZHJlc3MgKEhvc3QsIENoYW5uZWwsIElkLCBMdW4pCisKK0NMQVNTX0RFVklDRV9BVFRSKG1lZ2FyYWlkX21ib3hfYXBwX2huZGwsIFNfSVJVU1IsIG1lZ2FyYWlkX3N5c2ZzX3Nob3dfYXBwX2huZGwsCisJCU5VTEwpOworCisvLyBIb3N0IHRlbXBsYXRlIGluaXRpYWxpemVyIGZvciBtZWdhcmFpZCBtYm94IHN5c2ZzIGRldmljZSBhdHRyaWJ1dGVzCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKm1lZ2FyYWlkX3Nob3N0X2F0dHJzW10gPSB7CisJJmNsYXNzX2RldmljZV9hdHRyX21lZ2FyYWlkX21ib3hfYXBwX2huZGwsCisJTlVMTCwKK307CisKKworREVWSUNFX0FUVFIobWVnYXJhaWRfbWJveF9sZCwgU19JUlVTUiwgbWVnYXJhaWRfc3lzZnNfc2hvd19sZG51bSwgTlVMTCk7CisKKy8vIEhvc3QgdGVtcGxhdGUgaW5pdGlhbGl6ZXIgZm9yIG1lZ2FyYWlkIG1ib3ggc3lzZnMgZGV2aWNlIGF0dHJpYnV0ZXMKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWVnYXJhaWRfc2Rldl9hdHRyc1tdID0geworCSZkZXZfYXR0cl9tZWdhcmFpZF9tYm94X2xkLAorCU5VTEwsCit9OworCisKKy8qCisgKiBTY3NpIGhvc3QgdGVtcGxhdGUgZm9yIG1lZ2FyYWlkIHVuaWZpZWQgZHJpdmVyCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIG1lZ2FyYWlkX3RlbXBsYXRlX2cgPSB7CisJLm1vZHVsZQkJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJCT0gIkxTSSBMb2dpYyBNZWdhUkFJRCBkcml2ZXIiLAorCS5wcm9jX25hbWUJCQk9ICJtZWdhcmFpZCIsCisJLnF1ZXVlY29tbWFuZAkJCT0gbWVnYXJhaWRfcXVldWVfY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlcgkJPSBtZWdhcmFpZF9hYm9ydF9oYW5kbGVyLAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcgk9IG1lZ2FyYWlkX3Jlc2V0X2hhbmRsZXIsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCQk9IG1lZ2FyYWlkX3Jlc2V0X2hhbmRsZXIsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgkJPSBtZWdhcmFpZF9yZXNldF9oYW5kbGVyLAorCS51c2VfY2x1c3RlcmluZwkJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLnNkZXZfYXR0cnMJCQk9IG1lZ2FyYWlkX3NkZXZfYXR0cnMsCisJLnNob3N0X2F0dHJzCQkJPSBtZWdhcmFpZF9zaG9zdF9hdHRycywKK307CisKKworLyoqCisgKiBtZWdhcmFpZF9pbml0IC0gbW9kdWxlIGxvYWQgaG9vaworICoKKyAqIFdlIHJlZ2lzdGVyIG91cnNlbHZlcyBhcyBob3RwbHVnIGVuYWJsZWQgbW9kdWxlIGFuZCBsZXQgUENJIHN1YnN5c3RlbQorICogZGlzY292ZXIgb3VyIGFkYXRlcnMKKyAqKi8KK3N0YXRpYyBpbnQgX19pbml0CittZWdhcmFpZF9pbml0KHZvaWQpCit7CisJaW50CXJ2YWw7CisKKwkvLyBBbm5vdW5jZSB0aGUgZHJpdmVyIHZlcnNpb24KKwljb25fbG9nKENMX0FOTiwgKEtFUk5fSU5GTyAibWVnYXJhaWQ6ICVzICVzXG4iLCBNRUdBUkFJRF9WRVJTSU9OLAorCQlNRUdBUkFJRF9FWFRfVkVSU0lPTikpOworCisJLy8gY2hlY2sgdmFsaWRpdHkgb2YgbW9kdWxlIHBhcmFtZXRlcnMKKwlpZiAobWVnYXJhaWRfY21kX3Blcl9sdW4gPiBNQk9YX01BWF9TQ1NJX0NNRFMpIHsKKworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkIG1haWxib3g6IG1heCBjb21tYW5kcyBwZXIgbHVuIHJlc2V0IHRvICVkXG4iLAorCQkJTUJPWF9NQVhfU0NTSV9DTURTKSk7CisKKwkJbWVnYXJhaWRfY21kX3Blcl9sdW4gPSBNQk9YX01BWF9TQ1NJX0NNRFM7CisJfQorCisKKwkvLyByZWdpc3RlciBhcyBhIFBDSSBob3QtcGx1ZyBkcml2ZXIgbW9kdWxlCisJaWYgKChydmFsID0gcGNpX21vZHVsZV9pbml0KCZtZWdhcmFpZF9wY2lfZHJpdmVyX2cpKSkgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiBjb3VsZCBub3QgcmVnaXN0ZXIgaG90cGx1ZyBzdXBwb3J0LlxuIikpOworCX0KKworCXJldHVybiBydmFsOworfQorCisKKy8qKgorICogbWVnYXJhaWRfZXhpdCAtIGRyaXZlciB1bmxvYWQgZW50cnkgcG9pbnQKKyAqCisgKiBXZSBzaW1wbHkgdW53cmFwIHRoZSBtZWdhcmFpZF9pbml0IHJvdXRpbmUgaGVyZQorICovCitzdGF0aWMgdm9pZCBfX2V4aXQKK21lZ2FyYWlkX2V4aXQodm9pZCkKK3sKKwljb25fbG9nKENMX0RMRVZFTDEsIChLRVJOX05PVElDRSAibWVnYXJhaWQ6IHVubG9hZGluZyBmcmFtZXdvcmtcbiIpKTsKKworCS8vIHVucmVnaXN0ZXIgYXMgUENJIGhvdHBsdWcgZHJpdmVyCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZtZWdhcmFpZF9wY2lfZHJpdmVyX2cpOworCisJcmV0dXJuOworfQorCisKKy8qKgorICogbWVnYXJhaWRfcHJvYmVfb25lIC0gUENJIGhvdHBsdWcgZW50cnkgcG9pbnQKKyAqIEBwYXJhbSBwZGV2CTogaGFuZGxlIHRvIHRoaXMgY29udHJvbGxlcidzIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlCisgKiBAcGFyYW0gaWQJOiBwY2kgZGV2aWNlIGlkIG9mIHRoZSBjbGFzcyBvZiBjb250cm9sbGVycworICoKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIGEgbmV3IGFkYXB0ZXIgaXMgZGV0ZWN0ZWQgYnkgdGhlCisgKiBQQ0kgaG90cGx1ZyBzdXNic3l0ZW0uCisgKiovCitzdGF0aWMgaW50IF9fZGV2aW5pdAorbWVnYXJhaWRfcHJvYmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJYWRhcHRlcl90CSphZGFwdGVyOworCisKKwkvLyBkZXRlY3RlZCBhIG5ldyBjb250cm9sbGVyCisJY29uX2xvZyhDTF9BTk4sIChLRVJOX0lORk8KKwkJIm1lZ2FyYWlkOiBwcm9iZSBuZXcgZGV2aWNlICUjNC4wNHg6JSM0LjA0eDolIzQuMDR4OiUjNC4wNHg6ICIsCisJCXBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlLCBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLAorCQlwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKSk7CisKKwljb25fbG9nKENMX0FOTiwgKCJidXMgJWQ6c2xvdCAlZDpmdW5jICVkXG4iLCBwZGV2LT5idXMtPm51bWJlciwKKwkJUENJX1NMT1QocGRldi0+ZGV2Zm4pLCBQQ0lfRlVOQyhwZGV2LT5kZXZmbikpKTsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJCSJtZWdhcmFpZDogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkXG4iKSk7CisKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLy8gRW5hYmxlIGJ1cy1tYXN0ZXJpbmcgb24gdGhpcyBjb250cm9sbGVyCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvLyBBbGxvY2F0ZSB0aGUgcGVyIGRyaXZlciBpbml0aWFsaXphdGlvbiBzdHJ1Y3R1cmUKKwlhZGFwdGVyID0ga21hbGxvYyhzaXplb2YoYWRhcHRlcl90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoYWRhcHRlciA9PSBOVUxMKSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCSJtZWdhcmFpZDogb3V0IG9mIG1lbW9yeSwgJXMgJWQuXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKSk7CisKKwkJZ290byBvdXRfcHJvYmVfb25lOworCX0KKwltZW1zZXQoYWRhcHRlciwgMCwgc2l6ZW9mKGFkYXB0ZXJfdCkpOworCisKKwkvLyBzZXQgdXAgUENJIHJlbGF0ZWQgc29mdCBzdGF0ZSBhbmQgb3RoZXIgcHJlLWtub3duIHBhcmFtZXRlcnMKKwlhZGFwdGVyLT51bmlxdWVfaWQJPSBwZGV2LT5idXMtPm51bWJlciA8PCA4IHwgcGRldi0+ZGV2Zm47CisJYWRhcHRlci0+aXJxCQk9IHBkZXYtPmlycTsKKwlhZGFwdGVyLT5wZGV2CQk9IHBkZXY7CisKKwlhdG9taWNfc2V0KCZhZGFwdGVyLT5iZWluZ19kZXRhY2hlZCwgMCk7CisKKwkvLyBTZXR1cCB0aGUgZGVmYXVsdCBETUEgbWFzay4gVGhpcyB3b3VsZCBiZSBjaGFuZ2VkIGxhdGVyIG9uCisJLy8gZGVwZW5kaW5nIG9uIGhhcmR3YXJlIGNhcGFiaWxpdGllcworCWlmIChwY2lfc2V0X2RtYV9tYXNrKGFkYXB0ZXItPnBkZXYsIDB4RkZGRkZGRkYpICE9IDApIHsKKworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiBwY2lfc2V0X2RtYV9tYXNrIGZhaWxlZDolZFxuIiwgX19MSU5FX18pKTsKKworCQlnb3RvIG91dF9mcmVlX2FkYXB0ZXI7CisJfQorCisKKwkvLyBJbml0aWFsaXplIHRoZSBzeW5jaHJvbml6YXRpb24gbG9jayBmb3Iga2VybmVsIGFuZCBMTEQKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+bG9jayk7CisJYWRhcHRlci0+aG9zdF9sb2NrID0gJmFkYXB0ZXItPmxvY2s7CisKKworCS8vIEluaXRpYWxpemUgdGhlIGNvbW1hbmQgcXVldWVzOiB0aGUgbGlzdCBvZiBmcmVlIFNDQnMgYW5kIHRoZSBsaXN0CisJLy8gb2YgcGVuZGluZyBTQ0JzLgorCUlOSVRfTElTVF9IRUFEKCZhZGFwdGVyLT5rc2NiX3Bvb2wpOworCXNwaW5fbG9ja19pbml0KFNDU0lfRlJFRV9MSVNUX0xPQ0soYWRhcHRlcikpOworCisJSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXItPnBlbmRfbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoUEVORElOR19MSVNUX0xPQ0soYWRhcHRlcikpOworCisJSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXItPmNvbXBsZXRlZF9saXN0KTsKKwlzcGluX2xvY2tfaW5pdChDT01QTEVURURfTElTVF9MT0NLKGFkYXB0ZXIpKTsKKworCisJLy8gU3RhcnQgdGhlIG1haWxib3ggYmFzZWQgY29udHJvbGxlcgorCWlmIChtZWdhcmFpZF9pbml0X21ib3goYWRhcHRlcikgIT0gMCkgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiBtYWlib3ggYWRhcHRlciBkaWQgbm90IGluaXRpYWxpemVcbiIpKTsKKworCQlnb3RvIG91dF9mcmVlX2FkYXB0ZXI7CisJfQorCisJLy8gUmVnaXN0ZXIgd2l0aCBMU0kgQ29tbW9uIE1hbmFnZW1lbnQgTW9kdWxlCisJaWYgKG1lZ2FyYWlkX2NtbV9yZWdpc3RlcihhZGFwdGVyKSAhPSAwKSB7CisKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJIm1lZ2FyYWlkOiBjb3VsZCBub3QgcmVnaXN0ZXIgd2l0aCBtYW5hZ2VtZW50IG1vZHVsZVxuIikpOworCisJCWdvdG8gb3V0X2ZpbmlfbWJveDsKKwl9CisKKwkvLyBzZXR1cCBhZGFwdGVyIGhhbmRsZSBpbiBQQ0kgc29mdCBzdGF0ZQorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBhZGFwdGVyKTsKKworCS8vIGF0dGFjaCB3aXRoIHNjc2kgbWlkLWxheWVyCisJaWYgKG1lZ2FyYWlkX2lvX2F0dGFjaChhZGFwdGVyKSAhPSAwKSB7CisKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkOiBpbyBhdHRhY2ggZmFpbGVkXG4iKSk7CisKKwkJZ290byBvdXRfY21tX3VucmVnOworCX0KKworCXJldHVybiAwOworCitvdXRfY21tX3VucmVnOgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwltZWdhcmFpZF9jbW1fdW5yZWdpc3RlcihhZGFwdGVyKTsKK291dF9maW5pX21ib3g6CisJbWVnYXJhaWRfZmluaV9tYm94KGFkYXB0ZXIpOworb3V0X2ZyZWVfYWRhcHRlcjoKKwlrZnJlZShhZGFwdGVyKTsKK291dF9wcm9iZV9vbmU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9kZXRhY2hfb25lIC0gcmVsZWFzZSB0aGUgZnJhbWV3b3JrIHJlc291cmNlcyBhbmQgY2FsbCBMTEQgcmVsZWFzZQorICogcm91dGluZQorICogQHBhcmFtIHBkZXYJOiBoYW5kbGUgZm9yIG91ciBQQ0kgY29maWd1cmF0aW9uIHNwYWNlCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBkdXJpbmcgZHJpdmVyIHVubG9hZC4gV2UgZnJlZSBhbGwgdGhlIGFsbG9jYXRlZAorICogcmVzb3VyY2VzIGFuZCBjYWxsIHRoZSBjb3JyZXNwb25kaW5nIExMRCBzbyB0aGF0IGl0IGNhbiBhbHNvIHJlbGVhc2UgYWxsCisgKiBpdHMgcmVzb3VyY2VzLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBhbHNvIGNhbGxlZCBmcm9tIHRoZSBQQ0kgaG90cGx1ZyBzeXN0ZW0KKyAqKi8KK3N0YXRpYyB2b2lkCittZWdhcmFpZF9kZXRhY2hfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWFkYXB0ZXJfdAkJKmFkYXB0ZXI7CisJc3RydWN0IFNjc2lfSG9zdAkqaG9zdDsKKworCisJLy8gU3RhcnQgYSByb2xsYmFjayBvbiB0aGlzIGFkYXB0ZXIKKwlhZGFwdGVyID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKCFhZGFwdGVyKSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9DUklUCisJCSJtZWdhcmFpZDogSW52YWxpZCBkZXRhY2ggb24gJSM0LjA0eDolIzQuMDR4OiUjNC4wNHg6JSM0LjA0eFxuIiwKKwkJCXBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlLCBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLAorCQkJcGRldi0+c3Vic3lzdGVtX2RldmljZSkpOworCisJCXJldHVybjsKKwl9CisJZWxzZSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9OT1RJQ0UKKwkJIm1lZ2FyYWlkOiBkZXRhY2hpbmcgZGV2aWNlICUjNC4wNHg6JSM0LjA0eDolIzQuMDR4OiUjNC4wNHhcbiIsCisJCQlwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwgcGRldi0+c3Vic3lzdGVtX3ZlbmRvciwKKwkJCXBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpKTsKKwl9CisKKworCWhvc3QgPSBhZGFwdGVyLT5ob3N0OworCisJLy8gZG8gbm90IGFsbG93IGFueSBtb3JlIHJlcXVlc3RzIGZyb20gdGhlIG1hbmFnZW1lbnQgbW9kdWxlIGZvciB0aGlzCisJLy8gYWRhcHRlci4KKwkvLyBGSVhNRTogSG93IGRvIHdlIGFjY291bnQgZm9yIHRoZSByZXF1ZXN0IHdoaWNoIG1pZ2h0IHN0aWxsIGJlCisJLy8gcGVuZGluZyB3aXRoIHVzPworCWF0b21pY19zZXQoJmFkYXB0ZXItPmJlaW5nX2RldGFjaGVkLCAxKTsKKworCS8vIGRldGFjaCBmcm9tIHRoZSBJTyBzdWItc3lzdGVtCisJbWVnYXJhaWRfaW9fZGV0YWNoKGFkYXB0ZXIpOworCisJLy8gcmVzZXQgdGhlIGRldmljZSBzdGF0ZSBpbiB0aGUgUENJIHN0cnVjdHVyZS4gV2UgY2hlY2sgdGhpcworCS8vIGNvbmRpdGlvbiB3aGVuIHdlIGVudGVyIGhlcmUuIElmIHRoZSBkZXZpY2Ugc3RhdGUgaXMgTlVMTCwKKwkvLyB0aGF0IHdvdWxkIG1lYW4gdGhlIGRldmljZSBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwkvLyBVbnJlZ2lzdGVyIGZyb20gY29tbW9uIG1hbmFnZW1lbnQgbW9kdWxlCisJLy8KKwkvLyBGSVhNRTogdGhpcyBtdXN0IHJldHVybiBzdWNjZXNzIG9yIGZhaWx1cmUgZm9yIGNvbmRpdGlvbnMgaWYgdGhlcmUKKwkvLyBpcyBhIGNvbW1hbmQgcGVuZGluZyB3aXRoIExMRCBvciBub3QuCisJbWVnYXJhaWRfY21tX3VucmVnaXN0ZXIoYWRhcHRlcik7CisKKwkvLyBmaW5hbGl6ZSB0aGUgbWFpbGJveCBiYXNlZCBjb250cm9sbGVyIGFuZCByZWxlYXNlIGFsbCByZXNvdXJjZXMKKwltZWdhcmFpZF9maW5pX21ib3goYWRhcHRlcik7CisKKwlrZnJlZShhZGFwdGVyKTsKKworCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlyZXR1cm47Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9tYm94X3NodXRkb3duIC0gUENJIHNodXRkb3duIGZvciBtZWdhcmFpZCBIQkEKKyAqIEBwYXJhbSBkZXZpY2UJOiBnZW5lcmljZSBkcml2ZXIgbW9kZWwgZGV2aWNlCisgKgorICogU2h1dGRvd24gbm90aWZpY2F0aW9uLCBwZXJmb3JtIGZsdXNoIGNhY2hlCisgKi8KK3N0YXRpYyB2b2lkCittZWdhcmFpZF9tYm94X3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlhZGFwdGVyX3QJCSphZGFwdGVyID0gcGNpX2dldF9kcnZkYXRhKHRvX3BjaV9kZXYoZGV2aWNlKSk7CisJc3RhdGljIGludAkJY291bnRlcjsKKworCWlmICghYWRhcHRlcikgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiBudWxsIGRldmljZSBpbiBzaHV0ZG93blxuIikpOworCQlyZXR1cm47CisJfQorCisJLy8gZmx1c2ggY2FjaGVzIG5vdworCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9JTkZPICJtZWdhcmFpZDogZmx1c2hpbmcgYWRhcHRlciAlZC4uLiIsCisJCWNvdW50ZXIrKykpOworCisJbWVnYXJhaWRfbWJveF9mbHVzaF9jYWNoZShhZGFwdGVyKTsKKworCWNvbl9sb2coQ0xfQU5OLCAoImRvbmVcbiIpKTsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX2lvX2F0dGFjaCAtIGF0dGFjaCBhIGRldmljZSB3aXRoIHRoZSBJTyBzdWJzeXN0ZW0KKyAqIEBwYXJhbSBhZGFwdGVyCTogY29udHJvbGxlcidzIHNvZnQgc3RhdGUKKyAqCisgKiBBdHRhY2ggdGhpcyBkZXZpY2Ugd2l0aCB0aGUgSU8gc3Vic3lzdGVtCisgKiovCitzdGF0aWMgaW50CittZWdhcmFpZF9pb19hdHRhY2goYWRhcHRlcl90ICphZGFwdGVyKQoreworCXN0cnVjdCBTY3NpX0hvc3QJKmhvc3Q7CisKKwkvLyBJbml0aWFsaXplIFNDU0kgSG9zdCBzdHJ1Y3R1cmUKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZtZWdhcmFpZF90ZW1wbGF0ZV9nLCA4KTsKKwlpZiAoIWhvc3QpIHsKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCSJtZWdhcmFpZCBtYm94OiBzY3NpX3JlZ2lzdGVyIGZhaWxlZFxuIikpOworCisJCXJldHVybiAtMTsKKwl9CisKKwlTQ1NJSE9TVDJBREFQKGhvc3QpCT0gKGNhZGRyX3QpYWRhcHRlcjsKKwlhZGFwdGVyLT5ob3N0CQk9IGhvc3Q7CisKKwkvLyBleHBvcnQgdGhlIHBhcmFtZXRlcnMgcmVxdWlyZWQgYnkgdGhlIG1pZC1sYXllcgorCXNjc2lfYXNzaWduX2xvY2soaG9zdCwgYWRhcHRlci0+aG9zdF9sb2NrKTsKKwlzY3NpX3NldF9kZXZpY2UoaG9zdCwgJmFkYXB0ZXItPnBkZXYtPmRldik7CisKKwlob3N0LT5pcnEJCT0gYWRhcHRlci0+aXJxOworCWhvc3QtPnVuaXF1ZV9pZAkJPSBhZGFwdGVyLT51bmlxdWVfaWQ7CisJaG9zdC0+Y2FuX3F1ZXVlCQk9IGFkYXB0ZXItPm1heF9jbWRzOworCWhvc3QtPnRoaXNfaWQJCT0gYWRhcHRlci0+aW5pdF9pZDsKKwlob3N0LT5zZ190YWJsZXNpemUJPSBhZGFwdGVyLT5zZ2xlbjsKKwlob3N0LT5tYXhfc2VjdG9ycwk9IGFkYXB0ZXItPm1heF9zZWN0b3JzOworCWhvc3QtPmNtZF9wZXJfbHVuCT0gYWRhcHRlci0+Y21kX3Blcl9sdW47CisJaG9zdC0+bWF4X2NoYW5uZWwJPSBhZGFwdGVyLT5tYXhfY2hhbm5lbDsKKwlob3N0LT5tYXhfaWQJCT0gYWRhcHRlci0+bWF4X3RhcmdldDsKKwlob3N0LT5tYXhfbHVuCQk9IGFkYXB0ZXItPm1heF9sdW47CisKKworCS8vIG5vdGlmeSBtaWQtbGF5ZXIgYWJvdXQgdGhlIG5ldyBjb250cm9sbGVyCisJaWYgKHNjc2lfYWRkX2hvc3QoaG9zdCwgJmFkYXB0ZXItPnBkZXYtPmRldikpIHsKKworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkIG1ib3g6IHNjc2lfYWRkX2hvc3QgZmFpbGVkXG4iKSk7CisKKwkJc2NzaV9ob3N0X3B1dChob3N0KTsKKworCQlyZXR1cm4gLTE7CisJfQorCisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX2lvX2RldGFjaCAtIGRldGFjaCBhIGRldmljZSBmcm9tIHRoZSBJTyBzdWJzeXN0ZW0KKyAqIEBwYXJhbSBhZGFwdGVyCTogY29udHJvbGxlcidzIHNvZnQgc3RhdGUKKyAqCisgKiBEZXRhY2ggdGhpcyBkZXZpY2UgZnJvbSB0aGUgSU8gc3Vic3lzdGVtCisgKiovCitzdGF0aWMgdm9pZAorbWVnYXJhaWRfaW9fZGV0YWNoKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0CSpob3N0OworCisJY29uX2xvZyhDTF9ETEVWRUwxLCAoS0VSTl9JTkZPICJtZWdhcmFpZDogaW8gZGV0YWNoXG4iKSk7CisKKwlob3N0ID0gYWRhcHRlci0+aG9zdDsKKworCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CisKKwlyZXR1cm47Cit9CisKKworLyoKKyAqIFNUQVJUOiBNYWlsYm94IExvdyBMZXZlbCBEcml2ZXIKKyAqCisgKiBUaGlzIGlzIHNlY3Rpb24gc3BlY2lmaWMgdG8gdGhlIHNpbmdsZSBtYWlsYm94IGJhc2VkIGNvbnRyb2xsZXJzCisgKi8KKworLyoqCisgKiBtZWdhcmFpZF9pbml0X21ib3ggLSBpbml0aWFsaXplIGNvbnRyb2xsZXIKKyAqIEBwYXJhbSBhZGFwdGVyCS0gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiAuIEFsbG9jYXRlIDE2LWJ5dGUgYWxpZ25lZCBtYWlsYm94IG1lbW9yeSBmb3IgZmlybXdhcmUgaGFuZHNoYWtlCisgKiAuIEFsbG9jYXRlIGNvbnRyb2xsZXIncyBtZW1vcnkgcmVzb3VyY2VzCisgKiAuIEZpbmQgb3V0IGFsbCBpbml0aWFsaXphdGlvbiBkYXRhCisgKiAuIEFsbG9jYXRlIG1lbW9yeSByZXF1aXJlZCBmb3IgYWxsIHRoZSBjb21tYW5kcworICogLiBVc2UgaW50ZXJuYWwgbGlicmFyeSBvZiBGVyByb3V0aW5lcywgYnVpbGQgdXAgY29tcGxldGUgc29mdCBzdGF0ZQorICovCitzdGF0aWMgaW50IF9faW5pdAorbWVnYXJhaWRfaW5pdF9tYm94KGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CisJbXJhaWRfZGV2aWNlX3QJCSpyYWlkX2RldjsKKwlpbnQJCQlpOworCisKKwlhZGFwdGVyLT5pdG8JPSBNQk9YX1RJTUVPVVQ7CisJcGRldgkJPSBhZGFwdGVyLT5wZGV2OworCisJLyoKKwkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgaW5pdCBkYXRhIHN0cnVjdHVyZSBmb3IgbWFpbGJveAorCSAqIGNvbnRyb2xsZXJzCisJICovCisJcmFpZF9kZXYgPSBrbWFsbG9jKHNpemVvZihtcmFpZF9kZXZpY2VfdCksIEdGUF9LRVJORUwpOworCWlmIChyYWlkX2RldiA9PSBOVUxMKSByZXR1cm4gLTE7CisKKwltZW1zZXQocmFpZF9kZXYsIDAsIHNpemVvZihtcmFpZF9kZXZpY2VfdCkpOworCisJLyoKKwkgKiBBdHRhY2ggdGhlIGFkYXB0ZXIgc29mdCBzdGF0ZSB0byByYWlkIGRldmljZSBzb2Z0IHN0YXRlCisJICovCisJYWRhcHRlci0+cmFpZF9kZXZpY2UJPSAoY2FkZHJfdClyYWlkX2RldjsKKwlyYWlkX2Rldi0+ZmFzdF9sb2FkCT0gbWVnYXJhaWRfZmFzdF9sb2FkOworCisKKwkvLyBvdXIgYmFzZXBvcnQKKwlyYWlkX2Rldi0+YmFzZXBvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAiTWVnYVJBSUQ6IExTSSBMb2dpYyBDb3Jwb3JhdGlvbiIpICE9IDApIHsKKworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJCSJtZWdhcmFpZDogbWVtIHJlZ2lvbiBidXN5XG4iKSk7CisKKwkJZ290byBvdXRfZnJlZV9yYWlkX2RldjsKKwl9CisKKwlyYWlkX2Rldi0+YmFzZWFkZHIgPSBpb3JlbWFwX25vY2FjaGUocmFpZF9kZXYtPmJhc2Vwb3J0LCAxMjgpOworCisJaWYgKCFyYWlkX2Rldi0+YmFzZWFkZHIpIHsKKworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiBjb3VsZCBub3QgbWFwIGhiYSBtZW1vcnlcbiIpICk7CisKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb25zOworCX0KKworCS8vCisJLy8gU2V0dXAgdGhlIHJlc3Qgb2YgdGhlIHNvZnQgc3RhdGUgdXNpbmcgdGhlIGxpYnJhcnkgb2YgRlcgcm91dGluZXMKKwkvLworCisJLy8gcmVxdWVzdCBJUlEgYW5kIHJlZ2lzdGVyIHRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lCisJaWYgKHJlcXVlc3RfaXJxKGFkYXB0ZXItPmlycSwgbWVnYXJhaWRfaXNyLCBTQV9TSElSUSwgIm1lZ2FyYWlkIiwKKwkJYWRhcHRlcikpIHsKKworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiBDb3VsZG4ndCByZWdpc3RlciBJUlEgJWQhXG4iLCBhZGFwdGVyLT5pcnEpKTsKKworCQlnb3RvIG91dF9pb3VubWFwOworCX0KKworCisJLy8gaW5pdGlhbGl6ZSB0aGUgbXV0dWFsIGV4Y2x1c2lvbiBsb2NrIGZvciB0aGUgbWFpbGJveAorCXNwaW5fbG9ja19pbml0KCZyYWlkX2Rldi0+bWFpbGJveF9sb2NrKTsKKworCS8vIGFsbG9jYXRlIG1lbW9yeSByZXF1aXJlZCBmb3IgY29tbWFuZHMKKwlpZiAobWVnYXJhaWRfYWxsb2NfY21kX3BhY2tldHMoYWRhcHRlcikgIT0gMCkgeworCQlnb3RvIG91dF9mcmVlX2lycTsKKwl9CisKKwkvLyBQcm9kdWN0IGluZm8KKwlpZiAobWVnYXJhaWRfbWJveF9wcm9kdWN0X2luZm8oYWRhcHRlcikgIT0gMCkgeworCQlnb3RvIG91dF9hbGxvY19jbWRzOworCX0KKworCS8vIERvIHdlIHN1cHBvcnQgZXh0ZW5kZWQgQ0RCcworCWFkYXB0ZXItPm1heF9jZGJfc3ogPSAxMDsKKwlpZiAobWVnYXJhaWRfbWJveF9leHRlbmRlZF9jZGIoYWRhcHRlcikgPT0gMCkgeworCQlhZGFwdGVyLT5tYXhfY2RiX3N6ID0gMTY7CisJfQorCisJLyoKKwkgKiBEbyB3ZSBzdXBwb3J0IGNsdXN0ZXIgZW52aXJvbm1lbnQsIGlmIHdlIGRvLCB3aGF0IGlzIHRoZSBpbml0aWF0b3IKKwkgKiBpZC4KKwkgKiBOT1RFOiBJbiBhIG5vbi1jbHVzdGVyIGF3YXJlIGZpcm13YXJlIGVudmlyb25tZW50LCB0aGUgTExEIHNob3VsZAorCSAqIHJldHVybiA3IGFzIGluaXRpYXRvciBpZC4KKwkgKi8KKwlhZGFwdGVyLT5oYQkJPSAwOworCWFkYXB0ZXItPmluaXRfaWQJPSAtMTsKKwlpZiAobWVnYXJhaWRfbWJveF9zdXBwb3J0X2hhKGFkYXB0ZXIsICZhZGFwdGVyLT5pbml0X2lkKSA9PSAwKSB7CisJCWFkYXB0ZXItPmhhID0gMTsKKwl9CisKKwkvKgorCSAqIFByZXBhcmUgdGhlIGRldmljZSBpZHMgYXJyYXkgdG8gaGF2ZSB0aGUgbWFwcGluZyBiZXR3ZWVuIHRoZSBrZXJuZWwKKwkgKiBkZXZpY2UgYWRkcmVzcyBhbmQgbWVnYXJhaWQgZGV2aWNlIGFkZHJlc3MuCisJICogV2UgZXhwb3J0IHRoZSBwaHlzaWNhbCBkZXZpY2VzIG9uIHRoZWlyIGFjdHVhbCBhZGRyZXNzZXMuIFRoZQorCSAqIGxvZ2ljYWwgZHJpdmVzIGFyZSBleHBvcnRlZCBvbiBhIHZpcnR1YWwgU0NTSSBjaGFubmVsCisJICovCisJbWVnYXJhaWRfbWJveF9zZXR1cF9kZXZpY2VfbWFwKGFkYXB0ZXIpOworCisJLy8gSWYgdGhlIGZpcm13YXJlIHN1cHBvcnRzIHJhbmRvbSBkZWxldGlvbiwgdXBkYXRlIHRoZSBkZXZpY2UgaWQgbWFwCisJaWYgKG1lZ2FyYWlkX21ib3hfc3VwcG9ydF9yYW5kb21fZGVsKGFkYXB0ZXIpKSB7CisKKwkJLy8gQ2hhbmdlIHRoZSBsb2dpY2FsIGRyaXZlcyBudW1iZXJzIGluIGRldmljZV9pZHMgYXJyYXkgb25lCisJCS8vIHNsb3QgaW4gZGV2aWNlX2lkcyBpcyByZXNlcnZlZCBmb3IgdGFyZ2V0IGlkLCB0aGF0J3Mgd2h5CisJCS8vICI8PSIgYmVsb3cKKwkJZm9yIChpID0gMDsgaSA8PSBNQVhfTE9HSUNBTF9EUklWRVNfNDBMRDsgaSsrKSB7CisJCQlhZGFwdGVyLT5kZXZpY2VfaWRzW2FkYXB0ZXItPm1heF9jaGFubmVsXVtpXSArPSAweDgwOworCQl9CisJCWFkYXB0ZXItPmRldmljZV9pZHNbYWRhcHRlci0+bWF4X2NoYW5uZWxdW2FkYXB0ZXItPmluaXRfaWRdID0KKwkJCTB4RkY7CisKKwkJcmFpZF9kZXYtPnJhbmRvbV9kZWxfc3VwcG9ydGVkID0gMTsKKwl9CisKKwkvKgorCSAqIGZpbmQgb3V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBzY2F0dGVyLWdhdGhlciBlbGVtZW50cyBzdXBwb3J0ZWQgYnkKKwkgKiB0aGlzIGZpcm13YXJlCisJICovCisJYWRhcHRlci0+c2dsZW4gPSBtZWdhcmFpZF9tYm94X2dldF9tYXhfc2coYWRhcHRlcik7CisKKwkvLyBlbnVtZXJhdGUgUkFJRCBhbmQgU0NTSSBjaGFubmVscyBzbyB0aGF0IGFsbCBkZXZpY2VzIG9uIFNDU0kKKwkvLyBjaGFubmVscyBjYW4gbGF0ZXIgYmUgZXhwb3J0ZWQsIGluY2x1ZGluZyBkaXNrIGRldmljZXMKKwltZWdhcmFpZF9tYm94X2VudW1fcmFpZF9zY3NpKGFkYXB0ZXIpOworCisJLyoKKwkgKiBPdGhlciBwYXJhbWV0ZXJzIHJlcXVpcmVkIGJ5IHVwcGVyIGxheWVyCisJICoKKwkgKiBtYXhpbXVtIG51bWJlciBvZiBzZWN0b3JzIHBlciBJTyBjb21tYW5kCisJICovCisJYWRhcHRlci0+bWF4X3NlY3RvcnMgPSBtZWdhcmFpZF9tYXhfc2VjdG9yczsKKworCS8qCisJICogbnVtYmVyIG9mIHF1ZXVlZCBjb21tYW5kcyBwZXIgTFVOLgorCSAqLworCWFkYXB0ZXItPmNtZF9wZXJfbHVuID0gbWVnYXJhaWRfY21kX3Blcl9sdW47CisKKwkvKgorCSAqIEFsbG9jYXRlIHJlc291cmNlcyByZXF1aXJlZCB0byBpc3N1ZSBGVyBjYWxscywgd2hlbiBzeXNmcyBpcworCSAqIGFjY2Vzc2VkCisJICovCisJaWYgKG1lZ2FyYWlkX3N5c2ZzX2FsbG9jX3Jlc291cmNlcyhhZGFwdGVyKSAhPSAwKSB7CisJCWdvdG8gb3V0X2FsbG9jX2NtZHM7CisJfQorCisJLy8gU2V0IHRoZSBETUEgbWFzayB0byA2NC1iaXQuIEFsbCBzdXBwb3J0ZWQgY29udHJvbGxlcnMgYXMgY2FwYWJsZSBvZgorCS8vIERNQSBpbiB0aGlzIHJhbmdlCisJaWYgKHBjaV9zZXRfZG1hX21hc2soYWRhcHRlci0+cGRldiwgMHhGRkZGRkZGRkZGRkZGRkZGVUxMKSAhPSAwKSB7CisKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCSJtZWdhcmFpZDogY291bGQgbm90IHNldCBETUEgbWFzayBmb3IgNjQtYml0LlxuIikpOworCisJCWdvdG8gb3V0X2ZyZWVfc3lzZnNfcmVzOworCX0KKworCS8vIHNldHVwIHRhc2tsZXQgZm9yIERQQworCXRhc2tsZXRfaW5pdCgmYWRhcHRlci0+ZHBjX2gsIG1lZ2FyYWlkX21ib3hfZHBjLAorCQkJKHVuc2lnbmVkIGxvbmcpYWRhcHRlcik7CisKKwljb25fbG9nKENMX0RMRVZFTDEsIChLRVJOX0lORk8KKwkJIm1lZ2FyYWlkIG1ib3ggaGJhIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZFxuIikpOworCisJcmV0dXJuIDA7CisKK291dF9mcmVlX3N5c2ZzX3JlczoKKwltZWdhcmFpZF9zeXNmc19mcmVlX3Jlc291cmNlcyhhZGFwdGVyKTsKK291dF9hbGxvY19jbWRzOgorCW1lZ2FyYWlkX2ZyZWVfY21kX3BhY2tldHMoYWRhcHRlcik7CitvdXRfZnJlZV9pcnE6CisJZnJlZV9pcnEoYWRhcHRlci0+aXJxLCBhZGFwdGVyKTsKK291dF9pb3VubWFwOgorCWlvdW5tYXAocmFpZF9kZXYtPmJhc2VhZGRyKTsKK291dF9yZWxlYXNlX3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK291dF9mcmVlX3JhaWRfZGV2OgorCWtmcmVlKHJhaWRfZGV2KTsKKworCXJldHVybiAtMTsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX2ZpbmlfbWJveCAtIHVuZG8gY29udHJvbGxlciBpbml0aWFsaXphdGlvbgorICogQHBhcmFtIGFkYXB0ZXIJOiBvdXIgc29mdCBzdGF0ZQorICovCitzdGF0aWMgdm9pZAorbWVnYXJhaWRfZmluaV9tYm94KGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwltcmFpZF9kZXZpY2VfdCAqcmFpZF9kZXYgPSBBREFQMlJBSURERVYoYWRhcHRlcik7CisKKwkvLyBmbHVzaCBhbGwgY2FjaGVzCisJbWVnYXJhaWRfbWJveF9mbHVzaF9jYWNoZShhZGFwdGVyKTsKKworCXRhc2tsZXRfa2lsbCgmYWRhcHRlci0+ZHBjX2gpOworCisJbWVnYXJhaWRfc3lzZnNfZnJlZV9yZXNvdXJjZXMoYWRhcHRlcik7CisKKwltZWdhcmFpZF9mcmVlX2NtZF9wYWNrZXRzKGFkYXB0ZXIpOworCisJZnJlZV9pcnEoYWRhcHRlci0+aXJxLCBhZGFwdGVyKTsKKworCWlvdW5tYXAocmFpZF9kZXYtPmJhc2VhZGRyKTsKKworCXBjaV9yZWxlYXNlX3JlZ2lvbnMoYWRhcHRlci0+cGRldik7CisKKwlrZnJlZShyYWlkX2Rldik7CisKKwlyZXR1cm47Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9hbGxvY19jbWRfcGFja2V0cyAtIGFsbG9jYXRlIHNoYXJlZCBtYWlsYm94CisgKiBAcGFyYW0gYWRhcHRlcgk6IHNvZnQgc3RhdGUgb2YgdGhlIHJhaWQgY29udHJvbGxlcgorICoKKyAqIEFsbG9jYXRlIGFuZCBhbGlnbiB0aGUgc2hhcmVkIG1haWxib3guIFRoaXMgbWFpYm94IGlzIHVzZWQgdG8gaXNzdWUKKyAqIGFsbCB0aGUgY29tbWFuZHMuIEZvciBJTyBiYXNlZCBjb250cm9sbGVycywgdGhlIG1haWxib3ggaXMgYWxzbyByZWdzaXRlcmVkCisgKiB3aXRoIHRoZSBGVy4gQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgY29tbWFuZHMgYXMgd2VsbC4KKyAqIFRoaXMgaXMgb3VyIGJpZyBhbGxvY2F0b3IKKyAqLworc3RhdGljIGludAorbWVnYXJhaWRfYWxsb2NfY21kX3BhY2tldHMoYWRhcHRlcl90ICphZGFwdGVyKQoreworCW1yYWlkX2RldmljZV90CQkqcmFpZF9kZXYgPSBBREFQMlJBSURERVYoYWRhcHRlcik7CisJc3RydWN0IHBjaV9kZXYJCSpwZGV2OworCXVuc2lnbmVkIGxvbmcJCWFsaWduOworCXNjYl90CQkJKnNjYjsKKwltYm94X2NjYl90CQkqY2NiOworCXN0cnVjdCBtcmFpZF9wY2lfYmxrCSplcHRocnVfcGNpX2JsazsKKwlzdHJ1Y3QgbXJhaWRfcGNpX2Jsawkqc2dfcGNpX2JsazsKKwlzdHJ1Y3QgbXJhaWRfcGNpX2JsawkqbWJveF9wY2lfYmxrOworCWludAkJCWk7CisKKwlwZGV2ID0gYWRhcHRlci0+cGRldjsKKworCS8qCisJICogU2V0dXAgdGhlIG1haWxib3gKKwkgKiBBbGxvY2F0ZSB0aGUgY29tbW9uIDE2LWJ5dGUgYWxpZ25lZCBtZW1vcnkgZm9yIHRoZSBoYW5kc2hha2UKKwkgKiBtYWlsYm94LgorCSAqLworCXJhaWRfZGV2LT51bmFfbWJveDY0ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwKKwkJCXNpemVvZihtYm94NjRfdCksICZyYWlkX2Rldi0+dW5hX21ib3g2NF9kbWEpOworCisJaWYgKCFyYWlkX2Rldi0+dW5hX21ib3g2NCkgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiBvdXQgb2YgbWVtb3J5LCAlcyAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkJX19MSU5FX18pKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQocmFpZF9kZXYtPnVuYV9tYm94NjQsIDAsIHNpemVvZihtYm94NjRfdCkpOworCisJLyoKKwkgKiBBbGlnbiB0aGUgbWFpbGJveCBhdCAxNi1ieXRlIGJvdW5kYXJ5CisJICovCisJcmFpZF9kZXYtPm1ib3gJPSAmcmFpZF9kZXYtPnVuYV9tYm94NjQtPm1ib3gzMjsKKworCXJhaWRfZGV2LT5tYm94CT0gKG1ib3hfdCAqKSgoKCh1bnNpZ25lZCBsb25nKXJhaWRfZGV2LT5tYm94KSArIDE1KSAmCisJCQkJKH4wVUwgXiAweEZVTCkpOworCisJcmFpZF9kZXYtPm1ib3g2NCA9IChtYm94NjRfdCAqKSgoKHVuc2lnbmVkIGxvbmcpcmFpZF9kZXYtPm1ib3gpIC0gOCk7CisKKwlhbGlnbiA9ICgodm9pZCAqKXJhaWRfZGV2LT5tYm94IC0KKwkJCSgodm9pZCAqKSZyYWlkX2Rldi0+dW5hX21ib3g2NC0+bWJveDMyKSk7CisKKwlyYWlkX2Rldi0+bWJveF9kbWEgPSAodW5zaWduZWQgbG9uZylyYWlkX2Rldi0+dW5hX21ib3g2NF9kbWEgKyA4ICsKKwkJCWFsaWduOworCisJLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBjb21tYW5kcyBpc3N1ZWQgaW50ZXJuYWxseQorCWFkYXB0ZXItPmlidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBNQk9YX0lCVUZfU0laRSwKKwkJCQkmYWRhcHRlci0+aWJ1Zl9kbWFfaCk7CisJaWYgKCFhZGFwdGVyLT5pYnVmKSB7CisKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCSJtZWdhcmFpZDogb3V0IG9mIG1lbW9yeSwgJXMgJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCV9fTElORV9fKSk7CisKKwkJZ290byBvdXRfZnJlZV9jb21tb25fbWJveDsKKwl9CisJbWVtc2V0KGFkYXB0ZXItPmlidWYsIDAsIE1CT1hfSUJVRl9TSVpFKTsKKworCS8vIEFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIFNDU0kgQ29tbWFuZCBCbG9ja3MgYW5kIHRoZWlyIGFzc29jaWF0ZWQKKwkvLyBtZW1vcnkKKworCS8qCisJICogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgYmFzZSBsaXN0IG9mIHNjYi4gTGF0ZXIgYWxsb2NhdGUgbWVtb3J5IGZvcgorCSAqIENDQnMgYW5kIGVtYmVkZGVkIGNvbXBvbmVudHMgb2YgZWFjaCBDQ0IgYW5kIHBvaW50IHRoZSBwb2ludGVycyBpbgorCSAqIHNjYiB0byB0aGUgYWxsb2NhdGVkIGNvbXBvbmVudHMKKwkgKiBOT1RFOiBUaGUgY29kZSB0byBhbGxvY2F0ZSBTQ0Igd2lsbCBiZSBkdXBsaWNhdGVkIGluIGFsbCB0aGUgTExECisJICogc2luY2UgdGhlIGNhbGxpbmcgcm91dGluZSBkb2VzIG5vdCB5ZXQga25vdyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZQorCSAqIGNvbW1hbmRzLgorCSAqLworCWFkYXB0ZXItPmtzY2JfbGlzdCA9IGttYWxsb2Moc2l6ZW9mKHNjYl90KSAqIE1CT1hfTUFYX1NDU0lfQ01EUywKKwkJCUdGUF9LRVJORUwpOworCisJaWYgKGFkYXB0ZXItPmtzY2JfbGlzdCA9PSBOVUxMKSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQ6IG91dCBvZiBtZW1vcnksICVzICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQlfX0xJTkVfXykpOworCQlnb3RvIG91dF9mcmVlX2lidWY7CisJfQorCW1lbXNldChhZGFwdGVyLT5rc2NiX2xpc3QsIDAsIHNpemVvZihzY2JfdCkgKiBNQk9YX01BWF9TQ1NJX0NNRFMpOworCisJLy8gbWVtb3J5IGFsbG9jYXRpb24gZm9yIG91ciBjb21tYW5kIHBhY2tldHMKKwlpZiAobWVnYXJhaWRfbWJveF9zZXR1cF9kbWFfcG9vbHMoYWRhcHRlcikgIT0gMCkgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiBvdXQgb2YgbWVtb3J5LCAlcyAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkJX19MSU5FX18pKTsKKwkJZ290byBvdXRfZnJlZV9zY2JfbGlzdDsKKwl9CisKKwkvLyBBZGp1c3QgdGhlIHNjYiBwb2ludGVycyBhbmQgbGluayBpbiB0aGUgZnJlZSBwb29sCisJZXB0aHJ1X3BjaV9ibGsJPSByYWlkX2Rldi0+ZXB0aHJ1X3Bvb2w7CisJc2dfcGNpX2Jsawk9IHJhaWRfZGV2LT5zZ19wb29sOworCW1ib3hfcGNpX2Jsawk9IHJhaWRfZGV2LT5tYm94X3Bvb2w7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUJPWF9NQVhfU0NTSV9DTURTOyBpKyspIHsKKwkJc2NiCQkJPSBhZGFwdGVyLT5rc2NiX2xpc3QgKyBpOworCQljY2IJCQk9IHJhaWRfZGV2LT5jY2JfbGlzdCArIGk7CisKKwkJY2NiLT5tYm94CT0gKG1ib3hfdCAqKShtYm94X3BjaV9ibGtbaV0udmFkZHIgKyAxNik7CisJCWNjYi0+cmF3X21ib3gJPSAodWludDhfdCAqKWNjYi0+bWJveDsKKwkJY2NiLT5tYm94NjQJPSAobWJveDY0X3QgKikobWJveF9wY2lfYmxrW2ldLnZhZGRyICsgOCk7CisJCWNjYi0+bWJveF9kbWFfaAk9ICh1bnNpZ25lZCBsb25nKW1ib3hfcGNpX2Jsa1tpXS5kbWFfYWRkciArIDE2OworCisJCS8vIG1ha2Ugc3VyZSB0aGUgbWFpbGJveCBpcyBhbGlnbmVkIHByb3Blcmx5CisJCWlmIChjY2ItPm1ib3hfZG1hX2ggJiAweDBGKSB7CisJCQljb25fbG9nKENMX0FOTiwgKEtFUk5fQ1JJVAorCQkJCSJtZWdhcmFpZCBtYm94OiBub3QgYWxpZ25lZCBvbiAxNi1ieXRlc1xuIikpOworCisJCQlnb3RvIG91dF90ZWFyZG93bl9kbWFfcG9vbHM7CisJCX0KKworCQljY2ItPmVwdGhydQkJPSAobXJhaWRfZXBhc3N0aHJ1X3QgKikKKwkJCQkJCWVwdGhydV9wY2lfYmxrW2ldLnZhZGRyOworCQljY2ItPmVwdGhydV9kbWFfaAk9IGVwdGhydV9wY2lfYmxrW2ldLmRtYV9hZGRyOworCQljY2ItPnB0aHJ1CQk9IChtcmFpZF9wYXNzdGhydV90ICopY2NiLT5lcHRocnU7CisJCWNjYi0+cHRocnVfZG1hX2gJPSBjY2ItPmVwdGhydV9kbWFfaDsKKworCisJCWNjYi0+c2dsNjQJCT0gKG1ib3hfc2dsNjQgKilzZ19wY2lfYmxrW2ldLnZhZGRyOworCQljY2ItPnNnbF9kbWFfaAkJPSBzZ19wY2lfYmxrW2ldLmRtYV9hZGRyOworCQljY2ItPnNnbDMyCQk9IChtYm94X3NnbDMyICopY2NiLT5zZ2w2NDsKKworCQlzY2ItPmNjYgkJPSAoY2FkZHJfdCljY2I7CisJCXNjYi0+Z3AJCQk9IDA7CisKKwkJc2NiLT5zbm8JCT0gaTsJLy8gY29tbWFuZCBpbmRleAorCisJCXNjYi0+c2NwCQk9IE5VTEw7CisJCXNjYi0+c3RhdGUJCT0gU0NCX0ZSRUU7CisJCXNjYi0+ZG1hX2RpcmVjdGlvbgk9IFBDSV9ETUFfTk9ORTsKKwkJc2NiLT5kbWFfdHlwZQkJPSBNUkFJRF9ETUFfTk9ORTsKKwkJc2NiLT5kZXZfY2hhbm5lbAk9IC0xOworCQlzY2ItPmRldl90YXJnZXQJCT0gLTE7CisKKwkJLy8gcHV0IHNjYiBpbiB0aGUgZnJlZSBwb29sCisJCWxpc3RfYWRkX3RhaWwoJnNjYi0+bGlzdCwgJmFkYXB0ZXItPmtzY2JfcG9vbCk7CisJfQorCisJcmV0dXJuIDA7CisKK291dF90ZWFyZG93bl9kbWFfcG9vbHM6CisJbWVnYXJhaWRfbWJveF90ZWFyZG93bl9kbWFfcG9vbHMoYWRhcHRlcik7CitvdXRfZnJlZV9zY2JfbGlzdDoKKwlrZnJlZShhZGFwdGVyLT5rc2NiX2xpc3QpOworb3V0X2ZyZWVfaWJ1ZjoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIE1CT1hfSUJVRl9TSVpFLCAodm9pZCAqKWFkYXB0ZXItPmlidWYsCisJCWFkYXB0ZXItPmlidWZfZG1hX2gpOworb3V0X2ZyZWVfY29tbW9uX21ib3g6CisJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBzaXplb2YobWJveDY0X3QpLAorCQkoY2FkZHJfdClyYWlkX2Rldi0+dW5hX21ib3g2NCwgcmFpZF9kZXYtPnVuYV9tYm94NjRfZG1hKTsKKworCXJldHVybiAtMTsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX2ZyZWVfY21kX3BhY2tldHMgLSBmcmVlIG1lbW9yeQorICogQHBhcmFtIGFkYXB0ZXIJOiBzb2Z0IHN0YXRlIG9mIHRoZSByYWlkIGNvbnRyb2xsZXIKKyAqCisgKiBSZWxlYXNlIG1lbW9yeSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBjb21tYW5kcworICovCitzdGF0aWMgdm9pZAorbWVnYXJhaWRfZnJlZV9jbWRfcGFja2V0cyhhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJbXJhaWRfZGV2aWNlX3QgKnJhaWRfZGV2ID0gQURBUDJSQUlEREVWKGFkYXB0ZXIpOworCisJbWVnYXJhaWRfbWJveF90ZWFyZG93bl9kbWFfcG9vbHMoYWRhcHRlcik7CisKKwlrZnJlZShhZGFwdGVyLT5rc2NiX2xpc3QpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBNQk9YX0lCVUZfU0laRSwKKwkJKHZvaWQgKilhZGFwdGVyLT5pYnVmLCBhZGFwdGVyLT5pYnVmX2RtYV9oKTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgc2l6ZW9mKG1ib3g2NF90KSwKKwkJKGNhZGRyX3QpcmFpZF9kZXYtPnVuYV9tYm94NjQsIHJhaWRfZGV2LT51bmFfbWJveDY0X2RtYSk7CisJcmV0dXJuOworfQorCisKKy8qKgorICogbWVnYXJhaWRfbWJveF9zZXR1cF9kbWFfcG9vbHMgLSBzZXR1cCBkbWEgcG9vbCBmb3IgY29tbWFuZCBwYWNrZXRzCisgKiBAcGFyYW0gYWRhcHRlcgk6IEhCQSBzb2Z0IHN0YXRlCisgKgorICogc2V0dXAgdGhlIGRtYSBwb29scyBmb3IgbWFpbGJveCwgcGFzc3RocnUgYW5kIGV4dGVuZGVkIHBhc3N0aHJ1IHN0cnVjdHVyZXMsCisgKiBhbmQgc2NhdHRlci1nYXRoZXIgbGlzdHMKKyAqLworc3RhdGljIGludAorbWVnYXJhaWRfbWJveF9zZXR1cF9kbWFfcG9vbHMoYWRhcHRlcl90ICphZGFwdGVyKQoreworCW1yYWlkX2RldmljZV90CQkqcmFpZF9kZXYgPSBBREFQMlJBSURERVYoYWRhcHRlcik7CisJc3RydWN0IG1yYWlkX3BjaV9ibGsJKmVwdGhydV9wY2lfYmxrOworCXN0cnVjdCBtcmFpZF9wY2lfYmxrCSpzZ19wY2lfYmxrOworCXN0cnVjdCBtcmFpZF9wY2lfYmxrCSptYm94X3BjaV9ibGs7CisJaW50CQkJaTsKKworCisKKwkvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIDE2LWJ5dGVzIGFsaWduZWQgbWFpbGJveGVzCisJcmFpZF9kZXYtPm1ib3hfcG9vbF9oYW5kbGUgPSBwY2lfcG9vbF9jcmVhdGUoIm1lZ2FyYWlkIG1ib3ggcG9vbCIsCisJCQkJCQlhZGFwdGVyLT5wZGV2LAorCQkJCQkJc2l6ZW9mKG1ib3g2NF90KSArIDE2LAorCQkJCQkJMTYsIDApOworCisJaWYgKHJhaWRfZGV2LT5tYm94X3Bvb2xfaGFuZGxlID09IE5VTEwpIHsKKwkJZ290byBmYWlsX3NldHVwX2RtYV9wb29sOworCX0KKworCW1ib3hfcGNpX2JsayA9IHJhaWRfZGV2LT5tYm94X3Bvb2w7CisJZm9yIChpID0gMDsgaSA8IE1CT1hfTUFYX1NDU0lfQ01EUzsgaSsrKSB7CisJCW1ib3hfcGNpX2Jsa1tpXS52YWRkciA9IHBjaV9wb29sX2FsbG9jKAorCQkJCQkJcmFpZF9kZXYtPm1ib3hfcG9vbF9oYW5kbGUsCisJCQkJCQlHRlBfS0VSTkVMLAorCQkJCQkJJm1ib3hfcGNpX2Jsa1tpXS5kbWFfYWRkcik7CisJCWlmICghbWJveF9wY2lfYmxrW2ldLnZhZGRyKSB7CisJCQlnb3RvIGZhaWxfc2V0dXBfZG1hX3Bvb2w7CisJCX0KKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgZWFjaCBlbWJlZGRlZCBwYXNzdGhydSBzdHJ1Y3V0dXJlIHBvaW50ZXIKKwkgKiBSZXF1ZXN0IGZvciBhIDEyOCBieXRlcyBhbGlnbmVkIHN0cnVjdHVyZSBmb3IgZWFjaCBwYXNzdGhydSBjb21tYW5kCisJICogc3RydWN0dXJlCisJICogU2luY2UgcGFzc3RocnUgYW5kIGV4dGVuZGVkIHBhc3N0aHJ1IGNvbW1hbmRzIGFyZSBleGNsdXNpdmUsIHRoZXkKKwkgKiBzaGFyZSBjb21tb24gbWVtb3J5IHBvb2wuIFBhc3N0aHJ1IHN0cnVjdHVyZXMgcGlnZ3liYWNrIG9uIG1lbW9yeQorCSAqIGFsbG9jdGVkIHRvIGV4dGVuZGVkIHBhc3N0aHJ1IHNpbmNlIHBhc3N0aHJ1IGlzIHNtYWxsZXIgb2YgdGhlIHR3bworCSAqLworCXJhaWRfZGV2LT5lcHRocnVfcG9vbF9oYW5kbGUgPSBwY2lfcG9vbF9jcmVhdGUoIm1lZ2FyYWlkIG1ib3ggcHRocnUiLAorCQkJYWRhcHRlci0+cGRldiwgc2l6ZW9mKG1yYWlkX2VwYXNzdGhydV90KSwgMTI4LCAwKTsKKworCWlmIChyYWlkX2Rldi0+ZXB0aHJ1X3Bvb2xfaGFuZGxlID09IE5VTEwpIHsKKwkJZ290byBmYWlsX3NldHVwX2RtYV9wb29sOworCX0KKworCWVwdGhydV9wY2lfYmxrID0gcmFpZF9kZXYtPmVwdGhydV9wb29sOworCWZvciAoaSA9IDA7IGkgPCBNQk9YX01BWF9TQ1NJX0NNRFM7IGkrKykgeworCQllcHRocnVfcGNpX2Jsa1tpXS52YWRkciA9IHBjaV9wb29sX2FsbG9jKAorCQkJCQkJcmFpZF9kZXYtPmVwdGhydV9wb29sX2hhbmRsZSwKKwkJCQkJCUdGUF9LRVJORUwsCisJCQkJCQkmZXB0aHJ1X3BjaV9ibGtbaV0uZG1hX2FkZHIpOworCQlpZiAoIWVwdGhydV9wY2lfYmxrW2ldLnZhZGRyKSB7CisJCQlnb3RvIGZhaWxfc2V0dXBfZG1hX3Bvb2w7CisJCX0KKwl9CisKKworCS8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgZWFjaCBzY2F0dGVyLWdhdGhlciBsaXN0LiBSZXF1ZXN0IGZvciA1MTIgYnl0ZXMKKwkvLyBhbGlnbm1lbnQgZm9yIGVhY2ggc2cgbGlzdAorCXJhaWRfZGV2LT5zZ19wb29sX2hhbmRsZSA9IHBjaV9wb29sX2NyZWF0ZSgibWVnYXJhaWQgbWJveCBzZyIsCisJCQkJCWFkYXB0ZXItPnBkZXYsCisJCQkJCXNpemVvZihtYm94X3NnbDY0KSAqIE1CT1hfTUFYX1NHX1NJWkUsCisJCQkJCTUxMiwgMCk7CisKKwlpZiAocmFpZF9kZXYtPnNnX3Bvb2xfaGFuZGxlID09IE5VTEwpIHsKKwkJZ290byBmYWlsX3NldHVwX2RtYV9wb29sOworCX0KKworCXNnX3BjaV9ibGsgPSByYWlkX2Rldi0+c2dfcG9vbDsKKwlmb3IgKGkgPSAwOyBpIDwgTUJPWF9NQVhfU0NTSV9DTURTOyBpKyspIHsKKwkJc2dfcGNpX2Jsa1tpXS52YWRkciA9IHBjaV9wb29sX2FsbG9jKAorCQkJCQkJcmFpZF9kZXYtPnNnX3Bvb2xfaGFuZGxlLAorCQkJCQkJR0ZQX0tFUk5FTCwKKwkJCQkJCSZzZ19wY2lfYmxrW2ldLmRtYV9hZGRyKTsKKwkJaWYgKCFzZ19wY2lfYmxrW2ldLnZhZGRyKSB7CisJCQlnb3RvIGZhaWxfc2V0dXBfZG1hX3Bvb2w7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbF9zZXR1cF9kbWFfcG9vbDoKKwltZWdhcmFpZF9tYm94X3RlYXJkb3duX2RtYV9wb29scyhhZGFwdGVyKTsKKwlyZXR1cm4gLTE7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9tYm94X3RlYXJkb3duX2RtYV9wb29scyAtIHRlYXJkb3duIGRtYSBwb29scyBmb3IgY29tbWFuZCBwYWNrZXRzCisgKiBAcGFyYW0gYWRhcHRlcgk6IEhCQSBzb2Z0IHN0YXRlCisgKgorICogdGVhcmRvd24gdGhlIGRtYSBwb29sIGZvciBtYWlsYm94LCBwYXNzdGhydSBhbmQgZXh0ZW5kZWQgcGFzc3RocnUKKyAqIHN0cnVjdHVyZXMsIGFuZCBzY2F0dGVyLWdhdGhlciBsaXN0cworICovCitzdGF0aWMgdm9pZAorbWVnYXJhaWRfbWJveF90ZWFyZG93bl9kbWFfcG9vbHMoYWRhcHRlcl90ICphZGFwdGVyKQoreworCW1yYWlkX2RldmljZV90CQkqcmFpZF9kZXYgPSBBREFQMlJBSURERVYoYWRhcHRlcik7CisJc3RydWN0IG1yYWlkX3BjaV9ibGsJKmVwdGhydV9wY2lfYmxrOworCXN0cnVjdCBtcmFpZF9wY2lfYmxrCSpzZ19wY2lfYmxrOworCXN0cnVjdCBtcmFpZF9wY2lfYmxrCSptYm94X3BjaV9ibGs7CisJaW50CQkJaTsKKworCisJc2dfcGNpX2JsayA9IHJhaWRfZGV2LT5zZ19wb29sOworCWZvciAoaSA9IDA7IGkgPCBNQk9YX01BWF9TQ1NJX0NNRFMgJiYgc2dfcGNpX2Jsa1tpXS52YWRkcjsgaSsrKSB7CisJCXBjaV9wb29sX2ZyZWUocmFpZF9kZXYtPnNnX3Bvb2xfaGFuZGxlLCBzZ19wY2lfYmxrW2ldLnZhZGRyLAorCQkJc2dfcGNpX2Jsa1tpXS5kbWFfYWRkcik7CisJfQorCWlmIChyYWlkX2Rldi0+c2dfcG9vbF9oYW5kbGUpCisJCXBjaV9wb29sX2Rlc3Ryb3kocmFpZF9kZXYtPnNnX3Bvb2xfaGFuZGxlKTsKKworCisJZXB0aHJ1X3BjaV9ibGsgPSByYWlkX2Rldi0+ZXB0aHJ1X3Bvb2w7CisJZm9yIChpID0gMDsgaSA8IE1CT1hfTUFYX1NDU0lfQ01EUyAmJiBlcHRocnVfcGNpX2Jsa1tpXS52YWRkcjsgaSsrKSB7CisJCXBjaV9wb29sX2ZyZWUocmFpZF9kZXYtPmVwdGhydV9wb29sX2hhbmRsZSwKKwkJCWVwdGhydV9wY2lfYmxrW2ldLnZhZGRyLCBlcHRocnVfcGNpX2Jsa1tpXS5kbWFfYWRkcik7CisJfQorCWlmIChyYWlkX2Rldi0+ZXB0aHJ1X3Bvb2xfaGFuZGxlKQorCQlwY2lfcG9vbF9kZXN0cm95KHJhaWRfZGV2LT5lcHRocnVfcG9vbF9oYW5kbGUpOworCisKKwltYm94X3BjaV9ibGsgPSByYWlkX2Rldi0+bWJveF9wb29sOworCWZvciAoaSA9IDA7IGkgPCBNQk9YX01BWF9TQ1NJX0NNRFMgJiYgbWJveF9wY2lfYmxrW2ldLnZhZGRyOyBpKyspIHsKKwkJcGNpX3Bvb2xfZnJlZShyYWlkX2Rldi0+bWJveF9wb29sX2hhbmRsZSwKKwkJCW1ib3hfcGNpX2Jsa1tpXS52YWRkciwgbWJveF9wY2lfYmxrW2ldLmRtYV9hZGRyKTsKKwl9CisJaWYgKHJhaWRfZGV2LT5tYm94X3Bvb2xfaGFuZGxlKQorCQlwY2lfcG9vbF9kZXN0cm95KHJhaWRfZGV2LT5tYm94X3Bvb2xfaGFuZGxlKTsKKworCXJldHVybjsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX2FsbG9jX3NjYiAtIGRldGFjaCBhbmQgcmV0dXJuIGEgc2NiIGZyb20gdGhlIGZyZWUgbGlzdAorICogQGFkYXB0ZXIJOiBjb250cm9sbGVyJ3Mgc29mdCBzdGF0ZQorICoKKyAqIHJldHVybiB0aGUgc2NiIGZyb20gdGhlIGhlYWQgb2YgdGhlIGZyZWUgbGlzdC4gTlVMTCBpZiB0aGVyZSBhcmUgbm9uZQorICogYXZhaWxhYmxlCisgKiovCitzdGF0aWMgaW5saW5lIHNjYl90ICoKK21lZ2FyYWlkX2FsbG9jX3NjYihhZGFwdGVyX3QgKmFkYXB0ZXIsIHN0cnVjdCBzY3NpX2NtbmQgKnNjcCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpoZWFkID0gJmFkYXB0ZXItPmtzY2JfcG9vbDsKKwlzY2JfdAkJCSpzY2IgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJLy8gZGV0YWNoIHNjYiBmcm9tIGZyZWUgcG9vbAorCXNwaW5fbG9ja19pcnFzYXZlKFNDU0lfRlJFRV9MSVNUX0xPQ0soYWRhcHRlciksIGZsYWdzKTsKKworCWlmIChsaXN0X2VtcHR5KGhlYWQpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoU0NTSV9GUkVFX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzY2IgPSBsaXN0X2VudHJ5KGhlYWQtPm5leHQsIHNjYl90LCBsaXN0KTsKKwlsaXN0X2RlbF9pbml0KCZzY2ItPmxpc3QpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShTQ1NJX0ZSRUVfTElTVF9MT0NLKGFkYXB0ZXIpLCBmbGFncyk7CisKKwlzY2ItPnN0YXRlCT0gU0NCX0FDVElWRTsKKwlzY2ItPnNjcAk9IHNjcDsKKwlzY2ItPmRtYV90eXBlCT0gTVJBSURfRE1BX05PTkU7CisKKwlyZXR1cm4gc2NiOworfQorCisKKy8qKgorICogbWVnYXJhaWRfZGVhbGxvY19zY2IgLSByZXR1cm4gdGhlIHNjYiB0byB0aGUgZnJlZSBwb29sCisgKiBAYWRhcHRlcgk6IGNvbnRyb2xsZXIncyBzb2Z0IHN0YXRlCisgKiBAc2NiCQk6IHNjYiB0byBiZSBmcmVlZAorICoKKyAqIHJldHVybiB0aGUgc2NiIGJhY2sgdG8gdGhlIGZyZWUgbGlzdCBvZiBzY2JzLiBUaGUgY2FsbGVyIG11c3QgJ2ZsdXNoJyB0aGUKKyAqIFNDQiBiZWZvcmUgY2FsbGluZyB1cy4gRS5nLiwgcGVyZm9ybWluZyBwY2lfdW5hbXAgYW5kL29yIHBjaV9zeW5jIGV0Yy4KKyAqIE5PVEUgTk9URTogTWFrZSBzdXJlIHRoZSBzY2IgaXMgbm90IG9uIGFueSBsaXN0IGJlZm9yZSBjYWxsaW5nIHRoaXMKKyAqIHJvdXRpbmUuCisgKiovCitzdGF0aWMgaW5saW5lIHZvaWQKK21lZ2FyYWlkX2RlYWxsb2Nfc2NiKGFkYXB0ZXJfdCAqYWRhcHRlciwgc2NiX3QgKnNjYikKK3sKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworCS8vIHB1dCBzY2IgaW4gdGhlIGZyZWUgcG9vbAorCXNjYi0+c3RhdGUJPSBTQ0JfRlJFRTsKKwlzY2ItPnNjcAk9IE5VTEw7CisJc3Bpbl9sb2NrX2lycXNhdmUoU0NTSV9GUkVFX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCisJbGlzdF9hZGQoJnNjYi0+bGlzdCwgJmFkYXB0ZXItPmtzY2JfcG9vbCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKFNDU0lfRlJFRV9MSVNUX0xPQ0soYWRhcHRlciksIGZsYWdzKTsKKworCXJldHVybjsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX21ib3hfbWtzZ2wgLSBtYWtlIHRoZSBzY2F0dGVyLWdhdGhlciBsaXN0CisgKiBAYWRhcHRlcgktIGNvbnRyb2xsZXIncyBzb2Z0IHN0YXRlCisgKiBAc2NiCQktIHNjc2kgY29udHJvbCBibG9jaworICoKKyAqIHByZXBhcmUgdGhlIHNjYXR0ZXItZ2F0aGVyIGxpc3QKKyAqLworc3RhdGljIGlubGluZSBpbnQKK21lZ2FyYWlkX21ib3hfbWtzZ2woYWRhcHRlcl90ICphZGFwdGVyLCBzY2JfdCAqc2NiKQoreworCXN0cnVjdCBzY2F0dGVybGlzdAkqc2dsOworCW1ib3hfY2NiX3QJCSpjY2I7CisJc3RydWN0IHBhZ2UJCSpwYWdlOworCXVuc2lnbmVkIGxvbmcJCW9mZnNldDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kCSpzY3A7CisJaW50CQkJc2djbnQ7CisJaW50CQkJaTsKKworCisJc2NwCT0gc2NiLT5zY3A7CisJY2NiCT0gKG1ib3hfY2NiX3QgKilzY2ItPmNjYjsKKworCS8vIG5vIG1hcHBpbmcgcmVxdWlyZWQgaWYgbm8gZGF0YSB0byBiZSB0cmFuc2ZlcnJlZAorCWlmICghc2NwLT5yZXF1ZXN0X2J1ZmZlciB8fCAhc2NwLT5yZXF1ZXN0X2J1ZmZsZW4pCisJCXJldHVybiAwOworCisJaWYgKCFzY3AtPnVzZV9zZykgewkvKiBzY2F0dGVyLWdhdGhlciBsaXN0IG5vdCB1c2VkICovCisKKwkJcGFnZSA9IHZpcnRfdG9fcGFnZShzY3AtPnJlcXVlc3RfYnVmZmVyKTsKKworCQlvZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcpc2NwLT5yZXF1ZXN0X2J1ZmZlciAmIH5QQUdFX01BU0spOworCisJCWNjYi0+YnVmX2RtYV9oID0gcGNpX21hcF9wYWdlKGFkYXB0ZXItPnBkZXYsIHBhZ2UsIG9mZnNldCwKKwkJCQkJCSAgc2NwLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCQkgIHNjYi0+ZG1hX2RpcmVjdGlvbik7CisJCXNjYi0+ZG1hX3R5cGUgPSBNUkFJRF9ETUFfV0JVRjsKKworCQkvKgorCQkgKiBXZSBuZWVkIHRvIGhhbmRsZSBzcGVjaWFsIDY0LWJpdCBjb21tYW5kcyB0aGF0IG5lZWQgYQorCQkgKiBtaW5pbXVtIG9mIDEgU0cKKwkJICovCisJCXNnY250ID0gMTsKKwkJY2NiLT5zZ2w2NFswXS5hZGRyZXNzCT0gY2NiLT5idWZfZG1hX2g7CisJCWNjYi0+c2dsNjRbMF0ubGVuZ3RoCT0gc2NwLT5yZXF1ZXN0X2J1ZmZsZW47CisKKwkJcmV0dXJuIHNnY250OworCX0KKworCXNnbCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3AtPnJlcXVlc3RfYnVmZmVyOworCisJLy8gVGhlIG51bWJlciBvZiBzZyBlbGVtZW50cyByZXR1cm5lZCBtdXN0IG5vdCBleGNlZWQgb3VyIGxpbWl0CisJc2djbnQgPSBwY2lfbWFwX3NnKGFkYXB0ZXItPnBkZXYsIHNnbCwgc2NwLT51c2Vfc2csCisJCQlzY2ItPmRtYV9kaXJlY3Rpb24pOworCisJaWYgKHNnY250ID4gYWRhcHRlci0+c2dsZW4pIHsKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX0NSSVQKKwkJCSJtZWdhcmFpZCBjcml0aWNhbDogdG9vIG1hbnkgc2cgZWxlbWVudHM6JWRcbiIsCisJCQlzZ2NudCkpOworCQlCVUcoKTsKKwl9CisKKwlzY2ItPmRtYV90eXBlID0gTVJBSURfRE1BX1dTRzsKKworCWZvciAoaSA9IDA7IGkgPCBzZ2NudDsgaSsrLCBzZ2wrKykgeworCQljY2ItPnNnbDY0W2ldLmFkZHJlc3MJPSBzZ19kbWFfYWRkcmVzcyhzZ2wpOworCQljY2ItPnNnbDY0W2ldLmxlbmd0aAk9IHNnX2RtYV9sZW4oc2dsKTsKKwl9CisKKwkvLyBSZXR1cm4gY291bnQgb2YgU0cgbm9kZXMKKwlyZXR1cm4gc2djbnQ7Cit9CisKKworLyoqCisgKiBtYm94X3Bvc3RfY21kIC0gaXNzdWUgYSBtYWlsYm94IGNvbW1hbmQKKyAqIEBhZGFwdGVyCS0gY29udHJvbGxlcidzIHNvZnQgc3RhdGUKKyAqIEBzY2IJCS0gY29tbWFuZCB0byBiZSBpc3N1ZWQKKyAqCisgKiBwb3N0IHRoZSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyIGlmIG1haWxib3ggaXMgYXZhaWxibGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CittYm94X3Bvc3RfY21kKGFkYXB0ZXJfdCAqYWRhcHRlciwgc2NiX3QgKnNjYikKK3sKKwltcmFpZF9kZXZpY2VfdAkqcmFpZF9kZXYgPSBBREFQMlJBSURERVYoYWRhcHRlcik7CisJbWJveDY0X3QJKm1ib3g2NDsKKwltYm94X3QJCSptYm94OworCW1ib3hfY2NiX3QJKmNjYjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXVuc2lnbmVkIGludAlpID0gMDsKKworCisJY2NiCT0gKG1ib3hfY2NiX3QgKilzY2ItPmNjYjsKKwltYm94CT0gcmFpZF9kZXYtPm1ib3g7CisJbWJveDY0CT0gcmFpZF9kZXYtPm1ib3g2NDsKKworCS8qCisJICogQ2hlY2sgZm9yIGJ1c3kgbWFpbGJveC4gSWYgaXQgaXMsIHJldHVybiBmYWlsdXJlIC0gdGhlIGNhbGxlcgorCSAqIHNob3VsZCByZXRyeSBsYXRlci4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZShNQUlMQk9YX0xPQ0socmFpZF9kZXYpLCBmbGFncyk7CisKKwlpZiAodW5saWtlbHkobWJveC0+YnVzeSkpIHsKKwkJZG8geworCQkJdWRlbGF5KDEpOworCQkJaSsrOworCQkJcm1iKCk7CisJCX0gd2hpbGUobWJveC0+YnVzeSAmJiAoaSA8IG1heF9tYm94X2J1c3lfd2FpdCkpOworCisJCWlmIChtYm94LT5idXN5KSB7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoTUFJTEJPWF9MT0NLKHJhaWRfZGV2KSwgZmxhZ3MpOworCisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKworCS8vIENvcHkgdGhpcyBjb21tYW5kJ3MgbWFpbGJveCBkYXRhIGludG8gImFkYXB0ZXIncyIgbWFpbGJveAorCW1lbWNweSgoY2FkZHJfdCltYm94NjQsIChjYWRkcl90KWNjYi0+bWJveDY0LCAyMik7CisJbWJveC0+Y21kaWQgPSBzY2ItPnNubzsKKworCWFkYXB0ZXItPm91dHN0YW5kaW5nX2NtZHMrKzsKKworCWlmIChzY2ItPmRtYV9kaXJlY3Rpb24gPT0gUENJX0RNQV9UT0RFVklDRSkgeworCQlpZiAoIXNjYi0+c2NwLT51c2Vfc2cpIHsJLy8gc2cgbGlzdCBub3QgdXNlZAorCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGFkYXB0ZXItPnBkZXYsCisJCQkJCWNjYi0+YnVmX2RtYV9oLAorCQkJCQlzY2ItPnNjcC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJfQorCQllbHNlIHsKKwkJCXBjaV9kbWFfc3luY19zZ19mb3JfZGV2aWNlKGFkYXB0ZXItPnBkZXYsCisJCQkJc2NiLT5zY3AtPnJlcXVlc3RfYnVmZmVyLAorCQkJCXNjYi0+c2NwLT51c2Vfc2csIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl9CisJfQorCisJbWJveC0+YnVzeQk9IDE7CS8vIFNldCBidXN5CisJbWJveC0+cG9sbAk9IDA7CisJbWJveC0+YWNrCT0gMDsKKwl3bWIoKTsKKworCVdSSU5ET09SKHJhaWRfZGV2LCByYWlkX2Rldi0+bWJveF9kbWEgfCAweDEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShNQUlMQk9YX0xPQ0socmFpZF9kZXYpLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX3F1ZXVlX2NvbW1hbmQgLSBnZW5lcmljIHF1ZXVlIGVudHJ5IHBvaW50IGZvciBhbGwgTExEcworICogQHNjcAkJOiBwb2ludGVyIHRvIHRoZSBzY3NpIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQKKyAqIEBkb25lCTogY2FsbGJhY2sgcm91dGluZSB0byBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGNtZCBoYXMgYmUgY29tcGxldGVkCisgKgorICogUXVldWUgZW50cnkgcG9pbnQgZm9yIG1haWxib3ggYmFzZWQgY29udHJvbGxlcnMuCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FyYWlkX3F1ZXVlX2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqc2NwLCB2b2lkICgqIGRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJYWRhcHRlcl90CSphZGFwdGVyOworCXNjYl90CQkqc2NiOworCWludAkJaWZfYnVzeTsKKworCWFkYXB0ZXIJCT0gU0NQMkFEQVBURVIoc2NwKTsKKwlzY3AtPnNjc2lfZG9uZQk9IGRvbmU7CisJc2NwLT5yZXN1bHQJPSAwOworCisJYXNzZXJ0X3NwaW5fbG9ja2VkKGFkYXB0ZXItPmhvc3RfbG9jayk7CisKKwlzcGluX3VubG9jayhhZGFwdGVyLT5ob3N0X2xvY2spOworCisJLyoKKwkgKiBBbGxvY2F0ZSBhbmQgYnVpbGQgYSBTQ0IgcmVxdWVzdAorCSAqIGlmX2J1c3kgZmxhZyB3aWxsIGJlIHNldCBpZiBtZWdhcmFpZF9tYm94X2J1aWxkX2NtZCgpIGNvbW1hbmQgY291bGQKKwkgKiBub3QgYWxsb2NhdGUgc2NiLiBXZSB3aWxsIHJldHVybiBub24temVybyBzdGF0dXMgaW4gdGhhdCBjYXNlLgorCSAqIE5PVEU6IHNjYiBjYW4gYmUgbnVsbCBldmVuIHRob3VnaCBjZXJ0YWluIGNvbW1hbmRzIGNvbXBsZXRlZAorCSAqIHN1Y2Nlc3NmdWxseSwgZS5nLiwgTU9ERV9TRU5TRSBhbmQgVEVTVF9VTklUX1JFQURZLCBpdCB3b3VsZAorCSAqIHJldHVybiAwIGluIHRoYXQgY2FzZSwgYW5kIHdlIHdvdWxkIGRvIHRoZSBjYWxsYmFjayByaWdodCBhd2F5LgorCSAqLworCWlmX2J1c3kJPSAwOworCXNjYgk9IG1lZ2FyYWlkX21ib3hfYnVpbGRfY21kKGFkYXB0ZXIsIHNjcCwgJmlmX2J1c3kpOworCisJaWYgKHNjYikgeworCQltZWdhcmFpZF9tYm94X3J1bnBlbmRxKGFkYXB0ZXIsIHNjYik7CisJfQorCisJc3Bpbl9sb2NrKGFkYXB0ZXItPmhvc3RfbG9jayk7CisKKwlpZiAoIXNjYikgewkvLyBjb21tYW5kIGFscmVhZHkgY29tcGxldGVkCisJCWRvbmUoc2NwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGlmX2J1c3k7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9tYm94X2J1aWxkX2NtZCAtIHRyYW5zZm9ybSB0aGUgbWlkLWxheWVyIHNjc2kgY29tbWFuZCB0byBtZWdhcmFpZAorICogZmlybXdhcmUgbGluZ3VhCisgKiBAYWRhcHRlcgktIGNvbnRyb2xsZXIncyBzb2Z0IHN0YXRlCisgKiBAc2NwCQktIG1pZC1sYXllciBzY3NpIGNvbW1hbmQgcG9pbnRlcgorICogQGJ1c3kJLSBzZXQgaWYgcmVxdWVzdCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGJlY2F1c2Ugb2YgbGFjayBvZgorICoJCXJlc291cmNlcworICoKKyAqIGNvbnZlcnQgdGhlIGNvbW1hbmQgaXNzdWVkIGJ5IG1pZC1sYXllciB0byBmb3JtYXQgdW5kZXJzdG9vZCBieSBtZWdhcmFpZAorICogZmlybXdhcmUuIFdlIGFsc28gY29tcGxldGUgY2VydGFpbiBjb21tYW5kIHdpdGhvdXQgc2VuZGluZyB0aGVtIHRvIGZpcm13YXJlCisgKi8KK3N0YXRpYyBzY2JfdCAqCittZWdhcmFpZF9tYm94X2J1aWxkX2NtZChhZGFwdGVyX3QgKmFkYXB0ZXIsIHN0cnVjdCBzY3NpX2NtbmQgKnNjcCwgaW50ICpidXN5KQoreworCW1yYWlkX2RldmljZV90CQkqcmRldiA9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKKwlpbnQJCQljaGFubmVsOworCWludAkJCXRhcmdldDsKKwlpbnQJCQlpc2xvZ2ljYWw7CisJbWJveF9jY2JfdAkJKmNjYjsKKwltcmFpZF9wYXNzdGhydV90CSpwdGhydTsKKwltYm94NjRfdAkJKm1ib3g2NDsKKwltYm94X3QJCQkqbWJveDsKKwlzY2JfdAkJCSpzY2I7CisJY2hhcgkJCXNraXBbXSA9ICJza2lwcGluZyI7CisJY2hhcgkJCXNjYW5bXSA9ICJzY2FubmluZyI7CisJY2hhcgkJCSpzczsKKworCisJLyoKKwkgKiBHZXQgdGhlIGFwcHJvcHJpYXRlIGRldmljZSBtYXAgZm9yIHRoZSBkZXZpY2UgdGhpcyBjb21tYW5kIGlzCisJICogaW50ZW5kZWQgZm9yCisJICovCisJTVJBSURfR0VUX0RFVklDRV9NQVAoYWRhcHRlciwgc2NwLCBjaGFubmVsLCB0YXJnZXQsIGlzbG9naWNhbCk7CisKKwkvKgorCSAqIExvZ2ljYWwgZHJpdmUgY29tbWFuZHMKKwkgKi8KKwlpZiAoaXNsb2dpY2FsKSB7CisJCXN3aXRjaCAoc2NwLT5jbW5kWzBdKSB7CisJCWNhc2UgVEVTVF9VTklUX1JFQURZOgorCQkJLyoKKwkJCSAqIERvIHdlIHN1cHBvcnQgY2x1c3RlcmluZyBhbmQgaXMgdGhlIHN1cHBvcnQgZW5hYmxlZAorCQkJICogSWYgbm8sIHJldHVybiBzdWNjZXNzIGFsd2F5cworCQkJICovCisJCQlpZiAoIWFkYXB0ZXItPmhhKSB7CisJCQkJc2NwLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJaWYgKCEoc2NiID0gbWVnYXJhaWRfYWxsb2Nfc2NiKGFkYXB0ZXIsIHNjcCkpKSB7CisJCQkJc2NwLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJCQkqYnVzeSA9IDE7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCXNjYi0+ZG1hX2RpcmVjdGlvbgk9IHNjcC0+c2NfZGF0YV9kaXJlY3Rpb247CisJCQlzY2ItPmRldl9jaGFubmVsCT0gMHhGRjsKKwkJCXNjYi0+ZGV2X3RhcmdldAkJPSB0YXJnZXQ7CisJCQljY2IJCQk9IChtYm94X2NjYl90ICopc2NiLT5jY2I7CisKKwkJCS8qCisJCQkgKiBUaGUgY29tbWFuZCBpZCB3aWxsIGJlIHByb3ZpZGVkIGJ5IHRoZSBjb21tYW5kCisJCQkgKiBpc3N1YW5jZSByb3V0aW5lCisJCQkgKi8KKwkJCWNjYi0+cmF3X21ib3hbMF0JPSBDTFVTVEVSX0NNRDsKKwkJCWNjYi0+cmF3X21ib3hbMl0JPSBSRVNFUlZBVElPTl9TVEFUVVM7CisJCQljY2ItPnJhd19tYm94WzNdCT0gdGFyZ2V0OworCisJCQlyZXR1cm4gc2NiOworCisJCWNhc2UgTU9ERV9TRU5TRToKKwkJCWlmIChzY3AtPnVzZV9zZykgeworCQkJCXN0cnVjdCBzY2F0dGVybGlzdAkqc2dsOworCQkJCWNhZGRyX3QJCQl2YWRkcjsKKworCQkJCXNnbCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3AtPnJlcXVlc3RfYnVmZmVyOworCQkJCWlmIChzZ2wtPnBhZ2UpIHsKKwkJCQkJdmFkZHIgPSAoY2FkZHJfdCkKKwkJCQkJCShwYWdlX2FkZHJlc3MoKCZzZ2xbMF0pLT5wYWdlKQorCQkJCQkJKyAoJnNnbFswXSktPm9mZnNldCk7CisKKwkJCQkJbWVtc2V0KHZhZGRyLCAwLCBzY3AtPmNtbmRbNF0pOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCQkJIm1lZ2FyYWlkIG1haWxib3g6IGludmFsaWQgc2c6JWRcbiIsCisJCQkJCV9fTElORV9fKSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJbWVtc2V0KHNjcC0+cmVxdWVzdF9idWZmZXIsIDAsIHNjcC0+Y21uZFs0XSk7CisJCQl9CisJCQlzY3AtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpOworCQkJcmV0dXJuIE5VTEw7CisKKwkJY2FzZSBJTlFVSVJZOgorCQkJLyoKKwkJCSAqIERpc3BsYXkgdGhlIGNoYW5uZWwgc2NhbiBmb3IgbG9naWNhbCBkcml2ZXMKKwkJCSAqIERvIG5vdCBkaXNwbGF5IHNjYW4gZm9yIGEgY2hhbm5lbCBpZiBhbHJlYWR5IGRvbmUuCisJCQkgKi8KKwkJCWlmICghKHJkZXYtPmxhc3RfZGlzcCAmICgxTCA8PCBTQ1AyQ0hBTk5FTChzY3ApKSkpIHsKKworCQkJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9JTkZPCisJCQkJCSJzY3NpWyVkXTogc2Nhbm5pbmcgc2NzaSBjaGFubmVsICVkIiwKKwkJCQkJYWRhcHRlci0+aG9zdC0+aG9zdF9ubywKKwkJCQkJU0NQMkNIQU5ORUwoc2NwKSkpOworCisJCQkJY29uX2xvZyhDTF9BTk4sICgKKwkJCQkJIiBbdmlydHVhbF0gZm9yIGxvZ2ljYWwgZHJpdmVzXG4iKSk7CisKKwkJCQlyZGV2LT5sYXN0X2Rpc3AgfD0gKDFMIDw8IFNDUDJDSEFOTkVMKHNjcCkpOworCQkJfQorCisJCQkvKiBGYWxsIHRocm91Z2ggKi8KKworCQljYXNlIFJFQURfQ0FQQUNJVFk6CisJCQkvKgorCQkJICogRG8gbm90IGFsbG93IExVTiA+IDAgZm9yIGxvZ2ljYWwgZHJpdmVzIGFuZAorCQkJICogcmVxdWVzdHMgZm9yIG1vcmUgdGhhbiA0MCBsb2dpY2FsIGRyaXZlcworCQkJICovCisJCQlpZiAoU0NQMkxVTihzY3ApKSB7CisJCQkJc2NwLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJaWYgKCh0YXJnZXQgJSAweDgwKSA+PSBNQVhfTE9HSUNBTF9EUklWRVNfNDBMRCkgeworCQkJCXNjcC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCisJCQkvKiBBbGxvY2F0ZSBhIFNDQiBhbmQgaW5pdGlhbGl6ZSBwYXNzdGhydSAqLworCQkJaWYgKCEoc2NiID0gbWVnYXJhaWRfYWxsb2Nfc2NiKGFkYXB0ZXIsIHNjcCkpKSB7CisJCQkJc2NwLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJCQkqYnVzeSA9IDE7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCWNjYgkJCT0gKG1ib3hfY2NiX3QgKilzY2ItPmNjYjsKKwkJCXNjYi0+ZGV2X2NoYW5uZWwJPSAweEZGOworCQkJc2NiLT5kZXZfdGFyZ2V0CQk9IHRhcmdldDsKKwkJCXB0aHJ1CQkJPSBjY2ItPnB0aHJ1OworCQkJbWJveAkJCT0gY2NiLT5tYm94OworCQkJbWJveDY0CQkJPSBjY2ItPm1ib3g2NDsKKworCQkJcHRocnUtPnRpbWVvdXQJCT0gMDsKKwkJCXB0aHJ1LT5hcnMJCT0gMTsKKwkJCXB0aHJ1LT5yZXFzZW5zZWxlbgk9IDE0OworCQkJcHRocnUtPmlzbG9naWNhbAk9IDE7CisJCQlwdGhydS0+bG9nZHJ2CQk9IHRhcmdldDsKKwkJCXB0aHJ1LT5jZGJsZW4JCT0gc2NwLT5jbWRfbGVuOworCQkJbWVtY3B5KHB0aHJ1LT5jZGIsIHNjcC0+Y21uZCwgc2NwLT5jbWRfbGVuKTsKKworCQkJbWJveC0+Y21kCQk9IE1CT1hDTURfUEFTU1RIUlU2NDsKKwkJCXNjYi0+ZG1hX2RpcmVjdGlvbgk9IHNjcC0+c2NfZGF0YV9kaXJlY3Rpb247CisKKwkJCXB0aHJ1LT5kYXRheGZlcmxlbgk9IHNjcC0+cmVxdWVzdF9idWZmbGVuOworCQkJcHRocnUtPmRhdGF4ZmVyYWRkcgk9IGNjYi0+c2dsX2RtYV9oOworCQkJcHRocnUtPm51bXNnZQkJPSBtZWdhcmFpZF9tYm94X21rc2dsKGFkYXB0ZXIsCisJCQkJCQkJc2NiKTsKKworCQkJbWJveC0+eGZlcmFkZHIJCT0gMHhGRkZGRkZGRjsKKwkJCW1ib3g2NC0+eGZlcmFkZHJfbG8JPSAodWludDMyX3QgKWNjYi0+cHRocnVfZG1hX2g7CisJCQltYm94NjQtPnhmZXJhZGRyX2hpCT0gMDsKKworCQkJcmV0dXJuIHNjYjsKKworCQljYXNlIFJFQURfNjoKKwkJY2FzZSBXUklURV82OgorCQljYXNlIFJFQURfMTA6CisJCWNhc2UgV1JJVEVfMTA6CisJCWNhc2UgUkVBRF8xMjoKKwkJY2FzZSBXUklURV8xMjoKKworCQkJLyoKKwkJCSAqIEFsbG9jYXRlIGEgU0NCIGFuZCBpbml0aWFsaXplIG1haWxib3gKKwkJCSAqLworCQkJaWYgKCEoc2NiID0gbWVnYXJhaWRfYWxsb2Nfc2NiKGFkYXB0ZXIsIHNjcCkpKSB7CisJCQkJc2NwLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJCQkqYnVzeSA9IDE7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQljY2IJCQk9IChtYm94X2NjYl90ICopc2NiLT5jY2I7CisJCQlzY2ItPmRldl9jaGFubmVsCT0gMHhGRjsKKwkJCXNjYi0+ZGV2X3RhcmdldAkJPSB0YXJnZXQ7CisJCQltYm94CQkJPSBjY2ItPm1ib3g7CisJCQltYm94NjQJCQk9IGNjYi0+bWJveDY0OworCQkJbWJveC0+bG9nZHJ2CQk9IHRhcmdldDsKKworCQkJLyoKKwkJCSAqIEEgbGl0dGxlIEhBQ0s6IDJuZCBiaXQgaXMgemVybyBmb3IgYWxsIHNjc2kgcmVhZAorCQkJICogY29tbWFuZHMgYW5kIGlzIHNldCBmb3IgYWxsIHNjc2kgd3JpdGUgY29tbWFuZHMKKwkJCSAqLworCQkJbWJveC0+Y21kID0gKHNjcC0+Y21uZFswXSAmIDB4MDIpID8gIE1CT1hDTURfTFdSSVRFNjQ6CisJCQkJCU1CT1hDTURfTFJFQUQ2NCA7CisKKwkJCS8qCisJCQkgKiA2LWJ5dGUgUkVBRCgweDA4KSBvciBXUklURSgweDBBKSBjZGIKKwkJCSAqLworCQkJaWYgKHNjcC0+Y21kX2xlbiA9PSA2KSB7CisJCQkJbWJveC0+bnVtc2VjdG9ycyA9ICh1aW50MzJfdClzY3AtPmNtbmRbNF07CisJCQkJbWJveC0+bGJhID0KKwkJCQkJKCh1aW50MzJfdClzY3AtPmNtbmRbMV0gPDwgMTYpCXwKKwkJCQkJKCh1aW50MzJfdClzY3AtPmNtbmRbMl0gPDwgOCkJfAorCQkJCQkodWludDMyX3Qpc2NwLT5jbW5kWzNdOworCisJCQkJbWJveC0+bGJhICY9IDB4MUZGRkZGOworCQkJfQorCisJCQkvKgorCQkJICogMTAtYnl0ZSBSRUFEKDB4MjgpIG9yIFdSSVRFKDB4MkEpIGNkYgorCQkJICovCisJCQllbHNlIGlmIChzY3AtPmNtZF9sZW4gPT0gMTApIHsKKwkJCQltYm94LT5udW1zZWN0b3JzID0KKwkJCQkJKHVpbnQzMl90KXNjcC0+Y21uZFs4XSB8CisJCQkJCSgodWludDMyX3Qpc2NwLT5jbW5kWzddIDw8IDgpOworCQkJCW1ib3gtPmxiYSA9CisJCQkJCSgodWludDMyX3Qpc2NwLT5jbW5kWzJdIDw8IDI0KSB8CisJCQkJCSgodWludDMyX3Qpc2NwLT5jbW5kWzNdIDw8IDE2KSB8CisJCQkJCSgodWludDMyX3Qpc2NwLT5jbW5kWzRdIDw8IDgpIHwKKwkJCQkJKHVpbnQzMl90KXNjcC0+Y21uZFs1XTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIDEyLWJ5dGUgUkVBRCgweEE4KSBvciBXUklURSgweEFBKSBjZGIKKwkJCSAqLworCQkJZWxzZSBpZiAoc2NwLT5jbWRfbGVuID09IDEyKSB7CisJCQkJbWJveC0+bGJhID0KKwkJCQkJKCh1aW50MzJfdClzY3AtPmNtbmRbMl0gPDwgMjQpIHwKKwkJCQkJKCh1aW50MzJfdClzY3AtPmNtbmRbM10gPDwgMTYpIHwKKwkJCQkJKCh1aW50MzJfdClzY3AtPmNtbmRbNF0gPDwgOCkgfAorCQkJCQkodWludDMyX3Qpc2NwLT5jbW5kWzVdOworCisJCQkJbWJveC0+bnVtc2VjdG9ycyA9CisJCQkJCSgodWludDMyX3Qpc2NwLT5jbW5kWzZdIDw8IDI0KSB8CisJCQkJCSgodWludDMyX3Qpc2NwLT5jbW5kWzddIDw8IDE2KSB8CisJCQkJCSgodWludDMyX3Qpc2NwLT5jbW5kWzhdIDw8IDgpIHwKKwkJCQkJKHVpbnQzMl90KXNjcC0+Y21uZFs5XTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkJCSJtZWdhcmFpZDogdW5zdXBwb3J0ZWQgQ0RCIGxlbmd0aFxuIikpOworCisJCQkJbWVnYXJhaWRfZGVhbGxvY19zY2IoYWRhcHRlciwgc2NiKTsKKworCQkJCXNjcC0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCXNjYi0+ZG1hX2RpcmVjdGlvbiA9IHNjcC0+c2NfZGF0YV9kaXJlY3Rpb247CisKKwkJCS8vIENhbGN1bGF0ZSBTY2F0dGVyLUdhdGhlciBpbmZvCisJCQltYm94NjQtPnhmZXJhZGRyX2xvCT0gKHVpbnQzMl90ICljY2ItPnNnbF9kbWFfaDsKKwkJCW1ib3gtPm51bXNnZQkJPSBtZWdhcmFpZF9tYm94X21rc2dsKGFkYXB0ZXIsCisJCQkJCQkJc2NiKTsKKwkJCW1ib3gtPnhmZXJhZGRyCQk9IDB4RkZGRkZGRkY7CisJCQltYm94NjQtPnhmZXJhZGRyX2hpCT0gMDsKKworCQkJcmV0dXJuIHNjYjsKKworCQljYXNlIFJFU0VSVkU6CisJCWNhc2UgUkVMRUFTRToKKwkJCS8qCisJCQkgKiBEbyB3ZSBzdXBwb3J0IGNsdXN0ZXJpbmcgYW5kIGlzIHRoZSBzdXBwb3J0IGVuYWJsZWQKKwkJCSAqLworCQkJaWYgKCFhZGFwdGVyLT5oYSkgeworCQkJCXNjcC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEFsbG9jYXRlIGEgU0NCIGFuZCBpbml0aWFsaXplIG1haWxib3gKKwkJCSAqLworCQkJaWYgKCEoc2NiID0gbWVnYXJhaWRfYWxsb2Nfc2NiKGFkYXB0ZXIsIHNjcCkpKSB7CisJCQkJc2NwLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJCQkqYnVzeSA9IDE7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCWNjYgkJCT0gKG1ib3hfY2NiX3QgKilzY2ItPmNjYjsKKwkJCXNjYi0+ZGV2X2NoYW5uZWwJPSAweEZGOworCQkJc2NiLT5kZXZfdGFyZ2V0CQk9IHRhcmdldDsKKwkJCWNjYi0+cmF3X21ib3hbMF0JPSBDTFVTVEVSX0NNRDsKKwkJCWNjYi0+cmF3X21ib3hbMl0JPSAgKHNjcC0+Y21uZFswXSA9PSBSRVNFUlZFKSA/CisJCQkJCQlSRVNFUlZFX0xEIDogUkVMRUFTRV9MRDsKKworCQkJY2NiLT5yYXdfbWJveFszXQk9IHRhcmdldDsKKwkJCXNjYi0+ZG1hX2RpcmVjdGlvbgk9IHNjcC0+c2NfZGF0YV9kaXJlY3Rpb247CisKKwkJCXJldHVybiBzY2I7CisKKwkJZGVmYXVsdDoKKwkJCXNjcC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCWVsc2UgeyAvLyBQYXNzdGhydSBkZXZpY2UgY29tbWFuZHMKKworCQkvLyBEbyBub3QgYWxsb3cgYWNjZXNzIHRvIHRhcmdldCBpZCA+IDE1IG9yIExVTiA+IDcKKwkJaWYgKHRhcmdldCA+IDE1IHx8IFNDUDJMVU4oc2NwKSA+IDcpIHsKKwkJCXNjcC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLy8gaWYgZmFzdCBsb2FkIG9wdGlvbiB3YXMgc2V0IGFuZCBzY2FuIGZvciBsYXN0IGRldmljZSBpcworCQkvLyBvdmVyLCByZXNldCB0aGUgZmFzdF9sb2FkIGZsYWcgc28gdGhhdCBkdXJpbmcgYSBwb3NzaWJsZQorCQkvLyBuZXh0IHNjYW4sIGRldmljZXMgY2FuIGJlIG1hZGUgYXZhaWxhYmxlCisJCWlmIChyZGV2LT5mYXN0X2xvYWQgJiYgKHRhcmdldCA9PSAxNSkgJiYKKwkJCShTQ1AyQ0hBTk5FTChzY3ApID09IGFkYXB0ZXItPm1heF9jaGFubmVsIC0xKSkgeworCisJCQljb25fbG9nKENMX0FOTiwgKEtFUk5fSU5GTworCQkJIm1lZ2FyYWlkWyVkXTogcGh5c2ljYWwgZGV2aWNlIHNjYW4gcmUtZW5hYmxlZFxuIiwKKwkJCQlhZGFwdGVyLT5ob3N0LT5ob3N0X25vKSk7CisJCQlyZGV2LT5mYXN0X2xvYWQgPSAwOworCQl9CisKKwkJLyoKKwkJICogRGlzcGxheSB0aGUgY2hhbm5lbCBzY2FuIGZvciBwaHlzaWNhbCBkZXZpY2VzCisJCSAqLworCQlpZiAoIShyZGV2LT5sYXN0X2Rpc3AgJiAoMUwgPDwgU0NQMkNIQU5ORUwoc2NwKSkpKSB7CisKKwkJCXNzID0gcmRldi0+ZmFzdF9sb2FkID8gc2tpcCA6IHNjYW47CisKKwkJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9JTkZPCisJCQkJInNjc2lbJWRdOiAlcyBzY3NpIGNoYW5uZWwgJWQgW1BoeSAlZF0iLAorCQkJCWFkYXB0ZXItPmhvc3QtPmhvc3Rfbm8sIHNzLCBTQ1AyQ0hBTk5FTChzY3ApLAorCQkJCWNoYW5uZWwpKTsKKworCQkJY29uX2xvZyhDTF9BTk4sICgKKwkJCQkiIGZvciBub24tcmFpZCBkZXZpY2VzXG4iKSk7CisKKwkJCXJkZXYtPmxhc3RfZGlzcCB8PSAoMUwgPDwgU0NQMkNIQU5ORUwoc2NwKSk7CisJCX0KKworCQkvLyBkaXNhYmxlIGNoYW5uZWwgc3dlZXAgaWYgZmFzdCBsb2FkIG9wdGlvbiBnaXZlbgorCQlpZiAocmRldi0+ZmFzdF9sb2FkKSB7CisJCQlzY3AtPnJlc3VsdCA9IChESURfQkFEX1RBUkdFVCA8PCAxNik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8vIEFsbG9jYXRlIGEgU0NCIGFuZCBpbml0aWFsaXplIHBhc3N0aHJ1CisJCWlmICghKHNjYiA9IG1lZ2FyYWlkX2FsbG9jX3NjYihhZGFwdGVyLCBzY3ApKSkgeworCQkJc2NwLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJCSpidXN5ID0gMTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJY2NiCQkJPSAobWJveF9jY2JfdCAqKXNjYi0+Y2NiOworCQlzY2ItPmRldl9jaGFubmVsCT0gY2hhbm5lbDsKKwkJc2NiLT5kZXZfdGFyZ2V0CQk9IHRhcmdldDsKKwkJc2NiLT5kbWFfZGlyZWN0aW9uCT0gc2NwLT5zY19kYXRhX2RpcmVjdGlvbjsKKwkJbWJveAkJCT0gY2NiLT5tYm94OworCQltYm94NjQJCQk9IGNjYi0+bWJveDY0OworCisJCS8vIERvZXMgdGhpcyBmaXJtd2FyZSBzdXBwb3J0IGV4dGVuZGVkIENEQnMKKwkJaWYgKGFkYXB0ZXItPm1heF9jZGJfc3ogPT0gMTYpIHsKKwkJCW1ib3gtPmNtZAkJPSBNQk9YQ01EX0VYVFBUSFJVOworCisJCQltZWdhcmFpZF9tYm94X3ByZXBhcmVfZXB0aHJ1KGFkYXB0ZXIsIHNjYiwgc2NwKTsKKworCQkJbWJveDY0LT54ZmVyYWRkcl9sbwk9ICh1aW50MzJfdCljY2ItPmVwdGhydV9kbWFfaDsKKwkJCW1ib3g2NC0+eGZlcmFkZHJfaGkJPSAwOworCQkJbWJveC0+eGZlcmFkZHIJCT0gMHhGRkZGRkZGRjsKKwkJfQorCQllbHNlIHsKKwkJCW1ib3gtPmNtZCA9IE1CT1hDTURfUEFTU1RIUlU2NDsKKworCQkJbWVnYXJhaWRfbWJveF9wcmVwYXJlX3B0aHJ1KGFkYXB0ZXIsIHNjYiwgc2NwKTsKKworCQkJbWJveDY0LT54ZmVyYWRkcl9sbwk9ICh1aW50MzJfdCljY2ItPnB0aHJ1X2RtYV9oOworCQkJbWJveDY0LT54ZmVyYWRkcl9oaQk9IDA7CisJCQltYm94LT54ZmVyYWRkcgkJPSAweEZGRkZGRkZGOworCQl9CisJCXJldHVybiBzY2I7CisJfQorCisJLy8gTk9UIFJFQUNIRUQKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX21ib3hfcnVucGVuZHEgLSBleGVjdXRlIGNvbW1hbmRzIHF1ZXVlZCBpbiB0aGUgcGVuZGluZyBxdWV1ZQorICogQGFkYXB0ZXIJOiBjb250cm9sbGVyJ3Mgc29mdCBzdGF0ZQorICogQHNjYgkJOiBTQ0IgdG8gYmUgcXVldWVkIGluIHRoZSBwZW5kaW5nIGxpc3QKKyAqCisgKiBzY2FuIHRoZSBwZW5kaW5nIGxpc3QgZm9yIGNvbW1hbmRzIHdoaWNoIGFyZSBub3QgeWV0IGlzc3VlZCBhbmQgdHJ5IHRvCisgKiBwb3N0IHRvIHRoZSBjb250cm9sbGVyLiBUaGUgU0NCIGNhbiBiZSBhIG51bGwgcG9pbnRlciwgd2hpY2ggd291bGQgaW5kaWNhdGUKKyAqIG5vIFNDQiB0byBiZSBxdWV1ZSwganVzdCB0cnkgdG8gZXhlY3V0ZSB0aGUgb25lcyBpbiB0aGUgcGVuZGluZyBsaXN0LgorICoKKyAqIE5PVEU6IFdlIGRvIG5vdCBhY3R1YWxseSB0cmF2ZXJzZSB0aGUgcGVuZGluZyBsaXN0LiBUaGUgU0NCcyBhcmUgcGx1Y2tlZAorICogb3V0IGZyb20gdGhlIGhlYWQgb2YgdGhlIHBlbmRpbmcgbGlzdC4gSWYgaXQgaXMgc3VjY2Vzc2Z1bGx5IGlzc3VlZCwgdGhlCisgKiBuZXh0IFNDQiBpcyBhdCB0aGUgaGVhZCBub3cuCisgKi8KK3N0YXRpYyB2b2lkCittZWdhcmFpZF9tYm94X3J1bnBlbmRxKGFkYXB0ZXJfdCAqYWRhcHRlciwgc2NiX3QgKnNjYl9xKQoreworCXNjYl90CQkJKnNjYjsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKFBFTkRJTkdfTElTVF9MT0NLKGFkYXB0ZXIpLCBmbGFncyk7CisKKwlpZiAoc2NiX3EpIHsKKwkJc2NiX3EtPnN0YXRlID0gU0NCX1BFTkRROworCQlsaXN0X2FkZF90YWlsKCZzY2JfcS0+bGlzdCwgJmFkYXB0ZXItPnBlbmRfbGlzdCk7CisJfQorCisJLy8gaWYgdGhlIGFkYXB0ZXIgaW4gbm90IGluIHF1aWVzY2VudCBtb2RlLCBwb3N0IHRoZSBjb21tYW5kcyB0byBGVworCWlmIChhZGFwdGVyLT5xdWllc2NlbnQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShQRU5ESU5HX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZhZGFwdGVyLT5wZW5kX2xpc3QpKSB7CisKKwkJYXNzZXJ0X3NwaW5fbG9ja2VkKFBFTkRJTkdfTElTVF9MT0NLKGFkYXB0ZXIpKTsKKworCQlzY2IgPSBsaXN0X2VudHJ5KGFkYXB0ZXItPnBlbmRfbGlzdC5uZXh0LCBzY2JfdCwgbGlzdCk7CisKKwkJLy8gcmVtb3ZlIHRoZSBzY2IgZnJvbSB0aGUgcGVuZGluZyBsaXN0IGFuZCB0cnkgdG8KKwkJLy8gaXNzdWUuIElmIHdlIGFyZSB1bmFibGUgdG8gaXNzdWUgaXQsIHB1dCBiYWNrIGluCisJCS8vIHRoZSBwZW5kaW5nIGxpc3QgYW5kIHJldHVybgorCisJCWxpc3RfZGVsX2luaXQoJnNjYi0+bGlzdCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShQRU5ESU5HX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCisJCS8vIGlmIG1haWxib3ggd2FzIGJ1c3ksIHJldHVybiBTQ0IgYmFjayB0byBwZW5kaW5nCisJCS8vIGxpc3QuIE1ha2Ugc3VyZSB0byBhZGQgYXQgdGhlIGhlYWQsIHNpbmNlIHRoYXQncworCQkvLyB3aGVyZSBpdCB3b3VsZCBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tCisKKwkJc2NiLT5zdGF0ZSA9IFNDQl9JU1NVRUQ7CisKKwkJaWYgKG1ib3hfcG9zdF9jbWQoYWRhcHRlciwgc2NiKSAhPSAwKSB7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKFBFTkRJTkdfTElTVF9MT0NLKGFkYXB0ZXIpLCBmbGFncyk7CisKKwkJCXNjYi0+c3RhdGUgPSBTQ0JfUEVORFE7CisKKwkJCWxpc3RfYWRkKCZzY2ItPmxpc3QsICZhZGFwdGVyLT5wZW5kX2xpc3QpOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKFBFTkRJTkdfTElTVF9MT0NLKGFkYXB0ZXIpLAorCQkJCWZsYWdzKTsKKworCQkJcmV0dXJuOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoUEVORElOR19MSVNUX0xPQ0soYWRhcHRlciksIGZsYWdzKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKFBFTkRJTkdfTElTVF9MT0NLKGFkYXB0ZXIpLCBmbGFncyk7CisKKworCXJldHVybjsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX21ib3hfcHJlcGFyZV9wdGhydSAtIHByZXBhcmUgYSBjb21tYW5kIGZvciBwaHlzaWNhbCBkZXZpY2VzCisgKiBAYWRhcHRlcgktIHBvaW50ZXIgdG8gY29udHJvbGxlcidzIHNvZnQgc3RhdGUKKyAqIEBzY2IJCS0gc2NzaSBjb250cm9sIGJsb2NrCisgKiBAc2NwCQktIHNjc2kgY29tbWFuZCBmcm9tIHRoZSBtaWQtbGF5ZXIKKyAqCisgKiBwcmVwYXJlIGEgY29tbWFuZCBmb3IgdGhlIHNjc2kgcGh5c2ljYWwgZGV2aWNlcworICovCitzdGF0aWMgdm9pZAorbWVnYXJhaWRfbWJveF9wcmVwYXJlX3B0aHJ1KGFkYXB0ZXJfdCAqYWRhcHRlciwgc2NiX3QgKnNjYiwKKwkJc3RydWN0IHNjc2lfY21uZCAqc2NwKQoreworCW1ib3hfY2NiX3QJCSpjY2I7CisJbXJhaWRfcGFzc3RocnVfdAkqcHRocnU7CisJdWludDhfdAkJCWNoYW5uZWw7CisJdWludDhfdAkJCXRhcmdldDsKKworCWNjYgk9IChtYm94X2NjYl90ICopc2NiLT5jY2I7CisJcHRocnUJPSBjY2ItPnB0aHJ1OworCWNoYW5uZWwJPSBzY2ItPmRldl9jaGFubmVsOworCXRhcmdldAk9IHNjYi0+ZGV2X3RhcmdldDsKKworCS8vIDA9NnNlYywgMT02MHNlYywgMj0xMG1pbiwgMz0zaHJzLCA0PU5PIHRpbWVvdXQKKwlwdGhydS0+dGltZW91dAkJPSA0OwkKKwlwdGhydS0+YXJzCQk9IDE7CisJcHRocnUtPmlzbG9naWNhbAk9IDA7CisJcHRocnUtPmNoYW5uZWwJCT0gMDsKKwlwdGhydS0+dGFyZ2V0CQk9IChjaGFubmVsIDw8IDQpIHwgdGFyZ2V0OworCXB0aHJ1LT5sb2dkcnYJCT0gU0NQMkxVTihzY3ApOworCXB0aHJ1LT5yZXFzZW5zZWxlbgk9IDE0OworCXB0aHJ1LT5jZGJsZW4JCT0gc2NwLT5jbWRfbGVuOworCisJbWVtY3B5KHB0aHJ1LT5jZGIsIHNjcC0+Y21uZCwgc2NwLT5jbWRfbGVuKTsKKworCWlmIChzY3AtPnJlcXVlc3RfYnVmZmxlbikgeworCQlwdGhydS0+ZGF0YXhmZXJsZW4JPSBzY3AtPnJlcXVlc3RfYnVmZmxlbjsKKwkJcHRocnUtPmRhdGF4ZmVyYWRkcgk9IGNjYi0+c2dsX2RtYV9oOworCQlwdGhydS0+bnVtc2dlCQk9IG1lZ2FyYWlkX21ib3hfbWtzZ2woYWRhcHRlciwgc2NiKTsKKwl9CisJZWxzZSB7CisJCXB0aHJ1LT5kYXRheGZlcmFkZHIJPSAwOworCQlwdGhydS0+ZGF0YXhmZXJsZW4JPSAwOworCQlwdGhydS0+bnVtc2dlCQk9IDA7CisJfQorCXJldHVybjsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX21ib3hfcHJlcGFyZV9lcHRocnUgLSBwcmVwYXJlIGEgY29tbWFuZCBmb3IgcGh5c2ljYWwgZGV2aWNlcworICogQGFkYXB0ZXIJLSBwb2ludGVyIHRvIGNvbnRyb2xsZXIncyBzb2Z0IHN0YXRlCisgKiBAc2NiCQktIHNjc2kgY29udHJvbCBibG9jaworICogQHNjcAkJLSBzY3NpIGNvbW1hbmQgZnJvbSB0aGUgbWlkLWxheWVyCisgKgorICogcHJlcGFyZSBhIGNvbW1hbmQgZm9yIHRoZSBzY3NpIHBoeXNpY2FsIGRldmljZXMuIFRoaXMgcm91bnRpbmUgcHJlcGFyZXMKKyAqIGNvbW1hbmRzIGZvciBkZXZpY2VzIHdoaWNoIGNhbiB0YWtlIGV4dGVuZGVkIENEQnMgKD4xMCBieXRlcykKKyAqLworc3RhdGljIHZvaWQKK21lZ2FyYWlkX21ib3hfcHJlcGFyZV9lcHRocnUoYWRhcHRlcl90ICphZGFwdGVyLCBzY2JfdCAqc2NiLAorCQlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3ApCit7CisJbWJveF9jY2JfdAkJKmNjYjsKKwltcmFpZF9lcGFzc3RocnVfdAkqZXB0aHJ1OworCXVpbnQ4X3QJCQljaGFubmVsOworCXVpbnQ4X3QJCQl0YXJnZXQ7CisKKwljY2IJPSAobWJveF9jY2JfdCAqKXNjYi0+Y2NiOworCWVwdGhydQk9IGNjYi0+ZXB0aHJ1OworCWNoYW5uZWwJPSBzY2ItPmRldl9jaGFubmVsOworCXRhcmdldAk9IHNjYi0+ZGV2X3RhcmdldDsKKworCS8vIDA9NnNlYywgMT02MHNlYywgMj0xMG1pbiwgMz0zaHJzLCA0PU5PIHRpbWVvdXQKKwllcHRocnUtPnRpbWVvdXQJCT0gNDsJCisJZXB0aHJ1LT5hcnMJCT0gMTsKKwllcHRocnUtPmlzbG9naWNhbAk9IDA7CisJZXB0aHJ1LT5jaGFubmVsCQk9IDA7CisJZXB0aHJ1LT50YXJnZXQJCT0gKGNoYW5uZWwgPDwgNCkgfCB0YXJnZXQ7CisJZXB0aHJ1LT5sb2dkcnYJCT0gU0NQMkxVTihzY3ApOworCWVwdGhydS0+cmVxc2Vuc2VsZW4JPSAxNDsKKwllcHRocnUtPmNkYmxlbgkJPSBzY3AtPmNtZF9sZW47CisKKwltZW1jcHkoZXB0aHJ1LT5jZGIsIHNjcC0+Y21uZCwgc2NwLT5jbWRfbGVuKTsKKworCWlmIChzY3AtPnJlcXVlc3RfYnVmZmxlbikgeworCQllcHRocnUtPmRhdGF4ZmVybGVuCT0gc2NwLT5yZXF1ZXN0X2J1ZmZsZW47CisJCWVwdGhydS0+ZGF0YXhmZXJhZGRyCT0gY2NiLT5zZ2xfZG1hX2g7CisJCWVwdGhydS0+bnVtc2dlCQk9IG1lZ2FyYWlkX21ib3hfbWtzZ2woYWRhcHRlciwgc2NiKTsKKwl9CisJZWxzZSB7CisJCWVwdGhydS0+ZGF0YXhmZXJhZGRyCT0gMDsKKwkJZXB0aHJ1LT5kYXRheGZlcmxlbgk9IDA7CisJCWVwdGhydS0+bnVtc2dlCQk9IDA7CisJfQorCXJldHVybjsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX2Fja19zZXF1ZW5jZSAtIGludGVycnVwdCBhY2sgc2VxdWVuY2UgZm9yIG1lbW9yeSBtYXBwZWQgSEJBcworICogQGFkYXB0ZXIJLSBjb250cm9sbGVyJ3Mgc29mdCBzdGF0ZQorICoKKyAqIEludGVycnVwdCBhY2tyb3dsZWRnZW1lbnQgc2VxdWVuY2UgZm9yIG1lbW9yeSBtYXBwZWQgSEJBcy4gRmluZCBvdXQgdGhlCisgKiBjb21wbGV0ZWQgY29tbWFuZCBhbmQgcHV0IHRoZW0gb24gdGhlIGNvbXBsZXRlZCBsaXN0IGZvciBsYXRlciBwcm9jZXNzaW5nLgorICoKKyAqIFJldHVybnM6CTEgaWYgdGhlIGludGVycnVwdCBpcyB2YWxpZCwgMCBvdGhlcndpc2UKKyAqLworc3RhdGljIGlubGluZSBpbnQKK21lZ2FyYWlkX2Fja19zZXF1ZW5jZShhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJbXJhaWRfZGV2aWNlX3QJCSpyYWlkX2RldiA9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKKwltYm94X3QJCQkqbWJveDsKKwlzY2JfdAkJCSpzY2I7CisJdWludDhfdAkJCW5zdGF0dXM7CisJdWludDhfdAkJCWNvbXBsZXRlZFtNQk9YX01BWF9GSVJNV0FSRV9TVEFUVVNdOworCXN0cnVjdCBsaXN0X2hlYWQJY2xpc3Q7CisJaW50CQkJaGFuZGxlZDsKKwl1aW50MzJfdAkJZHdvcmQ7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJaW50CQkJaSwgajsKKworCisJbWJveAk9IHJhaWRfZGV2LT5tYm94OworCisJLy8gbW92ZSB0aGUgU0NCcyBmcm9tIHRoZSBmaXJtd2FyZSBjb21wbGV0ZWQgYXJyYXkgdG8gb3VyIGxvY2FsIGxpc3QKKwlJTklUX0xJU1RfSEVBRCgmY2xpc3QpOworCisJLy8gbG9vcCB0aWxsIEYvVyBoYXMgbW9yZSBjb21tYW5kcyBmb3IgdXMgdG8gY29tcGxldGUKKwloYW5kbGVkID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZShNQUlMQk9YX0xPQ0socmFpZF9kZXYpLCBmbGFncyk7CisJZG8geworCQkvKgorCQkgKiBDaGVjayBpZiBhIHZhbGlkIGludGVycnVwdCBpcyBwZW5kaW5nLiBJZiBmb3VuZCwgZm9yY2UgdGhlCisJCSAqIGludGVycnVwdCBsaW5lIGxvdy4KKwkJICovCisJCWR3b3JkID0gUkRPVVRET09SKHJhaWRfZGV2KTsKKwkJaWYgKGR3b3JkICE9IDB4MTAwMDEyMzQpIGJyZWFrOworCisJCWhhbmRsZWQgPSAxOworCisJCVdST1VURE9PUihyYWlkX2RldiwgMHgxMDAwMTIzNCk7CisKKwkJbnN0YXR1cyA9IDA7CisJCS8vIHdhaXQgZm9yIHZhbGlkIG51bXN0YXR1cyB0byBwb3N0CisJCWZvciAoaSA9IDA7IGkgPCAweEZGRkZGOyBpKyspIHsKKwkJCWlmIChtYm94LT5udW1zdGF0dXMgIT0gMHhGRikgeworCQkJCW5zdGF0dXMgPSBtYm94LT5udW1zdGF0dXM7CisJCQkJYnJlYWs7CisJCQl9CisJCQlybWIoKTsKKwkJfQorCQltYm94LT5udW1zdGF0dXMgPSAweEZGOworCisJCWFkYXB0ZXItPm91dHN0YW5kaW5nX2NtZHMgLT0gbnN0YXR1czsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnN0YXR1czsgaSsrKSB7CisKKwkJCS8vIHdhaXQgZm9yIHZhbGlkIGNvbW1hbmQgaW5kZXggdG8gcG9zdAorCQkJZm9yIChqID0gMDsgaiA8IDB4RkZGRkY7IGorKykgeworCQkJCWlmIChtYm94LT5jb21wbGV0ZWRbaV0gIT0gMHhGRikgYnJlYWs7CisJCQkJcm1iKCk7CisJCQl9CisJCQljb21wbGV0ZWRbaV0JCT0gbWJveC0+Y29tcGxldGVkW2ldOworCQkJbWJveC0+Y29tcGxldGVkW2ldCT0gMHhGRjsKKworCQkJaWYgKGNvbXBsZXRlZFtpXSA9PSAweEZGKSB7CisJCQkJY29uX2xvZyhDTF9BTk4sIChLRVJOX0NSSVQKKwkJCQkibWVnYXJhaWQ6IGNvbW1hbmQgcG9zdGluZyB0aW1lZCBvdXRcbiIpKTsKKworCQkJCUJVRygpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvLyBHZXQgU0NCIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbW1hbmQgaWQKKwkJCWlmIChjb21wbGV0ZWRbaV0gPj0gTUJPWF9NQVhfU0NTSV9DTURTKSB7CisJCQkJLy8gYSBjbW0gY29tbWFuZAorCQkJCXNjYiA9IGFkYXB0ZXItPnVzY2JfbGlzdCArIChjb21wbGV0ZWRbaV0gLQorCQkJCQkJTUJPWF9NQVhfU0NTSV9DTURTKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCS8vIGFuIG9zIGNvbW1hbmQKKwkJCQlzY2IgPSBhZGFwdGVyLT5rc2NiX2xpc3QgKyBjb21wbGV0ZWRbaV07CisJCQl9CisKKwkJCXNjYi0+c3RhdHVzID0gbWJveC0+c3RhdHVzOworCQkJbGlzdF9hZGRfdGFpbCgmc2NiLT5saXN0LCAmY2xpc3QpOworCQl9CisKKwkJLy8gQWNrbm93bGVkZ2UgaW50ZXJydXB0CisJCVdSSU5ET09SKHJhaWRfZGV2LCAweDAyKTsKKworCX0gd2hpbGUoMSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKE1BSUxCT1hfTE9DSyhyYWlkX2RldiksIGZsYWdzKTsKKworCisJLy8gcHV0IHRoZSBjb21wbGV0ZWQgY29tbWFuZHMgaW4gdGhlIGNvbXBsZXRlZCBsaXN0LiBEUEMgd291bGQKKwkvLyBjb21wbGV0ZSB0aGVzZSBjb21tYW5kcyBsYXRlcgorCXNwaW5fbG9ja19pcnFzYXZlKENPTVBMRVRFRF9MSVNUX0xPQ0soYWRhcHRlciksIGZsYWdzKTsKKworCWxpc3Rfc3BsaWNlKCZjbGlzdCwgJmFkYXB0ZXItPmNvbXBsZXRlZF9saXN0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ09NUExFVEVEX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCisKKwkvLyBzY2hlZHVsZSB0aGUgRFBDIGlmIHRoZXJlIGlzIHNvbWUgd29yayBmb3IgaXQKKwlpZiAoaGFuZGxlZCkKKwkJdGFza2xldF9zY2hlZHVsZSgmYWRhcHRlci0+ZHBjX2gpOworCisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9pc3IgLSBpc3IgZm9yIG1lbW9yeSBiYXNlZCBtYWlsYm94IGJhc2VkIGNvbnRyb2xsZXJzCisgKiBAaXJxCQktIGlycQorICogQGRldnAJLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKiBAcmVncwktIHVudXNlZAorICoKKyAqIEludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIG1lbW9yeS1tYXBwZWQgbWFpbGJveCBjb250cm9sbGVycy4KKyAqLworc3RhdGljIGlycXJldHVybl90CittZWdhcmFpZF9pc3IoaW50IGlycSwgdm9pZCAqZGV2cCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJYWRhcHRlcl90CSphZGFwdGVyID0gZGV2cDsKKwlpbnQJCWhhbmRsZWQ7CisKKwloYW5kbGVkID0gbWVnYXJhaWRfYWNrX3NlcXVlbmNlKGFkYXB0ZXIpOworCisJLyogTG9vcCB0aHJvdWdoIGFueSBwZW5kaW5nIHJlcXVlc3RzICovCisJaWYgKCFhZGFwdGVyLT5xdWllc2NlbnQpIHsKKwkJbWVnYXJhaWRfbWJveF9ydW5wZW5kcShhZGFwdGVyLCBOVUxMKTsKKwl9CisKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX21ib3hfc3luY19zY2IgLSBzeW5jIGtlcm5lbCBidWZmZXJzCisgKiBAYWRhcHRlcgk6IGNvbnRyb2xsZXIncyBzb2Z0IHN0YXRlCisgKiBAc2NiCQk6IHBvaW50ZXIgdG8gdGhlIHJlc291cmNlIHBhY2tldAorICoKKyAqIERNQSBzeW5jIGlmIHJlcXVpcmVkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK21lZ2FyYWlkX21ib3hfc3luY19zY2IoYWRhcHRlcl90ICphZGFwdGVyLCBzY2JfdCAqc2NiKQoreworCW1ib3hfY2NiX3QJKmNjYjsKKworCWNjYgk9IChtYm94X2NjYl90ICopc2NiLT5jY2I7CisKKwlzd2l0Y2ggKHNjYi0+ZG1hX3R5cGUpIHsKKworCWNhc2UgTVJBSURfRE1BX1dCVUY6CisJCWlmIChzY2ItPmRtYV9kaXJlY3Rpb24gPT0gUENJX0RNQV9GUk9NREVWSUNFKSB7CisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoYWRhcHRlci0+cGRldiwKKwkJCQkJY2NiLT5idWZfZG1hX2gsCisJCQkJCXNjYi0+c2NwLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCX0KKworCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LCBjY2ItPmJ1Zl9kbWFfaCwKKwkJCXNjYi0+c2NwLT5yZXF1ZXN0X2J1ZmZsZW4sIHNjYi0+ZG1hX2RpcmVjdGlvbik7CisKKwkJYnJlYWs7CisKKwljYXNlIE1SQUlEX0RNQV9XU0c6CisJCWlmIChzY2ItPmRtYV9kaXJlY3Rpb24gPT0gUENJX0RNQV9GUk9NREVWSUNFKSB7CisJCQlwY2lfZG1hX3N5bmNfc2dfZm9yX2NwdShhZGFwdGVyLT5wZGV2LAorCQkJCQlzY2ItPnNjcC0+cmVxdWVzdF9idWZmZXIsCisJCQkJCXNjYi0+c2NwLT51c2Vfc2csIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCX0KKworCQlwY2lfdW5tYXBfc2coYWRhcHRlci0+cGRldiwgc2NiLT5zY3AtPnJlcXVlc3RfYnVmZmVyLAorCQkJc2NiLT5zY3AtPnVzZV9zZywgc2NiLT5kbWFfZGlyZWN0aW9uKTsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybjsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX21ib3hfZHBjIC0gdGhlIHRhc2tsZXQgdG8gY29tcGxldGUgdGhlIGNvbW1hbmRzIGZyb20gY29tcGxldGVkIGxpc3QKKyAqIEBkZXZwCTogcG9pbnRlciB0byBIQkEgc29mdCBzdGF0ZQorICoKKyAqIFBpY2sgdXAgdGhlIGNvbW1hbmRzIGZyb20gdGhlIGNvbXBsZXRlZCBsaXN0IGFuZCBzZW5kIGJhY2sgdG8gdGhlIG93bmVycy4KKyAqIFRoaXMgaXMgYSByZWVudHJhbnQgZnVuY3Rpb24gYW5kIGRvZXMgbm90IGFzc3VtZSBhbnkgbG9ja3MgYXJlIGhlbGQgd2hpbGUKKyAqIGl0IGlzIGJlaW5nIGNhbGxlZC4KKyAqLworc3RhdGljIHZvaWQKK21lZ2FyYWlkX21ib3hfZHBjKHVuc2lnbmVkIGxvbmcgZGV2cCkKK3sKKwlhZGFwdGVyX3QJCSphZGFwdGVyID0gKGFkYXB0ZXJfdCAqKWRldnA7CisJbXJhaWRfZGV2aWNlX3QJCSpyYWlkX2RldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWNsaXN0OworCXN0cnVjdCBzY2F0dGVybGlzdAkqc2dsOworCXNjYl90CQkJKnNjYjsKKwlzY2JfdAkJCSp0bXA7CisJc3RydWN0IHNjc2lfY21uZAkqc2NwOworCW1yYWlkX3Bhc3N0aHJ1X3QJKnB0aHJ1OworCW1yYWlkX2VwYXNzdGhydV90CSplcHRocnU7CisJbWJveF9jY2JfdAkJKmNjYjsKKwlpbnQJCQlpc2xvZ2ljYWw7CisJaW50CQkJcGRldl9pbmRleDsKKwlpbnQJCQlwZGV2X3N0YXRlOworCW1ib3hfdAkJCSptYm94OworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCXVpbnQ4X3QJCQljOworCWludAkJCXN0YXR1czsKKworCisJaWYgKCFhZGFwdGVyKSByZXR1cm47CisKKwlyYWlkX2RldiA9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKKworCS8vIG1vdmUgdGhlIFNDQnMgZnJvbSB0aGUgY29tcGxldGVkIGxpc3QgdG8gb3VyIGxvY2FsIGxpc3QKKwlJTklUX0xJU1RfSEVBRCgmY2xpc3QpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoQ09NUExFVEVEX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCisJbGlzdF9zcGxpY2VfaW5pdCgmYWRhcHRlci0+Y29tcGxldGVkX2xpc3QsICZjbGlzdCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKENPTVBMRVRFRF9MSVNUX0xPQ0soYWRhcHRlciksIGZsYWdzKTsKKworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNjYiwgdG1wLCAmY2xpc3QsIGxpc3QpIHsKKworCQlzdGF0dXMJCT0gc2NiLT5zdGF0dXM7CisJCXNjcAkJPSBzY2ItPnNjcDsKKwkJY2NiCQk9IChtYm94X2NjYl90ICopc2NiLT5jY2I7CisJCXB0aHJ1CQk9IGNjYi0+cHRocnU7CisJCWVwdGhydQkJPSBjY2ItPmVwdGhydTsKKwkJbWJveAkJPSBjY2ItPm1ib3g7CisKKwkJLy8gTWFrZSBzdXJlIGYvdyBoYXMgY29tcGxldGVkIGEgdmFsaWQgY29tbWFuZAorCQlpZiAoc2NiLT5zdGF0ZSAhPSBTQ0JfSVNTVUVEKSB7CisJCQljb25fbG9nKENMX0FOTiwgKEtFUk5fQ1JJVAorCQkJIm1lZ2FyYWlkIGNyaXRpY2FsIGVycjogaW52YWxpZCBjb21tYW5kICVkOiVkOiVwXG4iLAorCQkJCXNjYi0+c25vLCBzY2ItPnN0YXRlLCBzY3ApKTsKKwkJCUJVRygpOworCQkJY29udGludWU7CS8vIE11c3QgbmV2ZXIgaGFwcGVuIQorCQl9CisKKwkJLy8gY2hlY2sgZm9yIHRoZSBtYW5hZ2VtZW50IGNvbW1hbmQgYW5kIGNvbXBsZXRlIGl0IHJpZ2h0IGF3YXkKKwkJaWYgKHNjYi0+c25vID49IE1CT1hfTUFYX1NDU0lfQ01EUykgeworCQkJc2NiLT5zdGF0ZQk9IFNDQl9GUkVFOworCQkJc2NiLT5zdGF0dXMJPSBzdGF0dXM7CisKKwkJCS8vIHJlbW92ZSBmcm9tIGxvY2FsIGNsaXN0CisJCQlsaXN0X2RlbF9pbml0KCZzY2ItPmxpc3QpOworCisJCQltZWdhcmFpZF9tYm94X21tX2RvbmUoYWRhcHRlciwgc2NiKTsKKworCQkJY29udGludWU7CisJCX0KKworCQkvLyBXYXMgYW4gYWJvcnQgaXNzdWVkIGZvciB0aGlzIGNvbW1hbmQgZWFybGllcgorCQlpZiAoc2NiLT5zdGF0ZSAmIFNDQl9BQk9SVCkgeworCQkJY29uX2xvZyhDTF9BTk4sIChLRVJOX05PVElDRQorCQkJIm1lZ2FyYWlkOiBhYm9ydGVkIGNtZCAlbHhbJXhdIGNvbXBsZXRlZFxuIiwKKwkJCQlzY3AtPnNlcmlhbF9udW1iZXIsIHNjYi0+c25vKSk7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGUgaW5xdWlyeSBjYW1lIG9mIGEgZGlzayBkcml2ZSB3aGljaCBpcyBub3QgcGFydCBvZgorCQkgKiBhbnkgUkFJRCBhcnJheSwgZXhwb3NlIGl0IHRvIHRoZSBrZXJuZWwuIEZvciB0aGlzIHRvIGJlCisJCSAqIGVuYWJsZWQsIHVzZXIgbXVzdCBzZXQgdGhlICJtZWdhcmFpZF9leHBvc2VfdW5jb25mX2Rpc2tzIgorCQkgKiBmbGFnIHRvIDEgYnkgc3BlY2lmeWluZyBpdCBvbiBtb2R1bGUgcGFyYW1ldGVyIGxpc3QuCisJCSAqIFRoaXMgd291bGQgZW5hYmxlIGRhdGEgbWlncmF0aW9uIG9mZiBkcml2ZXMgZnJvbSBvdGhlcgorCQkgKiBjb25maWd1cmF0aW9ucy4KKwkJICovCisJCWlzbG9naWNhbCA9IE1SQUlEX0lTX0xPR0lDQUwoYWRhcHRlciwgc2NwKTsKKwkJaWYgKHNjcC0+Y21uZFswXSA9PSBJTlFVSVJZICYmIHN0YXR1cyA9PSAwICYmIGlzbG9naWNhbCA9PSAwCisJCQkJJiYgSVNfUkFJRF9DSChyYWlkX2Rldiwgc2NiLT5kZXZfY2hhbm5lbCkpIHsKKworCQkJaWYgKHNjcC0+dXNlX3NnKSB7CisJCQkJc2dsID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKQorCQkJCQlzY3AtPnJlcXVlc3RfYnVmZmVyOworCisJCQkJaWYgKHNnbC0+cGFnZSkgeworCQkJCQljID0gKih1bnNpZ25lZCBjaGFyICopCisJCQkJCShwYWdlX2FkZHJlc3MoKCZzZ2xbMF0pLT5wYWdlKSArCisJCQkJCQkoJnNnbFswXSktPm9mZnNldCk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJCQkibWVnYXJhaWQgbWFpbGJveDogaW52YWxpZCBzZzolZFxuIiwKKwkJCQkJX19MSU5FX18pKTsKKwkJCQkJYyA9IDA7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJYyA9ICoodWludDhfdCAqKXNjcC0+cmVxdWVzdF9idWZmZXI7CisJCQl9CisKKwkJCWlmICgoYyAmIDB4MUYgKSA9PSBUWVBFX0RJU0spIHsKKwkJCQlwZGV2X2luZGV4ID0gKHNjYi0+ZGV2X2NoYW5uZWwgKiAxNikgKworCQkJCQlzY2ItPmRldl90YXJnZXQ7CisJCQkJcGRldl9zdGF0ZSA9CisJCQkJCXJhaWRfZGV2LT5wZHJ2X3N0YXRlW3BkZXZfaW5kZXhdICYgMHgwRjsKKworCQkJCWlmIChwZGV2X3N0YXRlID09IFBEUlZfT05MSU5FCQl8fAorCQkJCQlwZGV2X3N0YXRlID09IFBEUlZfRkFJTEVECXx8CisJCQkJCXBkZXZfc3RhdGUgPT0gUERSVl9SQkxECQl8fAorCQkJCQlwZGV2X3N0YXRlID09IFBEUlZfSE9UU1BBUkUJfHwKKwkJCQkJbWVnYXJhaWRfZXhwb3NlX3VuY29uZl9kaXNrcyA9PSAwKSB7CisKKwkJCQkJc3RhdHVzID0gMHhGMDsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBDb252ZXJ0IE1lZ2FSQUlEIHN0YXR1cyB0byBMaW51eCBlcnJvciBjb2RlCisJCXN3aXRjaCAoc3RhdHVzKSB7CisKKwkJY2FzZSAweDAwOgorCisJCQlzY3AtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDAyOgorCisJCQkvKiBzZXQgc2Vuc2VfYnVmZmVyIGFuZCByZXN1bHQgZmllbGRzICovCisJCQlpZiAobWJveC0+Y21kID09IE1CT1hDTURfUEFTU1RIUlUgfHwKKwkJCQltYm94LT5jbWQgPT0gTUJPWENNRF9QQVNTVEhSVTY0KSB7CisKKwkJCQltZW1jcHkoc2NwLT5zZW5zZV9idWZmZXIsIHB0aHJ1LT5yZXFzZW5zZWFyZWEsCisJCQkJCQkxNCk7CisKKwkJCQlzY3AtPnJlc3VsdCA9IERSSVZFUl9TRU5TRSA8PCAyNCB8CisJCQkJCURJRF9PSyA8PCAxNiB8IENIRUNLX0NPTkRJVElPTiA8PCAxOworCQkJfQorCQkJZWxzZSB7CisJCQkJaWYgKG1ib3gtPmNtZCA9PSBNQk9YQ01EX0VYVFBUSFJVKSB7CisKKwkJCQkJbWVtY3B5KHNjcC0+c2Vuc2VfYnVmZmVyLAorCQkJCQkJZXB0aHJ1LT5yZXFzZW5zZWFyZWEsIDE0KTsKKworCQkJCQlzY3AtPnJlc3VsdCA9IERSSVZFUl9TRU5TRSA8PCAyNCB8CisJCQkJCQlESURfT0sgPDwgMTYgfAorCQkJCQkJQ0hFQ0tfQ09ORElUSU9OIDw8IDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2NwLT5zZW5zZV9idWZmZXJbMF0gPSAweDcwOworCQkJCQlzY3AtPnNlbnNlX2J1ZmZlclsyXSA9IEFCT1JURURfQ09NTUFORDsKKwkJCQkJc2NwLT5yZXN1bHQgPSBDSEVDS19DT05ESVRJT04gPDwgMTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDB4MDg6CisKKwkJCXNjcC0+cmVzdWx0ID0gRElEX0JVU19CVVNZIDw8IDE2IHwgc3RhdHVzOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKworCQkJLyoKKwkJCSAqIElmIFRFU1RfVU5JVF9SRUFEWSBmYWlscywgd2Uga25vdyBSRVNFUlZBVElPTl9TVEFUVVMKKwkJCSAqIGZhaWxlZAorCQkJICovCisJCQlpZiAoc2NwLT5jbW5kWzBdID09IFRFU1RfVU5JVF9SRUFEWSkgeworCQkJCXNjcC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2IHwKKwkJCQkJUkVTRVJWQVRJT05fQ09ORkxJQ1QgPDwgMTsKKwkJCX0KKwkJCWVsc2UKKwkJCS8qCisJCQkgKiBFcnJvciBjb2RlIHJldHVybmVkIGlzIDEgaWYgUmVzZXJ2ZSBvciBSZWxlYXNlCisJCQkgKiBmYWlsZWQgb3IgdGhlIGlucHV0IHBhcmFtZXRlciBpcyBpbnZhbGlkCisJCQkgKi8KKwkJCWlmIChzdGF0dXMgPT0gMSAmJiAoc2NwLT5jbW5kWzBdID09IFJFU0VSVkUgfHwKKwkJCQkJIHNjcC0+Y21uZFswXSA9PSBSRUxFQVNFKSkgeworCisJCQkJc2NwLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTYgfAorCQkJCQlSRVNFUlZBVElPTl9DT05GTElDVCA8PCAxOworCQkJfQorCQkJZWxzZSB7CisJCQkJc2NwLT5yZXN1bHQgPSBESURfQkFEX1RBUkdFVCA8PCAxNiB8IHN0YXR1czsKKwkJCX0KKwkJfQorCisJCS8vIHByaW50IGEgZGVidWcgbWVzc2FnZSBmb3IgYWxsIGZhaWxlZCBjb21tYW5kcworCQlpZiAoc3RhdHVzKSB7CisJCQltZWdhcmFpZF9tYm94X2Rpc3BsYXlfc2NiKGFkYXB0ZXIsIHNjYik7CisJCX0KKworCQkvLyBGcmVlIG91ciBpbnRlcm5hbCByZXNvdXJjZXMgYW5kIGNhbGwgdGhlIG1pZC1sYXllciBjYWxsYmFjaworCQkvLyByb3V0aW5lCisJCW1lZ2FyYWlkX21ib3hfc3luY19zY2IoYWRhcHRlciwgc2NiKTsKKworCQkvLyByZW1vdmUgZnJvbSBsb2NhbCBjbGlzdAorCQlsaXN0X2RlbF9pbml0KCZzY2ItPmxpc3QpOworCisJCS8vIHB1dCBiYWNrIGluIGZyZWUgbGlzdAorCQltZWdhcmFpZF9kZWFsbG9jX3NjYihhZGFwdGVyLCBzY2IpOworCisJCS8vIHNlbmQgdGhlIHNjc2kgcGFja2V0IGJhY2sgdG8ga2VybmVsCisJCXNwaW5fbG9jayhhZGFwdGVyLT5ob3N0X2xvY2spOworCQlzY3AtPnNjc2lfZG9uZShzY3ApOworCQlzcGluX3VubG9jayhhZGFwdGVyLT5ob3N0X2xvY2spOworCX0KKworCXJldHVybjsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX2Fib3J0X2hhbmRsZXIgLSBhYm9ydCB0aGUgc2NzaSBjb21tYW5kCisgKiBAc2NwCQk6IGNvbW1hbmQgdG8gYmUgYWJvcnRlZAorICoKKyAqIEFib3J0IGEgcHJldmlvdXMgU0NTSSByZXF1ZXN0LiBPbmx5IGNvbW1hbmRzIG9uIHRoZSBwZW5kaW5nIGxpc3QgY2FuIGJlCisgKiBhYm9ydGVkLiBBbGwgdGhlIGNvbW1hbmRzIGlzc3VlZCB0byB0aGUgRi9XIG11c3QgY29tcGxldGUuCisgKiovCitzdGF0aWMgaW50CittZWdhcmFpZF9hYm9ydF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjcCkKK3sKKwlhZGFwdGVyX3QJCSphZGFwdGVyOworCW1yYWlkX2RldmljZV90CQkqcmFpZF9kZXY7CisJc2NiX3QJCQkqc2NiOworCXNjYl90CQkJKnRtcDsKKwlpbnQJCQlmb3VuZDsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlpbnQJCQlpOworCisKKwlhZGFwdGVyCQk9IFNDUDJBREFQVEVSKHNjcCk7CisJcmFpZF9kZXYJPSBBREFQMlJBSURERVYoYWRhcHRlcik7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoYWRhcHRlci0+aG9zdF9sb2NrKTsKKworCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCSJtZWdhcmFpZDogYWJvcnRpbmctJWxkIGNtZD0leCA8Yz0lZCB0PSVkIGw9JWQ+XG4iLAorCQlzY3AtPnNlcmlhbF9udW1iZXIsIHNjcC0+Y21uZFswXSwgU0NQMkNIQU5ORUwoc2NwKSwKKwkJU0NQMlRBUkdFVChzY3ApLCBTQ1AyTFVOKHNjcCkpKTsKKworCS8vIElmIEZXIGhhcyBzdG9wcGVkIHJlc3BvbmRpbmcsIHNpbXBseSByZXR1cm4gZmFpbHVyZQorCWlmIChyYWlkX2Rldi0+aHdfZXJyb3IpIHsKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX05PVElDRQorCQkJIm1lZ2FyYWlkOiBodyBlcnJvciwgbm90IGFib3J0aW5nXG4iKSk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJLy8gVGhlcmUgbWlnaHQgYSByYWNlIGhlcmUsIHdoZXJlIHRoZSBjb21tYW5kIHdhcyBjb21wbGV0ZWQgYnkgdGhlCisJLy8gZmlybXdhcmUgYW5kIG5vdyBpdCBpcyBvbiB0aGUgY29tcGxldGVkIGxpc3QuIEJlZm9yZSB3ZSBjb3VsZAorCS8vIGNvbXBsZXRlIHRoZSBjb21tYW5kIHRvIHRoZSBrZXJuZWwgaW4gZHBjLCB0aGUgYWJvcnQgY2FtZS4KKwkvLyBGaW5kIG91dCBpZiB0aGlzIGlzIHRoZSBjYXNlIHRvIGF2b2lkIHRoZSByYWNlLgorCXNjYiA9IE5VTEw7CisJc3Bpbl9sb2NrX2lycXNhdmUoQ09NUExFVEVEX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzY2IsIHRtcCwgJmFkYXB0ZXItPmNvbXBsZXRlZF9saXN0LCBsaXN0KSB7CisKKwkJaWYgKHNjYi0+c2NwID09IHNjcCkgewkvLyBGb3VuZCBjb21tYW5kCisKKwkJCWxpc3RfZGVsX2luaXQoJnNjYi0+bGlzdCk7CS8vIGZyb20gY29tcGxldGVkIGxpc3QKKworCQkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCSJtZWdhcmFpZDogJWxkOiVkWyVkOiVkXSwgYWJvcnQgZnJvbSBjb21wbGV0ZWQgbGlzdFxuIiwKKwkJCQlzY3AtPnNlcmlhbF9udW1iZXIsIHNjYi0+c25vLAorCQkJCXNjYi0+ZGV2X2NoYW5uZWwsIHNjYi0+ZGV2X3RhcmdldCkpOworCisJCQlzY3AtPnJlc3VsdCA9IChESURfQUJPUlQgPDwgMTYpOworCQkJc2NwLT5zY3NpX2RvbmUoc2NwKTsKKworCQkJbWVnYXJhaWRfZGVhbGxvY19zY2IoYWRhcHRlciwgc2NiKTsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDT01QTEVURURfTElTVF9MT0NLKGFkYXB0ZXIpLAorCQkJCWZsYWdzKTsKKworCQkJcmV0dXJuIFNVQ0NFU1M7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDT01QTEVURURfTElTVF9MT0NLKGFkYXB0ZXIpLCBmbGFncyk7CisKKworCS8vIEZpbmQgb3V0IGlmIHRoaXMgY29tbWFuZCBpcyBzdGlsbCBvbiB0aGUgcGVuZGluZyBsaXN0LiBJZiBpdCBpcyBhbmQKKwkvLyB3YXMgbmV2ZXIgaXNzdWVkLCBhYm9ydCBhbmQgcmV0dXJuIHN1Y2Nlc3MuIElmIHRoZSBjb21tYW5kIGlzIG93bmVkCisJLy8gYnkgdGhlIGZpcm13YXJlLCB3ZSBtdXN0IHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlIGJ5IHRoZSBGVy4KKwlzcGluX2xvY2tfaXJxc2F2ZShQRU5ESU5HX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzY2IsIHRtcCwgJmFkYXB0ZXItPnBlbmRfbGlzdCwgbGlzdCkgeworCisJCWlmIChzY2ItPnNjcCA9PSBzY3ApIHsJLy8gRm91bmQgY29tbWFuZAorCisJCQlsaXN0X2RlbF9pbml0KCZzY2ItPmxpc3QpOwkvLyBmcm9tIHBlbmRpbmcgbGlzdAorCisJCQlBU1NFUlQoIShzY2ItPnN0YXRlICYgU0NCX0lTU1VFRCkpOworCisJCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJCSJtZWdhcmFpZCBhYm9ydDogJWxkWyVkOiVkXSwgZHJpdmVyIG93bmVyXG4iLAorCQkJCXNjcC0+c2VyaWFsX251bWJlciwgc2NiLT5kZXZfY2hhbm5lbCwKKwkJCQlzY2ItPmRldl90YXJnZXQpKTsKKworCQkJc2NwLT5yZXN1bHQgPSAoRElEX0FCT1JUIDw8IDE2KTsKKwkJCXNjcC0+c2NzaV9kb25lKHNjcCk7CisKKwkJCW1lZ2FyYWlkX2RlYWxsb2Nfc2NiKGFkYXB0ZXIsIHNjYik7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoUEVORElOR19MSVNUX0xPQ0soYWRhcHRlciksCisJCQkJZmxhZ3MpOworCisJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKFBFTkRJTkdfTElTVF9MT0NLKGFkYXB0ZXIpLCBmbGFncyk7CisKKworCS8vIENoZWNrIGRvIHdlIGV2ZW4gb3duIHRoaXMgY29tbWFuZCwgaW4gd2hpY2ggY2FzZSB0aGlzIHdvdWxkIGJlCisJLy8gb3duZWQgYnkgdGhlIGZpcm13YXJlLiBUaGUgb25seSB3YXkgdG8gbG9jYXRlIHRoZSBGVyBzY2IgaXMgdG8KKwkvLyB0cmF2ZXJzZSB0aHJvdWdoIHRoZSBsaXN0IG9mIGFsbCBTQ0IsIHNpbmNlIGRyaXZlciBkb2VzIG5vdAorCS8vIG1haW50YWluIHRoZXNlIFNDQnMgb24gYW55IGxpc3QKKwlmb3VuZCA9IDA7CisJZm9yIChpID0gMDsgaSA8IE1CT1hfTUFYX1NDU0lfQ01EUzsgaSsrKSB7CisJCXNjYiA9IGFkYXB0ZXItPmtzY2JfbGlzdCArIGk7CisKKwkJaWYgKHNjYi0+c2NwID09IHNjcCkgeworCisJCQlmb3VuZCA9IDE7CisKKwkJCWlmICghKHNjYi0+c3RhdGUgJiBTQ0JfSVNTVUVEKSkgeworCQkJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkJIm1lZ2FyYWlkIGFib3J0OiAlbGQlZFslZDolZF0sIGludmFsaWQgc3RhdGVcbiIsCisJCQkJc2NwLT5zZXJpYWxfbnVtYmVyLCBzY2ItPnNubywgc2NiLT5kZXZfY2hhbm5lbCwKKwkJCQlzY2ItPmRldl90YXJnZXQpKTsKKwkJCQlCVUcoKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkJIm1lZ2FyYWlkIGFib3J0OiAlbGQ6JWRbJWQ6JWRdLCBmdyBvd25lclxuIiwKKwkJCQlzY3AtPnNlcmlhbF9udW1iZXIsIHNjYi0+c25vLCBzY2ItPmRldl9jaGFubmVsLAorCQkJCXNjYi0+ZGV2X3RhcmdldCkpOworCQkJfQorCQl9CisJfQorCisJaWYgKCFmb3VuZCkgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkIGFib3J0OiBzY3NpIGNtZDolbGQsIGRvIG5vdyBvd25cbiIsCisJCQlzY3AtPnNlcmlhbF9udW1iZXIpKTsKKworCQkvLyBGSVhNRTogU2hvdWxkIHRoZXJlIGJlIGEgY2FsbGJhY2sgZm9yIHRoaXMgY29tbWFuZD8KKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCisJLy8gV2UgY2Fubm90IGFjdHVhbGx5IGFib3J0IGEgY29tbWFuZCBvd25lZCBieSBmaXJtd2FyZSwgcmV0dXJuCisJLy8gZmFpbHVyZSBhbmQgd2FpdCBmb3IgcmVzZXQuIEluIGhvc3QgcmVzZXQgaGFuZGxlciwgd2Ugd2lsbCBmaW5kIG91dAorCS8vIGlmIHRoZSBIQkEgaXMgc3RpbGwgbGl2ZQorCXJldHVybiBGQUlMRUQ7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9yZXNldF9oYW5kbGVyIC0gZGV2aWNlIHJlc2V0IGhhZGxlciBmb3IgbWFpbGJveCBiYXNlZCBkcml2ZXIKKyAqIEBzY3AJCTogcmVmZXJlbmNlIGNvbW1hbmQKKyAqCisgKiBSZXNldCBoYW5kbGVyIGZvciB0aGUgbWFpbGJveCBiYXNlZCBjb250cm9sbGVyLiBGaXJzdCB0cnkgdG8gZmluZCBvdXQgaWYKKyAqIHRoZSBGVyBpcyBzdGlsbCBsaXZlLCBpbiB3aGljaCBjYXNlIHRoZSBvdXRzdGFuZGluZyBjb21tYW5kcyBjb3VudGVyIG11dCBnbworICogZG93biB0byAwLiBJZiB0aGF0IGhhcHBlbnMsIGFsc28gaXNzdWUgdGhlIHJlc2VydmF0aW9uIHJlc2V0IGNvbW1hbmQgdG8KKyAqIHJlbGlucXVpc2ggKHBvc3NpYmxlKSByZXNlcnZhdGlvbnMgb24gdGhlIGxvZ2ljYWwgZHJpdmVzIGNvbm5lY3RlZCB0byB0aGlzCisgKiBob3N0CisgKiovCitzdGF0aWMgaW50CittZWdhcmFpZF9yZXNldF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjcCkKK3sKKwlhZGFwdGVyX3QJKmFkYXB0ZXI7CisJc2NiX3QJCSpzY2I7CisJc2NiX3QJCSp0bXA7CisJbXJhaWRfZGV2aWNlX3QJKnJhaWRfZGV2OworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdWludDhfdAkJcmF3X21ib3hbc2l6ZW9mKG1ib3hfdCldOworCWludAkJcnZhbDsKKwlpbnQJCXJlY292ZXJ5X3dpbmRvdzsKKwlpbnQJCXJlY292ZXJpbmc7CisJaW50CQlpOworCisJYWRhcHRlcgkJPSBTQ1AyQURBUFRFUihzY3ApOworCXJhaWRfZGV2CT0gQURBUDJSQUlEREVWKGFkYXB0ZXIpOworCisJYXNzZXJ0X3NwaW5fbG9ja2VkKGFkYXB0ZXItPmhvc3RfbG9jayk7CisKKwljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORyAibWVnYXJhaWQ6IHJlc2V0aW5nIHRoZSBob3N0Li4uXG4iKSk7CisKKwkvLyByZXR1cm4gZmFpbHVyZSBpZiBhZGFwdGVyIGlzIG5vdCByZXNwb25kaW5nCisJaWYgKHJhaWRfZGV2LT5od19lcnJvcikgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fTk9USUNFCisJCQkibWVnYXJhaWQ6IGh3IGVycm9yLCBjYW5ub3QgcmVzZXRcbiIpKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKworCS8vIFVuZGVyIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbnMsIEZXIGNhbiB0YWtlIHVwIHRvIDMgbWludXRlcyB0bworCS8vIGNvbXBsZXRlIGNvbW1hbmQgcHJvY2Vzc2luZy4gV2FpdCBmb3IgYWRkaXRpb25hbCAyIG1pbnV0ZXMgZm9yIHRoZQorCS8vIHBlbmRpbmcgY29tbWFuZHMgY291bnRlciB0byBnbyBkb3duIHRvIDAuIElmIGl0IGRvZXNuJ3QsIGxldCB0aGUKKwkvLyBjb250cm9sbGVyIGJlIG1hcmtlZCBvZmZsaW5lCisJLy8gQWxzbywgcmVzZXQgYWxsIHRoZSBjb21tYW5kcyBjdXJyZW50bHkgb3duZWQgYnkgdGhlIGRyaXZlcgorCXNwaW5fbG9ja19pcnFzYXZlKFBFTkRJTkdfTElTVF9MT0NLKGFkYXB0ZXIpLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNjYiwgdG1wLCAmYWRhcHRlci0+cGVuZF9saXN0LCBsaXN0KSB7CisKKwkJbGlzdF9kZWxfaW5pdCgmc2NiLT5saXN0KTsJLy8gZnJvbSBwZW5kaW5nIGxpc3QKKworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiAlbGQ6JWRbJWQ6JWRdLCByZXNldCBmcm9tIHBlbmRpbmcgbGlzdFxuIiwKKwkJCQlzY3AtPnNlcmlhbF9udW1iZXIsIHNjYi0+c25vLAorCQkJCXNjYi0+ZGV2X2NoYW5uZWwsIHNjYi0+ZGV2X3RhcmdldCkpOworCisJCXNjcC0+cmVzdWx0ID0gKERJRF9SRVNFVCA8PCAxNik7CisJCXNjcC0+c2NzaV9kb25lKHNjcCk7CisKKwkJbWVnYXJhaWRfZGVhbGxvY19zY2IoYWRhcHRlciwgc2NiKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShQRU5ESU5HX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCisJaWYgKGFkYXB0ZXItPm91dHN0YW5kaW5nX2NtZHMpIHsKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX05PVElDRQorCQkJIm1lZ2FyYWlkOiAlZCBvdXRzdGFuZGluZyBjb21tYW5kcy4gTWF4IHdhaXQgJWQgc2VjXG4iLAorCQkJYWRhcHRlci0+b3V0c3RhbmRpbmdfY21kcywgTUJPWF9SRVNFVF9XQUlUKSk7CisJfQorCisJc3Bpbl91bmxvY2soYWRhcHRlci0+aG9zdF9sb2NrKTsKKworCXJlY292ZXJ5X3dpbmRvdyA9IE1CT1hfUkVTRVRfV0FJVCArIE1CT1hfUkVTRVRfRVhUX1dBSVQ7CisKKwlyZWNvdmVyaW5nID0gYWRhcHRlci0+b3V0c3RhbmRpbmdfY21kczsKKworCWZvciAoaSA9IDA7IGkgPCByZWNvdmVyeV93aW5kb3cgJiYgYWRhcHRlci0+b3V0c3RhbmRpbmdfY21kczsgaSsrKSB7CisKKwkJbWVnYXJhaWRfYWNrX3NlcXVlbmNlKGFkYXB0ZXIpOworCisJCS8vIHByaW50IGEgbWVzc2FnZSBvbmNlIGV2ZXJ5IDUgc2Vjb25kcyBvbmx5CisJCWlmICghKGkgJSA1KSkgeworCQkJY29uX2xvZyhDTF9BTk4sICgKKwkJCSJtZWdhcmFpZCBtYm94OiBXYWl0IGZvciAlZCBjb21tYW5kcyB0byBjb21wbGV0ZTolZFxuIiwKKwkJCQlhZGFwdGVyLT5vdXRzdGFuZGluZ19jbWRzLAorCQkJCU1CT1hfUkVTRVRfV0FJVCAtIGkpKTsKKwkJfQorCisJCS8vIGJhaWxvdXQgaWYgbm8gcmVjb3ZlcnkgaGFwcGVuZGVkIGluIHJlc2V0IHRpbWUKKwkJaWYgKChpID09IE1CT1hfUkVTRVRfV0FJVCkgJiYKKwkJCShyZWNvdmVyaW5nID09IGFkYXB0ZXItPm91dHN0YW5kaW5nX2NtZHMpKSB7CisJCQlicmVhazsKKwkJfQorCisJCW1zbGVlcCgxMDAwKTsKKwl9CisKKwlzcGluX2xvY2soYWRhcHRlci0+aG9zdF9sb2NrKTsKKworCS8vIElmIHN0aWxsIG91dHN0YW5kaW5nIGNvbW1hbmRzLCBiYWlsIG91dAorCWlmIChhZGFwdGVyLT5vdXRzdGFuZGluZ19jbWRzKSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQgbWJveDogY3JpdGljYWwgaGFyZHdhcmUgZXJyb3IhXG4iKSk7CisKKwkJcmFpZF9kZXYtPmh3X2Vycm9yID0gMTsKKworCQlyZXR1cm4gRkFJTEVEOworCX0KKwllbHNlIHsKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX05PVElDRQorCQkibWVnYXJhaWQgbWJveDogcmVzZXQgc2VxdWVuY2UgY29tcGxldGVkIHN1Y2Vzc2Z1bGx5XG4iKSk7CisJfQorCisKKwkvLyBJZiB0aGUgY29udHJvbGxlciBzdXBwb3J0cyBjbHVzdGVyaW5nLCByZXNldCByZXNlcnZhdGlvbnMKKwlpZiAoIWFkYXB0ZXItPmhhKSByZXR1cm4gU1VDQ0VTUzsKKworCS8vIGNsZWFyIHJlc2VydmF0aW9ucyBpZiBhbnkKKwlyYXdfbWJveFswXSA9IENMVVNURVJfQ01EOworCXJhd19tYm94WzJdID0gUkVTRVRfUkVTRVJWQVRJT05TOworCisJcnZhbCA9IFNVQ0NFU1M7CisJaWYgKG1ib3hfcG9zdF9zeW5jX2NtZF9mYXN0KGFkYXB0ZXIsIHJhd19tYm94KSA9PSAwKSB7CisJCWNvbl9sb2coQ0xfQU5OLAorCQkJKEtFUk5fSU5GTyAibWVnYXJhaWQ6IHJlc2VydmF0aW9uIHJlc2V0XG4iKSk7CisJfQorCWVsc2UgeworCQlydmFsID0gRkFJTEVEOworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJCSJtZWdhcmFpZDogcmVzZXJ2YXRpb24gcmVzZXQgZmFpbGVkXG4iKSk7CisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKworLyoKKyAqIFNUQVJUOiBpbnRlcm5hbCBjb21tYW5kcyBsaWJyYXJ5CisgKgorICogVGhpcyBzZWN0aW9uIG9mIHRoZSBkcml2ZXIgaGFzIHRoZSBjb21tb24gcm91dGluZSB1c2VkIGJ5IHRoZSBkcml2ZXIgYW5kCisgKiBhbHNvIGhhcyBhbGwgdGhlIEZXIHJvdXRpbmVzCisgKi8KKworLyoqCisgKiBtYm94X3Bvc3Rfc3luY19jbWQoKSAtIGJsb2NraW5nIGNvbW1hbmQgdG8gdGhlIG1haWxib3ggYmFzZWQgY29udHJvbGxlcnMKKyAqIEBhZGFwdGVyCS0gY29udHJvbGxlcidzIHNvZnQgc3RhdGUKKyAqIEByYXdfbWJveAktIHRoZSBtYWlsYm94CisgKgorICogSXNzdWUgYSBzY2IgaW4gc3luY2hyb25vdXMgYW5kIG5vbi1pbnRlcnJ1cHQgbW9kZSBmb3IgbWFpbGJveCBiYXNlZAorICogY29udHJvbGxlcnMKKyAqLworc3RhdGljIGludAorbWJveF9wb3N0X3N5bmNfY21kKGFkYXB0ZXJfdCAqYWRhcHRlciwgdWludDhfdCByYXdfbWJveFtdKQoreworCW1yYWlkX2RldmljZV90CSpyYWlkX2RldiA9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKKwltYm94NjRfdAkqbWJveDY0OworCW1ib3hfdAkJKm1ib3g7CisJdWludDhfdAkJc3RhdHVzOworCWludAkJaTsKKworCisJbWJveDY0CT0gcmFpZF9kZXYtPm1ib3g2NDsKKwltYm94CT0gcmFpZF9kZXYtPm1ib3g7CisKKwkvKgorCSAqIFdhaXQgdW50aWwgbWFpbGJveCBpcyBmcmVlCisJICovCisJaWYgKG1lZ2FyYWlkX2J1c3l3YWl0X21ib3gocmFpZF9kZXYpICE9IDApCisJCWdvdG8gYmxvY2tlZF9tYWlsYm94OworCisJLyoKKwkgKiBDb3B5IG1haWxib3ggZGF0YSBpbnRvIGhvc3Qgc3RydWN0dXJlCisJICovCisJbWVtY3B5KChjYWRkcl90KW1ib3gsIChjYWRkcl90KXJhd19tYm94LCAxNik7CisJbWJveC0+Y21kaWQJCT0gMHhGRTsKKwltYm94LT5idXN5CQk9IDE7CisJbWJveC0+cG9sbAkJPSAwOworCW1ib3gtPmFjawkJPSAwOworCW1ib3gtPm51bXN0YXR1cwkJPSAweEZGOworCW1ib3gtPnN0YXR1cwkJPSAweEZGOworCisJd21iKCk7CisJV1JJTkRPT1IocmFpZF9kZXYsIHJhaWRfZGV2LT5tYm94X2RtYSB8IDB4MSk7CisKKwkvLyB3YWl0IGZvciBtYXhpbXVtIDEgc2Vjb25kIGZvciBzdGF0dXMgdG8gcG9zdC4gSWYgdGhlIHN0YXR1cyBpcyBub3QKKwkvLyBhdmFpbGFibGUgd2l0aGluIDEgc2Vjb25kLCBhc3N1bWUgRlcgaXMgaW5pdGlhbGl6aW5nIGFuZCB3YWl0CisJLy8gZm9yIGFuIGV4dGVuZGVkIGFtb3VudCBvZiB0aW1lCisJaWYgKG1ib3gtPm51bXN0YXR1cyA9PSAweEZGKSB7CS8vIHN0YXR1cyBub3QgeWV0IGF2YWlsYWJsZQorCQl1ZGVsYXkoMjUpOzsKKworCQlmb3IgKGkgPSAwOyBtYm94LT5udW1zdGF0dXMgPT0gMHhGRiAmJiBpIDwgMTAwMDsgaSsrKSB7CisJCQlybWIoKTsKKwkJCW1zbGVlcCgxKTsKKwkJfQorCisKKwkJaWYgKGkgPT0gMTAwMCkgeworCQkJY29uX2xvZyhDTF9BTk4sIChLRVJOX05PVElDRQorCQkJCSJtZWdhcmFpZCBtYWlsYm94OiB3YWl0IGZvciBGVyB0byBib290ICAgICAgIikpOworCisJCQlmb3IgKGkgPSAwOyAobWJveC0+bnVtc3RhdHVzID09IDB4RkYpICYmCisJCQkJCShpIDwgTUJPWF9SRVNFVF9XQUlUKTsgaSsrKSB7CisJCQkJcm1iKCk7CisJCQkJY29uX2xvZyhDTF9BTk4sICgiXGJcYlxiXGJcYlslMDNkXSIsCisJCQkJCQkJTUJPWF9SRVNFVF9XQUlUIC0gaSkpOworCQkJCW1zbGVlcCgxMDAwKTsKKwkJCX0KKworCQkJaWYgKGkgPT0gTUJPWF9SRVNFVF9XQUlUKSB7CisKKwkJCQljb25fbG9nKENMX0FOTiwgKAorCQkJCSJcbm1lZ2FyYWlkIG1haWxib3g6IHN0YXR1cyBub3QgYXZhaWxhYmxlXG4iKSk7CisKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQljb25fbG9nKENMX0FOTiwgKCJcYlxiXGJcYlxiW29rXSBcbiIpKTsKKwkJfQorCX0KKworCS8vIHdhaXQgZm9yIG1heGltdW0gMSBzZWNvbmQgZm9yIHBvbGwgc2VtYXBob3JlCisJaWYgKG1ib3gtPnBvbGwgIT0gMHg3NykgeworCQl1ZGVsYXkoMjUpOworCisJCWZvciAoaSA9IDA7IChtYm94LT5wb2xsICE9IDB4NzcpICYmIChpIDwgMTAwMCk7IGkrKykgeworCQkJcm1iKCk7CisJCQltc2xlZXAoMSk7CisJCX0KKworCQlpZiAoaSA9PSAxMDAwKSB7CisJCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkIG1haWxib3g6IGNvdWxkIG5vdCBnZXQgcG9sbCBzZW1hcGhvcmVcbiIpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCVdSSU5ET09SKHJhaWRfZGV2LCByYWlkX2Rldi0+bWJveF9kbWEgfCAweDIpOworCXdtYigpOworCisJLy8gd2FpdCBmb3IgbWF4aW11bSAxIHNlY29uZCBmb3IgYWNrbm93bGVkZ2VtZW50CisJaWYgKFJESU5ET09SKHJhaWRfZGV2KSAmIDB4MikgeworCQl1ZGVsYXkoMjUpOworCisJCWZvciAoaSA9IDA7IChSRElORE9PUihyYWlkX2RldikgJiAweDIpICYmIChpIDwgMTAwMCk7IGkrKykgeworCQkJcm1iKCk7CisJCQltc2xlZXAoMSk7CisJCX0KKworCQlpZiAoaSA9PSAxMDAwKSB7CisJCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJCSJtZWdhcmFpZCBtYWlsYm94OiBjb3VsZCBub3QgYWNrbm93bGVkZ2VcbiIpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwltYm94LT5wb2xsCT0gMDsKKwltYm94LT5hY2sJPSAweDc3OworCisJc3RhdHVzID0gbWJveC0+c3RhdHVzOworCisJLy8gaW52YWxpZGF0ZSB0aGUgY29tcGxldGVkIGNvbW1hbmQgaWQgYXJyYXkuIEFmdGVyIGNvbW1hbmQKKwkvLyBjb21wbGV0aW9uLCBmaXJtd2FyZSB3b3VsZCB3cml0ZSB0aGUgdmFsaWQgaWQuCisJbWJveC0+bnVtc3RhdHVzCT0gMHhGRjsKKwltYm94LT5zdGF0dXMJPSAweEZGOworCWZvciAoaSA9IDA7IGkgPCBNQk9YX01BWF9GSVJNV0FSRV9TVEFUVVM7IGkrKykgeworCQltYm94LT5jb21wbGV0ZWRbaV0gPSAweEZGOworCX0KKworCXJldHVybiBzdGF0dXM7CisKK2Jsb2NrZWRfbWFpbGJveDoKKworCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HICJtZWdhcmFpZDogYmxvY2tlZCBtYWlsYm94XG4iKSApOworCXJldHVybiAtMTsKK30KKworCisvKioKKyAqIG1ib3hfcG9zdF9zeW5jX2NtZF9mYXN0IC0gYmxvY2tpbmcgY29tbWFuZCB0byB0aGUgbWFpbGJveCBiYXNlZCBjb250cm9sbGVycworICogQGFkYXB0ZXIJLSBjb250cm9sbGVyJ3Mgc29mdCBzdGF0ZQorICogQHJhd19tYm94CS0gdGhlIG1haWxib3gKKyAqCisgKiBJc3N1ZSBhIHNjYiBpbiBzeW5jaHJvbm91cyBhbmQgbm9uLWludGVycnVwdCBtb2RlIGZvciBtYWlsYm94IGJhc2VkCisgKiBjb250cm9sbGVycy4gVGhpcyBpcyBhIGZhc3RlciB2ZXJzaW9uIG9mIHRoZSBzeW5jaHJvbm91cyBjb21tYW5kIGFuZAorICogdGhlcmVmb3JlIGNhbiBiZSBjYWxsZWQgaW4gaW50ZXJydXB0LWNvbnRleHQgYXMgd2VsbAorICovCitzdGF0aWMgaW50CittYm94X3Bvc3Rfc3luY19jbWRfZmFzdChhZGFwdGVyX3QgKmFkYXB0ZXIsIHVpbnQ4X3QgcmF3X21ib3hbXSkKK3sKKwltcmFpZF9kZXZpY2VfdAkqcmFpZF9kZXYgPSBBREFQMlJBSURERVYoYWRhcHRlcik7CisJbWJveF90CQkqbWJveDsKKwlsb25nCQlpOworCisKKwltYm94CT0gcmFpZF9kZXYtPm1ib3g7CisKKwkvLyByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlIG1haWxib3ggaXMgYnVzeQorCWlmIChtYm94LT5idXN5KSByZXR1cm4gLTE7CisKKwkvLyBDb3B5IG1haWxib3ggZGF0YSBpbnRvIGhvc3Qgc3RydWN0dXJlCisJbWVtY3B5KChjYWRkcl90KW1ib3gsIChjYWRkcl90KXJhd19tYm94LCAxNCk7CisJbWJveC0+Y21kaWQJCT0gMHhGRTsKKwltYm94LT5idXN5CQk9IDE7CisJbWJveC0+cG9sbAkJPSAwOworCW1ib3gtPmFjawkJPSAwOworCW1ib3gtPm51bXN0YXR1cwkJPSAweEZGOworCW1ib3gtPnN0YXR1cwkJPSAweEZGOworCisJd21iKCk7CisJV1JJTkRPT1IocmFpZF9kZXYsIHJhaWRfZGV2LT5tYm94X2RtYSB8IDB4MSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMHhGRkZGRjsgaSsrKSB7CisJCWlmIChtYm94LT5udW1zdGF0dXMgIT0gMHhGRikgYnJlYWs7CisJfQorCisJaWYgKGkgPT0gMHhGRkZGRikgeworCQkvLyBXZSBtYXkgbmVlZCB0byByZS1jYWxpYnJhdGUgdGhlIGNvdW50ZXIKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX0NSSVQKKwkJCSJtZWdhcmFpZDogZmFzdCBzeW5jIGNvbW1hbmQgdGltZWQgb3V0XG4iKSk7CisJfQorCisJV1JJTkRPT1IocmFpZF9kZXYsIHJhaWRfZGV2LT5tYm94X2RtYSB8IDB4Mik7CisJd21iKCk7CisKKwlyZXR1cm4gbWJveC0+c3RhdHVzOworfQorCisKKy8qKgorICogbWVnYXJhaWRfYnVzeXdhaXRfbWJveCgpIC0gV2FpdCB1bnRpbCB0aGUgY29udHJvbGxlcidzIG1haWxib3ggaXMgYXZhaWxhYmxlCisgKiBAcmFpZF9kZXYJLSBSQUlEIGRldmljZSAoSEJBKSBzb2Z0IHN0YXRlCisgKgorICogd2FpdCB1bnRpbCB0aGUgY29udHJvbGxlcidzIG1haWxib3ggaXMgYXZhaWxhYmxlIHRvIGFjY2VwdCBtb3JlIGNvbW1hbmRzLgorICogd2FpdCBmb3IgYXQgbW9zdCAxIHNlY29uZAorICovCitzdGF0aWMgaW50CittZWdhcmFpZF9idXN5d2FpdF9tYm94KG1yYWlkX2RldmljZV90ICpyYWlkX2RldikKK3sKKwltYm94X3QJKm1ib3ggPSByYWlkX2Rldi0+bWJveDsKKwlpbnQJaSA9IDA7CisKKwlpZiAobWJveC0+YnVzeSkgeworCQl1ZGVsYXkoMjUpOworCQlmb3IgKGkgPSAwOyBtYm94LT5idXN5ICYmIGkgPCAxMDAwOyBpKyspCisJCQltc2xlZXAoMSk7CisJfQorCisJaWYgKGkgPCAxMDAwKSByZXR1cm4gMDsKKwllbHNlIHJldHVybiAtMTsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX21ib3hfcHJvZHVjdF9pbmZvIC0gc29tZSBzdGF0aWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyb2xsZXIKKyAqIEBhZGFwdGVyCS0gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiBpc3N1ZSBjb21tYW5kcyB0byB0aGUgY29udHJvbGxlciB0byBncmFiIHNvbWUgcGFyYW1ldGVycyByZXF1aXJlZCBieSBvdXIKKyAqIGNhbGxlci4KKyAqLworc3RhdGljIGludAorbWVnYXJhaWRfbWJveF9wcm9kdWN0X2luZm8oYWRhcHRlcl90ICphZGFwdGVyKQoreworCW1yYWlkX2RldmljZV90CQkqcmFpZF9kZXYgPSBBREFQMlJBSURERVYoYWRhcHRlcik7CisJbWJveF90CQkJKm1ib3g7CisJdWludDhfdAkJCXJhd19tYm94W3NpemVvZihtYm94X3QpXTsKKwltcmFpZF9waW5mb190CQkqcGluZm87CisJZG1hX2FkZHJfdAkJcGluZm9fZG1hX2g7CisJbXJhaWRfaW5xdWlyeTNfdAkqbXJhaWRfaW5xMzsKKwlpbnQJCQlpOworCisKKwltZW1zZXQoKGNhZGRyX3QpcmF3X21ib3gsIDAsIHNpemVvZihyYXdfbWJveCkpOworCW1ib3ggPSAobWJveF90ICopcmF3X21ib3g7CisKKwkvKgorCSAqIElzc3VlIGFuIEVOUVVJUlkzIGNvbW1hbmQgdG8gZmluZCBvdXQgY2VydGFpbiBhZGFwdGVyIHBhcmFtZXRlcnMsCisJICogZS5nLiwgbWF4IGNoYW5uZWxzLCBtYXggY29tbWFuZHMgZXRjLgorCSAqLworCXBpbmZvID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgc2l6ZW9mKG1yYWlkX3BpbmZvX3QpLAorCQkJJnBpbmZvX2RtYV9oKTsKKworCWlmIChwaW5mbyA9PSBOVUxMKSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQ6IG91dCBvZiBtZW1vcnksICVzICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQlfX0xJTkVfXykpOworCisJCXJldHVybiAtMTsKKwl9CisJbWVtc2V0KHBpbmZvLCAwLCBzaXplb2YobXJhaWRfcGluZm9fdCkpOworCisJbWJveC0+eGZlcmFkZHIgPSAodWludDMyX3QpYWRhcHRlci0+aWJ1Zl9kbWFfaDsKKwltZW1zZXQoKHZvaWQgKilhZGFwdGVyLT5pYnVmLCAwLCBNQk9YX0lCVUZfU0laRSk7CisKKwlyYXdfbWJveFswXSA9IEZDX05FV19DT05GSUc7CisJcmF3X21ib3hbMl0gPSBOQ19TVUJPUF9FTlFVSVJZMzsKKwlyYXdfbWJveFszXSA9IEVOUTNfR0VUX1NPTElDSVRFRF9GVUxMOworCisJLy8gSXNzdWUgdGhlIGNvbW1hbmQKKwlpZiAobWJveF9wb3N0X3N5bmNfY21kKGFkYXB0ZXIsIHJhd19tYm94KSAhPSAwKSB7CisKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkOiBJbnF1aXJ5MyBmYWlsZWRcbiIpKTsKKworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHNpemVvZihtcmFpZF9waW5mb190KSwKKwkJCXBpbmZvLCBwaW5mb19kbWFfaCk7CisKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogQ29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCBzdGF0ZSBvZiBlYWNoIHBoeXNpY2FsIGRyaXZlCisJICogYXR0YWNoZWQgdG8gdGhlIGNvbnRyb2xsZXIuIFdlIHdpbGwgZXhwb3NlIGFsbCB0aGUgZGlza3MKKwkgKiB3aGljaCBhcmUgbm90IHBhcnQgb2YgUkFJRAorCSAqLworCW1yYWlkX2lucTMgPSAobXJhaWRfaW5xdWlyeTNfdCAqKWFkYXB0ZXItPmlidWY7CisJZm9yIChpID0gMDsgaSA8IE1CT1hfTUFYX1BIWVNJQ0FMX0RSSVZFUzsgaSsrKSB7CisJCXJhaWRfZGV2LT5wZHJ2X3N0YXRlW2ldID0gbXJhaWRfaW5xMy0+cGRydl9zdGF0ZVtpXTsKKwl9CisKKwkvKgorCSAqIEdldCBwcm9kdWN0IGluZm8gZm9yIGluZm9ybWF0aW9uIGxpa2UgbnVtYmVyIG9mIGNoYW5uZWxzLAorCSAqIG1heGltdW0gY29tbWFuZHMgc3VwcG9ydGVkLgorCSAqLworCW1lbXNldCgoY2FkZHJfdClyYXdfbWJveCwgMCwgc2l6ZW9mKHJhd19tYm94KSk7CisJbWJveC0+eGZlcmFkZHIgPSAodWludDMyX3QpcGluZm9fZG1hX2g7CisKKwlyYXdfbWJveFswXSA9IEZDX05FV19DT05GSUc7CisJcmF3X21ib3hbMl0gPSBOQ19TVUJPUF9QUk9EVUNUX0lORk87CisKKwlpZiAobWJveF9wb3N0X3N5bmNfY21kKGFkYXB0ZXIsIHJhd19tYm94KSAhPSAwKSB7CisKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCSJtZWdhcmFpZDogcHJvZHVjdCBpbmZvIGZhaWxlZFxuIikpOworCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgc2l6ZW9mKG1yYWlkX3BpbmZvX3QpLAorCQkJcGluZm8sIHBpbmZvX2RtYV9oKTsKKworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBTZXR1cCBzb21lIHBhcmFtZXRlcnMgZm9yIGhvc3QsIGFzIHJlcXVpcmVkIGJ5IG91ciBjYWxsZXIKKwkgKi8KKwlhZGFwdGVyLT5tYXhfY2hhbm5lbCA9IHBpbmZvLT5uY2hhbm5lbHM7CisKKwkvKgorCSAqIHdlIHdpbGwgZXhwb3J0IGFsbCB0aGUgbG9naWNhbCBkcml2ZXMgb24gYSBzaW5nbGUgY2hhbm5lbC4KKwkgKiBBZGQgMSBzaW5jZSBpbnF1aXJlcyBkbyBub3QgY29tZSBmb3IgaW5pdGl0b3IgSUQKKwkgKi8KKwlhZGFwdGVyLT5tYXhfdGFyZ2V0CT0gTUFYX0xPR0lDQUxfRFJJVkVTXzQwTEQgKyAxOworCWFkYXB0ZXItPm1heF9sdW4JPSA4OwkvLyB1cCB0byA4IExVTnMgZm9yIG5vbi1kaXNrIGRldmljZXMKKworCS8qCisJICogVGhlc2UgYXJlIHRoZSBtYXhpbXVtIG91dHN0YW5kaW5nIGNvbW1hbmRzIGZvciB0aGUgc2NzaS1sYXllcgorCSAqLworCWFkYXB0ZXItPm1heF9jbWRzCT0gTUJPWF9NQVhfU0NTSV9DTURTOworCisJbWVtc2V0KGFkYXB0ZXItPmZ3X3ZlcnNpb24sIDAsIFZFUlNJT05fU0laRSk7CisJbWVtc2V0KGFkYXB0ZXItPmJpb3NfdmVyc2lvbiwgMCwgVkVSU0lPTl9TSVpFKTsKKworCW1lbWNweShhZGFwdGVyLT5md192ZXJzaW9uLCBwaW5mby0+ZndfdmVyc2lvbiwgNCk7CisJYWRhcHRlci0+ZndfdmVyc2lvbls0XSA9IDA7CisKKwltZW1jcHkoYWRhcHRlci0+Ymlvc192ZXJzaW9uLCBwaW5mby0+Ymlvc192ZXJzaW9uLCA0KTsKKwlhZGFwdGVyLT5iaW9zX3ZlcnNpb25bNF0gPSAwOworCisJY29uX2xvZyhDTF9BTk4sIChLRVJOX05PVElDRQorCQkibWVnYXJhaWQ6IGZ3IHZlcnNpb246WyVzXSBiaW9zIHZlcnNpb246WyVzXVxuIiwKKwkJYWRhcHRlci0+ZndfdmVyc2lvbiwgYWRhcHRlci0+Ymlvc192ZXJzaW9uKSk7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHNpemVvZihtcmFpZF9waW5mb190KSwgcGluZm8sCisJCQlwaW5mb19kbWFfaCk7CisKKwlyZXR1cm4gMDsKK30KKworCisKKy8qKgorICogbWVnYXJhaWRfbWJveF9leHRlbmRlZF9jZGIgLSBjaGVjayBmb3Igc3VwcG9ydCBmb3IgZXh0ZW5kZWQgQ0RCcworICogQGFkYXB0ZXIJLSBzb2Z0IHN0YXRlIGZvciB0aGUgY29udHJvbGxlcgorICoKKyAqIHRoaXMgcm91dGluZSBjaGVjayB3aGV0aGVyIHRoZSBjb250cm9sbGVyIGluIHF1ZXN0aW9uIHN1cHBvcnRzIGV4dGVuZGVkCisgKiAoID4gMTAgYnl0ZXMgKSBDREJzCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FyYWlkX21ib3hfZXh0ZW5kZWRfY2RiKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwltYm94X3QJCSptYm94OworCXVpbnQ4X3QJCXJhd19tYm94W3NpemVvZihtYm94X3QpXTsKKwlpbnQJCXJ2YWw7CisKKwltYm94ID0gKG1ib3hfdCAqKXJhd19tYm94OworCisJbWVtc2V0KChjYWRkcl90KXJhd19tYm94LCAwLCBzaXplb2YocmF3X21ib3gpKTsKKwltYm94LT54ZmVyYWRkcgk9ICh1aW50MzJfdClhZGFwdGVyLT5pYnVmX2RtYV9oOworCisJbWVtc2V0KCh2b2lkICopYWRhcHRlci0+aWJ1ZiwgMCwgTUJPWF9JQlVGX1NJWkUpOworCisJcmF3X21ib3hbMF0gPSBNQUlOX01JU0NfT1BDT0RFOworCXJhd19tYm94WzJdID0gU1VQUE9SVF9FWFRfQ0RCOworCisJLyoKKwkgKiBJc3N1ZSB0aGUgY29tbWFuZAorCSAqLworCXJ2YWwgPSAwOworCWlmIChtYm94X3Bvc3Rfc3luY19jbWQoYWRhcHRlciwgcmF3X21ib3gpICE9IDApIHsKKwkJcnZhbCA9IC0xOworCX0KKworCXJldHVybiBydmFsOworfQorCisKKy8qKgorICogbWVnYXJhaWRfbWJveF9zdXBwb3J0X2hhIC0gRG8gd2Ugc3VwcG9ydCBjbHVzdGVyaW5nCisgKiBAYWRhcHRlcgktIHNvZnQgc3RhdGUgZm9yIHRoZSBjb250cm9sbGVyCisgKiBAaW5pdF9pZAktIElEIG9mIHRoZSBpbml0aWF0b3IKKyAqCisgKiBEZXRlcm1pbmUgaWYgdGhlIGZpcm13YXJlIHN1cHBvcnRzIGNsdXN0ZXJpbmcgYW5kIHRoZSBJRCBvZiB0aGUgaW5pdGlhdG9yLgorICovCitzdGF0aWMgaW50CittZWdhcmFpZF9tYm94X3N1cHBvcnRfaGEoYWRhcHRlcl90ICphZGFwdGVyLCB1aW50MTZfdCAqaW5pdF9pZCkKK3sKKwltYm94X3QJCSptYm94OworCXVpbnQ4X3QJCXJhd19tYm94W3NpemVvZihtYm94X3QpXTsKKwlpbnQJCXJ2YWw7CisKKworCW1ib3ggPSAobWJveF90ICopcmF3X21ib3g7CisKKwltZW1zZXQoKGNhZGRyX3QpcmF3X21ib3gsIDAsIHNpemVvZihyYXdfbWJveCkpOworCisJbWJveC0+eGZlcmFkZHIgPSAodWludDMyX3QpYWRhcHRlci0+aWJ1Zl9kbWFfaDsKKworCW1lbXNldCgodm9pZCAqKWFkYXB0ZXItPmlidWYsIDAsIE1CT1hfSUJVRl9TSVpFKTsKKworCXJhd19tYm94WzBdID0gR0VUX1RBUkdFVF9JRDsKKworCS8vIElzc3VlIHRoZSBjb21tYW5kCisJKmluaXRfaWQgPSA3OworCXJ2YWwgPSAgLTE7CisJaWYgKG1ib3hfcG9zdF9zeW5jX2NtZChhZGFwdGVyLCByYXdfbWJveCkgPT0gMCkgeworCisJCSppbml0X2lkID0gKih1aW50OF90ICopYWRhcHRlci0+aWJ1ZjsKKworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fSU5GTworCQkJIm1lZ2FyYWlkOiBjbHVzdGVyIGZpcm13YXJlLCBpbml0aWF0b3IgSUQ6ICVkXG4iLAorCQkJKmluaXRfaWQpKTsKKworCQlydmFsID0gIDA7CisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9tYm94X3N1cHBvcnRfcmFuZG9tX2RlbCAtIERvIHdlIHN1cHBvcnQgcmFuZG9tIGRlbGV0aW9uCisgKiBAYWRhcHRlcgktIHNvZnQgc3RhdGUgZm9yIHRoZSBjb250cm9sbGVyCisgKgorICogRGV0ZXJtaW5lIGlmIHRoZSBmaXJtd2FyZSBzdXBwb3J0cyByYW5kb20gZGVsZXRpb24KKyAqIFJldHVybjoJMSBpcyBvcGVyYXRpb24gc3VwcG9ydGVkLCAwIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50CittZWdhcmFpZF9tYm94X3N1cHBvcnRfcmFuZG9tX2RlbChhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJbWJveF90CQkqbWJveDsKKwl1aW50OF90CQlyYXdfbWJveFtzaXplb2YobWJveF90KV07CisJaW50CQlydmFsOworCisKKwltYm94ID0gKG1ib3hfdCAqKXJhd19tYm94OworCisJbWVtc2V0KChjYWRkcl90KXJhd19tYm94LCAwLCBzaXplb2YobWJveF90KSk7CisKKwlyYXdfbWJveFswXSA9IEZDX0RFTF9MT0dEUlY7CisJcmF3X21ib3hbMl0gPSBPUF9TVVBfREVMX0xPR0RSVjsKKworCS8vIElzc3VlIHRoZSBjb21tYW5kCisJcnZhbCA9IDA7CisJaWYgKG1ib3hfcG9zdF9zeW5jX2NtZChhZGFwdGVyLCByYXdfbWJveCkgPT0gMCkgeworCisJCWNvbl9sb2coQ0xfRExFVkVMMSwgKCJtZWdhcmFpZDogc3VwcG9ydHMgcmFuZG9tIGRlbGV0aW9uXG4iKSk7CisKKwkJcnZhbCA9ICAxOworCX0KKworCXJldHVybiBydmFsOworfQorCisKKy8qKgorICogbWVnYXJhaWRfbWJveF9nZXRfbWF4X3NnIC0gbWF4aW11bSBzZyBlbGVtZW50cyBzdXBwb3J0ZWQgYnkgdGhlIGZpcm13YXJlCisgKiBAYWRhcHRlcgktIHNvZnQgc3RhdGUgZm9yIHRoZSBjb250cm9sbGVyCisgKgorICogRmluZCBvdXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNjYXR0ZXItZ2F0aGVyIGVsZW1lbnRzIHN1cHBvcnRlZCBieSB0aGUKKyAqIGZpcm13YXJlCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FyYWlkX21ib3hfZ2V0X21heF9zZyhhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJbWJveF90CQkqbWJveDsKKwl1aW50OF90CQlyYXdfbWJveFtzaXplb2YobWJveF90KV07CisJaW50CQluc2c7CisKKworCW1ib3ggPSAobWJveF90ICopcmF3X21ib3g7CisKKwltZW1zZXQoKGNhZGRyX3QpcmF3X21ib3gsIDAsIHNpemVvZihtYm94X3QpKTsKKworCW1ib3gtPnhmZXJhZGRyID0gKHVpbnQzMl90KWFkYXB0ZXItPmlidWZfZG1hX2g7CisKKwltZW1zZXQoKHZvaWQgKilhZGFwdGVyLT5pYnVmLCAwLCBNQk9YX0lCVUZfU0laRSk7CisKKwlyYXdfbWJveFswXSA9IE1BSU5fTUlTQ19PUENPREU7CisJcmF3X21ib3hbMl0gPSBHRVRfTUFYX1NHX1NVUFBPUlQ7CisKKwkvLyBJc3N1ZSB0aGUgY29tbWFuZAorCWlmIChtYm94X3Bvc3Rfc3luY19jbWQoYWRhcHRlciwgcmF3X21ib3gpID09IDApIHsKKwkJbnNnID0gICoodWludDhfdCAqKWFkYXB0ZXItPmlidWY7CisJfQorCWVsc2UgeworCQluc2cgPSAgTUJPWF9ERUZBVUxUX1NHX1NJWkU7CisJfQorCisJaWYgKG5zZyA+IE1CT1hfTUFYX1NHX1NJWkUpIG5zZyA9IE1CT1hfTUFYX1NHX1NJWkU7CisKKwlyZXR1cm4gbnNnOworfQorCisKKy8qKgorICogbWVnYXJhaWRfbWJveF9lbnVtX3JhaWRfc2NzaSAtIGVudW1lcmF0ZSB0aGUgUkFJRCBhbmQgU0NTSSBjaGFubmVscworICogQGFkYXB0ZXIJLSBzb2Z0IHN0YXRlIGZvciB0aGUgY29udHJvbGxlcgorICoKKyAqIEVudW1lcmF0ZSB0aGUgUkFJRCBhbmQgU0NTSSBjaGFubmVscyBmb3IgUk9NQiBwbGF0b2Zvcm1zIHNvIHRoYXQgY2hhbm5lbHMKKyAqIGNhbiBiZSBleHBvcnRlZCBhcyByZWd1bGFyIFNDU0kgY2hhbm5lbHMKKyAqLworc3RhdGljIHZvaWQKK21lZ2FyYWlkX21ib3hfZW51bV9yYWlkX3Njc2koYWRhcHRlcl90ICphZGFwdGVyKQoreworCW1yYWlkX2RldmljZV90CSpyYWlkX2RldiA9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKKwltYm94X3QJCSptYm94OworCXVpbnQ4X3QJCXJhd19tYm94W3NpemVvZihtYm94X3QpXTsKKworCisJbWJveCA9IChtYm94X3QgKilyYXdfbWJveDsKKworCW1lbXNldCgoY2FkZHJfdClyYXdfbWJveCwgMCwgc2l6ZW9mKG1ib3hfdCkpOworCisJbWJveC0+eGZlcmFkZHIgPSAodWludDMyX3QpYWRhcHRlci0+aWJ1Zl9kbWFfaDsKKworCW1lbXNldCgodm9pZCAqKWFkYXB0ZXItPmlidWYsIDAsIE1CT1hfSUJVRl9TSVpFKTsKKworCXJhd19tYm94WzBdID0gQ0hOTF9DTEFTUzsKKwlyYXdfbWJveFsyXSA9IEdFVF9DSE5MX0NMQVNTOworCisJLy8gSXNzdWUgdGhlIGNvbW1hbmQuIElmIHRoZSBjb21tYW5kIGZhaWxzLCBhbGwgY2hhbm5lbHMgYXJlIFJBSUQKKwkvLyBjaGFubmVscworCXJhaWRfZGV2LT5jaGFubmVsX2NsYXNzID0gMHhGRjsKKwlpZiAobWJveF9wb3N0X3N5bmNfY21kKGFkYXB0ZXIsIHJhd19tYm94KSA9PSAwKSB7CisJCXJhaWRfZGV2LT5jaGFubmVsX2NsYXNzID0gICoodWludDhfdCAqKWFkYXB0ZXItPmlidWY7CisJfQorCisJcmV0dXJuOworfQorCisKKy8qKgorICogbWVnYXJhaWRfbWJveF9mbHVzaF9jYWNoZSAtIGZsdXNoIGFkYXB0ZXIgYW5kIGRpc2tzIGNhY2hlCisgKiBAcGFyYW0gYWRhcHRlcgk6IHNvZnQgc3RhdGUgZm9yIHRoZSBjb250cm9sbGVyCisgKgorICogRmx1c2ggYWRhcHRlciBjYWNoZSBmb2xsb3dlZCBieSBkaXNrcyBjYWNoZQorICovCitzdGF0aWMgdm9pZAorbWVnYXJhaWRfbWJveF9mbHVzaF9jYWNoZShhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJbWJveF90CSptYm94OworCXVpbnQ4X3QJcmF3X21ib3hbc2l6ZW9mKG1ib3hfdCldOworCisKKwltYm94ID0gKG1ib3hfdCAqKXJhd19tYm94OworCisJbWVtc2V0KChjYWRkcl90KXJhd19tYm94LCAwLCBzaXplb2YobWJveF90KSk7CisKKwlyYXdfbWJveFswXSA9IEZMVVNIX0FEQVBURVI7CisKKwlpZiAobWJveF9wb3N0X3N5bmNfY21kKGFkYXB0ZXIsIHJhd19tYm94KSAhPSAwKSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoIm1lZ2FyYWlkOiBmbHVzaCBhZGFwdGVyIGZhaWxlZFxuIikpOworCX0KKworCXJhd19tYm94WzBdID0gRkxVU0hfU1lTVEVNOworCisJaWYgKG1ib3hfcG9zdF9zeW5jX2NtZChhZGFwdGVyLCByYXdfbWJveCkgIT0gMCkgeworCQljb25fbG9nKENMX0FOTiwgKCJtZWdhcmFpZDogZmx1c2ggZGlza3MgY2FjaGUgZmFpbGVkXG4iKSk7CisJfQorCisJcmV0dXJuOworfQorCisKKy8qKgorICogbWVnYXJhaWRfbWJveF9kaXNwbGF5X3NjYiAtIGRpc3BsYXkgU0NCIGluZm9ybWF0aW9uLCBtb3N0bHkgZGVidWcgcHVycG9zZXMKKyAqIEBwYXJhbSBhZGFwdGVyCTogY29udHJvbGxlcnMnIHNvZnQgc3RhdGUKKyAqIEBwYXJhbSBzY2IJCTogU0NCIHRvIGJlIGRpc3BsYXllZAorICogQHBhcmFtIGxldmVsCTogZGVidWcgbGV2ZWwgZm9yIGNvbnNvbGUgcHJpbnQKKyAqCisgKiBEaXBsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdpdmVuIFNDQiBpZmYgdGhlIGN1cnJlbnQgZGVidWcgbGV2ZWwgaXMKKyAqIHZlcmJvc2UKKyAqLworc3RhdGljIHZvaWQKK21lZ2FyYWlkX21ib3hfZGlzcGxheV9zY2IoYWRhcHRlcl90ICphZGFwdGVyLCBzY2JfdCAqc2NiKQoreworCW1ib3hfY2NiX3QJCSpjY2I7CisJc3RydWN0IHNjc2lfY21uZAkqc2NwOworCW1ib3hfdAkJCSptYm94OworCWludAkJCWxldmVsOworCWludAkJCWk7CisKKworCWNjYgk9IChtYm94X2NjYl90ICopc2NiLT5jY2I7CisJc2NwCT0gc2NiLT5zY3A7CisJbWJveAk9IGNjYi0+bWJveDsKKworCWxldmVsID0gQ0xfRExFVkVMMzsKKworCWNvbl9sb2cobGV2ZWwsIChLRVJOX05PVElDRQorCQkibWVnYXJhaWQgbWFpbGJveDogc3RhdHVzOiUjeCBjbWQ6JSN4IGlkOiUjeCAiLCBzY2ItPnN0YXR1cywKKwkJbWJveC0+Y21kLCBzY2ItPnNubykpOworCisJY29uX2xvZyhsZXZlbCwgKCJzZWM6JSN4IGxiYTolI3ggYWRkcjolI3ggbGQ6JWQgc2c6JWRcbiIsCisJCW1ib3gtPm51bXNlY3RvcnMsIG1ib3gtPmxiYSwgbWJveC0+eGZlcmFkZHIsIG1ib3gtPmxvZ2RydiwKKwkJbWJveC0+bnVtc2dlKSk7CisKKwlpZiAoIXNjcCkgcmV0dXJuOworCisJY29uX2xvZyhsZXZlbCwgKEtFUk5fTk9USUNFICJzY3NpIGNtbmQ6ICIpKTsKKworCWZvciAoaSA9IDA7IGkgPCBzY3AtPmNtZF9sZW47IGkrKykgeworCQljb25fbG9nKGxldmVsLCAoIiUjMi4wMnggIiwgc2NwLT5jbW5kW2ldKSk7CisJfQorCisJY29uX2xvZyhsZXZlbCwgKCJcbiIpKTsKKworCXJldHVybjsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX21ib3hfc2V0dXBfZGV2aWNlX21hcCAtIG1hbmFnZSBkZXZpY2UgaWRzCisgKiBAYWRhcHRlcgk6IERyaXZlcidzIHNvZnQgc3RhdGUKKyAqCisgKiBNYW5hbmdlIHRoZSBkZXZpY2UgaWRzIHRvIGhhdmUgYW4gYXBwcm9wcmFpdGUgbWFwcGluZyBiZXR3ZWVuIHRoZSBrZXJuZWwKKyAqIHNjc2kgYWRkcmVzc2VzIGFuZCBtZWdhcmFpZCBzY3NpIGFuZCBsb2dpY2FsIGRyaXZlIGFkZHJlc3Nlcy4gV2UgZXhwb3J0CisgKiBzY3NpIGRldmljZXMgb24gdGhlaXIgYWN0dWFsIGFkZHJlc3Nlcywgd2hlcmVhcyB0aGUgbG9naWNhbCBkcml2ZXMgYXJlCisgKiBleHBvcnRlZCBvbiBhIHZpcnR1YWwgc2NzaSBjaGFubmVsLgorICoqLworc3RhdGljIHZvaWQKK21lZ2FyYWlkX21ib3hfc2V0dXBfZGV2aWNlX21hcChhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJdWludDhfdAkJYzsKKwl1aW50OF90CQl0OworCisJLyoKKwkgKiBGaXJzdCBmaWxsIHRoZSB2YWx1ZXMgb24gdGhlIGxvZ2ljYWwgZHJpdmUgY2hhbm5lbAorCSAqLworCWZvciAodCA9IDA7IHQgPCBMU0lfTUFYX0xPR0lDQUxfRFJJVkVTXzY0TEQ7IHQrKykKKwkJYWRhcHRlci0+ZGV2aWNlX2lkc1thZGFwdGVyLT5tYXhfY2hhbm5lbF1bdF0gPQorCQkJKHQgPCBhZGFwdGVyLT5pbml0X2lkKSA/ICB0IDogdCAtIDE7CisKKwlhZGFwdGVyLT5kZXZpY2VfaWRzW2FkYXB0ZXItPm1heF9jaGFubmVsXVthZGFwdGVyLT5pbml0X2lkXSA9IDB4RkY7CisKKwkvKgorCSAqIEZpbGwgdGhlIHZhbHVlcyBvbiB0aGUgcGh5c2ljYWwgZGV2aWNlcyBjaGFubmVscworCSAqLworCWZvciAoYyA9IDA7IGMgPCBhZGFwdGVyLT5tYXhfY2hhbm5lbDsgYysrKQorCQlmb3IgKHQgPSAwOyB0IDwgTFNJX01BWF9MT0dJQ0FMX0RSSVZFU182NExEOyB0KyspCisJCQlhZGFwdGVyLT5kZXZpY2VfaWRzW2NdW3RdID0gKGMgPDwgOCkgfCB0OworfQorCisKKy8qCisgKiBFTkQ6IGludGVybmFsIGNvbW1hbmRzIGxpYnJhcnkKKyAqLworCisvKgorICogU1RBUlQ6IEludGVyZmFjZSBmb3IgdGhlIGNvbW1vbiBtYW5hZ2VtZW50IG1vZHVsZQorICoKKyAqIFRoaXMgaXMgdGhlIG1vZHVsZSwgd2hpY2ggaW50ZXJmYWNlcyB3aXRoIHRoZSBjb21tb24gbWFuZ2VtZW50IG1vZHVsZSB0bworICogcHJvdmlkZSBzdXBwb3J0IGZvciBpb2N0bCBhbmQgc3lzZnMKKyAqLworCisvKioKKyAqIG1lZ2FyYWlkX2NtbV9yZWdpc3RlciAtIHJlZ2lzdGVyIHdpdGggdGhlIG1hbmdlbWVudCBtb2R1bGUKKyAqIEBwYXJhbSBhZGFwdGVyCTogSEJBIHNvZnQgc3RhdGUKKyAqCisgKiBSZWdpc3RlciB3aXRoIHRoZSBtYW5hZ2VtZW50IG1vZHVsZSwgd2hpY2ggYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBpc3N1ZQorICogaW9jdGwgY2FsbHMgdG8gdGhlIGRyaXZlcnMuIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgdGhlIG1hbmFnZW1lbnQgbW9kdWxlCisgKiB0byBzZXR1cCBzeXNmcyBzdXBwb3J0IGFzIHdlbGwuCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FyYWlkX2NtbV9yZWdpc3RlcihhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJbXJhaWRfZGV2aWNlX3QJKnJhaWRfZGV2ID0gQURBUDJSQUlEREVWKGFkYXB0ZXIpOworCW1yYWlkX21tYWRwX3QJYWRwOworCXNjYl90CQkqc2NiOworCW1ib3hfY2NiX3QJKmNjYjsKKwlpbnQJCXJ2YWw7CisJaW50CQlpOworCisJLy8gQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgYmFzZSBsaXN0IG9mIHNjYiBmb3IgbWFuYWdlbWVudCBtb2R1bGUuCisJYWRhcHRlci0+dXNjYl9saXN0ID0ga21hbGxvYyhzaXplb2Yoc2NiX3QpICogTUJPWF9NQVhfVVNFUl9DTURTLAorCQkJR0ZQX0tFUk5FTCk7CisKKwlpZiAoYWRhcHRlci0+dXNjYl9saXN0ID09IE5VTEwpIHsKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCSJtZWdhcmFpZDogb3V0IG9mIG1lbW9yeSwgJXMgJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCV9fTElORV9fKSk7CisJCXJldHVybiAtMTsKKwl9CisJbWVtc2V0KGFkYXB0ZXItPnVzY2JfbGlzdCwgMCwgc2l6ZW9mKHNjYl90KSAqIE1CT1hfTUFYX1VTRVJfQ01EUyk7CisKKworCS8vIEluaXRpYWxpemUgdGhlIHN5bmNocm9uaXphdGlvbiBwYXJhbWV0ZXJzIGZvciByZXNvdXJjZXMgZm9yCisJLy8gY29tbWFuZHMgZm9yIG1hbmFnZW1lbnQgbW9kdWxlCisJSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXItPnVzY2JfcG9vbCk7CisKKwlzcGluX2xvY2tfaW5pdChVU0VSX0ZSRUVfTElTVF9MT0NLKGFkYXB0ZXIpKTsKKworCisKKwkvLyBsaW5rIGFsbCB0aGUgcGFja2V0cy4gTm90ZSwgQ0NCIGZvciBjb21tYW5kcywgY29taW5nIGZyb20gdGhlCisJLy8gY29tbW9tIG1hbmFnZW1lbnQgbW9kdWxlLCBtYWlsYm94IHBoeXNpY2FsIGFkZHJlc3MgYXJlIGFscmVhZHkKKwkvLyBzZXR1cCBieSBpdC4gV2UganVzdCBuZWVkIHBsYWNlaG9sZGVyIGZvciB0aGF0IGluIG91ciBsb2NhbCBjb21tYW5kCisJLy8gY29udHJvbCBibG9ja3MKKwlmb3IgKGkgPSAwOyBpIDwgTUJPWF9NQVhfVVNFUl9DTURTOyBpKyspIHsKKworCQlzY2IJCQk9IGFkYXB0ZXItPnVzY2JfbGlzdCArIGk7CisJCWNjYgkJCT0gcmFpZF9kZXYtPnVjY2JfbGlzdCArIGk7CisKKwkJc2NiLT5jY2IJCT0gKGNhZGRyX3QpY2NiOworCQljY2ItPm1ib3g2NAkJPSByYWlkX2Rldi0+dW1ib3g2NCArIGk7CisJCWNjYi0+bWJveAkJPSAmY2NiLT5tYm94NjQtPm1ib3gzMjsKKwkJY2NiLT5yYXdfbWJveAkJPSAodWludDhfdCAqKWNjYi0+bWJveDsKKworCQlzY2ItPmdwCQkJPSAwOworCisJCS8vIENPTU1BTkQgSUQgMCAtIChNQk9YX01BWF9TQ1NJX0NNRFMtMSkgQVJFIFJFU0VSVkVEIEZPUgorCQkvLyBDT01NQU5EUyBDT01JTkcgRlJPTSBJTyBTVUJTWVNURU0gKE1JRC1MQVlFUikKKwkJc2NiLT5zbm8JCT0gaSArIE1CT1hfTUFYX1NDU0lfQ01EUzsKKworCQlzY2ItPnNjcAkJPSBOVUxMOworCQlzY2ItPnN0YXRlCQk9IFNDQl9GUkVFOworCQlzY2ItPmRtYV9kaXJlY3Rpb24JPSBQQ0lfRE1BX05PTkU7CisJCXNjYi0+ZG1hX3R5cGUJCT0gTVJBSURfRE1BX05PTkU7CisJCXNjYi0+ZGV2X2NoYW5uZWwJPSAtMTsKKwkJc2NiLT5kZXZfdGFyZ2V0CQk9IC0xOworCisJCS8vIHB1dCBzY2IgaW4gdGhlIGZyZWUgcG9vbAorCQlsaXN0X2FkZF90YWlsKCZzY2ItPmxpc3QsICZhZGFwdGVyLT51c2NiX3Bvb2wpOworCX0KKworCWFkcC51bmlxdWVfaWQJCT0gYWRhcHRlci0+dW5pcXVlX2lkOworCWFkcC5kcnZyX3R5cGUJCT0gRFJWUlRZUEVfTUJPWDsKKwlhZHAuZHJ2cl9kYXRhCQk9ICh1bnNpZ25lZCBsb25nKWFkYXB0ZXI7CisJYWRwLnBkZXYJCT0gYWRhcHRlci0+cGRldjsKKwlhZHAuaXNzdWVfdWlvYwkJPSBtZWdhcmFpZF9tYm94X21tX2hhbmRsZXI7CisJYWRwLnRpbWVvdXQJCT0gMzAwOworCWFkcC5tYXhfa2lvYwkJPSBNQk9YX01BWF9VU0VSX0NNRFM7CisKKwlpZiAoKHJ2YWwgPSBtcmFpZF9tbV9yZWdpc3Rlcl9hZHAoJmFkcCkpICE9IDApIHsKKworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkIG1ib3g6IGRpZCBub3QgcmVnaXN0ZXIgd2l0aCBDTU1cbiIpKTsKKworCQlrZnJlZShhZGFwdGVyLT51c2NiX2xpc3QpOworCX0KKworCXJldHVybiBydmFsOworfQorCisKKy8qKgorICogbWVnYXJhaWRfY21tX3VucmVnaXN0ZXIgLSB1bi1yZWdpc3RlciB3aXRoIHRoZSBtYW5nZW1lbnQgbW9kdWxlCisgKiBAcGFyYW0gYWRhcHRlcgk6IEhCQSBzb2Z0IHN0YXRlCisgKgorICogVW4tcmVnaXN0ZXIgd2l0aCB0aGUgbWFuYWdlbWVudCBtb2R1bGUuCisgKiBGSVhNRTogbWdtdCBtb2R1bGUgbXVzdCByZXR1cm4gZmFpbHVyZSBmb3IgdW5yZWdpc3RlciBpZiBpdCBoYXMgcGVuZGluZworICogY29tbWFuZHMgaW4gTExECisgKi8KK3N0YXRpYyBpbnQKK21lZ2FyYWlkX2NtbV91bnJlZ2lzdGVyKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlrZnJlZShhZGFwdGVyLT51c2NiX2xpc3QpOworCW1yYWlkX21tX3VucmVnaXN0ZXJfYWRwKGFkYXB0ZXItPnVuaXF1ZV9pZCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9tYm94X21tX2hhbmRsZXIgLSBpbnRlcmZhY2UgZm9yIENNTSB0byBpc3N1ZSBjb21tYW5kcyB0byBMTEQKKyAqIEBwYXJhbSBkcnZyX2RhdGEJOiBMTEQgc3BlY2lmaWMgZGF0YQorICogQHBhcmFtIGtpb2MJCTogQ01NIGludGVyZmFjZSBwYWNrZXQKKyAqIEBwYXJhbSBhY3Rpb24JOiBjb21tYW5kIGFjdGlvbgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBpbnZva2VkIHdoZW5ldmVyIHRoZSBDb21tb24gTWFuZ2VtZW50IE1vZHVsZSAoQ01NKSBoYXMgYQorICogY29tbWFuZCBmb3IgdXMuIFRoZSAnYWN0aW9uJyBwYXJhbWV0ZXIgc3BlY2lmaWVzIGlmIHRoaXMgaXMgYSBuZXcgY29tbWFuZAorICogb3Igb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50CittZWdhcmFpZF9tYm94X21tX2hhbmRsZXIodW5zaWduZWQgbG9uZyBkcnZyX2RhdGEsIHVpb2NfdCAqa2lvYywgdWludDMyX3QgYWN0aW9uKQoreworCWFkYXB0ZXJfdCAqYWRhcHRlcjsKKworCWlmIChhY3Rpb24gIT0gSU9DVExfSVNTVUUpIHsKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCSJtZWdhcmFpZDogdW5zdXBwb3J0ZWQgbWFuYWdlbWVudCBhY3Rpb246JSMyeFxuIiwKKwkJCWFjdGlvbikpOworCQlyZXR1cm4gKC1FTk9UU1VQUCk7CisJfQorCisJYWRhcHRlciA9IChhZGFwdGVyX3QgKilkcnZyX2RhdGE7CisKKwkvLyBtYWtlIHN1cmUgdGhpcyBhZGFwdGVyIGlzIG5vdCBiZWluZyBkZXRhY2hlZCByaWdodCBub3cuCisJaWYgKGF0b21pY19yZWFkKCZhZGFwdGVyLT5iZWluZ19kZXRhY2hlZCkpIHsKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCSJtZWdhcmFpZDogcmVqZWN0IG1hbmFnZW1lbnQgcmVxdWVzdCwgZGV0YWNoaW5nXG4iKSk7CisJCXJldHVybiAoLUVOT0RFVik7CisJfQorCisJc3dpdGNoIChraW9jLT5vcGNvZGUpIHsKKworCWNhc2UgR0VUX0FEQVBfSU5GTzoKKworCQlraW9jLT5zdGF0dXMgPSAgZ2F0aGVyX2hiYWluZm8oYWRhcHRlciwgKG1yYWlkX2hiYV9pbmZvX3QgKikKKwkJCQkJKHVuc2lnbmVkIGxvbmcpa2lvYy0+YnVmX3ZhZGRyKTsKKworCQlraW9jLT5kb25lKGtpb2MpOworCisJCXJldHVybiBraW9jLT5zdGF0dXM7CisKKwljYXNlIE1CT1hfQ01EOgorCisJCXJldHVybiBtZWdhcmFpZF9tYm94X21tX2NvbW1hbmQoYWRhcHRlciwga2lvYyk7CisKKwlkZWZhdWx0OgorCQlraW9jLT5zdGF0dXMgPSAoLUVJTlZBTCk7CisJCWtpb2MtPmRvbmUoa2lvYyk7CisJCXJldHVybiAoLUVJTlZBTCk7CisJfQorCisJcmV0dXJuIDA7CS8vIG5vdCByZWFjaGVkCit9CisKKy8qKgorICogbWVnYXJhaWRfbWJveF9tbV9jb21tYW5kIC0gaXNzdWVzIGNvbW1hbmRzIHJvdXRlZCB0aHJvdWdoIENNTQorICogQHBhcmFtIGFkYXB0ZXIJOiBIQkEgc29mdCBzdGF0ZQorICogQHBhcmFtIGtpb2MJCTogbWFuYWdlbWVudCBjb21tYW5kIHBhY2tldAorICoKKyAqIElzc3VlcyBjb21tYW5kcywgd2hpY2ggYXJlIHJvdXRlZCB0aHJvdWdoIHRoZSBtYW5hZ2VtZW50IG1vZHVsZS4KKyAqLworc3RhdGljIGludAorbWVnYXJhaWRfbWJveF9tbV9jb21tYW5kKGFkYXB0ZXJfdCAqYWRhcHRlciwgdWlvY190ICpraW9jKQoreworCXN0cnVjdCBsaXN0X2hlYWQJKmhlYWQgPSAmYWRhcHRlci0+dXNjYl9wb29sOworCW1ib3g2NF90CQkqbWJveDY0OworCXVpbnQ4X3QJCQkqcmF3X21ib3g7CisJc2NiX3QJCQkqc2NiOworCW1ib3hfY2NiX3QJCSpjY2I7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKwkvLyBkZXRhY2ggb25lIHNjYiBmcm9tIGZyZWUgcG9vbAorCXNwaW5fbG9ja19pcnFzYXZlKFVTRVJfRlJFRV9MSVNUX0xPQ0soYWRhcHRlciksIGZsYWdzKTsKKworCWlmIChsaXN0X2VtcHR5KGhlYWQpKSB7CS8vIHNob3VsZCBuZXZlciBoYXBwZW4gYmVjYXVzZSBvZiBDTU0KKworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkIG1ib3g6IGJ1ZyBpbiBjbW0gaGFuZGxlciwgbG9zdCByZXNvdXJjZXNcbiIpKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKFVTRVJfRlJFRV9MSVNUX0xPQ0soYWRhcHRlciksIGZsYWdzKTsKKworCQlyZXR1cm4gKC1FSU5WQUwpOworCX0KKworCXNjYiA9IGxpc3RfZW50cnkoaGVhZC0+bmV4dCwgc2NiX3QsIGxpc3QpOworCWxpc3RfZGVsX2luaXQoJnNjYi0+bGlzdCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKFVTRVJfRlJFRV9MSVNUX0xPQ0soYWRhcHRlciksIGZsYWdzKTsKKworCXNjYi0+c3RhdGUJCT0gU0NCX0FDVElWRTsKKwlzY2ItPmRtYV90eXBlCQk9IE1SQUlEX0RNQV9OT05FOworCXNjYi0+ZG1hX2RpcmVjdGlvbgk9IFBDSV9ETUFfTk9ORTsKKworCWNjYgkJPSAobWJveF9jY2JfdCAqKXNjYi0+Y2NiOworCW1ib3g2NAkJPSAobWJveDY0X3QgKikodW5zaWduZWQgbG9uZylraW9jLT5jbWRidWY7CisJcmF3X21ib3gJPSAodWludDhfdCAqKSZtYm94NjQtPm1ib3gzMjsKKworCW1lbWNweShjY2ItPm1ib3g2NCwgbWJveDY0LCBzaXplb2YobWJveDY0X3QpKTsKKworCXNjYi0+Z3AJCT0gKHVuc2lnbmVkIGxvbmcpa2lvYzsKKworCS8qCisJICogSWYgaXQgaXMgYSBsb2dkcnYgcmFuZG9tIGRlbGV0ZSBvcGVyYXRpb24sIHdlIGhhdmUgdG8gd2FpdCB0aWxsCisJICogdGhlcmUgYXJlIG5vIG91dHN0YW5kaW5nIGNtZHMgYXQgdGhlIGZ3IGFuZCB0aGVuIGlzc3VlIGl0IGRpcmVjdGx5CisJICovCisJaWYgKHJhd19tYm94WzBdID09IEZDX0RFTF9MT0dEUlYgJiYgcmF3X21ib3hbMl0gPT0gT1BfREVMX0xPR0RSVikgeworCisJCWlmICh3YWl0X3RpbGxfZndfZW1wdHkoYWRhcHRlcikpIHsKKwkJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9OT1RJQ0UKKwkJCQkibWVnYXJhaWQgbWJveDogTEQgZGVsZXRlLCB0aW1lZCBvdXRcbiIpKTsKKworCQkJa2lvYy0+c3RhdHVzID0gLUVUSU1FOworCisJCQlzY2ItPnN0YXR1cyA9IC0xOworCisJCQltZWdhcmFpZF9tYm94X21tX2RvbmUoYWRhcHRlciwgc2NiKTsKKworCQkJcmV0dXJuICgtRVRJTUUpOworCQl9CisKKwkJSU5JVF9MSVNUX0hFQUQoJnNjYi0+bGlzdCk7CisKKwkJc2NiLT5zdGF0ZSA9IFNDQl9JU1NVRUQ7CisJCWlmIChtYm94X3Bvc3RfY21kKGFkYXB0ZXIsIHNjYikgIT0gMCkgeworCisJCQljb25fbG9nKENMX0FOTiwgKEtFUk5fTk9USUNFCisJCQkJIm1lZ2FyYWlkIG1ib3g6IExEIGRlbGV0ZSwgbWFpbGJveCBidXN5XG4iKSk7CisKKwkJCWtpb2MtPnN0YXR1cyA9IC1FQlVTWTsKKworCQkJc2NiLT5zdGF0dXMgPSAtMTsKKworCQkJbWVnYXJhaWRfbWJveF9tbV9kb25lKGFkYXB0ZXIsIHNjYik7CisKKwkJCXJldHVybiAoLUVCVVNZKTsKKwkJfQorCisJCXJldHVybiAwOworCX0KKworCS8vIHB1dCB0aGUgY29tbWFuZCBvbiB0aGUgcGVuZGluZyBsaXN0IGFuZCBleGVjdXRlCisJbWVnYXJhaWRfbWJveF9ydW5wZW5kcShhZGFwdGVyLCBzY2IpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAord2FpdF90aWxsX2Z3X2VtcHR5KGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzID0gMDsKKwlpbnQJCWk7CisKKworCS8qCisJICogU2V0IHRoZSBxdWllc2NlbnQgZmxhZyB0byBzdG9wIGlzc3VpbmcgY21kcyB0byBGVy4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZShhZGFwdGVyLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlhZGFwdGVyLT5xdWllc2NlbnQrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFkYXB0ZXItPmhvc3RfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBXYWl0IHRpbGwgdGhlcmUgYXJlIG5vIG1vcmUgY21kcyBvdXRzdGFuZGluZyBhdCBGVy4gVHJ5IGZvciBhdCBtb3N0CisJICogNjAgc2Vjb25kcworCSAqLworCWZvciAoaSA9IDA7IGkgPCA2MCAmJiBhZGFwdGVyLT5vdXRzdGFuZGluZ19jbWRzOyBpKyspIHsKKwkJY29uX2xvZyhDTF9ETEVWRUwxLCAoS0VSTl9JTkZPCisJCQkibWVnYXJhaWQ6IEZXIGhhcyAlZCBwZW5kaW5nIGNvbW1hbmRzXG4iLAorCQkJYWRhcHRlci0+b3V0c3RhbmRpbmdfY21kcykpOworCisJCW1zbGVlcCgxMDAwKTsKKwl9CisKKwlyZXR1cm4gYWRhcHRlci0+b3V0c3RhbmRpbmdfY21kczsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX21ib3hfbW1fZG9uZSAtIGNhbGxiYWNrIGZvciBDTU0gY29tbWFuZHMKKyAqIEBhZGFwdGVyCTogSEJBIHNvZnQgc3RhdGUKKyAqIEBzY2IJCTogY29tcGxldGVkIGNvbW1hbmQKKyAqCisgKiBDYWxsYmFjayByb3V0aW5lIGZvciBpbnRlcm5hbCBjb21tYW5kcyBvcmlnaW5hdGVkIGZyb20gdGhlIG1hbmFnZW1lbnQKKyAqIG1vZHVsZS4KKyAqLworc3RhdGljIHZvaWQKK21lZ2FyYWlkX21ib3hfbW1fZG9uZShhZGFwdGVyX3QgKmFkYXB0ZXIsIHNjYl90ICpzY2IpCit7CisJdWlvY190CQkJKmtpb2M7CisJbWJveDY0X3QJCSptYm94NjQ7CisJdWludDhfdAkJCSpyYXdfbWJveDsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworCWtpb2MJCQk9ICh1aW9jX3QgKilzY2ItPmdwOworCWtpb2MtPnN0YXR1cwkJPSAwOworCW1ib3g2NAkJCT0gKG1ib3g2NF90ICopKHVuc2lnbmVkIGxvbmcpa2lvYy0+Y21kYnVmOworCW1ib3g2NC0+bWJveDMyLnN0YXR1cwk9IHNjYi0+c3RhdHVzOworCXJhd19tYm94CQk9ICh1aW50OF90ICopJm1ib3g2NC0+bWJveDMyOworCisKKwkvLyBwdXQgc2NiIGluIHRoZSBmcmVlIHBvb2wKKwlzY2ItPnN0YXRlCT0gU0NCX0ZSRUU7CisJc2NiLT5zY3AJPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoVVNFUl9GUkVFX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCisJbGlzdF9hZGQoJnNjYi0+bGlzdCwgJmFkYXB0ZXItPnVzY2JfcG9vbCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKFVTRVJfRlJFRV9MSVNUX0xPQ0soYWRhcHRlciksIGZsYWdzKTsKKworCS8vIGlmIGEgZGVsZXRlIGxvZ2ljYWwgZHJpdmUgb3BlcmF0aW9uIHN1Y2NlZWRlZCwgcmVzdGFydCB0aGUKKwkvLyBjb250cm9sbGVyCisJaWYgKHJhd19tYm94WzBdID09IEZDX0RFTF9MT0dEUlYgJiYgcmF3X21ib3hbMl0gPT0gT1BfREVMX0xPR0RSVikgeworCisJCWFkYXB0ZXItPnF1aWVzY2VudC0tOworCisJCW1lZ2FyYWlkX21ib3hfcnVucGVuZHEoYWRhcHRlciwgTlVMTCk7CisJfQorCisJa2lvYy0+ZG9uZShraW9jKTsKKworCXJldHVybjsKK30KKworCisvKioKKyAqIGdhdGhlcl9oYmFpbmZvIC0gSEJBIGNoYXJhY3RlcmlzdGljcyBmb3IgdGhlIGFwcGxpY2F0aW9ucworICogQHBhcmFtIGFkYXB0ZXIJOiBIQkEgc29mdCBzdGF0ZQorICogQHBhcmFtIGhpbmZvCQk6IHBvaW50ZXIgdG8gdGhlIGNhbGxlcidzIGhvc3QgaW5mbyBzdHJ1Y3V0dXJlCisgKi8KK3N0YXRpYyBpbnQKK2dhdGhlcl9oYmFpbmZvKGFkYXB0ZXJfdCAqYWRhcHRlciwgbXJhaWRfaGJhX2luZm9fdCAqaGluZm8pCit7CisJdWludDhfdAlkbWFqb3I7CisKKwlkbWFqb3IJCQk9IG1lZ2FyYWlkX21ib3hfdmVyc2lvblswXTsKKworCWhpbmZvLT5wY2lfdmVuZG9yX2lkCT0gYWRhcHRlci0+cGRldi0+dmVuZG9yOworCWhpbmZvLT5wY2lfZGV2aWNlX2lkCT0gYWRhcHRlci0+cGRldi0+ZGV2aWNlOworCWhpbmZvLT5zdWJzeXNfdmVuZG9yX2lkCT0gYWRhcHRlci0+cGRldi0+c3Vic3lzdGVtX3ZlbmRvcjsKKwloaW5mby0+c3Vic3lzX2RldmljZV9pZAk9IGFkYXB0ZXItPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisKKwloaW5mby0+cGNpX2J1cwkJPSBhZGFwdGVyLT5wZGV2LT5idXMtPm51bWJlcjsKKwloaW5mby0+cGNpX2Rldl9mbgk9IGFkYXB0ZXItPnBkZXYtPmRldmZuOworCWhpbmZvLT5wY2lfc2xvdAkJPSBQQ0lfU0xPVChhZGFwdGVyLT5wZGV2LT5kZXZmbik7CisJaGluZm8tPmlycQkJPSBhZGFwdGVyLT5ob3N0LT5pcnE7CisJaGluZm8tPmJhc2Vwb3J0CQk9IEFEQVAyUkFJRERFVihhZGFwdGVyKS0+YmFzZXBvcnQ7CisKKwloaW5mby0+dW5pcXVlX2lkCT0gKGhpbmZvLT5wY2lfYnVzIDw8IDgpIHwgYWRhcHRlci0+cGRldi0+ZGV2Zm47CisJaGluZm8tPmhvc3Rfbm8JCT0gYWRhcHRlci0+aG9zdC0+aG9zdF9ubzsKKworCXJldHVybiAwOworfQorCisvKgorICogRU5EOiBJbnRlcmZhY2UgZm9yIHRoZSBjb21tb24gbWFuYWdlbWVudCBtb2R1bGUKKyAqLworCisKKworLyoqCisgKiBtZWdhcmFpZF9zeXNmc19hbGxvY19yZXNvdXJjZXMgLSBhbGxvY2F0ZSBzeXNmcyByZWxhdGVkIHJlc291cmNlcworICoKKyAqIEFsbG9jYXRlIHBhY2tldHMgcmVxdWlyZWQgdG8gaXNzdWUgRlcgY2FsbHMgd2hlbmV2ZXIgdGhlIHN5c2ZzIGF0dHJpYnV0ZXMKKyAqIGFyZSByZWFkLiBUaGVzZSBhdHRyaWJ1dGVzIHdvdWxkIHJlcXVpcmUgdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZQorICogRlcuIEFsc28gc2V0IHVwIHJlc291cmNlcyBmb3IgbXV0dWFsIGV4Y2x1c2lvbiB0byBzaGFyZSB0aGVzZSByZXNvdXJjZXMgYW5kCisgKiB0aGUgd2FpdCBxdWV1ZS4KKyAqCisgKiBAcGFyYW0gYWRhcHRlciA6IGNvbnRyb2xsZXIncyBzb2Z0IHN0YXRlCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MKKyAqIEByZXR1cm4gLUVSUk9SX0NPREUgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50CittZWdhcmFpZF9zeXNmc19hbGxvY19yZXNvdXJjZXMoYWRhcHRlcl90ICphZGFwdGVyKQoreworCW1yYWlkX2RldmljZV90CSpyYWlkX2RldiA9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKKwlpbnQJCXJ2YWwgPSAwOworCisJcmFpZF9kZXYtPnN5c2ZzX3Vpb2MgPSBrbWFsbG9jKHNpemVvZih1aW9jX3QpLCBHRlBfS0VSTkVMKTsKKworCXJhaWRfZGV2LT5zeXNmc19tYm94NjQgPSBrbWFsbG9jKHNpemVvZihtYm94NjRfdCksIEdGUF9LRVJORUwpOworCisJcmFpZF9kZXYtPnN5c2ZzX2J1ZmZlciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCisJCQlQQUdFX1NJWkUsICZyYWlkX2Rldi0+c3lzZnNfYnVmZmVyX2RtYSk7CisKKwlpZiAoIXJhaWRfZGV2LT5zeXNmc191aW9jIHx8ICFyYWlkX2Rldi0+c3lzZnNfbWJveDY0IHx8CisJCSFyYWlkX2Rldi0+c3lzZnNfYnVmZmVyKSB7CisKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCSJtZWdhcmFpZDogb3V0IG9mIG1lbW9yeSwgJXMgJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCV9fTElORV9fKSk7CisKKwkJcnZhbCA9IC1FTk9NRU07CisKKwkJbWVnYXJhaWRfc3lzZnNfZnJlZV9yZXNvdXJjZXMoYWRhcHRlcik7CisJfQorCisJc2VtYV9pbml0KCZyYWlkX2Rldi0+c3lzZnNfc2VtLCAxKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJhaWRfZGV2LT5zeXNmc193YWl0X3EpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9zeXNmc19mcmVlX3Jlc291cmNlcyAtIGZyZWUgc3lzZnMgcmVsYXRlZCByZXNvdXJjZXMKKyAqCisgKiBGcmVlIHBhY2tldHMgYWxsb2NhdGVkIGZvciBzeXNmcyBGVyBjb21tYW5kcworICoKKyAqIEBwYXJhbSBhZGFwdGVyIDogY29udHJvbGxlcidzIHNvZnQgc3RhdGUKKyAqLworc3RhdGljIHZvaWQKK21lZ2FyYWlkX3N5c2ZzX2ZyZWVfcmVzb3VyY2VzKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwltcmFpZF9kZXZpY2VfdAkqcmFpZF9kZXYgPSBBREFQMlJBSURERVYoYWRhcHRlcik7CisKKwlpZiAocmFpZF9kZXYtPnN5c2ZzX3Vpb2MpIGtmcmVlKHJhaWRfZGV2LT5zeXNmc191aW9jKTsKKworCWlmIChyYWlkX2Rldi0+c3lzZnNfbWJveDY0KSBrZnJlZShyYWlkX2Rldi0+c3lzZnNfbWJveDY0KTsKKworCWlmIChyYWlkX2Rldi0+c3lzZnNfYnVmZmVyKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgUEFHRV9TSVpFLAorCQkJcmFpZF9kZXYtPnN5c2ZzX2J1ZmZlciwgcmFpZF9kZXYtPnN5c2ZzX2J1ZmZlcl9kbWEpOworCX0KK30KKworCisvKioKKyAqIG1lZ2FyYWlkX3N5c2ZzX2dldF9sZG1hcF9kb25lIC0gY2FsbGJhY2sgZm9yIGdldCBsZG1hcAorICoKKyAqIENhbGxiYWNrIHJvdXRpbmUgY2FsbGVkIGluIHRoZSBJU1IvdGFza2xldCBjb250ZXh0IGZvciBnZXQgbGRtYXAgY2FsbAorICoKKyAqIEBwYXJhbSB1aW9jIDogY29tcGxldGVkIHBhY2tldAorICovCitzdGF0aWMgdm9pZAorbWVnYXJhaWRfc3lzZnNfZ2V0X2xkbWFwX2RvbmUodWlvY190ICp1aW9jKQoreworCWFkYXB0ZXJfdAkqYWRhcHRlciA9IChhZGFwdGVyX3QgKil1aW9jLT5idWZfdmFkZHI7CisJbXJhaWRfZGV2aWNlX3QJKnJhaWRfZGV2ID0gQURBUDJSQUlEREVWKGFkYXB0ZXIpOworCisJdWlvYy0+c3RhdHVzID0gMDsKKworCXdha2VfdXAoJnJhaWRfZGV2LT5zeXNmc193YWl0X3EpOworfQorCisKKy8qKgorICogbWVnYXJhaWRfc3lzZnNfZ2V0X2xkbWFwX3RpbWVvdXQgLSB0aW1lb3V0IGhhbmRsaW5nIGZvciBnZXQgbGRtYXAKKyAqCisgKiBUaW1lb3V0IHJvdXRpbmUgdG8gcmVjb3ZlciBhbmQgcmV0dXJuIHRvIGFwcGxpY2F0aW9uLCBpbiBjYXNlIHRoZSBhZGFwdGVyCisgKiBoYXMgc3RvcHBlZCByZXNwb25kaW5nLiBBIHRpbWVvdXQgb2YgNjAgc2Vjb25kcyBmb3IgdGhpcyBjb21tYW5kIHNlZW0gbGlrZQorICogYSBnb29kIHZhbHVlCisgKgorICogQHBhcmFtIHVpb2MgOiB0aW1lZCBvdXQgcGFja2V0CisgKi8KK3N0YXRpYyB2b2lkCittZWdhcmFpZF9zeXNmc19nZXRfbGRtYXBfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdWlvY190CQkqdWlvYyA9ICh1aW9jX3QgKilkYXRhOworCWFkYXB0ZXJfdAkqYWRhcHRlciA9IChhZGFwdGVyX3QgKil1aW9jLT5idWZfdmFkZHI7CisJbXJhaWRfZGV2aWNlX3QJKnJhaWRfZGV2ID0gQURBUDJSQUlEREVWKGFkYXB0ZXIpOworCisJdWlvYy0+c3RhdHVzID0gLUVUSU1FOworCisJd2FrZV91cCgmcmFpZF9kZXYtPnN5c2ZzX3dhaXRfcSk7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9zeXNmc19nZXRfbGRtYXAgLSBnZXQgdXBkYXRlIGxvZ2ljYWwgZHJpdmUgbWFwCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIHVzZXIgcmVhZHMgdGhlIGxvZ2ljYWwgZHJpdmUKKyAqIGF0dHJpYnV0ZXMsIGdvIGdldCB0aGUgY3VycmVudCBsb2dpY2FsIGRyaXZlIG1hcHBpbmcgdGFibGUgZnJvbSB0aGUKKyAqIGZpcm13YXJlLiBXZSB1c2UgdGhlIG1hbmFnbWVudCBBUEkncyB0byBpc3N1ZSBjb21tYW5kcyB0byB0aGUgY29udHJvbGxlci4KKyAqCisgKiBOT1RFOiBUaGUgY29tbWFuZHMgaXNzdWFuY2UgZnVuY3Rpb25hbGl0eSBpcyBub3QgZ2VuZXJhbGl6ZWQgYW5kCisgKiBpbXBsZW1lbnRlZCBpbiBjb250ZXh0IG9mICJnZXQgbGQgbWFwIiBjb21tYW5kIG9ubHkuIElmIHJlcXVpcmVkLCB0aGUKKyAqIGNvbW1hbmQgaXNzdWFuY2UgbG9naWNhbCBjYW4gYmUgdHJpdmlhbGx5IHB1bGxlZCBvdXQgYW5kIGltcGxlbWVudGVkIGFzIGEKKyAqIHN0YW5kYWxvbmUgbGliYXJ5LiBGb3Igbm93LCB0aGlzIHNob3VsZCBzdWZmaWNlIHNpbmNlIHRoZXJlIGlzIG5vIG90aGVyCisgKiB1c2VyIG9mIHRoaXMgaW50ZXJmYWNlLgorICoKKyAqIEBwYXJhbSBhZGFwdGVyIDogY29udHJvbGxlcidzIHNvZnQgc3RhdGUKKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcworICogQHJldHVybiAtMSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FyYWlkX3N5c2ZzX2dldF9sZG1hcChhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJbXJhaWRfZGV2aWNlX3QJCSpyYWlkX2RldiA9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKKwl1aW9jX3QJCQkqdWlvYzsKKwltYm94NjRfdAkJKm1ib3g2NDsKKwltYm94X3QJCQkqbWJveDsKKwljaGFyCQkJKnJhd19tYm94OworCXN0cnVjdCB0aW1lcl9saXN0CXN5c2ZzX3RpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0CSp0aW1lcnA7CisJY2FkZHJfdAkJCWxkbWFwOworCWludAkJCXJ2YWwgPSAwOworCisJLyoKKwkgKiBBbGxvdyBvbmx5IG9uZSByZWFkIGF0IGEgdGltZSB0byBnbyB0aHJvdWdoIHRoZSBzeXNmcyBhdHRyaWJ1dGVzCisJICovCisJZG93bigmcmFpZF9kZXYtPnN5c2ZzX3NlbSk7CisKKwl1aW9jCT0gcmFpZF9kZXYtPnN5c2ZzX3Vpb2M7CisJbWJveDY0CT0gcmFpZF9kZXYtPnN5c2ZzX21ib3g2NDsKKwlsZG1hcAk9IHJhaWRfZGV2LT5zeXNmc19idWZmZXI7CisKKwltZW1zZXQodWlvYywgMCwgc2l6ZW9mKHVpb2NfdCkpOworCW1lbXNldChtYm94NjQsIDAsIHNpemVvZihtYm94NjRfdCkpOworCW1lbXNldChsZG1hcCwgMCwgc2l6ZW9mKHJhaWRfZGV2LT5jdXJyX2xkbWFwKSk7CisKKwltYm94CQk9ICZtYm94NjQtPm1ib3gzMjsKKwlyYXdfbWJveAk9IChjaGFyICopbWJveDsKKwl1aW9jLT5jbWRidWYgICAgPSAodWludDY0X3QpKHVuc2lnbmVkIGxvbmcpbWJveDY0OworCXVpb2MtPmJ1Zl92YWRkcgk9IChjYWRkcl90KWFkYXB0ZXI7CisJdWlvYy0+c3RhdHVzCT0gLUVOT0RBVEE7CisJdWlvYy0+ZG9uZQk9IG1lZ2FyYWlkX3N5c2ZzX2dldF9sZG1hcF9kb25lOworCisJLyoKKwkgKiBQcmVwYXJlIHRoZSBtYWlsYm94IHBhY2tldCB0byBnZXQgdGhlIGN1cnJlbnQgbG9naWNhbCBkcml2ZSBtYXBwaW5nCisJICogdGFibGUKKwkgKi8KKwltYm94LT54ZmVyYWRkciA9ICh1aW50MzJfdClyYWlkX2Rldi0+c3lzZnNfYnVmZmVyX2RtYTsKKworCXJhd19tYm94WzBdID0gRkNfREVMX0xPR0RSVjsKKwlyYXdfbWJveFsyXSA9IE9QX0dFVF9MRElEX01BUDsKKworCS8qCisJICogU2V0dXAgYSB0aW1lciB0byByZWNvdmVyIGZyb20gYSBub24tcmVzcG9uZGluZyBjb250cm9sbGVyCisJICovCisJdGltZXJwCT0gJnN5c2ZzX3RpbWVyOworCWluaXRfdGltZXIodGltZXJwKTsKKworCXRpbWVycC0+ZnVuY3Rpb24JPSBtZWdhcmFpZF9zeXNmc19nZXRfbGRtYXBfdGltZW91dDsKKwl0aW1lcnAtPmRhdGEJCT0gKHVuc2lnbmVkIGxvbmcpdWlvYzsKKwl0aW1lcnAtPmV4cGlyZXMJCT0gamlmZmllcyArIDYwICogSFo7CisKKwlhZGRfdGltZXIodGltZXJwKTsKKworCS8qCisJICogU2VuZCB0aGUgY29tbWFuZCB0byB0aGUgZmlybXdhcmUKKwkgKi8KKwlydmFsID0gbWVnYXJhaWRfbWJveF9tbV9jb21tYW5kKGFkYXB0ZXIsIHVpb2MpOworCisJaWYgKHJ2YWwgPT0gMCkgewkvLyBjb21tYW5kIHN1Y2Nlc3NmdWxseSBpc3N1ZWQKKwkJd2FpdF9ldmVudChyYWlkX2Rldi0+c3lzZnNfd2FpdF9xLCAodWlvYy0+c3RhdHVzICE9IC1FTk9EQVRBKSk7CisKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhlIGNvbW1hbmQgdGltZWQgb3V0CisJCSAqLworCQlpZiAodWlvYy0+c3RhdHVzID09IC1FVElNRSkgeworCQkJY29uX2xvZyhDTF9BTk4sIChLRVJOX05PVElDRQorCQkJCSJtZWdhcmFpZDogc3lzZnMgZ2V0IGxkIG1hcCB0aW1lZCBvdXRcbiIpKTsKKworCQkJcnZhbCA9IC1FVElNRTsKKwkJfQorCQllbHNlIHsKKwkJCXJ2YWwgPSBtYm94LT5zdGF0dXM7CisJCX0KKworCQlpZiAocnZhbCA9PSAwKSB7CisJCQltZW1jcHkocmFpZF9kZXYtPmN1cnJfbGRtYXAsIGxkbWFwLAorCQkJCXNpemVvZihyYWlkX2Rldi0+Y3Vycl9sZG1hcCkpOworCQl9CisJCWVsc2UgeworCQkJY29uX2xvZyhDTF9BTk4sIChLRVJOX05PVElDRQorCQkJCSJtZWdhcmFpZDogZ2V0IGxkIG1hcCBmYWlsZWQgd2l0aCAleFxuIiwgcnZhbCkpOworCQl9CisJfQorCWVsc2UgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fTk9USUNFCisJCQkibWVnYXJhaWQ6IGNvdWxkIG5vdCBpc3N1ZSBsZG1hcCBjb21tYW5kOiV4XG4iLCBydmFsKSk7CisJfQorCisKKwlkZWxfdGltZXJfc3luYyh0aW1lcnApOworCisJdXAoJnJhaWRfZGV2LT5zeXNmc19zZW0pOworCisJcmV0dXJuIHJ2YWw7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9zeXNmc19zaG93X2FwcF9obmRsIC0gZGlzcGxheSBhcHBsaWNhdGlvbiBoYW5kbGUgZm9yIHRoaXMgYWRhcHRlcgorICoKKyAqIERpc3BsYXkgdGhlIGhhbmRsZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbnMgd2hpbGUgZXhlY3V0aW5nIG1hbmFnZW1lbnQKKyAqIHRhc2tzIG9uIHRoZSBhZGFwdGVyLiBXZSBpbnZva2UgYSBtYW5hZ2VtZW50IG1vZHVsZSBBUEkgdG8gZ2V0IHRoZSBhZGFwdGVyCisgKiBoYW5kbGUsIHNpbmNlIHdlIGRvIG5vdCBpbnRlcmZhY2Ugd2l0aCBhcHBsaWNhdGlvbnMgZGlyZWN0bHkuCisgKgorICogQHBhcmFtIGNkZXYJOiBjbGFzcyBkZXZpY2Ugb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciB0aGUgaG9zdAorICogQHBhcmFtIGJ1Zgk6IGJ1ZmZlciB0byBzZW5kIGRhdGEgdG8KKyAqLworc3RhdGljIHNzaXplX3QKK21lZ2FyYWlkX3N5c2ZzX3Nob3dfYXBwX2huZGwoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJYWRhcHRlcl90CSphZGFwdGVyID0gKGFkYXB0ZXJfdCAqKVNDU0lIT1NUMkFEQVAoc2hvc3QpOworCXVpbnQzMl90CWFwcF9obmRsOworCisJYXBwX2huZGwgPSBtcmFpZF9tbV9hZGFwdGVyX2FwcF9oYW5kbGUoYWRhcHRlci0+dW5pcXVlX2lkKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIDgsICIldVxuIiwgYXBwX2huZGwpOworfQorCisKKy8qKgorICogbWVnYXJhaWRfc3lzZnNfc2hvd19sZG51bSAtIGRpc3BsYXkgdGhlIGxvZ2ljYWwgZHJpdmUgbnVtYmVyIGZvciB0aGlzIGRldmljZQorICoKKyAqIERpc3BsYXkgdGhlIGxvZ2ljYWwgZHJpdmUgbnVtYmVyIGZvciB0aGUgZGV2aWNlIGluIHF1ZXN0aW9uLCBpZiBpdCBhIHZhbGlkCisgKiBsb2dpY2FsIGRyaXZlLiBGb3IgcGh5c2ljYWwgZGV2aWNlcywgIi0xIiBpcyByZXR1cm5lZAorICogVGhlIGxvZ2ljYWwgZHJpdmUgbnVtYmVyIGlzIGRpc3BsYXllZCBpbiBmb2xsb3dpbmcgZm9ybWF0CisgKgorICogPFNDU0kgSUQ+IDxMRCBOVU0+IDxMRCBTVElDS1kgSUQ+IDxBUFAgQURBUFRFUiBIQU5ETEU+CisgKiAgIDxpbnQ+ICAgICA8aW50PiAgICAgICA8aW50PiAgICAgICAgICAgIDxpbnQ+CisgKgorICogQHBhcmFtIGRldgk6IGRldmljZSBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBzY3NpIGRldmljZQorICogQHBhcmFtIGJ1Zgk6IGJ1ZmZlciB0byBzZW5kIGRhdGEgdG8KKyAqLworc3RhdGljIHNzaXplX3QKK21lZ2FyYWlkX3N5c2ZzX3Nob3dfbGRudW0oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwlhZGFwdGVyX3QJKmFkYXB0ZXIgPSAoYWRhcHRlcl90ICopU0NTSUhPU1QyQURBUChzZGV2LT5ob3N0KTsKKwltcmFpZF9kZXZpY2VfdAkqcmFpZF9kZXYgPSBBREFQMlJBSURERVYoYWRhcHRlcik7CisJaW50CQlzY3NpX2lkID0gLTE7CisJaW50CQlsb2dpY2FsX2RydiA9IC0xOworCWludAkJbGRpZF9tYXAgPSAtMTsKKwl1aW50MzJfdAlhcHBfaG5kbCA9IDA7CisJaW50CQltYXBwZWRfc2Rldl9pZDsKKwlpbnQJCXJ2YWw7CisJaW50CQlpOworCisJaWYgKHJhaWRfZGV2LT5yYW5kb21fZGVsX3N1cHBvcnRlZCAmJgorCQkJTVJBSURfSVNfTE9HSUNBTF9TREVWKGFkYXB0ZXIsIHNkZXYpKSB7CisKKwkJcnZhbCA9IG1lZ2FyYWlkX3N5c2ZzX2dldF9sZG1hcChhZGFwdGVyKTsKKwkJaWYgKHJ2YWwgPT0gMCkgeworCisJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xPR0lDQUxfRFJJVkVTXzQwTEQ7IGkrKykgeworCisJCQkJbWFwcGVkX3NkZXZfaWQgPSBzZGV2LT5pZDsKKworCQkJCWlmIChzZGV2LT5pZCA+IGFkYXB0ZXItPmluaXRfaWQpIHsKKwkJCQkJbWFwcGVkX3NkZXZfaWQgLT0gMTsKKwkJCQl9CisKKwkJCQlpZiAocmFpZF9kZXYtPmN1cnJfbGRtYXBbaV0gPT0gbWFwcGVkX3NkZXZfaWQpIHsKKworCQkJCQlzY3NpX2lkID0gc2Rldi0+aWQ7CisKKwkJCQkJbG9naWNhbF9kcnYgPSBpOworCisJCQkJCWxkaWRfbWFwID0gcmFpZF9kZXYtPmN1cnJfbGRtYXBbaV07CisKKwkJCQkJYXBwX2huZGwgPSBtcmFpZF9tbV9hZGFwdGVyX2FwcF9oYW5kbGUoCisJCQkJCQkJYWRhcHRlci0+dW5pcXVlX2lkKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQljb25fbG9nKENMX0FOTiwgKEtFUk5fTk9USUNFCisJCQkJIm1lZ2FyYWlkOiBzeXNmcyBnZXQgbGQgbWFwIGZhaWxlZDogJXhcbiIsCisJCQkJcnZhbCkpOworCQl9CisJfQorCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMzYsICIlZCAlZCAlZCAlZFxuIiwgc2NzaV9pZCwgbG9naWNhbF9kcnYsCisJCQlsZGlkX21hcCwgYXBwX2huZGwpOworfQorCisKKy8qCisgKiBFTkQ6IE1haWxib3ggTG93IExldmVsIERyaXZlcgorICovCittb2R1bGVfaW5pdChtZWdhcmFpZF9pbml0KTsKK21vZHVsZV9leGl0KG1lZ2FyYWlkX2V4aXQpOworCisvKiB2aW06IHNldCB0cz04IHN3PTggdHc9NzggYWkgc2k6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbWJveC5oIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21ib3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzUxMDAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21ib3guaApAQCAtMCwwICsxLDI4OCBAQAorLyoKKyAqCisgKgkJCUxpbnV4IE1lZ2FSQUlEIGRldmljZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCAgTFNJIExvZ2ljIENvcnBvcmF0aW9uLgorICoKKyAqCSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCSAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCSAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRklMRQkJOiBtZWdhcmFpZF9tYm94LmgKKyAqLworCisjaWZuZGVmIF9NRUdBUkFJRF9IXworI2RlZmluZSBfTUVHQVJBSURfSF8KKworCisjaW5jbHVkZSAibWVnYV9jb21tb24uaCIKKyNpbmNsdWRlICJtYm94X2RlZnMuaCIKKyNpbmNsdWRlICJtZWdhcmFpZF9pb2N0bC5oIgorCisKKyNkZWZpbmUgTUVHQVJBSURfVkVSU0lPTgkiMi4yMC40LjUiCisjZGVmaW5lIE1FR0FSQUlEX0VYVF9WRVJTSU9OCSIoUmVsZWFzZSBEYXRlOiBUaHUgRmViIDAzIDEyOjI3OjIyIEVTVCAyMDA1KSIKKworCisvKgorICogRGVmaW5lIHNvbWUgUENJIHZhbHVlcyBoZXJlIHVudGlsIHRoZXkgYXJlIHB1dCBpbiB0aGUga2VybmVsCisgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QRVJDNF9ESV9ESVNDT1ZFUlkJCTB4MDAwRQorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX1BFUkM0X0RJX0RJU0NPVkVSWQkJMHgwMTIzCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QRVJDNF9TQwkJCQkweDE5NjAKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9QRVJDNF9TQwkJCQkweDA1MjAKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BFUkM0X0RDCQkJCTB4MTk2MAorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX1BFUkM0X0RDCQkJCTB4MDUxOAorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEVSQzRfUUMJCQkJMHgwNDA3CisjZGVmaW5lIFBDSV9TVUJTWVNfSURfUEVSQzRfUUMJCQkJMHgwNTMxCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QRVJDNF9ESV9FVkVSR0xBREVTCQkweDAwMEYKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9QRVJDNF9ESV9FVkVSR0xBREVTCQkweDAxNEEKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BFUkM0RV9TSV9CSUdCRU5ECQkJMHgwMDEzCisjZGVmaW5lIFBDSV9TVUJTWVNfSURfUEVSQzRFX1NJX0JJR0JFTkQJCQkweDAxNmMKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BFUkM0RV9ESV9LT0JVSwkJCTB4MDAxMworI2RlZmluZSBQQ0lfU1VCU1lTX0lEX1BFUkM0RV9ESV9LT0JVSwkJCTB4MDE2ZAorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEVSQzRFX0RJX0NPUlZFVFRFCQkweDAwMTMKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9QRVJDNEVfRElfQ09SVkVUVEUJCTB4MDE2ZQorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEVSQzRFX0RJX0VYUEVESVRJT04JCTB4MDAxMworI2RlZmluZSBQQ0lfU1VCU1lTX0lEX1BFUkM0RV9ESV9FWFBFRElUSU9OCQkweDAxNmYKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BFUkM0RV9ESV9HVUFEQUxVUEUJCTB4MDAxMworI2RlZmluZSBQQ0lfU1VCU1lTX0lEX1BFUkM0RV9ESV9HVUFEQUxVUEUJCTB4MDE3MAorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEVSQzRFX0RDXzMyMF8yRQkJCTB4MDQwOAorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX1BFUkM0RV9EQ18zMjBfMkUJCQkweDAwMDIKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BFUkM0RV9TQ18zMjBfMUUJCQkweDA0MDgKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9QRVJDNEVfU0NfMzIwXzFFCQkJMHgwMDAxCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQ1NJXzMyMF8wCQkweDE5NjAKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9NRUdBUkFJRF9TQ1NJXzMyMF8wCQkweEE1MjAKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FR0FSQUlEX1NDU0lfMzIwXzEJCTB4MTk2MAorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX1NDU0lfMzIwXzEJCTB4MDUyMAorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVHQVJBSURfU0NTSV8zMjBfMgkJMHgxOTYwCisjZGVmaW5lIFBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0NTSV8zMjBfMgkJMHgwNTE4CisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQ1NJXzMyMF8weAkJMHgwNDA3CisjZGVmaW5lIFBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0NTSV8zMjBfMHgJCTB4MDUzMAorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVHQVJBSURfU0NTSV8zMjBfMngJCTB4MDQwNworI2RlZmluZSBQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX1NDU0lfMzIwXzJ4CQkweDA1MzIKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FR0FSQUlEX1NDU0lfMzIwXzR4CQkweDA0MDcKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9NRUdBUkFJRF9TQ1NJXzMyMF80eAkJMHgwNTMxCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQ1NJXzMyMF8xRQkJMHgwNDA4CisjZGVmaW5lIFBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0NTSV8zMjBfMUUJCTB4MDAwMQorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVHQVJBSURfU0NTSV8zMjBfMkUJCTB4MDQwOAorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX1NDU0lfMzIwXzJFCQkweDAwMDIKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FR0FSQUlEX0k0XzEzM19SQUlECQkweDE5NjAKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9NRUdBUkFJRF9JNF8xMzNfUkFJRAkJMHgwNTIyCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQVRBXzE1MF80CQkweDE5NjAKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9NRUdBUkFJRF9TQVRBXzE1MF80CQkweDQ1MjMKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FR0FSQUlEX1NBVEFfMTUwXzYJCTB4MTk2MAorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX1NBVEFfMTUwXzYJCTB4MDUyMworCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVHQVJBSURfU0FUQV8zMDBfNHgJCTB4MDQwOQorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX1NBVEFfMzAwXzR4CQkweDMwMDQKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FR0FSQUlEX1NBVEFfMzAwXzh4CQkweDA0MDkKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9NRUdBUkFJRF9TQVRBXzMwMF84eAkJMHgzMDA4CisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9SQUlEX1NSQ1U0MlgJCTB4MDQwNworI2RlZmluZSBQQ0lfU1VCU1lTX0lEX0lOVEVMX1JBSURfU1JDVTQyWAkJMHgwNTMyCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9SQUlEX1NSQ1MxNgkJCTB4MTk2MAorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX0lOVEVMX1JBSURfU1JDUzE2CQkJMHgwNTIzCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9SQUlEX1NSQ1U0MkUJCTB4MDQwOAorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX0lOVEVMX1JBSURfU1JDVTQyRQkJMHgwMDAyCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9SQUlEX1NSQ1pDUlgJCTB4MDQwNworI2RlZmluZSBQQ0lfU1VCU1lTX0lEX0lOVEVMX1JBSURfU1JDWkNSWAkJMHgwNTMwCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9SQUlEX1NSQ1MyOFgJCTB4MDQwOQorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX0lOVEVMX1JBSURfU1JDUzI4WAkJMHgzMDA4CisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9SQUlEX1NST01CVTQyRV9BTElFRgkweDA0MDgKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9JTlRFTF9SQUlEX1NST01CVTQyRV9BTElFRgkweDM0MzEKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1JBSURfU1JPTUJVNDJFX0hBUldJQ0gJMHgwNDA4CisjZGVmaW5lIFBDSV9TVUJTWVNfSURfSU5URUxfUkFJRF9TUk9NQlU0MkVfSEFSV0lDSAkweDM0OTkKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1JBSURfU1JDVTQxTF9MQUtFX1NIRVRFSwkweDE5NjAKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9JTlRFTF9SQUlEX1NSQ1U0MUxfTEFLRV9TSEVURUsJMHgwNTIwCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9GU0NfTUVHQVJBSURfUENJX0VYUFJFU1NfUk9NQgkweDA0MDgKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9GU0NfTUVHQVJBSURfUENJX0VYUFJFU1NfUk9NQgkweDEwNjUKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FR0FSQUlEX0FDRVJfUk9NQl8yRQkJMHgwNDA4CisjZGVmaW5lIFBDSV9TVUJTWVNfSURfTUVHQVJBSURfQUNFUl9ST01CXzJFCQkweDAwNEQKKworI2RlZmluZSBQQ0lfU1VCU1lTX0lEX1BFUkMzX1FDCQkJCTB4MDQ3MQorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX1BFUkMzX0RDCQkJCTB4MDQ5MworI2RlZmluZSBQQ0lfU1VCU1lTX0lEX1BFUkMzX1NDCQkJCTB4MDQ3NQorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVHQVJBSURfTkVDX1JPTUJfMkUJCTB4MDQwOAorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX05FQ19ST01CXzJFCQkweDgyODcKKworI2lmbmRlZiBQQ0lfU1VCU1lTX0lEX0ZTQworI2RlZmluZSBQQ0lfU1VCU1lTX0lEX0ZTQwkJCQkweDE3MzQKKyNlbmRpZgorCisjZGVmaW5lIE1CT1hfTUFYX1NDU0lfQ01EUwkxMjgJLy8gbnVtYmVyIG9mIGNtZHMgcmVzZXJ2ZWQgZm9yIGtlcm5lbAorI2RlZmluZSBNQk9YX01BWF9VU0VSX0NNRFMJMzIJLy8gbnVtYmVyIG9mIGNtZHMgZm9yIGFwcGxpY2F0aW9ucworI2RlZmluZSBNQk9YX0RFRl9DTURfUEVSX0xVTgk2NAkvLyBkZWZhdWx0IGNvbW1hbmRzIHBlciBsdW4KKyNkZWZpbmUgTUJPWF9ERUZBVUxUX1NHX1NJWkUJMjYJLy8gZGVmYXVsdCBzZyBzaXplIHN1cHBvcnRlZCBieSBhbGwgZncKKyNkZWZpbmUgTUJPWF9NQVhfU0dfU0laRQkzMgkvLyBtYXhpbXVtIHNjYXR0ZXItZ2F0aGVyIGxpc3Qgc2l6ZQorI2RlZmluZSBNQk9YX01BWF9TRUNUT1JTCTEyOAkvLyBtYXhpbXVtIHNlY3RvcnMgcGVyIElPCisjZGVmaW5lIE1CT1hfVElNRU9VVAkJMzAJLy8gdGltZW91dCB2YWx1ZSBmb3IgaW50ZXJuYWwgY21kcworI2RlZmluZSBNQk9YX0JVU1lfV0FJVAkJMTAJLy8gbWF4IHVzZWMgdG8gd2FpdCBmb3IgYnVzeSBtYWlsYm94CisjZGVmaW5lIE1CT1hfUkVTRVRfV0FJVAkJMTgwCS8vIHdhaXQgdGhlc2UgbWFueSBzZWNvbmRzIGluIHJlc2V0CisjZGVmaW5lIE1CT1hfUkVTRVRfRVhUX1dBSVQJMTIwCS8vIGV4dGVuZGVkIHdhaXQgcmVzZXQKKworLyoKKyAqIG1heGltdW0gdHJhbnNmZXIgdGhhdCBjYW4gaGFwcGVuIHRocm91Z2ggdGhlIGZpcm13YXJlIGNvbW1hbmRzIGlzc3VlZAorICogaW50ZXJubmFseSBmcm9tIHRoZSBkcml2ZXIuCisgKi8KKyNkZWZpbmUgTUJPWF9JQlVGX1NJWkUJCTQwOTYKKworCisvKioKKyAqIG1ib3hfY2NiX3QgLSBjb21tYW5kIGNvbnRyb2wgYmxvY2sgc3BlY2lmaWMgdG8gbWFpbGJveCBiYXNlZCBjb250cm9sbGVycworICogQHJhd19tYm94CQk6IHJhdyBtYWlsYm94IHBvaW50ZXIKKyAqIEBtYm94CQk6IG1haWxib3gKKyAqIEBtYm94NjQJCTogZXh0ZW5kZWQgbWFpbGJveAorICogQG1ib3hfZG1hX2gJCTogbWFpYm94IGRtYSBhZGRyZXNzCisgKiBAc2dsNjQJCTogNjQtYml0IHNjYXR0ZXItZ2F0aGVyIGxpc3QKKyAqIEBzZ2wzMgkJOiAzMi1iaXQgc2NhdHRlci1nYXRoZXIgbGlzdAorICogQHNnbF9kbWFfaAkJOiBkbWEgaGFuZGxlIGZvciB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdAorICogQHB0aHJ1CQk6IHBhc3N0aHJ1IHN0cnVjdHVyZQorICogQHB0aHJ1X2RtYV9oCQk6IGRtYSBoYW5kbGUgZm9yIHRoZSBwYXNzdGhydSBzdHJ1Y3R1cmUKKyAqIEBlcHRocnUJCTogZXh0ZW5kZWQgcGFzc3RocnUgc3RydWN0dXJlCisgKiBAZXB0aHJ1X2RtYV9oCTogZG1hIGhhbmRsZSBmb3IgZXh0ZW5kZWQgcGFzc3RocnUgc3RydWN0dXJlCisgKiBAYnVmX2RtYV9oCQk6IGRtYSBoYW5kbGUgZm9yIGJ1ZmZlcnMgdy9vIHNnIGxpc3QKKyAqCisgKiBjb21tYW5kIGNvbnRyb2wgYmxvY2sgc3BlY2lmaWMgdG8gdGhlIG1haWxib3ggYmFzZWQgY29udHJvbGxlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QJCQkqcmF3X21ib3g7CisJbWJveF90CQkJKm1ib3g7CisJbWJveDY0X3QJCSptYm94NjQ7CisJZG1hX2FkZHJfdAkJbWJveF9kbWFfaDsKKwltYm94X3NnbDY0CQkqc2dsNjQ7CisJbWJveF9zZ2wzMgkJKnNnbDMyOworCWRtYV9hZGRyX3QJCXNnbF9kbWFfaDsKKwltcmFpZF9wYXNzdGhydV90CSpwdGhydTsKKwlkbWFfYWRkcl90CQlwdGhydV9kbWFfaDsKKwltcmFpZF9lcGFzc3RocnVfdAkqZXB0aHJ1OworCWRtYV9hZGRyX3QJCWVwdGhydV9kbWFfaDsKKwlkbWFfYWRkcl90CQlidWZfZG1hX2g7Cit9IG1ib3hfY2NiX3Q7CisKKworLyoqCisgKiBtcmFpZF9kZXZpY2VfdCAtIGFkYXB0ZXIgc29mdCBzdGF0ZSBzdHJ1Y3R1cmUgZm9yIG1haWxib3ggY29udHJvbGxlcnMKKyAqIEBwYXJhbSB1bmFfbWJveDY0CQk6IDY0LWJpdCBtYm94IC0gdW5hbGlnbmVkCisgKiBAcGFyYW0gdW5hX21ib3g2NF9kbWEJOiBtYm94IGRtYSBhZGRyIC0gdW5hbGlnbmVkCisgKiBAcGFyYW0gbWJveAkJCTogMzItYml0IG1ib3ggLSBhbGlnbmVkCisgKiBAcGFyYW0gbWJveDY0CQk6IDY0LWJpdCBtYm94IC0gYWxpZ25lZAorICogQHBhcmFtIG1ib3hfZG1hCQk6IG1ib3ggZG1hIGFkZHIgLSBhbGlnbmVkCisgKiBAcGFyYW0gbWFpbGJveF9sb2NrCQk6IGV4Y2x1c2lvbiBsb2NrIGZvciB0aGUgbWFpbGJveAorICogQHBhcmFtIGJhc2Vwb3J0CQk6IGJhc2UgcG9ydCBvZiBoYmEgbWVtb3J5CisgKiBAcGFyYW0gYmFzZWFkZHIJCTogbWFwcGVkIGFkZHIgb2YgaGJhIG1lbW9yeQorICogQHBhcmFtIG1ib3hfcG9vbAkJOiBwb29sIG9mIG1haWxib3hlcworICogQHBhcmFtIG1ib3hfcG9vbF9oYW5kbGUJOiBoYW5kbGUgZm9yIHRoZSBtYWlsYm94IHBvb2wgbWVtb3J5CisgKiBAcGFyYW0gZXB0aHJ1X3Bvb2wJCTogYSBwb29sIGZvciBleHRlbmRlZCBwYXNzdGhydSBjb21tYW5kcworICogQHBhcmFtIGVwdGhydV9wb29sX2hhbmRsZQk6IGhhbmRsZSB0byB0aGUgcG9vbCBhYm92ZQorICogQHBhcmFtIHNnX3Bvb2wJCTogcG9vbCBvZiBzY2F0dGVyLWdhdGhlciBsaXN0cyBmb3IgdGhpcyBkcml2ZXIKKyAqIEBwYXJhbSBzZ19wb29sX2hhbmRsZQk6IGhhbmRsZSB0byB0aGUgcG9vbCBhYm92ZQorICogQHBhcmFtIGNjYl9saXN0CQk6IGxpc3Qgb2Ygb3VyIGNvbW1hbmQgY29udHJvbCBibG9ja3MKKyAqIEBwYXJhbSB1Y2NiX2xpc3QJCTogbGlzdCBvZiBjbWQgY29udHJvbCBibG9ja3MgZm9yIG1nbXQgbW9kdWxlCisgKiBAcGFyYW0gdW1ib3g2NAkJOiBhcnJheSBvZiBtYWlsYm94IGZvciB1c2VyIGNvbW1hbmRzIChjbW0pCisgKiBAcGFyYW0gcGRydl9zdGF0ZQkJOiBhcnJheSBmb3Igc3RhdGUgb2YgZWFjaCBwaHlzaWNhbCBkcml2ZS4KKyAqIEBwYXJhbSBsYXN0X2Rpc3AJCTogZmxhZyB1c2VkIHRvIHNob3cgZGV2aWNlIHNjYW5uaW5nCisgKiBAcGFyYW0gaHdfZXJyb3IJCTogc2V0IGlmIEZXIG5vdCByZXNwb25kaW5nCisgKiBAcGFyYW0gZmFzdF9sb2FkCQk6IElmIHNldCwgc2tpcCBwaHlzaWNhbCBkZXZpY2Ugc2Nhbm5pbmcKKyAqIEBjaGFubmVsX2NsYXNzCQk6IGNoYW5uZWwgY2xhc3MsIFJBSUQgb3IgU0NTSQorICogQHN5c2ZzX3NlbQkJCTogc2VtYXBob3JlIHRvIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gc3lzZnMgcmVzLgorICogQHN5c2ZzX3Vpb2MJCQk6IG1hbmFnZW1lbnQgcGFja2V0IHRvIGlzc3VlIEZXIGNhbGxzIGZyb20gc3lzZnMKKyAqIEBzeXNmc19tYm94NjQJCTogbWFpbGJveCBwYWNrZXQgdG8gaXNzdWUgRlcgY2FsbHMgZnJvbSBzeXNmcworICogQHN5c2ZzX2J1ZmZlcgkJOiBkYXRhIGJ1ZmZlciBmb3IgRlcgY29tbWFuZHMgaXNzdWVkIGZyb20gc3lzZnMKKyAqIEBzeXNmc19idWZmZXJfZG1hCQk6IERNQSBidWZmZXIgZm9yIEZXIGNvbW1hbmRzIGlzc3VlZCBmcm9tIHN5c2ZzCisgKiBAc3lzZnNfd2FpdF9xCQk6IHdhaXQgcXVldWUgZm9yIHN5c2ZzIG9wZXJhdGlvbnMKKyAqIEByYW5kb21fZGVsX3N1cHBvcnRlZAk6IHNldCBpZiB0aGUgcmFuZG9tIGRlbGV0aW9uIGlzIHN1cHBvcnRlZAorICogQGN1cnJfbGRtYXAJCQk6IGN1cnJlbnQgTERJRCBtYXAKKyAqCisgKiBJbml0aWFsaXphdGlvbiBzdHJ1Y3R1cmUgZm9yIG1haWxib3ggY29udHJvbGxlcnM6IG1lbW9yeSBiYXNlZCBhbmQgSU8gYmFzZWQKKyAqIEFsbCB0aGUgZmllbGRzIGluIHRoaXMgc3RydWN0dXJlIGFyZSBMTEQgc3BlY2lmaWMgYW5kIG1heSBiZSBkaXNjb3ZlcmVkIGF0CisgKiBpbml0KCkgb3Igc3RhcnQoKSB0aW1lLgorICoKKyAqIE5PVEU6IFRoZSBmaWVsZHMgb2YgdGhpcyBzdHJ1Y3R1cmVzIGFyZSBwbGFjZWQgdG8gbWluaW1pemUgY2FjaGUgbWlzc2VzCisgKi8KKyNkZWZpbmUgTUFYX0xEX0VYVEVOREVENjQJNjQKK3R5cGVkZWYgc3RydWN0IHsKKwltYm94NjRfdAkJCSp1bmFfbWJveDY0OworCWRtYV9hZGRyX3QJCQl1bmFfbWJveDY0X2RtYTsKKwltYm94X3QJCQkJKm1ib3g7CisJbWJveDY0X3QJCQkqbWJveDY0OworCWRtYV9hZGRyX3QJCQltYm94X2RtYTsKKwlzcGlubG9ja190CQkJbWFpbGJveF9sb2NrOworCXVuc2lnbmVkIGxvbmcJCQliYXNlcG9ydDsKKwl2b2lkIF9faW9tZW0gKgkJCWJhc2VhZGRyOworCXN0cnVjdCBtcmFpZF9wY2lfYmxrCQltYm94X3Bvb2xbTUJPWF9NQVhfU0NTSV9DTURTXTsKKwlzdHJ1Y3QgZG1hX3Bvb2wJCQkqbWJveF9wb29sX2hhbmRsZTsKKwlzdHJ1Y3QgbXJhaWRfcGNpX2JsawkJZXB0aHJ1X3Bvb2xbTUJPWF9NQVhfU0NTSV9DTURTXTsKKwlzdHJ1Y3QgZG1hX3Bvb2wJCQkqZXB0aHJ1X3Bvb2xfaGFuZGxlOworCXN0cnVjdCBtcmFpZF9wY2lfYmxrCQlzZ19wb29sW01CT1hfTUFYX1NDU0lfQ01EU107CisJc3RydWN0IGRtYV9wb29sCQkJKnNnX3Bvb2xfaGFuZGxlOworCW1ib3hfY2NiX3QJCQljY2JfbGlzdFtNQk9YX01BWF9TQ1NJX0NNRFNdOworCW1ib3hfY2NiX3QJCQl1Y2NiX2xpc3RbTUJPWF9NQVhfVVNFUl9DTURTXTsKKwltYm94NjRfdAkJCXVtYm94NjRbTUJPWF9NQVhfVVNFUl9DTURTXTsKKworCXVpbnQ4X3QJCQkJcGRydl9zdGF0ZVtNQk9YX01BWF9QSFlTSUNBTF9EUklWRVNdOworCXVpbnQzMl90CQkJbGFzdF9kaXNwOworCWludAkJCQlod19lcnJvcjsKKwlpbnQJCQkJZmFzdF9sb2FkOworCXVpbnQ4X3QJCQkJY2hhbm5lbF9jbGFzczsKKwlzdHJ1Y3Qgc2VtYXBob3JlCQlzeXNmc19zZW07CisJdWlvY190CQkJCSpzeXNmc191aW9jOworCW1ib3g2NF90CQkJKnN5c2ZzX21ib3g2NDsKKwljYWRkcl90CQkJCXN5c2ZzX2J1ZmZlcjsKKwlkbWFfYWRkcl90CQkJc3lzZnNfYnVmZmVyX2RtYTsKKwl3YWl0X3F1ZXVlX2hlYWRfdAkJc3lzZnNfd2FpdF9xOworCWludAkJCQlyYW5kb21fZGVsX3N1cHBvcnRlZDsKKwl1aW50MTZfdAkJCWN1cnJfbGRtYXBbTUFYX0xEX0VYVEVOREVENjRdOworfSBtcmFpZF9kZXZpY2VfdDsKKworLy8gcm91dGUgdG8gcmFpZCBkZXZpY2UgZnJvbSBhZGFwdGVyCisjZGVmaW5lIEFEQVAyUkFJRERFVihhZHApCSgobXJhaWRfZGV2aWNlX3QgKikoKGFkcCktPnJhaWRfZGV2aWNlKSkKKworI2RlZmluZSBNQUlMQk9YX0xPQ0socmRldikJKCYocmRldiktPm1haWxib3hfbG9jaykKKworLy8gRmluZCBvdXQgaWYgdGhpcyBjaGFubmVsIGlzIGEgUkFJRCBvciBTQ1NJCisjZGVmaW5lIElTX1JBSURfQ0gocmRldiwgY2gpCSgoKHJkZXYpLT5jaGFubmVsX2NsYXNzID4+IChjaCkpICYgMHgwMSkKKworCisjZGVmaW5lIFJESU5ET09SKHJkZXYpCQlyZWFkbCgocmRldiktPmJhc2VhZGRyICsgMHgyMCkKKyNkZWZpbmUgUkRPVVRET09SKHJkZXYpCQlyZWFkbCgocmRldiktPmJhc2VhZGRyICsgMHgyQykKKyNkZWZpbmUgV1JJTkRPT1IocmRldiwgdmFsdWUpCXdyaXRlbCh2YWx1ZSwgKHJkZXYpLT5iYXNlYWRkciArIDB4MjApCisjZGVmaW5lIFdST1VURE9PUihyZGV2LCB2YWx1ZSkJd3JpdGVsKHZhbHVlLCAocmRldiktPmJhc2VhZGRyICsgMHgyQykKKworI2VuZGlmIC8vIF9NRUdBUkFJRF9IXworCisvLyB2aW06IHNldCB0cz04IHN3PTggdHc9Nzg6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbW0uYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMWI1NTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbW0uYwpAQCAtMCwwICsxLDEyNTUgQEAKKy8qCisgKgorICoJCQlMaW51eCBNZWdhUkFJRCBkZXZpY2UgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgIExTSSBMb2dpYyBDb3Jwb3JhdGlvbi4KKyAqCisgKgkgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZJTEUJCTogbWVnYXJhaWRfbW0uYworICogVmVyc2lvbgk6IHYyLjIwLjIuNSAoSmFuIDIxIDIwMDUpCisgKgorICogQ29tbW9uIG1hbmFnZW1lbnQgbW9kdWxlCisgKi8KKworI2luY2x1ZGUgIm1lZ2FyYWlkX21tLmgiCisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworCisvLyBFbnRyeSBwb2ludHMgZm9yIGNoYXIgbm9kZSBkcml2ZXIKK3N0YXRpYyBpbnQgbXJhaWRfbW1fb3BlbihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgaW50IG1yYWlkX21tX2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1aW50LCB1bnNpZ25lZCBsb25nKTsKKworCisvLyByb3V0aW5lcyB0byBjb252ZXJ0IHRvIGFuZCBmcm9tIHRoZSBvbGQgdGhlIGZvcm1hdAorc3RhdGljIGludCBtaW1kX3RvX2tpb2MobWltZF90IF9fdXNlciAqLCBtcmFpZF9tbWFkcF90ICosIHVpb2NfdCAqKTsKK3N0YXRpYyBpbnQga2lvY190b19taW1kKHVpb2NfdCAqLCBtaW1kX3QgX191c2VyICopOworCisKKy8vIEhlbHBlciBmdW5jdGlvbnMKK3N0YXRpYyBpbnQgaGFuZGxlX2RydnJjbWQodm9pZCBfX3VzZXIgKiwgdWludDhfdCwgaW50ICopOworc3RhdGljIGludCBsbGRfaW9jdGwobXJhaWRfbW1hZHBfdCAqLCB1aW9jX3QgKik7CitzdGF0aWMgdm9pZCBpb2N0bF9kb25lKHVpb2NfdCAqKTsKK3N0YXRpYyB2b2lkIGxsZF90aW1lZG91dCh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIGhpbmZvX3RvX2NpbmZvKG1yYWlkX2hiYV9pbmZvX3QgKiwgbWNvbnRyb2xsZXJfdCAqKTsKK3N0YXRpYyBtcmFpZF9tbWFkcF90ICptcmFpZF9tbV9nZXRfYWRhcHRlcihtaW1kX3QgX191c2VyICosIGludCAqKTsKK3N0YXRpYyB1aW9jX3QgKm1yYWlkX21tX2FsbG9jX2tpb2MobXJhaWRfbW1hZHBfdCAqKTsKK3N0YXRpYyB2b2lkIG1yYWlkX21tX2RlYWxsb2Nfa2lvYyhtcmFpZF9tbWFkcF90ICosIHVpb2NfdCAqKTsKK3N0YXRpYyBpbnQgbXJhaWRfbW1fYXR0YWNoX2J1ZihtcmFpZF9tbWFkcF90ICosIHVpb2NfdCAqLCBpbnQpOworc3RhdGljIGludCBtcmFpZF9tbV9zZXR1cF9kbWFfcG9vbHMobXJhaWRfbW1hZHBfdCAqKTsKK3N0YXRpYyB2b2lkIG1yYWlkX21tX2ZyZWVfYWRwX3Jlc291cmNlcyhtcmFpZF9tbWFkcF90ICopOworc3RhdGljIHZvaWQgbXJhaWRfbW1fdGVhcmRvd25fZG1hX3Bvb2xzKG1yYWlkX21tYWRwX3QgKik7CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyBtcmFpZF9tbV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJMU0kgTG9naWMgQ29ycG9yYXRpb24iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTFNJIExvZ2ljIE1hbmFnZW1lbnQgTW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihMU0lfQ09NTU9OX01PRF9WRVJTSU9OKTsKKworc3RhdGljIGludCBkYmdsZXZlbCA9IENMX0FOTjsKK21vZHVsZV9wYXJhbV9uYW1lZChkbGV2ZWwsIGRiZ2xldmVsLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkbGV2ZWwsICJEZWJ1ZyBsZXZlbCAoZGVmYXVsdD0wKSIpOworCitFWFBPUlRfU1lNQk9MKG1yYWlkX21tX3JlZ2lzdGVyX2FkcCk7CitFWFBPUlRfU1lNQk9MKG1yYWlkX21tX3VucmVnaXN0ZXJfYWRwKTsKK0VYUE9SVF9TWU1CT0wobXJhaWRfbW1fYWRhcHRlcl9hcHBfaGFuZGxlKTsKKworc3RhdGljIGludCBtYWpvcm5vOworc3RhdGljIHVpbnQzMl90IGRydnJfdmVyCT0gMHgwMjIwMDIwMTsKKworc3RhdGljIGludCBhZGFwdGVyc19jb3VudF9nOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgYWRhcHRlcnNfbGlzdF9nOworCitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsc2lfZm9wcyA9IHsKKwkub3Blbgk9IG1yYWlkX21tX29wZW4sCisJLmlvY3RsCT0gbXJhaWRfbW1faW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwgPSBtcmFpZF9tbV9jb21wYXRfaW9jdGwsCisjZW5kaWYKKwkub3duZXIJPSBUSElTX01PRFVMRSwKK307CisKKy8qKgorICogbXJhaWRfbW1fb3BlbiAtIG9wZW4gcm91dGluZSBmb3IgY2hhciBub2RlIGludGVyZmFjZQorICogQGlub2QJOiB1bnVzZWQKKyAqIEBmaWxlcAk6IHVudXNlZAorICoKKyAqIGFsbG93IGlvY3RsIG9wZXJhdGlvbnMgYnkgYXBwcyBvbmx5IGlmIHRoZXkgc3VwZXJ1c2VyIHByaXZpbGVnZQorICovCitzdGF0aWMgaW50CittcmFpZF9tbV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlcCkKK3sKKwkvKgorCSAqIE9ubHkgYWxsb3cgc3VwZXJ1c2VyIHRvIGFjY2VzcyBwcml2YXRlIGlvY3RsIGludGVyZmFjZQorCSAqLworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgcmV0dXJuICgtRUFDQ0VTKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIG1yYWlkX21tX2lvY3RsIC0gbW9kdWxlIGVudHJ5LXBvaW50IGZvciBpb2N0bHMKKyAqIEBpbm9kZQk6IGlub2RlIChpZ25vcmVkKQorICogQGZpbGVwCTogZmlsZSBvcGVyYXRpb25zIHBvaW50ZXIgKGlnbm9yZWQpCisgKiBAY21kCQk6IGlvY3RsIGNvbW1hbmQKKyAqIEBhcmcJCTogdXNlciBpb2N0bCBwYWNrZXQKKyAqLworc3RhdGljIGludAorbXJhaWRfbW1faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVpb2NfdAkJKmtpb2M7CisJY2hhcgkJc2lnbmF0dXJlW0VYVF9JT0NUTF9TSUdOX1NaXQk9IHswfTsKKwlpbnQJCXJ2YWw7CisJbXJhaWRfbW1hZHBfdAkqYWRwOworCXVpbnQ4X3QJCW9sZF9pb2N0bDsKKwlpbnQJCWRydnJjbWRfcnZhbDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCS8qCisJICogTWFrZSBzdXJlIG9ubHkgVVNDU0lDTUQgYXJlIGlzc3VlZCB0aHJvdWdoIHRoaXMgaW50ZXJmYWNlLgorCSAqIE1JTUQgYXBwbGljYXRpb24gd291bGQgc3RpbGwgZmlyZSBkaWZmZXJlbnQgY29tbWFuZC4KKwkgKi8KKworCWlmICgoX0lPQ19UWVBFKGNtZCkgIT0gTUVHQUlPQ19NQUdJQykgJiYgKGNtZCAhPSBVU0NTSUNNRCkpIHsKKwkJcmV0dXJuICgtRUlOVkFMKTsKKwl9CisKKwkvKgorCSAqIExvb2sgZm9yIHNpZ25hdHVyZSB0byBzZWUgaWYgdGhpcyBpcyB0aGUgbmV3IG9yIG9sZCBpb2N0bCBmb3JtYXQuCisJICovCisJaWYgKGNvcHlfZnJvbV91c2VyKHNpZ25hdHVyZSwgYXJncCwgRVhUX0lPQ1RMX1NJR05fU1opKSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQgY21tOiBjb3B5IGZyb20gdXNyIGFkZHIgZmFpbGVkXG4iKSk7CisJCXJldHVybiAoLUVGQVVMVCk7CisJfQorCisJaWYgKG1lbWNtcChzaWduYXR1cmUsIEVYVF9JT0NUTF9TSUdOLCBFWFRfSU9DVExfU0lHTl9TWikgPT0gMCkKKwkJb2xkX2lvY3RsID0gMDsKKwllbHNlCisJCW9sZF9pb2N0bCA9IDE7CisKKwkvKgorCSAqIEF0IHByZXNlbnQsIHdlIGRvbid0IHN1cHBvcnQgdGhlIG5ldyBpb2N0bCBwYWNrZXQKKwkgKi8KKwlpZiAoIW9sZF9pb2N0bCApCisJCXJldHVybiAoLUVJTlZBTCk7CisKKwkvKgorCSAqIElmIGl0IGlzIGEgZHJpdmVyIGlvY3RsIChhcyBvcHBvc2VkIHRvIGZ3IGlvY3RscyksIHRoZW4gd2UgY2FuCisJICogaGFuZGxlIHRoZSBjb21tYW5kIGxvY2FsbHkuIHJ2YWwgPiAwIG1lYW5zIGl0IGlzIG5vdCBhIGRydnIgY21kCisJICovCisJcnZhbCA9IGhhbmRsZV9kcnZyY21kKGFyZ3AsIG9sZF9pb2N0bCwgJmRydnJjbWRfcnZhbCk7CisKKwlpZiAocnZhbCA8IDApCisJCXJldHVybiBydmFsOworCWVsc2UgaWYgKHJ2YWwgPT0gMCkKKwkJcmV0dXJuIGRydnJjbWRfcnZhbDsKKworCXJ2YWwgPSAwOworCWlmICgoYWRwID0gbXJhaWRfbW1fZ2V0X2FkYXB0ZXIoYXJncCwgJnJ2YWwpKSA9PSBOVUxMKSB7CisJCXJldHVybiBydmFsOworCX0KKworCS8qCisJICogQ2hlY2sgaWYgYWRhcHRlciBjYW4gYWNjZXB0IGlvY3RsLiBXZSBtYXkgaGF2ZSBtYXJrZWQgaXQgb2ZmbGluZQorCSAqIGlmIGFueSBwcmV2aW91cyBraW9jIGhhZCB0aW1lZG91dCBvbiB0aGlzIGNvbnRyb2xsZXIuCisJICovCisJaWYgKCFhZHAtPnF1aWVzY2VudCkgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkIGNtbTogY29udHJvbGxlciBjYW5ub3QgYWNjZXB0IGNtZHMgZHVlIHRvICIKKwkJCSJlYXJsaWVyIGVycm9yc1xuIiApKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGNhbGwgd2lsbCBibG9jayB0aWxsIGEga2lvYyBpcyBhdmFpbGFibGUKKwkgKi8KKwlraW9jID0gbXJhaWRfbW1fYWxsb2Nfa2lvYyhhZHApOworCisJLyoKKwkgKiBVc2VyIHNlbnQgdGhlIG9sZCBtaW1kX3QgaW9jdGwgcGFja2V0LiBDb252ZXJ0IGl0IHRvIHVpb2NfdC4KKwkgKi8KKwlpZiAoKHJ2YWwgPSBtaW1kX3RvX2tpb2MoYXJncCwgYWRwLCBraW9jKSkpIHsKKwkJbXJhaWRfbW1fZGVhbGxvY19raW9jKGFkcCwga2lvYyk7CisJCXJldHVybiBydmFsOworCX0KKworCWtpb2MtPmRvbmUgPSBpb2N0bF9kb25lOworCisJLyoKKwkgKiBJc3N1ZSB0aGUgSU9DVEwgdG8gdGhlIGxvdyBsZXZlbCBkcml2ZXIuIEFmdGVyIHRoZSBJT0NUTCBjb21wbGV0ZXMKKwkgKiByZWxlYXNlIHRoZSBraW9jIGlmIGFuZCBvbmx5IGlmIGl0IHdhcyBfbm90XyB0aW1lZG91dC4gSWYgaXQgd2FzCisJICogdGltZWRvdXQsIHRoYXQgbWVhbnMgdGhhdCByZXNvdXJjZXMgYXJlIHN0aWxsIHdpdGggbG93IGxldmVsIGRyaXZlci4KKwkgKi8KKwlpZiAoKHJ2YWwgPSBsbGRfaW9jdGwoYWRwLCBraW9jKSkpIHsKKworCQlpZiAoIWtpb2MtPnRpbWVkb3V0KQorCQkJbXJhaWRfbW1fZGVhbGxvY19raW9jKGFkcCwga2lvYyk7CisKKwkJcmV0dXJuIHJ2YWw7CisJfQorCisJLyoKKwkgKiBDb252ZXJ0IHRoZSBraW9jIGJhY2sgdG8gdXNlciBzcGFjZQorCSAqLworCXJ2YWwgPSBraW9jX3RvX21pbWQoa2lvYywgYXJncCk7CisKKwkvKgorCSAqIFJldHVybiB0aGUga2lvYyB0byBmcmVlIHBvb2wKKwkgKi8KKwltcmFpZF9tbV9kZWFsbG9jX2tpb2MoYWRwLCBraW9jKTsKKworCXJldHVybiBydmFsOworfQorCisKKy8qKgorICogbXJhaWRfbW1fZ2V0X2FkYXB0ZXIgLSBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgYWRhcHRlcnMgZm9yIHRoZSBtaW1kIHBhY2tldAorICogQHVtaW1kCTogVXNlciBzcGFjZSBtaW1kX3QgaW9jdGwgcGFja2V0CisgKiBAYWRhcHRlcgk6IHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgKE9VVCkKKyAqLworc3RhdGljIG1yYWlkX21tYWRwX3QgKgorbXJhaWRfbW1fZ2V0X2FkYXB0ZXIobWltZF90IF9fdXNlciAqdW1pbWQsIGludCAqcnZhbCkKK3sKKwltcmFpZF9tbWFkcF90CSphZGFwdGVyOworCW1pbWRfdAkJbWltZDsKKwl1aW50MzJfdAlhZGFwbm87CisJaW50CQlpdGVyYXRvcjsKKworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZtaW1kLCB1bWltZCwgc2l6ZW9mKG1pbWRfdCkpKSB7CisJCSpydmFsID0gLUVGQVVMVDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYWRhcG5vID0gR0VUQURBUChtaW1kLnVpLmZjcy5hZGFwbm8pOworCisJaWYgKGFkYXBubyA+PSBhZGFwdGVyc19jb3VudF9nKSB7CisJCSpydmFsID0gLUVOT0RFVjsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYWRhcHRlciA9IE5VTEw7CisJaXRlcmF0b3IgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhZGFwdGVyLCAmYWRhcHRlcnNfbGlzdF9nLCBsaXN0KSB7CisJCWlmIChpdGVyYXRvcisrID09IGFkYXBubykgYnJlYWs7CisJfQorCisJaWYgKCFhZGFwdGVyKSB7CisJCSpydmFsID0gLUVOT0RFVjsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGFkYXB0ZXI7Cit9CisKKy8qCisgKiBoYW5kbGVfZHJ2cmNtZCAtIFRoaXMgcm91dGluZSBjaGVja3MgaWYgdGhlIG9wY29kZSBpcyBhIGRyaXZlcgorICogCQkJICBjbWQgYW5kIGlmIGl0IGlzLCBoYW5kbGVzIGl0LgorICogQGFyZwkJOiBwYWNrZXQgc2VudCBieSB0aGUgdXNlciBhcHAKKyAqIEBvbGRfaW9jdGwJOiBtaW1kIGlmIDE7IHVpb2Mgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQKK2hhbmRsZV9kcnZyY21kKHZvaWQgX191c2VyICphcmcsIHVpbnQ4X3Qgb2xkX2lvY3RsLCBpbnQgKnJ2YWwpCit7CisJbWltZF90CQlfX3VzZXIgKnVtaW1kOworCW1pbWRfdAkJa21pbWQ7CisJdWludDhfdAkJb3Bjb2RlOworCXVpbnQ4X3QJCXN1Ym9wY29kZTsKKworCWlmIChvbGRfaW9jdGwpCisJCWdvdG8gb2xkX3BhY2tldDsKKwllbHNlCisJCWdvdG8gbmV3X3BhY2tldDsKKworbmV3X3BhY2tldDoKKwlyZXR1cm4gKC1FTk9UU1VQUCk7CisKK29sZF9wYWNrZXQ6CisJKnJ2YWwgPSAwOworCXVtaW1kID0gYXJnOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZrbWltZCwgdW1pbWQsIHNpemVvZihtaW1kX3QpKSkKKwkJcmV0dXJuICgtRUZBVUxUKTsKKworCW9wY29kZQkJPSBrbWltZC51aS5mY3Mub3Bjb2RlOworCXN1Ym9wY29kZQk9IGttaW1kLnVpLmZjcy5zdWJvcGNvZGU7CisKKwkvKgorCSAqIElmIHRoZSBvcGNvZGUgaXMgMHg4MiBhbmQgdGhlIHN1Ym9wY29kZSBpcyBlaXRoZXIgR0VUX0RSVlJWRVIgb3IKKwkgKiBHRVRfTlVNQURQLCB0aGVuIHdlIGNhbiBoYW5kbGUuIE90aGVyd2lzZSB3ZSBzaG91bGQgcmV0dXJuIDEgdG8KKwkgKiBpbmRpY2F0ZSB0aGF0IHdlIGNhbm5vdCBoYW5kbGUgdGhpcy4KKwkgKi8KKwlpZiAob3Bjb2RlICE9IDB4ODIpCisJCXJldHVybiAxOworCisJc3dpdGNoIChzdWJvcGNvZGUpIHsKKworCWNhc2UgTUVHQUlPQ19RRFJWUlZFUjoKKworCQlpZiAoY29weV90b191c2VyKGttaW1kLmRhdGEsICZkcnZyX3Zlciwgc2l6ZW9mKHVpbnQzMl90KSkpCisJCQlyZXR1cm4gKC1FRkFVTFQpOworCisJCXJldHVybiAwOworCisJY2FzZSBNRUdBSU9DX1FOQURBUDoKKworCQkqcnZhbCA9IGFkYXB0ZXJzX2NvdW50X2c7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihrbWltZC5kYXRhLCAmYWRhcHRlcnNfY291bnRfZywKKwkJCQlzaXplb2YodWludDMyX3QpKSkKKwkJCXJldHVybiAoLUVGQVVMVCk7CisKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQkvKiBjYW5ub3QgaGFuZGxlICovCisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qKgorICogbWltZF90b19raW9jCS0gQ29udmVydGVyIGZyb20gb2xkIHRvIG5ldyBpb2N0bCBmb3JtYXQKKyAqCisgKiBAdW1pbWQJOiB1c2VyIHNwYWNlIG9sZCBNSU1EIElPQ1RMCisgKiBAa2lvYwk6IGtlcm5lbCBzcGFjZSBuZXcgZm9ybWF0IElPQ1RMCisgKgorICogUm91dGluZSB0byBjb252ZXJ0IE1JTUQgaW50ZXJmYWNlIElPQ1RMIHRvIG5ldyBpbnRlcmZhY2UgSU9DVEwgcGFja2V0LiBUaGUKKyAqIG5ldyBwYWNrZXQgaXMgaW4ga2VybmVsIHNwYWNlIHNvIHRoYXQgZHJpdmVyIGNhbiBwZXJmb3JtIG9wZXJhdGlvbnMgb24gaXQKKyAqIGZyZWVseS4KKyAqLworCitzdGF0aWMgaW50CittaW1kX3RvX2tpb2MobWltZF90IF9fdXNlciAqdW1pbWQsIG1yYWlkX21tYWRwX3QgKmFkcCwgdWlvY190ICpraW9jKQoreworCW1ib3g2NF90CQkqbWJveDY0OworCW1ib3hfdAkJCSptYm94OworCW1yYWlkX3Bhc3N0aHJ1X3QJKnB0aHJ1MzI7CisJdWludDMyX3QJCWFkYXBubzsKKwl1aW50OF90CQkJb3Bjb2RlOworCXVpbnQ4X3QJCQlzdWJvcGNvZGU7CisJbWltZF90CQkJbWltZDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbWltZCwgdW1pbWQsIHNpemVvZihtaW1kX3QpKSkKKwkJcmV0dXJuICgtRUZBVUxUKTsKKworCS8qCisJICogQXBwbGljYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzZW5kIGV4dGQgcHRocnUKKwkgKi8KKwlpZiAoKG1pbWQubWJveFswXSA9PSBNQk9YQ01EX1BBU1NUSFJVNjQpIHx8CisJCQkobWltZC5tYm94WzBdID09IE1CT1hDTURfRVhUUFRIUlUpKQorCQlyZXR1cm4gKC1FSU5WQUwpOworCisJb3Bjb2RlCQk9IG1pbWQudWkuZmNzLm9wY29kZTsKKwlzdWJvcGNvZGUJPSBtaW1kLnVpLmZjcy5zdWJvcGNvZGU7CisJYWRhcG5vCQk9IEdFVEFEQVAobWltZC51aS5mY3MuYWRhcG5vKTsKKworCWlmIChhZGFwbm8gPj0gYWRhcHRlcnNfY291bnRfZykKKwkJcmV0dXJuICgtRU5PREVWKTsKKworCWtpb2MtPmFkYXBubwk9IGFkYXBubzsKKwlraW9jLT5tYl90eXBlCT0gTUJPWF9MRUdBQ1k7CisJa2lvYy0+YXBwX3R5cGUJPSBBUFBUWVBFX01JTUQ7CisKKwlzd2l0Y2ggKG9wY29kZSkgeworCisJY2FzZSAweDgyOgorCisJCWlmIChzdWJvcGNvZGUgPT0gTUVHQUlPQ19RQURBUElORk8pIHsKKworCQkJa2lvYy0+b3Bjb2RlCT0gR0VUX0FEQVBfSU5GTzsKKwkJCWtpb2MtPmRhdGFfZGlyCT0gVUlPQ19SRDsKKwkJCWtpb2MtPnhmZXJsZW4JPSBzaXplb2YobXJhaWRfaGJhX2luZm9fdCk7CisKKwkJCWlmIChtcmFpZF9tbV9hdHRhY2hfYnVmKGFkcCwga2lvYywga2lvYy0+eGZlcmxlbikpCisJCQkJcmV0dXJuICgtRU5PTUVNKTsKKwkJfQorCQllbHNlIHsKKwkJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkJCSJtZWdhcmFpZCBjbW06IEludmFsaWQgc3Vib3BcbiIpKTsKKwkJCXJldHVybiAoLUVJTlZBTCk7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgMHg4MToKKworCQlraW9jLT5vcGNvZGUJCT0gTUJPWF9DTUQ7CisJCWtpb2MtPnhmZXJsZW4JCT0gbWltZC51aS5mY3MubGVuZ3RoOworCQlraW9jLT51c2VyX2RhdGFfbGVuCT0ga2lvYy0+eGZlcmxlbjsKKwkJa2lvYy0+dXNlcl9kYXRhCQk9IG1pbWQudWkuZmNzLmJ1ZmZlcjsKKworCQlpZiAobXJhaWRfbW1fYXR0YWNoX2J1ZihhZHAsIGtpb2MsIGtpb2MtPnhmZXJsZW4pKQorCQkJcmV0dXJuICgtRU5PTUVNKTsKKworCQlpZiAobWltZC5vdXRsZW4pIGtpb2MtPmRhdGFfZGlyICA9IFVJT0NfUkQ7CisJCWlmIChtaW1kLmlubGVuKSBraW9jLT5kYXRhX2RpciB8PSBVSU9DX1dSOworCisJCWJyZWFrOworCisJY2FzZSAweDgwOgorCisJCWtpb2MtPm9wY29kZQkJPSBNQk9YX0NNRDsKKwkJa2lvYy0+eGZlcmxlbgkJPSAobWltZC5vdXRsZW4gPiBtaW1kLmlubGVuKSA/CisJCQkJCQltaW1kLm91dGxlbiA6IG1pbWQuaW5sZW47CisJCWtpb2MtPnVzZXJfZGF0YV9sZW4JPSBraW9jLT54ZmVybGVuOworCQlraW9jLT51c2VyX2RhdGEJCT0gbWltZC5kYXRhOworCisJCWlmIChtcmFpZF9tbV9hdHRhY2hfYnVmKGFkcCwga2lvYywga2lvYy0+eGZlcmxlbikpCisJCQlyZXR1cm4gKC1FTk9NRU0pOworCisJCWlmIChtaW1kLm91dGxlbikga2lvYy0+ZGF0YV9kaXIgID0gVUlPQ19SRDsKKwkJaWYgKG1pbWQuaW5sZW4pIGtpb2MtPmRhdGFfZGlyIHw9IFVJT0NfV1I7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKC1FSU5WQUwpOworCX0KKworCS8qCisJICogSWYgZHJpdmVyIGNvbW1hbmQsIG5vdGhpbmcgZWxzZSB0byBkbworCSAqLworCWlmIChvcGNvZGUgPT0gMHg4MikKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFRoaXMgaXMgYSBtYWlsYm94IGNtZDsgY29weSB0aGUgbWFpbGJveCBmcm9tIG1pbWQKKwkgKi8KKwltYm94NjQJPSAobWJveDY0X3QgKikoKHVuc2lnbmVkIGxvbmcpa2lvYy0+Y21kYnVmKTsKKwltYm94CT0gJm1ib3g2NC0+bWJveDMyOworCW1lbWNweShtYm94LCBtaW1kLm1ib3gsIDE0KTsKKworCWlmIChtYm94LT5jbWQgIT0gTUJPWENNRF9QQVNTVEhSVSkgewkvLyByZWd1bGFyIERDTUQKKworCQltYm94LT54ZmVyYWRkcgk9ICh1aW50MzJfdClraW9jLT5idWZfcGFkZHI7CisKKwkJaWYgKGtpb2MtPmRhdGFfZGlyICYgVUlPQ19XUikgeworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGtpb2MtPmJ1Zl92YWRkciwga2lvYy0+dXNlcl9kYXRhLAorCQkJCQkJCWtpb2MtPnhmZXJsZW4pKSB7CisJCQkJcmV0dXJuICgtRUZBVUxUKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiAwOworCX0KKworCS8qCisJICogVGhpcyBpcyBhIHJlZ3VsYXIgMzItYml0IHB0aHJ1IGNtZDsgbWJveCBwb2ludHMgdG8gcHRocnUgc3RydWN0LgorCSAqIEp1c3QgbGlrZSBpbiBhYm92ZSBjYXNlLCB0aGUgYmVnaW5uaW5nIGZvciBtZW1ibGsgaXMgdHJlYXRlZCBhcworCSAqIGEgbWFpbGJveC4gVGhlIHBhc3N0aHJ1IHdpbGwgYmVnaW4gYXQgbmV4dCAxSyBib3VuZGFyeS4gQW5kIHRoZQorCSAqIGRhdGEgd2lsbCBzdGFydCAxSyBhZnRlciB0aGF0LgorCSAqLworCXB0aHJ1MzIJCQk9IGtpb2MtPnB0aHJ1MzI7CisJa2lvYy0+dXNlcl9wdGhydQk9ICZ1bWltZC0+cHRocnU7CisJbWJveC0+eGZlcmFkZHIJCT0gKHVpbnQzMl90KWtpb2MtPnB0aHJ1MzJfaDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihwdGhydTMyLCBraW9jLT51c2VyX3B0aHJ1LAorCQkJc2l6ZW9mKG1yYWlkX3Bhc3N0aHJ1X3QpKSkgeworCQlyZXR1cm4gKC1FRkFVTFQpOworCX0KKworCXB0aHJ1MzItPmRhdGF4ZmVyYWRkcgk9IGtpb2MtPmJ1Zl9wYWRkcjsKKwlpZiAoa2lvYy0+ZGF0YV9kaXIgJiBVSU9DX1dSKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcihraW9jLT5idWZfdmFkZHIsIGtpb2MtPnVzZXJfZGF0YSwKKwkJCQkJCXB0aHJ1MzItPmRhdGF4ZmVybGVuKSkgeworCQkJcmV0dXJuICgtRUZBVUxUKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIG1yYWlkX21tX2F0dGNoX2J1ZiAtIEF0dGFjaCBhIGZyZWUgZG1hIGJ1ZmZlciBmb3IgcmVxdWlyZWQgc2l6ZQorICoKKyAqIEBhZHAJCTogQWRhcHRlciBzb2Z0c3RhdGUKKyAqIEBraW9jCToga2lvYyB0aGF0IHRoZSBidWZmZXIgbmVlZHMgdG8gYmUgYXR0YWNoZWQgdG8KKyAqIEB4ZmVybGVuCTogcmVxdWlyZWQgbGVuZ3RoIGZvciBidWZmZXIKKyAqCisgKiBGaXJzdCB3ZSBzZWFyY2ggZm9yIGEgcG9vbCB3aXRoIHNtYWxsZXN0IGJ1ZmZlciB0aGF0IGlzID49IEB4ZmVybGVuLiBJZgorICogdGhhdCBwb29sIGhhcyBubyBmcmVlIGJ1ZmZlciwgd2Ugd2lsbCB0cnkgZm9yIHRoZSBuZXh0IGJpZ2dlciBzaXplLiBJZiBub25lCisgKiBpcyBhdmFpbGFibGUsIHdlIHdpbGwgdHJ5IHRvIGFsbG9jYXRlIHRoZSBzbWFsbGVzdCBidWZmZXIgdGhhdCBpcyA+PQorICogQHhmZXJsZW4gYW5kIGF0dGFjaCBpdCB0aGUgcG9vbC4KKyAqLworc3RhdGljIGludAorbXJhaWRfbW1fYXR0YWNoX2J1ZihtcmFpZF9tbWFkcF90ICphZHAsIHVpb2NfdCAqa2lvYywgaW50IHhmZXJsZW4pCit7CisJbW1fZG1hcG9vbF90CSpwb29sOworCWludAkJcmlnaHRfcG9vbCA9IC0xOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJaW50CQlpOworCisJa2lvYy0+cG9vbF9pbmRleAk9IC0xOworCWtpb2MtPmJ1Zl92YWRkcgkJPSBOVUxMOworCWtpb2MtPmJ1Zl9wYWRkcgkJPSAwOworCWtpb2MtPmZyZWVfYnVmCQk9IDA7CisKKwkvKgorCSAqIFdlIG5lZWQgeGZlcmxlbiBhbW91bnQgb2YgbWVtb3J5LiBTZWUgaWYgd2UgY2FuIGdldCBpdCBmcm9tIG91cgorCSAqIGRtYSBwb29scy4gSWYgd2UgZG9uJ3QgZ2V0IGV4YWN0IHNpemUsIHdlIHdpbGwgdHJ5IGJpZ2dlciBidWZmZXIKKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBNQVhfRE1BX1BPT0xTOyBpKyspIHsKKworCQlwb29sID0gJmFkcC0+ZG1hX3Bvb2xfbGlzdFtpXTsKKworCQlpZiAoeGZlcmxlbiA+IHBvb2wtPmJ1Zl9zaXplKQorCQkJY29udGludWU7CisKKwkJaWYgKHJpZ2h0X3Bvb2wgPT0gLTEpCisJCQlyaWdodF9wb29sID0gaTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCisJCWlmICghcG9vbC0+aW5fdXNlKSB7CisKKwkJCXBvb2wtPmluX3VzZQkJPSAxOworCQkJa2lvYy0+cG9vbF9pbmRleAk9IGk7CisJCQlraW9jLT5idWZfdmFkZHIJCT0gcG9vbC0+dmFkZHI7CisJCQlraW9jLT5idWZfcGFkZHIJCT0gcG9vbC0+cGFkZHI7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAwOworCQl9CisJCWVsc2UgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCQkJY29udGludWU7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHhmZXJsZW4gZG9lc24ndCBtYXRjaCBhbnkgb2Ygb3VyIHBvb2xzLCByZXR1cm4gZXJyb3IKKwkgKi8KKwlpZiAocmlnaHRfcG9vbCA9PSAtMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIFdlIGRpZCBub3QgZ2V0IGFueSBidWZmZXIgZnJvbSB0aGUgcHJlYWxsb2NhdGVkIHBvb2wuIExldCB1cyB0cnkKKwkgKiB0byBhbGxvY2F0ZSBvbmUgbmV3IGJ1ZmZlci4gTk9URTogVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuCisJICovCisJcG9vbCA9ICZhZHAtPmRtYV9wb29sX2xpc3RbcmlnaHRfcG9vbF07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCisJa2lvYy0+cG9vbF9pbmRleAk9IHJpZ2h0X3Bvb2w7CisJa2lvYy0+ZnJlZV9idWYJCT0gMTsKKwlraW9jLT5idWZfdmFkZHIgCT0gcGNpX3Bvb2xfYWxsb2MocG9vbC0+aGFuZGxlLCBHRlBfS0VSTkVMLAorCQkJCQkJCSZraW9jLT5idWZfcGFkZHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKworCWlmICgha2lvYy0+YnVmX3ZhZGRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIG1yYWlkX21tX2FsbG9jX2tpb2MgLSBSZXR1cm5zIGEgdWlvY190IGZyb20gZnJlZSBsaXN0CisgKiBAYWRwCTogQWRhcHRlciBzb2Z0c3RhdGUgZm9yIHRoaXMgbW9kdWxlCisgKgorICogVGhlIGtpb2Nfc2VtYXBob3JlIGlzIGluaXRpYWxpemVkIHdpdGggbnVtYmVyIG9mIGtpb2Mgbm9kZXMgaW4gdGhlCisgKiBmcmVlIGtpb2MgcG9vbC4gSWYgdGhlIGtpb2MgcG9vbCBpcyBlbXB0eSwgdGhpcyBmdW5jdGlvbiBibG9ja3MgdGlsbAorICogYSBraW9jIGJlY29tZXMgZnJlZS4KKyAqLworc3RhdGljIHVpb2NfdCAqCittcmFpZF9tbV9hbGxvY19raW9jKG1yYWlkX21tYWRwX3QgKmFkcCkKK3sKKwl1aW9jX3QJCQkqa2lvYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkKgloZWFkOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJZG93bigmYWRwLT5raW9jX3NlbWFwaG9yZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRwLT5raW9jX3Bvb2xfbG9jaywgZmxhZ3MpOworCisJaGVhZCA9ICZhZHAtPmtpb2NfcG9vbDsKKworCWlmIChsaXN0X2VtcHR5KGhlYWQpKSB7CisJCXVwKCZhZHAtPmtpb2Nfc2VtYXBob3JlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRwLT5raW9jX3Bvb2xfbG9jaywgZmxhZ3MpOworCisJCWNvbl9sb2coQ0xfQU5OLCAoIm1lZ2FyYWlkIGNtbToga2lvYyBsaXN0IGVtcHR5IVxuIikpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlraW9jID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LCB1aW9jX3QsIGxpc3QpOworCWxpc3RfZGVsX2luaXQoJmtpb2MtPmxpc3QpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRwLT5raW9jX3Bvb2xfbG9jaywgZmxhZ3MpOworCisJbWVtc2V0KChjYWRkcl90KSh1bnNpZ25lZCBsb25nKWtpb2MtPmNtZGJ1ZiwgMCwgc2l6ZW9mKG1ib3g2NF90KSk7CisJbWVtc2V0KChjYWRkcl90KSBraW9jLT5wdGhydTMyLCAwLCBzaXplb2YobXJhaWRfcGFzc3RocnVfdCkpOworCisJa2lvYy0+YnVmX3ZhZGRyCQk9IE5VTEw7CisJa2lvYy0+YnVmX3BhZGRyCQk9IDA7CisJa2lvYy0+cG9vbF9pbmRleAk9LTE7CisJa2lvYy0+ZnJlZV9idWYJCT0gMDsKKwlraW9jLT51c2VyX2RhdGEJCT0gTlVMTDsKKwlraW9jLT51c2VyX2RhdGFfbGVuCT0gMDsKKwlraW9jLT51c2VyX3B0aHJ1CT0gTlVMTDsKKwlraW9jLT50aW1lZG91dAkJPSAwOworCisJcmV0dXJuIGtpb2M7Cit9CisKKy8qKgorICogbXJhaWRfbW1fZGVhbGxvY19raW9jIC0gUmV0dXJuIGtpb2MgdG8gZnJlZSBwb29sCisgKgorICogQGFkcAkJOiBBZGFwdGVyIHNvZnRzdGF0ZQorICogQGtpb2MJOiB1aW9jX3Qgbm9kZSB0byBiZSByZXR1cm5lZCB0byBmcmVlIHBvb2wKKyAqLworc3RhdGljIHZvaWQKK21yYWlkX21tX2RlYWxsb2Nfa2lvYyhtcmFpZF9tbWFkcF90ICphZHAsIHVpb2NfdCAqa2lvYykKK3sKKwltbV9kbWFwb29sX3QJKnBvb2w7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWlmIChraW9jLT5wb29sX2luZGV4ICE9IC0xKSB7CisJCXBvb2wgPSAmYWRwLT5kbWFfcG9vbF9saXN0W2tpb2MtPnBvb2xfaW5kZXhdOworCisJCS8qIFRoaXMgcm91dGluZSBtYXkgYmUgY2FsbGVkIGluIG5vbi1pc3IgY29udGV4dCBhbHNvICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CisKKwkJLyoKKwkJICogV2hpbGUgYXR0YWNoaW5nIHRoZSBkbWEgYnVmZmVyLCBpZiB3ZSBkaWRuJ3QgZ2V0IHRoZSAKKwkJICogcmVxdWlyZWQgYnVmZmVyIGZyb20gdGhlIHBvb2wsIHdlIHdvdWxkIGhhdmUgYWxsb2NhdGVkIAorCQkgKiBpdCBhdCB0aGUgcnVuIHRpbWUgYW5kIHNldCB0aGUgZnJlZV9idWYgZmxhZy4gV2UgbXVzdCAKKwkJICogZnJlZSB0aGF0IGJ1ZmZlci4gT3RoZXJ3aXNlLCBqdXN0IG1hcmsgdGhhdCB0aGUgYnVmZmVyIGlzIAorCQkgKiBub3QgaW4gdXNlCisJCSAqLworCQlpZiAoa2lvYy0+ZnJlZV9idWYgPT0gMSkKKwkJCXBjaV9wb29sX2ZyZWUocG9vbC0+aGFuZGxlLCBraW9jLT5idWZfdmFkZHIsIAorCQkJCQkJCWtpb2MtPmJ1Zl9wYWRkcik7CisJCWVsc2UKKwkJCXBvb2wtPmluX3VzZSA9IDA7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCX0KKworCS8qIFJldHVybiB0aGUga2lvYyB0byB0aGUgZnJlZSBwb29sICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkcC0+a2lvY19wb29sX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgma2lvYy0+bGlzdCwgJmFkcC0+a2lvY19wb29sKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZHAtPmtpb2NfcG9vbF9sb2NrLCBmbGFncyk7CisKKwkvKiBpbmNyZW1lbnQgdGhlIGZyZWUga2lvYyBjb3VudCAqLworCXVwKCZhZHAtPmtpb2Nfc2VtYXBob3JlKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBsbGRfaW9jdGwgLSBSb3V0aW5lIHRvIGlzc3VlIGlvY3RsIHRvIGxvdyBsZXZlbCBkcnZyCisgKgorICogQGFkcAkJOiBUaGUgYWRhcHRlciBoYW5kbGUKKyAqIEBraW9jCTogVGhlIGlvY3RsIHBhY2tldCB3aXRoIGtlcm5lbCBhZGRyZXNzZXMKKyAqLworc3RhdGljIGludAorbGxkX2lvY3RsKG1yYWlkX21tYWRwX3QgKmFkcCwgdWlvY190ICpraW9jKQoreworCWludAkJCXJ2YWw7CisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QJKnRwID0gTlVMTDsKKworCWtpb2MtPnN0YXR1cwk9IC1FTk9EQVRBOworCXJ2YWwJCT0gYWRwLT5pc3N1ZV91aW9jKGFkcC0+ZHJ2cl9kYXRhLCBraW9jLCBJT0NUTF9JU1NVRSk7CisKKwlpZiAocnZhbCkgcmV0dXJuIHJ2YWw7CisKKwkvKgorCSAqIFN0YXJ0IHRoZSB0aW1lcgorCSAqLworCWlmIChhZHAtPnRpbWVvdXQgPiAwKSB7CisJCXRwCQk9ICZ0aW1lcjsKKwkJaW5pdF90aW1lcih0cCk7CisKKwkJdHAtPmZ1bmN0aW9uCT0gbGxkX3RpbWVkb3V0OworCQl0cC0+ZGF0YQk9ICh1bnNpZ25lZCBsb25nKWtpb2M7CisJCXRwLT5leHBpcmVzCT0gamlmZmllcyArIGFkcC0+dGltZW91dCAqIEhaOworCisJCWFkZF90aW1lcih0cCk7CisJfQorCisJLyoKKwkgKiBXYWl0IHRpbGwgdGhlIGxvdyBsZXZlbCBkcml2ZXIgY29tcGxldGVzIHRoZSBpb2N0bC4gQWZ0ZXIgdGhpcworCSAqIGNhbGwsIHRoZSBpb2N0bCBlaXRoZXIgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBvciB0aW1lZG91dC4KKwkgKi8KKwl3YWl0X2V2ZW50KHdhaXRfcSwgKGtpb2MtPnN0YXR1cyAhPSAtRU5PREFUQSkpOworCWlmICh0cCkgeworCQlkZWxfdGltZXJfc3luYyh0cCk7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgY29tbWFuZCBoYWQgdGltZWRvdXQsIHdlIG1hcmsgdGhlIGNvbnRyb2xsZXIgb2ZmbGluZQorCSAqIGJlZm9yZSByZXR1cm5pbmcKKwkgKi8KKwlpZiAoa2lvYy0+dGltZWRvdXQpIHsKKwkJYWRwLT5xdWllc2NlbnQgPSAwOworCX0KKworCXJldHVybiBraW9jLT5zdGF0dXM7Cit9CisKKworLyoqCisgKiBpb2N0bF9kb25lIC0gY2FsbGJhY2sgZnJvbSB0aGUgbG93IGxldmVsIGRyaXZlcgorICoKKyAqIEBraW9jCTogY29tcGxldGVkIGlvY3RsIHBhY2tldAorICovCitzdGF0aWMgdm9pZAoraW9jdGxfZG9uZSh1aW9jX3QgKmtpb2MpCit7CisJdWludDMyX3QJYWRhcG5vOworCWludAkJaXRlcmF0b3I7CisJbXJhaWRfbW1hZHBfdCoJYWRhcHRlcjsKKworCS8qCisJICogV2hlbiB0aGUga2lvYyByZXR1cm5zIGZyb20gZHJpdmVyLCBtYWtlIHN1cmUgaXQgc3RpbGwgZG9lc24ndAorCSAqIGhhdmUgRU5PREFUQSBpbiBzdGF0dXMuIE90aGVyd2lzZSwgZHJpdmVyIHdpbGwgaGFuZyBvbiB3YWl0X2V2ZW50CisJICogZm9yZXZlcgorCSAqLworCWlmIChraW9jLT5zdGF0dXMgPT0gLUVOT0RBVEEpIHsKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCSJtZWdhcmFpZCBjbW06IGxsZCBkaWRuJ3QgY2hhbmdlIHN0YXR1cyFcbiIpKTsKKworCQlraW9jLT5zdGF0dXMgPSAtRUlOVkFMOworCX0KKworCS8qCisJICogQ2hlY2sgaWYgdGhpcyBraW9jIHdhcyB0aW1lZG91dCBiZWZvcmUuIElmIHNvLCBub2JvZHkgaXMgd2FpdGluZworCSAqIG9uIHRoaXMga2lvYy4gV2UgZG9uJ3QgaGF2ZSB0byB3YWtlIHVwIGFueWJvZHkuIEluc3RlYWQsIHdlIGp1c3QKKwkgKiBoYXZlIHRvIGZyZWUgdGhlIGtpb2MKKwkgKi8KKwlpZiAoa2lvYy0+dGltZWRvdXQpIHsKKwkJaXRlcmF0b3IJPSAwOworCQlhZGFwdGVyCQk9IE5VTEw7CisJCWFkYXBubwkJPSBraW9jLT5hZGFwbm87CisKKwkJY29uX2xvZyhDTF9BTk4sICggS0VSTl9XQVJOSU5HICJtZWdhcmFpZCBjbW06IGNvbXBsZXRlZCAiCisJCQkJCSJpb2N0bCB0aGF0IHdhcyB0aW1lZG91dCBiZWZvcmVcbiIpKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFkYXB0ZXIsICZhZGFwdGVyc19saXN0X2csIGxpc3QpIHsKKwkJCWlmIChpdGVyYXRvcisrID09IGFkYXBubykgYnJlYWs7CisJCX0KKworCQlraW9jLT50aW1lZG91dCA9IDA7CisKKwkJaWYgKGFkYXB0ZXIpIHsKKwkJCW1yYWlkX21tX2RlYWxsb2Nfa2lvYyggYWRhcHRlciwga2lvYyApOworCQl9CisJfQorCWVsc2UgeworCQl3YWtlX3VwKCZ3YWl0X3EpOworCX0KK30KKworCisvKgorICogbGxkX3RpbWVkb3V0CTogY2FsbGJhY2sgZnJvbSB0aGUgZXhwaXJlZCB0aW1lcgorICoKKyAqIEBwdHIJCTogaW9jdGwgcGFja2V0IHRoYXQgdGltZWQgb3V0CisgKi8KK3N0YXRpYyB2b2lkCitsbGRfdGltZWRvdXQodW5zaWduZWQgbG9uZyBwdHIpCit7CisJdWlvY190ICpraW9jCT0gKHVpb2NfdCAqKXB0cjsKKworCWtpb2MtPnN0YXR1cyAJPSAtRVRJTUU7CisJa2lvYy0+dGltZWRvdXQJPSAxOworCisJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkIGNtbTogaW9jdGwgdGltZWQgb3V0XG4iKSk7CisKKwl3YWtlX3VwKCZ3YWl0X3EpOworfQorCisKKy8qKgorICoga2lvY190b19taW1kCTogQ29udmVydGVyIGZyb20gbmV3IGJhY2sgdG8gb2xkIGZvcm1hdAorICoKKyAqIEBraW9jCTogS2VybmVsIHNwYWNlIElPQ1RMIHBhY2tldCAoc3VjY2Vzc2Z1bGx5IGlzc3VlZCkKKyAqIEBtaW1kCTogVXNlciBzcGFjZSBNSU1EIHBhY2tldAorICovCitzdGF0aWMgaW50CitraW9jX3RvX21pbWQodWlvY190ICpraW9jLCBtaW1kX3QgX191c2VyICptaW1kKQoreworCW1pbWRfdAkJCWttaW1kOworCXVpbnQ4X3QJCQlvcGNvZGU7CisJdWludDhfdAkJCXN1Ym9wY29kZTsKKworCW1ib3g2NF90CQkqbWJveDY0OworCW1yYWlkX3Bhc3N0aHJ1X3QJX191c2VyICp1cHRocnUzMjsKKwltcmFpZF9wYXNzdGhydV90CSprcHRocnUzMjsKKwltY29udHJvbGxlcl90CQljaW5mbzsKKwltcmFpZF9oYmFfaW5mb190CSpoaW5mbzsKKworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZrbWltZCwgbWltZCwgc2l6ZW9mKG1pbWRfdCkpKQorCQlyZXR1cm4gKC1FRkFVTFQpOworCisJb3Bjb2RlCQk9IGttaW1kLnVpLmZjcy5vcGNvZGU7CisJc3Vib3Bjb2RlCT0ga21pbWQudWkuZmNzLnN1Ym9wY29kZTsKKworCWlmIChvcGNvZGUgPT0gMHg4MikgeworCQlzd2l0Y2ggKHN1Ym9wY29kZSkgeworCisJCWNhc2UgTUVHQUlPQ19RQURBUElORk86CisKKwkJCWhpbmZvID0gKG1yYWlkX2hiYV9pbmZvX3QgKikodW5zaWduZWQgbG9uZykKKwkJCQkJa2lvYy0+YnVmX3ZhZGRyOworCisJCQloaW5mb190b19jaW5mbyhoaW5mbywgJmNpbmZvKTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcihrbWltZC5kYXRhLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJCXJldHVybiAoLUVGQVVMVCk7CisKKwkJCXJldHVybiAwOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gKC1FSU5WQUwpOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCisJbWJveDY0ID0gKG1ib3g2NF90ICopKHVuc2lnbmVkIGxvbmcpa2lvYy0+Y21kYnVmOworCisJaWYgKGtpb2MtPnVzZXJfcHRocnUpIHsKKworCQl1cHRocnUzMiA9IGtpb2MtPnVzZXJfcHRocnU7CisJCWtwdGhydTMyID0ga2lvYy0+cHRocnUzMjsKKworCQlpZiAoY29weV90b191c2VyKCZ1cHRocnUzMi0+c2NzaXN0YXR1cywKKwkJCQkJJmtwdGhydTMyLT5zY3Npc3RhdHVzLAorCQkJCQlzaXplb2YodWludDhfdCkpKSB7CisJCQlyZXR1cm4gKC1FRkFVTFQpOworCQl9CisJfQorCisJaWYgKGtpb2MtPnVzZXJfZGF0YSkgeworCQlpZiAoY29weV90b191c2VyKGtpb2MtPnVzZXJfZGF0YSwga2lvYy0+YnVmX3ZhZGRyLAorCQkJCQlraW9jLT51c2VyX2RhdGFfbGVuKSkgeworCQkJcmV0dXJuICgtRUZBVUxUKTsKKwkJfQorCX0KKworCWlmIChjb3B5X3RvX3VzZXIoJm1pbWQtPm1ib3hbMTddLAorCQkJJm1ib3g2NC0+bWJveDMyLnN0YXR1cywgc2l6ZW9mKHVpbnQ4X3QpKSkgeworCQlyZXR1cm4gKC1FRkFVTFQpOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qKgorICogaGluZm9fdG9fY2luZm8gLSBDb252ZXJ0IG5ldyBmb3JtYXQgaGJhIGluZm8gaW50byBvbGQgZm9ybWF0CisgKgorICogQGhpbmZvCTogTmV3IGZvcm1hdCwgbW9yZSBjb21wcmVoZW5zaXZlIGFkYXB0ZXIgaW5mbworICogQGNpbmZvCTogT2xkIGZvcm1hdCBhZGFwdGVyIGluZm8gdG8gc3VwcG9ydCBtaW1kX3QgYXBwcworICovCitzdGF0aWMgdm9pZAoraGluZm9fdG9fY2luZm8obXJhaWRfaGJhX2luZm9fdCAqaGluZm8sIG1jb250cm9sbGVyX3QgKmNpbmZvKQoreworCWlmICghaGluZm8gfHwgIWNpbmZvKQorCQlyZXR1cm47CisKKwljaW5mby0+YmFzZQkJPSBoaW5mby0+YmFzZXBvcnQ7CisJY2luZm8tPmlycQkJPSBoaW5mby0+aXJxOworCWNpbmZvLT5udW1sZHJ2CQk9IGhpbmZvLT5udW1fbGRydjsKKwljaW5mby0+cGNpYnVzCQk9IGhpbmZvLT5wY2lfYnVzOworCWNpbmZvLT5wY2lkZXYJCT0gaGluZm8tPnBjaV9zbG90OworCWNpbmZvLT5wY2lmdW4JCT0gUENJX0ZVTkMoaGluZm8tPnBjaV9kZXZfZm4pOworCWNpbmZvLT5wY2lpZAkJPSBoaW5mby0+cGNpX2RldmljZV9pZDsKKwljaW5mby0+cGNpdmVuZG9yCT0gaGluZm8tPnBjaV92ZW5kb3JfaWQ7CisJY2luZm8tPnBjaXNsb3QJCT0gaGluZm8tPnBjaV9zbG90OworCWNpbmZvLT51aWQJCT0gaGluZm8tPnVuaXF1ZV9pZDsKK30KKworCisvKgorICogbXJhaWRfbW1fcmVnaXN0ZXJfYWRwIC0gUmVnaXN0cmF0aW9uIHJvdXRpbmUgZm9yIGxvdyBsZXZlbCBkcnZycworICoKKyAqIEBhZHAJOiBBZGFwdGVyIG9iamVqY3QKKyAqLworaW50CittcmFpZF9tbV9yZWdpc3Rlcl9hZHAobXJhaWRfbW1hZHBfdCAqbGxkX2FkcCkKK3sKKwltcmFpZF9tbWFkcF90CSphZGFwdGVyOworCW1ib3g2NF90CSptYm94X2xpc3Q7CisJdWlvY190CQkqa2lvYzsKKwl1aW50MzJfdAlydmFsOworCWludAkJaTsKKworCisJaWYgKGxsZF9hZHAtPmRydnJfdHlwZSAhPSBEUlZSVFlQRV9NQk9YKQorCQlyZXR1cm4gKC1FSU5WQUwpOworCisJYWRhcHRlciA9IGttYWxsb2Moc2l6ZW9mKG1yYWlkX21tYWRwX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghYWRhcHRlcikgeworCQlydmFsID0gLUVOT01FTTsKKwkJZ290byBtZW1hbGxvY19lcnJvcjsKKwl9CisKKwltZW1zZXQoYWRhcHRlciwgMCwgc2l6ZW9mKG1yYWlkX21tYWRwX3QpKTsKKworCWFkYXB0ZXItPnVuaXF1ZV9pZAk9IGxsZF9hZHAtPnVuaXF1ZV9pZDsKKwlhZGFwdGVyLT5kcnZyX3R5cGUJPSBsbGRfYWRwLT5kcnZyX3R5cGU7CisJYWRhcHRlci0+ZHJ2cl9kYXRhCT0gbGxkX2FkcC0+ZHJ2cl9kYXRhOworCWFkYXB0ZXItPnBkZXYJCT0gbGxkX2FkcC0+cGRldjsKKwlhZGFwdGVyLT5pc3N1ZV91aW9jCT0gbGxkX2FkcC0+aXNzdWVfdWlvYzsKKwlhZGFwdGVyLT50aW1lb3V0CT0gbGxkX2FkcC0+dGltZW91dDsKKwlhZGFwdGVyLT5tYXhfa2lvYwk9IGxsZF9hZHAtPm1heF9raW9jOworCWFkYXB0ZXItPnF1aWVzY2VudAk9IDE7CisKKwkvKgorCSAqIEFsbG9jYXRlIHNpbmdsZSBibG9ja3Mgb2YgbWVtb3J5IGZvciBhbGwgcmVxdWlyZWQga2lvY3MsCisJICogbWFpbGJveGVzIGFuZCBwYXNzdGhydSBzdHJ1Y3R1cmVzLgorCSAqLworCWFkYXB0ZXItPmtpb2NfbGlzdAk9IGttYWxsb2Moc2l6ZW9mKHVpb2NfdCkgKiBsbGRfYWRwLT5tYXhfa2lvYywKKwkJCQkJCUdGUF9LRVJORUwpOworCWFkYXB0ZXItPm1ib3hfbGlzdAk9IGttYWxsb2Moc2l6ZW9mKG1ib3g2NF90KSAqIGxsZF9hZHAtPm1heF9raW9jLAorCQkJCQkJR0ZQX0tFUk5FTCk7CisJYWRhcHRlci0+cHRocnVfZG1hX3Bvb2wgPSBwY2lfcG9vbF9jcmVhdGUoIm1lZ2FyYWlkIG1tIHB0aHJ1IHBvb2wiLAorCQkJCQkJYWRhcHRlci0+cGRldiwKKwkJCQkJCXNpemVvZihtcmFpZF9wYXNzdGhydV90KSwKKwkJCQkJCTE2LCAwKTsKKworCWlmICghYWRhcHRlci0+a2lvY19saXN0IHx8ICFhZGFwdGVyLT5tYm94X2xpc3QgfHwKKwkJCSFhZGFwdGVyLT5wdGhydV9kbWFfcG9vbCkgeworCisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQgY21tOiBvdXQgb2YgbWVtb3J5LCAlcyAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkJX19MSU5FX18pKTsKKworCQlydmFsID0gKC1FTk9NRU0pOworCisJCWdvdG8gbWVtYWxsb2NfZXJyb3I7CisJfQorCisJLyoKKwkgKiBTbGljZSBraW9jX2xpc3QgYW5kIG1ha2UgYSBraW9jX3Bvb2wgd2l0aCB0aGUgaW5kaXZpZGl1YWwga2lvY3MKKwkgKi8KKwlJTklUX0xJU1RfSEVBRCgmYWRhcHRlci0+a2lvY19wb29sKTsKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+a2lvY19wb29sX2xvY2spOworCXNlbWFfaW5pdCgmYWRhcHRlci0+a2lvY19zZW1hcGhvcmUsIGxsZF9hZHAtPm1heF9raW9jKTsKKworCW1ib3hfbGlzdAk9IChtYm94NjRfdCAqKWFkYXB0ZXItPm1ib3hfbGlzdDsKKworCWZvciAoaSA9IDA7IGkgPCBsbGRfYWRwLT5tYXhfa2lvYzsgaSsrKSB7CisKKwkJa2lvYwkJPSBhZGFwdGVyLT5raW9jX2xpc3QgKyBpOworCQlraW9jLT5jbWRidWYJPSAodWludDY0X3QpKHVuc2lnbmVkIGxvbmcpKG1ib3hfbGlzdCArIGkpOworCQlraW9jLT5wdGhydTMyCT0gcGNpX3Bvb2xfYWxsb2MoYWRhcHRlci0+cHRocnVfZG1hX3Bvb2wsCisJCQkJCQlHRlBfS0VSTkVMLCAma2lvYy0+cHRocnUzMl9oKTsKKworCQlpZiAoIWtpb2MtPnB0aHJ1MzIpIHsKKworCQkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCQkibWVnYXJhaWQgY21tOiBvdXQgb2YgbWVtb3J5LCAlcyAlZFxuIiwKKwkJCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXykpOworCisJCQlydmFsID0gKC1FTk9NRU0pOworCisJCQlnb3RvIHB0aHJ1X2RtYV9wb29sX2Vycm9yOworCQl9CisKKwkJbGlzdF9hZGRfdGFpbCgma2lvYy0+bGlzdCwgJmFkYXB0ZXItPmtpb2NfcG9vbCk7CisJfQorCisJLy8gU2V0dXAgdGhlIGRtYSBwb29scyBmb3IgZGF0YSBidWZmZXJzCisJaWYgKChydmFsID0gbXJhaWRfbW1fc2V0dXBfZG1hX3Bvb2xzKGFkYXB0ZXIpKSAhPSAwKSB7CisJCWdvdG8gZG1hX3Bvb2xfZXJyb3I7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmYWRhcHRlci0+bGlzdCwgJmFkYXB0ZXJzX2xpc3RfZyk7CisKKwlhZGFwdGVyc19jb3VudF9nKys7CisKKwlyZXR1cm4gMDsKKworZG1hX3Bvb2xfZXJyb3I6CisJLyogRG8gbm90aGluZyAqLworCitwdGhydV9kbWFfcG9vbF9lcnJvcjoKKworCWZvciAoaSA9IDA7IGkgPCBsbGRfYWRwLT5tYXhfa2lvYzsgaSsrKSB7CisJCWtpb2MgPSBhZGFwdGVyLT5raW9jX2xpc3QgKyBpOworCQlpZiAoa2lvYy0+cHRocnUzMikgeworCQkJcGNpX3Bvb2xfZnJlZShhZGFwdGVyLT5wdGhydV9kbWFfcG9vbCwga2lvYy0+cHRocnUzMiwKKwkJCQlraW9jLT5wdGhydTMyX2gpOworCQl9CisJfQorCittZW1hbGxvY19lcnJvcjoKKworCWlmIChhZGFwdGVyLT5raW9jX2xpc3QpCisJCWtmcmVlKGFkYXB0ZXItPmtpb2NfbGlzdCk7CisKKwlpZiAoYWRhcHRlci0+bWJveF9saXN0KQorCQlrZnJlZShhZGFwdGVyLT5tYm94X2xpc3QpOworCisJaWYgKGFkYXB0ZXItPnB0aHJ1X2RtYV9wb29sKQorCQlwY2lfcG9vbF9kZXN0cm95KGFkYXB0ZXItPnB0aHJ1X2RtYV9wb29sKTsKKworCWlmIChhZGFwdGVyKQorCQlrZnJlZShhZGFwdGVyKTsKKworCXJldHVybiBydmFsOworfQorCisKKy8qKgorICogbXJhaWRfbW1fYWRhcHRlcl9hcHBfaGFuZGxlIC0gcmV0dXJuIHRoZSBhcHBsaWNhdGlvbiBoYW5kbGUgZm9yIHRoaXMgYWRhcHRlcgorICoKKyAqIEZvciB0aGUgZ2l2ZW4gZHJpdmVyIGRhdGEsIGxvY2F0ZSB0aGUgYWRhZHB0ZXIgaW4gb3VyIGdsb2JhbCBsaXN0IGFuZAorICogcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGhhbmRsZSwgd2hpY2ggaXMgYWxzbyB1c2VkIGJ5IGFwcGxpY2F0aW9ucyB0bworICogdW5pcXVlbHkgaWRlbnRpZnkgYW4gYWRhcHRlci4KKyAqCisgKiBAcGFyYW0gdW5pcXVlX2lkIDogYWRhcHRlciB1bmlxdWUgaWRlbnRpZmllcgorICoKKyAqIEByZXR1cm4gYWRhcHRlciBoYW5kbGUgaWYgZm91bmQgaW4gdGhlIGxpc3QKKyAqIEByZXR1cm4gMCBpZiBhZGFwdGVyIGNvdWxkIG5vdCBiZSBsb2NhdGVkLCBzaG91bGQgbmV2ZXIgaGFwcGVuIHRob3VnaAorICovCit1aW50MzJfdAorbXJhaWRfbW1fYWRhcHRlcl9hcHBfaGFuZGxlKHVpbnQzMl90IHVuaXF1ZV9pZCkKK3sKKwltcmFpZF9tbWFkcF90CSphZGFwdGVyOworCW1yYWlkX21tYWRwX3QJKnRtcDsKKwlpbnQJCWluZGV4ID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhZGFwdGVyLCB0bXAsICZhZGFwdGVyc19saXN0X2csIGxpc3QpIHsKKworCQlpZiAoYWRhcHRlci0+dW5pcXVlX2lkID09IHVuaXF1ZV9pZCkgeworCisJCQlyZXR1cm4gTUtBREFQKGluZGV4KTsKKwkJfQorCisJCWluZGV4Kys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBtcmFpZF9tbV9zZXR1cF9kbWFfcG9vbHMgLSBTZXQgdXAgZG1hIGJ1ZmZlciBwb29scyBwZXIgYWRhcHRlcgorICoKKyAqIEBhZHAJOiBBZGFwdGVyIHNvZnRzdGF0ZQorICoKKyAqIFdlIG1haW50YWluIGEgcG9vbCBvZiBkbWEgYnVmZmVycyBwZXIgZWFjaCBhZGFwdGVyLiBFYWNoIHBvb2wgaGFzIG9uZQorICogYnVmZmVyLiBFLmcsIHdlIG1heSBoYXZlIDUgZG1hIHBvb2xzIC0gb25lIGVhY2ggZm9yIDRrLCA4ayAuLi4gNjRrIGJ1ZmZlcnMuCisgKiBXZSBoYXZlIGp1c3Qgb25lIDRrIGJ1ZmZlciBpbiA0ayBwb29sLCBvbmUgOGsgYnVmZmVyIGluIDhrIHBvb2wgZXRjLiBXZQorICogZG9udCcgd2FudCB0byB3YXN0ZSB0b28gbXVjaCBtZW1vcnkgYnkgYWxsb2NhdGluZyBtb3JlIGJ1ZmZlcnMgcGVyIGVhY2gKKyAqIHBvb2wuCisgKi8KK3N0YXRpYyBpbnQKK21yYWlkX21tX3NldHVwX2RtYV9wb29scyhtcmFpZF9tbWFkcF90ICphZHApCit7CisJbW1fZG1hcG9vbF90CSpwb29sOworCWludAkJYnVmc2l6ZTsKKwlpbnQJCWk7CisKKwkvKgorCSAqIENyZWF0ZSBNQVhfRE1BX1BPT0xTIG51bWJlciBvZiBwb29scworCSAqLworCWJ1ZnNpemUgPSBNUkFJRF9NTV9JTklUX0JVRkZfU0laRTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfRE1BX1BPT0xTOyBpKyspeworCisJCXBvb2wgPSAmYWRwLT5kbWFfcG9vbF9saXN0W2ldOworCisJCXBvb2wtPmJ1Zl9zaXplID0gYnVmc2l6ZTsKKwkJc3Bpbl9sb2NrX2luaXQoJnBvb2wtPmxvY2spOworCisJCXBvb2wtPmhhbmRsZSA9IHBjaV9wb29sX2NyZWF0ZSgibWVnYXJhaWQgbW0gZGF0YSBidWZmZXIiLAorCQkJCQkJYWRwLT5wZGV2LCBidWZzaXplLCAxNiwgMCk7CisKKwkJaWYgKCFwb29sLT5oYW5kbGUpIHsKKwkJCWdvdG8gZG1hX3Bvb2xfc2V0dXBfZXJyb3I7CisJCX0KKworCQlwb29sLT52YWRkciA9IHBjaV9wb29sX2FsbG9jKHBvb2wtPmhhbmRsZSwgR0ZQX0tFUk5FTCwKKwkJCQkJCQkmcG9vbC0+cGFkZHIpOworCisJCWlmICghcG9vbC0+dmFkZHIpCisJCQlnb3RvIGRtYV9wb29sX3NldHVwX2Vycm9yOworCisJCWJ1ZnNpemUgPSBidWZzaXplICogMjsKKwl9CisKKwlyZXR1cm4gMDsKKworZG1hX3Bvb2xfc2V0dXBfZXJyb3I6CisKKwltcmFpZF9tbV90ZWFyZG93bl9kbWFfcG9vbHMoYWRwKTsKKwlyZXR1cm4gKC1FTk9NRU0pOworfQorCisKKy8qCisgKiBtcmFpZF9tbV91bnJlZ2lzdGVyX2FkcCAtIFVucmVnaXN0ZXIgcm91dGluZSBmb3IgbG93IGxldmVsIGRyaXZlcnMKKyAqCQkJCSAgQXNzdW1lIG5vIG91dHN0YW5kaW5nIGlvY3RscyB0byBsbGRzLgorICoKKyAqIEB1bmlxdWVfaWQJOiBVSUQgb2YgdGhlIGFkcGF0ZXIKKyAqLworaW50CittcmFpZF9tbV91bnJlZ2lzdGVyX2FkcCh1aW50MzJfdCB1bmlxdWVfaWQpCit7CisJbXJhaWRfbW1hZHBfdAkqYWRhcHRlcjsKKwltcmFpZF9tbWFkcF90CSp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYWRhcHRlciwgdG1wLCAmYWRhcHRlcnNfbGlzdF9nLCBsaXN0KSB7CisKKworCQlpZiAoYWRhcHRlci0+dW5pcXVlX2lkID09IHVuaXF1ZV9pZCkgeworCisJCQlhZGFwdGVyc19jb3VudF9nLS07CisKKwkJCWxpc3RfZGVsX2luaXQoJmFkYXB0ZXItPmxpc3QpOworCisJCQltcmFpZF9tbV9mcmVlX2FkcF9yZXNvdXJjZXMoYWRhcHRlcik7CisKKwkJCWtmcmVlKGFkYXB0ZXIpOworCisJCQljb25fbG9nKENMX0FOTiwgKAorCQkJCSJtZWdhcmFpZCBjbW06IFVucmVnaXN0ZXJlZCBvbmUgYWRhcHRlcjolI3hcbiIsCisJCQkJdW5pcXVlX2lkKSk7CisKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuICgtRU5PREVWKTsKK30KKworLyoqCisgKiBtcmFpZF9tbV9mcmVlX2FkcF9yZXNvdXJjZXMgLSBGcmVlIGFkYXB0ZXIgc29mdHN0YXRlCisgKgorICogQGFkcAk6IEFkYXB0ZXIgc29mdHN0YXRlCisgKi8KK3N0YXRpYyB2b2lkCittcmFpZF9tbV9mcmVlX2FkcF9yZXNvdXJjZXMobXJhaWRfbW1hZHBfdCAqYWRwKQoreworCXVpb2NfdAkqa2lvYzsKKwlpbnQJaTsKKworCW1yYWlkX21tX3RlYXJkb3duX2RtYV9wb29scyhhZHApOworCisJZm9yIChpID0gMDsgaSA8IGFkcC0+bWF4X2tpb2M7IGkrKykgeworCisJCWtpb2MgPSBhZHAtPmtpb2NfbGlzdCArIGk7CisKKwkJcGNpX3Bvb2xfZnJlZShhZHAtPnB0aHJ1X2RtYV9wb29sLCBraW9jLT5wdGhydTMyLAorCQkJCWtpb2MtPnB0aHJ1MzJfaCk7CisJfQorCisJa2ZyZWUoYWRwLT5raW9jX2xpc3QpOworCisJa2ZyZWUoYWRwLT5tYm94X2xpc3QpOworCisJcGNpX3Bvb2xfZGVzdHJveShhZHAtPnB0aHJ1X2RtYV9wb29sKTsKKworCisJcmV0dXJuOworfQorCisKKy8qKgorICogbXJhaWRfbW1fdGVhcmRvd25fZG1hX3Bvb2xzIC0gRnJlZSBhbGwgcGVyIGFkYXB0ZXIgZG1hIGJ1ZmZlcnMKKyAqCisgKiBAYWRwCTogQWRhcHRlciBzb2Z0c3RhdGUKKyAqLworc3RhdGljIHZvaWQKK21yYWlkX21tX3RlYXJkb3duX2RtYV9wb29scyhtcmFpZF9tbWFkcF90ICphZHApCit7CisJaW50CQlpOworCW1tX2RtYXBvb2xfdAkqcG9vbDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfRE1BX1BPT0xTOyBpKyspIHsKKworCQlwb29sID0gJmFkcC0+ZG1hX3Bvb2xfbGlzdFtpXTsKKworCQlpZiAocG9vbC0+aGFuZGxlKSB7CisKKwkJCWlmIChwb29sLT52YWRkcikKKwkJCQlwY2lfcG9vbF9mcmVlKHBvb2wtPmhhbmRsZSwgcG9vbC0+dmFkZHIsCisJCQkJCQkJcG9vbC0+cGFkZHIpOworCisJCQlwY2lfcG9vbF9kZXN0cm95KHBvb2wtPmhhbmRsZSk7CisJCQlwb29sLT5oYW5kbGUgPSBOVUxMOworCQl9CisJfQorCisJcmV0dXJuOworfQorCisvKioKKyAqIG1yYWlkX21tX2luaXQJOiBNb2R1bGUgZW50cnkgcG9pbnQKKyAqLworc3RhdGljIGludCBfX2luaXQKK21yYWlkX21tX2luaXQodm9pZCkKK3sKKwkvLyBBbm5vdW5jZSB0aGUgZHJpdmVyIHZlcnNpb24KKwljb25fbG9nKENMX0FOTiwgKEtFUk5fSU5GTyAibWVnYXJhaWQgY21tOiAlcyAlc1xuIiwKKwkJTFNJX0NPTU1PTl9NT0RfVkVSU0lPTiwgTFNJX0NPTU1PTl9NT0RfRVhUX1ZFUlNJT04pKTsKKworCW1ham9ybm8gPSByZWdpc3Rlcl9jaHJkZXYoMCwgIm1lZ2FkZXYiLCAmbHNpX2ZvcHMpOworCisJaWYgKG1ham9ybm8gPCAwKSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoIm1lZ2FyYWlkIGNtbTogY2Fubm90IGdldCBtYWpvclxuIikpOworCQlyZXR1cm4gbWFqb3JubzsKKwl9CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ3YWl0X3EpOworCisJSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXJzX2xpc3RfZyk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIG1yYWlkX21tX2NvbXBhdF9pb2N0bAk6IDMyYml0IHRvIDY0Yml0IGlvY3RsIGNvbnZlcnNpb24gcm91dGluZQorICovCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGxvbmcKK21yYWlkX21tX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBlcnI7CisJbG9ja19rZXJuZWwoKTsKKwllcnIgPSBtcmFpZF9tbV9pb2N0bChOVUxMLCBmaWxlcCwgY21kLCBhcmcpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKKy8qKgorICogbXJhaWRfbW1fZXhpdAk6IE1vZHVsZSBleGl0IHBvaW50CisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdAorbXJhaWRfbW1fZXhpdCh2b2lkKQoreworCWNvbl9sb2coQ0xfRExFVkVMMSAsICgiZXhpdGluZyBjb21tb24gbW9kXG4iKSk7CisKKwl1bnJlZ2lzdGVyX2NocmRldihtYWpvcm5vLCAibWVnYWRldiIpOworfQorCittb2R1bGVfaW5pdChtcmFpZF9tbV9pbml0KTsKK21vZHVsZV9leGl0KG1yYWlkX21tX2V4aXQpOworCisvKiB2aTogc2V0IHRzPTggc3c9OCB0dz03ODogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tbS5oIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4YTAwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tbS5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICoKKyAqCQkJTGludXggTWVnYVJBSUQgZGV2aWNlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0ICBMU0kgTG9naWMgQ29ycG9yYXRpb24uCisgKgorICoJICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCSAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGSUxFCQk6IG1lZ2FyYWlkX21tLmgKKyAqLworCisjaWZuZGVmIE1FR0FSQUlEX01NX0gKKyNkZWZpbmUgTUVHQVJBSURfTU1fSAorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4KKworI2luY2x1ZGUgIm1ib3hfZGVmcy5oIgorI2luY2x1ZGUgIm1lZ2FyYWlkX2lvY3RsLmgiCisKKworI2RlZmluZSBMU0lfQ09NTU9OX01PRF9WRVJTSU9OCSIyLjIwLjIuNSIKKyNkZWZpbmUgTFNJX0NPTU1PTl9NT0RfRVhUX1ZFUlNJT04JXAorCQkiKFJlbGVhc2UgRGF0ZTogRnJpIEphbiAyMSAwMDowMTowMyBFU1QgMjAwNSkiCisKKworI2RlZmluZSBMU0lfREJHTFZMCQkJZGJnbGV2ZWwKKworLy8gVGhlIHNtYWxsZXN0IGRtYSBwb29sCisjZGVmaW5lIE1SQUlEX01NX0lOSVRfQlVGRl9TSVpFCQk0MDk2CisKKy8qKgorICogbWltZF90CTogT2xkIHN0eWxlIGlvY3RsIHBhY2tldCBzdHJ1Y3R1cmUgKGRlcHJlY2F0ZWQpCisgKgorICogQGlubGVuCToKKyAqIEBvdXRsZW4JOgorICogQGZjYQkJOgorICogQG9wY29kZQk6CisgKiBAc3Vib3Bjb2RlCToKKyAqIEBhZGFwbm8JOgorICogQGJ1ZmZlcgk6CisgKiBAcGFkCQk6CisgKiBAbGVuZ3RoCToKKyAqIEBtYm94CToKKyAqIEBwdGhydQk6CisgKiBAZGF0YQk6CisgKiBAcGFkCQk6CisgKgorICogTm90ZQkJOiBUaGlzIHN0cnVjdHVyZSBpcyBERVBSRUNBVEVELiBOZXcgYXBwbGljYXRpb25zIG11c3QgdXNlCisgKgkJOiB1aW9jX3Qgc3RydWN0dXJlIGluc3RlYWQuIEFsbCBuZXcgaGJhIGRyaXZlcnMgdXNlIHRoZSBuZXcKKyAqCQk6IGZvcm1hdC4gSWYgd2UgZ2V0IHRoaXMgbWltZCBwYWNrZXQsIHdlIHdpbGwgY29udmVydCBpdCBpbnRvCisgKgkJOiBuZXcgdWlvY190IGZvcm1hdCBhbmQgc2VuZCBpdCB0byB0aGUgaGJhIGRyaXZlcnMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbWltZCB7CisKKwl1aW50MzJfdCBpbmxlbjsKKwl1aW50MzJfdCBvdXRsZW47CisKKwl1bmlvbiB7CisJCXVpbnQ4X3QgZmNhWzE2XTsKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3Qgb3Bjb2RlOworCQkJdWludDhfdCBzdWJvcGNvZGU7CisJCQl1aW50MTZfdCBhZGFwbm87CisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCQkJdWludDhfdCBfX3VzZXIgKmJ1ZmZlcjsKKwkJCXVpbnQ4X3QgcGFkWzRdOworI2VuZGlmCisjaWYgQklUU19QRVJfTE9ORyA9PSA2NAorCQkJdWludDhfdCBfX3VzZXIgKmJ1ZmZlcjsKKyNlbmRpZgorCQkJdWludDMyX3QgbGVuZ3RoOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBmY3M7CisJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdWk7CisKKwl1aW50OF90IG1ib3hbMThdOwkJLyogMTYgYnl0ZXMgKyAyIHN0YXR1cyBieXRlcyAqLworCW1yYWlkX3Bhc3N0aHJ1X3QgcHRocnU7CisKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJY2hhciBfX3VzZXIgKmRhdGE7CQkvKiBidWZmZXIgPD0gNDA5NiBmb3IgMHg4MCBjb21tYW5kcyAqLworCWNoYXIgcGFkWzRdOworI2VuZGlmCisjaWYgQklUU19QRVJfTE9ORyA9PSA2NAorCWNoYXIgX191c2VyICpkYXRhOworI2VuZGlmCisKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpbWltZF90OworCisjZW5kaWYgLy8gTUVHQVJBSURfTU1fSAorCisvLyB2aTogc2V0IHRzPTggc3c9OCB0dz03ODoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZXNoLmMgYi9kcml2ZXJzL3Njc2kvbWVzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZjNhNzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbWVzaC5jCkBAIC0wLDAgKzEsMjA2MiBAQAorLyoKKyAqIFNDU0kgbG93LWxldmVsIGRyaXZlciBmb3IgdGhlIE1FU0ggKE1hY2ludG9zaCBFbmhhbmNlZCBTQ1NJIEhhcmR3YXJlKQorICogYnVzIGFkYXB0b3IgZm91bmQgb24gUG93ZXIgTWFjaW50b3NoIGNvbXB1dGVycy4KKyAqIFdlIGFzc3VtZSB0aGUgTUVTSCBpcyBjb25uZWN0ZWQgdG8gYSBEQkRNQSAoZGVzY3JpcHRvci1iYXNlZCBETUEpCisgKiBjb250cm9sbGVyLgorICoKKyAqIFBhdWwgTWFja2VycmFzLCBBdWd1c3QgMTk5Ni4KKyAqIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcy4KKyAqCisgKiBBcHIuIDIxIDIwMDIgIC0gQmVuSAkJUmV3b3JrIGJ1cyByZXNldCBjb2RlIGZvciBuZXcgZXJyb3IgaGFuZGxlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgZGVsYXkgYWZ0ZXIgaW5pdGlhbCBidXMgcmVzZXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIG1vZHVsZSBwYXJhbWV0ZXJzCisgKgorICogU2VwLiAyNyAyMDAzICAtIEJlbkgJCU1vdmUgdG8gbmV3IGRyaXZlciBtb2RlbCwgZml4IHNvbWUgd3JpdGUgcG9zdGluZworICoJCQkJaXNzdWVzCisgKiBUbyBkbzoKKyAqIC0gaGFuZGxlIGFib3J0cyBjb3JyZWN0bHkKKyAqIC0gcmV0cnkgYXJiaXRyYXRpb24gaWYgbG9zdCAodW5sZXNzIGhpZ2hlciBsZXZlbHMgZG8gdGhpcyBmb3IgdXMpCisgKiAtIHBvd2VyIGRvd24gdGhlIGNoaXAgd2hlbiBubyBkZXZpY2UgaXMgZGV0ZWN0ZWQKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9kYmRtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9oeWRyYS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNpby5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2luY2x1ZGUgIm1lc2guaCIKKworI2lmIDEKKyN1bmRlZiBLRVJOX0RFQlVHCisjZGVmaW5lIEtFUk5fREVCVUcgS0VSTl9XQVJOSU5HCisjZW5kaWYKKworTU9EVUxFX0FVVEhPUigiUGF1bCBNYWNrZXJyYXMgKHBhdWx1c0BzYW1iYS5vcmcpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBvd2VyTWFjIE1FU0ggU0NTSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBzeW5jX3JhdGUgPSBDT05GSUdfU0NTSV9NRVNIX1NZTkNfUkFURTsKK3N0YXRpYyBpbnQgc3luY190YXJnZXRzID0gMHhmZjsKK3N0YXRpYyBpbnQgcmVzZWxfdGFyZ2V0cyA9IDB4ZmY7CitzdGF0aWMgaW50IGRlYnVnX3RhcmdldHMgPSAwOwkvKiBwcmludCBkZWJ1ZyBmb3IgdGhlc2UgdGFyZ2V0cyAqLworc3RhdGljIGludCBpbml0X3Jlc2V0X2RlbGF5ID0gQ09ORklHX1NDU0lfTUVTSF9SRVNFVF9ERUxBWV9NUzsKKworbW9kdWxlX3BhcmFtKHN5bmNfcmF0ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc3luY19yYXRlLCAiU3luY2hyb25vdXMgcmF0ZSAoMC4uMTAsIDA9YXN5bmMpIik7Cittb2R1bGVfcGFyYW0oc3luY190YXJnZXRzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzeW5jX3RhcmdldHMsICJCaXRtYXNrIG9mIHRhcmdldHMgYWxsb3dlZCB0byBzZXQgc3luY2hyb25vdXMiKTsKK21vZHVsZV9wYXJhbShyZXNlbF90YXJnZXRzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhyZXNlbF90YXJnZXRzLCAiQml0bWFzayBvZiB0YXJnZXRzIGFsbG93ZWQgdG8gc2V0IGRpc2Nvbm5lY3QiKTsKK21vZHVsZV9wYXJhbShkZWJ1Z190YXJnZXRzLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z190YXJnZXRzLCAiQml0bWFzayBvZiBkZWJ1Z2dlZCB0YXJnZXRzIik7Cittb2R1bGVfcGFyYW0oaW5pdF9yZXNldF9kZWxheSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW5pdF9yZXNldF9kZWxheSwgIkluaXRpYWwgYnVzIHJlc2V0IGRlbGF5ICgwPW5vIHJlc2V0KSIpOworCitzdGF0aWMgaW50IG1lc2hfc3luY19wZXJpb2QgPSAxMDA7CitzdGF0aWMgaW50IG1lc2hfc3luY19vZmZzZXQgPSAwOworc3RhdGljIHVuc2lnbmVkIGNoYXIgdXNlX2FjdGl2ZV9uZWcgPSAwOyAgLyogYml0IG1hc2sgZm9yIFNFUV9BQ1RJVkVfTkVHIGlmIHVzZWQgKi8KKworI2RlZmluZSBBTExPV19TWU5DKHRndCkJCSgoc3luY190YXJnZXRzID4+ICh0Z3QpKSAmIDEpCisjZGVmaW5lIEFMTE9XX1JFU0VMKHRndCkJKChyZXNlbF90YXJnZXRzID4+ICh0Z3QpKSAmIDEpCisjZGVmaW5lIEFMTE9XX0RFQlVHKHRndCkJKChkZWJ1Z190YXJnZXRzID4+ICh0Z3QpKSAmIDEpCisjZGVmaW5lIERFQlVHX1RBUkdFVChjbWQpCSgoY21kKSAmJiBBTExPV19ERUJVRygoY21kKS0+ZGV2aWNlLT5pZCkpCisKKyN1bmRlZiBNRVNIX0RCRworI2RlZmluZSBOX0RCR19MT0cJNTAKKyNkZWZpbmUgTl9EQkdfU0xPRwkyMAorI2RlZmluZSBOVU1fREJHX0VWRU5UUwkxMworI3VuZGVmCURCR19VU0VfVEIJCS8qIGJvbWJzIG9uIDYwMSAqLworCitzdHJ1Y3QgZGJnbG9nIHsKKwljaGFyCSpmbXQ7CisJdTMyCXRiOworCXU4CXBoYXNlOworCXU4CWJzMDsKKwl1OAliczE7CisJdTgJdGd0OworCWludAlkOworfTsKKworZW51bSBtZXNoX3BoYXNlIHsKKwlpZGxlLAorCWFyYml0cmF0aW5nLAorCXNlbGVjdGluZywKKwljb21tYW5kaW5nLAorCWRhdGFpbmcsCisJc3RhdHVzaW5nLAorCWJ1c2ZyZWVpbmcsCisJZGlzY29ubmVjdGluZywKKwlyZXNlbGVjdGluZywKKwlzbGVlcGluZworfTsKKworZW51bSBtc2dfcGhhc2UgeworCW1zZ19ub25lLAorCW1zZ19vdXQsCisJbXNnX291dF94eHgsCisJbXNnX291dF9sYXN0LAorCW1zZ19pbiwKKwltc2dfaW5fYmFkLAorfTsKKworZW51bSBzZHRyX3BoYXNlIHsKKwlkb19zZHRyLAorCXNkdHJfc2VudCwKKwlzZHRyX2RvbmUKK307CisKK3N0cnVjdCBtZXNoX3RhcmdldCB7CisJZW51bSBzZHRyX3BoYXNlIHNkdHJfc3RhdGU7CisJaW50CXN5bmNfcGFyYW1zOworCWludAlkYXRhX2dvZXNfb3V0OwkJLyogZ3Vlc3MgYXMgdG8gZGF0YSBkaXJlY3Rpb24gKi8KKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjdXJyZW50X3JlcTsKKwl1MzIJc2F2ZWRfcHRyOworI2lmZGVmIE1FU0hfREJHCisJaW50CWxvZ19peDsKKwlpbnQJbl9sb2c7CisJc3RydWN0IGRiZ2xvZyBsb2dbTl9EQkdfTE9HXTsKKyNlbmRpZgorfTsKKworc3RydWN0IG1lc2hfc3RhdGUgeworCXZvbGF0aWxlIHN0cnVjdAltZXNoX3JlZ3MgX19pb21lbSAqbWVzaDsKKwlpbnQJbWVzaGludHI7CisJdm9sYXRpbGUgc3RydWN0CWRiZG1hX3JlZ3MgX19pb21lbSAqZG1hOworCWludAlkbWFpbnRyOworCXN0cnVjdAlTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0CW1lc2hfc3RhdGUgKm5leHQ7CisJc3RydWN0IHNjc2lfY21uZCAqcmVxdWVzdF9xOworCXN0cnVjdCBzY3NpX2NtbmQgKnJlcXVlc3RfcXRhaWw7CisJZW51bSBtZXNoX3BoYXNlIHBoYXNlOwkJLyogd2hhdCB3ZSdyZSBjdXJyZW50bHkgdHJ5aW5nIHRvIGRvICovCisJZW51bSBtc2dfcGhhc2UgbXNncGhhc2U7CisJaW50CWNvbm5fdGd0OwkJLyogdGFyZ2V0IHdlJ3JlIGNvbm5lY3RlZCB0byAqLworCXN0cnVjdCBzY3NpX2NtbmQgKmN1cnJlbnRfcmVxOwkJLyogcmVxIHdlJ3JlIGN1cnJlbnRseSB3b3JraW5nIG9uICovCisJaW50CWRhdGFfcHRyOworCWludAlkbWFfc3RhcnRlZDsKKwlpbnQJZG1hX2NvdW50OworCWludAlzdGF0OworCWludAlhYm9ydGluZzsKKwlpbnQJZXhwZWN0X3JlcGx5OworCWludAluX21zZ2luOworCXU4CW1zZ2luWzE2XTsKKwlpbnQJbl9tc2dvdXQ7CisJaW50CWxhc3Rfbl9tc2dvdXQ7CisJdTgJbXNnb3V0WzE2XTsKKwlzdHJ1Y3QgZGJkbWFfY21kICpkbWFfY21kczsJLyogc3BhY2UgZm9yIGRiZG1hIGNvbW1hbmRzLCBhbGlnbmVkICovCisJZG1hX2FkZHJfdCBkbWFfY21kX2J1czsKKwl2b2lkCSpkbWFfY21kX3NwYWNlOworCWludAlkbWFfY21kX3NpemU7CisJaW50CWNsa19mcmVxOworCXN0cnVjdCBtZXNoX3RhcmdldCB0Z3RzWzhdOworCXN0cnVjdCBtYWNpb19kZXYgKm1kZXY7CisJc3RydWN0IHBjaV9kZXYqIHBkZXY7CisjaWZkZWYgTUVTSF9EQkcKKwlpbnQJbG9nX2l4OworCWludAluX2xvZzsKKwlzdHJ1Y3QgZGJnbG9nIGxvZ1tOX0RCR19TTE9HXTsKKyNlbmRpZgorfTsKKworLyoKKyAqIERyaXZlciBpcyB0b28gbWVzc3ksIHdlIG5lZWQgYSBmZXcgcHJvdG90eXBlcy4uLgorICovCitzdGF0aWMgdm9pZCBtZXNoX2RvbmUoc3RydWN0IG1lc2hfc3RhdGUgKm1zLCBpbnQgc3RhcnRfbmV4dCk7CitzdGF0aWMgdm9pZCBtZXNoX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpwdHJlZ3MpOworc3RhdGljIHZvaWQgY21kX2NvbXBsZXRlKHN0cnVjdCBtZXNoX3N0YXRlICptcyk7CitzdGF0aWMgdm9pZCBzZXRfZG1hX2NtZHMoc3RydWN0IG1lc2hfc3RhdGUgKm1zLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOworc3RhdGljIHZvaWQgaGFsdF9kbWEoc3RydWN0IG1lc2hfc3RhdGUgKm1zKTsKK3N0YXRpYyB2b2lkIHBoYXNlX21pc21hdGNoKHN0cnVjdCBtZXNoX3N0YXRlICptcyk7CisKKworLyoKKyAqIFNvbWUgZGVidWdnaW5nICYgbG9nZ2luZyByb3V0aW5lcworICovCisKKyNpZmRlZiBNRVNIX0RCRworCitzdGF0aWMgaW5saW5lIHUzMiByZWFkdGIodm9pZCkKK3sKKwl1MzIgdGI7CisKKyNpZmRlZiBEQkdfVVNFX1RCCisJLyogQmV3YXJlOiBpZiB5b3UgZW5hYmxlIHRoaXMsIGl0IHdpbGwgY3Jhc2ggb24gNjAxcy4gKi8KKwlhc20gKCJtZnRiICUwIiA6ICI9ciIgKHRiKSA6ICk7CisjZWxzZQorCXRiID0gMDsKKyNlbmRpZgorCXJldHVybiB0YjsKK30KKworc3RhdGljIHZvaWQgZGxvZyhzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMsIGNoYXIgKmZtdCwgaW50IGEpCit7CisJc3RydWN0IG1lc2hfdGFyZ2V0ICp0cCA9ICZtcy0+dGd0c1ttcy0+Y29ubl90Z3RdOworCXN0cnVjdCBkYmdsb2cgKnRscCwgKnNscDsKKworCXRscCA9ICZ0cC0+bG9nW3RwLT5sb2dfaXhdOworCXNscCA9ICZtcy0+bG9nW21zLT5sb2dfaXhdOworCXRscC0+Zm10ID0gZm10OworCXRscC0+dGIgPSByZWFkdGIoKTsKKwl0bHAtPnBoYXNlID0gKG1zLT5tc2dwaGFzZSA8PCA0KSArIG1zLT5waGFzZTsKKwl0bHAtPmJzMCA9IG1zLT5tZXNoLT5idXNfc3RhdHVzMDsKKwl0bHAtPmJzMSA9IG1zLT5tZXNoLT5idXNfc3RhdHVzMTsKKwl0bHAtPnRndCA9IG1zLT5jb25uX3RndDsKKwl0bHAtPmQgPSBhOworCSpzbHAgPSAqdGxwOworCWlmICgrK3RwLT5sb2dfaXggPj0gTl9EQkdfTE9HKQorCQl0cC0+bG9nX2l4ID0gMDsKKwlpZiAodHAtPm5fbG9nIDwgTl9EQkdfTE9HKQorCQkrK3RwLT5uX2xvZzsKKwlpZiAoKyttcy0+bG9nX2l4ID49IE5fREJHX1NMT0cpCisJCW1zLT5sb2dfaXggPSAwOworCWlmIChtcy0+bl9sb2cgPCBOX0RCR19TTE9HKQorCQkrK21zLT5uX2xvZzsKK30KKworc3RhdGljIHZvaWQgZHVtcGxvZyhzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMsIGludCB0KQoreworCXN0cnVjdCBtZXNoX3RhcmdldCAqdHAgPSAmbXMtPnRndHNbdF07CisJc3RydWN0IGRiZ2xvZyAqbHA7CisJaW50IGk7CisKKwlpZiAodHAtPm5fbG9nID09IDApCisJCXJldHVybjsKKwlpID0gdHAtPmxvZ19peCAtIHRwLT5uX2xvZzsKKwlpZiAoaSA8IDApCisJCWkgKz0gTl9EQkdfTE9HOworCXRwLT5uX2xvZyA9IDA7CisJZG8geworCQlscCA9ICZ0cC0+bG9nW2ldOworCQlwcmludGsoS0VSTl9ERUJVRyAibWVzaCBsb2cgJWQ6IGJzPSUuMnglLjJ4IHBoPSUuMnggIiwKKwkJICAgICAgIHQsIGxwLT5iczEsIGxwLT5iczAsIGxwLT5waGFzZSk7CisjaWZkZWYgREJHX1VTRV9UQgorCQlwcmludGsoInRiPSUxMHUgIiwgbHAtPnRiKTsKKyNlbmRpZgorCQlwcmludGsobHAtPmZtdCwgbHAtPmQpOworCQlwcmludGsoIlxuIik7CisJCWlmICgrK2kgPj0gTl9EQkdfTE9HKQorCQkJaSA9IDA7CisJfSB3aGlsZSAoaSAhPSB0cC0+bG9nX2l4KTsKK30KKworc3RhdGljIHZvaWQgZHVtcHNsb2coc3RydWN0IG1lc2hfc3RhdGUgKm1zKQoreworCXN0cnVjdCBkYmdsb2cgKmxwOworCWludCBpOworCisJaWYgKG1zLT5uX2xvZyA9PSAwKQorCQlyZXR1cm47CisJaSA9IG1zLT5sb2dfaXggLSBtcy0+bl9sb2c7CisJaWYgKGkgPCAwKQorCQlpICs9IE5fREJHX1NMT0c7CisJbXMtPm5fbG9nID0gMDsKKwlkbyB7CisJCWxwID0gJm1zLT5sb2dbaV07CisJCXByaW50ayhLRVJOX0RFQlVHICJtZXNoIGxvZzogYnM9JS4yeCUuMnggcGg9JS4yeCB0JWQgIiwKKwkJICAgICAgIGxwLT5iczEsIGxwLT5iczAsIGxwLT5waGFzZSwgbHAtPnRndCk7CisjaWZkZWYgREJHX1VTRV9UQgorCQlwcmludGsoInRiPSUxMHUgIiwgbHAtPnRiKTsKKyNlbmRpZgorCQlwcmludGsobHAtPmZtdCwgbHAtPmQpOworCQlwcmludGsoIlxuIik7CisJCWlmICgrK2kgPj0gTl9EQkdfU0xPRykKKwkJCWkgPSAwOworCX0gd2hpbGUgKGkgIT0gbXMtPmxvZ19peCk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbG9nKHN0cnVjdCBtZXNoX3N0YXRlICptcywgY2hhciAqZm10LCBpbnQgYSkKK3t9CitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcGxvZyhzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMsIGludCB0Z3QpCit7fQorc3RhdGljIGlubGluZSB2b2lkIGR1bXBzbG9nKHN0cnVjdCBtZXNoX3N0YXRlICptcykKK3t9CisKKyNlbmRpZiAvKiBNRVNIX0RCRyAqLworCisjZGVmaW5lIE1LV09SRChhLCBiLCBjLCBkKQkoKChhKSA8PCAyNCkgKyAoKGIpIDw8IDE2KSArICgoYykgPDwgOCkgKyAoZCkpCisKK3N0YXRpYyB2b2lkCittZXNoX2R1bXBfcmVncyhzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMpCit7CisJdm9sYXRpbGUgc3RydWN0IG1lc2hfcmVncyBfX2lvbWVtICptciA9IG1zLT5tZXNoOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKm1kID0gbXMtPmRtYTsKKwlpbnQgdDsKKwlzdHJ1Y3QgbWVzaF90YXJnZXQgKnRwOworCisJcHJpbnRrKEtFUk5fREVCVUcgIm1lc2g6IHN0YXRlIGF0ICVwLCByZWdzIGF0ICVwLCBkbWEgYXQgJXBcbiIsCisJICAgICAgIG1zLCBtciwgbWQpOworCXByaW50ayhLRVJOX0RFQlVHICIgICAgY3Q9JTR4IHNlcT0lMnggYnM9JTR4IGZjPSUyeCAiCisJICAgICAgICJleGM9JTJ4IGVycj0lMnggaW09JTJ4IGludD0lMnggc3A9JTJ4XG4iLAorCSAgICAgICAobXItPmNvdW50X2hpIDw8IDgpICsgbXItPmNvdW50X2xvLCBtci0+c2VxdWVuY2UsCisJICAgICAgIChtci0+YnVzX3N0YXR1czEgPDwgOCkgKyBtci0+YnVzX3N0YXR1czAsIG1yLT5maWZvX2NvdW50LAorCSAgICAgICBtci0+ZXhjZXB0aW9uLCBtci0+ZXJyb3IsIG1yLT5pbnRyX21hc2ssIG1yLT5pbnRlcnJ1cHQsCisJICAgICAgIG1yLT5zeW5jX3BhcmFtcyk7CisJd2hpbGUoaW5fOCgmbXItPmZpZm9fY291bnQpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiIGZpZm8gZGF0YT0lLjJ4XG4iLGluXzgoJm1yLT5maWZvKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgICBkbWEgc3RhdD0leCBjbWRwdHI9JXhcbiIsCisJICAgICAgIGluX2xlMzIoJm1kLT5zdGF0dXMpLCBpbl9sZTMyKCZtZC0+Y21kcHRyKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgICBwaGFzZT0lZCBtc2dwaGFzZT0lZCBjb25uX3RndD0lZCBkYXRhX3B0cj0lZFxuIiwKKwkgICAgICAgbXMtPnBoYXNlLCBtcy0+bXNncGhhc2UsIG1zLT5jb25uX3RndCwgbXMtPmRhdGFfcHRyKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICAgIGRtYV9zdD0lZCBkbWFfY3Q9JWQgbl9tc2dvdXQ9JWRcbiIsCisJICAgICAgIG1zLT5kbWFfc3RhcnRlZCwgbXMtPmRtYV9jb3VudCwgbXMtPm5fbXNnb3V0KTsKKwlmb3IgKHQgPSAwOyB0IDwgODsgKyt0KSB7CisJCXRwID0gJm1zLT50Z3RzW3RdOworCQlpZiAodHAtPmN1cnJlbnRfcmVxID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgICB0YXJnZXQgJWQ6IHJlcT0lcCBnb2VzX291dD0lZCBzYXZlZF9wdHI9JWRcbiIsCisJCSAgICAgICB0LCB0cC0+Y3VycmVudF9yZXEsIHRwLT5kYXRhX2dvZXNfb3V0LCB0cC0+c2F2ZWRfcHRyKTsKKwl9Cit9CisKKworLyoKKyAqIEZsdXNoIHdyaXRlIGJ1ZmZlcnMgb24gdGhlIGJ1cyBwYXRoIHRvIHRoZSBtZXNoCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtZXNoX2ZsdXNoX2lvKHZvbGF0aWxlIHN0cnVjdCBtZXNoX3JlZ3MgX19pb21lbSAqbXIpCit7CisJKHZvaWQpaW5fOCgmbXItPm1lc2hfaWQpOworfQorCisKKy8qCisgKiBDb21wbGV0ZSBhIFNDU0kgY29tbWFuZAorICovCitzdGF0aWMgdm9pZCBtZXNoX2NvbXBsZXRlZChzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwkoKmNtZC0+c2NzaV9kb25lKShjbWQpOworfQorCisKKy8qIENhbGxlZCB3aXRoICBtZXNoaW50ZXJydXB0IGRpc2FibGVkLCBpbml0aWFsaXplIHRoZSBjaGlwc2V0CisgKiBhbmQgZXZlbnR1YWxseSBkbyB0aGUgaW5pdGlhbCBidXMgcmVzZXQuIFRoZSBsb2NrIG11c3Qgbm90IGJlCisgKiBoZWxkIHNpbmNlIHdlIGNhbiBzY2hlZHVsZS4KKyAqLworc3RhdGljIHZvaWQgbWVzaF9pbml0KHN0cnVjdCBtZXNoX3N0YXRlICptcykKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgbWVzaF9yZWdzIF9faW9tZW0gKm1yID0gbXMtPm1lc2g7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqbWQgPSBtcy0+ZG1hOworCisJbWVzaF9mbHVzaF9pbyhtcik7CisJdWRlbGF5KDEwMCk7CisKKwkvKiBSZXNldCBjb250cm9sbGVyICovCisJb3V0X2xlMzIoJm1kLT5jb250cm9sLCAoUlVOfFBBVVNFfEZMVVNIfFdBS0UpIDw8IDE2KTsJLyogc3RvcCBkbWEgKi8KKwlvdXRfOCgmbXItPmV4Y2VwdGlvbiwgMHhmZik7CS8qIGNsZWFyIGFsbCBleGNlcHRpb24gYml0cyAqLworCW91dF84KCZtci0+ZXJyb3IsIDB4ZmYpOwkvKiBjbGVhciBhbGwgZXJyb3IgYml0cyAqLworCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9SRVNFVE1FU0gpOworCW1lc2hfZmx1c2hfaW8obXIpOworCXVkZWxheSgxMCk7CisJb3V0XzgoJm1yLT5pbnRyX21hc2ssIElOVF9FUlJPUiB8IElOVF9FWENFUFRJT04gfCBJTlRfQ01ERE9ORSk7CisJb3V0XzgoJm1yLT5zb3VyY2VfaWQsIG1zLT5ob3N0LT50aGlzX2lkKTsKKwlvdXRfOCgmbXItPnNlbF90aW1lb3V0LCAyNSk7CS8qIDI1MG1zICovCisJb3V0XzgoJm1yLT5zeW5jX3BhcmFtcywgQVNZTkNfUEFSQU1TKTsKKworCWlmIChpbml0X3Jlc2V0X2RlbGF5KSB7CisJCXByaW50ayhLRVJOX0lORk8gIm1lc2g6IHBlcmZvcm1pbmcgaW5pdGlhbCBidXMgcmVzZXQuLi5cbiIpOworCQkKKwkJLyogUmVzZXQgYnVzICovCisJCW91dF84KCZtci0+YnVzX3N0YXR1czEsIEJTMV9SU1QpOwkvKiBhc3NlcnQgUlNUICovCisJCW1lc2hfZmx1c2hfaW8obXIpOworCQl1ZGVsYXkoMzApOwkJCS8qIGxlYXZlIGl0IG9uIGZvciA+PSAyNXVzICovCisJCW91dF84KCZtci0+YnVzX3N0YXR1czEsIDApOwkvKiBuZWdhdGUgUlNUICovCisJCW1lc2hfZmx1c2hfaW8obXIpOworCisJCS8qIFdhaXQgZm9yIGJ1cyB0byBjb21lIGJhY2sgKi8KKwkJbXNsZWVwKGluaXRfcmVzZXRfZGVsYXkpOworCX0KKwkKKwkvKiBSZWNvbmZpZ3VyZSBjb250cm9sbGVyICovCisJb3V0XzgoJm1yLT5pbnRlcnJ1cHQsIDB4ZmYpOwkvKiBjbGVhciBhbGwgaW50ZXJydXB0IGJpdHMgKi8KKwlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfRkxVU0hGSUZPKTsKKwltZXNoX2ZsdXNoX2lvKG1yKTsKKwl1ZGVsYXkoMSk7CisJb3V0XzgoJm1yLT5zeW5jX3BhcmFtcywgQVNZTkNfUEFSQU1TKTsKKwlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfRU5CUkVTRUwpOworCisJbXMtPnBoYXNlID0gaWRsZTsKKwltcy0+bXNncGhhc2UgPSBtc2dfbm9uZTsKK30KKworCitzdGF0aWMgdm9pZCBtZXNoX3N0YXJ0X2NtZChzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgbWVzaF9yZWdzIF9faW9tZW0gKm1yID0gbXMtPm1lc2g7CisJaW50IHQsIGlkOworCisJaWQgPSBjbWQtPmRldmljZS0+aWQ7CisJbXMtPmN1cnJlbnRfcmVxID0gY21kOworCW1zLT50Z3RzW2lkXS5kYXRhX2dvZXNfb3V0ID0gY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFOworCW1zLT50Z3RzW2lkXS5jdXJyZW50X3JlcSA9IGNtZDsKKworI2lmIDEKKwlpZiAoREVCVUdfVEFSR0VUKGNtZCkpIHsKKwkJaW50IGk7CisJCXByaW50ayhLRVJOX0RFQlVHICJtZXNoX3N0YXJ0OiAlcCBzZXI9JWx1IHRndD0lZCBjbWQ9IiwKKwkJICAgICAgIGNtZCwgY21kLT5zZXJpYWxfbnVtYmVyLCBpZCk7CisJCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNtZF9sZW47ICsraSkKKwkJCXByaW50aygiICV4IiwgY21kLT5jbW5kW2ldKTsKKwkJcHJpbnRrKCIgdXNlX3NnPSVkIGJ1ZmZlcj0lcCBidWZmbGVuPSV1XG4iLAorCQkgICAgICAgY21kLT51c2Vfc2csIGNtZC0+cmVxdWVzdF9idWZmZXIsIGNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwl9CisjZW5kaWYKKwlpZiAobXMtPmRtYV9zdGFydGVkKQorCQlwYW5pYygibWVzaDogZG91YmxlIERNQSBzdGFydCAhXG4iKTsKKworCW1zLT5waGFzZSA9IGFyYml0cmF0aW5nOworCW1zLT5tc2dwaGFzZSA9IG1zZ19ub25lOworCW1zLT5kYXRhX3B0ciA9IDA7CisJbXMtPmRtYV9zdGFydGVkID0gMDsKKwltcy0+bl9tc2dvdXQgPSAwOworCW1zLT5sYXN0X25fbXNnb3V0ID0gMDsKKwltcy0+ZXhwZWN0X3JlcGx5ID0gMDsKKwltcy0+Y29ubl90Z3QgPSBpZDsKKwltcy0+dGd0c1tpZF0uc2F2ZWRfcHRyID0gMDsKKwltcy0+c3RhdCA9IERJRF9PSzsKKwltcy0+YWJvcnRpbmcgPSAwOworI2lmZGVmIE1FU0hfREJHCisJbXMtPnRndHNbaWRdLm5fbG9nID0gMDsKKwlkbG9nKG1zLCAic3RhcnQgY21kPSV4IiwgKGludCkgY21kKTsKKyNlbmRpZgorCisJLyogT2ZmIHdlIGdvICovCisJZGxvZyhtcywgImFib3V0IHRvIGFyYiwgaW50ci9leGMvZXJyL2ZjPSUuOHgiLAorCSAgICAgTUtXT1JEKG1yLT5pbnRlcnJ1cHQsIG1yLT5leGNlcHRpb24sIG1yLT5lcnJvciwgbXItPmZpZm9fY291bnQpKTsKKwlvdXRfOCgmbXItPmludGVycnVwdCwgSU5UX0NNRERPTkUpOworCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9FTkJSRVNFTCk7CisJbWVzaF9mbHVzaF9pbyhtcik7CisJdWRlbGF5KDEpOworCisJaWYgKGluXzgoJm1yLT5idXNfc3RhdHVzMSkgJiAoQlMxX0JTWSB8IEJTMV9TRUwpKSB7CisJCS8qCisJCSAqIFNvbWUgb3RoZXIgZGV2aWNlIGhhcyB0aGUgYnVzIG9yIGlzIGFyYml0cmF0aW5nIGZvciBpdCAtCisJCSAqIHByb2JhYmx5IGEgdGFyZ2V0IHdoaWNoIGlzIGFib3V0IHRvIHJlc2VsZWN0IHVzLgorCQkgKi8KKwkJZGxvZyhtcywgImJ1c3kgYjQgYXJiLCBpbnRyL2V4Yy9lcnIvZmM9JS44eCIsCisJCSAgICAgTUtXT1JEKG1yLT5pbnRlcnJ1cHQsIG1yLT5leGNlcHRpb24sCisJCQkgICAgbXItPmVycm9yLCBtci0+Zmlmb19jb3VudCkpOworCQlmb3IgKHQgPSAxMDA7IHQgPiAwOyAtLXQpIHsKKwkJCWlmICgoaW5fOCgmbXItPmJ1c19zdGF0dXMxKSAmIChCUzFfQlNZIHwgQlMxX1NFTCkpID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoaW5fOCgmbXItPmludGVycnVwdCkgIT0gMCkgeworCQkJCWRsb2cobXMsICJpbnRyIGI0IGFyYiwgaW50ci9leGMvZXJyL2ZjPSUuOHgiLAorCQkJCSAgICAgTUtXT1JEKG1yLT5pbnRlcnJ1cHQsIG1yLT5leGNlcHRpb24sCisJCQkJCSAgICBtci0+ZXJyb3IsIG1yLT5maWZvX2NvdW50KSk7CisJCQkJbWVzaF9pbnRlcnJ1cHQoMCwgKHZvaWQgKiltcywgTlVMTCk7CisJCQkJaWYgKG1zLT5waGFzZSAhPSBhcmJpdHJhdGluZykKKwkJCQkJcmV0dXJuOworCQkJfQorCQkJdWRlbGF5KDEpOworCQl9CisJCWlmIChpbl84KCZtci0+YnVzX3N0YXR1czEpICYgKEJTMV9CU1kgfCBCUzFfU0VMKSkgeworCQkJLyogWFhYIHNob3VsZCB0cnkgYWdhaW4gaW4gYSBsaXR0bGUgd2hpbGUgKi8KKwkJCW1zLT5zdGF0ID0gRElEX0JVU19CVVNZOworCQkJbXMtPnBoYXNlID0gaWRsZTsKKwkJCW1lc2hfZG9uZShtcywgMCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKgorCSAqIEFwcGFyZW50bHkgdGhlIG1lc2ggaGFzIGEgYnVnIHdoZXJlIGl0IHdpbGwgYXNzZXJ0IGJvdGggaXRzCisJICogb3duIGJpdCBhbmQgdGhlIHRhcmdldCdzIGJpdCBvbiB0aGUgYnVzIGR1cmluZyBhcmJpdHJhdGlvbi4KKwkgKi8KKwlvdXRfOCgmbXItPmRlc3RfaWQsIG1yLT5zb3VyY2VfaWQpOworCisJLyoKKwkgKiBUaGVyZSBhcHBlYXJzIHRvIGJlIGEgcmFjZSB3aXRoIHJlc2VsZWN0aW9uIHNvbWV0aW1lcywKKwkgKiB3aGVyZSBhIHRhcmdldCByZXNlbGVjdHMgdXMganVzdCBhcyB3ZSBpc3N1ZSB0aGUKKwkgKiBhcmJpdHJhdGUgY29tbWFuZC4gIEl0IHNlZW1zIHRoYXQgdGhlbiB0aGUgYXJiaXRyYXRlCisJICogY29tbWFuZCBqdXN0IGhhbmdzIHdhaXRpbmcgZm9yIHRoZSBidXMgdG8gYmUgZnJlZQorCSAqIHdpdGhvdXQgZ2l2aW5nIHVzIGEgcmVzZWxlY3Rpb24gZXhjZXB0aW9uLgorCSAqIFRoZSBvbmx5IHdheSBJIGhhdmUgZm91bmQgdG8gZ2V0IGl0IHRvIHJlc3BvbmQgY29ycmVjdGx5CisJICogaXMgdGhpczogZGlzYWJsZSByZXNlbGVjdGlvbiBiZWZvcmUgaXNzdWluZyB0aGUgYXJiaXRyYXRlCisJICogY29tbWFuZCwgdGhlbiBhZnRlciBpc3N1aW5nIGl0LCBpZiBpdCBsb29rcyBsaWtlIGEgdGFyZ2V0CisJICogaXMgdHJ5aW5nIHRvIHJlc2VsZWN0IHVzLCByZXNldCB0aGUgbWVzaCBhbmQgdGhlbiBlbmFibGUKKwkgKiByZXNlbGVjdGlvbi4KKwkgKi8KKwlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfRElTUkVTRUwpOworCWlmIChpbl84KCZtci0+aW50ZXJydXB0KSAhPSAwKSB7CisJCWRsb2cobXMsICJpbnRyIGFmdGVyIGRpc3Jlc2VsLCBpbnRyL2V4Yy9lcnIvZmM9JS44eCIsCisJCSAgICAgTUtXT1JEKG1yLT5pbnRlcnJ1cHQsIG1yLT5leGNlcHRpb24sCisJCQkgICAgbXItPmVycm9yLCBtci0+Zmlmb19jb3VudCkpOworCQltZXNoX2ludGVycnVwdCgwLCAodm9pZCAqKW1zLCBOVUxMKTsKKwkJaWYgKG1zLT5waGFzZSAhPSBhcmJpdHJhdGluZykKKwkJCXJldHVybjsKKwkJZGxvZyhtcywgImFmdGVyIGludHIgYWZ0ZXIgZGlzcmVzZWwsIGludHIvZXhjL2Vyci9mYz0lLjh4IiwKKwkJICAgICBNS1dPUkQobXItPmludGVycnVwdCwgbXItPmV4Y2VwdGlvbiwKKwkJCSAgICBtci0+ZXJyb3IsIG1yLT5maWZvX2NvdW50KSk7CisJfQorCisJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX0FSQklUUkFURSk7CisKKwlmb3IgKHQgPSAyMzA7IHQgPiAwOyAtLXQpIHsKKwkJaWYgKGluXzgoJm1yLT5pbnRlcnJ1cHQpICE9IDApCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCX0KKwlkbG9nKG1zLCAiYWZ0ZXIgYXJiLCBpbnRyL2V4Yy9lcnIvZmM9JS44eCIsCisJICAgICBNS1dPUkQobXItPmludGVycnVwdCwgbXItPmV4Y2VwdGlvbiwgbXItPmVycm9yLCBtci0+Zmlmb19jb3VudCkpOworCWlmIChpbl84KCZtci0+aW50ZXJydXB0KSA9PSAwICYmIChpbl84KCZtci0+YnVzX3N0YXR1czEpICYgQlMxX1NFTCkKKwkgICAgJiYgKGluXzgoJm1yLT5idXNfc3RhdHVzMCkgJiBCUzBfSU8pKSB7CisJCS8qIGxvb2tzIGxpa2UgYSByZXNlbGVjdGlvbiAtIHRyeSByZXNldHRpbmcgdGhlIG1lc2ggKi8KKwkJZGxvZyhtcywgInJlc2VsPyBhZnRlciBhcmIsIGludHIvZXhjL2Vyci9mYz0lLjh4IiwKKwkJICAgICBNS1dPUkQobXItPmludGVycnVwdCwgbXItPmV4Y2VwdGlvbiwgbXItPmVycm9yLCBtci0+Zmlmb19jb3VudCkpOworCQlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfUkVTRVRNRVNIKTsKKwkJbWVzaF9mbHVzaF9pbyhtcik7CisJCXVkZWxheSgxMCk7CisJCW91dF84KCZtci0+aW50ZXJydXB0LCBJTlRfRVJST1IgfCBJTlRfRVhDRVBUSU9OIHwgSU5UX0NNRERPTkUpOworCQlvdXRfOCgmbXItPmludHJfbWFzaywgSU5UX0VSUk9SIHwgSU5UX0VYQ0VQVElPTiB8IElOVF9DTURET05FKTsKKwkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX0VOQlJFU0VMKTsKKwkJbWVzaF9mbHVzaF9pbyhtcik7CisJCWZvciAodCA9IDEwOyB0ID4gMCAmJiBpbl84KCZtci0+aW50ZXJydXB0KSA9PSAwOyAtLXQpCisJCQl1ZGVsYXkoMSk7CisJCWRsb2cobXMsICJ0cmllZCByZXNldCBhZnRlciBhcmIsIGludHIvZXhjL2Vyci9mYz0lLjh4IiwKKwkJICAgICBNS1dPUkQobXItPmludGVycnVwdCwgbXItPmV4Y2VwdGlvbiwgbXItPmVycm9yLCBtci0+Zmlmb19jb3VudCkpOworI2lmbmRlZiBNRVNIX01VTFRJUExFX0hPU1RTCisJCWlmIChpbl84KCZtci0+aW50ZXJydXB0KSA9PSAwICYmIChpbl84KCZtci0+YnVzX3N0YXR1czEpICYgQlMxX1NFTCkKKwkJICAgICYmIChpbl84KCZtci0+YnVzX3N0YXR1czApICYgQlMwX0lPKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJtZXNoOiBjb250cm9sbGVyIG5vdCByZXNwb25kaW5nIgorCQkJICAgICAgICIgdG8gcmVzZWxlY3Rpb24hXG4iKTsKKwkJCS8qCisJCQkgKiBJZiB0aGlzIGlzIGEgdGFyZ2V0IHJlc2VsZWN0aW5nIHVzLCBhbmQgdGhlCisJCQkgKiBtZXNoIGlzbid0IHJlc3BvbmRpbmcsIHRoZSBoaWdoZXIgbGV2ZWxzIG9mCisJCQkgKiB0aGUgc2NzaSBjb2RlIHdpbGwgZXZlbnR1YWxseSB0aW1lIG91dCBhbmQKKwkJCSAqIHJlc2V0IHRoZSBidXMuCisJCQkgKi8KKwkJfQorI2VuZGlmCisJfQorfQorCisvKgorICogU3RhcnQgdGhlIG5leHQgY29tbWFuZCBmb3IgYSBNRVNILgorICogU2hvdWxkIGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyB2b2lkIG1lc2hfc3RhcnQoc3RydWN0IG1lc2hfc3RhdGUgKm1zKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgKnByZXYsICpuZXh0OworCisJaWYgKG1zLT5waGFzZSAhPSBpZGxlIHx8IG1zLT5jdXJyZW50X3JlcSAhPSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW5hcHByb3ByaWF0ZSBtZXNoX3N0YXJ0IChwaGFzZT0lZCwgbXM9JXApIiwKKwkJICAgICAgIG1zLT5waGFzZSwgbXMpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKG1zLT5waGFzZSA9PSBpZGxlKSB7CisJCXByZXYgPSBOVUxMOworCQlmb3IgKGNtZCA9IG1zLT5yZXF1ZXN0X3E7IDsgY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgY21kLT5ob3N0X3NjcmliYmxlKSB7CisJCQlpZiAoY21kID09IE5VTEwpCisJCQkJcmV0dXJuOworCQkJaWYgKG1zLT50Z3RzW2NtZC0+ZGV2aWNlLT5pZF0uY3VycmVudF9yZXEgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCXByZXYgPSBjbWQ7CisJCX0KKwkJbmV4dCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNtZC0+aG9zdF9zY3JpYmJsZTsKKwkJaWYgKHByZXYgPT0gTlVMTCkKKwkJCW1zLT5yZXF1ZXN0X3EgPSBuZXh0OworCQllbHNlCisJCQlwcmV2LT5ob3N0X3NjcmliYmxlID0gKHZvaWQgKikgbmV4dDsKKwkJaWYgKG5leHQgPT0gTlVMTCkKKwkJCW1zLT5yZXF1ZXN0X3F0YWlsID0gcHJldjsKKworCQltZXNoX3N0YXJ0X2NtZChtcywgY21kKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1lc2hfZG9uZShzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMsIGludCBzdGFydF9uZXh0KQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwlzdHJ1Y3QgbWVzaF90YXJnZXQgKnRwID0gJm1zLT50Z3RzW21zLT5jb25uX3RndF07CisKKwljbWQgPSBtcy0+Y3VycmVudF9yZXE7CisJbXMtPmN1cnJlbnRfcmVxID0gTlVMTDsKKwl0cC0+Y3VycmVudF9yZXEgPSBOVUxMOworCWlmIChjbWQpIHsKKwkJY21kLT5yZXN1bHQgPSAobXMtPnN0YXQgPDwgMTYpICsgY21kLT5TQ3AuU3RhdHVzOworCQlpZiAobXMtPnN0YXQgPT0gRElEX09LKQorCQkJY21kLT5yZXN1bHQgKz0gKGNtZC0+U0NwLk1lc3NhZ2UgPDwgOCk7CisJCWlmIChERUJVR19UQVJHRVQoY21kKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIm1lc2hfZG9uZTogcmVzdWx0ID0gJXgsIGRhdGFfcHRyPSVkLCBidWZsZW49JWRcbiIsCisJCQkgICAgICAgY21kLT5yZXN1bHQsIG1zLT5kYXRhX3B0ciwgY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCQkJaWYgKChjbWQtPmNtbmRbMF0gPT0gMCB8fCBjbWQtPmNtbmRbMF0gPT0gMHgxMiB8fCBjbWQtPmNtbmRbMF0gPT0gMykKKwkJCSAgICAmJiBjbWQtPnJlcXVlc3RfYnVmZmVyICE9IDApIHsKKwkJCQl1bnNpZ25lZCBjaGFyICpiID0gY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiYnVmZmVyID0gJXggJXggJXggJXggJXggJXggJXggJXhcbiIsCisJCQkJICAgICAgIGJbMF0sIGJbMV0sIGJbMl0sIGJbM10sIGJbNF0sIGJbNV0sIGJbNl0sIGJbN10pOworCQkJfQorCQl9CisJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgLT0gbXMtPmRhdGFfcHRyOworCQltZXNoX2NvbXBsZXRlZChtcywgY21kKTsKKwl9CisJaWYgKHN0YXJ0X25leHQpIHsKKwkJb3V0XzgoJm1zLT5tZXNoLT5zZXF1ZW5jZSwgU0VRX0VOQlJFU0VMKTsKKwkJbWVzaF9mbHVzaF9pbyhtcy0+bWVzaCk7CisJCXVkZWxheSgxKTsKKwkJbXMtPnBoYXNlID0gaWRsZTsKKwkJbWVzaF9zdGFydChtcyk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRkX3NkdHJfbXNnKHN0cnVjdCBtZXNoX3N0YXRlICptcykKK3sKKwlpbnQgaSA9IG1zLT5uX21zZ291dDsKKworCW1zLT5tc2dvdXRbaV0gPSBFWFRFTkRFRF9NRVNTQUdFOworCW1zLT5tc2dvdXRbaSsxXSA9IDM7CisJbXMtPm1zZ291dFtpKzJdID0gRVhURU5ERURfU0RUUjsKKwltcy0+bXNnb3V0W2krM10gPSBtZXNoX3N5bmNfcGVyaW9kLzQ7CisJbXMtPm1zZ291dFtpKzRdID0gKEFMTE9XX1NZTkMobXMtPmNvbm5fdGd0KT8gbWVzaF9zeW5jX29mZnNldDogMCk7CisJbXMtPm5fbXNnb3V0ID0gaSArIDU7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zZHRyKHN0cnVjdCBtZXNoX3N0YXRlICptcywgaW50IHBlcmlvZCwgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgbWVzaF90YXJnZXQgKnRwID0gJm1zLT50Z3RzW21zLT5jb25uX3RndF07CisJdm9sYXRpbGUgc3RydWN0IG1lc2hfcmVncyBfX2lvbWVtICptciA9IG1zLT5tZXNoOworCWludCB2LCB0cjsKKworCXRwLT5zZHRyX3N0YXRlID0gc2R0cl9kb25lOworCWlmIChvZmZzZXQgPT0gMCkgeworCQkvKiBhc3luY2hyb25vdXMgKi8KKwkJaWYgKFNZTkNfT0ZGKHRwLT5zeW5jX3BhcmFtcykpCisJCQlwcmludGsoS0VSTl9JTkZPICJtZXNoOiB0YXJnZXQgJWQgbm93IGFzeW5jaHJvbm91c1xuIiwKKwkJCSAgICAgICBtcy0+Y29ubl90Z3QpOworCQl0cC0+c3luY19wYXJhbXMgPSBBU1lOQ19QQVJBTVM7CisJCW91dF84KCZtci0+c3luY19wYXJhbXMsIEFTWU5DX1BBUkFNUyk7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBXZSBuZWVkIHRvIGNvbXB1dGUgY2VpbChjbGtfZnJlcSAqIHBlcmlvZCAvIDUwMGU2KSAtIDIKKwkgKiB3aXRob3V0IGluY3VycmluZyBvdmVyZmxvdy4KKwkgKi8KKwl2ID0gKG1zLT5jbGtfZnJlcSAvIDUwMDApICogcGVyaW9kOworCWlmICh2IDw9IDI1MDAwMCkgeworCQkvKiBzcGVjaWFsIGNhc2U6IHN5bmNfcGVyaW9kID09IDUgKiBjbGtfcGVyaW9kICovCisJCXYgPSAwOworCQkvKiB1bml0cyBvZiB0ciBhcmUgMTAwa0IvcyAqLworCQl0ciA9IChtcy0+Y2xrX2ZyZXEgKyAyNTAwMDApIC8gNTAwMDAwOworCX0gZWxzZSB7CisJCS8qIHN5bmNfcGVyaW9kID09ICh2ICsgMikgKiAyICogY2xrX3BlcmlvZCAqLworCQl2ID0gKHYgKyA5OTk5OSkgLyAxMDAwMDAgLSAyOworCQlpZiAodiA+IDE1KQorCQkJdiA9IDE1OwkvKiBvb3BzICovCisJCXRyID0gKChtcy0+Y2xrX2ZyZXEgLyAodiArIDIpKSArIDE5OTk5OSkgLyAyMDAwMDA7CisJfQorCWlmIChvZmZzZXQgPiAxNSkKKwkJb2Zmc2V0ID0gMTU7CS8qIGNhbid0IGhhcHBlbiAqLworCXRwLT5zeW5jX3BhcmFtcyA9IFNZTkNfUEFSQU1TKG9mZnNldCwgdik7CisJb3V0XzgoJm1yLT5zeW5jX3BhcmFtcywgdHAtPnN5bmNfcGFyYW1zKTsKKwlwcmludGsoS0VSTl9JTkZPICJtZXNoOiB0YXJnZXQgJWQgc3luY2hyb25vdXMgYXQgJWQuJWQgTUIvc1xuIiwKKwkgICAgICAgbXMtPmNvbm5fdGd0LCB0ci8xMCwgdHIlMTApOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9waGFzZShzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMpCit7CisJaW50IGksIHNlcSwgbmI7CisJdm9sYXRpbGUgc3RydWN0IG1lc2hfcmVncyBfX2lvbWVtICptciA9IG1zLT5tZXNoOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKm1kID0gbXMtPmRtYTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBtcy0+Y3VycmVudF9yZXE7CisJc3RydWN0IG1lc2hfdGFyZ2V0ICp0cCA9ICZtcy0+dGd0c1ttcy0+Y29ubl90Z3RdOworCisJZGxvZyhtcywgInN0YXJ0X3BoYXNlIG5tby9leGMvZmMvc2VxID0gJS44eCIsCisJICAgICBNS1dPUkQobXMtPm5fbXNnb3V0LCBtci0+ZXhjZXB0aW9uLCBtci0+Zmlmb19jb3VudCwgbXItPnNlcXVlbmNlKSk7CisJb3V0XzgoJm1yLT5pbnRlcnJ1cHQsIElOVF9FUlJPUiB8IElOVF9FWENFUFRJT04gfCBJTlRfQ01ERE9ORSk7CisJc2VxID0gdXNlX2FjdGl2ZV9uZWcgKyAobXMtPm5fbXNnb3V0PyBTRVFfQVROOiAwKTsKKwlzd2l0Y2ggKG1zLT5tc2dwaGFzZSkgeworCWNhc2UgbXNnX25vbmU6CisJCWJyZWFrOworCisJY2FzZSBtc2dfaW46CisJCW91dF84KCZtci0+Y291bnRfaGksIDApOworCQlvdXRfOCgmbXItPmNvdW50X2xvLCAxKTsKKwkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX01TR0lOICsgc2VxKTsKKwkJbXMtPm5fbXNnaW4gPSAwOworCQlyZXR1cm47CisKKwljYXNlIG1zZ19vdXQ6CisJCS8qCisJCSAqIFRvIG1ha2Ugc3VyZSBBVE4gZHJvcHMgYmVmb3JlIHdlIGFzc2VydCBBQ0sgZm9yCisJCSAqIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UsIHdlIGhhdmUgdG8gZG8gdGhlCisJCSAqIGxhc3QgYnl0ZSBzcGVjaWFsbHkuCisJCSAqLworCQlpZiAobXMtPm5fbXNnb3V0IDw9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibWVzaDogbXNnX291dCBidXQgbl9tc2dvdXQ9JWRcbiIsCisJCQkgICAgICAgbXMtPm5fbXNnb3V0KTsKKwkJCW1lc2hfZHVtcF9yZWdzKG1zKTsKKwkJCW1zLT5tc2dwaGFzZSA9IG1zZ19ub25lOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKEFMTE9XX0RFQlVHKG1zLT5jb25uX3RndCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJtZXNoOiBzZW5kaW5nICVkIG1zZyBieXRlczoiLAorCQkJICAgICAgIG1zLT5uX21zZ291dCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbXMtPm5fbXNnb3V0OyArK2kpCisJCQkJcHJpbnRrKCIgJXgiLCBtcy0+bXNnb3V0W2ldKTsKKwkJCXByaW50aygiXG4iKTsKKwkJfQorCQlkbG9nKG1zLCAibXNnb3V0IG1zZz0lLjh4IiwgTUtXT1JEKG1zLT5uX21zZ291dCwgbXMtPm1zZ291dFswXSwKKwkJCQkJCW1zLT5tc2dvdXRbMV0sIG1zLT5tc2dvdXRbMl0pKTsKKwkJb3V0XzgoJm1yLT5jb3VudF9oaSwgMCk7CisJCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9GTFVTSEZJRk8pOworCQltZXNoX2ZsdXNoX2lvKG1yKTsKKwkJdWRlbGF5KDEpOworCQkvKgorCQkgKiBJZiBBVE4gaXMgbm90IGFscmVhZHkgYXNzZXJ0ZWQsIHdlIGFzc2VydCBpdCwgdGhlbgorCQkgKiBpc3N1ZSBhIFNFUV9NU0dPVVQgdG8gZ2V0IHRoZSBtZXNoIHRvIGRyb3AgQUNLLgorCQkgKi8KKwkJaWYgKChpbl84KCZtci0+YnVzX3N0YXR1czApICYgQlMwX0FUTikgPT0gMCkgeworCQkJZGxvZyhtcywgImJ1czAgd2FzICUuMnggZXhwbGljdGx5IGFzc2VydGluZyBBVE4iLCBtci0+YnVzX3N0YXR1czApOworCQkJb3V0XzgoJm1yLT5idXNfc3RhdHVzMCwgQlMwX0FUTik7IC8qIGV4cGxpY2l0IEFUTiAqLworCQkJbWVzaF9mbHVzaF9pbyhtcik7CisJCQl1ZGVsYXkoMSk7CisJCQlvdXRfOCgmbXItPmNvdW50X2xvLCAxKTsKKwkJCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9NU0dPVVQgKyBzZXEpOworCQkJb3V0XzgoJm1yLT5idXNfc3RhdHVzMCwgMCk7IC8qIHJlbGVhc2UgZXhwbGljaXQgQVROICovCisJCQlkbG9nKG1zLCJoYWNlOiBhZnRlciBleHBsaWNpdCBBVE4gYnVzMD0lLjJ4Iixtci0+YnVzX3N0YXR1czApOworCQl9CisJCWlmIChtcy0+bl9tc2dvdXQgPT0gMSkgeworCQkJLyoKKwkJCSAqIFdlIGNhbid0IGlzc3VlIHRoZSBTRVFfTVNHT1VUIHdpdGhvdXQgQVROCisJCQkgKiB1bnRpbCB0aGUgdGFyZ2V0IGhhcyBhc3NlcnRlZCBSRVEuICBUaGUgbG9naWMKKwkJCSAqIGluIGNtZF9jb21wbGV0ZSBoYW5kbGVzIGJvdGggc2l0dWF0aW9uczoKKwkJCSAqIFJFUSBhbHJlYWR5IGFzc2VydGVkIG9yIG5vdC4KKwkJCSAqLworCQkJY21kX2NvbXBsZXRlKG1zKTsKKwkJfSBlbHNlIHsKKwkJCW91dF84KCZtci0+Y291bnRfbG8sIG1zLT5uX21zZ291dCAtIDEpOworCQkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX01TR09VVCArIHNlcSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbXMtPm5fbXNnb3V0IC0gMTsgKytpKQorCQkJCW91dF84KCZtci0+ZmlmbywgbXMtPm1zZ291dFtpXSk7CisJCX0KKwkJcmV0dXJuOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJtZXNoIGJ1Zzogc3RhcnRfcGhhc2UgbXNncGhhc2U9JWRcbiIsCisJCSAgICAgICBtcy0+bXNncGhhc2UpOworCX0KKworCXN3aXRjaCAobXMtPnBoYXNlKSB7CisJY2FzZSBzZWxlY3Rpbmc6CisJCW91dF84KCZtci0+ZGVzdF9pZCwgbXMtPmNvbm5fdGd0KTsKKwkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX1NFTEVDVCArIFNFUV9BVE4pOworCQlicmVhazsKKwljYXNlIGNvbW1hbmRpbmc6CisJCW91dF84KCZtci0+c3luY19wYXJhbXMsIHRwLT5zeW5jX3BhcmFtcyk7CisJCW91dF84KCZtci0+Y291bnRfaGksIDApOworCQlpZiAoY21kKSB7CisJCQlvdXRfOCgmbXItPmNvdW50X2xvLCBjbWQtPmNtZF9sZW4pOworCQkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX0NPTU1BTkQgKyBzZXEpOworCQkJZm9yIChpID0gMDsgaSA8IGNtZC0+Y21kX2xlbjsgKytpKQorCQkJCW91dF84KCZtci0+ZmlmbywgY21kLT5jbW5kW2ldKTsKKwkJfSBlbHNlIHsKKwkJCW91dF84KCZtci0+Y291bnRfbG8sIDYpOworCQkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX0NPTU1BTkQgKyBzZXEpOworCQkJZm9yIChpID0gMDsgaSA8IDY7ICsraSkKKwkJCQlvdXRfOCgmbXItPmZpZm8sIDApOworCQl9CisJCWJyZWFrOworCWNhc2UgZGF0YWluZzoKKwkJLyogdHJhbnNmZXIgZGF0YSwgaWYgYW55ICovCisJCWlmICghbXMtPmRtYV9zdGFydGVkKSB7CisJCQlzZXRfZG1hX2NtZHMobXMsIGNtZCk7CisJCQlvdXRfbGUzMigmbWQtPmNtZHB0ciwgdmlydF90b19waHlzKG1zLT5kbWFfY21kcykpOworCQkJb3V0X2xlMzIoJm1kLT5jb250cm9sLCAoUlVOIDw8IDE2KSB8IFJVTik7CisJCQltcy0+ZG1hX3N0YXJ0ZWQgPSAxOworCQl9CisJCW5iID0gbXMtPmRtYV9jb3VudDsKKwkJaWYgKG5iID4gMHhmZmYwKQorCQkJbmIgPSAweGZmZjA7CisJCW1zLT5kbWFfY291bnQgLT0gbmI7CisJCW1zLT5kYXRhX3B0ciArPSBuYjsKKwkJb3V0XzgoJm1yLT5jb3VudF9sbywgbmIpOworCQlvdXRfOCgmbXItPmNvdW50X2hpLCBuYiA+PiA4KTsKKwkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgKHRwLT5kYXRhX2dvZXNfb3V0PworCQkJCVNFUV9EQVRBT1VUOiBTRVFfREFUQUlOKSArIFNFUV9ETUFfTU9ERSArIHNlcSk7CisJCWJyZWFrOworCWNhc2Ugc3RhdHVzaW5nOgorCQlvdXRfOCgmbXItPmNvdW50X2hpLCAwKTsKKwkJb3V0XzgoJm1yLT5jb3VudF9sbywgMSk7CisJCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9TVEFUVVMgKyBzZXEpOworCQlicmVhazsKKwljYXNlIGJ1c2ZyZWVpbmc6CisJY2FzZSBkaXNjb25uZWN0aW5nOgorCQlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfRU5CUkVTRUwpOworCQltZXNoX2ZsdXNoX2lvKG1yKTsKKwkJdWRlbGF5KDEpOworCQlkbG9nKG1zLCAiZW5icmVzZWwgaW50ci9leGMvZXJyL2ZjPSUuOHgiLAorCQkgICAgIE1LV09SRChtci0+aW50ZXJydXB0LCBtci0+ZXhjZXB0aW9uLCBtci0+ZXJyb3IsCisJCQkgICAgbXItPmZpZm9fY291bnQpKTsKKwkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX0JVU0ZSRUUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIm1lc2g6IHN0YXJ0X3BoYXNlIGNhbGxlZCB3aXRoIHBoYXNlPSVkXG4iLAorCQkgICAgICAgbXMtPnBoYXNlKTsKKwkJZHVtcHNsb2cobXMpOworCX0KKworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X21zZ2luKHN0cnVjdCBtZXNoX3N0YXRlICptcykKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgbWVzaF9yZWdzIF9faW9tZW0gKm1yID0gbXMtPm1lc2g7CisJaW50IGksIG47CisKKwluID0gbXItPmZpZm9fY291bnQ7CisJaWYgKG4gIT0gMCkgeworCQlpID0gbXMtPm5fbXNnaW47CisJCW1zLT5uX21zZ2luID0gaSArIG47CisJCWZvciAoOyBuID4gMDsgLS1uKQorCQkJbXMtPm1zZ2luW2krK10gPSBpbl84KCZtci0+Zmlmbyk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBtc2dpbl9sZW5ndGgoc3RydWN0IG1lc2hfc3RhdGUgKm1zKQoreworCWludCBiLCBuOworCisJbiA9IDE7CisJaWYgKG1zLT5uX21zZ2luID4gMCkgeworCQliID0gbXMtPm1zZ2luWzBdOworCQlpZiAoYiA9PSAxKSB7CisJCQkvKiBleHRlbmRlZCBtZXNzYWdlICovCisJCQluID0gbXMtPm5fbXNnaW4gPCAyPyAyOiBtcy0+bXNnaW5bMV0gKyAyOworCQl9IGVsc2UgaWYgKDB4MjAgPD0gYiAmJiBiIDw9IDB4MmYpIHsKKwkJCS8qIDItYnl0ZSBtZXNzYWdlICovCisJCQluID0gMjsKKwkJfQorCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHZvaWQgcmVzZWxlY3RlZChzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMpCit7CisJdm9sYXRpbGUgc3RydWN0IG1lc2hfcmVncyBfX2lvbWVtICptciA9IG1zLT5tZXNoOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwlzdHJ1Y3QgbWVzaF90YXJnZXQgKnRwOworCWludCBiLCB0LCBwcmV2OworCisJc3dpdGNoIChtcy0+cGhhc2UpIHsKKwljYXNlIGlkbGU6CisJCWJyZWFrOworCWNhc2UgYXJiaXRyYXRpbmc6CisJCWlmICgoY21kID0gbXMtPmN1cnJlbnRfcmVxKSAhPSBOVUxMKSB7CisJCQkvKiBwdXQgdGhlIGNvbW1hbmQgYmFjayBvbiB0aGUgcXVldWUgKi8KKwkJCWNtZC0+aG9zdF9zY3JpYmJsZSA9ICh2b2lkICopIG1zLT5yZXF1ZXN0X3E7CisJCQlpZiAobXMtPnJlcXVlc3RfcSA9PSBOVUxMKQorCQkJCW1zLT5yZXF1ZXN0X3F0YWlsID0gY21kOworCQkJbXMtPnJlcXVlc3RfcSA9IGNtZDsKKwkJCXRwID0gJm1zLT50Z3RzW2NtZC0+ZGV2aWNlLT5pZF07CisJCQl0cC0+Y3VycmVudF9yZXEgPSBOVUxMOworCQl9CisJCWJyZWFrOworCWNhc2UgYnVzZnJlZWluZzoKKwkJbXMtPnBoYXNlID0gcmVzZWxlY3Rpbmc7CisJCW1lc2hfZG9uZShtcywgMCk7CisJCWJyZWFrOworCWNhc2UgZGlzY29ubmVjdGluZzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJtZXNoOiByZXNlbGVjdGVkIGluIHBoYXNlICVkLyVkIHRndCAlZFxuIiwKKwkJICAgICAgIG1zLT5tc2dwaGFzZSwgbXMtPnBoYXNlLCBtcy0+Y29ubl90Z3QpOworCQlkdW1wbG9nKG1zLCBtcy0+Y29ubl90Z3QpOworCQlkdW1wc2xvZyhtcyk7CisJfQorCisJaWYgKG1zLT5kbWFfc3RhcnRlZCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1lc2g6IHJlc2VsZWN0ZWQgd2l0aCBETUEgc3RhcnRlZCAhXG4iKTsKKwkJaGFsdF9kbWEobXMpOworCX0KKwltcy0+Y3VycmVudF9yZXEgPSBOVUxMOworCW1zLT5waGFzZSA9IGRhdGFpbmc7CisJbXMtPm1zZ3BoYXNlID0gbXNnX2luOworCW1zLT5uX21zZ291dCA9IDA7CisJbXMtPmxhc3Rfbl9tc2dvdXQgPSAwOworCXByZXYgPSBtcy0+Y29ubl90Z3Q7CisKKwkvKgorCSAqIFdlIHNlZW0gdG8gZ2V0IGFib3J0aXZlIHJlc2VsZWN0aW9ucyBzb21ldGltZXMuCisJICovCisJd2hpbGUgKChpbl84KCZtci0+YnVzX3N0YXR1czEpICYgQlMxX0JTWSkgPT0gMCkgeworCQlzdGF0aWMgaW50IG1lc2hfYWJvcnRlZF9yZXNlbHM7CisJCW1lc2hfYWJvcnRlZF9yZXNlbHMrKzsKKwkJb3V0XzgoJm1yLT5pbnRlcnJ1cHQsIElOVF9FUlJPUiB8IElOVF9FWENFUFRJT04gfCBJTlRfQ01ERE9ORSk7CisJCW1lc2hfZmx1c2hfaW8obXIpOworCQl1ZGVsYXkoMSk7CisJCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9FTkJSRVNFTCk7CisJCW1lc2hfZmx1c2hfaW8obXIpOworCQl1ZGVsYXkoNSk7CisJCWRsb2cobXMsICJleHRyYSByZXNlbCBlcnIvZXhjL2ZjID0gJS42eCIsCisJCSAgICAgTUtXT1JEKDAsIG1yLT5lcnJvciwgbXItPmV4Y2VwdGlvbiwgbXItPmZpZm9fY291bnQpKTsKKwl9CisJb3V0XzgoJm1yLT5pbnRlcnJ1cHQsIElOVF9FUlJPUiB8IElOVF9FWENFUFRJT04gfCBJTlRfQ01ERE9ORSk7CisgICAgICAgCW1lc2hfZmx1c2hfaW8obXIpOworCXVkZWxheSgxKTsKKwlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfRU5CUkVTRUwpOworICAgICAgIAltZXNoX2ZsdXNoX2lvKG1yKTsKKwl1ZGVsYXkoMSk7CisJb3V0XzgoJm1yLT5zeW5jX3BhcmFtcywgQVNZTkNfUEFSQU1TKTsKKworCS8qCisJICogRmluZCBvdXQgd2hvIHJlc2VsZWN0ZWQgdXMuCisJICovCisJaWYgKGluXzgoJm1yLT5maWZvX2NvdW50KSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWVzaDogcmVzZWxlY3Rpb24gYnV0IG5vdGhpbmcgaW4gZmlmbz9cbiIpOworCQltcy0+Y29ubl90Z3QgPSBtcy0+aG9zdC0+dGhpc19pZDsKKwkJZ290byBib2d1czsKKwl9CisJLyogZ2V0IHRoZSBsYXN0IGJ5dGUgaW4gdGhlIGZpZm8gKi8KKwlkbyB7CisJCWIgPSBpbl84KCZtci0+Zmlmbyk7CisJCWRsb2cobXMsICJyZXNlbGRhdGEgJXgiLCBiKTsKKwl9IHdoaWxlIChpbl84KCZtci0+Zmlmb19jb3VudCkpOworCWZvciAodCA9IDA7IHQgPCA4OyArK3QpCisJCWlmICgoYiAmICgxIDw8IHQpKSAhPSAwICYmIHQgIT0gbXMtPmhvc3QtPnRoaXNfaWQpCisJCQlicmVhazsKKwlpZiAoYiAhPSAoMSA8PCB0KSArICgxIDw8IG1zLT5ob3N0LT50aGlzX2lkKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1lc2g6IGJhZCByZXNlbGVjdGlvbiBkYXRhICV4XG4iLCBiKTsKKwkJbXMtPmNvbm5fdGd0ID0gbXMtPmhvc3QtPnRoaXNfaWQ7CisJCWdvdG8gYm9ndXM7CisJfQorCisKKwkvKgorCSAqIFNldCB1cCB0byBjb250aW51ZSB3aXRoIHRoYXQgdGFyZ2V0J3MgdHJhbnNmZXIuCisJICovCisJbXMtPmNvbm5fdGd0ID0gdDsKKwl0cCA9ICZtcy0+dGd0c1t0XTsKKwlvdXRfOCgmbXItPnN5bmNfcGFyYW1zLCB0cC0+c3luY19wYXJhbXMpOworCWlmIChBTExPV19ERUJVRyh0KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAibWVzaDogcmVzZWxlY3RlZCBieSB0YXJnZXQgJWRcbiIsIHQpOworCQlwcmludGsoS0VSTl9ERUJVRyAibWVzaDogc2F2ZWRfcHRyPSV4IGdvZXNfb3V0PSVkIGNtZD0lcFxuIiwKKwkJICAgICAgIHRwLT5zYXZlZF9wdHIsIHRwLT5kYXRhX2dvZXNfb3V0LCB0cC0+Y3VycmVudF9yZXEpOworCX0KKwltcy0+Y3VycmVudF9yZXEgPSB0cC0+Y3VycmVudF9yZXE7CisJaWYgKHRwLT5jdXJyZW50X3JlcSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWVzaDogcmVzZWxlY3RlZCBieSB0Z3QgJWQgYnV0IG5vIGNtZCFcbiIsIHQpOworCQlnb3RvIGJvZ3VzOworCX0KKwltcy0+ZGF0YV9wdHIgPSB0cC0+c2F2ZWRfcHRyOworCWRsb2cobXMsICJyZXNlbCBwcmV2IHRndD0lZCIsIHByZXYpOworCWRsb2cobXMsICJyZXNlbCBlcnIvZXhjPSUuNHgiLCBNS1dPUkQoMCwgMCwgbXItPmVycm9yLCBtci0+ZXhjZXB0aW9uKSk7CisJc3RhcnRfcGhhc2UobXMpOworCXJldHVybjsKKworYm9ndXM6CisJZHVtcGxvZyhtcywgbXMtPmNvbm5fdGd0KTsKKwlkdW1wc2xvZyhtcyk7CisJbXMtPmRhdGFfcHRyID0gMDsKKwltcy0+YWJvcnRpbmcgPSAxOworCXN0YXJ0X3BoYXNlKG1zKTsKK30KKworc3RhdGljIHZvaWQgZG9fYWJvcnQoc3RydWN0IG1lc2hfc3RhdGUgKm1zKQoreworCW1zLT5tc2dvdXRbMF0gPSBBQk9SVDsKKwltcy0+bl9tc2dvdXQgPSAxOworCW1zLT5hYm9ydGluZyA9IDE7CisJbXMtPnN0YXQgPSBESURfQUJPUlQ7CisJZGxvZyhtcywgImFib3J0IiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9yZXNldChzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMpCit7CisJaW50IHRndDsKKwlzdHJ1Y3QgbWVzaF90YXJnZXQgKnRwOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWVzaF9yZWdzIF9faW9tZW0gKm1yID0gbXMtPm1lc2g7CisKKwlmb3IgKHRndCA9IDA7IHRndCA8IDg7ICsrdGd0KSB7CisJCXRwID0gJm1zLT50Z3RzW3RndF07CisJCWlmICgoY21kID0gdHAtPmN1cnJlbnRfcmVxKSAhPSBOVUxMKSB7CisJCQljbWQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwkJCXRwLT5jdXJyZW50X3JlcSA9IE5VTEw7CisJCQltZXNoX2NvbXBsZXRlZChtcywgY21kKTsKKwkJfQorCQltcy0+dGd0c1t0Z3RdLnNkdHJfc3RhdGUgPSBkb19zZHRyOworCQltcy0+dGd0c1t0Z3RdLnN5bmNfcGFyYW1zID0gQVNZTkNfUEFSQU1TOworCX0KKwltcy0+Y3VycmVudF9yZXEgPSBOVUxMOworCXdoaWxlICgoY21kID0gbXMtPnJlcXVlc3RfcSkgIT0gTlVMTCkgeworCQltcy0+cmVxdWVzdF9xID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgY21kLT5ob3N0X3NjcmliYmxlOworCQljbWQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwkJbWVzaF9jb21wbGV0ZWQobXMsIGNtZCk7CisJfQorCW1zLT5waGFzZSA9IGlkbGU7CisJbXMtPm1zZ3BoYXNlID0gbXNnX25vbmU7CisJb3V0XzgoJm1yLT5pbnRlcnJ1cHQsIElOVF9FUlJPUiB8IElOVF9FWENFUFRJT04gfCBJTlRfQ01ERE9ORSk7CisJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX0ZMVVNIRklGTyk7CisgICAgICAgCW1lc2hfZmx1c2hfaW8obXIpOworCXVkZWxheSgxKTsKKwlvdXRfOCgmbXItPnN5bmNfcGFyYW1zLCBBU1lOQ19QQVJBTVMpOworCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9FTkJSRVNFTCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkb19tZXNoX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpwdHJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpkZXYgPSAoKHN0cnVjdCBtZXNoX3N0YXRlICopZGV2X2lkKS0+aG9zdDsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCW1lc2hfaW50ZXJydXB0KGlycSwgZGV2X2lkLCBwdHJlZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9lcnJvcihzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMpCit7CisJaW50IGVyciwgZXhjLCBjb3VudDsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWVzaF9yZWdzIF9faW9tZW0gKm1yID0gbXMtPm1lc2g7CisKKwllcnIgPSBpbl84KCZtci0+ZXJyb3IpOworCWV4YyA9IGluXzgoJm1yLT5leGNlcHRpb24pOworCW91dF84KCZtci0+aW50ZXJydXB0LCBJTlRfRVJST1IgfCBJTlRfRVhDRVBUSU9OIHwgSU5UX0NNRERPTkUpOworCWRsb2cobXMsICJlcnJvciBlcnIvZXhjL2ZjL2NsPSUuOHgiLAorCSAgICAgTUtXT1JEKGVyciwgZXhjLCBtci0+Zmlmb19jb3VudCwgbXItPmNvdW50X2xvKSk7CisJaWYgKGVyciAmIEVSUl9TQ1NJUkVTRVQpIHsKKwkJLyogU0NTSSBidXMgd2FzIHJlc2V0ICovCisJCXByaW50ayhLRVJOX0lORk8gIm1lc2g6IFNDU0kgYnVzIHJlc2V0IGRldGVjdGVkOiAiCisJCSAgICAgICAid2FpdGluZyBmb3IgZW5kLi4uIik7CisJCXdoaWxlICgoaW5fOCgmbXItPmJ1c19zdGF0dXMxKSAmIEJTMV9SU1QpICE9IDApCisJCQl1ZGVsYXkoMSk7CisJCXByaW50aygiZG9uZVxuIik7CisJCWhhbmRsZV9yZXNldChtcyk7CisJCS8qIHJlcXVlc3RfcSBpcyBlbXB0eSwgbm8gcG9pbnQgaW4gbWVzaF9zdGFydCgpICovCisJCXJldHVybjsKKwl9CisJaWYgKGVyciAmIEVSUl9VTkVYUERJU0MpIHsKKwkJLyogVW5leHBlY3RlZCBkaXNjb25uZWN0ICovCisJCWlmIChleGMgJiBFWENfUkVTRUxFQ1RFRCkgeworCQkJcmVzZWxlY3RlZChtcyk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCFtcy0+YWJvcnRpbmcpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lc2g6IHRhcmdldCAlZCBhYm9ydGVkXG4iLAorCQkJICAgICAgIG1zLT5jb25uX3RndCk7CisJCQlkdW1wbG9nKG1zLCBtcy0+Y29ubl90Z3QpOworCQkJZHVtcHNsb2cobXMpOworCQl9CisJCW91dF84KCZtci0+aW50ZXJydXB0LCBJTlRfQ01ERE9ORSk7CisJCW1zLT5zdGF0ID0gRElEX0FCT1JUOworCQltZXNoX2RvbmUobXMsIDEpOworCQlyZXR1cm47CisJfQorCWlmIChlcnIgJiBFUlJfUEFSSVRZKSB7CisJCWlmIChtcy0+bXNncGhhc2UgPT0gbXNnX2luKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIm1lc2g6IG1zZyBwYXJpdHkgZXJyb3IsIHRhcmdldCAlZFxuIiwKKwkJCSAgICAgICBtcy0+Y29ubl90Z3QpOworCQkJbXMtPm1zZ291dFswXSA9IE1TR19QQVJJVFlfRVJST1I7CisJCQltcy0+bl9tc2dvdXQgPSAxOworCQkJbXMtPm1zZ3BoYXNlID0gbXNnX2luX2JhZDsKKwkJCWNtZF9jb21wbGV0ZShtcyk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKG1zLT5zdGF0ID09IERJRF9PSykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJtZXNoOiBwYXJpdHkgZXJyb3IsIHRhcmdldCAlZFxuIiwKKwkJCSAgICAgICBtcy0+Y29ubl90Z3QpOworCQkJbXMtPnN0YXQgPSBESURfUEFSSVRZOworCQl9CisJCWNvdW50ID0gKG1yLT5jb3VudF9oaSA8PCA4KSArIG1yLT5jb3VudF9sbzsKKwkJaWYgKGNvdW50ID09IDApIHsKKwkJCWNtZF9jb21wbGV0ZShtcyk7CisJCX0gZWxzZSB7CisJCQkvKiByZWlzc3VlIHRoZSBkYXRhIHRyYW5zZmVyIGNvbW1hbmQgKi8KKwkJCW91dF84KCZtci0+c2VxdWVuY2UsIG1yLT5zZXF1ZW5jZSk7CisJCX0KKwkJcmV0dXJuOworCX0KKwlpZiAoZXJyICYgRVJSX1NFUUVSUikgeworCQlpZiAoZXhjICYgRVhDX1JFU0VMRUNURUQpIHsKKwkJCS8qIFRoaXMgY2FuIGhhcHBlbiBpZiB3ZSBpc3N1ZSBhIGNvbW1hbmQgdG8KKwkJCSAgIGdldCB0aGUgYnVzIGp1c3QgYWZ0ZXIgdGhlIHRhcmdldCByZXNlbGVjdHMgdXMuICovCisJCQlzdGF0aWMgaW50IG1lc2hfcmVzZWxfc2VxZXJyOworCQkJbWVzaF9yZXNlbF9zZXFlcnIrKzsKKwkJCXJlc2VsZWN0ZWQobXMpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChleGMgPT0gRVhDX1BIQVNFTU0pIHsKKwkJCXN0YXRpYyBpbnQgbWVzaF9waGFzZW1tX3NlcWVycjsKKwkJCW1lc2hfcGhhc2VtbV9zZXFlcnIrKzsKKwkJCXBoYXNlX21pc21hdGNoKG1zKTsKKwkJCXJldHVybjsKKwkJfQorCQlwcmludGsoS0VSTl9FUlIgIm1lc2g6IHNlcXVlbmNlIGVycm9yIChlcnI9JXggZXhjPSV4KVxuIiwKKwkJICAgICAgIGVyciwgZXhjKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIm1lc2g6IHVua25vd24gZXJyb3IgJXggKGV4Yz0leClcbiIsIGVyciwgZXhjKTsKKwl9CisJbWVzaF9kdW1wX3JlZ3MobXMpOworCWR1bXBsb2cobXMsIG1zLT5jb25uX3RndCk7CisJaWYgKG1zLT5waGFzZSA+IHNlbGVjdGluZyAmJiAoaW5fOCgmbXItPmJ1c19zdGF0dXMxKSAmIEJTMV9CU1kpKSB7CisJCS8qIHRyeSB0byBkbyB3aGF0IHRoZSB0YXJnZXQgd2FudHMgKi8KKwkJZG9fYWJvcnQobXMpOworCQlwaGFzZV9taXNtYXRjaChtcyk7CisJCXJldHVybjsKKwl9CisJbXMtPnN0YXQgPSBESURfRVJST1I7CisJbWVzaF9kb25lKG1zLCAxKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2V4Y2VwdGlvbihzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMpCit7CisJaW50IGV4YzsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWVzaF9yZWdzIF9faW9tZW0gKm1yID0gbXMtPm1lc2g7CisKKwlleGMgPSBpbl84KCZtci0+ZXhjZXB0aW9uKTsKKwlvdXRfOCgmbXItPmludGVycnVwdCwgSU5UX0VYQ0VQVElPTiB8IElOVF9DTURET05FKTsKKwlpZiAoZXhjICYgRVhDX1JFU0VMRUNURUQpIHsKKwkJc3RhdGljIGludCBtZXNoX3Jlc2VsX2V4YzsKKwkJbWVzaF9yZXNlbF9leGMrKzsKKwkJcmVzZWxlY3RlZChtcyk7CisJfSBlbHNlIGlmIChleGMgPT0gRVhDX0FSQkxPU1QpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm1lc2g6IGxvc3QgYXJiaXRyYXRpb25cbiIpOworCQltcy0+c3RhdCA9IERJRF9CVVNfQlVTWTsKKwkJbWVzaF9kb25lKG1zLCAxKTsKKwl9IGVsc2UgaWYgKGV4YyA9PSBFWENfU0VMVE8pIHsKKwkJLyogc2VsZWN0aW9uIHRpbWVkIG91dCAqLworCQltcy0+c3RhdCA9IERJRF9CQURfVEFSR0VUOworCQltZXNoX2RvbmUobXMsIDEpOworCX0gZWxzZSBpZiAoZXhjID09IEVYQ19QSEFTRU1NKSB7CisJCS8qIHRhcmdldCB3YW50cyB0byBkbyBzb21ldGhpbmcgZGlmZmVyZW50OgorCQkgICBmaW5kIG91dCB3aGF0IGl0IHdhbnRzIGFuZCBkbyBpdC4gKi8KKwkJcGhhc2VfbWlzbWF0Y2gobXMpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAibWVzaDogY2FuJ3QgY29wZSB3aXRoIGV4Y2VwdGlvbiAleFxuIiwgZXhjKTsKKwkJbWVzaF9kdW1wX3JlZ3MobXMpOworCQlkdW1wbG9nKG1zLCBtcy0+Y29ubl90Z3QpOworCQlkb19hYm9ydChtcyk7CisJCXBoYXNlX21pc21hdGNoKG1zKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9tc2dpbihzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMpCit7CisJaW50IGksIGNvZGU7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gbXMtPmN1cnJlbnRfcmVxOworCXN0cnVjdCBtZXNoX3RhcmdldCAqdHAgPSAmbXMtPnRndHNbbXMtPmNvbm5fdGd0XTsKKworCWlmIChtcy0+bl9tc2dpbiA9PSAwKQorCQlyZXR1cm47CisJY29kZSA9IG1zLT5tc2dpblswXTsKKwlpZiAoQUxMT1dfREVCVUcobXMtPmNvbm5fdGd0KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiZ290ICVkIG1lc3NhZ2UgYnl0ZXM6IiwgbXMtPm5fbXNnaW4pOworCQlmb3IgKGkgPSAwOyBpIDwgbXMtPm5fbXNnaW47ICsraSkKKwkJCXByaW50aygiICV4IiwgbXMtPm1zZ2luW2ldKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKwlkbG9nKG1zLCAibXNnaW4gbXNnPSUuOHgiLAorCSAgICAgTUtXT1JEKG1zLT5uX21zZ2luLCBjb2RlLCBtcy0+bXNnaW5bMV0sIG1zLT5tc2dpblsyXSkpOworCisJbXMtPmV4cGVjdF9yZXBseSA9IDA7CisJbXMtPm5fbXNnb3V0ID0gMDsKKwlpZiAobXMtPm5fbXNnaW4gPCBtc2dpbl9sZW5ndGgobXMpKQorCQlnb3RvIHJlamVjdDsKKwlpZiAoY21kKQorCQljbWQtPlNDcC5NZXNzYWdlID0gY29kZTsKKwlzd2l0Y2ggKGNvZGUpIHsKKwljYXNlIENPTU1BTkRfQ09NUExFVEU6CisJCWJyZWFrOworCWNhc2UgRVhURU5ERURfTUVTU0FHRToKKwkJc3dpdGNoIChtcy0+bXNnaW5bMl0pIHsKKwkJY2FzZSBFWFRFTkRFRF9NT0RJRllfREFUQV9QT0lOVEVSOgorCQkJbXMtPmRhdGFfcHRyICs9IChtcy0+bXNnaW5bM10gPDwgMjQpICsgbXMtPm1zZ2luWzZdCisJCQkJKyAobXMtPm1zZ2luWzRdIDw8IDE2KSArIChtcy0+bXNnaW5bNV0gPDwgOCk7CisJCQlicmVhazsKKwkJY2FzZSBFWFRFTkRFRF9TRFRSOgorCQkJaWYgKHRwLT5zZHRyX3N0YXRlICE9IHNkdHJfc2VudCkgeworCQkJCS8qIHJlcGx5IHdpdGggYW4gU0RUUiAqLworCQkJCWFkZF9zZHRyX21zZyhtcyk7CisJCQkJLyogbGltaXQgcGVyaW9kIHRvIGF0IGxlYXN0IGhpcyB2YWx1ZSwKKwkJCQkgICBvZmZzZXQgdG8gbm8gbW9yZSB0aGFuIGhpcyAqLworCQkJCWlmIChtcy0+bXNnb3V0WzNdIDwgbXMtPm1zZ2luWzNdKQorCQkJCQltcy0+bXNnb3V0WzNdID0gbXMtPm1zZ2luWzNdOworCQkJCWlmIChtcy0+bXNnb3V0WzRdID4gbXMtPm1zZ2luWzRdKQorCQkJCQltcy0+bXNnb3V0WzRdID0gbXMtPm1zZ2luWzRdOworCQkJCXNldF9zZHRyKG1zLCBtcy0+bXNnb3V0WzNdLCBtcy0+bXNnb3V0WzRdKTsKKwkJCQltcy0+bXNncGhhc2UgPSBtc2dfb3V0OworCQkJfSBlbHNlIHsKKwkJCQlzZXRfc2R0cihtcywgbXMtPm1zZ2luWzNdLCBtcy0+bXNnaW5bNF0pOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIHJlamVjdDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNBVkVfUE9JTlRFUlM6CisJCXRwLT5zYXZlZF9wdHIgPSBtcy0+ZGF0YV9wdHI7CisJCWJyZWFrOworCWNhc2UgUkVTVE9SRV9QT0lOVEVSUzoKKwkJbXMtPmRhdGFfcHRyID0gdHAtPnNhdmVkX3B0cjsKKwkJYnJlYWs7CisJY2FzZSBESVNDT05ORUNUOgorCQltcy0+cGhhc2UgPSBkaXNjb25uZWN0aW5nOworCQlicmVhazsKKwljYXNlIEFCT1JUOgorCQlicmVhazsKKwljYXNlIE1FU1NBR0VfUkVKRUNUOgorCQlpZiAodHAtPnNkdHJfc3RhdGUgPT0gc2R0cl9zZW50KQorCQkJc2V0X3NkdHIobXMsIDAsIDApOworCQlicmVhazsKKwljYXNlIE5PUDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKElERU5USUZZX0JBU0UgPD0gY29kZSAmJiBjb2RlIDw9IElERU5USUZZX0JBU0UgKyA3KSB7CisJCQlpZiAoY21kID09IE5VTEwpIHsKKwkJCQlkb19hYm9ydChtcyk7CisJCQkJbXMtPm1zZ3BoYXNlID0gbXNnX291dDsKKwkJCX0gZWxzZSBpZiAoY29kZSAhPSBjbWQtPmRldmljZS0+bHVuICsgSURFTlRJRllfQkFTRSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lc2g6IGx1biBtaXNtYXRjaCAiCisJCQkJICAgICAgICIoJWQgIT0gJWQpIG9uIHJlc2VsZWN0aW9uIGZyb20gIgorCQkJCSAgICAgICAidGFyZ2V0ICVkXG4iLCBjb2RlIC0gSURFTlRJRllfQkFTRSwKKwkJCQkgICAgICAgY21kLT5kZXZpY2UtPmx1biwgbXMtPmNvbm5fdGd0KTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWdvdG8gcmVqZWN0OworCX0KKwlyZXR1cm47CisKKyByZWplY3Q6CisJcHJpbnRrKEtFUk5fV0FSTklORyAibWVzaDogcmVqZWN0aW5nIG1lc3NhZ2UgZnJvbSB0YXJnZXQgJWQ6IiwKKwkgICAgICAgbXMtPmNvbm5fdGd0KTsKKwlmb3IgKGkgPSAwOyBpIDwgbXMtPm5fbXNnaW47ICsraSkKKwkJcHJpbnRrKCIgJXgiLCBtcy0+bXNnaW5baV0pOworCXByaW50aygiXG4iKTsKKwltcy0+bXNnb3V0WzBdID0gTUVTU0FHRV9SRUpFQ1Q7CisJbXMtPm5fbXNnb3V0ID0gMTsKKwltcy0+bXNncGhhc2UgPSBtc2dfb3V0OworfQorCisvKgorICogU2V0IHVwIERNQSBjb21tYW5kcyBmb3IgdHJhbnNmZXJyaW5nIGRhdGEuCisgKi8KK3N0YXRpYyB2b2lkIHNldF9kbWFfY21kcyhzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlpbnQgaSwgZG1hX2NtZCwgdG90YWwsIG9mZiwgZHRvdDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNjbDsKKwlzdHJ1Y3QgZGJkbWFfY21kICpkY21kczsKKworCWRtYV9jbWQgPSBtcy0+dGd0c1ttcy0+Y29ubl90Z3RdLmRhdGFfZ29lc19vdXQ/CisJCU9VVFBVVF9NT1JFOiBJTlBVVF9NT1JFOworCWRjbWRzID0gbXMtPmRtYV9jbWRzOworCWR0b3QgPSAwOworCWlmIChjbWQpIHsKKwkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCQlpZiAoY21kLT51c2Vfc2cgPiAwKSB7CisJCQlpbnQgbnNlZzsKKwkJCXRvdGFsID0gMDsKKwkJCXNjbCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgY21kLT5idWZmZXI7CisJCQlvZmYgPSBtcy0+ZGF0YV9wdHI7CisJCQluc2VnID0gcGNpX21hcF9zZyhtcy0+cGRldiwgc2NsLCBjbWQtPnVzZV9zZywKKwkJCQkJICBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJCWZvciAoaSA9IDA7IGkgPG5zZWc7ICsraSwgKytzY2wpIHsKKwkJCQl1MzIgZG1hX2FkZHIgPSBzZ19kbWFfYWRkcmVzcyhzY2wpOworCQkJCXUzMiBkbWFfbGVuID0gc2dfZG1hX2xlbihzY2wpOworCQkJCQorCQkJCXRvdGFsICs9IHNjbC0+bGVuZ3RoOworCQkJCWlmIChvZmYgPj0gZG1hX2xlbikgeworCQkJCQlvZmYgLT0gZG1hX2xlbjsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChkbWFfbGVuID4gMHhmZmZmKQorCQkJCQlwYW5pYygibWVzaDogc2NhdHRlcmxpc3QgZWxlbWVudCA+PSA2NGsiKTsKKwkJCQlzdF9sZTE2KCZkY21kcy0+cmVxX2NvdW50LCBkbWFfbGVuIC0gb2ZmKTsKKwkJCQlzdF9sZTE2KCZkY21kcy0+Y29tbWFuZCwgZG1hX2NtZCk7CisJCQkJc3RfbGUzMigmZGNtZHMtPnBoeV9hZGRyLCBkbWFfYWRkciArIG9mZik7CisJCQkJZGNtZHMtPnhmZXJfc3RhdHVzID0gMDsKKwkJCQkrK2RjbWRzOworCQkJCWR0b3QgKz0gZG1hX2xlbiAtIG9mZjsKKwkJCQlvZmYgPSAwOworCQkJfQorCQl9IGVsc2UgaWYgKG1zLT5kYXRhX3B0ciA8IGNtZC0+cmVxdWVzdF9idWZmbGVuKSB7CisJCQlkdG90ID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW4gLSBtcy0+ZGF0YV9wdHI7CisJCQlpZiAoZHRvdCA+IDB4ZmZmZikKKwkJCQlwYW5pYygibWVzaDogdHJhbnNmZXIgc2l6ZSA+PSA2NGsiKTsKKwkJCXN0X2xlMTYoJmRjbWRzLT5yZXFfY291bnQsIGR0b3QpOworCQkJLyogWFhYIFVzZSBwY2kgRE1BIEFQSSBoZXJlIC4uLiAqLworCQkJc3RfbGUzMigmZGNtZHMtPnBoeV9hZGRyLAorCQkJCXZpcnRfdG9fcGh5cyhjbWQtPnJlcXVlc3RfYnVmZmVyKSArIG1zLT5kYXRhX3B0cik7CisJCQlkY21kcy0+eGZlcl9zdGF0dXMgPSAwOworCQkJKytkY21kczsKKwkJfQorCX0KKwlpZiAoZHRvdCA9PSAwKSB7CisJCS8qIEVpdGhlciB0aGUgdGFyZ2V0IGhhcyBvdmVycnVuIG91ciBidWZmZXIsCisJCSAgIG9yIHRoZSBjYWxsZXIgZGlkbid0IHByb3ZpZGUgYSBidWZmZXIuICovCisJCXN0YXRpYyBjaGFyIG1lc2hfZXh0cmFfYnVmWzY0XTsKKworCQlkdG90ID0gc2l6ZW9mKG1lc2hfZXh0cmFfYnVmKTsKKwkJc3RfbGUxNigmZGNtZHMtPnJlcV9jb3VudCwgZHRvdCk7CisJCXN0X2xlMzIoJmRjbWRzLT5waHlfYWRkciwgdmlydF90b19waHlzKG1lc2hfZXh0cmFfYnVmKSk7CisJCWRjbWRzLT54ZmVyX3N0YXR1cyA9IDA7CisJCSsrZGNtZHM7CisJfQorCWRtYV9jbWQgKz0gT1VUUFVUX0xBU1QgLSBPVVRQVVRfTU9SRTsKKwlzdF9sZTE2KCZkY21kc1stMV0uY29tbWFuZCwgZG1hX2NtZCk7CisJbWVtc2V0KGRjbWRzLCAwLCBzaXplb2YoKmRjbWRzKSk7CisJc3RfbGUxNigmZGNtZHMtPmNvbW1hbmQsIERCRE1BX1NUT1ApOworCW1zLT5kbWFfY291bnQgPSBkdG90OworfQorCitzdGF0aWMgdm9pZCBoYWx0X2RtYShzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMpCit7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqbWQgPSBtcy0+ZG1hOworCXZvbGF0aWxlIHN0cnVjdCBtZXNoX3JlZ3MgX19pb21lbSAqbXIgPSBtcy0+bWVzaDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBtcy0+Y3VycmVudF9yZXE7CisJaW50IHQsIG5iOworCisJaWYgKCFtcy0+dGd0c1ttcy0+Y29ubl90Z3RdLmRhdGFfZ29lc19vdXQpIHsKKwkJLyogd2FpdCBhIGxpdHRsZSB3aGlsZSB1bnRpbCB0aGUgZmlmbyBkcmFpbnMgKi8KKwkJdCA9IDUwOworCQl3aGlsZSAodCA+IDAgJiYgaW5fOCgmbXItPmZpZm9fY291bnQpICE9IDAKKwkJICAgICAgICYmIChpbl9sZTMyKCZtZC0+c3RhdHVzKSAmIEFDVElWRSkgIT0gMCkgeworCQkJLS10OworCQkJdWRlbGF5KDEpOworCQl9CisJfQorCW91dF9sZTMyKCZtZC0+Y29udHJvbCwgUlVOIDw8IDE2KTsJLyogdHVybiBvZmYgUlVOIGJpdCAqLworCW5iID0gKG1yLT5jb3VudF9oaSA8PCA4KSArIG1yLT5jb3VudF9sbzsKKwlkbG9nKG1zLCAiaGFsdF9kbWEgZmMvY291bnQ9JS42eCIsCisJICAgICBNS1dPUkQoMCwgbXItPmZpZm9fY291bnQsIDAsIG5iKSk7CisJaWYgKG1zLT50Z3RzW21zLT5jb25uX3RndF0uZGF0YV9nb2VzX291dCkKKwkJbmIgKz0gbXItPmZpZm9fY291bnQ7CisJLyogbmIgaXMgdGhlIG51bWJlciBvZiBieXRlcyBub3QgeWV0IHRyYW5zZmVycmVkCisJICAgdG8vZnJvbSB0aGUgdGFyZ2V0LiAqLworCW1zLT5kYXRhX3B0ciAtPSBuYjsKKwlkbG9nKG1zLCAiZGF0YV9wdHIgJXgiLCBtcy0+ZGF0YV9wdHIpOworCWlmIChtcy0+ZGF0YV9wdHIgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWVzaDogaGFsdF9kbWE6IGRhdGFfcHRyPSVkIChuYj0lZCwgbXM9JXApXG4iLAorCQkgICAgICAgbXMtPmRhdGFfcHRyLCBuYiwgbXMpOworCQltcy0+ZGF0YV9wdHIgPSAwOworI2lmZGVmIE1FU0hfREJHCisJCWR1bXBsb2cobXMsIG1zLT5jb25uX3RndCk7CisJCWR1bXBzbG9nKG1zKTsKKyNlbmRpZiAvKiBNRVNIX0RCRyAqLworCX0gZWxzZSBpZiAoY21kICYmIGNtZC0+cmVxdWVzdF9idWZmbGVuICE9IDAgJiYKKwkJICAgbXMtPmRhdGFfcHRyID4gY21kLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm1lc2g6IHRhcmdldCAlZCBvdmVycnVuLCAiCisJCSAgICAgICAiZGF0YV9wdHI9JXggdG90YWw9JXggZ29lc19vdXQ9JWRcbiIsCisJCSAgICAgICBtcy0+Y29ubl90Z3QsIG1zLT5kYXRhX3B0ciwgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCSAgICAgICBtcy0+dGd0c1ttcy0+Y29ubl90Z3RdLmRhdGFfZ29lc19vdXQpOworCX0KKwlpZiAoY21kLT51c2Vfc2cgIT0gMCkgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCQlzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPnJlcXVlc3RfYnVmZmVyOworCQlwY2lfdW5tYXBfc2cobXMtPnBkZXYsIHNnLCBjbWQtPnVzZV9zZywgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJfQorCW1zLT5kbWFfc3RhcnRlZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHBoYXNlX21pc21hdGNoKHN0cnVjdCBtZXNoX3N0YXRlICptcykKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgbWVzaF9yZWdzIF9faW9tZW0gKm1yID0gbXMtPm1lc2g7CisJaW50IHBoYXNlOworCisJZGxvZyhtcywgInBoYXNlbW0gY2gvY2wvc2VxL2ZjPSUuOHgiLAorCSAgICAgTUtXT1JEKG1yLT5jb3VudF9oaSwgbXItPmNvdW50X2xvLCBtci0+c2VxdWVuY2UsIG1yLT5maWZvX2NvdW50KSk7CisJcGhhc2UgPSBpbl84KCZtci0+YnVzX3N0YXR1czApICYgQlMwX1BIQVNFOworCWlmIChtcy0+bXNncGhhc2UgPT0gbXNnX291dF94eHggJiYgcGhhc2UgPT0gQlBfTVNHT1VUKSB7CisJCS8qIG91dHB1dCB0aGUgbGFzdCBieXRlIG9mIHRoZSBtZXNzYWdlLCB3aXRob3V0IEFUTiAqLworCQlvdXRfOCgmbXItPmNvdW50X2xvLCAxKTsKKwkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX01TR09VVCArIHVzZV9hY3RpdmVfbmVnKTsKKwkJbWVzaF9mbHVzaF9pbyhtcik7CisJCXVkZWxheSgxKTsKKwkJb3V0XzgoJm1yLT5maWZvLCBtcy0+bXNnb3V0W21zLT5uX21zZ291dC0xXSk7CisJCW1zLT5tc2dwaGFzZSA9IG1zZ19vdXRfbGFzdDsKKwkJcmV0dXJuOworCX0KKworCWlmIChtcy0+bXNncGhhc2UgPT0gbXNnX2luKSB7CisJCWdldF9tc2dpbihtcyk7CisJCWlmIChtcy0+bl9tc2dpbikKKwkJCWhhbmRsZV9tc2dpbihtcyk7CisJfQorCisJaWYgKG1zLT5kbWFfc3RhcnRlZCkKKwkJaGFsdF9kbWEobXMpOworCWlmIChtci0+Zmlmb19jb3VudCkgeworCQlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfRkxVU0hGSUZPKTsKKwkJbWVzaF9mbHVzaF9pbyhtcik7CisJCXVkZWxheSgxKTsKKwl9CisKKwltcy0+bXNncGhhc2UgPSBtc2dfbm9uZTsKKwlzd2l0Y2ggKHBoYXNlKSB7CisJY2FzZSBCUF9EQVRBSU46CisJCW1zLT50Z3RzW21zLT5jb25uX3RndF0uZGF0YV9nb2VzX291dCA9IDA7CisJCW1zLT5waGFzZSA9IGRhdGFpbmc7CisJCWJyZWFrOworCWNhc2UgQlBfREFUQU9VVDoKKwkJbXMtPnRndHNbbXMtPmNvbm5fdGd0XS5kYXRhX2dvZXNfb3V0ID0gMTsKKwkJbXMtPnBoYXNlID0gZGF0YWluZzsKKwkJYnJlYWs7CisJY2FzZSBCUF9DT01NQU5EOgorCQltcy0+cGhhc2UgPSBjb21tYW5kaW5nOworCQlicmVhazsKKwljYXNlIEJQX1NUQVRVUzoKKwkJbXMtPnBoYXNlID0gc3RhdHVzaW5nOworCQlicmVhazsKKwljYXNlIEJQX01TR0lOOgorCQltcy0+bXNncGhhc2UgPSBtc2dfaW47CisJCW1zLT5uX21zZ2luID0gMDsKKwkJYnJlYWs7CisJY2FzZSBCUF9NU0dPVVQ6CisJCW1zLT5tc2dwaGFzZSA9IG1zZ19vdXQ7CisJCWlmIChtcy0+bl9tc2dvdXQgPT0gMCkgeworCQkJaWYgKG1zLT5hYm9ydGluZykgeworCQkJCWRvX2Fib3J0KG1zKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG1zLT5sYXN0X25fbXNnb3V0ID09IDApIHsKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkJICAgICAgICJtZXNoOiBubyBtc2cgdG8gcmVwZWF0XG4iKTsKKwkJCQkJbXMtPm1zZ291dFswXSA9IE5PUDsKKwkJCQkJbXMtPmxhc3Rfbl9tc2dvdXQgPSAxOworCQkJCX0KKwkJCQltcy0+bl9tc2dvdXQgPSBtcy0+bGFzdF9uX21zZ291dDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9ERUJVRyAibWVzaDogdW5rbm93biBzY3NpIHBoYXNlICV4XG4iLCBwaGFzZSk7CisJCW1zLT5zdGF0ID0gRElEX0VSUk9SOworCQltZXNoX2RvbmUobXMsIDEpOworCQlyZXR1cm47CisJfQorCisJc3RhcnRfcGhhc2UobXMpOworfQorCitzdGF0aWMgdm9pZCBjbWRfY29tcGxldGUoc3RydWN0IG1lc2hfc3RhdGUgKm1zKQoreworCXZvbGF0aWxlIHN0cnVjdCBtZXNoX3JlZ3MgX19pb21lbSAqbXIgPSBtcy0+bWVzaDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBtcy0+Y3VycmVudF9yZXE7CisJc3RydWN0IG1lc2hfdGFyZ2V0ICp0cCA9ICZtcy0+dGd0c1ttcy0+Y29ubl90Z3RdOworCWludCBzZXEsIG4sIHQ7CisKKwlkbG9nKG1zLCAiY21kX2NvbXBsZXRlIGZjPSV4IiwgbXItPmZpZm9fY291bnQpOworCXNlcSA9IHVzZV9hY3RpdmVfbmVnICsgKG1zLT5uX21zZ291dD8gU0VRX0FUTjogMCk7CisJc3dpdGNoIChtcy0+bXNncGhhc2UpIHsKKwljYXNlIG1zZ19vdXRfeHh4OgorCQkvKiBodWg/ICB3ZSBleHBlY3RlZCBhIHBoYXNlIG1pc21hdGNoICovCisJCW1zLT5uX21zZ2luID0gMDsKKwkJbXMtPm1zZ3BoYXNlID0gbXNnX2luOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCWNhc2UgbXNnX2luOgorCQkvKiBzaG91bGQgaGF2ZSBzb21lIG1lc3NhZ2UgYnl0ZXMgaW4gZmlmbyAqLworCQlnZXRfbXNnaW4obXMpOworCQluID0gbXNnaW5fbGVuZ3RoKG1zKTsKKwkJaWYgKG1zLT5uX21zZ2luIDwgbikgeworCQkJb3V0XzgoJm1yLT5jb3VudF9sbywgbiAtIG1zLT5uX21zZ2luKTsKKwkJCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9NU0dJTiArIHNlcSk7CisJCX0gZWxzZSB7CisJCQltcy0+bXNncGhhc2UgPSBtc2dfbm9uZTsKKwkJCWhhbmRsZV9tc2dpbihtcyk7CisJCQlzdGFydF9waGFzZShtcyk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIG1zZ19pbl9iYWQ6CisJCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9GTFVTSEZJRk8pOworCQltZXNoX2ZsdXNoX2lvKG1yKTsKKwkJdWRlbGF5KDEpOworCQlvdXRfOCgmbXItPmNvdW50X2xvLCAxKTsKKwkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX01TR0lOICsgU0VRX0FUTiArIHVzZV9hY3RpdmVfbmVnKTsKKwkJYnJlYWs7CisKKwljYXNlIG1zZ19vdXQ6CisJCS8qCisJCSAqIFRvIGdldCB0aGUgcmlnaHQgdGltaW5nIG9uIEFUTiB3cnQgQUNLLCB3ZSBoYXZlCisJCSAqIHRvIGdldCB0aGUgTUVTSCB0byBkcm9wIEFDSywgd2FpdCB1bnRpbCBSRVEgZ2V0cworCQkgKiBhc3NlcnRlZCwgdGhlbiBkcm9wIEFUTi4gIFRvIGRvIHRoaXMgd2UgZmlyc3QKKwkJICogaXNzdWUgYSBTRVFfTVNHT1VUIHdpdGggQVROIGFuZCB3YWl0IGZvciBSRVEsCisJCSAqIHRoZW4gY2hhbmdlIHRoZSBjb21tYW5kIHRvIGEgU0VRX01TR09VVCB3L28gQVROLgorCQkgKiBJZiB3ZSBkb24ndCBzZWUgUkVRIGluIGEgcmVhc29uYWJsZSB0aW1lLCB3ZQorCQkgKiBjaGFuZ2UgdGhlIGNvbW1hbmQgdG8gU0VRX01TR0lOIHdpdGggQVROLAorCQkgKiB3YWl0IGZvciB0aGUgcGhhc2UgbWlzbWF0Y2ggaW50ZXJydXB0LCB0aGVuCisJCSAqIGlzc3VlIHRoZSBTRVFfTVNHT1VUIHdpdGhvdXQgQVROLgorCQkgKi8KKwkJb3V0XzgoJm1yLT5jb3VudF9sbywgMSk7CisJCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9NU0dPVVQgKyB1c2VfYWN0aXZlX25lZyArIFNFUV9BVE4pOworCQl0ID0gMzA7CQkvKiB3YWl0IHVwIHRvIDMwdXMgKi8KKwkJd2hpbGUgKChpbl84KCZtci0+YnVzX3N0YXR1czApICYgQlMwX1JFUSkgPT0gMCAmJiAtLXQgPj0gMCkKKwkJCXVkZWxheSgxKTsKKwkJZGxvZyhtcywgImxhc3RfbWJ5dGUgZXJyL2V4Yy9mYy9jbD0lLjh4IiwKKwkJICAgICBNS1dPUkQobXItPmVycm9yLCBtci0+ZXhjZXB0aW9uLAorCQkJICAgIG1yLT5maWZvX2NvdW50LCBtci0+Y291bnRfbG8pKTsKKwkJaWYgKGluXzgoJm1yLT5pbnRlcnJ1cHQpICYgKElOVF9FUlJPUiB8IElOVF9FWENFUFRJT04pKSB7CisJCQkvKiB3aG9vcHMsIHRhcmdldCBkaWRuJ3QgZG8gd2hhdCB3ZSBleHBlY3RlZCAqLworCQkJbXMtPmxhc3Rfbl9tc2dvdXQgPSBtcy0+bl9tc2dvdXQ7CisJCQltcy0+bl9tc2dvdXQgPSAwOworCQkJaWYgKGluXzgoJm1yLT5pbnRlcnJ1cHQpICYgSU5UX0VSUk9SKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJtZXNoOiBlcnJvciAleCBpbiBtc2dfb3V0XG4iLAorCQkJCSAgICAgICBpbl84KCZtci0+ZXJyb3IpKTsKKwkJCQloYW5kbGVfZXJyb3IobXMpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChpbl84KCZtci0+ZXhjZXB0aW9uKSAhPSBFWENfUEhBU0VNTSkKKwkJCQlwcmludGsoS0VSTl9FUlIgIm1lc2g6IGV4YyAleCBpbiBtc2dfb3V0XG4iLAorCQkJCSAgICAgICBpbl84KCZtci0+ZXhjZXB0aW9uKSk7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIm1lc2g6IGJzMD0leCBpbiBtc2dfb3V0XG4iLAorCQkJCSAgICAgICBpbl84KCZtci0+YnVzX3N0YXR1czApKTsKKwkJCWhhbmRsZV9leGNlcHRpb24obXMpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChpbl84KCZtci0+YnVzX3N0YXR1czApICYgQlMwX1JFUSkgeworCQkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX01TR09VVCArIHVzZV9hY3RpdmVfbmVnKTsKKwkJCW1lc2hfZmx1c2hfaW8obXIpOworCQkJdWRlbGF5KDEpOworCQkJb3V0XzgoJm1yLT5maWZvLCBtcy0+bXNnb3V0W21zLT5uX21zZ291dC0xXSk7CisJCQltcy0+bXNncGhhc2UgPSBtc2dfb3V0X2xhc3Q7CisJCX0gZWxzZSB7CisJCQlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfTVNHSU4gKyB1c2VfYWN0aXZlX25lZyArIFNFUV9BVE4pOworCQkJbXMtPm1zZ3BoYXNlID0gbXNnX291dF94eHg7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIG1zZ19vdXRfbGFzdDoKKwkJbXMtPmxhc3Rfbl9tc2dvdXQgPSBtcy0+bl9tc2dvdXQ7CisJCW1zLT5uX21zZ291dCA9IDA7CisJCW1zLT5tc2dwaGFzZSA9IG1zLT5leHBlY3RfcmVwbHk/IG1zZ19pbjogbXNnX25vbmU7CisJCXN0YXJ0X3BoYXNlKG1zKTsKKwkJYnJlYWs7CisKKwljYXNlIG1zZ19ub25lOgorCQlzd2l0Y2ggKG1zLT5waGFzZSkgeworCQljYXNlIGlkbGU6CisJCQlwcmludGsoS0VSTl9FUlIgIm1lc2g6IGludGVycnVwdCBpbiBpZGxlIHBoYXNlP1xuIik7CisJCQlkdW1wc2xvZyhtcyk7CisJCQlyZXR1cm47CisJCWNhc2Ugc2VsZWN0aW5nOgorCQkJZGxvZyhtcywgIlNlbGVjdGluZyBwaGFzZSBhdCBjb21tYW5kIGNvbXBsZXRpb24iLDApOworCQkJbXMtPm1zZ291dFswXSA9IElERU5USUZZKEFMTE9XX1JFU0VMKG1zLT5jb25uX3RndCksCisJCQkJCQkgKGNtZD8gY21kLT5kZXZpY2UtPmx1bjogMCkpOworCQkJbXMtPm5fbXNnb3V0ID0gMTsKKwkJCW1zLT5leHBlY3RfcmVwbHkgPSAwOworCQkJaWYgKG1zLT5hYm9ydGluZykgeworCQkJCW1zLT5tc2dvdXRbMF0gPSBBQk9SVDsKKwkJCQltcy0+bl9tc2dvdXQrKzsKKwkJCX0gZWxzZSBpZiAodHAtPnNkdHJfc3RhdGUgPT0gZG9fc2R0cikgeworCQkJCS8qIGFkZCBTRFRSIG1lc3NhZ2UgKi8KKwkJCQlhZGRfc2R0cl9tc2cobXMpOworCQkJCW1zLT5leHBlY3RfcmVwbHkgPSAxOworCQkJCXRwLT5zZHRyX3N0YXRlID0gc2R0cl9zZW50OworCQkJfQorCQkJbXMtPm1zZ3BoYXNlID0gbXNnX291dDsKKwkJCS8qCisJCQkgKiBXZSBuZWVkIHRvIHdhaXQgZm9yIFJFUSBiZWZvcmUgZHJvcHBpbmcgQVROLgorCQkJICogV2Ugd2FpdCBmb3IgYXQgbW9zdCAzMHVzLCB0aGVuIGZhbGwgYmFjayB0bworCQkJICogYSBzY2hlbWUgd2hlcmUgd2UgaXNzdWUgYSBTRVFfQ09NTUFORCB3aXRoIEFUTiwKKwkJCSAqIHdoaWNoIHdpbGwgZ2l2ZSB1cyBhIHBoYXNlIG1pc21hdGNoIGludGVycnVwdAorCQkJICogd2hlbiBSRVEgZG9lcyBjb21lLCBhbmQgdGhlbiB3ZSBzZW5kIHRoZSBtZXNzYWdlLgorCQkJICovCisJCQl0ID0gMjMwOwkJLyogd2FpdCB1cCB0byAyMzB1cyAqLworCQkJd2hpbGUgKChpbl84KCZtci0+YnVzX3N0YXR1czApICYgQlMwX1JFUSkgPT0gMCkgeworCQkJCWlmICgtLXQgPCAwKSB7CisJCQkJCWRsb2cobXMsICJpbXBhdGllbnQgZm9yIHJlcSIsIG1zLT5uX21zZ291dCk7CisJCQkJCW1zLT5tc2dwaGFzZSA9IG1zZ19ub25lOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJdWRlbGF5KDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgZGF0YWluZzoKKwkJCWlmIChtcy0+ZG1hX2NvdW50ICE9IDApIHsKKwkJCQlzdGFydF9waGFzZShtcyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJLyoKKwkJCSAqIFdlIGNhbiBnZXQgYSBwaGFzZSBtaXNtYXRjaCBoZXJlIGlmIHRoZSB0YXJnZXQKKwkJCSAqIGNoYW5nZXMgdG8gdGhlIHN0YXR1cyBwaGFzZSwgZXZlbiB0aG91Z2ggd2UgaGF2ZQorCQkJICogaGFkIGEgY29tbWFuZCBjb21wbGV0ZSBpbnRlcnJ1cHQuICBUaGVuLCBpZiB3ZQorCQkJICogaXNzdWUgdGhlIFNFUV9TVEFUVVMgY29tbWFuZCwgd2UnbGwgZ2V0IGEgc2VxdWVuY2UKKwkJCSAqIGVycm9yIGludGVycnVwdC4gIFdoaWNoIGlzbid0IHNvIGJhZCBleGNlcHQgdGhhdAorCQkJICogb2NjYXNpb25hbGx5IHRoZSBtZXNoIGFjdHVhbGx5IGV4ZWN1dGVzIHRoZQorCQkJICogU0VRX1NUQVRVUyAqYXMgd2VsbCBhcyogZ2l2aW5nIHVzIHRoZSBzZXF1ZW5jZQorCQkJICogZXJyb3IgYW5kIHBoYXNlIG1pc21hdGNoIGV4Y2VwdGlvbi4KKwkJCSAqLworCQkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgMCk7CisJCQlvdXRfOCgmbXItPmludGVycnVwdCwKKwkJCSAgICAgIElOVF9FUlJPUiB8IElOVF9FWENFUFRJT04gfCBJTlRfQ01ERE9ORSk7CisJCQloYWx0X2RtYShtcyk7CisJCQlicmVhazsKKwkJY2FzZSBzdGF0dXNpbmc6CisJCQlpZiAoY21kKSB7CisJCQkJY21kLT5TQ3AuU3RhdHVzID0gbXItPmZpZm87CisJCQkJaWYgKERFQlVHX1RBUkdFVChjbWQpKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAibWVzaDogc3RhdHVzIGlzICV4XG4iLAorCQkJCQkgICAgICAgY21kLT5TQ3AuU3RhdHVzKTsKKwkJCX0KKwkJCW1zLT5tc2dwaGFzZSA9IG1zZ19pbjsKKwkJCWJyZWFrOworCQljYXNlIGJ1c2ZyZWVpbmc6CisJCQltZXNoX2RvbmUobXMsIDEpOworCQkJcmV0dXJuOworCQljYXNlIGRpc2Nvbm5lY3Rpbmc6CisJCQltcy0+Y3VycmVudF9yZXEgPSBOVUxMOworCQkJbXMtPnBoYXNlID0gaWRsZTsKKwkJCW1lc2hfc3RhcnQobXMpOworCQkJcmV0dXJuOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJKyttcy0+cGhhc2U7CisJCXN0YXJ0X3BoYXNlKG1zKTsKKwkJYnJlYWs7CisJfQorfQorCisKKy8qCisgKiBDYWxsZWQgYnkgbWlkbGF5ZXIgd2l0aCBob3N0IGxvY2tlZCB0byBxdWV1ZSBhIG5ldworICogcmVxdWVzdAorICovCitzdGF0aWMgaW50IG1lc2hfcXVldWUoc3RydWN0IHNjc2lfY21uZCAqY21kLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXM7CisKKwljbWQtPnNjc2lfZG9uZSA9IGRvbmU7CisJY21kLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworCW1zID0gKHN0cnVjdCBtZXNoX3N0YXRlICopIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCWlmIChtcy0+cmVxdWVzdF9xID09IE5VTEwpCisJCW1zLT5yZXF1ZXN0X3EgPSBjbWQ7CisJZWxzZQorCQltcy0+cmVxdWVzdF9xdGFpbC0+aG9zdF9zY3JpYmJsZSA9ICh2b2lkICopIGNtZDsKKwltcy0+cmVxdWVzdF9xdGFpbCA9IGNtZDsKKworCWlmIChtcy0+cGhhc2UgPT0gaWRsZSkKKwkJbWVzaF9zdGFydChtcyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGxlZCB0byBoYW5kbGUgaW50ZXJydXB0cywgZWl0aGVyIGNhbGwgYnkgdGhlIGludGVycnVwdAorICogaGFuZGxlciAoZG9fbWVzaF9pbnRlcnJ1cHQpIG9yIGJ5IG90aGVyIGZ1bmN0aW9ucyBpbgorICogZXhjZXB0aW9uYWwgY2lyY3Vtc3RhbmNlcworICovCitzdGF0aWMgdm9pZCBtZXNoX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpwdHJlZ3MpCit7CisJc3RydWN0IG1lc2hfc3RhdGUgKm1zID0gKHN0cnVjdCBtZXNoX3N0YXRlICopIGRldl9pZDsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWVzaF9yZWdzIF9faW9tZW0gKm1yID0gbXMtPm1lc2g7CisJaW50IGludHI7CisKKyNpZiAwCisJaWYgKEFMTE9XX0RFQlVHKG1zLT5jb25uX3RndCkpCisJCXByaW50ayhLRVJOX0RFQlVHICJtZXNoX2ludHIsIGJzMD0leCBpbnQ9JXggZXhjPSV4IGVycj0leCAiCisJCSAgICAgICAicGhhc2U9JWQgbXNncGhhc2U9JWRcbiIsIG1yLT5idXNfc3RhdHVzMCwKKwkJICAgICAgIG1yLT5pbnRlcnJ1cHQsIG1yLT5leGNlcHRpb24sIG1yLT5lcnJvciwKKwkJICAgICAgIG1zLT5waGFzZSwgbXMtPm1zZ3BoYXNlKTsKKyNlbmRpZgorCXdoaWxlICgoaW50ciA9IGluXzgoJm1yLT5pbnRlcnJ1cHQpKSAhPSAwKSB7CisJCWRsb2cobXMsICJpbnRlcnJ1cHQgaW50ci9lcnIvZXhjL3NlcT0lLjh4IiwgCisJCSAgICAgTUtXT1JEKGludHIsIG1yLT5lcnJvciwgbXItPmV4Y2VwdGlvbiwgbXItPnNlcXVlbmNlKSk7CisJCWlmIChpbnRyICYgSU5UX0VSUk9SKSB7CisJCQloYW5kbGVfZXJyb3IobXMpOworCQl9IGVsc2UgaWYgKGludHIgJiBJTlRfRVhDRVBUSU9OKSB7CisJCQloYW5kbGVfZXhjZXB0aW9uKG1zKTsKKwkJfSBlbHNlIGlmIChpbnRyICYgSU5UX0NNRERPTkUpIHsKKwkJCW91dF84KCZtci0+aW50ZXJydXB0LCBJTlRfQ01ERE9ORSk7CisJCQljbWRfY29tcGxldGUobXMpOworCQl9CisJfQorfQorCisvKiBUb2RvOiBoZXJlIHdlIGNhbiBhdCBsZWFzdCB0cnkgdG8gcmVtb3ZlIHRoZSBjb21tYW5kIGZyb20gdGhlCisgKiBxdWV1ZSBpZiBpdCBpc24ndCBjb25uZWN0ZWQgeWV0LCBhbmQgZm9yIHBlbmRpbmcgY29tbWFuZCwgYXNzZXJ0CisgKiBBVE4gdW50aWwgdGhlIGJ1cyBnZXRzIGZyZWVkLgorICovCitzdGF0aWMgaW50IG1lc2hfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBtZXNoX3N0YXRlICptcyA9IChzdHJ1Y3QgbWVzaF9zdGF0ZSAqKSBjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlwcmludGsoS0VSTl9ERUJVRyAibWVzaF9hYm9ydCglcClcbiIsIGNtZCk7CisJbWVzaF9kdW1wX3JlZ3MobXMpOworCWR1bXBsb2cobXMsIGNtZC0+ZGV2aWNlLT5pZCk7CisJZHVtcHNsb2cobXMpOworCXJldHVybiBGQUlMRUQ7Cit9CisKKy8qCisgKiBDYWxsZWQgYnkgdGhlIG1pZGxheWVyIHdpdGggdGhlIGxvY2sgaGVsZCB0byByZXNldCB0aGUKKyAqIFNDU0kgaG9zdCBhbmQgYnVzLgorICogVGhlIG1pZGxheWVyIHdpbGwgd2FpdCBmb3IgZGV2aWNlcyB0byBjb21lIGJhY2ssIHdlIGRvbid0IG5lZWQKKyAqIHRvIGRvIHRoYXQgb3Vyc2VsdmVzCisgKi8KK3N0YXRpYyBpbnQgbWVzaF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMgPSAoc3RydWN0IG1lc2hfc3RhdGUgKikgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXZvbGF0aWxlIHN0cnVjdCBtZXNoX3JlZ3MgX19pb21lbSAqbXIgPSBtcy0+bWVzaDsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICptZCA9IG1zLT5kbWE7CisKKwlwcmludGsoS0VSTl9ERUJVRyAibWVzaF9ob3N0X3Jlc2V0XG4iKTsKKworCS8qIFJlc2V0IHRoZSBjb250cm9sbGVyICYgZGJkbWEgY2hhbm5lbCAqLworCW91dF9sZTMyKCZtZC0+Y29udHJvbCwgKFJVTnxQQVVTRXxGTFVTSHxXQUtFKSA8PCAxNik7CS8qIHN0b3AgZG1hICovCisJb3V0XzgoJm1yLT5leGNlcHRpb24sIDB4ZmYpOwkvKiBjbGVhciBhbGwgZXhjZXB0aW9uIGJpdHMgKi8KKwlvdXRfOCgmbXItPmVycm9yLCAweGZmKTsJLyogY2xlYXIgYWxsIGVycm9yIGJpdHMgKi8KKwlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfUkVTRVRNRVNIKTsKKyAgICAgICAJbWVzaF9mbHVzaF9pbyhtcik7CisJdWRlbGF5KDEpOworCW91dF84KCZtci0+aW50cl9tYXNrLCBJTlRfRVJST1IgfCBJTlRfRVhDRVBUSU9OIHwgSU5UX0NNRERPTkUpOworCW91dF84KCZtci0+c291cmNlX2lkLCBtcy0+aG9zdC0+dGhpc19pZCk7CisJb3V0XzgoJm1yLT5zZWxfdGltZW91dCwgMjUpOwkvKiAyNTBtcyAqLworCW91dF84KCZtci0+c3luY19wYXJhbXMsIEFTWU5DX1BBUkFNUyk7CisKKwkvKiBSZXNldCB0aGUgYnVzICovCisJb3V0XzgoJm1yLT5idXNfc3RhdHVzMSwgQlMxX1JTVCk7CS8qIGFzc2VydCBSU1QgKi8KKyAgICAgICAJbWVzaF9mbHVzaF9pbyhtcik7CisJdWRlbGF5KDMwKTsJCQkvKiBsZWF2ZSBpdCBvbiBmb3IgPj0gMjV1cyAqLworCW91dF84KCZtci0+YnVzX3N0YXR1czEsIDApOwkvKiBuZWdhdGUgUlNUICovCisKKwkvKiBDb21wbGV0ZSBwZW5kaW5nIGNvbW1hbmRzICovCisJaGFuZGxlX3Jlc2V0KG1zKTsKKwkKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgc2V0X21lc2hfcG93ZXIoc3RydWN0IG1lc2hfc3RhdGUgKm1zLCBpbnQgc3RhdGUpCit7CisJaWYgKF9tYWNoaW5lICE9IF9NQUNIX1BtYWMpCisJCXJldHVybjsKKwlpZiAoc3RhdGUpIHsKKwkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfTUVTSF9FTkFCTEUsIG1hY2lvX2dldF9vZl9ub2RlKG1zLT5tZGV2KSwgMCwgMSk7CisJCW1zbGVlcCgyMDApOworCX0gZWxzZSB7CisJCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX01FU0hfRU5BQkxFLCBtYWNpb19nZXRfb2Zfbm9kZShtcy0+bWRldiksIDAsIDApOworCQltc2xlZXAoMTApOworCX0KK30JCQkKKworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IG1lc2hfc3VzcGVuZChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCB1MzIgc3RhdGUpCit7CisJc3RydWN0IG1lc2hfc3RhdGUgKm1zID0gKHN0cnVjdCBtZXNoX3N0YXRlICopbWFjaW9fZ2V0X2RydmRhdGEobWRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzdGF0ZSA9PSBtZGV2LT5vZmRldi5kZXYucG93ZXIucG93ZXJfc3RhdGUgfHwgc3RhdGUgPCAyKQorCQlyZXR1cm4gMDsKKworCXNjc2lfYmxvY2tfcmVxdWVzdHMobXMtPmhvc3QpOworCXNwaW5fbG9ja19pcnFzYXZlKG1zLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl3aGlsZShtcy0+cGhhc2UgIT0gaWRsZSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1zLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJbXNsZWVwKDEwKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUobXMtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCX0KKwltcy0+cGhhc2UgPSBzbGVlcGluZzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1zLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlkaXNhYmxlX2lycShtcy0+bWVzaGludHIpOworCXNldF9tZXNoX3Bvd2VyKG1zLCAwKTsKKworCW1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVzaF9yZXN1bWUoc3RydWN0IG1hY2lvX2RldiAqbWRldikKK3sKKwlzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMgPSAoc3RydWN0IG1lc2hfc3RhdGUgKiltYWNpb19nZXRfZHJ2ZGF0YShtZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9PSAwKQorCQlyZXR1cm4gMDsKKworCXNldF9tZXNoX3Bvd2VyKG1zLCAxKTsKKwltZXNoX2luaXQobXMpOworCXNwaW5fbG9ja19pcnFzYXZlKG1zLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwltZXNoX3N0YXJ0KG1zKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1zLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwllbmFibGVfaXJxKG1zLT5tZXNoaW50cik7CisJc2NzaV91bmJsb2NrX3JlcXVlc3RzKG1zLT5ob3N0KTsKKworCW1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCisvKgorICogSWYgd2UgbGVhdmUgZHJpdmVzIHNldCBmb3Igc3luY2hyb25vdXMgdHJhbnNmZXJzIChlc3BlY2lhbGx5CisgKiBDRFJPTXMpLCBhbmQgcmVib290IHRvIE1hY09TLCBpdCBnZXRzIGNvbmZ1c2VkLCBwb29yIHRoaW5nLgorICogU28sIG9uIHJlYm9vdCB3ZSByZXNldCB0aGUgU0NTSSBidXMuCisgKi8KK3N0YXRpYyBpbnQgbWVzaF9zaHV0ZG93bihzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2KQoreworCXN0cnVjdCBtZXNoX3N0YXRlICptcyA9IChzdHJ1Y3QgbWVzaF9zdGF0ZSAqKW1hY2lvX2dldF9kcnZkYXRhKG1kZXYpOworCXZvbGF0aWxlIHN0cnVjdCBtZXNoX3JlZ3MgX19pb21lbSAqbXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgIAlwcmludGsoS0VSTl9JTkZPICJyZXNldHRpbmcgTUVTSCBzY3NpIGJ1cyhlcylcbiIpOworCXNwaW5fbG9ja19pcnFzYXZlKG1zLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKyAgICAgICAJbXIgPSBtcy0+bWVzaDsKKwlvdXRfOCgmbXItPmludHJfbWFzaywgMCk7CisJb3V0XzgoJm1yLT5pbnRlcnJ1cHQsIElOVF9FUlJPUiB8IElOVF9FWENFUFRJT04gfCBJTlRfQ01ERE9ORSk7CisJb3V0XzgoJm1yLT5idXNfc3RhdHVzMSwgQlMxX1JTVCk7CisJbWVzaF9mbHVzaF9pbyhtcik7CisJdWRlbGF5KDMwKTsKKwlvdXRfOCgmbXItPmJ1c19zdGF0dXMxLCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1zLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBtZXNoX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCQk9ICJtZXNoIiwKKwkubmFtZQkJCQk9ICJNRVNIIiwKKwkucXVldWVjb21tYW5kCQkJPSBtZXNoX3F1ZXVlLAorCS5laF9hYm9ydF9oYW5kbGVyCQk9IG1lc2hfYWJvcnQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgkJPSBtZXNoX2hvc3RfcmVzZXQsCisJLmNhbl9xdWV1ZQkJCT0gMjAsCisJLnRoaXNfaWQJCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJCT0gMiwKKwkudXNlX2NsdXN0ZXJpbmcJCQk9IERJU0FCTEVfQ0xVU1RFUklORywKK307CisKK3N0YXRpYyBpbnQgbWVzaF9wcm9iZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbWVzaCA9IG1hY2lvX2dldF9vZl9ub2RlKG1kZXYpOworCXN0cnVjdCBwY2lfZGV2KiBwZGV2ID0gbWFjaW9fZ2V0X3BjaV9kZXYobWRldik7CisJaW50IHRndCwgKmNmcCwgbWlucGVyOworCXN0cnVjdCBtZXNoX3N0YXRlICptczsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICptZXNoX2hvc3Q7CisJdm9pZCAqZG1hX2NtZF9zcGFjZTsKKwlkbWFfYWRkcl90IGRtYV9jbWRfYnVzOworCisJc3dpdGNoIChtZGV2LT5idXMtPmNoaXAtPnR5cGUpIHsKKwljYXNlIG1hY2lvX2hlYXRocm93OgorCWNhc2UgbWFjaW9fZ2F0d2ljazoKKwljYXNlIG1hY2lvX3BhZGRpbmd0b246CisJCXVzZV9hY3RpdmVfbmVnID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdXNlX2FjdGl2ZV9uZWcgPSBTRVFfQUNUSVZFX05FRzsKKwl9CisKKwlpZiAobWFjaW9fcmVzb3VyY2VfY291bnQobWRldikgIT0gMiB8fCBtYWNpb19pcnFfY291bnQobWRldikgIT0gMikgeworICAgICAgIAkJcHJpbnRrKEtFUk5fRVJSICJtZXNoOiBleHBlY3RlZCAyIGFkZHJzIGFuZCAyIGludHJzIgorCSAgICAgICAJICAgICAgICIgKGdvdCAlZCwlZClcbiIsIG1lc2gtPm5fYWRkcnMsIG1lc2gtPm5faW50cnMpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAobWFjaW9fcmVxdWVzdF9yZXNvdXJjZXMobWRldiwgIm1lc2giKSAhPSAwKSB7CisgICAgICAgCQlwcmludGsoS0VSTl9FUlIgIm1lc2g6IHVuYWJsZSB0byByZXF1ZXN0IG1lbW9yeSByZXNvdXJjZXMiKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisgICAgICAgCW1lc2hfaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmbWVzaF90ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBtZXNoX3N0YXRlKSk7CisJaWYgKG1lc2hfaG9zdCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWVzaDogY291bGRuJ3QgcmVnaXN0ZXIgaG9zdCIpOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKwkKKwkvKiBPbGQganVuayBmb3Igcm9vdCBkaXNjb3ZlcnksIHRoYXQgd2lsbCBkaWUgdWx0aW1hdGVseSAqLworI2lmICFkZWZpbmVkKE1PRFVMRSkKKyAgICAgICAJbm90ZV9zY3NpX2hvc3QobWVzaCwgbWVzaF9ob3N0KTsKKyNlbmRpZgorCisJbWVzaF9ob3N0LT5iYXNlID0gbWFjaW9fcmVzb3VyY2Vfc3RhcnQobWRldiwgMCk7CisJbWVzaF9ob3N0LT5pcnEgPSBtYWNpb19pcnEobWRldiwgMCk7CisgICAgICAgCW1zID0gKHN0cnVjdCBtZXNoX3N0YXRlICopIG1lc2hfaG9zdC0+aG9zdGRhdGE7CisJbWFjaW9fc2V0X2RydmRhdGEobWRldiwgbXMpOworCW1zLT5ob3N0ID0gbWVzaF9ob3N0OworCW1zLT5tZGV2ID0gbWRldjsKKwltcy0+cGRldiA9IHBkZXY7CisJCisJbXMtPm1lc2ggPSBpb3JlbWFwKG1hY2lvX3Jlc291cmNlX3N0YXJ0KG1kZXYsIDApLCAweDEwMDApOworCWlmIChtcy0+bWVzaCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWVzaDogY2FuJ3QgbWFwIHJlZ2lzdGVyc1xuIik7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQkJCisJbXMtPmRtYSA9IGlvcmVtYXAobWFjaW9fcmVzb3VyY2Vfc3RhcnQobWRldiwgMSksIDB4MTAwMCk7CisJaWYgKG1zLT5kbWEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1lc2g6IGNhbid0IG1hcCByZWdpc3RlcnNcbiIpOworCQlpb3VubWFwKG1zLT5tZXNoKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKyAgICAgICAJbXMtPm1lc2hpbnRyID0gbWFjaW9faXJxKG1kZXYsIDApOworICAgICAgIAltcy0+ZG1haW50ciA9IG1hY2lvX2lycShtZGV2LCAxKTsKKworICAgICAgIAkvKiBTcGFjZSBmb3IgZG1hIGNvbW1hbmQgbGlzdDogKzEgZm9yIHN0b3AgY29tbWFuZCwKKyAgICAgICAJICogKzEgdG8gYWxsb3cgZm9yIGFsaWduaW5nLgorCSAqLworCW1zLT5kbWFfY21kX3NpemUgPSAobWVzaF9ob3N0LT5zZ190YWJsZXNpemUgKyAyKSAqIHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKTsKKworCS8qIFdlIHVzZSB0aGUgUENJIEFQSXMgZm9yIG5vdyB1bnRpbCB0aGUgZ2VuZXJpYyBvbmUgZ2V0cyBmaXhlZAorCSAqIGVub3VnaCBvciB1bnRpbCB3ZSBnZXQgc29tZSBtYWNpby1zcGVjaWZpYyB2ZXJzaW9ucworCSAqLworCWRtYV9jbWRfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChtYWNpb19nZXRfcGNpX2RldihtZGV2KSwKKwkJCQkJICAgICBtcy0+ZG1hX2NtZF9zaXplLAorCQkJCQkgICAgICZkbWFfY21kX2J1cyk7CisJaWYgKGRtYV9jbWRfc3BhY2UgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1lc2g6IGNhbid0IGFsbG9jYXRlIERNQSB0YWJsZVxuIik7CisJCWdvdG8gb3V0X3VubWFwOworCX0KKwltZW1zZXQoZG1hX2NtZF9zcGFjZSwgMCwgbXMtPmRtYV9jbWRfc2l6ZSk7CisKKwltcy0+ZG1hX2NtZHMgPSAoc3RydWN0IGRiZG1hX2NtZCAqKSBEQkRNQV9BTElHTihkbWFfY21kX3NwYWNlKTsKKyAgICAgICAJbXMtPmRtYV9jbWRfc3BhY2UgPSBkbWFfY21kX3NwYWNlOworCW1zLT5kbWFfY21kX2J1cyA9IGRtYV9jbWRfYnVzICsgKCh1bnNpZ25lZCBsb25nKW1zLT5kbWFfY21kcykKKwkJLSAodW5zaWduZWQgbG9uZylkbWFfY21kX3NwYWNlOworCW1zLT5jdXJyZW50X3JlcSA9IE5VTEw7CisgICAgICAgCWZvciAodGd0ID0gMDsgdGd0IDwgODsgKyt0Z3QpIHsKKwkgICAgICAgCW1zLT50Z3RzW3RndF0uc2R0cl9zdGF0ZSA9IGRvX3NkdHI7CisJICAgICAgIAltcy0+dGd0c1t0Z3RdLnN5bmNfcGFyYW1zID0gQVNZTkNfUEFSQU1TOworCSAgICAgICAJbXMtPnRndHNbdGd0XS5jdXJyZW50X3JlcSA9IE5VTEw7CisgICAgICAgCX0KKworCWlmICgoY2ZwID0gKGludCAqKSBnZXRfcHJvcGVydHkobWVzaCwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpKSkKKyAgICAgICAJCW1zLT5jbGtfZnJlcSA9ICpjZnA7CisJZWxzZSB7CisgICAgICAgCQlwcmludGsoS0VSTl9JTkZPICJtZXNoOiBhc3N1bWluZyA1ME1IeiBjbG9jayBmcmVxdWVuY3lcbiIpOworCSAgICAgICAJbXMtPmNsa19mcmVxID0gNTAwMDAwMDA7CisgICAgICAgCX0KKworICAgICAgIAkvKiBUaGUgbWF4aW11bSBzeW5jIHJhdGUgaXMgY2xvY2sgLyA1OyBpbmNyZWFzZQorICAgICAgIAkgKiBtZXNoX3N5bmNfcGVyaW9kIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwltaW5wZXIgPSAxMDAwMDAwMDAwIC8gKG1zLT5jbGtfZnJlcSAvIDUpOyAvKiBucyAqLworCWlmIChtZXNoX3N5bmNfcGVyaW9kIDwgbWlucGVyKQorCQltZXNoX3N5bmNfcGVyaW9kID0gbWlucGVyOworCisJLyogUG93ZXIgdXAgdGhlIGNoaXAgKi8KKwlzZXRfbWVzaF9wb3dlcihtcywgMSk7CisKKwkvKiBTZXQgaXQgdXAgKi8KKyAgICAgICAJbWVzaF9pbml0KG1zKTsKKworCS8qIFhYWCBGSVhNRTogZXJyb3Igc2hvdWxkIGJlIGZhdGFsICovCisgICAgICAgCWlmIChyZXF1ZXN0X2lycShtcy0+bWVzaGludHIsIGRvX21lc2hfaW50ZXJydXB0LCAwLCAiTUVTSCIsIG1zKSkKKwkgICAgICAgCXByaW50ayhLRVJOX0VSUiAiTUVTSDogY2FuJ3QgZ2V0IGlycSAlZFxuIiwgbXMtPm1lc2hpbnRyKTsKKworCS8qIFhYWCBGSVhNRTogaGFuZGxlIGZhaWx1cmUgKi8KKwlzY3NpX2FkZF9ob3N0KG1lc2hfaG9zdCwgJm1kZXYtPm9mZGV2LmRldik7CisJc2NzaV9zY2FuX2hvc3QobWVzaF9ob3N0KTsKKworCXJldHVybiAwOworCitvdXRfdW5tYXA6CisJaW91bm1hcChtcy0+ZG1hKTsKKwlpb3VubWFwKG1zLT5tZXNoKTsKK291dF9mcmVlOgorCXNjc2lfaG9zdF9wdXQobWVzaF9ob3N0KTsKK291dF9yZWxlYXNlOgorCW1hY2lvX3JlbGVhc2VfcmVzb3VyY2VzKG1kZXYpOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgbWVzaF9yZW1vdmUoc3RydWN0IG1hY2lvX2RldiAqbWRldikKK3sKKwlzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMgPSAoc3RydWN0IG1lc2hfc3RhdGUgKiltYWNpb19nZXRfZHJ2ZGF0YShtZGV2KTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICptZXNoX2hvc3QgPSBtcy0+aG9zdDsKKworCXNjc2lfcmVtb3ZlX2hvc3QobWVzaF9ob3N0KTsKKworCWZyZWVfaXJxKG1zLT5tZXNoaW50ciwgbXMpOworCisJLyogUmVzZXQgc2NzaSBidXMgKi8KKwltZXNoX3NodXRkb3duKG1kZXYpOworCisJLyogU2h1dCBkb3duIGNoaXAgJiB0ZXJtaW5hdGlvbiAqLworCXNldF9tZXNoX3Bvd2VyKG1zLCAwKTsKKworCS8qIFVubWFwIHJlZ2lzdGVycyAmIGRtYSBjb250cm9sbGVyICovCisJaW91bm1hcChtcy0+bWVzaCk7CisgICAgICAgCWlvdW5tYXAobXMtPmRtYSk7CisKKwkvKiBGcmVlIERNQSBjb21tYW5kcyBtZW1vcnkgKi8KKwlwY2lfZnJlZV9jb25zaXN0ZW50KG1hY2lvX2dldF9wY2lfZGV2KG1kZXYpLCBtcy0+ZG1hX2NtZF9zaXplLAorCQkJICBtcy0+ZG1hX2NtZF9zcGFjZSwgbXMtPmRtYV9jbWRfYnVzKTsKKworCS8qIFJlbGVhc2UgbWVtb3J5IHJlc291cmNlcyAqLworCW1hY2lvX3JlbGVhc2VfcmVzb3VyY2VzKG1kZXYpOworCisJc2NzaV9ob3N0X3B1dChtZXNoX2hvc3QpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBvZl9tYXRjaCBtZXNoX21hdGNoW10gPSAKK3sKKwl7CisJLm5hbWUgCQk9ICJtZXNoIiwKKwkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCisJLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKKwl9LAorCXsKKwkubmFtZSAJCT0gT0ZfQU5ZX01BVENILAorCS50eXBlCQk9ICJzY3NpIiwKKwkuY29tcGF0aWJsZQk9ICJjaHJwLG1lc2gwIgorCX0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IG1hY2lvX2RyaXZlciBtZXNoX2RyaXZlciA9IAoreworCS5uYW1lIAkJPSAibWVzaCIsCisJLm1hdGNoX3RhYmxlCT0gbWVzaF9tYXRjaCwKKwkucHJvYmUJCT0gbWVzaF9wcm9iZSwKKwkucmVtb3ZlCQk9IG1lc2hfcmVtb3ZlLAorCS5zaHV0ZG93bgk9IG1lc2hfc2h1dGRvd24sCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBtZXNoX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBtZXNoX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X21lc2godm9pZCkKK3sKKworCS8qIENhbGN1bGF0ZSBzeW5jIHJhdGUgZnJvbSBtb2R1bGUgcGFyYW1ldGVycyAqLworCWlmIChzeW5jX3JhdGUgPiAxMCkKKwkJc3luY19yYXRlID0gMTA7CisJaWYgKHN5bmNfcmF0ZSA+IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAibWVzaDogY29uZmlndXJlZCBmb3Igc3luY2hyb25vdXMgJWQgTUIvc1xuIiwgc3luY19yYXRlKTsKKwkJbWVzaF9zeW5jX3BlcmlvZCA9IDEwMDAgLyBzeW5jX3JhdGU7CS8qIG5zICovCisJCW1lc2hfc3luY19vZmZzZXQgPSAxNTsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAibWVzaDogY29uZmlndXJlZCBmb3IgYXN5bmNocm9ub3VzXG4iKTsKKworCXJldHVybiBtYWNpb19yZWdpc3Rlcl9kcml2ZXIoJm1lc2hfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbWVzaCh2b2lkKQoreworCXJldHVybiBtYWNpb191bnJlZ2lzdGVyX2RyaXZlcigmbWVzaF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbml0X21lc2gpOworbW9kdWxlX2V4aXQoZXhpdF9tZXNoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZXNoLmggYi9kcml2ZXJzL3Njc2kvbWVzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZGI4MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbWVzaC5oCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogbWVzaC5oOiBkZWZpbml0aW9ucyBmb3IgdGhlIGRyaXZlciBmb3IgdGhlIE1FU0ggU0NTSSBidXMgYWRhcHRvcgorICogKE1hY2ludG9zaCBFbmhhbmNlZCBTQ1NJIEhhcmR3YXJlKSBmb3VuZCBvbiBQb3dlciBNYWNpbnRvc2ggY29tcHV0ZXJzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcy4KKyAqLworI2lmbmRlZiBfTUVTSF9ICisjZGVmaW5lIF9NRVNIX0gKKworLyoKKyAqIFJlZ2lzdGVycyBpbiB0aGUgTUVTSCBjb250cm9sbGVyLgorICovCisKK3N0cnVjdCBtZXNoX3JlZ3MgeworCXVuc2lnbmVkIGNoYXIJY291bnRfbG87CisJY2hhciBwYWQwWzE1XTsKKwl1bnNpZ25lZCBjaGFyCWNvdW50X2hpOworCWNoYXIgcGFkMVsxNV07CisJdW5zaWduZWQgY2hhcglmaWZvOworCWNoYXIgcGFkMlsxNV07CisJdW5zaWduZWQgY2hhcglzZXF1ZW5jZTsKKwljaGFyIHBhZDNbMTVdOworCXVuc2lnbmVkIGNoYXIJYnVzX3N0YXR1czA7CisJY2hhciBwYWQ0WzE1XTsKKwl1bnNpZ25lZCBjaGFyCWJ1c19zdGF0dXMxOworCWNoYXIgcGFkNVsxNV07CisJdW5zaWduZWQgY2hhcglmaWZvX2NvdW50OworCWNoYXIgcGFkNlsxNV07CisJdW5zaWduZWQgY2hhcglleGNlcHRpb247CisJY2hhciBwYWQ3WzE1XTsKKwl1bnNpZ25lZCBjaGFyCWVycm9yOworCWNoYXIgcGFkOFsxNV07CisJdW5zaWduZWQgY2hhcglpbnRyX21hc2s7CisJY2hhciBwYWQ5WzE1XTsKKwl1bnNpZ25lZCBjaGFyCWludGVycnVwdDsKKwljaGFyIHBhZDEwWzE1XTsKKwl1bnNpZ25lZCBjaGFyCXNvdXJjZV9pZDsKKwljaGFyIHBhZDExWzE1XTsKKwl1bnNpZ25lZCBjaGFyCWRlc3RfaWQ7CisJY2hhciBwYWQxMlsxNV07CisJdW5zaWduZWQgY2hhcglzeW5jX3BhcmFtczsKKwljaGFyIHBhZDEzWzE1XTsKKwl1bnNpZ25lZCBjaGFyCW1lc2hfaWQ7CisJY2hhciBwYWQxNFsxNV07CisJdW5zaWduZWQgY2hhcglzZWxfdGltZW91dDsKKwljaGFyIHBhZDE1WzE1XTsKK307CisKKy8qIEJpdHMgaW4gdGhlIHNlcXVlbmNlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBTRVFfRE1BX01PREUJMHg4MAkvKiB1c2UgRE1BIGZvciBkYXRhIHRyYW5zZmVyICovCisjZGVmaW5lIFNFUV9UQVJHRVQJMHg0MAkvKiBwdXQgdGhlIGNvbnRyb2xsZXIgaW50byB0YXJnZXQgbW9kZSAqLworI2RlZmluZSBTRVFfQVROCQkweDIwCS8qIGFzc2VydCBBVE4gc2lnbmFsICovCisjZGVmaW5lIFNFUV9BQ1RJVkVfTkVHCTB4MTAJLyogdXNlIGFjdGl2ZSBuZWdhdGlvbiBvbiBSRVEvQUNLICovCisjZGVmaW5lIFNFUV9DTUQJCTB4MGYJLyogY29tbWFuZCBiaXRzOiAqLworI2RlZmluZSBTRVFfQVJCSVRSQVRFCTEJLyogIGdldCB0aGUgYnVzICovCisjZGVmaW5lIFNFUV9TRUxFQ1QJMgkvKiAgc2VsZWN0IGEgdGFyZ2V0ICovCisjZGVmaW5lIFNFUV9DT01NQU5ECTMJLyogIHNlbmQgYSBjb21tYW5kICovCisjZGVmaW5lIFNFUV9TVEFUVVMJNAkvKiAgcmVjZWl2ZSBzdGF0dXMgKi8KKyNkZWZpbmUgU0VRX0RBVEFPVVQJNQkvKiAgc2VuZCBkYXRhICovCisjZGVmaW5lIFNFUV9EQVRBSU4JNgkvKiAgcmVjZWl2ZSBkYXRhICovCisjZGVmaW5lIFNFUV9NU0dPVVQJNwkvKiAgc2VuZCBhIG1lc3NhZ2UgKi8KKyNkZWZpbmUgU0VRX01TR0lOCTgJLyogIHJlY2VpdmUgYSBtZXNzYWdlICovCisjZGVmaW5lIFNFUV9CVVNGUkVFCTkJLyogIGxvb2sgZm9yIGJ1cyBmcmVlICovCisjZGVmaW5lIFNFUV9FTkJQQVJJVFkJMHgwYQkvKiAgZW5hYmxlIHBhcml0eSBjaGVja2luZyAqLworI2RlZmluZSBTRVFfRElTUEFSSVRZCTB4MGIJLyogIGRpc2FibGUgcGFyaXR5IGNoZWNraW5nICovCisjZGVmaW5lIFNFUV9FTkJSRVNFTAkweDBjCS8qICBlbmFibGUgcmVzZWxlY3Rpb24gKi8KKyNkZWZpbmUgU0VRX0RJU1JFU0VMCTB4MGQJLyogIGRpc2FibGUgcmVzZWxlY3Rpb24gKi8KKyNkZWZpbmUgU0VRX1JFU0VUTUVTSAkweDBlCS8qICByZXNldCB0aGUgY29udHJvbGxlciAqLworI2RlZmluZSBTRVFfRkxVU0hGSUZPCTB4MGYJLyogIGNsZWFyIG91dCB0aGUgRklGTyAqLworCisvKiBCaXRzIGluIHRoZSBidXNfc3RhdHVzMCBhbmQgYnVzX3N0YXR1czEgcmVnaXN0ZXJzOgorICAgdGhlc2UgY29ycmVzcG9uZCBkaXJlY3RseSB0byB0aGUgU0NTSSBidXMgY29udHJvbCBzaWduYWxzLiAqLworI2RlZmluZSBCUzBfUkVRCQkweDIwCisjZGVmaW5lIEJTMF9BQ0sJCTB4MTAKKyNkZWZpbmUgQlMwX0FUTgkJMHgwOAorI2RlZmluZSBCUzBfTVNHCQkweDA0CisjZGVmaW5lIEJTMF9DRAkJMHgwMgorI2RlZmluZSBCUzBfSU8JCTB4MDEKKyNkZWZpbmUgQlMxX1JTVAkJMHg4MAorI2RlZmluZSBCUzFfQlNZCQkweDQwCisjZGVmaW5lIEJTMV9TRUwJCTB4MjAKKworLyogQnVzIHBoYXNlcyBkZWZpbmVkIGJ5IHRoZSBiaXRzIGluIGJ1c19zdGF0dXMwICovCisjZGVmaW5lIEJTMF9QSEFTRQkoQlMwX01TRytCUzBfQ0QrQlMwX0lPKQorI2RlZmluZSBCUF9EQVRBT1VUCTAKKyNkZWZpbmUgQlBfREFUQUlOCUJTMF9JTworI2RlZmluZSBCUF9DT01NQU5ECUJTMF9DRAorI2RlZmluZSBCUF9TVEFUVVMJKEJTMF9DRCtCUzBfSU8pCisjZGVmaW5lIEJQX01TR09VVAkoQlMwX01TRytCUzBfQ0QpCisjZGVmaW5lIEJQX01TR0lOCShCUzBfTVNHK0JTMF9DRCtCUzBfSU8pCisKKy8qIEJpdHMgaW4gdGhlIGV4Y2VwdGlvbiByZWdpc3Rlci4gKi8KKyNkZWZpbmUgRVhDX1NFTFdBVE4JMHgyMAkvKiAoYXMgdGFyZ2V0KSB3ZSB3ZXJlIHNlbGVjdGVkIHdpdGggQVROICovCisjZGVmaW5lIEVYQ19TRUxFQ1RFRAkweDEwCS8qIChhcyB0YXJnZXQpIHdlIHdlcmUgc2VsZWN0ZWQgdy9vIEFUTiAqLworI2RlZmluZSBFWENfUkVTRUxFQ1RFRAkweDA4CS8qIChhcyBpbml0aWF0b3IpIHdlIHdlcmUgcmVzZWxlY3RlZCAqLworI2RlZmluZSBFWENfQVJCTE9TVAkweDA0CS8qIHdlIGxvc3QgYXJiaXRyYXRpb24gKi8KKyNkZWZpbmUgRVhDX1BIQVNFTU0JMHgwMgkvKiBTQ1NJIHBoYXNlIG1pc21hdGNoICovCisjZGVmaW5lIEVYQ19TRUxUTwkweDAxCS8qIHNlbGVjdGlvbiB0aW1lb3V0ICovCisKKy8qIEJpdHMgaW4gdGhlIGVycm9yIHJlZ2lzdGVyICovCisjZGVmaW5lIEVSUl9VTkVYUERJU0MJMHg0MAkvKiB0YXJnZXQgdW5leHBlY3RlZGx5IGRpc2Nvbm5lY3RlZCAqLworI2RlZmluZSBFUlJfU0NTSVJFU0VUCTB4MjAJLyogU0NTSSBidXMgZ290IHJlc2V0IG9uIHVzICovCisjZGVmaW5lIEVSUl9TRVFFUlIJMHgxMAkvKiB3ZSBkaWQgc29tZXRoaW5nIHRoZSBjaGlwIGRpZG4ndCBsaWtlICovCisjZGVmaW5lIEVSUl9QQVJJVFkJMHgwMQkvKiBwYXJpdHkgZXJyb3Igd2FzIGRldGVjdGVkICovCisKKy8qIEJpdHMgaW4gdGhlIGludGVycnVwdCBhbmQgaW50cl9tYXNrIHJlZ2lzdGVycyAqLworI2RlZmluZSBJTlRfRVJST1IJMHgwNAkvKiBlcnJvciBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSU5UX0VYQ0VQVElPTgkweDAyCS8qIGV4Y2VwdGlvbiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSU5UX0NNRERPTkUJMHgwMQkvKiBjb21tYW5kIGRvbmUgaW50ZXJydXB0ICovCisKKy8qIEZpZWxkcyBpbiB0aGUgc3luY19wYXJhbXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1lOQ19PRkYoeCkJKCh4KSA+PiA0KQkvKiBvZmZzZXQgZmllbGQgKi8KKyNkZWZpbmUgU1lOQ19QRVIoeCkJKCh4KSAmIDB4ZikJLyogcGVyaW9kIGZpZWxkICovCisjZGVmaW5lIFNZTkNfUEFSQU1TKG8sIHApCSgoKG8pIDw8IDQpIHwgKHApKQorI2RlZmluZSBBU1lOQ19QQVJBTVMJMgkvKiBzeW5jX3BhcmFtcyB2YWx1ZSBmb3IgYXN5bmMgeGZlcnMgKi8KKworLyoKKyAqIEFzc3VtaW5nIGEgY2xvY2sgZnJlcXVlbmN5IG9mIDUwTUh6OgorICoKKyAqIFRoZSB0cmFuc2ZlciBwZXJpb2Qgd2l0aCBTWU5DX1BFUihzeW5jX3BhcmFtcykgPT0geAorICogaXMgKHggKyAyKSAqIDQwbnMsIGV4Y2VwdCB0aGF0IHggPT0gMCBnaXZlcyAxMDBucy4KKyAqCisgKiBUaGUgdW5pdHMgb2YgdGhlIHNlbF90aW1lb3V0IHJlZ2lzdGVyIGFyZSAxMG1zLgorICovCisKKworI2VuZGlmIC8qIF9NRVNIX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdm1lMTQ3LmMgYi9kcml2ZXJzL3Njc2kvbXZtZTE0Ny5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3M2IzM2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbXZtZTE0Ny5jCkBAIC0wLDAgKzEsMTU1IEBACisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9tdm1lMTQ3aHcuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJ3ZDMzYzkzLmgiCisjaW5jbHVkZSAibXZtZTE0Ny5oIgorCisjaW5jbHVkZTxsaW51eC9zdGF0Lmg+CisKKyNkZWZpbmUgSERBVEEocHRyKSAoKHN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhICopKChwdHIpLT5ob3N0ZGF0YSkpCisKK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICptdm1lMTQ3X2hvc3QgPSBOVUxMOworCitzdGF0aWMgaXJxcmV0dXJuX3QgbXZtZTE0N19pbnRyIChpbnQgaXJxLCB2b2lkICpkdW1teSwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworICAgIGlmIChpcnEgPT0gTVZNRTE0N19JUlFfU0NTSV9QT1JUKQorCXdkMzNjOTNfaW50ciAobXZtZTE0N19ob3N0KTsKKyAgICBlbHNlCisJbTE0N19wY2MtPmRtYV9pbnRyID0gMHg4OTsJLyogQWNrIGFuZCBlbmFibGUgaW50cyAqLworICAgIHJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBkbWFfc2V0dXAgKFNjc2lfQ21uZCAqY21kLCBpbnQgZGlyX2luKQoreworICAgIHVuc2lnbmVkIGNoYXIgZmxhZ3MgPSAweDAxOworICAgIHVuc2lnbmVkIGxvbmcgYWRkciA9IHZpcnRfdG9fYnVzKGNtZC0+U0NwLnB0cik7CisKKyAgICAvKiBzZXR1cCBkbWEgZGlyZWN0aW9uICovCisgICAgaWYgKCFkaXJfaW4pCisJZmxhZ3MgfD0gMHgwNDsKKworICAgIC8qIHJlbWVtYmVyIGRpcmVjdGlvbiAqLworICAgIEhEQVRBKG12bWUxNDdfaG9zdCktPmRtYV9kaXIgPSBkaXJfaW47CisKKyAgICBpZiAoZGlyX2luKQorICAJLyogaW52YWxpZGF0ZSBhbnkgY2FjaGUgKi8KKwljYWNoZV9jbGVhciAoYWRkciwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7CisgICAgZWxzZQorCS8qIHB1c2ggYW55IGRpcnR5IGNhY2hlICovCisJY2FjaGVfcHVzaCAoYWRkciwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7CisKKyAgICAvKiBzdGFydCBETUEgKi8KKyAgICBtMTQ3X3BjYy0+ZG1hX2JjciAgID0gY21kLT5TQ3AudGhpc19yZXNpZHVhbCB8ICgxPDwyNCk7CisgICAgbTE0N19wY2MtPmRtYV9kYWRyICA9IGFkZHI7CisgICAgbTE0N19wY2MtPmRtYV9jbnRybCA9IGZsYWdzOworCisgICAgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZG1hX3N0b3AgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBTY3NpX0NtbmQgKlNDcG50LAorCQkgICAgICBpbnQgc3RhdHVzKQoreworICAgIG0xNDdfcGNjLT5kbWFfY250cmwgPSAwOworfQorCitpbnQgbXZtZTE0N19kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICp0cG50KQoreworICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGNhbGxlZCA9IDA7CisgICAgd2QzM2M5M19yZWdzIHJlZ3M7CisKKyAgICBpZiAoIU1BQ0hfSVNfTVZNRTE0NyB8fCBjYWxsZWQpCisJcmV0dXJuIDA7CisgICAgY2FsbGVkKys7CisKKyAgICB0cG50LT5wcm9jX25hbWUgPSAiTVZNRTE0NyI7CisgICAgdHBudC0+cHJvY19pbmZvID0gJndkMzNjOTNfcHJvY19pbmZvOworCisgICAgbXZtZTE0N19ob3N0ID0gc2NzaV9yZWdpc3RlciAodHBudCwgc2l6ZW9mKHN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhKSk7CisgICAgaWYgKCFtdm1lMTQ3X2hvc3QpCisJICAgIGdvdG8gZXJyX291dDsKKworICAgIG12bWUxNDdfaG9zdC0+YmFzZSA9IDB4ZmZmZTQwMDA7CisgICAgbXZtZTE0N19ob3N0LT5pcnEgPSBNVk1FMTQ3X0lSUV9TQ1NJX1BPUlQ7CisgICAgcmVncy5TQVNSID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikweGZmZmU0MDAwOworICAgIHJlZ3MuU0NNRCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopMHhmZmZlNDAwMTsKKyAgICB3ZDMzYzkzX2luaXQobXZtZTE0N19ob3N0LCByZWdzLCBkbWFfc2V0dXAsIGRtYV9zdG9wLCBXRDMzQzkzX0ZTXzhfMTApOworCisgICAgaWYgKHJlcXVlc3RfaXJxKE1WTUUxNDdfSVJRX1NDU0lfUE9SVCwgbXZtZTE0N19pbnRyLCAwLCAiTVZNRTE0NyBTQ1NJIFBPUlQiLCBtdm1lMTQ3X2ludHIpKQorCSAgICBnb3RvIGVycl91bnJlZ2lzdGVyOworICAgIGlmIChyZXF1ZXN0X2lycShNVk1FMTQ3X0lSUV9TQ1NJX0RNQSwgbXZtZTE0N19pbnRyLCAwLCAiTVZNRTE0NyBTQ1NJIERNQSIsIG12bWUxNDdfaW50cikpCisJICAgIGdvdG8gZXJyX2ZyZWVfaXJxOworI2lmIDAJLyogRGlzYWJsZWQ7IGNhdXNlcyBwcm9ibGVtcyBib290aW5nICovCisgICAgbTE0N19wY2MtPnNjc2lfaW50ZXJydXB0ID0gMHgxMDsJLyogQXNzZXJ0IFNDU0kgYnVzIHJlc2V0ICovCisgICAgdWRlbGF5KDEwMCk7CisgICAgbTE0N19wY2MtPnNjc2lfaW50ZXJydXB0ID0gMHgwMDsJLyogTmVnYXRlIFNDU0kgYnVzIHJlc2V0ICovCisgICAgdWRlbGF5KDIwMDApOworICAgIG0xNDdfcGNjLT5zY3NpX2ludGVycnVwdCA9IDB4NDA7CS8qIENsZWFyIGJ1cyByZXNldCBpbnRlcnJ1cHQgKi8KKyNlbmRpZgorICAgIG0xNDdfcGNjLT5zY3NpX2ludGVycnVwdCA9IDB4MDk7CS8qIEVuYWJsZSBpbnRlcnJ1cHQgKi8KKworICAgIG0xNDdfcGNjLT5kbWFfY250cmwgPSAweDAwOwkJLyogZW5zdXJlIERNQSBpcyBzdG9wcGVkICovCisgICAgbTE0N19wY2MtPmRtYV9pbnRyID0gMHg4OTsJCS8qIEFjayBhbmQgZW5hYmxlIGludHMgKi8KKworICAgIHJldHVybiAxOworCisgZXJyX2ZyZWVfaXJxOgorICAgIGZyZWVfaXJxKE1WTUUxNDdfSVJRX1NDU0lfUE9SVCwgbXZtZTE0N19pbnRyKTsKKyBlcnJfdW5yZWdpc3RlcjoKKyAgICB3ZDMzYzkzX3JlbGVhc2UoKTsKKyAgICBzY3NpX3VucmVnaXN0ZXIobXZtZTE0N19ob3N0KTsKKyBlcnJfb3V0OgorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12bWUxNDdfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqY21kKQoreworCS8qIEZJWE1FIHBlcmZvcm0gYnVzLXNwZWNpZmljIHJlc2V0ICovCisJd2QzM2M5M19ob3N0X3Jlc2V0KGNtZCk7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKyNkZWZpbmUgSE9TVFNfQworCisjaW5jbHVkZSAibXZtZTE0Ny5oIgorCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJNVk1FMTQ3IiwKKwkubmFtZQkJCT0gIk1WTUUxNDcgYnVpbHQtaW4gU0NTSSIsCisJLmRldGVjdAkJCT0gbXZtZTE0N19kZXRlY3QsCisJLnJlbGVhc2UJCT0gbXZtZTE0N19yZWxlYXNlLAorCS5xdWV1ZWNvbW1hbmQJCT0gd2QzM2M5M19xdWV1ZWNvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSB3ZDMzYzkzX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IG12bWUxNDdfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSB3ZDMzYzkzX2hvc3RfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSBDQU5fUVVFVUUsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gQ01EX1BFUl9MVU4sCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HCit9OworCisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCitpbnQgbXZtZTE0N19yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworI2lmZGVmIE1PRFVMRQorICAgIC8qIFhYWCBNYWtlIHN1cmUgRE1BIGlzIHN0b3BwZWQhICovCisgICAgd2QzM2M5M19yZWxlYXNlKCk7CisgICAgZnJlZV9pcnEoTVZNRTE0N19JUlFfU0NTSV9QT1JULCBtdm1lMTQ3X2ludHIpOworICAgIGZyZWVfaXJxKE1WTUUxNDdfSVJRX1NDU0lfRE1BLCBtdm1lMTQ3X2ludHIpOworI2VuZGlmCisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXZtZTE0Ny5oIGIvZHJpdmVycy9zY3NpL212bWUxNDcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODkwM2YwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL212bWUxNDcuaApAQCAtMCwwICsxLDI4IEBACisjaWZuZGVmIE1WTUUxNDdfSAorCisvKiAkSWQ6IG12bWUxNDcuaCx2IDEuNCAxOTk3LzAxLzE5IDIzOjA3OjEwIGRhdmVtIEV4cCAkCisgKgorICogSGVhZGVyIGZpbGUgZm9yIHRoZSBNVk1FMTQ3IGJ1aWx0LWluIFNDU0kgY29udHJvbGxlciBmb3IgTGludXgKKyAqCisgKiBXcml0dGVuIGFuZCAoQykgMTk5MywgSGFtaXNoIE1hY2RvbmFsZCwgc2VlIG12bWUxNDcuYyBmb3IgbW9yZSBpbmZvCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitpbnQgbXZtZTE0N19kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICopOworaW50IG12bWUxNDdfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICopOworY29uc3QgY2hhciAqd2QzM2M5M19pbmZvKHZvaWQpOworaW50IHdkMzNjOTNfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKK2ludCB3ZDMzYzkzX2Fib3J0KFNjc2lfQ21uZCAqKTsKK2ludCB3ZDMzYzkzX3Jlc2V0KFNjc2lfQ21uZCAqLCB1bnNpZ25lZCBpbnQpOworCisjaWZuZGVmIENNRF9QRVJfTFVOCisjZGVmaW5lIENNRF9QRVJfTFVOIDIKKyNlbmRpZgorCisjaWZuZGVmIENBTl9RVUVVRQorI2RlZmluZSBDQU5fUVVFVUUgMTYKKyNlbmRpZgorCisjZW5kaWYgLyogTVZNRTE0N19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXZtZTE2eC5jIGIvZHJpdmVycy9zY3NpL212bWUxNnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmQ4ZDhlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL212bWUxNnguYwpAQCAtMCwwICsxLDgwIEBACisvKgorICogRGV0ZWN0aW9uIHJvdXRpbmUgZm9yIHRoZSBOQ1I1M2M3MTAgYmFzZWQgTVZNRTE2eCBTQ1NJIENvbnRyb2xsZXJzIGZvciBMaW51eC4KKyAqCisgKiBCYXNlZCBvbiB3b3JrIGJ5IEFsYW4gSG91cmloYW5lCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL212bWUxNnhody5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgIjUzYzd4eC5oIgorI2luY2x1ZGUgIm12bWUxNnguaCIKKworI2luY2x1ZGU8bGludXgvc3RhdC5oPgorCisKK2ludCBtdm1lMTZ4X3Njc2lfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCkKK3sKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBjYWxsZWQgPSAwOworICAgIGludCBjbG9jazsKKyAgICBsb25nIGxvbmcgb3B0aW9uczsKKworICAgIGlmICghTUFDSF9JU19NVk1FMTZ4KQorCQlyZXR1cm4gMDsKKyAgICBpZiAobXZtZTE2eF9jb25maWcgJiBNVk1FMTZ4X0NPTkZJR19OT19TQ1NJQ0hJUCkgeworCXByaW50ayAoIlNDU0kgZGV0ZWN0aW9uIGRpc2FibGVkLCBTQ1NJIGNoaXAgbm90IHByZXNlbnRcbiIpOworCXJldHVybiAwOworICAgIH0KKyAgICBpZiAoY2FsbGVkKQorCXJldHVybiAwOworCisgICAgdHBudC0+cHJvY19uYW1lID0gIk1WTUUxNngiOworCisgICAgb3B0aW9ucyA9IE9QVElPTl9NRU1PUllfTUFQUEVEfE9QVElPTl9ERUJVR19URVNUMXxPUFRJT05fSU5URkxZfE9QVElPTl9TWU5DSFJPTk9VU3xPUFRJT05fQUxXQVlTX1NZTkNIUk9OT1VTfE9QVElPTl9ESVNDT05ORUNUOworCisgICAgY2xvY2sgPSA2NjAwMDAwMDsJLyogNjZNSHogU0NTSSBDbG9jayAqLworCisgICAgbmNyNTNjN3h4X2luaXQodHBudCwgMCwgNzEwLCAodW5zaWduZWQgbG9uZykweGZmZjQ3MDAwLAorCQkJMCwgTVZNRTE2eF9JUlFfU0NTSSwgRE1BX05PTkUsCisJCQlvcHRpb25zLCBjbG9jayk7CisgICAgY2FsbGVkID0gMTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtdm1lMTZ4X3Njc2lfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpZiAoc2hvc3QtPmlycSkKKwkJZnJlZV9pcnEoc2hvc3QtPmlycSwgTlVMTCk7CisJaWYgKHNob3N0LT5kbWFfY2hhbm5lbCAhPSAweGZmKQorCQlmcmVlX2RtYShzaG9zdC0+ZG1hX2NoYW5uZWwpOworCWlmIChzaG9zdC0+aW9fcG9ydCAmJiBzaG9zdC0+bl9pb19wb3J0KQorCQlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgc2hvc3QtPm5faW9fcG9ydCk7CisJc2NzaV91bnJlZ2lzdGVyKHNob3N0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLm5hbWUJCQk9ICJNVk1FMTZ4IE5DUjUzYzcxMCBTQ1NJIiwKKwkuZGV0ZWN0CQkJPSBtdm1lMTZ4X3Njc2lfZGV0ZWN0LAorCS5yZWxlYXNlCQk9IG12bWUxNnhfc2NzaV9yZWxlYXNlLAorCS5xdWV1ZWNvbW1hbmQJCT0gTkNSNTNjN3h4X3F1ZXVlX2NvbW1hbmQsCisJLmFib3J0CQkJPSBOQ1I1M2M3eHhfYWJvcnQsCisJLnJlc2V0CQkJPSBOQ1I1M2M3eHhfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSAyNCwKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gNjMsCisJLmNtZF9wZXJfbHVuCQk9IDMsCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORworfTsKKworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdm1lMTZ4LmggYi9kcml2ZXJzL3Njc2kvbXZtZTE2eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MTczYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbXZtZTE2eC5oCkBAIC0wLDAgKzEsMjQgQEAKKyNpZm5kZWYgTVZNRTE2eF9TQ1NJX0gKKyNkZWZpbmUgTVZNRTE2eF9TQ1NJX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2ludCBtdm1lMTZ4X3Njc2lfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK2NvbnN0IGNoYXIgKk5DUjUzYzd4MF9pbmZvKHZvaWQpOworaW50IE5DUjUzYzd4eF9xdWV1ZV9jb21tYW5kKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKK2ludCBOQ1I1M2M3eHhfYWJvcnQoU2NzaV9DbW5kICopOworaW50IE5DUjUzYzd4MF9yZWxlYXNlIChzdHJ1Y3QgU2NzaV9Ib3N0ICopOworaW50IE5DUjUzYzd4eF9yZXNldChTY3NpX0NtbmQgKiwgdW5zaWduZWQgaW50KTsKK3ZvaWQgTkNSNTNjN3gwX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworCisjaWZuZGVmIENNRF9QRVJfTFVOCisjZGVmaW5lIENNRF9QRVJfTFVOIDMKKyNlbmRpZgorCisjaWZuZGVmIENBTl9RVUVVRQorI2RlZmluZSBDQU5fUVVFVUUgMjQKKyNlbmRpZgorCisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CisKKyNlbmRpZiAvKiBNVk1FMTZ4X1NDU0lfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL25jcjUzYzh4eC5jIGIvZHJpdmVycy9zY3NpL25jcjUzYzh4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZTEzMjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbmNyNTNjOHh4LmMKQEAgLTAsMCArMSw3OTg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiAgRGV2aWNlIGRyaXZlciBmb3IgdGhlIFBDSS1TQ1NJIE5DUjUzOFhYIGNvbnRyb2xsZXIgZmFtaWx5LgorKioKKyoqICBDb3B5cmlnaHQgKEMpIDE5OTQgIFdvbGZnYW5nIFN0YW5nbG1laWVyCisqKgorKiogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyoqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqKgorKiogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqKgorKiogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyoqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFRoaXMgZHJpdmVyIGhhcyBiZWVuIHBvcnRlZCB0byBMaW51eCBmcm9tIHRoZSBGcmVlQlNEIE5DUjUzQzhYWCBkcml2ZXIKKyoqICBhbmQgaXMgY3VycmVudGx5IG1haW50YWluZWQgYnkKKyoqCisqKiAgICAgICAgICBHZXJhcmQgUm91ZGllciAgICAgICAgICAgICAgPGdyb3VkaWVyQGZyZWUuZnI+CisqKgorKiogIEJlaW5nIGdpdmVuIHRoYXQgdGhpcyBkcml2ZXIgb3JpZ2luYXRlcyBmcm9tIHRoZSBGcmVlQlNEIHZlcnNpb24sIGFuZAorKiogIGluIG9yZGVyIHRvIGtlZXAgc3luZXJneSBvbiBib3RoLCBhbnkgc3VnZ2VzdGVkIGVuaGFuY2VtZW50cyBhbmQgY29ycmVjdGlvbnMKKyoqICByZWNlaXZlZCBvbiBMaW51eCBhcmUgYXV0b21hdGljYWxseSBhIHBvdGVudGlhbCBjYW5kaWRhdGUgZm9yIHRoZSBGcmVlQlNEIAorKiogIHZlcnNpb24uCisqKgorKiogIFRoZSBvcmlnaW5hbCBkcml2ZXIgaGFzIGJlZW4gd3JpdHRlbiBmb3IgMzg2YnNkIGFuZCBGcmVlQlNEIGJ5CisqKiAgICAgICAgICBXb2xmZ2FuZyBTdGFuZ2xtZWllciAgICAgICAgPHdvbGZAY29sb2duZS5kZT4KKyoqICAgICAgICAgIFN0ZWZhbiBFc3NlciAgICAgICAgICAgICAgICA8c2VAbWkuVW5pLUtvZWxuLmRlPgorKioKKyoqICBBbmQgaGFzIGJlZW4gcG9ydGVkIHRvIE5ldEJTRCBieQorKiogICAgICAgICAgQ2hhcmxlcyBNLiBIYW5udW0gICAgICAgICAgIDxteWNyb2Z0QGdudS5haS5taXQuZWR1PgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgICAgICAgICAgICAgICAgICAgIEJyaWVmIGhpc3RvcnkKKyoqCisqKiAgRGVjZW1iZXIgMTAgMTk5NSBieSBHZXJhcmQgUm91ZGllcjoKKyoqICAgICBJbml0aWFsIHBvcnQgdG8gTGludXguCisqKgorKiogIEp1bmUgMjMgMTk5NiBieSBHZXJhcmQgUm91ZGllcjoKKyoqICAgICBTdXBwb3J0IGZvciA2NCBiaXRzIGFyY2hpdGVjdHVyZXMgKEFscGhhKS4KKyoqCisqKiAgTm92ZW1iZXIgMzAgMTk5NiBieSBHZXJhcmQgUm91ZGllcjoKKyoqICAgICBTdXBwb3J0IGZvciBGYXN0LTIwIHNjc2kuCisqKiAgICAgU3VwcG9ydCBmb3IgbGFyZ2UgRE1BIGZpZm8gYW5kIDEyOCBkd29yZHMgYnVyc3RpbmcuCisqKgorKiogIEZlYnJ1YXJ5IDI3IDE5OTcgYnkgR2VyYXJkIFJvdWRpZXI6CisqKiAgICAgU3VwcG9ydCBmb3IgRmFzdC00MCBzY3NpLgorKiogICAgIFN1cHBvcnQgZm9yIG9uLUJvYXJkIFJBTS4KKyoqCisqKiAgTWF5IDMgMTk5NyBieSBHZXJhcmQgUm91ZGllcjoKKyoqICAgICBGdWxsIHN1cHBvcnQgZm9yIHNjc2kgc2NyaXB0cyBpbnN0cnVjdGlvbnMgcHJlLWZldGNoaW5nLgorKioKKyoqICBNYXkgMTkgMTk5NyBieSBSaWNoYXJkIFdhbHRoYW0gPGRvcm1vdXNlQGZhcnNyb2J0LmRlbW9uLmNvLnVrPjoKKyoqICAgICBTdXBwb3J0IGZvciBOdlJBTSBkZXRlY3Rpb24gYW5kIHJlYWRpbmcuCisqKgorKiogIEF1Z3VzdCAxOCAxOTk3IGJ5IENvcnQgPGNvcnRAY3Mubm10LmVkdT46CisqKiAgICAgU3VwcG9ydCBmb3IgUG93ZXIvUEMgKEJpZyBFbmRpYW4pLgorKioKKyoqICBKdW5lIDIwIDE5OTggYnkgR2VyYXJkIFJvdWRpZXIKKyoqICAgICBTdXBwb3J0IGZvciB1cCB0byA2NCB0YWdzIHBlciBsdW4uCisqKiAgICAgTygxKSBldmVyeXdoZXJlIChDIGFuZCBTQ1JJUFRTKSBmb3Igbm9ybWFsIGNhc2VzLgorKiogICAgIExvdyBQQ0kgdHJhZmZpYyBmb3IgY29tbWFuZCBoYW5kbGluZyB3aGVuIG9uLWNoaXAgUkFNIGlzIHByZXNlbnQuCisqKiAgICAgQWdncmVzc2l2ZSBTQ1NJIFNDUklQVFMgb3B0aW1pemF0aW9ucy4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvKgorKioJU3VwcG9ydGVkIFNDU0ktSUkgZmVhdHVyZXM6CisqKgkgICAgU3luY2hyb25vdXMgbmVnb3RpYXRpb24KKyoqCSAgICBXaWRlIG5lZ290aWF0aW9uICAgICAgICAoZGVwZW5kcyBvbiB0aGUgTkNSIENoaXApCisqKgkgICAgRW5hYmxlIGRpc2Nvbm5lY3Rpb24KKyoqCSAgICBUYWdnZWQgY29tbWFuZCBxdWV1aW5nCisqKgkgICAgUGFyaXR5IGNoZWNraW5nCisqKgkgICAgRXRjLi4uCisqKgorKioJU3VwcG9ydGVkIE5DUi9TWU1CSU9TIGNoaXBzOgorKioJCTUzQzcyMAkJKFdpZGUsICAgRmFzdCBTQ1NJLTIsIGludGZseSBwcm9ibGVtcykKKyovCisKKy8qIE5hbWUgYW5kIHZlcnNpb24gb2YgdGhlIGRyaXZlciAqLworI2RlZmluZSBTQ1NJX05DUl9EUklWRVJfTkFNRQkibmNyNTNjOHh4LTMuNC4zZyIKKworI2RlZmluZSBTQ1NJX05DUl9ERUJVR19GTEFHUwkoMCkKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKiogICAgICBJbmNsdWRlIGZpbGVzCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuaD4KKworI2luY2x1ZGUgIm5jcjUzYzh4eC5oIgorCisjZGVmaW5lIE5BTUU1M0MJCQkibmNyNTNjIgorI2RlZmluZSBOQU1FNTNDOFhYCQkibmNyNTNjOHh4IgorCisjaW5jbHVkZSAic3ltNTNjOHh4X2NvbW0uaCIKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglUaGUgQ0NCIGRvbmUgcXVldWUgdXNlcyBhbiBhcnJheSBvZiBDQ0IgdmlydHVhbCAKKyoqCWFkZHJlc3Nlcy4gRW1wdHkgZW50cmllcyBhcmUgZmxhZ2dlZCB1c2luZyB0aGUgYm9ndXMgCisqKgl2aXJ0dWFsIGFkZHJlc3MgMHhmZmZmZmZmZi4KKyoqCisqKglTaW5jZSBQQ0kgZW5zdXJlcyB0aGF0IG9ubHkgYWxpZ25lZCBEV09SRHMgYXJlIGFjY2Vzc2VkIAorKioJYXRvbWljYWxseSwgNjQgYml0IGxpdHRsZS1lbmRpYW4gYXJjaGl0ZWN0dXJlIHJlcXVpcmVzIAorKioJdG8gdGVzdCB0aGUgaGlnaCBvcmRlciBEV09SRCBvZiB0aGUgZW50cnkgdG8gZGV0ZXJtaW5lIAorKioJaWYgaXQgaXMgZW1wdHkgb3IgdmFsaWQuCisqKgorKioJQlRXLCBJIHdpbGwgbWFrZSB0aGluZ3MgZGlmZmVyZW50bHkgYXMgc29vbiBhcyBJIHdpbGwgCisqKgloYXZlIGEgYmV0dGVyIGlkZWEsIGJ1dCB0aGlzIGlzIHNpbXBsZSBhbmQgc2hvdWxkIHdvcmsuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworIAorI2RlZmluZSBTQ1NJX05DUl9DQ0JfRE9ORV9TVVBQT1JUCisjaWZkZWYgIFNDU0lfTkNSX0NDQl9ET05FX1NVUFBPUlQKKworI2RlZmluZSBNQVhfRE9ORSAyNAorI2RlZmluZSBDQ0JfRE9ORV9FTVBUWSAweGZmZmZmZmZmVUwKKworLyogQWxsIDMyIGJpdCBhcmNoaXRlY3R1cmVzICovCisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorI2RlZmluZSBDQ0JfRE9ORV9WQUxJRChjcCkgICgoKHVfbG9uZykgY3ApICE9IENDQl9ET05FX0VNUFRZKQorCisvKiBBbGwgPiAzMiBiaXQgKDY0IGJpdCkgYXJjaGl0ZWN0dXJlcyByZWdhcmRsZXNzIGVuZGlhbi1uZXNzICovCisjZWxzZQorI2RlZmluZSBDQ0JfRE9ORV9WQUxJRChjcCkgIFwKKwkoKCgodV9sb25nKSBjcCkgJiAweGZmZmZmZmZmMDAwMDAwMDB1bCkgJiYgCVwKKwkgKCgodV9sb25nKSBjcCkgJiAweGZmZmZmZmZmdWwpICE9IENDQl9ET05FX0VNUFRZKQorI2VuZGlmCisKKyNlbmRpZiAvKiBTQ1NJX05DUl9DQ0JfRE9ORV9TVVBQT1JUICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCUNvbmZpZ3VyYXRpb24gYW5kIERlYnVnZ2luZworKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworLyoKKyoqICAgIFNDU0kgYWRkcmVzcyBvZiB0aGlzIGRldmljZS4KKyoqICAgIFRoZSBib290IHJvdXRpbmVzIHNob3VsZCBoYXZlIHNldCBpdC4KKyoqICAgIElmIG5vdCwgdXNlIHRoaXMuCisqLworCisjaWZuZGVmIFNDU0lfTkNSX01ZQUREUgorI2RlZmluZSBTQ1NJX05DUl9NWUFERFIgICAgICAoNykKKyNlbmRpZgorCisvKgorKiogICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRhZ3MgcGVyIGxvZ2ljIHVuaXQuCisqKiAgICBVc2VkIG9ubHkgZm9yIGRpc2sgZGV2aWNlcyB0aGF0IHN1cHBvcnQgdGFncy4KKyovCisKKyNpZm5kZWYgU0NTSV9OQ1JfTUFYX1RBR1MKKyNkZWZpbmUgU0NTSV9OQ1JfTUFYX1RBR1MgICAgKDgpCisjZW5kaWYKKworLyoKKyoqICAgIFRBR1MgYXJlIGFjdHVhbGx5IGxpbWl0ZWQgdG8gNjQgdGFncy9sdW4uCisqKiAgICBXZSBuZWVkIHRvIGRlYWwgd2l0aCBwb3dlciBvZiAyLCBmb3IgYWxpZ25tZW50IGNvbnN0cmFpbnRzLgorKi8KKyNpZglTQ1NJX05DUl9NQVhfVEFHUyA+IDY0CisjZGVmaW5lCU1BWF9UQUdTICg2NCkKKyNlbHNlCisjZGVmaW5lCU1BWF9UQUdTIFNDU0lfTkNSX01BWF9UQUdTCisjZW5kaWYKKworI2RlZmluZSBOT19UQUcJKDI1NSkKKworLyoKKyoqCUNob29zZSBhcHByb3ByaWF0ZSB0eXBlIGZvciB0YWcgYml0bWFwLgorKi8KKyNpZglNQVhfVEFHUyA+IDMyCit0eXBlZGVmIHU2NCB0YWdtYXBfdDsKKyNlbHNlCit0eXBlZGVmIHUzMiB0YWdtYXBfdDsKKyNlbmRpZgorCisvKgorKiogICAgTnVtYmVyIG9mIHRhcmdldHMgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIuCisqKiAgICBuIHBlcm1pdHMgdGFyZ2V0IG51bWJlcnMgMC4ubi0xLgorKiogICAgRGVmYXVsdCBpcyAxNiwgbWVhbmluZyB0YXJnZXRzICMwLi4jMTUuCisqKiAgICAjNyAuLiBpcyBteXNlbGYuCisqLworCisjaWZkZWYgU0NTSV9OQ1JfTUFYX1RBUkdFVAorI2RlZmluZSBNQVhfVEFSR0VUICAoU0NTSV9OQ1JfTUFYX1RBUkdFVCkKKyNlbHNlCisjZGVmaW5lIE1BWF9UQVJHRVQgICgxNikKKyNlbmRpZgorCisvKgorKiogICAgTnVtYmVyIG9mIGxvZ2ljIHVuaXRzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyLgorKiogICAgbiBlbmFibGVzIGxvZ2ljIHVuaXQgbnVtYmVycyAwLi5uLTEuCisqKiAgICBUaGUgY29tbW9uIFNDU0kgZGV2aWNlcyByZXF1aXJlIG9ubHkKKyoqICAgIG9uZSBsdW4sIHNvIHRha2UgMSBhcyB0aGUgZGVmYXVsdC4KKyovCisKKyNpZmRlZiBTQ1NJX05DUl9NQVhfTFVOCisjZGVmaW5lIE1BWF9MVU4gICAgU0NTSV9OQ1JfTUFYX0xVTgorI2Vsc2UKKyNkZWZpbmUgTUFYX0xVTiAgICAoMSkKKyNlbmRpZgorCisvKgorKiogICAgQXN5bmNocm9ub3VzIHByZS1zY2FsZXIgKG5zKS4gU2hhbGwgYmUgNDAKKyovCisgCisjaWZuZGVmIFNDU0lfTkNSX01JTl9BU1lOQworI2RlZmluZSBTQ1NJX05DUl9NSU5fQVNZTkMgKDQwKQorI2VuZGlmCisKKy8qCisqKiAgICBUaGUgbWF4aW11bSBudW1iZXIgb2Ygam9icyBzY2hlZHVsZWQgZm9yIHN0YXJ0aW5nLgorKiogICAgVGhlcmUgc2hvdWxkIGJlIG9uZSBzbG90IHBlciB0YXJnZXQsIGFuZCBvbmUgc2xvdAorKiogICAgZm9yIGVhY2ggdGFnIG9mIGVhY2ggdGFyZ2V0IGluIHVzZS4KKyoqICAgIFRoZSBjYWxjdWxhdGlvbiBiZWxvdyBpcyBhY3R1YWxseSBxdWl0ZSBzaWxseSAuLi4KKyovCisKKyNpZmRlZiBTQ1NJX05DUl9DQU5fUVVFVUUKKyNkZWZpbmUgTUFYX1NUQVJUICAgKFNDU0lfTkNSX0NBTl9RVUVVRSArIDQpCisjZWxzZQorI2RlZmluZSBNQVhfU1RBUlQgICAoTUFYX1RBUkdFVCArIDcgKiBNQVhfVEFHUykKKyNlbmRpZgorCisvKgorKiogICBXZSBsaW1pdCB0aGUgbWF4IG51bWJlciBvZiBwZW5kaW5nIElPIHRvIDI1MC4KKyoqICAgc2luY2Ugd2UgZG9ubm90IHdhbnQgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIDEgCisqKiAgIFBBR0UgZm9yICdzY3JpcHRoJy4KKyovCisjaWYJTUFYX1NUQVJUID4gMjUwCisjdW5kZWYJTUFYX1NUQVJUCisjZGVmaW5lCU1BWF9TVEFSVCAyNTAKKyNlbmRpZgorCisvKgorKiogICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHNlZ21lbnRzIGEgdHJhbnNmZXIgaXMgc3BsaXQgaW50by4KKyoqICAgIFdlIHN1cHBvcnQgdXAgdG8gMTI3IHNlZ21lbnRzIGZvciBib3RoIHJlYWQgYW5kIHdyaXRlLgorKiogICAgVGhlIGRhdGEgc2NyaXB0cyBhcmUgYnJva2VuIGludG8gMiBzdWItc2NyaXB0cy4KKyoqICAgIDgwIChNQVhfU0NBVFRFUkwpIHNlZ21lbnRzIGFyZSBtb3ZlZCBmcm9tIGEgc3ViLXNjcmlwdAorKiogICAgaW4gb24tY2hpcCBSQU0uIFRoaXMgbWFrZXMgZGF0YSB0cmFuc2ZlcnMgc2hvcnRlciB0aGFuIAorKiogICAgODBrIChhc3N1bWluZyAxayBmcykgYXMgZmFzdCBhcyBwb3NzaWJsZS4KKyovCisKKyNkZWZpbmUgTUFYX1NDQVRURVIgKFNDU0lfTkNSX01BWF9TQ0FUVEVSKQorCisjaWYgKE1BWF9TQ0FUVEVSID4gODApCisjZGVmaW5lIE1BWF9TQ0FUVEVSTAk4MAorI2RlZmluZQlNQVhfU0NBVFRFUkgJKE1BWF9TQ0FUVEVSIC0gTUFYX1NDQVRURVJMKQorI2Vsc2UKKyNkZWZpbmUgTUFYX1NDQVRURVJMCShNQVhfU0NBVFRFUi0xKQorI2RlZmluZQlNQVhfU0NBVFRFUkgJMQorI2VuZGlmCisKKy8qCisqKglvdGhlcgorKi8KKworI2RlZmluZSBOQ1JfU05PT1BfVElNRU9VVCAoMTAwMDAwMCkKKworLyoKKyoqCU90aGVyIGRlZmluaXRpb25zCisqLworCisjZGVmaW5lIFNjc2lSZXN1bHQoaG9zdF9jb2RlLCBzY3NpX2NvZGUpICgoKGhvc3RfY29kZSkgPDwgMTYpICsgKChzY3NpX2NvZGUpICYgMHg3ZikpCisKKyNkZWZpbmUgaW5pdHZlcmJvc2UgKGRyaXZlcl9zZXR1cC52ZXJib3NlKQorI2RlZmluZSBib290dmVyYm9zZSAobnAtPnZlcmJvc2UpCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCUNvbW1hbmQgY29udHJvbCBibG9jayBzdGF0ZXMuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjZGVmaW5lIEhTX0lETEUJCSgwKQorI2RlZmluZSBIU19CVVNZCQkoMSkKKyNkZWZpbmUgSFNfTkVHT1RJQVRFCSgyKQkvKiBzeW5jL3dpZGUgZGF0YSB0cmFuc2ZlciovCisjZGVmaW5lIEhTX0RJU0NPTk5FQ1QJKDMpCS8qIERpc2Nvbm5lY3RlZCBieSB0YXJnZXQgKi8KKworI2RlZmluZSBIU19ET05FTUFTSwkoMHg4MCkKKyNkZWZpbmUgSFNfQ09NUExFVEUJKDR8SFNfRE9ORU1BU0spCisjZGVmaW5lIEhTX1NFTF9USU1FT1VUCSg1fEhTX0RPTkVNQVNLKQkvKiBTZWxlY3Rpb24gdGltZW91dCAgICAgICovCisjZGVmaW5lIEhTX1JFU0VUCSg2fEhTX0RPTkVNQVNLKQkvKiBTQ1NJIHJlc2V0CSAgICAgICAgICAqLworI2RlZmluZSBIU19BQk9SVEVECSg3fEhTX0RPTkVNQVNLKQkvKiBUcmFuc2ZlciBhYm9ydGVkICAgICAgICovCisjZGVmaW5lIEhTX1RJTUVPVVQJKDh8SFNfRE9ORU1BU0spCS8qIFNvZnR3YXJlIHRpbWVvdXQgICAgICAgKi8KKyNkZWZpbmUgSFNfRkFJTAkJKDl8SFNfRE9ORU1BU0spCS8qIFNDU0kgb3IgUENJIGJ1cyBlcnJvcnMgKi8KKyNkZWZpbmUgSFNfVU5FWFBFQ1RFRAkoMTB8SFNfRE9ORU1BU0spLyogVW5leHBlY3RlZCBkaXNjb25uZWN0ICAqLworCisvKgorKioJSW52YWxpZCBob3N0IHN0YXR1cyB2YWx1ZXMgdXNlZCBieSB0aGUgU0NSSVBUUyBwcm9jZXNzb3IgCisqKgl3aGVuIHRoZSBuZXh1cyBpcyBub3QgZnVsbHkgaWRlbnRpZmllZC4KKyoqCVNoYWxsIG5ldmVyIGFwcGVhciBpbiBhIENDQi4KKyovCisKKyNkZWZpbmUgSFNfSU5WQUxNQVNLCSgweDQwKQorI2RlZmluZQlIU19TRUxFQ1RJTkcJKDB8SFNfSU5WQUxNQVNLKQorI2RlZmluZQlIU19JTl9SRVNFTEVDVAkoMXxIU19JTlZBTE1BU0spCisjZGVmaW5lCUhTX1NUQVJUSU5HCSgyfEhTX0lOVkFMTUFTSykKKworLyoKKyoqCUZsYWdzIHNldCBieSB0aGUgU0NSSVBUIHByb2Nlc3NvciBmb3IgY29tbWFuZHMgCisqKgl0aGF0IGhhdmUgYmVlbiBza2lwcGVkLgorKi8KKyNkZWZpbmUgSFNfU0tJUE1BU0sJKDB4MjApCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCVNvZnR3YXJlIEludGVycnVwdCBDb2RlcworKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2RlZmluZQlTSVJfQkFEX1NUQVRVUwkJKDEpCisjZGVmaW5lCVNJUl9YWFhYWFhYWFhYCQkoMikKKyNkZWZpbmUJU0lSX05FR09fU1lOQwkJKDMpCisjZGVmaW5lCVNJUl9ORUdPX1dJREUJCSg0KQorI2RlZmluZQlTSVJfTkVHT19GQUlMRUQJCSg1KQorI2RlZmluZQlTSVJfTkVHT19QUk9UTwkJKDYpCisjZGVmaW5lCVNJUl9SRUpFQ1RfUkVDRUlWRUQJKDcpCisjZGVmaW5lCVNJUl9SRUpFQ1RfU0VOVAkJKDgpCisjZGVmaW5lCVNJUl9JR05fUkVTSURVRQkJKDkpCisjZGVmaW5lCVNJUl9NSVNTSU5HX1NBVkUJKDEwKQorI2RlZmluZQlTSVJfUkVTRUxfTk9fTVNHX0lOCSgxMSkKKyNkZWZpbmUJU0lSX1JFU0VMX05PX0lERU5USUZZCSgxMikKKyNkZWZpbmUJU0lSX1JFU0VMX0JBRF9MVU4JKDEzKQorI2RlZmluZQlTSVJfUkVTRUxfQkFEX1RBUkdFVAkoMTQpCisjZGVmaW5lCVNJUl9SRVNFTF9CQURfSV9UX0wJKDE1KQorI2RlZmluZQlTSVJfUkVTRUxfQkFEX0lfVF9MX1EJKDE2KQorI2RlZmluZQlTSVJfRE9ORV9PVkVSRkxPVwkoMTcpCisjZGVmaW5lCVNJUl9JTlRGTFkJCSgxOCkKKyNkZWZpbmUJU0lSX01BWAkJCSgxOCkKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJRXh0ZW5kZWQgZXJyb3IgY29kZXMuCisqKgl4ZXJyX3N0YXR1cyBmaWVsZCBvZiBzdHJ1Y3QgY2NiLgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2RlZmluZQlYRV9PSwkJKDApCisjZGVmaW5lCVhFX0VYVFJBX0RBVEEJKDEpCS8qIHVuZXhwZWN0ZWQgZGF0YSBwaGFzZSAqLworI2RlZmluZQlYRV9CQURfUEhBU0UJKDIpCS8qIGlsbGVnYWwgcGhhc2UgKDQvNSkgICAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglOZWdvdGlhdGlvbiBzdGF0dXMuCisqKgluZWdvX3N0YXR1cyBmaWVsZAlvZiBzdHJ1Y3QgY2NiLgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2RlZmluZSBOU19OT0NIQU5HRQkoMCkKKyNkZWZpbmUgTlNfU1lOQwkJKDEpCisjZGVmaW5lIE5TX1dJREUJCSgyKQorI2RlZmluZSBOU19QUFIJCSg0KQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglNaXNjLgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2RlZmluZSBDQ0JfTUFHSUMJKDB4ZjI2OTFhZDIpCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCURlY2xhcmF0aW9uIG9mIHN0cnVjdHMuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitzdGF0aWMgc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICpuY3I1M2M4eHhfdHJhbnNwb3J0X3RlbXBsYXRlID0gTlVMTDsKKworc3RydWN0IHRjYjsKK3N0cnVjdCBsY2I7CitzdHJ1Y3QgY2NiOworc3RydWN0IG5jYjsKK3N0cnVjdCBzY3JpcHQ7CisKK3N0cnVjdCBsaW5rIHsKKwluY3JjbWQJbF9jbWQ7CisJbmNyY21kCWxfcGFkZHI7Cit9OworCitzdHJ1Y3QJdXNyY21kIHsKKwl1X2xvbmcJdGFyZ2V0OworCXVfbG9uZwlsdW47CisJdV9sb25nCWRhdGE7CisJdV9sb25nCWNtZDsKK307CisKKyNkZWZpbmUgVUNfU0VUU1lOQyAgICAgIDEwCisjZGVmaW5lIFVDX1NFVFRBR1MJMTEKKyNkZWZpbmUgVUNfU0VUREVCVUcJMTIKKyNkZWZpbmUgVUNfU0VUT1JERVIJMTMKKyNkZWZpbmUgVUNfU0VUV0lERQkxNAorI2RlZmluZSBVQ19TRVRGTEFHCTE1CisjZGVmaW5lIFVDX1NFVFZFUkJPU0UJMTcKKworI2RlZmluZQlVRl9UUkFDRQkoMHgwMSkKKyNkZWZpbmUJVUZfTk9ESVNDCSgweDAyKQorI2RlZmluZQlVRl9OT1NDQU4JKDB4MDQpCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJRGVjbGFyYXRpb24gb2Ygc3RydWN0czoJCXRhcmdldCBjb250cm9sIGJsb2NrCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdHJ1Y3QgdGNiIHsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglEdXJpbmcgcmVzZWxlY3Rpb24gdGhlIG5jciBqdW1wcyB0byB0aGlzIHBvaW50IHdpdGggU0ZCUiAKKwkqKglzZXQgdG8gdGhlIGVuY29kZWQgdGFyZ2V0IG51bWJlciB3aXRoIGJpdCA3IHNldC4KKwkqKglpZiBpdCdzIG5vdCB0aGlzIHRhcmdldCwganVtcCB0byB0aGUgbmV4dC4KKwkqKgorCSoqCUpVTVAgIElGIChTRkJSICE9ICN0YXJnZXQjKSwgQChuZXh0IHRjYikKKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXN0cnVjdCBsaW5rICAganVtcF90Y2I7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglMb2FkIHRoZSBhY3R1YWwgdmFsdWVzIGZvciB0aGUgc3hmZXIgYW5kIHRoZSBzY250bDMKKwkqKglyZWdpc3RlciAoc3luYy93aWRlIG1vZGUpLgorCSoqCisJKioJU0NSX0NPUFkgKDEpLCBAKHN2YWwgZmllbGQgb2YgdGhpcyB0Y2IpLCBAKHN4ZmVyICByZWdpc3RlcikKKwkqKglTQ1JfQ09QWSAoMSksIEAod3ZhbCBmaWVsZCBvZiB0aGlzIHRjYiksIEAoc2NudGwzIHJlZ2lzdGVyKQorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJbmNyY21kCWdldHNjcls2XTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCUdldCB0aGUgSURFTlRJRlkgbWVzc2FnZSBhbmQgbG9hZCB0aGUgTFVOIHRvIFNGQlIuCisJKioKKwkqKglDQUxMLCA8UkVTRUxfTFVOPgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJc3RydWN0IGxpbmsgICBjYWxsX2x1bjsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCU5vdyBsb29rIGZvciB0aGUgcmlnaHQgbHVuLgorCSoqCisJKioJRm9yIGkgPSAwIHRvIDMKKwkqKgkJU0NSX0pVTVAgXiBJRlRSVUUoTUFTSyhpLCAzKSksIEAoZmlyc3QgbGNiIG1vZC4gaSkKKwkqKgorCSoqCVJlY2VudCBjaGlwcyB3aWxsIHByZWZldGNoIHRoZSA0IEpVTVBTIHVzaW5nIG9ubHkgMSBidXJzdC4KKwkqKglJdCBpcyBraW5kIG9mIGhhc2hjb2RpbmcuCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwlzdHJ1Y3QgbGluayAgICAganVtcF9sY2JbNF07CS8qIEpVTVBzIGZvciByZXNlbGVjdGlvbgkqLworCXN0cnVjdCBsY2IgKglscFtNQVhfTFVOXTsJLyogVGhlIGxjYidzIG9mIHRoaXMgdGNiCSovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglQb2ludGVyIHRvIHRoZSBjY2IgdXNlZCBmb3IgbmVnb3RpYXRpb24uCisJKioJUHJldmVudCBmcm9tIHN0YXJ0aW5nIGEgbmVnb3RpYXRpb24gZm9yIGFsbCBxdWV1ZWQgY29tbWFuZHMgCisJKioJd2hlbiB0YWdnZWQgY29tbWFuZCBxdWV1aW5nIGlzIGVuYWJsZWQuCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwlzdHJ1Y3QgY2NiICogICBuZWdvX2NwOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJc3RhdGlzdGljYWwgZGF0YQorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJdV9sb25nCXRyYW5zZmVyczsKKwl1X2xvbmcJYnl0ZXM7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKgluZWdvdGlhdGlvbiBvZiB3aWRlIGFuZCBzeW5jaCB0cmFuc2ZlciBhbmQgZGV2aWNlIHF1aXJrcy4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworI2lmZGVmIFNDU0lfTkNSX0JJR19FTkRJQU4KKy8qMCovCXUxNglwZXJpb2Q7CisvKjIqLwl1X2NoYXIJc3ZhbDsKKy8qMyovCXVfY2hhcgltaW5zeW5jOworLyowKi8JdV9jaGFyCXd2YWw7CisvKjEqLwl1X2NoYXIJd2lkZWRvbmU7CisvKjIqLwl1X2NoYXIJcXVpcmtzOworLyozKi8JdV9jaGFyCW1heG9mZnM7CisjZWxzZQorLyowKi8JdV9jaGFyCW1pbnN5bmM7CisvKjEqLwl1X2NoYXIJc3ZhbDsKKy8qMiovCXUxNglwZXJpb2Q7CisvKjAqLwl1X2NoYXIJbWF4b2ZmczsKKy8qMSovCXVfY2hhcglxdWlya3M7CisvKjIqLwl1X2NoYXIJd2lkZWRvbmU7CisvKjMqLwl1X2NoYXIJd3ZhbDsKKyNlbmRpZgorCisJLyogVXNlciBzZXR0YWJsZSBsaW1pdHMgYW5kIG9wdGlvbnMuICAqLworCXVfY2hhcgl1c3JzeW5jOworCXVfY2hhcgl1c3J3aWRlOworCXVfY2hhcgl1c3J0YWdzOworCXVfY2hhcgl1c3JmbGFnOworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldDsKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJRGVjbGFyYXRpb24gb2Ygc3RydWN0czoJCWx1biBjb250cm9sIGJsb2NrCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdHJ1Y3QgbGNiIHsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglEdXJpbmcgcmVzZWxlY3Rpb24gdGhlIG5jciBqdW1wcyB0byB0aGlzIHBvaW50CisJKioJd2l0aCBTRkJSIHNldCB0byB0aGUgIklkZW50aWZ5IiBtZXNzYWdlLgorCSoqCWlmIGl0J3Mgbm90IHRoaXMgbHVuLCBqdW1wIHRvIHRoZSBuZXh0LgorCSoqCisJKioJSlVNUCAgSUYgKFNGQlIgIT0gI2x1biMpLCBAKG5leHQgbGNiIG9mIHRoaXMgdGFyZ2V0KQorCSoqCisJKioJSXQgaXMgdGhpcyBsdW4uIExvYWQgVEVNUCB3aXRoIHRoZSBuZXh1cyBqdW1wcyB0YWJsZSAKKwkqKglhZGRyZXNzIGFuZCBqdW1wIHRvIFJFU0VMX1RBRyAob3IgUkVTRUxfTk9UQUcpLgorCSoqCisJKioJCVNDUl9DT1BZICg0KSwgcF9qdW1wX2NjYiwgVEVNUCwKKwkqKgkJU0NSX0pVTVAsIDxSRVNFTF9UQUc+CisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwlzdHJ1Y3QgbGluawlqdW1wX2xjYjsKKwluY3JjbWQJCWxvYWRfanVtcF9jY2JbM107CisJc3RydWN0IGxpbmsJanVtcF90YWc7CisJbmNyY21kCQlwX2p1bXBfY2NiOwkvKiBKdW1wIHRhYmxlIGJ1cyBhZGRyZXNzCSovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglKdW1wIHRhYmxlIHVzZWQgYnkgdGhlIHNjcmlwdCBwcm9jZXNzb3IgdG8gZGlyZWN0bHkganVtcCAKKwkqKgl0byB0aGUgQ0NCIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlc2VsZWN0ZWQgbmV4dXMuCisJKioJQWRkcmVzcyBpcyBhbGxvY2F0ZWQgb24gMjU2IGJ5dGVzIGJvdW5kYXJ5IGluIG9yZGVyIHRvIAorCSoqCWFsbG93IDggYml0IGNhbGN1bGF0aW9uIG9mIHRoZSB0YWcganVtcCBlbnRyeSBmb3IgdXAgdG8gCisJKioJNjQgcG9zc2libGUgdGFncy4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXUzMgkJanVtcF9jY2JfMDsJLyogRGVmYXVsdCB0YWJsZSBpZiBubyB0YWdzCSovCisJdTMyCQkqanVtcF9jY2I7CS8qIFZpcnR1YWwgYWRkcmVzcwkJKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCUNDQiBxdWV1ZSBtYW5hZ2VtZW50LgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX2NjYnE7CS8qIFF1ZXVlIG9mIGF2YWlsYWJsZSBDQ0JzCSovCisJc3RydWN0IGxpc3RfaGVhZCBidXN5X2NjYnE7CS8qIFF1ZXVlIG9mIGJ1c3kgQ0NCcwkJKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHdhaXRfY2NicTsJLyogUXVldWUgb2Ygd2FpdGluZyBmb3IgSU8gQ0NCcwkqLworCXN0cnVjdCBsaXN0X2hlYWQgc2tpcF9jY2JxOwkvKiBRdWV1ZSBvZiBza2lwcGVkIENDQnMJKi8KKwl1X2NoYXIJCWFjdGNjYnM7CS8qIE51bWJlciBvZiBhbGxvY2F0ZWQgQ0NCcwkqLworCXVfY2hhcgkJYnVzeWNjYnM7CS8qIENDQnMgYnVzeSBmb3IgdGhpcyBsdW4JKi8KKwl1X2NoYXIJCXF1ZXVlZGNjYnM7CS8qIENDQnMgcXVldWVkIHRvIHRoZSBjb250cm9sbGVyKi8KKwl1X2NoYXIJCXF1ZXVlZGVwdGg7CS8qIFF1ZXVlIGRlcHRoIGZvciB0aGlzIGx1bgkqLworCXVfY2hhcgkJc2NkZXZfZGVwdGg7CS8qIFNDU0kgZGV2aWNlIHF1ZXVlIGRlcHRoCSovCisJdV9jaGFyCQltYXhueHM7CQkvKiBNYXggcG9zc2libGUgbmV4dXNlcwkJKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCUNvbnRyb2wgb2YgdGFnZ2VkIGNvbW1hbmQgcXVldWluZy4KKwkqKglUYWdzIGFsbG9jYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIGEgY2lyY3VsYXIgYnVmZmVyLgorCSoqCVRoaXMgYXZvaWRzIHVzaW5nIGEgbG9vcCBmb3IgdGFnIGFsbG9jYXRpb24uCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwl1X2NoYXIJCWlhX3RhZzsJCS8qIEFsbG9jYXRpb24gaW5kZXgJCSovCisJdV9jaGFyCQlpZl90YWc7CQkvKiBGcmVlaW5nIGluZGV4CQkqLworCXVfY2hhciBjYl90YWdzW01BWF9UQUdTXTsJLyogQ2lyY3VsYXIgdGFncyBidWZmZXIJKi8KKwl1X2NoYXIJCXVzZXRhZ3M7CS8qIENvbW1hbmQgcXVldWluZyBpcyBhY3RpdmUJKi8KKwl1X2NoYXIJCW1heHRhZ3M7CS8qIE1heCBuciBvZiB0YWdzIGFza2VkIGJ5IHVzZXIJKi8KKwl1X2NoYXIJCW51bXRhZ3M7CS8qIEN1cnJlbnQgbnVtYmVyIG9mIHRhZ3MJKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCVFVRVVFIEZVTEwgY29udHJvbCBhbmQgT1JERVJFRCB0YWcgY29udHJvbC4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCVFVRVVFIEZVTEwgYW5kIE9SREVSRUQgdGFnIGNvbnRyb2wuCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwl1MTYJCW51bV9nb29kOwkvKiBOciBvZiBHT09EIHNpbmNlIFFVRVVFIEZVTEwJKi8KKwl0YWdtYXBfdAl0YWdzX3VtYXA7CS8qIFVzZWQgdGFncyBiaXRtYXAJCSovCisJdGFnbWFwX3QJdGFnc19zbWFwOwkvKiBUYWdzIGluIHVzZSBhdCAndGFnX3N0aW1lJwkqLworCXVfbG9uZwkJdGFnc19zdGltZTsJLyogTGFzdCB0aW1lIHdlIHNldCBzbWFwPXVtYXAJKi8KKwlzdHJ1Y3QgY2NiICoJaGVsZF9jY2I7CS8qIENDQiBoZWxkIGZvciBRVUVVRSBGVUxMCSovCit9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqICAgICAgRGVjbGFyYXRpb24gb2Ygc3RydWN0czogICAgIHRoZSBsYXVuY2ggc2NyaXB0LgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJSXQgaXMgcGFydCBvZiB0aGUgQ0NCIGFuZCBpcyBjYWxsZWQgYnkgdGhlIHNjcmlwdHMgcHJvY2Vzc29yIHRvIAorKioJc3RhcnQgb3IgcmVzdGFydCB0aGUgZGF0YSBzdHJ1Y3R1cmUgKG5leHVzKS4KKyoqCVRoaXMgNiBEV09SRHMgbWluaSBzY3JpcHQgbWFrZXMgdXNlIG9mIHByZWZldGNoaW5nLgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RydWN0IGxhdW5jaCB7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJU0NSX0NPUFkoNCksCUAocF9waHlzKSwgQChkc2EgcmVnaXN0ZXIpCisJKioJU0NSX0pVTVAsCUAoc2NoZWR1bGVyX3BvaW50KQorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJbmNyY21kCQlzZXR1cF9kc2FbM107CS8qIENvcHkgJ3BoeXMnIGFkZHJlc3MgdG8gZHNhCSovCisJc3RydWN0IGxpbmsJc2NoZWR1bGU7CS8qIEp1bXAgdG8gc2NoZWR1bGVyIHBvaW50CSovCisJbmNyY21kCQlwX3BoeXM7CQkvKiAncGh5cycgaGVhZGVyIGJ1cyBhZGRyZXNzCSovCit9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqICAgICAgRGVjbGFyYXRpb24gb2Ygc3RydWN0czogICAgIGdsb2JhbCBIRUFERVIuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglUaGlzIHN1YnN0cnVjdHVyZSBpcyBjb3BpZWQgZnJvbSB0aGUgY2NiIHRvIGEgZ2xvYmFsIGFkZHJlc3MgYWZ0ZXIgCisqKglzZWxlY3Rpb24gKG9yIHJlc2VsZWN0aW9uKSBhbmQgY29waWVkIGJhY2sgYmVmb3JlIGRpc2Nvbm5lY3QuCisqKgorKioJVGhlc2UgZmllbGRzIGFyZSBhY2Nlc3NpYmxlIHRvIHRoZSBzY3JpcHQgcHJvY2Vzc29yLgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitzdHJ1Y3QgaGVhZCB7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJU2F2ZWQgZGF0YSBwb2ludGVyLgorCSoqCVBvaW50cyB0byB0aGUgcG9zaXRpb24gaW4gdGhlIHNjcmlwdCByZXNwb25zaWJsZSBmb3IgdGhlCisJKioJYWN0dWFsIHRyYW5zZmVyIHRyYW5zZmVyIG9mIGRhdGEuCisJKioJSXQncyB3cml0dGVuIGFmdGVyIHJlY2VwdGlvbiBvZiBhIFNBVkVfREFUQV9QT0lOVEVSIG1lc3NhZ2UuCisJKioJVGhlIGdvYWxwb2ludGVyIHBvaW50cyBhZnRlciB0aGUgbGFzdCB0cmFuc2ZlciBjb21tYW5kLgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJdTMyCQlzYXZlcDsKKwl1MzIJCWxhc3RwOworCXUzMgkJZ29hbHA7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglBbHRlcm5hdGUgZGF0YSBwb2ludGVyLgorCSoqCVRoZXkgYXJlIGNvcGllZCBiYWNrIHRvIHNhdmVwL2xhc3RwL2dvYWxwIGJ5IHRoZSBTQ1JJUFRTIAorCSoqCXdoZW4gdGhlIGRpcmVjdGlvbiBpcyB1bmtub3duIGFuZCB0aGUgZGV2aWNlIGNsYWltcyBkYXRhIG91dC4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXUzMgkJd2xhc3RwOworCXUzMgkJd2dvYWxwOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJVGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgY2NiIGNvbnRhaW5pbmcgdGhpcyBoZWFkZXIuCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwlzdHJ1Y3QgY2NiICoJY3A7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglTdGF0dXMgZmllbGRzLgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJdV9jaGFyCQlzY3Jfc3RbNF07CS8qIHNjcmlwdCBzdGF0dXMJCSovCisJdV9jaGFyCQlzdGF0dXNbNF07CS8qIGhvc3Qgc3RhdHVzLiBtdXN0IGJlIHRoZSAJKi8KKwkJCQkJLyogIGxhc3QgRFdPUkQgb2YgdGhlIGhlYWRlci4JKi8KK307CisKKy8qCisqKglUaGUgc3RhdHVzIGJ5dGVzIGFyZSB1c2VkIGJ5IHRoZSBob3N0IGFuZCB0aGUgc2NyaXB0IHByb2Nlc3Nvci4KKyoqCisqKglUaGUgYnl0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBob3N0X3N0YXR1cyBtdXN0IGJlIHN0b3JlZCBpbiB0aGUgCisqKglsYXN0IERXT1JEIG9mIHRoZSBDQ0IgaGVhZGVyIHNpbmNlIGl0IGlzIHVzZWQgZm9yIGNvbW1hbmQgCisqKgljb21wbGV0aW9uIChuY3Jfd2FrZXVwKCkpLiBEb2luZyBzbywgd2UgYXJlIHN1cmUgdGhhdCB0aGUgaGVhZGVyIAorKioJaGFzIGJlZW4gZW50aXJlbHkgY29waWVkIGJhY2sgdG8gdGhlIENDQiB3aGVuIHRoZSBob3N0X3N0YXR1cyBpcyAKKyoqCXNlZW4gY29tcGxldGUgYnkgdGhlIENQVS4KKyoqCisqKglUaGUgbGFzdCBmb3VyIGJ5dGVzIChzdGF0dXNbNF0pIGFyZSBjb3BpZWQgdG8gdGhlIHNjcmF0Y2hiIHJlZ2lzdGVyCisqKgkoZGVjbGFyZWQgYXMgc2NyMC4uc2NyMyBpbiBuY3JfcmVnLmgpIGp1c3QgYWZ0ZXIgdGhlIHNlbGVjdC9yZXNlbGVjdCwKKyoqCWFuZCBjb3BpZWQgYmFjayBqdXN0IGFmdGVyIGRpc2Nvbm5lY3RpbmcuCisqKglJbnNpZGUgdGhlIHNjcmlwdCB0aGUgWFhfUkVHIGFyZSB1c2VkLgorKioKKyoqCVRoZSBmaXJzdCBmb3VyIGJ5dGVzIChzY3Jfc3RbNF0pIGFyZSB1c2VkIGluc2lkZSB0aGUgc2NyaXB0IGJ5IAorKioJIkNPUFkiIGNvbW1hbmRzLgorKioJQmVjYXVzZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG11c3QgaGF2ZSB0aGUgc2FtZSBhbGlnbm1lbnQKKyoqCWluIGEgRFdPUkQsIHRoZSBmaWVsZHMgSEFWRSB0byBiZSBhdCB0aGUgY2hvb3NlbiBvZmZzZXRzLgorKioJCXhlcnJfc3QJCTAJKDB4MzQpCXNjcmF0Y2hhCisqKgkJc3luY19zdAkJMQkoMHgwNSkJc3hmZXIKKyoqCQl3aWRlX3N0CQkzCSgweDAzKQlzY250bDMKKyovCisKKy8qCisqKglMYXN0IGZvdXIgYnl0ZXMgKHNjcmlwdCkKKyovCisjZGVmaW5lICBRVV9SRUcJc2NyMAorI2RlZmluZSAgSFNfUkVHCXNjcjEKKyNkZWZpbmUgIEhTX1BSVAluY19zY3IxCisjZGVmaW5lICBTU19SRUcJc2NyMgorI2RlZmluZSAgU1NfUFJUCW5jX3NjcjIKKyNkZWZpbmUgIFBTX1JFRwlzY3IzCisKKy8qCisqKglMYXN0IGZvdXIgYnl0ZXMgKGhvc3QpCisqLworI2lmZGVmIFNDU0lfTkNSX0JJR19FTkRJQU4KKyNkZWZpbmUgIGFjdHVhbHF1aXJrcyAgcGh5cy5oZWFkZXIuc3RhdHVzWzNdCisjZGVmaW5lICBob3N0X3N0YXR1cyAgIHBoeXMuaGVhZGVyLnN0YXR1c1syXQorI2RlZmluZSAgc2NzaV9zdGF0dXMgICBwaHlzLmhlYWRlci5zdGF0dXNbMV0KKyNkZWZpbmUgIHBhcml0eV9zdGF0dXMgcGh5cy5oZWFkZXIuc3RhdHVzWzBdCisjZWxzZQorI2RlZmluZSAgYWN0dWFscXVpcmtzICBwaHlzLmhlYWRlci5zdGF0dXNbMF0KKyNkZWZpbmUgIGhvc3Rfc3RhdHVzICAgcGh5cy5oZWFkZXIuc3RhdHVzWzFdCisjZGVmaW5lICBzY3NpX3N0YXR1cyAgIHBoeXMuaGVhZGVyLnN0YXR1c1syXQorI2RlZmluZSAgcGFyaXR5X3N0YXR1cyBwaHlzLmhlYWRlci5zdGF0dXNbM10KKyNlbmRpZgorCisvKgorKioJRmlyc3QgZm91ciBieXRlcyAoc2NyaXB0KQorKi8KKyNkZWZpbmUgIHhlcnJfc3QgICAgICAgaGVhZGVyLnNjcl9zdFswXQorI2RlZmluZSAgc3luY19zdCAgICAgICBoZWFkZXIuc2NyX3N0WzFdCisjZGVmaW5lICBuZWdvX3N0ICAgICAgIGhlYWRlci5zY3Jfc3RbMl0KKyNkZWZpbmUgIHdpZGVfc3QgICAgICAgaGVhZGVyLnNjcl9zdFszXQorCisvKgorKioJRmlyc3QgZm91ciBieXRlcyAoaG9zdCkKKyovCisjZGVmaW5lICB4ZXJyX3N0YXR1cyAgIHBoeXMueGVycl9zdAorI2RlZmluZSAgbmVnb19zdGF0dXMgICBwaHlzLm5lZ29fc3QKKworI2lmIDAKKyNkZWZpbmUgIHN5bmNfc3RhdHVzICAgcGh5cy5zeW5jX3N0CisjZGVmaW5lICB3aWRlX3N0YXR1cyAgIHBoeXMud2lkZV9zdAorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqICAgICAgRGVjbGFyYXRpb24gb2Ygc3RydWN0czogICAgIERhdGEgc3RydWN0dXJlIGJsb2NrCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJRHVyaW5nIGV4ZWN1dGlvbiBvZiBhIGNjYiBieSB0aGUgc2NyaXB0IHByb2Nlc3NvciwKKyoqCXRoZSBEU0EgKGRhdGEgc3RydWN0dXJlIGFkZHJlc3MpIHJlZ2lzdGVyIHBvaW50cworKioJdG8gdGhpcyBzdWJzdHJ1Y3R1cmUgb2YgdGhlIGNjYi4KKyoqCVRoaXMgc3Vic3RydWN0dXJlIGNvbnRhaW5zIHRoZSBoZWFkZXIgd2l0aAorKioJdGhlIHNjcmlwdC1wcm9jZXNzb3ItY2hhbmdhYmxlIGRhdGEgYW5kCisqKglkYXRhIGJsb2NrcyBmb3IgdGhlIGluZGlyZWN0IG1vdmUgY29tbWFuZHMuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitzdHJ1Y3QgZHNiIHsKKworCS8qCisJKioJSGVhZGVyLgorCSovCisKKwlzdHJ1Y3QgaGVhZAloZWFkZXI7CisKKwkvKgorCSoqCVRhYmxlIGRhdGEgZm9yIFNjcmlwdAorCSovCisKKwlzdHJ1Y3Qgc2NyX3RibHNlbCAgc2VsZWN0OworCXN0cnVjdCBzY3JfdGJsbW92ZSBzbXNnICA7CisJc3RydWN0IHNjcl90Ymxtb3ZlIGNtZCAgIDsKKwlzdHJ1Y3Qgc2NyX3RibG1vdmUgc2Vuc2UgOworCXN0cnVjdCBzY3JfdGJsbW92ZSBkYXRhW01BWF9TQ0FUVEVSXTsKK307CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKiAgICAgIERlY2xhcmF0aW9uIG9mIHN0cnVjdHM6ICAgICBDb21tYW5kIGNvbnRyb2wgYmxvY2suCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdHJ1Y3QgY2NiIHsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglUaGlzIGlzIHRoZSBkYXRhIHN0cnVjdHVyZSB3aGljaCBpcyBwb2ludGVkIGJ5IHRoZSBEU0EgCisJKioJcmVnaXN0ZXIgd2hlbiBpdCBpcyBleGVjdXRlZCBieSB0aGUgc2NyaXB0IHByb2Nlc3Nvci4KKwkqKglJdCBtdXN0IGJlIHRoZSBmaXJzdCBlbnRyeSBiZWNhdXNlIGl0IGNvbnRhaW5zIHRoZSBoZWFkZXIgCisJKioJYXMgZmlyc3QgZW50cnkgdGhhdCBtdXN0IGJlIGNhY2hlIGxpbmUgYWxpZ25lZC4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXN0cnVjdCBkc2IJcGh5czsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCU1pbmktc2NyaXB0IHVzZWQgYXQgQ0NCIGV4ZWN1dGlvbiBzdGFydC11cC4KKwkqKglMb2FkIHRoZSBEU0Egd2l0aCB0aGUgZGF0YSBzdHJ1Y3R1cmUgYWRkcmVzcyAocGh5cykgYW5kIAorCSoqCWp1bXAgdG8gU0VMRUNULiBKdW1wIHRvIENBTkNFTCBpZiBDQ0IgaXMgdG8gYmUgY2FuY2VsZWQuCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwlzdHJ1Y3QgbGF1bmNoCXN0YXJ0OworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJTWluaS1zY3JpcHQgdXNlZCBhdCBDQ0IgcmVsZWN0aW9uIHRvIHJlc3RhcnQgdGhlIG5leHVzLgorCSoqCUxvYWQgdGhlIERTQSB3aXRoIHRoZSBkYXRhIHN0cnVjdHVyZSBhZGRyZXNzIChwaHlzKSBhbmQgCisJKioJanVtcCB0byBSRVNFTF9EU0EuIEp1bXAgdG8gQUJPUlQgaWYgQ0NCIGlzIHRvIGJlIGFib3J0ZWQuCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwlzdHJ1Y3QgbGF1bmNoCXJlc3RhcnQ7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglJZiBhIGRhdGEgdHJhbnNmZXIgcGhhc2UgaXMgdGVybWluYXRlZCB0b28gZWFybHkKKwkqKgkoYWZ0ZXIgcmVjZXB0aW9uIG9mIGEgbWVzc2FnZSAoaS5lLiBESVNDT05ORUNUKSksCisJKioJd2UgaGF2ZSB0byBwcmVwYXJlIGEgbWluaSBzY3JpcHQgdG8gdHJhbnNmZXIKKwkqKgl0aGUgcmVzdCBvZiB0aGUgZGF0YS4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCW5jcmNtZAkJcGF0Y2hbOF07CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglUaGUgZ2VuZXJhbCBTQ1NJIGRyaXZlciBwcm92aWRlcyBhCisJKioJcG9pbnRlciB0byBhIGNvbnRyb2wgYmxvY2suCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwlzdHJ1Y3Qgc2NzaV9jbW5kCSpjbWQ7CQkvKiBTQ1NJIGNvbW1hbmQgCQkqLworCXVfY2hhcgkJY2RiX2J1ZlsxNl07CS8qIENvcHkgb2YgQ0RCCQkJKi8KKwl1X2NoYXIJCXNlbnNlX2J1Zls2NF07CisJaW50CQlkYXRhX2xlbjsJLyogVG90YWwgZGF0YSBsZW5ndGgJCSovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglNZXNzYWdlIGFyZWFzLgorCSoqCVdlIHByZXBhcmUgYSBtZXNzYWdlIHRvIGJlIHNlbnQgYWZ0ZXIgc2VsZWN0aW9uLgorCSoqCVdlIG1heSB1c2UgYSBzZWNvbmQgb25lIGlmIHRoZSBjb21tYW5kIGlzIHJlc2NoZWR1bGVkIAorCSoqCWR1ZSB0byBHRVRDQyBvciBRRlVMTC4KKwkqKiAgICAgIENvbnRlbnRzIGFyZSBJREVOVElGWSBhbmQgU0lNUExFX1RBRy4KKwkqKglXaGlsZSBuZWdvdGlhdGluZyBzeW5jIG9yIHdpZGUgdHJhbnNmZXIsCisJKioJYSBTRFRSIG9yIFdEVFIgbWVzc2FnZSBpcyBhcHBlbmRlZC4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXVfY2hhcgkJc2NzaV9zbXNnIFs4XTsKKwl1X2NoYXIJCXNjc2lfc21zZzJbOF07CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglPdGhlciBmaWVsZHMuCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwl1X2xvbmcJCXBfY2NiOwkJLyogQlVTIGFkZHJlc3Mgb2YgdGhpcyBDQ0IJKi8KKwl1X2NoYXIJCXNlbnNlY21kWzZdOwkvKiBTZW5zZSBjb21tYW5kCQkqLworCXVfY2hhcgkJdGFnOwkJLyogVGFnIGZvciB0aGlzIHRyYW5zZmVyCSovCisJCQkJCS8qICAyNTUgbWVhbnMgbm8gdGFnCQkqLworCXVfY2hhcgkJdGFyZ2V0OworCXVfY2hhcgkJbHVuOworCXVfY2hhcgkJcXVldWVkOworCXVfY2hhcgkJYXV0b19zZW5zZTsKKwlzdHJ1Y3QgY2NiICoJbGlua19jY2I7CS8qIEhvc3QgYWRhcHRlciBDQ0IgY2hhaW4JKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbmtfY2NicTsJLyogTGluayB0byB1bml0IENDQiBxdWV1ZQkqLworCXUzMgkJc3RhcnRwOwkJLyogSW5pdGlhbCBkYXRhIHBvaW50ZXIJCSovCisJdV9sb25nCQltYWdpYzsJCS8qIEZyZWUgLyBidXN5ICBDQ0IgZmxhZwkqLworfTsKKworI2RlZmluZSBDQ0JfUEhZUyhjcCxsYmwpCShjcC0+cF9jY2IgKyBvZmZzZXRvZihzdHJ1Y3QgY2NiLCBsYmwpKQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKiogICAgICBEZWNsYXJhdGlvbiBvZiBzdHJ1Y3RzOiAgICAgTkNSIGRldmljZSBkZXNjcmlwdG9yCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdHJ1Y3QgbmNiIHsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglUaGUgZ2xvYmFsIGhlYWRlci4KKwkqKglJdCBpcyBhY2Nlc3NpYmxlIHRvIGJvdGggdGhlIGhvc3QgYW5kIHRoZSBzY3JpcHQgcHJvY2Vzc29yLgorCSoqCU11c3QgYmUgY2FjaGUgbGluZSBzaXplIGFsaWduZWQgKDMyIGZvciB4ODYpIGluIG9yZGVyIHRvIAorCSoqCWFsbG93IGNhY2hlIGxpbmUgYnVyc3Rpbmcgd2hlbiBpdCBpcyBjb3BpZWQgdG8vZnJvbSBDQ0IuCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwlzdHJ1Y3QgaGVhZCAgICAgaGVhZGVyOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJQ0NCcyBtYW5hZ2VtZW50IHF1ZXVlcy4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXN0cnVjdCBzY3NpX2NtbmQJKndhaXRpbmdfbGlzdDsJLyogQ29tbWFuZHMgd2FpdGluZyBmb3IgYSBDQ0IJKi8KKwkJCQkJLyogIHdoZW4gbGNiIGlzIG5vdCBhbGxvY2F0ZWQuCSovCisJc3RydWN0IHNjc2lfY21uZAkqZG9uZV9saXN0OwkvKiBDb21tYW5kcyB3YWl0aW5nIGZvciBkb25lKCkgICovCisJCQkJCS8qIGNhbGxiYWNrIHRvIGJlIGludm9rZWQuICAgICAgKi8gCisJc3BpbmxvY2tfdAlzbXBfbG9jazsJLyogTG9jayBmb3IgU01QIHRocmVhZGluZyAgICAgICAqLworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJQ2hpcCBhbmQgY29udHJvbGxlciBpbmRlbnRpZmljYXRpb24uCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwlpbnQJCXVuaXQ7CQkvKiBVbml0IG51bWJlcgkJCSovCisJY2hhcgkJaW5zdF9uYW1lWzE2XTsJLyogbmNiIGluc3RhbmNlIG5hbWUJCSovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglJbml0aWFsIHZhbHVlIG9mIHNvbWUgSU8gcmVnaXN0ZXIgYml0cy4KKwkqKglUaGVzZSB2YWx1ZXMgYXJlIGFzc3VtZWQgdG8gaGF2ZSBiZWVuIHNldCBieSBCSU9TLCBhbmQgbWF5IAorCSoqCWJlIHVzZWQgZm9yIHByb2JpbmcgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBkaWZmZXJlbmNlcy4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXVfY2hhcglzdl9zY250bDAsIHN2X3NjbnRsMywgc3ZfZG1vZGUsIHN2X2RjbnRsLCBzdl9jdGVzdDAsIHN2X2N0ZXN0MywKKwkJc3ZfY3Rlc3Q0LCBzdl9jdGVzdDUsIHN2X2dwY250bCwgc3Zfc3Rlc3QyLCBzdl9zdGVzdDQ7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglBY3R1YWwgaW5pdGlhbCB2YWx1ZSBvZiBJTyByZWdpc3RlciBiaXRzIHVzZWQgYnkgdGhlIAorCSoqCWRyaXZlci4gVGhleSBhcmUgbG9hZGVkIGF0IGluaXRpYWxpc2F0aW9uIGFjY29yZGluZyB0byAgCisJKioJZmVhdHVyZXMgdGhhdCBhcmUgdG8gYmUgZW5hYmxlZC4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXVfY2hhcglydl9zY250bDAsIHJ2X3NjbnRsMywgcnZfZG1vZGUsIHJ2X2RjbnRsLCBydl9jdGVzdDAsIHJ2X2N0ZXN0MywKKwkJcnZfY3Rlc3Q0LCBydl9jdGVzdDUsIHJ2X3N0ZXN0MjsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCVRhcmdldHMgbWFuYWdlbWVudC4KKwkqKglEdXJpbmcgcmVzZWxlY3Rpb24gdGhlIG5jciBqdW1wcyB0byBqdW1wX3RjYi4KKwkqKglUaGUgU0ZCUiByZWdpc3RlciBpcyBsb2FkZWQgd2l0aCB0aGUgZW5jb2RlZCB0YXJnZXQgaWQuCisJKioJRm9yIGkgPSAwIHRvIDMKKwkqKgkJU0NSX0pVTVAgXiBJRlRSVUUoTUFTSyhpLCAzKSksIEAobmV4dCB0Y2IgbW9kLiBpKQorCSoqCisJKioJUmVjZW50IGNoaXBzIHdpbGwgcHJlZmV0Y2ggdGhlIDQgSlVNUFMgdXNpbmcgb25seSAxIGJ1cnN0LgorCSoqCUl0IGlzIGtpbmQgb2YgaGFzaGNvZGluZy4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXN0cnVjdCBsaW5rICAgICBqdW1wX3RjYls0XTsJLyogSlVNUHMgZm9yIHJlc2VsZWN0aW9uCSovCisJc3RydWN0IHRjYiAgdGFyZ2V0W01BWF9UQVJHRVRdOwkvKiBUYXJnZXQgZGF0YQkJCSovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglWaXJ0dWFsIGFuZCBwaHlzaWNhbCBidXMgYWRkcmVzc2VzIG9mIHRoZSBjaGlwLgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJdm9pZCBfX2lvbWVtICp2YWRkcjsJCS8qIFZpcnR1YWwgYW5kIGJ1cyBhZGRyZXNzIG9mCSovCisJdW5zaWduZWQgbG9uZwlwYWRkcjsJCS8qICBjaGlwJ3MgSU8gcmVnaXN0ZXJzLgkqLworCXVuc2lnbmVkIGxvbmcJcGFkZHIyOwkJLyogT24tY2hpcCBSQU0gYnVzIGFkZHJlc3MuCSovCisJdm9sYXRpbGUJCQkvKiBQb2ludGVyIHRvIHZvbGF0aWxlIGZvciAJKi8KKwlzdHJ1Y3QgbmNyX3JlZwlfX2lvbWVtICpyZWc7CS8qICBtZW1vcnkgbWFwcGVkIElPLgkJKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCVNDUklQVFMgdmlydHVhbCBhbmQgcGh5c2ljYWwgYnVzIGFkZHJlc3Nlcy4KKwkqKgknc2NyaXB0JyAgaXMgbG9hZGVkIGluIHRoZSBvbi1jaGlwIFJBTSBpZiBwcmVzZW50LgorCSoqCSdzY3JpcHRoJyBzdGF5cyBpbiBtYWluIG1lbW9yeS4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXN0cnVjdCBzY3JpcHQJKnNjcmlwdDA7CS8qIENvcGllcyBvZiBzY3JpcHQgYW5kIHNjcmlwdGgJKi8KKwlzdHJ1Y3Qgc2NyaXB0aAkqc2NyaXB0aDA7CS8qICByZWxvY2F0ZWQgZm9yIHRoaXMgbmNiLgkqLworCXN0cnVjdCBzY3JpcHRoCSpzY3JpcHRoOwkvKiBBY3R1YWwgc2NyaXB0aCB2aXJ0LiBhZGRyZXNzCSovCisJdV9sb25nCQlwX3NjcmlwdDsJLyogQWN0dWFsIHNjcmlwdCBhbmQgc2NyaXB0aAkqLworCXVfbG9uZwkJcF9zY3JpcHRoOwkvKiAgYnVzIGFkZHJlc3Nlcy4JCSovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglHZW5lcmFsIGNvbnRyb2xsZXIgcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbi4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXN0cnVjdCBkZXZpY2UJKmRldjsKKwl1X2NoYXIJCXJldmlzaW9uX2lkOwkvKiBQQ0kgZGV2aWNlIHJldmlzaW9uIGlkCSovCisJdTMyCQlpcnE7CQkvKiBJUlEgbGV2ZWwJCQkqLworCXUzMgkJZmVhdHVyZXM7CS8qIENoaXAgZmVhdHVyZXMgbWFwCQkqLworCXVfY2hhcgkJbXlhZGRyOwkJLyogU0NTSSBpZCBvZiB0aGUgYWRhcHRlcgkqLworCXVfY2hhcgkJbWF4YnVyc3Q7CS8qIGxvZyBiYXNlIDIgb2YgZHdvcmRzIGJ1cnN0CSovCisJdV9jaGFyCQltYXh3aWRlOwkvKiBNYXhpbXVtIHRyYW5zZmVyIHdpZHRoCSovCisJdV9jaGFyCQltaW5zeW5jOwkvKiBNaW5pbXVtIHN5bmMgcGVyaW9kIGZhY3RvcgkqLworCXVfY2hhcgkJbWF4c3luYzsJLyogTWF4aW11bSBzeW5jIHBlcmlvZCBmYWN0b3IJKi8KKwl1X2NoYXIJCW1heG9mZnM7CS8qIE1heCBzY3NpIG9mZnNldAkJKi8KKwl1X2NoYXIJCW11bHRpcGxpZXI7CS8qIENsb2NrIG11bHRpcGxpZXIgKDEsMiw0KQkqLworCXVfY2hhcgkJY2xvY2tfZGl2bjsJLyogTnVtYmVyIG9mIGNsb2NrIGRpdmlzb3JzCSovCisJdV9sb25nCQljbG9ja19raHo7CS8qIFNDU0kgY2xvY2sgZnJlcXVlbmN5IGluIEtIegkqLworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJU3RhcnQgcXVldWUgbWFuYWdlbWVudC4KKwkqKglJdCBpcyBmaWxsZWQgdXAgYnkgdGhlIGhvc3QgcHJvY2Vzc29yIGFuZCBhY2Nlc3NlZCBieSB0aGUgCisJKioJU0NSSVBUUyBwcm9jZXNzb3IgaW4gb3JkZXIgdG8gc3RhcnQgU0NTSSBjb21tYW5kcy4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXUxNgkJc3F1ZXVlcHV0OwkvKiBOZXh0IGZyZWUgc2xvdCBvZiB0aGUgcXVldWUJKi8KKwl1MTYJCWFjdGNjYnM7CS8qIE51bWJlciBvZiBhbGxvY2F0ZWQgQ0NCcwkqLworCXUxNgkJcXVldWVkY2NiczsJLyogTnVtYmVyIG9mIENDQnMgaW4gc3RhcnQgcXVldWUqLworCXUxNgkJcXVldWVkZXB0aDsJLyogU3RhcnQgcXVldWUgZGVwdGgJCSovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglUaW1lb3V0IGhhbmRsZXIuCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJLyogVGltZXIgaGFuZGxlciBsaW5rIGhlYWRlcgkqLworCXVfbG9uZwkJbGFzdHRpbWU7CisJdV9sb25nCQlzZXR0bGVfdGltZTsJLyogUmVzZXR0aW5nIHRoZSBTQ1NJIEJVUwkqLworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJRGVidWdnaW5nIGFuZCBwcm9maWxpbmcuCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwlzdHJ1Y3QgbmNyX3JlZwlyZWdkdW1wOwkvKiBSZWdpc3RlciBkdW1wCQkqLworCXVfbG9uZwkJcmVndGltZTsJLyogVGltZSBpdCBoYXMgYmVlbiBkb25lCSovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglNaXNjZWxsYW5lb3VzIGJ1ZmZlcnMgYWNjZXNzZWQgYnkgdGhlIHNjcmlwdHMtcHJvY2Vzc29yLgorCSoqCVRoZXkgc2hhbGwgYmUgRFdPUkQgYWxpZ25lZCwgYmVjYXVzZSB0aGV5IG1heSBiZSByZWFkIG9yIAorCSoqCXdyaXR0ZW4gd2l0aCBhIFNDUl9DT1BZIHNjcmlwdCBjb21tYW5kLgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJdV9jaGFyCQltc2dvdXRbOF07CS8qIEJ1ZmZlciBmb3IgTUVTU0FHRSBPVVQgCSovCisJdV9jaGFyCQltc2dpbiBbOF07CS8qIEJ1ZmZlciBmb3IgTUVTU0FHRSBJTgkqLworCXUzMgkJbGFzdG1zZzsJLyogTGFzdCBTQ1NJIG1lc3NhZ2Ugc2VudAkqLworCXVfY2hhcgkJc2NyYXRjaDsJLyogU2NyYXRjaCBmb3IgU0NTSSByZWNlaXZlCSovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYXRpb24gYW5kIHN0YXR1cyBwYXJhbWV0ZXJzLgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJdV9jaGFyCQlkaXNjOwkJLyogRGljb25uZWN0aW9uIGFsbG93ZWQJCSovCisJdV9jaGFyCQlzY3NpX21vZGU7CS8qIEN1cnJlbnQgU0NTSSBCVVMgbW9kZQkqLworCXVfY2hhcgkJb3JkZXI7CQkvKiBUYWcgb3JkZXIgdG8gdXNlCQkqLworCXVfY2hhcgkJdmVyYm9zZTsJLyogVmVyYm9zaXR5IGZvciB0aGlzIGNvbnRyb2xsZXIqLworCWludAkJbmNyX2NhY2hlOwkvKiBVc2VkIGZvciBjYWNoZSB0ZXN0IGF0IGluaXQuCSovCisJdV9sb25nCQlwX25jYjsJCS8qIEJVUyBhZGRyZXNzIG9mIHRoaXMgTkNCCSovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglDb21tYW5kIGNvbXBsZXRpb24gaGFuZGxpbmcuCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKyNpZmRlZiBTQ1NJX05DUl9DQ0JfRE9ORV9TVVBQT1JUCisJc3RydWN0IGNjYgkqKGNjYl9kb25lW01BWF9ET05FXSk7CisJaW50CQljY2JfZG9uZV9pYzsKKyNlbmRpZgorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCUZpZWxkcyB0aGF0IHNob3VsZCBiZSByZW1vdmVkIG9yIGNoYW5nZWQuCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwlzdHJ1Y3QgY2NiCSpjY2I7CQkvKiBHbG9iYWwgQ0NCCQkJKi8KKwlzdHJ1Y3QgdXNyY21kCXVzZXI7CQkvKiBDb21tYW5kIGZyb20gdXNlcgkJKi8KKwl2b2xhdGlsZSB1X2NoYXIJcmVsZWFzZV9zdGFnZTsJLyogU3luY2hyb25pc2F0aW9uIHN0YWdlIG9uIHJlbGVhc2UgICovCit9OworCisjZGVmaW5lIE5DQl9TQ1JJUFRfUEhZUyhucCxsYmwpCSAobnAtPnBfc2NyaXB0ICArIG9mZnNldG9mIChzdHJ1Y3Qgc2NyaXB0LCBsYmwpKQorI2RlZmluZSBOQ0JfU0NSSVBUSF9QSFlTKG5wLGxibCkgKG5wLT5wX3NjcmlwdGggKyBvZmZzZXRvZiAoc3RydWN0IHNjcmlwdGgsbGJsKSkKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioKKyoqICAgICAgU2NyaXB0IGZvciBOQ1ItUHJvY2Vzc29yLgorKioKKyoqCVVzZSBuY3Jfc2NyaXB0X2ZpbGwoKSB0byBjcmVhdGUgdGhlIHZhcmlhYmxlIHBhcnRzLgorKioJVXNlIG5jcl9zY3JpcHRfY29weV9hbmRfYmluZCgpIHRvIG1ha2UgYSBjb3B5IGFuZAorKioJYmluZCB0byBwaHlzaWNhbCBhZGRyZXNzZXMuCisqKgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCVdlIGhhdmUgdG8ga25vdyB0aGUgb2Zmc2V0cyBvZiBhbGwgbGFiZWxzIGJlZm9yZQorKioJd2UgcmVhY2ggdGhlbSAoZm9yIGZvcndhcmQganVtcHMpLgorKioJVGhlcmVmb3JlIHdlIGRlY2xhcmUgYSBzdHJ1Y3QgaGVyZS4KKyoqCUlmIHlvdSBtYWtlIGNoYW5nZXMgaW5zaWRlIHRoZSBzY3JpcHQsCisqKglET05UIEZPUkdFVCBUTyBDSEFOR0UgVEhFIExFTkdUSFMgSEVSRSEKKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8qCisqKglGb3IgSFAgWmFsb24vNTNjNzIwIHN5c3RlbXMsIHRoZSBaYWxvbiBpbnRlcmZhY2UKKyoqCWJldHdlZW4gQ1BVIGFuZCA1M2M3MjAgZG9lcyBwcmVmZXRjaGVzLCB3aGljaCBjYXVzZXMKKyoqCXByb2JsZW1zIHdpdGggc2VsZiBtb2RpZnlpbmcgc2NyaXB0cy4gIFRoZSBwcm9ibGVtCisqKglpcyBvdmVyY29tZSBieSBjYWxsaW5nIGEgZHVtbXkgc3Vicm91dGluZSBhZnRlciBlYWNoCisqKgltb2RpZmljYXRpb24sIHRvIGZvcmNlIGEgcmVmZXRjaCBvZiB0aGUgc2NyaXB0IG9uCisqKglyZXR1cm4gZnJvbSB0aGUgc3Vicm91dGluZS4KKyovCisKKyNpZmRlZiBDT05GSUdfTkNSNTNDOFhYX1BSRUZFVENICisjZGVmaW5lIFBSRUZFVENIX0ZMVVNIX0NOVAkyCisjZGVmaW5lIFBSRUZFVENIX0ZMVVNICQlTQ1JfQ0FMTCwgUEFERFJIICh3YWl0X2RtYSksCisjZWxzZQorI2RlZmluZSBQUkVGRVRDSF9GTFVTSF9DTlQJMAorI2RlZmluZSBQUkVGRVRDSF9GTFVTSAorI2VuZGlmCisKKy8qCisqKglTY3JpcHQgZnJhZ21lbnRzIHdoaWNoIGFyZSBsb2FkZWQgaW50byB0aGUgb24tY2hpcCBSQU0gCisqKglvZiA4MjVBLCA4NzUgYW5kIDg5NSBjaGlwcy4KKyovCitzdHJ1Y3Qgc2NyaXB0IHsKKwluY3JjbWQJc3RhcnQJCVsgIDVdOworCW5jcmNtZCAgc3RhcnRwb3MJWyAgMV07CisJbmNyY21kCXNlbGVjdAkJWyAgNl07CisJbmNyY21kCXNlbGVjdDIJCVsgIDkgKyBQUkVGRVRDSF9GTFVTSF9DTlRdOworCW5jcmNtZAlsb2FkcG9zCQlbICA0XTsKKwluY3JjbWQJc2VuZF9pZGVudAlbICA5XTsKKwluY3JjbWQJcHJlcGFyZQkJWyAgNl07CisJbmNyY21kCXByZXBhcmUyCVsgIDddOworCW5jcmNtZCAgY29tbWFuZAkJWyAgNl07CisJbmNyY21kICBkaXNwYXRjaAlbIDMyXTsKKwluY3JjbWQgIGNscmFjawkJWyAgNF07CisJbmNyY21kCW5vX2RhdGEJCVsgMTddOworCW5jcmNtZCAgc3RhdHVzCQlbICA4XTsKKwluY3JjbWQgIG1zZ19pbgkJWyAgMl07CisJbmNyY21kICBtc2dfaW4yCQlbIDE2XTsKKwluY3JjbWQgIG1zZ19iYWQJCVsgIDRdOworCW5jcmNtZAlzZXRtc2cJCVsgIDddOworCW5jcmNtZAljbGVhbnVwCQlbICA2XTsKKwluY3JjbWQgIGNvbXBsZXRlCVsgIDldOworCW5jcmNtZAljbGVhbnVwX29rCVsgIDggKyBQUkVGRVRDSF9GTFVTSF9DTlRdOworCW5jcmNtZAljbGVhbnVwMAlbICAxXTsKKyNpZm5kZWYgU0NTSV9OQ1JfQ0NCX0RPTkVfU1VQUE9SVAorCW5jcmNtZAlzaWduYWwJCVsgMTJdOworI2Vsc2UKKwluY3JjbWQJc2lnbmFsCQlbICA5XTsKKwluY3JjbWQJZG9uZV9wb3MJWyAgMV07CisJbmNyY21kCWRvbmVfcGx1ZwlbICAyXTsKKwluY3JjbWQJZG9uZV9lbmQJWyAgN107CisjZW5kaWYKKwluY3JjbWQgIHNhdmVfZHAJCVsgIDddOworCW5jcmNtZCAgcmVzdG9yZV9kcAlbICA1XTsKKwluY3JjbWQgIGRpc2Nvbm5lY3QJWyAxMF07CisJbmNyY21kCW1zZ19vdXQJCVsgIDldOworCW5jcmNtZAltc2dfb3V0X2RvbmUJWyAgN107CisJbmNyY21kICBpZGxlCQlbICAyXTsKKwluY3JjbWQJcmVzZWxlY3QJWyAgOF07CisJbmNyY21kCXJlc2VsZWN0ZWQJWyAgOF07CisJbmNyY21kCXJlc2VsX2RzYQlbICA2ICsgUFJFRkVUQ0hfRkxVU0hfQ05UXTsKKwluY3JjbWQJbG9hZHBvczEJWyAgNF07CisJbmNyY21kICByZXNlbF9sdW4JWyAgNl07CisJbmNyY21kCXJlc2VsX3RhZwlbICA2XTsKKwluY3JjbWQJanVtcF90b19uZXh1cwlbICA0ICsgUFJFRkVUQ0hfRkxVU0hfQ05UXTsKKwluY3JjbWQJbmV4dXNfaW5kaXJlY3QJWyAgNF07CisJbmNyY21kCXJlc2VsX25vdGFnCVsgIDRdOworCW5jcmNtZCAgZGF0YV9pbgkJW01BWF9TQ0FUVEVSTCAqIDRdOworCW5jcmNtZCAgZGF0YV9pbjIJWyAgNF07CisJbmNyY21kICBkYXRhX291dAlbTUFYX1NDQVRURVJMICogNF07CisJbmNyY21kICBkYXRhX291dDIJWyAgNF07Cit9OworCisvKgorKioJU2NyaXB0IGZyYWdtZW50cyB3aGljaCBzdGF5IGluIG1haW4gbWVtb3J5IGZvciBhbGwgY2hpcHMuCisqLworc3RydWN0IHNjcmlwdGggeworCW5jcmNtZCAgdHJ5bG9vcAkJW01BWF9TVEFSVCoyXTsKKwluY3JjbWQgIHRyeWxvb3AyCVsgIDJdOworI2lmZGVmIFNDU0lfTkNSX0NDQl9ET05FX1NVUFBPUlQKKwluY3JjbWQgIGRvbmVfcXVldWUJW01BWF9ET05FKjVdOworCW5jcmNtZCAgZG9uZV9xdWV1ZTIJWyAgMl07CisjZW5kaWYKKwluY3JjbWQJc2VsZWN0X25vX2F0bglbICA4XTsKKwluY3JjbWQJY2FuY2VsCQlbICA0XTsKKwluY3JjbWQJc2tpcAkJWyAgOSArIFBSRUZFVENIX0ZMVVNIX0NOVF07CisJbmNyY21kCXNraXAyCQlbIDE5XTsKKwluY3JjbWQJcGFyX2Vycl9kYXRhX2luCVsgIDZdOworCW5jcmNtZAlwYXJfZXJyX290aGVyCVsgIDRdOworCW5jcmNtZAltc2dfcmVqZWN0CVsgIDhdOworCW5jcmNtZAltc2dfaWduX3Jlc2lkdWUJWyAyNF07CisJbmNyY21kICBtc2dfZXh0ZW5kZWQJWyAxMF07CisJbmNyY21kICBtc2dfZXh0XzIJWyAxMF07CisJbmNyY21kCW1zZ193ZHRyCVsgMTRdOworCW5jcmNtZAlzZW5kX3dkdHIJWyAgN107CisJbmNyY21kICBtc2dfZXh0XzMJWyAxMF07CisJbmNyY21kCW1zZ19zZHRyCVsgMTRdOworCW5jcmNtZAlzZW5kX3NkdHIJWyAgN107CisJbmNyY21kCW5lZ29fYmFkX3BoYXNlCVsgIDRdOworCW5jcmNtZAltc2dfb3V0X2Fib3J0CVsgMTBdOworCW5jcmNtZCAgaGRhdGFfaW4JW01BWF9TQ0FUVEVSSCAqIDRdOworCW5jcmNtZCAgaGRhdGFfaW4yCVsgIDJdOworCW5jcmNtZCAgaGRhdGFfb3V0CVtNQVhfU0NBVFRFUkggKiA0XTsKKwluY3JjbWQgIGhkYXRhX291dDIJWyAgMl07CisJbmNyY21kCXJlc2V0CQlbICA0XTsKKwluY3JjbWQJYWJvcnR0YWcJWyAgNF07CisJbmNyY21kCWFib3J0CQlbICAyXTsKKwluY3JjbWQJYWJvcnRfcmVzZWwJWyAyMF07CisJbmNyY21kCXJlc2VuZF9pZGVudAlbICA0XTsKKwluY3JjbWQJY2xyYXRuX2dvX29uCVsgIDNdOworCW5jcmNtZAlueHRkc3BfZ29fb24JWyAgMV07CisJbmNyY21kCXNkYXRhX2luCVsgIDhdOworCW5jcmNtZCAgZGF0YV9pbwkJWyAxOF07CisJbmNyY21kCWJhZF9pZGVudGlmeQlbIDEyXTsKKwluY3JjbWQJYmFkX2lfdF9sCVsgIDRdOworCW5jcmNtZAliYWRfaV90X2xfcQlbICA0XTsKKwluY3JjbWQJYmFkX3RhcmdldAlbICA4XTsKKwluY3JjbWQJYmFkX3N0YXR1cwlbICA4XTsKKwluY3JjbWQJc3RhcnRfcmFtCVsgIDQgKyBQUkVGRVRDSF9GTFVTSF9DTlRdOworCW5jcmNtZAlzdGFydF9yYW0wCVsgIDRdOworCW5jcmNtZAlzdG9fcmVzdGFydAlbICA1XTsKKwluY3JjbWQJd2FpdF9kbWEJWyAgMl07CisJbmNyY21kCXNub29wdGVzdAlbICA5XTsKKwluY3JjbWQJc25vb3BlbmQJWyAgMl07Cit9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgorKiogICAgICBGdW5jdGlvbiBoZWFkZXJzLgorKioKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK3N0YXRpYwl2b2lkCW5jcl9hbGxvY19jY2IJKHN0cnVjdCBuY2IgKm5wLCB1X2NoYXIgdG4sIHVfY2hhciBsbik7CitzdGF0aWMJdm9pZAluY3JfY29tcGxldGUJKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3QgY2NiICpjcCk7CitzdGF0aWMJdm9pZAluY3JfZXhjZXB0aW9uCShzdHJ1Y3QgbmNiICpucCk7CitzdGF0aWMJdm9pZAluY3JfZnJlZV9jY2IJKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3QgY2NiICpjcCk7CitzdGF0aWMJdm9pZAluY3JfaW5pdF9jY2IJKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3QgY2NiICpjcCk7CitzdGF0aWMJdm9pZAluY3JfaW5pdF90Y2IJKHN0cnVjdCBuY2IgKm5wLCB1X2NoYXIgdG4pOworc3RhdGljCXN0cnVjdCBsY2IgKgluY3JfYWxsb2NfbGNiCShzdHJ1Y3QgbmNiICpucCwgdV9jaGFyIHRuLCB1X2NoYXIgbG4pOworc3RhdGljCXN0cnVjdCBsY2IgKgluY3Jfc2V0dXBfbGNiCShzdHJ1Y3QgbmNiICpucCwgc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KTsKK3N0YXRpYwl2b2lkCW5jcl9nZXRjbG9jawkoc3RydWN0IG5jYiAqbnAsIGludCBtdWx0KTsKK3N0YXRpYwl2b2lkCW5jcl9zZWxlY3RjbG9jawkoc3RydWN0IG5jYiAqbnAsIHVfY2hhciBzY250bDMpOworc3RhdGljCXN0cnVjdCBjY2IgKm5jcl9nZXRfY2NiCShzdHJ1Y3QgbmNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK3N0YXRpYwl2b2lkCW5jcl9jaGlwX3Jlc2V0CShzdHJ1Y3QgbmNiICpucCwgaW50IGRlbGF5KTsKK3N0YXRpYwl2b2lkCW5jcl9pbml0CShzdHJ1Y3QgbmNiICpucCwgaW50IHJlc2V0LCBjaGFyICogbXNnLCB1X2xvbmcgY29kZSk7CitzdGF0aWMJaW50CW5jcl9pbnRfc2JtYwkoc3RydWN0IG5jYiAqbnApOworc3RhdGljCWludAluY3JfaW50X3Bhcgkoc3RydWN0IG5jYiAqbnApOworc3RhdGljCXZvaWQJbmNyX2ludF9tYQkoc3RydWN0IG5jYiAqbnApOworc3RhdGljCXZvaWQJbmNyX2ludF9zaXIJKHN0cnVjdCBuY2IgKm5wKTsKK3N0YXRpYyAgdm9pZCAgICBuY3JfaW50X3N0byAgICAgKHN0cnVjdCBuY2IgKm5wKTsKK3N0YXRpYwl2b2lkCW5jcl9uZWdvdGlhdGUJKHN0cnVjdCBuY2IqIG5wLCBzdHJ1Y3QgdGNiKiB0cCk7CitzdGF0aWMJaW50CW5jcl9wcmVwYXJlX25lZ28oc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBjY2IgKmNwLCB1X2NoYXIgKm1zZ3B0cik7CisKK3N0YXRpYwl2b2lkCW5jcl9zY3JpcHRfY29weV9hbmRfYmluZAorCQkJCShzdHJ1Y3QgbmNiICpucCwgbmNyY21kICpzcmMsIG5jcmNtZCAqZHN0LCBpbnQgbGVuKTsKK3N0YXRpYyAgdm9pZCAgICBuY3Jfc2NyaXB0X2ZpbGwgKHN0cnVjdCBzY3JpcHQgKiBzY3IsIHN0cnVjdCBzY3JpcHRoICogc2NyaXB0aCk7CitzdGF0aWMJaW50CW5jcl9zY2F0dGVyCShzdHJ1Y3QgbmNiICpucCwgc3RydWN0IGNjYiAqY3AsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CitzdGF0aWMJdm9pZAluY3JfZ2V0c3luYwkoc3RydWN0IG5jYiAqbnAsIHVfY2hhciBzZmFjLCB1X2NoYXIgKmZha3AsIHVfY2hhciAqc2NudGwzcCk7CitzdGF0aWMJdm9pZAluY3Jfc2V0c3luYwkoc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBjY2IgKmNwLCB1X2NoYXIgc2NudGwzLCB1X2NoYXIgc3hmZXIpOworc3RhdGljCXZvaWQJbmNyX3NldHVwX3RhZ3MJKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOworc3RhdGljCXZvaWQJbmNyX3NldHdpZGUJKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3QgY2NiICpjcCwgdV9jaGFyIHdpZGUsIHVfY2hhciBhY2spOworc3RhdGljCWludAluY3Jfc25vb3B0ZXN0CShzdHJ1Y3QgbmNiICpucCk7CitzdGF0aWMJdm9pZAluY3JfdGltZW91dAkoc3RydWN0IG5jYiAqbnApOworc3RhdGljICB2b2lkICAgIG5jcl93YWtldXAgICAgICAoc3RydWN0IG5jYiAqbnAsIHVfbG9uZyBjb2RlKTsKK3N0YXRpYyAgdm9pZCAgICBuY3Jfd2FrZXVwX2RvbmUgKHN0cnVjdCBuY2IgKm5wKTsKK3N0YXRpYwl2b2lkCW5jcl9zdGFydF9uZXh0X2NjYiAoc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBsY2IgKiBscCwgaW50IG1heG4pOworc3RhdGljCXZvaWQJbmNyX3B1dF9zdGFydF9xdWV1ZShzdHJ1Y3QgbmNiICpucCwgc3RydWN0IGNjYiAqY3ApOworCitzdGF0aWMgdm9pZCBpbnNlcnRfaW50b193YWl0aW5nX2xpc3Qoc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CitzdGF0aWMgc3RydWN0IHNjc2lfY21uZCAqcmV0cmlldmVfZnJvbV93YWl0aW5nX2xpc3QoaW50IHRvX3JlbW92ZSwgc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CitzdGF0aWMgdm9pZCBwcm9jZXNzX3dhaXRpbmdfbGlzdChzdHJ1Y3QgbmNiICpucCwgaW50IHN0cyk7CisKKyNkZWZpbmUgcmVtb3ZlX2Zyb21fd2FpdGluZ19saXN0KG5wLCBjbWQpIFwKKwkJcmV0cmlldmVfZnJvbV93YWl0aW5nX2xpc3QoMSwgKG5wKSwgKGNtZCkpCisjZGVmaW5lIHJlcXVldWVfd2FpdGluZ19saXN0KG5wKSBwcm9jZXNzX3dhaXRpbmdfbGlzdCgobnApLCBESURfT0spCisjZGVmaW5lIHJlc2V0X3dhaXRpbmdfbGlzdChucCkgcHJvY2Vzc193YWl0aW5nX2xpc3QoKG5wKSwgRElEX1JFU0VUKQorCitzdGF0aWMgaW5saW5lIGNoYXIgKm5jcl9uYW1lIChzdHJ1Y3QgbmNiICpucCkKK3sKKwlyZXR1cm4gbnAtPmluc3RfbmFtZTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgorKiogICAgICBTY3JpcHRzIGZvciBOQ1ItUHJvY2Vzc29yLgorKioKKyoqICAgICAgVXNlIG5jcl9zY3JpcHRfYmluZCBmb3IgYmluZGluZyB0byBwaHlzaWNhbCBhZGRyZXNzZXMuCisqKgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCU5BRERSIGdlbmVyYXRlcyBhIHJlZmVyZW5jZSB0byBhIGZpZWxkIG9mIHRoZSBjb250cm9sbGVyIGRhdGEuCisqKglQQUREUiBnZW5lcmF0ZXMgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBwYXJ0IG9mIHRoZSBzY3JpcHQuCisqKglSQUREUiBnZW5lcmF0ZXMgYSByZWZlcmVuY2UgdG8gYSBzY3JpcHQgcHJvY2Vzc29yIHJlZ2lzdGVyLgorKioJRkFERFIgZ2VuZXJhdGVzIGEgcmVmZXJlbmNlIHRvIGEgc2NyaXB0IHByb2Nlc3NvciByZWdpc3RlcgorKioJCXdpdGggb2Zmc2V0LgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2RlZmluZQlSRUxPQ19TT0ZUQwkweDQwMDAwMDAwCisjZGVmaW5lCVJFTE9DX0xBQkVMCTB4NTAwMDAwMDAKKyNkZWZpbmUJUkVMT0NfUkVHSVNURVIJMHg2MDAwMDAwMAorI2lmIDAKKyNkZWZpbmUJUkVMT0NfS1ZBUgkweDcwMDAwMDAwCisjZW5kaWYKKyNkZWZpbmUJUkVMT0NfTEFCRUxICTB4ODAwMDAwMDAKKyNkZWZpbmUJUkVMT0NfTUFTSwkweGYwMDAwMDAwCisKKyNkZWZpbmUJTkFERFIobGFiZWwpCShSRUxPQ19TT0ZUQyB8IG9mZnNldG9mKHN0cnVjdCBuY2IsIGxhYmVsKSkKKyNkZWZpbmUgUEFERFIobGFiZWwpICAgIChSRUxPQ19MQUJFTCB8IG9mZnNldG9mKHN0cnVjdCBzY3JpcHQsIGxhYmVsKSkKKyNkZWZpbmUgUEFERFJIKGxhYmVsKSAgIChSRUxPQ19MQUJFTEggfCBvZmZzZXRvZihzdHJ1Y3Qgc2NyaXB0aCwgbGFiZWwpKQorI2RlZmluZQlSQUREUihsYWJlbCkJKFJFTE9DX1JFR0lTVEVSIHwgUkVHKGxhYmVsKSkKKyNkZWZpbmUJRkFERFIobGFiZWwsb2ZzKShSRUxPQ19SRUdJU1RFUiB8ICgoUkVHKGxhYmVsKSkrKG9mcykpKQorI2lmIDAKKyNkZWZpbmUJS1ZBUih3aGljaCkJKFJFTE9DX0tWQVIgfCAod2hpY2gpKQorI2VuZGlmCisKKyNpZiAwCisjZGVmaW5lCVNDUklQVF9LVkFSX0pJRkZJRVMJKDApCisjZGVmaW5lCVNDUklQVF9LVkFSX0ZJUlNUCQlTQ1JJUFRfS1ZBUl9KSUZGSUVTCisjZGVmaW5lCVNDUklQVF9LVkFSX0xBU1QJCVNDUklQVF9LVkFSX0pJRkZJRVMKKy8qCisgKiBLZXJuZWwgdmFyaWFibGVzIHJlZmVyZW5jZWQgaW4gdGhlIHNjcmlwdHMuCisgKiBUSEVTRSBNVVNUIEFMTCBCRSBBTElHTkVEIFRPIEEgNC1CWVRFIEJPVU5EQVJZLgorICovCitzdGF0aWMgdm9pZCAqc2NyaXB0X2t2YXJzW10gX19pbml0ZGF0YSA9CisJeyAodm9pZCAqKSZqaWZmaWVzIH07CisjZW5kaWYKKworc3RhdGljCXN0cnVjdCBzY3JpcHQgc2NyaXB0MCBfX2luaXRkYXRhID0geworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU1RBUlQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8geworCS8qCisJKioJVGhpcyBOT1Agd2lsbCBiZSBwYXRjaGVkIHdpdGggTEVEIE9OCisJKioJU0NSX1JFR19SRUcgKGdwcmVnLCBTQ1JfQU5ELCAweGZlKQorCSovCisJU0NSX05PX09QLAorCQkwLAorCS8qCisJKiogICAgICBDbGVhciBTSUdQLgorCSovCisJU0NSX0ZST01fUkVHIChjdGVzdDIpLAorCQkwLAorCS8qCisJKioJVGhlbiBqdW1wIHRvIGEgY2VydGFpbiBwb2ludCBpbiB0cnlsb29wLgorCSoqCUR1ZSB0byB0aGUgbGFjayBvZiBpbmRpcmVjdCBhZGRyZXNzaW5nIHRoZSBjb2RlCisJKioJaXMgc2VsZiBtb2RpZnlpbmcgaGVyZS4KKwkqLworCVNDUl9KVU1QLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU1RBUlRQT1MgPi0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQlQQUREUkgodHJ5bG9vcCksCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTEVDVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCURTQQljb250YWlucyB0aGUgYWRkcmVzcyBvZiBhIHNjaGVkdWxlZAorCSoqCQlkYXRhIHN0cnVjdHVyZS4KKwkqKgorCSoqCVNDUkFUQ0hBIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzY3JpcHQsCisJKioJCXdoaWNoIHN0YXJ0cyB0aGUgbmV4dCBlbnRyeS4KKwkqKgorCSoqCVNldCBJbml0aWF0b3IgbW9kZS4KKwkqKgorCSoqCShUYXJnZXQgbW9kZSBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyKQorCSovCisKKwlTQ1JfQ0xSIChTQ1JfVFJHKSwKKwkJMCwKKwlTQ1JfTE9BRF9SRUcgKEhTX1JFRywgSFNfU0VMRUNUSU5HKSwKKwkJMCwKKworCS8qCisJKiogICAgICBBbmQgdHJ5IHRvIHNlbGVjdCB0aGlzIHRhcmdldC4KKwkqLworCVNDUl9TRUxfVEJMX0FUTiBeIG9mZnNldG9mIChzdHJ1Y3QgZHNiLCBzZWxlY3QpLAorCQlQQUREUiAocmVzZWxlY3QpLAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTRUxFQ1QyID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJTm93IHRoZXJlIGFyZSA0IHBvc3NpYmlsaXRpZXM6CisJKioKKwkqKgkoMSkgVGhlIG5jciBsb3NlcyBhcmJpdHJhdGlvbi4KKwkqKglUaGlzIGlzIG9rLCBiZWNhdXNlIGl0IHdpbGwgdHJ5IGFnYWluLAorCSoqCXdoZW4gdGhlIGJ1cyBiZWNvbWVzIGlkbGUuCisJKioJKEJ1dCBiZXdhcmUgb2YgdGhlIHRpbWVvdXQgZnVuY3Rpb24hKQorCSoqCisJKioJKDIpIFRoZSBuY3IgaXMgcmVzZWxlY3RlZC4KKwkqKglUaGVuIHRoZSBzY3JpcHQgcHJvY2Vzc29yIHRha2VzIHRoZSBqdW1wCisJKioJdG8gdGhlIFJFU0VMRUNUIGxhYmVsLgorCSoqCisJKioJKDMpIFRoZSBuY3Igd2lucyBhcmJpdHJhdGlvbi4KKwkqKglUaGVuIGl0IHdpbGwgZXhlY3V0ZSBTQ1JJUFRTIGluc3RydWN0aW9uIHVudGlsIAorCSoqCXRoZSBuZXh0IGluc3RydWN0aW9uIHRoYXQgY2hlY2tzIFNDU0kgcGhhc2UuCisJKioJVGhlbiB3aWxsIHN0b3AgYW5kIHdhaXQgZm9yIHNlbGVjdGlvbiB0byBiZSAKKwkqKgljb21wbGV0ZSBvciBzZWxlY3Rpb24gdGltZS1vdXQgdG8gb2NjdXIuCisJKioJQXMgYSByZXN1bHQgdGhlIFNDUklQVFMgaW5zdHJ1Y3Rpb25zIHVudGlsIAorCSoqCUxPQURQT1MgKyAyIHNob3VsZCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCB3aXRoIAorCSoqCXRoZSBTQ1NJIGNvcmUgcGVyZm9ybWluZyBzZWxlY3Rpb24uCisJKi8KKworCS8qCisJKioJVGhlIE1fUkVKRUNUIHByb2JsZW0gc2VlbXMgdG8gYmUgZHVlIHRvIGEgc2VsZWN0aW9uIAorCSoqCXRpbWluZyBwcm9ibGVtLgorCSoqCVdhaXQgaW1tZWRpYXRlbHkgZm9yIHRoZSBzZWxlY3Rpb24gdG8gY29tcGxldGUuIAorCSoqCSgyLjV4IGJlaGF2ZXMgc28pCisJKi8KKwlTQ1JfSlVNUFIgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX09VVCkpLAorCQkwLAorCisJLyoKKwkqKglOZXh0IHRpbWUgdXNlIHRoZSBuZXh0IHNsb3QuCisJKi8KKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSICh0ZW1wKSwKKwkJUEFERFIgKHN0YXJ0cG9zKSwKKwkvKgorCSoqICAgICAgVGhlIG5jciBkb2Vzbid0IGhhdmUgYW4gaW5kaXJlY3QgbG9hZAorCSoqCW9yIHN0b3JlIGNvbW1hbmQuIFNvIHdlIGhhdmUgdG8KKwkqKgljb3B5IHBhcnQgb2YgdGhlIGNvbnRyb2wgYmxvY2sgdG8gYQorCSoqCWZpeGVkIHBsYWNlLCB3aGVyZSB3ZSBjYW4gYWNjZXNzIGl0LgorCSoqCisJKioJV2UgcGF0Y2ggdGhlIGFkZHJlc3MgcGFydCBvZiBhCisJKioJQ09QWSBjb21tYW5kIHdpdGggdGhlIERTQS1yZWdpc3Rlci4KKwkqLworCVNDUl9DT1BZX0YgKDQpLAorCQlSQUREUiAoZHNhKSwKKwkJUEFERFIgKGxvYWRwb3MpLAorCS8qCisJKioJRmx1c2ggc2NyaXB0IHByZWZldGNoIGlmIHJlcXVpcmVkCisJKi8KKwlQUkVGRVRDSF9GTFVTSAorCS8qCisJKioJdGhlbiB3ZSBkbyB0aGUgYWN0dWFsIGNvcHkuCisJKi8KKwlTQ1JfQ09QWSAoc2l6ZW9mIChzdHJ1Y3QgaGVhZCkpLAorCS8qCisJKioJY29udGludWVkIGFmdGVyIHRoZSBuZXh0IGxhYmVsIC4uLgorCSovCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBMT0FEUE9TID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJCTAsCisJCU5BRERSIChoZWFkZXIpLAorCS8qCisJKioJV2FpdCBmb3IgdGhlIG5leHQgcGhhc2Ugb3IgdGhlIHNlbGVjdGlvbgorCSoqCXRvIGNvbXBsZXRlIG9yIHRpbWUtb3V0LgorCSovCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX09VVCkpLAorCQlQQUREUiAocHJlcGFyZSksCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTkRfSURFTlQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglTZWxlY3Rpb24gY29tcGxldGUuCisJKioJU2VuZCB0aGUgSURFTlRJRlkgYW5kIFNJTVBMRV9UQUcgbWVzc2FnZXMKKwkqKgkoYW5kIHRoZSBNX1hfU1lOQ19SRVEgbWVzc2FnZSkKKwkqLworCVNDUl9NT1ZFX1RCTCBeIFNDUl9NU0dfT1VULAorCQlvZmZzZXRvZiAoc3RydWN0IGRzYiwgc21zZyksCisJU0NSX0pVTVAgXiBJRlRSVUUgKFdIRU4gKFNDUl9NU0dfT1VUKSksCisJCVBBRERSSCAocmVzZW5kX2lkZW50KSwKKwlTQ1JfTE9BRF9SRUcgKHNjcmF0Y2hhLCAweDgwKSwKKwkJMCwKKwlTQ1JfQ09QWSAoMSksCisJCVJBRERSIChzY3JhdGNoYSksCisJCU5BRERSIChsYXN0bXNnKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBSRVBBUkUgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKiAgICAgIGxvYWQgdGhlIHNhdmVwIChzYXZlZCBwb2ludGVyKSBpbnRvCisJKiogICAgICB0aGUgVEVNUCByZWdpc3RlciAoYWN0dWFsIHBvaW50ZXIpCisJKi8KKwlTQ1JfQ09QWSAoNCksCisJCU5BRERSIChoZWFkZXIuc2F2ZXApLAorCQlSQUREUiAodGVtcCksCisJLyoKKwkqKiAgICAgIEluaXRpYWxpemUgdGhlIHN0YXR1cyByZWdpc3RlcnMKKwkqLworCVNDUl9DT1BZICg0KSwKKwkJTkFERFIgKGhlYWRlci5zdGF0dXMpLAorCQlSQUREUiAoc2NyMCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQUkVQQVJFMiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJSW5pdGlhbGl6ZSB0aGUgbXNnb3V0IGJ1ZmZlciB3aXRoIGEgTk9PUCBtZXNzYWdlLgorCSovCisJU0NSX0xPQURfUkVHIChzY3JhdGNoYSwgTV9OT09QKSwKKwkJMCwKKwlTQ1JfQ09QWSAoMSksCisJCVJBRERSIChzY3JhdGNoYSksCisJCU5BRERSIChtc2dvdXQpLAorI2lmIDAKKwlTQ1JfQ09QWSAoMSksCisJCVJBRERSIChzY3JhdGNoYSksCisJCU5BRERSIChtc2dpbiksCisjZW5kaWYKKwkvKgorCSoqCUFudGljaXBhdGUgdGhlIENPTU1BTkQgcGhhc2UuCisJKioJVGhpcyBpcyB0aGUgbm9ybWFsIGNhc2UgZm9yIGluaXRpYWwgc2VsZWN0aW9uLgorCSovCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfQ09NTUFORCkpLAorCQlQQUREUiAoZGlzcGF0Y2gpLAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBDT01NQU5EID4tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCS4uLiBhbmQgc2VuZCB0aGUgY29tbWFuZAorCSovCisJU0NSX01PVkVfVEJMIF4gU0NSX0NPTU1BTkQsCisJCW9mZnNldG9mIChzdHJ1Y3QgZHNiLCBjbWQpLAorCS8qCisJKioJSWYgc3RhdHVzIGlzIHN0aWxsIEhTX05FR09USUFURSwgbmVnb3RpYXRpb24gZmFpbGVkLgorCSoqCVdlIGNoZWNrIHRoaXMgaGVyZSwgc2luY2Ugd2Ugd2FudCB0byBkbyB0aGF0IAorCSoqCW9ubHkgb25jZS4KKwkqLworCVNDUl9GUk9NX1JFRyAoSFNfUkVHKSwKKwkJMCwKKwlTQ1JfSU5UIF4gSUZUUlVFIChEQVRBIChIU19ORUdPVElBVEUpKSwKKwkJU0lSX05FR09fRkFJTEVELAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgRElTUEFUQ0ggPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglNU0dfSU4gaXMgdGhlIG9ubHkgcGhhc2UgdGhhdCBzaGFsbCBiZSAKKwkqKgllbnRlcmVkIGF0IGxlYXN0IG9uY2UgZm9yIGVhY2ggKHJlKXNlbGVjdGlvbi4KKwkqKglTbyB3ZSB0ZXN0IGl0IGZpcnN0LgorCSovCisJU0NSX0pVTVAgXiBJRlRSVUUgKFdIRU4gKFNDUl9NU0dfSU4pKSwKKwkJUEFERFIgKG1zZ19pbiksCisKKwlTQ1JfUkVUVVJOIF4gSUZUUlVFIChJRiAoU0NSX0RBVEFfT1VUKSksCisJCTAsCisJLyoKKwkqKglERUwgMzk3IC0gNTNDODc1IFJldiAzIC0gUGFydCBOdW1iZXIgNjA5LTAzOTI0MTAgLSBJVEVNIDQuCisJKioJUG9zc2libGUgZGF0YSBjb3JydXB0aW9uIGR1cmluZyBNZW1vcnkgV3JpdGUgYW5kIEludmFsaWRhdGUuCisJKioJVGhpcyB3b3JrLWFyb3VuZCByZXNldHMgdGhlIGFkZHJlc3NpbmcgbG9naWMgcHJpb3IgdG8gdGhlIAorCSoqCXN0YXJ0IG9mIHRoZSBmaXJzdCBNT1ZFIG9mIGEgREFUQSBJTiBwaGFzZS4KKwkqKgkoU2VlIERvY3VtZW50YXRpb24vc2NzaS9uY3I1M2M4eHgudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uKQorCSovCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoSUYgKFNDUl9EQVRBX0lOKSksCisJCTIwLAorCVNDUl9DT1BZICg0KSwKKwkJUkFERFIgKHNjcmF0Y2hhKSwKKwkJUkFERFIgKHNjcmF0Y2hhKSwKKwlTQ1JfUkVUVVJOLAorIAkJMCwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoSUYgKFNDUl9TVEFUVVMpKSwKKwkJUEFERFIgKHN0YXR1cyksCisJU0NSX0pVTVAgXiBJRlRSVUUgKElGIChTQ1JfQ09NTUFORCkpLAorCQlQQUREUiAoY29tbWFuZCksCisJU0NSX0pVTVAgXiBJRlRSVUUgKElGIChTQ1JfTVNHX09VVCkpLAorCQlQQUREUiAobXNnX291dCksCisJLyoKKwkqKiAgICAgIERpc2NhcmQgb25lIGlsbGVnYWwgcGhhc2UgYnl0ZSwgaWYgcmVxdWlyZWQuCisJKi8KKwlTQ1JfTE9BRF9SRUcgKHNjcmF0Y2hhLCBYRV9CQURfUEhBU0UpLAorCQkwLAorCVNDUl9DT1BZICgxKSwKKwkJUkFERFIgKHNjcmF0Y2hhKSwKKwkJTkFERFIgKHhlcnJfc3QpLAorCVNDUl9KVU1QUiBeIElGRkFMU0UgKElGIChTQ1JfSUxHX09VVCkpLAorCQk4LAorCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfSUxHX09VVCwKKwkJTkFERFIgKHNjcmF0Y2gpLAorCVNDUl9KVU1QUiBeIElGRkFMU0UgKElGIChTQ1JfSUxHX0lOKSksCisJCTgsCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9JTEdfSU4sCisJCU5BRERSIChzY3JhdGNoKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFIgKGRpc3BhdGNoKSwKKworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQ0xSQUNLID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJVGVybWluYXRlIHBvc3NpYmxlIHBlbmRpbmcgbWVzc2FnZSBwaGFzZS4KKwkqLworCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUiAoZGlzcGF0Y2gpLAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBOT19EQVRBID4tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCVRoZSB0YXJnZXQgd2FudHMgdG8gdHJhbmZlciB0b28gbXVjaCBkYXRhCisJKioJb3IgaW4gdGhlIHdyb25nIGRpcmVjdGlvbi4KKwkqKiAgICAgIFJlbWVtYmVyIHRoYXQgaW4gZXh0ZW5kZWQgZXJyb3IuCisJKi8KKwlTQ1JfTE9BRF9SRUcgKHNjcmF0Y2hhLCBYRV9FWFRSQV9EQVRBKSwKKwkJMCwKKwlTQ1JfQ09QWSAoMSksCisJCVJBRERSIChzY3JhdGNoYSksCisJCU5BRERSICh4ZXJyX3N0KSwKKwkvKgorCSoqICAgICAgRGlzY2FyZCBvbmUgZGF0YSBieXRlLCBpZiByZXF1aXJlZC4KKwkqLworCVNDUl9KVU1QUiBeIElGRkFMU0UgKFdIRU4gKFNDUl9EQVRBX09VVCkpLAorCQk4LAorCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfREFUQV9PVVQsCisJCU5BRERSIChzY3JhdGNoKSwKKwlTQ1JfSlVNUFIgXiBJRkZBTFNFIChJRiAoU0NSX0RBVEFfSU4pKSwKKwkJOCwKKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX0RBVEFfSU4sCisJCU5BRERSIChzY3JhdGNoKSwKKwkvKgorCSoqICAgICAgLi4gYW5kIHJlcGVhdCBhcyByZXF1aXJlZC4KKwkqLworCVNDUl9DQUxMLAorCQlQQUREUiAoZGlzcGF0Y2gpLAorCVNDUl9KVU1QLAorCQlQQUREUiAobm9fZGF0YSksCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNUQVRVUyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglnZXQgdGhlIHN0YXR1cworCSovCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9TVEFUVVMsCisJCU5BRERSIChzY3JhdGNoKSwKKwkvKgorCSoqCXNhdmUgc3RhdHVzIHRvIHNjc2lfc3RhdHVzLgorCSoqCW1hcmsgYXMgY29tcGxldGUuCisJKi8KKwlTQ1JfVE9fUkVHIChTU19SRUcpLAorCQkwLAorCVNDUl9MT0FEX1JFRyAoSFNfUkVHLCBIU19DT01QTEVURSksCisJCTAsCisJU0NSX0pVTVAsCisJCVBBRERSIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfSU4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJR2V0IHRoZSBmaXJzdCBieXRlIG9mIHRoZSBtZXNzYWdlCisJKioJYW5kIHNhdmUgaXQgdG8gU0NSQVRDSEEuCisJKioKKwkqKglUaGUgc2NyaXB0IHByb2Nlc3NvciBkb2Vzbid0IG5lZ2F0ZSB0aGUKKwkqKglBQ0sgc2lnbmFsIGFmdGVyIHRoaXMgdHJhbnNmZXIuCisJKi8KKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19JTiwKKwkJTkFERFIgKG1zZ2luWzBdKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE1TR19JTjIgPi0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJSGFuZGxlIHRoaXMgbWVzc2FnZS4KKwkqLworCVNDUl9KVU1QIF4gSUZUUlVFIChEQVRBIChNX0NPTVBMRVRFKSksCisJCVBBRERSIChjb21wbGV0ZSksCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKE1fRElTQ09OTkVDVCkpLAorCQlQQUREUiAoZGlzY29ubmVjdCksCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKE1fU0FWRV9EUCkpLAorCQlQQUREUiAoc2F2ZV9kcCksCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKE1fUkVTVE9SRV9EUCkpLAorCQlQQUREUiAocmVzdG9yZV9kcCksCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKE1fRVhURU5ERUQpKSwKKwkJUEFERFJIIChtc2dfZXh0ZW5kZWQpLAorCVNDUl9KVU1QIF4gSUZUUlVFIChEQVRBIChNX05PT1ApKSwKKwkJUEFERFIgKGNscmFjayksCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKE1fUkVKRUNUKSksCisJCVBBRERSSCAobXNnX3JlamVjdCksCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKE1fSUdOX1JFU0lEVUUpKSwKKwkJUEFERFJIIChtc2dfaWduX3Jlc2lkdWUpLAorCS8qCisJKioJUmVzdCBvZiB0aGUgbWVzc2FnZXMgbGVmdCBhcworCSoqCWFuIGV4ZXJjaXNlIC4uLgorCSoqCisJKioJVW5pbXBsZW1lbnRlZCBtZXNzYWdlczoKKwkqKglmYWxsIHRocm91Z2ggdG8gTVNHX0JBRC4KKwkqLworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX0JBRCA+LS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJdW5pbXBsZW1lbnRlZCBtZXNzYWdlIC0gcmVqZWN0IGl0LgorCSovCisJU0NSX0lOVCwKKwkJU0lSX1JFSkVDVF9TRU5ULAorCVNDUl9MT0FEX1JFRyAoc2NyYXRjaGEsIE1fUkVKRUNUKSwKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFVE1TRyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfQ09QWSAoMSksCisJCVJBRERSIChzY3JhdGNoYSksCisJCU5BRERSIChtc2dvdXQpLAorCVNDUl9TRVQgKFNDUl9BVE4pLAorCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUiAoY2xyYWNrKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IENMRUFOVVAgPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKiAgICAgIGRzYTogICAgUG9pbnRlciB0byBjY2IKKwkqKgkgICAgICBvciB4eHh4eHhGRiAobm8gY2NiKQorCSoqCisJKiogICAgICBIU19SRUc6ICAgSG9zdC1TdGF0dXMgKDw+MCEpCisJKi8KKwlTQ1JfRlJPTV9SRUcgKGRzYSksCisJCTAsCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKDB4ZmYpKSwKKwkJUEFERFIgKHN0YXJ0KSwKKwkvKgorCSoqICAgICAgZHNhIGlzIHZhbGlkLgorCSoqCWNvbXBsZXRlIHRoZSBjbGVhbnVwLgorCSovCisJU0NSX0pVTVAsCisJCVBBRERSIChjbGVhbnVwX29rKSwKKworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQ09NUExFVEUgPi0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJQ29tcGxldGUgbWVzc2FnZS4KKwkqKgorCSoqCUNvcHkgVEVNUCByZWdpc3RlciB0byBMQVNUUCBpbiBoZWFkZXIuCisJKi8KKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSICh0ZW1wKSwKKwkJTkFERFIgKGhlYWRlci5sYXN0cCksCisJLyoKKwkqKglXaGVuIHdlIHRlcm1pbmF0ZSB0aGUgY3ljbGUgYnkgY2xlYXJpbmcgQUNLLAorCSoqCXRoZSB0YXJnZXQgbWF5IGRpc2Nvbm5lY3QgaW1tZWRpYXRlbHkuCisJKioKKwkqKglXZSBkb24ndCB3YW50IHRvIGJlIHRvbGQgb2YgYW4KKwkqKgkidW5leHBlY3RlZCBkaXNjb25uZWN0IiwKKwkqKglzbyB3ZSBkaXNhYmxlIHRoaXMgZmVhdHVyZS4KKwkqLworCVNDUl9SRUdfUkVHIChzY250bDIsIFNDUl9BTkQsIDB4N2YpLAorCQkwLAorCS8qCisJKioJVGVybWluYXRlIGN5Y2xlIC4uLgorCSovCisJU0NSX0NMUiAoU0NSX0FDS3xTQ1JfQVROKSwKKwkJMCwKKwkvKgorCSoqCS4uLiBhbmQgd2FpdCBmb3IgdGhlIGRpc2Nvbm5lY3QuCisJKi8KKwlTQ1JfV0FJVF9ESVNDLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQ0xFQU5VUF9PSyA+LS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCVNhdmUgaG9zdCBzdGF0dXMgdG8gaGVhZGVyLgorCSovCisJU0NSX0NPUFkgKDQpLAorCQlSQUREUiAoc2NyMCksCisJCU5BRERSIChoZWFkZXIuc3RhdHVzKSwKKwkvKgorCSoqCWFuZCBjb3B5IGJhY2sgdGhlIGhlYWRlciB0byB0aGUgY2NiLgorCSovCisJU0NSX0NPUFlfRiAoNCksCisJCVJBRERSIChkc2EpLAorCQlQQUREUiAoY2xlYW51cDApLAorCS8qCisJKioJRmx1c2ggc2NyaXB0IHByZWZldGNoIGlmIHJlcXVpcmVkCisJKi8KKwlQUkVGRVRDSF9GTFVTSAorCVNDUl9DT1BZIChzaXplb2YgKHN0cnVjdCBoZWFkKSksCisJCU5BRERSIChoZWFkZXIpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQ0xFQU5VUDAgPi0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0lHTkFMID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJaWYgam9iIG5vdCBjb21wbGV0ZWQgLi4uCisJKi8KKwlTQ1JfRlJPTV9SRUcgKEhTX1JFRyksCisJCTAsCisJLyoKKwkqKgkuLi4gc3RhcnQgdGhlIG5leHQgY29tbWFuZC4KKwkqLworCVNDUl9KVU1QIF4gSUZUUlVFIChNQVNLICgwLCAoSFNfRE9ORU1BU0t8SFNfU0tJUE1BU0spKSksCisJCVBBRERSKHN0YXJ0KSwKKwkvKgorCSoqCUlmIGNvbW1hbmQgcmVzdWx0ZWQgaW4gbm90IEdPT0Qgc3RhdHVzLAorCSoqCWNhbGwgdGhlIEMgY29kZSBpZiBuZWVkZWQuCisJKi8KKwlTQ1JfRlJPTV9SRUcgKFNTX1JFRyksCisJCTAsCisJU0NSX0NBTEwgXiBJRkZBTFNFIChEQVRBIChTX0dPT0QpKSwKKwkJUEFERFJIIChiYWRfc3RhdHVzKSwKKworI2lmbmRlZglTQ1NJX05DUl9DQ0JfRE9ORV9TVVBQT1JUCisKKwkvKgorCSoqCS4uLiBzaWduYWwgY29tcGxldGlvbiB0byB0aGUgaG9zdAorCSovCisJU0NSX0lOVCwKKwkJU0lSX0lOVEZMWSwKKwkvKgorCSoqCUF1ZiB6dSBuZXVlbiBTY2hhbmR0YXRlbiEKKwkqLworCVNDUl9KVU1QLAorCQlQQUREUihzdGFydCksCisKKyNlbHNlCS8qIGRlZmluZWQgU0NTSV9OQ1JfQ0NCX0RPTkVfU1VQUE9SVCAqLworCisJLyoKKwkqKgkuLi4gc2lnbmFsIGNvbXBsZXRpb24gdG8gdGhlIGhvc3QKKwkqLworCVNDUl9KVU1QLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBET05FX1BPUyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQlQQUREUkggKGRvbmVfcXVldWUpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBET05FX1BMVUcgPi0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9JTlQsCisJCVNJUl9ET05FX09WRVJGTE9XLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBET05FX0VORCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9JTlQsCisJCVNJUl9JTlRGTFksCisJU0NSX0NPUFkgKDQpLAorCQlSQUREUiAodGVtcCksCisJCVBBRERSIChkb25lX3BvcyksCisJU0NSX0pVTVAsCisJCVBBRERSIChzdGFydCksCisKKyNlbmRpZgkvKiBTQ1NJX05DUl9DQ0JfRE9ORV9TVVBQT1JUICovCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNBVkVfRFAgPi0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCVNBVkVfRFAgbWVzc2FnZToKKwkqKglDb3B5IFRFTVAgcmVnaXN0ZXIgdG8gU0FWRVAgaW4gaGVhZGVyLgorCSovCisJU0NSX0NPUFkgKDQpLAorCQlSQUREUiAodGVtcCksCisJCU5BRERSIChoZWFkZXIuc2F2ZXApLAorCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUiAoZGlzcGF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTVE9SRV9EUCA+LS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJUkVTVE9SRV9EUCBtZXNzYWdlOgorCSoqCUNvcHkgU0FWRVAgaW4gaGVhZGVyIHRvIFRFTVAgcmVnaXN0ZXIuCisJKi8KKwlTQ1JfQ09QWSAoNCksCisJCU5BRERSIChoZWFkZXIuc2F2ZXApLAorCQlSQUREUiAodGVtcCksCisJU0NSX0pVTVAsCisJCVBBRERSIChjbHJhY2spLAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBESVNDT05ORUNUID4tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglESVNDT05ORUNUaW5nICAuLi4KKwkqKgorCSoqCWRpc2FibGUgdGhlICJ1bmV4cGVjdGVkIGRpc2Nvbm5lY3QiIGZlYXR1cmUsCisJKioJYW5kIHJlbW92ZSB0aGUgQUNLIHNpZ25hbC4KKwkqLworCVNDUl9SRUdfUkVHIChzY250bDIsIFNDUl9BTkQsIDB4N2YpLAorCQkwLAorCVNDUl9DTFIgKFNDUl9BQ0t8U0NSX0FUTiksCisJCTAsCisJLyoKKwkqKglXYWl0IGZvciB0aGUgZGlzY29ubmVjdC4KKwkqLworCVNDUl9XQUlUX0RJU0MsCisJCTAsCisJLyoKKwkqKglTdGF0dXMgaXM6IERJU0NPTk5FQ1RFRC4KKwkqLworCVNDUl9MT0FEX1JFRyAoSFNfUkVHLCBIU19ESVNDT05ORUNUKSwKKwkJMCwKKwlTQ1JfSlVNUCwKKwkJUEFERFIgKGNsZWFudXBfb2spLAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfT1VUID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJVGhlIHRhcmdldCByZXF1ZXN0cyBhIG1lc3NhZ2UuCisJKi8KKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19PVVQsCisJCU5BRERSIChtc2dvdXQpLAorCVNDUl9DT1BZICgxKSwKKwkJTkFERFIgKG1zZ291dCksCisJCU5BRERSIChsYXN0bXNnKSwKKwkvKgorCSoqCUlmIGl0IHdhcyBubyBBQk9SVCBtZXNzYWdlIC4uLgorCSovCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKE1fQUJPUlQpKSwKKwkJUEFERFJIIChtc2dfb3V0X2Fib3J0KSwKKwkvKgorCSoqCS4uLiB3YWl0IGZvciB0aGUgbmV4dCBwaGFzZQorCSoqCWlmIGl0J3MgYSBtZXNzYWdlIG91dCwgc2VuZCBpdCBhZ2FpbiwgLi4uCisJKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoV0hFTiAoU0NSX01TR19PVVQpKSwKKwkJUEFERFIgKG1zZ19vdXQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX09VVF9ET05FID4tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCS4uLiBlbHNlIGNsZWFyIHRoZSBtZXNzYWdlIC4uLgorCSovCisJU0NSX0xPQURfUkVHIChzY3JhdGNoYSwgTV9OT09QKSwKKwkJMCwKKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSIChzY3JhdGNoYSksCisJCU5BRERSIChtc2dvdXQpLAorCS8qCisJKioJLi4uIGFuZCBwcm9jZXNzIHRoZSBuZXh0IHBoYXNlCisJKi8KKwlTQ1JfSlVNUCwKKwkJUEFERFIgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IElETEUgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCU5vdGhpbmcgdG8gZG8/CisJKioJV2FpdCBmb3IgcmVzZWxlY3QuCisJKioJVGhpcyBOT1Agd2lsbCBiZSBwYXRjaGVkIHdpdGggTEVEIE9GRgorCSoqCVNDUl9SRUdfUkVHIChncHJlZywgU0NSX09SLCAweDAxKQorCSovCisJU0NSX05PX09QLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTRUxFQ1QgPi0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJbWFrZSB0aGUgRFNBIGludmFsaWQuCisJKi8KKwlTQ1JfTE9BRF9SRUcgKGRzYSwgMHhmZiksCisJCTAsCisJU0NSX0NMUiAoU0NSX1RSRyksCisJCTAsCisJU0NSX0xPQURfUkVHIChIU19SRUcsIEhTX0lOX1JFU0VMRUNUKSwKKwkJMCwKKwkvKgorCSoqCVNsZWVwIHdhaXRpbmcgZm9yIGEgcmVzZWxlY3Rpb24uCisJKioJSWYgU0lHUCBpcyBzZXQsIHNwZWNpYWwgdHJlYXRtZW50LgorCSoqCisJKioJWnUgYWxsZW0gYmVyZWl0IC4uCisJKi8KKwlTQ1JfV0FJVF9SRVNFTCwKKwkJUEFERFIoc3RhcnQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTRUxFQ1RFRCA+LS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJVGhpcyBOT1Agd2lsbCBiZSBwYXRjaGVkIHdpdGggTEVEIE9OCisJKioJU0NSX1JFR19SRUcgKGdwcmVnLCBTQ1JfQU5ELCAweGZlKQorCSovCisJU0NSX05PX09QLAorCQkwLAorCS8qCisJKioJLi4uIHp1IG5pY2h0cyB6dSBnZWJyYXVjaGVuID8KKwkqKgorCSoqICAgICAgbG9hZCB0aGUgdGFyZ2V0IGlkIGludG8gdGhlIFNGQlIKKwkqKglhbmQganVtcCB0byB0aGUgY29udHJvbCBibG9jay4KKwkqKgorCSoqCUxvb2sgYXQgdGhlIGRlY2xhcmF0aW9ucyBvZgorCSoqCS0gc3RydWN0IG5jYgorCSoqCS0gc3RydWN0IHRjYgorCSoqCS0gc3RydWN0IGxjYgorCSoqCS0gc3RydWN0IGNjYgorCSoqCXRvIHVuZGVyc3RhbmQgd2hhdCdzIGdvaW5nIG9uLgorCSovCisJU0NSX1JFR19TRkJSIChzc2lkLCBTQ1JfQU5ELCAweDhGKSwKKwkJMCwKKwlTQ1JfVE9fUkVHIChzZGlkKSwKKwkJMCwKKwlTQ1JfSlVNUCwKKwkJTkFERFIgKGp1bXBfdGNiKSwKKworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTRUxfRFNBID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJQWNrIHRoZSBJREVOVElGWSBvciBUQUcgcHJldmlvdXNseSByZWNlaXZlZC4KKwkqLworCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCS8qCisJKiogICAgICBUaGUgbmNyIGRvZXNuJ3QgaGF2ZSBhbiBpbmRpcmVjdCBsb2FkCisJKioJb3Igc3RvcmUgY29tbWFuZC4gU28gd2UgaGF2ZSB0bworCSoqCWNvcHkgcGFydCBvZiB0aGUgY29udHJvbCBibG9jayB0byBhCisJKioJZml4ZWQgcGxhY2UsIHdoZXJlIHdlIGNhbiBhY2Nlc3MgaXQuCisJKioKKwkqKglXZSBwYXRjaCB0aGUgYWRkcmVzcyBwYXJ0IG9mIGEKKwkqKglDT1BZIGNvbW1hbmQgd2l0aCB0aGUgRFNBLXJlZ2lzdGVyLgorCSovCisJU0NSX0NPUFlfRiAoNCksCisJCVJBRERSIChkc2EpLAorCQlQQUREUiAobG9hZHBvczEpLAorCS8qCisJKioJRmx1c2ggc2NyaXB0IHByZWZldGNoIGlmIHJlcXVpcmVkCisJKi8KKwlQUkVGRVRDSF9GTFVTSAorCS8qCisJKioJdGhlbiB3ZSBkbyB0aGUgYWN0dWFsIGNvcHkuCisJKi8KKwlTQ1JfQ09QWSAoc2l6ZW9mIChzdHJ1Y3QgaGVhZCkpLAorCS8qCisJKioJY29udGludWVkIGFmdGVyIHRoZSBuZXh0IGxhYmVsIC4uLgorCSovCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IExPQURQT1MxID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQkwLAorCQlOQUREUiAoaGVhZGVyKSwKKwkvKgorCSoqCVRoZSBEU0EgY29udGFpbnMgdGhlIGRhdGEgc3RydWN0dXJlIGFkZHJlc3MuCisJKi8KKwlTQ1JfSlVNUCwKKwkJUEFERFIgKHByZXBhcmUpLAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTF9MVU4gPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKgljb21lIGJhY2sgdG8gdGhpcyBwb2ludAorCSoqCXRvIGdldCBhbiBJREVOVElGWSBtZXNzYWdlCisJKioJV2FpdCBmb3IgYSBtc2dfaW4gcGhhc2UuCisJKi8KKwlTQ1JfSU5UIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19JTikpLAorCQlTSVJfUkVTRUxfTk9fTVNHX0lOLAorCS8qCisJKioJbWVzc2FnZSBwaGFzZS4KKwkqKglSZWFkIHRoZSBkYXRhIGRpcmVjdGx5IGZyb20gdGhlIEJVUyBEQVRBIGxpbmVzLgorCSoqCVRoaXMgaGVscHMgdG8gc3VwcG9ydCB2ZXJ5IG9sZCBTQ1NJIGRldmljZXMgdGhhdCAKKwkqKgltYXkgcmVzZWxlY3Qgd2l0aG91dCBzZW5kaW5nIGFuIElERU5USUZZLgorCSovCisJU0NSX0ZST01fUkVHIChzYmRsKSwKKwkJMCwKKwkvKgorCSoqCUl0IHNob3VsZCBiZSBhbiBJZGVudGlmeSBtZXNzYWdlLgorCSovCisJU0NSX1JFVFVSTiwKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VMX1RBRyA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCVJlYWQgSURFTlRJRlkgKyBTSU1QTEUgKyBUQUcgdXNpbmcgYSBzaW5nbGUgTU9WRS4KKwkqKglBZ3Jlc3NpdmUgb3B0aW1pemF0aW9uLCBpcydudCBpdD8KKwkqKglObyBuZWVkIHRvIHRlc3QgdGhlIFNJTVBMRSBUQUcgbWVzc2FnZSwgc2luY2UgdGhlIAorCSoqCWRyaXZlciBvbmx5IHN1cHBvcnRzIGNvbmZvcm1hbnQgZGV2aWNlcyBmb3IgdGFncy4gOy0pCisJKi8KKwlTQ1JfTU9WRV9BQlMgKDMpIF4gU0NSX01TR19JTiwKKwkJTkFERFIgKG1zZ2luKSwKKwkvKgorCSoqCVJlYWQgdGhlIFRBRyBmcm9tIHRoZSBTSURMLgorCSoqCVN0aWxsIGFuIGFnZ3Jlc3NpdmUgb3B0aW1pemF0aW9uLiA7LSkKKwkqKglDb21wdXRlIHRoZSBDQ0IgaW5kaXJlY3QganVtcCBhZGRyZXNzIHdoaWNoIAorCSoqCWlzICgjVEFHKjIgJiAweGZjKSBkdWUgdG8gdGFnIG51bWJlcmluZyB1c2luZyAKKwkqKgkxLDMsNS4uTUFYVEFHUyoyKzEgYWN0dWFsIHZhbHVlcy4KKwkqLworCVNDUl9SRUdfU0ZCUiAoc2lkbCwgU0NSX1NITCwgMCksCisJCTAsCisJU0NSX1NGQlJfUkVHICh0ZW1wLCBTQ1JfQU5ELCAweGZjKSwKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEpVTVBfVE9fTkVYVVMgPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NPUFlfRiAoNCksCisJCVJBRERSICh0ZW1wKSwKKwkJUEFERFIgKG5leHVzX2luZGlyZWN0KSwKKwkvKgorCSoqCUZsdXNoIHNjcmlwdCBwcmVmZXRjaCBpZiByZXF1aXJlZAorCSovCisJUFJFRkVUQ0hfRkxVU0gKKwlTQ1JfQ09QWSAoNCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBORVhVU19JTkRJUkVDVCA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkJMCwKKwkJUkFERFIgKHRlbXApLAorCVNDUl9SRVRVUk4sCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTF9OT1RBRyA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCU5vIHRhZyBleHBlY3RlZC4KKwkqKglSZWFkIGFuIHRocm93IGF3YXkgdGhlIElERU5USUZZLgorCSovCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfSU4sCisJCU5BRERSIChtc2dpbiksCisJU0NSX0pVTVAsCisJCVBBRERSIChqdW1wX3RvX25leHVzKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfSU4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworLyoKKyoqCUJlY2F1c2UgdGhlIHNpemUgZGVwZW5kcyBvbiB0aGUKKyoqCSNkZWZpbmUgTUFYX1NDQVRURVJMIHBhcmFtZXRlciwKKyoqCWl0IGlzIGZpbGxlZCBpbiBhdCBydW50aW1lLgorKioKKyoqICAjIz09PT09PT09PT09PCBpPTA7IGk8TUFYX1NDQVRURVJMID49PT09PT09PT0KKyoqICB8fAlTQ1JfQ0FMTCBeIElGRkFMU0UgKFdIRU4gKFNDUl9EQVRBX0lOKSksCisqKiAgfHwJCVBBRERSIChkaXNwYXRjaCksCisqKiAgfHwJU0NSX01PVkVfVEJMIF4gU0NSX0RBVEFfSU4sCisqKiAgfHwJCW9mZnNldG9mIChzdHJ1Y3QgZHNiLCBkYXRhWyBpXSksCisqKiAgIyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKzAKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfSU4yID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9DQUxMLAorCQlQQUREUiAoZGlzcGF0Y2gpLAorCVNDUl9KVU1QLAorCQlQQUREUiAobm9fZGF0YSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBX09VVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisvKgorKioJQmVjYXVzZSB0aGUgc2l6ZSBkZXBlbmRzIG9uIHRoZQorKioJI2RlZmluZSBNQVhfU0NBVFRFUkwgcGFyYW1ldGVyLAorKioJaXQgaXMgZmlsbGVkIGluIGF0IHJ1bnRpbWUuCisqKgorKiogICMjPT09PT09PT09PT08IGk9MDsgaTxNQVhfU0NBVFRFUkwgPj09PT09PT09PQorKiogIHx8CVNDUl9DQUxMIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0RBVEFfT1VUKSksCisqKiAgfHwJCVBBRERSIChkaXNwYXRjaCksCisqKiAgfHwJU0NSX01PVkVfVEJMIF4gU0NSX0RBVEFfT1VULAorKiogIHx8CQlvZmZzZXRvZiAoc3RydWN0IGRzYiwgZGF0YVsgaV0pLAorKiogICMjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiswCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBX09VVDIgPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NBTEwsCisJCVBBRERSIChkaXNwYXRjaCksCisJU0NSX0pVTVAsCisJCVBBRERSIChub19kYXRhKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK307CisKK3N0YXRpYwlzdHJ1Y3Qgc2NyaXB0aCBzY3JpcHRoMCBfX2luaXRkYXRhID0geworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBUUllMT09QID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL3sKKy8qCisqKglTdGFydCB0aGUgbmV4dCBlbnRyeS4KKyoqCUNhbGxlZCBhZGRyZXNzZXMgcG9pbnQgdG8gdGhlIGxhdW5jaCBzY3JpcHQgaW4gdGhlIENDQi4KKyoqCVRoZXkgYXJlIHBhdGNoZWQgYnkgdGhlIG1haW4gcHJvY2Vzc29yLgorKioKKyoqCUJlY2F1c2UgdGhlIHNpemUgZGVwZW5kcyBvbiB0aGUKKyoqCSNkZWZpbmUgTUFYX1NUQVJUIHBhcmFtZXRlciwgaXQgaXMgZmlsbGVkCisqKglpbiBhdCBydW50aW1lLgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgIyM9PT09PT09PT09PTwgST0wOyBpPE1BWF9TVEFSVCA+PT09PT09PT09PT0KKyoqICB8fAlTQ1JfQ0FMTCwKKyoqICB8fAkJUEFERFIgKGlkbGUpLAorKiogICMjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKzAKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgVFJZTE9PUDIgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfSlVNUCwKKwkJUEFERFJIKHRyeWxvb3ApLAorCisjaWZkZWYgU0NTSV9OQ1JfQ0NCX0RPTkVfU1VQUE9SVAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERPTkVfUVVFVUUgPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisvKgorKioJQ29weSB0aGUgQ0NCIGFkZHJlc3MgdG8gdGhlIG5leHQgZG9uZSBlbnRyeS4KKyoqCUJlY2F1c2UgdGhlIHNpemUgZGVwZW5kcyBvbiB0aGUKKyoqCSNkZWZpbmUgTUFYX0RPTkUgcGFyYW1ldGVyLCBpdCBpcyBmaWxsZWQKKyoqCWluIGF0IHJ1bnRpbWUuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICAjIz09PT09PT09PT09PCBJPTA7IGk8TUFYX0RPTkUgPj09PT09PT09PT09CisqKiAgfHwJU0NSX0NPUFkgKHNpemVvZihzdHJ1Y3QgY2NiICopLAorKiogIHx8CQlOQUREUiAoaGVhZGVyLmNwKSwKKyoqICB8fAkJTkFERFIgKGNjYl9kb25lW2ldKSwKKyoqICB8fAlTQ1JfQ0FMTCwKKyoqICB8fAkJUEFERFIgKGRvbmVfZW5kKSwKKyoqICAjIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiswCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERPTkVfUVVFVUUyID4tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0pVTVAsCisJCVBBRERSSCAoZG9uZV9xdWV1ZSksCisKKyNlbmRpZiAvKiBTQ1NJX05DUl9DQ0JfRE9ORV9TVVBQT1JUICovCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTEVDVF9OT19BVE4gPi0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJU2V0IEluaXRpYXRvciBtb2RlLgorCSoqICAgICAgQW5kIHRyeSB0byBzZWxlY3QgdGhpcyB0YXJnZXQgd2l0aG91dCBBVE4uCisJKi8KKworCVNDUl9DTFIgKFNDUl9UUkcpLAorCQkwLAorCVNDUl9MT0FEX1JFRyAoSFNfUkVHLCBIU19TRUxFQ1RJTkcpLAorCQkwLAorCVNDUl9TRUxfVEJMIF4gb2Zmc2V0b2YgKHN0cnVjdCBkc2IsIHNlbGVjdCksCisJCVBBRERSIChyZXNlbGVjdCksCisJU0NSX0pVTVAsCisJCVBBRERSIChzZWxlY3QyKSwKKworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQ0FOQ0VMID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisKKwlTQ1JfTE9BRF9SRUcgKHNjcmF0Y2hhLCBIU19BQk9SVEVEKSwKKwkJMCwKKwlTQ1JfSlVNUFIsCisJCTgsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTS0lQID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0xPQURfUkVHIChzY3JhdGNoYSwgMCksCisJCTAsCisJLyoKKwkqKglUaGlzIGVudHJ5IGhhcyBiZWVuIGNhbmNlbGVkLgorCSoqCU5leHQgdGltZSB1c2UgdGhlIG5leHQgc2xvdC4KKwkqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFIgKHRlbXApLAorCQlQQUREUiAoc3RhcnRwb3MpLAorCS8qCisJKiogICAgICBUaGUgbmNyIGRvZXNuJ3QgaGF2ZSBhbiBpbmRpcmVjdCBsb2FkCisJKioJb3Igc3RvcmUgY29tbWFuZC4gU28gd2UgaGF2ZSB0bworCSoqCWNvcHkgcGFydCBvZiB0aGUgY29udHJvbCBibG9jayB0byBhCisJKioJZml4ZWQgcGxhY2UsIHdoZXJlIHdlIGNhbiBhY2Nlc3MgaXQuCisJKioKKwkqKglXZSBwYXRjaCB0aGUgYWRkcmVzcyBwYXJ0IG9mIGEKKwkqKglDT1BZIGNvbW1hbmQgd2l0aCB0aGUgRFNBLXJlZ2lzdGVyLgorCSovCisJU0NSX0NPUFlfRiAoNCksCisJCVJBRERSIChkc2EpLAorCQlQQUREUkggKHNraXAyKSwKKwkvKgorCSoqCUZsdXNoIHNjcmlwdCBwcmVmZXRjaCBpZiByZXF1aXJlZAorCSovCisJUFJFRkVUQ0hfRkxVU0gKKwkvKgorCSoqCXRoZW4gd2UgZG8gdGhlIGFjdHVhbCBjb3B5LgorCSovCisJU0NSX0NPUFkgKHNpemVvZiAoc3RydWN0IGhlYWQpKSwKKwkvKgorCSoqCWNvbnRpbnVlZCBhZnRlciB0aGUgbmV4dCBsYWJlbCAuLi4KKwkqLworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0tJUDIgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkJMCwKKwkJTkFERFIgKGhlYWRlciksCisJLyoKKwkqKiAgICAgIEluaXRpYWxpemUgdGhlIHN0YXR1cyByZWdpc3RlcnMKKwkqLworCVNDUl9DT1BZICg0KSwKKwkJTkFERFIgKGhlYWRlci5zdGF0dXMpLAorCQlSQUREUiAoc2NyMCksCisJLyoKKwkqKglGb3JjZSBob3N0IHN0YXR1cy4KKwkqLworCVNDUl9GUk9NX1JFRyAoc2NyYXRjaGEpLAorCQkwLAorCVNDUl9KVU1QUiBeIElGRkFMU0UgKE1BU0sgKDAsIEhTX0RPTkVNQVNLKSksCisJCTE2LAorCVNDUl9SRUdfUkVHIChIU19SRUcsIFNDUl9PUiwgSFNfU0tJUE1BU0spLAorCQkwLAorCVNDUl9KVU1QUiwKKwkJOCwKKwlTQ1JfVE9fUkVHIChIU19SRUcpLAorCQkwLAorCVNDUl9MT0FEX1JFRyAoU1NfUkVHLCBTX0dPT0QpLAorCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUiAoY2xlYW51cF9vayksCisKK30sLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQQVJfRVJSX0RBVEFfSU4gPi0tLS0tLS0tLS0tLS0tLSoveworCS8qCisJKioJSWdub3JlIGFsbCBkYXRhIGluIGJ5dGUsIHVudGlsIG5leHQgcGhhc2UKKwkqLworCVNDUl9KVU1QIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0RBVEFfSU4pKSwKKwkJUEFERFJIIChwYXJfZXJyX290aGVyKSwKKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX0RBVEFfSU4sCisJCU5BRERSIChzY3JhdGNoKSwKKwlTQ1JfSlVNUFIsCisJCS0yNCwKK30sLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQQVJfRVJSX09USEVSID4tLS0tLS0tLS0tLS0tLS0tLS0qL3sKKwkvKgorCSoqCWNvdW50IGl0LgorCSovCisJU0NSX1JFR19SRUcgKFBTX1JFRywgU0NSX0FERCwgMHgwMSksCisJCTAsCisJLyoKKwkqKglqdW1wIHRvIGRpc3BhdGNoZXIuCisJKi8KKwlTQ1JfSlVNUCwKKwkJUEFERFIgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE1TR19SRUpFQ1QgPi0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCUlmIGEgbmVnb3RpYXRpb24gd2FzIGluIHByb2dyZXNzLAorCSoqCW5lZ290aWF0aW9uIGZhaWxlZC4KKwkqKglPdGhlcndpc2UsIGxldCB0aGUgQyBjb2RlIHByaW50IAorCSoqCXNvbWUgbWVzc2FnZS4KKwkqLworCVNDUl9GUk9NX1JFRyAoSFNfUkVHKSwKKwkJMCwKKwlTQ1JfSU5UIF4gSUZGQUxTRSAoREFUQSAoSFNfTkVHT1RJQVRFKSksCisJCVNJUl9SRUpFQ1RfUkVDRUlWRUQsCisJU0NSX0lOVCBeIElGVFJVRSAoREFUQSAoSFNfTkVHT1RJQVRFKSksCisJCVNJUl9ORUdPX0ZBSUxFRCwKKwlTQ1JfSlVNUCwKKwkJUEFERFIgKGNscmFjayksCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE1TR19JR05fUkVTSURVRSA+LS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCVRlcm1pbmF0ZSBjeWNsZQorCSovCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX0lOKSksCisJCVBBRERSIChkaXNwYXRjaCksCisJLyoKKwkqKglnZXQgcmVzaWR1ZSBzaXplLgorCSovCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfSU4sCisJCU5BRERSIChtc2dpblsxXSksCisJLyoKKwkqKglTaXplIGlzIDAgLi4gaWdub3JlIG1lc3NhZ2UuCisJKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoMCkpLAorCQlQQUREUiAoY2xyYWNrKSwKKwkvKgorCSoqCVNpemUgaXMgbm90IDEgLi4gaGF2ZSB0byBpbnRlcnJ1cHQuCisJKi8KKwlTQ1JfSlVNUFIgXiBJRkZBTFNFIChEQVRBICgxKSksCisJCTQwLAorCS8qCisJKioJQ2hlY2sgZm9yIHJlc2lkdWUgYnl0ZSBpbiBzd2lkZSByZWdpc3RlcgorCSovCisJU0NSX0ZST01fUkVHIChzY250bDIpLAorCQkwLAorCVNDUl9KVU1QUiBeIElGRkFMU0UgKE1BU0sgKFdTUiwgV1NSKSksCisJCTE2LAorCS8qCisJKioJVGhlcmUgSVMgZGF0YSBpbiB0aGUgc3dpZGUgcmVnaXN0ZXIuCisJKioJRGlzY2FyZCBpdC4KKwkqLworCVNDUl9SRUdfUkVHIChzY250bDIsIFNDUl9PUiwgV1NSKSwKKwkJMCwKKwlTQ1JfSlVNUCwKKwkJUEFERFIgKGNscmFjayksCisJLyoKKwkqKglMb2FkIGFnYWluIHRoZSBzaXplIHRvIHRoZSBzZmJyIHJlZ2lzdGVyLgorCSovCisJU0NSX0ZST01fUkVHIChzY3JhdGNoYSksCisJCTAsCisJU0NSX0lOVCwKKwkJU0lSX0lHTl9SRVNJRFVFLAorCVNDUl9KVU1QLAorCQlQQUREUiAoY2xyYWNrKSwKKworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX0VYVEVOREVEID4tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJVGVybWluYXRlIGN5Y2xlCisJKi8KKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGRkFMU0UgKFdIRU4gKFNDUl9NU0dfSU4pKSwKKwkJUEFERFIgKGRpc3BhdGNoKSwKKwkvKgorCSoqCWdldCBsZW5ndGguCisJKi8KKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19JTiwKKwkJTkFERFIgKG1zZ2luWzFdKSwKKwkvKgorCSovCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKDMpKSwKKwkJUEFERFJIIChtc2dfZXh0XzMpLAorCVNDUl9KVU1QIF4gSUZGQUxTRSAoREFUQSAoMikpLAorCQlQQUREUiAobXNnX2JhZCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfRVhUXzIgPi0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX0lOKSksCisJCVBBRERSIChkaXNwYXRjaCksCisJLyoKKwkqKglnZXQgZXh0ZW5kZWQgbWVzc2FnZSBjb2RlLgorCSovCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfSU4sCisJCU5BRERSIChtc2dpblsyXSksCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKE1fWF9XSURFX1JFUSkpLAorCQlQQUREUkggKG1zZ193ZHRyKSwKKwkvKgorCSoqCXVua25vd24gZXh0ZW5kZWQgbWVzc2FnZQorCSovCisJU0NSX0pVTVAsCisJCVBBRERSIChtc2dfYmFkKQorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX1dEVFIgPi0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9KVU1QIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19JTikpLAorCQlQQUREUiAoZGlzcGF0Y2gpLAorCS8qCisJKioJZ2V0IGRhdGEgYnVzIHdpZHRoCisJKi8KKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19JTiwKKwkJTkFERFIgKG1zZ2luWzNdKSwKKwkvKgorCSoqCWxldCB0aGUgaG9zdCBkbyB0aGUgcmVhbCB3b3JrLgorCSovCisJU0NSX0lOVCwKKwkJU0lSX05FR09fV0lERSwKKwkvKgorCSoqCWxldCB0aGUgdGFyZ2V0IGZldGNoIG91ciBhbnN3ZXIuCisJKi8KKwlTQ1JfU0VUIChTQ1JfQVROKSwKKwkJMCwKKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGRkFMU0UgKFdIRU4gKFNDUl9NU0dfT1VUKSksCisJCVBBRERSSCAobmVnb19iYWRfcGhhc2UpLAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTRU5EX1dEVFIgPi0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglTZW5kIHRoZSBNX1hfV0lERV9SRVEKKwkqLworCVNDUl9NT1ZFX0FCUyAoNCkgXiBTQ1JfTVNHX09VVCwKKwkJTkFERFIgKG1zZ291dCksCisJU0NSX0NPUFkgKDEpLAorCQlOQUREUiAobXNnb3V0KSwKKwkJTkFERFIgKGxhc3Rtc2cpLAorCVNDUl9KVU1QLAorCQlQQUREUiAobXNnX291dF9kb25lKSwKKworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX0VYVF8zID4tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9KVU1QIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19JTikpLAorCQlQQUREUiAoZGlzcGF0Y2gpLAorCS8qCisJKioJZ2V0IGV4dGVuZGVkIG1lc3NhZ2UgY29kZS4KKwkqLworCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfTVNHX0lOLAorCQlOQUREUiAobXNnaW5bMl0pLAorCVNDUl9KVU1QIF4gSUZUUlVFIChEQVRBIChNX1hfU1lOQ19SRVEpKSwKKwkJUEFERFJIIChtc2dfc2R0ciksCisJLyoKKwkqKgl1bmtub3duIGV4dGVuZGVkIG1lc3NhZ2UKKwkqLworCVNDUl9KVU1QLAorCQlQQUREUiAobXNnX2JhZCkKKworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX1NEVFIgPi0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9KVU1QIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19JTikpLAorCQlQQUREUiAoZGlzcGF0Y2gpLAorCS8qCisJKioJZ2V0IHBlcmlvZCBhbmQgb2Zmc2V0CisJKi8KKwlTQ1JfTU9WRV9BQlMgKDIpIF4gU0NSX01TR19JTiwKKwkJTkFERFIgKG1zZ2luWzNdKSwKKwkvKgorCSoqCWxldCB0aGUgaG9zdCBkbyB0aGUgcmVhbCB3b3JrLgorCSovCisJU0NSX0lOVCwKKwkJU0lSX05FR09fU1lOQywKKwkvKgorCSoqCWxldCB0aGUgdGFyZ2V0IGZldGNoIG91ciBhbnN3ZXIuCisJKi8KKwlTQ1JfU0VUIChTQ1JfQVROKSwKKwkJMCwKKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGRkFMU0UgKFdIRU4gKFNDUl9NU0dfT1VUKSksCisJCVBBRERSSCAobmVnb19iYWRfcGhhc2UpLAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTRU5EX1NEVFIgPi0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglTZW5kIHRoZSBNX1hfU1lOQ19SRVEKKwkqLworCVNDUl9NT1ZFX0FCUyAoNSkgXiBTQ1JfTVNHX09VVCwKKwkJTkFERFIgKG1zZ291dCksCisJU0NSX0NPUFkgKDEpLAorCQlOQUREUiAobXNnb3V0KSwKKwkJTkFERFIgKGxhc3Rtc2cpLAorCVNDUl9KVU1QLAorCQlQQUREUiAobXNnX291dF9kb25lKSwKKworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTkVHT19CQURfUEhBU0UgPi0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfSU5ULAorCQlTSVJfTkVHT19QUk9UTywKKwlTQ1JfSlVNUCwKKwkJUEFERFIgKGRpc3BhdGNoKSwKKworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX09VVF9BQk9SVCA+LS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCUFmdGVyIEFCT1JUIG1lc3NhZ2UsCisJKioKKwkqKglleHBlY3QgYW4gaW1tZWRpYXRlIGRpc2Nvbm5lY3QsIC4uLgorCSovCisJU0NSX1JFR19SRUcgKHNjbnRsMiwgU0NSX0FORCwgMHg3ZiksCisJCTAsCisJU0NSX0NMUiAoU0NSX0FDS3xTQ1JfQVROKSwKKwkJMCwKKwlTQ1JfV0FJVF9ESVNDLAorCQkwLAorCS8qCisJKioJLi4uIGFuZCBzZXQgdGhlIHN0YXR1cyB0byAiQUJPUlRFRCIKKwkqLworCVNDUl9MT0FEX1JFRyAoSFNfUkVHLCBIU19BQk9SVEVEKSwKKwkJMCwKKwlTQ1JfSlVNUCwKKwkJUEFERFIgKGNsZWFudXApLAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBIREFUQV9JTiA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKy8qCisqKglCZWNhdXNlIHRoZSBzaXplIGRlcGVuZHMgb24gdGhlCisqKgkjZGVmaW5lIE1BWF9TQ0FUVEVSSCBwYXJhbWV0ZXIsCisqKglpdCBpcyBmaWxsZWQgaW4gYXQgcnVudGltZS4KKyoqCisqKiAgIyM9PTwgaT1NQVhfU0NBVFRFUkw7IGk8TUFYX1NDQVRURVJMK01BWF9TQ0FUVEVSSCA+PT0KKyoqICB8fAlTQ1JfQ0FMTCBeIElGRkFMU0UgKFdIRU4gKFNDUl9EQVRBX0lOKSksCisqKiAgfHwJCVBBRERSIChkaXNwYXRjaCksCisqKiAgfHwJU0NSX01PVkVfVEJMIF4gU0NSX0RBVEFfSU4sCisqKiAgfHwJCW9mZnNldG9mIChzdHJ1Y3QgZHNiLCBkYXRhWyBpXSksCisqKiAgIyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKzAKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEhEQVRBX0lOMiA+LS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9KVU1QLAorCQlQQUREUiAoZGF0YV9pbiksCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEhEQVRBX09VVCA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKy8qCisqKglCZWNhdXNlIHRoZSBzaXplIGRlcGVuZHMgb24gdGhlCisqKgkjZGVmaW5lIE1BWF9TQ0FUVEVSSCBwYXJhbWV0ZXIsCisqKglpdCBpcyBmaWxsZWQgaW4gYXQgcnVudGltZS4KKyoqCisqKiAgIyM9PTwgaT1NQVhfU0NBVFRFUkw7IGk8TUFYX1NDQVRURVJMK01BWF9TQ0FUVEVSSCA+PT0KKyoqICB8fAlTQ1JfQ0FMTCBeIElGRkFMU0UgKFdIRU4gKFNDUl9EQVRBX09VVCkpLAorKiogIHx8CQlQQUREUiAoZGlzcGF0Y2gpLAorKiogIHx8CVNDUl9NT1ZFX1RCTCBeIFNDUl9EQVRBX09VVCwKKyoqICB8fAkJb2Zmc2V0b2YgKHN0cnVjdCBkc2IsIGRhdGFbIGldKSwKKyoqICAjIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworMAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgSERBVEFfT1VUMiA+LS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9KVU1QLAorCQlQQUREUiAoZGF0YV9vdXQpLAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqICAgICAgU2VuZCBhIE1fUkVTRVQgbWVzc2FnZSBpZiBiYWQgSURFTlRJRlkgCisJKioJcmVjZWl2ZWQgb24gcmVzZWxlY3Rpb24uCisJKi8KKwlTQ1JfTE9BRF9SRUcgKHNjcmF0Y2hhLCBNX0FCT1JUX1RBRyksCisJCTAsCisJU0NSX0pVTVAsCisJCVBBRERSSCAoYWJvcnRfcmVzZWwpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQUJPUlRUQUcgPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKiAgICAgIEFib3J0IGEgd3JvbmcgdGFnIHJlY2VpdmVkIG9uIHJlc2VsZWN0aW9uLgorCSovCisJU0NSX0xPQURfUkVHIChzY3JhdGNoYSwgTV9BQk9SVF9UQUcpLAorCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUkggKGFib3J0X3Jlc2VsKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEFCT1JUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKiogICAgICBBYm9ydCBhIHJlc2VsZWN0aW9uIHdoZW4gbm8gYWN0aXZlIENDQi4KKwkqLworCVNDUl9MT0FEX1JFRyAoc2NyYXRjaGEsIE1fQUJPUlQpLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQUJPUlRfUkVTRUwgPi0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NPUFkgKDEpLAorCQlSQUREUiAoc2NyYXRjaGEpLAorCQlOQUREUiAobXNnb3V0KSwKKwlTQ1JfU0VUIChTQ1JfQVROKSwKKwkJMCwKKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwkvKgorCSoqCWFuZCBzZW5kIGl0LgorCSoqCXdlIGV4cGVjdCBhbiBpbW1lZGlhdGUgZGlzY29ubmVjdAorCSovCisJU0NSX1JFR19SRUcgKHNjbnRsMiwgU0NSX0FORCwgMHg3ZiksCisJCTAsCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfT1VULAorCQlOQUREUiAobXNnb3V0KSwKKwlTQ1JfQ09QWSAoMSksCisJCU5BRERSIChtc2dvdXQpLAorCQlOQUREUiAobGFzdG1zZyksCisJU0NSX0NMUiAoU0NSX0FDS3xTQ1JfQVROKSwKKwkJMCwKKwlTQ1JfV0FJVF9ESVNDLAorCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUiAoc3RhcnQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTRU5EX0lERU5UID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJVGhlIHRhcmdldCBzdGF5cyBpbiBNU0cgT1VUIHBoYXNlIGFmdGVyIGhhdmluZyBhY2tlZCAKKwkqKglJZGVudGlmeSBbKyBUYWcgWysgRXh0ZW5kZWQgbWVzc2FnZSBdXS4gVGFyZ2V0cyBzaGFsbAorCSoqCWJlaGF2ZSB0aGlzIHdheSBvbiBwYXJpdHkgZXJyb3IuCisJKioJV2UgbXVzdCBzZW5kIGl0IGFnYWluIGFsbCB0aGUgbWVzc2FnZXMuCisJKi8KKwlTQ1JfU0VUIChTQ1JfQVROKSwgLyogU2hhbGwgYmUgYXNzZXJ0ZWQgMiBkZXNrZXcgZGVsYXlzIGJlZm9yZSB0aGUgICovCisJCTAsICAgICAgICAgLyogMXJzdCBBQ0sgPSA5MCBucy4gSG9wZSB0aGUgTkNSIGlzJ250IHRvbyBmYXN0ICovCisJU0NSX0pVTVAsCisJCVBBRERSIChzZW5kX2lkZW50KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IENMUkFUTl9HT19PTiA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfQ0xSIChTQ1JfQVROKSwKKwkJMCwKKwlTQ1JfSlVNUCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE5YVERTUF9HT19PTiA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNEQVRBX0lOID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9DQUxMIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0RBVEFfSU4pKSwKKwkJUEFERFIgKGRpc3BhdGNoKSwKKwlTQ1JfTU9WRV9UQkwgXiBTQ1JfREFUQV9JTiwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBkc2IsIHNlbnNlKSwKKwlTQ1JfQ0FMTCwKKwkJUEFERFIgKGRpc3BhdGNoKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFIgKG5vX2RhdGEpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQV9JTyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglXZSBqdW1wIGhlcmUgaWYgdGhlIGRhdGEgZGlyZWN0aW9uIHdhcyB1bmtub3duIGF0IHRoZSAKKwkqKgl0aW1lIHdlIGhhZCB0byBxdWV1ZSB0aGUgY29tbWFuZCB0byB0aGUgc2NyaXB0cyBwcm9jZXNzb3IuCisJKioJUG9pbnRlcnMgaGFkIGJlZW4gc2V0IGFzIGZvbGxvdyBpbiB0aGlzIHNpdHVhdGlvbjoKKwkqKgkgIHNhdmVwICAgLS0+ICAgREFUQV9JTworCSoqCSAgbGFzdHAgICAtLT4gICBzdGFydCBwb2ludGVyIHdoZW4gREFUQV9JTgorCSoqCSAgZ29hbHAgICAtLT4gICBnb2FsICBwb2ludGVyIHdoZW4gREFUQV9JTgorCSoqCSAgd2xhc3RwICAtLT4gICBzdGFydCBwb2ludGVyIHdoZW4gREFUQV9PVVQKKwkqKgkgIHdnb2FscCAgLS0+ICAgZ29hbCAgcG9pbnRlciB3aGVuIERBVEFfT1VUCisJKioJVGhpcyBzY3JpcHQgc2V0cyBzYXZlcC9sYXN0cC9nb2FscCBhY2NvcmRpbmcgdG8gdGhlIAorCSoqCWRpcmVjdGlvbiBjaG9zZW4gYnkgdGhlIHRhcmdldC4KKwkqLworCVNDUl9KVU1QUiBeIElGVFJVRSAoV0hFTiAoU0NSX0RBVEFfT1VUKSksCisJCTMyLAorCS8qCisJKioJRGlyZWN0aW9uIGlzIERBVEEgSU4uCisJKioJV2FybmluZzogd2UganVtcCBoZXJlLCBldmVuIHdoZW4gcGhhc2UgaXMgREFUQSBPVVQuCisJKi8KKwlTQ1JfQ09QWSAoNCksCisJCU5BRERSIChoZWFkZXIubGFzdHApLAorCQlOQUREUiAoaGVhZGVyLnNhdmVwKSwKKworCS8qCisJKioJSnVtcCB0byB0aGUgU0NSSVBUUyBhY2NvcmRpbmcgdG8gYWN0dWFsIGRpcmVjdGlvbi4KKwkqLworCVNDUl9DT1BZICg0KSwKKwkJTkFERFIgKGhlYWRlci5zYXZlcCksCisJCVJBRERSICh0ZW1wKSwKKwlTQ1JfUkVUVVJOLAorCQkwLAorCS8qCisJKioJRGlyZWN0aW9uIGlzIERBVEEgT1VULgorCSovCisJU0NSX0NPUFkgKDQpLAorCQlOQUREUiAoaGVhZGVyLndsYXN0cCksCisJCU5BRERSIChoZWFkZXIubGFzdHApLAorCVNDUl9DT1BZICg0KSwKKwkJTkFERFIgKGhlYWRlci53Z29hbHApLAorCQlOQUREUiAoaGVhZGVyLmdvYWxwKSwKKwlTQ1JfSlVNUFIsCisJCS02NCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEJBRF9JREVOVElGWSA+LS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJSWYgbWVzc2FnZSBwaGFzZSBidXQgbm90IGFuIElERU5USUZZLAorCSoqCWdldCBzb21lIGhlbHAgZnJvbSB0aGUgQyBjb2RlLgorCSoqCU9sZCBTQ1NJIGRldmljZSBtYXkgYmVoYXZlIHNvLgorCSovCisJU0NSX0pVTVBSIF4gSUZUUlVFIChNQVNLICgweDgwLCAweDgwKSksCisJCTE2LAorCVNDUl9JTlQsCisJCVNJUl9SRVNFTF9OT19JREVOVElGWSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJIIChyZXNldCksCisJLyoKKwkqKglNZXNzYWdlIGlzIGFuIElERU5USUZZLCBidXQgbHVuIGlzIHVua25vd24uCisJKioJUmVhZCB0aGUgbWVzc2FnZSwgc2luY2Ugd2UgZ290IGl0IGRpcmVjdGx5IAorCSoqCWZyb20gdGhlIFNDU0kgQlVTIGRhdGEgbGluZXMuCisJKioJU2lnbmFsIHByb2JsZW0gdG8gQyBjb2RlIGZvciBsb2dnaW5nIHRoZSBldmVudC4KKwkqKglTZW5kIGEgTV9BQk9SVCB0byBjbGVhciBhbGwgcGVuZGluZyB0YXNrcy4KKwkqLworCVNDUl9JTlQsCisJCVNJUl9SRVNFTF9CQURfTFVOLAorCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfTVNHX0lOLAorCQlOQUREUiAobXNnaW4pLAorCVNDUl9KVU1QLAorCQlQQUREUkggKGFib3J0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEJBRF9JX1RfTCA+LS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJV2UgZG9ubm90IGhhdmUgYSB0YXNrIGZvciB0aGF0IElfVF9MLgorCSoqCVNpZ25hbCBwcm9ibGVtIHRvIEMgY29kZSBmb3IgbG9nZ2luZyB0aGUgZXZlbnQuCisJKioJU2VuZCBhIE1fQUJPUlQgbWVzc2FnZS4KKwkqLworCVNDUl9JTlQsCisJCVNJUl9SRVNFTF9CQURfSV9UX0wsCisJU0NSX0pVTVAsCisJCVBBRERSSCAoYWJvcnQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQkFEX0lfVF9MX1EgPi0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglXZSBkb25ub3QgaGF2ZSBhIHRhc2sgdGhhdCBtYXRjaGVzIHRoZSB0YWcuCisJKioJU2lnbmFsIHByb2JsZW0gdG8gQyBjb2RlIGZvciBsb2dnaW5nIHRoZSBldmVudC4KKwkqKglTZW5kIGEgTV9BQk9SVFRBRyBtZXNzYWdlLgorCSovCisJU0NSX0lOVCwKKwkJU0lSX1JFU0VMX0JBRF9JX1RfTF9RLAorCVNDUl9KVU1QLAorCQlQQUREUkggKGFib3J0dGFnKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEJBRF9UQVJHRVQgPi0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJV2UgZG9ubm90IGtub3cgdGhlIHRhcmdldCB0aGF0IHJlc2VsZWN0ZWQgdXMuCisJKioJR3JhYiB0aGUgZmlyc3QgbWVzc2FnZSBpZiBhbnkgKElERU5USUZZKS4KKwkqKglTaWduYWwgcHJvYmxlbSB0byBDIGNvZGUgZm9yIGxvZ2dpbmcgdGhlIGV2ZW50LgorCSoqCU1fUkVTRVQgbWVzc2FnZS4KKwkqLworCVNDUl9JTlQsCisJCVNJUl9SRVNFTF9CQURfVEFSR0VULAorCVNDUl9KVU1QUiBeIElGRkFMU0UgKFdIRU4gKFNDUl9NU0dfSU4pKSwKKwkJOCwKKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19JTiwKKwkJTkFERFIgKG1zZ2luKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJIIChyZXNldCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBCQURfU1RBVFVTID4tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCUlmIGNvbW1hbmQgcmVzdWx0ZWQgaW4gZWl0aGVyIFFVRVVFIEZVTEwsCisJKioJQ0hFQ0sgQ09ORElUSU9OIG9yIENPTU1BTkQgVEVSTUlOQVRFRCwKKwkqKgljYWxsIHRoZSBDIGNvZGUuCisJKi8KKwlTQ1JfSU5UIF4gSUZUUlVFIChEQVRBIChTX1FVRVVFX0ZVTEwpKSwKKwkJU0lSX0JBRF9TVEFUVVMsCisJU0NSX0lOVCBeIElGVFJVRSAoREFUQSAoU19DSEVDS19DT05EKSksCisJCVNJUl9CQURfU1RBVFVTLAorCVNDUl9JTlQgXiBJRlRSVUUgKERBVEEgKFNfVEVSTUlOQVRFRCkpLAorCQlTSVJfQkFEX1NUQVRVUywKKwlTQ1JfUkVUVVJOLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU1RBUlRfUkFNID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJTG9hZCB0aGUgc2NyaXB0IGludG8gb24tY2hpcCBSQU0sIAorCSoqCWFuZCBqdW1wIHRvIHN0YXJ0IHBvaW50LgorCSovCisJU0NSX0NPUFlfRiAoNCksCisJCVJBRERSIChzY3JhdGNoYSksCisJCVBBRERSSCAoc3RhcnRfcmFtMCksCisJLyoKKwkqKglGbHVzaCBzY3JpcHQgcHJlZmV0Y2ggaWYgcmVxdWlyZWQKKwkqLworCVBSRUZFVENIX0ZMVVNICisJU0NSX0NPUFkgKHNpemVvZiAoc3RydWN0IHNjcmlwdCkpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU1RBUlRfUkFNMCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJCTAsCisJCVBBRERSIChzdGFydCksCisJU0NSX0pVTVAsCisJCVBBRERSIChzdGFydCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTVE9fUkVTVEFSVCA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCisJKioJUmVwYWlyIHN0YXJ0IHF1ZXVlIChlLmcuIG5leHQgdGltZSB1c2UgdGhlIG5leHQgc2xvdCkgCisJKioJYW5kIGp1bXAgdG8gc3RhcnQgcG9pbnQuCisJKi8KKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSICh0ZW1wKSwKKwkJUEFERFIgKHN0YXJ0cG9zKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFIgKHN0YXJ0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFdBSVRfRE1BID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJRm9yIEhQIFphbG9uLzUzYzcyMCBzeXN0ZW1zLCB0aGUgWmFsb24gaW50ZXJmYWNlCisJKioJYmV0d2VlbiBDUFUgYW5kIDUzYzcyMCBkb2VzIHByZWZldGNoZXMsIHdoaWNoIGNhdXNlcworCSoqCXByb2JsZW1zIHdpdGggc2VsZiBtb2RpZnlpbmcgc2NyaXB0cy4gIFRoZSBwcm9ibGVtCisJKioJaXMgb3ZlcmNvbWUgYnkgY2FsbGluZyBhIGR1bW15IHN1YnJvdXRpbmUgYWZ0ZXIgZWFjaAorCSoqCW1vZGlmaWNhdGlvbiwgdG8gZm9yY2UgYSByZWZldGNoIG9mIHRoZSBzY3JpcHQgb24KKwkqKglyZXR1cm4gZnJvbSB0aGUgc3Vicm91dGluZS4KKwkqLworCVNDUl9SRVRVUk4sCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTTk9PUFRFU1QgPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglSZWFkIHRoZSB2YXJpYWJsZS4KKwkqLworCVNDUl9DT1BZICg0KSwKKwkJTkFERFIobmNyX2NhY2hlKSwKKwkJUkFERFIgKHNjcmF0Y2hhKSwKKwkvKgorCSoqCVdyaXRlIHRoZSB2YXJpYWJsZS4KKwkqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFIgKHRlbXApLAorCQlOQUREUihuY3JfY2FjaGUpLAorCS8qCisJKioJUmVhZCBiYWNrIHRoZSB2YXJpYWJsZS4KKwkqLworCVNDUl9DT1BZICg0KSwKKwkJTkFERFIobmNyX2NhY2hlKSwKKwkJUkFERFIgKHRlbXApLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU05PT1BFTkQgPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglBbmQgc3RvcC4KKwkqLworCVNDUl9JTlQsCisJCTk5LAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworfTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioKKyoqCUZpbGwgaW4gI2RlZmluZSBkZXBlbmRlbnQgcGFydHMgb2YgdGhlIHNjcmlwdAorKioKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK3ZvaWQgX19pbml0IG5jcl9zY3JpcHRfZmlsbCAoc3RydWN0IHNjcmlwdCAqIHNjciwgc3RydWN0IHNjcmlwdGggKiBzY3JoKQoreworCWludAlpOworCW5jcmNtZAkqcDsKKworCXAgPSBzY3JoLT50cnlsb29wOworCWZvciAoaT0wOyBpPE1BWF9TVEFSVDsgaSsrKSB7CisJCSpwKysgPVNDUl9DQUxMOworCQkqcCsrID1QQUREUiAoaWRsZSk7CisJfQorCisJQlVHX09OKCh1X2xvbmcpcCAhPSAodV9sb25nKSZzY3JoLT50cnlsb29wICsgc2l6ZW9mIChzY3JoLT50cnlsb29wKSk7CisKKyNpZmRlZiBTQ1NJX05DUl9DQ0JfRE9ORV9TVVBQT1JUCisKKwlwID0gc2NyaC0+ZG9uZV9xdWV1ZTsKKwlmb3IgKGkgPSAwOyBpPE1BWF9ET05FOyBpKyspIHsKKwkJKnArKyA9U0NSX0NPUFkgKHNpemVvZihzdHJ1Y3QgY2NiICopKTsKKwkJKnArKyA9TkFERFIgKGhlYWRlci5jcCk7CisJCSpwKysgPU5BRERSIChjY2JfZG9uZVtpXSk7CisJCSpwKysgPVNDUl9DQUxMOworCQkqcCsrID1QQUREUiAoZG9uZV9lbmQpOworCX0KKworCUJVR19PTigodV9sb25nKXAgIT0gKHVfbG9uZykmc2NyaC0+ZG9uZV9xdWV1ZStzaXplb2Yoc2NyaC0+ZG9uZV9xdWV1ZSkpOworCisjZW5kaWYgLyogU0NTSV9OQ1JfQ0NCX0RPTkVfU1VQUE9SVCAqLworCisJcCA9IHNjcmgtPmhkYXRhX2luOworCWZvciAoaT0wOyBpPE1BWF9TQ0FUVEVSSDsgaSsrKSB7CisJCSpwKysgPVNDUl9DQUxMIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0RBVEFfSU4pKTsKKwkJKnArKyA9UEFERFIgKGRpc3BhdGNoKTsKKwkJKnArKyA9U0NSX01PVkVfVEJMIF4gU0NSX0RBVEFfSU47CisJCSpwKysgPW9mZnNldG9mIChzdHJ1Y3QgZHNiLCBkYXRhW2ldKTsKKwl9CisKKwlCVUdfT04oKHVfbG9uZylwICE9ICh1X2xvbmcpJnNjcmgtPmhkYXRhX2luICsgc2l6ZW9mIChzY3JoLT5oZGF0YV9pbikpOworCisJcCA9IHNjci0+ZGF0YV9pbjsKKwlmb3IgKGk9TUFYX1NDQVRURVJIOyBpPE1BWF9TQ0FUVEVSSCtNQVhfU0NBVFRFUkw7IGkrKykgeworCQkqcCsrID1TQ1JfQ0FMTCBeIElGRkFMU0UgKFdIRU4gKFNDUl9EQVRBX0lOKSk7CisJCSpwKysgPVBBRERSIChkaXNwYXRjaCk7CisJCSpwKysgPVNDUl9NT1ZFX1RCTCBeIFNDUl9EQVRBX0lOOworCQkqcCsrID1vZmZzZXRvZiAoc3RydWN0IGRzYiwgZGF0YVtpXSk7CisJfQorCisJQlVHX09OKCh1X2xvbmcpcCAhPSAodV9sb25nKSZzY3ItPmRhdGFfaW4gKyBzaXplb2YgKHNjci0+ZGF0YV9pbikpOworCisJcCA9IHNjcmgtPmhkYXRhX291dDsKKwlmb3IgKGk9MDsgaTxNQVhfU0NBVFRFUkg7IGkrKykgeworCQkqcCsrID1TQ1JfQ0FMTCBeIElGRkFMU0UgKFdIRU4gKFNDUl9EQVRBX09VVCkpOworCQkqcCsrID1QQUREUiAoZGlzcGF0Y2gpOworCQkqcCsrID1TQ1JfTU9WRV9UQkwgXiBTQ1JfREFUQV9PVVQ7CisJCSpwKysgPW9mZnNldG9mIChzdHJ1Y3QgZHNiLCBkYXRhW2ldKTsKKwl9CisKKwlCVUdfT04oKHVfbG9uZylwICE9ICh1X2xvbmcpJnNjcmgtPmhkYXRhX291dCArIHNpemVvZiAoc2NyaC0+aGRhdGFfb3V0KSk7CisKKwlwID0gc2NyLT5kYXRhX291dDsKKwlmb3IgKGk9TUFYX1NDQVRURVJIOyBpPE1BWF9TQ0FUVEVSSCtNQVhfU0NBVFRFUkw7IGkrKykgeworCQkqcCsrID1TQ1JfQ0FMTCBeIElGRkFMU0UgKFdIRU4gKFNDUl9EQVRBX09VVCkpOworCQkqcCsrID1QQUREUiAoZGlzcGF0Y2gpOworCQkqcCsrID1TQ1JfTU9WRV9UQkwgXiBTQ1JfREFUQV9PVVQ7CisJCSpwKysgPW9mZnNldG9mIChzdHJ1Y3QgZHNiLCBkYXRhW2ldKTsKKwl9CisKKwlCVUdfT04oKHVfbG9uZykgcCAhPSAodV9sb25nKSZzY3ItPmRhdGFfb3V0ICsgc2l6ZW9mIChzY3ItPmRhdGFfb3V0KSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCisqKglDb3B5IGFuZCByZWJpbmQgYSBzY3JpcHQuCisqKgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworc3RhdGljIHZvaWQgX19pbml0IAorbmNyX3NjcmlwdF9jb3B5X2FuZF9iaW5kIChzdHJ1Y3QgbmNiICpucCwgbmNyY21kICpzcmMsIG5jcmNtZCAqZHN0LCBpbnQgbGVuKQoreworCW5jcmNtZCAgb3Bjb2RlLCBuZXcsIG9sZCwgdG1wMSwgdG1wMjsKKwluY3JjbWQJKnN0YXJ0LCAqZW5kOworCWludCByZWxvY3M7CisJaW50IG9wY2hhbmdlZCA9IDA7CisKKwlzdGFydCA9IHNyYzsKKwllbmQgPSBzcmMgKyBsZW4vNDsKKworCXdoaWxlIChzcmMgPCBlbmQpIHsKKworCQlvcGNvZGUgPSAqc3JjKys7CisJCSpkc3QrKyA9IGNwdV90b19zY3Iob3Bjb2RlKTsKKworCQkvKgorCQkqKglJZiB3ZSBmb3JnZXQgdG8gY2hhbmdlIHRoZSBsZW5ndGgKKwkJKioJaW4gc3RydWN0IHNjcmlwdCwgYSBmaWVsZCB3aWxsIGJlCisJCSoqCXBhZGRlZCB3aXRoIDAuIFRoaXMgaXMgYW4gaWxsZWdhbAorCQkqKgljb21tYW5kLgorCQkqLworCisJCWlmIChvcGNvZGUgPT0gMCkgeworCQkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IEVSUk9SMCBJTiBTQ1JJUFQgYXQgJWQuXG4iLAorCQkJCW5jcl9uYW1lKG5wKSwgKGludCkgKHNyYy1zdGFydC0xKSk7CisJCQltZGVsYXkoMTAwMCk7CisJCX0KKworCQlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19TQ1JJUFQpCisJCQlwcmludGsgKEtFUk5fREVCVUcgIiVwOiAgPCV4PlxuIiwKKwkJCQkoc3JjLTEpLCAodW5zaWduZWQpb3Bjb2RlKTsKKworCQkvKgorCQkqKglXZSBkb24ndCBoYXZlIHRvIGRlY29kZSBBTEwgY29tbWFuZHMKKwkJKi8KKwkJc3dpdGNoIChvcGNvZGUgPj4gMjgpIHsKKworCQljYXNlIDB4YzoKKwkJCS8qCisJCQkqKglDT1BZIGhhcyBUV08gYXJndW1lbnRzLgorCQkJKi8KKwkJCXJlbG9jcyA9IDI7CisJCQl0bXAxID0gc3JjWzBdOworI2lmZGVmCVJFTE9DX0tWQVIKKwkJCWlmICgodG1wMSAmIFJFTE9DX01BU0spID09IFJFTE9DX0tWQVIpCisJCQkJdG1wMSA9IDA7CisjZW5kaWYKKwkJCXRtcDIgPSBzcmNbMV07CisjaWZkZWYJUkVMT0NfS1ZBUgorCQkJaWYgKCh0bXAyICYgUkVMT0NfTUFTSykgPT0gUkVMT0NfS1ZBUikKKwkJCQl0bXAyID0gMDsKKyNlbmRpZgorCQkJaWYgKCh0bXAxIF4gdG1wMikgJiAzKSB7CisJCQkJcHJpbnRrIChLRVJOX0VSUiIlczogRVJST1IxIElOIFNDUklQVCBhdCAlZC5cbiIsCisJCQkJCW5jcl9uYW1lKG5wKSwgKGludCkgKHNyYy1zdGFydC0xKSk7CisJCQkJbWRlbGF5KDEwMDApOworCQkJfQorCQkJLyoKKwkJCSoqCUlmIFBSRUZFVENIIGZlYXR1cmUgbm90IGVuYWJsZWQsIHJlbW92ZSAKKwkJCSoqCXRoZSBOTyBGTFVTSCBiaXQgaWYgcHJlc2VudC4KKwkJCSovCisJCQlpZiAoKG9wY29kZSAmIFNDUl9OT19GTFVTSCkgJiYgIShucC0+ZmVhdHVyZXMgJiBGRV9QRkVOKSkgeworCQkJCWRzdFstMV0gPSBjcHVfdG9fc2NyKG9wY29kZSAmIH5TQ1JfTk9fRkxVU0gpOworCQkJCSsrb3BjaGFuZ2VkOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAweDA6CisJCQkvKgorCQkJKioJTU9WRSAoYWJzb2x1dGUgYWRkcmVzcykKKwkJCSovCisJCQlyZWxvY3MgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDg6CisJCQkvKgorCQkJKioJSlVNUCAvIENBTEwKKwkJCSoqCWRvbid0IHJlbG9jYXRlIGlmIHJlbGF0aXZlIDotKQorCQkJKi8KKwkJCWlmIChvcGNvZGUgJiAweDAwODAwMDAwKQorCQkJCXJlbG9jcyA9IDA7CisJCQllbHNlCisJCQkJcmVsb2NzID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgMHg0OgorCQljYXNlIDB4NToKKwkJY2FzZSAweDY6CisJCWNhc2UgMHg3OgorCQkJcmVsb2NzID0gMTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZWxvY3MgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmVsb2NzKSB7CisJCQl3aGlsZSAocmVsb2NzLS0pIHsKKwkJCQlvbGQgPSAqc3JjKys7CisKKwkJCQlzd2l0Y2ggKG9sZCAmIFJFTE9DX01BU0spIHsKKwkJCQljYXNlIFJFTE9DX1JFR0lTVEVSOgorCQkJCQluZXcgPSAob2xkICYgflJFTE9DX01BU0spICsgbnAtPnBhZGRyOworCQkJCQlicmVhazsKKwkJCQljYXNlIFJFTE9DX0xBQkVMOgorCQkJCQluZXcgPSAob2xkICYgflJFTE9DX01BU0spICsgbnAtPnBfc2NyaXB0OworCQkJCQlicmVhazsKKwkJCQljYXNlIFJFTE9DX0xBQkVMSDoKKwkJCQkJbmV3ID0gKG9sZCAmIH5SRUxPQ19NQVNLKSArIG5wLT5wX3NjcmlwdGg7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUkVMT0NfU09GVEM6CisJCQkJCW5ldyA9IChvbGQgJiB+UkVMT0NfTUFTSykgKyBucC0+cF9uY2I7CisJCQkJCWJyZWFrOworI2lmZGVmCVJFTE9DX0tWQVIKKwkJCQljYXNlIFJFTE9DX0tWQVI6CisJCQkJCWlmICgoKG9sZCAmIH5SRUxPQ19NQVNLKSA8CisJCQkJCSAgICAgU0NSSVBUX0tWQVJfRklSU1QpIHx8CisJCQkJCSAgICAoKG9sZCAmIH5SRUxPQ19NQVNLKSA+CisJCQkJCSAgICAgU0NSSVBUX0tWQVJfTEFTVCkpCisJCQkJCQlwYW5pYygibmNyIEtWQVIgb3V0IG9mIHJhbmdlIik7CisJCQkJCW5ldyA9IHZ0b3BoeXMoc2NyaXB0X2t2YXJzW29sZCAmCisJCQkJCSAgICB+UkVMT0NfTUFTS10pOworCQkJCQlicmVhazsKKyNlbmRpZgorCQkJCWNhc2UgMDoKKwkJCQkJLyogRG9uJ3QgcmVsb2NhdGUgYSAwIGFkZHJlc3MuICovCisJCQkJCWlmIChvbGQgPT0gMCkgeworCQkJCQkJbmV3ID0gb2xkOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLyogZmFsbCB0aHJvdWdoICovCisJCQkJZGVmYXVsdDoKKwkJCQkJcGFuaWMoIm5jcl9zY3JpcHRfY29weV9hbmRfYmluZDogd2VpcmQgcmVsb2NhdGlvbiAleFxuIiwgb2xkKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJKmRzdCsrID0gY3B1X3RvX3NjcihuZXcpOworCQkJfQorCQl9IGVsc2UKKwkJCSpkc3QrKyA9IGNwdV90b19zY3IoKnNyYysrKTsKKworCX0KK30KKworLyoKKyoqCUxpbnV4IGhvc3QgZGF0YSBzdHJ1Y3R1cmUKKyovCisKK3N0cnVjdCBob3N0X2RhdGEgeworICAgICBzdHJ1Y3QgbmNiICpuY2I7Cit9OworCisjZGVmaW5lIFBSSU5UX0FERFIoY21kLCBhcmcuLi4pIGRldl9pbmZvKCZjbWQtPmRldmljZS0+c2Rldl9nZW5kZXYgLCAjIyBhcmcpCisKK3N0YXRpYyB2b2lkIG5jcl9wcmludF9tc2coc3RydWN0IGNjYiAqY3AsIGNoYXIgKmxhYmVsLCB1X2NoYXIgKm1zZykKK3sKKwlpbnQgaTsKKwlQUklOVF9BRERSKGNwLT5jbWQsICIlczogIiwgbGFiZWwpOworCisJcHJpbnRrICgiJXgiLCptc2cpOworCWlmICgqbXNnID09IE1fRVhURU5ERUQpIHsKKwkJZm9yIChpID0gMTsgaSA8IDg7IGkrKykgeworCQkJaWYgKGkgLSAxID4gbXNnWzFdKQorCQkJCWJyZWFrOworCQkJcHJpbnRrICgiLSV4Iixtc2dbaV0pOworCQl9CisJfSBlbHNlIGlmICgoKm1zZyAmIDB4ZjApID09IDB4MjApIHsKKwkJcHJpbnRrICgiLSV4Iixtc2dbMV0pOworCX0KKworCXByaW50aygiLlxuIik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCU5DUiBjaGlwIGNsb2NrIGRpdmlzb3IgdGFibGUuCisqKglEaXZpc29ycyBhcmUgbXVsdGlwbGllZCBieSAxMCwwMDAsMDAwIGluIG9yZGVyIHRvIG1ha2UgCisqKgljYWxjdWxhdGlvbnMgbW9yZSBzaW1wbGUuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjZGVmaW5lIF81TSA1MDAwMDAwCitzdGF0aWMgdV9sb25nIGRpdl8xME1bXSA9CisJezIqXzVNLCAzKl81TSwgNCpfNU0sIDYqXzVNLCA4Kl81TSwgMTIqXzVNLCAxNipfNU19OworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJUHJlcGFyZSBpbyByZWdpc3RlciB2YWx1ZXMgdXNlZCBieSBuY3JfaW5pdCgpIGFjY29yZGluZyAKKyoqCXRvIHNlbGVjdGVkIGFuZCBzdXBwb3J0ZWQgZmVhdHVyZXMuCisqKgorKioJTkNSIGNoaXBzIGFsbG93IGJ1cnN0IGxlbmd0aHMgb2YgMiwgNCwgOCwgMTYsIDMyLCA2NCwgMTI4IAorKioJdHJhbnNmZXJzLiAzMiw2NCwxMjggYXJlIG9ubHkgc3VwcG9ydGVkIGJ5IDg3NSBhbmQgODk1IGNoaXBzLgorKioJV2UgdXNlIGxvZyBiYXNlIDIgKGJ1cnN0IGxlbmd0aCkgYXMgaW50ZXJuYWwgY29kZSwgd2l0aCAKKyoqCXZhbHVlIDAgbWVhbmluZyAiYnVyc3QgZGlzYWJsZWQiLgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKgorICoJQnVyc3QgbGVuZ3RoIGZyb20gYnVyc3QgY29kZS4KKyAqLworI2RlZmluZSBidXJzdF9sZW5ndGgoYmMpICghKGJjKSk/IDAgOiAxIDw8IChiYykKKworLyoKKyAqCUJ1cnN0IGNvZGUgZnJvbSBpbyByZWdpc3RlciBiaXRzLiAgQnVyc3QgZW5hYmxlIGlzIGN0ZXN0MCBmb3IgYzcyMAorICovCisjZGVmaW5lIGJ1cnN0X2NvZGUoZG1vZGUsIGN0ZXN0MCkgXAorCShjdGVzdDApICYgMHg4MCA/IDAgOiAoKChkbW9kZSkgJiAweGMwKSA+PiA2KSArIDEKKworLyoKKyAqCVNldCBpbml0aWFsIGlvIHJlZ2lzdGVyIGJpdHMgZnJvbSBidXJzdCBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbmNyX2luaXRfYnVyc3Qoc3RydWN0IG5jYiAqbnAsIHVfY2hhciBiYykKK3sKKwl1X2NoYXIgKmJlID0gJm5wLT5ydl9jdGVzdDA7CisJKmJlCQkmPSB+MHg4MDsKKwlucC0+cnZfZG1vZGUJJj0gfigweDMgPDwgNik7CisJbnAtPnJ2X2N0ZXN0NQkmPSB+MHg0OworCisJaWYgKCFiYykgeworCQkqYmUJCXw9IDB4ODA7CisJfSBlbHNlIHsKKwkJLS1iYzsKKwkJbnAtPnJ2X2Rtb2RlCXw9ICgoYmMgJiAweDMpIDw8IDYpOworCQlucC0+cnZfY3Rlc3Q1CXw9IChiYyAmIDB4NCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbmNyX3ByZXBhcmVfc2V0dGluZyhzdHJ1Y3QgbmNiICpucCkKK3sKKwl1X2NoYXIJYnVyc3RfbWF4OworCXVfbG9uZwlwZXJpb2Q7CisJaW50IGk7CisKKwkvKgorCSoqCVNhdmUgYXNzdW1lZCBCSU9TIHNldHRpbmcKKwkqLworCisJbnAtPnN2X3NjbnRsMAk9IElOQihuY19zY250bDApICYgMHgwYTsKKwlucC0+c3Zfc2NudGwzCT0gSU5CKG5jX3NjbnRsMykgJiAweDA3OworCW5wLT5zdl9kbW9kZQk9IElOQihuY19kbW9kZSkgICYgMHhjZTsKKwlucC0+c3ZfZGNudGwJPSBJTkIobmNfZGNudGwpICAmIDB4YTg7CisJbnAtPnN2X2N0ZXN0MAk9IElOQihuY19jdGVzdDApICYgMHg4NDsKKwlucC0+c3ZfY3Rlc3QzCT0gSU5CKG5jX2N0ZXN0MykgJiAweDAxOworCW5wLT5zdl9jdGVzdDQJPSBJTkIobmNfY3Rlc3Q0KSAmIDB4ODA7CisJbnAtPnN2X2N0ZXN0NQk9IElOQihuY19jdGVzdDUpICYgMHgyNDsKKwlucC0+c3ZfZ3BjbnRsCT0gSU5CKG5jX2dwY250bCk7CisJbnAtPnN2X3N0ZXN0Mgk9IElOQihuY19zdGVzdDIpICYgMHgyMDsKKwlucC0+c3Zfc3Rlc3Q0CT0gSU5CKG5jX3N0ZXN0NCk7CisKKwkvKgorCSoqCVdpZGUgPworCSovCisKKwlucC0+bWF4d2lkZQk9IChucC0+ZmVhdHVyZXMgJiBGRV9XSURFKT8gMSA6IDA7CisKKyAJLyoKKwkgKiAgR3Vlc3MgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY2hpcCdzIGNsb2NrLgorCSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9VTFRSQSkKKwkJbnAtPmNsb2NrX2toeiA9IDgwMDAwOworCWVsc2UKKwkJbnAtPmNsb2NrX2toeiA9IDQwMDAwOworCisJLyoKKwkgKiAgR2V0IHRoZSBjbG9jayBtdWx0aXBsaWVyIGZhY3Rvci4KKyAJICovCisJaWYJKG5wLT5mZWF0dXJlcyAmIEZFX1FVQUQpCisJCW5wLT5tdWx0aXBsaWVyCT0gNDsKKwllbHNlIGlmCShucC0+ZmVhdHVyZXMgJiBGRV9EQkxSKQorCQlucC0+bXVsdGlwbGllcgk9IDI7CisJZWxzZQorCQlucC0+bXVsdGlwbGllcgk9IDE7CisKKwkvKgorCSAqICBNZWFzdXJlIFNDU0kgY2xvY2sgZnJlcXVlbmN5IGZvciBjaGlwcyAKKwkgKiAgaXQgbWF5IHZhcnkgZnJvbSBhc3N1bWVkIG9uZS4KKwkgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfVkFSQ0xLKQorCQluY3JfZ2V0Y2xvY2sobnAsIG5wLT5tdWx0aXBsaWVyKTsKKworCS8qCisJICogRGl2aXNvciB0byBiZSB1c2VkIGZvciBhc3luYyAodGltZXIgcHJlLXNjYWxlcikuCisJICovCisJaSA9IG5wLT5jbG9ja19kaXZuIC0gMTsKKwl3aGlsZSAoLS1pID49IDApIHsKKwkJaWYgKDEwdWwgKiBTQ1NJX05DUl9NSU5fQVNZTkMgKiBucC0+Y2xvY2tfa2h6ID4gZGl2XzEwTVtpXSkgeworCQkJKytpOworCQkJYnJlYWs7CisJCX0KKwl9CisJbnAtPnJ2X3NjbnRsMyA9IGkrMTsKKworCS8qCisJICogTWluaW11bSBzeW5jaHJvbm91cyBwZXJpb2QgZmFjdG9yIHN1cHBvcnRlZCBieSB0aGUgY2hpcC4KKwkgKiBCdHcsICdwZXJpb2QnIGlzIGluIHRlbnRocyBvZiBuYW5vc2Vjb25kcy4KKwkgKi8KKworCXBlcmlvZCA9ICg0ICogZGl2XzEwTVswXSArIG5wLT5jbG9ja19raHogLSAxKSAvIG5wLT5jbG9ja19raHo7CisJaWYJKHBlcmlvZCA8PSAyNTApCQlucC0+bWluc3luYyA9IDEwOworCWVsc2UgaWYJKHBlcmlvZCA8PSAzMDMpCQlucC0+bWluc3luYyA9IDExOworCWVsc2UgaWYJKHBlcmlvZCA8PSA1MDApCQlucC0+bWluc3luYyA9IDEyOworCWVsc2UJCQkJbnAtPm1pbnN5bmMgPSAocGVyaW9kICsgNDAgLSAxKSAvIDQwOworCisJLyoKKwkgKiBDaGVjayBhZ2FpbnN0IGNoaXAgU0NTSSBzdGFuZGFyZCBzdXBwb3J0IChTQ1NJLTIsVUxUUkEsVUxUUkEyKS4KKwkgKi8KKworCWlmCShucC0+bWluc3luYyA8IDI1ICYmICEobnAtPmZlYXR1cmVzICYgRkVfVUxUUkEpKQorCQlucC0+bWluc3luYyA9IDI1OworCisJLyoKKwkgKiBNYXhpbXVtIHN5bmNocm9ub3VzIHBlcmlvZCBmYWN0b3Igc3VwcG9ydGVkIGJ5IHRoZSBjaGlwLgorCSAqLworCisJcGVyaW9kID0gKDExICogZGl2XzEwTVtucC0+Y2xvY2tfZGl2biAtIDFdKSAvICg0ICogbnAtPmNsb2NrX2toeik7CisJbnAtPm1heHN5bmMgPSBwZXJpb2QgPiAyNTQwID8gMjU0IDogcGVyaW9kIC8gMTA7CisKKwkvKgorCSoqCVByZXBhcmUgaW5pdGlhbCB2YWx1ZSBvZiBvdGhlciBJTyByZWdpc3RlcnMKKwkqLworI2lmIGRlZmluZWQgU0NTSV9OQ1JfVFJVU1RfQklPU19TRVRUSU5HCisJbnAtPnJ2X3NjbnRsMAk9IG5wLT5zdl9zY250bDA7CisJbnAtPnJ2X2Rtb2RlCT0gbnAtPnN2X2Rtb2RlOworCW5wLT5ydl9kY250bAk9IG5wLT5zdl9kY250bDsKKwlucC0+cnZfY3Rlc3QwCT0gbnAtPnN2X2N0ZXN0MDsKKwlucC0+cnZfY3Rlc3QzCT0gbnAtPnN2X2N0ZXN0MzsKKwlucC0+cnZfY3Rlc3Q0CT0gbnAtPnN2X2N0ZXN0NDsKKwlucC0+cnZfY3Rlc3Q1CT0gbnAtPnN2X2N0ZXN0NTsKKwlidXJzdF9tYXgJPSBidXJzdF9jb2RlKG5wLT5zdl9kbW9kZSwgbnAtPnN2X2N0ZXN0MCk7CisjZWxzZQorCisJLyoKKwkqKglTZWxlY3QgYnVyc3QgbGVuZ3RoIChkd29yZHMpCisJKi8KKwlidXJzdF9tYXgJPSBkcml2ZXJfc2V0dXAuYnVyc3RfbWF4OworCWlmIChidXJzdF9tYXggPT0gMjU1KQorCQlidXJzdF9tYXggPSBidXJzdF9jb2RlKG5wLT5zdl9kbW9kZSwgbnAtPnN2X2N0ZXN0MCk7CisJaWYgKGJ1cnN0X21heCA+IDcpCisJCWJ1cnN0X21heCA9IDc7CisJaWYgKGJ1cnN0X21heCA+IG5wLT5tYXhidXJzdCkKKwkJYnVyc3RfbWF4ID0gbnAtPm1heGJ1cnN0OworCisJLyoKKwkqKglTZWxlY3QgYWxsIHN1cHBvcnRlZCBzcGVjaWFsIGZlYXR1cmVzCisJKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfRVJMKQorCQlucC0+cnZfZG1vZGUJfD0gRVJMOwkJLyogRW5hYmxlIFJlYWQgTGluZSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9CT0YpCisJCW5wLT5ydl9kbW9kZQl8PSBCT0Y7CQkvKiBCdXJzdCBPcGNvZGUgRmV0Y2ggKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfRVJNUCkKKwkJbnAtPnJ2X2Rtb2RlCXw9IEVSTVA7CS8qIEVuYWJsZSBSZWFkIE11bHRpcGxlICovCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX1BGRU4pCisJCW5wLT5ydl9kY250bAl8PSBQRkVOOwkvKiBQcmVmZXRjaCBFbmFibGUgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfQ0xTRSkKKwkJbnAtPnJ2X2RjbnRsCXw9IENMU0U7CS8qIENhY2hlIExpbmUgU2l6ZSBFbmFibGUgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfV1JJRSkKKwkJbnAtPnJ2X2N0ZXN0Mwl8PSBXUklFOwkvKiBXcml0ZSBhbmQgSW52YWxpZGF0ZSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9ERlMpCisJCW5wLT5ydl9jdGVzdDUJfD0gREZTOwkJLyogRG1hIEZpZm8gU2l6ZSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9NVVgpCisJCW5wLT5ydl9jdGVzdDQJfD0gTVVYOwkJLyogSG9zdCBidXMgbXVsdGlwbGV4IG1vZGUgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfRUEpCisJCW5wLT5ydl9kY250bAl8PSBFQTsJCS8qIEVuYWJsZSBBQ0sgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfRUhQKQorCQlucC0+cnZfY3Rlc3QwCXw9IEVIUDsJCS8qIEV2ZW4gaG9zdCBwYXJpdHkgKi8KKworCS8qCisJKioJU2VsZWN0IHNvbWUgb3RoZXIKKwkqLworCWlmIChkcml2ZXJfc2V0dXAubWFzdGVyX3Bhcml0eSkKKwkJbnAtPnJ2X2N0ZXN0NAl8PSBNUEVFOwkvKiBNYXN0ZXIgcGFyaXR5IGNoZWNraW5nICovCisJaWYgKGRyaXZlcl9zZXR1cC5zY3NpX3Bhcml0eSkKKwkJbnAtPnJ2X3NjbnRsMAl8PSAweDBhOwkvKiAgZnVsbCBhcmIuLCBlbmEgcGFyaXR5LCBwYXItPkFUTiAgKi8KKworCS8qCisJKiogIEdldCBTQ1NJIGFkZHIgb2YgaG9zdCBhZGFwdGVyIChzZXQgYnkgYmlvcz8pLgorCSovCisJaWYgKG5wLT5teWFkZHIgPT0gMjU1KSB7CisJCW5wLT5teWFkZHIgPSBJTkIobmNfc2NpZCkgJiAweDA3OworCQlpZiAoIW5wLT5teWFkZHIpCisJCQlucC0+bXlhZGRyID0gU0NTSV9OQ1JfTVlBRERSOworCX0KKworI2VuZGlmIC8qIFNDU0lfTkNSX1RSVVNUX0JJT1NfU0VUVElORyAqLworCisJLyoKKwkgKglQcmVwYXJlIGluaXRpYWwgaW8gcmVnaXN0ZXIgYml0cyBmb3IgYnVyc3QgbGVuZ3RoCisJICovCisJbmNyX2luaXRfYnVyc3QobnAsIGJ1cnN0X21heCk7CisKKwkvKgorCSoqCVNldCBTQ1NJIEJVUyBtb2RlLgorCSoqCisJKioJLSBVTFRSQTIgY2hpcHMgKDg5NS84OTVBLzg5NikgcmVwb3J0IHRoZSBjdXJyZW50IAorCSoqCSAgQlVTIG1vZGUgdGhyb3VnaCB0aGUgU1RFU1Q0IElPIHJlZ2lzdGVyLgorCSoqCS0gRm9yIHByZXZpb3VzIGdlbmVyYXRpb24gY2hpcHMgKDgyNS84MjVBLzg3NSksIAorCSoqCSAgdXNlciBoYXMgdG8gdGVsbCB1cyBob3cgdG8gY2hlY2sgYWdhaW5zdCBIVkQsIAorCSoqCSAgc2luY2UgYSAxMDAlIHNhZmUgYWxnb3JpdGhtIGlzIG5vdCBwb3NzaWJsZS4KKwkqLworCW5wLT5zY3NpX21vZGUgPSBTTU9ERV9TRTsKKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfRElGRikgeworCQlzd2l0Y2goZHJpdmVyX3NldHVwLmRpZmZfc3VwcG9ydCkgeworCQljYXNlIDQ6CS8qIFRydXN0IHByZXZpb3VzIHNldHRpbmdzIGlmIHByZXNlbnQsIHRoZW4gR1BJTzMgKi8KKwkJCWlmIChucC0+c3Zfc2NudGwzKSB7CisJCQkJaWYgKG5wLT5zdl9zdGVzdDIgJiAweDIwKQorCQkJCQlucC0+c2NzaV9tb2RlID0gU01PREVfSFZEOworCQkJCWJyZWFrOworCQkJfQorCQljYXNlIDM6CS8qIFNZTUJJT1MgY29udHJvbGxlcnMgcmVwb3J0IEhWRCB0aHJvdWdoIEdQSU8zICovCisJCQlpZiAoSU5CKG5jX2dwcmVnKSAmIDB4MDgpCisJCQkJYnJlYWs7CisJCWNhc2UgMjoJLyogU2V0IEhWRCB1bmNvbmRpdGlvbmFsbHkgKi8KKwkJCW5wLT5zY3NpX21vZGUgPSBTTU9ERV9IVkQ7CisJCWNhc2UgMToJLyogVHJ1c3QgcHJldmlvdXMgc2V0dGluZ3MgZm9yIEhWRCAqLworCQkJaWYgKG5wLT5zdl9zdGVzdDIgJiAweDIwKQorCQkJCW5wLT5zY3NpX21vZGUgPSBTTU9ERV9IVkQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDovKiBEb24ndCBjYXJlIGFib3V0IEhWRCAqLwkKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChucC0+c2NzaV9tb2RlID09IFNNT0RFX0hWRCkKKwkJbnAtPnJ2X3N0ZXN0MiB8PSAweDIwOworCisJLyoKKwkqKglTZXQgTEVEIHN1cHBvcnQgZnJvbSBTQ1JJUFRTLgorCSoqCUlnbm9yZSB0aGlzIGZlYXR1cmUgZm9yIGJvYXJkcyBrbm93biB0byB1c2UgYSAKKwkqKglzcGVjaWZpYyBHUElPIHdpcmluZyBhbmQgZm9yIHRoZSA4OTVBIG9yIDg5NiAKKwkqKgl0aGF0IGRyaXZlIHRoZSBMRUQgZGlyZWN0bHkuCisJKioJQWxzbyBwcm9iZSBpbml0aWFsIHNldHRpbmcgb2YgR1BJTzAgYXMgb3V0cHV0LgorCSovCisJaWYgKChkcml2ZXJfc2V0dXAubGVkX3BpbikgJiYKKwkgICAgIShucC0+ZmVhdHVyZXMgJiBGRV9MRURDKSAmJiAhKG5wLT5zdl9ncGNudGwgJiAweDAxKSkKKwkJbnAtPmZlYXR1cmVzIHw9IEZFX0xFRDA7CisKKwkvKgorCSoqCVNldCBpcnEgbW9kZS4KKwkqLworCXN3aXRjaChkcml2ZXJfc2V0dXAuaXJxbSAmIDMpIHsKKwljYXNlIDI6CisJCW5wLT5ydl9kY250bAl8PSBJUlFNOworCQlicmVhazsKKwljYXNlIDE6CisJCW5wLT5ydl9kY250bAl8PSAobnAtPnN2X2RjbnRsICYgSVJRTSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qCisJKioJQ29uZmlndXJlIHRhcmdldHMgYWNjb3JkaW5nIHRvIGRyaXZlciBzZXR1cC4KKwkqKglBbGxvdyB0byBvdmVycmlkZSBzeW5jLCB3aWRlIGFuZCBOT1NDQU4gZnJvbSAKKwkqKglib290IGNvbW1hbmQgbGluZS4KKwkqLworCWZvciAoaSA9IDAgOyBpIDwgTUFYX1RBUkdFVCA7IGkrKykgeworCQlzdHJ1Y3QgdGNiICp0cCA9ICZucC0+dGFyZ2V0W2ldOworCisJCXRwLT51c3JzeW5jID0gZHJpdmVyX3NldHVwLmRlZmF1bHRfc3luYzsKKwkJdHAtPnVzcndpZGUgPSBkcml2ZXJfc2V0dXAubWF4X3dpZGU7CisJCXRwLT51c3J0YWdzID0gTUFYX1RBR1M7CisJCXRwLT5wZXJpb2QgPSAweGZmZmY7CisJCWlmICghZHJpdmVyX3NldHVwLmRpc2Nvbm5lY3Rpb24pCisJCQlucC0+dGFyZ2V0W2ldLnVzcmZsYWcgPSBVRl9OT0RJU0M7CisJfQorCisJLyoKKwkqKglBbm5vdW5jZSBhbGwgdGhhdCBzdHVmZiB0byB1c2VyLgorCSovCisKKwlwcmludGsoS0VSTl9JTkZPICIlczogSUQgJWQsIEZhc3QtJWQlcyVzXG4iLCBuY3JfbmFtZShucCksCisJCW5wLT5teWFkZHIsCisJCW5wLT5taW5zeW5jIDwgMTIgPyA0MCA6IChucC0+bWluc3luYyA8IDI1ID8gMjAgOiAxMCksCisJCShucC0+cnZfc2NudGwwICYgMHhhKQk/ICIsIFBhcml0eSBDaGVja2luZyIJOiAiLCBOTyBQYXJpdHkiLAorCQkobnAtPnJ2X3N0ZXN0MiAmIDB4MjApCT8gIiwgRGlmZmVyZW50aWFsIgk6ICIiKTsKKworCWlmIChib290dmVyYm9zZSA+IDEpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBpbml0aWFsIFNDTlRMMy9ETU9ERS9EQ05UTC9DVEVTVDMvNC81ID0gIgorCQkJIihoZXgpICUwMngvJTAyeC8lMDJ4LyUwMngvJTAyeC8lMDJ4XG4iLAorCQkJbmNyX25hbWUobnApLCBucC0+c3Zfc2NudGwzLCBucC0+c3ZfZG1vZGUsIG5wLT5zdl9kY250bCwKKwkJCW5wLT5zdl9jdGVzdDMsIG5wLT5zdl9jdGVzdDQsIG5wLT5zdl9jdGVzdDUpOworCisJCXByaW50ayAoS0VSTl9JTkZPICIlczogZmluYWwgICBTQ05UTDMvRE1PREUvRENOVEwvQ1RFU1QzLzQvNSA9ICIKKwkJCSIoaGV4KSAlMDJ4LyUwMngvJTAyeC8lMDJ4LyUwMngvJTAyeFxuIiwKKwkJCW5jcl9uYW1lKG5wKSwgbnAtPnJ2X3NjbnRsMywgbnAtPnJ2X2Rtb2RlLCBucC0+cnZfZGNudGwsCisJCQlucC0+cnZfY3Rlc3QzLCBucC0+cnZfY3Rlc3Q0LCBucC0+cnZfY3Rlc3Q1KTsKKwl9CisKKwlpZiAoYm9vdHZlcmJvc2UgJiYgbnAtPnBhZGRyMikKKwkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBvbi1jaGlwIFJBTSBhdCAweCVseFxuIiwKKwkJCW5jcl9uYW1lKG5wKSwgbnAtPnBhZGRyMik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCisqKglEb25lIFNDU0kgY29tbWFuZHMgbGlzdCBtYW5hZ2VtZW50LgorKioKKyoqCVdlIGRvbm5vdCBlbnRlciB0aGUgc2NzaV9kb25lKCkgY2FsbGJhY2sgaW1tZWRpYXRlbHkgCisqKglhZnRlciBhIGNvbW1hbmQgaGFzIGJlZW4gc2VlbiBhcyBjb21wbGV0ZWQgYnV0IHdlIAorKioJaW5zZXJ0IGl0IGludG8gYSBsaXN0IHdoaWNoIGlzIGZsdXNoZWQgb3V0c2lkZSBhbnkga2luZCAKKyoqCW9mIGRyaXZlciBjcml0aWNhbCBzZWN0aW9uLgorKioJVGhpcyBhbGxvd3MgdG8gZG8gbWluaW1hbCBzdHVmZiB1bmRlciBpbnRlcnJ1cHQgYW5kIAorKioJaW5zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIGFuZCB0byBhbHNvIGF2b2lkIGxvY2tpbmcgdXAgCisqKglvbiByZWN1cnNpdmUgY2FsbHMgdG8gZHJpdmVyIGVudHJ5IHBvaW50cyB1bmRlciBTTVAuCisqKglJbiBmYWN0LCB0aGUgb25seSBrZXJuZWwgcG9pbnQgd2hpY2ggaXMgZW50ZXJlZCBieSB0aGUgCisqKglkcml2ZXIgd2l0aCBhIGRyaXZlciBsb2NrIHNldCBpcyBrbWFsbG9jKEdGUF9BVE9NSUMpIAorKioJdGhhdCBzaGFsbCBub3QgcmVlbnRlciB0aGUgZHJpdmVyIHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLAorKioJQUZBSUsuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGlubGluZSB2b2lkIG5jcl9xdWV1ZV9kb25lX2NtZChzdHJ1Y3QgbmNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXVubWFwX3Njc2lfZGF0YShucCwgY21kKTsKKwljbWQtPmhvc3Rfc2NyaWJibGUgPSAoY2hhciAqKSBucC0+ZG9uZV9saXN0OworCW5wLT5kb25lX2xpc3QgPSBjbWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuY3JfZmx1c2hfZG9uZV9jbWRzKHN0cnVjdCBzY3NpX2NtbmQgKmxjbWQpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCisJd2hpbGUgKGxjbWQpIHsKKwkJY21kID0gbGNtZDsKKwkJbGNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNtZC0+aG9zdF9zY3JpYmJsZTsKKwkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwl9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCisqKglQcmVwYXJlIHRoZSBuZXh0IG5lZ290aWF0aW9uIG1lc3NhZ2UgaWYgbmVlZGVkLgorKioKKyoqCUZpbGwgaW4gdGhlIHBhcnQgb2YgbWVzc2FnZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgCisqKgluZWdvdGlhdGlvbiBhbmQgdGhlIG5lZ29fc3RhdHVzIGZpZWxkIG9mIHRoZSBDQ0IuCisqKglSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlIGluIGJ5dGVzLgorKioKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKworc3RhdGljIGludCBuY3JfcHJlcGFyZV9uZWdvKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3QgY2NiICpjcCwgdV9jaGFyICptc2dwdHIpCit7CisJc3RydWN0IHRjYiAqdHAgPSAmbnAtPnRhcmdldFtjcC0+dGFyZ2V0XTsKKwlpbnQgbXNnbGVuID0gMDsKKwlpbnQgbmVnbyA9IDA7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gdHAtPnN0YXJnZXQ7CisKKwkvKiBuZWdvdGlhdGUgd2lkZSB0cmFuc2ZlcnMgPyAgKi8KKwlpZiAoIXRwLT53aWRlZG9uZSkgeworCQlpZiAoc3BpX3N1cHBvcnRfd2lkZShzdGFyZ2V0KSkgeworCQkJbmVnbyA9IE5TX1dJREU7CisJCX0gZWxzZQorCQkJdHAtPndpZGVkb25lPTE7CisJfQorCisJLyogbmVnb3RpYXRlIHN5bmNocm9ub3VzIHRyYW5zZmVycz8gICovCisJaWYgKCFuZWdvICYmICF0cC0+cGVyaW9kKSB7CisJCWlmIChzcGlfc3VwcG9ydF9zeW5jKHN0YXJnZXQpKSB7CisJCQluZWdvID0gTlNfU1lOQzsKKwkJfSBlbHNlIHsKKwkJCXRwLT5wZXJpb2QgID0weGZmZmY7CisJCQlkZXZfaW5mbygmc3RhcmdldC0+ZGV2LCAidGFyZ2V0IGRpZCBub3QgcmVwb3J0IFNZTkMuXG4iKTsKKwkJfQorCX0KKworCXN3aXRjaCAobmVnbykgeworCWNhc2UgTlNfU1lOQzoKKwkJbXNncHRyW21zZ2xlbisrXSA9IE1fRVhURU5ERUQ7CisJCW1zZ3B0clttc2dsZW4rK10gPSAzOworCQltc2dwdHJbbXNnbGVuKytdID0gTV9YX1NZTkNfUkVROworCQltc2dwdHJbbXNnbGVuKytdID0gdHAtPm1heG9mZnMgPyB0cC0+bWluc3luYyA6IDA7CisJCW1zZ3B0clttc2dsZW4rK10gPSB0cC0+bWF4b2ZmczsKKwkJYnJlYWs7CisJY2FzZSBOU19XSURFOgorCQltc2dwdHJbbXNnbGVuKytdID0gTV9FWFRFTkRFRDsKKwkJbXNncHRyW21zZ2xlbisrXSA9IDI7CisJCW1zZ3B0clttc2dsZW4rK10gPSBNX1hfV0lERV9SRVE7CisJCW1zZ3B0clttc2dsZW4rK10gPSB0cC0+dXNyd2lkZTsKKwkJYnJlYWs7CisJfQorCisJY3AtPm5lZ29fc3RhdHVzID0gbmVnbzsKKworCWlmIChuZWdvKSB7CisJCXRwLT5uZWdvX2NwID0gY3A7CisJCWlmIChERUJVR19GTEFHUyAmIERFQlVHX05FR08pIHsKKwkJCW5jcl9wcmludF9tc2coY3AsIG5lZ28gPT0gTlNfV0lERSA/CisJCQkJCSAgIndpZGUgbXNnb3V0Ijoic3luY19tc2dvdXQiLCBtc2dwdHIpOworCQl9CisJfQorCisJcmV0dXJuIG1zZ2xlbjsKK30KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCisqKglTdGFydCBleGVjdXRpb24gb2YgYSBTQ1NJIGNvbW1hbmQuCisqKglUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBnZW5lcmljIFNDU0kgZHJpdmVyLgorKioKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IG5jcl9xdWV1ZV9jb21tYW5kIChzdHJ1Y3QgbmNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IGNtZC0+ZGV2aWNlOworCXN0cnVjdCB0Y2IgKnRwID0gJm5wLT50YXJnZXRbc2Rldi0+aWRdOworCXN0cnVjdCBsY2IgKmxwID0gdHAtPmxwW3NkZXYtPmx1bl07CisJc3RydWN0IGNjYiAqY3A7CisKKwlpbnQJc2VnbWVudHM7CisJdV9jaGFyCWlkbXNnLCAqbXNncHRyOworCXUzMgltc2dsZW47CisJaW50CWRpcmVjdGlvbjsKKwl1MzIJbGFzdHAsIGdvYWxwOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKgorCSoqICAgICAgU29tZSBzaG9ydGN1dHMgLi4uCisJKioKKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJaWYgKChzZGV2LT5pZCA9PSBucC0+bXlhZGRyCSAgKSB8fAorCQkoc2Rldi0+aWQgPj0gTUFYX1RBUkdFVCkgfHwKKwkJKHNkZXYtPmx1biAgICA+PSBNQVhfTFVOICAgKSkgeworCQlyZXR1cm4oRElEX0JBRF9UQVJHRVQpOworCX0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioKKwkqKglDb21wbGV0ZSB0aGUgMXN0IFRFU1QgVU5JVCBSRUFEWSBjb21tYW5kCisJKioJd2l0aCBlcnJvciBjb25kaXRpb24gaWYgdGhlIGRldmljZSBpcyAKKwkqKglmbGFnZ2VkIE5PU0NBTiwgaW4gb3JkZXIgdG8gc3BlZWQgdXAgCisJKioJdGhlIGJvb3QuCisJKioKKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJaWYgKChjbWQtPmNtbmRbMF0gPT0gMCB8fCBjbWQtPmNtbmRbMF0gPT0gMHgxMikgJiYgCisJICAgICh0cC0+dXNyZmxhZyAmIFVGX05PU0NBTikpIHsKKwkJdHAtPnVzcmZsYWcgJj0gflVGX05PU0NBTjsKKwkJcmV0dXJuIERJRF9CQURfVEFSR0VUOworCX0KKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1RJTlkpIHsKKwkJUFJJTlRfQUREUihjbWQsICJDTUQ9JXggIiwgY21kLT5jbW5kWzBdKTsKKwl9CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCisJKioJQXNzaWduIGEgY2NiIC8gYmluZCBjbWQuCisJKioJSWYgcmVzZXR0aW5nLCBzaG9ydGVuIHNldHRsZV90aW1lIGlmIG5lY2Vzc2FyeQorCSoqCWluIG9yZGVyIHRvIGF2b2lkIHNwdXJpb3VzIHRpbWVvdXRzLgorCSoqCUlmIHJlc2V0dGluZyBvciBubyBmcmVlIGNjYiwKKwkqKglpbnNlcnQgY21kIGludG8gdGhlIHdhaXRpbmcgbGlzdC4KKwkqKgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJaWYgKG5wLT5zZXR0bGVfdGltZSAmJiBjbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQgPj0gSFopIHsKKwkJdV9sb25nIHRsaW1pdCA9IGt0aW1lX2dldChjbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQgLSBIWik7CisJCWlmIChrdGltZV9kaWYobnAtPnNldHRsZV90aW1lLCB0bGltaXQpID4gMCkKKwkJCW5wLT5zZXR0bGVfdGltZSA9IHRsaW1pdDsKKwl9CisKKwlpZiAobnAtPnNldHRsZV90aW1lIHx8ICEoY3A9bmNyX2dldF9jY2IgKG5wLCBjbWQpKSkgeworCQlpbnNlcnRfaW50b193YWl0aW5nX2xpc3QobnAsIGNtZCk7CisJCXJldHVybihESURfT0spOworCX0KKwljcC0+Y21kID0gY21kOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioKKwkqKglCdWlsZCB0aGUgaWRlbnRpZnkgLyB0YWcgLyBzZHRyIG1lc3NhZ2UKKwkqKgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisKKwlpZG1zZyA9IE1fSURFTlRJRlkgfCBzZGV2LT5sdW47CisKKwlpZiAoY3AgLT50YWcgIT0gTk9fVEFHIHx8CisJCShjcCAhPSBucC0+Y2NiICYmIG5wLT5kaXNjICYmICEodHAtPnVzcmZsYWcgJiBVRl9OT0RJU0MpKSkKKwkJaWRtc2cgfD0gMHg0MDsKKworCW1zZ3B0ciA9IGNwLT5zY3NpX3Ntc2c7CisJbXNnbGVuID0gMDsKKwltc2dwdHJbbXNnbGVuKytdID0gaWRtc2c7CisKKwlpZiAoY3AtPnRhZyAhPSBOT19UQUcpIHsKKwkJY2hhciBvcmRlciA9IG5wLT5vcmRlcjsKKworCQkvKgorCQkqKglGb3JjZSBvcmRlcmVkIHRhZyBpZiBuZWNlc3NhcnkgdG8gYXZvaWQgdGltZW91dHMgCisJCSoqCWFuZCB0byBwcmVzZXJ2ZSBpbnRlcmFjdGl2aXR5LgorCQkqLworCQlpZiAobHAgJiYga3RpbWVfZXhwKGxwLT50YWdzX3N0aW1lKSkgeworCQkJaWYgKGxwLT50YWdzX3NtYXApIHsKKwkJCQlvcmRlciA9IE1fT1JERVJFRF9UQUc7CisJCQkJaWYgKChERUJVR19GTEFHUyAmIERFQlVHX1RBR1MpfHxib290dmVyYm9zZT4yKXsgCisJCQkJCVBSSU5UX0FERFIoY21kLAorCQkJCQkJIm9yZGVyZWQgdGFnIGZvcmNlZC5cbiIpOworCQkJCX0KKwkJCX0KKwkJCWxwLT50YWdzX3N0aW1lID0ga3RpbWVfZ2V0KDMqSFopOworCQkJbHAtPnRhZ3Nfc21hcCA9IGxwLT50YWdzX3VtYXA7CisJCX0KKworCQlpZiAob3JkZXIgPT0gMCkgeworCQkJLyoKKwkJCSoqCU9yZGVyZWQgd3JpdGUgb3BzLCB1bm9yZGVyZWQgcmVhZCBvcHMuCisJCQkqLworCQkJc3dpdGNoIChjbWQtPmNtbmRbMF0pIHsKKwkJCWNhc2UgMHgwODogIC8qIFJFQURfU01BTEwgKDYpICovCisJCQljYXNlIDB4Mjg6ICAvKiBSRUFEX0JJRyAgKDEwKSAqLworCQkJY2FzZSAweGE4OiAgLyogUkVBRF9IVUdFICgxMikgKi8KKwkJCQlvcmRlciA9IE1fU0lNUExFX1RBRzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJb3JkZXIgPSBNX09SREVSRURfVEFHOworCQkJfQorCQl9CisJCW1zZ3B0clttc2dsZW4rK10gPSBvcmRlcjsKKwkJLyoKKwkJKioJQWN0dWFsIHRhZ3MgYXJlIG51bWJlcmVkIDEsMyw1LC4uMipNQVhUQUdTKzEsCisJCSoqCXNpbmNlIHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBkZXZpY2VzIHRoYXQgaGF2ZSAKKwkJKioJcHJvYmxlbXMgd2l0aCAjVEFHIDAgb3IgdG9vIGdyZWF0ICNUQUcgbnVtYmVycy4KKwkJKi8KKwkJbXNncHRyW21zZ2xlbisrXSA9IChjcC0+dGFnIDw8IDEpICsgMTsKKwl9CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKgorCSoqCUJ1aWxkIHRoZSBkYXRhIGRlc2NyaXB0b3JzCisJKioKKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCisJZGlyZWN0aW9uID0gY21kLT5zY19kYXRhX2RpcmVjdGlvbjsKKwlpZiAoZGlyZWN0aW9uICE9IERNQV9OT05FKSB7CisJCXNlZ21lbnRzID0gbmNyX3NjYXR0ZXIobnAsIGNwLCBjcC0+Y21kKTsKKwkJaWYgKHNlZ21lbnRzIDwgMCkgeworCQkJbmNyX2ZyZWVfY2NiKG5wLCBjcCk7CisJCQlyZXR1cm4oRElEX0VSUk9SKTsKKwkJfQorCX0KKwllbHNlIHsKKwkJY3AtPmRhdGFfbGVuID0gMDsKKwkJc2VnbWVudHMgPSAwOworCX0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioKKwkqKgluZWdvdGlhdGlvbiByZXF1aXJlZD8KKwkqKgorCSoqCShuZWdvX3N0YXR1cyBpcyBmaWxsZWQgYnkgbmNyX3ByZXBhcmVfbmVnbygpKQorCSoqCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCisJY3AtPm5lZ29fc3RhdHVzID0gMDsKKworCWlmICgoIXRwLT53aWRlZG9uZSB8fCAhdHAtPnBlcmlvZCkgJiYgIXRwLT5uZWdvX2NwICYmIGxwKSB7CisJCW1zZ2xlbiArPSBuY3JfcHJlcGFyZV9uZWdvIChucCwgY3AsIG1zZ3B0ciArIG1zZ2xlbik7CisJfQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioKKwkqKglEZXRlcm1pbmUgeGZlciBkaXJlY3Rpb24uCisJKioKKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCWlmICghY3AtPmRhdGFfbGVuKQorCQlkaXJlY3Rpb24gPSBETUFfTk9ORTsKKworCS8qCisJKioJSWYgZGF0YSBkaXJlY3Rpb24gaXMgQklESVJFQ1RJT05BTCwgc3BlY3VsYXRlIEZST01fREVWSUNFCisJKioJYnV0IHByZXBhcmUgYWx0ZXJuYXRlIHBvaW50ZXJzIGZvciBUT19ERVZJQ0UgaW4gY2FzZSAKKwkqKglvZiBvdXIgc3BlY3VsYXRpb24gd2lsbCBiZSBqdXN0IHdyb25nLgorCSoqCVNDUklQVFMgd2lsbCBzd2FwIHZhbHVlcyBpZiBuZWVkZWQuCisJKi8KKwlzd2l0Y2goZGlyZWN0aW9uKSB7CisJY2FzZSBETUFfQklESVJFQ1RJT05BTDoKKwljYXNlIERNQV9UT19ERVZJQ0U6CisJCWdvYWxwID0gTkNCX1NDUklQVF9QSFlTIChucCwgZGF0YV9vdXQyKSArIDg7CisJCWlmIChzZWdtZW50cyA8PSBNQVhfU0NBVFRFUkwpCisJCQlsYXN0cCA9IGdvYWxwIC0gOCAtIChzZWdtZW50cyAqIDE2KTsKKwkJZWxzZSB7CisJCQlsYXN0cCA9IE5DQl9TQ1JJUFRIX1BIWVMgKG5wLCBoZGF0YV9vdXQyKTsKKwkJCWxhc3RwIC09IChzZWdtZW50cyAtIE1BWF9TQ0FUVEVSTCkgKiAxNjsKKwkJfQorCQlpZiAoZGlyZWN0aW9uICE9IERNQV9CSURJUkVDVElPTkFMKQorCQkJYnJlYWs7CisJCWNwLT5waHlzLmhlYWRlci53Z29hbHAJPSBjcHVfdG9fc2NyKGdvYWxwKTsKKwkJY3AtPnBoeXMuaGVhZGVyLndsYXN0cAk9IGNwdV90b19zY3IobGFzdHApOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIERNQV9GUk9NX0RFVklDRToKKwkJZ29hbHAgPSBOQ0JfU0NSSVBUX1BIWVMgKG5wLCBkYXRhX2luMikgKyA4OworCQlpZiAoc2VnbWVudHMgPD0gTUFYX1NDQVRURVJMKQorCQkJbGFzdHAgPSBnb2FscCAtIDggLSAoc2VnbWVudHMgKiAxNik7CisJCWVsc2UgeworCQkJbGFzdHAgPSBOQ0JfU0NSSVBUSF9QSFlTIChucCwgaGRhdGFfaW4yKTsKKwkJCWxhc3RwIC09IChzZWdtZW50cyAtIE1BWF9TQ0FUVEVSTCkgKiAxNjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgRE1BX05PTkU6CisJCWxhc3RwID0gZ29hbHAgPSBOQ0JfU0NSSVBUX1BIWVMgKG5wLCBub19kYXRhKTsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkqKglTZXQgYWxsIHBvaW50ZXJzIHZhbHVlcyBuZWVkZWQgYnkgU0NSSVBUUy4KKwkqKglJZiBkaXJlY3Rpb24gaXMgdW5rbm93biwgc3RhcnQgYXQgZGF0YV9pby4KKwkqLworCWNwLT5waHlzLmhlYWRlci5sYXN0cCA9IGNwdV90b19zY3IobGFzdHApOworCWNwLT5waHlzLmhlYWRlci5nb2FscCA9IGNwdV90b19zY3IoZ29hbHApOworCisJaWYgKGRpcmVjdGlvbiA9PSBETUFfQklESVJFQ1RJT05BTCkKKwkJY3AtPnBoeXMuaGVhZGVyLnNhdmVwID0gCisJCQljcHVfdG9fc2NyKE5DQl9TQ1JJUFRIX1BIWVMgKG5wLCBkYXRhX2lvKSk7CisJZWxzZQorCQljcC0+cGh5cy5oZWFkZXIuc2F2ZXA9IGNwdV90b19zY3IobGFzdHApOworCisJLyoKKwkqKglTYXZlIHRoZSBpbml0aWFsIGRhdGEgcG9pbnRlciBpbiBvcmRlciB0byBiZSBhYmxlIAorCSoqCXRvIHJlZG8gdGhlIGNvbW1hbmQuCisJKi8KKwljcC0+c3RhcnRwID0gY3AtPnBoeXMuaGVhZGVyLnNhdmVwOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioKKwkqKglmaWxsIGluIGNjYgorCSoqCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioKKwkqKgorCSoqCXBoeXNpY2FsIC0+IHZpcnR1YWwgYmFja2xpbmsKKwkqKglHZW5lcmljIFNDU0kgY29tbWFuZAorCSovCisKKwkvKgorCSoqCVN0YXJ0cXVldWUKKwkqLworCWNwLT5zdGFydC5zY2hlZHVsZS5sX3BhZGRyICAgPSBjcHVfdG9fc2NyKE5DQl9TQ1JJUFRfUEhZUyAobnAsIHNlbGVjdCkpOworCWNwLT5yZXN0YXJ0LnNjaGVkdWxlLmxfcGFkZHIgPSBjcHVfdG9fc2NyKE5DQl9TQ1JJUFRfUEhZUyAobnAsIHJlc2VsX2RzYSkpOworCS8qCisJKioJc2VsZWN0CisJKi8KKwljcC0+cGh5cy5zZWxlY3Quc2VsX2lkCQk9IHNkZXYtPmlkOworCWNwLT5waHlzLnNlbGVjdC5zZWxfc2NudGwzCT0gdHAtPnd2YWw7CisJY3AtPnBoeXMuc2VsZWN0LnNlbF9zeGZlcgk9IHRwLT5zdmFsOworCS8qCisJKioJbWVzc2FnZQorCSovCisJY3AtPnBoeXMuc21zZy5hZGRyCQk9IGNwdV90b19zY3IoQ0NCX1BIWVMgKGNwLCBzY3NpX3Ntc2cpKTsKKwljcC0+cGh5cy5zbXNnLnNpemUJCT0gY3B1X3RvX3Njcihtc2dsZW4pOworCisJLyoKKwkqKgljb21tYW5kCisJKi8KKwltZW1jcHkoY3AtPmNkYl9idWYsIGNtZC0+Y21uZCwgbWluX3QoaW50LCBjbWQtPmNtZF9sZW4sIHNpemVvZihjcC0+Y2RiX2J1ZikpKTsKKwljcC0+cGh5cy5jbWQuYWRkcgkJPSBjcHVfdG9fc2NyKENDQl9QSFlTIChjcCwgY2RiX2J1ZlswXSkpOworCWNwLT5waHlzLmNtZC5zaXplCQk9IGNwdV90b19zY3IoY21kLT5jbWRfbGVuKTsKKworCS8qCisJKioJc3RhdHVzCisJKi8KKwljcC0+YWN0dWFscXVpcmtzCQk9IDA7CisJY3AtPmhvc3Rfc3RhdHVzCQkJPSBjcC0+bmVnb19zdGF0dXMgPyBIU19ORUdPVElBVEUgOiBIU19CVVNZOworCWNwLT5zY3NpX3N0YXR1cwkJCT0gU19JTExFR0FMOworCWNwLT5wYXJpdHlfc3RhdHVzCQk9IDA7CisKKwljcC0+eGVycl9zdGF0dXMJCQk9IFhFX09LOworI2lmIDAKKwljcC0+c3luY19zdGF0dXMJCQk9IHRwLT5zdmFsOworCWNwLT53aWRlX3N0YXR1cwkJCT0gdHAtPnd2YWw7CisjZW5kaWYKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCisJKioJQ3JpdGljYWwgcmVnaW9uOiBzdGFydCB0aGlzIGpvYi4KKwkqKgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisKKwkvKiBhY3RpdmF0ZSB0aGlzIGpvYi4gICovCisJY3AtPm1hZ2ljCQk9IENDQl9NQUdJQzsKKworCS8qCisJKioJaW5zZXJ0IG5leHQgQ0NCcyBpbnRvIHN0YXJ0IHF1ZXVlLgorCSoqCTIgbWF4IGF0IGEgdGltZSBpcyBlbm91Z2ggdG8gZmx1c2ggdGhlIENDQiB3YWl0IHF1ZXVlLgorCSovCisJY3AtPmF1dG9fc2Vuc2UgPSAwOworCWlmIChscCkKKwkJbmNyX3N0YXJ0X25leHRfY2NiKG5wLCBscCwgMik7CisJZWxzZQorCQluY3JfcHV0X3N0YXJ0X3F1ZXVlKG5wLCBjcCk7CisKKwkvKiBDb21tYW5kIGlzIHN1Y2Nlc3NmdWxseSBxdWV1ZWQuICAqLworCisJcmV0dXJuIERJRF9PSzsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgorKioJSW5zZXJ0IGEgQ0NCIGludG8gdGhlIHN0YXJ0IHF1ZXVlIGFuZCB3YWtlIHVwIHRoZSAKKyoqCVNDUklQVFMgcHJvY2Vzc29yLgorKioKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK3N0YXRpYyB2b2lkIG5jcl9zdGFydF9uZXh0X2NjYihzdHJ1Y3QgbmNiICpucCwgc3RydWN0IGxjYiAqbHAsIGludCBtYXhuKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnFwOworCXN0cnVjdCBjY2IgKmNwOworCisJaWYgKGxwLT5oZWxkX2NjYikKKwkJcmV0dXJuOworCisJd2hpbGUgKG1heG4tLSAmJiBscC0+cXVldWVkY2NicyA8IGxwLT5xdWV1ZWRlcHRoKSB7CisJCXFwID0gbmNyX2xpc3RfcG9wKCZscC0+d2FpdF9jY2JxKTsKKwkJaWYgKCFxcCkKKwkJCWJyZWFrOworCQkrK2xwLT5xdWV1ZWRjY2JzOworCQljcCA9IGxpc3RfZW50cnkocXAsIHN0cnVjdCBjY2IsIGxpbmtfY2NicSk7CisJCWxpc3RfYWRkX3RhaWwocXAsICZscC0+YnVzeV9jY2JxKTsKKwkJbHAtPmp1bXBfY2NiW2NwLT50YWcgPT0gTk9fVEFHID8gMCA6IGNwLT50YWddID0KKwkJCWNwdV90b19zY3IoQ0NCX1BIWVMgKGNwLCByZXN0YXJ0KSk7CisJCW5jcl9wdXRfc3RhcnRfcXVldWUobnAsIGNwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5jcl9wdXRfc3RhcnRfcXVldWUoc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBjY2IgKmNwKQoreworCXUxNglxaWR4OworCisJLyoKKwkqKglpbnNlcnQgaW50byBzdGFydCBxdWV1ZS4KKwkqLworCWlmICghbnAtPnNxdWV1ZXB1dCkgbnAtPnNxdWV1ZXB1dCA9IDE7CisJcWlkeCA9IG5wLT5zcXVldWVwdXQgKyAyOworCWlmIChxaWR4ID49IE1BWF9TVEFSVCArIE1BWF9TVEFSVCkgcWlkeCA9IDE7CisKKwlucC0+c2NyaXB0aC0+dHJ5bG9vcCBbcWlkeF0gPSBjcHVfdG9fc2NyKE5DQl9TQ1JJUFRfUEhZUyAobnAsIGlkbGUpKTsKKwlNRU1PUllfQkFSUklFUigpOworCW5wLT5zY3JpcHRoLT50cnlsb29wIFtucC0+c3F1ZXVlcHV0XSA9IGNwdV90b19zY3IoQ0NCX1BIWVMgKGNwLCBzdGFydCkpOworCisJbnAtPnNxdWV1ZXB1dCA9IHFpZHg7CisJKytucC0+cXVldWVkY2NiczsKKwljcC0+cXVldWVkID0gMTsKKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1FVRVVFKQorCQlwcmludGsgKCIlczogcXVldWVwb3M9JWQuXG4iLCBuY3JfbmFtZSAobnApLCBucC0+c3F1ZXVlcHV0KTsKKworCS8qCisJKioJU2NyaXB0IHByb2Nlc3NvciBtYXkgYmUgd2FpdGluZyBmb3IgcmVzZWxlY3QuCisJKioJV2FrZSBpdCB1cC4KKwkqLworCU1FTU9SWV9CQVJSSUVSKCk7CisJT1VUQiAobmNfaXN0YXQsIFNJR1ApOworfQorCisKK3N0YXRpYyBpbnQgbmNyX3Jlc2V0X3Njc2lfYnVzKHN0cnVjdCBuY2IgKm5wLCBpbnQgZW5hYl9pbnQsIGludCBzZXR0bGVfZGVsYXkpCit7CisJdTMyIHRlcm07CisJaW50IHJldHYgPSAwOworCisJbnAtPnNldHRsZV90aW1lCT0ga3RpbWVfZ2V0KHNldHRsZV9kZWxheSAqIEhaKTsKKworCWlmIChib290dmVyYm9zZSA+IDEpCisJCXByaW50aygiJXM6IHJlc2V0dGluZywgIgorCQkJImNvbW1hbmQgcHJvY2Vzc2luZyBzdXNwZW5kZWQgZm9yICVkIHNlY29uZHNcbiIsCisJCQluY3JfbmFtZShucCksIHNldHRsZV9kZWxheSk7CisKKwluY3JfY2hpcF9yZXNldChucCwgMTAwKTsKKwl1ZGVsYXkoMjAwMCk7CS8qIFRoZSA4OTUgbmVlZHMgdGltZSBmb3IgdGhlIGJ1cyBtb2RlIHRvIHNldHRsZSAqLworCWlmIChlbmFiX2ludCkKKwkJT1VUVyAobmNfc2llbiwgUlNUKTsKKwkvKgorCSoqCUVuYWJsZSBUb2xlcmFudCwgcmVzZXQgSVJRRCBpZiBwcmVzZW50IGFuZCAKKwkqKglwcm9wZXJseSBzZXQgSVJRIG1vZGUsIHByaW9yIHRvIHJlc2V0dGluZyB0aGUgYnVzLgorCSovCisJT1VUQiAobmNfc3Rlc3QzLCBURSk7CisJT1VUQiAobmNfc2NudGwxLCBDUlNUKTsKKwl1ZGVsYXkoMjAwKTsKKworCWlmICghZHJpdmVyX3NldHVwLmJ1c19jaGVjaykKKwkJZ290byBvdXQ7CisJLyoKKwkqKglDaGVjayBmb3Igbm8gdGVybWluYXRvcnMgb3IgU0NTSSBidXMgc2hvcnRzIHRvIGdyb3VuZC4KKwkqKglSZWFkIFNDU0kgZGF0YSBidXMsIGRhdGEgcGFyaXR5IGJpdHMgYW5kIGNvbnRyb2wgc2lnbmFscy4KKwkqKglXZSBhcmUgZXhwZWN0aW5nIFJFU0VUIHRvIGJlIFRSVUUgYW5kIG90aGVyIHNpZ25hbHMgdG8gYmUgCisJKioJRkFMU0UuCisJKi8KKworCXRlcm0gPQlJTkIobmNfc3N0YXQwKTsKKwl0ZXJtID0JKCh0ZXJtICYgMikgPDwgNykgKyAoKHRlcm0gJiAxKSA8PCAxNyk7CS8qIHJzdCBzZHAwICovCisJdGVybSB8PSAoKElOQihuY19zc3RhdDIpICYgMHgwMSkgPDwgMjYpIHwJLyogc2RwMSAgICAgKi8KKwkJKChJTlcobmNfc2JkbCkgJiAweGZmKSAgIDw8IDkpICB8CS8qIGQ3LTAgICAgICovCisJCSgoSU5XKG5jX3NiZGwpICYgMHhmZjAwKSA8PCAxMCkgfAkvKiBkMTUtOCAgICAqLworCQlJTkIobmNfc2JjbCk7CS8qIHJlcSBhY2sgYnN5IHNlbCBhdG4gbXNnIGNkIGlvICAgICovCisKKwlpZiAoIShucC0+ZmVhdHVyZXMgJiBGRV9XSURFKSkKKwkJdGVybSAmPSAweDNmZmZmOworCisJaWYgKHRlcm0gIT0gKDI8PDcpKSB7CisJCXByaW50aygiJXM6IHN1c3BpY2lvdXMgU0NTSSBkYXRhIHdoaWxlIHJlc2V0dGluZyB0aGUgQlVTLlxuIiwKKwkJCW5jcl9uYW1lKG5wKSk7CisJCXByaW50aygiJXM6ICVzZHAwLGQ3LTAscnN0LHJlcSxhY2ssYnN5LHNlbCxhdG4sbXNnLGMvZCxpL28gPSAiCisJCQkiMHglbHgsIGV4cGVjdGluZyAweCVseFxuIiwKKwkJCW5jcl9uYW1lKG5wKSwKKwkJCShucC0+ZmVhdHVyZXMgJiBGRV9XSURFKSA/ICJkcDEsZDE1LTgsIiA6ICIiLAorCQkJKHVfbG9uZyl0ZXJtLCAodV9sb25nKSgyPDw3KSk7CisJCWlmIChkcml2ZXJfc2V0dXAuYnVzX2NoZWNrID09IDEpCisJCQlyZXR2ID0gMTsKKwl9CitvdXQ6CisJT1VUQiAobmNfc2NudGwxLCAwKTsKKwlyZXR1cm4gcmV0djsKK30KKworLyoKKyAqIFN0YXJ0IHJlc2V0IHByb2Nlc3MuCisgKiBJZiByZXNldCBpbiBwcm9ncmVzcyBkbyBub3RoaW5nLgorICogVGhlIGludGVycnVwdCBoYW5kbGVyIHdpbGwgcmVpbml0aWFsaXplIHRoZSBjaGlwLgorICogVGhlIHRpbWVvdXQgaGFuZGxlciB3aWxsIHdhaXQgZm9yIHNldHRsZV90aW1lIGJlZm9yZSAKKyAqIGNsZWFyaW5nIGl0IGFuZCBzbyByZXN1bWluZyBjb21tYW5kIHByb2Nlc3NpbmcuCisgKi8KK3N0YXRpYyB2b2lkIG5jcl9zdGFydF9yZXNldChzdHJ1Y3QgbmNiICpucCkKK3sKKwlpZiAoIW5wLT5zZXR0bGVfdGltZSkgeworCQluY3JfcmVzZXRfc2NzaV9idXMobnAsIDEsIGRyaXZlcl9zZXR1cC5zZXR0bGVfZGVsYXkpOworIAl9Cit9CisgCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgorKioJUmVzZXQgdGhlIFNDU0kgQlVTLgorKioJVGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgZ2VuZXJpYyBTQ1NJIGRyaXZlci4KKyoqCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGludCBuY3JfcmVzZXRfYnVzIChzdHJ1Y3QgbmNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY21kLCBpbnQgc3luY19yZXNldCkKK3sKKy8qCXN0cnVjdCBzY3NpX2RldmljZSAgICAgICAgKmRldmljZSAgICA9IGNtZC0+ZGV2aWNlOyAqLworCXN0cnVjdCBjY2IgKmNwOworCWludCBmb3VuZDsKKworLyoKKyAqIFJldHVybiBpbW1lZGlhdGVseSBpZiByZXNldCBpcyBpbiBwcm9ncmVzcy4KKyAqLworCWlmIChucC0+c2V0dGxlX3RpbWUpIHsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisvKgorICogU3RhcnQgdGhlIHJlc2V0IHByb2Nlc3MuCisgKiBUaGUgc2NyaXB0IHByb2Nlc3NvciBpcyB0aGVuIGFzc3VtZWQgdG8gYmUgc3RvcHBlZC4KKyAqIENvbW1hbmRzIHdpbGwgbm93IGJlIHF1ZXVlZCBpbiB0aGUgd2FpdGluZyBsaXN0IHVudGlsIGEgc2V0dGxlIAorICogZGVsYXkgb2YgMiBzZWNvbmRzIHdpbGwgYmUgY29tcGxldGVkLgorICovCisJbmNyX3N0YXJ0X3Jlc2V0KG5wKTsKKy8qCisgKiBGaXJzdCwgbG9vayBpbiB0aGUgd2FrZXVwIGxpc3QKKyAqLworCWZvciAoZm91bmQ9MCwgY3A9bnAtPmNjYjsgY3A7IGNwPWNwLT5saW5rX2NjYikgeworCQkvKgorCQkqKglsb29rIGZvciB0aGUgY2NiIG9mIHRoaXMgY29tbWFuZC4KKwkJKi8KKwkJaWYgKGNwLT5ob3N0X3N0YXR1cyA9PSBIU19JRExFKSBjb250aW51ZTsKKwkJaWYgKGNwLT5jbWQgPT0gY21kKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKy8qCisgKiBUaGVuLCBsb29rIGluIHRoZSB3YWl0aW5nIGxpc3QKKyAqLworCWlmICghZm91bmQgJiYgcmV0cmlldmVfZnJvbV93YWl0aW5nX2xpc3QoMCwgbnAsIGNtZCkpCisJCWZvdW5kID0gMTsKKy8qCisgKiBXYWtlLXVwIGFsbCBhd2FpdGluZyBjb21tYW5kcyB3aXRoIERJRF9SRVNFVC4KKyAqLworCXJlc2V0X3dhaXRpbmdfbGlzdChucCk7CisvKgorICogV2FrZS11cCBhbGwgcGVuZGluZyBjb21tYW5kcyB3aXRoIEhTX1JFU0VUIC0+IERJRF9SRVNFVC4KKyAqLworCW5jcl93YWtldXAobnAsIEhTX1JFU0VUKTsKKy8qCisgKiBJZiB0aGUgaW52b2x2ZWQgY29tbWFuZCB3YXMgbm90IGluIGEgZHJpdmVyIHF1ZXVlLCBhbmQgdGhlIAorICogc2NzaSBkcml2ZXIgdG9sZCB1cyByZXNldCBpcyBzeW5jaHJvbm91cywgYW5kIHRoZSBjb21tYW5kIGlzIG5vdCAKKyAqIGN1cnJlbnRseSBpbiB0aGUgd2FpdGluZyBsaXN0LCBjb21wbGV0ZSBpdCB3aXRoIERJRF9SRVNFVCBzdGF0dXMsCisgKiBpbiBvcmRlciB0byBrZWVwIGl0IGFsaXZlLgorICovCisJaWYgKCFmb3VuZCAmJiBzeW5jX3Jlc2V0ICYmICFyZXRyaWV2ZV9mcm9tX3dhaXRpbmdfbGlzdCgwLCBucCwgY21kKSkgeworCQljbWQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoRElEX1JFU0VULCAwKTsKKwkJbmNyX3F1ZXVlX2RvbmVfY21kKG5wLCBjbWQpOworCX0KKworCXJldHVybiBTVUNDRVNTOworfQorCisjaWYgMCAvKiB1bnVzZWQgYW5kIGJyb2tlbi4uICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgorKioJQWJvcnQgYW4gU0NTSSBjb21tYW5kLgorKioJVGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgZ2VuZXJpYyBTQ1NJIGRyaXZlci4KKyoqCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGludCBuY3JfYWJvcnRfY29tbWFuZCAoc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKy8qCXN0cnVjdCBzY3NpX2RldmljZSAgICAgICAgKmRldmljZSAgICA9IGNtZC0+ZGV2aWNlOyAqLworCXN0cnVjdCBjY2IgKmNwOworCWludCBmb3VuZDsKKwlpbnQgcmV0djsKKworLyoKKyAqIEZpcnN0LCBsb29rIGZvciB0aGUgc2NzaSBjb21tYW5kIGluIHRoZSB3YWl0aW5nIGxpc3QKKyAqLworCWlmIChyZW1vdmVfZnJvbV93YWl0aW5nX2xpc3QobnAsIGNtZCkpIHsKKwkJY21kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KERJRF9BQk9SVCwgMCk7CisJCW5jcl9xdWV1ZV9kb25lX2NtZChucCwgY21kKTsKKwkJcmV0dXJuIFNDU0lfQUJPUlRfU1VDQ0VTUzsKKwl9CisKKy8qCisgKiBUaGVuLCBsb29rIGluIHRoZSB3YWtldXAgbGlzdAorICovCisJZm9yIChmb3VuZD0wLCBjcD1ucC0+Y2NiOyBjcDsgY3A9Y3AtPmxpbmtfY2NiKSB7CisJCS8qCisJCSoqCWxvb2sgZm9yIHRoZSBjY2Igb2YgdGhpcyBjb21tYW5kLgorCQkqLworCQlpZiAoY3AtPmhvc3Rfc3RhdHVzID09IEhTX0lETEUpIGNvbnRpbnVlOworCQlpZiAoY3AtPmNtZCA9PSBjbWQpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFmb3VuZCkgeworCQlyZXR1cm4gU0NTSV9BQk9SVF9OT1RfUlVOTklORzsKKwl9CisKKwlpZiAobnAtPnNldHRsZV90aW1lKSB7CisJCXJldHVybiBTQ1NJX0FCT1JUX1NOT09aRTsKKwl9CisKKwkvKgorCSoqCUlmIHRoZSBDQ0IgaXMgYWN0aXZlLCBwYXRjaCBzY2hlZHVsZSBqdW1wcyBmb3IgdGhlIAorCSoqCXNjcmlwdCB0byBhYm9ydCB0aGUgY29tbWFuZC4KKwkqLworCisJc3dpdGNoKGNwLT5ob3N0X3N0YXR1cykgeworCWNhc2UgSFNfQlVTWToKKwljYXNlIEhTX05FR09USUFURToKKwkJcHJpbnRrICgiJXM6IGFib3J0IGNjYj0lcCAoY2FuY2VsKVxuIiwgbmNyX25hbWUgKG5wKSwgY3ApOworCQkJY3AtPnN0YXJ0LnNjaGVkdWxlLmxfcGFkZHIgPQorCQkJCWNwdV90b19zY3IoTkNCX1NDUklQVEhfUEhZUyAobnAsIGNhbmNlbCkpOworCQlyZXR2ID0gU0NTSV9BQk9SVF9QRU5ESU5HOworCQlicmVhazsKKwljYXNlIEhTX0RJU0NPTk5FQ1Q6CisJCWNwLT5yZXN0YXJ0LnNjaGVkdWxlLmxfcGFkZHIgPQorCQkJCWNwdV90b19zY3IoTkNCX1NDUklQVEhfUEhZUyAobnAsIGFib3J0KSk7CisJCXJldHYgPSBTQ1NJX0FCT1JUX1BFTkRJTkc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHYgPSBTQ1NJX0FCT1JUX05PVF9SVU5OSU5HOworCQlicmVhazsKKworCX0KKworCS8qCisJKiogICAgICBJZiB0aGVyZSBhcmUgbm8gcmVxdWVzdHMsIHRoZSBzY3JpcHQKKwkqKiAgICAgIHByb2Nlc3NvciB3aWxsIHNsZWVwIG9uIFNFTF9XQUlUX1JFU0VMLgorCSoqICAgICAgTGV0J3Mgd2FrZSBpdCB1cCwgc2luY2UgaXQgbWF5IGhhdmUgdG8gd29yay4KKwkqLworCU9VVEIgKG5jX2lzdGF0LCBTSUdQKTsKKworCXJldHVybiByZXR2OworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIG5jcl9kZXRhY2goc3RydWN0IG5jYiAqbnApCit7CisJc3RydWN0IGNjYiAqY3A7CisJc3RydWN0IHRjYiAqdHA7CisJc3RydWN0IGxjYiAqbHA7CisJaW50IHRhcmdldCwgbHVuOworCWludCBpOworCWNoYXIgaW5zdF9uYW1lWzE2XTsKKworCS8qIExvY2FsIGNvcHkgc28gd2UgZG9uJ3QgYWNjZXNzIG5wIGFmdGVyIGZyZWVpbmcgaXQhICovCisJc3RybGNweShpbnN0X25hbWUsIG5jcl9uYW1lKG5wKSwgc2l6ZW9mKGluc3RfbmFtZSkpOworCisJcHJpbnRrKCIlczogcmVsZWFzaW5nIGhvc3QgcmVzb3VyY2VzXG4iLCBuY3JfbmFtZShucCkpOworCisvKgorKioJU3RvcCB0aGUgbmNyX3RpbWVvdXQgcHJvY2VzcworKioJU2V0IHJlbGVhc2Vfc3RhZ2UgdG8gMSBhbmQgd2FpdCB0aGF0IG5jcl90aW1lb3V0KCkgc2V0IGl0IHRvIDIuCisqLworCisjaWZkZWYgREVCVUdfTkNSNTNDOFhYCisJcHJpbnRrKCIlczogc3RvcHBpbmcgdGhlIHRpbWVyXG4iLCBuY3JfbmFtZShucCkpOworI2VuZGlmCisJbnAtPnJlbGVhc2Vfc3RhZ2UgPSAxOworCWZvciAoaSA9IDUwIDsgaSAmJiBucC0+cmVsZWFzZV9zdGFnZSAhPSAyIDsgaS0tKQorCQltZGVsYXkoMTAwKTsKKwlpZiAobnAtPnJlbGVhc2Vfc3RhZ2UgIT0gMikKKwkJcHJpbnRrKCIlczogdGhlIHRpbWVyIHNlZW1zIHRvIGJlIGFscmVhZHkgc3RvcHBlZFxuIiwgbmNyX25hbWUobnApKTsKKwllbHNlIG5wLT5yZWxlYXNlX3N0YWdlID0gMjsKKworLyoKKyoqCURpc2FibGUgY2hpcCBpbnRlcnJ1cHRzCisqLworCisjaWZkZWYgREVCVUdfTkNSNTNDOFhYCisJcHJpbnRrKCIlczogZGlzYWJsaW5nIGNoaXAgaW50ZXJydXB0c1xuIiwgbmNyX25hbWUobnApKTsKKyNlbmRpZgorCU9VVFcgKG5jX3NpZW4gLCAwKTsKKwlPVVRCIChuY19kaWVuICwgMCk7CisKKwkvKgorCSoqCVJlc2V0IE5DUiBjaGlwCisJKioJUmVzdG9yZSBiaW9zIHNldHRpbmcgZm9yIGF1dG9tYXRpYyBjbG9jayBkZXRlY3Rpb24uCisJKi8KKworCXByaW50aygiJXM6IHJlc2V0dGluZyBjaGlwXG4iLCBuY3JfbmFtZShucCkpOworCW5jcl9jaGlwX3Jlc2V0KG5wLCAxMDApOworCisJT1VUQihuY19kbW9kZSwJbnAtPnN2X2Rtb2RlKTsKKwlPVVRCKG5jX2RjbnRsLAlucC0+c3ZfZGNudGwpOworCU9VVEIobmNfY3Rlc3QwLAlucC0+c3ZfY3Rlc3QwKTsKKwlPVVRCKG5jX2N0ZXN0MywJbnAtPnN2X2N0ZXN0Myk7CisJT1VUQihuY19jdGVzdDQsCW5wLT5zdl9jdGVzdDQpOworCU9VVEIobmNfY3Rlc3Q1LAlucC0+c3ZfY3Rlc3Q1KTsKKwlPVVRCKG5jX2dwY250bCwJbnAtPnN2X2dwY250bCk7CisJT1VUQihuY19zdGVzdDIsCW5wLT5zdl9zdGVzdDIpOworCisJbmNyX3NlbGVjdGNsb2NrKG5wLCBucC0+c3Zfc2NudGwzKTsKKworCS8qCisJKioJRnJlZSBhbGxvY2F0ZWQgY2NiKHMpCisJKi8KKworCXdoaWxlICgoY3A9bnAtPmNjYi0+bGlua19jY2IpICE9IE5VTEwpIHsKKwkJbnAtPmNjYi0+bGlua19jY2IgPSBjcC0+bGlua19jY2I7CisJCWlmIChjcC0+aG9zdF9zdGF0dXMpIHsKKwkJcHJpbnRrKCIlczogc2hhbGwgZnJlZSBhbiBhY3RpdmUgY2NiIChob3N0X3N0YXR1cz0lZClcbiIsCisJCQluY3JfbmFtZShucCksIGNwLT5ob3N0X3N0YXR1cyk7CisJCX0KKyNpZmRlZiBERUJVR19OQ1I1M0M4WFgKKwlwcmludGsoIiVzOiBmcmVlaW5nIGNjYiAoJWx4KVxuIiwgbmNyX25hbWUobnApLCAodV9sb25nKSBjcCk7CisjZW5kaWYKKwkJbV9mcmVlX2RtYShjcCwgc2l6ZW9mKCpjcCksICJDQ0IiKTsKKwl9CisKKwkvKiBGcmVlIGFsbG9jYXRlZCB0cChzKSAqLworCisJZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPCBNQVhfVEFSR0VUIDsgdGFyZ2V0KyspIHsKKwkJdHA9Jm5wLT50YXJnZXRbdGFyZ2V0XTsKKwkJZm9yIChsdW4gPSAwIDsgbHVuIDwgTUFYX0xVTiA7IGx1bisrKSB7CisJCQlscCA9IHRwLT5scFtsdW5dOworCQkJaWYgKGxwKSB7CisjaWZkZWYgREVCVUdfTkNSNTNDOFhYCisJcHJpbnRrKCIlczogZnJlZWluZyBscCAoJWx4KVxuIiwgbmNyX25hbWUobnApLCAodV9sb25nKSBscCk7CisjZW5kaWYKKwkJCQlpZiAobHAtPmp1bXBfY2NiICE9ICZscC0+anVtcF9jY2JfMCkKKwkJCQkJbV9mcmVlX2RtYShscC0+anVtcF9jY2IsMjU2LCJKVU1QX0NDQiIpOworCQkJCW1fZnJlZV9kbWEobHAsIHNpemVvZigqbHApLCAiTENCIik7CisJCQl9CisJCX0KKwl9CisKKwlpZiAobnAtPnNjcmlwdGgwKQorCQltX2ZyZWVfZG1hKG5wLT5zY3JpcHRoMCwgc2l6ZW9mKHN0cnVjdCBzY3JpcHRoKSwgIlNDUklQVEgiKTsKKwlpZiAobnAtPnNjcmlwdDApCisJCW1fZnJlZV9kbWEobnAtPnNjcmlwdDAsIHNpemVvZihzdHJ1Y3Qgc2NyaXB0KSwgIlNDUklQVCIpOworCWlmIChucC0+Y2NiKQorCQltX2ZyZWVfZG1hKG5wLT5jY2IsIHNpemVvZihzdHJ1Y3QgY2NiKSwgIkNDQiIpOworCW1fZnJlZV9kbWEobnAsIHNpemVvZihzdHJ1Y3QgbmNiKSwgIk5DQiIpOworCisJcHJpbnRrKCIlczogaG9zdCByZXNvdXJjZXMgc3VjY2Vzc2Z1bGx5IHJlbGVhc2VkXG4iLCBpbnN0X25hbWUpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgorKioJQ29tcGxldGUgZXhlY3V0aW9uIG9mIGEgU0NTSSBjb21tYW5kLgorKioJU2lnbmFsIGNvbXBsZXRpb24gdG8gdGhlIGdlbmVyaWMgU0NTSSBkcml2ZXIuCisqKgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKwordm9pZCBuY3JfY29tcGxldGUgKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3QgY2NiICpjcCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJc3RydWN0IHRjYiAqdHA7CisJc3RydWN0IGxjYiAqbHA7CisKKwkvKgorCSoqCVNhbml0eSBjaGVjaworCSovCisKKwlpZiAoIWNwIHx8IGNwLT5tYWdpYyAhPSBDQ0JfTUFHSUMgfHwgIWNwLT5jbWQpCisJCXJldHVybjsKKworCS8qCisJKioJUHJpbnQgbWluaW1hbCBkZWJ1ZyBpbmZvcm1hdGlvbi4KKwkqLworCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfVElOWSkKKwkJcHJpbnRrICgiQ0NCPSVseCBTVEFUPSV4LyV4XG4iLCAodW5zaWduZWQgbG9uZyljcCwKKwkJCWNwLT5ob3N0X3N0YXR1cyxjcC0+c2NzaV9zdGF0dXMpOworCisJLyoKKwkqKglHZXQgY29tbWFuZCwgdGFyZ2V0IGFuZCBsdW4gcG9pbnRlcnMuCisJKi8KKworCWNtZCA9IGNwLT5jbWQ7CisJY3AtPmNtZCA9IE5VTEw7CisJdHAgPSAmbnAtPnRhcmdldFtjbWQtPmRldmljZS0+aWRdOworCWxwID0gdHAtPmxwW2NtZC0+ZGV2aWNlLT5sdW5dOworCisJLyoKKwkqKglXZSBkb25ub3QgcXVldWUgbW9yZSB0aGFuIDEgY2NiIHBlciB0YXJnZXQgCisJKioJd2l0aCBuZWdvdGlhdGlvbiBhdCBhbnkgdGltZS4gSWYgdGhpcyBjY2Igd2FzIAorCSoqCXVzZWQgZm9yIG5lZ290aWF0aW9uLCBjbGVhciB0aGlzIGluZm8gaW4gdGhlIHRjYi4KKwkqLworCisJaWYgKGNwID09IHRwLT5uZWdvX2NwKQorCQl0cC0+bmVnb19jcCA9IE5VTEw7CisKKwkvKgorCSoqCUlmIGF1dG8tc2Vuc2UgcGVyZm9ybWVkLCBjaGFuZ2Ugc2NzaSBzdGF0dXMuCisJKi8KKwlpZiAoY3AtPmF1dG9fc2Vuc2UpIHsKKwkJY3AtPnNjc2lfc3RhdHVzID0gY3AtPmF1dG9fc2Vuc2U7CisJfQorCisJLyoKKwkqKglJZiB3ZSB3ZXJlIHJlY292ZXJpbmcgZnJvbSBxdWV1ZSBmdWxsIG9yIHBlcmZvcm1pbmcgCisJKioJYXV0by1zZW5zZSwgcmVxdWV1ZSBza2lwcGVkIENDQnMgdG8gdGhlIHdhaXQgcXVldWUuCisJKi8KKworCWlmIChscCAmJiBscC0+aGVsZF9jY2IpIHsKKwkJaWYgKGNwID09IGxwLT5oZWxkX2NjYikgeworCQkJbGlzdF9zcGxpY2VfaW5pdCgmbHAtPnNraXBfY2NicSwgJmxwLT53YWl0X2NjYnEpOworCQkJbHAtPmhlbGRfY2NiID0gTlVMTDsKKwkJfQorCX0KKworCS8qCisJKioJQ2hlY2sgZm9yIHBhcml0eSBlcnJvcnMuCisJKi8KKworCWlmIChjcC0+cGFyaXR5X3N0YXR1cyA+IDEpIHsKKwkJUFJJTlRfQUREUihjbWQsICIlZCBwYXJpdHkgZXJyb3IocykuXG4iLGNwLT5wYXJpdHlfc3RhdHVzKTsKKwl9CisKKwkvKgorCSoqCUNoZWNrIGZvciBleHRlbmRlZCBlcnJvcnMuCisJKi8KKworCWlmIChjcC0+eGVycl9zdGF0dXMgIT0gWEVfT0spIHsKKwkJc3dpdGNoIChjcC0+eGVycl9zdGF0dXMpIHsKKwkJY2FzZSBYRV9FWFRSQV9EQVRBOgorCQkJUFJJTlRfQUREUihjbWQsICJleHRyYW5lb3VzIGRhdGEgZGlzY2FyZGVkLlxuIik7CisJCQlicmVhazsKKwkJY2FzZSBYRV9CQURfUEhBU0U6CisJCQlQUklOVF9BRERSKGNtZCwgImludmFsaWQgc2NzaSBwaGFzZSAoNC81KS5cbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlQUklOVF9BRERSKGNtZCwgImV4dGVuZGVkIGVycm9yICVkLlxuIiwKKwkJCQkJY3AtPnhlcnJfc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjcC0+aG9zdF9zdGF0dXM9PUhTX0NPTVBMRVRFKQorCQkJY3AtPmhvc3Rfc3RhdHVzID0gSFNfRkFJTDsKKwl9CisKKwkvKgorCSoqCVByaW50IG91dCBhbnkgZXJyb3IgZm9yIGRlYnVnZ2luZyBwdXJwb3NlLgorCSovCisJaWYgKERFQlVHX0ZMQUdTICYgKERFQlVHX1JFU1VMVHxERUJVR19USU5ZKSkgeworCQlpZiAoY3AtPmhvc3Rfc3RhdHVzIT1IU19DT01QTEVURSB8fCBjcC0+c2NzaV9zdGF0dXMhPVNfR09PRCkgeworCQkJUFJJTlRfQUREUihjbWQsICJFUlJPUjogY21kPSV4IGhvc3Rfc3RhdHVzPSV4ICIKKwkJCQkJInNjc2lfc3RhdHVzPSV4XG4iLCBjbWQtPmNtbmRbMF0sCisJCQkJCWNwLT5ob3N0X3N0YXR1cywgY3AtPnNjc2lfc3RhdHVzKTsKKwkJfQorCX0KKworCS8qCisJKioJQ2hlY2sgdGhlIHN0YXR1cy4KKwkqLworCWlmICggICAoY3AtPmhvc3Rfc3RhdHVzID09IEhTX0NPTVBMRVRFKQorCQkmJiAoY3AtPnNjc2lfc3RhdHVzID09IFNfR09PRCB8fAorCQkgICAgY3AtPnNjc2lfc3RhdHVzID09IFNfQ09ORF9NRVQpKSB7CisJCS8qCisJCSAqCUFsbCB3ZW50IHdlbGwgKEdPT0Qgc3RhdHVzKS4KKwkJICoJQ09ORElUSU9OIE1FVCBzdGF0dXMgaXMgcmV0dXJuZWQgb24gCisJCSAqCWBQcmUtRmV0Y2gnIG9yIGBTZWFyY2ggZGF0YScgc3VjY2Vzcy4KKwkJICovCisJCWNtZC0+cmVzdWx0ID0gU2NzaVJlc3VsdChESURfT0ssIGNwLT5zY3NpX3N0YXR1cyk7CisKKwkJLyoKKwkJKioJQFJFU0lEQAorCQkqKglDb3VsZCBkaWcgb3V0IHRoZSBjb3JyZWN0IHZhbHVlIGZvciByZXNpZCwKKwkJKioJYnV0IGl0IHdvdWxkIGJlIHF1aXRlIGNvbXBsaWNhdGVkLgorCQkqLworCQkvKiBpZiAoY3AtPnBoeXMuaGVhZGVyLmxhc3RwICE9IGNwLT5waHlzLmhlYWRlci5nb2FscCkgKi8KKworCQkvKgorCQkqKglBbGxvY2F0ZSB0aGUgbGNiIGlmIG5vdCB5ZXQuCisJCSovCisJCWlmICghbHApCisJCQluY3JfYWxsb2NfbGNiIChucCwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKworCQl0cC0+Ynl0ZXMgICAgICs9IGNwLT5kYXRhX2xlbjsKKwkJdHAtPnRyYW5zZmVycyArKzsKKworCQkvKgorCQkqKglJZiB0YWdzIHdhcyByZWR1Y2VkIGR1ZSB0byBxdWV1ZSBmdWxsLAorCQkqKglpbmNyZWFzZSB0YWdzIGlmIDEwMDAgZ29vZCBzdGF0dXMgcmVjZWl2ZWQuCisJCSovCisJCWlmIChscCAmJiBscC0+dXNldGFncyAmJiBscC0+bnVtdGFncyA8IGxwLT5tYXh0YWdzKSB7CisJCQkrK2xwLT5udW1fZ29vZDsKKwkJCWlmIChscC0+bnVtX2dvb2QgPj0gMTAwMCkgeworCQkJCWxwLT5udW1fZ29vZCA9IDA7CisJCQkJKytscC0+bnVtdGFnczsKKwkJCQluY3Jfc2V0dXBfdGFncyAobnAsIGNtZC0+ZGV2aWNlKTsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoKGNwLT5ob3N0X3N0YXR1cyA9PSBIU19DT01QTEVURSkKKwkJJiYgKGNwLT5zY3NpX3N0YXR1cyA9PSBTX0NIRUNLX0NPTkQpKSB7CisJCS8qCisJCSoqICAgQ2hlY2sgY29uZGl0aW9uIGNvZGUKKwkJKi8KKwkJY21kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KERJRF9PSywgU19DSEVDS19DT05EKTsKKworCQkvKgorCQkqKglDb3B5IGJhY2sgc2Vuc2UgZGF0YSB0byBjYWxsZXIncyBidWZmZXIuCisJCSovCisJCW1lbWNweShjbWQtPnNlbnNlX2J1ZmZlciwgY3AtPnNlbnNlX2J1ZiwKKwkJICAgICAgIG1pbihzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpLCBzaXplb2YoY3AtPnNlbnNlX2J1ZikpKTsKKworCQlpZiAoREVCVUdfRkxBR1MgJiAoREVCVUdfUkVTVUxUfERFQlVHX1RJTlkpKSB7CisJCQl1X2NoYXIgKiBwID0gKHVfY2hhciopICYgY21kLT5zZW5zZV9idWZmZXI7CisJCQlpbnQgaTsKKwkJCVBSSU5UX0FERFIoY21kLCAic2Vuc2UgZGF0YToiKTsKKwkJCWZvciAoaT0wOyBpPDE0OyBpKyspIHByaW50ayAoIiAleCIsICpwKyspOworCQkJcHJpbnRrICgiLlxuIik7CisJCX0KKwl9IGVsc2UgaWYgKChjcC0+aG9zdF9zdGF0dXMgPT0gSFNfQ09NUExFVEUpCisJCSYmIChjcC0+c2NzaV9zdGF0dXMgPT0gU19DT05GTElDVCkpIHsKKwkJLyoKKwkJKiogICBSZXNlcnZhdGlvbiBDb25mbGljdCBjb25kaXRpb24gY29kZQorCQkqLworCQljbWQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoRElEX09LLCBTX0NPTkZMSUNUKTsKKwkKKwl9IGVsc2UgaWYgKChjcC0+aG9zdF9zdGF0dXMgPT0gSFNfQ09NUExFVEUpCisJCSYmIChjcC0+c2NzaV9zdGF0dXMgPT0gU19CVVNZIHx8CisJCSAgICBjcC0+c2NzaV9zdGF0dXMgPT0gU19RVUVVRV9GVUxMKSkgeworCisJCS8qCisJCSoqICAgVGFyZ2V0IGlzIGJ1c3kuCisJCSovCisJCWNtZC0+cmVzdWx0ID0gU2NzaVJlc3VsdChESURfT0ssIGNwLT5zY3NpX3N0YXR1cyk7CisKKwl9IGVsc2UgaWYgKChjcC0+aG9zdF9zdGF0dXMgPT0gSFNfU0VMX1RJTUVPVVQpCisJCXx8IChjcC0+aG9zdF9zdGF0dXMgPT0gSFNfVElNRU9VVCkpIHsKKworCQkvKgorCQkqKiAgIE5vIHJlc3BvbnNlCisJCSovCisJCWNtZC0+cmVzdWx0ID0gU2NzaVJlc3VsdChESURfVElNRV9PVVQsIGNwLT5zY3NpX3N0YXR1cyk7CisKKwl9IGVsc2UgaWYgKGNwLT5ob3N0X3N0YXR1cyA9PSBIU19SRVNFVCkgeworCisJCS8qCisJCSoqICAgU0NTSSBidXMgcmVzZXQKKwkJKi8KKwkJY21kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KERJRF9SRVNFVCwgY3AtPnNjc2lfc3RhdHVzKTsKKworCX0gZWxzZSBpZiAoY3AtPmhvc3Rfc3RhdHVzID09IEhTX0FCT1JURUQpIHsKKworCQkvKgorCQkqKiAgIFRyYW5zZmVyIGFib3J0ZWQKKwkJKi8KKwkJY21kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KERJRF9BQk9SVCwgY3AtPnNjc2lfc3RhdHVzKTsKKworCX0gZWxzZSB7CisKKwkJLyoKKwkJKiogIE90aGVyIHByb3RvY29sIG1lc3NlcworCQkqLworCQlQUklOVF9BRERSKGNtZCwgIkNPTU1BTkQgRkFJTEVEICgleCAleCkgQCVwLlxuIiwKKwkJCWNwLT5ob3N0X3N0YXR1cywgY3AtPnNjc2lfc3RhdHVzLCBjcCk7CisKKwkJY21kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KERJRF9FUlJPUiwgY3AtPnNjc2lfc3RhdHVzKTsKKwl9CisKKwkvKgorCSoqCXRyYWNlIG91dHB1dAorCSovCisKKwlpZiAodHAtPnVzcmZsYWcgJiBVRl9UUkFDRSkgeworCQl1X2NoYXIgKiBwOworCQlpbnQgaTsKKwkJUFJJTlRfQUREUihjbWQsICIgQ01EOiIpOworCQlwID0gKHVfY2hhciopICZjbWQtPmNtbmRbMF07CisJCWZvciAoaT0wOyBpPGNtZC0+Y21kX2xlbjsgaSsrKSBwcmludGsgKCIgJXgiLCAqcCsrKTsKKworCQlpZiAoY3AtPmhvc3Rfc3RhdHVzPT1IU19DT01QTEVURSkgeworCQkJc3dpdGNoIChjcC0+c2NzaV9zdGF0dXMpIHsKKwkJCWNhc2UgU19HT09EOgorCQkJCXByaW50ayAoIiAgR09PRCIpOworCQkJCWJyZWFrOworCQkJY2FzZSBTX0NIRUNLX0NPTkQ6CisJCQkJcHJpbnRrICgiICBTRU5TRToiKTsKKwkJCQlwID0gKHVfY2hhciopICZjbWQtPnNlbnNlX2J1ZmZlcjsKKwkJCQlmb3IgKGk9MDsgaTwxNDsgaSsrKQorCQkJCQlwcmludGsgKCIgJXgiLCAqcCsrKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrICgiICBTVEFUOiAleFxuIiwgY3AtPnNjc2lfc3RhdHVzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHByaW50ayAoIiAgSE9TVEVSUk9SOiAleCIsIGNwLT5ob3N0X3N0YXR1cyk7CisJCXByaW50ayAoIlxuIik7CisJfQorCisJLyoKKwkqKglGcmVlIHRoaXMgY2NiCisJKi8KKwluY3JfZnJlZV9jY2IgKG5wLCBjcCk7CisKKwkvKgorCSoqCXJlcXVldWUgYXdhaXRpbmcgc2NzaSBjb21tYW5kcyBmb3IgdGhpcyBsdW4uCisJKi8KKwlpZiAobHAgJiYgbHAtPnF1ZXVlZGNjYnMgPCBscC0+cXVldWVkZXB0aCAmJgorCSAgICAhbGlzdF9lbXB0eSgmbHAtPndhaXRfY2NicSkpCisJCW5jcl9zdGFydF9uZXh0X2NjYihucCwgbHAsIDIpOworCisJLyoKKwkqKglyZXF1ZXVlIGF3YWl0aW5nIHNjc2kgY29tbWFuZHMgZm9yIHRoaXMgY29udHJvbGxlci4KKwkqLworCWlmIChucC0+d2FpdGluZ19saXN0KQorCQlyZXF1ZXVlX3dhaXRpbmdfbGlzdChucCk7CisKKwkvKgorCSoqCXNpZ25hbCBjb21wbGV0aW9uIHRvIGdlbmVyaWMgZHJpdmVyLgorCSovCisJbmNyX3F1ZXVlX2RvbmVfY21kKG5wLCBjbWQpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgorKioJU2lnbmFsIGFsbCAob3Igb25lKSBjb250cm9sIGJsb2NrIGRvbmUuCisqKgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworLyoKKyoqCVRoaXMgQ0NCIGhhcyBiZWVuIHNraXBwZWQgYnkgdGhlIE5DUi4KKyoqCVF1ZXVlIGl0IGluIHRoZSBjb3JyZXBvbmRpbmcgdW5pdCBxdWV1ZS4KKyovCitzdGF0aWMgdm9pZCBuY3JfY2NiX3NraXBwZWQoc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBjY2IgKmNwKQoreworCXN0cnVjdCB0Y2IgKnRwID0gJm5wLT50YXJnZXRbY3AtPnRhcmdldF07CisJc3RydWN0IGxjYiAqbHAgPSB0cC0+bHBbY3AtPmx1bl07CisKKwlpZiAobHAgJiYgY3AgIT0gbnAtPmNjYikgeworCQljcC0+aG9zdF9zdGF0dXMgJj0gfkhTX1NLSVBNQVNLOworCQljcC0+c3RhcnQuc2NoZWR1bGUubF9wYWRkciA9IAorCQkJY3B1X3RvX3NjcihOQ0JfU0NSSVBUX1BIWVMgKG5wLCBzZWxlY3QpKTsKKwkJbGlzdF9kZWwoJmNwLT5saW5rX2NjYnEpOworCQlsaXN0X2FkZF90YWlsKCZjcC0+bGlua19jY2JxLCAmbHAtPnNraXBfY2NicSk7CisJCWlmIChjcC0+cXVldWVkKSB7CisJCQktLWxwLT5xdWV1ZWRjY2JzOworCQl9CisJfQorCWlmIChjcC0+cXVldWVkKSB7CisJCS0tbnAtPnF1ZXVlZGNjYnM7CisJCWNwLT5xdWV1ZWQgPSAwOworCX0KK30KKworLyoKKyoqCVRoZSBOQ1IgaGFzIGNvbXBsZXRlZCBDQ0JzLgorKioJTG9vayBhdCB0aGUgRE9ORSBRVUVVRSBpZiBlbmFibGVkLCBvdGhlcndpc2Ugc2NhbiBhbGwgQ0NCcworKi8KK3ZvaWQgbmNyX3dha2V1cF9kb25lIChzdHJ1Y3QgbmNiICpucCkKK3sKKwlzdHJ1Y3QgY2NiICpjcDsKKyNpZmRlZiBTQ1NJX05DUl9DQ0JfRE9ORV9TVVBQT1JUCisJaW50IGksIGo7CisKKwlpID0gbnAtPmNjYl9kb25lX2ljOworCXdoaWxlICgxKSB7CisJCWogPSBpKzE7CisJCWlmIChqID49IE1BWF9ET05FKQorCQkJaiA9IDA7CisKKwkJY3AgPSBucC0+Y2NiX2RvbmVbal07CisJCWlmICghQ0NCX0RPTkVfVkFMSUQoY3ApKQorCQkJYnJlYWs7CisKKwkJbnAtPmNjYl9kb25lW2pdID0gKHN0cnVjdCBjY2IgKilDQ0JfRE9ORV9FTVBUWTsKKwkJbnAtPnNjcmlwdGgtPmRvbmVfcXVldWVbNSpqICsgNF0gPQorCQkJCWNwdV90b19zY3IoTkNCX1NDUklQVF9QSFlTIChucCwgZG9uZV9wbHVnKSk7CisJCU1FTU9SWV9CQVJSSUVSKCk7CisJCW5wLT5zY3JpcHRoLT5kb25lX3F1ZXVlWzUqaSArIDRdID0KKwkJCQljcHVfdG9fc2NyKE5DQl9TQ1JJUFRfUEhZUyAobnAsIGRvbmVfZW5kKSk7CisKKwkJaWYgKGNwLT5ob3N0X3N0YXR1cyAmIEhTX0RPTkVNQVNLKQorCQkJbmNyX2NvbXBsZXRlIChucCwgY3ApOworCQllbHNlIGlmIChjcC0+aG9zdF9zdGF0dXMgJiBIU19TS0lQTUFTSykKKwkJCW5jcl9jY2Jfc2tpcHBlZCAobnAsIGNwKTsKKworCQlpID0gajsKKwl9CisJbnAtPmNjYl9kb25lX2ljID0gaTsKKyNlbHNlCisJY3AgPSBucC0+Y2NiOworCXdoaWxlIChjcCkgeworCQlpZiAoY3AtPmhvc3Rfc3RhdHVzICYgSFNfRE9ORU1BU0spCisJCQluY3JfY29tcGxldGUgKG5wLCBjcCk7CisJCWVsc2UgaWYgKGNwLT5ob3N0X3N0YXR1cyAmIEhTX1NLSVBNQVNLKQorCQkJbmNyX2NjYl9za2lwcGVkIChucCwgY3ApOworCQljcCA9IGNwLT5saW5rX2NjYjsKKwl9CisjZW5kaWYKK30KKworLyoKKyoqCUNvbXBsZXRlIGFsbCBhY3RpdmUgQ0NCcy4KKyovCit2b2lkIG5jcl93YWtldXAgKHN0cnVjdCBuY2IgKm5wLCB1X2xvbmcgY29kZSkKK3sKKwlzdHJ1Y3QgY2NiICpjcCA9IG5wLT5jY2I7CisKKwl3aGlsZSAoY3ApIHsKKwkJaWYgKGNwLT5ob3N0X3N0YXR1cyAhPSBIU19JRExFKSB7CisJCQljcC0+aG9zdF9zdGF0dXMgPSBjb2RlOworCQkJbmNyX2NvbXBsZXRlIChucCwgY3ApOworCQl9CisJCWNwID0gY3AtPmxpbmtfY2NiOworCX0KK30KKworLyoKKyoqIFJlc2V0IG5jciBjaGlwLgorKi8KKworLyogU29tZSBpbml0aWFsaXNhdGlvbiBtdXN0IGJlIGRvbmUgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHJlc2V0LCBmb3IgNTNjNzIwLAorICogYXQgbGVhc3QuICBFQSAoZGNudGwgYml0IDUpIGlzbid0IHNldCBoZXJlIGFzIGl0IGlzIHNldCBvbmNlIG9ubHkgaW4KKyAqIHRoZSBfZGV0ZWN0IGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBuY3JfY2hpcF9yZXNldChzdHJ1Y3QgbmNiICpucCwgaW50IGRlbGF5KQoreworCU9VVEIgKG5jX2lzdGF0LCAgU1JTVCk7CisJdWRlbGF5KGRlbGF5KTsKKwlPVVRCIChuY19pc3RhdCwgIDAgICApOworCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX0VIUCkKKwkJT1VUQiAobmNfY3Rlc3QwLCBFSFApOworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9NVVgpCisJCU9VVEIgKG5jX2N0ZXN0NCwgTVVYKTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgorKioJU3RhcnQgTkNSIGNoaXAuCisqKgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKwordm9pZCBuY3JfaW5pdCAoc3RydWN0IG5jYiAqbnAsIGludCByZXNldCwgY2hhciAqIG1zZywgdV9sb25nIGNvZGUpCit7CisgCWludAlpOworCisgCS8qCisJKioJUmVzZXQgY2hpcCBpZiBhc2tlZCwgb3RoZXJ3aXNlIGp1c3QgY2xlYXIgZmlmb3MuCisgCSovCisKKwlpZiAocmVzZXQpIHsKKwkJT1VUQiAobmNfaXN0YXQsICBTUlNUKTsKKwkJdWRlbGF5KDEwMCk7CisJfQorCWVsc2UgeworCQlPVVRCIChuY19zdGVzdDMsIFRFfENTRik7CisJCU9VVE9OQiAobmNfY3Rlc3QzLCBDTEYpOworCX0KKyAKKwkvKgorCSoqCU1lc3NhZ2UuCisJKi8KKworCWlmIChtc2cpIHByaW50ayAoS0VSTl9JTkZPICIlczogcmVzdGFydCAoJXMpLlxuIiwgbmNyX25hbWUgKG5wKSwgbXNnKTsKKworCS8qCisJKioJQ2xlYXIgU3RhcnQgUXVldWUKKwkqLworCW5wLT5xdWV1ZWRlcHRoID0gTUFYX1NUQVJUIC0gMTsJLyogMSBlbnRyeSBuZWVkZWQgYXMgZW5kIG1hcmtlciAqLworCWZvciAoaSA9IDE7IGkgPCBNQVhfU1RBUlQgKyBNQVhfU1RBUlQ7IGkgKz0gMikKKwkJbnAtPnNjcmlwdGgwLT50cnlsb29wW2ldID0KKwkJCQljcHVfdG9fc2NyKE5DQl9TQ1JJUFRfUEhZUyAobnAsIGlkbGUpKTsKKworCS8qCisJKioJU3RhcnQgYXQgZmlyc3QgZW50cnkuCisJKi8KKwlucC0+c3F1ZXVlcHV0ID0gMDsKKwlucC0+c2NyaXB0MC0+c3RhcnRwb3NbMF0gPSBjcHVfdG9fc2NyKE5DQl9TQ1JJUFRIX1BIWVMgKG5wLCB0cnlsb29wKSk7CisKKyNpZmRlZiBTQ1NJX05DUl9DQ0JfRE9ORV9TVVBQT1JUCisJLyoKKwkqKglDbGVhciBEb25lIFF1ZXVlCisJKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0RPTkU7IGkrKykgeworCQlucC0+Y2NiX2RvbmVbaV0gPSAoc3RydWN0IGNjYiAqKUNDQl9ET05FX0VNUFRZOworCQlucC0+c2NyaXB0aDAtPmRvbmVfcXVldWVbNSppICsgNF0gPQorCQkJY3B1X3RvX3NjcihOQ0JfU0NSSVBUX1BIWVMgKG5wLCBkb25lX2VuZCkpOworCX0KKyNlbmRpZgorCisJLyoKKwkqKglTdGFydCBhdCBmaXJzdCBlbnRyeS4KKwkqLworCW5wLT5zY3JpcHQwLT5kb25lX3Bvc1swXSA9IGNwdV90b19zY3IoTkNCX1NDUklQVEhfUEhZUyAobnAsZG9uZV9xdWV1ZSkpOworCW5wLT5jY2JfZG9uZV9pYyA9IE1BWF9ET05FLTE7CisJbnAtPnNjcmlwdGgwLT5kb25lX3F1ZXVlWzUqKE1BWF9ET05FLTEpICsgNF0gPQorCQkJY3B1X3RvX3NjcihOQ0JfU0NSSVBUX1BIWVMgKG5wLCBkb25lX3BsdWcpKTsKKworCS8qCisJKioJV2FrZXVwIGFsbCBwZW5kaW5nIGpvYnMuCisJKi8KKwluY3Jfd2FrZXVwIChucCwgY29kZSk7CisKKwkvKgorCSoqCUluaXQgY2hpcC4KKwkqLworCisJLyoKKwkqKiBSZW1vdmUgcmVzZXQ7IGJpZyBkZWxheSBiZWNhdXNlIHRoZSA4OTUgbmVlZHMgdGltZSBmb3IgdGhlCisJKiogYnVzIG1vZGUgdG8gc2V0dGxlCisJKi8KKwluY3JfY2hpcF9yZXNldChucCwgMjAwMCk7CisKKwlPVVRCIChuY19zY250bDAsIG5wLT5ydl9zY250bDAgfCAweGMwKTsKKwkJCQkJLyogIGZ1bGwgYXJiLiwgZW5hIHBhcml0eSwgcGFyLT5BVE4gICovCisJT1VUQiAobmNfc2NudGwxLCAweDAwKTsJCS8qICBvZGQgcGFyaXR5LCBhbmQgcmVtb3ZlIENSU1QhISAqLworCisJbmNyX3NlbGVjdGNsb2NrKG5wLCBucC0+cnZfc2NudGwzKTsJLyogU2VsZWN0IFNDU0kgY2xvY2sgKi8KKworCU9VVEIgKG5jX3NjaWQgICwgUlJFfG5wLT5teWFkZHIpOwkvKiBBZGFwdGVyIFNDU0kgYWRkcmVzcyAqLworCU9VVFcgKG5jX3Jlc3BpZCwgMXVsPDxucC0+bXlhZGRyKTsJLyogSWQgdG8gcmVzcG9uZCB0byAqLworCU9VVEIgKG5jX2lzdGF0ICwgU0lHUAkpOwkJLyogIFNpZ25hbCBQcm9jZXNzICovCisJT1VUQiAobmNfZG1vZGUgLCBucC0+cnZfZG1vZGUpOwkJLyogQnVyc3QgbGVuZ3RoLCBkbWEgbW9kZSAqLworCU9VVEIgKG5jX2N0ZXN0NSwgbnAtPnJ2X2N0ZXN0NSk7CS8qIExhcmdlIGZpZm8gKyBsYXJnZSBidXJzdCAqLworCisJT1VUQiAobmNfZGNudGwgLCBOT0NPTXxucC0+cnZfZGNudGwpOwkvKiBQcm90ZWN0IFNGQlIgKi8KKwlPVVRCIChuY19jdGVzdDAsIG5wLT5ydl9jdGVzdDApOwkvKiA3MjA6IENESVMgYW5kIEVIUCAqLworCU9VVEIgKG5jX2N0ZXN0MywgbnAtPnJ2X2N0ZXN0Myk7CS8qIFdyaXRlIGFuZCBpbnZhbGlkYXRlICovCisJT1VUQiAobmNfY3Rlc3Q0LCBucC0+cnZfY3Rlc3Q0KTsJLyogTWFzdGVyIHBhcml0eSBjaGVja2luZyAqLworCisJT1VUQiAobmNfc3Rlc3QyLCBFWFR8bnAtPnJ2X3N0ZXN0Mik7CS8qIEV4dGVuZGVkIFNyZXEvU2FjayBmaWx0ZXJpbmcgKi8KKwlPVVRCIChuY19zdGVzdDMsIFRFKTsJCQkvKiBUb2xlckFOVCBlbmFibGUgKi8KKwlPVVRCIChuY19zdGltZTAsIDB4MGMJKTsJCS8qIEhUSCBkaXNhYmxlZCAgU1RPIDAuMjUgc2VjICovCisKKwkvKgorCSoqCURpc2FibGUgZGlzY29ubmVjdHMuCisJKi8KKworCW5wLT5kaXNjID0gMDsKKworCS8qCisJKiogICAgRW5hYmxlIEdQSU8wIHBpbiBmb3Igd3JpdGluZyBpZiBMRUQgc3VwcG9ydC4KKwkqLworCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX0xFRDApIHsKKwkJT1VUT0ZGQiAobmNfZ3BjbnRsLCAweDAxKTsKKwl9CisKKwkvKgorCSoqICAgICAgZW5hYmxlIGludHMKKwkqLworCisJT1VUVyAobmNfc2llbiAsIFNUT3xIVEh8TUF8U0dFfFVEQ3xSU1R8UEFSKTsKKwlPVVRCIChuY19kaWVuICwgTURQRXxCRnxBQlJUfFNTSXxTSVJ8SUlEKTsKKworCS8qCisJKioJRmlsbCBpbiB0YXJnZXQgc3RydWN0dXJlLgorCSoqCVJlaW5pdGlhbGl6ZSB1c3JzeW5jLgorCSoqCVJlaW5pdGlhbGl6ZSB1c3J3aWRlLgorCSoqCVByZXBhcmUgc3luYyBuZWdvdGlhdGlvbiBhY2NvcmRpbmcgdG8gYWN0dWFsIFNDU0kgYnVzIG1vZGUuCisJKi8KKworCWZvciAoaT0wO2k8TUFYX1RBUkdFVDtpKyspIHsKKwkJc3RydWN0IHRjYiAqdHAgPSAmbnAtPnRhcmdldFtpXTsKKworCQl0cC0+c3ZhbCAgICA9IDA7CisJCXRwLT53dmFsICAgID0gbnAtPnJ2X3NjbnRsMzsKKworCQlpZiAodHAtPnVzcnN5bmMgIT0gMjU1KSB7CisJCQlpZiAodHAtPnVzcnN5bmMgPD0gbnAtPm1heHN5bmMpIHsKKwkJCQlpZiAodHAtPnVzcnN5bmMgPCBucC0+bWluc3luYykgeworCQkJCQl0cC0+dXNyc3luYyA9IG5wLT5taW5zeW5jOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCQl0cC0+dXNyc3luYyA9IDI1NTsKKwkJfQorCisJCWlmICh0cC0+dXNyd2lkZSA+IG5wLT5tYXh3aWRlKQorCQkJdHAtPnVzcndpZGUgPSBucC0+bWF4d2lkZTsKKworCX0KKworCS8qCisJKiogICAgU3RhcnQgc2NyaXB0IHByb2Nlc3Nvci4KKwkqLworCWlmIChucC0+cGFkZHIyKSB7CisJCWlmIChib290dmVyYm9zZSkKKwkJCXByaW50ayAoIiVzOiBEb3dubG9hZGluZyBTQ1NJIFNDUklQVFMuXG4iLAorCQkJCW5jcl9uYW1lKG5wKSk7CisJCU9VVEwgKG5jX3NjcmF0Y2hhLCB2dG9idXMobnAtPnNjcmlwdDApKTsKKwkJT1VUTF9EU1AgKE5DQl9TQ1JJUFRIX1BIWVMgKG5wLCBzdGFydF9yYW0pKTsKKwl9CisJZWxzZQorCQlPVVRMX0RTUCAoTkNCX1NDUklQVF9QSFlTIChucCwgc3RhcnQpKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJUHJlcGFyZSB0aGUgbmVnb3RpYXRpb24gdmFsdWVzIGZvciB3aWRlIGFuZAorKioJc3luY2hyb25vdXMgdHJhbnNmZXJzLgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworc3RhdGljIHZvaWQgbmNyX25lZ290aWF0ZSAoc3RydWN0IG5jYiogbnAsIHN0cnVjdCB0Y2IqIHRwKQoreworCS8qCisJKioJbWluc3luYyB1bml0IGlzIDRucyAhCisJKi8KKworCXVfbG9uZyBtaW5zeW5jID0gdHAtPnVzcnN5bmM7CisKKwkvKgorCSoqCVNDU0kgYnVzIG1vZGUgbGltaXQKKwkqLworCisJaWYgKG5wLT5zY3NpX21vZGUgJiYgbnAtPnNjc2lfbW9kZSA9PSBTTU9ERV9TRSkgeworCQlpZiAobWluc3luYyA8IDEyKSBtaW5zeW5jID0gMTI7CisJfQorCisJLyoKKwkqKglvdXIgbGltaXQgLi4KKwkqLworCisJaWYgKG1pbnN5bmMgPCBucC0+bWluc3luYykKKwkJbWluc3luYyA9IG5wLT5taW5zeW5jOworCisJLyoKKwkqKglkaXZpZGVyIGxpbWl0CisJKi8KKworCWlmIChtaW5zeW5jID4gbnAtPm1heHN5bmMpCisJCW1pbnN5bmMgPSAyNTU7CisKKwlpZiAodHAtPm1heG9mZnMgPiBucC0+bWF4b2ZmcykKKwkJdHAtPm1heG9mZnMgPSBucC0+bWF4b2ZmczsKKworCXRwLT5taW5zeW5jID0gbWluc3luYzsKKwl0cC0+bWF4b2ZmcyA9IChtaW5zeW5jPDI1NSA/IHRwLT5tYXhvZmZzIDogMCk7CisKKwkvKgorCSoqCXBlcmlvZD0wOiBoYXMgdG8gbmVnb3RpYXRlIHN5bmMgdHJhbnNmZXIKKwkqLworCisJdHAtPnBlcmlvZD0wOworCisJLyoKKwkqKgl3aWRlZG9uZT0wOiBoYXMgdG8gbmVnb3RpYXRlIHdpZGUgdHJhbnNmZXIKKwkqLworCXRwLT53aWRlZG9uZT0wOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglHZXQgY2xvY2sgZmFjdG9yIGFuZCBzeW5jIGRpdmlzb3IgZm9yIGEgZ2l2ZW4gCisqKglzeW5jaHJvbm91cyBmYWN0b3IgcGVyaW9kLgorKioJUmV0dXJucyB0aGUgY2xvY2sgZmFjdG9yIChpbiBzeGZlcikgYW5kIHNjbnRsMyAKKyoqCXN5bmNocm9ub3VzIGRpdmlzb3IgZmllbGQuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitzdGF0aWMgdm9pZCBuY3JfZ2V0c3luYyhzdHJ1Y3QgbmNiICpucCwgdV9jaGFyIHNmYWMsIHVfY2hhciAqZmFrcCwgdV9jaGFyICpzY250bDNwKQoreworCXVfbG9uZwljbGsgPSBucC0+Y2xvY2tfa2h6OwkvKiBTQ1NJIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHoJKi8KKwlpbnQJZGl2ID0gbnAtPmNsb2NrX2Rpdm47CS8qIE51bWJlciBvZiBkaXZpc29ycyBzdXBwb3J0ZWQJKi8KKwl1X2xvbmcJZmFrOwkJCS8qIFN5bmMgZmFjdG9yIGluIHN4ZmVyCQkqLworCXVfbG9uZwlwZXI7CQkJLyogUGVyaW9kIGluIHRlbnRocyBvZiBucwkqLworCXVfbG9uZwlrcGM7CQkJLyogKHBlciAqIGNsaykJCQkqLworCisJLyoKKwkqKglDb21wdXRlIHRoZSBzeW5jaHJvbm91cyBwZXJpb2QgaW4gdGVudGhzIG9mIG5hbm8tc2Vjb25kcworCSovCisJaWYJKHNmYWMgPD0gMTApCXBlciA9IDI1MDsKKwllbHNlIGlmCShzZmFjID09IDExKQlwZXIgPSAzMDM7CisJZWxzZSBpZgkoc2ZhYyA9PSAxMikJcGVyID0gNTAwOworCWVsc2UJCQlwZXIgPSA0MCAqIHNmYWM7CisKKwkvKgorCSoqCUxvb2sgZm9yIHRoZSBncmVhdGVzdCBjbG9jayBkaXZpc29yIHRoYXQgYWxsb3dzIGFuIAorCSoqCWlucHV0IHNwZWVkIGZhc3RlciB0aGFuIHRoZSBwZXJpb2QuCisJKi8KKwlrcGMgPSBwZXIgKiBjbGs7CisJd2hpbGUgKC0tZGl2ID49IDApCisJCWlmIChrcGMgPj0gKGRpdl8xME1bZGl2XSA8PCAyKSkgYnJlYWs7CisKKwkvKgorCSoqCUNhbGN1bGF0ZSB0aGUgbG93ZXN0IGNsb2NrIGZhY3RvciB0aGF0IGFsbG93cyBhbiBvdXRwdXQgCisJKioJc3BlZWQgbm90IGZhc3RlciB0aGFuIHRoZSBwZXJpb2QuCisJKi8KKwlmYWsgPSAoa3BjIC0gMSkgLyBkaXZfMTBNW2Rpdl0gKyAxOworCisjaWYgMAkvKiBUaGlzIG9wdGltaXphdGlvbiBkb2VzIG5vdCBzZWVtIHZlcnkgdXNlZnVsICovCisKKwlwZXIgPSAoZmFrICogZGl2XzEwTVtkaXZdKSAvIGNsazsKKworCS8qCisJKioJV2h5IG5vdCB0byB0cnkgdGhlIGltbWVkaWF0ZSBsb3dlciBkaXZpc29yIGFuZCB0byBjaG9vc2UgCisJKioJdGhlIG9uZSB0aGF0IGFsbG93cyB0aGUgZmFzdGVzdCBvdXRwdXQgc3BlZWQgPworCSoqCVdlIGRvbid0IHdhbnQgaW5wdXQgc3BlZWQgdG9vIG11Y2ggZ3JlYXRlciB0aGFuIG91dHB1dCBzcGVlZC4KKwkqLworCWlmIChkaXYgPj0gMSAmJiBmYWsgPCA4KSB7CisJCXVfbG9uZyBmYWsyLCBwZXIyOworCQlmYWsyID0gKGtwYyAtIDEpIC8gZGl2XzEwTVtkaXYtMV0gKyAxOworCQlwZXIyID0gKGZhazIgKiBkaXZfMTBNW2Rpdi0xXSkgLyBjbGs7CisJCWlmIChwZXIyIDwgcGVyICYmIGZhazIgPD0gOCkgeworCQkJZmFrID0gZmFrMjsKKwkJCXBlciA9IHBlcjI7CisJCQktLWRpdjsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKGZhayA8IDQpIGZhayA9IDQ7CS8qIFNob3VsZCBuZXZlciBoYXBwZW4sIHRvbyBiYWQgLi4uICovCisKKwkvKgorCSoqCUNvbXB1dGUgYW5kIHJldHVybiBzeW5jIHBhcmFtZXRlcnMgZm9yIHRoZSBuY3IKKwkqLworCSpmYWtwCQk9IGZhayAtIDQ7CisJKnNjbnRsM3AJPSAoKGRpdisxKSA8PCA0KSArIChzZmFjIDwgMjUgPyAweDgwIDogMCk7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJU2V0IGFjdHVhbCB2YWx1ZXMsIHN5bmMgc3RhdHVzIGFuZCBwYXRjaCBhbGwgY2NicyBvZiAKKyoqCWEgdGFyZ2V0IGFjY29yZGluZyB0byBuZXcgc3luYy93aWRlIGFncmVlbWVudC4KKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK3N0YXRpYyB2b2lkIG5jcl9zZXRfc3luY193aWRlX3N0YXR1cyAoc3RydWN0IG5jYiAqbnAsIHVfY2hhciB0YXJnZXQpCit7CisJc3RydWN0IGNjYiAqY3A7CisJc3RydWN0IHRjYiAqdHAgPSAmbnAtPnRhcmdldFt0YXJnZXRdOworCisJLyoKKwkqKglzZXQgYWN0dWFsIHZhbHVlIGFuZCBzeW5jX3N0YXR1cworCSovCisJT1VUQiAobmNfc3hmZXIsIHRwLT5zdmFsKTsKKwlucC0+c3luY19zdCA9IHRwLT5zdmFsOworCU9VVEIgKG5jX3NjbnRsMywgdHAtPnd2YWwpOworCW5wLT53aWRlX3N0ID0gdHAtPnd2YWw7CisKKwkvKgorCSoqCXBhdGNoIEFMTCBjY2JzIG9mIHRoaXMgdGFyZ2V0LgorCSovCisJZm9yIChjcCA9IG5wLT5jY2I7IGNwOyBjcCA9IGNwLT5saW5rX2NjYikgeworCQlpZiAoIWNwLT5jbWQpIGNvbnRpbnVlOworCQlpZiAoY3AtPmNtZC0+ZGV2aWNlLT5pZCAhPSB0YXJnZXQpIGNvbnRpbnVlOworI2lmIDAKKwkJY3AtPnN5bmNfc3RhdHVzID0gdHAtPnN2YWw7CisJCWNwLT53aWRlX3N0YXR1cyA9IHRwLT53dmFsOworI2VuZGlmCisJCWNwLT5waHlzLnNlbGVjdC5zZWxfc2NudGwzID0gdHAtPnd2YWw7CisJCWNwLT5waHlzLnNlbGVjdC5zZWxfc3hmZXIgID0gdHAtPnN2YWw7CisJfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglTd2l0Y2ggc3luYyBtb2RlIGZvciBjdXJyZW50IGpvYiBhbmQgaXQncyB0YXJnZXQKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK3N0YXRpYyB2b2lkIG5jcl9zZXRzeW5jIChzdHJ1Y3QgbmNiICpucCwgc3RydWN0IGNjYiAqY3AsIHVfY2hhciBzY250bDMsIHVfY2hhciBzeGZlcikKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBjcC0+Y21kOworCXN0cnVjdCB0Y2IgKnRwOworCXVfY2hhciB0YXJnZXQgPSBJTkIgKG5jX3NkaWQpICYgMHgwZjsKKwl1X2NoYXIgaWRpdjsKKworCUJVR19PTih0YXJnZXQgIT0gKGNtZC0+ZGV2aWNlLT5pZCAmIDB4ZikpOworCisJdHAgPSAmbnAtPnRhcmdldFt0YXJnZXRdOworCisJaWYgKCFzY250bDMgfHwgIShzeGZlciAmIDB4MWYpKQorCQlzY250bDMgPSBucC0+cnZfc2NudGwzOworCXNjbnRsMyA9IChzY250bDMgJiAweGYwKSB8ICh0cC0+d3ZhbCAmIEVXUykgfCAobnAtPnJ2X3NjbnRsMyAmIDB4MDcpOworCisJLyoKKwkqKglEZWR1Y2UgdGhlIHZhbHVlIG9mIGNvbnRyb2xsZXIgc3luYyBwZXJpb2QgZnJvbSBzY250bDMuCisJKioJcGVyaW9kIGlzIGluIHRlbnRocyBvZiBuYW5vLXNlY29uZHMuCisJKi8KKworCWlkaXYgPSAoKHNjbnRsMyA+PiA0KSAmIDB4Nyk7CisJaWYgKChzeGZlciAmIDB4MWYpICYmIGlkaXYpCisJCXRwLT5wZXJpb2QgPSAoKChzeGZlcj4+NSkrNCkqZGl2XzEwTVtpZGl2LTFdKS9ucC0+Y2xvY2tfa2h6OworCWVsc2UKKwkJdHAtPnBlcmlvZCA9IDB4ZmZmZjsKKworCS8qIFN0b3AgdGhlcmUgaWYgc3luYyBwYXJhbWV0ZXJzIGFyZSB1bmNoYW5nZWQgKi8KKwlpZiAodHAtPnN2YWwgPT0gc3hmZXIgJiYgdHAtPnd2YWwgPT0gc2NudGwzKQorCQlyZXR1cm47CisJdHAtPnN2YWwgPSBzeGZlcjsKKwl0cC0+d3ZhbCA9IHNjbnRsMzsKKworCWlmIChzeGZlciAmIDB4MDFmKSB7CisJCS8qIERpc2FibGUgZXh0ZW5kZWQgU3JlcS9TYWNrIGZpbHRlcmluZyAqLworCQlpZiAodHAtPnBlcmlvZCA8PSAyMDAwKQorCQkJT1VUT0ZGQihuY19zdGVzdDIsIEVYVCk7CisJfQorIAorCXNwaV9kaXNwbGF5X3hmZXJfYWdyZWVtZW50KHRwLT5zdGFyZ2V0KTsKKworCS8qCisJKioJc2V0IGFjdHVhbCB2YWx1ZSBhbmQgc3luY19zdGF0dXMKKwkqKglwYXRjaCBBTEwgY2NicyBvZiB0aGlzIHRhcmdldC4KKwkqLworCW5jcl9zZXRfc3luY193aWRlX3N0YXR1cyhucCwgdGFyZ2V0KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJU3dpdGNoIHdpZGUgbW9kZSBmb3IgY3VycmVudCBqb2IgYW5kIGl0J3MgdGFyZ2V0CisqKglTQ1NJIHNwZWNzIHNheTogYSBTQ1NJIGRldmljZSB0aGF0IGFjY2VwdHMgYSBXRFRSIAorKioJbWVzc2FnZSBzaGFsbCByZXNldCB0aGUgc3luY2hyb25vdXMgYWdyZWVtZW50IHRvIAorKioJYXN5bmNocm9ub3VzIG1vZGUuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitzdGF0aWMgdm9pZCBuY3Jfc2V0d2lkZSAoc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBjY2IgKmNwLCB1X2NoYXIgd2lkZSwgdV9jaGFyIGFjaykKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBjcC0+Y21kOworCXUxNiB0YXJnZXQgPSBJTkIgKG5jX3NkaWQpICYgMHgwZjsKKwlzdHJ1Y3QgdGNiICp0cDsKKwl1X2NoYXIJc2NudGwzOworCXVfY2hhcglzeGZlcjsKKworCUJVR19PTih0YXJnZXQgIT0gKGNtZC0+ZGV2aWNlLT5pZCAmIDB4ZikpOworCisJdHAgPSAmbnAtPnRhcmdldFt0YXJnZXRdOworCXRwLT53aWRlZG9uZSAgPSAgd2lkZSsxOworCXNjbnRsMyA9ICh0cC0+d3ZhbCAmICh+RVdTKSkgfCAod2lkZSA/IEVXUyA6IDApOworCisJc3hmZXIgPSBhY2sgPyAwIDogdHAtPnN2YWw7CisKKwkvKgorCSoqCSBTdG9wIHRoZXJlIGlmIHN5bmMvd2lkZSBwYXJhbWV0ZXJzIGFyZSB1bmNoYW5nZWQKKwkqLworCWlmICh0cC0+c3ZhbCA9PSBzeGZlciAmJiB0cC0+d3ZhbCA9PSBzY250bDMpIHJldHVybjsKKwl0cC0+c3ZhbCA9IHN4ZmVyOworCXRwLT53dmFsID0gc2NudGwzOworCisJLyoKKwkqKglCZWxscyBhbmQgd2hpc3RsZXMgICA7LSkKKwkqLworCWlmIChib290dmVyYm9zZSA+PSAyKSB7CisJCWRldl9pbmZvKCZjbWQtPmRldmljZS0+c2Rldl90YXJnZXQtPmRldiwgIldJREUgU0NTSSAlc2FibGVkLlxuIiwKKwkJCQkoc2NudGwzICYgRVdTKSA/ICJlbiIgOiAiZGlzIik7CisJfQorCisJLyoKKwkqKglzZXQgYWN0dWFsIHZhbHVlIGFuZCBzeW5jX3N0YXR1cworCSoqCXBhdGNoIEFMTCBjY2JzIG9mIHRoaXMgdGFyZ2V0LgorCSovCisJbmNyX3NldF9zeW5jX3dpZGVfc3RhdHVzKG5wLCB0YXJnZXQpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglTd2l0Y2ggdGFnZ2VkIG1vZGUgZm9yIGEgdGFyZ2V0LgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworc3RhdGljIHZvaWQgbmNyX3NldHVwX3RhZ3MgKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJdW5zaWduZWQgY2hhciB0biA9IHNkZXYtPmlkLCBsbiA9IHNkZXYtPmx1bjsKKwlzdHJ1Y3QgdGNiICp0cCA9ICZucC0+dGFyZ2V0W3RuXTsKKwlzdHJ1Y3QgbGNiICpscCA9IHRwLT5scFtsbl07CisJdV9jaGFyICAgcmVxdGFncywgbWF4ZGVwdGg7CisKKwkvKgorCSoqCUp1c3QgaW4gY2FzZSAuLi4KKwkqLworCWlmICgoIXRwKSB8fCAoIWxwKSB8fCAhc2RldikKKwkJcmV0dXJuOworCisJLyoKKwkqKglJZiBTQ1NJIGRldmljZSBxdWV1ZSBkZXB0aCBpcyBub3QgeWV0IHNldCwgbGVhdmUgaGVyZS4KKwkqLworCWlmICghbHAtPnNjZGV2X2RlcHRoKQorCQlyZXR1cm47CisKKwkvKgorCSoqCURvbm5vdCBhbGxvdyBtb3JlIHRhZ3MgdGhhbiB0aGUgU0NTSSBkcml2ZXIgY2FuIHF1ZXVlIAorCSoqCWZvciB0aGlzIGRldmljZS4KKwkqKglEb25ub3QgYWxsb3cgbW9yZSB0YWdzIHRoYW4gd2UgY2FuIGhhbmRsZS4KKwkqLworCW1heGRlcHRoID0gbHAtPnNjZGV2X2RlcHRoOworCWlmIChtYXhkZXB0aCA+IGxwLT5tYXhueHMpCW1heGRlcHRoICAgID0gbHAtPm1heG54czsKKwlpZiAobHAtPm1heHRhZ3MgPiBtYXhkZXB0aCkJbHAtPm1heHRhZ3MgPSBtYXhkZXB0aDsKKwlpZiAobHAtPm51bXRhZ3MgPiBtYXhkZXB0aCkJbHAtPm51bXRhZ3MgPSBtYXhkZXB0aDsKKworCS8qCisJKioJb25seSBkZXZpY2VzIGNvbmZvcm1hbnQgdG8gQU5TSSBWZXJzaW9uID49IDIKKwkqKglvbmx5IGRldmljZXMgY2FwYWJsZSBvZiB0YWdnZWQgY29tbWFuZHMKKwkqKglvbmx5IGlmIGVuYWJsZWQgYnkgdXNlciAuLgorCSovCisJaWYgKHNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQgJiYgbHAtPm51bXRhZ3MgPiAxKSB7CisJCXJlcXRhZ3MgPSBscC0+bnVtdGFnczsKKwl9IGVsc2UgeworCQlyZXF0YWdzID0gMTsKKwl9CisKKwkvKgorCSoqCVVwZGF0ZSBtYXggbnVtYmVyIG9mIHRhZ3MKKwkqLworCWxwLT5udW10YWdzID0gcmVxdGFnczsKKwlpZiAobHAtPm51bXRhZ3MgPiBscC0+bWF4dGFncykKKwkJbHAtPm1heHRhZ3MgPSBscC0+bnVtdGFnczsKKworCS8qCisJKioJSWYgd2Ugd2FudCB0byBzd2l0Y2ggdGFnIG1vZGUsIHdlIG11c3Qgd2FpdCAKKwkqKglmb3Igbm8gQ0NCIHRvIGJlIGFjdGl2ZS4KKwkqLworCWlmCShyZXF0YWdzID4gMSAmJiBscC0+dXNldGFncykgewkgLyogU3RheSBpbiB0YWdnZWQgbW9kZSAgICAqLworCQlpZiAobHAtPnF1ZXVlZGVwdGggPT0gcmVxdGFncykJIC8qIEFscmVhZHkgYW5ub3VuY2VkCSAgICovCisJCQlyZXR1cm47CisJCWxwLT5xdWV1ZWRlcHRoCT0gcmVxdGFnczsKKwl9CisJZWxzZSBpZgkocmVxdGFncyA8PSAxICYmICFscC0+dXNldGFncykgeyAvKiBTdGF5IGluIHVudGFnZ2VkIG1vZGUgICovCisJCWxwLT5xdWV1ZWRlcHRoCT0gcmVxdGFnczsKKwkJcmV0dXJuOworCX0KKwllbHNlIHsJCQkJCSAvKiBXYW50IHRvIHN3aXRjaCB0YWcgbW9kZSAqLworCQlpZiAobHAtPmJ1c3ljY2JzKQkJIC8qIElmIG5vdCB5ZXQgc2FmZSwgcmV0dXJuICovCisJCQlyZXR1cm47CisJCWxwLT5xdWV1ZWRlcHRoCT0gcmVxdGFnczsKKwkJbHAtPnVzZXRhZ3MJPSByZXF0YWdzID4gMSA/IDEgOiAwOworCX0KKworCS8qCisJKioJUGF0Y2ggdGhlIGx1biBtaW5pLXNjcmlwdCwgYWNjb3JkaW5nIHRvIHRhZyBtb2RlLgorCSovCisJbHAtPmp1bXBfdGFnLmxfcGFkZHIgPSBscC0+dXNldGFncz8KKwkJCWNwdV90b19zY3IoTkNCX1NDUklQVF9QSFlTKG5wLCByZXNlbF90YWcpKSA6CisJCQljcHVfdG9fc2NyKE5DQl9TQ1JJUFRfUEhZUyhucCwgcmVzZWxfbm90YWcpKTsKKworCS8qCisJKioJQW5ub3VuY2UgY2hhbmdlIHRvIHVzZXIuCisJKi8KKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJaWYgKGxwLT51c2V0YWdzKSB7CisJCQlkZXZfaW5mbygmc2Rldi0+c2Rldl9nZW5kZXYsCisJCQkJInRhZ2dlZCBjb21tYW5kIHF1ZXVlIGRlcHRoIHNldCB0byAlZFxuIiwKKwkJCQlyZXF0YWdzKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9pbmZvKCZzZGV2LT5zZGV2X2dlbmRldiwKKwkJCQkJInRhZ2dlZCBjb21tYW5kIHF1ZXVlaW5nIGRpc2FibGVkXG4iKTsKKwkJfQorCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioKKyoqCW5jciB0aW1lb3V0IGhhbmRsZXIuCisqKgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCU1pc3VzZWQgdG8ga2VlcCB0aGUgZHJpdmVyIHJ1bm5pbmcgd2hlbgorKioJaW50ZXJydXB0cyBhcmUgbm90IGNvbmZpZ3VyZWQgY29ycmVjdGx5LgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworc3RhdGljIHZvaWQgbmNyX3RpbWVvdXQgKHN0cnVjdCBuY2IgKm5wKQoreworCXVfbG9uZwl0aGlzdGltZSA9IGt0aW1lX2dldCgwKTsKKworCS8qCisJKioJSWYgcmVsZWFzZSBwcm9jZXNzIGluIHByb2dyZXNzLCBsZXQncyBnbworCSoqCVNldCB0aGUgcmVsZWFzZSBzdGFnZSBmcm9tIDEgdG8gMiB0byBzeW5jaHJvbml6ZQorCSoqCXdpdGggdGhlIHJlbGVhc2UgcHJvY2Vzcy4KKwkqLworCisJaWYgKG5wLT5yZWxlYXNlX3N0YWdlKSB7CisJCWlmIChucC0+cmVsZWFzZV9zdGFnZSA9PSAxKSBucC0+cmVsZWFzZV9zdGFnZSA9IDI7CisJCXJldHVybjsKKwl9CisKKwlucC0+dGltZXIuZXhwaXJlcyA9IGt0aW1lX2dldChTQ1NJX05DUl9USU1FUl9JTlRFUlZBTCk7CisJYWRkX3RpbWVyKCZucC0+dGltZXIpOworCisJLyoKKwkqKglJZiB3ZSBhcmUgcmVzZXR0aW5nIHRoZSBuY3IsIHdhaXQgZm9yIHNldHRsZV90aW1lIGJlZm9yZSAKKwkqKgljbGVhcmluZyBpdC4gVGhlbiBjb21tYW5kIHByb2Nlc3Npbmcgd2lsbCBiZSByZXN1bWVkLgorCSovCisJaWYgKG5wLT5zZXR0bGVfdGltZSkgeworCQlpZiAobnAtPnNldHRsZV90aW1lIDw9IHRoaXN0aW1lKSB7CisJCQlpZiAoYm9vdHZlcmJvc2UgPiAxKQorCQkJCXByaW50aygiJXM6IGNvbW1hbmQgcHJvY2Vzc2luZyByZXN1bWVkXG4iLCBuY3JfbmFtZShucCkpOworCQkJbnAtPnNldHRsZV90aW1lCT0gMDsKKwkJCW5wLT5kaXNjCT0gMTsKKwkJCXJlcXVldWVfd2FpdGluZ19saXN0KG5wKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyoKKwkqKglTaW5jZSB0aGUgZ2VuZXJpYyBzY3NpIGRyaXZlciBvbmx5IGFsbG93cyB1cyAwLjUgc2Vjb25kIAorCSoqCXRvIHBlcmZvcm0gYWJvcnQgb2YgYSBjb21tYW5kLCB3ZSBtdXN0IGxvb2sgYXQgY2NicyBhYm91dCAKKwkqKglldmVyeSAwLjI1IHNlY29uZC4KKwkqLworCWlmIChucC0+bGFzdHRpbWUgKyA0KkhaIDwgdGhpc3RpbWUpIHsKKwkJLyoKKwkJKioJYmxvY2sgbmNyIGludGVycnVwdHMKKwkJKi8KKwkJbnAtPmxhc3R0aW1lID0gdGhpc3RpbWU7CisJfQorCisjaWZkZWYgU0NTSV9OQ1JfQlJPS0VOX0lOVFIKKwlpZiAoSU5CKG5jX2lzdGF0KSAmIChJTlRGfFNJUHxESVApKSB7CisKKwkJLyoKKwkJKioJUHJvY2VzcyBwZW5kaW5nIGludGVycnVwdHMuCisJCSovCisJCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1RJTlkpIHByaW50ayAoInsiKTsKKwkJbmNyX2V4Y2VwdGlvbiAobnApOworCQlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19USU5ZKSBwcmludGsgKCJ9Iik7CisJfQorI2VuZGlmIC8qIFNDU0lfTkNSX0JST0tFTl9JTlRSICovCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCWxvZyBtZXNzYWdlIGZvciByZWFsIGhhcmQgZXJyb3JzCisqKgorKioJIm5jcjAgdGFyZyAwPzogRVJST1IgKGRzOnNpKSAoc28tc2ktc2QpIChzeGZlci9zY250bDMpIEAgbmFtZSAoZHNwOmRiYykuIgorKioJIgkgICAgICByZWc6IHIwIHIxIHIyIHIzIHI0IHI1IHI2IC4uLi4uIHJmLiIKKyoqCisqKglleGNlcHRpb24gcmVnaXN0ZXI6CisqKgkJZHM6CWRzdGF0CisqKgkJc2k6CXNpc3QKKyoqCisqKglTQ1NJIGJ1cyBsaW5lczoKKyoqCQlzbzoJY29udHJvbCBsaW5lcyBhcyBkcml2ZXIgYnkgTkNSLgorKioJCXNpOgljb250cm9sIGxpbmVzIGFzIHNlZW4gYnkgTkNSLgorKioJCXNkOglzY3NpIGRhdGEgbGluZXMgYXMgc2VlbiBieSBOQ1IuCisqKgorKioJd2lkZS9mYXN0bW9kZToKKyoqCQlzeGZlcjoJKHNlZSB0aGUgbWFudWFsKQorKioJCXNjbnRsMzoJKHNlZSB0aGUgbWFudWFsKQorKioKKyoqCWN1cnJlbnQgc2NyaXB0IGNvbW1hbmQ6CisqKgkJZHNwOglzY3JpcHQgYWRkcmVzcyAocmVsYXRpdmUgdG8gc3RhcnQgb2Ygc2NyaXB0KS4KKyoqCQlkYmM6CWZpcnN0IHdvcmQgb2Ygc2NyaXB0IGNvbW1hbmQuCisqKgorKioJRmlyc3QgMTYgcmVnaXN0ZXIgb2YgdGhlIGNoaXA6CisqKgkJcjAuLnJmCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitzdGF0aWMgdm9pZCBuY3JfbG9nX2hhcmRfZXJyb3Ioc3RydWN0IG5jYiAqbnAsIHUxNiBzaXN0LCB1X2NoYXIgZHN0YXQpCit7CisJdTMyCWRzcDsKKwlpbnQJc2NyaXB0X29mczsKKwlpbnQJc2NyaXB0X3NpemU7CisJY2hhcgkqc2NyaXB0X25hbWU7CisJdV9jaGFyCSpzY3JpcHRfYmFzZTsKKwlpbnQJaTsKKworCWRzcAk9IElOTCAobmNfZHNwKTsKKworCWlmIChkc3AgPiBucC0+cF9zY3JpcHQgJiYgZHNwIDw9IG5wLT5wX3NjcmlwdCArIHNpemVvZihzdHJ1Y3Qgc2NyaXB0KSkgeworCQlzY3JpcHRfb2ZzCT0gZHNwIC0gbnAtPnBfc2NyaXB0OworCQlzY3JpcHRfc2l6ZQk9IHNpemVvZihzdHJ1Y3Qgc2NyaXB0KTsKKwkJc2NyaXB0X2Jhc2UJPSAodV9jaGFyICopIG5wLT5zY3JpcHQwOworCQlzY3JpcHRfbmFtZQk9ICJzY3JpcHQiOworCX0KKwllbHNlIGlmIChucC0+cF9zY3JpcHRoIDwgZHNwICYmIAorCQkgZHNwIDw9IG5wLT5wX3NjcmlwdGggKyBzaXplb2Yoc3RydWN0IHNjcmlwdGgpKSB7CisJCXNjcmlwdF9vZnMJPSBkc3AgLSBucC0+cF9zY3JpcHRoOworCQlzY3JpcHRfc2l6ZQk9IHNpemVvZihzdHJ1Y3Qgc2NyaXB0aCk7CisJCXNjcmlwdF9iYXNlCT0gKHVfY2hhciAqKSBucC0+c2NyaXB0aDA7CisJCXNjcmlwdF9uYW1lCT0gInNjcmlwdGgiOworCX0gZWxzZSB7CisJCXNjcmlwdF9vZnMJPSBkc3A7CisJCXNjcmlwdF9zaXplCT0gMDsKKwkJc2NyaXB0X2Jhc2UJPSBOVUxMOworCQlzY3JpcHRfbmFtZQk9ICJtZW0iOworCX0KKworCXByaW50ayAoIiVzOiVkOiBFUlJPUiAoJXg6JXgpICgleC0leC0leCkgKCV4LyV4KSBAICglcyAleDolMDh4KS5cbiIsCisJCW5jcl9uYW1lIChucCksICh1bnNpZ25lZClJTkIgKG5jX3NkaWQpJjB4MGYsIGRzdGF0LCBzaXN0LAorCQkodW5zaWduZWQpSU5CIChuY19zb2NsKSwgKHVuc2lnbmVkKUlOQiAobmNfc2JjbCksICh1bnNpZ25lZClJTkIgKG5jX3NiZGwpLAorCQkodW5zaWduZWQpSU5CIChuY19zeGZlciksKHVuc2lnbmVkKUlOQiAobmNfc2NudGwzKSwgc2NyaXB0X25hbWUsIHNjcmlwdF9vZnMsCisJCSh1bnNpZ25lZClJTkwgKG5jX2RiYykpOworCisJaWYgKCgoc2NyaXB0X29mcyAmIDMpID09IDApICYmCisJICAgICh1bnNpZ25lZClzY3JpcHRfb2ZzIDwgc2NyaXB0X3NpemUpIHsKKwkJcHJpbnRrICgiJXM6IHNjcmlwdCBjbWQgPSAlMDh4XG4iLCBuY3JfbmFtZShucCksCisJCQlzY3JfdG9fY3B1KChpbnQpICoobmNyY21kICopKHNjcmlwdF9iYXNlICsgc2NyaXB0X29mcykpKTsKKwl9CisKKwlwcmludGsgKCIlczogcmVnZHVtcDoiLCBuY3JfbmFtZShucCkpOworCWZvciAoaT0wOyBpPDE2O2krKykKKyAgICAgICAgICAgIHByaW50ayAoIiAlMDJ4IiwgKHVuc2lnbmVkKUlOQl9PRkYoaSkpOworCXByaW50ayAoIi5cbiIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCW5jciBjaGlwIGV4Y2VwdGlvbiBoYW5kbGVyLgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJSW4gbm9ybWFsIGNhc2VzLCBpbnRlcnJ1cHQgY29uZGl0aW9ucyBvY2N1ciBvbmUgYXQgYSAKKyoqCXRpbWUuIFRoZSBuY3IgaXMgYWJsZSB0byBzdGFjayBpbiBzb21lIGV4dHJhIHJlZ2lzdGVycyAKKyoqCW90aGVyIGludGVycnVwdHMgdGhhdCB3aWxsIG9jY3VycyBhZnRlciB0aGUgZmlyc3Qgb25lLgorKioJQnV0IHNldmVyYWxsIGludGVycnVwdHMgbWF5IG9jY3VyIGF0IHRoZSBzYW1lIHRpbWUuCisqKgorKioJV2UgcHJvYmFibHkgc2hvdWxkIG9ubHkgdHJ5IHRvIGRlYWwgd2l0aCB0aGUgbm9ybWFsIAorKioJY2FzZSwgYnV0IGl0IHNlZW1zIHRoYXQgbXVsdGlwbGUgaW50ZXJydXB0cyBvY2N1ciBpbiAKKyoqCXNvbWUgY2FzZXMgdGhhdCBhcmUgbm90IGFibm9ybWFsIGF0IGFsbC4KKyoqCisqKglUaGUgbW9zdCBmcmVxdWVudCBpbnRlcnJ1cHQgY29uZGl0aW9uIGlzIFBoYXNlIE1pc21hdGNoLgorKioJV2Ugc2hvdWxkIHdhbnQgdG8gc2VydmljZSB0aGlzIGludGVycnVwdCBxdWlja2x5LgorKioJQSBTQ1NJIHBhcml0eSBlcnJvciBtYXkgYmUgZGVsaXZlcmVkIGF0IHRoZSBzYW1lIHRpbWUuCisqKglUaGUgU0lSIGludGVycnVwdCBpcyBub3QgdmVyeSBmcmVxdWVudCBpbiB0aGlzIGRyaXZlciwgCisqKglzaW5jZSB0aGUgSU5URkxZIGlzIGxpa2VseSB1c2VkIGZvciBjb21tYW5kIGNvbXBsZXRpb24gCisqKglzaWduYWxpbmcuCisqKglUaGUgU2VsZWN0aW9uIFRpbWVvdXQgaW50ZXJydXB0IG1heSBiZSB0cmlnZ2VyZWQgd2l0aCAKKyoqCUlJRCBhbmQvb3IgVURDLgorKioJVGhlIFNCTUMgaW50ZXJydXB0IChTQ1NJIEJ1cyBNb2RlIENoYW5nZSkgbWF5IHByb2JhYmx5IAorKioJb2NjdXIgYXQgYW55IHRpbWUuCisqKgorKioJVGhpcyBoYW5kbGVyIHRyeSB0byBkZWFsIGFzIGNsZXZlcmx5IGFzIHBvc3NpYmxlIHdpdGggYWxsCisqKgl0aGUgYWJvdmUuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK3ZvaWQgbmNyX2V4Y2VwdGlvbiAoc3RydWN0IG5jYiAqbnApCit7CisJdV9jaGFyCWlzdGF0LCBkc3RhdDsKKwl1MTYJc2lzdDsKKwlpbnQJaTsKKworCS8qCisJKioJaW50ZXJydXB0IG9uIHRoZSBmbHkgPworCSoqCVNpbmNlIHRoZSBnbG9iYWwgaGVhZGVyIG1heSBiZSBjb3BpZWQgYmFjayB0byBhIENDQiAKKwkqKgl1c2luZyBhIHBvc3RlZCBQQ0kgbWVtb3J5IHdyaXRlLCB0aGUgbGFzdCBvcGVyYXRpb24gb24gCisJKioJdGhlIGlzdGF0IHJlZ2lzdGVyIGlzIGEgUkVBRCBpbiBvcmRlciB0byBmbHVzaCBwb3N0ZWQgCisJKioJUENJIHdyaXRlIGNvbW1hbmRzLgorCSovCisJaXN0YXQgPSBJTkIgKG5jX2lzdGF0KTsKKwlpZiAoaXN0YXQgJiBJTlRGKSB7CisJCU9VVEIgKG5jX2lzdGF0LCAoaXN0YXQgJiBTSUdQKSB8IElOVEYpOworCQlpc3RhdCA9IElOQiAobmNfaXN0YXQpOworCQlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19USU5ZKSBwcmludGsgKCJGICIpOworCQluY3Jfd2FrZXVwX2RvbmUgKG5wKTsKKwl9CisKKwlpZiAoIShpc3RhdCAmIChTSVB8RElQKSkpCisJCXJldHVybjsKKworCWlmIChpc3RhdCAmIENBQlJUKQorCQlPVVRCIChuY19pc3RhdCwgQ0FCUlQpOworCisJLyoKKwkqKglTdGVpbmJhY2gncyBHdWlkZWxpbmUgZm9yIFN5c3RlbXMgUHJvZ3JhbW1pbmc6CisJKioJTmV2ZXIgdGVzdCBmb3IgYW4gZXJyb3IgY29uZGl0aW9uIHlvdSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUuCisJKi8KKworCXNpc3QgID0gKGlzdGF0ICYgU0lQKSA/IElOVyAobmNfc2lzdCkgIDogMDsKKwlkc3RhdCA9IChpc3RhdCAmIERJUCkgPyBJTkIgKG5jX2RzdGF0KSA6IDA7CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19USU5ZKQorCQlwcmludGsgKCI8JWR8JXg6JXh8JXg6JXg+IiwKKwkJCShpbnQpSU5CKG5jX3NjcjApLAorCQkJZHN0YXQsc2lzdCwKKwkJCSh1bnNpZ25lZClJTkwobmNfZHNwKSwKKwkJCSh1bnNpZ25lZClJTkwobmNfZGJjKSk7CisKKwkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJKioJRmlyc3QsIGludGVycnVwdHMgd2Ugd2FudCB0byBzZXJ2aWNlIGNsZWFubHkuCisJKioKKwkqKglQaGFzZSBtaXNtYXRjaCBpcyB0aGUgbW9zdCBmcmVxdWVudCBpbnRlcnJ1cHQsIGFuZCAKKwkqKglzbyB3ZSBoYXZlIHRvIHNlcnZpY2UgaXQgYXMgcXVpY2tseSBhbmQgYXMgY2xlYW5seSAKKwkqKglhcyBwb3NzaWJsZS4KKwkqKglQcm9ncmFtbWVkIGludGVycnVwdHMgYXJlIHJhcmVseSB1c2VkIGluIHRoaXMgZHJpdmVyLAorCSoqCWJ1dCB3ZSBtdXN0IGhhbmRsZSB0aGVtIGNsZWFubHkgYW55d2F5LgorCSoqCVdlIHRyeSB0byBkZWFsIHdpdGggUEFSIGFuZCBTQk1DIGNvbWJpbmVkIHdpdGggCisJKioJc29tZSBvdGhlciBpbnRlcnJ1cHQocykuCisJKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkqLworCisJaWYgKCEoc2lzdCAgJiAoU1RPfEdFTnxIVEh8U0dFfFVEQ3xSU1QpKSAmJgorCSAgICAhKGRzdGF0ICYgKE1EUEV8QkZ8QUJSVHxJSUQpKSkgeworCQlpZiAoKHNpc3QgJiBTQk1DKSAmJiBuY3JfaW50X3NibWMgKG5wKSkKKwkJCXJldHVybjsKKwkJaWYgKChzaXN0ICYgUEFSKSAgJiYgbmNyX2ludF9wYXIgIChucCkpCisJCQlyZXR1cm47CisJCWlmIChzaXN0ICYgTUEpIHsKKwkJCW5jcl9pbnRfbWEgKG5wKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoZHN0YXQgJiBTSVIpIHsKKwkJCW5jcl9pbnRfc2lyIChucCk7CisJCQlyZXR1cm47CisJCX0KKwkJLyoKKwkJKiogIERFTCAzOTcgLSA1M0M4NzUgUmV2IDMgLSBQYXJ0IE51bWJlciA2MDktMDM5MjQxMCAtIElURU0gMi4KKwkJKi8KKwkJaWYgKCEoc2lzdCAmIChTQk1DfFBBUikpICYmICEoZHN0YXQgJiBTU0kpKSB7CisJCQlwcmludGsoCSIlczogdW5rbm93biBpbnRlcnJ1cHQocykgaWdub3JlZCwgIgorCQkJCSJJU1RBVD0leCBEU1RBVD0leCBTSVNUPSV4XG4iLAorCQkJCW5jcl9uYW1lKG5wKSwgaXN0YXQsIGRzdGF0LCBzaXN0KTsKKwkJCXJldHVybjsKKwkJfQorCQlPVVRPTkJfU1REICgpOworCQlyZXR1cm47CisJfQorCisJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSoqCU5vdywgaW50ZXJydXB0cyB0aGF0IG5lZWQgc29tZSBmaXhpbmcgdXAuCisJKioJT3JkZXIgYW5kIG11bHRpcGxlIGludGVycnVwdHMgaXMgc28gbGVzcyBpbXBvcnRhbnQuCisJKioKKwkqKglJZiBTUlNUIGhhcyBiZWVuIGFzc2VydGVkLCB3ZSBqdXN0IHJlc2V0IHRoZSBjaGlwLgorCSoqCisJKioJU2VsZWN0aW9uIGlzIGludGlyZWx5IGhhbmRsZWQgYnkgdGhlIGNoaXAuIElmIHRoZSAKKwkqKgljaGlwIHNheXMgU1RPLCB3ZSB0cnVzdCBpdC4gU2VlbXMgc29tZSBvdGhlciAKKwkqKglpbnRlcnJ1cHRzIG1heSBvY2N1ciBhdCB0aGUgc2FtZSB0aW1lIChVREMsIElJRCksIHNvIAorCSoqCXdlIGlnbm9yZSB0aGVtLiBJbiBhbnkgY2FzZSB3ZSBkbyBlbm91Z2ggZml4LXVwIAorCSoqCWluIHRoZSBzZXJ2aWNlIHJvdXRpbmUuCisJKioJV2UganVzdCBleGNsdWRlIHNvbWUgZmF0YWwgZG1hIGVycm9ycy4KKwkqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSovCisKKwlpZiAoc2lzdCAmIFJTVCkgeworCQluY3JfaW5pdCAobnAsIDEsIGJvb3R2ZXJib3NlID8gInNjc2kgcmVzZXQiIDogTlVMTCwgSFNfUkVTRVQpOworCQlyZXR1cm47CisJfQorCisJaWYgKChzaXN0ICYgU1RPKSAmJgorCQkhKGRzdGF0ICYgKE1EUEV8QkZ8QUJSVCkpKSB7CisJLyoKKwkqKglERUwgMzk3IC0gNTNDODc1IFJldiAzIC0gUGFydCBOdW1iZXIgNjA5LTAzOTI0MTAgLSBJVEVNIDEuCisJKi8KKwkJT1VUT05CIChuY19jdGVzdDMsIENMRik7CisKKwkJbmNyX2ludF9zdG8gKG5wKTsKKwkJcmV0dXJuOworCX0KKworCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJKioJTm93LCBpbnRlcnJ1cHRzIHdlIGFyZSBub3QgYWJsZSB0byByZWNvdmVyIGNsZWFubHkuCisJKioJKEF0IGxlYXN0IGZvciB0aGUgbW9tZW50KS4KKwkqKgorCSoqCURvIHRoZSByZWdpc3RlciBkdW1wLgorCSoqCUxvZyBtZXNzYWdlIGZvciByZWFsIGhhcmQgZXJyb3JzLgorCSoqCUNsZWFyIGFsbCBmaWZvcy4KKwkqKglGb3IgTURQRSwgQkYsIEFCT1JULCBJSUQsIFNHRSBhbmQgSFRIIHdlIHJlc2V0IHRoZSAKKwkqKglCVVMgYW5kIHRoZSBjaGlwLgorCSoqCVdlIGFyZSBtb3JlIHNvZnQgZm9yIFVEQy4KKwkqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSovCisKKwlpZiAoa3RpbWVfZXhwKG5wLT5yZWd0aW1lKSkgeworCQlucC0+cmVndGltZSA9IGt0aW1lX2dldCgxMCpIWik7CisJCWZvciAoaSA9IDA7IGk8c2l6ZW9mKG5wLT5yZWdkdW1wKTsgaSsrKQorCQkJKChjaGFyKikmbnAtPnJlZ2R1bXApW2ldID0gSU5CX09GRihpKTsKKwkJbnAtPnJlZ2R1bXAubmNfZHN0YXQgPSBkc3RhdDsKKwkJbnAtPnJlZ2R1bXAubmNfc2lzdCAgPSBzaXN0OworCX0KKworCW5jcl9sb2dfaGFyZF9lcnJvcihucCwgc2lzdCwgZHN0YXQpOworCisJcHJpbnRrICgiJXM6IGhhdmUgdG8gY2xlYXIgZmlmb3MuXG4iLCBuY3JfbmFtZSAobnApKTsKKwlPVVRCIChuY19zdGVzdDMsIFRFfENTRik7CisJT1VUT05CIChuY19jdGVzdDMsIENMRik7CisKKwlpZiAoKHNpc3QgJiAoU0dFKSkgfHwKKwkJKGRzdGF0ICYgKE1EUEV8QkZ8QUJSVHxJSUQpKSkgeworCQluY3Jfc3RhcnRfcmVzZXQobnApOworCQlyZXR1cm47CisJfQorCisJaWYgKHNpc3QgJiBIVEgpIHsKKwkJcHJpbnRrICgiJXM6IGhhbmRzaGFrZSB0aW1lb3V0XG4iLCBuY3JfbmFtZShucCkpOworCQluY3Jfc3RhcnRfcmVzZXQobnApOworCQlyZXR1cm47CisJfQorCisJaWYgKHNpc3QgJiBVREMpIHsKKwkJcHJpbnRrICgiJXM6IHVuZXhwZWN0ZWQgZGlzY29ubmVjdFxuIiwgbmNyX25hbWUobnApKTsKKwkJT1VUQiAoSFNfUFJULCBIU19VTkVYUEVDVEVEKTsKKwkJT1VUTF9EU1AgKE5DQl9TQ1JJUFRfUEhZUyAobnAsIGNsZWFudXApKTsKKwkJcmV0dXJuOworCX0KKworCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJKioJV2UganVzdCBtaXNzIHRoZSBjYXVzZSBvZiB0aGUgaW50ZXJydXB0LiA6KAorCSoqCVByaW50IGEgbWVzc2FnZS4gVGhlIHRpbWVvdXQgd2lsbCBkbyB0aGUgcmVhbCB3b3JrLgorCSoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJKi8KKwlwcmludGsgKCIlczogdW5rbm93biBpbnRlcnJ1cHRcbiIsIG5jcl9uYW1lKG5wKSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCW5jciBjaGlwIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBzZWxlY3Rpb24gdGltZW91dAorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCVRoZXJlIHNlZW1zIHRvIGJlIGEgYnVnIGluIHRoZSA1M2M4MTAuCisqKglBbHRob3VnaCBhIFNUTy1JbnRlcnJ1cHQgaXMgcGVuZGluZywKKyoqCWl0IGNvbnRpbnVlcyBleGVjdXRpbmcgc2NyaXB0IGNvbW1hbmRzLgorKioJQnV0IGl0IHdpbGwgZmFpbCBhbmQgaW50ZXJydXB0IChJSUQpIG9uCisqKgl0aGUgbmV4dCBpbnN0cnVjdGlvbiB3aGVyZSBpdCdzIGxvb2tpbmcKKyoqCWZvciBhIHZhbGlkIHBoYXNlLgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZCBuY3JfaW50X3N0byAoc3RydWN0IG5jYiAqbnApCit7CisJdV9sb25nIGRzYTsKKwlzdHJ1Y3QgY2NiICpjcDsKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19USU5ZKSBwcmludGsgKCJUIik7CisKKwkvKgorCSoqCWxvb2sgZm9yIGNjYiBhbmQgc2V0IHRoZSBzdGF0dXMuCisJKi8KKworCWRzYSA9IElOTCAobmNfZHNhKTsKKwljcCA9IG5wLT5jY2I7CisJd2hpbGUgKGNwICYmIChDQ0JfUEhZUyAoY3AsIHBoeXMpICE9IGRzYSkpCisJCWNwID0gY3AtPmxpbmtfY2NiOworCisJaWYgKGNwKSB7CisJCWNwLT4gaG9zdF9zdGF0dXMgPSBIU19TRUxfVElNRU9VVDsKKwkJbmNyX2NvbXBsZXRlIChucCwgY3ApOworCX0KKworCS8qCisJKioJcmVwYWlyIHN0YXJ0IHF1ZXVlIGFuZCBqdW1wIHRvIHN0YXJ0IHBvaW50LgorCSovCisKKwlPVVRMX0RTUCAoTkNCX1NDUklQVEhfUEhZUyAobnAsIHN0b19yZXN0YXJ0KSk7CisJcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgluY3IgY2hpcCBleGNlcHRpb24gaGFuZGxlciBmb3IgU0NTSSBidXMgbW9kZSBjaGFuZ2UKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglzcGkyLXIxMiAxMS4yLjMgc2F5cyBhIHRyYW5zY2VpdmVyIG1vZGUgY2hhbmdlIG11c3QgCisqKglnZW5lcmF0ZSBhIHJlc2V0IGV2ZW50IGFuZCBhIGRldmljZSB0aGF0IGRldGVjdHMgYSByZXNldCAKKyoqCWV2ZW50IHNoYWxsIGluaXRpYXRlIGEgaGFyZCByZXNldC4gSXQgc2F5cyBhbHNvIHRoYXQgYQorKioJZGV2aWNlIHRoYXQgZGV0ZWN0cyBhIG1vZGUgY2hhbmdlIHNoYWxsIHNldCBkYXRhIHRyYW5zZmVyIAorKioJbW9kZSB0byBlaWdodCBiaXQgYXN5bmNocm9ub3VzLCBldGMuLi4KKyoqCVNvLCBqdXN0IHJlc2V0dGluZyBzaG91bGQgYmUgZW5vdWdoLgorKioJIAorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworc3RhdGljIGludCBuY3JfaW50X3NibWMgKHN0cnVjdCBuY2IgKm5wKQoreworCXVfY2hhciBzY3NpX21vZGUgPSBJTkIgKG5jX3N0ZXN0NCkgJiBTTU9ERTsKKworCWlmIChzY3NpX21vZGUgIT0gbnAtPnNjc2lfbW9kZSkgeworCQlwcmludGsoIiVzOiBTQ1NJIGJ1cyBtb2RlIGNoYW5nZSBmcm9tICV4IHRvICV4LlxuIiwKKwkJCW5jcl9uYW1lKG5wKSwgbnAtPnNjc2lfbW9kZSwgc2NzaV9tb2RlKTsKKworCQlucC0+c2NzaV9tb2RlID0gc2NzaV9tb2RlOworCisKKwkJLyoKKwkJKioJU3VzcGVuZCBjb21tYW5kIHByb2Nlc3NpbmcgZm9yIDEgc2Vjb25kIGFuZCAKKwkJKioJcmVpbml0aWFsaXplIGFsbCBleGNlcHQgdGhlIGNoaXAuCisJCSovCisJCW5wLT5zZXR0bGVfdGltZQk9IGt0aW1lX2dldCgxKkhaKTsKKwkJbmNyX2luaXQgKG5wLCAwLCBib290dmVyYm9zZSA/ICJzY3NpIG1vZGUgY2hhbmdlIiA6IE5VTEwsIEhTX1JFU0VUKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgluY3IgY2hpcCBleGNlcHRpb24gaGFuZGxlciBmb3IgU0NTSSBwYXJpdHkgZXJyb3IuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworc3RhdGljIGludCBuY3JfaW50X3BhciAoc3RydWN0IG5jYiAqbnApCit7CisJdV9jaGFyCWhzdHMJPSBJTkIgKEhTX1BSVCk7CisJdTMyCWRiYwk9IElOTCAobmNfZGJjKTsKKwl1X2NoYXIJc3N0YXQxCT0gSU5CIChuY19zc3RhdDEpOworCWludCBwaGFzZQk9IC0xOworCWludCBtc2cJCT0gLTE7CisJdTMyIGptcDsKKworCXByaW50aygiJXM6IFNDU0kgcGFyaXR5IGVycm9yIGRldGVjdGVkOiBTQ1IxPSVkIERCQz0leCBTU1RBVDE9JXhcbiIsCisJCW5jcl9uYW1lKG5wKSwgaHN0cywgZGJjLCBzc3RhdDEpOworCisJLyoKKwkgKglJZ25vcmUgdGhlIGludGVycnVwdCBpZiB0aGUgTkNSIGlzIG5vdCBjb25uZWN0ZWQgCisJICoJdG8gdGhlIFNDU0kgYnVzLCBzaW5jZSB0aGUgcmlnaHQgd29yayBzaG91bGQgaGF2ZSAgCisJICoJYmVlbiBkb25lIG9uIHVuZXhwZWN0ZWQgZGlzY29ubmVjdGlvbiBoYW5kbGluZy4KKwkgKi8KKwlpZiAoIShJTkIgKG5jX3NjbnRsMSkgJiBJU0NPTikpCisJCXJldHVybiAwOworCisJLyoKKwkgKglJZiB0aGUgbmV4dXMgaXMgbm90IGNsZWFybHkgaWRlbnRpZmllZCwgcmVzZXQgdGhlIGJ1cy4KKwkgKglXZSB3aWxsIHRyeSB0byBkbyBiZXR0ZXIgbGF0ZXIuCisJICovCisJaWYgKGhzdHMgJiBIU19JTlZBTE1BU0spCisJCWdvdG8gcmVzZXRfYWxsOworCisJLyoKKwkgKglJZiB0aGUgU0NTSSBwYXJpdHkgZXJyb3Igb2NjdXJzIGluIE1TRyBJTiBwaGFzZSwgcHJlcGFyZSBhIAorCSAqCU1TRyBQQVJJVFkgbWVzc2FnZS4gT3RoZXJ3aXNlLCBwcmVwYXJlIGEgSU5JVElBVE9SIERFVEVDVEVEIAorCSAqCUVSUk9SIG1lc3NhZ2UgYW5kIGxldCB0aGUgZGV2aWNlIGRlY2lkZSB0byByZXRyeSB0aGUgY29tbWFuZCAKKwkgKglvciB0byB0ZXJtaW5hdGUgd2l0aCBjaGVjayBjb25kaXRpb24uIElmIHdlIHdlcmUgaW4gTVNHIElOIAorCSAqCXBoYXNlIHdhaXRpbmcgZm9yIHRoZSByZXNwb25zZSBvZiBhIG5lZ290aWF0aW9uLCB3ZSB3aWxsIAorCSAqCWdldCBTSVJfTkVHT19GQUlMRUQgYXQgZGlzcGF0Y2guCisJICovCisJaWYgKCEoZGJjICYgMHhjMDAwMDAwMCkpCisJCXBoYXNlID0gKGRiYyA+PiAyNCkgJiA3OworCWlmIChwaGFzZSA9PSA3KQorCQltc2cgPSBNX1BBUklUWTsKKwllbHNlCisJCW1zZyA9IE1fSURfRVJST1I7CisKKworCS8qCisJICoJSWYgdGhlIE5DUiBzdG9wcGVkIG9uIGEgTU9WRSBeIERBVEFfSU4sIHdlIGp1bXAgdG8gYSAKKwkgKglzY3JpcHQgdGhhdCB3aWxsIGlnbm9yZSBhbGwgZGF0YSBpbiBieXRlcyB1bnRpbCBwaGFzZSAKKwkgKgljaGFuZ2UsIHNpbmNlIHdlIGFyZSBub3Qgc3VyZSB0aGUgY2hpcCB3aWxsIHdhaXQgdGhlIHBoYXNlIAorCSAqCWNoYW5nZSBwcmlvciB0byBkZWxpdmVyaW5nIHRoZSBpbnRlcnJ1cHQuCisJICovCisJaWYgKHBoYXNlID09IDEpCisJCWptcCA9IE5DQl9TQ1JJUFRIX1BIWVMgKG5wLCBwYXJfZXJyX2RhdGFfaW4pOworCWVsc2UKKwkJam1wID0gTkNCX1NDUklQVEhfUEhZUyAobnAsIHBhcl9lcnJfb3RoZXIpOworCisJT1VUT05CIChuY19jdGVzdDMsIENMRiApOwkvKiBjbGVhciBkbWEgZmlmbyAgKi8KKwlPVVRCIChuY19zdGVzdDMsIFRFfENTRik7CS8qIGNsZWFyIHNjc2kgZmlmbyAqLworCisJbnAtPm1zZ291dFswXSA9IG1zZzsKKwlPVVRMX0RTUCAoam1wKTsKKwlyZXR1cm4gMTsKKworcmVzZXRfYWxsOgorCW5jcl9zdGFydF9yZXNldChucCk7CisJcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCisqKgluY3IgY2hpcCBleGNlcHRpb24gaGFuZGxlciBmb3IgcGhhc2UgZXJyb3JzLgorKioKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglXZSBoYXZlIHRvIGNvbnN0cnVjdCBhIG5ldyB0cmFuc2ZlciBkZXNjcmlwdG9yLAorKioJdG8gdHJhbnNmZXIgdGhlIHJlc3Qgb2YgdGhlIGN1cnJlbnQgYmxvY2suCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitzdGF0aWMgdm9pZCBuY3JfaW50X21hIChzdHJ1Y3QgbmNiICpucCkKK3sKKwl1MzIJZGJjOworCXUzMglyZXN0OworCXUzMglkc3A7CisJdTMyCWRzYTsKKwl1MzIJbnh0ZHNwOworCXUzMgluZXd0bXA7CisJdTMyCSp2ZHNwOworCXUzMglvYWRyLCBvbGVuOworCXUzMgkqdGJscDsKKwluY3JjbWQgKm5ld2NtZDsKKwl1X2NoYXIJY21kLCBzYmNsOworCXN0cnVjdCBjY2IgKmNwOworCisJZHNwCT0gSU5MIChuY19kc3ApOworCWRiYwk9IElOTCAobmNfZGJjKTsKKwlzYmNsCT0gSU5CIChuY19zYmNsKTsKKworCWNtZAk9IGRiYyA+PiAyNDsKKwlyZXN0CT0gZGJjICYgMHhmZmZmZmY7CisKKwkvKgorCSoqCVRha2UgaW50byBhY2NvdW50IGRtYSBmaWZvIGFuZCB2YXJpb3VzIGJ1ZmZlcnMgYW5kIGxhdGNoZXMsCisJKioJb25seSBpZiB0aGUgaW50ZXJydXB0ZWQgcGhhc2UgaXMgYW4gT1VUUFVUIHBoYXNlLgorCSovCisKKwlpZiAoKGNtZCAmIDEpID09IDApIHsKKwkJdV9jaGFyCWN0ZXN0NSwgc3MwLCBzczI7CisJCXUxNglkZWx0YTsKKworCQljdGVzdDUgPSAobnAtPnJ2X2N0ZXN0NSAmIERGUykgPyBJTkIgKG5jX2N0ZXN0NSkgOiAwOworCQlpZiAoY3Rlc3Q1ICYgREZTKQorCQkJZGVsdGE9KCgoY3Rlc3Q1IDw8IDgpIHwgKElOQiAobmNfZGZpZm8pICYgMHhmZikpIC0gcmVzdCkgJiAweDNmZjsKKwkJZWxzZQorCQkJZGVsdGE9KElOQiAobmNfZGZpZm8pIC0gcmVzdCkgJiAweDdmOworCisJCS8qCisJCSoqCVRoZSBkYXRhIGluIHRoZSBkbWEgZmlmbyBoYXMgbm90IGJlZW4gdHJhbnNmZXJyZWQgdG8KKwkJKioJdGhlIHRhcmdldCAtPiBhZGQgdGhlIGFtb3VudCB0byB0aGUgcmVzdAorCQkqKglhbmQgY2xlYXIgdGhlIGRhdGEuCisJCSoqCUNoZWNrIHRoZSBzc3RhdDIgcmVnaXN0ZXIgaW4gY2FzZSBvZiB3aWRlIHRyYW5zZmVyLgorCQkqLworCisJCXJlc3QgKz0gZGVsdGE7CisJCXNzMCAgPSBJTkIgKG5jX3NzdGF0MCk7CisJCWlmIChzczAgJiBPTEYpIHJlc3QrKzsKKwkJaWYgKHNzMCAmIE9SRikgcmVzdCsrOworCQlpZiAoSU5CKG5jX3NjbnRsMykgJiBFV1MpIHsKKwkJCXNzMiA9IElOQiAobmNfc3N0YXQyKTsKKwkJCWlmIChzczIgJiBPTEYxKSByZXN0Kys7CisJCQlpZiAoc3MyICYgT1JGMSkgcmVzdCsrOworCQl9CisKKwkJaWYgKERFQlVHX0ZMQUdTICYgKERFQlVHX1RJTll8REVCVUdfUEhBU0UpKQorCQkJcHJpbnRrICgiUCV4JXggUkw9JWQgRD0lZCBTUzA9JXggIiwgY21kJjcsIHNiY2wmNywKKwkJCQkodW5zaWduZWQpIHJlc3QsICh1bnNpZ25lZCkgZGVsdGEsIHNzMCk7CisKKwl9IGVsc2UJeworCQlpZiAoREVCVUdfRkxBR1MgJiAoREVCVUdfVElOWXxERUJVR19QSEFTRSkpCisJCQlwcmludGsgKCJQJXgleCBSTD0lZCAiLCBjbWQmNywgc2JjbCY3LCByZXN0KTsKKwl9CisKKwkvKgorCSoqCUNsZWFyIGZpZm9zLgorCSovCisJT1VUT05CIChuY19jdGVzdDMsIENMRiApOwkvKiBjbGVhciBkbWEgZmlmbyAgKi8KKwlPVVRCIChuY19zdGVzdDMsIFRFfENTRik7CS8qIGNsZWFyIHNjc2kgZmlmbyAqLworCisJLyoKKwkqKglsb2NhdGUgbWF0Y2hpbmcgY3AuCisJKioJaWYgdGhlIGludGVycnVwdGVkIHBoYXNlIGlzIERBVEEgSU4gb3IgREFUQSBPVVQsCisJKioJdHJ1c3QgdGhlIGdsb2JhbCBoZWFkZXIuCisJKi8KKwlkc2EgPSBJTkwgKG5jX2RzYSk7CisJaWYgKCEoY21kICYgNikpIHsKKwkJY3AgPSBucC0+aGVhZGVyLmNwOworCQlpZiAoQ0NCX1BIWVMoY3AsIHBoeXMpICE9IGRzYSkKKwkJCWNwID0gTlVMTDsKKwl9IGVsc2UgeworCQljcCAgPSBucC0+Y2NiOworCQl3aGlsZSAoY3AgJiYgKENDQl9QSFlTIChjcCwgcGh5cykgIT0gZHNhKSkKKwkJCWNwID0gY3AtPmxpbmtfY2NiOworCX0KKworCS8qCisJKioJdHJ5IHRvIGZpbmQgdGhlIGludGVycnVwdGVkIHNjcmlwdCBjb21tYW5kLAorCSoqCWFuZCB0aGUgYWRkcmVzcyBhdCB3aGljaCB0byBjb250aW51ZS4KKwkqLworCXZkc3AJPSBOVUxMOworCW54dGRzcAk9IDA7CisJaWYJKGRzcCA+ICBucC0+cF9zY3JpcHQgJiYKKwkJIGRzcCA8PSBucC0+cF9zY3JpcHQgKyBzaXplb2Yoc3RydWN0IHNjcmlwdCkpIHsKKwkJdmRzcCA9ICh1MzIgKikoKGNoYXIqKW5wLT5zY3JpcHQwICsgKGRzcC1ucC0+cF9zY3JpcHQtOCkpOworCQlueHRkc3AgPSBkc3A7CisJfQorCWVsc2UgaWYJKGRzcCA+ICBucC0+cF9zY3JpcHRoICYmCisJCSBkc3AgPD0gbnAtPnBfc2NyaXB0aCArIHNpemVvZihzdHJ1Y3Qgc2NyaXB0aCkpIHsKKwkJdmRzcCA9ICh1MzIgKikoKGNoYXIqKW5wLT5zY3JpcHRoMCArIChkc3AtbnAtPnBfc2NyaXB0aC04KSk7CisJCW54dGRzcCA9IGRzcDsKKwl9CisJZWxzZSBpZiAoY3ApIHsKKwkJaWYJKGRzcCA9PSBDQ0JfUEhZUyAoY3AsIHBhdGNoWzJdKSkgeworCQkJdmRzcCA9ICZjcC0+cGF0Y2hbMF07CisJCQlueHRkc3AgPSBzY3JfdG9fY3B1KHZkc3BbM10pOworCQl9CisJCWVsc2UgaWYgKGRzcCA9PSBDQ0JfUEhZUyAoY3AsIHBhdGNoWzZdKSkgeworCQkJdmRzcCA9ICZjcC0+cGF0Y2hbNF07CisJCQlueHRkc3AgPSBzY3JfdG9fY3B1KHZkc3BbM10pOworCQl9CisJfQorCisJLyoKKwkqKglsb2cgdGhlIGluZm9ybWF0aW9uCisJKi8KKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1BIQVNFKSB7CisJCXByaW50ayAoIlxuQ1A9JXAgQ1AyPSVwIERTUD0leCBOWFQ9JXggVkRTUD0lcCBDTUQ9JXggIiwKKwkJCWNwLCBucC0+aGVhZGVyLmNwLAorCQkJKHVuc2lnbmVkKWRzcCwKKwkJCSh1bnNpZ25lZClueHRkc3AsIHZkc3AsIGNtZCk7CisJfQorCisJLyoKKwkqKgljcD0wIG1lYW5zIHRoYXQgdGhlIERTQSBkb2VzIG5vdCBwb2ludCB0byBhIHZhbGlkIGNvbnRyb2wgCisJKioJYmxvY2suIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gc2luY2Ugd2UgZG9ubm90IHVzZSBtdWx0aS1ieXRlIAorCSoqCW1vdmUgd2hpbGUgd2UgYXJlIGJlaW5nIHJlc2VsZWN0ZWQgb3QgYWZ0ZXIgY29tbWFuZCBjb21wbGV0ZS4KKwkqKglXZSBhcmUgbm90IGFibGUgdG8gcmVjb3ZlciBmcm9tIHN1Y2ggYSBwaGFzZSBlcnJvci4KKwkqLworCWlmICghY3ApIHsKKwkJcHJpbnRrICgiJXM6IFNDU0kgcGhhc2UgZXJyb3IgZml4dXA6ICIKKwkJCSJDQ0IgYWxyZWFkeSBkZXF1ZXVlZCAoMHglMDhseClcbiIsIAorCQkJbmNyX25hbWUgKG5wKSwgKHVfbG9uZykgbnAtPmhlYWRlci5jcCk7CisJCWdvdG8gcmVzZXRfYWxsOworCX0KKworCS8qCisJKioJZ2V0IG9sZCBzdGFydGFkZHJlc3MgYW5kIG9sZCBsZW5ndGguCisJKi8KKworCW9hZHIgPSBzY3JfdG9fY3B1KHZkc3BbMV0pOworCisJaWYgKGNtZCAmIDB4MTApIHsJLyogVGFibGUgaW5kaXJlY3QgKi8KKwkJdGJscCA9ICh1MzIgKikgKChjaGFyKikgJmNwLT5waHlzICsgb2Fkcik7CisJCW9sZW4gPSBzY3JfdG9fY3B1KHRibHBbMF0pOworCQlvYWRyID0gc2NyX3RvX2NwdSh0YmxwWzFdKTsKKwl9IGVsc2UgeworCQl0YmxwID0gKHUzMiAqKSAwOworCQlvbGVuID0gc2NyX3RvX2NwdSh2ZHNwWzBdKSAmIDB4ZmZmZmZmOworCX0KKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1BIQVNFKSB7CisJCXByaW50ayAoIk9DTUQ9JXhcblRCTFA9JXAgT0xFTj0leCBPQURSPSV4XG4iLAorCQkJKHVuc2lnbmVkKSAoc2NyX3RvX2NwdSh2ZHNwWzBdKSA+PiAyNCksCisJCQl0YmxwLAorCQkJKHVuc2lnbmVkKSBvbGVuLAorCQkJKHVuc2lnbmVkKSBvYWRyKTsKKwl9CisKKwkvKgorCSoqCWNoZWNrIGNtZCBhZ2FpbnN0IGFzc3VtZWQgaW50ZXJydXB0ZWQgc2NyaXB0IGNvbW1hbmQuCisJKi8KKworCWlmIChjbWQgIT0gKHNjcl90b19jcHUodmRzcFswXSkgPj4gMjQpKSB7CisJCVBSSU5UX0FERFIoY3AtPmNtZCwgImludGVybmFsIGVycm9yOiBjbWQ9JTAyeCAhPSAlMDJ4PSh2ZHNwWzBdICIKKwkJCQkiPj4gMjQpXG4iLCBjbWQsIHNjcl90b19jcHUodmRzcFswXSkgPj4gMjQpOworCisJCWdvdG8gcmVzZXRfYWxsOworCX0KKworCS8qCisJKioJY3AgIT0gbnAtPmhlYWRlci5jcCBtZWFucyB0aGF0IHRoZSBoZWFkZXIgb2YgdGhlIENDQiAKKwkqKgljdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkIGhhcyBub3QgeWV0IGJlZW4gY29waWVkIHRvIAorCSoqCXRoZSBnbG9iYWwgaGVhZGVyIGFyZWEuIFRoYXQgbWF5IGhhcHBlbiBpZiB0aGUgZGV2aWNlIGRpZCAKKwkqKglub3QgYWNjZXB0IGFsbCBvdXIgbWVzc2FnZXMgYWZ0ZXIgaGF2aW5nIGJlZW4gc2VsZWN0ZWQuCisJKi8KKwlpZiAoY3AgIT0gbnAtPmhlYWRlci5jcCkgeworCQlwcmludGsgKCIlczogU0NTSSBwaGFzZSBlcnJvciBmaXh1cDogIgorCQkJIkNDQiBhZGRyZXNzIG1pc21hdGNoICgweCUwOGx4ICE9IDB4JTA4bHgpXG4iLCAKKwkJCW5jcl9uYW1lIChucCksICh1X2xvbmcpIGNwLCAodV9sb25nKSBucC0+aGVhZGVyLmNwKTsKKwl9CisKKwkvKgorCSoqCWlmIG9sZCBwaGFzZSBub3QgZGF0YXBoYXNlLCBsZWF2ZSBoZXJlLgorCSovCisKKwlpZiAoY21kICYgMHgwNikgeworCQlQUklOVF9BRERSKGNwLT5jbWQsICJwaGFzZSBjaGFuZ2UgJXgtJXggJWRAJTA4eCByZXNpZD0lZC5cbiIsCisJCQljbWQmNywgc2JjbCY3LCAodW5zaWduZWQpb2xlbiwKKwkJCSh1bnNpZ25lZClvYWRyLCAodW5zaWduZWQpcmVzdCk7CisJCWdvdG8gdW5leHBlY3RlZF9waGFzZTsKKwl9CisKKwkvKgorCSoqCWNob29zZSB0aGUgY29ycmVjdCBwYXRjaCBhcmVhLgorCSoqCWlmIHNhdmVwIHBvaW50cyB0byBvbmUsIGNob29zZSB0aGUgb3RoZXIuCisJKi8KKworCW5ld2NtZCA9IGNwLT5wYXRjaDsKKwluZXd0bXAgPSBDQ0JfUEhZUyAoY3AsIHBhdGNoKTsKKwlpZiAobmV3dG1wID09IHNjcl90b19jcHUoY3AtPnBoeXMuaGVhZGVyLnNhdmVwKSkgeworCQluZXdjbWQgPSAmY3AtPnBhdGNoWzRdOworCQluZXd0bXAgPSBDQ0JfUEhZUyAoY3AsIHBhdGNoWzRdKTsKKwl9CisKKwkvKgorCSoqCWZpbGxpbiB0aGUgY29tbWFuZHMKKwkqLworCisJbmV3Y21kWzBdID0gY3B1X3RvX3NjcigoKGNtZCAmIDB4MGYpIDw8IDI0KSB8IHJlc3QpOworCW5ld2NtZFsxXSA9IGNwdV90b19zY3Iob2FkciArIG9sZW4gLSByZXN0KTsKKwluZXdjbWRbMl0gPSBjcHVfdG9fc2NyKFNDUl9KVU1QKTsKKwluZXdjbWRbM10gPSBjcHVfdG9fc2NyKG54dGRzcCk7CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19QSEFTRSkgeworCQlQUklOVF9BRERSKGNwLT5jbWQsICJuZXdjbWRbJWRdICV4ICV4ICV4ICV4LlxuIiwKKwkJCShpbnQpIChuZXdjbWQgLSBjcC0+cGF0Y2gpLAorCQkJKHVuc2lnbmVkKXNjcl90b19jcHUobmV3Y21kWzBdKSwKKwkJCSh1bnNpZ25lZClzY3JfdG9fY3B1KG5ld2NtZFsxXSksCisJCQkodW5zaWduZWQpc2NyX3RvX2NwdShuZXdjbWRbMl0pLAorCQkJKHVuc2lnbmVkKXNjcl90b19jcHUobmV3Y21kWzNdKSk7CisJfQorCS8qCisJKioJZmFrZSB0aGUgcmV0dXJuIGFkZHJlc3MgKHRvIHRoZSBwYXRjaCkuCisJKioJYW5kIHJlc3RhcnQgc2NyaXB0IHByb2Nlc3NvciBhdCBkaXNwYXRjaGVyLgorCSovCisJT1VUTCAobmNfdGVtcCwgbmV3dG1wKTsKKwlPVVRMX0RTUCAoTkNCX1NDUklQVF9QSFlTIChucCwgZGlzcGF0Y2gpKTsKKwlyZXR1cm47CisKKwkvKgorCSoqCVVuZXhwZWN0ZWQgcGhhc2UgY2hhbmdlcyB0aGF0IG9jY3VycyB3aGVuIHRoZSBjdXJyZW50IHBoYXNlIAorCSoqCWlzIG5vdCBhIERBVEEgSU4gb3IgREFUQSBPVVQgcGhhc2UgYXJlIGR1ZSB0byBlcnJvciBjb25kaXRpb25zLgorCSoqCVN1Y2ggZXZlbnQgbWF5IG9ubHkgaGFwcGVuIHdoZW4gdGhlIFNDUklQVFMgaXMgdXNpbmcgYSAKKwkqKgltdWx0aWJ5dGUgU0NTSSBNT1ZFLgorCSoqCisJKioJUGhhc2UgY2hhbmdlCQlTb21lIHBvc3NpYmxlIGNhdXNlCisJKioKKwkqKglDT01NQU5EICAtLT4gTVNHIElOCVNDU0kgcGFyaXR5IGVycm9yIGRldGVjdGVkIGJ5IHRhcmdldC4KKwkqKglDT01NQU5EICAtLT4gU1RBVFVTCUJhZCBjb21tYW5kIG9yIHJlZnVzZWQgYnkgdGFyZ2V0LgorCSoqCU1TRyBPVVQgIC0tPiBNU0cgSU4gICAgIE1lc3NhZ2UgcmVqZWN0ZWQgYnkgdGFyZ2V0LgorCSoqCU1TRyBPVVQgIC0tPiBDT01NQU5EICAgIEJvZ3VzIHRhcmdldCB0aGF0IGRpc2NhcmRzIGV4dGVuZGVkCisJKioJCQkJbmVnb3RpYXRpb24gbWVzc2FnZXMuCisJKioKKwkqKglUaGUgY29kZSBiZWxvdyBkb2VzIG5vdCBjYXJlIG9mIHRoZSBuZXcgcGhhc2UgYW5kIHNvIAorCSoqCXRydXN0cyB0aGUgdGFyZ2V0LiBXaHkgdG8gYW5ub3kgaXQgPworCSoqCUlmIHRoZSBpbnRlcnJ1cHRlZCBwaGFzZSBpcyBDT01NQU5EIHBoYXNlLCB3ZSByZXN0YXJ0IGF0CisJKioJZGlzcGF0Y2hlci4KKwkqKglJZiBhIHRhcmdldCBkb2VzIG5vdCBnZXQgYWxsIHRoZSBtZXNzYWdlcyBhZnRlciBzZWxlY3Rpb24sIAorCSoqCXRoZSBjb2RlIGFzc3VtZXMgYmxpbmRseSB0aGF0IHRoZSB0YXJnZXQgZGlzY2FyZHMgZXh0ZW5kZWQgCisJKioJbWVzc2FnZXMgYW5kIGNsZWFycyB0aGUgbmVnb3RpYXRpb24gc3RhdHVzLgorCSoqCUlmIHRoZSB0YXJnZXQgZG9lcyBub3Qgd2FudCBhbGwgb3VyIHJlc3BvbnNlIHRvIG5lZ290aWF0aW9uLAorCSoqCXdlIGZvcmNlIGEgU0lSX05FR09fUFJPVE8gaW50ZXJydXB0IChpdCBpcyBhIGhhY2sgdGhhdCBhdm9pZHMgCisJKioJYmxvYXQgZm9yIHN1Y2ggYSBzaG91bGRfbm90X2hhcHBlbiBzaXR1YXRpb24pLgorCSoqCUluIGFsbCBvdGhlciBzaXR1YXRpb24sIHdlIHJlc2V0IHRoZSBCVVMuCisJKioJQXJlIHRoZXNlIGFzc3VtcHRpb25zIHJlYXNvbm5hYmxlID8gKFdhaXQgYW5kIHNlZSAuLi4pCisJKi8KK3VuZXhwZWN0ZWRfcGhhc2U6CisJZHNwIC09IDg7CisJbnh0ZHNwID0gMDsKKworCXN3aXRjaCAoY21kICYgNykgeworCWNhc2UgMjoJLyogQ09NTUFORCBwaGFzZSAqLworCQlueHRkc3AgPSBOQ0JfU0NSSVBUX1BIWVMgKG5wLCBkaXNwYXRjaCk7CisJCWJyZWFrOworI2lmIDAKKwljYXNlIDM6CS8qIFNUQVRVUyAgcGhhc2UgKi8KKwkJbnh0ZHNwID0gTkNCX1NDUklQVF9QSFlTIChucCwgZGlzcGF0Y2gpOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgNjoJLyogTVNHIE9VVCBwaGFzZSAqLworCQlucC0+c2NyaXB0aC0+bnh0ZHNwX2dvX29uWzBdID0gY3B1X3RvX3Njcihkc3AgKyA4KTsKKwkJaWYJKGRzcCA9PSBOQ0JfU0NSSVBUX1BIWVMgKG5wLCBzZW5kX2lkZW50KSkgeworCQkJY3AtPmhvc3Rfc3RhdHVzID0gSFNfQlVTWTsKKwkJCW54dGRzcCA9IE5DQl9TQ1JJUFRIX1BIWVMgKG5wLCBjbHJhdG5fZ29fb24pOworCQl9CisJCWVsc2UgaWYJKGRzcCA9PSBOQ0JfU0NSSVBUSF9QSFlTIChucCwgc2VuZF93ZHRyKSB8fAorCQkJIGRzcCA9PSBOQ0JfU0NSSVBUSF9QSFlTIChucCwgc2VuZF9zZHRyKSkgeworCQkJbnh0ZHNwID0gTkNCX1NDUklQVEhfUEhZUyAobnAsIG5lZ29fYmFkX3BoYXNlKTsKKwkJfQorCQlicmVhazsKKyNpZiAwCisJY2FzZSA3OgkvKiBNU0cgSU4gIHBoYXNlICovCisJCW54dGRzcCA9IE5DQl9TQ1JJUFRfUEhZUyAobnAsIGNscmFjayk7CisJCWJyZWFrOworI2VuZGlmCisJfQorCisJaWYgKG54dGRzcCkgeworCQlPVVRMX0RTUCAobnh0ZHNwKTsKKwkJcmV0dXJuOworCX0KKworcmVzZXRfYWxsOgorCW5jcl9zdGFydF9yZXNldChucCk7Cit9CisKKworc3RhdGljIHZvaWQgbmNyX3Npcl90b19yZWRvKHN0cnVjdCBuY2IgKm5wLCBpbnQgbnVtLCBzdHJ1Y3QgY2NiICpjcCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQJPSBjcC0+Y21kOworCXN0cnVjdCB0Y2IgKnRwCT0gJm5wLT50YXJnZXRbY21kLT5kZXZpY2UtPmlkXTsKKwlzdHJ1Y3QgbGNiICpscAk9IHRwLT5scFtjbWQtPmRldmljZS0+bHVuXTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpxcDsKKwlzdHJ1Y3QgY2NiICoJY3AyOworCWludAkJZGlzY19jbnQgPSAwOworCWludAkJYnVzeV9jbnQgPSAwOworCXUzMgkJc3RhcnRwOworCXVfY2hhcgkJc19zdGF0dXMgPSBJTkIgKFNTX1BSVCk7CisKKwkvKgorCSoqCUxldCB0aGUgU0NSSVBUUyBwcm9jZXNzb3Igc2tpcCBhbGwgbm90IHlldCBzdGFydGVkIENDQnMsCisJKioJYW5kIGNvdW50IGRpc2Nvbm5lY3RlZCBDQ0JzLiBTaW5jZSB0aGUgYnVzeSBxdWV1ZSBpcyBpbiAKKwkqKgl0aGUgc2FtZSBvcmRlciBhcyB0aGUgY2hpcCBzdGFydCBxdWV1ZSwgZGlzY29ubmVjdGVkIENDQnMgCisJKioJYXJlIGJlZm9yZSBjcCBhbmQgYnVzeSBvbmVzIGFmdGVyLgorCSovCisJaWYgKGxwKSB7CisJCXFwID0gbHAtPmJ1c3lfY2NicS5wcmV2OworCQl3aGlsZSAocXAgIT0gJmxwLT5idXN5X2NjYnEpIHsKKwkJCWNwMiA9IGxpc3RfZW50cnkocXAsIHN0cnVjdCBjY2IsIGxpbmtfY2NicSk7CisJCQlxcCAgPSBxcC0+cHJldjsKKwkJCSsrYnVzeV9jbnQ7CisJCQlpZiAoY3AyID09IGNwKQorCQkJCWJyZWFrOworCQkJY3AyLT5zdGFydC5zY2hlZHVsZS5sX3BhZGRyID0KKwkJCWNwdV90b19zY3IoTkNCX1NDUklQVEhfUEhZUyAobnAsIHNraXApKTsKKwkJfQorCQlscC0+aGVsZF9jY2IgPSBjcDsJLyogUmVxdWV1ZSB3aGVuIHRoaXMgb25lIGNvbXBsZXRlcyAqLworCQlkaXNjX2NudCA9IGxwLT5xdWV1ZWRjY2JzIC0gYnVzeV9jbnQ7CisJfQorCisJc3dpdGNoKHNfc3RhdHVzKSB7CisJZGVmYXVsdDoJLyogSnVzdCBmb3Igc2FmZXR5LCBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJY2FzZSBTX1FVRVVFX0ZVTEw6CisJCS8qCisJCSoqCURlY3JlYXNlIG51bWJlciBvZiB0YWdzIHRvIHRoZSBudW1iZXIgb2YgCisJCSoqCWRpc2Nvbm5lY3RlZCBjb21tYW5kcy4KKwkJKi8KKwkJaWYgKCFscCkKKwkJCWdvdG8gb3V0OworCQlpZiAoYm9vdHZlcmJvc2UgPj0gMSkgeworCQkJUFJJTlRfQUREUihjbWQsICJRVUVVRSBGVUxMISAlZCBidXN5LCAlZCBkaXNjb25uZWN0ZWQgIgorCQkJCQkiQ0NCc1xuIiwgYnVzeV9jbnQsIGRpc2NfY250KTsKKwkJfQorCQlpZiAoZGlzY19jbnQgPCBscC0+bnVtdGFncykgeworCQkJbHAtPm51bXRhZ3MJPSBkaXNjX2NudCA+IDIgPyBkaXNjX2NudCA6IDI7CisJCQlscC0+bnVtX2dvb2QJPSAwOworCQkJbmNyX3NldHVwX3RhZ3MgKG5wLCBjbWQtPmRldmljZSk7CisJCX0KKwkJLyoKKwkJKioJUmVxdWV1ZSB0aGUgY29tbWFuZCB0byB0aGUgc3RhcnQgcXVldWUuCisJCSoqCUlmIGFueSBkaXNjb25uZWN0ZWQgY29tbWFuZHMsCisJCSoqCQlDbGVhciBTSUdQLgorCQkqKgkJSnVtcCB0byByZXNlbGVjdC4KKwkJKi8KKwkJY3AtPnBoeXMuaGVhZGVyLnNhdmVwID0gY3AtPnN0YXJ0cDsKKwkJY3AtPmhvc3Rfc3RhdHVzID0gSFNfQlVTWTsKKwkJY3AtPnNjc2lfc3RhdHVzID0gU19JTExFR0FMOworCisJCW5jcl9wdXRfc3RhcnRfcXVldWUobnAsIGNwKTsKKwkJaWYgKGRpc2NfY250KQorCQkJSU5CIChuY19jdGVzdDIpOwkJLyogQ2xlYXIgU0lHUCAqLworCQlPVVRMX0RTUCAoTkNCX1NDUklQVF9QSFlTIChucCwgcmVzZWxlY3QpKTsKKwkJcmV0dXJuOworCWNhc2UgU19URVJNSU5BVEVEOgorCWNhc2UgU19DSEVDS19DT05EOgorCQkvKgorCQkqKglJZiB3ZSB3ZXJlIHJlcXVlc3Rpbmcgc2Vuc2UsIGdpdmUgdXAuCisJCSovCisJCWlmIChjcC0+YXV0b19zZW5zZSkKKwkJCWdvdG8gb3V0OworCisJCS8qCisJCSoqCURldmljZSByZXR1cm5lZCBDSEVDSyBDT05ESVRJT04gc3RhdHVzLgorCQkqKglQcmVwYXJlIGFsbCBuZWVkZWQgZGF0YSBzdHJ1dHVyZXMgZm9yIGdldHRpbmcgCisJCSoqCXNlbnNlIGRhdGEuCisJCSoqCisJCSoqCWlkZW50aWZ5IG1lc3NhZ2UKKwkJKi8KKwkJY3AtPnNjc2lfc21zZzJbMF0JPSBJREVOVElGWSgwLCBjbWQtPmRldmljZS0+bHVuKTsKKwkJY3AtPnBoeXMuc21zZy5hZGRyCT0gY3B1X3RvX3NjcihDQ0JfUEhZUyAoY3AsIHNjc2lfc21zZzIpKTsKKwkJY3AtPnBoeXMuc21zZy5zaXplCT0gY3B1X3RvX3NjcigxKTsKKworCQkvKgorCQkqKglzZW5zZSBjb21tYW5kCisJCSovCisJCWNwLT5waHlzLmNtZC5hZGRyCT0gY3B1X3RvX3NjcihDQ0JfUEhZUyAoY3AsIHNlbnNlY21kKSk7CisJCWNwLT5waHlzLmNtZC5zaXplCT0gY3B1X3RvX3Njcig2KTsKKworCQkvKgorCQkqKglwYXRjaCByZXF1ZXN0ZWQgc2l6ZSBpbnRvIHNlbnNlIGNvbW1hbmQKKwkJKi8KKwkJY3AtPnNlbnNlY21kWzBdCQk9IDB4MDM7CisJCWNwLT5zZW5zZWNtZFsxXQkJPSBjbWQtPmRldmljZS0+bHVuIDw8IDU7CisJCWNwLT5zZW5zZWNtZFs0XQkJPSBzaXplb2YoY3AtPnNlbnNlX2J1Zik7CisKKwkJLyoKKwkJKioJc2Vuc2UgZGF0YQorCQkqLworCQltZW1zZXQoY3AtPnNlbnNlX2J1ZiwgMCwgc2l6ZW9mKGNwLT5zZW5zZV9idWYpKTsKKwkJY3AtPnBoeXMuc2Vuc2UuYWRkcgk9IGNwdV90b19zY3IoQ0NCX1BIWVMoY3Asc2Vuc2VfYnVmWzBdKSk7CisJCWNwLT5waHlzLnNlbnNlLnNpemUJPSBjcHVfdG9fc2NyKHNpemVvZihjcC0+c2Vuc2VfYnVmKSk7CisKKwkJLyoKKwkJKioJcmVxdWV1ZSB0aGUgY29tbWFuZC4KKwkJKi8KKwkJc3RhcnRwID0gY3B1X3RvX3NjcihOQ0JfU0NSSVBUSF9QSFlTIChucCwgc2RhdGFfaW4pKTsKKworCQljcC0+cGh5cy5oZWFkZXIuc2F2ZXAJPSBzdGFydHA7CisJCWNwLT5waHlzLmhlYWRlci5nb2FscAk9IHN0YXJ0cCArIDI0OworCQljcC0+cGh5cy5oZWFkZXIubGFzdHAJPSBzdGFydHA7CisJCWNwLT5waHlzLmhlYWRlci53Z29hbHAJPSBzdGFydHAgKyAyNDsKKwkJY3AtPnBoeXMuaGVhZGVyLndsYXN0cAk9IHN0YXJ0cDsKKworCQljcC0+aG9zdF9zdGF0dXMgPSBIU19CVVNZOworCQljcC0+c2NzaV9zdGF0dXMgPSBTX0lMTEVHQUw7CisJCWNwLT5hdXRvX3NlbnNlCT0gc19zdGF0dXM7CisKKwkJY3AtPnN0YXJ0LnNjaGVkdWxlLmxfcGFkZHIgPQorCQkJY3B1X3RvX3NjcihOQ0JfU0NSSVBUX1BIWVMgKG5wLCBzZWxlY3QpKTsKKworCQkvKgorCQkqKglTZWxlY3Qgd2l0aG91dCBBVE4gZm9yIHF1aXJreSBkZXZpY2VzLgorCQkqLworCQlpZiAoY21kLT5kZXZpY2UtPnNlbGVjdF9ub19hdG4pCisJCQljcC0+c3RhcnQuc2NoZWR1bGUubF9wYWRkciA9CisJCQljcHVfdG9fc2NyKE5DQl9TQ1JJUFRIX1BIWVMgKG5wLCBzZWxlY3Rfbm9fYXRuKSk7CisKKwkJbmNyX3B1dF9zdGFydF9xdWV1ZShucCwgY3ApOworCisJCU9VVExfRFNQIChOQ0JfU0NSSVBUX1BIWVMgKG5wLCBzdGFydCkpOworCQlyZXR1cm47CisJfQorCitvdXQ6CisJT1VUT05CX1NURCAoKTsKKwlyZXR1cm47Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioKKyoqICAgICAgbmNyIGNoaXAgZXhjZXB0aW9uIGhhbmRsZXIgZm9yIHByb2dyYW1tZWQgaW50ZXJydXB0cy4KKyoqCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCit2b2lkIG5jcl9pbnRfc2lyIChzdHJ1Y3QgbmNiICpucCkKK3sKKwl1X2NoYXIgc2NudGwzOworCXVfY2hhciBjaGcsIG9mcywgcGVyLCBmYWssIHdpZGU7CisJdV9jaGFyIG51bSA9IElOQiAobmNfZHNwcyk7CisJc3RydWN0IGNjYiAqY3A9TlVMTDsKKwl1X2xvbmcJZHNhICAgID0gSU5MIChuY19kc2EpOworCXVfY2hhcgl0YXJnZXQgPSBJTkIgKG5jX3NkaWQpICYgMHgwZjsKKwlzdHJ1Y3QgdGNiICp0cCAgICAgPSAmbnAtPnRhcmdldFt0YXJnZXRdOworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRwLT5zdGFyZ2V0OworCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfVElOWSkgcHJpbnRrICgiSSMlZCIsIG51bSk7CisKKwlzd2l0Y2ggKG51bSkgeworCWNhc2UgU0lSX0lOVEZMWToKKwkJLyoKKwkJKioJVGhpcyBpcyB1c2VkIGZvciBIUCBaYWxvbi81M2M3MjAgd2hlcmUgSU5URkxZCisJCSoqCW9wZXJhdGlvbiBpcyBjdXJyZW50bHkgYnJva2VuLgorCQkqLworCQluY3Jfd2FrZXVwX2RvbmUobnApOworI2lmZGVmIFNDU0lfTkNSX0NDQl9ET05FX1NVUFBPUlQKKwkJT1VUTChuY19kc3AsIE5DQl9TQ1JJUFRfUEhZUyAobnAsIGRvbmVfZW5kKSArIDgpOworI2Vsc2UKKwkJT1VUTChuY19kc3AsIE5DQl9TQ1JJUFRfUEhZUyAobnAsIHN0YXJ0KSk7CisjZW5kaWYKKwkJcmV0dXJuOworCWNhc2UgU0lSX1JFU0VMX05PX01TR19JTjoKKwljYXNlIFNJUl9SRVNFTF9OT19JREVOVElGWToKKwkJLyoKKwkJKioJSWYgZGV2aWNlcyByZXNlbGVjdGluZyB3aXRob3V0IHNlbmRpbmcgYW4gSURFTlRJRlkgCisJCSoqCW1lc3NhZ2Ugc3RpbGwgZXhpc3QsIHRoaXMgc2hvdWxkIGhlbHAuCisJCSoqCVdlIGp1c3QgYXNzdW1lIGx1bj0wLCAxIENDQiwgbm8gdGFnLgorCQkqLworCQlpZiAodHAtPmxwWzBdKSB7IAorCQkJT1VUTF9EU1AgKHNjcl90b19jcHUodHAtPmxwWzBdLT5qdW1wX2NjYlswXSkpOworCQkJcmV0dXJuOworCQl9CisJY2FzZSBTSVJfUkVTRUxfQkFEX1RBUkdFVDoJLyogV2lsbCBzZW5kIGEgVEFSR0VUIFJFU0VUIG1lc3NhZ2UgKi8KKwljYXNlIFNJUl9SRVNFTF9CQURfTFVOOgkJLyogV2lsbCBzZW5kIGEgVEFSR0VUIFJFU0VUIG1lc3NhZ2UgKi8KKwljYXNlIFNJUl9SRVNFTF9CQURfSV9UX0xfUToJLyogV2lsbCBzZW5kIGFuIEFCT1JUIFRBRyBtZXNzYWdlICAgKi8KKwljYXNlIFNJUl9SRVNFTF9CQURfSV9UX0w6CS8qIFdpbGwgc2VuZCBhbiBBQk9SVCBtZXNzYWdlCSAgICAqLworCQlwcmludGsgKCIlczolZDogU0lSICVkLCAiCisJCQkiaW5jb3JyZWN0IG5leHVzIGlkZW50aWZpY2F0aW9uIG9uIHJlc2VsZWN0aW9uXG4iLAorCQkJbmNyX25hbWUgKG5wKSwgdGFyZ2V0LCBudW0pOworCQlnb3RvIG91dDsKKwljYXNlIFNJUl9ET05FX09WRVJGTE9XOgorCQlwcmludGsgKCIlczolZDogU0lSICVkLCAiCisJCQkiQ0NCIGRvbmUgcXVldWUgb3ZlcmZsb3dcbiIsCisJCQluY3JfbmFtZSAobnApLCB0YXJnZXQsIG51bSk7CisJCWdvdG8gb3V0OworCWNhc2UgU0lSX0JBRF9TVEFUVVM6CisJCWNwID0gbnAtPmhlYWRlci5jcDsKKwkJaWYgKCFjcCB8fCBDQ0JfUEhZUyAoY3AsIHBoeXMpICE9IGRzYSkKKwkJCWdvdG8gb3V0OworCQluY3Jfc2lyX3RvX3JlZG8obnAsIG51bSwgY3ApOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJLyoKKwkJKioJbG9va3VwIHRoZSBjY2IKKwkJKi8KKwkJY3AgPSBucC0+Y2NiOworCQl3aGlsZSAoY3AgJiYgKENDQl9QSFlTIChjcCwgcGh5cykgIT0gZHNhKSkKKwkJCWNwID0gY3AtPmxpbmtfY2NiOworCisJCUJVR19PTighY3ApOworCQlCVUdfT04oY3AgIT0gbnAtPmhlYWRlci5jcCk7CisKKwkJaWYgKCFjcCB8fCBjcCAhPSBucC0+aGVhZGVyLmNwKQorCQkJZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChudW0pIHsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKglXYXMgU2llIHNjaG9uIGltbWVyIHVlYmVyIHRyYW5zZmVybW9kZSBuZWdvdGlhdGlvbiB3aXNzZW4gd29sbHRlbiAuLi4KKyoqCisqKglXZSB0cnkgdG8gbmVnb3RpYXRlIHN5bmMgYW5kIHdpZGUgdHJhbnNmZXIgb25seSBhZnRlcgorKioJYSBzdWNjZXNzZnVsIGlucXVpcmUgY29tbWFuZC4gV2UgbG9vayBhdCBieXRlIDcgb2YgdGhlCisqKglpbnF1aXJlIGRhdGEgdG8gZGV0ZXJtaW5lIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHRhcmdldC4KKyoqCisqKglXaGVuIHdlIHRyeSB0byBuZWdvdGlhdGUsIHdlIGFwcGVuZCB0aGUgbmVnb3RpYXRpb24gbWVzc2FnZQorKioJdG8gdGhlIGlkZW50aWZ5IGFuZCAobWF5YmUpIHNpbXBsZSB0YWcgbWVzc2FnZS4KKyoqCVRoZSBob3N0IHN0YXR1cyBmaWVsZCBpcyBzZXQgdG8gSFNfTkVHT1RJQVRFIHRvIG1hcmsgdGhpcworKioJc2l0dWF0aW9uLgorKioKKyoqCUlmIHRoZSB0YXJnZXQgZG9lc24ndCBhbnN3ZXIgdGhpcyBtZXNzYWdlIGltbWlkaWF0ZWx5CisqKgkoYXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkKSwgdGhlIFNJUl9ORUdPX0ZBSUwgaW50ZXJydXB0CisqKgl3aWxsIGJlIHJhaXNlZCBldmVudHVhbGx5LgorKioJVGhlIGhhbmRsZXIgcmVtb3ZlcyB0aGUgSFNfTkVHT1RJQVRFIHN0YXR1cywgYW5kIHNldHMgdGhlCisqKgluZWdvdGlhdGVkIHZhbHVlIHRvIHRoZSBkZWZhdWx0IChhc3luYyAvIG5vd2lkZSkuCisqKgorKioJSWYgd2UgcmVjZWl2ZSBhIG1hdGNoaW5nIGFuc3dlciBpbW1lZGlhdGVseSwgd2UgY2hlY2sgaXQKKyoqCWZvciB2YWxpZGl0eSwgYW5kIHNldCB0aGUgdmFsdWVzLgorKioKKyoqCUlmIHdlIHJlY2VpdmUgYSBSZWplY3QgbWVzc2FnZSBpbW1lZGlhdGVseSwgd2UgYXNzdW1lIHRoZQorKioJbmVnb3RpYXRpb24gaGFzIGZhaWxlZCwgYW5kIGZhbGwgYmFjayB0byBzdGFuZGFyZCB2YWx1ZXMuCisqKgorKioJSWYgd2UgcmVjZWl2ZSBhIG5lZ290aWF0aW9uIG1lc3NhZ2Ugd2hpbGUgbm90IGluIEhTX05FR09USUFURQorKioJc3RhdGUsIGl0J3MgYSB0YXJnZXQgaW5pdGlhdGVkIG5lZ290aWF0aW9uLiBXZSBwcmVwYXJlIGEKKyoqCShob3BlZnVsbHkpIHZhbGlkIGFuc3dlciwgc2V0IG91ciBwYXJhbWV0ZXJzLCBhbmQgc2VuZCBiYWNrIAorKioJdGhpcyBhbnN3ZXIgdG8gdGhlIHRhcmdldC4KKyoqCisqKglJZiB0aGUgdGFyZ2V0IGRvZXNuJ3QgZmV0Y2ggdGhlIGFuc3dlciAobm8gbWVzc2FnZSBvdXQgcGhhc2UpLAorKioJd2UgYXNzdW1lIHRoZSBuZWdvdGlhdGlvbiBoYXMgZmFpbGVkLCBhbmQgZmFsbCBiYWNrIHRvIGRlZmF1bHQKKyoqCXNldHRpbmdzLgorKioKKyoqCVdoZW4gd2Ugc2V0IHRoZSB2YWx1ZXMsIHdlIGFkanVzdCB0aGVtIGluIGFsbCBjY2JzIGJlbG9uZ2luZyAKKyoqCXRvIHRoaXMgdGFyZ2V0LCBpbiB0aGUgY29udHJvbGxlcidzIHJlZ2lzdGVyLCBhbmQgaW4gdGhlICJwaHlzIgorKioJZmllbGQgb2YgdGhlIGNvbnRyb2xsZXIncyBzdHJ1Y3QgbmNiLgorKioKKyoqCVBvc3NpYmxlIGNhc2VzOgkJICAgaHMgIHNpciAgIG1zZ19pbiB2YWx1ZSAgc2VuZCAgIGdvdG8KKyoqCVdlIHRyeSB0byBuZWdvdGlhdGU6CisqKgktPiB0YXJnZXQgZG9lc24ndCBtc2dpbiAgICBORUcgRkFJTCAgbm9vcCAgIGRlZmEuICAtICAgICAgZGlzcGF0Y2gKKyoqCS0+IHRhcmdldCByZWplY3RlZCBvdXIgbXNnIE5FRyBGQUlMICByZWplY3QgZGVmYS4gIC0gICAgICBkaXNwYXRjaAorKioJLT4gdGFyZ2V0IGFuc3dlcmVkICAob2spICAgTkVHIFNZTkMgIHNkdHIgICBzZXQgICAgLSAgICAgIGNscmFjaworKioJLT4gdGFyZ2V0IGFuc3dlcmVkICghb2spICAgTkVHIFNZTkMgIHNkdHIgICBkZWZhLiAgUkVKLS0tPm1zZ19iYWQKKyoqCS0+IHRhcmdldCBhbnN3ZXJlZCAgKG9rKSAgIE5FRyBXSURFICB3ZHRyICAgc2V0ICAgIC0gICAgICBjbHJhY2sKKyoqCS0+IHRhcmdldCBhbnN3ZXJlZCAoIW9rKSAgIE5FRyBXSURFICB3ZHRyICAgZGVmYS4gIFJFSi0tLT5tc2dfYmFkCisqKgktPiBhbnkgb3RoZXIgbXNnaW4JICAgTkVHIEZBSUwgIG5vb3AgICBkZWZhLiAgLSAgICAgIGRpc3BhdGNoCisqKgorKioJVGFyZ2V0IHRyaWVzIHRvIG5lZ290aWF0ZToKKyoqCS0+IGluY29taW5nIG1lc3NhZ2UJICAgLS0tIFNZTkMgIHNkdHIgICBzZXQgICAgU0RUUiAgIC0KKyoqCS0+IGluY29taW5nIG1lc3NhZ2UJICAgLS0tIFdJREUgIHdkdHIgICBzZXQgICAgV0RUUiAgIC0KKyoqICAgICAgV2Ugc2VudCBvdXIgYW5zd2VyOgorKioJLT4gdGFyZ2V0IGRvZXNuJ3QgbXNnb3V0ICAgLS0tIFBST1RPID8gICAgICBkZWZhLiAgLSAgICAgIGRpc3BhdGNoCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworCWNhc2UgU0lSX05FR09fRkFJTEVEOgorCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJKioKKwkJKioJTmVnb3RpYXRpb24gZmFpbGVkLgorCQkqKglUYXJnZXQgZG9lc24ndCBzZW5kIGFuIGFuc3dlciBtZXNzYWdlLAorCQkqKglvciB0YXJnZXQgcmVqZWN0ZWQgb3VyIG1lc3NhZ2UuCisJCSoqCisJCSoqICAgICAgUmVtb3ZlIG5lZ290aWF0aW9uIHJlcXVlc3QuCisJCSoqCisJCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkqLworCQlPVVRCIChIU19QUlQsIEhTX0JVU1kpOworCisJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJY2FzZSBTSVJfTkVHT19QUk9UTzoKKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSoqCisJCSoqCU5lZ290aWF0aW9uIGZhaWxlZC4KKwkJKioJVGFyZ2V0IGRvZXNuJ3QgZmV0Y2ggdGhlIGFuc3dlciBtZXNzYWdlLgorCQkqKgorCQkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJKi8KKworCQlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19ORUdPKSB7CisJCQlQUklOVF9BRERSKGNwLT5jbWQsICJuZWdvdGlhdGlvbiBmYWlsZWQgc2lyPSV4ICIKKwkJCQkJInN0YXR1cz0leC5cbiIsIG51bSwgY3AtPm5lZ29fc3RhdHVzKTsKKwkJfQorCisJCS8qCisJCSoqCWFueSBlcnJvciBpbiBuZWdvdGlhdGlvbjoKKwkJKioJZmFsbCBiYWNrIHRvIGRlZmF1bHQgbW9kZS4KKwkJKi8KKwkJc3dpdGNoIChjcC0+bmVnb19zdGF0dXMpIHsKKworCQljYXNlIE5TX1NZTkM6CisJCQlzcGlfcGVyaW9kKHN0YXJnZXQpID0gMDsKKwkJCXNwaV9vZmZzZXQoc3RhcmdldCkgPSAwOworCQkJbmNyX3NldHN5bmMgKG5wLCBjcCwgMCwgMHhlMCk7CisJCQlicmVhazsKKworCQljYXNlIE5TX1dJREU6CisJCQlzcGlfd2lkdGgoc3RhcmdldCkgPSAwOworCQkJbmNyX3NldHdpZGUgKG5wLCBjcCwgMCwgMCk7CisJCQlicmVhazsKKworCQl9CisJCW5wLT5tc2dpbiBbMF0gPSBNX05PT1A7CisJCW5wLT5tc2dvdXRbMF0gPSBNX05PT1A7CisJCWNwLT5uZWdvX3N0YXR1cyA9IDA7CisJCWJyZWFrOworCisJY2FzZSBTSVJfTkVHT19TWU5DOgorCQlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19ORUdPKSB7CisJCQluY3JfcHJpbnRfbXNnKGNwLCAic3luYyBtc2dpbiIsIG5wLT5tc2dpbik7CisJCX0KKworCQljaGcgPSAwOworCQlwZXIgPSBucC0+bXNnaW5bM107CisJCW9mcyA9IG5wLT5tc2dpbls0XTsKKwkJaWYgKG9mcz09MCkgcGVyPTI1NTsKKworCQkvKgorCQkqKiAgICAgIGlmIHRhcmdldCBzZW5kcyBTRFRSIG1lc3NhZ2UsCisJCSoqCSAgICAgIGl0IENBTiB0cmFuc2ZlciBzeW5jaC4KKwkJKi8KKworCQlpZiAob2ZzICYmIHN0YXJnZXQpCisJCQlzcGlfc3VwcG9ydF9zeW5jKHN0YXJnZXQpID0gMTsKKworCQkvKgorCQkqKgljaGVjayB2YWx1ZXMgYWdhaW5zdCBkcml2ZXIgbGltaXRzLgorCQkqLworCisJCWlmIChwZXIgPCBucC0+bWluc3luYykKKwkJCXtjaGcgPSAxOyBwZXIgPSBucC0+bWluc3luYzt9CisJCWlmIChwZXIgPCB0cC0+bWluc3luYykKKwkJCXtjaGcgPSAxOyBwZXIgPSB0cC0+bWluc3luYzt9CisJCWlmIChvZnMgPiB0cC0+bWF4b2ZmcykKKwkJCXtjaGcgPSAxOyBvZnMgPSB0cC0+bWF4b2Zmczt9CisKKwkJLyoKKwkJKioJQ2hlY2sgYWdhaW5zdCBjb250cm9sbGVyIGxpbWl0cy4KKwkJKi8KKwkJZmFrCT0gNzsKKwkJc2NudGwzCT0gMDsKKwkJaWYgKG9mcyAhPSAwKSB7CisJCQluY3JfZ2V0c3luYyhucCwgcGVyLCAmZmFrLCAmc2NudGwzKTsKKwkJCWlmIChmYWsgPiA3KSB7CisJCQkJY2hnID0gMTsKKwkJCQlvZnMgPSAwOworCQkJfQorCQl9CisJCWlmIChvZnMgPT0gMCkgeworCQkJZmFrCT0gNzsKKwkJCXBlcgk9IDA7CisJCQlzY250bDMJPSAwOworCQkJdHAtPm1pbnN5bmMgPSAwOworCQl9CisKKwkJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfTkVHTykgeworCQkJUFJJTlRfQUREUihjcC0+Y21kLCAic3luYzogcGVyPSVkIHNjbnRsMz0weCV4IG9mcz0lZCAiCisJCQkJImZhaz0lZCBjaGc9JWQuXG4iLCBwZXIsIHNjbnRsMywgb2ZzLCBmYWssIGNoZyk7CisJCX0KKworCQlpZiAoSU5CIChIU19QUlQpID09IEhTX05FR09USUFURSkgeworCQkJT1VUQiAoSFNfUFJULCBIU19CVVNZKTsKKwkJCXN3aXRjaCAoY3AtPm5lZ29fc3RhdHVzKSB7CisKKwkJCWNhc2UgTlNfU1lOQzoKKwkJCQkvKiBUaGlzIHdhcyBhbiBhbnN3ZXIgbWVzc2FnZSAqLworCQkJCWlmIChjaGcpIHsKKwkJCQkJLyogQW5zd2VyIHdhc24ndCBhY2NlcHRhYmxlLiAgKi8KKwkJCQkJc3BpX3BlcmlvZChzdGFyZ2V0KSA9IDA7CisJCQkJCXNwaV9vZmZzZXQoc3RhcmdldCkgPSAwOworCQkJCQluY3Jfc2V0c3luYyhucCwgY3AsIDAsIDB4ZTApOworCQkJCQlPVVRMX0RTUChOQ0JfU0NSSVBUX1BIWVMgKG5wLCBtc2dfYmFkKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogQW5zd2VyIGlzIG9rLiAgKi8KKwkJCQkJc3BpX3BlcmlvZChzdGFyZ2V0KSA9IHBlcjsKKwkJCQkJc3BpX29mZnNldChzdGFyZ2V0KSA9IG9mczsKKwkJCQkJbmNyX3NldHN5bmMobnAsIGNwLCBzY250bDMsIChmYWs8PDUpfG9mcyk7CisJCQkJCU9VVExfRFNQKE5DQl9TQ1JJUFRfUEhZUyAobnAsIGNscmFjaykpOworCQkJCX0KKwkJCQlyZXR1cm47CisKKwkJCWNhc2UgTlNfV0lERToKKwkJCQlzcGlfd2lkdGgoc3RhcmdldCkgPSAwOworCQkJCW5jcl9zZXR3aWRlKG5wLCBjcCwgMCwgMCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKgorCQkqKglJdCB3YXMgYSByZXF1ZXN0LiBTZXQgdmFsdWUgYW5kCisJCSoqICAgICAgcHJlcGFyZSBhbiBhbnN3ZXIgbWVzc2FnZQorCQkqLworCisJCXNwaV9wZXJpb2Qoc3RhcmdldCkgPSBwZXI7CisJCXNwaV9vZmZzZXQoc3RhcmdldCkgPSBvZnM7CisJCW5jcl9zZXRzeW5jKG5wLCBjcCwgc2NudGwzLCAoZmFrPDw1KXxvZnMpOworCisJCW5wLT5tc2dvdXRbMF0gPSBNX0VYVEVOREVEOworCQlucC0+bXNnb3V0WzFdID0gMzsKKwkJbnAtPm1zZ291dFsyXSA9IE1fWF9TWU5DX1JFUTsKKwkJbnAtPm1zZ291dFszXSA9IHBlcjsKKwkJbnAtPm1zZ291dFs0XSA9IG9mczsKKworCQljcC0+bmVnb19zdGF0dXMgPSBOU19TWU5DOworCisJCWlmIChERUJVR19GTEFHUyAmIERFQlVHX05FR08pIHsKKwkJCW5jcl9wcmludF9tc2coY3AsICJzeW5jIG1zZ291dCIsIG5wLT5tc2dvdXQpOworCQl9CisKKwkJaWYgKCFvZnMpIHsKKwkJCU9VVExfRFNQIChOQ0JfU0NSSVBUX1BIWVMgKG5wLCBtc2dfYmFkKSk7CisJCQlyZXR1cm47CisJCX0KKwkJbnAtPm1zZ2luIFswXSA9IE1fTk9PUDsKKworCQlicmVhazsKKworCWNhc2UgU0lSX05FR09fV0lERToKKwkJLyoKKwkJKioJV2lkZSByZXF1ZXN0IG1lc3NhZ2UgcmVjZWl2ZWQuCisJCSovCisJCWlmIChERUJVR19GTEFHUyAmIERFQlVHX05FR08pIHsKKwkJCW5jcl9wcmludF9tc2coY3AsICJ3aWRlIG1zZ2luIiwgbnAtPm1zZ2luKTsKKwkJfQorCisJCS8qCisJCSoqCWdldCByZXF1ZXN0ZWQgdmFsdWVzLgorCQkqLworCisJCWNoZyAgPSAwOworCQl3aWRlID0gbnAtPm1zZ2luWzNdOworCisJCS8qCisJCSoqICAgICAgaWYgdGFyZ2V0IHNlbmRzIFdEVFIgbWVzc2FnZSwKKwkJKioJICAgICAgaXQgQ0FOIHRyYW5zZmVyIHdpZGUuCisJCSovCisKKwkJaWYgKHdpZGUgJiYgc3RhcmdldCkKKwkJCXNwaV9zdXBwb3J0X3dpZGUoc3RhcmdldCkgPSAxOworCisJCS8qCisJCSoqCWNoZWNrIHZhbHVlcyBhZ2FpbnN0IGRyaXZlciBsaW1pdHMuCisJCSovCisKKwkJaWYgKHdpZGUgPiB0cC0+dXNyd2lkZSkKKwkJCXtjaGcgPSAxOyB3aWRlID0gdHAtPnVzcndpZGU7fQorCisJCWlmIChERUJVR19GTEFHUyAmIERFQlVHX05FR08pIHsKKwkJCVBSSU5UX0FERFIoY3AtPmNtZCwgIndpZGU6IHdpZGU9JWQgY2hnPSVkLlxuIiwgd2lkZSwKKwkJCQkJY2hnKTsKKwkJfQorCisJCWlmIChJTkIgKEhTX1BSVCkgPT0gSFNfTkVHT1RJQVRFKSB7CisJCQlPVVRCIChIU19QUlQsIEhTX0JVU1kpOworCQkJc3dpdGNoIChjcC0+bmVnb19zdGF0dXMpIHsKKworCQkJY2FzZSBOU19XSURFOgorCQkJCS8qCisJCQkJKiogICAgICBUaGlzIHdhcyBhbiBhbnN3ZXIgbWVzc2FnZQorCQkJCSovCisJCQkJaWYgKGNoZykgeworCQkJCQkvKiBBbnN3ZXIgd2Fzbid0IGFjY2VwdGFibGUuICAqLworCQkJCQlzcGlfd2lkdGgoc3RhcmdldCkgPSAwOworCQkJCQluY3Jfc2V0d2lkZShucCwgY3AsIDAsIDEpOworCQkJCQlPVVRMX0RTUCAoTkNCX1NDUklQVF9QSFlTIChucCwgbXNnX2JhZCkpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIEFuc3dlciBpcyBvay4gICovCisJCQkJCXNwaV93aWR0aChzdGFyZ2V0KSA9IHdpZGU7CisJCQkJCW5jcl9zZXR3aWRlKG5wLCBjcCwgd2lkZSwgMSk7CisJCQkJCU9VVExfRFNQIChOQ0JfU0NSSVBUX1BIWVMgKG5wLCBjbHJhY2spKTsKKwkJCQl9CisJCQkJcmV0dXJuOworCisJCQljYXNlIE5TX1NZTkM6CisJCQkJc3BpX3BlcmlvZChzdGFyZ2V0KSA9IDA7CisJCQkJc3BpX29mZnNldChzdGFyZ2V0KSA9IDA7CisJCQkJbmNyX3NldHN5bmMobnAsIGNwLCAwLCAweGUwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qCisJCSoqCUl0IHdhcyBhIHJlcXVlc3QsIHNldCB2YWx1ZSBhbmQKKwkJKiogICAgICBwcmVwYXJlIGFuIGFuc3dlciBtZXNzYWdlCisJCSovCisKKwkJc3BpX3dpZHRoKHN0YXJnZXQpID0gd2lkZTsKKwkJbmNyX3NldHdpZGUobnAsIGNwLCB3aWRlLCAxKTsKKworCQlucC0+bXNnb3V0WzBdID0gTV9FWFRFTkRFRDsKKwkJbnAtPm1zZ291dFsxXSA9IDI7CisJCW5wLT5tc2dvdXRbMl0gPSBNX1hfV0lERV9SRVE7CisJCW5wLT5tc2dvdXRbM10gPSB3aWRlOworCisJCW5wLT5tc2dpbiBbMF0gPSBNX05PT1A7CisKKwkJY3AtPm5lZ29fc3RhdHVzID0gTlNfV0lERTsKKworCQlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19ORUdPKSB7CisJCQluY3JfcHJpbnRfbXNnKGNwLCAid2lkZSBtc2dvdXQiLCBucC0+bXNnaW4pOworCQl9CisJCWJyZWFrOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKioJUHJvY2Vzc2luZyBvZiBzcGVjaWFsIG1lc3NhZ2VzCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworCWNhc2UgU0lSX1JFSkVDVF9SRUNFSVZFRDoKKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkqKgorCQkqKglXZSByZWNlaXZlZCBhIE1fUkVKRUNUIG1lc3NhZ2UuCisJCSoqCisJCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJKi8KKworCQlQUklOVF9BRERSKGNwLT5jbWQsICJNX1JFSkVDVCByZWNlaXZlZCAoJXg6JXgpLlxuIiwKKwkJCSh1bnNpZ25lZClzY3JfdG9fY3B1KG5wLT5sYXN0bXNnKSwgbnAtPm1zZ291dFswXSk7CisJCWJyZWFrOworCisJY2FzZSBTSVJfUkVKRUNUX1NFTlQ6CisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJKioKKwkJKioJV2UgcmVjZWl2ZWQgYW4gdW5rbm93biBtZXNzYWdlCisJCSoqCisJCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJKi8KKworCQluY3JfcHJpbnRfbXNnKGNwLCAiTV9SRUpFQ1Qgc2VudCBmb3IiLCBucC0+bXNnaW4pOworCQlicmVhazsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqCVByb2Nlc3Npbmcgb2Ygc3BlY2lhbCBtZXNzYWdlcworKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKwljYXNlIFNJUl9JR05fUkVTSURVRToKKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkqKgorCQkqKglXZSByZWNlaXZlZCBhbiBJR05PUkUgUkVTSURVRSBtZXNzYWdlLAorCQkqKgl3aGljaCBjb3VsZG4ndCBiZSBoYW5kbGVkIGJ5IHRoZSBzY3JpcHQuCisJCSoqCisJCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJKi8KKworCQlQUklOVF9BRERSKGNwLT5jbWQsICJNX0lHTl9SRVNJRFVFIHJlY2VpdmVkLCBidXQgbm90IHlldCAiCisJCQkJImltcGxlbWVudGVkLlxuIik7CisJCWJyZWFrOworI2lmIDAKKwljYXNlIFNJUl9NSVNTSU5HX1NBVkU6CisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJKioKKwkJKioJV2UgcmVjZWl2ZWQgYW4gRElTQ09OTkVDVCBtZXNzYWdlLAorCQkqKglidXQgdGhlIGRhdGFwb2ludGVyIHdhc24ndCBzYXZlZCBiZWZvcmUuCisJCSoqCisJCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJKi8KKworCQlQUklOVF9BRERSKGNwLT5jbWQsICJNX0RJU0NPTk5FQ1QgcmVjZWl2ZWQsIGJ1dCBkYXRhcG9pbnRlciAiCisJCQkJIm5vdCBzYXZlZDogZGF0YT0leCBzYXZlPSV4IGdvYWw9JXguXG4iLAorCQkJKHVuc2lnbmVkKSBJTkwgKG5jX3RlbXApLAorCQkJKHVuc2lnbmVkKSBzY3JfdG9fY3B1KG5wLT5oZWFkZXIuc2F2ZXApLAorCQkJKHVuc2lnbmVkKSBzY3JfdG9fY3B1KG5wLT5oZWFkZXIuZ29hbHApKTsKKwkJYnJlYWs7CisjZW5kaWYKKwl9CisKK291dDoKKwlPVVRPTkJfU1REICgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgorKioJQWNxdWlyZSBhIGNvbnRyb2wgYmxvY2sKKyoqCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitzdGF0aWMgc3RydWN0IGNjYiAqbmNyX2dldF9jY2Ioc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwl1X2NoYXIgdG4gPSBjbWQtPmRldmljZS0+aWQ7CisJdV9jaGFyIGxuID0gY21kLT5kZXZpY2UtPmx1bjsKKwlzdHJ1Y3QgdGNiICp0cCA9ICZucC0+dGFyZ2V0W3RuXTsKKwlzdHJ1Y3QgbGNiICpscCA9IHRwLT5scFtsbl07CisJdV9jaGFyIHRhZyA9IE5PX1RBRzsKKwlzdHJ1Y3QgY2NiICpjcCA9IE5VTEw7CisKKwkvKgorCSoqCUx1biBzdHJ1Y3R1cmUgYXZhaWxhYmxlID8KKwkqLworCWlmIChscCkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpxcDsKKwkJLyoKKwkJKioJS2VlcCBmcm9tIHVzaW5nIG1vcmUgdGFncyB0aGFuIHdlIGNhbiBoYW5kbGUuCisJCSovCisJCWlmIChscC0+dXNldGFncyAmJiBscC0+YnVzeWNjYnMgPj0gbHAtPm1heG54cykKKwkJCXJldHVybiBOVUxMOworCisJCS8qCisJCSoqCUFsbG9jYXRlIGEgbmV3IENDQiBpZiBuZWVkZWQuCisJCSovCisJCWlmIChsaXN0X2VtcHR5KCZscC0+ZnJlZV9jY2JxKSkKKwkJCW5jcl9hbGxvY19jY2IobnAsIHRuLCBsbik7CisKKwkJLyoKKwkJKioJTG9vayBmb3IgZnJlZSBDQ0IKKwkJKi8KKwkJcXAgPSBuY3JfbGlzdF9wb3AoJmxwLT5mcmVlX2NjYnEpOworCQlpZiAocXApIHsKKwkJCWNwID0gbGlzdF9lbnRyeShxcCwgc3RydWN0IGNjYiwgbGlua19jY2JxKTsKKwkJCWlmIChjcC0+bWFnaWMpIHsKKwkJCQlQUklOVF9BRERSKGNtZCwgImNjYiBmcmVlIGxpc3QgY29ycnVwdGVkICIKKwkJCQkJCSIoQCVwKVxuIiwgY3ApOworCQkJCWNwID0gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJbGlzdF9hZGRfdGFpbChxcCwgJmxwLT53YWl0X2NjYnEpOworCQkJCSsrbHAtPmJ1c3ljY2JzOworCQkJfQorCQl9CisKKwkJLyoKKwkJKioJSWYgYSBDQ0IgaXMgYXZhaWxhYmxlLAorCQkqKglHZXQgYSB0YWcgZm9yIHRoaXMgbmV4dXMgaWYgcmVxdWlyZWQuCisJCSovCisJCWlmIChjcCkgeworCQkJaWYgKGxwLT51c2V0YWdzKQorCQkJCXRhZyA9IGxwLT5jYl90YWdzW2xwLT5pYV90YWddOworCQl9CisJCWVsc2UgaWYgKGxwLT5hY3RjY2JzID4gMCkKKwkJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJKioJaWYgbm90aGluZyBhdmFpbGFibGUsIHRha2UgdGhlIGRlZmF1bHQuCisJKi8KKwlpZiAoIWNwKQorCQljcCA9IG5wLT5jY2I7CisKKwkvKgorCSoqCVdhaXQgdW50aWwgYXZhaWxhYmxlLgorCSovCisjaWYgMAorCXdoaWxlIChjcC0+bWFnaWMpIHsKKwkJaWYgKGZsYWdzICYgU0NTSV9OT1NMRUVQKSBicmVhazsKKwkJaWYgKHRzbGVlcCAoKGNhZGRyX3QpY3AsIFBSSUJJT3xQQ0FUQ0gsICJuY3IiLCAwKSkKKwkJCWJyZWFrOworCX0KKyNlbmRpZgorCisJaWYgKGNwLT5tYWdpYykKKwkJcmV0dXJuIE5VTEw7CisKKwljcC0+bWFnaWMgPSAxOworCisJLyoKKwkqKglNb3ZlIHRvIG5leHQgYXZhaWxhYmxlIHRhZyBpZiB0YWcgdXNlZC4KKwkqLworCWlmIChscCkgeworCQlpZiAodGFnICE9IE5PX1RBRykgeworCQkJKytscC0+aWFfdGFnOworCQkJaWYgKGxwLT5pYV90YWcgPT0gTUFYX1RBR1MpCisJCQkJbHAtPmlhX3RhZyA9IDA7CisJCQlscC0+dGFnc191bWFwIHw9ICgoKHRhZ21hcF90KSAxKSA8PCB0YWcpOworCQl9CisJfQorCisJLyoKKwkqKglSZW1lbWJlciBhbGwgaW5mb3JtYXRpb25zIG5lZWRlZCB0byBmcmVlIHRoaXMgQ0NCLgorCSovCisJY3AtPnRhZwkgICA9IHRhZzsKKwljcC0+dGFyZ2V0ID0gdG47CisJY3AtPmx1biAgICA9IGxuOworCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfVEFHUykgeworCQlQUklOVF9BRERSKGNtZCwgImNjYiBAJXAgdXNpbmcgdGFnICVkLlxuIiwgY3AsIHRhZyk7CisJfQorCisJcmV0dXJuIGNwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgorKioJUmVsZWFzZSBvbmUgY29udHJvbCBibG9jaworKioKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK3N0YXRpYyB2b2lkIG5jcl9mcmVlX2NjYiAoc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBjY2IgKmNwKQoreworCXN0cnVjdCB0Y2IgKnRwID0gJm5wLT50YXJnZXRbY3AtPnRhcmdldF07CisJc3RydWN0IGxjYiAqbHAgPSB0cC0+bHBbY3AtPmx1bl07CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19UQUdTKSB7CisJCVBSSU5UX0FERFIoY3AtPmNtZCwgImNjYiBAJXAgZnJlZWluZyB0YWcgJWQuXG4iLCBjcCwgY3AtPnRhZyk7CisJfQorCisJLyoKKwkqKglJZiBsdW4gY29udHJvbCBibG9jayBhdmFpbGFibGUsCisJKioJZGVjcmVtZW50IGFjdGl2ZSBjb21tYW5kcyBhbmQgaW5jcmVtZW50IGNyZWRpdCwgCisJKioJZnJlZSB0aGUgdGFnIGlmIGFueSBhbmQgcmVtb3ZlIHRoZSBKVU1QIGZvciByZXNlbGVjdC4KKwkqLworCWlmIChscCkgeworCQlpZiAoY3AtPnRhZyAhPSBOT19UQUcpIHsKKwkJCWxwLT5jYl90YWdzW2xwLT5pZl90YWcrK10gPSBjcC0+dGFnOworCQkJaWYgKGxwLT5pZl90YWcgPT0gTUFYX1RBR1MpCisJCQkJbHAtPmlmX3RhZyA9IDA7CisJCQlscC0+dGFnc191bWFwICY9IH4oKCh0YWdtYXBfdCkgMSkgPDwgY3AtPnRhZyk7CisJCQlscC0+dGFnc19zbWFwICY9IGxwLT50YWdzX3VtYXA7CisJCQlscC0+anVtcF9jY2JbY3AtPnRhZ10gPQorCQkJCWNwdV90b19zY3IoTkNCX1NDUklQVEhfUEhZUyhucCwgYmFkX2lfdF9sX3EpKTsKKwkJfSBlbHNlIHsKKwkJCWxwLT5qdW1wX2NjYlswXSA9CisJCQkJY3B1X3RvX3NjcihOQ0JfU0NSSVBUSF9QSFlTKG5wLCBiYWRfaV90X2wpKTsKKwkJfQorCX0KKworCS8qCisJKioJTWFrZSB0aGlzIENDQiBhdmFpbGFibGUuCisJKi8KKworCWlmIChscCkgeworCQlpZiAoY3AgIT0gbnAtPmNjYikKKwkJCWxpc3RfbW92ZSgmY3AtPmxpbmtfY2NicSwgJmxwLT5mcmVlX2NjYnEpOworCQktLWxwLT5idXN5Y2NiczsKKwkJaWYgKGNwLT5xdWV1ZWQpIHsKKwkJCS0tbHAtPnF1ZXVlZGNjYnM7CisJCX0KKwl9CisJY3AgLT4gaG9zdF9zdGF0dXMgPSBIU19JRExFOworCWNwIC0+IG1hZ2ljID0gMDsKKwlpZiAoY3AtPnF1ZXVlZCkgeworCQktLW5wLT5xdWV1ZWRjY2JzOworCQljcC0+cXVldWVkID0gMDsKKwl9CisKKyNpZiAwCisJaWYgKGNwID09IG5wLT5jY2IpCisJCXdha2V1cCAoKGNhZGRyX3QpIGNwKTsKKyNlbmRpZgorfQorCisKKyNkZWZpbmUgbmNyX3JlZ19idXNfYWRkcihyKSAobnAtPnBhZGRyICsgb2Zmc2V0b2YgKHN0cnVjdCBuY3JfcmVnLCByKSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCUluaXRpYWxpemUgdGhlIGZpeGVkIHBhcnQgb2YgYSBDQ0Igc3RydWN0dXJlLgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIHZvaWQgbmNyX2luaXRfY2NiKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3QgY2NiICpjcCkKK3sKKwluY3JjbWQgY29weV80ID0gbnAtPmZlYXR1cmVzICYgRkVfUEZFTiA/IFNDUl9DT1BZKDQpIDogU0NSX0NPUFlfRig0KTsKKworCS8qCisJKioJUmVtZW1iZXIgdmlydHVhbCBhbmQgYnVzIGFkZHJlc3Mgb2YgdGhpcyBjY2IuCisJKi8KKwljcC0+cF9jY2IgCSAgID0gdnRvYnVzKGNwKTsKKwljcC0+cGh5cy5oZWFkZXIuY3AgPSBjcDsKKworCS8qCisJKioJVGhpcyBhbGxvd3MgbGlzdF9kZWwgdG8gd29yayBmb3IgdGhlIGRlZmF1bHQgY2NiLgorCSovCisJSU5JVF9MSVNUX0hFQUQoJmNwLT5saW5rX2NjYnEpOworCisJLyoKKwkqKglJbml0aWFseXplIHRoZSBzdGFydCBhbmQgcmVzdGFydCBsYXVuY2ggc2NyaXB0LgorCSoqCisJKioJQ09QWSg0KSBAKC4uLnBfcGh5cyksIEAoZHNhKQorCSoqCUpVTVAgQChzY2hlZF9wb2ludCkKKwkqLworCWNwLT5zdGFydC5zZXR1cF9kc2FbMF0JID0gY3B1X3RvX3Njcihjb3B5XzQpOworCWNwLT5zdGFydC5zZXR1cF9kc2FbMV0JID0gY3B1X3RvX3NjcihDQ0JfUEhZUyhjcCwgc3RhcnQucF9waHlzKSk7CisJY3AtPnN0YXJ0LnNldHVwX2RzYVsyXQkgPSBjcHVfdG9fc2NyKG5jcl9yZWdfYnVzX2FkZHIobmNfZHNhKSk7CisJY3AtPnN0YXJ0LnNjaGVkdWxlLmxfY21kID0gY3B1X3RvX3NjcihTQ1JfSlVNUCk7CisJY3AtPnN0YXJ0LnBfcGh5cwkgPSBjcHVfdG9fc2NyKENDQl9QSFlTKGNwLCBwaHlzKSk7CisKKwltZW1jcHkoJmNwLT5yZXN0YXJ0LCAmY3AtPnN0YXJ0LCBzaXplb2YoY3AtPnJlc3RhcnQpKTsKKworCWNwLT5zdGFydC5zY2hlZHVsZS5sX3BhZGRyICAgPSBjcHVfdG9fc2NyKE5DQl9TQ1JJUFRfUEhZUyAobnAsIGlkbGUpKTsKKwljcC0+cmVzdGFydC5zY2hlZHVsZS5sX3BhZGRyID0gY3B1X3RvX3NjcihOQ0JfU0NSSVBUSF9QSFlTIChucCwgYWJvcnQpKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioJQWxsb2NhdGUgYSBDQ0IgYW5kIGluaXRpYWxpemUgaXRzIGZpeGVkIHBhcnQuCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgdm9pZCBuY3JfYWxsb2NfY2NiKHN0cnVjdCBuY2IgKm5wLCB1X2NoYXIgdG4sIHVfY2hhciBsbikKK3sKKwlzdHJ1Y3QgdGNiICp0cCA9ICZucC0+dGFyZ2V0W3RuXTsKKwlzdHJ1Y3QgbGNiICpscCA9IHRwLT5scFtsbl07CisJc3RydWN0IGNjYiAqY3AgPSBOVUxMOworCisJLyoKKwkqKglBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgQ0NCLgorCSovCisJY3AgPSBtX2NhbGxvY19kbWEoc2l6ZW9mKHN0cnVjdCBjY2IpLCAiQ0NCIik7CisJaWYgKCFjcCkKKwkJcmV0dXJuOworCisJLyoKKwkqKglDb3VudCBpdCBhbmQgaW5pdGlhbHl6ZSBpdC4KKwkqLworCWxwLT5hY3RjY2JzKys7CisJbnAtPmFjdGNjYnMrKzsKKwltZW1zZXQoY3AsIDAsIHNpemVvZiAoKmNwKSk7CisJbmNyX2luaXRfY2NiKG5wLCBjcCk7CisKKwkvKgorCSoqCUNoYWluIGludG8gd2FrZXVwIGxpc3QgYW5kIGZyZWUgY2NiIHF1ZXVlIGFuZCB0YWtlIGl0IAorCSoqCWludG8gYWNjb3VudCBmb3IgdGFnZ2VkIGNvbW1hbmRzLgorCSovCisJY3AtPmxpbmtfY2NiICAgICAgPSBucC0+Y2NiLT5saW5rX2NjYjsKKwlucC0+Y2NiLT5saW5rX2NjYiA9IGNwOworCisJbGlzdF9hZGQoJmNwLT5saW5rX2NjYnEsICZscC0+ZnJlZV9jY2JxKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioKKyoqICAgICAgQWxsb2NhdGlvbiBvZiByZXNvdXJjZXMgZm9yIFRhcmdldHMvTHVucy9UYWdzLgorKioKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCVRhcmdldCBjb250cm9sIGJsb2NrIGluaXRpYWxpc2F0aW9uLgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCVRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgYWZ0ZXIgYSBTQ1NJIGNvbW1hbmQgCisqKgloYXMgYmVlbiBzdWNjZXNzZnVsbHkgY29tcGxldGVkIGZvciB0aGlzIHRhcmdldC4KKyoqCUl0IGNvbnRhaW5zIGEgU0NSSVBUIHRoYXQgaXMgY2FsbGVkIG9uIHRhcmdldCByZXNlbGVjdGlvbi4KKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIHZvaWQgbmNyX2luaXRfdGNiIChzdHJ1Y3QgbmNiICpucCwgdV9jaGFyIHRuKQoreworCXN0cnVjdCB0Y2IgKnRwID0gJm5wLT50YXJnZXRbdG5dOworCW5jcmNtZCBjb3B5XzEgPSBucC0+ZmVhdHVyZXMgJiBGRV9QRkVOID8gU0NSX0NPUFkoMSkgOiBTQ1JfQ09QWV9GKDEpOworCWludCB0aCA9IHRuICYgMzsKKwlpbnQgaTsKKworCS8qCisJKioJSnVtcCB0byBuZXh0IHRjYiBpZiBTRkJSIGRvZXMgbm90IG1hdGNoIHRoaXMgdGFyZ2V0LgorCSoqCUpVTVAgIElGIChTRkJSICE9ICN0YXJnZXQjKSwgQChuZXh0IHRjYikKKwkqLworCXRwLT5qdW1wX3RjYi5sX2NtZCAgID0KKwkJY3B1X3RvX3NjcigoU0NSX0pVTVAgXiBJRkZBTFNFIChEQVRBICgweDgwICsgdG4pKSkpOworCXRwLT5qdW1wX3RjYi5sX3BhZGRyID0gbnAtPmp1bXBfdGNiW3RoXS5sX3BhZGRyOworCisJLyoKKwkqKglMb2FkIHRoZSBzeW5jaHJvbm91cyB0cmFuc2ZlciByZWdpc3Rlci4KKwkqKglDT1BZIEAodHAtPnN2YWwpLCBAKHN4ZmVyKQorCSovCisJdHAtPmdldHNjclswXSA9CWNwdV90b19zY3IoY29weV8xKTsKKwl0cC0+Z2V0c2NyWzFdID0gY3B1X3RvX3Njcih2dG9idXMgKCZ0cC0+c3ZhbCkpOworI2lmZGVmIFNDU0lfTkNSX0JJR19FTkRJQU4KKwl0cC0+Z2V0c2NyWzJdID0gY3B1X3RvX3NjcihuY3JfcmVnX2J1c19hZGRyKG5jX3N4ZmVyKSBeIDMpOworI2Vsc2UKKwl0cC0+Z2V0c2NyWzJdID0gY3B1X3RvX3NjcihuY3JfcmVnX2J1c19hZGRyKG5jX3N4ZmVyKSk7CisjZW5kaWYKKworCS8qCisJKioJTG9hZCB0aGUgdGltaW5nIHJlZ2lzdGVyLgorCSoqCUNPUFkgQCh0cC0+d3ZhbCksIEAoc2NudGwzKQorCSovCisJdHAtPmdldHNjclszXSA9CWNwdV90b19zY3IoY29weV8xKTsKKwl0cC0+Z2V0c2NyWzRdID0gY3B1X3RvX3Njcih2dG9idXMgKCZ0cC0+d3ZhbCkpOworI2lmZGVmIFNDU0lfTkNSX0JJR19FTkRJQU4KKwl0cC0+Z2V0c2NyWzVdID0gY3B1X3RvX3NjcihuY3JfcmVnX2J1c19hZGRyKG5jX3NjbnRsMykgXiAzKTsKKyNlbHNlCisJdHAtPmdldHNjcls1XSA9IGNwdV90b19zY3IobmNyX3JlZ19idXNfYWRkcihuY19zY250bDMpKTsKKyNlbmRpZgorCisJLyoKKwkqKglHZXQgdGhlIElERU5USUZZIG1lc3NhZ2UgYW5kIHRoZSBsdW4uCisJKioJQ0FMTCBAc2NyaXB0KHJlc2VsX2x1bikKKwkqLworCXRwLT5jYWxsX2x1bi5sX2NtZCAgID0gY3B1X3RvX3NjcihTQ1JfQ0FMTCk7CisJdHAtPmNhbGxfbHVuLmxfcGFkZHIgPSBjcHVfdG9fc2NyKE5DQl9TQ1JJUFRfUEhZUyAobnAsIHJlc2VsX2x1bikpOworCisJLyoKKwkqKglMb29rIGZvciB0aGUgbHVuIGNvbnRyb2wgYmxvY2sgb2YgdGhpcyBuZXh1cy4KKwkqKglGb3IgaSA9IDAgdG8gMworCSoqCQlKVU1QIF4gSUZUUlVFIChNQVNLIChpLCAzKSksIEAobmV4dF9sY2IpCisJKi8KKwlmb3IgKGkgPSAwIDsgaSA8IDQgOyBpKyspIHsKKwkJdHAtPmp1bXBfbGNiW2ldLmxfY21kICAgPQorCQkJCWNwdV90b19zY3IoKFNDUl9KVU1QIF4gSUZUUlVFIChNQVNLIChpLCAzKSkpKTsKKwkJdHAtPmp1bXBfbGNiW2ldLmxfcGFkZHIgPQorCQkJCWNwdV90b19zY3IoTkNCX1NDUklQVEhfUEhZUyAobnAsIGJhZF9pZGVudGlmeSkpOworCX0KKworCS8qCisJKioJTGluayB0aGlzIHRhcmdldCBjb250cm9sIGJsb2NrIHRvIHRoZSBKVU1QIGNoYWluLgorCSovCisJbnAtPmp1bXBfdGNiW3RoXS5sX3BhZGRyID0gY3B1X3RvX3Njcih2dG9idXMgKCZ0cC0+anVtcF90Y2IpKTsKKworCS8qCisJKioJVGhlc2UgYXNzZXJ0J3Mgc2hvdWxkIGJlIG1vdmVkIGF0IGRyaXZlciBpbml0aWFsaXNhdGlvbnMuCisJKi8KKyNpZmRlZiBTQ1NJX05DUl9CSUdfRU5ESUFOCisJQlVHX09OKCgob2Zmc2V0b2Yoc3RydWN0IG5jcl9yZWcsIG5jX3N4ZmVyKSBeCisJCSBvZmZzZXRvZihzdHJ1Y3QgdGNiICAgICwgc3ZhbCAgICApKSAmMykgIT0gMyk7CisJQlVHX09OKCgob2Zmc2V0b2Yoc3RydWN0IG5jcl9yZWcsIG5jX3NjbnRsMykgXgorCQkgb2Zmc2V0b2Yoc3RydWN0IHRjYiAgICAsIHd2YWwgICAgKSkgJjMpICE9IDMpOworI2Vsc2UKKwlCVUdfT04oKChvZmZzZXRvZihzdHJ1Y3QgbmNyX3JlZywgbmNfc3hmZXIpIF4KKwkJIG9mZnNldG9mKHN0cnVjdCB0Y2IgICAgLCBzdmFsICAgICkpICYzKSAhPSAwKTsKKwlCVUdfT04oKChvZmZzZXRvZihzdHJ1Y3QgbmNyX3JlZywgbmNfc2NudGwzKSBeCisJCSBvZmZzZXRvZihzdHJ1Y3QgdGNiICAgICwgd3ZhbCAgICApKSAmMykgIT0gMCk7CisjZW5kaWYKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioJTHVuIGNvbnRyb2wgYmxvY2sgYWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24uCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioJVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIGFmdGVyIGEgU0NTSSAKKyoqCWNvbW1hbmQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCBmb3IgdGhpcyB0YXJnZXQvbHVuLgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgc3RydWN0IGxjYiAqbmNyX2FsbG9jX2xjYiAoc3RydWN0IG5jYiAqbnAsIHVfY2hhciB0biwgdV9jaGFyIGxuKQoreworCXN0cnVjdCB0Y2IgKnRwID0gJm5wLT50YXJnZXRbdG5dOworCXN0cnVjdCBsY2IgKmxwID0gdHAtPmxwW2xuXTsKKwluY3JjbWQgY29weV80ID0gbnAtPmZlYXR1cmVzICYgRkVfUEZFTiA/IFNDUl9DT1BZKDQpIDogU0NSX0NPUFlfRig0KTsKKwlpbnQgbGggPSBsbiAmIDM7CisKKwkvKgorCSoqCUFscmVhZHkgZG9uZSwgcmV0dXJuLgorCSovCisJaWYgKGxwKQorCQlyZXR1cm4gbHA7CisKKwkvKgorCSoqCUFsbG9jYXRlIHRoZSBsY2IuCisJKi8KKwlscCA9IG1fY2FsbG9jX2RtYShzaXplb2Yoc3RydWN0IGxjYiksICJMQ0IiKTsKKwlpZiAoIWxwKQorCQlnb3RvIGZhaWw7CisJbWVtc2V0KGxwLCAwLCBzaXplb2YoKmxwKSk7CisJdHAtPmxwW2xuXSA9IGxwOworCisJLyoKKwkqKglJbml0aWFsaXplIHRoZSB0YXJnZXQgY29udHJvbCBibG9jayBpZiBub3QgeWV0LgorCSovCisJaWYgKCF0cC0+anVtcF90Y2IubF9jbWQpCisJCW5jcl9pbml0X3RjYihucCwgdG4pOworCisJLyoKKwkqKglJbml0aWFsaXplIHRoZSBDQ0IgcXVldWUgaGVhZGVycy4KKwkqLworCUlOSVRfTElTVF9IRUFEKCZscC0+ZnJlZV9jY2JxKTsKKwlJTklUX0xJU1RfSEVBRCgmbHAtPmJ1c3lfY2NicSk7CisJSU5JVF9MSVNUX0hFQUQoJmxwLT53YWl0X2NjYnEpOworCUlOSVRfTElTVF9IRUFEKCZscC0+c2tpcF9jY2JxKTsKKworCS8qCisJKioJU2V0IG1heCBDQ0JzIHRvIDEgYW5kIHVzZSB0aGUgZGVmYXVsdCAxIGVudHJ5IAorCSoqCWp1bXAgdGFibGUgYnkgZGVmYXVsdC4KKwkqLworCWxwLT5tYXhueHMJPSAxOworCWxwLT5qdW1wX2NjYgk9ICZscC0+anVtcF9jY2JfMDsKKwlscC0+cF9qdW1wX2NjYgk9IGNwdV90b19zY3IodnRvYnVzKGxwLT5qdW1wX2NjYikpOworCisJLyoKKwkqKglJbml0aWxpYWx5emUgdGhlIHJlc2VsZWN0IHNjcmlwdDoKKwkqKgorCSoqCUp1bXAgdG8gbmV4dCBsY2IgaWYgU0ZCUiBkb2VzIG5vdCBtYXRjaCB0aGlzIGx1bi4KKwkqKglMb2FkIFRFTVAgd2l0aCB0aGUgQ0NCIGRpcmVjdCBqdW1wIHRhYmxlIGJ1cyBhZGRyZXNzLgorCSoqCUdldCB0aGUgU0lNUExFIFRBRyBtZXNzYWdlIGFuZCB0aGUgdGFnLgorCSoqCisJKioJSlVNUCAgSUYgKFNGQlIgIT0gI2x1biMpLCBAKG5leHQgbGNiKQorCSoqCUNPUFkgQChscC0+cF9qdW1wX2NjYiksCSAgQCh0ZW1wKQorCSoqCUpVTVAgQHNjcmlwdChyZXNlbF9ub3RhZykKKwkqLworCWxwLT5qdW1wX2xjYi5sX2NtZCAgID0KKwkJY3B1X3RvX3NjcigoU0NSX0pVTVAgXiBJRkZBTFNFIChNQVNLICgweDgwK2xuLCAweGZmKSkpKTsKKwlscC0+anVtcF9sY2IubF9wYWRkciA9IHRwLT5qdW1wX2xjYltsaF0ubF9wYWRkcjsKKworCWxwLT5sb2FkX2p1bXBfY2NiWzBdID0gY3B1X3RvX3Njcihjb3B5XzQpOworCWxwLT5sb2FkX2p1bXBfY2NiWzFdID0gY3B1X3RvX3Njcih2dG9idXMgKCZscC0+cF9qdW1wX2NjYikpOworCWxwLT5sb2FkX2p1bXBfY2NiWzJdID0gY3B1X3RvX3NjcihuY3JfcmVnX2J1c19hZGRyKG5jX3RlbXApKTsKKworCWxwLT5qdW1wX3RhZy5sX2NtZCAgID0gY3B1X3RvX3NjcihTQ1JfSlVNUCk7CisJbHAtPmp1bXBfdGFnLmxfcGFkZHIgPSBjcHVfdG9fc2NyKE5DQl9TQ1JJUFRfUEhZUyAobnAsIHJlc2VsX25vdGFnKSk7CisKKwkvKgorCSoqCUxpbmsgdGhpcyBsdW4gY29udHJvbCBibG9jayB0byB0aGUgSlVNUCBjaGFpbi4KKwkqLworCXRwLT5qdW1wX2xjYltsaF0ubF9wYWRkciA9IGNwdV90b19zY3IodnRvYnVzICgmbHAtPmp1bXBfbGNiKSk7CisKKwkvKgorCSoqCUluaXRpYWxpemUgY29tbWFuZCBxdWV1aW5nIGNvbnRyb2wuCisJKi8KKwlscC0+YnVzeWNjYnMJPSAxOworCWxwLT5xdWV1ZWRjY2JzCT0gMTsKKwlscC0+cXVldWVkZXB0aAk9IDE7CitmYWlsOgorCXJldHVybiBscDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioJTHVuIGNvbnRyb2wgYmxvY2sgc2V0dXAgb24gSU5RVUlSWSBkYXRhIHJlY2VpdmVkLgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCVdlIG9ubHkgc3VwcG9ydCBXSURFLCBTWU5DIGZvciB0YXJnZXRzIGFuZCBDTURRIGZvciBsb2dpY2FsIHVuaXRzLgorKioJVGhpcyBzZXR1cCBpcyBkb25lIG9uIGVhY2ggSU5RVUlSWSBzaW5jZSB3ZSBhcmUgZXhwZWN0aW5nIHVzZXIgCisqKgl3aWxsIHBsYXkgd2l0aCBDSEFOR0UgREVGSU5JVElPTiBjb21tYW5kcy4gOi0pCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBzdHJ1Y3QgbGNiICpuY3Jfc2V0dXBfbGNiIChzdHJ1Y3QgbmNiICpucCwgc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXVuc2lnbmVkIGNoYXIgdG4gPSBzZGV2LT5pZCwgbG4gPSBzZGV2LT5sdW47CisJc3RydWN0IHRjYiAqdHAgPSAmbnAtPnRhcmdldFt0bl07CisJc3RydWN0IGxjYiAqbHAgPSB0cC0+bHBbbG5dOworCisJLyogSWYgbm8gbGNiLCB0cnkgdG8gYWxsb2NhdGUgaXQuICAqLworCWlmICghbHAgJiYgIShscCA9IG5jcl9hbGxvY19sY2IobnAsIHRuLCBsbikpKQorCQlnb3RvIGZhaWw7CisKKwkvKgorCSoqCUlmIHVuaXQgc3VwcG9ydHMgdGFnZ2VkIGNvbW1hbmRzLCBhbGxvY2F0ZSB0aGUgCisJKioJQ0NCIEpVTVAgdGFibGUgaWYgbm90IHlldC4KKwkqLworCWlmIChzZGV2LT50YWdnZWRfc3VwcG9ydGVkICYmIGxwLT5qdW1wX2NjYiA9PSAmbHAtPmp1bXBfY2NiXzApIHsKKwkJaW50IGk7CisJCWxwLT5qdW1wX2NjYiA9IG1fY2FsbG9jX2RtYSgyNTYsICJKVU1QX0NDQiIpOworCQlpZiAoIWxwLT5qdW1wX2NjYikgeworCQkJbHAtPmp1bXBfY2NiID0gJmxwLT5qdW1wX2NjYl8wOworCQkJZ290byBmYWlsOworCQl9CisJCWxwLT5wX2p1bXBfY2NiID0gY3B1X3RvX3Njcih2dG9idXMobHAtPmp1bXBfY2NiKSk7CisJCWZvciAoaSA9IDAgOyBpIDwgNjQgOyBpKyspCisJCQlscC0+anVtcF9jY2JbaV0gPQorCQkJCWNwdV90b19zY3IoTkNCX1NDUklQVEhfUEhZUyAobnAsIGJhZF9pX3RfbF9xKSk7CisJCWZvciAoaSA9IDAgOyBpIDwgTUFYX1RBR1MgOyBpKyspCisJCQlscC0+Y2JfdGFnc1tpXSA9IGk7CisJCWxwLT5tYXhueHMgPSBNQVhfVEFHUzsKKwkJbHAtPnRhZ3Nfc3RpbWUgPSBrdGltZV9nZXQoMypIWik7CisJCW5jcl9zZXR1cF90YWdzIChucCwgc2Rldik7CisJfQorCisKK2ZhaWw6CisJcmV0dXJuIGxwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgorKioJQnVpbGQgU2NhdHRlciBHYXRoZXIgQmxvY2sKKyoqCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJVGhlIHRyYW5zZmVyIGFyZWEgbWF5IGJlIHNjYXR0ZXJlZCBhbW9uZworKioJc2V2ZXJhbCBub24gYWRqYWNlbnQgcGh5c2ljYWwgcGFnZXMuCisqKgorKioJV2UgbWF5IHVzZSBNQVhfU0NBVFRFUiBibG9ja3MuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvKgorKioJV2UgdHJ5IHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGludGVycnVwdHMgY2F1c2VkCisqKglieSB1bmV4cGVjdGVkIHBoYXNlIGNoYW5nZXMgZHVlIHRvIGRpc2Nvbm5lY3RzLgorKioJQSB0eXBpY2FsIGhhcmRkaXNrIG1heSBkaXNjb25uZWN0IGJlZm9yZSBBTlkgYmxvY2suCisqKglJZiB3ZSB3YW50ZWQgdG8gYXZvaWQgdW5leHBlY3RlZCBwaGFzZSBjaGFuZ2VzIGF0IGFsbAorKioJd2UgaGFkIHRvIHVzZSBhIGJyZWFrIHBvaW50IGV2ZXJ5IDUxMiBieXRlcy4KKyoqCU9mIGNvdXJzZSB0aGUgbnVtYmVyIG9mIHNjYXR0ZXIvZ2F0aGVyIGJsb2NrcyBpcworKioJbGltaXRlZC4KKyoqCVVuZGVyIExpbnV4LCB0aGUgc2NhdHRlci9nYXR0ZXIgYmxvY2tzIGFyZSBwcm92aWRlZCBieSAKKyoqCXRoZSBnZW5lcmljIGRyaXZlci4gV2UganVzdCBoYXZlIHRvIGNvcHkgYWRkcmVzc2VzIGFuZCAKKyoqCXNpemVzIHRvIHRoZSBkYXRhIHNlZ21lbnQgYXJyYXkuCisqLworCitzdGF0aWMgaW50IG5jcl9zY2F0dGVyX25vX3NnbGlzdChzdHJ1Y3QgbmNiICpucCwgc3RydWN0IGNjYiAqY3AsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3Qgc2NyX3RibG1vdmUgKmRhdGEgPSAmY3AtPnBoeXMuZGF0YVtNQVhfU0NBVFRFUiAtIDFdOworCWludCBzZWdtZW50OworCisJY3AtPmRhdGFfbGVuID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisKKwlpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKKwkJZG1hX2FkZHJfdCBiYWRkciA9IG1hcF9zY3NpX3NpbmdsZV9kYXRhKG5wLCBjbWQpOworCQlpZiAoYmFkZHIpIHsKKwkJCW5jcl9idWlsZF9zZ2UobnAsIGRhdGEsIGJhZGRyLCBjbWQtPnJlcXVlc3RfYnVmZmxlbik7CisJCQlzZWdtZW50ID0gMTsKKwkJfSBlbHNlIHsKKwkJCXNlZ21lbnQgPSAtMjsKKwkJfQorCX0gZWxzZSB7CisJCXNlZ21lbnQgPSAwOworCX0KKworCXJldHVybiBzZWdtZW50OworfQorCitzdGF0aWMgaW50IG5jcl9zY2F0dGVyKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3QgY2NiICpjcCwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCWludCBzZWdtZW50CT0gMDsKKwlpbnQgdXNlX3NnCT0gKGludCkgY21kLT51c2Vfc2c7CisKKwljcC0+ZGF0YV9sZW4JPSAwOworCisJaWYgKCF1c2Vfc2cpCisJCXNlZ21lbnQgPSBuY3Jfc2NhdHRlcl9ub19zZ2xpc3QobnAsIGNwLCBjbWQpOworCWVsc2UgaWYgKCh1c2Vfc2cgPSBtYXBfc2NzaV9zZ19kYXRhKG5wLCBjbWQpKSA+IDApIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzY2F0dGVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKWNtZC0+YnVmZmVyOworCQlzdHJ1Y3Qgc2NyX3RibG1vdmUgKmRhdGE7CisKKwkJaWYgKHVzZV9zZyA+IE1BWF9TQ0FUVEVSKSB7CisJCQl1bm1hcF9zY3NpX2RhdGEobnAsIGNtZCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlkYXRhID0gJmNwLT5waHlzLmRhdGFbTUFYX1NDQVRURVIgLSB1c2Vfc2ddOworCisJCWZvciAoc2VnbWVudCA9IDA7IHNlZ21lbnQgPCB1c2Vfc2c7IHNlZ21lbnQrKykgeworCQkJZG1hX2FkZHJfdCBiYWRkciA9IHNnX2RtYV9hZGRyZXNzKCZzY2F0dGVyW3NlZ21lbnRdKTsKKwkJCXVuc2lnbmVkIGludCBsZW4gPSBzZ19kbWFfbGVuKCZzY2F0dGVyW3NlZ21lbnRdKTsKKworCQkJbmNyX2J1aWxkX3NnZShucCwgJmRhdGFbc2VnbWVudF0sIGJhZGRyLCBsZW4pOworCQkJY3AtPmRhdGFfbGVuICs9IGxlbjsKKwkJfQorCX0gZWxzZSB7CisJCXNlZ21lbnQgPSAtMjsKKwl9CisKKwlyZXR1cm4gc2VnbWVudDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioKKyoqCVRlc3QgdGhlIGJ1cyBzbm9vcCBsb2dpYyA6LSgKKyoqCisqKglIYXMgdG8gYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyoqCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitzdGF0aWMgaW50IF9faW5pdCBuY3JfcmVndGVzdCAoc3RydWN0IG5jYiogbnApCit7CisJcmVnaXN0ZXIgdm9sYXRpbGUgdTMyIGRhdGE7CisJLyoKKwkqKgluY3IgcmVnaXN0ZXJzIG1heSBOT1QgYmUgY2FjaGVkLgorCSoqCXdyaXRlIDB4ZmZmZmZmZmYgdG8gYSByZWFkIG9ubHkgcmVnaXN0ZXIgYXJlYSwKKwkqKglhbmQgdHJ5IHRvIHJlYWQgaXQgYmFjay4KKwkqLworCWRhdGEgPSAweGZmZmZmZmZmOworCU9VVExfT0ZGKG9mZnNldG9mKHN0cnVjdCBuY3JfcmVnLCBuY19kc3RhdCksIGRhdGEpOworCWRhdGEgPSBJTkxfT0ZGKG9mZnNldG9mKHN0cnVjdCBuY3JfcmVnLCBuY19kc3RhdCkpOworI2lmIDEKKwlpZiAoZGF0YSA9PSAweGZmZmZmZmZmKSB7CisjZWxzZQorCWlmICgoZGF0YSAmIDB4ZTJmMGZmZmQpICE9IDB4MDIwMDAwODApIHsKKyNlbmRpZgorCQlwcmludGsgKCJDQUNIRSBURVNUIEZBSUxFRDogcmVnIGRzdGF0LXNzdGF0MiByZWFkYmFjayAleC5cbiIsCisJCQkodW5zaWduZWQpIGRhdGEpOworCQlyZXR1cm4gKDB4MTApOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IF9faW5pdCBuY3Jfc25vb3B0ZXN0IChzdHJ1Y3QgbmNiKiBucCkKK3sKKwl1MzIJbmNyX3JkLCBuY3Jfd3IsIG5jcl9iaywgaG9zdF9yZCwgaG9zdF93ciwgcGM7CisJaW50CWksIGVycj0wOworCWlmIChucC0+cmVnKSB7CisJCWVyciB8PSBuY3JfcmVndGVzdCAobnApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIChlcnIpOworCX0KKworCS8qIGluaXQgKi8KKwlwYyAgPSBOQ0JfU0NSSVBUSF9QSFlTIChucCwgc25vb3B0ZXN0KTsKKwlob3N0X3dyID0gMTsKKwluY3Jfd3IgID0gMjsKKwkvKgorCSoqCVNldCBtZW1vcnkgYW5kIHJlZ2lzdGVyLgorCSovCisJbnAtPm5jcl9jYWNoZSA9IGNwdV90b19zY3IoaG9zdF93cik7CisJT1VUTCAobmNfdGVtcCwgbmNyX3dyKTsKKwkvKgorCSoqCVN0YXJ0IHNjcmlwdCAoZXhjaGFuZ2UgdmFsdWVzKQorCSovCisJT1VUTF9EU1AgKHBjKTsKKwkvKgorCSoqCVdhaXQgJ3RpbCBkb25lICh3aXRoIHRpbWVvdXQpCisJKi8KKwlmb3IgKGk9MDsgaTxOQ1JfU05PT1BfVElNRU9VVDsgaSsrKQorCQlpZiAoSU5CKG5jX2lzdGF0KSAmIChJTlRGfFNJUHxESVApKQorCQkJYnJlYWs7CisJLyoKKwkqKglTYXZlIHRlcm1pbmF0aW9uIHBvc2l0aW9uLgorCSovCisJcGMgPSBJTkwgKG5jX2RzcCk7CisJLyoKKwkqKglSZWFkIG1lbW9yeSBhbmQgcmVnaXN0ZXIuCisJKi8KKwlob3N0X3JkID0gc2NyX3RvX2NwdShucC0+bmNyX2NhY2hlKTsKKwluY3JfcmQgID0gSU5MIChuY19zY3JhdGNoYSk7CisJbmNyX2JrICA9IElOTCAobmNfdGVtcCk7CisJLyoKKwkqKglSZXNldCBuY3IgY2hpcAorCSovCisJbmNyX2NoaXBfcmVzZXQobnAsIDEwMCk7CisJLyoKKwkqKgljaGVjayBmb3IgdGltZW91dAorCSovCisJaWYgKGk+PU5DUl9TTk9PUF9USU1FT1VUKSB7CisJCXByaW50ayAoIkNBQ0hFIFRFU1QgRkFJTEVEOiB0aW1lb3V0LlxuIik7CisJCXJldHVybiAoMHgyMCk7CisJfQorCS8qCisJKioJQ2hlY2sgdGVybWluYXRpb24gcG9zaXRpb24uCisJKi8KKwlpZiAocGMgIT0gTkNCX1NDUklQVEhfUEhZUyAobnAsIHNub29wZW5kKSs4KSB7CisJCXByaW50ayAoIkNBQ0hFIFRFU1QgRkFJTEVEOiBzY3JpcHQgZXhlY3V0aW9uIGZhaWxlZC5cbiIpOworCQlwcmludGsgKCJzdGFydD0lMDhseCwgcGM9JTA4bHgsIGVuZD0lMDhseFxuIiwgCisJCQkodV9sb25nKSBOQ0JfU0NSSVBUSF9QSFlTIChucCwgc25vb3B0ZXN0KSwgKHVfbG9uZykgcGMsCisJCQkodV9sb25nKSBOQ0JfU0NSSVBUSF9QSFlTIChucCwgc25vb3BlbmQpICs4KTsKKwkJcmV0dXJuICgweDQwKTsKKwl9CisJLyoKKwkqKglTaG93IHJlc3VsdHMuCisJKi8KKwlpZiAoaG9zdF93ciAhPSBuY3JfcmQpIHsKKwkJcHJpbnRrICgiQ0FDSEUgVEVTVCBGQUlMRUQ6IGhvc3Qgd3JvdGUgJWQsIG5jciByZWFkICVkLlxuIiwKKwkJCShpbnQpIGhvc3Rfd3IsIChpbnQpIG5jcl9yZCk7CisJCWVyciB8PSAxOworCX0KKwlpZiAoaG9zdF9yZCAhPSBuY3Jfd3IpIHsKKwkJcHJpbnRrICgiQ0FDSEUgVEVTVCBGQUlMRUQ6IG5jciB3cm90ZSAlZCwgaG9zdCByZWFkICVkLlxuIiwKKwkJCShpbnQpIG5jcl93ciwgKGludCkgaG9zdF9yZCk7CisJCWVyciB8PSAyOworCX0KKwlpZiAobmNyX2JrICE9IG5jcl93cikgeworCQlwcmludGsgKCJDQUNIRSBURVNUIEZBSUxFRDogbmNyIHdyb3RlICVkLCByZWFkIGJhY2sgJWQuXG4iLAorCQkJKGludCkgbmNyX3dyLCAoaW50KSBuY3JfYmspOworCQllcnIgfD0gNDsKKwl9CisJcmV0dXJuIChlcnIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglEZXRlcm1pbmUgdGhlIG5jcidzIGNsb2NrIGZyZXF1ZW5jeS4KKyoqCVRoaXMgaXMgZXNzZW50aWFsIGZvciB0aGUgbmVnb3RpYXRpb24KKyoqCW9mIHRoZSBzeW5jaHJvbm91cyB0cmFuc2ZlciByYXRlLgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCU5vdGU6IHdlIGhhdmUgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlLgorKioJVEhFUkUgSVMgTk8gU0FWRSBERUZBVUxUIFZBTFVFLgorKioKKyoqCU1vc3QgTkNSL1NZTUJJT1MgYm9hcmRzIGFyZSBkZWxpdmVyZWQgd2l0aCBhIDQwIE1oeiBjbG9jay4KKyoqCTUzQzg2MCBhbmQgNTNDODc1IHJldi4gMSBzdXBwb3J0IGZhc3QyMCB0cmFuc2ZlcnMgYnV0IAorKioJZG8gbm90IGhhdmUgYSBjbG9jayBkb3VibGVyIGFuZCBzbyBhcmUgcHJvdmlkZWQgd2l0aCBhIAorKioJODAgTUh6IGNsb2NrLiBBbGwgb3RoZXIgZmFzdDIwIGJvYXJkcyBpbmNvcnBvcmF0ZSBhIGRvdWJsZXIgCisqKglhbmQgc28gc2hvdWxkIGJlIGRlbGl2ZXJlZCB3aXRoIGEgNDAgTUh6IGNsb2NrLgorKioJVGhlIGZ1dHVyZSBmYXN0NDAgY2hpcHMgKDg5NS84OTUpIHVzZSBhIDQwIE1oeiBiYXNlIGNsb2NrIAorKioJYW5kIHByb3ZpZGUgYSBjbG9jayBxdWFkcnVwbGVyICgxNjAgTWh6KS4gVGhlIGNvZGUgYmVsb3cgCisqKgl0cmllcyB0byBkZWFsIGFzIGNsZXZlcmx5IGFzIHBvc3NpYmxlIHdpdGggYWxsIHRoaXMgc3R1ZmYuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvKgorICoJU2VsZWN0IE5DUiBTQ1NJIGNsb2NrIGZyZXF1ZW5jeQorICovCitzdGF0aWMgdm9pZCBuY3Jfc2VsZWN0Y2xvY2soc3RydWN0IG5jYiAqbnAsIHVfY2hhciBzY250bDMpCit7CisJaWYgKG5wLT5tdWx0aXBsaWVyIDwgMikgeworCQlPVVRCKG5jX3NjbnRsMywJc2NudGwzKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChib290dmVyYm9zZSA+PSAyKQorCQlwcmludGsgKCIlczogZW5hYmxpbmcgY2xvY2sgbXVsdGlwbGllclxuIiwgbmNyX25hbWUobnApKTsKKworCU9VVEIobmNfc3Rlc3QxLCBEQkxFTik7CSAgIC8qIEVuYWJsZSBjbG9jayBtdWx0aXBsaWVyCQkgICovCisJaWYgKG5wLT5tdWx0aXBsaWVyID4gMikgeyAgLyogUG9sbCBiaXQgNSBvZiBzdGVzdDQgZm9yIHF1YWRydXBsZXIgKi8KKwkJaW50IGkgPSAyMDsKKwkJd2hpbGUgKCEoSU5CKG5jX3N0ZXN0NCkgJiBMQ0tGUlEpICYmIC0taSA+IDApCisJCQl1ZGVsYXkoMjApOworCQlpZiAoIWkpCisJCQlwcmludGsoIiVzOiB0aGUgY2hpcCBjYW5ub3QgbG9jayB0aGUgZnJlcXVlbmN5XG4iLCBuY3JfbmFtZShucCkpOworCX0gZWxzZQkJCS8qIFdhaXQgMjAgbWljcm8tc2Vjb25kcyBmb3IgZG91YmxlcgkqLworCQl1ZGVsYXkoMjApOworCU9VVEIobmNfc3Rlc3QzLCBIU0MpOwkJLyogSGFsdCB0aGUgc2NzaSBjbG9jawkJKi8KKwlPVVRCKG5jX3NjbnRsMywJc2NudGwzKTsKKwlPVVRCKG5jX3N0ZXN0MSwgKERCTEVOfERCTFNFTCkpOy8qIFNlbGVjdCBjbG9jayBtdWx0aXBsaWVyCSovCisJT1VUQihuY19zdGVzdDMsIDB4MDApOwkJLyogUmVzdGFydCBzY3NpIGNsb2NrIAkJKi8KK30KKworCisvKgorICoJY2FsY3VsYXRlIE5DUiBTQ1NJIGNsb2NrIGZyZXF1ZW5jeSAoaW4gS0h6KQorICovCitzdGF0aWMgdW5zaWduZWQgX19pbml0IG5jcmdldGZyZXEgKHN0cnVjdCBuY2IgKm5wLCBpbnQgZ2VuKQoreworCXVuc2lnbmVkIG1zID0gMDsKKwljaGFyIGNvdW50ID0gMDsKKworCS8qCisJICogTWVhc3VyZSBHRU4gdGltZXIgZGVsYXkgaW4gb3JkZXIgCisJICogdG8gY2FsY3VsYXRlIFNDU0kgY2xvY2sgZnJlcXVlbmN5CisJICoKKwkgKiBUaGlzIGNvZGUgd2lsbCBuZXZlciBleGVjdXRlIHRvbworCSAqIG1hbnkgbG9vcCBpdGVyYXRpb25zIChpZiBERUxBWSBpcyAKKwkgKiByZWFzb25hYmx5IGNvcnJlY3QpLiBJdCBjb3VsZCBnZXQKKwkgKiB0b28gbG93IGEgZGVsYXkgKHRvbyBoaWdoIGEgZnJlcS4pCisJICogaWYgdGhlIENQVSBpcyBzbG93IGV4ZWN1dGluZyB0aGUgCisJICogbG9vcCBmb3Igc29tZSByZWFzb24gKGFuIE5NSSwgZm9yCisJICogZXhhbXBsZSkuIEZvciB0aGlzIHJlYXNvbiB3ZSB3aWxsCisJICogaWYgbXVsdGlwbGUgbWVhc3VyZW1lbnRzIGFyZSB0byBiZSAKKwkgKiBwZXJmb3JtZWQgdHJ1c3QgdGhlIGhpZ2hlciBkZWxheSAKKwkgKiAobG93ZXIgZnJlcXVlbmN5IHJldHVybmVkKS4KKwkgKi8KKwlPVVRCIChuY19zdGVzdDEsIDApOwkvKiBtYWtlIHN1cmUgY2xvY2sgZG91YmxlciBpcyBPRkYgKi8KKwlPVVRXIChuY19zaWVuICwgMCk7CS8qIG1hc2sgYWxsIHNjc2kgaW50ZXJydXB0cyAqLworCSh2b2lkKSBJTlcgKG5jX3Npc3QpOwkvKiBjbGVhciBwZW5kaW5nIHNjc2kgaW50ZXJydXB0ICovCisJT1VUQiAobmNfZGllbiAsIDApOwkvKiBtYXNrIGFsbCBkbWEgaW50ZXJydXB0cyAqLworCSh2b2lkKSBJTlcgKG5jX3Npc3QpOwkvKiBhbm90aGVyIG9uZSwganVzdCB0byBiZSBzdXJlIDopICovCisJT1VUQiAobmNfc2NudGwzLCA0KTsJLyogc2V0IHByZS1zY2FsZXIgdG8gZGl2aWRlIGJ5IDMgKi8KKwlPVVRCIChuY19zdGltZTEsIDApOwkvKiBkaXNhYmxlIGdlbmVyYWwgcHVycG9zZSB0aW1lciAqLworCU9VVEIgKG5jX3N0aW1lMSwgZ2VuKTsJLyogc2V0IHRvIG5vbWluYWwgZGVsYXkgb2YgMTw8Z2VuICogMTI1dXMgKi8KKwl3aGlsZSAoIShJTlcobmNfc2lzdCkgJiBHRU4pICYmIG1zKysgPCAxMDAwMDApIHsKKwkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTA7IGNvdW50ICsrKQorCQkJdWRlbGF5KDEwMCk7CS8qIGNvdW50IG1zICovCisJfQorCU9VVEIgKG5jX3N0aW1lMSwgMCk7CS8qIGRpc2FibGUgZ2VuZXJhbCBwdXJwb3NlIHRpbWVyICovCisgCS8qCisgCSAqIHNldCBwcmVzY2FsZXIgdG8gZGl2aWRlIGJ5IHdoYXRldmVyIDAgbWVhbnMKKyAJICogMCBvdWdodCB0byBjaG9vc2UgZGl2aWRlIGJ5IDIsIGJ1dCBhcHBlYXJzCisgCSAqIHRvIHNldCBkaXZpZGUgYnkgMy41IG1vZGUgaW4gbXkgNTNjODEwIC4uLgorIAkgKi8KKyAJT1VUQiAobmNfc2NudGwzLCAwKTsKKworCWlmIChib290dmVyYm9zZSA+PSAyKQorCQlwcmludGsgKCIlczogRGVsYXkgKEdFTj0lZCk6ICV1IG1zZWNcbiIsIG5jcl9uYW1lKG5wKSwgZ2VuLCBtcyk7CisgIAkvKgorIAkgKiBhZGp1c3QgZm9yIHByZXNjYWxlciwgYW5kIGNvbnZlcnQgaW50byBLSHogCisgIAkgKi8KKwlyZXR1cm4gbXMgPyAoKDEgPDwgZ2VuKSAqIDQzNDApIC8gbXMgOiAwOworfQorCisvKgorICoJR2V0L3Byb2JlIE5DUiBTQ1NJIGNsb2NrIGZyZXF1ZW5jeQorICovCitzdGF0aWMgdm9pZCBfX2luaXQgbmNyX2dldGNsb2NrIChzdHJ1Y3QgbmNiICpucCwgaW50IG11bHQpCit7CisJdW5zaWduZWQgY2hhciBzY250bDMgPSBJTkIobmNfc2NudGwzKTsKKwl1bnNpZ25lZCBjaGFyIHN0ZXN0MSA9IElOQihuY19zdGVzdDEpOworCXVuc2lnbmVkIGYxOworCisJbnAtPm11bHRpcGxpZXIgPSAxOworCWYxID0gNDAwMDA7CisKKwkvKgorCSoqCVRydWUgd2l0aCA4NzUgb3IgODk1IHdpdGggY2xvY2sgbXVsdGlwbGllciBzZWxlY3RlZAorCSovCisJaWYgKG11bHQgPiAxICYmIChzdGVzdDEgJiAoREJMRU4rREJMU0VMKSkgPT0gREJMRU4rREJMU0VMKSB7CisJCWlmIChib290dmVyYm9zZSA+PSAyKQorCQkJcHJpbnRrICgiJXM6IGNsb2NrIG11bHRpcGxpZXIgZm91bmRcbiIsIG5jcl9uYW1lKG5wKSk7CisJCW5wLT5tdWx0aXBsaWVyID0gbXVsdDsKKwl9CisKKwkvKgorCSoqCUlmIG11bHRpcGxpZXIgbm90IGZvdW5kIG9yIHNjbnRsMyBub3QgNyw1LDMsCisJKioJcmVzZXQgY2hpcCBhbmQgZ2V0IGZyZXF1ZW5jeSBmcm9tIGdlbmVyYWwgcHVycG9zZSB0aW1lci4KKwkqKglPdGhlcndpc2UgdHJ1c3Qgc2NudGwzIEJJT1Mgc2V0dGluZy4KKwkqLworCWlmIChucC0+bXVsdGlwbGllciAhPSBtdWx0IHx8IChzY250bDMgJiA3KSA8IDMgfHwgIShzY250bDMgJiAxKSkgeworCQl1bnNpZ25lZCBmMjsKKworCQluY3JfY2hpcF9yZXNldChucCwgNSk7CisKKwkJKHZvaWQpIG5jcmdldGZyZXEgKG5wLCAxMSk7CS8qIHRocm93IGF3YXkgZmlyc3QgcmVzdWx0ICovCisJCWYxID0gbmNyZ2V0ZnJlcSAobnAsIDExKTsKKwkJZjIgPSBuY3JnZXRmcmVxIChucCwgMTEpOworCisJCWlmKGJvb3R2ZXJib3NlKQorCQkJcHJpbnRrICgiJXM6IE5DUiBjbG9jayBpcyAldUtIeiwgJXVLSHpcbiIsIG5jcl9uYW1lKG5wKSwgZjEsIGYyKTsKKworCQlpZiAoZjEgPiBmMikgZjEgPSBmMjsJCS8qIHRydXN0IGxvd2VyIHJlc3VsdAkqLworCisJCWlmCShmMSA8CTQ1MDAwKQkJZjEgPSAgNDAwMDA7CisJCWVsc2UgaWYgKGYxIDwJNTUwMDApCQlmMSA9ICA1MDAwMDsKKwkJZWxzZQkJCQlmMSA9ICA4MDAwMDsKKworCQlpZiAoZjEgPCA4MDAwMCAmJiBtdWx0ID4gMSkgeworCQkJaWYgKGJvb3R2ZXJib3NlID49IDIpCisJCQkJcHJpbnRrICgiJXM6IGNsb2NrIG11bHRpcGxpZXIgYXNzdW1lZFxuIiwgbmNyX25hbWUobnApKTsKKwkJCW5wLT5tdWx0aXBsaWVyCT0gbXVsdDsKKwkJfQorCX0gZWxzZSB7CisJCWlmCSgoc2NudGwzICYgNykgPT0gMykJZjEgPSAgNDAwMDA7CisJCWVsc2UgaWYJKChzY250bDMgJiA3KSA9PSA1KQlmMSA9ICA4MDAwMDsKKwkJZWxzZSAJCQkJZjEgPSAxNjAwMDA7CisKKwkJZjEgLz0gbnAtPm11bHRpcGxpZXI7CisJfQorCisJLyoKKwkqKglDb21wdXRlIGNvbnRyb2xsZXIgc3luY2hyb25vdXMgcGFyYW1ldGVycy4KKwkqLworCWYxCQkqPSBucC0+bXVsdGlwbGllcjsKKwlucC0+Y2xvY2tfa2h6CT0gZjE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09IExJTlVYIEVOVFJZIFBPSU5UUyBTRUNUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBuY3I1M2M4eHhfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGRldmljZS0+aG9zdDsKKwlzdHJ1Y3QgbmNiICpucCA9ICgoc3RydWN0IGhvc3RfZGF0YSAqKSBob3N0LT5ob3N0ZGF0YSktPm5jYjsKKwlzdHJ1Y3QgdGNiICp0cCA9ICZucC0+dGFyZ2V0W2RldmljZS0+aWRdOworCXRwLT5zdGFyZ2V0ID0gZGV2aWNlLT5zZGV2X3RhcmdldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5jcjUzYzh4eF9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGRldmljZS0+aG9zdDsKKwlzdHJ1Y3QgbmNiICpucCA9ICgoc3RydWN0IGhvc3RfZGF0YSAqKSBob3N0LT5ob3N0ZGF0YSktPm5jYjsKKwlzdHJ1Y3QgdGNiICp0cCA9ICZucC0+dGFyZ2V0W2RldmljZS0+aWRdOworCXN0cnVjdCBsY2IgKmxwID0gdHAtPmxwW2RldmljZS0+bHVuXTsKKwlpbnQgbnVtdGFncywgZGVwdGhfdG9fdXNlOworCisJbmNyX3NldHVwX2xjYihucCwgZGV2aWNlKTsKKworCS8qCisJKioJU2VsZWN0IHF1ZXVlIGRlcHRoIGZyb20gZHJpdmVyIHNldHVwLgorCSoqCURvbm5vdCB1c2UgbW9yZSB0aGFuIGNvbmZpZ3VyZWQgYnkgdXNlci4KKwkqKglVc2UgYXQgbGVhc3QgMi4KKwkqKglEb25ub3QgdXNlIG1vcmUgdGhhbiBvdXIgbWF4aW11bS4KKwkqLworCW51bXRhZ3MgPSBkZXZpY2VfcXVldWVfZGVwdGgobnAtPnVuaXQsIGRldmljZS0+aWQsIGRldmljZS0+bHVuKTsKKwlpZiAobnVtdGFncyA+IHRwLT51c3J0YWdzKQorCQludW10YWdzID0gdHAtPnVzcnRhZ3M7CisJaWYgKCFkZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQpCisJCW51bXRhZ3MgPSAxOworCWRlcHRoX3RvX3VzZSA9IG51bXRhZ3M7CisJaWYgKGRlcHRoX3RvX3VzZSA8IDIpCisJCWRlcHRoX3RvX3VzZSA9IDI7CisJaWYgKGRlcHRoX3RvX3VzZSA+IE1BWF9UQUdTKQorCQlkZXB0aF90b191c2UgPSBNQVhfVEFHUzsKKworCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldmljZSwKKwkJCQkoZGV2aWNlLT50YWdnZWRfc3VwcG9ydGVkID8KKwkJCQkgTVNHX1NJTVBMRV9UQUcgOiAwKSwKKwkJCQlkZXB0aF90b191c2UpOworCisJLyoKKwkqKglTaW5jZSB0aGUgcXVldWUgZGVwdGggaXMgbm90IHR1bmFibGUgdW5kZXIgTGludXgsCisJKioJd2UgbmVlZCB0byBrbm93IHRoaXMgdmFsdWUgaW4gb3JkZXIgbm90IHRvIAorCSoqCWFubm91bmNlIHN0dXBpZCB0aGluZ3MgdG8gdXNlci4KKwkqKgorCSoqCVhYWChoY2gpOiBBcyBvZiBMaW51eCAyLjYgaXQgY2VydGFpbmx5IF9pc18gdHVuYWJsZS4uCisJKioJCSAgSW4gZmFjdCB3ZSBqdXN0IHR1bmVkIGl0LCBvciBkaWQgSSBtaXNzCisJKioJCSAgc29tZXRoaW5nIGltcG9ydGFudD8gOikKKwkqLworCWlmIChscCkgeworCQlscC0+bnVtdGFncyA9IGxwLT5tYXh0YWdzID0gbnVtdGFnczsKKwkJbHAtPnNjZGV2X2RlcHRoID0gZGVwdGhfdG9fdXNlOworCX0KKwluY3Jfc2V0dXBfdGFncyAobnAsIGRldmljZSk7CisKKyNpZmRlZiBERUJVR19OQ1I1M0M4WFgKKwlwcmludGsoIm5jcjUzYzh4eF9zZWxlY3RfcXVldWVfZGVwdGg6IGhvc3Q9JWQsIGlkPSVkLCBsdW49JWQsIGRlcHRoPSVkXG4iLAorCSAgICAgICBucC0+dW5pdCwgZGV2aWNlLT5pZCwgZGV2aWNlLT5sdW4sIGRlcHRoX3RvX3VzZSk7CisjZW5kaWYKKworCWlmIChzcGlfc3VwcG9ydF9zeW5jKGRldmljZS0+c2Rldl90YXJnZXQpICYmCisJICAgICFzcGlfaW5pdGlhbF9kdihkZXZpY2UtPnNkZXZfdGFyZ2V0KSkKKwkJc3BpX2R2X2RldmljZShkZXZpY2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5jcjUzYzh4eF9xdWV1ZV9jb21tYW5kIChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHZvaWQgKCogZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKyAgICAgc3RydWN0IG5jYiAqbnAgPSAoKHN0cnVjdCBob3N0X2RhdGEgKikgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhKS0+bmNiOworICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICBpbnQgc3RzOworCisjaWZkZWYgREVCVUdfTkNSNTNDOFhYCitwcmludGsoIm5jcjUzYzh4eF9xdWV1ZV9jb21tYW5kXG4iKTsKKyNlbmRpZgorCisgICAgIGNtZC0+c2NzaV9kb25lICAgICA9IGRvbmU7CisgICAgIGNtZC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisgICAgIGNtZC0+X19kYXRhX21hcHBlZCA9IDA7CisgICAgIGNtZC0+X19kYXRhX21hcHBpbmcgPSAwOworCisgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZucC0+c21wX2xvY2ssIGZsYWdzKTsKKworICAgICBpZiAoKHN0cyA9IG5jcl9xdWV1ZV9jb21tYW5kKG5wLCBjbWQpKSAhPSBESURfT0spIHsKKwkgIGNtZC0+cmVzdWx0ID0gU2NzaVJlc3VsdChzdHMsIDApOworI2lmZGVmIERFQlVHX05DUjUzQzhYWAorcHJpbnRrKCJuY3I1M2M4eHggOiBjb21tYW5kIG5vdCBxdWV1ZWQgLSByZXN1bHQ9JWRcbiIsIHN0cyk7CisjZW5kaWYKKyAgICAgfQorI2lmZGVmIERFQlVHX05DUjUzQzhYWAorICAgICBlbHNlCitwcmludGsoIm5jcjUzYzh4eCA6IGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IHF1ZXVlZFxuIik7CisjZW5kaWYKKworICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+c21wX2xvY2ssIGZsYWdzKTsKKworICAgICBpZiAoc3RzICE9IERJRF9PSykgeworICAgICAgICAgIHVubWFwX3Njc2lfZGF0YShucCwgY21kKTsKKyAgICAgICAgICBkb25lKGNtZCk7CisJICBzdHMgPSAwOworICAgICB9CisKKyAgICAgcmV0dXJuIHN0czsKK30KKworaXJxcmV0dXJuX3QgbmNyNTNjOHh4X2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgIHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gKHN0cnVjdCBTY3NpX0hvc3QgKilkZXZfaWQ7CisgICAgIHN0cnVjdCBob3N0X2RhdGEgKmhvc3RfZGF0YSA9IChzdHJ1Y3QgaG9zdF9kYXRhICopc2hvc3QtPmhvc3RkYXRhOworICAgICBzdHJ1Y3QgbmNiICpucCA9IGhvc3RfZGF0YS0+bmNiOworICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpkb25lX2xpc3Q7CisKKyNpZmRlZiBERUJVR19OQ1I1M0M4WFgKKyAgICAgcHJpbnRrKCJuY3I1M2M4eHggOiBpbnRlcnJ1cHQgcmVjZWl2ZWRcbiIpOworI2VuZGlmCisKKyAgICAgaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfVElOWSkgcHJpbnRrICgiWyIpOworCisgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZucC0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgbmNyX2V4Y2VwdGlvbihucCk7CisgICAgIGRvbmVfbGlzdCAgICAgPSBucC0+ZG9uZV9saXN0OworICAgICBucC0+ZG9uZV9saXN0ID0gTlVMTDsKKyAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPnNtcF9sb2NrLCBmbGFncyk7CisKKyAgICAgaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfVElOWSkgcHJpbnRrICgiXVxuIik7CisKKyAgICAgaWYgKGRvbmVfbGlzdCkKKwkgICAgIG5jcl9mbHVzaF9kb25lX2NtZHMoZG9uZV9saXN0KTsKKyAgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBuY3I1M2M4eHhfdGltZW91dCh1bnNpZ25lZCBsb25nIG5wcmVmKQoreworCXN0cnVjdCBuY2IgKm5wID0gKHN0cnVjdCBuY2IgKikgbnByZWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpkb25lX2xpc3Q7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPnNtcF9sb2NrLCBmbGFncyk7CisJbmNyX3RpbWVvdXQobnApOworCWRvbmVfbGlzdCAgICAgPSBucC0+ZG9uZV9saXN0OworCW5wLT5kb25lX2xpc3QgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5wLT5zbXBfbG9jaywgZmxhZ3MpOworCisJaWYgKGRvbmVfbGlzdCkKKwkJbmNyX2ZsdXNoX2RvbmVfY21kcyhkb25lX2xpc3QpOworfQorCitzdGF0aWMgaW50IG5jcjUzYzh4eF9idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBuY2IgKm5wID0gKChzdHJ1Y3QgaG9zdF9kYXRhICopIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSktPm5jYjsKKwlpbnQgc3RzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNjc2lfY21uZCAqZG9uZV9saXN0OworCisJLyoKKwkgKiBJZiB0aGUgbWlkLWxldmVsIGRyaXZlciB0b2xkIHVzIHJlc2V0IGlzIHN5bmNocm9ub3VzLCBpdCBzZWVtcyAKKwkgKiB0aGF0IHdlIG11c3QgY2FsbCB0aGUgZG9uZSgpIGNhbGxiYWNrIGZvciB0aGUgaW52b2x2ZWQgY29tbWFuZCwgCisJICogZXZlbiBpZiB0aGlzIGNvbW1hbmQgd2FzIG5vdCBxdWV1ZWQgdG8gdGhlIGxvdy1sZXZlbCBkcml2ZXIsIAorCSAqIGJlZm9yZSByZXR1cm5pbmcgU1VDQ0VTUy4KKwkgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+c21wX2xvY2ssIGZsYWdzKTsKKwlzdHMgPSBuY3JfcmVzZXRfYnVzKG5wLCBjbWQsIDEpOworCisJZG9uZV9saXN0ICAgICA9IG5wLT5kb25lX2xpc3Q7CisJbnAtPmRvbmVfbGlzdCA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPnNtcF9sb2NrLCBmbGFncyk7CisKKwluY3JfZmx1c2hfZG9uZV9jbWRzKGRvbmVfbGlzdCk7CisKKwlyZXR1cm4gc3RzOworfQorCisjaWYgMCAvKiB1bnVzZWQgYW5kIGJyb2tlbiAqLworc3RhdGljIGludCBuY3I1M2M4eHhfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBuY2IgKm5wID0gKChzdHJ1Y3QgaG9zdF9kYXRhICopIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSktPm5jYjsKKwlpbnQgc3RzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNjc2lfY21uZCAqZG9uZV9saXN0OworCisjaWYgZGVmaW5lZCBTQ1NJX1JFU0VUX1NZTkNIUk9OT1VTICYmIGRlZmluZWQgU0NTSV9SRVNFVF9BU1lOQ0hST05PVVMKKwlwcmludGsoIm5jcjUzYzh4eF9hYm9ydDogcGlkPSVsdSBzZXJpYWxfbnVtYmVyPSVsZCBzZXJpYWxfbnVtYmVyX2F0X3RpbWVvdXQ9JWxkXG4iLAorCQljbWQtPnBpZCwgY21kLT5zZXJpYWxfbnVtYmVyLCBjbWQtPnNlcmlhbF9udW1iZXJfYXRfdGltZW91dCk7CisjZWxzZQorCXByaW50aygibmNyNTNjOHh4X2Fib3J0OiBjb21tYW5kIHBpZCAlbHVcbiIsIGNtZC0+cGlkKTsKKyNlbmRpZgorCisJTkNSX0xPQ0tfTkNCKG5wLCBmbGFncyk7CisKKyNpZiBkZWZpbmVkIFNDU0lfUkVTRVRfU1lOQ0hST05PVVMgJiYgZGVmaW5lZCBTQ1NJX1JFU0VUX0FTWU5DSFJPTk9VUworCS8qCisJICogV2UgaGF2ZSB0byBqdXN0IGlnbm9yZSBhYm9ydCByZXF1ZXN0cyBpbiBzb21lIHNpdHVhdGlvbnMuCisJICovCisJaWYgKGNtZC0+c2VyaWFsX251bWJlciAhPSBjbWQtPnNlcmlhbF9udW1iZXJfYXRfdGltZW91dCkgeworCQlzdHMgPSBTQ1NJX0FCT1JUX05PVF9SVU5OSU5HOworCQlnb3RvIG91dDsKKwl9CisjZW5kaWYKKworCXN0cyA9IG5jcl9hYm9ydF9jb21tYW5kKG5wLCBjbWQpOworb3V0OgorCWRvbmVfbGlzdCAgICAgPSBucC0+ZG9uZV9saXN0OworCW5wLT5kb25lX2xpc3QgPSBOVUxMOworCU5DUl9VTkxPQ0tfTkNCKG5wLCBmbGFncyk7CisKKwluY3JfZmx1c2hfZG9uZV9jbWRzKGRvbmVfbGlzdCk7CisKKwlyZXR1cm4gc3RzOworfQorI2VuZGlmCisKKworLyoKKyoqCVNjc2kgY29tbWFuZCB3YWl0aW5nIGxpc3QgbWFuYWdlbWVudC4KKyoqCisqKglJdCBtYXkgaGFwcGVuIHRoYXQgd2UgY2Fubm90IGluc2VydCBhIHNjc2kgY29tbWFuZCBpbnRvIHRoZSBzdGFydCBxdWV1ZSwKKyoqCWluIHRoZSBmb2xsb3dpbmcgY2lyY3Vtc3RhbmNlcy4KKyoqIAkJVG9vIGZldyBwcmVhbGxvY2F0ZWQgY2NiKHMpLCAKKyoqCQltYXh0YWdzIDwgY21kX3Blcl9sdW4gb2YgdGhlIExpbnV4IGhvc3QgY29udHJvbCBibG9jaywKKyoqCQlldGMuLi4KKyoqCVN1Y2ggc2NzaSBjb21tYW5kcyBhcmUgaW5zZXJ0ZWQgaW50byBhIHdhaXRpbmcgbGlzdC4KKyoqCVdoZW4gYSBzY3NpIGNvbW1hbmQgY29tcGxldGUsIHdlIHRyeSB0byByZXF1ZXVlIHRoZSBjb21tYW5kcyBvZiB0aGUKKyoqCXdhaXRpbmcgbGlzdC4KKyovCisKKyNkZWZpbmUgbmV4dF93Y21kIGhvc3Rfc2NyaWJibGUKKworc3RhdGljIHZvaWQgaW5zZXJ0X2ludG9fd2FpdGluZ19saXN0KHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IHNjc2lfY21uZCAqd2NtZDsKKworI2lmZGVmIERFQlVHX1dBSVRJTkdfTElTVAorCXByaW50aygiJXM6IGNtZCAlbHggaW5zZXJ0ZWQgaW50byB3YWl0aW5nIGxpc3RcbiIsIG5jcl9uYW1lKG5wKSwgKHVfbG9uZykgY21kKTsKKyNlbmRpZgorCWNtZC0+bmV4dF93Y21kID0gTlVMTDsKKwlpZiAoISh3Y21kID0gbnAtPndhaXRpbmdfbGlzdCkpIG5wLT53YWl0aW5nX2xpc3QgPSBjbWQ7CisJZWxzZSB7CisJCXdoaWxlICgod2NtZC0+bmV4dF93Y21kKSAhPSAwKQorCQkJd2NtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIHdjbWQtPm5leHRfd2NtZDsKKwkJd2NtZC0+bmV4dF93Y21kID0gKGNoYXIgKikgY21kOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzY3NpX2NtbmQgKnJldHJpZXZlX2Zyb21fd2FpdGluZ19saXN0KGludCB0b19yZW1vdmUsIHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IHNjc2lfY21uZCAqKnBjbWQgPSAmbnAtPndhaXRpbmdfbGlzdDsKKworCXdoaWxlICgqcGNtZCkgeworCQlpZiAoY21kID09ICpwY21kKSB7CisJCQlpZiAodG9fcmVtb3ZlKSB7CisJCQkJKnBjbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBjbWQtPm5leHRfd2NtZDsKKwkJCQljbWQtPm5leHRfd2NtZCA9IE5VTEw7CisJCQl9CisjaWZkZWYgREVCVUdfV0FJVElOR19MSVNUCisJcHJpbnRrKCIlczogY21kICVseCByZXRyaWV2ZWQgZnJvbSB3YWl0aW5nIGxpc3RcbiIsIG5jcl9uYW1lKG5wKSwgKHVfbG9uZykgY21kKTsKKyNlbmRpZgorCQkJcmV0dXJuIGNtZDsKKwkJfQorCQlwY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKiopICYoKnBjbWQpLT5uZXh0X3djbWQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX3dhaXRpbmdfbGlzdChzdHJ1Y3QgbmNiICpucCwgaW50IHN0cykKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICp3YWl0aW5nX2xpc3QsICp3Y21kOworCisJd2FpdGluZ19saXN0ID0gbnAtPndhaXRpbmdfbGlzdDsKKwlucC0+d2FpdGluZ19saXN0ID0gTlVMTDsKKworI2lmZGVmIERFQlVHX1dBSVRJTkdfTElTVAorCWlmICh3YWl0aW5nX2xpc3QpIHByaW50aygiJXM6IHdhaXRpbmdfbGlzdD0lbHggcHJvY2Vzc2luZyBzdHM9JWRcbiIsIG5jcl9uYW1lKG5wKSwgKHVfbG9uZykgd2FpdGluZ19saXN0LCBzdHMpOworI2VuZGlmCisJd2hpbGUgKCh3Y21kID0gd2FpdGluZ19saXN0KSAhPSAwKSB7CisJCXdhaXRpbmdfbGlzdCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIHdjbWQtPm5leHRfd2NtZDsKKwkJd2NtZC0+bmV4dF93Y21kID0gTlVMTDsKKwkJaWYgKHN0cyA9PSBESURfT0spIHsKKyNpZmRlZiBERUJVR19XQUlUSU5HX0xJU1QKKwlwcmludGsoIiVzOiBjbWQgJWx4IHRyeWluZyB0byByZXF1ZXVlXG4iLCBuY3JfbmFtZShucCksICh1X2xvbmcpIHdjbWQpOworI2VuZGlmCisJCQlzdHMgPSBuY3JfcXVldWVfY29tbWFuZChucCwgd2NtZCk7CisJCX0KKwkJaWYgKHN0cyAhPSBESURfT0spIHsKKyNpZmRlZiBERUJVR19XQUlUSU5HX0xJU1QKKwlwcmludGsoIiVzOiBjbWQgJWx4IGRvbmUgZm9yY2VkIHN0cz0lZFxuIiwgbmNyX25hbWUobnApLCAodV9sb25nKSB3Y21kLCBzdHMpOworI2VuZGlmCisJCQl3Y21kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KHN0cywgMCk7CisJCQluY3JfcXVldWVfZG9uZV9jbWQobnAsIHdjbWQpOworCQl9CisJfQorfQorCisjdW5kZWYgbmV4dF93Y21kCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfbmNyNTNjOHh4X3JldmlzaW9uKHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBob3N0X2RhdGEgKmhvc3RfZGF0YSA9IChzdHJ1Y3QgaG9zdF9kYXRhICopaG9zdC0+aG9zdGRhdGE7CisgIAorCXJldHVybiBzbnByaW50ZihidWYsIDIwLCAiMHgleFxuIiwgaG9zdF9kYXRhLT5uY2ItPnJldmlzaW9uX2lkKTsKK30KKyAgCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgbmNyNTNjOHh4X3JldmlzaW9uX2F0dHIgPSB7CisJLmF0dHIJPSB7IC5uYW1lID0gInJldmlzaW9uIiwgLm1vZGUgPSBTX0lSVUdPLCB9LAorCS5zaG93CT0gc2hvd19uY3I1M2M4eHhfcmV2aXNpb24sCit9OworICAKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqbmNyNTNjOHh4X2hvc3RfYXR0cnNbXSA9IHsKKwkmbmNyNTNjOHh4X3JldmlzaW9uX2F0dHIsCisJTlVMTAorfTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJQm9vdCBjb21tYW5kIGxpbmUuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2lmZGVmCU1PRFVMRQorY2hhciAqbmNyNTNjOHh4OwkvKiBjb21tYW5kIGxpbmUgcGFzc2VkIGJ5IGluc21vZCAqLworbW9kdWxlX3BhcmFtKG5jcjUzYzh4eCwgY2hhcnAsIDApOworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IG5jcjUzYzh4eF9zZXR1cChjaGFyICpzdHIpCit7CisJcmV0dXJuIHN5bTUzYzh4eF9fc2V0dXAoc3RyKTsKK30KKworI2lmbmRlZiBNT0RVTEUKK19fc2V0dXAoIm5jcjUzYzh4eD0iLCBuY3I1M2M4eHhfc2V0dXApOworI2VuZGlmCisKKworLyoKKyAqCUhvc3QgYXR0YWNoIGFuZCBpbml0aWFsaXNhdGlvbnMuCisgKgorICoJQWxsb2NhdGUgaG9zdCBkYXRhIGFuZCBuY2Igc3RydWN0dXJlLgorICoJUmVxdWVzdCBJTyByZWdpb24gYW5kIHJlbWFwIE1NSU8gcmVnaW9uLgorICoJRG8gY2hpcCBpbml0aWFsaXphdGlvbi4KKyAqCUlmIGFsbCBpcyBPSywgaW5zdGFsbCBpbnRlcnJ1cHQgaGFuZGxpbmcgYW5kCisgKglzdGFydCB0aGUgdGltZXIgZGFlbW9uLgorICovCitzdHJ1Y3QgU2NzaV9Ib3N0ICogX19pbml0IG5jcl9hdHRhY2goc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCwKKwkJCQkJaW50IHVuaXQsIHN0cnVjdCBuY3JfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGhvc3RfZGF0YSAqaG9zdF9kYXRhOworCXN0cnVjdCBuY2IgKm5wID0gTlVMTDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSA9IE5VTEw7CisJdV9sb25nIGZsYWdzID0gMDsKKwlpbnQgaTsKKworCWlmICghdHBudC0+bmFtZSkKKwkJdHBudC0+bmFtZQk9IFNDU0lfTkNSX0RSSVZFUl9OQU1FOworCWlmICghdHBudC0+c2hvc3RfYXR0cnMpCisJCXRwbnQtPnNob3N0X2F0dHJzID0gbmNyNTNjOHh4X2hvc3RfYXR0cnM7CisKKwl0cG50LT5xdWV1ZWNvbW1hbmQJPSBuY3I1M2M4eHhfcXVldWVfY29tbWFuZDsKKwl0cG50LT5zbGF2ZV9jb25maWd1cmUJPSBuY3I1M2M4eHhfc2xhdmVfY29uZmlndXJlOworCXRwbnQtPnNsYXZlX2FsbG9jCT0gbmNyNTNjOHh4X3NsYXZlX2FsbG9jOworCXRwbnQtPmVoX2J1c19yZXNldF9oYW5kbGVyID0gbmNyNTNjOHh4X2J1c19yZXNldDsKKwl0cG50LT5jYW5fcXVldWUJCT0gU0NTSV9OQ1JfQ0FOX1FVRVVFOworCXRwbnQtPnRoaXNfaWQJCT0gNzsKKwl0cG50LT5zZ190YWJsZXNpemUJPSBTQ1NJX05DUl9TR19UQUJMRVNJWkU7CisJdHBudC0+Y21kX3Blcl9sdW4JPSBTQ1NJX05DUl9DTURfUEVSX0xVTjsKKwl0cG50LT51c2VfY2x1c3RlcmluZwk9IEVOQUJMRV9DTFVTVEVSSU5HOworCisJaWYgKGRldmljZS0+ZGlmZmVyZW50aWFsKQorCQlkcml2ZXJfc2V0dXAuZGlmZl9zdXBwb3J0ID0gZGV2aWNlLT5kaWZmZXJlbnRpYWw7CisKKwlwcmludGsoS0VSTl9JTkZPICJuY3I1M2M3MjAtJWQ6IHJldiAweCV4IGlycSAlZFxuIiwKKwkJdW5pdCwgZGV2aWNlLT5jaGlwLnJldmlzaW9uX2lkLCBkZXZpY2UtPnNsb3QuaXJxKTsKKworCWluc3RhbmNlID0gc2NzaV9ob3N0X2FsbG9jKHRwbnQsIHNpemVvZigqaG9zdF9kYXRhKSk7CisJaWYgKCFpbnN0YW5jZSkKKwkgICAgICAgIGdvdG8gYXR0YWNoX2Vycm9yOworCWhvc3RfZGF0YSA9IChzdHJ1Y3QgaG9zdF9kYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKKworCW5wID0gX19tX2NhbGxvY19kbWEoZGV2aWNlLT5kZXYsIHNpemVvZihzdHJ1Y3QgbmNiKSwgIk5DQiIpOworCWlmICghbnApCisJCWdvdG8gYXR0YWNoX2Vycm9yOworCXNwaW5fbG9ja19pbml0KCZucC0+c21wX2xvY2spOworCW5wLT5kZXYgPSBkZXZpY2UtPmRldjsKKwlucC0+cF9uY2IgPSB2dG9idXMobnApOworCWhvc3RfZGF0YS0+bmNiID0gbnA7CisKKwlucC0+Y2NiID0gbV9jYWxsb2NfZG1hKHNpemVvZihzdHJ1Y3QgY2NiKSwgIkNDQiIpOworCWlmICghbnAtPmNjYikKKwkJZ290byBhdHRhY2hfZXJyb3I7CisKKwkvKiBTdG9yZSBpbnB1dCBpbmZvcm1hdGlvbiBpbiB0aGUgaG9zdCBkYXRhIHN0cnVjdHVyZS4gICovCisJbnAtPnVuaXQJPSB1bml0OworCW5wLT52ZXJib3NlCT0gZHJpdmVyX3NldHVwLnZlcmJvc2U7CisJc3ByaW50ZihucC0+aW5zdF9uYW1lLCAibmNyNTNjNzIwLSVkIiwgbnAtPnVuaXQpOworCW5wLT5yZXZpc2lvbl9pZAk9IGRldmljZS0+Y2hpcC5yZXZpc2lvbl9pZDsKKwlucC0+ZmVhdHVyZXMJPSBkZXZpY2UtPmNoaXAuZmVhdHVyZXM7CisJbnAtPmNsb2NrX2Rpdm4JPSBkZXZpY2UtPmNoaXAubnJfZGl2aXNvcjsKKwlucC0+bWF4b2Zmcwk9IGRldmljZS0+Y2hpcC5vZmZzZXRfbWF4OworCW5wLT5tYXhidXJzdAk9IGRldmljZS0+Y2hpcC5idXJzdF9tYXg7CisJbnAtPm15YWRkcgk9IGRldmljZS0+aG9zdF9pZDsKKworCS8qIEFsbG9jYXRlIFNDUklQVFMgYXJlYXMuICAqLworCW5wLT5zY3JpcHQwID0gbV9jYWxsb2NfZG1hKHNpemVvZihzdHJ1Y3Qgc2NyaXB0KSwgIlNDUklQVCIpOworCWlmICghbnAtPnNjcmlwdDApCisJCWdvdG8gYXR0YWNoX2Vycm9yOworCW5wLT5zY3JpcHRoMCA9IG1fY2FsbG9jX2RtYShzaXplb2Yoc3RydWN0IHNjcmlwdGgpLCAiU0NSSVBUSCIpOworCWlmICghbnAtPnNjcmlwdGgwKQorCQlnb3RvIGF0dGFjaF9lcnJvcjsKKworCWluaXRfdGltZXIoJm5wLT50aW1lcik7CisJbnAtPnRpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpIG5wOworCW5wLT50aW1lci5mdW5jdGlvbiA9IG5jcjUzYzh4eF90aW1lb3V0OworCisJLyogVHJ5IHRvIG1hcCB0aGUgY29udHJvbGxlciBjaGlwIHRvIHZpcnR1YWwgYW5kIHBoeXNpY2FsIG1lbW9yeS4gKi8KKworCW5wLT5wYWRkcgk9IGRldmljZS0+c2xvdC5iYXNlOworCW5wLT5wYWRkcjIJPSAobnAtPmZlYXR1cmVzICYgRkVfUkFNKSA/IGRldmljZS0+c2xvdC5iYXNlXzIgOiAwOworCisJaWYgKGRldmljZS0+c2xvdC5iYXNlX3YpCisJCW5wLT52YWRkciA9IGRldmljZS0+c2xvdC5iYXNlX3Y7CisJZWxzZQorCQlucC0+dmFkZHIgPSBpb3JlbWFwKGRldmljZS0+c2xvdC5iYXNlX2MsIDEyOCk7CisKKwlpZiAoIW5wLT52YWRkcikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSIlczogY2FuJ3QgbWFwIG1lbW9yeSBtYXBwZWQgSU8gcmVnaW9uXG4iLG5jcl9uYW1lKG5wKSk7CisJCWdvdG8gYXR0YWNoX2Vycm9yOworCX0gZWxzZSB7CisJCWlmIChib290dmVyYm9zZSA+IDEpCisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOiB1c2luZyBtZW1vcnkgbWFwcGVkIElPIGF0IHZpcnR1YWwgYWRkcmVzcyAweCVseFxuIiwgbmNyX25hbWUobnApLCAodV9sb25nKSBucC0+dmFkZHIpOworCX0KKworCS8qIE1ha2UgdGhlIGNvbnRyb2xsZXIncyByZWdpc3RlcnMgYXZhaWxhYmxlLiAgTm93IHRoZSBJTkIgSU5XIElOTAorCSAqIE9VVEIgT1VUVyBPVVRMIG1hY3JvcyBjYW4gYmUgdXNlZCBzYWZlbHkuCisJICovCisKKwlucC0+cmVnID0gKHN0cnVjdCBuY3JfcmVnIF9faW9tZW0gKilucC0+dmFkZHI7CisKKwkvKiBEbyBjaGlwIGRlcGVuZGVudCBpbml0aWFsaXphdGlvbi4gICovCisJbmNyX3ByZXBhcmVfc2V0dGluZyhucCk7CisKKwlpZiAobnAtPnBhZGRyMiAmJiBzaXplb2Yoc3RydWN0IHNjcmlwdCkgPiA0MDk2KSB7CisJCW5wLT5wYWRkcjIgPSAwOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc2NyaXB0IHRvbyBsYXJnZSwgTk9UIHVzaW5nIG9uIGNoaXAgUkFNLlxuIiwKKwkJCW5jcl9uYW1lKG5wKSk7CisJfQorCisJaW5zdGFuY2UtPm1heF9jaGFubmVsCT0gMDsKKwlpbnN0YW5jZS0+dGhpc19pZCAgICAgICA9IG5wLT5teWFkZHI7CisJaW5zdGFuY2UtPm1heF9pZAk9IG5wLT5tYXh3aWRlID8gMTYgOiA4OworCWluc3RhbmNlLT5tYXhfbHVuCT0gU0NTSV9OQ1JfTUFYX0xVTjsKKwlpbnN0YW5jZS0+YmFzZQkJPSAodW5zaWduZWQgbG9uZykgbnAtPnJlZzsKKwlpbnN0YW5jZS0+aXJxCQk9IGRldmljZS0+c2xvdC5pcnE7CisJaW5zdGFuY2UtPnVuaXF1ZV9pZAk9IGRldmljZS0+c2xvdC5iYXNlOworCWluc3RhbmNlLT5kbWFfY2hhbm5lbAk9IDA7CisJaW5zdGFuY2UtPmNtZF9wZXJfbHVuCT0gTUFYX1RBR1M7CisJaW5zdGFuY2UtPmNhbl9xdWV1ZQk9IChNQVhfU1RBUlQtNCk7CisJLyogVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBmb3JnZXQgdG8gY2FsbCBuY3I1M2M4eHhfaW5pdCBmcm9tCisJICogeW91ciBtb2R1bGVfaW5pdCAqLworCUJVR19PTighbmNyNTNjOHh4X3RyYW5zcG9ydF90ZW1wbGF0ZSk7CisJaW5zdGFuY2UtPnRyYW5zcG9ydHQJPSBuY3I1M2M4eHhfdHJhbnNwb3J0X3RlbXBsYXRlOworCXNjc2lfc2V0X2RldmljZShpbnN0YW5jZSwgZGV2aWNlLT5kZXYpOworCisJLyogUGF0Y2ggc2NyaXB0IHRvIHBoeXNpY2FsIGFkZHJlc3NlcyAqLworCW5jcl9zY3JpcHRfZmlsbCgmc2NyaXB0MCwgJnNjcmlwdGgwKTsKKworCW5wLT5zY3JpcHRoCT0gbnAtPnNjcmlwdGgwOworCW5wLT5wX3NjcmlwdGgJPSB2dG9idXMobnAtPnNjcmlwdGgpOworCW5wLT5wX3NjcmlwdAk9IChucC0+cGFkZHIyKSA/ICBucC0+cGFkZHIyIDogdnRvYnVzKG5wLT5zY3JpcHQwKTsKKworCW5jcl9zY3JpcHRfY29weV9hbmRfYmluZChucCwgKG5jcmNtZCAqKSAmc2NyaXB0MCwKKwkJCShuY3JjbWQgKikgbnAtPnNjcmlwdDAsIHNpemVvZihzdHJ1Y3Qgc2NyaXB0KSk7CisJbmNyX3NjcmlwdF9jb3B5X2FuZF9iaW5kKG5wLCAobmNyY21kICopICZzY3JpcHRoMCwKKwkJCShuY3JjbWQgKikgbnAtPnNjcmlwdGgwLCBzaXplb2Yoc3RydWN0IHNjcmlwdGgpKTsKKwlucC0+Y2NiLT5wX2NjYgk9IHZ0b2J1cyAobnAtPmNjYik7CisKKwkvKiBQYXRjaCB0aGUgc2NyaXB0IGZvciBMRUQgc3VwcG9ydC4gICovCisKKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfTEVEMCkgeworCQlucC0+c2NyaXB0MC0+aWRsZVswXSAgPQorCQkJCWNwdV90b19zY3IoU0NSX1JFR19SRUcoZ3ByZWcsIFNDUl9PUiwgIDB4MDEpKTsKKwkJbnAtPnNjcmlwdDAtPnJlc2VsZWN0ZWRbMF0gPQorCQkJCWNwdV90b19zY3IoU0NSX1JFR19SRUcoZ3ByZWcsIFNDUl9BTkQsIDB4ZmUpKTsKKwkJbnAtPnNjcmlwdDAtPnN0YXJ0WzBdID0KKwkJCQljcHVfdG9fc2NyKFNDUl9SRUdfUkVHKGdwcmVnLCBTQ1JfQU5ELCAweGZlKSk7CisJfQorCisJLyoKKwkgKiBMb29rIGZvciB0aGUgdGFyZ2V0IGNvbnRyb2wgYmxvY2sgb2YgdGhpcyBuZXh1cy4KKwkgKiBGb3IgaSA9IDAgdG8gMworCSAqICAgSlVNUCBeIElGVFJVRSAoTUFTSyAoaSwgMykpLCBAKG5leHRfbGNiKQorCSAqLworCWZvciAoaSA9IDAgOyBpIDwgNCA7IGkrKykgeworCQlucC0+anVtcF90Y2JbaV0ubF9jbWQgICA9CisJCQkJY3B1X3RvX3NjcigoU0NSX0pVTVAgXiBJRlRSVUUgKE1BU0sgKGksIDMpKSkpOworCQlucC0+anVtcF90Y2JbaV0ubF9wYWRkciA9CisJCQkJY3B1X3RvX3NjcihOQ0JfU0NSSVBUSF9QSFlTIChucCwgYmFkX3RhcmdldCkpOworCX0KKworCW5jcl9jaGlwX3Jlc2V0KG5wLCAxMDApOworCisJLyogTm93IGNoZWNrIHRoZSBjYWNoZSBoYW5kbGluZyBvZiB0aGUgY2hpcHNldC4gICovCisKKwlpZiAobmNyX3Nub29wdGVzdChucCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDQUNIRSBJTkNPUlJFQ1RMWSBDT05GSUdVUkVELlxuIik7CisJCWdvdG8gYXR0YWNoX2Vycm9yOworCX0KKworCS8qIEluc3RhbGwgdGhlIGludGVycnVwdCBoYW5kbGVyLiAgKi8KKwlucC0+aXJxID0gZGV2aWNlLT5zbG90LmlycTsKKworCS8qIEluaXRpYWxpemUgdGhlIGZpeGVkIHBhcnQgb2YgdGhlIGRlZmF1bHQgY2NiLiAgKi8KKwluY3JfaW5pdF9jY2IobnAsIG5wLT5jY2IpOworCisJLyoKKwkgKiBBZnRlciBTQ1NJIGRldmljZXMgaGF2ZSBiZWVuIG9wZW5lZCwgd2UgY2Fubm90IHJlc2V0IHRoZSBidXMKKwkgKiBzYWZlbHksIHNvIHdlIGRvIGl0IGhlcmUuICBJbnRlcnJ1cHQgaGFuZGxlciBkb2VzIHRoZSByZWFsIHdvcmsuCisJICogUHJvY2VzcyB0aGUgcmVzZXQgZXhjZXB0aW9uIGlmIGludGVycnVwdHMgYXJlIG5vdCBlbmFibGVkIHlldC4KKwkgKiBUaGVuIGVuYWJsZSBkaXNjb25uZWN0cy4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPnNtcF9sb2NrLCBmbGFncyk7CisJaWYgKG5jcl9yZXNldF9zY3NpX2J1cyhucCwgMCwgZHJpdmVyX3NldHVwLnNldHRsZV9kZWxheSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGQVRBTCBFUlJPUjogQ0hFQ0sgU0NTSSBCVVMgLSBDQUJMRVMsIFRFUk1JTkFUSU9OLCBERVZJQ0UgUE9XRVIgZXRjLiFcbiIsIG5jcl9uYW1lKG5wKSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPnNtcF9sb2NrLCBmbGFncyk7CisJCWdvdG8gYXR0YWNoX2Vycm9yOworCX0KKwluY3JfZXhjZXB0aW9uKG5wKTsKKworCW5wLT5kaXNjID0gMTsKKworCS8qCisJICogVGhlIG1pZGRsZS1sZXZlbCBTQ1NJIGRyaXZlciBkb2VzIG5vdCB3YWl0IGZvciBkZXZpY2VzIHRvIHNldHRsZS4KKwkgKiBXYWl0IHN5bmNocm9ub3VzbHkgaWYgbW9yZSB0aGFuIDIgc2Vjb25kcy4KKwkgKi8KKwlpZiAoZHJpdmVyX3NldHVwLnNldHRsZV9kZWxheSA+IDIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHdhaXRpbmcgJWQgc2Vjb25kcyBmb3Igc2NzaSBkZXZpY2VzIHRvIHNldHRsZS4uLlxuIiwKKwkJCW5jcl9uYW1lKG5wKSwgZHJpdmVyX3NldHVwLnNldHRsZV9kZWxheSk7CisJCW1kZWxheSgxMDAwICogZHJpdmVyX3NldHVwLnNldHRsZV9kZWxheSk7CisJfQorCisJLyogc3RhcnQgdGhlIHRpbWVvdXQgZGFlbW9uICovCisJbnAtPmxhc3R0aW1lPTA7CisJbmNyX3RpbWVvdXQgKG5wKTsKKworCS8qIHVzZSBTSU1QTEUgVEFHIG1lc3NhZ2VzIGJ5IGRlZmF1bHQgKi8KKyNpZmRlZiBTQ1NJX05DUl9BTFdBWVNfU0lNUExFX1RBRworCW5wLT5vcmRlciA9IE1fU0lNUExFX1RBRzsKKyNlbmRpZgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPnNtcF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gaW5zdGFuY2U7CisKKyBhdHRhY2hfZXJyb3I6CisJaWYgKCFpbnN0YW5jZSkKKwkJcmV0dXJuIE5VTEw7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGRldGFjaGluZy4uLlxuIiwgbmNyX25hbWUobnApKTsKKwlpZiAoIW5wKQorCQlnb3RvIHVucmVnaXN0ZXI7CisJaWYgKG5wLT5zY3JpcHRoMCkKKwkJbV9mcmVlX2RtYShucC0+c2NyaXB0aDAsIHNpemVvZihzdHJ1Y3Qgc2NyaXB0aCksICJTQ1JJUFRIIik7CisJaWYgKG5wLT5zY3JpcHQwKQorCQltX2ZyZWVfZG1hKG5wLT5zY3JpcHQwLCBzaXplb2Yoc3RydWN0IHNjcmlwdCksICJTQ1JJUFQiKTsKKwlpZiAobnAtPmNjYikKKwkJbV9mcmVlX2RtYShucC0+Y2NiLCBzaXplb2Yoc3RydWN0IGNjYiksICJDQ0IiKTsKKwltX2ZyZWVfZG1hKG5wLCBzaXplb2Yoc3RydWN0IG5jYiksICJOQ0IiKTsKKwlob3N0X2RhdGEtPm5jYiA9IE5VTEw7CisKKyB1bnJlZ2lzdGVyOgorCXNjc2lfaG9zdF9wdXQoaW5zdGFuY2UpOworCisJcmV0dXJuIE5VTEw7Cit9CisKKworaW50IG5jcjUzYzh4eF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RydWN0IGhvc3RfZGF0YSAqaG9zdF9kYXRhOworI2lmZGVmIERFQlVHX05DUjUzQzhYWAorCXByaW50aygibmNyNTNjOHh4OiByZWxlYXNlXG4iKTsKKyNlbmRpZgorCWlmICghaG9zdCkKKwkJcmV0dXJuIDE7CisJaG9zdF9kYXRhID0gKHN0cnVjdCBob3N0X2RhdGEgKilob3N0LT5ob3N0ZGF0YTsKKwlpZiAoaG9zdF9kYXRhICYmIGhvc3RfZGF0YS0+bmNiKQorCQluY3JfZGV0YWNoKGhvc3RfZGF0YS0+bmNiKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgbmNyNTNjOHh4X3NldF9wZXJpb2Qoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LCBpbnQgcGVyaW9kKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBuY2IgKm5wID0gKChzdHJ1Y3QgaG9zdF9kYXRhICopc2hvc3QtPmhvc3RkYXRhKS0+bmNiOworCXN0cnVjdCB0Y2IgKnRwID0gJm5wLT50YXJnZXRbc3RhcmdldC0+aWRdOworCisJaWYgKHBlcmlvZCA+IG5wLT5tYXhzeW5jKQorCQlwZXJpb2QgPSBucC0+bWF4c3luYzsKKwllbHNlIGlmIChwZXJpb2QgPCBucC0+bWluc3luYykKKwkJcGVyaW9kID0gbnAtPm1pbnN5bmM7CisKKwl0cC0+dXNyc3luYyA9IHBlcmlvZDsKKworCW5jcl9uZWdvdGlhdGUobnAsIHRwKTsKK30KKworc3RhdGljIHZvaWQgbmNyNTNjOHh4X3NldF9vZmZzZXQoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBuY2IgKm5wID0gKChzdHJ1Y3QgaG9zdF9kYXRhICopc2hvc3QtPmhvc3RkYXRhKS0+bmNiOworCXN0cnVjdCB0Y2IgKnRwID0gJm5wLT50YXJnZXRbc3RhcmdldC0+aWRdOworCisJaWYgKG9mZnNldCA+IG5wLT5tYXhvZmZzKQorCQlvZmZzZXQgPSBucC0+bWF4b2ZmczsKKwllbHNlIGlmIChvZmZzZXQgPCAwKQorCQlvZmZzZXQgPSAwOworCisJdHAtPm1heG9mZnMgPSBvZmZzZXQ7CisKKwluY3JfbmVnb3RpYXRlKG5wLCB0cCk7Cit9CisKK3N0YXRpYyB2b2lkIG5jcjUzYzh4eF9zZXRfd2lkdGgoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LCBpbnQgd2lkdGgpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IG5jYiAqbnAgPSAoKHN0cnVjdCBob3N0X2RhdGEgKilzaG9zdC0+aG9zdGRhdGEpLT5uY2I7CisJc3RydWN0IHRjYiAqdHAgPSAmbnAtPnRhcmdldFtzdGFyZ2V0LT5pZF07CisKKwlpZiAod2lkdGggPiBucC0+bWF4d2lkZSkKKwkJd2lkdGggPSBucC0+bWF4d2lkZTsKKwllbHNlIGlmICh3aWR0aCA8IDApCisJCXdpZHRoID0gMDsKKworCXRwLT51c3J3aWRlID0gd2lkdGg7CisKKwluY3JfbmVnb3RpYXRlKG5wLCB0cCk7Cit9CisKK3N0YXRpYyB2b2lkIG5jcjUzYzh4eF9nZXRfc2lnbmFsbGluZyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3QgbmNiICpucCA9ICgoc3RydWN0IGhvc3RfZGF0YSAqKXNob3N0LT5ob3N0ZGF0YSktPm5jYjsKKwllbnVtIHNwaV9zaWduYWxfdHlwZSB0eXBlOworCisJc3dpdGNoIChucC0+c2NzaV9tb2RlKSB7CisJY2FzZSBTTU9ERV9TRToKKwkJdHlwZSA9IFNQSV9TSUdOQUxfU0U7CisJCWJyZWFrOworCWNhc2UgU01PREVfSFZEOgorCQl0eXBlID0gU1BJX1NJR05BTF9IVkQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXR5cGUgPSBTUElfU0lHTkFMX1VOS05PV047CisJCWJyZWFrOworCX0KKwlzcGlfc2lnbmFsbGluZyhzaG9zdCkgPSB0eXBlOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9mdW5jdGlvbl90ZW1wbGF0ZSBuY3I1M2M4eHhfdHJhbnNwb3J0X2Z1bmN0aW9ucyA9ICB7CisJLnNldF9wZXJpb2QJPSBuY3I1M2M4eHhfc2V0X3BlcmlvZCwKKwkuc2hvd19wZXJpb2QJPSAxLAorCS5zZXRfb2Zmc2V0CT0gbmNyNTNjOHh4X3NldF9vZmZzZXQsCisJLnNob3dfb2Zmc2V0CT0gMSwKKwkuc2V0X3dpZHRoCT0gbmNyNTNjOHh4X3NldF93aWR0aCwKKwkuc2hvd193aWR0aAk9IDEsCisJLmdldF9zaWduYWxsaW5nCT0gbmNyNTNjOHh4X2dldF9zaWduYWxsaW5nLAorfTsKKworaW50IF9faW5pdCBuY3I1M2M4eHhfaW5pdCh2b2lkKQoreworCW5jcjUzYzh4eF90cmFuc3BvcnRfdGVtcGxhdGUgPSBzcGlfYXR0YWNoX3RyYW5zcG9ydCgmbmNyNTNjOHh4X3RyYW5zcG9ydF9mdW5jdGlvbnMpOworCWlmICghbmNyNTNjOHh4X3RyYW5zcG9ydF90ZW1wbGF0ZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbmNyNTNjOHh4X2V4aXQodm9pZCkKK3sKKwlzcGlfcmVsZWFzZV90cmFuc3BvcnQobmNyNTNjOHh4X3RyYW5zcG9ydF90ZW1wbGF0ZSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbmNyNTNjOHh4LmggYi9kcml2ZXJzL3Njc2kvbmNyNTNjOHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjN2I4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9uY3I1M2M4eHguaApAQCAtMCwwICsxLDEwMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogIERldmljZSBkcml2ZXIgZm9yIHRoZSBQQ0ktU0NTSSBOQ1I1MzhYWCBjb250cm9sbGVyIGZhbWlseS4KKyoqCisqKiAgQ29weXJpZ2h0IChDKSAxOTk0ICBXb2xmZ2FuZyBTdGFuZ2xtZWllcgorKioKKyoqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyoqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKioKKyoqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKioKKyoqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBUaGlzIGRyaXZlciBoYXMgYmVlbiBwb3J0ZWQgdG8gTGludXggZnJvbSB0aGUgRnJlZUJTRCBOQ1I1M0M4WFggZHJpdmVyCisqKiAgYW5kIGlzIGN1cnJlbnRseSBtYWludGFpbmVkIGJ5CisqKgorKiogICAgICAgICAgR2VyYXJkIFJvdWRpZXIgICAgICAgICAgICAgIDxncm91ZGllckBmcmVlLmZyPgorKioKKyoqICBCZWluZyBnaXZlbiB0aGF0IHRoaXMgZHJpdmVyIG9yaWdpbmF0ZXMgZnJvbSB0aGUgRnJlZUJTRCB2ZXJzaW9uLCBhbmQKKyoqICBpbiBvcmRlciB0byBrZWVwIHN5bmVyZ3kgb24gYm90aCwgYW55IHN1Z2dlc3RlZCBlbmhhbmNlbWVudHMgYW5kIGNvcnJlY3Rpb25zCisqKiAgcmVjZWl2ZWQgb24gTGludXggYXJlIGF1dG9tYXRpY2FsbHkgYSBwb3RlbnRpYWwgY2FuZGlkYXRlIGZvciB0aGUgRnJlZUJTRCAKKyoqICB2ZXJzaW9uLgorKioKKyoqICBUaGUgb3JpZ2luYWwgZHJpdmVyIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIDM4NmJzZCBhbmQgRnJlZUJTRCBieQorKiogICAgICAgICAgV29sZmdhbmcgU3RhbmdsbWVpZXIgICAgICAgIDx3b2xmQGNvbG9nbmUuZGU+CisqKiAgICAgICAgICBTdGVmYW4gRXNzZXIgICAgICAgICAgICAgICAgPHNlQG1pLlVuaS1Lb2Vsbi5kZT4KKyoqCisqKiAgQW5kIGhhcyBiZWVuIHBvcnRlZCB0byBOZXRCU0QgYnkKKyoqICAgICAgICAgIENoYXJsZXMgTS4gSGFubnVtICAgICAgICAgICA8bXljcm9mdEBnbnUuYWkubWl0LmVkdT4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIE5DUjUzQzhYWF9ICisjZGVmaW5lIE5DUjUzQzhYWF9ICisKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSAic3ltNTNjOHh4X2RlZnMuaCIKKworLyoKKwlCdWlsZCBhIHNjYXR0ZXIvZ2F0aGVyIGVudHJ5LgorCXNlZSBzeW01M2M4eHhfMi9zeW1faGlwZC5oIGZvciBtb3JlIGRldGFpbGVkIHN5bV9idWlsZF9zZ2UoKQorCWltcGxlbWVudGF0aW9uIDspCisgKi8KKworI2RlZmluZSBuY3JfYnVpbGRfc2dlKG5wLCBkYXRhLCBiYWRkLCBsZW4pCVwKK2RvIHsJCQkJCQlcCisJKGRhdGEpLT5hZGRyID0gY3B1X3RvX3NjcihiYWRkKTsJXAorCShkYXRhKS0+c2l6ZSA9IGNwdV90b19zY3IobGVuKTsJCVwKK30gd2hpbGUgKDApCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCVN0cnVjdHVyZXMgdXNlZCBieSB0aGUgZGV0ZWN0aW9uIHJvdXRpbmUgdG8gdHJhbnNtaXQgCisqKglkZXZpY2UgY29uZmlndXJhdGlvbiB0byB0aGUgYXR0YWNoIGZ1bmN0aW9uLgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0cnVjdCBuY3Jfc2xvdCB7CisJdV9sb25nCWJhc2U7CisJdV9sb25nCWJhc2VfMjsKKwl1X2xvbmcJYmFzZV9jOworCXVfbG9uZwliYXNlXzJfYzsKKwl2b2lkIF9faW9tZW0gKmJhc2VfdjsKKwl2b2lkIF9faW9tZW0gKmJhc2VfMl92OworCWludAlpcnE7CisvKiBwb3J0IGFuZCByZWcgZmllbGRzIHRvIHVzZSBJTkIsIE9VVEIgbWFjcm9zICovCisJdm9sYXRpbGUgc3RydWN0IG5jcl9yZWcJX19pb21lbSAqcmVnOworfTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJU3RydWN0dXJlIHVzZWQgYnkgZGV0ZWN0aW9uIHJvdXRpbmUgdG8gc2F2ZSBkYXRhIG9uIAorKioJZWFjaCBkZXRlY3RlZCBib2FyZCBmb3IgYXR0YWNoLgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0cnVjdCBuY3JfZGV2aWNlIHsKKwlzdHJ1Y3QgZGV2aWNlICAqZGV2OworCXN0cnVjdCBuY3Jfc2xvdCAgc2xvdDsKKwlzdHJ1Y3QgbmNyX2NoaXAgIGNoaXA7CisJdV9jaGFyIGhvc3RfaWQ7CisJdTggZGlmZmVyZW50aWFsOworfTsKKworZXh0ZXJuIHN0cnVjdCBTY3NpX0hvc3QgKm5jcl9hdHRhY2goc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCwgaW50IHVuaXQsIHN0cnVjdCBuY3JfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGludCBuY3I1M2M4eHhfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKK2lycXJldHVybl90IG5jcjUzYzh4eF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKTsKK2V4dGVybiBpbnQgbmNyNTNjOHh4X2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBuY3I1M2M4eHhfZXhpdCh2b2lkKTsKKworI2VuZGlmIC8qIE5DUjUzQzhYWF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbnNwMzIuYyBiL2RyaXZlcnMvc2NzaS9uc3AzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZmVhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbnNwMzIuYwpAQCAtMCwwICsxLDM1ODUgQEAKKy8qCisgKiBOaW5qYVNDU0ktMzJCaSBDYXJkYnVzLCBOaW5qYVNDU0ktMzJVREUgUENJL0NhcmRCdXMgU0NTSSBkcml2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMworICogICAgICBZT0tPVEEgSGlyb3NoaSA8eW9rb3RhQG5ldGxhYi5pcy50c3VrdWJhLmFjLmpwPgorICogICAgICBHT1RPIE1hc2Fub3JpIDxnb3RvbUBkZWJpYW4ub3IuanA+LCA8Z290b21AZGViaWFuLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoKKyAqIFJldmlzaW9uIEhpc3Rvcnk6CisgKiAgIDEuMDogSW5pdGlhbCBSZWxlYXNlLgorICogICAxLjE6IEFkZCAvcHJvYyBTRFRSIHN0YXR1cy4KKyAqICAgICAgICBSZW1vdmUgb2Jzb2xldGUgZXJyb3IgaGFuZGxlciBuc3AzMl9yZXNldC4KKyAqICAgICAgICBTb21lIGNsZWFuIHVwLgorICogICAxLjI6IFBvd2VyUEMgKGJpZyBlbmRpYW4pIHN1cHBvcnQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9pb2N0bC5oPgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKKyMgaW5jbHVkZSA8bGludXgvYmxrLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIm5zcDMyLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNb2R1bGUgcGFyYW1ldGVycworICovCitzdGF0aWMgaW50ICAgICAgIHRyYW5zX21vZGUgPSAwOwkvKiBkZWZhdWx0OiBCSU9TICovCittb2R1bGVfcGFyYW0gICAgICh0cmFuc19tb2RlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0cmFuc19tb2RlLCAidHJhbnNmZXIgbW9kZSAoMDogQklPUyhkZWZhdWx0KSAxOiBBc3luYyAyOiBVbHRyYTIwTSIpOworI2RlZmluZSBBU1lOQ19NT0RFICAgIDEKKyNkZWZpbmUgVUxUUkEyME1fTU9ERSAyCisKK3N0YXRpYyBpbnQgICAgICAgYXV0b19wYXJhbSA9IDA7CS8qIGRlZmF1bHQ6IE9OICovCittb2R1bGVfcGFyYW0gICAgIChhdXRvX3BhcmFtLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYXV0b19wYXJhbSwgIkF1dG9QYXJhbWV0ZXIgbW9kZSAoMDogT04oZGVmYXVsdCkgMTogT0ZGKSIpOworCitzdGF0aWMgaW50ICAgICAgIGRpc2NfcHJpdiAgPSAxOwkvKiBkZWZhdWx0OiBPRkYgKi8KK21vZHVsZV9wYXJhbSAgICAgKGRpc2NfcHJpdiwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2NfcHJpdiwgICJkaXNjb25uZWN0aW9uIHByaXZpbGVnZSBtb2RlICgwOiBPTiAxOiBPRkYoZGVmYXVsdCkpIik7CisKK01PRFVMRV9BVVRIT1IoIllPS09UQSBIaXJvc2hpIDx5b2tvdGFAbmV0bGFiLmlzLnRzdWt1YmEuYWMuanA+LCBHT1RPIE1hc2Fub3JpIDxnb3RvbUBkZWJpYW4ub3IuanA+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIldvcmtiaXQgTmluamFTQ1NJLTMyQmkvVURFIENhcmRCdXMvUENJIFNDU0kgaG9zdCBidXMgYWRhcHRlciBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKm5zcDMyX3JlbGVhc2VfdmVyc2lvbiA9ICIxLjIiOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdXBwb3J0ZWQgaGFyZHdhcmUKKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG5zcDMyX3BjaV90YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCQkudmVuZG9yICAgICAgPSBQQ0lfVkVORE9SX0lEX0lPREFUQSwKKwkJLmRldmljZSAgICAgID0gUENJX0RFVklDRV9JRF9OSU5KQVNDU0lfMzJCSV9DQlNDX0lJLAorCQkuc3VidmVuZG9yICAgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlICAgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBNT0RFTF9JT0RBVEEsCisJfSwKKwl7CisJCS52ZW5kb3IgICAgICA9IFBDSV9WRU5ET1JfSURfV09SS0JJVCwKKwkJLmRldmljZSAgICAgID0gUENJX0RFVklDRV9JRF9OSU5KQVNDU0lfMzJCSV9LTUUsCisJCS5zdWJ2ZW5kb3IgICA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgICA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IE1PREVMX0tNRSwKKwl9LAorCXsKKwkJLnZlbmRvciAgICAgID0gUENJX1ZFTkRPUl9JRF9XT1JLQklULAorCQkuZGV2aWNlICAgICAgPSBQQ0lfREVWSUNFX0lEX05JTkpBU0NTSV8zMkJJX1dCVCwKKwkJLnN1YnZlbmRvciAgID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSAgID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhID0gTU9ERUxfV09SS0JJVCwKKwl9LAorCXsKKwkJLnZlbmRvciAgICAgID0gUENJX1ZFTkRPUl9JRF9XT1JLQklULAorCQkuZGV2aWNlICAgICAgPSBQQ0lfREVWSUNFX0lEX1dPUktCSVRfU1RBTkRBUkQsCisJCS5zdWJ2ZW5kb3IgICA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgICA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IE1PREVMX1BDSV9XT1JLQklULAorCX0sCisJeworCQkudmVuZG9yICAgICAgPSBQQ0lfVkVORE9SX0lEX1dPUktCSVQsCisJCS5kZXZpY2UgICAgICA9IFBDSV9ERVZJQ0VfSURfTklOSkFTQ1NJXzMyQklfTE9HSVRFQywKKwkJLnN1YnZlbmRvciAgID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSAgID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhID0gTU9ERUxfTE9HSVRFQywKKwl9LAorCXsKKwkJLnZlbmRvciAgICAgID0gUENJX1ZFTkRPUl9JRF9XT1JLQklULAorCQkuZGV2aWNlICAgICAgPSBQQ0lfREVWSUNFX0lEX05JTkpBU0NTSV8zMkJJQl9MT0dJVEVDLAorCQkuc3VidmVuZG9yICAgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlICAgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBNT0RFTF9QQ0lfTE9HSVRFQywKKwl9LAorCXsKKwkJLnZlbmRvciAgICAgID0gUENJX1ZFTkRPUl9JRF9XT1JLQklULAorCQkuZGV2aWNlICAgICAgPSBQQ0lfREVWSUNFX0lEX05JTkpBU0NTSV8zMlVERV9NRUxDTywKKwkJLnN1YnZlbmRvciAgID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSAgID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhID0gTU9ERUxfUENJX01FTENPLAorCX0sCisJeworCQkudmVuZG9yICAgICAgPSBQQ0lfVkVORE9SX0lEX1dPUktCSVQsCisJCS5kZXZpY2UgICAgICA9IFBDSV9ERVZJQ0VfSURfTklOSkFTQ1NJXzMyVURFX01FTENPX0lJLAorCQkuc3VidmVuZG9yICAgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlICAgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBNT0RFTF9QQ0lfTUVMQ08sCisJfSwKKwl7MCwwLH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG5zcDMyX3BjaV90YWJsZSk7CisKK3N0YXRpYyBuc3AzMl9od19kYXRhIG5zcDMyX2RhdGFfYmFzZTsgIC8qIHByb2JlIDwtPiBkZXRlY3QgZ2x1ZSAqLworCisKKy8qCisgKiBQZXJpb2QvQWNrV2lkdGggc3BlZWQgY29udmVyc2lvbiB0YWJsZQorICoKKyAqIE5vdGU6IFRoaXMgcGVyaW9kL2Fja3dpZHRoIHNwZWVkIHRhYmxlIG11c3QgYmUgaW4gZGVzY2VuZGluZyBvcmRlci4KKyAqLworc3RhdGljIG5zcDMyX3N5bmNfdGFibGUgbnNwMzJfc3luY190YWJsZV80ME1bXSA9IHsKKyAgICAgLyoge1BObywgQVcsICAgU1AsICAgRVAsIFNSRVEgc21wbH0gIFNwZWVkKE1CL3MpIFBlcmlvZCBBY2tXaWR0aCAqLworCXsweDEsICAwLCAweDBjLCAweDBjLCBTTVBMXzQwTX0sICAvKiAgMjAuMCA6ICA1MG5zLCAgMjVucyAqLworCXsweDIsICAwLCAweDBkLCAweDE4LCBTTVBMXzQwTX0sICAvKiAgMTMuMyA6ICA3NW5zLCAgMjVucyAqLworCXsweDMsICAxLCAweDE5LCAweDE5LCBTTVBMXzQwTX0sICAvKiAgMTAuMCA6IDEwMG5zLCAgNTBucyAqLworCXsweDQsICAxLCAweDFhLCAweDFmLCBTTVBMXzIwTX0sICAvKiAgIDguMCA6IDEyNW5zLCAgNTBucyAqLworCXsweDUsICAyLCAweDIwLCAweDI1LCBTTVBMXzIwTX0sICAvKiAgIDYuNyA6IDE1MG5zLCAgNzVucyAqLworCXsweDYsICAyLCAweDI2LCAweDMxLCBTTVBMXzIwTX0sICAvKiAgIDUuNyA6IDE3NW5zLCAgNzVucyAqLworCXsweDcsICAzLCAweDMyLCAweDMyLCBTTVBMXzIwTX0sICAvKiAgIDUuMCA6IDIwMG5zLCAxMDBucyAqLworCXsweDgsICAzLCAweDMzLCAweDM4LCBTTVBMXzEwTX0sICAvKiAgIDQuNCA6IDIyNW5zLCAxMDBucyAqLworCXsweDksICAzLCAweDM5LCAweDNlLCBTTVBMXzEwTX0sICAvKiAgIDQuMCA6IDI1MG5zLCAxMDBucyAqLworfTsKKworc3RhdGljIG5zcDMyX3N5bmNfdGFibGUgbnNwMzJfc3luY190YWJsZV8yME1bXSA9IHsKKwl7MHgxLCAgMCwgMHgxOSwgMHgxOSwgU01QTF80ME19LCAgLyogMTAuMCA6IDEwMG5zLCAgNTBucyAqLworCXsweDIsICAwLCAweDFhLCAweDI1LCBTTVBMXzIwTX0sICAvKiAgNi43IDogMTUwbnMsICA1MG5zICovCisJezB4MywgIDEsIDB4MjYsIDB4MzIsIFNNUExfMjBNfSwgIC8qICA1LjAgOiAyMDBucywgMTAwbnMgKi8KKwl7MHg0LCAgMSwgMHgzMywgMHgzZSwgU01QTF8xME19LCAgLyogIDQuMCA6IDI1MG5zLCAxMDBucyAqLworCXsweDUsICAyLCAweDNmLCAweDRiLCBTTVBMXzEwTX0sICAvKiAgMy4zIDogMzAwbnMsIDE1MG5zICovCisJezB4NiwgIDIsIDB4NGMsIDB4NTcsIFNNUExfMTBNfSwgIC8qICAyLjggOiAzNTBucywgMTUwbnMgKi8KKwl7MHg3LCAgMywgMHg1OCwgMHg2NCwgU01QTF8xME19LCAgLyogIDIuNSA6IDQwMG5zLCAyMDBucyAqLworCXsweDgsICAzLCAweDY1LCAweDcwLCBTTVBMXzEwTX0sICAvKiAgMi4yIDogNDUwbnMsIDIwMG5zICovCisJezB4OSwgIDMsIDB4NzEsIDB4N2QsIFNNUExfMTBNfSwgIC8qICAyLjAgOiA1MDBucywgMjAwbnMgKi8KK307CisKK3N0YXRpYyBuc3AzMl9zeW5jX3RhYmxlIG5zcDMyX3N5bmNfdGFibGVfcGNpW10gPSB7CisJezB4MSwgIDAsIDB4MGMsIDB4MGYsIFNNUExfNDBNfSwgIC8qIDE2LjYgOiAgNjBucywgIDMwbnMgKi8KKwl7MHgyLCAgMCwgMHgxMCwgMHgxNiwgU01QTF80ME19LCAgLyogMTEuMSA6ICA5MG5zLCAgMzBucyAqLworCXsweDMsICAxLCAweDE3LCAweDFlLCBTTVBMXzIwTX0sICAvKiAgOC4zIDogMTIwbnMsICA2MG5zICovCisJezB4NCwgIDEsIDB4MWYsIDB4MjUsIFNNUExfMjBNfSwgIC8qICA2LjcgOiAxNTBucywgIDYwbnMgKi8KKwl7MHg1LCAgMiwgMHgyNiwgMHgyZCwgU01QTF8yME19LCAgLyogIDUuNiA6IDE4MG5zLCAgOTBucyAqLworCXsweDYsICAyLCAweDJlLCAweDM0LCBTTVBMXzEwTX0sICAvKiAgNC44IDogMjEwbnMsICA5MG5zICovCisJezB4NywgIDMsIDB4MzUsIDB4M2MsIFNNUExfMTBNfSwgIC8qICA0LjIgOiAyNDBucywgMTIwbnMgKi8KKwl7MHg4LCAgMywgMHgzZCwgMHg0MywgU01QTF8xME19LCAgLyogIDMuNyA6IDI3MG5zLCAxMjBucyAqLworCXsweDksICAzLCAweDQ0LCAweDRiLCBTTVBMXzEwTX0sICAvKiAgMy4zIDogMzAwbnMsIDEyMG5zICovCit9OworCisvKgorICogZnVuY3Rpb24gZGVjbGFyYXRpb24KKyAqLworLyogbW9kdWxlIGVudHJ5IHBvaW50ICovCitzdGF0aWMgaW50ICBfX2RldmluaXQgbnNwMzJfcHJvYmUgKHN0cnVjdCBwY2lfZGV2ICosIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICopOworc3RhdGljIHZvaWQgX19kZXZleGl0IG5zcDMyX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqKTsKK3N0YXRpYyBpbnQgIF9faW5pdCAgICBpbml0X25zcDMyICAodm9pZCk7CitzdGF0aWMgdm9pZCBfX2V4aXQgICAgZXhpdF9uc3AzMiAgKHZvaWQpOworCisvKiBzdHJ1Y3QgU2NzaV9Ib3N0X1RlbXBsYXRlICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw3MykpCitzdGF0aWMgaW50ICAgICAgICAgbnNwMzJfcHJvY19pbmZvICAgKHN0cnVjdCBTY3NpX0hvc3QgKiwgY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQpOworI2Vsc2UKK3N0YXRpYyBpbnQgICAgICAgICBuc3AzMl9wcm9jX2luZm8gICAoY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQsIGludCk7CisjZW5kaWYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNzMpKQorc3RhdGljIGludCAgICAgICAgIG5zcDMyX2RldGVjdCAgICAgIChzdHJ1Y3QgcGNpX2RldiAqcGRldik7CisjZWxzZQorc3RhdGljIGludCAgICAgICAgIG5zcDMyX2RldGVjdCAgICAgIChTY3NpX0hvc3RfVGVtcGxhdGUgKik7CisjZW5kaWYKK3N0YXRpYyBpbnQgICAgICAgICBuc3AzMl9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqLAorCQl2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSk7CitzdGF0aWMgY29uc3QgY2hhciAqbnNwMzJfaW5mbyAgICAgICAgKHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgaW50ICAgICAgICAgbnNwMzJfcmVsZWFzZSAgICAgKHN0cnVjdCBTY3NpX0hvc3QgKik7CisKKy8qIFNDU0kgZXJyb3IgaGFuZGxlciAqLworc3RhdGljIGludCAgICAgICAgIG5zcDMyX2VoX2Fib3J0ICAgICAoc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyBpbnQgICAgICAgICBuc3AzMl9laF9idXNfcmVzZXQgKHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgaW50ICAgICAgICAgbnNwMzJfZWhfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICopOworCisvKiBnZW5lcmF0ZSBTQ1NJIG1lc3NhZ2UgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX2J1aWxkX2lkZW50aWZ5KHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgdm9pZCBuc3AzMl9idWlsZF9ub3AgICAgIChzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIHZvaWQgbnNwMzJfYnVpbGRfcmVqZWN0ICAoc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyB2b2lkIG5zcDMyX2J1aWxkX3NkdHIgICAgKHN0cnVjdCBzY3NpX2NtbmQgKiwgdW5zaWduZWQgY2hhciwgdW5zaWduZWQgY2hhcik7CisKKy8qIFNDU0kgbWVzc2FnZSBoYW5kbGVyICovCitzdGF0aWMgaW50ICBuc3AzMl9idXNmcmVlX29jY3VyKHN0cnVjdCBzY3NpX2NtbmQgKiwgdW5zaWduZWQgc2hvcnQpOworc3RhdGljIHZvaWQgbnNwMzJfbXNnb3V0X29jY3VyIChzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIHZvaWQgbnNwMzJfbXNnaW5fb2NjdXIgIChzdHJ1Y3Qgc2NzaV9jbW5kICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIHNob3J0KTsKKworc3RhdGljIGludCAgbnNwMzJfc2V0dXBfc2dfdGFibGUgICAgKHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgaW50ICBuc3AzMl9zZWxlY3Rpb25fYXV0b3BhcmEoc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyBpbnQgIG5zcDMyX3NlbGVjdGlvbl9hdXRvc2NzaShzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIHZvaWQgbnNwMzJfc2NzaV9kb25lICAgICAgICAgKHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgaW50ICBuc3AzMl9hcmJpdHJhdGlvbiAgICAgICAoc3RydWN0IHNjc2lfY21uZCAqLCB1bnNpZ25lZCBpbnQpOworc3RhdGljIGludCAgbnNwMzJfcmVzZWxlY3Rpb24gICAgICAgKHN0cnVjdCBzY3NpX2NtbmQgKiwgdW5zaWduZWQgY2hhcik7CitzdGF0aWMgdm9pZCBuc3AzMl9hZGp1c3RfYnVzZnJlZSAgICAoc3RydWN0IHNjc2lfY21uZCAqLCB1bnNpZ25lZCBpbnQpOworc3RhdGljIHZvaWQgbnNwMzJfcmVzdGFydF9hdXRvc2NzaSAgKHN0cnVjdCBzY3NpX2NtbmQgKiwgdW5zaWduZWQgc2hvcnQpOworCisvKiBTQ1NJIFNEVFIgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX2FuYWx5emVfc2R0ciAgICAgICAoc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyBpbnQgIG5zcDMyX3NlYXJjaF9wZXJpb2RfZW50cnkobnNwMzJfaHdfZGF0YSAqLCBuc3AzMl90YXJnZXQgKiwgdW5zaWduZWQgY2hhcik7CitzdGF0aWMgdm9pZCBuc3AzMl9zZXRfYXN5bmMgICAgICAgICAgKG5zcDMyX2h3X2RhdGEgKiwgbnNwMzJfdGFyZ2V0ICopOworc3RhdGljIHZvaWQgbnNwMzJfc2V0X21heF9zeW5jICAgICAgIChuc3AzMl9od19kYXRhICosIG5zcDMyX3RhcmdldCAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKik7CitzdGF0aWMgdm9pZCBuc3AzMl9zZXRfc3luY19lbnRyeSAgICAgKG5zcDMyX2h3X2RhdGEgKiwgbnNwMzJfdGFyZ2V0ICosIGludCwgdW5zaWduZWQgY2hhcik7CisKKy8qIFNDU0kgYnVzIHN0YXR1cyBoYW5kbGVyICovCitzdGF0aWMgdm9pZCBuc3AzMl93YWl0X3JlcSAgICAobnNwMzJfaHdfZGF0YSAqLCBpbnQpOworc3RhdGljIHZvaWQgbnNwMzJfd2FpdF9zYWNrICAgKG5zcDMyX2h3X2RhdGEgKiwgaW50KTsKK3N0YXRpYyB2b2lkIG5zcDMyX3NhY2tfYXNzZXJ0IChuc3AzMl9od19kYXRhICopOworc3RhdGljIHZvaWQgbnNwMzJfc2Fja19uZWdhdGUgKG5zcDMyX2h3X2RhdGEgKik7CitzdGF0aWMgdm9pZCBuc3AzMl9kb19idXNfcmVzZXQobnNwMzJfaHdfZGF0YSAqKTsKKworLyogaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBkb19uc3AzMl9pc3IoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworCisvKiBpbml0aWFsaXplIGhhcmR3YXJlICovCitzdGF0aWMgaW50ICBuc3AzMmh3X2luaXQobnNwMzJfaHdfZGF0YSAqKTsKKworLyogRUVQUk9NIGhhbmRsZXIgKi8KK3N0YXRpYyAgICAgICAgaW50ICBuc3AzMl9nZXRwcm9tX3BhcmFtIChuc3AzMl9od19kYXRhICopOworc3RhdGljICAgICAgICBpbnQgIG5zcDMyX2dldHByb21fYXQyNCAgKG5zcDMyX2h3X2RhdGEgKik7CitzdGF0aWMgICAgICAgIGludCAgbnNwMzJfZ2V0cHJvbV9jMTYgICAobnNwMzJfaHdfZGF0YSAqKTsKK3N0YXRpYyAgICAgICAgdm9pZCBuc3AzMl9wcm9tX3N0YXJ0ICAgIChuc3AzMl9od19kYXRhICopOworc3RhdGljICAgICAgICB2b2lkIG5zcDMyX3Byb21fc3RvcCAgICAgKG5zcDMyX2h3X2RhdGEgKik7CitzdGF0aWMgICAgICAgIGludCAgbnNwMzJfcHJvbV9yZWFkICAgICAobnNwMzJfaHdfZGF0YSAqLCBpbnQpOworc3RhdGljICAgICAgICBpbnQgIG5zcDMyX3Byb21fcmVhZF9iaXQgKG5zcDMyX2h3X2RhdGEgKik7CitzdGF0aWMgICAgICAgIHZvaWQgbnNwMzJfcHJvbV93cml0ZV9iaXQobnNwMzJfaHdfZGF0YSAqLCBpbnQpOworc3RhdGljICAgICAgICB2b2lkIG5zcDMyX3Byb21fc2V0ICAgICAgKG5zcDMyX2h3X2RhdGEgKiwgaW50LCBpbnQpOworc3RhdGljICAgICAgICBpbnQgIG5zcDMyX3Byb21fZ2V0ICAgICAgKG5zcDMyX2h3X2RhdGEgKiwgaW50KTsKKworLyogZGVidWcvd2FybmluZy9pbmZvIG1lc3NhZ2UgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX21lc3NhZ2UgKGNvbnN0IGNoYXIgKiwgaW50LCBjaGFyICosIGNoYXIgKiwgLi4uKTsKKyNpZmRlZiBOU1AzMl9ERUJVRworc3RhdGljIHZvaWQgbnNwMzJfZG1lc3NhZ2UoY29uc3QgY2hhciAqLCBpbnQsIGludCwgICAgY2hhciAqLCAuLi4pOworI2VuZGlmCisKKy8qCisgKiBtYXhfc2VjdG9ycyBpcyBjdXJyZW50bHkgbGltaXRlZCB1cCB0byAxMjguCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIG5zcDMyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCQk9ICJuc3AzMiIsCisJLm5hbWUJCQkJPSAiV29ya2JpdCBOaW5qYVNDU0ktMzJCaS9VREUiLAorCS5wcm9jX2luZm8JCQk9IG5zcDMyX3Byb2NfaW5mbywKKwkuaW5mbwkJCQk9IG5zcDMyX2luZm8sCisJLnF1ZXVlY29tbWFuZAkJCT0gbnNwMzJfcXVldWVjb21tYW5kLAorCS5jYW5fcXVldWUJCQk9IDEsCisJLnNnX3RhYmxlc2l6ZQkJCT0gTlNQMzJfU0dfU0laRSwKKwkubWF4X3NlY3RvcnMJCQk9IDEyOCwKKwkuY21kX3Blcl9sdW4JCQk9IDEsCisJLnRoaXNfaWQJCQk9IE5TUDMyX0hPU1RfU0NTSUlELAorCS51c2VfY2x1c3RlcmluZwkJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorCS5laF9hYm9ydF9oYW5kbGVyICAgICAgIAk9IG5zcDMyX2VoX2Fib3J0LAorLyoJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyCT0gTlVMTCwgKi8KKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJCT0gbnNwMzJfZWhfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJCT0gbnNwMzJfZWhfaG9zdF9yZXNldCwKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDc0KSkKKwkuZGV0ZWN0CQkJCT0gbnNwMzJfZGV0ZWN0LAorCS5yZWxlYXNlCQkJPSBuc3AzMl9yZWxlYXNlLAorI2VuZGlmCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwyKSkKKwkudXNlX25ld19laF9jb2RlICAgICAgICAJPSAxLAorI2Vsc2UKKy8qCS5oaWdobWVtX2lvCQkJPSAxLCAqLworI2VuZGlmCit9OworCisjaW5jbHVkZSAibnNwMzJfaW8uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBkZWJ1ZywgZXJyb3IgcHJpbnQKKyAqLworI2lmbmRlZiBOU1AzMl9ERUJVRworIyBkZWZpbmUgTlNQMzJfREVCVUdfTUFTSwkgICAgICAweDAwMDAwMAorIyBkZWZpbmUgbnNwMzJfbXNnKHR5cGUsIGFyZ3MuLi4pICAgICBuc3AzMl9tZXNzYWdlICgiIiwgMCwgKHR5cGUpLCBhcmdzKQorIyBkZWZpbmUgbnNwMzJfZGJnKG1hc2ssIGFyZ3MuLi4pICAgICAvKiAqLworI2Vsc2UKKyMgZGVmaW5lIE5TUDMyX0RFQlVHX01BU0sJICAgICAgMHhmZmZmZmYKKyMgZGVmaW5lIG5zcDMyX21zZyh0eXBlLCBhcmdzLi4uKSBcCisJbnNwMzJfbWVzc2FnZSAoX19GVU5DVElPTl9fLCBfX0xJTkVfXywgKHR5cGUpLCBhcmdzKQorIyBkZWZpbmUgbnNwMzJfZGJnKG1hc2ssIGFyZ3MuLi4pIFwKKwluc3AzMl9kbWVzc2FnZShfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAobWFzayksIGFyZ3MpCisjZW5kaWYKKworI2RlZmluZSBOU1AzMl9ERUJVR19RVUVVRUNPTU1BTkQJQklUKDApCisjZGVmaW5lIE5TUDMyX0RFQlVHX1JFR0lTVEVSCQlCSVQoMSkKKyNkZWZpbmUgTlNQMzJfREVCVUdfQVVUT1NDU0kJCUJJVCgyKQorI2RlZmluZSBOU1AzMl9ERUJVR19JTlRSCQlCSVQoMykKKyNkZWZpbmUgTlNQMzJfREVCVUdfU0dMSVNUCQlCSVQoNCkKKyNkZWZpbmUgTlNQMzJfREVCVUdfQlVTRlJFRQkJQklUKDUpCisjZGVmaW5lIE5TUDMyX0RFQlVHX0NEQl9DT05URU5UUwlCSVQoNikKKyNkZWZpbmUgTlNQMzJfREVCVUdfUkVTRUxFQ1RJT04JCUJJVCg3KQorI2RlZmluZSBOU1AzMl9ERUJVR19NU0dJTk9DQ1VSCQlCSVQoOCkKKyNkZWZpbmUgTlNQMzJfREVCVUdfRUVQUk9NCQlCSVQoOSkKKyNkZWZpbmUgTlNQMzJfREVCVUdfTVNHT1VUT0NDVVIJCUJJVCgxMCkKKyNkZWZpbmUgTlNQMzJfREVCVUdfQlVTUkVTRVQJCUJJVCgxMSkKKyNkZWZpbmUgTlNQMzJfREVCVUdfUkVTVEFSVAkJQklUKDEyKQorI2RlZmluZSBOU1AzMl9ERUJVR19TWU5DCQlCSVQoMTMpCisjZGVmaW5lIE5TUDMyX0RFQlVHX1dBSVQJCUJJVCgxNCkKKyNkZWZpbmUgTlNQMzJfREVCVUdfVEFSR0VURkxBRwkJQklUKDE1KQorI2RlZmluZSBOU1AzMl9ERUJVR19QUk9DCQlCSVQoMTYpCisjZGVmaW5lIE5TUDMyX0RFQlVHX0lOSVQJCUJJVCgxNykKKyNkZWZpbmUgTlNQMzJfU1BFQ0lBTF9QUklOVF9SRUdJU1RFUglCSVQoMjApCisKKyNkZWZpbmUgTlNQMzJfREVCVUdfQlVGX0xFTgkJMTAwCisKK3N0YXRpYyB2b2lkIG5zcDMyX21lc3NhZ2UoY29uc3QgY2hhciAqZnVuYywgaW50IGxpbmUsIGNoYXIgKnR5cGUsIGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwljaGFyIGJ1ZltOU1AzMl9ERUJVR19CVUZfTEVOXTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisjaWZuZGVmIE5TUDMyX0RFQlVHCisJcHJpbnRrKCIlc25zcDMyOiAlc1xuIiwgdHlwZSwgYnVmKTsKKyNlbHNlCisJcHJpbnRrKCIlc25zcDMyOiAlcyAoJWQpOiAlc1xuIiwgdHlwZSwgZnVuYywgbGluZSwgYnVmKTsKKyNlbmRpZgorfQorCisjaWZkZWYgTlNQMzJfREVCVUcKK3N0YXRpYyB2b2lkIG5zcDMyX2RtZXNzYWdlKGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lLCBpbnQgbWFzaywgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWNoYXIgYnVmW05TUDMyX0RFQlVHX0JVRl9MRU5dOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwl2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwlpZiAobWFzayAmIE5TUDMyX0RFQlVHX01BU0spIHsKKwkJcHJpbnRrKCJuc3AzMi1kZWJ1ZzogMHgleCAlcyAoJWQpOiAlc1xuIiwgbWFzaywgZnVuYywgbGluZSwgYnVmKTsKKwl9Cit9CisjZW5kaWYKKworI2lmZGVmIE5TUDMyX0RFQlVHCisjIGluY2x1ZGUgIm5zcDMyX2RlYnVnLmMiCisjZWxzZQorIyBkZWZpbmUgc2hvd19jb21tYW5kKGFyZykgICAvKiAqLworIyBkZWZpbmUgc2hvd19idXNwaGFzZShhcmcpICAvKiAqLworIyBkZWZpbmUgc2hvd19hdXRvcGhhc2UoYXJnKSAvKiAqLworI2VuZGlmCisKKy8qCisgKiBJREVOVElGWSBNZXNzYWdlCisgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX2J1aWxkX2lkZW50aWZ5KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCW5zcDMyX2h3X2RhdGEgKmRhdGEgPSAobnNwMzJfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWludCBwb3MgICAgICAgICAgICAgPSBkYXRhLT5tc2dvdXRfbGVuOworCWludCBtb2RlICAgICAgICAgICAgPSBGQUxTRTsKKworCS8qIFhYWDogQXV0byBEaXNjUHJpdiBkZXRlY3Rpb24gaXMgcHJvZ3Jlc3NpbmcuLi4gKi8KKwlpZiAoZGlzY19wcml2ID09IDApIHsKKwkJLyogbW9kZSA9IFRSVUU7ICovCisJfQorCisJZGF0YS0+bXNnb3V0YnVmW3Bvc10gPSBJREVOVElGWShtb2RlLCBTQ3BudC0+ZGV2aWNlLT5sdW4pOyBwb3MrKzsKKworCWRhdGEtPm1zZ291dF9sZW4gPSBwb3M7Cit9CisKKy8qCisgKiBTRFRSIE1lc3NhZ2UgUm91dGluZQorICovCitzdGF0aWMgdm9pZCBuc3AzMl9idWlsZF9zZHRyKHN0cnVjdCBzY3NpX2NtbmQgICAgKlNDcG50LAorCQkJICAgICB1bnNpZ25lZCBjaGFyIHBlcmlvZCwKKwkJCSAgICAgdW5zaWduZWQgY2hhciBvZmZzZXQpCit7CisJbnNwMzJfaHdfZGF0YSAqZGF0YSA9IChuc3AzMl9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJaW50IHBvcyAgICAgICAgICAgICA9IGRhdGEtPm1zZ291dF9sZW47CisKKwlkYXRhLT5tc2dvdXRidWZbcG9zXSA9IEVYVEVOREVEX01FU1NBR0U7ICBwb3MrKzsKKwlkYXRhLT5tc2dvdXRidWZbcG9zXSA9IEVYVEVOREVEX1NEVFJfTEVOOyBwb3MrKzsKKwlkYXRhLT5tc2dvdXRidWZbcG9zXSA9IEVYVEVOREVEX1NEVFI7ICAgICBwb3MrKzsKKwlkYXRhLT5tc2dvdXRidWZbcG9zXSA9IHBlcmlvZDsgICAgICAgICAgICBwb3MrKzsKKwlkYXRhLT5tc2dvdXRidWZbcG9zXSA9IG9mZnNldDsgICAgICAgICAgICBwb3MrKzsKKworCWRhdGEtPm1zZ291dF9sZW4gPSBwb3M7Cit9CisKKy8qCisgKiBObyBPcGVyYXRpb24gTWVzc2FnZQorICovCitzdGF0aWMgdm9pZCBuc3AzMl9idWlsZF9ub3Aoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCit7CisJbnNwMzJfaHdfZGF0YSAqZGF0YSA9IChuc3AzMl9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJaW50ICAgICAgICAgICAgcG9zICA9IGRhdGEtPm1zZ291dF9sZW47CisKKwlpZiAocG9zICE9IDApIHsKKwkJbnNwMzJfbXNnKEtFUk5fV0FSTklORywKKwkJCSAgIlNvbWUgbWVzc2FnZXMgYXJlIGFscmVhZHkgY29udGFpbmVkISIpOworCQlyZXR1cm47CisJfQorCisJZGF0YS0+bXNnb3V0YnVmW3Bvc10gPSBOT1A7IHBvcysrOworCWRhdGEtPm1zZ291dF9sZW4gPSBwb3M7Cit9CisKKy8qCisgKiBSZWplY3QgTWVzc2FnZQorICovCitzdGF0aWMgdm9pZCBuc3AzMl9idWlsZF9yZWplY3Qoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCit7CisJbnNwMzJfaHdfZGF0YSAqZGF0YSA9IChuc3AzMl9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJaW50ICAgICAgICAgICAgcG9zICA9IGRhdGEtPm1zZ291dF9sZW47CisKKwlkYXRhLT5tc2dvdXRidWZbcG9zXSA9IE1FU1NBR0VfUkVKRUNUOyBwb3MrKzsKKwlkYXRhLT5tc2dvdXRfbGVuID0gcG9zOworfQorCQorLyoKKyAqIHRpbWVyCisgKi8KKyNpZiAwCitzdGF0aWMgdm9pZCBuc3AzMl9zdGFydF90aW1lcihzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwgaW50IHRpbWUpCit7CisJdW5zaWduZWQgaW50IGJhc2UgPSBTQ3BudC0+aG9zdC0+aW9fcG9ydDsKKworCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19JTlRSLCAidGltZXI9JWQiLCB0aW1lKTsKKworCWlmICh0aW1lICYgKH5USU1FUl9DTlRfTUFTSykpIHsKKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOVFIsICJ0aW1lciBzZXQgb3ZlcmZsb3ciKTsKKwl9CisKKwluc3AzMl93cml0ZTIoYmFzZSwgVElNRVJfU0VULCB0aW1lICYgVElNRVJfQ05UX01BU0spOworfQorI2VuZGlmCisKKworLyoKKyAqIHNldCBTQ1NJIGNvbW1hbmQgYW5kIG90aGVyIHBhcmFtZXRlciB0byBhc2ljLCBhbmQgc3RhcnQgc2VsZWN0aW9uIHBoYXNlCisgKi8KK3N0YXRpYyBpbnQgbnNwMzJfc2VsZWN0aW9uX2F1dG9wYXJhKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCW5zcDMyX2h3X2RhdGEgICpkYXRhID0gKG5zcDMyX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBpbnQJYmFzZSAgICA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisJdW5zaWduZWQgaW50CWhvc3RfaWQgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT50aGlzX2lkOworCXVuc2lnbmVkIGNoYXIJdGFyZ2V0ICA9IFNDcG50LT5kZXZpY2UtPmlkOworCW5zcDMyX2F1dG9wYXJhbSAqcGFyYW0gID0gZGF0YS0+YXV0b3BhcmFtOworCXVuc2lnbmVkIGNoYXIJcGhhc2U7CisJaW50CQlpLCByZXQ7CisJdW5zaWduZWQgaW50CW1zZ291dDsKKwl1MTZfbGUJICAgICAgICBzOworCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0FVVE9TQ1NJLCAiaW4iKTsKKworCS8qCisJICogY2hlY2sgYnVzIGZyZWUKKwkgKi8KKwlwaGFzZSA9IG5zcDMyX3JlYWQxKGJhc2UsIFNDU0lfQlVTX01PTklUT1IpOworCWlmIChwaGFzZSAhPSBCVVNNT05fQlVTX0ZSRUUpIHsKKwkJbnNwMzJfbXNnKEtFUk5fV0FSTklORywgImJ1cyBidXN5Iik7CisJCXNob3dfYnVzcGhhc2UocGhhc2UgJiBCVVNNT05fUEhBU0VfTUFTSyk7CisJCVNDcG50LT5yZXN1bHQgPSBESURfQlVTX0JVU1kgPDwgMTY7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvKgorCSAqIG1lc3NhZ2Ugb3V0CisJICoKKwkgKiBOb3RlOiBJZiB0aGUgcmFuZ2Ugb2YgbXNnb3V0X2xlbiBpcyAxIC0gMywgZmlsbCBzY3NpX21zZ291dC4KKwkgKiAgICAgICBvdmVyIDMgbWVzc2FnZXMgbmVlZHMgYW5vdGhlciByb3V0aW5lLgorCSAqLworCWlmIChkYXRhLT5tc2dvdXRfbGVuID09IDApIHsKKwkJbnNwMzJfbXNnKEtFUk5fRVJSLCAiU0NTSSBNc2dPdXQgd2l0aG91dCBhbnkgbWVzc2FnZSEiKTsKKwkJU0NwbnQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJcmV0dXJuIEZBTFNFOworCX0gZWxzZSBpZiAoZGF0YS0+bXNnb3V0X2xlbiA+IDAgJiYgZGF0YS0+bXNnb3V0X2xlbiA8PSAzKSB7CisJCW1zZ291dCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5tc2dvdXRfbGVuOyBpKyspIHsKKwkJCS8qCisJCQkgKiB0aGUgc2VuZGluZyBvcmRlciBvZiB0aGUgbWVzc2FnZSBpczoKKwkJCSAqICBNQ05UIDM6IE1TRyMwIC0+IE1TRyMxIC0+IE1TRyMyCisJCQkgKiAgTUNOVCAyOiAgICAgICAgICBNU0cjMSAtPiBNU0cjMgorCQkJICogIE1DTlQgMTogICAgICAgICAgICAgICAgICAgTVNHIzIgICAgCisJCQkgKi8KKwkJCW1zZ291dCA+Pj0gODsKKwkJCW1zZ291dCB8PSAoKHVuc2lnbmVkIGludCkoZGF0YS0+bXNnb3V0YnVmW2ldKSA8PCAyNCk7CisJCX0KKwkJbXNnb3V0IHw9IE1WX1ZBTElEOwkvKiBNViB2YWxpZCAqLworCQltc2dvdXQgfD0gKHVuc2lnbmVkIGludClkYXRhLT5tc2dvdXRfbGVuOyAvKiBsZW4gKi8KKwl9IGVsc2UgeworCQkvKiBkYXRhLT5tc2dvdXRfbGVuID4gMyAqLworCQltc2dvdXQgPSAwOworCX0KKworCS8vIG5zcF9kYmcoTlNQMzJfREVCVUdfQVVUT1NDU0ksICJzZWwgdGltZSBvdXQ9MHgleFxuIiwgbnNwMzJfcmVhZDIoYmFzZSwgU0VMX1RJTUVfT1VUKSk7CisJLy8gbnNwMzJfd3JpdGUyKGJhc2UsIFNFTF9USU1FX09VVCwgICBTRUxfVElNRU9VVF9USU1FKTsKKworCS8qCisJICogc2V0dXAgYXNpYyBwYXJhbWV0ZXIKKwkgKi8KKwltZW1zZXQocGFyYW0sIDAsIHNpemVvZihuc3AzMl9hdXRvcGFyYW0pKTsKKworCS8qIGNkYiAqLworCWZvciAoaSA9IDA7IGkgPCBTQ3BudC0+Y21kX2xlbjsgaSsrKSB7CisJCXBhcmFtLT5jZGJbNCAqIGldID0gU0NwbnQtPmNtbmRbaV07CisJfQorCisJLyogb3V0Z29pbmcgbWVzc2FnZXMgKi8KKwlwYXJhbS0+bXNnb3V0ID0gY3B1X3RvX2xlMzIobXNnb3V0KTsKKworCS8qIHN5bmNyZWcsIGFja3dpZHRoLCB0YXJnZXQgaWQsIFNSRVEgc2FtcGxpbmcgcmF0ZSAqLworCXBhcmFtLT5zeW5jcmVnICAgID0gZGF0YS0+Y3VyX3RhcmdldC0+c3luY3JlZzsKKwlwYXJhbS0+YWNrd2lkdGggICA9IGRhdGEtPmN1cl90YXJnZXQtPmFja3dpZHRoOworCXBhcmFtLT50YXJnZXRfaWQgID0gQklUKGhvc3RfaWQpIHwgQklUKHRhcmdldCk7CisJcGFyYW0tPnNhbXBsZV9yZWcgPSBkYXRhLT5jdXJfdGFyZ2V0LT5zYW1wbGVfcmVnOworCisJLy8gbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0FVVE9TQ1NJLCAic2FtcGxlIHJhdGU9MHgleFxuIiwgZGF0YS0+Y3VyX3RhcmdldC0+c2FtcGxlX3JlZyk7CisKKwkvKiBjb21tYW5kIGNvbnRyb2wgKi8KKwlwYXJhbS0+Y29tbWFuZF9jb250cm9sID0gY3B1X3RvX2xlMTYoQ0xFQVJfQ0RCX0ZJRk9fUE9JTlRFUiB8CisJCQkJCSAgICAgQVVUT1NDU0lfU1RBUlQgICAgICAgICB8CisJCQkJCSAgICAgQVVUT19NU0dJTl8wMF9PUl8wNCAgICB8CisJCQkJCSAgICAgQVVUT19NU0dJTl8wMiAgICAgICAgICB8CisJCQkJCSAgICAgQVVUT19BVE4gICAgICAgICAgICAgICApOworCisKKwkvKiB0cmFuc2ZlciBjb250cm9sICovCisJcyA9IDA7CisJc3dpdGNoIChkYXRhLT50cmFuc19tZXRob2QpIHsKKwljYXNlIE5TUDMyX1RSQU5TRkVSX0JVU01BU1RFUjoKKwkJcyB8PSBCTV9TVEFSVDsKKwkJYnJlYWs7CisJY2FzZSBOU1AzMl9UUkFOU0ZFUl9NTUlPOgorCQlzIHw9IENCX01NSU9fTU9ERTsKKwkJYnJlYWs7CisJY2FzZSBOU1AzMl9UUkFOU0ZFUl9QSU86CisJCXMgfD0gQ0JfSU9fTU9ERTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbnNwMzJfbXNnKEtFUk5fRVJSLCAidW5rbm93biB0cmFuc19tZXRob2QiKTsKKwkJYnJlYWs7CisJfQorCS8qCisJICogT1ItZWQgQkxJRU5EX01PREUsIEZJRk8gaW50ciBpcyBkZWNyZWFzZWQsIGluc3RlYWQgb2YgUENJIGJ1cyB3YWl0cy4KKwkgKiBGb3IgYnVzIG1hc3RlciB0cmFuc2ZlciwgaXQncyB0YWtlbiBvZmYuCisJICovCisJcyB8PSAoVFJBTlNGRVJfR08gfCBBTExfQ09VTlRFUl9DTFIpOworCXBhcmFtLT50cmFuc2Zlcl9jb250cm9sID0gY3B1X3RvX2xlMTYocyk7CisKKwkvKiBzZyB0YWJsZSBhZGRyICovCisJcGFyYW0tPnNndF9wb2ludGVyID0gY3B1X3RvX2xlMzIoZGF0YS0+Y3VyX2x1bnQtPnNnbHVuX3BhZGRyKTsKKworCS8qCisJICogdHJhbnNmZXIgcGFyYW1ldGVyIHRvIEFTSUMKKwkgKi8KKwluc3AzMl93cml0ZTQoYmFzZSwgU0dUX0FEUiwgICAgICAgICBkYXRhLT5hdXRvX3BhZGRyKTsKKwluc3AzMl93cml0ZTIoYmFzZSwgQ09NTUFORF9DT05UUk9MLCBDTEVBUl9DREJfRklGT19QT0lOVEVSIHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVE9fUEFSQU1FVEVSICAgICAgICAgKTsKKworCS8qCisJICogQ2hlY2sgYXJiaXRyYXRpb24KKwkgKi8KKwlyZXQgPSBuc3AzMl9hcmJpdHJhdGlvbihTQ3BudCwgYmFzZSk7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBTZWxlY3Rpb24gd2l0aCBBVVRPIFNDU0kgKHdpdGhvdXQgQVVUTyBQQVJBTUVURVIpCisgKi8KK3N0YXRpYyBpbnQgbnNwMzJfc2VsZWN0aW9uX2F1dG9zY3NpKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCW5zcDMyX2h3X2RhdGEgICpkYXRhID0gKG5zcDMyX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBpbnQJYmFzZSAgICA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisJdW5zaWduZWQgaW50CWhvc3RfaWQgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT50aGlzX2lkOworCXVuc2lnbmVkIGNoYXIJdGFyZ2V0ICA9IFNDcG50LT5kZXZpY2UtPmlkOworCXVuc2lnbmVkIGNoYXIJcGhhc2U7CisJaW50CQlzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQJY29tbWFuZAk9IDA7CisJdW5zaWduZWQgaW50CW1zZ291dCAgPSAwOworCXVuc2lnbmVkIHNob3J0CWV4ZWNwaDsKKwlpbnQJCWk7CisKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfQVVUT1NDU0ksICJpbiIpOworCisJLyoKKwkgKiBJUlEgZGlzYWJsZQorCSAqLworCW5zcDMyX3dyaXRlMihiYXNlLCBJUlFfQ09OVFJPTCwgSVJRX0NPTlRST0xfQUxMX0lSUV9NQVNLKTsKKworCS8qCisJICogY2hlY2sgYnVzIGxpbmUKKwkgKi8KKwlwaGFzZSA9IG5zcDMyX3JlYWQxKGJhc2UsIFNDU0lfQlVTX01PTklUT1IpOworCWlmKCgocGhhc2UgJiBCVVNNT05fQlNZKSA9PSAxKSB8fCAocGhhc2UgJiBCVVNNT05fU0VMKSA9PSAxKSB7CisJCW5zcDMyX21zZyhLRVJOX1dBUk5JTkcsICJidXMgYnVzeSIpOworCQlTQ3BudC0+cmVzdWx0ID0gRElEX0JVU19CVVNZIDw8IDE2OworCQlzdGF0dXMgPSAxOworCQlnb3RvIG91dDsKKyAgICAgICAgfQorCisJLyoKKwkgKiBjbGVhciBleGVjcGgKKwkgKi8KKwlleGVjcGggPSBuc3AzMl9yZWFkMihiYXNlLCBTQ1NJX0VYRUNVVEVfUEhBU0UpOworCisJLyoKKwkgKiBjbGVhciBGSUZPIGNvdW50ZXIgdG8gc2V0IENEQnMKKwkgKi8KKwluc3AzMl93cml0ZTIoYmFzZSwgQ09NTUFORF9DT05UUk9MLCBDTEVBUl9DREJfRklGT19QT0lOVEVSKTsKKworCS8qCisJICogc2V0IENEQjAgLSBDREIxNQorCSAqLworCWZvciAoaSA9IDA7IGkgPCBTQ3BudC0+Y21kX2xlbjsgaSsrKSB7CisJCW5zcDMyX3dyaXRlMShiYXNlLCBDT01NQU5EX0RBVEEsIFNDcG50LT5jbW5kW2ldKTsKKyAgICAgICAgfQorCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19DREJfQ09OVEVOVFMsICJDREJbMF09WzB4JXhdIiwgU0NwbnQtPmNtbmRbMF0pOworCisJLyoKKwkgKiBzZXQgU0NTSU9VVCBMQVRDSChpbml0aWF0b3IpL1RBUkdFVCh0YXJnZXQpIChPUi1lZCkgSUQKKwkgKi8KKwluc3AzMl93cml0ZTEoYmFzZSwgU0NTSV9PVVRfTEFUQ0hfVEFSR0VUX0lELCBCSVQoaG9zdF9pZCkgfCBCSVQodGFyZ2V0KSk7CisKKwkvKgorCSAqIHNldCBTQ1NJIE1TR09VVCBSRUcKKwkgKgorCSAqIE5vdGU6IElmIHRoZSByYW5nZSBvZiBtc2dvdXRfbGVuIGlzIDEgLSAzLCBmaWxsIHNjc2lfbXNnb3V0LgorCSAqICAgICAgIG92ZXIgMyBtZXNzYWdlcyBuZWVkcyBhbm90aGVyIHJvdXRpbmUuCisJICovCisJaWYgKGRhdGEtPm1zZ291dF9sZW4gPT0gMCkgeworCQluc3AzMl9tc2coS0VSTl9FUlIsICJTQ1NJIE1zZ091dCB3aXRob3V0IGFueSBtZXNzYWdlISIpOworCQlTQ3BudC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlzdGF0dXMgPSAxOworCQlnb3RvIG91dDsKKwl9IGVsc2UgaWYgKGRhdGEtPm1zZ291dF9sZW4gPiAwICYmIGRhdGEtPm1zZ291dF9sZW4gPD0gMykgeworCQltc2dvdXQgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bXNnb3V0X2xlbjsgaSsrKSB7CisJCQkvKgorCQkJICogdGhlIHNlbmRpbmcgb3JkZXIgb2YgdGhlIG1lc3NhZ2UgaXM6CisJCQkgKiAgTUNOVCAzOiBNU0cjMCAtPiBNU0cjMSAtPiBNU0cjMgorCQkJICogIE1DTlQgMjogICAgICAgICAgTVNHIzEgLT4gTVNHIzIKKwkJCSAqICBNQ05UIDE6ICAgICAgICAgICAgICAgICAgIE1TRyMyICAgIAorCQkJICovCisJCQltc2dvdXQgPj49IDg7CisJCQltc2dvdXQgfD0gKCh1bnNpZ25lZCBpbnQpKGRhdGEtPm1zZ291dGJ1ZltpXSkgPDwgMjQpOworCQl9CisJCW1zZ291dCB8PSBNVl9WQUxJRDsJLyogTVYgdmFsaWQgKi8KKwkJbXNnb3V0IHw9ICh1bnNpZ25lZCBpbnQpZGF0YS0+bXNnb3V0X2xlbjsgLyogbGVuICovCisJCW5zcDMyX3dyaXRlNChiYXNlLCBTQ1NJX01TR19PVVQsIG1zZ291dCk7CisJfSBlbHNlIHsKKwkJLyogZGF0YS0+bXNnb3V0X2xlbiA+IDMgKi8KKwkJbnNwMzJfd3JpdGU0KGJhc2UsIFNDU0lfTVNHX09VVCwgMCk7CisJfQorCisJLyoKKwkgKiBzZXQgc2VsZWN0aW9uIHRpbWVvdXQoPSAyNTBtcykKKwkgKi8KKwluc3AzMl93cml0ZTIoYmFzZSwgU0VMX1RJTUVfT1VULCAgIFNFTF9USU1FT1VUX1RJTUUpOworCisJLyoKKwkgKiBzZXQgU1JFUSBoYXphcmQga2lsbGVyIHNhbXBsaW5nIHJhdGUKKwkgKiAKKwkgKiBUT0RPOiBzYW1wbGVfcmF0ZSAoQkFTRSswRikgaXMgMCB3aGVuIGludGVybmFsIGNsb2NrID0gNDBNSHouCisJICogICAgICBjaGVjayBvdGhlciBpbnRlcm5hbCBjbG9jayEKKwkgKi8KKwluc3AzMl93cml0ZTEoYmFzZSwgU1JFUV9TTVBMX1JBVEUsIGRhdGEtPmN1cl90YXJnZXQtPnNhbXBsZV9yZWcpOworCisJLyoKKwkgKiBjbGVhciBBcmJpdAorCSAqLworCW5zcDMyX3dyaXRlMShiYXNlLCBTRVRfQVJCSVQsICAgICAgQVJCSVRfQ0xFQVIpOworCisJLyoKKwkgKiBzZXQgU1lOQ1JFRworCSAqIERvbid0IHNldCBCTV9TVEFSVF9BRFIgYmVmb3JlIHNldHRpbmcgdGhpcyByZWdpc3Rlci4KKwkgKi8KKwluc3AzMl93cml0ZTEoYmFzZSwgU1lOQ19SRUcsICBkYXRhLT5jdXJfdGFyZ2V0LT5zeW5jcmVnKTsKKworCS8qCisJICogc2V0IEFDS1dJRFRICisJICovCisJbnNwMzJfd3JpdGUxKGJhc2UsIEFDS19XSURUSCwgZGF0YS0+Y3VyX3RhcmdldC0+YWNrd2lkdGgpOworCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0FVVE9TQ1NJLAorCQkgICJzeW5jcmVnPTB4JXgsIGFja3dpZHRoPTB4JXgsIHNndHBhZGRyPTB4JXgsIGlkPTB4JXgiLAorCQkgIG5zcDMyX3JlYWQxKGJhc2UsIFNZTkNfUkVHKSwgbnNwMzJfcmVhZDEoYmFzZSwgQUNLX1dJRFRIKSwKKwkJICBuc3AzMl9yZWFkNChiYXNlLCBTR1RfQURSKSwgbnNwMzJfcmVhZDEoYmFzZSwgU0NTSV9PVVRfTEFUQ0hfVEFSR0VUX0lEKSk7CisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0FVVE9TQ1NJLCAibXNnb3V0X2xlbj0lZCwgbXNnb3V0PTB4JXgiLAorCQkgIGRhdGEtPm1zZ291dF9sZW4sIG1zZ291dCk7CisKKwkvKgorCSAqIHNldCBTR1QgQUREUiAocGh5c2ljYWwgYWRkcmVzcykKKwkgKi8KKwluc3AzMl93cml0ZTQoYmFzZSwgU0dUX0FEUiwgZGF0YS0+Y3VyX2x1bnQtPnNnbHVuX3BhZGRyKTsKKworCS8qCisJICogc2V0IFRSQU5TRkVSIENPTlRST0wgUkVHCisJICovCisJY29tbWFuZCA9IDA7CisJY29tbWFuZCB8PSAoVFJBTlNGRVJfR08gfCBBTExfQ09VTlRFUl9DTFIpOworCWlmIChkYXRhLT50cmFuc19tZXRob2QgJiBOU1AzMl9UUkFOU0ZFUl9CVVNNQVNURVIpIHsKKwkJaWYgKFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gPiAwKSB7CisJCQljb21tYW5kIHw9IEJNX1NUQVJUOworCQl9CisJfSBlbHNlIGlmIChkYXRhLT50cmFuc19tZXRob2QgJiBOU1AzMl9UUkFOU0ZFUl9NTUlPKSB7CisJCWNvbW1hbmQgfD0gQ0JfTU1JT19NT0RFOworCX0gZWxzZSBpZiAoZGF0YS0+dHJhbnNfbWV0aG9kICYgTlNQMzJfVFJBTlNGRVJfUElPKSB7CisJCWNvbW1hbmQgfD0gQ0JfSU9fTU9ERTsKKwl9CisJbnNwMzJfd3JpdGUyKGJhc2UsIFRSQU5TRkVSX0NPTlRST0wsIGNvbW1hbmQpOworCisJLyoKKwkgKiBzdGFydCBBVVRPIFNDU0ksIGtpY2sgb2ZmIGFyYml0cmF0aW9uCisJICovCisJY29tbWFuZCA9IChDTEVBUl9DREJfRklGT19QT0lOVEVSIHwKKwkJICAgQVVUT1NDU0lfU1RBUlQgICAgICAgICB8CisJCSAgIEFVVE9fTVNHSU5fMDBfT1JfMDQgICAgfAorCQkgICBBVVRPX01TR0lOXzAyICAgICAgICAgIHwKKwkJICAgQVVUT19BVE4gICAgICAgICAgICAgICAgKTsKKwluc3AzMl93cml0ZTIoYmFzZSwgQ09NTUFORF9DT05UUk9MLCBjb21tYW5kKTsKKworCS8qCisJICogQ2hlY2sgYXJiaXRyYXRpb24KKwkgKi8KKwlzdGF0dXMgPSBuc3AzMl9hcmJpdHJhdGlvbihTQ3BudCwgYmFzZSk7CisKKyBvdXQ6CisJLyoKKwkgKiBJUlEgZW5hYmxlCisJICovCisJbnNwMzJfd3JpdGUyKGJhc2UsIElSUV9DT05UUk9MLCAwKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKyAqIEFyYml0cmF0aW9uIFN0YXR1cyBDaGVjaworICoJCisgKiBOb3RlOiBBcmJpdHJhdGlvbiBjb3VudGVyIGlzIHdhaXRlZCBkdXJpbmcgQVJCSVRfR08gaXMgbm90IGxpZnRpbmcuCisgKgkgVXNpbmcgdWRlbGF5KDEpIGNvbnN1bWVzIENQVSB0aW1lIGFuZCBzeXN0ZW0gdGltZSwgYnV0IAorICoJIGFyYml0cmF0aW9uIGRlbGF5IHRpbWUgaXMgZGVmaW5lZCBtaW5pbWFsIDIuNHVzIGluIFNDU0kKKyAqCSBzcGVjaWZpY2F0aW9uLCB0aHVzIHVkZWxheSB3b3JrcyBhcyBjb2Fyc2UgZ3JhaW5lZCB3YWl0IHRpbWVyLgorICovCitzdGF0aWMgaW50IG5zcDMyX2FyYml0cmF0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCB1bnNpZ25lZCBpbnQgYmFzZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGFyYml0OworCWludAkgICAgICBzdGF0dXMgPSBUUlVFOworCWludAkgICAgICB0aW1lICAgPSAwOworCisJZG8geworCQlhcmJpdCA9IG5zcDMyX3JlYWQxKGJhc2UsIEFSQklUX1NUQVRVUyk7CisJCXRpbWUrKzsKKwl9IHdoaWxlICgoYXJiaXQgJiAoQVJCSVRfV0lOIHwgQVJCSVRfRkFJTCkpID09IDAgJiYKKwkJICh0aW1lIDw9IEFSQklUX1RJTUVPVVRfVElNRSkpOworCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0FVVE9TQ1NJLAorCQkgICJhcmJpdDogMHgleCwgZGVsYXkgdGltZTogJWQiLCBhcmJpdCwgdGltZSk7CisKKwlpZiAoYXJiaXQgJiBBUkJJVF9XSU4pIHsKKwkJLyogQXJiaXRyYXRpb24gc3VjY2VlZGVkICovCisJCVNDcG50LT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisJCW5zcDMyX2luZGV4X3dyaXRlMShiYXNlLCBFWFRfUE9SVCwgTEVEX09OKTsgLyogUENJIExFRCBvbiAqLworCX0gZWxzZSBpZiAoYXJiaXQgJiBBUkJJVF9GQUlMKSB7CisJCS8qIEFyYml0cmF0aW9uIGZhaWxlZCAqLworCQlTQ3BudC0+cmVzdWx0ID0gRElEX0JVU19CVVNZIDw8IDE2OworCQlzdGF0dXMgPSBGQUxTRTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiB1bmtub3duIGVycm9yIG9yIEFSQklUX0dPIHRpbWVvdXQsCisJCSAqIHNvbWV0aGluZyBsb2NrIHVwISBndWVzcyBubyBjb25uZWN0aW9uLgorCQkgKi8KKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0FVVE9TQ1NJLCAiYXJiaXQgdGltZW91dCIpOworCQlTQ3BudC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCXN0YXR1cyA9IEZBTFNFOworICAgICAgICB9CisKKwkvKgorCSAqIGNsZWFyIEFyYml0CisJICovCisJbnNwMzJfd3JpdGUxKGJhc2UsIFNFVF9BUkJJVCwgQVJCSVRfQ0xFQVIpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKgorICogcmVzZWxlY3Rpb24KKyAqCisgKiBOb3RlOiBUaGlzIHJlc2VsZWN0aW9uIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gbXNnaW5fb2NjdXIsCisgKgkgcmVzZWxlY3Rpb24gdGFyZ2V0IGlkJmx1biBtdXN0IGJlIGFscmVhZHkgc2V0LgorICoJIFNDU0ktMiBzYXlzIElERU5USUZZIGltcGxpZXMgUkVTVE9SRV9QT0lOVEVSIG9wZXJhdGlvbi4KKyAqLworc3RhdGljIGludCBuc3AzMl9yZXNlbGVjdGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwgdW5zaWduZWQgY2hhciBuZXdsdW4pCit7CisJbnNwMzJfaHdfZGF0YSAqZGF0YSA9IChuc3AzMl9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgaW50ICAgaG9zdF9pZCA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPnRoaXNfaWQ7CisJdW5zaWduZWQgaW50ICAgYmFzZSAgICA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisJdW5zaWduZWQgY2hhciAgdG1waWQsIG5ld2lkOworCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX1JFU0VMRUNUSU9OLCAiZW50ZXIiKTsKKworCS8qCisJICogY2FsY3VsYXRlIHJlc2VsZWN0ZWQgU0NTSSBJRAorCSAqLworCXRtcGlkID0gbnNwMzJfcmVhZDEoYmFzZSwgUkVTRUxFQ1RfSUQpOworCXRtcGlkICY9ICh+QklUKGhvc3RfaWQpKTsKKwluZXdpZCA9IDA7CisJd2hpbGUgKHRtcGlkKSB7CisJCWlmICh0bXBpZCAmIDEpIHsKKwkJCWJyZWFrOworCQl9CisJCXRtcGlkID4+PSAxOworCQluZXdpZCsrOworCX0KKworCS8qCisJICogSWYgcmVzZWxlY3RlZCBOZXcgSUQ6TFVOIGlzIG5vdCBleGlzdGVkCisJICogb3IgY3VycmVudCBuZXh1cyBpcyBub3QgZXhpc3RlZCwgdW5leHBlY3RlZAorCSAqIHJlc2VsZWN0aW9uIGlzIG9jY3VycmVkLiBTZW5kIHJlamVjdCBtZXNzYWdlLgorCSAqLworCWlmIChuZXdpZCA+PSBBUlJBWV9TSVpFKGRhdGEtPmx1bnQpIHx8IG5ld2x1biA+PSBBUlJBWV9TSVpFKGRhdGEtPmx1bnRbMF0pKSB7CisJCW5zcDMyX21zZyhLRVJOX1dBUk5JTkcsICJ1bmtub3duIGlkL2x1biIpOworCQlyZXR1cm4gRkFMU0U7CisJfSBlbHNlIGlmKGRhdGEtPmx1bnRbbmV3aWRdW25ld2x1bl0uU0NwbnQgPT0gTlVMTCkgeworCQluc3AzMl9tc2coS0VSTl9XQVJOSU5HLCAibm8gU0NTSSBjb21tYW5kIGlzIHByb2Nlc3NpbmciKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWRhdGEtPmN1cl9pZCAgICA9IG5ld2lkOworCWRhdGEtPmN1cl9sdW4gICA9IG5ld2x1bjsKKwlkYXRhLT5jdXJfdGFyZ2V0ID0gJihkYXRhLT50YXJnZXRbbmV3aWRdKTsKKwlkYXRhLT5jdXJfbHVudCAgID0gJihkYXRhLT5sdW50W25ld2lkXVtuZXdsdW5dKTsKKworCS8qIHJlc2V0IFNBQ0svU2F2ZWRBQ0sgY291bnRlciAob3IgQUxMIGNsZWFyPykgKi8KKwluc3AzMl93cml0ZTQoYmFzZSwgQ0xSX0NPVU5URVIsIENMUkNPVU5URVJfQUxMTUFTSyk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKgorICogbnNwMzJfc2V0dXBfc2dfdGFibGUgLSBidWlsZCBzY2F0dGVyIGdhdGhlciBsaXN0IGZvciB0cmFuc2ZlciBkYXRhCisgKgkJCSAgICB3aXRoIGJ1cyBtYXN0ZXIuCisgKgorICogTm90ZTogTmluamFTQ1NJLTMyQmkvVURFIGJ1cyBtYXN0ZXIgY2FuIG5vdCB0cmFuc2ZlciBvdmVyIDY0S0IgYXQgYSB0aW1lLgorICovCitzdGF0aWMgaW50IG5zcDMyX3NldHVwX3NnX3RhYmxlKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCW5zcDMyX2h3X2RhdGEgKmRhdGEgPSAobnNwMzJfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBzY2F0dGVybGlzdCAgICpzZ2w7CisJbnNwMzJfc2d0YWJsZSAqc2d0ID0gZGF0YS0+Y3VyX2x1bnQtPnNnbHVuLT5zZ3Q7CisJaW50IG51bSwgaTsKKwl1MzJfbGUgbDsKKworCWlmIChTQ3BudC0+cmVxdWVzdF9idWZmbGVuID09IDApIHsKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJaWYgKHNndCA9PSBOVUxMKSB7CisJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19TR0xJU1QsICJTR1QgPT0gbnVsbCIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKFNDcG50LT51c2Vfc2cpIHsKKwkJc2dsID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKVNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwkJbnVtID0gcGNpX21hcF9zZyhkYXRhLT5QY2ksIHNnbCwgU0NwbnQtPnVzZV9zZywKKwkJCQkgU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCQkvKgorCQkJICogQnVpbGQgbnNwMzJfc2dsaXN0LCBzdWJzdGl0dXRlIHNnIGRtYSBhZGRyZXNzZXMuCisJCQkgKi8KKwkJCXNndFtpXS5hZGRyID0gY3B1X3RvX2xlMzIoc2dfZG1hX2FkZHJlc3Moc2dsKSk7CisJCQlzZ3RbaV0ubGVuICA9IGNwdV90b19sZTMyKHNnX2RtYV9sZW4oc2dsKSk7CisJCQlzZ2wrKzsKKworCQkJaWYgKGxlMzJfdG9fY3B1KHNndFtpXS5sZW4pID4gMHgxMDAwMCkgeworCQkJCW5zcDMyX21zZyhLRVJOX0VSUiwKKwkJCQkJImNhbid0IHRyYW5zZmVyIG92ZXIgNjRLQiBhdCBhIHRpbWUsIHNpemU9MHglbHgiLCBsZTMyX3RvX2NwdShzZ3RbaV0ubGVuKSk7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX1NHTElTVCwKKwkJCQkgICJudW0gMHgleCA6IGFkZHIgMHglbHggbGVuIDB4JWx4IiwKKwkJCQkgIGksCisJCQkJICBsZTMyX3RvX2NwdShzZ3RbaV0uYWRkciksCisJCQkJICBsZTMyX3RvX2NwdShzZ3RbaV0ubGVuICkpOworCQl9CisKKwkJLyogc2V0IGVuZCBtYXJrICovCisJCWwgPSBsZTMyX3RvX2NwdShzZ3RbbnVtLTFdLmxlbik7CisJCXNndFtudW0tMV0ubGVuID0gY3B1X3RvX2xlMzIobCB8IFNHVEVORCk7CisKKwl9IGVsc2UgeworCQlTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbgk9IHBjaV9tYXBfc2luZ2xlKGRhdGEtPlBjaSwKKwkJCVNDcG50LT5yZXF1ZXN0X2J1ZmZlciwgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbik7CisKKwkJc2d0WzBdLmFkZHIgPSBjcHVfdG9fbGUzMihTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbik7CisJCXNndFswXS5sZW4gID0gY3B1X3RvX2xlMzIoU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiB8IFNHVEVORCk7IC8qIHNldCBlbmQgbWFyayAqLworCisJCWlmIChTQ3BudC0+cmVxdWVzdF9idWZmbGVuID4gMHgxMDAwMCkgeworCQkJbnNwMzJfbXNnKEtFUk5fRVJSLAorCQkJCSAgImNhbid0IHRyYW5zZmVyIG92ZXIgNjRLQiBhdCBhIHRpbWUsIHNpemU9MHglbHgiLCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfU0dMSVNULCAic2luZ2xlIDogYWRkciAweCVseCBsZW49MHglbHgiLAorCQkJICBsZTMyX3RvX2NwdShzZ3RbMF0uYWRkciksCisJCQkgIGxlMzJfdG9fY3B1KHNndFswXS5sZW4gKSk7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgbnNwMzJfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwluc3AzMl9od19kYXRhICpkYXRhID0gKG5zcDMyX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwluc3AzMl90YXJnZXQgKnRhcmdldDsKKwluc3AzMl9sdW50ICAgKmN1cl9sdW50OworCWludCByZXQ7CisKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfUVVFVUVDT01NQU5ELAorCQkgICJlbnRlci4gdGFyZ2V0OiAweCV4IExVTjogMHgleCBjbW5kOiAweCV4IGNtbmRsZW46IDB4JXggIgorCQkgICJ1c2Vfc2c6IDB4JXggcmVxYnVmOiAweCVseCByZXFsZW46IDB4JXgiLAorCQkgIFNDcG50LT5kZXZpY2UtPmlkLCBTQ3BudC0+ZGV2aWNlLT5sdW4sIFNDcG50LT5jbW5kWzBdLCBTQ3BudC0+Y21kX2xlbiwKKwkJICBTQ3BudC0+dXNlX3NnLCBTQ3BudC0+cmVxdWVzdF9idWZmZXIsIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4pOworCisJaWYgKGRhdGEtPkN1cnJlbnRTQyAhPSBOVUxMKSB7CisJCW5zcDMyX21zZyhLRVJOX0VSUiwgIkN1cnJlbnRzYyAhPSBOVUxMLiBDYW5jZWwgdGhpcyBjb21tYW5kIHJlcXVlc3QiKTsKKwkJZGF0YS0+Q3VycmVudFNDID0gTlVMTDsKKwkJU0NwbnQtPnJlc3VsdCAgID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCWRvbmUoU0NwbnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBjaGVjayB0YXJnZXQgSUQgaXMgbm90IHNhbWUgYXMgdGhpcyBpbml0aWF0b3IgSUQgKi8KKwlpZiAoU0NwbnQtPmRldmljZS0+aWQgPT0gU0NwbnQtPmRldmljZS0+aG9zdC0+dGhpc19pZCkgeworCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfUVVFVUVDT01NQU5ELCAidGVyZ2V0PT1ob3N0Pz8/Iik7CisJCVNDcG50LT5yZXN1bHQgPSBESURfQkFEX1RBUkdFVCA8PCAxNjsKKwkJZG9uZShTQ3BudCk7CisJCXJldHVybiAwOworCX0KKworCS8qIGNoZWNrIHRhcmdldCBMVU4gaXMgYWxsb3dhYmxlIHZhbHVlICovCisJaWYgKFNDcG50LT5kZXZpY2UtPmx1biA+PSBNQVhfTFVOKSB7CisJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19RVUVVRUNPTU1BTkQsICJubyBtb3JlIGx1biIpOworCQlTQ3BudC0+cmVzdWx0ID0gRElEX0JBRF9UQVJHRVQgPDwgMTY7CisJCWRvbmUoU0NwbnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzaG93X2NvbW1hbmQoU0NwbnQpOworCisJU0NwbnQtPnNjc2lfZG9uZSAgICAgPSBkb25lOworCWRhdGEtPkN1cnJlbnRTQyAgICAgID0gU0NwbnQ7CisJU0NwbnQtPlNDcC5TdGF0dXMgICAgPSBDSEVDS19DT05ESVRJT047CisJU0NwbnQtPlNDcC5NZXNzYWdlICAgPSAwOworCVNDcG50LT5yZXNpZCAgICAgICAgID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKworCVNDcG50LT5TQ3AucHRyCQkgICAgPSAoY2hhciAqKSBTQ3BudC0+cmVxdWVzdF9idWZmZXI7CisJU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsICAgID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKwlTQ3BudC0+U0NwLmJ1ZmZlcgkgICAgPSBOVUxMOworCVNDcG50LT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IDA7CisKKwkvKiBpbml0aWFsaXplIGRhdGEgKi8KKwlkYXRhLT5tc2dvdXRfbGVuCT0gMDsKKwlkYXRhLT5tc2dpbl9sZW4JCT0gMDsKKwljdXJfbHVudAkJPSAmKGRhdGEtPmx1bnRbU0NwbnQtPmRldmljZS0+aWRdW1NDcG50LT5kZXZpY2UtPmx1bl0pOworCWN1cl9sdW50LT5TQ3BudAkJPSBTQ3BudDsKKwljdXJfbHVudC0+c2F2ZV9kYXRwCT0gMDsKKwljdXJfbHVudC0+bXNnaW4wMwk9IEZBTFNFOworCWRhdGEtPmN1cl9sdW50CQk9IGN1cl9sdW50OworCWRhdGEtPmN1cl9pZAkJPSBTQ3BudC0+ZGV2aWNlLT5pZDsKKwlkYXRhLT5jdXJfbHVuCQk9IFNDcG50LT5kZXZpY2UtPmx1bjsKKworCXJldCA9IG5zcDMyX3NldHVwX3NnX3RhYmxlKFNDcG50KTsKKwlpZiAocmV0ID09IEZBTFNFKSB7CisJCW5zcDMyX21zZyhLRVJOX0VSUiwgIlNHVCBmYWlsIik7CisJCVNDcG50LT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCW5zcDMyX3Njc2lfZG9uZShTQ3BudCk7CisJCXJldHVybiAwOworCX0KKworCS8qIEJ1aWxkIElERU5USUZZICovCisJbnNwMzJfYnVpbGRfaWRlbnRpZnkoU0NwbnQpOworCisJLyogCisJICogSWYgdGFyZ2V0IGlzIHRoZSBmaXJzdCB0aW1lIHRvIHRyYW5zZmVyIGFmdGVyIHRoZSByZXNldAorCSAqICh0YXJnZXQgZG9uJ3QgaGF2ZSBTRFRSX0RPTkUgYW5kIFNEVFJfSU5JVElBVE9SKSwgc3luYworCSAqIG1lc3NhZ2UgU0RUUiBpcyBuZWVkZWQgdG8gZG8gc3luY2hyb25vdXMgdHJhbnNmZXIuCisJICovCisJdGFyZ2V0ID0gJmRhdGEtPnRhcmdldFtTQ3BudC0+ZGV2aWNlLT5pZF07CisJZGF0YS0+Y3VyX3RhcmdldCA9IHRhcmdldDsKKworCWlmICghKHRhcmdldC0+c3luY19mbGFnICYgKFNEVFJfRE9ORSB8IFNEVFJfSU5JVElBVE9SIHwgU0RUUl9UQVJHRVQpKSkgeworCQl1bnNpZ25lZCBjaGFyIHBlcmlvZCwgb2Zmc2V0OworCisJCWlmICh0cmFuc19tb2RlICE9IEFTWU5DX01PREUpIHsKKwkJCW5zcDMyX3NldF9tYXhfc3luYyhkYXRhLCB0YXJnZXQsICZwZXJpb2QsICZvZmZzZXQpOworCQkJbnNwMzJfYnVpbGRfc2R0cihTQ3BudCwgcGVyaW9kLCBvZmZzZXQpOworCQkJdGFyZ2V0LT5zeW5jX2ZsYWcgfD0gU0RUUl9JTklUSUFUT1I7CisJCX0gZWxzZSB7CisJCQluc3AzMl9zZXRfYXN5bmMoZGF0YSwgdGFyZ2V0KTsKKwkJCXRhcmdldC0+c3luY19mbGFnIHw9IFNEVFJfRE9ORTsKKwkJfQorCisJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19RVUVVRUNPTU1BTkQsCisJCQkgICJTRFRSOiBlbnRyeTogJWQgc3RhcnRfcGVyaW9kOiAweCV4IG9mZnNldDogMHgleFxuIiwKKwkJCSAgdGFyZ2V0LT5saW1pdF9lbnRyeSwgcGVyaW9kLCBvZmZzZXQpOworCX0gZWxzZSBpZiAodGFyZ2V0LT5zeW5jX2ZsYWcgJiBTRFRSX0lOSVRJQVRPUikgeworCQkvKgorCQkgKiBJdCB3YXMgbmVnb3RpYXRpbmcgU0RUUiB3aXRoIHRhcmdldCwgc2VuZGluZyBmcm9tIHRoZQorCQkgKiBpbml0aWF0b3IsIGJ1dCB0aGVyZSBhcmUgbm8gY2hhbmNlIHRvIHJlbW92ZSB0aGlzIGZsYWcuCisJCSAqIFNldCBhc3luYyBiZWNhdXNlIHdlIGRvbid0IGdldCBwcm9wZXIgbmVnb3RpYXRpb24uCisJCSAqLworCQluc3AzMl9zZXRfYXN5bmMoZGF0YSwgdGFyZ2V0KTsKKwkJdGFyZ2V0LT5zeW5jX2ZsYWcgJj0gflNEVFJfSU5JVElBVE9SOworCQl0YXJnZXQtPnN5bmNfZmxhZyB8PSBTRFRSX0RPTkU7CisKKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX1FVRVVFQ09NTUFORCwKKwkJCSAgIlNEVFJfSU5JVElBVE9SOiBmYWxsIGJhY2sgdG8gYXN5bmMiKTsKKwl9IGVsc2UgaWYgKHRhcmdldC0+c3luY19mbGFnICYgU0RUUl9UQVJHRVQpIHsKKwkJLyoKKwkJICogSXQgd2FzIG5lZ290aWF0aW5nIFNEVFIgd2l0aCB0YXJnZXQsIHNlbmRpbmcgZnJvbSB0YXJnZXQsCisJCSAqIGJ1dCB0aGVyZSBhcmUgbm8gY2hhbmNlIHRvIHJlbW92ZSB0aGlzIGZsYWcuICBTZXQgYXN5bmMKKwkJICogYmVjYXVzZSB3ZSBkb24ndCBnZXQgcHJvcGVyIG5lZ290aWF0aW9uLgorCQkgKi8KKwkJbnNwMzJfc2V0X2FzeW5jKGRhdGEsIHRhcmdldCk7CisJCXRhcmdldC0+c3luY19mbGFnICY9IH5TRFRSX1RBUkdFVDsKKwkJdGFyZ2V0LT5zeW5jX2ZsYWcgfD0gU0RUUl9ET05FOworCisJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19RVUVVRUNPTU1BTkQsCisJCQkgICJVbmtub3duIFNEVFIgZnJvbSB0YXJnZXQgaXMgcmVhY2hlZCwgZmFsbCBiYWNrIHRvIGFzeW5jLiIpOworCX0KKworCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19UQVJHRVRGTEFHLAorCQkgICJ0YXJnZXQ6ICVkIHN5bmNfZmxhZzogMHgleCBzeW5jcmVnOiAweCV4IGFja3dpZHRoOiAweCV4IiwKKwkJICBTQ3BudC0+ZGV2aWNlLT5pZCwgdGFyZ2V0LT5zeW5jX2ZsYWcsIHRhcmdldC0+c3luY3JlZywKKwkJICB0YXJnZXQtPmFja3dpZHRoKTsKKworCS8qIFNlbGVjdGlvbiAqLworCWlmIChhdXRvX3BhcmFtID09IDApIHsKKwkJcmV0ID0gbnNwMzJfc2VsZWN0aW9uX2F1dG9wYXJhKFNDcG50KTsKKwl9IGVsc2UgeworCQlyZXQgPSBuc3AzMl9zZWxlY3Rpb25fYXV0b3Njc2koU0NwbnQpOworCX0KKworCWlmIChyZXQgIT0gVFJVRSkgeworCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfUVVFVUVDT01NQU5ELCAic2VsZWN0aW9uIGZhaWwiKTsKKwkJbnNwMzJfc2NzaV9kb25lKFNDcG50KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogaW5pdGlhbGl6ZSBhc2ljICovCitzdGF0aWMgaW50IG5zcDMyaHdfaW5pdChuc3AzMl9od19kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGludCAgIGJhc2UgPSBkYXRhLT5CYXNlQWRkcmVzczsKKwl1bnNpZ25lZCBzaG9ydCBpcnFfc3RhdDsKKwl1bnNpZ25lZCBsb25nICBsY19yZWc7CisJdW5zaWduZWQgY2hhciAgcG93ZXI7CisKKwlsY19yZWcgPSBuc3AzMl9pbmRleF9yZWFkNChiYXNlLCBDRkdfTEFURV9DQUNIRSk7CisJaWYgKChsY19yZWcgJiAweGZmMDApID09IDApIHsKKwkJbGNfcmVnIHw9ICgweDIwIDw8IDgpOworCQluc3AzMl9pbmRleF93cml0ZTIoYmFzZSwgQ0ZHX0xBVEVfQ0FDSEUsIGxjX3JlZyAmIDB4ZmZmZik7CisJfQorCisJbnNwMzJfd3JpdGUyKGJhc2UsIElSUV9DT05UUk9MLCAgICAgICAgSVJRX0NPTlRST0xfQUxMX0lSUV9NQVNLKTsKKwluc3AzMl93cml0ZTIoYmFzZSwgVFJBTlNGRVJfQ09OVFJPTCwgICAwKTsKKwluc3AzMl93cml0ZTQoYmFzZSwgQk1fQ05ULCAgICAgICAgICAgICAwKTsKKwluc3AzMl93cml0ZTIoYmFzZSwgU0NTSV9FWEVDVVRFX1BIQVNFLCAwKTsKKworCWRvIHsKKwkJaXJxX3N0YXQgPSBuc3AzMl9yZWFkMihiYXNlLCBJUlFfU1RBVFVTKTsKKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOSVQsICJpcnFfc3RhdCAweCV4IiwgaXJxX3N0YXQpOworCX0gd2hpbGUgKGlycV9zdGF0ICYgSVJRU1RBVFVTX0FOWV9JUlEpOworCisJLyoKKwkgKiBGaWxsIEZJRk9fRlVMTF9TSExELCBGSUZPX0VNUFRZX1NITEQuIEJlbG93IHBhcmFtZXRlciBpcworCSAqICBkZXNpZ25hdGVkIGJ5IHNwZWNpZmljYXRpb24uCisJICovCisJaWYgKChkYXRhLT50cmFuc19tZXRob2QgJiBOU1AzMl9UUkFOU0ZFUl9QSU8pIHx8CisJICAgIChkYXRhLT50cmFuc19tZXRob2QgJiBOU1AzMl9UUkFOU0ZFUl9NTUlPKSkgeworCQluc3AzMl9pbmRleF93cml0ZTEoYmFzZSwgRklGT19GVUxMX1NITERfQ09VTlQsICAweDQwKTsKKwkJbnNwMzJfaW5kZXhfd3JpdGUxKGJhc2UsIEZJRk9fRU1QVFlfU0hMRF9DT1VOVCwgMHg0MCk7CisJfSBlbHNlIGlmIChkYXRhLT50cmFuc19tZXRob2QgJiBOU1AzMl9UUkFOU0ZFUl9CVVNNQVNURVIpIHsKKwkJbnNwMzJfaW5kZXhfd3JpdGUxKGJhc2UsIEZJRk9fRlVMTF9TSExEX0NPVU5ULCAgMHgxMCk7CisJCW5zcDMyX2luZGV4X3dyaXRlMShiYXNlLCBGSUZPX0VNUFRZX1NITERfQ09VTlQsIDB4NjApOworCX0gZWxzZSB7CisJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19JTklULCAidW5rbm93biB0cmFuc2ZlciBtb2RlIik7CisJfQorCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOSVQsICJmdWxsIDB4JXggZW1wIDB4JXgiLAorCQkgIG5zcDMyX2luZGV4X3JlYWQxKGJhc2UsIEZJRk9fRlVMTF9TSExEX0NPVU5UKSwKKwkJICBuc3AzMl9pbmRleF9yZWFkMShiYXNlLCBGSUZPX0VNUFRZX1NITERfQ09VTlQpKTsKKworCW5zcDMyX2luZGV4X3dyaXRlMShiYXNlLCBDTE9DS19ESVYsIGRhdGEtPmNsb2NrKTsKKwluc3AzMl9pbmRleF93cml0ZTEoYmFzZSwgQk1fQ1lDTEUsICBNRU1SRF9DTUQxIHwgU0dUX0FVVE9fUEFSQV9NRU1FRF9DTUQpOworCW5zcDMyX3dyaXRlMShiYXNlLCBQQVJJVFlfQ09OVFJPTCwgMCk7CS8qIHBhcml0eSBjaGVjayBpcyBkaXNhYmxlICovCisKKwkvKgorCSAqIGluaXRpYWxpemUgTUlTQ19XUlJEIHJlZ2lzdGVyCisJICogCisJICogTm90ZTogRGVzaWduYXRlZCBwYXJhbWV0ZXJzIGlzIG9iZXllZCBhcyBmb2xsb3dpbmc6CisJICoJTUlTQ19TQ1NJX0RJUkVDVElPTl9ERVRFQ1RPUl9TRUxFQ1Q6IEl0IG11c3QgYmUgc2V0LgorCSAqCU1JU0NfTUFTVEVSX1RFUk1JTkFUSU9OX1NFTEVDVDogICAgICBJdCBtdXN0IGJlIHNldC4KKwkgKglNSVNDX0JNUkVRX05FR0FURV9USU1JTkdfU0VMOgkgICAgIEl0IHNob3VsZCBiZSBzZXQuCisJICoJTUlTQ19BVVRPU0VMX1RJTUlOR19TRUw6CSAgICAgSXQgc2hvdWxkIGJlIHNldC4KKwkgKglNSVNDX0JNU1RPUF9DSEFOR0UyX05PTkRBVEFfUEhBU0U6ICAgSXQgc2hvdWxkIGJlIHNldC4KKwkgKglNSVNDX0RFTEFZRURfQk1TVEFSVDoJCSAgICAgSXQncyBzZWxlY3RlZCBmb3Igc2FmZXR5LgorCSAqCisJICogTm90ZTogSWYgTUlTQ19CTVNUT1BfQ0hBTkdFMl9OT05EQVRBX1BIQVNFIGlzIHNldCwgdGhlbgorCSAqCXdlIGhhdmUgdG8gc2V0IFRSQU5TRkVSQ09OVFJPTF9CTV9TVEFSVCBhcyAwIGFuZCBzZXQKKwkgKglhcHByb3ByaWF0ZSB2YWx1ZSBiZWZvcmUgcmVzdGFydGluZyBidXMgbWFzdGVyIHRyYW5zZmVyLgorCSAqLworCW5zcDMyX2luZGV4X3dyaXRlMihiYXNlLCBNSVNDX1dSLAorCQkJICAgKFNDU0lfRElSRUNUSU9OX0RFVEVDVE9SX1NFTEVDVCB8CisJCQkgICAgREVMQVlFRF9CTVNUQVJUICAgICAgICAgICAgICAgIHwKKwkJCSAgICBNQVNURVJfVEVSTUlOQVRJT05fU0VMRUNUICAgICAgfAorCQkJICAgIEJNUkVRX05FR0FURV9USU1JTkdfU0VMICAgICAgICB8CisJCQkgICAgQVVUT1NFTF9USU1JTkdfU0VMICAgICAgICAgICAgIHwKKwkJCSAgICBCTVNUT1BfQ0hBTkdFMl9OT05EQVRBX1BIQVNFKSk7CisKKwluc3AzMl9pbmRleF93cml0ZTEoYmFzZSwgVEVSTV9QV1JfQ09OVFJPTCwgMCk7CisJcG93ZXIgPSBuc3AzMl9pbmRleF9yZWFkMShiYXNlLCBURVJNX1BXUl9DT05UUk9MKTsKKwlpZiAoIShwb3dlciAmIFNFTlNFKSkgeworCQluc3AzMl9tc2coS0VSTl9JTkZPLCAidGVybSBwb3dlciBvbiIpOworCQluc3AzMl9pbmRleF93cml0ZTEoYmFzZSwgVEVSTV9QV1JfQ09OVFJPTCwgQlBXUik7CisJfQorCisJbnNwMzJfd3JpdGUyKGJhc2UsIFRJTUVSX1NFVCwgVElNRVJfU1RPUCk7CisJbnNwMzJfd3JpdGUyKGJhc2UsIFRJTUVSX1NFVCwgVElNRVJfU1RPUCk7IC8qIFJlcXVpcmVkIDIgdGltZXMgKi8KKworCW5zcDMyX3dyaXRlMShiYXNlLCBTWU5DX1JFRywgICAgIDApOworCW5zcDMyX3dyaXRlMShiYXNlLCBBQ0tfV0lEVEgsICAgIDApOworCW5zcDMyX3dyaXRlMihiYXNlLCBTRUxfVElNRV9PVVQsIFNFTF9USU1FT1VUX1RJTUUpOworCisJLyoKKwkgKiBlbmFibGUgdG8gc2VsZWN0IGRlc2lnbmF0ZWQgSVJRIChleGNlcHQgZm9yCisJICogSVJRU0VMRUNUX1NFUlIsIElSUVNFTEVDVF9QRVJSLCBJUlFTRUxFQ1RfQk1DTlRFUlIpCisJICovCisJbnNwMzJfaW5kZXhfd3JpdGUyKGJhc2UsIElSUV9TRUxFQ1QsIElSUVNFTEVDVF9USU1FUl9JUlEgICAgICAgICB8CisJCQkgICAgICAgICAgICAgICAgICAgICBJUlFTRUxFQ1RfU0NTSVJFU0VUX0lSUSAgICAgfAorCQkJICAgICAgICAgICAgICAgICAgICAgSVJRU0VMRUNUX0ZJRk9fU0hMRF9JUlEgICAgIHwKKwkJCSAgICAgICAgICAgICAgICAgICAgIElSUVNFTEVDVF9SRVNFTEVDVF9JUlEgICAgICB8CisJCQkgICAgICAgICAgICAgICAgICAgICBJUlFTRUxFQ1RfUEhBU0VfQ0hBTkdFX0lSUSAgfAorCQkJICAgICAgICAgICAgICAgICAgICAgSVJRU0VMRUNUX0FVVE9fU0NTSV9TRVFfSVJRIHwKKwkJCSAgICAgICAgICAgICAgICAgIC8vICAgSVJRU0VMRUNUX0JNQ05URVJSX0lSUSAgICAgIHwKKwkJCSAgICAgICAgICAgICAgICAgICAgIElSUVNFTEVDVF9UQVJHRVRfQUJPUlRfSVJRICB8CisJCQkgICAgICAgICAgICAgICAgICAgICBJUlFTRUxFQ1RfTUFTVEVSX0FCT1JUX0lSUSApOworCW5zcDMyX3dyaXRlMihiYXNlLCBJUlFfQ09OVFJPTCwgMCk7CisKKwkvKiBQQ0kgTEVEIG9mZiAqLworCW5zcDMyX2luZGV4X3dyaXRlMShiYXNlLCBFWFRfUE9SVF9ERFIsIExFRF9PRkYpOworCW5zcDMyX2luZGV4X3dyaXRlMShiYXNlLCBFWFRfUE9SVCwgICAgIExFRF9PRkYpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyogaW50ZXJydXB0IHJvdXRpbmUgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBkb19uc3AzMl9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwluc3AzMl9od19kYXRhICpkYXRhID0gZGV2X2lkOworCXVuc2lnbmVkIGludCBiYXNlID0gZGF0YS0+QmFzZUFkZHJlc3M7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwbnQgPSBkYXRhLT5DdXJyZW50U0M7CisJdW5zaWduZWQgc2hvcnQgYXV0b19zdGF0LCBpcnFfc3RhdCwgdHJhbnNfc3RhdDsKKwl1bnNpZ25lZCBjaGFyIGJ1c21vbiwgYnVzcGhhc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCWludCBoYW5kbGVkID0gMDsKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkpCisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGRhdGEtPkhvc3Q7CisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisjZWxzZQorCXNwaW5fbG9ja19pcnFzYXZlKCZpb19yZXF1ZXN0X2xvY2ssIGZsYWdzKTsKKyNlbmRpZgorCisJLyoKKwkgKiBJUlEgY2hlY2ssIHRoZW4gZW5hYmxlIElSUSBtYXNrCisJICovCisJaXJxX3N0YXQgPSBuc3AzMl9yZWFkMihiYXNlLCBJUlFfU1RBVFVTKTsKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfSU5UUiwgCisJCSAgImVudGVyIElSUTogJWQsIElSUXN0YXR1czogMHgleCIsIGlycSwgaXJxX3N0YXQpOworCS8qIGlzIHRoaXMgaW50ZXJydXB0IGNvbWVzIGZyb20gTmluamEgYXNpYz8gKi8KKwlpZiAoKGlycV9zdGF0ICYgSVJRU1RBVFVTX0FOWV9JUlEpID09IDApIHsKKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOVFIsICJzaGFyZWQgaW50ZXJydXB0OiBpcnEgb3RoZXIgMHgleCIsIGlycV9zdGF0KTsKKwkJZ290byBvdXQyOworCX0KKwloYW5kbGVkID0gMTsKKwluc3AzMl93cml0ZTIoYmFzZSwgSVJRX0NPTlRST0wsIElSUV9DT05UUk9MX0FMTF9JUlFfTUFTSyk7CisKKwlidXNtb24gPSBuc3AzMl9yZWFkMShiYXNlLCBTQ1NJX0JVU19NT05JVE9SKTsKKwlidXNwaGFzZSA9IGJ1c21vbiAmIEJVU01PTl9QSEFTRV9NQVNLOworCisJdHJhbnNfc3RhdCA9IG5zcDMyX3JlYWQyKGJhc2UsIFRSQU5TRkVSX1NUQVRVUyk7CisJaWYgKChpcnFfc3RhdCA9PSAweGZmZmYpICYmICh0cmFuc19zdGF0ID09IDB4ZmZmZikpIHsKKwkJbnNwMzJfbXNnKEtFUk5fSU5GTywgImNhcmQgZGlzY29ubmVjdCIpOworCQlpZiAoZGF0YS0+Q3VycmVudFNDICE9IE5VTEwpIHsKKwkJCW5zcDMyX21zZyhLRVJOX0lORk8sICJjbGVhbiB1cCBjdXJyZW50IFNDU0kgY29tbWFuZCIpOworCQkJU0NwbnQtPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2OworCQkJbnNwMzJfc2NzaV9kb25lKFNDcG50KTsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisKKwkvKiBUaW1lciBJUlEgKi8KKwlpZiAoaXJxX3N0YXQgJiBJUlFTVEFUVVNfVElNRVJfSVJRKSB7CisJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19JTlRSLCAidGltZXIgc3RvcCIpOworCQluc3AzMl93cml0ZTIoYmFzZSwgVElNRVJfU0VULCBUSU1FUl9TVE9QKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU0NTSSByZXNldCAqLworCWlmIChpcnFfc3RhdCAmIElSUVNUQVRVU19TQ1NJUkVTRVRfSVJRKSB7CisJCW5zcDMyX21zZyhLRVJOX0lORk8sICJkZXRlY3RlZCBzb21lb25lIGRvIGJ1cyByZXNldCIpOworCQluc3AzMl9kb19idXNfcmVzZXQoZGF0YSk7CisJCWlmIChTQ3BudCAhPSBOVUxMKSB7CisJCQlTQ3BudC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQkJbnNwMzJfc2NzaV9kb25lKFNDcG50KTsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoU0NwbnQgPT0gTlVMTCkgeworCQluc3AzMl9tc2coS0VSTl9XQVJOSU5HLCAiU0NwbnQ9PU5VTEwgdGhpcyBjYW4ndCBiZSBoYXBwZW5lZCIpOworCQluc3AzMl9tc2coS0VSTl9XQVJOSU5HLCAiaXJxX3N0YXQ9MHgleCB0cmFuc19zdGF0PTB4JXgiLCBpcnFfc3RhdCwgdHJhbnNfc3RhdCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogQXV0b1NDU0kgSW50ZXJydXB0LgorCSAqIE5vdGU6IFRoaXMgaW50ZXJydXB0IGlzIG9jY3VycmVkIHdoZW4gQXV0b1NDU0kgaXMgZmluaXNoZWQuICBUaGVuCisJICogY2hlY2sgU0NTSUVYRUNVVEVQSEFTRSwgYW5kIGRvIGFwcHJvcHJpYXRlIGFjdGlvbi4gIEVhY2ggcGhhc2VzIGFyZQorCSAqIHJlY29yZGVkIHdoZW4gQXV0b1NDU0kgc2VxdWVuY2VyIGhhcyBiZWVuIHByb2Nlc3NlZC4KKwkgKi8KKwlpZihpcnFfc3RhdCAmIElSUVNUQVRVU19BVVRPU0NTSV9JUlEpIHsKKwkJLyogZ2V0dGluZyBTQ1NJIGV4ZWN1dGVkIHBoYXNlICovCisJCWF1dG9fc3RhdCA9IG5zcDMyX3JlYWQyKGJhc2UsIFNDU0lfRVhFQ1VURV9QSEFTRSk7CisJCW5zcDMyX3dyaXRlMihiYXNlLCBTQ1NJX0VYRUNVVEVfUEhBU0UsIDApOworCisJCS8qIFNlbGVjdGlvbiBUaW1lb3V0LCBnbyBidXNmcmVlIHBoYXNlLiAqLworCQlpZiAoYXV0b19zdGF0ICYgU0VMRUNUSU9OX1RJTUVPVVQpIHsKKwkJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19JTlRSLAorCQkJCSAgInNlbGVjdGlvbiB0aW1lb3V0IG9jY3VycmVkIik7CisKKwkJCVNDcG50LT5yZXN1bHQgPSBESURfVElNRV9PVVQgPDwgMTY7CisJCQluc3AzMl9zY3NpX2RvbmUoU0NwbnQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoYXV0b19zdGF0ICYgTVNHT1VUX1BIQVNFKSB7CisJCQkvKgorCQkJICogTXNnT3V0IHBoYXNlIHdhcyBwcm9jZXNzZWQuCisJCQkgKiBJZiBNU0dfSU5fT0NDVUVSIGlzIG5vdCBzZXQsIHRoZW4gTXNnT3V0IHBoYXNlIGlzCisJCQkgKiBjb21wbGV0ZWQuIFRodXMsIG1zZ291dF9sZW4gbXVzdCByZXNldC4gIE90aGVyd2lzZSwKKwkJCSAqIG5vdGhpbmcgdG8gZG8gaGVyZS4gSWYgTVNHX09VVF9PQ0NVRVIgaXMgb2NjdXJyZWQsCisJCQkgKiB0aGVuIHdlIHdpbGwgZW5jb3VudGVyIHRoZSBjb25kaXRpb24gYW5kIGNoZWNrLgorCQkJICovCisJCQlpZiAoIShhdXRvX3N0YXQgJiBNU0dfSU5fT0NDVUVSKSAmJgorCQkJICAgICAoZGF0YS0+bXNnb3V0X2xlbiA8PSAzKSkgeworCQkJCS8qCisJCQkJICogIU1TR19JTl9PQ0NVRVIgJiYgbXNnb3V0X2xlbiA8PTMKKwkJCQkgKiAgIC0tLT4gQXV0b1NDU0kgd2l0aCBNU0dPVVRyZWcgaXMgcHJvY2Vzc2VkLgorCQkJCSAqLworCQkJCWRhdGEtPm1zZ291dF9sZW4gPSAwOworCQkJfTsKKworCQkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOVFIsICJNc2dPdXQgcGhhc2UgcHJvY2Vzc2VkIik7CisJCX0KKworCQlpZiAoKGF1dG9fc3RhdCAmIERBVEFfSU5fUEhBU0UpICYmCisJCSAgICAoU0NwbnQtPnJlc2lkID4gMCkgJiYKKwkJICAgICgobnNwMzJfcmVhZDIoYmFzZSwgRklGT19SRVNUX0NOVCkgJiBGSUZPX1JFU1RfTUFTSykgIT0gMCkpIHsKKwkJCXByaW50ayggImF1dG8rZmlmb1xuIik7CisJCQkvL25zcDMyX3Bpb19yZWFkKFNDcG50KTsKKwkJfQorCisJCWlmIChhdXRvX3N0YXQgJiAoREFUQV9JTl9QSEFTRSB8IERBVEFfT1VUX1BIQVNFKSkgeworCQkJLyogREFUQV9JTl9QSEFTRS9EQVRBX09VVF9QSEFTRSB3YXMgcHJvY2Vzc2VkLiAqLworCQkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOVFIsCisJCQkJICAiRGF0YSBpbi9vdXQgcGhhc2UgcHJvY2Vzc2VkIik7CisKKwkJCS8qIHJlYWQgQk1DTlQsIFNHVCBwb2ludGVyIGFkZHIgKi8KKwkJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19JTlRSLCAiQk1DTlQ9MHglbHgiLCAKKwkJCQkgICAgbnNwMzJfcmVhZDQoYmFzZSwgQk1fQ05UKSk7CisJCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfSU5UUiwgImFkZHI9MHglbHgiLCAKKwkJCQkgICAgbnNwMzJfcmVhZDQoYmFzZSwgU0dUX0FEUikpOworCQkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOVFIsICJTQUNLPTB4JWx4IiwgCisJCQkJICAgIG5zcDMyX3JlYWQ0KGJhc2UsIFNBQ0tfQ05UKSk7CisJCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfSU5UUiwgIlNTQUNLPTB4JWx4IiwgCisJCQkJICAgIG5zcDMyX3JlYWQ0KGJhc2UsIFNBVkVEX1NBQ0tfQ05UKSk7CisKKwkJCVNDcG50LT5yZXNpZCA9IDA7IC8qIGFsbCBkYXRhIHRyYW5zZmVyZWQhICovCisJCX0KKworCQkvKgorCQkgKiBNc2dJbiBPY2N1cgorCQkgKi8KKwkJaWYgKGF1dG9fc3RhdCAmIE1TR19JTl9PQ0NVRVIpIHsKKwkJCW5zcDMyX21zZ2luX29jY3VyKFNDcG50LCBpcnFfc3RhdCwgYXV0b19zdGF0KTsKKwkJfQorCisJCS8qCisJCSAqIE1zZ091dCBPY2N1cgorCQkgKi8KKwkJaWYgKGF1dG9fc3RhdCAmIE1TR19PVVRfT0NDVUVSKSB7CisJCQluc3AzMl9tc2dvdXRfb2NjdXIoU0NwbnQpOworCQl9CisKKwkJLyoKKwkJICogQnVzIEZyZWUgT2NjdXIKKwkJICovCisJCWlmIChhdXRvX3N0YXQgJiBCVVNfRlJFRV9PQ0NVRVIpIHsKKwkJCXJldCA9IG5zcDMyX2J1c2ZyZWVfb2NjdXIoU0NwbnQsIGF1dG9fc3RhdCk7CisJCQlpZiAocmV0ID09IFRSVUUpIHsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCisJCWlmIChhdXRvX3N0YXQgJiBTVEFUVVNfUEhBU0UpIHsKKwkJCS8qCisJCQkgKiBSZWFkIENTQiBhbmQgc3Vic3RpdHV0ZSBDU0IgZm9yIFNDcG50LT5yZXN1bHQKKwkJCSAqIHRvIHNhdmUgc3RhdHVzIHBoYXNlIHN0dXRhcyBieXRlLgorCQkJICogc2NzaSBlcnJvciBoYW5kbGVyIGNoZWNrcyBob3N0X2J5dGUgKERJRF8qOgorCQkJICogbG93IGxldmVsIGRyaXZlciB0byBpbmRpY2F0ZSBzdGF0dXMpLCB0aGVuIGNoZWNrcyAKKwkJCSAqIHN0YXR1c19ieXRlIChTQ1NJIHN0YXR1cyBieXRlKS4KKwkJCSAqLworCQkJU0NwbnQtPnJlc3VsdCA9CShpbnQpbnNwMzJfcmVhZDEoYmFzZSwgU0NTSV9DU0JfSU4pOworCQl9CisKKwkJaWYgKGF1dG9fc3RhdCAmIElMTEVHQUxfUEhBU0UpIHsKKwkJCS8qIElsbGVnYWwgcGhhc2UgaXMgZGV0ZWN0ZWQuIFNBQ0sgaXMgbm90IGJhY2suICovCisJCQluc3AzMl9tc2coS0VSTl9XQVJOSU5HLCAKKwkJCQkgICJBVVRPIFNDU0kgSUxMRUdBTCBQSEFTRSBPQ0NVUiEhISEiKTsKKworCQkJLyogVE9ETzogY3VycmVudGx5IHdlIGRvbid0IGhhdmUgYW55IGFjdGlvbi4uLiBidXMgcmVzZXQ/ICovCisKKwkJCS8qCisJCQkgKiBUbyBzZW5kIGJhY2sgU0FDSywgYXNzZXJ0LCB3YWl0LCBhbmQgbmVnYXRlLgorCQkJICovCisJCQluc3AzMl9zYWNrX2Fzc2VydChkYXRhKTsKKwkJCW5zcDMyX3dhaXRfcmVxKGRhdGEsIE5FR0FURSk7CisJCQluc3AzMl9zYWNrX25lZ2F0ZShkYXRhKTsKKworCQl9CisKKwkJaWYgKGF1dG9fc3RhdCAmIENPTU1BTkRfUEhBU0UpIHsKKwkJCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwkJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19JTlRSLCAiQ29tbWFuZCBwaGFzZSBwcm9jZXNzZWQiKTsKKwkJfQorCisJCWlmIChhdXRvX3N0YXQgJiBBVVRPU0NTSV9CVVNZKSB7CisJCQkvKiBBdXRvU0NTSSBpcyBydW5uaW5nICovCisJCX0KKworCQlzaG93X2F1dG9waGFzZShhdXRvX3N0YXQpOworCX0KKworCS8qIEZJRk9fU0hMRF9JUlEgKi8KKwlpZiAoaXJxX3N0YXQgJiBJUlFTVEFUVVNfRklGT19TSExEX0lSUSkgeworCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfSU5UUiwgIkZJRk8gSVJRIik7CisKKwkJc3dpdGNoKGJ1c3BoYXNlKSB7CisJCWNhc2UgQlVTUEhBU0VfREFUQV9PVVQ6CisJCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfSU5UUiwgImZpZm8vd3JpdGUiKTsKKworCQkJLy9uc3AzMl9waW9fd3JpdGUoU0NwbnQpOworCisJCQlicmVhazsKKworCQljYXNlIEJVU1BIQVNFX0RBVEFfSU46CisJCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfSU5UUiwgImZpZm8vcmVhZCIpOworCisJCQkvL25zcDMyX3Bpb19yZWFkKFNDcG50KTsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBCVVNQSEFTRV9TVEFUVVM6CisJCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfSU5UUiwgImZpZm8vc3RhdHVzIik7CisKKwkJCVNDcG50LT5TQ3AuU3RhdHVzID0gbnNwMzJfcmVhZDEoYmFzZSwgU0NTSV9DU0JfSU4pOworCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19JTlRSLCAiZmlmby9vdGhlciBwaGFzZSIpOworCQkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOVFIsICJpcnFfc3RhdD0weCV4IHRyYW5zX3N0YXQ9MHgleCIsIGlycV9zdGF0LCB0cmFuc19zdGF0KTsKKwkJCXNob3dfYnVzcGhhc2UoYnVzcGhhc2UpOworCQkJYnJlYWs7CisJCX0KKworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBQaGFzZSBDaGFuZ2UgSVJRICovCisJaWYgKGlycV9zdGF0ICYgSVJRU1RBVFVTX1BIQVNFX0NIQU5HRV9JUlEpIHsKKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOVFIsICJwaGFzZSBjaGFuZ2UgSVJRIik7CisKKwkJc3dpdGNoKGJ1c3BoYXNlKSB7CisJCWNhc2UgQlVTUEhBU0VfTUVTU0FHRV9JTjoKKwkJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19JTlRSLCAicGhhc2UgY2hnL21zZyBpbiIpOworCQkJbnNwMzJfbXNnaW5fb2NjdXIoU0NwbnQsIGlycV9zdGF0LCAwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbnNwMzJfbXNnKEtFUk5fV0FSTklORywgInBoYXNlIGNoZy9vdGhlciBwaGFzZT8iKTsKKwkJCW5zcDMyX21zZyhLRVJOX1dBUk5JTkcsICJpcnFfc3RhdD0weCV4IHRyYW5zX3N0YXQ9MHgleFxuIiwKKwkJCQkgIGlycV9zdGF0LCB0cmFuc19zdGF0KTsKKwkJCXNob3dfYnVzcGhhc2UoYnVzcGhhc2UpOworCQkJYnJlYWs7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCisJLyogUENJX0lSUSAqLworCWlmIChpcnFfc3RhdCAmIElSUVNUQVRVU19QQ0lfSVJRKSB7CisJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19JTlRSLCAiUENJIElSUSBvY2N1cnJlZCIpOworCQkvKiBEbyBub3RoaW5nICovCisJfQorCisJLyogQk1DTlRFUlJfSVJRICovCisJaWYgKGlycV9zdGF0ICYgSVJRU1RBVFVTX0JNQ05URVJSX0lSUSkgeworCQluc3AzMl9tc2coS0VSTl9FUlIsICJSZWNlaXZlZCB1bmV4cGVjdGVkIEJNQ05URVJSIElSUSEgIik7CisJCS8qCisJCSAqIFRPRE86IFRvIGJlIGltcGxlbWVudGVkIGltcHJvdmluZyBidXMgbWFzdGVyCisJCSAqIHRyYW5zZmVyIHJlbGlhYmxpdHkgd2hlbiBCTUNOVEVSUiBpcyBvY2N1cnJlZCBpbgorCQkgKiBBdXRvU0NTSSBwaGFzZSBkZXNjcmliZWQgaW4gc3BlY2lmaWNhdGlvbi4KKwkJICovCisJfQorCisjaWYgMAorCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19JTlRSLAorCQkgICJpcnFfc3RhdD0weCV4IHRyYW5zX3N0YXQ9MHgleCIsIGlycV9zdGF0LCB0cmFuc19zdGF0KTsKKwlzaG93X2J1c3BoYXNlKGJ1c3BoYXNlKTsKKyNlbmRpZgorCisgb3V0OgorCS8qIGRpc2FibGUgSVJRIG1hc2sgKi8KKwluc3AzMl93cml0ZTIoYmFzZSwgSVJRX0NPTlRST0wsIDApOworCisgb3V0MjoKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisjZWxzZQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvX3JlcXVlc3RfbG9jaywgZmxhZ3MpOworI2VuZGlmCisKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfSU5UUiwgImV4aXQiKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisjdW5kZWYgU1BSSU5URgorI2RlZmluZSBTUFJJTlRGKGFyZ3MuLi4pIFwKKwlkbyB7IFwKKwkJaWYobGVuZ3RoID4gKHBvcyAtIGJ1ZmZlcikpIHsgXAorCQkJcG9zICs9IHNucHJpbnRmKHBvcywgbGVuZ3RoIC0gKHBvcyAtIGJ1ZmZlcikgKyAxLCAjIyBhcmdzKTsgXAorCQkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX1BST0MsICJidWZmZXI9MHglcCBwb3M9MHglcCBsZW5ndGg9JWQgJWRcbiIsIGJ1ZmZlciwgcG9zLCBsZW5ndGgsICBsZW5ndGggLSAocG9zIC0gYnVmZmVyKSk7XAorCQl9IFwKKwl9IHdoaWxlKDApCitzdGF0aWMgaW50IG5zcDMyX3Byb2NfaW5mbygKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDczKSkgCisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwKKyNlbmRpZgorCWNoYXIgICAgICAgICAgICAgKmJ1ZmZlciwKKwljaGFyICAgICAgICAgICAgKipzdGFydCwKKwlvZmZfdCAgICAgICAgICAgICBvZmZzZXQsCisJaW50ICAgICAgICAgICAgICAgbGVuZ3RoLAorI2lmICEoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDczKSkgCisJaW50ICAgICAgICAgICAgICAgaG9zdG5vLAorI2VuZGlmCisJaW50ICAgICAgICAgICAgICAgaW5vdXQpCit7CisJY2hhciAgICAgICAgICAgICAqcG9zID0gYnVmZmVyOworCWludCAgICAgICAgICAgICAgIHRoaXNsZW5ndGg7CisJdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CisJbnNwMzJfaHdfZGF0YSAgICAqZGF0YTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDczKSkgCisJaW50ICAgICAgICAgICAgICAgaG9zdG5vOworI2Vsc2UKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworI2VuZGlmCisJdW5zaWduZWQgaW50ICAgICAgYmFzZTsKKwl1bnNpZ25lZCBjaGFyICAgICBtb2RlX3JlZzsKKwlpbnQgICAgICAgICAgICAgICBpZCwgc3BlZWQ7CisJbG9uZyAgICAgICAgICAgICAgbW9kZWw7CisKKwkvKiBXcml0ZSBpcyBub3Qgc3VwcG9ydGVkLCBqdXN0IHJldHVybi4gKi8KKwlpZiAoaW5vdXQgPT0gVFJVRSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDczKSkgCisJaG9zdG5vID0gaG9zdC0+aG9zdF9ubzsKKyNlbHNlCisJLyogc2VhcmNoIHRoaXMgSEJBIGhvc3QgKi8KKwlob3N0ID0gc2NzaV9ob3N0X2huX2dldChob3N0bm8pOworCWlmIChob3N0ID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FU1JDSDsKKwl9CisjZW5kaWYKKwlkYXRhID0gKG5zcDMyX2h3X2RhdGEgKilob3N0LT5ob3N0ZGF0YTsKKwliYXNlID0gaG9zdC0+aW9fcG9ydDsKKworCVNQUklOVEYoIk5pbmphU0NTSS0zMiBzdGF0dXNcblxuIik7CisJU1BSSU5URigiRHJpdmVyIHZlcnNpb246ICAgICAgICAlcywgJFJldmlzaW9uOiAxLjMzICRcbiIsIG5zcDMyX3JlbGVhc2VfdmVyc2lvbik7CisJU1BSSU5URigiU0NTSSBob3N0IE5vLjogICAgICAgICAlZFxuIiwJCWhvc3Rubyk7CisJU1BSSU5URigiSVJROiAgICAgICAgICAgICAgICAgICAlZFxuIiwJCWhvc3QtPmlycSk7CisJU1BSSU5URigiSU86ICAgICAgICAgICAgICAgICAgICAweCVseC0weCVseFxuIiwgaG9zdC0+aW9fcG9ydCwgaG9zdC0+aW9fcG9ydCArIGhvc3QtPm5faW9fcG9ydCAtIDEpOworCVNQUklOVEYoIk1NSU8odmlydHVhbCBhZGRyZXNzKTogMHglbHgtMHglbHhcbiIsCWhvc3QtPmJhc2UsIGhvc3QtPmJhc2UgKyBkYXRhLT5NbWlvTGVuZ3RoIC0gMSk7CisJU1BSSU5URigic2dfdGFibGVzaXplOiAgICAgICAgICAlZFxuIiwJCWhvc3QtPnNnX3RhYmxlc2l6ZSk7CisJU1BSSU5URigiQ2hpcCByZXZpc2lvbjogICAgICAgICAweCV4XG4iLCAgICAgICAJKG5zcDMyX3JlYWQyKGJhc2UsIElOREVYX1JFRykgPj4gOCkgJiAweGZmKTsKKworCW1vZGVfcmVnID0gbnNwMzJfaW5kZXhfcmVhZDEoYmFzZSwgQ0hJUF9NT0RFKTsKKwltb2RlbCAgICA9IGRhdGEtPnBjaV9kZXZpZC0+ZHJpdmVyX2RhdGE7CisKKyNpZmRlZiBDT05GSUdfUE0KKwlTUFJJTlRGKCJQb3dlciBNYW5hZ2VtZW50OiAgICAgICVzXG4iLCAgICAgICAgICAobW9kZV9yZWcgJiBPUFRGKSA/ICJ5ZXMiIDogIm5vIik7CisjZW5kaWYKKwlTUFJJTlRGKCJPRU06ICAgICAgICAgICAgICAgICAgICVsZCwgJXNcbiIsICAgICAobW9kZV9yZWcgJiAoT0VNMHxPRU0xKSksIG5zcDMyX21vZGVsW21vZGVsXSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKGRhdGEtPkxvY2spLCBmbGFncyk7CisJU1BSSU5URigiQ3VycmVudFNDOiAgICAgICAgICAgICAweCVwXG5cbiIsICAgICAgZGF0YS0+Q3VycmVudFNDKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoZGF0YS0+TG9jayksIGZsYWdzKTsKKworCisJU1BSSU5URigiU0RUUiBzdGF0dXNcbiIpOworCWZvciAoaWQgPSAwOyBpZCA8IEFSUkFZX1NJWkUoZGF0YS0+dGFyZ2V0KTsgaWQrKykgeworCisgICAgICAgICAgICAgICAgU1BSSU5URigiaWQgJWQ6ICIsIGlkKTsKKworCQlpZiAoaWQgPT0gaG9zdC0+dGhpc19pZCkgeworCQkJU1BSSU5URigiLS0tLS0gTmluamFTQ1NJLTMyIGhvc3QgYWRhcHRlclxuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChkYXRhLT50YXJnZXRbaWRdLnN5bmNfZmxhZyA9PSBTRFRSX0RPTkUpIHsKKwkJCWlmIChkYXRhLT50YXJnZXRbaWRdLnBlcmlvZCA9PSAwICAgICAgICAgICAgJiYKKwkJCSAgICBkYXRhLT50YXJnZXRbaWRdLm9mZnNldCA9PSBBU1lOQ19PRkZTRVQgKSB7CisJCQkJU1BSSU5URigiYXN5bmMiKTsKKwkJCX0gZWxzZSB7CisJCQkJU1BSSU5URigiIHN5bmMiKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVNQUklOVEYoIiBub25lIik7CisJCX0KKworCQlpZiAoZGF0YS0+dGFyZ2V0W2lkXS5wZXJpb2QgIT0gMCkgeworCisJCQlzcGVlZCA9IDEwMDAwMDAgLyAoZGF0YS0+dGFyZ2V0W2lkXS5wZXJpb2QgKiA0KTsKKworCQkJU1BSSU5URigiIHRyYW5zZmVyICVkLiVkTUIvcywgb2Zmc2V0ICVkIiwKKwkJCQlzcGVlZCAvIDEwMDAsCisJCQkJc3BlZWQgJSAxMDAwLAorCQkJCWRhdGEtPnRhcmdldFtpZF0ub2Zmc2V0CisJCQkJKTsKKwkJfQorCQlTUFJJTlRGKCJcbiIpOworCX0KKworCisJdGhpc2xlbmd0aCA9IHBvcyAtIChidWZmZXIgKyBvZmZzZXQpOworCisJaWYodGhpc2xlbmd0aCA8IDApIHsKKwkJKnN0YXJ0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisKKwl0aGlzbGVuZ3RoID0gbWluKHRoaXNsZW5ndGgsIGxlbmd0aCk7CisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCisJcmV0dXJuIHRoaXNsZW5ndGg7Cit9CisjdW5kZWYgU1BSSU5URgorCisKKworLyoKKyAqIFJlc2V0IHBhcmFtZXRlcnMgYW5kIGNhbGwgc2NzaV9kb25lIGZvciBkYXRhLT5jdXJfbHVudC4KKyAqIEJlIGNhcmVmdWwgc2V0dGluZyBTQ3BudC0+cmVzdWx0ID0gRElEXyogYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgbnNwMzJfc2NzaV9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCW5zcDMyX2h3X2RhdGEgKmRhdGEgPSAobnNwMzJfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGludCAgIGJhc2UgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OworCisJLyoKKwkgKiB1bm1hcCBwY2kKKwkgKi8KKwlpZiAoU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiA9PSAwKSB7CisJCWdvdG8gc2tpcDsKKwl9CisKKwlpZiAoU0NwbnQtPnVzZV9zZykgeworCQlwY2lfdW5tYXBfc2coZGF0YS0+UGNpLAorCQkJICAgICAoc3RydWN0IHNjYXR0ZXJsaXN0ICopU0NwbnQtPmJ1ZmZlciwKKwkJCSAgICAgU0NwbnQtPnVzZV9zZywgU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwl9IGVsc2UgeworCQlwY2lfdW5tYXBfc2luZ2xlKGRhdGEtPlBjaSwKKwkJCQkgKHUzMilTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbiwKKwkJCQkgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkgU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwl9CisKKyBza2lwOgorCS8qCisJICogY2xlYXIgVFJBTlNGRVJDT05UUk9MX0JNX1NUQVJUCisJICovCisJbnNwMzJfd3JpdGUyKGJhc2UsIFRSQU5TRkVSX0NPTlRST0wsIDApOworCW5zcDMyX3dyaXRlNChiYXNlLCBCTV9DTlQsICAgICAgICAgICAwKTsKKworCS8qCisJICogY2FsbCBzY3NpX2RvbmUKKwkgKi8KKwkoKlNDcG50LT5zY3NpX2RvbmUpKFNDcG50KTsKKworCS8qCisJICogcmVzZXQgcGFyYW1ldGVycworCSAqLworCWRhdGEtPmN1cl9sdW50LT5TQ3BudCA9IE5VTEw7CisJZGF0YS0+Y3VyX2x1bnQgICAgICAgID0gTlVMTDsKKwlkYXRhLT5jdXJfdGFyZ2V0ICAgICAgPSBOVUxMOworCWRhdGEtPkN1cnJlbnRTQyAgICAgID0gTlVMTDsKK30KKworCisvKgorICogQnVzIEZyZWUgT2NjdXIKKyAqCisgKiBDdXJyZW50IFBoYXNlIGlzIEJVU0ZSRUUuIEF1dG9TQ1NJIGlzIGF1dG9tYXRpY2FsbHkgZXhlY3V0ZSBCVVNGUkVFIHBoYXNlCisgKiB3aXRoIEFDSyByZXBseSB3aGVuIGJlbG93IGNvbmRpdGlvbiBpcyBtYXRjaGVkOgorICoJTXNnSW4gMDA6IENvbW1hbmQgQ29tcGxldGUuCisgKglNc2dJbiAwMjogU2F2ZSBEYXRhIFBvaW50ZXIuCisgKglNc2dJbiAwNDogRGljb25uZWN0LgorICogSW4gb3RoZXIgY2FzZSwgdW5leHBlY3RlZCBCVVNGUkVFIGlzIGRldGVjdGVkLgorICovCitzdGF0aWMgaW50IG5zcDMyX2J1c2ZyZWVfb2NjdXIoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsIHVuc2lnbmVkIHNob3J0IGV4ZWNwaCkKK3sKKwluc3AzMl9od19kYXRhICpkYXRhID0gKG5zcDMyX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBpbnQgYmFzZSAgID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKKworCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19CVVNGUkVFLCAiZW50ZXIgZXhlY3BoPTB4JXgiLCBleGVjcGgpOworCXNob3dfYXV0b3BoYXNlKGV4ZWNwaCk7CisKKwluc3AzMl93cml0ZTQoYmFzZSwgQk1fQ05ULCAgICAgICAgICAgMCk7CisJbnNwMzJfd3JpdGUyKGJhc2UsIFRSQU5TRkVSX0NPTlRST0wsIDApOworCisJLyoKKwkgKiBNc2dJbiAwMjogU2F2ZSBEYXRhIFBvaW50ZXIKKwkgKgorCSAqIFZBTElEOgorCSAqICAgU2F2ZSBEYXRhIFBvaW50ZXIgaXMgcmVjZWl2ZWQuIEFkanVzdCBwb2ludGVyLgorCSAqICAgCisJICogTk8tVkFMSUQ6CisJICogICBTQ1NJLTMgc2F5cyBpZiBTYXZlIERhdGEgUG9pbnRlciBpcyBub3QgcmVjZWl2ZWQsIHRoZW4gd2UgcmVzdGFydAorCSAqICAgcHJvY2Vzc2luZyBhbmQgd2UgY2FuJ3QgYWRqdXN0IGFueSBTQ1NJIGRhdGEgcG9pbnRlciBpbiBuZXh0IGRhdGEKKwkgKiAgIHBoYXNlLgorCSAqLworCWlmIChleGVjcGggJiBNU0dJTl8wMl9WQUxJRCkgeworCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfQlVTRlJFRSwgIk1zZ0luMDJfVmFsaWQiKTsKKworCQkvKgorCQkgKiBDaGVjayBzYWNrX2NudC9zYXZlZF9zYWNrX2NudCwgdGhlbiBhZGp1c3Qgc2cgdGFibGUgaWYKKwkJICogbmVlZGVkLgorCQkgKi8KKwkJaWYgKCEoZXhlY3BoICYgTVNHSU5fMDBfVkFMSUQpICYmIAorCQkgICAgKChleGVjcGggJiBEQVRBX0lOX1BIQVNFKSB8fCAoZXhlY3BoICYgREFUQV9PVVRfUEhBU0UpKSkgeworCQkJdW5zaWduZWQgaW50IHNhY2tsZW4sIHNfc2Fja2xlbjsKKworCQkJLyoKKwkJCSAqIFJlYWQgU0FDSyBjb3VudCBhbmQgU0FWRURTQUNLIGNvdW50LCB0aGVuIGNvbXBhcmUuCisJCQkgKi8KKwkJCXNhY2tsZW4gICA9IG5zcDMyX3JlYWQ0KGJhc2UsIFNBQ0tfQ05UICAgICAgKTsKKwkJCXNfc2Fja2xlbiA9IG5zcDMyX3JlYWQ0KGJhc2UsIFNBVkVEX1NBQ0tfQ05UKTsKKworCQkJLyoKKwkJCSAqIElmIFNBVkVEU0FDS0NOVCA9PSAwLCBpdCBtZWFucyBTYXZlZERhdGFQb2ludGVyIGlzCisJCQkgKiBjb21lIGFmdGVyIGRhdGEgdHJhbnNmZXJpbmcuCisJCQkgKi8KKwkJCWlmIChzX3NhY2tsZW4gPiAwKSB7CisJCQkJLyoKKwkJCQkgKiBDb21wYXJpbmcgYmV0d2VlbiBzYWNrIGFuZCBzYXZlZHNhY2sgdG8KKwkJCQkgKiBjaGVjayB0aGUgY29uZGl0aW9uIG9mIEF1dG9Nc2dJbjAzLgorCQkJCSAqCisJCQkJICogSWYgdGhleSBhcmUgc2FtZSwgc2V0IG1zZ2luMDMgPT0gVFJVRSwKKwkJCQkgKiBDT01NQU5EQ09OVFJPTF9BVVRPX01TR0lOXzAzIGlzIGVuYWJsZWQgYXQKKwkJCQkgKiByZXNlbGVjdGlvbi4gIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGV5CisJCQkJICogYXJlbid0IHNhbWUsIHNldCBtc2dpbjAzID09IEZBTFNFLCBhbmQKKwkJCQkgKiBDT01NQU5EQ09OVFJPTF9BVVRPX01TR0lOXzAzIGlzIGRpc2FibGVkIGF0CisJCQkJICogcmVzZWxlY3Rpb24uCisJCQkJICovCisJCQkJaWYgKHNhY2tsZW4gIT0gc19zYWNrbGVuKSB7CisJCQkJCWRhdGEtPmN1cl9sdW50LT5tc2dpbjAzID0gRkFMU0U7CisJCQkJfSBlbHNlIHsKKwkJCQkJZGF0YS0+Y3VyX2x1bnQtPm1zZ2luMDMgPSBUUlVFOworCQkJCX0KKworCQkJCW5zcDMyX2FkanVzdF9idXNmcmVlKFNDcG50LCBzX3NhY2tsZW4pOworCQkJfQorCQl9CisKKwkJLyogVGhpcyB2YWx1ZSBoYXMgbm90IHN1YnN0aXR1ZGUgd2l0aCB2YWxpZCB2YWx1ZSB5ZXQuLi4gKi8KKwkJLy9kYXRhLT5jdXJfbHVudC0+c2F2ZV9kYXRwID0gZGF0YS0+Y3VyX2RhdHA7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogbm8gcHJvY2Vzc2luZy4KKwkJICovCisJfQorCQorCWlmIChleGVjcGggJiBNU0dJTl8wM19WQUxJRCkgeworCQkvKiBNc2dJbjAzIHdhcyB2YWxpZCB0byBiZSBwcm9jZXNzZWQuIE5vIG5lZWQgcHJvY2Vzc2luZy4gKi8KKwl9CisKKwkvKgorCSAqIHRhcmdldCBTRFRSIGNoZWNrCisJICovCisJaWYgKGRhdGEtPmN1cl90YXJnZXQtPnN5bmNfZmxhZyAmIFNEVFJfSU5JVElBVE9SKSB7CisJCS8qCisJCSAqIFNEVFIgbmVnb3RpYXRpb24gcHVsbGVkIGJ5IHRoZSBpbml0aWF0b3IgaGFzIG5vdAorCQkgKiBmaW5pc2hlZCB5ZXQuIEZhbGwgYmFjayB0byBBU1lOQyBtb2RlLgorCQkgKi8KKwkJbnNwMzJfc2V0X2FzeW5jKGRhdGEsIGRhdGEtPmN1cl90YXJnZXQpOworCQlkYXRhLT5jdXJfdGFyZ2V0LT5zeW5jX2ZsYWcgJj0gflNEVFJfSU5JVElBVE9SOworCQlkYXRhLT5jdXJfdGFyZ2V0LT5zeW5jX2ZsYWcgfD0gU0RUUl9ET05FOworCX0gZWxzZSBpZiAoZGF0YS0+Y3VyX3RhcmdldC0+c3luY19mbGFnICYgU0RUUl9UQVJHRVQpIHsKKwkJLyoKKwkJICogU0RUUiBuZWdvdGlhdGlvbiBwdWxsZWQgYnkgdGhlIHRhcmdldCBoYXMgYmVlbgorCQkgKiBuZWdvdGlhdGluZy4KKwkJICovCisJCWlmIChleGVjcGggJiAoTVNHSU5fMDBfVkFMSUQgfCBNU0dJTl8wNF9WQUxJRCkpIHsKKwkJCS8qIAorCQkJICogSWYgdmFsaWQgbWVzc2FnZSBpcyByZWNlaXZlZCwgdGhlbgorCQkJICogbmVnb3RpYXRpb24gaXMgc3VjY2VlZGVkLgorCQkJICovCisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogT24gdGhlIGNvbnRyYXJ5LCBpZiB1bmV4cGVjdGVkIGJ1cyBmcmVlIGlzCisJCQkgKiBvY2N1cnJlZCwgdGhlbiBuZWdvdGlhdGlvbiBpcyBmYWlsZWQuIEZhbGwKKwkJCSAqIGJhY2sgdG8gQVNZTkMgbW9kZS4KKwkJCSAqLworCQkJbnNwMzJfc2V0X2FzeW5jKGRhdGEsIGRhdGEtPmN1cl90YXJnZXQpOworCQl9CisJCWRhdGEtPmN1cl90YXJnZXQtPnN5bmNfZmxhZyAmPSB+U0RUUl9UQVJHRVQ7CisJCWRhdGEtPmN1cl90YXJnZXQtPnN5bmNfZmxhZyB8PSBTRFRSX0RPTkU7CisJfQorCisJLyoKKwkgKiBJdCBpcyBhbHdheXMgZW5zdXJlZCBieSBTQ1NJIHN0YW5kYXJkIHRoYXQgaW5pdGlhdG9yCisJICogc3dpdGNoZXMgaW50byBCdXMgRnJlZSBQaGFzZSBhZnRlcgorCSAqIHJlY2VpdmluZyBtZXNzYWdlIDAwIChDb21tYW5kIENvbXBsZXRlKSwgMDQgKERpc2Nvbm5lY3QpLgorCSAqIEl0J3MgdGhlIHJlYXNvbiB0aGF0IHByb2Nlc3NpbmcgaGVyZSBpcyB2YWxpZC4KKwkgKi8KKwlpZiAoZXhlY3BoICYgTVNHSU5fMDBfVkFMSUQpIHsKKwkJLyogTXNnSW4gMDA6IENvbW1hbmQgQ29tcGxldGUgKi8KKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0JVU0ZSRUUsICJjb21tYW5kIGNvbXBsZXRlIik7CisKKwkJU0NwbnQtPlNDcC5TdGF0dXMgID0gbnNwMzJfcmVhZDEoYmFzZSwgU0NTSV9DU0JfSU4pOworCQlTQ3BudC0+U0NwLk1lc3NhZ2UgPSAwOworCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfQlVTRlJFRSwgCisJCQkgICJub3JtYWwgZW5kIHN0YXQ9MHgleCByZXNpZD0weCV4XG4iLAorCQkJICBTQ3BudC0+U0NwLlN0YXR1cywgU0NwbnQtPnJlc2lkKTsKKwkJU0NwbnQtPnJlc3VsdCA9IChESURfT0sgICAgICAgICAgICAgPDwgMTYpIHwKKwkJCSAgICAgICAgKFNDcG50LT5TQ3AuTWVzc2FnZSA8PCAgOCkgfAorCQkJICAgICAgICAoU0NwbnQtPlNDcC5TdGF0dXMgIDw8ICAwKTsKKwkJbnNwMzJfc2NzaV9kb25lKFNDcG50KTsKKwkJLyogQWxsIG9wZXJhdGlvbiBpcyBkb25lICovCisJCXJldHVybiBUUlVFOworCX0gZWxzZSBpZiAoZXhlY3BoICYgTVNHSU5fMDRfVkFMSUQpIHsKKwkJLyogTXNnSW4gMDQ6IERpc2Nvbm5lY3QgKi8KKwkJU0NwbnQtPlNDcC5TdGF0dXMgID0gbnNwMzJfcmVhZDEoYmFzZSwgU0NTSV9DU0JfSU4pOworCQlTQ3BudC0+U0NwLk1lc3NhZ2UgPSA0OworCQkKKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0JVU0ZSRUUsICJkaXNjb25uZWN0Iik7CisJCXJldHVybiBUUlVFOworCX0gZWxzZSB7CisJCS8qIFVuZXhwZWN0ZWQgYnVzIGZyZWUgKi8KKwkJbnNwMzJfbXNnKEtFUk5fV0FSTklORywgInVuZXhwZWN0ZWQgYnVzIGZyZWUgb2NjdXJyZWQiKTsKKworCQkvKiBESURfRVJST1I/ICovCisJCS8vU0NwbnQtPnJlc3VsdCAgID0gKERJRF9PSyA8PCAxNikgfCAoU0NwbnQtPlNDcC5NZXNzYWdlIDw8IDgpIHwgKFNDcG50LT5TQ3AuU3RhdHVzIDw8IDApOworCQlTQ3BudC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQluc3AzMl9zY3NpX2RvbmUoU0NwbnQpOworCQlyZXR1cm4gVFJVRTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCisKKy8qCisgKiBuc3AzMl9hZGp1c3RfYnVzZnJlZSAtIGFkanVzdGluZyBTRyB0YWJsZQorICoKKyAqIE5vdGU6IFRoaXMgZHJpdmVyIGFkanVzdCB0aGUgU0cgdGFibGUgdXNpbmcgU0NTSSBBQ0sKKyAqICAgICAgIGNvdW50ZXIgaW5zdGVhZCBvZiBCTUNOVCBjb3VudGVyIQorICovCitzdGF0aWMgdm9pZCBuc3AzMl9hZGp1c3RfYnVzZnJlZShzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwgdW5zaWduZWQgaW50IHNfc2Fja2xlbikKK3sKKwluc3AzMl9od19kYXRhICpkYXRhID0gKG5zcDMyX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlpbnQgICAgICAgICAgICAgICAgICAgb2xkX2VudHJ5ID0gZGF0YS0+Y3VyX2VudHJ5OworCWludCAgICAgICAgICAgICAgICAgICBuZXdfZW50cnk7CisJaW50ICAgICAgICAgICAgICAgICAgIHNnX251bSA9IGRhdGEtPmN1cl9sdW50LT5zZ19udW07CisJbnNwMzJfc2d0YWJsZSAqc2d0ICAgID0gZGF0YS0+Y3VyX2x1bnQtPnNnbHVuLT5zZ3Q7CisJdW5zaWduZWQgaW50ICAgICAgICAgIHJlc3RsZW4sIHNlbnRsZW47CisJdTMyX2xlICAgICAgICAgICAgICAgIGxlbiwgYWRkcjsKKworCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19TR0xJU1QsICJvbGQgcmVzaWQ9MHgleCIsIFNDcG50LT5yZXNpZCk7CisKKwkvKiBhZGp1c3Qgc2F2ZWQgU0FDSyBjb3VudCB3aXRoIDQgYnl0ZSBzdGFydCBhZGRyZXNzIGJvdW5kYXJ5ICovCisJc19zYWNrbGVuIC09IGxlMzJfdG9fY3B1KHNndFtvbGRfZW50cnldLmFkZHIpICYgMzsKKworCS8qCisJICogY2FsY3VsYXRlIG5ld19lbnRyeSBmcm9tIHNhY2sgY291bnQgYW5kIGVhY2ggc2d0W10ubGVuIAorCSAqIGNhbGN1bGF0ZSB0aGUgYnl0ZSB3aGljaCBpcyBpbnRlbnQgdG8gc2VuZAorCSAqLworCXNlbnRsZW4gPSAwOworCWZvciAobmV3X2VudHJ5ID0gb2xkX2VudHJ5OyBuZXdfZW50cnkgPCBzZ19udW07IG5ld19lbnRyeSsrKSB7CisJCXNlbnRsZW4gKz0gKGxlMzJfdG9fY3B1KHNndFtuZXdfZW50cnldLmxlbikgJiB+U0dURU5EKTsKKwkJaWYgKHNlbnRsZW4gPiBzX3NhY2tsZW4pIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogYWxsIHNndCBpcyBwcm9jZXNzZWQgKi8KKwlpZiAobmV3X2VudHJ5ID09IHNnX251bSkgeworCQlnb3RvIGxhc3Q7CisJfQorCisJaWYgKHNlbnRsZW4gPT0gc19zYWNrbGVuKSB7CisJCS8qIFhYWDogY29uZmlybSBpdCdzIG9rIG9yIG5vdCAqLworCQkvKiBJbiB0aGlzIGNhc2UsIGl0J3Mgb2sgYmVjYXVzZSB3ZSBhcmUgYXQgCisJCSAgIHRoZSBoZWFkIGVsZW1lbnQgb2YgdGhlIHNnLiByZXN0bGVuIGlzIGNvcnJlY3RseSBjYWxjdWxhdGVkLiAqLworCX0KKworCS8qIGNhbGN1bGF0ZSB0aGUgcmVzdCBsZW5ndGggZm9yIHRyYW5zZmVyaW5nICovCisJcmVzdGxlbiA9IHNlbnRsZW4gLSBzX3NhY2tsZW47CisKKwkvKiB1cGRhdGUgYWRqdXN0aW5nIGN1cnJlbnQgU0cgdGFibGUgZW50cnkgKi8KKwlsZW4gID0gbGUzMl90b19jcHUoc2d0W25ld19lbnRyeV0ubGVuKTsKKwlhZGRyID0gbGUzMl90b19jcHUoc2d0W25ld19lbnRyeV0uYWRkcik7CisJYWRkciArPSAobGVuIC0gcmVzdGxlbik7CisJc2d0W25ld19lbnRyeV0uYWRkciA9IGNwdV90b19sZTMyKGFkZHIpOworCXNndFtuZXdfZW50cnldLmxlbiAgPSBjcHVfdG9fbGUzMihyZXN0bGVuKTsKKworCS8qIHNldCBjdXJfZW50cnkgd2l0aCBuZXdfZW50cnkgKi8KKwlkYXRhLT5jdXJfZW50cnkgPSBuZXdfZW50cnk7CisgCisJcmV0dXJuOworCisgbGFzdDoKKwlpZiAoU0NwbnQtPnJlc2lkIDwgc2VudGxlbikgeworCQluc3AzMl9tc2coS0VSTl9FUlIsICJyZXNpZCB1bmRlcmZsb3ciKTsKKwl9CisKKwlTQ3BudC0+cmVzaWQgLT0gc2VudGxlbjsKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfU0dMSVNULCAibmV3IHJlc2lkPTB4JXgiLCBTQ3BudC0+cmVzaWQpOworCisJLyogdXBkYXRlIGhvc3RkYXRhIGFuZCBsdW4gKi8KKworCXJldHVybjsKK30KKworCisvKgorICogSXQncyBjYWxsZWQgTXNnT3V0IHBoYXNlIG9jY3VyLgorICogTmluamFTQ1NJLTMyQmkvVURFIGF1dG9tYXRpY2FsbHkgcHJvY2Vzc2VzIHVwIHRvIDMgbWVzc2FnZXMgaW4KKyAqIG1lc3NhZ2Ugb3V0IHBoYXNlLiBJdCwgaG93ZXZlciwgaGFzIG1vcmUgdGhhbiAzIG1lc3NhZ2VzLAorICogSEJBIGNyZWF0ZXMgdGhlIGludGVycnVwdCBhbmQgd2UgaGF2ZSB0byBwcm9jZXNzIGJ5IGhhbmQuCisgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX21zZ291dF9vY2N1cihzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKwluc3AzMl9od19kYXRhICpkYXRhID0gKG5zcDMyX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBpbnQgYmFzZSAgID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKKwkvL3Vuc2lnbmVkIHNob3J0IGNvbW1hbmQ7CisJbG9uZyBuZXdfc2d0cDsKKwlpbnQgaTsKKwkKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfTVNHT1VUT0NDVVIsCisJCSAgImVudGVyOiBtc2dvdXRfbGVuOiAweCV4IiwgZGF0YS0+bXNnb3V0X2xlbik7CisKKwkvKgorCSAqIElmIE1zZ091dCBwaGFzZSBpcyBvY2N1cnJlZCB3aXRob3V0IGhhdmluZyBhbnkKKwkgKiBtZXNzYWdlLCB0aGVuIE5vX09wZXJhdGlvbiBpcyBzZW50IChTQ1NJLTIpLgorCSAqLworCWlmIChkYXRhLT5tc2dvdXRfbGVuID09IDApIHsKKwkJbnNwMzJfYnVpbGRfbm9wKFNDcG50KTsKKwl9CisKKwkvKgorCSAqIFNldCBTR1RQIEFERFIgY3VycmVudCBlbnRyeSBmb3IgcmVzdGFydGluZyBBVVRPU0NTSSwgCisJICogYmVjYXVzZSBTR1RQIGlzIGluY3JlbWVudGVkIG5leHQgcG9pbnQuCisJICogVGhlcmUgaXMgZmV3IHN0YXRlbWVudCBpbiB0aGUgc3BlY2lmaWNhdGlvbi4uLgorCSAqLworIAluZXdfc2d0cCA9IGRhdGEtPmN1cl9sdW50LT5zZ2x1bl9wYWRkciArIAorCQkgICAoZGF0YS0+Y3VyX2x1bnQtPmN1cl9lbnRyeSAqIHNpemVvZihuc3AzMl9zZ3RhYmxlKSk7CisKKwkvKgorCSAqIHNlbmQgbWVzc2FnZXMKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bXNnb3V0X2xlbjsgaSsrKSB7CisJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19NU0dPVVRPQ0NVUiwKKwkJCSAgIiVkIDogMHgleCIsIGksIGRhdGEtPm1zZ291dGJ1ZltpXSk7CisKKwkJLyoKKwkJICogQ2hlY2sgUkVRIGlzIGFzc2VydGVkLgorCQkgKi8KKwkJbnNwMzJfd2FpdF9yZXEoZGF0YSwgQVNTRVJUKTsKKworCQlpZiAoaSA9PSAoZGF0YS0+bXNnb3V0X2xlbiAtIDEpKSB7CisJCQkvKgorCQkJICogSWYgdGhlIGxhc3QgbWVzc2FnZSwgc2V0IHRoZSBBdXRvU0NTSSByZXN0YXJ0CisJCQkgKiBiZWZvcmUgc2VuZCBiYWNrIHRoZSBhY2sgbWVzc2FnZS4gQXV0b1NDU0kKKwkJCSAqIHJlc3RhcnQgYXV0b21hdGljYWxseSBuZWdhdGUgQVROIHNpZ25hbC4KKwkJCSAqLworCQkJLy9jb21tYW5kID0gKEFVVE9fTVNHSU5fMDBfT1JfMDQgfCBBVVRPX01TR0lOXzAyKTsKKwkJCS8vbnNwMzJfcmVzdGFydF9hdXRvc2NzaShTQ3BudCwgY29tbWFuZCk7CisJCQluc3AzMl93cml0ZTIoYmFzZSwgQ09NTUFORF9DT05UUk9MLAorCQkJCQkgKENMRUFSX0NEQl9GSUZPX1BPSU5URVIgfAorCQkJCQkgIEFVVE9fQ09NTUFORF9QSEFTRSAgICAgfAorCQkJCQkgIEFVVE9TQ1NJX1JFU1RBUlQgICAgICAgfAorCQkJCQkgIEFVVE9fTVNHSU5fMDBfT1JfMDQgICAgfAorCQkJCQkgIEFVVE9fTVNHSU5fMDIgICAgICAgICAgKSk7CisJCX0KKwkJLyoKKwkJICogV3JpdGUgZGF0YSB3aXRoIFNBQ0ssIHRoZW4gd2FpdCBzYWNrIGlzCisJCSAqIGF1dG9tYXRpY2FsbHkgbmVnYXRlZC4KKwkJICovCisJCW5zcDMyX3dyaXRlMShiYXNlLCBTQ1NJX0RBVEFfV0lUSF9BQ0ssIGRhdGEtPm1zZ291dGJ1ZltpXSk7CisJCW5zcDMyX3dhaXRfc2FjayhkYXRhLCBORUdBVEUpOworCisJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19NU0dPVVRPQ0NVUiwgImJ1czogMHgleFxuIiwKKwkJCSAgbnNwMzJfcmVhZDEoYmFzZSwgU0NTSV9CVVNfTU9OSVRPUikpOworCX07CisKKwlkYXRhLT5tc2dvdXRfbGVuID0gMDsKKworCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19NU0dPVVRPQ0NVUiwgImV4aXQiKTsKK30KKworLyoKKyAqIFJlc3RhcnQgQXV0b1NDU0kKKyAqCisgKiBOb3RlOiBSZXN0YXJ0aW5nIEF1dG9TQ1NJIG5lZWRzIHNldDoKKyAqCQlTWU5DX1JFRywgQUNLX1dJRFRILCBTR1RfQURSLCBUUkFOU0ZFUl9DT05UUk9MCisgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX3Jlc3RhcnRfYXV0b3Njc2koc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsIHVuc2lnbmVkIHNob3J0IGNvbW1hbmQpCit7CisJbnNwMzJfaHdfZGF0YSAqZGF0YSA9IChuc3AzMl9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgaW50ICAgYmFzZSA9IGRhdGEtPkJhc2VBZGRyZXNzOworCXVuc2lnbmVkIHNob3J0IHRyYW5zZmVyID0gMDsKKworCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19SRVNUQVJULCAiZW50ZXIiKTsKKworCWlmIChkYXRhLT5jdXJfdGFyZ2V0ID09IE5VTEwgfHwgZGF0YS0+Y3VyX2x1bnQgPT0gTlVMTCkgeworCQluc3AzMl9tc2coS0VSTl9FUlIsICJUYXJnZXQgb3IgTHVuIGlzIGludmFsaWQiKTsKKwl9CisKKwkvKgorCSAqIHNldCBTWU5DX1JFRworCSAqIERvbid0IHNldCBCTV9TVEFSVF9BRFIgYmVmb3JlIHNldHRpbmcgdGhpcyByZWdpc3Rlci4KKwkgKi8KKwluc3AzMl93cml0ZTEoYmFzZSwgU1lOQ19SRUcsIGRhdGEtPmN1cl90YXJnZXQtPnN5bmNyZWcpOworCisJLyoKKwkgKiBzZXQgQUNLV0lEVEgKKwkgKi8KKwluc3AzMl93cml0ZTEoYmFzZSwgQUNLX1dJRFRILCBkYXRhLT5jdXJfdGFyZ2V0LT5hY2t3aWR0aCk7CisKKwkvKgorCSAqIHNldCBTUkVRIGhhemFyZCBraWxsZXIgc2FtcGxpbmcgcmF0ZQorCSAqLworCW5zcDMyX3dyaXRlMShiYXNlLCBTUkVRX1NNUExfUkFURSwgZGF0YS0+Y3VyX3RhcmdldC0+c2FtcGxlX3JlZyk7CisKKwkvKgorCSAqIHNldCBTR1QgQUREUiAocGh5c2ljYWwgYWRkcmVzcykKKwkgKi8KKwluc3AzMl93cml0ZTQoYmFzZSwgU0dUX0FEUiwgZGF0YS0+Y3VyX2x1bnQtPnNnbHVuX3BhZGRyKTsKKworCS8qCisJICogc2V0IFRSQU5TRkVSIENPTlRST0wgUkVHCisJICovCisJdHJhbnNmZXIgPSAwOworCXRyYW5zZmVyIHw9IChUUkFOU0ZFUl9HTyB8IEFMTF9DT1VOVEVSX0NMUik7CisJaWYgKGRhdGEtPnRyYW5zX21ldGhvZCAmIE5TUDMyX1RSQU5TRkVSX0JVU01BU1RFUikgeworCQlpZiAoU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiA+IDApIHsKKwkJCXRyYW5zZmVyIHw9IEJNX1NUQVJUOworCQl9CisJfSBlbHNlIGlmIChkYXRhLT50cmFuc19tZXRob2QgJiBOU1AzMl9UUkFOU0ZFUl9NTUlPKSB7CisJCXRyYW5zZmVyIHw9IENCX01NSU9fTU9ERTsKKwl9IGVsc2UgaWYgKGRhdGEtPnRyYW5zX21ldGhvZCAmIE5TUDMyX1RSQU5TRkVSX1BJTykgeworCQl0cmFuc2ZlciB8PSBDQl9JT19NT0RFOworCX0KKwluc3AzMl93cml0ZTIoYmFzZSwgVFJBTlNGRVJfQ09OVFJPTCwgdHJhbnNmZXIpOworCisJLyoKKwkgKiByZXN0YXJ0IEF1dG9TQ1NJCisJICoKKwkgKiBUT0RPOiBDT01NQU5EQ09OVFJPTF9BVVRPX0NPTU1BTkRfUEhBU0UgaXMgbmVlZGVkID8KKwkgKi8KKwljb21tYW5kIHw9IChDTEVBUl9DREJfRklGT19QT0lOVEVSIHwKKwkJICAgIEFVVE9fQ09NTUFORF9QSEFTRSAgICAgfAorCQkgICAgQVVUT1NDU0lfUkVTVEFSVCAgICAgICApOworCW5zcDMyX3dyaXRlMihiYXNlLCBDT01NQU5EX0NPTlRST0wsIGNvbW1hbmQpOworCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX1JFU1RBUlQsICJleGl0Iik7Cit9CisKKworLyoKKyAqIGNhbm5vdCBydW4gYXV0b21hdGljYWxseSBtZXNzYWdlIGluIG9jY3VyCisgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX21zZ2luX29jY3VyKHN0cnVjdCBzY3NpX2NtbmQgICAgICpTQ3BudCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgIGlycV9zdGF0dXMsCisJCQkgICAgICB1bnNpZ25lZCBzaG9ydCBleGVjcGgpCit7CisJbnNwMzJfaHdfZGF0YSAqZGF0YSA9IChuc3AzMl9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgaW50ICAgYmFzZSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisJdW5zaWduZWQgY2hhciAgbXNnOworCXVuc2lnbmVkIGNoYXIgIG1zZ3R5cGU7CisJdW5zaWduZWQgY2hhciAgbmV3bHVuOworCXVuc2lnbmVkIHNob3J0IGNvbW1hbmQgID0gMDsKKwlpbnQgICAgICAgICAgICBtc2djbGVhciA9IFRSVUU7CisJbG9uZyAgICAgICAgICAgbmV3X3NndHA7CisJaW50ICAgICAgICAgICAgcmV0OworCisJLyoKKwkgKiByZWFkIGZpcnN0IG1lc3NhZ2UKKwkgKiAgICBVc2UgU0NTSURBVEFfV19BQ0sgaW5zdGVhZCBvZiBTQ1NJREFUQUlOLCBiZWNhdXNlIHRoZSBwcm9jZWR1cmUKKwkgKiAgICBvZiBNZXNzYWdlLUluIGhhdmUgdG8gYmUgcHJvY2Vzc2VkIGJlZm9yZSBzZW5kaW5nIGJhY2sgU0NTSSBBQ0suCisJICovCisJbXNnID0gbnNwMzJfcmVhZDEoYmFzZSwgU0NTSV9EQVRBX0lOKTsKKwlkYXRhLT5tc2dpbmJ1ZlsodW5zaWduZWQgY2hhcilkYXRhLT5tc2dpbl9sZW5dID0gbXNnOworCW1zZ3R5cGUgPSBkYXRhLT5tc2dpbmJ1ZlswXTsKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfTVNHSU5PQ0NVUiwKKwkJICAiZW50ZXI6IG1zZ2xlbjogMHgleCBtc2dpbjogMHgleCBtc2d0eXBlOiAweCV4IiwKKwkJICBkYXRhLT5tc2dpbl9sZW4sIG1zZywgbXNndHlwZSk7CisKKwkvKgorCSAqIFRPRE86IFdlIG5lZWQgY2hlY2tpbmcgd2hldGhlciBidXMgcGhhc2UgaXMgbWVzc2FnZSBpbj8KKwkgKi8KKworCS8qCisJICogYXNzZXJ0IFNDU0kgQUNLCisJICovCisJbnNwMzJfc2Fja19hc3NlcnQoZGF0YSk7CisKKwkvKgorCSAqIHByb2Nlc3NpbmcgSURFTlRJRlkKKwkgKi8KKwlpZiAobXNndHlwZSAmIDB4ODApIHsKKwkJaWYgKCEoaXJxX3N0YXR1cyAmIElSUVNUQVRVU19SRVNFTEVDVF9PQ0NVRVIpKSB7CisJCQkvKiBJbnZhbGlkIChub24gcmVzZWxlY3QpIHBoYXNlICovCisJCQlnb3RvIHJlamVjdDsKKwkJfQorCisJCW5ld2x1biA9IG1zZ3R5cGUgJiAweDFmOyAvKiBUT0RPOiBTUEktMyBjb21wbGlhbnQ/ICovCisJCXJldCA9IG5zcDMyX3Jlc2VsZWN0aW9uKFNDcG50LCBuZXdsdW4pOworCQlpZiAocmV0ID09IFRSVUUpIHsKKwkJCWdvdG8gcmVzdGFydDsKKwkJfSBlbHNlIHsKKwkJCWdvdG8gcmVqZWN0OworCQl9CisJfQorCQorCS8qCisJICogcHJvY2Vzc2luZyBtZXNzYWdlcyBleGNlcHQgZm9yIElERU5USUZZCisJICoKKwkgKiBUT0RPOiBNZXNzYWdlcyBhcmUgYWxsIFNDU0ktMiB0ZXJtaW5vbG9neS4gU0NTSS0zIGNvbXBsaWFuY2UgaXMgVE9ETy4KKwkgKi8KKwlzd2l0Y2ggKG1zZ3R5cGUpIHsKKwkvKgorCSAqIDEtYnl0ZSBtZXNzYWdlCisJICovCisJY2FzZSBDT01NQU5EX0NPTVBMRVRFOgorCWNhc2UgRElTQ09OTkVDVDoKKwkJLyoKKwkJICogVGhlc2UgbWVzc2FnZXMgc2hvdWxkIG5vdCBiZSBvY2N1cnJlZC4KKwkJICogVGhleSBzaG91bGQgYmUgcHJvY2Vzc2VkIG9uIEF1dG9TQ1NJIHNlcXVlbmNlci4KKwkJICovCisJCW5zcDMyX21zZyhLRVJOX1dBUk5JTkcsIAorCQkJICAgInVuZXhwZWN0ZWQgbWVzc2FnZSBvZiBBdXRvU0NTSSBNc2dJbjogMHgleCIsIG1zZyk7CisJCWJyZWFrOworCQkKKwljYXNlIFJFU1RPUkVfUE9JTlRFUlM6CisJCS8qCisJCSAqIEF1dG9Nc2dJbjAzIGlzIGRpc2FibGVkLCBhbmQgSEJBIGdldHMgdGhpcyBtZXNzYWdlLgorCQkgKi8KKworCQlpZiAoKGV4ZWNwaCAmIERBVEFfSU5fUEhBU0UpIHx8IChleGVjcGggJiBEQVRBX09VVF9QSEFTRSkpIHsKKwkJCXVuc2lnbmVkIGludCBzX3NhY2tsZW47CisKKwkJCXNfc2Fja2xlbiA9IG5zcDMyX3JlYWQ0KGJhc2UsIFNBVkVEX1NBQ0tfQ05UKTsKKwkJCWlmICgoZXhlY3BoICYgTVNHSU5fMDJfVkFMSUQpICYmIChzX3NhY2tsZW4gPiAwKSkgeworCQkJCW5zcDMyX2FkanVzdF9idXNmcmVlKFNDcG50LCBzX3NhY2tsZW4pOworCQkJfSBlbHNlIHsKKwkJCQkvKiBObyBuZWVkIHRvIHJld3JpdGUgU0dUICovCisJCQl9CisJCX0KKwkJZGF0YS0+Y3VyX2x1bnQtPm1zZ2luMDMgPSBGQUxTRTsKKworCQkvKiBVcGRhdGUgd2l0aCB0aGUgbmV3IHZhbHVlICovCisKKwkJLyogcmVzZXQgU0FDSy9TYXZlZEFDSyBjb3VudGVyIChvciBBTEwgY2xlYXI/KSAqLworCQluc3AzMl93cml0ZTQoYmFzZSwgQ0xSX0NPVU5URVIsIENMUkNPVU5URVJfQUxMTUFTSyk7CisKKwkJLyoKKwkJICogc2V0IG5ldyBzZyBwb2ludGVyCisJCSAqLworCQluZXdfc2d0cCA9IGRhdGEtPmN1cl9sdW50LT5zZ2x1bl9wYWRkciArIAorCQkJKGRhdGEtPmN1cl9sdW50LT5jdXJfZW50cnkgKiBzaXplb2YobnNwMzJfc2d0YWJsZSkpOworCQluc3AzMl93cml0ZTQoYmFzZSwgU0dUX0FEUiwgbmV3X3NndHApOworCisJCWJyZWFrOworCisJY2FzZSBTQVZFX1BPSU5URVJTOgorCQkvKgorCQkgKiBUaGVzZSBtZXNzYWdlcyBzaG91bGQgbm90IGJlIG9jY3VycmVkLgorCQkgKiBUaGV5IHNob3VsZCBiZSBwcm9jZXNzZWQgb24gQXV0b1NDU0kgc2VxdWVuY2VyLgorCQkgKi8KKwkJbnNwMzJfbXNnIChLRVJOX1dBUk5JTkcsIAorCQkJICAgInVuZXhwZWN0ZWQgbWVzc2FnZSBvZiBBdXRvU0NTSSBNc2dJbjogU0FWRV9QT0lOVEVSUyIpOworCQkKKwkJYnJlYWs7CisJCQorCWNhc2UgTUVTU0FHRV9SRUpFQ1Q6CisJCS8qIElmIHByZXZpb3VzIG1lc3NhZ2Vfb3V0IGlzIHNlbmRpbmcgU0RUUiwgYW5kIGdldCAKKwkJICAgbWVzc2FnZV9yZWplY3QgZnJvbSB0YXJnZXQsIFNEVFIgbmVnb3RpYXRpb24gaXMgZmFpbGVkICovCisJCWlmIChkYXRhLT5jdXJfdGFyZ2V0LT5zeW5jX2ZsYWcgJgorCQkJCShTRFRSX0lOSVRJQVRPUiB8IFNEVFJfVEFSR0VUKSkgeworCQkJLyoKKwkJCSAqIEN1cnJlbnQgdGFyZ2V0IGlzIG5lZ290aWF0aW5nIFNEVFIsIGJ1dCBpdCdzCisJCQkgKiBmYWlsZWQuICBGYWxsIGJhY2sgdG8gYXN5bmMgdHJhbnNmZXIgbW9kZSwgYW5kIHNldAorCQkJICogU0RUUl9ET05FLgorCQkJICovCisJCQluc3AzMl9zZXRfYXN5bmMoZGF0YSwgZGF0YS0+Y3VyX3RhcmdldCk7CisJCQlkYXRhLT5jdXJfdGFyZ2V0LT5zeW5jX2ZsYWcgJj0gflNEVFJfSU5JVElBVE9SOworCQkJZGF0YS0+Y3VyX3RhcmdldC0+c3luY19mbGFnIHw9IFNEVFJfRE9ORTsKKworCQl9CisJCWJyZWFrOworCisJY2FzZSBMSU5LRURfQ01EX0NPTVBMRVRFOgorCWNhc2UgTElOS0VEX0ZMR19DTURfQ09NUExFVEU6CisJCS8qIHF1ZXVlIHRhZyBpcyBub3Qgc3VwcG9ydGVkIGN1cnJlbnRseSAqLworCQluc3AzMl9tc2cgKEtFUk5fV0FSTklORywgCisJCQkgICAidW5zdXBwb3J0ZWQgbWVzc2FnZTogMHgleCIsIG1zZ3R5cGUpOworCQlicmVhazsKKworCWNhc2UgSU5JVElBVEVfUkVDT1ZFUlk6CisJCS8qIHN0YXJpbmcgRUNBIChFeHRlbmRlZCBDb250aW5nZW50IEFsbGVnaWFuY2UpIHN0YXRlLiAqLworCQkvKiBUaGlzIG1lc3NhZ2UgaXMgZGVjbGluZWQgaW4gU1BJMiBvciBsYXRlci4gKi8KKworCQlnb3RvIHJlamVjdDsKKworCS8qCisJICogMi1ieXRlIG1lc3NhZ2UKKwkgKi8KKwljYXNlIFNJTVBMRV9RVUVVRV9UQUc6CisJY2FzZSAweDIzOgorCQkvKgorCQkgKiAweDIzOiBJZ25vcmVfV2lkZV9SZXNpZHVlIGlzIG5vdCBkZWNsYXJlZCBpbiBzY3NpLmguCisJCSAqIE5vIHN1cHBvcnQgaXMgbmVlZGVkLgorCQkgKi8KKwkJaWYgKGRhdGEtPm1zZ2luX2xlbiA+PSAxKSB7CisJCQlnb3RvIHJlamVjdDsKKwkJfQorCisJCS8qIGN1cnJlbnQgcG9zaXRpb24gaXMgMS1ieXRlIG9mIDIgYnl0ZSAqLworCQltc2djbGVhciA9IEZBTFNFOworCisJCWJyZWFrOworCisJLyoKKwkgKiBleHRlbmRlZCBtZXNzYWdlCisJICovCisJY2FzZSBFWFRFTkRFRF9NRVNTQUdFOgorCQlpZiAoZGF0YS0+bXNnaW5fbGVuIDwgMSkgeworCQkJLyoKKwkJCSAqIEN1cnJlbnQgcG9zaXRpb24gZG9lcyBub3QgcmVhY2ggMi1ieXRlCisJCQkgKiAoMi1ieXRlIGlzIGV4dGVuZGVkIG1lc3NhZ2UgbGVuZ3RoKS4KKwkJCSAqLworCQkJbXNnY2xlYXIgPSBGQUxTRTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChkYXRhLT5tc2dpbmJ1ZlsxXSArIDEpID4gZGF0YS0+bXNnaW5fbGVuKSB7CisJCQkvKgorCQkJICogQ3VycmVudCBleHRlbmRlZCBtZXNzYWdlIGhhcyBtc2dpbmJ1ZlsxXSArIDIKKwkJCSAqIChtc2dpbl9sZW4gc3RhcnRzIGNvdW50aW5nIGZyb20gMCwgc28gYnVmWzFdICsgMSkuCisJCQkgKiBJZiBjdXJyZW50IG1lc3NhZ2UgcG9zaXRpb24gaXMgbm90IGZpbmlzaGVkLAorCQkJICogY29udGludWUgcmVjZWl2aW5nIG1lc3NhZ2UuCisJCQkgKi8KKwkJCW1zZ2NsZWFyID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIFJlYWNoIGhlcmUgbWVhbnMgcmVndWxhciBsZW5ndGggb2YgZWFjaCB0eXBlIG9mIAorCQkgKiBleHRlbmRlZCBtZXNzYWdlcy4KKwkJICovCisJCXN3aXRjaCAoZGF0YS0+bXNnaW5idWZbMl0pIHsKKwkJY2FzZSBFWFRFTkRFRF9NT0RJRllfREFUQV9QT0lOVEVSOgorCQkJLyogVE9ETyAqLworCQkJZ290byByZWplY3Q7IC8qIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgRVhURU5ERURfU0RUUjoKKwkJCS8qCisJCQkgKiBFeGNoYW5nZSB0aGlzIG1lc3NhZ2UgYmV0d2VlbiBpbml0aWF0b3IgYW5kIHRhcmdldC4KKwkJCSAqLworCQkJaWYgKGRhdGEtPm1zZ2luX2xlbiAhPSBFWFRFTkRFRF9TRFRSX0xFTiArIDEpIHsKKwkJCQkvKgorCQkJCSAqIHJlY2VpdmVkIGluYXBwcm9wcmlhdGUgbWVzc2FnZS4KKwkJCQkgKi8KKwkJCQlnb3RvIHJlamVjdDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJbnNwMzJfYW5hbHl6ZV9zZHRyKFNDcG50KTsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBFWFRFTkRFRF9FWFRFTkRFRF9JREVOVElGWToKKwkJCS8qIFNDU0ktSSBvbmx5LCBub3Qgc3VwcG9ydGVkLiAqLworCQkJZ290byByZWplY3Q7IC8qIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKworCQkJYnJlYWs7CisKKwkJY2FzZSBFWFRFTkRFRF9XRFRSOgorCQkJZ290byByZWplY3Q7IC8qIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKworCQkJYnJlYWs7CisJCQkKKwkJZGVmYXVsdDoKKwkJCWdvdG8gcmVqZWN0OworCQl9CisJCWJyZWFrOworCQkKKwlkZWZhdWx0OgorCQlnb3RvIHJlamVjdDsKKwl9CisKKyByZXN0YXJ0OgorCWlmIChtc2djbGVhciA9PSBUUlVFKSB7CisJCWRhdGEtPm1zZ2luX2xlbiA9IDA7CisKKwkJLyoKKwkJICogSWYgcmVzdGFydGluZyBBdXRvU0NTSSwgYnV0IHRoZXJlIGFyZSBzb21lIG1lc3NhZ2UgdG8gb3V0CisJCSAqIChtc2dvdXRfbGVuID4gMCksIHNldCBBdXRvQVROLCBhbmQgc2V0IFNDU0lNU0dPVVQgYXMgMAorCQkgKiAoTVZfVkFMSUQgPSAwKS4gV2hlbiBjb21tYW5kY29udHJvbCBpcyB3cml0dGVuIHdpdGgKKwkJICogQXV0b1NDU0kgcmVzdGFydCwgYXQgdGhlIHNhbWUgdGltZSBNc2dPdXRPY2N1ciBzaG91bGQgYmUKKwkJICogaGFwcGVuZWQgKGhvd2V2ZXIsIHN1Y2ggc2l0dWF0aW9uIGlzIHJlYWxseSBwb3NzaWJsZS4uLj8pLgorCQkgKi8KKwkJaWYgKGRhdGEtPm1zZ291dF9sZW4gPiAwKSB7CQorCQkJbnNwMzJfd3JpdGU0KGJhc2UsIFNDU0lfTVNHX09VVCwgMCk7CisJCQljb21tYW5kIHw9IEFVVE9fQVROOworCQl9CisKKwkJLyoKKwkJICogcmVzdGFydCBBdXRvU0NTSQorCQkgKiBJZiBpdCdzIGZhaWxlZCwgQ09NTUFORENPTlRST0xfQVVUT19DT01NQU5EX1BIQVNFIGlzIG5lZWRlZC4KKwkJICovCisJCWNvbW1hbmQgfD0gKEFVVE9fTVNHSU5fMDBfT1JfMDQgfCBBVVRPX01TR0lOXzAyKTsKKworCQkvKgorCQkgKiBJZiBjdXJyZW50IG1zZ2luMDMgaXMgVFJVRSwgdGhlbiBmbGFnIG9uLgorCQkgKi8KKwkJaWYgKGRhdGEtPmN1cl9sdW50LT5tc2dpbjAzID09IFRSVUUpIHsKKwkJCWNvbW1hbmQgfD0gQVVUT19NU0dJTl8wMzsKKwkJfQorCQlkYXRhLT5jdXJfbHVudC0+bXNnaW4wMyA9IEZBTFNFOworCX0gZWxzZSB7CisJCWRhdGEtPm1zZ2luX2xlbisrOworCX0KKworCS8qCisJICogcmVzdGFydCBBdXRvU0NTSQorCSAqLworCW5zcDMyX3Jlc3RhcnRfYXV0b3Njc2koU0NwbnQsIGNvbW1hbmQpOworCisJLyoKKwkgKiB3YWl0IFNDU0kgUkVRIG5lZ2F0ZSBmb3IgUkVRLUFDSyBoYW5kc2hha2UKKwkgKi8KKwluc3AzMl93YWl0X3JlcShkYXRhLCBORUdBVEUpOworCisJLyoKKwkgKiBuZWdhdGUgU0NTSSBBQ0sKKwkgKi8KKwluc3AzMl9zYWNrX25lZ2F0ZShkYXRhKTsKKworCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19NU0dJTk9DQ1VSLCAiZXhpdCIpOworCisJcmV0dXJuOworCisgcmVqZWN0OgorCW5zcDMyX21zZyhLRVJOX1dBUk5JTkcsIAorCQkgICJpbnZhbGlkIG9yIHVuc3VwcG9ydGVkIE1lc3NhZ2VJbiwgcmVqZWN0ZWQuICIKKwkJICAiY3VycmVudCBtc2c6IDB4JXggKGxlbjogMHgleCksIHByb2Nlc3NpbmcgbXNnOiAweCV4IiwKKwkJICBtc2csIGRhdGEtPm1zZ2luX2xlbiwgbXNndHlwZSk7CisJbnNwMzJfYnVpbGRfcmVqZWN0KFNDcG50KTsKKwlkYXRhLT5tc2dpbl9sZW4gPSAwOworCisJZ290byByZXN0YXJ0OworfQorCisvKgorICogCisgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX2FuYWx5emVfc2R0cihzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKwluc3AzMl9od19kYXRhICAgKmRhdGEgPSAobnNwMzJfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCW5zcDMyX3RhcmdldCAgICAgKnRhcmdldCAgICAgPSBkYXRhLT5jdXJfdGFyZ2V0OworCW5zcDMyX3N5bmNfdGFibGUgKnN5bmN0OworCXVuc2lnbmVkIGNoYXIgICAgIGdldF9wZXJpb2QgPSBkYXRhLT5tc2dpbmJ1ZlszXTsKKwl1bnNpZ25lZCBjaGFyICAgICBnZXRfb2Zmc2V0ID0gZGF0YS0+bXNnaW5idWZbNF07CisJaW50ICAgICAgICAgICAgICAgZW50cnk7CisJaW50ICAgICAgICAgICAgICAgc3luY251bTsKKworCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19NU0dJTk9DQ1VSLCAiZW50ZXIiKTsKKworCXN5bmN0ICAgPSBkYXRhLT5zeW5jdDsKKwlzeW5jbnVtID0gZGF0YS0+c3luY251bTsKKworCS8qCisJICogSWYgdGhpcyBpbml0aXRvciBzZW50IHRoZSBTRFRSIG1lc3NhZ2UsIHRoZW4gdGFyZ2V0IHJlc3BvbmRzIFNEVFIsCisJICogaW5pdGlhdG9yIFNZTkNSRUcsIEFDS1dJRFRIIGZyb20gU0RUUiBwYXJhbWV0ZXIuCisJICogTWVzc2FnZXMgYXJlIG5vdCBhcHByb3ByaWF0ZSwgdGhlbiBzZW5kIGJhY2sgcmVqZWN0IG1lc3NhZ2UuCisJICogSWYgaW5pdGlhdG9yIGRpZCBub3Qgc2VuZCB0aGUgU0RUUiwgYnV0IHRhcmdldCBzZW5kcyBTRFRSLCAKKwkgKiBpbml0aWF0b3IgY2FsY3VsYXRvciB0aGUgYXBwcm9wcmlhdGUgcGFyYW1ldGVyIGFuZCBzZW5kIGJhY2sgU0RUUi4KKwkgKi8JCisJaWYgKHRhcmdldC0+c3luY19mbGFnICYgU0RUUl9JTklUSUFUT1IpIHsKKwkJLyoKKwkJICogSW5pdGlhdG9yIHNlbnQgU0RUUiwgdGhlIHRhcmdldCByZXNwb25kcyBhbmQKKwkJICogc2VuZCBiYWNrIG5lZ290aWF0aW9uIFNEVFIuCisJCSAqLworCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfTVNHSU5PQ0NVUiwgInRhcmdldCByZXNwb25kcyBTRFRSIik7CisJCisJCXRhcmdldC0+c3luY19mbGFnICY9IH5TRFRSX0lOSVRJQVRPUjsKKwkJdGFyZ2V0LT5zeW5jX2ZsYWcgfD0gU0RUUl9ET05FOworCisJCS8qCisJCSAqIG9mZnNldDoKKwkJICovCisJCWlmIChnZXRfb2Zmc2V0ID4gU1lOQ19PRkZTRVQpIHsKKwkJCS8qCisJCQkgKiBOZWdvdGlhdGlvbiBpcyBmYWlsZWQsIHRoZSB0YXJnZXQgc2VuZCBiYWNrCisJCQkgKiB1bmV4cGVjdGVkIG9mZnNldCB2YWx1ZS4KKwkJCSAqLworCQkJZ290byByZWplY3Q7CisJCX0KKwkJCisJCWlmIChnZXRfb2Zmc2V0ID09IEFTWU5DX09GRlNFVCkgeworCQkJLyoKKwkJCSAqIE5lZ290aWF0aW9uIGlzIHN1Y2NlZWRlZCwgdGhlIHRhcmdldCB3YW50CisJCQkgKiB0byBmYWxsIGJhY2sgaW50byBhc3luY2hyb25vdXMgdHJhbnNmZXIgbW9kZS4KKwkJCSAqLworCQkJZ290byBhc3luYzsKKwkJfQorCisJCS8qCisJCSAqIHBlcmlvZDoKKwkJICogICAgQ2hlY2sgd2hldGhlciBzeW5jIHBlcmlvZCBpcyB0b28gc2hvcnQuIElmIHRvbyBzaG9ydCwKKwkJICogICAgZmFsbCBiYWNrIHRvIGFzeW5jIG1vZGUuIElmIGl0J3Mgb2ssIHRoZW4gaW52ZXN0aWdhdGUKKwkJICogICAgdGhlIHJlY2VpdmVkIHN5bmMgcGVyaW9kLiBJZiBzeW5jIHBlcmlvZCBpcyBhY2NlcHRhYmxlCisJCSAqICAgIGJldHdlZW4gc3luYyB0YWJsZSBzdGFydF9wZXJpb2QgYW5kIGVuZF9wZXJpb2QsIHRoZW4KKwkJICogICAgc2V0IHRoaXMgSV9UIG5leHVzIGFzIHNlbnQgb2Zmc2V0IGFuZCBwZXJpb2QuCisJCSAqICAgIElmIGl0J3Mgbm90IGFjY2VwdGFibGUsIHNlbmQgYmFjayByZWplY3QgYW5kIGZhbGwgYmFjaworCQkgKiAgICB0byBhc3luYyBtb2RlLgorCQkgKi8KKwkJaWYgKGdldF9wZXJpb2QgPCBkYXRhLT5zeW5jdFswXS5wZXJpb2RfbnVtKSB7CisJCQkvKgorCQkJICogTmVnb3RpYXRpb24gaXMgZmFpbGVkLCB0aGUgdGFyZ2V0IHNlbmQgYmFjaworCQkJICogdW5leHBlY3RlZCBwZXJpb2QgdmFsdWUuCisJCQkgKi8KKwkJCWdvdG8gcmVqZWN0OworCQl9CisKKwkJZW50cnkgPSBuc3AzMl9zZWFyY2hfcGVyaW9kX2VudHJ5KGRhdGEsIHRhcmdldCwgZ2V0X3BlcmlvZCk7CisKKwkJaWYgKGVudHJ5IDwgMCkgeworCQkJLyoKKwkJCSAqIFRhcmdldCB3YW50IHRvIHVzZSBsb25nIHBlcmlvZCB3aGljaCBpcyBub3QgCisJCQkgKiBhY2NlcHRhYmxlIE5pbmphU0NTSS0zMkJpL1VERS4KKwkJCSAqLworCQkJZ290byByZWplY3Q7CisJCX0KKworCQkvKgorCQkgKiBTZXQgbmV3IHN5bmMgdGFibGUgYW5kIG9mZnNldCBpbiB0aGlzIElfVCBuZXh1cy4KKwkJICovCisJCW5zcDMyX3NldF9zeW5jX2VudHJ5KGRhdGEsIHRhcmdldCwgZW50cnksIGdldF9vZmZzZXQpOworCX0gZWxzZSB7CisJCS8qIFRhcmdldCBzZW5kIFNEVFIgdG8gaW5pdGlhdG9yLiAqLworCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfTVNHSU5PQ0NVUiwgInRhcmdldCBzZW5kIFNEVFIiKTsKKwkKKwkJdGFyZ2V0LT5zeW5jX2ZsYWcgfD0gU0RUUl9JTklUSUFUT1I7CisKKwkJLyogb2Zmc2V0OiAqLworCQlpZiAoZ2V0X29mZnNldCA+IFNZTkNfT0ZGU0VUKSB7CisJCQkvKiBzZW5kIGJhY2sgYXMgU1lOQ19PRkZTRVQgKi8KKwkJCWdldF9vZmZzZXQgPSBTWU5DX09GRlNFVDsKKwkJfQorCisJCS8qIHBlcmlvZDogKi8KKwkJaWYgKGdldF9wZXJpb2QgPCBkYXRhLT5zeW5jdFswXS5wZXJpb2RfbnVtKSB7CisJCQlnZXRfcGVyaW9kID0gZGF0YS0+c3luY3RbMF0ucGVyaW9kX251bTsKKwkJfQorCisJCWVudHJ5ID0gbnNwMzJfc2VhcmNoX3BlcmlvZF9lbnRyeShkYXRhLCB0YXJnZXQsIGdldF9wZXJpb2QpOworCisJCWlmIChnZXRfb2Zmc2V0ID09IEFTWU5DX09GRlNFVCB8fCBlbnRyeSA8IDApIHsKKwkJCW5zcDMyX3NldF9hc3luYyhkYXRhLCB0YXJnZXQpOworCQkJbnNwMzJfYnVpbGRfc2R0cihTQ3BudCwgMCwgQVNZTkNfT0ZGU0VUKTsKKwkJfSBlbHNlIHsKKwkJCW5zcDMyX3NldF9zeW5jX2VudHJ5KGRhdGEsIHRhcmdldCwgZW50cnksIGdldF9vZmZzZXQpOworCQkJbnNwMzJfYnVpbGRfc2R0cihTQ3BudCwgZ2V0X3BlcmlvZCwgZ2V0X29mZnNldCk7CisJCX0KKwl9CisKKwl0YXJnZXQtPnBlcmlvZCA9IGdldF9wZXJpb2Q7CisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX01TR0lOT0NDVVIsICJleGl0Iik7CisJcmV0dXJuOworCisgcmVqZWN0OgorCS8qCisJICogSWYgdGhlIGN1cnJlbnQgbWVzc2FnZSBpcyB1bmFjY2VwdGFibGUsIHNlbmQgYmFjayB0byB0aGUgdGFyZ2V0CisJICogd2l0aCByZWplY3QgbWVzc2FnZS4KKwkgKi8KKwluc3AzMl9idWlsZF9yZWplY3QoU0NwbnQpOworCisgYXN5bmM6CisJbnNwMzJfc2V0X2FzeW5jKGRhdGEsIHRhcmdldCk7CS8qIHNldCBhcyBBU1lOQyB0cmFuc2ZlciBtb2RlICovCisKKwl0YXJnZXQtPnBlcmlvZCA9IDA7CisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX01TR0lOT0NDVVIsICJleGl0OiBzZXQgYXN5bmMiKTsKKwlyZXR1cm47Cit9CisKKworLyoKKyAqIFNlYXJjaCBjb25maWcgZW50cnkgbnVtYmVyIG1hdGNoZWQgaW4gc3luY190YWJsZSBmcm9tIGdpdmVuCisgKiB0YXJnZXQgYW5kIHNwZWVkIHBlcmlvZCB2YWx1ZS4gSWYgZmFpbGVkIHRvIHNlYXJjaCwgcmV0dXJuIG5lZ2F0aXZlIHZhbHVlLgorICovCitzdGF0aWMgaW50IG5zcDMyX3NlYXJjaF9wZXJpb2RfZW50cnkobnNwMzJfaHdfZGF0YSAqZGF0YSwKKwkJCQkgICAgIG5zcDMyX3RhcmdldCAgKnRhcmdldCwKKwkJCQkgICAgIHVuc2lnbmVkIGNoYXIgIHBlcmlvZCkKK3sKKwlpbnQgaTsKKworCWlmICh0YXJnZXQtPmxpbWl0X2VudHJ5ID49IGRhdGEtPnN5bmNudW0pIHsKKwkJbnNwMzJfbXNnKEtFUk5fRVJSLCAibGltaXRfZW50cnkgZXhjZWVkcyBzeW5jbnVtISIpOworCQl0YXJnZXQtPmxpbWl0X2VudHJ5ID0gMDsKKwl9CisKKwlmb3IgKGkgPSB0YXJnZXQtPmxpbWl0X2VudHJ5OyBpIDwgZGF0YS0+c3luY251bTsgaSsrKSB7CisJCWlmIChwZXJpb2QgPj0gZGF0YS0+c3luY3RbaV0uc3RhcnRfcGVyaW9kICYmCisJCSAgICBwZXJpb2QgPD0gZGF0YS0+c3luY3RbaV0uZW5kX3BlcmlvZCkgeworCQkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBDaGVjayBnaXZlbiBwZXJpb2QgdmFsdWUgaXMgb3ZlciB0aGUgc3luY190YWJsZSB2YWx1ZS4KKwkgKiBJZiBzbywgcmV0dXJuIG1heCB2YWx1ZS4KKwkgKi8KKwlpZiAoaSA9PSBkYXRhLT5zeW5jbnVtKSB7CisJCWkgPSAtMTsKKwl9CisKKwlyZXR1cm4gaTsKK30KKworCisvKgorICogdGFyZ2V0IDwtPiBpbml0aWF0b3IgdXNlIEFTWU5DIHRyYW5zZmVyCisgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX3NldF9hc3luYyhuc3AzMl9od19kYXRhICpkYXRhLCBuc3AzMl90YXJnZXQgKnRhcmdldCkKK3sKKwl1bnNpZ25lZCBjaGFyIHBlcmlvZCA9IGRhdGEtPnN5bmN0W3RhcmdldC0+bGltaXRfZW50cnldLnBlcmlvZF9udW07CisKKwl0YXJnZXQtPm9mZnNldCAgICAgPSBBU1lOQ19PRkZTRVQ7CisJdGFyZ2V0LT5wZXJpb2QgICAgID0gMDsKKwl0YXJnZXQtPnN5bmNyZWcgICAgPSBUT19TWU5DUkVHKHBlcmlvZCwgQVNZTkNfT0ZGU0VUKTsKKwl0YXJnZXQtPmFja3dpZHRoICAgPSAwOworCXRhcmdldC0+c2FtcGxlX3JlZyA9IDA7CisKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfU1lOQywgInNldCBhc3luYyIpOworfQorCisKKy8qCisgKiB0YXJnZXQgPC0+IGluaXRpYXRvciB1c2UgbWF4aW11bSBTWU5DIHRyYW5zZmVyCisgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX3NldF9tYXhfc3luYyhuc3AzMl9od19kYXRhICpkYXRhLAorCQkJICAgICAgIG5zcDMyX3RhcmdldCAgKnRhcmdldCwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpwZXJpb2QsCisJCQkgICAgICAgdW5zaWduZWQgY2hhciAqb2Zmc2V0KQoreworCXVuc2lnbmVkIGNoYXIgcGVyaW9kX251bSwgYWNrd2lkdGg7CisKKwlwZXJpb2RfbnVtID0gZGF0YS0+c3luY3RbdGFyZ2V0LT5saW1pdF9lbnRyeV0ucGVyaW9kX251bTsKKwkqcGVyaW9kICAgID0gZGF0YS0+c3luY3RbdGFyZ2V0LT5saW1pdF9lbnRyeV0uc3RhcnRfcGVyaW9kOworCWFja3dpZHRoICAgPSBkYXRhLT5zeW5jdFt0YXJnZXQtPmxpbWl0X2VudHJ5XS5hY2t3aWR0aDsKKwkqb2Zmc2V0ICAgID0gU1lOQ19PRkZTRVQ7CisKKwl0YXJnZXQtPnN5bmNyZWcgICAgPSBUT19TWU5DUkVHKHBlcmlvZF9udW0sICpvZmZzZXQpOworCXRhcmdldC0+YWNrd2lkdGggICA9IGFja3dpZHRoOworCXRhcmdldC0+b2Zmc2V0ICAgICA9ICpvZmZzZXQ7CisJdGFyZ2V0LT5zYW1wbGVfcmVnID0gMDsgICAgICAgLyogZGlzYWJsZSBTUkVRIHNhbXBsaW5nICovCit9CisKKworLyoKKyAqIHRhcmdldCA8LT4gaW5pdGlhdG9yIHVzZSBlbnRyeSBudW1iZXIgc3BlZWQKKyAqLworc3RhdGljIHZvaWQgbnNwMzJfc2V0X3N5bmNfZW50cnkobnNwMzJfaHdfZGF0YSAqZGF0YSwKKwkJCQkgbnNwMzJfdGFyZ2V0ICAqdGFyZ2V0LAorCQkJCSBpbnQgICAgICAgICAgICBlbnRyeSwKKwkJCQkgdW5zaWduZWQgY2hhciAgb2Zmc2V0KQoreworCXVuc2lnbmVkIGNoYXIgcGVyaW9kLCBhY2t3aWR0aCwgc2FtcGxlX3JhdGU7CisKKwlwZXJpb2QgICAgICA9IGRhdGEtPnN5bmN0W2VudHJ5XS5wZXJpb2RfbnVtOworCWFja3dpZHRoICAgID0gZGF0YS0+c3luY3RbZW50cnldLmFja3dpZHRoOworCW9mZnNldCAgICAgID0gb2Zmc2V0OworCXNhbXBsZV9yYXRlID0gZGF0YS0+c3luY3RbZW50cnldLnNhbXBsZV9yYXRlOworCisJdGFyZ2V0LT5zeW5jcmVnICAgID0gVE9fU1lOQ1JFRyhwZXJpb2QsIG9mZnNldCk7CisJdGFyZ2V0LT5hY2t3aWR0aCAgID0gYWNrd2lkdGg7CisJdGFyZ2V0LT5vZmZzZXQgICAgID0gb2Zmc2V0OworCXRhcmdldC0+c2FtcGxlX3JlZyA9IHNhbXBsZV9yYXRlIHwgU0FNUExJTkdfRU5BQkxFOworCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX1NZTkMsICJzZXQgc3luYyIpOworfQorCisKKy8qCisgKiBJdCB3YWl0cyB1bnRpbCBTQ1NJIFJFUSBiZWNvbWVzIGFzc2VydGlvbiBvciBuZWdhdGlvbiBzdGF0ZS4KKyAqCisgKiBOb3RlOiBJZiBuc3AzMl9tc2dpbl9vY2N1ciBpcyBjYWxsZWQsIHdlIGFzc2VydHMgU0NTSSBBQ0suIFRoZW4KKyAqICAgICBjb25uZWN0ZWQgdGFyZ2V0IHJlc3BvbmRzIFNDU0kgUkVRIG5lZ2F0aW9uLiAgV2UgaGF2ZSB0byB3YWl0CisgKiAgICAgU0NTSSBSRVEgYmVjb21lcyBuZWdhdGlvbiBpbiBvcmRlciB0byBuZWdhdGUgU0NTSSBBQ0sgc2lnbmFsIGZvcgorICogICAgIFJFUS1BQ0sgaGFuZHNoYWtlLgorICovCitzdGF0aWMgdm9pZCBuc3AzMl93YWl0X3JlcShuc3AzMl9od19kYXRhICpkYXRhLCBpbnQgc3RhdGUpCit7CisJdW5zaWduZWQgaW50ICBiYXNlICAgICAgPSBkYXRhLT5CYXNlQWRkcmVzczsKKwlpbnQgICAgICAgICAgIHdhaXRfdGltZSA9IDA7CisJdW5zaWduZWQgY2hhciBidXMsIHJlcV9iaXQ7CisKKwlpZiAoISgoc3RhdGUgPT0gQVNTRVJUKSB8fCAoc3RhdGUgPT0gTkVHQVRFKSkpIHsKKwkJbnNwMzJfbXNnKEtFUk5fRVJSLCAidW5rbm93biBzdGF0ZSBkZXNpZ25hdGlvbiIpOworCX0KKwkvKiBSRVEgaXMgQklUKDUpICovCisJcmVxX2JpdCA9IChzdGF0ZSA9PSBBU1NFUlQgPyBCVVNNT05fUkVRIDogMCk7CisKKwlkbyB7CisJCWJ1cyA9IG5zcDMyX3JlYWQxKGJhc2UsIFNDU0lfQlVTX01PTklUT1IpOworCQlpZiAoKGJ1cyAmIEJVU01PTl9SRVEpID09IHJlcV9iaXQpIHsKKwkJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19XQUlULCAKKwkJCQkgICJ3YWl0X3RpbWU6ICVkIiwgd2FpdF90aW1lKTsKKwkJCXJldHVybjsKKwkJfQorCQl1ZGVsYXkoMSk7CisJCXdhaXRfdGltZSsrOworCX0gd2hpbGUgKHdhaXRfdGltZSA8IFJFUVNBQ0tfVElNRU9VVF9USU1FKTsKKworCW5zcDMyX21zZyhLRVJOX1dBUk5JTkcsICJ3YWl0IFJFUSB0aW1lb3V0LCByZXFfYml0OiAweCV4IiwgcmVxX2JpdCk7Cit9CisKKy8qCisgKiBJdCB3YWl0cyB1bnRpbCBTQ1NJIFNBQ0sgYmVjb21lcyBhc3NlcnRpb24gb3IgbmVnYXRpb24gc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX3dhaXRfc2Fjayhuc3AzMl9od19kYXRhICpkYXRhLCBpbnQgc3RhdGUpCit7CisJdW5zaWduZWQgaW50ICBiYXNlICAgICAgPSBkYXRhLT5CYXNlQWRkcmVzczsKKwlpbnQgICAgICAgICAgIHdhaXRfdGltZSA9IDA7CisJdW5zaWduZWQgY2hhciBidXMsIGFja19iaXQ7CisKKwlpZiAoISgoc3RhdGUgPT0gQVNTRVJUKSB8fCAoc3RhdGUgPT0gTkVHQVRFKSkpIHsKKwkJbnNwMzJfbXNnKEtFUk5fRVJSLCAidW5rbm93biBzdGF0ZSBkZXNpZ25hdGlvbiIpOworCX0KKwkvKiBBQ0sgaXMgQklUKDQpICovCisJYWNrX2JpdCA9IChzdGF0ZSA9PSBBU1NFUlQgPyBCVVNNT05fQUNLIDogMCk7CisKKwlkbyB7CisJCWJ1cyA9IG5zcDMyX3JlYWQxKGJhc2UsIFNDU0lfQlVTX01PTklUT1IpOworCQlpZiAoKGJ1cyAmIEJVU01PTl9BQ0spID09IGFja19iaXQpIHsKKwkJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19XQUlULAorCQkJCSAgIndhaXRfdGltZTogJWQiLCB3YWl0X3RpbWUpOworCQkJcmV0dXJuOworCQl9CisJCXVkZWxheSgxKTsKKwkJd2FpdF90aW1lKys7CisJfSB3aGlsZSAod2FpdF90aW1lIDwgUkVRU0FDS19USU1FT1VUX1RJTUUpOworCisJbnNwMzJfbXNnKEtFUk5fV0FSTklORywgIndhaXQgU0FDSyB0aW1lb3V0LCBhY2tfYml0OiAweCV4IiwgYWNrX2JpdCk7Cit9CisKKy8qCisgKiBhc3NlcnQgU0NTSSBBQ0sKKyAqCisgKiBOb3RlOiBTQ1NJIEFDSyBhc3NlcnRpb24gbmVlZHMgd2l0aCBBQ0tFTkI9MSwgQVVUT0RJUkVDVElPTj0xLgorICovCitzdGF0aWMgdm9pZCBuc3AzMl9zYWNrX2Fzc2VydChuc3AzMl9od19kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGludCAgYmFzZSA9IGRhdGEtPkJhc2VBZGRyZXNzOworCXVuc2lnbmVkIGNoYXIgYnVzY3RybDsKKworCWJ1c2N0cmwgID0gbnNwMzJfcmVhZDEoYmFzZSwgU0NTSV9CVVNfQ09OVFJPTCk7CisJYnVzY3RybAl8PSAoQlVTQ1RMX0FDSyB8IEFVVE9ESVJFQ1RJT04gfCBBQ0tFTkIpOworCW5zcDMyX3dyaXRlMShiYXNlLCBTQ1NJX0JVU19DT05UUk9MLCBidXNjdHJsKTsKK30KKworLyoKKyAqIG5lZ2F0ZSBTQ1NJIEFDSworICovCitzdGF0aWMgdm9pZCBuc3AzMl9zYWNrX25lZ2F0ZShuc3AzMl9od19kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGludCAgYmFzZSA9IGRhdGEtPkJhc2VBZGRyZXNzOworCXVuc2lnbmVkIGNoYXIgYnVzY3RybDsKKworCWJ1c2N0cmwgID0gbnNwMzJfcmVhZDEoYmFzZSwgU0NTSV9CVVNfQ09OVFJPTCk7CisJYnVzY3RybAkmPSB+QlVTQ1RMX0FDSzsKKwluc3AzMl93cml0ZTEoYmFzZSwgU0NTSV9CVVNfQ09OVFJPTCwgYnVzY3RybCk7Cit9CisKKworCisvKgorICogTm90ZTogbl9pb19wb3J0IGlzIGRlZmluZWQgYXMgMHg3ZiBiZWNhdXNlIEkvTyByZWdpc3RlciBwb3J0IGlzCisgKgkgYXNzaWduZWQgYXM6CisgKgkweDgwMC0weDhmZjogbWVtb3J5IG1hcHBlZCBJL08gcG9ydAorICoJMHg5MDAtMHhiZmY6IChtYXAgc2FtZSAweDgwMC0weDhmZiBJL08gcG9ydCBpbWFnZSByZXBlYXRlZGx5KQorICoJMHhjMDAtMHhmZmY6IENhcmRCdXMgc3RhdHVzIHJlZ2lzdGVycworICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw3MykpCisjZGVmaW5lIERFVEVDVF9PSyAwCisjZGVmaW5lIERFVEVDVF9ORyAxCisjZGVmaW5lIFBDSURFViAgICBwZGV2CitzdGF0aWMgaW50IG5zcDMyX2RldGVjdChzdHJ1Y3QgcGNpX2RldiAqcGRldikKKyNlbHNlCisjZGVmaW5lIERFVEVDVF9PSyAxCisjZGVmaW5lIERFVEVDVF9ORyAwCisjZGVmaW5lIFBDSURFViAgICAoZGF0YS0+UGNpKQorc3RhdGljIGludCBuc3AzMl9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICpzaHQpCisjZW5kaWYKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwkvKiByZWdpc3RlcmVkIGhvc3Qgc3RydWN0dXJlICovCisJc3RydWN0IHJlc291cmNlICAqcmVzOworCW5zcDMyX2h3X2RhdGEgICAgKmRhdGE7CisJaW50ICAgICAgICAgICAgICAgcmV0OworCWludCAgICAgICAgICAgICAgIGksIGo7CisKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfUkVHSVNURVIsICJlbnRlciIpOworCisJLyoKKwkgKiByZWdpc3RlciB0aGlzIEhCQSBhcyBTQ1NJIGRldmljZQorCSAqLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNzMpKQorCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJm5zcDMyX3RlbXBsYXRlLCBzaXplb2YobnNwMzJfaHdfZGF0YSkpOworI2Vsc2UKKwlob3N0ID0gc2NzaV9yZWdpc3RlcihzaHQsIHNpemVvZihuc3AzMl9od19kYXRhKSk7CisjZW5kaWYKKwlpZiAoaG9zdCA9PSBOVUxMKSB7CisJCW5zcDMyX21zZyAoS0VSTl9FUlIsICJmYWlsZWQgdG8gc2NzaSByZWdpc3RlciIpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKgorCSAqIHNldCBuc3AzMl9od19kYXRhCisJICovCisJZGF0YSA9IChuc3AzMl9od19kYXRhICopaG9zdC0+aG9zdGRhdGE7CisKKwltZW1jcHkoZGF0YSwgJm5zcDMyX2RhdGFfYmFzZSwgc2l6ZW9mKG5zcDMyX2h3X2RhdGEpKTsKKworCWhvc3QtPmlycSAgICAgICA9IGRhdGEtPklycU51bWJlcjsKKwlob3N0LT5pb19wb3J0ICAgPSBkYXRhLT5CYXNlQWRkcmVzczsKKwlob3N0LT51bmlxdWVfaWQgPSBkYXRhLT5CYXNlQWRkcmVzczsKKwlob3N0LT5uX2lvX3BvcnQJPSBkYXRhLT5OdW1BZGRyZXNzOworCWhvc3QtPmJhc2UgICAgICA9ICh1bnNpZ25lZCBsb25nKWRhdGEtPk1taW9BZGRyZXNzOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNjMpKQorCXNjc2lfc2V0X2RldmljZShob3N0LCAmUENJREVWLT5kZXYpOworI2Vsc2UKKwlzY3NpX3NldF9wY2lfZGV2aWNlKGhvc3QsIFBDSURFVik7CisjZW5kaWYKKworCWRhdGEtPkhvc3QgICAgICA9IGhvc3Q7CisJc3Bpbl9sb2NrX2luaXQoJihkYXRhLT5Mb2NrKSk7CisKKwlkYXRhLT5jdXJfbHVudCAgID0gTlVMTDsKKwlkYXRhLT5jdXJfdGFyZ2V0ID0gTlVMTDsKKworCS8qCisJICogQnVzIG1hc3RlciB0cmFuc2ZlciBtb2RlIGlzIHN1cHBvcnRlZCBjdXJyZW50bHkuCisJICovCisJZGF0YS0+dHJhbnNfbWV0aG9kID0gTlNQMzJfVFJBTlNGRVJfQlVTTUFTVEVSOworCisJLyoKKwkgKiBTZXQgY2xvY2sgZGl2LCBDTE9DS180IChIQkEgaGFzIG93biBleHRlcm5hbCBjbG9jaywgYW5kCisJICogZGl2aWRpbmcgKiAxMDBucy80KS4KKwkgKiBDdXJyZW50bHkgQ0xPQ0tfNCBoYXMgb25seSB0ZXN0ZWQsIG5vdCBmb3IgQ0xPQ0tfMi9QQ0lDTEsgeWV0LgorCSAqLworCWRhdGEtPmNsb2NrID0gQ0xPQ0tfNDsKKworCS8qCisJICogU2VsZWN0IGFwcHJvcHJpYXRlIG5zcDMyX3N5bmNfdGFibGUgYW5kIHNldCBJX0NMT0NLRElWLgorCSAqLworCXN3aXRjaCAoZGF0YS0+Y2xvY2spIHsKKwljYXNlIENMT0NLXzQ6CisJCS8qIElmIGRhdGEtPmNsb2NrIGlzIENMT0NLXzQsIHRoZW4gc2VsZWN0IDQwTSBzeW5jIHRhYmxlLiAqLworCQlkYXRhLT5zeW5jdCAgID0gbnNwMzJfc3luY190YWJsZV80ME07CisJCWRhdGEtPnN5bmNudW0gPSBBUlJBWV9TSVpFKG5zcDMyX3N5bmNfdGFibGVfNDBNKTsKKwkJYnJlYWs7CisJY2FzZSBDTE9DS18yOgorCQkvKiBJZiBkYXRhLT5jbG9jayBpcyBDTE9DS18yLCB0aGVuIHNlbGVjdCAyME0gc3luYyB0YWJsZS4gKi8KKwkJZGF0YS0+c3luY3QgICA9IG5zcDMyX3N5bmNfdGFibGVfMjBNOworCQlkYXRhLT5zeW5jbnVtID0gQVJSQVlfU0laRShuc3AzMl9zeW5jX3RhYmxlXzIwTSk7CisJCWJyZWFrOworCWNhc2UgUENJQ0xLOgorCQkvKiBJZiBkYXRhLT5jbG9jayBpcyBQQ0lDTEssIHRoZW4gc2VsZWN0IHBjaSBzeW5jIHRhYmxlLiAqLworCQlkYXRhLT5zeW5jdCAgID0gbnNwMzJfc3luY190YWJsZV9wY2k7CisJCWRhdGEtPnN5bmNudW0gPSBBUlJBWV9TSVpFKG5zcDMyX3N5bmNfdGFibGVfcGNpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbnNwMzJfbXNnKEtFUk5fV0FSTklORywKKwkJCSAgIkludmFsaWQgY2xvY2sgZGl2IGlzIHNlbGVjdGVkLCBzZXQgQ0xPQ0tfNC4iKTsKKwkJLyogVXNlIGRlZmF1bHQgdmFsdWUgQ0xPQ0tfNCAqLworCQlkYXRhLT5jbG9jayAgID0gQ0xPQ0tfNDsKKwkJZGF0YS0+c3luY3QgICA9IG5zcDMyX3N5bmNfdGFibGVfNDBNOworCQlkYXRhLT5zeW5jbnVtID0gQVJSQVlfU0laRShuc3AzMl9zeW5jX3RhYmxlXzQwTSk7CisJfQorCisJLyoKKwkgKiBzZXR1cCBuc3AzMl9sdW50CisJICovCisKKwkvKgorCSAqIHNldHVwIERNQSAKKwkgKi8KKwlpZiAocGNpX3NldF9kbWFfbWFzayhQQ0lERVYsIDB4ZmZmZmZmZmZVTCkgIT0gMCkgeworCQluc3AzMl9tc2cgKEtFUk5fRVJSLCAiZmFpbGVkIHRvIHNldCBQQ0kgRE1BIG1hc2siKTsKKwkJZ290byBzY3NpX3VucmVnaXN0ZXI7CisJfQorCisJLyoKKwkgKiBhbGxvY2F0ZSBhdXRvcGFyYW0gRE1BIHJlc291cmNlLgorCSAqLworCWRhdGEtPmF1dG9wYXJhbSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KFBDSURFViwgc2l6ZW9mKG5zcDMyX2F1dG9wYXJhbSksICYoZGF0YS0+YXV0b19wYWRkcikpOworCWlmIChkYXRhLT5hdXRvcGFyYW0gPT0gTlVMTCkgeworCQluc3AzMl9tc2coS0VSTl9FUlIsICJmYWlsZWQgdG8gYWxsb2NhdGUgRE1BIG1lbW9yeSIpOworCQlnb3RvIHNjc2lfdW5yZWdpc3RlcjsKKwl9CisKKwkvKgorCSAqIGFsbG9jYXRlIHNjYXR0ZXItZ2F0aGVyIERNQSByZXNvdXJjZS4KKwkgKi8KKwlkYXRhLT5zZ19saXN0ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoUENJREVWLCBOU1AzMl9TR19UQUJMRV9TSVpFLAorCQkJCQkgICAgICYoZGF0YS0+c2dfcGFkZHIpKTsKKwlpZiAoZGF0YS0+c2dfbGlzdCA9PSBOVUxMKSB7CisJCW5zcDMyX21zZyhLRVJOX0VSUiwgImZhaWxlZCB0byBhbGxvY2F0ZSBETUEgbWVtb3J5Iik7CisJCWdvdG8gZnJlZV9hdXRvcGFyYW07CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGF0YS0+bHVudCk7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShkYXRhLT5sdW50WzBdKTsgaisrKSB7CisJCQlpbnQgb2Zmc2V0ID0gaSAqIEFSUkFZX1NJWkUoZGF0YS0+bHVudFswXSkgKyBqOworCQkJbnNwMzJfbHVudCB0bXAgPSB7CisJCQkJLlNDcG50ICAgICAgID0gTlVMTCwKKwkJCQkuc2F2ZV9kYXRwICAgPSAwLAorCQkJCS5tc2dpbjAzICAgICA9IEZBTFNFLAorCQkJCS5zZ19udW0gICAgICA9IDAsCisJCQkJLmN1cl9lbnRyeSAgID0gMCwKKwkJCQkuc2dsdW4gICAgICAgPSAmKGRhdGEtPnNnX2xpc3Rbb2Zmc2V0XSksCisJCQkJLnNnbHVuX3BhZGRyID0gZGF0YS0+c2dfcGFkZHIgKyAob2Zmc2V0ICogc2l6ZW9mKG5zcDMyX3NnbHVuKSksCisJCQl9OworCisJCQlkYXRhLT5sdW50W2ldW2pdID0gdG1wOworCQl9CisJfQorCisJLyoKKwkgKiBzZXR1cCB0YXJnZXQKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYXRhLT50YXJnZXQpOyBpKyspIHsKKwkJbnNwMzJfdGFyZ2V0ICp0YXJnZXQgPSAmKGRhdGEtPnRhcmdldFtpXSk7CisKKwkJdGFyZ2V0LT5saW1pdF9lbnRyeSAgPSAwOworCQl0YXJnZXQtPnN5bmNfZmxhZyAgICA9IDA7CisJCW5zcDMyX3NldF9hc3luYyhkYXRhLCB0YXJnZXQpOworCX0KKworCS8qCisJICogRUVQUk9NIGNoZWNrCisJICovCisJcmV0ID0gbnNwMzJfZ2V0cHJvbV9wYXJhbShkYXRhKTsKKwlpZiAocmV0ID09IEZBTFNFKSB7CisJCWRhdGEtPnJlc2V0dGltZSA9IDM7CS8qIGRlZmF1bHQgMyAqLworCX0KKworCS8qCisJICogc2V0dXAgSEJBCisJICovCisJbnNwMzJod19pbml0KGRhdGEpOworCisJc25wcmludGYoZGF0YS0+aW5mb19zdHIsIHNpemVvZihkYXRhLT5pbmZvX3N0ciksCisJCSAiTmluamFTQ1NJLTMyQmkvVURFOiBpcnEgJWQsIGlvIDB4JWx4KzB4JXgiLAorCQkgaG9zdC0+aXJxLCBob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQpOworCisJLyoKKwkgKiBTQ1NJIGJ1cyByZXNldAorCSAqCisJICogTm90ZTogSXQncyBpbXBvcnRhbnQgdG8gcmVzZXQgU0NTSSBidXMgaW4gaW5pdGlhbGl6YXRpb24gcGhhc2UuCisJICogICAgIE5pbmphU0NTSS0zMkJpL1VERSBIQkEgRUVQUk9NIHNlZW1zIHRvIGV4Y2hhbmdlIFNEVFIgd2hlbgorCSAqICAgICBzeXN0ZW0gaXMgY29taW5nIHVwLCBzbyBTQ1NJIGRldmljZXMgY29ubmVjdGVkIHRvIEhCQSBpcyBzZXQgYXMKKwkgKiAgICAgdW4tYXN5bmNocm9ub3VzIG1vZGUuICBJdCBicmluZ3MgdGhlIG1lcml0IHRoYXQgdGhpcyBIQkEgaXMKKwkgKiAgICAgcmVhZHkgdG8gc3RhcnQgc3luY2hyb25vdXMgdHJhbnNmZXIgd2l0aG91dCBhbnkgcHJlcGFyYXRpb24sCisJICogICAgIGJ1dCB3ZSBhcmUgZGlmZmljdWx0IHRvIGNvbnRyb2wgdHJhbnNmZXIgc3BlZWQuICBJbiBhZGRpdGlvbiwKKwkgKiAgICAgaXQgcHJldmVudHMgZGV2aWNlIHRyYW5zZmVyIHNwZWVkIGZyb20gZWZmZWN0aW5nIEVFUFJPTSBzdGFydC11cAorCSAqICAgICBTRFRSLiAgTmluamFTQ1NJLTMyQmkvVURFIGhhcyB0aGUgZmVhdHVyZSBpZiBFRVBST00gaXMgc2V0IGFzCisJICogICAgIEF1dG8gTW9kZSwgdGhlbiBGQVNULTEwTSBpcyBzZWxlY3RlZCB3aGVuIFNDU0kgZGV2aWNlcyBhcmUKKwkgKiAgICAgY29ubmVjdGVkIHNhbWUgb3IgbW9yZSB0aGFuIDQgZGV2aWNlcy4gIEl0IHNob3VsZCBiZSBhdm9pZGVkCisJICogICAgIGRlcGVuZGluZyBvbiB0aGlzIHNwZWNpZmljYXRpb24uIFRodXMsIHJlc2V0dGluZyB0aGUgU0NTSSBidXMKKwkgKiAgICAgcmVzdG9yZXMgYWxsIGNvbm5lY3RlZCBTQ1NJIGRldmljZXMgdG8gYXN5bmNocm9ub3VzIG1vZGUsIHRoZW4KKwkgKiAgICAgdGhpcyBkcml2ZXIgc2V0IFNEVFIgc2FmZWx5IGxhdGVyLCBhbmQgd2UgY2FuIGNvbnRyb2wgYWxsIFNDU0kKKwkgKiAgICAgZGV2aWNlIHRyYW5zZmVyIG1vZGUuCisJICovCisJbnNwMzJfZG9fYnVzX3Jlc2V0KGRhdGEpOworCisJcmV0ID0gcmVxdWVzdF9pcnEoaG9zdC0+aXJxLCBkb19uc3AzMl9pc3IsCisJCQkgIFNBX1NISVJRIHwgU0FfU0FNUExFX1JBTkRPTSwgIm5zcDMyIiwgZGF0YSk7CisJaWYgKHJldCA8IDApIHsKKwkJbnNwMzJfbXNnKEtFUk5fRVJSLCAiVW5hYmxlIHRvIGFsbG9jYXRlIElSUSBmb3IgTmluamFTQ1NJMzIgIgorCQkJICAiU0NTSSBQQ0kgY29udHJvbGxlci4gSW50ZXJydXB0OiAlZCIsIGhvc3QtPmlycSk7CisJCWdvdG8gZnJlZV9zZ19saXN0OworCX0KKworICAgICAgICAvKgorICAgICAgICAgKiBQQ0kgSU8gcmVnaXN0ZXIKKyAgICAgICAgICovCisJcmVzID0gcmVxdWVzdF9yZWdpb24oaG9zdC0+aW9fcG9ydCwgaG9zdC0+bl9pb19wb3J0LCAibnNwMzIiKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJbnNwMzJfbXNnKEtFUk5fRVJSLCAKKwkJCSAgIkkvTyByZWdpb24gMHglbHgrMHglbHggaXMgYWxyZWFkeSB1c2VkIiwKKwkJCSAgZGF0YS0+QmFzZUFkZHJlc3MsIGRhdGEtPk51bUFkZHJlc3MpOworCQlnb3RvIGZyZWVfaXJxOworICAgICAgICB9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDczKSkKKwlzY3NpX2FkZF9ob3N0IChob3N0LCAmUENJREVWLT5kZXYpOworCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworI2VuZGlmCisJcGNpX3NldF9kcnZkYXRhKFBDSURFViwgaG9zdCk7CisJcmV0dXJuIERFVEVDVF9PSzsKKworIGZyZWVfaXJxOgorCWZyZWVfaXJxKGhvc3QtPmlycSwgZGF0YSk7CisKKyBmcmVlX3NnX2xpc3Q6CisJcGNpX2ZyZWVfY29uc2lzdGVudChQQ0lERVYsIE5TUDMyX1NHX1RBQkxFX1NJWkUsCisJCQkgICAgZGF0YS0+c2dfbGlzdCwgZGF0YS0+c2dfcGFkZHIpOworCisgZnJlZV9hdXRvcGFyYW06CisJcGNpX2ZyZWVfY29uc2lzdGVudChQQ0lERVYsIHNpemVvZihuc3AzMl9hdXRvcGFyYW0pLAorCQkJICAgIGRhdGEtPmF1dG9wYXJhbSwgZGF0YS0+YXV0b19wYWRkcik7CisJCisgc2NzaV91bnJlZ2lzdGVyOgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisKKyBlcnI6CisJcmV0dXJuIERFVEVDVF9ORzsKK30KKyN1bmRlZiBERVRFQ1RfT0sKKyN1bmRlZiBERVRFQ1RfTkcKKyN1bmRlZiBQQ0lERVYKKworc3RhdGljIGludCBuc3AzMl9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJbnNwMzJfaHdfZGF0YSAqZGF0YSA9IChuc3AzMl9od19kYXRhICopaG9zdC0+aG9zdGRhdGE7CisKKwlpZiAoZGF0YS0+YXV0b3BhcmFtKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGF0YS0+UGNpLCBzaXplb2YobnNwMzJfYXV0b3BhcmFtKSwKKwkJCQkgICAgZGF0YS0+YXV0b3BhcmFtLCBkYXRhLT5hdXRvX3BhZGRyKTsKKwl9CisKKwlpZiAoZGF0YS0+c2dfbGlzdCkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRhdGEtPlBjaSwgTlNQMzJfU0dfVEFCTEVfU0laRSwKKwkJCQkgICAgZGF0YS0+c2dfbGlzdCwgZGF0YS0+c2dfcGFkZHIpOworCX0KKworCWlmIChob3N0LT5pcnEpIHsKKwkJZnJlZV9pcnEoaG9zdC0+aXJxLCBkYXRhKTsKKwl9CisKKwlpZiAoaG9zdC0+aW9fcG9ydCAmJiBob3N0LT5uX2lvX3BvcnQpIHsKKwkJcmVsZWFzZV9yZWdpb24oaG9zdC0+aW9fcG9ydCwgaG9zdC0+bl9pb19wb3J0KTsKKwl9CisKKwlpZiAoZGF0YS0+TW1pb0FkZHJlc3MpIHsKKwkJaW91bm1hcChkYXRhLT5NbWlvQWRkcmVzcyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpuc3AzMl9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCW5zcDMyX2h3X2RhdGEgKmRhdGEgPSAobnNwMzJfaHdfZGF0YSAqKXNocG50LT5ob3N0ZGF0YTsKKworCXJldHVybiBkYXRhLT5pbmZvX3N0cjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXJyb3IgaGFuZGxlcgorICovCitzdGF0aWMgaW50IG5zcDMyX2VoX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCW5zcDMyX2h3X2RhdGEgKmRhdGEgPSAobnNwMzJfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGludCAgIGJhc2UgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OworCisJbnNwMzJfbXNnKEtFUk5fV0FSTklORywgImFib3J0Iik7CisKKwlpZiAoZGF0YS0+Y3VyX2x1bnQtPlNDcG50ID09IE5VTEwpIHsKKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0JVU1JFU0VULCAiYWJvcnQgZmFpbGVkIik7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJaWYgKGRhdGEtPmN1cl90YXJnZXQtPnN5bmNfZmxhZyAmIChTRFRSX0lOSVRJQVRPUiB8IFNEVFJfVEFSR0VUKSkgeworCQkvKiByZXNldCBTRFRSIG5lZ290aWF0aW9uICovCisJCWRhdGEtPmN1cl90YXJnZXQtPnN5bmNfZmxhZyA9IDA7CisJCW5zcDMyX3NldF9hc3luYyhkYXRhLCBkYXRhLT5jdXJfdGFyZ2V0KTsKKwl9CisKKwluc3AzMl93cml0ZTIoYmFzZSwgVFJBTlNGRVJfQ09OVFJPTCwgMCk7CisJbnNwMzJfd3JpdGUyKGJhc2UsIEJNX0NOVCwgICAgICAgICAgIDApOworCisJU0NwbnQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKwluc3AzMl9zY3NpX2RvbmUoU0NwbnQpOworCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0JVU1JFU0VULCAiYWJvcnQgc3VjY2VzcyIpOworCXJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgaW50IG5zcDMyX2VoX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKwluc3AzMl9od19kYXRhICpkYXRhID0gKG5zcDMyX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBpbnQgICBiYXNlID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKKworCW5zcDMyX21zZyhLRVJOX0lORk8sICJCdXMgUmVzZXQiKTsJCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0JVU1JFU0VULCAiU0NwbnQ9MHgleCIsIFNDcG50KTsKKworCW5zcDMyX3dyaXRlMihiYXNlLCBJUlFfQ09OVFJPTCwgSVJRX0NPTlRST0xfQUxMX0lSUV9NQVNLKTsKKwluc3AzMl9kb19idXNfcmVzZXQoZGF0YSk7CisJbnNwMzJfd3JpdGUyKGJhc2UsIElSUV9DT05UUk9MLCAwKTsKKworCXJldHVybiBTVUNDRVNTOwkvKiBTQ1NJIGJ1cyByZXNldCBpcyBzdWNjZWVkZWQgYXQgYW55IHRpbWUuICovCit9CisKK3N0YXRpYyB2b2lkIG5zcDMyX2RvX2J1c19yZXNldChuc3AzMl9od19kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGludCAgIGJhc2UgPSBkYXRhLT5CYXNlQWRkcmVzczsKKwl1bnNpZ25lZCBzaG9ydCBpbnRyZGF0OworCWludCBpOworCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0JVU1JFU0VULCAiaW4iKTsKKworCS8qCisJICogc3RvcCBhbGwgdHJhbnNmZXIKKwkgKiBjbGVhciBUUkFOU0ZFUkNPTlRST0xfQk1fU1RBUlQKKwkgKiBjbGVhciBjb3VudGVyCisJICovCisJbnNwMzJfd3JpdGUyKGJhc2UsIFRSQU5TRkVSX0NPTlRST0wsIDApOworCW5zcDMyX3dyaXRlNChiYXNlLCBCTV9DTlQsICAgICAgICAgICAwKTsKKwluc3AzMl93cml0ZTQoYmFzZSwgQ0xSX0NPVU5URVIsICAgICAgQ0xSQ09VTlRFUl9BTExNQVNLKTsKKworCS8qCisJICogZmFsbCBiYWNrIHRvIGFzeW5jaHJvbm91cyB0cmFuc2ZlciBtb2RlCisJICogaW5pdGlhbGl6ZSBTRFRSIG5lZ290aWF0aW9uIGZsYWcKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYXRhLT50YXJnZXQpOyBpKyspIHsKKwkJbnNwMzJfdGFyZ2V0ICp0YXJnZXQgPSAmZGF0YS0+dGFyZ2V0W2ldOworCisJCXRhcmdldC0+c3luY19mbGFnID0gMDsKKwkJbnNwMzJfc2V0X2FzeW5jKGRhdGEsIHRhcmdldCk7CisJfQorCisJLyoKKwkgKiByZXNldCBTQ1NJIGJ1cworCSAqLworCW5zcDMyX3dyaXRlMShiYXNlLCBTQ1NJX0JVU19DT05UUk9MLCBCVVNDVExfUlNUKTsKKwl1ZGVsYXkoUkVTRVRfSE9MRF9USU1FKTsKKwluc3AzMl93cml0ZTEoYmFzZSwgU0NTSV9CVVNfQ09OVFJPTCwgMCk7CisJZm9yKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCWludHJkYXQgPSBuc3AzMl9yZWFkMihiYXNlLCBJUlFfU1RBVFVTKTsgLyogZHVtbXkgcmVhZCAqLworCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfQlVTUkVTRVQsICJpcnE6MTogMHgleCIsIGludHJkYXQpOworICAgICAgICB9CisKKwlkYXRhLT5DdXJyZW50U0MgPSBOVUxMOworfQorCitzdGF0aWMgaW50IG5zcDMyX2VoX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IFNDcG50LT5kZXZpY2UtPmhvc3Q7CisJdW5zaWduZWQgaW50ICAgICAgYmFzZSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisJbnNwMzJfaHdfZGF0YSAgICAqZGF0YSA9IChuc3AzMl9od19kYXRhICopaG9zdC0+aG9zdGRhdGE7CisKKwluc3AzMl9tc2coS0VSTl9JTkZPLCAiSG9zdCBSZXNldCIpOwkKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfQlVTUkVTRVQsICJTQ3BudD0weCV4IiwgU0NwbnQpOworCisJbnNwMzJod19pbml0KGRhdGEpOworCW5zcDMyX3dyaXRlMihiYXNlLCBJUlFfQ09OVFJPTCwgSVJRX0NPTlRST0xfQUxMX0lSUV9NQVNLKTsKKwluc3AzMl9kb19idXNfcmVzZXQoZGF0YSk7CisJbnNwMzJfd3JpdGUyKGJhc2UsIElSUV9DT05UUk9MLCAwKTsKKworCXJldHVybiBTVUNDRVNTOwkvKiBIb3N0IHJlc2V0IGlzIHN1Y2NlZWRlZCBhdCBhbnkgdGltZS4gKi8KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVFUFJPTSBoYW5kbGVyCisgKi8KKworLyoKKyAqIGdldHRpbmcgRUVQUk9NIHBhcmFtZXRlcgorICovCitzdGF0aWMgaW50IG5zcDMyX2dldHByb21fcGFyYW0obnNwMzJfaHdfZGF0YSAqZGF0YSkKK3sKKwlpbnQgdmVuZG9yID0gZGF0YS0+cGNpX2RldmlkLT52ZW5kb3I7CisJaW50IGRldmljZSA9IGRhdGEtPnBjaV9kZXZpZC0+ZGV2aWNlOworCWludCByZXQsIHZhbCwgaTsKKworCS8qCisJICogRUVQUk9NIGNoZWNraW5nLgorCSAqLworCXJldCA9IG5zcDMyX3Byb21fcmVhZChkYXRhLCAweDdlKTsKKwlpZiAocmV0ICE9IDB4NTUpIHsKKwkJbnNwMzJfbXNnKEtFUk5fSU5GTywgIk5vIEVFUFJPTSBkZXRlY3RlZDogMHgleCIsIHJldCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJcmV0ID0gbnNwMzJfcHJvbV9yZWFkKGRhdGEsIDB4N2YpOworCWlmIChyZXQgIT0gMHhhYSkgeworCQluc3AzMl9tc2coS0VSTl9JTkZPLCAiSW52YWxpZCBudW1iZXI6IDB4JXgiLCByZXQpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLyoKKwkgKiBjaGVjayBFRVBST00gdHlwZQorCSAqLworCWlmICh2ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9XT1JLQklUICYmCisJICAgIGRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1dPUktCSVRfU1RBTkRBUkQpIHsKKwkJcmV0ID0gbnNwMzJfZ2V0cHJvbV9jMTYoZGF0YSk7CisJfSBlbHNlIGlmICh2ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9XT1JLQklUICYmCisJCSAgIGRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05JTkpBU0NTSV8zMkJJQl9MT0dJVEVDKSB7CisJCXJldCA9IG5zcDMyX2dldHByb21fYXQyNChkYXRhKTsKKwl9IGVsc2UgaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1dPUktCSVQgJiYKKwkJICAgZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTklOSkFTQ1NJXzMyVURFX01FTENPICkgeworCQlyZXQgPSBuc3AzMl9nZXRwcm9tX2F0MjQoZGF0YSk7CisJfSBlbHNlIHsKKwkJbnNwMzJfbXNnKEtFUk5fV0FSTklORywgIlVua25vd24gRUVQUk9NIik7CisJCXJldCA9IEZBTFNFOworCX0KKworCS8qIGZvciBkZWJ1ZyA6IFNQUk9NIGRhdGEgZnVsbCBjaGVja2luZyAqLworCWZvciAoaSA9IDA7IGkgPD0gMHgxZjsgaSsrKSB7CisJCXZhbCA9IG5zcDMyX3Byb21fcmVhZChkYXRhLCBpKTsKKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0VFUFJPTSwKKwkJCSAgInJvbSBhZGRyZXNzIDB4JXggOiAweCV4IiwgaSwgdmFsKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBBVDI0QzAxQSAoTG9naXRlYzogTEhBLTYwMFMpLCBBVDI0QzAyIChNZWxjbyBCdWZmYWxvOiBJRkMtVVNMUCkgZGF0YSBtYXA6CisgKgorICogICBST01BRERSCisgKiAgIDB4MDAgLSAweDA2IDogIERldmljZSBTeW5jaHJvbm91cyBUcmFuc2ZlciBQZXJpb2QgKFNDU0kgSUQgMCAtIDYpIAorICoJCQlWYWx1ZSAweDA6IEFTWU5DLCAweDBjOiBVbHRyYS0yME0sIDB4MTk6IEZhc3QtMTBNCisgKiAgIDB4MDcgICAgICAgIDogIEhCQSBTeW5jaHJvbm91cyBUcmFuc2ZlciBQZXJpb2QKKyAqCQkJVmFsdWUgMDogQXV0b1N5bmMsIDE6IE1hbnVhbCBTZXR0aW5nCisgKiAgIDB4MDggLSAweDBmIDogIE5vdCBVc2VkPyAoMHgwKQorICogICAweDEwICAgICAgICA6ICBCdXMgVGVybWluYXRpb24KKyAqIAkJCVZhbHVlIDA6IEF1dG9bT05dLCAxOiBPTiwgMjogT0ZGCisgKiAgIDB4MTEgICAgICAgIDogIE5vdCBVc2VkPyAoMCkKKyAqICAgMHgxMiAgICAgICAgOiAgQnVzIFJlc2V0IERlbGF5IFRpbWUgKDB4MDMpCisgKiAgIDB4MTMgICAgICAgIDogIEJvb3RhYmxlIENEIFN1cHBvcnQKKyAqCQkJVmFsdWUgMDogRGlzYWJsZSwgMTogRW5hYmxlCisgKiAgIDB4MTQgICAgICAgIDogIERldmljZSBTY2FuCisgKgkJCUJpdCAgIDcgIDYgIDUgIDQgIDMgIDIgIDEgIDAKKyAqCQkJICAgICAgfCAgPC0tLS0tLS0tLS0tLS0tLS0tPgorICogCQkJICAgICAgfCAgICBTQ1NJIElEOiBWYWx1ZSAwOiBTa2lwLCAxOiBZRVMKKyAqCQkJICAgICAgfC0+ICBWYWx1ZSAwOiBBTEwgc2NhbiwgIFZhbHVlIDE6IE1hbnVhbAorICogICAweDE1IC0gMHgxYiA6ICBOb3QgVXNlZD8gKDApCisgKiAgIDB4MWMgICAgICAgIDogIENvbnN0YW50PyAoMHgwMSkgKGNsb2NrIGRpdj8pCisgKiAgIDB4MWQgLSAweDdjIDogIE5vdCBVc2VkICgweGZmKQorICogICAweDdkCSA6ICBOb3QgVXNlZD8gKDB4ZmYpCisgKiAgIDB4N2UgICAgICAgIDogIENvbnN0YW50ICgweDU1KSwgVmFsaWRpdHkgc2lnbmF0dXJlCisgKiAgIDB4N2YgICAgICAgIDogIENvbnN0YW50ICgweGFhKSwgVmFsaWRpdHkgc2lnbmF0dXJlCisgKi8KK3N0YXRpYyBpbnQgbnNwMzJfZ2V0cHJvbV9hdDI0KG5zcDMyX2h3X2RhdGEgKmRhdGEpCit7CisJaW50ICAgICAgICAgICByZXQsIGk7CisJaW50ICAgICAgICAgICBhdXRvX3N5bmM7CisJbnNwMzJfdGFyZ2V0ICp0YXJnZXQ7CisJaW50ICAgICAgICAgICBlbnRyeTsKKworCS8qCisJICogUmVzZXQgdGltZSB3aGljaCBpcyBkZXNpZ25hdGVkIGJ5IEVFUFJPTS4KKwkgKgorCSAqIFRPRE86IE5vdCB1c2VkIHlldC4KKwkgKi8KKwlkYXRhLT5yZXNldHRpbWUgPSBuc3AzMl9wcm9tX3JlYWQoZGF0YSwgMHgxMik7CisKKwkvKgorCSAqIEhCQSBTeW5jaHJvbm91cyBUcmFuc2ZlciBQZXJpb2QKKwkgKgorCSAqIE5vdGU6IGF1dG9fc3luYyA9IDA6IGF1dG8sIDE6IG1hbnVhbC4gIE5pbmphIFNDU0kgSEJBIHNwZWMgc2F5cworCSAqCXRoYXQgaWYgYXV0b19zeW5jIGlzIDAgKGF1dG8pLCBhbmQgY29ubmVjdGVkIFNDU0kgZGV2aWNlcyBhcmUKKwkgKglzYW1lIG9yIGxvd2VyIHRoYW4gMywgdGhlbiB0cmFuc2ZlciBzcGVlZCBpcyBzZXQgYXMgVUxUUkEtMjBNLgorCSAqCU9uIHRoZSBjb250cmFyeSBpZiBjb25uZWN0ZWQgU0NTSSBkZXZpY2VzIGFyZSBzYW1lIG9yIGhpZ2hlcgorCSAqCXRoYW4gNCwgdGhlbiB0cmFuc2ZlciBzcGVlZCBpcyBzZXQgYXMgRkFTVC0xME0uCisJICoKKwkgKglJIGJyZWFrIHRoaXMgcnVsZS4gVGhlIG51bWJlciBvZiBjb25uZWN0ZWQgU0NTSSBkZXZpY2VzIGFyZQorCSAqCW9ubHkgaWdub3JlZC4gSWYgYXV0b19zeW5jIGlzIDAgKGF1dG8pLCB0aGVuIHRyYW5zZmVyIHNwZWVkIGlzCisJICoJZm9yY2VkIGFzIFVMVFJBLTIwTS4KKwkgKi8KKwlyZXQgPSBuc3AzMl9wcm9tX3JlYWQoZGF0YSwgMHgwNyk7CisJc3dpdGNoIChyZXQpIHsKKwljYXNlIDA6CisJCWF1dG9fc3luYyA9IFRSVUU7CisJCWJyZWFrOworCWNhc2UgMToKKwkJYXV0b19zeW5jID0gRkFMU0U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW5zcDMyX21zZyhLRVJOX1dBUk5JTkcsCisJCQkgICJVbnN1cHBvcnRlZCBBdXRvIFN5bmMgbW9kZS4gRmFsbCBiYWNrIHRvIG1hbnVhbCBtb2RlLiIpOworCQlhdXRvX3N5bmMgPSBUUlVFOworCX0KKworCWlmICh0cmFuc19tb2RlID09IFVMVFJBMjBNX01PREUpIHsKKwkJYXV0b19zeW5jID0gVFJVRTsKKwl9CisKKwkvKgorCSAqIGVhY2ggZGV2aWNlIFN5bmNocm9ub3VzIFRyYW5zZmVyIFBlcmlvZAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBOU1AzMl9IT1NUX1NDU0lJRDsgaSsrKSB7CisJCXRhcmdldCA9ICZkYXRhLT50YXJnZXRbaV07CisJCWlmIChhdXRvX3N5bmMgPT0gVFJVRSkgeworCQkJdGFyZ2V0LT5saW1pdF9lbnRyeSA9IDA7ICAgLyogc2V0IGFzIFVMVFJBMjBNICovCisJCX0gZWxzZSB7CisJCQlyZXQgICA9IG5zcDMyX3Byb21fcmVhZChkYXRhLCBpKTsKKwkJCWVudHJ5ID0gbnNwMzJfc2VhcmNoX3BlcmlvZF9lbnRyeShkYXRhLCB0YXJnZXQsIHJldCk7CisJCQlpZiAoZW50cnkgPCAwKSB7CisJCQkJLyogc2VhcmNoIGZhaWxlZC4uLiBzZXQgbWF4aW11bSBzcGVlZCAqLworCQkJCWVudHJ5ID0gMDsKKwkJCX0KKwkJCXRhcmdldC0+bGltaXRfZW50cnkgPSBlbnRyeTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBDMTYgMTEwIChJLU8gRGF0YTogU0MtTkJEKSBkYXRhIG1hcDoKKyAqCisgKiAgIFJPTUFERFIKKyAqICAgMHgwMCAtIDB4MDYgOiAgRGV2aWNlIFN5bmNocm9ub3VzIFRyYW5zZmVyIFBlcmlvZCAoU0NTSSBJRCAwIC0gNikgCisgKgkJCVZhbHVlIDB4MDogMjBNQi9TLCAweDE6IDEwTUIvUywgMHgyOiA1TUIvUywgMHgzOiBBU1lOQworICogICAweDA3ICAgICAgICA6ICAwIChIQkEgU3luY2hyb25vdXMgVHJhbnNmZXIgUGVyaW9kOiBBdXRvIFN5bmMpCisgKiAgIDB4MDggLSAweDBmIDogIE5vdCBVc2VkPyAoMHgwKQorICogICAweDEwICAgICAgICA6ICBUcmFuc2ZlciBNb2RlCisgKgkJCVZhbHVlIDA6IFBJTywgMTogQnVzbWF0ZXIKKyAqICAgMHgxMSAgICAgICAgOiAgQnVzIFJlc2V0IERlbGF5IFRpbWUgKDB4MDAtMHgyMCkKKyAqICAgMHgxMiAgICAgICAgOiAgQnVzIFRlcm1pbmF0aW9uCisgKiAJCQlWYWx1ZSAwOiBEaXNhYmxlLCAxOiBFbmFibGUKKyAqICAgMHgxMyAtIDB4MTkgOiAgRGlzY29ubmVjdGlvbgorICoJCQlWYWx1ZSAwOiBEaXNhYmxlLCAxOiBFbmFibGUKKyAqICAgMHgxYSAtIDB4N2MgOiAgTm90IFVzZWQ/ICgwKQorICogICAweDdkCSA6ICBOb3QgVXNlZD8gKDB4ZjgpCisgKiAgIDB4N2UgICAgICAgIDogIENvbnN0YW50ICgweDU1KSwgVmFsaWRpdHkgc2lnbmF0dXJlCisgKiAgIDB4N2YgICAgICAgIDogIENvbnN0YW50ICgweGFhKSwgVmFsaWRpdHkgc2lnbmF0dXJlCisgKi8KK3N0YXRpYyBpbnQgbnNwMzJfZ2V0cHJvbV9jMTYobnNwMzJfaHdfZGF0YSAqZGF0YSkKK3sKKwlpbnQgICAgICAgICAgIHJldCwgaTsKKwluc3AzMl90YXJnZXQgKnRhcmdldDsKKwlpbnQgICAgICAgICAgIGVudHJ5LCB2YWw7CisKKwkvKgorCSAqIFJlc2V0IHRpbWUgd2hpY2ggaXMgZGVzaWduYXRlZCBieSBFRVBST00uCisJICoKKwkgKiBUT0RPOiBOb3QgdXNlZCB5ZXQuCisJICovCisJZGF0YS0+cmVzZXR0aW1lID0gbnNwMzJfcHJvbV9yZWFkKGRhdGEsIDB4MTEpOworCisJLyoKKwkgKiBlYWNoIGRldmljZSBTeW5jaHJvbm91cyBUcmFuc2ZlciBQZXJpb2QKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlNQMzJfSE9TVF9TQ1NJSUQ7IGkrKykgeworCQl0YXJnZXQgPSAmZGF0YS0+dGFyZ2V0W2ldOworCQlyZXQgPSBuc3AzMl9wcm9tX3JlYWQoZGF0YSwgaSk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoJCS8qIDIwTUIvcyAqLworCQkJdmFsID0gMHgwYzsKKwkJCWJyZWFrOworCQljYXNlIDE6CQkvKiAxME1CL3MgKi8KKwkJCXZhbCA9IDB4MTk7CisJCQlicmVhazsKKwkJY2FzZSAyOgkJLyogNU1CL3MgKi8KKwkJCXZhbCA9IDB4MzI7CisJCQlicmVhazsKKwkJY2FzZSAzOgkJLyogQVNZTkMgKi8KKwkJCXZhbCA9IDB4MDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoJLyogZGVmYXVsdCAyME1CL3MgKi8KKwkJCXZhbCA9IDB4MGM7CisJCQlicmVhazsKKwkJfQorCQllbnRyeSA9IG5zcDMyX3NlYXJjaF9wZXJpb2RfZW50cnkoZGF0YSwgdGFyZ2V0LCB2YWwpOworCQlpZiAoZW50cnkgPCAwIHx8IHRyYW5zX21vZGUgPT0gVUxUUkEyME1fTU9ERSkgeworCQkJLyogc2VhcmNoIGZhaWxlZC4uLiBzZXQgbWF4aW11bSBzcGVlZCAqLworCQkJZW50cnkgPSAwOworCQl9CisJCXRhcmdldC0+bGltaXRfZW50cnkgPSBlbnRyeTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKgorICogQXRtZWwgQVQyNEMwMUEgKGRyaXZlZCBpbiA1Vikgc2VyaWFsIEVFUFJPTSByb3V0aW5lcworICovCitzdGF0aWMgaW50IG5zcDMyX3Byb21fcmVhZChuc3AzMl9od19kYXRhICpkYXRhLCBpbnQgcm9tYWRkcikKK3sKKwlpbnQgaSwgdmFsOworCisJLyogc3RhcnQgY29uZGl0aW9uICovCisJbnNwMzJfcHJvbV9zdGFydChkYXRhKTsKKworCS8qIGRldmljZSBhZGRyZXNzICovCisJbnNwMzJfcHJvbV93cml0ZV9iaXQoZGF0YSwgMSk7CS8qIDEgKi8KKwluc3AzMl9wcm9tX3dyaXRlX2JpdChkYXRhLCAwKTsJLyogMCAqLworCW5zcDMyX3Byb21fd3JpdGVfYml0KGRhdGEsIDEpOwkvKiAxICovCisJbnNwMzJfcHJvbV93cml0ZV9iaXQoZGF0YSwgMCk7CS8qIDAgKi8KKwluc3AzMl9wcm9tX3dyaXRlX2JpdChkYXRhLCAwKTsJLyogQTI6IDAgKEdORCkgKi8KKwluc3AzMl9wcm9tX3dyaXRlX2JpdChkYXRhLCAwKTsJLyogQTE6IDAgKEdORCkgKi8KKwluc3AzMl9wcm9tX3dyaXRlX2JpdChkYXRhLCAwKTsJLyogQTA6IDAgKEdORCkgKi8KKworCS8qIFIvVzogVyBmb3IgZHVtbXkgd3JpdGUgKi8KKwluc3AzMl9wcm9tX3dyaXRlX2JpdChkYXRhLCAwKTsKKworCS8qIGFjayAqLworCW5zcDMyX3Byb21fd3JpdGVfYml0KGRhdGEsIDApOworCisJLyogd29yZCBhZGRyZXNzICovCisJZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pIHsKKwkJbnNwMzJfcHJvbV93cml0ZV9iaXQoZGF0YSwgKChyb21hZGRyID4+IGkpICYgMSkpOworCX0KKworCS8qIGFjayAqLworCW5zcDMyX3Byb21fd3JpdGVfYml0KGRhdGEsIDApOworCisJLyogc3RhcnQgY29uZGl0aW9uICovCisJbnNwMzJfcHJvbV9zdGFydChkYXRhKTsKKworCS8qIGRldmljZSBhZGRyZXNzICovCisJbnNwMzJfcHJvbV93cml0ZV9iaXQoZGF0YSwgMSk7CS8qIDEgKi8KKwluc3AzMl9wcm9tX3dyaXRlX2JpdChkYXRhLCAwKTsJLyogMCAqLworCW5zcDMyX3Byb21fd3JpdGVfYml0KGRhdGEsIDEpOwkvKiAxICovCisJbnNwMzJfcHJvbV93cml0ZV9iaXQoZGF0YSwgMCk7CS8qIDAgKi8KKwluc3AzMl9wcm9tX3dyaXRlX2JpdChkYXRhLCAwKTsJLyogQTI6IDAgKEdORCkgKi8KKwluc3AzMl9wcm9tX3dyaXRlX2JpdChkYXRhLCAwKTsJLyogQTE6IDAgKEdORCkgKi8KKwluc3AzMl9wcm9tX3dyaXRlX2JpdChkYXRhLCAwKTsJLyogQTA6IDAgKEdORCkgKi8KKworCS8qIFIvVzogUiAqLworCW5zcDMyX3Byb21fd3JpdGVfYml0KGRhdGEsIDEpOworCisJLyogYWNrICovCisJbnNwMzJfcHJvbV93cml0ZV9iaXQoZGF0YSwgMCk7CisKKwkvKiBkYXRhLi4uICovCisJdmFsID0gMDsKKwlmb3IgKGkgPSA3OyBpID49IDA7IGktLSkgeworCQl2YWwgKz0gKG5zcDMyX3Byb21fcmVhZF9iaXQoZGF0YSkgPDwgaSk7CisJfQorCQorCS8qIG5vIGFjayAqLworCW5zcDMyX3Byb21fd3JpdGVfYml0KGRhdGEsIDEpOworCisJLyogc3RvcCBjb25kaXRpb24gKi8KKwluc3AzMl9wcm9tX3N0b3AoZGF0YSk7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBuc3AzMl9wcm9tX3NldChuc3AzMl9od19kYXRhICpkYXRhLCBpbnQgYml0LCBpbnQgdmFsKQoreworCWludCBiYXNlID0gZGF0YS0+QmFzZUFkZHJlc3M7CisJaW50IHRtcDsKKworCXRtcCA9IG5zcDMyX2luZGV4X3JlYWQxKGJhc2UsIFNFUklBTF9ST01fQ1RMKTsKKworCWlmICh2YWwgPT0gMCkgeworCQl0bXAgJj0gfmJpdDsKKwl9IGVsc2UgeworCQl0bXAgfD0gIGJpdDsKKwl9CisKKwluc3AzMl9pbmRleF93cml0ZTEoYmFzZSwgU0VSSUFMX1JPTV9DVEwsIHRtcCk7CisKKwl1ZGVsYXkoMTApOworfQorCitzdGF0aWMgaW50IG5zcDMyX3Byb21fZ2V0KG5zcDMyX2h3X2RhdGEgKmRhdGEsIGludCBiaXQpCit7CisJaW50IGJhc2UgPSBkYXRhLT5CYXNlQWRkcmVzczsKKwlpbnQgdG1wLCByZXQ7CisKKwlpZiAoYml0ICE9IFNEQSkgeworCQluc3AzMl9tc2coS0VSTl9FUlIsICJyZXR1cm4gdmFsdWUgaXMgbm90IGFwcHJvcHJpYXRlIik7CisJCXJldHVybiAwOworCX0KKworCisJdG1wID0gbnNwMzJfaW5kZXhfcmVhZDEoYmFzZSwgU0VSSUFMX1JPTV9DVEwpICYgYml0OworCisJaWYgKHRtcCA9PSAwKSB7CisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJcmV0ID0gMTsKKwl9CisKKwl1ZGVsYXkoMTApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbnNwMzJfcHJvbV9zdGFydCAobnNwMzJfaHdfZGF0YSAqZGF0YSkKK3sKKwkvKiBzdGFydCBjb25kaXRpb24gKi8KKwluc3AzMl9wcm9tX3NldChkYXRhLCBTQ0wsIDEpOworCW5zcDMyX3Byb21fc2V0KGRhdGEsIFNEQSwgMSk7CisJbnNwMzJfcHJvbV9zZXQoZGF0YSwgRU5BLCAxKTsJLyogb3V0cHV0IG1vZGUgKi8KKwluc3AzMl9wcm9tX3NldChkYXRhLCBTREEsIDApOwkvKiBrZWVwaW5nIFNDTD0xIGFuZCB0cmFuc2l0aW5nCisJCQkJCSAqIFNEQSAxLT4wIGlzIHN0YXJ0IGNvbmRpdGlvbiAqLworCW5zcDMyX3Byb21fc2V0KGRhdGEsIFNDTCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIG5zcDMyX3Byb21fc3RvcCAobnNwMzJfaHdfZGF0YSAqZGF0YSkKK3sKKwkvKiBzdG9wIGNvbmRpdGlvbiAqLworCW5zcDMyX3Byb21fc2V0KGRhdGEsIFNDTCwgMSk7CisJbnNwMzJfcHJvbV9zZXQoZGF0YSwgU0RBLCAwKTsKKwluc3AzMl9wcm9tX3NldChkYXRhLCBFTkEsIDEpOwkvKiBvdXRwdXQgbW9kZSAqLworCW5zcDMyX3Byb21fc2V0KGRhdGEsIFNEQSwgMSk7CisJbnNwMzJfcHJvbV9zZXQoZGF0YSwgU0NMLCAwKTsKK30KKworc3RhdGljIHZvaWQgbnNwMzJfcHJvbV93cml0ZV9iaXQobnNwMzJfaHdfZGF0YSAqZGF0YSwgaW50IHZhbCkKK3sKKwkvKiB3cml0ZSAqLworCW5zcDMyX3Byb21fc2V0KGRhdGEsIFNEQSwgdmFsKTsKKwluc3AzMl9wcm9tX3NldChkYXRhLCBTQ0wsIDEgICk7CisJbnNwMzJfcHJvbV9zZXQoZGF0YSwgU0NMLCAwICApOworfQorCitzdGF0aWMgaW50IG5zcDMyX3Byb21fcmVhZF9iaXQobnNwMzJfaHdfZGF0YSAqZGF0YSkKK3sKKwlpbnQgdmFsOworCisJLyogcmVhZCAqLworCW5zcDMyX3Byb21fc2V0KGRhdGEsIEVOQSwgMCk7CS8qIGlucHV0IG1vZGUgKi8KKwluc3AzMl9wcm9tX3NldChkYXRhLCBTQ0wsIDEpOworCisJdmFsID0gbnNwMzJfcHJvbV9nZXQoZGF0YSwgU0RBKTsKKworCW5zcDMyX3Byb21fc2V0KGRhdGEsIFNDTCwgMCk7CisJbnNwMzJfcHJvbV9zZXQoZGF0YSwgRU5BLCAxKTsJLyogb3V0cHV0IG1vZGUgKi8KKworCXJldHVybiB2YWw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQb3dlciBNYW5hZ2VtZW50CisgKi8KKyNpZmRlZiBDT05GSUdfUE0KKworLyogRGV2aWNlIHN1c3BlbmRlZCAqLworc3RhdGljIGludCBuc3AzMl9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW5zcDMyX21zZyhLRVJOX0lORk8sICJwY2ktc3VzcGVuZDogcGRldj0weCVwLCBzdGF0ZT0lbGQsIHNsb3Q9JXMsIGhvc3Q9MHglcCIsIHBkZXYsIHN0YXRlLCBwY2lfbmFtZShwZGV2KSwgaG9zdCk7CisKKwlwY2lfc2F2ZV9zdGF0ZSAgICAgKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZSAocGRldik7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBzdGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRGV2aWNlIHdva2VuIHVwICovCitzdGF0aWMgaW50IG5zcDMyX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCW5zcDMyX2h3X2RhdGEgICAgKmRhdGEgPSAobnNwMzJfaHdfZGF0YSAqKWhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIHNob3J0ICAgIHJlZzsKKworCW5zcDMyX21zZyhLRVJOX0lORk8sICJwY2ktcmVzdW1lOiBwZGV2PTB4JXAsIHNsb3Q9JXMsIGhvc3Q9MHglcCIsIHBkZXYsIHBjaV9uYW1lKHBkZXYpLCBob3N0KTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMCk7CisJcGNpX2VuYWJsZV93YWtlICAgIChwZGV2LCAwLCAwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZSAgKHBkZXYpOworCisJcmVnID0gbnNwMzJfcmVhZDIoZGF0YS0+QmFzZUFkZHJlc3MsIElOREVYX1JFRyk7CisKKwluc3AzMl9tc2coS0VSTl9JTkZPLCAiaW89MHgleCByZWc9MHgleCIsIGRhdGEtPkJhc2VBZGRyZXNzLCByZWcpOworCisJaWYgKHJlZyA9PSAweGZmZmYpIHsKKwkJbnNwMzJfbXNnKEtFUk5fSU5GTywgIm1pc3NpbmcgZGV2aWNlLiBhYm9ydCByZXN1bWUuIik7CisJCXJldHVybiAwOworCX0KKworCW5zcDMyaHdfaW5pdCAgICAgIChkYXRhKTsKKwluc3AzMl9kb19idXNfcmVzZXQoZGF0YSk7CisKKwluc3AzMl9tc2coS0VSTl9JTkZPLCAicmVzdW1lIHN1Y2Nlc3MiKTsKKworCXJldHVybiAwOworfQorCisvKiBFbmFibGUgd2FrZSBldmVudCAqLworc3RhdGljIGludCBuc3AzMl9lbmFibGVfd2FrZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHN0YXRlLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwluc3AzMl9tc2coS0VSTl9JTkZPLCAicGNpLWVuYWJsZV93YWtlOiBzdHViLCBwZGV2PTB4JXAsIGVuYWJsZT0lZCwgc2xvdD0lcywgaG9zdD0weCVwIiwgcGRldiwgZW5hYmxlLCBwY2lfbmFtZShwZGV2KSwgaG9zdCk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQQ0kvQ2FyZGJ1cyBwcm9iZS9yZW1vdmUgcm91dGluZQorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBuc3AzMl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisJbnNwMzJfaHdfZGF0YSAqZGF0YSA9ICZuc3AzMl9kYXRhX2Jhc2U7CisKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfUkVHSVNURVIsICJlbnRlciIpOworCisgICAgICAgIHJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQpIHsKKwkJbnNwMzJfbXNnKEtFUk5fRVJSLCAiZmFpbGVkIHRvIGVuYWJsZSBwY2kgZGV2aWNlIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZGF0YS0+UGNpICAgICAgICAgPSBwZGV2OworCWRhdGEtPnBjaV9kZXZpZCAgID0gaWQ7CisJZGF0YS0+SXJxTnVtYmVyICAgPSBwZGV2LT5pcnE7CisJZGF0YS0+QmFzZUFkZHJlc3MgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJZGF0YS0+TnVtQWRkcmVzcyAgPSBwY2lfcmVzb3VyY2VfbGVuICAocGRldiwgMCk7CisJZGF0YS0+TW1pb0FkZHJlc3MgPSBpb3JlbWFwX25vY2FjaGUocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpLAorCQkJCQkgICAgICAgcGNpX3Jlc291cmNlX2xlbiAgKHBkZXYsIDEpKTsKKwlkYXRhLT5NbWlvTGVuZ3RoICA9IHBjaV9yZXNvdXJjZV9sZW4gIChwZGV2LCAxKTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw3MykpCisJcmV0ID0gbnNwMzJfZGV0ZWN0KHBkZXYpOworI2Vsc2UKKwlyZXQgPSBzY3NpX3JlZ2lzdGVyX2hvc3QoJm5zcDMyX3RlbXBsYXRlKTsKKyNlbmRpZgorCisJbnNwMzJfbXNnKEtFUk5fSU5GTywgImlycTogJWkgbW1pbzogJXArMHglbHggc2xvdDogJXMgbW9kZWw6ICVzIiwKKwkJICBwZGV2LT5pcnEsCisJCSAgZGF0YS0+TW1pb0FkZHJlc3MsIGRhdGEtPk1taW9MZW5ndGgsCisJCSAgcGNpX25hbWUocGRldiksCisJCSAgbnNwMzJfbW9kZWxbaWQtPmRyaXZlcl9kYXRhXSk7CisKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfUkVHSVNURVIsICJleGl0ICVkIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBuc3AzMl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw3MykpCisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKyNlbmRpZgorCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX1JFR0lTVEVSLCAiZW50ZXIiKTsKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNzMpKQorICAgICAgICBzY3NpX3JlbW92ZV9ob3N0KGhvc3QpOworCisJbnNwMzJfcmVsZWFzZShob3N0KTsKKworCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisjZWxzZQorCXNjc2lfdW5yZWdpc3Rlcl9ob3N0KCZuc3AzMl90ZW1wbGF0ZSk7CQorI2VuZGlmCit9CisKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbnNwMzJfZHJpdmVyID0geworCS5uYW1lCQk9ICJuc3AzMiIsCisJLmlkX3RhYmxlCT0gbnNwMzJfcGNpX3RhYmxlLAorCS5wcm9iZQkJPSBuc3AzMl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG5zcDMyX3JlbW92ZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBuc3AzMl9zdXNwZW5kLCAKKwkucmVzdW1lCQk9IG5zcDMyX3Jlc3VtZSwgCisJLmVuYWJsZV93YWtlICAgID0gbnNwMzJfZW5hYmxlX3dha2UsCisjZW5kaWYKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1vdWxlIGVudHJ5IHBvaW50CisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbnNwMzIodm9pZCkgeworCW5zcDMyX21zZyhLRVJOX0lORk8sICJsb2FkaW5nLi4uIik7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmbnNwMzJfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbnNwMzIodm9pZCkgeworCW5zcDMyX21zZyhLRVJOX0lORk8sICJ1bmxvYWRpbmcuLi4iKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm5zcDMyX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbnNwMzIpOworbW9kdWxlX2V4aXQoZXhpdF9uc3AzMik7CisKKy8qIGVuZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL25zcDMyLmggYi9kcml2ZXJzL3Njc2kvbnNwMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjY0Mzk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL25zcDMyLmgKQEAgLTAsMCArMSw2NjQgQEAKKy8qCisgKiBXb3JrYml0IE5pbmphU0NTSS0zMkJpL1VERSBQQ0kvQ2FyZEJ1cyBTQ1NJIEhvc3QgQnVzIEFkYXB0ZXIgZHJpdmVyCisgKiBCYXNpYyBkYXRhIGhlYWRlcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpZm5kZWYgX05TUDMyX0gKKyNkZWZpbmUgX05TUDMyX0gKKworLy8jZGVmaW5lIE5TUDMyX0RFQlVHIDkKKworLyoKKyAqIFZFTkRPUi9ERVZJQ0UgSUQKKyAqLworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lPREFUQSAgMHgxMGZjCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfV09SS0JJVCAweDExNDUKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05JTkpBU0NTSV8zMkJJX0NCU0NfSUkgICAweDAwMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OSU5KQVNDU0lfMzJCSV9LTUUgICAgICAgMHhmMDA3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTklOSkFTQ1NJXzMyQklfV0JUICAgICAgIDB4ODAwNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1dPUktCSVRfU1RBTkRBUkQgICAgICAgICAweGYwMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9XT1JLQklUX0RVQUxFREdFICAgICAgICAgMHhmMDExCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTklOSkFTQ1NJXzMyQklfTE9HSVRFQyAgIDB4ZjAxMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05JTkpBU0NTSV8zMkJJQl9MT0dJVEVDICAweGYwMTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OSU5KQVNDU0lfMzJVREVfTUVMQ08gICAgMHhmMDE1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTklOSkFTQ1NJXzMyVURFX01FTENPX0lJIDB4ODAwOQorCisvKgorICogTU9ERUwKKyAqLworZW51bSB7CisJTU9ERUxfSU9EQVRBICAgICAgICA9IDAsCisJTU9ERUxfS01FICAgICAgICAgICA9IDEsCisJTU9ERUxfV09SS0JJVCAgICAgICA9IDIsCisJTU9ERUxfTE9HSVRFQyAgICAgICA9IDMsCisJTU9ERUxfUENJX1dPUktCSVQgICA9IDQsCisJTU9ERUxfUENJX0xPR0lURUMgICA9IDUsCisJTU9ERUxfUENJX01FTENPICAgICA9IDYsCit9OworCitzdGF0aWMgY2hhciAqIG5zcDMyX21vZGVsW10gPSB7CisJIkktTyBEQVRBIENCU0MtSUkgQ2FyZEJ1cyBjYXJkIiwKKwkiS01FIFNDU0kgQ2FyZEJ1cyBjYXJkIiwKKwkiV29ya2JpdCBkdW8gU0NTSSBDYXJkQnVzIGNhcmQiLAorCSJMb2dpdGVjIENhcmRCdXMgY2FyZCB3aXRoIGV4dGVybmFsIFJPTSIsCisJIldvcmtiaXQgLyBJLU8gREFUQSBQQ0kgY2FyZCIsCisJIkxvZ2l0ZWMgUENJIGNhcmQgd2l0aCBleHRlcm5hbCBST00iLAorCSJNZWxjbyBDYXJkQnVzL1BDSSBjYXJkIHdpdGggZXh0ZXJuYWwgUk9NIiwKK307CisKKworLyoKKyAqIFNDU0kgR2VuZXJpYyBEZWZpbml0aW9ucworICovCisjZGVmaW5lIEVYVEVOREVEX1NEVFJfTEVOCTB4MDMKKworLyogTGl0dGxlIEVuZGlhbiAqLwordHlwZWRlZiB1MzIgdTMyX2xlOwordHlwZWRlZiB1MTYgdTE2X2xlOworCisvKgorICogTUFDUk8KKyAqLworI2RlZmluZSBCSVQoeCkgICAgICAoMVVMIDw8ICh4KSkKKworLyoKKyAqIEJBU0lDIERlZmluaXRpb25zCisgKi8KKyNpZm5kZWYgVFJVRQorIyBkZWZpbmUgVFJVRSAgMQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjIGRlZmluZSBGQUxTRSAwCisjZW5kaWYKKyNkZWZpbmUgQVNTRVJUIDEKKyNkZWZpbmUgTkVHQVRFIDAKKworCisvKioqKioqKioqKioqKioqKioqKi8KKy8qIG5vcm1hbCByZWdpc3RlciAqLworLyoqKioqKioqKioqKioqKioqKiovCisvKgorICogRG9uJ3QgYWNjZXNzIGJlbG93IHJlZ2lzdGVyIHdpdGggRG91YmxlIFdvcmQ6CisgKiArMDAsICswNCwgKzA4LCArMGMsICs2NCwgKzgwLCArODQsICs4OCwgKzkwLCArYzQsICtjOCwgK2NjLCArZDAuCisgKi8KKyNkZWZpbmUgSVJRX0NPTlRST0wgMHgwMAkvKiBCQVNFKzAwLCBXLCBXICovCisjZGVmaW5lIElSUV9TVEFUVVMgIDB4MDAJLyogQkFTRSswMCwgVywgUiAqLworIyBkZWZpbmUgSVJRU1RBVFVTX0xBVENIRURfTVNHICAgICAgQklUKDApCisjIGRlZmluZSBJUlFTVEFUVVNfTEFUQ0hFRF9JTyAgICAgICBCSVQoMSkKKyMgZGVmaW5lIElSUVNUQVRVU19MQVRDSEVEX0NEICAgICAgIEJJVCgyKQorIyBkZWZpbmUgSVJRU1RBVFVTX0xBVENIRURfQlVTX0ZSRUUgQklUKDMpCisjIGRlZmluZSBJUlFTVEFUVVNfUkVTRUxFQ1RfT0NDVUVSICBCSVQoNCkKKyMgZGVmaW5lIElSUVNUQVRVU19QSEFTRV9DSEFOR0VfSVJRIEJJVCg1KQorIyBkZWZpbmUgSVJRU1RBVFVTX1NDU0lSRVNFVF9JUlEgICAgQklUKDYpCisjIGRlZmluZSBJUlFTVEFUVVNfVElNRVJfSVJRICAgICAgICBCSVQoNykKKyMgZGVmaW5lIElSUVNUQVRVU19GSUZPX1NITERfSVJRICAgIEJJVCg4KQorIyBkZWZpbmUgSVJRU1RBVFVTX1BDSV9JUlEJICAgIEJJVCg5KQorIyBkZWZpbmUgSVJRU1RBVFVTX0JNQ05URVJSX0lSUSAgICAgQklUKDEwKQorIyBkZWZpbmUgSVJRU1RBVFVTX0FVVE9TQ1NJX0lSUSAgICAgQklUKDExKQorIyBkZWZpbmUgUENJX0lSUV9NQVNLICAgICAgICAgICAgICAgQklUKDEyKQorIyBkZWZpbmUgVElNRVJfSVJRX01BU0sgICAgICAgICAgICAgQklUKDEzKQorIyBkZWZpbmUgRklGT19JUlFfTUFTSyAgICAgICAgICAgICAgQklUKDE0KQorIyBkZWZpbmUgU0NTSV9JUlFfTUFTSyAgICAgICAgICAgICAgQklUKDE1KQorIyBkZWZpbmUgSVJRX0NPTlRST0xfQUxMX0lSUV9NQVNLICAgKFBDSV9JUlFfTUFTSyAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVSX0lSUV9NQVNLIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRk9fSVJRX01BU0sgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDU0lfSVJRX01BU0sgICkKKyMgZGVmaW5lIElSUVNUQVRVU19BTllfSVJRICAgICAgICAgIChJUlFTVEFUVVNfUkVTRUxFQ1RfT0NDVUVSCXwgXAorCQkJCSAgICAgSVJRU1RBVFVTX1BIQVNFX0NIQU5HRV9JUlEJfCBcCisJCQkJICAgICBJUlFTVEFUVVNfU0NTSVJFU0VUX0lSUQl8IFwKKwkJCQkgICAgIElSUVNUQVRVU19USU1FUl9JUlEJfCBcCisJCQkJICAgICBJUlFTVEFUVVNfRklGT19TSExEX0lSUQl8IFwKKwkJCQkgICAgIElSUVNUQVRVU19QQ0lfSVJRCQl8IFwKKwkJCQkgICAgIElSUVNUQVRVU19CTUNOVEVSUl9JUlEJfCBcCisJCQkJICAgICBJUlFTVEFUVVNfQVVUT1NDU0lfSVJRCSkKKworI2RlZmluZSBUUkFOU0ZFUl9DT05UUk9MCTB4MDIJLyogQkFTRSswMiwgVywgVyAqLworI2RlZmluZSBUUkFOU0ZFUl9TVEFUVVMJCTB4MDIJLyogQkFTRSswMiwgVywgUiAqLworIyBkZWZpbmUgQ0JfTU1JT19NT0RFICAgICAgICBCSVQoMCkKKyMgZGVmaW5lIENCX0lPX01PREUgICAgICAgICAgQklUKDEpCisjIGRlZmluZSBCTV9URVNUICAgICAgICAgICAgIEJJVCgyKQorIyBkZWZpbmUgQk1fVEVTVF9ESVIgICAgICAgICBCSVQoMykKKyMgZGVmaW5lIERVQUxfRURHRV9FTkFCTEUgICAgQklUKDQpCisjIGRlZmluZSBOT19UUkFOU0ZFUl9UT19IT1NUIEJJVCg1KQorIyBkZWZpbmUgVFJBTlNGRVJfR08gICAgICAgICBCSVQoNykKKyMgZGVmaW5lIEJMSUVORF9NT0RFICAgICAgICAgQklUKDgpCisjIGRlZmluZSBCTV9TVEFSVCAgICAgICAgICAgIEJJVCg5KQorIyBkZWZpbmUgQURWQU5DRURfQk1fV1JJVEUgICBCSVQoMTApCisjIGRlZmluZSBCTV9TSU5HTEVfTU9ERSAgICAgIEJJVCgxMSkKKyMgZGVmaW5lIEZJRk9fVFJVRV9GVUxMICAgICAgQklUKDEyKQorIyBkZWZpbmUgRklGT19UUlVFX0VNUFRZICAgICBCSVQoMTMpCisjIGRlZmluZSBBTExfQ09VTlRFUl9DTFIgICAgIEJJVCgxNCkKKyMgZGVmaW5lIEZJRk9URVNUICAgICAgICAgICAgQklUKDE1KQorCisjZGVmaW5lIElOREVYX1JFRwkJMHgwNAkvKiBCQVNFKzA0LCBCeXRlKFIvVyksIFdvcmQoUikgKi8KKworI2RlZmluZSBUSU1FUl9TRVQJCTB4MDYJLyogQkFTRSswNiwgVywgUi9XICovCisjIGRlZmluZSBUSU1FUl9DTlRfTUFTSyAoMHhmZikKKyMgZGVmaW5lIFRJTUVSX1NUT1AgICAgIEJJVCg4KQorCisjZGVmaW5lIERBVEFfUkVHX0xPVwkJMHgwOAkvKiBCQVNFKzA4LCBMb3dXLCBSL1cgKi8KKyNkZWZpbmUgREFUQV9SRUdfSEkJCTB4MGEJLyogQkFTRSswYSwgSGktVywgUi9XICovCisKKyNkZWZpbmUgRklGT19SRVNUX0NOVAkJMHgwYwkvKiBCQVNFKzBjLCBXLCBSL1cgKi8KKyMgZGVmaW5lIEZJRk9fUkVTVF9NQVNLICAgICAgIDB4MWZmCisjIGRlZmluZSBGSUZPX0VNUFRZX1NITERfRkxBRyBCSVQoMTQpCisjIGRlZmluZSBGSUZPX0ZVTExfU0hMRF9GTEFHICBCSVQoMTUpCisKKyNkZWZpbmUgU1JFUV9TTVBMX1JBVEUJCTB4MGYJLyogQkFTRSswZiwgQiwgUi9XICovCisjIGRlZmluZSBTUkVRU01QTFJBVEVfUkFURTAgQklUKDApCisjIGRlZmluZSBTUkVRU01QTFJBVEVfUkFURTEgQklUKDEpCisjIGRlZmluZSBTQU1QTElOR19FTkFCTEUgICAgQklUKDIpCisjICBkZWZpbmUgU01QTF80ME0gKDApICAgICAgICAgICAgICAgICAgIC8qIDQwTUh6OiAgIDAtMTAwbnMvcGVyaW9kICovCisjICBkZWZpbmUgU01QTF8yME0gKFNSRVFTTVBMUkFURV9SQVRFMCkgIC8qIDIwTUh6OiAxMDAtMjAwbnMvcGVyaW9kICovCisjICBkZWZpbmUgU01QTF8xME0gKFNSRVFTTVBMUkFURV9SQVRFMSkgIC8qIDEwTWh6OiAyMDAtICAgbnMvcGVyaW9kICovCisKKyNkZWZpbmUgU0NTSV9CVVNfQ09OVFJPTAkweDEwCS8qIEJBU0UrMTAsIEIsIFIvVyAqLworIyBkZWZpbmUgQlVTQ1RMX1NFTCAgICAgICAgIEJJVCgwKQorIyBkZWZpbmUgQlVTQ1RMX1JTVCAgICAgICAgIEJJVCgxKQorIyBkZWZpbmUgQlVTQ1RMX0RBVEFPVVRfRU5CIEJJVCgyKQorIyBkZWZpbmUgQlVTQ1RMX0FUTiAgICAgICAgIEJJVCgzKQorIyBkZWZpbmUgQlVTQ1RMX0FDSyAgICAgICAgIEJJVCg0KQorIyBkZWZpbmUgQlVTQ1RMX0JTWSAgICAgICAgIEJJVCg1KQorIyBkZWZpbmUgQVVUT0RJUkVDVElPTiAgICAgIEJJVCg2KQorIyBkZWZpbmUgQUNLRU5CICAgICAgICAgICAgIEJJVCg3KQorCisjZGVmaW5lIENMUl9DT1VOVEVSCQkweDEyCS8qIEJBU0UrMTIsIEIsIFcgKi8KKyMgZGVmaW5lIEFDS19DT1VOVEVSX0NMUiAgICAgICBCSVQoMCkKKyMgZGVmaW5lIFNSRVFfQ09VTlRFUl9DTFIgICAgICBCSVQoMSkKKyMgZGVmaW5lIEZJRk9fSE9TVF9QT0lOVEVSX0NMUiBCSVQoMikKKyMgZGVmaW5lIEZJRk9fUkVTVF9DT1VOVF9DTFIgICBCSVQoMykKKyMgZGVmaW5lIEJNX0NPVU5URVJfQ0xSICAgICAgICBCSVQoNCkKKyMgZGVmaW5lIFNBVkVEX0FDS19DTFIgICAgICAgICBCSVQoNSkKKyMgZGVmaW5lIENMUkNPVU5URVJfQUxMTUFTSyAgICAoQUNLX0NPVU5URVJfQ0xSICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUkVRX0NPVU5URVJfQ0xSICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRk9fSE9TVF9QT0lOVEVSX0NMUiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklGT19SRVNUX0NPVU5UX0NMUiAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTV9DT1VOVEVSX0NMUiAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBVkVEX0FDS19DTFIgICAgICAgICApCisKKyNkZWZpbmUgU0NTSV9CVVNfTU9OSVRPUgkweDEyCS8qIEJBU0UrMTIsIEIsIFIgKi8KKyMgZGVmaW5lIEJVU01PTl9NU0cgQklUKDApCisjIGRlZmluZSBCVVNNT05fSU8gIEJJVCgxKQorIyBkZWZpbmUgQlVTTU9OX0NEICBCSVQoMikKKyMgZGVmaW5lIEJVU01PTl9CU1kgQklUKDMpCisjIGRlZmluZSBCVVNNT05fQUNLIEJJVCg0KQorIyBkZWZpbmUgQlVTTU9OX1JFUSBCSVQoNSkKKyMgZGVmaW5lIEJVU01PTl9TRUwgQklUKDYpCisjIGRlZmluZSBCVVNNT05fQVROIEJJVCg3KQorCisjZGVmaW5lIENPTU1BTkRfREFUQQkJMHgxNAkvKiBCQVNFKzE0LCBCLCBSL1cgKi8KKworI2RlZmluZSBQQVJJVFlfQ09OVFJPTAkJMHgxNgkvKiBCQVNFKzE2LCBCLCBXICovCisjIGRlZmluZSBQQVJJVFlfQ0hFQ0tfRU5BQkxFIEJJVCgwKQorIyBkZWZpbmUgUEFSSVRZX0VSUk9SX0NMRUFSICBCSVQoMSkKKyNkZWZpbmUgUEFSSVRZX1NUQVRVUwkJMHgxNgkvKiBCQVNFKzE2LCBCLCBSICovCisvLyMgZGVmaW5lIFBBUklUWV9DSEVDS19FTkFCTEUgQklUKDApCisjIGRlZmluZSBQQVJJVFlfRVJST1JfTk9STUFMIEJJVCgxKQorIyBkZWZpbmUgUEFSSVRZX0VSUk9SX0xTQiAgICBCSVQoMSkKKyMgZGVmaW5lIFBBUklUWV9FUlJPUl9NU0IgICAgQklUKDIpCisKKyNkZWZpbmUgUkVTRUxFQ1RfSUQJCTB4MTgJLyogQkFTRSsxOCwgQiwgUiAqLworCisjZGVmaW5lIENPTU1BTkRfQ09OVFJPTAkJMHgxOAkvKiBCQVNFKzE4LCBXLCBXICovCisjIGRlZmluZSBDTEVBUl9DREJfRklGT19QT0lOVEVSIEJJVCgwKQorIyBkZWZpbmUgQVVUT19DT01NQU5EX1BIQVNFICAgICBCSVQoMSkKKyMgZGVmaW5lIEFVVE9TQ1NJX1NUQVJUICAgICAgICAgQklUKDIpCisjIGRlZmluZSBBVVRPU0NTSV9SRVNUQVJUICAgICAgIEJJVCgzKQorIyBkZWZpbmUgQVVUT19QQVJBTUVURVIgICAgICAgICBCSVQoNCkKKyMgZGVmaW5lIEFVVE9fQVROICAgICAgICAgICAgICAgQklUKDUpCisjIGRlZmluZSBBVVRPX01TR0lOXzAwX09SXzA0ICAgIEJJVCg2KQorIyBkZWZpbmUgQVVUT19NU0dJTl8wMiAgICAgICAgICBCSVQoNykKKyMgZGVmaW5lIEFVVE9fTVNHSU5fMDMgICAgICAgICAgQklUKDgpCisKKyNkZWZpbmUgU0VUX0FSQklUCQkweDFhCS8qIEJBU0UrMWEsIEIsIFcgKi8KKyMgZGVmaW5lIEFSQklUX0dPICAgIEJJVCgwKQorIyBkZWZpbmUgQVJCSVRfQ0xFQVIgQklUKDEpCisKKyNkZWZpbmUgQVJCSVRfU1RBVFVTCQkweDFhCS8qIEJBU0UrMWEsIEIsIFIgKi8KKy8vIyBkZWZpbmUgQVJCSVRfR08gICAgICAgICAgICAgQklUKDApCisjIGRlZmluZSBBUkJJVF9XSU4gICAgICAgICAgICBCSVQoMSkKKyMgZGVmaW5lIEFSQklUX0ZBSUwgICAgICAgICAgIEJJVCgyKQorIyBkZWZpbmUgQVVUT19QQVJBTUVURVJfVkFMSUQgQklUKDMpCisjIGRlZmluZSBTR1RfVkFMSUQgICAgICAgICAgICBCSVQoNCkKKworI2RlZmluZSBTWU5DX1JFRwkJMHgxYwkvKiBCQVNFKzFjLCBCLCBSL1cgKi8KKworI2RlZmluZSBBQ0tfV0lEVEgJCTB4MWQJLyogQkFTRSsxZCwgQiwgUi9XICovCisKKyNkZWZpbmUgU0NTSV9EQVRBX1dJVEhfQUNLCTB4MjAJLyogQkFTRSsyMCwgQiwgUi9XICovCisjZGVmaW5lIFNDU0lfT1VUX0xBVENIX1RBUkdFVF9JRCAweDIyCS8qIEJBU0UrMjIsIEIsIFcgKi8KKyNkZWZpbmUgU0NTSV9EQVRBX0lOCQkweDIyCS8qIEJBU0UrMjIsIEIsIFIgKi8KKworI2RlZmluZSBTQ0FNX0NPTlRST0wJCTB4MjQJLyogQkFTRSsyNCwgQiwgVyAqLworI2RlZmluZSBTQ0FNX1NUQVRVUwkJMHgyNAkvKiBCQVNFKzI0LCBCLCBSICovCisjIGRlZmluZSBTQ0FNX01TRyAgICBCSVQoMCkKKyMgZGVmaW5lIFNDQU1fSU8gICAgIEJJVCgxKQorIyBkZWZpbmUgU0NBTV9DRCAgICAgQklUKDIpCisjIGRlZmluZSBTQ0FNX0JTWSAgICBCSVQoMykKKyMgZGVmaW5lIFNDQU1fU0VMICAgIEJJVCg0KQorIyBkZWZpbmUgU0NBTV9YRkVST0sgQklUKDUpCisKKyNkZWZpbmUgU0NBTV9EQVRBCQkweDI2CS8qIEJBU0UrMjYsIEIsIFIvVyAqLworIyBkZWZpbmUgU0QwCUJJVCgwKQorIyBkZWZpbmUgU0QxCUJJVCgxKQorIyBkZWZpbmUgU0QyCUJJVCgyKQorIyBkZWZpbmUgU0QzCUJJVCgzKQorIyBkZWZpbmUgU0Q0CUJJVCg0KQorIyBkZWZpbmUgU0Q1CUJJVCg1KQorIyBkZWZpbmUgU0Q2CUJJVCg2KQorIyBkZWZpbmUgU0Q3CUJJVCg3KQorCisjZGVmaW5lIFNBQ0tfQ05UCQkweDI4CS8qIEJBU0UrMjgsIERXLCBSL1cgKi8KKyNkZWZpbmUgU1JFUV9DTlQJCTB4MmMJLyogQkFTRSsyYywgRFcsIFIvVyAqLworCisjZGVmaW5lIEZJRk9fREFUQV9MT1cJCTB4MzAJLyogQkFTRSszMCwgQi9XL0RXLCBSL1cgKi8KKyNkZWZpbmUgRklGT19EQVRBX0hJR0gJCTB4MzIJLyogQkFTRSszMiwgQi9XLCBSL1cgKi8KKyNkZWZpbmUgQk1fU1RBUlRfQURSCQkweDM0CS8qIEJBU0UrMzQsIERXLCBSL1cgKi8KKworI2RlZmluZSBCTV9DTlQJCQkweDM4CS8qIEJBU0UrMzgsIERXLCBSL1cgKi8KKyMgZGVmaW5lIEJNX0NPVU5UX01BU0sgMHgwMDAxZmZmZlVMCisjIGRlZmluZSBTR1RFTkQgICAgICAgIEJJVCgzMSkgICAgICAvKiBMYXN0IFNHVCBtYXJrZXIgKi8KKworI2RlZmluZSBTR1RfQURSCQkJMHgzYwkvKiBCQVNFKzNjLCBEVywgUi9XICovCisjZGVmaW5lIFdBSVRfUkVHCQkweDQwCS8qIEJpIG9ubHkgKi8KKworI2RlZmluZSBTQ1NJX0VYRUNVVEVfUEhBU0UJMHg0MAkvKiBCQVNFKzQwLCBXLCBSICovCisjIGRlZmluZSBDT01NQU5EX1BIQVNFICAgICBCSVQoMCkKKyMgZGVmaW5lIERBVEFfSU5fUEhBU0UgICAgIEJJVCgxKQorIyBkZWZpbmUgREFUQV9PVVRfUEhBU0UgICAgQklUKDIpCisjIGRlZmluZSBNU0dPVVRfUEhBU0UgICAgICBCSVQoMykKKyMgZGVmaW5lIFNUQVRVU19QSEFTRSAgICAgIEJJVCg0KQorIyBkZWZpbmUgSUxMRUdBTF9QSEFTRSAgICAgQklUKDUpCisjIGRlZmluZSBCVVNfRlJFRV9PQ0NVRVIgICBCSVQoNikKKyMgZGVmaW5lIE1TR19JTl9PQ0NVRVIgICAgIEJJVCg3KQorIyBkZWZpbmUgTVNHX09VVF9PQ0NVRVIgICAgQklUKDgpCisjIGRlZmluZSBTRUxFQ1RJT05fVElNRU9VVCBCSVQoOSkKKyMgZGVmaW5lIE1TR0lOXzAwX1ZBTElEICAgIEJJVCgxMCkKKyMgZGVmaW5lIE1TR0lOXzAyX1ZBTElEICAgIEJJVCgxMSkKKyMgZGVmaW5lIE1TR0lOXzAzX1ZBTElEICAgIEJJVCgxMikKKyMgZGVmaW5lIE1TR0lOXzA0X1ZBTElEICAgIEJJVCgxMykKKyMgZGVmaW5lIEFVVE9TQ1NJX0JVU1kgICAgIEJJVCgxNSkKKworI2RlZmluZSBTQ1NJX0NTQl9JTgkJMHg0MgkvKiBCQVNFKzQyLCBCLCBSICovCisKKyNkZWZpbmUgU0NTSV9NU0dfT1VUCQkweDQ0CS8qIEJBU0UrNDQsIERXLCBSL1cgKi8KKyMgZGVmaW5lIE1TR09VVF9DT1VOVF9NQVNLIChCSVQoMCl8QklUKDEpKQorIyBkZWZpbmUgTVZfVkFMSUQJICAgIEJJVCg3KQorCisjZGVmaW5lIFNFTF9USU1FX09VVAkJMHg0OAkvKiBCQVNFKzQ4LCBXLCBSL1cgKi8KKyNkZWZpbmUgU0FWRURfU0FDS19DTlQJCTB4NGMJLyogQkFTRSs0YywgRFcsIFIgKi8KKworI2RlZmluZSBIVE9TREFUQURFTEFZCQkweDUwCS8qIEJBU0UrNTAsIEIsIFIvVyAqLworI2RlZmluZSBTVE9IREFUQURFTEFZCQkweDU0CS8qIEJBU0UrNTQsIEIsIFIvVyAqLworI2RlZmluZSBBQ0tTVU1DSEVDS1JECQkweDU4CS8qIEJBU0UrNTgsIFcsIFIgKi8KKyNkZWZpbmUgUkVRU1VNQ0hFQ0tSRAkJMHg1YwkvKiBCQVNFKzVjLCBXLCBSICovCisKKworLyoqKioqKioqKioqKioqKioqKioqLworLyogaW5kZXhlZCByZWdpc3RlciAqLworLyoqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIENMT0NLX0RJVgkJMHgwMAkvKiBCQVNFKzA4LCBJRFgrMDAsIEIsIFIvVyAqLworIyBkZWZpbmUgQ0xPQ0tfMiAgQklUKDApCS8qIE1DTEsvMiAqLworIyBkZWZpbmUgQ0xPQ0tfNCAgQklUKDEpCS8qIE1DTEsvNCAqLworIyBkZWZpbmUgUENJQ0xLCSAgQklUKDcpCS8qIFBDSUNMSyAoMzNNSHopICovCisKKyNkZWZpbmUgVEVSTV9QV1JfQ09OVFJPTAkweDAxCS8qIEJBU0UrMDgsIElEWCswMSwgQiwgUi9XICovCisjIGRlZmluZSBCUFdSICBCSVQoMCkKKyMgZGVmaW5lIFNFTlNFIEJJVCgxKQkvKiBSZWFkIE9ubHkgKi8KKworI2RlZmluZSBFWFRfUE9SVF9ERFIJCTB4MDIJLyogQkFTRSswOCwgSURYKzAyLCBCLCBSL1cgKi8KKyNkZWZpbmUgRVhUX1BPUlQJCTB4MDMJLyogQkFTRSswOCwgSURYKzAzLCBCLCBSL1cgKi8KKyMgZGVmaW5lIExFRF9PTgkgKDApCisjIGRlZmluZSBMRURfT0ZGIEJJVCgwKQorCisjZGVmaW5lIElSUV9TRUxFQ1QJCTB4MDQJLyogQkFTRSswOCwgSURYKzA0LCBXLCBSL1cgKi8KKyMgZGVmaW5lIElSUVNFTEVDVF9SRVNFTEVDVF9JUlEgICAgICBCSVQoMCkKKyMgZGVmaW5lIElSUVNFTEVDVF9QSEFTRV9DSEFOR0VfSVJRICBCSVQoMSkKKyMgZGVmaW5lIElSUVNFTEVDVF9TQ1NJUkVTRVRfSVJRICAgICBCSVQoMikKKyMgZGVmaW5lIElSUVNFTEVDVF9USU1FUl9JUlEgICAgICAgICBCSVQoMykKKyMgZGVmaW5lIElSUVNFTEVDVF9GSUZPX1NITERfSVJRICAgICBCSVQoNCkKKyMgZGVmaW5lIElSUVNFTEVDVF9UQVJHRVRfQUJPUlRfSVJRICBCSVQoNSkKKyMgZGVmaW5lIElSUVNFTEVDVF9NQVNURVJfQUJPUlRfSVJRICBCSVQoNikKKyMgZGVmaW5lIElSUVNFTEVDVF9TRVJSX0lSUSAgICAgICAgICBCSVQoNykKKyMgZGVmaW5lIElSUVNFTEVDVF9QRVJSX0lSUSAgICAgICAgICBCSVQoOCkKKyMgZGVmaW5lIElSUVNFTEVDVF9CTUNOVEVSUl9JUlEgICAgICBCSVQoOSkKKyMgZGVmaW5lIElSUVNFTEVDVF9BVVRPX1NDU0lfU0VRX0lSUSBCSVQoMTApCisKKyNkZWZpbmUgT0xEX1NDU0lfUEhBU0UJCTB4MDUJLyogQkFTRSswOCwgSURYKzA1LCBCLCBSICovCisjIGRlZmluZSBPTERfTVNHICBCSVQoMCkKKyMgZGVmaW5lIE9MRF9JTyAgIEJJVCgxKQorIyBkZWZpbmUgT0xEX0NEICAgQklUKDIpCisjIGRlZmluZSBPTERfQlVTWSBCSVQoMykKKworI2RlZmluZSBGSUZPX0ZVTExfU0hMRF9DT1VOVAkweDA2CS8qIEJBU0UrMDgsIElEWCswNiwgQiwgUi9XICovCisjZGVmaW5lIEZJRk9fRU1QVFlfU0hMRF9DT1VOVAkweDA3CS8qIEJBU0UrMDgsIElEWCswNywgQiwgUi9XICovCisKKyNkZWZpbmUgRVhQX1JPTV9DT05UUk9MCQkweDA4CS8qIEJBU0UrMDgsIElEWCswOCwgQiwgUi9XICovIC8qIGV4dGVybmFsIFJPTSBjb250cm9sICovCisjIGRlZmluZSBST01fV1JJVEVfRU5CIEJJVCgwKQorIyBkZWZpbmUgSU9fQUNDRVNTX0VOQiBCSVQoMSkKKyMgZGVmaW5lIFJPTV9BRFJfQ0xFQVIgQklUKDIpCisKKyNkZWZpbmUgRVhQX1JPTV9BRFIJCTB4MDkJLyogQkFTRSswOCwgSURYKzA5LCBXLCBSL1cgKi8KKworI2RlZmluZSBFWFBfUk9NX0RBVEEJCTB4MGEJLyogQkFTRSswOCwgSURYKzBhLCBCLCBSL1cgKi8KKworI2RlZmluZSBDSElQX01PREUJCTB4MGIJLyogQkFTRSswOCwgSURYKzBiLCBCLCBSICAgKi8gLyogTmluamFTQ1NJLTMyQmkgb25seSAqLworIyBkZWZpbmUgT0VNMCBCSVQoMSkgIC8qIE9FTSBzZWxlY3QgKi8gLyogMDA9SS1PIERBVEEsIDAxPUtNRSwgMTA9V29ya2JpdCwgMTE9RXh0IFJPTSAqLworIyBkZWZpbmUgT0VNMSBCSVQoMikgIC8qIE9FTSBzZWxlY3QgKi8KKyMgZGVmaW5lIE9QVEIgQklUKDMpICAvKiBLTUUgbW9kZSBzZWxlY3QgKi8KKyMgZGVmaW5lIE9QVEMgQklUKDQpICAvKiBLTUUgbW9kZSBzZWxlY3QgKi8KKyMgZGVmaW5lIE9QVEQgQklUKDUpICAvKiBLTUUgbW9kZSBzZWxlY3QgKi8KKyMgZGVmaW5lIE9QVEUgQklUKDYpICAvKiBLTUUgbW9kZSBzZWxlY3QgKi8KKyMgZGVmaW5lIE9QVEYgQklUKDcpICAvKiBQb3dlciBtYW5hZ2VtZW50ICovCisKKyNkZWZpbmUgTUlTQ19XUgkJCTB4MGMJLyogQkFTRSswOCwgSURYKzBjLCBXLCBSL1cgKi8KKyNkZWZpbmUgTUlTQ19SRAkJCTB4MGMKKyMgZGVmaW5lIFNDU0lfRElSRUNUSU9OX0RFVEVDVE9SX1NFTEVDVCBCSVQoMCkKKyMgZGVmaW5lIFNDU0kyX0hPU1RfRElSRUNUSU9OX1ZBTElECUJJVCgxKQkvKiBSZWFkIG9ubHkgKi8KKyMgZGVmaW5lIEhPU1QyX1NDU0lfRElSRUNUSU9OX1ZBTElECUJJVCgyKQkvKiBSZWFkIG9ubHkgKi8KKyMgZGVmaW5lIERFTEFZRURfQk1TVEFSVCAgICAgICAgICAgICAgICBCSVQoMykKKyMgZGVmaW5lIE1BU1RFUl9URVJNSU5BVElPTl9TRUxFQ1QgICAgICBCSVQoNCkKKyMgZGVmaW5lIEJNUkVRX05FR0FURV9USU1JTkdfU0VMICAgICAgICBCSVQoNSkKKyMgZGVmaW5lIEFVVE9TRUxfVElNSU5HX1NFTCAgICAgICAgICAgICBCSVQoNikKKyMgZGVmaW5lIE1JU0NfTUFCT1JUX01BU0sJCUJJVCg3KQorIyBkZWZpbmUgQk1TVE9QX0NIQU5HRTJfTk9OREFUQV9QSEFTRQlCSVQoOCkKKworI2RlZmluZSBCTV9DWUNMRQkJMHgwZAkvKiBCQVNFKzA4LCBJRFgrMGQsIEIsIFIvVyAqLworIyBkZWZpbmUgQk1fQ1lDTEUwCQkgQklUKDApCisjIGRlZmluZSBCTV9DWUNMRTEJCSBCSVQoMSkKKyMgZGVmaW5lIEJNX0ZSQU1FX0FTU0VSVF9USU1JTkcJIEJJVCgyKQorIyBkZWZpbmUgQk1fSVJEWV9BU1NFUlRfVElNSU5HCSBCSVQoMykKKyMgZGVmaW5lIEJNX1NJTkdMRV9CVVNfTUFTVEVSCSBCSVQoNCkKKyMgZGVmaW5lIE1FTVJEX0NNRDAgICAgICAgICAgICAgIEJJVCg1KQorIyBkZWZpbmUgU0dUX0FVVE9fUEFSQV9NRU1FRF9DTUQgQklUKDYpCisjIGRlZmluZSBNRU1SRF9DTUQxICAgICAgICAgICAgICBCSVQoNykKKworCisjZGVmaW5lIFNSRVFfRURHSAkJMHgwZQkvKiBCQVNFKzA4LCBJRFgrMGUsIEIsIFcgKi8KKyMgZGVmaW5lIFNSRVFfRURHSF9TRUxFQ1QgQklUKDApCisKKyNkZWZpbmUgVVBfQ05UCQkJMHgwZgkvKiBCQVNFKzA4LCBJRFgrMGYsIEIsIFcgKi8KKyMgZGVmaW5lIFJFUUNOVF9VUCAgQklUKDApCisjIGRlZmluZSBBQ0tDTlRfVVAgIEJJVCgxKQorIyBkZWZpbmUgQk1BRFJfVVAgICBCSVQoNCkKKyMgZGVmaW5lIEJNQ05UX1VQICAgQklUKDUpCisjIGRlZmluZSBTR1RfQ05UX1VQIEJJVCg3KQorCisjZGVmaW5lIENGR19DTURfU1RSCQkweDEwCS8qIEJBU0UrMDgsIElEWCsxMCwgVywgUiAqLworI2RlZmluZSBDRkdfTEFURV9DQUNIRQkJMHgxMQkvKiBCQVNFKzA4LCBJRFgrMTEsIFcsIFIvVyAqLworI2RlZmluZSBDRkdfQkFTRV9BRFJfMQkJMHgxMgkvKiBCQVNFKzA4LCBJRFgrMTIsIFcsIFIgKi8KKyNkZWZpbmUgQ0ZHX0JBU0VfQURSXzIJCTB4MTMJLyogQkFTRSswOCwgSURYKzEzLCBXLCBSICovCisjZGVmaW5lIENGR19JTkxJTkUJCTB4MTQJLyogQkFTRSswOCwgSURYKzE0LCBXLCBSICovCisKKyNkZWZpbmUgU0VSSUFMX1JPTV9DVEwJCTB4MTUJLyogQkFTRSswOCwgSURYKzE1LCBCLCBSICovCisjIGRlZmluZSBTQ0wgQklUKDApCisjIGRlZmluZSBFTkEgQklUKDEpCisjIGRlZmluZSBTREEgQklUKDIpCisKKyNkZWZpbmUgRklGT19IU1RfUE9JTlRFUgkweDE2CS8qIEJBU0UrMDgsIElEWCsxNiwgQiwgUi9XICovCisjZGVmaW5lIFNSRVFfREVMQVkJCTB4MTcJLyogQkFTRSswOCwgSURYKzE3LCBCLCBSL1cgKi8KKyNkZWZpbmUgU0FDS19ERUxBWQkJMHgxOAkvKiBCQVNFKzA4LCBJRFgrMTgsIEIsIFIvVyAqLworI2RlZmluZSBTUkVRX05PSVNFX0NBTkNFTAkweDE5CS8qIEJBU0UrMDgsIElEWCsxOSwgQiwgUi9XICovCisjZGVmaW5lIFNEUF9OT0lTRV9DQU5DRUwJMHgxYQkvKiBCQVNFKzA4LCBJRFgrMWEsIEIsIFIvVyAqLworI2RlZmluZSBERUxBWV9URVNUCQkweDFiCS8qIEJBU0UrMDgsIElEWCsxYiwgQiwgUi9XICovCisjZGVmaW5lIFNEMF9OT0lTRV9DQU5DRUwJMHgyMAkvKiBCQVNFKzA4LCBJRFgrMjAsIEIsIFIvVyAqLworI2RlZmluZSBTRDFfTk9JU0VfQ0FOQ0VMCTB4MjEJLyogQkFTRSswOCwgSURYKzIxLCBCLCBSL1cgKi8KKyNkZWZpbmUgU0QyX05PSVNFX0NBTkNFTAkweDIyCS8qIEJBU0UrMDgsIElEWCsyMiwgQiwgUi9XICovCisjZGVmaW5lIFNEM19OT0lTRV9DQU5DRUwJMHgyMwkvKiBCQVNFKzA4LCBJRFgrMjMsIEIsIFIvVyAqLworI2RlZmluZSBTRDRfTk9JU0VfQ0FOQ0VMCTB4MjQJLyogQkFTRSswOCwgSURYKzI0LCBCLCBSL1cgKi8KKyNkZWZpbmUgU0Q1X05PSVNFX0NBTkNFTAkweDI1CS8qIEJBU0UrMDgsIElEWCsyNSwgQiwgUi9XICovCisjZGVmaW5lIFNENl9OT0lTRV9DQU5DRUwJMHgyNgkvKiBCQVNFKzA4LCBJRFgrMjYsIEIsIFIvVyAqLworI2RlZmluZSBTRDdfTk9JU0VfQ0FOQ0VMCTB4MjcJLyogQkFTRSswOCwgSURYKzI3LCBCLCBSL1cgKi8KKworCisvKgorICogVXNlZnVsIEJ1cyBNb25pdG9yIHN0YXR1cyBjb21iaW5hdGlvbnMuCisgKi8KKyNkZWZpbmUgQlVTTU9OX0JVU19GUkVFICAgIDAKKyNkZWZpbmUgQlVTTU9OX0NPTU1BTkQgICAgICggQlVTTU9OX0JTWSB8ICAgICAgICAgICAgICAgICAgICAgICAgICBCVVNNT05fQ0QgfCBCVVNNT05fUkVRICkKKyNkZWZpbmUgQlVTTU9OX01FU1NBR0VfSU4gICggQlVTTU9OX0JTWSB8IEJVU01PTl9NU0cgfCBCVVNNT05fSU8gfCBCVVNNT05fQ0QgfCBCVVNNT05fUkVRICkKKyNkZWZpbmUgQlVTTU9OX01FU1NBR0VfT1VUICggQlVTTU9OX0JTWSB8IEJVU01PTl9NU0cgfCAgICAgICAgICAgICBCVVNNT05fQ0QgfCBCVVNNT05fUkVRICkKKyNkZWZpbmUgQlVTTU9OX0RBVEFfSU4gICAgICggQlVTTU9OX0JTWSB8ICAgICAgICAgICAgICBCVVNNT05fSU8gfCAgICAgICAgICAgICBCVVNNT05fUkVRICkKKyNkZWZpbmUgQlVTTU9OX0RBVEFfT1VUICAgICggQlVTTU9OX0JTWSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVVNNT05fUkVRICkKKyNkZWZpbmUgQlVTTU9OX1NUQVRVUyAgICAgICggQlVTTU9OX0JTWSB8ICAgICAgICAgICAgICBCVVNNT05fSU8gfCBCVVNNT05fQ0QgfCBCVVNNT05fUkVRICkKKyNkZWZpbmUgQlVTTU9OX1JFU0VMRUNUICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICBCVVNNT05fSU8gICAgICAgICAgICAgICAgICAgICAgICAgIHwgQlVTTU9OX1NFTCkKKyNkZWZpbmUgQlVTTU9OX1BIQVNFX01BU0sgICggICAgICAgICAgICAgIEJVU01PTl9NU0cgfCBCVVNNT05fSU8gfCBCVVNNT05fQ0QgICAgICAgICAgICAgIHwgQlVTTU9OX1NFTCkKKworI2RlZmluZSBCVVNQSEFTRV9DT01NQU5EICAgICAoIEJVU01PTl9DT01NQU5EICAgICAmIEJVU01PTl9QSEFTRV9NQVNLICkKKyNkZWZpbmUgQlVTUEhBU0VfTUVTU0FHRV9JTiAgKCBCVVNNT05fTUVTU0FHRV9JTiAgJiBCVVNNT05fUEhBU0VfTUFTSyApCisjZGVmaW5lIEJVU1BIQVNFX01FU1NBR0VfT1VUICggQlVTTU9OX01FU1NBR0VfT1VUICYgQlVTTU9OX1BIQVNFX01BU0sgKQorI2RlZmluZSBCVVNQSEFTRV9EQVRBX0lOICAgICAoIEJVU01PTl9EQVRBX0lOICAgICAmIEJVU01PTl9QSEFTRV9NQVNLICkKKyNkZWZpbmUgQlVTUEhBU0VfREFUQV9PVVQgICAgKCBCVVNNT05fREFUQV9PVVQgICAgJiBCVVNNT05fUEhBU0VfTUFTSyApCisjZGVmaW5lIEJVU1BIQVNFX1NUQVRVUyAgICAgICggQlVTTU9OX1NUQVRVUyAgICAgICYgQlVTTU9OX1BIQVNFX01BU0sgKQorI2RlZmluZSBCVVNQSEFTRV9TRUxFQ1QgICAgICAoIEJVU01PTl9TRUwgfCBCVVNNT05fSU8gKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHN0cnVjdHVyZSBmb3IgRE1BL1NjYXR0ZXIgR2F0aGVyIGxpc3QKKyAqLworI2RlZmluZSBOU1AzMl9TR19TSVpFCQlTR19BTEwKKwordHlwZWRlZiBzdHJ1Y3QgX25zcDMyX3NndGFibGUgeworCS8qIHZhbHVlcyBtdXN0IGJlIGxpdHRsZSBlbmRpYW4gKi8KKwl1MzJfbGUgYWRkcjsgLyogdHJhbnNmZXIgYWRkcmVzcyAqLworCXUzMl9sZSBsZW47ICAvKiB0cmFuc2ZlciBsZW5ndGguIEJJVCgzMSkgaXMgZm9yIFNHVF9FTkQgbWFyayAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbnNwMzJfc2d0YWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QgX25zcDMyX3NnbHVuIHsKKwluc3AzMl9zZ3RhYmxlIHNndFtOU1AzMl9TR19TSVpFKzFdOwkvKiBTRyB0YWJsZSAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbnNwMzJfc2dsdW47CisjZGVmaW5lIE5TUDMyX1NHX1RBQkxFX1NJWkUgKHNpemVvZihuc3AzMl9zZ3RhYmxlKSAqIE5TUDMyX1NHX1NJWkUgKiBNQVhfVEFSR0VUICogTUFYX0xVTikKKworLyogQXV0byBwYXJhbWV0ZXIgbW9kZSBtZW1vcnkgbWFwLiAgICovCisvKiBBbGwgdmFsdWVzIG11c3QgYmUgbGl0dGxlIGVuZGlhbi4gKi8KK3R5cGVkZWYgc3RydWN0IF9uc3AzMl9hdXRvcGFyYW0geworCXU4ICAgICBjZGJbNCAqIDB4MTBdOyAgICAvKiBTQ1NJIENvbW1hbmQgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1MzJfbGUgbXNnb3V0OyAgICAgICAgICAgLyogb3V0Z29pbmcgbWVzc2FnZXMgICAgICAgICAgICAgICAgICovCisJdTggICAgIHN5bmNyZWc7ICAgICAgICAgIC8qIHN5bmMgcmVnaXN0ZXIgdmFsdWUgICAgICAgICAgICAgICAqLworCXU4ICAgICBhY2t3aWR0aDsgICAgICAgICAvKiBhY2sgd2lkdGggcmVnaXN0ZXIgdmFsdWUgICAgICAgICAgKi8KKwl1OCAgICAgdGFyZ2V0X2lkOyAgICAgICAgLyogdGFyZ2V0L2hvc3QgZGV2aWNlIGlkICAgICAgICAgICAgICovCisJdTggICAgIHNhbXBsZV9yZWc7ICAgICAgIC8qIGhhemFyZCBraWxsZXIgc2FtcGxpbmcgcmF0ZSAgICAgICAqLworCXUxNl9sZSBjb21tYW5kX2NvbnRyb2w7ICAvKiBjb21tYW5kIGNvbnRyb2wgcmVnaXN0ZXIgICAgICAgICAgKi8KKwl1MTZfbGUgdHJhbnNmZXJfY29udHJvbDsgLyogdHJhbnNmZXIgY29udHJvbCByZWdpc3RlciAgICAgICAgICovCisJdTMyX2xlIHNndF9wb2ludGVyOyAgICAgIC8qIFNHIHRhYmxlIHBoeXNpY2FsIGFkZHJlc3MgZm9yIERNQSAqLworCXUzMl9sZSBkdW1teVsyXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG5zcDMyX2F1dG9wYXJhbTsgIC8qIG11c3QgYmUgcGFja2VkIHN0cnVjdCAqLworCisvKgorICogaG9zdCBkYXRhIHN0cnVjdHVyZQorICovCisvKiBtZXNzYWdlIGluL291dCBidWZmZXIgKi8KKyNkZWZpbmUgTVNHT1VUQlVGX01BWAkJMjAKKyNkZWZpbmUgTVNHSU5CVUZfTUFYCQkyMAorCisvKiBmbGFnIGZvciB0cmFuc19tZXRob2QgKi8KKyNkZWZpbmUgTlNQMzJfVFJBTlNGRVJfQlVTTUFTVEVSCUJJVCgwKQorI2RlZmluZSBOU1AzMl9UUkFOU0ZFUl9NTUlPCQlCSVQoMSkJLyogTm90IHN1cHBvcnRlZCB5ZXQgKi8KKyNkZWZpbmUgTlNQMzJfVFJBTlNGRVJfUElPCQlCSVQoMikJLyogTm90IHN1cHBvcnRlZCB5ZXQgKi8KKworCisvKgorICogc3RydWN0dXJlIGZvciBjb25uZWN0ZWQgTFVOIGR5bmFtaWMgZGF0YQorICoKKyAqIE5vdGU6IEN1cnJlbnRseSB0YWdnZWQgcXVldWluZyBpcyBkaXNhYmxlZCwgZWFjaCBuc3AzMl9sdW50IGhvbGRzCisgKiAgICAgICBvbmUgU0NTSSBjb21tYW5kIGFuZCBvbmUgc3RhdGUuCisgKi8KKyNkZWZpbmUgRElTQ1BSSVZfT0sJCUJJVCgwKQkJLyogRElTQ1BSSVYgRW5hYmxlIG1vZGUgKi8KKyNkZWZpbmUgTVNHSU4wMwkJCUJJVCgxKQkJLyogQXV0byBNc2cgSW4gMDMgRmxhZyAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX25zcDMyX2x1bnQgeworCXN0cnVjdCBzY3NpX2NtbmQJKlNDcG50OwkgICAgLyogQ3VycmVudCBIYW5kbGluZyBzdHJ1Y3Qgc2NzaV9jbW5kICovCisJdW5zaWduZWQgbG9uZwkgc2F2ZV9kYXRwOyAgLyogU2F2ZSBEYXRhIFBvaW50ZXIgLSBzYXZlZCBwb3NpdGlvbiBmcm9tIGluaXRpYWwgYWRkcmVzcyAqLworCWludAkJIG1zZ2luMDM7CS8qIGF1dG8gbXNnIGluIDAzIGZsYWcgICAgICovCisJdW5zaWduZWQgaW50CSBzZ19udW07CS8qIFRvdGFsIG51bWJlciBvZiBTRyBlbnRyaWVzICovCisJaW50CQkgY3VyX2VudHJ5OwkvKiBDdXJyZW50IFNHIGVudHJ5IG51bWJlciAqLworCW5zcDMyX3NnbHVuICAgICAqc2dsdW47CQkvKiBzZyB0YWJsZSBwZXIgbHVuICAgICAgICAqLworCWRtYV9hZGRyX3QgICAgICAgc2dsdW5fcGFkZHI7ICAgLyogc2dsdW4gcGh5c2ljYWwgYWRkcmVzcyAgKi8KK30gbnNwMzJfbHVudDsKKworCisvKgorICogU0NTSSBUQVJHRVQvTFVOIGRlZmluaXRpb24KKyAqLworI2RlZmluZSBOU1AzMl9IT1NUX1NDU0lJRCAgICA3ICAvKiBTQ1NJIGluaXRpYXRvciBpcyBldmVyeXRpbWUgZGVmaW5lZCBhcyA3ICovCisjZGVmaW5lIE1BWF9UQVJHRVQJICAgICA4CisjZGVmaW5lIE1BWF9MVU4JCSAgICAgOAkvKiBYWFg6IEluIFNQSTMsIG1heCBudW1iZXIgb2YgTFVOIGlzIDY0LiAqLworCisKK3R5cGVkZWYgc3RydWN0IF9uc3AzMl9zeW5jX3RhYmxlIHsKKwl1bnNpZ25lZCBjaGFyCXBlcmlvZF9udW07CS8qIHBlcmlvZCBudW1iZXIgICAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGNoYXIJYWNrd2lkdGg7CS8qIGFjayB3aWR0aCBkZXNpZ25hdGVkIGJ5IHBlcmlvZCAqLworCXVuc2lnbmVkIGNoYXIJc3RhcnRfcGVyaW9kOwkvKiBzZWFyY2ggcmFuZ2UgLSBzdGFydCBwZXJpb2QgICAgKi8KKwl1bnNpZ25lZCBjaGFyCWVuZF9wZXJpb2Q7CS8qIHNlYXJjaCByYW5nZSAtIGVuZCBwZXJpb2QgICAgICAqLworCXVuc2lnbmVkIGNoYXIgICBzYW1wbGVfcmF0ZTsgICAgLyogaGF6YXJkIGtpbGxlciBwYXJhbWV0ZXIgICAgICAgICovCit9IG5zcDMyX3N5bmNfdGFibGU7CisKKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgdGFyZ2V0IGRldmljZSBzdGF0aWMgZGF0YQorICovCisvKiBmbGFnIGZvciBuc3AzMl90YXJnZXQuc3luY19mbGFnICovCisjZGVmaW5lIFNEVFJfSU5JVElBVE9SCSAgQklUKDApICAgIC8qIHNlbmRpbmcgU0RUUiBmcm9tIGluaXRpYXRvciAgICAgICAgKi8KKyNkZWZpbmUgU0RUUl9UQVJHRVQJICBCSVQoMSkgICAgLyogc2VuZGluZyBTRFRSIGZyb20gdGFyZ2V0ICAgICAgICAgICAqLworI2RlZmluZSBTRFRSX0RPTkUJICBCSVQoMikgICAgLyogZXhjaGFuZ2luZyBTRFRSIGhhcyBiZWVuIHByb2Nlc3NlZCAqLworCisvKiBzeW5jcm9ub3VzIHBlcmlvZCB2YWx1ZSBmb3IgbnNwMzJfdGFyZ2V0LmNvbmZpZ19tYXggKi8KKyNkZWZpbmUgRkFTVDVNCQkJMHgzMgorI2RlZmluZSBGQVNUMTBNCQkJMHgxOQorI2RlZmluZSBVTFRSQTIwTQkJMHgwYworCisvKiBmbGFnIGZvciBuc3AzMl90YXJnZXQue3N5bmNfb2Zmc2V0fSwgcGVyaW9kICovCisjZGVmaW5lIEFTWU5DX09GRlNFVAkJMAkvKiBhc3luY2hyb25vdXMgdHJhbnNmZXIgICAgICAgICAgICovCisjZGVmaW5lIFNZTkNfT0ZGU0VUCQkweGYJLyogc3luY2hyb25vdXMgdHJhbnNmZXIgbWF4IG9mZnNldCAqLworCisvKiBzeW5jcmVnOgorICBiaXQ6MDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKKyAgICAgIC0tLVBFUklPRC0tIC0tLU9GRlNFVC0tICAgKi8KKyNkZWZpbmUgVE9fU1lOQ1JFRyhwZXJpb2QsIG9mZnNldCkgKCgocGVyaW9kKSAmIDB4MGYpIDw8IDQgfCAoKG9mZnNldCkgJiAweDBmKSkKKwordHlwZWRlZiBzdHJ1Y3QgX25zcDMyX3RhcmdldCB7CisJdW5zaWduZWQgY2hhcglzeW5jcmVnOwkvKiB2YWx1ZSBmb3IgU1lOQ1JFRyAgICovCisJdW5zaWduZWQgY2hhcglhY2t3aWR0aDsJLyogdmFsdWUgZm9yIEFDS1dJRFRIICAqLworCXVuc2lnbmVkIGNoYXIgICBwZXJpb2Q7ICAgICAgICAgLyogc3luYyBwZXJpb2QgKDAtMjU1KSAqLworCXVuc2lnbmVkIGNoYXIJb2Zmc2V0OwkJLyogc3luYyBvZmZzZXQgKDAtMTUpICAqLworCWludAkJc3luY19mbGFnOwkvKiBTRFRSXyosIDAgICAgICAgICAgICovCisJaW50CQlsaW1pdF9lbnRyeTsJLyogbWF4IHNwZWVkIGxpbWl0IGVudHJ5IGRlc2lnbmF0ZWQKKwkJCQkJICAgYnkgRUVQUk9NIGNvbmZpZ3VyYXRpb24gKi8KKwl1bnNpZ25lZCBjaGFyICAgc2FtcGxlX3JlZzsgICAgIC8qIFNSRVEgaGF6YXJkIGtpbGxlciByZWdpc3RlciAqLworfSBuc3AzMl90YXJnZXQ7CisKK3R5cGVkZWYgc3RydWN0IF9uc3AzMl9od19kYXRhIHsKKwlpbnQgICAgICAgICAgIElycU51bWJlcjsKKwlpbnQgICAgICAgICAgIEJhc2VBZGRyZXNzOworCWludCAgICAgICAgICAgTnVtQWRkcmVzczsKKwl2b2lkIF9faW9tZW0gKk1taW9BZGRyZXNzOworI2RlZmluZSBOU1AzMl9NTUlPX09GRlNFVCAweDA4MDAKKwl1bnNpZ25lZCBsb25nIE1taW9MZW5ndGg7CisKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpDdXJyZW50U0M7CisKKwlzdHJ1Y3QgcGNpX2RldiAgICAgICAgICAgICAqUGNpOworCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfZGV2aWQ7CisJc3RydWN0IFNjc2lfSG9zdCAgICAgICAgICAgKkhvc3Q7CisJc3BpbmxvY2tfdCAgICAgICAgICAgICAgICAgIExvY2s7CisKKwljaGFyIGluZm9fc3RyWzEwMF07CisKKwkvKiBhbGxvY2F0ZWQgbWVtb3J5IHJlZ2lvbiAqLworCW5zcDMyX3NnbHVuICAgICAgKnNnX2xpc3Q7CS8qIHNnbGlzdCB2aXJ0dXhhbCBhZGRyZXNzICAgICAgICAgKi8KKwlkbWFfYWRkcl90CSAgc2dfcGFkZHI7ICAgICAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIGh3X3NnX3RhYmxlICovCisJbnNwMzJfYXV0b3BhcmFtICAqYXV0b3BhcmFtOwkvKiBhdXRvIHBhcmFtZXRlciB0cmFuc2ZlciByZWdpb24gICovCisJZG1hX2FkZHJfdAkgIGF1dG9fcGFkZHI7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYXV0b3BhcmFtICAgKi8KKwlpbnQgCQkgIGN1cl9lbnRyeTsJLyogY3VycmVudCBzZ3QgZW50cnkgICAgICAgICAgICAgICAqLworCisJLyogdGFyZ2V0L0xVTiAqLworCW5zcDMyX2x1bnQgICAgICAgKmN1cl9sdW50OwkvKiBDdXJyZW50IGNvbm5lY3RlZCBMVU4gdGFibGUgKi8KKwluc3AzMl9sdW50ICAgICAgICBsdW50W01BWF9UQVJHRVRdW01BWF9MVU5dOyAgLyogQWxsIExVTiB0YWJsZSAqLworCisJbnNwMzJfdGFyZ2V0ICAgICAqY3VyX3RhcmdldDsJLyogQ3VycmVudCBjb25uZWN0ZWQgU0NTSSBJRCAgICAqLworCW5zcDMyX3RhcmdldAkgIHRhcmdldFtNQVhfVEFSR0VUXTsJICAgICAvKiBTQ1NJIElEICovCisJaW50CQkgIGN1cl9pZDsJLyogQ3VycmVudCBjb25uZWN0ZWQgdGFyZ2V0IElEICAqLworCWludAkJICBjdXJfbHVuOwkvKiBDdXJyZW50IGNvbm5lY3RlZCB0YXJnZXQgTFVOICovCisKKwkvKiBiZWhhdmlvciBzZXR0aW5nIHBhcmFtZXRlcnMgKi8KKwlpbnQJCSAgdHJhbnNfbWV0aG9kOwkvKiB0cmFuc2ZlciBtZXRob2QgZmxhZyAgICAgICAgICAgICovCisJaW50CQkgIHJlc2V0dGltZTsJLyogUmVzZXQgdGltZSAgICAgICAgICAgICAgICAgICAgICAqLworCWludCAJCSAgY2xvY2s7ICAgICAgIAkvKiBjbG9jayBkaXZpZGluZyBmbGFnICAgICAgICAgICAgICovCisJbnNwMzJfc3luY190YWJsZSAqc3luY3Q7CS8qIHN5bmNfdGFibGUgZGV0ZXJtaW5lZCBieSBjbG9jayAgKi8KKwlpbnQJCSAgc3luY251bTsJLyogdGhlIG1heCBudW1iZXIgb2Ygc3luY3QgZWxlbWVudCAqLworCisJLyogbWVzc2FnZSBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyIG1zZ291dGJ1ZltNU0dPVVRCVUZfTUFYXTsgLyogbXNnb3V0IGJ1ZmZlciAgICAqLworCWNoYXIJICAgICAgbXNnb3V0X2xlbjsJCS8qIG1zZ291dGJ1ZiBsZW5ndGggKi8KKwl1bnNpZ25lZCBjaGFyIG1zZ2luYnVmIFtNU0dJTkJVRl9NQVhdOwkvKiBtZWdpbiBidWZmZXIgICAgICovCisJY2hhcgkgICAgICBtc2dpbl9sZW47CQkvKiBtc2dpbmJ1ZiBsZW5ndGggICovCisKK30gbnNwMzJfaHdfZGF0YTsKKworLyoKKyAqIFRJTUUgZGVmaW5pdGlvbgorICovCisjZGVmaW5lIFJFU0VUX0hPTERfVElNRQkJMTAwMDAJLyogcmVzZXQgdGltZSBpbiB1cyAoU0NTSS0yIHNheXMgdGhlCisJCQkJCSAgIG1pbmltdW0gaXMgMjV1cykgKi8KKyNkZWZpbmUgU0VMX1RJTUVPVVRfVElNRQkxMDAwMAkvKiAyNTBtcyBkZWZpbmVkIGluIFNDU0kgc3BlY2lmaWNhdGlvbgorCQkJCQkgICAoMjUuNnVzLzF1bml0KSAqLworI2RlZmluZSBBUkJJVF9USU1FT1VUX1RJTUUJMTAwCS8qIDEwMHVzICovCisjZGVmaW5lIFJFUVNBQ0tfVElNRU9VVF9USU1FCTEwMDAwCS8qIG1heCB3YWl0IHRpbWUgZm9yIFJFUS9TQUNLIGFzc2VydGlvbgorCQkJCQkgICBvciBuZWdhdGlvbiwgMTAwMDB1cyA9PSAxMG1zICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29tcGF0aWJpbGl0eSBmdW5jdGlvbnMKKyAqLworCisvKiBmb3IgS2VybmVsIDIuNCAqLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkpCisjIGRlZmluZSBzY3NpX3JlZ2lzdGVyX2hvc3QodGVtcGxhdGUpIAlzY3NpX3JlZ2lzdGVyX21vZHVsZShNT0RVTEVfU0NTSV9IQSwgdGVtcGxhdGUpCisjIGRlZmluZSBzY3NpX3VucmVnaXN0ZXJfaG9zdCh0ZW1wbGF0ZSkgc2NzaV91bnJlZ2lzdGVyX21vZHVsZShNT0RVTEVfU0NTSV9IQSwgdGVtcGxhdGUpCisjIGRlZmluZSBzY3NpX2hvc3RfcHV0KGhvc3QpICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKGhvc3QpCisjIGRlZmluZSBwY2lfbmFtZShwY2lfZGV2KSAgICAgICAgICAgICAgKChwY2lfZGV2KS0+c2xvdF9uYW1lKQorCit0eXBlZGVmIHZvaWQgaXJxcmV0dXJuX3Q7CisjIGRlZmluZSBJUlFfTk9ORSAgICAgIC8qICovCisjIGRlZmluZSBJUlFfSEFORExFRCAgIC8qICovCisjIGRlZmluZSBJUlFfUkVUVkFMKHgpIC8qICovCisKKy8qIFRoaXMgaXMgYWQtaG9jIHZlcnNpb24gb2Ygc2NzaV9ob3N0X2dldF9uZXh0KCkgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IFNjc2lfSG9zdCAqc2NzaV9ob3N0X2dldF9uZXh0KHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJaWYgKGhvc3QgPT0gTlVMTCkgeworCQlyZXR1cm4gc2NzaV9ob3N0bGlzdDsKKwl9IGVsc2UgeworCQlyZXR1cm4gaG9zdC0+bmV4dDsKKwl9Cit9CisKKy8qIFRoaXMgaXMgYWQtaG9jIHZlcnNpb24gb2Ygc2NzaV9ob3N0X2huX2dldCgpICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBTY3NpX0hvc3QgKnNjc2lfaG9zdF9obl9nZXQodW5zaWduZWQgc2hvcnQgaG9zdG5vKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisKKwlmb3IgKGhvc3QgPSBzY3NpX2hvc3RfZ2V0X25leHQoTlVMTCk7IGhvc3QgIT0gTlVMTDsKKwkgICAgIGhvc3QgPSBzY3NpX2hvc3RfZ2V0X25leHQoaG9zdCkpIHsKKwkJaWYgKGhvc3QtPmhvc3Rfbm8gPT0gaG9zdG5vKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBob3N0OworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTlNQMzJfSCAqLworLyogZW5kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbnNwMzJfZGVidWcuYyBiL2RyaXZlcnMvc2NzaS9uc3AzMl9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmM2M1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbnNwMzJfZGVidWcuYwpAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIFdvcmtiaXQgTmluamFTQ1NJLTMyQmkvVURFIFBDSS9DYXJkQnVzIFNDU0kgSG9zdCBCdXMgQWRhcHRlciBkcml2ZXIKKyAqIERlYnVnIHJvdXRpbmUKKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFNob3cgdGhlIGNvbW1hbmQgZGF0YSBvZiBhIGNvbW1hbmQKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgdW5rbm93bltdID0gIlVOS05PV04iOworCitzdGF0aWMgY29uc3QgY2hhciAqIGdyb3VwXzBfY29tbWFuZHNbXSA9IHsKKy8qIDAwLTAzICovICJUZXN0IFVuaXQgUmVhZHkiLCAiUmV6ZXJvIFVuaXQiLCB1bmtub3duLCAiUmVxdWVzdCBTZW5zZSIsCisvKiAwNC0wNyAqLyAiRm9ybWF0IFVuaXQiLCAiUmVhZCBCbG9jayBMaW1pdHMiLCB1bmtub3duLCAiUmVhc3NzaWduIEJsb2NrcyIsCisvKiAwOC0wZCAqLyAiUmVhZCAoNikiLCB1bmtub3duLCAiV3JpdGUgKDYpIiwgIlNlZWsgKDYpIiwgdW5rbm93biwgdW5rbm93biwKKy8qIDBlLTEyICovIHVua25vd24sICJSZWFkIFJldmVyc2UiLCAiV3JpdGUgRmlsZW1hcmtzIiwgIlNwYWNlIiwgIklucXVpcnkiLCAgCisvKiAxMy0xNiAqLyB1bmtub3duLCAiUmVjb3ZlciBCdWZmZXJlZCBEYXRhIiwgIk1vZGUgU2VsZWN0IiwgIlJlc2VydmUiLAorLyogMTctMWIgKi8gIlJlbGVhc2UiLCAiQ29weSIsICJFcmFzZSIsICJNb2RlIFNlbnNlIiwgIlN0YXJ0L1N0b3AgVW5pdCIsCisvKiAxYy0xZCAqLyAiUmVjZWl2ZSBEaWFnbm9zdGljIiwgIlNlbmQgRGlhZ25vc3RpYyIsIAorLyogMWUtMWYgKi8gIlByZXZlbnQvQWxsb3cgTWVkaXVtIFJlbW92YWwiLCB1bmtub3duLAorfTsKKworCitzdGF0aWMgY29uc3QgY2hhciAqZ3JvdXBfMV9jb21tYW5kc1tdID0geworLyogMjAtMjIgKi8gIHVua25vd24sIHVua25vd24sIHVua25vd24sCisvKiAyMy0yOCAqLyB1bmtub3duLCB1bmtub3duLCAiUmVhZCBDYXBhY2l0eSIsIHVua25vd24sIHVua25vd24sICJSZWFkICgxMCkiLAorLyogMjktMmQgKi8gdW5rbm93biwgIldyaXRlICgxMCkiLCAiU2VlayAoMTApIiwgdW5rbm93biwgdW5rbm93biwKKy8qIDJlLTMxICovICJXcml0ZSBWZXJpZnkiLCJWZXJpZnkiLCAiU2VhcmNoIEhpZ2giLCAiU2VhcmNoIEVxdWFsIiwKKy8qIDMyLTM0ICovICJTZWFyY2ggTG93IiwgIlNldCBMaW1pdHMiLCAiUHJlZmV0Y2ggb3IgUmVhZCBQb3NpdGlvbiIsIAorLyogMzUtMzcgKi8gIlN5bmNocm9uaXplIENhY2hlIiwiTG9jay9VbmxvY2sgQ2FjaGUiLCAiUmVhZCBEZWZlY3QgRGF0YSIsCisvKiAzOC0zYyAqLyAiTWVkaXVtIFNjYW4iLCAiQ29tcGFyZSIsIkNvcHkgVmVyaWZ5IiwgIldyaXRlIEJ1ZmZlciIsICJSZWFkIEJ1ZmZlciIsCisvKiAzZC0zZiAqLyAiVXBkYXRlIEJsb2NrIiwgIlJlYWQgTG9uZyIsICAiV3JpdGUgTG9uZyIsCit9OworCisKK3N0YXRpYyBjb25zdCBjaGFyICpncm91cF8yX2NvbW1hbmRzW10gPSB7CisvKiA0MC00MSAqLyAiQ2hhbmdlIERlZmluaXRpb24iLCAiV3JpdGUgU2FtZSIsIAorLyogNDItNDggKi8gIlJlYWQgU3ViLUNoKGNkKSIsICJSZWFkIFRPQyIsICJSZWFkIEhlYWRlcihjZCkiLCAiUGxheSBBdWRpbyhjZCkiLCB1bmtub3duLCAiUGxheSBBdWRpbyBNU0YoY2QpIiwgIlBsYXkgQXVkaW8gVHJhY2svSW5kZXgoY2QpIiwgCisvKiA0OS00ZiAqLyAiUGxheSBUcmFjayBSZWxhdGl2ZSgxMCkoY2QpIiwgdW5rbm93biwgIlBhdXNlL1Jlc3VtZShjZCkiLCAiTG9nIFNlbGVjdCIsICJMb2cgU2Vuc2UiLCB1bmtub3duLCB1bmtub3duLAorLyogNTAtNTUgKi8gdW5rbm93biwgdW5rbm93biwgdW5rbm93biwgdW5rbm93biwgdW5rbm93biwgIk1vZGUgU2VsZWN0ICgxMCkiLAorLyogNTYtNWIgKi8gdW5rbm93biwgdW5rbm93biwgdW5rbm93biwgdW5rbm93biwgIk1vZGUgU2Vuc2UgKDEwKSIsIHVua25vd24sCisvKiA1Yy01ZiAqLyB1bmtub3duLCB1bmtub3duLCB1bmtub3duLAorfTsKKworI2RlZmluZSBncm91cChvcGNvZGUpICgoKG9wY29kZSkgPj4gNSkgJiA3KQorCisjZGVmaW5lIFJFU0VSVkVEX0dST1VQICAwCisjZGVmaW5lIFZFTkRPUl9HUk9VUCAgICAxCisjZGVmaW5lIE5PVEVYVF9HUk9VUCAgICAyCisKK3N0YXRpYyBjb25zdCBjaGFyICoqY29tbWFuZHNbXSA9IHsKKyAgICBncm91cF8wX2NvbW1hbmRzLCBncm91cF8xX2NvbW1hbmRzLCBncm91cF8yX2NvbW1hbmRzLCAKKyAgICAoY29uc3QgY2hhciAqKikgUkVTRVJWRURfR1JPVVAsIChjb25zdCBjaGFyICoqKSBSRVNFUlZFRF9HUk9VUCwgCisgICAgKGNvbnN0IGNoYXIgKiopIE5PVEVYVF9HUk9VUCwgKGNvbnN0IGNoYXIgKiopIFZFTkRPUl9HUk9VUCwgCisgICAgKGNvbnN0IGNoYXIgKiopIFZFTkRPUl9HUk9VUAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgcmVzZXJ2ZWRbXSA9ICJSRVNFUlZFRCI7CitzdGF0aWMgY29uc3QgY2hhciB2ZW5kb3JbXSA9ICJWRU5ET1IgU1BFQ0lGSUMiOworCitzdGF0aWMgdm9pZCBwcmludF9vcGNvZGVrKHVuc2lnbmVkIGNoYXIgb3Bjb2RlKQoreworCWNvbnN0IGNoYXIgKip0YWJsZSA9IGNvbW1hbmRzWyBncm91cChvcGNvZGUpIF07CisKKwlzd2l0Y2ggKCh1bnNpZ25lZCBsb25nKSB0YWJsZSkgeworCWNhc2UgUkVTRVJWRURfR1JPVVA6CisJCXByaW50aygiJXNbJTAyeF0gIiwgcmVzZXJ2ZWQsIG9wY29kZSk7IAorCQlicmVhazsKKwljYXNlIE5PVEVYVF9HUk9VUDoKKwkJcHJpbnRrKCIlcyhub3RleHQpWyUwMnhdICIsIHVua25vd24sIG9wY29kZSk7IAorCQlicmVhazsKKwljYXNlIFZFTkRPUl9HUk9VUDoKKwkJcHJpbnRrKCIlc1slMDJ4XSAiLCB2ZW5kb3IsIG9wY29kZSk7IAorCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAodGFibGVbb3Bjb2RlICYgMHgxZl0gIT0gdW5rbm93bikKKwkJCXByaW50aygiJXNbJTAyeF0gIiwgdGFibGVbb3Bjb2RlICYgMHgxZl0sIG9wY29kZSk7CisJCWVsc2UKKwkJCXByaW50aygiJXNbJTAyeF0gIiwgdW5rbm93biwgb3Bjb2RlKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcmludF9jb21tYW5kayAodW5zaWduZWQgY2hhciAqY29tbWFuZCkKK3sKKwlpbnQgaSxzOworLy8JcHJpbnRrKEtFUk5fREVCVUcpOworCXByaW50X29wY29kZWsoY29tbWFuZFswXSk7CisJLypwcmludGsoS0VSTl9ERUJVRyAiJXMgIiwgX19GVU5DVElPTl9fKTsqLworCWlmICgoY29tbWFuZFswXSA+PiA1KSA9PSA2IHx8CisJICAgIChjb21tYW5kWzBdID4+IDUpID09IDcgKSB7CisJCXMgPSAxMjsgLyogdmVuZGVyIHNwZWNpZmljICovCisJfSBlbHNlIHsKKwkJcyA9IENPTU1BTkRfU0laRShjb21tYW5kWzBdKTsKKwl9CisKKwlmb3IgKCBpID0gMTsgaSA8IHM7ICsraSkgeworCQlwcmludGsoIiUwMnggIiwgY29tbWFuZFtpXSk7CisJfQorCisJc3dpdGNoIChzKSB7CisJY2FzZSA2OgorCQlwcmludGsoIkxCQT0lZCBsZW49JWQiLAorCQkgICAgICAgKCgodW5zaWduZWQgaW50KWNvbW1hbmRbMV0gJiAweDBmKSA8PCAxNikgfAorCQkgICAgICAgKCAodW5zaWduZWQgaW50KWNvbW1hbmRbMl0gICAgICAgICA8PCAgOCkgfAorCQkgICAgICAgKCAodW5zaWduZWQgaW50KWNvbW1hbmRbM10gICAgICAgICAgICAgICksCisJCSAgICAgICAodW5zaWduZWQgaW50KWNvbW1hbmRbNF0KKwkJCSk7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCXByaW50aygiTEJBPSVkIGxlbj0lZCIsCisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzJdIDw8IDI0KSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzNdIDw8IDE2KSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzRdIDw8ICA4KSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzVdICAgICAgKSwKKwkJICAgICAgICgodW5zaWduZWQgaW50KWNvbW1hbmRbN10gPDwgIDgpIHwKKwkJICAgICAgICgodW5zaWduZWQgaW50KWNvbW1hbmRbOF0gICAgICApCisJCSAgICAgICApOworCQlicmVhazsKKwljYXNlIDEyOgorCQlwcmludGsoIkxCQT0lZCBsZW49JWQiLAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpY29tbWFuZFsyXSA8PCAyNCkgfAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpY29tbWFuZFszXSA8PCAxNikgfAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpY29tbWFuZFs0XSA8PCAgOCkgfAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpY29tbWFuZFs1XSAgICAgICksCisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzZdIDw8IDI0KSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzddIDw8IDE2KSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzhdIDw8ICA4KSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzldICAgICAgKQorCQkgICAgICAgKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19jb21tYW5kKFNjc2lfQ21uZCAqU0NwbnQpCit7CisJcHJpbnRfY29tbWFuZGsoU0NwbnQtPmNtbmQpOworfQorCitzdGF0aWMgdm9pZCBzaG93X2J1c3BoYXNlKHVuc2lnbmVkIGNoYXIgc3RhdCkKK3sKKwlzd2l0Y2goc3RhdCkgeworCWNhc2UgQlVTUEhBU0VfQ09NTUFORDoKKwkJcHJpbnRrKCAiQlVTUEhBU0VfQ09NTUFORFxuIik7CisJCWJyZWFrOworCWNhc2UgQlVTUEhBU0VfTUVTU0FHRV9JTjoKKwkJcHJpbnRrKCAiQlVTUEhBU0VfTUVTU0FHRV9JTlxuIik7CisJCWJyZWFrOworCWNhc2UgQlVTUEhBU0VfTUVTU0FHRV9PVVQ6CisJCXByaW50ayggIkJVU1BIQVNFX01FU1NBR0VfT1VUXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBCVVNQSEFTRV9EQVRBX0lOOgorCQlwcmludGsoICJCVVNQSEFTRV9EQVRBX0lOXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBCVVNQSEFTRV9EQVRBX09VVDoKKwkJcHJpbnRrKCAiQlVTUEhBU0VfREFUQV9PVVRcbiIpOworCQlicmVhazsKKwljYXNlIEJVU1BIQVNFX1NUQVRVUzoKKwkJcHJpbnRrKCAiQlVTUEhBU0VfU1RBVFVTXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBCVVNQSEFTRV9TRUxFQ1Q6CisJCXByaW50ayggIkJVU1BIQVNFX1NFTEVDVFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayggIkJVU1BIQVNFX290aGVyOiAweCV4XG4iLCBzdGF0KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaG93X2F1dG9waGFzZSh1bnNpZ25lZCBzaG9ydCBpKQoreworCXByaW50aygiYXV0bzogMHgleCwiLCBpKTsKKworCWlmKGkgJiBDT01NQU5EX1BIQVNFKSB7CisJCXByaW50aygiIGNtZCIpOworCX0KKwlpZihpICYgREFUQV9JTl9QSEFTRSkgeworCQlwcmludGsoIiBkaW4iKTsKKwl9CisJaWYoaSAmIERBVEFfT1VUX1BIQVNFKSB7CisJCXByaW50aygiIGRvdXQiKTsKKwl9CisJaWYoaSAmIE1TR09VVF9QSEFTRSkgeworCQlwcmludGsoIiBtb3V0Iik7CisJfQorCWlmKGkgJiBTVEFUVVNfUEhBU0UpIHsKKwkJcHJpbnRrKCIgc3RhdCIpOworCX0KKwlpZihpICYgSUxMRUdBTF9QSEFTRSkgeworCQlwcmludGsoIiBpbGwiKTsKKwl9CisJaWYoaSAmIEJVU19GUkVFX09DQ1VFUikgeworCQlwcmludGsoIiBiZnJlZS1vIik7CisJfQorCWlmKGkgJiBNU0dfSU5fT0NDVUVSKSB7CisJCXByaW50aygiIG1pbi1vIik7CisJfQorCWlmKGkgJiBNU0dfT1VUX09DQ1VFUikgeworCQlwcmludGsoIiBtb3V0LW8iKTsKKwl9CisJaWYoaSAmIFNFTEVDVElPTl9USU1FT1VUKSB7CisJCXByaW50aygiIHNlbCIpOworCX0KKwlpZihpICYgTVNHSU5fMDBfVkFMSUQpIHsKKwkJcHJpbnRrKCIgbTAiKTsKKwl9CisJaWYoaSAmIE1TR0lOXzAyX1ZBTElEKSB7CisJCXByaW50aygiIG0yIik7CisJfQorCWlmKGkgJiBNU0dJTl8wM19WQUxJRCkgeworCQlwcmludGsoIiBtMyIpOworCX0KKwlpZihpICYgTVNHSU5fMDRfVkFMSUQpIHsKKwkJcHJpbnRrKCIgbTQiKTsKKwl9CisJaWYoaSAmIEFVVE9TQ1NJX0JVU1kpIHsKKwkJcHJpbnRrKCIgYnVzeSIpOworCX0KKworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIHZvaWQgbnNwMzJfcHJpbnRfcmVnaXN0ZXIoaW50IGJhc2UpCit7CisJaWYgKCEoTlNQMzJfREVCVUdfTUFTSyAmIE5TUDMyX1NQRUNJQUxfUFJJTlRfUkVHSVNURVIpKQorCQlyZXR1cm47CisKKwlwcmludGsoIlBoYXNlPTB4JXgsICIsIG5zcDMyX3JlYWQxKGJhc2UsIFNDU0lfQlVTX01PTklUT1IpKTsKKwlwcmludGsoIk9sZFBoYXNlPTB4JXgsICIsIG5zcDMyX2luZGV4X3JlYWQxKGJhc2UsIE9MRF9TQ1NJX1BIQVNFKSk7CisJcHJpbnRrKCJzeW5jcmVnPTB4JXgsICIsIG5zcDMyX3JlYWQxKGJhc2UsIFNZTkNfUkVHKSk7CisJcHJpbnRrKCJhY2t3aWR0aD0weCV4LCAiLCBuc3AzMl9yZWFkMShiYXNlLCBBQ0tfV0lEVEgpKTsKKwlwcmludGsoInNndHBhZGRyPTB4JWx4LCAiLCBuc3AzMl9yZWFkNChiYXNlLCBTR1RfQURSKSk7CisJcHJpbnRrKCJzY3Npb3V0bGF0Y2g9MHgleCwgIiwgbnNwMzJfcmVhZDEoYmFzZSwgU0NTSV9PVVRfTEFUQ0hfVEFSR0VUX0lEKSk7CisJcHJpbnRrKCJtc2dvdXQ9MHglbHgsICIsIG5zcDMyX3JlYWQ0KGJhc2UsIFNDU0lfTVNHX09VVCkpOworCXByaW50aygibWlzY3JkPTB4JXgsICIsIG5zcDMyX2luZGV4X3JlYWQyKGJhc2UsIE1JU0NfV1IpKTsKKwlwcmludGsoInNlbHRpbWVvdXQ9MHgleCwgIiwgbnNwMzJfcmVhZDIoYmFzZSwgU0VMX1RJTUVfT1VUKSk7CisJcHJpbnRrKCJzcmVxcmF0ZT0weCV4LCAiLCBuc3AzMl9yZWFkMShiYXNlLCBTUkVRX1NNUExfUkFURSkpOworCXByaW50aygidHJhbnNTdGF0dXM9MHgleCwgIiwgbnNwMzJfcmVhZDIoYmFzZSwgVFJBTlNGRVJfU1RBVFVTKSk7CisJcHJpbnRrKCJyZXNlbGVjdGlkPTB4JXgsICIsIG5zcDMyX3JlYWQyKGJhc2UsIENPTU1BTkRfQ09OVFJPTCkpOworCXByaW50aygiYXJiaXQ9MHgleCwgIiwgbnNwMzJfcmVhZDEoYmFzZSwgQVJCSVRfU1RBVFVTKSk7CisJcHJpbnRrKCJCbVN0YXJ0PTB4JWx4LCAiLCBuc3AzMl9yZWFkNChiYXNlLCBCTV9TVEFSVF9BRFIpKTsKKwlwcmludGsoIkJtQ291bnQ9MHglbHgsICIsIG5zcDMyX3JlYWQ0KGJhc2UsIEJNX0NOVCkpOworCXByaW50aygiU2Fja0NudD0weCVseCwgIiwgbnNwMzJfcmVhZDQoYmFzZSwgU0FDS19DTlQpKTsKKwlwcmludGsoIlNSZXFDbnQ9MHglbHgsICIsIG5zcDMyX3JlYWQ0KGJhc2UsIFNSRVFfQ05UKSk7CisJcHJpbnRrKCJTYXZlZFNhY2tDbnQ9MHglbHgsICIsIG5zcDMyX3JlYWQ0KGJhc2UsIFNBVkVEX1NBQ0tfQ05UKSk7CisJcHJpbnRrKCJTY3NpQnVzQ29udHJvbD0weCV4LCAiLCBuc3AzMl9yZWFkMShiYXNlLCBTQ1NJX0JVU19DT05UUk9MKSk7CisJcHJpbnRrKCJGaWZvUmVzdENudD0weCV4LCAiLCBuc3AzMl9yZWFkMihiYXNlLCBGSUZPX1JFU1RfQ05UKSk7CisJcHJpbnRrKCJDZGJJbj0weCV4LCAiLCBuc3AzMl9yZWFkMShiYXNlLCBTQ1NJX0NTQl9JTikpOworCXByaW50aygiXG4iKTsKKworCWlmICgwKSB7CisJCXByaW50aygiZXhlY3BoPTB4JXgsICIsIG5zcDMyX3JlYWQyKGJhc2UsIFNDU0lfRVhFQ1VURV9QSEFTRSkpOworCQlwcmludGsoIklycVN0YXR1cz0weCV4LCAiLCBuc3AzMl9yZWFkMihiYXNlLCBJUlFfU1RBVFVTKSk7CisJCXByaW50aygiXG4iKTsKKwl9Cit9CisKKy8qIGVuZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL25zcDMyX2lvLmggYi9kcml2ZXJzL3Njc2kvbnNwMzJfaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2YzYzI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL25zcDMyX2lvLmgKQEAgLTAsMCArMSwyNTkgQEAKKy8qCisgKiBXb3JrYml0IE5pbmphU0NTSS0zMkJpL1VERSBQQ0kvQ2FyZEJ1cyBTQ1NJIEhvc3QgQnVzIEFkYXB0ZXIgZHJpdmVyCisgKiBJL08gcm91dGluZQorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9OU1AzMl9JT19ICisjZGVmaW5lIF9OU1AzMl9JT19ICisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3AzMl93cml0ZTEodW5zaWduZWQgaW50ICBiYXNlLAorCQkJCXVuc2lnbmVkIGludCAgaW5kZXgsCisJCQkJdW5zaWduZWQgY2hhciB2YWwpCit7CisJb3V0Yih2YWwsIChiYXNlICsgaW5kZXgpKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIG5zcDMyX3JlYWQxKHVuc2lnbmVkIGludCBiYXNlLAorCQkJCQl1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJcmV0dXJuIGluYihiYXNlICsgaW5kZXgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwMzJfd3JpdGUyKHVuc2lnbmVkIGludCAgIGJhc2UsCisJCQkJdW5zaWduZWQgaW50ICAgaW5kZXgsCisJCQkJdW5zaWduZWQgc2hvcnQgdmFsKQoreworCW91dHcodmFsLCAoYmFzZSArIGluZGV4KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgbnNwMzJfcmVhZDIodW5zaWduZWQgaW50IGJhc2UsCisJCQkJCSB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJcmV0dXJuIGludyhiYXNlICsgaW5kZXgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwMzJfd3JpdGU0KHVuc2lnbmVkIGludCAgYmFzZSwKKwkJCQl1bnNpZ25lZCBpbnQgIGluZGV4LAorCQkJCXVuc2lnbmVkIGxvbmcgdmFsKQoreworCW91dGwodmFsLCAoYmFzZSArIGluZGV4KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBuc3AzMl9yZWFkNCh1bnNpZ25lZCBpbnQgYmFzZSwKKwkJCQkJdW5zaWduZWQgaW50IGluZGV4KQoreworCXJldHVybiBpbmwoYmFzZSArIGluZGV4KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGlubGluZSB2b2lkIG5zcDMyX21taW9fd3JpdGUxKHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCAgaW5kZXgsCisJCQkJICAgICB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwdHI7CisKKwlwdHIgPSAodW5zaWduZWQgY2hhciAqKShiYXNlICsgTlNQMzJfTU1JT19PRkZTRVQgKyBpbmRleCk7CisKKwl3cml0ZWIodmFsLCBwdHIpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgbnNwMzJfbW1pb19yZWFkMSh1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50ICBpbmRleCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwdHI7CisKKwlwdHIgPSAodW5zaWduZWQgY2hhciAqKShiYXNlICsgTlNQMzJfTU1JT19PRkZTRVQgKyBpbmRleCk7CisKKwlyZXR1cm4gcmVhZGIocHRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5zcDMyX21taW9fd3JpdGUyKHVuc2lnbmVkIGxvbmcgIGJhc2UsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgICBpbmRleCwKKwkJCQkgICAgIHVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqcHRyOworCisJcHRyID0gKHVuc2lnbmVkIHNob3J0ICopKGJhc2UgKyBOU1AzMl9NTUlPX09GRlNFVCArIGluZGV4KTsKKworCXdyaXRldyhjcHVfdG9fbGUxNih2YWwpLCBwdHIpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IG5zcDMyX21taW9fcmVhZDIodW5zaWduZWQgbG9uZyBiYXNlLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgIGluZGV4KQoreworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICpwdHI7CisKKwlwdHIgPSAodW5zaWduZWQgc2hvcnQgKikoYmFzZSArIE5TUDMyX01NSU9fT0ZGU0VUICsgaW5kZXgpOworCisJcmV0dXJuIGxlMTZfdG9fY3B1KHJlYWR3KHB0cikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwMzJfbW1pb193cml0ZTQodW5zaWduZWQgbG9uZyBiYXNlLAorCQkJCSAgICAgdW5zaWduZWQgaW50ICBpbmRleCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnB0cjsKKworCXB0ciA9ICh1bnNpZ25lZCBsb25nICopKGJhc2UgKyBOU1AzMl9NTUlPX09GRlNFVCArIGluZGV4KTsKKworCXdyaXRlbChjcHVfdG9fbGUzMih2YWwpLCBwdHIpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbnNwMzJfbW1pb19yZWFkNCh1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50ICBpbmRleCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpwdHI7CisKKwlwdHIgPSAodW5zaWduZWQgbG9uZyAqKShiYXNlICsgTlNQMzJfTU1JT19PRkZTRVQgKyBpbmRleCk7CisKKwlyZXR1cm4gbGUzMl90b19jcHUocmVhZGwocHRyKSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBuc3AzMl9pbmRleF9yZWFkMSh1bnNpZ25lZCBpbnQgYmFzZSwKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IHJlZykKK3sKKwlvdXRiKHJlZywgYmFzZSArIElOREVYX1JFRyk7CisJcmV0dXJuIGluYihiYXNlICsgREFUQV9SRUdfTE9XKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5zcDMyX2luZGV4X3dyaXRlMSh1bnNpZ25lZCBpbnQgIGJhc2UsCisJCQkJICAgICAgdW5zaWduZWQgaW50ICByZWcsCisJCQkJICAgICAgdW5zaWduZWQgY2hhciB2YWwpCit7CisJb3V0YihyZWcsIGJhc2UgKyBJTkRFWF9SRUcgICApOworCW91dGIodmFsLCBiYXNlICsgREFUQV9SRUdfTE9XKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBuc3AzMl9pbmRleF9yZWFkMih1bnNpZ25lZCBpbnQgYmFzZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCByZWcpCit7CisJb3V0YihyZWcsIGJhc2UgKyBJTkRFWF9SRUcpOworCXJldHVybiBpbncoYmFzZSArIERBVEFfUkVHX0xPVyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3AzMl9pbmRleF93cml0ZTIodW5zaWduZWQgaW50ICAgYmFzZSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgICByZWcsCisJCQkJICAgICAgdW5zaWduZWQgc2hvcnQgdmFsKQoreworCW91dGIocmVnLCBiYXNlICsgSU5ERVhfUkVHICAgKTsKKwlvdXR3KHZhbCwgYmFzZSArIERBVEFfUkVHX0xPVyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBuc3AzMl9pbmRleF9yZWFkNCh1bnNpZ25lZCBpbnQgYmFzZSwKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IHJlZykKK3sKKwl1bnNpZ25lZCBsb25nIGgsbDsKKworCW91dGIocmVnLCBiYXNlICsgSU5ERVhfUkVHKTsKKwlsID0gaW53KGJhc2UgKyBEQVRBX1JFR19MT1cpOworCWggPSBpbncoYmFzZSArIERBVEFfUkVHX0hJICk7CisKKwlyZXR1cm4gKChoIDw8IDE2KSB8IGwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwMzJfaW5kZXhfd3JpdGU0KHVuc2lnbmVkIGludCAgYmFzZSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgIHJlZywKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGgsbDsKKworCWggPSAodmFsICYgMHhmZmZmMDAwMCkgPj4gMTY7CisJbCA9ICh2YWwgJiAweDAwMDBmZmZmKSA+PiAgMDsKKworCW91dGIocmVnLCBiYXNlICsgSU5ERVhfUkVHICAgKTsKKwlvdXR3KGwsICAgYmFzZSArIERBVEFfUkVHX0xPVyk7CisJb3V0dyhoLCAgIGJhc2UgKyBEQVRBX1JFR19ISSApOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgbnNwMzJfbW1pb19pbmRleF9yZWFkMSh1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgcmVnKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICppbmRleF9wdHIsICpkYXRhX3B0cjsKKworCWluZGV4X3B0ciA9ICh1bnNpZ25lZCBzaG9ydCAqKShiYXNlICsgTlNQMzJfTU1JT19PRkZTRVQgKyBJTkRFWF9SRUcpOworCWRhdGFfcHRyICA9ICh1bnNpZ25lZCBzaG9ydCAqKShiYXNlICsgTlNQMzJfTU1JT19PRkZTRVQgKyBEQVRBX1JFR19MT1cpOworCisJd3JpdGViKHJlZywgaW5kZXhfcHRyKTsKKwlyZXR1cm4gcmVhZGIoZGF0YV9wdHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwMzJfbW1pb19pbmRleF93cml0ZTEodW5zaWduZWQgbG9uZyBiYXNlLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgIHJlZywKKwkJCQkJICAgdW5zaWduZWQgY2hhciB2YWwpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKmluZGV4X3B0ciwgKmRhdGFfcHRyOworCisJaW5kZXhfcHRyID0gKHVuc2lnbmVkIHNob3J0ICopKGJhc2UgKyBOU1AzMl9NTUlPX09GRlNFVCArIElOREVYX1JFRyk7CisJZGF0YV9wdHIgID0gKHVuc2lnbmVkIHNob3J0ICopKGJhc2UgKyBOU1AzMl9NTUlPX09GRlNFVCArIERBVEFfUkVHX0xPVyk7CisKKwl3cml0ZWIocmVnLCBpbmRleF9wdHIpOworCXdyaXRlYih2YWwsIGRhdGFfcHRyICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgbnNwMzJfbW1pb19pbmRleF9yZWFkMih1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkJCQkgICAgdW5zaWduZWQgaW50ICByZWcpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKmluZGV4X3B0ciwgKmRhdGFfcHRyOworCisJaW5kZXhfcHRyID0gKHVuc2lnbmVkIHNob3J0ICopKGJhc2UgKyBOU1AzMl9NTUlPX09GRlNFVCArIElOREVYX1JFRyk7CisJZGF0YV9wdHIgID0gKHVuc2lnbmVkIHNob3J0ICopKGJhc2UgKyBOU1AzMl9NTUlPX09GRlNFVCArIERBVEFfUkVHX0xPVyk7CisKKwl3cml0ZWIocmVnLCBpbmRleF9wdHIpOworCXJldHVybiBsZTE2X3RvX2NwdShyZWFkdyhkYXRhX3B0cikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwMzJfbW1pb19pbmRleF93cml0ZTIodW5zaWduZWQgbG9uZyAgYmFzZSwKKwkJCQkJICAgdW5zaWduZWQgaW50ICAgcmVnLAorCQkJCQkgICB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKmluZGV4X3B0ciwgKmRhdGFfcHRyOworCisJaW5kZXhfcHRyID0gKHVuc2lnbmVkIHNob3J0ICopKGJhc2UgKyBOU1AzMl9NTUlPX09GRlNFVCArIElOREVYX1JFRyk7CisJZGF0YV9wdHIgID0gKHVuc2lnbmVkIHNob3J0ICopKGJhc2UgKyBOU1AzMl9NTUlPX09GRlNFVCArIERBVEFfUkVHX0xPVyk7CisKKwl3cml0ZWIocmVnLCAgICAgICAgICAgICAgaW5kZXhfcHRyKTsKKwl3cml0ZXcoY3B1X3RvX2xlMTYodmFsKSwgZGF0YV9wdHIgKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGlubGluZSB2b2lkIG5zcDMyX211bHRpX3JlYWQ0KHVuc2lnbmVkIGludCAgIGJhc2UsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgICByZWcsCisJCQkJICAgICB2b2lkICAgICAgICAgICpidWYsCisJCQkJICAgICB1bnNpZ25lZCBsb25nICBjb3VudCkKK3sKKwlpbnNsKGJhc2UgKyByZWcsIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwMzJfZmlmb19yZWFkKHVuc2lnbmVkIGludCAgIGJhc2UsCisJCQkJICAgdm9pZCAgICAgICAgICAqYnVmLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgIGNvdW50KQoreworCW5zcDMyX211bHRpX3JlYWQ0KGJhc2UsIEZJRk9fREFUQV9MT1csIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwMzJfbXVsdGlfd3JpdGU0KHVuc2lnbmVkIGludCAgIGJhc2UsCisJCQkJICAgICAgdW5zaWduZWQgaW50ICAgcmVnLAorCQkJCSAgICAgIHZvaWQgICAgICAgICAgKmJ1ZiwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nICBjb3VudCkKK3sKKwlvdXRzbChiYXNlICsgcmVnLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5zcDMyX2ZpZm9fd3JpdGUodW5zaWduZWQgaW50ICAgYmFzZSwKKwkJCQkgICAgdm9pZCAgICAgICAgICAqYnVmLAorCQkJCSAgICB1bnNpZ25lZCBsb25nICBjb3VudCkKK3sKKwluc3AzMl9tdWx0aV93cml0ZTQoYmFzZSwgRklGT19EQVRBX0xPVywgYnVmLCBjb3VudCk7Cit9CisKKyNlbmRpZiAvKiBfTlNQMzJfSU9fSCAqLworLyogZW5kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvb2t0YWdvbl9lc3AuYyBiL2RyaXZlcnMvc2NzaS9va3RhZ29uX2VzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3M2Q3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvb2t0YWdvbl9lc3AuYwpAQCAtMCwwICsxLDYwOSBAQAorLyoKKyAqIE9rdGFnb25fZXNwLmMgLS0gRHJpdmVyIGZvciBic2MgT2t0YWdvbgorICoKKyAqIFdyaXR0ZW4gYnkgQ2Fyc3RlbiBQbHVudGtlIDE5OTgKKyAqCisgKiBCYXNlZCBvbiBjeWJlcl9lc3AuYworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0FNSUdBKSB8fCBkZWZpbmVkKENPTkZJR19BUFVTKQorI2RlZmluZSBVU0VfQk9UVE9NX0hBTEYKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJOQ1I1M0M5eC5oIgorCisjaW5jbHVkZSA8bGludXgvem9ycm8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaW50cy5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CisKKyNpZmRlZiBVU0VfQk9UVE9NX0hBTEYKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNlbmRpZgorCisvKiBUaGUgY29udHJvbGxlciByZWdpc3RlcnMgY2FuIGJlIGZvdW5kIGluIHRoZSBaMiBjb25maWcgYXJlYSBhdCB0aGVzZQorICogb2Zmc2V0czoKKyAqLworI2RlZmluZSBPS1RBR09OX0VTUF9BRERSIDB4MDMwMDAKKyNkZWZpbmUgT0tUQUdPTl9ETUFfQUREUiAweDAxMDAwCisKKworc3RhdGljIGludCAgZG1hX2J5dGVzX3NlbnQoc3RydWN0IE5DUl9FU1AgKmVzcCwgaW50IGZpZm9fY291bnQpOworc3RhdGljIGludCAgZG1hX2Nhbl90cmFuc2ZlcihzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKTsKK3N0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiB2YWRkcmVzcywgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiB2YWRkcmVzcywgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKTsKKworc3RhdGljIHZvaWQgZG1hX2lycV9leGl0KHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX2ludmFsaWRhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCk7CisKK3N0YXRpYyB2b2lkIGRtYV9tbXVfZ2V0X3Njc2lfb25lKHN0cnVjdCBOQ1JfRVNQICosU2NzaV9DbW5kICopOworc3RhdGljIHZvaWQgZG1hX21tdV9nZXRfc2NzaV9zZ2woc3RydWN0IE5DUl9FU1AgKixTY3NpX0NtbmQgKik7CitzdGF0aWMgdm9pZCBkbWFfbW11X3JlbGVhc2Vfc2NzaV9vbmUoc3RydWN0IE5DUl9FU1AgKixTY3NpX0NtbmQgKik7CitzdGF0aWMgdm9pZCBkbWFfbW11X3JlbGVhc2Vfc2NzaV9zZ2woc3RydWN0IE5DUl9FU1AgKixTY3NpX0NtbmQgKik7CitzdGF0aWMgdm9pZCBkbWFfYWR2YW5jZV9zZyhTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50ICBva3RhZ29uX25vdGlmeV9yZWJvb3Qoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKngpOworCisjaWZkZWYgVVNFX0JPVFRPTV9IQUxGCitzdGF0aWMgdm9pZCBkbWFfY29tbWl0KHZvaWQgKm9wYXF1ZSk7CisKK2xvbmcgb2t0YWdfdG9faW8obG9uZyAqcGFkZHIsIGxvbmcgKmFkZHIsIGxvbmcgbGVuKTsKK2xvbmcgb2t0YWdfZnJvbV9pbyhsb25nICphZGRyLCBsb25nICpwYWRkciwgbG9uZyBsZW4pOworCitzdGF0aWMgREVDTEFSRV9XT1JLKHRxX2Zha2VfZG1hLCBkbWFfY29tbWl0LCBOVUxMKTsKKworI2RlZmluZSBETUFfTUFYVFJBTlNGRVIgMHg4MDAwCisKKyNlbHNlCisKKy8qCisgKiBObyBib3R0b20gaGFsZi4gVXNlIHRyYW5zZmVyIGRpcmVjdGx5IGZyb20gSVJRLiBGaW5kIGEgbmFycm93IHBhdGgKKyAqIGJldHdlZW4gdG9vIG11Y2ggSVJRIG92ZXJoZWFkIGFuZCBjbG9nZ2luZyB0aGUgSVJRIGZvciB0b28gbG9uZy4KKyAqLworCisjZGVmaW5lIERNQV9NQVhUUkFOU0ZFUiAweDEwMDAKKworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgb2t0YWdvbl9ub3RpZmllciA9IHsgCisJb2t0YWdvbl9ub3RpZnlfcmVib290LAorCU5VTEwsCisJMAorfTsKKworc3RhdGljIGxvbmcgKnBhZGRyZXNzOworc3RhdGljIGxvbmcgKmFkZHJlc3M7CitzdGF0aWMgbG9uZyBsZW47CitzdGF0aWMgbG9uZyBkbWFfb247CitzdGF0aWMgaW50IGRpcmVjdGlvbjsKK3N0YXRpYyBzdHJ1Y3QgTkNSX0VTUCAqY3VycmVudF9lc3A7CisKKworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlclsxNl07CisJCQkJLyogVGhpcyBpcyB3aGVyZSBhbGwgY29tbWFuZHMgYXJlIHB1dAorCQkJCSAqIGJlZm9yZSB0aGV5IGFyZSB0cmFzZmVyZWQgdG8gdGhlIEVTUCBjaGlwCisJCQkJICogdmlhIFBJTy4KKwkJCQkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERldGVjdGlvbiAqLworaW50IG9rdGFnb25fZXNwX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQpCit7CisJc3RydWN0IE5DUl9FU1AgKmVzcDsKKwlzdHJ1Y3Qgem9ycm9fZGV2ICp6ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJc3RydWN0IEVTUF9yZWdzICplcmVnczsKKworCXdoaWxlICgoeiA9IHpvcnJvX2ZpbmRfZGV2aWNlKFpPUlJPX1BST0RfQlNDX09LVEFHT05fMjAwOCwgeikpKSB7CisJICAgIHVuc2lnbmVkIGxvbmcgYm9hcmQgPSB6LT5yZXNvdXJjZS5zdGFydDsKKwkgICAgaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihib2FyZCtPS1RBR09OX0VTUF9BRERSLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgRVNQX3JlZ3MpLCAiTkNSNTNDOXgiKSkgeworCQkvKgorCQkgKiBJdCBpcyBhIFNDU0kgY29udHJvbGxlci4KKwkJICogSGFyZHdpcmUgSG9zdCBhZGFwdGVyIHRvIFNDU0kgSUQgNworCQkgKi8KKwkJCisJCWFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylaVFdPX1ZBRERSKGJvYXJkKTsKKwkJZXJlZ3MgPSAoc3RydWN0IEVTUF9yZWdzICopKGFkZHJlc3MgKyBPS1RBR09OX0VTUF9BRERSKTsKKworCQkvKiBUaGlzIGxpbmUgd2FzIDUgbGluZXMgbG93ZXIgKi8KKwkJZXNwID0gZXNwX2FsbG9jYXRlKHRwbnQsICh2b2lkICopYm9hcmQrT0tUQUdPTl9FU1BfQUREUik7CisKKwkJLyogd2UgaGF2ZSB0byBzaGlmdCB0aGUgcmVnaXN0ZXJzIG9ubHkgb25lIGJpdCBmb3Igb2t0YWdvbiAqLworCQllc3AtPnNoaWZ0ID0gMTsKKworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmcxLCAoRVNQX0NPTkZJRzFfUEVOQUJMRSB8IDcpKTsKKwkJdWRlbGF5KDUpOworCQlpZiAoZXNwX3JlYWQoZXJlZ3MtPmVzcF9jZmcxKSAhPSAoRVNQX0NPTkZJRzFfUEVOQUJMRSB8IDcpKQorCQkJcmV0dXJuIDA7IC8qIEJhaWwgb3V0IGlmIGFkZHJlc3MgZGlkIG5vdCBob2xkIGRhdGEgKi8KKworCQkvKiBEbyBjb21tYW5kIHRyYW5zZmVyIHdpdGggcHJvZ3JhbW1lZCBJL08gKi8KKwkJZXNwLT5kb19waW9fY21kcyA9IDE7CisKKwkJLyogUmVxdWlyZWQgZnVuY3Rpb25zICovCisJCWVzcC0+ZG1hX2J5dGVzX3NlbnQgPSAmZG1hX2J5dGVzX3NlbnQ7CisJCWVzcC0+ZG1hX2Nhbl90cmFuc2ZlciA9ICZkbWFfY2FuX3RyYW5zZmVyOworCQllc3AtPmRtYV9kdW1wX3N0YXRlID0gJmRtYV9kdW1wX3N0YXRlOworCQllc3AtPmRtYV9pbml0X3JlYWQgPSAmZG1hX2luaXRfcmVhZDsKKwkJZXNwLT5kbWFfaW5pdF93cml0ZSA9ICZkbWFfaW5pdF93cml0ZTsKKwkJZXNwLT5kbWFfaW50c19vZmYgPSAmZG1hX2ludHNfb2ZmOworCQllc3AtPmRtYV9pbnRzX29uID0gJmRtYV9pbnRzX29uOworCQllc3AtPmRtYV9pcnFfcCA9ICZkbWFfaXJxX3A7CisJCWVzcC0+ZG1hX3BvcnRzX3AgPSAmZG1hX3BvcnRzX3A7CisJCWVzcC0+ZG1hX3NldHVwID0gJmRtYV9zZXR1cDsKKworCQkvKiBPcHRpb25hbCBmdW5jdGlvbnMgKi8KKwkJZXNwLT5kbWFfYmFycmllciA9IDA7CisJCWVzcC0+ZG1hX2RyYWluID0gMDsKKwkJZXNwLT5kbWFfaW52YWxpZGF0ZSA9ICZkbWFfaW52YWxpZGF0ZTsKKwkJZXNwLT5kbWFfaXJxX2VudHJ5ID0gMDsKKwkJZXNwLT5kbWFfaXJxX2V4aXQgPSAmZG1hX2lycV9leGl0OworCQllc3AtPmRtYV9sZWRfb24gPSAmZG1hX2xlZF9vbjsKKwkJZXNwLT5kbWFfbGVkX29mZiA9ICZkbWFfbGVkX29mZjsKKwkJZXNwLT5kbWFfcG9sbCA9IDA7CisJCWVzcC0+ZG1hX3Jlc2V0ID0gMDsKKworCQllc3AtPmRtYV9tbXVfZ2V0X3Njc2lfb25lID0gJmRtYV9tbXVfZ2V0X3Njc2lfb25lOworCQllc3AtPmRtYV9tbXVfZ2V0X3Njc2lfc2dsID0gJmRtYV9tbXVfZ2V0X3Njc2lfc2dsOworCQllc3AtPmRtYV9tbXVfcmVsZWFzZV9zY3NpX29uZSA9ICZkbWFfbW11X3JlbGVhc2Vfc2NzaV9vbmU7CisJCWVzcC0+ZG1hX21tdV9yZWxlYXNlX3Njc2lfc2dsID0gJmRtYV9tbXVfcmVsZWFzZV9zY3NpX3NnbDsKKwkJZXNwLT5kbWFfYWR2YW5jZV9zZyA9ICZkbWFfYWR2YW5jZV9zZzsKKworCQkvKiBTQ1NJIGNoaXAgc3BlZWQgKi8KKwkJLyogTG9va2luZyBhdCB0aGUgcXVhcnR6IG9mIHRoZSBTQ1NJIGJvYXJkLi4uICovCisJCWVzcC0+Y2ZyZXEgPSAyNTAwMDAwMDsKKworCQkvKiBUaGUgRE1BIHJlZ2lzdGVycyBvbiB0aGUgQ3liZXJTdG9ybSBhcmUgbWFwcGVkCisJCSAqIHJlbGF0aXZlIHRvIHRoZSBkZXZpY2UgKGkuZS4gaW4gdGhlIHNhbWUgWm9ycm8KKwkJICogSS9PIGJsb2NrKS4KKwkJICovCisJCWVzcC0+ZHJlZ3MgPSAodm9pZCAqKShhZGRyZXNzICsgT0tUQUdPTl9ETUFfQUREUik7CisKKwkJcGFkZHJlc3MgPSAobG9uZyAqKSBlc3AtPmRyZWdzOworCisJCS8qIEVTUCByZWdpc3RlciBiYXNlICovCisJCWVzcC0+ZXJlZ3MgPSBlcmVnczsKKwkJCisJCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIgKi8KKwkJZXNwLT5lc3BfY29tbWFuZCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKikgY21kX2J1ZmZlcjsKKworCQkvKiBZZXMsIHRoZSB2aXJ0dWFsIGFkZHJlc3MuIFNlZSBiZWxvdy4gKi8KKwkJZXNwLT5lc3BfY29tbWFuZF9kdm1hID0gKF9fdTMyKSBjbWRfYnVmZmVyOworCisJCWVzcC0+aXJxID0gSVJRX0FNSUdBX1BPUlRTOworCQlyZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGVzcF9pbnRyLCBTQV9TSElSUSwKKwkJCSAgICAiQlNDIE9rdGFnb24gU0NTSSIsIGVzcC0+ZWhvc3QpOworCisJCS8qIEZpZ3VyZSBvdXQgb3VyIHNjc2kgSUQgb24gdGhlIGJ1cyAqLworCQllc3AtPnNjc2lfaWQgPSA3OworCQkKKwkJLyogV2UgZG9uJ3QgaGF2ZSBhIGRpZmZlcmVudGlhbCBTQ1NJLWJ1cy4gKi8KKwkJZXNwLT5kaWZmID0gMDsKKworCQllc3BfaW5pdGlhbGl6ZShlc3ApOworCisJCXByaW50aygiRVNQX09rdGFnb24gRHJpdmVyIDEuMSIKKyNpZmRlZiBVU0VfQk9UVE9NX0hBTEYKKwkJICAgICAgICIgW0JPVFRPTV9IQUxGXSIKKyNlbHNlCisJCSAgICAgICAiIFtJUlFdIgorI2VuZGlmCisJCSAgICAgICAiIHJlZ2lzdGVyZWQuXG4iKTsKKwkJcHJpbnRrKCJFU1A6IFRvdGFsIG9mICVkIEVTUCBob3N0cyBmb3VuZCwgJWQgYWN0dWFsbHkgaW4gdXNlLlxuIiwgbmVzcHMsZXNwc19pbl91c2UpOworCQllc3BzX3J1bm5pbmcgPSBlc3BzX2luX3VzZTsKKwkJY3VycmVudF9lc3AgPSBlc3A7CisJCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmb2t0YWdvbl9ub3RpZmllcik7CisJCXJldHVybiBlc3BzX2luX3VzZTsKKwkgICAgfQorCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICogT24gY2VydGFpbiBjb25maWd1cmF0aW9ucyB0aGUgU0NTSSBlcXVpcG1lbnQgZ2V0cyBjb25mdXNlZCBvbiByZWJvb3QsCisgKiBzbyB3ZSBoYXZlIHRvIHJlc2V0IGl0IHRoZW4uCisgKi8KKworc3RhdGljIGludAorb2t0YWdvbl9ub3RpZnlfcmVib290KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLCB2b2lkICp4KQoreworICBzdHJ1Y3QgTkNSX0VTUCAqZXNwOworICAKKyAgaWYoKGNvZGUgPT0gU1lTX0RPV04gfHwgY29kZSA9PSBTWVNfSEFMVCkgJiYgKGVzcCA9IGN1cnJlbnRfZXNwKSkKKyAgIHsKKyAgICBlc3BfYm9vdHVwX3Jlc2V0KGVzcCxlc3AtPmVyZWdzKTsKKyAgICB1ZGVsYXkoNTAwKTsgLyogU2V0dGxlIHRpbWUuIE1heWJlIHVubmVjZXNzYXJ5LiAqLworICAgfQorICByZXR1cm4gTk9USUZZX0RPTkU7Cit9CisgICAgCisKKwkKKyNpZmRlZiBVU0VfQk9UVE9NX0hBTEYKKworCisvKgorICogVGhlIGJzYyBPa3RhZ29uIGNvbnRyb2xsZXIgaGFzIG5vIHJlYWwgRE1BLCBzbyB3ZSBoYXZlIHRvIGRvIHRoZSAnRE1BCisgKiB0cmFuc2ZlcicgaW4gdGhlIGludGVycnVwdCAoWWlrZXMhKSBvciB1c2UgYSBib3R0b20gaGFsZiB0byBub3QgdG8gY2x1dHRlcgorICogSVJRJ3MgZm9yIGxvbmdlci10aGFuLWdvb2QuCisgKgorICogRklYTUUKKyAqIEJJRyBQUk9CTEVNOiAnbGVuJyBpcyB1c3VhbGx5IHRoZSBidWZmZXIgbGVuZ3RoLCBub3QgdGhlIGV4cGVjdGVkIGxlbmd0aAorICogb2YgdGhlIGRhdGEuIFNvIERNQSBtYXkgZmluaXNoIHByZW1hdHVyZWx5LCBmdXJ0aGVyIHJlYWRzIGxlYWQgdG8KKyAqICdtYWNoaW5lIGNoZWNrJyBvbiBBUFVTIHN5c3RlbXMgKGRvbid0IGtub3cgYWJvdXQgbTY4ayBzeXN0ZW1zLCBBbWlnYU9TCisgKiBkZWxpYmVyYXRlbHkgaWdub3JlcyB0aGUgYnVzIGZhdWx0cykgYW5kIGEgbm9ybWFsIGNvcHktbG9vcCBjYW4ndAorICogYmUgZXhpdGVkIHByZW1hdHVyZWx5IGp1c3QgYXQgdGhlIHJpZ2h0IG1vbWVudCBieSB0aGUgZG1hX2ludmFsaWRhdGUgSVJRLgorICogU28gZG8gaXQgdGhlIGhhcmQgd2F5LCB3cml0ZSBhbiBvd24gY29waWVyIGluIGFzc2VtYmxlciBhbmQKKyAqIGNhdGNoIHRoZSBleGNlcHRpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBDYXJzdGVuCisgKi8KKyAKKyAKK3N0YXRpYyB2b2lkIGRtYV9jb21taXQodm9pZCAqb3BhcXVlKQoreworICAgIGxvbmcgd2FpdCxsZW4yLHBvczsKKyAgICBzdHJ1Y3QgTkNSX0VTUCAqZXNwOworCisgICAgRVNQREFUQSgoIlRyYW5zZmVyOiAlbGQgYnl0ZXMsIEFkZHJlc3MgMHglMDhsWCwgRGlyZWN0aW9uOiAlZFxuIiwKKyAgICAgICAgIGxlbiwobG9uZykgYWRkcmVzcyxkaXJlY3Rpb24pKTsKKyAgICBkbWFfaW50c19vZmYoY3VycmVudF9lc3ApOworCisgICAgcG9zID0gMDsKKyAgICB3YWl0ID0gMTsKKyAgICBpZihkaXJlY3Rpb24pIC8qIHdyaXRlPyAobWVtb3J5IHRvIGRldmljZSkgKi8KKyAgICAgeworICAgICAgd2hpbGUobGVuID4gMCkKKyAgICAgICB7CisgICAgICAgIGxlbjIgPSBva3RhZ190b19pbyhwYWRkcmVzcywgYWRkcmVzcytwb3MsIGxlbik7CisJaWYoIWxlbjIpCisJIHsKKwkgIGlmKHdhaXQgPiAxMDAwKQorCSAgIHsKKwkgICAgcHJpbnRrKCJFeHBlZGl0ZWQgRE1BIGV4aXQgKHdyaXRpbmcpICVsZFxuIixsZW4pOworCSAgICBicmVhazsKKwkgICB9CisJICBtZGVsYXkod2FpdCk7CisJICB3YWl0ICo9IDI7CisJIH0KKwlwb3MgKz0gbGVuMjsKKwlsZW4gLT0gbGVuMipzaXplb2YobG9uZyk7CisgICAgICAgfQorICAgICB9IGVsc2UgeworICAgICAgd2hpbGUobGVuID4gMCkKKyAgICAgICB7CisgICAgICAgIGxlbjIgPSBva3RhZ19mcm9tX2lvKGFkZHJlc3MrcG9zLCBwYWRkcmVzcywgbGVuKTsKKwlpZighbGVuMikKKwkgeworCSAgaWYod2FpdCA+IDEwMDApCisJICAgeworCSAgICBwcmludGsoIkV4cGVkaXRlZCBETUEgZXhpdCAocmVhZGluZykgJWxkXG4iLGxlbik7CisJICAgIGJyZWFrOworCSAgIH0KKwkgIG1kZWxheSh3YWl0KTsKKwkgIHdhaXQgKj0gMjsKKwkgfQorCXBvcyArPSBsZW4yOworCWxlbiAtPSBsZW4yKnNpemVvZihsb25nKTsKKyAgICAgICB9CisgICAgIH0KKworICAgIC8qIHRvIG1ha2UgZXNwLT5zaGlmdCB3b3JrICovCisgICAgZXNwPWN1cnJlbnRfZXNwOworCisjaWYgMAorICAgIGxlbjIgPSAoZXNwX3JlYWQoY3VycmVudF9lc3AtPmVyZWdzLT5lc3BfdGNsb3cpICYgMHhmZikgfAorICAgICAgICAgICAoKGVzcF9yZWFkKGN1cnJlbnRfZXNwLT5lcmVncy0+ZXNwX3RjbWVkKSAmIDB4ZmYpIDw8IDgpOworCisgICAgLyoKKyAgICAgKiBVaCB1aC4gSWYgeW91IHNlZSB0aGlzLCBsZW4gYW5kIHRyYW5zZmVyIGNvdW50IHJlZ2lzdGVycyB3ZXJlIG91dCBvZgorICAgICAqIHN5bmMuIFRoYXQgbWVhbnMgcmVhbGx5IHNlcmlvdXMgdHJvdWJsZS4KKyAgICAgKi8KKworICAgIGlmKGxlbjIpCisgICAgICBwcmludGsoIkVlZWVrISEgVHJhbnNmZXIgY291bnQgc3RpbGwgJWxkIVxuIixsZW4yKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBOb3JtYWxseSB3ZSBqdXN0IG5lZWQgdG8gZXhpdCBhbmQgd2FpdCBmb3IgdGhlIGludGVycnVwdCB0byBjb21lLgorICAgICAqIEJ1dCBhdCBsZWFzdCBvbmUgZGV2aWNlIChteSBNaWNyb3RlayBTY2FuTWFrZXIgNjMwKSByZWd1bGFybHkgbWlzLQorICAgICAqIGNhbGN1bGF0ZXMgdGhlIGJ5dGVzIGl0IHNob3VsZCBzZW5kIHdoaWNoIGlzIHJlYWxseSB1Z2x5IGJlY2F1c2UKKyAgICAgKiBpdCBsb2NrcyB1cCB0aGUgU0NTSSBidXMgaWYgbm90IGFjY291bnRlZCBmb3IuCisgICAgICovCisKKyAgICBpZighKGVzcF9yZWFkKGN1cnJlbnRfZXNwLT5lcmVncy0+ZXNwX3N0YXR1cykgJiBFU1BfU1RBVF9JTlRSKSkKKyAgICAgeworICAgICAgbG9uZyBsZW4gPSAxMDA7CisgICAgICBsb25nIHRyYXNoWzEwXTsKKworICAgICAgLyoKKyAgICAgICAqIEludGVycnVwdCBiaXQgd2FzIG5vdCBzZXQuIEVpdGhlciB0aGUgZGV2aWNlIGlzIGp1c3QgcGxhaW4gbGF6eQorICAgICAgICogc28gd2UgZ2l2ZSBpdCBhIDEwIG1zIGNoYW5jZSBvci4uLgorICAgICAgICovCisgICAgICB3aGlsZShsZW4tLSAmJiAoIShlc3BfcmVhZChjdXJyZW50X2VzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpICYgRVNQX1NUQVRfSU5UUikpKQorICAgICAgICB1ZGVsYXkoMTAwKTsKKworCisgICAgICBpZighKGVzcF9yZWFkKGN1cnJlbnRfZXNwLT5lcmVncy0+ZXNwX3N0YXR1cykgJiBFU1BfU1RBVF9JTlRSKSkKKyAgICAgICB7CisgICAgICAgIC8qCisJICogU28gd2UgdGhpbmsgdGhhdCB0aGUgdHJhbnNmZXIgY291bnQgaXMgb3V0IG9mIHN5bmMuIFNpbmNlIHdlCisJICogaGF2ZSBhbGwgd2Ugd2FudCB3ZSBhcmUgaGFwcHkgYW5kIGNhbiBkaXRjaCB0aGUgdHJhc2guCisJICovCisJIAorICAgICAgICBsZW4gPSBETUFfTUFYVFJBTlNGRVI7CisKKyAgICAgICAgd2hpbGUobGVuLS0gJiYgKCEoZXNwX3JlYWQoY3VycmVudF9lc3AtPmVyZWdzLT5lc3Bfc3RhdHVzKSAmIEVTUF9TVEFUX0lOVFIpKSkKKyAgICAgICAgICBva3RhZ19mcm9tX2lvKHRyYXNoLHBhZGRyZXNzLDIpOworCisgICAgICAgIGlmKCEoZXNwX3JlYWQoY3VycmVudF9lc3AtPmVyZWdzLT5lc3Bfc3RhdHVzKSAmIEVTUF9TVEFUX0lOVFIpKQorICAgICAgICAgeworICAgICAgICAgIC8qCisgICAgICAgICAgICogVGhpbmdzIHJlYWxseSBoYXZlIGdvbmUgd3JvbmcuIElmIHdlIGxlYXZlIHRoZSBzeXN0ZW0gaW4gdGhhdAorICAgICAgICAgICAqIHN0YXRlLCB0aGUgU0NTSSBidXMgaXMgbG9ja2VkIGZvcmV2ZXIuIEkgaG9wZSB0aGF0IHRoaXMgd2lsbAorICAgICAgICAgICAqIHR1cm4gdGhlIHN5c3RlbSBpbiBhIG1vcmUgb3IgbGVzcyBydW5uaW5nIHN0YXRlLgorICAgICAgICAgICAqLworICAgICAgICAgIHByaW50aygiRGV2aWNlIGlzIGJvbGl4ZWQsIHRyeWluZyBidXMgcmVzZXQuLi5cbiIpOworCSAgZXNwX2Jvb3R1cF9yZXNldChjdXJyZW50X2VzcCxjdXJyZW50X2VzcC0+ZXJlZ3MpOworICAgICAgICAgfQorICAgICAgIH0KKyAgICAgfQorCisgICAgRVNQREFUQSgoIlRyYW5zZmVyX2ZpbmFsZTogZG9fZGF0YV9maW5hbGUgc2hvdWxkIGNvbWVcbiIpKTsKKworICAgIGxlbiA9IDA7CisgICAgZG1hX29uID0gMDsKKyAgICBkbWFfaW50c19vbihjdXJyZW50X2VzcCk7Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBETUEgRnVuY3Rpb25zICovCitzdGF0aWMgaW50IGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KQoreworCS8qIFNpbmNlIHRoZSBDeWJlclN0b3JtIERNQSBpcyBmdWxseSBkZWRpY2F0ZWQgdG8gdGhlIEVTUCBjaGlwLAorCSAqIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudCAodG8gdGhlIEVTUCBjaGlwKSBlcXVhbHMgdGhlIG51bWJlcgorCSAqIG9mIGJ5dGVzIGluIHRoZSBGSUZPIC0gdGhlcmUgaXMgbm8gYnVmZmVyaW5nIGluIHRoZSBETUEgY29udHJvbGxlci4KKwkgKiBYWFhYIERvIEkgcmVhZCB0aGlzIHJpZ2h0PyBJdCBpcyBmcm9tIGhvc3QgdG8gRVNQLCByaWdodD8KKwkgKi8KKwlyZXR1cm4gZmlmb19jb3VudDsKK30KKworc3RhdGljIGludCBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisJdW5zaWduZWQgbG9uZyBzeiA9IHNwLT5TQ3AudGhpc19yZXNpZHVhbDsKKwlpZihzeiA+IERNQV9NQVhUUkFOU0ZFUikKKwkJc3ogPSBETUFfTUFYVFJBTlNGRVI7CisJcmV0dXJuIHN6OworfQorCitzdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworfQorCisvKgorICogV2hhdCB0aGUgZiRAJiBpcyB0aGlzPworICoKKyAqIFNvbWUgU0NTSSBkZXZpY2VzIChsaWtlIG15IE1pY3JvdGVrIFNjYW5NYWtlciA2MzAgc2Nhbm5lcikgd2FudCB0byB0cmFuc2ZlcgorICogbW9yZSBkYXRhIHRoYW4gcmVxdWVzdGVkLiBIb3cgbXVjaD8gRHVubm8uIFNvIGRpdGNoIHRoZSBib2d1cyBkYXRhIGludG8KKyAqIHRoZSBzaW5rLCBob3BpbmcgdGhlIGRldmljZSB3aWxsIGFkdmFuY2UgdG8gdGhlIG5leHQgcGhhc2Ugc29vbmVyIG9yIGxhdGVyLgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIC0tIENhcnN0ZW4KKyAqLworCitzdGF0aWMgbG9uZyBva3RhZ19ldmFfYnVmZmVyWzE2XTsgLyogVGhlIGRhdGEgc2luayAqLworCitzdGF0aWMgdm9pZCBva3RhZ19jaGVja19kbWEodm9pZCkKK3sKKyAgc3RydWN0IE5DUl9FU1AgKmVzcDsKKworICBlc3A9Y3VycmVudF9lc3A7CisgIGlmKCFsZW4pCisgICB7CisgICAgYWRkcmVzcyA9IG9rdGFnX2V2YV9idWZmZXI7CisgICAgbGVuID0gMjsKKyAgICAvKiBlc3BfZG9fZGF0YSBzZXRzIHRoZW0gdG8gemVybyBsaWtlIGxlbiAqLworICAgIGVzcF93cml0ZShjdXJyZW50X2VzcC0+ZXJlZ3MtPmVzcF90Y2xvdywyKTsKKyAgICBlc3Bfd3JpdGUoY3VycmVudF9lc3AtPmVyZWdzLT5lc3BfdGNtZWQsMCk7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgdmFkZHJlc3MsIGludCBsZW5ndGgpCit7CisJLyogWm9ycm8gaXMgbm9uY2FjaGVkLCBldmVyeXRoaW5nIGVsc2UgZG9uZSB1c2luZyBwcm9jZXNzb3IuICovCisJLyogY2FjaGVfY2xlYXIoYWRkciwgbGVuZ3RoKTsgKi8KKwkKKwlpZihkbWFfb24pCisJICBwYW5pYygiZG1hX2luaXRfcmVhZCB3aGlsZSBkbWEgcHJvY2VzcyBpcyBpbml0aWFsaXplZC9ydW5uaW5nIVxuIik7CisJZGlyZWN0aW9uID0gMDsKKwlhZGRyZXNzID0gKGxvbmcgKikgdmFkZHJlc3M7CisJY3VycmVudF9lc3AgPSBlc3A7CisJbGVuID0gbGVuZ3RoOworCW9rdGFnX2NoZWNrX2RtYSgpOworICAgICAgICBkbWFfb24gPSAxOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiB2YWRkcmVzcywgaW50IGxlbmd0aCkKK3sKKwkvKiBjYWNoZV9wdXNoKGFkZHIsIGxlbmd0aCk7ICovCisKKwlpZihkbWFfb24pCisJICBwYW5pYygiZG1hX2luaXRfd3JpdGUgd2hpbGUgZG1hIHByb2Nlc3MgaXMgaW5pdGlhbGl6ZWQvcnVubmluZyFcbiIpOworCWRpcmVjdGlvbiA9IDE7CisJYWRkcmVzcyA9IChsb25nICopIHZhZGRyZXNzOworCWN1cnJlbnRfZXNwID0gZXNwOworCWxlbiA9IGxlbmd0aDsKKwlva3RhZ19jaGVja19kbWEoKTsKKwlkbWFfb24gPSAxOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlkaXNhYmxlX2lycShlc3AtPmlycSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJZW5hYmxlX2lycShlc3AtPmlycSk7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJLyogSXQncyBpbXBvcnRhbnQgdG8gY2hlY2sgdGhlIERNQSBJUlEgYml0IGluIHRoZSBjb3JyZWN0IHdheSEgKi8KKwlyZXR1cm4gKGVzcF9yZWFkKGVzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpICYgRVNQX1NUQVRfSU5UUik7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb24oc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKK30KKworc3RhdGljIGludCBkbWFfcG9ydHNfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCXJldHVybiAoKGN1c3RvbS5pbnRlbmFyKSAmIElGX1BPUlRTKTsKK30KKworc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQoreworCS8qIE9uIHRoZSBTcGFyYywgRE1BX1NUX1dSSVRFIG1lYW5zICJtb3ZlIGRhdGEgZnJvbSBkZXZpY2UgdG8gbWVtb3J5IgorCSAqIHNvIHdoZW4gKHdyaXRlKSBpcyB0cnVlLCBpdCBhY3R1YWxseSBtZWFucyBSRUFEIQorCSAqLworCWlmKHdyaXRlKXsKKwkJZG1hX2luaXRfcmVhZChlc3AsIGFkZHIsIGNvdW50KTsKKwl9IGVsc2UgeworCQlkbWFfaW5pdF93cml0ZShlc3AsIGFkZHIsIGNvdW50KTsKKwl9Cit9CisKKy8qCisgKiBJUlEgZW50cnkgd2hlbiBETUEgdHJhbnNmZXIgaXMgcmVhZHkgdG8gYmUgc3RhcnRlZAorICovCisKK3N0YXRpYyB2b2lkIGRtYV9pcnFfZXhpdChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworI2lmZGVmIFVTRV9CT1RUT01fSEFMRgorCWlmKGRtYV9vbikKKwkgeworCSAgc2NoZWR1bGVfd29yaygmdHFfZmFrZV9kbWEpOworCSB9CisjZWxzZQorCXdoaWxlKGxlbiAmJiAhZG1hX2lycV9wKGVzcCkpCisJIHsKKwkgIGlmKGRpcmVjdGlvbikKKwkgICAgKnBhZGRyZXNzID0gKmFkZHJlc3MrKzsKKwkgICBlbHNlCisJICAgICphZGRyZXNzKysgPSAqcGFkZHJlc3M7CisJICBsZW4gLT0gKHNpemVvZihsb25nKSk7CisJIH0KKwlsZW4gPSAwOworICAgICAgICBkbWFfb24gPSAwOworI2VuZGlmCit9CisKKy8qCisgKiBJUlEgZW50cnkgd2hlbiBETUEgaGFzIGp1c3QgZmluaXNoZWQKKyAqLworCitzdGF0aWMgdm9pZCBkbWFfaW52YWxpZGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworfQorCisvKgorICogU2luY2UgdGhlIHByb2Nlc3NvciBkb2VzIHRoZSBkYXRhIHRyYW5zZmVyIHdlIGhhdmUgdG8gdXNlIHRoZSBjdXN0b20KKyAqIG1tdSBpbnRlcmZhY2UgdG8gcGFzcyB0aGUgdmlydHVhbCBhZGRyZXNzLCBub3QgdGhlIHBoeXNpY2FsLgorICovCisKK3ZvaWQgZG1hX21tdV9nZXRfc2NzaV9vbmUoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKK3sKKyAgICAgICAgc3AtPlNDcC5wdHIgPQorICAgICAgICAgICAgICAgIHNwLT5yZXF1ZXN0X2J1ZmZlcjsKK30KKwordm9pZCBkbWFfbW11X2dldF9zY3NpX3NnbChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKQoreworICAgICAgICBzcC0+U0NwLnB0ciA9IHBhZ2VfYWRkcmVzcyhzcC0+U0NwLmJ1ZmZlci0+cGFnZSkrCisJCSAgICAgIHNwLT5TQ3AuYnVmZmVyLT5vZmZzZXQ7Cit9CisKK3ZvaWQgZG1hX21tdV9yZWxlYXNlX3Njc2lfb25lKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7Cit9CisKK3ZvaWQgZG1hX21tdV9yZWxlYXNlX3Njc2lfc2dsKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7Cit9CisKK3ZvaWQgZG1hX2FkdmFuY2Vfc2coU2NzaV9DbW5kICpzcCkKK3sKKwlzcC0+U0NwLnB0ciA9IHBhZ2VfYWRkcmVzcyhzcC0+U0NwLmJ1ZmZlci0+cGFnZSkrCisJCSAgICAgIHNwLT5TQ3AuYnVmZmVyLT5vZmZzZXQ7Cit9CisKKworI2RlZmluZSBIT1NUU19DCisKK2ludCBva3RhZ29uX2VzcF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworI2lmZGVmIE1PRFVMRQorCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSgoc3RydWN0IE5DUl9FU1AgKilpbnN0YW5jZS0+aG9zdGRhdGEpLT5lZGV2OworCWVzcF9yZWxlYXNlKCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGFkZHJlc3MsIHNpemVvZihzdHJ1Y3QgRVNQX3JlZ3MpKTsKKwlmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGVzcF9pbnRyKTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmb2t0YWdvbl9ub3RpZmllcik7CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJlc3Atb2t0YWdvbiIsCisJLnByb2NfaW5mbwkJPSAmZXNwX3Byb2NfaW5mbywKKwkubmFtZQkJCT0gIkJTQyBPa3RhZ29uIFNDU0kiLAorCS5kZXRlY3QJCQk9IG9rdGFnb25fZXNwX2RldGVjdCwKKwkuc2xhdmVfYWxsb2MJCT0gZXNwX3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9kZXN0cm95CQk9IGVzcF9zbGF2ZV9kZXN0cm95LAorCS5yZWxlYXNlCQk9IG9rdGFnb25fZXNwX3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSBlc3BfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBlc3BfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZXNwX3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gNywKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORworfTsKKworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL29rdGFnb25faW8uUyBiL2RyaXZlcnMvc2NzaS9va3RhZ29uX2lvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhjZThkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9va3RhZ29uX2lvLlMKQEAgLTAsMCArMSwxOTUgQEAKKy8qIC0qLSBtb2RlOiBhc20gLSotCisgKiBEdWUgdG8gcHJvYmxlbXMgd2hpbGUgdHJhbnNmZXJyaW5nIGRhdGEgSSd2ZSBwdXQgdGhlc2Ugcm91dGluZXMgYXMgYXNzZW1ibHkKKyAqIGNvZGUuCisgKiBTaW5jZSBJJ20gbm8gUFBDIGFzc2VtYmxlciBndXJ1LCB0aGUgY29kZSBpcyBqdXN0IHRoZSBhc3NlbWJsZXIgdmVyc2lvbiBvZgorCitpbnQgb2t0YWdfdG9faW8obG9uZyAqcGFkZHIsbG9uZyAqYWRkcixsb25nIGxlbikKK3sKKyAgbG9uZyAqYWRkcjIgPSBhZGRyOworICBmb3IobGVuPShsZW4rc2l6ZW9mKGxvbmcpLTEpL3NpemVvZihsb25nKTtsZW4tLTspCisgICAgKnBhZGRyID0gKmFkZHIyKys7CisgIHJldHVybiBhZGRyMiAtIGFkZHI7Cit9CisKK2ludCBva3RhZ19mcm9tX2lvKGxvbmcgKmFkZHIsbG9uZyAqcGFkZHIsbG9uZyBsZW4pCit7CisgIGxvbmcgKmFkZHIyID0gYWRkcjsKKyAgZm9yKGxlbj0obGVuK3NpemVvZihsb25nKS0xKS9zaXplb2YobG9uZyk7bGVuLS07KQorICAgICphZGRyMisrID0gKnBhZGRyOworICByZXR1cm4gYWRkcjIgLSBhZGRyOworfQorCisgKiBhc3NlbWJsZWQgdXNpbmcgZ2NjIC1PMiAtUywgd2l0aCB0d28gZXhjZXB0aW9uIGNhdGNoIHBvaW50cyB3aGVyZSBkYXRhCisgKiBpcyBtb3ZlZCB0by9mcm9tIHRoZSBJTyByZWdpc3Rlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZmRlZiBDT05GSUdfQVBVUworCisJLmZpbGUJIm9rdGFnb25faW8uYyIKKworZ2NjMl9jb21waWxlZC46CisvKgorCS5zZWN0aW9uICIudGV4dCIKKyovCisJLmFsaWduIDIKKwkuZ2xvYmwgb2t0YWdfdG9faW8KKwkudHlwZQkgb2t0YWdfdG9faW8sQGZ1bmN0aW9uCitva3RhZ190b19pbzoKKwlhZGRpIDUsNSwzCisJc3J3aSA1LDUsMgorCWNtcHdpIDEsNSwwCisJbXIgOSwzCisJbXIgMyw0CisJYWRkaSA1LDUsLTEKKwliYyAxMiw2LC5MMworLkw1OgorCWNtcHdpIDEsNSwwCisJbHd6IDAsMCgzKQorCWFkZGkgMywzLDQKKwlhZGRpIDUsNSwtMQorZXhwMToJc3R3IDAsMCg5KQorCWJjIDQsNiwuTDUKKy5MMzoKK3JldDE6CXN1YmYgMyw0LDMKKwlzcmF3aSAzLDMsMgorCWJscgorLkxmZTE6CisJLnNpemUJIG9rdGFnX3RvX2lvLC5MZmUxLW9rdGFnX3RvX2lvCisJLmFsaWduIDIKKwkuZ2xvYmwgb2t0YWdfZnJvbV9pbworCS50eXBlCSBva3RhZ19mcm9tX2lvLEBmdW5jdGlvbgorb2t0YWdfZnJvbV9pbzoKKwlhZGRpIDUsNSwzCisJc3J3aSA1LDUsMgorCWNtcHdpIDEsNSwwCisJbXIgOSwzCisJYWRkaSA1LDUsLTEKKwliYyAxMiw2LC5MOQorLkwxMToKKwljbXB3aSAxLDUsMAorZXhwMjoJbHd6IDAsMCg0KQorCWFkZGkgNSw1LC0xCisJc3R3IDAsMCgzKQorCWFkZGkgMywzLDQKKwliYyA0LDYsLkwxMQorLkw5OgorcmV0MjoJc3ViZiAzLDksMworCXNyYXdpIDMsMywyCisJYmxyCisuTGZlMjoKKwkuc2l6ZQkgb2t0YWdfZnJvbV9pbywuTGZlMi1va3RhZ19mcm9tX2lvCisJLmlkZW50CSJHQ0M6IChHTlUpIGVnY3MtMi45MC4yOSA5ODA1MTUgKGVnY3MtMS4wLjMgcmVsZWFzZSkiCisKKy8qCisgKiBFeGNlcHRpb24gdGFibGUuCisgKiBTZWNvbmQgbG9uZ3dvcmQgc2hvd3Mgd2hlcmUgdG8ganVtcCB3aGVuIGFuIGV4Y2VwdGlvbiBhdCB0aGUgYWRkciB0aGUgZmlyc3QKKyAqIGxvbmd3b3JkIGlzIHBvaW50aW5nIHRvIGlzIGNhdWdodC4KKyAqLworCisuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgorCS5hbGlnbgkyCitva3RhZ29uX2V4Y2VwdDoKKwkubG9uZwlleHAxLHJldDEKKwkubG9uZwlleHAyLHJldDIKKworI2Vsc2UKKworLyoKK1RoZSBjb2RlIHdoaWNoIGZvbGxvd3MgaXMgZm9yIDY4MHgwIGJhc2VkIGFzc2VtYmxlciBhbmQgaXMgbWVhbnQgZm9yCitMaW51eC9tNjhrLiBJdCB3YXMgY3JlYXRlZCBieSBjcm9zcyBjb21waWxpbmcgdGhlIGNvZGUgdXNpbmcgdGhlCitpbnN0cnVjdGlvbnMgZ2l2ZW4gYWJvdmUuIEkgdGhlbiBhZGRlZCB0aGUgZm91ciBsYWJlbHMgdXNlZCBpbiB0aGUKK2V4Y2VwdGlvbiBoYW5kbGVyIHRhYmxlIGF0IHRoZSBib3R0b20gb2YgdGhpcyBmaWxlLgorLSBLZXZpbiA8a2NvemVuc0BpbnRlcmxvZy5jb20+CisqLworCisjaWZkZWYgQ09ORklHX0FNSUdBCisKKwkuZmlsZQkib2t0YWdvbl9pby5jIgorCS52ZXJzaW9uCSIwMS4wMSIKK2djYzJfY29tcGlsZWQuOgorLnRleHQKKwkuYWxpZ24gCTIKKy5nbG9ibCBva3RhZ190b19pbworCS50eXBlCSBva3RhZ190b19pbyxAZnVuY3Rpb24KK29rdGFnX3RvX2lvOgorCWxpbmsudyAlYTYsIzAKKwltb3ZlLmwgJWQyLC0oJXNwKQorCW1vdmUubCA4KCVhNiksJWExCisJbW92ZS5sIDEyKCVhNiksJWQxCisJbW92ZS5sICVkMSwlYTAKKwltb3ZlLmwgMTYoJWE2KSwlZDAKKwlhZGRxLmwgIzMsJWQwCisJbHNyLmwgIzIsJWQwCisJc3VicS5sICMxLCVkMAorCW1vdmVxLmwgIy0xLCVkMgorCWNtcC5sICVkMCwlZDIKKwlqYmVxIC5MMworLkw1OgorZXhwMToKKwltb3ZlLmwgKCVhMCkrLCglYTEpCisJZGJyYSAlZDAsLkw1CisJY2xyLncgJWQwCisJc3VicS5sICMxLCVkMAorCWpiY2MgLkw1CisuTDM6CityZXQxOgorCW1vdmUubCAlYTAsJWQwCisJc3ViLmwgJWQxLCVkMAorCWFzci5sICMyLCVkMAorCW1vdmUubCAtNCglYTYpLCVkMgorCXVubGsgJWE2CisJcnRzCisKKy5MZmUxOgorCS5zaXplCSBva3RhZ190b19pbywuTGZlMS1va3RhZ190b19pbworCS5hbGlnbiAJMgorLmdsb2JsIG9rdGFnX2Zyb21faW8KKwkudHlwZQkgb2t0YWdfZnJvbV9pbyxAZnVuY3Rpb24KK29rdGFnX2Zyb21faW86CisJbGluay53ICVhNiwjMAorCW1vdmUubCAlZDIsLSglc3ApCisJbW92ZS5sIDgoJWE2KSwlZDEKKwltb3ZlLmwgMTIoJWE2KSwlYTEKKwltb3ZlLmwgJWQxLCVhMAorCW1vdmUubCAxNiglYTYpLCVkMAorCWFkZHEubCAjMywlZDAKKwlsc3IubCAjMiwlZDAKKwlzdWJxLmwgIzEsJWQwCisJbW92ZXEubCAjLTEsJWQyCisJY21wLmwgJWQwLCVkMgorCWpiZXEgLkw5CisuTDExOgorZXhwMjoKKwltb3ZlLmwgKCVhMSksKCVhMCkrCisJZGJyYSAlZDAsLkwxMQorCWNsci53ICVkMAorCXN1YnEubCAjMSwlZDAKKwlqYmNjIC5MMTEKKy5MOToKK3JldDI6CisJbW92ZS5sICVhMCwlZDAKKwlzdWIubCAlZDEsJWQwCisJYXNyLmwgIzIsJWQwCisJbW92ZS5sIC00KCVhNiksJWQyCisJdW5sayAlYTYKKwlydHMKKy5MZmUyOgorCS5zaXplCSBva3RhZ19mcm9tX2lvLC5MZmUyLW9rdGFnX2Zyb21faW8KKwkuaWRlbnQJIkdDQzogKEdOVSkgMi43LjIuMSIKKworLyoKKyAqIEV4Y2VwdGlvbiB0YWJsZS4KKyAqIFNlY29uZCBsb25nd29yZCBzaG93cyB3aGVyZSB0byBqdW1wIHdoZW4gYW4gZXhjZXB0aW9uIGF0IHRoZSBhZGRyIHRoZSBmaXJzdAorICogbG9uZ3dvcmQgaXMgcG9pbnRpbmcgdG8gaXMgY2F1Z2h0LgorICovCisKKy5zZWN0aW9uIF9fZXhfdGFibGUsImEiCisJLmFsaWduCTIKK29rdGFnb25fZXhjZXB0OgorCS5sb25nCWV4cDEscmV0MQorCS5sb25nCWV4cDIscmV0MgorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL29zc3QuYyBiL2RyaXZlcnMvc2NzaS9vc3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU4NWM3YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9vc3N0LmMKQEAgLTAsMCArMSw1OTE0IEBACisvKgorICBTQ1NJIFRhcGUgRHJpdmVyIGZvciBMaW51eCB2ZXJzaW9uIDEuMSBhbmQgbmV3ZXIuIFNlZSB0aGUgYWNjb21wYW55aW5nCisgIGZpbGUgRG9jdW1lbnRhdGlvbi9zY3NpL3N0LnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworICBIaXN0b3J5OgorCisgIE9uU3RyZWFtIFNDU0kgVGFwZSBzdXBwb3J0IChvc3N0KSBjbG9uZWQgZnJvbSBzdC5jIGJ5CisgIFdpbGxlbSBSaWVkZSAob3NzdEByaWVkZS5vcmcpIEZlYiAyMDAwCisgIEZpeGVzIC4uLiBLdXJ0IEdhcmxvZmYgPGdhcmxvZmZAc3VzZS5kZT4gTWFyIDIwMDAKKworICBSZXdyaXR0ZW4gZnJvbSBEd2F5bmUgRm9yc3l0aCdzIFNDU0kgdGFwZSBkcml2ZXIgYnkgS2FpIE1ha2lzYXJhLgorICBDb250cmlidXRpb24gYW5kIGlkZWFzIGZyb20gc2V2ZXJhbCBwZW9wbGUgaW5jbHVkaW5nIChpbiBhbHBoYWJldGljYWwKKyAgb3JkZXIpIEtsYXVzIEVocmVuZnJpZWQsIFdvbGZnYW5nIERlbmssIFN0ZXZlIEhpcnNjaCwgQW5kcmVhcyBLb3BwZW5oIm9mZXIsCisgIE1pY2hhZWwgTGVvZG9sdGVyLCBFeWFsIExlYmVkaW5za3ksIEoib3JnIFdldWxlLCBhbmQgRXJpYyBZb3VuZ2RhbGUuCisKKyAgQ29weXJpZ2h0IDE5OTIgLSAyMDAyIEthaSBNYWtpc2FyYSAvIDIwMDAgLSAyMDA0IFdpbGxlbSBSaWVkZQorCSBlbWFpbCBvc3N0QHJpZWRlLm9yZworCisgICRIZWFkZXI6IC9jdnNyb290L29zc3QvRHJpdmVyL29zc3QuYyx2IDEuNzMgMjAwNS8wMS8wMSAyMToxMzozNCB3cmllZGUgRXhwICQKKworICBNaWNyb3Njb3BpYyBhbHRlcmF0aW9ucyAtIFJpayBMaW5nLCAyMDAwLzEyLzIxCisgIExhc3Qgc3QuYyBzeW5jOiBUdWUgT2N0IDE1IDIyOjAxOjA0IDIwMDIgYnkgbWFraXNhcmEKKyAgU29tZSBzbWFsbCBmb3JtYWwgY2hhbmdlcyAtIGFlYiwgOTUwODA5CisqLworCitzdGF0aWMgY29uc3QgY2hhciAqIGN2c2lkID0gIiRJZDogb3NzdC5jLHYgMS43MyAyMDA1LzAxLzAxIDIxOjEzOjM0IHdyaWVkZSBFeHAgJCI7CitzdGF0aWMgY29uc3QgY2hhciAqIG9zc3RfdmVyc2lvbiA9ICIwLjk5LjMiOworCisvKiBUaGUgImZhaWx1cmUgdG8gcmVjb25uZWN0IiBmaXJtd2FyZSBidWcgKi8KKyNkZWZpbmUgT1NTVF9GV19ORUVEX1BPTExfTUlOIDEwNjAxIC8qKDEwN0EpKi8KKyNkZWZpbmUgT1NTVF9GV19ORUVEX1BPTExfTUFYIDEwNzA0IC8qKDEwOEQpKi8KKyNkZWZpbmUgT1NTVF9GV19ORUVEX1BPTEwoeCxkKSAoKHgpID49IE9TU1RfRldfTkVFRF9QT0xMX01JTiAmJiAoeCkgPD0gT1NTVF9GV19ORUVEX1BPTExfTUFYICYmIGQtPmhvc3QtPnRoaXNfaWQgIT0gNykKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L210aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworLyogVGhlIGRyaXZlciBwcmludHMgc29tZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gb24gdGhlIGNvbnNvbGUgaWYgREVCVUcKKyAgIGlzIGRlZmluZWQgYW5kIG5vbi16ZXJvLiAqLworI2RlZmluZSBERUJVRyAwCisKKy8qIFRoZSBtZXNzYWdlIGxldmVsIGZvciB0aGUgZGVidWcgbWVzc2FnZXMgaXMgY3VycmVudGx5IHNldCB0byBLRVJOX05PVElDRQorICAgc28gdGhhdCBwZW9wbGUgY2FuIGVhc2lseSBzZWUgdGhlIG1lc3NhZ2VzLiBMYXRlciB3aGVuIHRoZSBkZWJ1Z2dpbmcgbWVzc2FnZXMKKyAgIGluIHRoZSBkcml2ZXJzIGFyZSBtb3JlIHdpZGVseSBjbGFzc2lmaWVkLCB0aGlzIG1heSBiZSBjaGFuZ2VkIHRvIEtFUk5fREVCVUcuICovCisjZGVmaW5lIE9TU1RfREVCX01TRyAgS0VSTl9OT1RJQ0UKKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RyaXZlci5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3JlcXVlc3QuaD4KKworI2RlZmluZSBTVF9LSUxPQllURSAxMDI0CisKKyNpbmNsdWRlICJzdC5oIgorI2luY2x1ZGUgIm9zc3QuaCIKKyNpbmNsdWRlICJvc3N0X29wdGlvbnMuaCIKKyNpbmNsdWRlICJvc3N0X2RldGVjdC5oIgorCitzdGF0aWMgaW50IG1heF9kZXYgPSAwOworc3RhdGljIGludCB3cml0ZV90aHJlc2hvbGRfa2JzID0gMDsKK3N0YXRpYyBpbnQgbWF4X3NnX3NlZ3MgPSAwOworCisjaWZkZWYgTU9EVUxFCitNT0RVTEVfQVVUSE9SKCJXaWxsZW0gUmllZGUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiT25TdHJlYW0ge0RJLXxGVy18U0MtfFVTQn17MzB8NTB9IFRhcGUgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShtYXhfZGV2LCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfZGV2LCAiTWF4aW11bSBudW1iZXIgb2YgT25TdHJlYW0gVGFwZSBEcml2ZXMgdG8gYXR0YWNoICg0KSIpOworCittb2R1bGVfcGFyYW0od3JpdGVfdGhyZXNob2xkX2ticywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mod3JpdGVfdGhyZXNob2xkX2ticywgIkFzeW5jaHJvbm91cyB3cml0ZSB0aHJlc2hvbGQgKEtCOyAzMikiKTsKKworbW9kdWxlX3BhcmFtKG1heF9zZ19zZWdzLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfc2dfc2VncywgIk1heGltdW0gbnVtYmVyIG9mIHNjYXR0ZXIvZ2F0aGVyIHNlZ21lbnRzIHRvIHVzZSAoOSkiKTsKKyNlbHNlCitzdGF0aWMgc3RydWN0IG9zc3RfZGV2X3Bhcm0geworICAgICAgIGNoYXIgICAqbmFtZTsKKyAgICAgICBpbnQgICAgKnZhbDsKK30gcGFybXNbXSBfX2luaXRkYXRhID0geworICAgICAgIHsgIm1heF9kZXYiLCAgICAgICAgICAgICAmbWF4X2RldiAgICAgICAgICAgICB9LAorICAgICAgIHsgIndyaXRlX3RocmVzaG9sZF9rYnMiLCAmd3JpdGVfdGhyZXNob2xkX2ticyB9LAorICAgICAgIHsgIm1heF9zZ19zZWdzIiwgICAgICAgICAmbWF4X3NnX3NlZ3MgICAgICAgICB9Cit9OworI2VuZGlmCisKK3N0YXRpYyBjaGFyICpvc3N0X2Zvcm1hdHNbU1RfTkJSX01PREVTXSA9eyIiLCAibCIsICJtIiwgImEifTsKKworLyogU29tZSBkZWZhdWx0IGRlZmluaXRpb25zIGhhdmUgYmVlbiBtb3ZlZCB0byBvc3N0X29wdGlvbnMuaCAqLworI2RlZmluZSBPU1NUX0JVRkZFUl9TSVpFIChPU1NUX0JVRkZFUl9CTE9DS1MgKiBTVF9LSUxPQllURSkKKyNkZWZpbmUgT1NTVF9XUklURV9USFJFU0hPTEQgKE9TU1RfV1JJVEVfVEhSRVNIT0xEX0JMT0NLUyAqIFNUX0tJTE9CWVRFKQorCisvKiBUaGUgYnVmZmVyIHNpemUgc2hvdWxkIGZpdCBpbnRvIHRoZSAyNCBiaXRzIGZvciBsZW5ndGggaW4gdGhlCisgICA2LWJ5dGUgU0NTSSByZWFkIGFuZCB3cml0ZSBjb21tYW5kcy4gKi8KKyNpZiBPU1NUX0JVRkZFUl9TSVpFID49ICgyIDw8IDI0IC0gMSkKKyNlcnJvciAiQnVmZmVyIHNpemUgc2hvdWxkIG5vdCBleGNlZWQgKDIgPDwgMjQgLSAxKSBieXRlcyEiCisjZW5kaWYKKworI2lmIERFQlVHCitzdGF0aWMgaW50IGRlYnVnZ2luZyA9IDE7CisvKiB1bmNvbW1lbnQgZGVmaW5lIGJlbG93IHRvIHRlc3QgZXJyb3IgcmVjb3ZlcnkgKi8KKy8vICNkZWZpbmUgT1NTVF9JTkpFQ1RfRVJST1JTIDEgCisjZW5kaWYKKworLyogRG8gbm90IHJldHJ5ISBUaGUgZHJpdmUgZmlybXdhcmUgYWxyZWFkeSByZXRyaWVzIHdoZW4gYXBwcm9wcmlhdGUsCisgICBhbmQgd2hlbiBpdCB0cmllcyB0byB0ZWxsIHVzIHNvbWV0aGluZywgd2UgaGFkIGJldHRlciBsaXN0ZW4uLi4gKi8KKyNkZWZpbmUgTUFYX1JFVFJJRVMgMAorCisjZGVmaW5lIE5PX1RBUEUgIE5PVF9SRUFEWQorCisjZGVmaW5lIE9TU1RfV0FJVF9QT1NJVElPTl9DT01QTEVURSAgIChIWiA+IDIwMCA/IEhaIC8gMjAwIDogMSkKKyNkZWZpbmUgT1NTVF9XQUlUX1dSSVRFX0NPTVBMRVRFICAgICAgKEhaIC8gMTIpCisjZGVmaW5lIE9TU1RfV0FJVF9MT05HX1dSSVRFX0NPTVBMRVRFIChIWiAvIDIpCisJCisjZGVmaW5lIE9TU1RfVElNRU9VVCAoMjAwICogSFopCisjZGVmaW5lIE9TU1RfTE9OR19USU1FT1VUICgxODAwICogSFopCisKKyNkZWZpbmUgVEFQRV9OUih4KSAoaW1pbm9yKHgpICYgfigtMSA8PCBTVF9NT0RFX1NISUZUKSkKKyNkZWZpbmUgVEFQRV9NT0RFKHgpICgoaW1pbm9yKHgpICYgU1RfTU9ERV9NQVNLKSA+PiBTVF9NT0RFX1NISUZUKQorI2RlZmluZSBUQVBFX1JFV0lORCh4KSAoKGltaW5vcih4KSAmIDB4ODApID09IDApCisjZGVmaW5lIFRBUEVfSVNfUkFXKHgpIChUQVBFX01PREUoeCkgJiAoU1RfTkJSX01PREVTID4+IDEpKQorCisvKiBJbnRlcm5hbCBpb2N0bCB0byBzZXQgYm90aCBkZW5zaXR5ICh1cHBlcm1vc3QgOCBiaXRzKSBhbmQgYmxvY2tzaXplIChsb3dlcgorICAgMjQgYml0cykgKi8KKyNkZWZpbmUgU0VUX0RFTlNfQU5EX0JMSyAweDEwMDAxCisKK3N0YXRpYyBpbnQgb3NzdF9idWZmZXJfc2l6ZSAgICAgICA9IE9TU1RfQlVGRkVSX1NJWkU7CitzdGF0aWMgaW50IG9zc3Rfd3JpdGVfdGhyZXNob2xkICAgPSBPU1NUX1dSSVRFX1RIUkVTSE9MRDsKK3N0YXRpYyBpbnQgb3NzdF9tYXhfc2dfc2VncyAgICAgICA9IE9TU1RfTUFYX1NHOworc3RhdGljIGludCBvc3N0X21heF9kZXYgICAgICAgICAgID0gT1NTVF9NQVhfVEFQRVM7CitzdGF0aWMgaW50IG9zc3RfbnJfZGV2OworCitzdGF0aWMgc3RydWN0IG9zc3RfdGFwZSAqKm9zX3Njc2lfdGFwZXMgPSBOVUxMOworc3RhdGljIERFRklORV9SV0xPQ0sob3Nfc2NzaV90YXBlc19sb2NrKTsKKworc3RhdGljIGludCBtb2Rlc19kZWZpbmVkID0gMDsKKworc3RhdGljIHN0cnVjdCBvc3N0X2J1ZmZlciAqbmV3X3RhcGVfYnVmZmVyKGludCwgaW50LCBpbnQpOworc3RhdGljIGludCBlbmxhcmdlX2J1ZmZlcihzdHJ1Y3Qgb3NzdF9idWZmZXIgKiwgaW50KTsKK3N0YXRpYyB2b2lkIG5vcm1hbGl6ZV9idWZmZXIoc3RydWN0IG9zc3RfYnVmZmVyICopOworc3RhdGljIGludCBhcHBlbmRfdG9fYnVmZmVyKGNvbnN0IGNoYXIgX191c2VyICosIHN0cnVjdCBvc3N0X2J1ZmZlciAqLCBpbnQpOworc3RhdGljIGludCBmcm9tX2J1ZmZlcihzdHJ1Y3Qgb3NzdF9idWZmZXIgKiwgY2hhciBfX3VzZXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgb3NzdF96ZXJvX2J1ZmZlcl90YWlsKHN0cnVjdCBvc3N0X2J1ZmZlciAqKTsKK3N0YXRpYyBpbnQgb3NzdF9jb3B5X3RvX2J1ZmZlcihzdHJ1Y3Qgb3NzdF9idWZmZXIgKiwgdW5zaWduZWQgY2hhciAqKTsKK3N0YXRpYyBpbnQgb3NzdF9jb3B5X2Zyb21fYnVmZmVyKHN0cnVjdCBvc3N0X2J1ZmZlciAqLCB1bnNpZ25lZCBjaGFyICopOworCitzdGF0aWMgaW50IG9zc3RfcHJvYmUoc3RydWN0IGRldmljZSAqKTsKK3N0YXRpYyBpbnQgb3NzdF9yZW1vdmUoc3RydWN0IGRldmljZSAqKTsKKworc3RhdGljIHN0cnVjdCBzY3NpX2RyaXZlciBvc3N0X3RlbXBsYXRlID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmdlbmRydiA9IHsKKwkJLm5hbWUJCT0gICJvc3N0IiwKKwkJLnByb2JlCQk9IG9zc3RfcHJvYmUsCisJCS5yZW1vdmUJCT0gb3NzdF9yZW1vdmUsCisJfQorfTsKKworc3RhdGljIGludCBvc3N0X2ludF9pb2N0bChzdHJ1Y3Qgb3NzdF90YXBlICpTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LAorCQkJICAgIHVuc2lnbmVkIGludCBjbWRfaW4sIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworc3RhdGljIGludCBvc3N0X3NldF9mcmFtZV9wb3NpdGlvbihzdHJ1Y3Qgb3NzdF90YXBlICpTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LCBpbnQgZnJhbWUsIGludCBza2lwKTsKKworc3RhdGljIGludCBvc3N0X2dldF9mcmFtZV9wb3NpdGlvbihzdHJ1Y3Qgb3NzdF90YXBlICpTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50KTsKKworc3RhdGljIGludCBvc3N0X2ZsdXNoX3dyaXRlX2J1ZmZlcihzdHJ1Y3Qgb3NzdF90YXBlICpTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50KTsKKworc3RhdGljIGludCBvc3N0X3dyaXRlX2Vycm9yX3JlY292ZXJ5KHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LCBpbnQgcGVuZGluZyk7CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqdGFwZV9uYW1lKHN0cnVjdCBvc3N0X3RhcGUgKnRhcGUpCit7CisJcmV0dXJuIHRhcGUtPmRyaXZlLT5kaXNrX25hbWU7Cit9CisMCisvKiBSb3V0aW5lcyB0aGF0IGhhbmRsZSB0aGUgaW50ZXJhY3Rpb24gd2l0aCBtaWQtbGF5ZXIgU0NTSSByb3V0aW5lcyAqLworCisvKiBDb252ZXJ0IHRoZSByZXN1bHQgdG8gc3VjY2VzcyBjb2RlICovCitzdGF0aWMgaW50IG9zc3RfY2hrX3Jlc3VsdChzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICogU1JwbnQpCit7CisJY2hhciAqbmFtZSA9IHRhcGVfbmFtZShTVHApOworCWludCByZXN1bHQgPSBTUnBudC0+c3JfcmVzdWx0OworCXVuc2lnbmVkIGNoYXIgKiBzZW5zZSA9IFNScG50LT5zcl9zZW5zZV9idWZmZXIsIHNjb2RlOworI2lmIERFQlVHCisJY29uc3QgY2hhciAqc3RwOworI2VuZGlmCisKKwlpZiAoIXJlc3VsdCkgeworCQlzZW5zZVswXSA9IDA7ICAgIC8qIFdlIGRvbid0IGhhdmUgc2Vuc2UgZGF0YSBpZiB0aGlzIGJ5dGUgaXMgemVybyAqLworCQlyZXR1cm4gMDsKKwl9CisJaWYgKChkcml2ZXJfYnl0ZShyZXN1bHQpICYgRFJJVkVSX01BU0spID09IERSSVZFUl9TRU5TRSkKKwkJc2NvZGUgPSBzZW5zZVsyXSAmIDB4MGY7CisJZWxzZSB7CisJCXNlbnNlWzBdID0gMDsgICAgLyogV2UgZG9uJ3QgaGF2ZSBzZW5zZSBkYXRhIGlmIHRoaXMgYnl0ZSBpcyB6ZXJvICovCisJCXNjb2RlID0gMDsKKwl9CisjaWYgREVCVUcKKwlpZiAoZGVidWdnaW5nKSB7CisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEVycm9yOiAleCwgY21kOiAleCAleCAleCAleCAleCAleCBMZW46ICVkXG4iLAorCQkgICBuYW1lLCByZXN1bHQsCisJCSAgIFNScG50LT5zcl9jbW5kWzBdLCBTUnBudC0+c3JfY21uZFsxXSwgU1JwbnQtPnNyX2NtbmRbMl0sCisJCSAgIFNScG50LT5zcl9jbW5kWzNdLCBTUnBudC0+c3JfY21uZFs0XSwgU1JwbnQtPnNyX2NtbmRbNV0sCisJCSAgIFNScG50LT5zcl9idWZmbGVuKTsKKwkJaWYgKHNjb2RlKSBwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTZW5zZTogJTAyeCwgQVNDOiAlMDJ4LCBBU0NROiAlMDJ4XG4iLAorCQkJICAgICAgIAluYW1lLCBzY29kZSwgc2Vuc2VbMTJdLCBzZW5zZVsxM10pOworCQlpZiAoZHJpdmVyX2J5dGUocmVzdWx0KSAmIERSSVZFUl9TRU5TRSkKKwkJCXNjc2lfcHJpbnRfcmVxX3NlbnNlKCJvc3N0ICIsIFNScG50KTsKKwl9CisJZWxzZQorI2VuZGlmCisJaWYgKCEoZHJpdmVyX2J5dGUocmVzdWx0KSAmIERSSVZFUl9TRU5TRSkgfHwKKwkJKChzZW5zZVswXSAmIDB4NzApID09IDB4NzAgJiYKKwkJIHNjb2RlICE9IE5PX1NFTlNFICYmCisJCSBzY29kZSAhPSBSRUNPVkVSRURfRVJST1IgJiYKKy8qICAgICAgCSBzY29kZSAhPSBVTklUX0FUVEVOVElPTiAmJiAqLworCQkgc2NvZGUgIT0gQkxBTktfQ0hFQ0sgJiYKKwkJIHNjb2RlICE9IFZPTFVNRV9PVkVSRkxPVyAmJgorCQkgU1JwbnQtPnNyX2NtbmRbMF0gIT0gTU9ERV9TRU5TRSAmJgorCQkgU1JwbnQtPnNyX2NtbmRbMF0gIT0gVEVTVF9VTklUX1JFQURZKSkgeyAvKiBBYm5vcm1hbCBjb25kaXRpb25zIGZvciB0YXBlICovCisJCWlmIChkcml2ZXJfYnl0ZShyZXN1bHQpICYgRFJJVkVSX1NFTlNFKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpXOiBDb21tYW5kIHdpdGggc2Vuc2UgZGF0YTpcbiIsIG5hbWUpOworCQkJc2NzaV9wcmludF9yZXFfc2Vuc2UoIm9zc3Q6IiwgU1JwbnQpOworCQl9CisJCWVsc2UgeworCQkJc3RhdGljCWludAlub3R5ZXRwcmludGVkID0gMTsKKworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAiJXM6VzogV2FybmluZyAleCAoc3VnZy4gYnQgMHgleCwgZHJpdmVyIGJ0IDB4JXgsIGhvc3QgYnQgMHgleCkuXG4iLAorCQkJICAgICBuYW1lLCByZXN1bHQsIHN1Z2dlc3Rpb24ocmVzdWx0KSwgZHJpdmVyX2J5dGUocmVzdWx0KSAmIERSSVZFUl9NQVNLLAorCQkJICAgICBob3N0X2J5dGUocmVzdWx0KSk7CisJCQlpZiAobm90eWV0cHJpbnRlZCkgeworCQkJCW5vdHlldHByaW50ZWQgPSAwOworCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkJIiVzOkk6IFRoaXMgd2FybmluZyBtYXkgYmUgY2F1c2VkIGJ5IHlvdXIgc2NzaSBjb250cm9sbGVyLFxuIiwgbmFtZSk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiJXM6STogaXQgaGFzIGJlZW4gcmVwb3J0ZWQgd2l0aCBzb21lIEJ1c2xvZ2ljIGNhcmRzLlxuIiwgbmFtZSk7CisJCQl9CisJCX0KKwl9CisJU1RwLT5wb3NfdW5rbm93biB8PSBTVHAtPmRldmljZS0+d2FzX3Jlc2V0OworCisJaWYgKChzZW5zZVswXSAmIDB4NzApID09IDB4NzAgJiYKKwkgICAgIHNjb2RlID09IFJFQ09WRVJFRF9FUlJPUikgeworCQlTVHAtPnJlY292ZXJfY291bnQrKzsKKwkJU1RwLT5yZWNvdmVyX2VycmVnKys7CisjaWYgREVCVUcKKwkJaWYgKGRlYnVnZ2luZykgeworCQkJaWYgKFNScG50LT5zcl9jbW5kWzBdID09IFJFQURfNikKKwkJCQlzdHAgPSAicmVhZCI7CisJCQllbHNlIGlmIChTUnBudC0+c3JfY21uZFswXSA9PSBXUklURV82KQorCQkJCXN0cCA9ICJ3cml0ZSI7CisJCQllbHNlCisJCQkJc3RwID0gImlvY3RsIjsKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFJlY292ZXJlZCAlcyBlcnJvciAoJWQpLlxuIiwgbmFtZSwgc3RwLAorCQkJCQkgICAgIFNUcC0+cmVjb3Zlcl9jb3VudCk7CisJCX0KKyNlbmRpZgorCQlpZiAoKHNlbnNlWzJdICYgMHhlMCkgPT0gMCkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gKC1FSU8pOworfQorCisKKy8qIFdha2V1cCBmcm9tIGludGVycnVwdCAqLworc3RhdGljIHZvaWQgb3NzdF9zbGVlcF9kb25lIChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpCit7CisJc3RydWN0IG9zc3RfdGFwZSAqIFNUcCA9IGNvbnRhaW5lcl9vZihTQ3BudC0+cmVxdWVzdC0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhLCBzdHJ1Y3Qgb3NzdF90YXBlLCBkcml2ZXIpOworCisJaWYgKChTVHAtPmJ1ZmZlciktPndyaXRpbmcgJiYKKwkgICAgKFNDcG50LT5zZW5zZV9idWZmZXJbMF0gJiAweDcwKSA9PSAweDcwICYmCisJICAgIChTQ3BudC0+c2Vuc2VfYnVmZmVyWzJdICYgMHg0MCkpIHsKKwkJLyogRU9NIGF0IHdyaXRlLWJlaGluZCwgaGFzIGFsbCBiZWVuIHdyaXR0ZW4/ICovCisJCWlmICgoU0NwbnQtPnNlbnNlX2J1ZmZlclsyXSAmIDB4MGYpID09IFZPTFVNRV9PVkVSRkxPVykKKwkJCVNUcC0+YnVmZmVyLT5taWRsZXZlbF9yZXN1bHQgPSBTQ3BudC0+cmVzdWx0OyAvKiBFcnJvciAqLworCQllbHNlCisJCQlTVHAtPmJ1ZmZlci0+bWlkbGV2ZWxfcmVzdWx0ID0gSU5UX01BWDsgICAgICAgLyogT0sgKi8KKwl9CisJZWxzZQorCQlTVHAtPmJ1ZmZlci0+bWlkbGV2ZWxfcmVzdWx0ID0gU0NwbnQtPnJlc3VsdDsKKwlTQ3BudC0+cmVxdWVzdC0+cnFfc3RhdHVzID0gUlFfU0NTSV9ET05FOworCVNUcC0+YnVmZmVyLT5sYXN0X1NScG50ID0gU0NwbnQtPnNjX3JlcXVlc3Q7CisKKyNpZiBERUJVRworCVNUcC0+d3JpdGVfcGVuZGluZyA9IDA7CisjZW5kaWYKKwljb21wbGV0ZShTQ3BudC0+cmVxdWVzdC0+d2FpdGluZyk7Cit9CisKKworLyogRG8gdGhlIHNjc2kgY29tbWFuZC4gV2FpdHMgdW50aWwgY29tbWFuZCBwZXJmb3JtZWQgaWYgZG9fd2FpdCBpcyB0cnVlLgorICAgT3RoZXJ3aXNlIG9zc3Rfd3JpdGVfYmVoaW5kX2NoZWNrKCkgaXMgdXNlZCB0byBjaGVjayB0aGF0IHRoZSBjb21tYW5kCisgICBoYXMgZmluaXNoZWQuICovCitzdGF0aWMJc3RydWN0IHNjc2lfcmVxdWVzdCAqIG9zc3RfZG9fc2NzaShzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudCwgc3RydWN0IG9zc3RfdGFwZSAqU1RwLCAKKwl1bnNpZ25lZCBjaGFyICpjbWQsIGludCBieXRlcywgaW50IGRpcmVjdGlvbiwgaW50IHRpbWVvdXQsIGludCByZXRyaWVzLCBpbnQgZG9fd2FpdCkKK3sKKwl1bnNpZ25lZCBjaGFyICpicDsKKyNpZmRlZiBPU1NUX0lOSkVDVF9FUlJPUlMKKwlzdGF0aWMgICBpbnQgICBpbmplY3QgPSAwOworCXN0YXRpYyAgIGludCAgIHJlcGVhdCA9IDA7CisjZW5kaWYKKwlpZiAoU1JwbnQgPT0gTlVMTCkgeworCQlpZiAoKFNScG50ID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KFNUcC0+ZGV2aWNlLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczpFOiBDYW4ndCBnZXQgU0NTSSByZXF1ZXN0LlxuIiwgdGFwZV9uYW1lKFNUcCkpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCShTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ID0gKC1FSU5UUik7CisJCQllbHNlCisJCQkJKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgPSAoLUVCVVNZKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisgICAgICAgIGluaXRfY29tcGxldGlvbigmU1RwLT53YWl0KTsKKwlTUnBudC0+c3JfdXNlX3NnID0gKGJ5dGVzID4gKFNUcC0+YnVmZmVyKS0+c2dbMF0ubGVuZ3RoKSA/CisJCQkJICAgIChTVHAtPmJ1ZmZlciktPnVzZV9zZyA6IDA7CisJaWYgKFNScG50LT5zcl91c2Vfc2cpIHsKKwkJYnAgPSAoY2hhciAqKSYoU1RwLT5idWZmZXItPnNnWzBdKTsKKwkJaWYgKFNUcC0+YnVmZmVyLT5zZ19zZWdzIDwgU1JwbnQtPnNyX3VzZV9zZykKKwkJCVNScG50LT5zcl91c2Vfc2cgPSBTVHAtPmJ1ZmZlci0+c2dfc2VnczsKKwl9CisJZWxzZQorCQlicCA9IChTVHAtPmJ1ZmZlciktPmJfZGF0YTsKKwlTUnBudC0+c3JfZGF0YV9kaXJlY3Rpb24gPSBkaXJlY3Rpb247CisJU1JwbnQtPnNyX2NtZF9sZW4gPSAwOworCVNScG50LT5zcl9yZXF1ZXN0LT53YWl0aW5nID0gJihTVHAtPndhaXQpOworCVNScG50LT5zcl9yZXF1ZXN0LT5ycV9zdGF0dXMgPSBSUV9TQ1NJX0JVU1k7CisJU1JwbnQtPnNyX3JlcXVlc3QtPnJxX2Rpc2sgPSBTVHAtPmRyaXZlOworCisJc2NzaV9kb19yZXEoU1JwbnQsICh2b2lkICopY21kLCBicCwgYnl0ZXMsIG9zc3Rfc2xlZXBfZG9uZSwgdGltZW91dCwgcmV0cmllcyk7CisKKwlpZiAoZG9fd2FpdCkgeworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKFNScG50LT5zcl9yZXF1ZXN0LT53YWl0aW5nKTsKKwkJU1JwbnQtPnNyX3JlcXVlc3QtPndhaXRpbmcgPSBOVUxMOworCQlTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQgPSBvc3N0X2Noa19yZXN1bHQoU1RwLCBTUnBudCk7CisjaWZkZWYgT1NTVF9JTkpFQ1RfRVJST1JTCisJCWlmIChTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQgPT0gMCAmJgorCQkgICAgY21kWzBdID09IFJFQURfNiAmJgorCQkgICAgY21kWzRdICYmIAorCQkgICAgKCAoKysgaW5qZWN0ICUgODMpID09IDI5ICB8fAorCQkgICAgICAoU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiA9PSAyNDAgCisJCQkgICAgICAgICAvKiBvciBTVHAtPnJlYWRfZXJyb3JfZnJhbWUgdG8gZmFpbCBhZ2FpbiBvbiB0aGUgYmxvY2sgY2FsY3VsYXRlZCBhYm92ZSAqLyAmJgorCQkJCSArK3JlcGVhdCA8IDMpKSkgeworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogSW5qZWN0aW5nIHJlYWQgZXJyb3JcbiIsIHRhcGVfbmFtZShTVHApKTsKKwkJCVNUcC0+YnVmZmVyLT5sYXN0X3Jlc3VsdF9mYXRhbCA9IDE7CisJCX0KKyNlbmRpZgorCX0KKwlyZXR1cm4gU1JwbnQ7Cit9CisKKworLyogSGFuZGxlIHRoZSB3cml0ZS1iZWhpbmQgY2hlY2tpbmcgKGRvd25zIHRoZSBzZW1hcGhvcmUpICovCitzdGF0aWMgdm9pZCBvc3N0X3dyaXRlX2JlaGluZF9jaGVjayhzdHJ1Y3Qgb3NzdF90YXBlICpTVHApCit7CisJc3RydWN0IG9zc3RfYnVmZmVyICogU1RidWZmZXI7CisKKwlTVGJ1ZmZlciA9IFNUcC0+YnVmZmVyOworCisjaWYgREVCVUcKKwlpZiAoU1RwLT53cml0ZV9wZW5kaW5nKQorCQlTVHAtPm5icl93YWl0cysrOworCWVsc2UKKwkJU1RwLT5uYnJfZmluaXNoZWQrKzsKKyNlbmRpZgorCXdhaXRfZm9yX2NvbXBsZXRpb24oJihTVHAtPndhaXQpKTsKKwkoU1RwLT5idWZmZXIpLT5sYXN0X1NScG50LT5zcl9yZXF1ZXN0LT53YWl0aW5nID0gTlVMTDsKKworCVNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCA9IG9zc3RfY2hrX3Jlc3VsdChTVHAsIFNUcC0+YnVmZmVyLT5sYXN0X1NScG50KTsKKworCWlmICgoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCkKKwkJKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgPQorCQkJb3NzdF93cml0ZV9lcnJvcl9yZWNvdmVyeShTVHAsICYoKFNUcC0+YnVmZmVyKS0+bGFzdF9TUnBudCksIDEpOworCWVsc2UKKwkJU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbisrOworCisJc2NzaV9yZWxlYXNlX3JlcXVlc3QoKFNUcC0+YnVmZmVyKS0+bGFzdF9TUnBudCk7CisKKwlpZiAoU1RidWZmZXItPndyaXRpbmcgPCBTVGJ1ZmZlci0+YnVmZmVyX2J5dGVzKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJvc3N0IDpBOiB3cml0ZV9iZWhpbmRfY2hlY2s6IHNvbWV0aGluZyBsZWZ0IGluIGJ1ZmZlciFcbiIpOworCisJU1RidWZmZXItPmJ1ZmZlcl9ieXRlcyAtPSBTVGJ1ZmZlci0+d3JpdGluZzsKKwlTVGJ1ZmZlci0+d3JpdGluZyA9IDA7CisKKwlyZXR1cm47Cit9CisKKworDAorLyogT25zdHJlYW0gc3BlY2lmaWMgUm91dGluZXMgKi8KKy8qCisgKiBJbml0aWFsaXplIHRoZSBPblN0cmVhbSBBVVgKKyAqLworc3RhdGljIHZvaWQgb3NzdF9pbml0X2F1eChzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBpbnQgZnJhbWVfdHlwZSwgaW50IGZyYW1lX3NlcV9udW1iZXIsCisJCQkJCSBpbnQgbG9naWNhbF9ibGtfbnVtLCBpbnQgYmxrX3N6LCBpbnQgYmxrX2NudCkKK3sKKwlvc19hdXhfdCAgICAgICAqYXV4ID0gU1RwLT5idWZmZXItPmF1eDsKKwlvc19wYXJ0aXRpb25fdCAqcGFyID0gJmF1eC0+cGFydGl0aW9uOworCW9zX2RhdF90ICAgICAgICpkYXQgPSAmYXV4LT5kYXQ7CisKKwlpZiAoU1RwLT5yYXcpIHJldHVybjsKKworCW1lbXNldChhdXgsIDAsIHNpemVvZigqYXV4KSk7CisJYXV4LT5mb3JtYXRfaWQgPSBodG9ubCgwKTsKKwltZW1jcHkoYXV4LT5hcHBsaWNhdGlvbl9zaWcsICJMSU40IiwgNCk7CisJYXV4LT5oZHdyID0gaHRvbmwoMCk7CisJYXV4LT5mcmFtZV90eXBlID0gZnJhbWVfdHlwZTsKKworCXN3aXRjaCAoZnJhbWVfdHlwZSkgeworCSAgY2FzZQlPU19GUkFNRV9UWVBFX0hFQURFUjoKKwkJYXV4LT51cGRhdGVfZnJhbWVfY250ciAgICA9IGh0b25sKFNUcC0+dXBkYXRlX2ZyYW1lX2NudHIpOworCQlwYXItPnBhcnRpdGlvbl9udW0gICAgICAgID0gT1NfQ09ORklHX1BBUlRJVElPTjsKKwkJcGFyLT5wYXJfZGVzY192ZXIgICAgICAgICA9IE9TX1BBUlRJVElPTl9WRVJTSU9OOworCQlwYXItPndydF9wYXNzX2NudHIgICAgICAgID0gaHRvbnMoMHhmZmZmKTsKKwkJLyogMC00ID0gcmVzZXJ2ZWQsIDUtOSA9IGhlYWRlciwgMjk5MC0yOTk0ID0gaGVhZGVyLCAyOTk1LTI5OTkgPSByZXNlcnZlZCAqLworCQlwYXItPmZpcnN0X2ZyYW1lX3Bwb3MgICAgID0gaHRvbmwoMCk7CisJCXBhci0+bGFzdF9mcmFtZV9wcG9zICAgICAgPSBodG9ubCgweGJiNyk7CisJCWF1eC0+ZnJhbWVfc2VxX251bSAgICAgICAgPSBodG9ubCgwKTsKKwkJYXV4LT5sb2dpY2FsX2Jsa19udW1faGlnaCA9IGh0b25sKDApOworCQlhdXgtPmxvZ2ljYWxfYmxrX251bSAgICAgID0gaHRvbmwoMCk7CisJCWF1eC0+bmV4dF9tYXJrX3Bwb3MgICAgICAgPSBodG9ubChTVHAtPmZpcnN0X21hcmtfcHBvcyk7CisJCWJyZWFrOworCSAgY2FzZQlPU19GUkFNRV9UWVBFX0RBVEE6CisJICBjYXNlCU9TX0ZSQU1FX1RZUEVfTUFSS0VSOgorCQlkYXQtPmRhdF9zeiA9IDg7CisJCWRhdC0+cmVzZXJ2ZWQxID0gMDsKKwkJZGF0LT5lbnRyeV9jbnQgPSAxOworCQlkYXQtPnJlc2VydmVkMyA9IDA7CisJCWRhdC0+ZGF0X2xpc3RbMF0uYmxrX3N6ICAgPSBodG9ubChibGtfc3opOworCQlkYXQtPmRhdF9saXN0WzBdLmJsa19jbnQgID0gaHRvbnMoYmxrX2NudCk7CisJCWRhdC0+ZGF0X2xpc3RbMF0uZmxhZ3MgICAgPSBmcmFtZV90eXBlPT1PU19GUkFNRV9UWVBFX01BUktFUj8KKwkJCQkJCQlPU19EQVRfRkxBR1NfTUFSSzpPU19EQVRfRkxBR1NfREFUQTsKKwkJZGF0LT5kYXRfbGlzdFswXS5yZXNlcnZlZCA9IDA7CisJICBjYXNlCU9TX0ZSQU1FX1RZUEVfRU9EOgorCQlhdXgtPnVwZGF0ZV9mcmFtZV9jbnRyICAgID0gaHRvbmwoMCk7CisJCXBhci0+cGFydGl0aW9uX251bSAgICAgICAgPSBPU19EQVRBX1BBUlRJVElPTjsKKwkJcGFyLT5wYXJfZGVzY192ZXIgICAgICAgICA9IE9TX1BBUlRJVElPTl9WRVJTSU9OOworCQlwYXItPndydF9wYXNzX2NudHIgICAgICAgID0gaHRvbnMoU1RwLT53cnRfcGFzc19jbnRyKTsKKwkJcGFyLT5maXJzdF9mcmFtZV9wcG9zICAgICA9IGh0b25sKFNUcC0+Zmlyc3RfZGF0YV9wcG9zKTsKKwkJcGFyLT5sYXN0X2ZyYW1lX3Bwb3MgICAgICA9IGh0b25sKFNUcC0+Y2FwYWNpdHkpOworCQlhdXgtPmZyYW1lX3NlcV9udW0gICAgICAgID0gaHRvbmwoZnJhbWVfc2VxX251bWJlcik7CisJCWF1eC0+bG9naWNhbF9ibGtfbnVtX2hpZ2ggPSBodG9ubCgwKTsKKwkJYXV4LT5sb2dpY2FsX2Jsa19udW0gICAgICA9IGh0b25sKGxvZ2ljYWxfYmxrX251bSk7CisJCWJyZWFrOworCSAgZGVmYXVsdDogOyAvKiBwcm9iYWJseSBGSUxMICovCisJfQorCWF1eC0+ZmlsZW1hcmtfY250ID0gbnRvaGwoU1RwLT5maWxlbWFya19jbnQpOworCWF1eC0+cGh5c19mbSA9IG50b2hsKDB4ZmZmZmZmZmYpOworCWF1eC0+bGFzdF9tYXJrX3Bwb3MgPSBudG9obChTVHAtPmxhc3RfbWFya19wcG9zKTsKKwlhdXgtPmxhc3RfbWFya19sYm4gID0gbnRvaGwoU1RwLT5sYXN0X21hcmtfbGJuKTsKK30KKworLyoKKyAqIFZlcmlmeSB0aGF0IHdlIGhhdmUgdGhlIGNvcnJlY3QgdGFwZSBmcmFtZQorICovCitzdGF0aWMgaW50IG9zc3RfdmVyaWZ5X2ZyYW1lKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIGludCBmcmFtZV9zZXFfbnVtYmVyLCBpbnQgcXVpZXQpCit7CisJY2hhciAgICAgICAgICAgICAgICogbmFtZSA9IHRhcGVfbmFtZShTVHApOworCW9zX2F1eF90ICAgICAgICAgICAqIGF1eCAgPSBTVHAtPmJ1ZmZlci0+YXV4OworCW9zX3BhcnRpdGlvbl90ICAgICAqIHBhciAgPSAmKGF1eC0+cGFydGl0aW9uKTsKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgKiBTVHBzID0gJihTVHAtPnBzW1NUcC0+cGFydGl0aW9uXSk7CisJaW50CQkgICAgIGJsa19jbnQsIGJsa19zeiwgaTsKKworCWlmIChTVHAtPnJhdykgeworCQlpZiAoU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0KSB7CisJCQlmb3IgKGk9MDsgaSA8IFNUcC0+YnVmZmVyLT5zZ19zZWdzOyBpKyspCisJCQkJbWVtc2V0KHBhZ2VfYWRkcmVzcyhTVHAtPmJ1ZmZlci0+c2dbaV0ucGFnZSksCisJCQkJICAgICAgIDAsIFNUcC0+YnVmZmVyLT5zZ1tpXS5sZW5ndGgpOworCQkJc3RyY3B5KFNUcC0+YnVmZmVyLT5iX2RhdGEsICJSRUFEIEVSUk9SIE9OIEZSQU1FIik7CisgICAgICAgICAgICAgICAgfSBlbHNlCisJCQlTVHAtPmJ1ZmZlci0+YnVmZmVyX2J5dGVzID0gT1NfRlJBTUVfU0laRTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQpIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTa2lwcGluZyBmcmFtZSwgcmVhZCBlcnJvclxuIiwgbmFtZSk7CisjZW5kaWYKKwkJcmV0dXJuIDA7CisJfQorCWlmIChudG9obChhdXgtPmZvcm1hdF9pZCkgIT0gMCkgeworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFNraXBwaW5nIGZyYW1lLCBmb3JtYXRfaWQgJXVcbiIsIG5hbWUsIG50b2hsKGF1eC0+Zm9ybWF0X2lkKSk7CisjZW5kaWYKKwkJZ290byBlcnJfb3V0OworCX0KKwlpZiAobWVtY21wKGF1eC0+YXBwbGljYXRpb25fc2lnLCBTVHAtPmFwcGxpY2F0aW9uX3NpZywgNCkgIT0gMCAmJgorCSAgICAobWVtY21wKGF1eC0+YXBwbGljYXRpb25fc2lnLCAiTElOMyIsIDQpICE9IDAgfHwgU1RwLT5saW51eF9tZWRpYV92ZXJzaW9uICE9IDQpKSB7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU2tpcHBpbmcgZnJhbWUsIGluY29ycmVjdCBhcHBsaWNhdGlvbiBzaWduYXR1cmVcbiIsIG5hbWUpOworI2VuZGlmCisJCWdvdG8gZXJyX291dDsKKwl9CisJaWYgKHBhci0+cGFydGl0aW9uX251bSAhPSBPU19EQVRBX1BBUlRJVElPTikgeworCQlpZiAoIVNUcC0+bGludXhfbWVkaWEgfHwgU1RwLT5saW51eF9tZWRpYV92ZXJzaW9uICE9IDIpIHsKKyNpZiBERUJVRworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU2tpcHBpbmcgZnJhbWUsIHBhcnRpdGlvbiBudW0gJWRcbiIsCisJCQkJCSAgICBuYW1lLCBwYXItPnBhcnRpdGlvbl9udW0pOworI2VuZGlmCisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwl9CisJaWYgKHBhci0+cGFyX2Rlc2NfdmVyICE9IE9TX1BBUlRJVElPTl9WRVJTSU9OKSB7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU2tpcHBpbmcgZnJhbWUsIHBhcnRpdGlvbiB2ZXJzaW9uICVkXG4iLCBuYW1lLCBwYXItPnBhcl9kZXNjX3Zlcik7CisjZW5kaWYKKwkJZ290byBlcnJfb3V0OworCX0KKwlpZiAobnRvaHMocGFyLT53cnRfcGFzc19jbnRyKSAhPSBTVHAtPndydF9wYXNzX2NudHIpIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTa2lwcGluZyBmcmFtZSwgd3J0X3Bhc3NfY250ciAlZCAoZXhwZWN0ZWQgJWQpXG4iLCAKKwkJCQkgICAgbmFtZSwgbnRvaHMocGFyLT53cnRfcGFzc19jbnRyKSwgU1RwLT53cnRfcGFzc19jbnRyKTsKKyNlbmRpZgorCQlnb3RvIGVycl9vdXQ7CisJfQorCWlmIChhdXgtPmZyYW1lX3R5cGUgIT0gT1NfRlJBTUVfVFlQRV9EQVRBICYmCisJICAgIGF1eC0+ZnJhbWVfdHlwZSAhPSBPU19GUkFNRV9UWVBFX0VPRCAmJgorCSAgICBhdXgtPmZyYW1lX3R5cGUgIT0gT1NfRlJBTUVfVFlQRV9NQVJLRVIpIHsKKwkJaWYgKCFxdWlldCkKKyNpZiBERUJVRworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU2tpcHBpbmcgZnJhbWUsIGZyYW1lIHR5cGUgJXhcbiIsIG5hbWUsIGF1eC0+ZnJhbWVfdHlwZSk7CisjZW5kaWYKKwkJZ290byBlcnJfb3V0OworCX0KKwlpZiAoYXV4LT5mcmFtZV90eXBlID09IE9TX0ZSQU1FX1RZUEVfRU9EICYmCisJICAgIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24gPCBTVHAtPmVvZF9mcmFtZV9wcG9zKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOkk6IFNraXBwaW5nIHByZW1hdHVyZSBFT0QgZnJhbWUgJWRcbiIsIG5hbWUsCisJCQkJIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24pOworCQlnb3RvIGVycl9vdXQ7CisJfQorICAgICAgICBpZiAoZnJhbWVfc2VxX251bWJlciAhPSAtMSAmJiBudG9obChhdXgtPmZyYW1lX3NlcV9udW0pICE9IGZyYW1lX3NlcV9udW1iZXIpIHsKKwkJaWYgKCFxdWlldCkKKyNpZiBERUJVRworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU2tpcHBpbmcgZnJhbWUsIHNlcXVlbmNlIG51bWJlciAldSAoZXhwZWN0ZWQgJWQpXG4iLCAKKwkJCQkJICAgIG5hbWUsIG50b2hsKGF1eC0+ZnJhbWVfc2VxX251bSksIGZyYW1lX3NlcV9udW1iZXIpOworI2VuZGlmCisJCWdvdG8gZXJyX291dDsKKwl9CisJaWYgKGF1eC0+ZnJhbWVfdHlwZSA9PSBPU19GUkFNRV9UWVBFX01BUktFUikgeworCQlTVHBzLT5lb2YgPSBTVF9GTV9ISVQ7CisKKwkJaSA9IG50b2hsKGF1eC0+ZmlsZW1hcmtfY250KTsKKwkJaWYgKFNUcC0+aGVhZGVyX2NhY2hlICE9IE5VTEwgJiYgaSA8IE9TX0ZNX1RBQl9NQVggJiYgKGkgPiBTVHAtPmZpbGVtYXJrX2NudCB8fAorCQkgICAgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiAtIDEgIT0gbnRvaGwoU1RwLT5oZWFkZXJfY2FjaGUtPmRhdF9mbV90YWIuZm1fdGFiX2VudFtpXSkpKSB7CisjaWYgREVCVUcKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6ICVzIGZpbGVtYXJrICVkIGF0IGZyYW1lIHBvcyAlZFxuIiwgbmFtZSwKKwkJCQkgIFNUcC0+aGVhZGVyX2NhY2hlLT5kYXRfZm1fdGFiLmZtX3RhYl9lbnRbaV0gPT0gMD8iTGVhcm5lZCI6IkNvcnJlY3RlZCIsCisJCQkJICBpLCBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uIC0gMSk7CisjZW5kaWYKKwkJCVNUcC0+aGVhZGVyX2NhY2hlLT5kYXRfZm1fdGFiLmZtX3RhYl9lbnRbaV0gPSBodG9ubChTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uIC0gMSk7CisJCQlpZiAoaSA+PSBTVHAtPmZpbGVtYXJrX2NudCkKKwkJCQkgU1RwLT5maWxlbWFya19jbnQgPSBpKzE7CisJCX0KKwl9CisJaWYgKGF1eC0+ZnJhbWVfdHlwZSA9PSBPU19GUkFNRV9UWVBFX0VPRCkgeworCQlTVHBzLT5lb2YgPSBTVF9FT0RfMTsKKwkJU1RwLT5mcmFtZV9pbl9idWZmZXIgPSAxOworCX0KKwlpZiAoYXV4LT5mcmFtZV90eXBlID09IE9TX0ZSQU1FX1RZUEVfREFUQSkgeworICAgICAgICAgICAgICAgIGJsa19jbnQgPSBudG9ocyhhdXgtPmRhdC5kYXRfbGlzdFswXS5ibGtfY250KTsKKwkJYmxrX3N6ICA9IG50b2hsKGF1eC0+ZGF0LmRhdF9saXN0WzBdLmJsa19zeik7CisJCVNUcC0+YnVmZmVyLT5idWZmZXJfYnl0ZXMgPSBibGtfY250ICogYmxrX3N6OworCQlTVHAtPmJ1ZmZlci0+cmVhZF9wb2ludGVyID0gMDsKKwkJU1RwLT5mcmFtZV9pbl9idWZmZXIgPSAxOworCisJCS8qIFNlZSB3aGF0IGJsb2NrIHNpemUgd2FzIHVzZWQgdG8gd3JpdGUgZmlsZSAqLworCQlpZiAoU1RwLT5ibG9ja19zaXplICE9IGJsa19zeiAmJiBibGtfc3ogPiAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJICAgIAkiJXM6STogRmlsZSB3YXMgd3JpdHRlbiB3aXRoIGJsb2NrIHNpemUgJWQlYywgY3VycmVudGx5ICVkJWMsIGFkanVzdGVkIHRvIG1hdGNoLlxuIiwKKyAgICAgICAJCQkJbmFtZSwgYmxrX3N6PDEwMjQ/YmxrX3N6OmJsa19zei8xMDI0LGJsa19zejwxMDI0PydiJzonaycsCisJCQkJU1RwLT5ibG9ja19zaXplPDEwMjQ/U1RwLT5ibG9ja19zaXplOlNUcC0+YmxvY2tfc2l6ZS8xMDI0LAorCQkJCVNUcC0+YmxvY2tfc2l6ZTwxMDI0PydiJzonaycpOworCQkJU1RwLT5ibG9ja19zaXplICAgICAgICAgICAgPSBibGtfc3o7CisJCQlTVHAtPmJ1ZmZlci0+YnVmZmVyX2Jsb2NrcyA9IE9TX0RBVEFfU0laRSAvIGJsa19zejsKKwkJfQorCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKwl9CisgICAgICAgIFNUcC0+ZnJhbWVfc2VxX251bWJlciA9IG50b2hsKGF1eC0+ZnJhbWVfc2VxX251bSk7CisJU1RwLT5sb2dpY2FsX2Jsa19udW0gID0gbnRvaGwoYXV4LT5sb2dpY2FsX2Jsa19udW0pOworCXJldHVybiAxOworCitlcnJfb3V0OgorCWlmIChTVHAtPnJlYWRfZXJyb3JfZnJhbWUgPT0gMCkKKwkJU1RwLT5yZWFkX2Vycm9yX2ZyYW1lID0gU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiAtIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXYWl0IGZvciB0aGUgdW5pdCB0byBiZWNvbWUgUmVhZHkKKyAqLworc3RhdGljIGludCBvc3N0X3dhaXRfcmVhZHkoc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsCisJCQkJIHVuc2lnbmVkIHRpbWVvdXQsIGludCBpbml0aWFsX2RlbGF5KQoreworCXVuc2lnbmVkIGNoYXIJCWNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICAgKiBTUnBudDsKKwl1bnNpZ25lZCBsb25nCQlzdGFydHdhaXQgPSBqaWZmaWVzOworI2lmIERFQlVHCisJaW50CQkJZGJnICA9IGRlYnVnZ2luZzsKKwljaGFyICAgIAkgICAgICAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFJlYWNoZWQgb25zdHJlYW0gd2FpdCByZWFkeVxuIiwgbmFtZSk7CisjZW5kaWYKKworCWlmIChpbml0aWFsX2RlbGF5ID4gMCkKKwkJbXNsZWVwKGppZmZpZXNfdG9fbXNlY3MoaW5pdGlhbF9kZWxheSkpOworCisJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJY21kWzBdID0gVEVTVF9VTklUX1JFQURZOworCisJU1JwbnQgPSBvc3N0X2RvX3Njc2koKmFTUnBudCwgU1RwLCBjbWQsIDAsIERNQV9OT05FLCBTVHAtPnRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKwkqYVNScG50ID0gU1JwbnQ7CisJaWYgKCFTUnBudCkgcmV0dXJuICgtRUJVU1kpOworCisJd2hpbGUgKCBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQgJiYgdGltZV9iZWZvcmUoamlmZmllcywgc3RhcnR3YWl0ICsgdGltZW91dCpIWikgJiYKKwkgICAgICAgKCggU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAgPT0gMiAmJiBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEyXSA9PSA0ICAgICYmCisJCSAoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10gPT0gMSB8fCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXSA9PSA4KSAgICApIHx8CisJCSggU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAgPT0gNiAmJiBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEyXSA9PSAweDI4ICYmCisJCSAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10gPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICApKSB7CisjaWYgREVCVUcKKwkgICAgaWYgKGRlYnVnZ2luZykgeworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTbGVlcGluZyBpbiBvbnN0cmVhbSB3YWl0IHJlYWR5XG4iLCBuYW1lKTsKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogVHVybmluZyBvZmYgZGVidWdnaW5nIGZvciBhIHdoaWxlXG4iLCBuYW1lKTsKKwkJZGVidWdnaW5nID0gMDsKKwkgICAgfQorI2VuZGlmCisJICAgIG1zbGVlcCgxMDApOworCisJICAgIG1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCSAgICBjbWRbMF0gPSBURVNUX1VOSVRfUkVBRFk7CisKKwkgICAgU1JwbnQgPSBvc3N0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwgU1RwLT50aW1lb3V0LCBNQVhfUkVUUklFUywgMSk7CisJfQorCSphU1JwbnQgPSBTUnBudDsKKyNpZiBERUJVRworCWRlYnVnZ2luZyA9IGRiZzsKKyNlbmRpZgorCWlmICggU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0ICYmCisJICAgICBvc3N0X3dyaXRlX2Vycm9yX3JlY292ZXJ5KFNUcCwgYVNScG50LCAwKSApIHsKKyNpZiBERUJVRworCSAgICBwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBBYm5vcm1hbCBleGl0IGZyb20gb25zdHJlYW0gd2FpdCByZWFkeVxuIiwgbmFtZSk7CisJICAgIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFJlc3VsdCA9ICVkLCBTZW5zZTogMD0lMDJ4LCAyPSUwMngsIDEyPSUwMngsIDEzPSUwMnhcbiIsIG5hbWUsCisJCQlTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQsIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMF0sIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0sCisJCQlTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEyXSwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10pOworI2VuZGlmCisJICAgIHJldHVybiAoLUVJTyk7CisJfQorI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogTm9ybWFsIGV4aXQgZnJvbSBvbnN0cmVhbSB3YWl0IHJlYWR5XG4iLCBuYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorICogV2FpdCBmb3IgYSB0YXBlIHRvIGJlIGluc2VydGVkIGluIHRoZSB1bml0CisgKi8KK3N0YXRpYyBpbnQgb3NzdF93YWl0X2Zvcl9tZWRpdW0oc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsIHVuc2lnbmVkIHRpbWVvdXQpCit7CisJdW5zaWduZWQgY2hhcgkJY21kW01BWF9DT01NQU5EX1NJWkVdOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgICAqIFNScG50OworCXVuc2lnbmVkIGxvbmcJCXN0YXJ0d2FpdCA9IGppZmZpZXM7CisjaWYgREVCVUcKKwlpbnQJCQlkYmcgPSBkZWJ1Z2dpbmc7CisJY2hhciAgICAJICAgICAgKiBuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBSZWFjaGVkIG9uc3RyZWFtIHdhaXQgZm9yIG1lZGl1bVxuIiwgbmFtZSk7CisjZW5kaWYKKworCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCWNtZFswXSA9IFRFU1RfVU5JVF9SRUFEWTsKKworCVNScG50ID0gb3NzdF9kb19zY3NpKCphU1JwbnQsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwgU1RwLT50aW1lb3V0LCBNQVhfUkVUUklFUywgMSk7CisJKmFTUnBudCA9IFNScG50OworCWlmICghU1JwbnQpIHJldHVybiAoLUVCVVNZKTsKKworCXdoaWxlICggU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0ICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHN0YXJ0d2FpdCArIHRpbWVvdXQqSFopICYmCisJCVNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0gID09IDIgJiYgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxMl0gPT0gMHgzYSAgICAgICAmJgorCSAgICAgICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10gPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgeworI2lmIERFQlVHCisJICAgIGlmIChkZWJ1Z2dpbmcpIHsKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU2xlZXBpbmcgaW4gb25zdHJlYW0gd2FpdCBtZWRpdW1cbiIsIG5hbWUpOworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBUdXJuaW5nIG9mZiBkZWJ1Z2dpbmcgZm9yIGEgd2hpbGVcbiIsIG5hbWUpOworCQlkZWJ1Z2dpbmcgPSAwOworCSAgICB9CisjZW5kaWYKKwkgICAgbXNsZWVwKDEwMCk7CisKKwkgICAgbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJICAgIGNtZFswXSA9IFRFU1RfVU5JVF9SRUFEWTsKKworCSAgICBTUnBudCA9IG9zc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIDAsIERNQV9OT05FLCBTVHAtPnRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKwl9CisJKmFTUnBudCA9IFNScG50OworI2lmIERFQlVHCisJZGVidWdnaW5nID0gZGJnOworI2VuZGlmCisJaWYgKCBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQgICAgICYmIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0gICE9IDIgJiYKKwkgICAgIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTJdICE9IDQgJiYgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10gPT0gMSkgeworI2lmIERFQlVHCisJICAgIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEFibm9ybWFsIGV4aXQgZnJvbSBvbnN0cmVhbSB3YWl0IG1lZGl1bVxuIiwgbmFtZSk7CisJICAgIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFJlc3VsdCA9ICVkLCBTZW5zZTogMD0lMDJ4LCAyPSUwMngsIDEyPSUwMngsIDEzPSUwMnhcbiIsIG5hbWUsCisJCQlTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQsIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMF0sIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0sCisJCQlTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEyXSwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10pOworI2VuZGlmCisJICAgIHJldHVybiAwOworCX0KKyNpZiBERUJVRworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IE5vcm1hbCBleGl0IGZyb20gb25zdHJlYW0gd2FpdCBtZWRpdW1cbiIsIG5hbWUpOworI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgb3NzdF9wb3NpdGlvbl90YXBlX2FuZF9jb25maXJtKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LCBpbnQgZnJhbWUpCit7CisJaW50CXJldHZhbDsKKworCW9zc3Rfd2FpdF9yZWFkeShTVHAsIGFTUnBudCwgMTUgKiA2MCwgMCk7CQkJLyogVE9ETyAtIGNhbiB0aGlzIGNhdGNoIGEgd3JpdGUgZXJyb3I/ICovCisJcmV0dmFsID0gb3NzdF9zZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQsIGZyYW1lLCAwKTsKKwlpZiAocmV0dmFsKSByZXR1cm4gKHJldHZhbCk7CisJb3NzdF93YWl0X3JlYWR5KFNUcCwgYVNScG50LCAxNSAqIDYwLCBPU1NUX1dBSVRfUE9TSVRJT05fQ09NUExFVEUpOworCXJldHVybiAob3NzdF9nZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQpKTsKK30KKworLyoKKyAqIFdhaXQgZm9yIHdyaXRlKHMpIHRvIGNvbXBsZXRlCisgKi8KK3N0YXRpYyBpbnQgb3NzdF9mbHVzaF9kcml2ZV9idWZmZXIoc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQpCit7CisJdW5zaWduZWQgY2hhcgkJY21kW01BWF9DT01NQU5EX1NJWkVdOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgICAqIFNScG50OworCWludAkJCXJlc3VsdCA9IDA7CisJaW50CQkJZGVsYXkgID0gT1NTVF9XQUlUX1dSSVRFX0NPTVBMRVRFOworI2lmIERFQlVHCisJY2hhcgkJICAgICAgKiBuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBSZWFjaGVkIG9uc3RyZWFtIGZsdXNoIGRyaXZlIGJ1ZmZlciAod3JpdGUgZmlsZW1hcmspXG4iLCBuYW1lKTsKKyNlbmRpZgorCisJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJY21kWzBdID0gV1JJVEVfRklMRU1BUktTOworCWNtZFsxXSA9IDE7CisKKwlTUnBudCA9IG9zc3RfZG9fc2NzaSgqYVNScG50LCBTVHAsIGNtZCwgMCwgRE1BX05PTkUsIFNUcC0+dGltZW91dCwgTUFYX1JFVFJJRVMsIDEpOworCSphU1JwbnQgPSBTUnBudDsKKwlpZiAoIVNScG50KSByZXR1cm4gKC1FQlVTWSk7CisJaWYgKFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCkgeworCQlpZiAoKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0gJiAweDBmKSA9PSAyICYmIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTJdID09IDQpIHsKKwkJCWlmIChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXSA9PSA4KSB7CisJCQkJZGVsYXkgPSBPU1NUX1dBSVRfTE9OR19XUklURV9DT01QTEVURTsKKwkJCX0KKwkJfSBlbHNlCisJCQlyZXN1bHQgPSBvc3N0X3dyaXRlX2Vycm9yX3JlY292ZXJ5KFNUcCwgYVNScG50LCAwKTsKKwl9CisJcmVzdWx0IHw9IG9zc3Rfd2FpdF9yZWFkeShTVHAsIGFTUnBudCwgNSAqIDYwLCBkZWxheSk7CisJU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0ucncgPSBPU19XUklUSU5HX0NPTVBMRVRFOworCisJcmV0dXJuIChyZXN1bHQpOworfQorCisjZGVmaW5lIE9TU1RfUE9MTF9QRVJfU0VDIDEwCitzdGF0aWMgaW50IG9zc3Rfd2FpdF9mcmFtZShzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCwgaW50IGN1cnIsIGludCBtaW5sYXN0LCBpbnQgdG8pCit7CisJdW5zaWduZWQgbG9uZwlzdGFydHdhaXQgPSBqaWZmaWVzOworCWNoYXIJICAgICAgKiBuYW1lICAgICAgPSB0YXBlX25hbWUoU1RwKTsKKyNpZiBERUJVRworCWNoYXIJICAgbm90eWV0cHJpbnRlZCAgPSAxOworI2VuZGlmCisJaWYgKG1pbmxhc3QgPj0gMCAmJiBTVHAtPnBzW1NUcC0+cGFydGl0aW9uXS5ydyAhPSBTVF9SRUFESU5HKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOkE6IFdhaXRpbmcgZm9yIGZyYW1lIHdpdGhvdXQgaGF2aW5nIGluaXRpYWxpemVkIHJlYWQhXG4iLCBuYW1lKTsKKworCXdoaWxlICh0aW1lX2JlZm9yZSAoamlmZmllcywgc3RhcnR3YWl0ICsgdG8qSFopKQorCXsgCisJCWludCByZXN1bHQ7CisJCXJlc3VsdCA9IG9zc3RfZ2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50KTsKKwkJaWYgKHJlc3VsdCA9PSAtRUlPKQorCQkJaWYgKChyZXN1bHQgPSBvc3N0X3dyaXRlX2Vycm9yX3JlY292ZXJ5KFNUcCwgYVNScG50LCAwKSkgPT0gMCkKKwkJCQlyZXR1cm4gMDsJLyogc3VjY2Vzc2Z1bCByZWNvdmVyeSBsZWF2ZXMgZHJpdmUgcmVhZHkgZm9yIGZyYW1lICovCisJCWlmIChyZXN1bHQgPCAwKSBicmVhazsKKwkJaWYgKFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24gPT0gY3VyciAmJgorCQkgICAgKChtaW5sYXN0IDwgMCAmJgorCQkgICAgICAoc2lnbmVkKVNUcC0+bGFzdF9mcmFtZV9wb3NpdGlvbiA+IChzaWduZWQpY3VyciArIG1pbmxhc3QpIHx8CisJCSAgICAgKG1pbmxhc3QgPj0gMCAmJiBTVHAtPmN1cl9mcmFtZXMgPiBtaW5sYXN0KQorCQkgICAgKSAmJiByZXN1bHQgPj0gMCkKKwkJeworI2lmIERFQlVHCQkJCisJCQlpZiAoZGVidWdnaW5nIHx8IGppZmZpZXMgLSBzdGFydHdhaXQgPj0gMipIWi9PU1NUX1BPTExfUEVSX1NFQykKKwkJCQlwcmludGsgKE9TU1RfREVCX01TRworCQkJCQkiJXM6RDogU3VjYyB3YWl0IGYgZnIgJWkgKD4laSk6ICVpLSVpICVpICglaSk6ICUzbGkuJWxpIHNcbiIsCisJCQkJCW5hbWUsIGN1cnIsIGN1cnIrbWlubGFzdCwgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiwKKwkJCQkJU1RwLT5sYXN0X2ZyYW1lX3Bvc2l0aW9uLCBTVHAtPmN1cl9mcmFtZXMsCisJCQkJCXJlc3VsdCwgKGppZmZpZXMtc3RhcnR3YWl0KS9IWiwgCisJCQkJCSgoKGppZmZpZXMtc3RhcnR3YWl0KSVIWikqMTApL0haKTsKKyNlbmRpZgorCQkJcmV0dXJuIDA7CisJCX0KKyNpZiBERUJVRworCQlpZiAoamlmZmllcyAtIHN0YXJ0d2FpdCA+PSAyKkhaL09TU1RfUE9MTF9QRVJfU0VDICYmIG5vdHlldHByaW50ZWQpCisJCXsKKwkJCXByaW50ayAoT1NTVF9ERUJfTVNHICIlczpEOiBXYWl0IGZvciBmcmFtZSAlaSAoPiVpKTogJWktJWkgJWkgKCVpKVxuIiwKKwkJCQluYW1lLCBjdXJyLCBjdXJyK21pbmxhc3QsIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24sCisJCQkJU1RwLT5sYXN0X2ZyYW1lX3Bvc2l0aW9uLCBTVHAtPmN1cl9mcmFtZXMsIHJlc3VsdCk7CisJCQlub3R5ZXRwcmludGVkLS07CisJCX0KKyNlbmRpZgorCQltc2xlZXAoMTAwMCAvIE9TU1RfUE9MTF9QRVJfU0VDKTsKKwl9CisjaWYgREVCVUcKKwlwcmludGsgKE9TU1RfREVCX01TRyAiJXM6RDogRmFpbCB3YWl0IGYgZnIgJWkgKD4laSk6ICVpLSVpICVpOiAlM2xpLiVsaSBzXG4iLAorCQluYW1lLCBjdXJyLCBjdXJyK21pbmxhc3QsIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24sCisJCVNUcC0+bGFzdF9mcmFtZV9wb3NpdGlvbiwgU1RwLT5jdXJfZnJhbWVzLAorCQkoamlmZmllcy1zdGFydHdhaXQpL0haLCAoKChqaWZmaWVzLXN0YXJ0d2FpdCklSFopKjEwKS9IWik7CisjZW5kaWYJCisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBvc3N0X3JlY292ZXJfd2FpdF9mcmFtZShzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCwgaW50IHdyaXRpbmcpCit7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAgICogU1JwbnQ7CisJdW5zaWduZWQgY2hhcgkJY21kW01BWF9DT01NQU5EX1NJWkVdOworCXVuc2lnbmVkIGxvbmcgICAJc3RhcnR3YWl0ID0gamlmZmllczsKKwlpbnQJCQlyZXR2YWwgICAgPSAxOworICAgICAgICBjaGFyCQkgICAgICAqIG5hbWUgICAgICA9IHRhcGVfbmFtZShTVHApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlpZiAod3JpdGluZykgeworCQljaGFyCW15YnVmWzI0XTsKKwkJY2hhciAgKiBvbGRkYXRhID0gU1RwLT5idWZmZXItPmJfZGF0YTsKKwkJaW50CW9sZHNpemUgPSBTVHAtPmJ1ZmZlci0+YnVmZmVyX3NpemU7CisKKwkJLyogd3JpdGUgemVybyBmbSB0aGVuIHJlYWQgcG9zIC0gaWYgc2hvd3Mgd3JpdGUgZXJyb3IsIHRyeSB0byByZWNvdmVyIC0gaWYgbm8gcHJvZ3Jlc3MsIHdhaXQgKi8KKworCQltZW1zZXQoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwkJY21kWzBdID0gV1JJVEVfRklMRU1BUktTOworCQljbWRbMV0gPSAxOworCQlTUnBudCA9IG9zc3RfZG9fc2NzaSgqYVNScG50LCBTVHAsIGNtZCwgMCwgRE1BX05PTkUsIFNUcC0+dGltZW91dCwKKwkJCQkJCQkJTUFYX1JFVFJJRVMsIDEpOworCisJCXdoaWxlIChyZXR2YWwgJiYgdGltZV9iZWZvcmUgKGppZmZpZXMsIHN0YXJ0d2FpdCArIDUqNjAqSFopKSB7CisKKwkJCWlmIChTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQgJiYgKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0gJiAweDBmKSAhPSAyKSB7CisKKwkJCQkvKiBzb21lIGZhaWx1cmUgLSBub3QganVzdCBub3QtcmVhZHkgKi8KKwkJCQlyZXR2YWwgPSBvc3N0X3dyaXRlX2Vycm9yX3JlY292ZXJ5KFNUcCwgYVNScG50LCAwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0IChIWiAvIE9TU1RfUE9MTF9QRVJfU0VDKTsKKworCQkJU1RwLT5idWZmZXItPmJfZGF0YSA9IG15YnVmOyBTVHAtPmJ1ZmZlci0+YnVmZmVyX3NpemUgPSAyNDsKKwkJCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCQkJY21kWzBdID0gUkVBRF9QT1NJVElPTjsKKworCQkJU1JwbnQgPSBvc3N0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCAyMCwgRE1BX0ZST01fREVWSUNFLCBTVHAtPnRpbWVvdXQsCisJCQkJCQkJCQkJTUFYX1JFVFJJRVMsIDEpOworCisJCQlyZXR2YWwgPSAoIFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCB8fCAoU1RwLT5idWZmZXIpLT5iX2RhdGFbMTVdID4gMjUgKTsKKwkJCVNUcC0+YnVmZmVyLT5iX2RhdGEgPSBvbGRkYXRhOyBTVHAtPmJ1ZmZlci0+YnVmZmVyX3NpemUgPSBvbGRzaXplOworCQl9CisJCWlmIChyZXR2YWwpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOkU6IERldmljZSBkaWQgbm90IHN1Y2NlZWQgdG8gd3JpdGUgYnVmZmVyZWQgZGF0YVxuIiwgbmFtZSk7CisJfSBlbHNlCisJCS8qIFRPRE8gLSBmaWd1cmUgb3V0IHdoaWNoIGVycm9yIGNvbmRpdGlvbnMgY2FuIGJlIGhhbmRsZWQgKi8KKwkJaWYgKFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkiJXM6VzogUmVjb3Zlcl93YWl0X2ZyYW1lKHJlYWQpIGNhbm5vdCBoYW5kbGUgJTAyeDolMDJ4OiUwMnhcbiIsIG5hbWUsCisJCQkJCSgqYVNScG50KS0+c3Jfc2Vuc2VfYnVmZmVyWyAyXSAmIDB4MGYsCisJCQkJCSgqYVNScG50KS0+c3Jfc2Vuc2VfYnVmZmVyWzEyXSwKKwkJCQkJKCphU1JwbnQpLT5zcl9zZW5zZV9idWZmZXJbMTNdKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBuZXh0IE9uU3RyZWFtIHRhcGUgZnJhbWUgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24KKyAqLworc3RhdGljIGludCBvc3N0X3JlYWRfZnJhbWUoc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsIGludCB0aW1lb3V0KQoreworCXVuc2lnbmVkIGNoYXIJCWNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICAgKiBTUnBudDsKKwlpbnQJCQlyZXR2YWwgPSAwOworI2lmIERFQlVHCisJb3NfYXV4X3QJICAgICAgKiBhdXggICAgPSBTVHAtPmJ1ZmZlci0+YXV4OworCWNoYXIJCSAgICAgICogbmFtZSAgID0gdGFwZV9uYW1lKFNUcCk7CisjZW5kaWYKKworCWlmIChTVHAtPnBvbGwpCisJCWlmIChvc3N0X3dhaXRfZnJhbWUgKFNUcCwgYVNScG50LCBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uLCAwLCB0aW1lb3V0KSkKKwkJCXJldHZhbCA9IG9zc3RfcmVjb3Zlcl93YWl0X2ZyYW1lKFNUcCwgYVNScG50LCAwKTsKKworCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCWNtZFswXSA9IFJFQURfNjsKKwljbWRbMV0gPSAxOworCWNtZFs0XSA9IDE7CisKKyNpZiBERUJVRworCWlmIChkZWJ1Z2dpbmcpCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFJlYWRpbmcgZnJhbWUgZnJvbSBPblN0cmVhbSB0YXBlXG4iLCBuYW1lKTsKKyNlbmRpZgorCVNScG50ID0gb3NzdF9kb19zY3NpKCphU1JwbnQsIFNUcCwgY21kLCBPU19GUkFNRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UsCisJCQkJICAgICAgU1RwLT50aW1lb3V0LCBNQVhfUkVUUklFUywgMSk7CisJKmFTUnBudCA9IFNScG50OworCWlmICghU1JwbnQpCisJCXJldHVybiAoLUVCVVNZKTsKKworCWlmICgoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCkgeworCSAgICByZXR2YWwgPSAxOworCSAgICBpZiAoU1RwLT5yZWFkX2Vycm9yX2ZyYW1lID09IDApIHsKKwkJU1RwLT5yZWFkX2Vycm9yX2ZyYW1lID0gU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbjsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBSZWNvcmRpbmcgcmVhZCBlcnJvciBhdCAlZFxuIiwgbmFtZSwgU1RwLT5yZWFkX2Vycm9yX2ZyYW1lKTsKKyNlbmRpZgorCSAgICB9CisjaWYgREVCVUcKKwkgICAgaWYgKGRlYnVnZ2luZykKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU2Vuc2U6ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnhcbiIsCisJCSAgIG5hbWUsCisJCSAgIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMF0sIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMV0sCisJCSAgIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0sIFNScG50LT5zcl9zZW5zZV9idWZmZXJbM10sCisJCSAgIFNScG50LT5zcl9zZW5zZV9idWZmZXJbNF0sIFNScG50LT5zcl9zZW5zZV9idWZmZXJbNV0sCisJCSAgIFNScG50LT5zcl9zZW5zZV9idWZmZXJbNl0sIFNScG50LT5zcl9zZW5zZV9idWZmZXJbN10pOworI2VuZGlmCisJfQorCWVsc2UKKwkgICAgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbisrOworI2lmIERFQlVHCisJaWYgKGRlYnVnZ2luZykgeworCSAgIGNoYXIgc2lnWzhdOyBpbnQgaTsKKwkgICBmb3IgKGk9MDtpPDQ7aSsrKQorCQkgICBzaWdbaV0gPSBhdXgtPmFwcGxpY2F0aW9uX3NpZ1tpXTwzMj8nXic6YXV4LT5hcHBsaWNhdGlvbl9zaWdbaV07CisJICAgc2lnWzRdID0gJ1wwJzsKKwkgICBwcmludGsoT1NTVF9ERUJfTVNHIAorCQkiJXM6RDogQVVYOiAlcyBVcGRGckN0IyVkIFdwYXNzIyVkICVzIEZyU2VxIyVkIExvZ0JsayMlZCBRdHk9JWQgU3o9JWRcbiIsIG5hbWUsIHNpZywKKwkJCW50b2hsKGF1eC0+dXBkYXRlX2ZyYW1lX2NudHIpLCBudG9ocyhhdXgtPnBhcnRpdGlvbi53cnRfcGFzc19jbnRyKSwKKwkJCWF1eC0+ZnJhbWVfdHlwZT09MT8iRU9EIjphdXgtPmZyYW1lX3R5cGU9PTI/Ik1BUksiOgorCQkJYXV4LT5mcmFtZV90eXBlPT04PyJIRUFEUiI6YXV4LT5mcmFtZV90eXBlPT0weDgwPyJEQVRBIjoiRklMTCIsIAorCQkJbnRvaGwoYXV4LT5mcmFtZV9zZXFfbnVtKSwgbnRvaGwoYXV4LT5sb2dpY2FsX2Jsa19udW0pLAorCQkJbnRvaHMoYXV4LT5kYXQuZGF0X2xpc3RbMF0uYmxrX2NudCksIG50b2hsKGF1eC0+ZGF0LmRhdF9saXN0WzBdLmJsa19zeikgKTsKKwkgICBpZiAoYXV4LT5mcmFtZV90eXBlPT0yKQorCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBtYXJrX2NudD0lZCwgbGFzdF9tYXJrX3Bwb3M9JWQsIGxhc3RfbWFya19sYm49JWRcbiIsIG5hbWUsCisJCQludG9obChhdXgtPmZpbGVtYXJrX2NudCksIG50b2hsKGF1eC0+bGFzdF9tYXJrX3Bwb3MpLCBudG9obChhdXgtPmxhc3RfbWFya19sYm4pKTsKKwkgICBwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBFeGl0IHJlYWQgZnJhbWUgZnJvbSBPblN0cmVhbSB0YXBlIHdpdGggY29kZSAlZFxuIiwgbmFtZSwgcmV0dmFsKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gKHJldHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgb3NzdF9pbml0aWF0ZV9yZWFkKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50KQoreworCXN0cnVjdCBzdF9wYXJ0c3RhdCAgICAqIFNUcHMgICA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgICAqIFNScG50ICA7CisJdW5zaWduZWQgY2hhcgkJY21kW01BWF9DT01NQU5EX1NJWkVdOworCWludAkJCXJldHZhbCA9IDA7CisJY2hhcgkJICAgICAgKiBuYW1lICAgPSB0YXBlX25hbWUoU1RwKTsKKworCWlmIChTVHBzLT5ydyAhPSBTVF9SRUFESU5HKSB7ICAgICAgICAgLyogSW5pdGlhbGl6ZSByZWFkIG9wZXJhdGlvbiAqLworCQlpZiAoU1Rwcy0+cncgPT0gU1RfV1JJVElORyB8fCBTVHAtPmRpcnR5KSB7CisJCQlTVHAtPndyaXRlX3R5cGUgPSBPU19XUklURV9EQVRBOworICAgICAgICAgICAgICAgICAgICAgICAgb3NzdF9mbHVzaF93cml0ZV9idWZmZXIoU1RwLCBhU1JwbnQpOworCQkJb3NzdF9mbHVzaF9kcml2ZV9idWZmZXIoU1RwLCBhU1JwbnQpOworCQl9CisJCVNUcHMtPnJ3ID0gU1RfUkVBRElORzsKKwkJU1RwLT5mcmFtZV9pbl9idWZmZXIgPSAwOworCisJCS8qCisJCSAqICAgICAgSXNzdWUgYSByZWFkIDAgY29tbWFuZCB0byBnZXQgdGhlIE9uU3RyZWFtIGRyaXZlCisgICAgICAgICAgICAgICAgICogICAgICByZWFkIGZyYW1lcyBpbnRvIGl0cyBidWZmZXIuCisJCSAqLworCQltZW1zZXQoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwkJY21kWzBdID0gUkVBRF82OworCQljbWRbMV0gPSAxOworCisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU3RhcnQgUmVhZCBBaGVhZCBvbiBPblN0cmVhbSB0YXBlXG4iLCBuYW1lKTsKKyNlbmRpZgorCQlTUnBudCAgID0gb3NzdF9kb19zY3NpKCphU1JwbnQsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwgU1RwLT50aW1lb3V0LCBNQVhfUkVUUklFUywgMSk7CisJCSphU1JwbnQgPSBTUnBudDsKKwkJaWYgKChyZXR2YWwgPSBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6VzogRXJyb3Igc3RhcnRpbmcgcmVhZCBhaGVhZFxuIiwgbmFtZSk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBvc3N0X2dldF9sb2dpY2FsX2ZyYW1lKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LAorCQkJCQkJaW50IGZyYW1lX3NlcV9udW1iZXIsIGludCBxdWlldCkKK3sKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgKiBTVHBzICA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCWNoYXIJCSAgICogbmFtZSAgPSB0YXBlX25hbWUoU1RwKTsKKwlpbnQJCSAgICAgY250ICAgPSAwLAorCQkJICAgICBiYWQgICA9IDAsCisJCQkgICAgIHBhc3QgID0gMCwKKwkJCSAgICAgeCwKKwkJCSAgICAgcG9zaXRpb247CisKKwkvKgorCSAqIElmIHdlIHdhbnQganVzdCBhbnkgZnJhbWUgKC0xKSBhbmQgdGhlcmUgaXMgYSBmcmFtZSBpbiB0aGUgYnVmZmVyLCByZXR1cm4gaXQKKwkgKi8KKwlpZiAoZnJhbWVfc2VxX251bWJlciA9PSAtMSAmJiBTVHAtPmZyYW1lX2luX2J1ZmZlcikgeworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEZyYW1lICVkIHN0aWxsIGluIGJ1ZmZlclxuIiwgbmFtZSwgU1RwLT5mcmFtZV9zZXFfbnVtYmVyKTsKKyNlbmRpZgorCQlyZXR1cm4gKFNUcHMtPmVvZik7CisJfQorCS8qCisgICAgICAgICAqIFNlYXJjaCBhbmQgd2FpdCBmb3IgdGhlIG5leHQgbG9naWNhbCB0YXBlIGZyYW1lCisJICovCisJd2hpbGUgKDEpIHsKKwkJaWYgKGNudCsrID4gNDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOkU6IENvdWxkbid0IGZpbmQgbG9naWNhbCBmcmFtZSAlZCwgYWJvcnRpbmdcbiIsCisJCQkJCSAgICBuYW1lLCBmcmFtZV9zZXFfbnVtYmVyKTsKKwkJCWlmIChTVHAtPnJlYWRfZXJyb3JfZnJhbWUpIHsKKwkJCQlvc3N0X3NldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCwgU1RwLT5yZWFkX2Vycm9yX2ZyYW1lLCAwKTsKKyNpZiBERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFJlcG9zaXRpb25pbmcgdGFwZSB0byBiYWQgZnJhbWUgJWRcbiIsCisJCQkJCQkgICAgbmFtZSwgU1RwLT5yZWFkX2Vycm9yX2ZyYW1lKTsKKyNlbmRpZgorCQkJCVNUcC0+cmVhZF9lcnJvcl9mcmFtZSA9IDA7CisJCQkJU1RwLT5hYm9ydF9jb3VudCsrOworCQkJfQorCQkJcmV0dXJuICgtRUlPKTsKKwkJfQorI2lmIERFQlVHCisJCWlmIChkZWJ1Z2dpbmcpCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBMb29raW5nIGZvciBmcmFtZSAlZCwgYXR0ZW1wdCAlZFxuIiwKKwkJCQkJICBuYW1lLCBmcmFtZV9zZXFfbnVtYmVyLCBjbnQpOworI2VuZGlmCisJCWlmICggb3NzdF9pbml0aWF0ZV9yZWFkKFNUcCwgYVNScG50KQorICAgICAgICAgICAgICAgIHx8ICggKCFTVHAtPmZyYW1lX2luX2J1ZmZlcikgJiYgb3NzdF9yZWFkX2ZyYW1lKFNUcCwgYVNScG50LCAzMCkgKSApIHsKKwkJCWlmIChTVHAtPnJhdykKKwkJCQlyZXR1cm4gKC1FSU8pOworCQkJcG9zaXRpb24gPSBvc3N0X2dldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCk7CisJCQlpZiAocG9zaXRpb24gPj0gMHhiYWUgJiYgcG9zaXRpb24gPCAweGJiOCkKKwkJCQlwb3NpdGlvbiA9IDB4YmI4OworCQkJZWxzZSBpZiAocG9zaXRpb24gPiBTVHAtPmVvZF9mcmFtZV9wcG9zIHx8ICsrYmFkID09IDEwKSB7CisJCQkJcG9zaXRpb24gPSBTVHAtPnJlYWRfZXJyb3JfZnJhbWUgLSAxOworCQkJCWJhZCA9IDA7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwb3NpdGlvbiArPSAyOTsKKwkJCQljbnQgICAgICArPSAxOTsKKwkJCX0KKyNpZiBERUJVRworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQmFkIGZyYW1lIGRldGVjdGVkLCBwb3NpdGlvbmluZyB0YXBlIHRvIGJsb2NrICVkXG4iLAorCQkJCQkgbmFtZSwgcG9zaXRpb24pOworI2VuZGlmCisJCQlvc3N0X3NldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCwgcG9zaXRpb24sIDApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG9zc3RfdmVyaWZ5X2ZyYW1lKFNUcCwgZnJhbWVfc2VxX251bWJlciwgcXVpZXQpKQorCQkJYnJlYWs7CisJCWlmIChvc3N0X3ZlcmlmeV9mcmFtZShTVHAsIC0xLCBxdWlldCkpIHsKKwkJCXggPSBudG9obChTVHAtPmJ1ZmZlci0+YXV4LT5mcmFtZV9zZXFfbnVtKTsKKwkJCWlmIChTVHAtPmZhc3Rfb3BlbikgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgIiVzOlc6IEZvdW5kIGxvZ2ljYWwgZnJhbWUgJWQgaW5zdGVhZCBvZiAlZCBhZnRlciBmYXN0IG9wZW5cbiIsCisJCQkJICAgICAgIG5hbWUsIHgsIGZyYW1lX3NlcV9udW1iZXIpOworCQkJCVNUcC0+aGVhZGVyX29rID0gMDsKKwkJCQlTVHAtPnJlYWRfZXJyb3JfZnJhbWUgPSAwOworCQkJCXJldHVybiAoLUVJTyk7CisJCQl9CisJCQlpZiAoeCA+IGZyYW1lX3NlcV9udW1iZXIpIHsKKwkJCQlpZiAoKytwYXN0ID4gMykgeworCQkJCQkvKiBwb3NpdGlvbmluZyBiYWNrd2FyZHMgZGlkIG5vdCBicmluZyB1cyB0byB0aGUgZGVzaXJlZCBmcmFtZSAqLworCQkJCQlwb3NpdGlvbiA9IFNUcC0+cmVhZF9lcnJvcl9mcmFtZSAtIDE7CisJCQkJfQorCQkJCWVsc2UgeworCQkJICAgICAgICAJcG9zaXRpb24gPSBvc3N0X2dldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCkKKwkJCQkJICAgICAgICAgKyBmcmFtZV9zZXFfbnVtYmVyIC0geCAtIDE7CisKKwkJCQkJaWYgKFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24gPj0gMzAwMCAmJiBwb3NpdGlvbiA8IDMwMDApCisJCQkJCQlwb3NpdGlvbiAtPSAxMDsKKwkJCQl9CisjaWYgREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKE9TU1RfREVCX01TRworCQkJCSAgICAgICAiJXM6RDogRm91bmQgbG9naWNhbCBmcmFtZSAlZCB3aGlsZSBsb29raW5nIGZvciAlZDogYmFjayB1cCAlZFxuIiwKKwkJCQkJCW5hbWUsIHgsIGZyYW1lX3NlcV9udW1iZXIsCisJCQkJCSAgICAgICAJU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiAtIHBvc2l0aW9uKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgCW9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50LCBwb3NpdGlvbiwgMCk7CisJCQkJY250ICs9IDEwOworCQkJfQorCQkJZWxzZQorCQkJCXBhc3QgPSAwOworCQl9CisJCWlmIChvc3N0X2dldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCkgPT0gMHhiYWYpIHsKKyNpZiBERUJVRworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU2tpcHBpbmcgY29uZmlnIHBhcnRpdGlvblxuIiwgbmFtZSk7CisjZW5kaWYKKwkJCW9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50LCAweGJiOCwgMCk7CisJCQljbnQtLTsKKwkJfQorCQlTVHAtPmZyYW1lX2luX2J1ZmZlciA9IDA7CisJfQorCWlmIChjbnQgPiAxKSB7CisJCVNUcC0+cmVjb3Zlcl9jb3VudCsrOworCQlTVHAtPnJlY292ZXJfZXJyZWcrKzsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6STogRG9uJ3Qgd29ycnksIFJlYWQgZXJyb3IgYXQgcG9zaXRpb24gJWQgcmVjb3ZlcmVkXG4iLCAKKwkJCQkJbmFtZSwgU1RwLT5yZWFkX2Vycm9yX2ZyYW1lKTsKKyAJfQorCVNUcC0+cmVhZF9jb3VudCsrOworCisjaWYgREVCVUcKKwlpZiAoZGVidWdnaW5nIHx8IFNUcHMtPmVvZikKKwkJcHJpbnRrKE9TU1RfREVCX01TRworCQkJIiVzOkQ6IEV4aXQgZ2V0IGxvZ2ljYWwgZnJhbWUgKCVkPT4lZCkgZnJvbSBPblN0cmVhbSB0YXBlIHdpdGggY29kZSAlZFxuIiwKKwkJCW5hbWUsIGZyYW1lX3NlcV9udW1iZXIsIFNUcC0+ZnJhbWVfc2VxX251bWJlciwgU1Rwcy0+ZW9mKTsKKyNlbmRpZgorCVNUcC0+ZmFzdF9vcGVuID0gMDsKKwlTVHAtPnJlYWRfZXJyb3JfZnJhbWUgPSAwOworCXJldHVybiAoU1Rwcy0+ZW9mKTsKK30KKworc3RhdGljIGludCBvc3N0X3NlZWtfbG9naWNhbF9ibGsoc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsIGludCBsb2dpY2FsX2Jsa19udW0pCit7CisgICAgICAgIHN0cnVjdCBzdF9wYXJ0c3RhdCAqIFNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKKwljaGFyCQkgICAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKwlpbnQJcmV0cmllcyAgICA9IDA7CisJaW50CWZyYW1lX3NlcV9lc3RpbWF0ZSwgcHBvc19lc3RpbWF0ZSwgbW92ZTsKKwkKKwlpZiAobG9naWNhbF9ibGtfbnVtIDwgMCkgbG9naWNhbF9ibGtfbnVtID0gMDsKKyNpZiBERUJVRworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFNlZWtpbmcgbG9naWNhbCBibG9jayAlZCAobm93IGF0ICVkLCBzaXplICVkJWMpXG4iLAorCQkJCW5hbWUsIGxvZ2ljYWxfYmxrX251bSwgU1RwLT5sb2dpY2FsX2Jsa19udW0sIAorCQkJCVNUcC0+YmxvY2tfc2l6ZTwxMDI0P1NUcC0+YmxvY2tfc2l6ZTpTVHAtPmJsb2NrX3NpemUvMTAyNCwKKwkJCQlTVHAtPmJsb2NrX3NpemU8MTAyND8nYic6J2snKTsKKyNlbmRpZgorCS8qIERvIHdlIGtub3cgd2hlcmUgd2UgYXJlPyAqLworCWlmIChTVHBzLT5kcnZfYmxvY2sgPj0gMCkgeworCQltb3ZlICAgICAgICAgICAgICAgID0gbG9naWNhbF9ibGtfbnVtIC0gU1RwLT5sb2dpY2FsX2Jsa19udW07CisJCWlmIChtb3ZlIDwgMCkgbW92ZSAtPSAoT1NfREFUQV9TSVpFIC8gU1RwLT5ibG9ja19zaXplKSAtIDE7CisJCW1vdmUgICAgICAgICAgICAgICAvPSAoT1NfREFUQV9TSVpFIC8gU1RwLT5ibG9ja19zaXplKTsKKwkJZnJhbWVfc2VxX2VzdGltYXRlICA9IFNUcC0+ZnJhbWVfc2VxX251bWJlciArIG1vdmU7CisJfSBlbHNlCisJCWZyYW1lX3NlcV9lc3RpbWF0ZSAgPSBsb2dpY2FsX2Jsa19udW0gKiBTVHAtPmJsb2NrX3NpemUgLyBPU19EQVRBX1NJWkU7CisKKwlpZiAoZnJhbWVfc2VxX2VzdGltYXRlIDwgMjk4MCkgcHBvc19lc3RpbWF0ZSA9IGZyYW1lX3NlcV9lc3RpbWF0ZSArIDEwOworCWVsc2UJCQkgICAgICAgcHBvc19lc3RpbWF0ZSA9IGZyYW1lX3NlcV9lc3RpbWF0ZSArIDIwOworCXdoaWxlICgrK3JldHJpZXMgPCAxMCkgeworCSAgIGlmIChwcG9zX2VzdGltYXRlID4gU1RwLT5lb2RfZnJhbWVfcHBvcy0yKSB7CisJICAgICAgIGZyYW1lX3NlcV9lc3RpbWF0ZSArPSBTVHAtPmVvZF9mcmFtZV9wcG9zIC0gMiAtIHBwb3NfZXN0aW1hdGU7CisJICAgICAgIHBwb3NfZXN0aW1hdGUgICAgICAgPSBTVHAtPmVvZF9mcmFtZV9wcG9zIC0gMjsKKwkgICB9CisJICAgaWYgKGZyYW1lX3NlcV9lc3RpbWF0ZSA8IDApIHsKKwkgICAgICAgZnJhbWVfc2VxX2VzdGltYXRlID0gMDsKKwkgICAgICAgcHBvc19lc3RpbWF0ZSAgICAgID0gMTA7CisJICAgfQorCSAgIG9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50LCBwcG9zX2VzdGltYXRlLCAwKTsKKwkgICBpZiAob3NzdF9nZXRfbG9naWNhbF9mcmFtZShTVHAsIGFTUnBudCwgZnJhbWVfc2VxX2VzdGltYXRlLCAxKSA+PSAwKSB7CisJICAgICAgLyogd2UndmUgbG9jYXRlZCB0aGUgZXN0aW1hdGVkIGZyYW1lLCBub3cgZG9lcyBpdCBoYXZlIG91ciBibG9jaz8gKi8KKwkgICAgICBpZiAobG9naWNhbF9ibGtfbnVtIDwgIFNUcC0+bG9naWNhbF9ibGtfbnVtIHx8CisJICAgICAgICAgIGxvZ2ljYWxfYmxrX251bSA+PSBTVHAtPmxvZ2ljYWxfYmxrX251bSArIG50b2hzKFNUcC0+YnVmZmVyLT5hdXgtPmRhdC5kYXRfbGlzdFswXS5ibGtfY250KSkgeworCQkgaWYgKFNUcHMtPmVvZiA9PSBTVF9GTV9ISVQpCisJCSAgICBtb3ZlID0gbG9naWNhbF9ibGtfbnVtIDwgU1RwLT5sb2dpY2FsX2Jsa19udW0/IC0yIDogMTsKKwkJIGVsc2UgeworCQkgICAgbW92ZSAgICAgICAgICAgICAgICA9IGxvZ2ljYWxfYmxrX251bSAtIFNUcC0+bG9naWNhbF9ibGtfbnVtOworCQkgICAgaWYgKG1vdmUgPCAwKSBtb3ZlIC09IChPU19EQVRBX1NJWkUgLyBTVHAtPmJsb2NrX3NpemUpIC0gMTsKKwkJICAgIG1vdmUgICAgICAgICAgICAgICAvPSAoT1NfREFUQV9TSVpFIC8gU1RwLT5ibG9ja19zaXplKTsKKwkJIH0KKwkJIGlmICghbW92ZSkgbW92ZSA9IGxvZ2ljYWxfYmxrX251bSA+IFNUcC0+bG9naWNhbF9ibGtfbnVtID8gMSA6IC0xOworI2lmIERFQlVHCisJCSBwcmludGsoT1NTVF9ERUJfTVNHCisJCQkiJXM6RDogU2VlayByZXRyeSAlZCBhdCBwcG9zICVkIGZzcSAlZCAoZXN0ICVkKSBsYm4gJWQgKG5lZWQgJWQpIG1vdmUgJWRcbiIsCisJCQkJbmFtZSwgcmV0cmllcywgcHBvc19lc3RpbWF0ZSwgU1RwLT5mcmFtZV9zZXFfbnVtYmVyLCBmcmFtZV9zZXFfZXN0aW1hdGUsIAorCQkJCVNUcC0+bG9naWNhbF9ibGtfbnVtLCBsb2dpY2FsX2Jsa19udW0sIG1vdmUpOworI2VuZGlmCisJCSBmcmFtZV9zZXFfZXN0aW1hdGUgKz0gbW92ZTsKKwkJIHBwb3NfZXN0aW1hdGUgICAgICArPSBtb3ZlOworCQkgY29udGludWU7CisJICAgICAgfSBlbHNlIHsKKwkJIFNUcC0+YnVmZmVyLT5yZWFkX3BvaW50ZXIgID0gKGxvZ2ljYWxfYmxrX251bSAtIFNUcC0+bG9naWNhbF9ibGtfbnVtKSAqIFNUcC0+YmxvY2tfc2l6ZTsKKwkJIFNUcC0+YnVmZmVyLT5idWZmZXJfYnl0ZXMgLT0gU1RwLT5idWZmZXItPnJlYWRfcG9pbnRlcjsKKwkJIFNUcC0+bG9naWNhbF9ibGtfbnVtICAgICAgID0gIGxvZ2ljYWxfYmxrX251bTsKKyNpZiBERUJVRworCQkgcHJpbnRrKE9TU1RfREVCX01TRyAKKwkJCSIlczpEOiBTZWVrIHN1Y2Nlc3MgYXQgcHBvcyAlZCBmc3EgJWQgaW5fYnVmICVkLCBieXRlcyAlZCwgcHRyICVkKiVkXG4iLAorCQkJCW5hbWUsIHBwb3NfZXN0aW1hdGUsIFNUcC0+ZnJhbWVfc2VxX251bWJlciwgU1RwLT5mcmFtZV9pbl9idWZmZXIsIAorCQkJCVNUcC0+YnVmZmVyLT5idWZmZXJfYnl0ZXMsIFNUcC0+YnVmZmVyLT5yZWFkX3BvaW50ZXIgLyBTVHAtPmJsb2NrX3NpemUsIAorCQkJCVNUcC0+YmxvY2tfc2l6ZSk7CisjZW5kaWYKKwkJIFNUcHMtPmRydl9maWxlID0gbnRvaGwoU1RwLT5idWZmZXItPmF1eC0+ZmlsZW1hcmtfY250KTsKKwkJIGlmIChTVHBzLT5lb2YgPT0gU1RfRk1fSElUKSB7CisJCSAgICAgU1Rwcy0+ZHJ2X2ZpbGUrKzsKKwkJICAgICBTVHBzLT5kcnZfYmxvY2sgPSAwOworCQkgfSBlbHNlIHsKKwkJICAgICBTVHBzLT5kcnZfYmxvY2sgPSBudG9obChTVHAtPmJ1ZmZlci0+YXV4LT5sYXN0X21hcmtfbGJuKT8KKwkJCQkJICBTVHAtPmxvZ2ljYWxfYmxrX251bSAtCisJCQkJCSAgICAgKFNUcHMtPmRydl9maWxlID8gbnRvaGwoU1RwLT5idWZmZXItPmF1eC0+bGFzdF9tYXJrX2xibikgKyAxIDogMCk6CisJCQkJCS0xOworCQkgfQorCQkgU1Rwcy0+ZW9mID0gKFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24gPj0gU1RwLT5lb2RfZnJhbWVfcHBvcyk/U1RfRU9EOlNUX05PRU9GOworCQkgcmV0dXJuIDA7CisJICAgICAgfQorCSAgIH0KKwkgICBpZiAob3NzdF9nZXRfbG9naWNhbF9mcmFtZShTVHAsIGFTUnBudCwgLTEsIDEpIDwgMCkKKwkgICAgICBnb3RvIGVycm9yOworCSAgIC8qIHdlIGFyZSBub3QgeWV0IGF0IHRoZSBlc3RpbWF0ZWQgZnJhbWUsIGFkanVzdCBvdXIgZXN0aW1hdGUgb2YgaXRzIHBoeXNpY2FsIHBvc2l0aW9uICovCisjaWYgREVCVUcKKwkgICBwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTZWVrIHJldHJ5ICVkIGF0IHBwb3MgJWQgZnNxICVkIChlc3QgJWQpIGxibiAlZCAobmVlZCAlZClcbiIsIAorCQkJICAgbmFtZSwgcmV0cmllcywgcHBvc19lc3RpbWF0ZSwgU1RwLT5mcmFtZV9zZXFfbnVtYmVyLCBmcmFtZV9zZXFfZXN0aW1hdGUsIAorCQkJICAgU1RwLT5sb2dpY2FsX2Jsa19udW0sIGxvZ2ljYWxfYmxrX251bSk7CisjZW5kaWYKKwkgICBpZiAoZnJhbWVfc2VxX2VzdGltYXRlICE9IFNUcC0+ZnJhbWVfc2VxX251bWJlcikKKwkgICAgICBwcG9zX2VzdGltYXRlICs9IGZyYW1lX3NlcV9lc3RpbWF0ZSAtIFNUcC0+ZnJhbWVfc2VxX251bWJlcjsKKwkgICBlbHNlCisJICAgICAgYnJlYWs7CisJfQorZXJyb3I6CisJcHJpbnRrKEtFUk5fRVJSICIlczpFOiBDb3VsZG4ndCBzZWVrIHRvIGxvZ2ljYWwgYmxvY2sgJWQgKGF0ICVkKSwgJWQgcmV0cmllc1xuIiwgCisJCQkgICAgbmFtZSwgbG9naWNhbF9ibGtfbnVtLCBTVHAtPmxvZ2ljYWxfYmxrX251bSwgcmV0cmllcyk7CisJcmV0dXJuICgtRUlPKTsKK30KKworLyogVGhlIHZhbHVlcyBiZWxvdyBhcmUgYmFzZWQgb24gdGhlIE9uU3RyZWFtIGZyYW1lIHBheWxvYWQgc2l6ZSBvZiAzMksgPT0gMioqMTUsCisgKiB0aGF0IGlzLCBPU1NUX0ZSQU1FX1NISUZUICsgT1NTVF9TRUNUT1JfU0hJRlQgbXVzdCBiZSAxNS4gV2l0aCBhIG1pbmltdW0gYmxvY2sKKyAqIHNpemUgb2YgNTEyIGJ5dGVzLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gcmVzb2x2ZSAzMksvNTEyID09IDY0ID09IDIqKjYgcG9zaXRpb25zCisgKiBpbnNpZGUgZWFjaCBmcmFtZS4gRmluYWx5LCBPU1NUX1NFQ1RPUl9NQVNLID09IDIqKk9TU1RfRlJBTUVfU0hJRlQgLSAxLgorICovCisjZGVmaW5lIE9TU1RfRlJBTUVfU0hJRlQgIDYKKyNkZWZpbmUgT1NTVF9TRUNUT1JfU0hJRlQgOQorI2RlZmluZSBPU1NUX1NFQ1RPUl9NQVNLICAweDAzRgorCitzdGF0aWMgaW50IG9zc3RfZ2V0X3NlY3RvcihzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCkKK3sKKwlpbnQJc2VjdG9yOworI2lmIERFQlVHCisJY2hhciAgKiBuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisJCisJcHJpbnRrKE9TU1RfREVCX01TRyAKKwkJIiVzOkQ6IFBvc2l0aW9uZWQgYXQgcHBvcyAlZCwgZnJhbWUgJWQsIGxibiAlZCwgZmlsZSAlZCwgYmxrICVkLCAlY3B0ciAlZCwgZW9mICVkXG4iLAorCQluYW1lLCBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uLCBTVHAtPmZyYW1lX3NlcV9udW1iZXIsIFNUcC0+bG9naWNhbF9ibGtfbnVtLAorCQlTVHAtPnBzW1NUcC0+cGFydGl0aW9uXS5kcnZfZmlsZSwgU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0uZHJ2X2Jsb2NrLCAKKwkJU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0ucncgPT0gU1RfV1JJVElORz8ndyc6J3InLAorCQlTVHAtPnBzW1NUcC0+cGFydGl0aW9uXS5ydyA9PSBTVF9XUklUSU5HP1NUcC0+YnVmZmVyLT5idWZmZXJfYnl0ZXM6CisJCVNUcC0+YnVmZmVyLT5yZWFkX3BvaW50ZXIsIFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dLmVvZik7CisjZW5kaWYKKwkvKiBkbyB3ZSBrbm93IHdoZXJlIHdlIGFyZSBpbnNpZGUgYSBmaWxlPyAqLworCWlmIChTVHAtPnBzW1NUcC0+cGFydGl0aW9uXS5kcnZfYmxvY2sgPj0gMCkgeworCQlzZWN0b3IgPSAoU1RwLT5mcmFtZV9pbl9idWZmZXIgPyBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uLTEgOgorCQkJCVNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24pIDw8IE9TU1RfRlJBTUVfU0hJRlQ7CisJCWlmIChTVHAtPnBzW1NUcC0+cGFydGl0aW9uXS5ydyA9PSBTVF9XUklUSU5HKQorCQkgICAgICAgCXNlY3RvciB8PSAoU1RwLT5idWZmZXItPmJ1ZmZlcl9ieXRlcyA+PiBPU1NUX1NFQ1RPUl9TSElGVCkgJiBPU1NUX1NFQ1RPUl9NQVNLOworCQllbHNlCisJICAgICAgIAkJc2VjdG9yIHw9IChTVHAtPmJ1ZmZlci0+cmVhZF9wb2ludGVyID4+IE9TU1RfU0VDVE9SX1NISUZUKSAmIE9TU1RfU0VDVE9SX01BU0s7CisJfSBlbHNlIHsKKwkJc2VjdG9yID0gb3NzdF9nZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQpOworCQlpZiAoc2VjdG9yID4gMCkKKwkJCXNlY3RvciA8PD0gT1NTVF9GUkFNRV9TSElGVDsKKwl9CisJcmV0dXJuIHNlY3RvcjsKK30KKworc3RhdGljIGludCBvc3N0X3NlZWtfc2VjdG9yKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LCBpbnQgc2VjdG9yKQoreworICAgICAgICBzdHJ1Y3Qgc3RfcGFydHN0YXQgKiBTVHBzICAgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKKwlpbnQJCSAgICAgZnJhbWUgID0gc2VjdG9yID4+IE9TU1RfRlJBTUVfU0hJRlQsCisJCQkgICAgIG9mZnNldCA9IChzZWN0b3IgJiBPU1NUX1NFQ1RPUl9NQVNLKSA8PCBPU1NUX1NFQ1RPUl9TSElGVCwgCisJCQkgICAgIHI7CisjaWYgREVCVUcKKwljaGFyICAgICAgICAgICogbmFtZSA9IHRhcGVfbmFtZShTVHApOworCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU2Vla2luZyBzZWN0b3IgJWQgaW4gZnJhbWUgJWQgYXQgb2Zmc2V0ICVkXG4iLAorCQkJCW5hbWUsIHNlY3RvciwgZnJhbWUsIG9mZnNldCk7CisjZW5kaWYKKwlpZiAoZnJhbWUgPCAwIHx8IGZyYW1lID49IFNUcC0+Y2FwYWNpdHkpIHJldHVybiAoLUVOWElPKTsKKworCWlmIChmcmFtZSA8PSBTVHAtPmZpcnN0X2RhdGFfcHBvcykgeworCQlTVHAtPmZyYW1lX3NlcV9udW1iZXIgPSBTVHAtPmxvZ2ljYWxfYmxrX251bSA9IFNUcHMtPmRydl9maWxlID0gU1Rwcy0+ZHJ2X2Jsb2NrID0gMDsKKwkJcmV0dXJuIChvc3N0X3NldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCwgZnJhbWUsIDApKTsKKwl9CisJciA9IG9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50LCBvZmZzZXQ/ZnJhbWU6ZnJhbWUtMSwgMCk7CisJaWYgKHIgPCAwKSByZXR1cm4gcjsKKworCXIgPSBvc3N0X2dldF9sb2dpY2FsX2ZyYW1lKFNUcCwgYVNScG50LCAtMSwgMSk7CisJaWYgKHIgPCAwKSByZXR1cm4gcjsKKworCWlmIChvc3N0X2dldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCkgIT0gKG9mZnNldD9mcmFtZSsxOmZyYW1lKSkgcmV0dXJuICgtRUlPKTsKKworCWlmIChvZmZzZXQpIHsKKwkJU1RwLT5sb2dpY2FsX2Jsa19udW0gICAgICArPSBvZmZzZXQgLyBTVHAtPmJsb2NrX3NpemU7CisJCVNUcC0+YnVmZmVyLT5yZWFkX3BvaW50ZXIgID0gb2Zmc2V0OworCQlTVHAtPmJ1ZmZlci0+YnVmZmVyX2J5dGVzIC09IG9mZnNldDsKKwl9IGVsc2UgeworCQlTVHAtPmZyYW1lX3NlcV9udW1iZXIrKzsKKwkJU1RwLT5mcmFtZV9pbl9idWZmZXIgICAgICAgPSAwOworCQlTVHAtPmxvZ2ljYWxfYmxrX251bSAgICAgICs9IG50b2hzKFNUcC0+YnVmZmVyLT5hdXgtPmRhdC5kYXRfbGlzdFswXS5ibGtfY250KTsKKwkJU1RwLT5idWZmZXItPmJ1ZmZlcl9ieXRlcyAgPSBTVHAtPmJ1ZmZlci0+cmVhZF9wb2ludGVyID0gMDsKKwl9CisJU1Rwcy0+ZHJ2X2ZpbGUgPSBudG9obChTVHAtPmJ1ZmZlci0+YXV4LT5maWxlbWFya19jbnQpOworCWlmIChTVHBzLT5lb2YgPT0gU1RfRk1fSElUKSB7CisJCVNUcHMtPmRydl9maWxlKys7CisJCVNUcHMtPmRydl9ibG9jayA9IDA7CisJfSBlbHNlIHsKKwkJU1Rwcy0+ZHJ2X2Jsb2NrID0gbnRvaGwoU1RwLT5idWZmZXItPmF1eC0+bGFzdF9tYXJrX2xibik/CisJCQkJICAgIFNUcC0+bG9naWNhbF9ibGtfbnVtIC0KKwkJCQkJKFNUcHMtPmRydl9maWxlID8gbnRvaGwoU1RwLT5idWZmZXItPmF1eC0+bGFzdF9tYXJrX2xibikgKyAxIDogMCk6CisJCQkJICAtMTsKKwl9CisJU1Rwcy0+ZW9mICAgICAgID0gKFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24gPj0gU1RwLT5lb2RfZnJhbWVfcHBvcyk/U1RfRU9EOlNUX05PRU9GOworI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAKKwkJIiVzOkQ6IE5vdyBwb3NpdGlvbmVkIGF0IHBwb3MgJWQsIGZyYW1lICVkLCBsYm4gJWQsIGZpbGUgJWQsIGJsayAlZCwgcnB0ciAlZCwgZW9mICVkXG4iLAorCQluYW1lLCBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uLCBTVHAtPmZyYW1lX3NlcV9udW1iZXIsIFNUcC0+bG9naWNhbF9ibGtfbnVtLAorCQlTVHBzLT5kcnZfZmlsZSwgU1Rwcy0+ZHJ2X2Jsb2NrLCBTVHAtPmJ1ZmZlci0+cmVhZF9wb2ludGVyLCBTVHBzLT5lb2YpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIGJhY2sgdGhlIGRyaXZlJ3MgaW50ZXJuYWwgYnVmZmVyIGNvbnRlbnRzLCBhcyBhIHBhcnQKKyAqIG9mIHRoZSB3cml0ZSBlcnJvciByZWNvdmVyeSBtZWNoYW5pc20gZm9yIG9sZCBPblN0cmVhbQorICogZmlybXdhcmUgcmV2aXNpb25zLgorICogUHJlY29uZGl0aW9uIGZvciB0aGlzIGZ1bmN0aW9uIHRvIHdvcms6IGFsbCBmcmFtZXMgaW4gdGhlCisgKiBkcml2ZSdzIGJ1ZmZlciBtdXN0IGJlIG9mIG9uZSB0eXBlIChEQVRBLCBNQVJLIG9yIEVPRCkhCisgKi8KK3N0YXRpYyBpbnQgb3NzdF9yZWFkX2JhY2tfYnVmZmVyX2FuZF9yZXdyaXRlKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LAorCQkJCQkJdW5zaWduZWQgaW50IGZyYW1lLCB1bnNpZ25lZCBpbnQgc2tpcCwgaW50IHBlbmRpbmcpCit7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAgICogU1JwbnQgPSAqIGFTUnBudDsKKwl1bnNpZ25lZCBjaGFyCSAgICAgICogYnVmZmVyLCAqIHA7CisJdW5zaWduZWQgY2hhcgkJY21kW01BWF9DT01NQU5EX1NJWkVdOworCWludAkJCWZsYWcsIG5ld19mcmFtZSwgaTsKKwlpbnQJCQluZnJhbWVzICAgICAgICAgID0gU1RwLT5jdXJfZnJhbWVzOworCWludAkJCWJsa3NfcGVyX2ZyYW1lICAgPSBudG9ocyhTVHAtPmJ1ZmZlci0+YXV4LT5kYXQuZGF0X2xpc3RbMF0uYmxrX2NudCk7CisJaW50CQkJZnJhbWVfc2VxX251bWJlciA9IG50b2hsKFNUcC0+YnVmZmVyLT5hdXgtPmZyYW1lX3NlcV9udW0pCisJCQkJCQktIChuZnJhbWVzICsgcGVuZGluZyAtIDEpOworCWludAkJCWxvZ2ljYWxfYmxrX251bSAgPSBudG9obChTVHAtPmJ1ZmZlci0+YXV4LT5sb2dpY2FsX2Jsa19udW0pIAorCQkJCQkJLSAobmZyYW1lcyArIHBlbmRpbmcgLSAxKSAqIGJsa3NfcGVyX2ZyYW1lOworCWNoYXIJCSAgICAgICogbmFtZSAgICAgICAgICAgICA9IHRhcGVfbmFtZShTVHApOworCXVuc2lnbmVkIGxvbmcJCXN0YXJ0d2FpdCAgICAgICAgPSBqaWZmaWVzOworI2lmIERFQlVHCisJaW50CQkJZGJnICAgICAgICAgICAgICA9IGRlYnVnZ2luZzsKKyNlbmRpZgorCisJaWYgKChidWZmZXIgPSAodW5zaWduZWQgY2hhciAqKXZtYWxsb2MoKG5mcmFtZXMgKyAxKSAqIE9TX0RBVEFfU0laRSkpID09IE5VTEwpCisJCXJldHVybiAoLUVJTyk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczpJOiBSZWFkaW5nIGJhY2sgJWQgZnJhbWVzIGZyb20gZHJpdmUgYnVmZmVyJXNcbiIsCisJCQkgbmFtZSwgbmZyYW1lcywgcGVuZGluZz8iIGFuZCBvbmUgdGhhdCB3YXMgcGVuZGluZyI6IiIpOworCisJb3NzdF9jb3B5X2Zyb21fYnVmZmVyKFNUcC0+YnVmZmVyLCAocCA9ICZidWZmZXJbbmZyYW1lcyAqIE9TX0RBVEFfU0laRV0pKTsKKyNpZiBERUJVRworCWlmIChwZW5kaW5nICYmIGRlYnVnZ2luZykKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUGVuZGluZyBmcmFtZSAlZCAobGJsayAlZCksIGRhdGEgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCQluYW1lLCBmcmFtZV9zZXFfbnVtYmVyICsgbmZyYW1lcywKKwkJCSAgICAgICAJbG9naWNhbF9ibGtfbnVtICsgbmZyYW1lcyAqIGJsa3NfcGVyX2ZyYW1lLAorCQkJICAgICAgIAlwWzBdLCBwWzFdLCBwWzJdLCBwWzNdKTsKKyNlbmRpZgorCWZvciAoaSA9IDAsIHAgPSBidWZmZXI7IGkgPCBuZnJhbWVzOyBpKyssIHAgKz0gT1NfREFUQV9TSVpFKSB7CisKKwkJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJCWNtZFswXSA9IDB4M0M7CQkvKiBCdWZmZXIgUmVhZCAgICAgICAgICAgKi8KKwkJY21kWzFdID0gNjsJCS8qIFJldHJpZXZlIEZhdWx0eSBCbG9jayAqLworCQljbWRbN10gPSAzMjc2OCA+PiA4OworCQljbWRbOF0gPSAzMjc2OCAmIDB4ZmY7CisKKwkJU1JwbnQgPSBvc3N0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCBPU19GUkFNRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UsCisJCQkJCSAgICBTVHAtPnRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKwkKKwkJaWYgKChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0IHx8ICFTUnBudCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczpFOiBGYWlsZWQgdG8gcmVhZCBmcmFtZSBiYWNrIGZyb20gT25TdHJlYW0gYnVmZmVyXG4iLCBuYW1lKTsKKwkJCXZmcmVlKCh2b2lkICopYnVmZmVyKTsKKwkJCSphU1JwbnQgPSBTUnBudDsKKwkJCXJldHVybiAoLUVJTyk7CisJCX0KKwkJb3NzdF9jb3B5X2Zyb21fYnVmZmVyKFNUcC0+YnVmZmVyLCBwKTsKKyNpZiBERUJVRworCQlpZiAoZGVidWdnaW5nKQorCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmVhZCBiYWNrIGxvZ2ljYWwgZnJhbWUgJWQsIGRhdGEgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCQkJICBuYW1lLCBmcmFtZV9zZXFfbnVtYmVyICsgaSwgcFswXSwgcFsxXSwgcFsyXSwgcFszXSk7CisjZW5kaWYKKwl9CisJKmFTUnBudCA9IFNScG50OworCW9zc3RfZ2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50KTsKKworI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRnJhbWVzIGxlZnQgaW4gYnVmZmVyOiAlZFxuIiwgbmFtZSwgU1RwLT5jdXJfZnJhbWVzKTsKKyNlbmRpZgorCS8qIFdyaXRlIHN5bmNocm9ub3VzbHkgc28gd2UgY2FuIGJlIHN1cmUgd2UncmUgT0sgYWdhaW4gYW5kIGRvbid0IGhhdmUgdG8gcmVjb3ZlciByZWN1cnNpdmVseSAqLworCS8qIEluIHRoZSBoZWFkZXIgd2UgZG9uJ3QgYWN0dWFsbHkgcmUtd3JpdGUgdGhlIGZyYW1lcyB0aGF0IGZhaWwsIGp1c3QgdGhlIG9uZXMgYWZ0ZXIgdGhlbSAqLworCisJZm9yIChmbGFnPTEsIG5ld19mcmFtZT1mcmFtZSwgcD1idWZmZXIsIGk9MDsgaSA8IG5mcmFtZXMgKyBwZW5kaW5nOyApIHsKKworCQlpZiAoZmxhZykgeworCQkJaWYgKFNUcC0+d3JpdGVfdHlwZSA9PSBPU19XUklURV9IRUFERVIpIHsKKwkJCQlpICs9IHNraXA7CisJCQkJcCArPSBza2lwICogT1NfREFUQV9TSVpFOworCQkJfQorCQkJZWxzZSBpZiAobmV3X2ZyYW1lIDwgMjk5MCAmJiBuZXdfZnJhbWUrc2tpcCtuZnJhbWVzK3BlbmRpbmcgPj0gMjk5MCkKKwkJCQluZXdfZnJhbWUgPSAzMDAwLWk7CisJCQllbHNlCisJCQkJbmV3X2ZyYW1lICs9IHNraXA7CisjaWYgREVCVUcKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFBvc2l0aW9uIHRvIGZyYW1lICVkLCB3cml0ZSBmc2VxICVkXG4iLAorCQkJCQkJbmFtZSwgbmV3X2ZyYW1lK2ksIGZyYW1lX3NlcV9udW1iZXIraSk7CisjZW5kaWYKKwkJCW9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50LCBuZXdfZnJhbWUgKyBpLCAwKTsKKwkJCW9zc3Rfd2FpdF9yZWFkeShTVHAsIGFTUnBudCwgNjAsIE9TU1RfV0FJVF9QT1NJVElPTl9DT01QTEVURSk7CisJCQlvc3N0X2dldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCk7CisJCQlTUnBudCA9ICogYVNScG50OworCisJCQlpZiAobmV3X2ZyYW1lID4gZnJhbWUgKyAxMDAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczpFOiBGYWlsZWQgdG8gZmluZCB3cml0YWJsZSB0YXBlIG1lZGlhXG4iLCBuYW1lKTsKKwkJCQl2ZnJlZSgodm9pZCAqKWJ1ZmZlcik7CisJCQkJcmV0dXJuICgtRUlPKTsKKwkJCX0KKwkJCWlmICggaSA+PSBuZnJhbWVzICsgcGVuZGluZyApIGJyZWFrOworCQkJZmxhZyA9IDA7CisJCX0KKwkJb3NzdF9jb3B5X3RvX2J1ZmZlcihTVHAtPmJ1ZmZlciwgcCk7CisJCS8qCisJCSAqIElNUE9SVEFOVDogZm9yIGVycm9yIHJlY292ZXJ5IHRvIHdvcmssIF9uZXZlcl8gcXVldWUgZnJhbWVzIHdpdGggbWl4ZWQgZnJhbWUgdHlwZSEKKwkJICovCisJCW9zc3RfaW5pdF9hdXgoU1RwLCBTVHAtPmJ1ZmZlci0+YXV4LT5mcmFtZV90eXBlLCBmcmFtZV9zZXFfbnVtYmVyK2ksCisJCQkgICAgICAgCWxvZ2ljYWxfYmxrX251bSArIGkqYmxrc19wZXJfZnJhbWUsCisJCQkgICAgICAgCW50b2hsKFNUcC0+YnVmZmVyLT5hdXgtPmRhdC5kYXRfbGlzdFswXS5ibGtfc3opLCBibGtzX3Blcl9mcmFtZSk7CisJCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCQljbWRbMF0gPSBXUklURV82OworCQljbWRbMV0gPSAxOworCQljbWRbNF0gPSAxOworCisjaWYgREVCVUcKKwkJaWYgKGRlYnVnZ2luZykKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cKKwkJCQkiJXM6RDogQWJvdXQgdG8gd3JpdGUgZnJhbWUgJWQsIHNlcSAlZCwgbGJuICVkLCBkYXRhICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkJbmFtZSwgbmV3X2ZyYW1lK2ksIGZyYW1lX3NlcV9udW1iZXIraSwgbG9naWNhbF9ibGtfbnVtICsgaSpibGtzX3Blcl9mcmFtZSwKKwkJCQlwWzBdLCBwWzFdLCBwWzJdLCBwWzNdKTsKKyNlbmRpZgorCQlTUnBudCA9IG9zc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIE9TX0ZSQU1FX1NJWkUsIERNQV9UT19ERVZJQ0UsCisJCQkJCSAgICBTVHAtPnRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKworCQlpZiAoU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0KQorCQkJZmxhZyA9IDE7CisJCWVsc2UgeworCQkJcCArPSBPU19EQVRBX1NJWkU7IGkrKzsKKworCQkJLyogaWYgd2UganVzdCBzZW50IHRoZSBsYXN0IGZyYW1lLCB3YWl0IHRpbGwgYWxsIHN1Y2Nlc3NmdWxseSB3cml0dGVuICovCisJCQlpZiAoIGkgPT0gbmZyYW1lcyArIHBlbmRpbmcgKSB7CisjaWYgREVCVUcKKwkJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBDaGVjayByZS13cml0ZSBzdWNjZXNzZnVsXG4iLCBuYW1lKTsKKyNlbmRpZgorCQkJCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCQkJCWNtZFswXSA9IFdSSVRFX0ZJTEVNQVJLUzsKKwkJCQljbWRbMV0gPSAxOworCQkJCVNScG50ID0gb3NzdF9kb19zY3NpKFNScG50LCBTVHAsIGNtZCwgMCwgRE1BX05PTkUsCisJCQkJCQkJICAgIFNUcC0+dGltZW91dCwgTUFYX1JFVFJJRVMsIDEpOworI2lmIERFQlVHCisJCQkJaWYgKGRlYnVnZ2luZykgeworCQkJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTbGVlcGluZyBpbiByZS13cml0ZSB3YWl0IHJlYWR5XG4iLCBuYW1lKTsKKwkJCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogVHVybmluZyBvZmYgZGVidWdnaW5nIGZvciBhIHdoaWxlXG4iLCBuYW1lKTsKKwkJCQkJZGVidWdnaW5nID0gMDsKKwkJCQl9CisjZW5kaWYKKwkJCQlmbGFnID0gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OworCQkJCXdoaWxlICggIWZsYWcgJiYgdGltZV9iZWZvcmUoamlmZmllcywgc3RhcnR3YWl0ICsgNjAqSFopICkgeworCisJCQkJCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCQkJCQljbWRbMF0gPSBURVNUX1VOSVRfUkVBRFk7CisKKwkJCQkJU1JwbnQgPSBvc3N0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwgU1RwLT50aW1lb3V0LAorCQkJCQkJCQkJCQkJTUFYX1JFVFJJRVMsIDEpOworCisJCQkJCWlmIChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdID09IDIgJiYgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxMl0gPT0gNCAmJgorCQkJCQkgICAgKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTNdID09IDEgfHwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10gPT0gOCkpIHsKKwkJCQkJCS8qIGluIHRoZSBwcm9jZXNzIG9mIGJlY29taW5nIHJlYWR5ICovCisJCQkJCQltc2xlZXAoMTAwKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCWlmIChTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQpCisJCQkJCQlmbGFnID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorI2lmIERFQlVHCisJCQkJZGVidWdnaW5nID0gZGJnOworCQkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFdhaXQgcmUtd3JpdGUgZmluaXNoZWRcbiIsIG5hbWUpOworI2VuZGlmCisJCQl9CisJCX0KKwkJKmFTUnBudCA9IFNScG50OworCQlpZiAoZmxhZykgeworCQkJaWYgKChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWyAyXSAmIDB4MGYpID09IDEzICYmCisJCQkgICAgIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTJdICAgICAgICAgPT0gIDAgJiYKKwkJCSAgICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10gICAgICAgICA9PSAgMikgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6RTogVm9sdW1lIG92ZXJmbG93IGluIHdyaXRlIGVycm9yIHJlY292ZXJ5XG4iLCBuYW1lKTsKKwkJCQl2ZnJlZSgodm9pZCAqKWJ1ZmZlcik7CisJCQkJcmV0dXJuICgtRUlPKTsJCQkvKiBoaXQgZW5kIG9mIHRhcGUgPSBmYWlsICovCisJCQl9CisJCQlpID0gKChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzNdIDw8IDI0KSB8CisJCQkgICAgIChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzRdIDw8IDE2KSB8CisJCQkgICAgIChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzVdIDw8ICA4KSB8CisJCQkgICAgICBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzZdICAgICAgICApIC0gbmV3X2ZyYW1lOworCQkJcCA9ICZidWZmZXJbaSAqIE9TX0RBVEFfU0laRV07CisjaWYgREVCVUcKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEFkZGl0aW9uYWwgd3JpdGUgZXJyb3IgYXQgJWRcbiIsIG5hbWUsIG5ld19mcmFtZStpKTsKKyNlbmRpZgorCQkJb3NzdF9nZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQpOworI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiByZXBvcnRlZCBmcmFtZSBwb3NpdGlvbnM6IGhvc3QgPSAlZCwgdGFwZSA9ICVkLCBidWZmZXIgPSAlZFxuIiwKKwkJCQkJICBuYW1lLCBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uLCBTVHAtPmxhc3RfZnJhbWVfcG9zaXRpb24sIFNUcC0+Y3VyX2ZyYW1lcyk7CisjZW5kaWYKKwkJfQorCX0KKwlpZiAoZmxhZykgeworCQkvKiBlcnJvciByZWNvdmVyeSBkaWQgbm90IHN1Y2Nlc3NmdWxseSBjb21wbGV0ZSAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOkQ6IFdyaXRlIGVycm9yIHJlY292ZXJ5IGZhaWxlZCBpbiAlc1xuIiwgbmFtZSwKKwkJCQlTVHAtPndyaXRlX3R5cGUgPT0gT1NfV1JJVEVfSEVBREVSPyJoZWFkZXIiOiJib2R5Iik7CisJfQorCWlmICghcGVuZGluZykKKwkJb3NzdF9jb3B5X3RvX2J1ZmZlcihTVHAtPmJ1ZmZlciwgcCk7CS8qIHNvIGJ1ZmZlciBjb250ZW50ID09IGF0IGVudHJ5IGluIGFsbCBjYXNlcyAqLworCXZmcmVlKCh2b2lkICopYnVmZmVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvc3N0X3JlcG9zaXRpb25fYW5kX3JldHJ5KHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LAorCQkJCQl1bnNpZ25lZCBpbnQgZnJhbWUsIHVuc2lnbmVkIGludCBza2lwLCBpbnQgcGVuZGluZykKK3sKKwl1bnNpZ25lZCBjaGFyCQljbWRbTUFYX0NPTU1BTkRfU0laRV07CisJc3RydWN0IHNjc2lfcmVxdWVzdCAgICogU1JwbnQ7CisJY2hhcgkJICAgICAgKiBuYW1lICAgICAgPSB0YXBlX25hbWUoU1RwKTsKKwlpbnQJCQlleHBlY3RlZCAgPSAwOworCWludAkJCWF0dGVtcHRzICA9IDEwMDAgLyBza2lwOworCWludAkJCWZsYWcgICAgICA9IDE7CisJdW5zaWduZWQgbG9uZwkJc3RhcnR3YWl0ID0gamlmZmllczsKKyNpZiBERUJVRworCWludAkJCWRiZyAgICAgICA9IGRlYnVnZ2luZzsKKyNlbmRpZgorCisJd2hpbGUgKGF0dGVtcHRzICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHN0YXJ0d2FpdCArIDYwKkhaKSkgeworCQlpZiAoZmxhZykgeworI2lmIERFQlVHCisJCQlkZWJ1Z2dpbmcgPSBkYmc7CisjZW5kaWYKKwkJCWlmIChmcmFtZSA8IDI5OTAgJiYgZnJhbWUrc2tpcCtTVHAtPmN1cl9mcmFtZXMrcGVuZGluZyA+PSAyOTkwKQorCQkJCWZyYW1lID0gMzAwMC1za2lwOworCQkJZXhwZWN0ZWQgPSBmcmFtZStza2lwK1NUcC0+Y3VyX2ZyYW1lcytwZW5kaW5nOworI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBQb3NpdGlvbiB0byBmcHBvcyAlZCwgcmUtd3JpdGUgZnJvbSBmc2VxICVkXG4iLAorCQkJCQkgIG5hbWUsIGZyYW1lK3NraXAsIFNUcC0+ZnJhbWVfc2VxX251bWJlci1TVHAtPmN1cl9mcmFtZXMtcGVuZGluZyk7CisjZW5kaWYKKwkJCW9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50LCBmcmFtZSArIHNraXAsIDEpOworCQkJZmxhZyA9IDA7CisJCQlhdHRlbXB0cy0tOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAxMCk7CisJCX0KKwkJaWYgKG9zc3RfZ2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50KSA8IDApIHsJCS8qIGFkZGl0aW9uYWwgd3JpdGUgZXJyb3IgKi8KKyNpZiBERUJVRworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQWRkbCBlcnJvciwgaG9zdCAlZCwgdGFwZSAlZCwgYnVmZmVyICVkXG4iLAorCQkJCQkgIG5hbWUsIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24sCisJCQkJCSAgU1RwLT5sYXN0X2ZyYW1lX3Bvc2l0aW9uLCBTVHAtPmN1cl9mcmFtZXMpOworI2VuZGlmCisJCQlmcmFtZSA9IFNUcC0+bGFzdF9mcmFtZV9wb3NpdGlvbjsKKwkJCWZsYWcgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHBlbmRpbmcgJiYgU1RwLT5jdXJfZnJhbWVzIDwgNTApIHsKKworCQkJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJCQljbWRbMF0gPSBXUklURV82OworCQkJY21kWzFdID0gMTsKKwkJCWNtZFs0XSA9IDE7CisjaWYgREVCVUcKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEFib3V0IHRvIHdyaXRlIHBlbmRpbmcgZnNlcSAlZCBhdCBmcHBvcyAlZFxuIiwKKwkJCQkJICBuYW1lLCBTVHAtPmZyYW1lX3NlcV9udW1iZXItMSwgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbik7CisjZW5kaWYKKwkJCVNScG50ID0gb3NzdF9kb19zY3NpKCphU1JwbnQsIFNUcCwgY21kLCBPU19GUkFNRV9TSVpFLCBETUFfVE9fREVWSUNFLAorCQkJCQkJICAgICAgU1RwLT50aW1lb3V0LCBNQVhfUkVUUklFUywgMSk7CisJCQkqYVNScG50ID0gU1JwbnQ7CisKKwkJCWlmIChTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQpIHsJCS8qIGFkZGl0aW9uYWwgd3JpdGUgZXJyb3IgKi8KKwkJCQlpZiAoKFNScG50LT5zcl9zZW5zZV9idWZmZXJbIDJdICYgMHgwZikgPT0gMTMgJiYKKwkJCQkgICAgIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTJdICAgICAgICAgPT0gIDAgJiYKKwkJCQkgICAgIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTNdICAgICAgICAgPT0gIDIpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSAgICAgICAiJXM6RTogVm9sdW1lIG92ZXJmbG93IGluIHdyaXRlIGVycm9yIHJlY292ZXJ5XG4iLAorCQkJCQkgICAgICAgbmFtZSk7CisJCQkJCWJyZWFrOwkJCQkvKiBoaXQgZW5kIG9mIHRhcGUgPSBmYWlsICovCisJCQkJfQorCQkJCWZsYWcgPSAxOworCQkJfQorCQkJZWxzZQorCQkJCXBlbmRpbmcgPSAwOworCisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoU1RwLT5jdXJfZnJhbWVzID09IDApIHsKKyNpZiBERUJVRworCQkJZGVidWdnaW5nID0gZGJnOworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogV2FpdCByZS13cml0ZSBmaW5pc2hlZFxuIiwgbmFtZSk7CisjZW5kaWYKKwkJCWlmIChTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uICE9IGV4cGVjdGVkKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczpBOiBBY3R1YWwgcG9zaXRpb24gJWQgLSBleHBlY3RlZCAlZFxuIiwgCisJCQkJCQluYW1lLCBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uLCBleHBlY3RlZCk7CisJCQkJcmV0dXJuICgtRUlPKTsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisjaWYgREVCVUcKKwkJaWYgKGRlYnVnZ2luZykgeworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU2xlZXBpbmcgaW4gcmUtd3JpdGUgd2FpdCByZWFkeVxuIiwgbmFtZSk7CisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBUdXJuaW5nIG9mZiBkZWJ1Z2dpbmcgZm9yIGEgd2hpbGVcbiIsIG5hbWUpOworCQkJZGVidWdnaW5nID0gMDsKKwkJfQorI2VuZGlmCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAxMCk7CisJfQorCXByaW50ayhLRVJOX0VSUiAiJXM6RTogRmFpbGVkIHRvIGZpbmQgdmFsaWQgdGFwZSBtZWRpYVxuIiwgbmFtZSk7CisjaWYgREVCVUcKKwlkZWJ1Z2dpbmcgPSBkYmc7CisjZW5kaWYKKwlyZXR1cm4gKC1FSU8pOworfQorCisvKgorICogRXJyb3IgcmVjb3ZlcnkgYWxnb3JpdGhtIGZvciB0aGUgT25TdHJlYW0gdGFwZS4KKyAqLworCitzdGF0aWMgaW50IG9zc3Rfd3JpdGVfZXJyb3JfcmVjb3Zlcnkoc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsIGludCBwZW5kaW5nKQoreworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKiBTUnBudCAgPSAqIGFTUnBudDsKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgICogU1RwcyAgID0gJiBTVHAtPnBzW1NUcC0+cGFydGl0aW9uXTsKKwljaGFyCQkgICAgKiBuYW1lICAgPSB0YXBlX25hbWUoU1RwKTsKKwlpbnQJCSAgICAgIHJldHZhbCA9IDA7CisJaW50CQkgICAgICByd19zdGF0ZTsKKwl1bnNpZ25lZCBpbnQJICAgICAgZnJhbWUsIHNraXA7CisKKwlyd19zdGF0ZSA9IFNUcHMtPnJ3OworCisJaWYgKChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWyAyXSAmIDB4MGYpICE9IDMKKwkgIHx8IFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTJdICAgICAgICAgIT0gMTIKKwkgIHx8IFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTNdICAgICAgICAgIT0gMCkgeworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFdyaXRlIGVycm9yIHJlY292ZXJ5IGNhbm5vdCBoYW5kbGUgJTAyeDolMDJ4OiUwMnhcbiIsIG5hbWUsCisJCQlTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdLCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEyXSwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10pOworI2VuZGlmCisJCXJldHVybiAoLUVJTyk7CisJfQorCWZyYW1lID0JKFNScG50LT5zcl9zZW5zZV9idWZmZXJbM10gPDwgMjQpIHwKKwkJKFNScG50LT5zcl9zZW5zZV9idWZmZXJbNF0gPDwgMTYpIHwKKwkJKFNScG50LT5zcl9zZW5zZV9idWZmZXJbNV0gPDwgIDgpIHwKKwkJIFNScG50LT5zcl9zZW5zZV9idWZmZXJbNl07CisJc2tpcCAgPSAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlcls5XTsKKyAKKyNpZiBERUJVRworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IERldGVjdGVkIHBoeXNpY2FsIGJhZCBmcmFtZSBhdCAldSwgYWR2aXNlZCB0byBza2lwICVkXG4iLCBuYW1lLCBmcmFtZSwgc2tpcCk7CisjZW5kaWYKKwlvc3N0X2dldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCk7CisjaWYgREVCVUcKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiByZXBvcnRlZCBmcmFtZSBwb3NpdGlvbnM6IGhvc3QgPSAlZCwgdGFwZSA9ICVkXG4iLAorCQkJbmFtZSwgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiwgU1RwLT5sYXN0X2ZyYW1lX3Bvc2l0aW9uKTsKKyNlbmRpZgorCXN3aXRjaCAoU1RwLT53cml0ZV90eXBlKSB7CisJICAgY2FzZSBPU19XUklURV9EQVRBOgorCSAgIGNhc2UgT1NfV1JJVEVfRU9EOgorCSAgIGNhc2UgT1NfV1JJVEVfTkVXX01BUks6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCQkiJXM6STogUmVsb2NhdGluZyAlZCBidWZmZXJlZCBsb2dpY2FsIGZyYW1lcyBmcm9tIHBvc2l0aW9uICV1IHRvICV1XG4iLAorCQkJbmFtZSwgU1RwLT5jdXJfZnJhbWVzLCBmcmFtZSwgKGZyYW1lICsgc2tpcCA+IDMwMDAgJiYgZnJhbWUgPCAzMDAwKT8zMDAwOmZyYW1lICsgc2tpcCk7CisJCWlmIChTVHAtPm9zX2Z3X3JldiA+PSAxMDYwMCkKKwkJCXJldHZhbCA9IG9zc3RfcmVwb3NpdGlvbl9hbmRfcmV0cnkoU1RwLCBhU1JwbnQsIGZyYW1lLCBza2lwLCBwZW5kaW5nKTsKKwkJZWxzZQorCQkJcmV0dmFsID0gb3NzdF9yZWFkX2JhY2tfYnVmZmVyX2FuZF9yZXdyaXRlKFNUcCwgYVNScG50LCBmcmFtZSwgc2tpcCwgcGVuZGluZyk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiVzOiAlc1dyaXRlIGVycm9yJXNyZWNvdmVyZWRcbiIsIG5hbWUsCisJCQkgICAgICAgCXJldHZhbD8iRSIgICAgOiJJIiwKKwkJCSAgICAgICAJcmV0dmFsPyIiICAgICA6IkRvbid0IHdvcnJ5LCAiLAorCQkJICAgICAgIAlyZXR2YWw/IiBub3QgIjoiICIpOworCQlicmVhazsKKwkgICBjYXNlIE9TX1dSSVRFX0xBU1RfTUFSSzoKKwkJcHJpbnRrKEtFUk5fRVJSICIlczpFOiBCYWQgZnJhbWUgaW4gdXBkYXRlIGxhc3QgbWFya2VyLCBmYXRhbFxuIiwgbmFtZSk7CisJCW9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50LCBmcmFtZSArIFNUcC0+Y3VyX2ZyYW1lcyArIHBlbmRpbmcsIDApOworCQlyZXR2YWwgPSAtRUlPOworCQlicmVhazsKKwkgICBjYXNlIE9TX1dSSVRFX0hFQURFUjoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6STogQmFkIGZyYW1lIGluIGhlYWRlciBwYXJ0aXRpb24sIHNraXBwZWRcbiIsIG5hbWUpOworCQlyZXR2YWwgPSBvc3N0X3JlYWRfYmFja19idWZmZXJfYW5kX3Jld3JpdGUoU1RwLCBhU1JwbnQsIGZyYW1lLCAxLCBwZW5kaW5nKTsKKwkJYnJlYWs7CisJICAgZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6STogQmFkIGZyYW1lIGluIGZpbGxlciwgaWdub3JlZFxuIiwgbmFtZSk7CisJCW9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50LCBmcmFtZSArIFNUcC0+Y3VyX2ZyYW1lcyArIHBlbmRpbmcsIDApOworCX0KKwlvc3N0X2dldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCk7CisjaWYgREVCVUcKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBQb3NpdGlvbmluZyBjb21wbGV0ZSwgY3VyX2ZyYW1lcyAlZCwgcG9zICVkLCB0YXBlIHBvcyAlZFxuIiwgCisJCQluYW1lLCBTVHAtPmN1cl9mcmFtZXMsIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24sIFNUcC0+bGFzdF9mcmFtZV9wb3NpdGlvbik7CisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogbmV4dCBsb2dpY2FsIGZyYW1lIHRvIHdyaXRlOiAlZFxuIiwgbmFtZSwgU1RwLT5sb2dpY2FsX2Jsa19udW0pOworI2VuZGlmCisJaWYgKHJldHZhbCA9PSAwKSB7CisJCVNUcC0+cmVjb3Zlcl9jb3VudCsrOworCQlTVHAtPnJlY292ZXJfZXJyZWcrKzsKKwl9IGVsc2UKKwkJU1RwLT5hYm9ydF9jb3VudCsrOworCisJU1Rwcy0+cncgPSByd19zdGF0ZTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IG9zc3Rfc3BhY2Vfb3Zlcl9maWxlbWFya3NfYmFja3dhcmQoc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsCisJCQkJCQkJCSBpbnQgbXRfb3AsIGludCBtdF9jb3VudCkKK3sKKwljaGFyICAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKwlpbnQgICAgIGNudDsKKwlpbnQgICAgIGxhc3RfbWFya19wcG9zID0gLTE7CisKKyNpZiBERUJVRworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFJlYWNoZWQgc3BhY2Vfb3Zlcl9maWxlbWFya3NfYmFja3dhcmRzICVkICVkXG4iLCBuYW1lLCBtdF9vcCwgbXRfY291bnQpOworI2VuZGlmCisJaWYgKG9zc3RfZ2V0X2xvZ2ljYWxfZnJhbWUoU1RwLCBhU1JwbnQsIC0xLCAwKSA8IDApIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBDb3VsZG4ndCBnZXQgbG9naWNhbCBibGsgbnVtIGluIHNwYWNlX2ZpbGVtYXJrc19id2RcbiIsIG5hbWUpOworI2VuZGlmCisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoU1RwLT5saW51eF9tZWRpYV92ZXJzaW9uID49IDQpIHsKKwkJLyoKKwkJICogZGlyZWN0IGxvb2t1cCBpbiBoZWFkZXIgZmlsZW1hcmsgbGlzdAorCQkgKi8KKwkJY250ID0gbnRvaGwoU1RwLT5idWZmZXItPmF1eC0+ZmlsZW1hcmtfY250KTsKKwkJaWYgKFNUcC0+aGVhZGVyX29rICAgICAgICAgICAgICAgICAgICAgICAgICYmIAorCQkgICAgU1RwLT5oZWFkZXJfY2FjaGUgIT0gTlVMTCAgICAgICAgICAgICAgJiYKKwkJICAgIChjbnQgLSBtdF9jb3VudCkgID49IDAgICAgICAgICAgICAgICAgICYmCisJCSAgICAoY250IC0gbXRfY291bnQpICAgPCBPU19GTV9UQUJfTUFYICAgICAmJgorCQkgICAgKGNudCAtIG10X2NvdW50KSAgIDwgU1RwLT5maWxlbWFya19jbnQgJiYKKwkJICAgIFNUcC0+aGVhZGVyX2NhY2hlLT5kYXRfZm1fdGFiLmZtX3RhYl9lbnRbY250LTFdID09IFNUcC0+YnVmZmVyLT5hdXgtPmxhc3RfbWFya19wcG9zKQorCisJCQlsYXN0X21hcmtfcHBvcyA9IG50b2hsKFNUcC0+aGVhZGVyX2NhY2hlLT5kYXRfZm1fdGFiLmZtX3RhYl9lbnRbY250IC0gbXRfY291bnRdKTsKKyNpZiBERUJVRworCQlpZiAoU1RwLT5oZWFkZXJfY2FjaGUgPT0gTlVMTCB8fCAoY250IC0gbXRfY291bnQpIDwgMCB8fCAoY250IC0gbXRfY291bnQpID49IE9TX0ZNX1RBQl9NQVgpCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBGaWxlbWFyayBsb29rdXAgZmFpbCBkdWUgdG8gJXNcbiIsIG5hbWUsCisJCQkgICAgICAgU1RwLT5oZWFkZXJfY2FjaGUgPT0gTlVMTD8ibGFjayBvZiBoZWFkZXIgY2FjaGUiOiJjb3VudCBvdXQgb2YgcmFuZ2UiKTsKKwkJZWxzZQorCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRmlsZW1hcmsgbG9va3VwOiBwcmV2IG1hcmsgJWQgKCVzKSwgc2tpcCAlZCB0byAlZFxuIiwKKwkJCQluYW1lLCBjbnQsCisJCQkJKChjbnQgPT0gLTEgJiYgbnRvaGwoU1RwLT5idWZmZXItPmF1eC0+bGFzdF9tYXJrX3Bwb3MpID09IC0xKSB8fAorCQkJCSAoU1RwLT5oZWFkZXJfY2FjaGUtPmRhdF9mbV90YWIuZm1fdGFiX2VudFtjbnQtMV0gPT0KKwkJCQkJIFNUcC0+YnVmZmVyLT5hdXgtPmxhc3RfbWFya19wcG9zKSk/Im1hdGNoIjoiZXJyb3IiLAorCQkJICAgICAgIG10X2NvdW50LCBsYXN0X21hcmtfcHBvcyk7CisjZW5kaWYKKwkJaWYgKGxhc3RfbWFya19wcG9zID4gMTAgJiYgbGFzdF9tYXJrX3Bwb3MgPCBTVHAtPmVvZF9mcmFtZV9wcG9zKSB7CisJCQlvc3N0X3Bvc2l0aW9uX3RhcGVfYW5kX2NvbmZpcm0oU1RwLCBhU1JwbnQsIGxhc3RfbWFya19wcG9zKTsKKwkJCWlmIChvc3N0X2dldF9sb2dpY2FsX2ZyYW1lKFNUcCwgYVNScG50LCAtMSwgMCkgPCAwKSB7CisjaWYgREVCVUcKKwkJCQlwcmludGsoT1NTVF9ERUJfTVNHIAorCQkJCQkiJXM6RDogQ291bGRuJ3QgZ2V0IGxvZ2ljYWwgYmxrIG51bSBpbiBzcGFjZV9maWxlbWFya3NcbiIsIG5hbWUpOworI2VuZGlmCisJCQkJcmV0dXJuICgtRUlPKTsKKwkJCX0KKwkJCWlmIChTVHAtPmJ1ZmZlci0+YXV4LT5mcmFtZV90eXBlICE9IE9TX0ZSQU1FX1RZUEVfTUFSS0VSKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6VzogRXhwZWN0ZWQgdG8gZmluZCBtYXJrZXIgYXQgcHBvcyAlZCwgbm90IGZvdW5kXG4iLAorCQkJCQkJIG5hbWUsIGxhc3RfbWFya19wcG9zKTsKKwkJCQlyZXR1cm4gKC1FSU8pOworCQkJfQorCQkJZ290byBmb3VuZDsKKwkJfQorI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFJldmVydGluZyB0byBzY2FuIGZpbGVtYXJrIGJhY2t3YXJkc1xuIiwgbmFtZSk7CisjZW5kaWYKKwl9CisJY250ID0gMDsKKwl3aGlsZSAoY250ICE9IG10X2NvdW50KSB7CisJCWxhc3RfbWFya19wcG9zID0gbnRvaGwoU1RwLT5idWZmZXItPmF1eC0+bGFzdF9tYXJrX3Bwb3MpOworCQlpZiAobGFzdF9tYXJrX3Bwb3MgPT0gLTEpCisJCQlyZXR1cm4gKC1FSU8pOworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFBvc2l0aW9uaW5nIHRvIGxhc3QgbWFyayBhdCAlZFxuIiwgbmFtZSwgbGFzdF9tYXJrX3Bwb3MpOworI2VuZGlmCisJCW9zc3RfcG9zaXRpb25fdGFwZV9hbmRfY29uZmlybShTVHAsIGFTUnBudCwgbGFzdF9tYXJrX3Bwb3MpOworCQljbnQrKzsKKwkJaWYgKG9zc3RfZ2V0X2xvZ2ljYWxfZnJhbWUoU1RwLCBhU1JwbnQsIC0xLCAwKSA8IDApIHsKKyNpZiBERUJVRworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQ291bGRuJ3QgZ2V0IGxvZ2ljYWwgYmxrIG51bSBpbiBzcGFjZV9maWxlbWFya3NcbiIsIG5hbWUpOworI2VuZGlmCisJCQlyZXR1cm4gKC1FSU8pOworCQl9CisJCWlmIChTVHAtPmJ1ZmZlci0+YXV4LT5mcmFtZV90eXBlICE9IE9TX0ZSQU1FX1RZUEVfTUFSS0VSKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpXOiBFeHBlY3RlZCB0byBmaW5kIG1hcmtlciBhdCBwcG9zICVkLCBub3QgZm91bmRcbiIsCisJCQkJCSBuYW1lLCBsYXN0X21hcmtfcHBvcyk7CisJCQlyZXR1cm4gKC1FSU8pOworCQl9CisJfQorZm91bmQ6CisJaWYgKG10X29wID09IE1UQlNGTSkgeworCQlTVHAtPmZyYW1lX3NlcV9udW1iZXIrKzsKKwkJU1RwLT5mcmFtZV9pbl9idWZmZXIgICAgICA9IDA7CisJCVNUcC0+YnVmZmVyLT5idWZmZXJfYnl0ZXMgPSAwOworCQlTVHAtPmJ1ZmZlci0+cmVhZF9wb2ludGVyID0gMDsKKwkJU1RwLT5sb2dpY2FsX2Jsa19udW0gICAgICs9IG50b2hzKFNUcC0+YnVmZmVyLT5hdXgtPmRhdC5kYXRfbGlzdFswXS5ibGtfY250KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBRFJMIDEuMSBjb21wYXRpYmxlICJzbG93IiBzcGFjZSBmaWxlbWFya3MgZndkIHZlcnNpb24KKyAqCisgKiBKdXN0IHNjYW5zIGZvciB0aGUgZmlsZW1hcmsgc2VxdWVudGlhbGx5LgorICovCitzdGF0aWMgaW50IG9zc3Rfc3BhY2Vfb3Zlcl9maWxlbWFya3NfZm9yd2FyZF9zbG93KHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LAorCQkJCQkJCQkgICAgIGludCBtdF9vcCwgaW50IG10X2NvdW50KQoreworCWludAljbnQgPSAwOworI2lmIERFQlVHCisJY2hhciAgKiBuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBSZWFjaGVkIHNwYWNlX292ZXJfZmlsZW1hcmtzX2ZvcndhcmRfc2xvdyAlZCAlZFxuIiwgbmFtZSwgbXRfb3AsIG10X2NvdW50KTsKKyNlbmRpZgorCWlmIChvc3N0X2dldF9sb2dpY2FsX2ZyYW1lKFNUcCwgYVNScG50LCAtMSwgMCkgPCAwKSB7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQ291bGRuJ3QgZ2V0IGxvZ2ljYWwgYmxrIG51bSBpbiBzcGFjZV9maWxlbWFya3NfZndkXG4iLCBuYW1lKTsKKyNlbmRpZgorCQlyZXR1cm4gKC1FSU8pOworCX0KKwl3aGlsZSAoMSkgeworCQlpZiAob3NzdF9nZXRfbG9naWNhbF9mcmFtZShTVHAsIGFTUnBudCwgLTEsIDApIDwgMCkgeworI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBDb3VsZG4ndCBnZXQgbG9naWNhbCBibGsgbnVtIGluIHNwYWNlX2ZpbGVtYXJrc1xuIiwgbmFtZSk7CisjZW5kaWYKKwkJCXJldHVybiAoLUVJTyk7CisJCX0KKwkJaWYgKFNUcC0+YnVmZmVyLT5hdXgtPmZyYW1lX3R5cGUgPT0gT1NfRlJBTUVfVFlQRV9NQVJLRVIpCisJCQljbnQrKzsKKwkJaWYgKFNUcC0+YnVmZmVyLT5hdXgtPmZyYW1lX3R5cGUgPT0gT1NfRlJBTUVfVFlQRV9FT0QpIHsKKyNpZiBERUJVRworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogc3BhY2VfZndkOiBFT0QgcmVhY2hlZFxuIiwgbmFtZSk7CisjZW5kaWYKKwkJCWlmIChTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uID4gU1RwLT5lb2RfZnJhbWVfcHBvcysxKSB7CisjaWYgREVCVUcKKwkJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBFT0QgcG9zaXRpb24gY29ycmVjdGVkICglZD0+JWQpXG4iLAorCQkJCQkgICAgICAgCW5hbWUsIFNUcC0+ZW9kX2ZyYW1lX3Bwb3MsIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24tMSk7CisjZW5kaWYKKwkJCQlTVHAtPmVvZF9mcmFtZV9wcG9zID0gU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbi0xOworCQkJfQorCQkJcmV0dXJuICgtRUlPKTsKKwkJfQorCQlpZiAoY250ID09IG10X2NvdW50KQorCQkJYnJlYWs7CisJCVNUcC0+ZnJhbWVfaW5fYnVmZmVyID0gMDsKKwl9CisJaWYgKG10X29wID09IE1URlNGKSB7CisJCVNUcC0+ZnJhbWVfc2VxX251bWJlcisrOworCQlTVHAtPmZyYW1lX2luX2J1ZmZlciAgICAgID0gMDsKKwkJU1RwLT5idWZmZXItPmJ1ZmZlcl9ieXRlcyA9IDA7CisJCVNUcC0+YnVmZmVyLT5yZWFkX3BvaW50ZXIgPSAwOworCQlTVHAtPmxvZ2ljYWxfYmxrX251bSAgICAgKz0gbnRvaHMoU1RwLT5idWZmZXItPmF1eC0+ZGF0LmRhdF9saXN0WzBdLmJsa19jbnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZhc3QgbGludXggc3BlY2lmaWMgdmVyc2lvbiBvZiBPblN0cmVhbSBGU0YKKyAqLworc3RhdGljIGludCBvc3N0X3NwYWNlX292ZXJfZmlsZW1hcmtzX2ZvcndhcmRfZmFzdChzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCwKKwkJCQkJCQkJICAgICBpbnQgbXRfb3AsIGludCBtdF9jb3VudCkKK3sKKwljaGFyICAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKwlpbnQJY250ICA9IDAsCisJCW5leHRfbWFya19wcG9zID0gLTE7CisKKyNpZiBERUJVRworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFJlYWNoZWQgc3BhY2Vfb3Zlcl9maWxlbWFya3NfZm9yd2FyZF9mYXN0ICVkICVkXG4iLCBuYW1lLCBtdF9vcCwgbXRfY291bnQpOworI2VuZGlmCisJaWYgKG9zc3RfZ2V0X2xvZ2ljYWxfZnJhbWUoU1RwLCBhU1JwbnQsIC0xLCAwKSA8IDApIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBDb3VsZG4ndCBnZXQgbG9naWNhbCBibGsgbnVtIGluIHNwYWNlX2ZpbGVtYXJrc19md2RcbiIsIG5hbWUpOworI2VuZGlmCisJCXJldHVybiAoLUVJTyk7CisJfQorCisJaWYgKFNUcC0+bGludXhfbWVkaWFfdmVyc2lvbiA+PSA0KSB7CisJCS8qCisJCSAqIGRpcmVjdCBsb29rdXAgaW4gaGVhZGVyIGZpbGVtYXJrIGxpc3QKKwkJICovCisJCWNudCA9IG50b2hsKFNUcC0+YnVmZmVyLT5hdXgtPmZpbGVtYXJrX2NudCkgLSAxOworCQlpZiAoU1RwLT5oZWFkZXJfb2sgICAgICAgICAgICAgICAgICAgICAgICAgJiYgCisJCSAgICBTVHAtPmhlYWRlcl9jYWNoZSAhPSBOVUxMICAgICAgICAgICAgICAmJgorCQkgICAgKGNudCArIG10X2NvdW50KSAgIDwgT1NfRk1fVEFCX01BWCAgICAgJiYKKwkJICAgIChjbnQgKyBtdF9jb3VudCkgICA8IFNUcC0+ZmlsZW1hcmtfY250ICYmCisJCSAgICAoKGNudCA9PSAtMSAmJiBudG9obChTVHAtPmJ1ZmZlci0+YXV4LT5sYXN0X21hcmtfcHBvcykgPT0gLTEpIHx8CisJCSAgICAgKFNUcC0+aGVhZGVyX2NhY2hlLT5kYXRfZm1fdGFiLmZtX3RhYl9lbnRbY250XSA9PSBTVHAtPmJ1ZmZlci0+YXV4LT5sYXN0X21hcmtfcHBvcykpKQorCisJCQluZXh0X21hcmtfcHBvcyA9IG50b2hsKFNUcC0+aGVhZGVyX2NhY2hlLT5kYXRfZm1fdGFiLmZtX3RhYl9lbnRbY250ICsgbXRfY291bnRdKTsKKyNpZiBERUJVRworCQlpZiAoU1RwLT5oZWFkZXJfY2FjaGUgPT0gTlVMTCB8fCAoY250ICsgbXRfY291bnQpID49IE9TX0ZNX1RBQl9NQVgpCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBGaWxlbWFyayBsb29rdXAgZmFpbCBkdWUgdG8gJXNcbiIsIG5hbWUsCisJCQkgICAgICAgU1RwLT5oZWFkZXJfY2FjaGUgPT0gTlVMTD8ibGFjayBvZiBoZWFkZXIgY2FjaGUiOiJjb3VudCBvdXQgb2YgcmFuZ2UiKTsKKwkJZWxzZQorCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRmlsZW1hcmsgbG9va3VwOiBwcmV2IG1hcmsgJWQgKCVzKSwgc2tpcCAlZCB0byAlZFxuIiwKKwkJCSAgICAgICBuYW1lLCBjbnQsCisJCQkgICAgICAgKChjbnQgPT0gLTEgJiYgbnRvaGwoU1RwLT5idWZmZXItPmF1eC0+bGFzdF9tYXJrX3Bwb3MpID09IC0xKSB8fAorCQkJCShTVHAtPmhlYWRlcl9jYWNoZS0+ZGF0X2ZtX3RhYi5mbV90YWJfZW50W2NudF0gPT0KKwkJCQkJIFNUcC0+YnVmZmVyLT5hdXgtPmxhc3RfbWFya19wcG9zKSk/Im1hdGNoIjoiZXJyb3IiLAorCQkJICAgICAgIG10X2NvdW50LCBuZXh0X21hcmtfcHBvcyk7CisjZW5kaWYKKwkJaWYgKG5leHRfbWFya19wcG9zIDw9IDEwIHx8IG5leHRfbWFya19wcG9zID4gU1RwLT5lb2RfZnJhbWVfcHBvcykgeworI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBSZXZlcnRpbmcgdG8gc2xvdyBmaWxlbWFyayBzcGFjZVxuIiwgbmFtZSk7CisjZW5kaWYKKwkJCXJldHVybiBvc3N0X3NwYWNlX292ZXJfZmlsZW1hcmtzX2ZvcndhcmRfc2xvdyhTVHAsIGFTUnBudCwgbXRfb3AsIG10X2NvdW50KTsKKwkJfSBlbHNlIHsKKwkJCW9zc3RfcG9zaXRpb25fdGFwZV9hbmRfY29uZmlybShTVHAsIGFTUnBudCwgbmV4dF9tYXJrX3Bwb3MpOworCQkJaWYgKG9zc3RfZ2V0X2xvZ2ljYWxfZnJhbWUoU1RwLCBhU1JwbnQsIC0xLCAwKSA8IDApIHsKKyNpZiBERUJVRworCQkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IENvdWxkbid0IGdldCBsb2dpY2FsIGJsayBudW0gaW4gc3BhY2VfZmlsZW1hcmtzXG4iLAorCQkJCQkJIG5hbWUpOworI2VuZGlmCisJCQkJcmV0dXJuICgtRUlPKTsKKwkJCX0KKwkJCWlmIChTVHAtPmJ1ZmZlci0+YXV4LT5mcmFtZV90eXBlICE9IE9TX0ZSQU1FX1RZUEVfTUFSS0VSKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6VzogRXhwZWN0ZWQgdG8gZmluZCBtYXJrZXIgYXQgcHBvcyAlZCwgbm90IGZvdW5kXG4iLAorCQkJCQkJIG5hbWUsIG5leHRfbWFya19wcG9zKTsKKwkJCQlyZXR1cm4gKC1FSU8pOworCQkJfQorCQkJaWYgKG50b2hsKFNUcC0+YnVmZmVyLT5hdXgtPmZpbGVtYXJrX2NudCkgIT0gY250ICsgbXRfY291bnQpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpXOiBFeHBlY3RlZCB0byBmaW5kIG1hcmtlciAlZCBhdCBwcG9zICVkLCBub3QgJWRcbiIsCisJCQkJCQkgbmFtZSwgY250K210X2NvdW50LCBuZXh0X21hcmtfcHBvcywKKwkJCQkJCSBudG9obChTVHAtPmJ1ZmZlci0+YXV4LT5maWxlbWFya19jbnQpKTsKKyAgICAgICAJCQkJcmV0dXJuICgtRUlPKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIEZpbmQgbmVhcmVzdCAodXN1YWxseSBwcmV2aW91cykgbWFya2VyLCB0aGVuIGp1bXAgZnJvbSBtYXJrZXIgdG8gbWFya2VyCisJCSAqLworCQl3aGlsZSAoMSkgeworCQkJaWYgKFNUcC0+YnVmZmVyLT5hdXgtPmZyYW1lX3R5cGUgPT0gT1NfRlJBTUVfVFlQRV9NQVJLRVIpCisJCQkJYnJlYWs7CisJCQlpZiAoU1RwLT5idWZmZXItPmF1eC0+ZnJhbWVfdHlwZSA9PSBPU19GUkFNRV9UWVBFX0VPRCkgeworI2lmIERFQlVHCisJCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogc3BhY2VfZndkOiBFT0QgcmVhY2hlZFxuIiwgbmFtZSk7CisjZW5kaWYKKwkJCQlyZXR1cm4gKC1FSU8pOworCQkJfQorCQkJaWYgKG50b2hsKFNUcC0+YnVmZmVyLT5hdXgtPmZpbGVtYXJrX2NudCkgPT0gMCkgeworCQkJCWlmIChTVHAtPmZpcnN0X21hcmtfcHBvcyA9PSAtMSkgeworI2lmIERFQlVHCisJCQkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFJldmVydGluZyB0byBzbG93IGZpbGVtYXJrIHNwYWNlXG4iLCBuYW1lKTsKKyNlbmRpZgorCQkJCQlyZXR1cm4gb3NzdF9zcGFjZV9vdmVyX2ZpbGVtYXJrc19mb3J3YXJkX3Nsb3coU1RwLCBhU1JwbnQsIG10X29wLCBtdF9jb3VudCk7CisJCQkJfQorCQkJCW9zc3RfcG9zaXRpb25fdGFwZV9hbmRfY29uZmlybShTVHAsIGFTUnBudCwgU1RwLT5maXJzdF9tYXJrX3Bwb3MpOworCQkJCWlmIChvc3N0X2dldF9sb2dpY2FsX2ZyYW1lKFNUcCwgYVNScG50LCAtMSwgMCkgPCAwKSB7CisjaWYgREVCVUcKKwkJCQkJcHJpbnRrKE9TU1RfREVCX01TRworCQkJCQkgICAgICAgIiVzOkQ6IENvdWxkbid0IGdldCBsb2dpY2FsIGJsayBudW0gaW4gc3BhY2VfZmlsZW1hcmtzX2Z3ZF9mYXN0XG4iLAorCQkJCQkgICAgICAgbmFtZSk7CisjZW5kaWYKKwkJCQkJcmV0dXJuICgtRUlPKTsKKwkJCQl9CisJCQkJaWYgKFNUcC0+YnVmZmVyLT5hdXgtPmZyYW1lX3R5cGUgIT0gT1NfRlJBTUVfVFlQRV9NQVJLRVIpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6VzogRXhwZWN0ZWQgdG8gZmluZCBmaWxlbWFyayBhdCAlZFxuIiwKKwkJCQkJCQkgbmFtZSwgU1RwLT5maXJzdF9tYXJrX3Bwb3MpOworCQkJCQlyZXR1cm4gKC1FSU8pOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKG9zc3Rfc3BhY2Vfb3Zlcl9maWxlbWFya3NfYmFja3dhcmQoU1RwLCBhU1JwbnQsIE1UQlNGLCAxKSA8IDApCisJCQkJCXJldHVybiAoLUVJTyk7CisJCQkJbXRfY291bnQrKzsKKwkJCX0KKwkJfQorCQljbnQrKzsKKwkJd2hpbGUgKGNudCAhPSBtdF9jb3VudCkgeworCQkJbmV4dF9tYXJrX3Bwb3MgPSBudG9obChTVHAtPmJ1ZmZlci0+YXV4LT5uZXh0X21hcmtfcHBvcyk7CisJCQlpZiAoIW5leHRfbWFya19wcG9zIHx8IG5leHRfbWFya19wcG9zID4gU1RwLT5lb2RfZnJhbWVfcHBvcykgeworI2lmIERFQlVHCisJCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmV2ZXJ0aW5nIHRvIHNsb3cgZmlsZW1hcmsgc3BhY2VcbiIsIG5hbWUpOworI2VuZGlmCisJCQkJcmV0dXJuIG9zc3Rfc3BhY2Vfb3Zlcl9maWxlbWFya3NfZm9yd2FyZF9zbG93KFNUcCwgYVNScG50LCBtdF9vcCwgbXRfY291bnQgLSBjbnQpOworCQkJfQorI2lmIERFQlVHCisJCQllbHNlIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFBvc2l0aW9uaW5nIHRvIG5leHQgbWFyayBhdCAlZFxuIiwgbmFtZSwgbmV4dF9tYXJrX3Bwb3MpOworI2VuZGlmCisJCQlvc3N0X3Bvc2l0aW9uX3RhcGVfYW5kX2NvbmZpcm0oU1RwLCBhU1JwbnQsIG5leHRfbWFya19wcG9zKTsKKwkJCWNudCsrOworCQkJaWYgKG9zc3RfZ2V0X2xvZ2ljYWxfZnJhbWUoU1RwLCBhU1JwbnQsIC0xLCAwKSA8IDApIHsKKyNpZiBERUJVRworCQkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IENvdWxkbid0IGdldCBsb2dpY2FsIGJsayBudW0gaW4gc3BhY2VfZmlsZW1hcmtzXG4iLAorCQkJCQkJIG5hbWUpOworI2VuZGlmCisJCQkJcmV0dXJuICgtRUlPKTsKKwkJCX0KKwkJCWlmIChTVHAtPmJ1ZmZlci0+YXV4LT5mcmFtZV90eXBlICE9IE9TX0ZSQU1FX1RZUEVfTUFSS0VSKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6VzogRXhwZWN0ZWQgdG8gZmluZCBtYXJrZXIgYXQgcHBvcyAlZCwgbm90IGZvdW5kXG4iLAorCQkJCQkJIG5hbWUsIG5leHRfbWFya19wcG9zKTsKKwkJCQlyZXR1cm4gKC1FSU8pOworCQkJfQorCQl9CisJfQorCWlmIChtdF9vcCA9PSBNVEZTRikgeworCQlTVHAtPmZyYW1lX3NlcV9udW1iZXIrKzsKKwkJU1RwLT5mcmFtZV9pbl9idWZmZXIgICAgICA9IDA7CisJCVNUcC0+YnVmZmVyLT5idWZmZXJfYnl0ZXMgPSAwOworCQlTVHAtPmJ1ZmZlci0+cmVhZF9wb2ludGVyID0gMDsKKwkJU1RwLT5sb2dpY2FsX2Jsa19udW0gICAgICs9IG50b2hzKFNUcC0+YnVmZmVyLT5hdXgtPmRhdC5kYXRfbGlzdFswXS5ibGtfY250KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbiBkZWJ1ZyBtb2RlLCB3ZSB3YW50IHRvIHNlZSBhcyBtYW55IGVycm9ycyBhcyBwb3NzaWJsZQorICogdG8gdGVzdCB0aGUgZXJyb3IgcmVjb3ZlcnkgbWVjaGFuaXNtLgorICovCisjaWYgREVCVUcKK3N0YXRpYyB2b2lkIG9zc3Rfc2V0X3JldHJpZXMoc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsIGludCByZXRyaWVzKQoreworCXVuc2lnbmVkIGNoYXIJCWNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICAgKiBTUnBudCAgPSAqIGFTUnBudDsKKwljaGFyCQkgICAgICAqIG5hbWUgICA9IHRhcGVfbmFtZShTVHApOworCisJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJY21kWzBdID0gTU9ERV9TRUxFQ1Q7CisJY21kWzFdID0gMHgxMDsKKwljbWRbNF0gPSBOVU1CRVJfUkVUUklFU19QQUdFX0xFTkdUSCArIE1PREVfSEVBREVSX0xFTkdUSDsKKworCShTVHAtPmJ1ZmZlciktPmJfZGF0YVswXSA9IGNtZFs0XSAtIDE7CisJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzFdID0gMDsJCQkvKiBNZWRpdW0gVHlwZSAtIGlnbm9yaW5nICovCisJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzJdID0gMDsJCQkvKiBSZXNlcnZlZCAqLworCShTVHAtPmJ1ZmZlciktPmJfZGF0YVszXSA9IDA7CQkJLyogQmxvY2sgRGVzY3JpcHRvciBMZW5ndGggKi8KKwkoU1RwLT5idWZmZXIpLT5iX2RhdGFbTU9ERV9IRUFERVJfTEVOR1RIICsgMF0gPSBOVU1CRVJfUkVUUklFU19QQUdFIHwgKDEgPDwgNyk7CisJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArIDFdID0gMjsKKwkoU1RwLT5idWZmZXIpLT5iX2RhdGFbTU9ERV9IRUFERVJfTEVOR1RIICsgMl0gPSA0OworCShTVHAtPmJ1ZmZlciktPmJfZGF0YVtNT0RFX0hFQURFUl9MRU5HVEggKyAzXSA9IHJldHJpZXM7CisKKwlpZiAoZGVidWdnaW5nKQorCSAgICBwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTZXR0aW5nIG51bWJlciBvZiByZXRyaWVzIG9uIE9uU3RyZWFtIHRhcGUgdG8gJWRcbiIsIG5hbWUsIHJldHJpZXMpOworCisJU1JwbnQgPSBvc3N0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCBjbWRbNF0sIERNQV9UT19ERVZJQ0UsIFNUcC0+dGltZW91dCwgMCwgMSk7CisJKmFTUnBudCA9IFNScG50OworCisJaWYgKChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0KQorCSAgICBwcmludGsgKEtFUk5fRVJSICIlczpEOiBDb3VsZG4ndCBzZXQgcmV0cmllcyB0byAlZFxuIiwgbmFtZSwgcmV0cmllcyk7Cit9CisjZW5kaWYKKworCitzdGF0aWMgaW50IG9zc3Rfd3JpdGVfZmlsZW1hcmsoc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQpCit7CisJaW50CXJlc3VsdDsKKwlpbnQJdGhpc19tYXJrX3Bwb3MgPSBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uOworCWludAl0aGlzX21hcmtfbGJuICA9IFNUcC0+bG9naWNhbF9ibGtfbnVtOworI2lmIERFQlVHCisJY2hhciAgKiBuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisjZW5kaWYKKworCWlmIChTVHAtPnJhdykgcmV0dXJuIDA7CisKKwlTVHAtPndyaXRlX3R5cGUgPSBPU19XUklURV9ORVdfTUFSSzsKKyNpZiBERUJVRworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFdyaXRpbmcgRmlsZW1hcmsgJWkgYXQgZnBwb3MgJWQgKGZzZXEgJWQsIGxibGsgJWQpXG4iLCAKKwkgICAgICAgbmFtZSwgU1RwLT5maWxlbWFya19jbnQsIHRoaXNfbWFya19wcG9zLCBTVHAtPmZyYW1lX3NlcV9udW1iZXIsIHRoaXNfbWFya19sYm4pOworI2VuZGlmCisJU1RwLT5kaXJ0eSA9IDE7CisJcmVzdWx0ICA9IG9zc3RfZmx1c2hfd3JpdGVfYnVmZmVyKFNUcCwgYVNScG50KTsKKwlyZXN1bHQgfD0gb3NzdF9mbHVzaF9kcml2ZV9idWZmZXIoU1RwLCBhU1JwbnQpOworCVNUcC0+bGFzdF9tYXJrX3Bwb3MgPSB0aGlzX21hcmtfcHBvczsKKwlTVHAtPmxhc3RfbWFya19sYm4gID0gdGhpc19tYXJrX2xibjsKKwlpZiAoU1RwLT5oZWFkZXJfY2FjaGUgIT0gTlVMTCAmJiBTVHAtPmZpbGVtYXJrX2NudCA8IE9TX0ZNX1RBQl9NQVgpCisJCVNUcC0+aGVhZGVyX2NhY2hlLT5kYXRfZm1fdGFiLmZtX3RhYl9lbnRbU1RwLT5maWxlbWFya19jbnRdID0gaHRvbmwodGhpc19tYXJrX3Bwb3MpOworCWlmIChTVHAtPmZpbGVtYXJrX2NudCsrID09IDApCisJCVNUcC0+Zmlyc3RfbWFya19wcG9zID0gdGhpc19tYXJrX3Bwb3M7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBvc3N0X3dyaXRlX2VvZChzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCkKK3sKKwlpbnQJcmVzdWx0OworI2lmIERFQlVHCisJY2hhciAgKiBuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisjZW5kaWYKKworCWlmIChTVHAtPnJhdykgcmV0dXJuIDA7CisKKwlTVHAtPndyaXRlX3R5cGUgPSBPU19XUklURV9FT0Q7CisJU1RwLT5lb2RfZnJhbWVfcHBvcyA9IFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb247CisjaWYgREVCVUcKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBXcml0aW5nIEVPRCBhdCBmcHBvcyAlZCAoZnNlcSAlZCwgbGJsayAlZClcbiIsIG5hbWUsCisJCQlTVHAtPmVvZF9mcmFtZV9wcG9zLCBTVHAtPmZyYW1lX3NlcV9udW1iZXIsIFNUcC0+bG9naWNhbF9ibGtfbnVtKTsKKyNlbmRpZgorCVNUcC0+ZGlydHkgPSAxOworCisJcmVzdWx0ICA9IG9zc3RfZmx1c2hfd3JpdGVfYnVmZmVyKFNUcCwgYVNScG50KTsJCisJcmVzdWx0IHw9IG9zc3RfZmx1c2hfZHJpdmVfYnVmZmVyKFNUcCwgYVNScG50KTsKKwlTVHAtPmVvZF9mcmFtZV9sZmEgPSAtLShTVHAtPmZyYW1lX3NlcV9udW1iZXIpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgb3NzdF93cml0ZV9maWxsZXIoc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsIGludCB3aGVyZSwgaW50IGNvdW50KQoreworCWNoYXIgKiBuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisKKyNpZiBERUJVRworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFJlYWNoZWQgb25zdHJlYW0gd3JpdGUgZmlsbGVyIGdyb3VwICVkXG4iLCBuYW1lLCB3aGVyZSk7CisjZW5kaWYKKwlvc3N0X3dhaXRfcmVhZHkoU1RwLCBhU1JwbnQsIDYwICogNSwgMCk7CisJb3NzdF9zZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQsIHdoZXJlLCAwKTsKKwlTVHAtPndyaXRlX3R5cGUgPSBPU19XUklURV9GSUxMRVI7CisJd2hpbGUgKGNvdW50LS0pIHsKKwkJbWVtY3B5KFNUcC0+YnVmZmVyLT5iX2RhdGEsICJGaWxsZXIiLCA2KTsKKwkJU1RwLT5idWZmZXItPmJ1ZmZlcl9ieXRlcyA9IDY7CisJCVNUcC0+ZGlydHkgPSAxOworCQlpZiAob3NzdF9mbHVzaF93cml0ZV9idWZmZXIoU1RwLCBhU1JwbnQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczpJOiBDb3VsZG4ndCB3cml0ZSBmaWxsZXIgZnJhbWVcbiIsIG5hbWUpOworCQkJcmV0dXJuICgtRUlPKTsKKwkJfQorCX0KKyNpZiBERUJVRworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEV4aXRpbmcgb25zdHJlYW0gd3JpdGUgZmlsbGVyIGdyb3VwXG4iLCBuYW1lKTsKKyNlbmRpZgorCXJldHVybiBvc3N0X2ZsdXNoX2RyaXZlX2J1ZmZlcihTVHAsIGFTUnBudCk7Cit9CisKK3N0YXRpYyBpbnQgX19vc3N0X3dyaXRlX2hlYWRlcihzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCwgaW50IHdoZXJlLCBpbnQgY291bnQpCit7CisJY2hhciAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKwlpbnQgICAgIHJlc3VsdDsKKworI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmVhY2hlZCBvbnN0cmVhbSB3cml0ZSBoZWFkZXIgZ3JvdXAgJWRcbiIsIG5hbWUsIHdoZXJlKTsKKyNlbmRpZgorCW9zc3Rfd2FpdF9yZWFkeShTVHAsIGFTUnBudCwgNjAgKiA1LCAwKTsKKwlvc3N0X3NldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCwgd2hlcmUsIDApOworCVNUcC0+d3JpdGVfdHlwZSA9IE9TX1dSSVRFX0hFQURFUjsKKwl3aGlsZSAoY291bnQtLSkgeworCQlvc3N0X2NvcHlfdG9fYnVmZmVyKFNUcC0+YnVmZmVyLCAodW5zaWduZWQgY2hhciAqKVNUcC0+aGVhZGVyX2NhY2hlKTsKKwkJU1RwLT5idWZmZXItPmJ1ZmZlcl9ieXRlcyA9IHNpemVvZihvc19oZWFkZXJfdCk7CisJCVNUcC0+ZGlydHkgPSAxOworCQlpZiAob3NzdF9mbHVzaF93cml0ZV9idWZmZXIoU1RwLCBhU1JwbnQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczpJOiBDb3VsZG4ndCB3cml0ZSBoZWFkZXIgZnJhbWVcbiIsIG5hbWUpOworCQkJcmV0dXJuICgtRUlPKTsKKwkJfQorCX0KKwlyZXN1bHQgPSBvc3N0X2ZsdXNoX2RyaXZlX2J1ZmZlcihTVHAsIGFTUnBudCk7CisjaWYgREVCVUcKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBXcml0ZSBvbnN0cmVhbSBoZWFkZXIgZ3JvdXAgJXNcbiIsIG5hbWUsIHJlc3VsdD8iZmFpbGVkIjoiZG9uZSIpOworI2VuZGlmCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBvc3N0X3dyaXRlX2hlYWRlcihzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCwgaW50IGxvY2F0ZV9lb2QpCit7CisJb3NfaGVhZGVyX3QgKiBoZWFkZXI7CisJaW50CSAgICAgIHJlc3VsdDsKKwljaGFyICAgICAgICAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKworI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogV3JpdGluZyB0YXBlIGhlYWRlclxuIiwgbmFtZSk7CisjZW5kaWYKKwlpZiAoU1RwLT5yYXcpIHJldHVybiAwOworCisJaWYgKFNUcC0+aGVhZGVyX2NhY2hlID09IE5VTEwpIHsKKwkJaWYgKChTVHAtPmhlYWRlcl9jYWNoZSA9IChvc19oZWFkZXJfdCAqKXZtYWxsb2Moc2l6ZW9mKG9zX2hlYWRlcl90KSkpID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6RTogRmFpbGVkIHRvIGFsbG9jYXRlIGhlYWRlciBjYWNoZVxuIiwgbmFtZSk7CisJCQlyZXR1cm4gKC1FTk9NRU0pOworCQl9CisJCW1lbXNldChTVHAtPmhlYWRlcl9jYWNoZSwgMCwgc2l6ZW9mKG9zX2hlYWRlcl90KSk7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQWxsb2NhdGVkIGFuZCBjbGVhcmVkIG1lbW9yeSBmb3IgaGVhZGVyIGNhY2hlXG4iLCBuYW1lKTsKKyNlbmRpZgorCX0KKwlpZiAoU1RwLT5oZWFkZXJfb2spIFNUcC0+dXBkYXRlX2ZyYW1lX2NudHIrKzsKKwllbHNlICAgICAgICAgICAgICAgIFNUcC0+dXBkYXRlX2ZyYW1lX2NudHIgPSAwOworCisJaGVhZGVyID0gU1RwLT5oZWFkZXJfY2FjaGU7CisJc3RyY3B5KGhlYWRlci0+aWRlbnRfc3RyLCAiQURSX1NFUSIpOworCWhlYWRlci0+bWFqb3JfcmV2ICAgICAgPSAxOworCWhlYWRlci0+bWlub3JfcmV2ICAgICAgPSA0OworCWhlYWRlci0+ZXh0X3Rya190Yl9vZmYgPSBodG9ucygxNzE5Mik7CisJaGVhZGVyLT5wdF9wYXJfbnVtICAgICA9IDE7CisJaGVhZGVyLT5wYXJ0aXRpb25bMF0ucGFydGl0aW9uX251bSAgICAgICAgICAgICAgPSBPU19EQVRBX1BBUlRJVElPTjsKKwloZWFkZXItPnBhcnRpdGlvblswXS5wYXJfZGVzY192ZXIgICAgICAgICAgICAgICA9IE9TX1BBUlRJVElPTl9WRVJTSU9OOworCWhlYWRlci0+cGFydGl0aW9uWzBdLndydF9wYXNzX2NudHIgICAgICAgICAgICAgID0gaHRvbnMoU1RwLT53cnRfcGFzc19jbnRyKTsKKwloZWFkZXItPnBhcnRpdGlvblswXS5maXJzdF9mcmFtZV9wcG9zICAgICAgICAgICA9IGh0b25sKFNUcC0+Zmlyc3RfZGF0YV9wcG9zKTsKKwloZWFkZXItPnBhcnRpdGlvblswXS5sYXN0X2ZyYW1lX3Bwb3MgICAgICAgICAgICA9IGh0b25sKFNUcC0+Y2FwYWNpdHkpOworCWhlYWRlci0+cGFydGl0aW9uWzBdLmVvZF9mcmFtZV9wcG9zICAgICAgICAgICAgID0gaHRvbmwoU1RwLT5lb2RfZnJhbWVfcHBvcyk7CisJaGVhZGVyLT5jZmdfY29sX3dpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBodG9ubCgyMCk7CisJaGVhZGVyLT5kYXRfY29sX3dpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBodG9ubCgxNTAwKTsKKwloZWFkZXItPnFmYV9jb2xfd2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICA9IGh0b25sKDApOworCWhlYWRlci0+ZXh0X3RyYWNrX3RiLm5yX3N0cmVhbV9wYXJ0ICAgICAgICAgICAgID0gMTsKKwloZWFkZXItPmV4dF90cmFja190Yi5ldF9lbnRfc3ogICAgICAgICAgICAgICAgICA9IDMyOworCWhlYWRlci0+ZXh0X3RyYWNrX3RiLmRhdF9leHRfdHJrX2V5LmV0X3BhcnRfbnVtID0gMDsKKwloZWFkZXItPmV4dF90cmFja190Yi5kYXRfZXh0X3Rya19leS5mbXQgICAgICAgICA9IDE7CisJaGVhZGVyLT5leHRfdHJhY2tfdGIuZGF0X2V4dF90cmtfZXkuZm1fdGFiX29mZiAgPSBodG9ucygxNzczNik7CisJaGVhZGVyLT5leHRfdHJhY2tfdGIuZGF0X2V4dF90cmtfZXkubGFzdF9obGJfaGkgPSAwOworCWhlYWRlci0+ZXh0X3RyYWNrX3RiLmRhdF9leHRfdHJrX2V5Lmxhc3RfaGxiICAgID0gaHRvbmwoU1RwLT5lb2RfZnJhbWVfbGZhKTsKKwloZWFkZXItPmV4dF90cmFja190Yi5kYXRfZXh0X3Rya19leS5sYXN0X3BwCT0gaHRvbmwoU1RwLT5lb2RfZnJhbWVfcHBvcyk7CisJaGVhZGVyLT5kYXRfZm1fdGFiLmZtX3BhcnRfbnVtICAgICAgICAgICAgICAgICAgPSAwOworCWhlYWRlci0+ZGF0X2ZtX3RhYi5mbV90YWJfZW50X3N6ICAgICAgICAgICAgICAgID0gNDsKKwloZWFkZXItPmRhdF9mbV90YWIuZm1fdGFiX2VudF9jbnQgICAgICAgICAgICAgICA9IGh0b25zKFNUcC0+ZmlsZW1hcmtfY250PE9TX0ZNX1RBQl9NQVg/CisJCQkJCQkJCVNUcC0+ZmlsZW1hcmtfY250Ok9TX0ZNX1RBQl9NQVgpOworCisJcmVzdWx0ICA9IF9fb3NzdF93cml0ZV9oZWFkZXIoU1RwLCBhU1JwbnQsIDB4YmFlLCA1KTsKKwlpZiAoU1RwLT51cGRhdGVfZnJhbWVfY250ciA9PSAwKQorCQkgICAgb3NzdF93cml0ZV9maWxsZXIoU1RwLCBhU1JwbnQsIDB4YmIzLCA1KTsKKwlyZXN1bHQgJj0gX19vc3N0X3dyaXRlX2hlYWRlcihTVHAsIGFTUnBudCwgICAgIDUsIDUpOworCisJaWYgKGxvY2F0ZV9lb2QpIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBMb2NhdGluZyBiYWNrIHRvIGVvZCBmcmFtZSBhZGRyICVkXG4iLCBuYW1lLCBTVHAtPmVvZF9mcmFtZV9wcG9zKTsKKyNlbmRpZgorCQlvc3N0X3NldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCwgU1RwLT5lb2RfZnJhbWVfcHBvcywgMCk7CisJfQorCWlmIChyZXN1bHQpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6RTogV3JpdGUgaGVhZGVyIGZhaWxlZFxuIiwgbmFtZSk7CisJZWxzZSB7CisJCW1lbWNweShTVHAtPmFwcGxpY2F0aW9uX3NpZywgIkxJTjQiLCA0KTsKKwkJU1RwLT5saW51eF9tZWRpYSAgICAgICAgID0gMTsKKwkJU1RwLT5saW51eF9tZWRpYV92ZXJzaW9uID0gNDsKKwkJU1RwLT5oZWFkZXJfb2sgICAgICAgICAgID0gMTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBvc3N0X3Jlc2V0X2hlYWRlcihzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCkKK3sKKwlpZiAoU1RwLT5oZWFkZXJfY2FjaGUgIT0gTlVMTCkKKwkJbWVtc2V0KFNUcC0+aGVhZGVyX2NhY2hlLCAwLCBzaXplb2Yob3NfaGVhZGVyX3QpKTsKKworCVNUcC0+bG9naWNhbF9ibGtfbnVtID0gU1RwLT5mcmFtZV9zZXFfbnVtYmVyID0gMDsKKwlTVHAtPmZyYW1lX2luX2J1ZmZlciA9IDA7CisJU1RwLT5lb2RfZnJhbWVfcHBvcyA9IFNUcC0+Zmlyc3RfZGF0YV9wcG9zID0gMHgwMDAwMDAwQTsKKwlTVHAtPmZpbGVtYXJrX2NudCA9IDA7CisJU1RwLT5maXJzdF9tYXJrX3Bwb3MgPSBTVHAtPmxhc3RfbWFya19wcG9zID0gU1RwLT5sYXN0X21hcmtfbGJuID0gLTE7CisJcmV0dXJuIG9zc3Rfd3JpdGVfaGVhZGVyKFNUcCwgYVNScG50LCAxKTsKK30KKworc3RhdGljIGludCBfX29zc3RfYW5hbHl6ZV9oZWFkZXJzKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LCBpbnQgcHBvcykKK3sKKwljaGFyICAgICAgICAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKwlvc19oZWFkZXJfdCAqIGhlYWRlcjsKKwlvc19hdXhfdCAgICAqIGF1eDsKKwljaGFyICAgICAgICAgIGlkX3N0cmluZ1s4XTsKKwlpbnQJICAgICAgbGludXhfbWVkaWFfdmVyc2lvbiwKKwkJICAgICAgdXBkYXRlX2ZyYW1lX2NudHI7CisKKwlpZiAoU1RwLT5yYXcpCisJCXJldHVybiAxOworCisJaWYgKHBwb3MgPT0gNSB8fCBwcG9zID09IDB4YmFlIHx8IFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCkgeworCQlpZiAob3NzdF9zZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQsIHBwb3MsIDApKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6VzogQ291bGRuJ3QgcG9zaXRpb24gdGFwZVxuIiwgbmFtZSk7CisJCW9zc3Rfd2FpdF9yZWFkeShTVHAsIGFTUnBudCwgNjAgKiAxNSwgMCk7CisJCWlmIChvc3N0X2luaXRpYXRlX3JlYWQgKFNUcCwgYVNScG50KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6VzogQ291bGRuJ3QgaW5pdGlhdGUgcmVhZFxuIiwgbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAob3NzdF9yZWFkX2ZyYW1lKFNUcCwgYVNScG50LCAxODApKSB7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQ291bGRuJ3QgcmVhZCBoZWFkZXIgZnJhbWVcbiIsIG5hbWUpOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKwloZWFkZXIgPSAob3NfaGVhZGVyX3QgKikgU1RwLT5idWZmZXItPmJfZGF0YTsJLyogd2FybmluZzogb25seSBmaXJzdCBzZWdtZW50IGFkZHJlc3NhYmxlICovCisJYXV4ID0gU1RwLT5idWZmZXItPmF1eDsKKwlpZiAoYXV4LT5mcmFtZV90eXBlICE9IE9TX0ZSQU1FX1RZUEVfSEVBREVSKSB7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU2tpcHBpbmcgbm9uLWhlYWRlciBmcmFtZSAoJWQpXG4iLCBuYW1lLCBwcG9zKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisJaWYgKG50b2hsKGF1eC0+ZnJhbWVfc2VxX251bSkgICAgICAgICAgICAgICE9IDAgICAgICAgICAgICAgICAgICAgfHwKKwkgICAgbnRvaGwoYXV4LT5sb2dpY2FsX2Jsa19udW0pICAgICAgICAgICAgIT0gMCAgICAgICAgICAgICAgICAgICB8fAorCSAgICAgICAgICBhdXgtPnBhcnRpdGlvbi5wYXJ0aXRpb25fbnVtICAgICAhPSBPU19DT05GSUdfUEFSVElUSU9OIHx8CisJICAgIG50b2hsKGF1eC0+cGFydGl0aW9uLmZpcnN0X2ZyYW1lX3Bwb3MpICE9IDAgICAgICAgICAgICAgICAgICAgfHwKKwkgICAgbnRvaGwoYXV4LT5wYXJ0aXRpb24ubGFzdF9mcmFtZV9wcG9zKSAgIT0gMHhiYjcgICAgICAgICAgICAgICApIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBJbnZhbGlkIGhlYWRlciBmcmFtZSAoJWQsJWQsJWQsJWQsJWQpXG4iLCBuYW1lLAorCQkJCW50b2hsKGF1eC0+ZnJhbWVfc2VxX251bSksIG50b2hsKGF1eC0+bG9naWNhbF9ibGtfbnVtKSwKKwkJCSAgICAgICAJYXV4LT5wYXJ0aXRpb24ucGFydGl0aW9uX251bSwgbnRvaGwoYXV4LT5wYXJ0aXRpb24uZmlyc3RfZnJhbWVfcHBvcyksCisJCQkgICAgICAgCW50b2hsKGF1eC0+cGFydGl0aW9uLmxhc3RfZnJhbWVfcHBvcykpOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKwlpZiAoc3RybmNtcChoZWFkZXItPmlkZW50X3N0ciwgIkFEUl9TRVEiLCA3KSAhPSAwICYmCisJICAgIHN0cm5jbXAoaGVhZGVyLT5pZGVudF9zdHIsICJBRFItU0VRIiwgNykgIT0gMCkgeworCQlzdHJsY3B5KGlkX3N0cmluZywgaGVhZGVyLT5pZGVudF9zdHIsIDgpOworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEludmFsaWQgaGVhZGVyIGlkZW50aWZpY2F0aW9uIHN0cmluZyAlc1xuIiwgbmFtZSwgaWRfc3RyaW5nKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisJdXBkYXRlX2ZyYW1lX2NudHIgPSBudG9obChhdXgtPnVwZGF0ZV9mcmFtZV9jbnRyKTsKKwlpZiAodXBkYXRlX2ZyYW1lX2NudHIgPCBTVHAtPnVwZGF0ZV9mcmFtZV9jbnRyKSB7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU2tpcHBpbmcgZnJhbWUgJWQgd2l0aCB1cGRhdGVfZnJhbWVfY291bnRlciAlZDwlZFxuIiwKKwkJCQkgICBuYW1lLCBwcG9zLCB1cGRhdGVfZnJhbWVfY250ciwgU1RwLT51cGRhdGVfZnJhbWVfY250cik7CisjZW5kaWYKKwkJcmV0dXJuIDA7CisJfQorCWlmIChoZWFkZXItPm1ham9yX3JldiAhPSAxIHx8IGhlYWRlci0+bWlub3JfcmV2ICE9IDQgKSB7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogJXMgcmV2aXNpb24gJWQuJWQgZGV0ZWN0ZWQgKDEuNCBzdXBwb3J0ZWQpXG4iLCAKKwkJCQkgbmFtZSwgKGhlYWRlci0+bWFqb3JfcmV2ICE9IDEgfHwgaGVhZGVyLT5taW5vcl9yZXYgPCAyIHx8IAorCQkJCSAgICAgICBoZWFkZXItPm1pbm9yX3JldiAgPiA0ICk/ICJJbnZhbGlkIiA6ICJXYXJuaW5nOiIsCisJCQkJIGhlYWRlci0+bWFqb3JfcmV2LCBoZWFkZXItPm1pbm9yX3Jldik7CisjZW5kaWYKKwkJaWYgKGhlYWRlci0+bWFqb3JfcmV2ICE9IDEgfHwgaGVhZGVyLT5taW5vcl9yZXYgPCAyIHx8IGhlYWRlci0+bWlub3JfcmV2ID4gNCkKKwkJCXJldHVybiAwOworCX0KKyNpZiBERUJVRworCWlmIChoZWFkZXItPnB0X3Bhcl9udW0gIT0gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6VzogJWQgcGFydGl0aW9ucyBkZWZpbmVkLCBvbmx5IG9uZSBzdXBwb3J0ZWRcbiIsIAorCQkJCSBuYW1lLCBoZWFkZXItPnB0X3Bhcl9udW0pOworI2VuZGlmCisJbWVtY3B5KGlkX3N0cmluZywgYXV4LT5hcHBsaWNhdGlvbl9zaWcsIDQpOworCWlkX3N0cmluZ1s0XSA9IDA7CisJaWYgKG1lbWNtcChpZF9zdHJpbmcsICJMSU4iLCAzKSA9PSAwKSB7CisJCVNUcC0+bGludXhfbWVkaWEgPSAxOworCQlsaW51eF9tZWRpYV92ZXJzaW9uID0gaWRfc3RyaW5nWzNdIC0gJzAnOworCQlpZiAobGludXhfbWVkaWFfdmVyc2lvbiAhPSA0KQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6STogTGludXggbWVkaWEgdmVyc2lvbiAlZCBkZXRlY3RlZCAoY3VycmVudCA0KVxuIiwKKwkJCQkJIG5hbWUsIGxpbnV4X21lZGlhX3ZlcnNpb24pOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOlc6IE5vbiBMaW51eCBtZWRpYSBkZXRlY3RlZCAoJXMpXG4iLCBuYW1lLCBpZF9zdHJpbmcpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGxpbnV4X21lZGlhX3ZlcnNpb24gPCBTVHAtPmxpbnV4X21lZGlhX3ZlcnNpb24pIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTa2lwcGluZyBmcmFtZSAlZCB3aXRoIGxpbnV4X21lZGlhX3ZlcnNpb24gJWRcbiIsCisJCQkJICBuYW1lLCBwcG9zLCBsaW51eF9tZWRpYV92ZXJzaW9uKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisJaWYgKGxpbnV4X21lZGlhX3ZlcnNpb24gPiBTVHAtPmxpbnV4X21lZGlhX3ZlcnNpb24pIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBGcmFtZSAlZCBzZXRzIGxpbnV4X21lZGlhX3ZlcnNpb24gdG8gJWRcbiIsCisJCQkJICAgbmFtZSwgcHBvcywgbGludXhfbWVkaWFfdmVyc2lvbik7CisjZW5kaWYKKwkJbWVtY3B5KFNUcC0+YXBwbGljYXRpb25fc2lnLCBpZF9zdHJpbmcsIDUpOworCQlTVHAtPmxpbnV4X21lZGlhX3ZlcnNpb24gPSBsaW51eF9tZWRpYV92ZXJzaW9uOworCQlTVHAtPnVwZGF0ZV9mcmFtZV9jbnRyID0gLTE7CisJfQorCWlmICh1cGRhdGVfZnJhbWVfY250ciA+IFNUcC0+dXBkYXRlX2ZyYW1lX2NudHIpIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBGcmFtZSAlZCBzZXRzIHVwZGF0ZV9mcmFtZV9jb3VudGVyIHRvICVkXG4iLAorCQkJCSAgIG5hbWUsIHBwb3MsIHVwZGF0ZV9mcmFtZV9jbnRyKTsKKyNlbmRpZgorCQlpZiAoU1RwLT5oZWFkZXJfY2FjaGUgPT0gTlVMTCkgeworCQkJaWYgKChTVHAtPmhlYWRlcl9jYWNoZSA9IChvc19oZWFkZXJfdCAqKXZtYWxsb2Moc2l6ZW9mKG9zX2hlYWRlcl90KSkpID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOkU6IEZhaWxlZCB0byBhbGxvY2F0ZSBoZWFkZXIgY2FjaGVcbiIsIG5hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBBbGxvY2F0ZWQgbWVtb3J5IGZvciBoZWFkZXIgY2FjaGVcbiIsIG5hbWUpOworI2VuZGlmCisJCX0KKwkJb3NzdF9jb3B5X2Zyb21fYnVmZmVyKFNUcC0+YnVmZmVyLCAodW5zaWduZWQgY2hhciAqKVNUcC0+aGVhZGVyX2NhY2hlKTsKKwkJaGVhZGVyID0gU1RwLT5oZWFkZXJfY2FjaGU7CS8qIGZ1cnRoZXIgYWNjZXNzZXMgZnJvbSBjYWNoZWQgKGZ1bGwpIGNvcHkgKi8KKworCQlTVHAtPndydF9wYXNzX2NudHIgICAgID0gbnRvaHMoaGVhZGVyLT5wYXJ0aXRpb25bMF0ud3J0X3Bhc3NfY250cik7CisJCVNUcC0+Zmlyc3RfZGF0YV9wcG9zICAgPSBudG9obChoZWFkZXItPnBhcnRpdGlvblswXS5maXJzdF9mcmFtZV9wcG9zKTsKKwkJU1RwLT5lb2RfZnJhbWVfcHBvcyAgICA9IG50b2hsKGhlYWRlci0+cGFydGl0aW9uWzBdLmVvZF9mcmFtZV9wcG9zKTsKKwkJU1RwLT5lb2RfZnJhbWVfbGZhICAgICA9IG50b2hsKGhlYWRlci0+ZXh0X3RyYWNrX3RiLmRhdF9leHRfdHJrX2V5Lmxhc3RfaGxiKTsKKwkJU1RwLT5maWxlbWFya19jbnQgICAgICA9IG50b2hsKGF1eC0+ZmlsZW1hcmtfY250KTsKKwkJU1RwLT5maXJzdF9tYXJrX3Bwb3MgICA9IG50b2hsKGF1eC0+bmV4dF9tYXJrX3Bwb3MpOworCQlTVHAtPmxhc3RfbWFya19wcG9zICAgID0gbnRvaGwoYXV4LT5sYXN0X21hcmtfcHBvcyk7CisJCVNUcC0+bGFzdF9tYXJrX2xibiAgICAgPSBudG9obChhdXgtPmxhc3RfbWFya19sYm4pOworCQlTVHAtPnVwZGF0ZV9mcmFtZV9jbnRyID0gdXBkYXRlX2ZyYW1lX2NudHI7CisjaWYgREVCVUcKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBEZXRlY3RlZCB3cml0ZSBwYXNzICVkLCB1cGRhdGUgZnJhbWUgY291bnRlciAlZCwgZmlsZW1hcmsgY291bnRlciAlZFxuIiwKKwkJCSAgbmFtZSwgU1RwLT53cnRfcGFzc19jbnRyLCBTVHAtPnVwZGF0ZV9mcmFtZV9jbnRyLCBTVHAtPmZpbGVtYXJrX2NudCk7CisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogZmlyc3QgZGF0YSBmcmFtZSBvbiB0YXBlID0gJWQsIGxhc3QgPSAlZCwgZW9kIGZyYW1lID0gJWRcbiIsIG5hbWUsCisJCQkgIFNUcC0+Zmlyc3RfZGF0YV9wcG9zLAorCQkJICBudG9obChoZWFkZXItPnBhcnRpdGlvblswXS5sYXN0X2ZyYW1lX3Bwb3MpLAorCQkJICBudG9obChoZWFkZXItPnBhcnRpdGlvblswXS5lb2RfZnJhbWVfcHBvcykpOworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IGZpcnN0IG1hcmsgb24gdGFwZSA9ICVkLCBsYXN0ID0gJWQsIGVvZCBmcmFtZSA9ICVkXG4iLCAKKwkJCSAgbmFtZSwgU1RwLT5maXJzdF9tYXJrX3Bwb3MsIFNUcC0+bGFzdF9tYXJrX3Bwb3MsIFNUcC0+ZW9kX2ZyYW1lX3Bwb3MpOworI2VuZGlmCisJCWlmIChoZWFkZXItPm1pbm9yX3JldiA8IDQgJiYgU1RwLT5saW51eF9tZWRpYV92ZXJzaW9uID09IDQpIHsKKyNpZiBERUJVRworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogTW92aW5nIGZpbGVtYXJrIGxpc3QgdG8gQURSIDEuNCBsb2NhdGlvblxuIiwgbmFtZSk7CisjZW5kaWYKKwkJCW1lbWNweSgodm9pZCAqKWhlYWRlci0+ZGF0X2ZtX3RhYi5mbV90YWJfZW50LCAKKwkJCSAgICAgICAodm9pZCAqKWhlYWRlci0+b2xkX2ZpbGVtYXJrX2xpc3QsIHNpemVvZihoZWFkZXItPmRhdF9mbV90YWIuZm1fdGFiX2VudCkpOworCQkJbWVtc2V0KCh2b2lkICopaGVhZGVyLT5vbGRfZmlsZW1hcmtfbGlzdCwgMCwgc2l6ZW9mKGhlYWRlci0+b2xkX2ZpbGVtYXJrX2xpc3QpKTsKKwkJfQorCQlpZiAoaGVhZGVyLT5taW5vcl9yZXYgPT0gNCAgICYmCisJCSAgICAoaGVhZGVyLT5leHRfdHJrX3RiX29mZiAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gaHRvbnMoMTcxOTIpICAgICAgICAgICAgICAgfHwKKwkJICAgICBoZWFkZXItPnBhcnRpdGlvblswXS5wYXJ0aXRpb25fbnVtICAgICAgICAgICAgICAhPSBPU19EQVRBX1BBUlRJVElPTiAgICAgICAgICB8fAorCQkgICAgIGhlYWRlci0+cGFydGl0aW9uWzBdLnBhcl9kZXNjX3ZlciAgICAgICAgICAgICAgICE9IE9TX1BBUlRJVElPTl9WRVJTSU9OICAgICAgIHx8CisJCSAgICAgaGVhZGVyLT5wYXJ0aXRpb25bMF0ubGFzdF9mcmFtZV9wcG9zICAgICAgICAgICAgIT0gaHRvbmwoU1RwLT5jYXBhY2l0eSkgICAgICAgfHwKKwkJICAgICBoZWFkZXItPmNmZ19jb2xfd2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBodG9ubCgyMCkgICAgICAgICAgICAgICAgICB8fAorCQkgICAgIGhlYWRlci0+ZGF0X2NvbF93aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGh0b25sKDE1MDApICAgICAgICAgICAgICAgIHx8CisJCSAgICAgaGVhZGVyLT5xZmFfY29sX3dpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gaHRvbmwoMCkgICAgICAgICAgICAgICAgICAgfHwKKwkJICAgICBoZWFkZXItPmV4dF90cmFja190Yi5ucl9zdHJlYW1fcGFydCAgICAgICAgICAgICAhPSAxICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorCQkgICAgIGhlYWRlci0+ZXh0X3RyYWNrX3RiLmV0X2VudF9zeiAgICAgICAgICAgICAgICAgICE9IDMyICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisJCSAgICAgaGVhZGVyLT5leHRfdHJhY2tfdGIuZGF0X2V4dF90cmtfZXkuZXRfcGFydF9udW0gIT0gT1NfREFUQV9QQVJUSVRJT04gICAgICAgICAgfHwKKwkJICAgICBoZWFkZXItPmV4dF90cmFja190Yi5kYXRfZXh0X3Rya19leS5mbXQgICAgICAgICAhPSAxICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorCQkgICAgIGhlYWRlci0+ZXh0X3RyYWNrX3RiLmRhdF9leHRfdHJrX2V5LmZtX3RhYl9vZmYgICE9IGh0b25zKDE3NzM2KSAgICAgICAgICAgICAgIHx8CisJCSAgICAgaGVhZGVyLT5leHRfdHJhY2tfdGIuZGF0X2V4dF90cmtfZXkubGFzdF9obGJfaGkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKwkJICAgICBoZWFkZXItPmV4dF90cmFja190Yi5kYXRfZXh0X3Rya19leS5sYXN0X3BwICAgICAhPSBodG9ubChTVHAtPmVvZF9mcmFtZV9wcG9zKSB8fAorCQkgICAgIGhlYWRlci0+ZGF0X2ZtX3RhYi5mbV9wYXJ0X251bSAgICAgICAgICAgICAgICAgICE9IE9TX0RBVEFfUEFSVElUSU9OICAgICAgICAgIHx8CisJCSAgICAgaGVhZGVyLT5kYXRfZm1fdGFiLmZtX3RhYl9lbnRfc3ogICAgICAgICAgICAgICAgIT0gNCAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKwkJICAgICBoZWFkZXItPmRhdF9mbV90YWIuZm1fdGFiX2VudF9jbnQgICAgICAgICAgICAgICAhPQorCQkJICAgICBodG9ucyhTVHAtPmZpbGVtYXJrX2NudDxPU19GTV9UQUJfTUFYP1NUcC0+ZmlsZW1hcmtfY250Ok9TX0ZNX1RBQl9NQVgpKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOlc6IEZhaWxlZCBjb25zaXN0ZW5jeSBjaGVjayBBRFIgMS40IGZvcm1hdFxuIiwgbmFtZSk7CisKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBvc3N0X2FuYWx5emVfaGVhZGVycyhzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCkKK3sKKwlpbnQJcG9zaXRpb24sIHBwb3M7CisJaW50CWZpcnN0LCBsYXN0OworCWludAl2YWxpZCA9IDA7CisJY2hhciAgKiBuYW1lICA9IHRhcGVfbmFtZShTVHApOworCisJcG9zaXRpb24gPSBvc3N0X2dldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCk7CisKKwlpZiAoU1RwLT5yYXcpIHsKKwkJU1RwLT5oZWFkZXJfb2sgPSBTVHAtPmxpbnV4X21lZGlhID0gMTsKKwkJU1RwLT5saW51eF9tZWRpYV92ZXJzaW9uID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCVNUcC0+aGVhZGVyX29rID0gU1RwLT5saW51eF9tZWRpYSA9IFNUcC0+bGludXhfbWVkaWFfdmVyc2lvbiA9IDA7CisJU1RwLT53cnRfcGFzc19jbnRyID0gU1RwLT51cGRhdGVfZnJhbWVfY250ciA9IC0xOworCVNUcC0+ZW9kX2ZyYW1lX3Bwb3MgPSBTVHAtPmZpcnN0X2RhdGFfcHBvcyA9IC0xOworCVNUcC0+Zmlyc3RfbWFya19wcG9zID0gU1RwLT5sYXN0X21hcmtfcHBvcyA9IFNUcC0+bGFzdF9tYXJrX2xibiA9IC0xOworI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmVhZGluZyBoZWFkZXJcbiIsIG5hbWUpOworI2VuZGlmCisKKwkvKiBvcHRpbWl6YXRpb24gZm9yIHNwZWVkIC0gaWYgd2UgYXJlIHBvc2l0aW9uZWQgYXQgcHBvcyAxMCwgcmVhZCBzZWNvbmQgZ3JvdXAgZmlyc3QgICovCQorCS8qIFRPRE8gdHJ5IHRoZSBBRFIgMS4xIGxvY2F0aW9ucyBmb3IgdGhlIHNlY29uZCBncm91cCBpZiB3ZSBoYXZlIG5vIHZhbGlkIG9uZSB5ZXQuLi4gKi8KKworCWZpcnN0ID0gcG9zaXRpb249PTEwPzB4YmFlOiA1OworCWxhc3QgID0gcG9zaXRpb249PTEwPzB4YmIzOjEwOworCisJZm9yIChwcG9zID0gZmlyc3Q7IHBwb3MgPCBsYXN0OyBwcG9zKyspCisJCWlmIChfX29zc3RfYW5hbHl6ZV9oZWFkZXJzKFNUcCwgYVNScG50LCBwcG9zKSkKKwkJCXZhbGlkID0gMTsKKworCWZpcnN0ID0gcG9zaXRpb249PTEwPyA1OjB4YmFlOworCWxhc3QgID0gcG9zaXRpb249PTEwPzEwOjB4YmIzOworCisJZm9yIChwcG9zID0gZmlyc3Q7IHBwb3MgPCBsYXN0OyBwcG9zKyspCisJCWlmIChfX29zc3RfYW5hbHl6ZV9oZWFkZXJzKFNUcCwgYVNScG50LCBwcG9zKSkKKwkJCXZhbGlkID0gMTsKKworCWlmICghdmFsaWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczpFOiBGYWlsZWQgdG8gZmluZCB2YWxpZCBBRFJMIGhlYWRlciwgbmV3IG1lZGlhP1xuIiwgbmFtZSk7CisJCVNUcC0+ZW9kX2ZyYW1lX3Bwb3MgPSBTVHAtPmZpcnN0X2RhdGFfcHBvcyA9IDA7CisJCW9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50LCAxMCwgMCk7CisJCXJldHVybiAwOworCX0KKwlpZiAocG9zaXRpb24gPD0gU1RwLT5maXJzdF9kYXRhX3Bwb3MpIHsKKwkJcG9zaXRpb24gPSBTVHAtPmZpcnN0X2RhdGFfcHBvczsKKwkJU1RwLT5wc1swXS5kcnZfZmlsZSA9IFNUcC0+cHNbMF0uZHJ2X2Jsb2NrID0gU1RwLT5mcmFtZV9zZXFfbnVtYmVyID0gU1RwLT5sb2dpY2FsX2Jsa19udW0gPSAwOworCX0KKwlvc3N0X3NldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCwgcG9zaXRpb24sIDApOworCVNUcC0+aGVhZGVyX29rID0gMTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG9zc3RfdmVyaWZ5X3Bvc2l0aW9uKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50KQoreworCWludAlmcmFtZV9wb3NpdGlvbiAgPSBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uOworCWludAlmcmFtZV9zZXFfbnVtYnIgPSBTVHAtPmZyYW1lX3NlcV9udW1iZXI7CisJaW50CWxvZ2ljYWxfYmxrX251bSA9IFNUcC0+bG9naWNhbF9ibGtfbnVtOworICAgICAgIAlpbnQJaGFsZndheV9mcmFtZSAgID0gU1RwLT5mcmFtZV9pbl9idWZmZXI7CisJaW50CXJlYWRfcG9pbnRlciAgICA9IFNUcC0+YnVmZmVyLT5yZWFkX3BvaW50ZXI7CisJaW50CXByZXZfbWFya19wcG9zICA9IC0xOworCWludAlhY3R1YWxfbWFya19wcG9zLCBpLCBuOworI2lmIERFQlVHCisJY2hhciAgKiBuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBWZXJpZnkgdGhhdCB0aGUgdGFwZSBpcyByZWFsbHkgdGhlIG9uZSB3ZSB0aGluayBiZWZvcmUgd3JpdGluZ1xuIiwgbmFtZSk7CisjZW5kaWYKKwlvc3N0X3NldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCwgZnJhbWVfcG9zaXRpb24gLSAxLCAwKTsKKwlpZiAob3NzdF9nZXRfbG9naWNhbF9mcmFtZShTVHAsIGFTUnBudCwgLTEsIDApIDwgMCkgeworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IENvdWxkbid0IGdldCBsb2dpY2FsIGJsayBudW0gaW4gdmVyaWZ5X3Bvc2l0aW9uXG4iLCBuYW1lKTsKKyNlbmRpZgorCQlyZXR1cm4gKC1FSU8pOworCX0KKwlpZiAoU1RwLT5saW51eF9tZWRpYV92ZXJzaW9uID49IDQpIHsKKwkJZm9yIChpPTA7IGk8U1RwLT5maWxlbWFya19jbnQ7IGkrKykKKwkJCWlmICgobj1udG9obChTVHAtPmhlYWRlcl9jYWNoZS0+ZGF0X2ZtX3RhYi5mbV90YWJfZW50W2ldKSkgPCBmcmFtZV9wb3NpdGlvbikKKwkJCQlwcmV2X21hcmtfcHBvcyA9IG47CisJfSBlbHNlCisJCXByZXZfbWFya19wcG9zID0gZnJhbWVfcG9zaXRpb24gLSAxOyAgLyogdXN1YWxseSAtIHdlIGRvbid0IHJlYWxseSBrbm93ICovCisJYWN0dWFsX21hcmtfcHBvcyA9IFNUcC0+YnVmZmVyLT5hdXgtPmZyYW1lX3R5cGUgPT0gT1NfRlJBTUVfVFlQRV9NQVJLRVIgPworCQkJCWZyYW1lX3Bvc2l0aW9uIC0gMSA6IG50b2hsKFNUcC0+YnVmZmVyLT5hdXgtPmxhc3RfbWFya19wcG9zKTsKKwlpZiAoZnJhbWVfcG9zaXRpb24gICE9IFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24gICAgICAgICAgICAgICAgICAgfHwKKwkgICAgZnJhbWVfc2VxX251bWJyICE9IFNUcC0+ZnJhbWVfc2VxX251bWJlciArIChoYWxmd2F5X2ZyYW1lPzA6MSkgfHwKKwkgICAgcHJldl9tYXJrX3Bwb3MgICE9IGFjdHVhbF9tYXJrX3Bwb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQmxvY2sgbWlzbWF0Y2g6IGZwcG9zICVkLSVkLCBmc2VxICVkLSVkLCBtYXJrICVkLSVkXG4iLCBuYW1lLAorCQkJCSAgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiwgZnJhbWVfcG9zaXRpb24sIAorCQkJCSAgU1RwLT5mcmFtZV9zZXFfbnVtYmVyICsgKGhhbGZ3YXlfZnJhbWU/MDoxKSwKKwkJCQkgIGZyYW1lX3NlcV9udW1iciwgYWN0dWFsX21hcmtfcHBvcywgcHJldl9tYXJrX3Bwb3MpOworI2VuZGlmCisJCXJldHVybiAoLUVJTyk7CisJfQorCWlmIChoYWxmd2F5X2ZyYW1lKSB7CisJCS8qIHByZXBhcmUgYnVmZmVyIGZvciBhcHBlbmQgYW5kIHJld3JpdGUgb24gdG9wIG9mIG9yaWdpbmFsICovCisJCW9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50LCBmcmFtZV9wb3NpdGlvbiAtIDEsIDApOworCQlTVHAtPmJ1ZmZlci0+YnVmZmVyX2J5dGVzICA9IHJlYWRfcG9pbnRlcjsKKwkJU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0ucncgPSBTVF9XUklUSU5HOworCQlTVHAtPmRpcnR5ICAgICAgICAgICAgICAgICA9IDE7CisJfQorCVNUcC0+ZnJhbWVfaW5fYnVmZmVyICA9IGhhbGZ3YXlfZnJhbWU7CisJU1RwLT5mcmFtZV9zZXFfbnVtYmVyID0gZnJhbWVfc2VxX251bWJyOworCVNUcC0+bG9naWNhbF9ibGtfbnVtICA9IGxvZ2ljYWxfYmxrX251bTsKKwlyZXR1cm4gMDsKK30KKworLyogQWNjLiB0byBPblN0cmVhbSwgdGhlIHZlcnMuIG51bWJlcmluZyBpcyB0aGUgZm9sbG93aW5nOgorICogWC5YWCBmb3IgcmVsZWFzZWQgdmVyc2lvbnMgKFg9ZGlnaXQpLCAKKyAqIFhYWFkgZm9yIHVucmVsZWFzZWQgdmVyc2lvbnMgKFk9bGV0dGVyKQorICogT3JkZXJpbmcgMS4wNSA8IDEwNkEgPCAxMDZCIDwgLi4uICA8IDEwNmEgPCAuLi4gPCAxLjA2CisgKiBUaGlzIGZuIG1ha2VzIG1vbm90b24gbnVtYmVycyBvdXQgb2YgdGhpcyBzY2hlbWUgLi4uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgb3NzdF9wYXJzZV9maXJtd2FyZV9yZXYgKGNvbnN0IGNoYXIgKiBzdHIpCit7CisJaWYgKHN0clsxXSA9PSAnLicpIHsKKwkJcmV0dXJuIChzdHJbMF0tJzAnKSoxMDAwMAorCQkJKyhzdHJbMl0tJzAnKSoxMDAwCisJCQkrKHN0clszXS0nMCcpKjEwMDsKKwl9IGVsc2UgeworCQlyZXR1cm4gKHN0clswXS0nMCcpKjEwMDAwCisJCQkrKHN0clsxXS0nMCcpKjEwMDAKKwkJCSsoc3RyWzJdLScwJykqMTAwIC0gMTAwCisJCQkrKHN0clszXS0nQCcpOworCX0KK30KKworLyoKKyAqIENvbmZpZ3VyZSB0aGUgT25TdHJlYW0gU0NJSSB0YXBlIGRyaXZlIGZvciBkZWZhdWx0IG9wZXJhdGlvbgorICovCitzdGF0aWMgaW50IG9zc3RfY29uZmlndXJlX29uc3RyZWFtKHN0cnVjdCBvc3N0X3RhcGUgKlNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQpCit7CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgICAgIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICogbmFtZSA9IHRhcGVfbmFtZShTVHApOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgICAgICAgICAgICAgICAgICogU1JwbnQgPSAqIGFTUnBudDsKKwlvc3N0X21vZGVfcGFyYW1ldGVyX2hlYWRlcl90ICogaGVhZGVyOworCW9zc3RfYmxvY2tfc2l6ZV9wYWdlX3QgICAgICAgKiBiczsKKwlvc3N0X2NhcGFiaWxpdGllc19wYWdlX3QgICAgICogY3A7CisJb3NzdF90YXBlX3BhcmFtdHJfcGFnZV90ICAgICAqIHBybTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVfYnVmZmVyX3NpemU7CisKKwlpZiAoU1RwLT5yZWFkeSAhPSBTVF9SRUFEWSkgeworI2lmIERFQlVHCisJICAgIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IE5vdCBSZWFkeVxuIiwgbmFtZSk7CisjZW5kaWYKKwkgICAgcmV0dXJuICgtRUlPKTsKKwl9CisJCisJaWYgKFNUcC0+b3NfZndfcmV2IDwgMTA2MDApIHsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6STogT2xkIE9uU3RyZWFtIGZpcm13YXJlIHJldmlzaW9uIGRldGVjdGVkICglcyksXG4iLCBuYW1lLCBTVHAtPmRldmljZS0+cmV2KTsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6STogYW4gdXBncmFkZSB0byB2ZXJzaW9uIDEuMDYgb3IgYWJvdmUgaXMgcmVjb21tZW5kZWRcbiIsIG5hbWUpOworCX0KKworCS8qCisJICogQ29uZmlndXJlIDMyLjVLQiAoZGF0YSthdXgpIGZyYW1lIHNpemUuCisgICAgICAgICAqIEdldCB0aGUgY3VycmVudCBmcmFtZSBzaXplIGZyb20gdGhlIGJsb2NrIHNpemUgbW9kZSBwYWdlCisJICovCisJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJY21kWzBdID0gTU9ERV9TRU5TRTsKKwljbWRbMV0gPSA4OworCWNtZFsyXSA9IEJMT0NLX1NJWkVfUEFHRTsKKwljbWRbNF0gPSBCTE9DS19TSVpFX1BBR0VfTEVOR1RIICsgTU9ERV9IRUFERVJfTEVOR1RIOworCisJU1JwbnQgPSBvc3N0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCBjbWRbNF0sIERNQV9GUk9NX0RFVklDRSwgU1RwLT50aW1lb3V0LCAwLCAxKTsKKwlpZiAoU1JwbnQgPT0gTlVMTCkgeworI2lmIERFQlVHCisgCSAgICBwcmludGsoT1NTVF9ERUJfTVNHICJvc3N0IDpEOiBCdXN5XG4iKTsKKyNlbmRpZgorCSAgICByZXR1cm4gKC1FQlVTWSk7CisJfQorCSphU1JwbnQgPSBTUnBudDsKKwlpZiAoKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgIT0gMCkgeworCSAgICBwcmludGsgKEtFUk5fRVJSICIlczpFOiBDYW4ndCBnZXQgdGFwZSBibG9jayBzaXplIG1vZGUgcGFnZVxuIiwgbmFtZSk7CisJICAgIHJldHVybiAoLUVJTyk7CisJfQorCisJaGVhZGVyID0gKG9zc3RfbW9kZV9wYXJhbWV0ZXJfaGVhZGVyX3QgKikgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhOworCWJzID0gKG9zc3RfYmxvY2tfc2l6ZV9wYWdlX3QgKikgKChTVHAtPmJ1ZmZlciktPmJfZGF0YSArIHNpemVvZihvc3N0X21vZGVfcGFyYW1ldGVyX2hlYWRlcl90KSArIGhlYWRlci0+YmRsKTsKKworI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogMzJLQiBwbGF5IGJhY2s6ICVzXG4iLCAgIG5hbWUsIGJzLT5wbGF5MzIgICAgID8gIlllcyIgOiAiTm8iKTsKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiAzMi41S0IgcGxheSBiYWNrOiAlc1xuIiwgbmFtZSwgYnMtPnBsYXkzMl81ICAgPyAiWWVzIiA6ICJObyIpOworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IDMyS0IgcmVjb3JkOiAlc1xuIiwgICAgICBuYW1lLCBicy0+cmVjb3JkMzIgICA/ICJZZXMiIDogIk5vIik7CisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogMzIuNUtCIHJlY29yZDogJXNcbiIsICAgIG5hbWUsIGJzLT5yZWNvcmQzMl81ID8gIlllcyIgOiAiTm8iKTsKKyNlbmRpZgorCisJLyoKKwkgKiBDb25maWd1cmUgZGVmYXVsdCBhdXRvIGNvbHVtbnMgbW9kZSwgMzIuNUtCIHRyYW5zZmVyIG1vZGUKKwkgKi8gCisJYnMtPm9uZSA9IDE7CisJYnMtPnBsYXkzMiA9IDA7CisJYnMtPnBsYXkzMl81ID0gMTsKKwlicy0+cmVjb3JkMzIgPSAwOworCWJzLT5yZWNvcmQzMl81ID0gMTsKKworCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCWNtZFswXSA9IE1PREVfU0VMRUNUOworCWNtZFsxXSA9IDB4MTA7CisJY21kWzRdID0gQkxPQ0tfU0laRV9QQUdFX0xFTkdUSCArIE1PREVfSEVBREVSX0xFTkdUSDsKKworCVNScG50ID0gb3NzdF9kb19zY3NpKFNScG50LCBTVHAsIGNtZCwgY21kWzRdLCBETUFfVE9fREVWSUNFLCBTVHAtPnRpbWVvdXQsIDAsIDEpOworCSphU1JwbnQgPSBTUnBudDsKKwlpZiAoKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgIT0gMCkgeworCSAgICBwcmludGsgKEtFUk5fRVJSICIlczpFOiBDb3VsZG4ndCBzZXQgdGFwZSBibG9jayBzaXplIG1vZGUgcGFnZVxuIiwgbmFtZSk7CisJICAgIHJldHVybiAoLUVJTyk7CisJfQorCisjaWYgREVCVUcKKwlwcmludGsoS0VSTl9JTkZPICIlczpEOiBEcml2ZSBCbG9jayBTaXplIGNoYW5nZWQgdG8gMzIuNUtcbiIsIG5hbWUpOworCSAvKgorCSAqIEluIGRlYnVnIG1vZGUsIHdlIHdhbnQgdG8gc2VlIGFzIG1hbnkgZXJyb3JzIGFzIHBvc3NpYmxlCisJICogdG8gdGVzdCB0aGUgZXJyb3IgcmVjb3ZlcnkgbWVjaGFuaXNtLgorCSAqLworCW9zc3Rfc2V0X3JldHJpZXMoU1RwLCBhU1JwbnQsIDApOworCVNScG50ID0gKiBhU1JwbnQ7CisjZW5kaWYKKworCS8qCisJICogU2V0IHZlbmRvciBuYW1lIHRvICdMSU40JyBmb3IgIkxpbnV4IHN1cHBvcnQgdmVyc2lvbiA0Ii4KKwkgKi8KKworCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCWNtZFswXSA9IE1PREVfU0VMRUNUOworCWNtZFsxXSA9IDB4MTA7CisJY21kWzRdID0gVkVORE9SX0lERU5UX1BBR0VfTEVOR1RIICsgTU9ERV9IRUFERVJfTEVOR1RIOworCisJaGVhZGVyLT5tb2RlX2RhdGFfbGVuZ3RoID0gVkVORE9SX0lERU5UX1BBR0VfTEVOR1RIICsgTU9ERV9IRUFERVJfTEVOR1RIIC0gMTsKKwloZWFkZXItPm1lZGl1bV90eXBlICAgICAgPSAwOwkvKiBNZWRpdW0gVHlwZSAtIGlnbm9yaW5nICovCisJaGVhZGVyLT5kc3AgICAgICAgICAgICAgID0gMDsJLyogUmVzZXJ2ZWQgKi8KKwloZWFkZXItPmJkbCAgICAgICAgICAgICAgPSAwOwkvKiBCbG9jayBEZXNjcmlwdG9yIExlbmd0aCAqLworCQorCShTVHAtPmJ1ZmZlciktPmJfZGF0YVtNT0RFX0hFQURFUl9MRU5HVEggKyAwXSA9IFZFTkRPUl9JREVOVF9QQUdFIHwgKDEgPDwgNyk7CisJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArIDFdID0gNjsKKwkoU1RwLT5idWZmZXIpLT5iX2RhdGFbTU9ERV9IRUFERVJfTEVOR1RIICsgMl0gPSAnTCc7CisJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArIDNdID0gJ0knOworCShTVHAtPmJ1ZmZlciktPmJfZGF0YVtNT0RFX0hFQURFUl9MRU5HVEggKyA0XSA9ICdOJzsKKwkoU1RwLT5idWZmZXIpLT5iX2RhdGFbTU9ERV9IRUFERVJfTEVOR1RIICsgNV0gPSAnNCc7CisJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArIDZdID0gMDsKKwkoU1RwLT5idWZmZXIpLT5iX2RhdGFbTU9ERV9IRUFERVJfTEVOR1RIICsgN10gPSAwOworCisJU1JwbnQgPSBvc3N0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCBjbWRbNF0sIERNQV9UT19ERVZJQ0UsIFNUcC0+dGltZW91dCwgMCwgMSk7CisJKmFTUnBudCA9IFNScG50OworCisJaWYgKChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ICE9IDApIHsKKwkgICAgcHJpbnRrIChLRVJOX0VSUiAiJXM6RTogQ291bGRuJ3Qgc2V0IHZlbmRvciBuYW1lIHRvICVzXG4iLCBuYW1lLCAKKwkJCShjaGFyICopICgoU1RwLT5idWZmZXIpLT5iX2RhdGEgKyBNT0RFX0hFQURFUl9MRU5HVEggKyAyKSk7CisJICAgIHJldHVybiAoLUVJTyk7CisJfQorCisJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJY21kWzBdID0gTU9ERV9TRU5TRTsKKwljbWRbMV0gPSA4OworCWNtZFsyXSA9IENBUEFCSUxJVElFU19QQUdFOworCWNtZFs0XSA9IENBUEFCSUxJVElFU19QQUdFX0xFTkdUSCArIE1PREVfSEVBREVSX0xFTkdUSDsKKworCVNScG50ID0gb3NzdF9kb19zY3NpKFNScG50LCBTVHAsIGNtZCwgY21kWzRdLCBETUFfRlJPTV9ERVZJQ0UsIFNUcC0+dGltZW91dCwgMCwgMSk7CisJKmFTUnBudCA9IFNScG50OworCisJaWYgKChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ICE9IDApIHsKKwkgICAgcHJpbnRrIChLRVJOX0VSUiAiJXM6RTogQ2FuJ3QgZ2V0IGNhcGFiaWxpdGllcyBwYWdlXG4iLCBuYW1lKTsKKwkgICAgcmV0dXJuICgtRUlPKTsKKwl9CisKKwloZWFkZXIgPSAob3NzdF9tb2RlX3BhcmFtZXRlcl9oZWFkZXJfdCAqKSAoU1RwLT5idWZmZXIpLT5iX2RhdGE7CisJY3AgICAgID0gKG9zc3RfY2FwYWJpbGl0aWVzX3BhZ2VfdCAgICAqKSAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhICsKKwkJIHNpemVvZihvc3N0X21vZGVfcGFyYW1ldGVyX2hlYWRlcl90KSArIGhlYWRlci0+YmRsKTsKKworCWRyaXZlX2J1ZmZlcl9zaXplID0gbnRvaHMoY3AtPmJ1ZmZlcl9zaXplKSAvIDI7CisKKwltZW1zZXQoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwljbWRbMF0gPSBNT0RFX1NFTlNFOworCWNtZFsxXSA9IDg7CisJY21kWzJdID0gVEFQRV9QQVJBTVRSX1BBR0U7CisJY21kWzRdID0gVEFQRV9QQVJBTVRSX1BBR0VfTEVOR1RIICsgTU9ERV9IRUFERVJfTEVOR1RIOworCisJU1JwbnQgPSBvc3N0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCBjbWRbNF0sIERNQV9GUk9NX0RFVklDRSwgU1RwLT50aW1lb3V0LCAwLCAxKTsKKwkqYVNScG50ID0gU1JwbnQ7CisKKwlpZiAoKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgIT0gMCkgeworCSAgICBwcmludGsgKEtFUk5fRVJSICIlczpFOiBDYW4ndCBnZXQgdGFwZSBwYXJhbWV0ZXIgcGFnZVxuIiwgbmFtZSk7CisJICAgIHJldHVybiAoLUVJTyk7CisJfQorCisJaGVhZGVyID0gKG9zc3RfbW9kZV9wYXJhbWV0ZXJfaGVhZGVyX3QgKikgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhOworCXBybSAgICA9IChvc3N0X3RhcGVfcGFyYW10cl9wYWdlX3QgICAgKikgKChTVHAtPmJ1ZmZlciktPmJfZGF0YSArCisJCSBzaXplb2Yob3NzdF9tb2RlX3BhcmFtZXRlcl9oZWFkZXJfdCkgKyBoZWFkZXItPmJkbCk7CisKKwlTVHAtPmRlbnNpdHkgID0gcHJtLT5kZW5zaXR5OworCVNUcC0+Y2FwYWNpdHkgPSBudG9ocyhwcm0tPnNlZ3RyaykgKiBudG9ocyhwcm0tPnRya3MpOworI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRGVuc2l0eSAlZCwgdGFwZSBsZW5ndGg6ICVkTUIsIGRyaXZlIGJ1ZmZlciBzaXplOiAlZEtCXG4iLAorCQkJICBuYW1lLCBTVHAtPmRlbnNpdHksIFNUcC0+Y2FwYWNpdHkgLyAzMiwgZHJpdmVfYnVmZmVyX3NpemUpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKKwkKK30KKworCisvKiBTdGVwIG92ZXIgRU9GIGlmIGl0IGhhcyBiZWVuIGluYWR2ZXJ0ZW50bHkgY3Jvc3NlZCAoaW9jdGwgbm90IHVzZWQgYmVjYXVzZQorICAgaXQgbWVzc2VzIHVwIHRoZSBibG9jayBudW1iZXIpLiAqLworc3RhdGljIGludCBjcm9zc19lb2Yoc3RydWN0IG9zc3RfdGFwZSAqU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCwgaW50IGZvcndhcmQpCit7CisJaW50CXJlc3VsdDsKKwljaGFyICAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKworI2lmIERFQlVHCisJaWYgKGRlYnVnZ2luZykKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU3RlcHBpbmcgb3ZlciBmaWxlbWFyayAlcy5cbiIsCisJICAgCQkJICBuYW1lLCBmb3J3YXJkID8gImZvcndhcmQiIDogImJhY2t3YXJkIik7CisjZW5kaWYKKworCWlmIChmb3J3YXJkKSB7CisJICAgLyogYXNzdW1lcyB0aGF0IHRoZSBmaWxlbWFyayBpcyBhbHJlYWR5IHJlYWQgYnkgdGhlIGRyaXZlLCBzbyB0aGlzIGlzIGxvdyBjb3N0ICovCisJICAgcmVzdWx0ID0gb3NzdF9zcGFjZV9vdmVyX2ZpbGVtYXJrc19mb3J3YXJkX3Nsb3coU1RwLCBhU1JwbnQsIE1URlNGLCAxKTsKKwl9CisJZWxzZQorCSAgIC8qIGFzc3VtZXMgdGhpcyBpcyBvbmx5IGNhbGxlZCBpZiB3ZSBqdXN0IHJlYWQgdGhlIGZpbGVtYXJrISAqLworCSAgIHJlc3VsdCA9IG9zc3Rfc2Vla19sb2dpY2FsX2JsayhTVHAsIGFTUnBudCwgU1RwLT5sb2dpY2FsX2Jsa19udW0gLSAxKTsKKworCWlmIChyZXN1bHQgPCAwKQorCSAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOlc6IFN0ZXBwaW5nIG92ZXIgZmlsZW1hcmsgJXMgZmFpbGVkLlxuIiwKKwkJCQluYW1lLCBmb3J3YXJkID8gImZvcndhcmQiIDogImJhY2t3YXJkIik7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qIEdldCB0aGUgdGFwZSBwb3NpdGlvbi4gKi8KKworc3RhdGljIGludCBvc3N0X2dldF9mcmFtZV9wb3NpdGlvbihzdHJ1Y3Qgb3NzdF90YXBlICpTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50KQoreworCXVuc2lnbmVkIGNoYXIJCXNjbWRbTUFYX0NPTU1BTkRfU0laRV07CisJc3RydWN0IHNjc2lfcmVxdWVzdCAgICogU1JwbnQ7CisJaW50CQkJcmVzdWx0ID0gMDsKKwljaGFyICAgIAkgICAgICAqIG5hbWUgICA9IHRhcGVfbmFtZShTVHApOworCisJLyogS0c6IFdlIHdhbnQgdG8gYmUgYWJsZSB0byB1c2UgaXQgZm9yIGNoZWNraW5nIFdyaXRlIEJ1ZmZlciBhdmFpbGFiaWxpdHkKKwkgKiAgYW5kIHRodXMgZG9uJ3Qgd2FudCB0byByaXNrIHRvIG92ZXJ3cml0ZSBhbnl0aGluZy4gRXhjaGFuZ2UgYnVmZmVycyAuLi4gKi8KKwljaGFyCQlteWJ1ZlsyNF07CisJY2hhcgkgICAgICAqIG9sZGRhdGEgPSBTVHAtPmJ1ZmZlci0+Yl9kYXRhOworCWludAkJb2xkc2l6ZSA9IFNUcC0+YnVmZmVyLT5idWZmZXJfc2l6ZTsKKworCWlmIChTVHAtPnJlYWR5ICE9IFNUX1JFQURZKSByZXR1cm4gKC1FSU8pOworCisJbWVtc2V0IChzY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwlzY21kWzBdID0gUkVBRF9QT1NJVElPTjsKKworCVNUcC0+YnVmZmVyLT5iX2RhdGEgPSBteWJ1ZjsgU1RwLT5idWZmZXItPmJ1ZmZlcl9zaXplID0gMjQ7CisJU1JwbnQgPSBvc3N0X2RvX3Njc2koKmFTUnBudCwgU1RwLCBzY21kLCAyMCwgRE1BX0ZST01fREVWSUNFLAorCQkJCSAgICAgIFNUcC0+dGltZW91dCwgTUFYX1JFVFJJRVMsIDEpOworCWlmICghU1JwbnQpIHsKKwkJU1RwLT5idWZmZXItPmJfZGF0YSA9IG9sZGRhdGE7IFNUcC0+YnVmZmVyLT5idWZmZXJfc2l6ZSA9IG9sZHNpemU7CisJCXJldHVybiAoLUVCVVNZKTsKKwl9CisJKmFTUnBudCA9IFNScG50OworCisJaWYgKFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCkKKwkJcmVzdWx0ID0gKChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdICYgMHgwZikgPT0gMykgPyAtRUlPIDogLUVJTlZBTDsJLyogMzogV3JpdGUgRXJyb3IgKi8KKworCWlmIChyZXN1bHQgPT0gLUVJTlZBTCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczpFOiBDYW4ndCByZWFkIHRhcGUgcG9zaXRpb24uXG4iLCBuYW1lKTsKKwllbHNlIHsKKwkJaWYgKHJlc3VsdCA9PSAtRUlPKSB7CS8qIHJlLXJlYWQgcG9zaXRpb24gLSB0aGlzIG5lZWRzIHRvIHByZXNlcnZlIG1lZGlhIGVycm9ycyAqLworCQkJdW5zaWduZWQgY2hhciBteXNlbnNlWzE2XTsKKwkJCW1lbWNweSAobXlzZW5zZSwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlciwgMTYpOworCQkJbWVtc2V0IChzY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwkJCXNjbWRbMF0gPSBSRUFEX1BPU0lUSU9OOworCQkJU1RwLT5idWZmZXItPmJfZGF0YSA9IG15YnVmOyBTVHAtPmJ1ZmZlci0+YnVmZmVyX3NpemUgPSAyNDsKKwkJCVNScG50ID0gb3NzdF9kb19zY3NpKFNScG50LCBTVHAsIHNjbWQsIDIwLCBETUFfRlJPTV9ERVZJQ0UsCisJCQkJCQkgICAgU1RwLT50aW1lb3V0LCBNQVhfUkVUUklFUywgMSk7CisjaWYgREVCVUcKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFJlcmVhZCBwb3NpdGlvbiwgcmVhc29uPVslMDJ4OiUwMng6JTAyeF0sIHJlc3VsdD1bJXMlMDJ4OiUwMng6JTAyeF1cbiIsCisJCQkJCW5hbWUsIG15c2Vuc2VbMl0sIG15c2Vuc2VbMTJdLCBteXNlbnNlWzEzXSwgU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0PyIiOiJvazoiLAorCQkJCQlTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdLFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTJdLFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTNdKTsKKyNlbmRpZgorCQkJaWYgKCFTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQpCisJCQkJbWVtY3B5IChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyLCBteXNlbnNlLCAxNik7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6VzogRG91YmxlIGVycm9yIGluIGdldCBwb3NpdGlvblxuIiwgbmFtZSk7CisJCX0KKwkJU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiA9ICgoU1RwLT5idWZmZXIpLT5iX2RhdGFbNF0gPDwgMjQpCisJCQkJCSAgKyAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzVdIDw8IDE2KQorCQkJCQkgICsgKChTVHAtPmJ1ZmZlciktPmJfZGF0YVs2XSA8PCA4KQorCQkJCQkgICsgIChTVHAtPmJ1ZmZlciktPmJfZGF0YVs3XTsKKwkJU1RwLT5sYXN0X2ZyYW1lX3Bvc2l0aW9uICA9ICgoU1RwLT5idWZmZXIpLT5iX2RhdGFbIDhdIDw8IDI0KQorCQkJCQkgICsgKChTVHAtPmJ1ZmZlciktPmJfZGF0YVsgOV0gPDwgMTYpCisJCQkJCSAgKyAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzEwXSA8PCAgOCkKKwkJCQkJICArICAoU1RwLT5idWZmZXIpLT5iX2RhdGFbMTFdOworCQlTVHAtPmN1cl9mcmFtZXMgICAgICAgICAgID0gIChTVHAtPmJ1ZmZlciktPmJfZGF0YVsxNV07CisjaWYgREVCVUcKKwkJaWYgKGRlYnVnZ2luZykgeworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRHJpdmUgUG9zaXRpb25zOiBob3N0ICVkLCB0YXBlICVkJXMsIGJ1ZmZlciAlZFxuIiwgbmFtZSwKKwkJCQkJICAgIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24sIFNUcC0+bGFzdF9mcmFtZV9wb3NpdGlvbiwKKwkJCQkJICAgICgoU1RwLT5idWZmZXIpLT5iX2RhdGFbMF0mMHg4MCk/IiAoQk9QKSI6CisJCQkJCSAgICAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzBdJjB4NDApPyIgKEVPUCkiOiIiLAorCQkJCQkgICAgU1RwLT5jdXJfZnJhbWVzKTsKKwkJfQorI2VuZGlmCisJCWlmIChTVHAtPmN1cl9mcmFtZXMgPT0gMCAmJiBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uICE9IFNUcC0+bGFzdF9mcmFtZV9wb3NpdGlvbikgeworI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBDb3JyZWN0aW5nIHJlYWQgcG9zaXRpb24gJWQsICVkLCAlZFxuIiwgbmFtZSwKKwkJCQkJU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiwgU1RwLT5sYXN0X2ZyYW1lX3Bvc2l0aW9uLCBTVHAtPmN1cl9mcmFtZXMpOworI2VuZGlmCisJCQlTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uID0gU1RwLT5sYXN0X2ZyYW1lX3Bvc2l0aW9uOworCQl9CisJfQorCVNUcC0+YnVmZmVyLT5iX2RhdGEgPSBvbGRkYXRhOyBTVHAtPmJ1ZmZlci0+YnVmZmVyX3NpemUgPSBvbGRzaXplOworCisJcmV0dXJuIChyZXN1bHQgPT0gMCA/IFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24gOiByZXN1bHQpOworfQorCisKKy8qIFNldCB0aGUgdGFwZSBibG9jayAqLworc3RhdGljIGludCBvc3N0X3NldF9mcmFtZV9wb3NpdGlvbihzdHJ1Y3Qgb3NzdF90YXBlICpTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LCBpbnQgcHBvcywgaW50IHNraXApCit7CisJdW5zaWduZWQgY2hhcgkJc2NtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICAgKiBTUnBudDsKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgICAgKiBTVHBzOworCWludAkJCXJlc3VsdCA9IDA7CisJaW50CQkJcHAgICAgID0gKHBwb3MgPT0gMzAwMCAmJiAhc2tpcCk/IDAgOiBwcG9zOworCWNoYXIJCSAgICAgICogbmFtZSAgID0gdGFwZV9uYW1lKFNUcCk7CisKKwlpZiAoU1RwLT5yZWFkeSAhPSBTVF9SRUFEWSkgcmV0dXJuICgtRUlPKTsKKworCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKKworCWlmIChwcG9zIDwgMCB8fCBwcG9zID4gU1RwLT5jYXBhY2l0eSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpXOiBSZXBvc2l0aW9uIHJlcXVlc3QgJWQgb3V0IG9mIHJhbmdlXG4iLCBuYW1lLCBwcG9zKTsKKwkJcHAgPSBwcG9zID0gcHBvcyA8IDAgPyAwIDogKFNUcC0+Y2FwYWNpdHkgLSAxKTsKKwkJcmVzdWx0ID0gKC1FSU5WQUwpOworCX0KKworCWRvIHsKKyNpZiBERUJVRworCQlpZiAoZGVidWdnaW5nKQorCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU2V0dGluZyBwcG9zIHRvICVkLlxuIiwgbmFtZSwgcHApOworI2VuZGlmCisJCW1lbXNldCAoc2NtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJCXNjbWRbMF0gPSBTRUVLXzEwOworCQlzY21kWzFdID0gMTsKKwkJc2NtZFszXSA9IChwcCA+PiAyNCk7CisJCXNjbWRbNF0gPSAocHAgPj4gMTYpOworCQlzY21kWzVdID0gKHBwID4+IDgpOworCQlzY21kWzZdID0gIHBwOworCQlpZiAoc2tpcCkKKwkJCXNjbWRbOV0gPSAweDgwOworCisJCVNScG50ID0gb3NzdF9kb19zY3NpKCphU1JwbnQsIFNUcCwgc2NtZCwgMCwgRE1BX05PTkUsIFNUcC0+bG9uZ190aW1lb3V0LAorCQkJCQkJCQlNQVhfUkVUUklFUywgMSk7CisJCWlmICghU1JwbnQpCisJCQlyZXR1cm4gKC1FQlVTWSk7CisJCSphU1JwbnQgID0gU1JwbnQ7CisKKwkJaWYgKChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ICE9IDApIHsKKyNpZiBERUJVRworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU0VFSyBjb21tYW5kIGZyb20gJWQgdG8gJWQgZmFpbGVkLlxuIiwKKwkJCQkJbmFtZSwgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiwgcHApOworI2VuZGlmCisJCQlyZXN1bHQgPSAoLUVJTyk7CisJCX0KKwkJaWYgKHBwICE9IHBwb3MpCisJCQlvc3N0X3dhaXRfcmVhZHkoU1RwLCBhU1JwbnQsIDUgKiA2MCwgT1NTVF9XQUlUX1BPU0lUSU9OX0NPTVBMRVRFKTsKKwl9IHdoaWxlICgocHAgIT0gcHBvcykgJiYgKHBwID0gcHBvcykpOworCVNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24gPSBTVHAtPmxhc3RfZnJhbWVfcG9zaXRpb24gPSBwcG9zOworCVNUcHMtPmVvZiA9IFNUX05PRU9GOworCVNUcHMtPmF0X3NtID0gMDsKKwlTVHBzLT5ydyA9IFNUX0lETEU7CisJU1RwLT5mcmFtZV9pbl9idWZmZXIgPSAwOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgb3NzdF93cml0ZV90cmFpbGVyKHN0cnVjdCBvc3N0X3RhcGUgKlNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsIGludCBsZWF2ZV9hdF9FT1QpCit7CisJc3RydWN0IHN0X3BhcnRzdGF0ICogU1RwcyA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCWludCByZXN1bHQgPSAwOworCisJaWYgKFNUcC0+d3JpdGVfdHlwZSAhPSBPU19XUklURV9ORVdfTUFSSykgeworCQkvKiB0cnVlIHVubGVzcyB0aGUgdXNlciB3cm90ZSB0aGUgZmlsZW1hcmsgZm9yIHVzICovCisJCXJlc3VsdCA9IG9zc3RfZmx1c2hfZHJpdmVfYnVmZmVyKFNUcCwgYVNScG50KTsKKwkJaWYgKHJlc3VsdCA8IDApIGdvdG8gb3V0OworCQlyZXN1bHQgPSBvc3N0X3dyaXRlX2ZpbGVtYXJrKFNUcCwgYVNScG50KTsKKwkJaWYgKHJlc3VsdCA8IDApIGdvdG8gb3V0OworCisJCWlmIChTVHBzLT5kcnZfZmlsZSA+PSAwKQorCQkJU1Rwcy0+ZHJ2X2ZpbGUrKyA7CisJCVNUcHMtPmRydl9ibG9jayA9IDA7CisJfQorCXJlc3VsdCA9IG9zc3Rfd3JpdGVfZW9kKFNUcCwgYVNScG50KTsKKwlvc3N0X3dyaXRlX2hlYWRlcihTVHAsIGFTUnBudCwgbGVhdmVfYXRfRU9UKTsKKworCVNUcHMtPmVvZiA9IFNUX0ZNOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisMCisvKiBvc3N0IHZlcnNpb25zIG9mIHN0IGZ1bmN0aW9ucyAtIGF1Z21lbnRlZCBhbmQgc3RyaXBwZWQgdG8gc3VpdCBPblN0cmVhbSBvbmx5ICovCisKKy8qIEZsdXNoIHRoZSB3cml0ZSBidWZmZXIgKG5ldmVyIG5lZWQgdG8gd3JpdGUgaWYgdmFyaWFibGUgYmxvY2tzaXplKS4gKi8KK3N0YXRpYyBpbnQgb3NzdF9mbHVzaF93cml0ZV9idWZmZXIoc3RydWN0IG9zc3RfdGFwZSAqU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCkKK3sKKwlpbnQJCQlvZmZzZXQsIHRyYW5zZmVyLCBibGtzID0gMDsKKwlpbnQJCQlyZXN1bHQgPSAwOworCXVuc2lnbmVkIGNoYXIJCWNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICAgKiBTUnBudCA9ICphU1JwbnQ7CisJc3RydWN0IHN0X3BhcnRzdGF0ICAgICogU1RwczsKKwljaGFyCQkgICAgICAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKworCWlmICgoU1RwLT5idWZmZXIpLT53cml0aW5nKSB7CisJCWlmIChTUnBudCA9PSAoU1RwLT5idWZmZXIpLT5sYXN0X1NScG50KQorI2lmIERFQlVHCisJCQl7IHByaW50ayhPU1NUX0RFQl9NU0cKKwkgIiVzOkQ6IGFTUnBudCBwb2ludHMgdG8gc2NzaV9yZXF1ZXN0IHRoYXQgd3JpdGVfYmVoaW5kX2NoZWNrIHdpbGwgcmVsZWFzZSAtLSBjbGVhcmVkXG4iLCBuYW1lKTsKKyNlbmRpZgorCQkJKmFTUnBudCA9IFNScG50ID0gTlVMTDsKKyNpZiBERUJVRworCQkJfSBlbHNlIGlmIChTUnBudCkKKwkJCQlwcmludGsoT1NTVF9ERUJfTVNHCisJICIlczpEOiBhU1JwbnQgZG9lcyBub3QgcG9pbnQgdG8gc2NzaV9yZXF1ZXN0IHRoYXQgd3JpdGVfYmVoaW5kX2NoZWNrIHdpbGwgcmVsZWFzZSAtLSBzdHJhbmdlXG4iLCBuYW1lKTsKKyNlbmRpZgkKKwkJb3NzdF93cml0ZV9iZWhpbmRfY2hlY2soU1RwKTsKKwkJaWYgKChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0KSB7CisjaWYgREVCVUcKKwkJCWlmIChkZWJ1Z2dpbmcpCisJCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQXN5bmMgd3JpdGUgZXJyb3IgKGZsdXNoKSAleC5cbiIsCisJCQkJICAgICAgIG5hbWUsIChTVHAtPmJ1ZmZlciktPm1pZGxldmVsX3Jlc3VsdCk7CisjZW5kaWYKKwkJCWlmICgoU1RwLT5idWZmZXIpLT5taWRsZXZlbF9yZXN1bHQgPT0gSU5UX01BWCkKKwkJCQlyZXR1cm4gKC1FTk9TUEMpOworCQkJcmV0dXJuICgtRUlPKTsKKwkJfQorCX0KKworCXJlc3VsdCA9IDA7CisJaWYgKFNUcC0+ZGlydHkgPT0gMSkgeworCisJCVNUcC0+d3JpdGVfY291bnQrKzsKKwkJU1RwcyAgICAgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKKwkJU1Rwcy0+cncgPSBTVF9XUklUSU5HOworCQlvZmZzZXQgICA9IFNUcC0+YnVmZmVyLT5idWZmZXJfYnl0ZXM7CisJCWJsa3MgICAgID0gKG9mZnNldCArIFNUcC0+YmxvY2tfc2l6ZSAtIDEpIC8gU1RwLT5ibG9ja19zaXplOworCQl0cmFuc2ZlciA9IE9TX0ZSQU1FX1NJWkU7CisJCQorCQlpZiAob2Zmc2V0IDwgT1NfREFUQV9TSVpFKQorCQkJb3NzdF96ZXJvX2J1ZmZlcl90YWlsKFNUcC0+YnVmZmVyKTsKKworCQlpZiAoU1RwLT5wb2xsKQorCQkJaWYgKG9zc3Rfd2FpdF9mcmFtZSAoU1RwLCBhU1JwbnQsIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24sIC01MCwgMTIwKSkKKwkJCQlyZXN1bHQgPSBvc3N0X3JlY292ZXJfd2FpdF9mcmFtZShTVHAsIGFTUnBudCwgMSk7CisKKwkJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJCWNtZFswXSA9IFdSSVRFXzY7CisJCWNtZFsxXSA9IDE7CisJCWNtZFs0XSA9IDE7CisKKwkJc3dpdGNoCShTVHAtPndyaXRlX3R5cGUpIHsKKwkJICAgY2FzZSBPU19XUklURV9EQVRBOgorI2lmIERFQlVHCisgICAJCQlpZiAoZGVidWdnaW5nKQorCQkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFdyaXRpbmcgJWQgYmxvY2tzIHRvIGZyYW1lICVkLCBsYmxrcyAlZC0lZFxuIiwKKwkJCQkJbmFtZSwgYmxrcywgU1RwLT5mcmFtZV9zZXFfbnVtYmVyLCAKKwkJCQkJU1RwLT5sb2dpY2FsX2Jsa19udW0gLSBibGtzLCBTVHAtPmxvZ2ljYWxfYmxrX251bSAtIDEpOworI2VuZGlmCisJCQlvc3N0X2luaXRfYXV4KFNUcCwgT1NfRlJBTUVfVFlQRV9EQVRBLCBTVHAtPmZyYW1lX3NlcV9udW1iZXIrKywKKwkJCQkgICAgICBTVHAtPmxvZ2ljYWxfYmxrX251bSAtIGJsa3MsIFNUcC0+YmxvY2tfc2l6ZSwgYmxrcyk7CisJCQlicmVhazsKKwkJICAgY2FzZSBPU19XUklURV9FT0Q6CisJCQlvc3N0X2luaXRfYXV4KFNUcCwgT1NfRlJBTUVfVFlQRV9FT0QsIFNUcC0+ZnJhbWVfc2VxX251bWJlcisrLAorCQkJCSAgICAgIFNUcC0+bG9naWNhbF9ibGtfbnVtLCAwLCAwKTsKKwkJCWJyZWFrOworCQkgICBjYXNlIE9TX1dSSVRFX05FV19NQVJLOgorCQkJb3NzdF9pbml0X2F1eChTVHAsIE9TX0ZSQU1FX1RZUEVfTUFSS0VSLCBTVHAtPmZyYW1lX3NlcV9udW1iZXIrKywKKwkJCQkgICAgICBTVHAtPmxvZ2ljYWxfYmxrX251bSsrLCAwLCBibGtzPTEpOworCQkJYnJlYWs7CisJCSAgIGNhc2UgT1NfV1JJVEVfSEVBREVSOgorCQkJb3NzdF9pbml0X2F1eChTVHAsIE9TX0ZSQU1FX1RZUEVfSEVBREVSLCAwLCAwLCAwLCBibGtzPTApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8qIHByb2JhYmx5IEZJTExFUiAqLworCQkJb3NzdF9pbml0X2F1eChTVHAsIE9TX0ZSQU1FX1RZUEVfRklMTCwgMCwgMCwgMCwgMCk7CisJCX0KKyNpZiBERUJVRworCQlpZiAoZGVidWdnaW5nKQorCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRmx1c2hpbmcgJWQgYnl0ZXMsIFRyYW5zZmVyaW5nICVkIGJ5dGVzIGluICVkIGxibG9ja3MuXG4iLAorCQkJICAJCQkgbmFtZSwgb2Zmc2V0LCB0cmFuc2ZlciwgYmxrcyk7CisjZW5kaWYKKworCQlTUnBudCA9IG9zc3RfZG9fc2NzaSgqYVNScG50LCBTVHAsIGNtZCwgdHJhbnNmZXIsIERNQV9UT19ERVZJQ0UsCisJCQkJCSAgICAgIFNUcC0+dGltZW91dCwgTUFYX1JFVFJJRVMsIDEpOworCQkqYVNScG50ID0gU1JwbnQ7CisJCWlmICghU1JwbnQpCisJCQlyZXR1cm4gKC1FQlVTWSk7CisKKwkJaWYgKChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ICE9IDApIHsKKyNpZiBERUJVRworCQkJcHJpbnRrKE9TU1RfREVCX01TRworCQkJCSIlczpEOiB3cml0ZSBzZW5zZSBbMF09MHglMDJ4IFsyXT0lMDJ4IFsxMl09JTAyeCBbMTNdPSUwMnhcbiIsCisJCQkJbmFtZSwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclswXSwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSwKKwkJCQlTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEyXSwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10pOworI2VuZGlmCisJCQlpZiAoKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMF0gJiAweDcwKSA9PSAweDcwICYmCisJCQkgICAgKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0gJiAweDQwKSAmJiAvKiBGSVhNRSAtIFNDLTMwIGRyaXZlIGRvZXNuJ3QgYXNzZXJ0IEVPTSBiaXQgKi8KKwkJCSAgICAoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAmIDB4MGYpID09IE5PX1NFTlNFKSB7CisJCQkJU1RwLT5kaXJ0eSA9IDA7CisJCQkJKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzID0gMDsKKwkJCQlyZXN1bHQgPSAoLUVOT1NQQyk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAob3NzdF93cml0ZV9lcnJvcl9yZWNvdmVyeShTVHAsIGFTUnBudCwgMSkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczpFOiBFcnJvciBvbiBmbHVzaCB3cml0ZS5cbiIsIG5hbWUpOworCQkJCQlyZXN1bHQgPSAoLUVJTyk7CisJCQkJfQorCQkJfQorCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gKC0xKTsJCS8qIEZJWE1FIC0gZXZlbiBpZiB3cml0ZSByZWNvdmVyeSBzdWNjZWVkcz8gKi8KKwkJfQorCQllbHNlIHsKKwkJCVNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24rKzsKKwkJCVNUcC0+ZGlydHkgPSAwOworCQkJKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzID0gMDsKKwkJfQorCX0KKyNpZiBERUJVRworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEV4aXQgZmx1c2ggd3JpdGUgYnVmZmVyIHdpdGggY29kZSAlZFxuIiwgbmFtZSwgcmVzdWx0KTsKKyNlbmRpZgorCXJldHVybiByZXN1bHQ7Cit9CisKKworLyogRmx1c2ggdGhlIHRhcGUgYnVmZmVyLiBUaGUgdGFwZSB3aWxsIGJlIHBvc2l0aW9uZWQgY29ycmVjdGx5IHVubGVzcworICAgc2Vla19uZXh0IGlzIHRydWUuICovCitzdGF0aWMgaW50IG9zc3RfZmx1c2hfYnVmZmVyKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LCBpbnQgc2Vla19uZXh0KQoreworCXN0cnVjdCBzdF9wYXJ0c3RhdCAqIFNUcHM7CisJaW50ICAgIGJhY2tzcGFjZSA9IDAsIHJlc3VsdCA9IDA7CisjaWYgREVCVUcKKwljaGFyICogbmFtZSA9IHRhcGVfbmFtZShTVHApOworI2VuZGlmCisKKwkvKgorCSAqIElmIHRoZXJlIHdhcyBhIGJ1cyByZXNldCwgYmxvY2sgZnVydGhlciBhY2Nlc3MKKwkgKiB0byB0aGlzIGRldmljZS4KKwkgKi8KKwlpZiggU1RwLT5wb3NfdW5rbm93bikKKwkJcmV0dXJuICgtRUlPKTsKKworCWlmIChTVHAtPnJlYWR5ICE9IFNUX1JFQURZKQorCQlyZXR1cm4gMDsKKworCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKKwlpZiAoU1Rwcy0+cncgPT0gU1RfV1JJVElORyB8fCBTVHAtPmRpcnR5KSB7CS8qIFdyaXRpbmcgKi8KKwkJU1RwLT53cml0ZV90eXBlID0gT1NfV1JJVEVfREFUQTsKKwkJcmV0dXJuIG9zc3RfZmx1c2hfd3JpdGVfYnVmZmVyKFNUcCwgYVNScG50KTsKKwl9CisJaWYgKFNUcC0+YmxvY2tfc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKworI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmVhY2hlZCBmbHVzaCAocmVhZCkgYnVmZmVyXG4iLCBuYW1lKTsKKyNlbmRpZgorCisJaWYgKCFTVHAtPmNhbl9ic3IpIHsKKwkJYmFja3NwYWNlID0gKChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyArIChTVHAtPmJ1ZmZlciktPnJlYWRfcG9pbnRlcikgLyBTVHAtPmJsb2NrX3NpemUgLQorCQkJICAgICgoU1RwLT5idWZmZXIpLT5yZWFkX3BvaW50ZXIgKyBTVHAtPmJsb2NrX3NpemUgLSAxICAgICAgICApIC8gU1RwLT5ibG9ja19zaXplIDsKKwkJKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzID0gMDsKKwkJKFNUcC0+YnVmZmVyKS0+cmVhZF9wb2ludGVyID0gMDsKKwkJU1RwLT5mcmFtZV9pbl9idWZmZXIgPSAwOwkJLyogRklYTUUgaXMgdGhpcyByZWxldmFudCB3LiBPU1NUPyAqLworCX0KKworCWlmICghc2Vla19uZXh0KSB7CisJCWlmIChTVHBzLT5lb2YgPT0gU1RfRk1fSElUKSB7CisJCQlyZXN1bHQgPSBjcm9zc19lb2YoU1RwLCBhU1JwbnQsIDApOyAvKiBCYWNrIG92ZXIgdGhlIEVPRiBoaXQgKi8KKwkJCWlmICghcmVzdWx0KQorCQkJCVNUcHMtPmVvZiA9IFNUX05PRU9GOworCQkJZWxzZSB7CisJCQkJaWYgKFNUcHMtPmRydl9maWxlID49IDApCisJCQkJCVNUcHMtPmRydl9maWxlKys7CisJCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gMDsKKwkJCX0KKwkJfQorCQlpZiAoIXJlc3VsdCAmJiBiYWNrc3BhY2UgPiAwKQkvKiBUT0RPIC0tIGRlc2lnbiBhbmQgcnVuIGEgdGVzdCBjYXNlIGZvciB0aGlzICovCisJCQlyZXN1bHQgPSBvc3N0X3NlZWtfbG9naWNhbF9ibGsoU1RwLCBhU1JwbnQsIFNUcC0+bG9naWNhbF9ibGtfbnVtIC0gYmFja3NwYWNlKTsKKwl9CisJZWxzZSBpZiAoU1Rwcy0+ZW9mID09IFNUX0ZNX0hJVCkgeworCQlpZiAoU1Rwcy0+ZHJ2X2ZpbGUgPj0gMCkKKwkJCVNUcHMtPmRydl9maWxlKys7CisJCVNUcHMtPmRydl9ibG9jayA9IDA7CisJCVNUcHMtPmVvZiA9IFNUX05PRU9GOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgb3NzdF93cml0ZV9mcmFtZShzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCwgaW50IHN5bmNocm9ub3VzKQoreworCXVuc2lnbmVkIGNoYXIJCWNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICAgKiBTUnBudDsKKwlpbnQJCQlibGtzOworI2lmIERFQlVHCisJY2hhcgkJICAgICAgKiBuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisjZW5kaWYKKworCWlmICgoIVNUcC0+IHJhdykgJiYgKFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24gPT0gMHhiYWUpKSB7IC8qIF9tdXN0XyBwcmVzZXJ2ZSBidWZmZXIhICovCisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmVhY2hpbmcgY29uZmlnIHBhcnRpdGlvbi5cbiIsIG5hbWUpOworI2VuZGlmCisJCWlmIChvc3N0X2ZsdXNoX2RyaXZlX2J1ZmZlcihTVHAsIGFTUnBudCkgPCAwKSB7CisJCQlyZXR1cm4gKC1FSU8pOworCQl9CisJCS8qIGVycm9yIHJlY292ZXJ5IG1heSBoYXZlIGJ1bXBlZCB1cyBwYXN0IHRoZSBoZWFkZXIgcGFydGl0aW9uICovCisJCWlmIChvc3N0X2dldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCkgPCAweGJiOCkgeworI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTa2lwcGluZyBvdmVyIGNvbmZpZyBwYXJ0aXRpb24uXG4iLCBuYW1lKTsKKyNlbmRpZgorCQlvc3N0X3Bvc2l0aW9uX3RhcGVfYW5kX2NvbmZpcm0oU1RwLCBhU1JwbnQsIDB4YmI4KTsKKwkJfQorCX0KKworCWlmIChTVHAtPnBvbGwpCisJCWlmIChvc3N0X3dhaXRfZnJhbWUgKFNUcCwgYVNScG50LCBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uLCAtNDgsIDEyMCkpCisJCQlpZiAob3NzdF9yZWNvdmVyX3dhaXRfZnJhbWUoU1RwLCBhU1JwbnQsIDEpKQorCQkJCXJldHVybiAoLUVJTyk7CisKKy8vCW9zc3RfYnVpbGRfc3RhdHMoU1RwLCAmU1JwbnQpOworCisJU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0ucncgPSBTVF9XUklUSU5HOworCVNUcC0+d3JpdGVfdHlwZSAgICAgICAgICAgID0gT1NfV1JJVEVfREFUQTsKKwkJCQorCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCWNtZFswXSAgID0gV1JJVEVfNjsKKwljbWRbMV0gICA9IDE7CisJY21kWzRdICAgPSAxOwkJCQkJCS8qIG9uZSBmcmFtZSBhdCBhIHRpbWUuLi4gKi8KKwlibGtzICAgICA9IFNUcC0+YnVmZmVyLT5idWZmZXJfYnl0ZXMgLyBTVHAtPmJsb2NrX3NpemU7CisjaWYgREVCVUcKKwlpZiAoZGVidWdnaW5nKQorCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBXcml0aW5nICVkIGJsb2NrcyB0byBmcmFtZSAlZCwgbGJsa3MgJWQtJWRcbiIsIG5hbWUsIGJsa3MsIAorCQkJU1RwLT5mcmFtZV9zZXFfbnVtYmVyLCBTVHAtPmxvZ2ljYWxfYmxrX251bSAtIGJsa3MsIFNUcC0+bG9naWNhbF9ibGtfbnVtIC0gMSk7CisjZW5kaWYKKwlvc3N0X2luaXRfYXV4KFNUcCwgT1NfRlJBTUVfVFlQRV9EQVRBLCBTVHAtPmZyYW1lX3NlcV9udW1iZXIrKywKKwkJICAgICAgU1RwLT5sb2dpY2FsX2Jsa19udW0gLSBibGtzLCBTVHAtPmJsb2NrX3NpemUsIGJsa3MpOworCisjaWYgREVCVUcKKwlpZiAoIXN5bmNocm9ub3VzKQorCQlTVHAtPndyaXRlX3BlbmRpbmcgPSAxOworI2VuZGlmCisJU1JwbnQgPSBvc3N0X2RvX3Njc2koKmFTUnBudCwgU1RwLCBjbWQsIE9TX0ZSQU1FX1NJWkUsIERNQV9UT19ERVZJQ0UsIFNUcC0+dGltZW91dCwKKwkJCQkJCQkJCU1BWF9SRVRSSUVTLCBzeW5jaHJvbm91cyk7CisJaWYgKCFTUnBudCkKKwkJcmV0dXJuICgtRUJVU1kpOworCSphU1JwbnQgPSBTUnBudDsKKworCWlmIChzeW5jaHJvbm91cykgeworCQlpZiAoU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0ICE9IDApIHsKKyNpZiBERUJVRworCQkJaWYgKGRlYnVnZ2luZykKKwkJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBFcnJvciBvbiB3cml0ZTpcbiIsIG5hbWUpOworI2VuZGlmCisJCQlpZiAoKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMF0gJiAweDcwKSA9PSAweDcwICYmCisJCQkgICAgKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0gJiAweDQwKSkgeworCQkJCWlmICgoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAmIDB4MGYpID09IFZPTFVNRV9PVkVSRkxPVykKKwkJCQkJcmV0dXJuICgtRU5PU1BDKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWlmIChvc3N0X3dyaXRlX2Vycm9yX3JlY292ZXJ5KFNUcCwgYVNScG50LCAxKSkKKwkJCQkJcmV0dXJuICgtRUlPKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCQlTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uKys7CisJfQorCisJU1RwLT53cml0ZV9jb3VudCsrOworCisJcmV0dXJuIDA7Cit9CisKKy8qIExvY2sgb3IgdW5sb2NrIHRoZSBkcml2ZSBkb29yLiBEb24ndCB1c2Ugd2hlbiBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0IGFsbG9jYXRlZC4gKi8KK3N0YXRpYyBpbnQgZG9fZG9vcl9sb2NrKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIGludCBkb19sb2NrKQoreworCWludCByZXR2YWwsIGNtZDsKKworCWNtZCA9IGRvX2xvY2sgPyBTQ1NJX0lPQ1RMX0RPT1JMT0NLIDogU0NTSV9JT0NUTF9ET09SVU5MT0NLOworI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogJXNvY2tpbmcgZHJpdmUgZG9vci5cbiIsIHRhcGVfbmFtZShTVHApLCBkb19sb2NrID8gIkwiIDogIlVubCIpOworI2VuZGlmCisJcmV0dmFsID0gc2NzaV9pb2N0bChTVHAtPmRldmljZSwgY21kLCBOVUxMKTsKKwlpZiAoIXJldHZhbCkgeworCQlTVHAtPmRvb3JfbG9ja2VkID0gZG9fbG9jayA/IFNUX0xPQ0tFRF9FWFBMSUNJVCA6IFNUX1VOTE9DS0VEOworCX0KKwllbHNlIHsKKwkJU1RwLT5kb29yX2xvY2tlZCA9IFNUX0xPQ0tfRkFJTFM7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIFNldCB0aGUgaW50ZXJuYWwgc3RhdGUgYWZ0ZXIgcmVzZXQgKi8KK3N0YXRpYyB2b2lkIHJlc2V0X3N0YXRlKHN0cnVjdCBvc3N0X3RhcGUgKlNUcCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgKlNUcHM7CisKKwlTVHAtPnBvc191bmtub3duID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgU1RfTkJSX1BBUlRJVElPTlM7IGkrKykgeworCQlTVHBzID0gJihTVHAtPnBzW2ldKTsKKwkJU1Rwcy0+cncgPSBTVF9JRExFOworCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKwkJU1Rwcy0+YXRfc20gPSAwOworCQlTVHBzLT5sYXN0X2Jsb2NrX3ZhbGlkID0gMDsKKwkJU1Rwcy0+ZHJ2X2Jsb2NrID0gLTE7CisJCVNUcHMtPmRydl9maWxlID0gLTE7CisJfQorfQorCQkJCQorDAorLyogRW50cnkgcG9pbnRzIHRvIG9zc3QgKi8KKworLyogV3JpdGUgY29tbWFuZCAqLworc3RhdGljIHNzaXplX3Qgb3NzdF93cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbHAsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzc2l6ZV90CQkgICAgICB0b3RhbCwgcmV0dmFsID0gMDsKKwlzc2l6ZV90CQkgICAgICBpLCBkb19jb3VudCwgYmxrcywgdHJhbnNmZXI7CisJaW50CQkgICAgICB3cml0ZV90aHJlc2hvbGQ7CisJaW50CQkgICAgICBkb2luZ193cml0ZSA9IDA7CisJY29uc3QgY2hhciAgIF9fdXNlciAqIGJfcG9pbnQ7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqIFNScG50ID0gTlVMTDsKKwlzdHJ1Y3Qgc3RfbW9kZWRlZiAgICogU1RtOworCXN0cnVjdCBzdF9wYXJ0c3RhdCAgKiBTVHBzOworCXN0cnVjdCBvc3N0X3RhcGUgICAgKiBTVHAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWNoYXIJCSAgICAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmU1RwLT5sb2NrKSkKKwkJcmV0dXJuICgtRVJFU1RBUlRTWVMpOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBlcnJvciByZWNvdmVyeSwgZG9uJ3QgbGV0IGFueW9uZQorCSAqIGVsc2UgdHJ5IGFuZCB1c2UgdGhpcyBkZXZpY2UuICBBbHNvLCBpZiBlcnJvciByZWNvdmVyeSBmYWlscywgaXQKKwkgKiBtYXkgdHJ5IGFuZCB0YWtlIHRoZSBkZXZpY2Ugb2ZmbGluZSwgaW4gd2hpY2ggY2FzZSBhbGwgZnVydGhlcgorCSAqIGFjY2VzcyB0byB0aGUgZGV2aWNlIGlzIHByb2hpYml0ZWQuCisJICovCisJaWYoICFzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2luZ19lcnJvcnMoU1RwLT5kZXZpY2UpICkgeworCQlyZXR2YWwgPSAoLUVOWElPKTsKKwkJZ290byBvdXQ7CisJfQorCQorCWlmIChTVHAtPnJlYWR5ICE9IFNUX1JFQURZKSB7CisJCWlmIChTVHAtPnJlYWR5ID09IFNUX05PX1RBUEUpCisJCQlyZXR2YWwgPSAoLUVOT01FRElVTSk7CisJCWVsc2UKKwkJCXJldHZhbCA9ICgtRUlPKTsKKwkJZ290byBvdXQ7CisJfQorCVNUbSA9ICYoU1RwLT5tb2Rlc1tTVHAtPmN1cnJlbnRfbW9kZV0pOworCWlmICghU1RtLT5kZWZpbmVkKSB7CisJCXJldHZhbCA9ICgtRU5YSU8pOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGNvdW50ID09IDApCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBJZiB0aGVyZSB3YXMgYSBidXMgcmVzZXQsIGJsb2NrIGZ1cnRoZXIgYWNjZXNzCisJICogdG8gdGhpcyBkZXZpY2UuCisJICovCisJaWYgKFNUcC0+cG9zX3Vua25vd24pIHsKKwkJcmV0dmFsID0gKC1FSU8pOworCQlnb3RvIG91dDsKKwl9CisKKyNpZiBERUJVRworCWlmICghU1RwLT5pbl91c2UpIHsKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogSW5jb3JyZWN0IGRldmljZS5cbiIsIG5hbWUpOworCQlyZXR2YWwgPSAoLUVJTyk7CisJCWdvdG8gb3V0OworCX0KKyNlbmRpZgorCisJaWYgKFNUcC0+d3JpdGVfcHJvdCkgeworCQlyZXR2YWwgPSAoLUVBQ0NFUyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFdyaXRlIG11c3QgYmUgaW50ZWdyYWwgbnVtYmVyIG9mIGJsb2NrcyAqLworCWlmIChTVHAtPmJsb2NrX3NpemUgIT0gMCAmJiAoY291bnQgJSBTVHAtPmJsb2NrX3NpemUpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczpFOiBXcml0ZSAoJVpkIGJ5dGVzKSBub3QgbXVsdGlwbGUgb2YgdGFwZSBibG9jayBzaXplICglZCVjKS5cbiIsCisJCQkJICAgICAgIG5hbWUsIGNvdW50LCBTVHAtPmJsb2NrX3NpemU8MTAyND8KKwkJCQkgICAgICAgU1RwLT5ibG9ja19zaXplOlNUcC0+YmxvY2tfc2l6ZS8xMDI0LCBTVHAtPmJsb2NrX3NpemU8MTAyND8nYic6J2snKTsKKwkJcmV0dmFsID0gKC1FSU5WQUwpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiA+PSBTVHAtPmNhcGFjaXR5IC0gT1NTVF9FT01fUkVTRVJWRSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOkU6IFdyaXRlIHRydW5jYXRlZCBhdCBFT00gZWFybHkgd2FybmluZyAoZnJhbWUgJWQpLlxuIiwKKwkJCQkgICAgICAgbmFtZSwgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbik7CisJCXJldHZhbCA9ICgtRU5PU1BDKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKFNUcC0+ZG9fYXV0b19sb2NrICYmIFNUcC0+ZG9vcl9sb2NrZWQgPT0gU1RfVU5MT0NLRUQgJiYgIWRvX2Rvb3JfbG9jayhTVHAsIDEpKQorCQlTVHAtPmRvb3JfbG9ja2VkID0gU1RfTE9DS0VEX0FVVE87CisKKwlTVHBzID0gJihTVHAtPnBzW1NUcC0+cGFydGl0aW9uXSk7CisKKwlpZiAoU1Rwcy0+cncgPT0gU1RfUkVBRElORykgeworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFN3aXRjaGluZyBmcm9tIHJlYWQgdG8gd3JpdGUgYXQgZmlsZSAlZCwgYmxvY2sgJWRcbiIsIG5hbWUsIAorCQkJCQlTVHBzLT5kcnZfZmlsZSwgU1Rwcy0+ZHJ2X2Jsb2NrKTsKKyNlbmRpZgorCQlyZXR2YWwgPSBvc3N0X2ZsdXNoX2J1ZmZlcihTVHAsICZTUnBudCwgMCk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIG91dDsKKwkJU1Rwcy0+cncgPSBTVF9JRExFOworCX0KKwlpZiAoU1Rwcy0+cncgIT0gU1RfV1JJVElORykgeworCQkvKiBBcmUgd2UgdG90YWxseSByZXdyaXRpbmcgdGhpcyB0YXBlPyAqLworCQlpZiAoIVNUcC0+aGVhZGVyX29rIHx8CisJCSAgICAoU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiA9PSBTVHAtPmZpcnN0X2RhdGFfcHBvcyAmJiBTVHBzLT5kcnZfYmxvY2sgPCAwKSB8fAorCQkgICAgKFNUcHMtPmRydl9maWxlID09IDAgJiYgU1Rwcy0+ZHJ2X2Jsb2NrID09IDApKSB7CisJCQlTVHAtPndydF9wYXNzX2NudHIrKzsKKyNpZiBERUJVRworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQWxsb2NhdGluZyBuZXh0IHdyaXRlIHBhc3MgY291bnRlcjogJWRcbiIsCisJCQkJCQkgIG5hbWUsIFNUcC0+d3J0X3Bhc3NfY250cik7CisjZW5kaWYKKwkJCW9zc3RfcmVzZXRfaGVhZGVyKFNUcCwgJlNScG50KTsKKwkJCVNUcHMtPmRydl9maWxlID0gU1Rwcy0+ZHJ2X2Jsb2NrID0gMDsKKwkJfQorCQkvKiBEbyB3ZSBrbm93IHdoZXJlIHdlJ2xsIGJlIHdyaXRpbmcgb24gdGhlIHRhcGU/ICovCisJCWVsc2UgeworCQkJaWYgKChTVHAtPmZhc3Rfb3BlbiAmJiBvc3N0X3ZlcmlmeV9wb3NpdGlvbihTVHAsICZTUnBudCkpIHx8CisJCQkgIAkJU1Rwcy0+ZHJ2X2ZpbGUgPCAwIHx8IFNUcHMtPmRydl9ibG9jayA8IDApIHsKKwkJCQlpZiAoU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiA9PSBTVHAtPmVvZF9mcmFtZV9wcG9zKSB7CS8qIGF0IEVPRCAqLworCQkJICAJCVNUcHMtPmRydl9maWxlID0gU1RwLT5maWxlbWFya19jbnQ7CisJCQkgIAkJU1Rwcy0+ZHJ2X2Jsb2NrID0gMDsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCS8qIFdlIGhhdmUgbm8gaWRlYSB3aGVyZSB0aGUgdGFwZSBpcyBwb3NpdGlvbmVkIC0gZ2l2ZSB1cCAqLworI2lmIERFQlVHCisJCQkJCXByaW50ayhPU1NUX0RFQl9NU0cKKwkJCQkJCSIlczpEOiBDYW5ub3Qgd3JpdGUgYXQgaW5kZXRlcm1pbmF0ZSBwb3NpdGlvbi5cbiIsIG5hbWUpOworI2VuZGlmCisJCQkJCXJldHZhbCA9ICgtRUlPKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorICAgICAgCQkJfQkgIAorCQkJaWYgKChTVHBzLT5kcnZfZmlsZSArIFNUcHMtPmRydl9ibG9jaykgPiAwICYmIFNUcHMtPmRydl9maWxlIDwgU1RwLT5maWxlbWFya19jbnQpIHsKKwkJCQlTVHAtPmZpbGVtYXJrX2NudCA9IFNUcHMtPmRydl9maWxlOworCQkJCVNUcC0+bGFzdF9tYXJrX3Bwb3MgPQorCQkJCSAgICAgICAJbnRvaGwoU1RwLT5oZWFkZXJfY2FjaGUtPmRhdF9mbV90YWIuZm1fdGFiX2VudFtTVHAtPmZpbGVtYXJrX2NudC0xXSk7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkiJXM6VzogT3ZlcndyaXRpbmcgZmlsZSAlZCB3aXRoIG9sZCB3cml0ZSBwYXNzIGNvdW50ZXIgJWRcbiIsCisJCQkJCQluYW1lLCBTVHBzLT5kcnZfZmlsZSwgU1RwLT53cnRfcGFzc19jbnRyKTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSIlczpXOiBtYXkgbGVhZCB0byBzdGFsZSBkYXRhIGJlaW5nIGFjY2VwdGVkIG9uIHJlYWRpbmcgYmFjayFcbiIsCisJCQkJCQluYW1lKTsKKyNpZiBERUJVRworCQkJCXByaW50ayhPU1NUX0RFQl9NU0cKKwkJCQkgICIlczpEOiByZXNldHRpbmcgZmlsZW1hcmsgY291bnQgdG8gJWQgYW5kIGxhc3QgbWFyayBwcG9zLGxibiB0byAlZCwlZFxuIiwKKwkJCQkJbmFtZSwgU1RwLT5maWxlbWFya19jbnQsIFNUcC0+bGFzdF9tYXJrX3Bwb3MsIFNUcC0+bGFzdF9tYXJrX2xibik7CisjZW5kaWYKKwkJCX0KKwkJfQorCQlTVHAtPmZhc3Rfb3BlbiA9IDA7CisJfQorCWlmICghU1RwLT5oZWFkZXJfb2spIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBXcml0ZSBjYW5ub3QgcHJvY2VlZCB3aXRob3V0IHZhbGlkIGhlYWRlcnNcbiIsIG5hbWUpOworI2VuZGlmCisJCXJldHZhbCA9ICgtRUlPKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChTVHAtPmJ1ZmZlciktPndyaXRpbmcpIHsKK2lmIChTUnBudCkgcHJpbnRrKEtFUk5fRVJSICIlczpBOiBOb3Qgc3VwcG9zZWQgdG8gaGF2ZSBTUnBudCBhdCBsaW5lICVkXG4iLCBuYW1lLCBfX0xJTkVfXyk7CisJCW9zc3Rfd3JpdGVfYmVoaW5kX2NoZWNrKFNUcCk7CisJCWlmICgoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCkgeworI2lmIERFQlVHCisJCWlmIChkZWJ1Z2dpbmcpCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBBc3luYyB3cml0ZSBlcnJvciAod3JpdGUpICV4LlxuIiwgbmFtZSwKKwkJCQkJCSAoU1RwLT5idWZmZXIpLT5taWRsZXZlbF9yZXN1bHQpOworI2VuZGlmCisJCWlmICgoU1RwLT5idWZmZXIpLT5taWRsZXZlbF9yZXN1bHQgPT0gSU5UX01BWCkKKwkJCVNUcHMtPmVvZiA9IFNUX0VPTV9PSzsKKwkJZWxzZQorCQkJU1Rwcy0+ZW9mID0gU1RfRU9NX0VSUk9SOworCQl9CisJfQorCWlmIChTVHBzLT5lb2YgPT0gU1RfRU9NX09LKSB7CisJCXJldHZhbCA9ICgtRU5PU1BDKTsKKwkJZ290byBvdXQ7CisJfQorCWVsc2UgaWYgKFNUcHMtPmVvZiA9PSBTVF9FT01fRVJST1IpIHsKKwkJcmV0dmFsID0gKC1FSU8pOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDaGVjayB0aGUgYnVmZmVyIHJlYWRhYmlsaXR5IGluIGNhc2VzIHdoZXJlIGNvcHlfdXNlciBtaWdodCBjYXRjaAorCQkgdGhlIHByb2JsZW1zIGFmdGVyIHNvbWUgdGFwZSBtb3ZlbWVudC4gKi8KKwlpZiAoKGNvcHlfZnJvbV91c2VyKCZpLCBidWYsIDEpICE9IDAgfHwKKwkgICAgIGNvcHlfZnJvbV91c2VyKCZpLCBidWYgKyBjb3VudCAtIDEsIDEpICE9IDApKSB7CisJCXJldHZhbCA9ICgtRUZBVUxUKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFTVG0tPmRvX2J1ZmZlcl93cml0ZXMpIHsKKwkJd3JpdGVfdGhyZXNob2xkID0gMTsKKwl9CisJZWxzZQorCQl3cml0ZV90aHJlc2hvbGQgPSAoU1RwLT5idWZmZXIpLT5idWZmZXJfYmxvY2tzICogU1RwLT5ibG9ja19zaXplOworCWlmICghU1RtLT5kb19hc3luY193cml0ZXMpCisJCXdyaXRlX3RocmVzaG9sZC0tOworCisJdG90YWwgPSBjb3VudDsKKyNpZiBERUJVRworCWlmIChkZWJ1Z2dpbmcpCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFdyaXRpbmcgJWQgYnl0ZXMgdG8gZmlsZSAlZCBibG9jayAlZCBsYmxrICVkIGZzZXEgJWQgZnBwb3MgJWRcbiIsCisJCQkJbmFtZSwgY291bnQsIFNUcHMtPmRydl9maWxlLCBTVHBzLT5kcnZfYmxvY2ssCisJCQkJU1RwLT5sb2dpY2FsX2Jsa19udW0sIFNUcC0+ZnJhbWVfc2VxX251bWJlciwgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbik7CisjZW5kaWYKKwliX3BvaW50ID0gYnVmOworCXdoaWxlICgoU1RwLT5idWZmZXIpLT5idWZmZXJfYnl0ZXMgKyBjb3VudCA+IHdyaXRlX3RocmVzaG9sZCkKKwl7CisJCWRvaW5nX3dyaXRlID0gMTsKKwkJZG9fY291bnQgPSAoU1RwLT5idWZmZXIpLT5idWZmZXJfYmxvY2tzICogU1RwLT5ibG9ja19zaXplIC0KKwkJCSAgIChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlczsKKwkJaWYgKGRvX2NvdW50ID4gY291bnQpCisJCQlkb19jb3VudCA9IGNvdW50OworCisJCWkgPSBhcHBlbmRfdG9fYnVmZmVyKGJfcG9pbnQsIFNUcC0+YnVmZmVyLCBkb19jb3VudCk7CisJCWlmIChpKSB7CisJCQlyZXR2YWwgPSBpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlibGtzID0gZG9fY291bnQgLyBTVHAtPmJsb2NrX3NpemU7CisJCVNUcC0+bG9naWNhbF9ibGtfbnVtICs9IGJsa3M7ICAvKiBsb2dpY2FsX2Jsa19udW0gaXMgaW5jcmVtZW50ZWQgYXMgZGF0YSBpcyBtb3ZlZCBmcm9tIHVzZXIgKi8KKyAgCisJCWkgPSBvc3N0X3dyaXRlX2ZyYW1lKFNUcCwgJlNScG50LCAxKTsKKworCQlpZiAoaSA9PSAoLUVOT1NQQykpIHsKKwkJCXRyYW5zZmVyID0gU1RwLT5idWZmZXItPndyaXRpbmc7CS8qIEZJWE1FIC0tIGNoZWNrIHRoaXMgbG9naWMgKi8KKwkJCWlmICh0cmFuc2ZlciA8PSBkb19jb3VudCkgeworCQkJCWZpbHAtPmZfcG9zICs9IGRvX2NvdW50IC0gdHJhbnNmZXI7CisJCQkJY291bnQgLT0gZG9fY291bnQgLSB0cmFuc2ZlcjsKKwkJCQlpZiAoU1Rwcy0+ZHJ2X2Jsb2NrID49IDApIHsKKwkJCQkJU1Rwcy0+ZHJ2X2Jsb2NrICs9IChkb19jb3VudCAtIHRyYW5zZmVyKSAvIFNUcC0+YmxvY2tfc2l6ZTsKKwkJCQl9CisJCQkJU1Rwcy0+ZW9mID0gU1RfRU9NX09LOworCQkJCXJldHZhbCA9ICgtRU5PU1BDKTsJCS8qIEVPTSB3aXRoaW4gY3VycmVudCByZXF1ZXN0ICovCisjaWYgREVCVUcKKwkJCQlpZiAoZGVidWdnaW5nKQorCQkJCSAgICAgIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEVPTSB3aXRoICVkIGJ5dGVzIHVud3JpdHRlbi5cbiIsCisJCQkJCQkJICAgICBuYW1lLCB0cmFuc2Zlcik7CisjZW5kaWYKKwkJCX0KKwkJCWVsc2UgeworCQkJCVNUcHMtPmVvZiA9IFNUX0VPTV9FUlJPUjsKKwkJCQlTVHBzLT5kcnZfYmxvY2sgPSAoLTEpOwkJLyogVG9vIGNhdXRpb3VzPyAqLworCQkJCXJldHZhbCA9ICgtRUlPKTsJCS8qIEVPTSBmb3Igb2xkIGRhdGEgKi8KKyNpZiBERUJVRworCQkJCWlmIChkZWJ1Z2dpbmcpCisJCQkJICAgICAgcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRU9NIHdpdGggbG9zdCBkYXRhLlxuIiwgbmFtZSk7CisjZW5kaWYKKwkJCX0KKwkJfQorCQllbHNlCisJCQlyZXR2YWwgPSBpOworCQkJCisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlpZiAoU1JwbnQgIT0gTlVMTCkgeworCQkJCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwkJCQlTUnBudCA9IE5VTEw7CisJCQl9CisJCQlTVHAtPmJ1ZmZlci0+YnVmZmVyX2J5dGVzID0gMDsKKwkJCVNUcC0+ZGlydHkgPSAwOworCQkJaWYgKGNvdW50IDwgdG90YWwpCisJCQkJcmV0dmFsID0gdG90YWwgLSBjb3VudDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZmlscC0+Zl9wb3MgKz0gZG9fY291bnQ7CisJCWJfcG9pbnQgKz0gZG9fY291bnQ7CisJCWNvdW50IC09IGRvX2NvdW50OworCQlpZiAoU1Rwcy0+ZHJ2X2Jsb2NrID49IDApIHsKKwkJCVNUcHMtPmRydl9ibG9jayArPSBibGtzOworCQl9CisJCVNUcC0+YnVmZmVyLT5idWZmZXJfYnl0ZXMgPSAwOworCQlTVHAtPmRpcnR5ID0gMDsKKwl9ICAvKiBlbmQgd2hpbGUgd3JpdGUgdGhyZXNob2xkIGV4Y2VlZGVkICovCisKKwlpZiAoY291bnQgIT0gMCkgeworCQlTVHAtPmRpcnR5ID0gMTsKKwkJaSA9IGFwcGVuZF90b19idWZmZXIoYl9wb2ludCwgU1RwLT5idWZmZXIsIGNvdW50KTsKKwkJaWYgKGkpIHsKKwkJCXJldHZhbCA9IGk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlibGtzID0gY291bnQgLyBTVHAtPmJsb2NrX3NpemU7CisJCVNUcC0+bG9naWNhbF9ibGtfbnVtICs9IGJsa3M7CisJCWlmIChTVHBzLT5kcnZfYmxvY2sgPj0gMCkgeworCQkJU1Rwcy0+ZHJ2X2Jsb2NrICs9IGJsa3M7CisJCX0KKwkJZmlscC0+Zl9wb3MgKz0gY291bnQ7CisJCWNvdW50ID0gMDsKKwl9CisKKwlpZiAoZG9pbmdfd3JpdGUgJiYgKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgIT0gMCkgeworCQlyZXR2YWwgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKFNUbS0+ZG9fYXN5bmNfd3JpdGVzICYmICgoU1RwLT5idWZmZXIpLT5idWZmZXJfYnl0ZXMgPj0gU1RwLT53cml0ZV90aHJlc2hvbGQpKSB7IAorCQkvKiBTY2hlZHVsZSBhbiBhc3luY2hyb25vdXMgd3JpdGUgKi8KKwkJKFNUcC0+YnVmZmVyKS0+d3JpdGluZyA9ICgoU1RwLT5idWZmZXIpLT5idWZmZXJfYnl0ZXMgLworCQkJCQkgICBTVHAtPmJsb2NrX3NpemUpICogU1RwLT5ibG9ja19zaXplOworCQlTVHAtPmRpcnR5ID0gISgoU1RwLT5idWZmZXIpLT53cml0aW5nID09CisJCQkJICAgICAgICAgIChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyk7CisKKwkJaSA9IG9zc3Rfd3JpdGVfZnJhbWUoU1RwLCAmU1JwbnQsIDApOworCQlpZiAoaSA8IDApIHsKKwkJCXJldHZhbCA9ICgtRUlPKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCVNScG50ID0gTlVMTDsJCQkvKiBQcmV2ZW50IHJlbGVhc2luZyB0aGlzIHJlcXVlc3QhICovCisJfQorCVNUcHMtPmF0X3NtICY9ICh0b3RhbCA9PSAwKTsKKwlpZiAodG90YWwgPiAwKQorCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKworCXJldHZhbCA9IHRvdGFsOworCitvdXQ6CisJaWYgKFNScG50ICE9IE5VTEwpIHNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKworCXVwKCZTVHAtPmxvY2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKworCisvKiBSZWFkIGNvbW1hbmQgKi8KK3N0YXRpYyBzc2l6ZV90IG9zc3RfcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbHAsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzc2l6ZV90CQkgICAgICB0b3RhbCwgcmV0dmFsID0gMDsKKwlzc2l6ZV90CQkgICAgICBpLCB0cmFuc2ZlcjsKKwlpbnQJCSAgICAgIHNwZWNpYWw7CisJc3RydWN0IHN0X21vZGVkZWYgICAqIFNUbTsKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgICogU1RwczsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICogU1JwbnQgPSBOVUxMOworCXN0cnVjdCBvc3N0X3RhcGUgICAgKiBTVHAgICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwljaGFyCQkgICAgKiBuYW1lICA9IHRhcGVfbmFtZShTVHApOworCisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZTVHAtPmxvY2spKQorCQlyZXR1cm4gKC1FUkVTVEFSVFNZUyk7CisKKwkvKgorCSAqIElmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGVycm9yIHJlY292ZXJ5LCBkb24ndCBsZXQgYW55b25lCisJICogZWxzZSB0cnkgYW5kIHVzZSB0aGlzIGRldmljZS4gIEFsc28sIGlmIGVycm9yIHJlY292ZXJ5IGZhaWxzLCBpdAorCSAqIG1heSB0cnkgYW5kIHRha2UgdGhlIGRldmljZSBvZmZsaW5lLCBpbiB3aGljaCBjYXNlIGFsbCBmdXJ0aGVyCisJICogYWNjZXNzIHRvIHRoZSBkZXZpY2UgaXMgcHJvaGliaXRlZC4KKwkgKi8KKwlpZiggIXNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhTVHAtPmRldmljZSkgKSB7CisJCXJldHZhbCA9ICgtRU5YSU8pOworCQlnb3RvIG91dDsKKwl9CisJCisJaWYgKFNUcC0+cmVhZHkgIT0gU1RfUkVBRFkpIHsKKwkJaWYgKFNUcC0+cmVhZHkgPT0gU1RfTk9fVEFQRSkKKwkJCXJldHZhbCA9ICgtRU5PTUVESVVNKTsKKwkJZWxzZQorCQkJcmV0dmFsID0gKC1FSU8pOworCQlnb3RvIG91dDsKKwl9CisJU1RtID0gJihTVHAtPm1vZGVzW1NUcC0+Y3VycmVudF9tb2RlXSk7CisJaWYgKCFTVG0tPmRlZmluZWQpIHsKKwkJcmV0dmFsID0gKC1FTlhJTyk7CisJCWdvdG8gb3V0OworCX0KKyNpZiBERUJVRworCWlmICghU1RwLT5pbl91c2UpIHsKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogSW5jb3JyZWN0IGRldmljZS5cbiIsIG5hbWUpOworCQlyZXR2YWwgPSAoLUVJTyk7CisJCWdvdG8gb3V0OworCX0KKyNlbmRpZgorCS8qIE11c3QgaGF2ZSBpbml0aWFsaXplZCBtZWRpdW0gKi8KKwlpZiAoIVNUcC0+aGVhZGVyX29rKSB7CisJCXJldHZhbCA9ICgtRUlPKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKFNUcC0+ZG9fYXV0b19sb2NrICYmIFNUcC0+ZG9vcl9sb2NrZWQgPT0gU1RfVU5MT0NLRUQgJiYgIWRvX2Rvb3JfbG9jayhTVHAsIDEpKQorCQlTVHAtPmRvb3JfbG9ja2VkID0gU1RfTE9DS0VEX0FVVE87CisKKwlTVHBzID0gJihTVHAtPnBzW1NUcC0+cGFydGl0aW9uXSk7CisJaWYgKFNUcHMtPnJ3ID09IFNUX1dSSVRJTkcpIHsKKwkJcmV0dmFsID0gb3NzdF9mbHVzaF9idWZmZXIoU1RwLCAmU1JwbnQsIDApOworCQlpZiAocmV0dmFsKQorCQkJZ290byBvdXQ7CisJCVNUcHMtPnJ3ID0gU1RfSURMRTsKKwkJLyogRklYTUUgLS0gdGhpcyBtYXkgbGVhdmUgdGhlIHRhcGUgd2l0aG91dCBFT0QgYW5kIHVwMmRhdGUgaGVhZGVycyAqLworCX0KKworCWlmICgoY291bnQgJSBTVHAtPmJsb2NrX3NpemUpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgIiVzOlc6IFJlYWQgKCVaZCBieXRlcykgbm90IG11bHRpcGxlIG9mIHRhcGUgYmxvY2sgc2l6ZSAoJWQlYykuXG4iLCBuYW1lLCBjb3VudCwKKwkJICAgIFNUcC0+YmxvY2tfc2l6ZTwxMDI0P1NUcC0+YmxvY2tfc2l6ZTpTVHAtPmJsb2NrX3NpemUvMTAyNCwgU1RwLT5ibG9ja19zaXplPDEwMjQ/J2InOidrJyk7CisJfQorCisjaWYgREVCVUcKKwlpZiAoZGVidWdnaW5nICYmIFNUcHMtPmVvZiAhPSBTVF9OT0VPRikKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRU9GL0VPTSBmbGFnIHVwICglZCkuIEJ5dGVzICVkXG4iLCBuYW1lLAorCQkJCSAgICAgU1Rwcy0+ZW9mLCAoU1RwLT5idWZmZXIpLT5idWZmZXJfYnl0ZXMpOworI2VuZGlmCisJaWYgKChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyA9PSAwICYmCisJICAgICBTVHBzLT5lb2YgPj0gU1RfRU9EXzEpIHsKKwkJaWYgKFNUcHMtPmVvZiA8IFNUX0VPRCkgeworCQkJU1Rwcy0+ZW9mICs9IDE7CisJCQlyZXR2YWwgPSAwOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmV0dmFsID0gKC1FSU8pOyAgLyogRU9NIG9yIEJsYW5rIENoZWNrICovCisJCWdvdG8gb3V0OworCX0KKworCS8qIENoZWNrIHRoZSBidWZmZXIgd3JpdGFiaWxpdHkgYmVmb3JlIGFueSB0YXBlIG1vdmVtZW50LiBEb24ndCBhbHRlcgorCQkgYnVmZmVyIGRhdGEuICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpLCBidWYsIDEpICAgICAgICAgICAgICE9IDAgfHwKKwkgICAgY29weV90b191c2VyICAoYnVmLCAmaSwgMSkgICAgICAgICAgICAgIT0gMCB8fAorCSAgICBjb3B5X2Zyb21fdXNlcigmaSwgYnVmICsgY291bnQgLSAxLCAxKSAhPSAwIHx8CisJICAgIGNvcHlfdG9fdXNlciAgKGJ1ZiArIGNvdW50IC0gMSwgJmksIDEpICE9IDApIHsKKwkJcmV0dmFsID0gKC1FRkFVTFQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBMb29wIHVudGlsIGVub3VnaCBkYXRhIGluIGJ1ZmZlciBvciBhIHNwZWNpYWwgY29uZGl0aW9uIGZvdW5kICovCisJZm9yICh0b3RhbCA9IDAsIHNwZWNpYWwgPSAwOyB0b3RhbCA8IGNvdW50IC0gU1RwLT5ibG9ja19zaXplICsgMSAmJiAhc3BlY2lhbDsgKSB7CisKKwkJLyogR2V0IG5ldyBkYXRhIGlmIHRoZSBidWZmZXIgaXMgZW1wdHkgKi8KKwkJaWYgKChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyA9PSAwKSB7CisJCQlpZiAoU1Rwcy0+ZW9mID09IFNUX0ZNX0hJVCkKKwkJCQlicmVhazsKKwkJCXNwZWNpYWwgPSBvc3N0X2dldF9sb2dpY2FsX2ZyYW1lKFNUcCwgJlNScG50LCBTVHAtPmZyYW1lX3NlcV9udW1iZXIsIDApOworCQkJaWYgKHNwZWNpYWwgPCAwKSB7IAkJCS8qIE5vIG5lZWQgdG8gY29udGludWUgcmVhZCAqLworCQkJCVNUcC0+ZnJhbWVfaW5fYnVmZmVyID0gMDsKKwkJCQlyZXR2YWwgPSBzcGVjaWFsOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisKKwkJLyogTW92ZSB0aGUgZGF0YSBmcm9tIGRyaXZlciBidWZmZXIgdG8gdXNlciBidWZmZXIgKi8KKwkJaWYgKChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyA+IDApIHsKKyNpZiBERUJVRworCQkJaWYgKGRlYnVnZ2luZyAmJiBTVHBzLT5lb2YgIT0gU1RfTk9FT0YpCisJCQkgICAgcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRU9GIHVwICglZCkuIExlZnQgJWQsIG5lZWRlZCAlZC5cbiIsIG5hbWUsCisJCQkJCQkgU1Rwcy0+ZW9mLCAoU1RwLT5idWZmZXIpLT5idWZmZXJfYnl0ZXMsIGNvdW50IC0gdG90YWwpOworI2VuZGlmCisJCSAgICAgICAJLyogZm9yY2UgbXVsdGlwbGUgb2YgYmxvY2sgc2l6ZSwgbm90ZSBibG9ja19zaXplIG1heSBoYXZlIGJlZW4gYWRqdXN0ZWQgKi8KKwkJCXRyYW5zZmVyID0gKCgoU1RwLT5idWZmZXIpLT5idWZmZXJfYnl0ZXMgPCBjb3VudCAtIHRvdGFsID8KKwkJCQkgICAgIChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyA6IGNvdW50IC0gdG90YWwpLworCQkJCQlTVHAtPmJsb2NrX3NpemUpICogU1RwLT5ibG9ja19zaXplOworCisJCQlpZiAodHJhbnNmZXIgPT0gMCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICIlczpXOiBOb3RoaW5nIGNhbiBiZSB0cmFuc2ZlcmVkLCByZXF1ZXN0ZWQgJVpkLCB0YXBlIGJsb2NrIHNpemUgKCVkJWMpLlxuIiwKKwkJCSAgIAkJbmFtZSwgY291bnQsIFNUcC0+YmxvY2tfc2l6ZSA8IDEwMjQ/CisJCQkJCVNUcC0+YmxvY2tfc2l6ZTpTVHAtPmJsb2NrX3NpemUvMTAyNCwKKwkJCQkgICAgICAgCVNUcC0+YmxvY2tfc2l6ZTwxMDI0PydiJzonaycpOworCQkJCWJyZWFrOworCQkJfQorCQkJaSA9IGZyb21fYnVmZmVyKFNUcC0+YnVmZmVyLCBidWYsIHRyYW5zZmVyKTsKKwkJCWlmIChpKSAgeworCQkJCXJldHZhbCA9IGk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlTVHAtPmxvZ2ljYWxfYmxrX251bSArPSB0cmFuc2ZlciAvIFNUcC0+YmxvY2tfc2l6ZTsKKwkJCVNUcHMtPmRydl9ibG9jayAgICAgICs9IHRyYW5zZmVyIC8gU1RwLT5ibG9ja19zaXplOworCQkJZmlscC0+Zl9wb3MgICAgICAgICAgKz0gdHJhbnNmZXI7CisJCQlidWYgICAgICAgICAgICAgICAgICArPSB0cmFuc2ZlcjsKKwkJCXRvdGFsICAgICAgICAgICAgICAgICs9IHRyYW5zZmVyOworCQl9CisgCisJCWlmICgoU1RwLT5idWZmZXIpLT5idWZmZXJfYnl0ZXMgPT0gMCkgeworI2lmIERFQlVHCisJCQlpZiAoZGVidWdnaW5nKQorCQkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEZpbmlzaGVkIHdpdGggZnJhbWUgJWRcbiIsCisJCQkJCSAgICAgICAJbmFtZSwgU1RwLT5mcmFtZV9zZXFfbnVtYmVyKTsKKyNlbmRpZgorCQkJU1RwLT5mcmFtZV9pbl9idWZmZXIgPSAwOworCQkJU1RwLT5mcmFtZV9zZXFfbnVtYmVyKys7ICAgICAgICAgICAgICAvKiBmcmFtZSB0byBsb29rIGZvciBuZXh0IHRpbWUgKi8KKwkJfQorCX0gLyogZm9yICh0b3RhbCA9IDAsIHNwZWNpYWwgPSAwOyB0b3RhbCA8IGNvdW50ICYmICFzcGVjaWFsOyApICovCisKKwkvKiBDaGFuZ2UgdGhlIGVvZiBzdGF0ZSBpZiBubyBkYXRhIGZyb20gdGFwZSBvciBidWZmZXIgKi8KKwlpZiAodG90YWwgPT0gMCkgeworCQlpZiAoU1Rwcy0+ZW9mID09IFNUX0ZNX0hJVCkgeworCQkJU1Rwcy0+ZW9mID0gKFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24gPj0gU1RwLT5lb2RfZnJhbWVfcHBvcyk/U1RfRU9EXzI6U1RfRk07CisJCQlTVHBzLT5kcnZfYmxvY2sgPSAwOworCQkJaWYgKFNUcHMtPmRydl9maWxlID49IDApCisJCQkJU1Rwcy0+ZHJ2X2ZpbGUrKzsKKwkJfQorCQllbHNlIGlmIChTVHBzLT5lb2YgPT0gU1RfRU9EXzEpIHsKKwkJCVNUcHMtPmVvZiA9IFNUX0VPRF8yOworCQkJaWYgKFNUcHMtPmRydl9ibG9jayA+IDAgJiYgU1Rwcy0+ZHJ2X2ZpbGUgPj0gMCkKKwkJCQlTVHBzLT5kcnZfZmlsZSsrOworCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gMDsKKwkJfQorCQllbHNlIGlmIChTVHBzLT5lb2YgPT0gU1RfRU9EXzIpCisJCQlTVHBzLT5lb2YgPSBTVF9FT0Q7CisJfQorCWVsc2UgaWYgKFNUcHMtPmVvZiA9PSBTVF9GTSkKKwkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisKKwlyZXR2YWwgPSB0b3RhbDsKKworb3V0OgorCWlmIChTUnBudCAhPSBOVUxMKSBzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisKKwl1cCgmU1RwLT5sb2NrKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKworLyogU2V0IHRoZSBkcml2ZXIgb3B0aW9ucyAqLworc3RhdGljIHZvaWQgb3NzdF9sb2dfb3B0aW9ucyhzdHJ1Y3Qgb3NzdF90YXBlICpTVHAsIHN0cnVjdCBzdF9tb2RlZGVmICpTVG0sIGNoYXIgKm5hbWUpCit7CisgIHByaW50ayhLRVJOX0lORk8KKyIlczpJOiBNb2RlICVkIG9wdGlvbnM6IGJ1ZmZlciB3cml0ZXM6ICVkLCBhc3luYyB3cml0ZXM6ICVkLCByZWFkIGFoZWFkOiAlZFxuIiwKKwkgbmFtZSwgU1RwLT5jdXJyZW50X21vZGUsIFNUbS0+ZG9fYnVmZmVyX3dyaXRlcywgU1RtLT5kb19hc3luY193cml0ZXMsCisJIFNUbS0+ZG9fcmVhZF9haGVhZCk7CisgIHByaW50ayhLRVJOX0lORk8KKyIlczpJOiAgICBjYW4gYnNyOiAlZCwgdHdvIEZNczogJWQsIGZhc3QgbXRlb206ICVkLCBhdXRvIGxvY2s6ICVkLFxuIiwKKwkgbmFtZSwgU1RwLT5jYW5fYnNyLCBTVHAtPnR3b19mbSwgU1RwLT5mYXN0X210ZW9tLCBTVHAtPmRvX2F1dG9fbG9jayk7CisgIHByaW50ayhLRVJOX0lORk8KKyIlczpJOiAgICBkZWZzIGZvciB3cjogJWQsIG5vIGJsb2NrIGxpbWl0czogJWQsIHBhcnRpdGlvbnM6ICVkLCBzMiBsb2c6ICVkXG4iLAorCSBuYW1lLCBTVG0tPmRlZmF1bHRzX2Zvcl93cml0ZXMsIFNUcC0+b21pdF9ibGtsaW1zLCBTVHAtPmNhbl9wYXJ0aXRpb25zLAorCSBTVHAtPnNjc2kyX2xvZ2ljYWwpOworICBwcmludGsoS0VSTl9JTkZPCisiJXM6STogICAgc3lzdjogJWRcbiIsIG5hbWUsIFNUbS0+c3lzdik7CisjaWYgREVCVUcKKyAgcHJpbnRrKEtFUk5fSU5GTworCSAiJXM6RDogICAgZGVidWdnaW5nOiAlZFxuIiwKKwkgbmFtZSwgZGVidWdnaW5nKTsKKyNlbmRpZgorfQorCisKK3N0YXRpYyBpbnQgb3NzdF9zZXRfb3B0aW9ucyhzdHJ1Y3Qgb3NzdF90YXBlICpTVHAsIGxvbmcgb3B0aW9ucykKK3sKKwlpbnQJCSAgICB2YWx1ZTsKKwlsb25nCQkgICAgY29kZTsKKwlzdHJ1Y3Qgc3RfbW9kZWRlZiAqIFNUbTsKKwljaGFyCQkgICogbmFtZSA9IHRhcGVfbmFtZShTVHApOworCisJU1RtID0gJihTVHAtPm1vZGVzW1NUcC0+Y3VycmVudF9tb2RlXSk7CisJaWYgKCFTVG0tPmRlZmluZWQpIHsKKwkJbWVtY3B5KFNUbSwgJihTVHAtPm1vZGVzWzBdKSwgc2l6ZW9mKCpTVG0pKTsKKwkJbW9kZXNfZGVmaW5lZCA9IDE7CisjaWYgREVCVUcKKwkJaWYgKGRlYnVnZ2luZykKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEluaXRpYWxpemVkIG1vZGUgJWQgZGVmaW5pdGlvbiBmcm9tIG1vZGUgMFxuIiwKKwkJCQkJICAgICBuYW1lLCBTVHAtPmN1cnJlbnRfbW9kZSk7CisjZW5kaWYKKwl9CisKKwljb2RlID0gb3B0aW9ucyAmIE1UX1NUX09QVElPTlM7CisJaWYgKGNvZGUgPT0gTVRfU1RfQk9PTEVBTlMpIHsKKwkJU1RtLT5kb19idWZmZXJfd3JpdGVzID0gKG9wdGlvbnMgJiBNVF9TVF9CVUZGRVJfV1JJVEVTKSAhPSAwOworCQlTVG0tPmRvX2FzeW5jX3dyaXRlcyAgPSAob3B0aW9ucyAmIE1UX1NUX0FTWU5DX1dSSVRFUykgIT0gMDsKKwkJU1RtLT5kZWZhdWx0c19mb3Jfd3JpdGVzID0gKG9wdGlvbnMgJiBNVF9TVF9ERUZfV1JJVEVTKSAhPSAwOworCQlTVG0tPmRvX3JlYWRfYWhlYWQgICAgPSAob3B0aW9ucyAmIE1UX1NUX1JFQURfQUhFQUQpICE9IDA7CisJCVNUcC0+dHdvX2ZtCSAgICAgID0gKG9wdGlvbnMgJiBNVF9TVF9UV09fRk0pICE9IDA7CisJCVNUcC0+ZmFzdF9tdGVvbQkgICAgICA9IChvcHRpb25zICYgTVRfU1RfRkFTVF9NVEVPTSkgIT0gMDsKKwkJU1RwLT5kb19hdXRvX2xvY2sgICAgID0gKG9wdGlvbnMgJiBNVF9TVF9BVVRPX0xPQ0spICE9IDA7CisJCVNUcC0+Y2FuX2JzciAgICAgICAgICA9IChvcHRpb25zICYgTVRfU1RfQ0FOX0JTUikgIT0gMDsKKwkJU1RwLT5vbWl0X2Jsa2xpbXMgICAgID0gKG9wdGlvbnMgJiBNVF9TVF9OT19CTEtMSU1TKSAhPSAwOworCQlpZiAoKFNUcC0+ZGV2aWNlKS0+c2NzaV9sZXZlbCA+PSBTQ1NJXzIpCisJCQlTVHAtPmNhbl9wYXJ0aXRpb25zID0gKG9wdGlvbnMgJiBNVF9TVF9DQU5fUEFSVElUSU9OUykgIT0gMDsKKwkJU1RwLT5zY3NpMl9sb2dpY2FsICAgID0gKG9wdGlvbnMgJiBNVF9TVF9TQ1NJMkxPR0lDQUwpICE9IDA7CisJCVNUbS0+c3lzdgkgICAgICA9IChvcHRpb25zICYgTVRfU1RfU1lTVikgIT0gMDsKKyNpZiBERUJVRworCQlkZWJ1Z2dpbmcgPSAob3B0aW9ucyAmIE1UX1NUX0RFQlVHR0lORykgIT0gMDsKKyNlbmRpZgorCQlvc3N0X2xvZ19vcHRpb25zKFNUcCwgU1RtLCBuYW1lKTsKKwl9CisJZWxzZSBpZiAoY29kZSA9PSBNVF9TVF9TRVRCT09MRUFOUyB8fCBjb2RlID09IE1UX1NUX0NMRUFSQk9PTEVBTlMpIHsKKwkJdmFsdWUgPSAoY29kZSA9PSBNVF9TVF9TRVRCT09MRUFOUyk7CisJCWlmICgob3B0aW9ucyAmIE1UX1NUX0JVRkZFUl9XUklURVMpICE9IDApCisJCQlTVG0tPmRvX2J1ZmZlcl93cml0ZXMgPSB2YWx1ZTsKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfQVNZTkNfV1JJVEVTKSAhPSAwKQorCQkJU1RtLT5kb19hc3luY193cml0ZXMgPSB2YWx1ZTsKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfREVGX1dSSVRFUykgIT0gMCkKKwkJCVNUbS0+ZGVmYXVsdHNfZm9yX3dyaXRlcyA9IHZhbHVlOworCQlpZiAoKG9wdGlvbnMgJiBNVF9TVF9SRUFEX0FIRUFEKSAhPSAwKQorCQkJU1RtLT5kb19yZWFkX2FoZWFkID0gdmFsdWU7CisJCWlmICgob3B0aW9ucyAmIE1UX1NUX1RXT19GTSkgIT0gMCkKKwkJCVNUcC0+dHdvX2ZtID0gdmFsdWU7CisJCWlmICgob3B0aW9ucyAmIE1UX1NUX0ZBU1RfTVRFT00pICE9IDApCisJCQlTVHAtPmZhc3RfbXRlb20gPSB2YWx1ZTsKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfQVVUT19MT0NLKSAhPSAwKQorCQkJU1RwLT5kb19hdXRvX2xvY2sgPSB2YWx1ZTsKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfQ0FOX0JTUikgIT0gMCkKKwkJCVNUcC0+Y2FuX2JzciA9IHZhbHVlOworCQlpZiAoKG9wdGlvbnMgJiBNVF9TVF9OT19CTEtMSU1TKSAhPSAwKQorCQkJU1RwLT5vbWl0X2Jsa2xpbXMgPSB2YWx1ZTsKKwkJaWYgKChTVHAtPmRldmljZSktPnNjc2lfbGV2ZWwgPj0gU0NTSV8yICYmCisJCSAgICAob3B0aW9ucyAmIE1UX1NUX0NBTl9QQVJUSVRJT05TKSAhPSAwKQorCQkJU1RwLT5jYW5fcGFydGl0aW9ucyA9IHZhbHVlOworCQlpZiAoKG9wdGlvbnMgJiBNVF9TVF9TQ1NJMkxPR0lDQUwpICE9IDApCisJCQlTVHAtPnNjc2kyX2xvZ2ljYWwgPSB2YWx1ZTsKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfU1lTVikgIT0gMCkKKwkJCVNUbS0+c3lzdiA9IHZhbHVlOworI2lmIERFQlVHCisJCWlmICgob3B0aW9ucyAmIE1UX1NUX0RFQlVHR0lORykgIT0gMCkKKwkJCWRlYnVnZ2luZyA9IHZhbHVlOworI2VuZGlmCisJCW9zc3RfbG9nX29wdGlvbnMoU1RwLCBTVG0sIG5hbWUpOworCX0KKwllbHNlIGlmIChjb2RlID09IE1UX1NUX1dSSVRFX1RIUkVTSE9MRCkgeworCQl2YWx1ZSA9IChvcHRpb25zICYgfk1UX1NUX09QVElPTlMpICogU1RfS0lMT0JZVEU7CisJCWlmICh2YWx1ZSA8IDEgfHwgdmFsdWUgPiBvc3N0X2J1ZmZlcl9zaXplKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpXOiBXcml0ZSB0aHJlc2hvbGQgJWQgdG9vIHNtYWxsIG9yIHRvbyBsYXJnZS5cbiIsCisJCQkJCSAgICAgbmFtZSwgdmFsdWUpOworCQkJcmV0dXJuICgtRUlPKTsKKwkJfQorCQlTVHAtPndyaXRlX3RocmVzaG9sZCA9IHZhbHVlOworCQlwcmludGsoS0VSTl9JTkZPICIlczpJOiBXcml0ZSB0aHJlc2hvbGQgc2V0IHRvICVkIGJ5dGVzLlxuIiwKKwkJCQkgIG5hbWUsIHZhbHVlKTsKKwl9CisJZWxzZSBpZiAoY29kZSA9PSBNVF9TVF9ERUZfQkxLU0laRSkgeworCQl2YWx1ZSA9IChvcHRpb25zICYgfk1UX1NUX09QVElPTlMpOworCQlpZiAodmFsdWUgPT0gfk1UX1NUX09QVElPTlMpIHsKKwkJCVNUbS0+ZGVmYXVsdF9ibGtzaXplID0gKC0xKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOkk6IERlZmF1bHQgYmxvY2sgc2l6ZSBkaXNhYmxlZC5cbiIsIG5hbWUpOworCQl9CisJCWVsc2UgeworCQkJaWYgKHZhbHVlIDwgNTEyIHx8IHZhbHVlID4gT1NfREFUQV9TSVpFIHx8IE9TX0RBVEFfU0laRSAlIHZhbHVlKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6VzogRGVmYXVsdCBibG9jayBzaXplIGNhbm5vdCBiZSBzZXQgdG8gJWQuXG4iLAorCQkJCQkJCSBuYW1lLCB2YWx1ZSk7CisJCQkJcmV0dXJuICgtRUlOVkFMKTsKKwkJCX0KKwkJCVNUbS0+ZGVmYXVsdF9ibGtzaXplID0gdmFsdWU7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczpJOiBEZWZhdWx0IGJsb2NrIHNpemUgc2V0IHRvICVkIGJ5dGVzLlxuIiwKKwkJCQkJICBuYW1lLCBTVG0tPmRlZmF1bHRfYmxrc2l6ZSk7CisJCX0KKwl9CisJZWxzZSBpZiAoY29kZSA9PSBNVF9TVF9USU1FT1VUUykgeworCQl2YWx1ZSA9IChvcHRpb25zICYgfk1UX1NUX09QVElPTlMpOworCQlpZiAoKHZhbHVlICYgTVRfU1RfU0VUX0xPTkdfVElNRU9VVCkgIT0gMCkgeworCQkJU1RwLT5sb25nX3RpbWVvdXQgPSAodmFsdWUgJiB+TVRfU1RfU0VUX0xPTkdfVElNRU9VVCkgKiBIWjsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOkk6IExvbmcgdGltZW91dCBzZXQgdG8gJWQgc2Vjb25kcy5cbiIsIG5hbWUsCisJCQkJCSAgICAgKHZhbHVlICYgfk1UX1NUX1NFVF9MT05HX1RJTUVPVVQpKTsKKwkJfQorCQllbHNlIHsKKwkJCVNUcC0+dGltZW91dCA9IHZhbHVlICogSFo7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczpJOiBOb3JtYWwgdGltZW91dCBzZXQgdG8gJWQgc2Vjb25kcy5cbiIsIG5hbWUsIHZhbHVlKTsKKwkJfQorCX0KKwllbHNlIGlmIChjb2RlID09IE1UX1NUX0RFRl9PUFRJT05TKSB7CisJCWNvZGUgPSAob3B0aW9ucyAmIH5NVF9TVF9DTEVBUl9ERUZBVUxUKTsKKwkJdmFsdWUgPSAob3B0aW9ucyAmIE1UX1NUX0NMRUFSX0RFRkFVTFQpOworCQlpZiAoY29kZSA9PSBNVF9TVF9ERUZfREVOU0lUWSkgeworCQkJaWYgKHZhbHVlID09IE1UX1NUX0NMRUFSX0RFRkFVTFQpIHsKKwkJCQlTVG0tPmRlZmF1bHRfZGVuc2l0eSA9ICgtMSk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6STogRGVuc2l0eSBkZWZhdWx0IGRpc2FibGVkLlxuIiwgbmFtZSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlTVG0tPmRlZmF1bHRfZGVuc2l0eSA9IHZhbHVlICYgMHhmZjsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczpJOiBEZW5zaXR5IGRlZmF1bHQgc2V0IHRvICV4XG4iLAorCQkJCQkJICBuYW1lLCBTVG0tPmRlZmF1bHRfZGVuc2l0eSk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoY29kZSA9PSBNVF9TVF9ERUZfRFJWQlVGRkVSKSB7CisJCQlpZiAodmFsdWUgPT0gTVRfU1RfQ0xFQVJfREVGQVVMVCkgeworCQkJCVNUcC0+ZGVmYXVsdF9kcnZidWZmZXIgPSAweGZmOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOkk6IERyaXZlIGJ1ZmZlciBkZWZhdWx0IGRpc2FibGVkLlxuIiwgbmFtZSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlTVHAtPmRlZmF1bHRfZHJ2YnVmZmVyID0gdmFsdWUgJiA3OworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOkk6IERyaXZlIGJ1ZmZlciBkZWZhdWx0IHNldCB0byAleFxuIiwKKwkJCQkJCSAgbmFtZSwgU1RwLT5kZWZhdWx0X2RydmJ1ZmZlcik7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoY29kZSA9PSBNVF9TVF9ERUZfQ09NUFJFU1NJT04pIHsKKwkJCWlmICh2YWx1ZSA9PSBNVF9TVF9DTEVBUl9ERUZBVUxUKSB7CisJCQkJU1RtLT5kZWZhdWx0X2NvbXByZXNzaW9uID0gU1RfRE9OVF9UT1VDSDsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczpJOiBDb21wcmVzc2lvbiBkZWZhdWx0IGRpc2FibGVkLlxuIiwgbmFtZSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlTVG0tPmRlZmF1bHRfY29tcHJlc3Npb24gPSAodmFsdWUgJiAxID8gU1RfWUVTIDogU1RfTk8pOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOkk6IENvbXByZXNzaW9uIGRlZmF1bHQgc2V0IHRvICV4XG4iLAorCQkJCQkJICBuYW1lLCAodmFsdWUgJiAxKSk7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCQlyZXR1cm4gKC1FSU8pOworCisJcmV0dXJuIDA7Cit9CisKKworLyogSW50ZXJuYWwgaW9jdGwgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgb3NzdF9pbnRfaW9jdGwoc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsCisJCQkgICAgIHVuc2lnbmVkIGludCBjbWRfaW4sIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludAkJCXRpbWVvdXQ7CisJbG9uZwkJCWx0bXA7CisJaW50CQkJaSwgaW9jdGxfcmVzdWx0OworCWludAkJCWNoZ19lb2YgPSAxOworCXVuc2lnbmVkIGNoYXIJCWNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICAgKiBTUnBudCA9ICogYVNScG50OworCXN0cnVjdCBzdF9wYXJ0c3RhdCAgICAqIFNUcHM7CisJaW50CQkJZmlsZW5vLCBibGtubywgYXRfc20sIGZyYW1lX3NlcV9udW1iciwgbG9naWNhbF9ibGtfbnVtOworCWludAkJCWRhdGFsZW4gPSAwLCBkaXJlY3Rpb24gPSBETUFfTk9ORTsKKwljaGFyCQkgICAgICAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKworCWlmIChTVHAtPnJlYWR5ICE9IFNUX1JFQURZICYmIGNtZF9pbiAhPSBNVExPQUQpIHsKKwkJaWYgKFNUcC0+cmVhZHkgPT0gU1RfTk9fVEFQRSkKKwkJCXJldHVybiAoLUVOT01FRElVTSk7CisJCWVsc2UKKwkJCXJldHVybiAoLUVJTyk7CisJfQorCXRpbWVvdXQgPSBTVHAtPmxvbmdfdGltZW91dDsKKwlTVHBzID0gJihTVHAtPnBzW1NUcC0+cGFydGl0aW9uXSk7CisJZmlsZW5vID0gU1Rwcy0+ZHJ2X2ZpbGU7CisJYmxrbm8gPSBTVHBzLT5kcnZfYmxvY2s7CisJYXRfc20gPSBTVHBzLT5hdF9zbTsKKwlmcmFtZV9zZXFfbnVtYnIgPSBTVHAtPmZyYW1lX3NlcV9udW1iZXI7CisJbG9naWNhbF9ibGtfbnVtID0gU1RwLT5sb2dpY2FsX2Jsa19udW07CisKKwltZW1zZXQoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwlzd2l0Y2ggKGNtZF9pbikgeworCSBjYXNlIE1URlNGTToKKwkJY2hnX2VvZiA9IDA7IC8qIENoYW5nZWQgZnJvbSB0aGUgRlNGIGFmdGVyIHRoaXMgKi8KKwkgY2FzZSBNVEZTRjoKKwkJaWYgKFNUcC0+cmF3KQorCQkgICByZXR1cm4gKC1FSU8pOworCQlpZiAoU1RwLT5saW51eF9tZWRpYSkKKwkJICAgaW9jdGxfcmVzdWx0ID0gb3NzdF9zcGFjZV9vdmVyX2ZpbGVtYXJrc19mb3J3YXJkX2Zhc3QoU1RwLCAmU1JwbnQsIGNtZF9pbiwgYXJnKTsKKwkJZWxzZQorCQkgICBpb2N0bF9yZXN1bHQgPSBvc3N0X3NwYWNlX292ZXJfZmlsZW1hcmtzX2ZvcndhcmRfc2xvdyhTVHAsICZTUnBudCwgY21kX2luLCBhcmcpOworCQlpZiAoZmlsZW5vID49IDApCisJCSAgIGZpbGVubyArPSBhcmc7CisJCWJsa25vID0gMDsKKwkJYXRfc20gJj0gKGFyZyA9PSAwKTsKKwkJZ290byBvc19ieXBhc3M7CisKKwkgY2FzZSBNVEJTRjoKKwkJY2hnX2VvZiA9IDA7IC8qIENoYW5nZWQgZnJvbSB0aGUgRlNGIGFmdGVyIHRoaXMgKi8KKwkgY2FzZSBNVEJTRk06CisJCWlmIChTVHAtPnJhdykKKwkJICAgcmV0dXJuICgtRUlPKTsKKwkJaW9jdGxfcmVzdWx0ID0gb3NzdF9zcGFjZV9vdmVyX2ZpbGVtYXJrc19iYWNrd2FyZChTVHAsICZTUnBudCwgY21kX2luLCBhcmcpOworCQlpZiAoZmlsZW5vID49IDApCisJCSAgIGZpbGVubyAtPSBhcmc7CisJCWJsa25vID0gKC0xKTsgIC8qIFdlIGNhbid0IGtub3cgdGhlIGJsb2NrIG51bWJlciAqLworCQlhdF9zbSAmPSAoYXJnID09IDApOworCQlnb3RvIG9zX2J5cGFzczsKKworCSBjYXNlIE1URlNSOgorCSBjYXNlIE1UQlNSOgorI2lmIERFQlVHCisJCWlmIChkZWJ1Z2dpbmcpCisJCSAgIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFNraXBwaW5nICVsdSBibG9ja3MgJXMgZnJvbSBsb2dpY2FsIGJsb2NrICVkXG4iLAorCQkJCW5hbWUsIGFyZywgY21kX2luPT1NVEZTUj8iZm9yd2FyZCI6ImJhY2t3YXJkIiwgbG9naWNhbF9ibGtfbnVtKTsKKyNlbmRpZgorCQlpZiAoY21kX2luID09IE1URlNSKSB7CisJCSAgIGxvZ2ljYWxfYmxrX251bSArPSBhcmc7CisJCSAgIGlmIChibGtubyA+PSAwKSBibGtubyArPSBhcmc7CisJCX0KKwkJZWxzZSB7CisJCSAgIGxvZ2ljYWxfYmxrX251bSAtPSBhcmc7CisJCSAgIGlmIChibGtubyA+PSAwKSBibGtubyAtPSBhcmc7CisJCX0KKwkJaW9jdGxfcmVzdWx0ID0gb3NzdF9zZWVrX2xvZ2ljYWxfYmxrKFNUcCwgJlNScG50LCBsb2dpY2FsX2Jsa19udW0pOworCQlmaWxlbm8gPSBTVHBzLT5kcnZfZmlsZTsKKwkJYmxrbm8gID0gU1Rwcy0+ZHJ2X2Jsb2NrOworCQlhdF9zbSAmPSAoYXJnID09IDApOworCQlnb3RvIG9zX2J5cGFzczsKKworCSBjYXNlIE1URlNTOgorCQljbWRbMF0gPSBTUEFDRTsKKwkJY21kWzFdID0gMHgwNDsgLyogU3BhY2UgU2V0bWFya3MgKi8gICAvKiBGSVhNRSAtLSBPUyBjYW4ndCBkbyB0aGlzPyAqLworCQljbWRbMl0gPSAoYXJnID4+IDE2KTsKKwkJY21kWzNdID0gKGFyZyA+PiA4KTsKKwkJY21kWzRdID0gYXJnOworI2lmIERFQlVHCisJCWlmIChkZWJ1Z2dpbmcpCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTcGFjaW5nIHRhcGUgZm9yd2FyZCAlZCBzZXRtYXJrcy5cbiIsIG5hbWUsCisJCWNtZFsyXSAqIDY1NTM2ICsgY21kWzNdICogMjU2ICsgY21kWzRdKTsKKyNlbmRpZgorCQlpZiAoYXJnICE9IDApIHsKKwkJCWJsa25vID0gZmlsZW5vID0gKC0xKTsKKwkJCWF0X3NtID0gMTsKKwkJfQorCQlicmVhazsKKwkgY2FzZSBNVEJTUzoKKwkJY21kWzBdID0gU1BBQ0U7CisJCWNtZFsxXSA9IDB4MDQ7IC8qIFNwYWNlIFNldG1hcmtzICovICAgLyogRklYTUUgLS0gT1MgY2FuJ3QgZG8gdGhpcz8gKi8KKwkJbHRtcCA9ICgtYXJnKTsKKwkJY21kWzJdID0gKGx0bXAgPj4gMTYpOworCQljbWRbM10gPSAobHRtcCA+PiA4KTsKKwkJY21kWzRdID0gbHRtcDsKKyNpZiBERUJVRworCQlpZiAoZGVidWdnaW5nKSB7CisJCQlpZiAoY21kWzJdICYgMHg4MCkKKwkJCSAgIGx0bXAgPSAweGZmMDAwMDAwOworCQkJbHRtcCA9IGx0bXAgfCAoY21kWzJdIDw8IDE2KSB8IChjbWRbM10gPDwgOCkgfCBjbWRbNF07CisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTcGFjaW5nIHRhcGUgYmFja3dhcmQgJWxkIHNldG1hcmtzLlxuIiwKKwkJCQkJCW5hbWUsICgtbHRtcCkpOworCQkgfQorI2VuZGlmCisJCSBpZiAoYXJnICE9IDApIHsKKwkJCWJsa25vID0gZmlsZW5vID0gKC0xKTsKKwkJCWF0X3NtID0gMTsKKwkJIH0KKwkJIGJyZWFrOworCSBjYXNlIE1UV0VPRjoKKwkJIGlmICgoU1Rwcy0+cncgPT0gU1RfV1JJVElORyB8fCBTVHAtPmRpcnR5KSAmJiAhU1RwLT5wb3NfdW5rbm93bikgeworCQkJU1RwLT53cml0ZV90eXBlID0gT1NfV1JJVEVfREFUQTsKKwkJCWlvY3RsX3Jlc3VsdCA9IG9zc3RfZmx1c2hfd3JpdGVfYnVmZmVyKFNUcCwgJlNScG50KTsKKwkJIH0gZWxzZQorCQkJaW9jdGxfcmVzdWx0ID0gMDsKKyNpZiBERUJVRworCQkgaWYgKGRlYnVnZ2luZykgCisJCQkgICBwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBXcml0aW5nICVsZCBmaWxlbWFyayhzKS5cbiIsIG5hbWUsIGFyZyk7CisjZW5kaWYKKwkJIGZvciAoaT0wOyBpPGFyZzsgaSsrKQorCQkJaW9jdGxfcmVzdWx0IHw9IG9zc3Rfd3JpdGVfZmlsZW1hcmsoU1RwLCAmU1JwbnQpOworCQkgaWYgKGZpbGVubyA+PSAwKSBmaWxlbm8gKz0gYXJnOworCQkgaWYgKGJsa25vICA+PSAwKSBibGtubyAgID0gMDsKKwkJIGdvdG8gb3NfYnlwYXNzOworCisJIGNhc2UgTVRXU006CisJCSBpZiAoU1RwLT53cml0ZV9wcm90KQorCQkJcmV0dXJuICgtRUFDQ0VTKTsKKwkJIGlmICghU1RwLT5yYXcpCisJCQlyZXR1cm4gMDsKKwkJIGNtZFswXSA9IFdSSVRFX0ZJTEVNQVJLUzsgICAvKiBGSVhNRSAtLSBuZWVkIE9TIHZlcnNpb24gKi8KKwkJIGlmIChjbWRfaW4gPT0gTVRXU00pCisJCQkgY21kWzFdID0gMjsKKwkJIGNtZFsyXSA9IChhcmcgPj4gMTYpOworCQkgY21kWzNdID0gKGFyZyA+PiA4KTsKKwkJIGNtZFs0XSA9IGFyZzsKKwkJIHRpbWVvdXQgPSBTVHAtPnRpbWVvdXQ7CisjaWYgREVCVUcKKwkJIGlmIChkZWJ1Z2dpbmcpIAorCQkJICAgcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogV3JpdGluZyAlZCBzZXRtYXJrKHMpLlxuIiwgbmFtZSwKKwkJCQkgIGNtZFsyXSAqIDY1NTM2ICsgY21kWzNdICogMjU2ICsgY21kWzRdKTsKKyNlbmRpZgorCQkgaWYgKGZpbGVubyA+PSAwKQorCQkJZmlsZW5vICs9IGFyZzsKKwkJIGJsa25vID0gMDsKKwkJIGF0X3NtID0gKGNtZF9pbiA9PSBNVFdTTSk7CisJCSBicmVhazsKKwkgY2FzZSBNVE9GRkw6CisJIGNhc2UgTVRMT0FEOgorCSBjYXNlIE1UVU5MT0FEOgorCSBjYXNlIE1UUkVURU46CisJCSBjbWRbMF0gPSBTVEFSVF9TVE9QOworCQkgY21kWzFdID0gMTsJCQkvKiBEb24ndCB3YWl0IGZvciBjb21wbGV0aW9uICovCisJCSBpZiAoY21kX2luID09IE1UTE9BRCkgeworCQkgICAgIGlmIChTVHAtPnJlYWR5ID09IFNUX05PX1RBUEUpCisJCQkgY21kWzRdID0gNDsJCS8qIG9wZW4gdHJheSAqLworCQkgICAgICBlbHNlCisJCQkgY21kWzRdID0gMTsJCS8qIGxvYWQgKi8KKwkJIH0KKwkJIGlmIChjbWRfaW4gPT0gTVRSRVRFTikKKwkJCSBjbWRbNF0gPSAzOwkJLyogcmV0ZW5zaW9uIHRoZW4gbW91bnQgKi8KKwkJIGlmIChjbWRfaW4gPT0gTVRPRkZMKQorCQkJIGNtZFs0XSA9IDQ7CQkvKiByZXdpbmQgdGhlbiBlamVjdCAqLworCQkgdGltZW91dCA9IFNUcC0+dGltZW91dDsKKyNpZiBERUJVRworCQkgaWYgKGRlYnVnZ2luZykgeworCQkJIHN3aXRjaCAoY21kX2luKSB7CisJCQkJIGNhc2UgTVRVTkxPQUQ6CisJCQkJCSBwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBVbmxvYWRpbmcgdGFwZS5cbiIsIG5hbWUpOworCQkJCQkgYnJlYWs7CisJCQkJIGNhc2UgTVRMT0FEOgorCQkJCQkgcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogTG9hZGluZyB0YXBlLlxuIiwgbmFtZSk7CisJCQkJCSBicmVhazsKKwkJCQkgY2FzZSBNVFJFVEVOOgorCQkJCQkgcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmV0ZW5zaW9uaW5nIHRhcGUuXG4iLCBuYW1lKTsKKwkJCQkJIGJyZWFrOworCQkJCSBjYXNlIE1UT0ZGTDoKKwkJCQkJIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEVqZWN0aW5nIHRhcGUuXG4iLCBuYW1lKTsKKwkJCQkJIGJyZWFrOworCQkJIH0KKwkJIH0KKyNlbmRpZgorICAgICAgIGZpbGVubyA9IGJsa25vID0gYXRfc20gPSBmcmFtZV9zZXFfbnVtYnIgPSBsb2dpY2FsX2Jsa19udW0gPSAwIDsKKwkJIGJyZWFrOworCSBjYXNlIE1UTk9QOgorI2lmIERFQlVHCisJCSBpZiAoZGVidWdnaW5nKQorCQkJIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IE5vLW9wIG9uIHRhcGUuXG4iLCBuYW1lKTsKKyNlbmRpZgorCQkgcmV0dXJuIDA7ICAvKiBTaG91bGQgZG8gc29tZXRoaW5nID8gKi8KKwkJIGJyZWFrOworCSBjYXNlIE1URU9NOgorI2lmIERFQlVHCisJCWlmIChkZWJ1Z2dpbmcpCisJCSAgIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFNwYWNpbmcgdG8gZW5kIG9mIHJlY29yZGVkIG1lZGl1bS5cbiIsIG5hbWUpOworI2VuZGlmCisJCWlmICgob3NzdF9wb3NpdGlvbl90YXBlX2FuZF9jb25maXJtKFNUcCwgJlNScG50LCBTVHAtPmVvZF9mcmFtZV9wcG9zKSA8IDApIHx8CisJCQkgICAgKG9zc3RfZ2V0X2xvZ2ljYWxfZnJhbWUoU1RwLCAmU1JwbnQsIC0xLCAwKSAgICAgICAgICAgICAgIDwgMCkpIHsKKwkJICAgaW9jdGxfcmVzdWx0ID0gLUVJTzsKKwkJICAgZ290byBvc19ieXBhc3M7CisJCX0KKwkJaWYgKFNUcC0+YnVmZmVyLT5hdXgtPmZyYW1lX3R5cGUgIT0gT1NfRlJBTUVfVFlQRV9FT0QpIHsKKyNpZiBERUJVRworCQkgICBwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBObyBFT0QgZnJhbWUgZm91bmQgd2hlcmUgZXhwZWN0ZWQuXG4iLCBuYW1lKTsKKyNlbmRpZgorCQkgICBpb2N0bF9yZXN1bHQgPSAtRUlPOworCQkgICBnb3RvIG9zX2J5cGFzczsKKwkJfQorCQlpb2N0bF9yZXN1bHQgPSBvc3N0X3NldF9mcmFtZV9wb3NpdGlvbihTVHAsICZTUnBudCwgU1RwLT5lb2RfZnJhbWVfcHBvcywgMCk7CisJCWZpbGVubyA9IFNUcC0+ZmlsZW1hcmtfY250OworCQlibGtubyAgPSBhdF9zbSA9IDA7CisJCWdvdG8gb3NfYnlwYXNzOworCisJIGNhc2UgTVRFUkFTRToKKwkJaWYgKFNUcC0+d3JpdGVfcHJvdCkKKwkJICAgcmV0dXJuICgtRUFDQ0VTKTsKKwkJaW9jdGxfcmVzdWx0ID0gb3NzdF9yZXNldF9oZWFkZXIoU1RwLCAmU1JwbnQpOworCQlpID0gb3NzdF93cml0ZV9lb2QoU1RwLCAmU1JwbnQpOworCQlpZiAoaSA8IGlvY3RsX3Jlc3VsdCkgaW9jdGxfcmVzdWx0ID0gaTsKKwkJaSA9IG9zc3RfcG9zaXRpb25fdGFwZV9hbmRfY29uZmlybShTVHAsICZTUnBudCwgU1RwLT5lb2RfZnJhbWVfcHBvcyk7CisJCWlmIChpIDwgaW9jdGxfcmVzdWx0KSBpb2N0bF9yZXN1bHQgPSBpOworCQlmaWxlbm8gPSBibGtubyA9IGF0X3NtID0gMCA7CisJCWdvdG8gb3NfYnlwYXNzOworCisJIGNhc2UgTVRSRVc6CisJCWNtZFswXSA9IFJFWkVST19VTklUOyAvKiByZXdpbmQgKi8KKwkJY21kWzFdID0gMTsKKyNpZiBERUJVRworCQlpZiAoZGVidWdnaW5nKQorCQkgICBwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBSZXdpbmRpbmcgdGFwZSwgSW1tZWQ9JWQuXG4iLCBuYW1lLCBjbWRbMV0pOworI2VuZGlmCisJCWZpbGVubyA9IGJsa25vID0gYXRfc20gPSBmcmFtZV9zZXFfbnVtYnIgPSBsb2dpY2FsX2Jsa19udW0gPSAwIDsKKwkJYnJlYWs7CisKKwkgY2FzZSBNVFNFVEJMSzogICAgICAgICAgIC8qIFNldCBibG9jayBsZW5ndGggKi8KKwkJIGlmICgoU1Rwcy0+ZHJ2X2Jsb2NrID09IDAgKQkJCSAgJiYKKwkJICAgICAhU1RwLT5kaXJ0eQkJCQkgICYmCisJCSAgICAgKChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyA9PSAwKQkJICAmJgorCQkgICAgICgoYXJnICYgTVRfU1RfQkxLU0laRV9NQVNLKSA+PSA1MTIgKQkgICYmIAorCQkgICAgICgoYXJnICYgTVRfU1RfQkxLU0laRV9NQVNLKSA8PSBPU19EQVRBX1NJWkUpICYmCisJCSAgICAgIShPU19EQVRBX1NJWkUgJSAoYXJnICYgTVRfU1RfQkxLU0laRV9NQVNLKSkgICkgeworCQkJIC8qCisJCQkgICogT25seSBhbGxvd2VkIHRvIGNoYW5nZSB0aGUgYmxvY2sgc2l6ZSBpZiB5b3Ugb3BlbmVkIHRoZQorCQkJICAqIGRldmljZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgZmlsZSBiZWZvcmUgd3JpdGluZyBhbnl0aGluZy4KKwkJCSAgKiBOb3RlLCB0aGF0IHdoZW4gcmVhZGluZywgY2hhbmdpbmcgYmxvY2tfc2l6ZSBpcyBmdXRpbGUsCisJCQkgICogYXMgdGhlIHNpemUgdXNlZCB3aGVuIHdyaXRpbmcgb3ZlcnJpZGVzIGl0LgorCQkJICAqLworCQkJIFNUcC0+YmxvY2tfc2l6ZSA9IChhcmcgJiBNVF9TVF9CTEtTSVpFX01BU0spOworCQkJIHByaW50ayhLRVJOX0lORk8gIiVzOkk6IEJsb2NrIHNpemUgc2V0IHRvICVkIGJ5dGVzLlxuIiwKKwkJCQkJICAgbmFtZSwgU1RwLT5ibG9ja19zaXplKTsKKwkJCSByZXR1cm4gMDsKKwkJIH0KKwkgY2FzZSBNVFNFVERFTlNJVFk6ICAgICAgIC8qIFNldCB0YXBlIGRlbnNpdHkgKi8KKwkgY2FzZSBNVFNFVERSVkJVRkZFUjogICAgIC8qIFNldCBkcml2ZSBidWZmZXJpbmcgKi8KKwkgY2FzZSBTRVRfREVOU19BTkRfQkxLOiAgIC8qIFNldCBkZW5zaXR5IGFuZCBibG9jayBzaXplICovCisJCSBjaGdfZW9mID0gMDsKKwkJIGlmIChTVHAtPmRpcnR5IHx8IChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyAhPSAwKQorCQkJIHJldHVybiAoLUVJTyk7ICAgICAgIC8qIE5vdCBhbGxvd2VkIGlmIGRhdGEgaW4gYnVmZmVyICovCisJCSBpZiAoKGNtZF9pbiA9PSBNVFNFVEJMSyB8fCBjbWRfaW4gPT0gU0VUX0RFTlNfQU5EX0JMSykgJiYKKwkJICAgICAoYXJnICYgTVRfU1RfQkxLU0laRV9NQVNLKSAhPSAwICAgICAgICAgICAgICAgICAgICAmJgorCQkgICAgIChhcmcgJiBNVF9TVF9CTEtTSVpFX01BU0spICE9IFNUcC0+YmxvY2tfc2l6ZSAgICAgICApIHsKKwkJCSBwcmludGsoS0VSTl9XQVJOSU5HICIlczpXOiBJbGxlZ2FsIHRvIHNldCBibG9jayBzaXplIHRvICVkJXMuXG4iLAorCQkJCQkJbmFtZSwgKGludCkoYXJnICYgTVRfU1RfQkxLU0laRV9NQVNLKSwKKwkJCQkJCShPU19EQVRBX1NJWkUgJSAoYXJnICYgTVRfU1RfQkxLU0laRV9NQVNLKSk/IiI6IiBub3ciKTsKKwkJCSByZXR1cm4gKC1FSU5WQUwpOworCQkgfQorCQkgcmV0dXJuIDA7ICAvKiBGSVhNRSBzaWxlbnRseSBpZ25vcmUgaWYgYmxvY2sgc2l6ZSBkaWRuJ3QgY2hhbmdlICovCisKKwkgZGVmYXVsdDoKKwkJcmV0dXJuICgtRU5PU1lTKTsKKwl9CisKKwlTUnBudCA9IG9zc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIGRhdGFsZW4sIGRpcmVjdGlvbiwgdGltZW91dCwgTUFYX1JFVFJJRVMsIDEpOworCisJaW9jdGxfcmVzdWx0ID0gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CisKKwlpZiAoIVNScG50KSB7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQ291bGRuJ3QgZXhlYyBzY3NpIGNtZCBmb3IgSU9DVExcbiIsIG5hbWUpOworI2VuZGlmCisJCXJldHVybiBpb2N0bF9yZXN1bHQ7CisJfQorCisJaWYgKCFpb2N0bF9yZXN1bHQpIHsgIC8qIFNDU0kgY29tbWFuZCBzdWNjZXNzZnVsICovCisJCVNUcC0+ZnJhbWVfc2VxX251bWJlciA9IGZyYW1lX3NlcV9udW1icjsKKwkJU1RwLT5sb2dpY2FsX2Jsa19udW0gID0gbG9naWNhbF9ibGtfbnVtOworCX0KKworb3NfYnlwYXNzOgorI2lmIERFQlVHCisJaWYgKGRlYnVnZ2luZykKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogSU9DVEwgKCVkKSBSZXN1bHQ9JWRcbiIsIG5hbWUsIGNtZF9pbiwgaW9jdGxfcmVzdWx0KTsKKyNlbmRpZgorCisJaWYgKCFpb2N0bF9yZXN1bHQpIHsJCQkJLyogc3VjY2VzcyAqLworCisJCWlmIChjbWRfaW4gPT0gTVRGU0ZNKSB7CisJCQkgZmlsZW5vLS07CisJCQkgYmxrbm8tLTsKKwkJfQorCQlpZiAoY21kX2luID09IE1UQlNGTSkgeworCQkJIGZpbGVubysrOworCQkJIGJsa25vKys7CisJCX0KKwkJU1Rwcy0+ZHJ2X2Jsb2NrID0gYmxrbm87CisJCVNUcHMtPmRydl9maWxlID0gZmlsZW5vOworCQlTVHBzLT5hdF9zbSA9IGF0X3NtOworCisJCWlmIChjbWRfaW4gPT0gTVRFT00pCisJCQlTVHBzLT5lb2YgPSBTVF9FT0Q7CisJCWVsc2UgaWYgKChjbWRfaW4gPT0gTVRGU0ZNIHx8IGNtZF9pbiA9PSBNVEJTRikgJiYgU1Rwcy0+ZW9mID09IFNUX0ZNX0hJVCkgeworCQkJaW9jdGxfcmVzdWx0ID0gb3NzdF9zZWVrX2xvZ2ljYWxfYmxrKFNUcCwgJlNScG50LCBTVHAtPmxvZ2ljYWxfYmxrX251bS0xKTsKKwkJCVNUcHMtPmRydl9ibG9jaysrOworCQkJU1RwLT5sb2dpY2FsX2Jsa19udW0rKzsKKwkJCVNUcC0+ZnJhbWVfc2VxX251bWJlcisrOworCQkJU1RwLT5mcmFtZV9pbl9idWZmZXIgPSAwOworCQkJU1RwLT5idWZmZXItPnJlYWRfcG9pbnRlciA9IDA7CisJCX0KKwkJZWxzZSBpZiAoY21kX2luID09IE1URlNGKQorCQkJU1Rwcy0+ZW9mID0gKFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24gPj0gU1RwLT5lb2RfZnJhbWVfcHBvcyk/U1RfRU9EOlNUX0ZNOworCQllbHNlIGlmIChjaGdfZW9mKQorCQkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisKKwkJaWYgKGNtZF9pbiA9PSBNVE9GRkwgfHwgY21kX2luID09IE1UVU5MT0FEKQorCQkJU1RwLT5yZXdfYXRfY2xvc2UgPSAwOworCQllbHNlIGlmIChjbWRfaW4gPT0gTVRMT0FEKSB7CisJCQlmb3IgKGk9MDsgaSA8IFNUX05CUl9QQVJUSVRJT05TOyBpKyspIHsKKwkJCSAgICBTVHAtPnBzW2ldLnJ3ID0gU1RfSURMRTsKKwkJCSAgICBTVHAtPnBzW2ldLmxhc3RfYmxvY2tfdmFsaWQgPSAwOy8qIEZJWE1FIC0gd2hlcmUgZWxzZSBpcyB0aGlzIGZpZWxkIG1haW50YWluZWQ/ICovCisJCQl9CisJCQlTVHAtPnBhcnRpdGlvbiA9IDA7CisJCX0KKworCQlpZiAoY21kX2luID09IE1UUkVXKSB7CisJCQlpb2N0bF9yZXN1bHQgPSBvc3N0X3Bvc2l0aW9uX3RhcGVfYW5kX2NvbmZpcm0oU1RwLCAmU1JwbnQsIFNUcC0+Zmlyc3RfZGF0YV9wcG9zKTsgCisJCQlpZiAoaW9jdGxfcmVzdWx0ID4gMCkKKwkJCQlpb2N0bF9yZXN1bHQgPSAwOworCQl9CisKKwl9IGVsc2UgaWYgKGNtZF9pbiA9PSBNVEJTRiB8fCBjbWRfaW4gPT0gTVRCU0ZNICkgeworCQlpZiAob3NzdF9wb3NpdGlvbl90YXBlX2FuZF9jb25maXJtKFNUcCwgJlNScG50LCBTVHAtPmZpcnN0X2RhdGFfcHBvcykgPCAwKQorCQkJU1Rwcy0+ZHJ2X2ZpbGUgPSBTVHBzLT5kcnZfYmxvY2sgPSAtMTsKKwkJZWxzZQorCQkJU1Rwcy0+ZHJ2X2ZpbGUgPSBTVHBzLT5kcnZfYmxvY2sgPSAwOworCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKwl9IGVsc2UgaWYgKGNtZF9pbiA9PSBNVEZTRiB8fCBjbWRfaW4gPT0gTVRGU0ZNKSB7CisJCWlmIChvc3N0X3Bvc2l0aW9uX3RhcGVfYW5kX2NvbmZpcm0oU1RwLCAmU1JwbnQsIFNUcC0+ZW9kX2ZyYW1lX3Bwb3MpIDwgMCkKKwkJCVNUcHMtPmRydl9maWxlID0gU1Rwcy0+ZHJ2X2Jsb2NrID0gLTE7CisJCWVsc2UgeworCQkJU1Rwcy0+ZHJ2X2ZpbGUgID0gU1RwLT5maWxlbWFya19jbnQ7CisJCQlTVHBzLT5kcnZfYmxvY2sgPSAwOworCQl9CisJCVNUcHMtPmVvZiA9IFNUX0VPRDsKKwl9IGVsc2UgaWYgKGNtZF9pbiA9PSBNVEJTUiB8fCBjbWRfaW4gPT0gTVRGU1IgfHwgY21kX2luID09IE1UV0VPRiB8fCBjbWRfaW4gPT0gTVRFT00pIHsKKwkJU1Rwcy0+ZHJ2X2ZpbGUgPSBTVHBzLT5kcnZfYmxvY2sgPSAoLTEpOworCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKwkJU1RwLT5oZWFkZXJfb2sgPSAwOworCX0gZWxzZSBpZiAoY21kX2luID09IE1URVJBU0UpIHsKKwkJU1RwLT5oZWFkZXJfb2sgPSAwOworCX0gZWxzZSBpZiAoU1JwbnQpIHsgIC8qIFNDU0kgY29tbWFuZCB3YXMgbm90IGNvbXBsZXRlbHkgc3VjY2Vzc2Z1bC4gKi8KKwkJaWYgKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0gJiAweDQwKSB7CisJCQlTVHBzLT5lb2YgPSBTVF9FT01fT0s7CisJCQlTVHBzLT5kcnZfYmxvY2sgPSAwOworCQl9CisJCWlmIChjaGdfZW9mKQorCQkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisKKwkJaWYgKChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdICYgMHgwZikgPT0gQkxBTktfQ0hFQ0spCisJCQlTVHBzLT5lb2YgPSBTVF9FT0Q7CisKKwkJaWYgKGNtZF9pbiA9PSBNVExPQUQgJiYgb3NzdF93YWl0X2Zvcl9tZWRpdW0oU1RwLCAmU1JwbnQsIDYwKSkKKwkJCWlvY3RsX3Jlc3VsdCA9IG9zc3Rfd2FpdF9yZWFkeShTVHAsICZTUnBudCwgNSAqIDYwLCBPU1NUX1dBSVRfUE9TSVRJT05fQ09NUExFVEUpOworCX0KKwkqYVNScG50ID0gU1JwbnQ7CisKKwlyZXR1cm4gaW9jdGxfcmVzdWx0OworfQorCisKKy8qIE9wZW4gdGhlIGRldmljZSAqLworc3RhdGljIGludCBvc19zY3NpX3RhcGVfb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXVuc2lnbmVkIHNob3J0CSAgICAgIGZsYWdzOworCWludAkJICAgICAgaSwgYl9zaXplLCBuZXdfc2Vzc2lvbiA9IDAsIHJldHZhbCA9IDA7CisJdW5zaWduZWQgY2hhcgkgICAgICBjbWRbTUFYX0NPTU1BTkRfU0laRV07CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqIFNScG50ID0gTlVMTDsKKwlzdHJ1Y3Qgb3NzdF90YXBlICAgICogU1RwOworCXN0cnVjdCBzdF9tb2RlZGVmICAgKiBTVG07CisJc3RydWN0IHN0X3BhcnRzdGF0ICAqIFNUcHM7CisJY2hhcgkJICAgICogbmFtZTsKKwlpbnQJCSAgICAgIGRldiAgPSBUQVBFX05SKGlub2RlKTsKKwlpbnQJCSAgICAgIG1vZGUgPSBUQVBFX01PREUoaW5vZGUpOworCisJLyoKKwkgKiBXZSByZWFsbHkgd2FudCB0byBkbyBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxwKTsgaGVyZSwgYnV0IHNvbWUKKwkgKiB2ZXJzaW9ucyBvZiB0YXIgaW5jb3JyZWN0bHkgY2FsbCBsc2VlayBvbiB0YXBlcyBhbmQgYmFpbCBvdXQgaWYgdGhhdAorCSAqIGZhaWxzLiAgU28gd2UgZGlzYWxsb3cgcHJlYWQoKSBhbmQgcHdyaXRlKCksIGJ1dCBwZXJtaXQgbHNlZWtzLgorCSAqLworCWZpbHAtPmZfbW9kZSAmPSB+KEZNT0RFX1BSRUFEIHwgRk1PREVfUFdSSVRFKTsKKworCXdyaXRlX2xvY2soJm9zX3Njc2lfdGFwZXNfbG9jayk7CisJaWYgKGRldiA+PSBvc3N0X21heF9kZXYgfHwgb3Nfc2NzaV90YXBlcyA9PSBOVUxMIHx8CisJICAgIChTVHAgPSBvc19zY3NpX3RhcGVzW2Rldl0pID09IE5VTEwgfHwgIVNUcC0+ZGV2aWNlKSB7CisJCXdyaXRlX3VubG9jaygmb3Nfc2NzaV90YXBlc19sb2NrKTsKKwkJcmV0dXJuICgtRU5YSU8pOworCX0KKworCW5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKworCWlmIChTVHAtPmluX3VzZSkgeworCQl3cml0ZV91bmxvY2soJm9zX3Njc2lfdGFwZXNfbG9jayk7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRGV2aWNlIGFscmVhZHkgaW4gdXNlLlxuIiwgbmFtZSk7CisjZW5kaWYKKwkJcmV0dXJuICgtRUJVU1kpOworCX0KKwlpZiAoc2NzaV9kZXZpY2VfZ2V0KFNUcC0+ZGV2aWNlKSkgeworCQl3cml0ZV91bmxvY2soJm9zX3Njc2lfdGFwZXNfbG9jayk7CisjaWYgREVCVUcKKyAgICAgICAgICAgICAgICBwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBGYWlsZWQgc2NzaV9kZXZpY2VfZ2V0LlxuIiwgbmFtZSk7CisjZW5kaWYKKwkJcmV0dXJuICgtRU5YSU8pOworCX0KKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBTVHA7CisJU1RwLT5pbl91c2UgPSAxOworCXdyaXRlX3VubG9jaygmb3Nfc2NzaV90YXBlc19sb2NrKTsKKwlTVHAtPnJld19hdF9jbG9zZSA9IFRBUEVfUkVXSU5EKGlub2RlKTsKKworCWlmKCAhc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKFNUcC0+ZGV2aWNlKSApIHsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlpZiAobW9kZSAhPSBTVHAtPmN1cnJlbnRfbW9kZSkgeworI2lmIERFQlVHCisJCWlmIChkZWJ1Z2dpbmcpCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBNb2RlIGNoYW5nZSBmcm9tICVkIHRvICVkLlxuIiwKKwkJCQkJICAgICAgIG5hbWUsIFNUcC0+Y3VycmVudF9tb2RlLCBtb2RlKTsKKyNlbmRpZgorCQluZXdfc2Vzc2lvbiA9IDE7CisJCVNUcC0+Y3VycmVudF9tb2RlID0gbW9kZTsKKwl9CisJU1RtID0gJihTVHAtPm1vZGVzW1NUcC0+Y3VycmVudF9tb2RlXSk7CisKKwlmbGFncyA9IGZpbHAtPmZfZmxhZ3M7CisJU1RwLT53cml0ZV9wcm90ID0gKChmbGFncyAmIE9fQUNDTU9ERSkgPT0gT19SRE9OTFkpOworCisJU1RwLT5yYXcgPSBUQVBFX0lTX1JBVyhpbm9kZSk7CisJaWYgKFNUcC0+cmF3KQorCQlTVHAtPmhlYWRlcl9vayA9IDA7CisKKwkvKiBBbGxvY2F0ZSBkYXRhIHNlZ21lbnRzIGZvciB0aGlzIGRldmljZSdzIHRhcGUgYnVmZmVyICovCisJaWYgKCFlbmxhcmdlX2J1ZmZlcihTVHAtPmJ1ZmZlciwgU1RwLT5yZXN0cl9kbWEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6RTogVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBzZWdtZW50cyBmb3IgdGFwZSBidWZmZXIuXG4iLCBuYW1lKTsKKwkJcmV0dmFsID0gKC1FT1ZFUkZMT1cpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWlmIChTVHAtPmJ1ZmZlci0+YnVmZmVyX3NpemUgPj0gT1NfRlJBTUVfU0laRSkgeworCQlmb3IgKGkgPSAwLCBiX3NpemUgPSAwOyAKKwkJICAgICAoaSA8IFNUcC0+YnVmZmVyLT5zZ19zZWdzKSAmJiAoKGJfc2l6ZSArIFNUcC0+YnVmZmVyLT5zZ1tpXS5sZW5ndGgpIDw9IE9TX0RBVEFfU0laRSk7IAorCQkgICAgIGJfc2l6ZSArPSBTVHAtPmJ1ZmZlci0+c2dbaSsrXS5sZW5ndGgpOworCQlTVHAtPmJ1ZmZlci0+YXV4ID0gKG9zX2F1eF90ICopIChwYWdlX2FkZHJlc3MoU1RwLT5idWZmZXItPnNnW2ldLnBhZ2UpICsgT1NfREFUQV9TSVpFIC0gYl9zaXplKTsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBiX2RhdGEgcG9pbnRzIHRvICVwIGluIHNlZ21lbnQgMCBhdCAlcFxuIiwgbmFtZSwKKwkJCVNUcC0+YnVmZmVyLT5iX2RhdGEsIHBhZ2VfYWRkcmVzcyhTVHAtPmJ1ZmZlci0+c2dbMF0ucGFnZSkpOworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBBVVggcG9pbnRzIHRvICVwIGluIHNlZ21lbnQgJWQgYXQgJXBcbiIsIG5hbWUsCisJCQkgU1RwLT5idWZmZXItPmF1eCwgaSwgcGFnZV9hZGRyZXNzKFNUcC0+YnVmZmVyLT5zZ1tpXS5wYWdlKSk7CisjZW5kaWYKKwl9IGVsc2UgeworCQlTVHAtPmJ1ZmZlci0+YXV4ID0gTlVMTDsgLyogdGhpcyBoYWQgYmV0dGVyIG5ldmVyIGhhcHBlbiEgKi8KKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczpBOiBGcmFtZXNpemUgJWQgdG9vIGxhcmdlIGZvciBidWZmZXIuXG4iLCBuYW1lLCBPU19GUkFNRV9TSVpFKTsKKwkJcmV0dmFsID0gKC1FSU8pOworCQlnb3RvIGVycl9vdXQ7CisJfQorCVNUcC0+YnVmZmVyLT53cml0aW5nID0gMDsKKwlTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQgPSAwOworCVNUcC0+ZGlydHkgPSAwOworCWZvciAoaT0wOyBpIDwgU1RfTkJSX1BBUlRJVElPTlM7IGkrKykgeworCQlTVHBzID0gJihTVHAtPnBzW2ldKTsKKwkJU1Rwcy0+cncgPSBTVF9JRExFOworCX0KKwlTVHAtPnJlYWR5ID0gU1RfUkVBRFk7CisjaWYgREVCVUcKKwlTVHAtPm5icl93YWl0cyA9IFNUcC0+bmJyX2ZpbmlzaGVkID0gMDsKKyNlbmRpZgorCisJbWVtc2V0IChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCWNtZFswXSA9IFRFU1RfVU5JVF9SRUFEWTsKKworCVNScG50ID0gb3NzdF9kb19zY3NpKE5VTEwsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwgU1RwLT50aW1lb3V0LCBNQVhfUkVUUklFUywgMSk7CisJaWYgKCFTUnBudCkgeworCQlyZXR2YWwgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsJCS8qIEZJWE1FIC0gdmFsaWQ/ICovCisJCWdvdG8gZXJyX291dDsKKwl9CisJaWYgKChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzBdICYgMHg3MCkgPT0gMHg3MCAgICAgICYmCisJICAgIChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdICYgMHgwZikgPT0gTk9UX1JFQURZICYmCisJICAgICBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEyXSAgICAgICAgPT0gNCAgICAgICAgICkgeworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFVuaXQgbm90IHJlYWR5LCBjYXVzZSAleFxuIiwgbmFtZSwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10pOworI2VuZGlmCisJCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQlpZiAoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10gPT0gMikgewkvKiBpbml0aWFsaXplIGNvbW1hbmQgcmVxdWlyZWQgKExPQUQpICovCisJCQltZW1zZXQgKGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisgICAgICAgIAkJY21kWzBdID0gU1RBUlRfU1RPUDsKKwkJCWNtZFsxXSA9IDE7CisJCQljbWRbNF0gPSAxOworCQkJU1JwbnQgPSBvc3N0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwKKwkJCQkJICAgICBTVHAtPnRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKwkJfQorCQlvc3N0X3dhaXRfcmVhZHkoU1RwLCAmU1JwbnQsIChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXT09MT8xNTozKSAqIDYwLCAwKTsKKwl9CisJaWYgKChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzBdICYgMHg3MCkgPT0gMHg3MCAmJgorCSAgICAoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAmIDB4MGYpID09IFVOSVRfQVRURU5USU9OKSB7IC8qIE5ldyBtZWRpYT8gKi8KKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBVbml0IHdhbnRzIGF0dGVudGlvblxuIiwgbmFtZSk7CisjZW5kaWYKKwkJU1RwLT5oZWFkZXJfb2sgPSAwOworCisJCWZvciAoaT0wOyBpIDwgMTA7IGkrKykgeworCisJCQltZW1zZXQgKGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJCQljbWRbMF0gPSBURVNUX1VOSVRfUkVBRFk7CisKKwkJCVNScG50ID0gb3NzdF9kb19zY3NpKFNScG50LCBTVHAsIGNtZCwgMCwgRE1BX05PTkUsCisJCQkJCSAgICAgU1RwLT50aW1lb3V0LCBNQVhfUkVUUklFUywgMSk7CisJCQlpZiAoKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMF0gJiAweDcwKSAhPSAweDcwIHx8CisJCQkgICAgKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0gJiAweDBmKSAhPSBVTklUX0FUVEVOVElPTikKKwkJCQlicmVhazsKKwkJfQorCisJCVNUcC0+cG9zX3Vua25vd24gPSAwOworCQlTVHAtPnBhcnRpdGlvbiA9IFNUcC0+bmV3X3BhcnRpdGlvbiA9IDA7CisJCWlmIChTVHAtPmNhbl9wYXJ0aXRpb25zKQorCQkJU1RwLT5uYnJfcGFydGl0aW9ucyA9IDE7ICAvKiBUaGlzIGd1ZXNzIHdpbGwgYmUgdXBkYXRlZCBsYXRlciBpZiBuZWNlc3NhcnkgKi8KKwkJZm9yIChpPTA7IGkgPCBTVF9OQlJfUEFSVElUSU9OUzsgaSsrKSB7CisJCQlTVHBzID0gJihTVHAtPnBzW2ldKTsKKwkJCVNUcHMtPnJ3ID0gU1RfSURMRTsJCS8qIEZJWE1FIC0gc2VlbXMgdG8gYmUgcmVkdW5kYW50Li4uICovCisJCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKwkJCVNUcHMtPmF0X3NtID0gMDsKKwkJCVNUcHMtPmxhc3RfYmxvY2tfdmFsaWQgPSAwOworCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gMDsKKwkJCVNUcHMtPmRydl9maWxlID0gMCA7CisJCX0KKwkJbmV3X3Nlc3Npb24gPSAxOworCQlTVHAtPnJlY292ZXJfY291bnQgPSAwOworCQlTVHAtPmFib3J0X2NvdW50ID0gMDsKKwl9CisJLyoKKwkgKiBpZiB3ZSBoYXZlIHZhbGlkIGhlYWRlcnMgZnJvbSBiZWZvcmUsIGFuZCB0aGUgZHJpdmUvdGFwZSBzZWVtIHVudG91Y2hlZCwKKwkgKiBvcGVuIHdpdGhvdXQgcmVjb25maWd1cmluZyBhbmQgcmUtcmVhZGluZyB0aGUgaGVhZGVycworCSAqLworCWlmICghU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0ICYmIFNUcC0+aGVhZGVyX29rICYmCisJICAgICFTUnBudC0+c3JfcmVzdWx0ICYmIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMF0gPT0gMCkgeworCisJCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCQljbWRbMF0gPSBNT0RFX1NFTlNFOworCQljbWRbMV0gPSA4OworCQljbWRbMl0gPSBWRU5ET1JfSURFTlRfUEFHRTsKKwkJY21kWzRdID0gVkVORE9SX0lERU5UX1BBR0VfTEVOR1RIICsgTU9ERV9IRUFERVJfTEVOR1RIOworCisJCVNScG50ID0gb3NzdF9kb19zY3NpKFNScG50LCBTVHAsIGNtZCwgY21kWzRdLCBETUFfRlJPTV9ERVZJQ0UsIFNUcC0+dGltZW91dCwgMCwgMSk7CisKKwkJaWYgKFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCAgICAgICAgICAgICAgICAgICAgIHx8CisJCSAgICBTVHAtPmJ1ZmZlci0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArIDJdICE9ICdMJyB8fAorCQkgICAgU1RwLT5idWZmZXItPmJfZGF0YVtNT0RFX0hFQURFUl9MRU5HVEggKyAzXSAhPSAnSScgfHwKKwkJICAgIFNUcC0+YnVmZmVyLT5iX2RhdGFbTU9ERV9IRUFERVJfTEVOR1RIICsgNF0gIT0gJ04nIHx8CisJCSAgICBTVHAtPmJ1ZmZlci0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArIDVdICE9ICc0JyAgKSB7CisjaWYgREVCVUcKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFNpZ25hdHVyZSB3YXMgY2hhbmdlZCB0byAlYyVjJWMlY1xuIiwgbmFtZSwKKwkJCSAgU1RwLT5idWZmZXItPmJfZGF0YVtNT0RFX0hFQURFUl9MRU5HVEggKyAyXSwKKwkJCSAgU1RwLT5idWZmZXItPmJfZGF0YVtNT0RFX0hFQURFUl9MRU5HVEggKyAzXSwKKwkJCSAgU1RwLT5idWZmZXItPmJfZGF0YVtNT0RFX0hFQURFUl9MRU5HVEggKyA0XSwKKwkJCSAgU1RwLT5idWZmZXItPmJfZGF0YVtNT0RFX0hFQURFUl9MRU5HVEggKyA1XSk7CisjZW5kaWYKKwkJCVNUcC0+aGVhZGVyX29rID0gMDsKKwkJfQorCQlpID0gU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbjsKKwkJaWYgKFNUcC0+aGVhZGVyX29rICYmIGkgPT0gb3NzdF9nZXRfZnJhbWVfcG9zaXRpb24oU1RwLCAmU1JwbnQpKSB7CisJCQlpZiAoU1RwLT5kb29yX2xvY2tlZCA9PSBTVF9VTkxPQ0tFRCkgeworCQkJCWlmIChkb19kb29yX2xvY2soU1RwLCAxKSkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6STogQ2FuJ3QgbG9jayBkcml2ZSBkb29yXG4iLCBuYW1lKTsKKwkJCQllbHNlCisJCQkJCVNUcC0+ZG9vcl9sb2NrZWQgPSBTVF9MT0NLRURfQVVUTzsKKwkJCX0KKwkJCWlmICghU1RwLT5mcmFtZV9pbl9idWZmZXIpIHsKKwkJCQlTVHAtPmJsb2NrX3NpemUgPSAoU1RtLT5kZWZhdWx0X2Jsa3NpemUgPiAwKSA/CisJCQkJCQkJU1RtLT5kZWZhdWx0X2Jsa3NpemUgOiBPU19EQVRBX1NJWkU7CisJCQkJU1RwLT5idWZmZXItPmJ1ZmZlcl9ieXRlcyA9IFNUcC0+YnVmZmVyLT5yZWFkX3BvaW50ZXIgPSAwOworCQkJfQorCQkJU1RwLT5idWZmZXItPmJ1ZmZlcl9ibG9ja3MgPSBPU19EQVRBX1NJWkUgLyBTVHAtPmJsb2NrX3NpemU7CisJCQlTVHAtPmZhc3Rfb3BlbiA9IDE7CisJCQlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJCQlyZXR1cm4gMDsKKwkJfQorI2lmIERFQlVHCisJCWlmIChpICE9IFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24pCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBUYXBlIHBvc2l0aW9uIGNoYW5nZWQgZnJvbSAlZCB0byAlZFxuIiwKKwkJCQkJCW5hbWUsIGksIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24pOworI2VuZGlmCisJCVNUcC0+aGVhZGVyX29rID0gMDsKKwl9CisJU1RwLT5mYXN0X29wZW4gPSAwOworCisJaWYgKChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ICE9IDAgJiYgICAvKiBpbiBhbGwgZXJyb3IgY29uZGl0aW9ucyBleGNlcHQgbm8gbWVkaXVtICovIAorCSAgICAoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAhPSAyIHx8IFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTJdICE9IDB4M0EpICkgeworCisJCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCQljbWRbMF0gPSBNT0RFX1NFTEVDVDsKKwkJY21kWzFdID0gMHgxMDsKKwkJY21kWzRdID0gNCArIE1PREVfSEVBREVSX0xFTkdUSDsKKworCQkoU1RwLT5idWZmZXIpLT5iX2RhdGFbMF0gPSBjbWRbNF0gLSAxOworCQkoU1RwLT5idWZmZXIpLT5iX2RhdGFbMV0gPSAwOwkJCS8qIE1lZGl1bSBUeXBlIC0gaWdub3JpbmcgKi8KKwkJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzJdID0gMDsJCQkvKiBSZXNlcnZlZCAqLworCQkoU1RwLT5idWZmZXIpLT5iX2RhdGFbM10gPSAwOwkJCS8qIEJsb2NrIERlc2NyaXB0b3IgTGVuZ3RoICovCisJCShTVHAtPmJ1ZmZlciktPmJfZGF0YVtNT0RFX0hFQURFUl9MRU5HVEggKyAwXSA9IDB4M2Y7CisJCShTVHAtPmJ1ZmZlciktPmJfZGF0YVtNT0RFX0hFQURFUl9MRU5HVEggKyAxXSA9IDE7CisJCShTVHAtPmJ1ZmZlciktPmJfZGF0YVtNT0RFX0hFQURFUl9MRU5HVEggKyAyXSA9IDI7CisJCShTVHAtPmJ1ZmZlciktPmJfZGF0YVtNT0RFX0hFQURFUl9MRU5HVEggKyAzXSA9IDM7CisKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBBcHBseWluZyBzb2Z0IHJlc2V0XG4iLCBuYW1lKTsKKyNlbmRpZgorCQlTUnBudCA9IG9zc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIGNtZFs0XSwgRE1BX1RPX0RFVklDRSwgU1RwLT50aW1lb3V0LCAwLCAxKTsKKworCQlTVHAtPmhlYWRlcl9vayA9IDA7CisKKwkJZm9yIChpPTA7IGkgPCAxMDsgaSsrKSB7CisKKwkJCW1lbXNldCAoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwkJCWNtZFswXSA9IFRFU1RfVU5JVF9SRUFEWTsKKworCQkJU1JwbnQgPSBvc3N0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwKKwkJCQkJCSAgICBTVHAtPnRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKwkJCWlmICgoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclswXSAmIDB4NzApICE9IDB4NzAgfHwKKwkJCSAgICAoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAmIDB4MGYpID09IE5PVF9SRUFEWSkKKwkJCWJyZWFrOworCisJCQlpZiAoKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0gJiAweDBmKSA9PSBVTklUX0FUVEVOVElPTikgeworCQkJCVNUcC0+cG9zX3Vua25vd24gPSAwOworCQkJCVNUcC0+cGFydGl0aW9uID0gU1RwLT5uZXdfcGFydGl0aW9uID0gMDsKKwkJCQlpZiAoU1RwLT5jYW5fcGFydGl0aW9ucykKKwkJCQkJU1RwLT5uYnJfcGFydGl0aW9ucyA9IDE7ICAvKiBUaGlzIGd1ZXNzIHdpbGwgYmUgdXBkYXRlZCBsYXRlciBpZiBuZWNlc3NhcnkgKi8KKwkJCQlmb3IgKGk9MDsgaSA8IFNUX05CUl9QQVJUSVRJT05TOyBpKyspIHsKKwkJCQkJU1RwcyA9ICYoU1RwLT5wc1tpXSk7CisJCQkJCVNUcHMtPnJ3ID0gU1RfSURMRTsKKwkJCQkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisJCQkJCVNUcHMtPmF0X3NtID0gMDsKKwkJCQkJU1Rwcy0+bGFzdF9ibG9ja192YWxpZCA9IDA7CisJCQkJCVNUcHMtPmRydl9ibG9jayA9IDA7CisJCQkJCVNUcHMtPmRydl9maWxlID0gMCA7CisJCQkJfQorCQkJCW5ld19zZXNzaW9uID0gMTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChvc3N0X3dhaXRfcmVhZHkoU1RwLCAmU1JwbnQsIDE1ICogNjAsIDApKQkJLyogRklYTUUgLSBub3QgYWxsb3dlZCB3aXRoIE5PQkxPQ0sgKi8KKwkJIHByaW50ayhLRVJOX0lORk8gIiVzOkk6IERldmljZSBkaWQgbm90IGJlY29tZSBSZWFkeSBpbiBvcGVuXG4iLCBuYW1lKTsKKworCWlmICgoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCAhPSAwKSB7CisJCWlmICgoU1RwLT5kZXZpY2UpLT5zY3NpX2xldmVsID49IFNDU0lfMiAmJgorCQkgICAgKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMF0gJiAweDcwKSA9PSAweDcwICYmCisJCSAgICAoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAmIDB4MGYpID09IE5PVF9SRUFEWSAmJgorCQkgICAgIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTJdID09IDB4M2EpIHsgLyogQ2hlY2sgQVNDICovCisJCQlTVHAtPnJlYWR5ID0gU1RfTk9fVEFQRTsKKwkJfSBlbHNlCisJCQlTVHAtPnJlYWR5ID0gU1RfTk9UX1JFQURZOworCQlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJCVNScG50ID0gTlVMTDsKKwkJU1RwLT5kZW5zaXR5ID0gMDsgICAJLyogQ2xlYXIgdGhlIGVycm9uZW91cyAicmVzaWR1ZSIgKi8KKwkJU1RwLT53cml0ZV9wcm90ID0gMDsKKwkJU1RwLT5ibG9ja19zaXplID0gMDsKKwkJU1RwLT5wc1swXS5kcnZfZmlsZSA9IFNUcC0+cHNbMF0uZHJ2X2Jsb2NrID0gKC0xKTsKKwkJU1RwLT5wYXJ0aXRpb24gPSBTVHAtPm5ld19wYXJ0aXRpb24gPSAwOworCQlTVHAtPmRvb3JfbG9ja2VkID0gU1RfVU5MT0NLRUQ7CisJCXJldHVybiAwOworCX0KKworCW9zc3RfY29uZmlndXJlX29uc3RyZWFtKFNUcCwgJlNScG50KTsKKworCVNUcC0+YmxvY2tfc2l6ZSA9IFNUcC0+cmF3ID8gT1NfRlJBTUVfU0laRSA6ICgKKwkJCSAgICAgKFNUbS0+ZGVmYXVsdF9ibGtzaXplID4gMCkgPyBTVG0tPmRlZmF1bHRfYmxrc2l6ZSA6IE9TX0RBVEFfU0laRSk7CisJU1RwLT5idWZmZXItPmJ1ZmZlcl9ibG9ja3MgPSBTVHAtPnJhdyA/IDEgOiBPU19EQVRBX1NJWkUgLyBTVHAtPmJsb2NrX3NpemU7CisJU1RwLT5idWZmZXItPmJ1ZmZlcl9ieXRlcyAgPQorCVNUcC0+YnVmZmVyLT5yZWFkX3BvaW50ZXIgID0KKwlTVHAtPmZyYW1lX2luX2J1ZmZlciAgICAgICA9IDA7CisKKyNpZiBERUJVRworCWlmIChkZWJ1Z2dpbmcpCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEJsb2NrIHNpemU6ICVkLCBmcmFtZSBzaXplOiAlZCwgYnVmZmVyIHNpemU6ICVkICglZCBibG9ja3MpLlxuIiwKKwkJICAgICBuYW1lLCBTVHAtPmJsb2NrX3NpemUsIE9TX0ZSQU1FX1NJWkUsIChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9zaXplLAorCQkgICAgIChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ibG9ja3MpOworI2VuZGlmCisKKwlpZiAoU1RwLT5kcnZfd3JpdGVfcHJvdCkgeworCQlTVHAtPndyaXRlX3Byb3QgPSAxOworI2lmIERFQlVHCisJCWlmIChkZWJ1Z2dpbmcpCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBXcml0ZSBwcm90ZWN0ZWRcbiIsIG5hbWUpOworI2VuZGlmCisJCWlmICgoZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fV1JPTkxZIHx8IChmbGFncyAmIE9fQUNDTU9ERSkgPT0gT19SRFdSKSB7CisJCQlyZXR2YWwgPSAoLUVST0ZTKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCX0KKworCWlmIChuZXdfc2Vzc2lvbikgeyAgLyogQ2hhbmdlIHRoZSBkcml2ZSBwYXJhbWV0ZXJzIGZvciB0aGUgbmV3IG1vZGUgKi8KKyNpZiBERUJVRworCQlpZiAoZGVidWdnaW5nKQorCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IE5ldyBTZXNzaW9uXG4iLCBuYW1lKTsKKyNlbmRpZgorCQlTVHAtPmRlbnNpdHlfY2hhbmdlZCA9IFNUcC0+Ymxrc2l6ZV9jaGFuZ2VkID0gMDsKKwkJU1RwLT5jb21wcmVzc2lvbl9jaGFuZ2VkID0gMDsKKwl9CisKKwkvKgorCSAqIHByb3Blcmx5IHBvc2l0aW9uIHRoZSB0YXBlIGFuZCBjaGVjayB0aGUgQURSIGhlYWRlcnMKKwkgKi8KKwlpZiAoU1RwLT5kb29yX2xvY2tlZCA9PSBTVF9VTkxPQ0tFRCkgeworCQkgaWYgKGRvX2Rvb3JfbG9jayhTVHAsIDEpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6STogQ2FuJ3QgbG9jayBkcml2ZSBkb29yXG4iLCBuYW1lKTsKKwkJIGVsc2UKKwkJCVNUcC0+ZG9vcl9sb2NrZWQgPSBTVF9MT0NLRURfQVVUTzsKKwl9CisKKwlvc3N0X2FuYWx5emVfaGVhZGVycyhTVHAsICZTUnBudCk7CisKKwlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJU1JwbnQgPSBOVUxMOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJaWYgKFNScG50ICE9IE5VTEwpCisJCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwlub3JtYWxpemVfYnVmZmVyKFNUcC0+YnVmZmVyKTsKKwlTVHAtPmhlYWRlcl9vayA9IDA7CisJU1RwLT5pbl91c2UgPSAwOworCXNjc2lfZGV2aWNlX3B1dChTVHAtPmRldmljZSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKy8qIEZsdXNoIHRoZSB0YXBlIGJ1ZmZlciBiZWZvcmUgY2xvc2UgKi8KK3N0YXRpYyBpbnQgb3Nfc2NzaV90YXBlX2ZsdXNoKHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlpbnQJCSAgICAgIHJlc3VsdCA9IDAsIHJlc3VsdDI7CisJc3RydWN0IG9zc3RfdGFwZSAgICAqIFNUcCAgICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc3RfbW9kZWRlZiAgICogU1RtICAgID0gJihTVHAtPm1vZGVzW1NUcC0+Y3VycmVudF9tb2RlXSk7CisJc3RydWN0IHN0X3BhcnRzdGF0ICAqIFNUcHMgICA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKiBTUnBudCAgPSBOVUxMOworCWNoYXIJCSAgICAqIG5hbWUgICA9IHRhcGVfbmFtZShTVHApOworCisJaWYgKGZpbGVfY291bnQoZmlscCkgPiAxKQorCQlyZXR1cm4gMDsKKworCWlmICgoU1Rwcy0+cncgPT0gU1RfV1JJVElORyB8fCBTVHAtPmRpcnR5KSAmJiAhU1RwLT5wb3NfdW5rbm93bikgeworCQlTVHAtPndyaXRlX3R5cGUgPSBPU19XUklURV9EQVRBOworCQlyZXN1bHQgPSBvc3N0X2ZsdXNoX3dyaXRlX2J1ZmZlcihTVHAsICZTUnBudCk7CisJCWlmIChyZXN1bHQgIT0gMCAmJiByZXN1bHQgIT0gKC1FTk9TUEMpKQorCQkJZ290byBvdXQ7CisJfQorCWlmICggU1Rwcy0+cncgPj0gU1RfV1JJVElORyAmJiAhU1RwLT5wb3NfdW5rbm93bikgeworCisjaWYgREVCVUcKKwkJaWYgKGRlYnVnZ2luZykgeworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRmlsZSBsZW5ndGggJWxkIGJ5dGVzLlxuIiwKKwkJCQkJICAgICAgIG5hbWUsIChsb25nKShmaWxwLT5mX3BvcykpOworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQXN5bmMgd3JpdGUgd2FpdHMgJWQsIGZpbmlzaGVkICVkLlxuIiwKKwkJCQkJICAgICAgIG5hbWUsIFNUcC0+bmJyX3dhaXRzLCBTVHAtPm5icl9maW5pc2hlZCk7CisJCX0KKyNlbmRpZgorCQlyZXN1bHQgPSBvc3N0X3dyaXRlX3RyYWlsZXIoU1RwLCAmU1JwbnQsICEoU1RwLT5yZXdfYXRfY2xvc2UpKTsKKyNpZiBERUJVRworCQlpZiAoZGVidWdnaW5nKQorCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQnVmZmVyIGZsdXNoZWQsICVkIEVPRihzKSB3cml0dGVuXG4iLAorCQkJCQkgICAgICAgbmFtZSwgMStTVHAtPnR3b19mbSk7CisjZW5kaWYKKwl9CisJZWxzZSBpZiAoIVNUcC0+cmV3X2F0X2Nsb3NlKSB7CisJCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKKwkJaWYgKCFTVG0tPnN5c3YgfHwgU1Rwcy0+cncgIT0gU1RfUkVBRElORykgeworCQkJaWYgKFNUcC0+Y2FuX2JzcikKKwkJCQlyZXN1bHQgPSBvc3N0X2ZsdXNoX2J1ZmZlcihTVHAsICZTUnBudCwgMCk7IC8qIHRoaXMgaXMgdGhlIGRlZmF1bHQgcGF0aCAqLworCQkJZWxzZSBpZiAoU1Rwcy0+ZW9mID09IFNUX0ZNX0hJVCkgeworCQkJCXJlc3VsdCA9IGNyb3NzX2VvZihTVHAsICZTUnBudCwgMCk7CisJCQkJCWlmIChyZXN1bHQpIHsKKwkJCQkJCWlmIChTVHBzLT5kcnZfZmlsZSA+PSAwKQorCQkJCQkJCVNUcHMtPmRydl9maWxlKys7CisJCQkJCQlTVHBzLT5kcnZfYmxvY2sgPSAwOworCQkJCQkJU1Rwcy0+ZW9mID0gU1RfRk07CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoKFNUcHMtPmVvZiA9PSBTVF9OT0VPRiAmJgorCQkJICAhKHJlc3VsdCA9IGNyb3NzX2VvZihTVHAsICZTUnBudCwgMSkpKSB8fAorCQkJIFNUcHMtPmVvZiA9PSBTVF9GTV9ISVQpIHsKKwkJCWlmIChTVHBzLT5kcnZfZmlsZSA+PSAwKQorCQkJCVNUcHMtPmRydl9maWxlKys7CisJCQlTVHBzLT5kcnZfYmxvY2sgPSAwOworCQkJU1Rwcy0+ZW9mID0gU1RfRk07CisJCX0KKwl9CisKK291dDoKKwlpZiAoU1RwLT5yZXdfYXRfY2xvc2UpIHsKKwkJcmVzdWx0MiA9IG9zc3RfcG9zaXRpb25fdGFwZV9hbmRfY29uZmlybShTVHAsICZTUnBudCwgU1RwLT5maXJzdF9kYXRhX3Bwb3MpOworCQlTVHBzLT5kcnZfZmlsZSA9IFNUcHMtPmRydl9ibG9jayA9IFNUcC0+ZnJhbWVfc2VxX251bWJlciA9IFNUcC0+bG9naWNhbF9ibGtfbnVtID0gMDsKKwkJaWYgKHJlc3VsdCA9PSAwICYmIHJlc3VsdDIgPCAwKQorCQkJcmVzdWx0ID0gcmVzdWx0MjsKKwl9CisJaWYgKFNScG50KSBzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisKKwlpZiAoU1RwLT5hYm9ydF9jb3VudCB8fCBTVHAtPnJlY292ZXJfY291bnQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6SToiLCBuYW1lKTsKKwkJaWYgKFNUcC0+YWJvcnRfY291bnQpCisJCQlwcmludGsoIiAlZCB1bnJlY292ZXJlZCBlcnJvcnMiLCBTVHAtPmFib3J0X2NvdW50KTsKKwkJaWYgKFNUcC0+cmVjb3Zlcl9jb3VudCkKKwkJCXByaW50aygiICVkIHJlY292ZXJlZCBlcnJvcnMiLCBTVHAtPnJlY292ZXJfY291bnQpOworCQlpZiAoU1RwLT53cml0ZV9jb3VudCkKKwkJCXByaW50aygiIGluICVkIGZyYW1lcyB3cml0dGVuIiwgU1RwLT53cml0ZV9jb3VudCk7CisJCWlmIChTVHAtPnJlYWRfY291bnQpCisJCQlwcmludGsoIiBpbiAlZCBmcmFtZXMgcmVhZCIsIFNUcC0+cmVhZF9jb3VudCk7CisJCXByaW50aygiXG4iKTsKKwkJU1RwLT5yZWNvdmVyX2NvdW50ID0gMDsKKwkJU1RwLT5hYm9ydF9jb3VudCAgID0gMDsKKwl9CisJU1RwLT53cml0ZV9jb3VudCA9IDA7CisJU1RwLT5yZWFkX2NvdW50ICA9IDA7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qIENsb3NlIHRoZSBkZXZpY2UgYW5kIHJlbGVhc2UgaXQgKi8KK3N0YXRpYyBpbnQgb3Nfc2NzaV90YXBlX2Nsb3NlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJaW50CQkgICAgICByZXN1bHQgPSAwOworCXN0cnVjdCBvc3N0X3RhcGUgICAgKiBTVHAgICAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoU1RwLT5kb29yX2xvY2tlZCA9PSBTVF9MT0NLRURfQVVUTykKKwkJZG9fZG9vcl9sb2NrKFNUcCwgMCk7CisKKwlpZiAoU1RwLT5yYXcpCisJCVNUcC0+aGVhZGVyX29rID0gMDsKKwkKKwlub3JtYWxpemVfYnVmZmVyKFNUcC0+YnVmZmVyKTsKKwl3cml0ZV9sb2NrKCZvc19zY3NpX3RhcGVzX2xvY2spOworCVNUcC0+aW5fdXNlID0gMDsKKwl3cml0ZV91bmxvY2soJm9zX3Njc2lfdGFwZXNfbG9jayk7CisKKwlzY3NpX2RldmljZV9wdXQoU1RwLT5kZXZpY2UpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBUaGUgaW9jdGwgY29tbWFuZCAqLworc3RhdGljIGludCBvc3N0X2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLHN0cnVjdCBmaWxlICogZmlsZSwKKwkgdW5zaWduZWQgaW50IGNtZF9pbiwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50CQkgICAgICBpLCBjbWRfbnIsIGNtZF90eXBlLCByZXR2YWwgPSAwOworCXVuc2lnbmVkIGludAkgICAgICBibGs7CisJc3RydWN0IHN0X21vZGVkZWYgICAqIFNUbTsKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgICogU1RwczsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICogU1JwbnQgPSBOVUxMOworCXN0cnVjdCBvc3N0X3RhcGUgICAgKiBTVHAgICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyCQkgICAgKiBuYW1lICA9IHRhcGVfbmFtZShTVHApOworCXZvaWQJICAgIF9fdXNlciAgKiBwICAgICA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJlNUcC0+bG9jaykpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKyNpZiBERUJVRworCWlmIChkZWJ1Z2dpbmcgJiYgIVNUcC0+aW5fdXNlKSB7CisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEluY29ycmVjdCBkZXZpY2UuXG4iLCBuYW1lKTsKKwkJcmV0dmFsID0gKC1FSU8pOworCQlnb3RvIG91dDsKKwl9CisjZW5kaWYKKwlTVG0gPSAmKFNUcC0+bW9kZXNbU1RwLT5jdXJyZW50X21vZGVdKTsKKwlTVHBzID0gJihTVHAtPnBzW1NUcC0+cGFydGl0aW9uXSk7CisKKwkvKgorCSAqIElmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGVycm9yIHJlY292ZXJ5LCBkb24ndCBsZXQgYW55b25lCisJICogZWxzZSB0cnkgYW5kIHVzZSB0aGlzIGRldmljZS4gIEFsc28sIGlmIGVycm9yIHJlY292ZXJ5IGZhaWxzLCBpdAorCSAqIG1heSB0cnkgYW5kIHRha2UgdGhlIGRldmljZSBvZmZsaW5lLCBpbiB3aGljaCBjYXNlIGFsbCBmdXJ0aGVyCisJICogYWNjZXNzIHRvIHRoZSBkZXZpY2UgaXMgcHJvaGliaXRlZC4KKwkgKi8KKwlpZiggIXNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhTVHAtPmRldmljZSkgKSB7CisJCXJldHZhbCA9ICgtRU5YSU8pOworCQlnb3RvIG91dDsKKwl9CisKKwljbWRfdHlwZSA9IF9JT0NfVFlQRShjbWRfaW4pOworCWNtZF9uciAgID0gX0lPQ19OUihjbWRfaW4pOworI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogSW9jdGwgJWQsJWQgaW4gJXMgbW9kZVxuIiwgbmFtZSwKKwkJCSAgICBjbWRfdHlwZSwgY21kX25yLCBTVHAtPnJhdz8icmF3Ijoibm9ybWFsIik7CisjZW5kaWYKKwlpZiAoY21kX3R5cGUgPT0gX0lPQ19UWVBFKE1USU9DVE9QKSAmJiBjbWRfbnIgPT0gX0lPQ19OUihNVElPQ1RPUCkpIHsKKwkJc3RydWN0IG10b3AgbXRjOworCQlpbnQgICAgYXV0b193ZW9mID0gMDsKKworCQlpZiAoX0lPQ19TSVpFKGNtZF9pbikgIT0gc2l6ZW9mKG10YykpIHsKKwkJCXJldHZhbCA9ICgtRUlOVkFMKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaSA9IGNvcHlfZnJvbV91c2VyKChjaGFyICopICZtdGMsIHAsIHNpemVvZihzdHJ1Y3QgbXRvcCkpOworCQlpZiAoaSkgeworCQkJcmV0dmFsID0gKC1FRkFVTFQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAobXRjLm10X29wID09IE1UU0VURFJWQlVGRkVSICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpXOiBNVFNFVERSVkJVRkZFUiBvbmx5IGFsbG93ZWQgZm9yIHJvb3QuXG4iLCBuYW1lKTsKKwkJCXJldHZhbCA9ICgtRVBFUk0pOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoIVNUbS0+ZGVmaW5lZCAmJiAobXRjLm10X29wICE9IE1UU0VURFJWQlVGRkVSICYmIChtdGMubXRfY291bnQgJiBNVF9TVF9PUFRJT05TKSA9PSAwKSkgeworCQkJcmV0dmFsID0gKC1FTlhJTyk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmICghU1RwLT5wb3NfdW5rbm93bikgeworCisJCQlpZiAoU1Rwcy0+ZW9mID09IFNUX0ZNX0hJVCkgeworCQkJCWlmIChtdGMubXRfb3AgPT0gTVRGU0YgfHwgbXRjLm10X29wID09IE1URlNGTXx8IG10Yy5tdF9vcCA9PSBNVEVPTSkgeworCQkJCQltdGMubXRfY291bnQgLT0gMTsKKwkJCQkJaWYgKFNUcHMtPmRydl9maWxlID49IDApCisJCQkJCQlTVHBzLT5kcnZfZmlsZSArPSAxOworCQkJCX0KKwkJCQllbHNlIGlmIChtdGMubXRfb3AgPT0gTVRCU0YgfHwgbXRjLm10X29wID09IE1UQlNGTSkgeworCQkJCQltdGMubXRfY291bnQgKz0gMTsKKwkJCQkJaWYgKFNUcHMtPmRydl9maWxlID49IDApCisJCQkJCQlTVHBzLT5kcnZfZmlsZSArPSAxOworCQkJCX0KKwkJCX0KKworCQkJaWYgKG10Yy5tdF9vcCA9PSBNVFNFRUspIHsKKwkJCQkvKiBPbGQgcG9zaXRpb24gbXVzdCBiZSByZXN0b3JlZCBpZiBwYXJ0aXRpb24gd2lsbCBiZSBjaGFuZ2VkICovCisJCQkJaSA9ICFTVHAtPmNhbl9wYXJ0aXRpb25zIHx8IChTVHAtPm5ld19wYXJ0aXRpb24gIT0gU1RwLT5wYXJ0aXRpb24pOworCQkJfQorCQkJZWxzZSB7CisJCQkJaSA9IG10Yy5tdF9vcCA9PSBNVFJFVyAgIHx8IG10Yy5tdF9vcCA9PSBNVE9GRkwgfHwKKwkJCQkgICAgbXRjLm10X29wID09IE1UUkVURU4gfHwgbXRjLm10X29wID09IE1URU9NICB8fAorCQkJCSAgICBtdGMubXRfb3AgPT0gTVRMT0NLICB8fCBtdGMubXRfb3AgPT0gTVRMT0FEIHx8CisJCQkJICAgIG10Yy5tdF9vcCA9PSBNVEZTRiAgIHx8IG10Yy5tdF9vcCA9PSBNVEZTRk0gfHwKKwkJCQkgICAgbXRjLm10X29wID09IE1UQlNGICAgfHwgbXRjLm10X29wID09IE1UQlNGTSB8fAorCQkJCSAgICBtdGMubXRfb3AgPT0gTVRDT01QUkVTU0lPTjsKKwkJCX0KKwkJCWkgPSBvc3N0X2ZsdXNoX2J1ZmZlcihTVHAsICZTUnBudCwgaSk7CisJCQlpZiAoaSA8IDApIHsKKwkJCQlyZXR2YWwgPSBpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIElmIHRoZXJlIHdhcyBhIGJ1cyByZXNldCwgYmxvY2sgZnVydGhlciBhY2Nlc3MKKwkJCSAqIHRvIHRoaXMgZGV2aWNlLiAgSWYgdGhlIHVzZXIgd2FudHMgdG8gcmV3aW5kIHRoZSB0YXBlLAorCQkJICogdGhlbiByZXNldCB0aGUgZmxhZyBhbmQgYWxsb3cgYWNjZXNzIGFnYWluLgorCQkJICovCisJCQlpZihtdGMubXRfb3AgIT0gTVRSRVcgICAmJgorCQkJICAgbXRjLm10X29wICE9IE1UT0ZGTCAgJiYKKwkJCSAgIG10Yy5tdF9vcCAhPSBNVFJFVEVOICYmCisJCQkgICBtdGMubXRfb3AgIT0gTVRFUkFTRSAmJgorCQkJICAgbXRjLm10X29wICE9IE1UU0VFSyAgJiYKKwkJCSAgIG10Yy5tdF9vcCAhPSBNVEVPTSkgICB7CisJCQkJcmV0dmFsID0gKC1FSU8pOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJcmVzZXRfc3RhdGUoU1RwKTsKKwkJCS8qIHJlbW92ZSB0aGlzIHdoZW4gdGhlIG1pZGxldmVsIHByb3Blcmx5IGNsZWFycyB3YXNfcmVzZXQgKi8KKwkJCVNUcC0+ZGV2aWNlLT53YXNfcmVzZXQgPSAwOworCQl9CisKKwkJaWYgKG10Yy5tdF9vcCAhPSBNVENPTVBSRVNTSU9OICAmJiBtdGMubXRfb3AgIT0gTVRMT0NLICAgICAgICAgJiYKKwkJICAgIG10Yy5tdF9vcCAhPSBNVE5PUCAgICAgICAgICAmJiBtdGMubXRfb3AgIT0gTVRTRVRCTEsgICAgICAgJiYKKwkJICAgIG10Yy5tdF9vcCAhPSBNVFNFVERFTlNJVFkgICAmJiBtdGMubXRfb3AgIT0gTVRTRVREUlZCVUZGRVIgJiYgCisJCSAgICBtdGMubXRfb3AgIT0gTVRNS1BBUlQgICAgICAgJiYgbXRjLm10X29wICE9IE1UU0VUUEFSVCAgICAgICYmCisJCSAgICBtdGMubXRfb3AgIT0gTVRXRU9GICAgICAgICAgJiYgbXRjLm10X29wICE9IE1UV1NNICAgICAgICAgICApIHsKKworCQkJLyoKKwkJCSAqIFRoZSB1c2VyIHRlbGxzIHVzIHRvIG1vdmUgdG8gYW5vdGhlciBwb3NpdGlvbiBvbiB0aGUgdGFwZS4KKwkJCSAqIElmIHdlIHdlcmUgYXBwZW5kaW5nIHRvIHRoZSB0YXBlIGNvbnRlbnQsIHRoYXQgd291bGQgbGVhdmUKKwkJCSAqIHRoZSB0YXBlIHdpdGhvdXQgcHJvcGVyIGVuZCwgaW4gdGhhdCBjYXNlIHdyaXRlIEVPRCBhbmQKKwkJCSAqIHVwZGF0ZSB0aGUgaGVhZGVyIHRvIHJlZmxlY3QgaXRzIHBvc2l0aW9uLgorCQkJICovCisjaWYgREVCVUcKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOkQ6IGF1dG9fd2VvZCAlcyBhdCBmZnA9JWQsZWZwPSVkLGZzbj0lZCxsYm49JWQsZm49JWQsYm49JWRcbiIsIG5hbWUsCisJCQkJCVNUcHMtPnJ3ID49IFNUX1dSSVRJTkcgPyAid3JpdGUiIDogU1Rwcy0+cncgPT0gU1RfUkVBRElORyA/ICJyZWFkIiA6ICJpZGxlIiwKKwkJCQkJU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiwgU1RwLT5lb2RfZnJhbWVfcHBvcywgU1RwLT5mcmFtZV9zZXFfbnVtYmVyLAorCQkJCQlTVHAtPmxvZ2ljYWxfYmxrX251bSwgU1Rwcy0+ZHJ2X2ZpbGUsIFNUcHMtPmRydl9ibG9jayApOworI2VuZGlmCisJCQlpZiAoU1Rwcy0+cncgPj0gU1RfV1JJVElORyAmJiBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uID49IFNUcC0+ZW9kX2ZyYW1lX3Bwb3MpIHsKKwkJCQlhdXRvX3dlb2YgPSAoKFNUcC0+d3JpdGVfdHlwZSAhPSBPU19XUklURV9ORVdfTUFSSykgJiYKKwkJCQkJCQkhKG10Yy5tdF9vcCA9PSBNVFJFVyB8fCBtdGMubXRfb3AgPT0gTVRPRkZMKSk7CisJCQkJaSA9IG9zc3Rfd3JpdGVfdHJhaWxlcihTVHAsICZTUnBudCwKKwkJCQkJCQkhKG10Yy5tdF9vcCA9PSBNVFJFVyB8fCBtdGMubXRfb3AgPT0gTVRPRkZMKSk7CisjaWYgREVCVUcKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpEOiBwb3N0IHRyYWlsZXIgeGVvZj0lZCxmZnA9JWQsZWZwPSVkLGZzbj0lZCxsYm49JWQsZm49JWQsYm49JWRcbiIsCisJCQkJCQluYW1lLCBhdXRvX3dlb2YsIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24sIFNUcC0+ZW9kX2ZyYW1lX3Bwb3MsCisJCQkJCQlTVHAtPmZyYW1lX3NlcV9udW1iZXIsIFNUcC0+bG9naWNhbF9ibGtfbnVtLCBTVHBzLT5kcnZfZmlsZSwgU1Rwcy0+ZHJ2X2Jsb2NrICk7CisjZW5kaWYKKwkJCQlpZiAoaSA8IDApIHsKKwkJCQkJcmV0dmFsID0gaTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQkJU1Rwcy0+cncgPSBTVF9JRExFOworCQl9CisKKwkJaWYgKG10Yy5tdF9vcCA9PSBNVE9GRkwgJiYgU1RwLT5kb29yX2xvY2tlZCAhPSBTVF9VTkxPQ0tFRCkKKwkJCWRvX2Rvb3JfbG9jayhTVHAsIDApOyAgLyogSWdub3JlIHJlc3VsdCEgKi8KKworCQlpZiAobXRjLm10X29wID09IE1UU0VURFJWQlVGRkVSICYmCisJCSAgIChtdGMubXRfY291bnQgJiBNVF9TVF9PUFRJT05TKSAhPSAwKSB7CisJCQlyZXR2YWwgPSBvc3N0X3NldF9vcHRpb25zKFNUcCwgbXRjLm10X2NvdW50KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKG10Yy5tdF9vcCA9PSBNVFNFVFBBUlQpIHsKKwkJCWlmIChtdGMubXRfY291bnQgPj0gU1RwLT5uYnJfcGFydGl0aW9ucykKKwkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJZWxzZSB7CisJCQkJU1RwLT5uZXdfcGFydGl0aW9uID0gbXRjLm10X2NvdW50OworCQkJCXJldHZhbCA9IDA7CisJCQl9CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChtdGMubXRfb3AgPT0gTVRNS1BBUlQpIHsKKwkJCWlmICghU1RwLT5jYW5fcGFydGl0aW9ucykgeworCQkJCXJldHZhbCA9ICgtRUlOVkFMKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmICgoaSA9IG9zc3RfaW50X2lvY3RsKFNUcCwgJlNScG50LCBNVFJFVywgMCkpIDwgMCAvKnx8CisJCQkgICAgKGkgPSBwYXJ0aXRpb25fdGFwZShpbm9kZSwgbXRjLm10X2NvdW50KSkgPCAwKi8pIHsKKwkJCQlyZXR2YWwgPSBpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJZm9yIChpPTA7IGkgPCBTVF9OQlJfUEFSVElUSU9OUzsgaSsrKSB7CisJCQkJU1RwLT5wc1tpXS5ydyA9IFNUX0lETEU7CisJCQkJU1RwLT5wc1tpXS5hdF9zbSA9IDA7CisJCQkJU1RwLT5wc1tpXS5sYXN0X2Jsb2NrX3ZhbGlkID0gMDsKKwkJCX0KKwkJCVNUcC0+cGFydGl0aW9uID0gU1RwLT5uZXdfcGFydGl0aW9uID0gMDsKKwkJCVNUcC0+bmJyX3BhcnRpdGlvbnMgPSAxOyAgLyogQmFkIGd1ZXNzID8tKSAqLworCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gU1Rwcy0+ZHJ2X2ZpbGUgPSAwOworCQkJcmV0dmFsID0gMDsKKwkJCWdvdG8gb3V0OworCSAJfQorCisJCWlmIChtdGMubXRfb3AgPT0gTVRTRUVLKSB7CisJCQlpZiAoU1RwLT5yYXcpCisJCQkJaSA9IG9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgJlNScG50LCBtdGMubXRfY291bnQsIDApOworCQkJZWxzZQorCQkJCWkgPSBvc3N0X3NlZWtfc2VjdG9yKFNUcCwgJlNScG50LCBtdGMubXRfY291bnQpOworCQkJaWYgKCFTVHAtPmNhbl9wYXJ0aXRpb25zKQorCQkJCVNUcC0+cHNbMF0ucncgPSBTVF9JRExFOworCQkJcmV0dmFsID0gaTsKKwkJCWdvdG8gb3V0OworCQl9CisgCisJCWlmIChtdGMubXRfb3AgPT0gTVRMT0NLIHx8IG10Yy5tdF9vcCA9PSBNVFVOTE9DSykgeworCQkJcmV0dmFsID0gZG9fZG9vcl9sb2NrKFNUcCwgKG10Yy5tdF9vcCA9PSBNVExPQ0spKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGF1dG9fd2VvZikKKwkJCWNyb3NzX2VvZihTVHAsICZTUnBudCwgMCk7CisKKwkJaWYgKG10Yy5tdF9vcCA9PSBNVENPTVBSRVNTSU9OKQorCQkJcmV0dmFsID0gLUVJTlZBTDsgICAgICAgLyogT25TdHJlYW0gZHJpdmVzIGRvbid0IGhhdmUgY29tcHJlc3Npb24gaGFyZHdhcmUgKi8KKwkJZWxzZQorCQkJLyogTVRCU0YgTVRCU0ZNIE1UQlNSIE1UQlNTIE1URU9NIE1URVJBU0UgTVRGU0YgTVRGU0ZCIE1URlNSIE1URlNTCisJCQkgKiBNVExPQUQgTVRPRkZMIE1UUkVTRVQgTVRSRVRFTiBNVFJFVyBNVFVOTE9BRCBNVFdFT0YgTVRXU00gKi8KKwkJCXJldHZhbCA9IG9zc3RfaW50X2lvY3RsKFNUcCwgJlNScG50LCBtdGMubXRfb3AsIG10Yy5tdF9jb3VudCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghU1RtLT5kZWZpbmVkKSB7CisJCXJldHZhbCA9ICgtRU5YSU8pOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKGkgPSBvc3N0X2ZsdXNoX2J1ZmZlcihTVHAsICZTUnBudCwgMCkpIDwgMCkgeworCQlyZXR2YWwgPSBpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoY21kX3R5cGUgPT0gX0lPQ19UWVBFKE1USU9DR0VUKSAmJiBjbWRfbnIgPT0gX0lPQ19OUihNVElPQ0dFVCkpIHsKKwkJc3RydWN0IG10Z2V0IG10X3N0YXR1czsKKworCQlpZiAoX0lPQ19TSVpFKGNtZF9pbikgIT0gc2l6ZW9mKHN0cnVjdCBtdGdldCkpIHsKKwkJCSByZXR2YWwgPSAoLUVJTlZBTCk7CisJCQkgZ290byBvdXQ7CisJCX0KKworCQltdF9zdGF0dXMubXRfdHlwZSA9IE1UX0lTT05TVFJFQU1fU0M7CisJCW10X3N0YXR1cy5tdF9lcnJlZyA9IFNUcC0+cmVjb3Zlcl9lcnJlZyA8PCBNVF9TVF9TT0ZURVJSX1NISUZUOworCQltdF9zdGF0dXMubXRfZHNyZWcgPQorCQkJKChTVHAtPmJsb2NrX3NpemUgPDwgTVRfU1RfQkxLU0laRV9TSElGVCkgJiBNVF9TVF9CTEtTSVpFX01BU0spIHwKKwkJCSgoU1RwLT5kZW5zaXR5ICAgIDw8IE1UX1NUX0RFTlNJVFlfU0hJRlQpICYgTVRfU1RfREVOU0lUWV9NQVNLKTsKKwkJbXRfc3RhdHVzLm10X2Jsa25vID0gU1Rwcy0+ZHJ2X2Jsb2NrOworCQltdF9zdGF0dXMubXRfZmlsZW5vID0gU1Rwcy0+ZHJ2X2ZpbGU7CisJCWlmIChTVHAtPmJsb2NrX3NpemUgIT0gMCkgeworCQkJaWYgKFNUcHMtPnJ3ID09IFNUX1dSSVRJTkcpCisJCQkJbXRfc3RhdHVzLm10X2Jsa25vICs9IChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyAvIFNUcC0+YmxvY2tfc2l6ZTsKKwkJCWVsc2UgaWYgKFNUcHMtPnJ3ID09IFNUX1JFQURJTkcpCisJCQkJbXRfc3RhdHVzLm10X2Jsa25vIC09ICgoU1RwLT5idWZmZXIpLT5idWZmZXJfYnl0ZXMgKworCQkJCQkJCVNUcC0+YmxvY2tfc2l6ZSAtIDEpIC8gU1RwLT5ibG9ja19zaXplOworCQl9CisKKwkJbXRfc3RhdHVzLm10X2dzdGF0ID0gMDsKKwkJaWYgKFNUcC0+ZHJ2X3dyaXRlX3Byb3QpCisJCQltdF9zdGF0dXMubXRfZ3N0YXQgfD0gR01UX1dSX1BST1QoMHhmZmZmZmZmZik7CisJCWlmIChtdF9zdGF0dXMubXRfYmxrbm8gPT0gMCkgeworCQkJaWYgKG10X3N0YXR1cy5tdF9maWxlbm8gPT0gMCkKKwkJCQltdF9zdGF0dXMubXRfZ3N0YXQgfD0gR01UX0JPVCgweGZmZmZmZmZmKTsKKwkJCWVsc2UKKwkJCQltdF9zdGF0dXMubXRfZ3N0YXQgfD0gR01UX0VPRigweGZmZmZmZmZmKTsKKwkJfQorCQltdF9zdGF0dXMubXRfcmVzaWQgPSBTVHAtPnBhcnRpdGlvbjsKKwkJaWYgKFNUcHMtPmVvZiA9PSBTVF9FT01fT0sgfHwgU1Rwcy0+ZW9mID09IFNUX0VPTV9FUlJPUikKKwkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfRU9UKDB4ZmZmZmZmZmYpOworCQllbHNlIGlmIChTVHBzLT5lb2YgPj0gU1RfRU9NX09LKQorCQkJbXRfc3RhdHVzLm10X2dzdGF0IHw9IEdNVF9FT0QoMHhmZmZmZmZmZik7CisJCWlmIChTVHAtPmRlbnNpdHkgPT0gMSkKKwkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfRF84MDAoMHhmZmZmZmZmZik7CisJCWVsc2UgaWYgKFNUcC0+ZGVuc2l0eSA9PSAyKQorCQkJbXRfc3RhdHVzLm10X2dzdGF0IHw9IEdNVF9EXzE2MDAoMHhmZmZmZmZmZik7CisJCWVsc2UgaWYgKFNUcC0+ZGVuc2l0eSA9PSAzKQorCQkJbXRfc3RhdHVzLm10X2dzdGF0IHw9IEdNVF9EXzYyNTAoMHhmZmZmZmZmZik7CisJCWlmIChTVHAtPnJlYWR5ID09IFNUX1JFQURZKQorCQkJbXRfc3RhdHVzLm10X2dzdGF0IHw9IEdNVF9PTkxJTkUoMHhmZmZmZmZmZik7CisJCWlmIChTVHAtPnJlYWR5ID09IFNUX05PX1RBUEUpCisJCQltdF9zdGF0dXMubXRfZ3N0YXQgfD0gR01UX0RSX09QRU4oMHhmZmZmZmZmZik7CisJCWlmIChTVHBzLT5hdF9zbSkKKwkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfU00oMHhmZmZmZmZmZik7CisJCWlmIChTVG0tPmRvX2FzeW5jX3dyaXRlcyB8fCAoU1RtLT5kb19idWZmZXJfd3JpdGVzICYmIFNUcC0+YmxvY2tfc2l6ZSAhPSAwKSB8fAorCQkgICAgU1RwLT5kcnZfYnVmZmVyICE9IDApCisJCQltdF9zdGF0dXMubXRfZ3N0YXQgfD0gR01UX0lNX1JFUF9FTigweGZmZmZmZmZmKTsKKworCQlpID0gY29weV90b191c2VyKHAsICZtdF9zdGF0dXMsIHNpemVvZihzdHJ1Y3QgbXRnZXQpKTsKKwkJaWYgKGkpIHsKKwkJCXJldHZhbCA9ICgtRUZBVUxUKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJU1RwLT5yZWNvdmVyX2VycmVnID0gMDsgIC8qIENsZWFyIGFmdGVyIHJlYWQgKi8KKwkJcmV0dmFsID0gMDsKKwkJZ290byBvdXQ7CisJfSAvKiBFbmQgb2YgTVRJT0NHRVQgKi8KKworCWlmIChjbWRfdHlwZSA9PSBfSU9DX1RZUEUoTVRJT0NQT1MpICYmIGNtZF9uciA9PSBfSU9DX05SKE1USU9DUE9TKSkgeworCQlzdHJ1Y3QgbXRwb3MgbXRfcG9zOworCisJCWlmIChfSU9DX1NJWkUoY21kX2luKSAhPSBzaXplb2Yoc3RydWN0IG10cG9zKSkgeworCQkJcmV0dmFsID0gKC1FSU5WQUwpOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKFNUcC0+cmF3KQorCQkJYmxrID0gb3NzdF9nZXRfZnJhbWVfcG9zaXRpb24oU1RwLCAmU1JwbnQpOworCQllbHNlCisJCQlibGsgPSBvc3N0X2dldF9zZWN0b3IoU1RwLCAmU1JwbnQpOworCQlpZiAoYmxrIDwgMCkgeworCQkJcmV0dmFsID0gYmxrOworCQkJZ290byBvdXQ7CisJCX0KKwkJbXRfcG9zLm10X2Jsa25vID0gYmxrOworCQlpID0gY29weV90b191c2VyKHAsICZtdF9wb3MsIHNpemVvZihzdHJ1Y3QgbXRwb3MpKTsKKwkJaWYgKGkpCisJCQlyZXR2YWwgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisJaWYgKFNScG50KSBzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisKKwl1cCgmU1RwLT5sb2NrKTsKKworCXJldHVybiBzY3NpX2lvY3RsKFNUcC0+ZGV2aWNlLCBjbWRfaW4sIHApOworCitvdXQ6CisJaWYgKFNScG50KSBzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisKKwl1cCgmU1RwLT5sb2NrKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyBvc3N0X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqIGZpbGUsIHVuc2lnbmVkIGludCBjbWRfaW4sIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBvc3N0X3RhcGUgKlNUcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBTVHAtPmRldmljZTsKKwlpbnQgcmV0ID0gLUVOT0lPQ1RMQ01EOworCWlmIChzZGV2LT5ob3N0LT5ob3N0dC0+Y29tcGF0X2lvY3RsKSB7CisKKwkJcmV0ID0gc2Rldi0+aG9zdC0+aG9zdHQtPmNvbXBhdF9pb2N0bChzZGV2LCBjbWRfaW4sICh2b2lkIF9fdXNlciAqKWFyZyk7CisKKwl9CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisKKwwKKy8qIE1lbW9yeSBoYW5kbGluZyByb3V0aW5lcyAqLworCisvKiBUcnkgdG8gYWxsb2NhdGUgYSBuZXcgdGFwZSBidWZmZXIgc2tlbGV0b24uIENhbGxlciBtdXN0IG5vdCBob2xkIG9zX3Njc2lfdGFwZXNfbG9jayAqLworc3RhdGljIHN0cnVjdCBvc3N0X2J1ZmZlciAqIG5ld190YXBlX2J1ZmZlciggaW50IGZyb21faW5pdGlhbGl6YXRpb24sIGludCBuZWVkX2RtYSwgaW50IG1heF9zZyApCit7CisJaW50IGksIHByaW9yaXR5OworCXN0cnVjdCBvc3N0X2J1ZmZlciAqdGI7CisKKwlpZiAoZnJvbV9pbml0aWFsaXphdGlvbikKKwkJcHJpb3JpdHkgPSBHRlBfQVRPTUlDOworCWVsc2UKKwkJcHJpb3JpdHkgPSBHRlBfS0VSTkVMOworCisJaSA9IHNpemVvZihzdHJ1Y3Qgb3NzdF9idWZmZXIpICsgKG9zc3RfbWF4X3NnX3NlZ3MgLSAxKSAqIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpOworCXRiID0gKHN0cnVjdCBvc3N0X2J1ZmZlciAqKWttYWxsb2MoaSwgcHJpb3JpdHkpOworCWlmICghdGIpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJvc3N0IDpJOiBDYW4ndCBhbGxvY2F0ZSBuZXcgdGFwZSBidWZmZXIuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldCh0YiwgMCwgaSk7CisJdGItPnNnX3NlZ3MgPSB0Yi0+b3JpZ19zZ19zZWdzID0gMDsKKwl0Yi0+dXNlX3NnID0gbWF4X3NnOworCXRiLT5pbl91c2UgPSAxOworCXRiLT5kbWEgPSBuZWVkX2RtYTsKKwl0Yi0+YnVmZmVyX3NpemUgPSAwOworI2lmIERFQlVHCisJaWYgKGRlYnVnZ2luZykgCisJCXByaW50ayhPU1NUX0RFQl9NU0cKKwkJCSJvc3N0IDpEOiBBbGxvY2F0ZWQgdGFwZSBidWZmZXIgc2tlbGV0b24gKCVkIGJ5dGVzLCAlZCBzZWdtZW50cywgZG1hOiAlZCkuXG4iLAorCQkJICAgaSwgbWF4X3NnLCBuZWVkX2RtYSk7CisjZW5kaWYKKwlyZXR1cm4gdGI7Cit9CisKKy8qIFRyeSB0byBhbGxvY2F0ZSBhIHRlbXBvcmFyeSAod2hpbGUgYSB1c2VyIGhhcyB0aGUgZGV2aWNlIG9wZW4pIGVubGFyZ2VkIHRhcGUgYnVmZmVyICovCitzdGF0aWMgaW50IGVubGFyZ2VfYnVmZmVyKHN0cnVjdCBvc3N0X2J1ZmZlciAqU1RidWZmZXIsIGludCBuZWVkX2RtYSkKK3sKKwlpbnQgc2VncywgbmJyLCBtYXhfc2VncywgYl9zaXplLCBwcmlvcml0eSwgb3JkZXIsIGdvdDsKKworCWlmIChTVGJ1ZmZlci0+YnVmZmVyX3NpemUgPj0gT1NfRlJBTUVfU0laRSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoU1RidWZmZXItPnNnX3NlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib3NzdCA6QTogQnVmZmVyIG5vdCBwcmV2aW91c2x5IG5vcm1hbGl6ZWQuXG4iKTsKKwkJbm9ybWFsaXplX2J1ZmZlcihTVGJ1ZmZlcik7CisJfQorCS8qIFNlZSBob3cgbWFueSBzZWdtZW50cyB3ZSBjYW4gdXNlIC0tIG5lZWQgYXQgbGVhc3QgdHdvICovCisJbmJyID0gbWF4X3NlZ3MgPSBTVGJ1ZmZlci0+dXNlX3NnOworCWlmIChuYnIgPD0gMikKKwkJcmV0dXJuIDA7CisKKwlwcmlvcml0eSA9IEdGUF9LRVJORUwgLyogfCBfX0dGUF9OT1dBUk4gKi87CisJaWYgKG5lZWRfZG1hKQorCQlwcmlvcml0eSB8PSBHRlBfRE1BOworCisJLyogVHJ5IHRvIGFsbG9jYXRlIHRoZSBmaXJzdCBzZWdtZW50IHVwIHRvIE9TX0RBVEFfU0laRSBhbmQgdGhlIG90aGVycworCSAgIGJpZyBlbm91Z2ggdG8gcmVhY2ggdGhlIGdvYWwgKGNvZGUgYXNzdW1lcyBubyBzZWdtZW50cyBpbiBwbGFjZSkgKi8KKwlmb3IgKGJfc2l6ZSA9IE9TX0RBVEFfU0laRSwgb3JkZXIgPSBPU1NUX0ZJUlNUX09SREVSOyBiX3NpemUgPj0gUEFHRV9TSVpFOyBvcmRlci0tLCBiX3NpemUgLz0gMikgeworCQlTVGJ1ZmZlci0+c2dbMF0ucGFnZSA9IGFsbG9jX3BhZ2VzKHByaW9yaXR5LCBvcmRlcik7CisJCVNUYnVmZmVyLT5zZ1swXS5vZmZzZXQgPSAwOworCQlpZiAoU1RidWZmZXItPnNnWzBdLnBhZ2UgIT0gTlVMTCkgeworCQkgICAgU1RidWZmZXItPnNnWzBdLmxlbmd0aCA9IGJfc2l6ZTsKKwkJICAgIFNUYnVmZmVyLT5iX2RhdGEgPSBwYWdlX2FkZHJlc3MoU1RidWZmZXItPnNnWzBdLnBhZ2UpOworCQkgICAgYnJlYWs7CisJCX0KKwl9CisJaWYgKFNUYnVmZmVyLT5zZ1swXS5wYWdlID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJvc3N0IDpJOiBDYW4ndCBhbGxvY2F0ZSB0YXBlIGJ1ZmZlciBtYWluIHNlZ21lbnQuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIEdvdCBpbml0aWFsIHNlZ21lbnQgb2YgJ2JzaXplLG9yZGVyJywgY29udGludWUgd2l0aCBzYW1lIHNpemUgaWYgcG9zc2libGUsIGV4Y2VwdCBmb3IgQVVYICovCisJZm9yIChzZWdzPVNUYnVmZmVyLT5zZ19zZWdzPTEsIGdvdD1iX3NpemU7CisJICAgICBzZWdzIDwgbWF4X3NlZ3MgJiYgZ290IDwgT1NfRlJBTUVfU0laRTsgKSB7CisJCVNUYnVmZmVyLT5zZ1tzZWdzXS5wYWdlID0KKwkJCQlhbGxvY19wYWdlcyhwcmlvcml0eSwgKE9TX0ZSQU1FX1NJWkUgLSBnb3QgPD0gUEFHRV9TSVpFKSA/IDAgOiBvcmRlcik7CisJCVNUYnVmZmVyLT5zZ1tzZWdzXS5vZmZzZXQgPSAwOworCQlpZiAoU1RidWZmZXItPnNnW3NlZ3NdLnBhZ2UgPT0gTlVMTCkgeworCQkJaWYgKE9TX0ZSQU1FX1NJWkUgLSBnb3QgPD0gKG1heF9zZWdzIC0gc2VncykgKiBiX3NpemUgLyAyICYmIG9yZGVyKSB7CisJCQkJYl9zaXplIC89IDI7ICAvKiBMYXJnZSBlbm91Z2ggZm9yIHRoZSByZXN0IG9mIHRoZSBidWZmZXJzICovCisJCQkJb3JkZXItLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9zc3QgOlc6IEZhaWxlZCB0byBlbmxhcmdlIGJ1ZmZlciB0byAlZCBieXRlcy5cbiIsCisJCQkJCQlPU19GUkFNRV9TSVpFKTsKKyNpZiBERUJVRworCQkJU1RidWZmZXItPmJ1ZmZlcl9zaXplID0gZ290OworI2VuZGlmCisJCQlub3JtYWxpemVfYnVmZmVyKFNUYnVmZmVyKTsKKwkJCXJldHVybiAwOworCQl9CisJCVNUYnVmZmVyLT5zZ1tzZWdzXS5sZW5ndGggPSAoT1NfRlJBTUVfU0laRSAtIGdvdCA8PSBQQUdFX1NJWkUgLyAyKSA/IChPU19GUkFNRV9TSVpFIC0gZ290KSA6IGJfc2l6ZTsKKwkJZ290ICs9IFNUYnVmZmVyLT5zZ1tzZWdzXS5sZW5ndGg7CisJCVNUYnVmZmVyLT5idWZmZXJfc2l6ZSA9IGdvdDsKKwkJU1RidWZmZXItPnNnX3NlZ3MgPSArK3NlZ3M7CisJfQorI2lmIERFQlVHCisJaWYgKGRlYnVnZ2luZykgeworCQlwcmludGsoT1NTVF9ERUJfTVNHCisJCQkgICAib3NzdCA6RDogRXhwYW5kZWQgdGFwZSBidWZmZXIgKCVkIGJ5dGVzLCAlZC0+JWQgc2VnbWVudHMsIGRtYTogJWQsIGF0OiAlcCkuXG4iLAorCQkJICAgZ290LCBTVGJ1ZmZlci0+b3JpZ19zZ19zZWdzLCBTVGJ1ZmZlci0+c2dfc2VncywgbmVlZF9kbWEsIFNUYnVmZmVyLT5iX2RhdGEpOworCQlwcmludGsoT1NTVF9ERUJfTVNHCisJCQkgICAib3NzdCA6RDogc2VnbWVudCBzaXplczogZmlyc3QgJWQgYXQgJXAsIGxhc3QgJWQgYnl0ZXMgYXQgJXAuXG4iLAorCQkJICAgU1RidWZmZXItPnNnWzBdLmxlbmd0aCwgcGFnZV9hZGRyZXNzKFNUYnVmZmVyLT5zZ1swXS5wYWdlKSwKKwkJCSAgIFNUYnVmZmVyLT5zZ1tzZWdzLTFdLmxlbmd0aCwgcGFnZV9hZGRyZXNzKFNUYnVmZmVyLT5zZ1tzZWdzLTFdLnBhZ2UpKTsKKwl9CisjZW5kaWYKKworCXJldHVybiAxOworfQorCisKKy8qIFJlbGVhc2UgdGhlIHNlZ21lbnRzICovCitzdGF0aWMgdm9pZCBub3JtYWxpemVfYnVmZmVyKHN0cnVjdCBvc3N0X2J1ZmZlciAqU1RidWZmZXIpCit7CisgIGludCBpLCBvcmRlciwgYl9zaXplOworCisJZm9yIChpPTA7IGkgPCBTVGJ1ZmZlci0+c2dfc2VnczsgaSsrKSB7CisKKwkJZm9yIChiX3NpemUgPSBQQUdFX1NJWkUsIG9yZGVyID0gMDsKKwkJICAgICBiX3NpemUgPCBTVGJ1ZmZlci0+c2dbaV0ubGVuZ3RoOworCQkgICAgIGJfc2l6ZSAqPSAyLCBvcmRlcisrKTsKKworCQlfX2ZyZWVfcGFnZXMoU1RidWZmZXItPnNnW2ldLnBhZ2UsIG9yZGVyKTsKKwkJU1RidWZmZXItPmJ1ZmZlcl9zaXplIC09IFNUYnVmZmVyLT5zZ1tpXS5sZW5ndGg7CisJfQorI2lmIERFQlVHCisJaWYgKGRlYnVnZ2luZyAmJiBTVGJ1ZmZlci0+b3JpZ19zZ19zZWdzIDwgU1RidWZmZXItPnNnX3NlZ3MpCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIm9zc3QgOkQ6IEJ1ZmZlciBhdCAlcCBub3JtYWxpemVkIHRvICVkIGJ5dGVzIChzZWdzICVkKS5cbiIsCisJCQkgICAgIFNUYnVmZmVyLT5iX2RhdGEsIFNUYnVmZmVyLT5idWZmZXJfc2l6ZSwgU1RidWZmZXItPnNnX3NlZ3MpOworI2VuZGlmCisJU1RidWZmZXItPnNnX3NlZ3MgPSBTVGJ1ZmZlci0+b3JpZ19zZ19zZWdzID0gMDsKK30KKworCisvKiBNb3ZlIGRhdGEgZnJvbSB0aGUgdXNlciBidWZmZXIgdG8gdGhlIHRhcGUgYnVmZmVyLiBSZXR1cm5zIHplcm8gKHN1Y2Nlc3MpIG9yCisgICBuZWdhdGl2ZSBlcnJvciBjb2RlLiAqLworc3RhdGljIGludCBhcHBlbmRfdG9fYnVmZmVyKGNvbnN0IGNoYXIgX191c2VyICp1YnAsIHN0cnVjdCBvc3N0X2J1ZmZlciAqc3RfYnAsIGludCBkb19jb3VudCkKK3sKKwlpbnQgaSwgY250LCByZXMsIG9mZnNldDsKKworCWZvciAoaT0wLCBvZmZzZXQ9c3RfYnAtPmJ1ZmZlcl9ieXRlczsKKwkgICAgIGkgPCBzdF9icC0+c2dfc2VncyAmJiBvZmZzZXQgPj0gc3RfYnAtPnNnW2ldLmxlbmd0aDsgaSsrKQorCW9mZnNldCAtPSBzdF9icC0+c2dbaV0ubGVuZ3RoOworCWlmIChpID09IHN0X2JwLT5zZ19zZWdzKSB7ICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9zc3QgOkE6IEFwcGVuZF90b19idWZmZXIgb2Zmc2V0IG92ZXJmbG93LlxuIik7CisJCXJldHVybiAoLUVJTyk7CisJfQorCWZvciAoIDsgaSA8IHN0X2JwLT5zZ19zZWdzICYmIGRvX2NvdW50ID4gMDsgaSsrKSB7CisJCWNudCA9IHN0X2JwLT5zZ1tpXS5sZW5ndGggLSBvZmZzZXQgPCBkb19jb3VudCA/CisJCSAgICAgIHN0X2JwLT5zZ1tpXS5sZW5ndGggLSBvZmZzZXQgOiBkb19jb3VudDsKKwkJcmVzID0gY29weV9mcm9tX3VzZXIocGFnZV9hZGRyZXNzKHN0X2JwLT5zZ1tpXS5wYWdlKSArIG9mZnNldCwgdWJwLCBjbnQpOworCQlpZiAocmVzKQorCQkJcmV0dXJuICgtRUZBVUxUKTsKKwkJZG9fY291bnQgLT0gY250OworCQlzdF9icC0+YnVmZmVyX2J5dGVzICs9IGNudDsKKwkJdWJwICs9IGNudDsKKwkJb2Zmc2V0ID0gMDsKKwl9CisJaWYgKGRvX2NvdW50KSB7ICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9zc3QgOkE6IEFwcGVuZF90b19idWZmZXIgb3ZlcmZsb3cgKGxlZnQgJWQpLlxuIiwKKwkJICAgICAgIGRvX2NvdW50KTsKKwkJcmV0dXJuICgtRUlPKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogTW92ZSBkYXRhIGZyb20gdGhlIHRhcGUgYnVmZmVyIHRvIHRoZSB1c2VyIGJ1ZmZlci4gUmV0dXJucyB6ZXJvIChzdWNjZXNzKSBvcgorICAgbmVnYXRpdmUgZXJyb3IgY29kZS4gKi8KK3N0YXRpYyBpbnQgZnJvbV9idWZmZXIoc3RydWN0IG9zc3RfYnVmZmVyICpzdF9icCwgY2hhciBfX3VzZXIgKnVicCwgaW50IGRvX2NvdW50KQoreworCWludCBpLCBjbnQsIHJlcywgb2Zmc2V0OworCisJZm9yIChpPTAsIG9mZnNldD1zdF9icC0+cmVhZF9wb2ludGVyOworCSAgICAgaSA8IHN0X2JwLT5zZ19zZWdzICYmIG9mZnNldCA+PSBzdF9icC0+c2dbaV0ubGVuZ3RoOyBpKyspCisJCW9mZnNldCAtPSBzdF9icC0+c2dbaV0ubGVuZ3RoOworCWlmIChpID09IHN0X2JwLT5zZ19zZWdzKSB7ICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9zc3QgOkE6IEZyb21fYnVmZmVyIG9mZnNldCBvdmVyZmxvdy5cbiIpOworCQlyZXR1cm4gKC1FSU8pOworCX0KKwlmb3IgKCA7IGkgPCBzdF9icC0+c2dfc2VncyAmJiBkb19jb3VudCA+IDA7IGkrKykgeworCQljbnQgPSBzdF9icC0+c2dbaV0ubGVuZ3RoIC0gb2Zmc2V0IDwgZG9fY291bnQgPworCQkgICAgICBzdF9icC0+c2dbaV0ubGVuZ3RoIC0gb2Zmc2V0IDogZG9fY291bnQ7CisJCXJlcyA9IGNvcHlfdG9fdXNlcih1YnAsIHBhZ2VfYWRkcmVzcyhzdF9icC0+c2dbaV0ucGFnZSkgKyBvZmZzZXQsIGNudCk7CisJCWlmIChyZXMpCisJCQlyZXR1cm4gKC1FRkFVTFQpOworCQlkb19jb3VudCAtPSBjbnQ7CisJCXN0X2JwLT5idWZmZXJfYnl0ZXMgLT0gY250OworCQlzdF9icC0+cmVhZF9wb2ludGVyICs9IGNudDsKKwkJdWJwICs9IGNudDsKKwkJb2Zmc2V0ID0gMDsKKwl9CisJaWYgKGRvX2NvdW50KSB7ICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9zc3QgOkE6IEZyb21fYnVmZmVyIG92ZXJmbG93IChsZWZ0ICVkKS5cbiIsIGRvX2NvdW50KTsKKwkJcmV0dXJuICgtRUlPKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFNldHMgdGhlIHRhaWwgb2YgdGhlIGJ1ZmZlciBhZnRlciBmaWxsIHBvaW50IHRvIHplcm8uCisgICBSZXR1cm5zIHplcm8gKHN1Y2Nlc3MpIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUuICAgICAgICAqLworc3RhdGljIGludCBvc3N0X3plcm9fYnVmZmVyX3RhaWwoc3RydWN0IG9zc3RfYnVmZmVyICpzdF9icCkKK3sKKwlpbnQJaSwgb2Zmc2V0LCBkb19jb3VudCwgY250OworCisJZm9yIChpID0gMCwgb2Zmc2V0ID0gc3RfYnAtPmJ1ZmZlcl9ieXRlczsKKwkgICAgIGkgPCBzdF9icC0+c2dfc2VncyAmJiBvZmZzZXQgPj0gc3RfYnAtPnNnW2ldLmxlbmd0aDsgaSsrKQorCQlvZmZzZXQgLT0gc3RfYnAtPnNnW2ldLmxlbmd0aDsKKwlpZiAoaSA9PSBzdF9icC0+c2dfc2VncykgeyAgLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICJvc3N0IDpBOiBaZXJvX2J1ZmZlciBvZmZzZXQgb3ZlcmZsb3cuXG4iKTsKKwkJcmV0dXJuICgtRUlPKTsKKwl9CisJZm9yIChkb19jb3VudCA9IE9TX0RBVEFfU0laRSAtIHN0X2JwLT5idWZmZXJfYnl0ZXM7CisJICAgICBpIDwgc3RfYnAtPnNnX3NlZ3MgJiYgZG9fY291bnQgPiAwOyBpKyspIHsKKwkJY250ID0gc3RfYnAtPnNnW2ldLmxlbmd0aCAtIG9mZnNldCA8IGRvX2NvdW50ID8KKwkJICAgICAgc3RfYnAtPnNnW2ldLmxlbmd0aCAtIG9mZnNldCA6IGRvX2NvdW50IDsKKwkJbWVtc2V0KHBhZ2VfYWRkcmVzcyhzdF9icC0+c2dbaV0ucGFnZSkgKyBvZmZzZXQsIDAsIGNudCk7CisJCWRvX2NvdW50IC09IGNudDsKKwkJb2Zmc2V0ID0gMDsKKwl9CisJaWYgKGRvX2NvdW50KSB7ICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9zc3QgOkE6IFplcm9fYnVmZmVyIG92ZXJmbG93IChsZWZ0ICVkKS5cbiIsIGRvX2NvdW50KTsKKwkJcmV0dXJuICgtRUlPKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENvcHkgYSBvc3N0IDMySyBjaHVuayBvZiBtZW1vcnkgaW50byB0aGUgYnVmZmVyLgorICAgUmV0dXJucyB6ZXJvIChzdWNjZXNzKSBvciBuZWdhdGl2ZSBlcnJvciBjb2RlLiAgKi8KK3N0YXRpYyBpbnQgb3NzdF9jb3B5X3RvX2J1ZmZlcihzdHJ1Y3Qgb3NzdF9idWZmZXIgKnN0X2JwLCB1bnNpZ25lZCBjaGFyICpwdHIpCit7CisJaW50CWksIGNudCwgZG9fY291bnQgPSBPU19EQVRBX1NJWkU7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3RfYnAtPnNnX3NlZ3MgJiYgZG9fY291bnQgPiAwOyBpKyspIHsKKwkJY250ID0gc3RfYnAtPnNnW2ldLmxlbmd0aCA8IGRvX2NvdW50ID8KKwkJICAgICAgc3RfYnAtPnNnW2ldLmxlbmd0aCA6IGRvX2NvdW50IDsKKwkJbWVtY3B5KHBhZ2VfYWRkcmVzcyhzdF9icC0+c2dbaV0ucGFnZSksIHB0ciwgY250KTsKKwkJZG9fY291bnQgLT0gY250OworCQlwdHIgICAgICArPSBjbnQ7CisJfQorCWlmIChkb19jb3VudCB8fCBpICE9IHN0X2JwLT5zZ19zZWdzLTEpIHsgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib3NzdCA6QTogQ29weV90b19idWZmZXIgb3ZlcmZsb3cgKGxlZnQgJWQgYXQgc2cgJWQpLlxuIiwKKwkJCQkJIGRvX2NvdW50LCBpKTsKKwkJcmV0dXJuICgtRUlPKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENvcHkgYSBvc3N0IDMySyBjaHVuayBvZiBtZW1vcnkgZnJvbSB0aGUgYnVmZmVyLgorICAgUmV0dXJucyB6ZXJvIChzdWNjZXNzKSBvciBuZWdhdGl2ZSBlcnJvciBjb2RlLiAgKi8KK3N0YXRpYyBpbnQgb3NzdF9jb3B5X2Zyb21fYnVmZmVyKHN0cnVjdCBvc3N0X2J1ZmZlciAqc3RfYnAsIHVuc2lnbmVkIGNoYXIgKnB0cikKK3sKKwlpbnQJaSwgY250LCBkb19jb3VudCA9IE9TX0RBVEFfU0laRTsKKworCWZvciAoaSA9IDA7IGkgPCBzdF9icC0+c2dfc2VncyAmJiBkb19jb3VudCA+IDA7IGkrKykgeworCQljbnQgPSBzdF9icC0+c2dbaV0ubGVuZ3RoIDwgZG9fY291bnQgPworCQkgICAgICBzdF9icC0+c2dbaV0ubGVuZ3RoIDogZG9fY291bnQgOworCQltZW1jcHkocHRyLCBwYWdlX2FkZHJlc3Moc3RfYnAtPnNnW2ldLnBhZ2UpLCBjbnQpOworCQlkb19jb3VudCAtPSBjbnQ7CisJCXB0ciAgICAgICs9IGNudDsKKwl9CisJaWYgKGRvX2NvdW50IHx8IGkgIT0gc3RfYnAtPnNnX3NlZ3MtMSkgeyAgLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICJvc3N0IDpBOiBDb3B5X2Zyb21fYnVmZmVyIG92ZXJmbG93IChsZWZ0ICVkIGF0IHNnICVkKS5cbiIsCisJCQkJCSBkb19jb3VudCwgaSk7CisJCXJldHVybiAoLUVJTyk7CisJfQorCXJldHVybiAwOworfQorCisMCisvKiBNb2R1bGUgaG91c2VrZWVwaW5nICovCisKK3N0YXRpYyB2b2lkIHZhbGlkYXRlX29wdGlvbnMgKHZvaWQpCit7CisgIGlmIChtYXhfZGV2ID4gMCkKKwkJb3NzdF9tYXhfZGV2ID0gbWF4X2RldjsgIAorICBpZiAod3JpdGVfdGhyZXNob2xkX2ticyA+IDApCisJCW9zc3Rfd3JpdGVfdGhyZXNob2xkID0gd3JpdGVfdGhyZXNob2xkX2ticyAqIFNUX0tJTE9CWVRFOworICBpZiAob3NzdF93cml0ZV90aHJlc2hvbGQgPiBvc3N0X2J1ZmZlcl9zaXplKQorCQlvc3N0X3dyaXRlX3RocmVzaG9sZCA9IG9zc3RfYnVmZmVyX3NpemU7CisgIGlmIChtYXhfc2dfc2VncyA+PSBPU1NUX0ZJUlNUX1NHKQorCQlvc3N0X21heF9zZ19zZWdzID0gbWF4X3NnX3NlZ3M7CisjaWYgREVCVUcKKyAgcHJpbnRrKE9TU1RfREVCX01TRyAib3NzdCA6RDogbWF4IHRhcGVzICVkLCB3cml0ZSB0aHJlc2hvbGQgJWQsIG1heCBzL2cgc2VncyAlZC5cbiIsCisJCQkgICBvc3N0X21heF9kZXYsIG9zc3Rfd3JpdGVfdGhyZXNob2xkLCBvc3N0X21heF9zZ19zZWdzKTsKKyNlbmRpZgorfQorCQorI2lmbmRlZiBNT0RVTEUKKy8qIFNldCB0aGUgYm9vdCBvcHRpb25zLiBTeW50YXg6IG9zc3Q9eHh4LHl5eSwuLi4KKyAgIHdoZXJlIHh4eCBpcyB3cml0ZSB0aHJlc2hvbGQgaW4gMTAyNCBieXRlIGJsb2NrcywKKyAgIGFuZCAgIHl5eSBpcyBudW1iZXIgb2Ygcy9nIHNlZ21lbnRzIHRvIHVzZS4gKi8KK3N0YXRpYyBpbnQgX19pbml0IG9zc3Rfc2V0dXAgKGNoYXIgKnN0cikKK3sKKyAgaW50IGksIGludHNbNV07CisgIGNoYXIgKnN0cDsKKworICBzdHAgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCQorICBpZiAoaW50c1swXSA+IDApIHsKKwlmb3IgKGkgPSAwOyBpIDwgaW50c1swXSAmJiBpIDwgQVJSQVlfU0laRShwYXJtcyk7IGkrKykKKwkJICAqcGFybXNbaV0udmFsID0gaW50c1tpICsgMV07CisgIH0gZWxzZSB7CisJd2hpbGUgKHN0cCAhPSBOVUxMKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBhcm1zKTsgaSsrKSB7CisJCQlpbnQgbGVuID0gc3RybGVuKHBhcm1zW2ldLm5hbWUpOworCQkJaWYgKCFzdHJuY21wKHN0cCwgcGFybXNbaV0ubmFtZSwgbGVuKSAmJgorCQkJICAgICgqKHN0cCArIGxlbikgPT0gJzonIHx8ICooc3RwICsgbGVuKSA9PSAnPScpKSB7CisJCQkJKnBhcm1zW2ldLnZhbCA9CisJCQkJCXNpbXBsZV9zdHJ0b3VsKHN0cCArIGxlbiArIDEsIE5VTEwsIDApOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChpID49IHNpemVvZihwYXJtcykgLyBzaXplb2Yoc3RydWN0IG9zc3RfZGV2X3Bhcm0pKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAib3NzdCA6STogSWxsZWdhbCBwYXJhbWV0ZXIgaW4gJyVzJ1xuIiwKKwkJCSAgICAgICBzdHApOworCQlzdHAgPSBzdHJjaHIoc3RwLCAnLCcpOworCQlpZiAoc3RwKQorCQkJc3RwKys7CisJfQorICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoIm9zc3Q9Iiwgb3NzdF9zZXR1cCk7CisKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvc3N0X2ZvcHMgPSB7CisJLm93bmVyID0gICAgICAgIFRISVNfTU9EVUxFLAorCS5yZWFkID0gICAgICAgICBvc3N0X3JlYWQsCisJLndyaXRlID0gICAgICAgIG9zc3Rfd3JpdGUsCisJLmlvY3RsID0gICAgICAgIG9zc3RfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwgPSBvc3N0X2NvbXBhdF9pb2N0bCwKKyNlbmRpZgorCS5vcGVuID0gICAgICAgICBvc19zY3NpX3RhcGVfb3BlbiwKKwkuZmx1c2ggPSAgICAgICAgb3Nfc2NzaV90YXBlX2ZsdXNoLAorCS5yZWxlYXNlID0gICAgICBvc19zY3NpX3RhcGVfY2xvc2UsCit9OworCitzdGF0aWMgaW50IG9zc3Rfc3VwcG9ydHMoc3RydWN0IHNjc2lfZGV2aWNlICogU0RwKQoreworCXN0cnVjdAlvc3N0X3N1cHBvcnRfZGF0YSB7CisJCWNoYXIgKnZlbmRvcjsKKwkJY2hhciAqbW9kZWw7CisJCWNoYXIgKnJldjsKKwkJY2hhciAqZHJpdmVyX2hpbnQ7IC8qIE5hbWUgb2YgdGhlIGNvcnJlY3QgZHJpdmVyLCBOVUxMIGlmIHVua25vd24gKi8KKwl9OworCitzdGF0aWMJc3RydWN0CW9zc3Rfc3VwcG9ydF9kYXRhIHN1cHBvcnRfbGlzdFtdID0geworCQkvKiB7IlhYWCIsICJZeS0iLCAiIiwgTlVMTH0sICBleGFtcGxlICovCisJCVNJR1NfRlJPTV9PU1NULAorCQl7TlVMTCwgfX07CisKKwlzdHJ1Y3QJb3NzdF9zdXBwb3J0X2RhdGEgKnJwOworCisJLyogV2UgYXJlIHdpbGxpbmcgdG8gZHJpdmUgT25TdHJlYW0gU0MteDAgYXMgd2VsbCBhcyB0aGUKKwkgKiAJICogSURFLCBQYXJQb3J0LCBGaXJlV2lyZSwgVVNCIHZhcmlhbnRzLCBpZiBhY2Nlc3NpYmxlIGJ5CisJICogCSAJICogZW11bGF0aW9uIGxheWVyIChpZGUtc2NzaSwgdXNiLXN0b3JhZ2UsIC4uLikgKi8KKworCWZvciAocnA9JihzdXBwb3J0X2xpc3RbMF0pOyBycC0+dmVuZG9yICE9IE5VTEw7IHJwKyspCisJCWlmICghc3RybmNtcChycC0+dmVuZG9yLCBTRHAtPnZlbmRvciwgc3RybGVuKHJwLT52ZW5kb3IpKSAmJgorCQkgICAgIXN0cm5jbXAocnAtPm1vZGVsLCBTRHAtPm1vZGVsLCBzdHJsZW4ocnAtPm1vZGVsKSkgJiYKKwkJICAgICFzdHJuY21wKHJwLT5yZXYsIFNEcC0+cmV2LCBzdHJsZW4ocnAtPnJldikpKSAKKwkJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKgorICogc3lzZnMgc3VwcG9ydCBmb3Igb3NzdCBkcml2ZXIgcGFyYW1ldGVyIGluZm9ybWF0aW9uCisgKi8KKworc3RhdGljIHNzaXplX3Qgb3NzdF92ZXJzaW9uX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkZCwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBvc3N0X3ZlcnNpb24pOworfQorCitzdGF0aWMgRFJJVkVSX0FUVFIodmVyc2lvbiwgU19JUlVHTywgb3NzdF92ZXJzaW9uX3Nob3csIE5VTEwpOworCitzdGF0aWMgdm9pZCBvc3N0X2NyZWF0ZV9kcml2ZXJmc19maWxlcyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyZnMpCit7CisJZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7Cit9CisKK3N0YXRpYyB2b2lkIG9zc3RfcmVtb3ZlX2RyaXZlcmZzX2ZpbGVzKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXJmcykKK3sKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl92ZXJzaW9uKTsKK30KKworLyoKKyAqIHN5c2ZzIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyBBRFIgaGVhZGVyIGluZm9ybWF0aW9uCisgKi8KKworc3RhdGljIHNzaXplX3Qgb3NzdF9hZHJfcmV2X3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IG9zc3RfdGFwZSAqIFNUcCA9IChzdHJ1Y3Qgb3NzdF90YXBlICopIGNsYXNzX2dldF9kZXZkYXRhIChjbGFzc19kZXYpOworCXNzaXplX3QgbCA9IDA7CisKKwlpZiAoU1RwICYmIFNUcC0+aGVhZGVyX29rICYmIFNUcC0+bGludXhfbWVkaWEpCisJCWwgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkLiVkXG4iLCBTVHAtPmhlYWRlcl9jYWNoZS0+bWFqb3JfcmV2LCBTVHAtPmhlYWRlcl9jYWNoZS0+bWlub3JfcmV2KTsKKwlyZXR1cm4gbDsKK30KKworQ0xBU1NfREVWSUNFX0FUVFIoQURSX3JldiwgU19JUlVHTywgb3NzdF9hZHJfcmV2X3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBvc3N0X2xpbnV4X21lZGlhX3ZlcnNpb25fc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb3NzdF90YXBlICogU1RwID0gKHN0cnVjdCBvc3N0X3RhcGUgKikgY2xhc3NfZ2V0X2RldmRhdGEgKGNsYXNzX2Rldik7CisJc3NpemVfdCBsID0gMDsKKworCWlmIChTVHAgJiYgU1RwLT5oZWFkZXJfb2sgJiYgU1RwLT5saW51eF9tZWRpYSkKKwkJbCA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiTElOJWRcbiIsIFNUcC0+bGludXhfbWVkaWFfdmVyc2lvbik7CisJcmV0dXJuIGw7Cit9CisKK0NMQVNTX0RFVklDRV9BVFRSKG1lZGlhX3ZlcnNpb24sIFNfSVJVR08sIG9zc3RfbGludXhfbWVkaWFfdmVyc2lvbl9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgb3NzdF9jYXBhY2l0eV9zaG93KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBvc3N0X3RhcGUgKiBTVHAgPSAoc3RydWN0IG9zc3RfdGFwZSAqKSBjbGFzc19nZXRfZGV2ZGF0YSAoY2xhc3NfZGV2KTsKKwlzc2l6ZV90IGwgPSAwOworCisJaWYgKFNUcCAmJiBTVHAtPmhlYWRlcl9vayAmJiBTVHAtPmxpbnV4X21lZGlhKQorCQlsID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgU1RwLT5jYXBhY2l0eSk7CisJcmV0dXJuIGw7Cit9CisKK0NMQVNTX0RFVklDRV9BVFRSKGNhcGFjaXR5LCBTX0lSVUdPLCBvc3N0X2NhcGFjaXR5X3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBvc3N0X2ZpcnN0X2RhdGFfcHBvc19zaG93KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBvc3N0X3RhcGUgKiBTVHAgPSAoc3RydWN0IG9zc3RfdGFwZSAqKSBjbGFzc19nZXRfZGV2ZGF0YSAoY2xhc3NfZGV2KTsKKwlzc2l6ZV90IGwgPSAwOworCisJaWYgKFNUcCAmJiBTVHAtPmhlYWRlcl9vayAmJiBTVHAtPmxpbnV4X21lZGlhKQorCQlsID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgU1RwLT5maXJzdF9kYXRhX3Bwb3MpOworCXJldHVybiBsOworfQorCitDTEFTU19ERVZJQ0VfQVRUUihCT1RfZnJhbWUsIFNfSVJVR08sIG9zc3RfZmlyc3RfZGF0YV9wcG9zX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBvc3N0X2VvZF9mcmFtZV9wcG9zX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IG9zc3RfdGFwZSAqIFNUcCA9IChzdHJ1Y3Qgb3NzdF90YXBlICopIGNsYXNzX2dldF9kZXZkYXRhIChjbGFzc19kZXYpOworCXNzaXplX3QgbCA9IDA7CisKKwlpZiAoU1RwICYmIFNUcC0+aGVhZGVyX29rICYmIFNUcC0+bGludXhfbWVkaWEpCisJCWwgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBTVHAtPmVvZF9mcmFtZV9wcG9zKTsKKwlyZXR1cm4gbDsKK30KKworQ0xBU1NfREVWSUNFX0FUVFIoRU9EX2ZyYW1lLCBTX0lSVUdPLCBvc3N0X2VvZF9mcmFtZV9wcG9zX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBvc3N0X2ZpbGVtYXJrX2NudF9zaG93KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBvc3N0X3RhcGUgKiBTVHAgPSAoc3RydWN0IG9zc3RfdGFwZSAqKSBjbGFzc19nZXRfZGV2ZGF0YSAoY2xhc3NfZGV2KTsKKwlzc2l6ZV90IGwgPSAwOworCisJaWYgKFNUcCAmJiBTVHAtPmhlYWRlcl9vayAmJiBTVHAtPmxpbnV4X21lZGlhKQorCQlsID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgU1RwLT5maWxlbWFya19jbnQpOworCXJldHVybiBsOworfQorCitDTEFTU19ERVZJQ0VfQVRUUihmaWxlX2NvdW50LCBTX0lSVUdPLCBvc3N0X2ZpbGVtYXJrX2NudF9zaG93LCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKiBvc3N0X3N5c2ZzX2NsYXNzOworCitzdGF0aWMgaW50IG9zc3Rfc3lzZnNfdmFsaWQgPSAwOworCitzdGF0aWMgdm9pZCBvc3N0X3N5c2ZzX2luaXQodm9pZCkKK3sKKwlvc3N0X3N5c2ZzX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgIm9uc3RyZWFtX3RhcGUiKTsKKwlpZiAoIElTX0VSUihvc3N0X3N5c2ZzX2NsYXNzKSApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9zc3QgOlc6IFVuYWJsZSB0byByZWdpc3RlciBzeXNmcyBjbGFzc1xuIik7CisJZWxzZQorCQlvc3N0X3N5c2ZzX3ZhbGlkID0gMTsKK30KKworc3RhdGljIHZvaWQgb3NzdF9zeXNmc19hZGQoZGV2X3QgZGV2LCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIGNoYXIgKiBuYW1lKQoreworCXN0cnVjdCBjbGFzc19kZXZpY2UgKm9zc3RfY2xhc3NfbWVtYmVyOworCisJaWYgKCFvc3N0X3N5c2ZzX3ZhbGlkKSByZXR1cm47CisKKwlvc3N0X2NsYXNzX21lbWJlciA9IGNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKG9zc3Rfc3lzZnNfY2xhc3MsIGRldiwgZGV2aWNlLCAiJXMiLCBuYW1lKTsKKwlpZiAoSVNfRVJSKG9zc3RfY2xhc3NfbWVtYmVyKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJvc3N0IDpXOiBVbmFibGUgdG8gYWRkIHN5c2ZzIGNsYXNzIG1lbWJlciAlc1xuIiwgbmFtZSk7CisJCXJldHVybjsKKwl9CisJY2xhc3Nfc2V0X2RldmRhdGEob3NzdF9jbGFzc19tZW1iZXIsIFNUcCk7CisJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKG9zc3RfY2xhc3NfbWVtYmVyLCAmY2xhc3NfZGV2aWNlX2F0dHJfQURSX3Jldik7CisJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKG9zc3RfY2xhc3NfbWVtYmVyLCAmY2xhc3NfZGV2aWNlX2F0dHJfbWVkaWFfdmVyc2lvbik7CisJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKG9zc3RfY2xhc3NfbWVtYmVyLCAmY2xhc3NfZGV2aWNlX2F0dHJfY2FwYWNpdHkpOworCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShvc3N0X2NsYXNzX21lbWJlciwgJmNsYXNzX2RldmljZV9hdHRyX0JPVF9mcmFtZSk7CisJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKG9zc3RfY2xhc3NfbWVtYmVyLCAmY2xhc3NfZGV2aWNlX2F0dHJfRU9EX2ZyYW1lKTsKKwljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUob3NzdF9jbGFzc19tZW1iZXIsICZjbGFzc19kZXZpY2VfYXR0cl9maWxlX2NvdW50KTsKK30KKworc3RhdGljIHZvaWQgb3NzdF9zeXNmc19kZXN0cm95KGRldl90IGRldikKK3sKKwlpZiAoIW9zc3Rfc3lzZnNfdmFsaWQpIHJldHVybjsgCisKKwljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShkZXYpOworfQorCitzdGF0aWMgdm9pZCBvc3N0X3N5c2ZzX2NsZWFudXAodm9pZCkKK3sKKwlpZiAob3NzdF9zeXNmc192YWxpZCkgeworCQljbGFzc19zaW1wbGVfZGVzdHJveShvc3N0X3N5c2ZzX2NsYXNzKTsKKwkJb3NzdF9zeXNmc192YWxpZCA9IDA7CisJfQorfQorCisvKgorICogb3NzdCBzdGFydHVwIC8gY2xlYW51cCBjb2RlCisgKi8KKworc3RhdGljIGludCBvc3N0X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiBTRHAgPSB0b19zY3NpX2RldmljZShkZXYpOworCXN0cnVjdCBvc3N0X3RhcGUgICAqIHRwbnQ7CisJc3RydWN0IHN0X21vZGVkZWYgICogU1RtOworCXN0cnVjdCBzdF9wYXJ0c3RhdCAqIFNUcHM7CisJc3RydWN0IG9zc3RfYnVmZmVyICogYnVmZmVyOworCXN0cnVjdCBnZW5kaXNrCSAgICogZHJpdmU7CisJaW50CQkgICAgIGksIG1vZGUsIGRldl9udW07CisKKwlpZiAoU0RwLT50eXBlICE9IFRZUEVfVEFQRSB8fCAhb3NzdF9zdXBwb3J0cyhTRHApKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRyaXZlID0gYWxsb2NfZGlzaygxKTsKKwlpZiAoIWRyaXZlKSB7CisJCXByaW50ayhLRVJOX0VSUiAib3NzdCA6RTogT3V0IG9mIG1lbW9yeS4gRGV2aWNlIG5vdCBhdHRhY2hlZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBpZiB0aGlzIGlzIHRoZSBmaXJzdCBhdHRhY2gsIGJ1aWxkIHRoZSBpbmZyYXN0cnVjdHVyZSAqLworCXdyaXRlX2xvY2soJm9zX3Njc2lfdGFwZXNfbG9jayk7CisJaWYgKG9zX3Njc2lfdGFwZXMgPT0gTlVMTCkgeworCQlvc19zY3NpX3RhcGVzID0KKwkJCShzdHJ1Y3Qgb3NzdF90YXBlICoqKWttYWxsb2Mob3NzdF9tYXhfZGV2ICogc2l6ZW9mKHN0cnVjdCBvc3N0X3RhcGUgKiksCisJCQkJICAgR0ZQX0FUT01JQyk7CisJCWlmIChvc19zY3NpX3RhcGVzID09IE5VTEwpIHsKKwkJCXdyaXRlX3VubG9jaygmb3Nfc2NzaV90YXBlc19sb2NrKTsKKwkJCXByaW50ayhLRVJOX0VSUiAib3NzdCA6RTogVW5hYmxlIHRvIGFsbG9jYXRlIGFycmF5IGZvciBPblN0cmVhbSBTQ1NJIHRhcGVzLlxuIik7CisJCQlnb3RvIG91dF9wdXRfZGlzazsKKwkJfQorCQlmb3IgKGk9MDsgaSA8IG9zc3RfbWF4X2RldjsgKytpKSBvc19zY3NpX3RhcGVzW2ldID0gTlVMTDsKKwl9CisJCisJaWYgKG9zc3RfbnJfZGV2ID49IG9zc3RfbWF4X2RldikgeworCQl3cml0ZV91bmxvY2soJm9zX3Njc2lfdGFwZXNfbG9jayk7CisJCXByaW50ayhLRVJOX0VSUiAib3NzdCA6RTogVG9vIG1hbnkgdGFwZSBkZXZpY2VzIChtYXguICVkKS5cbiIsIG9zc3RfbWF4X2Rldik7CisJCWdvdG8gb3V0X3B1dF9kaXNrOworCX0KKworCS8qIGZpbmQgYSBmcmVlIG1pbm9yIG51bWJlciAqLworCWZvciAoaT0wOyBvc19zY3NpX3RhcGVzW2ldICYmIGk8b3NzdF9tYXhfZGV2OyBpKyspOworCWlmKGkgPj0gb3NzdF9tYXhfZGV2KSBwYW5pYyAoIlNjc2lfZGV2aWNlcyBjb3JydXB0IChvc3N0KSIpOworCWRldl9udW0gPSBpOworCisJLyogYWxsb2NhdGUgYSBzdHJ1Y3Qgb3NzdF90YXBlIGZvciB0aGlzIGRldmljZSAqLworCXRwbnQgPSAoc3RydWN0IG9zc3RfdGFwZSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvc3N0X3RhcGUpLCBHRlBfQVRPTUlDKTsKKwlpZiAodHBudCA9PSBOVUxMKSB7CisJCXdyaXRlX3VubG9jaygmb3Nfc2NzaV90YXBlc19sb2NrKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJvc3N0IDpFOiBDYW4ndCBhbGxvY2F0ZSBkZXZpY2UgZGVzY3JpcHRvciwgZGV2aWNlIG5vdCBhdHRhY2hlZC5cbiIpOworCQlnb3RvIG91dF9wdXRfZGlzazsKKwl9CisJbWVtc2V0KHRwbnQsIDAsIHNpemVvZihzdHJ1Y3Qgb3NzdF90YXBlKSk7CisKKwkvKiBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhpcyBkZXZpY2UgKi8KKwlpID0gU0RwLT5ob3N0LT5zZ190YWJsZXNpemU7CisJaWYgKG9zc3RfbWF4X3NnX3NlZ3MgPCBpKQorCQlpID0gb3NzdF9tYXhfc2dfc2VnczsKKwlidWZmZXIgPSBuZXdfdGFwZV9idWZmZXIoMSwgU0RwLT5ob3N0LT51bmNoZWNrZWRfaXNhX2RtYSwgaSk7CisJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisJCXdyaXRlX3VubG9jaygmb3Nfc2NzaV90YXBlc19sb2NrKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJvc3N0IDpFOiBVbmFibGUgdG8gYWxsb2NhdGUgYSB0YXBlIGJ1ZmZlciwgZGV2aWNlIG5vdCBhdHRhY2hlZC5cbiIpOworCQlrZnJlZSh0cG50KTsKKwkJZ290byBvdXRfcHV0X2Rpc2s7CisJfQorCW9zX3Njc2lfdGFwZXNbZGV2X251bV0gPSB0cG50OworCXRwbnQtPmJ1ZmZlciA9IGJ1ZmZlcjsKKwl0cG50LT5kZXZpY2UgPSBTRHA7CisJZHJpdmUtPnByaXZhdGVfZGF0YSA9ICZ0cG50LT5kcml2ZXI7CisJc3ByaW50Zihkcml2ZS0+ZGlza19uYW1lLCAib3NzdCVkIiwgZGV2X251bSk7CisJdHBudC0+ZHJpdmVyID0gJm9zc3RfdGVtcGxhdGU7CisJdHBudC0+ZHJpdmUgPSBkcml2ZTsKKwl0cG50LT5pbl91c2UgPSAwOworCXRwbnQtPmNhcGFjaXR5ID0gMHhmZmZmZjsKKwl0cG50LT5kaXJ0eSA9IDA7CisJdHBudC0+ZHJ2X2J1ZmZlciA9IDE7ICAvKiBUcnkgYnVmZmVyaW5nIGlmIG5vIG1vZGUgc2Vuc2UgKi8KKwl0cG50LT5yZXN0cl9kbWEgPSAoU0RwLT5ob3N0KS0+dW5jaGVja2VkX2lzYV9kbWE7CisJdHBudC0+ZGVuc2l0eSA9IDA7CisJdHBudC0+ZG9fYXV0b19sb2NrID0gT1NTVF9BVVRPX0xPQ0s7CisJdHBudC0+Y2FuX2JzciA9IE9TU1RfSU5fRklMRV9QT1M7CisJdHBudC0+Y2FuX3BhcnRpdGlvbnMgPSAwOworCXRwbnQtPnR3b19mbSA9IE9TU1RfVFdPX0ZNOworCXRwbnQtPmZhc3RfbXRlb20gPSBPU1NUX0ZBU1RfTVRFT007CisJdHBudC0+c2NzaTJfbG9naWNhbCA9IE9TU1RfU0NTSTJMT0dJQ0FMOyAvKiBGSVhNRSAqLworCXRwbnQtPndyaXRlX3RocmVzaG9sZCA9IG9zc3Rfd3JpdGVfdGhyZXNob2xkOworCXRwbnQtPmRlZmF1bHRfZHJ2YnVmZmVyID0gMHhmZjsgLyogTm8gZm9yY2VkIGJ1ZmZlcmluZyAqLworCXRwbnQtPnBhcnRpdGlvbiA9IDA7CisJdHBudC0+bmV3X3BhcnRpdGlvbiA9IDA7CisJdHBudC0+bmJyX3BhcnRpdGlvbnMgPSAwOworCXRwbnQtPm1pbl9ibG9jayA9IDUxMjsKKwl0cG50LT5tYXhfYmxvY2sgPSBPU19EQVRBX1NJWkU7CisJdHBudC0+dGltZW91dCA9IE9TU1RfVElNRU9VVDsKKwl0cG50LT5sb25nX3RpbWVvdXQgPSBPU1NUX0xPTkdfVElNRU9VVDsKKworCS8qIFJlY29nbml6ZSBPblN0cmVhbSB0YXBlcyAqLworCS8qIFdlIGRvbid0IG5lZWQgdG8gdGVzdCBmb3IgT25TdHJlYW0sIGFzIHRoaXMgaGFzIGJlZW4gZG9uZSBpbiBkZXRlY3QgKCkgKi8KKwl0cG50LT5vc19md19yZXYgPSBvc3N0X3BhcnNlX2Zpcm13YXJlX3JldiAoU0RwLT5yZXYpOworCXRwbnQtPm9taXRfYmxrbGltcyA9IDE7CisKKwl0cG50LT5wb2xsID0gKHN0cm5jbXAoU0RwLT5tb2RlbCwgIkRJLSIsIDMpID09IDApIHx8IAorCQkgICAgIChzdHJuY21wKFNEcC0+bW9kZWwsICJGVy0iLCAzKSA9PSAwKSB8fCBPU1NUX0ZXX05FRURfUE9MTCh0cG50LT5vc19md19yZXYsU0RwKTsKKwl0cG50LT5mcmFtZV9pbl9idWZmZXIgPSAwOworCXRwbnQtPmhlYWRlcl9vayA9IDA7CisJdHBudC0+bGludXhfbWVkaWEgPSAwOworCXRwbnQtPmhlYWRlcl9jYWNoZSA9IE5VTEw7CisKKwlmb3IgKGk9MDsgaSA8IFNUX05CUl9NT0RFUzsgaSsrKSB7CisJCVNUbSA9ICYodHBudC0+bW9kZXNbaV0pOworCQlTVG0tPmRlZmluZWQgPSAwOworCQlTVG0tPnN5c3YgPSBPU1NUX1NZU1Y7CisJCVNUbS0+ZGVmYXVsdHNfZm9yX3dyaXRlcyA9IDA7CisJCVNUbS0+ZG9fYXN5bmNfd3JpdGVzID0gT1NTVF9BU1lOQ19XUklURVM7CisJCVNUbS0+ZG9fYnVmZmVyX3dyaXRlcyA9IE9TU1RfQlVGRkVSX1dSSVRFUzsKKwkJU1RtLT5kb19yZWFkX2FoZWFkID0gT1NTVF9SRUFEX0FIRUFEOworCQlTVG0tPmRlZmF1bHRfY29tcHJlc3Npb24gPSBTVF9ET05UX1RPVUNIOworCQlTVG0tPmRlZmF1bHRfYmxrc2l6ZSA9IDUxMjsKKwkJU1RtLT5kZWZhdWx0X2RlbnNpdHkgPSAoLTEpOyAgLyogTm8gZm9yY2VkIGRlbnNpdHkgKi8KKwl9CisKKwlmb3IgKGk9MDsgaSA8IFNUX05CUl9QQVJUSVRJT05TOyBpKyspIHsKKwkJU1RwcyA9ICYodHBudC0+cHNbaV0pOworCQlTVHBzLT5ydyA9IFNUX0lETEU7CisJCVNUcHMtPmVvZiA9IFNUX05PRU9GOworCQlTVHBzLT5hdF9zbSA9IDA7CisJCVNUcHMtPmxhc3RfYmxvY2tfdmFsaWQgPSAwOworCQlTVHBzLT5kcnZfYmxvY2sgPSAoLTEpOworCQlTVHBzLT5kcnZfZmlsZSA9ICgtMSk7CisJfQorCisJdHBudC0+Y3VycmVudF9tb2RlID0gMDsKKwl0cG50LT5tb2Rlc1swXS5kZWZpbmVkID0gMTsKKwl0cG50LT5tb2Rlc1syXS5kZWZpbmVkID0gMTsKKwl0cG50LT5kZW5zaXR5X2NoYW5nZWQgPSB0cG50LT5jb21wcmVzc2lvbl9jaGFuZ2VkID0gdHBudC0+Ymxrc2l6ZV9jaGFuZ2VkID0gMDsKKworCWluaXRfTVVURVgoJnRwbnQtPmxvY2spOworCW9zc3RfbnJfZGV2Kys7CisJd3JpdGVfdW5sb2NrKCZvc19zY3NpX3RhcGVzX2xvY2spOworCXsKKwkJY2hhciBuYW1lWzhdOworCQkvKiAgUmV3aW5kIGVudHJ5ICAqLworCQlvc3N0X3N5c2ZzX2FkZChNS0RFVihPU1NUX01BSk9SLCBkZXZfbnVtKSwgZGV2LCB0cG50LCB0YXBlX25hbWUodHBudCkpOworCQkvKiAgTm8tcmV3aW5kIGVudHJ5ICAqLworCQlzbnByaW50ZihuYW1lLCA4LCAiJXMlcyIsICJuIiwgdGFwZV9uYW1lKHRwbnQpKTsKKwkJb3NzdF9zeXNmc19hZGQoTUtERVYoT1NTVF9NQUpPUiwgZGV2X251bSArIDEyOCksIGRldiwgdHBudCwgbmFtZSk7CisJfQorCWZvciAobW9kZSA9IDA7IG1vZGUgPCBTVF9OQlJfTU9ERVM7ICsrbW9kZSkgeworCQkvKiAgUmV3aW5kIGVudHJ5ICAqLworCQlkZXZmc19ta19jZGV2KE1LREVWKE9TU1RfTUFKT1IsIGRldl9udW0gKyAobW9kZSA8PCA1KSksCisJCQkJU19JRkNIUiB8IFNfSVJVR08gfCBTX0lXVUdPLAorCQkJCSIlcy9vdCVzIiwgU0RwLT5kZXZmc19uYW1lLCBvc3N0X2Zvcm1hdHNbbW9kZV0pOworCisJCS8qICBOby1yZXdpbmQgZW50cnkgICovCisJCWRldmZzX21rX2NkZXYoTUtERVYoT1NTVF9NQUpPUiwgZGV2X251bSArIChtb2RlIDw8IDUpICsgMTI4KSwKKwkJCQlTX0lGQ0hSIHwgU19JUlVHTyB8IFNfSVdVR08sCisJCQkJIiVzL290JXNuIiwgU0RwLT5kZXZmc19uYW1lLCBvc3N0X2Zvcm1hdHNbbW9kZV0pOworCX0KKwlkcml2ZS0+bnVtYmVyID0gZGV2ZnNfcmVnaXN0ZXJfdGFwZShTRHAtPmRldmZzX25hbWUpOworCisJcHJpbnRrKEtFUk5fSU5GTworCQkib3NzdCA6STogQXR0YWNoZWQgT25TdHJlYW0gJS41cyB0YXBlIGF0IHNjc2klZCwgY2hhbm5lbCAlZCwgaWQgJWQsIGx1biAlZCBhcyAlc1xuIiwKKwkJU0RwLT5tb2RlbCwgU0RwLT5ob3N0LT5ob3N0X25vLCBTRHAtPmNoYW5uZWwsIFNEcC0+aWQsIFNEcC0+bHVuLCB0YXBlX25hbWUodHBudCkpOworCisJcmV0dXJuIDA7CisKK291dF9wdXRfZGlzazoKKyAgICAgICAgcHV0X2Rpc2soZHJpdmUpOworICAgICAgICByZXR1cm4gLUVOT0RFVjsKK307CisKK3N0YXRpYyBpbnQgb3NzdF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqIFNEcCA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJc3RydWN0IG9zc3RfdGFwZSAqIHRwbnQ7CisJaW50IGksIG1vZGU7CisKKwlpZiAoKFNEcC0+dHlwZSAhPSBUWVBFX1RBUEUpIHx8IChvc3N0X25yX2RldiA8PSAwKSkKKwkJcmV0dXJuIDA7CisKKwl3cml0ZV9sb2NrKCZvc19zY3NpX3RhcGVzX2xvY2spOworCWZvcihpPTA7IGkgPCBvc3N0X21heF9kZXY7IGkrKykgeworCQlpZigodHBudCA9IG9zX3Njc2lfdGFwZXNbaV0pICYmICh0cG50LT5kZXZpY2UgPT0gU0RwKSkgeworCQkJb3NzdF9zeXNmc19kZXN0cm95KE1LREVWKE9TU1RfTUFKT1IsIGkpKTsKKwkJCW9zc3Rfc3lzZnNfZGVzdHJveShNS0RFVihPU1NUX01BSk9SLCBpKzEyOCkpOworCQkJdHBudC0+ZGV2aWNlID0gTlVMTDsKKwkJCWZvciAobW9kZSA9IDA7IG1vZGUgPCBTVF9OQlJfTU9ERVM7ICsrbW9kZSkgeworCQkJCWRldmZzX3JlbW92ZSgiJXMvb3QlcyIsIFNEcC0+ZGV2ZnNfbmFtZSwgb3NzdF9mb3JtYXRzW21vZGVdKTsKKwkJCQlkZXZmc19yZW1vdmUoIiVzL290JXNuIiwgU0RwLT5kZXZmc19uYW1lLCBvc3N0X2Zvcm1hdHNbbW9kZV0pOworCQkJfQorCQkJZGV2ZnNfdW5yZWdpc3Rlcl90YXBlKHRwbnQtPmRyaXZlLT5udW1iZXIpOworCQkJcHV0X2Rpc2sodHBudC0+ZHJpdmUpOworCQkJb3Nfc2NzaV90YXBlc1tpXSA9IE5VTEw7CisJCQlvc3N0X25yX2Rldi0tOworCQkJd3JpdGVfdW5sb2NrKCZvc19zY3NpX3RhcGVzX2xvY2spOworCQkJaWYgKHRwbnQtPmhlYWRlcl9jYWNoZSAhPSBOVUxMKSB2ZnJlZSh0cG50LT5oZWFkZXJfY2FjaGUpOworCQkJaWYgKHRwbnQtPmJ1ZmZlcikgeworCQkJCW5vcm1hbGl6ZV9idWZmZXIodHBudC0+YnVmZmVyKTsKKwkJCQlrZnJlZSh0cG50LT5idWZmZXIpOworCQkJfQorCQkJa2ZyZWUodHBudCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwl3cml0ZV91bmxvY2soJm9zX3Njc2lfdGFwZXNfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfb3NzdCh2b2lkKSAKK3sKKwlwcmludGsoS0VSTl9JTkZPICJvc3N0IDpJOiBUYXBlIGRyaXZlciB3aXRoIE9uU3RyZWFtIHN1cHBvcnQgdmVyc2lvbiAlc1xub3NzdCA6STogJXNcbiIsIG9zc3RfdmVyc2lvbiwgY3ZzaWQpOworCisJdmFsaWRhdGVfb3B0aW9ucygpOworCW9zc3Rfc3lzZnNfaW5pdCgpOworCisJaWYgKChyZWdpc3Rlcl9jaHJkZXYoT1NTVF9NQUpPUiwib3NzdCIsICZvc3N0X2ZvcHMpIDwgMCkgfHwgc2NzaV9yZWdpc3Rlcl9kcml2ZXIoJm9zc3RfdGVtcGxhdGUuZ2VuZHJ2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIm9zc3QgOkU6IFVuYWJsZSB0byByZWdpc3RlciBtYWpvciAlZCBmb3IgT25TdHJlYW0gdGFwZXNcbiIsIE9TU1RfTUFKT1IpOworCQlvc3N0X3N5c2ZzX2NsZWFudXAoKTsKKwkJcmV0dXJuIDE7CisJfQorCW9zc3RfY3JlYXRlX2RyaXZlcmZzX2ZpbGVzKCZvc3N0X3RlbXBsYXRlLmdlbmRydik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfb3NzdCAodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgb3NzdF90YXBlICogU1RwOworCisJb3NzdF9yZW1vdmVfZHJpdmVyZnNfZmlsZXMoJm9zc3RfdGVtcGxhdGUuZ2VuZHJ2KTsKKwlzY3NpX3VucmVnaXN0ZXJfZHJpdmVyKCZvc3N0X3RlbXBsYXRlLmdlbmRydik7CisJdW5yZWdpc3Rlcl9jaHJkZXYoT1NTVF9NQUpPUiwgIm9zc3QiKTsKKwlvc3N0X3N5c2ZzX2NsZWFudXAoKTsKKworCWlmIChvc19zY3NpX3RhcGVzKSB7CisJCWZvciAoaT0wOyBpIDwgb3NzdF9tYXhfZGV2OyArK2kpIHsKKwkJCWlmICghKFNUcCA9IG9zX3Njc2lfdGFwZXNbaV0pKSBjb250aW51ZTsKKwkJCS8qIFRoaXMgaXMgZGVmZW5zaXZlLCBzdXBwb3NlZCB0byBoYXBwZW4gZHVyaW5nIGRldGFjaCAqLworCQkJaWYgKFNUcC0+aGVhZGVyX2NhY2hlKQorCQkJCXZmcmVlKFNUcC0+aGVhZGVyX2NhY2hlKTsKKwkJCWlmIChTVHAtPmJ1ZmZlcikgeworCQkJCW5vcm1hbGl6ZV9idWZmZXIoU1RwLT5idWZmZXIpOworCQkJCWtmcmVlKFNUcC0+YnVmZmVyKTsKKwkJCX0KKwkJCXB1dF9kaXNrKFNUcC0+ZHJpdmUpOworCQkJa2ZyZWUoU1RwKTsKKwkJfQorCQlrZnJlZShvc19zY3NpX3RhcGVzKTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAib3NzdCA6STogVW5sb2FkZWQuXG4iKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9vc3N0KTsKK21vZHVsZV9leGl0KGV4aXRfb3NzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvb3NzdC5oIGIvZHJpdmVycy9zY3NpL29zc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzJlMWM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL29zc3QuaApAQCAtMCwwICsxLDYzOCBAQAorLyoKKyAqCSRIZWFkZXI6IC9jdnNyb290L29zc3QvRHJpdmVyL29zc3QuaCx2IDEuMTYgMjAwNS8wMS8wMSAyMToxMzozNSB3cmllZGUgRXhwICQKKyAqLworCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKworLyoJRklYTUUgLSByZW5hbWUgYW5kIHVzZSB0aGUgZm9sbG93aW5nIHR3byB0eXBlcyBvciBkZWxldGUgdGhlbSEKKyAqICAgICAgICAgICAgICBhbmQgdGhlIHR5cGVzIHJlYWxseSBzaG91bGQgZ28gdG8gc3QuaCBhbnl3YXkuLi4KKyAqCUlOUVVJUlkgcGFja2V0IGNvbW1hbmQgLSBEYXRhIEZvcm1hdCAoRnJvbSBUYWJsZSA2LTggb2YgUUlDLTE1N0MpCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZAlkZXZpY2VfdHlwZQk6NTsJLyogUGVyaXBoZXJhbCBEZXZpY2UgVHlwZSAqLworCXVuc2lnbmVkCXJlc2VydmVkMF83NjUJOjM7CS8qIFBlcmlwaGVyYWwgUXVhbGlmaWVyIC0gUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDFfNnQwCTo3OwkvKiBSZXNlcnZlZCAqLworCXVuc2lnbmVkCXJtYgkJOjE7CS8qIFJlbW92YWJsZSBNZWRpdW0gQml0ICovCisJdW5zaWduZWQJYW5zaV92ZXJzaW9uCTozOwkvKiBBTlNJIFZlcnNpb24gKi8KKwl1bnNpZ25lZAllY21hX3ZlcnNpb24JOjM7CS8qIEVDTUEgVmVyc2lvbiAqLworCXVuc2lnbmVkCWlzb192ZXJzaW9uCToyOwkvKiBJU08gVmVyc2lvbiAqLworCXVuc2lnbmVkCXJlc3BvbnNlX2Zvcm1hdCA6NDsJLyogUmVzcG9uc2UgRGF0YSBGb3JtYXQgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDNfNDUJOjI7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQJcmVzZXJ2ZWQzXzYJOjE7CS8qIFRybUlPUCAtIFJlc2VydmVkICovCisJdW5zaWduZWQJcmVzZXJ2ZWQzXzcJOjE7CS8qIEFFTkMgLSBSZXNlcnZlZCAqLworCXU4CQlhZGRpdGlvbmFsX2xlbmd0aDsJLyogQWRkaXRpb25hbCBMZW5ndGggKHRvdGFsX2xlbmd0aC00KSAqLworCXU4CQlyc3Y1LCByc3Y2LCByc3Y3OwkvKiBSZXNlcnZlZCAqLworCXU4CQl2ZW5kb3JfaWRbOF07CQkvKiBWZW5kb3IgSWRlbnRpZmljYXRpb24gKi8KKwl1OAkJcHJvZHVjdF9pZFsxNl07CQkvKiBQcm9kdWN0IElkZW50aWZpY2F0aW9uICovCisJdTgJCXJldmlzaW9uX2xldmVsWzRdOwkvKiBSZXZpc2lvbiBMZXZlbCAqLworCXU4CQl2ZW5kb3Jfc3BlY2lmaWNbMjBdOwkvKiBWZW5kb3IgU3BlY2lmaWMgLSBPcHRpb25hbCAqLworCXU4CQlyZXNlcnZlZDU2dDk1WzQwXTsJLyogUmVzZXJ2ZWQgLSBPcHRpb25hbCAqLworCQkJCQkJLyogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBtYXkgYmUgcmV0dXJuZWQgKi8KK30gaWRldGFwZV9pbnF1aXJ5X3Jlc3VsdF90OworCisvKgorICoJUkVBRCBQT1NJVElPTiBwYWNrZXQgY29tbWFuZCAtIERhdGEgRm9ybWF0IChGcm9tIFRhYmxlIDYtNTcpCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZAlyZXNlcnZlZDBfMTAJOjI7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQJYnB1CQk6MTsJLyogQmxvY2sgUG9zaXRpb24gVW5rbm93biAqLwkKKwl1bnNpZ25lZAlyZXNlcnZlZDBfNTQzCTozOwkvKiBSZXNlcnZlZCAqLworCXVuc2lnbmVkCWVvcAkJOjE7CS8qIEVuZCBPZiBQYXJ0aXRpb24gKi8KKwl1bnNpZ25lZAlib3AJCToxOwkvKiBCZWdpbm5pbmcgT2YgUGFydGl0aW9uICovCisJdTgJCXBhcnRpdGlvbjsJCS8qIFBhcnRpdGlvbiBOdW1iZXIgKi8KKwl1OAkJcmVzZXJ2ZWQyLCByZXNlcnZlZDM7CS8qIFJlc2VydmVkICovCisJdTMyCQlmaXJzdF9ibG9jazsJCS8qIEZpcnN0IEJsb2NrIExvY2F0aW9uICovCisJdTMyCQlsYXN0X2Jsb2NrOwkJLyogTGFzdCBCbG9jayBMb2NhdGlvbiAoT3B0aW9uYWwpICovCisJdTgJCXJlc2VydmVkMTI7CQkvKiBSZXNlcnZlZCAqLworCXU4CQlibG9ja3NfaW5fYnVmZmVyWzNdOwkvKiBCbG9ja3MgSW4gQnVmZmVyIC0gKE9wdGlvbmFsKSAqLworCXUzMgkJYnl0ZXNfaW5fYnVmZmVyOwkvKiBCeXRlcyBJbiBCdWZmZXIgKE9wdGlvbmFsKSAqLworfSBpZGV0YXBlX3JlYWRfcG9zaXRpb25fcmVzdWx0X3Q7CisKKy8qCisgKiAgICAgIEZvbGxvd3Mgc3RydWN0dXJlcyB3aGljaCBhcmUgcmVsYXRlZCB0byB0aGUgU0VMRUNUIFNFTlNFIC8gTU9ERSBTRU5TRQorICogICAgICBwYWNrZXQgY29tbWFuZHMuIAorICovCisjZGVmaW5lIENPTVBSRVNTSU9OX1BBR0UgICAgICAgICAgIDB4MGYKKyNkZWZpbmUgQ09NUFJFU1NJT05fUEFHRV9MRU5HVEggICAgMTYKKworI2RlZmluZSBDQVBBQklMSVRJRVNfUEFHRSAgICAgICAgICAweDJhCisjZGVmaW5lIENBUEFCSUxJVElFU19QQUdFX0xFTkdUSCAgIDIwCisKKyNkZWZpbmUgVEFQRV9QQVJBTVRSX1BBR0UgICAgICAgICAgMHgyYgorI2RlZmluZSBUQVBFX1BBUkFNVFJfUEFHRV9MRU5HVEggICAxNgorCisjZGVmaW5lIE5VTUJFUl9SRVRSSUVTX1BBR0UgICAgICAgIDB4MmYKKyNkZWZpbmUgTlVNQkVSX1JFVFJJRVNfUEFHRV9MRU5HVEggNAorCisjZGVmaW5lIEJMT0NLX1NJWkVfUEFHRSAgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgQkxPQ0tfU0laRV9QQUdFX0xFTkdUSCAgICAgNAorCisjZGVmaW5lIEJVRkZFUl9GSUxMSU5HX1BBR0UgICAgICAgIDB4MzMKKyNkZWZpbmUgQlVGRkVSX0ZJTExJTkdfUEFHRV9MRU5HVEggNAorCisjZGVmaW5lIFZFTkRPUl9JREVOVF9QQUdFICAgICAgICAgIDB4MzYKKyNkZWZpbmUgVkVORE9SX0lERU5UX1BBR0VfTEVOR1RIICAgOAorCisjZGVmaW5lIExPQ0FURV9TVEFUVVNfUEFHRSAgICAgICAgIDB4MzcKKyNkZWZpbmUgTE9DQVRFX1NUQVRVU19QQUdFX0xFTkdUSCAgMAorCisjZGVmaW5lIE1PREVfSEVBREVSX0xFTkdUSCAgICAgICAgIDQKKworCisvKgorICoJUkVRVUVTVCBTRU5TRSBwYWNrZXQgY29tbWFuZCByZXN1bHQgLSBEYXRhIEZvcm1hdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkCWVycm9yX2NvZGUJOjc7CS8qIEN1cnJlbnQgb2YgZGVmZXJyZWQgZXJyb3JzICovCisJdW5zaWduZWQJdmFsaWQJCToxOwkvKiBUaGUgaW5mb3JtYXRpb24gZmllbGQgY29uZm9ybXMgdG8gUUlDLTE1N0MgKi8KKwl1OAkJcmVzZXJ2ZWQxCTo4OwkvKiBTZWdtZW50IE51bWJlciAtIFJlc2VydmVkICovCisJdW5zaWduZWQJc2Vuc2Vfa2V5CTo0OwkvKiBTZW5zZSBLZXkgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDJfNAk6MTsJLyogUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZAlpbGkJCToxOwkvKiBJbmNvcnJlY3QgTGVuZ3RoIEluZGljYXRvciAqLworCXVuc2lnbmVkCWVvbQkJOjE7CS8qIEVuZCBPZiBNZWRpdW0gKi8KKwl1bnNpZ25lZAlmaWxlbWFyayAJOjE7CS8qIEZpbGVtYXJrICovCisJdTMyCQlpbmZvcm1hdGlvbiBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJdTgJCWFzbDsJCQkvKiBBZGRpdGlvbmFsIHNlbnNlIGxlbmd0aCAobi03KSAqLworCXUzMgkJY29tbWFuZF9zcGVjaWZpYzsJLyogQWRkaXRpb25hbCBjb21tYW5kIHNwZWNpZmljIGluZm9ybWF0aW9uICovCisJdTgJCWFzYzsJCQkvKiBBZGRpdGlvbmFsIFNlbnNlIENvZGUgKi8KKwl1OAkJYXNjcTsJCQkvKiBBZGRpdGlvbmFsIFNlbnNlIENvZGUgUXVhbGlmaWVyICovCisJdTgJCXJlcGxhY2VhYmxlX3VuaXRfY29kZTsJLyogRmllbGQgUmVwbGFjZWFibGUgVW5pdCBDb2RlICovCisJdW5zaWduZWQJc2tfc3BlY2lmaWMxIAk6NzsJLyogU2Vuc2UgS2V5IFNwZWNpZmljICovCisJdW5zaWduZWQJc2tzdgkJOjE7CS8qIFNlbnNlIEtleSBTcGVjaWZpYyBpbmZvcm1hdGlvbiBpcyB2YWxpZCAqLworCXU4CQlza19zcGVjaWZpYzI7CQkvKiBTZW5zZSBLZXkgU3BlY2lmaWMgKi8KKwl1OAkJc2tfc3BlY2lmaWMzOwkJLyogU2Vuc2UgS2V5IFNwZWNpZmljICovCisJdTgJCXBhZFsyXTsJCQkvKiBQYWRkaW5nIHRvIDIwIGJ5dGVzICovCit9IGlkZXRhcGVfcmVxdWVzdF9zZW5zZV9yZXN1bHRfdDsKKworLyoKKyAqICAgICAgTW9kZSBQYXJhbWV0ZXIgSGVhZGVyIGZvciB0aGUgTU9ERSBTRU5TRSBwYWNrZXQgY29tbWFuZAorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIHU4ICAgICAgICAgICAgICBtb2RlX2RhdGFfbGVuZ3RoOyAgICAgICAvKiBMZW5ndGggb2YgdGhlIGZvbGxvd2luZyBkYXRhIHRyYW5zZmVyICovCisgICAgICAgIHU4ICAgICAgICAgICAgICBtZWRpdW1fdHlwZTsgICAgICAgICAgICAvKiBNZWRpdW0gVHlwZSAqLworICAgICAgICB1OCAgICAgICAgICAgICAgZHNwOyAgICAgICAgICAgICAgICAgICAgLyogRGV2aWNlIFNwZWNpZmljIFBhcmFtZXRlciAqLworICAgICAgICB1OCAgICAgICAgICAgICAgYmRsOyAgICAgICAgICAgICAgICAgICAgLyogQmxvY2sgRGVzY3JpcHRvciBMZW5ndGggKi8KK30gb3NzdF9tb2RlX3BhcmFtZXRlcl9oZWFkZXJfdDsKKworLyoKKyAqICAgICAgTW9kZSBQYXJhbWV0ZXIgQmxvY2sgRGVzY3JpcHRvciB0aGUgTU9ERSBTRU5TRSBwYWNrZXQgY29tbWFuZAorICoKKyAqICAgICAgU3VwcG9ydCBmb3IgYmxvY2sgZGVzY3JpcHRvcnMgaXMgb3B0aW9uYWwuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgdTggICAgICAgICAgICAgIGRlbnNpdHlfY29kZTsgICAgICAgICAgIC8qIE1lZGl1bSBkZW5zaXR5IGNvZGUgKi8KKyAgICAgICAgdTggICAgICAgICAgICAgIGJsb2Nrc1szXTsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBibG9ja3MgKi8KKyAgICAgICAgdTggICAgICAgICAgICAgIHJlc2VydmVkNDsgICAgICAgICAgICAgIC8qIFJlc2VydmVkICovCisgICAgICAgIHU4ICAgICAgICAgICAgICBsZW5ndGhbM107ICAgICAgICAgICAgICAvKiBCbG9jayBMZW5ndGggKi8KK30gb3NzdF9wYXJhbWV0ZXJfYmxvY2tfZGVzY3JpcHRvcl90OworCisvKgorICogICAgICBUaGUgRGF0YSBDb21wcmVzc2lvbiBQYWdlLCBhcyByZXR1cm5lZCBieSB0aGUgTU9ERSBTRU5TRSBwYWNrZXQgY29tbWFuZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworI2lmICAgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisgICAgICAgIHVuc2lnbmVkICAgICAgICBwcyAgICAgICAgICAgICAgOjE7CisgICAgICAgIHVuc2lnbmVkICAgICAgICByZXNlcnZlZDAgICAgICAgOjE7ICAgICAvKiBSZXNlcnZlZCAqLworCXVuc2lnbmVkICAgICAgICBwYWdlX2NvZGUgICAgICAgOjY7ICAgICAvKiBQYWdlIENvZGUgLSBTaG91bGQgYmUgMHhmICovCisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwl1bnNpZ25lZCAgICAgICAgcGFnZV9jb2RlICAgICAgIDo2OyAgICAgLyogUGFnZSBDb2RlIC0gU2hvdWxkIGJlIDB4ZiAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQwICAgICAgIDoxOyAgICAgLyogUmVzZXJ2ZWQgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIHBzICAgICAgICAgICAgICA6MTsKKyNlbHNlCisjZXJyb3IgIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjZW5kaWYKKyAgICAgICAgdTggICAgICAgICAgICAgIHBhZ2VfbGVuZ3RoOyAgICAgICAgICAgIC8qIFBhZ2UgTGVuZ3RoIC0gU2hvdWxkIGJlIDE0ICovCisjaWYgICBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKyAgICAgICAgdW5zaWduZWQgICAgICAgIGRjZSAgICAgICAgICAgICA6MTsgICAgIC8qIERhdGEgQ29tcHJlc3Npb24gRW5hYmxlICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICBkY2MgICAgICAgICAgICAgOjE7ICAgICAvKiBEYXRhIENvbXByZXNzaW9uIENhcGFibGUgKi8KKwl1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQyICAgICAgIDo2OyAgICAgLyogUmVzZXJ2ZWQgKi8KKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkICAgICAgICByZXNlcnZlZDIgICAgICAgOjY7ICAgICAvKiBSZXNlcnZlZCAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgZGNjICAgICAgICAgICAgIDoxOyAgICAgLyogRGF0YSBDb21wcmVzc2lvbiBDYXBhYmxlICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICBkY2UgICAgICAgICAgICAgOjE7ICAgICAvKiBEYXRhIENvbXByZXNzaW9uIEVuYWJsZSAqLworI2Vsc2UKKyNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorI2lmICAgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisgICAgICAgIHVuc2lnbmVkICAgICAgICBkZGUgICAgICAgICAgICAgOjE7ICAgICAvKiBEYXRhIERlY29tcHJlc3Npb24gRW5hYmxlICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICByZWQgICAgICAgICAgICAgOjI7ICAgICAvKiBSZXBvcnQgRXhjZXB0aW9uIG9uIERlY29tcHJlc3Npb24gKi8KKwl1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQzICAgICAgIDo1OyAgICAgLyogUmVzZXJ2ZWQgKi8KKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkICAgICAgICByZXNlcnZlZDMgICAgICAgOjU7ICAgICAvKiBSZXNlcnZlZCAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgcmVkICAgICAgICAgICAgIDoyOyAgICAgLyogUmVwb3J0IEV4Y2VwdGlvbiBvbiBEZWNvbXByZXNzaW9uICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICBkZGUgICAgICAgICAgICAgOjE7ICAgICAvKiBEYXRhIERlY29tcHJlc3Npb24gRW5hYmxlICovCisjZWxzZQorI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisgICAgICAgIHUzMiAgICAgICAgICAgICBjYTsgICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc2lvbiBBbGdvcml0aG0gKi8KKyAgICAgICAgdTMyICAgICAgICAgICAgIGRhOyAgICAgICAgICAgICAgICAgICAgIC8qIERlY29tcHJlc3Npb24gQWxnb3JpdGhtICovCisgICAgICAgIHU4ICAgICAgICAgICAgICByZXNlcnZlZFs0XTsgICAgICAgICAgICAvKiBSZXNlcnZlZCAqLworfSBvc3N0X2RhdGFfY29tcHJlc3Npb25fcGFnZV90OworCisvKgorICogICAgICBUaGUgTWVkaXVtIFBhcnRpdGlvbiBQYWdlLCBhcyByZXR1cm5lZCBieSB0aGUgTU9ERSBTRU5TRSBwYWNrZXQgY29tbWFuZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworI2lmICAgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisgICAgICAgIHVuc2lnbmVkICAgICAgICBwcyAgICAgICAgICAgICAgOjE7CisgICAgICAgIHVuc2lnbmVkICAgICAgICByZXNlcnZlZDFfNiAgICAgOjE7ICAgICAvKiBSZXNlcnZlZCAqLworCXVuc2lnbmVkICAgICAgICBwYWdlX2NvZGUgICAgICAgOjY7ICAgICAvKiBQYWdlIENvZGUgLSBTaG91bGQgYmUgMHgxMSAqLworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJdW5zaWduZWQgICAgICAgIHBhZ2VfY29kZSAgICAgICA6NjsgICAgIC8qIFBhZ2UgQ29kZSAtIFNob3VsZCBiZSAweDExICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICByZXNlcnZlZDFfNiAgICAgOjE7ICAgICAvKiBSZXNlcnZlZCAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgcHMgICAgICAgICAgICAgIDoxOworI2Vsc2UKKyNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorICAgICAgICB1OCAgICAgICAgICAgICAgcGFnZV9sZW5ndGg7ICAgICAgICAgICAgLyogUGFnZSBMZW5ndGggLSBTaG91bGQgYmUgNiAqLworICAgICAgICB1OCAgICAgICAgICAgICAgbWFwOyAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBBZGRpdGlvbmFsIFBhcnRpdGlvbnMgLSBTaG91bGQgYmUgMCAqLworICAgICAgICB1OCAgICAgICAgICAgICAgYXBkOyAgICAgICAgICAgICAgICAgICAgLyogQWRkaXRpb25hbCBQYXJ0aXRpb25zIERlZmluZWQgLSBTaG91bGQgYmUgMCAqLworI2lmICAgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisgICAgICAgIHVuc2lnbmVkICAgICAgICBmZHAgICAgICAgICAgICAgOjE7ICAgICAvKiBGaXhlZCBEYXRhIFBhcnRpdGlvbnMgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIHNkcCAgICAgICAgICAgICA6MTsgICAgIC8qIFNob3VsZCBiZSAwICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICBpZHAgICAgICAgICAgICAgOjE7ICAgICAvKiBTaG91bGQgYmUgMCAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgcHN1bSAgICAgICAgICAgIDoyOyAgICAgLyogU2hvdWxkIGJlIDAgKi8KKwl1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQ0XzAxMiAgIDozOyAgICAgLyogUmVzZXJ2ZWQgKi8KKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkICAgICAgICByZXNlcnZlZDRfMDEyICAgOjM7ICAgICAvKiBSZXNlcnZlZCAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgcHN1bSAgICAgICAgICAgIDoyOyAgICAgLyogU2hvdWxkIGJlIDAgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIGlkcCAgICAgICAgICAgICA6MTsgICAgIC8qIFNob3VsZCBiZSAwICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICBzZHAgICAgICAgICAgICAgOjE7ICAgICAvKiBTaG91bGQgYmUgMCAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgZmRwICAgICAgICAgICAgIDoxOyAgICAgLyogRml4ZWQgRGF0YSBQYXJ0aXRpb25zICovCisjZWxzZQorI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisgICAgICAgIHU4ICAgICAgICAgICAgICBtZnI7ICAgICAgICAgICAgICAgICAgICAvKiBNZWRpdW0gRm9ybWF0IFJlY29nbml0aW9uICovCisgICAgICAgIHU4ICAgICAgICAgICAgICByZXNlcnZlZFsyXTsgICAgICAgICAgICAvKiBSZXNlcnZlZCAqLworfSBvc3N0X21lZGl1bV9wYXJ0aXRpb25fcGFnZV90OworCisvKgorICogICAgICBDYXBhYmlsaXRpZXMgYW5kIE1lY2hhbmljYWwgU3RhdHVzIFBhZ2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworI2lmICAgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisgICAgICAgIHVuc2lnbmVkICAgICAgICByZXNlcnZlZDFfNjcgICAgOjI7CisJdW5zaWduZWQgICAgICAgIHBhZ2VfY29kZSAgICAgICA6NjsgICAgIC8qIFBhZ2UgY29kZSAtIFNob3VsZCBiZSAweDJhICovCisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwl1bnNpZ25lZCAgICAgICAgcGFnZV9jb2RlICAgICAgIDo2OyAgICAgLyogUGFnZSBjb2RlIC0gU2hvdWxkIGJlIDB4MmEgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkMV82NyAgICA6MjsKKyNlbHNlCisjZXJyb3IgIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjZW5kaWYKKyAgICAgICAgdTggICAgICAgICAgICAgIHBhZ2VfbGVuZ3RoOyAgICAgICAgICAgIC8qIFBhZ2UgTGVuZ3RoIC0gU2hvdWxkIGJlIDB4MTIgKi8KKyAgICAgICAgdTggICAgICAgICAgICAgIHJlc2VydmVkMiwgcmVzZXJ2ZWQzOworI2lmICAgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisgICAgICAgIHVuc2lnbmVkICAgICAgICByZXNlcnZlZDRfNjcgICAgOjI7CisgICAgICAgIHVuc2lnbmVkICAgICAgICBzcHJldiAgICAgICAgICAgOjE7ICAgICAvKiBTdXBwb3J0cyBTUEFDRSBpbiB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24gKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkNF8xMjM0ICA6NDsKKwl1bnNpZ25lZCAgICAgICAgcm8gICAgICAgICAgICAgIDoxOyAgICAgLyogUmVhZCBPbmx5IE1vZGUgKi8KKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkICAgICAgICBybyAgICAgICAgICAgICAgOjE7ICAgICAvKiBSZWFkIE9ubHkgTW9kZSAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQ0XzEyMzQgIDo0OworICAgICAgICB1bnNpZ25lZCAgICAgICAgc3ByZXYgICAgICAgICAgIDoxOyAgICAgLyogU3VwcG9ydHMgU1BBQ0UgaW4gdGhlIHJldmVyc2UgZGlyZWN0aW9uICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICByZXNlcnZlZDRfNjcgICAgOjI7CisjZWxzZQorI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisjaWYgICBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkNV82NyAgICA6MjsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHFmYSAgICAgICAgICAgICA6MTsgICAgIC8qIFN1cHBvcnRzIHRoZSBRRkEgdHdvIHBhcnRpdGlvbiBmb3JtYXRzICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICByZXNlcnZlZDVfNCAgICAgOjE7CisgICAgICAgIHVuc2lnbmVkICAgICAgICBlZm10ICAgICAgICAgICAgOjE7ICAgICAvKiBTdXBwb3J0cyBFUkFTRSBjb21tYW5kIGluaXRpYXRlZCBmb3JtYXR0aW5nICovCisJdW5zaWduZWQgICAgICAgIHJlc2VydmVkNV8wMTIgICA6MzsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkICAgICAgICByZXNlcnZlZDVfMDEyICAgOjM7CisgICAgICAgIHVuc2lnbmVkICAgICAgICBlZm10ICAgICAgICAgICAgOjE7ICAgICAvKiBTdXBwb3J0cyBFUkFTRSBjb21tYW5kIGluaXRpYXRlZCBmb3JtYXR0aW5nICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICByZXNlcnZlZDVfNCAgICAgOjE7CisgICAgICAgIHVuc2lnbmVkICAgICAgICBxZmEgICAgICAgICAgICAgOjE7ICAgICAvKiBTdXBwb3J0cyB0aGUgUUZBIHR3byBwYXJ0aXRpb24gZm9ybWF0cyAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQ1XzY3ICAgIDoyOworI2Vsc2UKKyNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorI2lmICAgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisgICAgICAgIHVuc2lnbmVkICAgICAgICBjbXBycyAgICAgICAgICAgOjE7ICAgICAvKiBTdXBwb3J0cyBkYXRhIGNvbXByZXNzaW9uICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICBlY2MgICAgICAgICAgICAgOjE7ICAgICAvKiBTdXBwb3J0cyBlcnJvciBjb3JyZWN0aW9uICovCisJdW5zaWduZWQgICAgICAgIHJlc2VydmVkNl80NSAgICA6MjsgICAgIC8qIFJlc2VydmVkICovICAKKyAgICAgICAgdW5zaWduZWQgICAgICAgIGVqZWN0ICAgICAgICAgICA6MTsgICAgIC8qIFRoZSBkZXZpY2UgY2FuIGVqZWN0IHRoZSB2b2x1bWUgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIHByZXZlbnQgICAgICAgICA6MTsgICAgIC8qIFRoZSBkZXZpY2UgZGVmYXVsdHMgaW4gdGhlIHByZXZlbnQgc3RhdGUgYWZ0ZXIgcG93ZXIgdXAgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIGxvY2tlZCAgICAgICAgICA6MTsgICAgIC8qIFRoZSB2b2x1bWUgaXMgbG9ja2VkICovCisJdW5zaWduZWQgICAgICAgIGxvY2sgICAgICAgICAgICA6MTsgICAgIC8qIFN1cHBvcnRzIGxvY2tpbmcgdGhlIHZvbHVtZSAqLworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJdW5zaWduZWQgICAgICAgIGxvY2sgICAgICAgICAgICA6MTsgICAgIC8qIFN1cHBvcnRzIGxvY2tpbmcgdGhlIHZvbHVtZSAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgbG9ja2VkICAgICAgICAgIDoxOyAgICAgLyogVGhlIHZvbHVtZSBpcyBsb2NrZWQgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIHByZXZlbnQgICAgICAgICA6MTsgICAgIC8qIFRoZSBkZXZpY2UgZGVmYXVsdHMgaW4gdGhlIHByZXZlbnQgc3RhdGUgYWZ0ZXIgcG93ZXIgdXAgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIGVqZWN0ICAgICAgICAgICA6MTsgICAgIC8qIFRoZSBkZXZpY2UgY2FuIGVqZWN0IHRoZSB2b2x1bWUgKi8KKwl1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQ2XzQ1ICAgIDoyOyAgICAgLyogUmVzZXJ2ZWQgKi8gIAorICAgICAgICB1bnNpZ25lZCAgICAgICAgZWNjICAgICAgICAgICAgIDoxOyAgICAgLyogU3VwcG9ydHMgZXJyb3IgY29ycmVjdGlvbiAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgY21wcnMgICAgICAgICAgIDoxOyAgICAgLyogU3VwcG9ydHMgZGF0YSBjb21wcmVzc2lvbiAqLworI2Vsc2UKKyNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorI2lmICAgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisgICAgICAgIHVuc2lnbmVkICAgICAgICBibGszMjc2OCAgICAgICAgOjE7ICAgICAvKiBzbG93YiAtIHRoZSBkZXZpY2UgcmVzdHJpY3RzIHRoZSBieXRlIGNvdW50IGZvciBQSU8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRyYW5zZmVycyBmb3Igc2xvdyBidWZmZXIgbWVtb3J5ID8/PyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxzbyAzMjc2OCBibG9jayBzaXplIGluIHNvbWUgY2FzZXMgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkN18zXzYgICA6NDsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIGJsazEwMjQgICAgICAgICA6MTsgICAgIC8qIFN1cHBvcnRzIDEwMjQgYnl0ZXMgYmxvY2sgc2l6ZSAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgYmxrNTEyICAgICAgICAgIDoxOyAgICAgLyogU3VwcG9ydHMgNTEyIGJ5dGVzIGJsb2NrIHNpemUgKi8KKwl1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQ3XzAgICAgIDoxOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJdW5zaWduZWQgICAgICAgIHJlc2VydmVkN18wICAgICA6MTsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIGJsazUxMiAgICAgICAgICA6MTsgICAgIC8qIFN1cHBvcnRzIDUxMiBieXRlcyBibG9jayBzaXplICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICBibGsxMDI0ICAgICAgICAgOjE7ICAgICAvKiBTdXBwb3J0cyAxMDI0IGJ5dGVzIGJsb2NrIHNpemUgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkN18zXzYgICA6NDsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIGJsazMyNzY4ICAgICAgICA6MTsgICAgIC8qIHNsb3diIC0gdGhlIGRldmljZSByZXN0cmljdHMgdGhlIGJ5dGUgY291bnQgZm9yIFBJTyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHJhbnNmZXJzIGZvciBzbG93IGJ1ZmZlciBtZW1vcnkgPz8/ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbHNvIDMyNzY4IGJsb2NrIHNpemUgaW4gc29tZSBjYXNlcyAqLworI2Vsc2UKKyNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorICAgICAgICB1MTYgICAgICAgICAgICAgbWF4X3NwZWVkOyAgICAgICAgICAgICAgLyogTWF4aW11bSBzcGVlZCBzdXBwb3J0ZWQgaW4gS0JwcyAqLworICAgICAgICB1OCAgICAgICAgICAgICAgcmVzZXJ2ZWQxMCwgcmVzZXJ2ZWQxMTsKKyAgICAgICAgdTE2ICAgICAgICAgICAgIGN0bDsgICAgICAgICAgICAgICAgICAgIC8qIENvbnRpbnVvdXMgVHJhbnNmZXIgTGltaXQgaW4gYmxvY2tzICovCisgICAgICAgIHUxNiAgICAgICAgICAgICBzcGVlZDsgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IFNwZWVkLCBpbiBLQnBzICovCisgICAgICAgIHUxNiAgICAgICAgICAgICBidWZmZXJfc2l6ZTsgICAgICAgICAgICAvKiBCdWZmZXIgU2l6ZSwgaW4gNTEyIGJ5dGVzICovCisgICAgICAgIHU4ICAgICAgICAgICAgICByZXNlcnZlZDE4LCByZXNlcnZlZDE5OworfSBvc3N0X2NhcGFiaWxpdGllc19wYWdlX3Q7CisKKy8qCisgKiAgICAgIEJsb2NrIFNpemUgUGFnZQorICovCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgICBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHBzICAgICAgICAgICAgICA6MTsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkMV82ICAgICA6MTsKKwl1bnNpZ25lZCAgICAgICAgcGFnZV9jb2RlICAgICAgIDo2OyAgICAgLyogUGFnZSBjb2RlIC0gU2hvdWxkIGJlIDB4MzAgKi8KKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkICAgICAgICBwYWdlX2NvZGUgICAgICAgOjY7ICAgICAvKiBQYWdlIGNvZGUgLSBTaG91bGQgYmUgMHgzMCAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQxXzYgICAgIDoxOworICAgICAgICB1bnNpZ25lZCAgICAgICAgcHMgICAgICAgICAgICAgIDoxOworI2Vsc2UKKyNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorICAgICAgICB1OCAgICAgICAgICAgICAgcGFnZV9sZW5ndGg7ICAgICAgICAgICAgLyogUGFnZSBMZW5ndGggLSBTaG91bGQgYmUgMiAqLworICAgICAgICB1OCAgICAgICAgICAgICAgcmVzZXJ2ZWQyOworI2lmICAgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisgICAgICAgIHVuc2lnbmVkICAgICAgICBvbmUgICAgICAgICAgICAgOjE7CisgICAgICAgIHVuc2lnbmVkICAgICAgICByZXNlcnZlZDJfNiAgICAgOjE7CisgICAgICAgIHVuc2lnbmVkICAgICAgICByZWNvcmQzMl81ICAgICAgOjE7CisgICAgICAgIHVuc2lnbmVkICAgICAgICByZWNvcmQzMiAgICAgICAgOjE7CisgICAgICAgIHVuc2lnbmVkICAgICAgICByZXNlcnZlZDJfMjMgICAgOjI7CisgICAgICAgIHVuc2lnbmVkICAgICAgICBwbGF5MzJfNSAgICAgICAgOjE7CisJdW5zaWduZWQgICAgICAgIHBsYXkzMiAgICAgICAgICA6MTsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkICAgICAgICBwbGF5MzIgICAgICAgICAgOjE7CisgICAgICAgIHVuc2lnbmVkICAgICAgICBwbGF5MzJfNSAgICAgICAgOjE7CisgICAgICAgIHVuc2lnbmVkICAgICAgICByZXNlcnZlZDJfMjMgICAgOjI7CisgICAgICAgIHVuc2lnbmVkICAgICAgICByZWNvcmQzMiAgICAgICAgOjE7CisgICAgICAgIHVuc2lnbmVkICAgICAgICByZWNvcmQzMl81ICAgICAgOjE7CisgICAgICAgIHVuc2lnbmVkICAgICAgICByZXNlcnZlZDJfNiAgICAgOjE7CisgICAgICAgIHVuc2lnbmVkICAgICAgICBvbmUgICAgICAgICAgICAgOjE7CisjZWxzZQorI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCit9IG9zc3RfYmxvY2tfc2l6ZV9wYWdlX3Q7CisKKy8qCisgKglUYXBlIFBhcmFtZXRlcnMgUGFnZQorICovCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgICBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHBzICAgICAgICAgICAgICA6MTsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkMV82ICAgICA6MTsKKwl1bnNpZ25lZCAgICAgICAgcGFnZV9jb2RlICAgICAgIDo2OyAgICAgLyogUGFnZSBjb2RlIC0gU2hvdWxkIGJlIDB4MmIgKi8KKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkICAgICAgICBwYWdlX2NvZGUgICAgICAgOjY7ICAgICAvKiBQYWdlIGNvZGUgLSBTaG91bGQgYmUgMHgyYiAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQxXzYgICAgIDoxOworICAgICAgICB1bnNpZ25lZCAgICAgICAgcHMgICAgICAgICAgICAgIDoxOworI2Vsc2UKKyNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorCXU4CQlyZXNlcnZlZDI7CisJdTgJCWRlbnNpdHk7CisJdTgJCXJlc2VydmVkMyxyZXNlcnZlZDQ7CisJdTE2CQlzZWd0cms7CisJdTE2CQl0cmtzOworCXU4CQlyZXNlcnZlZDUscmVzZXJ2ZWQ2LHJlc2VydmVkNyxyZXNlcnZlZDgscmVzZXJ2ZWQ5LHJlc2VydmVkMTA7Cit9IG9zc3RfdGFwZV9wYXJhbXRyX3BhZ2VfdDsKKworLyogT25TdHJlYW0gZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBPU19DT05GSUdfUEFSVElUSU9OICAgICAoMHhmZikKKyNkZWZpbmUgT1NfREFUQV9QQVJUSVRJT04gICAgICAgKDApCisjZGVmaW5lIE9TX1BBUlRJVElPTl9WRVJTSU9OICAgICgxKQorCisvKgorICogcGFydGl0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IG9zX3BhcnRpdGlvbl9zIHsKKyAgICAgICAgX191OCAgICBwYXJ0aXRpb25fbnVtOworICAgICAgICBfX3U4ICAgIHBhcl9kZXNjX3ZlcjsKKyAgICAgICAgX191MTYgICB3cnRfcGFzc19jbnRyOworICAgICAgICBfX3UzMiAgIGZpcnN0X2ZyYW1lX3Bwb3M7CisgICAgICAgIF9fdTMyICAgbGFzdF9mcmFtZV9wcG9zOworICAgICAgICBfX3UzMiAgIGVvZF9mcmFtZV9wcG9zOworfSBvc19wYXJ0aXRpb25fdDsKKworLyoKKyAqIERBVCBlbnRyeQorICovCit0eXBlZGVmIHN0cnVjdCBvc19kYXRfZW50cnlfcyB7CisgICAgICAgIF9fdTMyICAgYmxrX3N6OworICAgICAgICBfX3UxNiAgIGJsa19jbnQ7CisgICAgICAgIF9fdTggICAgZmxhZ3M7CisgICAgICAgIF9fdTggICAgcmVzZXJ2ZWQ7Cit9IG9zX2RhdF9lbnRyeV90OworCisvKgorICogREFUCisgKi8KKyNkZWZpbmUgT1NfREFUX0ZMQUdTX0RBVEEgICAgICAgKDB4YykKKyNkZWZpbmUgT1NfREFUX0ZMQUdTX01BUksgICAgICAgKDB4MSkKKwordHlwZWRlZiBzdHJ1Y3Qgb3NfZGF0X3MgeworICAgICAgICBfX3U4ICAgICAgICAgICAgZGF0X3N6OworICAgICAgICBfX3U4ICAgICAgICAgICAgcmVzZXJ2ZWQxOworICAgICAgICBfX3U4ICAgICAgICAgICAgZW50cnlfY250OworICAgICAgICBfX3U4ICAgICAgICAgICAgcmVzZXJ2ZWQzOworICAgICAgICBvc19kYXRfZW50cnlfdCAgZGF0X2xpc3RbMTZdOworfSBvc19kYXRfdDsKKworLyoKKyAqIEZyYW1lIHR5cGVzCisgKi8KKyNkZWZpbmUgT1NfRlJBTUVfVFlQRV9GSUxMICAgICAgKDApCisjZGVmaW5lIE9TX0ZSQU1FX1RZUEVfRU9EICAgICAgICgxIDw8IDApCisjZGVmaW5lIE9TX0ZSQU1FX1RZUEVfTUFSS0VSICAgICgxIDw8IDEpCisjZGVmaW5lIE9TX0ZSQU1FX1RZUEVfSEVBREVSICAgICgxIDw8IDMpCisjZGVmaW5lIE9TX0ZSQU1FX1RZUEVfREFUQSAgICAgICgxIDw8IDcpCisKKy8qCisgKiBBVVgKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgb3NfYXV4X3MgeworICAgICAgICBfX3UzMiAgICAgICAgICAgZm9ybWF0X2lkOyAgICAgICAgICAgICAgLyogaGFyZHdhcmUgY29tcGFiaWxpdHkgQVVYIGlzIGJhc2VkIG9uICovCisgICAgICAgIGNoYXIgICAgICAgICAgICBhcHBsaWNhdGlvbl9zaWdbNF07ICAgICAvKiBkcml2ZXIgdXNlZCB0byB3cml0ZSB0aGlzIG1lZGlhICovCisgICAgICAgIF9fdTMyICAgICAgICAgICBoZHdyOyAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCAqLworICAgICAgICBfX3UzMiAgICAgICAgICAgdXBkYXRlX2ZyYW1lX2NudHI7ICAgICAgLyogZm9yIGNvbmZpZ3VyYXRpb24gZnJhbWUgKi8KKyAgICAgICAgX191OCAgICAgICAgICAgIGZyYW1lX3R5cGU7CisgICAgICAgIF9fdTggICAgICAgICAgICBmcmFtZV90eXBlX3Jlc2VydmVkOworICAgICAgICBfX3U4ICAgICAgICAgICAgcmVzZXJ2ZWRfMThfMTlbMl07CisgICAgICAgIG9zX3BhcnRpdGlvbl90ICBwYXJ0aXRpb247CisgICAgICAgIF9fdTggICAgICAgICAgICByZXNlcnZlZF8zNl80M1s4XTsKKyAgICAgICAgX191MzIgICAgICAgICAgIGZyYW1lX3NlcV9udW07CisgICAgICAgIF9fdTMyICAgICAgICAgICBsb2dpY2FsX2Jsa19udW1faGlnaDsKKyAgICAgICAgX191MzIgICAgICAgICAgIGxvZ2ljYWxfYmxrX251bTsKKyAgICAgICAgb3NfZGF0X3QgICAgICAgIGRhdDsKKyAgICAgICAgX191OCAgICAgICAgICAgIHJlc2VydmVkMTg4XzE5MVs0XTsKKyAgICAgICAgX191MzIgICAgICAgICAgIGZpbGVtYXJrX2NudDsKKyAgICAgICAgX191MzIgICAgICAgICAgIHBoeXNfZm07CisgICAgICAgIF9fdTMyICAgICAgICAgICBsYXN0X21hcmtfcHBvczsKKyAgICAgICAgX191OCAgICAgICAgICAgIHJlc2VydmVkMjA0XzIyM1syMF07CisKKyAgICAgICAgLyoKKyAgICAgICAgICogX191OCAgICAgICAgIGFwcF9zcGVjaWZpY1szMl07CisgICAgICAgICAqCisgICAgICAgICAqIExpbnV4IHNwZWNpZmljIGZpZWxkczoKKyAgICAgICAgICovCisgICAgICAgICBfX3UzMiAgICAgICAgICBuZXh0X21hcmtfcHBvczsgICAgICAgICAvKiB3aGVuIGtub3duLCBwb2ludHMgdG8gbmV4dCBtYXJrZXIgKi8KKwkgX191MzIJCWxhc3RfbWFya19sYm47CQkvKiBzdG9yaW5nIGxvZ19ibGtfbnVtIG9mIGxhc3QgbWFyayBpcyBleHRlbmRzIEFEUiBzcGVjICovCisgICAgICAgICBfX3U4ICAgICAgICAgICBsaW51eF9zcGVjaWZpY1syNF07CisKKyAgICAgICAgX191OCAgICAgICAgICAgIHJlc2VydmVkXzI1Nl81MTFbMjU2XTsKK30gb3NfYXV4X3Q7CisKKyNkZWZpbmUgT1NfRk1fVEFCX01BWCAxMDI0CisKK3R5cGVkZWYgc3RydWN0IG9zX2ZtX3RhYl9zIHsKKwlfX3U4CQlmbV9wYXJ0X251bTsKKwlfX3U4CQlyZXNlcnZlZF8xOworCV9fdTgJCWZtX3RhYl9lbnRfc3o7CisJX191OAkJcmVzZXJ2ZWRfMzsKKwlfX3UxNgkJZm1fdGFiX2VudF9jbnQ7CisJX191OAkJcmVzZXJ2ZWQ2XzE1WzEwXTsKKwlfX3UzMgkJZm1fdGFiX2VudFtPU19GTV9UQUJfTUFYXTsKK30gb3NfZm1fdGFiX3Q7CisKK3R5cGVkZWYgc3RydWN0IG9zX2V4dF90cmtfZXlfcyB7CisJX191OAkJZXRfcGFydF9udW07CisJX191OAkJZm10OworCV9fdTE2CQlmbV90YWJfb2ZmOworCV9fdTgJCXJlc2VydmVkNF83WzRdOworCV9fdTMyCQlsYXN0X2hsYl9oaTsKKwlfX3UzMgkJbGFzdF9obGI7CisJX191MzIJCWxhc3RfcHA7CisJX191OAkJcmVzZXJ2ZWQyMF8zMVsxMl07Cit9IG9zX2V4dF90cmtfZXlfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgb3NfZXh0X3Rya190Yl9zIHsKKwlfX3U4CQlucl9zdHJlYW1fcGFydDsKKwlfX3U4CQlyZXNlcnZlZF8xOworCV9fdTgJCWV0X2VudF9zejsKKwlfX3U4CQlyZXNlcnZlZDNfMTVbMTNdOworCW9zX2V4dF90cmtfZXlfdAlkYXRfZXh0X3Rya19leTsKKwlvc19leHRfdHJrX2V5X3QJcWZhX2V4dF90cmtfZXk7Cit9IG9zX2V4dF90cmtfdGJfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgb3NfaGVhZGVyX3MgeworICAgICAgICBjaGFyICAgICAgICAgICAgaWRlbnRfc3RyWzhdOworICAgICAgICBfX3U4ICAgICAgICAgICAgbWFqb3JfcmV2OworICAgICAgICBfX3U4ICAgICAgICAgICAgbWlub3JfcmV2OworCV9fdTE2CQlleHRfdHJrX3RiX29mZjsKKyAgICAgICAgX191OCAgICAgICAgICAgIHJlc2VydmVkMTJfMTVbNF07CisgICAgICAgIF9fdTggICAgICAgICAgICBwdF9wYXJfbnVtOworICAgICAgICBfX3U4ICAgICAgICAgICAgcHRfcmVzZXJ2ZWQxXzNbM107CisgICAgICAgIG9zX3BhcnRpdGlvbl90ICBwYXJ0aXRpb25bMTZdOworCV9fdTMyCQljZmdfY29sX3dpZHRoOworCV9fdTMyCQlkYXRfY29sX3dpZHRoOworCV9fdTMyCQlxZmFfY29sX3dpZHRoOworCV9fdTgJCWNhcnRyaWRnZVsxNl07CisJX191OAkJcmVzZXJ2ZWQzMDRfNTExWzIwOF07CisJX191MzIJCW9sZF9maWxlbWFya19saXN0WzE2NjgwLzRdOwkJLyogaW4gQURSIDEuNCBfX3U4IHRyYWNrX3RhYmxlWzE2NjgwXSAqLworCW9zX2V4dF90cmtfdGJfdAlleHRfdHJhY2tfdGI7CisJX191OAkJcmVzZXJ2ZWQxNzI3Ml8xNzczNVs0NjRdOworCW9zX2ZtX3RhYl90CWRhdF9mbV90YWI7CisJb3NfZm1fdGFiX3QJcWZhX2ZtX3RhYjsKKwlfX3U4CQlyZXNlcnZlZDI1OTYwXzMyNzY3WzY4MDhdOworfSBvc19oZWFkZXJfdDsKKworCisvKgorICogT25TdHJlYW0gQURSTCBmcmFtZQorICovCisjZGVmaW5lIE9TX0ZSQU1FX1NJWkUgICAoMzIgKiAxMDI0ICsgNTEyKQorI2RlZmluZSBPU19EQVRBX1NJWkUgICAgKDMyICogMTAyNCkKKyNkZWZpbmUgT1NfQVVYX1NJWkUgICAgICg1MTIpCisvLyNkZWZpbmUgT1NTVF9NQVhfU0cgICAgICAyCisKKy8qIFRoZSBPblN0cmVhbSB0YXBlIGJ1ZmZlciBkZXNjcmlwdG9yLiAqLworc3RydWN0IG9zc3RfYnVmZmVyIHsKKyAgdW5zaWduZWQgY2hhciBpbl91c2U7CisgIHVuc2lnbmVkIGNoYXIgZG1hOwkvKiBETUEtYWJsZSBidWZmZXIgKi8KKyAgaW50IGJ1ZmZlcl9zaXplOworICBpbnQgYnVmZmVyX2Jsb2NrczsKKyAgaW50IGJ1ZmZlcl9ieXRlczsKKyAgaW50IHJlYWRfcG9pbnRlcjsKKyAgaW50IHdyaXRpbmc7CisgIGludCBtaWRsZXZlbF9yZXN1bHQ7CisgIGludCBzeXNjYWxsX3Jlc3VsdDsKKyAgc3RydWN0IHNjc2lfcmVxdWVzdCAqbGFzdF9TUnBudDsKKyAgdW5zaWduZWQgY2hhciAqYl9kYXRhOworICBvc19hdXhfdCAqYXV4OyAgICAgICAgICAgICAgIC8qIG9uc3RyZWFtIEFVWCBzdHJ1Y3R1cmUgYXQgZW5kIG9mIGVhY2ggYmxvY2sgICAgICovCisgIHVuc2lnbmVkIHNob3J0IHVzZV9zZzsgICAgICAgLyogemVybyBvciBudW1iZXIgb2Ygcy9nIHNlZ21lbnRzIGZvciB0aGlzIGFkYXB0ZXIgKi8KKyAgdW5zaWduZWQgc2hvcnQgc2dfc2VnczsgICAgICAvKiBudW1iZXIgb2Ygc2VnbWVudHMgaW4gcy9nIGxpc3QgICAgICAgICAgICAgICAgICAqLworICB1bnNpZ25lZCBzaG9ydCBvcmlnX3NnX3NlZ3M7IC8qIG51bWJlciBvZiBzZWdtZW50cyBhbGxvY2F0ZWQgYXQgZmlyc3QgdHJ5ICAgICAgICovCisgIHN0cnVjdCBzY2F0dGVybGlzdCBzZ1sxXTsgICAgLyogTVVTVCBCRSBsYXN0IGl0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gOworCisvKiBUaGUgT25TdHJlYW0gdGFwZSBkcml2ZSBkZXNjcmlwdG9yICovCitzdHJ1Y3Qgb3NzdF90YXBlIHsKKyAgc3RydWN0IHNjc2lfZHJpdmVyICpkcml2ZXI7CisgIHVuc2lnbmVkIGNhcGFjaXR5OworICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZTsKKyAgc3RydWN0IHNlbWFwaG9yZSBsb2NrOyAgICAgICAvKiBmb3Igc2VyaWFsaXphdGlvbiAqLworICBzdHJ1Y3QgY29tcGxldGlvbiB3YWl0OyAgICAgIC8qIGZvciBTQ1NJIGNvbW1hbmRzICovCisgIHN0cnVjdCBvc3N0X2J1ZmZlciAqIGJ1ZmZlcjsKKworICAvKiBEcml2ZSBjaGFyYWN0ZXJpc3RpY3MgKi8KKyAgdW5zaWduZWQgY2hhciBvbWl0X2Jsa2xpbXM7CisgIHVuc2lnbmVkIGNoYXIgZG9fYXV0b19sb2NrOworICB1bnNpZ25lZCBjaGFyIGNhbl9ic3I7CisgIHVuc2lnbmVkIGNoYXIgY2FuX3BhcnRpdGlvbnM7CisgIHVuc2lnbmVkIGNoYXIgdHdvX2ZtOworICB1bnNpZ25lZCBjaGFyIGZhc3RfbXRlb207CisgIHVuc2lnbmVkIGNoYXIgcmVzdHJfZG1hOworICB1bnNpZ25lZCBjaGFyIHNjc2kyX2xvZ2ljYWw7CisgIHVuc2lnbmVkIGNoYXIgZGVmYXVsdF9kcnZidWZmZXI7ICAvKiAweGZmID0gZG9uJ3QgdG91Y2gsIHZhbHVlIDMgYml0cyAqLworICB1bnNpZ25lZCBjaGFyIHBvc191bmtub3duOyAgICAgICAgLyogYWZ0ZXIgcmVzZXQgcG9zaXRpb24gdW5rbm93biAqLworICBpbnQgd3JpdGVfdGhyZXNob2xkOworICBpbnQgdGltZW91dDsJCQkvKiB0aW1lb3V0IGZvciBub3JtYWwgY29tbWFuZHMgKi8KKyAgaW50IGxvbmdfdGltZW91dDsJCS8qIHRpbWVvdXQgZm9yIGNvbW1hbmRzIGtub3duIHRvIHRha2UgbG9uZyB0aW1lKi8KKworICAvKiBNb2RlIGNoYXJhY3RlcmlzdGljcyAqLworICBzdHJ1Y3Qgc3RfbW9kZWRlZiBtb2Rlc1tTVF9OQlJfTU9ERVNdOworICBpbnQgY3VycmVudF9tb2RlOworCisgIC8qIFN0YXR1cyB2YXJpYWJsZXMgKi8KKyAgaW50IHBhcnRpdGlvbjsKKyAgaW50IG5ld19wYXJ0aXRpb247CisgIGludCBuYnJfcGFydGl0aW9uczsgICAgLyogemVybyB1bnRpbCBwYXJ0aXRpb24gc3VwcG9ydCBlbmFibGVkICovCisgIHN0cnVjdCBzdF9wYXJ0c3RhdCBwc1tTVF9OQlJfUEFSVElUSU9OU107CisgIHVuc2lnbmVkIGNoYXIgZGlydHk7CisgIHVuc2lnbmVkIGNoYXIgcmVhZHk7CisgIHVuc2lnbmVkIGNoYXIgd3JpdGVfcHJvdDsKKyAgdW5zaWduZWQgY2hhciBkcnZfd3JpdGVfcHJvdDsKKyAgdW5zaWduZWQgY2hhciBpbl91c2U7CisgIHVuc2lnbmVkIGNoYXIgYmxrc2l6ZV9jaGFuZ2VkOworICB1bnNpZ25lZCBjaGFyIGRlbnNpdHlfY2hhbmdlZDsKKyAgdW5zaWduZWQgY2hhciBjb21wcmVzc2lvbl9jaGFuZ2VkOworICB1bnNpZ25lZCBjaGFyIGRydl9idWZmZXI7CisgIHVuc2lnbmVkIGNoYXIgZGVuc2l0eTsKKyAgdW5zaWduZWQgY2hhciBkb29yX2xvY2tlZDsKKyAgdW5zaWduZWQgY2hhciByZXdfYXRfY2xvc2U7CisgIHVuc2lnbmVkIGNoYXIgaW5pdGVkOworICBpbnQgYmxvY2tfc2l6ZTsKKyAgaW50IG1pbl9ibG9jazsKKyAgaW50IG1heF9ibG9jazsKKyAgaW50IHJlY292ZXJfY291bnQ7ICAgICAgICAgICAgLyogZnJvbSB0YXBlIG9wZW5pbmcgKi8KKyAgaW50IGFib3J0X2NvdW50OworICBpbnQgd3JpdGVfY291bnQ7CisgIGludCByZWFkX2NvdW50OworICBpbnQgcmVjb3Zlcl9lcnJlZzsgICAgICAgICAgICAvKiBmcm9tIGxhc3Qgc3RhdHVzIGNhbGwgKi8KKyAgLyoKKyAgICogT25TdHJlYW0gc3BlY2lmaWMgZGF0YQorICAgKi8KKyAgaW50CSAgIG9zX2Z3X3JldjsJCQkgICAgICAgLyogdGhlIGZpcm13YXJlIHJldmlzaW9uICogMTAwMDAgKi8KKyAgdW5zaWduZWQgY2hhciAgcmF3OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZyBPblN0cmVhbSByYXcgYWNjZXNzICgzMi41S0IgYmxvY2sgc2l6ZSkgKi8KKyAgdW5zaWduZWQgY2hhciAgcG9sbDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZyB0aGF0IHRoaXMgZHJpdmUgbmVlZHMgcG9sbGluZyAoSURFfGZpcm13YXJlKSAqLworICB1bnNpZ25lZCBjaGFyICBmcmFtZV9pbl9idWZmZXI7CSAgICAgICAvKiBmbGFnIHRoYXQgdGhlIGZyYW1lIGFzIHBlciBmcmFtZV9zZXFfbnVtYmVyCisJCQkJCQkqIGhhcyBiZWVuIHJlYWQgaW50byBTVHAtPmJ1ZmZlciBhbmQgaXMgdmFsaWQgKi8KKyAgaW50ICAgICAgZnJhbWVfc2VxX251bWJlcjsgICAgICAgICAgICAgICAgICAgLyogbG9naWNhbCBmcmFtZSBudW1iZXIgKi8KKyAgaW50ICAgICAgbG9naWNhbF9ibGtfbnVtOyAgICAgICAgICAgICAgICAgICAgLyogbG9naWNhbCBibG9jayBudW1iZXIgKi8KKyAgdW5zaWduZWQgZmlyc3RfZnJhbWVfcG9zaXRpb247ICAgICAgICAgICAgICAgLyogcGh5c2ljYWwgZnJhbWUgdG8gYmUgdHJhbnNmZXJyZWQgdG8vZnJvbSBob3N0ICovCisgIHVuc2lnbmVkIGxhc3RfZnJhbWVfcG9zaXRpb247ICAgICAgICAgICAgICAgIC8qIHBoeXNpY2FsIGZyYW1lIHRvIGJlIHRyYW5zZmVyZCB0by9mcm9tIHRhcGUgKi8KKyAgaW50ICAgICAgY3VyX2ZyYW1lczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBudW1iZXIgb2YgZnJhbWVzIGluIGludGVybmFsIGJ1ZmZlciAqLworICBpbnQgICAgICBtYXhfZnJhbWVzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGZyYW1lcyBpbiBpbnRlcm5hbCBidWZmZXIgKi8KKyAgY2hhciAgICAgYXBwbGljYXRpb25fc2lnWzVdOyAgICAgICAgICAgICAgICAgLyogYXBwbGljYXRpb24gc2lnbmF0dXJlICovCisgIHVuc2lnbmVkIGNoYXIgIGZhc3Rfb3BlbjsgICAgICAgICAgICAgICAgICAgIC8qIGZsYWcgdGhhdCByZW1pbmRzIHVzIHdlIGRpZG4ndCBjaGVjayBoZWFkZXJzIGF0IG9wZW4gKi8KKyAgdW5zaWduZWQgc2hvcnQgd3J0X3Bhc3NfY250cjsgICAgICAgICAgICAgICAgLyogd3JpdGUgcGFzcyBjb3VudGVyICovCisgIGludCAgICAgIHVwZGF0ZV9mcmFtZV9jbnRyOyAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBmcmFtZSBjb3VudGVyICovCisgIGludCAgICAgIG9uc3RyZWFtX3dyaXRlX2Vycm9yOyAgICAgICAgICAgICAgIC8qIHdyaXRlIGVycm9yIHJlY292ZXJ5IGFjdGl2ZSAqLworICBpbnQgICAgICBoZWFkZXJfb2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoZWFkZXIgZnJhbWUgdmVyaWZpZWQgb2sgKi8KKyAgaW50ICAgICAgbGludXhfbWVkaWE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZGluZyBsaW51eC1zcGVjaWZjIG1lZGlhICovCisgIGludCAgICAgIGxpbnV4X21lZGlhX3ZlcnNpb247CisgIG9zX2hlYWRlcl90ICogaGVhZGVyX2NhY2hlOwkJICAgICAgIC8qIGNhY2hlIGlzIGtlcHQgZm9yIGZpbGVtYXJrIHBvc2l0aW9ucyAqLworICBpbnQgICAgICBmaWxlbWFya19jbnQ7CisgIGludCAgICAgIGZpcnN0X21hcmtfcHBvczsKKyAgaW50ICAgICAgbGFzdF9tYXJrX3Bwb3M7CisgIGludCAgICAgIGxhc3RfbWFya19sYm47CQkJLyogc3RvcmluZyBsb2dfYmxrX251bSBvZiBsYXN0IG1hcmsgaXMgZXh0ZW5kcyBBRFIgc3BlYyAqLworICBpbnQgICAgICBmaXJzdF9kYXRhX3Bwb3M7CisgIGludCAgICAgIGVvZF9mcmFtZV9wcG9zOworICBpbnQgICAgICBlb2RfZnJhbWVfbGZhOworICBpbnQgICAgICB3cml0ZV90eXBlOwkJCQkvKiB1c2VkIGluIHdyaXRlIGVycm9yIHJlY292ZXJ5ICovCisgIGludCAgICAgIHJlYWRfZXJyb3JfZnJhbWU7CQkJLyogdXNlZCBpbiByZWFkIGVycm9yIHJlY292ZXJ5ICovCisgIHVuc2lnbmVkIGxvbmcgY21kX3N0YXJ0X3RpbWU7CisgIHVuc2lnbmVkIGxvbmcgbWF4X2NtZF90aW1lOworCisjaWYgREVCVUcKKyAgdW5zaWduZWQgY2hhciB3cml0ZV9wZW5kaW5nOworICBpbnQgbmJyX2ZpbmlzaGVkOworICBpbnQgbmJyX3dhaXRzOworICB1bnNpZ25lZCBjaGFyIGxhc3RfY21uZFs2XTsKKyAgdW5zaWduZWQgY2hhciBsYXN0X3NlbnNlWzE2XTsKKyNlbmRpZgorICBzdHJ1Y3QgZ2VuZGlzayAqZHJpdmU7Cit9IDsKKworLyogVmFsdWVzIG9mIHdyaXRlX3R5cGUgKi8KKyNkZWZpbmUgT1NfV1JJVEVfREFUQSAgICAgIDAKKyNkZWZpbmUgT1NfV1JJVEVfRU9EICAgICAgIDEKKyNkZWZpbmUgT1NfV1JJVEVfTkVXX01BUksgIDIKKyNkZWZpbmUgT1NfV1JJVEVfTEFTVF9NQVJLIDMKKyNkZWZpbmUgT1NfV1JJVEVfSEVBREVSICAgIDQKKyNkZWZpbmUgT1NfV1JJVEVfRklMTEVSICAgIDUKKworLyogQWRkaXRpb25hbCBydyBzdGF0ZSAqLworI2RlZmluZSBPU19XUklUSU5HX0NPTVBMRVRFIDMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9vc3N0X2RldGVjdC5oIGIvZHJpdmVycy9zY3NpL29zc3RfZGV0ZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3MTdkMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9vc3N0X2RldGVjdC5oCkBAIC0wLDAgKzEsNiBAQAorI2RlZmluZSBTSUdTX0ZST01fT1NTVCBcCisgICAgICAgeyJPblN0cmVhbSIsICJTQy0iLCAiIiwgIm9zc3QifSwgXAorICAgICAgIHsiT25TdHJlYW0iLCAiREktIiwgIiIsICJvc3N0In0sIFwKKyAgICAgICB7Ik9uU3RyZWFtIiwgIkRQLSIsICIiLCAib3NzdCJ9LCBcCisgICAgICAgeyJPblN0cmVhbSIsICJGVy0iLCAiIiwgIm9zc3QifSwgXAorICAgICAgIHsiT25TdHJlYW0iLCAiVVNCIiwgIiIsICJvc3N0In0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9vc3N0X29wdGlvbnMuaCBiL2RyaXZlcnMvc2NzaS9vc3N0X29wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjFlNjEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL29zc3Rfb3B0aW9ucy5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICAgVGhlIGNvbXBpbGUtdGltZSBjb25maWd1cmFibGUgZGVmYXVsdHMgZm9yIHRoZSBMaW51eCBTQ1NJIHRhcGUgZHJpdmVyLgorCisgICBDb3B5cmlnaHQgMTk5NSBLYWkgTWFraXNhcmEuCisgICAKKyAgIExhc3QgbW9kaWZpZWQ6IFdlZCBTZXAgIDIgMjE6MjQ6MDcgMTk5OCBieSByb290QGhvbWUKKyAgIAorICAgQ2hhbmdlZCAoYW5kIHJlbmFtZWQpIGZvciBPblN0cmVhbSBTQ1NJIGRyaXZlcyBnYXJsb2ZmQHN1c2UuZGUKKyAgIDIwMDAtMDYtMjEKKworICAgJEhlYWRlcjogL2N2c3Jvb3Qvb3NzdC9Ecml2ZXIvb3NzdF9vcHRpb25zLmgsdiAxLjYgMjAwMy8xMi8yMyAxNDoyMjoxMiB3cmllZGUgRXhwICQKKyovCisKKyNpZm5kZWYgX09TU1RfT1BUSU9OU19ICisjZGVmaW5lIF9PU1NUX09QVElPTlNfSAorCisvKiBUaGUgbWluaW11bSBsaW1pdCBmb3IgdGhlIG51bWJlciBvZiBTQ1NJIHRhcGUgZGV2aWNlcyBpcyBkZXRlcm1pbmVkIGJ5CisgICBPU1NUX01BWF9UQVBFUy4gSWYgdGhlIG51bWJlciBvZiB0YXBlIGRldmljZXMgYW5kIHRoZSAic2xhY2siIGRlZmluZWQgYnkKKyAgIE9TU1RfRVhUUkFfREVWUyBleGNlZWRzIE9TU1RfTUFYX1RBUEVTLCB0aGUgbGFyZ2UgbnVtYmVyIGlzIHVzZWQuICovCisjZGVmaW5lIE9TU1RfTUFYX1RBUEVTIDQKKworLyogSWYgT1NTVF9JTl9GSUxFX1BPUyBpcyBub256ZXJvLCB0aGUgZHJpdmVyIHBvc2l0aW9ucyB0aGUgdGFwZSBhZnRlciB0aGUKKyAgIHJlY29yZCBiZWVuIHJlYWQgYnkgdGhlIHVzZXIgcHJvZ3JhbSBldmVuIGlmIHRoZSB0YXBlIGhhcyBtb3ZlZCBmdXJ0aGVyCisgICBiZWNhdXNlIG9mIGJ1ZmZlcmVkIHJlYWRzLiBTaG91bGQgYmUgc2V0IHRvIHplcm8gdG8gc3VwcG9ydCBhbHNvIGRyaXZlcworICAgdGhhdCBjYW4ndCBzcGFjZSBiYWNrd2FyZHMgb3ZlciByZWNvcmRzLiBOT1RFOiBUaGUgdGFwZSB3aWxsIGJlCisgICBzcGFjZWQgYmFja3dhcmRzIG92ZXIgYW4gImFjY2lkZW50YWxseSIgY3Jvc3NlZCBmaWxlbWFyayBpbiBhbnkgY2FzZS4gKi8KKyNkZWZpbmUgT1NTVF9JTl9GSUxFX1BPUyAxCisKKy8qIFRoZSB0YXBlIGRyaXZlciBidWZmZXIgc2l6ZSBpbiBraWxvYnl0ZXMuICovCisvKiBEb24ndCBjaGFuZ2UsIGFzIHRoaXMgaXMgdGhlIEhXIGJsb2Nrc2l6ZSAqLworI2RlZmluZSBPU1NUX0JVRkZFUl9CTE9DS1MgMzIKKworLyogVGhlIG51bWJlciBvZiBraWxvYnl0ZXMgb2YgZGF0YSBpbiB0aGUgYnVmZmVyIHRoYXQgdHJpZ2dlcnMgYW4KKyAgIGFzeW5jaHJvbm91cyB3cml0ZSBpbiBmaXhlZCBibG9jayBtb2RlLiBTZWUgYWxzbyBPU1NUX0FTWU5DX1dSSVRFUworICAgYmVsb3cuICovCisjZGVmaW5lIE9TU1RfV1JJVEVfVEhSRVNIT0xEX0JMT0NLUyAzMgorCisvKiBPU1NUX0VPTV9SRVNFUlZFIGRlZmluZXMgdGhlIG51bWJlciBvZiBmcmFtZXMgYXJlIGtlcHQgaW4gcmVzZXJ2ZSBmb3IKKyAqICAqIHdyaXRlIGVycm9yIHJlY292ZXJ5IHdoZW4gd3JpdGluZyBuZWFyIGVuZCBvZiBtZWRpdW0uIEVOT1NQQyBpcyByZXR1cm5lZAorICogICAqIHdoZW4gd3JpdGUoKSBpcyBjYWxsZWQgYW5kIHRoZSB0YXBlIHdyaXRlIHBvc2l0aW9uIGlzIHdpdGhpbiB0aGlzIG51bWJlcgorICogICAgKiBvZiBibG9ja3MgZnJvbSB0aGUgdGFwZSBjYXBhY2l0eS4gKi8KKyNkZWZpbmUgT1NTVF9FT01fUkVTRVJWRSAzMDAKKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRhcGUgYnVmZmVycyB0aGUgZHJpdmVyIGFsbG9jYXRlcy4gVGhlIG51bWJlcgorICAgaXMgYWxzbyBjb25zdHJhaW5lZCBieSB0aGUgbnVtYmVyIG9mIGRyaXZlcyBkZXRlY3RlZC4gRGV0ZXJtaW5lcyB0aGUKKyAgIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnRseSBhY3RpdmUgdGFwZSBkcml2ZXMuICovCisjZGVmaW5lIE9TU1RfTUFYX0JVRkZFUlMgT1NTVF9NQVhfVEFQRVMgCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHNjYXR0ZXIvZ2F0aGVyIHNlZ21lbnRzICovCisvKiBGaXQgb25lIGJ1ZmZlciBpbiBwYWdlcyBhbmQgYWRkIG9uZSBmb3IgdGhlIEFVWCBoZWFkZXIgKi8KKyNkZWZpbmUgT1NTVF9NQVhfU0cgICAgICAoKChPU1NUX0JVRkZFUl9CTE9DS1MqMTAyNCkgLyBQQUdFX1NJWkUpICsgMSkKKworLyogVGhlIG51bWJlciBvZiBzY2F0dGVyL2dhdGhlciBzZWdtZW50cyB0byBhbGxvY2F0ZSBhdCBmaXJzdCB0cnkgKG11c3QgYmUKKyAgIHNtYWxsZXIgb3IgZXF1YWwgdG8gdGhlIG1heGltdW0pLiAqLworI2RlZmluZSBPU1NUX0ZJUlNUX1NHICAgICgoT1NTVF9CVUZGRVJfQkxPQ0tTKjEwMjQpIC8gUEFHRV9TSVpFKQorCisvKiBUaGUgc2l6ZSBvZiB0aGUgZmlyc3Qgc2NhdHRlci9nYXRoZXIgc2VnbWVudHMgKGRldGVybWluZXMgdGhlIG1heGltdW0gYmxvY2sKKyAgIHNpemUgZm9yIFNDU0kgYWRhcHRlcnMgbm90IHN1cHBvcnRpbmcgc2NhdHRlci9nYXRoZXIpLiBUaGUgZGVmYXVsdCBpcyBzZXQKKyAgIHRvIHRyeSB0byBhbGxvY2F0ZSB0aGUgYnVmZmVyIGFzIG9uZSBjaHVuay4gKi8KKyNkZWZpbmUgT1NTVF9GSVJTVF9PUkRFUiAgKDE1LVBBR0VfU0hJRlQpCisKKworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBkZWZpbmUgZGVmYXVsdHMgZm9yIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgc2V0CisgICBzZXBhcmF0ZWx5IGZvciBlYWNoIGRyaXZlIHVzaW5nIHRoZSBNVFNUT1BUSU9OUyBpb2N0bC4gKi8KKworLyogSWYgT1NTVF9UV09fRk0gaXMgbm9uLXplcm8sIHRoZSBkcml2ZXIgd3JpdGVzIHR3byBmaWxlbWFya3MgYWZ0ZXIgYQorICAgZmlsZSBiZWluZyB3cml0dGVuLiBTb21lIGRyaXZlcyBjYW4ndCBoYW5kbGUgdHdvIGZpbGVtYXJrcyBhdCB0aGUKKyAgIGVuZCBvZiBkYXRhLiAqLworI2RlZmluZSBPU1NUX1RXT19GTSAwCisKKy8qIElmIE9TU1RfQlVGRkVSX1dSSVRFUyBpcyBub24temVybywgd3JpdGVzIGluIGZpeGVkIGJsb2NrIG1vZGUgYXJlCisgICBidWZmZXJlZCB1bnRpbCB0aGUgZHJpdmVyIGJ1ZmZlciBpcyBmdWxsIG9yIGFzeW5jaHJvbm91cyB3cml0ZSBpcworICAgdHJpZ2dlcmVkLiAqLworI2RlZmluZSBPU1NUX0JVRkZFUl9XUklURVMgMQorCisvKiBJZiBPU1NUX0FTWU5DX1dSSVRFUyBpcyBub24temVybywgdGhlIFNDU0kgd3JpdGUgY29tbWFuZCBtYXkgYmUgc3RhcnRlZAorICAgd2l0aG91dCB3YWl0aW5nIGZvciBpdCB0byBmaW5pc2guIE1heSBjYXVzZSBwcm9ibGVtcyBpbiBtdWx0aXBsZQorICAgdGFwZSBiYWNrdXBzLiAqLworI2RlZmluZSBPU1NUX0FTWU5DX1dSSVRFUyAxCisKKy8qIElmIE9TU1RfUkVBRF9BSEVBRCBpcyBub24temVybywgYmxvY2tzIGFyZSByZWFkIGFoZWFkIGluIGZpeGVkIGJsb2NrCisgICBtb2RlLiAqLworI2RlZmluZSBPU1NUX1JFQURfQUhFQUQgMQorCisvKiBJZiBPU1NUX0FVVE9fTE9DSyBpcyBub24temVybywgdGhlIGRyaXZlIGRvb3IgaXMgbG9ja2VkIGF0IHRoZSBmaXJzdAorICAgcmVhZCBvciB3cml0ZSBjb21tYW5kIGFmdGVyIHRoZSBkZXZpY2UgaXMgb3BlbmVkLiBUaGUgZG9vciBpcyBvcGVuZWQKKyAgIHdoZW4gdGhlIGRldmljZSBpcyBjbG9zZWQuICovCisjZGVmaW5lIE9TU1RfQVVUT19MT0NLIDAKKworLyogSWYgT1NTVF9GQVNUX01URU9NIGlzIG5vbi16ZXJvLCB0aGUgTVRFT00gaW9jdGwgaXMgZG9uZSB1c2luZyB0aGUKKyAgIGRpcmVjdCBTQ1NJIGNvbW1hbmQuIFRoZSBmaWxlIG51bWJlciBzdGF0dXMgaXMgbG9zdCBidXQgdGhpcyBtZXRob2QKKyAgIGlzIGZhc3Qgd2l0aCBzb21lIGRyaXZlcy4gT3RoZXJ3aXNlIE1URU9NIGlzIGRvbmUgYnkgc3BhY2luZyBvdmVyCisgICBmaWxlcyBhbmQgdGhlIGZpbGUgbnVtYmVyIHN0YXR1cyBpcyByZXRhaW5lZC4gKi8KKyNkZWZpbmUgT1NTVF9GQVNUX01URU9NIDAKKworLyogSWYgT1NTVF9TQ1NJMkxPR0lDQUwgaXMgbm9uemVybywgdGhlIGxvZ2ljYWwgYmxvY2sgYWRkcmVzc2VzIGFyZSB1c2VkIGZvcgorICAgTVRJT0NQT1MgYW5kIE1UU0VFSyBieSBkZWZhdWx0LiBWZW5kb3IgYWRkcmVzc2VzIGFyZSB1c2VkIGlmIE9TU1RfU0NTSTJMT0dJQ0FMCisgICBpcyB6ZXJvLiAqLworI2RlZmluZSBPU1NUX1NDU0kyTE9HSUNBTCAwCisKKy8qIElmIE9TU1RfU1lTViBpcyBub24temVybywgdGhlIHRhcGUgYmVoYXZlcyBhY2NvcmRpbmcgdG8gdGhlIFNZUyBWIHNlbWFudGljcy4KKyAgIFRoZSBkZWZhdWx0IGlzIEJTRCBzZW1hbnRpY3MuICovCisjZGVmaW5lIE9TU1RfU1lTViAwCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGFzMTYuYyBiL2RyaXZlcnMvc2NzaS9wYXMxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MGRlZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcGFzMTYuYwpAQCAtMCwwICsxLDYzOSBAQAorI2RlZmluZSBBVVRPU0VOU0UKKyNkZWZpbmUgUFNFVURPX0RNQQorI2RlZmluZSBGT08KKyNkZWZpbmUgVU5TQUZFICAvKiBOb3QgdW5zYWZlIGZvciBQQVMxNiAtLSB1c2UgaXQgKi8KKworLyoKKyAqIFRoaXMgZHJpdmVyIGFkYXB0ZWQgZnJvbSBEcmV3IEVja2hhcmR0J3MgVHJhbnRvciBUMTI4IGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAxOTkzLCBEcmV3IEVja2hhcmR0CisgKglWaXNpb25hcnkgQ29tcHV0aW5nCisgKgkoVW5peCBhbmQgTGludXggY29uc3VsdGluZyBhbmQgY3VzdG9tIHByb2dyYW1taW5nKQorICoJZHJld0Bjb2xvcmFkby5lZHUKKyAqICAgICAgKzEgKDMwMykgNjY2LTU4MzYKKyAqCisgKiAgKCBCYXNlZCBvbiBUMTI4IC0gRElTVFJJQlVUSU9OIFJFTEVBU0UgMy4gKSAKKyAqCisgKiBNb2RpZmllZCB0byB3b3JrIHdpdGggdGhlIFBybyBBdWRpbyBTcGVjdHJ1bS9TdHVkaW8gMTYKKyAqIGJ5IEpvaG4gV2VpZG1hbi4KKyAqCisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0IAorICoKKyAqIE1lZGlhIFZpc2lvbgorICogKDUxMCkgNzcwLTg2MDAKKyAqICg4MDApIDM0OC03MTE2CisgKiAKKyAqIGFuZCAKKyAqCisgKiBOQ1IgNTM4MCBGYW1pbHkKKyAqIFNDU0kgUHJvdG9jb2wgQ29udHJvbGxlcgorICogRGF0YWJvb2sKKyAqCisgKiBOQ1IgTWljcm9lbGVjdHJvbmljcworICogMTYzNSBBZXJvcGxhemEgRHJpdmUKKyAqIENvbG9yYWRvIFNwcmluZ3MsIENPIDgwOTE2CisgKiAxKyAoNzE5KSA1NzgtMzQwMAorICogMSsgKDgwMCkgMzM0LTU0NTQKKyAqLworCisvKgorICogT3B0aW9ucyA6IAorICogQVVUT1NFTlNFIC0gaWYgZGVmaW5lZCwgUkVRVUVTVCBTRU5TRSB3aWxsIGJlIHBlcmZvcm1lZCBhdXRvbWF0aWNhbGx5CisgKiAgICAgIGZvciBjb21tYW5kcyB0aGF0IHJldHVybiB3aXRoIGEgQ0hFQ0sgQ09ORElUSU9OIHN0YXR1cy4gCisgKgorICogTElNSVRfVFJBTlNGRVJTSVpFIC0gaWYgZGVmaW5lZCwgbGltaXQgdGhlIHBzZXVkby1kbWEgdHJhbnNmZXJzIHRvIDUxMgorICogICAgICBieXRlcyBhdCBhIHRpbWUuICBTaW5jZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0IGR1cmluZworICogICAgICB0aGVzZSB0cmFuc2ZlcnMsIHdlIG1pZ2h0IG5lZWQgdGhpcyB0byBnaXZlIHJlYXNvbmFibGUgaW50ZXJydXB0CisgKiAgICAgIHNlcnZpY2UgdGltZSBpZiB0aGUgdHJhbnNmZXIgc2l6ZSBnZXRzIHRvbyBsYXJnZS4KKyAqCisgKiBQU0VVRE9fRE1BIC0gZW5hYmxlcyBQU0VVRE8tRE1BIGhhcmR3YXJlLCBzaG91bGQgZ2l2ZSBhIDMtNFggcGVyZm9ybWFuY2UKKyAqIGluY3JlYXNlIGNvbXBhcmVkIHRvIHBvbGxlZCBJL08uCisgKgorICogUEFSSVRZIC0gZW5hYmxlIHBhcml0eSBjaGVja2luZy4gIE5vdCBzdXBwb3J0ZWQuCisgKiAKKyAqIFNDU0kyIC0gZW5hYmxlIHN1cHBvcnQgZm9yIFNDU0ktSUkgdGFnZ2VkIHF1ZXVlaW5nLiAgVW50ZXN0ZWQuCisgKgorICogVU5TQUZFIC0gbGVhdmUgaW50ZXJydXB0cyBlbmFibGVkIGR1cmluZyBwc2V1ZG8tRE1BIHRyYW5zZmVycy4gIFRoaXMKKyAqCSAgICBwYXJhbWV0ZXIgY29tZXMgZnJvbSB0aGUgTkNSNTM4MCBjb2RlLiAgSXQgaXMgTk9UIHVuc2FmZSB3aXRoCisgKgkgICAgdGhlIFBBUzE2IGFuZCB5b3Ugc2hvdWxkIHVzZSBpdC4gIElmIHlvdSBkb24ndCB5b3Ugd2lsbCBoYXZlCisgKgkgICAgYSBwcm9ibGVtIHdpdGggZHJvcHBlZCBjaGFyYWN0ZXJzIGR1cmluZyBoaWdoIHNwZWVkCisgKgkgICAgY29tbXVuaWNhdGlvbnMgZHVyaW5nIFNDU0kgdHJhbnNmZXJzLiAgSWYgeW91IHJlYWxseSBkb24ndAorICoJICAgIHdhbnQgdG8gdXNlIFVOU0FGRSB5b3UgY2FuIHRyeSBkZWZpbmluZyBMSU1JVF9UUkFOU0ZFUlNJWkUgb3IKKyAqCSAgICB0d2lkZGxlIHdpdGggdGhlIHRyYW5zZmVyIHNpemUgaW4gdGhlIGhpZ2ggbGV2ZWwgY29kZS4KKyAqCisgKiBVU0xFRVAgLSBlbmFibGUgc3VwcG9ydCBmb3IgZGV2aWNlcyB0aGF0IGRvbid0IGRpc2Nvbm5lY3QuICBVbnRlc3RlZC4KKyAqCisgKiBUaGUgY2FyZCBpcyBkZXRlY3RlZCBhbmQgaW5pdGlhbGl6ZWQgaW4gb25lIG9mIHNldmVyYWwgd2F5cyA6IAorICogMS4gIEF1dG9wcm9iZSAoZGVmYXVsdCkgLSBUaGVyZSBhcmUgbWFueSBkaWZmZXJlbnQgbW9kZWxzIG9mCisgKiAgICAgdGhlIFBybyBBdWRpbyBTcGVjdHJ1bS9TdHVkaW8gMTYsIGFuZCBJIG9ubHkgaGF2ZSBvbmUgb2YKKyAqICAgICB0aGVtLCBzbyB0aGlzIG1heSByZXF1aXJlIGEgbGl0dGxlIHR3ZWFraW5nLiAgQW4gaW50ZXJydXB0CisgKiAgICAgaXMgdHJpZ2dlcmVkIHRvIGF1dG9wcm9iZSBmb3IgdGhlIGludGVycnVwdCBsaW5lLiAgTm90ZToKKyAqICAgICB3aXRoIHRoZSBuZXdlciBtb2RlbCBib2FyZHMsIHRoZSBpbnRlcnJ1cHQgaXMgc2V0IHZpYQorICogICAgIHNvZnR3YXJlIGFmdGVyIHJlc2V0IHVzaW5nIHRoZSBkZWZhdWx0X2lycSBmb3IgdGhlCisgKiAgICAgY3VycmVudCBib2FyZCBudW1iZXIuCisgKgorICogMi4gIFdpdGggY29tbWFuZCBsaW5lIG92ZXJyaWRlcyAtIHBhczE2PXBvcnQsaXJxIG1heSBiZSAKKyAqICAgICB1c2VkIG9uIHRoZSBMSUxPIGNvbW1hbmQgbGluZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMuCisgKgorICogMy4gIFdpdGggdGhlIFBBUzE2X09WRVJSSURFIGNvbXBpbGUgdGltZSBkZWZpbmUuICBUaGlzIGlzIAorICogICAgIHNwZWNpZmllZCBhcyBhbiBhcnJheSBvZiBhZGRyZXNzLCBpcnEgdHVwbGVzLiAgSWUsIGZvcgorICogICAgIG9uZSBib2FyZCBhdCB0aGUgZGVmYXVsdCAweDM4OCBhZGRyZXNzLCBJUlExMCwgSSBjb3VsZCBzYXkgCisgKiAgICAgLURQQVMxNl9PVkVSUklERT17ezB4Mzg4LCAxMH19CisgKiAgICAgTk9URTogIFVudGVzdGVkLgorICoJCisgKiA0LiAgV2hlbiBpbmNsdWRlZCBhcyBhIG1vZHVsZSwgd2l0aCBhcmd1bWVudHMgcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmU6CisgKiAgICAgICAgIHBhczE2X2lycT14eAkJdGhlIGludGVycnVwdAorICogICAgICAgICBwYXMxNl9hZGRyPXh4CXRoZSBwb3J0CisgKiAgICAgZS5nLiAibW9kcHJvYmUgcGFzMTYgcGFzMTZfYWRkcj0weDM4OCBwYXMxNl9pcnE9NSIKKyAqCisgKiAgICAgTm90ZSB0aGF0IGlmIHRoZSBvdmVycmlkZSBtZXRob2RzIGFyZSB1c2VkLCBwbGFjZSBob2xkZXJzIG11c3QKKyAqICAgICBiZSBzcGVjaWZpZWQgZm9yIG90aGVyIGJvYXJkcyBpbiB0aGUgc3lzdGVtLgorICoKKyAqCisgKiBDb25maWd1cmF0aW9uIG5vdGVzIDoKKyAqICAgVGhlIGN1cnJlbnQgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgaW50ZXJydXB0IHNoYXJpbmcgd2l0aCB0aGUKKyAqICAgc291bmQgcG9ydGlvbiBvZiB0aGUgY2FyZC4gIElmIHlvdSB1c2UgdGhlIHNhbWUgaXJxIGZvciB0aGUKKyAqICAgc2NzaSBwb3J0IGFuZCBzb3VuZCB5b3Ugd2lsbCBoYXZlIHByb2JsZW1zLiAgRWl0aGVyIHVzZQorICogICBhIGRpZmZlcmVudCBpcnEgZm9yIHRoZSBzY3NpIHBvcnQgb3IgZG9uJ3QgdXNlIGludGVycnVwdHMKKyAqICAgZm9yIHRoZSBzY3NpIHBvcnQuCisgKgorICogICBJZiB5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIHlvdXIgY2FyZCBub3QgYmVpbmcgcmVjb2duaXplZCwgdXNlCisgKiAgIHRoZSBMSUxPIGNvbW1hbmQgbGluZSBvdmVycmlkZS4gIFRyeSB0byBnZXQgaXQgcmVjb2duaXplZCB3aXRob3V0CisgKiAgIGludGVycnVwdHMuICBJZSwgZm9yIGEgYm9hcmQgYXQgdGhlIGRlZmF1bHQgMHgzODggYmFzZSBwb3J0LAorICogICBib290OiBsaW51eCBwYXMxNj0weDM4OCwyNTUKKyAqCisgKiAgIFNDU0lfSVJRX05PTkUgKDI1NSkgc2hvdWxkIGJlIHNwZWNpZmllZCBmb3Igbm8gaW50ZXJydXB0LAorICogICBJUlFfQVVUTyAoMjU0KSB0byBhdXRvcHJvYmUgZm9yIGFuIElSUSBsaW5lIGlmIG92ZXJyaWRkZW4KKyAqICAgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAqCisgKiAgIChJUlFfQVVUTyA9PSAyNTQsIFNDU0lfSVJRX05PTkUgPT0gMjU1IGluIE5DUjUzODAuaCkKKyAqLworIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJwYXMxNi5oIgorI2RlZmluZSBBVVRPUFJPQkVfSVJRCisjaW5jbHVkZSAiTkNSNTM4MC5oIgorCisKK3N0YXRpYyBpbnQgcGFzX21heGkgPSAwOworc3RhdGljIGludCBwYXNfd21heGkgPSAwOworc3RhdGljIHVuc2lnbmVkIHNob3J0IHBhczE2X2FkZHIgPSAwOworc3RhdGljIGludCBwYXMxNl9pcnEgPSAwOworIAorCitpbnQgc2NzaV9pcnFfdHJhbnNsYXRlW10gPQorCXsgMCwgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsIDAsICAwLCAgNywgIDgsICA5LCAgMCwgMTAsIDExIH07CisKKy8qIFRoZSBkZWZhdWx0X2lycXMgYXJyYXkgY29udGFpbnMgdmFsdWVzIHVzZWQgdG8gc2V0IHRoZSBpcnEgaW50byB0aGUKKyAqIGJvYXJkIHZpYSBzb2Z0d2FyZSAoYXMgbXVzdCBiZSBkb25lIG9uIG5ld2VyIG1vZGVsIGJvYXJkcyB3aXRob3V0CisgKiBpcnEganVtcGVycyBvbiB0aGUgYm9hcmQpLiAgVGhlIGZpcnN0IHZhbHVlIGluIHRoZSBhcnJheSB3aWxsIGJlCisgKiBhc3NpZ25lZCB0byBsb2dpY2FsIGJvYXJkIDAsIHRoZSBuZXh0IHRvIGJvYXJkIDEsIGV0Yy4KKyAqLworaW50IGRlZmF1bHRfaXJxc1tdIF9faW5pdGRhdGEgPSAKKwl7ICBQQVMxNl9ERUZBVUxUX0JPQVJEXzFfSVJRLAorCSAgIFBBUzE2X0RFRkFVTFRfQk9BUkRfMl9JUlEsCisJICAgUEFTMTZfREVGQVVMVF9CT0FSRF8zX0lSUSwKKwkgICBQQVMxNl9ERUZBVUxUX0JPQVJEXzRfSVJRCisJfTsKKworc3RhdGljIHN0cnVjdCBvdmVycmlkZSB7CisgICAgdW5zaWduZWQgc2hvcnQgaW9fcG9ydDsKKyAgICBpbnQgIGlycTsKK30gb3ZlcnJpZGVzIAorI2lmZGVmIFBBUzE2X09WRVJSSURFCisgICAgW10gX19pbml0ZGF0YSA9IFBBUzE2X09WRVJSSURFOworI2Vsc2UKKyAgICBbNF0gX19pbml0ZGF0YSA9IHt7MCxJUlFfQVVUT30sIHswLElSUV9BVVRPfSwgezAsSVJRX0FVVE99LAorCXswLElSUV9BVVRPfX07CisjZW5kaWYKKworI2RlZmluZSBOT19PVkVSUklERVMgKHNpemVvZihvdmVycmlkZXMpIC8gc2l6ZW9mKHN0cnVjdCBvdmVycmlkZSkpCisKK3N0YXRpYyBzdHJ1Y3QgYmFzZSB7CisgICAgdW5zaWduZWQgc2hvcnQgaW9fcG9ydDsKKyAgICBpbnQgbm9hdXRvOworfSBiYXNlc1tdIF9faW5pdGRhdGEgPSAKKwl7IHtQQVMxNl9ERUZBVUxUX0JBU0VfMSwgMH0sCisJICB7UEFTMTZfREVGQVVMVF9CQVNFXzIsIDB9LAorCSAge1BBUzE2X0RFRkFVTFRfQkFTRV8zLCAwfSwKKwkgIHtQQVMxNl9ERUZBVUxUX0JBU0VfNCwgMH0KKwl9OworCisjZGVmaW5lIE5PX0JBU0VTIChzaXplb2YgKGJhc2VzKSAvIHNpemVvZiAoc3RydWN0IGJhc2UpKQorCit1bnNpZ25lZCBzaG9ydCAgcGFzMTZfb2Zmc2V0WyA4IF0gPQorICAgIHsKKwkweDFjMDAsICAgIC8qIE9VVFBVVF9EQVRBX1JFRyAqLworCTB4MWMwMSwgICAgLyogSU5JVElBVE9SX0NPTU1BTkRfUkVHICovCisJMHgxYzAyLCAgICAvKiBNT0RFX1JFRyAqLworCTB4MWMwMywgICAgLyogVEFSR0VUX0NPTU1BTkRfUkVHICovCisJMHgzYzAwLCAgICAvKiBTVEFUVVNfUkVHIHJvLCBTRUxFQ1RfRU5BQkxFX1JFRyB3byAqLworCTB4M2MwMSwgICAgLyogQlVTX0FORF9TVEFUVVNfUkVHIHJvLCBTVEFSVF9ETUFfU0VORF9SRUcgd28gKi8KKwkweDNjMDIsICAgIC8qIElOUFVUX0RBVEFfUkVHSVNURVIgcm8sIChOL0Egb24gUEFTMTYgPykKKwkJICAgICogU1RBUlRfRE1BX1RBUkdFVF9SRUNFSVZFX1JFRyB3bworCQkgICAgKi8KKwkweDNjMDMsICAgIC8qIFJFU0VUX1BBUklUWV9JTlRFUlJVUFRfUkVHIHJvLAorCQkgICAgKiBTVEFSVF9ETUFfSU5JVElBVE9SX1JFQ0VJVkVfUkVHIHdvCisJCSAgICAqLworICAgIH07CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogdGhlIGZvbGxvd2luZyB3aWxsIHNldCB0aGUgbW9uaXRvciBib3JkZXIgY29sb3IgKHVzZWZ1bCB0byBmaW5kCisgd2hlcmUgc29tZXRoaW5nIGNyYXNoZWQgb3IgZ2V0cyBzdHVjayBhdCAqLworLyogMSA9IGJsdWUKKyAyID0gZ3JlZW4KKyAzID0gY3lhbgorIDQgPSByZWQKKyA1ID0gbWFnZW50YQorIDYgPSB5ZWxsb3cKKyA3ID0gd2hpdGUKKyovCisjaWYgMQorI2RlZmluZSBydHJjKGkpIHtpbmIoMHgzZGEpOyBvdXRiKDB4MzEsIDB4M2MwKTsgb3V0YigoaSksIDB4M2MwKTt9CisjZWxzZQorI2RlZmluZSBydHJjKGkpIHt9CisjZW5kaWYKKworCisvKgorICogRnVuY3Rpb24gOiBlbmFibGVfYm9hcmQoIGludCAgYm9hcmRfbnVtLCB1bnNpZ25lZCBzaG9ydCBwb3J0ICkKKyAqCisgKiBQdXJwb3NlIDogIHNldCBhZGRyZXNzIGluIG5ldyBtb2RlbCBib2FyZAorICoKKyAqIElucHV0cyA6IGJvYXJkX251bSAtIGxvZ2ljYWwgYm9hcmQgbnVtYmVyIDAtMywgcG9ydCAtIGJhc2UgYWRkcmVzcworICoKKyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQKKwllbmFibGVfYm9hcmQoIGludCAgYm9hcmRfbnVtLCAgdW5zaWduZWQgc2hvcnQgcG9ydCApCit7CisgICAgb3V0YiggMHhiYyArIGJvYXJkX251bSwgTUFTVEVSX0FERFJFU1NfUFRSICk7CisgICAgb3V0YiggcG9ydCA+PiAyLCBNQVNURVJfQUREUkVTU19QVFIgKTsKK30KKworCisKKy8qCisgKiBGdW5jdGlvbiA6IGluaXRfYm9hcmQoIHVuc2lnbmVkIHNob3J0IHBvcnQsIGludCBpcnEgKQorICoKKyAqIFB1cnBvc2UgOiAgU2V0IHRoZSBib2FyZCB1cCB0byBoYW5kbGUgdGhlIFNDU0kgaW50ZXJmYWNlCisgKgorICogSW5wdXRzIDogcG9ydCAtIGJhc2UgYWRkcmVzcyBvZiB0aGUgYm9hcmQsCisgKgkgICAgaXJxIC0gaXJxIHRvIGFzc2lnbiB0byB0aGUgU0NTSSBwb3J0CisgKgkgICAgZm9yY2VfaXJxIC0gc2V0IGl0IGV2ZW4gaWYgaXQgY29uZmxpY3RzIHdpdGggc291bmQgZHJpdmVyCisgKgorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCAKKwlpbml0X2JvYXJkKCB1bnNpZ25lZCBzaG9ydCBpb19wb3J0LCBpbnQgaXJxLCBpbnQgZm9yY2VfaXJxICkKK3sKKwl1bnNpZ25lZCBpbnQJdG1wOworCXVuc2lnbmVkIGludAlwYXNfaXJxX2NvZGU7CisKKwkvKiBJbml0aWFsaXplIHRoZSBTQ1NJIHBhcnQgb2YgdGhlIGJvYXJkICovCisKKwlvdXRiKCAweDMwLCBpb19wb3J0ICsgUF9USU1FT1VUX0NPVU5URVJfUkVHICk7ICAvKiBUaW1lb3V0IGNvdW50ZXIgKi8KKwlvdXRiKCAweDAxLCBpb19wb3J0ICsgUF9USU1FT1VUX1NUQVRVU19SRUdfT0ZGU0VUICk7ICAgLyogUmVzZXQgVEMgKi8KKwlvdXRiKCAweDAxLCBpb19wb3J0ICsgV0FJVF9TVEFURSApOyAgIC8qIDEgV2FpdCBzdGF0ZSAqLworCisJTkNSNTM4MF9yZWFkKCBSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyApOworCisJLyogU2V0IHRoZSBTQ1NJIGludGVycnVwdCBwb2ludGVyIHdpdGhvdXQgbXVja2luZyB1cCB0aGUgc291bmQKKwkgKiBpbnRlcnJ1cHQgcG9pbnRlciBpbiB0aGUgc2FtZSBieXRlLgorCSAqLworCXBhc19pcnFfY29kZSA9ICggaXJxIDwgMTYgKSA/IHNjc2lfaXJxX3RyYW5zbGF0ZVtpcnFdIDogMDsKKwl0bXAgPSBpbmIoIGlvX3BvcnQgKyBJT19DT05GSUdfMyApOworCisJaWYoICgoIHRtcCAmIDB4MGYgKSA9PSBwYXNfaXJxX2NvZGUpICYmIHBhc19pcnFfY29kZSA+IDAgCisJICAgICYmICFmb3JjZV9pcnEgKQorCXsKKwkgICAgcHJpbnRrKCAicGFzMTY6IFdBUk5JTkc6IENhbid0IHVzZSBzYW1lIGlycSBhcyBzb3VuZCAiCisJCSAgICAiZHJpdmVyIC0tIGludGVycnVwdHMgZGlzYWJsZWRcbiIgKTsKKwkgICAgLyogU2V0IHVwIHRoZSBkcml2ZSBwYXJhbWV0ZXJzLCBkaXNhYmxlIDUzODAgaW50ZXJydXB0cyAqLworCSAgICBvdXRiKCAweDRkLCBpb19wb3J0ICsgU1lTX0NPTkZJR180ICk7CisJfQorCWVsc2UKKwl7CisJICAgIHRtcCA9ICggIHRtcCAmIDB4MGYgKSB8ICggcGFzX2lycV9jb2RlIDw8IDQgKTsKKwkgICAgb3V0YiggdG1wLCBpb19wb3J0ICsgSU9fQ09ORklHXzMgKTsKKworCSAgICAvKiBTZXQgdXAgdGhlIGRyaXZlIHBhcmFtZXRlcnMgYW5kIGVuYWJsZSA1MzgwIGludGVycnVwdHMgKi8KKwkgICAgb3V0YiggMHg2ZCwgaW9fcG9ydCArIFNZU19DT05GSUdfNCApOworCX0KK30KKworCisvKgorICogRnVuY3Rpb24gOiBwYXMxNl9od19kZXRlY3QoIHVuc2lnbmVkIHNob3J0IGJvYXJkX251bSApCisgKgorICogUHVycG9zZSA6IGRldGVybWluZSBpZiBhIHBhczE2IGJvYXJkIGlzIHByZXNlbnQKKyAqIAorICogSW5wdXRzIDogYm9hcmRfbnVtIC0gbG9naWNhbCBib2FyZCBudW1iZXIgKCAwIC0gMyApCisgKgorICogUmV0dXJucyA6IDAgaWYgYm9hcmQgbm90IGZvdW5kLCAxIGlmIGZvdW5kLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IAorICAgICBwYXMxNl9od19kZXRlY3QoIHVuc2lnbmVkIHNob3J0ICBib2FyZF9udW0gKQoreworICAgIHVuc2lnbmVkIGNoYXIJYm9hcmRfcmV2LCB0bXA7CisgICAgdW5zaWduZWQgc2hvcnQJaW9fcG9ydCA9IGJhc2VzWyBib2FyZF9udW0gXS5pb19wb3J0OworCisgICAgLyogU2VlIGlmIHdlIGNhbiBmaW5kIGEgUEFTMTYgYm9hcmQgYXQgdGhlIGFkZHJlc3MgYXNzb2NpYXRlZAorICAgICAqIHdpdGggdGhpcyBsb2dpY2FsIGJvYXJkIG51bWJlci4KKyAgICAgKi8KKworICAgIC8qIEZpcnN0LCBhdHRlbXB0IHRvIHRha2UgYSBuZXdlciBtb2RlbCBib2FyZCBvdXQgb2YgcmVzZXQgYW5kCisgICAgICogZ2l2ZSBpdCBhIGJhc2UgYWRkcmVzcy4gIFRoaXMgc2hvdWxkbid0IGFmZmVjdCBvbGRlciBib2FyZHMuCisgICAgICovCisgICAgZW5hYmxlX2JvYXJkKCBib2FyZF9udW0sIGlvX3BvcnQgKTsKKworICAgIC8qIE5vdyBzZWUgaWYgaXQgbG9va3MgbGlrZSBhIFBBUzE2IGJvYXJkICovCisgICAgYm9hcmRfcmV2ID0gaW5iKCBpb19wb3J0ICsgUENCX0NPTkZJRyApOworCisgICAgaWYoIGJvYXJkX3JldiA9PSAweGZmICkKKwlyZXR1cm4gMDsKKworICAgIHRtcCA9IGJvYXJkX3JldiBeIDB4ZTA7CisKKyAgICBvdXRiKCB0bXAsIGlvX3BvcnQgKyBQQ0JfQ09ORklHICk7CisgICAgdG1wID0gaW5iKCBpb19wb3J0ICsgUENCX0NPTkZJRyApOworICAgIG91dGIoIGJvYXJkX3JldiwgaW9fcG9ydCArIFBDQl9DT05GSUcgKTsKKworICAgIGlmKCBib2FyZF9yZXYgIT0gdG1wICkgCS8qIE5vdCBhIFBBUy0xNiAqLworCXJldHVybiAwOworCisgICAgaWYoICggaW5iKCBpb19wb3J0ICsgT1BFUkFUSU9OX01PREVfMSApICYgMHgwMyApICE9IDB4MDMgKSAKKwlyZXR1cm4gMDsgIAkvKiByZXR1cm4gaWYgbm8gU0NTSSBpbnRlcmZhY2UgZm91bmQgKi8KKworICAgIC8qIE1lZGlhdmlzaW9uIGhhcyBzb21lIG5ldyBtb2RlbCBib2FyZHMgdGhhdCByZXR1cm4gSUQgYml0cworICAgICAqIHRoYXQgaW5kaWNhdGUgYSBTQ1NJIGludGVyZmFjZSwgYnV0IHRoZXkncmUgbm90IChMTVMpLiAgV2UnbGwKKyAgICAgKiBwdXQgaW4gYW4gYWRkaXRpb25hbCB0ZXN0IHRvIHRyeSB0byB3ZWVkIHRoZW0gb3V0LgorICAgICAqLworCisgICAgb3V0YiggMHgwMSwgaW9fcG9ydCArIFdBSVRfU1RBVEUgKTsgCS8qIDEgV2FpdCBzdGF0ZSAqLworICAgIE5DUjUzODBfd3JpdGUoIE1PREVfUkVHLCAweDIwICk7CQkvKiBJcyBpdCByZWFsbHkgU0NTST8gKi8KKyAgICBpZiggTkNSNTM4MF9yZWFkKCBNT0RFX1JFRyApICE9IDB4MjAgKQkvKiBXcml0ZSB0byBhIHJlZy4gICAgKi8KKwlyZXR1cm4gMDsJCQkJLyogYW5kIHRyeSB0byByZWFkICAgICovCisgICAgTkNSNTM4MF93cml0ZSggTU9ERV9SRUcsIDB4MDAgKTsJCS8qIGl0IGJhY2suCSAgICAgICovCisgICAgaWYoIE5DUjUzODBfcmVhZCggTU9ERV9SRUcgKSAhPSAweDAwICkKKwlyZXR1cm4gMDsKKworICAgIHJldHVybiAxOworfQorCisKKy8qCisgKiBGdW5jdGlvbiA6IHBhczE2X3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKQorICoKKyAqIFB1cnBvc2UgOiBMSUxPIGNvbW1hbmQgbGluZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgb3ZlcnJpZGVzIGFycmF5LAorICogCisgKiBJbnB1dHMgOiBzdHIgLSB1bnVzZWQsIGludHMgLSBhcnJheSBvZiBpbnRlZ2VyIHBhcmFtZXRlcnMgd2l0aCBpbnRzWzBdCisgKgllcXVhbCB0byB0aGUgbnVtYmVyIG9mIGludHMuCisgKgorICovCisKK3ZvaWQgX19pbml0IHBhczE2X3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKQoreworICAgIHN0YXRpYyBpbnQgY29tbWFuZGxpbmVfY3VycmVudCA9IDA7CisgICAgaW50IGk7CisgICAgaWYgKGludHNbMF0gIT0gMikgCisJcHJpbnRrKCJwYXMxNl9zZXR1cCA6IHVzYWdlIHBhczE2PWlvX3BvcnQsaXJxXG4iKTsKKyAgICBlbHNlIAorCWlmIChjb21tYW5kbGluZV9jdXJyZW50IDwgTk9fT1ZFUlJJREVTKSB7CisJICAgIG92ZXJyaWRlc1tjb21tYW5kbGluZV9jdXJyZW50XS5pb19wb3J0ID0gKHVuc2lnbmVkIHNob3J0KSBpbnRzWzFdOworCSAgICBvdmVycmlkZXNbY29tbWFuZGxpbmVfY3VycmVudF0uaXJxID0gaW50c1syXTsKKwkgICAgZm9yIChpID0gMDsgaSA8IE5PX0JBU0VTOyArK2kpCisJCWlmIChiYXNlc1tpXS5pb19wb3J0ID09ICh1bnNpZ25lZCBzaG9ydCkgaW50c1sxXSkgeworIAkJICAgIGJhc2VzW2ldLm5vYXV0byA9IDE7CisJCSAgICBicmVhazsKKwkJfQorCSAgICArK2NvbW1hbmRsaW5lX2N1cnJlbnQ7CisJfQorfQorCisvKiAKKyAqIEZ1bmN0aW9uIDogaW50IHBhczE2X2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKiB0cG50KQorICoKKyAqIFB1cnBvc2UgOiBkZXRlY3RzIGFuZCBpbml0aWFsaXplcyBQQVMxNiBjb250cm9sbGVycworICoJdGhhdCB3ZXJlIGF1dG9wcm9iZWQsIG92ZXJyaWRkZW4gb24gdGhlIExJTE8gY29tbWFuZCBsaW5lLCAKKyAqCW9yIHNwZWNpZmllZCBhdCBjb21waWxlIHRpbWUuCisgKgorICogSW5wdXRzIDogdHBudCAtIHRlbXBsYXRlIGZvciB0aGlzIFNDU0kgYWRhcHRlci4KKyAqIAorICogUmV0dXJucyA6IDEgaWYgYSBob3N0IGFkYXB0ZXIgd2FzIGZvdW5kLCAwIGlmIG5vdC4KKyAqCisgKi8KKworaW50IF9faW5pdCBwYXMxNl9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICogdHBudCkKK3sKKyAgICBzdGF0aWMgaW50IGN1cnJlbnRfb3ZlcnJpZGUgPSAwOworICAgIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBjdXJyZW50X2Jhc2UgPSAwOworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlOworICAgIHVuc2lnbmVkIHNob3J0IGlvX3BvcnQ7CisgICAgaW50ICBjb3VudDsKKworICAgIHRwbnQtPnByb2NfbmFtZSA9ICJwYXMxNiI7CisgICAgdHBudC0+cHJvY19pbmZvID0gJnBhczE2X3Byb2NfaW5mbzsKKworICAgIGlmIChwYXMxNl9hZGRyICE9IDApIHsKKwlvdmVycmlkZXNbMF0uaW9fcG9ydCA9IHBhczE2X2FkZHI7CisJLyoKKwkqICBUaGlzIGlzIGhvdyB3ZSBhdm9pZCBzZWVpbmcgbW9yZSB0aGFuCisJKiAgb25lIGhvc3QgYWRhcHRlciBhdCB0aGUgc2FtZSBJL08gcG9ydC4KKwkqICBDcmliYmVkIHNoYW1lbGVzc2x5IGZyb20gcGFzMTZfc2V0dXAoKS4KKwkqLworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE5PX0JBU0VTOyArK2NvdW50KQorCSAgICBpZiAoYmFzZXNbY291bnRdLmlvX3BvcnQgPT0gcGFzMTZfYWRkcikgeworIAkJICAgIGJhc2VzW2NvdW50XS5ub2F1dG8gPSAxOworCQkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICBpZiAocGFzMTZfaXJxICE9IDApCisJb3ZlcnJpZGVzWzBdLmlycSA9IHBhczE2X2lycTsKKworICAgIGZvciAoY291bnQgPSAwOyBjdXJyZW50X292ZXJyaWRlIDwgTk9fT1ZFUlJJREVTOyArK2N1cnJlbnRfb3ZlcnJpZGUpIHsKKwlpb19wb3J0ID0gMDsKKworCWlmIChvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uaW9fcG9ydCkKKwl7CisJICAgIGlvX3BvcnQgPSBvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uaW9fcG9ydDsKKwkgICAgZW5hYmxlX2JvYXJkKCBjdXJyZW50X292ZXJyaWRlLCBpb19wb3J0ICk7CisJICAgIGluaXRfYm9hcmQoIGlvX3BvcnQsIG92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5pcnEsIDEgKTsKKwl9CisJZWxzZQorCSAgICBmb3IgKDsgIWlvX3BvcnQgJiYgKGN1cnJlbnRfYmFzZSA8IE5PX0JBU0VTKTsgKytjdXJyZW50X2Jhc2UpIHsKKyNpZiAoUERFQlVHICYgUERFQlVHX0lOSVQpCisgICAgcHJpbnRrKCJzY3NpLXBhczE2IDogcHJvYmluZyBpb19wb3J0ICUwNHhcbiIsICh1bnNpZ25lZCBpbnQpIGJhc2VzW2N1cnJlbnRfYmFzZV0uaW9fcG9ydCk7CisjZW5kaWYKKwkJaWYgKCAhYmFzZXNbY3VycmVudF9iYXNlXS5ub2F1dG8gJiYKKwkJICAgICBwYXMxNl9od19kZXRlY3QoIGN1cnJlbnRfYmFzZSApICl7CisJCQlpb19wb3J0ID0gYmFzZXNbY3VycmVudF9iYXNlXS5pb19wb3J0OworCQkJaW5pdF9ib2FyZCggaW9fcG9ydCwgZGVmYXVsdF9pcnFzWyBjdXJyZW50X2Jhc2UgXSwgMCApOyAKKyNpZiAoUERFQlVHICYgUERFQlVHX0lOSVQpCisJCQlwcmludGsoInNjc2ktcGFzMTYgOiBkZXRlY3RlZCBib2FyZC5cbiIpOworI2VuZGlmCisJCX0KKyAgICB9CisKKworI2lmIGRlZmluZWQoUERFQlVHKSAmJiAoUERFQlVHICYgUERFQlVHX0lOSVQpCisJcHJpbnRrKCJzY3NpLXBhczE2IDogaW9fcG9ydCA9ICUwNHhcbiIsICh1bnNpZ25lZCBpbnQpIGlvX3BvcnQpOworI2VuZGlmCisKKwlpZiAoIWlvX3BvcnQpCisJICAgIGJyZWFrOworCisJaW5zdGFuY2UgPSBzY3NpX3JlZ2lzdGVyICh0cG50LCBzaXplb2Yoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEpKTsKKwlpZihpbnN0YW5jZSA9PSBOVUxMKQorCQlicmVhazsKKwkJCisJaW5zdGFuY2UtPmlvX3BvcnQgPSBpb19wb3J0OworCisJTkNSNTM4MF9pbml0KGluc3RhbmNlLCAwKTsKKworCWlmIChvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uaXJxICE9IElSUV9BVVRPKQorCSAgICBpbnN0YW5jZS0+aXJxID0gb3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLmlycTsKKwllbHNlIAorCSAgICBpbnN0YW5jZS0+aXJxID0gTkNSNTM4MF9wcm9iZV9pcnEoaW5zdGFuY2UsIFBBUzE2X0lSUVMpOworCisJaWYgKGluc3RhbmNlLT5pcnEgIT0gU0NTSV9JUlFfTk9ORSkgCisJICAgIGlmIChyZXF1ZXN0X2lycShpbnN0YW5jZS0+aXJxLCBwYXMxNl9pbnRyLCBTQV9JTlRFUlJVUFQsICJwYXMxNiIsIGluc3RhbmNlKSkgeworCQlwcmludGsoInNjc2klZCA6IElSUSVkIG5vdCBmcmVlLCBpbnRlcnJ1cHRzIGRpc2FibGVkXG4iLCAKKwkJICAgIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+aXJxKTsKKwkJaW5zdGFuY2UtPmlycSA9IFNDU0lfSVJRX05PTkU7CisJICAgIH0gCisKKwlpZiAoaW5zdGFuY2UtPmlycSA9PSBTQ1NJX0lSUV9OT05FKSB7CisJICAgIHByaW50aygic2NzaSVkIDogaW50ZXJydXB0cyBub3QgZW5hYmxlZC4gZm9yIGJldHRlciBpbnRlcmFjdGl2ZSBwZXJmb3JtYW5jZSxcbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwkgICAgcHJpbnRrKCJzY3NpJWQgOiBwbGVhc2UganVtcGVyIHRoZSBib2FyZCBmb3IgYSBmcmVlIElSUS5cbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwkgICAgLyogRGlzYWJsZSA1MzgwIGludGVycnVwdHMsIGxlYXZlIGRyaXZlIHBhcmFtcyB0aGUgc2FtZSAqLworCSAgICBvdXRiKCAweDRkLCBpb19wb3J0ICsgU1lTX0NPTkZJR180ICk7CisJICAgIG91dGIoIChpbmIoaW9fcG9ydCArIElPX0NPTkZJR18zKSAmIDB4MGYpLCBpb19wb3J0ICsgSU9fQ09ORklHXzMgKTsKKwl9CisKKyNpZiBkZWZpbmVkKFBERUJVRykgJiYgKFBERUJVRyAmIFBERUJVR19JTklUKQorCXByaW50aygic2NzaSVkIDogaXJxID0gJWRcbiIsIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+aXJxKTsKKyNlbmRpZgorCisJcHJpbnRrKCJzY3NpJWQgOiBhdCAweCUwNHgiLCBpbnN0YW5jZS0+aG9zdF9ubywgKGludCkgCisJICAgIGluc3RhbmNlLT5pb19wb3J0KTsKKwlpZiAoaW5zdGFuY2UtPmlycSA9PSBTQ1NJX0lSUV9OT05FKQorCSAgICBwcmludGsgKCIgaW50ZXJydXB0cyBkaXNhYmxlZCIpOworCWVsc2UgCisJICAgIHByaW50ayAoIiBpcnEgJWQiLCBpbnN0YW5jZS0+aXJxKTsKKwlwcmludGsoIiBvcHRpb25zIENBTl9RVUVVRT0lZCAgQ01EX1BFUl9MVU49JWQgcmVsZWFzZT0lZCIsCisJICAgIENBTl9RVUVVRSwgQ01EX1BFUl9MVU4sIFBBUzE2X1BVQkxJQ19SRUxFQVNFKTsKKwlOQ1I1MzgwX3ByaW50X29wdGlvbnMoaW5zdGFuY2UpOworCXByaW50aygiXG4iKTsKKworCSsrY3VycmVudF9vdmVycmlkZTsKKwkrK2NvdW50OworICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IGludCBwYXMxNl9iaW9zcGFyYW0oRGlzayAqZGlzaywgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LCBpbnQgKmlwKQorICoKKyAqIFB1cnBvc2UgOiBHZW5lcmF0ZXMgYSBCSU9TIC8gRE9TIGNvbXBhdGlibGUgSC1DLVMgbWFwcGluZyBmb3IgCisgKgl0aGUgc3BlY2lmaWVkIGRldmljZSAvIHNpemUuCisgKiAKKyAqIElucHV0cyA6IHNpemUgPSBzaXplIG9mIGRldmljZSBpbiBzZWN0b3JzICg1MTIgYnl0ZXMpLCBkZXYgPSBibG9jayBkZXZpY2UKKyAqCW1ham9yIC8gbWlub3IsIGlwW10gPSB7aGVhZHMsIHNlY3RvcnMsIGN5bGluZGVyc30gIAorICoKKyAqIFJldHVybnMgOiBhbHdheXMgMCAoc3VjY2VzcyksIGluaXRpYWxpemVzIGlwCisgKgkKKyAqLworCisvKiAKKyAqIFhYWCBNb3N0IFNDU0kgYm9hcmRzIHVzZSB0aGlzIG1hcHBpbmcsIEkgY291bGQgYmUgaW5jb3JyZWN0LiAgU29tZSBvbmUKKyAqIHVzaW5nIGhhcmQgZGlza3Mgb24gYSB0cmFudG9yIHNob3VsZCB2ZXJpZnkgdGhhdCB0aGlzIG1hcHBpbmcgY29ycmVzcG9uZHMKKyAqIHRvIHRoYXQgdXNlZCBieSB0aGUgQklPUyAvIEFTUEkgZHJpdmVyIGJ5IHJ1bm5pbmcgdGhlIGxpbnV4IGZkaXNrIHByb2dyYW0KKyAqIGFuZCBtYXRjaGluZyB0aGUgSF9DX1MgY29vcmRpbmF0ZXMgdG8gd2hhdCBET1MgdXNlcy4KKyAqLworCitpbnQgcGFzMTZfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LAorCQlzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICogaXApCit7CisgIGludCBzaXplID0gY2FwYWNpdHk7CisgIGlwWzBdID0gNjQ7CisgIGlwWzFdID0gMzI7CisgIGlwWzJdID0gc2l6ZSA+PiAxMTsJCS8qIEkgdGhpbmsgSSBoYXZlIGl0IGFzIC8oMzIqNjQpICovCisgIGlmKCBpcFsyXSA+IDEwMjQgKSB7CQkvKiB5ZXMsID4sIG5vdCA+PSAqLworCWlwWzBdPTI1NTsKKwlpcFsxXT02MzsKKwlpcFsyXT1zaXplLyg2MyoyNTUpOworCWlmKCBpcFsyXSA+IDEwMjMgKQkvKiB5ZXMgPjEwMjMuLi4gKi8KKwkJaXBbMl0gPSAxMDIzOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX3ByZWFkIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgCisgKgl1bnNpZ25lZCBjaGFyICpkc3QsIGludCBsZW4pCisgKgorICogUHVycG9zZSA6IEZhc3QgNTM4MCBwc2V1ZG8tZG1hIHJlYWQgZnVuY3Rpb24sIHRyYW5zZmVycyBsZW4gYnl0ZXMgdG8gCisgKglkc3QKKyAqIAorICogSW5wdXRzIDogZHN0ID0gZGVzdGluYXRpb24sIGxlbiA9IGxlbmd0aCBpbiBieXRlcworICoKKyAqIFJldHVybnMgOiAwIG9uIHN1Y2Nlc3MsIG5vbiB6ZXJvIG9uIGEgZmFpbHVyZSBzdWNoIGFzIGEgd2F0Y2hkb2cgCisgKiAJdGltZW91dC4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBOQ1I1MzgwX3ByZWFkIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgdW5zaWduZWQgY2hhciAqZHN0LAorICAgIGludCBsZW4pIHsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICAqZCA9IGRzdDsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBzaG9ydCByZWcgPSAodW5zaWduZWQgc2hvcnQpIChpbnN0YW5jZS0+aW9fcG9ydCArIAorCVBfREFUQV9SRUdfT0ZGU0VUKTsKKyAgICByZWdpc3RlciBpbnQgaSA9IGxlbjsKKyAgICBpbnQgaWkgPSAwOworCisgICAgd2hpbGUgKCAhKGluYihpbnN0YW5jZS0+aW9fcG9ydCArIFBfU1RBVFVTX1JFR19PRkZTRVQpICYgUF9TVF9SRFkpICkKKwkgKytpaTsKKworICAgIGluc2IoIHJlZywgZCwgaSApOworCisgICAgaWYgKCBpbmIoaW5zdGFuY2UtPmlvX3BvcnQgKyBQX1RJTUVPVVRfU1RBVFVTX1JFR19PRkZTRVQpICYgUF9UU19USU0pIHsKKwlvdXRiKCBQX1RTX0NULCBpbnN0YW5jZS0+aW9fcG9ydCArIFBfVElNRU9VVF9TVEFUVVNfUkVHX09GRlNFVCk7CisJcHJpbnRrKCJzY3NpJWQgOiB3YXRjaGRvZyB0aW1lciBmaXJlZCBpbiBOQ1I1MzgwX3ByZWFkKClcbiIsCisJICAgIGluc3RhbmNlLT5ob3N0X25vKTsKKwlyZXR1cm4gLTE7CisgICAgfQorICAgaWYgKGlpID4gcGFzX21heGkpCisgICAgICBwYXNfbWF4aSA9IGlpOworICAgIHJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gOiBpbnQgTkNSNTM4MF9wd3JpdGUgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCAKKyAqCXVuc2lnbmVkIGNoYXIgKnNyYywgaW50IGxlbikKKyAqCisgKiBQdXJwb3NlIDogRmFzdCA1MzgwIHBzZXVkby1kbWEgd3JpdGUgZnVuY3Rpb24sIHRyYW5zZmVycyBsZW4gYnl0ZXMgZnJvbQorICoJc3JjCisgKiAKKyAqIElucHV0cyA6IHNyYyA9IHNvdXJjZSwgbGVuID0gbGVuZ3RoIGluIGJ5dGVzCisgKgorICogUmV0dXJucyA6IDAgb24gc3VjY2Vzcywgbm9uIHplcm8gb24gYSBmYWlsdXJlIHN1Y2ggYXMgYSB3YXRjaGRvZyAKKyAqIAl0aW1lb3V0LgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IE5DUjUzODBfcHdyaXRlIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgdW5zaWduZWQgY2hhciAqc3JjLAorICAgIGludCBsZW4pIHsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpzID0gc3JjOworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIHNob3J0IHJlZyA9IChpbnN0YW5jZS0+aW9fcG9ydCArIFBfREFUQV9SRUdfT0ZGU0VUKTsKKyAgICByZWdpc3RlciBpbnQgaSA9IGxlbjsKKyAgICBpbnQgaWkgPSAwOworCisgICAgd2hpbGUgKCAhKChpbmIoaW5zdGFuY2UtPmlvX3BvcnQgKyBQX1NUQVRVU19SRUdfT0ZGU0VUKSkgJiBQX1NUX1JEWSkgKQorCSArK2lpOworIAorICAgIG91dHNiKCByZWcsIHMsIGkgKTsKKworICAgIGlmIChpbmIoaW5zdGFuY2UtPmlvX3BvcnQgKyBQX1RJTUVPVVRfU1RBVFVTX1JFR19PRkZTRVQpICYgUF9UU19USU0pIHsKKwlvdXRiKCBQX1RTX0NULCBpbnN0YW5jZS0+aW9fcG9ydCArIFBfVElNRU9VVF9TVEFUVVNfUkVHX09GRlNFVCk7CisJcHJpbnRrKCJzY3NpJWQgOiB3YXRjaGRvZyB0aW1lciBmaXJlZCBpbiBOQ1I1MzgwX3B3cml0ZSgpXG4iLAorCSAgICBpbnN0YW5jZS0+aG9zdF9ubyk7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoaWkgPiBwYXNfbWF4aSkKKwkgcGFzX3dtYXhpID0gaWk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNpbmNsdWRlICJOQ1I1MzgwLmMiCisKK3N0YXRpYyBpbnQgcGFzMTZfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpZiAoc2hvc3QtPmlycSkKKwkJZnJlZV9pcnEoc2hvc3QtPmlycSwgTlVMTCk7CisJTkNSNTM4MF9leGl0KHNob3N0KTsKKwlpZiAoc2hvc3QtPmRtYV9jaGFubmVsICE9IDB4ZmYpCisJCWZyZWVfZG1hKHNob3N0LT5kbWFfY2hhbm5lbCk7CisJaWYgKHNob3N0LT5pb19wb3J0ICYmIHNob3N0LT5uX2lvX3BvcnQpCisJCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKKwlzY3NpX3VucmVnaXN0ZXIoc2hvc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiUHJvIEF1ZGlvIFNwZWN0cnVtLTE2IFNDU0kiLAorCS5kZXRlY3QgICAgICAgICA9IHBhczE2X2RldGVjdCwKKwkucmVsZWFzZSAgICAgICAgPSBwYXMxNl9yZWxlYXNlLAorCS5xdWV1ZWNvbW1hbmQgICA9IHBhczE2X3F1ZXVlX2NvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIgPSBwYXMxNl9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIgPSBwYXMxNl9idXNfcmVzZXQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gcGFzMTZfZGV2aWNlX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIgPSBwYXMxNl9ob3N0X3Jlc2V0LAorCS5iaW9zX3BhcmFtICAgICA9IHBhczE2X2Jpb3NwYXJhbSwgCisJLmNhbl9xdWV1ZSAgICAgID0gQ0FOX1FVRVVFLAorCS50aGlzX2lkICAgICAgICA9IDcsCisJLnNnX3RhYmxlc2l6ZSAgID0gU0dfQUxMLAorCS5jbWRfcGVyX2x1biAgICA9IENNRF9QRVJfTFVOLAorCS51c2VfY2x1c3RlcmluZyA9IERJU0FCTEVfQ0xVU1RFUklORywKK307CisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworI2lmZGVmIE1PRFVMRQorbW9kdWxlX3BhcmFtKHBhczE2X2FkZHIsIHVzaG9ydCwgMCk7Cittb2R1bGVfcGFyYW0ocGFzMTZfaXJxLCBpbnQsIDApOworI2VuZGlmCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGFzMTYuaCBiL2RyaXZlcnMvc2NzaS9wYXMxNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZDRkNjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcGFzMTYuaApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIFRoaXMgZHJpdmVyIGFkYXB0ZWQgZnJvbSBEcmV3IEVja2hhcmR0J3MgVHJhbnRvciBUMTI4IGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAxOTkzLCBEcmV3IEVja2hhcmR0CisgKglWaXNpb25hcnkgQ29tcHV0aW5nCisgKgkoVW5peCBhbmQgTGludXggY29uc3VsdGluZyBhbmQgY3VzdG9tIHByb2dyYW1taW5nKQorICoJZHJld0Bjb2xvcmFkby5lZHUKKyAqICAgICAgKzEgKDMwMykgNjY2LTU4MzYKKyAqCisgKiAgKCBCYXNlZCBvbiBUMTI4IC0gRElTVFJJQlVUSU9OIFJFTEVBU0UgMy4gKSAKKyAqCisgKiBNb2RpZmllZCB0byB3b3JrIHdpdGggdGhlIFBybyBBdWRpbyBTcGVjdHJ1bS9TdHVkaW8gMTYKKyAqIGJ5IEpvaG4gV2VpZG1hbi4KKyAqCisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0IAorICoKKyAqIE1lZGlhIFZpc2lvbgorICogKDUxMCkgNzcwLTg2MDAKKyAqICg4MDApIDM0OC03MTE2CisgKiAKKyAqIGFuZCAKKyAqCisgKiBOQ1IgNTM4MCBGYW1pbHkKKyAqIFNDU0kgUHJvdG9jb2wgQ29udHJvbGxlcgorICogRGF0YWJvb2sKKyAqCisgKiBOQ1IgTWljcm9lbGVjdHJvbmljcworICogMTYzNSBBZXJvcGxhemEgRHJpdmUKKyAqIENvbG9yYWRvIFNwcmluZ3MsIENPIDgwOTE2CisgKiAxKyAoNzE5KSA1NzgtMzQwMAorICogMSsgKDgwMCkgMzM0LTU0NTQKKyAqLworCisKKyNpZm5kZWYgUEFTMTZfSAorI2RlZmluZSBQQVMxNl9ICisKKyNkZWZpbmUgUEFTMTZfUFVCTElDX1JFTEVBU0UgMworCisjZGVmaW5lIFBERUJVR19JTklUCTB4MQorI2RlZmluZSBQREVCVUdfVFJBTlNGRVIgMHgyCisKKyNkZWZpbmUgUEFTMTZfREVGQVVMVF9CQVNFXzEgIDB4Mzg4CisjZGVmaW5lIFBBUzE2X0RFRkFVTFRfQkFTRV8yICAweDM4NAorI2RlZmluZSBQQVMxNl9ERUZBVUxUX0JBU0VfMyAgMHgzOGMKKyNkZWZpbmUgUEFTMTZfREVGQVVMVF9CQVNFXzQgIDB4Mjg4CisKKyNkZWZpbmUgUEFTMTZfREVGQVVMVF9CT0FSRF8xX0lSUSAxMAorI2RlZmluZSBQQVMxNl9ERUZBVUxUX0JPQVJEXzJfSVJRIDEyCisjZGVmaW5lIFBBUzE2X0RFRkFVTFRfQk9BUkRfM19JUlEgMTQKKyNkZWZpbmUgUEFTMTZfREVGQVVMVF9CT0FSRF80X0lSUSAxNQorCisKKy8qCisgKiBUaGUgUHJvIEF1ZGlvIFNwZWN0cnVtIGJvYXJkcyBhcmUgSS9PIG1hcHBlZC4gVGhleSB1c2UgYSBaaWxvZyA1MzgwCisgKiBTQ1NJIGNvbnRyb2xsZXIsIHdoaWNoIGlzIHRoZSBlcXVpdmFsZW50IG9mIE5DUidzIDUzODAuICAiUHNldWRvLURNQSIKKyAqIGFyY2hpdGVjdHVyZSBpcyB1c2VkLCB3aGVyZSBhIFBBTCBkcml2ZXMgdGhlIERNQSBzaWduYWxzIG9uIHRoZSA1MzgwCisgKiBhbGxvd2luZyBmYXN0LCBibGluZCB0cmFuc2ZlcnMgd2l0aCBwcm9wZXIgaGFuZHNoYWtpbmcuIAorICovCisKKworLyogVGhlIFRpbWUtb3V0IENvdW50ZXIgcmVnaXN0ZXIgaXMgdXNlZCB0byBzYWZlLWd1YXJkIGFnYWluc3QgYSBzdHVjaworICogYnVzIChpbiB0aGUgY2FzZSBvZiBSRFkgZHJpdmVuIGhhbmRzaGFrZSkgb3IgYSBzdHVjayBieXRlIChpZiAxNi1CaXQKKyAqIERNQSBjb252ZXJzaW9uIGlzIHVzZWQpLiAgVGhlIGNvdW50ZXIgdXNlcyBhIDI4LjIyNE1IeiBjbG9jaworICogZGl2aWRlZCBieSAxNCBhcyBpdHMgY2xvY2sgc291cmNlLiAgSW4gdGhlIGNhc2Ugb2YgYSBzdHVjayBieXRlIGluCisgKiB0aGUgaG9sZGluZyByZWdpc3RlciwgYW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCAoYW5kIG1peGVkIHdpdGggdGhlCisgKiBvbmUgd2l0aCB0aGUgZHJpdmUpIHVzaW5nIHRoZSBDRC1ST00gaW50ZXJydXB0IHBvaW50ZXIuCisgKi8KKyAKKyNkZWZpbmUgUF9USU1FT1VUX0NPVU5URVJfUkVHCTB4NDAwMAorI2RlZmluZSBQX1RDX0RJU0FCTEUJMHg4MAkvKiBTZXQgdG8gMCB0byBlbmFibGUgdGltZW91dCBpbnQuICovCisJCQkJLyogQml0cyBENi1EMCBjb250YWluIHRpbWVvdXQgY291bnQgKi8KKworCisjZGVmaW5lIFBfVElNRU9VVF9TVEFUVVNfUkVHX09GRlNFVAkweDQwMDEKKyNkZWZpbmUgUF9UU19USU0JCTB4ODAJLyogY2hlY2sgdGltZW91dCBzdGF0dXMgKi8KKwkJCQkJLyogQml0cyBENi1ENCBOL1UgKi8KKyNkZWZpbmUgUF9UU19BUk1fRFJRX0lOVAkweDA4CS8qIEFybSBEUlEgSW50LiAgV2hlbiBzZXQgaGlnaCwKKwkJCQkJICogdGhlIG5leHQgcmlzaW5nIGVkZ2Ugd2lsbAorCQkJCQkgKiBjYXVzZSBhIENELVJPTSBpbnRlcnJ1cHQuCisJCQkJCSAqIFdoZW4gc2V0IGxvdywgdGhlIGludGVycnVwdAorCQkJCQkgKiB3aWxsIGJlIGNsZWFyZWQuICBUaGVyZSBpcworCQkJCQkgKiBubyBzdGF0dXMgYXZhaWxhYmxlIGZvcgorCQkJCQkgKiB0aGlzIGludGVycnVwdC4KKwkJCQkJICovCisjZGVmaW5lIFBfVFNfRU5BQkxFX1RPX0VSUl9JTlRFUlJVUFQJLyogRW5hYmxlIHRpbWVvdXQgZXJyb3IgaW50LiAqLworI2RlZmluZSBQX1RTX0VOQUJMRV9XQUlUCQkvKiBFbmFibGUgV2FpdCAqLworCisjZGVmaW5lIFBfVFNfQ1QJCQkweDAxCS8qIGNsZWFyIHRpbWVvdXQuIE5vdGU6IHdyaXRpbmcKKwkJCQkJICogdG8gdGhpcyByZWdpc3RlciBjbGVhcnMgdGhlCisJCQkJCSAqIHRpbWVvdXQgZXJyb3IgaW50LiBvciBzdGF0dXMKKwkJCQkJICovCisKKworLyoKKyAqIFRoZSBkYXRhIHJlZ2lzdGVyIHJlYWRzL3dyaXRlcyB0by9mcm9tIHRoZSA1MzgwIGluIHBzZXVkby1ETUEgbW9kZQorICovIAorCisjZGVmaW5lIFBfREFUQV9SRUdfT0ZGU0VUCTB4NWMwMAkvKiBydyAqLworCisjZGVmaW5lIFBfU1RBVFVTX1JFR19PRkZTRVQJMHg1YzAxCS8qIHJvICovCisjZGVmaW5lIFBfU1RfUkRZCQkweDgwCS8qIDUzODAgRERSUSBTdGF0dXMgKi8KKworI2RlZmluZSBQX0lSUV9TVEFUVVMJCTB4NWMwMworI2RlZmluZSBQX0lTX0lSUQkJMHg4MAkvKiBESVJRIHN0YXR1cyAqLworCisjZGVmaW5lIFBDQl9DT05GSUcgMHg4MDMKKyNkZWZpbmUgTUFTVEVSX0FERFJFU1NfUFRSIDB4OWEwMSAgLyogRml4ZWQgcG9zaXRpb24gLSBubyByZWxvICovCisjZGVmaW5lIFNZU19DT05GSUdfNCAweDgwMDMKKyNkZWZpbmUgV0FJVF9TVEFURSAweGJjMDAKKyNkZWZpbmUgT1BFUkFUSU9OX01PREVfMSAweGVjMDMKKyNkZWZpbmUgSU9fQ09ORklHXzMgMHhmMDAyCisKKworI2lmbmRlZiBBU00KK3N0YXRpYyBpbnQgcGFzMTZfYWJvcnQoU2NzaV9DbW5kICopOworc3RhdGljIGludCBwYXMxNl9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICosIHN0cnVjdCBibG9ja19kZXZpY2UgKiwKKwkJCSAgIHNlY3Rvcl90LCBpbnQqKTsKK3N0YXRpYyBpbnQgcGFzMTZfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK3N0YXRpYyBpbnQgcGFzMTZfcXVldWVfY29tbWFuZChTY3NpX0NtbmQgKiwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSk7CitzdGF0aWMgaW50IHBhczE2X2J1c19yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IHBhczE2X2hvc3RfcmVzZXQoU2NzaV9DbW5kICopOworc3RhdGljIGludCBwYXMxNl9kZXZpY2VfcmVzZXQoU2NzaV9DbW5kICopOworCisjaWZuZGVmIENNRF9QRVJfTFVOCisjZGVmaW5lIENNRF9QRVJfTFVOIDIKKyNlbmRpZgorCisjaWZuZGVmIENBTl9RVUVVRQorI2RlZmluZSBDQU5fUVVFVUUgMzIgCisjZW5kaWYKKworI2lmbmRlZiBIT1NUU19DCisKKyNkZWZpbmUgTkNSNTM4MF9pbXBsZW1lbnRhdGlvbl9maWVsZHMgXAorICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGlvX3BvcnQKKworI2RlZmluZSBOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKSBcCisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgaW9fcG9ydAorCisjZGVmaW5lIE5DUjUzODBfc2V0dXAoaW5zdGFuY2UpIFwKKyAgICBpb19wb3J0ID0gKGluc3RhbmNlKS0+aW9fcG9ydAorCisjZGVmaW5lIFBBUzE2X2lvX3BvcnQocmVnKSAoIGlvX3BvcnQgKyBwYXMxNl9vZmZzZXRbKHJlZyldICkKKworI2lmICEoUERFQlVHICYgUERFQlVHX1RSQU5TRkVSKSAKKyNkZWZpbmUgTkNSNTM4MF9yZWFkKHJlZykgKCBpbmIoUEFTMTZfaW9fcG9ydChyZWcpKSApCisjZGVmaW5lIE5DUjUzODBfd3JpdGUocmVnLCB2YWx1ZSkgKCBvdXRiKCh2YWx1ZSksUEFTMTZfaW9fcG9ydChyZWcpKSApCisjZWxzZQorI2RlZmluZSBOQ1I1MzgwX3JlYWQocmVnKQkJCQkJCVwKKyAgICAoKCh1bnNpZ25lZCBjaGFyKSBwcmludGsoInNjc2klZCA6IHJlYWQgcmVnaXN0ZXIgJWQgYXQgaW9fcG9ydCAlMDR4XG4iXAorICAgICwgaW5zdGFuY2UtPmhvc3RubywgKHJlZyksIFBBUzE2X2lvX3BvcnQocmVnKSkpLCBpbmIoIFBBUzE2X2lvX3BvcnQocmVnKSkgKQorCisjZGVmaW5lIE5DUjUzODBfd3JpdGUocmVnLCB2YWx1ZSkgCQkJCQlcCisgICAgKHByaW50aygic2NzaSVkIDogd3JpdGUgJTAyeCB0byByZWdpc3RlciAlZCBhdCBpb19wb3J0ICUwNHhcbiIsIAlcCisJICAgIGluc3RhbmNlLT5ob3N0bm8sICh2YWx1ZSksIChyZWcpLCBQQVMxNl9pb19wb3J0KHJlZykpLAlcCisgICAgb3V0YiggKHZhbHVlKSxQQVMxNl9pb19wb3J0KHJlZykgKSApCisKKyNlbmRpZgorCisKKyNkZWZpbmUgTkNSNTM4MF9pbnRyIHBhczE2X2ludHIKKyNkZWZpbmUgZG9fTkNSNTM4MF9pbnRyIGRvX3BhczE2X2ludHIKKyNkZWZpbmUgTkNSNTM4MF9xdWV1ZV9jb21tYW5kIHBhczE2X3F1ZXVlX2NvbW1hbmQKKyNkZWZpbmUgTkNSNTM4MF9hYm9ydCBwYXMxNl9hYm9ydAorI2RlZmluZSBOQ1I1MzgwX2RldmljZV9yZXNldCBwYXMxNl9kZXZpY2VfcmVzZXQKKyNkZWZpbmUgTkNSNTM4MF9idXNfcmVzZXQgcGFzMTZfYnVzX3Jlc2V0CisjZGVmaW5lIE5DUjUzODBfaG9zdF9yZXNldCBwYXMxNl9ob3N0X3Jlc2V0CisjZGVmaW5lIE5DUjUzODBfcHJvY19pbmZvIHBhczE2X3Byb2NfaW5mbworCisvKiAxNSAxNCAxMiAxMCA3IDUgMyAKKyAgIDExMDEgMDEwMCAxMDEwIDEwMDAgKi8KKyAgIAorI2RlZmluZSBQQVMxNl9JUlFTIDB4ZDRhOCAKKworI2VuZGlmIC8qIGVsc2UgZGVmIEhPU1RTX0MgKi8KKyNlbmRpZiAvKiBuZGVmIEFTTSAqLworI2VuZGlmIC8qIFBBUzE2X0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY2kyMDAwLmMgYi9kcml2ZXJzL3Njc2kvcGNpMjAwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwY2UxY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcGNpMjAwMC5jCkBAIC0wLDAgKzEsODM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGVyY2VwdGl2ZSBTb2x1dGlvbnMsIEluYy4gUENJLTIwMDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXguCisgKgorICogcGNpMjAwMC5jIC0gTGludXggSG9zdCBEcml2ZXIgZm9yIFBDSS0yMDAwIEludGVsbGlDYWNoZSBTQ1NJIEFkYXB0ZXJzCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkgUGVyY2VwdGl2ZSBTb2x1dGlvbnMsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlCisgKiBjb2RlIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBjb21tZW50IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbi4KKyAqCisgKiBUZWNobmljYWwgdXBkYXRlcyBhbmQgcHJvZHVjdCBpbmZvcm1hdGlvbiBhdDoKKyAqICBodHRwOi8vd3d3LnBzaWRpc2suY29tCisgKgorICogUGxlYXNlIHNlbmQgcXVlc3Rpb25zLCBjb21tZW50cywgYnVnIHJlcG9ydHMgdG86CisgKiAgdGVjaEBwc2lkaXNrLmNvbSBUZWNobmljYWwgU3VwcG9ydAorICoKKyAqCisgKglSZXZpc2lvbnMJMS4xMAlKYW4tMjEtMTk5OQorICoJCS0gRml4ZWQgc2lnbiBvbiBtZXNzYWdlIHRvIHJlZmxlY3QgcHJvcGVyIGNvbnRyb2xsZXIgbmFtZS4KKyAqCQktIEFkZGVkIHN1cHBvcnQgZm9yIFJBSUQgc3RhdHVzIG1vbml0b3JpbmcgYW5kIGNvbnRyb2wuCisgKgorICogIFJldmlzaW9ucwkxLjExCU1hci0yMi0xOTk5CisgKgkJLSBGaXhlZCBjb250cm9sIHRpbWVvdXQgdG8gbm90IGxvY2sgdXAgdGhlIGVudGlyZSBzeXN0ZW0gaWYKKyAqCQkgIGNvbnRyb2xsZXIgZ29lcyBvZmZsaW5lIGNvbXBsZXRlbHkuCisgKgorICoJUmV2aXNpb25zIDEuMTIJCU1hci0yNi0xOTk5CisgKgkJLSBGaXhlZCBzcGlubG9jayBhbmQgUENJIGNvbmZpZ3VyYXRpb24uCisgKgorICoJUmV2aXNpb25zIDEuMjAJCU1hci0yNy0yMDAwCisgKgkJLSBBZGRlZCBzdXBwb3J0IGZvciBkeW5hbWljIERNQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQQ0kyMDAwX1ZFUlNJT04JCSIxLjIwIgorCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgInBjaTIwMDAuaCIKKyNpbmNsdWRlICJwc2lfcm95LmgiCisKKworLy8jZGVmaW5lIERFQlVHIDEKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERFQih4KSB4CisjZGVmaW5lIFNUT1BfSEVSRQl7aW50IHN0O2ZvcihzdD0wO3N0PDEwMDtzdCsrKXtzdD0xO319CisjZWxzZQorI2RlZmluZSBERUIoeCkKKyNkZWZpbmUgU1RPUF9IRVJFCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJdW5zaWduZWQgaW50CWFkZHJlc3M7CisJdW5zaWduZWQgaW50CWxlbmd0aDsKKwl9CVNDQVRHQVRILCAqUFNDQVRHQVRIOworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlTY3NpX0NtbmQJCSpTQ3BudDsKKwlQU0NBVEdBVEgJCSBzY2F0R2F0aDsKKwlkbWFfYWRkcl90CQkgc2NhdEdhdGhEbWE7CisJVUNIQVIJCQkqY2RiOworCWRtYV9hZGRyX3QJCSBjZGJEbWE7IAorCVVDSEFSCQkJIHRhZzsKKwl9CURFVjIwMDAsICpQREVWMjAwMDsKKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJVUxPTkcJCQkgYmFzZVBvcnQ7CisJVUxPTkcJCQkgbWIwOworCVVMT05HCQkJIG1iMTsKKwlVTE9ORwkJCSBtYjI7CisJVUxPTkcJCQkgbWIzOworCVVMT05HCQkJIG1iNDsKKwlVTE9ORwkJCSBjbWQ7CisJVUxPTkcJCQkgdGFnOworCVVMT05HCQkJIGlycU93bmVkOworCXN0cnVjdCBwY2lfZGV2CSpwZGV2OworCURFVjIwMDAJIAkJIGRldltNQVhfQlVTXVtNQVhfVU5JVFNdOworCX0JQURBUFRFUjIwMDAsICpQQURBUFRFUjIwMDA7CisKKyNkZWZpbmUgSE9TVERBVEEoaG9zdCkgKChQQURBUFRFUjIwMDApJmhvc3QtPmhvc3RkYXRhKQorI2RlZmluZSBjb25zaXN0ZW50TGVuIChNQVhfQlVTICogTUFYX1VOSVRTICogKDE2ICogc2l6ZW9mIChTQ0FUR0FUSCkgKyBNQVhfQ09NTUFORF9TSVpFKSkKKworCitzdGF0aWMgc3RydWN0CVNjc2lfSG9zdCAJICAgKlBzaUhvc3RbTUFYQURBUFRFUl0gPSB7TlVMTCx9OyAgLy8gT25lIGZvciBlYWNoIGFkYXB0ZXIKK3N0YXRpYwkJCWludAkJCQlOdW1BZGFwdGVycyA9IDA7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJCQlXYWl0UmVhZHkJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVdhaXQgZm9yIGNvbnRyb2xsZXIgcmVhZHkuCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoKKyAqCVJldHVybnM6CQlUUlVFIG9uIG5vdCByZWFkeS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgV2FpdFJlYWR5IChQQURBUFRFUjIwMDAgcGFkYXB0ZXIpCisJeworCVVMT05HCXo7CisKKwlmb3IgKCB6ID0gMDsgIHogPCAoVElNRU9VVF9DT01NQU5EICogNCk7ICB6KysgKQorCQl7CisJCWlmICggIWluYl9wIChwYWRhcHRlci0+Y21kKSApCisJCQlyZXR1cm4gRkFMU0U7CisJCXVkZWxheSAoMjUwKTsKKwkJfTsJCQkJCQkJCQorCXJldHVybiBUUlVFOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOgkJCVdhaXRSZWFkeUxvbmcJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVdhaXQgZm9yIGNvbnRyb2xsZXIgcmVhZHkuCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoKKyAqCVJldHVybnM6CQlUUlVFIG9uIG5vdCByZWFkeS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgV2FpdFJlYWR5TG9uZyAoUEFEQVBURVIyMDAwIHBhZGFwdGVyKQorCXsKKwlVTE9ORwl6OworCisJZm9yICggeiA9IDA7ICB6IDwgKDUwMDAgKiA0KTsgIHorKyApCisJCXsKKwkJaWYgKCAhaW5iX3AgKHBhZGFwdGVyLT5jbWQpICkKKwkJCXJldHVybiBGQUxTRTsKKwkJdWRlbGF5ICgyNTApOworCQl9OwkJCQkJCQkJCisJcmV0dXJuIFRSVUU7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CU9wRG9uZQk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJQ2xlYW4gdXAgb3BlcmF0aW9uIGFuZCBpc3N1ZSBkb25lIHRvIGNhbGxlci4KKyAqCisgKglQYXJhbWV0ZXJzOgkJU0NwbnQJLSBQb2ludGVyIHRvIFNDU0kgY29tbWFuZCBzdHJ1Y3R1cmUuCisgKgkJCQkJc3RhdHVzCS0gQ2FsbGVyIHN0YXR1cy4KKyAqCisgKglSZXR1cm5zOgkJTm90aGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIE9wRG9uZSAoU2NzaV9DbW5kICpTQ3BudCwgVUxPTkcgc3RhdHVzKQorCXsKKwlTQ3BudC0+cmVzdWx0ID0gc3RhdHVzOworCVNDcG50LT5zY3NpX2RvbmUgKFNDcG50KTsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJQ29tbWFuZAkJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CUlzc3VlIHF1ZXVlZCBjb21tYW5kIHRvIHRoZSBQQ0ktMjAwMC4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIHRvIGFkYXB0ZXIgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorICoJCQkJCWNtZAkJIC0gUENJLTIwMDAgY29tbWFuZCBieXRlLgorICoKKyAqCVJldHVybnM6CQlOb24temVybyBjb21tYW5kIHRhZyBpZiBvcGVyYXRpb24gaXMgYWNjZXB0ZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUNIQVIgQ29tbWFuZCAoUEFEQVBURVIyMDAwIHBhZGFwdGVyLCBVQ0hBUiBjbWQpCisJeworCW91dGJfcCAoY21kLCBwYWRhcHRlci0+Y21kKTsKKwlpZiAoIFdhaXRSZWFkeSAocGFkYXB0ZXIpICkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIGlud19wIChwYWRhcHRlci0+bWIwKSApCisJCXJldHVybiAwOworCisJcmV0dXJuIGluYl9wIChwYWRhcHRlci0+bWIxKTsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJQnVpbGRTZ0xpc3QJCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglCdWlsZCB0aGUgc2NhdHRlciBnYXRoZXIgbGlzdCBmb3IgY29udHJvbGxlci4KKyAqCisgKglQYXJhbWV0ZXJzOgkJU0NwbnQJIC0gUG9pbnRlciB0byBTQ1NJIGNvbW1hbmQgc3RydWN0dXJlLgorICoJCQkJCXBhZGFwdGVyIC0gUG9pbnRlciB0byBhZGFwdGVyIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKyAqCQkJCQlwZGV2CSAtIFBvaW50ZXIgdG8gYWRhcHRlciBkZXZpY2Ugc3RydWN0dXJlLgorICoKKyAqCVJldHVybnM6CQlOb24temVybyBpbiBub3Qgc2NhdHRlciBnYXRoZXIuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IEJ1aWxkU2dMaXN0IChTY3NpX0NtbmQgKlNDcG50LCBQQURBUFRFUjIwMDAgcGFkYXB0ZXIsIFBERVYyMDAwIHBkZXYpCisJeworCWludAkJCQkJIHo7CisJaW50CQkJCQkgemM7CisJc3RydWN0IHNjYXR0ZXJsaXN0CSpzZzsKKworCWlmICggU0NwbnQtPnVzZV9zZyApCisJCXsKKwkJc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCQl6YyA9IHBjaV9tYXBfc2cgKHBhZGFwdGVyLT5wZGV2LCBzZywgU0NwbnQtPnVzZV9zZywgc2NzaV90b19wY2lfZG1hX2RpciAoU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisJCWZvciAoIHogPSAwOyAgeiA8IHpjOyAgeisrICkKKwkJCXsKKwkJCXBkZXYtPnNjYXRHYXRoW3pdLmFkZHJlc3MgPSBjcHVfdG9fbGUzMiAoc2dfZG1hX2FkZHJlc3MgKHNnKSk7CisJCQlwZGV2LT5zY2F0R2F0aFt6XS5sZW5ndGggPSBjcHVfdG9fbGUzMiAoc2dfZG1hX2xlbiAoc2crKykpOworCQkJfQorCQlvdXRsIChwZGV2LT5zY2F0R2F0aERtYSwgcGFkYXB0ZXItPm1iMik7CisJCW91dGwgKCh6YyA8PCAyNCkgfCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuLCBwYWRhcHRlci0+bWIzKTsKKwkJcmV0dXJuIEZBTFNFOworCQl9CisJaWYgKCAhU0NwbnQtPnJlcXVlc3RfYnVmZmxlbikKKwkJeworCQlvdXRsICgwLCBwYWRhcHRlci0+bWIyKTsKKwkJb3V0bCAoMCwgcGFkYXB0ZXItPm1iMyk7CisJCXJldHVybiBUUlVFOworCQl9CisJU0NwbnQtPlNDcC5oYXZlX2RhdGFfaW4gPSBwY2lfbWFwX3NpbmdsZSAocGFkYXB0ZXItPnBkZXYsIFNDcG50LT5yZXF1ZXN0X2J1ZmZlciwgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiwgc2NzaV90b19wY2lfZG1hX2RpciAoU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisJb3V0bCAoU0NwbnQtPlNDcC5oYXZlX2RhdGFfaW4sIHBhZGFwdGVyLT5tYjIpOworCW91dGwgKFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4sIHBhZGFwdGVyLT5tYjMpOworCXJldHVybiBUUlVFOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVBzaVJhaWRDbWQKKyAqCisgKglEZXNjcmlwdGlvbjoJRXhlY3V0ZSBhIHNpbXBsZSBjb21tYW5kLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgdG8gYWRhcHRlciBjb250cm9sIHN0cnVjdHVyZS4KKyAqCQkJCQljbWQJCSAtIFJveSBjb21tYW5kIGJ5dGUuCisgKgorICoJUmV0dXJuczoJCVJldHVybiBlcnJvciBzdGF0dXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBQc2lSYWlkQ21kIChQQURBUFRFUjIwMDAgcGFkYXB0ZXIsIGNoYXIgY21kKQorCXsKKwlpZiAoIFdhaXRSZWFkeSAocGFkYXB0ZXIpICkJCQkJCQkvLyB0ZXN0IGZvciBjb21tYW5kIHJlZ2lzdGVyIHJlYWR5CisJCXJldHVybiBESURfVElNRV9PVVQ7CisJb3V0Yl9wIChjbWQsIHBhZGFwdGVyLT5jbWQpOwkJCQkJLy8gaXNzdWUgY29tbWFuZAorCWlmICggV2FpdFJlYWR5TG9uZyAocGFkYXB0ZXIpICkJCQkJCS8vIHdhaXQgZm9yIGFkYXB0ZXIgcmVhZHkKKwkJcmV0dXJuIERJRF9USU1FX09VVDsKKwlyZXR1cm4gRElEX09LOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglJcnFfSGFuZGxlcgk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJSW50ZXJydXB0IGhhbmRsZXIuCisgKgorICoJUGFyYW1ldGVyczoJCWlycQkJLSBIYXJkd2FyZSBJUlEgbnVtYmVyLgorICoJCQkJCWRldl9pZAktCisgKgkJCQkJcmVncwktCisgKgorICoJUmV0dXJuczoJCVRSVUUgaWYgZHJpdmUgaXMgbm90IHJlYWR5IGluIHRpbWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaXJxcmV0dXJuX3QgSXJxX0hhbmRsZXIgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisJeworCXN0cnVjdCBTY3NpX0hvc3QgICAqc2hvc3QgPSBOVUxMOwkvLyBQb2ludGVyIHRvIGhvc3QgZGF0YSBibG9jaworCVBBREFQVEVSMjAwMAkJcGFkYXB0ZXI7CQkvLyBQb2ludGVyIHRvIGFkYXB0ZXIgY29udHJvbCBzdHJ1Y3R1cmUKKwlQREVWMjAwMAkJCXBkZXY7CisJU2NzaV9DbW5kCQkgICAqU0NwbnQ7CisJVUNIQVIJCQkJdGFnID0gMDsKKwlVQ0hBUgkJCQl0YWcwOworCVVMT05HCQkJCWVycm9yOworCWludAkJCQkJcHVuOworCWludAkJCQkJYnVzOworCWludAkJCQkJejsKKyAgICB1bnNpZ25lZCBsb25nCQlmbGFnczsKKyAgICBpbnQgaGFuZGxlZCA9IDA7CisKKwlERUIocHJpbnRrICgiXG5wY2kyMDAwIHJlY2VpdmVkIGludGVycnVwdCAiKSk7CisJZm9yICggeiA9IDA7IHogPCBOdW1BZGFwdGVyczsgIHorKyApCQkJCQkJCQkJCS8vIHNjYW4gZm9yIGludGVycnVwdCB0byBwcm9jZXNzCisJCXsKKwkJaWYgKCBQc2lIb3N0W3pdLT5pcnEgPT0gKFVDSEFSKShpcnEgJiAweEZGKSApCisJCQl7CisJCQl0YWcgPSBpbmJfcCAoSE9TVERBVEEoUHNpSG9zdFt6XSktPnRhZyk7CisJCQlpZiAoICB0YWcgKQorCQkJCXsKKwkJCQlzaG9zdCA9IFBzaUhvc3Rbel07CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwlpZiAoICFzaG9zdCApCisJCXsKKwkJREVCIChwcmludGsgKCJcbnBjaTIwMDA6IG5vdCBteSBpbnRlcnJ1cHQiKSk7CisJCWdvdG8gb3V0OworCQl9CisKKyAgICBoYW5kbGVkID0gMTsKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcGFkYXB0ZXIgPSBIT1NUREFUQShzaG9zdCk7CisKKwl0YWcwID0gdGFnICYgMHg3RjsJCQkJCQkJCQkJCQkJCQkvLyBtYXNrIG9mZiB0aGUgZXJyb3IgYml0CisJZm9yICggYnVzID0gMDsgIGJ1cyA8IE1BWF9CVVM7ICBidXMrKyApCQkJCQkJCQkJCS8vIHNjYW4gdGhlIGJ1c3NlcworICAgIAl7CisJCWZvciAoIHB1biA9IDA7ICBwdW4gPCBNQVhfVU5JVFM7ICBwdW4rKyApCQkJCQkJCQkvLyBzY2FuIHRoZSB0YXJnZXRzCisgICAgCQl7CisJCQlwZGV2ID0gJnBhZGFwdGVyLT5kZXZbYnVzXVtwdW5dOworCQkJaWYgKCAhcGRldi0+dGFnICkKKyAgICAJCQljb250aW51ZTsKKwkJCWlmICggcGRldi0+dGFnID09IHRhZzAgKQkJCQkJCQkJCQkJLy8gaXMgdGhpcyBpdD8KKwkJCQl7CisJCQkJcGRldi0+dGFnID0gMDsKKwkJCQlTQ3BudCA9IHBkZXYtPlNDcG50OworCQkJCWdvdG8gdW5tYXBQcm9jZWVkOworICAgIAkJCX0KKwkJCX0KKyAgICAJfQorCisJb3V0Yl9wICgweEZGLCBwYWRhcHRlci0+dGFnKTsJCQkJCQkJCQkJCQkvLyBjbGVhciB0aGUgb3AgaW50ZXJydXB0CisJb3V0Yl9wIChDTURfRE9ORSwgcGFkYXB0ZXItPmNtZCk7CQkJCQkJCQkJCQkvLyBjb21wbGV0ZSB0aGUgb3AKKwlnb3RvIGlycV9yZXR1cm47CQkJCQkJCQkJCQkJCQkJLy8gZG9uZSwgYnV0LCB3aXRoIHdoYXQ/CisKK3VubWFwUHJvY2VlZDo7CisJaWYgKCAhYnVzICkKKwkJeworCQlzd2l0Y2ggKCBTQ3BudC0+Y21uZFswXSApCisJCQl7CisJCQljYXNlIFNDU0lPUF9URVNUX1VOSVRfUkVBRFk6CisJCQkJcGNpX3VubWFwX3NpbmdsZSAocGFkYXB0ZXItPnBkZXYsIFNDcG50LT5TQ3AuaGF2ZV9kYXRhX2luLCBzaXplb2YgKFNDcG50LT5zZW5zZV9idWZmZXIpLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCWdvdG8gaXJxUHJvY2VlZDsKKwkJCWNhc2UgU0NTSU9QX1JFQURfQ0FQQUNJVFk6CisJCQkJcGNpX3VubWFwX3NpbmdsZSAocGFkYXB0ZXItPnBkZXYsIFNDcG50LT5TQ3AuaGF2ZV9kYXRhX2luLCA4LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCWdvdG8gaXJxUHJvY2VlZDsKKwkJCWNhc2UgU0NTSU9QX1ZFUklGWToKKwkJCWNhc2UgU0NTSU9QX1NUQVJUX1NUT1BfVU5JVDoKKwkJCWNhc2UgU0NTSU9QX01FRElVTV9SRU1PVkFMOgorCQkJCWdvdG8gaXJxUHJvY2VlZDsKKwkJCX0KKwkJfQorCWlmICggU0NwbnQtPlNDcC5oYXZlX2RhdGFfaW4gKQorCQlwY2lfdW5tYXBfc2luZ2xlIChwYWRhcHRlci0+cGRldiwgU0NwbnQtPlNDcC5oYXZlX2RhdGFfaW4sIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4sIHNjc2lfdG9fcGNpX2RtYV9kaXIoU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisJZWxzZSAKKwkJeworCQlpZiAoIFNDcG50LT51c2Vfc2cgKQorCQkJcGNpX3VubWFwX3NnIChwYWRhcHRlci0+cGRldiwgKHN0cnVjdCBzY2F0dGVybGlzdCAqKVNDcG50LT5yZXF1ZXN0X2J1ZmZlciwgU0NwbnQtPnVzZV9zZywgc2NzaV90b19wY2lfZG1hX2RpcihTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKwkJfQorCitpcnFQcm9jZWVkOjsKKwlpZiAoIHRhZyAmIEVSUjA4X1RBR0dFRCApCQkJCQkJCQkJCQkJLy8gaXMgdGhlcmUgYW4gZXJyb3IgaGVyZT8KKwkJeworCQlpZiAoIFdhaXRSZWFkeSAocGFkYXB0ZXIpICkKKwkJCXsKKwkJCU9wRG9uZSAoU0NwbnQsIERJRF9USU1FX09VVCA8PCAxNik7CisJCQlnb3RvIGlycV9yZXR1cm47CisJCQl9CisKKwkJb3V0Yl9wICh0YWcwLCBwYWRhcHRlci0+bWIwKTsJCQkJCQkJCQkJLy8gZ2V0IHJlYWwgZXJyb3IgY29kZQorCQlvdXRiX3AgKENNRF9FUlJPUiwgcGFkYXB0ZXItPmNtZCk7CisJCWlmICggV2FpdFJlYWR5IChwYWRhcHRlcikgKQkJCQkJCQkJCQkJLy8gd2FpdCBmb3IgY29udHJvbGxlciB0byBzdWNrIHVwIHRoZSBvcAorCQkJeworCQkJT3BEb25lIChTQ3BudCwgRElEX1RJTUVfT1VUIDw8IDE2KTsKKwkJCWdvdG8gaXJxX3JldHVybjsKKwkJCX0KKworCQllcnJvciA9IGlubCAocGFkYXB0ZXItPm1iMCk7CQkJCQkJCQkJCS8vIGdldCBlcnJvciBkYXRhCisJCW91dGJfcCAoMHhGRiwgcGFkYXB0ZXItPnRhZyk7CQkJCQkJCQkJCS8vIGNsZWFyIHRoZSBvcCBpbnRlcnJ1cHQKKwkJb3V0Yl9wIChDTURfRE9ORSwgcGFkYXB0ZXItPmNtZCk7CQkJCQkJCQkJLy8gY29tcGxldGUgdGhlIG9wCisKKwkJREVCIChwcmludGsgKCJzdGF0dXM6ICVsWCAiLCBlcnJvcikpOworCQlpZiAoIGVycm9yID09IDB4MDAwMjAwMDIgKQkJCQkJCQkJCQkJLy8gaXMgdGhpcyBlcnJvciBhIGNoZWNrIGNvbmRpdGlvbj8KKwkJCXsKKwkJCWlmICggYnVzICkJCQkJCQkJCQkJCQkJCS8vIGFyZSB3ZSBkb2ludCBTQ1NJIGNvbW1hbmRzPworCQkJCXsKKwkJCQlPcERvbmUgKFNDcG50LCAoRElEX09LIDw8IDE2KSB8IDIpOworCQkJCWdvdG8gaXJxX3JldHVybjsKKwkJCQl9CisJCQlpZiAoICpTQ3BudC0+Y21uZCA9PSBTQ1NJT1BfVEVTVF9VTklUX1JFQURZICkKKwkJCQlPcERvbmUgKFNDcG50LCAoRFJJVkVSX1NFTlNFIDw8IDI0KSB8IChESURfT0sgPDwgMTYpIHwgMik7CS8vIHRlc3QgY2FsbGVyIHdlIGhhdmUgc2Vuc2UgZGF0YSB0b28KKwkJCWVsc2UKKwkJCQlPcERvbmUgKFNDcG50LCBESURfRVJST1IgPDwgMTYpOworCQkJZ290byBpcnFfcmV0dXJuOworCQkJfQorCQlPcERvbmUgKFNDcG50LCBESURfRVJST1IgPDwgMTYpOworCQlnb3RvIGlycV9yZXR1cm47CisJCX0KKworCW91dGJfcCAoMHhGRiwgcGFkYXB0ZXItPnRhZyk7CQkJCQkJCQkJCQkvLyBjbGVhciB0aGUgb3AgaW50ZXJydXB0CisJb3V0Yl9wIChDTURfRE9ORSwgcGFkYXB0ZXItPmNtZCk7CQkJCQkJCQkJCS8vIGNvbXBsZXRlIHRoZSBvcAorCU9wRG9uZSAoU0NwbnQsIERJRF9PSyA8PCAxNik7CisKK2lycV9yZXR1cm46CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CitvdXQ6CisgICAgcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJUGNpMjAwMF9RdWV1ZUNvbW1hbmQKKyAqCisgKglEZXNjcmlwdGlvbjoJUHJvY2VzcyBhIHF1ZXVlZCBjb21tYW5kIGZyb20gdGhlIFNDU0kgbWFuYWdlci4KKyAqCisgKglQYXJhbWV0ZXJzOgkJU0NwbnQgLSBQb2ludGVyIHRvIFNDU0kgY29tbWFuZCBzdHJ1Y3R1cmUuCisgKgkJCQkJZG9uZSAgLSBQb2ludGVyIHRvIGRvbmUgZnVuY3Rpb24gdG8gY2FsbC4KKyAqCisgKglSZXR1cm5zOgkJU3RhdHVzIGNvZGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUGNpMjAwMF9RdWV1ZUNvbW1hbmQgKFNjc2lfQ21uZCAqU0NwbnQsIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpCisJeworCVVDSEFSCQkgICAqY2RiID0gKFVDSEFSICopU0NwbnQtPmNtbmQ7CQkJCQkvLyBQb2ludGVyIHRvIFNDU0kgQ0RCCisJUEFEQVBURVIyMDAwCXBhZGFwdGVyID0gSE9TVERBVEEoU0NwbnQtPmRldmljZS0+aG9zdCk7CQkJLy8gUG9pbnRlciB0byBhZGFwdGVyIGNvbnRyb2wgc3RydWN0dXJlCisJaW50CQkJCXJjCQkgPSAtMTsJCQkJCQkJCS8vIGNvbW1hbmQgcmV0dXJuIGNvZGUKKwlVQ0hBUgkJCWJ1cwkJID0gU0NwbnQtPmRldmljZS0+Y2hhbm5lbDsKKwlVQ0hBUgkJCXB1bgkJID0gU0NwbnQtPmRldmljZS0+aWQ7CisJVUNIQVIJCQlsdW4JCSA9IFNDcG50LT5kZXZpY2UtPmx1bjsKKwlVQ0hBUgkJCWNtZDsKKwlQREVWMjAwMAkJcGRldgkgPSAmcGFkYXB0ZXItPmRldltidXNdW3B1bl07CisKKwlpZiAoICFkb25lICkKKwkJeworCQlwcmludGsoInBjaTIwMDBfcXVldWVjb21tYW5kOiAlMDJYOiBkb25lIGNhbid0IGJlIE5VTExcbiIsICpjZGIpOworCQlyZXR1cm4gMDsKKwkJfQorCisJU0NwbnQtPnNjc2lfZG9uZSA9IGRvbmU7CisJU0NwbnQtPlNDcC5oYXZlX2RhdGFfaW4gPSAwOworCXBkZXYtPlNDcG50ID0gU0NwbnQ7ICAJCQkJCQkJCQkvLyBTYXZlIHRoaXMgY29tbWFuZCBkYXRhCisKKwlpZiAoIFdhaXRSZWFkeSAocGFkYXB0ZXIpICkKKwkJeworCQlyYyA9IERJRF9FUlJPUjsKKwkJZ290byBmaW5pc2hlZDsKKwkJfQorCisJb3V0d19wIChwdW4gfCAobHVuIDw8IDgpLCBwYWRhcHRlci0+bWIwKTsKKworCWlmICggYnVzICkKKwkJeworCQlERUIgKGlmKCpjZGIpIHByaW50ayAoIlxuQ0RCOiAlWC0gICVYICVYICVYICVYICVYICVYICVYICVYICVYICVYICIsIFNDcG50LT5jbWRfbGVuLCBjZGJbMF0sIGNkYlsxXSwgY2RiWzJdLCBjZGJbM10sIGNkYls0XSwgY2RiWzVdLCBjZGJbNl0sIGNkYls3XSwgY2RiWzhdLCBjZGJbOV0pKTsKKwkJREVCIChpZigqY2RiKSBwcmludGsgKCJcbnRpbWVvdXRfcGVyX2NvbW1hbmQ6ICVkLCB0aW1lb3V0X3RvdGFsOiAlZCwgdGltZW91dDogJWQsIGludGVybmFsX3RpbW91dDogJWQiLCBTQ3BudC0+dGltZW91dF9wZXJfY29tbWFuZCwKKwkJCQkJCQkgIFNDcG50LT50aW1lb3V0X3RvdGFsLCBTQ3BudC0+dGltZW91dCwgU0NwbnQtPmludGVybmFsX3RpbWVvdXQpKTsKKwkJb3V0bCAoU0NwbnQtPnRpbWVvdXRfcGVyX2NvbW1hbmQsIHBhZGFwdGVyLT5tYjEpOworCQlvdXRiX3AgKENNRF9TQ1NJX1RJTUVPVVQsIHBhZGFwdGVyLT5jbWQpOworCQlpZiAoIFdhaXRSZWFkeSAocGFkYXB0ZXIpICkKKwkJCXsKKwkJCXJjID0gRElEX0VSUk9SOworCQkJZ290byBmaW5pc2hlZDsKKwkJCX0KKworCQlvdXR3X3AgKHB1biB8IChsdW4gPDwgOCksIHBhZGFwdGVyLT5tYjApOworCQlvdXR3X3AgKFNDcG50LT5jbWRfbGVuIDw8IDgsIHBhZGFwdGVyLT5tYjAgKyAyKTsKKwkJbWVtY3B5IChwZGV2LT5jZGIsIGNkYiwgTUFYX0NPTU1BTkRfU0laRSk7CisKKwkJb3V0bCAocGRldi0+Y2RiRG1hLCBwYWRhcHRlci0+bWIxKTsKKwkJaWYgKCBCdWlsZFNnTGlzdCAoU0NwbnQsIHBhZGFwdGVyLCBwZGV2KSApCisJCQljbWQgPSBDTURfU0NTSV9USFJVOworCQllbHNlCisJCQljbWQgPSBDTURfU0NTSV9USFJVX1NHOworCQlpZiAoIChwZGV2LT50YWcgPSBDb21tYW5kIChwYWRhcHRlciwgY21kKSkgPT0gMCApCisJCQlyYyA9IERJRF9USU1FX09VVDsKKwkJZ290byBmaW5pc2hlZDsKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoIGx1biApCisJCQl7CisJCQlyYyA9IERJRF9CQURfVEFSR0VUOworCQkJZ290byBmaW5pc2hlZDsKKwkJCX0KKwkJfQorCisJc3dpdGNoICggKmNkYiApCisJCXsKKwkJY2FzZSBTQ1NJT1BfSU5RVUlSWTogICAJCQkJCS8vIGlucXVpcnkgQ0RCCisJCQlpZiAoIGNkYlsyXSA9PSBTQ19NWV9SQUlEICkKKwkJCQl7CisJCQkJc3dpdGNoICggY2RiWzNdICkgCisJCQkJCXsKKwkJCQkJY2FzZSBNWV9TQ1NJX1JFQlVJTEQ6CisJCQkJCQlPcERvbmUgKFNDcG50LCBQc2lSYWlkQ21kIChwYWRhcHRlciwgQ01EX1JBSURfUkVCVUlMRCkgPDwgMTYpOworCQkJCQkJcmV0dXJuIDA7CisJCQkJCWNhc2UgTVlfU0NTSV9BTEFSTU1VVEU6CisJCQkJCQlPcERvbmUgKFNDcG50LCBQc2lSYWlkQ21kIChwYWRhcHRlciwgQ01EX1JBSURfTVVURSkgPDwgMTYpOworCQkJCQkJcmV0dXJuIDA7CisJCQkJCWNhc2UgTVlfU0NTSV9ERU1PRkFJTDoKKwkJCQkJCU9wRG9uZSAoU0NwbnQsIFBzaVJhaWRDbWQgKHBhZGFwdGVyLCBDTURfUkFJRF9GQUlMKSA8PCAxNik7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWlmICggU0NwbnQtPnVzZV9zZyApCisJCQkJCQkJeworCQkJCQkJCXJjID0gRElEX0VSUk9SOworCQkJCQkJCWdvdG8gZmluaXNoZWQ7CisJCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQlTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbiA9IHBjaV9tYXBfc2luZ2xlIChwYWRhcHRlci0+cGRldiwgU0NwbnQtPnJlcXVlc3RfYnVmZmVyLCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCQkJCQkJCQkJCSAgc2NzaV90b19wY2lfZG1hX2RpcihTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKwkJCQkJCQlvdXRsIChTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbiwgcGFkYXB0ZXItPm1iMik7CisJCQkJCQkJfQorCQkJCQkJb3V0bCAoY2RiWzVdLCBwYWRhcHRlci0+bWIwKTsKKwkJCQkJCW91dGwgKGNkYlszXSwgcGFkYXB0ZXItPm1iMyk7CisJCQkJCQljbWQgPSBDTURfREFTRF9SQUlEX1JROworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQlicmVhazsKKwkJCQl9CisJCQkKKwkJCWlmICggU0NwbnQtPnVzZV9zZyApCisJCQkJeworCQkJCVNDcG50LT5TQ3AuaGF2ZV9kYXRhX2luID0gcGNpX21hcF9zaW5nbGUgKHBhZGFwdGVyLT5wZGV2LAorCQkJCQkJCQkJICAoKHN0cnVjdCBzY2F0dGVybGlzdCAqKVNDcG50LT5yZXF1ZXN0X2J1ZmZlciktPmFkZHJlc3MsCisJCQkJCQkJCQkgIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCQkJCQkgIHNjc2lfdG9fcGNpX2RtYV9kaXIgKFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbikpOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJU0NwbnQtPlNDcC5oYXZlX2RhdGFfaW4gPSBwY2lfbWFwX3NpbmdsZSAocGFkYXB0ZXItPnBkZXYsIFNDcG50LT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQkJCQkJCSAgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkJCQkJCSAgc2NzaV90b19wY2lfZG1hX2RpciAoU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisJCQkJfQorCQkJb3V0bCAoU0NwbnQtPlNDcC5oYXZlX2RhdGFfaW4sIHBhZGFwdGVyLT5tYjIpOworCQkJb3V0bCAoU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiwgcGFkYXB0ZXItPm1iMyk7CisJCQljbWQgPSBDTURfREFTRF9TQ1NJX0lOUTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NTSU9QX1RFU1RfVU5JVF9SRUFEWToJCQkvLyB0ZXN0IHVuaXQgcmVhZHkgQ0RCCisJCQlTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbiA9IHBjaV9tYXBfc2luZ2xlIChwYWRhcHRlci0+cGRldiwgU0NwbnQtPnNlbnNlX2J1ZmZlciwgc2l6ZW9mIChTQ3BudC0+c2Vuc2VfYnVmZmVyKSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCW91dGwgKFNDcG50LT5TQ3AuaGF2ZV9kYXRhX2luLCBwYWRhcHRlci0+bWIyKTsKKwkJCW91dGwgKHNpemVvZiAoU0NwbnQtPnNlbnNlX2J1ZmZlciksIHBhZGFwdGVyLT5tYjMpOworCQkJY21kID0gQ01EX1RFU1RfUkVBRFk7CisJCQlicmVhazsKKworCQljYXNlIFNDU0lPUF9SRUFEX0NBUEFDSVRZOgkJCSAgCS8vIHJlYWQgY2FwYWNpdHkgQ0RCCisJCQlpZiAoIFNDcG50LT51c2Vfc2cgKQorCQkJCXsKKwkJCQlTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbiA9IHBjaV9tYXBfc2luZ2xlIChwYWRhcHRlci0+cGRldiwgKChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikoU0NwbnQtPnJlcXVlc3RfYnVmZmVyKSktPmFkZHJlc3MsCisJCQkJCQkJCQkJICA4LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCX0KKwkJCWVsc2UKKwkJCQlTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbiA9IHBjaV9tYXBfc2luZ2xlIChwYWRhcHRlci0+cGRldiwgU0NwbnQtPnJlcXVlc3RfYnVmZmVyLCA4LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJb3V0bCAoU0NwbnQtPlNDcC5oYXZlX2RhdGFfaW4sIHBhZGFwdGVyLT5tYjIpOworCQkJb3V0bCAoOCwgcGFkYXB0ZXItPm1iMyk7CisJCQljbWQgPSBDTURfREFTRF9DQVA7CisJCQlicmVhazsKKwkJY2FzZSBTQ1NJT1BfVkVSSUZZOgkJCQkJCS8vIHZlcmlmeSBDREIKKwkJCW91dHdfcCAoKFVTSE9SVCljZGJbOF0gfCAoKFVTSE9SVCljZGJbN10gPDwgOCksIHBhZGFwdGVyLT5tYjAgKyAyKTsKKwkJCW91dGwgKFhTQ1NJMkxPTkcgKCZjZGJbMl0pLCBwYWRhcHRlci0+bWIxKTsKKwkJCWNtZCA9IENNRF9SRUFEX1NHOworCQkJYnJlYWs7CisJCWNhc2UgU0NTSU9QX1JFQUQ6CQkJCQkJLy8gcmVhZDEwIENEQgorCQkJb3V0d19wICgoVVNIT1JUKWNkYls4XSB8ICgoVVNIT1JUKWNkYls3XSA8PCA4KSwgcGFkYXB0ZXItPm1iMCArIDIpOworCQkJb3V0bCAoWFNDU0kyTE9ORyAoJmNkYlsyXSksIHBhZGFwdGVyLT5tYjEpOworCQkJaWYgKCBCdWlsZFNnTGlzdCAoU0NwbnQsIHBhZGFwdGVyLCBwZGV2KSApCisJCQkJY21kID0gQ01EX1JFQUQ7CisJCQllbHNlCisJCQkJY21kID0gQ01EX1JFQURfU0c7CisJCQlicmVhazsKKwkJY2FzZSBTQ1NJT1BfUkVBRDY6CQkJCQkJLy8gcmVhZDYgIENEQgorCQkJb3V0d19wIChjZGJbNF0sIHBhZGFwdGVyLT5tYjAgKyAyKTsKKwkJCW91dGwgKChTQ1NJMkxPTkcgKCZjZGJbMV0pKSAmIDB4MDAxRkZGRkYsIHBhZGFwdGVyLT5tYjEpOworCQkJaWYgKCBCdWlsZFNnTGlzdCAoU0NwbnQsIHBhZGFwdGVyLCBwZGV2KSApCisJCQkJY21kID0gQ01EX1JFQUQ7CisJCQllbHNlCisJCQkJY21kID0gQ01EX1JFQURfU0c7CisJCQlicmVhazsKKwkJY2FzZSBTQ1NJT1BfV1JJVEU6CQkJCQkJLy8gd3JpdGUxMCBDREIKKwkJCW91dHdfcCAoKFVTSE9SVCljZGJbOF0gfCAoKFVTSE9SVCljZGJbN10gPDwgOCksIHBhZGFwdGVyLT5tYjAgKyAyKTsKKwkJCW91dGwgKFhTQ1NJMkxPTkcgKCZjZGJbMl0pLCBwYWRhcHRlci0+bWIxKTsKKwkJCWlmICggQnVpbGRTZ0xpc3QgKFNDcG50LCBwYWRhcHRlciwgcGRldikgKQorCQkJCWNtZCA9IENNRF9XUklURTsKKwkJCWVsc2UKKwkJCQljbWQgPSBDTURfV1JJVEVfU0c7CisJCQlicmVhazsKKwkJY2FzZSBTQ1NJT1BfV1JJVEU2OgkJCQkJCS8vIHdyaXRlNiAgQ0RCCisJCQlvdXR3X3AgKGNkYls0XSwgcGFkYXB0ZXItPm1iMCArIDIpOworCQkJb3V0bCAoKFNDU0kyTE9ORyAoJmNkYlsxXSkpICYgMHgwMDFGRkZGRiwgcGFkYXB0ZXItPm1iMSk7CisJCQlpZiAoIEJ1aWxkU2dMaXN0IChTQ3BudCwgcGFkYXB0ZXIsIHBkZXYpICkKKwkJCQljbWQgPSBDTURfV1JJVEU7CisJCQllbHNlCisJCQkJY21kID0gQ01EX1dSSVRFX1NHOworCQkJYnJlYWs7CisJCWNhc2UgU0NTSU9QX1NUQVJUX1NUT1BfVU5JVDoKKwkJCWNtZCA9IENNRF9FSkVDVF9NRURJQTsKKwkJCWJyZWFrOworCQljYXNlIFNDU0lPUF9NRURJVU1fUkVNT1ZBTDoKKwkJCXN3aXRjaCAoIGNkYls0XSApCisJCQkJeworCQkJCWNhc2UgMDoKKwkJCQkJY21kID0gQ01EX1VOTE9DS19ET09SOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCWNtZCA9IENNRF9MT0NLX0RPT1I7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWNtZCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCWlmICggY21kICkKKwkJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURFQiAocHJpbnRrICgicGNpMjAwMF9xdWV1ZWNvbW1hbmQ6IFVuc3VwcG9ydGVkIGNvbW1hbmQgJTAyWFxuIiwgKmNkYikpOworCQkJT3BEb25lIChTQ3BudCwgRElEX0VSUk9SIDw8IDE2KTsKKwkJCXJldHVybiAwOworCQl9CisKKwlpZiAoIChwZGV2LT50YWcgPSBDb21tYW5kIChwYWRhcHRlciwgY21kKSkgPT0gMCApCisJCXJjID0gRElEX1RJTUVfT1VUOworZmluaXNoZWQ6OworCWlmICggcmMgIT0gLTEgKQorCQlPcERvbmUgKFNDcG50LCByYyA8PCAxNik7CisJcmV0dXJuIDA7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVBjaTIwMDBfRGV0ZWN0CisgKgorICoJRGVzY3JpcHRpb246CURldGVjdCBhbmQgaW5pdGlhbGl6ZSBvdXIgYm9hcmRzLgorICoKKyAqCVBhcmFtZXRlcnM6CQl0cG50IC0gUG9pbnRlciB0byBTQ1NJIGhvc3QgdGVtcGxhdGUgc3RydWN0dXJlLgorICoKKyAqCVJldHVybnM6CQlOdW1iZXIgb2YgYWRhcHRlcnMgaW5zdGFsbGVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBjaTIwMDBfRGV0ZWN0IChTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQpCisJeworCWludAkJCQkJZm91bmQgPSAwOworCWludAkJCQkJaW5zdGFsbGVkID0gMDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICAgKnBzaG9zdDsKKwlQQURBUFRFUjIwMDAJICAgIHBhZGFwdGVyOworCWludAkJCQkJeiwgeno7CisJaW50CQkJCQlzZXRpcnE7CisJc3RydWN0IHBjaV9kZXYJICAgKnBkZXYgPSBOVUxMOworCVVDSEFSCQkJICAgKmNvbnNpc3RlbnQ7CisJZG1hX2FkZHJfdAkJCWNvbnNpc3RlbnREbWE7CisKKwl3aGlsZSAoIChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlIChWRU5ET1JfUFNJLCBERVZJQ0VfUk9ZXzEsIHBkZXYpKSAhPSBOVUxMICkKKwkJeworCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCQljb250aW51ZTsKKwkJcHNob3N0ID0gc2NzaV9yZWdpc3RlciAodHBudCwgc2l6ZW9mKEFEQVBURVIyMDAwKSk7CisJCWlmKHBzaG9zdCA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXBhZGFwdGVyID0gSE9TVERBVEEocHNob3N0KTsKKworCQlwYWRhcHRlci0+YmFzZVBvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDEpOworCQlERUIgKHByaW50ayAoIlxuQmFzZSBSZWdzID0gJSMwNFgiLCBwYWRhcHRlci0+YmFzZVBvcnQpKTsJCQkvLyBnZXQgdGhlIGJhc2UgSS9PIHBvcnQgYWRkcmVzcworCQlwYWRhcHRlci0+bWIwCT0gcGFkYXB0ZXItPmJhc2VQb3J0ICsgUlRSX01BSUxCT1g7CQkgICAJCQkvLyBnZXQgdGhlIDMyIGJpdCBtYWlsIGJveGVzCisJCXBhZGFwdGVyLT5tYjEJPSBwYWRhcHRlci0+YmFzZVBvcnQgKyBSVFJfTUFJTEJPWCArIDQ7CisJCXBhZGFwdGVyLT5tYjIJPSBwYWRhcHRlci0+YmFzZVBvcnQgKyBSVFJfTUFJTEJPWCArIDg7CisJCXBhZGFwdGVyLT5tYjMJPSBwYWRhcHRlci0+YmFzZVBvcnQgKyBSVFJfTUFJTEJPWCArIDEyOworCQlwYWRhcHRlci0+bWI0CT0gcGFkYXB0ZXItPmJhc2VQb3J0ICsgUlRSX01BSUxCT1ggKyAxNjsKKwkJcGFkYXB0ZXItPmNtZAk9IHBhZGFwdGVyLT5iYXNlUG9ydCArIFJUUl9MT0NBTF9ET09SQkVMTDsJCQkvLyBjb21tYW5kIHJlZ2lzdGVyCisJCXBhZGFwdGVyLT50YWcJPSBwYWRhcHRlci0+YmFzZVBvcnQgKyBSVFJfUENJX0RPT1JCRUxMOwkJCS8vIHRhZy9yZXNwb25zZSByZWdpc3RlcgorCQlwYWRhcHRlci0+cGRldiA9IHBkZXY7CisKKwkJaWYgKCBXYWl0UmVhZHkgKHBhZGFwdGVyKSApCisJCQlnb3RvIHVucmVnaXN0ZXI7CisJCW91dGJfcCAoMHg4NCwgcGFkYXB0ZXItPm1iMCk7CisJCW91dGJfcCAoQ01EX1NQRUNJRlksIHBhZGFwdGVyLT5jbWQpOworCQlpZiAoIFdhaXRSZWFkeSAocGFkYXB0ZXIpICkKKwkJCWdvdG8gdW5yZWdpc3RlcjsKKworCQljb25zaXN0ZW50ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQgKHBkZXYsIGNvbnNpc3RlbnRMZW4sICZjb25zaXN0ZW50RG1hKTsKKwkJaWYgKCAhY29uc2lzdGVudCApCisJCQl7CisJCQlwcmludGsgKCJVbmFibGUgdG8gYWxsb2NhdGUgRE1BIG1lbW9yeSBmb3IgUENJLTIwMDAgY29udHJvbGxlci5cbiIpOworCQkJZ290byB1bnJlZ2lzdGVyOworCQkJfQorCQkKKwkJc2NzaV9zZXRfZGV2aWNlKHBzaG9zdCwgJnBkZXYtPmRldik7CisJCXBzaG9zdC0+aXJxID0gcGRldi0+aXJxOworCQlzZXRpcnEgPSAxOworCQlwYWRhcHRlci0+aXJxT3duZWQgPSAwOworCQlmb3IgKCB6ID0gMDsgIHogPCBpbnN0YWxsZWQ7ICB6KysgKQkJCQkJCQkJCS8vIHNjYW4gZm9yIHNoYXJlZCBpbnRlcnJ1cHRzCisJCQl7CisJCQlpZiAoIFBzaUhvc3Rbel0tPmlycSA9PSBwc2hvc3QtPmlycSApCQkJCQkJCS8vIGlmIHNoYXJlZCB0aGVuLCBkb24ndCBwb3NzZXMKKwkJCQlzZXRpcnEgPSAwOworCQkJfQorCQlpZiAoIHNldGlycSApCQkJCQkJCQkJCQkJLy8gaWYgbm90IHNoYXJlZCwgcG9zc2VzCisJCQl7CisJCQlpZiAoIHJlcXVlc3RfaXJxIChwc2hvc3QtPmlycSwgSXJxX0hhbmRsZXIsIFNBX1NISVJRLCAicGNpMjAwMCIsIHBhZGFwdGVyKSA8IDAgKQorCQkJCXsKKwkJCQlpZiAoIHJlcXVlc3RfaXJxIChwc2hvc3QtPmlycSwgSXJxX0hhbmRsZXIsIFNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLCAicGNpMjAwMCIsIHBhZGFwdGVyKSA8IDAgKQorCQkJCQl7CisJCQkJCXByaW50ayAoIlVuYWJsZSB0byBhbGxvY2F0ZSBJUlEgZm9yIFBDSS0yMDAwIGNvbnRyb2xsZXIuXG4iKTsKKwkJCQkJcGNpX2ZyZWVfY29uc2lzdGVudCAocGRldiwgY29uc2lzdGVudExlbiwgY29uc2lzdGVudCwgY29uc2lzdGVudERtYSk7CisJCQkJCWdvdG8gdW5yZWdpc3RlcjsKKwkJCQkJfQorCQkJCX0KKwkJCXBhZGFwdGVyLT5pcnFPd25lZCA9IHBzaG9zdC0+aXJxOwkJCQkJCS8vIHNldCBJUlEgYXMgb3duZWQKKwkJCX0KKwkJUHNpSG9zdFtpbnN0YWxsZWRdCT0gcHNob3N0OwkJCQkJCQkJCQkvLyBzYXZlIFNDU0lfSE9TVCBwb2ludGVyCisKKwkJcHNob3N0LT5pb19wb3J0CQk9IHBhZGFwdGVyLT5iYXNlUG9ydDsKKwkJcHNob3N0LT5uX2lvX3BvcnQJPSAweEZGOworCQlwc2hvc3QtPnVuaXF1ZV9pZAk9IHBhZGFwdGVyLT5iYXNlUG9ydDsKKwkJcHNob3N0LT5tYXhfaWQJCT0gMTY7CisJCXBzaG9zdC0+bWF4X2NoYW5uZWwJPSAxOworCisJCWZvciAoIHp6ID0gMDsgIHp6IDwgTUFYX0JVUzsgIHp6KysgKQorCQkJZm9yICggeiA9IDA7IHogPCBNQVhfVU5JVFM7ICB6KysgKQorCQkJCXsKKwkJCQlwYWRhcHRlci0+ZGV2W3p6XVt6XS50YWcgPSAwOworCQkJCXBhZGFwdGVyLT5kZXZbenpdW3pdLnNjYXRHYXRoID0gKFBTQ0FUR0FUSCljb25zaXN0ZW50OworCQkJCXBhZGFwdGVyLT5kZXZbenpdW3pdLnNjYXRHYXRoRG1hID0gY29uc2lzdGVudERtYTsKKwkJCQljb25zaXN0ZW50ICs9IDE2ICogc2l6ZW9mIChTQ0FUR0FUSCk7CisJCQkJY29uc2lzdGVudERtYSArPSAxNiAqIHNpemVvZiAoU0NBVEdBVEgpOworCQkJCXBhZGFwdGVyLT5kZXZbenpdW3pdLmNkYiA9IChVQ0hBUiAqKWNvbnNpc3RlbnQ7CisJCQkJcGFkYXB0ZXItPmRldlt6el1bel0uY2RiRG1hID0gY29uc2lzdGVudERtYTsKKwkJCQljb25zaXN0ZW50ICs9IE1BWF9DT01NQU5EX1NJWkU7CisJCQkJY29uc2lzdGVudERtYSArPSBNQVhfQ09NTUFORF9TSVpFOworCQkJCX0KKwkJCQorCQlwcmludGsoIlxuUFNJLTIwMDAgSW50ZWxsaWdlbnQgU3RvcmFnZSBTQ1NJIENPTlRST0xMRVI6IGF0IEkvTyA9ICVsWCAgSVJRID0gJWRcbiIsIHBhZGFwdGVyLT5iYXNlUG9ydCwgcHNob3N0LT5pcnEpOworCQlwcmludGsoIlZlcnNpb24gJXMsIENvbXBpbGVkICVzICVzXG5cbiIsIFBDSTIwMDBfVkVSU0lPTiwgIF9fREFURV9fLCBfX1RJTUVfXyk7CisJCWZvdW5kKys7CisJCWlmICggKytpbnN0YWxsZWQgPCBNQVhBREFQVEVSICkKKwkJCWNvbnRpbnVlOworCQlicmVhazsKK3VucmVnaXN0ZXI6OworCQlzY3NpX3VucmVnaXN0ZXIgKHBzaG9zdCk7CisJCWZvdW5kKys7CisJCX0KKwlOdW1BZGFwdGVycyA9IGluc3RhbGxlZDsKKwlyZXR1cm4gaW5zdGFsbGVkOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglQY2kyMDAwX0Fib3J0CisgKgorICoJRGVzY3JpcHRpb246CVByb2Nlc3MgdGhlIEFib3J0IGNvbW1hbmQgZnJvbSB0aGUgU0NTSSBtYW5hZ2VyLgorICoKKyAqCVBhcmFtZXRlcnM6CQlTQ3BudCAtIFBvaW50ZXIgdG8gU0NTSSBjb21tYW5kIHN0cnVjdHVyZS4KKyAqCisgKglSZXR1cm5zOgkJQWxsd2F5cyBzbm9vemUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUGNpMjAwMF9BYm9ydCAoU2NzaV9DbW5kICpTQ3BudCkKKwl7CisJREVCIChwcmludGsgKCJwY2kyMDAwX2Fib3J0XG4iKSk7CisJcmV0dXJuIFNDU0lfQUJPUlRfU05PT1pFOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglQY2kyMDAwX1Jlc2V0CisgKgorICoJRGVzY3JpcHRpb246CVByb2Nlc3MgdGhlIFJlc2V0IGNvbW1hbmQgZnJvbSB0aGUgU0NTSSBtYW5hZ2VyLgorICoKKyAqCVBhcmFtZXRlcnM6CQlTQ3BudCAtIFBvaW50ZXIgdG8gU0NTSSBjb21tYW5kIHN0cnVjdHVyZS4KKyAqCQkJCQlmbGFncyAtIEZsYWdzIGFib3V0IHRoZSByZXNldCBjb21tYW5kCisgKgorICoJUmV0dXJuczoJCU5vIGFjdGl2ZSBjb21tYW5kIGF0IHRoaXMgdGltZSwgc28gdGhpcyBtZWFucworICoJCQkJCXRoYXQgZWFjaCB0aW1lIHdlIGdvdCBzb21lIGtpbmQgb2YgcmVzcG9uc2UgdGhlCisgKgkJCQkJbGFzdCB0aW1lIHRocm91Z2guICBUZWxsIHRoZSBtaWQtbGV2ZWwgY29kZSB0bworICoJCQkJCXJlcXVlc3Qgc2Vuc2UgaW5mb3JtYXRpb24gaW4gb3JkZXIgdG8gZGVjaWRlIHdoYXQKKyAqCQkJCQl0byBkbyBuZXh0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBjaTIwMDBfUmVzZXQgKFNjc2lfQ21uZCAqU0NwbnQsIHVuc2lnbmVkIGludCByZXNldF9mbGFncykKKwl7CisJcmV0dXJuIFNDU0lfUkVTRVRfUFVOVDsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJUGNpMjAwMF9SZWxlYXNlCisgKgorICoJRGVzY3JpcHRpb246CVJlbGVhc2UgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgYSBzaW5nbGUgZWFjaCBhZGFwdGVyLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwc2hvc3QgLSBQb2ludGVyIHRvIFNDU0kgY29tbWFuZCBzdHJ1Y3R1cmUuCisgKgorICoJUmV0dXJuczoJCXplcm8uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUGNpMjAwMF9SZWxlYXNlIChzdHJ1Y3QgU2NzaV9Ib3N0ICpwc2hvc3QpCisJeworICAgIFBBREFQVEVSMjAwMAlwYWRhcHRlciA9IEhPU1REQVRBIChwc2hvc3QpOworCisJaWYgKCBwYWRhcHRlci0+aXJxT3duZWQgKQorCQlmcmVlX2lycSAocHNob3N0LT5pcnEsIHBhZGFwdGVyKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50IChwYWRhcHRlci0+cGRldiwgY29uc2lzdGVudExlbiwgcGFkYXB0ZXItPmRldlswXVswXS5zY2F0R2F0aCwgcGFkYXB0ZXItPmRldlswXVswXS5zY2F0R2F0aERtYSk7CisJcmVsZWFzZV9yZWdpb24gKHBzaG9zdC0+aW9fcG9ydCwgcHNob3N0LT5uX2lvX3BvcnQpOworICAgIHNjc2lfdW5yZWdpc3Rlcihwc2hvc3QpOworICAgIHJldHVybiAwOworCX0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVBjaTIwMDBfQmlvc1BhcmFtCisgKgorICoJRGVzY3JpcHRpb246CVByb2Nlc3MgdGhlIGJpb3NwYXJhbSByZXF1ZXN0IGZyb20gdGhlIFNDU0kgbWFuYWdlciB0bworICoJCQkJCXJldHVybiBDL0gvUyBkYXRhLgorICoKKyAqCVBhcmFtZXRlcnM6CQlkaXNrIC0gUG9pbnRlciB0byBTQ1NJIGRpc2sgc3RydWN0dXJlLgorICoJCQkJCWRldgkgLSBNYWpvci9taW5vciBudW1iZXIgZnJvbSBrZXJuZWwuCisgKgkJCQkJZ2VvbSAtIFBvaW50ZXIgdG8gaW50ZWdlciBhcnJheSB0byBwbGFjZSBnZW9tZXRyeSBkYXRhLgorICoKKyAqCVJldHVybnM6CQl6ZXJvLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBjaTIwMDBfQmlvc1BhcmFtIChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwKKwkJc2VjdG9yX3QgY2FwYWNpdHksIGludCBnZW9tW10pCisJeworCVBBREFQVEVSMjAwMAkgICAgcGFkYXB0ZXI7CisKKwlwYWRhcHRlciA9IEhPU1REQVRBKHNkZXYtPmhvc3QpOworCisJaWYgKCBXYWl0UmVhZHkgKHBhZGFwdGVyKSApCisJCXJldHVybiAwOworCW91dGJfcCAoc2Rldi0+aWQsIHBhZGFwdGVyLT5tYjApOworCW91dGJfcCAoQ01EX0dFVF9QQVJNUywgcGFkYXB0ZXItPmNtZCk7CisJaWYgKCBXYWl0UmVhZHkgKHBhZGFwdGVyKSApCisJCXJldHVybiAwOworCisJZ2VvbVswXSA9IGluYl9wIChwYWRhcHRlci0+bWIyICsgMyk7CisJZ2VvbVsxXSA9IGluYl9wIChwYWRhcHRlci0+bWIyICsgMik7CisJZ2VvbVsyXSA9IGlud19wIChwYWRhcHRlci0+bWIyKTsKKwlyZXR1cm4gMDsKKwl9CisKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCT0gInBjaTIwMDAiLAorCS5uYW1lCQk9ICJQQ0ktMjAwMCBTQ1NJIEludGVsbGlnZW50IERpc2sgQ29udHJvbGxlciIsCisJLmRldGVjdAkJPSBQY2kyMDAwX0RldGVjdCwKKwkucmVsZWFzZQk9IFBjaTIwMDBfUmVsZWFzZSwKKwkucXVldWVjb21tYW5kCT0gUGNpMjAwMF9RdWV1ZUNvbW1hbmQsCisJLmFib3J0CQk9IFBjaTIwMDBfQWJvcnQsCisJLnJlc2V0CQk9IFBjaTIwMDBfUmVzZXQsCisJLmJpb3NfcGFyYW0JPSBQY2kyMDAwX0Jpb3NQYXJhbSwKKwkuY2FuX3F1ZXVlCT0gMTYsCisJLnRoaXNfaWQJPSAtMSwKKwkuc2dfdGFibGVzaXplCT0gMTYsCisJLmNtZF9wZXJfbHVuCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJPSBESVNBQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNpMjAwMC5oIGIvZHJpdmVycy9zY3NpL3BjaTIwMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjVhZmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BjaTIwMDAuaApAQCAtMCwwICsxLDIwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBlcmNlcHRpdmUgU29sdXRpb25zLCBJbmMuIFBDSS0yMDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIHBjaTIwMDAuaCAtIExpbnV4IEhvc3QgRHJpdmVyIGZvciBQQ0ktMjAwMCBJbnRlbGxpQ2FjaGUgU0NTSSBBZGFwdGVycworICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5IFBlcmNlcHRpdmUgU29sdXRpb25zLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZQorICogY29kZSByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgY29tbWVudCB3aXRob3V0CisgKiBtb2RpZmljYXRpb24uCisgKgorICogVGVjaG5pY2FsIHVwZGF0ZXMgYW5kIHByb2R1Y3QgaW5mb3JtYXRpb24gYXQ6CisgKiAgaHR0cDovL3d3dy5wc2lkaXNrLmNvbQorICoKKyAqIFBsZWFzZSBzZW5kIHF1ZXN0aW9ucywgY29tbWVudHMsIGJ1ZyByZXBvcnRzIHRvOgorICogIHRlY2hAcHNpZGlzay5jb20gVGVjaG5pY2FsIFN1cHBvcnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX1BDSTIwMDBfSAorI2RlZmluZSBfUENJMjAwMF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaWZuZGVmCVBTSV9FSURFX1NDU0lPUAorI2RlZmluZQlQU0lfRUlERV9TQ1NJT1AJMQorCisjaWZuZGVmIExJTlVYX1ZFUlNJT05fQ09ERQorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNlbmRpZiAKKyNkZWZpbmUJTElOVVhWRVJTSU9OKHYscCxzKSAgICAoKCh2KTw8MTYpICsgKChwKTw8OCkgKyAocykpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJZGVmaW5pdGlvbiBvZiBzdGFuZGFyZCBkYXRhIHR5cGVzCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJQ0hBUgljaGFyCisjZGVmaW5lCVVDSEFSCXVuc2lnbmVkIGNoYXIKKyNkZWZpbmUJU0hPUlQJc2hvcnQKKyNkZWZpbmUJVVNIT1JUCXVuc2lnbmVkIHNob3J0CisjZGVmaW5lCUJPT0wJbG9uZworI2RlZmluZQlMT05HCWxvbmcKKyNkZWZpbmUJVUxPTkcJdW5zaWduZWQgbG9uZworI2RlZmluZQlWT0lECXZvaWQKKwordHlwZWRlZglDSEFSCSpQQ0hBUjsKK3R5cGVkZWYJVUNIQVIJKlBVQ0hBUjsKK3R5cGVkZWYJU0hPUlQJKlBTSE9SVDsKK3R5cGVkZWYJVVNIT1JUCSpQVVNIT1JUOwordHlwZWRlZglCT09MCSpQQk9PTDsKK3R5cGVkZWYJTE9ORwkqUExPTkc7Cit0eXBlZGVmCVVMT05HCSpQVUxPTkc7Cit0eXBlZGVmCVZPSUQJKlBWT0lEOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJTWlzYy4gbWFjcm9zCQkJIAkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQU5ZMlNDU0kodXAsIHApCQkJCQlcCisoKFVDSEFSICopdXApWzBdID0gKCgoVUxPTkcpKHApKSA+PiA4KTsJXAorKChVQ0hBUiAqKXVwKVsxXSA9ICgoVUxPTkcpKHApKTsKKworI2RlZmluZSBTQ1NJMkxPTkcodXApCQkJCQlcCisoICgoKGxvbmcpKigoKFVDSEFSICopdXApKSkgPDwgMTYpCQlcCisrICgoKGxvbmcpKCgoVUNIQVIgKil1cClbMV0pKSA8PCA4KQkJXAorKyAoKGxvbmcpKCgoVUNIQVIgKil1cClbMl0pKSApCisKKyNkZWZpbmUgWEFOWTJTQ1NJKHVwLCBwKQkJCQlcCisoKFVDSEFSICopdXApWzBdID0gKChsb25nKShwKSkgPj4gMjQ7CVwKKygoVUNIQVIgKil1cClbMV0gPSAoKGxvbmcpKHApKSA+PiAxNjsJXAorKChVQ0hBUiAqKXVwKVsyXSA9ICgobG9uZykocCkpID4+IDg7CVwKKygoVUNIQVIgKil1cClbM10gPSAoKGxvbmcpKHApKTsKKworI2RlZmluZSBYU0NTSTJMT05HKHVwKQkJCQkJXAorKCAoKChsb25nKSgoKFVDSEFSICopdXApWzBdKSkgPDwgMjQpCVwKKysgKCgobG9uZykoKChVQ0hBUiAqKXVwKVsxXSkpIDw8IDE2KQlcCisrICgoKGxvbmcpKCgoVUNIQVIgKil1cClbMl0pKSA8PCAgOCkJXAorKyAoKGxvbmcpKCgoVUNIQVIgKil1cClbM10pKSApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJU0NTSSBDREIgb3BlcmF0aW9uIGNvZGVzIAkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgU0NTSU9QX1RFU1RfVU5JVF9SRUFEWQkJMHgwMAorI2RlZmluZSBTQ1NJT1BfUkVaRVJPX1VOSVQJCQkweDAxCisjZGVmaW5lIFNDU0lPUF9SRVdJTkQJCQkJMHgwMQorI2RlZmluZSBTQ1NJT1BfUkVRVUVTVF9CTE9DS19BRERSCTB4MDIKKyNkZWZpbmUgU0NTSU9QX1JFUVVFU1RfU0VOU0UJCTB4MDMKKyNkZWZpbmUgU0NTSU9QX0ZPUk1BVF9VTklUCQkJMHgwNAorI2RlZmluZSBTQ1NJT1BfUkVBRF9CTE9DS19MSU1JVFMJMHgwNQorI2RlZmluZSBTQ1NJT1BfUkVBU1NJR05fQkxPQ0tTCQkweDA3CisjZGVmaW5lIFNDU0lPUF9SRUFENgkJCQkweDA4CisjZGVmaW5lIFNDU0lPUF9SRUNFSVZFCQkJCTB4MDgKKyNkZWZpbmUgU0NTSU9QX1dSSVRFNgkJCQkweDBBCisjZGVmaW5lIFNDU0lPUF9QUklOVAkJCQkweDBBCisjZGVmaW5lIFNDU0lPUF9TRU5ECQkJCQkweDBBCisjZGVmaW5lIFNDU0lPUF9TRUVLNgkJCQkweDBCCisjZGVmaW5lIFNDU0lPUF9UUkFDS19TRUxFQ1QJCQkweDBCCisjZGVmaW5lIFNDU0lPUF9TTEVXX1BSSU5UCQkJMHgwQgorI2RlZmluZSBTQ1NJT1BfU0VFS19CTE9DSwkJCTB4MEMKKyNkZWZpbmUgU0NTSU9QX1BBUlRJVElPTgkJCTB4MEQKKyNkZWZpbmUgU0NTSU9QX1JFQURfUkVWRVJTRQkJCTB4MEYKKyNkZWZpbmUgU0NTSU9QX1dSSVRFX0ZJTEVNQVJLUwkJMHgxMAorI2RlZmluZSBTQ1NJT1BfRkxVU0hfQlVGRkVSCQkJMHgxMAorI2RlZmluZSBTQ1NJT1BfU1BBQ0UJCQkJMHgxMQorI2RlZmluZSBTQ1NJT1BfSU5RVUlSWQkJCQkweDEyCisjZGVmaW5lIFNDU0lPUF9WRVJJRlk2CQkJCTB4MTMKKyNkZWZpbmUgU0NTSU9QX1JFQ09WRVJfQlVGX0RBVEEJCTB4MTQKKyNkZWZpbmUgU0NTSU9QX01PREVfU0VMRUNUCQkJMHgxNQorI2RlZmluZSBTQ1NJT1BfUkVTRVJWRV9VTklUCQkJMHgxNgorI2RlZmluZSBTQ1NJT1BfUkVMRUFTRV9VTklUCQkJMHgxNworI2RlZmluZSBTQ1NJT1BfQ09QWQkJCQkJMHgxOAorI2RlZmluZSBTQ1NJT1BfRVJBU0UJCQkJMHgxOQorI2RlZmluZSBTQ1NJT1BfTU9ERV9TRU5TRQkJCTB4MUEKKyNkZWZpbmUgU0NTSU9QX1NUQVJUX1NUT1BfVU5JVAkJMHgxQgorI2RlZmluZSBTQ1NJT1BfU1RPUF9QUklOVAkJCTB4MUIKKyNkZWZpbmUgU0NTSU9QX0xPQURfVU5MT0FECQkJMHgxQgorI2RlZmluZSBTQ1NJT1BfUkVDRUlWRV9ESUFHTk9TVElDCTB4MUMKKyNkZWZpbmUgU0NTSU9QX1NFTkRfRElBR05PU1RJQwkJMHgxRAorI2RlZmluZSBTQ1NJT1BfTUVESVVNX1JFTU9WQUwJCTB4MUUKKyNkZWZpbmUgU0NTSU9QX1JFQURfQ0FQQUNJVFkJCTB4MjUKKyNkZWZpbmUgU0NTSU9QX1JFQUQJCQkJCTB4MjgKKyNkZWZpbmUgU0NTSU9QX1dSSVRFCQkJCTB4MkEKKyNkZWZpbmUgU0NTSU9QX1NFRUsJCQkJCTB4MkIKKyNkZWZpbmUgU0NTSU9QX0xPQ0FURQkJCQkweDJCCisjZGVmaW5lIFNDU0lPUF9XUklURV9WRVJJRlkJCQkweDJFCisjZGVmaW5lIFNDU0lPUF9WRVJJRlkJCQkJMHgyRgorI2RlZmluZSBTQ1NJT1BfU0VBUkNIX0RBVEFfSElHSAkJMHgzMAorI2RlZmluZSBTQ1NJT1BfU0VBUkNIX0RBVEFfRVFVQUwJMHgzMQorI2RlZmluZSBTQ1NJT1BfU0VBUkNIX0RBVEFfTE9XCQkweDMyCisjZGVmaW5lIFNDU0lPUF9TRVRfTElNSVRTCQkJMHgzMworI2RlZmluZSBTQ1NJT1BfUkVBRF9QT1NJVElPTgkJMHgzNAorI2RlZmluZSBTQ1NJT1BfU1lOQ0hST05JWkVfQ0FDSEUJMHgzNQorI2RlZmluZSBTQ1NJT1BfQ09NUEFSRQkJCQkweDM5CisjZGVmaW5lIFNDU0lPUF9DT1BZX0NPTVBBUkUJCQkweDNBCisjZGVmaW5lIFNDU0lPUF9XUklURV9EQVRBX0JVRkYJCTB4M0IKKyNkZWZpbmUgU0NTSU9QX1JFQURfREFUQV9CVUZGCQkweDNDCisjZGVmaW5lIFNDU0lPUF9DSEFOR0VfREVGSU5JVElPTgkweDQwCisjZGVmaW5lIFNDU0lPUF9SRUFEX1NVQl9DSEFOTkVMCQkweDQyCisjZGVmaW5lIFNDU0lPUF9SRUFEX1RPQwkJCQkweDQzCisjZGVmaW5lIFNDU0lPUF9SRUFEX0hFQURFUgkJCTB4NDQKKyNkZWZpbmUgU0NTSU9QX1BMQVlfQVVESU8JCQkweDQ1CisjZGVmaW5lIFNDU0lPUF9QTEFZX0FVRElPX01TRgkJMHg0NworI2RlZmluZSBTQ1NJT1BfUExBWV9UUkFDS19JTkRFWAkJMHg0OAorI2RlZmluZSBTQ1NJT1BfUExBWV9UUkFDS19SRUxBVElWRQkweDQ5CisjZGVmaW5lIFNDU0lPUF9QQVVTRV9SRVNVTUUJCQkweDRCCisjZGVmaW5lIFNDU0lPUF9MT0dfU0VMRUNUCQkJMHg0QworI2RlZmluZSBTQ1NJT1BfTE9HX1NFTlNFCQkJMHg0RAorI2RlZmluZSBTQ1NJT1BfTU9ERV9TRUxFQ1QxMAkJMHg1NQorI2RlZmluZSBTQ1NJT1BfTU9ERV9TRU5TRTEwCQkJMHg1QQorI2RlZmluZSBTQ1NJT1BfTE9BRF9VTkxPQURfU0xPVAkJMHhBNgorI2RlZmluZSBTQ1NJT1BfTUVDSEFOSVNNX1NUQVRVUwkJMHhCRAorI2RlZmluZSBTQ1NJT1BfUkVBRF9DRAkJCQkweEJFCisKKy8vIFNDU0kgcmVhZCBjYXBhY2l0eSBzdHJ1Y3R1cmUKK3R5cGVkZWYJc3RydWN0IF9SRUFEX0NBUEFDSVRZX0RBVEEKKwl7CisJVUxPTkcgYmxrczsJCQkJLyogdG90YWwgYmxvY2tzIChjb252ZXJ0ZWQgdG8gbGl0dGxlIGVuZGlhbikgKi8KKwlVTE9ORyBibGtzaXo7CQkJLyogc2l6ZSBvZiBlYWNoIChjb252ZXJ0ZWQgdG8gbGl0dGxlIGVuZGlhbikgKi8KKwl9CVJFQURfQ0FQQUNJVFlfREFUQSwgKlBSRUFEX0NBUEFDSVRZX0RBVEE7CisKKy8vIFNDU0kgaW5xdWlyeSBkYXRhCit0eXBlZGVmIHN0cnVjdCBfSU5RVUlSWURBVEEKKwl7CisJVUNIQVIgRGV2aWNlVHlwZQkJCTo1OworCVVDSEFSIERldmljZVR5cGVRdWFsaWZpZXIJOjM7CisJVUNIQVIgRGV2aWNlVHlwZU1vZGlmaWVyCTo3OworCVVDSEFSIFJlbW92YWJsZU1lZGlhCQk6MTsKKyAgICBVQ0hBUiBWZXJzaW9uczsKKyAgICBVQ0hBUiBSZXNwb25zZURhdGFGb3JtYXQ7CisgICAgVUNIQVIgQWRkaXRpb25hbExlbmd0aDsKKyAgICBVQ0hBUiBSZXNlcnZlZFsyXTsKKwlVQ0hBUiBTb2Z0UmVzZXQJCQkJOjE7CisJVUNIQVIgQ29tbWFuZFF1ZXVlCQkJOjE7CisJVUNIQVIgUmVzZXJ2ZWQyCQkJCToxOworCVVDSEFSIExpbmtlZENvbW1hbmRzCQk6MTsKKwlVQ0hBUiBTeW5jaHJvbm91cwkJCToxOworCVVDSEFSIFdpZGUxNkJpdAkJCQk6MTsKKwlVQ0hBUiBXaWRlMzJCaXQJCQkJOjE7CisJVUNIQVIgUmVsYXRpdmVBZGRyZXNzaW5nCToxOworICAgIFVDSEFSIFZlbmRvcklkWzhdOworICAgIFVDSEFSIFByb2R1Y3RJZFsxNl07CisgICAgVUNIQVIgUHJvZHVjdFJldmlzaW9uTGV2ZWxbNF07CisgICAgVUNIQVIgVmVuZG9yU3BlY2lmaWNbMjBdOworICAgIFVDSEFSIFJlc2VydmVkM1s0MF07CisJfQlJTlFVSVJZREFUQSwgKlBJTlFVSVJZREFUQTsKKworI2VuZGlmCisKKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKK2ludCBQY2kyMDAwX0RldGVjdAkJCShTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQpOworaW50IFBjaTIwMDBfQ29tbWFuZAkJCShTY3NpX0NtbmQgKlNDcG50KTsKK2ludCBQY2kyMDAwX1F1ZXVlQ29tbWFuZAkoU2NzaV9DbW5kICpTQ3BudCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSk7CitpbnQgUGNpMjAwMF9BYm9ydAkJCShTY3NpX0NtbmQgKlNDcG50KTsKK2ludCBQY2kyMDAwX1Jlc2V0CQkJKFNjc2lfQ21uZCAqU0NwbnQsIHVuc2lnbmVkIGludCBmbGFncyk7CitpbnQgUGNpMjAwMF9SZWxlYXNlCQkJKHN0cnVjdCBTY3NpX0hvc3QgKnBzaG9zdCk7CitpbnQgUGNpMjAwMF9CaW9zUGFyYW0JCShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCQkJCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCQkJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgZ2VvbVtdKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNpMjIyMGkuYyBiL2RyaXZlcnMvc2NzaS9wY2kyMjIwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOTVlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcGNpMjIyMGkuYwpAQCAtMCwwICsxLDI5MTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQZXJjZXB0aXZlIFNvbHV0aW9ucywgSW5jLiBQQ0ktMjIyMEkgZGV2aWNlIGRyaXZlciBmb3IgTGludXguCisgKgorICogcGNpMjIyMGkuYyAtIExpbnV4IEhvc3QgRHJpdmVyIGZvciBQQ0ktMjIyMEkgRUlERSBSQUlEIEFkYXB0ZXJzCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkgUGVyY2VwdGl2ZSBTb2x1dGlvbnMsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlCisgKiBjb2RlIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBjb21tZW50IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbi4KKyAqCisgKiBUZWNobmljYWwgdXBkYXRlcyBhbmQgcHJvZHVjdCBpbmZvcm1hdGlvbiBhdDoKKyAqICBodHRwOi8vd3d3LnBzaWRpc2suY29tCisgKgorICogUGxlYXNlIHNlbmQgcXVlc3Rpb25zLCBjb21tZW50cywgYnVnIHJlcG9ydHMgdG86CisgKiAgdGVjaEBwc2lkaXNrLmNvbSBUZWNobmljYWwgU3VwcG9ydAorICoKKyAqCisgKglSZXZpc2lvbnMgMS4xMAkJTWFyLTI2LTE5OTkKKyAqCQktIFVwZGF0ZWQgZHJpdmVyIGZvciBSQUlEIGFuZCBob3QgcmVjb25zdHJ1Y3Qgc3VwcG9ydC4KKyAqCisgKglSZXZpc2lvbnMgMS4xMQkJTWFyLTI2LTE5OTkKKyAqCQktIEZpeGVkIHNwaW5sb2NrIGFuZCBQQ0kgY29uZmlndXJhdGlvbi4KKyAqCisgKglSZXZpc2lvbiAyLjAwCQlEZWNlbWJlci0xLTE5OTkKKyAqCQktIEFkZGVkIGNvZGUgZm9yIHRoZSBQQ0ktMjI0MEkgY29udHJvbGxlcgorICoJCS0gQWRkZWQgY29kZSBmb3IgQVRBUEkgZGV2aWNlcy4KKyAqCQktIERvdWJsZSBidWZmZXIgZm9yIHNjYXR0ZXIvZ2F0aGVyIHN1cHBvcnQKKyAqCisgKglSZXZpc2lvbiAyLjEwCQlNYXJjaC0yNy0yMDAwCisgKgkJLSBBZGRlZCBzdXBwb3J0IGZvciBkeW5hbWljIERNQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZXJyb3IgQ29udmVydCBtZSB0byB1bmRlcnN0YW5kIHBhZ2Urb2Zmc2V0IGJhc2VkIHNjYXR0ZXJsaXN0cworCisvLyNkZWZpbmUgREVCVUcgMQorCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgInBjaTIyMjBpLmgiCisjaW5jbHVkZSAicHNpX2RhbGUuaCIKKworCisjZGVmaW5lCVBDSTIyMjBJX1ZFUlNJT04JCSIyLjEwIgorI2RlZmluZQlSRUFEX0NNRAkJCQlJREVfQ01EX1JFQURfTVVMVElQTEUKKyNkZWZpbmUJV1JJVEVfQ01ECQkJCUlERV9DTURfV1JJVEVfTVVMVElQTEUKKyNkZWZpbmUJTUFYX0JVU19NQVNURVJfQkxPQ0tTCVNFQ1RPUlNYRkVSCQkvLyBUaGlzIGlzIHRoZSBtYXhpbXVtIHdlIGNhbiBidXMgbWFzdGVyCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBERUIoeCkgeAorI2RlZmluZSBTVE9QX0hFUkUoKQl7aW50IHN0O2ZvcihzdD0wO3N0PDEwMDtzdCsrKXtzdD0xO319CisjZWxzZQorI2RlZmluZSBERUIoeCkKKyNkZWZpbmUgU1RPUF9IRVJFKCkKKyNlbmRpZgorCisjZGVmaW5lIE1BWEFEQVBURVIgNAkJCQkJLy8gSW5jcmVhc2UgdGhpcyBhbmQgdGhlIHNpemVzIG9mIHRoZSBhcnJheXMgYmVsb3csIGlmIHlvdSBuZWVkIG1vcmUuCisKKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJVUNIQVIJCQlieXRlNjsJCQkJLy8gZGV2aWNlIHNlbGVjdCByZWdpc3RlciBpbWFnZQorCVVDSEFSCQkJc3BpZ290OwkJCQkvLyBzcGlnb3QgbnVtYmVyCisJVUNIQVIJCQlzcGlnb3RzWzJdOwkJCS8vIFJBSUQgc3BpZ290cworCVVDSEFSCQkJZGV2aWNlSURbMl07CQkvLyBkZXZpY2UgSUQgY29kZXMKKwlVU0hPUlQJCQlzZWN0b3JzOwkJCS8vIG51bWJlciBvZiBzZWN0b3JzIHBlciB0cmFjaworCVVTSE9SVAkJCWhlYWRzOwkJCQkvLyBudW1iZXIgb2YgaGVhZHMKKwlVU0hPUlQJCQljeWxpbmRlcnM7CQkJLy8gbnVtYmVyIG9mIGN5bGluZGVycyBmb3IgdGhpcyBkZXZpY2UKKwlVU0hPUlQJCQlzcGFyZXdvcmQ7CQkJLy8gcGxhY2Vob2xkZXIKKwlVTE9ORwkJCWJsb2NrczsJCQkJLy8gbnVtYmVyIG9mIGJsb2NrcyBvbiBkZXZpY2UKKwlESVNLX01JUlJPUgkJRGlza01pcnJvclsyXTsJCS8vIFJBSUQgc3RhdHVzIGFuZCBjb250cm9sCisJVUxPTkcJCQlsYXN0c2VjdG9ybGJhWzJdOwkvLyBsYXN0IGFkZHJlc3NhYmxlIHNlY3RvciBvbiB0aGUgZHJpdmUKKwlVU0hPUlQJCQlyYWlkOwkJCQkvLyBSQUlEIGFjdGl2ZSBmbGFnCisJVVNIT1JUCQkJbWlycm9yUmVjb247CisJVUNIQVIJCQlyZWNvbk9uOworCVVTSE9SVAkJCXJlY29uQ291bnQ7CisJVVNIT1JUCQkJcmVjb25Jc1N0YXJ0aW5nOwkvLyBpbmRpY2F0ZSBob3QgcmVjb25zdHJ1Y3QgaXMgc3RhcnRpbmcKKwlVQ0hBUgkJCWNtZERycUludDsJCQkvLyBmbGFnIGZvciBjb21tYW5kIGludGVycnVwdAorCVVDSEFSCQkJcGFja2V0OwkJCQkvLyBjb21tYW5kIHBhY2tldCBzaXplIGluIGJ5dGVzCisJfQlPVVJfREVWSUNFLCAqUE9VUl9ERVZJQ0U7CQorCit0eXBlZGVmIHN0cnVjdAorCXsKKwlVU0hPUlQJCSBiaWdEOwkJCQkJLy8gaWRlbnRpdHkgaXMgYSBQQ0ktMjI0MEkgaWYgdHJ1ZSwgb3RoZXJ3aXNlIGEgUENJLTIyMjBJCisJVVNIT1JUCQkgYXRhcGk7CQkJCQkvLyB0aGlzIGludGVyZmFjZSBpcyBmb3IgQVRBUEkgZGV2aWNlcyBvbmx5CisJVUxPTkcJCSByZWdEbWFEZXNjOwkJCS8vIGFkZHJlc3Mgb2YgdGhlIERNQSBkaXNjcmlwdG9yIHJlZ2lzdGVyIGZvciBkaXJlY3Rpb24gb2YgdHJhbnNmZXIKKwlVTE9ORwkJIHJlZ0RtYUNtZFN0YXQ7CQkJLy8gQnl0ZSAjMSBvZiBETUEgY29tbWFuZCBzdGF0dXMgcmVnaXN0ZXIKKwlVTE9ORwkJIHJlZ0RtYUFkZHJQY2k7CQkJLy8gMzIgYml0IHJlZ2lzdGVyIGZvciBQQ0kgYWRkcmVzcyBvZiBETUEKKwlVTE9ORwkJIHJlZ0RtYUFkZHJMb2M7CQkJLy8gMzIgYml0IHJlZ2lzdGVyIGZvciBsb2NhbCBidXMgYWRkcmVzcyBvZiBETUEKKwlVTE9ORwkJIHJlZ0RtYUNvdW50OwkJCS8vIDMyIGJpdCByZWdpc3RlciBmb3IgRE1BIHRyYW5zZmVyIGNvdW50CisJVUxPTkcJCSByZWdEbWFNb2RlOwkJCS8vIDMyIGJpdCByZWdpc3RlciBmb3IgRE1BIG1vZGUgY29udHJvbAorCVVMT05HCQkgcmVnUmVtYXA7CQkJCS8vIDMyIGJpdCBsb2NhbCBzcGFjZSByZW1hcAorCVVMT05HCQkgcmVnRGVzYzsJCQkJLy8gMzIgYml0IGxvY2FsIHJlZ2lvbiBkZXNjcmlwdG9yCisJVUxPTkcJCSByZWdSYW5nZTsJCQkJLy8gMzIgYml0IGxvY2FsIHJhbmdlCisJVUxPTkcJCSByZWdJcnFDb250cm9sOwkJCS8vIDE2IGJpdCBJbnRlcnJ1cHQgZW5hYmxlL2Rpc2FibGUgYW5kIHN0YXR1cworCVVMT05HCQkgcmVnU2NyYXRjaFBhZDsJCQkvLyBzY3JhdGNoIHBhZCBJL08gYmFzZSBhZGRyZXNzCisJVUxPTkcJCSByZWdCYXNlOwkJCQkvLyBCYXNlIEkvTyByZWdpc3RlciBmb3IgZGF0YSBzcGFjZQorCVVMT05HCQkgcmVnRGF0YTsJCQkJLy8gZGF0YSByZWdpc3RlciBJL08gYWRkcmVzcworCVVMT05HCQkgcmVnRXJyb3I7CQkJCS8vIGVycm9yIHJlZ2lzdGVyIEkvTyBhZGRyZXNzCisJVUxPTkcJCSByZWdTZWN0Q291bnQ7CQkJLy8gc2VjdG9yIGNvdW50IHJlZ2lzdGVyIEkvTyBhZGRyZXNzCisJVUxPTkcJCSByZWdMYmEwOwkJCQkvLyBsZWFzdCBzaWduaWZpY2FudCBieXRlIG9mIExCQQorCVVMT05HCQkgcmVnTGJhODsJCQkJLy8gbmV4dCBsZWFzdCBzaWduaWZpY2FudCBieXRlIG9mIExCQQorCVVMT05HCQkgcmVnTGJhMTY7CQkJCS8vIG5leHQgbW9zdCBzaWduaWZpY2FuIGJ5dGUgb2YgTEJBCisJVUxPTkcJCSByZWdMYmEyNDsJCQkJLy8gaGVhZCBhbmQgbW9zdCA0IHNpZ25pZmljYW50IGJpdHMgb2YgTEJBCisJVUxPTkcJCSByZWdTdGF0Q21kOwkJCS8vIHN0YXR1cyBvbiByZWFkIGFuZCBjb21tYW5kIG9uIHdyaXRlIHJlZ2lzdGVyCisJVUxPTkcJCSByZWdTdGF0U2VsOwkJCS8vIGJvYXJkIHN0YXR1cyBvbiByZWFkIGFuZCBzcGlnb3Qgc2VsZWN0IG9uIHdyaXRlIHJlZ2lzdGVyCisJVUxPTkcJCSByZWdGYWlsOwkJCQkvLyBmYWlsIGJpdHMgY29udHJvbCByZWdpc3RlcgorCVVMT05HCQkgcmVnQWx0U3RhdDsJCQkvLyBhbHRlcm5hdGUgc3RhdHVzIGFuZCBkcml2ZSBjb250cm9sIHJlZ2lzdGVyCisJVUxPTkcJCSBiYXNlUG9ydDsJCQkJLy8gUExYIGJhc2UgSS9PIHBvcnQKKwlVU0hPUlQJCSB0aW1pbmdNb2RlOwkJCS8vIHRpbWluZyBtb2RlIGN1cnJlbnRseSBzZXQgZm9yIGFkYXB0ZXIKKwlVU0hPUlQJCSB0aW1pbmdQSU87CQkJCS8vIFRSVUUgaWYgUElPIHRpbWluZyBpcyBhY3RpdmUKKwlzdHJ1Y3QgcGNpX2RldgkqcGNpZGV2OworCVVMT05HCQkgdGltaW5nQWRkcmVzczsJCQkvLyBhZGRyZXNzIHRvIHVzZSBvbiBhZGFwdGVyIGZvciBjdXJyZW50IHRpbWluZyBtb2RlCisJVUxPTkcJCSBpcnFPd25lZDsJCQkJLy8gb3duZWQgSVJRIG9yIHplcm8gaWYgc2hhcmVkCisJVUNIQVIJCSBudW1iZXJPZkRyaXZlczsJCS8vIHNhdmVkIG51bWJlciBvZiBkcml2ZXMgb24gdGhpcyBjb250cm9sbGVyCisJVUNIQVIJCSBmYWlsUmVnaXN0ZXI7CQkJLy8gY3VycmVudCBpbnZlcnRlZCBkYXRhIGluIGZhaWwgcmVnaXN0ZXIKKwlPVVJfREVWSUNFCSBkZXZpY2VbQklHRF9NQVhEUklWRVNdOworCURJU0tfTUlSUk9SCSpyYWlkRGF0YVtCSUdEX01BWERSSVZFU107CisJVUxPTkcJCSBzdGFydFNlY3RvcjsKKwlVU0hPUlQJCSBzZWN0b3JDb3VudDsKKwlVTE9ORwkJIHJlYWRDb3VudDsKKwlVQ0hBUgkJKmN1cnJlbnRTZ0J1ZmZlcjsKKwlVTE9ORwkJIGN1cnJlbnRTZ0NvdW50OworCVVTSE9SVAkJIG5leHRTZzsKKwlVQ0hBUgkJIGNtZDsKKwlTY3NpX0NtbmQJKlNDcG50OworCVBPVVJfREVWSUNFCSBwZGV2OwkJCQkJLy8gY3VycmVudCBkZXZpY2Ugb3BlYXJhdGluZyBvbgorCVVTSE9SVAkJIGRldkluUmVjb25JbmRleDsKKwlVU0hPUlQJCSBleHBlY3RpbmdJUlE7CisJVVNIT1JUCQkgcmVjb25PbjsJCQkJLy8gSG90IHJlY29uc3RydWN0IGlzIHRvIGJlIGRvbmUuCisJVVNIT1JUCQkgcmVjb25QaGFzZTsJCQkvLyBIb3QgcmVjb25zdHJ1Y3Qgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLgorCVVMT05HCQkgcmVjb25TaXplOworCVVTSE9SVAkJIGRlbW9GYWlsOwkJCQkvLyBmbGFnIGZvciBSQUlEIGZhaWx1cmUgZGVtb25zdHJhdGlvbgorCVVTSE9SVAkJIHN1cnZpdm9yOworCVVTSE9SVAkJIGZhaWxpbnByb2c7CisJc3RydWN0IHRpbWVyX2xpc3QJcmVjb25UaW1lcjsJCisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisJVUNIQVIJCSprQnVmZmVyOworCWRtYV9hZGRyX3QJIGtCdWZmZXJEbWE7CisJVUNIQVIJCSByZXFTZW5zZTsKKwlVQ0hBUgkJIGF0YXBpQ2RiWzE2XTsKKwlVQ0hBUgkJIGF0YXBpU3BlY2lhbDsKKwl9CUFEQVBURVIyMjIwSSwgKlBBREFQVEVSMjIyMEk7CisKKyNkZWZpbmUgSE9TVERBVEEoaG9zdCkgKChQQURBUFRFUjIyMjBJKSZob3N0LT5ob3N0ZGF0YSkKKworI2RlZmluZQlSRUNPTl9QSEFTRV9SRUFEWQkJMHgwMQorI2RlZmluZQlSRUNPTl9QSEFTRV9DT1BZCQkweDAyCisjZGVmaW5lCVJFQ09OX1BIQVNFX1VQREFURQkJMHgwMworI2RlZmluZQlSRUNPTl9QSEFTRV9MQVNUCQkweDA0CisjZGVmaW5lCVJFQ09OX1BIQVNFX0VORAkJCTB4MDcJCisjZGVmaW5lCVJFQ09OX1BIQVNFX01BUktJTkcJCTB4ODAKKyNkZWZpbmUJUkVDT05fUEhBU0VfRkFJTE9WRVIJMHhGRgorCitzdGF0aWMgc3RydWN0CVNjc2lfSG9zdCAJICAgKlBzaUhvc3RbTUFYQURBUFRFUl0gPSB7TlVMTCx9OyAgLy8gT25lIGZvciBlYWNoIGFkYXB0ZXIKK3N0YXRpYwkJCWludAkJCQlOdW1BZGFwdGVycyA9IDA7CitzdGF0aWMJCQlpbnQJCQkJSW5zdGFsbGVkID0gMDsKK3N0YXRpYwkJCVNFVFVQCQkJRGFsZVNldHVwOworc3RhdGljCQkJRElTS19NSVJST1IJCURpc2tNaXJyb3JbQklHRF9NQVhEUklWRVNdOworc3RhdGljCQkJVUxPTkcJCQlNb2RlQXJyYXlbXSA9IHtEQUxFX0RBVEFfTU9ERTIsIERBTEVfREFUQV9NT0RFMywgREFMRV9EQVRBX01PREU0LCBEQUxFX0RBVEFfTU9ERTV9Oworc3RhdGljCQkJVUxPTkcJCQlNb2RlQXJyYXkyW10gPSB7QklHRF9EQVRBX01PREUyLCBCSUdEX0RBVEFfTU9ERTMsIEJJR0RfREFUQV9NT0RFNCwgQklHRF9EQVRBX01PREU1fTsKKworc3RhdGljIHZvaWQgUmVjb25UaW1lckV4cGlyeSAodW5zaWduZWQgbG9uZyBkYXRhKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CQkJQWxhcm0KKyAqCisgKglEZXNjcmlwdGlvbjoJU291bmQgdGhlIGZvciB0aGUgZ2l2ZW4gZGV2aWNlCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoJCQkJCWRldmljZQkgLSBEZXZpY2UgbnVtYmVyLgorICoJCisgKglSZXR1cm5zOgkJTm90aGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgQWxhcm0gKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIsIFVDSEFSIGRldmljZSkKKwl7CisJVUNIQVIJemM7CisKKwlpZiAoIHBhZGFwdGVyLT5iaWdEICkKKwkJeworCQl6YyA9IGRldmljZSB8IChGQUlMX0FOWSB8IEZBSUxfQVVESUJMRSk7CisJCWlmICggcGFkYXB0ZXItPmZhaWxSZWdpc3RlciAmIEZBSUxfQU5ZICkgCisJCQl6YyB8PSBGQUlMX01VTFRJUExFOworCQkKKwkJcGFkYXB0ZXItPmZhaWxSZWdpc3RlciA9IHpjOworCQlvdXRiX3AgKH56YywgcGFkYXB0ZXItPnJlZ0ZhaWwpOworCQl9CisJZWxzZQorCQlvdXRiX3AgKDB4M0MgfCAoMSA8PCBkZXZpY2UpLCBwYWRhcHRlci0+cmVnRmFpbCk7CQkJLy8gc291bmQgYWxhcm0gYW5kIHNldCBmYWlsIGxpZ2h0CQkKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJTXV0ZUFsYXJtCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglNdXRlIHRoZSBhdWRpYmxlIGFsYXJtLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgYWRhcHRlciBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKglSZXR1cm5zOgkJVFJVRSBpZiBkcml2ZSBkb2VzIG5vdCBhc3NlcnQgRFJRIGluIHRpbWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBNdXRlQWxhcm0gKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIpCisJeworCVVDSEFSCW9sZDsKKworCWlmICggcGFkYXB0ZXItPmJpZ0QgKQorCQl7CisJCXBhZGFwdGVyLT5mYWlsUmVnaXN0ZXIgJj0gfkZBSUxfQVVESUJMRTsKKwkJb3V0Yl9wICh+cGFkYXB0ZXItPmZhaWxSZWdpc3RlciwgcGFkYXB0ZXItPnJlZ0ZhaWwpOworCQl9CisJZWxzZQorCQl7CisJCW9sZCA9IChpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRTZWwpID4+IDMpIHwgKGluYl9wIChwYWRhcHRlci0+cmVnU3RhdFNlbCkgJiAweDgzKTsKKwkJb3V0Yl9wIChvbGQgfCAweDQwLCBwYWRhcHRlci0+cmVnRmFpbCk7CisJCX0KKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJV2FpdFJlYWR5CTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglXYWl0IGZvciBkZXZpY2UgcmVhZHkuCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoKKyAqCVJldHVybnM6CQlUUlVFIGlmIGRyaXZlIGRvZXMgbm90IGFzc2VydCBEUlEgaW4gdGltZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgV2FpdFJlYWR5IChQQURBUFRFUjIyMjBJIHBhZGFwdGVyKQorCXsKKwlVTE9ORwl6OworCVVDSEFSCXN0YXR1czsKKworCWZvciAoIHogPSAwOyAgeiA8IChUSU1FT1VUX1JFQURZICogNCk7ICB6KysgKQorCQl7CisJCXN0YXR1cyA9IGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCk7CisJCWlmICggKHN0YXR1cyAmIChJREVfU1RBVFVTX0RSRFkgfCBJREVfU1RBVFVTX0JVU1kpKSA9PSBJREVfU1RBVFVTX0RSRFkgKQorCQkJcmV0dXJuIDA7CisJCXVkZWxheSAoMjUwKTsKKwkJfQorCXJldHVybiBzdGF0dXM7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVdhaXRSZWFkeVJlc2V0CTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglXYWl0IGZvciBkZXZpY2UgcmVhZHkuCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoKKyAqCVJldHVybnM6CQlUUlVFIGlmIGRyaXZlIGRvZXMgbm90IGFzc2VydCBEUlEgaW4gdGltZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgV2FpdFJlYWR5UmVzZXQgKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIpCisJeworCVVMT05HCXo7CisJVUNIQVIJc3RhdHVzOworCisJZm9yICggeiA9IDA7ICB6IDwgKDEyNSAqIDE2KTsgIHorKyApCQkJCS8vIHdhaXQgdXAgdG8gMS80IHNlY29uZAorCQl7CisJCXN0YXR1cyA9IGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCk7CisJCWlmICggKHN0YXR1cyAmIChJREVfU1RBVFVTX0RSRFkgfCBJREVfU1RBVFVTX0JVU1kpKSA9PSBJREVfU1RBVFVTX0RSRFkgKQorCQkJeworCQkJREVCIChwcmludGsgKCJcblBDSTIyMjBJOiAgUmVzZXQgdG9vayAlbGQgbVNlYyB0byBiZSByZWFkeSIsIHogLyA4KSk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJdWRlbGF5ICgxMjUpOworCQl9CisJREVCIChwcmludGsgKCJcblBDSTIyMjBJOiAgUmVzZXQgdG9vayBtb3JlIHRoYW4gMiBTZWNvbmRzIHRvIGNvbWUgcmVhZHksIERpc2sgRmFpbHVyZSIpKTsKKwlyZXR1cm4gc3RhdHVzOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglXYWl0RHJxCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglXYWl0IGZvciBkZXZpY2UgcmVhZHkgZm9yIGRhdGEgdHJhbnNmZXIuCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoKKyAqCVJldHVybnM6CQlUUlVFIGlmIGRyaXZlIGRvZXMgbm90IGFzc2VydCBEUlEgaW4gdGltZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgV2FpdERycSAoUEFEQVBURVIyMjIwSSBwYWRhcHRlcikKKwl7CisJVUxPTkcJejsKKwlVQ0hBUglzdGF0dXM7CisKKwlmb3IgKCB6ID0gMDsgIHogPCAoVElNRU9VVF9EUlEgKiA0KTsgIHorKyApCisJCXsKKwkJc3RhdHVzID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0Q21kKTsKKwkJaWYgKCBzdGF0dXMgJiBJREVfU1RBVFVTX0RSUSApCisJCQlyZXR1cm4gMDsKKwkJdWRlbGF5ICgyNTApOworCQl9CisJcmV0dXJuIHN0YXR1czsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJQXRhcGlXYWl0UmVhZHkJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVdhaXQgZm9yIGRldmljZSBidXN5IGFuZCBEUlEgdG8gYmUgY2xlYXJlZC4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgkJCQkJbXNlYwkgLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQuCisgKgorICoJUmV0dXJuczoJCVRSVUUgaWYgZHJpdmUgZG9lcyBub3QgY2xlYXIgYnVzeSBpbiB0aW1lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBBdGFwaVdhaXRSZWFkeSAoUEFEQVBURVIyMjIwSSBwYWRhcHRlciwgaW50IG1zZWMpCisJeworCWludCB6OworCisJZm9yICggeiA9IDA7ICB6IDwgKG1zZWMgKiAxNik7ICB6KysgKQorCQl7CisJCWlmICggIShpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRDbWQpICYgKElERV9TVEFUVVNfQlVTWSB8IElERV9TVEFUVVNfRFJRKSkgKQorCQkJcmV0dXJuIEZBTFNFOworCQl1ZGVsYXkgKDEyNSk7CisJCX0KKwlyZXR1cm4gVFJVRTsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJQXRhcGlXYWl0RHJxCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglXYWl0IGZvciBkZXZpY2UgcmVhZHkgZm9yIGRhdGEgdHJhbnNmZXIuCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoJCQkJCW1zZWMJIC0gTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0LgorICoKKyAqCVJldHVybnM6CQlUUlVFIGlmIGRyaXZlIGRvZXMgbm90IGFzc2VydCBEUlEgaW4gdGltZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgQXRhcGlXYWl0RHJxIChQQURBUFRFUjIyMjBJIHBhZGFwdGVyLCBpbnQgbXNlYykKKwl7CisJVUxPTkcJejsKKworCWZvciAoIHogPSAwOyAgeiA8IChtc2VjICogMTYpOyAgeisrICkKKwkJeworCQlpZiAoIGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCkgJiBJREVfU1RBVFVTX0RSUSApCisJCQlyZXR1cm4gMDsKKwkJdWRlbGF5ICgxMjgpOworCQl9CisJcmV0dXJuIFRSVUU7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CUhhcmRSZXNldAk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJV2FpdCBmb3IgZGV2aWNlIHJlYWR5IGZvciBkYXRhIHRyYW5zZmVyLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgYWRhcHRlciBkYXRhIHN0cnVjdHVyZS4KKyAqCQkJCQlwZGV2CSAtIFBvaW50ZXIgdG8gZGV2aWNlLgorICoJCQkJCXNwaWdvdAkgLSBTcGlnb3QgbnVtYmVyLgorICoKKyAqCVJldHVybnM6CQlUUlVFIGlmIGRyaXZlIGRvZXMgbm90IGFzc2VydCBEUlEgaW4gdGltZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgSGFyZFJlc2V0IChQQURBUFRFUjIyMjBJIHBhZGFwdGVyLCBQT1VSX0RFVklDRSBwZGV2LCBVQ0hBUiBzcGlnb3QpCisJeworCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTpSRVNFVCAgc3BpZ290ID0gJVggIGRldmljZXMgPSAlZCwgJWQiLCBzcGlnb3QsIHBkZXYtPmRldmljZUlEWzBdLCBwZGV2LT5kZXZpY2VJRFsxXSkpOworCW1kZWxheSAoMTAwKTsJCQkJCQkJCQkJLy8ganVzdCB3YWl0IDEwMCBtU2VjIHRvIGxldCBkcml2ZXMgZmx1c2gJCisJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgc3BpZ290IHwgU0VMX0lSUV9PRkYpOworCQorCW91dGJfcCAoMHgwRSwgcGFkYXB0ZXItPnJlZ0FsdFN0YXQpOwkJCQkJLy8gcmVzZXQgdGhlIHN1dml2b3IKKwl1ZGVsYXkgKDEwMCk7CQkJCQkJCQkJCQkvLyB3YWl0IGEgbGl0dGxlCQorCW91dGJfcCAoMHgwOCwgcGFkYXB0ZXItPnJlZ0FsdFN0YXQpOwkJCQkJLy8gY2xlYXIgdGhlIHJlc2V0CisJdWRlbGF5ICgxMDApOworCisJb3V0Yl9wICgweEEwLCBwYWRhcHRlci0+cmVnTGJhMjQpOwkJCQkJCS8vIHNlbGVjdCB0aGUgbWFzdGVyIGRyaXZlCisJaWYgKCBXYWl0UmVhZHlSZXNldCAocGFkYXB0ZXIpICkKKwkJeworCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IG1hc3RlciBub3QgcmVhZHkgYWZ0ZXIgcmVzZXQiKSk7CisJCXJldHVybiBUUlVFOworCQl9CisJb3V0Yl9wICgweEIwLCBwYWRhcHRlci0+cmVnTGJhMjQpOwkJCQkJCS8vIHRyeSB0aGUgc2xhdmUgZHJpdmUKKwlpZiAoIChpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRDbWQpICYgKElERV9TVEFUVVNfRFJEWSB8IElERV9TVEFUVVNfQlVTWSkpID09IElERV9TVEFUVVNfRFJEWSApIAorCQl7CisJCURFQiAocHJpbnRrICgiXG5QQ0kyMjIwSTogaW5pdGlhbGl6aW5nIHNsYXZlIGRyaXZlIG9uIHNwaWdvdCAlWCIsIHNwaWdvdCkpOworCQlvdXRiX3AgKFNFQ1RPUlNYRkVSLCBwYWRhcHRlci0+cmVnU2VjdENvdW50KTsKKwkJV3JpdGVDb21tYW5kIChwYWRhcHRlciwgSURFX0NNRF9TRVRfTVVMVElQTEUpOwkKKwkJaWYgKCBXYWl0UmVhZHkgKHBhZGFwdGVyKSApCisJCQl7CisJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IHNsYXZlIG5vdCByZWFkeSBhZnRlciBzZXQgbXVsdGlwbGUiKSk7CisJCQlyZXR1cm4gVFJVRTsKKwkJCX0KKwkJfQorCQorCW91dGJfcCAoMHhBMCwgcGFkYXB0ZXItPnJlZ0xiYTI0KTsJCQkJLy8gc2VsZWN0IHRoZSBkcml2ZQorCW91dGJfcCAoU0VDVE9SU1hGRVIsIHBhZGFwdGVyLT5yZWdTZWN0Q291bnQpOworCVdyaXRlQ29tbWFuZCAocGFkYXB0ZXIsIElERV9DTURfU0VUX01VTFRJUExFKTsJCisJaWYgKCBXYWl0UmVhZHkgKHBhZGFwdGVyKSApCisJCXsKKwkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBtYXN0ZXIgbm90IHJlYWR5IGFmdGVyIHNldCBtdWx0aXBsZSIpKTsKKwkJcmV0dXJuIFRSVUU7CisJCX0KKwlyZXR1cm4gRkFMU0U7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CUF0YXBpUmVzZXQJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVdhaXQgZm9yIGRldmljZSByZWFkeSBmb3IgZGF0YSB0cmFuc2Zlci4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgkJCQkJcGRldgkgLSBQb2ludGVyIHRvIGRldmljZS4KKyAqCisgKglSZXR1cm5zOgkJVFJVRSBpZiBkcml2ZSBkb2VzIG5vdCBjb21lIHJlYWR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBBdGFwaVJlc2V0IChQQURBUFRFUjIyMjBJIHBhZGFwdGVyLCBQT1VSX0RFVklDRSBwZGV2KQorCXsKKwlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3QpOworCUF0YXBpRGV2aWNlIChwYWRhcHRlciwgcGRldi0+Ynl0ZTYpOworCUF0YXBpQ291bnRMbyAocGFkYXB0ZXIsIDApOworCUF0YXBpQ291bnRIaSAocGFkYXB0ZXIsIDApOworCVdyaXRlQ29tbWFuZCAocGFkYXB0ZXIsIElERV9DT01NQU5EX0FUQVBJX1JFU0VUKTsKKwl1ZGVsYXkgKDEyNSk7CisJaWYgKCBBdGFwaVdhaXRSZWFkeSAocGFkYXB0ZXIsIDEwMDApICkKKwkJcmV0dXJuIFRSVUU7CisJaWYgKCBpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRDbWQpIHx8IChpbmJfcCAocGFkYXB0ZXItPnJlZ0xiYTgpICE9IDB4MTQpIHx8IChpbmJfcCAocGFkYXB0ZXItPnJlZ0xiYTE2KSAhPSAweEVCKSApCisJCXJldHVybiBUUlVFOworCXJldHVybiBGQUxTRTsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJV2Fsa1NjYXRHYXRoCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglUcmFuc2ZlciBkYXRhIHRvL2Zyb20gc2NhdHRlci9nYXRoZXIgYnVmZmVycy4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgkJCQkJZGF0YWluICAgLSBUUlVFIGlmIGRhdGEgcmVhZC4KKyAqCQkJCQlsZW5ndGggICAtIE51bWJlciBvZiBieXRlcyB0byB0cmFuc2Zlci4KKyAqCisgKglSZXR1cm5zOgkJTm90aGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFdhbGtTY2F0R2F0aCAoUEFEQVBURVIyMjIwSSBwYWRhcHRlciwgVUNIQVIgZGF0YWluLCBVTE9ORyBsZW5ndGgpCisJeworCVVMT05HCSBjb3VudDsKKwlVQ0hBUgkqYnVmZmVyID0gcGFkYXB0ZXItPmtCdWZmZXI7CisKKwl3aGlsZSAoIGxlbmd0aCApCisJCXsKKwkJY291bnQgPSAoIGxlbmd0aCA+IHBhZGFwdGVyLT5jdXJyZW50U2dDb3VudCApID8gcGFkYXB0ZXItPmN1cnJlbnRTZ0NvdW50IDogbGVuZ3RoOyAKKwkJCisJCWlmICggZGF0YWluICkKKwkJCW1lbWNweSAocGFkYXB0ZXItPmN1cnJlbnRTZ0J1ZmZlciwgYnVmZmVyLCBjb3VudCk7CisJCWVsc2UKKwkJCW1lbWNweSAoYnVmZmVyLCBwYWRhcHRlci0+Y3VycmVudFNnQnVmZmVyLCBjb3VudCk7CisKKwkJcGFkYXB0ZXItPmN1cnJlbnRTZ0NvdW50IC09IGNvdW50OworCQlpZiAoICFwYWRhcHRlci0+Y3VycmVudFNnQ291bnQgKQorCQkJeworCQkJaWYgKCBwYWRhcHRlci0+bmV4dFNnIDwgcGFkYXB0ZXItPlNDcG50LT51c2Vfc2cgKQorCQkJCXsKKwkJCQlwYWRhcHRlci0+Y3VycmVudFNnQnVmZmVyID0gKChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilwYWRhcHRlci0+U0NwbnQtPnJlcXVlc3RfYnVmZmVyKVtwYWRhcHRlci0+bmV4dFNnXS5hZGRyZXNzOworCQkJCXBhZGFwdGVyLT5jdXJyZW50U2dDb3VudCA9ICgoc3RydWN0IHNjYXR0ZXJsaXN0ICopcGFkYXB0ZXItPlNDcG50LT5yZXF1ZXN0X2J1ZmZlcilbcGFkYXB0ZXItPm5leHRTZ10ubGVuZ3RoOworCQkJCXBhZGFwdGVyLT5uZXh0U2crKzsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCXBhZGFwdGVyLT5jdXJyZW50U2dCdWZmZXIgKz0gY291bnQ7CisKKwkJbGVuZ3RoIC09IGNvdW50OworCQlidWZmZXIgKz0gY291bnQ7CisJCX0KKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJQnVzTWFzdGVyCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglEbyBhIGJ1cyBtYXN0ZXIgSS9PLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgYWRhcHRlciBkYXRhIHN0cnVjdHVyZS4KKyAqCQkJCQlkYXRhaW4JIC0gVFJVRSBpZiBkYXRhIHJlYWQuCisgKgkJCQkJaXJxCQkgLSBUUlVFIGlmIGJ1cyBtYXN0ZXIgaW50ZXJydXB0IGV4cGVjdGVkLgorICoKKyAqCVJldHVybnM6CQlOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgQnVzTWFzdGVyIChQQURBUFRFUjIyMjBJIHBhZGFwdGVyLCBVQ0hBUiBkYXRhaW4sIFVDSEFSIGlycSkKKwl7CisJVUxPTkcgemw7CisJCisJemwgPSAoIHBhZGFwdGVyLT5zZWN0b3JDb3VudCA+IE1BWF9CVVNfTUFTVEVSX0JMT0NLUyApID8gTUFYX0JVU19NQVNURVJfQkxPQ0tTIDogcGFkYXB0ZXItPnNlY3RvckNvdW50OworCXBhZGFwdGVyLT5zZWN0b3JDb3VudCAtPSB6bDsKKwl6bCAqPSAoVUxPTkcpQllURVNfUEVSX1NFQ1RPUjsKKworCWlmICggZGF0YWluICkKKwkJeworCQlwYWRhcHRlci0+cmVhZENvdW50ID0gemw7CisJCW91dGJfcCAoOCwgcGFkYXB0ZXItPnJlZ0RtYURlc2MpOwkJCQkJCQkvLyByZWFkIG9wZXJhdGlvbgorCQlpZiAoIHBhZGFwdGVyLT5iaWdEICkKKwkJCXsKKwkJCWlmICggaXJxICYmICFwYWRhcHRlci0+c2VjdG9yQ291bnQgKQorCQkJCW91dGJfcCAoMHgwQywgcGFkYXB0ZXItPnJlZ0RtYU1vZGUpOwkJCQkvLyBpbnRlcnJ1cHQgb24KKwkJCWVsc2UKKwkJCQlvdXRiX3AgKDB4MDgsIHBhZGFwdGVyLT5yZWdEbWFNb2RlKTsJCQkJLy8gbm8gaW50ZXJydXB0CisJCQl9CisJCWVsc2UgCisJCQl7CisJCQlpZiAoIGlycSAmJiAhcGFkYXB0ZXItPnNlY3RvckNvdW50ICkKKwkJCQlvdXRiX3AgKDB4MDUsIHBhZGFwdGVyLT5yZWdEbWFNb2RlKTsJCQkJLy8gaW50ZXJydXB0IG9uCisJCQllbHNlCisJCQkJb3V0Yl9wICgweDAxLCBwYWRhcHRlci0+cmVnRG1hTW9kZSk7CQkJCS8vIG5vIGludGVycnVwdAorCQkJfQorCQl9CisJZWxzZQorCQl7CisJCW91dGJfcCAoMHgwMCwgcGFkYXB0ZXItPnJlZ0RtYURlc2MpOwkJCQkJCS8vIHdyaXRlIG9wZXJhdGlvbgorCQlpZiAoIHBhZGFwdGVyLT5iaWdEICkKKwkJCW91dGJfcCAoMHgwOCwgcGFkYXB0ZXItPnJlZ0RtYU1vZGUpOwkJCQkJLy8gbm8gaW50ZXJydXB0CQkJCQkJCisJCWVsc2UKKwkJCW91dGJfcCAoMHgwMSwgcGFkYXB0ZXItPnJlZ0RtYU1vZGUpOwkJCQkJLy8gbm8gaW50ZXJydXB0CisJCVdhbGtTY2F0R2F0aCAocGFkYXB0ZXIsIEZBTFNFLCB6bCk7CQorCQl9CisJCisJb3V0bCAocGFkYXB0ZXItPnRpbWluZ0FkZHJlc3MsIHBhZGFwdGVyLT5yZWdEbWFBZGRyTG9jKTsKKwlvdXRsIChwYWRhcHRlci0+a0J1ZmZlckRtYSwgcGFkYXB0ZXItPnJlZ0RtYUFkZHJQY2kpOworCW91dGwgKHpsLCBwYWRhcHRlci0+cmVnRG1hQ291bnQpOworCW91dGJfcCAoMHgwMywgcGFkYXB0ZXItPnJlZ0RtYUNtZFN0YXQpOwkJCQkJCQkvLyBraWNrIHRoZSBETUEgZW5naW5lIGluIGdlYXIKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJQXRhcGlCdXNNYXN0ZXIJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CURvIGEgYnVzIG1hc3RlciBJL08uCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoJCQkJCWRhdGFpbgkgLSBUUlVFIGlmIGRhdGEgcmVhZC4KKyAqCQkJCQlsZW5ndGgJIC0gTnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyLgorICoKKyAqCVJldHVybnM6CQlOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgQXRhcGlCdXNNYXN0ZXIgKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIsIFVDSEFSIGRhdGFpbiwgVUxPTkcgbGVuZ3RoKQorCXsKKwlvdXRsIChwYWRhcHRlci0+dGltaW5nQWRkcmVzcywgcGFkYXB0ZXItPnJlZ0RtYUFkZHJMb2MpOworCW91dGwgKHBhZGFwdGVyLT5rQnVmZmVyRG1hLCBwYWRhcHRlci0+cmVnRG1hQWRkclBjaSk7CisJb3V0bCAobGVuZ3RoLCBwYWRhcHRlci0+cmVnRG1hQ291bnQpOworCWlmICggZGF0YWluICkKKwkJeworCQlpZiAoIHBhZGFwdGVyLT5yZWFkQ291bnQgKQorCQkJCVdhbGtTY2F0R2F0aCAocGFkYXB0ZXIsIFRSVUUsIHBhZGFwdGVyLT5yZWFkQ291bnQpOworCQlvdXRiX3AgKDB4MDgsIHBhZGFwdGVyLT5yZWdEbWFEZXNjKTsJCQkJCQkvLyByZWFkIG9wZXJhdGlvbgorCQlvdXRiX3AgKDB4MDgsIHBhZGFwdGVyLT5yZWdEbWFNb2RlKTsJCQkJCQkvLyBubyBpbnRlcnJ1cHQKKwkJcGFkYXB0ZXItPnJlYWRDb3VudCA9IGxlbmd0aDsKKwkJfQorCWVsc2UKKwkJeworCQlvdXRiX3AgKDB4MDAsIHBhZGFwdGVyLT5yZWdEbWFEZXNjKTsJCQkJCQkvLyB3cml0ZSBvcGVyYXRpb24KKwkJb3V0Yl9wICgweDA4LCBwYWRhcHRlci0+cmVnRG1hTW9kZSk7CQkJCQkJLy8gbm8gaW50ZXJydXB0CQkJCQkJCisJCWlmICggIXBhZGFwdGVyLT5hdGFwaVNwZWNpYWwgKQorCQkJV2Fsa1NjYXRHYXRoIChwYWRhcHRlciwgRkFMU0UsIGxlbmd0aCk7CQorCQl9CisJb3V0Yl9wICgweDAzLCBwYWRhcHRlci0+cmVnRG1hQ21kU3RhdCk7CQkJCQkJCS8vIGtpY2sgdGhlIERNQSBlbmdpbmUgaW4gZ2VhcgorCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglXcml0ZURhdGEJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVdyaXRlIGRhdGEgdG8gZGV2aWNlLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgYWRhcHRlciBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKglSZXR1cm5zOgkJVFJVRSBpZiBkcml2ZSBkb2VzIG5vdCBhc3NlcnQgRFJRIGluIHRpbWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IFdyaXRlRGF0YSAoUEFEQVBURVIyMjIwSSBwYWRhcHRlcikKKwl7CisJVUxPTkcJemw7CisJCisJaWYgKCAhV2FpdERycSAocGFkYXB0ZXIpICkKKwkJeworCQlpZiAoIHBhZGFwdGVyLT50aW1pbmdQSU8gKQorCQkJeworCQkJemwgPSAocGFkYXB0ZXItPnNlY3RvckNvdW50ID4gTUFYX0JVU19NQVNURVJfQkxPQ0tTKSA/IE1BWF9CVVNfTUFTVEVSX0JMT0NLUyA6IHBhZGFwdGVyLT5zZWN0b3JDb3VudDsKKwkJCVdhbGtTY2F0R2F0aCAocGFkYXB0ZXIsIEZBTFNFLCB6bCAqIEJZVEVTX1BFUl9TRUNUT1IpOworCQkJb3V0c3cgKHBhZGFwdGVyLT5yZWdEYXRhLCBwYWRhcHRlci0+a0J1ZmZlciwgemwgKiAoQllURVNfUEVSX1NFQ1RPUiAvIDIpKTsKKwkJCXBhZGFwdGVyLT5zZWN0b3JDb3VudCAtPSB6bDsKKwkJCX0KKwkJZWxzZQorCQkJQnVzTWFzdGVyIChwYWRhcHRlciwgMCwgMCk7CisJCXJldHVybiAwOworCQl9CisJcGFkYXB0ZXItPmNtZCA9IDA7CQkJCQkJCQkJCQkJLy8gbnVsbCBvdXQgdGhlIGNvbW1hbmQgYnl0ZQorCXJldHVybiAxOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglXcml0ZURhdGFCb3RoCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglXcml0ZSBkYXRhIHRvIGRldmljZS4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIHRvIGFkYXB0ZXIgc3RydWN0dXJlLgorICoJCQkJCXBkZXYJIC0gUG9pbnRlciB0byBkZXZpY2Ugc3RydWN0dXJlCisgKgorICoJUmV0dXJuczoJCUluZGV4ICsgMSBvZiBkcml2ZSBub3QgZmFpbGVkIG9yIHplcm8gZm9yIE9LLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBXcml0ZURhdGFCb3RoIChQQURBUFRFUjIyMjBJIHBhZGFwdGVyLCBQT1VSX0RFVklDRSBwZGV2KQorCXsKKwlVTE9ORwl6bDsKKwlVQ0hBUglzdGF0dXMwLCBzdGF0dXMxOworCisJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgcGRldi0+c3BpZ290c1swXSk7CisJc3RhdHVzMCA9IFdhaXREcnEgKHBhZGFwdGVyKTsKKwlpZiAoICFzdGF0dXMwICkKKwkJeworCQlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3RzWzFdKTsKKwkJc3RhdHVzMSA9IFdhaXREcnEgKHBhZGFwdGVyKTsKKwkJaWYgKCAhc3RhdHVzMSApCisJCQl7CisJCQlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3RzWzBdIHwgcGRldi0+c3BpZ290c1sxXSB8IHBhZGFwdGVyLT5iaWdEKTsKKwkJCWlmICggcGFkYXB0ZXItPnRpbWluZ1BJTyApCisJCQkJeworCQkJCXpsID0gKHBhZGFwdGVyLT5zZWN0b3JDb3VudCA+IE1BWF9CVVNfTUFTVEVSX0JMT0NLUykgPyBNQVhfQlVTX01BU1RFUl9CTE9DS1MgOiBwYWRhcHRlci0+c2VjdG9yQ291bnQ7CisJCQkJV2Fsa1NjYXRHYXRoIChwYWRhcHRlciwgRkFMU0UsIHpsICogQllURVNfUEVSX1NFQ1RPUik7CisJCQkJb3V0c3cgKHBhZGFwdGVyLT5yZWdEYXRhLCBwYWRhcHRlci0+a0J1ZmZlciwgemwgKiAoQllURVNfUEVSX1NFQ1RPUiAvIDIpKTsKKwkJCQlwYWRhcHRlci0+c2VjdG9yQ291bnQgLT0gemw7CisJCQkJfQorCQkJZWxzZQorCQkJCUJ1c01hc3RlciAocGFkYXB0ZXIsIDAsIDApOworCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwlwYWRhcHRlci0+Y21kID0gMDsJCQkJCQkJCQkJCQkvLyBudWxsIG91dCB0aGUgY29tbWFuZCBieXRlCisJaWYgKCBzdGF0dXMwICkKKwkJcmV0dXJuIDI7CisJcmV0dXJuIDE7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CUlkZUNtZAk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJUHJvY2VzcyBhbiBJREUgY29tbWFuZC4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgkJCQkJcGRldgkgLSBQb2ludGVyIHRvIGRldmljZS4KKyAqCisgKglSZXR1cm5zOgkJWmVybyBpZiBubyBlcnJvciBvciBzdGF0dXMgcmVnaXN0ZXIgY29udGVudHMgb24gZXJyb3IuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUNIQVIgSWRlQ21kIChQQURBUFRFUjIyMjBJIHBhZGFwdGVyLCBQT1VSX0RFVklDRSBwZGV2KQorCXsKKwlVQ0hBUglzdGF0dXM7CisKKwlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3QgfCBwYWRhcHRlci0+YmlnRCk7CQkJCQkJCS8vIHNlbGVjdCB0aGUgc3BpZ290CisJb3V0Yl9wIChwZGV2LT5ieXRlNiB8ICgoVUNIQVIgKikoJnBhZGFwdGVyLT5zdGFydFNlY3RvcikpWzNdLCBwYWRhcHRlci0+cmVnTGJhMjQpOwkJCS8vIHNlbGVjdCB0aGUgZHJpdmUKKwlzdGF0dXMgPSBXYWl0UmVhZHkgKHBhZGFwdGVyKTsKKwlpZiAoICFzdGF0dXMgKQorCQl7CisJCW91dGJfcCAocGFkYXB0ZXItPnNlY3RvckNvdW50LCBwYWRhcHRlci0+cmVnU2VjdENvdW50KTsKKwkJb3V0Yl9wICgoKFVDSEFSICopKCZwYWRhcHRlci0+c3RhcnRTZWN0b3IpKVswXSwgcGFkYXB0ZXItPnJlZ0xiYTApOworCQlvdXRiX3AgKCgoVUNIQVIgKikoJnBhZGFwdGVyLT5zdGFydFNlY3RvcikpWzFdLCBwYWRhcHRlci0+cmVnTGJhOCk7CisJCW91dGJfcCAoKChVQ0hBUiAqKSgmcGFkYXB0ZXItPnN0YXJ0U2VjdG9yKSlbMl0sIHBhZGFwdGVyLT5yZWdMYmExNik7CisJCXBhZGFwdGVyLT5leHBlY3RpbmdJUlEgPSBUUlVFOworCQlXcml0ZUNvbW1hbmQgKHBhZGFwdGVyLCBwYWRhcHRlci0+Y21kKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCXBhZGFwdGVyLT5jbWQgPSAwOwkJCQkJCQkJCS8vIG51bGwgb3V0IHRoZSBjb21tYW5kIGJ5dGUKKwlyZXR1cm4gc3RhdHVzOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglJZGVDbWRCb3RoCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglQcm9jZXNzIGFuIElERSBjb21tYW5kIHRvIGJvdGggZHJpdmVycy4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgkJCQkJcGRldgkgLSBQb2ludGVyIHRvIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKglSZXR1cm5zOgkJSW5kZXggKyAxIG9mIGRyaXZlIG5vdCBmYWlsZWQgb3IgemVybyBmb3IgT0suCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUNIQVIgSWRlQ21kQm90aCAoUEFEQVBURVIyMjIwSSBwYWRhcHRlciwgUE9VUl9ERVZJQ0UgcGRldikKKwl7CisJVUNIQVIJc3RhdHVzMDsKKwlVQ0hBUglzdGF0dXMxOworCisJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgcGRldi0+c3BpZ290c1swXSB8IHBkZXYtPnNwaWdvdHNbMV0pOwkJCQkJCQkJLy8gc2VsZWN0IHRoZSBzcGlnb3RzCisJb3V0Yl9wIChwYWRhcHRlci0+cGRldi0+Ynl0ZTYgfCAoKFVDSEFSICopKCZwYWRhcHRlci0+c3RhcnRTZWN0b3IpKVszXSwgcGFkYXB0ZXItPnJlZ0xiYTI0KTsvLyBzZWxlY3QgdGhlIGRyaXZlCisJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgcGRldi0+c3BpZ290c1swXSk7CisJc3RhdHVzMCA9IFdhaXRSZWFkeSAocGFkYXB0ZXIpOworCWlmICggIXN0YXR1czAgKQorCQl7CisJCVNlbGVjdFNwaWdvdCAocGFkYXB0ZXIsIHBkZXYtPnNwaWdvdHNbMV0pOworCQlzdGF0dXMxID0gV2FpdFJlYWR5IChwYWRhcHRlcik7CisJCWlmICggIXN0YXR1czEgKQorCQkJeworCQkJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgcGRldi0+c3BpZ290c1swXSB8IHBkZXYtPnNwaWdvdHNbMV0gfCBwYWRhcHRlci0+YmlnRCk7CisJCQlvdXRiX3AgKHBhZGFwdGVyLT5zZWN0b3JDb3VudCwgcGFkYXB0ZXItPnJlZ1NlY3RDb3VudCk7CisJCQlvdXRiX3AgKCgoVUNIQVIgKikoJnBhZGFwdGVyLT5zdGFydFNlY3RvcikpWzBdLCBwYWRhcHRlci0+cmVnTGJhMCk7CisJCQlvdXRiX3AgKCgoVUNIQVIgKikoJnBhZGFwdGVyLT5zdGFydFNlY3RvcikpWzFdLCBwYWRhcHRlci0+cmVnTGJhOCk7CisJCQlvdXRiX3AgKCgoVUNIQVIgKikoJnBhZGFwdGVyLT5zdGFydFNlY3RvcikpWzJdLCBwYWRhcHRlci0+cmVnTGJhMTYpOworCQkJcGFkYXB0ZXItPmV4cGVjdGluZ0lSUSA9IFRSVUU7CisJCQlXcml0ZUNvbW1hbmQgKHBhZGFwdGVyLCBwYWRhcHRlci0+Y21kKTsKKwkJCXJldHVybiAwOworCQkJfQorCQl9CisJcGFkYXB0ZXItPmNtZCA9IDA7CQkJCQkJCQkJLy8gbnVsbCBvdXQgdGhlIGNvbW1hbmQgYnl0ZQorCWlmICggc3RhdHVzMCApCisJCXJldHVybiAyOworCXJldHVybiAxOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglPcERvbmUJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CUNvbXBsZXRlIGFuIG9wZXJhdG9pbiBkb25lIHNlcXVlbmNlLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgdG8gaG9zdCBkYXRhIGJsb2NrLgorICoJCQkJCXNwaWdvdAkgLSBTcGlnb3Qgc2VsZWN0IGNvZGUuCisgKgkJCQkJZGV2aWNlCSAtIERldmljZSBieXRlIGNvZGUuCisgKgorICoJUmV0dXJuczoJCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBPcERvbmUgKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIsIFVMT05HIHJlc3VsdCkKKwl7CisJU2NzaV9DbW5kCSAgICpTQ3BudCA9IHBhZGFwdGVyLT5TQ3BudDsKKwkKKwlpZiAoIHBhZGFwdGVyLT5yZWNvblBoYXNlICkKKwkJeworCQlwYWRhcHRlci0+cmVjb25QaGFzZSA9IDA7CisJCWlmICggcGFkYXB0ZXItPlNDcG50ICkKKwkJCXsKKwkJCVBjaTIyMjBpX1F1ZXVlQ29tbWFuZCAoU0NwbnQsIFNDcG50LT5zY3NpX2RvbmUpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlpZiAoIHBhZGFwdGVyLT5yZWNvbk9uICkKKwkJCQl7CisJCQkJUmVjb25UaW1lckV4cGlyeSAoKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOworCQkJCX0KKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlwYWRhcHRlci0+Y21kID0gMDsKKwkJcGFkYXB0ZXItPlNDcG50ID0gTlVMTDsJCisJCXBhZGFwdGVyLT5wZGV2ID0gTlVMTDsKKwkJU0NwbnQtPnJlc3VsdCA9IHJlc3VsdDsKKwkJU0NwbnQtPnNjc2lfZG9uZSAoU0NwbnQpOworCQlpZiAoIHBhZGFwdGVyLT5yZWNvbk9uICYmICFwYWRhcHRlci0+cmVjb25UaW1lci5kYXRhICkKKwkJCXsKKwkJCXBhZGFwdGVyLT5yZWNvblRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaIC8gNCk7CS8vIHN0YXJ0IGluIDEvNCBzZWNvbmQKKwkJCXBhZGFwdGVyLT5yZWNvblRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwYWRhcHRlcjsKKwkJCWFkZF90aW1lciAoJnBhZGFwdGVyLT5yZWNvblRpbWVyKTsKKwkJCX0KKwkJfQorCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglJbmxpbmVJZGVudGlmeQk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJRG8gYW4gaW50bGluZSBpbnF1aXJ5IG9uIGEgZHJpdmUuCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciB0byBob3N0IGRhdGEgYmxvY2suCisgKgkJCQkJc3BpZ290CSAtIFNwaWdvdCBzZWxlY3QgY29kZS4KKyAqCQkJCQlkZXZpY2UJIC0gRGV2aWNlIGJ5dGUgY29kZS4KKyAqCisgKglSZXR1cm5zOgkJTGFzdCBhZGRyZXNzYWJsZSBzZWN0b3Igb3IgemVybyBpZiBub25lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVMT05HIElubGluZUlkZW50aWZ5IChQQURBUFRFUjIyMjBJIHBhZGFwdGVyLCBVQ0hBUiBzcGlnb3QsIFVDSEFSIGRldmljZSkKKwl7CisJUElERU5USUZZX0RBVEEJcGlkID0gKFBJREVOVElGWV9EQVRBKXBhZGFwdGVyLT5rQnVmZmVyOworCisJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgc3BpZ290IHwgU0VMX0lSUV9PRkYpOwkJCQkJLy8gc2VsZWN0IHRoZSBzcGlnb3QKKwlvdXRiX3AgKChkZXZpY2UgPDwgNCkgfCAweEEwLCBwYWRhcHRlci0+cmVnTGJhMjQpOwkJCQkvLyBzZWxlY3QgdGhlIGRyaXZlCisJaWYgKCBXYWl0UmVhZHkgKHBhZGFwdGVyKSApCisJCXJldHVybiAwOworCVdyaXRlQ29tbWFuZCAocGFkYXB0ZXIsIElERV9DT01NQU5EX0lERU5USUZZKTsJCisJaWYgKCBXYWl0RHJxIChwYWRhcHRlcikgKQorCQlyZXR1cm4gMDsKKwlpbnN3IChwYWRhcHRlci0+cmVnRGF0YSwgcGFkYXB0ZXItPmtCdWZmZXIsIHNpemVvZiAoSURFTlRJRllfREFUQSkgPj4gMSk7CisJcmV0dXJuIChwaWQtPkxCQVRvdGFsU2VjdG9ycyAtIDEpOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglBdGFwaUlkZW50aWZ5CTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglEbyBhbiBpbnRsaW5lIGlucXVpcnkgb24gYSBkcml2ZS4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIHRvIGhvc3QgZGF0YSBibG9jay4KKyAqCQkJCQlwZGV2CSAtIFBvaW50ZXIgdG8gZGV2aWNlIHRhYmxlLgorICoKKyAqCVJldHVybnM6CQlUUlVFIG9uIGVycm9yLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVMT05HIEF0YXBpSWRlbnRpZnkgKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIsIFBPVVJfREVWSUNFIHBkZXYpCisJeworCUFUQVBJX0dFTkVSQUxfMAkJYWcwOworCVVTSE9SVAkJCQl6czsKKwlpbnQJCQkJCXo7CisKKwlBdGFwaURldmljZSAocGFkYXB0ZXIsIHBkZXYtPmJ5dGU2KTsJCisJV3JpdGVDb21tYW5kIChwYWRhcHRlciwgSURFX0NPTU1BTkRfQVRBUElfSURFTlRJRlkpOwkKKwlpZiAoIEF0YXBpV2FpdERycSAocGFkYXB0ZXIsIDMwMDApICkKKwkJcmV0dXJuIFRSVUU7CisKKwkqKFVTSE9SVCAqKSZhZzAgPSBpbndfcCAocGFkYXB0ZXItPnJlZ0RhdGEpOworCWZvciAoIHogPSAwOyAgeiA8IDI1NTsgIHorKyApCisJCXpzID0gaW53X3AgKHBhZGFwdGVyLT5yZWdEYXRhKTsKKworCWlmICggYWcwLlByb3RvY29sVHlwZSA9PSAyICkKKwkJeworCQlpZiAoIGFnMC5DbWREcnFUeXBlID09IDEgKQorCQkJcGRldi0+Y21kRHJxSW50ID0gVFJVRTsKKwkJc3dpdGNoICggYWcwLkNtZFBhY2tldFNpemUgKQorCQkJeworCQkJY2FzZSAwOgorCQkJCXBkZXYtPnBhY2tldCA9IDY7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJcGRldi0+cGFja2V0ID0gODsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcGRldi0+cGFja2V0ID0gNjsKKwkJCQlicmVhazsKKwkJCX0KKwkJcmV0dXJuIEZBTFNFOworCQl9CisJcmV0dXJuIFRSVUU7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CUF0YXBpMlNjc2kKKyAqCisgKglEZXNjcmlwdGlvbjoJQ29udmVydCBBVEFQSSBkYXRhIHRvIFNDU0kgZGF0YS4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgkJCQkJU0NwbnQJIC0gUG9pbnRlciB0byBTQ1NJIGNvbW1hbmQgc3RydWN0dXJlLgorICoKKyAqCVJldHVybnM6CQlOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBBdGFwaTJTY3NpIChQQURBUFRFUjIyMjBJIHBhZGFwdGVyLCBTY3NpX0NtbmQgKlNDcG50KQorCXsKKwlVQ0hBUgkqYnVmZiA9IHBhZGFwdGVyLT5jdXJyZW50U2dCdWZmZXI7CisgCisJc3dpdGNoICggU0NwbnQtPmNtbmRbMF0gKQorCQl7CisJCWNhc2UgU0NTSU9QX01PREVfU0VOU0U6CisJCQlidWZmWzBdID0gcGFkYXB0ZXItPmtCdWZmZXJbMV07CisJCQlidWZmWzFdID0gcGFkYXB0ZXItPmtCdWZmZXJbMl07CisJCQlidWZmWzJdID0gcGFkYXB0ZXItPmtCdWZmZXJbM107CisJCQlidWZmWzNdID0gcGFkYXB0ZXItPmtCdWZmZXJbN107CisJCQltZW1jcHkgKCZidWZmWzRdLCAmcGFkYXB0ZXItPmtCdWZmZXJbOF0sIHBhZGFwdGVyLT5hdGFwaUNkYls4XSAtIDgpOworCQkJYnJlYWs7CisJCWNhc2UgU0NTSU9QX0lOUVVJUlk6CisJCQlwYWRhcHRlci0+a0J1ZmZlclsyXSA9IDI7CisJCQltZW1jcHkgKGJ1ZmYsIHBhZGFwdGVyLT5rQnVmZmVyLCBwYWRhcHRlci0+Y3VycmVudFNnQ291bnQpOworCQkJYnJlYWs7CQkKKwkJZGVmYXVsdDoKKwkJCWlmICggcGFkYXB0ZXItPnJlYWRDb3VudCApCisJCQkJV2Fsa1NjYXRHYXRoIChwYWRhcHRlciwgVFJVRSwgcGFkYXB0ZXItPnJlYWRDb3VudCk7CisJCQlicmVhazsKKwkJfQorCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglTY3NpMkF0YXBpCisgKgorICoJRGVzY3JpcHRpb246CUNvbnZlcnQgU0NTSSBwYWNrZXQgY29tbWFuZCB0byBBdGFwaSBwYWNrZXQgY29tbWFuZC4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgkJCQkJU0NwbnQJIC0gUG9pbnRlciB0byBTQ1NJIGNvbW1hbmQgc3RydWN0dXJlLgorICoKKyAqCVJldHVybnM6CQlOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgU2NzaTJBdGFwaSAoUEFEQVBURVIyMjIwSSBwYWRhcHRlciwgU2NzaV9DbW5kICpTQ3BudCkKKwl7CisJVUNIQVIJKmNkYiA9IFNDcG50LT5jbW5kOworCVVDSEFSCSpidWZmID0gcGFkYXB0ZXItPmN1cnJlbnRTZ0J1ZmZlcjsKKworCXN3aXRjaCAoY2RiWzBdKSAKKwkJeworCQljYXNlIFNDU0lPUF9SRUFENjoKKyAgICAgICAgICAgIHBhZGFwdGVyLT5hdGFwaUNkYlswXSA9IFNDU0lPUF9SRUFEOworCQkJcGFkYXB0ZXItPmF0YXBpQ2RiWzFdID0gY2RiWzFdICYgMHhFMDsKKyAgICAgICAgICAgIHBhZGFwdGVyLT5hdGFwaUNkYlszXSA9IGNkYlsxXSAmIDB4MUY7CisJCQlwYWRhcHRlci0+YXRhcGlDZGJbNF0gPSBjZGJbMl07CisJCQlwYWRhcHRlci0+YXRhcGlDZGJbNV0gPSBjZGJbM107CisJCQlwYWRhcHRlci0+YXRhcGlDZGJbOF0gPSBjZGJbNF07CisJCQlwYWRhcHRlci0+YXRhcGlDZGJbOV0gPSBjZGJbNV07CisJCQlicmVhazsKKwkJY2FzZSBTQ1NJT1BfV1JJVEU2OgorICAgICAgICAgICAgcGFkYXB0ZXItPmF0YXBpQ2RiWzBdID0gU0NTSU9QX1dSSVRFOworCQkJcGFkYXB0ZXItPmF0YXBpQ2RiWzFdID0gY2RiWzFdICYgMHhFMDsKKyAgICAgICAgICAgIHBhZGFwdGVyLT5hdGFwaUNkYlszXSA9IGNkYlsxXSAmIDB4MUY7CisJCQlwYWRhcHRlci0+YXRhcGlDZGJbNF0gPSBjZGJbMl07CisJCQlwYWRhcHRlci0+YXRhcGlDZGJbNV0gPSBjZGJbM107CisJCQlwYWRhcHRlci0+YXRhcGlDZGJbOF0gPSBjZGJbNF07CisJCQlwYWRhcHRlci0+YXRhcGlDZGJbOV0gPSBjZGJbNV07CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBTQ1NJT1BfTU9ERV9TRU5TRTogCisgICAgICAgICAgICBwYWRhcHRlci0+YXRhcGlDZGJbMF0gPSBTQ1NJT1BfTU9ERV9TRU5TRTEwOworCQkJcGFkYXB0ZXItPmF0YXBpQ2RiWzJdID0gY2RiWzJdOworCQkJcGFkYXB0ZXItPmF0YXBpQ2RiWzhdID0gY2RiWzRdICsgNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0NTSU9QX01PREVfU0VMRUNUOiAKKwkJCXBhZGFwdGVyLT5hdGFwaVNwZWNpYWwgPSBUUlVFOworCQkJcGFkYXB0ZXItPmF0YXBpQ2RiWzBdID0gU0NTSU9QX01PREVfU0VMRUNUMTA7CisJCQlwYWRhcHRlci0+YXRhcGlDZGJbMV0gPSBjZGJbMV0gfCAweDEwOworCQkJbWVtY3B5IChwYWRhcHRlci0+a0J1ZmZlciwgYnVmZiwgNCk7CisJCQlwYWRhcHRlci0+a0J1ZmZlcls0XSA9IHBhZGFwdGVyLT5rQnVmZmVyWzVdID0gMDsKKwkJCXBhZGFwdGVyLT5rQnVmZmVyWzZdID0gcGFkYXB0ZXItPmtCdWZmZXJbN10gPSAwOworCQkJbWVtY3B5ICgmcGFkYXB0ZXItPmtCdWZmZXJbOF0sICZidWZmWzRdLCBjZGJbNF0gLSA0KTsKKwkJCXBhZGFwdGVyLT5hdGFwaUNkYls4XSA9IGNkYls0XSArIDQ7CisJCQlicmVhazsKKwkgICAgfQorCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglBdGFwaVNlbmRDZGIKKyAqCisgKglEZXNjcmlwdGlvbjoJU2VuZCB0aGUgQ0RCIHBhY2tldCB0byB0aGUgZGV2aWNlLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgYWRhcHRlciBkYXRhIHN0cnVjdHVyZS4KKyAqCQkJCQlwZGV2CSAtIFBvaW50ZXIgdG8gZGV2aWNlLgorICoJCQkJCWNkYgkJIC0gUG9pbnRlciB0byAxNiBieXRlIFNDU0kgY2RiLgorICoKKyAqCVJldHVybnM6CQlOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgQXRhcGlTZW5kQ2RiIChQQURBUFRFUjIyMjBJIHBhZGFwdGVyLCBQT1VSX0RFVklDRSBwZGV2LCBDSEFSICpjZGIpCisJeworCURFQiAocHJpbnRrICgiXG5QQ0kyMjQySTogQ0RCOiAlWCAlWCAlWCAlWCAlWCAlWCAlWCAlWCAlWCAlWCAlWCAlWCIsIGNkYlswXSwgY2RiWzFdLCBjZGJbMl0sIGNkYlszXSwgY2RiWzRdLCBjZGJbNV0sIGNkYls2XSwgY2RiWzddLCBjZGJbOF0sIGNkYls5XSwgY2RiWzEwXSwgY2RiWzExXSkpOworCW91dHN3IChwYWRhcHRlci0+cmVnRGF0YSwgY2RiLCBwZGV2LT5wYWNrZXQpOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglBdGFwaVJlcXVlc3RTZW5zZQorICoKKyAqCURlc2NyaXB0aW9uOglTZW5kIHRoZSBDREIgcGFja2V0IHRvIHRoZSBkZXZpY2UuCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoJCQkJCXBkZXYJIC0gUG9pbnRlciB0byBkZXZpY2UuCisgKgkJCQkJU0NwbnQJIC0gUG9pbnRlciB0byBTQ1NJIGNvbW1hbmQgc3RydWN0dXJlLgorICoJCQkJCXBhc3MJIC0gSWYgdHJ1ZSB0aGVuIHRoaXMgaXMgdGhlIHNlY29uZCBwYXNzIHRvIHNlbmQgY2RiLgorICoKKyAqCVJldHVybnM6CQlUUlVFIG9uIGVycm9yLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBBdGFwaVJlcXVlc3RTZW5zZSAoUEFEQVBURVIyMjIwSSBwYWRhcHRlciwgUE9VUl9ERVZJQ0UgcGRldiwgU2NzaV9DbW5kICpTQ3BudCwgVUNIQVIgcGFzcykKKwl7CisJVUNIQVIJY2RiWzE2XSA9IHtTQ1NJT1BfUkVRVUVTVF9TRU5TRSwwLDAsMCwxNiwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9OwkJCisJCisJREVCIChwcmludGsgKCJcblBDSTIyNDJJOiBBVVRPIFJFUVVFU1QgU0VOU0UiKSk7CisJY2RiWzRdID0gKFVDSEFSKShzaXplb2YgKFNDcG50LT5zZW5zZV9idWZmZXIpKTsKKwlpZiAoICFwYXNzICkKKwkJeworCQlwYWRhcHRlci0+cmVxU2Vuc2UgPSBUUlVFOworCSAJQXRhcGlDb3VudExvIChwYWRhcHRlciwgY2RiWzRdKTsJCQkJCQkKKwkJQXRhcGlDb3VudEhpIChwYWRhcHRlciwgMCk7CQkJCQkJCisJCW91dGJfcCAoMCwgcGFkYXB0ZXItPnJlZ0Vycm9yKTsJCQkJCQkKKwkJV3JpdGVDb21tYW5kIChwYWRhcHRlciwgSURFX0NPTU1BTkRfQVRBUElfUEFDS0VUKTsKKwkJaWYgKCBwZGV2LT5jbWREcnFJbnQgKQorCQkJcmV0dXJuIEZBTFNFOworCisJCWlmICggQXRhcGlXYWl0RHJxIChwYWRhcHRlciwgNTAwKSApCisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCUF0YXBpU2VuZENkYiAocGFkYXB0ZXIsIHBkZXYsIGNkYik7CQorCXJldHVybiBGQUxTRTsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJSW5saW5lUmVhZFNpZ25hdHVyZQk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJRG8gYW4gaW5saW5lIHJlYWQgUkFJRCBzaWdhdHVyZS4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgkJCQkJcGRldgkgLSBQb2ludGVyIHRvIGRldmljZS4KKyAqCQkJCQlpbmRleAkgLSBpbmRleCBvZiBkYXRhIHRvIHJlYWQuCisgKgorICoJUmV0dXJuczoJCVplcm8gaWYgbm8gZXJyb3Igb3Igc3RhdHVzIHJlZ2lzdGVyIGNvbnRlbnRzIG9uIGVycm9yLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVDSEFSIElubGluZVJlYWRTaWduYXR1cmUgKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIsIFBPVVJfREVWSUNFIHBkZXYsIGludCBpbmRleCkKKwl7CisJVUNIQVIJc3RhdHVzOworCVVMT05HCXpsID0gcGRldi0+bGFzdHNlY3RvcmxiYVtpbmRleF07CisKKwlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3RzW2luZGV4XSB8IFNFTF9JUlFfT0ZGKTsJLy8gc2VsZWN0IHRoZSBzcGlnb3Qgd2l0aG91dCBpbnRlcnJ1cHRzCisJb3V0Yl9wIChwZGV2LT5ieXRlNiB8ICgoVUNIQVIgKikmemwpWzNdLCBwYWRhcHRlci0+cmVnTGJhMjQpOwkJCisJc3RhdHVzID0gV2FpdFJlYWR5IChwYWRhcHRlcik7CisJaWYgKCAhc3RhdHVzICkKKwkJeworCQlvdXRiX3AgKCgoVUNIQVIgKikmemwpWzJdLCBwYWRhcHRlci0+cmVnTGJhMTYpOworCQlvdXRiX3AgKCgoVUNIQVIgKikmemwpWzFdLCBwYWRhcHRlci0+cmVnTGJhOCk7IAorCQlvdXRiX3AgKCgoVUNIQVIgKikmemwpWzBdLCBwYWRhcHRlci0+cmVnTGJhMCk7CisJCW91dGJfcCAoMSwgcGFkYXB0ZXItPnJlZ1NlY3RDb3VudCk7CisJCVdyaXRlQ29tbWFuZCAocGFkYXB0ZXIsIElERV9DT01NQU5EX1JFQUQpOworCQlzdGF0dXMgPSBXYWl0RHJxIChwYWRhcHRlcik7CisJCWlmICggIXN0YXR1cyApCisJCQl7CisJCQlpbnN3IChwYWRhcHRlci0+cmVnRGF0YSwgcGFkYXB0ZXItPmtCdWZmZXIsIEJZVEVTX1BFUl9TRUNUT1IgLyAyKTsKKwkJCSgoVUxPTkcgKikoJnBkZXYtPkRpc2tNaXJyb3JbaW5kZXhdKSlbMF0gPSAoKFVMT05HICopKCZwYWRhcHRlci0+a0J1ZmZlcltESVNLX01JUlJPUl9QT1NJVElPTl0pKVswXTsKKwkJCSgoVUxPTkcgKikoJnBkZXYtPkRpc2tNaXJyb3JbaW5kZXhdKSlbMV0gPSAoKFVMT05HICopKCZwYWRhcHRlci0+a0J1ZmZlcltESVNLX01JUlJPUl9QT1NJVElPTl0pKVsxXTsKKwkJCS8vIHNvbWUgZHJpdmVzIGFzc2VydCBEUlEgYmVmb3JlIElSUSBzbyBsZXQncyBtYWtlIHN1cmUgd2UgY2xlYXIgdGhlIElSUQorCQkJV2FpdFJlYWR5IChwYWRhcHRlcik7CisJCQlyZXR1cm4gMDsJCQkKKwkJCX0KKwkJfQorCXJldHVybiBzdGF0dXM7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CURlY29kZUVycm9yCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglEZWNvZGUgYW5kIHByb2Nlc3MgZGV2aWNlIGVycm9ycy4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIHRvIGFkYXB0ZXIgZGF0YS4KKyAqCQkJCQlzdGF0dXMgLSBTdGF0dXMgcmVnaXN0ZXIgY29kZS4KKyAqCisgKglSZXR1cm5zOgkJVGhlIGRyaXZlciBzdGF0dXMgY29kZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBVTE9ORyBEZWNvZGVFcnJvciAoUEFEQVBURVIyMjIwSQlwYWRhcHRlciwgVUNIQVIgc3RhdHVzKQorCXsKKwlVQ0hBUgkJCWVycm9yOworCisJcGFkYXB0ZXItPmV4cGVjdGluZ0lSUSA9IDA7CisJaWYgKCBzdGF0dXMgJiBJREVfU1RBVFVTX1dSSVRFX0ZBVUxUICkKKwkJeworCQlyZXR1cm4gRElEX1BBUklUWSA8PCAxNjsKKwkJfQorCWlmICggc3RhdHVzICYgSURFX1NUQVRVU19CVVNZICkKKwkJcmV0dXJuIERJRF9CVVNfQlVTWSA8PCAxNjsKKworCWVycm9yID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdFcnJvcik7CisJREVCKHByaW50ayAoIlxucGNpMjIyMGkgZXJyb3IgcmVnaXN0ZXI6ICV4IiwgZXJyb3IpKTsKKwlzd2l0Y2ggKCBlcnJvciApCisJCXsKKwkJY2FzZSBJREVfRVJST1JfQU1ORjoKKwkJY2FzZSBJREVfRVJST1JfVEtPTkY6CisJCWNhc2UgSURFX0VSUk9SX0FCUlQ6CisJCWNhc2UgSURFX0VSUk9SX0lERk46CisJCWNhc2UgSURFX0VSUk9SX1VOQzoKKwkJY2FzZSBJREVfRVJST1JfQkJLOgorCQlkZWZhdWx0OgorCQkJcmV0dXJuIERJRF9FUlJPUiA8PCAxNjsKKwkJfQorCXJldHVybiBESURfRVJST1IgPDwgMTY7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVN0YXJ0VGltZXIJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVN0YXJ0IHRoZSB0aW1lci4KKyAqCisgKglQYXJhbWV0ZXJzOgkJaXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoKKyAqCVJldHVybnM6CQlOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgU3RhcnRUaW1lciAoUEFEQVBURVIyMjIwSSBwYWRhcHRlcikKKwl7CisJcGFkYXB0ZXItPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgVElNRU9VVF9EQVRBOworCWFkZF90aW1lciAoJnBhZGFwdGVyLT50aW1lcik7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVdyaXRlU2lnbmF0dXJlCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglTdGFydCB0aGUgdGltZXIuCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoJCQkJCXBkZXYJIC0gUG9pbnRlciB0byBvdXIgZGV2aWNlLgorICoJCQkJCXNwaWdvdAkgLSBTZWxlY3RlZCBzcGlnb3QuCisgKgkJCQkJaW5kZXgJIC0gaW5kZXggb2YgbWlycm9yIHNpZ25hdHVyZSBvbiBkZXZpY2UuCisgKgorICoJUmV0dXJuczoJCVRSVUUgb24gYW55IGVycm9yLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBXcml0ZVNpZ25hdHVyZSAoUEFEQVBURVIyMjIwSSBwYWRhcHRlciwgUE9VUl9ERVZJQ0UgcGRldiwgVUNIQVIgc3BpZ290LCBpbnQgaW5kZXgpCisJeworCVVMT05HCXpsOworCisJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgc3BpZ290KTsKKwl6bCA9IHBkZXYtPmxhc3RzZWN0b3JsYmFbaW5kZXhdOworCW91dGJfcCAocGRldi0+Ynl0ZTYgfCAoKFVDSEFSICopJnpsKVszXSwgcGFkYXB0ZXItPnJlZ0xiYTI0KTsJCQorCW91dGJfcCAoKChVQ0hBUiAqKSZ6bClbMl0sIHBhZGFwdGVyLT5yZWdMYmExNik7CisJb3V0Yl9wICgoKFVDSEFSICopJnpsKVsxXSwgcGFkYXB0ZXItPnJlZ0xiYTgpOworCW91dGJfcCAoKChVQ0hBUiAqKSZ6bClbMF0sIHBhZGFwdGVyLT5yZWdMYmEwKTsKKwlvdXRiX3AgKDEsIHBhZGFwdGVyLT5yZWdTZWN0Q291bnQpOworCisJV3JpdGVDb21tYW5kIChwYWRhcHRlciwgSURFX0NPTU1BTkRfV1JJVEUpOwkKKwlpZiAoIFdhaXREcnEgKHBhZGFwdGVyKSApCisJCXJldHVybiBUUlVFOworCVN0YXJ0VGltZXIgKHBhZGFwdGVyKTsJCisJcGFkYXB0ZXItPmV4cGVjdGluZ0lSUSA9IFRSVUU7CisJCisJKChVTE9ORyAqKSgmcGFkYXB0ZXItPmtCdWZmZXJbRElTS19NSVJST1JfUE9TSVRJT05dKSlbMF0gPSAoKFVMT05HICopKCZwZGV2LT5EaXNrTWlycm9yW2luZGV4XSkpWzBdOworCSgoVUxPTkcgKikoJnBhZGFwdGVyLT5rQnVmZmVyW0RJU0tfTUlSUk9SX1BPU0lUSU9OXSkpWzFdID0gKChVTE9ORyAqKSgmcGRldi0+RGlza01pcnJvcltpbmRleF0pKVsxXTsKKwlvdXRzdyAocGFkYXB0ZXItPnJlZ0RhdGEsIHBhZGFwdGVyLT5rQnVmZmVyLCBCWVRFU19QRVJfU0VDVE9SIC8gMik7CisJcmV0dXJuIEZBTFNFOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOgkJCUluaXRGYWlsb3ZlcgorICoKKyAqCURlc2NyaXB0aW9uOglUaGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZhaWxvdmVyIHJvdXRpbmUKKyAqCisgKglQYXJhbWV0ZXJzOgkJU0NwbnQJIC0gUG9pbnRlciB0byBTQ1NJIGNvbW1hbmQgc3RydWN0dXJlLgorICoJCQkJCXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoJCQkJCXBkZXYJIC0gUG9pbnRlciB0byBvdXIgZGV2aWNlLgorICoJCisgKglSZXR1cm5zOgkJVFJVRSBvbiBlcnJvci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBJbml0RmFpbG92ZXIgKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIsIFBPVVJfREVWSUNFIHBkZXYpCisJeworCVVDSEFSCXNwaWdvdDsKKwkKKwlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6ICBJbml0aWFsaXplIGZhaWxvdmVyIHByb2Nlc3MgLSBzdXJ2aXZvciA9ICVkIiwgcGRldi0+ZGV2aWNlSURbcGFkYXB0ZXItPnN1cnZpdm9yXSkpOworCXBkZXYtPnJhaWQgPSBGQUxTRTsJCQkJCQkJCQkvL2luaXRpYWxpemVzIHN5c3RlbSBmb3Igbm9uIHJhaWQgbW9kZQorCXBkZXYtPnJlY29uT24gPSBGQUxTRTsKKwlzcGlnb3QgPSBwZGV2LT5zcGlnb3RzW3BhZGFwdGVyLT5zdXJ2aXZvcl07CQorCisJaWYgKCBwZGV2LT5EaXNrTWlycm9yW3BhZGFwdGVyLT5zdXJ2aXZvcl0uc3RhdHVzICYgVUNCRl9SRUJVSUxEICkKKwkJeworCQlERUIgKHByaW50ayAoIlxuICAgICAgICAgZmFpbGVkLCBpcyBzdXJ2aXZvciIpKTsKKwkJcmV0dXJuIChUUlVFKTsgCisJCX0KKworCWlmICggSGFyZFJlc2V0IChwYWRhcHRlciwgcGRldiwgc3BpZ290KSApCisJCXsKKwkJREVCIChwcmludGsgKCJcbiAgICAgICAgIGZhaWxlZCwgcmVzZXQiKSk7CisJCXJldHVybiBUUlVFOworCQl9CisKKwlBbGFybSAocGFkYXB0ZXIsIHBkZXYtPmRldmljZUlEW3BhZGFwdGVyLT5zdXJ2aXZvciBeIDFdKTsKKwlwZGV2LT5EaXNrTWlycm9yW3BhZGFwdGVyLT5zdXJ2aXZvcl0uc3RhdHVzID0gVUNCRl9NSVJST1JFRCB8IFVDQkZfU1VSVklWT1I7CS8vY2xlYXIgcHJlc2VudCBzdGF0dXMKKwkKKwlpZiAoIFdyaXRlU2lnbmF0dXJlIChwYWRhcHRlciwgcGRldiwgc3BpZ290LCBwYWRhcHRlci0+c3Vydml2b3IpICkKKwkJeworCQlERUIgKHByaW50ayAoIlxuICAgICAgICAgZmFpbGVkLCB3cml0ZSBzaWduYXR1cmUiKSk7CisJCXJldHVybiBUUlVFOworCQl9CisJcGFkYXB0ZXItPmZhaWxpbnByb2cgPSBUUlVFOworCXJldHVybiBGQUxTRTsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJVGltZXJFeHBpcnkJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVRpbWVyIGV4cGlyeSByb3V0aW5lLgorICoKKyAqCVBhcmFtZXRlcnM6CQlkYXRhIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoKKyAqCVJldHVybnM6CQlOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgVGltZXJFeHBpcnkgKHVuc2lnbmVkIGxvbmcgZGF0YSkKKwl7CisJUEFEQVBURVIyMjIwSQlwYWRhcHRlciA9IChQQURBUFRFUjIyMjBJKWRhdGE7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHBhZGFwdGVyLT5TQ3BudC0+ZGV2aWNlLT5ob3N0OworCVBPVVJfREVWSUNFCQlwZGV2ID0gcGFkYXB0ZXItPnBkZXY7CisJVUNIQVIJCQlzdGF0dXMgPSBJREVfU1RBVFVTX0JVU1k7CisJVUNIQVIJCQl0ZW1wLCB0ZW1wMTsKKyAgICB1bnNpZ25lZCBsb25nCQlmbGFnczsKKworICAgIC8qCisgICAgICogRGlzYWJsZSBpbnRlcnJ1cHRzLCBpZiB0aGV5IGFyZW4ndCBhbHJlYWR5IGRpc2FibGVkIGFuZCBhY3F1aXJlCisgICAgICogdGhlIEkvTyBzcGlubG9jay4KKyAgICAgKi8KKyAgICBzcGluX2xvY2tfaXJxc2F2ZSAoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJREVCIChwcmludGsgKCJcblBDSTIyMjBJOiBUaW1lb3V0IGV4cGlyZWQgIikpOworCisJaWYgKCBwYWRhcHRlci0+ZmFpbGlucHJvZyApCisJCXsKKwkJREVCIChwcmludGsgKCJpbiBmYWlsb3ZlciBwcm9jZXNzIikpOworCQlPcERvbmUgKHBhZGFwdGVyLCBEZWNvZGVFcnJvciAocGFkYXB0ZXIsIGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCkpKTsKKwkJZ290byB0aW1lckV4cGlyeURvbmU7CisJCX0KKwkKKwl3aGlsZSAoIHBhZGFwdGVyLT5yZWNvblBoYXNlICkKKwkJeworCQlERUIgKHByaW50ayAoImluIHJlY29uIHBoYXNlICVYIiwgcGFkYXB0ZXItPnJlY29uUGhhc2UpKTsKKwkJc3dpdGNoICggcGFkYXB0ZXItPnJlY29uUGhhc2UgKQorCQkJeworCQkJY2FzZSBSRUNPTl9QSEFTRV9NQVJLSU5HOgorCQkJY2FzZSBSRUNPTl9QSEFTRV9MQVNUOgorCQkJCXBhZGFwdGVyLT5zdXJ2aXZvciA9ICggcGRldi0+c3BpZ290ID09IHBkZXYtPnNwaWdvdHNbMF0gKSA/IDEgOiAwOworCQkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogRkFJTFVSRSAxIikpOworCQkJCWlmICggSW5pdEZhaWxvdmVyIChwYWRhcHRlciwgcGRldikgKQorCQkJCQlPcERvbmUgKHBhZGFwdGVyLCBESURfRVJST1IgPDwgMTYpOworCQkJCWdvdG8gdGltZXJFeHBpcnlEb25lOworCQkJCisJCQljYXNlIFJFQ09OX1BIQVNFX1JFQURZOgorCQkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9FUlJPUiA8PCAxNik7CisJCQkJZ290byB0aW1lckV4cGlyeURvbmU7CisKKwkJCWNhc2UgUkVDT05fUEhBU0VfQ09QWToKKwkJCQlwYWRhcHRlci0+c3Vydml2b3IgPSAoIHBkZXYtPnNwaWdvdCA9PSBwZGV2LT5zcGlnb3RzWzBdICkgPyAwIDogMTsKKwkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IEZBSUxVUkUgMiIpKTsKKwkJCQlERUIgKHByaW50ayAoIlxuICAgICAgIHNwaWcvc3RhdCA9ICVYIiwgaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0U2VsKSk7CisJCQkJaWYgKCBJbml0RmFpbG92ZXIgKHBhZGFwdGVyLCBwZGV2KSApCisJCQkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9FUlJPUiA8PCAxNik7CisJCQkJZ290byB0aW1lckV4cGlyeURvbmU7CisKKwkJCWNhc2UgUkVDT05fUEhBU0VfVVBEQVRFOgorCQkJCXBhZGFwdGVyLT5zdXJ2aXZvciA9ICggcGRldi0+c3BpZ290ID09IHBkZXYtPnNwaWdvdHNbMF0gKSA/IDAgOiAxOworCQkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogRkFJTFVSRSAzIikpKTsKKwkJCQlpZiAoIEluaXRGYWlsb3ZlciAocGFkYXB0ZXIsIHBkZXYpICkKKwkJCQkJT3BEb25lIChwYWRhcHRlciwgRElEX0VSUk9SIDw8IDE2KTsKKwkJCQlnb3RvIHRpbWVyRXhwaXJ5RG9uZTsKKworCQkJY2FzZSBSRUNPTl9QSEFTRV9FTkQ6CisJCQkJcGFkYXB0ZXItPnN1cnZpdm9yID0gKCBwZGV2LT5zcGlnb3QgPT0gcGRldi0+c3BpZ290c1swXSApID8gMCA6IDE7CisJCQkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBGQUlMVVJFIDQiKSk7CisJCQkJaWYgKCBJbml0RmFpbG92ZXIgKHBhZGFwdGVyLCBwZGV2KSApCisJCQkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9FUlJPUiA8PCAxNik7CisJCQkJZ290byB0aW1lckV4cGlyeURvbmU7CisJCQkKKwkJCWRlZmF1bHQ6CisJCQkJZ290byB0aW1lckV4cGlyeURvbmU7CisJCQl9CisJCX0KKwkKKwl3aGlsZSAoIHBhZGFwdGVyLT5jbWQgKQorCQl7CisJCW91dGJfcCAoMHgwOCwgcGFkYXB0ZXItPnJlZ0RtYUNtZFN0YXQpOwkJCQkJLy8gY2FuY2VsIGludGVycnVwdCBmcm9tIERNQSBlbmdpbmUKKwkJaWYgKCBwZGV2LT5yYWlkICkKKwkJCXsKKwkJCWlmICggcGFkYXB0ZXItPmNtZCA9PSBXUklURV9DTUQgKQorCQkJCXsKKwkJCQlERUIgKHByaW50ayAoImluIFJBSUQgd3JpdGUgb3BlcmF0aW9uIikpOworCQkJCXRlbXAgPSAoIHBkZXYtPnNwaWdvdCAmIChTRUxfMSB8IFNFTF8yKSApID8gU0VMXzEgOiBTRUxfMzsKKwkJCQlpZiAoIGluYl9wIChwYWRhcHRlci0+cmVnU3RhdFNlbCkgJiB0ZW1wICkKKwkJCQkJeworCQkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IERldGVybWluZWQgQSBPSyIpKTsKKwkJCQkJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgdGVtcCB8IFNFTF9JUlFfT0ZGKTsgLy8gTWFza2luZyB0aGUgaW50ZXJydXB0IGR1cmluZyBzcGlnb3Qgc2VsZWN0CisJCQkJCXRlbXAgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRDbWQpOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQl0ZW1wID0gSURFX1NUQVRVU19CVVNZOworCisJCQkJdGVtcDEgPSAoIHBkZXYtPnNwaWdvdCAmIChTRUxfMSB8IFNFTF8yKSApID8gU0VMXzIgOiBTRUxfNDsKKwkJCQlpZiAoIGluYiAocGFkYXB0ZXItPnJlZ1N0YXRTZWwpICYgdGVtcDEgKQorCQkJCQl7CisJCQkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogRGV0ZXJtaW5lZCBCIE9LIikpOworCQkJCQlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCB0ZW1wMSB8IFNFTF9JUlFfT0ZGKTsgLy8gTWFza2luZyB0aGUgaW50ZXJydXB0IGR1cmluZyBzcGlnb3Qgc2VsZWN0CisJCQkJCXRlbXAxID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0Q21kKTsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJdGVtcDEgPSBJREVfU1RBVFVTX0JVU1k7CisJCQkKKwkJCQlpZiAoICh0ZW1wICYgSURFX1NUQVRVU19CVVNZKSB8fCAodGVtcDEgJiBJREVfU1RBVFVTX0JVU1kpICkKKwkJCQkJeworCQkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IFN0YXR1cyBBOiAlWCAgIEI6ICVYIiwgdGVtcCAmIDB4RkYsIHRlbXAxICYgMHhGRikpOworCSAJCQkJaWYgKCAodGVtcCAmIElERV9TVEFUVVNfQlVTWSkgJiYgKHRlbXAxICYgSURFX1NUQVRVU19CVVNZKSApIAorCQkJCQkJeworCQkJCQkJc3RhdHVzID0gdGVtcDsKKwkJCQkJCWJyZWFrOworCQkJCQkJfQkJCisJCQkJCWVsc2UJCisJCQkJCQl7CisJCQkJCQlpZiAoIHRlbXAgJiBJREVfU1RBVFVTX0JVU1kgKQorCQkJCQkJCXBhZGFwdGVyLT5zdXJ2aXZvciA9IDE7CisJCQkJCQllbHNlCisJCQkJCQkJcGFkYXB0ZXItPnN1cnZpdm9yID0gMDsKKwkJCQkJCWlmICggSW5pdEZhaWxvdmVyIChwYWRhcHRlciwgcGRldikgKQorCQkJCQkJCXsKKwkJCQkJCQlzdGF0dXMgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRDbWQpOworCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCWdvdG8gdGltZXJFeHBpcnlEb25lOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlERUIgKHByaW50ayAoImluIFJBSUQgcmVhZCBvcGVyYXRpb24iKSk7CisJCQkJcGFkYXB0ZXItPnN1cnZpdm9yID0gKCBwZGV2LT5zcGlnb3QgPT0gcGRldi0+c3BpZ290c1swXSApID8gMCA6IDE7CisJCQkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBGQUlMVVJFIDYiKSk7CisJCQkJaWYgKCBJbml0RmFpbG92ZXIgKHBhZGFwdGVyLCBwZGV2KSApCisJCQkJCXsKKwkJCQkJc3RhdHVzID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0Q21kKTsKKwkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQlnb3RvIHRpbWVyRXhwaXJ5RG9uZTsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCURFQiAocHJpbnRrICgiaW4gSS9PIG9wZXJhdGlvbiIpKTsKKwkJCXN0YXR1cyA9IGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCk7CisJCQl9CisJCWJyZWFrOworCQl9CisJCisJT3BEb25lIChwYWRhcHRlciwgRGVjb2RlRXJyb3IgKHBhZGFwdGVyLCBzdGF0dXMpKTsKKwordGltZXJFeHBpcnlEb25lOjsKKyAgICAvKgorICAgICAqIFJlbGVhc2UgdGhlIEkvTyBzcGlubG9jayBhbmQgcmVzdG9yZSB0aGUgb3JpZ2luYWwgZmxhZ3MKKyAgICAgKiB3aGljaCB3aWxsIGVuYWJsZSBpbnRlcnJ1cHRzIGlmIGFuZCBvbmx5IGlmIHRoZXkgd2VyZQorICAgICAqIGVuYWJsZWQgb24gZW50cnkuCisgICAgICovCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CQkJU2V0UmVjb25zdHJ1Y3QJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVNldCB0aGUgcmVjb25zdHJ1Y3QgdXAuCisgKgorICoJUGFyYW1ldGVyczoJCXBkZXYJLSBQb2ludGVyIHRvIGRldmljZSBzdHJ1Y3R1cmUuCisgKgkJCQkJaW5kZXgJLSBNaXJyb3IgaW5kZXggbnVtYmVyLgorICoKKyAqCVJldHVybnM6CQlOdW1iZXIgb2Ygc2VjdG9ycyBvbiBuZXcgZGlzayByZXF1aXJlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBMT05HIFNldFJlY29uc3RydWN0IChQT1VSX0RFVklDRSBwZGV2LCBpbnQgaW5kZXgpCisJeworCXBkZXYtPkRpc2tNaXJyb3JbaW5kZXhdLnN0YXR1cyA9IFVDQkZfTUlSUk9SRUQ7CQkJCQkJCS8vIHNldHVwIHRoZSBmbGFncworCXBkZXYtPkRpc2tNaXJyb3JbaW5kZXggXiAxXS5zdGF0dXMgPSBVQ0JGX01JUlJPUkVEIHwgVUNCRl9SRUJVSUxEOworCXBkZXYtPkRpc2tNaXJyb3JbaW5kZXggXiAxXS5yZWNvbnN0cnVjdFBvaW50ID0gMDsJCQkJCQkvLyBzdGFydCB0aGUgcmVjb25zdHJ1Y3QKKwlwZGV2LT5yZWNvbkNvdW50ID0gMTk5MDsJCQkJCQkJCQkJCQkvLyBtYXJrIHRhcmdldCBkcml2ZSBlYXJseQorCXJldHVybiBwZGV2LT5EaXNrTWlycm9yW2luZGV4XS5yZWNvbnN0cnVjdFBvaW50OworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglSZWNvblRpbWVyRXhwaXJ5CTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglSZWNvbnN0cnVjdCB0aW1lciBleHBpcnkgcm91dGluZS4KKyAqCisgKglQYXJhbWV0ZXJzOgkJZGF0YSAtIFBvaW50ZXIgYWRhcHRlciBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKglSZXR1cm5zOgkJTm90aGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFJlY29uVGltZXJFeHBpcnkgKHVuc2lnbmVkIGxvbmcgZGF0YSkKKwl7CisJUEFEQVBURVIyMjIwSQlwYWRhcHRlciA9IChQQURBUFRFUjIyMjBJKWRhdGE7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHBhZGFwdGVyLT5TQ3BudC0+ZGV2aWNlLT5ob3N0OworCVBPVVJfREVWSUNFCQlwZGV2OworCVVMT05HCQkJdGVzdHNpemUgPSAwOworCVBJREVOVElGWV9EQVRBCXBpZDsKKwlVU0hPUlQJCQltaW5tb2RlOworCVVMT05HCQkJemw7CisJVUNIQVIJCQl6YzsKKwlVU0hPUlQJCQl6OworICAgIHVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKyAgICAvKgorICAgICAqIERpc2FibGUgaW50ZXJydXB0cywgaWYgdGhleSBhcmVuJ3QgYWxyZWFkeSBkaXNhYmxlZCBhbmQgYWNxdWlyZQorICAgICAqIHRoZSBJL08gc3BpbmxvY2suCisgICAgICovCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlpZiAoIHBhZGFwdGVyLT5TQ3BudCApCisJCWdvdG8gcmVjb25UaW1lckV4cGlyeTsKKworCXBhZGFwdGVyLT5yZWNvblRpbWVyLmRhdGEgPSAwOworCWZvciAoIHogPSBwYWRhcHRlci0+ZGV2SW5SZWNvbkluZGV4ICsgMTsgIHogPCBCSUdEX01BWERSSVZFUzsgIHorKyApCisJCXsKKwkJaWYgKCBwYWRhcHRlci0+ZGV2aWNlW3pdLnJlY29uT24gKQorCQkJYnJlYWs7CisJCX0KKwlpZiAoIHogPCBCSUdEX01BWERSSVZFUyApCisJCXBkZXYgPSAmcGFkYXB0ZXItPmRldmljZVt6XTsKKwllbHNlCisJCXsKKwkJZm9yICggeiA9IDA7ICB6IDwgQklHRF9NQVhEUklWRVM7ICB6KysgKQorCQkJeworCQkJaWYgKCBwYWRhcHRlci0+ZGV2aWNlW3pdLnJlY29uT24gKQorCQkJCWJyZWFrOworCQkJfQorCQlpZiAoIHogPCBCSUdEX01BWERSSVZFUyApCisJCQlwZGV2ID0gJnBhZGFwdGVyLT5kZXZpY2Vbel07CisJCWVsc2UKKwkJCXsKKwkJCXBhZGFwdGVyLT5yZWNvbk9uID0gRkFMU0U7CisJCQlnb3RvIHJlY29uVGltZXJFeHBpcnk7CisJCQl9CisJCX0KKworCXBhZGFwdGVyLT5kZXZJblJlY29uSW5kZXggPSB6OworCXBpZCA9IChQSURFTlRJRllfREFUQSlwYWRhcHRlci0+a0J1ZmZlcjsKKwlwYWRhcHRlci0+cGRldiA9IHBkZXY7CisJaWYgKCBwZGV2LT5yZWNvbklzU3RhcnRpbmcgKQorCQl7CisJCXBkZXYtPnJlY29uSXNTdGFydGluZyA9IEZBTFNFOworCQlwZGV2LT5yZWNvbk9uID0gRkFMU0U7CisKKwkJd2hpbGUgKCAocGRldi0+RGlza01pcnJvclswXS5zaWduYXR1cmUgPT0gU0lHTkFUVVJFKSAmJiAocGRldi0+RGlza01pcnJvclsxXS5zaWduYXR1cmUgPT0gU0lHTkFUVVJFKSAmJgorCQkJIChwZGV2LT5EaXNrTWlycm9yWzBdLnBhaXJJZGVudGlmaWVyID09IChwZGV2LT5EaXNrTWlycm9yWzFdLnBhaXJJZGVudGlmaWVyIF4gMSkpICkKKwkJCXsKKwkJCWlmICggKHBkZXYtPkRpc2tNaXJyb3JbMF0uc3RhdHVzICYgVUNCRl9NQVRDSEVEKSAmJiAocGRldi0+RGlza01pcnJvclsxXS5zdGF0dXMgJiBVQ0JGX01BVENIRUQpICkKKwkJCQlicmVhazsKKworCQkJaWYgKCBwZGV2LT5EaXNrTWlycm9yWzBdLnN0YXR1cyAmIFVDQkZfU1VSVklWT1IgKQkJCQkvLyBpcyBmaXJzdCBkcml2ZSBzdXJ2aXZvcj8KKwkJCQl0ZXN0c2l6ZSA9IFNldFJlY29uc3RydWN0IChwZGV2LCAwKTsKKwkJCWVsc2UKKwkJCQlpZiAoIHBkZXYtPkRpc2tNaXJyb3JbMV0uc3RhdHVzICYgVUNCRl9TVVJWSVZPUiApCQkJLy8gaXMgc2Vjb25kIGRyaXZlIHN1cnZpdm9yPworCQkJCQl0ZXN0c2l6ZSA9IFNldFJlY29uc3RydWN0IChwZGV2LCAxKTsKKworCQkJaWYgKCAocGRldi0+RGlza01pcnJvclswXS5zdGF0dXMgJiBVQ0JGX1JFQlVJTEQpIHx8IChwZGV2LT5EaXNrTWlycm9yWzFdLnN0YXR1cyAmIFVDQkZfUkVCVUlMRCkgKQorCQkJCXsKKwkJCQlpZiAoIHBkZXYtPkRpc2tNaXJyb3JbMF0uc3RhdHVzICYgVUNCRl9SRUJVSUxEICkKKwkJCQkJcGRldi0+bWlycm9yUmVjb24gPSAwOworCQkJCWVsc2UKKwkJCQkJcGRldi0+bWlycm9yUmVjb24gPSAxOworCQkJCXBkZXYtPnJlY29uT24gPSBUUlVFOworCQkJCX0KKwkJCWJyZWFrOworCQkJfQorCisJCWlmICggIXBkZXYtPnJlY29uT24gKQorCQkJZ290byByZWNvblRpbWVyRXhwaXJ5OworCisJCWlmICggcGFkYXB0ZXItPmJpZ0QgKQorCQkJeworCQkJcGFkYXB0ZXItPmZhaWxSZWdpc3RlciA9IDA7CisJCQlvdXRiX3AgKH5wYWRhcHRlci0+ZmFpbFJlZ2lzdGVyLCBwYWRhcHRlci0+cmVnRmFpbCk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCXpjID0gKChpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRTZWwpID4+IDMpIHwgaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0U2VsKSkgJiAweDgzOwkJLy8gbXV0ZSB0aGUgYWxhcm0KKwkJCW91dGJfcCAoMHhGRiwgcGFkYXB0ZXItPnJlZ0ZhaWwpOworCQkJfQorCisJCXdoaWxlICggMSApCisJCQl7CisJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IGhhcmQgcmVzZXQgaXNzdWUiKSk7CisJCQlpZiAoIEhhcmRSZXNldCAocGFkYXB0ZXIsIHBkZXYsIHBkZXYtPnNwaWdvdHNbcGRldi0+bWlycm9yUmVjb25dKSApCisJCQkJeworCQkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogc3ViIDEiKSk7CisJCQkJYnJlYWs7CisJCQkJfQorCisJCQlwZGV2LT5sYXN0c2VjdG9ybGJhW3BkZXYtPm1pcnJvclJlY29uXSA9IElubGluZUlkZW50aWZ5IChwYWRhcHRlciwgcGRldi0+c3BpZ290c1twZGV2LT5taXJyb3JSZWNvbl0sIHBkZXYtPmRldmljZUlEW3BkZXYtPm1pcnJvclJlY29uXSAmIDEpOworCisJCQlpZiAoIHBkZXYtPmxhc3RzZWN0b3JsYmFbcGRldi0+bWlycm9yUmVjb25dIDwgdGVzdHNpemUgKQorCQkJCXsKKwkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IHN1YiAyICVsZCAlbGQiLCBwZGV2LT5sYXN0c2VjdG9ybGJhW3BkZXYtPm1pcnJvclJlY29uXSwgdGVzdHNpemUpKTsKKwkJCQlicmVhazsKKwkJCQl9CisKKwkgICAgICAgIC8vIHRlc3QgTEJBIGFuZCBtdWx0aXBlciBzZWN0b3IgdHJhbnNmZXIgY29tcGF0aWJpbGl0eQorCQkJaWYgKCFwaWQtPlN1cHBvcnRMQkEgfHwgKHBpZC0+TnVtU2VjdG9yc1BlckludCA8IFNFQ1RPUlNYRkVSKSB8fCAhcGlkLT5WYWxpZF82NF83MCApCisJCQkJeworCQkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogc3ViIDMiKSk7CisJCQkJYnJlYWs7CisJCQkJfQorCisJICAgICAgICAvLyB0ZXN0IFBJTy9idXMgbWF0ZXJpbmcgbW9kZSBjb21wYXRpYmlsaXR5CisJCQlpZiAoIChwaWQtPk1pblBJT0N5Y2xlV2l0aG91dEZsb3cgPiAyNDApICYmICFwaWQtPlN1cHBvcnRJT1JEWURpc2FibGUgJiYgIXBhZGFwdGVyLT50aW1pbmdQSU8gKQorCQkJCXsKKwkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IHN1YiA0IikpOworCQkJCWJyZWFrOworCQkJCX0KKworCQkJaWYgKCBwaWQtPk1pblBJT0N5Y2xlV2l0aG91dEZsb3cgPD0gMTIwICkJLy8gc2V0dXAgdGltaW5nIG1vZGUgb2YgZHJpdmUKKwkJCQltaW5tb2RlID0gNTsKKwkJCWVsc2UKKwkJCQl7CisJCQkJaWYgKCBwaWQtPk1pblBJT0N5bGNlV2l0aEZsb3cgPD0gMTUwICkKKwkJCQkJbWlubW9kZSA9IDQ7CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCWlmICggcGlkLT5NaW5QSU9DeWxjZVdpdGhGbG93IDw9IDE4MCApCisJCQkJCQltaW5tb2RlID0gMzsKKwkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJaWYgKCBwaWQtPk1pblBJT0N5bGNlV2l0aEZsb3cgPD0gMjQwICkKKwkJCQkJCQltaW5tb2RlID0gMjsKKwkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBzdWIgNSIpKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCWlmICggcGFkYXB0ZXItPnRpbWluZ01vZGUgPiBtaW5tb2RlICkJCQkJCQkJCQkvLyBzZXQgbWluaW11bSB0aW1pbmcgbW9kZQorCQkJCXBhZGFwdGVyLT50aW1pbmdNb2RlID0gbWlubW9kZTsKKwkJCWlmICggcGFkYXB0ZXItPnRpbWluZ01vZGUgPj0gMiApCisJCQkJcGFkYXB0ZXItPnRpbWluZ0FkZHJlc3MJPSBNb2RlQXJyYXlbcGFkYXB0ZXItPnRpbWluZ01vZGUgLSAyXTsKKwkJCWVsc2UKKwkJCQlwYWRhcHRlci0+dGltaW5nUElPID0gVFJVRTsKKworCQkJcGFkYXB0ZXItPnJlY29uT24gPSBUUlVFOworCQkJYnJlYWs7CisJCQl9CisKKwkJaWYgKCAhcGRldi0+cmVjb25PbiApCisJCQl7CQkKKwkJCXBhZGFwdGVyLT5zdXJ2aXZvciA9IHBkZXYtPm1pcnJvclJlY29uIF4gMTsKKwkJCXBhZGFwdGVyLT5yZWNvblBoYXNlID0gUkVDT05fUEhBU0VfRkFJTE9WRVI7CisJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IEZBSUxVUkUgNyIpKTsKKwkJCUluaXRGYWlsb3ZlciAocGFkYXB0ZXIsIHBkZXYpOworCQkJZ290byByZWNvblRpbWVyRXhwaXJ5OworCQkJfQorCisJCXBkZXYtPnJhaWQgPSBUUlVFOworCQorCQlpZiAoIFdyaXRlU2lnbmF0dXJlIChwYWRhcHRlciwgcGRldiwgcGRldi0+c3BpZ290LCBwZGV2LT5taXJyb3JSZWNvbiBeIDEpICkKKwkJCWdvdG8gcmVjb25UaW1lckV4cGlyeTsKKwkJcGFkYXB0ZXItPnJlY29uUGhhc2UgPSBSRUNPTl9QSEFTRV9NQVJLSU5HOworCQlnb3RvIHJlY29uVGltZXJFeHBpcnk7CisJCX0KKworCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCS8vIHJlY29uc3RydWN0IGNvcHkgc3RhcnRzIGhlcmUJCisJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJaWYgKCBwZGV2LT5yZWNvbkNvdW50KysgPiAyMDAwICkKKwkJeworCQlwZGV2LT5yZWNvbkNvdW50ID0gMDsKKwkJaWYgKCBXcml0ZVNpZ25hdHVyZSAocGFkYXB0ZXIsIHBkZXYsIHBkZXYtPnNwaWdvdHNbcGRldi0+bWlycm9yUmVjb25dLCBwZGV2LT5taXJyb3JSZWNvbikgKQorCQkJeworCQkJcGFkYXB0ZXItPnN1cnZpdm9yID0gcGRldi0+bWlycm9yUmVjb24gXiAxOworCQkJcGFkYXB0ZXItPnJlY29uUGhhc2UgPSBSRUNPTl9QSEFTRV9GQUlMT1ZFUjsKKwkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogRkFJTFVSRSA4IikpOworCQkJSW5pdEZhaWxvdmVyIChwYWRhcHRlciwgcGRldik7CisJCQlnb3RvIHJlY29uVGltZXJFeHBpcnk7CisJCQl9CisJCXBhZGFwdGVyLT5yZWNvblBoYXNlID0gUkVDT05fUEhBU0VfVVBEQVRFOworCQlnb3RvIHJlY29uVGltZXJFeHBpcnk7CisJCX0KKworCXpsID0gcGRldi0+RGlza01pcnJvcltwZGV2LT5taXJyb3JSZWNvbl0ucmVjb25zdHJ1Y3RQb2ludDsJCisJcGFkYXB0ZXItPnJlY29uU2l6ZSA9IHBkZXYtPkRpc2tNaXJyb3JbcGRldi0+bWlycm9yUmVjb24gXiAxXS5yZWNvbnN0cnVjdFBvaW50IC0gemw7CisJaWYgKCBwYWRhcHRlci0+cmVjb25TaXplID4gTUFYX0JVU19NQVNURVJfQkxPQ0tTICkKKwkJcGFkYXB0ZXItPnJlY29uU2l6ZSA9IE1BWF9CVVNfTUFTVEVSX0JMT0NLUzsKKworCWlmICggcGFkYXB0ZXItPnJlY29uU2l6ZSApCisJCXsKKwkJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgcGRldi0+c3BpZ290c1swXSB8IHBkZXYtPnNwaWdvdHNbMV0pOwkvLyBzZWxlY3QgdGhlIHNwaWdvdHMKKwkJb3V0Yl9wIChwZGV2LT5ieXRlNiB8ICgoVUNIQVIgKikoJnpsKSlbM10sIHBhZGFwdGVyLT5yZWdMYmEyNCk7CS8vIHNlbGVjdCB0aGUgZHJpdmUKKwkJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgcGRldi0+c3BpZ290KTsKKwkJaWYgKCBXYWl0UmVhZHkgKHBhZGFwdGVyKSApCisJCQlnb3RvIHJlY29uVGltZXJFeHBpcnk7CisKKwkJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgcGRldi0+c3BpZ290c1twZGV2LT5taXJyb3JSZWNvbl0pOworCQlpZiAoIFdhaXRSZWFkeSAocGFkYXB0ZXIpICkKKwkJCXsKKwkJCXBhZGFwdGVyLT5zdXJ2aXZvciA9IHBkZXYtPm1pcnJvclJlY29uIF4gMTsKKwkJCXBhZGFwdGVyLT5yZWNvblBoYXNlID0gUkVDT05fUEhBU0VfRkFJTE9WRVI7CisJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IEZBSUxVUkUgOSIpKTsKKwkJCUluaXRGYWlsb3ZlciAocGFkYXB0ZXIsIHBkZXYpOworCQkJZ290byByZWNvblRpbWVyRXhwaXJ5OworCQkJfQorCQorCQlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3RzWzBdIHwgcGRldi0+c3BpZ290c1sxXSk7CisJCW91dGJfcCAocGFkYXB0ZXItPnJlY29uU2l6ZSAmIDB4RkYsIHBhZGFwdGVyLT5yZWdTZWN0Q291bnQpOworCQlvdXRiX3AgKCgoVUNIQVIgKikoJnpsKSlbMF0sIHBhZGFwdGVyLT5yZWdMYmEwKTsKKwkJb3V0Yl9wICgoKFVDSEFSICopKCZ6bCkpWzFdLCBwYWRhcHRlci0+cmVnTGJhOCk7CisJCW91dGJfcCAoKChVQ0hBUiAqKSgmemwpKVsyXSwgcGFkYXB0ZXItPnJlZ0xiYTE2KTsKKwkJcGFkYXB0ZXItPmV4cGVjdGluZ0lSUSA9IFRSVUU7CisJCXBhZGFwdGVyLT5yZWNvblBoYXNlID0gUkVDT05fUEhBU0VfUkVBRFk7CisJCVNlbGVjdFNwaWdvdCAocGFkYXB0ZXIsIHBkZXYtPnNwaWdvdHNbcGRldi0+bWlycm9yUmVjb25dKTsKKwkJV3JpdGVDb21tYW5kIChwYWRhcHRlciwgV1JJVEVfQ01EKTsKKwkJU3RhcnRUaW1lciAocGFkYXB0ZXIpOworCQlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3QpOworCQlXcml0ZUNvbW1hbmQgKHBhZGFwdGVyLCBSRUFEX0NNRCk7CisJCWdvdG8gcmVjb25UaW1lckV4cGlyeTsKKwkJfQorCisJcGRldi0+RGlza01pcnJvcltwZGV2LT5taXJyb3JSZWNvbl0uc3RhdHVzID0gVUNCRl9NSVJST1JFRCB8IFVDQkZfTUFUQ0hFRDsKKwlwZGV2LT5EaXNrTWlycm9yW3BkZXYtPm1pcnJvclJlY29uIF4gMV0uc3RhdHVzID0gVUNCRl9NSVJST1JFRCB8IFVDQkZfTUFUQ0hFRDsKKwlpZiAoIFdyaXRlU2lnbmF0dXJlIChwYWRhcHRlciwgcGRldiwgcGRldi0+c3BpZ290LCBwZGV2LT5taXJyb3JSZWNvbiBeIDEpICkKKwkJZ290byByZWNvblRpbWVyRXhwaXJ5OworCXBhZGFwdGVyLT5yZWNvblBoYXNlID0gUkVDT05fUEhBU0VfTEFTVDsKKworcmVjb25UaW1lckV4cGlyeTo7CisgICAgLyoKKyAgICAgKiBSZWxlYXNlIHRoZSBJL08gc3BpbmxvY2sgYW5kIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGZsYWdzCisgICAgICogd2hpY2ggd2lsbCBlbmFibGUgaW50ZXJydXB0cyBpZiBhbmQgb25seSBpZiB0aGV5IHdlcmUKKyAgICAgKiBlbmFibGVkIG9uIGVudHJ5LgorICAgICAqLworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CUlycV9IYW5kbGVyCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglJbnRlcnJ1cHQgaGFuZGxlci4KKyAqCisgKglQYXJhbWV0ZXJzOgkJaXJxCQktIEhhcmR3YXJlIElSUSBudW1iZXIuCisgKgkJCQkJZGV2X2lkCS0KKyAqCQkJCQlyZWdzCS0KKyAqCisgKglSZXR1cm5zOgkJVFJVRSBpZiBkcml2ZSBpcyBub3QgcmVhZHkgaW4gdGltZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBJcnFfSGFuZGxlciAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKwl7CisJc3RydWN0IFNjc2lfSG9zdCAgICpzaG9zdCA9IE5VTEw7CS8vIFBvaW50ZXIgdG8gaG9zdCBkYXRhIGJsb2NrCisJUEFEQVBURVIyMjIwSQkJcGFkYXB0ZXI7CQkvLyBQb2ludGVyIHRvIGFkYXB0ZXIgY29udHJvbCBzdHJ1Y3R1cmUKKwlQT1VSX0RFVklDRQkJCXBkZXY7CisJU2NzaV9DbW5kCQkgICAqU0NwbnQ7CisJVUNIQVIJCQkJc3RhdHVzOworCVVDSEFSCQkJCXN0YXR1czE7CisJQVRBUElfU1RBVFVTCQlzdGF0dXNhOworCUFUQVBJX1JFQVNPTgkJcmVhc29uYTsKKwlBVEFQSV9FUlJPUgkJCWVycm9yYTsKKwlpbnQJCQkJCXo7CisJVUxPTkcJCQkJemw7CisgICAgdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisgICAgaW50IGhhbmRsZWQgPSAwOworCisvLwlERUIgKHByaW50ayAoIlxucGNpMjIyMGkgcmVjZWl2ZWQgaW50ZXJydXB0XG4iKSk7CisKKwlmb3IgKCB6ID0gMDsgeiA8IE51bUFkYXB0ZXJzOyAgeisrICkJCQkJCQkJCS8vIHNjYW4gZm9yIGludGVycnVwdCB0byBwcm9jZXNzCisJCXsKKwkJaWYgKCBQc2lIb3N0W3pdLT5pcnEgPT0gKFVDSEFSKShpcnEgJiAweEZGKSApCisJCQl7CisJCQlpZiAoIGlud19wIChIT1NUREFUQShQc2lIb3N0W3pdKS0+cmVnSXJxQ29udHJvbCkgJiAweDgwMDAgKQorCQkJCXsKKwkJCQlzaG9zdCA9IFBzaUhvc3Rbel07CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwlpZiAoICFzaG9zdCApCisJCXsKKwkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBub3QgbXkgaW50ZXJydXB0IikpOworCQlnb3RvIG91dDsKKwkJfQorCisJaGFuZGxlZCA9IDE7CisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXBhZGFwdGVyID0gSE9TVERBVEEoc2hvc3QpOworCXBkZXYgPSBwYWRhcHRlci0+cGRldjsKKwlTQ3BudCA9IHBhZGFwdGVyLT5TQ3BudDsKKwlvdXRiX3AgKDB4MDgsIHBhZGFwdGVyLT5yZWdEbWFDbWRTdGF0KTsJCQkJCQkJCQkvLyBjYW5jZWwgaW50ZXJydXB0IGZyb20gRE1BIGVuZ2luZQorCisJaWYgKCBwYWRhcHRlci0+YXRhcGkgJiYgU0NwbnQgKQorCQl7CisJCSooY2hhciAqKSZzdGF0dXNhID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0Q21kKTsJCQkJCQkvLyByZWFkIHRoZSBkZXZpY2Ugc3RhdHVzCisJCSooY2hhciAqKSZyZWFzb25hID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTZWN0Q291bnQpOwkJCQkJCS8vIHJlYWQgdGhlIGRldmljZSBpbnRlcnJ1cHQgcmVhc29uCisJCisJCWlmICggIXN0YXR1c2EuYnN5ICkKKwkJCXsKKwkJCWlmICggc3RhdHVzYS5kcnEgKQkJCQkJCQkJCQkJCQkvLyB0ZXN0IGZvciB0cmFuc2ZlciBwaGFzZQorCQkJCXsKKwkJCQlpZiAoICFyZWFzb25hLmNvZCApCQkJCQkJCQkJCQkJLy8gdGVzdCBmb3IgZGF0YSBwaGFzZQorCQkJCQl7CisJCQkJCXogPSAoVUxPTkcpaW5iX3AgKHBhZGFwdGVyLT5yZWdMYmE4KSB8IChVTE9ORykoaW5iX3AgKHBhZGFwdGVyLT5yZWdMYmExNikgPDwgOCk7CisJCQkJCWlmICggcGFkYXB0ZXItPnJlcVNlbnNlICkKKwkJCQkJCWluc3cgKHBhZGFwdGVyLT5yZWdEYXRhLCBTQ3BudC0+c2Vuc2VfYnVmZmVyLCB6IC8gMik7CisJCQkJCWVsc2UKKwkJCQkJCUF0YXBpQnVzTWFzdGVyIChwYWRhcHRlciwgcmVhc29uYS5pbywgeik7CisJCQkJCWdvdG8gaXJxX3JldHVybjsKKwkJCQkJfQorCQkJCWlmICggcmVhc29uYS5jb2QgJiYgIXJlYXNvbmEuaW8gKQkJCQkJCQkJLy8gdGVzdCBmb3IgY29tbWFuZCBwYWNrZXQgcGhhc2UKKwkJCQkJeworCQkJCQlpZiAoIHBhZGFwdGVyLT5yZXFTZW5zZSApCisJCQkJCQlBdGFwaVJlcXVlc3RTZW5zZSAocGFkYXB0ZXIsIHBkZXYsIFNDcG50LCBUUlVFKTsKKwkJCQkJZWxzZQorCQkJCQkJQXRhcGlTZW5kQ2RiIChwYWRhcHRlciwgcGRldiwgcGFkYXB0ZXItPmF0YXBpQ2RiKTsKKwkJCQkJZ290byBpcnFfcmV0dXJuOworCQkJCQl9CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlpZiAoIHJlYXNvbmEuaW8gJiYgc3RhdHVzYS5kcmR5ICkJCQkJCQkJCS8vIHRlc3QgZm9yIHN0YXR1cyBwaGFzZQorCQkJCQl7CisJCQkJCUF0YXBpMlNjc2kgKHBhZGFwdGVyLCBTQ3BudCk7CisJCQkJCWlmICggc3RhdHVzYS5jaGVjayApCisJCQkJCQl7CisJCQkJCQkqKFVDSEFSICopJmVycm9yYSA9IGluYl9wIChwYWRhcHRlci0+cmVnRXJyb3IpOwkJCS8vIHJlYWQgdGhlIGRldmljZSBlcnJvcgorCQkJCQkJaWYgKCBlcnJvcmEuc2Vuc2VLZXkgKQorCQkJCQkJCXsKKwkJCQkJCQlpZiAoIHBhZGFwdGVyLT5yZXFTZW5zZSB8fCBBdGFwaVJlcXVlc3RTZW5zZSAocGFkYXB0ZXIsIHBkZXYsIFNDcG50LCBGQUxTRSkgKQorCQkJCQkJCQlPcERvbmUgKHBhZGFwdGVyLCBESURfRVJST1IgPDwgMTYpOworCQkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJaWYgKCBlcnJvcmEuaWxpIHx8IGVycm9yYS5hYm9ydCApCisJCQkJCQkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9FUlJPUiA8PCAxNik7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlPcERvbmUgKHBhZGFwdGVyLCBESURfT0sgPDwgMTYpOwkKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCWlmICggcGFkYXB0ZXItPnJlcVNlbnNlICkKKwkJCQkJCQl7CisJCQkJCQkJREVCIChwcmludGsgKCJQQ0kyMjQySTogU2Vuc2UgY29kZXMgLSAlWCAlWCAlWCAiLCAoKFVDSEFSICopU0NwbnQtPnNlbnNlX2J1ZmZlcilbMF0sICgoVUNIQVIgKilTQ3BudC0+c2Vuc2VfYnVmZmVyKVsxMl0sICgoVUNIQVIgKilTQ3BudC0+c2Vuc2VfYnVmZmVyKVsxM10pKTsKKwkJCQkJCQlPcERvbmUgKHBhZGFwdGVyLCAoRFJJVkVSX1NFTlNFIDw8IDI0KSB8IChESURfT0sgPDwgMTYpIHwgMik7CisJCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9PSyA8PCAxNik7CQorCQkJCQl9CisJCQkJfQorCQkJfQkJCisJCWdvdG8gaXJxX3JldHVybjsKKwkJfQorCQorCWlmICggIXBhZGFwdGVyLT5leHBlY3RpbmdJUlEgfHwgIShTQ3BudCB8fCBwYWRhcHRlci0+cmVjb25QaGFzZSkgKQorCQl7CisJCURFQihwcmludGsgKCJcbnBjaTIyMjBpIFVuc29saWNpdGVkIGludGVycnVwdFxuIikpOworCQlTVE9QX0hFUkUgKCk7CisJCWdvdG8gaXJxX3JldHVybjsKKwkJfQorCXBhZGFwdGVyLT5leHBlY3RpbmdJUlEgPSAwOworCisJaWYgKCBwYWRhcHRlci0+ZmFpbGlucHJvZyApCisJCXsKKwkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpIGludGVycnVwdCBmYWlsb3ZlciBjb21wbGV0ZSIpKTsKKwkJcGFkYXB0ZXItPmZhaWxpbnByb2cgPSBGQUxTRTsKKwkJc3RhdHVzID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0Q21kKTsJCQkJCQkJCS8vIHJlYWQgdGhlIGRldmljZSBzdGF0dXMKKwkJaWYgKCBzdGF0dXMgJiAoSURFX1NUQVRVU19FUlJPUiB8IElERV9TVEFUVVNfV1JJVEVfRkFVTFQpICkKKwkJCXsKKwkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogaW50ZXJydXB0IGZhaWxvdmVyIGVycm9yIGZyb20gZHJpdmUgJVgiLCBzdGF0dXMpKTsKKwkJCXBhZGFwdGVyLT5jbWQgPSAwOworCQkJfQorCQllbHNlCisJCQl7CisJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IHJlc3RhcnRpbmcgZmFpbGVkIG9wZXJ0YXRpb24uIikpOworCQkJcGRldi0+c3BpZ290ID0gKHBhZGFwdGVyLT5zdXJ2aXZvcikgPyBwZGV2LT5zcGlnb3RzWzFdIDogcGRldi0+c3BpZ290c1swXTsKKwkJCWRlbF90aW1lciAoJnBhZGFwdGVyLT50aW1lcik7CisJCQlpZiAoIHBhZGFwdGVyLT5yZWNvblBoYXNlICkKKwkJCQlPcERvbmUgKHBhZGFwdGVyLCBESURfT0sgPDwgMTYpOworCQkJZWxzZQorCQkJCVBjaTIyMjBpX1F1ZXVlQ29tbWFuZCAoU0NwbnQsIFNDcG50LT5zY3NpX2RvbmUpOworCQkJZ290byBpcnFfcmV0dXJuOwkJCisJCQl9CisJCX0KKworCWlmICggcGFkYXB0ZXItPnJlY29uUGhhc2UgKQorCQl7CisJCXN3aXRjaCAoIHBhZGFwdGVyLT5yZWNvblBoYXNlICkKKwkJCXsKKwkJCWNhc2UgUkVDT05fUEhBU0VfTUFSS0lORzoKKwkJCWNhc2UgUkVDT05fUEhBU0VfTEFTVDoKKwkJCQlzdGF0dXMgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRDbWQpOwkJCQkJCS8vIHJlYWQgdGhlIGRldmljZSBzdGF0dXMKKwkJCQlkZWxfdGltZXIgKCZwYWRhcHRlci0+dGltZXIpOworCQkJCWlmICggcGFkYXB0ZXItPnJlY29uUGhhc2UgPT0gUkVDT05fUEhBU0VfTEFTVCApCisJCQkJCXsKKwkJCQkJaWYgKCBzdGF0dXMgJiAoSURFX1NUQVRVU19FUlJPUiB8IElERV9TVEFUVVNfV1JJVEVfRkFVTFQpICkKKwkJCQkJCXsKKwkJCQkJCXBhZGFwdGVyLT5zdXJ2aXZvciA9ICggcGRldi0+c3BpZ290ID09IHBkZXYtPnNwaWdvdHNbMF0gKSA/IDEgOiAwOworCQkJCQkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBGQUlMVVJFIDEwIikpOworCQkJCQkJaWYgKCBJbml0RmFpbG92ZXIgKHBhZGFwdGVyLCBwZGV2KSApCisJCQkJCQkJT3BEb25lIChwYWRhcHRlciwgRGVjb2RlRXJyb3IgKHBhZGFwdGVyLCBzdGF0dXMpKTsKKwkJCQkJCWdvdG8gaXJxX3JldHVybjsKKwkJCQkJCX0KKwkJCQkJaWYgKCBXcml0ZVNpZ25hdHVyZSAocGFkYXB0ZXIsIHBkZXYsIHBkZXYtPnNwaWdvdHNbcGRldi0+bWlycm9yUmVjb25dLCBwZGV2LT5taXJyb3JSZWNvbikgKQorCQkJCQkJeworCQkJCQkJcGFkYXB0ZXItPnN1cnZpdm9yID0gKCBwZGV2LT5zcGlnb3QgPT0gcGRldi0+c3BpZ290c1swXSApID8gMCA6IDE7CisJCQkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IEZBSUxVUkUgMTEiKSk7CisJCQkJCQlpZiAoIEluaXRGYWlsb3ZlciAocGFkYXB0ZXIsIHBkZXYpICkKKwkJCQkJCQlPcERvbmUgKHBhZGFwdGVyLCBEZWNvZGVFcnJvciAocGFkYXB0ZXIsIHN0YXR1cykpOworCQkJCQkJZ290byBpcnFfcmV0dXJuOworCQkJCQkJfQorCQkJCQlwYWRhcHRlci0+cmVjb25QaGFzZSA9IFJFQ09OX1BIQVNFX0VORDsJCisJCQkJCWdvdG8gaXJxX3JldHVybjsKKwkJCQkJfQorCQkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9PSyA8PCAxNik7CisJCQkJZ290byBpcnFfcmV0dXJuOworCisJCQljYXNlIFJFQ09OX1BIQVNFX1JFQURZOgorCQkJCXN0YXR1cyA9IGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCk7CQkJCQkJLy8gcmVhZCB0aGUgZGV2aWNlIHN0YXR1cworCQkJCWlmICggc3RhdHVzICYgKElERV9TVEFUVVNfRVJST1IgfCBJREVfU1RBVFVTX1dSSVRFX0ZBVUxUKSApCisJCQkJCXsKKwkJCQkJZGVsX3RpbWVyICgmcGFkYXB0ZXItPnRpbWVyKTsKKwkJCQkJT3BEb25lIChwYWRhcHRlciwgRGVjb2RlRXJyb3IgKHBhZGFwdGVyLCBzdGF0dXMpKTsKKwkJCQkJZ290byBpcnFfcmV0dXJuOworCQkJCQl9CisJCQkJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgcGRldi0+c3BpZ290c1twZGV2LT5taXJyb3JSZWNvbl0pOworCQkJCWlmICggV2FpdERycSAocGFkYXB0ZXIpICkKKwkJCQkJeworCQkJCQlkZWxfdGltZXIgKCZwYWRhcHRlci0+dGltZXIpOworCQkJCQlwYWRhcHRlci0+c3Vydml2b3IgPSAoIHBkZXYtPnNwaWdvdCA9PSBwZGV2LT5zcGlnb3RzWzBdICkgPyAwIDogMTsKKwkJCQkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBGQUlMVVJFIDEyIikpOworCQkJCQlpZiAoIEluaXRGYWlsb3ZlciAocGFkYXB0ZXIsIHBkZXYpICkKKwkJCQkJCU9wRG9uZSAocGFkYXB0ZXIsIERlY29kZUVycm9yIChwYWRhcHRlciwgc3RhdHVzKSk7CisJCQkJCWdvdG8gaXJxX3JldHVybjsKKwkJCQkJfQorCQkJCVNlbGVjdFNwaWdvdCAocGFkYXB0ZXIsIHBkZXYtPnNwaWdvdCB8IFNFTF9DT1BZIHwgcGFkYXB0ZXItPmJpZ0QpOworCQkJCXBhZGFwdGVyLT5yZWNvblBoYXNlID0gUkVDT05fUEhBU0VfQ09QWTsKKwkJCQlwYWRhcHRlci0+ZXhwZWN0aW5nSVJRID0gVFJVRTsKKwkJCQlpZiAoIHBhZGFwdGVyLT50aW1pbmdQSU8gKQorCQkJCQl7CisJCQkJCWluc3cgKHBhZGFwdGVyLT5yZWdEYXRhLCBwYWRhcHRlci0+a0J1ZmZlciwgcGFkYXB0ZXItPnJlY29uU2l6ZSAqIChCWVRFU19QRVJfU0VDVE9SIC8gMikpOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCWlmICggKHBhZGFwdGVyLT50aW1pbmdNb2RlID4gMykgKQorCQkJCQkJeworCQkJCQkJaWYgKCBwYWRhcHRlci0+YmlnRCApCisJCQkJCQkJb3V0bCAoQklHRF9EQVRBX01PREUzLCBwYWRhcHRlci0+cmVnRG1hQWRkckxvYyk7CisJCQkJCQllbHNlCisJCQkJCQkJb3V0bCAoREFMRV9EQVRBX01PREUzLCBwYWRhcHRlci0+cmVnRG1hQWRkckxvYyk7CisJCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCW91dGwgKHBhZGFwdGVyLT50aW1pbmdBZGRyZXNzLCBwYWRhcHRlci0+cmVnRG1hQWRkckxvYyk7CisJCQkJCW91dGwgKHBhZGFwdGVyLT5rQnVmZmVyRG1hLCBwYWRhcHRlci0+cmVnRG1hQWRkclBjaSk7CisJCQkJCW91dGwgKHBhZGFwdGVyLT5yZWNvblNpemUgKiBCWVRFU19QRVJfU0VDVE9SLCBwYWRhcHRlci0+cmVnRG1hQ291bnQpOworCQkJCQlvdXRiX3AgKDgsIHBhZGFwdGVyLT5yZWdEbWFEZXNjKTsJCQkJCQkvLyByZWFkIG9wZXJhdGlvbgorCQkJCQlpZiAoIHBhZGFwdGVyLT5iaWdEICkKKwkJCQkJCW91dGJfcCAoOCwgcGFkYXB0ZXItPnJlZ0RtYU1vZGUpOwkJCQkJLy8gbm8gaW50ZXJydXB0CisJCQkJCWVsc2UKKwkJCQkJCW91dGJfcCAoMSwgcGFkYXB0ZXItPnJlZ0RtYU1vZGUpOwkJCQkJLy8gbm8gaW50ZXJydXB0CisJCQkJCW91dGJfcCAoMHgwMywgcGFkYXB0ZXItPnJlZ0RtYUNtZFN0YXQpOwkJCQkJLy8ga2ljayB0aGUgRE1BIGVuZ2luZSBpbiBnZWFyCisJCQkJCX0KKwkJCQlnb3RvIGlycV9yZXR1cm47CisKKwkJCWNhc2UgUkVDT05fUEhBU0VfQ09QWToKKwkJCQlwZGV2LT5EaXNrTWlycm9yW3BkZXYtPm1pcnJvclJlY29uXS5yZWNvbnN0cnVjdFBvaW50ICs9IHBhZGFwdGVyLT5yZWNvblNpemU7CisKKwkJCWNhc2UgUkVDT05fUEhBU0VfVVBEQVRFOgorCQkJCVNlbGVjdFNwaWdvdCAocGFkYXB0ZXIsIHBkZXYtPnNwaWdvdHNbcGRldi0+bWlycm9yUmVjb25dIHwgU0VMX0lSUV9PRkYpOworCQkJCXN0YXR1cyA9IGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCk7CQkJCQkJLy8gcmVhZCB0aGUgZGV2aWNlIHN0YXR1cworCQkJCWRlbF90aW1lciAoJnBhZGFwdGVyLT50aW1lcik7CisJCQkJaWYgKCBzdGF0dXMgJiAoSURFX1NUQVRVU19FUlJPUiB8IElERV9TVEFUVVNfV1JJVEVfRkFVTFQpICkKKwkJCQkJeworCQkJCQlwYWRhcHRlci0+c3Vydml2b3IgPSAoIHBkZXYtPnNwaWdvdCA9PSBwZGV2LT5zcGlnb3RzWzBdICkgPyAwIDogMTsKKwkJCQkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBGQUlMVVJFIDEzIikpOworCQkJCQlERUIgKHByaW50ayAoIlxuICBzdGF0dXMgcmVnaXN0ZXIgPSAlWCAgIGVycm9yID0gJVgiLCBzdGF0dXMsIGluYl9wIChwYWRhcHRlci0+cmVnRXJyb3IpKSk7CisJCQkJCWlmICggSW5pdEZhaWxvdmVyIChwYWRhcHRlciwgcGRldikgKQorCQkJCQkJT3BEb25lIChwYWRhcHRlciwgRGVjb2RlRXJyb3IgKHBhZGFwdGVyLCBzdGF0dXMpKTsKKwkJCQkJZ290byBpcnFfcmV0dXJuOworCQkJCQl9CisJCQkJT3BEb25lIChwYWRhcHRlciwgRElEX09LIDw8IDE2KTsKKwkJCQlnb3RvIGlycV9yZXR1cm47CisKKwkJCWNhc2UgUkVDT05fUEhBU0VfRU5EOgorCQkJCXN0YXR1cyA9IGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCk7CQkJCQkJLy8gcmVhZCB0aGUgZGV2aWNlIHN0YXR1cworCQkJCWRlbF90aW1lciAoJnBhZGFwdGVyLT50aW1lcik7CisJCQkJaWYgKCBzdGF0dXMgJiAoSURFX1NUQVRVU19FUlJPUiB8IElERV9TVEFUVVNfV1JJVEVfRkFVTFQpICkKKwkJCQkJeworCQkJCQlwYWRhcHRlci0+c3Vydml2b3IgPSAoIHBkZXYtPnNwaWdvdCA9PSBwZGV2LT5zcGlnb3RzWzBdICkgPyAwIDogMTsKKwkJCQkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBGQUlMVVJFIDE0IikpOworCQkJCQlpZiAoIEluaXRGYWlsb3ZlciAocGFkYXB0ZXIsIHBkZXYpICkKKwkJCQkJCU9wRG9uZSAocGFkYXB0ZXIsIERlY29kZUVycm9yIChwYWRhcHRlciwgc3RhdHVzKSk7CisJCQkJCWdvdG8gaXJxX3JldHVybjsKKwkJCQkJfQorCQkJCXBkZXYtPnJlY29uT24gPSAwOworCQkJCWlmICggcGFkYXB0ZXItPmJpZ0QgKQorCQkJCQl7CisJCQkJCWZvciAoIHogPSAwOyAgeiA8IHBhZGFwdGVyLT5udW1iZXJPZkRyaXZlczsgIHorKyApCisJCQkJCQl7CisJCQkJCQlpZiAoIHBhZGFwdGVyLT5kZXZpY2Vbel0uRGlza01pcnJvclswXS5zdGF0dXMgJiBVQ0JGX1NVUlZJVk9SICkKKwkJCQkJCQl7CisJCQkJCQkJQWxhcm0gKHBhZGFwdGVyLCBwYWRhcHRlci0+ZGV2aWNlW3pdLmRldmljZUlEWzBdIF4gMik7CisJCQkJCQkJTXV0ZUFsYXJtIChwYWRhcHRlcik7CisJCQkJCQkJfQorCQkJCQkJaWYgKCBwYWRhcHRlci0+ZGV2aWNlW3pdLkRpc2tNaXJyb3JbMV0uc3RhdHVzICYgVUNCRl9TVVJWSVZPUiApCisJCQkJCQkJeworCQkJCQkJCUFsYXJtIChwYWRhcHRlciwgcGFkYXB0ZXItPmRldmljZVt6XS5kZXZpY2VJRFsxXSBeIDIpOworCQkJCQkJCU11dGVBbGFybSAocGFkYXB0ZXIpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9PSyA8PCAxNik7CisJCQkJZ290byBpcnFfcmV0dXJuOworCisJCQlkZWZhdWx0OgorCQkJCWdvdG8gaXJxX3JldHVybjsKKwkJCX0KKwkJfQorCQkKKwlzd2l0Y2ggKCBwYWRhcHRlci0+Y21kICkJCQkJCQkJCQkJCQkvLyBkZWNpZGUgaG93IHRvIGhhbmRsZSB0aGUgaW50ZXJydXB0CisJCXsKKwkJY2FzZSBSRUFEX0NNRDoKKwkJCWlmICggcGFkYXB0ZXItPnNlY3RvckNvdW50ICkKKwkJCQl7CisJCQkJc3RhdHVzID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0Q21kKTsJCQkJCQkvLyByZWFkIHRoZSBkZXZpY2Ugc3RhdHVzCisJCQkJaWYgKCBzdGF0dXMgJiAoSURFX1NUQVRVU19FUlJPUiB8IElERV9TVEFUVVNfV1JJVEVfRkFVTFQpICkKKwkJCQkJeworCQkJCQlpZiAoIHBkZXYtPnJhaWQgKQorCQkJCQkJeworCQkJCQkJcGFkYXB0ZXItPnN1cnZpdm9yID0gKCBwZGV2LT5zcGlnb3QgPT0gcGRldi0+c3BpZ290c1swXSApID8gMSA6IDA7CisJCQkJCQlkZWxfdGltZXIgKCZwYWRhcHRlci0+dGltZXIpOworCQkJCQkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBGQUlMVVJFIDE1IikpOworCQkJCQkJaWYgKCAhSW5pdEZhaWxvdmVyIChwYWRhcHRlciwgcGRldikgKQorCQkJCQkJCWdvdG8gaXJxX3JldHVybjsKKwkJCQkJCX0KKwkJCQkJYnJlYWs7CQorCQkJCQl9CisJCQkJaWYgKCBwYWRhcHRlci0+dGltaW5nUElPICkKKwkJCQkJeworCQkJCQlpbnN3IChwYWRhcHRlci0+cmVnRGF0YSwgcGFkYXB0ZXItPmtCdWZmZXIsIHBhZGFwdGVyLT5yZWFkQ291bnQgLyAyKTsKKwkJCQkJcGFkYXB0ZXItPnNlY3RvckNvdW50IC09IHBhZGFwdGVyLT5yZWFkQ291bnQgLyBCWVRFU19QRVJfU0VDVE9SOworCQkJCQlXYWxrU2NhdEdhdGggKHBhZGFwdGVyLCBUUlVFLCBwYWRhcHRlci0+cmVhZENvdW50KTsKKwkJCQkJaWYgKCAhcGFkYXB0ZXItPnNlY3RvckNvdW50ICkKKwkJCQkJCXsKKwkJCQkJCXN0YXR1cyA9IDA7CisJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlpZiAoIHBhZGFwdGVyLT5yZWFkQ291bnQgKQorCQkJCQkJV2Fsa1NjYXRHYXRoIChwYWRhcHRlciwgVFJVRSwgcGFkYXB0ZXItPnJlYWRDb3VudCk7CisJCQkJCUJ1c01hc3RlciAocGFkYXB0ZXIsIDEsIDEpOworCQkJCQl9CisJCQkJcGFkYXB0ZXItPmV4cGVjdGluZ0lSUSA9IFRSVUU7CisJCQkJZ290byBpcnFfcmV0dXJuOworCQkJCX0KKwkJCWlmICggcGFkYXB0ZXItPnJlYWRDb3VudCAmJiAhcGFkYXB0ZXItPnRpbWluZ1BJTyApCisJCQkJV2Fsa1NjYXRHYXRoIChwYWRhcHRlciwgVFJVRSwgcGFkYXB0ZXItPnJlYWRDb3VudCk7CisJCQlzdGF0dXMgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBXUklURV9DTUQ6CisJCQlpZiAoIHBkZXYtPnJhaWQgKQorCQkJCXsKKwkJCQlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3RzWzBdIHwgU0VMX0lSUV9PRkYpOwkJCQkKKwkJCQlzdGF0dXMgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRDbWQpOwkJCQkJCQkJLy8gcmVhZCB0aGUgZGV2aWNlIHN0YXR1cworCQkJCVNlbGVjdFNwaWdvdCAocGFkYXB0ZXIsIHBkZXYtPnNwaWdvdHNbMV0gfCBTRUxfSVJRX09GRik7CQkJCQorCQkJCXN0YXR1czEgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRDbWQpOwkJCQkJCQkJLy8gcmVhZCB0aGUgZGV2aWNlIHN0YXR1cworCQkJCX0KKwkJCWVsc2UKKwkJCQlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3QgfCBTRUxfSVJRX09GRik7CQkJCQorCQkJCXN0YXR1cyA9IGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCk7CQkJCQkJCQkvLyByZWFkIHRoZSBkZXZpY2Ugc3RhdHVzCisJCQkJc3RhdHVzMSA9IDA7CisJCQorCQkJaWYgKCBzdGF0dXMgJiAoSURFX1NUQVRVU19FUlJPUiB8IElERV9TVEFUVVNfV1JJVEVfRkFVTFQpICkKKwkJCQl7CQorCQkJCWlmICggcGRldi0+cmFpZCAmJiAhKHN0YXR1czEgJiAoSURFX1NUQVRVU19FUlJPUiB8IElERV9TVEFUVVNfV1JJVEVfRkFVTFQpKSApCisJCQkJCXsKKwkJCQkJcGFkYXB0ZXItPnN1cnZpdm9yID0gMTsKKwkJCQkJZGVsX3RpbWVyICgmcGFkYXB0ZXItPnRpbWVyKTsKKwkJCQkJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgcGRldi0+c3BpZ290IHwgU0VMX0lSUV9PRkYpOworCQkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IEZBSUxVUkUgMTYgIHN0YXR1cyA9ICVYICBlcnJvciA9ICVYIiwgc3RhdHVzLCBpbmJfcCAocGFkYXB0ZXItPnJlZ0Vycm9yKSkpOworCQkJCQlpZiAoICFJbml0RmFpbG92ZXIgKHBhZGFwdGVyLCBwZGV2KSApCisJCQkJCQlnb3RvIGlycV9yZXR1cm47CisJCQkJCX0KKwkJCQlicmVhazsKKwkJCQl9CisJCQlpZiAoIHBkZXYtPnJhaWQgKQorCQkJCXsKKwkJCQlpZiAoIHN0YXR1czEgJiAoSURFX1NUQVRVU19FUlJPUiB8IElERV9TVEFUVVNfV1JJVEVfRkFVTFQpICkKKwkJCQkJewkKKwkJCQkJcGFkYXB0ZXItPnN1cnZpdm9yID0gMDsKKwkJCQkJZGVsX3RpbWVyICgmcGFkYXB0ZXItPnRpbWVyKTsKKwkJCQkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBGQUlMVVJFIDE3ICBzdGF0dXMgPSAlWCAgZXJyb3IgPSAlWCIsIHN0YXR1czEsIGluYl9wIChwYWRhcHRlci0+cmVnRXJyb3IpKSk7CisJCQkJCWlmICggIUluaXRGYWlsb3ZlciAocGFkYXB0ZXIsIHBkZXYpICkKKwkJCQkJCWdvdG8gaXJxX3JldHVybjsKKwkJCQkJc3RhdHVzID0gc3RhdHVzMTsKKwkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQlpZiAoIHBhZGFwdGVyLT5zZWN0b3JDb3VudCApCisJCQkJCXsKKwkJCQkJc3RhdHVzID0gV3JpdGVEYXRhQm90aCAocGFkYXB0ZXIsIHBkZXYpOworCQkJCQlpZiAoIHN0YXR1cyApCisJCQkJCQl7CisJCQkJCQlwYWRhcHRlci0+c3Vydml2b3IgPSBzdGF0dXMgPj4gMTsKKwkJCQkJCWRlbF90aW1lciAoJnBhZGFwdGVyLT50aW1lcik7CisJCQkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IEZBSUxVUkUgMTgiKSk7CisJCQkJCQlpZiAoICFJbml0RmFpbG92ZXIgKHBhZGFwdGVyLCBwZGV2KSApCisJCQkJCQkJZ290byBpcnFfcmV0dXJuOworCQkJCQkJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgcGRldi0+c3BpZ290c1tzdGF0dXNdIHwgU0VMX0lSUV9PRkYpOwkJCQkKKwkJCQkJCXN0YXR1cyA9IGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCk7CQkJCQkJCQkvLyByZWFkIHRoZSBkZXZpY2Ugc3RhdHVzCisJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJcGFkYXB0ZXItPmV4cGVjdGluZ0lSUSA9IFRSVUU7CisJCQkJCWdvdG8gaXJxX3JldHVybjsKKwkJCQkJfQorCQkJCXN0YXR1cyA9IDA7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJaWYgKCBwYWRhcHRlci0+c2VjdG9yQ291bnQgKQkKKwkJCQl7CQorCQkJCVNlbGVjdFNwaWdvdCAocGFkYXB0ZXIsIHBkZXYtPnNwaWdvdCB8IHBhZGFwdGVyLT5iaWdEKTsKKwkJCQlzdGF0dXMgPSBXcml0ZURhdGEgKHBhZGFwdGVyKTsKKwkJCQlpZiAoIHN0YXR1cyApCisJCQkJCWJyZWFrOworCQkJCXBhZGFwdGVyLT5leHBlY3RpbmdJUlEgPSBUUlVFOworCQkJCWdvdG8gaXJxX3JldHVybjsKKwkJCQl9CisJCQlzdGF0dXMgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBJREVfQ09NTUFORF9JREVOVElGWToKKwkJCXsKKwkJCVBJTlFVSVJZREFUQQlwaW5xdWlyeURhdGEgID0gU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCQkJUElERU5USUZZX0RBVEEJcGlkID0gKFBJREVOVElGWV9EQVRBKXBhZGFwdGVyLT5rQnVmZmVyOworCisJCQlzdGF0dXMgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRDbWQpOworCQkJaWYgKCBzdGF0dXMgJiBJREVfU1RBVFVTX0RSUSApCisJCQkJeworCQkJCWluc3cgKHBhZGFwdGVyLT5yZWdEYXRhLCBwaWQsIHNpemVvZiAoSURFTlRJRllfREFUQSkgPj4gMSk7CisKKwkJCQltZW1zZXQgKHBpbnF1aXJ5RGF0YSwgMCwgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbik7CQkvLyBaZXJvIElOUVVJUlkgZGF0YSBzdHJ1Y3R1cmUuCisJCQkJcGlucXVpcnlEYXRhLT5EZXZpY2VUeXBlID0gMDsKKwkJCQlwaW5xdWlyeURhdGEtPlZlcnNpb25zID0gMjsKKwkJCQlwaW5xdWlyeURhdGEtPkFkZGl0aW9uYWxMZW5ndGggPSAzNSAtIDQ7CisKKwkJCQkvLyBGaWxsIGluIHZlbmRvciBpZGVudGlmaWNhdGlvbiBmaWVsZHMuCisJCQkJZm9yICggeiA9IDA7ICB6IDwgMjA7ICB6ICs9IDIgKQorCQkJCQl7CisJCQkJCXBpbnF1aXJ5RGF0YS0+VmVuZG9ySWRbel0JICA9ICgoVUNIQVIgKilwaWQtPk1vZGVsTnVtYmVyKVt6ICsgMV07CisJCQkJCXBpbnF1aXJ5RGF0YS0+VmVuZG9ySWRbeiArIDFdID0gKChVQ0hBUiAqKXBpZC0+TW9kZWxOdW1iZXIpW3pdOworCQkJCQl9CisKKwkJCQkvLyBJbml0aWFsaXplIHVudXNlZCBwb3J0aW9uIG9mIHByb2R1Y3QgaWQuCisJCQkJZm9yICggeiA9IDA7ICB6IDwgNDsgIHorKyApCisJCQkJCXBpbnF1aXJ5RGF0YS0+UHJvZHVjdElkWzEyICsgel0gPSAnICc7CisKKwkJCQkvLyBNb3ZlIGZpcm13YXJlIHJldmlzaW9uIGZyb20gSURFTlRJRlkgZGF0YSB0bworCQkJCS8vIHByb2R1Y3QgcmV2aXNpb24gaW4gSU5RVUlSWSBkYXRhLgorCQkJCWZvciAoIHogPSAwOyAgeiA8IDQ7ICB6ICs9IDIgKQorCQkJCQl7CisJCQkJCXBpbnF1aXJ5RGF0YS0+UHJvZHVjdFJldmlzaW9uTGV2ZWxbel0JID0gKChVQ0hBUiAqKXBpZC0+RmlybXdhcmVSZXZpc2lvbilbeiArIDFdOworCQkJCQlwaW5xdWlyeURhdGEtPlByb2R1Y3RSZXZpc2lvbkxldmVsW3ogKyAxXSA9ICgoVUNIQVIgKilwaWQtPkZpcm13YXJlUmV2aXNpb24pW3pdOworCQkJCQl9CisJCQkJaWYgKCBwZGV2ID09IHBhZGFwdGVyLT5kZXZpY2UgKQorCQkJCQkqKChVU0hPUlQgKikoJnBpbnF1aXJ5RGF0YS0+VmVuZG9yU3BlY2lmaWMpKSA9IERFVklDRV9EQUxFXzE7CisJCQkJCisJCQkJc3RhdHVzID0gMDsKKwkJCQl9CisJCQlicmVhazsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJc3RhdHVzID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwlkZWxfdGltZXIgKCZwYWRhcHRlci0+dGltZXIpOworCWlmICggc3RhdHVzICkKKwkJeworCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGkgSW50ZXJydXB0IGhhbmRsZXIgcmV0dXJuIGVycm9yIikpOworCQl6bCA9IERlY29kZUVycm9yIChwYWRhcHRlciwgc3RhdHVzKTsKKwkJfQorCWVsc2UKKwkJemwgPSBESURfT0sgPDwgMTY7CisKKwlPcERvbmUgKHBhZGFwdGVyLCB6bCk7CitpcnFfcmV0dXJuOgorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworb3V0OgorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJUGNpMjIyMGlfUXVldWVDb21tYW5kCisgKgorICoJRGVzY3JpcHRpb246CVByb2Nlc3MgYSBxdWV1ZWQgY29tbWFuZCBmcm9tIHRoZSBTQ1NJIG1hbmFnZXIuCisgKgorICoJUGFyYW1ldGVyczoJCVNDcG50IC0gUG9pbnRlciB0byBTQ1NJIGNvbW1hbmQgc3RydWN0dXJlLgorICoJCQkJCWRvbmUgIC0gUG9pbnRlciB0byBkb25lIGZ1bmN0aW9uIHRvIGNhbGwuCisgKgorICoJUmV0dXJuczoJCVN0YXR1cyBjb2RlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBjaTIyMjBpX1F1ZXVlQ29tbWFuZCAoU2NzaV9DbW5kICpTQ3BudCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKKwl7CisJVUNIQVIJCSAgICpjZGIgPSAoVUNIQVIgKilTQ3BudC0+Y21uZDsJCQkJCS8vIFBvaW50ZXIgdG8gU0NTSSBDREIKKwlQQURBUFRFUjIyMjBJCXBhZGFwdGVyID0gSE9TVERBVEEoU0NwbnQtPmRldmljZS0+aG9zdCk7CQkJLy8gUG9pbnRlciB0byBhZGFwdGVyIGNvbnRyb2wgc3RydWN0dXJlCisJUE9VUl9ERVZJQ0UJCXBkZXYJID0gJnBhZGFwdGVyLT5kZXZpY2VbU0NwbnQtPmRldmljZS0+aWRdOy8vIFBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uCisJVUNIQVIJCQlyYzsJCQkJCQkJCQkJCS8vIGNvbW1hbmQgcmV0dXJuIGNvZGUKKwlpbnQJCQkJejsgCisJUERFVklDRV9SQUlEMQlwZHI7CisKKwlTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKKwlwYWRhcHRlci0+U0NwbnQgPSBTQ3BudDsgIAkJCQkJCQkJCS8vIFNhdmUgdGhpcyBjb21tYW5kIGRhdGEKKwlwYWRhcHRlci0+cmVhZENvdW50ID0gMDsKKworCWlmICggU0NwbnQtPnVzZV9zZyApCisJCXsKKwkJcGFkYXB0ZXItPmN1cnJlbnRTZ0J1ZmZlciA9ICgoc3RydWN0IHNjYXR0ZXJsaXN0ICopU0NwbnQtPnJlcXVlc3RfYnVmZmVyKVswXS5hZGRyZXNzOworCQlwYWRhcHRlci0+Y3VycmVudFNnQ291bnQgPSAoKHN0cnVjdCBzY2F0dGVybGlzdCAqKVNDcG50LT5yZXF1ZXN0X2J1ZmZlcilbMF0ubGVuZ3RoOworCQl9CisJZWxzZQorCQl7CisJCXBhZGFwdGVyLT5jdXJyZW50U2dCdWZmZXIgPSBTQ3BudC0+cmVxdWVzdF9idWZmZXI7CisJCXBhZGFwdGVyLT5jdXJyZW50U2dDb3VudCA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW47CisJCX0KKwlwYWRhcHRlci0+bmV4dFNnID0gMTsKKworCWlmICggIWRvbmUgKQorCQl7CisJCXByaW50aygicGNpMjIyMGlfcXVldWVjb21tYW5kOiAlMDJYOiBkb25lIGNhbid0IGJlIE5VTExcbiIsICpjZGIpOworCQlyZXR1cm4gMDsKKwkJfQorCQorCWlmICggcGFkYXB0ZXItPmF0YXBpICkKKwkJeworCQlVQ0hBUgkJCXpsbywgemhpOworCisJCURFQiAocHJpbnRrICgiXG5QQ0kyMjQySTogSUQgJWQsIExVTiAlZCBvcGNvZGUgJVggIiwgU0NwbnQtPmRldmljZS0+aWQsIFNDcG50LT5kZXZpY2UtPmx1biwgKmNkYikpOworCQlwYWRhcHRlci0+cGRldiA9IHBkZXY7CisJCWlmICggIXBkZXYtPmJ5dGU2IHx8IFNDcG50LT5kZXZpY2UtPmx1biApCisJCQl7CisJCQlPcERvbmUgKHBhZGFwdGVyLCBESURfQkFEX1RBUkdFVCA8PCAxNik7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkKKwkJcGFkYXB0ZXItPmF0YXBpU3BlY2lhbCA9IEZBTFNFOworCQlwYWRhcHRlci0+cmVxU2Vuc2UgPSBGQUxTRTsKKwkJbWVtc2V0IChwYWRhcHRlci0+YXRhcGlDZGIsIDAsIDE2KTsKKwkJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgcGRldi0+c3BpZ290KTsJCQkJCQkJCQkvLyBzZWxlY3QgdGhlIHNwaWdvdAorCQlBdGFwaURldmljZSAocGFkYXB0ZXIsIHBkZXYtPmJ5dGU2KTsJCQkJCQkJCQkvLyBzZWxlY3QgdGhlIGRyaXZlCisJCWlmICggQXRhcGlXYWl0UmVhZHkgKHBhZGFwdGVyLCAxMDApICkKKwkJCXsKKwkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9OT19DT05ORUNUIDw8IDE2KTsKKwkJCXJldHVybiAwOworCQkJfQorCisJCXN3aXRjaCAoIGNkYlswXSApIAorCQkJeworCQkJY2FzZSBTQ1NJT1BfTU9ERV9TRU5TRToKKwkJCWNhc2UgU0NTSU9QX01PREVfU0VMRUNUOgorCQkJCVNjc2kyQXRhcGkgKHBhZGFwdGVyLCBTQ3BudCk7CisJCQkJeiA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gKyA0OworCQkJCWJyZWFrOworCQkJY2FzZSBTQ1NJT1BfUkVBRDY6CisJCQljYXNlIFNDU0lPUF9XUklURTY6CisJCQkJU2NzaTJBdGFwaSAocGFkYXB0ZXIsIFNDcG50KTsKKwkJCQl6ID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJbWVtY3B5IChwYWRhcHRlci0+YXRhcGlDZGIsIGNkYiwgU0NwbnQtPmNtZF9sZW4pOworCQkJCXogPSBTQ3BudC0+cmVxdWVzdF9idWZmbGVuOworCQkJCWJyZWFrOworCQkJfQorCQlpZiAoIHogPiBBVEFQSV9UUkFOU0ZFUiApCisJCQl6ID0gQVRBUElfVFJBTlNGRVI7CisJICAgIHpsbyA9IChVQ0hBUikoeiAmIDB4RkYpOworCSAgICB6aGkgPSAoVUNIQVIpKHogPj4gOCk7CisKKwkgCUF0YXBpQ291bnRMbyAocGFkYXB0ZXIsIHpsbyk7CQkJCQkJCisJICAgCUF0YXBpQ291bnRIaSAocGFkYXB0ZXIsIHpoaSk7CQkJCQkJCisJICAgCW91dGJfcCAoMCwgcGFkYXB0ZXItPnJlZ0Vycm9yKTsJCQkJCQkKKwkJV3JpdGVDb21tYW5kIChwYWRhcHRlciwgSURFX0NPTU1BTkRfQVRBUElfUEFDS0VUKTsKKwkJaWYgKCBwZGV2LT5jbWREcnFJbnQgKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKCBBdGFwaVdhaXREcnEgKHBhZGFwdGVyLCA1MDApICkKKwkJCXsKKwkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9FUlJPUiA8PCAxNik7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJQXRhcGlTZW5kQ2RiIChwYWRhcHRlciwgcGRldiwgcGFkYXB0ZXItPmF0YXBpQ2RiKTsJCisJCXJldHVybiAwOworCQl9CisJCisJaWYgKCBwYWRhcHRlci0+cmVjb25QaGFzZSApCisJCXJldHVybiAwOworCWlmICggcGFkYXB0ZXItPnJlY29uVGltZXIuZGF0YSApCisJCXsKKwkJZGVsX3RpbWVyICgmcGFkYXB0ZXItPnJlY29uVGltZXIpOworCQlwYWRhcHRlci0+cmVjb25UaW1lci5kYXRhID0gMDsKKwkJfQorCQkKKwlpZiAoIChTQ3BudC0+ZGV2aWNlLT5pZCA+PSBwYWRhcHRlci0+bnVtYmVyT2ZEcml2ZXMpIHx8IFNDcG50LT5kZXZpY2UtPmx1biApCisJCXsKKwkJT3BEb25lIChwYWRhcHRlciwgRElEX0JBRF9UQVJHRVQgPDwgMTYpOworCQlyZXR1cm4gMDsKKwkJfQorCQorCXN3aXRjaCAoICpjZGIgKQorCQl7CisJCWNhc2UgU0NTSU9QX0lOUVVJUlk6ICAgCQkJCQkvLyBpbnF1aXJ5IENEQgorCQkJeworCQkJaWYgKCBjZGJbMl0gPT0gU0NfTVlfUkFJRCApCisJCQkJeworCQkJCXN3aXRjaCAoIGNkYlszXSApIAorCQkJCQl7CisJCQkJCWNhc2UgTVlfU0NTSV9SRUJVSUxEOgorCQkJCQkJZm9yICggeiA9IDA7ICB6IDwgcGFkYXB0ZXItPm51bWJlck9mRHJpdmVzOyAgeisrICkKKwkJCQkJCQl7CisJCQkJCQkJcGRldiA9ICZwYWRhcHRlci0+ZGV2aWNlW3pdOworCQkJCQkJCWlmICggKChwZGV2LT5EaXNrTWlycm9yWzBdLnN0YXR1cyAmIFVDQkZfU1VSVklWT1IpICYmIChwZGV2LT5EaXNrTWlycm9yWzFdLnN0YXR1cyAmIFVDQkZfTUlSUk9SRUQpKSB8fAorCQkJCQkJCQkgKChwZGV2LT5EaXNrTWlycm9yWzFdLnN0YXR1cyAmIFVDQkZfU1VSVklWT1IpICYmIChwZGV2LT5EaXNrTWlycm9yWzBdLnN0YXR1cyAmIFVDQkZfTUlSUk9SRUQpKSApCisJCQkJCQkJCXsKKwkJCQkJCQkJcGFkYXB0ZXItPnJlY29uT24gPSBwZGV2LT5yZWNvbk9uID0gcGRldi0+cmVjb25Jc1N0YXJ0aW5nID0gVFJVRTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9PSyA8PCAxNik7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBNWV9TQ1NJX0FMQVJNTVVURToKKwkJCQkJCU11dGVBbGFybSAocGFkYXB0ZXIpOworCQkJCQkJT3BEb25lIChwYWRhcHRlciwgRElEX09LIDw8IDE2KTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIE1ZX1NDU0lfREVNT0ZBSUw6CisJCQkJCQlwYWRhcHRlci0+ZGVtb0ZhaWwgPSBUUlVFOwkJCQkKKwkJCQkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9PSyA8PCAxNik7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXogPSBjZGJbNV07CQkJCS8vIGdldCBpbmRleAorCQkJCQkJcGRyID0gKFBERVZJQ0VfUkFJRDEpU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCQkJCQkJaWYgKCBwYWRhcHRlci0+cmFpZERhdGFbel0gKQorCQkJCQkJCXsKKwkJCQkJCQltZW1jcHkgKCZwZHItPkRpc2tSYWlkMSwgcGFkYXB0ZXItPnJhaWREYXRhW3pdLCBzaXplb2YgKERJU0tfTUlSUk9SKSk7CisJCQkJCQkJaWYgKCBwYWRhcHRlci0+cmFpZERhdGFbel0tPnJlY29uc3RydWN0UG9pbnQgPiBwYWRhcHRlci0+cmFpZERhdGFbeiBeIDJdLT5yZWNvbnN0cnVjdFBvaW50ICkKKwkJCQkJCQkJcGRyLT5Ub3RhbFNlY3RvcnMgPSBwYWRhcHRlci0+cmFpZERhdGFbel0tPnJlY29uc3RydWN0UG9pbnQ7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlwZHItPlRvdGFsU2VjdG9ycyA9IHBhZGFwdGVyLT5yYWlkRGF0YVt6IF4gMl0tPnJlY29uc3RydWN0UG9pbnQ7CisJCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCW1lbXNldCAocGRyLCAwLCBzaXplb2YgKERFVklDRV9SQUlEMSkpOworCQkJCQkJT3BEb25lIChwYWRhcHRlciwgRElEX09LIDw8IDE2KTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CQorCQkJCXJldHVybiAwOworCQkJCX0KKwkJCXBhZGFwdGVyLT5jbWQgPSBJREVfQ09NTUFORF9JREVOVElGWTsKKwkJCWJyZWFrOworCQkJfQorCisJCWNhc2UgU0NTSU9QX1RFU1RfVU5JVF9SRUFEWToJCQkvLyB0ZXN0IHVuaXQgcmVhZHkgQ0RCCisJCQlPcERvbmUgKHBhZGFwdGVyLCBESURfT0sgPDwgMTYpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgU0NTSU9QX1JFQURfQ0FQQUNJVFk6CQkJICAJLy8gcmVhZCBjYXBjdGl5IENEQgorCQkJeworCQkJUFJFQURfQ0FQQUNJVFlfREFUQQlwZGF0YSA9IChQUkVBRF9DQVBBQ0lUWV9EQVRBKVNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKworCQkJcGRhdGEtPmJsa3NpeiA9IDB4MjAwMDA7CisJCQlYQU5ZMlNDU0kgKChVQ0hBUiAqKSZwZGF0YS0+YmxrcywgcGRldi0+YmxvY2tzKTsKKwkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9PSyA8PCAxNik7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJY2FzZSBTQ1NJT1BfVkVSSUZZOgkJCQkJCS8vIHZlcmlmeSBDREIKKwkJCXBhZGFwdGVyLT5zdGFydFNlY3RvciA9IFhTQ1NJMkxPTkcgKCZjZGJbMl0pOworCQkJcGFkYXB0ZXItPnNlY3RvckNvdW50ID0gKFVDSEFSKSgoVVNIT1JUKWNkYls4XSB8ICgoVVNIT1JUKWNkYls3XSA8PCA4KSk7CisJCQlwYWRhcHRlci0+Y21kID0gSURFX0NPTU1BTkRfVkVSSUZZOworCQkJYnJlYWs7CisJCWNhc2UgU0NTSU9QX1JFQUQ6CQkJCQkJLy8gcmVhZDEwIENEQgorCQkJcGFkYXB0ZXItPnN0YXJ0U2VjdG9yID0gWFNDU0kyTE9ORyAoJmNkYlsyXSk7CisJCQlwYWRhcHRlci0+c2VjdG9yQ291bnQgPSAoVVNIT1JUKWNkYls4XSB8ICgoVVNIT1JUKWNkYls3XSA8PCA4KTsKKwkJCXBhZGFwdGVyLT5jbWQgPSBSRUFEX0NNRDsKKwkJCWJyZWFrOworCQljYXNlIFNDU0lPUF9SRUFENjoJCQkJCQkvLyByZWFkNiAgQ0RCCisJCQlwYWRhcHRlci0+c3RhcnRTZWN0b3IgPSBTQ1NJMkxPTkcgKCZjZGJbMV0pOworCQkJcGFkYXB0ZXItPnNlY3RvckNvdW50ID0gY2RiWzRdOworCQkJcGFkYXB0ZXItPmNtZCA9IFJFQURfQ01EOworCQkJYnJlYWs7CisJCWNhc2UgU0NTSU9QX1dSSVRFOgkJCQkJCS8vIHdyaXRlMTAgQ0RCCisJCQlwYWRhcHRlci0+c3RhcnRTZWN0b3IgPSBYU0NTSTJMT05HICgmY2RiWzJdKTsKKwkJCXBhZGFwdGVyLT5zZWN0b3JDb3VudCA9IChVU0hPUlQpY2RiWzhdIHwgKChVU0hPUlQpY2RiWzddIDw8IDgpOworCQkJcGFkYXB0ZXItPmNtZCA9IFdSSVRFX0NNRDsKKwkJCWJyZWFrOworCQljYXNlIFNDU0lPUF9XUklURTY6CQkJCQkJLy8gd3JpdGU2ICBDREIKKwkJCXBhZGFwdGVyLT5zdGFydFNlY3RvciA9IFNDU0kyTE9ORyAoJmNkYlsxXSk7CisJCQlwYWRhcHRlci0+c2VjdG9yQ291bnQgPSBjZGJbNF07CisJCQlwYWRhcHRlci0+Y21kID0gV1JJVEVfQ01EOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlERUIgKHByaW50ayAoInBjaTIyMjBpX3F1ZXVlY29tbWFuZDogVW5zdXBwb3J0ZWQgY29tbWFuZCAlMDJYXG4iLCAqY2RiKSk7CisJCQlPcERvbmUgKHBhZGFwdGVyLCBESURfRVJST1IgPDwgMTYpOworCQkJcmV0dXJuIDA7CisJCX0KKworCWlmICggcGFkYXB0ZXItPnJlY29uUGhhc2UgKQorCQlyZXR1cm4gMDsKKwkKKwlwYWRhcHRlci0+cGRldiA9IHBkZXY7CisKKwl3aGlsZSAoIHBhZGFwdGVyLT5kZW1vRmFpbCApCisJCXsKKwkJcGRldiA9IHBhZGFwdGVyLT5wZGV2ID0gJnBhZGFwdGVyLT5kZXZpY2VbMF07CisJCXBhZGFwdGVyLT5kZW1vRmFpbCA9IEZBTFNFOworCQlpZiAoICFwZGV2LT5yYWlkIHx8IAorCQkJIChwZGV2LT5EaXNrTWlycm9yWzBdLnN0YXR1cyAmIFVDQkZfU1VSVklWT1IpIHx8IAorCQkJIChwZGV2LT5EaXNrTWlycm9yWzFdLnN0YXR1cyAmIFVDQkZfU1VSVklWT1IpICkKKwkJCXsKKwkJCWJyZWFrOworCQkJfQorCQlpZiAoIHBkZXYtPkRpc2tNaXJyb3JbMF0uc3RhdHVzICYgVUNCRl9SRUJVSUxEICkKKwkJCXBhZGFwdGVyLT5zdXJ2aXZvciA9IDE7CisJCWVsc2UKKwkJCXBhZGFwdGVyLT5zdXJ2aXZvciA9IDA7CisJCQkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBGQUlMVVJFIDE5IikpOworCQlpZiAoIEluaXRGYWlsb3ZlciAocGFkYXB0ZXIsIHBkZXYpICkKKwkJCWJyZWFrOworCQlyZXR1cm4gMDsKKwkJfQorCisJU3RhcnRUaW1lciAocGFkYXB0ZXIpOworCWlmICggcGRldi0+cmFpZCAmJiAocGFkYXB0ZXItPmNtZCA9PSBXUklURV9DTUQpICkKKwkJeworCQlyYyA9IElkZUNtZEJvdGggKHBhZGFwdGVyLCBwZGV2KTsKKwkJaWYgKCAhcmMgKQorCQkJcmMgPSBXcml0ZURhdGFCb3RoIChwYWRhcHRlciwgcGRldik7CisJCWlmICggcmMgKQorCQkJeworCQkJZGVsX3RpbWVyICgmcGFkYXB0ZXItPnRpbWVyKTsKKwkJCXBhZGFwdGVyLT5leHBlY3RpbmdJUlEgPSAwOworCQkJcGFkYXB0ZXItPnN1cnZpdm9yID0gcmMgPj4gMTsKKwkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IEZBSUxVUkUgMjAiKSk7CisJCQlpZiAoIEluaXRGYWlsb3ZlciAocGFkYXB0ZXIsIHBkZXYpICkKKwkJCQl7CisJCQkJT3BEb25lIChwYWRhcHRlciwgRElEX0VSUk9SIDw8IDE2KTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJcmMgPSBJZGVDbWQgKHBhZGFwdGVyLCBwZGV2KTsKKwkJaWYgKCAocGFkYXB0ZXItPmNtZCA9PSBXUklURV9DTUQpICYmICFyYyApCisJCQlyYyA9IFdyaXRlRGF0YSAocGFkYXB0ZXIpOworCQlpZiAoIHJjICkKKwkJCXsKKwkJCWRlbF90aW1lciAoJnBhZGFwdGVyLT50aW1lcik7CisJCQlwYWRhcHRlci0+ZXhwZWN0aW5nSVJRID0gMDsKKwkJCWlmICggcGRldi0+cmFpZCApCisJCQkJeworCQkJCXBhZGFwdGVyLT5zdXJ2aXZvciA9IChwZGV2LT5zcGlnb3QgXiAzKSA+PiAxOworCQkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogRkFJTFVSRSAyMSIpKTsKKwkJCQlpZiAoICFJbml0RmFpbG92ZXIgKHBhZGFwdGVyLCBwZGV2KSApCisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9FUlJPUiA8PCAxNik7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCXJldHVybiAwOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOgkJCVJlYWRGbGFzaAorICoKKyAqCURlc2NyaXB0aW9uOglSZWFkIGluZm9ybWF0aW9uIGZyb20gY29udHJvbGxlciBGbGFzaCBtZW1vcnkuCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciB0byBob3N0IGludGVyZmFjZSBkYXRhIHN0cnVjdHVyZS4KKyAqCQkJCQlwZGF0YQkgLSBQb2ludGVyIHRvIGRhdGEgc3RydWN0dXJlcy4KKyAqCQkJCQliYXNlCSAtIGJhc2UgYWRkcmVzcyBpbiBGbGFzaC4KKyAqCQkJCQlsZW5ndGgJIC0gbGVuZ2h0IG9mIGRhdGEgc3BhY2UgaW4gYnl0ZXMuCisgKgorICoJUmV0dXJuczoJCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVk9JRCBSZWFkRmxhc2ggKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIsIFZPSUQgKnBkYXRhLCBVTE9ORyBiYXNlLCBVTE9ORyBsZW5ndGgpCisJeworCVVMT05HCSBvbGRyZW1hcDsKKwlVQ0hBUgkgb2xkZGVzYzsKKwlVTE9ORwkgejsKKwlVQ0hBUgkqcGQgPSAoVUNIQVIgKilwZGF0YTsKKworCW9sZHJlbWFwID0gaW5sIChwYWRhcHRlci0+cmVnUmVtYXApOwkJCQkJCQkvLyBzYXZlIHZhbHVlcyB0byByZXN0b3JlIGxhdGVyCisJb2xkZGVzYyAgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ0Rlc2MpOworCisJb3V0bCAoYmFzZSB8IDEsIHBhZGFwdGVyLT5yZWdSZW1hcCk7CQkJCQkJCS8vIHJlbWFwIHRvIEZsYXNoIHNwYWNlIGFzIHNwZWNpZmllZAorCW91dGJfcCAoMHg0MCwgcGFkYXB0ZXItPnJlZ0Rlc2MpOwkJCQkJCQkJLy8gZGVzY3JpYmUgcmVtYXAgcmVnaW9uIGFzIDggYml0CisJZm9yICggeiA9IDA7ICB6IDwgbGVuZ3RoOyAgeisrKQkJCQkJCQkJCS8vIGdldCAibGVuZ3RoIiBkYXRhIGNvdW50CisJCSpwZCsrID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdCYXNlICsgeik7CQkJCQkJLy8gcmVhZCBpbiB0aGUgZGF0YQorCisJb3V0bCAob2xkcmVtYXAsIHBhZGFwdGVyLT5yZWdSZW1hcCk7CQkJCQkJCS8vIHJlc3RvcmUgcmVtYXAgcmVnaXN0ZXIgdmFsdWVzCisJb3V0Yl9wIChvbGRkZXNjLCBwYWRhcHRlci0+cmVnRGVzYyk7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CQkJR2V0UmVncworICoKKyAqCURlc2NyaXB0aW9uOglJbml0aWFsaXplIHRoZSByZWdlc3RlciBpbmZvcm1hdGlvbi4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcHNob3N0CQkgIC0gUG9pbnRlciB0byBTQ1NJIGhvc3QgZGF0YSBzdHJ1Y3R1cmUuCisgKgkJCQkJYmlnZAkJICAtIFBDSS0yMjQwSSBpZGVudGlmaWVyCisgKgkJCQkJcGNpZGV2CQkgIC0gUG9pbnRlciB0byBkZXZpY2UgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICoJUmV0dXJuczoJCVRSVUUgaWYgZmFpbHVyZSB0byBpbnN0YWxsLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVTSE9SVCBHZXRSZWdzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpwc2hvc3QsIEJPT0wgYmlnZCwgc3RydWN0IHBjaV9kZXYgKnBjaWRldikKKwl7CisJUEFEQVBURVIyMjIwSQlwYWRhcHRlcjsKKwlpbnQJCQkJc2V0aXJxOworCWludAkJCQl6OworCVVTSE9SVAkJCXpyLCB6bDsKKwlVQ0hBUgkJICAgKmNvbnNpc3RlbnQ7CisJZG1hX2FkZHJfdAkJY29uc2lzdGVudERtYTsKKworCXBhZGFwdGVyID0gSE9TVERBVEEocHNob3N0KTsKKwltZW1zZXQgKHBhZGFwdGVyLCAwLCBzaXplb2YgKEFEQVBURVIyMjIwSSkpOworCW1lbXNldCAoJkRhbGVTZXR1cCwgMCwgc2l6ZW9mIChEYWxlU2V0dXApKTsKKwltZW1zZXQgKERpc2tNaXJyb3IsIDAsIHNpemVvZiAoRGlza01pcnJvcikpOworCisJenIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBjaWRldiwgMSk7CisJemwgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBjaWRldiwgMik7CisKKwlwYWRhcHRlci0+YmFzZVBvcnQgPSB6cjsKKwlwYWRhcHRlci0+cmVnUmVtYXAJCT0genIgKyBSVFJfTE9DQUxfUkVNQVA7CQkJCQkvLyAzMiBiaXQgbG9jYWwgc3BhY2UgcmVtYXAKKwlwYWRhcHRlci0+cmVnRGVzYwkJPSB6ciArIFJUUl9SRUdJT05TOwkgIAkJCQkJLy8gMzIgYml0IGxvY2FsIHJlZ2lvbiBkZXNjcmlwdG9yCisJcGFkYXB0ZXItPnJlZ1JhbmdlCQk9IHpyICsgUlRSX0xPQ0FMX1JBTkdFOwkJCQkJLy8gMzIgYml0IGxvY2FsIHJhbmdlCisJcGFkYXB0ZXItPnJlZ0lycUNvbnRyb2wJPSB6ciArIFJUUl9JTlRfQ09OVFJPTF9TVEFUVVM7CQkJLy8gMTYgYml0IGludGVycnVwdCBjb250cm9sIGFuZCBzdGF0dXMKKwlwYWRhcHRlci0+cmVnU2NyYXRjaFBhZAk9IHpyICsgUlRSX01BSUxCT1g7CSAgCQkJCQkvLyAxNiBieXRlIHNjcmF0Y2hwYWQgSS9PIGJhc2UgYWRkcmVzcworCisJcGFkYXB0ZXItPnJlZ0Jhc2UJCT0gemw7CisJcGFkYXB0ZXItPnJlZ0RhdGEJCT0gemwgKyBSRUdfREFUQTsJCQkJCQkvLyBkYXRhIHJlZ2lzdGVyIEkvTyBhZGRyZXNzCisJcGFkYXB0ZXItPnJlZ0Vycm9yCQk9IHpsICsgUkVHX0VSUk9SOwkJCQkJCS8vIGVycm9yIHJlZ2lzdGVyIEkvTyBhZGRyZXNzCisJcGFkYXB0ZXItPnJlZ1NlY3RDb3VudAk9IHpsICsgUkVHX1NFQ1RPUl9DT1VOVDsJCQkJLy8gc2VjdG9yIGNvdW50IHJlZ2lzdGVyIEkvTyBhZGRyZXNzCisJcGFkYXB0ZXItPnJlZ0xiYTAJCT0gemwgKyBSRUdfTEJBXzA7CQkJCQkJLy8gbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvZiBMQkEKKwlwYWRhcHRlci0+cmVnTGJhOAkJPSB6bCArIFJFR19MQkFfODsJCQkJCQkvLyBuZXh0IGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgb2YgTEJBCisJcGFkYXB0ZXItPnJlZ0xiYTE2CQk9IHpsICsgUkVHX0xCQV8xNjsJCQkJCQkvLyBuZXh0IG1vc3Qgc2lnbmlmaWNhbiBieXRlIG9mIExCQQorCXBhZGFwdGVyLT5yZWdMYmEyNAkJPSB6bCArIFJFR19MQkFfMjQ7CQkJCQkJLy8gaGVhZCBhbmQgbW9zdCA0IHNpZ25pZmljYW50IGJpdHMgb2YgTEJBCisJcGFkYXB0ZXItPnJlZ1N0YXRDbWQJPSB6bCArIFJFR19TVEFUX0NNRDsJCQkJCS8vIHN0YXR1cyBvbiByZWFkIGFuZCBjb21tYW5kIG9uIHdyaXRlIHJlZ2lzdGVyCisJcGFkYXB0ZXItPnJlZ1N0YXRTZWwJPSB6bCArIFJFR19TVEFUX1NFTDsJCQkJCS8vIGJvYXJkIHN0YXR1cyBvbiByZWFkIGFuZCBzcGlnb3Qgc2VsZWN0IG9uIHdyaXRlIHJlZ2lzdGVyCisJcGFkYXB0ZXItPnJlZ0ZhaWwJCT0gemwgKyBSRUdfRkFJTDsKKwlwYWRhcHRlci0+cmVnQWx0U3RhdAk9IHpsICsgUkVHX0FMVF9TVEFUOworCXBhZGFwdGVyLT5wY2lkZXYJCT0gcGNpZGV2OworCisJaWYgKCBiaWdkICkKKwkJeworCQlwYWRhcHRlci0+cmVnRG1hRGVzYwk9IHpyICsgUlRSX0RNQTBfREVTQ19QVFI7CQkJLy8gYWRkcmVzcyBvZiB0aGUgRE1BIGRpc2NyaXB0b3IgcmVnaXN0ZXIgZm9yIGRpcmVjdGlvbiBvZiB0cmFuc2ZlcgorCQlwYWRhcHRlci0+cmVnRG1hQ21kU3RhdAk9IHpyICsgUlRSX0RNQV9DT01NQU5EX1NUQVRVUzsJCS8vIEJ5dGUgIzAgb2YgRE1BIGNvbW1hbmQgc3RhdHVzIHJlZ2lzdGVyCisJCXBhZGFwdGVyLT5yZWdEbWFBZGRyUGNpCT0genIgKyBSVFJfRE1BMF9QQ0lfQUREUjsJCQkvLyAzMiBiaXQgcmVnaXN0ZXIgZm9yIFBDSSBhZGRyZXNzIG9mIERNQQorCQlwYWRhcHRlci0+cmVnRG1hQWRkckxvYwk9IHpyICsgUlRSX0RNQTBfTE9DQUxfQUREUjsJCQkvLyAzMiBiaXQgcmVnaXN0ZXIgZm9yIGxvY2FsIGJ1cyBhZGRyZXNzIG9mIERNQQorCQlwYWRhcHRlci0+cmVnRG1hQ291bnQJPSB6ciArIFJUUl9ETUEwX0NPVU5UOwkJCQkvLyAzMiBiaXQgcmVnaXN0ZXIgZm9yIERNQSB0cmFuc2ZlciBjb3VudAorCQlwYWRhcHRlci0+cmVnRG1hTW9kZQk9IHpyICsgUlRSX0RNQTBfTU9ERSArIDE7CQkJLy8gMzIgYml0IHJlZ2lzdGVyIGZvciBETUEgbW9kZSBjb250cm9sCisJCXBhZGFwdGVyLT5iaWdECQkJPSBTRUxfTkVXX1NQRUVEXzE7CQkJCQkvLyBzZXQgc3BpZ290IHNwZWVkIGNvbnRyb2wgYml0CisJCX0KKwllbHNlCisJCXsKKwkJcGFkYXB0ZXItPnJlZ0RtYURlc2MJPSB6bCArIFJUTF9ETUExX0RFU0NfUFRSOwkJCS8vIGFkZHJlc3Mgb2YgdGhlIERNQSBkaXNjcmlwdG9yIHJlZ2lzdGVyIGZvciBkaXJlY3Rpb24gb2YgdHJhbnNmZXIKKwkJcGFkYXB0ZXItPnJlZ0RtYUNtZFN0YXQJPSB6bCArIFJUTF9ETUFfQ09NTUFORF9TVEFUVVMgKyAxOwkvLyBCeXRlICMxIG9mIERNQSBjb21tYW5kIHN0YXR1cyByZWdpc3RlcgorCQlwYWRhcHRlci0+cmVnRG1hQWRkclBjaQk9IHpsICsgUlRMX0RNQTFfUENJX0FERFI7CQkJLy8gMzIgYml0IHJlZ2lzdGVyIGZvciBQQ0kgYWRkcmVzcyBvZiBETUEKKwkJcGFkYXB0ZXItPnJlZ0RtYUFkZHJMb2MJPSB6bCArIFJUTF9ETUExX0xPQ0FMX0FERFI7CQkJLy8gMzIgYml0IHJlZ2lzdGVyIGZvciBsb2NhbCBidXMgYWRkcmVzcyBvZiBETUEKKwkJcGFkYXB0ZXItPnJlZ0RtYUNvdW50CT0gemwgKyBSVExfRE1BMV9DT1VOVDsJCQkJLy8gMzIgYml0IHJlZ2lzdGVyIGZvciBETUEgdHJhbnNmZXIgY291bnQKKwkJcGFkYXB0ZXItPnJlZ0RtYU1vZGUJPSB6bCArIFJUTF9ETUExX01PREUgKyAxOwkJCS8vIDMyIGJpdCByZWdpc3RlciBmb3IgRE1BIG1vZGUgY29udHJvbAorCQl9CisKKwlwYWRhcHRlci0+bnVtYmVyT2ZEcml2ZXMgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1NjcmF0Y2hQYWQgKyBCSUdEX05VTV9EUklWRVMpOworCWlmICggIWJpZ2QgJiYgIXBhZGFwdGVyLT5udW1iZXJPZkRyaXZlcyApCQkJCQkJLy8gaWYgbm8gZGV2aWNlcyBvbiB0aGlzIGJvYXJkCisJCXJldHVybiBUUlVFOworCisJcHNob3N0LT5pcnEgPSBwY2lkZXYtPmlycTsKKwlzZXRpcnEgPSAxOworCWZvciAoIHogPSAwOyAgeiA8IEluc3RhbGxlZDsgIHorKyApCQkJCQkJCQkvLyBzY2FuIGZvciBzaGFyZWQgaW50ZXJydXB0cworCQl7CisJCWlmICggUHNpSG9zdFt6XS0+aXJxID09IHBzaG9zdC0+aXJxICkJCQkJCQkvLyBpZiBzaGFyZWQgdGhlbiwgZG9uJ3QgcG9zc2VzCisJCQlzZXRpcnEgPSAwOworCQl9CisJaWYgKCBzZXRpcnEgKQkJCQkJCQkJCQkJCQkvLyBpZiBub3Qgc2hhcmVkLCBwb3NzZXMKKwkJeworCQlpZiAoIHJlcXVlc3RfaXJxIChwc2hvc3QtPmlycSwgSXJxX0hhbmRsZXIsIFNBX1NISVJRLCAicGNpMjIyMGkiLCBwYWRhcHRlcikgPCAwICkKKwkJCXsKKwkJCWlmICggcmVxdWVzdF9pcnEgKHBzaG9zdC0+aXJxLCBJcnFfSGFuZGxlciwgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsICJwY2kyMjIwaSIsIHBhZGFwdGVyKSA8IDAgKQorCQkJCXsKKwkJCQlwcmludGsgKCJVbmFibGUgdG8gYWxsb2NhdGUgSVJRIGZvciBQQ0ktMjIyMEkgY29udHJvbGxlci5cbiIpOworCQkJCXJldHVybiBUUlVFOworCQkJCX0KKwkJCX0KKwkJcGFkYXB0ZXItPmlycU93bmVkID0gcHNob3N0LT5pcnE7CQkJCQkJCS8vIHNldCBJUlEgYXMgb3duZWQKKwkJfQorCisJaWYgKCBwYWRhcHRlci0+bnVtYmVyT2ZEcml2ZXMgKQorCQljb25zaXN0ZW50ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQgKHBjaWRldiwgU0VDVE9SU1hGRVIgKiBCWVRFU19QRVJfU0VDVE9SLCAmY29uc2lzdGVudERtYSk7CisJZWxzZQorCQljb25zaXN0ZW50ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQgKHBjaWRldiwgQVRBUElfVFJBTlNGRVIsICZjb25zaXN0ZW50RG1hKTsKKwlpZiAoICFjb25zaXN0ZW50ICkKKwkJeworCQlwcmludGsgKCJVbmFibGUgdG8gYWxsb2NhdGUgRE1BIGJ1ZmZlciBmb3IgUENJLTIyMjBJIGNvbnRyb2xsZXIuXG4iKTsKKwkJZnJlZV9pcnEgKHBzaG9zdC0+aXJxLCBwYWRhcHRlcik7CisJCXJldHVybiBUUlVFOworCQl9CisJcGFkYXB0ZXItPmtCdWZmZXIgPSBjb25zaXN0ZW50OworCXBhZGFwdGVyLT5rQnVmZmVyRG1hID0gY29uc2lzdGVudERtYTsKKworCVBzaUhvc3RbSW5zdGFsbGVkXQk9IHBzaG9zdDsJCQkJCQkJCQkvLyBzYXZlIFNDU0lfSE9TVCBwb2ludGVyCisJcHNob3N0LT5pb19wb3J0CQk9IHBhZGFwdGVyLT5iYXNlUG9ydDsKKwlwc2hvc3QtPm5faW9fcG9ydAk9IDB4RkY7CisJcHNob3N0LT51bmlxdWVfaWQJPSBwYWRhcHRlci0+cmVnQmFzZTsKKworCW91dGJfcCAoMHgwMSwgcGFkYXB0ZXItPnJlZ1JhbmdlKTsJCQkJCQkJCS8vIGZpeCBvdXIgcmFuZ2UgcmVnaXN0ZXIgYmVjYXVzZSBvdGhlciBkcml2ZXJzIHdhbnQgdG8gdHJvbXAgb24gaXQKKworCXBhZGFwdGVyLT50aW1pbmdNb2RlID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTY3JhdGNoUGFkICsgREFMRV9USU1JTkdfTU9ERSk7CisJaWYgKCBwYWRhcHRlci0+dGltaW5nTW9kZSA+PSAyICkKKwkJeworCQlpZiAoIGJpZ2QgKQorCQkJcGFkYXB0ZXItPnRpbWluZ0FkZHJlc3MJPSBNb2RlQXJyYXkyW3BhZGFwdGVyLT50aW1pbmdNb2RlIC0gMl07CisJCWVsc2UKKwkJCXBhZGFwdGVyLT50aW1pbmdBZGRyZXNzCT0gTW9kZUFycmF5W3BhZGFwdGVyLT50aW1pbmdNb2RlIC0gMl07CisJCX0KKwllbHNlCisJCXBhZGFwdGVyLT50aW1pbmdQSU8gPSBUUlVFOworCisJUmVhZEZsYXNoIChwYWRhcHRlciwgJkRhbGVTZXR1cCwgREFMRV9GTEFTSF9TRVRVUCwgc2l6ZW9mIChTRVRVUCkpOworCVJlYWRGbGFzaCAocGFkYXB0ZXIsICZEaXNrTWlycm9yLCBEQUxFX0ZMQVNIX1JBSUQsIHNpemVvZiAoRGlza01pcnJvcikpOworCisJcmV0dXJuIEZBTFNFOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOgkJCVNldHVwRmluaXNoCisgKgorICoJRGVzY3JpcHRpb246CUNvbXBsZXRlIHRoZSBkcml2ZXIgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBmb3IgYSBjYXJkCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyICAtIFBvaW50ZXIgdG8gU0NTSSBob3N0IGRhdGEgc3RydWN0dXJlLgorICoJCQkJCXN0cgkJICAtIFBvaW50ZXIgdG8gYm9hcmQgdHlwZSBzdHJpbmcuCisgKgorICoJUmV0dXJuczoJCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitWT0lEIFNldHVwRmluaXNoIChQQURBUFRFUjIyMjBJIHBhZGFwdGVyLCBjaGFyICpzdHIsIGludCBpcnEpCisJeworCWluaXRfdGltZXIgKCZwYWRhcHRlci0+dGltZXIpOworCXBhZGFwdGVyLT50aW1lci5mdW5jdGlvbiA9IFRpbWVyRXhwaXJ5OworCXBhZGFwdGVyLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXI7CisJaW5pdF90aW1lciAoJnBhZGFwdGVyLT5yZWNvblRpbWVyKTsKKwlwYWRhcHRlci0+cmVjb25UaW1lci5mdW5jdGlvbiA9IFJlY29uVGltZXJFeHBpcnk7CisJcGFkYXB0ZXItPnJlY29uVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyOworCXByaW50aygiXG5QQ0ktJXNJIEVJREUgQ09OVFJPTExFUjogYXQgSS9PID0gJWxYLyVsWCAgSVJRID0gJWRcbiIsIHN0ciwgcGFkYXB0ZXItPmJhc2VQb3J0LCBwYWRhcHRlci0+cmVnQmFzZSwgaXJxKTsKKwlwcmludGsoIlZlcnNpb24gJXMsIENvbXBpbGVkICVzICVzXG5cbiIsIFBDSTIyMjBJX1ZFUlNJT04sIF9fREFURV9fLCBfX1RJTUVfXyk7CisJfQkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglQY2kyMjIwaV9EZXRlY3QKKyAqCisgKglEZXNjcmlwdGlvbjoJRGV0ZWN0IGFuZCBpbml0aWFsaXplIG91ciBib2FyZHMuCisgKgorICoJUGFyYW1ldGVyczoJCXRwbnQgLSBQb2ludGVyIHRvIFNDU0kgaG9zdCB0ZW1wbGF0ZSBzdHJ1Y3R1cmUuCisgKgorICoJUmV0dXJuczoJCU51bWJlciBvZiBhZGFwdGVycyBpbnN0YWxsZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUGNpMjIyMGlfRGV0ZWN0IChTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQpCisJeworCXN0cnVjdCBTY3NpX0hvc3QgICAqcHNob3N0OworCVBBREFQVEVSMjIyMEkJICAgIHBhZGFwdGVyOworCVBPVVJfREVWSUNFCQkJcGRldjsKKwlpbnQJCQkJCXVuaXQ7CisJaW50CQkJCQl6OworCVVTSE9SVAkJCQlyYWlkb247CisJVUNIQVIJCQkJc3BpZ290MSwgc3BpZ290MjsKKwlVQ0hBUgkJCQlkZXZpY2U7CisJc3RydWN0IHBjaV9kZXYJICAgKnBjaWRldiA9IE5VTEw7CisKKwl3aGlsZSAoIChwY2lkZXYgPSBwY2lfZmluZF9kZXZpY2UgKFZFTkRPUl9QU0ksIERFVklDRV9EQUxFXzEsIHBjaWRldikpICE9IE5VTEwgKQorCQl7CisJCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lkZXYpKQorCQkJY29udGludWU7CisJCXBzaG9zdCA9IHNjc2lfcmVnaXN0ZXIgKHRwbnQsIHNpemVvZihBREFQVEVSMjIyMEkpKTsKKwkJaWYocHNob3N0PT1OVUxMKQorCQkJY29udGludWU7CisJCQkKKwkJcGFkYXB0ZXIgPSBIT1NUREFUQShwc2hvc3QpOworCisJCWlmICggR2V0UmVncyAocHNob3N0LCBGQUxTRSwgcGNpZGV2KSApCisJCQlnb3RvIHVucmVnaXN0ZXI7CisKKwkJc2NzaV9zZXRfZGV2aWNlKHBzaG9zdCwgJnBjaWRldi0+ZGV2KTsKKwkJcHNob3N0LT5tYXhfaWQgPSBwYWRhcHRlci0+bnVtYmVyT2ZEcml2ZXM7CisJCWZvciAoIHogPSAwOyAgeiA8IHBhZGFwdGVyLT5udW1iZXJPZkRyaXZlczsgIHorKyApCisJCQl7CisJCQl1bml0ID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTY3JhdGNoUGFkICsgREFMRV9DSEFOTkVMX0RFVklDRV8wICsgeikgJiAweDBGOworCQkJcGRldiA9ICZwYWRhcHRlci0+ZGV2aWNlW3pdOworCQkJcGRldi0+Ynl0ZTYJCT0gKFVDSEFSKSgoKHVuaXQgJiAxKSA8PCA0KSB8IDB4RTApOworCQkJcGRldi0+c3BpZ290CT0gKFVDSEFSKSgxIDw8ICh1bml0ID4+IDEpKTsKKwkJCXBkZXYtPnNlY3RvcnMJPSBEYWxlU2V0dXAuc2V0dXBEZXZpY2VbdW5pdF0uc2VjdG9yczsKKwkJCXBkZXYtPmhlYWRzCQk9IERhbGVTZXR1cC5zZXR1cERldmljZVt1bml0XS5oZWFkczsKKwkJCXBkZXYtPmN5bGluZGVycyA9IERhbGVTZXR1cC5zZXR1cERldmljZVt1bml0XS5jeWxpbmRlcnM7CisJCQlwZGV2LT5ibG9ja3MJPSBEYWxlU2V0dXAuc2V0dXBEZXZpY2VbdW5pdF0uYmxvY2tzOworCisJCQlpZiAoICF6ICkKKwkJCQl7CisJCQkJRGlza01pcnJvclswXS5zdGF0dXMgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1NjcmF0Y2hQYWQgKyBEQUxFX1JBSURfMF9TVEFUVVMpOwkJCisJCQkJRGlza01pcnJvclsxXS5zdGF0dXMgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1NjcmF0Y2hQYWQgKyBEQUxFX1JBSURfMV9TVEFUVVMpOwkJCisJCQkJaWYgKCAoRGlza01pcnJvclswXS5zaWduYXR1cmUgPT0gU0lHTkFUVVJFKSAmJiAoRGlza01pcnJvclsxXS5zaWduYXR1cmUgPT0gU0lHTkFUVVJFKSAmJgorCQkJCSAgICAgKERpc2tNaXJyb3JbMF0ucGFpcklkZW50aWZpZXIgPT0gKERpc2tNaXJyb3JbMV0ucGFpcklkZW50aWZpZXIgXiAxKSkgKQorCQkJCQl7CQkJIAorCQkJCQlyYWlkb24gPSBUUlVFOworCQkJCQlpZiAoIHVuaXQgPiAodW5pdCBeIDIpICkKKwkJCQkJCXVuaXQgPSB1bml0IF4gMjsKKwkJCQkJfQkKKwkJCQllbHNlCisJCQkJCXJhaWRvbiA9IEZBTFNFOworCisJCQkJbWVtY3B5IChwZGV2LT5EaXNrTWlycm9yLCBEaXNrTWlycm9yLCBzaXplb2YgKERpc2tNaXJyb3IpKTsKKwkJCQlwYWRhcHRlci0+cmFpZERhdGFbMF0gPSAmcGRldi0+RGlza01pcnJvclswXTsKKwkJCQlwYWRhcHRlci0+cmFpZERhdGFbMl0gPSAmcGRldi0+RGlza01pcnJvclsxXTsKKwkJCQkKKwkJCQlzcGlnb3QxID0gc3BpZ290MiA9IEZBTFNFOworCQkJCXBkZXYtPnNwaWdvdHNbMF0gPSAxOworCQkJCXBkZXYtPnNwaWdvdHNbMV0gPSAyOworCQkJCXBkZXYtPmxhc3RzZWN0b3JsYmFbMF0gPSBJbmxpbmVJZGVudGlmeSAocGFkYXB0ZXIsIDEsIDApOworCQkJCXBkZXYtPmxhc3RzZWN0b3JsYmFbMV0gPSBJbmxpbmVJZGVudGlmeSAocGFkYXB0ZXIsIDIsIDApOworCQkJCQkJCisJCQkJaWYgKCAhKHBkZXYtPkRpc2tNaXJyb3JbMV0uc3RhdHVzICYgVUNCRl9TVVJWSVZPUikgJiYgcGRldi0+bGFzdHNlY3RvcmxiYVswXSApCisJCQkJCXNwaWdvdDEgPSBUUlVFOworCQkJCWlmICggIShwZGV2LT5EaXNrTWlycm9yWzBdLnN0YXR1cyAmIFVDQkZfU1VSVklWT1IpICYmIHBkZXYtPmxhc3RzZWN0b3JsYmFbMV0gKQorCQkJCQlzcGlnb3QyID0gVFJVRTsKKwkJCQlpZiAoIHBkZXYtPkRpc2tNaXJyb3JbMF0uc3RhdHVzICYgRGlza01pcnJvclsxXS5zdGF0dXMgJiBVQ0JGX1NVUlZJVk9SICkKKwkJCQkJc3BpZ290MSA9IFRSVUU7CisKKwkJCQlpZiAoIHNwaWdvdDEgJiYgKHBkZXYtPkRpc2tNaXJyb3JbMF0uc3RhdHVzICYgVUNCRl9SRUJVSUxEKSApCisJCQkJCUlubGluZVJlYWRTaWduYXR1cmUgKHBhZGFwdGVyLCBwZGV2LCAwKTsKKwkJCQlpZiAoIHNwaWdvdDIgJiYgKHBkZXYtPkRpc2tNaXJyb3JbMV0uc3RhdHVzICYgVUNCRl9SRUJVSUxEKSApCisJCQkJCUlubGluZVJlYWRTaWduYXR1cmUgKHBhZGFwdGVyLCBwZGV2LCAxKTsKKworCQkJCWlmICggc3BpZ290MSAmJiBzcGlnb3QyICYmIHJhaWRvbiApCisJCQkJCXsKKwkJCQkJcGRldi0+cmFpZCA9IDE7CisJCQkJCWlmICggcGRldi0+RGlza01pcnJvclswXS5zdGF0dXMgJiBVQ0JGX1JFQlVJTEQgKQorCQkJCQkJcGRldi0+c3BpZ290ID0gMjsKKwkJCQkJZWxzZQorCQkJCQkJcGRldi0+c3BpZ290ID0gMTsKKwkJCQkJaWYgKCAocGRldi0+RGlza01pcnJvclswXS5zdGF0dXMgJiBVQ0JGX1JFQlVJTEQpIHx8IChwZGV2LT5EaXNrTWlycm9yWzFdLnN0YXR1cyAmIFVDQkZfUkVCVUlMRCkgKQorCQkJCQkJcGFkYXB0ZXItPnJlY29uT24gPSBwZGV2LT5yZWNvbk9uID0gcGRldi0+cmVjb25Jc1N0YXJ0aW5nID0gVFJVRTsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlpZiAoIHNwaWdvdDEgKQorCQkJCQkJeworCQkJCQkJaWYgKCBwZGV2LT5EaXNrTWlycm9yWzBdLnN0YXR1cyAmIFVDQkZfUkVCVUlMRCApCisJCQkJCQkJZ290byB1bnJlZ2lzdGVyOworCQkJCQkJcGRldi0+RGlza01pcnJvclswXS5zdGF0dXMgPSBVQ0JGX01JUlJPUkVEIHwgVUNCRl9TVVJWSVZPUjsKKwkJCQkJCXBkZXYtPnNwaWdvdCA9IDE7CisJCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCWlmICggcGRldi0+RGlza01pcnJvclsxXS5zdGF0dXMgJiBVQ0JGX1JFQlVJTEQgKQorCQkJCQkJCWdvdG8gdW5yZWdpc3RlcjsKKwkJCQkJCXBkZXYtPkRpc2tNaXJyb3JbMV0uc3RhdHVzID0gVUNCRl9NSVJST1JFRCB8IFVDQkZfU1VSVklWT1I7CisJCQkJCQlwZGV2LT5zcGlnb3QgPSAyOworCQkJCQkJfQorCQkJCQlpZiAoIERhbGVTZXR1cC5yZWJvb3RSZWJ1aWxkICYmIHJhaWRvbiApCisJCQkJCQlwYWRhcHRlci0+cmVjb25PbiA9IHBkZXYtPnJlY29uT24gPSBwZGV2LT5yZWNvbklzU3RhcnRpbmcgPSBUUlVFOworCQkJCQl9CisJCQkKKwkJCQlpZiAoIHJhaWRvbiApCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQlTZXR1cEZpbmlzaCAocGFkYXB0ZXIsICIyMjIwIiwgcHNob3N0LT5pcnEpOworCQorCQlpZiAoICsrSW5zdGFsbGVkIDwgTUFYQURBUFRFUiApCisJCQljb250aW51ZTsKKwkJYnJlYWs7Cit1bnJlZ2lzdGVyOjsKKwkJc2NzaV91bnJlZ2lzdGVyIChwc2hvc3QpOworCQl9CisKKwl3aGlsZSAoIChwY2lkZXYgPSBwY2lfZmluZF9kZXZpY2UgKFZFTkRPUl9QU0ksIERFVklDRV9CSUdEXzEsIHBjaWRldikpICE9IE5VTEwgKQorCQl7CisJCXBzaG9zdCA9IHNjc2lfcmVnaXN0ZXIgKHRwbnQsIHNpemVvZihBREFQVEVSMjIyMEkpKTsKKwkJcGFkYXB0ZXIgPSBIT1NUREFUQShwc2hvc3QpOworCisJCWlmICggR2V0UmVncyAocHNob3N0LCBUUlVFLCBwY2lkZXYpICkKKwkJCWdvdG8gdW5yZWdpc3RlcjE7CisKKwkJZm9yICggeiA9IDA7ICB6IDwgQklHRF9NQVhEUklWRVM7ICB6KysgKQorCQkJRGlza01pcnJvclt6XS5zdGF0dXMgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1NjcmF0Y2hQYWQgKyBCSUdEX1JBSURfMF9TVEFUVVMgKyB6KTsJCQorCisJCXNjc2lfc2V0X3BjaV9kZXZpY2UocHNob3N0LCBwY2lkZXYpOworCQlwc2hvc3QtPm1heF9pZCA9IHBhZGFwdGVyLT5udW1iZXJPZkRyaXZlczsKKwkJcGFkYXB0ZXItPmZhaWxSZWdpc3RlciA9IGluYl9wIChwYWRhcHRlci0+cmVnU2NyYXRjaFBhZCArIEJJR0RfQUxBUk1fSU1BR0UpOworCQlmb3IgKCB6ID0gMDsgIHogPCBwYWRhcHRlci0+bnVtYmVyT2ZEcml2ZXM7ICB6KysgKQorCQkJeworCQkJdW5pdCA9IGluYl9wIChwYWRhcHRlci0+cmVnU2NyYXRjaFBhZCArIEJJR0RfREVWSUNFXzAgKyB6KTsKKwkJCXBkZXYgPSAmcGFkYXB0ZXItPmRldmljZVt6XTsKKwkJCXBkZXYtPmJ5dGU2CQk9IChVQ0hBUikoKCh1bml0ICYgMSkgPDwgNCkgfCAweEUwKTsKKwkJCXBkZXYtPnNwaWdvdAk9IChVQ0hBUikoMSA8PCAodW5pdCA+PiAxKSk7CisJCQlwZGV2LT5zZWN0b3JzCT0gRGFsZVNldHVwLnNldHVwRGV2aWNlW3VuaXRdLnNlY3RvcnM7CisJCQlwZGV2LT5oZWFkcwkJPSBEYWxlU2V0dXAuc2V0dXBEZXZpY2VbdW5pdF0uaGVhZHM7CisJCQlwZGV2LT5jeWxpbmRlcnMgPSBEYWxlU2V0dXAuc2V0dXBEZXZpY2VbdW5pdF0uY3lsaW5kZXJzOworCQkJcGRldi0+YmxvY2tzCT0gRGFsZVNldHVwLnNldHVwRGV2aWNlW3VuaXRdLmJsb2NrczsKKwkJCQorCQkJaWYgKCAoRGlza01pcnJvclt1bml0XS5zaWduYXR1cmUgPT0gU0lHTkFUVVJFKSAmJiAoRGlza01pcnJvclt1bml0IF4gMl0uc2lnbmF0dXJlID09IFNJR05BVFVSRSkgJiYKKwkJCSAgICAgKERpc2tNaXJyb3JbdW5pdF0ucGFpcklkZW50aWZpZXIgPT0gKERpc2tNaXJyb3JbdW5pdCBeIDJdLnBhaXJJZGVudGlmaWVyIF4gMSkpICkKKwkJCQl7CQkJIAorCQkJCXJhaWRvbiA9IFRSVUU7CisJCQkJaWYgKCB1bml0ID4gKHVuaXQgXiAyKSApCisJCQkJCXVuaXQgPSB1bml0IF4gMjsKKwkJCQl9CQorCQkJZWxzZQorCQkJCXJhaWRvbiA9IEZBTFNFOworCQkJCQorCQkJc3BpZ290MSA9IHNwaWdvdDIgPSBGQUxTRTsKKwkJCW1lbWNweSAoJnBkZXYtPkRpc2tNaXJyb3JbMF0sICZEaXNrTWlycm9yW3VuaXRdLCBzaXplb2YgKERJU0tfTUlSUk9SKSk7CisJCQltZW1jcHkgKCZwZGV2LT5EaXNrTWlycm9yWzFdLCAmRGlza01pcnJvclt1bml0IF4gMl0sIHNpemVvZiAoRElTS19NSVJST1IpKTsKKwkJCXBhZGFwdGVyLT5yYWlkRGF0YVt1bml0XQkgPSAmcGRldi0+RGlza01pcnJvclswXTsKKwkJCXBhZGFwdGVyLT5yYWlkRGF0YVt1bml0IF4gMl0gPSAmcGRldi0+RGlza01pcnJvclsxXTsKKwkJCXBkZXYtPnNwaWdvdHNbMF0gPSAxIDw8ICh1bml0ID4+IDEpOworCQkJcGRldi0+c3BpZ290c1sxXSA9IDEgPDwgKCh1bml0IF4gMikgPj4gMSk7CisJCQlwZGV2LT5kZXZpY2VJRFswXSA9IHVuaXQ7CisJCQlwZGV2LT5kZXZpY2VJRFsxXSA9IHVuaXQgXiAyOworCQkJcGRldi0+bGFzdHNlY3RvcmxiYVswXSA9IElubGluZUlkZW50aWZ5IChwYWRhcHRlciwgcGRldi0+c3BpZ290c1swXSwgdW5pdCAmIDEpOworCQkJcGRldi0+bGFzdHNlY3RvcmxiYVsxXSA9IElubGluZUlkZW50aWZ5IChwYWRhcHRlciwgcGRldi0+c3BpZ290c1sxXSwgdW5pdCAmIDEpOworCisJCQlpZiAoICEocGRldi0+RGlza01pcnJvclsxXS5zdGF0dXMgJiBVQ0JGX1NVUlZJVk9SKSAmJiBwZGV2LT5sYXN0c2VjdG9ybGJhWzBdICkKKwkJCQlzcGlnb3QxID0gVFJVRTsKKwkJCWlmICggIShwZGV2LT5EaXNrTWlycm9yWzBdLnN0YXR1cyAmIFVDQkZfU1VSVklWT1IpICYmIHBkZXYtPmxhc3RzZWN0b3JsYmFbMV0gKQorCQkJCXNwaWdvdDIgPSBUUlVFOworCQkJaWYgKCBwZGV2LT5EaXNrTWlycm9yWzBdLnN0YXR1cyAmIHBkZXYtPkRpc2tNaXJyb3JbMV0uc3RhdHVzICYgVUNCRl9TVVJWSVZPUiApCisJCQkJc3BpZ290MSA9IFRSVUU7CisKKwkJCWlmICggc3BpZ290MSAmJiAocGRldi0+RGlza01pcnJvclswXS5zdGF0dXMgJiBVQ0JGX1JFQlVJTEQpICkKKwkJCQlJbmxpbmVSZWFkU2lnbmF0dXJlIChwYWRhcHRlciwgcGRldiwgMCk7CisJCQlpZiAoIHNwaWdvdDIgJiYgKHBkZXYtPkRpc2tNaXJyb3JbMV0uc3RhdHVzICYgVUNCRl9SRUJVSUxEKSApCisJCQkJSW5saW5lUmVhZFNpZ25hdHVyZSAocGFkYXB0ZXIsIHBkZXYsIDEpOworCisJCQlpZiAoIHNwaWdvdDEgJiYgc3BpZ290MiAmJiByYWlkb24gKQorCQkJCXsKKwkJCQlwZGV2LT5yYWlkID0gMTsKKwkJCQlpZiAoIHBkZXYtPkRpc2tNaXJyb3JbMF0uc3RhdHVzICYgVUNCRl9SRUJVSUxEICkKKwkJCQkJcGRldi0+c3BpZ290ID0gcGRldi0+c3BpZ290c1sxXTsKKwkJCQllbHNlCisJCQkJCXBkZXYtPnNwaWdvdCA9IHBkZXYtPnNwaWdvdHNbMF07CisJCQkJaWYgKCAocGRldi0+RGlza01pcnJvclswXS5zdGF0dXMgJiBVQ0JGX1JFQlVJTEQpIHx8IChwZGV2LT5EaXNrTWlycm9yWzFdLnN0YXR1cyAmIFVDQkZfUkVCVUlMRCkgKQorCQkJCQlwYWRhcHRlci0+cmVjb25PbiA9IHBkZXYtPnJlY29uT24gPSBwZGV2LT5yZWNvbklzU3RhcnRpbmcgPSBUUlVFOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJaWYgKCBzcGlnb3QxICkKKwkJCQkJeworCQkJCQlpZiAoIHBkZXYtPkRpc2tNaXJyb3JbMF0uc3RhdHVzICYgVUNCRl9SRUJVSUxEICkKKwkJCQkJCWdvdG8gdW5yZWdpc3RlcjE7CisJCQkJCXBkZXYtPkRpc2tNaXJyb3JbMF0uc3RhdHVzID0gVUNCRl9NSVJST1JFRCB8IFVDQkZfU1VSVklWT1I7CisJCQkJCXBkZXYtPnNwaWdvdCA9IHBkZXYtPnNwaWdvdHNbMF07CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJaWYgKCBwZGV2LT5EaXNrTWlycm9yWzFdLnN0YXR1cyAmIFVDQkZfUkVCVUlMRCApCisJCQkJCQlnb3RvIHVucmVnaXN0ZXI7CisJCQkJCXBkZXYtPkRpc2tNaXJyb3JbMV0uc3RhdHVzID0gVUNCRl9NSVJST1JFRCB8IFVDQkZfU1VSVklWT1I7CisJCQkJCXBkZXYtPnNwaWdvdCA9IHBkZXYtPnNwaWdvdHNbMV07CisJCQkJCX0KKwkJCQlpZiAoIERhbGVTZXR1cC5yZWJvb3RSZWJ1aWxkICYmIHJhaWRvbiApCisJCQkJCXBhZGFwdGVyLT5yZWNvbk9uID0gcGRldi0+cmVjb25PbiA9IHBkZXYtPnJlY29uSXNTdGFydGluZyA9IFRSVUU7CisJCQkJfQorCQkJfQorCQkKKwkJaWYgKCAhcGFkYXB0ZXItPm51bWJlck9mRHJpdmVzICkJCQkJCQkJCQkvLyBJZiBubyBBVEEgZGV2aWNlcyB0aGVuIHNjYW4gQVRBUEkKKwkJCXsKKwkJCXVuaXQgPSAwOworCQkJZm9yICggc3BpZ290MSA9IDA7ICBzcGlnb3QxIDwgNDsgIHNwaWdvdDErKyApCisJCQkJeworCQkJCWZvciAoIGRldmljZSA9IDA7ICBkZXZpY2UgPCAyOyAgZGV2aWNlKysgKQorCQkJCQl7CisJCQkJCURFQiAocHJpbnRrICgiXG5QQ0kyMjQySTogc2Nhbm5pbmcgZm9yIElEICVkICIsIChzcGlnb3QxICogMikgKyBkZXZpY2UpKTsKKwkJCQkJcGRldiA9ICYocGFkYXB0ZXItPmRldmljZVsoc3BpZ290MSAqIDIpICsgZGV2aWNlXSk7CisJCQkJCXBkZXYtPmJ5dGU2ID0gMHgwQSB8IChkZXZpY2UgPDwgNCk7CisJCQkJCXBkZXYtPnNwaWdvdCA9IDEgPDwgc3BpZ290MTsKKwkJCQkJaWYgKCAhQXRhcGlSZXNldCAocGFkYXB0ZXIsIHBkZXYpICkKKwkJCQkJCXsKKwkJCQkJCURFQiAocHJpbnRrICgiIERldmljZSBmb3VuZCAiKSk7CisJCQkJCQlpZiAoICFBdGFwaUlkZW50aWZ5IChwYWRhcHRlciwgcGRldikgKQorCQkJCQkJCXsKKwkJCQkJCQlERUIgKHByaW50ayAoIiBEZXZpY2UgdmVyaWZpZWQiKSk7CisJCQkJCQkJdW5pdCsrOworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJcGRldi0+c3BpZ290ID0gcGRldi0+Ynl0ZTYgPSAwOworCQkJCQl9CisJCQkJfQorCisJCQlpZiAoIHVuaXQgKQorCQkJCXsKKwkJCQlwYWRhcHRlci0+YXRhcGkgPSBUUlVFOworCQkJCXBhZGFwdGVyLT50aW1pbmdBZGRyZXNzID0gREFMRV9EQVRBX01PREUzOworCQkJCW91dHdfcCAoMHgwOTAwLCBwYWRhcHRlci0+cmVnSXJxQ29udHJvbCk7CQkJCQkvLyBUdXJuIG91ciBpbnRlcnJ1cHRzIG9uCisJCQkJb3V0d19wICgweDBDNDEsIHBhZGFwdGVyLT5yZWdEbWFNb2RlIC0gMSk7CQkJCQkvLyBzZXR1cCBmb3IgMTYgYml0cywgcmVhZHkgZW5hYmxlZCwgZG9uZSBJUlEgZW5hYmxlZCwgbm8gaW5jcmltZW50CisJCQkJb3V0Yl9wICgweEZGLCBwYWRhcHRlci0+cmVnRmFpbCk7CQkJCQkJCS8vIGFsbCBmYWlsIGxpZ2h0cyBhbmQgYWxhcm0gb2ZmCisJCQkJcHNob3N0LT5tYXhfaWQgPSA4OworCQkJCX0KKwkJCX0KKwkJU2V0dXBGaW5pc2ggKHBhZGFwdGVyLCAiMjI0MCIsIHBzaG9zdC0+aXJxKTsKKwkJCisJCWlmICggKytJbnN0YWxsZWQgPCBNQVhBREFQVEVSICkKKwkJCWNvbnRpbnVlOworCQlicmVhazsKK3VucmVnaXN0ZXIxOjsKKwkJc2NzaV91bnJlZ2lzdGVyIChwc2hvc3QpOworCQl9CisKKwlOdW1BZGFwdGVycyA9IEluc3RhbGxlZDsKKwlyZXR1cm4gSW5zdGFsbGVkOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglQY2kyMjIwaV9BYm9ydAorICoKKyAqCURlc2NyaXB0aW9uOglQcm9jZXNzIHRoZSBBYm9ydCBjb21tYW5kIGZyb20gdGhlIFNDU0kgbWFuYWdlci4KKyAqCisgKglQYXJhbWV0ZXJzOgkJU0NwbnQgLSBQb2ludGVyIHRvIFNDU0kgY29tbWFuZCBzdHJ1Y3R1cmUuCisgKgorICoJUmV0dXJuczoJCUFsbHdheXMgc25vb3plLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBjaTIyMjBpX0Fib3J0IChTY3NpX0NtbmQgKlNDcG50KQorCXsKKwlQQURBUFRFUjIyMjBJCXBhZGFwdGVyID0gSE9TVERBVEEoU0NwbnQtPmRldmljZS0+aG9zdCk7CQkJLy8gUG9pbnRlciB0byBhZGFwdGVyIGNvbnRyb2wgc3RydWN0dXJlCisJUE9VUl9ERVZJQ0UJCXBkZXYJID0gJnBhZGFwdGVyLT5kZXZpY2VbU0NwbnQtPmRldmljZS0+aWRdOy8vIFBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uCisKKwlpZiAoICFwYWRhcHRlci0+U0NwbnQgKQorCQlyZXR1cm4gU0NTSV9BQk9SVF9OT1RfUlVOTklORzsKKwkKKwlpZiAoIHBhZGFwdGVyLT5hdGFwaSApCisJCXsKKwkJaWYgKCBBdGFwaVJlc2V0IChwYWRhcHRlciwgcGRldikgKQorCQkJcmV0dXJuIFNDU0lfQUJPUlRfRVJST1I7CisJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9BQk9SVCA8PCAxNik7CisJCXJldHVybiBTQ1NJX0FCT1JUX1NVQ0NFU1M7CisJCX0KKwlyZXR1cm4gU0NTSV9BQk9SVF9TTk9PWkU7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVBjaTIyMjBpX1Jlc2V0CisgKgorICoJRGVzY3JpcHRpb246CVByb2Nlc3MgdGhlIFJlc2V0IGNvbW1hbmQgZnJvbSB0aGUgU0NTSSBtYW5hZ2VyLgorICoKKyAqCVBhcmFtZXRlcnM6CQlTQ3BudCAtIFBvaW50ZXIgdG8gU0NTSSBjb21tYW5kIHN0cnVjdHVyZS4KKyAqCQkJCQlmbGFncyAtIEZsYWdzIGFib3V0IHRoZSByZXNldCBjb21tYW5kCisgKgorICoJUmV0dXJuczoJCU5vIGFjdGl2ZSBjb21tYW5kIGF0IHRoaXMgdGltZSwgc28gdGhpcyBtZWFucworICoJCQkJCXRoYXQgZWFjaCB0aW1lIHdlIGdvdCBzb21lIGtpbmQgb2YgcmVzcG9uc2UgdGhlCisgKgkJCQkJbGFzdCB0aW1lIHRocm91Z2guICBUZWxsIHRoZSBtaWQtbGV2ZWwgY29kZSB0bworICoJCQkJCXJlcXVlc3Qgc2Vuc2UgaW5mb3JtYXRpb24gaW4gb3JkZXIgdG8gZGVjaWRlIHdoYXQKKyAqCQkJCQl0byBkbyBuZXh0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBjaTIyMjBpX1Jlc2V0IChTY3NpX0NtbmQgKlNDcG50LCB1bnNpZ25lZCBpbnQgcmVzZXRfZmxhZ3MpCisJeworCVBBREFQVEVSMjIyMEkJcGFkYXB0ZXIgPSBIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KTsJCQkvLyBQb2ludGVyIHRvIGFkYXB0ZXIgY29udHJvbCBzdHJ1Y3R1cmUKKwlQT1VSX0RFVklDRQkJcGRldgkgPSAmcGFkYXB0ZXItPmRldmljZVtTQ3BudC0+ZGV2aWNlLT5pZF07Ly8gUG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKworCWlmICggcGFkYXB0ZXItPmF0YXBpICkKKwkJeworCQlpZiAoIEF0YXBpUmVzZXQgKHBhZGFwdGVyLCBwZGV2KSApCisJCQlyZXR1cm4gU0NTSV9SRVNFVF9FUlJPUjsKKwkJcmV0dXJuIFNDU0lfUkVTRVRfU1VDQ0VTUzsKKwkJfQorCXJldHVybiBTQ1NJX1JFU0VUX1BVTlQ7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVBjaTIyMjBpX1JlbGVhc2UKKyAqCisgKglEZXNjcmlwdGlvbjoJUmVsZWFzZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBhIHNpbmdsZSBlYWNoIGFkYXB0ZXIuCisgKgorICoJUGFyYW1ldGVyczoJCXBzaG9zdCAtIFBvaW50ZXIgdG8gU0NTSSBjb21tYW5kIHN0cnVjdHVyZS4KKyAqCisgKglSZXR1cm5zOgkJemVyby4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQY2kyMjIwaV9SZWxlYXNlIChzdHJ1Y3QgU2NzaV9Ib3N0ICpwc2hvc3QpCisJeworICAgIFBBREFQVEVSMjIyMEkJcGFkYXB0ZXIgPSBIT1NUREFUQSAocHNob3N0KTsKKwlVU0hPUlQJCQl6OworCisJaWYgKCBwYWRhcHRlci0+cmVjb25PbiApCisJCXsKKwkJcGFkYXB0ZXItPnJlY29uT24gPSBGQUxTRTsJCQkJCQkvLyBzaHV0IGRvd24gdGhlIGhvdCByZWNvbnN0cnVjdAorCQlpZiAoIHBhZGFwdGVyLT5yZWNvblBoYXNlICkKKwkJCW1kZWxheSAoMzAwKTsKKwkJaWYgKCBwYWRhcHRlci0+cmVjb25UaW1lci5kYXRhICkJCQkJLy8gaXMgdGhlIHRpbWVyIHJ1bm5pbmc/CisJCQl7CisJCQlkZWxfdGltZXIgKCZwYWRhcHRlci0+cmVjb25UaW1lcik7CisJCQlwYWRhcHRlci0+cmVjb25UaW1lci5kYXRhID0gMDsKKwkJCX0KKwkJfQorCisJLy8gc2F2ZSBSQUlEIHN0YXR1cyBvbiB0aGUgYm9hcmQKKwlpZiAoIHBhZGFwdGVyLT5iaWdEICkKKwkJeworCQlvdXRiX3AgKHBhZGFwdGVyLT5mYWlsUmVnaXN0ZXIsIHBhZGFwdGVyLT5yZWdTY3JhdGNoUGFkICsgQklHRF9BTEFSTV9JTUFHRSk7CisJCWZvciAoIHogPSAwOyAgeiA8IEJJR0RfTUFYRFJJVkVTOyAgeisrICkKKwkJCXsKKwkJCWlmICggcGFkYXB0ZXItPnJhaWREYXRhICkKKwkJCQlvdXRiX3AgKHBhZGFwdGVyLT5yYWlkRGF0YVt6XS0+c3RhdHVzLCBwYWRhcHRlci0+cmVnU2NyYXRjaFBhZCArIEJJR0RfUkFJRF8wX1NUQVRVUyArIHopOwkKKwkJCWVsc2UKKwkJCQlvdXRiX3AgKDAsIHBhZGFwdGVyLT5yZWdTY3JhdGNoUGFkICsgQklHRF9SQUlEXzBfU1RBVFVTKTsJCisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJb3V0Yl9wIChwYWRhcHRlci0+ZGV2aWNlWzBdLkRpc2tNaXJyb3JbMF0uc3RhdHVzLCBwYWRhcHRlci0+cmVnU2NyYXRjaFBhZCArIERBTEVfUkFJRF8wX1NUQVRVUyk7CQkKKwkJb3V0Yl9wIChwYWRhcHRlci0+ZGV2aWNlWzBdLkRpc2tNaXJyb3JbMV0uc3RhdHVzLCBwYWRhcHRlci0+cmVnU2NyYXRjaFBhZCArIERBTEVfUkFJRF8xX1NUQVRVUyk7CQkKKwkJfQorCisJaWYgKCBwYWRhcHRlci0+aXJxT3duZWQgKQorCQlmcmVlX2lycSAocHNob3N0LT5pcnEsIHBhZGFwdGVyKTsKKyAgICByZWxlYXNlX3JlZ2lvbiAocHNob3N0LT5pb19wb3J0LCBwc2hvc3QtPm5faW9fcG9ydCk7CisJaWYgKCBwYWRhcHRlci0+bnVtYmVyT2ZEcml2ZXMgKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50IChwYWRhcHRlci0+cGNpZGV2LCBTRUNUT1JTWEZFUiAqIEJZVEVTX1BFUl9TRUNUT1IsIHBhZGFwdGVyLT5rQnVmZmVyLCBwYWRhcHRlci0+a0J1ZmZlckRtYSk7CisJZWxzZQkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCAocGFkYXB0ZXItPnBjaWRldiwgQVRBUElfVFJBTlNGRVIsIHBhZGFwdGVyLT5rQnVmZmVyLCBwYWRhcHRlci0+a0J1ZmZlckRtYSk7CisgICAgc2NzaV91bnJlZ2lzdGVyKHBzaG9zdCk7CisgICAgcmV0dXJuIDA7CisJfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJUGNpMjIyMGlfQmlvc1BhcmFtCisgKgorICoJRGVzY3JpcHRpb246CVByb2Nlc3MgdGhlIGJpb3NwYXJhbSByZXF1ZXN0IGZyb20gdGhlIFNDU0kgbWFuYWdlciB0bworICoJCQkJCXJldHVybiBDL0gvUyBkYXRhLgorICoKKyAqCVBhcmFtZXRlcnM6CQlkaXNrIC0gUG9pbnRlciB0byBTQ1NJIGRpc2sgc3RydWN0dXJlLgorICoJCQkJCWRldgkgLSBNYWpvci9taW5vciBudW1iZXIgZnJvbSBrZXJuZWwuCisgKgkJCQkJZ2VvbSAtIFBvaW50ZXIgdG8gaW50ZWdlciBhcnJheSB0byBwbGFjZSBnZW9tZXRyeSBkYXRhLgorICoKKyAqCVJldHVybnM6CQl6ZXJvLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBjaTIyMjBpX0Jpb3NQYXJhbSAoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsCisJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgZ2VvbVtdKQorCXsKKwlQT1VSX0RFVklDRQlwZGV2OworCisJaWYgKCAhKEhPU1REQVRBKHNkZXYtPmhvc3QpKS0+YXRhcGkgKQorCQl7CisJCXBkZXYgPSAmKEhPU1REQVRBKHNkZXYtPmhvc3QpLT5kZXZpY2Vbc2Rldi0+aWRdKTsKKworCQlnZW9tWzBdID0gcGRldi0+aGVhZHM7CisJCWdlb21bMV0gPSBwZGV2LT5zZWN0b3JzOworCQlnZW9tWzJdID0gcGRldi0+Y3lsaW5kZXJzOworCQl9CisJcmV0dXJuIDA7CisJfQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gInBjaTIyMjBpIiwKKwkubmFtZQkJCT0gIlBDSS0yMjIwSS9QQ0ktMjI0MEkiLAorCS5kZXRlY3QJCQk9IFBjaTIyMjBpX0RldGVjdCwKKwkucmVsZWFzZQkJPSBQY2kyMjIwaV9SZWxlYXNlLAorCS5xdWV1ZWNvbW1hbmQJCT0gUGNpMjIyMGlfUXVldWVDb21tYW5kLAorCS5hYm9ydAkJCT0gUGNpMjIyMGlfQWJvcnQsCisJLnJlc2V0CQkJPSBQY2kyMjIwaV9SZXNldCwKKwkuYmlvc19wYXJhbQkJPSBQY2kyMjIwaV9CaW9zUGFyYW0sCisJLmNhbl9xdWV1ZQkJPSAxLAorCS50aGlzX2lkCQk9IC0xLAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNpMjIyMGkuaCBiL2RyaXZlcnMvc2NzaS9wY2kyMjIwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MjYwNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcGNpMjIyMGkuaApAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGVyY2VwdGl2ZSBTb2x1dGlvbnMsIEluYy4gUENJLTIyMjBJIGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIHBjaTIyMjBpLmggLSBMaW51eCBIb3N0IERyaXZlciBmb3IgUENJLTIyMjBpIEVJREUgQWRhcHRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OSBQZXJjZXB0aXZlIFNvbHV0aW9ucywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UKKyAqIGNvZGUgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIGNvbW1lbnQgd2l0aG91dAorICogbW9kaWZpY2F0aW9uLgorICoKKyAqIFRlY2huaWNhbCB1cGRhdGVzIGFuZCBwcm9kdWN0IGluZm9ybWF0aW9uIGF0OgorICogIGh0dHA6Ly93d3cucHNpZGlzay5jb20KKyAqCisgKiBQbGVhc2Ugc2VuZCBxdWVzdGlvbnMsIGNvbW1lbnRzLCBidWcgcmVwb3J0cyB0bzoKKyAqICB0ZWNoQHBzaWRpc2suY29tIFRlY2huaWNhbCBTdXBwb3J0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9QQ0kyMjIwSV9ICisjZGVmaW5lIF9QQ0kyMjIwSV9ICisKKyNpZm5kZWYgTElOVVhfVkVSU0lPTl9DT0RFCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2VuZGlmIAorI2RlZmluZQlMSU5VWFZFUlNJT04odixwLHMpICAgICgoKHYpPDwxNikgKyAoKHApPDw4KSArIChzKSkKKworLy8gZnVuY3Rpb24gcHJvdG90eXBlcworaW50IFBjaTIyMjBpX0RldGVjdAkJCShTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQpOworaW50IFBjaTIyMjBpX0NvbW1hbmQJCShTY3NpX0NtbmQgKlNDcG50KTsKK2ludCBQY2kyMjIwaV9RdWV1ZUNvbW1hbmQJKFNjc2lfQ21uZCAqU0NwbnQsIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpOworaW50IFBjaTIyMjBpX0Fib3J0CQkJKFNjc2lfQ21uZCAqU0NwbnQpOworaW50IFBjaTIyMjBpX1Jlc2V0CQkJKFNjc2lfQ21uZCAqU0NwbnQsIHVuc2lnbmVkIGludCBmbGFncyk7CitpbnQgUGNpMjIyMGlfUmVsZWFzZQkJKHN0cnVjdCBTY3NpX0hvc3QgKnBzaG9zdCk7CitpbnQgUGNpMjIyMGlfQmlvc1BhcmFtCQkoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQkJCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsCisJCQkJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgZ2VvbVtdKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9LY29uZmlnIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTIxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL0tjb25maWcKQEAgLTAsMCArMSw4MiBAQAorIworIyBQQ01DSUEgU0NTSSBhZGFwdGVyIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudSAiUENNQ0lBIFNDU0kgYWRhcHRlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0NTSSE9biAmJiBQQ01DSUEhPW4gJiYgTU9EVUxFUworCitjb25maWcgUENNQ0lBX0FIQTE1MlgKKwl0cmlzdGF0ZSAiQWRhcHRlYyBBSEExNTJYIFBDTUNJQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gbSAmJiAhNjRCSVQKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIHRoaXMgdHlwZSBvZiBQQ01DSUEgU0NTSSBob3N0CisJICBhZGFwdGVyIHRvIHlvdXIgY29tcHV0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFoYTE1MnhfY3MuCisKK2NvbmZpZyBQQ01DSUFfRkRPTUFJTgorCXRyaXN0YXRlICJGdXR1cmUgRG9tYWluIFBDTUNJQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gbQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggdGhpcyB0eXBlIG9mIFBDTUNJQSBTQ1NJIGhvc3QKKwkgIGFkYXB0ZXIgdG8geW91ciBjb21wdXRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZmRvbWFpbl9jcy4KKworY29uZmlnIFBDTUNJQV9OSU5KQV9TQ1NJCisJdHJpc3RhdGUgIk5pbmphU0NTSS0zIC8gTmluamFTQ1NJLTMyQmkgKDE2Yml0KSBQQ01DSUEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIG0gJiYgITY0QklUCisJaGVscAorCSAgSWYgeW91IGludGVuZCB0byBhdHRhY2ggdGhpcyB0eXBlIG9mIFBDTUNJQSBTQ1NJIGhvc3QgYWRhcHRlciB0bworCSAgeW91ciBjb21wdXRlciwgc2F5IFkgaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zY3NpL05pbmphU0NTSS50eHQ+LgorCisJICBTdXBwb3J0ZWQgY2FyZHM6CisKKwkgIE5pbmphU0NTSS0zOiAodmVyc2lvbiBzdHJpbmc6ICJXQlQiLCJOaW5qYVNDU0ktMyIsIlIxLjAiKQorCSAgICBJTy1EQVRBICAgICBQQ1NDLUZQCisJICAgIEFMUEhBIERBVEEgIEFELVBDUzIwMQorCSAgICBDeVEndmUgICAgICBTRkMtMjAxICAKKwkgICAgTE9HSVRFQ0ggICAgTFBNLVNDU0kyRQorCSAgICBQaW9uZWVyIFBDUi1QUjI0J3MgY2FyZAorCSAgICBJLU8gREFUQSBDRFBTLVBYMjQncyBjYXJkIChQQ1NDLUYpCisJICAgIFBhbmFzb25pYyBLWEwtUlcxMEFOIENELVJXJ3MgY2FyZAorCSAgICBldGMuCisKKwkgIE5pbmphU0NTSS0zMkJpdCAoaW4gMTZiaXQgbW9kZSk6CisJICAgIFtXb3JrYml0ICh2ZXJzaW9uIHN0cmluZzogIldPUktCSVQiLCJVbHRyYU5pbmphLTE2IiwiMSIpXQorCSAgICBKYXp6IFNDUDA1MAorCSAgICBbSS1PIERBVEEgKE9FTSkgKHZlcnNpb24gc3RyaW5nOiAiSU8gREFUQSIsIkNCU0MxNiAgICAgICAiLCIxIildCisJICAgIEktTyBEQVRBIENCU0MtSUkKKwkgICAgW0t5dXN5dSBNYXRzdXNoaXRhIEtvdG9idWtpIChPRU0pCisgICAgICAgICAgICAgICAodmVyc2lvbiBzdHJpbmc6ICJLTUUgICAgIiwiU0NTSS1DQVJELTAwMSIsIjEiKV0KKwkgICAgS01FIEtYTC04MjBBTidzIGNhcmQKKwkgICAgSFAgTTgyMGUgQ0RSVydzIGNhcmQKKwkgICAgZXRjLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBuc3BfY3MuCisKK2NvbmZpZyBQQ01DSUFfUUxPR0lDCisJdHJpc3RhdGUgIlFsb2dpYyBQQ01DSUEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIG0KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIHRoaXMgdHlwZSBvZiBQQ01DSUEgU0NTSSBob3N0CisJICBhZGFwdGVyIHRvIHlvdXIgY29tcHV0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHFsb2dpY19jcy4KKworY29uZmlnIFBDTUNJQV9TWU01M0M1MDAKKwl0cmlzdGF0ZSAiU3ltYmlvcyA1M2M1MDAgUENNQ0lBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBtCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIE5ldyBNZWRpYSBCdXMgVG9hc3RlciBvciBvdGhlciBQQ01DSUEKKwkgIFNDU0kgYWRhcHRlciBiYXNlZCBvbiB0aGUgU3ltYmlvcyA1M2M1MDAgY29udHJvbGxlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc3ltNTNjNTAwX2NzLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2EzNzkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9NYWtlZmlsZQpAQCAtMCwwICsxLDEzIEBACisKK0VYVFJBX0NGTEFHUwkJKz0gLUlkcml2ZXJzL3Njc2kKKworIyAxNi1iaXQgY2xpZW50IGRyaXZlcnMKK29iai0kKENPTkZJR19QQ01DSUFfUUxPR0lDKQkrPSBxbG9naWNfY3Mubworb2JqLSQoQ09ORklHX1BDTUNJQV9GRE9NQUlOKQkrPSBmZG9tYWluX2NzLm8KK29iai0kKENPTkZJR19QQ01DSUFfQUhBMTUyWCkJKz0gYWhhMTUyeF9jcy5vCitvYmotJChDT05GSUdfUENNQ0lBX05JTkpBX1NDU0kpCSs9IG5zcF9jcy5vCitvYmotJChDT05GSUdfUENNQ0lBX1NZTTUzQzUwMCkJKz0gc3ltNTNjNTAwX2NzLm8KKworYWhhMTUyeF9jcy1vYmpzCTo9IGFoYTE1Mnhfc3R1Yi5vIGFoYTE1MnhfY29yZS5vCitmZG9tYWluX2NzLW9ianMJOj0gZmRvbWFpbl9zdHViLm8gZmRvbWFpbl9jb3JlLm8KK3Fsb2dpY19jcy1vYmpzCTo9IHFsb2dpY19zdHViLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9jb3JlLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL2FoYTE1MnhfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYTM3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL2FoYTE1MnhfY29yZS5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBQQ01DSUEJMQorI2RlZmluZSBBSEExNTJYX1NUQVQgMQorI2luY2x1ZGUgImFoYTE1MnguYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9zdHViLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL2FoYTE1Mnhfc3R1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MGI0YzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL2FoYTE1Mnhfc3R1Yi5jCkBAIC0wLDAgKzEsMzQzIEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEEgZHJpdmVyIGZvciBBZGFwdGVjIEFIQTE1MlgtY29tcGF0aWJsZSBQQ01DSUEgU0NTSSBjYXJkcy4KKworICAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBBZGFwdGVjIEFIQS0xNDYwLCB0aGUgTmV3IE1lZGlhIEJ1cworICAgIFRvYXN0ZXIsIGFuZCB0aGUgTmV3IE1lZGlhIFRvYXN0ICYgSmFtLgorICAgIAorICAgIGFoYTE1MnhfY3MuYyAxLjU0IDIwMDAvMDYvMTIgMjE6Mjc6MjUKKworICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljCisgICAgTGljZW5zZSBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKworICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUworICAgIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisgICAgVGhlIGluaXRpYWwgZGV2ZWxvcGVyIG9mIHRoZSBvcmlnaW5hbCBjb2RlIGlzIERhdmlkIEEuIEhpbmRzCisgICAgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0Pi4gIFBvcnRpb25zIGNyZWF0ZWQgYnkgRGF2aWQgQS4gSGluZHMKKyAgICBhcmUgQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIEEuIEhpbmRzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSwgaW4gd2hpY2gKKyAgICBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKKyAgICBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICAgIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlCisgICAgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uCisgICAgYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKKyAgICBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUKKyAgICB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcworICAgIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KKyAgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJhaGExNTJ4LmgiCisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKworI2lmZGVmIFBDTUNJQV9ERUJVRworc3RhdGljIGludCBwY19kZWJ1ZyA9IFBDTUNJQV9ERUJVRzsKK21vZHVsZV9wYXJhbShwY19kZWJ1ZywgaW50LCAwNjQ0KTsKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0KKyJhaGExNTJ4X2NzLmMgMS41NCAyMDAwLzA2LzEyIDIxOjI3OjI1IChEYXZpZCBIaW5kcykiOworI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSBzZXQgd2l0aCAnaW5zbW9kJyAqLworCisvKiBTQ1NJIGJ1cyBzZXR1cCBvcHRpb25zICovCitzdGF0aWMgaW50IGhvc3RfaWQgPSA3Oworc3RhdGljIGludCByZWNvbm5lY3QgPSAxOworc3RhdGljIGludCBwYXJpdHkgPSAxOworc3RhdGljIGludCBzeW5jaHJvbm91cyA9IDE7CitzdGF0aWMgaW50IHJlc2V0X2RlbGF5ID0gMTAwOworc3RhdGljIGludCBleHRfdHJhbnMgPSAwOworCittb2R1bGVfcGFyYW0oaG9zdF9pZCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyZWNvbm5lY3QsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocGFyaXR5LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHN5bmNocm9ub3VzLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJlc2V0X2RlbGF5LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGV4dF90cmFucywgaW50LCAwKTsKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTVBML0dQTCIpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3Qgc2NzaV9pbmZvX3QgeworICAgIGRldl9saW5rX3QJCWxpbms7CisgICAgZGV2X25vZGVfdAkJbm9kZTsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0CSpob3N0OworfSBzY3NpX2luZm9fdDsKKworc3RhdGljIHZvaWQgYWhhMTUyeF9yZWxlYXNlX2NzKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIGludCBhaGExNTJ4X2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJCSBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOworCitzdGF0aWMgZGV2X2xpbmtfdCAqYWhhMTUyeF9hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCBhaGExNTJ4X2RldGFjaChkZXZfbGlua190ICopOworCitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3Q7CitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJhaGExNTJ4X2NzIjsKKworc3RhdGljIGRldl9saW5rX3QgKmFoYTE1MnhfYXR0YWNoKHZvaWQpCit7CisgICAgc2NzaV9pbmZvX3QgKmluZm87CisgICAgY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisgICAgZGV2X2xpbmtfdCAqbGluazsKKyAgICBpbnQgcmV0OworICAgIAorICAgIERFQlVHKDAsICJhaGExNTJ4X2F0dGFjaCgpXG4iKTsKKworICAgIC8qIENyZWF0ZSBuZXcgU0NTSSBkZXZpY2UgKi8KKyAgICBpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIWluZm8pIHJldHVybiBOVUxMOworICAgIG1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKyAgICBsaW5rID0gJmluZm8tPmxpbms7IGxpbmstPnByaXYgPSBpbmZvOworCisgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMHgyMDsKKyAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gMTA7CisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkU7CisgICAgbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKKyAgICBsaW5rLT5jb25mLlZjYyA9IDUwOworICAgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IFBSRVNFTlRfT1BUSU9OOworCisgICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgbGluay0+bmV4dCA9IGRldl9saXN0OworICAgIGRldl9saXN0ID0gbGluazsKKyAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZhaGExNTJ4X2V2ZW50OworICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KKwlDU19FVkVOVF9SRVNFVF9SRVFVRVNUIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwlhaGExNTJ4X2RldGFjaChsaW5rKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIGxpbms7Cit9IC8qIGFoYTE1MnhfYXR0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBhaGExNTJ4X2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworICAgIGRldl9saW5rX3QgKipsaW5rcDsKKworICAgIERFQlVHKDAsICJhaGExNTJ4X2RldGFjaCgweCVwKVxuIiwgbGluayk7CisgICAgCisgICAgLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCWlmICgqbGlua3AgPT0gbGluaykgYnJlYWs7CisgICAgaWYgKCpsaW5rcCA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJYWhhMTUyeF9yZWxlYXNlX2NzKGxpbmspOworCisgICAgaWYgKGxpbmstPmhhbmRsZSkKKwlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKyAgICAKKyAgICAvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBiaXRzICovCisgICAgKmxpbmtwID0gbGluay0+bmV4dDsKKyAgICBrZnJlZShsaW5rLT5wcml2KTsKKyAgICAKK30gLyogYWhhMTUyeF9kZXRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgYWhhMTUyeF9jb25maWdfY3MoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBjbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworICAgIHNjc2lfaW5mb190ICppbmZvID0gbGluay0+cHJpdjsKKyAgICBzdHJ1Y3QgYWhhMTUyeF9zZXR1cCBzOworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICBpbnQgaSwgbGFzdF9yZXQsIGxhc3RfZm47CisgICAgdV9jaGFyIHR1cGxlX2RhdGFbNjRdOworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisgICAgCisgICAgREVCVUcoMCwgImFoYTE1MnhfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gdHVwbGVfZGF0YTsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKworICAgIC8qIENvbmZpZ3VyZSBjYXJkICovCisgICAgbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICB3aGlsZSAoMSkgeworCWlmIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpICE9IDAgfHwKKwkJcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpICE9IDApCisJICAgIGdvdG8gbmV4dF9lbnRyeTsKKwkvKiBGb3IgTmV3IE1lZGlhIFQmSiwgbG9vayBmb3IgYSBTQ1NJIHdpbmRvdyAqLworCWlmIChwYXJzZS5jZnRhYmxlX2VudHJ5LmlvLndpblswXS5sZW4gPj0gMHgyMCkKKwkgICAgbGluay0+aW8uQmFzZVBvcnQxID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pby53aW5bMF0uYmFzZTsKKwllbHNlIGlmICgocGFyc2UuY2Z0YWJsZV9lbnRyeS5pby5ud2luID4gMSkgJiYKKwkJIChwYXJzZS5jZnRhYmxlX2VudHJ5LmlvLndpblsxXS5sZW4gPj0gMHgyMCkpCisJICAgIGxpbmstPmlvLkJhc2VQb3J0MSA9IHBhcnNlLmNmdGFibGVfZW50cnkuaW8ud2luWzFdLmJhc2U7CisJaWYgKChwYXJzZS5jZnRhYmxlX2VudHJ5LmlvLm53aW4gPiAwKSAmJgorCSAgICAobGluay0+aW8uQmFzZVBvcnQxIDwgMHhmZmZmKSkgeworCSAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pbmRleDsKKwkgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGhhbmRsZSwgJmxpbmstPmlvKTsKKwkgICAgaWYgKGkgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7CisJfQorICAgIG5leHRfZW50cnk6CisJQ1NfQ0hFQ0soR2V0TmV4dFR1cGxlLCBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICB9CisgICAgCisgICAgQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGhhbmRsZSwgJmxpbmstPmlycSkpOworICAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKyAgICAKKyAgICAvKiBTZXQgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgYWhhMTUyeCBkcml2ZXIgKi8KKyAgICBtZW1zZXQoJnMsIDAsIHNpemVvZihzKSk7CisgICAgcy5jb25mICAgICAgICA9ICJQQ01DSUEgc2V0dXAiOworICAgIHMuaW9fcG9ydCAgICAgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisgICAgcy5pcnEgICAgICAgICA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKyAgICBzLnNjc2lpZCAgICAgID0gaG9zdF9pZDsKKyAgICBzLnJlY29ubmVjdCAgID0gcmVjb25uZWN0OworICAgIHMucGFyaXR5ICAgICAgPSBwYXJpdHk7CisgICAgcy5zeW5jaHJvbm91cyA9IHN5bmNocm9ub3VzOworICAgIHMuZGVsYXkgICAgICAgPSByZXNldF9kZWxheTsKKyAgICBpZiAoZXh0X3RyYW5zKQorICAgICAgICBzLmV4dF90cmFucyA9IGV4dF90cmFuczsKKworICAgIGhvc3QgPSBhaGExNTJ4X3Byb2JlX29uZSgmcyk7CisgICAgaWYgKGhvc3QgPT0gTlVMTCkgeworCXByaW50ayhLRVJOX0lORk8gImFoYTE1MnhfY3M6IG5vIFNDU0kgZGV2aWNlcyBmb3VuZFxuIik7CisJZ290byBjc19mYWlsZWQ7CisgICAgfQorCisgICAgc3ByaW50ZihpbmZvLT5ub2RlLmRldl9uYW1lLCAic2NzaSVkIiwgaG9zdC0+aG9zdF9ubyk7CisgICAgbGluay0+ZGV2ID0gJmluZm8tPm5vZGU7CisgICAgaW5mby0+aG9zdCA9IGhvc3Q7CisKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworICAgIHJldHVybjsKKyAgICAKK2NzX2ZhaWxlZDoKKyAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKKyAgICBhaGExNTJ4X3JlbGVhc2VfY3MobGluayk7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBhaGExNTJ4X3JlbGVhc2VfY3MoZGV2X2xpbmtfdCAqbGluaykKK3sKKwlzY3NpX2luZm9fdCAqaW5mbyA9IGxpbmstPnByaXY7CisKKwlhaGExNTJ4X3JlbGVhc2UoaW5mby0+aG9zdCk7CisJbGluay0+ZGV2ID0gTlVMTDsKKyAgICAKKwlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCXBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworICAgIAorCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworfQorCitzdGF0aWMgaW50IGFoYTE1MnhfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKyAgICBkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisgICAgc2NzaV9pbmZvX3QgKmluZm8gPSBsaW5rLT5wcml2OworICAgIAorICAgIERFQlVHKDAsICJhaGExNTJ4X2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKyAgICAKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJICAgIGFoYTE1MnhfcmVsZWFzZV9jcyhsaW5rKTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCWxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworCWFoYTE1MnhfY29uZmlnX2NzKGxpbmspOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgU2NzaV9DbW5kIHRtcDsKKwkgICAgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKwkgICAgdG1wLmRldmljZS0+aG9zdCA9IGluZm8tPmhvc3Q7CisJICAgIGFoYTE1MnhfaG9zdF9yZXNldCgmdG1wKTsKKwl9CisJYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgYWhhMTUyeF9jc19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJhaGExNTJ4X2NzIiwKKwl9LAorCS5hdHRhY2gJCT0gYWhhMTUyeF9hdHRhY2gsCisJLmRldGFjaAkJPSBhaGExNTJ4X2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYWhhMTUyeF9jcyh2b2lkKQoreworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZhaGExNTJ4X2NzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2FoYTE1MnhfY3Modm9pZCkKK3sKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJmFoYTE1MnhfY3NfZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfYWhhMTUyeF9jcyk7Cittb2R1bGVfZXhpdChleGl0X2FoYTE1MnhfY3MpOworIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9mZG9tYWluX2NvcmUuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvZmRvbWFpbl9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4OTEzNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvZmRvbWFpbl9jb3JlLmMKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIFBDTUNJQSAxCisjaW5jbHVkZSAiZmRvbWFpbi5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9mZG9tYWluX3N0dWIuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvZmRvbWFpbl9zdHViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RmN2JjNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvZmRvbWFpbl9zdHViLmMKQEAgLTAsMCArMSwzMjMgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQSBkcml2ZXIgZm9yIEZ1dHVyZSBEb21haW4tY29tcGF0aWJsZSBQQ01DSUEgU0NTSSBjYXJkcworCisgICAgZmRvbWFpbl9jcy5jIDEuNDcgMjAwMS8xMC8xMyAwMDowODo1MgorCisgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMKKyAgICBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworCisgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTCisgICAgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyAgICBUaGUgaW5pdGlhbCBkZXZlbG9wZXIgb2YgdGhlIG9yaWdpbmFsIGNvZGUgaXMgRGF2aWQgQS4gSGluZHMKKyAgICA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LiAgUG9ydGlvbnMgY3JlYXRlZCBieSBEYXZpZCBBLiBIaW5kcworICAgIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgQS4gSGluZHMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpLCBpbgorICAgIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZQorICAgIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgICAgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UKKyAgICB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24KKyAgICBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQorICAgIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZQorICAgIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzCisgICAgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgorICAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgImZkb21haW4uaCIKKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KKworTU9EVUxFX0FVVEhPUigiRGF2aWQgSGluZHMgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJGdXR1cmUgRG9tYWluIFBDTUNJQSBTQ1NJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTVBML0dQTCIpOworCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgaW50IHBjX2RlYnVnID0gUENNQ0lBX0RFQlVHOworbW9kdWxlX3BhcmFtKHBjX2RlYnVnLCBpbnQsIDApOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBpZiAocGNfZGVidWc+KG4pKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKQorc3RhdGljIGNoYXIgKnZlcnNpb24gPQorImZkb21haW5fY3MuYyAxLjQ3IDIwMDEvMTAvMTMgMDA6MDg6NTIgKERhdmlkIEhpbmRzKSI7CisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit0eXBlZGVmIHN0cnVjdCBzY3NpX2luZm9fdCB7CisgICAgZGV2X2xpbmtfdAkJbGluazsKKyAgICBkZXZfbm9kZV90CQlub2RlOworICAgIHN0cnVjdCBTY3NpX0hvc3QJKmhvc3Q7Cit9IHNjc2lfaW5mb190OworCisKK3N0YXRpYyB2b2lkIGZkb21haW5fcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgZmRvbWFpbl9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCQlldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOworCitzdGF0aWMgZGV2X2xpbmtfdCAqZmRvbWFpbl9hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCBmZG9tYWluX2RldGFjaChkZXZfbGlua190ICopOworCisKK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdCA9IE5VTEw7CisKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gImZkb21haW5fY3MiOworCitzdGF0aWMgZGV2X2xpbmtfdCAqZmRvbWFpbl9hdHRhY2godm9pZCkKK3sKKyAgICBzY3NpX2luZm9fdCAqaW5mbzsKKyAgICBjbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIGludCByZXQ7CisgICAgCisgICAgREVCVUcoMCwgImZkb21haW5fYXR0YWNoKClcbiIpOworCisgICAgLyogQ3JlYXRlIG5ldyBTQ1NJIGRldmljZSAqLworICAgIGluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworICAgIGlmICghaW5mbykgcmV0dXJuIE5VTEw7CisgICAgbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworICAgIGxpbmsgPSAmaW5mby0+bGluazsgbGluay0+cHJpdiA9IGluZm87CisgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMHgxMDsKKyAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gMTA7CisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkU7CisgICAgbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKKyAgICBsaW5rLT5jb25mLlZjYyA9IDUwOworICAgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IFBSRVNFTlRfT1BUSU9OOworCisgICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgbGluay0+bmV4dCA9IGRldl9saXN0OworICAgIGRldl9saXN0ID0gbGluazsKKyAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZmZG9tYWluX2V2ZW50OworICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KKwlDU19FVkVOVF9SRVNFVF9SRVFVRVNUIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwlmZG9tYWluX2RldGFjaChsaW5rKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIGxpbms7Cit9IC8qIGZkb21haW5fYXR0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBmZG9tYWluX2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworICAgIGRldl9saW5rX3QgKipsaW5rcDsKKworICAgIERFQlVHKDAsICJmZG9tYWluX2RldGFjaCgweCVwKVxuIiwgbGluayk7CisgICAgCisgICAgLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCWlmICgqbGlua3AgPT0gbGluaykgYnJlYWs7CisgICAgaWYgKCpsaW5rcCA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJZmRvbWFpbl9yZWxlYXNlKGxpbmspOworCisgICAgaWYgKGxpbmstPmhhbmRsZSkKKwlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKyAgICAKKyAgICAvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBiaXRzICovCisgICAgKmxpbmtwID0gbGluay0+bmV4dDsKKyAgICBrZnJlZShsaW5rLT5wcml2KTsKKyAgICAKK30gLyogZmRvbWFpbl9kZXRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgZmRvbWFpbl9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBjbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworICAgIHNjc2lfaW5mb190ICppbmZvID0gbGluay0+cHJpdjsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIGNpc3BhcnNlX3QgcGFyc2U7CisgICAgaW50IGksIGxhc3RfcmV0LCBsYXN0X2ZuOworICAgIHVfY2hhciB0dXBsZV9kYXRhWzY0XTsKKyAgICBjaGFyIHN0clsxNl07CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKworICAgIERFQlVHKDAsICJmZG9tYWluX2NvbmZpZygweCVwKVxuIiwgbGluayk7CisKKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IHR1cGxlX2RhdGE7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisgICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisKKyAgICAvKiBDb25maWd1cmUgY2FyZCAqLworICAgIGxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisgICAgCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIHdoaWxlICgxKSB7CisJaWYgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkgIT0gMCB8fAorCQlwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkgIT0gMCkKKwkgICAgZ290byBuZXh0X2VudHJ5OworCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmluZGV4OworCWxpbmstPmlvLkJhc2VQb3J0MSA9IHBhcnNlLmNmdGFibGVfZW50cnkuaW8ud2luWzBdLmJhc2U7CisJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGhhbmRsZSwgJmxpbmstPmlvKTsKKwlpZiAoaSA9PSBDU19TVUNDRVNTKSBicmVhazsKKyAgICBuZXh0X2VudHJ5OgorCUNTX0NIRUNLKEdldE5leHRUdXBsZSwgcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgfQorCisgICAgQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGhhbmRsZSwgJmxpbmstPmlycSkpOworICAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKyAgICAKKyAgICAvKiBBIGJhZCBoYWNrLi4uICovCisgICAgcmVsZWFzZV9yZWdpb24obGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pby5OdW1Qb3J0czEpOworCisgICAgLyogU2V0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGZkb21haW4gZHJpdmVyICovCisgICAgc3ByaW50ZihzdHIsICIlZCwlZCIsIGxpbmstPmlvLkJhc2VQb3J0MSwgbGluay0+aXJxLkFzc2lnbmVkSVJRKTsKKyAgICBmZG9tYWluX3NldHVwKHN0cik7CisgICAgCisgICAgaG9zdCA9IF9fZmRvbWFpbl8xNngwX2RldGVjdCgmZmRvbWFpbl9kcml2ZXJfdGVtcGxhdGUpOworICAgIGlmICghaG9zdCkgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJmZG9tYWluX2NzOiBubyBTQ1NJIGRldmljZXMgZm91bmRcbiIpOworCWdvdG8gY3NfZmFpbGVkOworICAgIH0KKyAKKyAgICBzY3NpX2FkZF9ob3N0KGhvc3QsIE5VTEwpOyAvKiBYWFggaGFuZGxlIGZhaWx1cmUgKi8KKyAgICBzY3NpX3NjYW5faG9zdChob3N0KTsKKworICAgIHNwcmludGYoaW5mby0+bm9kZS5kZXZfbmFtZSwgInNjc2klZCIsIGhvc3QtPmhvc3Rfbm8pOworICAgIGxpbmstPmRldiA9ICZpbmZvLT5ub2RlOworICAgIGluZm8tPmhvc3QgPSBob3N0OworICAgIAorICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgcmV0dXJuOworICAgIAorY3NfZmFpbGVkOgorICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworICAgIGZkb21haW5fcmVsZWFzZShsaW5rKTsKKyAgICByZXR1cm47CisgICAgCit9IC8qIGZkb21haW5fY29uZmlnICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBmZG9tYWluX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzY3NpX2luZm9fdCAqaW5mbyA9IGxpbmstPnByaXY7CisKKyAgICBERUJVRygwLCAiZmRvbWFpbl9yZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKworICAgIHNjc2lfcmVtb3ZlX2hvc3QoaW5mby0+aG9zdCk7CisgICAgbGluay0+ZGV2ID0gTlVMTDsKKyAgICAKKyAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgICAgcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworICAgIHBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworCisgICAgc2NzaV91bnJlZ2lzdGVyKGluZm8tPmhvc3QpOworCisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGZkb21haW5fZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworICAgIGRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKworICAgIERFQlVHKDEsICJmZG9tYWluX2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKyAgICAKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJICAgIGZkb21haW5fcmVsZWFzZShsaW5rKTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCWxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworCWZkb21haW5fY29uZmlnKGxpbmspOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKwkgICAgZmRvbWFpbl8xNngwX2J1c19yZXNldChOVUxMKTsKKwl9CisJYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfSAvKiBmZG9tYWluX2V2ZW50ICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBmZG9tYWluX2NzX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gImZkb21haW5fY3MiLAorCX0sCisJLmF0dGFjaAkJPSBmZG9tYWluX2F0dGFjaCwKKwkuZGV0YWNoCQk9IGZkb21haW5fZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9mZG9tYWluX2NzKHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJmZkb21haW5fY3NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfZmRvbWFpbl9jcyh2b2lkKQoreworCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmZmRvbWFpbl9jc19kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9mZG9tYWluX2NzKTsKK21vZHVsZV9leGl0KGV4aXRfZmRvbWFpbl9jcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5jIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTZjNDEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfY3MuYwpAQCAtMCwwICsxLDIxOTggQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgTmluamFTQ1NJLTMgLyBOaW5qYVNDU0ktMzJCaSBQQ01DSUEgU0NTSSBob3N0IGFkYXB0ZXIgY2FyZCBkcml2ZXIKKyAgICAgIEJ5OiBZT0tPVEEgSGlyb3NoaSA8eW9rb3RhQG5ldGxhYi5pcy50c3VrdWJhLmFjLmpwPgorCisgICAgVmVyLjIuOCAgIFN1cHBvcnQgMzJiaXQgTU1JTyBtb2RlCisgICAgICAgICAgICAgIFN1cHBvcnQgU3luY2hyb25vdXMgRGF0YSBUcmFuc2ZlciBSZXF1ZXN0IChTRFRSKSBtb2RlCisgICAgVmVyLjIuMCAgIFN1cHBvcnQgMzJiaXQgUElPIG1vZGUKKyAgICBWZXIuMS4xLjIgRml4IGZvciBzY2F0dGVyIGxpc3QgYnVmZmVyIGV4Y2VlZHMKKyAgICBWZXIuMS4xICAgU3VwcG9ydCBzY2F0dGVyIGxpc3QKKyAgICBWZXIuMC4xICAgSW5pdGlhbCB2ZXJzaW9uCisKKyAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgVGhpcyBkcml2ZXIgaXMgZm9yIHRoZXNlIFBDY2FyZHMuCisKKwlJLU8gREFUQSBQQ1NDLUYJIChXb3JrYml0IE5pbmphU0NTSS0zKQorCQkJIldCVCIsICJOaW5qYVNDU0ktMyIsICJSMS4wIgorCUktTyBEQVRBIENCU0MtSUkgKFdvcmtiaXQgTmluamFTQ1NJLTMyQmkgaW4gMTZiaXQgbW9kZSkKKwkJCSJJTyBEQVRBIiwgIkNCU0MxNgkgIiwgIjEiCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAkSWQ6IG5zcF9jcy5jLHYgMS4yMyAyMDAzLzA4LzE4IDExOjA5OjE5IGVsY2EgRXhwICQgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8Li4vZHJpdmVycy9zY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisKKyNpbmNsdWRlICJuc3BfY3MuaCIKKworTU9EVUxFX0FVVEhPUigiWU9LT1RBIEhpcm9zaGkgPHlva290YUBuZXRsYWIuaXMudHN1a3ViYS5hYy5qcD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiV29ya0JpdCBOaW5qYVNDU0ktMyAvIE5pbmphU0NTSS0zMkJpKDE2Yml0KSBQQ01DSUEgU0NTSSBob3N0IGFkYXB0ZXIgbW9kdWxlICRSZXZpc2lvbjogMS4yMyAkIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgic2Qsc3Isc2csc3QiKTsKKyNpZmRlZiBNT0RVTEVfTElDRU5TRQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworI2VuZGlmCisKKyNpbmNsdWRlICJuc3BfaW8uaCIKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCB3aXRoICdpbnNtb2QnICovCisKK3N0YXRpYyBpbnQgICAgICAgbnNwX2J1cnN0X21vZGUgPSBCVVJTVF9NRU0zMjsKK21vZHVsZV9wYXJhbShuc3BfYnVyc3RfbW9kZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobnNwX2J1cnN0X21vZGUsICJCdXJzdCB0cmFuc2ZlciBtb2RlICgwPWlvOCwgMT1pbzMyLCAyPW1lbTMyKGRlZmF1bHQpKSIpOworCisvKiBSZWxlYXNlIElPIHBvcnRzIGFmdGVyIGNvbmZpZ3VyYXRpb24/ICovCitzdGF0aWMgaW50ICAgICAgIGZyZWVfcG9ydHMgPSAwOworbW9kdWxlX3BhcmFtKGZyZWVfcG9ydHMsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhmcmVlX3BvcnRzLCAiUmVsZWFzZSBJTyBwb3J0cyBhZnRlciBjb25maWd1cmF0aW9uPyAoZGVmYXVsdDogMCAoPW5vKSkiKTsKKworLyogL3Vzci9zcmMvbGludXgvZHJpdmVycy9zY3NpL2hvc3RzLmggKi8KK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgbnNwX2RyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCSAgICAgICAgID0gIm5zcF9jcyIsCisJLnByb2NfaW5mbwkJID0gbnNwX3Byb2NfaW5mbywKKwkubmFtZQkJCSA9ICJXb3JrQml0IE5pbmphU0NTSS0zLzMyQmkoMTZiaXQpIiwKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorCS5kZXRlY3QJCQkgPSBuc3BfZGV0ZWN0X29sZCwKKwkucmVsZWFzZQkJID0gbnNwX3JlbGVhc2Vfb2xkLAorI2VuZGlmCisJLmluZm8JCQkgPSBuc3BfaW5mbywKKwkucXVldWVjb21tYW5kCQkgPSBuc3BfcXVldWVjb21tYW5kLAorLyoJLmVoX3N0cmF0ZWd5X2hhbmRsZXIJID0gbnNwX2VoX3N0cmF0ZWd5LCovCisvKgkuZWhfYWJvcnRfaGFuZGxlcgkgPSBuc3BfZWhfYWJvcnQsKi8KKy8qCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9IG5zcF9laF9kZXZpY2VfcmVzZXQsKi8KKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJID0gbnNwX2VoX2J1c19yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCSA9IG5zcF9laF9ob3N0X3Jlc2V0LAorCS5jYW5fcXVldWUJCSA9IDEsCisJLnRoaXNfaWQJCSA9IE5TUF9JTklUSUFUT1JfSUQsCisJLnNnX3RhYmxlc2l6ZQkJID0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJID0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCSA9IERJU0FCTEVfQ0xVU1RFUklORywKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDIpKQorCS51c2VfbmV3X2VoX2NvZGUJID0gMSwKKyNlbmRpZgorfTsKKworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0ID0gTlVMTDsKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvICA9IHsibnNwX2NzIn07CisKK3N0YXRpYyBuc3BfaHdfZGF0YSBuc3BfZGF0YV9iYXNlOyAvKiBhdHRhY2ggPC0+IGRldGVjdCBnbHVlICovCisKKworCisvKgorICogZGVidWcsIGVycm9yIHByaW50CisgKi8KKyNpZm5kZWYgTlNQX0RFQlVHCisjIGRlZmluZSBOU1BfREVCVUdfTUFTSwkJMHgwMDAwMDAKKyMgZGVmaW5lIG5zcF9tc2codHlwZSwgYXJncy4uLikgbnNwX2NzX21lc3NhZ2UoIiIsIDAsICh0eXBlKSwgYXJncykKKyMgZGVmaW5lIG5zcF9kYmcobWFzaywgYXJncy4uLikgLyogKi8KKyNlbHNlCisjIGRlZmluZSBOU1BfREVCVUdfTUFTSwkJMHhmZmZmZmYKKyMgZGVmaW5lIG5zcF9tc2codHlwZSwgYXJncy4uLikgXAorCW5zcF9jc19tZXNzYWdlIChfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAodHlwZSksIGFyZ3MpCisjIGRlZmluZSBuc3BfZGJnKG1hc2ssIGFyZ3MuLi4pIFwKKwluc3BfY3NfZG1lc3NhZ2UoX19GVU5DVElPTl9fLCBfX0xJTkVfXywgKG1hc2spLCBhcmdzKQorI2VuZGlmCisKKyNkZWZpbmUgTlNQX0RFQlVHX1FVRVVFQ09NTUFORAkJQklUKDApCisjZGVmaW5lIE5TUF9ERUJVR19SRUdJU1RFUgkJQklUKDEpCisjZGVmaW5lIE5TUF9ERUJVR19BVVRPU0NTSQkJQklUKDIpCisjZGVmaW5lIE5TUF9ERUJVR19JTlRSCQkJQklUKDMpCisjZGVmaW5lIE5TUF9ERUJVR19TR0xJU1QJCUJJVCg0KQorI2RlZmluZSBOU1BfREVCVUdfQlVTRlJFRQkJQklUKDUpCisjZGVmaW5lIE5TUF9ERUJVR19DREJfQ09OVEVOVFMJCUJJVCg2KQorI2RlZmluZSBOU1BfREVCVUdfUkVTRUxFQ1RJT04JCUJJVCg3KQorI2RlZmluZSBOU1BfREVCVUdfTVNHSU5PQ0NVUgkJQklUKDgpCisjZGVmaW5lIE5TUF9ERUJVR19FRVBST00JCUJJVCg5KQorI2RlZmluZSBOU1BfREVCVUdfTVNHT1VUT0NDVVIJCUJJVCgxMCkKKyNkZWZpbmUgTlNQX0RFQlVHX0JVU1JFU0VUCQlCSVQoMTEpCisjZGVmaW5lIE5TUF9ERUJVR19SRVNUQVJUCQlCSVQoMTIpCisjZGVmaW5lIE5TUF9ERUJVR19TWU5DCQkJQklUKDEzKQorI2RlZmluZSBOU1BfREVCVUdfV0FJVAkJCUJJVCgxNCkKKyNkZWZpbmUgTlNQX0RFQlVHX1RBUkdFVEZMQUcJCUJJVCgxNSkKKyNkZWZpbmUgTlNQX0RFQlVHX1BST0MJCQlCSVQoMTYpCisjZGVmaW5lIE5TUF9ERUJVR19JTklUCQkJQklUKDE3KQorI2RlZmluZSBOU1BfREVCVUdfREFUQV9JTyAgICAgIAkJQklUKDE4KQorI2RlZmluZSBOU1BfU1BFQ0lBTF9QUklOVF9SRUdJU1RFUglCSVQoMjApCisKKyNkZWZpbmUgTlNQX0RFQlVHX0JVRl9MRU4JCTE1MAorCitzdGF0aWMgdm9pZCBuc3BfY3NfbWVzc2FnZShjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSwgY2hhciAqdHlwZSwgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWNoYXIgYnVmW05TUF9ERUJVR19CVUZfTEVOXTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisjaWZuZGVmIE5TUF9ERUJVRworCXByaW50aygiJXNuc3BfY3M6ICVzXG4iLCB0eXBlLCBidWYpOworI2Vsc2UKKwlwcmludGsoIiVzbnNwX2NzOiAlcyAoJWQpOiAlc1xuIiwgdHlwZSwgZnVuYywgbGluZSwgYnVmKTsKKyNlbmRpZgorfQorCisjaWZkZWYgTlNQX0RFQlVHCitzdGF0aWMgdm9pZCBuc3BfY3NfZG1lc3NhZ2UoY29uc3QgY2hhciAqZnVuYywgaW50IGxpbmUsIGludCBtYXNrLCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY2hhciBidWZbTlNQX0RFQlVHX0JVRl9MRU5dOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwl2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwlpZiAobWFzayAmIE5TUF9ERUJVR19NQVNLKSB7CisJCXByaW50aygibnNwX2NzLWRlYnVnOiAweCV4ICVzICglZCk6ICVzXG4iLCBtYXNrLCBmdW5jLCBsaW5lLCBidWYpOworCX0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2xlbmF1cCBwYXJhbWV0ZXJzIGFuZCBjYWxsIGRvbmUoKSBmdW5jdGlvbnMuCisgKiBZb3UgbXVzdCBiZSBzZXQgU0NwbnQtPnJlc3VsdCBiZWZvcmUgY2FsbCB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBuc3Bfc2NzaV9kb25lKFNjc2lfQ21uZCAqU0NwbnQpCit7CisJbnNwX2h3X2RhdGEgKmRhdGEgPSAobnNwX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCWRhdGEtPkN1cnJlbnRTQyA9IE5VTEw7CisKKwlTQ3BudC0+c2NzaV9kb25lKFNDcG50KTsKK30KKworc3RhdGljIGludCBuc3BfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqU0NwbnQsIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpCit7CisjaWZkZWYgTlNQX0RFQlVHCisJLyp1bnNpZ25lZCBpbnQgaG9zdF9pZCA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPnRoaXNfaWQ7Ki8KKwkvKnVuc2lnbmVkIGludCBiYXNlICAgID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsqLworCXVuc2lnbmVkIGNoYXIgdGFyZ2V0ID0gU0NwbnQtPmRldmljZS0+aWQ7CisjZW5kaWYKKwluc3BfaHdfZGF0YSAqZGF0YSA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJbnNwX2RiZyhOU1BfREVCVUdfUVVFVUVDT01NQU5ELCAiU0NwbnQ9MHglcCB0YXJnZXQ9JWQgbHVuPSVkIGJ1ZmY9MHglcCBidWZmbGVuPSVkIHVzZV9zZz0lZCIsCisJCSAgIFNDcG50LCB0YXJnZXQsIFNDcG50LT5kZXZpY2UtPmx1biwgU0NwbnQtPnJlcXVlc3RfYnVmZmVyLCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuLCBTQ3BudC0+dXNlX3NnKTsKKwkvL25zcF9kYmcoTlNQX0RFQlVHX1FVRVVFQ09NTUFORCwgImJlZm9yZSBDdXJyZW50U0M9MHglcCIsIGRhdGEtPkN1cnJlbnRTQyk7CisKKwlTQ3BudC0+c2NzaV9kb25lCT0gZG9uZTsKKworCWlmIChkYXRhLT5DdXJyZW50U0MgIT0gTlVMTCkgeworCQluc3BfbXNnKEtFUk5fREVCVUcsICJDdXJyZW50U0MhPU5VTEwgdGhpcyBjYW4ndCBiZSBoYXBwZW4iKTsKKwkJU0NwbnQtPnJlc3VsdCAgID0gRElEX0JBRF9UQVJHRVQgPDwgMTY7CisJCW5zcF9zY3NpX2RvbmUoU0NwbnQpOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZiAwCisJLyogWFhYOiBwY21jaWEtY3MgZ2VuZXJhdGVzIFNDU0kgY29tbWFuZCB3aXRoICJzY3NpX2luZm8iIHV0aWxpdHkuCisJICAgICAgICBUaGlzIG1ha2VzIGtlcm5lbCBjcmFzaCB3aGVuIHN1c3BlbmRpbmcuLi4gKi8KKwlpZiAoZGF0YS0+U2NzaUluZm8tPnN0b3AgIT0gMCkgeworCQluc3BfbXNnKEtFUk5fSU5GTywgInN1c3BlbmRpbmcgZGV2aWNlLiByZWplY3QgY29tbWFuZC4iKTsKKwkJU0NwbnQtPnJlc3VsdCAgPSBESURfQkFEX1RBUkdFVCA8PCAxNjsKKwkJbnNwX3Njc2lfZG9uZShTQ3BudCk7CisJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCX0KKyNlbmRpZgorCisJc2hvd19jb21tYW5kKFNDcG50KTsKKworCWRhdGEtPkN1cnJlbnRTQwkJPSBTQ3BudDsKKworCVNDcG50LT5TQ3AuU3RhdHVzCT0gQ0hFQ0tfQ09ORElUSU9OOworCVNDcG50LT5TQ3AuTWVzc2FnZQk9IDA7CisJU0NwbnQtPlNDcC5oYXZlX2RhdGFfaW4gPSBJT19VTktOT1dOOworCVNDcG50LT5TQ3Auc2VudF9jb21tYW5kID0gMDsKKwlTQ3BudC0+U0NwLnBoYXNlCT0gUEhfVU5ERVRFUk1JTkVEOworCVNDcG50LT5yZXNpZAkgICAgICAgID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKworCS8qIHNldHVwIHNjcmF0Y2ggYXJlYQorCSAgIFNDcC5wdHIJCTogYnVmZmVyIHBvaW50ZXIKKwkgICBTQ3AudGhpc19yZXNpZHVhbAk6IGJ1ZmZlciBsZW5ndGgKKwkgICBTQ3AuYnVmZmVyCQk6IG5leHQgYnVmZmVyCisJICAgU0NwLmJ1ZmZlcnNfcmVzaWR1YWwgOiBsZWZ0IGJ1ZmZlcnMgaW4gbGlzdAorCSAgIFNDcC5waGFzZQkJOiBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb21tYW5kICovCisJaWYgKFNDcG50LT51c2Vfc2cpIHsKKwkJU0NwbnQtPlNDcC5idWZmZXIJICAgID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBTQ3BudC0+cmVxdWVzdF9idWZmZXI7CisJCVNDcG50LT5TQ3AucHRyCQkgICAgPSBCVUZGRVJfQUREUjsKKwkJU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsICAgID0gU0NwbnQtPlNDcC5idWZmZXItPmxlbmd0aDsKKwkJU0NwbnQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gU0NwbnQtPnVzZV9zZyAtIDE7CisJfSBlbHNlIHsKKwkJU0NwbnQtPlNDcC5wdHIJCSAgICA9IChjaGFyICopIFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwkJU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsICAgID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJU0NwbnQtPlNDcC5idWZmZXIJICAgID0gTlVMTDsKKwkJU0NwbnQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gMDsKKwl9CisKKwlpZiAobnNwaHdfc3RhcnRfc2VsZWN0aW9uKFNDcG50KSA9PSBGQUxTRSkgeworCQluc3BfZGJnKE5TUF9ERUJVR19RVUVVRUNPTU1BTkQsICJzZWxlY3Rpb24gZmFpbCIpOworCQlTQ3BudC0+cmVzdWx0ICAgPSBESURfQlVTX0JVU1kgPDwgMTY7CisJCW5zcF9zY3NpX2RvbmUoU0NwbnQpOworCQlyZXR1cm4gMDsKKwl9CisKKworCS8vbnNwX2RiZyhOU1BfREVCVUdfUVVFVUVDT01NQU5ELCAib3V0Iik7CisjaWZkZWYgTlNQX0RFQlVHCisJZGF0YS0+Q21kSWQrKzsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorICogc2V0dXAgUElPIEZJRk8gdHJhbnNmZXIgbW9kZSBhbmQgZW5hYmxlL2Rpc2FibGUgdG8gZGF0YSBvdXQKKyAqLworc3RhdGljIHZvaWQgbnNwX3NldHVwX2ZpZm8obnNwX2h3X2RhdGEgKmRhdGEsIGludCBlbmFibGVkKQoreworCXVuc2lnbmVkIGludCAgYmFzZSA9IGRhdGEtPkJhc2VBZGRyZXNzOworCXVuc2lnbmVkIGNoYXIgdHJhbnNmZXJfbW9kZV9yZWc7CisKKwkvL25zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJlbmFibGVkPSVkIiwgZW5hYmxlZCk7CisKKwlpZiAoZW5hYmxlZCAhPSBGQUxTRSkgeworCQl0cmFuc2Zlcl9tb2RlX3JlZyA9IFRSQU5TRkVSX0dPIHwgQlJBSU5EOworCX0gZWxzZSB7CisJCXRyYW5zZmVyX21vZGVfcmVnID0gMDsKKwl9CisKKwl0cmFuc2Zlcl9tb2RlX3JlZyB8PSBkYXRhLT5UcmFuc2Zlck1vZGU7CisKKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgVFJBTlNGRVJNT0RFLCB0cmFuc2Zlcl9tb2RlX3JlZyk7Cit9CisKK3N0YXRpYyB2b2lkIG5zcGh3X2luaXRfc3luYyhuc3BfaHdfZGF0YSAqZGF0YSkKK3sKKwlzeW5jX2RhdGEgdG1wX3N5bmMgPSB7IC5TeW5jTmVnb3RpYXRpb24gPSBTWU5DX05PVF9ZRVQsCisJCQkgICAgICAgLlN5bmNQZXJpb2QgICAgICA9IDAsCisJCQkgICAgICAgLlN5bmNPZmZzZXQgICAgICA9IDAKKwl9OworCWludCBpOworCisJLyogc2V0dXAgc3luYyBkYXRhICovCisJZm9yICggaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhdGEtPlN5bmMpOyBpKysgKSB7CisJCWRhdGEtPlN5bmNbaV0gPSB0bXBfc3luYzsKKwl9Cit9CisKKy8qCisgKiBJbml0aWFsaXplIE5pbmphIGhhcmR3YXJlCisgKi8KK3N0YXRpYyBpbnQgbnNwaHdfaW5pdChuc3BfaHdfZGF0YSAqZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgYmFzZSAgICAgPSBkYXRhLT5CYXNlQWRkcmVzczsKKworCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJpbiBiYXNlPTB4JXgiLCBiYXNlKTsKKworCWRhdGEtPlNjc2lDbG9ja0RpdiA9IENMT0NLXzQwTSB8IEZBU1RfMjA7CisJZGF0YS0+Q3VycmVudFNDICAgID0gTlVMTDsKKwlkYXRhLT5GaWZvQ291bnQgICAgPSAwOworCWRhdGEtPlRyYW5zZmVyTW9kZSA9IE1PREVfSU84OworCisJbnNwaHdfaW5pdF9zeW5jKGRhdGEpOworCisJLyogYmxvY2sgYWxsIGludGVycnVwdHMgKi8KKwluc3Bfd3JpdGUoYmFzZSwJICAgICAgSVJRQ09OVFJPTCwgICBJUlFDT05UUk9MX0FMTE1BU0spOworCisJLyogc2V0dXAgU0NTSSBpbnRlcmZhY2UgKi8KKwluc3Bfd3JpdGUoYmFzZSwJICAgICAgSUZTRUxFQ1QsCSAgICBJRl9JRlNFTCk7CisKKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgU0NTSUlSUU1PREUsICAwKTsKKworCW5zcF9pbmRleF93cml0ZShiYXNlLCBUUkFOU0ZFUk1PREUsIE1PREVfSU84KTsKKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgQ0xPQ0tESVYsCSAgICBkYXRhLT5TY3NpQ2xvY2tEaXYpOworCisJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFBBUklUWUNUUkwsICAgMCk7CisJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFBPSU5URVJDTFIsICAgUE9JTlRFUl9DTEVBUiAgICAgfAorCQkJCQkgICAgQUNLX0NPVU5URVJfQ0xFQVIgfAorCQkJCQkgICAgUkVRX0NPVU5URVJfQ0xFQVIgfAorCQkJCQkgICAgSE9TVF9DT1VOVEVSX0NMRUFSKTsKKworCS8qIHNldHVwIGZpZm8gYXNpYyAqLworCW5zcF93cml0ZShiYXNlLAkgICAgICBJRlNFTEVDVCwJICAgIElGX1JFR1NFTCk7CisJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFRFUk1QV1JDVFJMLCAgMCk7CisJaWYgKChuc3BfaW5kZXhfcmVhZChiYXNlLCBPVEhFUkNPTlRST0wpICYgVFBXUl9TRU5TRSkgPT0gMCkgeworCQluc3BfbXNnKEtFUk5fSU5GTywgInRlcm1pbmF0b3IgcG93ZXIgb24iKTsKKwkJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFRFUk1QV1JDVFJMLCBQT1dFUl9PTik7CisJfQorCisJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFRJTUVSQ09VTlQsICAgMCk7CisJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFRJTUVSQ09VTlQsICAgMCk7IC8qIHJlcXVpcmVzIDIgdGltZXMhISAqLworCisJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFNZTkNSRUcsCSAgICAwKTsKKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgQUNLV0lEVEgsCSAgICAwKTsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzIGFuZCBhY2sgdGhlbSAqLworCW5zcF9pbmRleF93cml0ZShiYXNlLCBTQ1NJSVJRTU9ERSwgIFNDU0lfUEhBU0VfQ0hBTkdFX0VJIHwKKwkJCQkJICAgIFJFU0VMRUNUX0VJCQkgfAorCQkJCQkgICAgU0NTSV9SRVNFVF9JUlFfRUkJICk7CisJbnNwX3dyaXRlKGJhc2UsCSAgICAgIElSUUNPTlRST0wsICAgSVJRQ09OVFJPTF9BTExDTEVBUik7CisKKwluc3Bfc2V0dXBfZmlmbyhkYXRhLCBGQUxTRSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIFN0YXJ0IHNlbGVjdGlvbiBwaGFzZQorICovCitzdGF0aWMgaW50IG5zcGh3X3N0YXJ0X3NlbGVjdGlvbihTY3NpX0NtbmQgKlNDcG50KQoreworCXVuc2lnbmVkIGludCAgaG9zdF9pZAkgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT50aGlzX2lkOworCXVuc2lnbmVkIGludCAgYmFzZQkgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OworCXVuc2lnbmVkIGNoYXIgdGFyZ2V0CSA9IFNDcG50LT5kZXZpY2UtPmlkOworCW5zcF9od19kYXRhICAqZGF0YSA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWludAkgICAgICB0aW1lX291dDsKKwl1bnNpZ25lZCBjaGFyIHBoYXNlLCBhcmJpdDsKKworCS8vbnNwX2RiZyhOU1BfREVCVUdfUkVTRUxFQ1RJT04sICJpbiIpOworCisJcGhhc2UgPSBuc3BfaW5kZXhfcmVhZChiYXNlLCBTQ1NJQlVTTU9OKTsKKwlpZihwaGFzZSAhPSBCVVNNT05fQlVTX0ZSRUUpIHsKKwkJLy9uc3BfZGJnKE5TUF9ERUJVR19SRVNFTEVDVElPTiwgImJ1cyBidXN5Iik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvKiBzdGFydCBhcmJpdHJhdGlvbiAqLworCS8vbnNwX2RiZyhOU1BfREVCVUdfUkVTRUxFQ1RJT04sICJzdGFydCBhcmJpdCIpOworCVNDcG50LT5TQ3AucGhhc2UgPSBQSF9BUkJTVEFSVDsKKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgU0VUQVJCSVQsIEFSQklUX0dPKTsKKworCXRpbWVfb3V0ID0gMTAwMDsKKwlkbyB7CisJCS8qIFhYWDogd2hhdCBhIHN0dXBpZCBjaGlwISAqLworCQlhcmJpdCA9IG5zcF9pbmRleF9yZWFkKGJhc2UsIEFSQklUU1RBVFVTKTsKKwkJLy9uc3BfZGJnKE5TUF9ERUJVR19SRVNFTEVDVElPTiwgImFyYml0PSVkLCB3YWl0X2NvdW50PSVkIiwgYXJiaXQsIHdhaXRfY291bnQpOworCQl1ZGVsYXkoMSk7IC8qIGhvbGQgMS4ydXMgKi8KKwl9IHdoaWxlKChhcmJpdCAmIChBUkJJVF9XSU4gfCBBUkJJVF9GQUlMKSkgPT0gMCAmJgorCQkodGltZV9vdXQtLSAhPSAwKSk7CisKKwlpZiAoIShhcmJpdCAmIEFSQklUX1dJTikpIHsKKwkJLy9uc3BfZGJnKE5TUF9ERUJVR19SRVNFTEVDVElPTiwgImFyYml0IGZhaWwiKTsKKwkJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFNFVEFSQklULCBBUkJJVF9GTEFHX0NMRUFSKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8qIGFzc2VydCBzZWxlY3QgbGluZSAqLworCS8vbnNwX2RiZyhOU1BfREVCVUdfUkVTRUxFQ1RJT04sICJhc3NlcnQgU0VMIGxpbmUiKTsKKwlTQ3BudC0+U0NwLnBoYXNlID0gUEhfU0VMU1RBUlQ7CisJdWRlbGF5KDMpOyAvKiB3YWl0IDIuNHVzICovCisJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFNDU0lEQVRBTEFUQ0gsIEJJVChob3N0X2lkKSB8IEJJVCh0YXJnZXQpKTsKKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgU0NTSUJVU0NUUkwsICAgU0NTSV9TRUwgfCBTQ1NJX0JTWSAgICAgICAgICAgICAgICAgICAgfCBTQ1NJX0FUTik7CisJdWRlbGF5KDIpOyAvKiB3YWl0ID4xLjJ1cyAqLworCW5zcF9pbmRleF93cml0ZShiYXNlLCBTQ1NJQlVTQ1RSTCwgICBTQ1NJX1NFTCB8IFNDU0lfQlNZIHwgU0NTSV9EQVRBT1VUX0VOQiB8IFNDU0lfQVROKTsKKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgU0VUQVJCSVQsCSAgICAgQVJCSVRfRkxBR19DTEVBUik7CisJLyp1ZGVsYXkoMSk7Ki8gLyogd2FpdCA+OTBucyAqLworCW5zcF9pbmRleF93cml0ZShiYXNlLCBTQ1NJQlVTQ1RSTCwgICBTQ1NJX1NFTCAgICAgICAgICAgIHwgU0NTSV9EQVRBT1VUX0VOQiB8IFNDU0lfQVROKTsKKworCS8qIGNoZWNrIHNlbGVjdGlvbiB0aW1lb3V0ICovCisJbnNwX3N0YXJ0X3RpbWVyKFNDcG50LCAxMDAwLzUxKTsKKwlkYXRhLT5TZWxlY3Rpb25UaW1lT3V0ID0gMTsKKworCXJldHVybiBUUlVFOworfQorCitzdHJ1Y3QgbnNwX3N5bmNfdGFibGUgeworCXVuc2lnbmVkIGludCBtaW5fcGVyaW9kOworCXVuc2lnbmVkIGludCBtYXhfcGVyaW9kOworCXVuc2lnbmVkIGludCBjaGlwX3BlcmlvZDsKKwl1bnNpZ25lZCBpbnQgYWNrX3dpZHRoOworfTsKKworc3RhdGljIHN0cnVjdCBuc3Bfc3luY190YWJsZSBuc3Bfc3luY190YWJsZV80ME1bXSA9IHsKKwl7MHgwYywgMHgwYywgMHgxLCAwfSwJLyogMjBNQgkgIDUwbnMqLworCXsweDE5LCAweDE5LCAweDMsIDF9LAkvKiAxME1CCSAxMDBucyovIAorCXsweDFhLCAweDI1LCAweDUsIDJ9LAkvKiA3LjVNQiAxNTBucyovIAorCXsweDI2LCAweDMyLCAweDcsIDN9LAkvKiA1TUIJIDIwMG5zKi8KKwl7ICAgMCwgICAgMCwgICAwLCAwfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbnNwX3N5bmNfdGFibGUgbnNwX3N5bmNfdGFibGVfMjBNW10gPSB7CisJezB4MTksIDB4MTksIDB4MSwgMH0sCS8qIDEwTUIJIDEwMG5zKi8gCisJezB4MWEsIDB4MjUsIDB4MiwgMH0sCS8qIDcuNU1CIDE1MG5zKi8gCisJezB4MjYsIDB4MzIsIDB4MywgMX0sCS8qIDVNQgkgMjAwbnMqLworCXsgICAwLCAgICAwLCAgIDAsIDB9LAorfTsKKworLyoKKyAqIHNldHVwIHN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXIgbW9kZQorICovCitzdGF0aWMgaW50IG5zcF9hbmFseXplX3NkdHIoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwl1bnNpZ25lZCBjaGFyCSAgICAgICB0YXJnZXQgPSBTQ3BudC0+ZGV2aWNlLT5pZDsKKy8vCXVuc2lnbmVkIGNoYXIJICAgICAgIGx1biAgICA9IFNDcG50LT5kZXZpY2UtPmx1bjsKKwluc3BfaHdfZGF0YSAgICAgICAgICAgKmRhdGEgICA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXN5bmNfZGF0YQkgICAgICAqc3luYyAgID0gJihkYXRhLT5TeW5jW3RhcmdldF0pOworCXN0cnVjdCBuc3Bfc3luY190YWJsZSAqc3luY190YWJsZTsKKwl1bnNpZ25lZCBpbnQJICAgICAgIHBlcmlvZCwgb2Zmc2V0OworCWludAkJICAgICAgIGk7CisKKworCW5zcF9kYmcoTlNQX0RFQlVHX1NZTkMsICJpbiIpOworCisJcGVyaW9kID0gc3luYy0+U3luY1BlcmlvZDsKKwlvZmZzZXQgPSBzeW5jLT5TeW5jT2Zmc2V0OworCisJbnNwX2RiZyhOU1BfREVCVUdfU1lOQywgInBlcmlvZD0weCV4LCBvZmZzZXQ9MHgleCIsIHBlcmlvZCwgb2Zmc2V0KTsKKworCWlmICgoZGF0YS0+U2NzaUNsb2NrRGl2ICYgKEJJVCgwKXxCSVQoMSkpKSA9PSBDTE9DS18yME0pIHsKKwkJc3luY190YWJsZSA9IG5zcF9zeW5jX3RhYmxlXzIwTTsKKwl9IGVsc2UgeworCQlzeW5jX3RhYmxlID0gbnNwX3N5bmNfdGFibGVfNDBNOworCX0KKworCWZvciAoIGkgPSAwOyBzeW5jX3RhYmxlLT5tYXhfcGVyaW9kICE9IDA7IGkrKywgc3luY190YWJsZSsrKSB7CisJCWlmICggcGVyaW9kID49IHN5bmNfdGFibGUtPm1pbl9wZXJpb2QgJiYKKwkJICAgICBwZXJpb2QgPD0gc3luY190YWJsZS0+bWF4X3BlcmlvZAkgKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChwZXJpb2QgIT0gMCAmJiBzeW5jX3RhYmxlLT5tYXhfcGVyaW9kID09IDApIHsKKwkJLyoKKwkJICogTm8gcHJvcGVyIHBlcmlvZC9vZmZzZXQgZm91bmQKKwkJICovCisJCW5zcF9kYmcoTlNQX0RFQlVHX1NZTkMsICJubyBwcm9wZXIgcGVyaW9kL29mZnNldCIpOworCisJCXN5bmMtPlN5bmNQZXJpb2QgICAgICA9IDA7CisJCXN5bmMtPlN5bmNPZmZzZXQgICAgICA9IDA7CisJCXN5bmMtPlN5bmNSZWdpc3RlciAgICA9IDA7CisJCXN5bmMtPkFja1dpZHRoCSAgICAgID0gMDsKKworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJc3luYy0+U3luY1JlZ2lzdGVyICAgID0gKHN5bmNfdGFibGUtPmNoaXBfcGVyaW9kIDw8IFNZTkNSRUdfUEVSSU9EX1NISUZUKSB8CisJCSAgICAgICAgICAgICAgICAob2Zmc2V0ICYgU1lOQ1JFR19PRkZTRVRfTUFTSyk7CisJc3luYy0+QWNrV2lkdGgJICAgICAgPSBzeW5jX3RhYmxlLT5hY2tfd2lkdGg7CisKKwluc3BfZGJnKE5TUF9ERUJVR19TWU5DLCAic3luY19yZWc9MHgleCwgYWNrX3dpZHRoPTB4JXgiLCBzeW5jLT5TeW5jUmVnaXN0ZXIsIHN5bmMtPkFja1dpZHRoKTsKKworCXJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBzdGFydCBuaW5qYSBoYXJkd2FyZSB0aW1lcgorICovCitzdGF0aWMgdm9pZCBuc3Bfc3RhcnRfdGltZXIoU2NzaV9DbW5kICpTQ3BudCwgaW50IHRpbWUpCit7CisJdW5zaWduZWQgaW50IGJhc2UgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OworCW5zcF9od19kYXRhICpkYXRhID0gKG5zcF9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwkvL25zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJpbiBTQ3BudD0weCVwLCB0aW1lPSVkIiwgU0NwbnQsIHRpbWUpOworCWRhdGEtPlRpbWVyQ291bnQgPSB0aW1lOworCW5zcF9pbmRleF93cml0ZShiYXNlLCBUSU1FUkNPVU5ULCB0aW1lKTsKK30KKworLyoKKyAqIHdhaXQgZm9yIGJ1cyBwaGFzZSBjaGFuZ2UKKyAqLworc3RhdGljIGludCBuc3BfbmVnYXRlX3NpZ25hbChTY3NpX0NtbmQgKlNDcG50LCB1bnNpZ25lZCBjaGFyIG1hc2ssIGNoYXIgKnN0cikKK3sKKwl1bnNpZ25lZCBpbnQgIGJhc2UgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OworCXVuc2lnbmVkIGNoYXIgcmVnOworCWludAkgICAgICB0aW1lX291dDsKKworCS8vbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgImluIik7CisKKwl0aW1lX291dCA9IDEwMDsKKworCWRvIHsKKwkJcmVnID0gbnNwX2luZGV4X3JlYWQoYmFzZSwgU0NTSUJVU01PTik7CisJCWlmIChyZWcgPT0gMHhmZikgeworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgodGltZV9vdXQtLSAhPSAwKSAmJiAocmVnICYgbWFzaykgIT0gMCk7CisKKwlpZiAodGltZV9vdXQgPT0gMCkgeworCQluc3BfbXNnKEtFUk5fREVCVUcsICIgJXMgc2lnbmFsIG9mZiB0aW1ldXQiLCBzdHIpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogZXhwZWN0IE5pbmphIElycQorICovCitzdGF0aWMgaW50IG5zcF9leHBlY3Rfc2lnbmFsKFNjc2lfQ21uZAkgICAqU0NwbnQsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgIGN1cnJlbnRfcGhhc2UsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgIG1hc2spCit7CisJdW5zaWduZWQgaW50ICBiYXNlCSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisJaW50CSAgICAgIHRpbWVfb3V0OworCXVuc2lnbmVkIGNoYXIgcGhhc2UsIGlfc3JjOworCisJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAiY3VycmVudF9waGFzZT0weCV4LCBtYXNrPTB4JXgiLCBjdXJyZW50X3BoYXNlLCBtYXNrKTsKKworCXRpbWVfb3V0ID0gMTAwOworCWRvIHsKKwkJcGhhc2UgPSBuc3BfaW5kZXhfcmVhZChiYXNlLCBTQ1NJQlVTTU9OKTsKKwkJaWYgKHBoYXNlID09IDB4ZmYpIHsKKwkJCS8vbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgInJldCAtMSIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlfc3JjID0gbnNwX3JlYWQoYmFzZSwgSVJRU1RBVFVTKTsKKwkJaWYgKGlfc3JjICYgSVJRU1RBVFVTX1NDU0kpIHsKKwkJCS8vbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgInJldCAwIGZvdW5kIHNjc2kgc2lnbmFsIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoKHBoYXNlICYgbWFzaykgIT0gMCAmJiAocGhhc2UgJiBCVVNNT05fUEhBU0VfTUFTSykgPT0gY3VycmVudF9waGFzZSkgeworCQkJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAicmV0IDEgcGhhc2U9MHgleCIsIHBoYXNlKTsKKwkJCXJldHVybiAxOworCQl9CisJfSB3aGlsZSh0aW1lX291dC0tICE9IDApOworCisJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAidGltZW91dCIpOworCXJldHVybiAtMTsKK30KKworLyoKKyAqIHRyYW5zZmVyIFNDU0kgbWVzc2FnZQorICovCitzdGF0aWMgaW50IG5zcF94ZmVyKFNjc2lfQ21uZCAqU0NwbnQsIGludCBwaGFzZSkKK3sKKwl1bnNpZ25lZCBpbnQgIGJhc2UgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OworCW5zcF9od19kYXRhICAqZGF0YSA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWNoYXIJICAgICAqYnVmICA9IGRhdGEtPk1zZ0J1ZmZlcjsKKwlpbnQJICAgICAgbGVuICA9IG1pbihNU0dCVUZfU0laRSwgZGF0YS0+TXNnTGVuKTsKKwlpbnQJICAgICAgcHRyOworCWludAkgICAgICByZXQ7CisKKwkvL25zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJpbiIpOworCWZvciAocHRyID0gMDsgbGVuID4gMDsgbGVuLS0sIHB0cisrKSB7CisKKwkJcmV0ID0gbnNwX2V4cGVjdF9zaWduYWwoU0NwbnQsIHBoYXNlLCBCVVNNT05fUkVRKTsKKwkJaWYgKHJldCA8PSAwKSB7CisJCQluc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAieGZlciBxdWl0Iik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIGlmIGxhc3QgYnl0ZSwgbmVnYXRlIEFUTiAqLworCQlpZiAobGVuID09IDEgJiYgU0NwbnQtPlNDcC5waGFzZSA9PSBQSF9NU0dfT1VUKSB7CisJCQluc3BfaW5kZXhfd3JpdGUoYmFzZSwgU0NTSUJVU0NUUkwsIEFVVE9ESVJFQ1RJT04gfCBBQ0tFTkIpOworCQl9CisKKwkJLyogcmVhZCAmIHdyaXRlIG1lc3NhZ2UgKi8KKwkJaWYgKHBoYXNlICYgQlVTTU9OX0lPKSB7CisJCQluc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAicmVhZCBtc2ciKTsKKwkJCWJ1ZltwdHJdID0gbnNwX2luZGV4X3JlYWQoYmFzZSwgU0NTSURBVEFXSVRIQUNLKTsKKwkJfSBlbHNlIHsKKwkJCW5zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJ3cml0ZSBtc2ciKTsKKwkJCW5zcF9pbmRleF93cml0ZShiYXNlLCBTQ1NJREFUQVdJVEhBQ0ssIGJ1ZltwdHJdKTsKKwkJfQorCQluc3BfbmVnYXRlX3NpZ25hbChTQ3BudCwgQlVTTU9OX0FDSywgInhmZXI8YWNrPiIpOworCisJfQorCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBnZXQgZXh0cmEgU0NTSSBkYXRhIGZyb20gZmlmbworICovCitzdGF0aWMgaW50IG5zcF9kYXRhcGhhc2VfYnlwYXNzKFNjc2lfQ21uZCAqU0NwbnQpCit7CisJbnNwX2h3X2RhdGEgKmRhdGEgPSAobnNwX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisKKwkvL25zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJpbiIpOworCisJaWYgKFNDcG50LT5TQ3AuaGF2ZV9kYXRhX2luICE9IElPX0lOKSB7CisJCXJldHVybiAwOworCX0KKworCWNvdW50ID0gbnNwX2ZpZm9fY291bnQoU0NwbnQpOworCWlmIChkYXRhLT5GaWZvQ291bnQgPT0gY291bnQpIHsKKwkJLy9uc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAibm90IHVzZSBieXBhc3MgcXVpcmsiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBYWFg6IE5TUF9RVUlSSworCSAqIGRhdGEgcGhhc2Ugc2tpcCBvbmx5IG9jY3VyZXMgaW4gY2FzZSBvZiBTQ1NJX0xPV19SRUFECisJICovCisJbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgInVzZSBieXBhc3MgcXVpcmsiKTsKKwlTQ3BudC0+U0NwLnBoYXNlID0gUEhfREFUQTsKKwluc3BfcGlvX3JlYWQoU0NwbnQpOworCW5zcF9zZXR1cF9maWZvKGRhdGEsIEZBTFNFKTsKKworCXJldHVybiAwOworfQorCisvKgorICogYWNjZXB0IHJlc2VsZWN0aW9uCisgKi8KK3N0YXRpYyBpbnQgbnNwX3Jlc2VsZWN0ZWQoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwl1bnNpZ25lZCBpbnQgIGJhc2UgICAgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OworCXVuc2lnbmVkIGludCAgaG9zdF9pZCA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPnRoaXNfaWQ7CisJLy9uc3BfaHdfZGF0YSAqZGF0YSA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGNoYXIgYnVzX3JlZzsKKwl1bnNpZ25lZCBjaGFyIGlkX3JlZywgdG1wOworCWludCB0YXJnZXQ7CisKKwluc3BfZGJnKE5TUF9ERUJVR19SRVNFTEVDVElPTiwgImluIik7CisKKwlpZF9yZWcgPSBuc3BfaW5kZXhfcmVhZChiYXNlLCBSRVNFTEVDVElEKTsKKwl0bXAgICAgPSBpZF9yZWcgJiAofkJJVChob3N0X2lkKSk7CisJdGFyZ2V0ID0gMDsKKwl3aGlsZSh0bXAgIT0gMCkgeworCQlpZiAodG1wICYgQklUKDApKSB7CisJCQlicmVhazsKKwkJfQorCQl0bXAgPj49IDE7CisJCXRhcmdldCsrOworCX0KKworCWlmIChTQ3BudC0+ZGV2aWNlLT5pZCAhPSB0YXJnZXQpIHsKKwkJbnNwX21zZyhLRVJOX0VSUiwgIlhYWDogcmVzZWxlY3QgSUQgbXVzdCBiZSAlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uLiIsIHRhcmdldCk7CisJfQorCisJbnNwX25lZ2F0ZV9zaWduYWwoU0NwbnQsIEJVU01PTl9TRUwsICJyZXNlbGVjdDxTRUw+Iik7CisKKwluc3BfbmV4dXMoU0NwbnQpOworCWJ1c19yZWcgPSBuc3BfaW5kZXhfcmVhZChiYXNlLCBTQ1NJQlVTQ1RSTCkgJiB+KFNDU0lfQlNZIHwgU0NTSV9BVE4pOworCW5zcF9pbmRleF93cml0ZShiYXNlLCBTQ1NJQlVTQ1RSTCwgYnVzX3JlZyk7CisJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFNDU0lCVVNDVFJMLCBidXNfcmVnIHwgQVVUT0RJUkVDVElPTiB8IEFDS0VOQik7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIGNvdW50IGhvdyBtYW55IGRhdGEgdHJhbnNmZXJkCisgKi8KK3N0YXRpYyBpbnQgbnNwX2ZpZm9fY291bnQoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwl1bnNpZ25lZCBpbnQgYmFzZSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisJdW5zaWduZWQgaW50IGNvdW50OworCXVuc2lnbmVkIGludCBsLCBtLCBoLCBkdW1teTsKKworCW5zcF9pbmRleF93cml0ZShiYXNlLCBQT0lOVEVSQ0xSLCBQT0lOVEVSX0NMRUFSIHwgQUNLX0NPVU5URVIpOworCisJbCAgICAgPSBuc3BfaW5kZXhfcmVhZChiYXNlLCBUUkFOU0ZFUkNPVU5UKTsKKwltICAgICA9IG5zcF9pbmRleF9yZWFkKGJhc2UsIFRSQU5TRkVSQ09VTlQpOworCWggICAgID0gbnNwX2luZGV4X3JlYWQoYmFzZSwgVFJBTlNGRVJDT1VOVCk7CisJZHVtbXkgPSBuc3BfaW5kZXhfcmVhZChiYXNlLCBUUkFOU0ZFUkNPVU5UKTsgLyogcmVxdWlyZWQgdGhpcyEgKi8KKworCWNvdW50ID0gKGggPDwgMTYpIHwgKG0gPDwgOCkgfCAobCA8PCAwKTsKKworCS8vbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgImNvdW50PTB4JXgiLCBjb3VudCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIGZpZm8gc2l6ZSAqLworI2RlZmluZSBSRklGT19DUklUIDY0CisjZGVmaW5lIFdGSUZPX0NSSVQgNjQKKworLyoKKyAqIHJlYWQgZGF0YSBpbiBEQVRBIElOIHBoYXNlCisgKi8KK3N0YXRpYyB2b2lkIG5zcF9waW9fcmVhZChTY3NpX0NtbmQgKlNDcG50KQoreworCXVuc2lnbmVkIGludCAgYmFzZSAgICAgID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKKwl1bnNpZ25lZCBsb25nIG1taW9fYmFzZSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmJhc2U7CisJbnNwX2h3X2RhdGEgICpkYXRhICAgICAgPSAobnNwX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlsb25nCSAgICAgIHRpbWVfb3V0OworCWludAkgICAgICBvY291bnQsIHJlczsKKwl1bnNpZ25lZCBjaGFyIHN0YXQsIGZpZm9fc3RhdDsKKworCW9jb3VudCA9IGRhdGEtPkZpZm9Db3VudDsKKworCW5zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJpbiBTQ3BudD0weCVwIHJlc2lkPSVkIG9jb3VudD0lZCBwdHI9MHglcCB0aGlzX3Jlc2lkdWFsPSVkIGJ1ZmZlcnM9MHglcCBuYnVmPSVkIiwKKwkJU0NwbnQsIFNDcG50LT5yZXNpZCwgb2NvdW50LCBTQ3BudC0+U0NwLnB0ciwgU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsLCBTQ3BudC0+U0NwLmJ1ZmZlciwgU0NwbnQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsKTsKKworCXRpbWVfb3V0ID0gMTAwMDsKKworCXdoaWxlICgodGltZV9vdXQtLSAhPSAwKSAmJgorCSAgICAgICAoU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsID4gMCB8fCBTQ3BudC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPiAwICkgKSB7CisKKwkJc3RhdCA9IG5zcF9pbmRleF9yZWFkKGJhc2UsIFNDU0lCVVNNT04pOworCQlzdGF0ICY9IEJVU01PTl9QSEFTRV9NQVNLOworCisKKwkJcmVzID0gbnNwX2ZpZm9fY291bnQoU0NwbnQpIC0gb2NvdW50OworCQkvL25zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJwdHI9MHglcCB0aGlzPTB4JXggb2NvdW50PTB4JXggcmVzPTB4JXgiLCBTQ3BudC0+U0NwLnB0ciwgU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsLCBvY291bnQsIHJlcyk7CisJCWlmIChyZXMgPT0gMCkgeyAvKiBpZiBzb21lIGRhdGEgYXZpbGFibGUgPyAqLworCQkJaWYgKHN0YXQgPT0gQlVTUEhBU0VfREFUQV9JTikgeyAvKiBwaGFzZSBjaGFuZ2VkPyAqLworCQkJCS8vbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgIiB3YWl0IGZvciBkYXRhIHRoaXM9JWQiLCBTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwpOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQluc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAicGhhc2UgY2hhbmdlZCBzdGF0PTB4JXgiLCBzdGF0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWZpZm9fc3RhdCA9IG5zcF9yZWFkKGJhc2UsIEZJRk9TVEFUVVMpOworCQlpZiAoKGZpZm9fc3RhdCAmIEZJRk9TVEFUVVNfRlVMTF9FTVBUWSkgPT0gMCAmJgorCQkgICAgc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gQlVTUEhBU0VfREFUQV9JTikgeworCQkJY29udGludWU7CisJCX0KKworCQlyZXMgPSBtaW4ocmVzLCBTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwpOworCisJCXN3aXRjaCAoZGF0YS0+VHJhbnNmZXJNb2RlKSB7CisJCWNhc2UgTU9ERV9JTzMyOgorCQkJcmVzICY9IH4oQklUKDEpfEJJVCgwKSk7IC8qIGFsaWduIDQgKi8KKwkJCW5zcF9maWZvMzJfcmVhZChiYXNlLCBTQ3BudC0+U0NwLnB0ciwgcmVzID4+IDIpOworCQkJYnJlYWs7CisJCWNhc2UgTU9ERV9JTzg6CisJCQluc3BfZmlmbzhfcmVhZCAoYmFzZSwgU0NwbnQtPlNDcC5wdHIsIHJlcyAgICAgKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTU9ERV9NRU0zMjoKKwkJCXJlcyAmPSB+KEJJVCgxKXxCSVQoMCkpOyAvKiBhbGlnbiA0ICovCisJCQluc3BfbW1pb19maWZvMzJfcmVhZChtbWlvX2Jhc2UsIFNDcG50LT5TQ3AucHRyLCByZXMgPj4gMik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgInVua25vd24gcmVhZCBtb2RlIik7CisJCQlyZXR1cm47CisJCX0KKworCQlTQ3BudC0+cmVzaWQJICAgICAgIAkgLT0gcmVzOworCQlTQ3BudC0+U0NwLnB0cgkJICs9IHJlczsKKwkJU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsIC09IHJlczsKKwkJb2NvdW50CQkJICs9IHJlczsKKwkJLy9uc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAicHRyPTB4JXAgdGhpc19yZXNpZHVhbD0weCV4IG9jb3VudD0weCV4IiwgU0NwbnQtPlNDcC5wdHIsIFNDcG50LT5TQ3AudGhpc19yZXNpZHVhbCwgb2NvdW50KTsKKworCQkvKiBnbyB0byBuZXh0IHNjYXR0ZXIgbGlzdCBpZiBhdmFpbGFibGUgKi8KKwkJaWYgKFNDcG50LT5TQ3AudGhpc19yZXNpZHVhbAk9PSAwICYmCisJCSAgICBTQ3BudC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgIT0gMCApIHsKKwkJCS8vbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgInNjYXR0ZXJsaXN0IG5leHQgdGltZW91dD0lZCIsIHRpbWVfb3V0KTsKKwkJCVNDcG50LT5TQ3AuYnVmZmVyc19yZXNpZHVhbC0tOworCQkJU0NwbnQtPlNDcC5idWZmZXIrKzsKKwkJCVNDcG50LT5TQ3AucHRyCQkgPSBCVUZGRVJfQUREUjsKKwkJCVNDcG50LT5TQ3AudGhpc19yZXNpZHVhbCA9IFNDcG50LT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJCQl0aW1lX291dCA9IDEwMDA7CisKKwkJCS8vbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgInBhZ2U6IDB4JXAsIG9mZjogMHgleCIsIFNDcG50LT5TQ3AuYnVmZmVyLT5wYWdlLCBTQ3BudC0+U0NwLmJ1ZmZlci0+b2Zmc2V0KTsKKwkJfQorCX0KKworCWRhdGEtPkZpZm9Db3VudCA9IG9jb3VudDsKKworCWlmICh0aW1lX291dCA9PSAwKSB7CisJCW5zcF9tc2coS0VSTl9ERUJVRywgInBpbyByZWFkIHRpbWVvdXQgcmVzaWQ9JWQgdGhpc19yZXNpZHVhbD0lZCBidWZmZXJzX3Jlc2lkdWFsPSVkIiwKKwkJCVNDcG50LT5yZXNpZCwgU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsLCBTQ3BudC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpOworCX0KKwluc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAicmVhZCBvY291bnQ9MHgleCIsIG9jb3VudCk7CisJbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgInIgY21kPSVkIHJlc2lkPTB4JXhcbiIsIGRhdGEtPkNtZElkLCBTQ3BudC0+cmVzaWQpOworfQorCisvKgorICogd3JpdGUgZGF0YSBpbiBEQVRBIE9VVCBwaGFzZQorICovCitzdGF0aWMgdm9pZCBuc3BfcGlvX3dyaXRlKFNjc2lfQ21uZCAqU0NwbnQpCit7CisJdW5zaWduZWQgaW50ICBiYXNlICAgICAgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OworCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlID0gU0NwbnQtPmRldmljZS0+aG9zdC0+YmFzZTsKKwluc3BfaHdfZGF0YSAgKmRhdGEgICAgICA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWludAkgICAgICB0aW1lX291dDsKKwlpbnQgICAgICAgICAgIG9jb3VudCwgcmVzOworCXVuc2lnbmVkIGNoYXIgc3RhdDsKKworCW9jb3VudAkgPSBkYXRhLT5GaWZvQ291bnQ7CisKKwluc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAiaW4gZmlmb2NvdW50PSVkIHB0cj0weCVwIHRoaXNfcmVzaWR1YWw9JWQgYnVmZmVycz0weCVwIG5idWY9JWQgcmVzaWQ9MHgleCIsCisJCWRhdGEtPkZpZm9Db3VudCwgU0NwbnQtPlNDcC5wdHIsIFNDcG50LT5TQ3AudGhpc19yZXNpZHVhbCwgU0NwbnQtPlNDcC5idWZmZXIsIFNDcG50LT5TQ3AuYnVmZmVyc19yZXNpZHVhbCwgU0NwbnQtPnJlc2lkKTsKKworCXRpbWVfb3V0ID0gMTAwMDsKKworCXdoaWxlICgodGltZV9vdXQtLSAhPSAwKSAmJgorCSAgICAgICAoU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsID4gMCB8fCBTQ3BudC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPiAwKSkgeworCQlzdGF0ID0gbnNwX2luZGV4X3JlYWQoYmFzZSwgU0NTSUJVU01PTik7CisJCXN0YXQgJj0gQlVTTU9OX1BIQVNFX01BU0s7CisKKwkJaWYgKHN0YXQgIT0gQlVTUEhBU0VfREFUQV9PVVQpIHsKKwkJCXJlcyA9IG9jb3VudCAtIG5zcF9maWZvX2NvdW50KFNDcG50KTsKKworCQkJbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgInBoYXNlIGNoYW5nZWQgc3RhdD0weCV4LCByZXM9JWRcbiIsIHN0YXQsIHJlcyk7CisJCQkvKiBQdXQgYmFjayBwb2ludGVyICovCisJCQlTQ3BudC0+cmVzaWQJICAgICAgIAkgKz0gcmVzOworCQkJU0NwbnQtPlNDcC5wdHIJCSAtPSByZXM7CisJCQlTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwgKz0gcmVzOworCQkJb2NvdW50CQkJIC09IHJlczsKKworCQkJYnJlYWs7CisJCX0KKworCQlyZXMgPSBvY291bnQgLSBuc3BfZmlmb19jb3VudChTQ3BudCk7CisJCWlmIChyZXMgPiAwKSB7IC8qIHdyaXRlIGFsbCBkYXRhPyAqLworCQkJbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgIndhaXQgZm9yIGFsbCBkYXRhIG91dC4gb2NvdW50PTB4JXggcmVzPSVkIiwgb2NvdW50LCByZXMpOworCQkJY29udGludWU7CisJCX0KKworCQlyZXMgPSBtaW4oU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsLCBXRklGT19DUklUKTsKKworCQkvL25zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJwdHI9MHglcCB0aGlzPTB4JXggcmVzPTB4JXgiLCBTQ3BudC0+U0NwLnB0ciwgU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsLCByZXMpOworCQlzd2l0Y2ggKGRhdGEtPlRyYW5zZmVyTW9kZSkgeworCQljYXNlIE1PREVfSU8zMjoKKwkJCXJlcyAmPSB+KEJJVCgxKXxCSVQoMCkpOyAvKiBhbGlnbiA0ICovCisJCQluc3BfZmlmbzMyX3dyaXRlKGJhc2UsIFNDcG50LT5TQ3AucHRyLCByZXMgPj4gMik7CisJCQlicmVhazsKKwkJY2FzZSBNT0RFX0lPODoKKwkJCW5zcF9maWZvOF93cml0ZSAoYmFzZSwgU0NwbnQtPlNDcC5wdHIsIHJlcyAgICAgKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTU9ERV9NRU0zMjoKKwkJCXJlcyAmPSB+KEJJVCgxKXxCSVQoMCkpOyAvKiBhbGlnbiA0ICovCisJCQluc3BfbW1pb19maWZvMzJfd3JpdGUobW1pb19iYXNlLCBTQ3BudC0+U0NwLnB0ciwgcmVzID4+IDIpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCW5zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJ1bmtub3duIHdyaXRlIG1vZGUiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJU0NwbnQtPnJlc2lkCSAgICAgICAJIC09IHJlczsKKwkJU0NwbnQtPlNDcC5wdHIJCSArPSByZXM7CisJCVNDcG50LT5TQ3AudGhpc19yZXNpZHVhbCAtPSByZXM7CisJCW9jb3VudAkJCSArPSByZXM7CisKKwkJLyogZ28gdG8gbmV4dCBzY2F0dGVyIGxpc3QgaWYgYXZhaWxhYmxlICovCisJCWlmIChTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwJPT0gMCAmJgorCQkgICAgU0NwbnQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsICE9IDAgKSB7CisJCQkvL25zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJzY2F0dGVybGlzdCBuZXh0Iik7CisJCQlTQ3BudC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwtLTsKKwkJCVNDcG50LT5TQ3AuYnVmZmVyKys7CisJCQlTQ3BudC0+U0NwLnB0cgkJID0gQlVGRkVSX0FERFI7CisJCQlTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBTQ3BudC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCQkJdGltZV9vdXQgPSAxMDAwOworCQl9CisJfQorCisJZGF0YS0+Rmlmb0NvdW50ID0gb2NvdW50OworCisJaWYgKHRpbWVfb3V0ID09IDApIHsKKwkJbnNwX21zZyhLRVJOX0RFQlVHLCAicGlvIHdyaXRlIHRpbWVvdXQgcmVzaWQ9MHgleCIsIFNDcG50LT5yZXNpZCk7CisJfQorCW5zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJ3cml0ZSBvY291bnQ9MHgleCIsIG9jb3VudCk7CisJbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgIncgY21kPSVkIHJlc2lkPTB4JXhcbiIsIGRhdGEtPkNtZElkLCBTQ3BudC0+cmVzaWQpOworfQorI3VuZGVmIFJGSUZPX0NSSVQKKyN1bmRlZiBXRklGT19DUklUCisKKy8qCisgKiBzZXR1cCBzeW5jaHJvbm91cy9hc3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlciBtb2RlCisgKi8KK3N0YXRpYyBpbnQgbnNwX25leHVzKFNjc2lfQ21uZCAqU0NwbnQpCit7CisJdW5zaWduZWQgaW50ICAgYmFzZSAgID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKKwl1bnNpZ25lZCBjaGFyICB0YXJnZXQgPSBTQ3BudC0+ZGV2aWNlLT5pZDsKKy8vCXVuc2lnbmVkIGNoYXIgIGx1biAgICA9IFNDcG50LT5kZXZpY2UtPmx1bjsKKwluc3BfaHdfZGF0YSAqZGF0YSA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXN5bmNfZGF0YSAgICAgKnN5bmMgICA9ICYoZGF0YS0+U3luY1t0YXJnZXRdKTsKKworCS8vbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgImluIFNDcG50PTB4JXAiLCBTQ3BudCk7CisKKwkvKiBzZXR1cCBzeW5jaCB0cmFuc2ZlciByZWdpc3RlcnMgKi8KKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgU1lOQ1JFRywJc3luYy0+U3luY1JlZ2lzdGVyKTsKKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgQUNLV0lEVEgsIHN5bmMtPkFja1dpZHRoKTsKKworCWlmIChTQ3BudC0+dXNlX3NnICAgID09IDAgICAgICAgIHx8CisJICAgIFNDcG50LT5yZXNpZCAlIDQgIT0gMCAgICAgICAgfHwKKwkgICAgU0NwbnQtPnJlc2lkICAgICA8PSBQQUdFX1NJWkUgKSB7CisJCWRhdGEtPlRyYW5zZmVyTW9kZSA9IE1PREVfSU84OworCX0gZWxzZSBpZiAobnNwX2J1cnN0X21vZGUgPT0gQlVSU1RfTUVNMzIpIHsKKwkJZGF0YS0+VHJhbnNmZXJNb2RlID0gTU9ERV9NRU0zMjsKKwl9IGVsc2UgaWYgKG5zcF9idXJzdF9tb2RlID09IEJVUlNUX0lPMzIpIHsKKwkJZGF0YS0+VHJhbnNmZXJNb2RlID0gTU9ERV9JTzMyOworCX0gZWxzZSB7CisJCWRhdGEtPlRyYW5zZmVyTW9kZSA9IE1PREVfSU84OworCX0KKworCS8qIHNldHVwIHBkbWEgZmlmbyAqLworCW5zcF9zZXR1cF9maWZvKGRhdGEsIFRSVUUpOworCisJLyogY2xlYXIgYWNrIGNvdW50ZXIgKi8KKyAJZGF0YS0+Rmlmb0NvdW50ID0gMDsKKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgUE9JTlRFUkNMUiwgUE9JTlRFUl9DTEVBUgkgICAgfAorCQkJCQkgIEFDS19DT1VOVEVSX0NMRUFSIHwKKwkJCQkJICBSRVFfQ09VTlRFUl9DTEVBUiB8CisJCQkJCSAgSE9TVF9DT1VOVEVSX0NMRUFSKTsKKworCXJldHVybiAwOworfQorCisjaW5jbHVkZSAibnNwX21lc3NhZ2UuYyIKKy8qCisgKiBpbnRlcnJ1cHQgaGFuZGxlcgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbnNwaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGludCAgIGJhc2U7CisJdW5zaWduZWQgY2hhciAgaXJxX3N0YXR1cywgaXJxX3BoYXNlLCBwaGFzZTsKKwlTY3NpX0NtbmQgICAgICp0bXBTQzsKKwl1bnNpZ25lZCBjaGFyICB0YXJnZXQsIGx1bjsKKwl1bnNpZ25lZCBpbnQgICpzeW5jX25lZzsKKwlpbnQgICAgICAgICAgICBpLCB0bXA7CisJbnNwX2h3X2RhdGEgICAqZGF0YTsKKworCisJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAiZGV2X2lkPTB4JXAiLCBkZXZfaWQpOworCS8vbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgImhvc3Q9MHglcCIsICgoc2NzaV9pbmZvX3QgKilkZXZfaWQpLT5ob3N0KTsKKworCWlmICggICAgICAgICAgICAgICAgZGV2X2lkICAgICAgICAhPSBOVUxMICYmCisJICAgICgoc2NzaV9pbmZvX3QgKilkZXZfaWQpLT5ob3N0ICE9IE5VTEwgICkgeworCQlzY3NpX2luZm9fdCAqaW5mbyA9IChzY3NpX2luZm9fdCAqKWRldl9pZDsKKworCQlkYXRhID0gKG5zcF9od19kYXRhICopaW5mby0+aG9zdC0+aG9zdGRhdGE7CisJfSBlbHNlIHsKKwkJbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgImhvc3QgZGF0YSB3cm9uZyIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAiJm5zcF9kYXRhX2Jhc2U9MHglcCwgZGV2X2lkPTB4JXAiLCAmbnNwX2RhdGFfYmFzZSwgZGV2X2lkKTsKKworCWJhc2UgPSBkYXRhLT5CYXNlQWRkcmVzczsKKwkvL25zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJiYXNlPTB4JXgiLCBiYXNlKTsKKworCS8qCisJICogaW50ZXJydXB0IGNoZWNrCisJICovCisJbnNwX3dyaXRlKGJhc2UsIElSUUNPTlRST0wsIElSUUNPTlRST0xfSVJRRElTQUJMRSk7CisJaXJxX3N0YXR1cyA9IG5zcF9yZWFkKGJhc2UsIElSUVNUQVRVUyk7CisJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAiaXJxX3N0YXR1cz0weCV4IiwgaXJxX3N0YXR1cyk7CisJaWYgKChpcnFfc3RhdHVzID09IDB4ZmYpIHx8ICgoaXJxX3N0YXR1cyAmIElSUVNUQVRVU19NQVNLKSA9PSAwKSkgeworCQluc3Bfd3JpdGUoYmFzZSwgSVJRQ09OVFJPTCwgMCk7CisJCS8vbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgIm5vIGlycS9zaGFyZWQgaXJxIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvKiBYWFg6IElNUE9SVEFOVAorCSAqIERvIG5vdCByZWFkIGFuIGlycV9waGFzZSByZWdpc3RlciBpZiBubyBzY3NpIHBoYXNlIGludGVycnVwdC4KKwkgKiBVbmxlc3MsIHlvdSBzaG91bGQgbG9zZSBhIHNjc2kgcGhhc2UgaW50ZXJydXB0LgorCSAqLworCXBoYXNlID0gbnNwX2luZGV4X3JlYWQoYmFzZSwgU0NTSUJVU01PTik7CisJaWYoKGlycV9zdGF0dXMgJiBJUlFTVEFUVVNfU0NTSSkgIT0gMCkgeworCQlpcnFfcGhhc2UgPSBuc3BfaW5kZXhfcmVhZChiYXNlLCBJUlFQSEFTRVNFTkNFKTsKKwl9IGVsc2UgeworCQlpcnFfcGhhc2UgPSAwOworCX0KKworCS8vbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgImlycV9waGFzZT0weCV4IiwgaXJxX3BoYXNlKTsKKworCS8qCisJICogdGltZXIgaW50ZXJydXB0IGhhbmRsZXIgKHNjc2kgdnMgdGltZXIgaW50ZXJydXB0cykKKwkgKi8KKwkvL25zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJ0aW1lcmNvdW50PSVkIiwgZGF0YS0+VGltZXJDb3VudCk7CisJaWYgKGRhdGEtPlRpbWVyQ291bnQgIT0gMCkgeworCQkvL25zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJzdG9wIHRpbWVyIik7CisJCW5zcF9pbmRleF93cml0ZShiYXNlLCBUSU1FUkNPVU5ULCAwKTsKKwkJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFRJTUVSQ09VTlQsIDApOworCQlkYXRhLT5UaW1lckNvdW50ID0gMDsKKwl9CisKKwlpZiAoKGlycV9zdGF0dXMgJiBJUlFTVEFUVVNfTUFTSykgPT0gSVJRU1RBVFVTX1RJTUVSICYmCisJICAgIGRhdGEtPlNlbGVjdGlvblRpbWVPdXQgPT0gMCkgeworCQkvL25zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJ0aW1lciBzdGFydCIpOworCQluc3Bfd3JpdGUoYmFzZSwgSVJRQ09OVFJPTCwgSVJRQ09OVFJPTF9USU1FUl9DTEVBUik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwluc3Bfd3JpdGUoYmFzZSwgSVJRQ09OVFJPTCwgSVJRQ09OVFJPTF9USU1FUl9DTEVBUiB8IElSUUNPTlRST0xfRklGT19DTEVBUik7CisKKwlpZiAoKGlycV9zdGF0dXMgJiBJUlFTVEFUVVNfU0NTSSkgJiYKKwkgICAgKGlycV9waGFzZSAgJiBTQ1NJX1JFU0VUX0lSUSkpIHsKKwkJbnNwX21zZyhLRVJOX0VSUiwgImJ1cyByZXNldCAocG93ZXIgb2ZmPykiKTsKKworCQluc3Bod19pbml0KGRhdGEpOworCQluc3BfYnVzX3Jlc2V0KGRhdGEpOworCisJCWlmKGRhdGEtPkN1cnJlbnRTQyAhPSBOVUxMKSB7CisJCQl0bXBTQyA9IGRhdGEtPkN1cnJlbnRTQzsKKwkJCXRtcFNDLT5yZXN1bHQgID0gKERJRF9SRVNFVCAgICAgICAgICAgICAgICAgICA8PCAxNikgfAorCQkJCSAgICAgICAgICgodG1wU0MtPlNDcC5NZXNzYWdlICYgMHhmZikgPDwgIDgpIHwKKwkJCQkgICAgICAgICAoKHRtcFNDLT5TQ3AuU3RhdHVzICAmIDB4ZmYpIDw8ICAwKTsKKwkJCW5zcF9zY3NpX2RvbmUodG1wU0MpOworCQl9CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoZGF0YS0+Q3VycmVudFNDID09IE5VTEwpIHsKKwkJbnNwX21zZyhLRVJOX0VSUiwgIkN1cnJlbnRTQz09TlVMTCBpcnFfc3RhdHVzPTB4JXggcGhhc2U9MHgleCBpcnFfcGhhc2U9MHgleCB0aGlzIGNhbid0IGJlIGhhcHBlbi4gcmVzZXQgZXZlcnl0aGluZyIsIGlycV9zdGF0dXMsIHBoYXNlLCBpcnFfcGhhc2UpOworCQluc3Bod19pbml0KGRhdGEpOworCQluc3BfYnVzX3Jlc2V0KGRhdGEpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJdG1wU0MgICAgPSBkYXRhLT5DdXJyZW50U0M7CisJdGFyZ2V0ICAgPSB0bXBTQy0+ZGV2aWNlLT5pZDsKKwlsdW4gICAgICA9IHRtcFNDLT5kZXZpY2UtPmx1bjsKKwlzeW5jX25lZyA9ICYoZGF0YS0+U3luY1t0YXJnZXRdLlN5bmNOZWdvdGlhdGlvbik7CisKKwkvKgorCSAqIHBhcnNlIGhhcmR3YXJlIFNDU0kgaXJxIHJlYXNvbnMgcmVnaXN0ZXIKKwkgKi8KKwlpZiAoaXJxX3N0YXR1cyAmIElSUVNUQVRVU19TQ1NJKSB7CisJCWlmIChpcnFfcGhhc2UgJiBSRVNFTEVDVF9JUlEpIHsKKwkJCW5zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJyZXNlbGVjdCIpOworCQkJbnNwX3dyaXRlKGJhc2UsIElSUUNPTlRST0wsIElSUUNPTlRST0xfUkVTRUxFQ1RfQ0xFQVIpOworCQkJaWYgKG5zcF9yZXNlbGVjdGVkKHRtcFNDKSAhPSBGQUxTRSkgeworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKwkJfQorCisJCWlmICgoaXJxX3BoYXNlICYgKFBIQVNFX0NIQU5HRV9JUlEgfCBMQVRDSEVEX0JVU19GUkVFKSkgPT0gMCkgeworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJfQorCisJLy9zaG93X3BoYXNlKHRtcFNDKTsKKworCXN3aXRjaCh0bXBTQy0+U0NwLnBoYXNlKSB7CisJY2FzZSBQSF9TRUxTVEFSVDoKKwkJLy8gKnN5bmNfbmVnID0gU1lOQ19OT1RfWUVUOworCQlpZiAoKHBoYXNlICYgQlVTTU9OX0JTWSkgPT0gMCkgeworCQkJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAic2VsZWN0aW9uIGNvdW50PSVkIiwgZGF0YS0+U2VsZWN0aW9uVGltZU91dCk7CisJCQlpZiAoZGF0YS0+U2VsZWN0aW9uVGltZU91dCA+PSBOU1BfU0VMVElNRU9VVCkgeworCQkJCW5zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJzZWxlY3Rpb24gdGltZSBvdXQiKTsKKwkJCQlkYXRhLT5TZWxlY3Rpb25UaW1lT3V0ID0gMDsKKwkJCQluc3BfaW5kZXhfd3JpdGUoYmFzZSwgU0NTSUJVU0NUUkwsIDApOworCisJCQkJdG1wU0MtPnJlc3VsdCAgID0gRElEX1RJTUVfT1VUIDw8IDE2OworCQkJCW5zcF9zY3NpX2RvbmUodG1wU0MpOworCisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfQorCQkJZGF0YS0+U2VsZWN0aW9uVGltZU91dCArPSAxOworCQkJbnNwX3N0YXJ0X3RpbWVyKHRtcFNDLCAxMDAwLzUxKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCisJCS8qIGF0dGVudGlvbiBhc3NlcnQgKi8KKwkJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAiYXR0ZW50aW9uIGFzc2VydCIpOworCQlkYXRhLT5TZWxlY3Rpb25UaW1lT3V0ID0gMDsKKwkJdG1wU0MtPlNDcC5waGFzZSAgICAgICA9IFBIX1NFTEVDVEVEOworCQluc3BfaW5kZXhfd3JpdGUoYmFzZSwgU0NTSUJVU0NUUkwsIFNDU0lfQVROKTsKKwkJdWRlbGF5KDEpOworCQluc3BfaW5kZXhfd3JpdGUoYmFzZSwgU0NTSUJVU0NUUkwsIFNDU0lfQVROIHwgQVVUT0RJUkVDVElPTiB8IEFDS0VOQik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKworCQlicmVhazsKKworCWNhc2UgUEhfUkVTRUxFQ1Q6CisJCS8vbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgInBoYXNlIHJlc2VsZWN0Iik7CisJCS8vICpzeW5jX25lZyA9IFNZTkNfTk9UX1lFVDsKKwkJaWYgKChwaGFzZSAmIEJVU01PTl9QSEFTRV9NQVNLKSAhPSBCVVNQSEFTRV9NRVNTQUdFX0lOKSB7CisKKwkJCXRtcFNDLT5yZXN1bHQJPSBESURfQUJPUlQgPDwgMTY7CisJCQluc3Bfc2NzaV9kb25lKHRtcFNDKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCQkvKiBmYWxsIHRocnUgKi8KKwlkZWZhdWx0OgorCQlpZiAoKGlycV9zdGF0dXMgJiAoSVJRU1RBVFVTX1NDU0kgfCBJUlFTVEFUVVNfRklGTykpID09IDApIHsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFNDU0kgc2VxdWVuY2VyCisJICovCisJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAic3RhcnQgc2NzaSBzZXEiKTsKKworCS8qIG5vcm1hbCBkaXNjb25uZWN0ICovCisJaWYgKCgodG1wU0MtPlNDcC5waGFzZSA9PSBQSF9NU0dfSU4pIHx8ICh0bXBTQy0+U0NwLnBoYXNlID09IFBIX01TR19PVVQpKSAmJgorCSAgICAoaXJxX3BoYXNlICYgTEFUQ0hFRF9CVVNfRlJFRSkgIT0gMCApIHsKKwkJbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgIm5vcm1hbCBkaXNjb25uZWN0IGlycV9zdGF0dXM9MHgleCwgcGhhc2U9MHgleCwgaXJxX3BoYXNlPTB4JXgiLCBpcnFfc3RhdHVzLCBwaGFzZSwgaXJxX3BoYXNlKTsKKworCQkvLypzeW5jX25lZyAgICAgICA9IFNZTkNfTk9UX1lFVDsKKworCQlpZiAoKHRtcFNDLT5TQ3AuTWVzc2FnZSA9PSBNU0dfQ09NTUFORF9DT01QTEVURSkpIHsgICAgIC8qIGFsbCBjb21tYW5kIGNvbXBsZXRlIGFuZCByZXR1cm4gc3RhdHVzICovCisJCQl0bXBTQy0+cmVzdWx0ID0gKERJRF9PSwkJICAgICAgICAgICAgIDw8IDE2KSB8CisJCQkJCSgodG1wU0MtPlNDcC5NZXNzYWdlICYgMHhmZikgPDwgIDgpIHwKKwkJCQkJKCh0bXBTQy0+U0NwLlN0YXR1cyAgJiAweGZmKSA8PCAgMCk7CisJCQluc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAiY29tbWFuZCBjb21wbGV0ZSByZXN1bHQ9MHgleCIsIHRtcFNDLT5yZXN1bHQpOworCQkJbnNwX3Njc2lfZG9uZSh0bXBTQyk7CisKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKworCS8qIGNoZWNrIHVuZXhwZWN0ZWQgYnVzIGZyZWUgc3RhdGUgKi8KKwlpZiAocGhhc2UgPT0gMCkgeworCQluc3BfbXNnKEtFUk5fREVCVUcsICJ1bmV4cGVjdGVkIGJ1cyBmcmVlLiBpcnFfc3RhdHVzPTB4JXgsIHBoYXNlPTB4JXgsIGlycV9waGFzZT0weCV4IiwgaXJxX3N0YXR1cywgcGhhc2UsIGlycV9waGFzZSk7CisKKwkJKnN5bmNfbmVnICAgICAgID0gU1lOQ19ORzsKKwkJdG1wU0MtPnJlc3VsdCAgID0gRElEX0VSUk9SIDw8IDE2OworCQluc3Bfc2NzaV9kb25lKHRtcFNDKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXN3aXRjaCAocGhhc2UgJiBCVVNNT05fUEhBU0VfTUFTSykgeworCWNhc2UgQlVTUEhBU0VfQ09NTUFORDoKKwkJbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgIkJVU1BIQVNFX0NPTU1BTkQiKTsKKwkJaWYgKChwaGFzZSAmIEJVU01PTl9SRVEpID09IDApIHsKKwkJCW5zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJSRVEgPT0gMCIpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisKKwkJdG1wU0MtPlNDcC5waGFzZSA9IFBIX0NPTU1BTkQ7CisKKwkJbnNwX25leHVzKHRtcFNDKTsKKworCQkvKiB3cml0ZSBzY3NpIGNvbW1hbmQgKi8KKwkJbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgImNtZF9sZW49JWQiLCB0bXBTQy0+Y21kX2xlbik7CisJCW5zcF9pbmRleF93cml0ZShiYXNlLCBDT01NQU5EQ1RSTCwgQ0xFQVJfQ09NTUFORF9QT0lOVEVSKTsKKwkJZm9yIChpID0gMDsgaSA8IHRtcFNDLT5jbWRfbGVuOyBpKyspIHsKKwkJCW5zcF9pbmRleF93cml0ZShiYXNlLCBDT01NQU5EREFUQSwgdG1wU0MtPmNtbmRbaV0pOworCQl9CisJCW5zcF9pbmRleF93cml0ZShiYXNlLCBDT01NQU5EQ1RSTCwgQ0xFQVJfQ09NTUFORF9QT0lOVEVSIHwgQVVUT19DT01NQU5EX0dPKTsKKwkJYnJlYWs7CisKKwljYXNlIEJVU1BIQVNFX0RBVEFfT1VUOgorCQluc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAiQlVTUEhBU0VfREFUQV9PVVQiKTsKKworCQl0bXBTQy0+U0NwLnBoYXNlICAgICAgICA9IFBIX0RBVEE7CisJCXRtcFNDLT5TQ3AuaGF2ZV9kYXRhX2luID0gSU9fT1VUOworCisJCW5zcF9waW9fd3JpdGUodG1wU0MpOworCisJCWJyZWFrOworCisJY2FzZSBCVVNQSEFTRV9EQVRBX0lOOgorCQluc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAiQlVTUEhBU0VfREFUQV9JTiIpOworCisJCXRtcFNDLT5TQ3AucGhhc2UgICAgICAgID0gUEhfREFUQTsKKwkJdG1wU0MtPlNDcC5oYXZlX2RhdGFfaW4gPSBJT19JTjsKKworCQluc3BfcGlvX3JlYWQodG1wU0MpOworCisJCWJyZWFrOworCisJY2FzZSBCVVNQSEFTRV9TVEFUVVM6CisJCW5zcF9kYXRhcGhhc2VfYnlwYXNzKHRtcFNDKTsKKwkJbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgIkJVU1BIQVNFX1NUQVRVUyIpOworCisJCXRtcFNDLT5TQ3AucGhhc2UgPSBQSF9TVEFUVVM7CisKKwkJdG1wU0MtPlNDcC5TdGF0dXMgPSBuc3BfaW5kZXhfcmVhZChiYXNlLCBTQ1NJREFUQVdJVEhBQ0spOworCQluc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAibWVzc2FnZT0weCV4IHN0YXR1cz0weCV4IiwgdG1wU0MtPlNDcC5NZXNzYWdlLCB0bXBTQy0+U0NwLlN0YXR1cyk7CisKKwkJYnJlYWs7CisKKwljYXNlIEJVU1BIQVNFX01FU1NBR0VfT1VUOgorCQluc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAiQlVTUEhBU0VfTUVTU0FHRV9PVVQiKTsKKwkJaWYgKChwaGFzZSAmIEJVU01PTl9SRVEpID09IDApIHsKKwkJCWdvdG8gdGltZXJfb3V0OworCQl9CisKKwkJdG1wU0MtPlNDcC5waGFzZSA9IFBIX01TR19PVVQ7CisKKwkJLy8qc3luY19uZWcgPSBTWU5DX05PVF9ZRVQ7CisKKwkJZGF0YS0+TXNnTGVuID0gaSA9IDA7CisJCWRhdGEtPk1zZ0J1ZmZlcltpXSA9IElERU5USUZZKFRSVUUsIGx1bik7IGkrKzsKKworCQlpZiAoKnN5bmNfbmVnID09IFNZTkNfTk9UX1lFVCkgeworCQkJZGF0YS0+U3luY1t0YXJnZXRdLlN5bmNQZXJpb2QgPSAwOworCQkJZGF0YS0+U3luY1t0YXJnZXRdLlN5bmNPZmZzZXQgPSAwOworCisJCQkvKiovCisJCQlkYXRhLT5Nc2dCdWZmZXJbaV0gPSBNU0dfRVhURU5ERUQ7IGkrKzsKKwkJCWRhdGEtPk1zZ0J1ZmZlcltpXSA9IDM7ICAgICAgICAgICAgaSsrOworCQkJZGF0YS0+TXNnQnVmZmVyW2ldID0gTVNHX0VYVF9TRFRSOyBpKys7CisJCQlkYXRhLT5Nc2dCdWZmZXJbaV0gPSAweDBjOyAgICAgICAgIGkrKzsKKwkJCWRhdGEtPk1zZ0J1ZmZlcltpXSA9IDE1OyAgICAgICAgICAgaSsrOworCQkJLyoqLworCQl9CisJCWRhdGEtPk1zZ0xlbiA9IGk7CisKKwkJbnNwX2FuYWx5emVfc2R0cih0bXBTQyk7CisJCXNob3dfbWVzc2FnZShkYXRhKTsKKwkJbnNwX21lc3NhZ2Vfb3V0KHRtcFNDKTsKKwkJYnJlYWs7CisKKwljYXNlIEJVU1BIQVNFX01FU1NBR0VfSU46CisJCW5zcF9kYXRhcGhhc2VfYnlwYXNzKHRtcFNDKTsKKwkJbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgIkJVU1BIQVNFX01FU1NBR0VfSU4iKTsKKwkJaWYgKChwaGFzZSAmIEJVU01PTl9SRVEpID09IDApIHsKKwkJCWdvdG8gdGltZXJfb3V0OworCQl9CisKKwkJdG1wU0MtPlNDcC5waGFzZSA9IFBIX01TR19JTjsKKwkJbnNwX21lc3NhZ2VfaW4odG1wU0MpOworCisJCS8qKi8KKwkJaWYgKCpzeW5jX25lZyA9PSBTWU5DX05PVF9ZRVQpIHsKKwkJCS8vbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgInN5bmMgdGFyZ2V0PSVkLGx1bj0lZCIsdGFyZ2V0LGx1bik7CisKKwkJCWlmIChkYXRhLT5Nc2dMZW4gICAgICAgPj0gNSAgICAgICAgICAgICYmCisJCQkgICAgZGF0YS0+TXNnQnVmZmVyWzBdID09IE1TR19FWFRFTkRFRCAmJgorCQkJICAgIGRhdGEtPk1zZ0J1ZmZlclsxXSA9PSAzICAgICAgICAgICAgJiYKKwkJCSAgICBkYXRhLT5Nc2dCdWZmZXJbMl0gPT0gTVNHX0VYVF9TRFRSICkgeworCQkJCWRhdGEtPlN5bmNbdGFyZ2V0XS5TeW5jUGVyaW9kID0gZGF0YS0+TXNnQnVmZmVyWzNdOworCQkJCWRhdGEtPlN5bmNbdGFyZ2V0XS5TeW5jT2Zmc2V0ID0gZGF0YS0+TXNnQnVmZmVyWzRdOworCQkJCS8vbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgInN5bmMgb2ssICVkICVkIiwgZGF0YS0+TXNnQnVmZmVyWzNdLCBkYXRhLT5Nc2dCdWZmZXJbNF0pOworCQkJCSpzeW5jX25lZyA9IFNZTkNfT0s7CisJCQl9IGVsc2UgeworCQkJCWRhdGEtPlN5bmNbdGFyZ2V0XS5TeW5jUGVyaW9kID0gMDsKKwkJCQlkYXRhLT5TeW5jW3RhcmdldF0uU3luY09mZnNldCA9IDA7CisJCQkJKnN5bmNfbmVnID0gU1lOQ19ORzsKKwkJCX0KKwkJCW5zcF9hbmFseXplX3NkdHIodG1wU0MpOworCQl9CisJCS8qKi8KKworCQkvKiBzZWFyY2ggbGFzdCBtZXNzZWFnZSBieXRlICovCisJCXRtcCA9IC0xOworCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+TXNnTGVuOyBpKyspIHsKKwkJCXRtcCA9IGRhdGEtPk1zZ0J1ZmZlcltpXTsKKwkJCWlmIChkYXRhLT5Nc2dCdWZmZXJbaV0gPT0gTVNHX0VYVEVOREVEKSB7CisJCQkJaSArPSAoMSArIGRhdGEtPk1zZ0J1ZmZlcltpKzFdKTsKKwkJCX0KKwkJfQorCQl0bXBTQy0+U0NwLk1lc3NhZ2UgPSB0bXA7CisKKwkJbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgIm1lc3NhZ2U9MHgleCBsZW49JWQiLCB0bXBTQy0+U0NwLk1lc3NhZ2UsIGRhdGEtPk1zZ0xlbik7CisJCXNob3dfbWVzc2FnZShkYXRhKTsKKworCQlicmVhazsKKworCWNhc2UgQlVTUEhBU0VfU0VMRUNUOgorCWRlZmF1bHQ6CisJCW5zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJCVVNQSEFTRSBvdGhlciIpOworCisJCWJyZWFrOworCX0KKworCS8vbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgIm91dCIpOworCXJldHVybiBJUlFfSEFORExFRDsgCQorCit0aW1lcl9vdXQ6CisJbnNwX3N0YXJ0X3RpbWVyKHRtcFNDLCAxMDAwLzEwMik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjaWZkZWYgTlNQX0RFQlVHCisjaW5jbHVkZSAibnNwX2RlYnVnLmMiCisjZW5kaWYJLyogTlNQX0RFQlVHICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBsb29rIGZvciBuaW5qYTMgY2FyZCBhbmQgaW5pdCBpZiBmb3VuZAkJCSAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqbnNwX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnNodCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwkvKiByZWdpc3RlcmVkIGhvc3Qgc3RydWN0dXJlICovCisJbnNwX2h3X2RhdGEgKmRhdGFfYiA9ICZuc3BfZGF0YV9iYXNlLCAqZGF0YTsKKworCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJ0aGlzX2lkPSVkIiwgc2h0LT50aGlzX2lkKTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDczKSkKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZuc3BfZHJpdmVyX3RlbXBsYXRlLCBzaXplb2YobnNwX2h3X2RhdGEpKTsKKyNlbHNlCisJaG9zdCA9IHNjc2lfcmVnaXN0ZXIoc2h0LCBzaXplb2YobnNwX2h3X2RhdGEpKTsKKyNlbmRpZgorCWlmIChob3N0ID09IE5VTEwpIHsKKwkJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImhvc3QgZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbWNweShob3N0LT5ob3N0ZGF0YSwgZGF0YV9iLCBzaXplb2YobnNwX2h3X2RhdGEpKTsKKwlkYXRhID0gKG5zcF9od19kYXRhICopaG9zdC0+aG9zdGRhdGE7CisJZGF0YS0+U2NzaUluZm8tPmhvc3QgPSBob3N0OworI2lmZGVmIE5TUF9ERUJVRworCWRhdGEtPkNtZElkID0gMDsKKyNlbmRpZgorCisJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImlycT0lZCwlZCIsIGRhdGFfYi0+SXJxTnVtYmVyLCAoKG5zcF9od19kYXRhICopaG9zdC0+aG9zdGRhdGEpLT5JcnFOdW1iZXIpOworCisJaG9zdC0+dW5pcXVlX2lkCSAgPSBkYXRhLT5CYXNlQWRkcmVzczsKKwlob3N0LT5pb19wb3J0CSAgPSBkYXRhLT5CYXNlQWRkcmVzczsKKwlob3N0LT5uX2lvX3BvcnQJICA9IGRhdGEtPk51bUFkZHJlc3M7CisJaG9zdC0+aXJxCSAgPSBkYXRhLT5JcnFOdW1iZXI7CisJaG9zdC0+YmFzZSAgICAgICAgPSBkYXRhLT5NbWlvQWRkcmVzczsKKworCXNwaW5fbG9ja19pbml0KCYoZGF0YS0+TG9jaykpOworCisJc25wcmludGYoZGF0YS0+bnNwaW5mbywKKwkJIHNpemVvZihkYXRhLT5uc3BpbmZvKSwKKwkJICJOaW5qYVNDU0ktMy8zMkJpIERyaXZlciAkUmV2aXNpb246IDEuMjMgJCBJTzoweCUwNGx4LTB4JTA0bHggTU1JTyh2aXJ0IGFkZHIpOjB4JTA0bHggSVJROiUwMmQiLAorCQkgaG9zdC0+aW9fcG9ydCwgaG9zdC0+aW9fcG9ydCArIGhvc3QtPm5faW9fcG9ydCAtIDEsCisJCSBob3N0LT5iYXNlLAorCQkgaG9zdC0+aXJxKTsKKwlzaHQtPm5hbWUJICA9IGRhdGEtPm5zcGluZm87CisKKwluc3BfZGJnKE5TUF9ERUJVR19JTklULCAiZW5kIik7CisKKworCXJldHVybiBob3N0OyAvKiBkZXRlY3QgZG9uZS4gKi8KK30KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCitzdGF0aWMgaW50IG5zcF9kZXRlY3Rfb2xkKFNjc2lfSG9zdF9UZW1wbGF0ZSAqc2h0KQoreworCWlmIChuc3BfZGV0ZWN0KHNodCkgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvL01PRF9JTkNfVVNFX0NPVU5UOworCQlyZXR1cm4gMTsKKwl9Cit9CisKKworc3RhdGljIGludCBuc3BfcmVsZWFzZV9vbGQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJLy9uc3BfaHdfZGF0YSAqZGF0YSA9IChuc3BfaHdfZGF0YSAqKXNocG50LT5ob3N0ZGF0YTsKKworCS8qIFBDTUNJQSBDYXJkIFNlcnZpY2UgZG9zZSBzYW1lIHRoaW5ncyBiZWxvdy4gKi8KKwkvKiBTbyB3ZSBkbyBub3RoaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLy9pZiAoc2hwbnQtPmlycSkgeworCS8vCWZyZWVfaXJxKHNocG50LT5pcnEsIGRhdGEtPlNjc2lJbmZvKTsKKwkvL30KKwkvL2lmIChzaHBudC0+aW9fcG9ydCkgeworCS8vCXJlbGVhc2VfcmVnaW9uKHNocG50LT5pb19wb3J0LCBzaHBudC0+bl9pb19wb3J0KTsKKwkvL30KKworCS8vTU9EX0RFQ19VU0VfQ09VTlQ7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogcmV0dXJuIGluZm8gc3RyaW5nCQkJCQkJICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBjb25zdCBjaGFyICpuc3BfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwluc3BfaHdfZGF0YSAqZGF0YSA9IChuc3BfaHdfZGF0YSAqKXNocG50LT5ob3N0ZGF0YTsKKworCXJldHVybiBkYXRhLT5uc3BpbmZvOworfQorCisjdW5kZWYgU1BSSU5URgorI2RlZmluZSBTUFJJTlRGKGFyZ3MuLi4pIFwKKyAgICAgICAgZG8geyBcCisJCWlmKGxlbmd0aCA+IChwb3MgLSBidWZmZXIpKSB7IFwKKwkJCXBvcyArPSBzbnByaW50Zihwb3MsIGxlbmd0aCAtIChwb3MgLSBidWZmZXIpICsgMSwgIyMgYXJncyk7IFwKKwkJCW5zcF9kYmcoTlNQX0RFQlVHX1BST0MsICJidWZmZXI9MHglcCBwb3M9MHglcCBsZW5ndGg9JWQgJWRcbiIsIGJ1ZmZlciwgcG9zLCBsZW5ndGgsICBsZW5ndGggLSAocG9zIC0gYnVmZmVyKSk7XAorCQl9IFwKKwl9IHdoaWxlKDApCitzdGF0aWMgaW50Cituc3BfcHJvY19pbmZvKAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNzMpKQorCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsCisjZW5kaWYKKwljaGFyICAqYnVmZmVyLAorCWNoYXIgKipzdGFydCwKKwlvZmZfdCAgb2Zmc2V0LAorCWludCAgICBsZW5ndGgsCisjaWYgIShMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNzMpKQorCWludCAgICBob3N0bm8sCisjZW5kaWYKKwlpbnQgICAgaW5vdXQpCit7CisJaW50IGlkOworCWNoYXIgKnBvcyA9IGJ1ZmZlcjsKKwlpbnQgdGhpc2xlbmd0aDsKKwlpbnQgc3BlZWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwluc3BfaHdfZGF0YSAqZGF0YTsKKyNpZiAhKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw3MykpCisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKyNlbHNlCisJaW50IGhvc3RubzsKKyNlbmRpZgorCWlmIChpbm91dCkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDczKSkKKwlob3N0bm8gPSBob3N0LT5ob3N0X25vOworI2Vsc2UKKwkvKiBzZWFyY2ggdGhpcyBIQkEgaG9zdCAqLworCWhvc3QgPSBzY3NpX2hvc3RfaG5fZ2V0KGhvc3Rubyk7CisJaWYgKGhvc3QgPT0gTlVMTCkgeworCQlyZXR1cm4gLUVTUkNIOworCX0KKyNlbmRpZgorCWRhdGEgPSAobnNwX2h3X2RhdGEgKilob3N0LT5ob3N0ZGF0YTsKKworCisJU1BSSU5URigiTmluamFTQ1NJIHN0YXR1c1xuXG4iKTsKKwlTUFJJTlRGKCJEcml2ZXIgdmVyc2lvbjogICAgICAgICRSZXZpc2lvbjogMS4yMyAkXG4iKTsKKwlTUFJJTlRGKCJTQ1NJIGhvc3QgTm8uOiAgICAgICAgICVkXG4iLCAgICAgICAgICBob3N0bm8pOworCVNQUklOVEYoIklSUTogICAgICAgICAgICAgICAgICAgJWRcbiIsICAgICAgICAgIGhvc3QtPmlycSk7CisJU1BSSU5URigiSU86ICAgICAgICAgICAgICAgICAgICAweCVseC0weCVseFxuIiwgaG9zdC0+aW9fcG9ydCwgaG9zdC0+aW9fcG9ydCArIGhvc3QtPm5faW9fcG9ydCAtIDEpOworCVNQUklOVEYoIk1NSU8odmlydHVhbCBhZGRyZXNzKTogMHglbHgtMHglbHhcbiIsIGhvc3QtPmJhc2UsIGhvc3QtPmJhc2UgKyBkYXRhLT5NbWlvTGVuZ3RoIC0gMSk7CisJU1BSSU5URigic2dfdGFibGVzaXplOiAgICAgICAgICAlZFxuIiwgICAgICAgICAgaG9zdC0+c2dfdGFibGVzaXplKTsKKworCVNQUklOVEYoImJ1cnN0IHRyYW5zZmVyIG1vZGU6ICAgIik7CisJc3dpdGNoIChuc3BfYnVyc3RfbW9kZSkgeworCWNhc2UgQlVSU1RfSU84OgorCQlTUFJJTlRGKCJpbzgiKTsKKwkJYnJlYWs7CisJY2FzZSBCVVJTVF9JTzMyOgorCQlTUFJJTlRGKCJpbzMyIik7CisJCWJyZWFrOworCWNhc2UgQlVSU1RfTUVNMzI6CisJCVNQUklOVEYoIm1lbTMyIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVNQUklOVEYoIj8/PyIpOworCQlicmVhazsKKwl9CisJU1BSSU5URigiXG4iKTsKKworCisJc3Bpbl9sb2NrX2lycXNhdmUoJihkYXRhLT5Mb2NrKSwgZmxhZ3MpOworCVNQUklOVEYoIkN1cnJlbnRTQzogICAgICAgICAgICAgMHglcFxuXG4iLCAgICAgIGRhdGEtPkN1cnJlbnRTQyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGRhdGEtPkxvY2spLCBmbGFncyk7CisKKwlTUFJJTlRGKCJTRFRSIHN0YXR1c1xuIik7CisJZm9yKGlkID0gMDsgaWQgPCBBUlJBWV9TSVpFKGRhdGEtPlN5bmMpOyBpZCsrKSB7CisKKwkJU1BSSU5URigiaWQgJWQ6ICIsIGlkKTsKKworCQlpZiAoaWQgPT0gaG9zdC0+dGhpc19pZCkgeworCQkJU1BSSU5URigiLS0tLS0gTmluamFTQ1NJLTMgaG9zdCBhZGFwdGVyXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoKGRhdGEtPlN5bmNbaWRdLlN5bmNOZWdvdGlhdGlvbikgeworCQljYXNlIFNZTkNfT0s6CisJCQlTUFJJTlRGKCIgc3luYyIpOworCQkJYnJlYWs7CisJCWNhc2UgU1lOQ19ORzoKKwkJCVNQUklOVEYoImFzeW5jIik7CisJCQlicmVhazsKKwkJY2FzZSBTWU5DX05PVF9ZRVQ6CisJCQlTUFJJTlRGKCIgbm9uZSIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlTUFJJTlRGKCI/Pz8/PyIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZGF0YS0+U3luY1tpZF0uU3luY1BlcmlvZCAhPSAwKSB7CisJCQlzcGVlZCA9IDEwMDAwMDAgLyAoZGF0YS0+U3luY1tpZF0uU3luY1BlcmlvZCAqIDQpOworCisJCQlTUFJJTlRGKCIgdHJhbnNmZXIgJWQuJWRNQi9zLCBvZmZzZXQgJWQiLAorCQkJCXNwZWVkIC8gMTAwMCwKKwkJCQlzcGVlZCAlIDEwMDAsCisJCQkJZGF0YS0+U3luY1tpZF0uU3luY09mZnNldAorCQkJCSk7CisJCX0KKwkJU1BSSU5URigiXG4iKTsKKwl9CisKKwl0aGlzbGVuZ3RoID0gcG9zIC0gKGJ1ZmZlciArIG9mZnNldCk7CisKKwlpZih0aGlzbGVuZ3RoIDwgMCkgeworCQkqc3RhcnQgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKworCXRoaXNsZW5ndGggPSBtaW4odGhpc2xlbmd0aCwgbGVuZ3RoKTsKKwkqc3RhcnQgPSBidWZmZXIgKyBvZmZzZXQ7CisKKwlyZXR1cm4gdGhpc2xlbmd0aDsKK30KKyN1bmRlZiBTUFJJTlRGCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIGVycm9yIGhhbmRsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLypzdGF0aWMgaW50IG5zcF9laF9zdHJhdGVneShzdHJ1Y3QgU2NzaV9Ib3N0ICpTaG9zdCkKK3sKKwlyZXR1cm4gRkFJTEVEOworfSovCisKKy8qCitzdGF0aWMgaW50IG5zcF9laF9hYm9ydChTY3NpX0NtbmQgKlNDcG50KQoreworCW5zcF9kYmcoTlNQX0RFQlVHX0JVU1JFU0VULCAiU0NwbnQ9MHglcCIsIFNDcG50KTsKKworCXJldHVybiBuc3BfZWhfYnVzX3Jlc2V0KFNDcG50KTsKK30qLworCisvKgorc3RhdGljIGludCBuc3BfZWhfZGV2aWNlX3Jlc2V0KFNjc2lfQ21uZCAqU0NwbnQpCit7CisJbnNwX2RiZyhOU1BfREVCVUdfQlVTUkVTRVQsICIlczogU0NwbnQ9MHglcCIsIFNDcG50KTsKKworCXJldHVybiBGQUlMRUQ7Cit9Ki8KKworc3RhdGljIGludCBuc3BfYnVzX3Jlc2V0KG5zcF9od19kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGludCBiYXNlID0gZGF0YS0+QmFzZUFkZHJlc3M7CisJaW50CSAgICAgaTsKKworCW5zcF93cml0ZShiYXNlLCBJUlFDT05UUk9MLCBJUlFDT05UUk9MX0FMTE1BU0spOworCisJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFNDU0lCVVNDVFJMLCBTQ1NJX1JTVCk7CisJbWRlbGF5KDEwMCk7IC8qIDEwMG1zICovCisJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFNDU0lCVVNDVFJMLCAwKTsKKwlmb3IoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJbnNwX2luZGV4X3JlYWQoYmFzZSwgSVJRUEhBU0VTRU5DRSk7IC8qIGR1bW15IHJlYWQgKi8KKwl9CisKKwluc3Bod19pbml0X3N5bmMoZGF0YSk7CisKKwluc3Bfd3JpdGUoYmFzZSwgSVJRQ09OVFJPTCwgSVJRQ09OVFJPTF9BTExDTEVBUik7CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBuc3BfZWhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqU0NwbnQpCit7CisJbnNwX2h3X2RhdGEgKmRhdGEgPSAobnNwX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCW5zcF9kYmcoTlNQX0RFQlVHX0JVU1JFU0VULCAiU0NwbnQ9MHglcCIsIFNDcG50KTsKKworCXJldHVybiBuc3BfYnVzX3Jlc2V0KGRhdGEpOworfQorCitzdGF0aWMgaW50IG5zcF9laF9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqU0NwbnQpCit7CisJbnNwX2h3X2RhdGEgKmRhdGEgPSAobnNwX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCW5zcF9kYmcoTlNQX0RFQlVHX0JVU1JFU0VULCAiaW4iKTsKKworCW5zcGh3X2luaXQoZGF0YSk7CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBQQ01DSUEgZnVuY3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBuc3BfY3NfYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKyAgICBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKKyAgICB3aXRoIENhcmQgU2VydmljZXMuCisKKyAgICBUaGUgZGV2X2xpbmsgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkKKyAgICBjb25maWd1cmUgdGhlIGNhcmQgYXQgdGhpcyBwb2ludCAtLSB3ZSB3YWl0IHVudGlsIHdlIHJlY2VpdmUgYQorICAgIGNhcmQgaW5zZXJ0aW9uIGV2ZW50LgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgZGV2X2xpbmtfdCAqbnNwX2NzX2F0dGFjaCh2b2lkKQoreworCXNjc2lfaW5mb190ICAqaW5mbzsKKwljbGllbnRfcmVnX3QgIGNsaWVudF9yZWc7CisJZGV2X2xpbmtfdCAgICpsaW5rOworCWludAkgICAgICByZXQ7CisJbnNwX2h3X2RhdGEgICpkYXRhID0gJm5zcF9kYXRhX2Jhc2U7CisKKwluc3BfZGJnKE5TUF9ERUJVR19JTklULCAiaW4iKTsKKworCS8qIENyZWF0ZSBuZXcgU0NTSSBkZXZpY2UgKi8KKwlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoaW5mbyA9PSBOVUxMKSB7IHJldHVybiBOVUxMOyB9CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCWxpbmsgPSAmaW5mby0+bGluazsKKwlsaW5rLT5wcml2ID0gaW5mbzsKKwlkYXRhLT5TY3NpSW5mbyA9IGluZm87CisKKwluc3BfZGJnKE5TUF9ERUJVR19JTklULCAiaW5mbz0weCVwIiwgaW5mbyk7CisKKwkvKiBUaGUgaW8gc3RydWN0dXJlIGRlc2NyaWJlcyBJTyBwb3J0IG1hcHBpbmcgKi8KKwlsaW5rLT5pby5OdW1Qb3J0czEJID0gMHgxMDsKKwlsaW5rLT5pby5BdHRyaWJ1dGVzMQkgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKKwlsaW5rLT5pby5JT0FkZHJMaW5lcwkgPSAxMDsJLyogbm90IHVzZWQgKi8KKworCS8qIEludGVycnVwdCBzZXR1cCAqLworCWxpbmstPmlycS5BdHRyaWJ1dGVzCSA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKKwlsaW5rLT5pcnEuSVJRSW5mbzEJID0gSVJRX0xFVkVMX0lEOworCisJLyogSW50ZXJydXB0IGhhbmRsZXIgKi8KKwlsaW5rLT5pcnEuSGFuZGxlcgkgPSAmbnNwaW50cjsKKwlsaW5rLT5pcnEuSW5zdGFuY2UgICAgICAgPSBpbmZvOworCWxpbmstPmlycS5BdHRyaWJ1dGVzICAgICB8PSAoU0FfU0hJUlEgfCBTQV9TQU1QTEVfUkFORE9NKTsKKworCS8qIEdlbmVyYWwgc29ja2V0IGNvbmZpZ3VyYXRpb24gKi8KKwlsaW5rLT5jb25mLkF0dHJpYnV0ZXMJID0gQ09ORl9FTkFCTEVfSVJROworCWxpbmstPmNvbmYuVmNjCQkgPSA1MDsKKwlsaW5rLT5jb25mLkludFR5cGUJID0gSU5UX01FTU9SWV9BTkRfSU87CisJbGluay0+Y29uZi5QcmVzZW50CSA9IFBSRVNFTlRfT1BUSU9OOworCisKKwkvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKwlsaW5rLT5uZXh0ICAgICAgICAgICAgICAgPSBkZXZfbGlzdDsKKwlkZXZfbGlzdCAgICAgICAgICAgICAgICAgPSBsaW5rOworCWNsaWVudF9yZWcuZGV2X2luZm8JID0gJmRldl9pbmZvOworCWNsaWVudF9yZWcuRXZlbnRNYXNrCSA9CisJCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwkJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUCXwKKwkJQ1NfRVZFTlRfUE1fU1VTUEVORAl8IENTX0VWRU5UX1BNX1JFU1VNRQkgOworCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZuc3BfY3NfZXZlbnQ7CisJY2xpZW50X3JlZy5WZXJzaW9uCSA9IDB4MDIxMDsKKwljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworCXJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOworCWlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgeworCQljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCQluc3BfY3NfZGV0YWNoKGxpbmspOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKworCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJsaW5rPTB4JXAiLCBsaW5rKTsKKwlyZXR1cm4gbGluazsKK30gLyogbnNwX2NzX2F0dGFjaCAqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisgICAgd2l0aCBDYXJkIFNlcnZpY2VzLgkgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCisgICAgc3RydWN0dXJlcyBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQKKyAgICB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIG5zcF9jc19kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKwlkZXZfbGlua190ICoqbGlua3A7CisKKwluc3BfZGJnKE5TUF9ERUJVR19JTklULCAiaW4sIGxpbms9MHglcCIsIGxpbmspOworCisJLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KSB7CisJCWlmICgqbGlua3AgPT0gbGluaykgeworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCpsaW5rcCA9PSBOVUxMKSB7CisJCXJldHVybjsKKwl9CisKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCQluc3BfY3NfcmVsZWFzZShsaW5rKTsKKworCS8qIEJyZWFrIHRoZSBsaW5rIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworCWlmIChsaW5rLT5oYW5kbGUpIHsKKwkJcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisJfQorCisJLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgYml0cyAqLworCSpsaW5rcCA9IGxpbmstPm5leHQ7CisJa2ZyZWUobGluay0+cHJpdik7CisJbGluay0+cHJpdiA9IE5VTEw7CisKK30gLyogbnNwX2NzX2RldGFjaCAqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIG5zcF9jc19jb25maWcoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQKKyAgICBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKyAgICBldGhlcm5ldCBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgbnNwX2NzX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworCWNsaWVudF9oYW5kbGVfdAkgIGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKwlzY3NpX2luZm9fdAkgKmluZm8JID0gbGluay0+cHJpdjsKKwl0dXBsZV90CQkgIHR1cGxlOworCWNpc3BhcnNlX3QJICBwYXJzZTsKKwlpbnQJCSAgbGFzdF9yZXQsIGxhc3RfZm47CisJdW5zaWduZWQgY2hhcgkgIHR1cGxlX2RhdGFbNjRdOworCWNvbmZpZ19pbmZvX3QJICBjb25mOworCXdpbl9yZXFfdCAgICAgICAgIHJlcTsKKwltZW1yZXFfdCAgICAgICAgICBtYXA7CisJY2lzdHBsX2NmdGFibGVfZW50cnlfdCBkZmx0ID0geyAwIH07CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwluc3BfaHdfZGF0YSAgICAgICpkYXRhID0gJm5zcF9kYXRhX2Jhc2U7CisjaWYgIShMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDc0KSkKKwlTY3NpX0RldmljZQkgKmRldjsKKwlkZXZfbm9kZV90CSoqdGFpbCwgKm5vZGU7CisjZW5kaWYKKworCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJpbiIpOworCisJdHVwbGUuRGVzaXJlZFR1cGxlICAgID0gQ0lTVFBMX0NPTkZJRzsKKwl0dXBsZS5BdHRyaWJ1dGVzICAgICAgPSAwOworCXR1cGxlLlR1cGxlRGF0YQkgICAgICA9IHR1cGxlX2RhdGE7CisJdHVwbGUuVHVwbGVEYXRhTWF4ICAgID0gc2l6ZW9mKHR1cGxlX2RhdGEpOworCXR1cGxlLlR1cGxlT2Zmc2V0ICAgICA9IDA7CisJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwJcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisJQ1NfQ0hFQ0soUGFyc2VUdXBsZSwJcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKwlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKwlsaW5rLT5jb25mLlByZXNlbnQgICAgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisKKwkvKiBDb25maWd1cmUgY2FyZCAqLworCWxpbmstPnN0YXRlCSAgICAgIHw9IERFVl9DT05GSUc7CisKKwkvKiBMb29rIHVwIHRoZSBjdXJyZW50IFZjYyAqLworCUNTX0NIRUNLKEdldENvbmZpZ3VyYXRpb25JbmZvLCBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhoYW5kbGUsICZjb25mKSk7CisJbGluay0+Y29uZi5WY2MgPSBjb25mLlZjYzsKKworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwl3aGlsZSAoMSkgeworCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcgPSAmKHBhcnNlLmNmdGFibGVfZW50cnkpOworCisJCWlmIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpICE9IDAgfHwKKwkJCQlwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkgIT0gMCkKKwkJCWdvdG8gbmV4dF9lbnRyeTsKKworCQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0RFRkFVTFQpIHsgZGZsdCA9ICpjZmc7IH0KKwkJaWYgKGNmZy0+aW5kZXggPT0gMCkgeyBnb3RvIG5leHRfZW50cnk7IH0KKwkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7CisKKwkJLyogRG9lcyB0aGlzIGNhcmQgbmVlZCBhdWRpbyBvdXRwdXQ/ICovCisJCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfQVVESU8pIHsKKwkJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOworCQkJbGluay0+Y29uZi5TdGF0dXMgPSBDQ1NSX0FVRElPX0VOQTsKKwkJfQorCisJCS8qIFVzZSBwb3dlciBzZXR0aW5ncyBmb3IgVmNjIGFuZCBWcHAgaWYgcHJlc2VudCAqLworCQkvKiAgTm90ZSB0aGF0IHRoZSBDSVMgdmFsdWVzIG5lZWQgdG8gYmUgcmVzY2FsZWQgKi8KKwkJaWYgKGNmZy0+dmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCQlpZiAoY29uZi5WY2MgIT0gY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwKSB7CisJCQkJZ290byBuZXh0X2VudHJ5OworCQkJfQorCQl9IGVsc2UgaWYgKGRmbHQudmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCQlpZiAoY29uZi5WY2MgIT0gZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwKSB7CisJCQkJZ290byBuZXh0X2VudHJ5OworCQkJfQorCQl9CisKKwkJaWYgKGNmZy0+dnBwMS5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCQlsaW5rLT5jb25mLlZwcDEgPSBsaW5rLT5jb25mLlZwcDIgPQorCQkJCWNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKKwkJfSBlbHNlIGlmIChkZmx0LnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkgeworCQkJbGluay0+Y29uZi5WcHAxID0gbGluay0+Y29uZi5WcHAyID0KKwkJCQlkZmx0LnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDA7CisJCX0KKworCQkvKiBEbyB3ZSBuZWVkIHRvIGFsbG9jYXRlIGFuIGludGVycnVwdD8gKi8KKwkJaWYgKGNmZy0+aXJxLklSUUluZm8xIHx8IGRmbHQuaXJxLklSUUluZm8xKSB7CisJCQlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROworCQl9CisKKwkJLyogSU8gd2luZG93IHNldHRpbmdzICovCisJCWxpbmstPmlvLk51bVBvcnRzMSA9IGxpbmstPmlvLk51bVBvcnRzMiA9IDA7CisJCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQuaW8ubndpbiA+IDApKSB7CisJCQljaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQuaW87CisJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQorCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OworCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKKwkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OworCQkJbGluay0+aW8uSU9BZGRyTGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKKwkJCWxpbmstPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKKwkJCWxpbmstPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOworCQkJaWYgKGlvLT5ud2luID4gMSkgeworCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMyID0gbGluay0+aW8uQXR0cmlidXRlczE7CisJCQkJbGluay0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOworCQkJCWxpbmstPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMV0ubGVuOworCQkJfQorCQkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KKwkJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbykgIT0gMCkKKwkJCQlnb3RvIG5leHRfZW50cnk7CisJCX0KKworCQlpZiAoKGNmZy0+bWVtLm53aW4gPiAwKSB8fCAoZGZsdC5tZW0ubndpbiA+IDApKSB7CisJCQljaXN0cGxfbWVtX3QgKm1lbSA9CisJCQkJKGNmZy0+bWVtLm53aW4pID8gJmNmZy0+bWVtIDogJmRmbHQubWVtOworCQkJcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF8xNnxXSU5fTUVNT1JZX1RZUEVfQ007CisJCQlyZXEuQXR0cmlidXRlcyB8PSBXSU5fRU5BQkxFOworCQkJcmVxLkJhc2UgPSBtZW0tPndpblswXS5ob3N0X2FkZHI7CisJCQlyZXEuU2l6ZSA9IG1lbS0+d2luWzBdLmxlbjsKKwkJCWlmIChyZXEuU2l6ZSA8IDB4MTAwMCkgeworCQkJCXJlcS5TaXplID0gMHgxMDAwOworCQkJfQorCQkJcmVxLkFjY2Vzc1NwZWVkID0gMDsKKwkJCWlmIChwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmxpbmstPndpbikgIT0gMCkKKwkJCQlnb3RvIG5leHRfZW50cnk7CisJCQltYXAuUGFnZSA9IDA7IG1hcC5DYXJkT2Zmc2V0ID0gbWVtLT53aW5bMF0uY2FyZF9hZGRyOworCQkJaWYgKHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluay0+d2luLCAmbWFwKSAhPSAwKQorCQkJCWdvdG8gbmV4dF9lbnRyeTsKKworCQkJZGF0YS0+TW1pb0FkZHJlc3MgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwX25vY2FjaGUocmVxLkJhc2UsIHJlcS5TaXplKTsKKwkJCWRhdGEtPk1taW9MZW5ndGggID0gcmVxLlNpemU7CisJCX0KKwkJLyogSWYgd2UgZ290IHRoaXMgZmFyLCB3ZSdyZSBjb29sISAqLworCQlicmVhazsKKworCW5leHRfZW50cnk6CisJCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJuZXh0Iik7CisKKwkJaWYgKGxpbmstPmlvLk51bVBvcnRzMSkgeworCQkJcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCQl9CisJCUNTX0NIRUNLKEdldE5leHRUdXBsZSwgcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJfQorCisJaWYgKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkgeworCQlDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKSk7CisJfQorCUNTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKworCWlmIChmcmVlX3BvcnRzKSB7CisJCWlmIChsaW5rLT5pby5CYXNlUG9ydDEpIHsKKwkJCXJlbGVhc2VfcmVnaW9uKGxpbmstPmlvLkJhc2VQb3J0MSwgbGluay0+aW8uTnVtUG9ydHMxKTsKKwkJfQorCQlpZiAobGluay0+aW8uQmFzZVBvcnQyKSB7CisJCQlyZWxlYXNlX3JlZ2lvbihsaW5rLT5pby5CYXNlUG9ydDIsIGxpbmstPmlvLk51bVBvcnRzMik7CisJCX0KKwl9CisKKwkvKiBTZXQgcG9ydCBhbmQgSVJRICovCisJZGF0YS0+QmFzZUFkZHJlc3MgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisJZGF0YS0+TnVtQWRkcmVzcyAgPSBsaW5rLT5pby5OdW1Qb3J0czE7CisJZGF0YS0+SXJxTnVtYmVyICAgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisKKwluc3BfZGJnKE5TUF9ERUJVR19JTklULCAiSS9PWzB4JXgrMHgleF0gSVJRICVkIiwKKwkJZGF0YS0+QmFzZUFkZHJlc3MsIGRhdGEtPk51bUFkZHJlc3MsIGRhdGEtPklycU51bWJlcik7CisKKwlpZihuc3Bod19pbml0KGRhdGEpID09IEZBTFNFKSB7CisJCWdvdG8gY3NfZmFpbGVkOworCX0KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMikpCisJaG9zdCA9IG5zcF9kZXRlY3QoJm5zcF9kcml2ZXJfdGVtcGxhdGUpOworI2Vsc2UKKwlzY3NpX3JlZ2lzdGVyX2hvc3QoJm5zcF9kcml2ZXJfdGVtcGxhdGUpOworCWZvciAoaG9zdCA9IHNjc2lfaG9zdF9nZXRfbmV4dChOVUxMKTsgaG9zdCAhPSBOVUxMOworCSAgICAgaG9zdCA9IHNjc2lfaG9zdF9nZXRfbmV4dChob3N0KSkgeworCQlpZiAoaG9zdC0+aG9zdHQgPT0gJm5zcF9kcml2ZXJfdGVtcGxhdGUpIHsKKwkJCWJyZWFrOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoaG9zdCA9PSBOVUxMKSB7CisJCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJkZXRlY3QgZmFpbGVkIik7CisJCWdvdG8gY3NfZmFpbGVkOworCX0KKworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsNzQpKQorCXNjc2lfYWRkX2hvc3QgKGhvc3QsIE5VTEwpOworCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCisJc25wcmludGYoaW5mby0+bm9kZS5kZXZfbmFtZSwgc2l6ZW9mKGluZm8tPm5vZGUuZGV2X25hbWUpLCAic2NzaSVkIiwgaG9zdC0+aG9zdF9ubyk7CisJbGluay0+ZGV2ICA9ICZpbmZvLT5ub2RlOworCWluZm8tPmhvc3QgPSBob3N0OworCisjZWxzZQorCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJHRVRfU0NTSV9JTkZPIik7CisJdGFpbCA9ICZsaW5rLT5kZXY7CisJaW5mby0+bmRldiA9IDA7CisKKwluc3BfZGJnKE5TUF9ERUJVR19JTklULCAiaG9zdD0weCVwIiwgaG9zdCk7CisKKwlmb3IgKGRldiA9IGhvc3QtPmhvc3RfcXVldWU7IGRldiAhPSBOVUxMOyBkZXYgPSBkZXYtPm5leHQpIHsKKwkJdW5zaWduZWQgbG9uZyBpZDsKKwkJaWQgPSAoZGV2LT5pZCAmIDB4MGYpICsgKChkZXYtPmx1biAmIDB4MGYpIDw8IDQpICsKKwkJCSgoZGV2LT5jaGFubmVsICYgMHgwZikgPDwgOCkgKworCQkJKChkZXYtPmhvc3QtPmhvc3Rfbm8gJiAweDBmKSA8PCAxMik7CisJCW5vZGUgPSAmaW5mby0+bm9kZVtpbmZvLT5uZGV2XTsKKwkJbm9kZS0+bWlub3IgPSAwOworCQlzd2l0Y2ggKGRldi0+dHlwZSkgeworCQljYXNlIFRZUEVfVEFQRToKKwkJCW5vZGUtPm1ham9yID0gU0NTSV9UQVBFX01BSk9SOworCQkJc25wcmludGYobm9kZS0+ZGV2X25hbWUsIHNpemVvZihub2RlLT5kZXZfbmFtZSksICJzdCMlMDRseCIsIGlkKTsKKwkJCWJyZWFrOworCQljYXNlIFRZUEVfRElTSzoKKwkJY2FzZSBUWVBFX01PRDoKKwkJCW5vZGUtPm1ham9yID0gU0NTSV9ESVNLMF9NQUpPUjsKKwkJCXNucHJpbnRmKG5vZGUtPmRldl9uYW1lLCBzaXplb2Yobm9kZS0+ZGV2X25hbWUpLCAic2QjJTA0bHgiLCBpZCk7CisJCQlicmVhazsKKwkJY2FzZSBUWVBFX1JPTToKKwkJY2FzZSBUWVBFX1dPUk06CisJCQlub2RlLT5tYWpvciA9IFNDU0lfQ0RST01fTUFKT1I7CisJCQlzbnByaW50Zihub2RlLT5kZXZfbmFtZSwgc2l6ZW9mKG5vZGUtPmRldl9uYW1lKSwgInNyIyUwNGx4IiwgaWQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlub2RlLT5tYWpvciA9IFNDU0lfR0VORVJJQ19NQUpPUjsKKwkJCXNucHJpbnRmKG5vZGUtPmRldl9uYW1lLCBzaXplb2Yobm9kZS0+ZGV2X25hbWUpLCAic2cjJTA0bHgiLCBpZCk7CisJCQlicmVhazsKKwkJfQorCQkqdGFpbCA9IG5vZGU7IHRhaWwgPSAmbm9kZS0+bmV4dDsKKwkJaW5mby0+bmRldisrOworCQlpbmZvLT5ob3N0ID0gZGV2LT5ob3N0OworCX0KKworCSp0YWlsID0gTlVMTDsKKwlpZiAoaW5mby0+bmRldiA9PSAwKSB7CisJCW5zcF9tc2coS0VSTl9JTkZPLCAibm8gU0NTSSBkZXZpY2VzIGZvdW5kIik7CisJfQorCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJob3N0PTB4JXAiLCBob3N0KTsKKyNlbmRpZgorCisJLyogRmluYWxseSwgcmVwb3J0IHdoYXQgd2UndmUgZG9uZSAqLworCXByaW50ayhLRVJOX0lORk8gIm5zcF9jczogaW5kZXggMHglMDJ4OiBWY2MgJWQuJWQiLAorCSAgICAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4LAorCSAgICAgICBsaW5rLT5jb25mLlZjYy8xMCwgbGluay0+Y29uZi5WY2MlMTApOworCWlmIChsaW5rLT5jb25mLlZwcDEpIHsKKwkJcHJpbnRrKCIsIFZwcCAlZC4lZCIsIGxpbmstPmNvbmYuVnBwMS8xMCwgbGluay0+Y29uZi5WcHAxJTEwKTsKKwl9CisJaWYgKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkgeworCQlwcmludGsoIiwgaXJxICVkIiwgbGluay0+aXJxLkFzc2lnbmVkSVJRKTsKKwl9CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMSkgeworCQlwcmludGsoIiwgaW8gMHglMDR4LTB4JTA0eCIsIGxpbmstPmlvLkJhc2VQb3J0MSwKKwkJICAgICAgIGxpbmstPmlvLkJhc2VQb3J0MStsaW5rLT5pby5OdW1Qb3J0czEtMSk7CisJfQorCWlmIChsaW5rLT5pby5OdW1Qb3J0czIpCisJCXByaW50aygiICYgMHglMDR4LTB4JTA0eCIsIGxpbmstPmlvLkJhc2VQb3J0MiwKKwkJICAgICAgIGxpbmstPmlvLkJhc2VQb3J0MitsaW5rLT5pby5OdW1Qb3J0czItMSk7CisJaWYgKGxpbmstPndpbikKKwkJcHJpbnRrKCIsIG1lbSAweCUwNmx4LTB4JTA2bHgiLCByZXEuQmFzZSwKKwkJICAgICAgIHJlcS5CYXNlK3JlcS5TaXplLTEpOworCXByaW50aygiXG4iKTsKKworCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisJcmV0dXJuOworCisgY3NfZmFpbGVkOgorCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJjb25maWcgZmFpbCIpOworCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworCW5zcF9jc19yZWxlYXNlKGxpbmspOworCisJcmV0dXJuOworfSAvKiBuc3BfY3NfY29uZmlnICovCisjdW5kZWYgQ1NfQ0hFQ0sKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgbnNwX2NzX3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlIG5ldAorICAgIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICAgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBuc3BfY3NfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworCXNjc2lfaW5mb190ICppbmZvID0gbGluay0+cHJpdjsKKwluc3BfaHdfZGF0YSAqZGF0YSA9IE5VTEw7CisKKwlpZiAoaW5mby0+aG9zdCA9PSBOVUxMKSB7CisJCW5zcF9tc2coS0VSTl9ERUJVRywgInVuZXhwZWN0ZWQgY2FyZCByZWxlYXNlIGNhbGwuIik7CisJfSBlbHNlIHsKKwkJZGF0YSA9IChuc3BfaHdfZGF0YSAqKWluZm8tPmhvc3QtPmhvc3RkYXRhOworCX0KKworCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJsaW5rPTB4JXAiLCBsaW5rKTsKKworCS8qIFVubGluayB0aGUgZGV2aWNlIGNoYWluICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMikpCisJaWYgKGluZm8tPmhvc3QgIT0gTlVMTCkgeworCQlzY3NpX3JlbW92ZV9ob3N0KGluZm8tPmhvc3QpOworCX0KKyNlbHNlCisJc2NzaV91bnJlZ2lzdGVyX2hvc3QoJm5zcF9kcml2ZXJfdGVtcGxhdGUpOworI2VuZGlmCisJbGluay0+ZGV2ID0gTlVMTDsKKworCWlmIChsaW5rLT53aW4pIHsKKwkJaWYgKGRhdGEgIT0gTlVMTCkgeworCQkJaW91bm1hcCgodm9pZCAqKShkYXRhLT5NbWlvQWRkcmVzcykpOworCQl9CisJCXBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOworCX0KKwlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMSkgeworCQlwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJfQorCWlmIChsaW5rLT5pcnEuQXNzaWduZWRJUlEpIHsKKwkJcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisJfQorCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDIpKQorCWlmIChpbmZvLT5ob3N0ICE9IE5VTEwpIHsKKwkJc2NzaV9ob3N0X3B1dChpbmZvLT5ob3N0KTsKKwl9CisjZW5kaWYKK30gLyogbnNwX2NzX3JlbGVhc2UgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIKKyAgICBzdHVmZiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuICBBIENBUkRfUkVNT1ZBTCBldmVudAorICAgIGFsc28gc2V0cyBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nCisgICAgdG8gdGFsayB0byB0aGUgY2FyZCBhbnkgbW9yZS4KKworICAgIFdoZW4gYSBDQVJEX1JFTU9WQUwgZXZlbnQgaXMgcmVjZWl2ZWQsIHdlIGltbWVkaWF0ZWx5IHNldCBhIGZsYWcKKyAgICB0byBibG9jayBmdXR1cmUgYWNjZXNzZXMgdG8gdGhpcyBkZXZpY2UuICBBbGwgdGhlIGZ1bmN0aW9ucyB0aGF0CisgICAgYWN0dWFsbHkgYWNjZXNzIHRoZSBkZXZpY2Ugc2hvdWxkIGNoZWNrIHRoaXMgZmxhZyB0byBtYWtlIHN1cmUKKyAgICB0aGUgY2FyZCBpcyBzdGlsbCBwcmVzZW50LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQgbnNwX2NzX2V2ZW50KGV2ZW50X3QJCSAgICAgICBldmVudCwKKwkJCWludAkJICAgICAgIHByaW9yaXR5LAorCQkJZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworCWRldl9saW5rX3QgICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisJc2NzaV9pbmZvX3QgKmluZm8gPSBsaW5rLT5wcml2OworCW5zcF9od19kYXRhICpkYXRhOworCisJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImluLCBldmVudD0weCUwOHgiLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJldmVudDogcmVtb3ZlIik7CisJCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJKChzY3NpX2luZm9fdCAqKWxpbmstPnByaXYpLT5zdG9wID0gMTsKKwkJCW5zcF9jc19yZWxlYXNlKGxpbmspOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwkJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImV2ZW50OiBpbnNlcnQiKTsKKwkJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSw2OCkpCisJCWluZm8tPmJ1cyAgICA9ICBhcmdzLT5idXM7CisjZW5kaWYKKwkJbnNwX2NzX2NvbmZpZyhsaW5rKTsKKwkJYnJlYWs7CisKKwljYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJldmVudDogc3VzcGVuZCIpOworCQlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkJLyogRmFsbCB0aHJvdWdoLi4uICovCisJY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwkJLyogTWFyayB0aGUgZGV2aWNlIGFzIHN0b3BwZWQsIHRvIGJsb2NrIElPIHVudGlsIGxhdGVyICovCisJCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJldmVudDogcmVzZXQgcGh5c2ljYWwiKTsKKworCQlpZiAoaW5mby0+aG9zdCAhPSBOVUxMKSB7CisJCQluc3BfbXNnKEtFUk5fSU5GTywgImNsZWFyIFNEVFIgc3RhdHVzIik7CisKKwkJCWRhdGEgPSAobnNwX2h3X2RhdGEgKilpbmZvLT5ob3N0LT5ob3N0ZGF0YTsKKworCQkJbnNwaHdfaW5pdF9zeW5jKGRhdGEpOworCQl9CisKKwkJaW5mby0+c3RvcCA9IDE7CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCQluc3BfZGJnKE5TUF9ERUJVR19JTklULCAiZXZlbnQ6IHJlc3VtZSIpOworCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwkJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImV2ZW50OiByZXNldCIpOworCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQlwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCQl9CisJCWluZm8tPnN0b3AgPSAwOworCisJCWlmIChpbmZvLT5ob3N0ICE9IE5VTEwpIHsKKwkJCW5zcF9tc2coS0VSTl9JTkZPLCAicmVzZXQgaG9zdCBhbmQgYnVzIik7CisKKwkJCWRhdGEgPSAobnNwX2h3X2RhdGEgKilpbmZvLT5ob3N0LT5ob3N0ZGF0YTsKKworCQkJbnNwaHdfaW5pdCAgIChkYXRhKTsKKwkJCW5zcF9idXNfcmVzZXQoZGF0YSk7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJldmVudDogdW5rbm93biIpOworCQlicmVhazsKKwl9CisJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImVuZCIpOworCXJldHVybiAwOworfSAvKiBuc3BfY3NfZXZlbnQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KgorICoJbW9kdWxlIGVudHJ5IHBvaW50CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSw2OCkpCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgbnNwX2RyaXZlciA9IHsKKwkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkuZHJ2ICAgICAgICAgICAgPSB7CisJCS5uYW1lICAgPSAibnNwX2NzIiwKKwl9LAorCS5hdHRhY2ggICAgICAgICA9IG5zcF9jc19hdHRhY2gsCisJLmRldGFjaCAgICAgICAgID0gbnNwX2NzX2RldGFjaCwKK307CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgbnNwX2NzX2luaXQodm9pZCkKK3sKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSw2OCkpCisJbnNwX21zZyhLRVJOX0lORk8sICJsb2FkaW5nLi4uIik7CisKKwlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmbnNwX2RyaXZlcik7CisjZWxzZQorCXNlcnZpbmZvX3Qgc2VydjsKKworCW5zcF9tc2coS0VSTl9JTkZPLCAibG9hZGluZy4uLiIpOworCXBjbWNpYV9nZXRfY2FyZF9zZXJ2aWNlc19pbmZvKCZzZXJ2KTsKKwlpZiAoc2Vydi5SZXZpc2lvbiAhPSBDU19SRUxFQVNFX0NPREUpIHsKKwkJbnNwX21zZyhLRVJOX0RFQlVHLCAiQ2FyZCBTZXJ2aWNlcyByZWxlYXNlIGRvZXMgbm90IG1hdGNoISIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmVnaXN0ZXJfcGNtY2lhX2RyaXZlcigmZGV2X2luZm8sICZuc3BfY3NfYXR0YWNoLCAmbnNwX2NzX2RldGFjaCk7CisKKwluc3BfZGJnKE5TUF9ERUJVR19JTklULCAib3V0Iik7CisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgX19leGl0IG5zcF9jc19leGl0KHZvaWQpCit7CisJbnNwX21zZyhLRVJOX0lORk8sICJ1bmxvYWRpbmcuLi4iKTsKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDY4KSkKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJm5zcF9kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKKyNlbHNlCisJdW5yZWdpc3Rlcl9wY21jaWFfZHJpdmVyKCZkZXZfaW5mbyk7CisJLyogWFhYOiB0aGlzIHJlYWxseSBuZWVkcyB0byBtb3ZlIGludG8gZ2VuZXJpYyBjb2RlLi4gKi8KKwl3aGlsZSAoZGV2X2xpc3QgIT0gTlVMTCkgeworCQlpZiAoZGV2X2xpc3QtPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJbnNwX2NzX3JlbGVhc2UoZGV2X2xpc3QpOworCQl9CisJCW5zcF9jc19kZXRhY2goZGV2X2xpc3QpOworCX0KKyNlbmRpZgorfQorCisKK21vZHVsZV9pbml0KG5zcF9jc19pbml0KQorbW9kdWxlX2V4aXQobnNwX2NzX2V4aXQpCisKKy8qIGVuZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfY3MuaCBiL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2NzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIwMWI1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2NzLmgKQEAgLTAsMCArMSw0NzIgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8KKyAgSGVhZGVyIGZpbGUgZm9yIG5zcF9jcy5jCisgICAgICBCeTogWU9LT1RBIEhpcm9zaGkgPHlva290YUBuZXRsYWIuaXMudHN1a3ViYS5hYy5qcD4KKworICAgIFZlci4xLjAgOiBDdXQgdW51c2VkIGxpbmVzLgorICAgIFZlciAwLjEgOiBJbml0aWFsIHZlcnNpb24uCisKKyAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSWQ6IG5zcF9jcy5oLHYgMS4xOSAyMDAzLzA4LzE4IDExOjA5OjE5IGVsY2EgRXhwICQgKi8KKworI2lmbmRlZiAgX19uc3BfY3NfXworI2RlZmluZSAgX19uc3BfY3NfXworCisvKiBmb3IgZGVidWdnaW5nICovCisvLyNkZWZpbmUgTlNQX0RFQlVHIDkKKworLyoKKyNkZWZpbmUgc3RhdGljCisjZGVmaW5lIGlubGluZQorKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU29tZSB1c2VmdWwgbWFjcm9zLi4uCisgKi8KKyNkZWZpbmUgQklUKHgpICAgICAgKDFMIDw8ICh4KSkKKworLyogU0NTSSBpbml0aWF0b3IgbXVzdCBiZSBJRCA3ICovCisjZGVmaW5lIE5TUF9JTklUSUFUT1JfSUQgIDcKKworI2RlZmluZSBOU1BfU0VMVElNRU9VVCAyMDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogYmFzZSByZWdpc3RlcgorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lCUlSUUNPTlRST0wJMHgwMCAgLyogUiAqLworIyAgZGVmaW5lIElSUUNPTlRST0xfUkVTRUxFQ1RfQ0xFQVIgICAgIEJJVCgwKQorIyAgZGVmaW5lIElSUUNPTlRST0xfUEhBU0VfQ0hBTkdFX0NMRUFSIEJJVCgxKQorIyAgZGVmaW5lIElSUUNPTlRST0xfVElNRVJfQ0xFQVIgICAgICAgIEJJVCgyKQorIyAgZGVmaW5lIElSUUNPTlRST0xfRklGT19DTEVBUiAgICAgICAgIEJJVCgzKQorIyAgZGVmaW5lIElSUUNPTlRST0xfQUxMTUFTSyAgICAgICAgICAgIDB4ZmYKKyMgIGRlZmluZSBJUlFDT05UUk9MX0FMTENMRUFSICAgICAgICAgICAoSVJRQ09OVFJPTF9SRVNFTEVDVF9DTEVBUiAgICAgfCBcCisJCQkJCSBJUlFDT05UUk9MX1BIQVNFX0NIQU5HRV9DTEVBUiB8IFwKKwkJCQkJIElSUUNPTlRST0xfVElNRVJfQ0xFQVIgICAgICAgIHwgXAorCQkJCQkgSVJRQ09OVFJPTF9GSUZPX0NMRUFSICAgICAgICAgICkKKyMgIGRlZmluZSBJUlFDT05UUk9MX0lSUURJU0FCTEUgICAgICAgICAweGYwCisKKyNkZWZpbmUJSVJRU1RBVFVTCTB4MDAgIC8qIFcgKi8KKyMgIGRlZmluZSBJUlFTVEFUVVNfU0NTSSAgQklUKDApCisjICBkZWZpbmUgSVJRU1RBVFVTX1RJTUVSIEJJVCgyKQorIyAgZGVmaW5lIElSUVNUQVRVU19GSUZPICBCSVQoMykKKyMgIGRlZmluZSBJUlFTVEFUVVNfTUFTSyAgMHgwZgorCisjZGVmaW5lCUlGU0VMRUNUCTB4MDEgLyogVyAqLworIyAgZGVmaW5lIElGX0lGU0VMICAgIEJJVCgwKQorIyAgZGVmaW5lIElGX1JFR1NFTCAgIEJJVCgyKQorCisjZGVmaW5lCUZJRk9TVEFUVVMJMHgwMSAvKiBSICovCisjICBkZWZpbmUgRklGT1NUQVRVU19DSElQX1JFVklTSU9OX01BU0sgMHgwZgorIyAgZGVmaW5lIEZJRk9TVEFUVVNfQ0hJUF9JRF9NQVNLICAgICAgIDB4NzAKKyMgIGRlZmluZSBGSUZPU1RBVFVTX0ZVTExfRU1QVFkgICAgICAgICBCSVQoNykKKworI2RlZmluZQlJTkRFWFJFRwkweDAyIC8qIFIvVyAqLworI2RlZmluZQlEQVRBUkVHCQkweDAzIC8qIFIvVyAqLworI2RlZmluZQlGSUZPREFUQQkweDA0IC8qIFIvVyAqLworI2RlZmluZQlGSUZPREFUQTEJMHgwNSAvKiBSL1cgKi8KKyNkZWZpbmUJRklGT0RBVEEyCTB4MDYgLyogUi9XICovCisjZGVmaW5lCUZJRk9EQVRBMwkweDA3IC8qIFIvVyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBpbmRleGVkIHJlZ2lzdGVyCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBFWFRCVVNDVFJMCTB4MTAgLyogUi9XLGRlbGV0ZWQgKi8KKworI2RlZmluZSBDTE9DS0RJVgkweDExIC8qIFIvVyAqLworIyAgZGVmaW5lIENMT0NLXzQwTSAweDAyCisjICBkZWZpbmUgQ0xPQ0tfMjBNIDB4MDEKKyMgIGRlZmluZSBGQVNUXzIwICAgQklUKDIpCisKKyNkZWZpbmUgVEVSTVBXUkNUUkwJMHgxMyAvKiBSL1cgKi8KKyMgIGRlZmluZSBQT1dFUl9PTiBCSVQoMCkKKworI2RlZmluZSBTQ1NJSVJRTU9ERQkweDE1IC8qIFIvVyAqLworIyAgZGVmaW5lIFNDU0lfUEhBU0VfQ0hBTkdFX0VJIEJJVCgwKQorIyAgZGVmaW5lIFJFU0VMRUNUX0VJICAgICAgICAgIEJJVCg0KQorIyAgZGVmaW5lIEZJRk9fSVJRX0VJICAgICAgICAgIEJJVCg1KQorIyAgZGVmaW5lIFNDU0lfUkVTRVRfSVJRX0VJICAgIEJJVCg2KQorCisjZGVmaW5lIElSUVBIQVNFU0VOQ0UJMHgxNiAvKiBSICovCisjICBkZWZpbmUgTEFUQ0hFRF9NU0cgICAgICBCSVQoMCkKKyMgIGRlZmluZSBMQVRDSEVEX0lPICAgICAgIEJJVCgxKQorIyAgZGVmaW5lIExBVENIRURfQ0QgICAgICAgQklUKDIpCisjICBkZWZpbmUgTEFUQ0hFRF9CVVNfRlJFRSBCSVQoMykKKyMgIGRlZmluZSBQSEFTRV9DSEFOR0VfSVJRIEJJVCg0KQorIyAgZGVmaW5lIFJFU0VMRUNUX0lSUSAgICAgQklUKDUpCisjICBkZWZpbmUgRklGT19JUlEgICAgICAgICBCSVQoNikKKyMgIGRlZmluZSBTQ1NJX1JFU0VUX0lSUSAgIEJJVCg3KQorCisjZGVmaW5lIFRJTUVSQ09VTlQJMHgxNyAvKiBSL1cgKi8KKworI2RlZmluZSBTQ1NJQlVTQ1RSTAkweDE4IC8qIFIvVyAqLworIyAgZGVmaW5lIFNDU0lfU0VMICAgICAgICAgQklUKDApCisjICBkZWZpbmUgU0NTSV9SU1QgICAgICAgICBCSVQoMSkKKyMgIGRlZmluZSBTQ1NJX0RBVEFPVVRfRU5CIEJJVCgyKQorIyAgZGVmaW5lIFNDU0lfQVROICAgICAgICAgQklUKDMpCisjICBkZWZpbmUgU0NTSV9BQ0sgICAgICAgICBCSVQoNCkKKyMgIGRlZmluZSBTQ1NJX0JTWSAgICAgICAgIEJJVCg1KQorIyAgZGVmaW5lIEFVVE9ESVJFQ1RJT04gICAgQklUKDYpCisjICBkZWZpbmUgQUNLRU5CICAgICAgICAgICBCSVQoNykKKworI2RlZmluZSBTQ1NJQlVTTU9OCTB4MTkgLyogUiAqLworCisjZGVmaW5lIFNFVEFSQklUCTB4MUEgLyogVyAqLworIyAgZGVmaW5lIEFSQklUX0dPICAgICAgICAgQklUKDApCisjICBkZWZpbmUgQVJCSVRfRkxBR19DTEVBUiBCSVQoMSkKKworI2RlZmluZSBBUkJJVFNUQVRVUwkweDFBIC8qIFIgKi8KKy8qIyAgZGVmaW5lIEFSQklUX0dPICAgICAgICBCSVQoMCkqLworIyAgZGVmaW5lIEFSQklUX1dJTiAgICAgICAgQklUKDEpCisjICBkZWZpbmUgQVJCSVRfRkFJTCAgICAgICBCSVQoMikKKyMgIGRlZmluZSBSRVNFTEVDVF9GTEFHICAgIEJJVCgzKQorCisjZGVmaW5lIFBBUklUWUNUUkwJMHgxQiAgLyogVyAqLworI2RlZmluZSBQQVJJVFlTVEFUVVMJMHgxQiAgLyogUiAqLworCisjZGVmaW5lIENPTU1BTkRDVFJMCTB4MUMgIC8qIFcgKi8KKyMgIGRlZmluZSBDTEVBUl9DT01NQU5EX1BPSU5URVIgQklUKDApCisjICBkZWZpbmUgQVVUT19DT01NQU5EX0dPICAgICAgIEJJVCgxKQorCisjZGVmaW5lIFJFU0VMRUNUSUQJMHgxQyAgLyogUiAgICovCisjZGVmaW5lIENPTU1BTkREQVRBCTB4MUQgIC8qIFIvVyAqLworCisjZGVmaW5lIFBPSU5URVJDTFIJMHgxRSAgLyogICBXICovCisjICBkZWZpbmUgUE9JTlRFUl9DTEVBUiAgICAgIEJJVCgwKQorIyAgZGVmaW5lIEFDS19DT1VOVEVSX0NMRUFSICBCSVQoMSkKKyMgIGRlZmluZSBSRVFfQ09VTlRFUl9DTEVBUiAgQklUKDIpCisjICBkZWZpbmUgSE9TVF9DT1VOVEVSX0NMRUFSIEJJVCgzKQorIyAgZGVmaW5lIFJFQURfU09VUkNFICAgICAgICAoQklUKDQpIHwgQklUKDUpKQorIyAgICBkZWZpbmUgQUNLX0NPVU5URVIgICAgICAgICgwKQorIyAgICBkZWZpbmUgUkVRX0NPVU5URVIgICAgICAgIChCSVQoNCkpCisjICAgIGRlZmluZSBIT1NUX0NPVU5URVIgICAgICAgKEJJVCg1KSkKKworI2RlZmluZSBUUkFOU0ZFUkNPVU5UCTB4MUUgIC8qIFIgICAqLworCisjZGVmaW5lIFRSQU5TRkVSTU9ERQkweDIwICAvKiBSL1cgKi8KKyMgIGRlZmluZSBNT0RFX01FTTggICBCSVQoMCkKKyMgIGRlZmluZSBNT0RFX01FTTMyICBCSVQoMSkKKyMgIGRlZmluZSBNT0RFX0FEUjI0ICBCSVQoMikKKyMgIGRlZmluZSBNT0RFX0FEUjMyICBCSVQoMykKKyMgIGRlZmluZSBNT0RFX0lPOCAgICBCSVQoNCkKKyMgIGRlZmluZSBNT0RFX0lPMzIgICBCSVQoNSkKKyMgIGRlZmluZSBUUkFOU0ZFUl9HTyBCSVQoNikKKyMgIGRlZmluZSBCUkFJTkQgICAgICBCSVQoNykKKworI2RlZmluZSBTWU5DUkVHCQkweDIxIC8qIFIvVyAqLworIyAgZGVmaW5lIFNZTkNSRUdfT0ZGU0VUX01BU0sgIDB4MGYKKyMgIGRlZmluZSBTWU5DUkVHX1BFUklPRF9NQVNLICAweGYwCisjICBkZWZpbmUgU1lOQ1JFR19QRVJJT0RfU0hJRlQgNAorCisjZGVmaW5lIFNDU0lEQVRBTEFUQ0gJMHgyMiAvKiAgIFcgKi8KKyNkZWZpbmUgU0NTSURBVEFJTgkweDIyIC8qIFIgICAqLworI2RlZmluZSBTQ1NJREFUQVdJVEhBQ0sJMHgyMyAvKiBSL1cgKi8KKyNkZWZpbmUgU0NBTUNPTlRST0wJMHgyNCAvKiAgIFcgKi8KKyNkZWZpbmUgU0NBTVNUQVRVUwkweDI0IC8qIFIgICAqLworI2RlZmluZSBTQ0FNREFUQQkweDI1IC8qIFIvVyAqLworCisjZGVmaW5lIE9USEVSQ09OVFJPTAkweDI2IC8qIFIvVyAqLworIyAgZGVmaW5lIFRQTF9ST01fV1JJVEVfRU4gQklUKDApCisjICBkZWZpbmUgVFBXUl9PVVQgICAgICAgICBCSVQoMSkKKyMgIGRlZmluZSBUUFdSX1NFTlNFICAgICAgIEJJVCgyKQorIyAgZGVmaW5lIFJBOF9DT05UUk9MICAgICAgQklUKDMpCisKKyNkZWZpbmUgQUNLV0lEVEgJMHgyNyAvKiBSL1cgKi8KKyNkZWZpbmUgQ0xSVEVTVFBOVAkweDI4IC8qICAgVyAqLworI2RlZmluZSBBQ0tDTlRMRAkweDI5IC8qICAgVyAqLworI2RlZmluZSBSRVFDTlRMRAkweDJBIC8qICAgVyAqLworI2RlZmluZSBIU1RDTlRMRAkweDJCIC8qICAgVyAqLworI2RlZmluZSBDSEVDS1NVTQkweDJDIC8qIFIvVyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbnB1dCBzdGF0dXMgYml0IGRlZmluaXRpb25zLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgU19NRVNTQUdFCUJJVCgwKSAgICAvKiBNZXNzYWdlIGxpbmUgZnJvbSBTQ1NJIGJ1cyAgICAgICovCisjZGVmaW5lIFNfSU8JCUJJVCgxKSAgICAvKiBJbnB1dC9PdXRwdXQgbGluZSBmcm9tIFNDU0kgYnVzICovCisjZGVmaW5lIFNfQ0QJCUJJVCgyKSAgICAvKiBDb21tYW5kL0RhdGEgbGluZSBmcm9tIFNDU0kgYnVzICovCisjZGVmaW5lIFNfQlVTWQkJQklUKDMpICAgIC8qIEJ1c3kgbGluZSBmcm9tIFNDU0kgYnVzICAgICAgICAgKi8KKyNkZWZpbmUgU19BQ0sJCUJJVCg0KSAgICAvKiBBY2tub3dsZWdlIGxpbmUgZnJvbSBTQ1NJIGJ1cyAgICovCisjZGVmaW5lIFNfUkVRVUVTVAlCSVQoNSkgICAgLyogUmVxdWVzdCBsaW5lIGZyb20gU0NTSSBidXMgICAgICAqLworI2RlZmluZSBTX1NFTEVDVAlCSVQoNikJICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNfQVROCQlCSVQoNykJICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVXNlZnVsIEJ1cyBNb25pdG9yIHN0YXR1cyBjb21iaW5hdGlvbnMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEJVU01PTl9TRUwgICAgICAgICBTX1NFTEVDVAorI2RlZmluZSBCVVNNT05fQlNZICAgICAgICAgU19CVVNZCisjZGVmaW5lIEJVU01PTl9SRVEgICAgICAgICBTX1JFUVVFU1QKKyNkZWZpbmUgQlVTTU9OX0lPICAgICAgICAgIFNfSU8KKyNkZWZpbmUgQlVTTU9OX0FDSyAgICAgICAgIFNfQUNLCisjZGVmaW5lIEJVU01PTl9CVVNfRlJFRSAgICAwCisjZGVmaW5lIEJVU01PTl9DT01NQU5EICAgICAoIFNfQlVTWSB8IFNfQ0QgfCAgICAgICAgICAgICAgICAgICAgU19SRVFVRVNUICkKKyNkZWZpbmUgQlVTTU9OX01FU1NBR0VfSU4gICggU19CVVNZIHwgU19DRCB8IFNfSU8gfCBTX01FU1NBR0UgfCBTX1JFUVVFU1QgKQorI2RlZmluZSBCVVNNT05fTUVTU0FHRV9PVVQgKCBTX0JVU1kgfCBTX0NEIHwgICAgICAgIFNfTUVTU0FHRSB8IFNfUkVRVUVTVCApCisjZGVmaW5lIEJVU01PTl9EQVRBX0lOICAgICAoIFNfQlVTWSB8ICAgICAgICBTX0lPIHwgICAgICAgICAgICAgU19SRVFVRVNUICkKKyNkZWZpbmUgQlVTTU9OX0RBVEFfT1VUICAgICggU19CVVNZIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBTX1JFUVVFU1QgKQorI2RlZmluZSBCVVNNT05fU1RBVFVTICAgICAgKCBTX0JVU1kgfCBTX0NEIHwgU19JTyB8ICAgICAgICAgICAgIFNfUkVRVUVTVCApCisjZGVmaW5lIEJVU01PTl9TRUxFQ1QgICAgICAoICAgICAgICAgICAgICAgICBTX0lPIHwgICAgICAgICAgICAgICAgICAgICAgICBTX1NFTEVDVCApCisjZGVmaW5lIEJVU01PTl9SRVNFTEVDVCAgICAoICAgICAgICAgICAgICAgICBTX0lPIHwgICAgICAgICAgICAgICAgICAgICAgICBTX1NFTEVDVCApCisjZGVmaW5lIEJVU01PTl9QSEFTRV9NQVNLICAoICAgICAgICAgIFNfQ0QgfCBTX0lPIHwgU19NRVNTQUdFIHwgICAgICAgICAgICBTX1NFTEVDVCApCisKKyNkZWZpbmUgQlVTUEhBU0VfU0VMRUNUICAgICAgKCBCVVNNT05fU0VMRUNUICAgICAgJiBCVVNNT05fUEhBU0VfTUFTSyApCisjZGVmaW5lIEJVU1BIQVNFX0NPTU1BTkQgICAgICggQlVTTU9OX0NPTU1BTkQgICAgICYgQlVTTU9OX1BIQVNFX01BU0sgKQorI2RlZmluZSBCVVNQSEFTRV9NRVNTQUdFX0lOICAoIEJVU01PTl9NRVNTQUdFX0lOICAmIEJVU01PTl9QSEFTRV9NQVNLICkKKyNkZWZpbmUgQlVTUEhBU0VfTUVTU0FHRV9PVVQgKCBCVVNNT05fTUVTU0FHRV9PVVQgJiBCVVNNT05fUEhBU0VfTUFTSyApCisjZGVmaW5lIEJVU1BIQVNFX0RBVEFfSU4gICAgICggQlVTTU9OX0RBVEFfSU4gICAgICYgQlVTTU9OX1BIQVNFX01BU0sgKQorI2RlZmluZSBCVVNQSEFTRV9EQVRBX09VVCAgICAoIEJVU01PTl9EQVRBX09VVCAgICAmIEJVU01PTl9QSEFTRV9NQVNLICkKKyNkZWZpbmUgQlVTUEhBU0VfU1RBVFVTICAgICAgKCBCVVNNT05fU1RBVFVTICAgICAgJiBCVVNNT05fUEhBU0VfTUFTSyApCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit0eXBlZGVmIHN0cnVjdCBzY3NpX2luZm9fdCB7CisJZGV2X2xpbmtfdCAgICAgICAgICAgICBsaW5rOworCXN0cnVjdCBTY3NpX0hvc3QgICAgICAqaG9zdDsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSw3NCkpCisJZGV2X25vZGVfdCAgICAgICAgICAgICBub2RlOworI2Vsc2UKKwlpbnQJICAgICAgICAgICAgICAgbmRldjsKKwlkZXZfbm9kZV90ICAgICAgICAgICAgIG5vZGVbOF07CisJc3RydWN0IGJ1c19vcGVyYXRpb25zICpidXM7CisjZW5kaWYKKwlpbnQgICAgICAgICAgICAgICAgICAgIHN0b3A7Cit9IHNjc2lfaW5mb190OworCisKKy8qIHN5bmNocm9ub3VzIHRyYW5zZmVyIG5lZ290aWF0aW9uIGRhdGEgKi8KK3R5cGVkZWYgc3RydWN0IF9zeW5jX2RhdGEgeworCXVuc2lnbmVkIGludCBTeW5jTmVnb3RpYXRpb247CisjZGVmaW5lIFNZTkNfTk9UX1lFVCAwCisjZGVmaW5lIFNZTkNfT0sgICAgICAxCisjZGVmaW5lIFNZTkNfTkcgICAgICAyCisKKwl1bnNpZ25lZCBpbnQgIFN5bmNQZXJpb2Q7CisJdW5zaWduZWQgaW50ICBTeW5jT2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgU3luY1JlZ2lzdGVyOworCXVuc2lnbmVkIGNoYXIgQWNrV2lkdGg7Cit9IHN5bmNfZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgX25zcF9od19kYXRhIHsKKwl1bnNpZ25lZCBpbnQgIEJhc2VBZGRyZXNzOworCXVuc2lnbmVkIGludCAgTnVtQWRkcmVzczsKKwl1bnNpZ25lZCBpbnQgIElycU51bWJlcjsKKworCXVuc2lnbmVkIGxvbmcgTW1pb0FkZHJlc3M7CisjZGVmaW5lIE5TUF9NTUlPX09GRlNFVCAweDA4MDAKKwl1bnNpZ25lZCBsb25nIE1taW9MZW5ndGg7CisKKwl1bnNpZ25lZCBjaGFyIFNjc2lDbG9ja0RpdjsKKworCXVuc2lnbmVkIGNoYXIgVHJhbnNmZXJNb2RlOworCisJaW50ICAgICAgICAgICBUaW1lckNvdW50OworCWludCAgICAgICAgICAgU2VsZWN0aW9uVGltZU91dDsKKwlTY3NpX0NtbmQgICAgKkN1cnJlbnRTQzsKKwkvL2ludCAgICAgICAgICAgQ3Vycm5ldFRhcmdldDsKKworCWludCAgICAgICAgICAgRmlmb0NvdW50OworCisjZGVmaW5lIE1TR0JVRl9TSVpFIDIwCisJdW5zaWduZWQgY2hhciBNc2dCdWZmZXJbTVNHQlVGX1NJWkVdOworCWludCBNc2dMZW47CisKKyNkZWZpbmUgTl9UQVJHRVQgOAorCXN5bmNfZGF0YSAgICAgU3luY1tOX1RBUkdFVF07CisKKwljaGFyIG5zcGluZm9bMTEwXTsgICAgIC8qIGRlc2NyaXB0aW9uICovCisJc3BpbmxvY2tfdCBMb2NrOworCisJc2NzaV9pbmZvX3QgICAqU2NzaUluZm87IC8qIGF0dGFjaCA8LT4gZGV0ZWN0IGdsdWUgKi8KKworCisjaWZkZWYgTlNQX0RFQlVHCisJaW50IENtZElkOyAvKiBBY2NlcHRlZCBjb21tYW5kIHNlcmlhbCBudW1iZXIuCisJCSAgICAgIFVzZWQgZm9yIGRlYnVnZ2luZy4gICAgICAgICAgICAgKi8KKyNlbmRpZgorfSBuc3BfaHdfZGF0YTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqLworCisvKiBDYXJkIHNlcnZpY2UgZnVuY3Rpb25zICovCitzdGF0aWMgZGV2X2xpbmtfdCAqbnNwX2NzX2F0dGFjaCAodm9pZCk7CitzdGF0aWMgdm9pZCAgICAgICAgbnNwX2NzX2RldGFjaCAoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCAgICAgICAgbnNwX2NzX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCAgICAgICAgbnNwX2NzX2NvbmZpZyAoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgaW50ICAgICAgICAgbnNwX2NzX2V2ZW50ICAoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LCBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOworCisvKiBMaW51eCBTQ1NJIHN1YnN5c3RlbSBzcGVjaWZpYyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICpuc3BfZGV0ZWN0ICAgICAoU2NzaV9Ib3N0X1RlbXBsYXRlICpzaHQpOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCitzdGF0aWMgICAgICAgIGludCAgICAgICAgbnNwX2RldGVjdF9vbGQgKFNjc2lfSG9zdF9UZW1wbGF0ZSAqc2h0KTsKK3N0YXRpYyAgICAgICAgaW50ICAgICAgICBuc3BfcmVsZWFzZV9vbGQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworI2VuZGlmCitzdGF0aWMgY29uc3QgIGNoYXIgICAgICAqbnNwX2luZm8gICAgICAgKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKK3N0YXRpYyAgICAgICAgaW50ICAgICAgICBuc3BfcHJvY19pbmZvICAoCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw3MykpCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwKKyNlbmRpZgorCQkJCQkgY2hhciAgICpidWZmZXIsCisJCQkJCSBjaGFyICAqKnN0YXJ0LAorCQkJCQkgb2ZmX3QgICBvZmZzZXQsCisJCQkJCSBpbnQgICAgIGxlbmd0aCwKKyNpZiAhKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw3MykpCisJCQkJCSBpbnQgICAgIGhvc3RubywKKyNlbmRpZgorCQkJCQkgaW50ICAgICBpbm91dCk7CitzdGF0aWMgICAgICAgIGludCAgICAgICAgbnNwX3F1ZXVlY29tbWFuZChTY3NpX0NtbmQgKlNDcG50LCB2b2lkICgqIGRvbmUpKFNjc2lfQ21uZCAqU0NwbnQpKTsKKworLyogRXJyb3IgaGFuZGxlciAqLworLypzdGF0aWMgaW50IG5zcF9laF9hYm9ydCAgICAgICAoU2NzaV9DbW5kICpTQ3BudCk7Ki8KKy8qc3RhdGljIGludCBuc3BfZWhfZGV2aWNlX3Jlc2V0KFNjc2lfQ21uZCAqU0NwbnQpOyovCitzdGF0aWMgaW50IG5zcF9laF9idXNfcmVzZXQgICAgKFNjc2lfQ21uZCAqU0NwbnQpOworc3RhdGljIGludCBuc3BfZWhfaG9zdF9yZXNldCAgIChTY3NpX0NtbmQgKlNDcG50KTsKK3N0YXRpYyBpbnQgbnNwX2J1c19yZXNldCAgICAgICAobnNwX2h3X2RhdGEgKmRhdGEpOworCisvKiAqLworc3RhdGljIGludCAgbnNwaHdfaW5pdCAgICAgICAgICAgKG5zcF9od19kYXRhICpkYXRhKTsKK3N0YXRpYyBpbnQgIG5zcGh3X3N0YXJ0X3NlbGVjdGlvbihTY3NpX0NtbmQgKlNDcG50KTsKK3N0YXRpYyB2b2lkIG5zcF9zdGFydF90aW1lciAgICAgIChTY3NpX0NtbmQgKlNDcG50LCBpbnQgdGltZSk7CitzdGF0aWMgaW50ICBuc3BfZmlmb19jb3VudCAgICAgICAoU2NzaV9DbW5kICpTQ3BudCk7CitzdGF0aWMgdm9pZCBuc3BfcGlvX3JlYWQgICAgICAgICAoU2NzaV9DbW5kICpTQ3BudCk7CitzdGF0aWMgdm9pZCBuc3BfcGlvX3dyaXRlICAgICAgICAoU2NzaV9DbW5kICpTQ3BudCk7CitzdGF0aWMgaW50ICBuc3BfbmV4dXMgICAgICAgICAgICAoU2NzaV9DbW5kICpTQ3BudCk7CitzdGF0aWMgdm9pZCBuc3Bfc2NzaV9kb25lICAgICAgICAoU2NzaV9DbW5kICpTQ3BudCk7CitzdGF0aWMgaW50ICBuc3BfYW5hbHl6ZV9zZHRyICAgICAoU2NzaV9DbW5kICpTQ3BudCk7CitzdGF0aWMgaW50ICBuc3BfbmVnYXRlX3NpZ25hbCAgICAoU2NzaV9DbW5kICpTQ3BudCwgdW5zaWduZWQgY2hhciBtYXNrLCBjaGFyICpzdHIpOworc3RhdGljIGludCAgbnNwX2V4cGVjdF9zaWduYWwgICAgKFNjc2lfQ21uZCAqU0NwbnQsIHVuc2lnbmVkIGNoYXIgY3VycmVudF9waGFzZSwgdW5zaWduZWQgY2hhciAgbWFzayk7CitzdGF0aWMgaW50ICBuc3BfeGZlciAgICAgICAgICAgICAoU2NzaV9DbW5kICpTQ3BudCwgaW50IHBoYXNlKTsKK3N0YXRpYyBpbnQgIG5zcF9kYXRhcGhhc2VfYnlwYXNzIChTY3NpX0NtbmQgKlNDcG50KTsKK3N0YXRpYyBpbnQgIG5zcF9yZXNlbGVjdGVkICAgICAgIChTY3NpX0NtbmQgKlNDcG50KTsKK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICpuc3BfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqc2h0KTsKKworLyogSW50ZXJydXB0IGhhbmRsZXIgKi8KKy8vc3RhdGljIGlycXJldHVybl90IG5zcGludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKy8qIE1vZHVsZSBlbnRyeSBwb2ludCovCitzdGF0aWMgaW50ICBfX2luaXQgbnNwX2NzX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCBfX2V4aXQgbnNwX2NzX2V4aXQodm9pZCk7CisKKworLyogRGVidWcgKi8KKyNpZmRlZiBOU1BfREVCVUcKK3N0YXRpYyB2b2lkIHNob3dfY29tbWFuZCAoU2NzaV9DbW5kICpTQ3BudCk7CitzdGF0aWMgdm9pZCBzaG93X3BoYXNlICAgKFNjc2lfQ21uZCAqU0NwbnQpOworc3RhdGljIHZvaWQgc2hvd19idXNwaGFzZSh1bnNpZ25lZCBjaGFyIHN0YXQpOworc3RhdGljIHZvaWQgc2hvd19tZXNzYWdlIChuc3BfaHdfZGF0YSAqZGF0YSk7CisjZWxzZQorIyBkZWZpbmUgc2hvd19jb21tYW5kKHB0cikgICAvKiAqLworIyBkZWZpbmUgc2hvd19waGFzZShTQ3BudCkgICAvKiAqLworIyBkZWZpbmUgc2hvd19idXNwaGFzZShzdGF0KSAvKiAqLworIyBkZWZpbmUgc2hvd19tZXNzYWdlKGRhdGEpICAvKiAqLworI2VuZGlmCisKKy8qCisgKiBTQ1NJIHBoYXNlCisgKi8KK2VudW0gX3Njc2lfcGhhc2UgeworCVBIX1VOREVURVJNSU5FRCAsCisJUEhfQVJCU1RBUlQgICAgICwKKwlQSF9TRUxTVEFSVCAgICAgLAorCVBIX1NFTEVDVEVEICAgICAsCisJUEhfQ09NTUFORCAgICAgICwKKwlQSF9EQVRBICAgICAgICAgLAorCVBIX1NUQVRVUyAgICAgICAsCisJUEhfTVNHX0lOICAgICAgICwKKwlQSF9NU0dfT1VUICAgICAgLAorCVBIX0RJU0NPTk5FQ1QgICAsCisJUEhfUkVTRUxFQ1QgICAgICwKKwlQSF9BQk9SVCAgICAgICAgLAorCVBIX1JFU0VUCit9OworCitlbnVtIF9kYXRhX2luX291dCB7CisJSU9fVU5LTk9XTiwKKwlJT19JTiwKKwlJT19PVVQKK307CisKK2VudW0gX2J1cnN0X21vZGUgeworCUJVUlNUX0lPOCAgID0gMCwKKwlCVVJTVF9JTzMyICA9IDEsCisJQlVSU1RfTUVNMzIgPSAyLAorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNDU0kgbWVzc2FhZ2UKKyAqLworI2RlZmluZSBNU0dfQ09NTUFORF9DT01QTEVURSAweDAwCisjZGVmaW5lIE1TR19FWFRFTkRFRCAgICAgICAgIDB4MDEKKyNkZWZpbmUgTVNHX0FCT1JUICAgICAgICAgICAgMHgwNgorI2RlZmluZSBNU0dfTk9fT1BFUkFUSU9OICAgICAweDA4CisjZGVmaW5lIE1TR19CVVNfREVWSUNFX1JFU0VUIDB4MGMKKworI2RlZmluZSBNU0dfRVhUX1NEVFIgICAgICAgICAweDAxCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb21wYXRpYmlsaXR5IGZ1bmN0aW9ucworICovCisKKy8qIGZvciBLZXJuZWwgMi40ICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKKyMgIGRlZmluZSBzY3NpX3JlZ2lzdGVyX2hvc3QodGVtcGxhdGUpICAgc2NzaV9yZWdpc3Rlcl9tb2R1bGUoTU9EVUxFX1NDU0lfSEEsIHRlbXBsYXRlKQorIyAgZGVmaW5lIHNjc2lfdW5yZWdpc3Rlcl9ob3N0KHRlbXBsYXRlKSBzY3NpX3VucmVnaXN0ZXJfbW9kdWxlKE1PRFVMRV9TQ1NJX0hBLCB0ZW1wbGF0ZSkKKyMgIGRlZmluZSBzY3NpX2hvc3RfcHV0KGhvc3QpICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKGhvc3QpCisKK3R5cGVkZWYgdm9pZCBpcnFyZXR1cm5fdDsKKyMgIGRlZmluZSBJUlFfTk9ORSAgICAgIC8qICovCisjICBkZWZpbmUgSVJRX0hBTkRMRUQgICAvKiAqLworIyAgZGVmaW5lIElSUV9SRVRWQUwoeCkgLyogKi8KKworLyogVGhpcyBpcyBhZC1ob2MgdmVyc2lvbiBvZiBzY3NpX2hvc3RfZ2V0X25leHQoKSAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX2hvc3RfZ2V0X25leHQoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlpZiAoaG9zdCA9PSBOVUxMKSB7CisJCXJldHVybiBzY3NpX2hvc3RsaXN0OworCX0gZWxzZSB7CisJCXJldHVybiBob3N0LT5uZXh0OworCX0KK30KKworLyogVGhpcyBpcyBhZC1ob2MgdmVyc2lvbiBvZiBzY3NpX2hvc3RfaG5fZ2V0KCkgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IFNjc2lfSG9zdCAqc2NzaV9ob3N0X2huX2dldCh1bnNpZ25lZCBzaG9ydCBob3N0bm8pCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKworCWZvciAoaG9zdCA9IHNjc2lfaG9zdF9nZXRfbmV4dChOVUxMKTsgaG9zdCAhPSBOVUxMOworCSAgICAgaG9zdCA9IHNjc2lfaG9zdF9nZXRfbmV4dChob3N0KSkgeworCQlpZiAoaG9zdC0+aG9zdF9ubyA9PSBob3N0bm8pIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGhvc3Q7Cit9CisKK3N0YXRpYyB2b2lkIGNzX2Vycm9yKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGludCBmdW5jLCBpbnQgcmV0KQoreworCWVycm9yX2luZm9fdCBlcnIgPSB7IGZ1bmMsIHJldCB9OworCXBjbWNpYV9yZXBvcnRfZXJyb3IoaGFuZGxlLCAmZXJyKTsKK30KKworLyogc2NhdHRlci1nYXRoZXIgdGFibGUgKi8KKyMgIGRlZmluZSBCVUZGRVJfQUREUiAoU0NwbnQtPlNDcC5idWZmZXItPmFkZHJlc3MpCisjZW5kaWYKKworLyogZm9yIEtlcm5lbCAyLjYgKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKKy8qIHNjYXR0ZXItZ2F0aGVyIHRhYmxlICovCisjICBkZWZpbmUgQlVGRkVSX0FERFIgKChjaGFyICopKCh1bnNpZ25lZCBpbnQpKFNDcG50LT5TQ3AuYnVmZmVyLT5wYWdlKSArIFNDcG50LT5TQ3AuYnVmZmVyLT5vZmZzZXQpKQorI2VuZGlmCisKKyNlbmRpZiAgLypfX25zcF9jc19fKi8KKy8qIGVuZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfZGVidWcuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJlNWM2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2RlYnVnLmMKQEAgLTAsMCArMSwyMTUgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVidWcgcm91dGluZXMgZm9yIG5zcF9jcworICAgICAgQnk6IFlPS09UQSBIaXJvc2hpIDx5b2tvdGFAbmV0bGFiLmlzLnRzdWt1YmEuYWMuanA+CisKKyAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qICRJZDogbnNwX2RlYnVnLmMsdiAxLjMgMjAwMy8wNy8yNiAxNDoyMTowOSBlbGNhIEV4cCAkICovCisKKy8qCisgKiBTaG93IHRoZSBjb21tYW5kIGRhdGEgb2YgYSBjb21tYW5kCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIHVua25vd25bXSA9ICJVTktOT1dOIjsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBncm91cF8wX2NvbW1hbmRzW10gPSB7CisvKiAwMC0wMyAqLyAiVGVzdCBVbml0IFJlYWR5IiwgIlJlemVybyBVbml0IiwgdW5rbm93biwgIlJlcXVlc3QgU2Vuc2UiLAorLyogMDQtMDcgKi8gIkZvcm1hdCBVbml0IiwgIlJlYWQgQmxvY2sgTGltaXRzIiwgdW5rbm93biwgIlJlYXNzc2lnbiBCbG9ja3MiLAorLyogMDgtMGQgKi8gIlJlYWQgKDYpIiwgdW5rbm93biwgIldyaXRlICg2KSIsICJTZWVrICg2KSIsIHVua25vd24sIHVua25vd24sCisvKiAwZS0xMiAqLyB1bmtub3duLCAiUmVhZCBSZXZlcnNlIiwgIldyaXRlIEZpbGVtYXJrcyIsICJTcGFjZSIsICJJbnF1aXJ5IiwgIAorLyogMTMtMTYgKi8gdW5rbm93biwgIlJlY292ZXIgQnVmZmVyZWQgRGF0YSIsICJNb2RlIFNlbGVjdCIsICJSZXNlcnZlIiwKKy8qIDE3LTFiICovICJSZWxlYXNlIiwgIkNvcHkiLCAiRXJhc2UiLCAiTW9kZSBTZW5zZSIsICJTdGFydC9TdG9wIFVuaXQiLAorLyogMWMtMWQgKi8gIlJlY2VpdmUgRGlhZ25vc3RpYyIsICJTZW5kIERpYWdub3N0aWMiLCAKKy8qIDFlLTFmICovICJQcmV2ZW50L0FsbG93IE1lZGl1bSBSZW1vdmFsIiwgdW5rbm93biwKK307CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmdyb3VwXzFfY29tbWFuZHNbXSA9IHsKKy8qIDIwLTIyICovICB1bmtub3duLCB1bmtub3duLCB1bmtub3duLAorLyogMjMtMjggKi8gdW5rbm93biwgdW5rbm93biwgIlJlYWQgQ2FwYWNpdHkiLCB1bmtub3duLCB1bmtub3duLCAiUmVhZCAoMTApIiwKKy8qIDI5LTJkICovIHVua25vd24sICJXcml0ZSAoMTApIiwgIlNlZWsgKDEwKSIsIHVua25vd24sIHVua25vd24sCisvKiAyZS0zMSAqLyAiV3JpdGUgVmVyaWZ5IiwiVmVyaWZ5IiwgIlNlYXJjaCBIaWdoIiwgIlNlYXJjaCBFcXVhbCIsCisvKiAzMi0zNCAqLyAiU2VhcmNoIExvdyIsICJTZXQgTGltaXRzIiwgIlByZWZldGNoIG9yIFJlYWQgUG9zaXRpb24iLCAKKy8qIDM1LTM3ICovICJTeW5jaHJvbml6ZSBDYWNoZSIsIkxvY2svVW5sb2NrIENhY2hlIiwgIlJlYWQgRGVmZWN0IERhdGEiLAorLyogMzgtM2MgKi8gIk1lZGl1bSBTY2FuIiwgIkNvbXBhcmUiLCJDb3B5IFZlcmlmeSIsICJXcml0ZSBCdWZmZXIiLCAiUmVhZCBCdWZmZXIiLAorLyogM2QtM2YgKi8gIlVwZGF0ZSBCbG9jayIsICJSZWFkIExvbmciLCAgIldyaXRlIExvbmciLAorfTsKKworCitzdGF0aWMgY29uc3QgY2hhciAqZ3JvdXBfMl9jb21tYW5kc1tdID0geworLyogNDAtNDEgKi8gIkNoYW5nZSBEZWZpbml0aW9uIiwgIldyaXRlIFNhbWUiLCAKKy8qIDQyLTQ4ICovICJSZWFkIFN1Yi1DaChjZCkiLCAiUmVhZCBUT0MiLCAiUmVhZCBIZWFkZXIoY2QpIiwgIlBsYXkgQXVkaW8oY2QpIiwgdW5rbm93biwgIlBsYXkgQXVkaW8gTVNGKGNkKSIsICJQbGF5IEF1ZGlvIFRyYWNrL0luZGV4KGNkKSIsIAorLyogNDktNGYgKi8gIlBsYXkgVHJhY2sgUmVsYXRpdmUoMTApKGNkKSIsIHVua25vd24sICJQYXVzZS9SZXN1bWUoY2QpIiwgIkxvZyBTZWxlY3QiLCAiTG9nIFNlbnNlIiwgdW5rbm93biwgdW5rbm93biwKKy8qIDUwLTU1ICovIHVua25vd24sIHVua25vd24sIHVua25vd24sIHVua25vd24sIHVua25vd24sICJNb2RlIFNlbGVjdCAoMTApIiwKKy8qIDU2LTViICovIHVua25vd24sIHVua25vd24sIHVua25vd24sIHVua25vd24sICJNb2RlIFNlbnNlICgxMCkiLCB1bmtub3duLAorLyogNWMtNWYgKi8gdW5rbm93biwgdW5rbm93biwgdW5rbm93biwKK307CisKKyNkZWZpbmUgZ3JvdXAob3Bjb2RlKSAoKChvcGNvZGUpID4+IDUpICYgNykKKworI2RlZmluZSBSRVNFUlZFRF9HUk9VUCAgMAorI2RlZmluZSBWRU5ET1JfR1JPVVAgICAgMQorI2RlZmluZSBOT1RFWFRfR1JPVVAgICAgMgorCitzdGF0aWMgY29uc3QgY2hhciAqKmNvbW1hbmRzW10gPSB7CisgICAgZ3JvdXBfMF9jb21tYW5kcywgZ3JvdXBfMV9jb21tYW5kcywgZ3JvdXBfMl9jb21tYW5kcywgCisgICAgKGNvbnN0IGNoYXIgKiopIFJFU0VSVkVEX0dST1VQLCAoY29uc3QgY2hhciAqKikgUkVTRVJWRURfR1JPVVAsIAorICAgIChjb25zdCBjaGFyICoqKSBOT1RFWFRfR1JPVVAsIChjb25zdCBjaGFyICoqKSBWRU5ET1JfR1JPVVAsIAorICAgIChjb25zdCBjaGFyICoqKSBWRU5ET1JfR1JPVVAKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIHJlc2VydmVkW10gPSAiUkVTRVJWRUQiOworc3RhdGljIGNvbnN0IGNoYXIgdmVuZG9yW10gPSAiVkVORE9SIFNQRUNJRklDIjsKKworc3RhdGljIHZvaWQgcHJpbnRfb3Bjb2Rlayh1bnNpZ25lZCBjaGFyIG9wY29kZSkKK3sKKwljb25zdCBjaGFyICoqdGFibGUgPSBjb21tYW5kc1sgZ3JvdXAob3Bjb2RlKSBdOworCisJc3dpdGNoICgodW5zaWduZWQgbG9uZykgdGFibGUpIHsKKwljYXNlIFJFU0VSVkVEX0dST1VQOgorCQlwcmludGsoIiVzWyUwMnhdICIsIHJlc2VydmVkLCBvcGNvZGUpOyAKKwkJYnJlYWs7CisJY2FzZSBOT1RFWFRfR1JPVVA6CisJCXByaW50aygiJXMobm90ZXh0KVslMDJ4XSAiLCB1bmtub3duLCBvcGNvZGUpOyAKKwkJYnJlYWs7CisJY2FzZSBWRU5ET1JfR1JPVVA6CisJCXByaW50aygiJXNbJTAyeF0gIiwgdmVuZG9yLCBvcGNvZGUpOyAKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKHRhYmxlW29wY29kZSAmIDB4MWZdICE9IHVua25vd24pCisJCQlwcmludGsoIiVzWyUwMnhdICIsIHRhYmxlW29wY29kZSAmIDB4MWZdLCBvcGNvZGUpOworCQllbHNlCisJCQlwcmludGsoIiVzWyUwMnhdICIsIHVua25vd24sIG9wY29kZSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfY29tbWFuZGsgKHVuc2lnbmVkIGNoYXIgKmNvbW1hbmQpCit7CisJaW50IGksIHM7CisJcHJpbnRrKEtFUk5fREVCVUcpOworCXByaW50X29wY29kZWsoY29tbWFuZFswXSk7CisJLypwcmludGsoS0VSTl9ERUJVRyAiJXMgIiwgX19GVU5DVElPTl9fKTsqLworCWlmICgoY29tbWFuZFswXSA+PiA1KSA9PSA2IHx8CisJICAgIChjb21tYW5kWzBdID4+IDUpID09IDcgKSB7CisJCXMgPSAxMjsgLyogdmVuZGVyIHNwZWNpZmljICovCisJfSBlbHNlIHsKKwkJcyA9IENPTU1BTkRfU0laRShjb21tYW5kWzBdKTsKKwl9CisJZm9yICggaSA9IDE7IGkgPCBzOyArK2kpIHsKKwkJcHJpbnRrKCIlMDJ4ICIsIGNvbW1hbmRbaV0pOworCX0KKworCXN3aXRjaCAocykgeworCWNhc2UgNjoKKwkJcHJpbnRrKCJMQkE9JWQgbGVuPSVkIiwKKwkJICAgICAgICgoKHVuc2lnbmVkIGludCljb21tYW5kWzFdICYgMHgwZikgPDwgMTYpIHwKKwkJICAgICAgICggKHVuc2lnbmVkIGludCljb21tYW5kWzJdICAgICAgICAgPDwgIDgpIHwKKwkJICAgICAgICggKHVuc2lnbmVkIGludCljb21tYW5kWzNdICAgICAgICAgICAgICApLAorCQkgICAgICAgKHVuc2lnbmVkIGludCljb21tYW5kWzRdCisJCQkpOworCQlicmVhazsKKwljYXNlIDEwOgorCQlwcmludGsoIkxCQT0lZCBsZW49JWQiLAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpY29tbWFuZFsyXSA8PCAyNCkgfAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpY29tbWFuZFszXSA8PCAxNikgfAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpY29tbWFuZFs0XSA8PCAgOCkgfAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpY29tbWFuZFs1XSAgICAgICksCisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzddIDw8ICA4KSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzhdICAgICAgKQorCQkgICAgICAgKTsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJcHJpbnRrKCJMQkE9JWQgbGVuPSVkIiwKKwkJICAgICAgICgodW5zaWduZWQgaW50KWNvbW1hbmRbMl0gPDwgMjQpIHwKKwkJICAgICAgICgodW5zaWduZWQgaW50KWNvbW1hbmRbM10gPDwgMTYpIHwKKwkJICAgICAgICgodW5zaWduZWQgaW50KWNvbW1hbmRbNF0gPDwgIDgpIHwKKwkJICAgICAgICgodW5zaWduZWQgaW50KWNvbW1hbmRbNV0gICAgICApLAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpY29tbWFuZFs2XSA8PCAyNCkgfAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpY29tbWFuZFs3XSA8PCAxNikgfAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpY29tbWFuZFs4XSA8PCAgOCkgfAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpY29tbWFuZFs5XSAgICAgICkKKwkJICAgICAgICk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfY29tbWFuZChTY3NpX0NtbmQgKlNDcG50KQoreworCXByaW50X2NvbW1hbmRrKFNDcG50LT5jbW5kKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19waGFzZShTY3NpX0NtbmQgKlNDcG50KQoreworCWludCBpID0gU0NwbnQtPlNDcC5waGFzZTsKKworCWNoYXIgKnBoW10gPSB7CisJCSJQSF9VTkRFVEVSTUlORUQiLAorCQkiUEhfQVJCU1RBUlQiLAorCQkiUEhfU0VMU1RBUlQiLAorCQkiUEhfU0VMRUNURUQiLAorCQkiUEhfQ09NTUFORCIsCisJCSJQSF9EQVRBIiwKKwkJIlBIX1NUQVRVUyIsCisJCSJQSF9NU0dfSU4iLAorCQkiUEhfTVNHX09VVCIsCisJCSJQSF9ESVNDT05ORUNUIiwKKwkJIlBIX1JFU0VMRUNUIgorCX07CisKKwlpZiAoIGkgPCBQSF9VTkRFVEVSTUlORUQgfHwgaSA+IFBIX1JFU0VMRUNUICkgeworCQlwcmludGsoS0VSTl9ERUJVRyAic2NzaSBwaGFzZTogdW5rbm93biglZClcbiIsIGkpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRrKEtFUk5fREVCVUcgInNjc2kgcGhhc2U6ICVzXG4iLCBwaFtpXSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfYnVzcGhhc2UodW5zaWduZWQgY2hhciBzdGF0KQoreworCXN3aXRjaChzdGF0KSB7CisJY2FzZSBCVVNQSEFTRV9DT01NQU5EOgorCQlwcmludGsoS0VSTl9ERUJVRyAiQlVTUEhBU0VfQ09NTUFORFxuIik7CisJCWJyZWFrOworCWNhc2UgQlVTUEhBU0VfTUVTU0FHRV9JTjoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkJVU1BIQVNFX01FU1NBR0VfSU5cbiIpOworCQlicmVhazsKKwljYXNlIEJVU1BIQVNFX01FU1NBR0VfT1VUOgorCQlwcmludGsoS0VSTl9ERUJVRyAiQlVTUEhBU0VfTUVTU0FHRV9PVVRcbiIpOworCQlicmVhazsKKwljYXNlIEJVU1BIQVNFX0RBVEFfSU46CisJCXByaW50ayhLRVJOX0RFQlVHICJCVVNQSEFTRV9EQVRBX0lOXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBCVVNQSEFTRV9EQVRBX09VVDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkJVU1BIQVNFX0RBVEFfT1VUXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBCVVNQSEFTRV9TVEFUVVM6CisJCXByaW50ayhLRVJOX0RFQlVHICJCVVNQSEFTRV9TVEFUVVNcbiIpOworCQlicmVhazsKKwljYXNlIEJVU1BIQVNFX1NFTEVDVDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkJVU1BIQVNFX1NFTEVDVFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJCVVNQSEFTRV9vdGhlclxuIik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgc2hvd19tZXNzYWdlKG5zcF9od19kYXRhICpkYXRhKQoreworCWludCBpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIm1zZzoiKTsKKwlmb3IoaT0wOyBpIDwgZGF0YS0+TXNnTGVuOyBpKyspIHsKKwkJcHJpbnRrKCIgJTAyeCIsIGRhdGEtPk1zZ0J1ZmZlcltpXSk7CisJfQorCXByaW50aygiXG4iKTsKK30KKworLyogZW5kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9pby5oIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjg3NDZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfaW8uaApAQCAtMCwwICsxLDI3NCBAQAorLyoKKyAgTmluamFTQ1NJIEkvTyBmdW50aW9ucyAKKyAgICAgIEJ5OiBZT0tPVEEgSGlyb3NoaSA8eW9rb3RhQG5ldGxhYi5pcy50c3VrdWJhLmFjLmpwPgorIAorICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICAqLworCisvKiAkSWQ6IG5zcF9pby5oLHYgMS4zIDIwMDMvMDgvMDQgMjE6MTU6MjYgZWxjYSBFeHAgJCAqLworCisjaWZuZGVmIF9fTlNQX0lPX0hfXworI2RlZmluZSBfX05TUF9JT19IX18KKworc3RhdGljIGlubGluZSAgICAgICAgICB2b2lkIG5zcF93cml0ZSh1bnNpZ25lZCBpbnQgYmFzZSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgaW5kZXgsCisJCQkJICAgICAgdW5zaWduZWQgY2hhciB2YWwpOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIG5zcF9yZWFkKHVuc2lnbmVkIGludCBiYXNlLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGluZGV4KTsKK3N0YXRpYyBpbmxpbmUgICAgICAgICAgdm9pZCBuc3BfaW5kZXhfd3JpdGUodW5zaWduZWQgaW50IEJhc2VBZGRyLAorCQkJCQkgICAgdW5zaWduZWQgaW50IFJlZ2lzdGVyLAorCQkJCQkgICAgdW5zaWduZWQgY2hhciBWYWx1ZSk7CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgbnNwX2luZGV4X3JlYWQodW5zaWduZWQgaW50IEJhc2VBZGRyLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgUmVnaXN0ZXIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQmFzaWMgSU8KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwX3dyaXRlKHVuc2lnbmVkIGludCAgYmFzZSwKKwkJCSAgICAgdW5zaWduZWQgaW50ICBpbmRleCwKKwkJCSAgICAgdW5zaWduZWQgY2hhciB2YWwpCit7CisJb3V0Yih2YWwsIChiYXNlICsgaW5kZXgpKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIG5zcF9yZWFkKHVuc2lnbmVkIGludCBiYXNlLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGluZGV4KQoreworCXJldHVybiBpbmIoYmFzZSArIGluZGV4KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW5kZXhlZCBJTworICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgbnNwX2luZGV4X3JlYWQodW5zaWduZWQgaW50IEJhc2VBZGRyLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgUmVnaXN0ZXIpCit7CisJb3V0YihSZWdpc3RlciwgQmFzZUFkZHIgKyBJTkRFWFJFRyk7CisJcmV0dXJuIGluYihCYXNlQWRkciArIERBVEFSRUcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwX2luZGV4X3dyaXRlKHVuc2lnbmVkIGludCAgQmFzZUFkZHIsCisJCQkJICAgdW5zaWduZWQgaW50ICBSZWdpc3RlciwKKwkJCQkgICB1bnNpZ25lZCBjaGFyIFZhbHVlKQoreworCW91dGIoUmVnaXN0ZXIsIEJhc2VBZGRyICsgSU5ERVhSRUcpOworCW91dGIoVmFsdWUsIEJhc2VBZGRyICsgREFUQVJFRyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZpZm8gZnVuYworICovCisKKy8qIHJlYWQgOCBiaXQgRklGTyAqLworc3RhdGljIGlubGluZSB2b2lkIG5zcF9tdWx0aV9yZWFkXzEodW5zaWduZWQgaW50ICAgQmFzZUFkZHIsCisJCQkJICAgIHVuc2lnbmVkIGludCAgIFJlZ2lzdGVyLAorCQkJCSAgICB2b2lkICAgICAgICAgICpidWYsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgIGNvdW50KQoreworCWluc2IoQmFzZUFkZHIgKyBSZWdpc3RlciwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3BfZmlmbzhfcmVhZCh1bnNpZ25lZCBpbnQgICBiYXNlLAorCQkJCSAgdm9pZCAgICAgICAgICAqYnVmLAorCQkJCSAgdW5zaWduZWQgbG9uZyAgY291bnQpCit7CisJLypuc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAiYnVmPTB4JXAsIGNvdW50PTB4JWx4IiwgYnVmLCBjb3VudCk7Ki8KKwluc3BfbXVsdGlfcmVhZF8xKGJhc2UsIEZJRk9EQVRBLCBidWYsIGNvdW50KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHJlYWQgMTYgYml0IEZJRk8gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3BfbXVsdGlfcmVhZF8yKHVuc2lnbmVkIGludCAgIEJhc2VBZGRyLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgICBSZWdpc3RlciwKKwkJCQkgICAgdm9pZCAgICAgICAgICAqYnVmLAorCQkJCSAgICB1bnNpZ25lZCBsb25nICBjb3VudCkKK3sKKwlpbnN3KEJhc2VBZGRyICsgUmVnaXN0ZXIsIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwX2ZpZm8xNl9yZWFkKHVuc2lnbmVkIGludCAgIGJhc2UsCisJCQkJICAgdm9pZCAgICAgICAgICAqYnVmLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgIGNvdW50KQoreworCS8vbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgImJ1Zj0weCVwLCBjb3VudD0weCVseCoyIiwgYnVmLCBjb3VudCk7CisJbnNwX211bHRpX3JlYWRfMihiYXNlLCBGSUZPREFUQSwgYnVmLCBjb3VudCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiByZWFkIDMyYml0IEZJRk8gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3BfbXVsdGlfcmVhZF80KHVuc2lnbmVkIGludCAgIEJhc2VBZGRyLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgICBSZWdpc3RlciwKKwkJCQkgICAgdm9pZCAgICAgICAgICAqYnVmLAorCQkJCSAgICB1bnNpZ25lZCBsb25nICBjb3VudCkKK3sKKwlpbnNsKEJhc2VBZGRyICsgUmVnaXN0ZXIsIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwX2ZpZm8zMl9yZWFkKHVuc2lnbmVkIGludCAgIGJhc2UsCisJCQkJICAgdm9pZCAgICAgICAgICAqYnVmLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgIGNvdW50KQoreworCS8vbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgImJ1Zj0weCVwLCBjb3VudD0weCVseCo0IiwgYnVmLCBjb3VudCk7CisJbnNwX211bHRpX3JlYWRfNChiYXNlLCBGSUZPREFUQSwgYnVmLCBjb3VudCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHdyaXRlIDhiaXQgRklGTyAqLworc3RhdGljIGlubGluZSB2b2lkIG5zcF9tdWx0aV93cml0ZV8xKHVuc2lnbmVkIGludCAgIEJhc2VBZGRyLAorCQkJCSAgICAgdW5zaWduZWQgaW50ICAgUmVnaXN0ZXIsCisJCQkJICAgICB2b2lkICAgICAgICAgICpidWYsCisJCQkJICAgICB1bnNpZ25lZCBsb25nICBjb3VudCkKK3sKKwlvdXRzYihCYXNlQWRkciArIFJlZ2lzdGVyLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5zcF9maWZvOF93cml0ZSh1bnNpZ25lZCBpbnQgICBiYXNlLAorCQkJCSAgIHZvaWQgICAgICAgICAgKmJ1ZiwKKwkJCQkgICB1bnNpZ25lZCBsb25nICBjb3VudCkKK3sKKwluc3BfbXVsdGlfd3JpdGVfMShiYXNlLCBGSUZPREFUQSwgYnVmLCBjb3VudCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogd3JpdGUgMTZiaXQgRklGTyAqLworc3RhdGljIGlubGluZSB2b2lkIG5zcF9tdWx0aV93cml0ZV8yKHVuc2lnbmVkIGludCAgIEJhc2VBZGRyLAorCQkJCSAgICAgdW5zaWduZWQgaW50ICAgUmVnaXN0ZXIsCisJCQkJICAgICB2b2lkICAgICAgICAgICpidWYsCisJCQkJICAgICB1bnNpZ25lZCBsb25nICBjb3VudCkKK3sKKwlvdXRzdyhCYXNlQWRkciArIFJlZ2lzdGVyLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5zcF9maWZvMTZfd3JpdGUodW5zaWduZWQgaW50ICAgYmFzZSwKKwkJCQkgICAgdm9pZCAgICAgICAgICAqYnVmLAorCQkJCSAgICB1bnNpZ25lZCBsb25nICBjb3VudCkKK3sKKwluc3BfbXVsdGlfd3JpdGVfMihiYXNlLCBGSUZPREFUQSwgYnVmLCBjb3VudCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogd3JpdGUgMzJiaXQgRklGTyAqLworc3RhdGljIGlubGluZSB2b2lkIG5zcF9tdWx0aV93cml0ZV80KHVuc2lnbmVkIGludCAgIEJhc2VBZGRyLAorCQkJCSAgICAgdW5zaWduZWQgaW50ICAgUmVnaXN0ZXIsCisJCQkJICAgICB2b2lkICAgICAgICAgICpidWYsCisJCQkJICAgICB1bnNpZ25lZCBsb25nICBjb3VudCkKK3sKKwlvdXRzbChCYXNlQWRkciArIFJlZ2lzdGVyLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5zcF9maWZvMzJfd3JpdGUodW5zaWduZWQgaW50ICAgYmFzZSwKKwkJCQkgICAgdm9pZCAgICAgICAgICAqYnVmLAorCQkJCSAgICB1bnNpZ25lZCBsb25nICBjb3VudCkKK3sKKwluc3BfbXVsdGlfd3JpdGVfNChiYXNlLCBGSUZPREFUQSwgYnVmLCBjb3VudCk7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3BfbW1pb193cml0ZSh1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkJICB1bnNpZ25lZCBpbnQgIGluZGV4LAorCQkJCSAgdW5zaWduZWQgY2hhciB2YWwpCit7CisJdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKikoYmFzZSArIE5TUF9NTUlPX09GRlNFVCArIGluZGV4KTsKKworCXdyaXRlYih2YWwsIHB0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBuc3BfbW1pb19yZWFkKHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCQkJICB1bnNpZ25lZCBpbnQgIGluZGV4KQoreworCXVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopKGJhc2UgKyBOU1BfTU1JT19PRkZTRVQgKyBpbmRleCk7CisKKwlyZXR1cm4gcmVhZGIocHRyKTsKK30KKworLyotLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBuc3BfbW1pb19pbmRleF9yZWFkKHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCQkJCXVuc2lnbmVkIGludCAgcmVnKQoreworCXVuc2lnbmVkIGNoYXIgKmluZGV4X3B0ciA9ICh1bnNpZ25lZCBjaGFyICopKGJhc2UgKyBOU1BfTU1JT19PRkZTRVQgKyBJTkRFWFJFRyk7CisJdW5zaWduZWQgY2hhciAqZGF0YV9wdHIgID0gKHVuc2lnbmVkIGNoYXIgKikoYmFzZSArIE5TUF9NTUlPX09GRlNFVCArIERBVEFSRUcpOworCisJd3JpdGViKCh1bnNpZ25lZCBjaGFyKXJlZywgaW5kZXhfcHRyKTsKKwlyZXR1cm4gcmVhZGIoZGF0YV9wdHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwX21taW9faW5kZXhfd3JpdGUodW5zaWduZWQgbG9uZyBiYXNlLAorCQkJCQl1bnNpZ25lZCBpbnQgIHJlZywKKwkJCQkJdW5zaWduZWQgY2hhciB2YWwpCit7CisJdW5zaWduZWQgY2hhciAqaW5kZXhfcHRyID0gKHVuc2lnbmVkIGNoYXIgKikoYmFzZSArIE5TUF9NTUlPX09GRlNFVCArIElOREVYUkVHKTsKKwl1bnNpZ25lZCBjaGFyICpkYXRhX3B0ciAgPSAodW5zaWduZWQgY2hhciAqKShiYXNlICsgTlNQX01NSU9fT0ZGU0VUICsgREFUQVJFRyk7CisKKwl3cml0ZWIoKHVuc2lnbmVkIGNoYXIpcmVnLCBpbmRleF9wdHIpOworCXdyaXRlYih2YWwsICAgICAgICAgICAgICAgIGRhdGFfcHRyKTsKK30KKworLyogcmVhZCAzMmJpdCBGSUZPICovCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwX21taW9fbXVsdGlfcmVhZF80KHVuc2lnbmVkIGxvbmcgIGJhc2UsCisJCQkJCSB1bnNpZ25lZCBpbnQgICBSZWdpc3RlciwKKwkJCQkJIHZvaWQgICAgICAgICAgKmJ1ZiwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgIGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgKnB0ciA9ICh1bnNpZ25lZCBsb25nICopKGJhc2UgKyBSZWdpc3Rlcik7CisJdW5zaWduZWQgbG9uZyAqdG1wID0gKHVuc2lnbmVkIGxvbmcgKilidWY7CisJaW50IGk7CisKKwkvL25zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJiYXNlIDB4JTBseCBwdHIgMHglcCIsYmFzZSxwdHIpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJKnRtcCA9IHJlYWRsKHB0cik7CisJCS8vbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgIjwlZCwlcCwlcCwlbHg+IiwgaSwgcHRyLCB0bXAsICp0bXApOworCQl0bXArKzsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3BfbW1pb19maWZvMzJfcmVhZCh1bnNpZ25lZCBpbnQgICBiYXNlLAorCQkJCQl2b2lkICAgICAgICAgICpidWYsCisJCQkJCXVuc2lnbmVkIGxvbmcgIGNvdW50KQoreworCS8vbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgImJ1Zj0weCVwLCBjb3VudD0weCVseCo0IiwgYnVmLCBjb3VudCk7CisJbnNwX21taW9fbXVsdGlfcmVhZF80KGJhc2UsIEZJRk9EQVRBLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5zcF9tbWlvX211bHRpX3dyaXRlXzQodW5zaWduZWQgbG9uZyAgYmFzZSwKKwkJCQkJICB1bnNpZ25lZCBpbnQgICBSZWdpc3RlciwKKwkJCQkJICB2b2lkICAgICAgICAgICpidWYsCisJCQkJCSAgdW5zaWduZWQgbG9uZyAgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyAqcHRyID0gKHVuc2lnbmVkIGxvbmcgKikoYmFzZSArIFJlZ2lzdGVyKTsKKwl1bnNpZ25lZCBsb25nICp0bXAgPSAodW5zaWduZWQgbG9uZyAqKWJ1ZjsKKwlpbnQgaTsKKworCS8vbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgImJhc2UgMHglMGx4IHB0ciAweCVwIixiYXNlLHB0cik7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQl3cml0ZWwoKnRtcCwgcHRyKTsKKwkJLy9uc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAiPCVkLCVwLCVwLCVseD4iLCBpLCBwdHIsIHRtcCwgKnRtcCk7CisJCXRtcCsrOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIG5zcF9tbWlvX2ZpZm8zMl93cml0ZSh1bnNpZ25lZCBpbnQgICBiYXNlLAorCQkJCQkgdm9pZCAgICAgICAgICAqYnVmLAorCQkJCQkgdW5zaWduZWQgbG9uZyAgY291bnQpCit7CisJLy9uc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAiYnVmPTB4JXAsIGNvdW50PTB4JWx4KjQiLCBidWYsIGNvdW50KTsKKwluc3BfbW1pb19tdWx0aV93cml0ZV80KGJhc2UsIEZJRk9EQVRBLCBidWYsIGNvdW50KTsKK30KKworCisKKyNlbmRpZgorLyogZW5kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9tZXNzYWdlLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9tZXNzYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcwNTc3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX21lc3NhZ2UuYwpAQCAtMCwwICsxLDc4IEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIE5pbmphU0NTSS0zIG1lc3NhZ2UgaGFuZGxlcgorICAgICAgQnk6IFlPS09UQSBIaXJvc2hpIDx5b2tvdGFAbmV0bGFiLmlzLnRzdWt1YmEuYWMuanA+CisKKyAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworCisvKiAkSWQ6IG5zcF9tZXNzYWdlLmMsdiAxLjYgMjAwMy8wNy8yNiAxNDoyMTowOSBlbGNhIEV4cCAkICovCisKK3N0YXRpYyB2b2lkIG5zcF9tZXNzYWdlX2luKFNjc2lfQ21uZCAqU0NwbnQpCit7CisJdW5zaWduZWQgaW50ICBiYXNlID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKKwluc3BfaHdfZGF0YSAgKmRhdGEgPSAobnNwX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGRhdGFfcmVnLCBjb250cm9sX3JlZzsKKwlpbnQgICAgICAgICAgIHJldCwgbGVuOworCisJLyoKKwkgKiBYWFg6IE5TUCBRVUlSSworCSAqIE5TUCBpbnZva2UgaW50ZXJydXB0cyBvbmx5IGluIHRoZSBjYXNlIG9mIHNjc2kgcGhhc2UgY2hhbmdlcywKKwkgKiB0aGVyZWZvcmUgd2Ugc2hvdWxkIHBvbGwgdGhlIHNjc2kgcGhhc2UgaGVyZSB0byBjYXRjaCAKKwkgKiB0aGUgbmV4dCAibXNnIGluIiBpZiBleGlzdHMgKG5vIHNjc2kgcGhhc2UgY2hhbmdlcykuCisJICovCisJcmV0ID0gMTY7CisJbGVuID0gMDsKKworCW5zcF9kYmcoTlNQX0RFQlVHX01TR0lOT0NDVVIsICJtc2dpbiBsb29wIik7CisJZG8geworCQkvKiByZWFkIGRhdGEgKi8KKwkJZGF0YV9yZWcgPSBuc3BfaW5kZXhfcmVhZChiYXNlLCBTQ1NJREFUQUlOKTsKKworCQkvKiBhc3NlcnQgQUNLICovCisJCWNvbnRyb2xfcmVnID0gbnNwX2luZGV4X3JlYWQoYmFzZSwgU0NTSUJVU0NUUkwpOworCQljb250cm9sX3JlZyB8PSBTQ1NJX0FDSzsKKwkJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFNDU0lCVVNDVFJMLCBjb250cm9sX3JlZyk7CisJCW5zcF9uZWdhdGVfc2lnbmFsKFNDcG50LCBCVVNNT05fUkVRLCAibXNnaW48UkVRPiIpOworCisJCWRhdGEtPk1zZ0J1ZmZlcltsZW5dID0gZGF0YV9yZWc7IGxlbisrOworCisJCS8qIGRlYXNzZXJ0IEFDSyAqLworCQljb250cm9sX3JlZyA9ICBuc3BfaW5kZXhfcmVhZChiYXNlLCBTQ1NJQlVTQ1RSTCk7CisJCWNvbnRyb2xfcmVnICY9IH5TQ1NJX0FDSzsKKwkJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFNDU0lCVVNDVFJMLCBjb250cm9sX3JlZyk7CisKKwkJLyogY2F0Y2ggYSBuZXh0IHNpZ25hbCAqLworCQlyZXQgPSBuc3BfZXhwZWN0X3NpZ25hbChTQ3BudCwgQlVTUEhBU0VfTUVTU0FHRV9JTiwgQlVTTU9OX1JFUSk7CisJfSB3aGlsZSAocmV0ID4gMCAmJiBNU0dCVUZfU0laRSA+IGxlbik7CisKKwlkYXRhLT5Nc2dMZW4gPSBsZW47CisKK30KKworc3RhdGljIHZvaWQgbnNwX21lc3NhZ2Vfb3V0KFNjc2lfQ21uZCAqU0NwbnQpCit7CisJbnNwX2h3X2RhdGEgKmRhdGEgPSAobnNwX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlpbnQgcmV0ID0gMTsKKwlpbnQgbGVuID0gZGF0YS0+TXNnTGVuOworCisJLyoKKwkgKiBYWFg6IE5TUCBRVUlSSworCSAqIE5TUCBpbnZva2UgaW50ZXJydXB0cyBvbmx5IGluIHRoZSBjYXNlIG9mIHNjc2kgcGhhc2UgY2hhbmdlcywKKwkgKiB0aGVyZWZvcmUgd2Ugc2hvdWxkIHBvbGwgdGhlIHNjc2kgcGhhc2UgaGVyZSB0byBjYXRjaCAKKwkgKiB0aGUgbmV4dCAibXNnIG91dCIgaWYgZXhpc3RzIChubyBzY3NpIHBoYXNlIGNoYW5nZXMpLgorCSAqLworCisJbnNwX2RiZyhOU1BfREVCVUdfTVNHT1VUT0NDVVIsICJtc2dvdXQgbG9vcCIpOworCWRvIHsKKwkJaWYgKG5zcF94ZmVyKFNDcG50LCBCVVNQSEFTRV9NRVNTQUdFX09VVCkpIHsKKwkJCW5zcF9tc2coS0VSTl9ERUJVRywgIm1zZ291dDogeGZlciBzaG9ydCIpOworCQl9CisKKwkJLyogY2F0Y2ggYSBuZXh0IHNpZ25hbCAqLworCQlyZXQgPSBuc3BfZXhwZWN0X3NpZ25hbChTQ3BudCwgQlVTUEhBU0VfTUVTU0FHRV9PVVQsIEJVU01PTl9SRVEpOworCX0gd2hpbGUgKHJldCA+IDAgJiYgbGVuLS0gPiAwKTsKKworfQorCisvKiBlbmQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvcWxvZ2ljX3N0dWIuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvcWxvZ2ljX3N0dWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzY2YmNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9xbG9naWNfc3R1Yi5jCkBAIC0wLDAgKzEsNDI1IEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEEgZHJpdmVyIGZvciB0aGUgUWxvZ2ljIFNDU0kgY2FyZAorCisgICAgcWxvZ2ljX2NzLmMgMS43OSAyMDAwLzA2LzEyIDIxOjI3OjI2CisKKyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYworICAgIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCisKKyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKKyAgICBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworICAgIFRoZSBpbml0aWFsIGRldmVsb3BlciBvZiB0aGUgb3JpZ2luYWwgY29kZSBpcyBEYXZpZCBBLiBIaW5kcworICAgIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uICBQb3J0aW9ucyBjcmVhdGVkIGJ5IERhdmlkIEEuIEhpbmRzCisgICAgYXJlIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluIHdoaWNoCisgICAgY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCisgICAgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAgICBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQorICAgIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbgorICAgIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCisgICAgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlCisgICAgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMKKyAgICBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCisgICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiLi4vcWxvZ2ljZmFzNDA4LmgiCisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzY29kZS5oPgorCisvKiBTZXQgdGhlIGZvbGxvd2luZyB0byAyIHRvIHVzZSBub3JtYWwgaW50ZXJydXB0IChhY3RpdmUgaGlnaC90b3RlbXBvbGUtCisgKiB0cmlzdGF0ZSksIG90aGVyd2lzZSB1c2UgMCAoUkVRVUlSRUQgRk9SIFBDTUNJQSkgZm9yIGFjdGl2ZSBsb3csIG9wZW4KKyAqIGRyYWluCisgKi8KKyNkZWZpbmUgSU5UX1RZUEUJMAorCitzdGF0aWMgY2hhciBxbG9naWNfbmFtZVtdID0gInFsb2dpY19jcyI7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyBpbnQgcGNfZGVidWcgPSBQQ01DSUFfREVCVUc7Cittb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMDY0NCk7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpCitzdGF0aWMgY2hhciAqdmVyc2lvbiA9ICJxbG9naWNfY3MuYyAxLjc5LWFjIDIwMDIvMTAvMjYgKERhdmlkIEhpbmRzKSI7CisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQorI2VuZGlmCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgcWxvZ2ljZmFzX2RyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gcWxvZ2ljX25hbWUsCisJLnByb2NfbmFtZQkJPSBxbG9naWNfbmFtZSwKKwkuaW5mbwkJCT0gcWxvZ2ljZmFzNDA4X2luZm8sCisJLnF1ZXVlY29tbWFuZAkJPSBxbG9naWNmYXM0MDhfcXVldWVjb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gcWxvZ2ljZmFzNDA4X2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IHFsb2dpY2ZhczQwOF9idXNfcmVzZXQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyPSBxbG9naWNmYXM0MDhfZGV2aWNlX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSBxbG9naWNmYXM0MDhfaG9zdF9yZXNldCwKKwkuYmlvc19wYXJhbQkJPSBxbG9naWNmYXM0MDhfYmlvc3BhcmFtLAorCS5jYW5fcXVldWUJCT0gMSwKKwkudGhpc19pZAkJPSAtMSwKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorfTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgc3RydWN0IHNjc2lfaW5mb190IHsKKwlkZXZfbGlua190IGxpbms7CisJZGV2X25vZGVfdCBub2RlOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJdW5zaWduZWQgc2hvcnQgbWFuZl9pZDsKK30gc2NzaV9pbmZvX3Q7CisKK3N0YXRpYyB2b2lkIHFsb2dpY19yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIGludCBxbG9naWNfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LCBldmVudF9jYWxsYmFja19hcmdzX3QgKiBhcmdzKTsKKworc3RhdGljIGRldl9saW5rX3QgKnFsb2dpY19hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCBxbG9naWNfZGV0YWNoKGRldl9saW5rX3QgKik7CisKKworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0ID0gTlVMTDsKKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAicWxvZ2ljX2NzIjsKKworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKnFsb2dpY19kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICpob3N0LAorCQkJCWRldl9saW5rX3QgKmxpbmssIGludCBxYmFzZSwgaW50IHFsaXJxKQoreworCWludCBxbHR5cDsJCS8qIHR5cGUgb2YgY2hpcCAqLworCWludCBxaW5pdGlkOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OwkvKiByZWdpc3RlcmVkIGhvc3Qgc3RydWN0dXJlICovCisJc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICpwcml2OworCisJcWx0eXAgPSBxbG9naWNmYXM0MDhfZ2V0X2NoaXBfdHlwZShxYmFzZSwgSU5UX1RZUEUpOworCXFpbml0aWQgPSBob3N0LT50aGlzX2lkOworCWlmIChxaW5pdGlkIDwgMCkKKwkJcWluaXRpZCA9IDc7CS8qIGlmIG5vIElELCB1c2UgNyAqLworCisJcWxvZ2ljZmFzNDA4X3NldHVwKHFiYXNlLCBxaW5pdGlkLCBJTlRfVFlQRSk7CisKKwlob3N0LT5uYW1lID0gcWxvZ2ljX25hbWU7CisJc2hvc3QgPSBzY3NpX2hvc3RfYWxsb2MoaG9zdCwgc2l6ZW9mKHN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdikpOworCWlmICghc2hvc3QpCisJCWdvdG8gZXJyOworCXNob3N0LT5pb19wb3J0ID0gcWJhc2U7CisJc2hvc3QtPm5faW9fcG9ydCA9IDE2OworCXNob3N0LT5kbWFfY2hhbm5lbCA9IC0xOworCWlmIChxbGlycSAhPSAtMSkKKwkJc2hvc3QtPmlycSA9IHFsaXJxOworCisJcHJpdiA9IGdldF9wcml2X2J5X2hvc3Qoc2hvc3QpOworCXByaXYtPnFsaXJxID0gcWxpcnE7CisJcHJpdi0+cWJhc2UgPSBxYmFzZTsKKwlwcml2LT5xaW5pdGlkID0gcWluaXRpZDsKKwlwcml2LT5zaG9zdCA9IHNob3N0OworCXByaXYtPmludF90eXBlID0gSU5UX1RZUEU7CQkJCQkKKworCWlmIChyZXF1ZXN0X2lycShxbGlycSwgcWxvZ2ljZmFzNDA4X2loYW5kbCwgMCwgcWxvZ2ljX25hbWUsIHNob3N0KSkKKwkJZ290byBmcmVlX3Njc2lfaG9zdDsKKworCXNwcmludGYocHJpdi0+cWluZm8sCisJCSJRbG9naWNmYXMgRHJpdmVyIHZlcnNpb24gMC40NiwgY2hpcCAlMDJYIGF0ICUwM1gsIElSUSAlZCwgVFBkbWE6JWQiLAorCQlxbHR5cCwgcWJhc2UsIHFsaXJxLCBRTF9UVVJCT19QRE1BKTsKKworCWlmIChzY3NpX2FkZF9ob3N0KHNob3N0LCBOVUxMKSkKKwkJZ290byBmcmVlX2ludGVycnVwdDsKKworCXNjc2lfc2Nhbl9ob3N0KHNob3N0KTsKKworCXJldHVybiBzaG9zdDsKKworZnJlZV9pbnRlcnJ1cHQ6CisJZnJlZV9pcnEocWxpcnEsIHNob3N0KTsKKworZnJlZV9zY3NpX2hvc3Q6CisJc2NzaV9ob3N0X3B1dChzaG9zdCk7CisJCitlcnI6CisJcmV0dXJuIE5VTEw7Cit9CitzdGF0aWMgZGV2X2xpbmtfdCAqcWxvZ2ljX2F0dGFjaCh2b2lkKQoreworCXNjc2lfaW5mb190ICppbmZvOworCWNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworCWRldl9saW5rX3QgKmxpbms7CisJaW50IHJldDsKKworCURFQlVHKDAsICJxbG9naWNfYXR0YWNoKClcbiIpOworCisJLyogQ3JlYXRlIG5ldyBTQ1NJIGRldmljZSAqLworCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCWxpbmsgPSAmaW5mby0+bGluazsKKwlsaW5rLT5wcml2ID0gaW5mbzsKKwlsaW5rLT5pby5OdW1Qb3J0czEgPSAxNjsKKwlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCWxpbmstPmlvLklPQWRkckxpbmVzID0gMTA7CisJbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkU7CisJbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworCWxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKKwlsaW5rLT5jb25mLlZjYyA9IDUwOworCWxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworCWxpbmstPmNvbmYuUHJlc2VudCA9IFBSRVNFTlRfT1BUSU9OOworCisJLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisJbGluay0+bmV4dCA9IGRldl9saXN0OworCWRldl9saXN0ID0gbGluazsKKwljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZxbG9naWNfZXZlbnQ7CisJY2xpZW50X3JlZy5FdmVudE1hc2sgPSBDU19FVkVOVF9SRVNFVF9SRVFVRVNUIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8IENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKwljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKwlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwkJcWxvZ2ljX2RldGFjaChsaW5rKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGxpbms7Cit9CQkJCS8qIHFsb2dpY19hdHRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHFsb2dpY19kZXRhY2goZGV2X2xpbmtfdCAqIGxpbmspCit7CisJZGV2X2xpbmtfdCAqKmxpbmtwOworCisJREVCVUcoMCwgInFsb2dpY19kZXRhY2goMHglcClcbiIsIGxpbmspOworCisJLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCQlpZiAoKmxpbmtwID09IGxpbmspCisJCQlicmVhazsKKwlpZiAoKmxpbmtwID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJCXFsb2dpY19yZWxlYXNlKGxpbmspOworCisJaWYgKGxpbmstPmhhbmRsZSkKKwkJcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisKKwkvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBiaXRzICovCisJKmxpbmtwID0gbGluay0+bmV4dDsKKwlrZnJlZShsaW5rLT5wcml2KTsKKworfQkJCQkvKiBxbG9naWNfZGV0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKK2RvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIHFsb2dpY19jb25maWcoZGV2X2xpbmtfdCAqIGxpbmspCit7CisJY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKwlzY3NpX2luZm9fdCAqaW5mbyA9IGxpbmstPnByaXY7CisJdHVwbGVfdCB0dXBsZTsKKwljaXNwYXJzZV90IHBhcnNlOworCWludCBpLCBsYXN0X3JldCwgbGFzdF9mbjsKKwl1bnNpZ25lZCBzaG9ydCB0dXBsZV9kYXRhWzMyXTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCisJREVCVUcoMCwgInFsb2dpY19jb25maWcoMHglcClcbiIsIGxpbmspOworCisJdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKSB0dXBsZV9kYXRhOworCXR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OworCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisJbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisKKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOworCWlmICgocGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykgJiYgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykpCisJCWluZm8tPm1hbmZfaWQgPSBsZTE2X3RvX2NwdSh0dXBsZS5UdXBsZURhdGFbMF0pOworCisJLyogQ29uZmlndXJlIGNhcmQgKi8KKwlsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCXdoaWxlICgxKSB7CisJCWlmIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpICE9IDAgfHwKKwkJCQlwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkgIT0gMCkKKwkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IHBhcnNlLmNmdGFibGVfZW50cnkuaW5kZXg7CisJCWxpbmstPmlvLkJhc2VQb3J0MSA9IHBhcnNlLmNmdGFibGVfZW50cnkuaW8ud2luWzBdLmJhc2U7CisJCWxpbmstPmlvLk51bVBvcnRzMSA9IHBhcnNlLmNmdGFibGVfZW50cnkuaW8ud2luWzBdLmxlbjsKKwkJaWYgKGxpbmstPmlvLkJhc2VQb3J0MSAhPSAwKSB7CisJCQlpID0gcGNtY2lhX3JlcXVlc3RfaW8oaGFuZGxlLCAmbGluay0+aW8pOworCQkJaWYgKGkgPT0gQ1NfU1VDQ0VTUykKKwkJCQlicmVhazsKKwkJfQorCSAgICAgIG5leHRfZW50cnk6CisJCUNTX0NIRUNLKEdldE5leHRUdXBsZSwgcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJfQorCisJQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGhhbmRsZSwgJmxpbmstPmlycSkpOworCUNTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKworCWlmICgoaW5mby0+bWFuZl9pZCA9PSBNQU5GSURfTUFDTklDQSkgfHwgKGluZm8tPm1hbmZfaWQgPT0gTUFORklEX1BJT05FRVIpIHx8IChpbmZvLT5tYW5mX2lkID09IDB4MDA5OCkpIHsKKwkJLyogc2V0IEFUQWNtZCAqLworCQlvdXRiKDB4YjQsIGxpbmstPmlvLkJhc2VQb3J0MSArIDB4ZCk7CisJCW91dGIoMHgyNCwgbGluay0+aW8uQmFzZVBvcnQxICsgMHg5KTsKKwkJb3V0YigweDA0LCBsaW5rLT5pby5CYXNlUG9ydDEgKyAweGQpOworCX0KKworCS8qIFRoZSBLWEwtODEwQU4gaGFzIGEgYmlnZ2VyIElPIHBvcnQgd2luZG93ICovCisJaWYgKGxpbmstPmlvLk51bVBvcnRzMSA9PSAzMikKKwkJaG9zdCA9IHFsb2dpY19kZXRlY3QoJnFsb2dpY2Zhc19kcml2ZXJfdGVtcGxhdGUsIGxpbmssCisJCQlsaW5rLT5pby5CYXNlUG9ydDEgKyAxNiwgbGluay0+aXJxLkFzc2lnbmVkSVJRKTsKKwllbHNlCisJCWhvc3QgPSBxbG9naWNfZGV0ZWN0KCZxbG9naWNmYXNfZHJpdmVyX3RlbXBsYXRlLCBsaW5rLAorCQkJbGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpOworCQorCWlmICghaG9zdCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogbm8gU0NTSSBkZXZpY2VzIGZvdW5kXG4iLCBxbG9naWNfbmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCXNwcmludGYoaW5mby0+bm9kZS5kZXZfbmFtZSwgInNjc2klZCIsIGhvc3QtPmhvc3Rfbm8pOworCWxpbmstPmRldiA9ICZpbmZvLT5ub2RlOworCWluZm8tPmhvc3QgPSBob3N0OworCitvdXQ6CisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKwlyZXR1cm47CisKK2NzX2ZhaWxlZDoKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKKwlsaW5rLT5kZXYgPSBOVUxMOworCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwlwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7CisJcmV0dXJuOworCit9CQkJCS8qIHFsb2dpY19jb25maWcgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHFsb2dpY19yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisJc2NzaV9pbmZvX3QgKmluZm8gPSBsaW5rLT5wcml2OworCisJREVCVUcoMCwgInFsb2dpY19yZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKworCXNjc2lfcmVtb3ZlX2hvc3QoaW5mby0+aG9zdCk7CisJbGluay0+ZGV2ID0gTlVMTDsKKworCWZyZWVfaXJxKGxpbmstPmlycS5Bc3NpZ25lZElSUSwgaW5mby0+aG9zdCk7CisKKwlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCXBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworCisJc2NzaV9ob3N0X3B1dChpbmZvLT5ob3N0KTsKKworCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBxbG9naWNfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LCBldmVudF9jYWxsYmFja19hcmdzX3QgKiBhcmdzKQoreworCWRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKworCURFQlVHKDEsICJxbG9naWNfZXZlbnQoMHglMDZ4KVxuIiwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJCQlxbG9naWNfcmVsZWFzZShsaW5rKTsKKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwkJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJCXFsb2dpY19jb25maWcobGluayk7CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwkJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworCWNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJCQlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJc2NzaV9pbmZvX3QgKmluZm8gPSBsaW5rLT5wcml2OworCQkJcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKwkJCWlmICgoaW5mby0+bWFuZl9pZCA9PSBNQU5GSURfTUFDTklDQSkgfHwgKGluZm8tPm1hbmZfaWQgPT0gTUFORklEX1BJT05FRVIpIHx8IChpbmZvLT5tYW5mX2lkID09IDB4MDA5OCkpIHsKKwkJCQlvdXRiKDB4ODAsIGxpbmstPmlvLkJhc2VQb3J0MSArIDB4ZCk7CisJCQkJb3V0YigweDI0LCBsaW5rLT5pby5CYXNlUG9ydDEgKyAweDkpOworCQkJCW91dGIoMHgwNCwgbGluay0+aW8uQmFzZVBvcnQxICsgMHhkKTsKKwkJCX0KKwkJCS8qIFVnZ2dnbGxseXl5eSEhISAqLworCQkJcWxvZ2ljZmFzNDA4X2J1c19yZXNldChOVUxMKTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CQkJCS8qIHFsb2dpY19ldmVudCAqLworCisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBxbG9naWNfY3NfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkubmFtZQkJPSAicWxvZ2ljX2NzIiwKKwl9LAorCS5hdHRhY2gJCT0gcWxvZ2ljX2F0dGFjaCwKKwkuZGV0YWNoCQk9IHFsb2dpY19kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3Fsb2dpY19jcyh2b2lkKQoreworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZxbG9naWNfY3NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcWxvZ2ljX2NzKHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZxbG9naWNfY3NfZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK01PRFVMRV9BVVRIT1IoIlRvbSBaZXJ1Y2hhLCBNaWNoYWVsIEdyaWZmaXRoIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgdGhlIFBDTUNJQSBRbG9naWMgRkFTIFNDU0kgY29udHJvbGxlcnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9pbml0KGluaXRfcWxvZ2ljX2NzKTsKK21vZHVsZV9leGl0KGV4aXRfcWxvZ2ljX2NzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvc3ltNTNjNTAwX2NzLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL3N5bTUzYzUwMF9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NTdkMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL3N5bTUzYzUwMF9jcy5jCkBAIC0wLDAgKzEsMTAyMiBAQAorLyoKKyogIHN5bTUzYzUwMF9jcy5jCUJvYiBUcmFjeSAocmN0QGZydXMuY29tKQorKgorKiAgQSByZXdyaXRlIG9mIHRoZSBwY21jaWEtY3MgYWRkLW9uIGRyaXZlciBmb3IgbmV3ZXIgKGNpcmNhIDE5OTcpCisqICBOZXcgTWVkaWEgQnVzIFRvYXN0ZXIgUENNQ0lBIFNDU0kgY2FyZHMgdXNpbmcgdGhlIFN5bWJpb3MgTG9naWMKKyogIDUzYzUwMCBjb250cm9sbGVyOiBpbnRlbmRlZCBmb3IgdXNlIHdpdGggMi42IGFuZCBsYXRlciBrZXJuZWxzLgorKiAgVGhlIHBjbWNpYS1jcyBhZGQtb24gdmVyc2lvbiBvZiB0aGlzIGRyaXZlciBpcyBub3Qgc3VwcG9ydGVkCisqICBiZXlvbmQgMi40LiAgSXQgY29uc2lzdGVkIG9mIHRocmVlIGZpbGVzIHdpdGggaGlzdG9yeS9jb3B5cmlnaHQKKyogIGluZm9ybWF0aW9uIGFzIGZvbGxvd3M6CisqCisqICBTWU01M0M1MDAuaAorKglCb2IgVHJhY3kgKHJjdEBmcnVzLmNvbSkKKyoJT3JpZ2luYWwgYnkgVG9tIENvcm5lciAodGNvcm5lckB2aWEuYXQpLgorKglBZGFwdGVkIGZyb20gTkNSNTNjNDA2YS5oIHdoaWNoIGlzIENvcHlyaWdodGVkIChDKSAxOTk0CisqCU5vcm11bmRzIFNhdW1hbmlzIChub3JtdW5kc0ByeC50ZWNoLnN3aC5sdikKKyoKKyogIFNZTTUzQzUwMC5jCisqCUJvYiBUcmFjeSAocmN0QGZydXMuY29tKQorKglPcmlnaW5hbCBkcml2ZXIgYnkgVG9tIENvcm5lciAodGNvcm5lckB2aWEuYXQpIHdhcyBhZGFwdGVkCisqCWZyb20gTkNSNTNjNDA2YS5jIHdoaWNoIGlzIENvcHlyaWdodGVkIChDKSAxOTk0LCAxOTk1LCAxOTk2IAorKglOb3JtdW5kcyBTYXVtYW5pcyAobm9ybXVuZHNAZmkuaWJtLmNvbSkKKyoKKyogIHN5bTUzYzUwMC5jCisqCUJvYiBUcmFjeSAocmN0QGZydXMuY29tKQorKglPcmlnaW5hbCBieSBUb20gQ29ybmVyICh0Y29ybmVyQHZpYS5hdCkgd2FzIGFkYXB0ZWQgZnJvbSBhCisqCWRyaXZlciBmb3IgdGhlIFFsb2dpYyBTQ1NJIGNhcmQgd3JpdHRlbiBieQorKglEYXZpZCBIaW5kcyAoZGhpbmRzQGFsbGVncm8uc3RhbmZvcmQuZWR1KS4KKyogCisqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisqICBsYXRlciB2ZXJzaW9uLgorKgorKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNkZWZpbmUgU1lNNTNDNTAwX0RFQlVHIDAKKyNkZWZpbmUgVkVSQk9TRV9TWU01M0M1MDBfREVCVUcgMAorCisvKgorKiAgU2V0IHRoaXMgdG8gMCBpZiB5b3UgZW5jb3VudGVyIGtlcm5lbCBsb2NrdXBzIHdoaWxlIHRyYW5zZmVycmluZyAKKyogIGRhdGEgaW4gUElPIG1vZGUuICBOb3RlIHRoaXMgY2FuIGJlIGNoYW5nZWQgdmlhICJzeXNmcyIuCisqLworI2RlZmluZSBVU0VfRkFTVF9QSU8gMQorCisvKiA9PT09PT09PT09PT09PT0gRW5kIG9mIHVzZXIgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMgPT09PT09PT09PT09PT0gKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNjb2RlLmg+CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgaW50IHBjX2RlYnVnID0gUENNQ0lBX0RFQlVHOworbW9kdWxlX3BhcmFtKHBjX2RlYnVnLCBpbnQsIDApOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBpZiAocGNfZGVidWc+KG4pKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKQorc3RhdGljIGNoYXIgKnZlcnNpb24gPQorInN5bTUzYzUwMF9jcy5jIDAuOWMgMjAwNC8xMC8yNyAoQm9iIFRyYWN5KSI7CisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjZGVmaW5lIFNZTkNfTU9ERSAwIAkJLyogU3luY2hyb25vdXMgdHJhbnNmZXIgbW9kZSAqLworCisvKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQzFfSU1HICAgMHgwNwkJLyogSUQ9NyAqLworI2RlZmluZSBDMl9JTUcgICAweDQ4CQkvKiBGRSBTQ1NJMiAqLworI2RlZmluZSBDM19JTUcgICAweDIwCQkvKiBDREIgKi8KKyNkZWZpbmUgQzRfSU1HICAgMHgwNAkJLyogQU5FICovCisjZGVmaW5lIEM1X0lNRyAgIDB4YTQJCS8qID8gY2hhbmdlZCBmcm9tIGI2PSBBQSBQSSBTSUUgUE9MICovCisjZGVmaW5lIEM3X0lNRyAgIDB4ODAJCS8qIGFkZGVkIGZvciBTWU01M0M1MDAgdC4gY29ybmVyICovCisKKy8qIEhhcmR3YXJlIFJlZ2lzdGVyczogb2Zmc2V0cyBmcm9tIGlvX3BvcnQgKGJhc2UpICovCisKKy8qIENvbnRyb2wgUmVnaXN0ZXIgU2V0IDAgKi8KKyNkZWZpbmUgVENfTFNCCQkweDAwCQkvKiB0cmFuc2ZlciBjb3VudGVyIGxzYiAqLworI2RlZmluZSBUQ19NU0IJCTB4MDEJCS8qIHRyYW5zZmVyIGNvdW50ZXIgbXNiICovCisjZGVmaW5lIFNDU0lfRklGTwkweDAyCQkvKiBzY3NpIGZpZm8gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ01EX1JFRwkJMHgwMwkJLyogY29tbWFuZCByZWdpc3RlciAqLworI2RlZmluZSBTVEFUX1JFRwkweDA0CQkvKiBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgREVTVF9JRAkJMHgwNAkJLyogc2VsZWN0aW9uL3Jlc2VsZWN0aW9uIGJ1cyBpZCAqLworI2RlZmluZSBJTlRfUkVHCQkweDA1CQkvKiBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFNSVElNT1VUCTB4MDUJCS8qIHNlbGVjdC9yZXNlbGVjdCB0aW1lb3V0IHJlZyAqLworI2RlZmluZSBTRVFfUkVHCQkweDA2CQkvKiBzZXF1ZW5jZSBzdGVwIHJlZ2lzdGVyICovCisjZGVmaW5lIFNZTkNQUkQJCTB4MDYJCS8qIHN5bmNocm9ub3VzIHRyYW5zZmVyIHBlcmlvZCAqLworI2RlZmluZSBGSUZPX0ZMQUdTCTB4MDcJCS8qIGluZGljYXRlcyAjIG9mIGJ5dGVzIGluIGZpZm8gKi8KKyNkZWZpbmUgU1lOQ09GRgkJMHgwNwkJLyogc3luY2hyb25vdXMgb2Zmc2V0IHJlZ2lzdGVyICovCisjZGVmaW5lIENPTkZJRzEJCTB4MDgJCS8qIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ0xLQ09OVgkJMHgwOQkJLyogY2xvY2sgY29udmVyc2lvbiByZWdpc3RlciAqLworLyogI2RlZmluZSBURVNUUkVHCTB4MEEgKi8JCS8qIHRlc3QgbW9kZSByZWdpc3RlciAqLworI2RlZmluZSBDT05GSUcyCQkweDBCCQkvKiBjb25maWd1cmF0aW9uIDIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ09ORklHMwkJMHgwQwkJLyogY29uZmlndXJhdGlvbiAzIHJlZ2lzdGVyICovCisjZGVmaW5lIENPTkZJRzQJCTB4MEQJCS8qIGNvbmZpZ3VyYXRpb24gNCByZWdpc3RlciAqLworI2RlZmluZSBUQ19ISUdICQkweDBFCQkvKiB0cmFuc2ZlciBjb3VudGVyIGhpZ2ggKi8KKy8qICNkZWZpbmUgRklGT19CT1RUT00JMHgwRiAqLwkJLyogcmVzZXJ2ZSBGSUZPIGJ5dGUgcmVnaXN0ZXIgKi8KKworLyogQ29udHJvbCBSZWdpc3RlciBTZXQgMSAqLworLyogI2RlZmluZSBKVU1QRVJfU0VOU0UJMHgwMCAqLwkJLyoganVtcGVyIHNlbnNlIHBvcnQgcmVnIChyL3cpICovCisvKiAjZGVmaW5lIFNSQU1fUFRSCTB4MDEgKi8JCS8qIFNSQU0gYWRkcmVzcyBwb2ludGVyIHJlZyAoci93KSAqLworLyogI2RlZmluZSBTUkFNX0RBVEEJMHgwMiAqLwkJLyogU1JBTSBkYXRhIHJlZ2lzdGVyIChyL3cpICovCisjZGVmaW5lIFBJT19GSUZPCTB4MDQJCS8qIFBJTyBGSUZPIHJlZ2lzdGVycyAoci93KSAqLworLyogI2RlZmluZSBQSU9fRklGTzEJMHgwNSAqLwkJLyogICovCisvKiAjZGVmaW5lIFBJT19GSUZPMgkweDA2ICovCQkvKiAgKi8KKy8qICNkZWZpbmUgUElPX0ZJRk8zCTB4MDcgKi8JCS8qICAqLworI2RlZmluZSBQSU9fU1RBVFVTCTB4MDgJCS8qIFBJTyBzdGF0dXMgKHIvdykgKi8KKy8qICNkZWZpbmUgQVRBX0NNRAkweDA5ICovCQkvKiBBVEEgY29tbWFuZC9zdGF0dXMgcmVnIChyL3cpICovCisvKiAjZGVmaW5lIEFUQV9FUlIJMHgwQSAqLwkJLyogQVRBIGZlYXR1cmVzL2Vycm9yIHJlZyAoci93KSAqLworI2RlZmluZSBQSU9fRkxBRwkweDBCCQkvKiBQSU8gZmxhZyBpbnRlcnJ1cHQgZW5hYmxlIChyL3cpICovCisjZGVmaW5lIENPTkZJRzUJCTB4MDkJCS8qIGNvbmZpZ3VyYXRpb24gNSByZWdpc3RlciAqLworLyogI2RlZmluZSBTSUdOQVRVUkUJMHgwRSAqLwkJLyogc2lnbmF0dXJlIHJlZ2lzdGVyIChyKSAqLworLyogI2RlZmluZSBDT05GSUc2CTB4MEYgKi8JCS8qIGNvbmZpZ3VyYXRpb24gNiByZWdpc3RlciAocikgKi8KKyNkZWZpbmUgQ09ORklHNwkJMHgwZAorCisvKiBzZWxlY3QgcmVnaXN0ZXIgc2V0IDAgKi8KKyNkZWZpbmUgUkVHMCh4KQkJKG91dGIoQzRfSU1HLCAoeCkgKyBDT05GSUc0KSkKKy8qIHNlbGVjdCByZWdpc3RlciBzZXQgMSAqLworI2RlZmluZSBSRUcxKHgpCQlvdXRiKEM3X0lNRywgKHgpICsgQ09ORklHNyk7IG91dGIoQzVfSU1HLCAoeCkgKyBDT05GSUc1KQorCisjaWYgU1lNNTNDNTAwX0RFQlVHCisjZGVmaW5lIERFQih4KSB4CisjZWxzZQorI2RlZmluZSBERUIoeCkKKyNlbmRpZgorCisjaWYgVkVSQk9TRV9TWU01M0M1MDBfREVCVUcKKyNkZWZpbmUgVkRFQih4KSB4CisjZWxzZQorI2RlZmluZSBWREVCKHgpCisjZW5kaWYKKworI2RlZmluZSBMT0FEX0RNQV9DT1VOVCh4LCBjb3VudCkgXAorICBvdXRiKGNvdW50ICYgMHhmZiwgKHgpICsgVENfTFNCKTsgXAorICBvdXRiKChjb3VudCA+PiA4KSAmIDB4ZmYsICh4KSArIFRDX01TQik7IFwKKyAgb3V0YigoY291bnQgPj4gMTYpICYgMHhmZiwgKHgpICsgVENfSElHSCk7CisKKy8qIENoaXAgY29tbWFuZHMgKi8KKyNkZWZpbmUgRE1BX09QICAgICAgICAgICAgICAgMHg4MAorCisjZGVmaW5lIFNDU0lfTk9QICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRkxVU0hfRklGTyAgICAgICAgICAgMHgwMQorI2RlZmluZSBDSElQX1JFU0VUICAgICAgICAgICAweDAyCisjZGVmaW5lIFNDU0lfUkVTRVQgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgUkVTRUxFQ1QgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBTRUxFQ1RfTk9fQVROICAgICAgICAweDQxCisjZGVmaW5lIFNFTEVDVF9BVE4gICAgICAgICAgIDB4NDIKKyNkZWZpbmUgU0VMRUNUX0FUTl9TVE9QICAgICAgMHg0MworI2RlZmluZSBFTkFCTEVfU0VMICAgICAgICAgICAweDQ0CisjZGVmaW5lIERJU0FCTEVfU0VMICAgICAgICAgIDB4NDUKKyNkZWZpbmUgU0VMRUNUX0FUTjMgICAgICAgICAgMHg0NgorI2RlZmluZSBSRVNFTEVDVDMgICAgICAgICAgICAweDQ3CisjZGVmaW5lIFRSQU5TRkVSX0lORk8gICAgICAgIDB4MTAKKyNkZWZpbmUgSU5JVF9DTURfQ09NUExFVEUgICAgMHgxMQorI2RlZmluZSBNU0dfQUNDRVBUICAgICAgICAgICAweDEyCisjZGVmaW5lIFRSQU5TRkVSX1BBRCAgICAgICAgIDB4MTgKKyNkZWZpbmUgU0VUX0FUTiAgICAgICAgICAgICAgMHgxYQorI2RlZmluZSBSRVNFVF9BVE4gICAgICAgICAgICAweDFiCisjZGVmaW5lIFNFTkRfTVNHICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgU0VORF9TVEFUVVMgICAgICAgICAgMHgyMQorI2RlZmluZSBTRU5EX0RBVEEgICAgICAgICAgICAweDIyCisjZGVmaW5lIERJU0NPTk5fU0VRICAgICAgICAgIDB4MjMKKyNkZWZpbmUgVEVSTUlOQVRFX1NFUSAgICAgICAgMHgyNAorI2RlZmluZSBUQVJHX0NNRF9DT01QTEVURSAgICAweDI1CisjZGVmaW5lIERJU0NPTk4gICAgICAgICAgICAgIDB4MjcKKyNkZWZpbmUgUkVDVl9NU0cgICAgICAgICAgICAgMHgyOAorI2RlZmluZSBSRUNWX0NNRCAgICAgICAgICAgICAweDI5CisjZGVmaW5lIFJFQ1ZfREFUQSAgICAgICAgICAgIDB4MmEKKyNkZWZpbmUgUkVDVl9DTURfU0VRICAgICAgICAgMHgyYgorI2RlZmluZSBUQVJHRVRfQUJPUlRfRE1BICAgICAweDA0CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdHJ1Y3Qgc2NzaV9pbmZvX3QgeworCWRldl9saW5rX3QgbGluazsKKwlkZXZfbm9kZV90IG5vZGU7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwl1bnNpZ25lZCBzaG9ydCBtYW5mX2lkOworfTsKKworLyoKKyogIFJlcG9zaXRvcnkgZm9yIHBlci1pbnN0YW5jZSBob3N0IGRhdGEuCisqLworc3RydWN0IHN5bTUzYzUwMF9kYXRhIHsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjdXJyZW50X1NDOworCWludCBmYXN0X3BpbzsKK307CisKK2VudW0gUGhhc2UgeworICAgIGlkbGUsCisgICAgZGF0YV9vdXQsCisgICAgZGF0YV9pbiwKKyAgICBjb21tYW5kX3BoLAorICAgIHN0YXR1c19waCwKKyAgICBtZXNzYWdlX291dCwKKyAgICBtZXNzYWdlX2luCit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoKKyogIEdsb2JhbCAod2l0aGluIHRoaXMgbW9kdWxlKSB2YXJpYWJsZXMgb3RoZXIgdGhhbgorKiAgc3ltNTNjNTAwX2RyaXZlcl90ZW1wbGF0ZSAodGhlIHNjc2lfaG9zdF90ZW1wbGF0ZSkuCisqLworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0Oworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAic3ltNTNjNTAwX2NzIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyB2b2lkCitjaGlwX2luaXQoaW50IGlvX3BvcnQpCit7CisJUkVHMShpb19wb3J0KTsKKwlvdXRiKDB4MDEsIGlvX3BvcnQgKyBQSU9fU1RBVFVTKTsKKwlvdXRiKDB4MDAsIGlvX3BvcnQgKyBQSU9fRkxBRyk7CisKKwlvdXRiKEM0X0lNRywgaW9fcG9ydCArIENPTkZJRzQpOwkvKiBSRUcwKGlvX3BvcnQpOyAqLworCW91dGIoQzNfSU1HLCBpb19wb3J0ICsgQ09ORklHMyk7CisJb3V0YihDMl9JTUcsIGlvX3BvcnQgKyBDT05GSUcyKTsKKwlvdXRiKEMxX0lNRywgaW9fcG9ydCArIENPTkZJRzEpOworCisJb3V0YigweDA1LCBpb19wb3J0ICsgQ0xLQ09OVik7CS8qIGNsb2NrIGNvbnZlcnNpb24gZmFjdG9yICovCisJb3V0YigweDlDLCBpb19wb3J0ICsgU1JUSU1PVVQpOwkvKiBTZWxlY3Rpb24gdGltZW91dCAqLworCW91dGIoMHgwNSwgaW9fcG9ydCArIFNZTkNQUkQpOwkvKiBTeW5jaHJvbm91cyB0cmFuc2ZlciBwZXJpb2QgKi8KKwlvdXRiKFNZTkNfTU9ERSwgaW9fcG9ydCArIFNZTkNPRkYpOwkvKiBzeW5jaHJvbm91cyBtb2RlICovICAKK30KKworc3RhdGljIHZvaWQKK1NZTTUzQzUwMF9pbnRfaG9zdF9yZXNldChpbnQgaW9fcG9ydCkKK3sKKwlvdXRiKEM0X0lNRywgaW9fcG9ydCArIENPTkZJRzQpOwkvKiBSRUcwKGlvX3BvcnQpOyAqLworCW91dGIoQ0hJUF9SRVNFVCwgaW9fcG9ydCArIENNRF9SRUcpOworCW91dGIoU0NTSV9OT1AsIGlvX3BvcnQgKyBDTURfUkVHKTsJLyogcmVxdWlyZWQgYWZ0ZXIgcmVzZXQgKi8KKwlvdXRiKFNDU0lfUkVTRVQsIGlvX3BvcnQgKyBDTURfUkVHKTsKKwljaGlwX2luaXQoaW9fcG9ydCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludAorU1lNNTNDNTAwX3Bpb19yZWFkKGludCBmYXN0X3BpbywgaW50IGJhc2UsIHVuc2lnbmVkIGNoYXIgKnJlcXVlc3QsIHVuc2lnbmVkIGludCByZXFsZW4pCit7CisJaW50IGk7CisJaW50IGxlbjsJLyogY3VycmVudCBzY3NpIGZpZm8gc2l6ZSAqLworCisJUkVHMShiYXNlKTsKKwl3aGlsZSAocmVxbGVuKSB7CisJCWkgPSBpbmIoYmFzZSArIFBJT19TVEFUVVMpOworCQkvKiBWREVCKHByaW50aygicGlvX3N0YXR1cz0leFxuIiwgaSkpOyAqLworCQlpZiAoaSAmIDB4ODApIAorCQkJcmV0dXJuIDA7CisKKwkJc3dpdGNoIChpICYgMHgxZSkgeworCQlkZWZhdWx0OgorCQljYXNlIDB4MTA6CS8qIGZpZm8gZW1wdHkgKi8KKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAweDA6CisJCQlsZW4gPSAxOworCQkJYnJlYWs7IAorCQljYXNlIDB4ODoJLyogZmlmbyAxLzMgZnVsbCAqLworCQkJbGVuID0gNDI7CisJCQlicmVhazsKKwkJY2FzZSAweGM6CS8qIGZpZm8gMi8zIGZ1bGwgKi8KKwkJCWxlbiA9IDg0OworCQkJYnJlYWs7CisJCWNhc2UgMHhlOgkvKiBmaWZvIGZ1bGwgKi8KKwkJCWxlbiA9IDEyODsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChpICYgMHg0MCkgJiYgbGVuID09IDApIHsgLyogZmlmbyBlbXB0eSBhbmQgaW50ZXJydXB0IG9jY3VycmVkICovCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChsZW4pIHsKKwkJCWlmIChsZW4gPiByZXFsZW4pIAorCQkJCWxlbiA9IHJlcWxlbjsKKworCQkJaWYgKGZhc3RfcGlvICYmIGxlbiA+IDMpIHsKKwkJCQlpbnNsKGJhc2UgKyBQSU9fRklGTywgcmVxdWVzdCwgbGVuID4+IDIpOworCQkJCXJlcXVlc3QgKz0gbGVuICYgMHhmYzsgCisJCQkJcmVxbGVuIC09IGxlbiAmIDB4ZmM7IAorCQkJfSBlbHNlIHsKKwkJCQl3aGlsZSAobGVuLS0pIHsKKwkJCQkJKnJlcXVlc3QrKyA9IGluYihiYXNlICsgUElPX0ZJRk8pOworCQkJCQlyZXFsZW4tLTsKKwkJCQl9CisJCQl9IAorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK1NZTTUzQzUwMF9waW9fd3JpdGUoaW50IGZhc3RfcGlvLCBpbnQgYmFzZSwgdW5zaWduZWQgY2hhciAqcmVxdWVzdCwgdW5zaWduZWQgaW50IHJlcWxlbikKK3sKKwlpbnQgaSA9IDA7CisJaW50IGxlbjsJLyogY3VycmVudCBzY3NpIGZpZm8gc2l6ZSAqLworCisJUkVHMShiYXNlKTsKKwl3aGlsZSAocmVxbGVuICYmICEoaSAmIDB4NDApKSB7CisJCWkgPSBpbmIoYmFzZSArIFBJT19TVEFUVVMpOworCQkvKiBWREVCKHByaW50aygicGlvX3N0YXR1cz0leFxuIiwgaSkpOyAqLworCQlpZiAoaSAmIDB4ODApCS8qIGVycm9yICovCisJCQlyZXR1cm4gMDsKKworCQlzd2l0Y2ggKGkgJiAweDFlKSB7CisJCWNhc2UgMHgxMDoKKwkJCWxlbiA9IDEyODsKKwkJCWJyZWFrOworCQljYXNlIDB4MDoKKwkJCWxlbiA9IDg0OworCQkJYnJlYWs7CisJCWNhc2UgMHg4OgorCQkJbGVuID0gNDI7CisJCQlicmVhazsKKwkJY2FzZSAweGM6CisJCQlsZW4gPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCWNhc2UgMHhlOgorCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGxlbikgeworCQkJaWYgKGxlbiA+IHJlcWxlbikKKwkJCQlsZW4gPSByZXFsZW47CisKKwkJCWlmIChmYXN0X3BpbyAmJiBsZW4gPiAzKSB7CisJCQkJb3V0c2woYmFzZSArIFBJT19GSUZPLCByZXF1ZXN0LCBsZW4gPj4gMik7CisJCQkJcmVxdWVzdCArPSBsZW4gJiAweGZjOworCQkJCXJlcWxlbiAtPSBsZW4gJiAweGZjOworCQkJfSBlbHNlIHsKKwkJCQl3aGlsZSAobGVuLS0pIHsKKwkJCQkJb3V0YigqcmVxdWVzdCsrLCBiYXNlICsgUElPX0ZJRk8pOworCQkJCQlyZXFsZW4tLTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorU1lNNTNDNTAwX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBTY3NpX0hvc3QgKmRldiA9IGRldl9pZDsKKwlERUIodW5zaWduZWQgY2hhciBmaWZvX3NpemU7KQorCURFQih1bnNpZ25lZCBjaGFyIHNlcV9yZWc7KQorCXVuc2lnbmVkIGNoYXIgc3RhdHVzLCBpbnRfcmVnOworCXVuc2lnbmVkIGNoYXIgcGlvX3N0YXR1czsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdDsKKwl1bnNpZ25lZCBpbnQgc2djb3VudDsKKwlpbnQgcG9ydF9iYXNlID0gZGV2LT5pb19wb3J0OworCXN0cnVjdCBzeW01M2M1MDBfZGF0YSAqZGF0YSA9CisJICAgIChzdHJ1Y3Qgc3ltNTNjNTAwX2RhdGEgKilkZXYtPmhvc3RkYXRhOworCXN0cnVjdCBzY3NpX2NtbmQgKmN1clNDID0gZGF0YS0+Y3VycmVudF9TQzsKKwlpbnQgZmFzdF9waW8gPSBkYXRhLT5mYXN0X3BpbzsKKworCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlWREVCKHByaW50aygiU1lNNTNDNTAwX2ludHIgY2FsbGVkXG4iKSk7CisKKwlSRUcxKHBvcnRfYmFzZSk7CisJcGlvX3N0YXR1cyA9IGluYihwb3J0X2Jhc2UgKyBQSU9fU1RBVFVTKTsKKwlSRUcwKHBvcnRfYmFzZSk7CisJc3RhdHVzID0gaW5iKHBvcnRfYmFzZSArIFNUQVRfUkVHKTsKKwlERUIoc2VxX3JlZyA9IGluYihwb3J0X2Jhc2UgKyBTRVFfUkVHKSk7CisJaW50X3JlZyA9IGluYihwb3J0X2Jhc2UgKyBJTlRfUkVHKTsKKwlERUIoZmlmb19zaXplID0gaW5iKHBvcnRfYmFzZSArIEZJRk9fRkxBR1MpICYgMHgxZik7CisKKyNpZiBTWU01M0M1MDBfREVCVUcKKwlwcmludGsoInN0YXR1cz0lMDJ4LCBzZXFfcmVnPSUwMngsIGludF9yZWc9JTAyeCwgZmlmb19zaXplPSUwMngiLCAKKwkgICAgc3RhdHVzLCBzZXFfcmVnLCBpbnRfcmVnLCBmaWZvX3NpemUpOworCXByaW50aygiLCBwaW89JTAyeFxuIiwgcGlvX3N0YXR1cyk7CisjZW5kaWYgLyogU1lNNTNDNTAwX0RFQlVHICovCisKKwlpZiAoaW50X3JlZyAmIDB4ODApIHsJLyogU0NTSSByZXNldCBpbnRyICovCisJCURFQihwcmludGsoIlNZTTUzQzUwMDogcmVzZXQgaW50ciByZWNlaXZlZFxuIikpOworCQljdXJTQy0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQlnb3RvIGlkbGVfb3V0OworCX0KKworCWlmIChwaW9fc3RhdHVzICYgMHg4MCkgeworCQlwcmludGsoIlNZTTUzQzUwMDogV2FybmluZzogUElPIGVycm9yIVxuIik7CisJCWN1clNDLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCWdvdG8gaWRsZV9vdXQ7CisJfQorCisJaWYgKHN0YXR1cyAmIDB4MjApIHsJCS8qIFBhcml0eSBlcnJvciAqLworCQlwcmludGsoIlNZTTUzQzUwMDogV2FybmluZzogcGFyaXR5IGVycm9yIVxuIik7CisJCWN1clNDLT5yZXN1bHQgPSBESURfUEFSSVRZIDw8IDE2OworCQlnb3RvIGlkbGVfb3V0OworCX0KKworCWlmIChzdGF0dXMgJiAweDQwKSB7CQkvKiBHcm9zcyBlcnJvciAqLworCQlwcmludGsoIlNZTTUzQzUwMDogV2FybmluZzogZ3Jvc3MgZXJyb3IhXG4iKTsKKwkJY3VyU0MtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJZ290byBpZGxlX291dDsKKwl9CisKKwlpZiAoaW50X3JlZyAmIDB4MjApIHsJCS8qIERpc2Nvbm5lY3QgKi8KKwkJREVCKHByaW50aygiU1lNNTNDNTAwOiBkaXNjb25uZWN0IGludHIgcmVjZWl2ZWRcbiIpKTsKKwkJaWYgKGN1clNDLT5TQ3AucGhhc2UgIT0gbWVzc2FnZV9pbikgewkvKiBVbmV4cGVjdGVkIGRpc2Nvbm5lY3QgKi8KKwkJCWN1clNDLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJfSBlbHNlIHsJLyogQ29tbWFuZCBjb21wbGV0ZSwgcmV0dXJuIHN0YXR1cyBhbmQgbWVzc2FnZSAqLworCQkJY3VyU0MtPnJlc3VsdCA9IChjdXJTQy0+U0NwLlN0YXR1cyAmIDB4ZmYpCisJCQkgICAgfCAoKGN1clNDLT5TQ3AuTWVzc2FnZSAmIDB4ZmYpIDw8IDgpIHwgKERJRF9PSyA8PCAxNik7CisJCX0KKwkJZ290byBpZGxlX291dDsKKwl9CisKKwlzd2l0Y2ggKHN0YXR1cyAmIDB4MDcpIHsJLyogc2NzaSBwaGFzZSAqLworCWNhc2UgMHgwMDoJCQkvKiBEQVRBLU9VVCAqLworCQlpZiAoaW50X3JlZyAmIDB4MTApIHsJLyogVGFyZ2V0IHJlcXVlc3RpbmcgaW5mbyB0cmFuc2ZlciAqLworCQkJY3VyU0MtPlNDcC5waGFzZSA9IGRhdGFfb3V0OworCQkJVkRFQihwcmludGsoIlNZTTUzQzUwMDogRGF0YS1PdXQgcGhhc2VcbiIpKTsKKwkJCW91dGIoRkxVU0hfRklGTywgcG9ydF9iYXNlICsgQ01EX1JFRyk7CisJCQlMT0FEX0RNQV9DT1VOVChwb3J0X2Jhc2UsIGN1clNDLT5yZXF1ZXN0X2J1ZmZsZW4pOwkvKiBNYXggdHJhbnNmZXIgc2l6ZSAqLworCQkJb3V0YihUUkFOU0ZFUl9JTkZPIHwgRE1BX09QLCBwb3J0X2Jhc2UgKyBDTURfUkVHKTsKKwkJCWlmICghY3VyU0MtPnVzZV9zZykJLyogRG9uJ3QgdXNlIHNjYXR0ZXItZ2F0aGVyICovCisJCQkJU1lNNTNDNTAwX3Bpb193cml0ZShmYXN0X3BpbywgcG9ydF9iYXNlLCBjdXJTQy0+cmVxdWVzdF9idWZmZXIsIGN1clNDLT5yZXF1ZXN0X2J1ZmZsZW4pOworCQkJZWxzZSB7CS8qIHVzZSBzY2F0dGVyLWdhdGhlciAqLworCQkJCXNnY291bnQgPSBjdXJTQy0+dXNlX3NnOworCQkJCXNnbGlzdCA9IGN1clNDLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJCQl3aGlsZSAoc2djb3VudC0tKSB7CisJCQkJCVNZTTUzQzUwMF9waW9fd3JpdGUoZmFzdF9waW8sIHBvcnRfYmFzZSwgcGFnZV9hZGRyZXNzKHNnbGlzdC0+cGFnZSkgKyBzZ2xpc3QtPm9mZnNldCwgc2dsaXN0LT5sZW5ndGgpOworCQkJCQlzZ2xpc3QrKzsKKwkJCQl9CisJCQl9CisJCQlSRUcwKHBvcnRfYmFzZSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDB4MDE6CQkvKiBEQVRBLUlOICovCisJCWlmIChpbnRfcmVnICYgMHgxMCkgewkvKiBUYXJnZXQgcmVxdWVzdGluZyBpbmZvIHRyYW5zZmVyICovCisJCQljdXJTQy0+U0NwLnBoYXNlID0gZGF0YV9pbjsKKwkJCVZERUIocHJpbnRrKCJTWU01M0M1MDA6IERhdGEtSW4gcGhhc2VcbiIpKTsKKwkJCW91dGIoRkxVU0hfRklGTywgcG9ydF9iYXNlICsgQ01EX1JFRyk7CisJCQlMT0FEX0RNQV9DT1VOVChwb3J0X2Jhc2UsIGN1clNDLT5yZXF1ZXN0X2J1ZmZsZW4pOwkvKiBNYXggdHJhbnNmZXIgc2l6ZSAqLworCQkJb3V0YihUUkFOU0ZFUl9JTkZPIHwgRE1BX09QLCBwb3J0X2Jhc2UgKyBDTURfUkVHKTsKKwkJCWlmICghY3VyU0MtPnVzZV9zZykJLyogRG9uJ3QgdXNlIHNjYXR0ZXItZ2F0aGVyICovCisJCQkJU1lNNTNDNTAwX3Bpb19yZWFkKGZhc3RfcGlvLCBwb3J0X2Jhc2UsIGN1clNDLT5yZXF1ZXN0X2J1ZmZlciwgY3VyU0MtPnJlcXVlc3RfYnVmZmxlbik7CisJCQllbHNlIHsJLyogVXNlIHNjYXR0ZXItZ2F0aGVyICovCisJCQkJc2djb3VudCA9IGN1clNDLT51c2Vfc2c7CisJCQkJc2dsaXN0ID0gY3VyU0MtPnJlcXVlc3RfYnVmZmVyOworCQkJCXdoaWxlIChzZ2NvdW50LS0pIHsKKwkJCQkJU1lNNTNDNTAwX3Bpb19yZWFkKGZhc3RfcGlvLCBwb3J0X2Jhc2UsIHBhZ2VfYWRkcmVzcyhzZ2xpc3QtPnBhZ2UpICsgc2dsaXN0LT5vZmZzZXQsIHNnbGlzdC0+bGVuZ3RoKTsKKwkJCQkJc2dsaXN0Kys7CisJCQkJfQorCQkJfQorCQkJUkVHMChwb3J0X2Jhc2UpOworCQl9CisJCWJyZWFrOworCisJY2FzZSAweDAyOgkJLyogQ09NTUFORCAqLworCQljdXJTQy0+U0NwLnBoYXNlID0gY29tbWFuZF9waDsKKwkJcHJpbnRrKCJTWU01M0M1MDA6IFdhcm5pbmc6IFVua25vd24gaW50ZXJydXB0IG9jY3VycmVkIGluIGNvbW1hbmQgcGhhc2UhXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDM6CQkvKiBTVEFUVVMgKi8KKwkJY3VyU0MtPlNDcC5waGFzZSA9IHN0YXR1c19waDsKKwkJVkRFQihwcmludGsoIlNZTTUzQzUwMDogU3RhdHVzIHBoYXNlXG4iKSk7CisJCW91dGIoRkxVU0hfRklGTywgcG9ydF9iYXNlICsgQ01EX1JFRyk7CisJCW91dGIoSU5JVF9DTURfQ09NUExFVEUsIHBvcnRfYmFzZSArIENNRF9SRUcpOworCQlicmVhazsKKworCWNhc2UgMHgwNDoJCS8qIFJlc2VydmVkICovCisJY2FzZSAweDA1OgkJLyogUmVzZXJ2ZWQgKi8KKwkJcHJpbnRrKCJTWU01M0M1MDA6IFdBUk5JTkc6IFJlc2VydmVkIHBoYXNlISEhXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDY6CQkvKiBNRVNTQUdFLU9VVCAqLworCQlERUIocHJpbnRrKCJTWU01M0M1MDA6IE1lc3NhZ2UtT3V0IHBoYXNlXG4iKSk7CisJCWN1clNDLT5TQ3AucGhhc2UgPSBtZXNzYWdlX291dDsKKwkJb3V0YihTRVRfQVROLCBwb3J0X2Jhc2UgKyBDTURfUkVHKTsJLyogUmVqZWN0IHRoZSBtZXNzYWdlICovCisJCW91dGIoTVNHX0FDQ0VQVCwgcG9ydF9iYXNlICsgQ01EX1JFRyk7CisJCWJyZWFrOworCisJY2FzZSAweDA3OgkJLyogTUVTU0FHRS1JTiAqLworCQlWREVCKHByaW50aygiU1lNNTNDNTAwOiBNZXNzYWdlLUluIHBoYXNlXG4iKSk7CisJCWN1clNDLT5TQ3AucGhhc2UgPSBtZXNzYWdlX2luOworCisJCWN1clNDLT5TQ3AuU3RhdHVzID0gaW5iKHBvcnRfYmFzZSArIFNDU0lfRklGTyk7CisJCWN1clNDLT5TQ3AuTWVzc2FnZSA9IGluYihwb3J0X2Jhc2UgKyBTQ1NJX0ZJRk8pOworCisJCVZERUIocHJpbnRrKCJTQ1NJIEZJRk8gc2l6ZT0lZFxuIiwgaW5iKHBvcnRfYmFzZSArIEZJRk9fRkxBR1MpICYgMHgxZikpOworCQlERUIocHJpbnRrKCJTdGF0dXMgPSAlMDJ4ICBNZXNzYWdlID0gJTAyeFxuIiwgY3VyU0MtPlNDcC5TdGF0dXMsIGN1clNDLT5TQ3AuTWVzc2FnZSkpOworCisJCWlmIChjdXJTQy0+U0NwLk1lc3NhZ2UgPT0gU0FWRV9QT0lOVEVSUyB8fCBjdXJTQy0+U0NwLk1lc3NhZ2UgPT0gRElTQ09OTkVDVCkgeworCQkJb3V0YihTRVRfQVROLCBwb3J0X2Jhc2UgKyBDTURfUkVHKTsJLyogUmVqZWN0IG1lc3NhZ2UgKi8KKwkJCURFQihwcmludGsoIkRpc2NhcmRpbmcgU0FWRV9QT0lOVEVSUyBtZXNzYWdlXG4iKSk7CisJCX0KKwkJb3V0YihNU0dfQUNDRVBULCBwb3J0X2Jhc2UgKyBDTURfUkVHKTsKKwkJYnJlYWs7CisJfQorb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKK2lkbGVfb3V0OgorCWN1clNDLT5TQ3AucGhhc2UgPSBpZGxlOworCWN1clNDLT5zY3NpX2RvbmUoY3VyU0MpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZAorU1lNNTNDNTAwX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKwlzdHJ1Y3Qgc2NzaV9pbmZvX3QgKmluZm8gPSBsaW5rLT5wcml2OworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gaW5mby0+aG9zdDsKKworCURFQlVHKDAsICJTWU01M0M1MDBfcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CisKKwkvKgorCSogIERvIHRoaXMgYmVmb3JlIHJlbGVhc2luZy9mcmVlaW5nIHJlc291cmNlcy4KKwkqLworCXNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpOworCisJLyoKKwkqICBJbnRlcnJ1cHRzIGdldHRpbmcgaG9zZWQgb24gY2FyZCByZW1vdmFsLiAgVHJ5CisJKiAgdGhlIGZvbGxvd2luZyBjb2RlLCBtb3N0bHkgZnJvbSBxbG9naWNmYXMuYy4KKwkqLworCWlmIChzaG9zdC0+aXJxKQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBzaG9zdCk7CisJaWYgKHNob3N0LT5kbWFfY2hhbm5lbCAhPSAweGZmKQorCQlmcmVlX2RtYShzaG9zdC0+ZG1hX2NoYW5uZWwpOworCWlmIChzaG9zdC0+aW9fcG9ydCAmJiBzaG9zdC0+bl9pb19wb3J0KQorCQlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgc2hvc3QtPm5faW9fcG9ydCk7CisKKwlsaW5rLT5kZXYgPSBOVUxMOworCisJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCXBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwlwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKworCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworCisJc2NzaV9ob3N0X3B1dChzaG9zdCk7Cit9IC8qIFNZTTUzQzUwMF9yZWxlYXNlICovCisKK3N0YXRpYyBjb25zdCBjaGFyKgorU1lNNTNDNTAwX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqU0Nob3N0KQoreworCXN0YXRpYyBjaGFyIGluZm9fbXNnWzI1Nl07CisJc3RydWN0IHN5bTUzYzUwMF9kYXRhICpkYXRhID0KKwkgICAgKHN0cnVjdCBzeW01M2M1MDBfZGF0YSAqKVNDaG9zdC0+aG9zdGRhdGE7CisKKwlERUIocHJpbnRrKCJTWU01M0M1MDBfaW5mbyBjYWxsZWRcbiIpKTsKKwkodm9pZClzbnByaW50ZihpbmZvX21zZywgc2l6ZW9mKGluZm9fbXNnKSwKKwkgICAgIlNZTTUzQzUwMCBhdCAweCVseCwgSVJRICVkLCAlcyBQSU8gbW9kZS4iLCAKKwkgICAgU0Nob3N0LT5pb19wb3J0LCBTQ2hvc3QtPmlycSwgZGF0YS0+ZmFzdF9waW8gPyAiZmFzdCIgOiAic2xvdyIpOworCXJldHVybiAoaW5mb19tc2cpOworfQorCitzdGF0aWMgaW50IAorU1lNNTNDNTAwX3F1ZXVlKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlpbnQgaTsKKwlpbnQgcG9ydF9iYXNlID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKKwlzdHJ1Y3Qgc3ltNTNjNTAwX2RhdGEgKmRhdGEgPQorCSAgICAoc3RydWN0IHN5bTUzYzUwMF9kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlWREVCKHByaW50aygiU1lNNTNDNTAwX3F1ZXVlIGNhbGxlZFxuIikpOworCisJREVCKHByaW50aygiY21kPSUwMngsIGNtZF9sZW49JTAyeCwgdGFyZ2V0PSUwMngsIGx1bj0lMDJ4LCBidWZmbGVuPSVkXG4iLCAKKwkgICAgU0NwbnQtPmNtbmRbMF0sIFNDcG50LT5jbWRfbGVuLCBTQ3BudC0+ZGV2aWNlLT5pZCwgCisJICAgIFNDcG50LT5kZXZpY2UtPmx1biwgIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4pKTsKKworCVZERUIoZm9yIChpID0gMDsgaSA8IFNDcG50LT5jbWRfbGVuOyBpKyspCisJICAgIHByaW50aygiY21kWyVkXT0lMDJ4ICAiLCBpLCBTQ3BudC0+Y21uZFtpXSkpOworCVZERUIocHJpbnRrKCJcbiIpKTsKKworCWRhdGEtPmN1cnJlbnRfU0MgPSBTQ3BudDsKKwlkYXRhLT5jdXJyZW50X1NDLT5zY3NpX2RvbmUgPSBkb25lOworCWRhdGEtPmN1cnJlbnRfU0MtPlNDcC5waGFzZSA9IGNvbW1hbmRfcGg7CisJZGF0YS0+Y3VycmVudF9TQy0+U0NwLlN0YXR1cyA9IDA7CisJZGF0YS0+Y3VycmVudF9TQy0+U0NwLk1lc3NhZ2UgPSAwOworCisJLyogV2UgYXJlIGxvY2tlZCBoZXJlIGFscmVhZHkgYnkgdGhlIG1pZCBsYXllciAqLworCVJFRzAocG9ydF9iYXNlKTsKKwlvdXRiKFNDcG50LT5kZXZpY2UtPmlkLCBwb3J0X2Jhc2UgKyBERVNUX0lEKTsJLyogc2V0IGRlc3RpbmF0aW9uICovCisJb3V0YihGTFVTSF9GSUZPLCBwb3J0X2Jhc2UgKyBDTURfUkVHKTsJLyogcmVzZXQgdGhlIGZpZm9zICovCisKKwlmb3IgKGkgPSAwOyBpIDwgU0NwbnQtPmNtZF9sZW47IGkrKykgeworCQlvdXRiKFNDcG50LT5jbW5kW2ldLCBwb3J0X2Jhc2UgKyBTQ1NJX0ZJRk8pOworCX0KKwlvdXRiKFNFTEVDVF9OT19BVE4sIHBvcnRfYmFzZSArIENNRF9SRUcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgCitTWU01M0M1MDBfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKwlpbnQgcG9ydF9iYXNlID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKKworCURFQihwcmludGsoIlNZTTUzQzUwMF9ob3N0X3Jlc2V0IGNhbGxlZFxuIikpOworCVNZTTUzQzUwMF9pbnRfaG9zdF9yZXNldChwb3J0X2Jhc2UpOworCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgCitTWU01M0M1MDBfYmlvc3Bhcm0oc3RydWN0IHNjc2lfZGV2aWNlICpkaXNrLAorICAgIHN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwKKyAgICBzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICppbmZvX2FycmF5KQoreworCWludCBzaXplOworCisJREVCKHByaW50aygiU1lNNTNDNTAwX2Jpb3NwYXJtIGNhbGxlZFxuIikpOworCisJc2l6ZSA9IGNhcGFjaXR5OworCWluZm9fYXJyYXlbMF0gPSA2NDsJCS8qIGhlYWRzICovCisJaW5mb19hcnJheVsxXSA9IDMyOwkJLyogc2VjdG9ycyAqLworCWluZm9fYXJyYXlbMl0gPSBzaXplID4+IDExOwkvKiBjeWxpbmRlcnMgKi8KKwlpZiAoaW5mb19hcnJheVsyXSA+IDEwMjQpIHsJLyogYmlnIGRpc2sgKi8KKwkJaW5mb19hcnJheVswXSA9IDI1NTsKKwkJaW5mb19hcnJheVsxXSA9IDYzOworCQlpbmZvX2FycmF5WzJdID0gc2l6ZSAvICgyNTUgKiA2Myk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAorU1lNNTNDNTAwX3Nob3dfcGlvKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpTSHAgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3Qgc3ltNTNjNTAwX2RhdGEgKmRhdGEgPQorCSAgICAoc3RydWN0IHN5bTUzYzUwMF9kYXRhICopU0hwLT5ob3N0ZGF0YTsKKworCXJldHVybiBzbnByaW50ZihidWYsIDQsICIlZFxuIiwgZGF0YS0+ZmFzdF9waW8pOworfQorCitzdGF0aWMgc3NpemVfdAorU1lNNTNDNTAwX3N0b3JlX3BpbyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgcGlvOworCXN0cnVjdCBTY3NpX0hvc3QgKlNIcCA9IGNsYXNzX3RvX3Nob3N0KGNkZXYpOworCXN0cnVjdCBzeW01M2M1MDBfZGF0YSAqZGF0YSA9CisJICAgIChzdHJ1Y3Qgc3ltNTNjNTAwX2RhdGEgKilTSHAtPmhvc3RkYXRhOworCisJcGlvID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKKwlpZiAocGlvID09IDAgfHwgcGlvID09IDEpIHsKKwkJZGF0YS0+ZmFzdF9waW8gPSBwaW87CisJCXJldHVybiBjb3VudDsKKwl9CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyogIFNDU0kgSEJBIGRldmljZSBhdHRyaWJ1dGVzIHdlIHdhbnQgdG8KKyogIG1ha2UgYXZhaWxhYmxlIHZpYSBzeXNmcy4KKyovCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgU1lNNTNDNTAwX3Bpb19hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9ICJmYXN0X3BpbyIsCisJCS5tb2RlID0gKFNfSVJVR08gfCBTX0lXVVNSKSwKKwl9LAorCS5zaG93ID0gU1lNNTNDNTAwX3Nob3dfcGlvLAorCS5zdG9yZSA9IFNZTTUzQzUwMF9zdG9yZV9waW8sCit9OworCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKlNZTTUzQzUwMF9zaG9zdF9hdHRyc1tdID0geworCSZTWU01M0M1MDBfcGlvX2F0dHIsCisJTlVMTCwKK307CisKKy8qCisqICBzY3NpX2hvc3RfdGVtcGxhdGUgaW5pdGlhbGl6ZXIKKyovCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBzeW01M2M1MDBfZHJpdmVyX3RlbXBsYXRlID0geworICAgICAubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKyAgICAgLm5hbWUJCQk9ICJTWU01M0M1MDAiLAorICAgICAuaW5mbwkJCT0gU1lNNTNDNTAwX2luZm8sCisgICAgIC5xdWV1ZWNvbW1hbmQJCT0gU1lNNTNDNTAwX3F1ZXVlLAorICAgICAuZWhfaG9zdF9yZXNldF9oYW5kbGVyCT0gU1lNNTNDNTAwX2hvc3RfcmVzZXQsCisgICAgIC5iaW9zX3BhcmFtCQk9IFNZTTUzQzUwMF9iaW9zcGFybSwKKyAgICAgLnByb2NfbmFtZQkJCT0gIlNZTTUzQzUwMCIsCisgICAgIC5jYW5fcXVldWUJCQk9IDEsCisgICAgIC50aGlzX2lkCQkJPSA3LAorICAgICAuc2dfdGFibGVzaXplCQk9IDMyLAorICAgICAuY21kX3Blcl9sdW4JCT0gMSwKKyAgICAgLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAorICAgICAuc2hvc3RfYXR0cnMJCT0gU1lNNTNDNTAwX3Nob3N0X2F0dHJzCit9OworCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKK2RvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkCitTWU01M0M1MDBfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisJY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKwlzdHJ1Y3Qgc2NzaV9pbmZvX3QgKmluZm8gPSBsaW5rLT5wcml2OworCXR1cGxlX3QgdHVwbGU7CisJY2lzcGFyc2VfdCBwYXJzZTsKKwlpbnQgaSwgbGFzdF9yZXQsIGxhc3RfZm47CisJaW50IGlycV9sZXZlbCwgcG9ydF9iYXNlOworCXVuc2lnbmVkIHNob3J0IHR1cGxlX2RhdGFbMzJdOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCA9ICZzeW01M2M1MDBfZHJpdmVyX3RlbXBsYXRlOworCXN0cnVjdCBzeW01M2M1MDBfZGF0YSAqZGF0YTsKKworCURFQlVHKDAsICJTWU01M0M1MDBfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKworCXR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKil0dXBsZV9kYXRhOworCXR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OworCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisJbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisKKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOworCWlmICgocGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykgJiYKKwkgICAgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykpCisJCWluZm8tPm1hbmZfaWQgPSBsZTE2X3RvX2NwdSh0dXBsZS5UdXBsZURhdGFbMF0pOworCisJLyogQ29uZmlndXJlIGNhcmQgKi8KKwlsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCXdoaWxlICgxKSB7CisJCWlmIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpICE9IDAgfHwKKwkJICAgIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSAhPSAwKQorCQkJZ290byBuZXh0X2VudHJ5OworCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pbmRleDsKKwkJbGluay0+aW8uQmFzZVBvcnQxID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pby53aW5bMF0uYmFzZTsKKwkJbGluay0+aW8uTnVtUG9ydHMxID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pby53aW5bMF0ubGVuOworCisJCWlmIChsaW5rLT5pby5CYXNlUG9ydDEgIT0gMCkgeworCQkJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGhhbmRsZSwgJmxpbmstPmlvKTsKKwkJCWlmIChpID09IENTX1NVQ0NFU1MpCisJCQkJYnJlYWs7CisJCX0KK25leHRfZW50cnk6CisJCUNTX0NIRUNLKEdldE5leHRUdXBsZSwgcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJfQorCisJQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGhhbmRsZSwgJmxpbmstPmlycSkpOworCUNTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKworCS8qCisJKiAgVGhhdCdzIHRoZSB0cm91YmxlIHdpdGggY29weWluZyBsaWJlcmFsbHkgZnJvbSBhbm90aGVyIGRyaXZlci4KKwkqICBTb21lIHRoaW5ncyBwcm9iYWJseSBhcmVuJ3QgcmVsZXZhbnQsIGFuZCBJIHN1c3BlY3QgdGhpcyBlbnRpcmUKKwkqICBzZWN0aW9uIGRlYWxpbmcgd2l0aCBtYW51ZmFjdHVyZXIgSURzIGNhbiBiZSBzY3JhcHBlZC4JLS1yY3QKKwkqLworCWlmICgoaW5mby0+bWFuZl9pZCA9PSBNQU5GSURfTUFDTklDQSkgfHwKKwkgICAgKGluZm8tPm1hbmZfaWQgPT0gTUFORklEX1BJT05FRVIpIHx8CisJICAgIChpbmZvLT5tYW5mX2lkID09IDB4MDA5OCkpIHsKKwkJLyogc2V0IEFUQWNtZCAqLworCQlvdXRiKDB4YjQsIGxpbmstPmlvLkJhc2VQb3J0MSArIDB4ZCk7CisJCW91dGIoMHgyNCwgbGluay0+aW8uQmFzZVBvcnQxICsgMHg5KTsKKwkJb3V0YigweDA0LCBsaW5rLT5pby5CYXNlUG9ydDEgKyAweGQpOworCX0KKworCS8qCisJKiAgaXJxX2xldmVsID09IDAgaW1wbGllcyB0cG50LT5jYW5fcXVldWUgPT0gMCwgd2hpY2gKKwkqICBpcyBub3Qgc3VwcG9ydGVkIGluIDIuNi4gIFRodXMsIG9ubHkgaXJxX2xldmVsID4gMAorCSogIHdpbGwgYmUgYWxsb3dlZC4KKwkqCisJKiAgUG9zc2libGUgcG9ydF9iYXNlIHZhbHVlcyBhcmUgYXMgZm9sbG93czoKKwkqCisJKgkweDEzMCwgMHgyMzAsIDB4MjgwLCAweDI5MCwKKwkqCTB4MzIwLCAweDMzMCwgMHgzNDAsIDB4MzUwCisJKi8KKwlwb3J0X2Jhc2UgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisJaXJxX2xldmVsID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworCisJREVCKHByaW50aygiU1lNNTNDNTAwOiBwb3J0X2Jhc2U9MHgleCwgaXJxPSVkLCBmYXN0X3Bpbz0lZFxuIiwKKwkgICAgcG9ydF9iYXNlLCBpcnFfbGV2ZWwsIFVTRV9GQVNUX1BJTyk7KQorCisJY2hpcF9pbml0KHBvcnRfYmFzZSk7CisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKHRwbnQsIHNpemVvZihzdHJ1Y3Qgc3ltNTNjNTAwX2RhdGEpKTsKKwlpZiAoIWhvc3QpIHsKKwkJcHJpbnRrKCJTWU01M0M1MDA6IFVuYWJsZSB0byByZWdpc3RlciBob3N0LCBnaXZpbmcgdXAuXG4iKTsKKwkJZ290byBlcnJfcmVsZWFzZTsKKwl9CisKKwlkYXRhID0gKHN0cnVjdCBzeW01M2M1MDBfZGF0YSAqKWhvc3QtPmhvc3RkYXRhOworCisJaWYgKGlycV9sZXZlbCA+IDApIHsKKwkJaWYgKHJlcXVlc3RfaXJxKGlycV9sZXZlbCwgU1lNNTNDNTAwX2ludHIsIFNBX1NISVJRLCAiU1lNNTNDNTAwIiwgaG9zdCkpIHsKKwkJCXByaW50aygiU1lNNTNDNTAwOiB1bmFibGUgdG8gYWxsb2NhdGUgSVJRICVkXG4iLCBpcnFfbGV2ZWwpOworCQkJZ290byBlcnJfZnJlZV9zY3NpOworCQl9CisJCURFQihwcmludGsoIlNZTTUzQzUwMDogYWxsb2NhdGVkIElSUSAlZFxuIiwgaXJxX2xldmVsKSk7CisJfSBlbHNlIGlmIChpcnFfbGV2ZWwgPT0gMCkgeworCQlERUIocHJpbnRrKCJTWU01M0M1MDA6IE5vIGludGVycnVwdHMgZGV0ZWN0ZWRcbiIpKTsKKwkJZ290byBlcnJfZnJlZV9zY3NpOworCX0gZWxzZSB7CisJCURFQihwcmludGsoIlNZTTUzQzUwMDogU2hvdWxkbid0IGdldCBoZXJlIVxuIikpOworCQlnb3RvIGVycl9mcmVlX3Njc2k7CisJfQorCisJaG9zdC0+dW5pcXVlX2lkID0gcG9ydF9iYXNlOworCWhvc3QtPmlycSA9IGlycV9sZXZlbDsKKwlob3N0LT5pb19wb3J0ID0gcG9ydF9iYXNlOworCWhvc3QtPm5faW9fcG9ydCA9IDB4MTA7CisJaG9zdC0+ZG1hX2NoYW5uZWwgPSAtMTsKKworCS8qCisJKiAgTm90ZSBmYXN0X3BpbyBpcyBzZXQgdG8gVVNFX0ZBU1RfUElPIGJ5CisJKiAgZGVmYXVsdCwgYnV0IGNhbiBiZSBjaGFuZ2VkIHZpYSAic3lzZnMiLgorCSovCisJZGF0YS0+ZmFzdF9waW8gPSBVU0VfRkFTVF9QSU87CisKKwlzcHJpbnRmKGluZm8tPm5vZGUuZGV2X25hbWUsICJzY3NpJWQiLCBob3N0LT5ob3N0X25vKTsKKwlsaW5rLT5kZXYgPSAmaW5mby0+bm9kZTsKKwlpbmZvLT5ob3N0ID0gaG9zdDsKKworCWlmIChzY3NpX2FkZF9ob3N0KGhvc3QsIE5VTEwpKQorCQlnb3RvIGVycl9mcmVlX2lycTsKKworCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCisJZ290byBvdXQ7CS8qIFNVQ0NFU1MgKi8KKworZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGlycV9sZXZlbCwgaG9zdCk7CitlcnJfZnJlZV9zY3NpOgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7CitlcnJfcmVsZWFzZToKKwlyZWxlYXNlX3JlZ2lvbihwb3J0X2Jhc2UsIDB4MTApOworCXByaW50ayhLRVJOX0lORk8gInN5bTUzYzUwMF9jczogbm8gU0NTSSBkZXZpY2VzIGZvdW5kXG4iKTsKKworb3V0OgorCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisJcmV0dXJuOworCitjc19mYWlsZWQ6CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CisJU1lNNTNDNTAwX3JlbGVhc2UobGluayk7CisJcmV0dXJuOworfSAvKiBTWU01M0M1MDBfY29uZmlnICovCisKK3N0YXRpYyBpbnQKK1NZTTUzQzUwMF9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKwlkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisJc3RydWN0IHNjc2lfaW5mb190ICppbmZvID0gbGluay0+cHJpdjsKKworCURFQlVHKDEsICJTWU01M0M1MDBfZXZlbnQoMHglMDZ4KVxuIiwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJCQlTWU01M0M1MDBfcmVsZWFzZShsaW5rKTsKKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwkJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJCVNZTTUzQzUwMF9jb25maWcobGluayk7CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwkJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworCWNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJCQlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKwkJCS8qIFNlZSBlYXJsaWVyIGNvbW1lbnQgYWJvdXQgbWFudWZhY3R1cmVyIElEcy4gKi8KKwkJCWlmICgoaW5mby0+bWFuZl9pZCA9PSBNQU5GSURfTUFDTklDQSkgfHwKKwkJCSAgICAoaW5mby0+bWFuZl9pZCA9PSBNQU5GSURfUElPTkVFUikgfHwKKwkJCSAgICAoaW5mby0+bWFuZl9pZCA9PSAweDAwOTgpKSB7CisJCQkJb3V0YigweDgwLCBsaW5rLT5pby5CYXNlUG9ydDEgKyAweGQpOworCQkJCW91dGIoMHgyNCwgbGluay0+aW8uQmFzZVBvcnQxICsgMHg5KTsKKwkJCQlvdXRiKDB4MDQsIGxpbmstPmlvLkJhc2VQb3J0MSArIDB4ZCk7CisJCQl9CisJCQkvKgorCQkJKiAgSWYgdGhpbmdzIGRvbid0IHdvcmsgYWZ0ZXIgYSAicmVzdW1lIiwKKwkJCSogIHRoaXMgaXMgYSBnb29kIHBsYWNlIHRvIHN0YXJ0IGxvb2tpbmcuCisJCQkqLworCQkJU1lNNTNDNTAwX2ludF9ob3N0X3Jlc2V0KGxpbmstPmlvLkJhc2VQb3J0MSk7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfSAvKiBTWU01M0M1MDBfZXZlbnQgKi8KKworc3RhdGljIHZvaWQKK1NZTTUzQzUwMF9kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKwlkZXZfbGlua190ICoqbGlua3A7CisKKwlERUJVRygwLCAiU1lNNTNDNTAwX2RldGFjaCgweCVwKVxuIiwgbGluayk7CisKKwkvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworCWZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJCWlmICgqbGlua3AgPT0gbGluaykKKwkJCWJyZWFrOworCWlmICgqbGlua3AgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkJU1lNNTNDNTAwX3JlbGVhc2UobGluayk7CisKKwlpZiAobGluay0+aGFuZGxlKQorCQlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKworCS8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIGJpdHMuICovCisJKmxpbmtwID0gbGluay0+bmV4dDsKKwlrZnJlZShsaW5rLT5wcml2KTsKKwlsaW5rLT5wcml2ID0gTlVMTDsKK30gLyogU1lNNTNDNTAwX2RldGFjaCAqLworCitzdGF0aWMgZGV2X2xpbmtfdCAqCitTWU01M0M1MDBfYXR0YWNoKHZvaWQpCit7CisJc3RydWN0IHNjc2lfaW5mb190ICppbmZvOworCWNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworCWRldl9saW5rX3QgKmxpbms7CisJaW50IHJldDsKKworCURFQlVHKDAsICJTWU01M0M1MDBfYXR0YWNoKClcbiIpOworCisJLyogQ3JlYXRlIG5ldyBTQ1NJIGRldmljZSAqLworCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCWxpbmsgPSAmaW5mby0+bGluazsKKwlsaW5rLT5wcml2ID0gaW5mbzsKKwlsaW5rLT5pby5OdW1Qb3J0czEgPSAxNjsKKwlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCWxpbmstPmlvLklPQWRkckxpbmVzID0gMTA7CisJbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkU7CisJbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworCWxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKKwlsaW5rLT5jb25mLlZjYyA9IDUwOworCWxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworCWxpbmstPmNvbmYuUHJlc2VudCA9IFBSRVNFTlRfT1BUSU9OOworCisJLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisJbGluay0+bmV4dCA9IGRldl9saXN0OworCWRldl9saXN0ID0gbGluazsKKwljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZTWU01M0M1MDBfZXZlbnQ7CisJY2xpZW50X3JlZy5FdmVudE1hc2sgPSBDU19FVkVOVF9SRVNFVF9SRVFVRVNUIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwkgICAgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKwljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKwlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwkJU1lNNTNDNTAwX2RldGFjaChsaW5rKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGxpbms7Cit9IC8qIFNZTTUzQzUwMF9hdHRhY2ggKi8KKworTU9EVUxFX0FVVEhPUigiQm9iIFRyYWN5IDxyY3RAZnJ1cy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNZTTUzQzUwMCBQQ01DSUEgU0NTSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHN5bTUzYzUwMF9jc19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJzeW01M2M1MDBfY3MiLAorCX0sCisJLmF0dGFjaAkJPSBTWU01M0M1MDBfYXR0YWNoLAorCS5kZXRhY2gJCT0gU1lNNTNDNTAwX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0Citpbml0X3N5bTUzYzUwMF9jcyh2b2lkKQoreworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZzeW01M2M1MDBfY3NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitleGl0X3N5bTUzYzUwMF9jcyh2b2lkKQoreworCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmc3ltNTNjNTAwX2NzX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfc3ltNTNjNTAwX2NzKTsKK21vZHVsZV9leGl0KGV4aXRfc3ltNTNjNTAwX2NzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbHV0by5jIGIvZHJpdmVycy9zY3NpL3BsdXRvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JiMGEyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wbHV0by5jCkBAIC0wLDAgKzEsMzY0IEBACisvKiBwbHV0by5jOiBTcGFyY1NUT1JBR0UgQXJyYXkgU0NTSSBob3N0IGFkYXB0ZXIgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTkgSmFrdWIgSmVsaW5layAoampAc3Vuc2l0ZS5tZmYuY3VuaS5jeikKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaWZkZWYgQ09ORklHX0tNT0QKKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgIi4uL2ZjNC9mY3BfaW1wbC5oIgorI2luY2x1ZGUgInBsdXRvLmgiCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworLyogI2RlZmluZSBQTFVUT19ERUJVRyAqLworCisjZGVmaW5lIHBsdXRvX3ByaW50ayBwcmludGsgKCJQTFVUTyAlczogIiwgZmMtPm5hbWUpOyBwcmludGsKKworI2lmZGVmIFBMVVRPX0RFQlVHCisjZGVmaW5lIFBMRCh4KSAgcGx1dG9fcHJpbnRrIHg7CisjZGVmaW5lIFBMTkQoeCkgcHJpbnRrICgiUExVVE86ICIpOyBwcmludGsgeDsKKyNlbHNlCisjZGVmaW5lIFBMRCh4KQorI2RlZmluZSBQTE5EKHgpCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBjdHJsX2lucXVpcnkgeworCXN0cnVjdCBTY3NpX0hvc3QgaG9zdDsKKwlzdHJ1Y3QgcGx1dG8gcGx1dG87CisJU2NzaV9DbW5kIGNtZDsKKwljaGFyIGlucXVpcnlbMjU2XTsKKwlmY19jaGFubmVsICpmYzsKK30gKmZjcyBfX2luaXRkYXRhID0geyAwIH07CitzdGF0aWMgaW50IGZjc2NvdW50IF9faW5pdGRhdGEgPSAwOworc3RhdGljIGF0b21pY190IGZjc3MgX19pbml0ZGF0YSA9IEFUT01JQ19JTklUKDApOworREVDTEFSRV9NVVRFWF9MT0NLRUQoZmNfc2VtKTsKKworc3RhdGljIGludCBwbHV0b19lbmNvZGVfYWRkcihTY3NpX0NtbmQgKlNDcG50LCB1MTYgKmFkZHIsIGZjX2NoYW5uZWwgKmZjLCBmY3BfY21uZCAqZmNtZCk7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwbHV0b19kZXRlY3RfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUExORCgoIlRpbWVvdXRcbiIpKQorCXVwKCZmY19zZW0pOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcGx1dG9fZGV0ZWN0X2RvbmUoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwkvKiBEbyBub3RoaW5nICovCit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwbHV0b19kZXRlY3Rfc2NzaV9kb25lKFNjc2lfQ21uZCAqU0NwbnQpCit7CisJU0NwbnQtPnJlcXVlc3QtPnJxX3N0YXR1cyA9IFJRX1NDU0lfRE9ORTsKKwlQTE5EKCgiRGV0ZWN0IGRvbmUgJTA4bHhcbiIsIChsb25nKVNDcG50KSkKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCAoJmZjc3MpKQorCQl1cCgmZmNfc2VtKTsKK30KKworaW50IHBsdXRvX3NsYXZlX2NvbmZpZ3VyZShTY3NpX0RldmljZSAqZGV2aWNlKQoreworCWludCBkZXB0aF90b191c2U7CisKKwlpZiAoZGV2aWNlLT50YWdnZWRfc3VwcG9ydGVkKQorCQlkZXB0aF90b191c2UgPSAvKiAyNTQgKi8gODsKKwllbHNlCisJCWRlcHRoX3RvX3VzZSA9IDI7CisKKwlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXZpY2UsCisJCQkJKGRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCA/CisJCQkJIE1TR19TSU1QTEVfVEFHIDogMCksCisJCQkJZGVwdGhfdG9fdXNlKTsKKworCXJldHVybiAwOworfQorCisvKiBEZXRlY3QgYWxsIFNTQXMgYXR0YWNoZWQgdG8gdGhlIG1hY2hpbmUuCisgICBUbyBiZSBmYXN0LCBkbyBpdCBvbiBhbGwgb25saW5lIEZDIGNoYW5uZWxzIGF0IHRoZSBzYW1lIHRpbWUuICovCitpbnQgX19pbml0IHBsdXRvX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQpCit7CisJaW50IGksIHJldHJ5LCBucGx1dG9zOworCWZjX2NoYW5uZWwgKmZjOworCVNjc2lfRGV2aWNlIGRldjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBmY190aW1lciA9CisJCVRJTUVSX0lOSVRJQUxJWkVSKHBsdXRvX2RldGVjdF90aW1lb3V0LCAwLCAwKTsKKworCXRwbnQtPnByb2NfbmFtZSA9ICJwbHV0byI7CisJZmNzY291bnQgPSAwOworCWZvcl9lYWNoX29ubGluZV9mY19jaGFubmVsKGZjKSB7CisJCWlmICghZmMtPnBvc21hcCkKKwkJCWZjc2NvdW50Kys7CisJfQorCVBMTkQoKCIlZCBjaGFubmVscyBvbmxpbmVcbiIsIGZjc2NvdW50KSkKKwlpZiAoIWZjc2NvdW50KSB7CisjaWYgZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0ZDNF9TT0NfTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19LTU9EKQorCQlyZXF1ZXN0X21vZHVsZSgic29jIik7CisJCQorCQlmb3JfZWFjaF9vbmxpbmVfZmNfY2hhbm5lbChmYykgeworCQkJaWYgKCFmYy0+cG9zbWFwKQorCQkJCWZjc2NvdW50Kys7CisJCX0KKwkJaWYgKCFmY3Njb3VudCkKKyNlbmRpZgorCQkJcmV0dXJuIDA7CisJfQorCWZjcyA9IChzdHJ1Y3QgY3RybF9pbnF1aXJ5ICopIGttYWxsb2MgKHNpemVvZiAoc3RydWN0IGN0cmxfaW5xdWlyeSkgKiBmY3Njb3VudCwgR0ZQX0RNQSk7CisJaWYgKCFmY3MpIHsKKwkJcHJpbnRrICgiUExVVE86IE5vdCBlbm91Z2ggbWVtb3J5IHRvIHByb2JlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCW1lbXNldCAoZmNzLCAwLCBzaXplb2YgKHN0cnVjdCBjdHJsX2lucXVpcnkpICogZmNzY291bnQpOworCW1lbXNldCAoJmRldiwgMCwgc2l6ZW9mKGRldikpOworCWF0b21pY19zZXQgKCZmY3NzLCBmY3Njb3VudCk7CisJCisJaSA9IDA7CisJZm9yX2VhY2hfb25saW5lX2ZjX2NoYW5uZWwoZmMpIHsKKwkJU2NzaV9DbW5kICpTQ3BudDsKKwkJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwkJc3RydWN0IHBsdXRvICpwbHV0bzsKKworCQlpZiAoaSA9PSBmY3Njb3VudCkgYnJlYWs7CisJCWlmIChmYy0+cG9zbWFwKSBjb250aW51ZTsKKwkJCisJCVBMRCgoInRyeWluZyB0byBmaW5kIFNTQVxuIikpCisKKwkJLyogSWYgdGhpcyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgdG8gc29tZSBvdGhlciBTQ1NJIGhvc3QsIHRoZW4gaXQgY2Fubm90IGJlIHBsdXRvICovCisJCWlmIChmYy0+c2NzaV9uYW1lWzBdKSBjb250aW51ZTsKKwkJbWVtY3B5IChmYy0+c2NzaV9uYW1lLCAiU1NBIiwgNCk7CisJCQorCQlmY3NbaV0uZmMgPSBmYzsKKwkJCisJCWZjLT5jYW5fcXVldWUgPSBQTFVUT19DQU5fUVVFVUU7CisJCWZjLT5yc3Bfc2l6ZSA9IDY0OworCQlmYy0+ZW5jb2RlX2FkZHIgPSBwbHV0b19lbmNvZGVfYWRkcjsKKwkJCisJCWZjLT5mY3BfcmVnaXN0ZXIoZmMsIFRZUEVfU0NTSV9GQ1AsIDApOworCQorCQlTQ3BudCA9ICYoZmNzW2ldLmNtZCk7CisJCWhvc3QgPSAmKGZjc1tpXS5ob3N0KTsKKwkJcGx1dG8gPSAoc3RydWN0IHBsdXRvICopaG9zdC0+aG9zdGRhdGE7CisJCQorCQlwbHV0by0+ZmMgPSBmYzsKKwkKKwkJU0NwbnQtPmNtbmRbMF0gPSBJTlFVSVJZOworCQlTQ3BudC0+Y21uZFs0XSA9IDI1NTsKKwkJCisJCS8qIEZDIGxheWVyIHJlcXVpcmVzIHRoaXMsIHNvIHRoYXQgU0NwbnQtPmRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCBpcyBpbml0aWFsbHkgMCAqLworCQlTQ3BudC0+ZGV2aWNlID0gJmRldjsKKwkJZGV2Lmhvc3QgPSBob3N0OworCQkKKwkJU0NwbnQtPmNtZF9sZW4gPSBDT01NQU5EX1NJWkUoSU5RVUlSWSk7CisJCisJCVNDcG50LT5yZXF1ZXN0LT5ycV9zdGF0dXMgPSBSUV9TQ1NJX0JVU1k7CisJCQorCQlTQ3BudC0+ZG9uZSA9IHBsdXRvX2RldGVjdF9kb25lOworCQlTQ3BudC0+YnVmZmxlbiA9IDI1NjsKKwkJU0NwbnQtPmJ1ZmZlciA9IGZjc1tpXS5pbnF1aXJ5OworCQlTQ3BudC0+cmVxdWVzdF9idWZmbGVuID0gMjU2OworCQlTQ3BudC0+cmVxdWVzdF9idWZmZXIgPSBmY3NbaV0uaW5xdWlyeTsKKwkJUExEKCgic2V0IHVwICVkICUwOGx4XG4iLCBpLCAobG9uZylTQ3BudCkpCisJCWkrKzsKKwl9CisJCisJZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgNTsgcmV0cnkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgZmNzY291bnQ7IGkrKykgeworCQkJaWYgKCFmY3NbaV0uZmMpIGJyZWFrOworCQkJaWYgKGZjc1tpXS5jbWQucmVxdWVzdC0+cnFfc3RhdHVzICE9IFJRX1NDU0lfRE9ORSkgeworCQkJCWRpc2FibGVfaXJxKGZjc1tpXS5mYy0+aXJxKTsKKwkJCQlQTE5EKCgicXVldWVjb21tYW5kICVkICVkXG4iLCByZXRyeSwgaSkpCisJCQkJZmNwX3Njc2lfcXVldWVjb21tYW5kICgmKGZjc1tpXS5jbWQpLCAKKwkJCQkJcGx1dG9fZGV0ZWN0X3Njc2lfZG9uZSk7CisJCQkJZW5hYmxlX2lycShmY3NbaV0uZmMtPmlycSk7CisJCQl9CisJCX0KKwkgICAgCisJCWZjX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMTAgKiBIWjsKKwkJYWRkX3RpbWVyKCZmY190aW1lcik7CisJCQorCQlkb3duKCZmY19zZW0pOworCQlQTE5EKCgiV29rZW4gdXBcbiIpKQorCQlpZiAoIWF0b21pY19yZWFkKCZmY3NzKSkKKwkJCWJyZWFrOyAvKiBBbGwgZmMgY2hhbm5lbHMgaGF2ZSBhbnN3ZXJlZCB1cyAqLworCX0KKwlkZWxfdGltZXJfc3luYygmZmNfdGltZXIpOworCisJUExORCgoIkZpbmlzaGVkIHNlYXJjaFxuIikpCisJZm9yIChpID0gMCwgbnBsdXRvcyA9IDA7IGkgPCBmY3Njb3VudDsgaSsrKSB7CisJCVNjc2lfQ21uZCAqU0NwbnQ7CisJCQorCQlpZiAoIShmYyA9IGZjc1tpXS5mYykpIGJyZWFrOworCQorCQlTQ3BudCA9ICYoZmNzW2ldLmNtZCk7CisJCQorCQkvKiBMZXQgRkMgbWlkLWxldmVsIGZyZWUgYWxsb2NhdGVkIHJlc291cmNlcyAqLworCQlTQ3BudC0+ZG9uZSAoU0NwbnQpOworCQkKKwkJaWYgKCFTQ3BudC0+cmVzdWx0KSB7CisJCQlzdHJ1Y3QgcGx1dG9faW5xdWlyeSAqaW5xOworCQkJc3RydWN0IHBsdXRvICpwbHV0bzsKKwkJCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJCQkKKwkJCWlucSA9IChzdHJ1Y3QgcGx1dG9faW5xdWlyeSAqKWZjc1tpXS5pbnF1aXJ5OworCisJCQlpZiAoKGlucS0+ZHR5cGUgJiAweDFmKSA9PSBUWVBFX1BST0NFU1NPUiAmJgorCQkJICAgICFzdHJuY21wIChpbnEtPnZlbmRvcl9pZCwgIlNVTiIsIDMpICYmCisJCQkgICAgIXN0cm5jbXAgKGlucS0+cHJvZHVjdF9pZCwgIlNTQSIsIDMpKSB7CisJCQkJY2hhciAqcDsKKwkJCQlsb25nICphZ2VzOworCQkJCQorCQkJCWFnZXMgPSBrbWFsbG9jICgoKGlucS0+Y2hhbm5lbHMgKyAxKSAqIGlucS0+dGFyZ2V0cykgKiBzaXplb2YobG9uZyksIEdGUF9LRVJORUwpOworCQkJCWlmICghYWdlcykgY29udGludWU7CisJCQkJCisJCQkJaG9zdCA9IHNjc2lfcmVnaXN0ZXIgKHRwbnQsIHNpemVvZiAoc3RydWN0IHBsdXRvKSk7CisJCQkJaWYoIWhvc3QpCisJCQkJeworCQkJCQlrZnJlZShhZ2VzKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCQorCQkJCWlmICghdHJ5X21vZHVsZV9nZXQoZmMtPm1vZHVsZSkpIHsKKwkJCQkJa2ZyZWUoYWdlcyk7CisJCQkJCXNjc2lfdW5yZWdpc3Rlcihob3N0KTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJbnBsdXRvcysrOworCQkJCQorCQkJCXBsdXRvID0gKHN0cnVjdCBwbHV0byAqKWhvc3QtPmhvc3RkYXRhOworCQkJCQorCQkJCWhvc3QtPm1heF9pZCA9IGlucS0+dGFyZ2V0czsKKwkJCQlob3N0LT5tYXhfY2hhbm5lbCA9IGlucS0+Y2hhbm5lbHM7CisJCQkJaG9zdC0+aXJxID0gZmMtPmlycTsKKworCQkJCWZjLT5jaGFubmVscyA9IGlucS0+Y2hhbm5lbHMgKyAxOworCQkJCWZjLT50YXJnZXRzID0gaW5xLT50YXJnZXRzOworCQkJCWZjLT5hZ2VzID0gYWdlczsKKwkJCQltZW1zZXQgKGFnZXMsIDAsICgoaW5xLT5jaGFubmVscyArIDEpICogaW5xLT50YXJnZXRzKSAqIHNpemVvZihsb25nKSk7CisJCQkJCisJCQkJcGx1dG8tPmZjID0gZmM7CisJCQkJbWVtY3B5IChwbHV0by0+cmV2X3N0ciwgaW5xLT5yZXZpc2lvbiwgNCk7CisJCQkJcGx1dG8tPnJldl9zdHJbNF0gPSAwOworCQkJCXAgPSBzdHJjaHIgKHBsdXRvLT5yZXZfc3RyLCAnICcpOworCQkJCWlmIChwKSAqcCA9IDA7CisJCQkJbWVtY3B5IChwbHV0by0+ZndfcmV2X3N0ciwgaW5xLT5md19yZXZpc2lvbiwgNCk7CisJCQkJcGx1dG8tPmZ3X3Jldl9zdHJbNF0gPSAwOworCQkJCXAgPSBzdHJjaHIgKHBsdXRvLT5md19yZXZfc3RyLCAnICcpOworCQkJCWlmIChwKSAqcCA9IDA7CisJCQkJbWVtY3B5IChwbHV0by0+c2VyaWFsX3N0ciwgaW5xLT5zZXJpYWwsIDEyKTsKKwkJCQlwbHV0by0+c2VyaWFsX3N0clsxMl0gPSAwOworCQkJCXAgPSBzdHJjaHIgKHBsdXRvLT5zZXJpYWxfc3RyLCAnICcpOworCQkJCWlmIChwKSAqcCA9IDA7CisJCQkJCisJCQkJUExEKCgiRm91bmQgU1NBIHJldiAlcyBmdyByZXYgJXMgc2VyaWFsICVzICVkeCVkXG4iLCBwbHV0by0+cmV2X3N0ciwgcGx1dG8tPmZ3X3Jldl9zdHIsIHBsdXRvLT5zZXJpYWxfc3RyLCBob3N0LT5tYXhfY2hhbm5lbCwgaG9zdC0+bWF4X2lkKSkKKwkJCX0gZWxzZQorCQkJCWZjLT5mY3BfcmVnaXN0ZXIoZmMsIFRZUEVfU0NTSV9GQ1AsIDEpOworCQl9IGVsc2UKKwkJCWZjLT5mY3BfcmVnaXN0ZXIoZmMsIFRZUEVfU0NTSV9GQ1AsIDEpOworCX0KKwlrZnJlZSgoY2hhciAqKWZjcyk7CisJaWYgKG5wbHV0b3MpCisJCXByaW50ayAoIlBMVVRPOiBUb3RhbCBvZiAlZCBTcGFyY1NUT1JBR0UgQXJyYXlzIGZvdW5kXG4iLCBucGx1dG9zKTsKKwlyZXR1cm4gbnBsdXRvczsKK30KKworaW50IHBsdXRvX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvID0gKHN0cnVjdCBwbHV0byAqKWhvc3QtPmhvc3RkYXRhOworCWZjX2NoYW5uZWwgKmZjID0gcGx1dG8tPmZjOworCisJbW9kdWxlX3B1dChmYy0+bW9kdWxlKTsKKwkKKwlmYy0+ZmNwX3JlZ2lzdGVyKGZjLCBUWVBFX1NDU0lfRkNQLCAxKTsKKwlQTE5EKCgiIHJlbGVhc2luZyBwbHV0by5cbiIpKTsKKwlrZnJlZSAoZmMtPmFnZXMpOworCVBMTkQoKCJyZWxlYXNlZCBwbHV0byFcbiIpKTsKKwlyZXR1cm4gMDsKK30KKworY29uc3QgY2hhciAqcGx1dG9faW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0YXRpYyBjaGFyIGJ1ZlsxMjhdLCAqcDsKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvID0gKHN0cnVjdCBwbHV0byAqKSBob3N0LT5ob3N0ZGF0YTsKKworCXNwcmludGYoYnVmLCAiU1VOIFNwYXJjU1RPUkFHRSBBcnJheSAlcyBmdyAlcyBzZXJpYWwgJXMgJWR4JWQgb24gJXMiLAorCQlwbHV0by0+cmV2X3N0ciwgcGx1dG8tPmZ3X3Jldl9zdHIsIHBsdXRvLT5zZXJpYWxfc3RyLAorCQlob3N0LT5tYXhfY2hhbm5lbCwgaG9zdC0+bWF4X2lkLCBwbHV0by0+ZmMtPm5hbWUpOworI2lmZGVmIF9fc3BhcmNfXworCXAgPSBzdHJjaHIoYnVmLCAwKTsKKwlzcHJpbnRmKHAsICIgUFJPTSBub2RlICV4IiwgcGx1dG8tPmZjLT5kZXYtPnByb21fbm9kZSk7CisjZW5kaWYJCisJcmV0dXJuIGJ1ZjsKK30KKworLyogU1NBIHVzZXMgdGhpcyBGQzRTIGFkZHJlc3Npbmc6CisgICBzd2l0Y2ggKGFkZHJbMF0pCisgICB7CisgICBjYXNlIDA6IENPTlRST0xMRVIgLSBBbGwgb2YgYWRkclsxXS4uYWRkclszXSBoYXMgdG8gYmUgMAorICAgY2FzZSAxOiBTSU5HTEUgRElTSyAtIGFkZHJbMV0gY2hhbm5lbCwgYWRkclsyXSBpZCwgYWRkclszXSAwCisgICBjYXNlIDI6IERJU0sgR1JPVVAgLSA/Pz8KKyAgIH0KKyAgIAorICAgU28gdGhhdCBTQ1NJIG1pZC1sYXllciBjYW4gYWNjZXNzIHRvIHRoZXNlLCB3ZSByZXNlcnZlCisgICBjaGFubmVsIDAgaWQgMCBsdW4gMCBmb3IgQ09OVFJPTExFUgorICAgYW5kIGNoYW5uZWxzIDEgLi4gbWF4X2NoYW5uZWwgYXJlIG5vcm1hbCBzaW5nbGUgZGlza3MuCisgKi8KK3N0YXRpYyBpbnQgcGx1dG9fZW5jb2RlX2FkZHIoU2NzaV9DbW5kICpTQ3BudCwgdTE2ICphZGRyLCBmY19jaGFubmVsICpmYywgZmNwX2NtbmQgKmZjbWQpCit7CisJUExORCgoImVuY29kZSBhZGRyICVkICVkICVkXG4iLCBTQ3BudC0+ZGV2aWNlLT5jaGFubmVsLCBTQ3BudC0+ZGV2aWNlLT5pZCwgU0NwbnQtPmNtbmRbMV0gJiAweGUwKSkKKwkvKiBXZSBkb24ndCBzdXBwb3J0IExVTnMgLSBuZWl0aGVyIGRvZXMgU1NBIDopICovCisJaWYgKFNDcG50LT5jbW5kWzFdICYgMHhlMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFTQ3BudC0+ZGV2aWNlLT5jaGFubmVsKSB7CisJCWlmIChTQ3BudC0+ZGV2aWNlLT5pZCkKKwkJCXJldHVybiAtRUlOVkFMOworCQltZW1zZXQgKGFkZHIsIDAsIDQgKiBzaXplb2YodTE2KSk7CisJfSBlbHNlIHsKKwkJYWRkclswXSA9IDE7CisJCWFkZHJbMV0gPSBTQ3BudC0+ZGV2aWNlLT5jaGFubmVsIC0gMTsKKwkJYWRkclsyXSA9IFNDcG50LT5kZXZpY2UtPmlkOworCQlhZGRyWzNdID0gMDsKKwl9CisJLyogV2UncmUgUG9pbnQtdG8tUG9pbnQsIHNvIHRhcmdldCBpdCB0byB0aGUgZGVmYXVsdCBESUQgKi8KKwlmY21kLT5kaWQgPSBmYy0+ZGlkOworCVBMTkQoKCJ0cnlpbmcgJTA0eCUwNHglMDR4JTA0eFxuIiwgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSkpCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5uYW1lCQkJPSAiU3BhcmMgU3RvcmFnZSBBcnJheSAxMDAvMjAwIiwKKwkuZGV0ZWN0CQkJPSBwbHV0b19kZXRlY3QsCisJLnJlbGVhc2UJCT0gcGx1dG9fcmVsZWFzZSwKKwkuaW5mbwkJCT0gcGx1dG9faW5mbywKKwkucXVldWVjb21tYW5kCQk9IGZjcF9zY3NpX3F1ZXVlY29tbWFuZCwKKwkuc2xhdmVfY29uZmlndXJlCT0gcGx1dG9fc2xhdmVfY29uZmlndXJlLAorCS5jYW5fcXVldWUJCT0gUExVVE9fQ0FOX1FVRVVFLAorCS50aGlzX2lkCQk9IC0xLAorCS5zZ190YWJsZXNpemUJCT0gMSwKKwkuY21kX3Blcl9sdW4JCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBmY3Bfc2NzaV9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBmY3Bfc2NzaV9kZXZfcmVzZXQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZmNwX3Njc2lfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSBmY3Bfc2NzaV9ob3N0X3Jlc2V0LAorfTsKKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BsdXRvLmggYi9kcml2ZXJzL3Njc2kvcGx1dG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWI4NDRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BsdXRvLmgKQEAgLTAsMCArMSw0NyBAQAorLyogcGx1dG8uaDogU3BhcmNTVE9SQUdFIEFycmF5IFNDU0kgaG9zdCBhZGFwdGVyIGRyaXZlciBkZWZpbml0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgSmFrdWIgSmVsaW5layAoampAc3Vuc2l0ZS5tZmYuY3VuaS5jeikKKyAqLworCisjaWZuZGVmIF9QTFVUT19ICisjZGVmaW5lIF9QTFVUT19ICisKKyNpbmNsdWRlICIuLi9mYzQvZmNwX2ltcGwuaCIKKworc3RydWN0IHBsdXRvIHsKKwkvKiBUaGlzIG11c3QgYmUgZmlyc3QgKi8KKwlmY19jaGFubmVsCSpmYzsKKwljaGFyCQlyZXZfc3RyWzVdOworCWNoYXIJCWZ3X3Jldl9zdHJbNV07CisJY2hhcgkJc2VyaWFsX3N0clsxM107Cit9OworCitzdHJ1Y3QgcGx1dG9faW5xdWlyeSB7CisJdTgJZHR5cGU7CisJdTgJcmVtb3ZhYmxlOjEsIHF1YWxpZmllcjo3OworCXU4CWlzbzoyLCBlY21hOjMsIGFuc2k6MzsKKwl1OAlhZW5jOjEsIHRybWlvcDoxLCA6MiwgcmRmOjQ7CisJdTgJbGVuOworCXU4CXh4eDE7CisJdTgJeHh4MjsKKwl1OAlyZWxhZGRyOjEsIHdidXMzMjoxLCB3YnVzMTY6MSwgc3luYzoxLCBsaW5rZWQ6MSwgOjEsIGNtZHF1ZToxLCBzb2Z0cmVzZXQ6MTsKKwl1OAl2ZW5kb3JfaWRbOF07CisJdTgJcHJvZHVjdF9pZFsxNl07CisJdTgJcmV2aXNpb25bNF07CisJdTgJZndfcmV2aXNpb25bNF07CisJdTgJc2VyaWFsWzEyXTsKKwl1OAl4eHgzWzJdOworCXU4CWNoYW5uZWxzOworCXU4CXRhcmdldHM7Cit9OworCisvKiBUaGlzIGlzIHRoZSBtYXggbnVtYmVyIG9mIG91dHN0YW5kaW5nIFNDU0kgY29tbWFuZHMgcGVyIHBsdXRvICovCisjZGVmaW5lIFBMVVRPX0NBTl9RVUVVRQkJMjU0CisKK2ludCBwbHV0b19kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICopOworaW50IHBsdXRvX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqKTsKK2NvbnN0IGNoYXIgKiBwbHV0b19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKik7CitpbnQgcGx1dG9fc2xhdmVfY29uZmlndXJlKFNjc2lfRGV2aWNlICopOworCisjZW5kaWYgLyogIShfUExVVE9fSCkgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BwYS5jIGIvZHJpdmVycy9zY3NpL3BwYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YjQ1MjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcHBhLmMKQEAgLTAsMCArMSwxMTUwIEBACisvKiBwcGEuYyAgIC0tICBsb3cgbGV2ZWwgZHJpdmVyIGZvciB0aGUgSU9NRUdBIFBQQTMgCisgKiBwYXJhbGxlbCBwb3J0IFNDU0kgaG9zdCBhZGFwdGVyLgorICogCisgKiAoVGhlIFBQQTMgaXMgdGhlIGVtYmVkZGVkIGNvbnRyb2xsZXIgaW4gdGhlIFpJUCBkcml2ZS4pCisgKiAKKyAqIChjKSAxOTk1LDE5OTYgR3JhbnQgUi4gR3VlbnRoZXIsIGdyYW50QHRvcnF1ZS5uZXQsCisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogCisgKiBDdXJyZW50IE1haW50YWluZXI6IERhdmlkIENhbXBiZWxsIChQZXJ0aCwgV2VzdGVybiBBdXN0cmFsaWEsIEdNVCswODAwKQorICogICAgICAgICAgICAgICAgICAgICBjYW1wYmVsbEB0b3JxdWUubmV0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisKK3N0YXRpYyB2b2lkIHBwYV9yZXNldF9wdWxzZSh1bnNpZ25lZCBpbnQgYmFzZSk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgcGFyZGV2aWNlICpkZXY7CS8qIFBhcnBvcnQgZGV2aWNlIGVudHJ5ICAgICAgICAgKi8KKwlpbnQgYmFzZTsJCS8qIEFjdHVhbCBwb3J0IGFkZHJlc3MgICAgICAgICAgKi8KKwlpbnQgbW9kZTsJCS8qIFRyYW5zZmVyIG1vZGUgICAgICAgICAgICAgICAgKi8KKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjdXJfY21kOwkvKiBDdXJyZW50IHF1ZXVlZCBjb21tYW5kICAgICAgICovCisJc3RydWN0IHdvcmtfc3RydWN0IHBwYV90cTsJLyogUG9sbGluZyBpbnRlcnJ1cHQgc3R1ZmYgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIGpzdGFydDsJLyogSmlmZmllcyBhdCBzdGFydCAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgcmVjb25fdG1vOwkvKiBIb3cgbWFueSB1c2VjcyB0byB3YWl0IGZvciByZWNvbm5lY3Rpb24gKDZ0aCBiaXQpICovCisJdW5zaWduZWQgaW50IGZhaWxlZDoxOwkvKiBGYWlsdXJlIGZsYWcgICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgd2FudGVkOjE7CS8qIFBhcnBvcnQgc2hhcmluZyBidXN5IGZsYWcgICAgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCAqd2FpdGluZzsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK30gcHBhX3N0cnVjdDsKKworI2luY2x1ZGUgICJwcGEuaCIKKworc3RhdGljIGlubGluZSBwcGFfc3RydWN0ICpwcGFfZGV2KHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJcmV0dXJuICoocHBhX3N0cnVjdCAqKikmaG9zdC0+aG9zdGRhdGE7Cit9CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYXJiaXRyYXRpb25fbG9jayk7CisKK3N0YXRpYyB2b2lkIGdvdF9pdChwcGFfc3RydWN0ICpkZXYpCit7CisJZGV2LT5iYXNlID0gZGV2LT5kZXYtPnBvcnQtPmJhc2U7CisJaWYgKGRldi0+Y3VyX2NtZCkKKwkJZGV2LT5jdXJfY21kLT5TQ3AucGhhc2UgPSAxOworCWVsc2UKKwkJd2FrZV91cChkZXYtPndhaXRpbmcpOworfQorCitzdGF0aWMgdm9pZCBwcGFfd2FrZXVwKHZvaWQgKnJlZikKK3sKKwlwcGFfc3RydWN0ICpkZXYgPSAocHBhX3N0cnVjdCAqKSByZWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhcmJpdHJhdGlvbl9sb2NrLCBmbGFncyk7CisJaWYgKGRldi0+d2FudGVkKSB7CisJCXBhcnBvcnRfY2xhaW0oZGV2LT5kZXYpOworCQlnb3RfaXQoZGV2KTsKKwkJZGV2LT53YW50ZWQgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcmJpdHJhdGlvbl9sb2NrLCBmbGFncyk7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHBwYV9wYl9jbGFpbShwcGFfc3RydWN0ICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVzID0gMTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXJiaXRyYXRpb25fbG9jaywgZmxhZ3MpOworCWlmIChwYXJwb3J0X2NsYWltKGRldi0+ZGV2KSA9PSAwKSB7CisJCWdvdF9pdChkZXYpOworCQlyZXMgPSAwOworCX0KKwlkZXYtPndhbnRlZCA9IHJlczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcmJpdHJhdGlvbl9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgcHBhX3BiX2Rpc21pc3MocHBhX3N0cnVjdCAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHdhbnRlZDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXJiaXRyYXRpb25fbG9jaywgZmxhZ3MpOworCXdhbnRlZCA9IGRldi0+d2FudGVkOworCWRldi0+d2FudGVkID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcmJpdHJhdGlvbl9sb2NrLCBmbGFncyk7CisJaWYgKCF3YW50ZWQpCisJCXBhcnBvcnRfcmVsZWFzZShkZXYtPmRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcGFfcGJfcmVsZWFzZShwcGFfc3RydWN0ICpkZXYpCit7CisJcGFycG9ydF9yZWxlYXNlKGRldi0+ZGV2KTsKK30KKworLyoKKyAqIFN0YXJ0IG9mIENoaXBzZXQga2x1ZGdlcworICovCisKKy8qIFRoaXMgaXMgdG8gZ2l2ZSB0aGUgcHBhIGRyaXZlciBhIHdheSB0byBtb2RpZnkgdGhlIHRpbWluZ3MgKGFuZCBvdGhlcgorICogcGFyYW1ldGVycykgYnkgd3JpdGluZyB0byB0aGUgL3Byb2Mvc2NzaS9wcGEvMCBmaWxlLgorICogVmVyeSBzaW1wbGUgbWV0aG9kIHJlYWxseS4uLiAoVG8gc2ltcGxlLCBubyBlcnJvciBjaGVja2luZyA6KCApCisgKiBSZWFzb246IEtlcm5lbCBoYWNrZXJzIEhBVEUgaGF2aW5nIHRvIHVubG9hZCBhbmQgcmVsb2FkIG1vZHVsZXMgZm9yCisgKiB0ZXN0aW5nLi4uCisgKiBBbHNvIGdpdmVzIGEgbWV0aG9kIHRvIHVzZSBhIHNjcmlwdCB0byBvYnRhaW4gb3B0aW11bSB0aW1pbmdzIChUT0RPKQorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHBwYV9wcm9jX3dyaXRlKHBwYV9zdHJ1Y3QgKmRldiwgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQoreworCXVuc2lnbmVkIGxvbmcgeDsKKworCWlmICgobGVuZ3RoID4gNSkgJiYgKHN0cm5jbXAoYnVmZmVyLCAibW9kZT0iLCA1KSA9PSAwKSkgeworCQl4ID0gc2ltcGxlX3N0cnRvdWwoYnVmZmVyICsgNSwgTlVMTCwgMCk7CisJCWRldi0+bW9kZSA9IHg7CisJCXJldHVybiBsZW5ndGg7CisJfQorCWlmICgobGVuZ3RoID4gMTApICYmIChzdHJuY21wKGJ1ZmZlciwgInJlY29uX3Rtbz0iLCAxMCkgPT0gMCkpIHsKKwkJeCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZmZlciArIDEwLCBOVUxMLCAwKTsKKwkJZGV2LT5yZWNvbl90bW8gPSB4OworCQlwcmludGsoInBwYTogcmVjb25fdG1vIHNldCB0byAlbGRcbiIsIHgpOworCQlyZXR1cm4gbGVuZ3RoOworCX0KKwlwcmludGsoInBwYSAvcHJvYzogaW52YWxpZCB2YXJpYWJsZVxuIik7CisJcmV0dXJuICgtRUlOVkFMKTsKK30KKworc3RhdGljIGludCBwcGFfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBpbm91dCkKK3sKKwlpbnQgbGVuID0gMDsKKwlwcGFfc3RydWN0ICpkZXYgPSBwcGFfZGV2KGhvc3QpOworCisJaWYgKGlub3V0KQorCQlyZXR1cm4gcHBhX3Byb2Nfd3JpdGUoZGV2LCBidWZmZXIsIGxlbmd0aCk7CisKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJWZXJzaW9uIDogJXNcbiIsIFBQQV9WRVJTSU9OKTsKKwlsZW4gKz0KKwkgICAgc3ByaW50ZihidWZmZXIgKyBsZW4sICJQYXJwb3J0IDogJXNcbiIsCisJCSAgICBkZXYtPmRldi0+cG9ydC0+bmFtZSk7CisJbGVuICs9CisJICAgIHNwcmludGYoYnVmZmVyICsgbGVuLCAiTW9kZSAgICA6ICVzXG4iLAorCQkgICAgUFBBX01PREVfU1RSSU5HW2Rldi0+bW9kZV0pOworI2lmIFBQQV9ERUJVRyA+IDAKKwlsZW4gKz0KKwkgICAgc3ByaW50ZihidWZmZXIgKyBsZW4sICJyZWNvbl90bW8gOiAlbHVcbiIsIGRldi0+cmVjb25fdG1vKTsKKyNlbmRpZgorCisJLyogUmVxdWVzdCBmb3IgYmV5b25kIGVuZCBvZiBidWZmZXIgKi8KKwlpZiAob2Zmc2V0ID4gbGVuZ3RoKQorCQlyZXR1cm4gMDsKKworCSpzdGFydCA9IGJ1ZmZlciArIG9mZnNldDsKKwlsZW4gLT0gb2Zmc2V0OworCWlmIChsZW4gPiBsZW5ndGgpCisJCWxlbiA9IGxlbmd0aDsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGRldmljZV9jaGVjayhwcGFfc3RydWN0ICpkZXYpOworCisjaWYgUFBBX0RFQlVHID4gMAorI2RlZmluZSBwcGFfZmFpbCh4LHkpIHByaW50aygicHBhOiBwcGFfZmFpbCglaSkgZnJvbSAlcyBhdCBsaW5lICVkXG4iLFwKKwkgICB5LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgcHBhX2ZhaWxfZnVuYyh4LHkpOworc3RhdGljIGlubGluZSB2b2lkIHBwYV9mYWlsX2Z1bmMocHBhX3N0cnVjdCAqZGV2LCBpbnQgZXJyb3JfY29kZSkKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcHBhX2ZhaWwocHBhX3N0cnVjdCAqZGV2LCBpbnQgZXJyb3JfY29kZSkKKyNlbmRpZgoreworCS8qIElmIHdlIGZhaWwgYSBkZXZpY2UgdGhlbiB3ZSB0cmFzaCBzdGF0dXMgLyBtZXNzYWdlIGJ5dGVzICovCisJaWYgKGRldi0+Y3VyX2NtZCkgeworCQlkZXYtPmN1cl9jbWQtPnJlc3VsdCA9IGVycm9yX2NvZGUgPDwgMTY7CisJCWRldi0+ZmFpbGVkID0gMTsKKwl9Cit9CisKKy8qCisgKiBXYWl0IGZvciB0aGUgaGlnaCBiaXQgdG8gYmUgc2V0LgorICogCisgKiBJbiBwcmluY2lwbGUsIHRoaXMgY291bGQgYmUgdGllZCB0byBhbiBpbnRlcnJ1cHQsIGJ1dCB0aGUgYWRhcHRlcgorICogZG9lc24ndCBhcHBlYXIgdG8gYmUgZGVzaWduZWQgdG8gc3VwcG9ydCBpbnRlcnJ1cHRzLiAgV2Ugc3BpbiBvbgorICogdGhlIDB4ODAgcmVhZHkgYml0LiAKKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcHBhX3dhaXQocHBhX3N0cnVjdCAqZGV2KQoreworCWludCBrOworCXVuc2lnbmVkIHNob3J0IHBwYiA9IGRldi0+YmFzZTsKKwl1bnNpZ25lZCBjaGFyIHI7CisKKwlrID0gUFBBX1NQSU5fVE1POworCS8qIFdhaXQgZm9yIGJpdCA2IGFuZCA3IC0gUEpDICovCisJZm9yIChyID0gcl9zdHIocHBiKTsgKChyICYgMHhjMCkgIT0gMHhjMCkgJiYgKGspOyBrLS0pIHsKKwkJdWRlbGF5KDEpOworCQlyID0gcl9zdHIocHBiKTsKKwl9CisKKwkvKgorCSAqIHJldHVybiBzb21lIHN0YXR1cyBpbmZvcm1hdGlvbi4KKwkgKiBTZW1hbnRpY3M6IDB4YzAgPSBaSVAgd2FudHMgbW9yZSBkYXRhCisJICogICAgICAgICAgICAweGQwID0gWklQIHdhbnRzIHRvIHNlbmQgbW9yZSBkYXRhCisJICogICAgICAgICAgICAweGUwID0gWklQIGlzIGV4cGVjdGluZyBTQ1NJIGNvbW1hbmQgZGF0YQorCSAqICAgICAgICAgICAgMHhmMCA9IGVuZCBvZiB0cmFuc2ZlciwgWklQIGlzIHNlbmRpbmcgc3RhdHVzCisJICovCisJaWYgKGspCisJCXJldHVybiAociAmIDB4ZjApOworCisJLyogQ291bnRlciBleHBpcmVkIC0gVGltZSBvdXQgb2NjdXJyZWQgKi8KKwlwcGFfZmFpbChkZXYsIERJRF9USU1FX09VVCk7CisJcHJpbnRrKCJwcGEgdGltZW91dCBpbiBwcGFfd2FpdFxuIik7CisJcmV0dXJuIDA7CQkvKiBjb21tYW5kIHRpbWVkIG91dCAqLworfQorCisvKgorICogQ2xlYXIgRVBQIFRpbWVvdXQgQml0IAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZXBwX3Jlc2V0KHVuc2lnbmVkIHNob3J0IHBwYikKK3sKKwlpbnQgaTsKKworCWkgPSByX3N0cihwcGIpOworCXdfc3RyKHBwYiwgaSk7CisJd19zdHIocHBiLCBpICYgMHhmZSk7Cit9CisKKy8qIAorICogV2FpdCBmb3IgZW1wdHkgRUNQIGZpZm8gKGlmIHdlIGFyZSBpbiBFQ1AgZmlmbyBtb2RlIG9ubHkpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlY3Bfc3luYyhwcGFfc3RydWN0ICpkZXYpCit7CisJaW50IGksIHBwYl9oaSA9IGRldi0+ZGV2LT5wb3J0LT5iYXNlX2hpOworCisJaWYgKHBwYl9oaSA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAoKHJfZWNyKHBwYl9oaSkgJiAweGUwKSA9PSAweDYwKSB7CS8qIG1vZGUgMDExID09IEVDUCBmaWZvIG1vZGUgKi8KKwkJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCQlpZiAocl9lY3IocHBiX2hpKSAmIDB4MDEpCisJCQkJcmV0dXJuOworCQkJdWRlbGF5KDUpOworCQl9CisJCXByaW50aygicHBhOiBFQ1Agc3luYyBmYWlsZWQgYXMgZGF0YSBzdGlsbCBwcmVzZW50IGluIEZJRk8uXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcHBhX2J5dGVfb3V0KHVuc2lnbmVkIHNob3J0IGJhc2UsIGNvbnN0IGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IGxlbjsgaTsgaS0tKSB7CisJCXdfZHRyKGJhc2UsICpidWZmZXIrKyk7CisJCXdfY3RyKGJhc2UsIDB4ZSk7CisJCXdfY3RyKGJhc2UsIDB4Yyk7CisJfQorCXJldHVybiAxOwkJLyogQWxsIHdlbnQgd2VsbCAtIHdlIGhvcGUhICovCit9CisKK3N0YXRpYyBpbnQgcHBhX2J5dGVfaW4odW5zaWduZWQgc2hvcnQgYmFzZSwgY2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gbGVuOyBpOyBpLS0pIHsKKwkJKmJ1ZmZlcisrID0gcl9kdHIoYmFzZSk7CisJCXdfY3RyKGJhc2UsIDB4MjcpOworCQl3X2N0cihiYXNlLCAweDI1KTsKKwl9CisJcmV0dXJuIDE7CQkvKiBBbGwgd2VudCB3ZWxsIC0gd2UgaG9wZSEgKi8KK30KKworc3RhdGljIGludCBwcGFfbmliYmxlX2luKHVuc2lnbmVkIHNob3J0IGJhc2UsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwlmb3IgKDsgbGVuOyBsZW4tLSkgeworCQl1bnNpZ25lZCBjaGFyIGg7CisKKwkJd19jdHIoYmFzZSwgMHg0KTsKKwkJaCA9IHJfc3RyKGJhc2UpICYgMHhmMDsKKwkJd19jdHIoYmFzZSwgMHg2KTsKKwkJKmJ1ZmZlcisrID0gaCB8ICgocl9zdHIoYmFzZSkgJiAweGYwKSA+PiA0KTsKKwl9CisJcmV0dXJuIDE7CQkvKiBBbGwgd2VudCB3ZWxsIC0gd2UgaG9wZSEgKi8KK30KKworc3RhdGljIGludCBwcGFfb3V0KHBwYV9zdHJ1Y3QgKmRldiwgY2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCWludCByOworCXVuc2lnbmVkIHNob3J0IHBwYiA9IGRldi0+YmFzZTsKKworCXIgPSBwcGFfd2FpdChkZXYpOworCisJaWYgKChyICYgMHg1MCkgIT0gMHg0MCkgeworCQlwcGFfZmFpbChkZXYsIERJRF9FUlJPUik7CisJCXJldHVybiAwOworCX0KKwlzd2l0Y2ggKGRldi0+bW9kZSkgeworCWNhc2UgUFBBX05JQkJMRToKKwljYXNlIFBQQV9QUzI6CisJCS8qIDggYml0IG91dHB1dCwgd2l0aCBhIGxvb3AgKi8KKwkJciA9IHBwYV9ieXRlX291dChwcGIsIGJ1ZmZlciwgbGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIFBQQV9FUFBfMzI6CisJY2FzZSBQUEFfRVBQXzE2OgorCWNhc2UgUFBBX0VQUF84OgorCQllcHBfcmVzZXQocHBiKTsKKwkJd19jdHIocHBiLCAweDQpOworI2lmZGVmIENPTkZJR19TQ1NJX0laSVBfRVBQMTYKKwkJaWYgKCEoKChsb25nKSBidWZmZXIgfCBsZW4pICYgMHgwMSkpCisJCQlvdXRzdyhwcGIgKyA0LCBidWZmZXIsIGxlbiA+PiAxKTsKKyNlbHNlCisJCWlmICghKCgobG9uZykgYnVmZmVyIHwgbGVuKSAmIDB4MDMpKQorCQkJb3V0c2wocHBiICsgNCwgYnVmZmVyLCBsZW4gPj4gMik7CisjZW5kaWYKKwkJZWxzZQorCQkJb3V0c2IocHBiICsgNCwgYnVmZmVyLCBsZW4pOworCQl3X2N0cihwcGIsIDB4Yyk7CisJCXIgPSAhKHJfc3RyKHBwYikgJiAweDAxKTsKKwkJd19jdHIocHBiLCAweGMpOworCQllY3Bfc3luYyhkZXYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiUFBBOiBidWcgaW4gcHBhX291dCgpXG4iKTsKKwkJciA9IDA7CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHBwYV9pbihwcGFfc3RydWN0ICpkZXYsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwlpbnQgcjsKKwl1bnNpZ25lZCBzaG9ydCBwcGIgPSBkZXYtPmJhc2U7CisKKwlyID0gcHBhX3dhaXQoZGV2KTsKKworCWlmICgociAmIDB4NTApICE9IDB4NTApIHsKKwkJcHBhX2ZhaWwoZGV2LCBESURfRVJST1IpOworCQlyZXR1cm4gMDsKKwl9CisJc3dpdGNoIChkZXYtPm1vZGUpIHsKKwljYXNlIFBQQV9OSUJCTEU6CisJCS8qIDQgYml0IGlucHV0LCB3aXRoIGEgbG9vcCAqLworCQlyID0gcHBhX25pYmJsZV9pbihwcGIsIGJ1ZmZlciwgbGVuKTsKKwkJd19jdHIocHBiLCAweGMpOworCQlicmVhazsKKworCWNhc2UgUFBBX1BTMjoKKwkJLyogOCBiaXQgaW5wdXQsIHdpdGggYSBsb29wICovCisJCXdfY3RyKHBwYiwgMHgyNSk7CisJCXIgPSBwcGFfYnl0ZV9pbihwcGIsIGJ1ZmZlciwgbGVuKTsKKwkJd19jdHIocHBiLCAweDQpOworCQl3X2N0cihwcGIsIDB4Yyk7CisJCWJyZWFrOworCisJY2FzZSBQUEFfRVBQXzMyOgorCWNhc2UgUFBBX0VQUF8xNjoKKwljYXNlIFBQQV9FUFBfODoKKwkJZXBwX3Jlc2V0KHBwYik7CisJCXdfY3RyKHBwYiwgMHgyNCk7CisjaWZkZWYgQ09ORklHX1NDU0lfSVpJUF9FUFAxNgorCQlpZiAoISgoKGxvbmcpIGJ1ZmZlciB8IGxlbikgJiAweDAxKSkKKwkJCWluc3cocHBiICsgNCwgYnVmZmVyLCBsZW4gPj4gMSk7CisjZWxzZQorCQlpZiAoISgoKGxvbmcpIGJ1ZmZlciB8IGxlbikgJiAweDAzKSkKKwkJCWluc2wocHBiICsgNCwgYnVmZmVyLCBsZW4gPj4gMik7CisjZW5kaWYKKwkJZWxzZQorCQkJaW5zYihwcGIgKyA0LCBidWZmZXIsIGxlbik7CisJCXdfY3RyKHBwYiwgMHgyYyk7CisJCXIgPSAhKHJfc3RyKHBwYikgJiAweDAxKTsKKwkJd19jdHIocHBiLCAweDJjKTsKKwkJZWNwX3N5bmMoZGV2KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoIlBQQTogYnVnIGluIHBwYV9pbnMoKVxuIik7CisJCXIgPSAwOworCQlicmVhazsKKwl9CisJcmV0dXJuIHI7Cit9CisKKy8qIGVuZCBvZiBwcGFfaW8uaCAqLworc3RhdGljIGlubGluZSB2b2lkIHBwYV9kX3B1bHNlKHVuc2lnbmVkIHNob3J0IHBwYiwgdW5zaWduZWQgY2hhciBiKQoreworCXdfZHRyKHBwYiwgYik7CisJd19jdHIocHBiLCAweGMpOworCXdfY3RyKHBwYiwgMHhlKTsKKwl3X2N0cihwcGIsIDB4Yyk7CisJd19jdHIocHBiLCAweDQpOworCXdfY3RyKHBwYiwgMHhjKTsKK30KKworc3RhdGljIHZvaWQgcHBhX2Rpc2Nvbm5lY3QocHBhX3N0cnVjdCAqZGV2KQoreworCXVuc2lnbmVkIHNob3J0IHBwYiA9IGRldi0+YmFzZTsKKworCXBwYV9kX3B1bHNlKHBwYiwgMCk7CisJcHBhX2RfcHVsc2UocHBiLCAweDNjKTsKKwlwcGFfZF9wdWxzZShwcGIsIDB4MjApOworCXBwYV9kX3B1bHNlKHBwYiwgMHhmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBwYV9jX3B1bHNlKHVuc2lnbmVkIHNob3J0IHBwYiwgdW5zaWduZWQgY2hhciBiKQoreworCXdfZHRyKHBwYiwgYik7CisJd19jdHIocHBiLCAweDQpOworCXdfY3RyKHBwYiwgMHg2KTsKKwl3X2N0cihwcGIsIDB4NCk7CisJd19jdHIocHBiLCAweGMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHBhX2Nvbm5lY3QocHBhX3N0cnVjdCAqZGV2LCBpbnQgZmxhZykKK3sKKwl1bnNpZ25lZCBzaG9ydCBwcGIgPSBkZXYtPmJhc2U7CisKKwlwcGFfY19wdWxzZShwcGIsIDApOworCXBwYV9jX3B1bHNlKHBwYiwgMHgzYyk7CisJcHBhX2NfcHVsc2UocHBiLCAweDIwKTsKKwlpZiAoKGZsYWcgPT0gQ09OTkVDVF9FUFBfTUFZQkUpICYmIElOX0VQUF9NT0RFKGRldi0+bW9kZSkpCisJCXBwYV9jX3B1bHNlKHBwYiwgMHhjZik7CisJZWxzZQorCQlwcGFfY19wdWxzZShwcGIsIDB4OGYpOworfQorCitzdGF0aWMgaW50IHBwYV9zZWxlY3QocHBhX3N0cnVjdCAqZGV2LCBpbnQgdGFyZ2V0KQoreworCWludCBrOworCXVuc2lnbmVkIHNob3J0IHBwYiA9IGRldi0+YmFzZTsKKworCS8qCisJICogQml0IDYgKDB4NDApIGlzIHRoZSBkZXZpY2Ugc2VsZWN0ZWQgYml0LgorCSAqIEZpcnN0IHdlIG11c3Qgd2FpdCB0aWxsIHRoZSBjdXJyZW50IGRldmljZSBnb2VzIG9mZiBsaW5lLi4uCisJICovCisJayA9IFBQQV9TRUxFQ1RfVE1POworCWRvIHsKKwkJay0tOworCQl1ZGVsYXkoMSk7CisJfSB3aGlsZSAoKHJfc3RyKHBwYikgJiAweDQwKSAmJiAoaykpOworCWlmICghaykKKwkJcmV0dXJuIDA7CisKKwl3X2R0cihwcGIsICgxIDw8IHRhcmdldCkpOworCXdfY3RyKHBwYiwgMHhlKTsKKwl3X2N0cihwcGIsIDB4Yyk7CisJd19kdHIocHBiLCAweDgwKTsJLyogVGhpcyBpcyBOT1QgdGhlIGluaXRhdG9yICovCisJd19jdHIocHBiLCAweDgpOworCisJayA9IFBQQV9TRUxFQ1RfVE1POworCWRvIHsKKwkJay0tOworCQl1ZGVsYXkoMSk7CisJfQorCXdoaWxlICghKHJfc3RyKHBwYikgJiAweDQwKSAmJiAoaykpOworCWlmICghaykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyogCisgKiBUaGlzIGlzIGJhc2VkIG9uIGEgdHJhY2Ugb2Ygd2hhdCB0aGUgSW9tZWdhIERPUyAnZ3Vlc3QnIGRyaXZlciBkb2VzLgorICogSSd2ZSB0cmllZCBzZXZlcmFsIGRpZmZlcmVudCBraW5kcyBvZiBwYXJhbGxlbCBwb3J0cyB3aXRoIGd1ZXN0IGFuZAorICogY29kZWQgdGhpcyB0byByZWFjdCBpbiB0aGUgc2FtZSB3YXlzIHRoYXQgaXQgZG9lcy4KKyAqIAorICogVGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoaXMgZnVuY3Rpb24gaXMganVzdCBhIGhpbnQgYWJvdXQgd2hlcmUgdGhlCisgKiBoYW5kc2hha2luZyBmYWlsZWQuCisgKiAKKyAqLworc3RhdGljIGludCBwcGFfaW5pdChwcGFfc3RydWN0ICpkZXYpCit7CisJaW50IHJldHY7CisJdW5zaWduZWQgc2hvcnQgcHBiID0gZGV2LT5iYXNlOworCisJcHBhX2Rpc2Nvbm5lY3QoZGV2KTsKKwlwcGFfY29ubmVjdChkZXYsIENPTk5FQ1RfTk9STUFMKTsKKworCXJldHYgPSAyOwkJLyogRmFpbGVkICovCisKKwl3X2N0cihwcGIsIDB4ZSk7CisJaWYgKChyX3N0cihwcGIpICYgMHgwOCkgPT0gMHgwOCkKKwkJcmV0di0tOworCisJd19jdHIocHBiLCAweGMpOworCWlmICgocl9zdHIocHBiKSAmIDB4MDgpID09IDB4MDApCisJCXJldHYtLTsKKworCWlmICghcmV0dikKKwkJcHBhX3Jlc2V0X3B1bHNlKHBwYik7CisJdWRlbGF5KDEwMDApOwkJLyogQWxsb3cgZGV2aWNlcyB0byBzZXR0bGUgZG93biAqLworCXBwYV9kaXNjb25uZWN0KGRldik7CisJdWRlbGF5KDEwMDApOwkJLyogQW5vdGhlciBkZWxheSB0byBhbGxvdyBkZXZpY2VzIHRvIHNldHRsZSAqLworCisJaWYgKHJldHYpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGRldmljZV9jaGVjayhkZXYpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcGFfc2VuZF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlwcGFfc3RydWN0ICpkZXYgPSBwcGFfZGV2KGNtZC0+ZGV2aWNlLT5ob3N0KTsKKwlpbnQgazsKKworCXdfY3RyKGRldi0+YmFzZSwgMHgwYyk7CisKKwlmb3IgKGsgPSAwOyBrIDwgY21kLT5jbWRfbGVuOyBrKyspCisJCWlmICghcHBhX291dChkZXYsICZjbWQtPmNtbmRba10sIDEpKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGUgYnVsayBmbGFnIGVuYWJsZXMgc29tZSBvcHRpbWlzYXRpb25zIGluIHRoZSBkYXRhIHRyYW5zZmVyIGxvb3BzLAorICogaXQgc2hvdWxkIGJlIHRydWUgZm9yIGFueSBjb21tYW5kIHRoYXQgdHJhbnNmZXJzIGRhdGEgaW4gaW50ZWdyYWwKKyAqIG51bWJlcnMgb2Ygc2VjdG9ycy4KKyAqIAorICogVGhlIGRyaXZlciBhcHBlYXJzIHRvIHJlbWFpbiBzdGFibGUgaWYgd2Ugc3BlZWQgdXAgdGhlIHBhcmFsbGVsIHBvcnQKKyAqIGkvbyBpbiB0aGlzIGZ1bmN0aW9uLCBidXQgbm90IGVsc2V3aGVyZS4KKyAqLworc3RhdGljIGludCBwcGFfY29tcGxldGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJLyogUmV0dXJuIGNvZGVzOgorCSAqIC0xICAgICBFcnJvcgorCSAqICAwICAgICBUb2xkIHRvIHNjaGVkdWxlCisJICogIDEgICAgIEZpbmlzaGVkIGRhdGEgdHJhbnNmZXIKKwkgKi8KKwlwcGFfc3RydWN0ICpkZXYgPSBwcGFfZGV2KGNtZC0+ZGV2aWNlLT5ob3N0KTsKKwl1bnNpZ25lZCBzaG9ydCBwcGIgPSBkZXYtPmJhc2U7CisJdW5zaWduZWQgbG9uZyBzdGFydF9qaWZmaWVzID0gamlmZmllczsKKworCXVuc2lnbmVkIGNoYXIgciwgdjsKKwlpbnQgZmFzdCwgYnVsaywgc3RhdHVzOworCisJdiA9IGNtZC0+Y21uZFswXTsKKwlidWxrID0gKCh2ID09IFJFQURfNikgfHwKKwkJKHYgPT0gUkVBRF8xMCkgfHwgKHYgPT0gV1JJVEVfNikgfHwgKHYgPT0gV1JJVEVfMTApKTsKKworCS8qCisJICogV2Ugb25seSBnZXQgaGVyZSBpZiB0aGUgZHJpdmUgaXMgcmVhZHkgdG8gY29tdW5pY2F0ZSwKKwkgKiBoZW5jZSBubyBuZWVkIGZvciBhIGZ1bGwgcHBhX3dhaXQuCisJICovCisJciA9IChyX3N0cihwcGIpICYgMHhmMCk7CisKKwl3aGlsZSAociAhPSAodW5zaWduZWQgY2hhcikgMHhmMCkgeworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGJlZW4gcnVubmluZyBmb3IgbW9yZSB0aGFuIGEgZnVsbCB0aW1lciB0aWNrCisJCSAqIHRoZW4gdGFrZSBhIHJlc3QuCisJCSAqLworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGFydF9qaWZmaWVzICsgMSkpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoKGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPD0gMCkpIHsKKwkJCXBwYV9mYWlsKGRldiwgRElEX0VSUk9SKTsKKwkJCXJldHVybiAtMTsJLyogRVJST1JfUkVUVVJOICovCisJCX0KKworCQkvKiBPbiBzb21lIGhhcmR3YXJlIHdlIGhhdmUgU0NTSSBkaXNjb25uZWN0ZWQgKDZ0aCBiaXQgbG93KQorCQkgKiBmb3IgYWJvdXQgMTAwdXNlY3MuIEl0IGlzIHRvbyBleHBlbnNpdmUgdG8gd2FpdCBhIAorCQkgKiB0aWNrIG9uIGV2ZXJ5IGxvb3Agc28gd2UgYnVzeSB3YWl0IGZvciBubyBtb3JlIHRoYW4KKwkJICogNTAwdXNlY3MgdG8gZ2l2ZSB0aGUgZHJpdmUgYSBjaGFuY2UgZmlyc3QuIFdlIGRvIG5vdCAKKwkJICogY2hhbmdlIHRoaW5ncyBmb3IgIm5vcm1hbCIgaGFyZHdhcmUgc2luY2UgZ2VuZXJhbGx5IAorCQkgKiB0aGUgNnRoIGJpdCBpcyBhbHdheXMgaGlnaC4KKwkJICogVGhpcyBtYWtlcyB0aGUgQ1BVIGxvYWQgaGlnaGVyIG9uIHNvbWUgaGFyZHdhcmUgCisJCSAqIGJ1dCBvdGhlcndpc2Ugd2UgY2FuIG5vdCBnZXQgbW9yZSB0aGFuIDUwSy9zZWNzIAorCQkgKiBvbiB0aGlzIHByb2JsZW0gaGFyZHdhcmUuCisJCSAqLworCQlpZiAoKHIgJiAweGMwKSAhPSAweGMwKSB7CisJCQkvKiBXYWl0IGZvciByZWNvbm5lY3Rpb24gc2hvdWxkIGJlIG5vIG1vcmUgdGhhbiAKKwkJCSAqIGppZmZ5LzIgPSA1bXMgPSA1MDAwIGxvb3BzCisJCQkgKi8KKwkJCXVuc2lnbmVkIGxvbmcgayA9IGRldi0+cmVjb25fdG1vOworCQkJZm9yICg7IGsgJiYgKChyID0gKHJfc3RyKHBwYikgJiAweGYwKSkgJiAweGMwKSAhPSAweGMwOworCQkJICAgICBrLS0pCisJCQkJdWRlbGF5KDEpOworCisJCQlpZiAoIWspCisJCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHVzZSBidXJzdCBJL08gKi8KKwkJZmFzdCA9IChidWxrICYmIChjbWQtPlNDcC50aGlzX3Jlc2lkdWFsID49IFBQQV9CVVJTVF9TSVpFKSkKKwkJICAgID8gUFBBX0JVUlNUX1NJWkUgOiAxOworCisJCWlmIChyID09ICh1bnNpZ25lZCBjaGFyKSAweGMwKQorCQkJc3RhdHVzID0gcHBhX291dChkZXYsIGNtZC0+U0NwLnB0ciwgZmFzdCk7CisJCWVsc2UKKwkJCXN0YXR1cyA9IHBwYV9pbihkZXYsIGNtZC0+U0NwLnB0ciwgZmFzdCk7CisKKwkJY21kLT5TQ3AucHRyICs9IGZhc3Q7CisJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgLT0gZmFzdDsKKworCQlpZiAoIXN0YXR1cykgeworCQkJcHBhX2ZhaWwoZGV2LCBESURfQlVTX0JVU1kpOworCQkJcmV0dXJuIC0xOwkvKiBFUlJPUl9SRVRVUk4gKi8KKwkJfQorCQlpZiAoY21kLT5TQ3AuYnVmZmVyICYmICFjbWQtPlNDcC50aGlzX3Jlc2lkdWFsKSB7CisJCQkvKiBpZiBzY2F0dGVyL2dhdGhlciwgYWR2YW5jZSB0byB0aGUgbmV4dCBzZWdtZW50ICovCisJCQlpZiAoY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbC0tKSB7CisJCQkJY21kLT5TQ3AuYnVmZmVyKys7CisJCQkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9CisJCQkJICAgIGNtZC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCQkJCWNtZC0+U0NwLnB0ciA9CisJCQkJICAgIHBhZ2VfYWRkcmVzcyhjbWQtPlNDcC5idWZmZXItPnBhZ2UpICsKKwkJCQkgICAgY21kLT5TQ3AuYnVmZmVyLT5vZmZzZXQ7CisJCQl9CisJCX0KKwkJLyogTm93IGNoZWNrIHRvIHNlZSBpZiB0aGUgZHJpdmUgaXMgcmVhZHkgdG8gY29tdW5pY2F0ZSAqLworCQlyID0gKHJfc3RyKHBwYikgJiAweGYwKTsKKwkJLyogSWYgbm90LCBkcm9wIGJhY2sgZG93biB0byB0aGUgc2NoZWR1bGVyIGFuZCB3YWl0IGEgdGltZXIgdGljayAqLworCQlpZiAoIShyICYgMHg4MCkpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7CQkvKiBGSU5JU0hfUkVUVVJOICovCit9CisKKy8qCisgKiBTaW5jZSB0aGUgUFBBIGl0c2VsZiBkb2Vzbid0IGdlbmVyYXRlIGludGVycnVwdHMsIHdlIHVzZQorICogdGhlIHNjaGVkdWxlcidzIHRhc2sgcXVldWUgdG8gZ2VuZXJhdGUgYSBzdHJlYW0gb2YgY2FsbC1iYWNrcyBhbmQKKyAqIGNvbXBsZXRlIHRoZSByZXF1ZXN0IHdoZW4gdGhlIGRyaXZlIGlzIHJlYWR5LgorICovCitzdGF0aWMgdm9pZCBwcGFfaW50ZXJydXB0KHZvaWQgKmRhdGEpCit7CisJcHBhX3N0cnVjdCAqZGV2ID0gKHBwYV9zdHJ1Y3QgKikgZGF0YTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBkZXYtPmN1cl9jbWQ7CisKKwlpZiAoIWNtZCkgeworCQlwcmludGsoIlBQQTogYnVnIGluIHBwYV9pbnRlcnJ1cHRcbiIpOworCQlyZXR1cm47CisJfQorCWlmIChwcGFfZW5naW5lKGRldiwgY21kKSkgeworCQlkZXYtPnBwYV90cS5kYXRhID0gKHZvaWQgKikgZGV2OworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldi0+cHBhX3RxLCAxKTsKKwkJcmV0dXJuOworCX0KKwkvKiBDb21tYW5kIG11c3Qgb2YgY29tcGxldGVkIGhlbmNlIGl0IGlzIHNhZmUgdG8gbGV0IGdvLi4uICovCisjaWYgUFBBX0RFQlVHID4gMAorCXN3aXRjaCAoKGNtZC0+cmVzdWx0ID4+IDE2KSAmIDB4ZmYpIHsKKwljYXNlIERJRF9PSzoKKwkJYnJlYWs7CisJY2FzZSBESURfTk9fQ09OTkVDVDoKKwkJcHJpbnRrKCJwcGE6IG5vIGRldmljZSBhdCBTQ1NJIElEICVpXG4iLCBjbWQtPmRldmljZS0+dGFyZ2V0KTsKKwkJYnJlYWs7CisJY2FzZSBESURfQlVTX0JVU1k6CisJCXByaW50aygicHBhOiBCVVMgQlVTWSAtIEVQUCB0aW1lb3V0IGRldGVjdGVkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBESURfVElNRV9PVVQ6CisJCXByaW50aygicHBhOiB1bmtub3duIHRpbWVvdXRcbiIpOworCQlicmVhazsKKwljYXNlIERJRF9BQk9SVDoKKwkJcHJpbnRrKCJwcGE6IHRvbGQgdG8gYWJvcnRcbiIpOworCQlicmVhazsKKwljYXNlIERJRF9QQVJJVFk6CisJCXByaW50aygicHBhOiBwYXJpdHkgZXJyb3IgKD8/PylcbiIpOworCQlicmVhazsKKwljYXNlIERJRF9FUlJPUjoKKwkJcHJpbnRrKCJwcGE6IGludGVybmFsIGRyaXZlciBlcnJvclxuIik7CisJCWJyZWFrOworCWNhc2UgRElEX1JFU0VUOgorCQlwcmludGsoInBwYTogdG9sZCB0byByZXNldCBkZXZpY2VcbiIpOworCQlicmVhazsKKwljYXNlIERJRF9CQURfSU5UUjoKKwkJcHJpbnRrKCJwcGE6IGJhZCBpbnRlcnJ1cHQgKD8/PylcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoInBwYTogYmFkIHJldHVybiBjb2RlICglMDJ4KVxuIiwKKwkJICAgICAgIChjbWQtPnJlc3VsdCA+PiAxNikgJiAweGZmKTsKKwl9CisjZW5kaWYKKworCWlmIChjbWQtPlNDcC5waGFzZSA+IDEpCisJCXBwYV9kaXNjb25uZWN0KGRldik7CisKKwlwcGFfcGJfZGlzbWlzcyhkZXYpOworCisJZGV2LT5jdXJfY21kID0gTlVMTDsKKworCWNtZC0+c2NzaV9kb25lKGNtZCk7Cit9CisKK3N0YXRpYyBpbnQgcHBhX2VuZ2luZShwcGFfc3RydWN0ICpkZXYsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBwcGIgPSBkZXYtPmJhc2U7CisJdW5zaWduZWQgY2hhciBsID0gMCwgaCA9IDA7CisJaW50IHJldHY7CisKKwkvKiBGaXJzdCBjaGVjayBmb3IgYW55IGVycm9ycyB0aGF0IG1heSBvZiBvY2N1cnJlZAorCSAqIEhlcmUgd2UgY2hlY2sgZm9yIGludGVybmFsIGVycm9ycworCSAqLworCWlmIChkZXYtPmZhaWxlZCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGNtZC0+U0NwLnBoYXNlKSB7CisJY2FzZSAwOgkJLyogUGhhc2UgMCAtIFdhaXRpbmcgZm9yIHBhcnBvcnQgKi8KKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGV2LT5qc3RhcnQgKyBIWikpIHsKKwkJCS8qCisJCQkgKiBXZSB3YWl0ZWQgbW9yZSB0aGFuIGEgc2Vjb25kCisJCQkgKiBmb3IgcGFycG9ydCB0byBjYWxsIHVzCisJCQkgKi8KKwkJCXBwYV9mYWlsKGRldiwgRElEX0JVU19CVVNZKTsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiAxOwkvKiB3YWl0IHVudGlsIHBwYV93YWtldXAgY2xhaW1zIHBhcnBvcnQgKi8KKwljYXNlIDE6CQkvKiBQaGFzZSAxIC0gQ29ubmVjdGVkICovCisJCXsJCS8qIFBlcmZvcm0gYSBzYW5pdHkgY2hlY2sgZm9yIGNhYmxlIHVucGx1Z2dlZCAqLworCQkJaW50IHJldHYgPSAyOwkvKiBGYWlsZWQgKi8KKworCQkJcHBhX2Nvbm5lY3QoZGV2LCBDT05ORUNUX0VQUF9NQVlCRSk7CisKKwkJCXdfY3RyKHBwYiwgMHhlKTsKKwkJCWlmICgocl9zdHIocHBiKSAmIDB4MDgpID09IDB4MDgpCisJCQkJcmV0di0tOworCisJCQl3X2N0cihwcGIsIDB4Yyk7CisJCQlpZiAoKHJfc3RyKHBwYikgJiAweDA4KSA9PSAweDAwKQorCQkJCXJldHYtLTsKKworCQkJaWYgKHJldHYpIHsKKwkJCQlpZiAoKGppZmZpZXMgLSBkZXYtPmpzdGFydCkgPiAoMSAqIEhaKSkgeworCQkJCQlwcmludGsKKwkJCQkJICAgICgicHBhOiBQYXJhbGxlbCBwb3J0IGNhYmxlIGlzIHVucGx1Z2dlZCEhXG4iKTsKKwkJCQkJcHBhX2ZhaWwoZGV2LCBESURfQlVTX0JVU1kpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9IGVsc2UgeworCQkJCQlwcGFfZGlzY29ubmVjdChkZXYpOworCQkJCQlyZXR1cm4gMTsJLyogVHJ5IGFnYWluIGluIGEgamlmZnkgKi8KKwkJCQl9CisJCQl9CisJCQljbWQtPlNDcC5waGFzZSsrOworCQl9CisKKwljYXNlIDI6CQkvKiBQaGFzZSAyIC0gV2UgYXJlIG5vdyB0YWxraW5nIHRvIHRoZSBzY3NpIGJ1cyAqLworCQlpZiAoIXBwYV9zZWxlY3QoZGV2LCBjbWQtPmRldmljZS0+aWQpKSB7CisJCQlwcGFfZmFpbChkZXYsIERJRF9OT19DT05ORUNUKTsKKwkJCXJldHVybiAwOworCQl9CisJCWNtZC0+U0NwLnBoYXNlKys7CisKKwljYXNlIDM6CQkvKiBQaGFzZSAzIC0gUmVhZHkgdG8gYWNjZXB0IGEgY29tbWFuZCAqLworCQl3X2N0cihwcGIsIDB4MGMpOworCQlpZiAoIShyX3N0cihwcGIpICYgMHg4MCkpCisJCQlyZXR1cm4gMTsKKworCQlpZiAoIXBwYV9zZW5kX2NvbW1hbmQoY21kKSkKKwkJCXJldHVybiAwOworCQljbWQtPlNDcC5waGFzZSsrOworCisJY2FzZSA0OgkJLyogUGhhc2UgNCAtIFNldHVwIHNjYXR0ZXIvZ2F0aGVyIGJ1ZmZlcnMgKi8KKwkJaWYgKGNtZC0+dXNlX3NnKSB7CisJCQkvKiBpZiBtYW55IGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZSwgc3RhcnQgZmlsbGluZyB0aGUgZmlyc3QgKi8KKwkJCWNtZC0+U0NwLmJ1ZmZlciA9CisJCQkgICAgKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCQkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IGNtZC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCQkJY21kLT5TQ3AucHRyID0KKwkJCSAgICBwYWdlX2FkZHJlc3MoY21kLT5TQ3AuYnVmZmVyLT5wYWdlKSArCisJCQkgICAgY21kLT5TQ3AuYnVmZmVyLT5vZmZzZXQ7CisJCX0gZWxzZSB7CisJCQkvKiBlbHNlIGZpbGwgdGhlIG9ubHkgYXZhaWxhYmxlIGJ1ZmZlciAqLworCQkJY21kLT5TQ3AuYnVmZmVyID0gTlVMTDsKKwkJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJCWNtZC0+U0NwLnB0ciA9IGNtZC0+cmVxdWVzdF9idWZmZXI7CisJCX0KKwkJY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IGNtZC0+dXNlX3NnIC0gMTsKKwkJY21kLT5TQ3AucGhhc2UrKzsKKworCWNhc2UgNToJCS8qIFBoYXNlIDUgLSBEYXRhIHRyYW5zZmVyIHN0YWdlICovCisJCXdfY3RyKHBwYiwgMHgwYyk7CisJCWlmICghKHJfc3RyKHBwYikgJiAweDgwKSkKKwkJCXJldHVybiAxOworCisJCXJldHYgPSBwcGFfY29tcGxldGlvbihjbWQpOworCQlpZiAocmV0diA9PSAtMSkKKwkJCXJldHVybiAwOworCQlpZiAocmV0diA9PSAwKQorCQkJcmV0dXJuIDE7CisJCWNtZC0+U0NwLnBoYXNlKys7CisKKwljYXNlIDY6CQkvKiBQaGFzZSA2IC0gUmVhZCBzdGF0dXMvbWVzc2FnZSAqLworCQljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkJLyogQ2hlY2sgZm9yIGRhdGEgb3ZlcnJ1biAqLworCQlpZiAocHBhX3dhaXQoZGV2KSAhPSAodW5zaWduZWQgY2hhcikgMHhmMCkgeworCQkJcHBhX2ZhaWwoZGV2LCBESURfRVJST1IpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKHBwYV9pbihkZXYsICZsLCAxKSkgewkvKiByZWFkIHN0YXR1cyBieXRlICovCisJCQkvKiBDaGVjayBmb3Igb3B0aW9uYWwgbWVzc2FnZSBieXRlICovCisJCQlpZiAocHBhX3dhaXQoZGV2KSA9PSAodW5zaWduZWQgY2hhcikgMHhmMCkKKwkJCQlwcGFfaW4oZGV2LCAmaCwgMSk7CisJCQljbWQtPnJlc3VsdCA9CisJCQkgICAgKERJRF9PSyA8PCAxNikgKyAoaCA8PCA4KSArIChsICYgU1RBVFVTX01BU0spOworCQl9CisJCXJldHVybiAwOwkvKiBGaW5pc2hlZCAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygicHBhOiBJbnZhbGlkIHNjc2kgcGhhc2VcbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcGFfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJdm9pZCAoKmRvbmUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCXBwYV9zdHJ1Y3QgKmRldiA9IHBwYV9kZXYoY21kLT5kZXZpY2UtPmhvc3QpOworCisJaWYgKGRldi0+Y3VyX2NtZCkgeworCQlwcmludGsoIlBQQTogYnVnIGluIHBwYV9xdWV1ZWNvbW1hbmRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJZGV2LT5mYWlsZWQgPSAwOworCWRldi0+anN0YXJ0ID0gamlmZmllczsKKwlkZXYtPmN1cl9jbWQgPSBjbWQ7CisJY21kLT5zY3NpX2RvbmUgPSBkb25lOworCWNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OwkvKiBkZWZhdWx0IHJldHVybiBjb2RlICovCisJY21kLT5TQ3AucGhhc2UgPSAwOwkvKiBidXMgZnJlZSAqLworCisJZGV2LT5wcGFfdHEuZGF0YSA9IGRldjsKKwlzY2hlZHVsZV93b3JrKCZkZXYtPnBwYV90cSk7CisKKwlwcGFfcGJfY2xhaW0oZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorICogQXBwYXJlbnRseSB0aGUgZGlzay0+Y2FwYWNpdHkgYXR0cmlidXRlIGlzIG9mZiBieSAxIHNlY3RvciAKKyAqIGZvciBhbGwgZGlzayBkcml2ZXMuICBXZSBhZGQgdGhlIG9uZSBoZXJlLCBidXQgaXQgc2hvdWxkIHJlYWxseQorICogYmUgZG9uZSBpbiBzZC5jLiAgRXZlbiBpZiBpdCBnZXRzIGZpeGVkIHRoZXJlLCB0aGlzIHdpbGwgc3RpbGwKKyAqIHdvcmsuCisgKi8KK3N0YXRpYyBpbnQgcHBhX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwKKwkgICAgICBzZWN0b3JfdCBjYXBhY2l0eSwgaW50IGlwW10pCit7CisJaXBbMF0gPSAweDQwOworCWlwWzFdID0gMHgyMDsKKwlpcFsyXSA9ICgodW5zaWduZWQgbG9uZykgY2FwYWNpdHkgKyAxKSAvIChpcFswXSAqIGlwWzFdKTsKKwlpZiAoaXBbMl0gPiAxMDI0KSB7CisJCWlwWzBdID0gMHhmZjsKKwkJaXBbMV0gPSAweDNmOworCQlpcFsyXSA9ICgodW5zaWduZWQgbG9uZykgY2FwYWNpdHkgKyAxKSAvIChpcFswXSAqIGlwWzFdKTsKKwkJaWYgKGlwWzJdID4gMTAyMykKKwkJCWlwWzJdID0gMTAyMzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHBhX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlwcGFfc3RydWN0ICpkZXYgPSBwcGFfZGV2KGNtZC0+ZGV2aWNlLT5ob3N0KTsKKwkvKgorCSAqIFRoZXJlIGlzIG5vIG1ldGhvZCBmb3IgYWJvcnRpbmcgY29tbWFuZHMgc2luY2UgSW9tZWdhCisJICogaGF2ZSB0aWVkIHRoZSBTQ1NJX01FU1NBR0UgbGluZSBoaWdoIGluIHRoZSBpbnRlcmZhY2UKKwkgKi8KKworCXN3aXRjaCAoY21kLT5TQ3AucGhhc2UpIHsKKwljYXNlIDA6CQkvKiBEbyBub3QgaGF2ZSBhY2Nlc3MgdG8gcGFycG9ydCAqLworCWNhc2UgMToJCS8qIEhhdmUgbm90IGNvbm5lY3RlZCB0byBpbnRlcmZhY2UgKi8KKwkJZGV2LT5jdXJfY21kID0gTlVMTDsJLyogRm9yZ2V0IHRoZSBwcm9ibGVtICovCisJCXJldHVybiBTVUNDRVNTOworCQlicmVhazsKKwlkZWZhdWx0OgkJLyogU0NTSSBjb21tYW5kIHNlbnQsIGNhbiBub3QgYWJvcnQgKi8KKwkJcmV0dXJuIEZBSUxFRDsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcGFfcmVzZXRfcHVsc2UodW5zaWduZWQgaW50IGJhc2UpCit7CisJd19kdHIoYmFzZSwgMHg0MCk7CisJd19jdHIoYmFzZSwgMHg4KTsKKwl1ZGVsYXkoMzApOworCXdfY3RyKGJhc2UsIDB4Yyk7Cit9CisKK3N0YXRpYyBpbnQgcHBhX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlwcGFfc3RydWN0ICpkZXYgPSBwcGFfZGV2KGNtZC0+ZGV2aWNlLT5ob3N0KTsKKworCWlmIChjbWQtPlNDcC5waGFzZSkKKwkJcHBhX2Rpc2Nvbm5lY3QoZGV2KTsKKwlkZXYtPmN1cl9jbWQgPSBOVUxMOwkvKiBGb3JnZXQgdGhlIHByb2JsZW0gKi8KKworCXBwYV9jb25uZWN0KGRldiwgQ09OTkVDVF9OT1JNQUwpOworCXBwYV9yZXNldF9wdWxzZShkZXYtPmJhc2UpOworCXVkZWxheSgxMDAwKTsJCS8qIGRldmljZSBzZXR0bGUgZGVsYXkgKi8KKwlwcGFfZGlzY29ubmVjdChkZXYpOworCXVkZWxheSgxMDAwKTsJCS8qIGRldmljZSBzZXR0bGUgZGVsYXkgKi8KKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBkZXZpY2VfY2hlY2socHBhX3N0cnVjdCAqZGV2KQoreworCS8qIFRoaXMgcm91dGluZSBsb29rcyBmb3IgYSBkZXZpY2UgYW5kIHRoZW4gYXR0ZW1wdHMgdG8gdXNlIEVQUAorCSAgIHRvIHNlbmQgYSBjb21tYW5kLiBJZiBhbGwgZ29lcyBhcyBwbGFubmVkIHRoZW4gRVBQIGlzIGF2YWlsYWJsZS4gKi8KKworCXN0YXRpYyBjaGFyIGNtZFs2XSA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCWludCBsb29wLCBvbGRfbW9kZSwgc3RhdHVzLCBrLCBwcGIgPSBkZXYtPmJhc2U7CisJdW5zaWduZWQgY2hhciBsOworCisJb2xkX21vZGUgPSBkZXYtPm1vZGU7CisJZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykgeworCQkvKiBBdHRlbXB0IHRvIHVzZSBFUFAgZm9yIFRlc3QgVW5pdCBSZWFkeSAqLworCQlpZiAoKHBwYiAmIDB4MDAwNykgPT0gMHgwMDAwKQorCQkJZGV2LT5tb2RlID0gUFBBX0VQUF8zMjsKKworCSAgICAgIHNlY29uZF9wYXNzOgorCQlwcGFfY29ubmVjdChkZXYsIENPTk5FQ1RfRVBQX01BWUJFKTsKKwkJLyogU2VsZWN0IFNDU0kgZGV2aWNlICovCisJCWlmICghcHBhX3NlbGVjdChkZXYsIGxvb3ApKSB7CisJCQlwcGFfZGlzY29ubmVjdChkZXYpOworCQkJY29udGludWU7CisJCX0KKwkJcHJpbnRrKCJwcGE6IEZvdW5kIGRldmljZSBhdCBJRCAlaSwgQXR0ZW1wdGluZyB0byB1c2UgJXNcbiIsCisJCSAgICAgICBsb29wLCBQUEFfTU9ERV9TVFJJTkdbZGV2LT5tb2RlXSk7CisKKwkJLyogU2VuZCBTQ1NJIGNvbW1hbmQgKi8KKwkJc3RhdHVzID0gMTsKKwkJd19jdHIocHBiLCAweDBjKTsKKwkJZm9yIChsID0gMDsgKGwgPCA2KSAmJiAoc3RhdHVzKTsgbCsrKQorCQkJc3RhdHVzID0gcHBhX291dChkZXYsIGNtZCwgMSk7CisKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCXBwYV9kaXNjb25uZWN0KGRldik7CisJCQlwcGFfY29ubmVjdChkZXYsIENPTk5FQ1RfRVBQX01BWUJFKTsKKwkJCXdfZHRyKHBwYiwgMHg0MCk7CisJCQl3X2N0cihwcGIsIDB4MDgpOworCQkJdWRlbGF5KDMwKTsKKwkJCXdfY3RyKHBwYiwgMHgwYyk7CisJCQl1ZGVsYXkoMTAwMCk7CisJCQlwcGFfZGlzY29ubmVjdChkZXYpOworCQkJdWRlbGF5KDEwMDApOworCQkJaWYgKGRldi0+bW9kZSA9PSBQUEFfRVBQXzMyKSB7CisJCQkJZGV2LT5tb2RlID0gb2xkX21vZGU7CisJCQkJZ290byBzZWNvbmRfcGFzczsKKwkJCX0KKwkJCXJldHVybiAtRUlPOworCQl9CisJCXdfY3RyKHBwYiwgMHgwYyk7CisJCWsgPSAxMDAwMDAwOwkvKiAxIFNlY29uZCAqLworCQlkbyB7CisJCQlsID0gcl9zdHIocHBiKTsKKwkJCWstLTsKKwkJCXVkZWxheSgxKTsKKwkJfSB3aGlsZSAoIShsICYgMHg4MCkgJiYgKGspKTsKKworCQlsICY9IDB4ZjA7CisKKwkJaWYgKGwgIT0gMHhmMCkgeworCQkJcHBhX2Rpc2Nvbm5lY3QoZGV2KTsKKwkJCXBwYV9jb25uZWN0KGRldiwgQ09OTkVDVF9FUFBfTUFZQkUpOworCQkJcHBhX3Jlc2V0X3B1bHNlKHBwYik7CisJCQl1ZGVsYXkoMTAwMCk7CisJCQlwcGFfZGlzY29ubmVjdChkZXYpOworCQkJdWRlbGF5KDEwMDApOworCQkJaWYgKGRldi0+bW9kZSA9PSBQUEFfRVBQXzMyKSB7CisJCQkJZGV2LT5tb2RlID0gb2xkX21vZGU7CisJCQkJZ290byBzZWNvbmRfcGFzczsKKwkJCX0KKwkJCXJldHVybiAtRUlPOworCQl9CisJCXBwYV9kaXNjb25uZWN0KGRldik7CisJCXByaW50aygicHBhOiBDb21tdW5pY2F0aW9uIGVzdGFibGlzaGVkIHdpdGggSUQgJWkgdXNpbmcgJXNcbiIsCisJCSAgICAgICBsb29wLCBQUEFfTU9ERV9TVFJJTkdbZGV2LT5tb2RlXSk7CisJCXBwYV9jb25uZWN0KGRldiwgQ09OTkVDVF9FUFBfTUFZQkUpOworCQlwcGFfcmVzZXRfcHVsc2UocHBiKTsKKwkJdWRlbGF5KDEwMDApOworCQlwcGFfZGlzY29ubmVjdChkZXYpOworCQl1ZGVsYXkoMTAwMCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgcHBhX3RlbXBsYXRlID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5wcm9jX25hbWUJCT0gInBwYSIsCisJLnByb2NfaW5mbwkJPSBwcGFfcHJvY19pbmZvLAorCS5uYW1lCQkJPSAiSW9tZWdhIFZQSTAgKHBwYSkgaW50ZXJmYWNlIiwKKwkucXVldWVjb21tYW5kCQk9IHBwYV9xdWV1ZWNvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBwcGFfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gcHBhX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSBwcGFfcmVzZXQsCisJLmJpb3NfcGFyYW0JCT0gcHBhX2Jpb3NwYXJhbSwKKwkudGhpc19pZAkJPSAtMSwKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLmNhbl9xdWV1ZQkJPSAxLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgUGFyYWxsZWwgcG9ydCBwcm9iaW5nIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIExJU1RfSEVBRChwcGFfaG9zdHMpOworCitzdGF0aWMgaW50IF9fcHBhX2F0dGFjaChzdHJ1Y3QgcGFycG9ydCAqcGIpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh3YWl0aW5nKTsKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwlwcGFfc3RydWN0ICpkZXY7CisJaW50IHBvcnRzOworCWludCBtb2RlcywgcHBiLCBwcGJfaGk7CisJaW50IGVyciA9IC1FTk9NRU07CisKKwlkZXYgPSBrbWFsbG9jKHNpemVvZihwcGFfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChkZXYsIDAsIHNpemVvZihwcGFfc3RydWN0KSk7CisJZGV2LT5iYXNlID0gLTE7CisJZGV2LT5tb2RlID0gUFBBX0FVVE9ERVRFQ1Q7CisJZGV2LT5yZWNvbl90bW8gPSBQUEFfUkVDT05fVE1POworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndhaXRpbmcpOworCWRldi0+ZGV2ID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocGIsICJwcGEiLCBOVUxMLCBwcGFfd2FrZXVwLAorCQkJCQkgICAgTlVMTCwgMCwgZGV2KTsKKworCWlmICghZGV2LT5kZXYpCisJCWdvdG8gb3V0OworCisJLyogQ2xhaW0gdGhlIGJ1cyBzbyBpdCByZW1lbWJlcnMgd2hhdCB3ZSBkbyB0byB0aGUgY29udHJvbAorCSAqIHJlZ2lzdGVycy4gWyBDVFIgYW5kIEVDUCBdCisJICovCisJZXJyID0gLUVCVVNZOworCWRldi0+d2FpdGluZyA9ICZ3YWl0aW5nOworCXByZXBhcmVfdG9fd2FpdCgmd2FpdGluZywgJndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlpZiAocHBhX3BiX2NsYWltKGRldikpCisJCXNjaGVkdWxlX3RpbWVvdXQoMyAqIEhaKTsKKwlpZiAoZGV2LT53YW50ZWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwcGElZDogZmFpbGVkIHRvIGNsYWltIHBhcnBvcnQgYmVjYXVzZSAiCisJCQkJImEgcGFyZGV2aWNlIGlzIG93bmluZyB0aGUgcG9ydCBmb3IgdG9vIGxvbmcgIgorCQkJCSJ0aW1lIVxuIiwgcGItPm51bWJlcik7CisJCXBwYV9wYl9kaXNtaXNzKGRldik7CisJCWRldi0+d2FpdGluZyA9IE5VTEw7CisJCWZpbmlzaF93YWl0KCZ3YWl0aW5nLCAmd2FpdCk7CisJCWdvdG8gb3V0MTsKKwl9CisJZGV2LT53YWl0aW5nID0gTlVMTDsKKwlmaW5pc2hfd2FpdCgmd2FpdGluZywgJndhaXQpOworCXBwYiA9IGRldi0+YmFzZSA9IGRldi0+ZGV2LT5wb3J0LT5iYXNlOworCXBwYl9oaSA9IGRldi0+ZGV2LT5wb3J0LT5iYXNlX2hpOworCXdfY3RyKHBwYiwgMHgwYyk7CisJbW9kZXMgPSBkZXYtPmRldi0+cG9ydC0+bW9kZXM7CisKKwkvKiBNb2RlIGRldGVjdGlvbiB3b3JrcyB1cCB0aGUgY2hhaW4gb2Ygc3BlZWQKKwkgKiBUaGlzIGF2b2lkcyBhIG5hc3R5IGlmLXRoZW4tZWxzZS1pZi0uLi4gdHJlZQorCSAqLworCWRldi0+bW9kZSA9IFBQQV9OSUJCTEU7CisKKwlpZiAobW9kZXMgJiBQQVJQT1JUX01PREVfVFJJU1RBVEUpCisJCWRldi0+bW9kZSA9IFBQQV9QUzI7CisKKwlpZiAobW9kZXMgJiBQQVJQT1JUX01PREVfRUNQKSB7CisJCXdfZWNyKHBwYl9oaSwgMHgyMCk7CisJCWRldi0+bW9kZSA9IFBQQV9QUzI7CisJfQorCWlmICgobW9kZXMgJiBQQVJQT1JUX01PREVfRVBQKSAmJiAobW9kZXMgJiBQQVJQT1JUX01PREVfRUNQKSkKKwkJd19lY3IocHBiX2hpLCAweDgwKTsKKworCS8qIERvbmUgY29uZmlndXJhdGlvbiAqLworCisJZXJyID0gcHBhX2luaXQoZGV2KTsKKwlwcGFfcGJfcmVsZWFzZShkZXYpOworCisJaWYgKGVycikKKwkJZ290byBvdXQxOworCisJLyogbm93IHRoZSBnbHVlIC4uLiAqLworCWlmIChkZXYtPm1vZGUgPT0gUFBBX05JQkJMRSB8fCBkZXYtPm1vZGUgPT0gUFBBX1BTMikKKwkJcG9ydHMgPSAzOworCWVsc2UKKwkJcG9ydHMgPSA4OworCisJSU5JVF9XT1JLKCZkZXYtPnBwYV90cSwgcHBhX2ludGVycnVwdCwgZGV2KTsKKworCWVyciA9IC1FTk9NRU07CisJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmcHBhX3RlbXBsYXRlLCBzaXplb2YocHBhX3N0cnVjdCAqKSk7CisJaWYgKCFob3N0KQorCQlnb3RvIG91dDE7CisJaG9zdC0+aW9fcG9ydCA9IHBiLT5iYXNlOworCWhvc3QtPm5faW9fcG9ydCA9IHBvcnRzOworCWhvc3QtPmRtYV9jaGFubmVsID0gLTE7CisJaG9zdC0+dW5pcXVlX2lkID0gcGItPm51bWJlcjsKKwkqKHBwYV9zdHJ1Y3QgKiopJmhvc3QtPmhvc3RkYXRhID0gZGV2OworCWRldi0+aG9zdCA9IGhvc3Q7CisJbGlzdF9hZGRfdGFpbCgmZGV2LT5saXN0LCAmcHBhX2hvc3RzKTsKKwllcnIgPSBzY3NpX2FkZF9ob3N0KGhvc3QsIE5VTEwpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MjsKKwlzY3NpX3NjYW5faG9zdChob3N0KTsKKwlyZXR1cm4gMDsKK291dDI6CisJbGlzdF9kZWxfaW5pdCgmZGV2LT5saXN0KTsKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworb3V0MToKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+ZGV2KTsKK291dDoKKwlrZnJlZShkZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHBwYV9hdHRhY2goc3RydWN0IHBhcnBvcnQgKnBiKQoreworCV9fcHBhX2F0dGFjaChwYik7Cit9CisKK3N0YXRpYyB2b2lkIHBwYV9kZXRhY2goc3RydWN0IHBhcnBvcnQgKnBiKQoreworCXBwYV9zdHJ1Y3QgKmRldjsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJnBwYV9ob3N0cywgbGlzdCkgeworCQlpZiAoZGV2LT5kZXYtPnBvcnQgPT0gcGIpIHsKKwkJCWxpc3RfZGVsX2luaXQoJmRldi0+bGlzdCk7CisJCQlzY3NpX3JlbW92ZV9ob3N0KGRldi0+aG9zdCk7CisJCQlzY3NpX2hvc3RfcHV0KGRldi0+aG9zdCk7CisJCQlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+ZGV2KTsKKwkJCWtmcmVlKGRldik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCBwYXJwb3J0X2RyaXZlciBwcGFfZHJpdmVyID0geworCS5uYW1lCT0gInBwYSIsCisJLmF0dGFjaAk9IHBwYV9hdHRhY2gsCisJLmRldGFjaAk9IHBwYV9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcGFfZHJpdmVyX2luaXQodm9pZCkKK3sKKwlwcmludGsoInBwYTogVmVyc2lvbiAlc1xuIiwgUFBBX1ZFUlNJT04pOworCXJldHVybiBwYXJwb3J0X3JlZ2lzdGVyX2RyaXZlcigmcHBhX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwcGFfZHJpdmVyX2V4aXQodm9pZCkKK3sKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZHJpdmVyKCZwcGFfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocHBhX2RyaXZlcl9pbml0KTsKK21vZHVsZV9leGl0KHBwYV9kcml2ZXJfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcHBhLmggYi9kcml2ZXJzL3Njc2kvcHBhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlMWExNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wcGEuaApAQCAtMCwwICsxLDE1MSBAQAorLyogIERyaXZlciBmb3IgdGhlIFBQQTMgcGFyYWxsZWwgcG9ydCBTQ1NJIEhCQSBlbWJlZGRlZCBpbiAKKyAqIHRoZSBJb21lZ2EgWklQIGRyaXZlCisgKiAKKyAqIChjKSAxOTk2ICAgICBHcmFudCBSLiBHdWVudGhlciAgZ3JhbnRAdG9ycXVlLm5ldAorICogICAgICAgICAgICAgIERhdmlkIENhbXBiZWxsICAgICBjYW1wYmVsbEB0b3JxdWUubmV0CisgKgorICogICAgICBBbGwgY29tbWVudHMgdG8gRGF2aWQuCisgKi8KKworI2lmbmRlZiBfUFBBX0gKKyNkZWZpbmUgX1BQQV9ICisKKyNkZWZpbmUgICBQUEFfVkVSU0lPTiAgICIyLjA3IChmb3IgTGludXggMi40LngpIgorCisvKiAKKyAqIHRoaXMgZHJpdmVyIGhhcyBiZWVuIGhhY2tlZCBieSBNYXR0ZW8gRnJpZ28gKGF0aGVuYUB0aGVvcnkubGNzLm1pdC5lZHUpCisgKiB0byBzdXBwb3J0IEVQUCBhbmQgc2NhdHRlci1nYXRoZXIuICAgICAgICAgICAgICAgICAgICAgICAgWzAuMjYtYXRoZW5hXQorICoKKyAqIGFkZGl0aW9uYWwgaGFja3MgYnkgRGF2aWQgQ2FtcGJlbGwKKyAqIGluIHJlc3BvbnNlIHRvIHRoaXMgZHJpdmVyICJtaXMtYmVoYXZpbmciIG9uIGhpcyBtYWNoaW5lLgorICogICAgICBGaXhlZCBFUFAgdG8gaGFuZGxlICJzb2Z0d2FyZSIgY2hhbmdpbmcgb2YgRVBQIHBvcnQgZGF0YSBkaXJlY3Rpb24uCisgKiAgICAgIENoYXNlZCBkb3duIEVQUCB0aW1lb3V0cworICogICAgICBNYWRlIHRoaXMgZHJpdmVyICJrZXJuZWwgdmVyc2lvbiBmcmllbmRseSIgICAgICAgICAgIFswLjI4LWF0aGVuYV0KKyAqCisgKiBbIFN0dWZmIHJlbW92ZWQgXQorICoKKyAqIENvcnJlY3RlZCBwcGEuaCBmb3IgMi4xLngga2VybmVscyAoPj0yLjEuODUpCisgKiBNb2RpZmllZCAiTmF0IFNlbWkgS2x1ZGdlIiBmb3IgZXh0ZW5kZWQgY2hpcHNldHMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEuNDFdCisgKgorICogRml4ZWQgaWRfcHJvYmUgZm9yIEVQUCAxLjkgY2hpcHNldHMgKG1pc2RldGVjdGVkIGFzIEVQUCAxLjcpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxLjQyXQorICoKKyAqIERldmVsb3BtZW50IHNvbGVseSBmb3IgMi4xLngga2VybmVscyBmcm9tIG5vdyBvbiEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzIuMDBdCisgKgorICogSGFjayBhbmQgc2xhc2ggYXQgdGhlIGluaXQgY29kZSAoRVBQIGRldmljZSBjaGVjayByb3V0aW5lKQorICogQWRkZWQgSU5TQU5FIG9wdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzIuMDFdCisgKgorICogUGF0Y2ggYXBwbGllZCB0byBzeW5jIGFnYWluc3QgdGhlIDIuMS54IGtlcm5lbCBjb2RlCisgKiBJbmNsdWRlZCBxYm9vdF96aXAuc2gKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzIuMDJdCisgKgorICogQ2xlYW5lZCB1cCB0aGUgbWVzcyBsZWZ0IGJ5IHNvbWVvbmUgZWxzZSB0cnlpbmcgdG8gZml4IHRoZQorICogYXNtIHNlY3Rpb24gdG8ga2VlcCBlZ2NjIGhhcHB5LiBUaGUgYXNtIHNlY3Rpb24gbm8gbG9uZ2VyCisgKiBleGlzdHMsIHRoZSBuaWJibGUgY29kZSBpcyAqYWxtb3N0KiBhcyBmYXN0IGFzIHRoZSBhc20gY29kZQorICogcHJvdmlkaW5nIGl0IGlzIGNvbXBpbGVkIHdpdGggZWdjYy4KKyAqCisgKiBPdGhlciBjbGVhbiB1cHMgaW5jbHVkZSB0aGUgZm9sbG93IGNoYW5nZXM6CisgKiAgICBDT05GSUdfU0NTSV9QUEFfSEFWRV9QRURBTlRJQyA9PiBDT05GSUdfU0NTSV9JWklQX0VQUDE2CisgKiAgICBhZGRlZCBDT05GSUdfU0NTSV9JWklQX1NMT1dfQ1RSIG9wdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMi4wM10KKyAqCisgKiBVc2UgcHBhX3dhaXQoKSB0byBjaGVjayBmb3IgcmVhZHkgQU5EIGNvbm5lY3RlZCBzdGF0dXMgYml0cworICogQWRkIHBwYV93YWl0KCkgY2FsbHMgdG8gcHBhX2NvbXBsZXRpb24oKQorICogIGJ5IFBldGVyIENoZXJyaW1hbiA8cGpjQGVjcy5zb3Rvbi5hYy51az4gYW5kCisgKiAgICAgVGltIFdhdWdoIDx0d2F1Z2hAcmVkaGF0LmNvbT4KKyAqCQkJCQkJCVsyLjA0XQorICoKKyAqIEZpeCBrZXJuZWwgcGFuaWMgb24gc2NzaSB0aW1lb3V0LCAyMDAwLTA4LTE4CQlbMi4wNV0KKyAqCisgKiBBdm9pZCBpb19yZXF1ZXN0X2xvY2sgcHJvYmxlbXMuCisgKiBKb2huIENhdmFuIDxqb2huY2F2YW5AaG9tZS5jb20+CQkJWzIuMDZdCisgKgorICogQnVzeSB3YWl0IGZvciBjb25uZWN0ZWQgc3RhdHVzIGJpdCBpbiBwcGFfY29tcGxldGlvbigpCisgKiAgaW4gb3JkZXIgdG8gY29wZSB3aXRoIHNvbWUgaGFyZHdhcmUgdGhhdCBoYXMgdGhpcyBiaXQgbG93CisgKiAgZm9yIHNob3J0IHBlcmlvZHMgb2YgdGltZS4KKyAqIEFkZCB1ZGVsYXkoKSB0byBwcGFfc2VsZWN0KCkKKyAqICBieSBQZXRlciBDaGVycmltYW4gPHBqY0BlY3Muc290b24uYWMudWs+IGFuZAorICogICAgIE9sZWcgTWFrYXJlbmtvIDxvbWFrYXJlbmtvQGN5YmVycGxhdC5ydT4gICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzIuMDddCisgKi8KKy8qIC0tLS0tLSBFTkQgT0YgVVNFUiBDT05GSUdVUkFCTEUgUEFSQU1FVEVSUyAtLS0tLSAqLworCisjaW5jbHVkZSAgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlICA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSAgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlICA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSAgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgIDxhc20vaW8uaD4KKyNpbmNsdWRlICA8c2NzaS9zY3NpX2hvc3QuaD4KKy8qIGJhdHRlcmllcyBub3QgaW5jbHVkZWQgOi0pICovCisKKy8qCisgKiBtb2RlcyBpbiB3aGljaCB0aGUgZHJpdmVyIGNhbiBvcGVyYXRlIAorICovCisjZGVmaW5lICAgUFBBX0FVVE9ERVRFQ1QgICAgICAgIDAJLyogQXV0b2RldGVjdCBtb2RlICAgICAgICAgICAgICAgICovCisjZGVmaW5lICAgUFBBX05JQkJMRSAgICAgICAgICAgIDEJLyogd29yayBpbiBzdGFuZGFyZCA0IGJpdCBtb2RlICAgICovCisjZGVmaW5lICAgUFBBX1BTMiAgICAgICAgICAgICAgIDIJLyogUFMvMiBieXRlIG1vZGUgICAgICAgICAqLworI2RlZmluZSAgIFBQQV9FUFBfOCAgICAgICAgICAgICAzCS8qIEVQUCBtb2RlLCA4IGJpdCAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgIFBQQV9FUFBfMTYgICAgICAgICAgICA0CS8qIEVQUCBtb2RlLCAxNiBiaXQgICAgICAgICAgICAgICAqLworI2RlZmluZSAgIFBQQV9FUFBfMzIgICAgICAgICAgICA1CS8qIEVQUCBtb2RlLCAzMiBiaXQgICAgICAgICAgICAgICAqLworI2RlZmluZSAgIFBQQV9VTktOT1dOICAgICAgICAgICA2CS8qIEp1c3QgaW4gY2FzZS4uLiAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgY2hhciAqUFBBX01PREVfU1RSSU5HW10gPQoreworICAgICJBdXRvZGV0ZWN0IiwKKyAgICAiU1BQIiwKKyAgICAiUFMvMiIsCisgICAgIkVQUCA4IGJpdCIsCisgICAgIkVQUCAxNiBiaXQiLAorI2lmZGVmIENPTkZJR19TQ1NJX0laSVBfRVBQMTYKKyAgICAiRVBQIDE2IGJpdCIsCisjZWxzZQorICAgICJFUFAgMzIgYml0IiwKKyNlbmRpZgorICAgICJVbmtub3duIn07CisKKy8qIG90aGVyIG9wdGlvbnMgKi8KKyNkZWZpbmUgUFBBX0JVUlNUX1NJWkUJNTEyCS8qIGRhdGEgYnVyc3Qgc2l6ZSAqLworI2RlZmluZSBQUEFfU0VMRUNUX1RNTyAgNTAwMAkvKiBob3cgbG9uZyB0byB3YWl0IGZvciB0YXJnZXQgPyAqLworI2RlZmluZSBQUEFfU1BJTl9UTU8gICAgNTAwMDAJLyogcHBhX3dhaXQgbG9vcCBsaW1pdGVyICovCisjZGVmaW5lIFBQQV9SRUNPTl9UTU8gICA1MDAJLyogc2NzaSByZWNvbm5lY3Rpb24gbG9vcCBsaW1pdGVyICovCisjZGVmaW5lIFBQQV9ERUJVRwkwCS8qIGRlYnVnZ2luZyBvcHRpb24gKi8KKyNkZWZpbmUgSU5fRVBQX01PREUoeCkgKHggPT0gUFBBX0VQUF84IHx8IHggPT0gUFBBX0VQUF8xNiB8fCB4ID09IFBQQV9FUFBfMzIpCisKKy8qIGFyZ3MgdG8gcHBhX2Nvbm5lY3QgKi8KKyNkZWZpbmUgQ09OTkVDVF9FUFBfTUFZQkUgMQorI2RlZmluZSBDT05ORUNUX05PUk1BTCAgMAorCisjZGVmaW5lIHJfZHRyKHgpICAgICAgICAodW5zaWduZWQgY2hhcilpbmIoKHgpKQorI2RlZmluZSByX3N0cih4KSAgICAgICAgKHVuc2lnbmVkIGNoYXIpaW5iKCh4KSsxKQorI2RlZmluZSByX2N0cih4KSAgICAgICAgKHVuc2lnbmVkIGNoYXIpaW5iKCh4KSsyKQorI2RlZmluZSByX2VwcCh4KSAgICAgICAgKHVuc2lnbmVkIGNoYXIpaW5iKCh4KSs0KQorI2RlZmluZSByX2ZpZm8oeCkgICAgICAgKHVuc2lnbmVkIGNoYXIpaW5iKCh4KSkgLyogeCBtdXN0IGJlIGJhc2VfaGkgKi8KKwkJCQkJLyogT24gUENJIGlzIGJhc2UrMHg0MDAgIT0gYmFzZV9oaSAqLworI2RlZmluZSByX2Vjcih4KSAgICAgICAgKHVuc2lnbmVkIGNoYXIpaW5iKCh4KSsweDIpIC8qIHggbXVzdCBiZSBiYXNlX2hpICovCisKKyNkZWZpbmUgd19kdHIoeCx5KSAgICAgIG91dGIoeSwgKHgpKQorI2RlZmluZSB3X3N0cih4LHkpICAgICAgb3V0Yih5LCAoeCkrMSkKKyNkZWZpbmUgd19lcHAoeCx5KSAgICAgIG91dGIoeSwgKHgpKzQpCisjZGVmaW5lIHdfZmlmbyh4LHkpICAgICBvdXRiKHksICh4KSkJLyogeCBtdXN0IGJlIGJhc2VfaGkgKi8KKyNkZWZpbmUgd19lY3IoeCx5KSAgICAgIG91dGIoeSwgKHgpKzB4MikvKiB4IG11c3QgYmUgYmFzZV9oaSAqLworCisjaWZkZWYgQ09ORklHX1NDU0lfSVpJUF9TTE9XX0NUUgorI2RlZmluZSB3X2N0cih4LHkpICAgICAgb3V0Yl9wKHksICh4KSsyKQorI2Vsc2UKKyNkZWZpbmUgd19jdHIoeCx5KSAgICAgIG91dGIoeSwgKHgpKzIpCisjZW5kaWYKKworc3RhdGljIGludCBwcGFfZW5naW5lKHBwYV9zdHJ1Y3QgKiwgc3RydWN0IHNjc2lfY21uZCAqKTsKKworI2VuZGlmCQkJCS8qIF9QUEFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BzaTI0MGkuYyBiL2RyaXZlcnMvc2NzaS9wc2kyNDBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY1NzZkNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wc2kyNDBpLmMKQEAgLTAsMCArMSw2ODUgQEAKKy8qK00qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQZXJjZXB0aXZlIFNvbHV0aW9ucywgSW5jLiBQU0ktMjQwSSBkZXZpY2UgZHJpdmVyIHByb2Mgc3VwcG9ydCBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3IFBlcmNlcHRpdmUgU29sdXRpb25zLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKgorICoJRmlsZSBOYW1lOgkJcHNpMjQwaS5jCisgKgorICoJRGVzY3JpcHRpb246CVNDU0kgZHJpdmVyIGZvciB0aGUgUFNJMjQwSSBFSURFIGludGVyZmFjZSBjYXJkLgorICoKKyAqLU0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2luY2x1ZGUgInBzaTI0MGkuaCIKKyNpbmNsdWRlICJwc2lfY2hpcC5oIgorCisvLyNkZWZpbmUgREVCVUcgMQorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREVCKHgpIHgKKyNlbHNlCisjZGVmaW5lIERFQih4KQorI2VuZGlmCisKKyNkZWZpbmUgTUFYQk9BUkRTIDYJLyogSW5jcmVhc2UgdGhpcyBhbmQgdGhlIHNpemVzIG9mIHRoZSBhcnJheXMgYmVsb3csIGlmIHlvdSBuZWVkIG1vcmUuICovCisKKyNkZWZpbmUJUE9SVF9EQVRBCQkJCTAKKyNkZWZpbmUJUE9SVF9FUlJPUgkJCQkxCisjZGVmaW5lCVBPUlRfU0VDVE9SX0NPVU5UCQkyCisjZGVmaW5lCVBPUlRfTEJBXzAJCQkJMworI2RlZmluZQlQT1JUX0xCQV84CQkJCTQKKyNkZWZpbmUJUE9SVF9MQkFfMTYJCQkJNQorI2RlZmluZQlQT1JUX0xCQV8yNAkJCQk2CisjZGVmaW5lCVBPUlRfU1RBVF9DTUQJCQk3CisjZGVmaW5lCVBPUlRfU0VMX0ZBSUwJCQk4CisjZGVmaW5lCVBPUlRfSVJRX1NUQVRVUwkJCTkKKyNkZWZpbmUJUE9SVF9BRERSRVNTCQkJMTAKKyNkZWZpbmUJUE9SVF9GQUlMCQkJCTExCisjZGVmaW5lCVBPUlRfQUxUX1NUQVQJCSAgIAkxMgorCit0eXBlZGVmIHN0cnVjdAorCXsKKwlVQ0hBUgkJICAgCWRldmljZTsJCQkJLy8gZGV2aWNlIGNvZGUKKwlVQ0hBUgkJCWJ5dGU2OwkJCQkvLyBkZXZpY2Ugc2VsZWN0IHJlZ2lzdGVyIGltYWdlCisJVUNIQVIJCQlzcGlnb3Q7CQkJCS8vIHNwaWdvdCBudW1iZXIKKwlVQ0hBUgkJCWV4cGVjdGluZ0lSUTsJCS8vIGZsYWcgZm9yIGV4cGVjdGluZyBhbmQgaW50ZXJydXB0CisJVVNIT1JUCQkJc2VjdG9yczsJCQkvLyBudW1iZXIgb2Ygc2VjdG9ycyBwZXIgdHJhY2sKKwlVU0hPUlQJCQloZWFkczsJCQkJLy8gbnVtYmVyIG9mIGhlYWRzCisJVVNIT1JUCQkJY3lsaW5kZXJzOwkJCS8vIG51bWJlciBvZiBjeWxpbmRlcnMgZm9yIHRoaXMgZGV2aWNlCisJVVNIT1JUCQkJc3BhcmV3b3JkOwkJCS8vIHBsYWNlaG9sZGVyCisJVUxPTkcJCQlibG9ja3M7CQkJCS8vIG51bWJlciBvZiBibG9ja3Mgb24gZGV2aWNlCisJfQlPVVJfREVWSUNFLCAqUE9VUl9ERVZJQ0U7CisKK3R5cGVkZWYgc3RydWN0CisJeworCVVTSE9SVAkJIHBvcnRzWzEzXTsKKwlPVVJfREVWSUNFCSBkZXZpY2VbOF07CisJU2NzaV9DbW5kCSpwU0NtbmQ7CisJSURFX1NUUlVDVAkgaWRlOworCVVMT05HCQkgc3RhcnRTZWN0b3I7CisJVVNIT1JUCQkgc2VjdG9yQ291bnQ7CisJU2NzaV9DbW5kCSpTQ3BudDsKKwlWT0lECQkqYnVmZmVyOworCVVTSE9SVAkJIGV4cGVjdGluZ0lSUTsKKwl9CUFEQVBURVIyNDBJLCAqUEFEQVBURVIyNDBJOworCisjZGVmaW5lIEhPU1REQVRBKGhvc3QpICgoUEFEQVBURVIyNDBJKSZob3N0LT5ob3N0ZGF0YSkKKworc3RhdGljIHN0cnVjdAlTY3NpX0hvc3QgKlBzaUhvc3RbNl0gPSB7TlVMTCx9OyAgLyogT25lIGZvciBlYWNoIElSUSBsZXZlbCAoMTAtMTUpICovCitzdGF0aWMJCQlJREVOVElGWV9EQVRBCWlkZW50aWZ5RGF0YTsKK3N0YXRpYwkJCVNFVFVQCQkJQ2hpcFNldHVwOworCitzdGF0aWMJVVNIT1JUCXBvcnRBZGRyWzZdID0ge0NISVBfQURSU18wLCBDSElQX0FEUlNfMSwgQ0hJUF9BRFJTXzIsIENISVBfQURSU18zLCBDSElQX0FEUlNfNCwgQ0hJUF9BRFJTXzV9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJV3JpdGVEYXRhCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglXcml0ZSBkYXRhIHRvIGRldmljZS4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICoJUmV0dXJuczoJCVRSVUUgaWYgZHJpdmUgZG9lcyBub3QgYXNzZXJ0IERSUSBpbiB0aW1lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBXcml0ZURhdGEgKFBBREFQVEVSMjQwSSBwYWRhcHRlcikKKwl7CisJVUxPTkcJdGltZXI7CisJVVNIT1JUICpwcG9ydHMgPSBwYWRhcHRlci0+cG9ydHM7CisKKwl0aW1lciA9IGppZmZpZXMgKyBUSU1FT1VUX0RSUTsJCQkJCQkJCS8vIGNhbGN1bGF0ZSB0aGUgdGltZW91dCB2YWx1ZQorCWRvICB7CisJCWlmICggaW5iX3AgKHBwb3J0c1tQT1JUX1NUQVRfQ01EXSkgJiBJREVfU1RBVFVTX0RSUSApCisJCQl7CisJCQlvdXRzdyAocHBvcnRzW1BPUlRfREFUQV0sIHBhZGFwdGVyLT5idWZmZXIsIChVU0hPUlQpcGFkYXB0ZXItPmlkZS5pZGUuaWRlWzJdICogMjU2KTsKKwkJCXJldHVybiAwOworCQkJfQorCQl9CXdoaWxlICggdGltZV9hZnRlcih0aW1lciwgamlmZmllcykgKTsJCQkJCQkJCQkvLyB0ZXN0IGZvciB0aW1lb3V0CisKKwlwYWRhcHRlci0+aWRlLmlkZS5pZGVzLmNtZCA9IDA7CQkJCQkJCQkJLy8gbnVsbCBvdXQgdGhlIGNvbW1hbmQgYnl0ZQorCXJldHVybiAxOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglJZGVDbWQJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVByb2Nlc3MgYSBxdWV1ZWQgY29tbWFuZCBmcm9tIHRoZSBTQ1NJIG1hbmFnZXIuCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoKKyAqCVJldHVybnM6CQlaZXJvIGlmIG5vIGVycm9yIG9yIHN0YXR1cyByZWdpc3RlciBjb250ZW50cyBvbiBlcnJvci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBVQ0hBUiBJZGVDbWQgKFBBREFQVEVSMjQwSSBwYWRhcHRlcikKKwl7CisJVUxPTkcJdGltZXI7CisJVVNIT1JUICpwcG9ydHMgPSBwYWRhcHRlci0+cG9ydHM7CisJVUNIQVIJc3RhdHVzOworCisJb3V0Yl9wIChwYWRhcHRlci0+aWRlLmlkZS5pZGVzLnNwaWdvdCwgcHBvcnRzW1BPUlRfU0VMX0ZBSUxdKTsJLy8gc2VsZWN0IHRoZSBzcGlnb3QKKwlvdXRiX3AgKHBhZGFwdGVyLT5pZGUuaWRlLmlkZVs2XSwgcHBvcnRzW1BPUlRfTEJBXzI0XSk7CQkJLy8gc2VsZWN0IHRoZSBkcml2ZQorCXRpbWVyID0gamlmZmllcyArIFRJTUVPVVRfUkVBRFk7CQkJCQkJCS8vIGNhbGN1bGF0ZSB0aGUgdGltZW91dCB2YWx1ZQorCWRvICB7CisJCXN0YXR1cyA9IGluYl9wIChwYWRhcHRlci0+cG9ydHNbUE9SVF9TVEFUX0NNRF0pOworCQlpZiAoIHN0YXR1cyAmIElERV9TVEFUVVNfRFJEWSApCisJCQl7CisJCQlvdXRiX3AgKHBhZGFwdGVyLT5pZGUuaWRlLmlkZVsyXSwgcHBvcnRzW1BPUlRfU0VDVE9SX0NPVU5UXSk7CisJCQlvdXRiX3AgKHBhZGFwdGVyLT5pZGUuaWRlLmlkZVszXSwgcHBvcnRzW1BPUlRfTEJBXzBdKTsKKwkJCW91dGJfcCAocGFkYXB0ZXItPmlkZS5pZGUuaWRlWzRdLCBwcG9ydHNbUE9SVF9MQkFfOF0pOworCQkJb3V0Yl9wIChwYWRhcHRlci0+aWRlLmlkZS5pZGVbNV0sIHBwb3J0c1tQT1JUX0xCQV8xNl0pOworCQkJcGFkYXB0ZXItPmV4cGVjdGluZ0lSUSA9IDE7CisJCQlvdXRiX3AgKHBhZGFwdGVyLT5pZGUuaWRlLmlkZVs3XSwgcHBvcnRzW1BPUlRfU1RBVF9DTURdKTsKKworCQkJaWYgKCBwYWRhcHRlci0+aWRlLmlkZS5pZGVzLmNtZCA9PSBJREVfQ01EX1dSSVRFX01VTFRJUExFICkKKwkJCQlyZXR1cm4gKFdyaXRlRGF0YSAocGFkYXB0ZXIpKTsKKworCQkJcmV0dXJuIDA7CisJCQl9CisJCX0Jd2hpbGUgKCB0aW1lX2FmdGVyKHRpbWVyLCBqaWZmaWVzKSApOwkJCQkJCQkJCS8vIHRlc3QgZm9yIHRpbWVvdXQKKworCXBhZGFwdGVyLT5pZGUuaWRlLmlkZXMuY21kID0gMDsJCQkJCQkJCQkvLyBudWxsIG91dCB0aGUgY29tbWFuZCBieXRlCisJcmV0dXJuIHN0YXR1czsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJU2V0dXBUcmFuc2Zlcgk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJU2V0dXAgYSBkYXRhIHRyYW5zZmVyIGNvbW1hbmQuCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoJCQkJCWRyaXZlCSAtIERyaXZlL2hlYWQgcmVnaXN0ZXIgdXBwZXIgbmliYmxlIG9ubHkuCisgKgorICoJUmV0dXJuczoJCVRSVUUgaWYgbm8gZGF0YSB0byB0cmFuc2Zlci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgU2V0dXBUcmFuc2ZlciAoUEFEQVBURVIyNDBJIHBhZGFwdGVyLCBVQ0hBUiBkcml2ZSkKKwl7CisJaWYgKCBwYWRhcHRlci0+c2VjdG9yQ291bnQgKQorCQl7CisJCSooVUxPTkcgKilwYWRhcHRlci0+aWRlLmlkZS5pZGVzLmxiYSA9IHBhZGFwdGVyLT5zdGFydFNlY3RvcjsKKwkJcGFkYXB0ZXItPmlkZS5pZGUuaWRlWzZdIHw9IGRyaXZlOworCQlwYWRhcHRlci0+aWRlLmlkZS5pZGVzLnNlY3RvcnMgPSAoIHBhZGFwdGVyLT5zZWN0b3JDb3VudCA+IFNFQ1RPUlNYRkVSICkgPyBTRUNUT1JTWEZFUiA6IHBhZGFwdGVyLT5zZWN0b3JDb3VudDsKKwkJcGFkYXB0ZXItPnNlY3RvckNvdW50IC09IHBhZGFwdGVyLT5pZGUuaWRlLmlkZXMuc2VjdG9yczsJLy8gYnVtcCB0aGUgc3RhcnQgYW5kIGNvdW50IGZvciBuZXh0IHhmZXIKKwkJcGFkYXB0ZXItPnN0YXJ0U2VjdG9yICs9IHBhZGFwdGVyLT5pZGUuaWRlLmlkZXMuc2VjdG9yczsKKwkJcmV0dXJuIDA7CisJCX0KKwllbHNlCisJCXsKKwkJcGFkYXB0ZXItPmlkZS5pZGUuaWRlcy5jbWQgPSAwOwkJCQkJCQkJLy8gbnVsbCBvdXQgdGhlIGNvbW1hbmQgYnl0ZQorCQlwYWRhcHRlci0+U0NwbnQgPSBOVUxMOworCQlyZXR1cm4gMTsKKwkJfQorCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglEZWNvZGVFcnJvcgk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJRGVjb2RlIGFuZCBwcm9jZXNzIGRldmljZSBlcnJvcnMuCisgKgorICoJUGFyYW1ldGVyczoJCXBzaG9zdCAtIFBvaW50ZXIgdG8gaG9zdCBkYXRhIGJsb2NrLgorICoJCQkJCXN0YXR1cyAtIFN0YXR1cyByZWdpc3RlciBjb2RlLgorICoKKyAqCVJldHVybnM6CQlUaGUgZHJpdmVyIHN0YXR1cyBjb2RlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVMT05HIERlY29kZUVycm9yIChzdHJ1Y3QgU2NzaV9Ib3N0ICpwc2hvc3QsIFVDSEFSIHN0YXR1cykKKwl7CisJUEFEQVBURVIyNDBJCXBhZGFwdGVyID0gSE9TVERBVEEocHNob3N0KTsKKwlVQ0hBUgkJCWVycm9yOworCisJcGFkYXB0ZXItPmV4cGVjdGluZ0lSUSA9IDA7CisJcGFkYXB0ZXItPlNDcG50ID0gTlVMTDsKKwlpZiAoIHN0YXR1cyAmIElERV9TVEFUVVNfV1JJVEVfRkFVTFQgKQorCQl7CisJCXJldHVybiBESURfUEFSSVRZIDw8IDE2OworCQl9CisJaWYgKCBzdGF0dXMgJiBJREVfU1RBVFVTX0JVU1kgKQorCQlyZXR1cm4gRElEX0JVU19CVVNZIDw8IDE2OworCisJZXJyb3IgPSBpbmJfcCAocGFkYXB0ZXItPnBvcnRzW1BPUlRfRVJST1JdKTsKKwlERUIocHJpbnRrICgiXG5wc2kyNDBpIGVycm9yIHJlZ2lzdGVyOiAleCIsIGVycm9yKSk7CisJc3dpdGNoICggZXJyb3IgKQorCQl7CisJCWNhc2UgSURFX0VSUk9SX0FNTkY6CisJCWNhc2UgSURFX0VSUk9SX1RLT05GOgorCQljYXNlIElERV9FUlJPUl9BQlJUOgorCQljYXNlIElERV9FUlJPUl9JREZOOgorCQljYXNlIElERV9FUlJPUl9VTkM6CisJCWNhc2UgSURFX0VSUk9SX0JCSzoKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBESURfRVJST1IgPDwgMTY7CisJCX0KKwlyZXR1cm4gRElEX0VSUk9SIDw8IDE2OworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglJcnFfSGFuZGxlcgk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJSW50ZXJydXB0IGhhbmRsZXIuCisgKgorICoJUGFyYW1ldGVyczoJCWlycQkJLSBIYXJkd2FyZSBJUlEgbnVtYmVyLgorICoJCQkJCWRldl9pZAktCisgKgkJCQkJcmVncwktCisgKgorICoJUmV0dXJuczoJCVRSVUUgaWYgZHJpdmUgaXMgbm90IHJlYWR5IGluIHRpbWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBJcnFfSGFuZGxlciAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKwl7CisJc3RydWN0IFNjc2lfSG9zdCAgICpzaG9zdDsJCQkvLyBQb2ludGVyIHRvIGhvc3QgZGF0YSBibG9jaworCVBBREFQVEVSMjQwSQkJcGFkYXB0ZXI7CQkvLyBQb2ludGVyIHRvIGFkYXB0ZXIgY29udHJvbCBzdHJ1Y3R1cmUKKwlVU0hPUlQJCSAJICAgKnBwb3J0czsJCQkvLyBJL08gcG9ydCBhcnJheQorCVNjc2lfQ21uZAkJICAgKlNDcG50OworCVVDSEFSCQkJCXN0YXR1czsKKwlpbnQJCQkJCXo7CisKKwlERUIocHJpbnRrICgiXG5wc2kyNDBpIHJlY2VpdmVkIGludGVycnVwdFxuIikpOworCisJc2hvc3QgPSBQc2lIb3N0W2lycSAtIDEwXTsKKwlpZiAoICFzaG9zdCApCisJCXBhbmljICgiU3BsdW5nZSEiKTsKKworCXBhZGFwdGVyID0gSE9TVERBVEEoc2hvc3QpOworCXBwb3J0cyA9IHBhZGFwdGVyLT5wb3J0czsKKwlTQ3BudCA9IHBhZGFwdGVyLT5TQ3BudDsKKworCWlmICggIXBhZGFwdGVyLT5leHBlY3RpbmdJUlEgKQorCQl7CisJCURFQihwcmludGsgKCJcbnBzaTI0MGkgVW5zb2xpY2l0ZWQgaW50ZXJydXB0XG4iKSk7CisJCXJldHVybjsKKwkJfQorCXBhZGFwdGVyLT5leHBlY3RpbmdJUlEgPSAwOworCisJc3RhdHVzID0gaW5iX3AgKHBhZGFwdGVyLT5wb3J0c1tQT1JUX1NUQVRfQ01EXSk7CQkJLy8gcmVhZCB0aGUgZGV2aWNlIHN0YXR1cworCWlmICggc3RhdHVzICYgKElERV9TVEFUVVNfRVJST1IgfCBJREVfU1RBVFVTX1dSSVRFX0ZBVUxUKSApCisJCWdvdG8gaXJxZXJyb3I7CisKKwlERUIocHJpbnRrICgiXG5wc2kyNDBpIHByb2Nlc3NpbmcgaW50ZXJydXB0IikpOworCXN3aXRjaCAoIHBhZGFwdGVyLT5pZGUuaWRlLmlkZXMuY21kICkJCQkJCQkJLy8gZGVjaWRlIGhvdyB0byBoYW5kbGUgdGhlIGludGVycnVwdAorCQl7CisJCWNhc2UgSURFX0NNRF9SRUFEX01VTFRJUExFOgorCQkJaWYgKCBzdGF0dXMgJiBJREVfU1RBVFVTX0RSUSApCisJCQkJeworCQkJCWluc3cgKHBwb3J0c1tQT1JUX0RBVEFdLCBwYWRhcHRlci0+YnVmZmVyLCAoVVNIT1JUKXBhZGFwdGVyLT5pZGUuaWRlLmlkZXMuc2VjdG9ycyAqIDI1Nik7CisJCQkJcGFkYXB0ZXItPmJ1ZmZlciArPSBwYWRhcHRlci0+aWRlLmlkZS5pZGVzLnNlY3RvcnMgKiA1MTI7CisJCQkJaWYgKCBTZXR1cFRyYW5zZmVyIChwYWRhcHRlciwgcGFkYXB0ZXItPmlkZS5pZGUuaWRlWzZdICYgMHhGMCkgKQorCQkJCQl7CisJCQkJCVNDcG50LT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisJCQkJCXBhZGFwdGVyLT5TQ3BudCA9IE5VTEw7CisJCQkJCVNDcG50LT5zY3NpX2RvbmUgKFNDcG50KTsKKwkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJaWYgKCAhKHN0YXR1cyA9IElkZUNtZCAocGFkYXB0ZXIpKSApCisJCQkJCXJldHVybjsKKwkJCQl9CisJCQlicmVhazsKKworCQljYXNlIElERV9DTURfV1JJVEVfTVVMVElQTEU6CisJCQlwYWRhcHRlci0+YnVmZmVyICs9IHBhZGFwdGVyLT5pZGUuaWRlLmlkZXMuc2VjdG9ycyAqIDUxMjsKKwkJCWlmICggU2V0dXBUcmFuc2ZlciAocGFkYXB0ZXIsIHBhZGFwdGVyLT5pZGUuaWRlLmlkZVs2XSAmIDB4RjApICkKKwkJCQl7CisJCQkJU0NwbnQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkJCQlwYWRhcHRlci0+U0NwbnQgPSBOVUxMOworCQkJCVNDcG50LT5zY3NpX2RvbmUgKFNDcG50KTsKKwkJCQlyZXR1cm47CisJCQkJfQorCQkJaWYgKCAhKHN0YXR1cyA9IElkZUNtZCAocGFkYXB0ZXIpKSApCisJCQkJcmV0dXJuOworCQkJYnJlYWs7CisKKwkJY2FzZSBJREVfQ09NTUFORF9JREVOVElGWToKKwkJCXsKKwkJCVBJTlFVSVJZREFUQQlwaW5xdWlyeURhdGEgID0gU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCisJCQlpZiAoIHN0YXR1cyAmIElERV9TVEFUVVNfRFJRICkKKwkJCQl7CisJCQkJaW5zdyAocHBvcnRzW1BPUlRfREFUQV0sICZpZGVudGlmeURhdGEsIHNpemVvZiAoaWRlbnRpZnlEYXRhKSA+PiAxKTsKKworCQkJCW1lbXNldCAocGlucXVpcnlEYXRhLCAwLCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuKTsJCS8vIFplcm8gSU5RVUlSWSBkYXRhIHN0cnVjdHVyZS4KKwkJCQlwaW5xdWlyeURhdGEtPkRldmljZVR5cGUgPSAwOworCQkJCXBpbnF1aXJ5RGF0YS0+VmVyc2lvbnMgPSAyOworCQkJCXBpbnF1aXJ5RGF0YS0+QWRkaXRpb25hbExlbmd0aCA9IDM1IC0gNDsKKworCQkJCS8vIEZpbGwgaW4gdmVuZG9yIGlkZW50aWZpY2F0aW9uIGZpZWxkcy4KKwkJCQlmb3IgKCB6ID0gMDsgIHogPCAyMDsgIHogKz0gMiApCisJCQkJCXsKKwkJCQkJcGlucXVpcnlEYXRhLT5WZW5kb3JJZFt6XQkgID0gKChVQ0hBUiAqKWlkZW50aWZ5RGF0YS5Nb2RlbE51bWJlcilbeiArIDFdOworCQkJCQlwaW5xdWlyeURhdGEtPlZlbmRvcklkW3ogKyAxXSA9ICgoVUNIQVIgKilpZGVudGlmeURhdGEuTW9kZWxOdW1iZXIpW3pdOworCQkJCQl9CisKKwkJCQkvLyBJbml0aWFsaXplIHVudXNlZCBwb3J0aW9uIG9mIHByb2R1Y3QgaWQuCisJCQkJZm9yICggeiA9IDA7ICB6IDwgNDsgIHorKyApCisJCQkJCXBpbnF1aXJ5RGF0YS0+UHJvZHVjdElkWzEyICsgel0gPSAnICc7CisKKwkJCQkvLyBNb3ZlIGZpcm13YXJlIHJldmlzaW9uIGZyb20gSURFTlRJRlkgZGF0YSB0bworCQkJCS8vIHByb2R1Y3QgcmV2aXNpb24gaW4gSU5RVUlSWSBkYXRhLgorCQkJCWZvciAoIHogPSAwOyAgeiA8IDQ7ICB6ICs9IDIgKQorCQkJCQl7CisJCQkJCXBpbnF1aXJ5RGF0YS0+UHJvZHVjdFJldmlzaW9uTGV2ZWxbel0JID0gKChVQ0hBUiAqKWlkZW50aWZ5RGF0YS5GaXJtd2FyZVJldmlzaW9uKVt6ICsgMV07CisJCQkJCXBpbnF1aXJ5RGF0YS0+UHJvZHVjdFJldmlzaW9uTGV2ZWxbeiArIDFdID0gKChVQ0hBUiAqKWlkZW50aWZ5RGF0YS5GaXJtd2FyZVJldmlzaW9uKVt6XTsKKwkJCQkJfQorCisJCQkJU0NwbnQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkJCQlwYWRhcHRlci0+U0NwbnQgPSBOVUxMOworCQkJCVNDcG50LT5zY3NpX2RvbmUgKFNDcG50KTsKKwkJCQlyZXR1cm47CisJCQkJfQorCQkJYnJlYWs7CisJCQl9CisKKwkJZGVmYXVsdDoKKwkJCVNDcG50LT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisJCQlwYWRhcHRlci0+U0NwbnQgPSBOVUxMOworCQkJU0NwbnQtPnNjc2lfZG9uZSAoU0NwbnQpOworCQkJcmV0dXJuOworCQl9CisKK2lycWVycm9yOjsKKwlERUIocHJpbnRrICgiXG5wc2kyNDBpIGVycm9yICBEZXZpY2UgU3RhdHVzOiAlWFxuIiwgc3RhdHVzKSk7CisJU0NwbnQtPnJlc3VsdCA9IERlY29kZUVycm9yIChzaG9zdCwgc3RhdHVzKTsKKwlTQ3BudC0+c2NzaV9kb25lIChTQ3BudCk7CisJfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZG9fSXJxX0hhbmRsZXIgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpkZXYgPSBkZXZfaWQ7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlJcnFfSGFuZGxlcihpcnEsIGRldl9pZCwgcmVncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVBzaTI0MGlfUXVldWVDb21tYW5kCisgKgorICoJRGVzY3JpcHRpb246CVByb2Nlc3MgYSBxdWV1ZWQgY29tbWFuZCBmcm9tIHRoZSBTQ1NJIG1hbmFnZXIuCisgKgorICoJUGFyYW1ldGVyczoJCVNDcG50IC0gUG9pbnRlciB0byBTQ1NJIGNvbW1hbmQgc3RydWN0dXJlLgorICoJCQkJCWRvbmUgIC0gUG9pbnRlciB0byBkb25lIGZ1bmN0aW9uIHRvIGNhbGwuCisgKgorICoJUmV0dXJuczoJCVN0YXR1cyBjb2RlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBQc2kyNDBpX1F1ZXVlQ29tbWFuZCAoU2NzaV9DbW5kICpTQ3BudCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKKwl7CisJVUNIQVIJCSAgICpjZGIgPSAoVUNIQVIgKilTQ3BudC0+Y21uZDsJCQkJCS8vIFBvaW50ZXIgdG8gU0NTSSBDREIKKwlQQURBUFRFUjI0MEkJcGFkYXB0ZXIgPSBIT1NUREFUQSAoU0NwbnQtPmRldmljZS0+aG9zdCk7IAkJCS8vIFBvaW50ZXIgdG8gYWRhcHRlciBjb250cm9sIHN0cnVjdHVyZQorCVBPVVJfREVWSUNFIAkJcGRldgkgPSAmcGFkYXB0ZXItPmRldmljZSBbU0NwbnQtPmRldmljZS0+aWRdOy8vIFBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uCisJVUNIQVIJCQlyYzsJCQkJCQkJCQkJCS8vIGNvbW1hbmQgcmV0dXJuIGNvZGUKKworCVNDcG50LT5zY3NpX2RvbmUgPSBkb25lOworCXBhZGFwdGVyLT5pZGUuaWRlLmlkZXMuc3BpZ290ID0gcGRldi0+c3BpZ290OworCXBhZGFwdGVyLT5idWZmZXIgPSBTQ3BudC0+cmVxdWVzdF9idWZmZXI7CisJaWYgKGRvbmUpCisJCXsKKwkJaWYgKCAhcGRldi0+ZGV2aWNlICkKKwkJCXsKKwkJCVNDcG50LT5yZXN1bHQgPSBESURfQkFEX1RBUkdFVCA8PCAxNjsKKwkJCWRvbmUgKFNDcG50KTsKKwkJCXJldHVybiAwOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCXByaW50aygicHNpMjQwaV9xdWV1ZWNvbW1hbmQ6ICUwMlg6IGRvbmUgY2FuJ3QgYmUgTlVMTFxuIiwgKmNkYik7CisJCXJldHVybiAwOworCQl9CisKKwlzd2l0Y2ggKCAqY2RiICkKKwkJeworCQljYXNlIFNDU0lPUF9JTlFVSVJZOiAgIAkJCQkJLy8gaW5xdWlyeSBDREIKKwkJCXsKKwkJCXBhZGFwdGVyLT5pZGUuaWRlLmlkZVs2XSA9IHBkZXYtPmJ5dGU2OworCQkJcGFkYXB0ZXItPmlkZS5pZGUuaWRlcy5jbWQgPSBJREVfQ09NTUFORF9JREVOVElGWTsKKwkJCWJyZWFrOworCQkJfQorCisJCWNhc2UgU0NTSU9QX1RFU1RfVU5JVF9SRUFEWToJCQkvLyB0ZXN0IHVuaXQgcmVhZHkgQ0RCCisJCQlTQ3BudC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCQkJZG9uZSAoU0NwbnQpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTQ1NJT1BfUkVBRF9DQVBBQ0lUWToJCQkgIAkvLyByZWFkIGNhcGN0aXkgQ0RCCisJCQl7CisJCQlQUkVBRF9DQVBBQ0lUWV9EQVRBCXBkYXRhID0gKFBSRUFEX0NBUEFDSVRZX0RBVEEpU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCisJCQlwZGF0YS0+Ymxrc2l6ID0gMHgyMDAwMDsKKwkJCVhBTlkyU0NTSSAoKFVDSEFSICopJnBkYXRhLT5ibGtzLCBwZGV2LT5ibG9ja3MpOworCQkJU0NwbnQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkJCWRvbmUgKFNDcG50KTsKKwkJCXJldHVybiAwOworCQkJfQorCisJCWNhc2UgU0NTSU9QX1ZFUklGWToJCQkJCQkvLyB2ZXJpZnkgQ0RCCisJCQkqKFVMT05HICopcGFkYXB0ZXItPmlkZS5pZGUuaWRlcy5sYmEgPSBYU0NTSTJMT05HICgmY2RiWzJdKTsKKwkJCXBhZGFwdGVyLT5pZGUuaWRlLmlkZVs2XSB8PSBwZGV2LT5ieXRlNjsKKwkJCXBhZGFwdGVyLT5pZGUuaWRlLmlkZVsyXSA9IChVQ0hBUikoKFVTSE9SVCljZGJbOF0gfCAoKFVTSE9SVCljZGJbN10gPDwgOCkpOworCQkJcGFkYXB0ZXItPmlkZS5pZGUuaWRlcy5jbWQgPSBJREVfQ09NTUFORF9WRVJJRlk7CisJCQlicmVhazsKKworCQljYXNlIFNDU0lPUF9SRUFEOgkJCQkJCS8vIHJlYWQxMCBDREIKKwkJCXBhZGFwdGVyLT5zdGFydFNlY3RvciA9IFhTQ1NJMkxPTkcgKCZjZGJbMl0pOworCQkJcGFkYXB0ZXItPnNlY3RvckNvdW50ID0gKFVTSE9SVCljZGJbOF0gfCAoKFVTSE9SVCljZGJbN10gPDwgOCk7CisJCQlTZXR1cFRyYW5zZmVyIChwYWRhcHRlciwgcGRldi0+Ynl0ZTYpOworCQkJcGFkYXB0ZXItPmlkZS5pZGUuaWRlcy5jbWQgPSBJREVfQ01EX1JFQURfTVVMVElQTEU7CisJCQlicmVhazsKKworCQljYXNlIFNDU0lPUF9SRUFENjoJCQkJCQkvLyByZWFkNiAgQ0RCCisJCQlwYWRhcHRlci0+c3RhcnRTZWN0b3IgPSBTQ1NJMkxPTkcgKCZjZGJbMV0pOworCQkJcGFkYXB0ZXItPnNlY3RvckNvdW50ID0gY2RiWzRdOworCQkJU2V0dXBUcmFuc2ZlciAocGFkYXB0ZXIsIHBkZXYtPmJ5dGU2KTsKKwkJCXBhZGFwdGVyLT5pZGUuaWRlLmlkZXMuY21kID0gSURFX0NNRF9SRUFEX01VTFRJUExFOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1NJT1BfV1JJVEU6CQkJCQkJLy8gd3JpdGUxMCBDREIKKwkJCXBhZGFwdGVyLT5zdGFydFNlY3RvciA9IFhTQ1NJMkxPTkcgKCZjZGJbMl0pOworCQkJcGFkYXB0ZXItPnNlY3RvckNvdW50ID0gKFVTSE9SVCljZGJbOF0gfCAoKFVTSE9SVCljZGJbN10gPDwgOCk7CisJCQlTZXR1cFRyYW5zZmVyIChwYWRhcHRlciwgcGRldi0+Ynl0ZTYpOworCQkJcGFkYXB0ZXItPmlkZS5pZGUuaWRlcy5jbWQgPSBJREVfQ01EX1dSSVRFX01VTFRJUExFOworCQkJYnJlYWs7CisJCWNhc2UgU0NTSU9QX1dSSVRFNjoJCQkJCQkvLyB3cml0ZTYgIENEQgorCQkJcGFkYXB0ZXItPnN0YXJ0U2VjdG9yID0gU0NTSTJMT05HICgmY2RiWzFdKTsKKwkJCXBhZGFwdGVyLT5zZWN0b3JDb3VudCA9IGNkYls0XTsKKwkJCVNldHVwVHJhbnNmZXIgKHBhZGFwdGVyLCBwZGV2LT5ieXRlNik7CisJCQlwYWRhcHRlci0+aWRlLmlkZS5pZGVzLmNtZCA9IElERV9DTURfV1JJVEVfTVVMVElQTEU7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJREVCIChwcmludGsgKCJwc2kyNDBpX3F1ZXVlY29tbWFuZDogVW5zdXBwb3J0ZWQgY29tbWFuZCAlMDJYXG4iLCAqY2RiKSk7CisJCQlTQ3BudC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQkJZG9uZSAoU0NwbnQpOworCQkJcmV0dXJuIDA7CisJCX0KKworCXBhZGFwdGVyLT5TQ3BudCA9IFNDcG50OyAgCQkJCQkJCQkJLy8gU2F2ZSB0aGlzIGNvbW1hbmQgZGF0YQorCisJcmMgPSBJZGVDbWQgKHBhZGFwdGVyKTsKKwlpZiAoIHJjICkKKwkJeworCQlwYWRhcHRlci0+ZXhwZWN0aW5nSVJRID0gMDsKKwkJREVCIChwcmludGsgKCJwc2kyNDBpX3F1ZXVlY29tbWFuZDogJTAyWCwgJTAyWDogRGV2aWNlIGZhaWxlZCB0byByZXNwb25kIGZvciBjb21tYW5kXG4iLCAqY2RiLCBwYWRhcHRlci0+aWRlLmlkZS5pZGVzLmNtZCkpOworCQlTQ3BudC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlkb25lIChTQ3BudCk7CisJCXJldHVybiAwOworCQl9CisJREVCIChwcmludGsoInBzaTI0MGlfcXVldWVjb21tYW5kOiAlMDJYLCAlMDJYIG5vdyB3YWl0aW5nIGZvciBpbnRlcnJ1cHQgIiwgKmNkYiwgcGFkYXB0ZXItPmlkZS5pZGUuaWRlcy5jbWQpKTsKKwlyZXR1cm4gMDsKKwl9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CQkJUmVhZENoaXBNZW1vcnkKKyAqCisgKglEZXNjcmlwdGlvbjoJUmVhZCBpbmZvcm1hdGlvbiBmcm9tIGNvbnRyb2xsZXIgbWVtb3J5LgorICoKKyAqCVBhcmFtZXRlcnM6CQlwc2V0dXAJLSBQb2ludGVyIHRvIG1lbW9yeSBpbWFnZSBvZiBzZXR1cCBpbmZvcm1hdGlvbi4KKyAqCQkJCQliYXNlCS0gYmFzZSBhZGRyZXNzIG9mIG1lbW9yeS4KKyAqCQkJCQlsZW5ndGgJLSBsZW5naHQgb2YgZGF0YSBzcGFjZSBpbiBieXRlcy4KKyAqCQkJCQlwb3J0CS0gSS9PIGFkZHJlc3Mgb2YgZGF0YSBwb3J0LgorICoKKyAqCVJldHVybnM6CQlOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFJlYWRDaGlwTWVtb3J5ICh2b2lkICpwZGF0YSwgVVNIT1JUIGJhc2UsIFVTSE9SVCBsZW5ndGgsIFVTSE9SVCBwb3J0KQorCXsKKwlVU0hPUlQJeiwgeno7CisJVUNIQVIJKnBkID0gKFVDSEFSICopcGRhdGE7CisJb3V0Yl9wIChTRUxfTk9ORSwgcG9ydCArIFJFR19TRUxfRkFJTCk7CQkJCS8vIHNldHVwIGRhdGEgcG9ydAorCXp6ID0gMDsKKwl3aGlsZSAoIHp6IDwgbGVuZ3RoICkKKwkJeworCQlvdXR3X3AgKGJhc2UsIHBvcnQgKyBSRUdfQUREUkVTUyk7CQkJCS8vIHNldHVwIGFkZHJlc3MKKworCQlmb3IgKCB6ID0gMDsgIHogPCA4OyAgeisrICkKKwkJCXsKKwkJCWlmICggKHp6ICsgeikgPCBsZW5ndGggKQorCQkJKnBkKysgPSBpbmJfcCAocG9ydCArIHopOwkvLyByZWFkIGRhdGEgYnl0ZQorCQkJfQorCQl6eiArPSA4OworCQliYXNlICs9IDg7CisJCX0KKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJUHNpMjQwaV9EZXRlY3QKKyAqCisgKglEZXNjcmlwdGlvbjoJRGV0ZWN0IGFuZCBpbml0aWFsaXplIG91ciBib2FyZHMuCisgKgorICoJUGFyYW1ldGVyczoJCXRwbnQgLSBQb2ludGVyIHRvIFNDU0kgaG9zdCB0ZW1wbGF0ZSBzdHJ1Y3R1cmUuCisgKgorICoJUmV0dXJuczoJCU51bWJlciBvZiBhZGFwdGVycyBmb3VuZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgUHNpMjQwaV9EZXRlY3QgKFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCkKKwl7CisJaW50CQkJCQlib2FyZDsKKwlpbnQJCQkJCWNvdW50ID0gMDsKKwlpbnQJCQkJCXVuaXQ7CisJaW50CQkJCQl6OworCVVTSE9SVAkJCQlwb3J0LCBwb3J0X3JhbmdlID0gMTY7CisJQ0hJUF9DT05GSUdfTgkJY2hpcENvbmZpZzsKKwlDSElQX0RFVklDRV9OCQljaGlwRGV2aWNlWzhdOworCXN0cnVjdCBTY3NpX0hvc3QgICAqcHNob3N0OworCisJZm9yICggYm9hcmQgPSAwOyAgYm9hcmQgPCBNQVhCT0FSRFM7ICBib2FyZCsrICkJCQkJCS8vIHNjYW4gZm9yIEkvTyBwb3J0cworCQl7CisJCXBzaG9zdCA9IE5VTEw7CisJCXBvcnQgPSBwb3J0QWRkcltib2FyZF07CQkJCQkJCQkvLyBnZXQgYmFzZSBhZGRyZXNzIHRvIHRlc3QKKwkJaWYgKCAhcmVxdWVzdF9yZWdpb24gKHBvcnQsIHBvcnRfcmFuZ2UsICJwc2kyNDBpIikgKQorCQkJY29udGludWU7CisJCWlmICggaW5iX3AgKHBvcnQgKyBSRUdfRkFJTCkgIT0gQ0hJUF9JRCApCQkJLy8gZG8gdGhlIGZpcnN0IHRlc3QgZm9yIGxpa2xleSBob29kIHRoYXQgaXQgaXMgdXMKKwkJCWdvdG8gaG9zdF9pbml0X2ZhaWx1cmU7CisJCW91dGJfcCAoU0VMX05PTkUsIHBvcnQgKyBSRUdfU0VMX0ZBSUwpOwkJCQkvLyBzZXR1cCBFRVBST00vUkFNIGFjY2VzcworCQlvdXR3ICgwLCBwb3J0ICsgUkVHX0FERFJFU1MpOwkJCQkJCS8vIHNldHVwIEVFUFJPTSBhZGRyZXNzIHplcm8KKwkJaWYgKCBpbmJfcCAocG9ydCkgIT0gMHg1NSApCQkJCQkJCS8vIHRlc3QgMXN0IGJ5dGUKKwkJCWdvdG8gaG9zdF9pbml0X2ZhaWx1cmU7CQkJCQkJCQkJLy8gICBub3BlCisJCWlmICggaW5iX3AgKHBvcnQgKyAxKSAhPSAweEFBICkJCQkJCQkvLyB0ZXN0IDJuZCBieXRlCisJCQlnb3RvIGhvc3RfaW5pdF9mYWlsdXJlOwkJCQkJCQkJLy8gICBub3BlCisKKwkJLy8gYXQgdGhpcyBwb2ludCBvdXIgYm9hcmQgaXMgZm91bmQgYW5kIGNhbiBiZSBhY2Nlc3NlZC4gIE5vdyB3ZSBuZWVkIHRvIGluaXRpYWxpemUKKwkJLy8gb3VyIGluZm9ybWF0YXRpb24gYW5kIHJlZ2lzdGVyIHdpdGggdGhlIGtlcm5lbC4KKworCisJCVJlYWRDaGlwTWVtb3J5ICgmY2hpcENvbmZpZywgQ0hJUF9DT05GSUcsIHNpemVvZiAoY2hpcENvbmZpZyksIHBvcnQpOworCQlSZWFkQ2hpcE1lbW9yeSAoJmNoaXBEZXZpY2UsIENISVBfREVWSUNFLCBzaXplb2YgKGNoaXBEZXZpY2UpLCBwb3J0KTsKKwkJUmVhZENoaXBNZW1vcnkgKCZDaGlwU2V0dXAsIENISVBfRUVQUk9NX0RBVEEsIHNpemVvZiAoQ2hpcFNldHVwKSwgcG9ydCk7CisKKwkJaWYgKCAhY2hpcENvbmZpZy5udW1Ecml2ZXMgKQkJCQkJCS8vIGlmIG5vIGRldmljZXMgb24gdGhpcyBib2FyZAorCQkJZ290byBob3N0X2luaXRfZmFpbHVyZTsKKworCQlwc2hvc3QgPSBzY3NpX3JlZ2lzdGVyICh0cG50LCBzaXplb2YoQURBUFRFUjI0MEkpKTsKKwkJaWYocHNob3N0ID09IE5VTEwpCisJCQlnb3RvIGhvc3RfaW5pdF9mYWlsdXJlOwkKKworCQlQc2lIb3N0W2NoaXBDb25maWcuaXJxIC0gMTBdID0gcHNob3N0OworCQlwc2hvc3QtPnVuaXF1ZV9pZCA9IHBvcnQ7CisJCXBzaG9zdC0+aW9fcG9ydCA9IHBvcnQ7CisJCXBzaG9zdC0+bl9pb19wb3J0ID0gMTY7ICAvKiBOdW1iZXIgb2YgYnl0ZXMgb2YgSS9PIHNwYWNlIHVzZWQgKi8KKwkJcHNob3N0LT5pcnEgPSBjaGlwQ29uZmlnLmlycTsKKworCQlmb3IgKCB6ID0gMDsgIHogPCAxMTsgIHorKyApCQkJCQkJLy8gYnVpbGQgcmVnZXN0ZXIgYWRkcmVzcyBhcnJheQorCQkJSE9TVERBVEEocHNob3N0KS0+cG9ydHNbel0gPSBwb3J0ICsgejsKKwkJSE9TVERBVEEocHNob3N0KS0+cG9ydHNbMTFdID0gcG9ydCArIFJFR19GQUlMOworCQlIT1NUREFUQShwc2hvc3QpLT5wb3J0c1sxMl0gPSBwb3J0ICsgUkVHX0FMVF9TVEFUOworCQlERUIgKHByaW50ayAoIlxuUG9ydHMgPSIpKTsKKwkJREVCIChmb3IgKHo9MDt6PDEzO3orKykgcHJpbnRrKCIgJSMwNFgiLEhPU1REQVRBKHBzaG9zdCktPnBvcnRzW3pdKTspOworCisJCWZvciAoIHogPSAwOyAgeiA8IGNoaXBDb25maWcubnVtRHJpdmVzOyAgKyt6ICkKKwkJCXsKKwkJCXVuaXQgPSBjaGlwRGV2aWNlW3pdLmNoYW5uZWwgJiAweDBGOworCQkJSE9TVERBVEEocHNob3N0KS0+ZGV2aWNlW3VuaXRdLmRldmljZQkgPSBDaGlwU2V0dXAuc2V0dXBEZXZpY2VbdW5pdF0uZGV2aWNlOworCQkJSE9TVERBVEEocHNob3N0KS0+ZGV2aWNlW3VuaXRdLmJ5dGU2CSA9IChVQ0hBUikoKCh1bml0ICYgMSkgPDwgNCkgfCAweEUwKTsKKwkJCUhPU1REQVRBKHBzaG9zdCktPmRldmljZVt1bml0XS5zcGlnb3QJID0gKFVDSEFSKSgxIDw8ICh1bml0ID4+IDEpKTsKKwkJCUhPU1REQVRBKHBzaG9zdCktPmRldmljZVt1bml0XS5zZWN0b3JzCSA9IENoaXBTZXR1cC5zZXR1cERldmljZVt1bml0XS5zZWN0b3JzOworCQkJSE9TVERBVEEocHNob3N0KS0+ZGV2aWNlW3VuaXRdLmhlYWRzCSA9IENoaXBTZXR1cC5zZXR1cERldmljZVt1bml0XS5oZWFkczsKKwkJCUhPU1REQVRBKHBzaG9zdCktPmRldmljZVt1bml0XS5jeWxpbmRlcnMgPSBDaGlwU2V0dXAuc2V0dXBEZXZpY2VbdW5pdF0uY3lsaW5kZXJzOworCQkJSE9TVERBVEEocHNob3N0KS0+ZGV2aWNlW3VuaXRdLmJsb2NrcwkgPSBDaGlwU2V0dXAuc2V0dXBEZXZpY2VbdW5pdF0uYmxvY2tzOworCQkJREVCIChwcmludGsgKCJcbkhPU1REQVRBLT5kZXZpY2UgICAgPSAlWCIsIEhPU1REQVRBKHBzaG9zdCktPmRldmljZVt1bml0XS5kZXZpY2UpKTsKKwkJCURFQiAocHJpbnRrICgiXG4gICAgICAgICAgYnl0ZTYgICAgID0gJVgiLCBIT1NUREFUQShwc2hvc3QpLT5kZXZpY2VbdW5pdF0uYnl0ZTYpKTsKKwkJCURFQiAocHJpbnRrICgiXG4gICAgICAgICAgc3BpZ290ICAgID0gJVgiLCBIT1NUREFUQShwc2hvc3QpLT5kZXZpY2VbdW5pdF0uc3BpZ290KSk7CisJCQlERUIgKHByaW50ayAoIlxuICAgICAgICAgIHNlY3RvcnMgICA9ICVYIiwgSE9TVERBVEEocHNob3N0KS0+ZGV2aWNlW3VuaXRdLnNlY3RvcnMpKTsKKwkJCURFQiAocHJpbnRrICgiXG4gICAgICAgICAgaGVhZHMgICAgID0gJVgiLCBIT1NUREFUQShwc2hvc3QpLT5kZXZpY2VbdW5pdF0uaGVhZHMpKTsKKwkJCURFQiAocHJpbnRrICgiXG4gICAgICAgICAgY3lsaW5kZXJzID0gJVgiLCBIT1NUREFUQShwc2hvc3QpLT5kZXZpY2VbdW5pdF0uY3lsaW5kZXJzKSk7CisJCQlERUIgKHByaW50ayAoIlxuICAgICAgICAgIGJsb2NrcyAgICA9ICVsWCIsIEhPU1REQVRBKHBzaG9zdCktPmRldmljZVt1bml0XS5ibG9ja3MpKTsKKwkJCX0KKworCQlpZiAoIHJlcXVlc3RfaXJxIChjaGlwQ29uZmlnLmlycSwgZG9fSXJxX0hhbmRsZXIsIDAsICJwc2kyNDBpIiwgcHNob3N0KSA9PSAwICkgCisJCQl7CisJCQlwcmludGsoIlxuUFNJLTI0MEkgRUlERSBDT05UUk9MTEVSOiBhdCBJL08gPSAleCAgSVJRID0gJWRcbiIsIHBvcnQsIGNoaXBDb25maWcuaXJxKTsKKwkJICAgICAgICBwcmludGsoIihDKSAxOTk3IFBlcmNlcHRpdmUgU29sdXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWRcblxuIik7CisJCSAgICAgICAgY291bnQrKzsKKwkJICAgICAgICBjb250aW51ZTsKKwkJCX0KKworCQlwcmludGsgKCJVbmFibGUgdG8gYWxsb2NhdGUgSVJRIGZvciBQU0ktMjQwSSBjb250cm9sbGVyLlxuIik7CisgICAgICAgICAgIAoraG9zdF9pbml0X2ZhaWx1cmU6CisJCQorCQlyZWxlYXNlX3JlZ2lvbiAocG9ydCwgcG9ydF9yYW5nZSk7CisJCWlmIChwc2hvc3QpCisJCQlzY3NpX3VucmVnaXN0ZXIgKHBzaG9zdCk7CisKKwkJfQorCXJldHVybiBjb3VudDsKKwl9CisKK3N0YXRpYyBpbnQgUHNpMjQwaV9SZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCWlmIChzaG9zdC0+aXJxKQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBOVUxMKTsKKwlpZiAoc2hvc3QtPmlvX3BvcnQgJiYgc2hvc3QtPm5faW9fcG9ydCkKKwkJcmVsZWFzZV9yZWdpb24oc2hvc3QtPmlvX3BvcnQsIHNob3N0LT5uX2lvX3BvcnQpOworCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglQc2kyNDBpX0Jpb3NQYXJhbQorICoKKyAqCURlc2NyaXB0aW9uOglQcm9jZXNzIHRoZSBiaW9zcGFyYW0gcmVxdWVzdCBmcm9tIHRoZSBTQ1NJIG1hbmFnZXIgdG8KKyAqCQkJCQlyZXR1cm4gQy9IL1MgZGF0YS4KKyAqCisgKglQYXJhbWV0ZXJzOgkJZGlzayAtIFBvaW50ZXIgdG8gU0NTSSBkaXNrIHN0cnVjdHVyZS4KKyAqCQkJCQlkZXYJIC0gTWFqb3IvbWlub3IgbnVtYmVyIGZyb20ga2VybmVsLgorICoJCQkJCWdlb20gLSBQb2ludGVyIHRvIGludGVnZXIgYXJyYXkgdG8gcGxhY2UgZ2VvbWV0cnkgZGF0YS4KKyAqCisgKglSZXR1cm5zOgkJemVyby4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgUHNpMjQwaV9CaW9zUGFyYW0gKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LAorCQlzZWN0b3JfdCBjYXBhY2l0eSwgaW50IGdlb21bXSkKKwl7CisJUE9VUl9ERVZJQ0UJcGRldjsKKworCXBkZXYgPSAmKEhPU1REQVRBKHNkZXYtPmhvc3QpLT5kZXZpY2Vbc2Rldi0+aWRdKTsKKworCWdlb21bMF0gPSBwZGV2LT5oZWFkczsKKwlnZW9tWzFdID0gcGRldi0+c2VjdG9yczsKKwlnZW9tWzJdID0gcGRldi0+Y3lsaW5kZXJzOworCXJldHVybiAwOworCX0KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJwc2kyNDBpIiwgCisJLm5hbWUJCQk9ICJQU0ktMjQwSSBFSURFIERpc2sgQ29udHJvbGxlciIsCisJLmRldGVjdAkJCT0gUHNpMjQwaV9EZXRlY3QsCisJLnJlbGVhc2UJCT0gUHNpMjQwaV9SZWxlYXNlLAorCS5xdWV1ZWNvbW1hbmQJCT0gUHNpMjQwaV9RdWV1ZUNvbW1hbmQsCisJLmJpb3NfcGFyYW0JICAJPSBQc2kyNDBpX0Jpb3NQYXJhbSwKKwkuY2FuX3F1ZXVlCSAgCT0gMSwKKwkudGhpc19pZAkgIAk9IC0xLAorCS5zZ190YWJsZXNpemUJICAJPSBTR19OT05FLAorCS5jbWRfcGVyX2x1bgkgIAk9IDEsIAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcHNpMjQwaS5oIGIvZHJpdmVycy9zY3NpL3BzaTI0MGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTU5ODc2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BzaTI0MGkuaApAQCAtMCwwICsxLDMxNSBAQAorLyorTSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBlcmNlcHRpdmUgU29sdXRpb25zLCBJbmMuIFBTSS0yNDBJIGRldmljZSBkcml2ZXIgcHJvYyBzdXBwb3J0IGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcgUGVyY2VwdGl2ZSBTb2x1dGlvbnMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqCisgKglGaWxlIE5hbWU6CQlwc2kyNDBpLmgKKyAqCisgKglEZXNjcmlwdGlvbjoJSGVhZGVyIGZpbGUgZm9yIHRoZSBTQ1NJIGRyaXZlciBmb3IgdGhlIFBTSTI0MEkKKyAqCQkJCQlFSURFIGludGVyZmFjZSBjYXJkLgorICoKKyAqLU0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfUFNJMjQwSV9ICisjZGVmaW5lIF9QU0kyNDBJX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpZm5kZWYJUFNJX0VJREVfU0NTSU9QCisjZGVmaW5lCVBTSV9FSURFX1NDU0lPUAkxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJU29tZSBkZWZpbmVzIHRoYXQgd2UgbGlrZSAJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCUNIQVIJCWNoYXIKKyNkZWZpbmUJVUNIQVIJCXVuc2lnbmVkIGNoYXIKKyNkZWZpbmUJU0hPUlQJCXNob3J0CisjZGVmaW5lCVVTSE9SVAkJdW5zaWduZWQgc2hvcnQKKyNkZWZpbmUJQk9PTAkJdW5zaWduZWQgc2hvcnQKKyNkZWZpbmUJTE9ORwkJbG9uZworI2RlZmluZQlVTE9ORwkJdW5zaWduZWQgbG9uZworI2RlZmluZQlWT0lECQl2b2lkCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJVGltZW91dCBrb25zdGFudHMJCSAJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCVRJTUVPVVRfUkVBRFkJCQkJMTAJCS8vIDEwMCBtU2VjCisjZGVmaW5lCVRJTUVPVVRfRFJRCQkJCQk0MAkJLy8gNDAwIG1TZWMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlNaXNjLiBtYWNyb3MJCQkgCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBBTlkyU0NTSSh1cCwgcCkJCQkJCVwKKygoVUNIQVIgKil1cClbMF0gPSAoKChVTE9ORykocCkpID4+IDgpOwlcCisoKFVDSEFSICopdXApWzFdID0gKChVTE9ORykocCkpOworCisjZGVmaW5lIFNDU0kyTE9ORyh1cCkJCQkJCVwKKyggKCgobG9uZykqKCgoVUNIQVIgKil1cCkpKSA8PCAxNikJCVwKKysgKCgobG9uZykoKChVQ0hBUiAqKXVwKVsxXSkpIDw8IDgpCQlcCisrICgobG9uZykoKChVQ0hBUiAqKXVwKVsyXSkpICkKKworI2RlZmluZSBYQU5ZMlNDU0kodXAsIHApCQkJCVwKKygoVUNIQVIgKil1cClbMF0gPSAoKGxvbmcpKHApKSA+PiAyNDsJXAorKChVQ0hBUiAqKXVwKVsxXSA9ICgobG9uZykocCkpID4+IDE2OwlcCisoKFVDSEFSICopdXApWzJdID0gKChsb25nKShwKSkgPj4gODsJXAorKChVQ0hBUiAqKXVwKVszXSA9ICgobG9uZykocCkpOworCisjZGVmaW5lIFhTQ1NJMkxPTkcodXApCQkJCQlcCisoICgoKGxvbmcpKCgoVUNIQVIgKil1cClbMF0pKSA8PCAyNCkJXAorKyAoKChsb25nKSgoKFVDSEFSICopdXApWzFdKSkgPDwgMTYpCVwKKysgKCgobG9uZykoKChVQ0hBUiAqKXVwKVsyXSkpIDw8ICA4KQlcCisrICgobG9uZykoKChVQ0hBUiAqKXVwKVszXSkpICkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlTQ1NJIENEQiBvcGVyYXRpb24gY29kZXMgCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTQ1NJT1BfVEVTVF9VTklUX1JFQURZCQkweDAwCisjZGVmaW5lIFNDU0lPUF9SRVpFUk9fVU5JVAkJCTB4MDEKKyNkZWZpbmUgU0NTSU9QX1JFV0lORAkJCQkweDAxCisjZGVmaW5lIFNDU0lPUF9SRVFVRVNUX0JMT0NLX0FERFIJMHgwMgorI2RlZmluZSBTQ1NJT1BfUkVRVUVTVF9TRU5TRQkJMHgwMworI2RlZmluZSBTQ1NJT1BfRk9STUFUX1VOSVQJCQkweDA0CisjZGVmaW5lIFNDU0lPUF9SRUFEX0JMT0NLX0xJTUlUUwkweDA1CisjZGVmaW5lIFNDU0lPUF9SRUFTU0lHTl9CTE9DS1MJCTB4MDcKKyNkZWZpbmUgU0NTSU9QX1JFQUQ2CQkJCTB4MDgKKyNkZWZpbmUgU0NTSU9QX1JFQ0VJVkUJCQkJMHgwOAorI2RlZmluZSBTQ1NJT1BfV1JJVEU2CQkJCTB4MEEKKyNkZWZpbmUgU0NTSU9QX1BSSU5UCQkJCTB4MEEKKyNkZWZpbmUgU0NTSU9QX1NFTkQJCQkJCTB4MEEKKyNkZWZpbmUgU0NTSU9QX1NFRUs2CQkJCTB4MEIKKyNkZWZpbmUgU0NTSU9QX1RSQUNLX1NFTEVDVAkJCTB4MEIKKyNkZWZpbmUgU0NTSU9QX1NMRVdfUFJJTlQJCQkweDBCCisjZGVmaW5lIFNDU0lPUF9TRUVLX0JMT0NLCQkJMHgwQworI2RlZmluZSBTQ1NJT1BfUEFSVElUSU9OCQkJMHgwRAorI2RlZmluZSBTQ1NJT1BfUkVBRF9SRVZFUlNFCQkJMHgwRgorI2RlZmluZSBTQ1NJT1BfV1JJVEVfRklMRU1BUktTCQkweDEwCisjZGVmaW5lIFNDU0lPUF9GTFVTSF9CVUZGRVIJCQkweDEwCisjZGVmaW5lIFNDU0lPUF9TUEFDRQkJCQkweDExCisjZGVmaW5lIFNDU0lPUF9JTlFVSVJZCQkJCTB4MTIKKyNkZWZpbmUgU0NTSU9QX1ZFUklGWTYJCQkJMHgxMworI2RlZmluZSBTQ1NJT1BfUkVDT1ZFUl9CVUZfREFUQQkJMHgxNAorI2RlZmluZSBTQ1NJT1BfTU9ERV9TRUxFQ1QJCQkweDE1CisjZGVmaW5lIFNDU0lPUF9SRVNFUlZFX1VOSVQJCQkweDE2CisjZGVmaW5lIFNDU0lPUF9SRUxFQVNFX1VOSVQJCQkweDE3CisjZGVmaW5lIFNDU0lPUF9DT1BZCQkJCQkweDE4CisjZGVmaW5lIFNDU0lPUF9FUkFTRQkJCQkweDE5CisjZGVmaW5lIFNDU0lPUF9NT0RFX1NFTlNFCQkJMHgxQQorI2RlZmluZSBTQ1NJT1BfU1RBUlRfU1RPUF9VTklUCQkweDFCCisjZGVmaW5lIFNDU0lPUF9TVE9QX1BSSU5UCQkJMHgxQgorI2RlZmluZSBTQ1NJT1BfTE9BRF9VTkxPQUQJCQkweDFCCisjZGVmaW5lIFNDU0lPUF9SRUNFSVZFX0RJQUdOT1NUSUMJMHgxQworI2RlZmluZSBTQ1NJT1BfU0VORF9ESUFHTk9TVElDCQkweDFECisjZGVmaW5lIFNDU0lPUF9NRURJVU1fUkVNT1ZBTAkJMHgxRQorI2RlZmluZSBTQ1NJT1BfUkVBRF9DQVBBQ0lUWQkJMHgyNQorI2RlZmluZSBTQ1NJT1BfUkVBRAkJCQkJMHgyOAorI2RlZmluZSBTQ1NJT1BfV1JJVEUJCQkJMHgyQQorI2RlZmluZSBTQ1NJT1BfU0VFSwkJCQkJMHgyQgorI2RlZmluZSBTQ1NJT1BfTE9DQVRFCQkJCTB4MkIKKyNkZWZpbmUgU0NTSU9QX1dSSVRFX1ZFUklGWQkJCTB4MkUKKyNkZWZpbmUgU0NTSU9QX1ZFUklGWQkJCQkweDJGCisjZGVmaW5lIFNDU0lPUF9TRUFSQ0hfREFUQV9ISUdICQkweDMwCisjZGVmaW5lIFNDU0lPUF9TRUFSQ0hfREFUQV9FUVVBTAkweDMxCisjZGVmaW5lIFNDU0lPUF9TRUFSQ0hfREFUQV9MT1cJCTB4MzIKKyNkZWZpbmUgU0NTSU9QX1NFVF9MSU1JVFMJCQkweDMzCisjZGVmaW5lIFNDU0lPUF9SRUFEX1BPU0lUSU9OCQkweDM0CisjZGVmaW5lIFNDU0lPUF9TWU5DSFJPTklaRV9DQUNIRQkweDM1CisjZGVmaW5lIFNDU0lPUF9DT01QQVJFCQkJCTB4MzkKKyNkZWZpbmUgU0NTSU9QX0NPUFlfQ09NUEFSRQkJCTB4M0EKKyNkZWZpbmUgU0NTSU9QX1dSSVRFX0RBVEFfQlVGRgkJMHgzQgorI2RlZmluZSBTQ1NJT1BfUkVBRF9EQVRBX0JVRkYJCTB4M0MKKyNkZWZpbmUgU0NTSU9QX0NIQU5HRV9ERUZJTklUSU9OCTB4NDAKKyNkZWZpbmUgU0NTSU9QX1JFQURfU1VCX0NIQU5ORUwJCTB4NDIKKyNkZWZpbmUgU0NTSU9QX1JFQURfVE9DCQkJCTB4NDMKKyNkZWZpbmUgU0NTSU9QX1JFQURfSEVBREVSCQkJMHg0NAorI2RlZmluZSBTQ1NJT1BfUExBWV9BVURJTwkJCTB4NDUKKyNkZWZpbmUgU0NTSU9QX1BMQVlfQVVESU9fTVNGCQkweDQ3CisjZGVmaW5lIFNDU0lPUF9QTEFZX1RSQUNLX0lOREVYCQkweDQ4CisjZGVmaW5lIFNDU0lPUF9QTEFZX1RSQUNLX1JFTEFUSVZFCTB4NDkKKyNkZWZpbmUgU0NTSU9QX1BBVVNFX1JFU1VNRQkJCTB4NEIKKyNkZWZpbmUgU0NTSU9QX0xPR19TRUxFQ1QJCQkweDRDCisjZGVmaW5lIFNDU0lPUF9MT0dfU0VOU0UJCQkweDRECisjZGVmaW5lIFNDU0lPUF9NT0RFX1NFTEVDVDEwCQkweDU1CisjZGVmaW5lIFNDU0lPUF9NT0RFX1NFTlNFMTAJCQkweDVBCisjZGVmaW5lIFNDU0lPUF9MT0FEX1VOTE9BRF9TTE9UCQkweEE2CisjZGVmaW5lIFNDU0lPUF9NRUNIQU5JU01fU1RBVFVTCQkweEJECisjZGVmaW5lIFNDU0lPUF9SRUFEX0NECQkJCTB4QkUKKworLy8gSURFIGNvbW1hbmQgZGVmaW5pdGlvbnMKKyNkZWZpbmUgSURFX0NPTU1BTkRfQVRBUElfUkVTRVQJCTB4MDgKKyNkZWZpbmUgSURFX0NPTU1BTkRfUkVBRAkJCTB4MjAKKyNkZWZpbmUgSURFX0NPTU1BTkRfV1JJVEUJCQkweDMwCisjZGVmaW5lIElERV9DT01NQU5EX1JFQ0FMSUJSQVRFCQkweDEwCisjZGVmaW5lIElERV9DT01NQU5EX1NFRUsJCQkweDcwCisjZGVmaW5lIElERV9DT01NQU5EX1NFVF9QQVJBTUVURVJTCTB4OTEKKyNkZWZpbmUgSURFX0NPTU1BTkRfVkVSSUZZCQkJMHg0MAorI2RlZmluZSBJREVfQ09NTUFORF9BVEFQSV9QQUNLRVQJMHhBMAorI2RlZmluZSBJREVfQ09NTUFORF9BVEFQSV9JREVOVElGWQkweEExCisjZGVmaW5lCUlERV9DTURfUkVBRF9NVUxUSVBMRQkJMHhDNAorI2RlZmluZQlJREVfQ01EX1dSSVRFX01VTFRJUExFCQkweEM1CisjZGVmaW5lCUlERV9DTURfU0VUX01VTFRJUExFCQkweEM2CisjZGVmaW5lIElERV9DT01NQU5EX1dSSVRFX0RNQQkJMHhDQQorI2RlZmluZSBJREVfQ09NTUFORF9SRUFEX0RNQQkJMHhDOAorI2RlZmluZSBJREVfQ09NTUFORF9JREVOVElGWQkJMHhFQworCisvLyBJREUgc3RhdHVzIGRlZmluaXRpb25zCisjZGVmaW5lIElERV9TVEFUVVNfRVJST1IJCQkweDAxCisjZGVmaW5lIElERV9TVEFUVVNfSU5ERVgJCQkweDAyCisjZGVmaW5lIElERV9TVEFUVVNfQ09SUkVDVEVEX0VSUk9SCTB4MDQKKyNkZWZpbmUgSURFX1NUQVRVU19EUlEJCQkJMHgwOAorI2RlZmluZSBJREVfU1RBVFVTX0RTQwkJCQkweDEwCisjZGVmaW5lCUlERV9TVEFUVVNfV1JJVEVfRkFVTFQJCTB4MjAKKyNkZWZpbmUgSURFX1NUQVRVU19EUkRZCQkJCTB4NDAKKyNkZWZpbmUgSURFX1NUQVRVU19CVVNZCQkJCTB4ODAKKworLy8gSURFIGVycm9yIGRlZmluaXRpb25zCisjZGVmaW5lCUlERV9FUlJPUl9BTU5GCQkJCTB4MDEKKyNkZWZpbmUJSURFX0VSUk9SX1RLT05GCQkJCTB4MDIKKyNkZWZpbmUJSURFX0VSUk9SX0FCUlQJCQkJMHgwNAorI2RlZmluZQlJREVfRVJST1JfTUNSCQkJCTB4MDgKKyNkZWZpbmUJSURFX0VSUk9SX0lERk4JCQkJMHgxMAorI2RlZmluZQlJREVfRVJST1JfTUMJCQkJMHgyMAorI2RlZmluZQlJREVfRVJST1JfVU5DCQkJCTB4NDAKKyNkZWZpbmUJSURFX0VSUk9SX0JCSwkJCQkweDgwCisKKy8vCUlERSBpbnRlcmZhY2Ugc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdCBfSURFX1NUUlVDVAorCXsKKwl1bmlvbgorCQl7CisJCVVDSEFSCWlkZVs5XTsKKwkJc3RydWN0CisJCQl7CisJCQlVU0hPUlQJZGF0YTsKKwkJCVVDSEFSCXNlY3RvcnM7CisJCQlVQ0hBUglsYmFbNF07CisJCQlVQ0hBUgljbWQ7CisJCQlVQ0hBUglzcGlnb3Q7CisJCQl9CWlkZXM7CisJCX0gaWRlOworCX0JSURFX1NUUlVDVDsKKworLy8gU0NTSSByZWFkIGNhcGFjaXR5IHN0cnVjdHVyZQordHlwZWRlZglzdHJ1Y3QgX1JFQURfQ0FQQUNJVFlfREFUQQorCXsKKwlVTE9ORyBibGtzOwkJCQkvKiB0b3RhbCBibG9ja3MgKGNvbnZlcnRlZCB0byBsaXR0bGUgZW5kaWFuKSAqLworCVVMT05HIGJsa3NpejsJCQkvKiBzaXplIG9mIGVhY2ggKGNvbnZlcnRlZCB0byBsaXR0bGUgZW5kaWFuKSAqLworCX0JUkVBRF9DQVBBQ0lUWV9EQVRBLCAqUFJFQURfQ0FQQUNJVFlfREFUQTsKKworLy8gU0NTSSBpbnF1aXJ5IGRhdGEKKyNpZm5kZWYgSE9TVFNfQworCit0eXBlZGVmIHN0cnVjdCBfSU5RVUlSWURBVEEKKwl7CisJVUNIQVIgRGV2aWNlVHlwZQkJCTo1OworCVVDSEFSIERldmljZVR5cGVRdWFsaWZpZXIJOjM7CisJVUNIQVIgRGV2aWNlVHlwZU1vZGlmaWVyCTo3OworCVVDSEFSIFJlbW92YWJsZU1lZGlhCQk6MTsKKyAgICBVQ0hBUiBWZXJzaW9uczsKKyAgICBVQ0hBUiBSZXNwb25zZURhdGFGb3JtYXQ7CisgICAgVUNIQVIgQWRkaXRpb25hbExlbmd0aDsKKyAgICBVQ0hBUiBSZXNlcnZlZFsyXTsKKwlVQ0hBUiBTb2Z0UmVzZXQJCQkJOjE7CisJVUNIQVIgQ29tbWFuZFF1ZXVlCQkJOjE7CisJVUNIQVIgUmVzZXJ2ZWQyCQkJCToxOworCVVDSEFSIExpbmtlZENvbW1hbmRzCQk6MTsKKwlVQ0hBUiBTeW5jaHJvbm91cwkJCToxOworCVVDSEFSIFdpZGUxNkJpdAkJCQk6MTsKKwlVQ0hBUiBXaWRlMzJCaXQJCQkJOjE7CisJVUNIQVIgUmVsYXRpdmVBZGRyZXNzaW5nCToxOworICAgIFVDSEFSIFZlbmRvcklkWzhdOworICAgIFVDSEFSIFByb2R1Y3RJZFsxNl07CisgICAgVUNIQVIgUHJvZHVjdFJldmlzaW9uTGV2ZWxbNF07CisgICAgVUNIQVIgVmVuZG9yU3BlY2lmaWNbMjBdOworICAgIFVDSEFSIFJlc2VydmVkM1s0MF07CisJfQlJTlFVSVJZREFUQSwgKlBJTlFVSVJZREFUQTsKKyNlbmRpZgorCisvLyBJREUgSURFTlRJRlkgZGF0YQordHlwZWRlZiBzdHJ1Y3QgX0lERU5USUZZX0RBVEEKKwl7CisgICAgVVNIT1JUIEdlbmVyYWxDb25maWd1cmF0aW9uOyAgICAgICAgICAgIC8vIDAwCisgICAgVVNIT1JUIE51bWJlck9mQ3lsaW5kZXJzOyAgICAgICAgICAgICAgIC8vIDAyCisgICAgVVNIT1JUIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAgICAgIC8vIDA0CisgICAgVVNIT1JUIE51bWJlck9mSGVhZHM7ICAgICAgICAgICAgICAgICAgIC8vIDA2CisgICAgVVNIT1JUIFVuZm9ybWF0dGVkQnl0ZXNQZXJUcmFjazsgICAgICAgIC8vIDA4CisgICAgVVNIT1JUIFVuZm9ybWF0dGVkQnl0ZXNQZXJTZWN0b3I7ICAgICAgIC8vIDBBCisgICAgVVNIT1JUIFNlY3RvcnNQZXJUcmFjazsgICAgICAgICAgICAgICAgIC8vIDBDCisgICAgVVNIT1JUIFZlbmRvclVuaXF1ZTFbM107ICAgICAgICAgICAgICAgIC8vIDBFCisgICAgVVNIT1JUIFNlcmlhbE51bWJlclsxMF07ICAgICAgICAgICAgICAgIC8vIDE0CisgICAgVVNIT1JUIEJ1ZmZlclR5cGU7ICAgICAgICAgICAgICAgICAgICAgIC8vIDI4CisgICAgVVNIT1JUIEJ1ZmZlclNlY3RvclNpemU7ICAgICAgICAgICAgICAgIC8vIDJBCisgICAgVVNIT1JUIE51bWJlck9mRWNjQnl0ZXM7ICAgICAgICAgICAgICAgIC8vIDJDCisgICAgVVNIT1JUIEZpcm13YXJlUmV2aXNpb25bNF07ICAgICAgICAgICAgIC8vIDJFCisgICAgVVNIT1JUIE1vZGVsTnVtYmVyWzIwXTsgICAgICAgICAgICAgICAgIC8vIDM2CisgICAgVUNIQVIgIE1heGltdW1CbG9ja1RyYW5zZmVyOyAgICAgICAgICAgIC8vIDVFCisgICAgVUNIQVIgIFZlbmRvclVuaXF1ZTI7ICAgICAgICAgICAgICAgICAgIC8vIDVGCisgICAgVVNIT1JUIERvdWJsZVdvcmRJbzsgICAgICAgICAgICAgICAgICAgIC8vIDYwCisgICAgVVNIT1JUIENhcGFiaWxpdGllczsgICAgICAgICAgICAgICAgICAgIC8vIDYyCisgICAgVVNIT1JUIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAgICAgIC8vIDY0CisgICAgVUNIQVIgIFZlbmRvclVuaXF1ZTM7ICAgICAgICAgICAgICAgICAgIC8vIDY2CisgICAgVUNIQVIgIFBpb0N5Y2xlVGltaW5nTW9kZTsgICAgICAgICAgICAgIC8vIDY3CisgICAgVUNIQVIgIFZlbmRvclVuaXF1ZTQ7ICAgICAgICAgICAgICAgICAgIC8vIDY4CisgICAgVUNIQVIgIERtYUN5Y2xlVGltaW5nTW9kZTsgICAgICAgICAgICAgIC8vIDY5CisgICAgVVNIT1JUIFRyYW5zbGF0aW9uRmllbGRzVmFsaWQ6MTsgICAgICAgIC8vIDZBCisgICAgVVNIT1JUIFJlc2VydmVkMzoxNTsKKyAgICBVU0hPUlQgTnVtYmVyT2ZDdXJyZW50Q3lsaW5kZXJzOyAgICAgICAgLy8gNkMKKyAgICBVU0hPUlQgTnVtYmVyT2ZDdXJyZW50SGVhZHM7ICAgICAgICAgICAgLy8gNkUKKyAgICBVU0hPUlQgQ3VycmVudFNlY3RvcnNQZXJUcmFjazsgICAgICAgICAgLy8gNzAKKyAgICBVTE9ORyAgQ3VycmVudFNlY3RvckNhcGFjaXR5OyAgICAgICAgICAgLy8gNzIKKyAgICBVU0hPUlQgUmVzZXJ2ZWQ0WzE5N107ICAgICAgICAgICAgICAgICAgLy8gNzYKKwl9CUlERU5USUZZX0RBVEEsICpQSURFTlRJRllfREFUQTsKKworLy8gSWRlbnRpZnkgZGF0YSB3aXRob3V0IHRoZSBSZXNlcnZlZDQuCit0eXBlZGVmIHN0cnVjdCBfSURFTlRJRllfREFUQTIgeworICAgIFVTSE9SVCBHZW5lcmFsQ29uZmlndXJhdGlvbjsgICAgICAgICAgICAvLyAwMAorICAgIFVTSE9SVCBOdW1iZXJPZkN5bGluZGVyczsgICAgICAgICAgICAgICAvLyAwMgorICAgIFVTSE9SVCBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgICAgICAvLyAwNAorICAgIFVTSE9SVCBOdW1iZXJPZkhlYWRzOyAgICAgICAgICAgICAgICAgICAvLyAwNgorICAgIFVTSE9SVCBVbmZvcm1hdHRlZEJ5dGVzUGVyVHJhY2s7ICAgICAgICAvLyAwOAorICAgIFVTSE9SVCBVbmZvcm1hdHRlZEJ5dGVzUGVyU2VjdG9yOyAgICAgICAvLyAwQQorICAgIFVTSE9SVCBTZWN0b3JzUGVyVHJhY2s7ICAgICAgICAgICAgICAgICAvLyAwQworICAgIFVTSE9SVCBWZW5kb3JVbmlxdWUxWzNdOyAgICAgICAgICAgICAgICAvLyAwRQorICAgIFVTSE9SVCBTZXJpYWxOdW1iZXJbMTBdOyAgICAgICAgICAgICAgICAvLyAxNAorICAgIFVTSE9SVCBCdWZmZXJUeXBlOyAgICAgICAgICAgICAgICAgICAgICAvLyAyOAorICAgIFVTSE9SVCBCdWZmZXJTZWN0b3JTaXplOyAgICAgICAgICAgICAgICAvLyAyQQorICAgIFVTSE9SVCBOdW1iZXJPZkVjY0J5dGVzOyAgICAgICAgICAgICAgICAvLyAyQworICAgIFVTSE9SVCBGaXJtd2FyZVJldmlzaW9uWzRdOyAgICAgICAgICAgICAvLyAyRQorICAgIFVTSE9SVCBNb2RlbE51bWJlclsyMF07ICAgICAgICAgICAgICAgICAvLyAzNgorICAgIFVDSEFSICBNYXhpbXVtQmxvY2tUcmFuc2ZlcjsgICAgICAgICAgICAvLyA1RQorICAgIFVDSEFSICBWZW5kb3JVbmlxdWUyOyAgICAgICAgICAgICAgICAgICAvLyA1RgorICAgIFVTSE9SVCBEb3VibGVXb3JkSW87ICAgICAgICAgICAgICAgICAgICAvLyA2MAorICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7ICAgICAgICAgICAgICAgICAgICAvLyA2MgorICAgIFVTSE9SVCBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgICAgICAvLyA2NAorICAgIFVDSEFSICBWZW5kb3JVbmlxdWUzOyAgICAgICAgICAgICAgICAgICAvLyA2NgorICAgIFVDSEFSICBQaW9DeWNsZVRpbWluZ01vZGU7ICAgICAgICAgICAgICAvLyA2NworICAgIFVDSEFSICBWZW5kb3JVbmlxdWU0OyAgICAgICAgICAgICAgICAgICAvLyA2OAorICAgIFVDSEFSICBEbWFDeWNsZVRpbWluZ01vZGU7ICAgICAgICAgICAgICAvLyA2OQorCVVTSE9SVCBUcmFuc2xhdGlvbkZpZWxkc1ZhbGlkOjE7ICAgICAJLy8gNkEKKyAgICBVU0hPUlQgUmVzZXJ2ZWQzOjE1OworICAgIFVTSE9SVCBOdW1iZXJPZkN1cnJlbnRDeWxpbmRlcnM7ICAgICAgICAvLyA2QworICAgIFVTSE9SVCBOdW1iZXJPZkN1cnJlbnRIZWFkczsgICAgICAgICAgICAvLyA2RQorICAgIFVTSE9SVCBDdXJyZW50U2VjdG9yc1BlclRyYWNrOyAgICAgICAgICAvLyA3MAorICAgIFVMT05HICBDdXJyZW50U2VjdG9yQ2FwYWNpdHk7ICAgICAgICAgICAvLyA3MgorCX0JSURFTlRJRllfREFUQTIsICpQSURFTlRJRllfREFUQTI7CisKKyNlbmRpZgkvLyBQU0lfRUlERV9TQ1NJT1AKKworLy8gZnVuY3Rpb24gcHJvdG90eXBlcworaW50IFBzaTI0MGlfQ29tbWFuZAkJCShTY3NpX0NtbmQgKlNDcG50KTsKK2ludCBQc2kyNDBpX0Fib3J0CQkJKFNjc2lfQ21uZCAqU0NwbnQpOworaW50IFBzaTI0MGlfUmVzZXQJCQkoU2NzaV9DbW5kICpTQ3BudCwgdW5zaWduZWQgaW50IGZsYWdzKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BzaV9jaGlwLmggYi9kcml2ZXJzL3Njc2kvcHNpX2NoaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjRjZjhmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BzaV9jaGlwLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qK00qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQZXJjZXB0aXZlIFNvbHV0aW9ucywgSW5jLiBQU0ktMjQwSSBkZXZpY2UgZHJpdmVyIHByb2Mgc3VwcG9ydCBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3IFBlcmNlcHRpdmUgU29sdXRpb25zLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKgorICoJRmlsZSBOYW1lOglwc2lfY2hpcC5oCisgKgorICoJRGVzY3JpcHRpb246CVRoaXMgZmlsZSBjb250YWlucyB0aGUgaW50ZXJmYWNlIGRlZmluZXMgYW5kCisgKgkJCQkJZXJyb3IgY29kZXMuCisgKgorICotTSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBTSV9DSElQCisjZGVmaW5lIFBTSV9DSElQCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJTWlzYyBrb25zdGFudHMJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCUNISVBfTUFYRFJJVkVTCQkJOAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCUNoaXAgSS9PIGFkZHJlc3NlcwkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlDSElQX0FEUlNfMAkJCQkweDAxMzAKKyNkZWZpbmUJQ0hJUF9BRFJTXzEJCQkJMHgwMTUwCisjZGVmaW5lCUNISVBfQURSU18yCQkJCTB4MDE5MAorI2RlZmluZQlDSElQX0FEUlNfMwkJCQkweDAyMTAKKyNkZWZpbmUJQ0hJUF9BRFJTXzQJCQkJMHgwMjMwCisjZGVmaW5lCUNISVBfQURSU181CQkJCTB4MDI1MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCUVFUFJPTSBsb2NhdGlvbnMJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlDSElQX0VFUFJPTV9CSU9TCQkweDAwMDAJCS8vIEJJT1MgYmFzZSBhZGRyZXNzCisjZGVmaW5lCUNISVBfRUVQUk9NX0RBVEEJCTB4MjAwMAkgICAJLy8gU0VUVVAgZGF0YSBiYXNlIGFkZHJlc3MKKyNkZWZpbmUJQ0hJUF9FRVBST01fRkFDVE9SWQkJMHgyNDAwCSAgIAkvLyBGQUNUT1JZIGRhdGEgYmFzZSBhZGRyZXNzCisjZGVmaW5lCUNISVBfRUVQUk9NX1NFVFVQCQkweDMwMDAJICAgCS8vIFNFVFVQIFBST0dSQU0gYmFzZSBhZGRyZXNzCisKKyNkZWZpbmUJQ0hJUF9FRVBST01fU0laRQkJMzI3NjhVCSAgIAkvLyBzaXplIG9mIHRoZSBlbnRpcmUgRUVQUk9NCisjZGVmaW5lCUNISVBfRUVQUk9NX0JJT1NfU0laRQk4MTkyCSAgIAkvLyBzaXplIG9mIHRoZSBCSU9TIGluIGJ5dGVzCisjZGVmaW5lCUNISVBfRUVQUk9NX0RBVEFfU0laRQk0MDk2CSAgIAkvLyBzaXplIG9mIGZhY3RvcnksIHNldHVwLCBsb2cgZGF0YSBibG9jayBpbiBieXRlcworI2RlZmluZQlDSElQX0VFUFJPTV9TRVRVUF9TSVpFCTIwNDgwVQkgICAJLy8gc2l6ZSBvZiB0aGUgc2V0dXAgcHJvZ3JhbSBpbiBieXRlcworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCUNoaXAgSW50ZXJydXB0cwkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJQ0hJUF9JUlFfMTAJCQkJMHg3MgorI2RlZmluZQlDSElQX0lSUV8xMQkJCQkweDczCisjZGVmaW5lCUNISVBfSVJRXzEyCQkJCTB4NzQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlDaGlwIFNldHVwIGFkZHJlc3NlcwkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCUNISVBfU0VUVVBfQkFTRQkJCTB4MDAwMEMwMDBMCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJQ2hpcCBSZWdpc3RlciBhZGRyZXNzIG9mZnNldHMJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCVJFR19EQVRBCQkJCTB4MDAKKyNkZWZpbmUJUkVHX0VSUk9SCQkJCTB4MDEKKyNkZWZpbmUJUkVHX1NFQ1RPUl9DT1VOVAkJMHgwMgorI2RlZmluZQlSRUdfTEJBXzAJCQkJMHgwMworI2RlZmluZQlSRUdfTEJBXzgJCQkJMHgwNAorI2RlZmluZQlSRUdfTEJBXzE2CQkJCTB4MDUKKyNkZWZpbmUJUkVHX0xCQV8yNAkJCQkweDA2CisjZGVmaW5lCVJFR19TVEFUX0NNRAkJCTB4MDcKKyNkZWZpbmUJUkVHX1NFTF9GQUlMCQkJMHgwOAorI2RlZmluZQlSRUdfSVJRX1NUQVRVUwkJCTB4MDkKKyNkZWZpbmUJUkVHX0FERFJFU1MJCQkJMHgwQQorI2RlZmluZQlSRUdfRkFJTAkJCQkweDBDCisjZGVmaW5lCVJFR19BTFRfU1RBVAkJICAgCTB4MEUKKyNkZWZpbmUJUkVHX0RSSVZFX0FEUlMJCQkweDBGCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJQ2hpcCBSQU0gbG9jYXRpb25zCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJQ0hJUF9ERVZJQ0UJCQkJMHg4MDAwCisjZGVmaW5lCUNISVBfREVWSUNFXzAJCQkweDgwMDAKKyNkZWZpbmUgQ0hJUF9ERVZJQ0VfMQkJCTB4ODAwOAorI2RlZmluZQlDSElQX0RFVklDRV8yCQkJMHg4MDEwCisjZGVmaW5lCUNISVBfREVWSUNFXzMJCQkweDgwMTgKKyNkZWZpbmUJQ0hJUF9ERVZJQ0VfNAkJCTB4ODAyMAorI2RlZmluZQlDSElQX0RFVklDRV81CQkJMHg4MDI4CisjZGVmaW5lCUNISVBfREVWSUNFXzYJCQkweDgwMzAKKyNkZWZpbmUJQ0hJUF9ERVZJQ0VfNwkJCTB4ODAzOAordHlwZWRlZiBzdHJ1Y3QKKwl7CisJVUNIQVIJY2hhbm5lbDsJCS8vIGNoYW5uZWwgb2YgdGhpcyBkZXZpY2UgKDAtOCkuCisJVUNIQVIJc3B0OwkJCS8vIFNlY3RvcnMgUGVyIFRyYWNrLgorCVVMT05HCXNwYzsJCQkvLyBTZWN0b3JzIFBlciBDeWxpbmRlci4KKwl9CUNISVBfREVWSUNFX047CisKKyNkZWZpbmUJQ0hJUF9DT05GSUcJCQkJMHg4MTAwCQkvLyBhZGRyZXNzIG9mIGJvYXJkcyBjb25maWd1cmF0aW9uLgordHlwZWRlZiBzdHJ1Y3QKKwl7CisJVUNIQVIJCWlycTsJCQkvLyBpbnRlcnJ1cHQgcmVxdWVzdCBjaGFubmVsIG51bWJlcgorCVVDSEFSCQludW1Ecml2ZXM7CQkvLyBOdW1iZXIgb2YgYWNjZXNzaWJsZSBkcml2ZXMKKwlVQ0hBUgkJZmFzdEZvcm1hdDsJIAkvLyBCb29sZWFuIGZvciBmYXN0IGZvcm1hdCBlbmFibGUKKwl9CUNISVBfQ09ORklHX047CisKKyNkZWZpbmUJQ0hJUF9NQVAJCQkJMHg4MTA4IAkJLy8gZWlnaHQgYnl0ZSBkZXZpY2UgdHlwZSBtYXAuCisKKworI2RlZmluZQlDSElQX1JBSUQJCQkJMHg4MTIwIAkJLy8gYXJyYXkgb2YgUkFJRCBzaWduYXR1cmUgc3RydWN0dXJlcyBhbmQgTEJBCisjZGVmaW5lCUNISVBfUkFJRF8xCQkJCTB4ODEyMAorI2RlZmluZSBDSElQX1JBSURfMgkJCQkweDgxMzAKKyNkZWZpbmUJQ0hJUF9SQUlEXzMJCQkJMHg4MTQwCisjZGVmaW5lCUNISVBfUkFJRF80CQkJCTB4ODE1MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCUNoaXAgUmVnaXN0ZXIgTWFza3MJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlDSElQX0lECQkJCQkweDdCCisjZGVmaW5lCVNFTF9SQU0JCQkJCTB4ODAwMAorI2RlZmluZQlNQVNLX0ZBSUwJCQkJMHg4MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCUNoaXAgY2FibGUgc2VsZWN0IGJpdHMJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlTRUNUT1JTWEZFUgkJCQk4CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJQ2hpcCBjYWJsZSBzZWxlY3QgYml0cwkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCVNFTF9OT05FCQkJCTB4MDAKKyNkZWZpbmUJU0VMXzEJCQkJCTB4MDEKKyNkZWZpbmUJU0VMXzIJCQkJCTB4MDIKKyNkZWZpbmUJU0VMXzMJCQkJCTB4MDQKKyNkZWZpbmUJU0VMXzQJCQkJCTB4MDgKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXIqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJUElDMQkJCQkJMHgyMAkJLy8gZmlyc3QgODI1OSBiYXNlIHBvcnQgYWRkcmVzcworI2RlZmluZQlQSUMyCQkJCQkweEEwCQkvLyBzZWNvbmQgODI1OSBiYXNlIHBvcnQgYWRkcmVzcworI2RlZmluZQlJTlRfT0NXMQkJCQkxCQkJLy8gT3BlcmF0aW9uIENvbnRyb2wgV29yZCAxOiBJUlEgbWFzaworI2RlZmluZQlFT0kJCQkJCQkweDIwCQkvLyBub24tc3BlY2lmaWMgZW5kLW9mLWludGVycnVwdAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCURldmljZS9HZW9tZXRyeSBjb250cm9scwkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgR0VPTUVUUllfTk9ORQkJIAkweDAJCQkvLyBObyBkZXZpY2UKKyNkZWZpbmUgR0VPTUVUUllfQVVUTwkJCTB4MQkJCS8vIEdlb21ldHJ5IHNldCBhdXRvbWF0aWNhbGx5CisjZGVmaW5lIEdFT01FVFJZX1VTRVIJCSAJMHgyCQkJLy8gVXNlciBzdXBwbGllZCBnZW9tZXRyeQorCisjZGVmaW5lCURFVklDRV9OT05FCQkJCTB4MAkJCS8vIE5vIGRldmljZSBwcmVzZW50CisjZGVmaW5lCURFVklDRV9JTkFDVElWRQkJCTB4MQkJCS8vIGRldmljZSBwcmVzZW50IGJ1dCBub3QgcmVnaXN0ZXJlZCBhY3RpdmUKKyNkZWZpbmUJREVWSUNFX0FUQVBJCQkJMHgyCQkJLy8gQVRBUEkgZGV2aWNlIChDRF9ST00sIFRhcGUsIEV0Yy4uLikKKyNkZWZpbmUJREVWSUNFX0RBU0RfTk9OTEJBCQkweDMJCQkvLyBOb24gTEJBIGluY29tcGF0aWJsZSBkZXZpY2UKKyNkZWZpbmUJREVWSUNFX0RBU0RfTEJBCQkJMHg0CQkJLy8gTEJBIGNvbXBhdGlibGUgZGV2aWNlCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJU2V0dXAgU3RydWN0dXJlIERlZmluaXRpb25zCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QJCQkJCQkJLy8gZGV2aWNlIHNldHVwIHBhcmFtZXRlcnMKKwl7CisJVUNIQVIJCQlnZW9tZXRyeUNvbnRyb2w7CS8vIGdlb21ldHJ5IGNvbnRyb2wgZmxhZ3MKKwlVQ0hBUgkJICAgCWRldmljZTsJCQkJLy8gZGV2aWNlIGNvZGUKKwlVU0hPUlQJCQlzZWN0b3JzOwkJCS8vIG51bWJlciBvZiBzZWN0b3JzIHBlciB0cmFjaworCVVTSE9SVAkJCWhlYWRzOwkJCQkvLyBudW1iZXIgb2YgaGVhZHMKKwlVU0hPUlQJCQljeWxpbmRlcnM7CQkJLy8gbnVtYmVyIG9mIGN5bGluZGVycyBmb3IgdGhpcyBkZXZpY2UKKwlVTE9ORwkJCWJsb2NrczsJCQkJLy8gbnVtYmVyIG9mIGJsb2NrcyBvbiBkZXZpY2UKKwlVU0hPUlQJCQlzcGFyZTE7CisJVVNIT1JUCQkJc3BhcmUyOworCX0gU0VUVVBfREVWSUNFLCAqUFNFVFVQX0RFVklDRTsKKwordHlwZWRlZiBzdHJ1Y3QJCS8vIG1hc3RlciBzZXR1cCBzdHJ1Y3R1cmUKKwl7CisJVVNIT1JUIAkJCXN0YXJ0dXBEZWxheTsKKwlVU0hPUlQgCQkJcHJvbXB0QklPUzsKKwlVU0hPUlQgCQkJZmFzdEZvcm1hdDsKKwlVU0hPUlQJCQlzcGFyZTI7CisJVVNIT1JUCQkJc3BhcmUzOworCVVTSE9SVAkJCXNwYXJlNDsKKwlVU0hPUlQJCQlzcGFyZTU7CisJVVNIT1JUCQkJc3BhcmU2OworCVNFVFVQX0RFVklDRQlzZXR1cERldmljZVs4XTsKKwl9CVNFVFVQLCAqUFNFVFVQOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BzaV9kYWxlLmggYi9kcml2ZXJzL3Njc2kvcHNpX2RhbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjcyZTNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BzaV9kYWxlLmgKQEAgLTAsMCArMSw1NjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQZXJjZXB0aXZlIFNvbHV0aW9ucywgSW5jLiBQQ0ktMjIyMEkgZGV2aWNlIGRyaXZlciBmb3IgTGludXguCisgKgorICogcHNpX2RhbGVpLmggLSBMaW51eCBIb3N0IERyaXZlciBmb3IgUENJLTIyMjBpIEVJREUgQWRhcHRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OSBQZXJjZXB0aXZlIFNvbHV0aW9ucywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UKKyAqIGNvZGUgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIGNvbW1lbnQgd2l0aG91dAorICogbW9kaWZpY2F0aW9uLgorICoKKyAqIFRlY2huaWNhbCB1cGRhdGVzIGFuZCBwcm9kdWN0IGluZm9ybWF0aW9uIGF0OgorICogIGh0dHA6Ly93d3cucHNpZGlzay5jb20KKyAqCisgKiBQbGVhc2Ugc2VuZCBxdWVzdGlvbnMsIGNvbW1lbnRzLCBidWcgcmVwb3J0cyB0bzoKKyAqICB0ZWNoQHBzaWRpc2suY29tIFRlY2huaWNhbCBTdXBwb3J0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJU29tZSBkZWZpbmVzIHRoYXQgd2UgbGlrZSAJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCUNIQVIJCWNoYXIKKyNkZWZpbmUJVUNIQVIJCXVuc2lnbmVkIGNoYXIKKyNkZWZpbmUJU0hPUlQJCXNob3J0CisjZGVmaW5lCVVTSE9SVAkJdW5zaWduZWQgc2hvcnQKKyNkZWZpbmUJQk9PTAkJdW5zaWduZWQgc2hvcnQKKyNkZWZpbmUJTE9ORwkJbG9uZworI2RlZmluZQlVTE9ORwkJdW5zaWduZWQgbG9uZworI2RlZmluZQlWT0lECQl2b2lkCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJRGFsZSBQQ0kgc2V0dXAJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCVZFTkRPUl9QU0kJCQkweDEyNTYKKyNkZWZpbmUJREVWSUNFX0RBTEVfMQkJMHg0NDAxCQkvKiAnRDEnICovCisjZGVmaW5lCURFVklDRV9CSUdEXzEJCTB4NDIwMQkJLyogJ0IxJyAqLworI2RlZmluZQlERVZJQ0VfQklHRF8yCQkweDQyMDIJCS8qICdCMicgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlNaXNjIGtvbnN0YW50cwkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJREFMRV9NQVhEUklWRVMJCQk0CisjZGVmaW5lCUJJR0RfTUFYRFJJVkVTCQkJOAorI2RlZmluZQlTRUNUT1JTWEZFUgkJCQk4CisjZGVmaW5lCUFUQVBJX1RSQU5TRkVSCQkJODE5MgorI2RlZmluZQlCWVRFU19QRVJfU0VDVE9SCQk1MTIKKyNkZWZpbmUJREVGQVVMVF9USU1JTkdfTU9ERQkJNQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCUVFUFJPTSBsb2NhdGlvbnMJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJREFMRV9GTEFTSF9QQUdFX1NJWkUJMTI4CQkJCS8vIG51bWJlciBvZiBieXRlcyBwZXIgcGFnZQorI2RlZmluZQlEQUxFX0ZMQVNIX1NJWkUJCQk2NTUzNkwKKworI2RlZmluZQlEQUxFX0ZMQVNIX0JJT1MJCQkweDAwMDgwMDAwTAkJLy8gQklPUyBiYXNlIGFkZHJlc3MKKyNkZWZpbmUJREFMRV9GTEFTSF9TRVRVUAkJMHgwMDA4ODAwMEwJCS8vIFNFVFVQIFBST0dSQU0gYmFzZSBhZGRyZXNzIG9mZnNldCBmcm9tIEJJT1MKKyNkZWZpbmUJREFMRV9GTEFTSF9SQUlECQkJMHgwMDA4ODQwMEwJCS8vIFJBSUQgc2lnbmF0dXJlIHN0b3JhZ2UKKyNkZWZpbmUJREFMRV9GTEFTSF9GQUNUT1JZCQkweDAwMDg5MDAwTAkJLy8gRkFDVE9SWSBkYXRhIGJhc2UgYWRkcmVzcyBvZmZzZXQgZnJvbSBCSU9TCisKKyNkZWZpbmUJREFMRV9GTEFTSF9CSU9TX1NJWkUJMzI3NjhVCQkJLy8gc2l6ZSBvZiBGTEFTSCBCSU9TIFJFR0lPTgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCURBTEUgUmVnaXN0ZXIgYWRkcmVzcyBvZmZzZXRzCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCVJFR19EQVRBCQkJCQkweDgwCisjZGVmaW5lCVJFR19FUlJPUgkJCQkJMHg4NAorI2RlZmluZQlSRUdfU0VDVE9SX0NPVU5UCQkJMHg4OAorI2RlZmluZQlSRUdfTEJBXzAJCQkJCTB4OEMKKyNkZWZpbmUJUkVHX0xCQV84CQkJCQkweDkwCisjZGVmaW5lCVJFR19MQkFfMTYJCQkJCTB4OTQKKyNkZWZpbmUJUkVHX0xCQV8yNAkJCQkJMHg5OAorI2RlZmluZQlSRUdfU1RBVF9DTUQJCQkJMHg5QworI2RlZmluZQlSRUdfU1RBVF9TRUwJCQkJMHhBMAorI2RlZmluZQlSRUdfRkFJTAkJCQkJMHhCMAorI2RlZmluZQlSRUdfQUxUX1NUQVQJCQkJMHhCOAorI2RlZmluZQlSRUdfRFJJVkVfQURSUwkJCQkweEJDCisKKyNkZWZpbmUJREFMRV9EQVRBX1NMT1cJCQkJMHgwMDA0MDAwMEwKKyNkZWZpbmUJREFMRV9EQVRBX01PREUyCQkJCTB4MDAwNDAwMDBMCisjZGVmaW5lCURBTEVfREFUQV9NT0RFMwkJCQkweDAwMDUwMDAwTAorI2RlZmluZQlEQUxFX0RBVEFfTU9ERTQJCQkJMHgwMDA2MDAwMEwKKyNkZWZpbmUJREFMRV9EQVRBX01PREU1CQkJCTB4MDAwNzAwMDBMCisKKyNkZWZpbmUJQklHRF9EQVRBX1NMT1cJCQkJMHgwMDAwMDAwMEwKKyNkZWZpbmUJQklHRF9EQVRBX01PREUwCQkJCTB4MDAwMDAwMDBMCisjZGVmaW5lCUJJR0RfREFUQV9NT0RFMgkJCQkweDAwMDAwMDAwTAorI2RlZmluZQlCSUdEX0RBVEFfTU9ERTMJCQkJMHgwMDAwMDAwOEwKKyNkZWZpbmUJQklHRF9EQVRBX01PREU0CQkJCTB4MDAwMDAwMTBMCisjZGVmaW5lCUJJR0RfREFUQV9NT0RFNQkJCQkweDAwMDAwMDIwTAorCisjZGVmaW5lIFJUUl9MT0NBTF9SQU5HRQkJCQkweDAwMAorI2RlZmluZSBSVFJfTE9DQUxfUkVNQVAJCQkJMHgwMDQKKyNkZWZpbmUgUlRSX0VYUF9SQU5HRQkJCQkweDAxMAorI2RlZmluZSBSVFJfRVhQX1JFTUFQCQkJCTB4MDE0CisjZGVmaW5lIFJUUl9SRUdJT05TCQkJCQkweDAxOAorI2RlZmluZSBSVFJfRE1fTUFTSwkJCQkJMHgwMUMKKyNkZWZpbmUgUlRSX0RNX0xPQ0FMX0JBU0UJCQkweDAyMAorI2RlZmluZSBSVFJfRE1fSU9fQkFTRQkJCQkweDAyNAorI2RlZmluZSBSVFJfRE1fUENJX1JFTUFQCQkJMHgwMjgKKyNkZWZpbmUgUlRSX0RNX0lPX0NPTkZJRwkJCTB4MDJDCisjZGVmaW5lIFJUUl9NQUlMQk9YCQkJCQkweDA0MAorI2RlZmluZSBSVFJfTE9DQUxfRE9PUkJFTEwJCQkweDA2MAorI2RlZmluZSBSVFJfUENJX0RPT1JCRUxMCQkJMHgwNjQKKyNkZWZpbmUgUlRSX0lOVF9DT05UUk9MX1NUQVRVUyAJCTB4MDY4CisjZGVmaW5lIFJUUl9FRVBST01fQ09OVFJPTF9TVEFUVVMJMHgwNkMKKworI2RlZmluZSBSVFJfRE1BMF9NT0RFCQkJCTB4MDA4MAorI2RlZmluZSBSVFJfRE1BMF9QQ0lfQUREUgkJCTB4MDA4NAorI2RlZmluZSBSVFJfRE1BMF9MT0NBTF9BRERSCQkJMHgwMDg4CisjZGVmaW5lIFJUUl9ETUEwX0NPVU5UCQkJCTB4MDA4QworI2RlZmluZSBSVFJfRE1BMF9ERVNDX1BUUgkJCTB4MDA5MAorI2RlZmluZSBSVFJfRE1BMV9NT0RFCQkJCTB4MDA5NAorI2RlZmluZSBSVFJfRE1BMV9QQ0lfQUREUgkJCTB4MDA5OAorI2RlZmluZSBSVFJfRE1BMV9MT0NBTF9BRERSCQkJMHgwMDlDCisjZGVmaW5lIFJUUl9ETUExX0NPVU5UCQkJCTB4MDBBMAorI2RlZmluZSBSVFJfRE1BMV9ERVNDX1BUUgkJCTB4MDBBNAorI2RlZmluZSBSVFJfRE1BX0NPTU1BTkRfU1RBVFVTCQkweDAwQTgKKyNkZWZpbmUgUlRSX0RNQV9BUkIwCQkJCTB4MDBBQworI2RlZmluZSBSVFJfRE1BX0FSQjEJCQkJMHgwMEIwCisKKyNkZWZpbmUgUlRMX0RNQTBfTU9ERQkJCQkweDAwCisjZGVmaW5lIFJUTF9ETUEwX1BDSV9BRERSCQkJMHgwNAorI2RlZmluZSBSVExfRE1BMF9MT0NBTF9BRERSCQkJMHgwOAorI2RlZmluZSBSVExfRE1BMF9DT1VOVAkJCQkweDBDCisjZGVmaW5lIFJUTF9ETUEwX0RFU0NfUFRSCQkJMHgxMAorI2RlZmluZSBSVExfRE1BMV9NT0RFCQkJCTB4MTQKKyNkZWZpbmUgUlRMX0RNQTFfUENJX0FERFIJCQkweDE4CisjZGVmaW5lIFJUTF9ETUExX0xPQ0FMX0FERFIJCQkweDFDCisjZGVmaW5lIFJUTF9ETUExX0NPVU5UCQkJCTB4MjAKKyNkZWZpbmUgUlRMX0RNQTFfREVTQ19QVFIJCQkweDI0CisjZGVmaW5lIFJUTF9ETUFfQ09NTUFORF9TVEFUVVMJCTB4MjgKKyNkZWZpbmUgUlRMX0RNQV9BUkIwCQkJCTB4MkMKKyNkZWZpbmUgUlRMX0RNQV9BUkIxCQkJCTB4MzAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlEYWxlIFNjcmF0Y2hwYWQgbG9jYXRpb25zCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlEQUxFX0NIQU5ORUxfREVWSUNFXzAJCTAJCS8vIGRldmljZSBjaGFubmVsIGxvY2F0aW9ucworI2RlZmluZQlEQUxFX0NIQU5ORUxfREVWSUNFXzEJCTEKKyNkZWZpbmUJREFMRV9DSEFOTkVMX0RFVklDRV8yCQkyCisjZGVmaW5lCURBTEVfQ0hBTk5FTF9ERVZJQ0VfMwkJMworCisjZGVmaW5lCURBTEVfU0NSQVRDSF9ERVZJQ0VfMAkJNAkJLy8gZGV2aWNlIHR5cGUgY29kZXMKKyNkZWZpbmUJREFMRV9TQ1JBVENIX0RFVklDRV8xCQk1CisjZGVmaW5lIERBTEVfU0NSQVRDSF9ERVZJQ0VfMgkJNgorI2RlZmluZQlEQUxFX1NDUkFUQ0hfREVWSUNFXzMJCTcKKworI2RlZmluZQlEQUxFX1JBSURfMF9TVEFUVVMJCQk4CisjZGVmaW5lIERBTEVfUkFJRF8xX1NUQVRVUwkJCTkKKworI2RlZmluZQlEQUxFX1RJTUlOR19NT0RFCQkJMTIJCS8vIGJ1cyBtYXN0ZXIgdGltaW5nIG1vZGUgKDIsIDMsIDQsIDUpCisjZGVmaW5lCURBTEVfTlVNX0RSSVZFUwkJCQkxMwkJLy8gbnVtYmVyIG9mIGFkZHJlc3NhYmxlIGRyaXZlcyBvbiB0aGlzIGJvYXJkCisjZGVmaW5lCURBTEVfUkFJRF9PTgkJCQkxNCAJCS8vIFJBSUQgc3RhdHVzIE9uCisjZGVmaW5lCURBTEVfTEFTVF9FUlJPUgkJCQkxNQkJLy8gTGFzdCBlcnJvciBjb2RlIGZyb20gQklPUworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCUJpZ0QgU2NyYXRjaHBhZCBsb2NhdGlvbnMJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCUJJR0RfREVWSUNFXzAJCQkwCQkvLyBkZXZpY2UgY2hhbm5lbCBsb2NhdGlvbnMKKyNkZWZpbmUJQklHRF9ERVZJQ0VfMQkJCTEKKyNkZWZpbmUJQklHRF9ERVZJQ0VfMgkJCTIKKyNkZWZpbmUJQklHRF9ERVZJQ0VfMwkJCTMKKworI2RlZmluZQlCSUdEX0RFVklDRV80CQkJNAkJLy8gZGV2aWNlIHR5cGUgY29kZXMKKyNkZWZpbmUJQklHRF9ERVZJQ0VfNQkJCTUKKyNkZWZpbmUgQklHRF9ERVZJQ0VfNgkJCTYKKyNkZWZpbmUJQklHRF9ERVZJQ0VfNwkJCTcKKworI2RlZmluZQlCSUdEX0FMQVJNX0lNQUdFCQkxMQkJLy8gfmltYWdlIG9mIGFsYXJtIGZhaWwgcmVnaXN0ZXIJCQorI2RlZmluZQlCSUdEX1RJTUlOR19NT0RFCQkxMgkJLy8gYnVzIG1hc3RlciB0aW1pbmcgbW9kZSAoMiwgMywgNCwgNSkKKyNkZWZpbmUJQklHRF9OVU1fRFJJVkVTCQkJMTMJCS8vIG51bWJlciBvZiBhZGRyZXNzYWJsZSBkcml2ZXMgb24gdGhpcyBib2FyZAorI2RlZmluZQlCSUdEX1JBSURfT04JCQkxNCAJCS8vIFJBSUQgc3RhdHVzIGlzIG9uIGZvciB0aGUgd2hvbGUgYm9hcmQKKyNkZWZpbmUJQklHRF9MQVNUX0VSUk9SCQkJMTUJCS8vIExhc3QgZXJyb3IgY29kZSBmcm9tIEJJT1MKKworI2RlZmluZQlCSUdEX1JBSURfMF9TVEFUVVMJCTE2CisjZGVmaW5lIEJJR0RfUkFJRF8xX1NUQVRVUwkJMTcKKyNkZWZpbmUJQklHRF9SQUlEXzJfU1RBVFVTCQkxOAorI2RlZmluZQlCSUdEX1JBSURfM19TVEFUVVMJCTE5CisjZGVmaW5lCUJJR0RfUkFJRF80X1NUQVRVUwkJMjAKKyNkZWZpbmUgQklHRF9SQUlEXzVfU1RBVFVTCQkyMQorI2RlZmluZQlCSUdEX1JBSURfNl9TVEFUVVMJCTIyCisjZGVmaW5lCUJJR0RfUkFJRF83X1NUQVRVUwkJMjMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlEYWxlIGNhYmxlIHNlbGVjdCBiaXRzCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJU0VMX05PTkUJCQkJCTB4MDAKKyNkZWZpbmUJU0VMXzEJCQkJCQkweDAxCisjZGVmaW5lCVNFTF8yCQkJCQkJMHgwMgorI2RlZmluZQlTRUxfMwkJCQkJCTB4MDQKKyNkZWZpbmUJU0VMXzQJCQkJCQkweDA4CisjZGVmaW5lCVNFTF9ORVdfU1BFRURfMQkJCQkweDIwCisjZGVmaW5lCVNFTF9DT1BZCQkJCQkweDQwCisjZGVmaW5lCVNFTF9JUlFfT0ZGCQkJCQkweDgwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJRGV2aWNlL0dlb21ldHJ5IGNvbnRyb2xzCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBHRU9NRVRSWV9OT05FCSAJCQkweDAJCQkJLy8gTm8gZGV2aWNlCisjZGVmaW5lIEdFT01FVFJZX1NFVAkJCQkweDEJCQkJLy8gR2VvbWV0cnkgc2V0CisjZGVmaW5lCUdFT01FVFJZX0xCQQkJCQkweDIJCQkJLy8gR2VvbWV0cnkgc2V0IGluIGRlZmF1bHQgTEJBIG1vZGUKKyNkZWZpbmUJR0VPTUVUUllfUEhPRU5JWAkJCTB4MwkJCQkvLyBHZW9tZXRyeSBzZXQgaW4gUGhlb25peCBCSU9TIGNvbXBhdGliaWxpdHkgbW9kZQorCisjZGVmaW5lCURFVklDRV9OT05FCQkJCQkweDAJCQkJLy8gTm8gZGV2aWNlIHByZXNlbnQKKyNkZWZpbmUJREVWSUNFX0lOQUNUSVZFCQkJCTB4MQkJCQkvLyBkZXZpY2UgcHJlc2VudCBidXQgbm90IHJlZ2lzdGVyZWQgYWN0aXZlCisjZGVmaW5lCURFVklDRV9BVEFQSQkJCQkweDIJCQkJLy8gQVRBUEkgZGV2aWNlIChDRF9ST00sIFRhcGUsIEV0Yy4uLikKKyNkZWZpbmUJREVWSUNFX0RBU0RfTk9OTEJBCQkJMHgzCQkJCS8vIE5vbiBMQkEgaW5jb21wYXRpYmxlIGRldmljZQorI2RlZmluZQlERVZJQ0VfREFTRF9MQkEJCQkJMHg0CQkJCS8vIExCQSBjb21wYXRpYmxlIGRldmljZQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCUJpZ0QgZmFpbCByZWdpc3RlciBiaXRzCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJRkFJTF9OT05FCQkJCTB4MDAKKyNkZWZpbmUJRkFJTF8wCQkJCQkweDAxCisjZGVmaW5lCUZBSUxfMQkJCQkJMHgwMgorI2RlZmluZQlGQUlMXzIJCQkJCTB4MDQKKyNkZWZpbmUJRkFJTF9NVUxUSVBMRQkJCTB4MDgKKyNkZWZpbmUJRkFJTF9HT09ECQkJCTB4MjAKKyNkZWZpbmUJRkFJTF9BVURJQkxFCQkJMHg0MAorI2RlZmluZQlGQUlMX0FOWQkJCQkweDgwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJU2V0dXAgU3RydWN0dXJlIERlZmluaXRpb25zCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QJCS8vIGRldmljZSBzZXR1cCBwYXJhbWV0ZXJzCisJeworCVVDSEFSCWdlb21ldHJ5Q29udHJvbDsJLy8gZ2VvbWV0cnkgY29udHJvbCBmbGFncworCVVDSEFSCWRldmljZTsJCQkJLy8gZGV2aWNlIGNvZGUKKwlVU0hPUlQJc2VjdG9yczsJCQkvLyBudW1iZXIgb2Ygc2VjdG9ycyBwZXIgdHJhY2sKKwlVU0hPUlQJaGVhZHM7CQkJCS8vIG51bWJlciBvZiBoZWFkcworCVVTSE9SVAljeWxpbmRlcnM7CQkJLy8gbnVtYmVyIG9mIGN5bGluZGVycyBmb3IgdGhpcyBkZXZpY2UKKwlVTE9ORwlibG9ja3M7CQkJCS8vIG51bWJlciBvZiBibG9ja3Mgb24gZGV2aWNlCisJVUxPTkcJcmVhbENhcGFjaXR5OwkJLy8gbnVtYmVyIG9mIHJlYWwgYmxvY2tzIG9uIHRoaXMgZGV2aWNlIGZvciBkcml2ZSBjaGFuZ2VkIHRlc3RpbmcKKwl9IFNFVFVQX0RFVklDRSwgKlBTRVRVUF9ERVZJQ0U7CisKK3R5cGVkZWYgc3RydWN0CQkvLyBtYXN0ZXIgc2V0dXAgc3RydWN0dXJlCisJeworCVVTSE9SVAkJCXN0YXJ0dXBEZWxheTsKKwlCT09MCQkJcHJvbXB0QklPUzsKKwlCT09MCQkJZmFzdEZvcm1hdDsKKwlCT09MCQkJc2hhcmVJbnRlcnJ1cHQ7CisJQk9PTAkJCXJlYm9vdFJlYnVpbGQ7CisJVVNIT1JUCQkJdGltaW5nTW9kZTsKKwlVU0hPUlQJCQlzcGFyZTU7CisJVVNIT1JUCQkJc3BhcmU2OworCVNFVFVQX0RFVklDRQlzZXR1cERldmljZVtCSUdEX01BWERSSVZFU107CisJfQlTRVRVUCwgKlBTRVRVUDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlSQUlEIFN0cnVjdHVyZSBEZWZpbml0aW9ucwkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYJc3RydWN0CisJeworCVVDSEFSCXNpZ25hdHVyZTsJCQkvLyAweDU1IG91ciBtaXJyb3Igc2lnbmF0dXJlCisJVUNIQVIJc3RhdHVzOwkJCQkvLyBjdXJyZW50IHN0YXR1cyBiaXRzCisJVUNIQVIJcGFpcklkZW50aWZpZXI7CQkvLyB1bmlxdWUgaWRlbnRpZmllciBmb3IgcGFpcgorCVVMT05HCXJlY29uc3RydWN0UG9pbnQ7CS8vIHJlY29udHJ1Y3Rpb24gcG9pbnQgZm9yIGhvdCByZWNvbnN0cnVjdAorCX0JRElTS19NSVJST1I7CisKK3R5cGVkZWYgc3RydWN0CURFVklDRV9SQUlEMQorCXsKKwlsb25nCQlUb3RhbFNlY3RvcnM7CisJRElTS19NSVJST1IgRGlza1JhaWQxOworCX0JREVWSUNFX1JBSUQxLCAqUERFVklDRV9SQUlEMTsKKworI2RlZmluZQlESVNLX01JUlJPUl9QT1NJVElPTgkweDAxQTgKKyNkZWZpbmUJU0lHTkFUVVJFCQkJCTB4NTUKKworI2RlZmluZQlNQVNLX1NFUklBTF9OVU1CRVIJMHgwRkZFCQkJLy8gbWFzayBmb3Igc2VyaWFsIG51bWJlciBtYXRjaGluZworI2RlZmluZQlNQVNLX1NFUklBTF9VTklUCTB4MDAwMQkJCS8vIG1hc2sgZm9yIHVuaXQgcG9ydGlvbiBvZiBzZXJpYWwgbnVtYmVyCisKKy8vIFN0YXR1cyBiaXRzCisjZGVmaW5lCVVDQkZfTUlSUk9SRUQJCTB4MDAxMAkJCQkJCQkJLy8gZHJpdmUgaGFzIGEgcGFpcgorI2RlZmluZQlVQ0JGX01BVENIRUQJCTB4MDAyMAkJCQkJCQkJLy8gZHJpdmUgcGFpciBpcyBtYXRjaGVkCisjZGVmaW5lCVVDQkZfU1VSVklWT1IJCTB4MDA0MAkJCQkJCQkJLy8gdGhpcyB1bml0IGlzIGEgc3Vydml2b3Igb2YgYSBwYWlyCisjZGVmaW5lCVVDQkZfUkVCVUlMRAkJMHgwMDgwCQkJCQkJCQkvLyByZWJ1aWxkIGluIHByb2dyZXNzIG9uIHRoaXMgZGV2aWNlCisKKy8vIFNDU0kgY29udHJvbHMgZm9yIFJBSUQKKyNkZWZpbmUJU0NfTVlfUkFJRAkJCTB4QkYJCQkvLyBvdXIgc3BlY2lhbCBDREIgY29tbWFuZCBieXRlIGZvciBXaW45NS4uLiBpbnRlcmZhY2UKKyNkZWZpbmUJTVlfU0NTSV9RVUVSWTEJCTB4MzIJCQkvLyBieXRlIDEgc3ViY29tbWFuZCB0byBxdWVyeSBkcml2ZXIgZm9yIFJBSUQgMSBpbmZvcm1hdGF0aW9uCisjZGVmaW5lCU1ZX1NDU0lfUkVCVUlMRAkJMHg0MAkJCS8vIGJ5dGUgMSBzdWJjb21tYW5kIHRvIHJlY29uc3RydWN0IGEgbWlycm9yZWQgcGFpcgorI2RlZmluZSBNWV9TQ1NJX0RFTU9GQUlMCTB4NTQJCQkvLyBieXRlIDEgc3ViY29tbWFuZCBmb3IgUkFJRCBmYWlsdXJlIGRlbW9uc3RyYXRpb24KKyNkZWZpbmUJTVlfU0NTSV9BTEFSTU1VVEUJMHg2MAkJCS8vIGJ5dGUgMSBzdWJjb21tYW5kIHRvIG11dGUgYW55IGFsYXJtIGN1cnJlbnRseSBvbgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCVRpbWVvdXQga29uc3RhbnRzCQkgCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlUSU1FT1VUX1JFQURZCQkJCTEwMAkJCS8vIDEwMCBtU2VjCisjZGVmaW5lCVRJTUVPVVRfRFJRCQkJCQkzMDAJCQkvLyAzMDAgbVNlYworI2RlZmluZQlUSU1FT1VUX0RBVEEJCQkJKDMgKiBIWikJLy8gMyBzZWNvbmRzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJTWlzYy4gbWFjcm9zCQkJIAkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQU5ZMlNDU0kodXAsIHApCQkJCQlcCisoKFVDSEFSICopdXApWzBdID0gKCgoVUxPTkcpKHApKSA+PiA4KTsJXAorKChVQ0hBUiAqKXVwKVsxXSA9ICgoVUxPTkcpKHApKTsKKworI2RlZmluZSBTQ1NJMkxPTkcodXApCQkJCQlcCisoICgoKGxvbmcpKigoKFVDSEFSICopdXApKSkgPDwgMTYpCQlcCisrICgoKGxvbmcpKCgoVUNIQVIgKil1cClbMV0pKSA8PCA4KQkJXAorKyAoKGxvbmcpKCgoVUNIQVIgKil1cClbMl0pKSApCisKKyNkZWZpbmUgWEFOWTJTQ1NJKHVwLCBwKQkJCQlcCisoKFVDSEFSICopdXApWzBdID0gKChsb25nKShwKSkgPj4gMjQ7CVwKKygoVUNIQVIgKil1cClbMV0gPSAoKGxvbmcpKHApKSA+PiAxNjsJXAorKChVQ0hBUiAqKXVwKVsyXSA9ICgobG9uZykocCkpID4+IDg7CVwKKygoVUNIQVIgKil1cClbM10gPSAoKGxvbmcpKHApKTsKKworI2RlZmluZSBYU0NTSTJMT05HKHVwKQkJCQkJXAorKCAoKChsb25nKSgoKFVDSEFSICopdXApWzBdKSkgPDwgMjQpCVwKKysgKCgobG9uZykoKChVQ0hBUiAqKXVwKVsxXSkpIDw8IDE2KQlcCisrICgoKGxvbmcpKCgoVUNIQVIgKil1cClbMl0pKSA8PCAgOCkJXAorKyAoKGxvbmcpKCgoVUNIQVIgKil1cClbM10pKSApCisKKyNkZWZpbmUJU2VsZWN0U3BpZ290KHBhZGFwdGVyLHNwaWdvdCkJb3V0Yl9wIChzcGlnb3QsIHBhZGFwdGVyLT5yZWdTdGF0U2VsKQorI2RlZmluZSBXcml0ZUNvbW1hbmQocGFkYXB0ZXIsY21kKQkJb3V0Yl9wIChjbWQsIHBhZGFwdGVyLT5yZWdTdGF0Q21kKQorI2RlZmluZQlBdGFwaURldmljZShwYWRhcHRlcixiKQkJCW91dGJfcCAoYiwgcGFkYXB0ZXItPnJlZ0xiYTI0KTsKKyNkZWZpbmUJQXRhcGlDb3VudExvKHBhZGFwdGVyLGIpCQlvdXRiX3AgKGIsIHBhZGFwdGVyLT5yZWdMYmE4KQorI2RlZmluZQlBdGFwaUNvdW50SGkocGFkYXB0ZXIsYikJCW91dGJfcCAoYiwgcGFkYXB0ZXItPnJlZ0xiYTE2KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCVNDU0kgQ0RCIG9wZXJhdGlvbiBjb2RlcyAJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNDU0lPUF9URVNUX1VOSVRfUkVBRFkJCTB4MDAKKyNkZWZpbmUgU0NTSU9QX1JFWkVST19VTklUCQkJMHgwMQorI2RlZmluZSBTQ1NJT1BfUkVXSU5ECQkJCTB4MDEKKyNkZWZpbmUgU0NTSU9QX1JFUVVFU1RfQkxPQ0tfQUREUgkweDAyCisjZGVmaW5lIFNDU0lPUF9SRVFVRVNUX1NFTlNFCQkweDAzCisjZGVmaW5lIFNDU0lPUF9GT1JNQVRfVU5JVAkJCTB4MDQKKyNkZWZpbmUgU0NTSU9QX1JFQURfQkxPQ0tfTElNSVRTCTB4MDUKKyNkZWZpbmUgU0NTSU9QX1JFQVNTSUdOX0JMT0NLUwkJMHgwNworI2RlZmluZSBTQ1NJT1BfUkVBRDYJCQkJMHgwOAorI2RlZmluZSBTQ1NJT1BfUkVDRUlWRQkJCQkweDA4CisjZGVmaW5lIFNDU0lPUF9XUklURTYJCQkJMHgwQQorI2RlZmluZSBTQ1NJT1BfUFJJTlQJCQkJMHgwQQorI2RlZmluZSBTQ1NJT1BfU0VORAkJCQkJMHgwQQorI2RlZmluZSBTQ1NJT1BfU0VFSzYJCQkJMHgwQgorI2RlZmluZSBTQ1NJT1BfVFJBQ0tfU0VMRUNUCQkJMHgwQgorI2RlZmluZSBTQ1NJT1BfU0xFV19QUklOVAkJCTB4MEIKKyNkZWZpbmUgU0NTSU9QX1NFRUtfQkxPQ0sJCQkweDBDCisjZGVmaW5lIFNDU0lPUF9QQVJUSVRJT04JCQkweDBECisjZGVmaW5lIFNDU0lPUF9SRUFEX1JFVkVSU0UJCQkweDBGCisjZGVmaW5lIFNDU0lPUF9XUklURV9GSUxFTUFSS1MJCTB4MTAKKyNkZWZpbmUgU0NTSU9QX0ZMVVNIX0JVRkZFUgkJCTB4MTAKKyNkZWZpbmUgU0NTSU9QX1NQQUNFCQkJCTB4MTEKKyNkZWZpbmUgU0NTSU9QX0lOUVVJUlkJCQkJMHgxMgorI2RlZmluZSBTQ1NJT1BfVkVSSUZZNgkJCQkweDEzCisjZGVmaW5lIFNDU0lPUF9SRUNPVkVSX0JVRl9EQVRBCQkweDE0CisjZGVmaW5lIFNDU0lPUF9NT0RFX1NFTEVDVAkJCTB4MTUKKyNkZWZpbmUgU0NTSU9QX1JFU0VSVkVfVU5JVAkJCTB4MTYKKyNkZWZpbmUgU0NTSU9QX1JFTEVBU0VfVU5JVAkJCTB4MTcKKyNkZWZpbmUgU0NTSU9QX0NPUFkJCQkJCTB4MTgKKyNkZWZpbmUgU0NTSU9QX0VSQVNFCQkJCTB4MTkKKyNkZWZpbmUgU0NTSU9QX01PREVfU0VOU0UJCQkweDFBCisjZGVmaW5lIFNDU0lPUF9TVEFSVF9TVE9QX1VOSVQJCTB4MUIKKyNkZWZpbmUgU0NTSU9QX1NUT1BfUFJJTlQJCQkweDFCCisjZGVmaW5lIFNDU0lPUF9MT0FEX1VOTE9BRAkJCTB4MUIKKyNkZWZpbmUgU0NTSU9QX1JFQ0VJVkVfRElBR05PU1RJQwkweDFDCisjZGVmaW5lIFNDU0lPUF9TRU5EX0RJQUdOT1NUSUMJCTB4MUQKKyNkZWZpbmUgU0NTSU9QX01FRElVTV9SRU1PVkFMCQkweDFFCisjZGVmaW5lIFNDU0lPUF9SRUFEX0NBUEFDSVRZCQkweDI1CisjZGVmaW5lIFNDU0lPUF9SRUFECQkJCQkweDI4CisjZGVmaW5lIFNDU0lPUF9XUklURQkJCQkweDJBCisjZGVmaW5lIFNDU0lPUF9TRUVLCQkJCQkweDJCCisjZGVmaW5lIFNDU0lPUF9MT0NBVEUJCQkJMHgyQgorI2RlZmluZSBTQ1NJT1BfV1JJVEVfVkVSSUZZCQkJMHgyRQorI2RlZmluZSBTQ1NJT1BfVkVSSUZZCQkJCTB4MkYKKyNkZWZpbmUgU0NTSU9QX1NFQVJDSF9EQVRBX0hJR0gJCTB4MzAKKyNkZWZpbmUgU0NTSU9QX1NFQVJDSF9EQVRBX0VRVUFMCTB4MzEKKyNkZWZpbmUgU0NTSU9QX1NFQVJDSF9EQVRBX0xPVwkJMHgzMgorI2RlZmluZSBTQ1NJT1BfU0VUX0xJTUlUUwkJCTB4MzMKKyNkZWZpbmUgU0NTSU9QX1JFQURfUE9TSVRJT04JCTB4MzQKKyNkZWZpbmUgU0NTSU9QX1NZTkNIUk9OSVpFX0NBQ0hFCTB4MzUKKyNkZWZpbmUgU0NTSU9QX0NPTVBBUkUJCQkJMHgzOQorI2RlZmluZSBTQ1NJT1BfQ09QWV9DT01QQVJFCQkJMHgzQQorI2RlZmluZSBTQ1NJT1BfV1JJVEVfREFUQV9CVUZGCQkweDNCCisjZGVmaW5lIFNDU0lPUF9SRUFEX0RBVEFfQlVGRgkJMHgzQworI2RlZmluZSBTQ1NJT1BfQ0hBTkdFX0RFRklOSVRJT04JMHg0MAorI2RlZmluZSBTQ1NJT1BfUkVBRF9TVUJfQ0hBTk5FTAkJMHg0MgorI2RlZmluZSBTQ1NJT1BfUkVBRF9UT0MJCQkJMHg0MworI2RlZmluZSBTQ1NJT1BfUkVBRF9IRUFERVIJCQkweDQ0CisjZGVmaW5lIFNDU0lPUF9QTEFZX0FVRElPCQkJMHg0NQorI2RlZmluZSBTQ1NJT1BfUExBWV9BVURJT19NU0YJCTB4NDcKKyNkZWZpbmUgU0NTSU9QX1BMQVlfVFJBQ0tfSU5ERVgJCTB4NDgKKyNkZWZpbmUgU0NTSU9QX1BMQVlfVFJBQ0tfUkVMQVRJVkUJMHg0OQorI2RlZmluZSBTQ1NJT1BfUEFVU0VfUkVTVU1FCQkJMHg0QgorI2RlZmluZSBTQ1NJT1BfTE9HX1NFTEVDVAkJCTB4NEMKKyNkZWZpbmUgU0NTSU9QX0xPR19TRU5TRQkJCTB4NEQKKyNkZWZpbmUgU0NTSU9QX01PREVfU0VMRUNUMTAJCTB4NTUKKyNkZWZpbmUgU0NTSU9QX01PREVfU0VOU0UxMAkJCTB4NUEKKyNkZWZpbmUgU0NTSU9QX0xPQURfVU5MT0FEX1NMT1QJCTB4QTYKKyNkZWZpbmUgU0NTSU9QX01FQ0hBTklTTV9TVEFUVVMJCTB4QkQKKyNkZWZpbmUgU0NTSU9QX1JFQURfQ0QJCQkJMHhCRQorCisvLyBJREUgY29tbWFuZCBkZWZpbml0aW9ucworI2RlZmluZSBJREVfQ09NTUFORF9BVEFQSV9SRVNFVAkJMHgwOAorI2RlZmluZSBJREVfQ09NTUFORF9SRUFECQkJMHgyMAorI2RlZmluZSBJREVfQ09NTUFORF9XUklURQkJCTB4MzAKKyNkZWZpbmUgSURFX0NPTU1BTkRfUkVDQUxJQlJBVEUJCTB4MTAKKyNkZWZpbmUgSURFX0NPTU1BTkRfU0VFSwkJCTB4NzAKKyNkZWZpbmUgSURFX0NPTU1BTkRfU0VUX1BBUkFNRVRFUlMJMHg5MQorI2RlZmluZSBJREVfQ09NTUFORF9WRVJJRlkJCQkweDQwCisjZGVmaW5lIElERV9DT01NQU5EX0FUQVBJX1BBQ0tFVAkweEEwCisjZGVmaW5lIElERV9DT01NQU5EX0FUQVBJX0lERU5USUZZCTB4QTEKKyNkZWZpbmUJSURFX0NNRF9SRUFEX01VTFRJUExFCQkweEM0CisjZGVmaW5lCUlERV9DTURfV1JJVEVfTVVMVElQTEUJCTB4QzUKKyNkZWZpbmUJSURFX0NNRF9TRVRfTVVMVElQTEUJCTB4QzYKKyNkZWZpbmUgSURFX0NPTU1BTkRfSURFTlRJRlkJCTB4RUMKKworLy8gSURFIHN0YXR1cyBkZWZpbml0aW9ucworI2RlZmluZSBJREVfU1RBVFVTX0VSUk9SCQkJMHgwMQorI2RlZmluZSBJREVfU1RBVFVTX0lOREVYCQkJMHgwMgorI2RlZmluZSBJREVfU1RBVFVTX0NPUlJFQ1RFRF9FUlJPUgkweDA0CisjZGVmaW5lIElERV9TVEFUVVNfRFJRCQkJCTB4MDgKKyNkZWZpbmUgSURFX1NUQVRVU19EU0MJCQkJMHgxMAorI2RlZmluZQlJREVfU1RBVFVTX1dSSVRFX0ZBVUxUCQkweDIwCisjZGVmaW5lIElERV9TVEFUVVNfRFJEWQkJCQkweDQwCisjZGVmaW5lIElERV9TVEFUVVNfQlVTWQkJCQkweDgwCisKK3R5cGVkZWYgc3RydWN0IF9BVEFQSV9TVEFUVVMKKwl7CisJQ0hBUgljaGVjawkJOjE7CisJQ0hBUglyZXNlcnZlZDEJOjE7CisJQ0hBUgljb3JyCQk6MTsKKwlDSEFSCWRycQkJCToxOworCUNIQVIJZHNjCQkJOjE7CisJQ0hBUglyZXNlcnZlZDIJOjE7CisJQ0hBUglkcmR5CQk6MTsKKwlDSEFSCWJzeQkJCToxOworCX0JQVRBUElfU1RBVFVTOworCit0eXBlZGVmIHN0cnVjdCBfQVRBUElfUkVBU09OCisJeworCUNIQVIJY29kCQkJOjE7CisJQ0hBUglpbwkJCToxOworCUNIQVIJcmVzZXJ2ZWQxCTo2OworCX0JQVRBUElfUkVBU09OOworCit0eXBlZGVmIHN0cnVjdCBfQVRBUElfRVJST1IKKwl7CisJQ0hBUglpbGkJCQk6MTsKKwlDSEFSCWVvbQkJCToxOworCUNIQVIJYWJvcnQJCToxOworCUNIQVIJbWNyCQkJOjE7CisJQ0hBUglzZW5zZUtleQk6NDsKKwl9CUFUQVBJX0VSUk9SOworCisvLyBJREUgZXJyb3IgZGVmaW5pdGlvbnMKKyNkZWZpbmUJSURFX0VSUk9SX0FNTkYJCQkJMHgwMQorI2RlZmluZQlJREVfRVJST1JfVEtPTkYJCQkJMHgwMgorI2RlZmluZQlJREVfRVJST1JfQUJSVAkJCQkweDA0CisjZGVmaW5lCUlERV9FUlJPUl9NQ1IJCQkJMHgwOAorI2RlZmluZQlJREVfRVJST1JfSURGTgkJCQkweDEwCisjZGVmaW5lCUlERV9FUlJPUl9NQwkJCQkweDIwCisjZGVmaW5lCUlERV9FUlJPUl9VTkMJCQkJMHg0MAorI2RlZmluZQlJREVfRVJST1JfQkJLCQkJCTB4ODAKKworLy8gU0NTSSByZWFkIGNhcGFjaXR5IHN0cnVjdHVyZQordHlwZWRlZglzdHJ1Y3QgX1JFQURfQ0FQQUNJVFlfREFUQQorCXsKKwlVTE9ORyBibGtzOwkJCQkvKiB0b3RhbCBibG9ja3MgKGNvbnZlcnRlZCB0byBsaXR0bGUgZW5kaWFuKSAqLworCVVMT05HIGJsa3NpejsJCQkvKiBzaXplIG9mIGVhY2ggKGNvbnZlcnRlZCB0byBsaXR0bGUgZW5kaWFuKSAqLworCX0JUkVBRF9DQVBBQ0lUWV9EQVRBLCAqUFJFQURfQ0FQQUNJVFlfREFUQTsKKworLy8gU0NTSSBpbnF1aXJ5IGRhdGEKK3R5cGVkZWYgc3RydWN0IF9JTlFVSVJZREFUQQorCXsKKwlVQ0hBUiBEZXZpY2VUeXBlCQkJOjU7CisJVUNIQVIgRGV2aWNlVHlwZVF1YWxpZmllcgk6MzsKKwlVQ0hBUiBEZXZpY2VUeXBlTW9kaWZpZXIJOjc7CisJVUNIQVIgUmVtb3ZhYmxlTWVkaWEJCToxOworICAgIFVDSEFSIFZlcnNpb25zOworICAgIFVDSEFSIFJlc3BvbnNlRGF0YUZvcm1hdDsKKyAgICBVQ0hBUiBBZGRpdGlvbmFsTGVuZ3RoOworICAgIFVDSEFSIFJlc2VydmVkWzJdOworCVVDSEFSIFNvZnRSZXNldAkJCQk6MTsKKwlVQ0hBUiBDb21tYW5kUXVldWUJCQk6MTsKKwlVQ0hBUiBSZXNlcnZlZDIJCQkJOjE7CisJVUNIQVIgTGlua2VkQ29tbWFuZHMJCToxOworCVVDSEFSIFN5bmNocm9ub3VzCQkJOjE7CisJVUNIQVIgV2lkZTE2Qml0CQkJCToxOworCVVDSEFSIFdpZGUzMkJpdAkJCQk6MTsKKwlVQ0hBUiBSZWxhdGl2ZUFkZHJlc3NpbmcJOjE7CisgICAgVUNIQVIgVmVuZG9ySWRbOF07CisgICAgVUNIQVIgUHJvZHVjdElkWzE2XTsKKyAgICBVQ0hBUiBQcm9kdWN0UmV2aXNpb25MZXZlbFs0XTsKKyAgICBVQ0hBUiBWZW5kb3JTcGVjaWZpY1syMF07CisgICAgVUNIQVIgUmVzZXJ2ZWQzWzQwXTsKKwl9CUlOUVVJUllEQVRBLCAqUElOUVVJUllEQVRBOworCisvLyBJREUgSURFTlRJRlkgZGF0YQorI3ByYWdtYSBwYWNrICgxKQordHlwZWRlZiBzdHJ1Y3QgX0lERU5USUZZX0RBVEEKKwl7CisgICAgVVNIT1JUCUdlbmVyYWxDb25maWd1cmF0aW9uOwkJLy8gIDAKKyAgICBVU0hPUlQJTnVtYmVyT2ZDeWxpbmRlcnM7CQkJLy8gIDEKKyAgICBVU0hPUlQJUmVzZXJ2ZWQxOwkJCQkJLy8gIDIKKyAgICBVU0hPUlQJTnVtYmVyT2ZIZWFkczsJCQkJLy8gIDMKKyAgICBVU0hPUlQJVW5mb3JtYXR0ZWRCeXRlc1BlclRyYWNrOwkvLyAgNAorICAgIFVTSE9SVAlVbmZvcm1hdHRlZEJ5dGVzUGVyU2VjdG9yOwkvLyAgNQorICAgIFVTSE9SVAlTZWN0b3JzUGVyVHJhY2s7CQkJLy8gIDYKKwlVU0hPUlQJTnVtQnl0ZXNJU0c7CQkJCS8vICA3IEJ5dGUgTGVuIC0gaW50ZXItc2VjdG9yIGdhcAorCVVTSE9SVAlOdW1CeXRlc1N5bmM7CQkJCS8vICA4ICAgICAgICAgIC0gc3luYyBmaWVsZAorCVVTSE9SVAlOdW1Xb3Jkc1ZVUzsJCQkJLy8gIDkgTGVuIC0gVmVuZG9yIFVuaXF1ZSBJbmZvCisgICAgVVNIT1JUCVNlcmlhbE51bWJlclsxMF07CQkJLy8gMTAKKyAgICBVU0hPUlQJQnVmZmVyVHlwZTsJCQkJCS8vIDIwCisgICAgVVNIT1JUCUJ1ZmZlclNlY3RvclNpemU7CQkJLy8gMjEKKyAgICBVU0hPUlQJTnVtYmVyT2ZFY2NCeXRlczsJCQkvLyAyMgorICAgIFVTSE9SVAlGaXJtd2FyZVJldmlzaW9uWzRdOwkJLy8gMjMKKyAgICBVU0hPUlQJTW9kZWxOdW1iZXJbMjBdOwkJCS8vIDI3CisJVVNIT1JUCU51bVNlY3RvcnNQZXJJbnQJOjg7CQkvLyA0NyBNdWx0aXBsZSBNb2RlIC0gU2VjL0JsaworCVVTSE9SVAlSZXNlcnZlZDIJCQk6ODsJCS8vIDQ3CisJVVNIT1JUCURvdWJsZVdvcmRNb2RlOwkJCQkvLyA0OCBmbGFnIGZvciBkb3VibGUgd29yZCBtb2RlIGNhcGFibGUKKwlVU0hPUlQJVmVuZG9yVW5pcXVlMQkJOjg7CQkvLyA0OQorCVVTSE9SVAlTdXBwb3J0RE1BCQkJOjE7CQkvLyA0OSBETUEgc3VwcG9ydGVkCisJVVNIT1JUCVN1cHBvcnRMQkEJCQk6MTsJCS8vIDQ5IExCQSBzdXBwb3J0ZWQKKwlVU0hPUlQJU3VwcG9ydElPUkRZRGlzYWJsZQk6MTsJCS8vIDQ5IElPUkRZIGNhbiBiZSBkaXNhYmxlZAorCVVTSE9SVAlTdXBwb3J0SU9SRFkJCToxOwkJLy8gNDkgSU9SRFkgc3VwcG9ydGVkCisJVVNIT1JUCVJlc2VydmVkUHN1ZWRvRE1BCToxOwkJLy8gNDkgcmVzZXJ2ZWQgZm9yIHBzZXVkbyBETUEgbW9kZSBzdXBwb3J0CisJVVNIT1JUCVJlc2VydmVkMwkJCTozOwkJLy8gNDkKKwlVU0hPUlQJUmVzZXJ2ZWQ0OwkJCQkJLy8gNTAKKwlVU0hPUlQJUmVzZXJ2ZWQ1CQkJOjg7CQkvLyA1MSBUcmFuc2ZlciBDeWNsZSBUaW1pbmcgLSBQSU8KKwlVU0hPUlQJUElPQ3ljbGVUaW1lCQk6ODsJCS8vIDUxIFRyYW5zZmVyIEN5Y2xlIFRpbWluZyAtIFBJTworCVVTSE9SVAlSZXNlcnZlZDYJCQk6ODsJCS8vIDUyICAgICAgICAgICAgICAgICAgICAgICAtIERNQQorCVVTSE9SVAlETUFDeWNsZVRpbWUJCTo4OwkJLy8gNTIgICAgICAgICAgICAgICAgICAgICAgIC0gRE1BCisJVVNIT1JUCVZhbGlkXzU0XzU4CQkJOjE7CQkvLyA1MyB3b3JkcyA1NCAtIDU4IGFyZSB2YWxpZAorCVVTSE9SVAlWYWxpZF82NF83MAkJCToxOwkJLy8gNTMgd29yZHMgNjQgLSA3MCBhcmUgdmFsaWQKKwlVU0hPUlQJUmVzZXJ2ZWQ3CQkJOjE0OwkvLyA1MworCVVTSE9SVAlMb2dOdW1DeWw7CQkJCQkvLyA1NCBDdXJyZW50IFRyYW5zbGF0aW9uIC0gTnVtIEN5bAorCVVTSE9SVAlMb2dOdW1IZWFkczsJCQkJLy8gNTUgICAgICAgICAgICAgICAgICAgICAgIE51bSBIZWFkcworCVVTSE9SVAlMb2dTZWN0b3JzUGVyVHJhY2s7CQkJLy8gNTYgICAgICAgICAgICAgICAgICAgICAgIFNlYy9UcmsKKwlVTE9ORwlMb2dUb3RhbFNlY3RvcnM7CQkJLy8gNTcgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsIFNlYworCVVTSE9SVAlDdXJyZW50TnVtU2VjUGVySW50CTo4OwkJLy8gNTkgY3VycmVudCBzZXR0aW5nIGZvciBudW1iZXIgb2Ygc2VjdG9ycyBwZXIgaW50ZXJydXB0CisJVVNIT1JUCVZhbGlkTnVtU2VjUGVySW50CToxOwkJLy8gNTkgQ3VycmVudCBzZXR0aW5nIGlzIHZhbGlkIGZvciBudW1iZXIgb2Ygc2VjdG9ycyBwZXIgaW50ZXJydXB0CisJVVNIT1JUCVJlc2VydmVkOAkJCTo3OwkJLy8gNTkKKwlVTE9ORwlMQkFUb3RhbFNlY3RvcnM7CQkJLy8gNjAgTEJBIE1vZGUgLSBTZWN0b3JzCisJVVNIT1JUCURNQVNXb3JkRmxhZ3M7CQkJCS8vIDYyCisJVVNIT1JUCURNQU1Xb3JkRmxhZ3M7CQkJCS8vIDYzCisJVVNIT1JUCUFkdmFuY2VkUElPU3VwcG9ydCAgOjg7CQkvLyA2NCBGbG93IGNvbnRyb2wgUElPIHRyYW5zZmVyIG1vZGVzIHN1cHBvcnRlZAorCVVTSE9SVAlSZXNlcnZlZDkJCQk6ODsJCS8vIDY0CisJVVNIT1JUCU1pbk11bHRpRE1BQ3ljbGU7CQkJLy8gNjUgbWluaW11bSBtdWx0aXdvcmQgRE1BIHRyYW5zZmVyIGN5Y2xlIHRpbWUgcGVyIHdvcmQKKwlVU0hPUlQJUmVjb21lbmRETUFDeWNsZTsJCQkvLyA2NiBNYW51ZmFjdHVyZXIncyByZWNvbW1lbmRlIG11bHRpd29yZCBETUEgdHJhbnNmZXIgY3ljbGUgdGltZQorCVVTSE9SVAlNaW5QSU9DeWNsZVdpdGhvdXRGbG93OwkJLy8gNjcgTWluaW11bSBQSU8gdHJhbnNmZXIgY3ljbGUgdGltZSB3aXRob3V0IGZsb3cgY29udHJvbAorCVVTSE9SVAlNaW5QSU9DeWxjZVdpdGhGbG93OwkJLy8gNjggTWluaW11bSBQSU8gdHJhbnNmZXIgY3ljbGUgdGltZSB3aXRoIElPUkRZIGZsb3cgY29udHJvbAorCVVTSE9SVAlSZXNlcnZlZFNwYWNlWzI1Ni02OV07CQkvLyA2OQorCX0JSURFTlRJRllfREFUQSwgKlBJREVOVElGWV9EQVRBOworCisvLyBBVEFQSSBjb25maWd1cmF0aW9uIGJpdHMKK3R5cGVkZWYgc3RydWN0IF9BVEFQSV9HRU5FUkFMXzAKKwl7CisJVVNIT1JUCUNtZFBhY2tldFNpemUJCToyOwkJLy8gQ29tbWFuZCBwYWNrZXQgc2l6ZQorCVVTSE9SVAlSZXNlcnZlZDEJCQk6MzsKKwlVU0hPUlQJQ21kRHJxVHlwZQkJCToyOworCVVTSE9SVAlSZW1vdmFibGUJCQk6MTsKKwlVU0hPUlQJRGV2aWNlVHlwZQkJCTo1OworCVVTSE9SVAlSZXNlcnZlZDIJCQk6MTsKKwlVU0hPUlQJUHJvdG9jb2xUeXBlCQk6MjsKKwl9CUFUQVBJX0dFTkVSQUxfMDsKKworI3ByYWdtYSBwYWNrICgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcHNpX3JveS5oIGIvZHJpdmVycy9zY3NpL3BzaV9yb3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTViOWMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BzaV9yb3kuaApAQCAtMCwwICsxLDMzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBlcmNlcHRpdmUgU29sdXRpb25zLCBJbmMuIFBDSS0yMDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIHBzaV9yb3kuaCAtIExpbnV4IEhvc3QgRHJpdmVyIGZvciBQQ0ktMjAwMCBJbnRlbGxpQ2FjaGUgU0NTSSBBZGFwdGVycworICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5IFBlcmNlcHRpdmUgU29sdXRpb25zLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZQorICogY29kZSByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgY29tbWVudCB3aXRob3V0CisgKiBtb2RpZmljYXRpb24uCisgKgorICogVGVjaG5pY2FsIHVwZGF0ZXMgYW5kIHByb2R1Y3QgaW5mb3JtYXRpb24gYXQ6CisgKiAgaHR0cDovL3d3dy5wc2lkaXNrLmNvbQorICoKKyAqIFBsZWFzZSBzZW5kIHF1ZXN0aW9ucywgY29tbWVudHMsIGJ1ZyByZXBvcnRzIHRvOgorICogIHRlY2hAcHNpZGlzay5jb20gVGVjaG5pY2FsIFN1cHBvcnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZglST1lfSE9TVAorI2RlZmluZQlST1lfSE9TVAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCVBDSSBzZXR1cAkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCVZFTkRPUl9QU0kJCQkweDEyNTYKKyNkZWZpbmUJREVWSUNFX1JPWV8xCQkweDUyMDEJCS8qICdSMScgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQljb250cm9sbGVyIGNvbnN0YW50cwkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1BWEFEQVBURVIJCQk0CQkJLy8gSW5jcmVhc2UgdGhpcyBhbmQgdGhlIHNpemVzIG9mIHRoZSBhcnJheXMgYmVsb3csIGlmIHlvdSBuZWVkIG1vcmUuCisjZGVmaW5lCU1BWF9CVVMJCQkJMgorI2RlZmluZQlNQVhfVU5JVFMJCQkxNgorI2RlZmluZQlUSU1FT1VUX0NPTU1BTkQJCTQwMAkJCS8vIG51bWJlciBvZiBtaWxsaVNlY29uZG9zIGZvciBjb21tYW5kIGJ1c3kgdGltZW91dAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCUkvTyBhZGRyZXNzIG9mZnNldHMJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUlRSX01BSUxCT1gJCQkJCQkweDA0MAorI2RlZmluZSBSVFJfTE9DQUxfRE9PUkJFTEwJCQkJMHgwNjAKKyNkZWZpbmUgUlRSX1BDSV9ET09SQkVMTAkJCQkweDA2NAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkJCQkqLworLyoJCQlIb3N0IGNvbW1hbmQgY29kZXMJCQkJCSovCisvKgkJCQkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlDTURfUkVBRF9DSFMJCTB4MDEJCS8qIHJlYWQgc2VjdG9ycyBhcyBzcGVjaWZpZWQgKENIUyBtb2RlKSAqLworI2RlZmluZQlDTURfUkVBRAkJCTB4MDIJCS8qIHJlYWQgc2VjdG9ycyBhcyBzcGVjaWZpZWQgKFJCQSBtb2RlKSAqLworI2RlZmluZQlDTURfUkVBRF9TRwkJCTB4MDMJCS8qIHJlYWQgc2VjdG9ycyB1c2luZyBzY2F0dGVyL2dhdGhlciBsaXN0ICovCisjZGVmaW5lCUNNRF9XUklURV9DSFMJCTB4MDQJCS8qIHdyaXRlIHNlY3RvcnMgYXMgc3BlY2lmaWVkIChDSFMgbW9kZSkgKi8KKyNkZWZpbmUJQ01EX1dSSVRFCQkJMHgwNQkJLyogd3JpdGUgc2VjdG9ycyBhcyBzcGVjaWZpZWQgKFJCQSBtb2RlKSAqLworI2RlZmluZQlDTURfV1JJVEVfU0cJCTB4MDYJCS8qIHdyaXRlIHNlY3RvcnMgdXNpbmcgc2NhdHRlci9nYXRoZXIgbGlzdCAoTEJBIG1vZGUpICovCisjZGVmaW5lCUNNRF9SRUFEX0NIU19TRwkJMHgwNwkJLyogcmVhZCBzZWN0b3JzIHVzaW5nIHNjYXR0ZXIvZ2F0aGVyIGxpc3QgKENIUyBtb2RlKSAqLworI2RlZmluZQlDTURfV1JJVEVfQ0hTX1NHCTB4MDgJCS8qIHdyaXRlIHNlY3RvcnMgdXNpbmcgc2NhdHRlci9nYXRoZXIgbGlzdCAoQ0hTIG1vZGUpICovCisjZGVmaW5lCUNNRF9WRVJJRllfQ0hTCQkweDA5CQkvKiB2ZXJpZnkgZGF0YSBvbiBzZWN0b3JzIGFzIHNwZWNpZmllZCAoQ0hTIG1vZGUpICovCisjZGVmaW5lCUNNRF9WRVJJRlkJCQkweDBBCQkvKiB2ZXJpZnkgZGF0YSBvbiBzZWN0b3JzIGFzIHNwZWNpZmllZCAoUkJBIG1vZGUpICovCisjZGVmaW5lCUNNRF9EQVNEX0NEQgkJMHgwQgkJLyogcHJvY2VzcyBDREIgZm9yIGEgREFTRCBkZXZpY2UgKi8KKyNkZWZpbmUJQ01EX0RBU0RfQ0RCX1NHCQkweDBDCQkvKiBwcm9jZXNzIENEQiBmb3IgYSBEQVNEIGRldmljZSB3aXRoIHNjYXR0ZXIvZ2F0aGVyICovCisKKyNkZWZpbmUJQ01EX1JFQURfQUJTCQkweDEwCQkvKiByZWFkIGFic29sdXRlIGRpc2sgKi8KKyNkZWZpbmUJQ01EX1dSSVRFX0FCUwkJMHgxMQkJLyogd3JpdGUgYWJzb2x1dGUgZGlzayAqLworI2RlZmluZQlDTURfVkVSSUZZX0FCUwkJMHgxMgkJLyogdmVyaWZ5IGFic29sdXRlIGRpc2sgKi8KKyNkZWZpbmUJQ01EX1RFU1RfUkVBRFkJCTB4MTMJCS8qIHRlc3QgdW5pdCByZWFkeSBhbmQgcmV0dXJuIHN0YXR1cyBjb2RlICovCisjZGVmaW5lCUNNRF9MT0NLX0RPT1IJCTB4MTQJCS8qIGxvY2sgZGV2aWNlIGRvb3IgKi8KKyNkZWZpbmUJQ01EX1VOTE9DS19ET09SCQkweDE1CQkvKiB1bmxvY2sgZGV2aWNlIGRvb3IgKi8KKyNkZWZpbmUJQ01EX0VKRUNUX01FRElBCQkweDE2CQkvKiBlamVjdCB0aGUgbWVkaWEgKi8KKyNkZWZpbmUJQ01EX1VQREFURV9DQVAJCTB4MTcJCS8qIHVwZGF0ZSBjYXBhY2l0eSBpbmZvcm1hdGlvbiAqLworI2RlZmluZQlDTURfVEVTVF9QUklWCQkweDE4CQkvKiB0ZXN0IGFuZCBzZXR1cCBwcml2YXRlIGZvcm1hdCBtZWRpYSAqLworCisKKyNkZWZpbmUJQ01EX1NDU0lfVEhSVQkJMHgzMAkJLyogU0NTSSBwYXNzIHRocm91Z2ggQ0RCICovCisjZGVmaW5lCUNNRF9TQ1NJX1RIUlVfU0cJMHgzMQkJLyogU0NTSSBwYXNzIHRocm91Z2ggQ0RCIHdpdGggc2NhdHRlci9nYXRoZXIgKi8KKyNkZWZpbmUJQ01EX1NDU0lfUkVRX1NFTlNFCTB4MzIJCS8qIFNDU0kgcGFzcyB0aHJvdWdoIHJlcXVlc3Qgc2Vuc2UgYWZ0ZXIgY2hlY2sgY29uZGl0aW9uICovCisKKyNkZWZpbmUJQ01EX0RBU0RfUkFJRF9SUQkweDM1CQkvKiByZXF1ZXN0IERBU0QgUkFJRCBkcml2ZSBkYXRhICovCisjZGVmaW5lCUNNRF9EQVNEX1JBSURfUlEwCTB4MzEJCQkvKiBieXRlIDEgc3ViY29tbWFuZCB0byBxdWVyeSBmb3IgUkFJRCAwIGluZm9ybWF0YXRpb24gKi8KKyNkZWZpbmUJQ01EX0RBU0RfUkFJRF9SUTEJMHgzMgkJCS8qIGJ5dGUgMSBzdWJjb21tYW5kIHRvIHF1ZXJ5IGZvciBSQUlEIDEgaW5mb3JtYXRhdGlvbiAqLworI2RlZmluZQlDTURfREFTRF9SQUlEX1JRNQkweDMzCQkJLyogYnl0ZSAxIHN1YmNvbW1hbmQgdG8gcXVlcnkgZm9yIFJBSUQgNSBpbmZvcm1hdGF0aW9uICovCisKKyNkZWZpbmUJQ01EX0RBU0RfU0NTSV9JTlEJMHgzNgkJLyogZG8gREFTRCBpbnF1aXJlIGFuZCByZXR1cm4gaW4gU0NTSSBmb3JtYXQgKi8KKyNkZWZpbmUJQ01EX0RBU0RfQ0FQCQkweDM3CQkvKiByZWFkIERBU0QgY2FwYWNpdHkgKi8KKyNkZWZpbmUJQ01EX0RBU0RfSU5RCQkweDM4CQkvKiBkbyBEQVNEIGlucXVpcmUgZm9yIHR5cGUgZGF0YSBhbmQgcmV0dXJuIFNDU0kvRUlERSBpbnF1aXJ5ICovCisjZGVmaW5lCUNNRF9TQ1NJX0lOUQkJMHgzOQkJLyogZG8gU0NTSSBpbnF1aXJlICovCisjZGVmaW5lCUNNRF9SRUFEX1NFVFVQCQkweDNBCQkvKiBHZXQgc2V0dXAgc3RydWN0dXJlcyBmcm9tIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUJQ01EX1dSSVRFX1NFVFVQCQkweDNCCQkvKiBQdXQgc2V0dXAgc3RydWN0dXJlcyBpbiBjb250cm9sbGVyIGFuZCBidXJuIGluIGZsYXNoICovCisjZGVmaW5lCUNNRF9SRUFEX0NPTkZJRwkJMHgzQwkJLyogR2V0IHRoZSBlbnRpcmUgY29uZmlndXJhdGlvbiBhbmQgc2V0dXAgc3RydWN0dXJlcyAqLworI2RlZmluZQlDTURfV1JJVEVfQ09ORklHCTB4M0QJCS8qIFB1dCB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb24gYW5kIHNldHVwIHN0cnVjdHVyZXMgaW4gZmxhc2ggKi8KKworI2RlZmluZQlDTURfVEVYVF9ERVZJQ0UJCTB4M0UJCS8qIG9idGFpbiBkZXZpY2UgdGV4dCAqLworI2RlZmluZQlDTURfVEVYVF9TSUdOT04JCTB4M0YJCS8qIGdldCBzaWduIG9uIGJhbm5lciAqLworCisjZGVmaW5lCUNNRF9RVUVVRQkJCTB4NDAJCS8qIGFueSBjb21tYW5kIGJlbG93IHRoaXMgZ2VuZXJhdGVzIGEgcXVldWUgdGFnIGludGVycnVwdCB0byBob3N0Ki8KKworI2RlZmluZQlDTURfUFJFRkVUQ0gJCTB4NDAJCS8qIHByZWZldGNoIHNlY3RvcnMgYXMgc3BlY2lmaWVkICovCisjZGVmaW5lCUNNRF9URVNUX1dSSVRFCQkweDQxCQkvKiBUZXN0IGEgZGV2aWNlIGZvciB3cml0ZSBwcm90ZWN0ICovCisjZGVmaW5lCUNNRF9MQVNUX1NUQVRVUwkJMHg0MgkJLyogZ2V0IGxhc3QgY29tbWFuZCBzdGF0dXMgYW5kIGVycm9yIGRhdGEqLworI2RlZmluZQlDTURfQUJPUlQJCQkweDQzCQkvKiBhYm9ydCBjb21tYW5kIGFzIHNwZWNpZmllZCAqLworI2RlZmluZQlDTURfRVJST1IJCQkweDQ0CQkvKiBmZXRjaCBlcnJvciBjb2RlIGZyb20gYSB0YWdnZWQgb3AgKi8KKyNkZWZpbmUJQ01EX0RPTkUJCQkweDQ1CQkvKiBkb25lIHdpdGggb3BlcmF0aW9uICovCisjZGVmaW5lCUNNRF9ESUFHTk9TVElDUwkJMHg0NgkJLyogZXhlY3V0ZSBjb250cm9sbGVyIGRpYWdub3N0aWNzIGFuZCB3YWl0IGZvciByZXN1bHRzICovCisjZGVmaW5lCUNNRF9GRUFUVVJFX01PREUJMHg0NwkJLyogZmVhdHVyZSBtb2RlIGNvbnRyb2wgd29yZCAqLworI2RlZmluZQlDTURfREFTRF9JTlFVSVJFCTB4NDgJCS8qIGlucXVpcmUgYXMgdG8gREFTRCBTQ1NJIGRldmljZSAoMzIgcG9zc2libGUpICovCisjZGVmaW5lCUNNRF9GRUFUVVJFX1FVRVJZCTB4NDkJCS8qIHF1ZXJ5IHRoZSBmZWF0dXJlIGNvbnRyb2wgd29yZCAqLworI2RlZmluZQlDTURfREFTRF9FSkVDVAkJMHg0QQkJLyogRWplY3QgcmVtb3ZhYmxlIG1lZGlhIGZvciBEQVNEIHR5cGUgKi8KKyNkZWZpbmUJQ01EX0RBU0RfTE9DSwkJMHg0QgkJLyogTG9jayByZW1vdmFibGUgbWVkaWEgZm9yIERBU0QgdHlwZSAqLworI2RlZmluZQlDTURfREFTRF9UWVBFCQkweDRDCQkvKiBvYnRhaW4gREFTRCBkZXZpY2UgdHlwZSAqLworI2RlZmluZQlDTURfTlVNX0RFVgkJCTB4NEQJCS8qIG9idGFpbiB0aGUgbnVtYmVyIG9mIGRldmljZXMgY29ubmVjdGVkIHRvIHRoZSBjb250cm9sbGVyICovCisjZGVmaW5lCUNNRF9HRVRfUEFSTVMJCTB4NEUJCS8qIG9idGFpbiBkZXZpY2UgcGFyYW1ldGVycyAqLworI2RlZmluZQlDTURfU1BFQ0lGWQkJCTB4NEYJCS8qIHNwZWNpZnkgb3BlcmF0aW5nIHN5c3RlbSBmb3Igc2NhdHRlci9nYXRoZXIgb3BlcmF0aW9ucyAqLworCisjZGVmaW5lCUNNRF9SQUlEX0dFVF9ERVYJMHg1MAkJLyogcmVhZCBSQUlEIGRldmljZSBnZW9tZXRyeSAqLworI2RlZmluZSBDTURfUkFJRF9SRUFECQkweDUxCQkvKiByZWFkIFJBSUQgMSBwYXJhbWV0ZXIgYmxvY2sgKi8KKyNkZWZpbmUJQ01EX1JBSURfV1JJVEUJCTB4NTIJCS8qIHdyaXRlIFJBSUQgMSBwYXJhbWV0ZXIgYmxvY2sgKi8KKyNkZWZpbmUJQ01EX1JBSURfTElURVVQCQkweDUzCQkvKiBMaWdodCB1cCB0aGUgZHJpdmUgbGlnaHQgZm9yIGlkZW50aWZpY2F0aW9uICovCisjZGVmaW5lCUNNRF9SQUlEX1JFQlVJTEQJMHg1NAkJLyogaXNzdWUgYSBSQUlEIDEgcGFpciByZWJ1aWxkICovCisjZGVmaW5lCUNNRF9SQUlEX01VVEUJCTB4NTUJCS8qIG11dGUgUkFJRCBmYWlsdXJlIGFsYXJtICovCisjZGVmaW5lCUNNRF9SQUlEX0ZBSUwJCTB4NTYJCS8qIGluZHVjZSBhIFJBSUQgZmFpbHVyZSAqLworI2RlZmluZQlDTURfUkFJRF9TVEFUVVMJCTB4NTcJCS8qIGdldCBzdGF0dXMgb2YgUkFJRCBwYWlyICovCisjZGVmaW5lCUNNRF9SQUlEX1NUT1AJCTB4NTgJCS8qIHN0b3AgYW55IHJlY29uc3RydWN0IGluIHByb2dyZXNzICovCisjZGVmaW5lIENNRF9SQUlEX1NUQVJUCQkweDU5CQkvKiBzdGFydCByZWNvbnN0cnVjdCAqLworI2RlZmluZQlDTURfUkFJRDBfUkVBRAkJMHg1QQkJLyogcmVhZCBSQUlEIDAgcGFyYW1ldGVyIGJsb2NrICovCisjZGVmaW5lCUNNRF9SQUlEMF9XUklURQkJMHg1QgkJLyogd3JpdGUgUkFJRCAwIHBhcmFtZXRlciBibG9jayAqLworI2RlZmluZQlDTURfUkFJRDVfUkVBRAkJMHg1QwkJLyogcmVhZCBSQUlEIDUgcGFyYW1ldGVyIGJsb2NrICovCisjZGVmaW5lCUNNRF9SQUlENV9XUklURQkJMHg1RAkJLyogd3JpdGUgUkFJRCA1IHBhcmFtZXRlciBibG9jayAqLworCisjZGVmaW5lCUNNRF9FUkFTRV9UQUJMRVMJMHg1RgkJLyogZXJhc2UgcGFydGl0aW9uIHRhYmxlIGFuZCBSQUlEIHNpZ25hdHV0dXJlcyAqLworCisjZGVmaW5lCUNNRF9TQ1NJX0dFVAkJMHg2MAkJLyogZ2V0IFNDU0kgcGFzcyB0aHJvdWdoIGRldmljZXMgKi8KKyNkZWZpbmUJQ01EX1NDU0lfVElNRU9VVAkweDYxCQkvKiBzZXQgU0NTSSBwYXNzIHRocm91Z2ggdGltZW91dCAqLworI2RlZmluZQlDTURfU0NTSV9FUlJPUgkJMHg2MgkJLyogZ2V0IFNDU0kgcGFzcyB0aHJvdWdoIHJlcXVlc3Qgc2Vuc2UgbGVuZ3RoIGFuZCByZXNpZHVhbCBkYXRhIGNvdW50ICovCisjZGVmaW5lCUNNRF9HRVRfU1BBUk1TCQkweDYzCQkvKiBnZXQgU0NTSSBidXMgYW5kIHVzZXIgcGFybXMgKi8KKyNkZWZpbmUJQ01EX1NDU0lfQUJPUlQJCTB4NjQJCS8qIGFib3J0IGJ5IHNldHRpbmcgdGltZS1vdXQgdG8gemVybyAqLworCisjZGVmaW5lCUNNRF9DSElSUF9DSElSUAkJMHg3NwkJLyogbWFrZSBhIGNoaXJwIGNoaXJwIHNvdW5kICovCisjZGVmaW5lCUNNRF9HRVRfTEFTVF9ET05FCTB4NzgJCS8qIGdldCB0YWcgb2YgbGFzdCBkb25lIGluIHByb2dyZXNzICovCisjZGVmaW5lCUNNRF9HRVRfRkVBVFVSRVMJMHg3OQkJLyogZ2V0IGZlYXR1cmUgY29kZSBhbmQgRVNOICovCisjZGVmaW5lIENNRF9DTEVBUl9DQUNIRQkJMHg3QQkJLyogQ2xlYXIgY2FjaGUgb24gc3BlY2lmaWVkIGRldmljZSAqLworI2RlZmluZQlDTURfQklPU19URVNUCQkweDdCCQkvKiBUZXN0IHdoZXRoZXIgb3Igbm90IHRvIGxvYWQgQklPUyAqLworI2RlZmluZQlDTURfV0FJVF9GTFVTSAkJMHg3QwkJLyogd2FpdCBmb3IgY2FjaGUgZmx1c2hlZCBhbmQgaW52YWxpZGF0ZSByZWFkIGNhY2hlICovCisjZGVmaW5lCUNNRF9SRVNFVF9CVVMJCTB4N0QJCS8qIHJlc2V0IHRoZSBTQ1NJIGJ1cyAqLworI2RlZmluZQlDTURfU1RBUlRVUF9RUlkJCTB4N0UJCS8qIHN0YXJ0dXAgaW4gcHJvZ3Jlc3MgcXVlcnkgKi8KKyNkZWZpbmUJQ01EX1JFU0VUCQkJMHg3RgkJLyogcmVzZXQgdGhlIGNvbnRyb2xsZXIgKi8KKworI2RlZmluZQlDTURfUkVTVEFSVF9SRVNFVAkweDgwCQkvKiByZWxvYWQgYW5kIHJlc3RhcnQgdGhlIGNvbnRyb2xsZXIgYXQgYW55IHJlc2V0IGlzc3VlZCAqLworI2RlZmluZQlDTURfU09GVF9SRVNFVAkJMHg4MQkJLyogZG8gYSBzb2Z0IHJlc2V0IE5PVyEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJCQkJKi8KKy8qCQkJCUhvc3QgcmV0dXJuIGVycm9ycwkJCQkqLworLyoJCQkJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJRVJSMDhfVEFHR0VECQkweDgwCQkvKiBkb29yYmVsbCBlcnJvciBvcmVkIHdpdGggdGFnICovCisKKyNkZWZpbmUJRVJSMTZfTk9ORQkJCTB4MDAwMAkJLyogbm8gZXJyb3JzICovCisjZGVmaW5lCUVSUjE2X1NDX0NPTkRfTUVUCTB4MDAwNAkJLyogU0NTSSBzdGF0dXMgLSBDb25kaXRpb24gTWV0ICovCisjZGVmaW5lCUVSUjE2X0NNRAkJCTB4MDEwMQkJLyogY29tbWFuZCBlcnJvciAqLworI2RlZmluZQlFUlIxNl9TQ19DSEVDS19DT05ECTB4MDAwMgkJLyogU0NTSSBzdGF0dXMgLSBDaGVjayBDb25kaXRpb24gKi8KKyNkZWZpbmUJRVJSMTZfQ01EX05PVAkJMHgwMjAxCQkvKiBjb21tYW5kIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRVJSMTZfTk9fREVWSUNFICAgICAweDAzMDEJCS8qIGludmFsaWQgZGV2aWNlIHNlbGVjdGlvbiAqLworI2RlZmluZQlFUlIxNl9TRUNUT1IJCTB4MDIwMgkJLyogYmFkIHNlY3RvciAqLworI2RlZmluZQlFUlIxNl9QUk9URUNUCQkweDAzMDMJCS8qIHdyaXRlIHByb3RlY3RlZCAqLworI2RlZmluZQlFUlIxNl9OT1NFQ1RPUgkJMHgwNDA0CQkvKiBzZWN0b3Igbm90IGZvdW5kICovCisjZGVmaW5lCUVSUjE2X01FRElBCQkJMHgwQzBDCQkvKiBpbnZhbGlkIG1lZGlhICovCisjZGVmaW5lCUVSUjE2X0NPTlRST0wJCTB4MjAyMAkJLyogY29udHJvbGxlciBlcnJvciAqLworI2RlZmluZQlFUlIxNl9DT05UUk9MX0RNQQkweDIxMjAJCS8qIGNvbnRyb2xsZXIgRE1BIGVuZ2luZSBlcnJvciAqLworI2RlZmluZQlFUlIxNl9OT19BTEFSTQkJMHgyMjIwCQkvKiBhbGFybSBpcyBub3QgYWN0aXZlICovCisjZGVmaW5lCUVSUjE2X09QX0JVU1kJCTB4MjMyMAkJLyogb3BlcmF0aW9uIGJ1c3kgKi8KKyNkZWZpbmUJRVJSMTZfU0VFSwkJCTB4NDA0MAkJLyogc2VlayBmYWlsdXJlICovCisjZGVmaW5lCUVSUjE2X0RFVklDRV9GQUlMCTB4NDE0MAkJLyogZGV2aWNlIGhhcyBmYWlsZWQgKi8KKyNkZWZpbmUgRVJSMTZfVElNRU9VVAkJMHg4MDgwCQkvKiB0aW1lb3V0IGVycm9yICovCisjZGVmaW5lCUVSUjE2X0RFVl9OT1RfUkVBRFkJMHhBQUFBCQkvKiBkcml2ZSBub3QgcmVhZHkgKi8KKyNkZWZpbmUJRVJSMTZfVU5ERUZJTkVECQkweEJCQkIJCS8qIHVuZGVmaW5lZCBlcnJvciAqLworI2RlZmluZQlFUlIxNl9XUklURV9GQVVMVAkweENDQ0MJCS8qIHdyaXRlIGZhdWx0ICovCisjZGVmaW5lIEVSUjE2X0lOVkFMSURfREVWCTB4NDAwMQkJLyogaW52YWxpZCBkZXZpY2UgYWNjZXNzICovCisjZGVmaW5lCUVSUjE2X0RFVklDRV9CVVNZCTB4NDAwMgkJLyogZGV2aWNlIGlzIGJ1c3kgKi8KKyNkZWZpbmUJRVJSMTZfTUVNT1JZCQkweDQwMDMJCS8qIGRldmljZSBwYXNzIHRocnUgcmVxdWlyZXMgdG9vIG11Y2ggbWVtb3J5ICovCisjZGVmaW5lCUVSUjE2X05PX0ZFQVRVUkUJMHg0MEZBCQkvKiBmZWF0dXJlIG5vIGltcGxlbWVudGVkICovCisjZGVmaW5lCUVSUjE2X05PVEFHCQkJMHg0MEZECQkvKiBubyB0YWcgc3BhY2UgYXZhaWxhYmxlICovCisjZGVmaW5lCUVSUjE2X05PVF9SRUFEWQkJMHg0MEZFCQkvKiBjb250cm9sbGVyIG5vdCByZWFkeSBlcnJvciAqLworI2RlZmluZQlFUlIxNl9TRVRVUF9GTEFTSAkweDUwNTAJCS8qIGVycm9yIHdoZW4gd3JpdGluZyBzZXR1cCB0byBmbGFzaCBtZW1vcnkgKi8KKyNkZWZpbmUJRVJSMTZfU0VUVVBfU0laRQkweDUwNTEJCS8qIHNldHVwIGJsb2NrIHNpemUgZXJyb3IgKi8KKyNkZWZpbmUJRVJSMTZfU0VOU0UJCQkweEZGRkYJCS8qIHNlbnNlIG9wZXJlcmF0aW9uIGZhaWxlZCAqLworI2RlZmluZQlFUlIxNl9TQ19CVVNZCQkweDAwMDgJCS8qIFNDU0kgc3RhdHVzIC0gQnVzeSAqLworI2RlZmluZQlFUlIxNl9TQ19SRVNfQ09ORkwJMHgwMDE4CQkvKiBTQ1NJIHN0YXR1cyAtIFJlc2VydmF0aW9uIENvbmZsaWN0ICovCisjZGVmaW5lCUVSUjE2X1NDX0NNRF9URVJNCTB4MDAyMgkJLyogU0NTSSBzdGF0dXMgLSBDb21tYW5kIFRlcm1pbmF0ZWQgKi8KKyNkZWZpbmUJRVJSMTZfU0NfT1RIRVIJCTB4MDBGRgkJLyogU0NTSSBzdGF0dXMgLSBub3QgcmVjb2duaXplZCAoYW55IHZhbHVlIG1hc2tlZCkgKi8KKyNkZWZpbmUJRVJSMTZfTUVESUFfQ0hBTkdFRAkweDgwMDEJCS8qIGRldmljZXMgbWVkaWEgaGFzIGJlZW4gY2hhbmdlZCAqLworCisjZGVmaW5lCUVSUjMyX05PTkUJCQkweDAwMDAwMDAwCS8qIG5vIGVycm9ycyAqLworI2RlZmluZQlFUlIzMl9TQ19DT05EX01FVAkweDAwMDAwMDA0CS8qIFNDU0kgc3RhdHVzIC0gQ29uZGl0aW9uIE1ldCAqLworI2RlZmluZQlFUlIzMl9DTUQJCQkweDAwMDEwMTAxCS8qIGNvbW1hbmQgZXJyb3IgKi8KKyNkZWZpbmUJRVJSMzJfU0NfQ0hFQ0tfQ09ORAkweDAwMDIwMDAyCS8qIFNDU0kgc3RhdHVzIC0gQ2hlY2sgQ29uZGl0aW9uICovCisjZGVmaW5lCUVSUjMyX0NNRF9OT1QJCTB4MDAwMzAyMDEJLyogY29tbWFuZCBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIEVSUjMyX05PX0RFVklDRSAgICAgMHgwMDA0MDMwMQkvKiBpbnZhbGlkIGRldmljZSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUJRVJSMzJfU0VDVE9SCQkweDAwMDUwMjAyCS8qIGJhZCBzZWN0b3IgKi8KKyNkZWZpbmUJRVJSMzJfUFJPVEVDVAkJMHgwMDA2MDMwMwkvKiB3cml0ZSBwcm90ZWN0ZWQgKi8KKyNkZWZpbmUJRVJSMzJfTk9TRUNUT1IJCTB4MDAwNzA0MDQJLyogc2VjdG9yIG5vdCBmb3VuZCAqLworI2RlZmluZQlFUlIzMl9NRURJQQkJCTB4MDAwODBDMEMJLyogaW52YWxpZCBtZWRpYSAqLworI2RlZmluZQlFUlIzMl9DT05UUk9MCQkweDAwMDkyMDIwCS8qIGNvbnRyb2xsZXIgZXJyb3IgKi8KKyNkZWZpbmUJRVJSMzJfQ09OVFJPTF9ETUEJMHgwMDBBMjEyMAkvKiBDb250cm9sbGVyIERNQSBlcnJvciAqLworI2RlZmluZQlFUlIzMl9OT19BTEFSTQkJMHgwMDBCMjIyMCAJLyogYWxhcm0gaXMgbm90IGFjdGl2ZSAqLworI2RlZmluZQlFUlIzMl9PUF9CVVNZCQkweDAwMEMyMzIwCS8qIG9wZXJhdGlvbiBidXN5ICovCisjZGVmaW5lCUVSUjMyX1NFRUsJCQkweDAwMEQ0MDQwCS8qIHNlZWsgZmFpbHVyZSAqLworI2RlZmluZQlFUlIzMl9ERVZJQ0VfRkFJTAkweDAwMEU0MTQwCS8qIGRldmljZSBoYXMgZmFpbGVkICovCisjZGVmaW5lIEVSUjMyX1RJTUVPVVQJCTB4MDAwRjgwODAJLyogdGltZW91dCBlcnJvciAqLworI2RlZmluZQlFUlIzMl9ERVZfTk9UX1JFQURZCTB4MDAxMEFBQUEJLyogZHJpdmUgbm90IHJlYWR5ICovCisjZGVmaW5lCUVSUjMyX1VOREVGSU5FRAkJMHgwMDExQkJCQgkvKiB1bmRlZmluZWQgZXJyb3IgKi8KKyNkZWZpbmUJRVJSMzJfV1JJVEVfRkFVTFQJMHgwMDEyQ0NDQwkvKiB3cml0ZSBmYXVsdCAqLworI2RlZmluZSBFUlIzMl9JTlZBTElEX0RFVgkweDAwMTM0MDAxCS8qIGludmFsaWQgZGV2aWNlIGFjY2VzcyAqLworI2RlZmluZQlFUlIzMl9ERVZJQ0VfQlVTWQkweDAwMTQ0MDAyCS8qIGRldmljZSBpcyBidXN5ICovCisjZGVmaW5lCUVSUjMyX01FTU9SWQkJMHgwMDE1NDAwMwkvKiBkZXZpY2UgcGFzcyB0aHJ1IHJlcXVpcmVzIHRvbyBtdWNoIG1lbW9yeSAqLworI2RlZmluZQlFUlIzMl9OT19GRUFUVVJFCTB4MDAxNjQwRkEJLyogZmVhdHVyZSBubyBpbXBsZW1lbnRlZCAqLworI2RlZmluZQlFUlIzMl9OT1RBRwkJCTB4MDAxNzQwRkQJLyogbm8gdGFnIHNwYWNlIGF2YWlsYWJsZSAqLworI2RlZmluZQlFUlIzMl9OT1RfUkVBRFkJCTB4MDAxODQwRkUJLyogY29udHJvbGxlciBub3QgcmVhZHkgZXJyb3IgKi8KKyNkZWZpbmUJRVJSMzJfU0VUVVBfRkxBU0gJMHgwMDE5NTA1MAkvKiBlcnJvciB3aGVuIHdyaXRpbmcgc2V0dXAgdG8gZmxhc2ggbWVtb3J5ICovCisjZGVmaW5lCUVSUjMyX1NFVFVQX1NJWkUJMHgwMDFBNTA1MQkvKiBzZXR1cCBibG9jayBzaXplIGVycm9yICovCisjZGVmaW5lCUVSUjMyX1NFTlNFCQkJMHgwMDFCRkZGRgkvKiBzZW5zZSBvcGVyZXJhdGlvbiBmYWlsZWQgKi8KKyNkZWZpbmUJRVJSMzJfU0NfQlVTWQkJMHgwMDFDMDAwOAkvKiBTQ1NJIHN0YXR1cyAtIEJ1c3kgKi8KKyNkZWZpbmUJRVJSMzJfU0NfUkVTX0NPTkZMCTB4MDAxRDAwMTgJLyogU0NTSSBzdGF0dXMgLSBSZXNlcnZhdGlvbiBDb25mbGljdCAqLworI2RlZmluZQlFUlIzMl9TQ19DTURfVEVSTQkweDAwMUUwMDIyCS8qIFNDU0kgc3RhdHVzIC0gQ29tbWFuZCBUZXJtaW5hdGVkICovCisjZGVmaW5lCUVSUjMyX1NDX09USEVSCQkweDAwMUYwMEZGCS8qIFNDU0kgc3RhdHVzIC0gbm90IHJlY29nbml6ZWQgKGFueSB2YWx1ZSBtYXNrZWQpICovCisjZGVmaW5lCUVSUjMyX01FRElBX0NIQU5HRUQJMHgwMDIwODAwMQkvKiBkZXZpY2VzIG1lZGlhIGhhcyBiZWVuIGNoYW5nZWQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJCQkJKi8KKy8qCUhvc3QgT3BlcmF0aW5nIFN5c3RlbSBzcGVjaWZpY2F0aW9uIGNvZGVzCSovCisvKgkJCQkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlTUEVDX0lOVEVSUlVQVAkJMHg4MAkJLyogc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBob3N0IGludGVycnVwdCAqLworI2RlZmluZQlTUEVDX0JBQ0tXQVJEX1NHCTB4NDAJCS8qIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgc2NhdHRlci9nYXRoZXIgaXRlbXMgcmV2ZXJzZWQgKi8KKyNkZWZpbmUJU1BFQ19ET1NfQkxPQ0sJCTB4MDEJCS8qIERPUyBEQVNEIGJsb2NraW5nIG9uIHBhc3MgdGhyb3VnaCAqLworI2RlZmluZQlTUEVDX09TMl9WMwkJCTB4MDIJCS8qIE9TLzIgV2FycCAqLworI2RlZmluZQlTUENFX1NDT18zMjQyCQkweDA0CQkvKiBTQ08gMy40LjIuMiAqLworI2RlZmluZQlTUEVDX1FOWF80WAkJCTB4MDUJCS8qIFFOWCA0LlhYICovCisjZGVmaW5lCVNQRUNfTk9WRUxMX05XUEEJMHgwOAkJLyogTm92ZWxsIE5XUEEgc2NhdHRlci9nYXRoZXIgc3VwcG9ydCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkJCQkqLworLyoJSW5xdWlyZSBzdHJ1Y3R1cmVzCQkJCQkJCSovCisvKgkJCQkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZglzdHJ1Y3QJX0NOVF9TQ1NJX0lOUQorCXsKKwlVQ0hBUglkZXZ0OwkJCQkJCS8qIDAwOiBkZXZpY2UgdHlwZSAqLworCVVDSEFSCWRldnRtOwkJCQkJCS8qIDAxOiBkZXZpY2UgdHlwZSBtb2RpZmllciAqLworCVVDSEFSCXN2ZXJzOwkJCQkJCS8qIDAyOiBTQ1NJIHZlcnNpb24gKi8KKwlVQ0hBUglyZm10OwkJCQkJCS8qIDAzOiByZXNwb25zZSBkYXRhIGZvcm1hdCAqLworCVVDSEFSCWFkbGVuOwkJCQkJCS8qIDA0OiBhZGRpdGlvbmFsIGxlbmd0aCBvZiBkYXRhICovCisJVUNIQVIJcmVzMTsJCQkJCQkvKiAwNTogKi8KKwlVQ0hBUglyZXMyOwkJCQkJCS8qIDA2OiAqLworCVVDSEFSCWZuY3M7CQkJCQkJLyogMDc6IGZ1bmN0aW9uYWwgY2FwYWJpbGl0aWVzICovCisJVUNIQVIJdmlkWzhdOwkJCQkJCS8qIDA4OiB2ZW5kb3IgSUQgKi8KKwlVQ0hBUglwaWRbMTZdOwkJCQkJLyogMTA6IHByb2R1Y3QgSUQgKi8KKwlVQ0hBUglyZXZbNF07CQkJCQkJLyogMjA6IHByb2R1Y3QgcmV2aXNpb24gKi8KKwl9CUNOVF9TQ1NJX0lOUTsKKwordHlwZWRlZglzdHJ1Y3QJX0NOVF9JREVfSU5RCisJeworCVVTSE9SVAlHZW5lcmFsQ29uZmlndXJhdGlvbjsJCS8qIDAwICovCisJVVNIT1JUCU51bWJlck9mQ3lsaW5kZXJzOwkJCS8qIDAyICovCisJVVNIT1JUCVJlc2VydmVkMTsJCQkJCS8qIDA0ICovCisJVVNIT1JUCU51bWJlck9mSGVhZHM7CQkJCS8qIDA2ICovCisJVVNIT1JUCVVuZm9ybWF0dGVkQnl0ZXNQZXJUcmFjazsJLyogMDggKi8KKwlVU0hPUlQJVW5mb3JtYXR0ZWRCeXRlc1BlclNlY3RvcjsJLyogMEEgKi8KKwlVU0hPUlQJU2VjdG9yc1BlclRyYWNrOwkJCS8qIDBDICovCisJVVNIT1JUCVZlbmRvclVuaXF1ZTFbM107CQkJLyogMEUgKi8KKwlVU0hPUlQJU2VyaWFsTnVtYmVyWzEwXTsJCQkvKiAxNCAqLworCVVTSE9SVAlCdWZmZXJUeXBlOwkJCQkJLyogMjggKi8KKwlVU0hPUlQJQnVmZmVyU2VjdG9yU2l6ZTsJCQkvKiAyQSAqLworCVVTSE9SVAlOdW1iZXJPZkVjY0J5dGVzOwkJCS8qIDJDICovCisJVVNIT1JUCUZpcm13YXJlUmV2aXNpb25bNF07CQkvKiAyRSAqLworCVVTSE9SVAlNb2RlbE51bWJlclsyMF07CQkJLyogMzYgKi8KKwlVQ0hBUglNYXhpbXVtQmxvY2tUcmFuc2ZlcjsJCS8qIDVFICovCisJVUNIQVIJVmVuZG9yVW5pcXVlMjsJCQkJLyogNUYgKi8KKwlVU0hPUlQJRG91YmxlV29yZElvOwkJCQkvKiA2MCAqLworCVVTSE9SVAlDYXBhYmlsaXRpZXM7CQkJCS8qIDYyICovCisJVVNIT1JUCVJlc2VydmVkMjsJCQkJCS8qIDY0ICovCisJVUNIQVIJVmVuZG9yVW5pcXVlMzsJCQkJLyogNjYgKi8KKwlVQ0hBUglQaW9DeWNsZVRpbWluZ01vZGU7CQkJLyogNjcgKi8KKwlVQ0hBUglWZW5kb3JVbmlxdWU0OwkJCQkvKiA2OCAqLworCVVDSEFSCURtYUN5Y2xlVGltaW5nTW9kZTsJCQkvKiA2OSAqLworCVVTSE9SVAlUcmFuc2xhdGlvbkZpZWxkc1ZhbGlkOwkJLyogNkEgKi8KKwlVU0hPUlQJTnVtYmVyT2ZDdXJyZW50Q3lsaW5kZXJzOwkvKiA2QyAqLworCVVTSE9SVAlOdW1iZXJPZkN1cnJlbnRIZWFkczsJCS8qIDZFICovCisJVVNIT1JUCUN1cnJlbnRTZWN0b3JzUGVyVHJhY2s7CQkvKiA3MCAqLworCVVMT05HCUN1cnJlbnRTZWN0b3JDYXBhY2l0eTsJCS8qIDcyICovCisJfQlDTlRfSURFX0lOUTsKKwordHlwZWRlZiBzdHJ1Y3QJX0RBU0RfSU5RVUlSRQorCXsKKwlVTE9ORwl0eXBlOwkJCQkJCS8qIDAgPSBTQ1NJLCAxID0gSURFICovCisJdW5pb24KKwkJeworCQlDTlRfU0NTSV9JTlEJc2NzaTsJCQkvKiBTQ1NJIGlucXVpcmUgZGF0YSAqLworCQlDTlRfSURFX0lOUQkJaWRlOwkJCS8qIElERSBpbnF1aXJlIGRhdGEgKi8KKwkJfQlpbnE7CisJfQlEQVNEX0lOUVVJUkU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCQkJCSovCisvKglEZXZpY2UgQ29kZXMJCQkJCQkJCSovCisvKgkJCQkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBERVZDX0RBU0QJCQkweDAwCQkvKiBEaXJlY3QtYWNjZXNzIFN0b3JhZ2UgRGV2aWNlICovCisjZGVmaW5lIERFVkNfU0VRQUNFU1MJCTB4MDEJCS8qIFNlcXVlbnRpYWwtYWNjZXNzIGRldmljZSAqLworI2RlZmluZSBERVZDX1BSSU5URVIJCTB4MDIJCS8qIFByaW50ZXIgZGV2aWNlICovCisjZGVmaW5lIERFVkNfUFJPQ0VTU09SCQkweDAzCQkvKiBQcm9jZXNzb3IgZGV2aWNlICovCisjZGVmaW5lIERFVkNfV1JJVEVPTkNFCQkweDA0CQkvKiBXcml0ZS1vbmNlIGRldmljZSAqLworI2RlZmluZSBERVZDX0NEUk9NCQkJMHgwNQkJLyogQ0QtUk9NIGRldmljZSAqLworI2RlZmluZSBERVZDX1NDQU5ORVIJCTB4MDYJCS8qIFNjYW5uZXIgZGV2aWNlICovCisjZGVmaW5lIERFVkNfT1BUSUNBTAkJMHgwNwkJLyogT3B0aWNhbCBtZW1vcnkgZGV2aWNlICovCisjZGVmaW5lIERFVkNfTUVEQ0hHUgkJMHgwOAkJLyogTWVkaXVtIGNoYW5nZXIgZGV2aWNlICovCisjZGVmaW5lCURFVkNfREFTRF9SRU1PVkFCTEUJMHg4MAkJLyogRGlyZWN0LWFjY2VzcyBzdG9yYWdlIGRldmljZSwgUmVtb3ZhYmxlICovCisjZGVmaW5lCURFVkNfTk9ORQkJCTB4RkYJCS8qIG5vIGRldmljZSAqLworCisvLyBTQ1NJIGNvbnRyb2xzIGZvciBSQUlECisjZGVmaW5lCVNDX01ZX1JBSUQJCQkweEJGCQkJLy8gb3VyIHNwZWNpYWwgQ0RCIGNvbW1hbmQgYnl0ZSBmb3IgV2luOTUuLi4gaW50ZXJmYWNlCisjZGVmaW5lCU1ZX1NDU0lfUVVFUlkwCQkweDMxCQkJLy8gYnl0ZSAxIHN1YmNvbW1hbmQgdG8gcXVlcnkgZHJpdmVyIGZvciBSQUlEIDAgaW5mb3JtYXRhdGlvbgorI2RlZmluZQlNWV9TQ1NJX1FVRVJZMQkJMHgzMgkJCS8vIGJ5dGUgMSBzdWJjb21tYW5kIHRvIHF1ZXJ5IGRyaXZlciBmb3IgUkFJRCAxIGluZm9ybWF0YXRpb24KKyNkZWZpbmUJTVlfU0NTSV9RVUVSWTUJCTB4MzMJCQkvLyBieXRlIDEgc3ViY29tbWFuZCB0byBxdWVyeSBkcml2ZXIgZm9yIFJBSUQgNSBpbmZvcm1hdGF0aW9uCisjZGVmaW5lCU1ZX1NDU0lfUkVCVUlMRAkJMHg0MAkJCS8vIGJ5dGUgMSBzdWJjb21tYW5kIHRvIHJlY29uc3RydWN0IGEgbWlycm9yZWQgcGFpcgorI2RlZmluZSBNWV9TQ1NJX0RFTU9GQUlMCTB4NTQJCQkvLyBieXRlIDEgc3ViY29tbWFuZCBmb3IgUkFJRCBmYWlsdXJlIGRlbW9uc3RyYXRpb24KKyNkZWZpbmUJTVlfU0NTSV9BTEFSTU1VVEUJMHg2MAkJCS8vIGJ5dGUgMSBzdWJjb21tYW5kIHRvIG11dGUgYW55IGFsYXJtIGN1cnJlbnRseSBvbgorCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWwxMDQwX2Z3LmggYi9kcml2ZXJzL3Njc2kvcWwxMDQwX2Z3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkOGUwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbDEwNDBfZncuaApAQCAtMCwwICsxLDIwOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUUxvZ2ljIENvcnBvcmF0aW9uCisgKiAod3d3LnFsb2dpYy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQkJCQkJCSoKKyAqIAkgICAgICAgIC0tLSBJU1AxMDQwIEluaXRpYXRvci9UYXJnZXQgRmlybXdhcmUgLS0tICAgICAgICAgICAgICAgKgorICoJCQkgICAgMzIgTFVOIFN1cHBvcnQJCQkJKgorICoJCQkJCQkJCQkqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoKKyAqCUZpcm13YXJlIFZlcnNpb24gNy42NS4wMCAoMTQ6MTcgSnVsIDIwLCAxOTk5KQorICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGZpcm13YXJlX3ZlcnNpb25bXSA9IHs3LDY1LDB9OworCisjZGVmaW5lIEZXX1ZFUlNJT05fU1RSSU5HICI3LjY1LjAiCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfYWRkcjAxID0gMHgxMDAwIDsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHJpc2NfY29kZTAxW10gPSB7IAorCTB4MDA3OCwgMHgxMDNhLCAweDAwMDAsIDB4NDA1NywgMHgwMDAwLCAweDIwNDMsIDB4NGY1MCwgMHg1OTUyLAorCTB4NDk0NywgMHg0ODU0LCAweDIwMzEsIDB4MzkzOSwgMHgzNTIwLCAweDUxNGMsIDB4NGY0NywgMHg0OTQzLAorCTB4MjA0MywgMHg0ZjUyLCAweDUwNGYsIDB4NTI0MSwgMHg1NDQ5LCAweDRmNGUsIDB4MjA0OSwgMHg1MzUwLAorCTB4MzEzMCwgMHgzMjMwLCAweDIwNDksIDB4MmY1NCwgMHgyMDQ2LCAweDY5NzIsIDB4NmQ3NywgMHg2MTcyLAorCTB4NjUyMCwgMHgyMDU2LCAweDY1NzIsIDB4NzM2OSwgMHg2ZjZlLCAweDIwMzAsIDB4MzcyZSwgMHgzNjM1LAorCTB4MjAyMCwgMHgyMDQzLCAweDc1NzMsIDB4NzQ2ZiwgMHg2ZDY1LCAweDcyMjAsIDB4NGU2ZiwgMHgyZTIwLAorCTB4MzAzMCwgMHgyMDUwLCAweDcyNmYsIDB4NjQ3NSwgMHg2Mzc0LCAweDIwNGUsIDB4NmYyZSwgMHgyMDIwLAorCTB4MzAzMSwgMHgyMDI0LCAweDIwMDEsIDB4MDRmZCwgMHgyMDA0LCAweGEwODIsIDB4MDAwNSwgMHgwMDQ4LAorCTB4MTA0NSwgMHgwMDM4LCAweDEwNGIsIDB4MDA3OCwgMHgxMDQ3LCAweDAwMjgsIDB4MTA0YiwgMHgyMGI5LAorCTB4MTIxMiwgMHgwMDc4LCAweDEwNGQsIDB4MjBiOSwgMHgyMjIyLCAweDIwYzEsIDB4MDAwOCwgMHgyMDcxLAorCTB4MDAxMCwgMHg3MGMzLCAweDAwMDQsIDB4MjBjOSwgMHg3N2ZmLCAweDIwODksIDB4MTE4NiwgMHg3MGM3LAorCTB4NDk1MywgMHg3MGNiLCAweDUwMjAsIDB4NzBjZiwgMHgyMDIwLCAweDcwZDMsIDB4MDAwNywgMHgzZjAwLAorCTB4NzBkNiwgMHgyMGMxLCAweDAwMDgsIDB4MjAxOSwgMHgwMDAwLCAweDIwMDksIDB4ZmVmZiwgMHgyMTAwLAorCTB4MjAwYiwgMHhhNWE1LCAweGExZWMsIDB4N2ZmZiwgMHgyZDY0LCAweDIwNmIsIDB4MGEwYSwgMHhhZGRjLAorCTB4M2ZmZiwgMHgyYjU0LCAweDIwNWIsIDB4NTA1MCwgMHgyMTE0LCAweGEyODYsIDB4YTVhNSwgMHgwMDQwLAorCTB4MTBiZiwgMHhhMzg2LCAweDAwMGYsIDB4MDA0MCwgMHgxMDg1LCAweDJjNmEsIDB4MmE1YSwgMHgyMGMxLAorCTB4MDAwMCwgMHgyMDE5LCAweDAwMGYsIDB4MDA3OCwgMHgxMDY1LCAweDJjNmEsIDB4MmE1YSwgMHgyMGMxLAorCTB4MDAwOCwgMHgyMDA5LCAweDdmZmYsIDB4MjE0OCwgMHgyOTQ0LCAweDIwNGIsIDB4MGEwYSwgMHhhOWJjLAorCTB4M2ZmZiwgMHgyNzM0LCAweDIwM2IsIDB4NTA1MCwgMHgyMTE0LCAweGEyODYsIDB4MGEwYSwgMHgwMDQwLAorCTB4MTBhOSwgMHgyODRhLCAweDI2M2EsIDB4MjBjMSwgMHgwMDA0LCAweDIwMDksIDB4M2ZmZiwgMHgyMTM0LAorCTB4MjAwYiwgMHg1MDUwLCAweDIxMTQsIDB4YTI4NiwgMHg1MDUwLCAweDAwNDAsIDB4MTBhYSwgMHgwMDc4LAorCTB4MTE4ZSwgMHgyODRhLCAweDI2M2EsIDB4OThjMCwgMHhhMTg4LCAweDEwMDAsIDB4MjEyYywgMHgyMDBiLAorCTB4YTVhNSwgMHgyMTE0LCAweGEyODYsIDB4YTVhNSwgMHgwMDQwLCAweDEwYmMsIDB4MjUwYSwgMHhhMThhLAorCTB4MTAwMCwgMHg5OGMxLCAweDAwNzgsIDB4MTBjMSwgMHgyNTBhLCAweDAwNzgsIDB4MTBjMSwgMHgyYzZhLAorCTB4MmE1YSwgMHgyMTMwLCAweGExOGEsIDB4MDA0MCwgMHgyMTI4LCAweGExYTIsIDB4NTEwMCwgMHg4NDI0LAorCTB4ODQyNCwgMHg4NDI0LCAweDg0MjQsIDB4ODQyNCwgMHg4NDI0LCAweGExOTIsIDB4NzgwMCwgMHgyMDA5LAorCTB4MDAwMCwgMHgyMDAxLCAweDAwMzEsIDB4MTA3OCwgMHgxY2JhLCAweDIyMTgsIDB4MjA3OSwgMHg1MTAwLAorCTB4MmZhMCwgMHgyNDA4LCAweDIwMTEsIDB4MDAwMCwgMHgyMGE5LCAweDAwNDAsIDB4NDJhNCwgMHg4MTA5LAorCTB4MDBjMCwgMHgxMGRjLCAweDdlZjIsIDB4ODUyOCwgMHg3ZGU2LCAweDdjZWEsIDB4N2JlZSwgMHg3ODgzLAorCTB4MDAwMCwgMHgyMDMxLCAweDAwMzAsIDB4NzhjZiwgMHgwMTAxLCAweDc4MGIsIDB4MDAwMiwgMHg3ODBmLAorCTB4MDAwMiwgMHg3ODRmLCAweDAwMDMsIDB4MjA2OSwgMHg1MTQwLCAweDIwMDEsIDB4MDRmZCwgMHgyMDA0LAorCTB4YTA4MiwgMHgwMDA1LCAweDAwNDgsIDB4MTEwNCwgMHgwMDM4LCAweDExMDAsIDB4MDA3OCwgMHgxMTA4LAorCTB4NjgxYiwgMHgwMDNjLCAweDAwNzgsIDB4MTEwYSwgMHgwMGE4LCAweDExMDgsIDB4NjgxYiwgMHgwMDNjLAorCTB4NjgxYiwgMHgwMDI4LCAweDY4MDcsIDB4MDAwNywgMHg2ODBiLCAweDAwZmEsIDB4NjgwZiwgMHgwMDA4LAorCTB4NjgxMywgMHgwMDA1LCAweDY4MjMsIDB4MDAwMCwgMHg2ODI3LCAweDAwMDYsIDB4NjgxNywgMHgwMDA4LAorCTB4NjgyYiwgMHgwMDAwLCAweDY4MWYsIDB4MDAxOSwgMHgyMDY5LCAweDUzODAsIDB4MjAxMSwgMHgwMDIwLAorCTB4MjAwOSwgMHgwMDEwLCAweDY4MGIsIDB4MDgwYywgMHg2ODBmLCAweDAwMTksIDB4NjgwMywgMHhmZDAwLAorCTB4NjgwNywgMHgwMDE4LCAweDZhMWEsIDB4MmQwMCwgMHhhMGU4LCAweDAwMDgsIDB4YTI5MCwgMHgwMDA0LAorCTB4ODEwOSwgMHgwMGMwLCAweDExMjIsIDB4MjA2OSwgMHg1NDAwLCAweDIwMDksIDB4MDAwMiwgMHgyMGE5LAorCTB4MDEwMCwgMHg2ODM3LCAweDAwMDAsIDB4NjgwYiwgMHgwMDQwLCAweDdiZjAsIDB4YTM4NiwgMHhmZWZmLAorCTB4MDBjMCwgMHgxMTQ4LCAweDY4MTcsIDB4MDEwMCwgMHg2ODFmLCAweDAwNjQsIDB4MDA3OCwgMHgxMTRjLAorCTB4NjgxNywgMHgwMDY0LCAweDY4MWYsIDB4MDAwMiwgMHhhZGU4LCAweDAwMTAsIDB4MDA3MCwgMHgxMTUyLAorCTB4MDA3OCwgMHgxMTM5LCAweDgxMDksIDB4MDBjMCwgMHgxMTM3LCAweDEwNzgsIDB4MjIwYSwgMHgxMDc4LAorCTB4NDgyYywgMHgxMDc4LCAweDE5NjMsIDB4MTA3OCwgMHg0ZDIyLCAweDMyMDAsIDB4YTA4NSwgMHgwMDBkLAorCTB4MjA5MCwgMHg3MGMzLCAweDAwMDAsIDB4MDA5MCwgMHgxMTZjLCAweDcwYzAsIDB4YTA4NiwgMHgwMDAyLAorCTB4MDBjMCwgMHgxMTZjLCAweDEwNzgsIDB4MTI4NCwgMHgxMDc4LCAweDExOTYsIDB4NzhjYywgMHhhMDA1LAorCTB4MDBjMCwgMHgxMTdhLCAweDEwNzgsIDB4MWNlMywgMHgwMDEwLCAweDExODAsIDB4MDA2OCwgMHgxMTgwLAorCTB4MTA3OCwgMHgyMGU5LCAweDAwMTAsIDB4MTE4MCwgMHgwMDY4LCAweDExODAsIDB4MTA3OCwgMHgxYTQ4LAorCTB4MDBlMCwgMHgxMTZjLCAweDEwNzgsIDB4NGJhOSwgMHgwMDc4LCAweDExNmMsIDB4MTE4ZSwgMHgxMTkwLAorCTB4MjQwYiwgMHgyNDBiLCAweDQ4YWQsIDB4NDhhZCwgMHgyNDBiLCAweDI0MGIsIDB4MDA3OCwgMHgxMThlLAorCTB4MDA3OCwgMHgxMTkwLCAweDAwNzgsIDB4MTE5MiwgMHgwMDc4LCAweDExOTQsIDB4MDA2OCwgMHgxMjAxLAorCTB4MjA2MSwgMHgwMDAwLCAweDYwMTgsIDB4YTA4NCwgMHgwMDAxLCAweDAwYzAsIDB4MTIwMSwgMHg3ODE0LAorCTB4YTAwNSwgMHgwMGMwLCAweDExYTcsIDB4MDAxMCwgMHgxMjAyLCAweDAwNzgsIDB4MTIwMSwgMHgyMDA5LAorCTB4NTE1YiwgMHgyMTA0LCAweGEwMDUsIDB4MDBjMCwgMHgxMjAxLCAweDIwMDksIDB4NTE2NCwgMHgyMDBiLAorCTB4MDAwMCwgMHg3OTE0LCAweGExODYsIDB4MDA0MiwgMHgwMGMwLCAweDExY2MsIDB4NzgxNiwgMHgyMDA5LAorCTB4NTE2MiwgMHgyMTY0LCAweDIwMGIsIDB4MDAwMCwgMHg2MDE4LCAweDcwYzYsIDB4NjAxNCwgMHg3MGNhLAorCTB4NjExYywgMHhhMThjLCAweGZmMDAsIDB4NjAyMCwgMHhhMDg0LCAweDAwZmYsIDB4YTEwNSwgMHg3MGNlLAorCTB4MTA3OCwgMHgxOTQ4LCAweDAwNzgsIDB4MTFmZiwgMHg3ODE0LCAweGEwODYsIDB4MDAxOCwgMHgwMGMwLAorCTB4MTFkMywgMHgxMDc4LCAweDE2NWEsIDB4NzgxNywgMHgwMDAwLCAweDIwMDksIDB4NTE2MiwgMHgyMTA0LAorCTB4YTA2NSwgMHgwMDQwLCAweDExZWYsIDB4MGM3ZSwgMHg2MDljLCAweDIwNjAsIDB4MTA3OCwgMHgxOWIzLAorCTB4MGM3ZiwgMHg2MDlmLCAweDAwMDAsIDB4MTA3OCwgMHgxNzMwLCAweDIwMDksIDB4MDAwYywgMHg2MDA3LAorCTB4MDEwMywgMHgxMDc4LCAweDE5MjQsIDB4MDBjMCwgMHgxMWZiLCAweDEwNzgsIDB4MTk0OCwgMHgyMDA5LAorCTB4NTE2MiwgMHgyMDBiLCAweDAwMDAsIDB4MjAwOSwgMHg1MTVjLCAweDIxMDQsIDB4MjAwYiwgMHgwMDAwLAorCTB4YTAwNSwgMHgwMDQwLCAweDExZmYsIDB4MjAwMSwgMHg0MDA1LCAweDAwNzgsIDB4MTI4NiwgMHgwMDc4LAorCTB4MTI4NCwgMHgwMDdjLCAweDcwYzMsIDB4MDAwMCwgMHg3MGM3LCAweDAwMDAsIDB4NzBjYiwgMHgwMDAwLAorCTB4NzBjZiwgMHgwMDAwLCAweDcwYzAsIDB4YTBiYywgMHhmZmMwLCAweDAwYzAsIDB4MTI1MiwgMHgyMDM4LAorCTB4MDA3OSwgMHgxMjEyLCAweDEyODQsIDB4MTJlNSwgMHgxMmE5LCAweDEyZmUsIDB4MTMwZCwgMHgxMzEzLAorCTB4MTJhMCwgMHgxNzQ4LCAweDEzMTcsIDB4MTI5OCwgMHgxMmFkLCAweDEyYWYsIDB4MTJiMSwgMHgxMmIzLAorCTB4MTc0ZCwgMHgxMjk4LCAweDEzMjksIDB4MTM2MCwgMHgxNjcyLCAweDE3NDIsIDB4MTJiNSwgMHgxNTkxLAorCTB4MTVhZCwgMHgxNWM5LCAweDE1ZjQsIDB4MTU0YSwgMHgxNTU4LCAweDE1NmMsIDB4MTU4MCwgMHgxM2RmLAorCTB4MTI5OCwgMHgxMzhkLCAweDEzOTMsIDB4MTM5OCwgMHgxMzlkLCAweDEzYTMsIDB4MTNhOCwgMHgxM2FkLAorCTB4MTNiMiwgMHgxM2I3LCAweDEzYmIsIDB4MTNkMCwgMHgxM2RjLCAweDEyOTgsIDB4MTI5OCwgMHgxMjk4LAorCTB4MTI5OCwgMHgxM2ViLCAweDEzZjQsIDB4MTQwMywgMHgxNDI5LCAweDE0MzMsIDB4MTQzYSwgMHgxNDgwLAorCTB4MTQ4ZiwgMHgxNDllLCAweDE0YjAsIDB4MTUyYSwgMHgxNTNhLCAweDEyOTgsIDB4MTI5OCwgMHgxMjk4LAorCTB4MTI5OCwgMHgxNTNmLCAweGEwYmMsIDB4ZmZhMCwgMHgwMGMwLCAweDEyOTgsIDB4MjAzOCwgMHhhMDg0LAorCTB4MDAxZiwgMHgwMDc5LCAweDEyNWIsIDB4MTc4NiwgMHgxNzg5LCAweDE3OTksIDB4MTI5OCwgMHgxMjk4LAorCTB4MThkZiwgMHgxOGZjLCAweDEyOTgsIDB4MTI5OCwgMHgxMjk4LCAweDE5MDAsIDB4MTkwOCwgMHgxMjk4LAorCTB4MTI5OCwgMHgxMjk4LCAweDEyOTgsIDB4MTJkYiwgMHgxMmY0LCAweDEzMWYsIDB4MTM1NiwgMHgxNjY4LAorCTB4MTc2NCwgMHgxNzc4LCAweDEyOTgsIDB4MTgyOSwgMHgxOTBlLCAweDE4YmIsIDB4MThjNSwgMHgxOGM5LAorCTB4MThkNywgMHgxMjk4LCAweDEyOTgsIDB4NzJjYSwgMHg3MWM2LCAweDIwMDEsIDB4NDAwNiwgMHgwMDc4LAorCTB4MTI4NiwgMHg3M2NlLCAweDcyY2EsIDB4NzFjNiwgMHgyMDAxLCAweDQwMDAsIDB4NzBjMiwgMHgwMDY4LAorCTB4MTI4NywgMHgyMDYxLCAweDAwMDAsIDB4NjAxYiwgMHgwMDAxLCAweDIwOTEsIDB4NTAwMCwgMHgwMGUwLAorCTB4MTI4ZiwgMHgwMGUwLCAweDEyOTEsIDB4MDA2OCwgMHgxMjkxLCAweDIwOTEsIDB4NDA4MCwgMHgwMDdjLAorCTB4NzBjMywgMHg0MDAxLCAweDAwNzgsIDB4MTI4NywgMHg3MGMzLCAweDQwMDYsIDB4MDA3OCwgMHgxMjg3LAorCTB4MjA5OSwgMHgwMDQxLCAweDIwYTEsIDB4MDA0MSwgMHgyMGE5LCAweDAwMDUsIDB4NTNhMywgMHgwMDc4LAorCTB4MTI4NCwgMHg3MGM0LCAweDcwYzMsIDB4MDAwNCwgMHgwMDdhLCAweDAwNzgsIDB4MTI4NCwgMHgwMDc4LAorCTB4MTI4NCwgMHgwMDc4LCAweDEyODQsIDB4MDA3OCwgMHgxMjg0LCAweDIwOTEsIDB4ODAwMCwgMHg3MGMzLAorCTB4MDAwMCwgMHg3MGM3LCAweDQ5NTMsIDB4NzBjYiwgMHg1MDIwLCAweDcwY2YsIDB4MjAyMCwgMHg3MGQzLAorCTB4MDAwNywgMHgzZjAwLCAweDcwZDYsIDB4MjA3OSwgMHgwMDAwLCAweDc4MWIsIDB4MDAwMSwgMHgyMDMxLAorCTB4MDAzMCwgMHgyMDU5LCAweDEwMDAsIDB4MjAyOSwgMHgwNDU3LCAweDIwNTEsIDB4MDQ3MCwgMHgyMDYxLAorCTB4MDQ3MiwgMHgyMGI5LCAweGZmZmYsIDB4MjBjMSwgMHgwMDAwLCAweDIwOTEsIDB4NTAwMCwgMHgyMDkxLAorCTB4NDA4MCwgMHgwMDc4LCAweDA0NTUsIDB4MTA3OCwgMHgxYjUzLCAweDAwYzAsIDB4MTI5YywgMHg3NWQ4LAorCTB4NzRkYywgMHg3NWRhLCAweDc0ZGUsIDB4MDA3OCwgMHgxMmU4LCAweDIwMjksIDB4MDAwMCwgMHgyNTIwLAorCTB4NzFkMCwgMHg3M2M4LCAweDcyY2MsIDB4NzBjNCwgMHgxMDc4LCAweDFhOGQsIDB4MDA0MCwgMHgxMjg0LAorCTB4NzBjMywgMHg0MDAyLCAweDAwNzgsIDB4MTI4NCwgMHgxMDc4LCAweDFiNTMsIDB4MDBjMCwgMHgxMjljLAorCTB4NzVkOCwgMHg3NGRjLCAweDc1ZGEsIDB4NzRkZSwgMHgwMDc4LCAweDEzMDEsIDB4MjAyOSwgMHgwMDAwLAorCTB4MjUyMCwgMHg3MWQwLCAweDczYzgsIDB4NzJjYywgMHg3MGM0LCAweDEwNzgsIDB4MWFlZCwgMHgwMDQwLAorCTB4MTI4NCwgMHg3MGMzLCAweDQwMDIsIDB4MDA3OCwgMHgxMjg0LCAweDcxYzQsIDB4NzBjOCwgMHgyMTE0LAorCTB4MjAwYSwgMHgwMDc4LCAweDEyODIsIDB4NzFjNCwgMHgyMTE0LCAweDAwNzgsIDB4MTI4MiwgMHg3MGM3LAorCTB4MDAwNywgMHg3MGNiLCAweDAwNDEsIDB4NzBjZiwgMHgwMDAwLCAweDAwNzgsIDB4MTI4NCwgMHgxMDc4LAorCTB4MWI1MywgMHgwMGMwLCAweDEyOWMsIDB4NzVkOCwgMHg3NmRjLCAweDc1ZGEsIDB4NzZkZSwgMHgwMDc4LAorCTB4MTMyYywgMHgyMDI5LCAweDAwMDAsIDB4MjUzMCwgMHg3MGM0LCAweDcyYzgsIDB4NzNjYywgMHg3NGQwLAorCTB4NzBjNiwgMHg3MmNhLCAweDczY2UsIDB4NzRkMiwgMHhhMDA1LCAweDAwNDAsIDB4MTM1MCwgMHg4MDAxLAorCTB4Nzg5MiwgMHhhMDg0LCAweGZjMDAsIDB4MDA0MCwgMHgxMzQ1LCAweDc4Y2MsIDB4YTA4NSwgMHgwMDAxLAorCTB4NzhjZSwgMHgyMDAxLCAweDQwMDUsIDB4MDA3OCwgMHgxMjg2LCAweDdhOWEsIDB4N2I5ZSwgMHg3ZGEyLAorCTB4N2VhNiwgMHg3Yzk2LCAweDc4Y2MsIDB4YTA4NCwgMHhmZmZjLCAweDc4Y2UsIDB4MDA3OCwgMHgxMzU0LAorCTB4NzhjYywgMHhhMDg1LCAweDAwMDEsIDB4NzhjZSwgMHgwMDc4LCAweDEyODQsIDB4MTA3OCwgMHgxYjUzLAorCTB4MDBjMCwgMHgxMjljLCAweDc1ZDgsIDB4NzZkYywgMHg3NWRhLCAweDc2ZGUsIDB4MDA3OCwgMHgxMzYzLAorCTB4MjAyOSwgMHgwMDAwLCAweDI1MzAsIDB4NzBjNCwgMHg3MmM4LCAweDczY2MsIDB4NzRkNCwgMHg3MGM2LAorCTB4NzJjYSwgMHg3M2NlLCAweDc0ZDYsIDB4YTAwNSwgMHgwMDQwLCAweDEzODcsIDB4ODAwMSwgMHg3OGFlLAorCTB4YTA4NCwgMHhmYzAwLCAweDAwNDAsIDB4MTM3YywgMHg3OGNjLCAweGEwODUsIDB4MDEwMCwgMHg3OGNlLAorCTB4MjAwMSwgMHg0MDA1LCAweDAwNzgsIDB4MTI4NiwgMHg3YWI2LCAweDdiYmEsIDB4N2RiZSwgMHg3ZWMyLAorCTB4N2NiMiwgMHg3OGNjLCAweGEwODQsIDB4ZmNmZiwgMHg3OGNlLCAweDAwNzgsIDB4MTM4YiwgMHg3OGNjLAorCTB4YTA4NSwgMHgwMTAwLCAweDc4Y2UsIDB4MDA3OCwgMHgxMjg0LCAweDIwMDksIDB4NTE2MSwgMHgyMTBjLAorCTB4N2FlYywgMHgwMDc4LCAweDEyODIsIDB4MjAwOSwgMHg1MTQxLCAweDIxMGMsIDB4MDA3OCwgMHgxMjgzLAorCTB4MjAwOSwgMHg1MTQyLCAweDIxMGMsIDB4MDA3OCwgMHgxMjgzLCAweDIwNjEsIDB4NTE0MCwgMHg2MTBjLAorCTB4NjIxMCwgMHgwMDc4LCAweDEyODIsIDB4MjAwOSwgMHg1MTQ1LCAweDIxMGMsIDB4MDA3OCwgMHgxMjgzLAorCTB4MjAwOSwgMHg1MTQ2LCAweDIxMGMsIDB4MDA3OCwgMHgxMjgzLCAweDIwMDksIDB4NTE0OCwgMHgyMTBjLAorCTB4MDA3OCwgMHgxMjgzLCAweDIwMDksIDB4NTE0OSwgMHgyMTBjLCAweDAwNzgsIDB4MTI4MywgMHg3OTA4LAorCTB4N2EwYywgMHgwMDc4LCAweDEyODIsIDB4NzFjNCwgMHg4MTA3LCAweGEwODQsIDB4MDAwZiwgMHg4MDAzLAorCTB4ODAwMywgMHg4MDAzLCAweGEwZTgsIDB4NTM4MCwgMHg2YTAwLCAweDY4MDQsIDB4YTA4NCwgMHgwMDA4LAorCTB4MDA0MCwgMHgxM2NkLCAweDZiMDgsIDB4MDA3OCwgMHgxM2NlLCAweDZiMGMsIDB4MDA3OCwgMHgxMjgxLAorCTB4NzdjNCwgMHgxMDc4LCAweDE5NzMsIDB4MjA5MSwgMHg4MDAwLCAweDZiMWMsIDB4NmExNCwgMHgyMDkxLAorCTB4ODAwMSwgMHgyNzA4LCAweDAwNzgsIDB4MTI4MSwgMHg3OTRjLCAweDAwNzgsIDB4MTI4MywgMHg3N2M0LAorCTB4MTA3OCwgMHgxOTczLCAweDIwOTEsIDB4ODAwMCwgMHg2OTA4LCAweDZhMTgsIDB4NmIxMCwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDc4LCAweDEyODEsIDB4NzFjNCwgMHhhMTgyLCAweDAwMTAsIDB4MDBjOCwgMHgxMjdjLAorCTB4MTA3OCwgMHgyMmUyLCAweDAwNzgsIDB4MTI4MSwgMHg3MWM0LCAweGExODIsIDB4MDAxMCwgMHgwMGM4LAorCTB4MTI3YywgMHgyMDExLCAweDUxNDEsIDB4MjIwNCwgMHgwMDdlLCAweDIxMTIsIDB4MTA3OCwgMHgyMjliLAorCTB4MDE3ZiwgMHgwMDc4LCAweDEyODMsIDB4NzFjNCwgMHgyMDExLCAweDE0MjEsIDB4MjBhOSwgMHgwMDA4LAorCTB4MjIwNCwgMHhhMTA2LCAweDAwNDAsIDB4MTQxMywgMHg4MjEwLCAweDAwNzAsIDB4MTQxMSwgMHgwMDc4LAorCTB4MTQwOCwgMHgwMDc4LCAweDEyN2MsIDB4YTI5MiwgMHgxNDIxLCAweDAyN2UsIDB4MjAxMSwgMHg1MTQyLAorCTB4MjIwNCwgMHgyMTEyLCAweDAxN2YsIDB4MDA3ZSwgMHgxMDc4LCAweDIyYTcsIDB4MDE3ZiwgMHgwMDc4LAorCTB4MTI4MywgMHgwM2U4LCAweDAwZmEsIDB4MDFmNCwgMHgwMmVlLCAweDAwNjQsIDB4MDAxOSwgMHgwMDMyLAorCTB4MDA0YiwgMHgyMDYxLCAweDUxNDAsIDB4NjEwYywgMHg2MjEwLCAweDcwYzQsIDB4NjAwZSwgMHg3MGM4LAorCTB4NjAxMiwgMHgwMDc4LCAweDEyODIsIDB4MjA2MSwgMHg1MTQwLCAweDYxMTQsIDB4NzBjNCwgMHg2MDE2LAorCTB4MDA3OCwgMHgxMjgzLCAweDIwNjEsIDB4NTE0MCwgMHg3MWM0LCAweDIwMTEsIDB4MDAwNCwgMHg2MDFmLAorCTB4MDAxOSwgMHgyMDE5LCAweDEyMTIsIDB4YTE4NiwgMHgwMDI4LCAweDAwNDAsIDB4MTQ1YiwgMHgyMDExLAorCTB4MDAwNSwgMHg2MDFmLCAweDAwMTksIDB4MjAxOSwgMHgxMjEyLCAweGExODYsIDB4MDAzMiwgMHgwMDQwLAorCTB4MTQ1YiwgMHgyMDExLCAweDAwMDYsIDB4NjAxZiwgMHgwMDBjLCAweDIwMTksIDB4MjIyMiwgMHhhMTg2LAorCTB4MDAzYywgMHgwMGMwLCAweDEyN2MsIDB4NjAxOCwgMHgwMDdlLCAweDYxMWEsIDB4NzgwMCwgMHhhMDg0LAorCTB4MDAwMSwgMHgwMGMwLCAweDE0NzYsIDB4MjAwMSwgMHgwNGZkLCAweDIwMDQsIDB4YTA4MiwgMHgwMDA1LAorCTB4MDA0OCwgMHgxNDZlLCAweDAwMzgsIDB4MTQ3MiwgMHgwMDc4LCAweDE0NzYsIDB4MDAyOCwgMHgxNDcyLAorCTB4MDA3OCwgMHgxNDc2LCAweDIwMTksIDB4MjIyMiwgMHgwMDc4LCAweDE0NzgsIDB4MjAxOSwgMHgxMjEyLAorCTB4MjNiOCwgMHgxMDc4LCAweDIyYjgsIDB4MTA3OCwgMHg0ZDIyLCAweDAxN2YsIDB4MDA3OCwgMHgxMjgzLAorCTB4NzFjNCwgMHhhMTg0LCAweGZmY2YsIDB4MDBjMCwgMHgxMjdjLCAweDIwMTEsIDB4NTE0OCwgMHgyMjA0LAorCTB4MjExMiwgMHgwMDdlLCAweDEwNzgsIDB4MjJkYSwgMHgwMTdmLCAweDAwNzgsIDB4MTI4MywgMHg3MWM0LAorCTB4YTE4MiwgMHgwMDEwLCAweDAwYzgsIDB4MTI3YywgMHgyMDExLCAweDUxNDksIDB4MjIwNCwgMHgwMDdlLAorCTB4MjExMiwgMHgxMDc4LCAweDIyYzksIDB4MDE3ZiwgMHgwMDc4LCAweDEyODMsIDB4NzFjNCwgMHg3MmM4LAorCTB4YTE4NCwgMHhmZmZkLCAweDAwYzAsIDB4MTI3YiwgMHhhMjg0LCAweGZmZmQsIDB4MDBjMCwgMHgxMjdiLAorCTB4MjEwMCwgMHg3OTA4LCAweDc4MGEsIDB4MjIwMCwgMHg3YTBjLCAweDc4MGUsIDB4MDA3OCwgMHgxMjgyLAorCTB4NzFjNCwgMHg4MTA3LCAweGEwODQsIDB4MDAwZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMGU4LAorCTB4NTM4MCwgMHgyMDE5LCAweDAwMDAsIDB4NzJjOCwgMHhhMjg0LCAweDAwODAsIDB4MDA0MCwgMHgxNGM2LAorCTB4NmMxNCwgMHg4NGZmLCAweDAwYzAsIDB4MTRjNiwgMHg2ODE3LCAweDAwNDAsIDB4YTI4NCwgMHgwMDQwLAorCTB4MDA0MCwgMHgxNGQwLCAweDZjMTAsIDB4ODRmZiwgMHgwMGMwLCAweDE0ZDAsIDB4NjgxMywgMHgwMDAxLAorCTB4NjgwMCwgMHgwMDdlLCAweGEyMjYsIDB4MDA0MCwgMHgxNGYzLCAweDZhMDIsIDB4YTQ4NCwgMHgyMDAwLAorCTB4MDA0MCwgMHgxNGRjLCAweGEzOWQsIDB4MDAxMCwgMHhhNDg0LCAweDEwMDAsIDB4MDA0MCwgMHgxNGUyLAorCTB4YTM5ZCwgMHgwMDA4LCAweGE0ODQsIDB4NDAwMCwgMHgwMDQwLCAweDE0ZjMsIDB4ODEwZiwgMHhhMjg0LAorCTB4NDAwMCwgMHgwMDQwLCAweDE0ZWYsIDB4MTA3OCwgMHgyMmZjLCAweDAwNzgsIDB4MTRmMywgMHgxMDc4LAorCTB4MjJlZSwgMHgwMDc4LCAweDE0ZjMsIDB4NzJjYywgMHg2ODA4LCAweGEyMDYsIDB4MDA0MCwgMHgxNTIyLAorCTB4YTJhNCwgMHgwMGZmLCAweDIwNjEsIDB4NTE0MCwgMHg2MTE4LCAweGExODYsIDB4MDAyOCwgMHgwMDQwLAorCTB4MTUwOSwgMHhhMTg2LCAweDAwMzIsIDB4MDA0MCwgMHgxNTBmLCAweGExODYsIDB4MDAzYywgMHgwMDQwLAorCTB4MTUxNSwgMHhhNDgyLCAweDAwNjQsIDB4MDA0OCwgMHgxNTFmLCAweDAwNzgsIDB4MTUxOSwgMHhhNDgyLAorCTB4MDA1MCwgMHgwMDQ4LCAweDE1MWYsIDB4MDA3OCwgMHgxNTE5LCAweGE0ODIsIDB4MDA0MywgMHgwMDQ4LAorCTB4MTUxZiwgMHg3MWM0LCAweDcxYzYsIDB4MDI3ZiwgMHg3MmNhLCAweDAwNzgsIDB4MTI3ZCwgMHg2YTBhLAorCTB4YTM5ZCwgMHgwMDBhLCAweDY4MDQsIDB4YTMwNSwgMHg2ODA2LCAweDAyN2YsIDB4NmIwYywgMHg3MWM0LAorCTB4MDA3OCwgMHgxMjgxLCAweDc3YzQsIDB4MTA3OCwgMHgxOTczLCAweDIwOTEsIDB4ODAwMCwgMHg2YTE0LAorCTB4NmIxYywgMHgyMDkxLCAweDgwMDEsIDB4NzBjOCwgMHg2ODE2LCAweDcwY2MsIDB4NjgxZSwgMHgyNzA4LAorCTB4MDA3OCwgMHgxMjgxLCAweDcwYzQsIDB4Nzk0YywgMHg3ODRlLCAweDAwNzgsIDB4MTI4MywgMHg3MWM0LAorCTB4NzJjOCwgMHg3M2NjLCAweGExODIsIDB4MDAxMCwgMHgwMGM4LCAweDEyN2MsIDB4MTA3OCwgMHgyMzBhLAorCTB4MDA3OCwgMHgxMjgxLCAweDc3YzQsIDB4MTA3OCwgMHgxOTczLCAweDIwOTEsIDB4ODAwMCwgMHg2YTA4LAorCTB4YTI5NSwgMHgwMDAyLCAweDZhMGEsIDB4MjA5MSwgMHg4MDAxLCAweDI3MDgsIDB4MDA3OCwgMHgxMjgyLAorCTB4NzdjNCwgMHgxMDc4LCAweDE5NzMsIDB4MjA5MSwgMHg4MDAwLCAweDZhMDgsIDB4YTI5NCwgMHhmZmY5LAorCTB4NmEwYSwgMHg2ODA0LCAweGEwMDUsIDB4MDA0MCwgMHgxNTY3LCAweDEwNzgsIDB4MjFkMiwgMHgyMDkxLAorCTB4ODAwMSwgMHgyNzA4LCAweDAwNzgsIDB4MTI4MiwgMHg3N2M0LCAweDEwNzgsIDB4MTk3MywgMHgyMDkxLAorCTB4ODAwMCwgMHg2YTA4LCAweGEyOTUsIDB4MDAwNCwgMHg2YTBhLCAweDY4MDQsIDB4YTAwNSwgMHgwMDQwLAorCTB4MTU3YiwgMHgxMDc4LCAweDIxZDIsIDB4MjA5MSwgMHg4MDAxLCAweDI3MDgsIDB4MDA3OCwgMHgxMjgyLAorCTB4NzdjNCwgMHgyMDQxLCAweDAwMDEsIDB4MjA0OSwgMHgwMDA1LCAweDIwNTEsIDB4MDAyMCwgMHgyMDkxLAorCTB4ODAwMCwgMHgxMDc4LCAweDE5ODAsIDB4MjA5MSwgMHg4MDAxLCAweDI3MDgsIDB4NmEwOCwgMHgwMDc4LAorCTB4MTI4MiwgMHg3N2M0LCAweDcyYzgsIDB4NzNjYywgMHg3N2M2LCAweDcyY2EsIDB4NzNjZSwgMHgxMDc4LAorCTB4MTllMSwgMHgwMGMwLCAweDE1YTksIDB4NjgxOCwgMHhhMDA1LCAweDAwNDAsIDB4MTVhOSwgMHgyNzA4LAorCTB4MTA3OCwgMHgyMzFhLCAweDAwYzAsIDB4MTVhOSwgMHg3ODE3LCAweDAwMTUsIDB4MjA5MSwgMHg4MDAxLAorCTB4MDA3YywgMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwgMHgxMjg0LCAweDc3YzQsIDB4NzdjNiwgMHgyMDQxLAorCTB4MDAyMSwgMHgyMDQ5LCAweDAwMDUsIDB4MjA1MSwgMHgwMDIwLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LAorCTB4MTk4MCwgMHgyMDYxLCAweDUxNDAsIDB4NjA2ZiwgMHgwMDAzLCAweDY3ODIsIDB4NjA5MywgMHgwMDBmLAorCTB4NjA3MywgMHgwMDAwLCAweDc4MTcsIDB4MDAxNiwgMHgxMDc4LCAweDIxZDIsIDB4MjA5MSwgMHg4MDAxLAorCTB4MDA3YywgMHg3N2M4LCAweDc3Y2EsIDB4NzdjNCwgMHg3N2M2LCAweGE3YmMsIDB4ZmYwMCwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDYxLCAweDUxNDAsIDB4NjA2ZiwgMHgwMDAyLCAweDYwNzMsIDB4MDAwMCwgMHg2NzgyLAorCTB4NjA5MywgMHgwMDBmLCAweDc4MTcsIDB4MDAxNywgMHgxMDc4LCAweDIxZDIsIDB4MjA5MSwgMHg4MDAxLAorCTB4MjA0MSwgMHgwMDIxLCAweDIwNDksIDB4MDAwNCwgMHgyMDUxLCAweDAwMTAsIDB4MjA5MSwgMHg4MDAwLAorCTB4MTA3OCwgMHgxOTgwLCAweDcwYzgsIDB4NjgzNiwgMHg4NzM4LCAweGE3ODQsIDB4MDAxZiwgMHgwMGMwLAorCTB4MTVlOCwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHg3OGNjLCAweGEwODQsIDB4MDAwMywgMHgwMGMwLAorCTB4MTYxOCwgMHgyMDM5LCAweDAwMDAsIDB4MjA0MSwgMHgwMDIxLCAweDIwNDksIDB4MDAwNCwgMHgyMDUxLAorCTB4MDAwOCwgMHgxMDc4LCAweDE5NzMsIDB4MjA5MSwgMHg4MDAwLCAweDY4MDgsIDB4YTgwZCwgMHg2OTBhLAorCTB4MjA5MSwgMHg4MDAxLCAweDg3MzgsIDB4YTc4NCwgMHgwMDFmLCAweDAwYzAsIDB4MTYwMSwgMHhhN2JjLAorCTB4ZmYwMCwgMHg4NzNmLCAweDg3MzgsIDB4ODczZiwgMHhhNzg0LCAweDBmMDAsIDB4MDBjMCwgMHgxNjAxLAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNjksIDB4MDEwMCwgMHg2ODMwLCAweGEwODQsIDB4MDA0MCwgMHgwMDQwLAorCTB4MTY0MSwgMHg2ODRiLCAweDAwMDQsIDB4MjBhOSwgMHgwMDE0LCAweDY4NDgsIDB4YTA4NCwgMHgwMDA0LAorCTB4MDA0MCwgMHgxNjJlLCAweDAwNzAsIDB4MTYyZSwgMHgwMDc4LCAweDE2MjUsIDB4Njg0YiwgMHgwMDA5LAorCTB4MjBhOSwgMHgwMDE0LCAweDY4NDgsIDB4YTA4NCwgMHgwMDAxLCAweDAwNDAsIDB4MTYzYiwgMHgwMDcwLAorCTB4MTYzYiwgMHgwMDc4LCAweDE2MzIsIDB4MjBhOSwgMHgwMGZhLCAweDAwNzAsIDB4MTY0MSwgMHgwMDc4LAorCTB4MTYzZCwgMHgyMDc5LCAweDUxMDAsIDB4NzgxNywgMHgwMDE4LCAweDIwNjEsIDB4NTE0MCwgMHg2MDZmLAorCTB4MDAwMSwgMHg2MDczLCAweDAwMDAsIDB4NjA5MywgMHgwMDBmLCAweDc4Y2MsIDB4YTA4NSwgMHgwMDAyLAorCTB4NzhjZSwgMHg2ODA4LCAweGEwODQsIDB4ZmZmZCwgMHg2ODBhLCAweDY4MWIsIDB4MDA0OCwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDdjLCAweDc4Y2MsIDB4YTA4NCwgMHhmZmZkLCAweDc4Y2UsIDB4YTA4NCwgMHgwMDAxLAorCTB4MDBjMCwgMHgxNjY0LCAweDEwNzgsIDB4MWEyYiwgMHg3MWM0LCAweDcxYzYsIDB4Nzk0YSwgMHgwMDdjLAorCTB4MTA3OCwgMHgxYjUzLCAweDAwYzAsIDB4MTI5YywgMHg3NWQ4LCAweDc0ZGMsIDB4NzVkYSwgMHg3NGRlLAorCTB4MDA3OCwgMHgxNjc1LCAweDIwMjksIDB4MDAwMCwgMHgyNTIwLCAweDcxYzQsIDB4NzNjOCwgMHg3MmNjLAorCTB4NzFjNiwgMHg3M2NhLCAweDcyY2UsIDB4MjA3OSwgMHg1MTAwLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LAorCTB4MTkyZSwgMHgyMDkxLCAweDgwMDEsIDB4MDA0MCwgMHgxNzJjLCAweDIwYTksIDB4MDAwNSwgMHgyMGExLAorCTB4NTExOCwgMHgyMDkxLCAweDgwMDAsIDB4NDFhMSwgMHgyMDkxLCAweDgwMDEsIDB4MjAwOSwgMHgwMDIwLAorCTB4MTA3OCwgMHgxOTI5LCAweDAwNDAsIDB4MTY5OCwgMHgxMDc4LCAweDE5NDgsIDB4MDA3OCwgMHgxNzJjLAorCTB4NjAwNCwgMHhhMDg0LCAweGZmMDAsIDB4ODAwNywgMHg4MDA5LCAweDAwNDAsIDB4MTZmYiwgMHgwYzdlLAorCTB4MmM2OCwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHgxOTJlLCAweDIwOTEsIDB4ODAwMSwgMHgwMDQwLAorCTB4MTZjYywgMHgyYzAwLCAweDY4OWUsIDB4ODEwOSwgMHgwMGMwLCAweDE2YTAsIDB4NjA5ZiwgMHgwMDAwLAorCTB4MGM3ZiwgMHgwYzdlLCAweDcyMTgsIDB4NzMxYywgMHg3NDIwLCAweDc1MjQsIDB4MmM2OCwgMHg2ODljLAorCTB4YTA2NSwgMHgwMDQwLCAweDE2ZmEsIDB4MjAwOSwgMHgwMDIwLCAweDEwNzgsIDB4MTkyOSwgMHgwMGMwLAorCTB4MTZlMywgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHgxNmNjLAorCTB4MmQwMCwgMHg2MDAyLCAweDAwNzgsIDB4MTZiMiwgMHgwYzdmLCAweDBjN2UsIDB4NjA5YywgMHgyMDYwLAorCTB4MTA3OCwgMHgxOWIzLCAweDBjN2YsIDB4NjA5ZiwgMHgwMDAwLCAweDEwNzgsIDB4MTczMCwgMHgyMDA5LAorCTB4MDAwYywgMHg2MDA4LCAweGEwODUsIDB4MDIwMCwgMHg2MDBhLCAweDEwNzgsIDB4MTkyNCwgMHgxMDc4LAorCTB4MTk0OCwgMHgwMDc4LCAweDE3MmMsIDB4MGM3ZiwgMHgwYzdlLCAweDYwOWMsIDB4MjA2MCwgMHgxMDc4LAorCTB4MTliMywgMHgwYzdmLCAweDYwOWYsIDB4MDAwMCwgMHgxMDc4LCAweDE3MzAsIDB4MjAwOSwgMHgwMDBjLAorCTB4NjAwNywgMHgwMTAzLCAweDYwMWIsIDB4MDAwMywgMHgxMDc4LCAweDE5MjQsIDB4MTA3OCwgMHgxOTQ4LAorCTB4MDA3OCwgMHgxNzJjLCAweDBjN2YsIDB4NzRjNCwgMHg3M2M4LCAweDcyY2MsIDB4NjAxNCwgMHgyMDkxLAorCTB4ODAwMCwgMHg3ODE3LCAweDAwMTIsIDB4MGU3ZSwgMHgyMDcxLCAweDUxNDAsIDB4NzA2ZiwgMHgwMDA1LAorCTB4NzA3MywgMHgwMDAwLCAweDczNzYsIDB4NzI3YSwgMHg3NDdlLCAweDcwODIsIDB4NzA4NywgMHgwMDAwLAorCTB4MmMwMCwgMHg3MDhhLCAweDcwOGYsIDB4MDAwMCwgMHhhMDJlLCAweDI1MzAsIDB4NjExYywgMHg2MWEyLAorCTB4YTE4NCwgMHgwMDYwLCAweDAwNDAsIDB4MTcxZSwgMHgxMDc4LCAweDQ3YzIsIDB4MGU3ZiwgMHg2NTk2LAorCTB4NjVhNiwgMHg2NjlhLCAweDY2YWEsIDB4NjBhZiwgMHgwMDAwLCAweDYwYjMsIDB4MDAwMCwgMHgxMDc4LAorCTB4MjFkMiwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHg3MGMzLCAweDQwMDUsIDB4MDA3OCwgMHgxMjg3LAorCTB4MjBhOSwgMHgwMDA1LCAweDIwOTksIDB4NTExOCwgMHgyMDkxLCAweDgwMDAsIDB4NTMwYSwgMHgyMDkxLAorCTB4ODAwMSwgMHgyMTAwLCAweGEyMTAsIDB4YTM5OSwgMHgwMDAwLCAweGE0YTEsIDB4MDAwMCwgMHhhNWE5LAorCTB4MDAwMCwgMHgwMDdjLCAweDcxYzQsIDB4NzBjNywgMHgwMDAwLCAweDc5MDYsIDB4MDA3OCwgMHgxMjg0LAorCTB4NzFjNCwgMHg3MWM2LCAweDIxNjgsIDB4MDA3OCwgMHgxNzRmLCAweDIwNjksIDB4MTAwMCwgMHg2OTBjLAorCTB4YTAxNiwgMHgyZDA0LCAweGEyMTAsIDB4OGQ2OCwgMHg4MTA5LCAweDAwYzAsIDB4MTc1MSwgMHhhMjg1LAorCTB4MDAwMCwgMHgwMGMwLCAweDE3NWYsIDB4NzBjMywgMHg0MDAwLCAweDAwNzgsIDB4MTc2MSwgMHg3MGMzLAorCTB4NDAwMywgMHg3MGNhLCAweDAwNzgsIDB4MTI4NywgMHgyMDExLCAweDUxNjcsIDB4MjIwYywgMHg3MGM0LAorCTB4ODAwMywgMHgwMDQ4LCAweDE3NzEsIDB4MTA3OCwgMHgzYjdmLCAweGExODQsIDB4N2ZmZiwgMHgwMDc4LAorCTB4MTc3NSwgMHgxMDc4LCAweDNiNzIsIDB4YTE4NSwgMHg4MDAwLCAweDIwMTIsIDB4MDA3OCwgMHgxMjgzLAorCTB4NzFjNCwgMHgxMDc4LCAweDNiNjksIDB4NjEwMCwgMHgyMDAxLCAweDUxNjcsIDB4MjAwNCwgMHhhMDg0LAorCTB4ODAwMCwgMHhhMTBkLCAweDYyMDQsIDB4NjMwOCwgMHgwMDc4LCAweDEyODEsIDB4NzllNCwgMHgwMDc4LAorCTB4MTI4MywgMHg3MWM0LCAweDcxYzYsIDB4MjE5OCwgMHgyMGExLCAweDAwNDIsIDB4MjBhOSwgMHgwMDA0LAorCTB4NTNhMywgMHgyMWEwLCAweDIwOTksIDB4MDA0MiwgMHgyMGE5LCAweDAwMDQsIDB4NTNhMywgMHgwMDc4LAorCTB4MTI4NCwgMHg3MGM0LCAweDIwNjgsIDB4MjA3OSwgMHg1MTAwLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LAorCTB4MTkyZSwgMHgyMDkxLCAweDgwMDEsIDB4MDA0MCwgMHgxODI1LCAweDYwMDcsIDB4MDAwMSwgMHg2MDBiLAorCTB4MDAwMCwgMHg2MDJiLCAweDAwMDAsIDB4NjAxYiwgMHgwMDA2LCAweDZhMTAsIDB4YTI4YywgMHgwMDBmLAorCTB4YTI4NCwgMHgwMGYwLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTEwNSwgMHg2MDE2LAorCTB4YTI4NCwgMHgwODAwLCAweDAwNDAsIDB4MTdjMCwgMHg2MDFiLCAweDAwMGEsIDB4MDA3OCwgMHgxN2M2LAorCTB4YTI4NCwgMHgxMDAwLCAweDAwNDAsIDB4MTdjNiwgMHg2MDFiLCAweDAwMGMsIDB4YTI4NCwgMHgwMzAwLAorCTB4MDA0MCwgMHgxN2NmLCAweDYwMmIsIDB4MDAwMSwgMHg4MDA0LCAweDgwMDQsIDB4ODAwNCwgMHhhMDg1LAorCTB4MDAwMSwgMHg2MDFlLCAweDYwMjMsIDB4MDAwMCwgMHg2MDI3LCAweDAwMDAsIDB4YTI4NCwgMHgwNDAwLAorCTB4MDA0MCwgMHgxN2RjLCAweDYwMmIsIDB4MDAwMCwgMHgyMGE5LCAweDAwMDYsIDB4YWM4MCwgMHgwMDBiLAorCTB4MjBhMCwgMHhhZDgwLCAweDAwMDUsIDB4MjA5OCwgMHg1M2EzLCAweGEyODQsIDB4MDMwMCwgMHgwMGMwLAorCTB4MTdmMSwgMHg2MDQ2LCAweDYwNGEsIDB4NjA0ZSwgMHg2MDUyLCAweDYwOTYsIDB4NjA5YSwgMHgwMDc4LAorCTB4MTdmYiwgMHg2ODAwLCAweDYwNDYsIDB4NjgwNCwgMHg2MDRhLCAweDZlMDgsIDB4NjY0ZSwgMHg2ZDBjLAorCTB4NjU1MiwgMHg2NTk2LCAweDY2OWEsIDB4NjAxNCwgMHgyMDkxLCAweDgwMDAsIDB4NzgxNywgMHgwMDQyLAorCTB4MmMwOCwgMHgyMDYxLCAweDUxNDAsIDB4NjA2ZiwgMHgwMDA1LCAweDYwNzMsIDB4MDAwMCwgMHg2MDc3LAorCTB4MDAwMCwgMHg2MDdiLCAweDAwMDAsIDB4NjA3ZiwgMHgwMDAwLCAweDYwODIsIDB4NjE4YSwgMHhhMjg0LAorCTB4MDQwMCwgMHg2MDhlLCAweDIwOTEsIDB4ODAwMSwgMHgwZTdlLCAweDIwNzEsIDB4MDAyMCwgMHg3MDA3LAorCTB4MDAwYSwgMHg3MDA3LCAweDAwMDIsIDB4NzAwMywgMHgwMDAwLCAweDBlN2YsIDB4MjA5MSwgMHg4MDAwLAorCTB4MTA3OCwgMHgyMWQyLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDcwYzMsIDB4NDAwNSwgMHgwMDc4LAorCTB4MTI4NywgMHgwYzdlLCAweDBkN2UsIDB4MGU3ZSwgMHgwZjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLAorCTB4NTE0MCwgMHgyMDc5LCAweDAxMDAsIDB4MjA2MSwgMHgwMDEwLCAweDcwYTAsIDB4YTA2ZCwgMHgwMDQwLAorCTB4MThiMSwgMHg2YTA0LCAweGEyOTQsIDB4MDBmZiwgMHhhMjg2LCAweDAwMDcsIDB4MDA0MCwgMHgxODQ0LAorCTB4YTI4NiwgMHgwMDBmLCAweDAwYzAsIDB4MThiMSwgMHg2OTFjLCAweGExODQsIDB4MDA4MCwgMHgwMGMwLAorCTB4MThiMSwgMHg2ODI0LCAweGExOGMsIDB4ZmYwMCwgMHhhMDg1LCAweDAwMTksIDB4NjgyNiwgMHg3MWIwLAorCTB4ODFmZiwgMHgwMDQwLCAweDE4NjcsIDB4MGQ3ZSwgMHgyMDY5LCAweDAwMjAsIDB4NjgwNywgMHgwMDEwLAorCTB4NjkwOCwgMHg2ODA4LCAweGExMDYsIDB4MDBjMCwgMHgxODU4LCAweDY5MGMsIDB4NjgwYywgMHhhMTA2LAorCTB4MDBjMCwgMHgxODVkLCAweGExODQsIDB4MDBmZiwgMHgwMGMwLCAweDE4NWQsIDB4MGQ3ZiwgMHg3OGI4LAorCTB4YTA4NCwgMHg4MDFmLCAweDAwYzAsIDB4MTg2NywgMHg3ODQ4LCAweGEwODUsIDB4MDAwYywgMHg3ODRhLAorCTB4NzFiMCwgMHg4MWZmLCAweDAwNDAsIDB4MTg4YSwgMHg3MGIzLCAweDAwMDAsIDB4MGQ3ZSwgMHgyMDY5LAorCTB4MDAyMCwgMHg2ODA3LCAweDAwMTgsIDB4NjgwNCwgMHhhMDg0LCAweDAwMDgsIDB4MDBjMCwgMHgxODdiLAorCTB4NjgwNywgMHgwMDA4LCAweDY4MDQsIDB4YTA4NCwgMHgwMDA4LCAweDAwYzAsIDB4MTg4MiwgMHg2ODA3LAorCTB4MDAwMiwgMHgwZDdmLCAweDYxYzQsIDB4NjJjOCwgMHg2M2NjLCAweDYxYzYsIDB4NjJjYSwgMHg2M2NlLAorCTB4MGU3ZSwgMHgyMDcxLCAweDUxMDAsIDB4NzI2NiwgMHg3MzZhLCAweGFlODAsIDB4MDAxOSwgMHgwZTdmLAorCTB4Nzg0OCwgMHhhMDg0LCAweDAwMGMsIDB4MDBjMCwgMHgxODk4LCAweDEwNzgsIDB4NDZkYiwgMHg3OGEzLAorCTB4MDAwMCwgMHg3ODU4LCAweGEwODQsIDB4ZWRmZiwgMHg3ODVhLCAweDcwYjQsIDB4YTA4MCwgMHgwMGRmLAorCTB4NzgxYSwgMHgwZjdmLCAweDBlN2YsIDB4MGQ3ZiwgMHgwYzdmLCAweDIwOTEsIDB4ODAwMSwgMHgwMDc4LAorCTB4MTI4NCwgMHgwZjdmLCAweDBlN2YsIDB4MGQ3ZiwgMHgwYzdmLCAweDIwOTEsIDB4ODAwMSwgMHgyMDAxLAorCTB4NDAwNSwgMHgwMDc4LCAweDEyODYsIDB4Nzk4MCwgMHg3MWM2LCAweDcxYzQsIDB4YTE4MiwgMHgwMDAzLAorCTB4MDBjOCwgMHgxMjdjLCAweDc5ODIsIDB4MDA3OCwgMHgxMjg0LCAweDc5ODAsIDB4NzFjNiwgMHgwMDc4LAorCTB4MTI4NCwgMHg3OTc0LCAweDcxYzYsIDB4NzFjNCwgMHg3OTc2LCAweDc5NzgsIDB4NzFjYSwgMHg3MWM4LAorCTB4Nzk3YSwgMHg3OTdjLCAweDcxY2UsIDB4NzFjYywgMHg3OTdlLCAweDAwNzgsIDB4MTI4NCwgMHg3OTc0LAorCTB4NzFjNiwgMHg3OTc4LCAweDcxY2EsIDB4Nzk3YywgMHg3MWNlLCAweDAwNzgsIDB4MTI4NCwgMHg3OTAwLAorCTB4NzFjNiwgMHg3MWM0LCAweDc5MDIsIDB4MjAwMSwgMHgwNGZkLCAweDIwMDQsIDB4YTA4MiwgMHgwMDA1LAorCTB4MDA0OCwgMHgxOGVlLCAweDAwMzgsIDB4MThmMCwgMHgwMDc4LCAweDE4ZmEsIDB4MDBhOCwgMHgxOGZhLAorCTB4YTE4YywgMHgwMDAxLCAweDAwYzAsIDB4MThmOCwgMHgyMGI5LCAweDIyMjIsIDB4MDA3OCwgMHgxOGZhLAorCTB4MjBiOSwgMHgxMjEyLCAweDAwNzgsIDB4MTI4NCwgMHg3OTAwLCAweDcxYzYsIDB4MDA3OCwgMHgxMjg0LAorCTB4MjAwOSwgMHg1MTc0LCAweDIxMDQsIDB4NzBjNiwgMHg3MGM0LCAweDIwMGEsIDB4MDA3OCwgMHgxMjg0LAorCTB4MjAwOSwgMHg1MTc0LCAweDIxMDQsIDB4NzBjNiwgMHgwMDc4LCAweDEyODQsIDB4NzFjNCwgMHg4MTA3LAorCTB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGEwZTgsIDB4NTM4MCwgMHg2YTE0LAorCTB4ZDJiNCwgMHgwMDQwLCAweDE5MWYsIDB4MjAxMSwgMHgwMDAxLCAweDAwNzgsIDB4MTkyMSwgMHgyMDExLAorCTB4MDAwMCwgMHg2YjBjLCAweDAwNzgsIDB4MTI4MSwgMHhhYzgwLCAweDAwMDEsIDB4MTA3OCwgMHgxYjBmLAorCTB4MDA3YywgMHhhYzgwLCAweDAwMDEsIDB4MTA3OCwgMHgxYWFmLCAweDAwN2MsIDB4Nzg1MCwgMHhhMDY1LAorCTB4MDA0MCwgMHgxOTM2LCAweDJjMDQsIDB4Nzg1MiwgMHgyMDYzLCAweDAwMDAsIDB4MDA3YywgMHgwZjdlLAorCTB4MjA3OSwgMHg1MTAwLCAweDc4NTAsIDB4YTA2ZCwgMHgwMDQwLCAweDE5NDYsIDB4MmQwNCwgMHg3ODUyLAorCTB4NjgwMywgMHgwMDAwLCAweDY4MDcsIDB4MDAwMCwgMHg2ODBiLCAweDAwMDAsIDB4MGY3ZiwgMHgwMDdjLAorCTB4MjA5MSwgMHg4MDAwLCAweDBmN2UsIDB4MjA3OSwgMHg1MTAwLCAweDc4NTAsIDB4MjA2MiwgMHgyYzAwLAorCTB4YTAwNSwgMHgwMGMwLCAweDE5NTUsIDB4MTA3OCwgMHgyM2ViLCAweDc4NTIsIDB4MGY3ZiwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDdjLCAweDBmN2UsIDB4MjA3OSwgMHg1MTAwLCAweDc4NTAsIDB4MjA2YSwgMHgyZDAwLAorCTB4Nzg1MiwgMHgwZjdmLCAweDAwN2MsIDB4MjAxMSwgMHg3ODAwLCAweDdhNTIsIDB4N2JlYywgMHg4MzE5LAorCTB4MDA0MCwgMHgxOTcwLCAweGEyODAsIDB4MDAzMSwgMHgyMDEyLCAweDIwMTAsIDB4MDA3OCwgMHgxOTY3LAorCTB4MjAxMywgMHgwMDAwLCAweDAwN2MsIDB4YTc4NCwgMHgwZjAwLCAweDgwMGIsIDB4YTc4NCwgMHgwMDFmLAorCTB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMTA1LCAweGEwZTgsIDB4NTQwMCwgMHgwMDdjLAorCTB4MTA3OCwgMHgxOTczLCAweDI5MDAsIDB4NjgyYSwgMHgyYTAwLCAweDY4MmUsIDB4NjgwOCwgMHhhMDg0LAorCTB4ZmZlZiwgMHhhODBkLCAweDY5MGEsIDB4MjAwOSwgMHg1MTUyLCAweDIxMGMsIDB4NjgwNCwgMHhhMDA1LAorCTB4MDA0MCwgMHgxOWIyLCAweGExMTYsIDB4MDBjMCwgMHgxOTlkLCAweDIwNjAsIDB4NjAwMCwgMHg2ODA2LAorCTB4MDE3ZSwgMHgyMDBiLCAweDAwMDAsIDB4MDA3OCwgMHgxOWEwLCAweDIwMDksIDB4MDAwMCwgMHgwMTdlLAorCTB4NjgwNCwgMHhhMDY1LCAweDAwNDAsIDB4MTlhZiwgMHg2MDAwLCAweDY4MDYsIDB4MTA3OCwgMHgxOWMwLAorCTB4MTA3OCwgMHgxYzVmLCAweDY4MTAsIDB4ODAwMSwgMHg2ODEyLCAweDAwYzAsIDB4MTlhMCwgMHgwMTdmLAorCTB4NjkwMiwgMHg2OTA2LCAweDAwN2MsIDB4YTA2NSwgMHgwMDQwLCAweDE5YmYsIDB4NjA5YywgMHg2MDlmLAorCTB4MDAwMCwgMHgyMDA4LCAweDEwNzgsIDB4MTk0OCwgMHgyMTAwLCAweDAwNzgsIDB4MTliMywgMHgwMDdjLAorCTB4NjAwNywgMHgwMTAzLCAweDYwOGYsIDB4MDAwMCwgMHgyMGE5LCAweDAwMWMsIDB4YWM4MCwgMHgwMDA1LAorCTB4MjBhMCwgMHgyMDAxLCAweDAwMDAsIDB4NDBhNCwgMHg2ODI4LCAweDYwMWEsIDB4NjgyYywgMHg2MDIyLAorCTB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4NTE0MCwgMHg3MDRjLCAweGEwOGMsIDB4MDIwMCwgMHgwMGMwLAorCTB4MTlkZiwgMHhhMDg4LCAweDUxODAsIDB4MmQwYSwgMHg4MDAwLCAweDcwNGUsIDB4YTAwNiwgMHgwZTdmLAorCTB4MDA3YywgMHgxMDc4LCAweDE5NzMsIDB4MjA5MSwgMHg4MDAwLCAweDY4MDQsIDB4NzgxZSwgMHhhMDY1LAorCTB4MDA0MCwgMHgxYTJhLCAweDAwNzgsIDB4MTlmMiwgMHgyYzAwLCAweDc4MWUsIDB4NjAwMCwgMHhhMDY1LAorCTB4MDA0MCwgMHgxYTJhLCAweDYwMGMsIDB4YTMwNiwgMHgwMGMwLCAweDE5ZWMsIDB4NjAxMCwgMHhhMjA2LAorCTB4MDBjMCwgMHgxOWVjLCAweDJjMjgsIDB4MjAwMSwgMHg1MTUyLCAweDIwMDQsIDB4YWMwNiwgMHgwMGMwLAorCTB4MWEwMywgMHgwMDc4LCAweDFhMjgsIDB4NjgwNCwgMHhhYzA2LCAweDAwYzAsIDB4MWExMCwgMHg2MDAwLAorCTB4YTA2NSwgMHg2ODA2LCAweDAwYzAsIDB4MWExYSwgMHg2ODAzLCAweDAwMDAsIDB4MDA3OCwgMHgxYTFhLAorCTB4NjQwMCwgMHg3ODFjLCAweDIwNjAsIDB4NjQwMiwgMHhhNDg2LCAweDAwMDAsIDB4MDBjMCwgMHgxYTFhLAorCTB4MmMwMCwgMHg2ODAyLCAweDI1NjAsIDB4MTA3OCwgMHgxOWMwLCAweDYwMWIsIDB4MDAwNSwgMHg2MDIzLAorCTB4MDAyMCwgMHgxMDc4LCAweDFjNWYsIDB4NjgxMCwgMHg4MDAxLCAweDEwNTAsIDB4MjNlYiwgMHg2ODEyLAorCTB4YTA4NSwgMHhmZmZmLCAweDAwN2MsIDB4MjAzOSwgMHgwMDAwLCAweDIwNDEsIDB4MDAyMSwgMHgyMDQ5LAorCTB4MDAwNCwgMHgyMDUxLCAweDAwMDgsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4MTk4MCwgMHg4NzM4LAorCTB4YTc4NCwgMHgwMDFmLCAweDAwYzAsIDB4MWEzNSwgMHhhN2JjLCAweGZmMDAsIDB4ODczZiwgMHg4NzM4LAorCTB4ODczZiwgMHhhNzg0LCAweDBmMDAsIDB4MDBjMCwgMHgxYTM1LCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLAorCTB4MjA2MSwgMHgwMDAwLCAweDYwMTgsIDB4YTA4NCwgMHgwMDAxLCAweDAwYzAsIDB4MWE1OSwgMHgyMDkxLAorCTB4ODAwMCwgMHg3OGUwLCAweDc4ZTMsIDB4MDAwMCwgMHgyMDkxLCAweDgwMDEsIDB4YTAwNSwgMHgwMGMwLAorCTB4MWE1YSwgMHgwMDdjLCAweGEwOGMsIDB4ZmZmMCwgMHgwMDQwLCAweDFhNjAsIDB4MTA3OCwgMHgyM2ViLAorCTB4MDA3OSwgMHgxYTYyLCAweDFhNzIsIDB4MWE3NSwgMHgxYTdiLCAweDFhN2YsIDB4MWE3MywgMHgxYTgzLAorCTB4MWE4OSwgMHgxYTczLCAweDFhNzMsIDB4MWMyOSwgMHgxYzRkLCAweDFjNTEsIDB4MWE3MywgMHgxYTczLAorCTB4MWE3MywgMHgxYTczLCAweDAwN2MsIDB4MTA3OCwgMHgyM2ViLCAweDEwNzgsIDB4MWEyYiwgMHgyMDAxLAorCTB4ODAwMSwgMHgwMDc4LCAweDFjNTcsIDB4MjAwMSwgMHg4MDAzLCAweDAwNzgsIDB4MWM1NywgMHgyMDAxLAorCTB4ODAwNCwgMHgwMDc4LCAweDFjNTcsIDB4MTA3OCwgMHgxYTJiLCAweDIwMDEsIDB4ODAwNiwgMHgwMDc4LAorCTB4MWM1NywgMHgyMDAxLCAweDgwMDcsIDB4MDA3OCwgMHgxYzU3LCAweDIwMzAsIDB4MjEzOCwgMHhhNzgyLAorCTB4MDAyMSwgMHgwMDQ4LCAweDFhOTUsIDB4MjAwOSwgMHgwMDIwLCAweDI2MDAsIDB4MTA3OCwgMHgxYWFmLAorCTB4MDBjMCwgMHgxYWFlLCAweGE3YmEsIDB4MDAyMCwgMHgwMDQ4LCAweDFhYWQsIDB4MDA0MCwgMHgxYWFkLAorCTB4MjcwOCwgMHhhNmIwLCAweDAwMjAsIDB4YTI5MCwgMHgwMDQwLCAweGEzOTksIDB4MDAwMCwgMHhhNGExLAorCTB4MDAwMCwgMHhhNWE5LCAweDAwMDAsIDB4MDA3OCwgMHgxYThmLCAweGEwMDYsIDB4MDA3YywgMHg4MWZmLAorCTB4MDA0MCwgMHgxYWVhLCAweDIwOTksIDB4MDAzMCwgMHgyMGEwLCAweDcwMGMsIDB4YTA4NCwgMHgwMGZmLAorCTB4MDA0MCwgMHgxYWMxLCAweDcwMDcsIDB4MDAwNCwgMHg3MDA0LCAweGEwODQsIDB4MDAwNCwgMHgwMGMwLAorCTB4MWFiYywgMHgyMWE4LCAweDcwMTcsIDB4MDAwMCwgMHg4MTBiLCAweDcxMTIsIDB4NzIxYSwgMHg3MzFlLAorCTB4NzQyMiwgMHg3NTI2LCAweDc4MGMsIDB4YTA4NSwgMHgwMDAxLCAweDcwMDIsIDB4NzAwNywgMHgwMDAxLAorCTB4MjAwMSwgMHgwNGZkLCAweDIwMDQsIDB4YTA4MiwgMHgwMDA1LCAweDAwYzgsIDB4MWFkZSwgMHgyMDA5LAorCTB4MDAyMiwgMHgyMTA0LCAweGEwODQsIDB4NDAwMCwgMHgwMGMwLCAweDFhZDAsIDB4NzAwOCwgMHg4MDBiLAorCTB4MDBjOCwgMHgxYWQwLCAweDcwMDcsIDB4MDAwMiwgMHhhMDhjLCAweDAxZTAsIDB4MDBjMCwgMHgxYWVhLAorCTB4NTNhNSwgMHhhMDA2LCAweDcwMDMsIDB4MDAwMCwgMHgwMDdjLCAweDIwMzAsIDB4MjEzOCwgMHhhNzgyLAorCTB4MDAyMSwgMHgwMDQ4LCAweDFhZjUsIDB4MjAwOSwgMHgwMDIwLCAweDI2MDAsIDB4MTA3OCwgMHgxYjBmLAorCTB4MDBjMCwgMHgxYjBlLCAweGE3YmEsIDB4MDAyMCwgMHgwMDQ4LCAweDFiMGQsIDB4MDA0MCwgMHgxYjBkLAorCTB4MjcwOCwgMHhhNmIwLCAweDAwMjAsIDB4YTI5MCwgMHgwMDQwLCAweGEzOTksIDB4MDAwMCwgMHhhNGExLAorCTB4MDAwMCwgMHhhNWE5LCAweDAwMDAsIDB4MDA3OCwgMHgxYWVmLCAweGEwMDYsIDB4MDA3YywgMHg4MWZmLAorCTB4MDA0MCwgMHgxYjUwLCAweDIwOTgsIDB4MjBhMSwgMHgwMDMwLCAweDcwMGMsIDB4YTA4NCwgMHgwMGZmLAorCTB4MDA0MCwgMHgxYjIxLCAweDcwMDcsIDB4MDAwNCwgMHg3MDA0LCAweGEwODQsIDB4MDAwNCwgMHgwMGMwLAorCTB4MWIxYywgMHgyMWE4LCAweDcwMTcsIDB4MDAwMCwgMHg4MTBiLCAweDcxMTIsIDB4NzIxYSwgMHg3MzFlLAorCTB4NzQyMiwgMHg3NTI2LCAweDc4MGMsIDB4YTA4NSwgMHgwMDAwLCAweDcwMDIsIDB4NTNhNiwgMHg3MDA3LAorCTB4MDAwMSwgMHgyMDAxLCAweDA0ZmQsIDB4MjAwNCwgMHhhMDgyLCAweDAwMDUsIDB4MDBjOCwgMHgxYjNmLAorCTB4MjAwOSwgMHgwMDIyLCAweDIxMDQsIDB4YTA4NCwgMHg0MDAwLCAweDAwYzAsIDB4MWIzMSwgMHg3MDEwLAorCTB4YTA4NCwgMHhmMDAwLCAweDAwNDAsIDB4MWI0OCwgMHg3MDA3LCAweDAwMDgsIDB4MDA3OCwgMHgxYjRjLAorCTB4NzEwOCwgMHg4MTAzLCAweDAwYzgsIDB4MWIzMSwgMHg3MDA3LCAweDAwMDIsIDB4YTE4NCwgMHgwMWUwLAorCTB4NzAwMywgMHgwMDAwLCAweDAwN2MsIDB4MjAwMSwgMHgwNGZkLCAweDIwMDQsIDB4YTA4MiwgMHgwMDA0LAorCTB4MDBjOCwgMHgxYjVjLCAweDAwNzgsIDB4MWI1ZiwgMHhhMDA2LCAweDAwNzgsIDB4MWI2MSwgMHhhMDg1LAorCTB4MDAwMSwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHg1MTAwLCAweDJkMDgsIDB4NzA1OCwgMHg2ODAyLAorCTB4YTAwNSwgMHgwMGMwLCAweDFiNmMsIDB4NzE1ZSwgMHg3MTVhLCAweDBlN2YsIDB4MDA3YywgMHgyYzA4LAorCTB4Nzg1OCwgMHg2MDAyLCAweGEwMDUsIDB4MDBjMCwgMHgxYjc2LCAweDc5NWUsIDB4Nzk1YSwgMHgwMDdjLAorCTB4MjA5MSwgMHg4MDAwLCAweDYwMDMsIDB4MDAwMCwgMHgyYzA4LCAweDc4NWMsIDB4YTA2NSwgMHgwMGMwLAorCTB4MWI4NCwgMHg3OTVhLCAweDAwNzgsIDB4MWI4NSwgMHg2MTAyLCAweDc5NWUsIDB4MjA5MSwgMHg4MDAxLAorCTB4MTA3OCwgMHgyMWVmLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweDUxMDAsIDB4NzA1OCwgMHhhMDZkLAorCTB4MDA0MCwgMHgxYjk5LCAweDY4MDAsIDB4NzA1YSwgMHhhMDA1LCAweDAwYzAsIDB4MWI5OCwgMHg3MDVlLAorCTB4OGRmZiwgMHgwZTdmLCAweDAwN2MsIDB4MGQ3ZSwgMHgwYzdlLCAweDBmN2UsIDB4MjA3OSwgMHg1MTAwLAorCTB4YWY4MCwgMHgwMDE2LCAweDIwNjAsIDB4NjAwMCwgMHhhMDA1LCAweDAwNDAsIDB4MWJjOSwgMHgyMDY4LAorCTB4NjgxNCwgMHhhMzA2LCAweDAwYzAsIDB4MWJiMiwgMHg2ODI4LCAweGEwODQsIDB4MDBmZiwgMHhhNDA2LAorCTB4MDA0MCwgMHgxYmI1LCAweDJkNjAsIDB4MDA3OCwgMHgxYmEzLCAweDY4MDAsIDB4YTAwNSwgMHg2MDAyLAorCTB4MDBjMCwgMHgxYmMxLCAweGFmODAsIDB4MDAxNiwgMHhhYzA2LCAweDAwNDAsIDB4MWJjMCwgMHgyYzAwLAorCTB4Nzg1ZSwgMHgwZDdlLCAweDY4OWMsIDB4YTAwNSwgMHgwMDQwLCAweDFiYzgsIDB4MTA3OCwgMHgxOWIzLAorCTB4MDA3ZiwgMHgwZjdmLCAweDBjN2YsIDB4MGQ3ZiwgMHhhMDA1LCAweDAwN2MsIDB4MGQ3ZSwgMHgwYzdlLAorCTB4MGY3ZSwgMHgyMDc5LCAweDUxMDAsIDB4YWY4MCwgMHgwMDE2LCAweDIwNjAsIDB4NjAwMCwgMHhhMDA1LAorCTB4MDA0MCwgMHgxYmY4LCAweDIwNjgsIDB4NjgxNCwgMHhhMDg0LCAweDAwZmYsIDB4YTMwNiwgMHgwMDQwLAorCTB4MWJlNCwgMHgyZDYwLCAweDAwNzgsIDB4MWJkNiwgMHg2ODAwLCAweGEwMDUsIDB4NjAwMiwgMHgwMGMwLAorCTB4MWJmMCwgMHhhZjgwLCAweDAwMTYsIDB4YWMwNiwgMHgwMDQwLCAweDFiZWYsIDB4MmMwMCwgMHg3ODVlLAorCTB4MGQ3ZSwgMHg2ODljLCAweGEwMDUsIDB4MDA0MCwgMHgxYmY3LCAweDEwNzgsIDB4MTliMywgMHgwMDdmLAorCTB4MGY3ZiwgMHgwYzdmLCAweDBkN2YsIDB4YTAwNSwgMHgwMDdjLCAweDBkN2UsIDB4MGM3ZSwgMHgwZjdlLAorCTB4MjA3OSwgMHg1MTAwLCAweGFmODAsIDB4MDAxNiwgMHgyMDYwLCAweDYwMDAsIDB4YTA2ZCwgMHgwMDQwLAorCTB4MWMyNCwgMHg2ODE0LCAweGEzMDYsIDB4MDA0MCwgMHgxYzEwLCAweDJkNjAsIDB4MDA3OCwgMHgxYzA1LAorCTB4NjgwMCwgMHhhMDA1LCAweDYwMDIsIDB4MDBjMCwgMHgxYzFjLCAweGFmODAsIDB4MDAxNiwgMHhhYzA2LAorCTB4MDA0MCwgMHgxYzFiLCAweDJjMDAsIDB4Nzg1ZSwgMHgwZDdlLCAweDY4OWMsIDB4YTAwNSwgMHgwMDQwLAorCTB4MWMyMywgMHgxMDc4LCAweDE5YjMsIDB4MDA3ZiwgMHgwZjdmLCAweDBjN2YsIDB4MGQ3ZiwgMHhhMDA1LAorCTB4MDA3YywgMHgyMDkxLCAweDgwMDAsIDB4MjA2OSwgMHg1MTQwLCAweDY4MDAsIDB4YTA4NiwgMHgwMDAwLAorCTB4MDA0MCwgMHgxYzM3LCAweDIwOTEsIDB4ODAwMSwgMHg3OGUzLCAweDAwMDksIDB4MDA3YywgMHg2ODgwLAorCTB4YTBiYywgMHhmZjAwLCAweDIwNDEsIDB4MDAyMSwgMHgyMDQ5LCAweDAwMDQsIDB4MjA1MSwgMHgwMDEwLAorCTB4MTA3OCwgMHgxOTgwLCAweDg3MzgsIDB4YTc4NCwgMHgwMDFmLCAweDAwYzAsIDB4MWM0MCwgMHgyMDkxLAorCTB4ODAwMSwgMHgyMDAxLCAweDgwMGEsIDB4MDA3OCwgMHgxYzU3LCAweDIwMDEsIDB4ODAwYywgMHgwMDc4LAorCTB4MWM1NywgMHgxMDc4LCAweDFhMmIsIDB4MjAwMSwgMHg4MDBkLCAweDAwNzgsIDB4MWM1NywgMHg3MGMyLAorCTB4MjA2MSwgMHgwMDAwLCAweDYwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MDA3YywgMHg2MDA0LAorCTB4MmMwOCwgMHgyMDYzLCAweDAwMDAsIDB4Nzg4NCwgMHg4MDAwLCAweDc4ODYsIDB4Nzg4OCwgMHhhMDA1LAorCTB4Nzk4YSwgMHgwMDQwLCAweDFjNmUsIDB4MmMwMiwgMHgwMDc4LCAweDFjNmYsIDB4Nzk4ZSwgMHgwMDdjLAorCTB4NjgwNywgMHgwMTAzLCAweDBjN2UsIDB4MjA2MSwgMHg1MTAwLCAweDJkMDgsIDB4MjA2YiwgMHgwMDAwLAorCTB4NjA4NCwgMHg4MDAwLCAweDYwODYsIDB4NjA4OCwgMHhhMDA1LCAweDYxOGEsIDB4MDA0MCwgMHgxYzgzLAorCTB4MmQwMiwgMHgwMDc4LCAweDFjODQsIDB4NjE4ZSwgMHgwYzdmLCAweDAwN2MsIDB4MTA3OCwgMHgxYzk3LAorCTB4MDA0MCwgMHgxYzk2LCAweDBjN2UsIDB4NjA5YywgMHhhMDY1LCAweDAwNDAsIDB4MWM5MSwgMHgxMDc4LAorCTB4MTliMywgMHgwYzdmLCAweDYwOWYsIDB4MDAwMCwgMHgxMDc4LCAweDE5NDgsIDB4MDA3YywgMHg3ODhjLAorCTB4YTA2NSwgMHgwMDQwLCAweDFjYTksIDB4MjA5MSwgMHg4MDAwLCAweDc4ODQsIDB4ODAwMSwgMHg3ODg2LAorCTB4MmMwNCwgMHg3ODhlLCAweGEwMDUsIDB4MDBjMCwgMHgxY2E3LCAweDc4OGEsIDB4ODAwMCwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDdjLCAweDIwYTksIDB4MDAxMCwgMHhhMDA2LCAweDgwMDQsIDB4ODA4NiwgMHg4MThlLAorCTB4MDBjOCwgMHgxY2IzLCAweGEyMDAsIDB4MDA3MCwgMHgxY2I3LCAweDAwNzgsIDB4MWNhZSwgMHg4MDg2LAorCTB4ODE4ZSwgMHgwMDdjLCAweDE1N2UsIDB4MjBhOSwgMHgwMDEwLCAweGEwMDUsIDB4MDA0MCwgMHgxY2RkLAorCTB4YTExYSwgMHgwMGM4LCAweDFjZGQsIDB4ODIxMywgMHg4MThkLCAweDAwNDgsIDB4MWNjZSwgMHhhMTFhLAorCTB4MDBjOCwgMHgxY2NmLCAweDAwNzAsIDB4MWNkNSwgMHgwMDc4LCAweDFjYzMsIDB4YTExYSwgMHgyMzA4LAorCTB4ODIxMCwgMHgwMDcwLCAweDFjZDUsIDB4MDA3OCwgMHgxY2MzLCAweDAwN2UsIDB4MzIwMCwgMHhhMDg0LAorCTB4ZjdmZiwgMHgyMDgwLCAweDAwN2YsIDB4MTU3ZiwgMHgwMDdjLCAweDAwN2UsIDB4MzIwMCwgMHhhMDg1LAorCTB4MDgwMCwgMHgwMDc4LCAweDFjZDksIDB4Nzk5NCwgMHg3MGQwLCAweGExMDYsIDB4MDA0MCwgMHgxZDUxLAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MDAyMCwgMHg3MDA0LCAweGEwMDUsIDB4MDBjMCwgMHgxZDUxLAorCTB4NzAwOCwgMHg3MjA4LCAweGEyMDYsIDB4MDBjMCwgMHgxZDUxLCAweGEyODYsIDB4MDAwOCwgMHgwMGMwLAorCTB4MWQ1MSwgMHgyMDcxLCAweDAwMTAsIDB4MTA3OCwgMHgxOTJlLCAweDAwNDAsIDB4MWQ1MSwgMHg3YTljLAorCTB4N2I5OCwgMHg3Y2E0LCAweDdkYTAsIDB4YTE4NCwgMHhmZjAwLCAweDAwNDAsIDB4MWQxZiwgMHgyMDMxLAorCTB4MDAwMCwgMHg4MTBiLCAweDg2YjUsIDB4ODEwYiwgMHg4NmI1LCAweDgxMGIsIDB4ODZiNSwgMHg4MTBiLAorCTB4ODZiNSwgMHg4MTBiLCAweDg2YjUsIDB4ODEwYiwgMHg4NmI1LCAweDIxMDAsIDB4YTIxMCwgMHgyNjAwLAorCTB4YTMxOSwgMHhhNGExLCAweDAwMDAsIDB4YTVhOSwgMHgwMDAwLCAweDAwNzgsIDB4MWQyOSwgMHg4MTA3LAorCTB4ODAwNCwgMHg4MDA0LCAweGEyMTAsIDB4YTM5OSwgMHgwMDAwLCAweGE0YTEsIDB4MDAwMCwgMHhhNWE5LAorCTB4MDAwMCwgMHgyMDA5LCAweDAwMjAsIDB4MTA3OCwgMHgxOTI5LCAweDIwOTEsIDB4ODAwMSwgMHgwMDQwLAorCTB4MWQ0OCwgMHgxMDc4LCAweDE5NDgsIDB4NzhhOCwgMHg4MDAwLCAweDc4YWEsIDB4YTA4NiwgMHgwMDAyLAorCTB4MDBjMCwgMHgxZDUxLCAweDIwOTEsIDB4ODAwMCwgMHg3OGUzLCAweDAwMDIsIDB4NzhhYiwgMHgwMDAwLAorCTB4NzhjYywgMHhhMDg1LCAweDAwMDMsIDB4NzhjZSwgMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwgMHgxZDUxLAorCTB4NzhhYiwgMHgwMDAwLCAweDEwNzgsIDB4MjBhYywgMHg2MDA0LCAweGEwODQsIDB4MDAwZiwgMHgwMDc5LAorCTB4MWQ1NiwgMHgyMDcxLCAweDAwMTAsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4MWQ2NiwgMHgxZDg4LAorCTB4MWRhZSwgMHgxZDY2LCAweDFkY2IsIDB4MWQ3NSwgMHgxZjJjLCAweDFmNDcsIDB4MWQ2NiwgMHgxZDgyLAorCTB4MWRhOCwgMHgxZTEzLCAweDFlODIsIDB4MWVkMiwgMHgxZWU0LCAweDFmNDMsIDB4MjAzOSwgMHgwNDAwLAorCTB4NzhkYywgMHhhNzA1LCAweDc4ZGUsIDB4NjAwOCwgMHhhNzA1LCAweDYwMGEsIDB4MTA3OCwgMHgxZmM3LAorCTB4NjA5YywgMHg3OGRhLCAweDEwNzgsIDB4MjA5NCwgMHgwMDdjLCAweDc4ZGMsIDB4YTA4NCwgMHgwMTAwLAorCTB4MDA0MCwgMHgxZDdjLCAweDAwNzgsIDB4MWQ2NiwgMHg2MDFjLCAweGEwODUsIDB4MDA4MCwgMHg2MDFlLAorCTB4MDA3OCwgMHgxZDhmLCAweDEwNzgsIDB4MWI1MywgMHgwMGMwLCAweDFkNjYsIDB4MTA3OCwgMHgyMGM2LAorCTB4NzhkYywgMHhhMDg0LCAweDAxMDAsIDB4MDA0MCwgMHgxZDhmLCAweDAwNzgsIDB4MWQ2NiwgMHg3OGRmLAorCTB4MDAwMCwgMHg2MDA0LCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLCAweDc4ZDIsIDB4ODAwMSwgMHg2MDlmLAorCTB4MDAwMCwgMHgwMDQwLCAweDFkYTUsIDB4MTA3OCwgMHgxZmM3LCAweDAwNDAsIDB4MWRhNSwgMHg3OGRjLAorCTB4YTA4NSwgMHgwMTAwLCAweDc4ZGUsIDB4MDA3OCwgMHgxZGE3LCAweDEwNzgsIDB4MWZlYiwgMHgwMDdjLAorCTB4MTA3OCwgMHgxYjUzLCAweDAwYzAsIDB4MWQ2NiwgMHgxMDc4LCAweDIwYzIsIDB4NzhkYywgMHhhMDhjLAorCTB4MGUwMCwgMHgwMGMwLCAweDFkYjcsIDB4YTA4NCwgMHgwMTAwLCAweDAwYzAsIDB4MWRiOSwgMHgwMDc4LAorCTB4MWQ2NiwgMHgxMDc4LCAweDFmYzcsIDB4MDBjMCwgMHgxZGNhLCAweDYxMDQsIDB4YTE4YywgMHgwMGZmLAorCTB4YTE4NiwgMHgwMDA3LCAweDAwNDAsIDB4MWY4NCwgMHhhMTg2LCAweDAwMGYsIDB4MDA0MCwgMHgxZjg0LAorCTB4MTA3OCwgMHgxZmViLCAweDAwN2MsIDB4NzhkYywgMHhhMDg0LCAweDAxMDAsIDB4MDA0MCwgMHgxZGQyLAorCTB4MDA3OCwgMHgxZDY2LCAweDc4ZGYsIDB4MDAwMCwgMHg2NzE0LCAweDIwMTEsIDB4MDAwMSwgMHgyMGE5LAorCTB4MDAwMSwgMHg2MDE4LCAweGEwODQsIDB4MDBmZiwgMHhhMDA1LCAweDAwNDAsIDB4MWRmNSwgMHgyMDExLAorCTB4MDAwMSwgMHhhN2JjLCAweGZmMDAsIDB4MjBhOSwgMHgwMDIwLCAweGEwOGUsIDB4MDAwMSwgMHgwMDQwLAorCTB4MWRmNSwgMHgyMDM5LCAweDAwMDAsIDB4MjAxMSwgMHgwMDAyLCAweDIwYTksIDB4MDEwMCwgMHhhMDhlLAorCTB4MDAwMiwgMHgwMDQwLCAweDFkZjUsIDB4MDA3OCwgMHgxZTEwLCAweDEwNzgsIDB4MTk3MywgMHgyMDkxLAorCTB4ODAwMCwgMHg2ODJiLCAweDAwMDAsIDB4NjgyZiwgMHgwMDAwLCAweDY4MDgsIDB4YTA4NCwgMHhmZmRlLAorCTB4NjgwYSwgMHhhZGU4LCAweDAwMTAsIDB4MjA5MSwgMHg4MDAxLCAweDAwNzAsIDB4MWUwOSwgMHgwMDc4LAorCTB4MWRmNywgMHg4MjExLCAweDAwNDAsIDB4MWUxMCwgMHgyMGE5LCAweDAxMDAsIDB4MDA3OCwgMHgxZGY3LAorCTB4MTA3OCwgMHgxOTQ4LCAweDAwN2MsIDB4MjAwMSwgMHg1MTY3LCAweDIwMDQsIDB4YTA4NCwgMHg4MDAwLAorCTB4MDA0MCwgMHgxZmFjLCAweDYxMTQsIDB4MTA3OCwgMHgyMGUzLCAweDY5MDAsIDB4YTE4NCwgMHgwMDAxLAorCTB4MDA0MCwgMHgxZTM0LCAweDYwMjgsIDB4YTA4NCwgMHgwMGZmLCAweDAwYzAsIDB4MWZhNCwgMHg2ODAwLAorCTB4YTA4NCwgMHgwMDAxLCAweDAwNDAsIDB4MWZhYywgMHg2ODAzLCAweDAwMDAsIDB4NjgwYiwgMHgwMDAwLAorCTB4NjgwNywgMHgwMDAwLCAweDAwNzgsIDB4MWZiNCwgMHgyMDExLCAweDAwMDEsIDB4NjAyMCwgMHhkMGY0LAorCTB4MDA0MCwgMHgxZTNjLCAweGEyOTUsIDB4MDAwMiwgMHhkMGM0LCAweDAwNDAsIDB4MWU0MSwgMHhhMjk1LAorCTB4MDAwOCwgMHhkMGNjLCAweDAwNDAsIDB4MWU0NiwgMHhhMjk1LCAweDA0MDAsIDB4NjAxYywgMHhhMDg0LAorCTB4MDAwMiwgMHgwMDQwLCAweDFlNGQsIDB4YTI5NSwgMHgwMDA0LCAweDYwMmMsIDB4YTA4YywgMHgwMGZmLAorCTB4YTE4MiwgMHgwMDAyLCAweDAwNDgsIDB4MWZiMCwgMHhhMTgyLCAweDAwMWIsIDB4MDBjOCwgMHgxZmIwLAorCTB4MDA0MCwgMHgxZmIwLCAweDY5MGUsIDB4NjAyYywgMHg4MDA3LCAweGEwOGMsIDB4MDBmZiwgMHhhMTgyLAorCTB4MDAwMiwgMHgwMDQ4LCAweDFmYjAsIDB4YTE4MiwgMHgwMDFiLCAweDAwYzgsIDB4MWZiMCwgMHgwMDQwLAorCTB4MWZiMCwgMHg2OTEyLCAweDYwMzAsIDB4YTAwNSwgMHgwMGMwLCAweDFlNzAsIDB4MjAwMSwgMHgwMDFlLAorCTB4ODAwMCwgMHg2ODE2LCAweDYwMjgsIDB4YTA4NCwgMHgwMGZmLCAweDAwNDAsIDB4MWZhYywgMHg2ODA2LAorCTB4NjAyOCwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHgwMDQwLCAweDFmYWMsIDB4NjgwYSwgMHg2YTAyLAorCTB4MDA3OCwgMHgxZmI0LCAweDIwMDEsIDB4NTE2NywgMHgyMDA0LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLAorCTB4MWZhYywgMHg2MTE0LCAweDEwNzgsIDB4MjBlMywgMHgyMDkxLCAweDgwMDAsIDB4NmEwNCwgMHg2YjA4LAorCTB4NjQxOCwgMHhhNDg0LCAweDAwMDMsIDB4MDA0MCwgMHgxZWE4LCAweDYxMjgsIDB4YTE4YywgMHgwMGZmLAorCTB4ODAwMSwgMHgwMGMwLCAweDFlYTEsIDB4MjEwMCwgMHhhMjEwLCAweDAwNDgsIDB4MWVjZSwgMHgwMDc4LAorCTB4MWVhOCwgMHg4MDAxLCAweDAwYzAsIDB4MWVjZSwgMHgyMTAwLCAweGEyMTIsIDB4MDA0OCwgMHgxZWNlLAorCTB4YTQ4NCwgMHgwMDBjLCAweDAwNDAsIDB4MWVjMiwgMHg2MTI4LCAweDgxMGYsIDB4YTE4YywgMHgwMGZmLAorCTB4YTA4MiwgMHgwMDA0LCAweDAwYzAsIDB4MWViYSwgMHgyMTAwLCAweGEzMTgsIDB4MDA0OCwgMHgxZWNlLAorCTB4MDA3OCwgMHgxZWMyLCAweGEwODIsIDB4MDAwNCwgMHgwMGMwLCAweDFlY2UsIDB4MjEwMCwgMHhhMzFhLAorCTB4MDA0OCwgMHgxZWNlLCAweDYwMzAsIDB4YTAwNSwgMHgwMDQwLCAweDFlYzgsIDB4ODAwMCwgMHg2ODE2LAorCTB4NmEwNiwgMHg2YjBhLCAweDIwOTEsIDB4ODAwMSwgMHgwMDc4LCAweDFmYjQsIDB4MjA5MSwgMHg4MDAxLAorCTB4MDA3OCwgMHgxZmIwLCAweDYxMTQsIDB4MTA3OCwgMHgyMGUzLCAweDIwOTEsIDB4ODAwMCwgMHg2YjA4LAorCTB4ODMxOCwgMHgwMDQ4LCAweDFlZTAsIDB4NmIwYSwgMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwgMHgxZmMzLAorCTB4MjA5MSwgMHg4MDAxLCAweDAwNzgsIDB4MWZiMCwgMHg2MDI0LCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLAorCTB4MDA0MCwgMHgxZjAyLCAweGEwODYsIDB4MDA4MCwgMHgwMGMwLCAweDFmMmEsIDB4MjBhOSwgMHgwMDA4LAorCTB4MjA2OSwgMHg3NTEwLCAweDIwOTEsIDB4ODAwMCwgMHg2ODAwLCAweGEwODQsIDB4ZmNmZiwgMHg2ODAyLAorCTB4YWRlOCwgMHgwMDA4LCAweDAwNzAsIDB4MWVmZSwgMHgwMDc4LCAweDFlZjQsIDB4MjA5MSwgMHg4MDAxLAorCTB4MDA3OCwgMHgxZmI0LCAweDYwMjgsIDB4YTAxNSwgMHgwMDQwLCAweDFmMmEsIDB4NjExNCwgMHgxMDc4LAorCTB4MjBlMywgMHgwZDdlLCAweGFkZTgsIDB4MDAwNywgMHgyMDkxLCAweDgwMDAsIDB4NjgwMCwgMHhhMDBkLAorCTB4MDA0MCwgMHgxZjI3LCAweGEyMDYsIDB4MDA0MCwgMHgxZjE4LCAweDIxNjgsIDB4MDA3OCwgMHgxZjBlLAorCTB4MGM3ZSwgMHgyMTYwLCAweDYwMDAsIDB4NjgwMiwgMHgxMDc4LCAweDE5NDgsIDB4MGM3ZiwgMHgwZDdmLAorCTB4NjgwOCwgMHg4MDAwLCAweDY4MGEsIDB4MjA5MSwgMHg4MDAxLCAweDAwNzgsIDB4MWZjMywgMHgyMDkxLAorCTB4ODAwMSwgMHgwZDdmLCAweDAwNzgsIDB4MWZhYywgMHg2MTE0LCAweDEwNzgsIDB4MjBlMywgMHg2ODAwLAorCTB4YTA4NCwgMHgwMDAxLCAweDAwNDAsIDB4MWY5YywgMHgyMDkxLCAweDgwMDAsIDB4NmEwNCwgMHg4MjEwLAorCTB4MDA0OCwgMHgxZjNmLCAweDZhMDYsIDB4MjA5MSwgMHg4MDAxLCAweDAwNzgsIDB4MWZjMywgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDc4LCAweDFmYjAsIDB4MTA3OCwgMHgxYjUzLCAweDAwYzAsIDB4MWQ2NiwgMHg2MTE0LAorCTB4MTA3OCwgMHgyMGUzLCAweDYwYmUsIDB4NjBiYiwgMHgwMDAwLCAweDY5MDAsIDB4YTE4NCwgMHgwMDA4LAorCTB4MDA0MCwgMHgxZjU2LCAweDYwMjAsIDB4YTA4NSwgMHgwMTAwLCAweDYwMjIsIDB4YTE4NCwgMHgwMDAxLAorCTB4MDA0MCwgMHgxZmFjLCAweGExODQsIDB4MDEwMCwgMHgwMGMwLCAweDFmOTgsIDB4YTE4NCwgMHgwMjAwLAorCTB4MDBjMCwgMHgxZjk0LCAweDY4MWMsIDB4YTAwNSwgMHgwMGMwLCAweDFmYTAsIDB4NjAwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg2LCAweDAwMGYsIDB4MDBjMCwgMHgxZjZmLCAweDEwNzgsIDB4MjBjNiwgMHg3OGRmLAorCTB4MDAwMCwgMHg2MDA0LCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLCAweDc4ZDIsIDB4ODAwMSwgMHg2MDlmLAorCTB4MDAwMCwgMHgwMDQwLCAweDFmODQsIDB4MTA3OCwgMHgxZmM3LCAweDAwNDAsIDB4MWY4NCwgMHg3OGRjLAorCTB4YTA4NSwgMHgwMTAwLCAweDc4ZGUsIDB4MDA3YywgMHg3OGQ3LCAweDAwMDAsIDB4NzhkYiwgMHgwMDAwLAorCTB4NjAyNCwgMHhhMDg0LCAweGZmMDAsIDB4NjAyNiwgMHgxMDc4LCAweDM5ZGUsIDB4MDA0MCwgMHgxY2UzLAorCTB4MTA3OCwgMHgxYjc4LCAweDAwNzgsIDB4MWNlMywgMHgyMDA5LCAweDAwMTcsIDB4MDA3OCwgMHgxZmI2LAorCTB4MjAwOSwgMHgwMDBlLCAweDAwNzgsIDB4MWZiNiwgMHgyMDA5LCAweDAwMDcsIDB4MDA3OCwgMHgxZmI2LAorCTB4MjAwOSwgMHgwMDM1LCAweDAwNzgsIDB4MWZiNiwgMHgyMDA5LCAweDAwM2UsIDB4MDA3OCwgMHgxZmI2LAorCTB4MjAwOSwgMHgwMDA0LCAweDAwNzgsIDB4MWZiNiwgMHgyMDA5LCAweDAwMDYsIDB4MDA3OCwgMHgxZmI2LAorCTB4MjAwOSwgMHgwMDE2LCAweDAwNzgsIDB4MWZiNiwgMHgyMDA5LCAweDAwMDEsIDB4NjAyNCwgMHhhMDg0LAorCTB4ZmYwMCwgMHhhMTA1LCAweDYwMjYsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4MWM1ZiwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDc4LCAweDFjZTMsIDB4MTA3OCwgMHgxOTQ4LCAweDAwNzgsIDB4MWNlMywgMHg3OGQ0LAorCTB4YTA2ZCwgMHgwMGMwLCAweDFmZDIsIDB4MmMwMCwgMHg3OGQ2LCAweDc4ZGEsIDB4NjA5ZiwgMHgwMDAwLAorCTB4MDA3OCwgMHgxZmRlLCAweDJjMDAsIDB4Njg5ZSwgMHg2MDlmLCAweDAwMDAsIDB4NzhkNiwgMHgyZDAwLAorCTB4NjAwMiwgMHg3OGQ4LCAweGFkMDYsIDB4MDBjMCwgMHgxZmRlLCAweDYwMDIsIDB4NzhkMCwgMHg4MDAxLAorCTB4NzhkMiwgMHgwMGMwLCAweDFmZWEsIDB4NzhkYywgMHhhMDg0LCAweGZlZmYsIDB4NzhkZSwgMHg3OGQ4LAorCTB4MjA2MCwgMHhhMDA2LCAweDAwN2MsIDB4YTAyZSwgMHgyNTMwLCAweDYxMWMsIDB4NjFhMiwgMHhhMTg0LAorCTB4ZTFmZiwgMHg2MDFlLCAweGExODQsIDB4MDA2MCwgMHgwMDQwLCAweDFmZmEsIDB4MGU3ZSwgMHgxMDc4LAorCTB4NDdjMiwgMHgwZTdmLCAweDY1OTYsIDB4NjVhNiwgMHg2NjlhLCAweDY2YWEsIDB4NjBhZiwgMHgwMDAwLAorCTB4NjBiMywgMHgwMDAwLCAweDY3MTQsIDB4MTA3OCwgMHgxOTczLCAweDIwOTEsIDB4ODAwMCwgMHg2MGEwLAorCTB4YTA4NCwgMHg4MDAwLCAweDAwYzAsIDB4MjAyMSwgMHg2ODA4LCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLAorCTB4MjAyMSwgMHgyMDkxLCAweDgwMDEsIDB4MTA3OCwgMHgxOWMwLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LAorCTB4MWM1ZiwgMHgyMDkxLCAweDgwMDEsIDB4NzhkNywgMHgwMDAwLCAweDc4ZGIsIDB4MDAwMCwgMHgwMDc4LAorCTB4MjA5MywgMHg2MDI0LCAweGEwOTYsIDB4MDAwMSwgMHgwMGMwLCAweDIwMjgsIDB4ODAwMCwgMHg2MDI2LAorCTB4NmExMCwgMHg2ODE0LCAweDIwOTEsIDB4ODAwMSwgMHhhMjAyLCAweDAwNDgsIDB4MjAzNywgMHgwMDQwLAorCTB4MjAzNywgMHgyMDM5LCAweDAyMDAsIDB4MTA3OCwgMHgyMDk0LCAweDAwNzgsIDB4MjA5MywgMHgyYzA4LAorCTB4MjA5MSwgMHg4MDAwLCAweDYwYTAsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4MjA2NCwgMHg2ODAwLAorCTB4YTA2NSwgMHgwMDQwLCAweDIwNjksIDB4NmEwNCwgMHgwZTdlLCAweDIwNzEsIDB4NTE0MCwgMHg3MDAwLAorCTB4YTA4NCwgMHgwMDAxLCAweDAwNDAsIDB4MjA1ZSwgMHg3MDQ4LCAweGEyMDYsIDB4MDBjMCwgMHgyMDVlLAorCTB4NmIwNCwgMHgyMzFjLCAweDIxNjAsIDB4NjMwMiwgMHgyMzAwLCAweGEwMDUsIDB4MDBjMCwgMHgyMDU5LAorCTB4NjkwMiwgMHgyMjYwLCAweDYxMDIsIDB4MGU3ZiwgMHgwMDc4LCAweDIwNzAsIDB4MjE2MCwgMHg2MjAyLAorCTB4NjkwNiwgMHgwZTdmLCAweDAwNzgsIDB4MjA3MCwgMHg2ODAwLCAweGEwNjUsIDB4MDA0MCwgMHgyMDY5LAorCTB4NjEwMiwgMHg2OTAyLCAweDAwYzAsIDB4MjA2ZCwgMHg2OTA2LCAweDIxNjAsIDB4NjAwMywgMHgwMDAwLAorCTB4MjE2MCwgMHg2MGEwLCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDIwN2EsIDB4NjgwOCwgMHhhMDg0LAorCTB4ZmZmYywgMHg2ODBhLCAweDY4MTAsIDB4ODAwMCwgMHg2ODEyLCAweDIwOTEsIDB4ODAwMSwgMHg2ODA4LAorCTB4YTA4YywgMHgwMDQwLCAweDAwNDAsIDB4MjA4OSwgMHhhMDg2LCAweDAwNDAsIDB4NjgwYSwgMHgxMDc4LAorCTB4MTlkMSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHgyMWQyLCAweDIwOTEsIDB4ODAwMSwgMHg3OGRiLAorCTB4MDAwMCwgMHg3OGQ3LCAweDAwMDAsIDB4MDA3YywgMHg2MDA4LCAweGE3MDUsIDB4NjAwYSwgMHgyMDkxLAorCTB4ODAwMCwgMHgxMDc4LCAweDFjNWYsIDB4MjA5MSwgMHg4MDAxLCAweDc4ZDgsIDB4YTA2NSwgMHgwMDQwLAorCTB4MjBhNywgMHg2MDljLCAweDc4ZGEsIDB4NjA5ZiwgMHgwMDAwLCAweDAwNzgsIDB4MjA5NywgMHg3OGQ3LAorCTB4MDAwMCwgMHg3OGRiLCAweDAwMDAsIDB4MDA3YywgMHg3OTkwLCAweDc4OTQsIDB4ODAwMCwgMHhhMTBhLAorCTB4MDBjOCwgMHgyMGIzLCAweGEwMDYsIDB4Nzg5NiwgMHg3MGQyLCAweDc4MDQsIDB4YTAwNSwgMHgwMDQwLAorCTB4MjBjMSwgMHg4MDAxLCAweDc4MDYsIDB4MDBjMCwgMHgyMGMxLCAweDAwNjgsIDB4MjBjMSwgMHgyMDkxLAorCTB4NDA4MCwgMHgwMDdjLCAweDIwMzksIDB4MjBkYSwgMHgwMDc4LCAweDIwYzgsIDB4MjAzOSwgMHgyMGUwLAorCTB4MjcwNCwgMHhhMDA1LCAweDAwNDAsIDB4MjBkOSwgMHhhYzAwLCAweDIwNjgsIDB4NmIwOCwgMHg2YzBjLAorCTB4NjkxMCwgMHg2YTE0LCAweDY5MGEsIDB4NmEwZSwgMHg2YjEyLCAweDZjMTYsIDB4ODczOCwgMHgwMDc4LAorCTB4MjBjOCwgMHgwMDdjLCAweDAwMDMsIDB4MDAwOSwgMHgwMDBmLCAweDAwMTUsIDB4MDAxYiwgMHgwMDAwLAorCTB4MDAxNSwgMHgwMDFiLCAweDAwMDAsIDB4MGM3ZSwgMHgxMDc4LCAweDNiNjksIDB4MmM2OCwgMHgwYzdmLAorCTB4MDA3YywgMHgwMDEwLCAweDIxNWEsIDB4MDA2OCwgMHgyMTVhLCAweDIwMjksIDB4MDAwMCwgMHg3OGNiLAorCTB4MDAwMCwgMHg3ODhjLCAweGEwNjUsIDB4MDA0MCwgMHgyMTUzLCAweDIwMDksIDB4NTE3NCwgMHgyMTA0LAorCTB4YTA4NCwgMHgwMDAxLCAweDAwNDAsIDB4MjEyMSwgMHg2MDA0LCAweGEwODYsIDB4MDEwMywgMHgwMGMwLAorCTB4MjEyMSwgMHg2MDE4LCAweGEwMDUsIDB4MDBjMCwgMHgyMTIxLCAweDYwMTQsIDB4YTAwNSwgMHgwMGMwLAorCTB4MjEyMSwgMHgwZDdlLCAweDIwNjksIDB4MDAwMCwgMHg2ODE4LCAweGEwODQsIDB4MDAwMSwgMHgwMGMwLAorCTB4MjEyMCwgMHg2MDBjLCAweDcwYzYsIDB4NjAxMCwgMHg3MGNhLCAweDcwYzMsIDB4ODAyMCwgMHg2ODFiLAorCTB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MGQ3ZiwgMHgxMDc4LCAweDFjODYsIDB4MDA3OCwgMHgyMTU4LAorCTB4MGQ3ZiwgMHgxMDc4LCAweDIxNWIsIDB4MDA0MCwgMHgyMTUzLCAweDYyMDQsIDB4YTI5NCwgMHgwMGZmLAorCTB4YTI5NiwgMHgwMDAzLCAweDAwNDAsIDB4MjEzMywgMHg2MjA0LCAweGEyOTYsIDB4MDExMCwgMHgwMGMwLAorCTB4MjE0MSwgMHg3OGNiLCAweDAwMDEsIDB4NjIwNCwgMHhhMjk0LCAweGZmMDAsIDB4ODIxNywgMHg4MjExLAorCTB4MDA0MCwgMHgyMTQxLCAweDg1ZmYsIDB4MDBjMCwgMHgyMTUzLCAweDgyMTAsIDB4YTIwMiwgMHgwMGM4LAorCTB4MjE1MywgMHgwNTdlLCAweDEwNzgsIDB4MjE2YSwgMHgwNTdmLCAweDAwNDAsIDB4MjE0ZSwgMHg3OGUwLAorCTB4YTA4NiwgMHgwMDAzLCAweDAwNDAsIDB4MjE1MywgMHgwMDc4LCAweDIxNDEsIDB4ODUyOCwgMHg3OGM4LAorCTB4YTAwNSwgMHgwMDQwLCAweDIwZjEsIDB4ODVmZiwgMHgwMDQwLCAweDIxNWEsIDB4MjA5MSwgMHg0MDgwLAorCTB4NzhiMCwgMHg3MGQ2LCAweDAwN2MsIDB4N2JhYywgMHg3OWIwLCAweDcwZDQsIDB4YTEwMiwgMHgwMGMwLAorCTB4MjE2NCwgMHgyMzAwLCAweGEwMDUsIDB4MDA3YywgMHgwMDQ4LCAweDIxNjgsIDB4YTMwMiwgMHgwMDdjLAorCTB4ODAwMiwgMHgwMDdjLCAweDIwMDEsIDB4MDRmZCwgMHgyMDA0LCAweGEwODIsIDB4MDAwNSwgMHgwMGM4LAorCTB4MjE4NCwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgwMDIwLCAweDcwMDQsIDB4YTAwNSwgMHgwMGMwLAorCTB4MjFiOSwgMHg3MDA4LCAweDcyMDgsIDB4YTIwNiwgMHgwMGMwLCAweDIxYjksIDB4YTI4NiwgMHgwMDA4LAorCTB4MDBjMCwgMHgyMWI5LCAweDIwNzEsIDB4MDAxMCwgMHgxMDc4LCAweDIxYmUsIDB4MjAwOSwgMHgwMDIwLAorCTB4NjAwNCwgMHhhMDg2LCAweDAxMDMsIDB4MDBjMCwgMHgyMTkzLCAweDYwMjgsIDB4YTAwNSwgMHgwMGMwLAorCTB4MjE5MywgMHgyMDA5LCAweDAwMGMsIDB4MTA3OCwgMHgxOTI0LCAweDAwNDAsIDB4MjFhYywgMHg3OGM0LAorCTB4ODAwMCwgMHg3OGM2LCAweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDIxYjksIDB4MjA5MSwgMHg4MDAwLAorCTB4NzhlMywgMHgwMDAzLCAweDc4YzcsIDB4MDAwMCwgMHg3OGNjLCAweGEwODUsIDB4MDMwMCwgMHg3OGNlLAorCTB4MjA5MSwgMHg4MDAxLCAweDAwNzgsIDB4MjFiOSwgMHg3OGM3LCAweDAwMDAsIDB4MTA3OCwgMHgxYzg2LAorCTB4NzlhYywgMHg3OGIwLCAweDgwMDAsIDB4YTEwYSwgMHgwMGM4LCAweDIxYjcsIDB4YTAwNiwgMHg3OGIyLAorCTB4YTAwNiwgMHgyMDcxLCAweDAwMTAsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4ODEwNywgMHg4MDA0LAorCTB4ODAwNCwgMHg3YWI4LCAweDdiYjQsIDB4N2NjMCwgMHg3ZGJjLCAweGEyMTAsIDB4YTM5OSwgMHgwMDAwLAorCTB4YTRhMSwgMHgwMDAwLCAweGE1YTksIDB4MDAwMCwgMHgwMDdjLCAweDIwMDksIDB4NTE1YiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDBhLCAweDBmN2UsIDB4MGU3ZSwgMHgyMDcxLCAweDUxNDAsIDB4NzAwMCwgMHhhMDg2LAorCTB4MDAwMCwgMHgwMGMwLCAweDIxZWMsIDB4MjAwOSwgMHg1MTEyLCAweDIxMDQsIDB4YTAwNSwgMHgwMGMwLAorCTB4MjFlYywgMHgyMDc5LCAweDAxMDAsIDB4NzgzMCwgMHhhMDg0LCAweDAwYzAsIDB4MDBjMCwgMHgyMWVjLAorCTB4MDAxOCwgMHgyMWVjLCAweDc4MWIsIDB4MDA0YiwgMHgwZTdmLCAweDBmN2YsIDB4MDA3YywgMHgwZjdlLAorCTB4MGU3ZSwgMHgyMDcxLCAweDUxNDAsIDB4MjA5MSwgMHg4MDAwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAwLAorCTB4MDBjMCwgMHgyMjA1LCAweDIwNzksIDB4MDEwMCwgMHg3ODMwLCAweGEwODQsIDB4MDBjMCwgMHgwMGMwLAorCTB4MjIwNSwgMHgwMDE4LCAweDIyMDUsIDB4NzgxYiwgMHgwMDRkLCAweDIwOTEsIDB4ODAwMSwgMHgwZTdmLAorCTB4MGY3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHgyMzAwLCAweDIwNzEsIDB4NTE0MCwgMHgyMDc5LAorCTB4MDEwMCwgMHg3ODRiLCAweDAwMGYsIDB4MDA5OCwgMHgyMjE4LCAweDc4MzgsIDB4MDA3OCwgMHgyMjExLAorCTB4MjBhOSwgMHgwMDQwLCAweDc4MDAsIDB4YTA4MiwgMHgwMDA0LCAweDAwNDgsIDB4MjIyMSwgMHgyMGE5LAorCTB4MDA2MCwgMHg3ODliLCAweDAwMDAsIDB4NzhhZiwgMHgwMDAwLCAweDc4YWYsIDB4MDAwMCwgMHgwMDcwLAorCTB4MjIyYiwgMHgwMDc4LCAweDIyMjMsIDB4NzgwMCwgMHhhMDgyLCAweDAwMDQsIDB4MDA0OCwgMHgyMjNhLAorCTB4NzBiNywgMHgwMDk2LCAweDIwMTksIDB4NGVlNywgMHgxMDc4LCAweDIyNzYsIDB4NzAyZiwgMHg4MDAxLAorCTB4MDA3OCwgMHgyMjQ2LCAweDcwYjcsIDB4MDAwMCwgMHgyMDE5LCAweDRkNWYsIDB4MTA3OCwgMHgyMjc2LAorCTB4MjAxOSwgMHg0ZDllLCAweDEwNzgsIDB4MjI3NiwgMHg3MDJmLCAweDgwMDAsIDB4NzAwMywgMHgwMDAwLAorCTB4MTA3OCwgMHgyMzdmLCAweDcwMDQsIDB4YTA4NCwgMHgwMDBmLCAweDAxN2UsIDB4MjAwOSwgMHgwNGZkLAorCTB4MjEwYywgMHhhMThhLCAweDAwMDUsIDB4MDA0OCwgMHgyMjViLCAweDAwMzgsIDB4MjI2MSwgMHhhMDg1LAorCTB4NjI4MCwgMHgwMDc4LCAweDIyNjMsIDB4MDAyOCwgMHgyMjYxLCAweGEwODUsIDB4NjI4MCwgMHgwMDc4LAorCTB4MjI2MywgMHhhMDg1LCAweDYyYzAsIDB4MDE3ZiwgMHg3ODA2LCAweDc4MGYsIDB4YjIwNCwgMHg3ODQzLAorCTB4MDBkOCwgMHg3ODUzLCAweDAwODAsIDB4NzgwYiwgMHgwMDA4LCAweDcwNDcsIDB4MDAwOCwgMHg3MDUzLAorCTB4NTE3ZiwgMHg3MDRmLCAweDAwMDAsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4MTM3ZSwgMHgxNDdlLAorCTB4MTU3ZSwgMHgwNDdlLCAweDIwYTEsIDB4MDEyYiwgMHgyMzA0LCAweGEwMDUsIDB4Nzg5YSwgMHgwMDQwLAorCTB4MjI5NiwgMHg4MzE4LCAweDIzMjQsIDB4ODMxOCwgMHgyMzk4LCAweDI0YTgsIDB4YTQ4NCwgMHhmZjAwLAorCTB4MDA0MCwgMHgyMjhlLCAweGE0ODIsIDB4MDEwMCwgMHgyMGE5LCAweDAxMDAsIDB4MjAyMCwgMHg1M2E2LAorCTB4YTAwNSwgMHgwMGMwLCAweDIyODUsIDB4MzMxOCwgMHgwMDc4LCAweDIyN2MsIDB4MDQ3ZiwgMHgxNTdmLAorCTB4MTQ3ZiwgMHgxMzdmLCAweDAwN2MsIDB4YTE4YywgMHgwMDBmLCAweDIwMTEsIDB4MDEwMSwgMHgyMjA0LAorCTB4YTA4NCwgMHhmZmYwLCAweGExMDUsIDB4MjAxMiwgMHgxMDc4LCAweDIzN2YsIDB4MDA3YywgMHgyMDExLAorCTB4MDEwMSwgMHgyMGE5LCAweDAwMDksIDB4ODEwYiwgMHgwMDcwLCAweDIyYjAsIDB4MDA3OCwgMHgyMmFiLAorCTB4YTE4YywgMHgwZTAwLCAweDIyMDQsIDB4YTA4NCwgMHhmMWZmLCAweGExMDUsIDB4MjAxMiwgMHgwMDdjLAorCTB4MjAwOSwgMHgwMTAxLCAweDIwYTksIDB4MDAwNSwgMHg4MjEzLCAweDAwNzAsIDB4MjJjMSwgMHgwMDc4LAorCTB4MjJiYywgMHhhMjk0LCAweDAwZTAsIDB4MjEwNCwgMHhhMDg0LCAweGZmMWYsIDB4YTIwNSwgMHgyMDBhLAorCTB4MDA3YywgMHgyMDExLCAweDAxMDEsIDB4MjBhOSwgMHgwMDBjLCAweDgxMGIsIDB4MDA3MCwgMHgyMmQyLAorCTB4MDA3OCwgMHgyMmNkLCAweGExOGMsIDB4ZjAwMCwgMHgyMjA0LCAweGEwODQsIDB4MGZmZiwgMHhhMTA1LAorCTB4MjAxMiwgMHgwMDdjLCAweDIwMTEsIDB4MDEwMiwgMHgyMjA0LCAweGEwODQsIDB4ZmZjZiwgMHhhMTA1LAorCTB4MjAxMiwgMHgwMDdjLCAweDgxMDMsIDB4ODAwMywgMHhhMDgwLCAweDAwMjAsIDB4MGM3ZSwgMHgyMDYxLAorCTB4MDEwMCwgMHg2MDlhLCAweDYyYWMsIDB4NjNhYywgMHgwYzdmLCAweDAwN2MsIDB4ODEwMywgMHg4MDAzLAorCTB4YTA4MCwgMHgwMDIyLCAweDBjN2UsIDB4MjA2MSwgMHgwMTAwLCAweDYwOWEsIDB4NjBhNCwgMHhhMDg0LAorCTB4ZmZkZiwgMHg2MGFlLCAweDBjN2YsIDB4MDA3YywgMHg4MTAzLCAweDgwMDMsIDB4YTA4MCwgMHgwMDIyLAorCTB4MGM3ZSwgMHgyMDYxLCAweDAxMDAsIDB4NjA5YSwgMHg2MGE0LCAweGEwODUsIDB4MDAyMCwgMHg2MGFlLAorCTB4MGM3ZiwgMHgwMDdjLCAweDgxMDMsIDB4ODAwMywgMHhhMDgwLCAweDAwMjAsIDB4MGM3ZSwgMHgyMDYxLAorCTB4MDEwMCwgMHg2MDlhLCAweDYwYTQsIDB4NjJhZSwgMHgyMDEwLCAweDYwYTQsIDB4NjNhZSwgMHgyMDE4LAorCTB4MGM3ZiwgMHgwMDdjLCAweDIwOTEsIDB4ODAwMCwgMHgwYzdlLCAweDBlN2UsIDB4NjgxOCwgMHhhMDA1LAorCTB4MDA0MCwgMHgyMzVkLCAweDIwNjEsIDB4NzUwMCwgMHgxMDc4LCAweDIzNjUsIDB4MDA0MCwgMHgyMzQ5LAorCTB4MjBhOSwgMHgwMDAwLCAweDIwNjEsIDB4NzQwMCwgMHgwYzdlLCAweDEwNzgsIDB4MjM2NSwgMHgwMDQwLAorCTB4MjMzOSwgMHgwYzdmLCAweDhjNjAsIDB4MDA3MCwgMHgyMzM3LCAweDAwNzgsIDB4MjMyYywgMHgwMDc4LAorCTB4MjM1ZCwgMHgwMDdmLCAweGEwODIsIDB4NzQwMCwgMHgyMDcxLCAweDUxNDAsIDB4NzA4NiwgMHg3MTgyLAorCTB4MjAwMSwgMHgwMDA0LCAweDcwNmUsIDB4NzA5MywgMHgwMDBmLCAweDEwNzgsIDB4MjFjZCwgMHgwMDc4LAorCTB4MjM1OSwgMHg2MGMwLCAweGEwMDUsIDB4MDBjMCwgMHgyMzVkLCAweDIwNzEsIDB4NTE0MCwgMHg3MTgyLAorCTB4MmMwMCwgMHg3MDhhLCAweDIwMDEsIDB4MDAwNiwgMHg3MDZlLCAweDcwOTMsIDB4MDAwZiwgMHgxMDc4LAorCTB4MjFjZCwgMHgyMDAxLCAweDAwMDAsIDB4MDA3OCwgMHgyMzVmLCAweDIwMDEsIDB4MDAwMSwgMHgyMDkxLAorCTB4ODAwMSwgMHhhMDA1LCAweDBlN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDJjMDQsIDB4YTAwNSwgMHgwMDQwLAorCTB4MjM3YywgMHgyMDYwLCAweDYwMGMsIDB4YTMwNiwgMHgwMGMwLCAweDIzNzksIDB4NjAxMCwgMHhhMjA2LAorCTB4MDBjMCwgMHgyMzc5LCAweDYwMTQsIDB4YTEwNiwgMHgwMGMwLCAweDIzNzksIDB4YTAwNiwgMHgwMDc4LAorCTB4MjM3ZSwgMHg2MDAwLCAweDAwNzgsIDB4MjM2NiwgMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHgyMDExLAorCTB4NTE0MSwgMHgyMjBjLCAweGExOGMsIDB4MDAwZiwgMHgyMDExLCAweDAxM2IsIDB4MjIwNCwgMHhhMDg0LAorCTB4MDEwMCwgMHgwMDQwLCAweDIzOTUsIDB4MjAyMSwgMHhmZjA0LCAweDIxMjIsIDB4ODEwYiwgMHg4MTBiLAorCTB4ODEwYiwgMHg4MTBiLCAweGExOGQsIDB4MGYwMCwgMHgyMTA0LCAweDAwN2MsIDB4MGU3ZSwgMHg2OGU0LAorCTB4YTA4YywgMHgwMDIwLCAweDAwNDAsIDB4MjNlOSwgMHhhMDg0LCAweDAwMDYsIDB4MDBjMCwgMHgyM2U5LAorCTB4NjAxNCwgMHg4MDA3LCAweGEwODQsIDB4MDAwZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMGYwLAorCTB4NTM4MCwgMHg3MDA0LCAweGEwODQsIDB4MDAwYSwgMHgwMGMwLCAweDIzZTksIDB4NzEwOCwgMHhhMTk0LAorCTB4ZmYwMCwgMHgwMDQwLCAweDIzZTksIDB4YTE4YywgMHgwMGZmLCAweDIwMDEsIDB4MDAwYywgMHhhMTA2LAorCTB4MDA0MCwgMHgyM2QwLCAweDIwMDEsIDB4MDAxMiwgMHhhMTA2LCAweDAwNDAsIDB4MjNkNCwgMHgyMDAxLAorCTB4MDAxNCwgMHhhMTA2LCAweDAwNDAsIDB4MjNkOCwgMHgyMDAxLCAweDAwMTksIDB4YTEwNiwgMHgwMDQwLAorCTB4MjNkYywgMHgyMDAxLCAweDAwMzIsIDB4YTEwNiwgMHgwMDQwLCAweDIzZTAsIDB4MDA3OCwgMHgyM2U0LAorCTB4MjAwOSwgMHgwMDEyLCAweDAwNzgsIDB4MjNlNiwgMHgyMDA5LCAweDAwMTQsIDB4MDA3OCwgMHgyM2U2LAorCTB4MjAwOSwgMHgwMDE5LCAweDAwNzgsIDB4MjNlNiwgMHgyMDA5LCAweDAwMjAsIDB4MDA3OCwgMHgyM2U2LAorCTB4MjAwOSwgMHgwMDNmLCAweDAwNzgsIDB4MjNlNiwgMHgyMDExLCAweDAwMDAsIDB4MjEwMCwgMHhhMjA1LAorCTB4NzAwYSwgMHgwZTdmLCAweDAwN2MsIDB4MDA2OCwgMHgyM2ViLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLAorCTB4MDAwMCwgMHgwMDdlLCAweDcwMTgsIDB4YTA4NCwgMHgwMDAxLCAweDAwYzAsIDB4MjNmMiwgMHgwMDdmLAorCTB4MjA3MSwgMHgwMDEwLCAweDcwY2EsIDB4MDA3ZiwgMHg3MGM2LCAweDcwYzMsIDB4ODAwMiwgMHg3MGRiLAorCTB4MDc0MSwgMHg3MGRmLCAweDAwMDAsIDB4MjA3MSwgMHgwMDAwLCAweDcwMWIsIDB4MDAwMSwgMHgyMDkxLAorCTB4NDA4MCwgMHgwMDc4LCAweDI0MDksIDB4MTA3ZSwgMHgwMDdlLCAweDEyN2UsIDB4MjA5MSwgMHgyMzAwLAorCTB4N2YzYywgMHg3ZTU4LCAweDdjMzAsIDB4N2QzOCwgMHg3N2MyLCAweDc0YzYsIDB4NzZjYSwgMHg3NWNlLAorCTB4YTU5NCwgMHgwMDNmLCAweGE0OWMsIDB4MDAwMywgMHhhNDg0LCAweDAwMGYsIDB4MDA3OSwgMHgyNDIwLAorCTB4MjQzMiwgMHgyNDMyLCAweDI0MzIsIDB4Mjc2YywgMHgzOTNiLCAweDI0MzAsIDB4MjQ2MSwgMHgyNDZiLAorCTB4MjQzMCwgMHgyNDMwLCAweDI0MzAsIDB4MjQzMCwgMHgyNDMwLCAweDI0MzAsIDB4MjQzMCwgMHgyNDMwLAorCTB4MTA3OCwgMHgyM2ViLCAweDg1MDcsIDB4YTA4NCwgMHgwMDFmLCAweDAwNzksIDB4MjQzNywgMHgyNDc1LAorCTB4Mjc2YywgMHgyOTI2LCAweDJhMjMsIDB4MmE0YiwgMHgyY2VkLCAweDJmOTgsIDB4MmZkYiwgMHgzMDI2LAorCTB4MzBhYiwgMHgzMTYzLCAweDMyMGMsIDB4MjQ2MSwgMHgyODQ4LCAweDJmNmQsIDB4MjQ1NywgMHgzY2M4LAorCTB4M2NlOCwgMHgzZWFlLCAweDNlYmEsIDB4M2Y4ZiwgMHgyNDU3LCAweDI0NTcsIDB4NDA2MiwgMHg0MDY2LAorCTB4M2NjNiwgMHgyNDU3LCAweDNlMTksIDB4MjQ1NywgMHgzYjhjLCAweDI0NmIsIDB4MjQ1NywgMHgxMDc4LAorCTB4MjNlYiwgMHgwMDE4LCAweDI0MTAsIDB4MTI3ZiwgMHgyMDkxLCAweDgwMDEsIDB4MDA3ZiwgMHgxMDdmLAorCTB4MDA3YywgMHgyMDE5LCAweDRlM2IsIDB4MTA3OCwgMHgyMjc2LCAweDcwMmYsIDB4MDAwMSwgMHg3ODFiLAorCTB4MDA0ZiwgMHgwMDc4LCAweDI0NTksIDB4MjAxOSwgMHg0ZDllLCAweDEwNzgsIDB4MjI3NiwgMHg3MDJmLAorCTB4ODAwMCwgMHg3ODFiLCAweDAwZDAsIDB4MDA3OCwgMHgyNDU5LCAweDcyNDIsIDB4MjAwOSwgMHg1MTBmLAorCTB4MjAwYiwgMHgwMDAwLCAweGE1ODQsIDB4MDAwMSwgMHgwMGMwLCAweDNiYTAsIDB4MDA0MCwgMHgyNDkyLAorCTB4MTA3OCwgMHgyM2ViLCAweDcwMDMsIDB4MDAwMCwgMHg3MDRiLCAweDAwMDAsIDB4NzA0MywgMHgwMDAwLAorCTB4NzAzNywgMHgwMDAwLCAweDEwNzgsIDB4MzkxMiwgMHgwMDE4LCAweDI0MTAsIDB4MjAwOSwgMHg1MTBmLAorCTB4MjAwYiwgMHgwMDAwLCAweDcwNjgsIDB4YTAwNSwgMHgwMGMwLCAweDI1NWQsIDB4NzA2YywgMHhhMDg0LAorCTB4MDAwNywgMHgwMDc5LCAweDI0OWIsIDB4MjU5NCwgMHgyNGEzLCAweDI0YWYsIDB4MjRjYywgMHgyNGVlLAorCTB4MjUzYiwgMHgyNTE0LCAweDI0YTMsIDB4MTA3OCwgMHgzOGZhLCAweDIwMDksIDB4MDA0OCwgMHgxMDc4LAorCTB4MmUzOSwgMHgwMGMwLCAweDI0YWQsIDB4NzAwMywgMHgwMDA0LCAweDAwNzgsIDB4MjQ1OSwgMHgxMDc4LAorCTB4MzhmYSwgMHgwMGMwLCAweDI0Y2EsIDB4NzA4MCwgMHg4MDA3LCAweDc4ODIsIDB4Nzg5YiwgMHgwMDEwLAorCTB4NzhhYiwgMHgwMDBjLCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLCAweDAwMDEsIDB4Nzg1YiwgMHgwMDA0LAorCTB4MjAwOSwgMHgwMGUwLCAweDEwNzgsIDB4MmUyZCwgMHgwMGMwLCAweDI0Y2EsIDB4NzAwMywgMHgwMDA0LAorCTB4NzA5MywgMHgwMDBmLCAweDAwNzgsIDB4MjQ1OSwgMHgxMDc4LCAweDM4ZmEsIDB4MDBjMCwgMHgyNGVjLAorCTB4NzE4MCwgMHg4MTA3LCAweDc4ODIsIDB4Nzg5YiwgMHgwMDEwLCAweGExOGMsIDB4MDAxZiwgMHhhMThkLAorCTB4MDBjMCwgMHg3OWFhLCAweDc4YWIsIDB4MDAwNiwgMHg3ODliLCAweDAwNjAsIDB4NzhhYiwgMHgwMDAyLAorCTB4Nzg1YiwgMHgwMDA0LCAweDIwMDksIDB4MDBlMCwgMHgxMDc4LCAweDJlMmQsIDB4MDBjMCwgMHgyNGVjLAorCTB4NzAwMywgMHgwMDA0LCAweDcwOTMsIDB4MDAwZiwgMHgwMDc4LCAweDI0NTksIDB4MTA3OCwgMHgzOGZhLAorCTB4MDBjMCwgMHgyNTEyLCAweDcxODAsIDB4ODEwNywgMHg3ODgyLCAweDc4OWIsIDB4MDAxMCwgMHhhMThjLAorCTB4MDAxZiwgMHhhMThkLCAweDAwYzAsIDB4NzlhYSwgMHg3OGFiLCAweDAwMjAsIDB4NzE4NCwgMHg3OWFhLAorCTB4NzhhYiwgMHgwMDBkLCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLCAweDAwMDQsIDB4Nzg1YiwgMHgwMDA0LAorCTB4MjAwOSwgMHgwMGUwLCAweDEwNzgsIDB4MmUyZCwgMHgwMGMwLCAweDI1MTIsIDB4NzAwMywgMHgwMDA0LAorCTB4NzA5MywgMHgwMDBmLCAweDAwNzgsIDB4MjQ1OSwgMHgxMDc4LCAweDM4ZmEsIDB4MDBjMCwgMHgyNTM5LAorCTB4NzE4MCwgMHg4MTA3LCAweDc4ODIsIDB4Nzg5YiwgMHgwMDEwLCAweGExOGMsIDB4MDAxZiwgMHhhMThkLAorCTB4MDBjMCwgMHg3OWFhLCAweDc4YWIsIDB4MDAwNiwgMHg3ODliLCAweDAwNjAsIDB4NzhhYiwgMHgwMDAyLAorCTB4Nzg1YiwgMHgwMDA0LCAweDIwMDksIDB4MDBlMCwgMHgxMDc4LCAweDJlMmQsIDB4MDBjMCwgMHgyNTM5LAorCTB4NzA4OCwgMHg3MDhiLCAweDAwMDAsIDB4MjA2OCwgMHg3MDRhLCAweDcwMDMsIDB4MDAwMiwgMHg3MDkzLAorCTB4MDAwZiwgMHgwMDc4LCAweDI0NTksIDB4MTA3OCwgMHgzOGZhLCAweDAwYzAsIDB4MjQ1OSwgMHg3MDg4LAorCTB4MjA2OCwgMHg2ZjE0LCAweDEwNzgsIDB4MzdlZiwgMHgyYzUwLCAweDEwNzgsIDB4MzlhYywgMHg3ODliLAorCTB4MDAxMCwgMHg2ODE0LCAweGEwODQsIDB4MDAxZiwgMHhhMDg1LCAweDAwODAsIDB4NzhhYSwgMHg2ZTFjLAorCTB4MjA0MSwgMHgwMDAxLCAweDcwOGMsIDB4YTA4NCwgMHgwNDAwLCAweDIwMDEsIDB4MDAwNCwgMHgwMDQwLAorCTB4MjU1YiwgMHgyMDAxLCAweDAwMDYsIDB4MDA3OCwgMHgyNjdjLCAweDEwNzgsIDB4MzhmYSwgMHgwMGMwLAorCTB4MjQ1OSwgMHg3ODliLCAweDAwMTAsIDB4NzA2OCwgMHgyMDY4LCAweDZmMTQsIDB4MTA3OCwgMHgzN2VmLAorCTB4MmM1MCwgMHgxMDc4LCAweDM5YWMsIDB4NjAwOCwgMHhhMDg1LCAweDAwMTAsIDB4NjAwYSwgMHg2ODI0LAorCTB4YTAwNSwgMHgwMDQwLCAweDI1N2IsIDB4YTA4MiwgMHgwMDA2LCAweDAwNDgsIDB4MjU3OSwgMHgwMDc4LAorCTB4MjU3YiwgMHg2ODI3LCAweDAwMDUsIDB4NmIxNCwgMHhhMzljLCAweDAwMWYsIDB4YTM5ZCwgMHgwMGMwLAorCTB4NzA1OCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyNTg5LCAweGE2ODQsIDB4MDAwMSwgMHgwMDQwLAorCTB4MjU4YiwgMHhhMzljLCAweGZmYmYsIDB4N2JhYSwgMHgyMDMxLCAweDAwMjAsIDB4MjA0MSwgMHgwMDAxLAorCTB4MjAwMSwgMHgwMDAzLCAweDAwNzgsIDB4MjY3YywgMHgwMDE4LCAweDI0MTAsIDB4NzQ0YywgMHhhNDg1LAorCTB4MDAwMCwgMHgwMDQwLCAweDI1YWUsIDB4YTA4MCwgMHg1MTgwLCAweDIwMzAsIDB4NzE1MCwgMHg4MTA4LAorCTB4YTEyYSwgMHgwMDQ4LCAweDI1YTUsIDB4MjAwOSwgMHg1MTgwLCAweDIxNjQsIDB4NjUwNCwgMHg4NWZmLAorCTB4MDBjMCwgMHgyNWJmLCAweDg0MjEsIDB4MDBjMCwgMHgyNTlmLCAweDcxNTIsIDB4NzAwMywgMHgwMDAwLAorCTB4NzA0YiwgMHgwMDAwLCAweDcwNDAsIDB4YTAwNSwgMHgwMDQwLCAweDNiYTAsIDB4MDA3OCwgMHgyNDU5LAorCTB4NzY0YywgMHhhNmIwLCAweDUxODAsIDB4NzE1MCwgMHgyNjAwLCAweDAwNzgsIDB4MjVhYSwgMHg3MTUyLAorCTB4MjU2OCwgMHgyNTU4LCAweDc1NGEsIDB4MmM1MCwgMHg2MDM0LCAweGEwODUsIDB4MDAwMCwgMHgwMGMwLAorCTB4MjViYywgMHg2NzA4LCAweDc3M2EsIDB4YTc4NCwgMHgwMzNmLCAweDAwNDAsIDB4MjVmNSwgMHhhNzg0LAorCTB4MDAyMSwgMHgwMGMwLCAweDI1YmMsIDB4YTc4NCwgMHgwMDAyLCAweDAwNDAsIDB4MjVkZSwgMHhhNzg0LAorCTB4MDAwNCwgMHgwMDQwLCAweDI1YmMsIDB4YTdiYywgMHhmZmZiLCAweDY3MGEsIDB4YTc4NCwgMHgwMDA4LAorCTB4MDBjMCwgMHgyNWJjLCAweGE3ODQsIDB4MDAxMCwgMHgwMGMwLCAweDI1YmMsIDB4YTc4NCwgMHgwMjAwLAorCTB4MDBjMCwgMHgyNWJjLCAweGE3ODQsIDB4MDEwMCwgMHgwMDQwLCAweDI1ZjUsIDB4NjAxOCwgMHhhMDA1LAorCTB4MDBjMCwgMHgyNWJjLCAweGE3YmMsIDB4ZmVmZiwgMHg2NzBhLCAweDY4MjMsIDB4MDAwMCwgMHg2ZTFjLAorCTB4YTY4NCwgMHgwMDBlLCAweDYxMTgsIDB4MDA0MCwgMHgyNjA1LCAweDYwMWMsIDB4YTEwMiwgMHgwMDQ4LAorCTB4MjYwOCwgMHgwMDQwLCAweDI2MDgsIDB4MDA3OCwgMHgyNWI4LCAweDgxZmYsIDB4MDBjMCwgMHgyNWI4LAorCTB4NjhjMywgMHgwMDAwLCAweGE3ODQsIDB4MDA4MCwgMHgwMGMwLCAweDI2MTAsIDB4NzAwYywgMHg2MDIyLAorCTB4YTdiYywgMHhmZjdmLCAweDY3MGEsIDB4MTA3OCwgMHgzOWFjLCAweDAwMTgsIDB4MjQxMCwgMHg3ODliLAorCTB4MDAxMCwgMHhhMDQ2LCAweDEwNzgsIDB4MzhmYSwgMHgwMGMwLCAweDI0NTksIDB4NmIxNCwgMHhhMzljLAorCTB4MDAxZiwgMHhhMzlkLCAweDAwYzAsIDB4NzA1OCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyNjJjLAorCTB4YTY4NCwgMHgwMDAxLCAweDAwNDAsIDB4MjYyZSwgMHhhMzljLCAweGZmYmYsIDB4YTY4NCwgMHgwMDEwLAorCTB4MDA0MCwgMHgyNjM0LCAweGEzOWQsIDB4MDAyMCwgMHg3YmFhLCAweDg4NDAsIDB4YTY4NCwgMHgwMDBlLAorCTB4MDBjMCwgMHgyNjNmLCAweGE3YmQsIDB4MDAxMCwgMHg2NzBhLCAweDAwNzgsIDB4MjY3YSwgMHg3MTU4LAorCTB4YTE4YywgMHgwODAwLCAweDAwNDAsIDB4MzQwMSwgMHgyMDExLCAweDAwMjAsIDB4YTY4NCwgMHgwMDA4LAorCTB4MDBjMCwgMHgyNjUwLCAweDgyMTAsIDB4YTY4NCwgMHgwMDAyLCAweDAwYzAsIDB4MjY1MCwgMHg4MjEwLAorCTB4N2FhYSwgMHg4ODQwLCAweDEwNzgsIDB4MzkxMiwgMHg2YTE0LCAweDYxMGMsIDB4ODEwOCwgMHhhMThjLAorCTB4MDBmZiwgMHhhMWUwLCAweDc0MDAsIDB4MmM2NCwgMHg4Y2ZmLCAweDAwNDAsIDB4MjY3MSwgMHg2MDE0LAorCTB4YTIwNiwgMHgwMGMwLCAweDI2NWIsIDB4NjBiOCwgMHg4MDAxLCAweDYwYmEsIDB4MDBjMCwgMHgyNjU2LAorCTB4MGM3ZSwgMHgyYTYwLCAweDYwMDgsIDB4YTA4NSwgMHgwMTAwLCAweDYwMGEsIDB4MGM3ZiwgMHgwMDc4LAorCTB4MjU5NCwgMHgxMDc4LCAweDM4ZmEsIDB4MDBjMCwgMHgyNDU5LCAweDJhNjAsIDB4NjEwZSwgMHg3OWFhLAorCTB4ODg0MCwgMHg3MTMyLCAweDIwMDEsIDB4MDAwMSwgMHgwMDdlLCAweDcxNWMsIDB4YTE4NCwgMHgwMDE4LAorCTB4MDA0MCwgMHgyNjk3LCAweGExODQsIDB4MDAxMCwgMHgwMDQwLCAweDI2OGEsIDB4MTA3OCwgMHgzNjA0LAorCTB4MDBjMCwgMHgyNmJhLCAweGExODQsIDB4MDAwOCwgMHgwMDQwLCAweDI2OTcsIDB4NjlhMCwgMHhhMTg0LAorCTB4MDYwMCwgMHgwMGMwLCAweDI2OTcsIDB4MTA3OCwgMHgzNGYxLCAweDAwNzgsIDB4MjZiYSwgMHg2OWEwLAorCTB4YTE4NCwgMHgwODAwLCAweDAwNDAsIDB4MjZhZSwgMHgwYzdlLCAweDAyN2UsIDB4Mjk2MCwgMHg2MDAwLAorCTB4YTA4NSwgMHgyMDAwLCAweDYwMDIsIDB4NjEwNCwgMHhhMThkLCAweDAwMTAsIDB4NjEwNiwgMHgwMjdmLAorCTB4MGM3ZiwgMHgxMDc4LCAweDM2MDQsIDB4MDBjMCwgMHgyNmJhLCAweDY5YTAsIDB4YTE4NCwgMHgwMjAwLAorCTB4MDA0MCwgMHgyNmI2LCAweDEwNzgsIDB4MzU0MCwgMHgwMDc4LCAweDI2YmEsIDB4YTE4NCwgMHgwNDAwLAorCTB4MDBjMCwgMHgyNjkzLCAweDY5YTAsIDB4YTE4NCwgMHgxMDAwLCAweDAwNDAsIDB4MjZjNSwgMHg2OTE0LAorCTB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MTA3OCwgMHgyMmVlLCAweDAwN2YsIDB4NzAwMiwgMHhhNjhjLAorCTB4MDBlMCwgMHhhNjg0LCAweDAwNjAsIDB4MDA0MCwgMHgyNmQzLCAweGEwODYsIDB4MDA2MCwgMHgwMGMwLAorCTB4MjZkMywgMHhhMThkLCAweDQwMDAsIDB4ODhmZiwgMHgwMDQwLCAweDI2ZDgsIDB4YTE4ZCwgMHgwMDA0LAorCTB4Nzk1YSwgMHg2OWI2LCAweDc4OWIsIDB4MDA2MCwgMHgyODAwLCAweDc4YWEsIDB4Nzg5YiwgMHgwMDYxLAorCTB4NjgxOCwgMHhhMDhkLCAweDgwMDAsIDB4YTA4NCwgMHg3ZmZmLCAweDY5MWEsIDB4YTY4YywgMHgwMDgwLAorCTB4MDA0MCwgMHgyNmY3LCAweDcwOTcsIDB4MDAwMCwgMHhhMDhhLCAweDAwMGQsIDB4MDA1MCwgMHgyNmY1LAorCTB4YTA4YSwgMHgwMDBjLCAweDcxOTYsIDB4MjAwMSwgMHgwMDBjLCAweDgwMGMsIDB4NzE5YSwgMHg3OGFhLAorCTB4ODAwOCwgMHg4MTBjLCAweDAwNDAsIDB4MzQwNywgMHhhMThjLCAweDAwZjgsIDB4MDBjMCwgMHgzNDA3LAorCTB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4MjBhMSwgMHgwMTJiLCAweDc4OWIsIDB4MDAwMCwgMHg4MDAwLAorCTB4ODBhYywgMHhhZDgwLCAweDAwMGIsIDB4MjA5OCwgMHg1M2E2LCAweDE0N2YsIDB4MTM3ZiwgMHgxNTdmLAorCTB4NjgxNCwgMHg4MDA3LCAweDc4ODIsIDB4NmQ5NCwgMHg3ZGQ2LCAweDdkZGUsIDB4NmU5OCwgMHg3ZWQyLAorCTB4N2VkYSwgMHgxMDc4LCAweDM4ZmEsIDB4MDBjMCwgMHgyNzJlLCAweDcwMmMsIDB4ODAwMywgMHgwMDQ4LAorCTB4MjcyNywgMHgyMDE5LCAweDRkOWUsIDB4MTA3OCwgMHgyMjc2LCAweDcwMmYsIDB4ODAwMCwgMHg3ODMwLAorCTB4YTA4NCwgMHgwMGMwLCAweDAwYzAsIDB4MjcyZSwgMHgwMDk4LCAweDI3MzYsIDB4NjAwOCwgMHhhMDg0LAorCTB4ZmZlZiwgMHg2MDBhLCAweDEwNzgsIDB4MzkxMiwgMHgwMDc4LCAweDI0ODIsIDB4NzIwMCwgMHhhMjg0LAorCTB4MDAwNywgMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHgyNzQzLCAweDc4MWIsIDB4MDA0ZiwgMHgxMDc4LAorCTB4MzkxMiwgMHgwMDc4LCAweDI3NTQsIDB4NmFiNCwgMHhhMjk1LCAweDIwMDAsIDB4N2E1YSwgMHg3ODFiLAorCTB4MDA0ZiwgMHgxMDc4LCAweDM5MTIsIDB4NzIwMCwgMHgyNTAwLCAweGE2MDUsIDB4MDA0MCwgMHgyNzU0LAorCTB4YTI4NCwgMHgwMDA3LCAweDEwNzksIDB4Mjc2MiwgMHhhZDgwLCAweDAwMDksIDB4NzAzNiwgMHhhMjg0LAorCTB4MDAwNywgMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHgyNDU5LCAweDYwMTgsIDB4ODAwMCwgMHg2MDFhLAorCTB4MDA3OCwgMHgyNDU5LCAweDI3NmEsIDB4NGEzYSwgMHg0YTNhLCAweDRhMjksIDB4NGEzYSwgMHgyNzZhLAorCTB4NGEyOSwgMHgyNzZhLCAweDEwNzgsIDB4MjNlYiwgMHgxMDc4LCAweDM4ZmEsIDB4MGY3ZSwgMHgyMDc5LAorCTB4NTEwMCwgMHg3OGNjLCAweDBmN2YsIDB4YTA4NCwgMHgwMDAxLCAweDAwNDAsIDB4Mjc5MCwgMHg3MDZjLAorCTB4YTA4NiwgMHgwMDAxLCAweDAwYzAsIDB4Mjc3ZiwgMHg3MDZlLCAweDAwNzgsIDB4MjgyMywgMHg3MDZjLAorCTB4YTA4NiwgMHgwMDA1LCAweDAwYzAsIDB4Mjc4ZSwgMHg3MDg4LCAweDIwNjgsIDB4NjgxYiwgMHgwMDA0LAorCTB4NjgxNywgMHgwMDAwLCAweDY4MjAsIDB4YTA4NSwgMHgwMDA4LCAweDY4MjIsIDB4NzA2ZiwgMHgwMDAwLAorCTB4MjAxMSwgMHgwMDA0LCAweDcxNmMsIDB4YTE4NiwgMHgwMDAxLCAweDAwNDAsIDB4MjdiMSwgMHhhMTg2LAorCTB4MDAwNywgMHgwMGMwLCAweDI3YTEsIDB4MjAwOSwgMHg1MTM4LCAweDIwMGIsIDB4MDAwNSwgMHgwMDc4LAorCTB4MjdiMSwgMHgyMDA5LCAweDUxMTMsIDB4MjEwNCwgMHgyMDA5LCAweDUxMTIsIDB4MjAwYSwgMHgyMDA5LAorCTB4NTEzOCwgMHgyMDBiLCAweDAwMDEsIDB4NzA2ZiwgMHgwMDAwLCAweDcwNzMsIDB4MDAwMSwgMHgwMDc4LAorCTB4MjdiMywgMHg3MDZmLCAweDAwMDAsIDB4MTA3OCwgMHg0Nzc2LCAweDE1N2UsIDB4MjBhOSwgMHgwMDEwLAorCTB4MjAzOSwgMHgwMDAwLCAweDEwNzgsIDB4MzZlMiwgMHhhN2I4LCAweDAxMDAsIDB4MDA3MCwgMHgyN2MyLAorCTB4MDA3OCwgMHgyN2JhLCAweDE1N2YsIDB4NzAwMCwgMHgwMDc5LCAweDI3YzYsIDB4MjdmNCwgMHgyN2RiLAorCTB4MjdkYiwgMHgyN2NlLCAweDI3ZjQsIDB4MjdmNCwgMHgyN2Y0LCAweDI3ZjQsIDB4MjAyMSwgMHg1MTVhLAorCTB4MjQwNCwgMHhhMDA1LCAweDAwNDAsIDB4MjdmNCwgMHhhZDA2LCAweDAwYzAsIDB4MjdkYiwgMHg2ODAwLAorCTB4MjAyMiwgMHgwMDc4LCAweDI3ZWIsIDB4NjgyMCwgMHhhMDg0LCAweDAwMDEsIDB4MDBjMCwgMHgyN2U3LAorCTB4NmYxNCwgMHgxMDc4LCAweDM3ZWYsIDB4MTA3OCwgMHgzM2Q4LCAweDAwNzgsIDB4MjdlYiwgMHg3MDYwLAorCTB4MjA2MCwgMHg2ODAwLCAweDYwMDIsIDB4NmExYSwgMHg2ODE3LCAweDAwMDAsIDB4NjgyMCwgMHhhMDg1LAorCTB4MDAwOCwgMHg2ODIyLCAweDEwNzgsIDB4MWM3MCwgMHgyMDIxLCAweDc1MDAsIDB4MTA3OCwgMHgyODMwLAorCTB4MjAyMSwgMHg1MTVhLCAweDEwNzgsIDB4MjgzMCwgMHgxNTdlLCAweDIwYTksIDB4MDAwMCwgMHgyMDIxLAorCTB4NzQwMCwgMHgxMDc4LCAweDI4MzAsIDB4ODQyMCwgMHgwMDcwLCAweDI4MDgsIDB4MDA3OCwgMHgyODAxLAorCTB4MjA2MSwgMHg1NDAwLCAweDIwMjEsIDB4MDAwMiwgMHgyMGE5LCAweDAxMDAsIDB4NjAxOCwgMHg2MTEwLAorCTB4ODFmZiwgMHgwMDQwLCAweDI4MTcsIDB4YTEwMiwgMHgwMDUwLCAweDI4MTcsIDB4NjAxMiwgMHg2MDFiLAorCTB4MDAwMCwgMHhhY2UwLCAweDAwMTAsIDB4MDA3MCwgMHgyODFmLCAweDAwNzgsIDB4MjgwZSwgMHg4NDIxLAorCTB4MDBjMCwgMHgyODBjLCAweDE1N2YsIDB4NzA5YywgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyODJhLAorCTB4MTA3OCwgMHgzYTAwLCAweDcwMDMsIDB4MDAwMCwgMHg3MDRiLCAweDAwMDAsIDB4MDA3OCwgMHgyNDU5LAorCTB4MDQ3ZSwgMHgyNDA0LCAweGEwMDUsIDB4MDA0MCwgMHgyODQ0LCAweDIwNjgsIDB4NjgwMCwgMHgwMDdlLAorCTB4NmExYSwgMHg2ODE3LCAweDAwMDAsIDB4NjgyMCwgMHhhMDg1LCAweDAwMDgsIDB4NjgyMiwgMHgxMDc4LAorCTB4MWM3MCwgMHgwMDdmLCAweDAwNzgsIDB4MjgzMiwgMHgwNDdmLCAweDIwMjMsIDB4MDAwMCwgMHgwMDdjLAorCTB4YTI4MiwgMHgwMDAzLCAweDAwNTAsIDB4Mjg0ZSwgMHgxMDc4LCAweDIzZWIsIDB4MjMwMCwgMHgwMDc5LAorCTB4Mjg1MSwgMHgyODU0LCAweDI4YzcsIDB4MjhlNCwgMHhhMjgyLCAweDAwMDIsIDB4MDA0MCwgMHgyODVhLAorCTB4MTA3OCwgMHgyM2ViLCAweDcwNmMsIDB4NzA2ZiwgMHgwMDAwLCAweDcwOTMsIDB4MDAwMCwgMHgwMDc5LAorCTB4Mjg2MSwgMHgyODY5LCAweDI4NjksIDB4Mjg2YiwgMHgyODlmLCAweDM0MGQsIDB4Mjg2OSwgMHgyODlmLAorCTB4Mjg2OSwgMHgxMDc4LCAweDIzZWIsIDB4Nzc4MCwgMHgxMDc4LCAweDM2ZTIsIDB4Nzc4MCwgMHhhN2JjLAorCTB4MGYwMCwgMHgxMDc4LCAweDM3ZWYsIDB4NjAxOCwgMHhhMDA1LCAweDAwNDAsIDB4Mjg5NiwgMHgyMDIxLAorCTB4NzUwMCwgMHgyMDA5LCAweDAwMDQsIDB4MjAxMSwgMHgwMDEwLCAweDEwNzgsIDB4MjhmZiwgMHgwMDQwLAorCTB4Mjg5NiwgMHgxNTdlLCAweDIwYTksIDB4MDAwMCwgMHgyMDIxLCAweDc0MDAsIDB4MDQ3ZSwgMHgyMDA5LAorCTB4MDAwNCwgMHgyMDExLCAweDAwMTAsIDB4MTA3OCwgMHgyOGZmLCAweDA0N2YsIDB4MDA0MCwgMHgyODk1LAorCTB4ODQyMCwgMHgwMDcwLCAweDI4OTUsIDB4MDA3OCwgMHgyODg2LCAweDE1N2YsIDB4ODczOCwgMHhhNzg0LAorCTB4MDAxZiwgMHgwMGMwLCAweDI4NzEsIDB4MDA3OCwgMHgyNDgyLCAweDAwNzgsIDB4MjQ4MiwgMHg3NzgwLAorCTB4MTA3OCwgMHgzN2VmLCAweDYwMTgsIDB4YTAwNSwgMHgwMDQwLCAweDI4YzUsIDB4MjAyMSwgMHg3NTAwLAorCTB4MjAwOSwgMHgwMDA1LCAweDIwMTEsIDB4MDAyMCwgMHgxMDc4LCAweDI4ZmYsIDB4MDA0MCwgMHgyOGM1LAorCTB4MTU3ZSwgMHgyMGE5LCAweDAwMDAsIDB4MjAyMSwgMHg3NDAwLCAweDA0N2UsIDB4MjAwOSwgMHgwMDA1LAorCTB4MjAxMSwgMHgwMDIwLCAweDEwNzgsIDB4MjhmZiwgMHgwNDdmLCAweDAwNDAsIDB4MjhjNCwgMHg4NDIwLAorCTB4MDA3MCwgMHgyOGM0LCAweDAwNzgsIDB4MjhiNSwgMHgxNTdmLCAweDAwNzgsIDB4MjQ4MiwgMHgyMjAwLAorCTB4MDA3OSwgMHgyOGNhLCAweDI4Y2QsIDB4MjhjZiwgMHgyOGNmLCAweDEwNzgsIDB4MjNlYiwgMHgyMDA5LAorCTB4MDAxMiwgMHg3MDZjLCAweGEwODYsIDB4MDAwMiwgMHgwMDQwLCAweDI4ZDgsIDB4MjAwOSwgMHgwMDBlLAorCTB4NjgxOCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyOGRlLCAweDY5MWEsIDB4NzA2ZiwgMHgwMDAwLAorCTB4NzA3MywgMHgwMDAxLCAweDAwNzgsIDB4Mzg4OCwgMHgyMjAwLCAweDAwNzksIDB4MjhlNywgMHgyOGVjLAorCTB4MjhjZiwgMHgyOGVhLCAweDEwNzgsIDB4MjNlYiwgMHgxMDc4LCAweDQ3NzYsIDB4NzAwMCwgMHhhMDg2LAorCTB4MDAwMSwgMHgwMGMwLCAweDMzOWQsIDB4MTA3OCwgMHgzM2VlLCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLAorCTB4NjAwYSwgMHgxMDc4LCAweDMzOTAsIDB4MDA0MCwgMHgzMzlkLCAweDAwNzgsIDB4MjU5NCwgMHgyNDA0LAorCTB4YTAwNSwgMHgwMDQwLCAweDI5MjIsIDB4MjA2OCwgMHgyZDA0LCAweDAwN2UsIDB4NjgxNCwgMHhhNzA2LAorCTB4MDA0MCwgMHgyOTBlLCAweDJkMjAsIDB4MDA3ZiwgMHgwMDc4LCAweDI5MDAsIDB4MDA3ZiwgMHgyMDIyLAorCTB4NjkxYSwgMHg2ODE3LCAweDAwMDAsIDB4NjgyMCwgMHhhMjA1LCAweDY4MjIsIDB4MTA3OCwgMHgxYzcwLAorCTB4NjAxMCwgMHg4MDAxLCAweDYwMTIsIDB4NjAwOCwgMHhhMDg0LCAweGZmZWYsIDB4NjAwYSwgMHgxMDc4LAorCTB4MzNlZSwgMHgwMDdjLCAweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDI5MjEsIDB4MjMwMCwgMHgwMDc5LAorCTB4MjkyOSwgMHgyOTJlLCAweDI5MmMsIDB4MjljNywgMHgxMDc4LCAweDIzZWIsIDB4NzhlYywgMHhhMDg0LAorCTB4MDAwMSwgMHgwMGMwLCAweDI5NDIsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDQsIDB4MDBjMCwgMHgyOTNhLAorCTB4MDA3OCwgMHgyOTY1LCAweDEwNzgsIDB4MzNlZSwgMHg2MDA4LCAweGEwODQsIDB4ZmZlZiwgMHg2MDBhLAorCTB4MDA3OCwgMHgzMzlkLCAweDc4ZTQsIDB4YTAwNSwgMHgwMGQwLCAweDI5NjUsIDB4MDAxOCwgMHgyNDU5LAorCTB4MjAwOCwgMHhhMDg0LCAweDAwMzAsIDB4MDBjMCwgMHgyOTUxLCAweDc4MWIsIDB4MDA0ZiwgMHgwMDc4LAorCTB4MjQ1OSwgMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwMDQwLCAweDI5NGQsIDB4MjEwMCwgMHhhMDg0LAorCTB4MDAwNywgMHgwMDc5LCAweDI5NWIsIDB4Mjk5ZSwgMHgyOWE5LCAweDI5OGYsIDB4Mjk2MywgMHgzOGVkLAorCTB4MzhlZCwgMHgyOTYzLCAweDI5YjgsIDB4MTA3OCwgMHgyM2ViLCAweDcwMDAsIDB4YTA4NiwgMHgwMDA0LAorCTB4MDBjMCwgMHgyOTdmLCAweDcwNmMsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4Mjk3NSwgMHgyMDExLAorCTB4MDAwMiwgMHgyMDE5LCAweDAwMDAsIDB4MDA3OCwgMHgyODQ4LCAweDcwNmMsIDB4YTA4NiwgMHgwMDA2LAorCTB4MDA0MCwgMHgyOTZmLCAweDcwNmMsIDB4YTA4NiwgMHgwMDA0LCAweDAwNDAsIDB4Mjk2ZiwgMHg3OWU0LAorCTB4YTE4NCwgMHgwMDMwLCAweDAwNDAsIDB4Mjk4OSwgMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwMGMwLAorCTB4Mjk4YiwgMHgwMDc4LCAweDJmNmQsIDB4MjAwMSwgMHgwMDAzLCAweDAwNzgsIDB4MmQwMSwgMHg2ODE4LAorCTB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4Mjk5NiwgMHg2ODFiLCAweDAwMWQsIDB4MTA3OCwgMHgzNmMxLAorCTB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA1NiwgMHgwMDc4LCAweDI0NTksIDB4NjgxOCwgMHhhMDg0LAorCTB4ODAwMCwgMHgwMDQwLCAweDI5YTUsIDB4NjgxYiwgMHgwMDFkLCAweDEwNzgsIDB4MzZjMSwgMHgwMDc4LAorCTB4MzhiOCwgMHg2ODE4LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDI5YjAsIDB4NjgxYiwgMHgwMDFkLAorCTB4MTA3OCwgMHgzNmMxLCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLCAweDAwY2QsIDB4MDA3OCwgMHgyNDU5LAorCTB4NjgxOCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyOWJmLCAweDY4MWIsIDB4MDAxZCwgMHgxMDc4LAorCTB4MzZjMSwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDhlLCAweDAwNzgsIDB4MjQ1OSwgMHhhNTg0LAorCTB4MDAwZiwgMHgwMGMwLCAweDI5ZTQsIDB4NzAwMCwgMHgwMDc5LCAweDI5Y2UsIDB4MjQ4MiwgMHgyOWQ4LAorCTB4MjlkNiwgMHgzMzlkLCAweDMzOWQsIDB4MzM5ZCwgMHgzMzlkLCAweDI5ZDYsIDB4MTA3OCwgMHgyM2ViLAorCTB4MTA3OCwgMHgzM2VlLCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLCAweDYwMGEsIDB4MTA3OCwgMHgzMzkwLAorCTB4MDA0MCwgMHgzMzlkLCAweDAwNzgsIDB4MjU5NCwgMHg3OGU0LCAweGEwMDUsIDB4MDBkMCwgMHgyOTY1LAorCTB4MDAxOCwgMHgyOTY1LCAweDIwMDgsIDB4YTA4NCwgMHgwMDMwLCAweDAwYzAsIDB4MjlmMywgMHg3ODFiLAorCTB4MDA0ZiwgMHgwMDc4LCAweDI0NTksIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MDA0MCwgMHgyOWVmLAorCTB4MjEwMCwgMHhhMTg0LCAweDAwMDcsIDB4MDA3OSwgMHgyOWZkLCAweDJhMGYsIDB4MmExMywgMHgyYTA3LAorCTB4MmEwNSwgMHgzOGVkLCAweDM4ZWQsIDB4MmEwNSwgMHgzOGUzLCAweDEwNzgsIDB4MjNlYiwgMHgxMDc4LAorCTB4MzZjOSwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDU2LCAweDAwNzgsIDB4MjQ1OSwgMHgxMDc4LAorCTB4MzZjOSwgMHgwMDc4LCAweDM4YjgsIDB4MTA3OCwgMHgzNmM5LCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLAorCTB4MDBjZCwgMHgwMDc4LCAweDI0NTksIDB4MTA3OCwgMHgzNmM5LCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLAorCTB4MDA4ZSwgMHgwMDc4LCAweDI0NTksIDB4MjMwMCwgMHgwMDc5LCAweDJhMjYsIDB4MmEyYiwgMHgyYTI5LAorCTB4MmEyZCwgMHgxMDc4LCAweDIzZWIsIDB4MDA3OCwgMHgzMGFiLCAweDY4MWIsIDB4MDAwOCwgMHg3OGEzLAorCTB4MDAwMCwgMHg3OWU0LCAweGExODQsIDB4MDAzMCwgMHgwMDQwLCAweDMwYWIsIDB4NzhlYywgMHhhMDg0LAorCTB4MDAwMywgMHgwMDQwLCAweDMwYWIsIDB4YTE4NCwgMHgwMDA3LCAweDAwNzksIDB4MmEzZiwgMHgyYTQ3LAorCTB4MmExMywgMHgyOThmLCAweDM4ODgsIDB4MzhlZCwgMHgzOGVkLCAweDJhNDcsIDB4MzhlMywgMHgxMDc4LAorCTB4Mzg5YywgMHgwMDc4LCAweDI0NTksIDB4YTI4MiwgMHgwMDA1LCAweDAwNTAsIDB4MmE1MSwgMHgxMDc4LAorCTB4MjNlYiwgMHgyMzAwLCAweDAwNzksIDB4MmE1NCwgMHgyYTU3LCAweDJjYWUsIDB4MmNiYywgMHgyMjAwLAorCTB4MDA3OSwgMHgyYTVhLCAweDJhNzQsIDB4MmE2MSwgMHgyYTc0LCAweDJhNWYsIDB4MmM5MywgMHgxMDc4LAorCTB4MjNlYiwgMHg3ODliLCAweDAwMTgsIDB4NzhhOCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4MiwgMHgwMDIwLAorCTB4MDA0OCwgMHgzNjlkLCAweGEwOGEsIDB4MDAwNCwgMHgwMGM4LCAweDM2OWQsIDB4MDA3OSwgMHgyYTcwLAorCTB4MzY5ZCwgMHgzNjlkLCAweDM2OWQsIDB4MzY0YiwgMHg3ODliLCAweDAwMTgsIDB4NzlhOCwgMHhhMTg0LAorCTB4MDA4MCwgMHgwMDQwLCAweDJhODUsIDB4MDA3OCwgMHgzNjlkLCAweDcwMDAsIDB4YTAwNSwgMHgwMGMwLAorCTB4MmE3YiwgMHgyMDExLCAweDAwMDQsIDB4MDA3OCwgMHgzMjFmLCAweGExODQsIDB4MDBmZiwgMHhhMDhhLAorCTB4MDAxMCwgMHgwMGM4LCAweDM2OWQsIDB4MDA3OSwgMHgyYThkLCAweDJhOWYsIDB4MmE5ZCwgMHgyYWI3LAorCTB4MmFiYiwgMHgyYjc4LCAweDM2OWQsIDB4MzY5ZCwgMHgyYjdhLCAweDM2OWQsIDB4MzY5ZCwgMHgyYzhmLAorCTB4MmM4ZiwgMHgzNjlkLCAweDM2OWQsIDB4MzY5ZCwgMHgyYzkxLCAweDEwNzgsIDB4MjNlYiwgMHhhNjg0LAorCTB4MTAwMCwgMHgwMDQwLCAweDJhYWMsIDB4MjAwMSwgMHgwNTAwLCAweDgwMDAsIDB4ODAwMCwgMHg3ODNhLAorCTB4NzgxYiwgMHgwMDhjLCAweDAwNzgsIDB4MjQ1OSwgMHg2ODE4LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLAorCTB4MmFiNSwgMHg2ODFiLCAweDAwMWQsIDB4MDA3OCwgMHgyYWEzLCAweDAwNzgsIDB4Mzg4OCwgMHg2ODFiLAorCTB4MDAxZCwgMHgwMDc4LCAweDM2YWQsIDB4NjkyMCwgMHg2OTIyLCAweGE2ODQsIDB4MTgwMCwgMHgwMGMwLAorCTB4MmFmYywgMHg2ODIwLCAweGEwODQsIDB4MDAwMSwgMHgwMGMwLCAweDJiMDQsIDB4NjgxOCwgMHhhMDg2LAorCTB4MDAwOCwgMHgwMGMwLCAweDJhY2QsIDB4NjgxYiwgMHgwMDAwLCAweGE2ODQsIDB4MDQwMCwgMHgwMDQwLAorCTB4MmI3NCwgMHhhNjg0LCAweDAwODAsIDB4MDA0MCwgMHgyYWY4LCAweDcwOTcsIDB4MDAwMCwgMHg2ODE4LAorCTB4YTA4NCwgMHgwMDNmLCAweGEwOGEsIDB4MDAwZCwgMHgwMDUwLCAweDJhZjgsIDB4YTA4YSwgMHgwMDBjLAorCTB4NzE5NiwgMHgyMDAxLCAweDAwMGMsIDB4ODAwYywgMHg3MTlhLCAweDc4OWIsIDB4MDA2MSwgMHg3OGFhLAorCTB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4MjBhMSwgMHgwMTJiLCAweDc4OWIsIDB4MDAwMCwgMHg4MDAwLAorCTB4ODBhYywgMHhhZDgwLCAweDAwMGIsIDB4MjA5OCwgMHg1M2E2LCAweDE0N2YsIDB4MTM3ZiwgMHgxNTdmLAorCTB4NzgxYiwgMHgwMDU4LCAweDAwNzgsIDB4MjQ1OSwgMHhhNjg0LCAweDEwMDAsIDB4MDA0MCwgMHgyYjA0LAorCTB4NzgxYiwgMHgwMDY1LCAweDAwNzgsIDB4MjQ1OSwgMHhhNjg0LCAweDAwNjAsIDB4MDA0MCwgMHgyYjcwLAorCTB4YTY4NCwgMHgwODAwLCAweDAwNDAsIDB4MmI3MCwgMHhhNjg0LCAweDgwMDAsIDB4MDBjMCwgMHgyYjEyLAorCTB4MDA3OCwgMHgyYjJjLCAweGE2YjQsIDB4N2ZmZiwgMHg3ZTVhLCAweDZlYjYsIDB4Nzg5YiwgMHgwMDc2LAorCTB4N2FhYywgMHg3OWFjLCAweDc4YWMsIDB4ODAxYiwgMHgwMGM4LCAweDJiMWYsIDB4ODAwMCwgMHhhMDg0LAorCTB4MDAzZiwgMHhhMTA4LCAweGEyOTEsIDB4MDAwMCwgMHg2Yjk4LCAweDIxMDAsIDB4YTMwMiwgMHg2OGIyLAorCTB4NmI5NCwgMHgyMjAwLCAweGEzMDMsIDB4NjhhZSwgMHhhNjg0LCAweDQwMDAsIDB4MDA0MCwgMHgyYjM0LAorCTB4YTZiNCwgMHhiZmZmLCAweDdlNWEsIDB4NmViNiwgMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMGMwLAorCTB4MmI0MSwgMHgxMDc4LCAweDQ4MmMsIDB4MTA3OCwgMHg0YTI5LCAweDc4MWIsIDB4MDA2NCwgMHgwMDc4LAorCTB4MjQ1OSwgMHhhMDA2LCAweDEwNzgsIDB4NGIzMCwgMHg2YWIwLCAweDY5YWMsIDB4NmM5OCwgMHg2Yjk0LAorCTB4MjIwMCwgMHhhMTA1LCAweDAwNDAsIDB4MmI1MCwgMHgyMjAwLCAweGE0MjIsIDB4MjEwMCwgMHhhMzFiLAorCTB4NmNhYSwgMHg3Y2QyLCAweDdjZGEsIDB4NmJhNiwgMHg3YmQ2LCAweDdiZGUsIDB4MjMwMCwgMHhhNDA1LAorCTB4MDBjMCwgMHgyYjYyLCAweGE2YjUsIDB4NDAwMCwgMHg3ZTVhLCAweDZlYjYsIDB4NzgxYiwgMHgwMDY0LAorCTB4MDA3OCwgMHgyNDU5LCAweDc4MWIsIDB4MDA2NCwgMHgyMjAwLCAweGExMTUsIDB4MDBjMCwgMHgyYjZjLAorCTB4MTA3OCwgMHg0YTNhLCAweDAwNzgsIDB4MjQ1OSwgMHgxMDc4LCAweDRhODUsIDB4MDA3OCwgMHgyNDU5LAorCTB4NzgxYiwgMHgwMDY1LCAweDAwNzgsIDB4MjQ1OSwgMHg3ODFiLCAweDAwNTgsIDB4MDA3OCwgMHgyNDU5LAorCTB4MTA3OCwgMHgyM2ViLCAweDAwNzgsIDB4MmJkYiwgMHg2OTIwLCAweGExODQsIDB4MDEwMCwgMHgwMDQwLAorCTB4MmI5MiwgMHhhMThjLCAweGZlZmYsIDB4NjkyMiwgMHgwYzdlLCAweDcwNTQsIDB4MjA2MCwgMHg2MDAwLAorCTB4YTA4NCwgMHhlZmZmLCAweDYwMDIsIDB4NjAwNCwgMHhhMDg0LCAweGZmZjUsIDB4NjAwNiwgMHgwYzdmLAorCTB4MDA3OCwgMHgyYmNhLCAweGExODQsIDB4MDIwMCwgMHgwMDQwLCAweDJiY2EsIDB4YTE4YywgMHhmZGZmLAorCTB4NjkyMiwgMHgwYzdlLCAweDcwNTQsIDB4MjA2MCwgMHg2MDAwLCAweGEwODQsIDB4ZGZmZiwgMHg2MDAyLAorCTB4NjAwNCwgMHhhMDg0LCAweGZmZWYsIDB4NjAwNiwgMHgyMDA4LCAweDJjNDgsIDB4MGM3ZiwgMHhhMTg0LAorCTB4MDAwOCwgMHgwMDQwLCAweDJiY2EsIDB4MTA3OCwgMHgzN2ViLCAweDEwNzgsIDB4MzRmMSwgMHg4OGZmLAorCTB4MDA0MCwgMHgyYmNhLCAweDc4OWIsIDB4MDA2MCwgMHgyODAwLCAweDc4YWEsIDB4N2U1OCwgMHhhNmI1LAorCTB4MDAwNCwgMHg3ZTVhLCAweGE2ODQsIDB4MDQwMCwgMHgwMGMwLCAweDJiYzQsIDB4NzgyYiwgMHgzMDA4LAorCTB4NzgxYiwgMHgwMDU2LCAweDAwNzgsIDB4MjQ1OSwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDY1LAorCTB4MDA3OCwgMHgyNDU5LCAweDdlNTgsIDB4YTY4NCwgMHgwNDAwLCAweDAwYzAsIDB4MmJkMywgMHg3ODFiLAorCTB4MDA1OCwgMHgwMDc4LCAweDI0NTksIDB4NzgxYiwgMHgwMDY1LCAweDAwNzgsIDB4MjQ1OSwgMHgwMDc4LAorCTB4MzZhNSwgMHgwMDc4LCAweDM2YTUsIDB4MjAxOSwgMHgwMDAwLCAweDc5OTAsIDB4YTE4YywgMHgwMDA3LAorCTB4MDBjMCwgMHgyYmU5LCAweDY4MjAsIDB4YTA4NCwgMHgwMTAwLCAweDAwNDAsIDB4MmJkOSwgMHgyMDA5LAorCTB4MDAwOCwgMHg3ODliLCAweDAwMTAsIDB4NzhhOCwgMHhhMDk0LCAweDAwZmYsIDB4YTI4NiwgMHgwMDAxLAorCTB4MDBjMCwgMHgyYzIwLCAweDIzMDAsIDB4N2NhOCwgMHhhNDAwLCAweDIwMTgsIDB4YTEwMiwgMHgwMDQwLAorCTB4MmMxOCwgMHgwMDQ4LCAweDJiZmQsIDB4MDA3OCwgMHgyYzFhLCAweGEzODAsIDB4MDAwMiwgMHhhMTAyLAorCTB4MDBjOCwgMHgyYzE4LCAweDY5MjAsIDB4YTE4YywgMHhmY2ZmLCAweDY5MjIsIDB4MGM3ZSwgMHg3MDU0LAorCTB4MjA2MCwgMHg2MDAwLCAweGEwODQsIDB4ZWZlZiwgMHg2MDAyLCAweDYwMDQsIDB4YTA4NCwgMHhmZmU1LAorCTB4NjAwNiwgMHgwYzdmLCAweDdlNTgsIDB4YTZiNCwgMHhmZmZiLCAweDdlNWEsIDB4MDA3OCwgMHgyYmNiLAorCTB4MDA3OCwgMHgyYjdjLCAweDI0YTgsIDB4N2FhOCwgMHgwMGYwLCAweDJjMWEsIDB4MDA3OCwgMHgyYmViLAorCTB4YTI4NCwgMHgwMGYwLCAweGEwODYsIDB4MDAyMCwgMHgwMGMwLCAweDJjODAsIDB4ODMxOCwgMHg4MzE4LAorCTB4MjMwMCwgMHhhMTAyLCAweDAwNDAsIDB4MmMzMCwgMHgwMDQ4LCAweDJjMzAsIDB4MDA3OCwgMHgyYzdkLAorCTB4YTI4NiwgMHgwMDIzLCAweDAwNDAsIDB4MmJkOSwgMHg2ODFjLCAweGEwODQsIDB4ZmZmMSwgMHg2ODFlLAorCTB4N2U1OCwgMHhhNjg0LCAweGZmZjEsIDB4YTA4NSwgMHgwMDEwLCAweDIwMzAsIDB4N2U1YSwgMHg2MDA4LAorCTB4YTA4NSwgMHgwMDEwLCAweDYwMGEsIDB4MGM3ZSwgMHg3MDU0LCAweDIwNjAsIDB4NjAwNCwgMHgyMDA4LAorCTB4MmM0OCwgMHgwYzdmLCAweGExODQsIDB4MDAxMCwgMHgwMDQwLCAweDJjNTQsIDB4MTA3OCwgMHgzN2ViLAorCTB4MTA3OCwgMHgzNjA0LCAweDAwNzgsIDB4MmM2MywgMHgwYzdlLCAweDcwNTQsIDB4MjA2MCwgMHg2MDA0LAorCTB4MjAwOCwgMHgyYzQ4LCAweDBjN2YsIDB4YTE4NCwgMHgwMDA4LCAweDAwNDAsIDB4MmJjYSwgMHgxMDc4LAorCTB4MzdlYiwgMHgxMDc4LCAweDM0ZjEsIDB4ODhmZiwgMHgwMDQwLCAweDJiY2EsIDB4Nzg5YiwgMHgwMDYwLAorCTB4MjgwMCwgMHg3OGFhLCAweGE2YjUsIDB4MDAwNCwgMHg3ZTVhLCAweGE2ODQsIDB4MDQwMCwgMHgwMGMwLAorCTB4MmM3NywgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDU2LCAweDAwNzgsIDB4MjQ1OSwgMHg3ODJiLAorCTB4MzAwOCwgMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDU5LCAweDdhYTgsIDB4MDA3OCwgMHgyYmViLAorCTB4ODMxOCwgMHgyMzAwLCAweGExMDIsIDB4MDA0MCwgMHgyYzg5LCAweDAwNDgsIDB4MmM4OSwgMHgwMDc4LAorCTB4MmJlYiwgMHhhMjg0LCAweDAwODAsIDB4MDBjMCwgMHgzNmFkLCAweDAwNzgsIDB4MzZhNSwgMHgwMDc4LAorCTB4MzZhZCwgMHgwMDc4LCAweDM2OWQsIDB4Nzg5YiwgMHgwMDE4LCAweDc4YTgsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4ZSwgMHgwMDAxLCAweDAwNDAsIDB4MmM5ZSwgMHgxMDc4LCAweDIzZWIsIDB4N2FhOCwgMHhhMjk0LAorCTB4MDBmZiwgMHg3OGE4LCAweGEwODQsIDB4MDBmZiwgMHhhMDhhLCAweDAwMDQsIDB4MDBjOCwgMHgzNjlkLAorCTB4MDA3OSwgMHgyY2FhLCAweDM2OWQsIDB4MzQzZSwgMHgzNjlkLCAweDM1OTksIDB4YTI4MiwgMHgwMDAwLAorCTB4MDBjMCwgMHgyY2I0LCAweDEwNzgsIDB4MjNlYiwgMHgxMDc4LCAweDM2YzEsIDB4NzgyYiwgMHgzMDA4LAorCTB4NzgxYiwgMHgwMDY1LCAweDAwNzgsIDB4MjQ1OSwgMHhhMjgyLCAweDAwMDMsIDB4MDBjMCwgMHgyY2MyLAorCTB4MTA3OCwgMHgyM2ViLCAweGE0ODQsIDB4ODAwMCwgMHgwMGMwLCAweDJjZTUsIDB4NzA2YywgMHhhMDA1LAorCTB4MDA0MCwgMHgyY2NjLCAweDEwNzgsIDB4MjNlYiwgMHg2ZjE0LCAweDc3ODIsIDB4YTdiYywgMHgwZjAwLAorCTB4MTA3OCwgMHgzN2VmLCAweDYwMDgsIDB4YTA4NSwgMHgwMDIxLCAweDYwMGEsIDB4ODczOCwgMHhhNzg0LAorCTB4MDAxZiwgMHgwMGMwLCAweDJjZDAsIDB4MTA3OCwgMHgzNmM1LCAweDcwNmYsIDB4MDAwMiwgMHgyMDA5LAorCTB4NTEzOCwgMHgyMDBiLCAweDAwMDksIDB4MDA3OCwgMHgyY2U3LCAweDEwNzgsIDB4MzZkMSwgMHg3ODJiLAorCTB4MzAwOCwgMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDU5LCAweGEyODIsIDB4MDAwNCwgMHgwMDUwLAorCTB4MmNmMywgMHgxMDc4LCAweDIzZWIsIDB4MjMwMCwgMHgwMDc5LCAweDJjZjYsIDB4MmNmOSwgMHgyZGUyLAorCTB4MmUxNSwgMHhhMjg2LCAweDAwMDMsIDB4MDA0MCwgMHgyY2ZmLCAweDEwNzgsIDB4MjNlYiwgMHgyMDAxLAorCTB4MDAwMCwgMHgwMDdlLCAweDY4YzAsIDB4YTAwNSwgMHgwMDQwLCAweDJkMDgsIDB4NzAwMywgMHgwMDAzLAorCTB4NjhhMCwgMHhhMDg0LCAweDIwMDAsIDB4MDA0MCwgMHgyZDExLCAweDYwMDgsIDB4YTA4NSwgMHgwMDAyLAorCTB4NjAwYSwgMHgwMDdmLCAweDcwM2UsIDB4NzAwMCwgMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHgyZDE4LAorCTB4MjQ4MiwgMHgyZDIyLCAweDJkMjIsIDB4MmYxNywgMHgyZjUzLCAweDI0ODIsIDB4MmY1MywgMHgyZDIwLAorCTB4MTA3OCwgMHgyM2ViLCAweGE2ODQsIDB4MTAwMCwgMHgwMGMwLCAweDJkMmEsIDB4MTA3OCwgMHg0Nzc2LAorCTB4MDA0MCwgMHgyZGJjLCAweDc4NjgsIDB4YTA4YywgMHgwMGZmLCAweDAwNDAsIDB4MmQ3MiwgMHhhMTg2LAorCTB4MDAwOCwgMHgwMGMwLCAweDJkNDEsIDB4MTA3OCwgMHgzM2VlLCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLAorCTB4NjAwYSwgMHgxMDc4LCAweDMzOTAsIDB4MDA0MCwgMHgyZDcyLCAweDEwNzgsIDB4NDc3NiwgMHgwMDc4LAorCTB4MmQ1OSwgMHhhMTg2LCAweDAwMjgsIDB4MDBjMCwgMHgyZDcyLCAweDEwNzgsIDB4NDc3NiwgMHg2MDA4LAorCTB4YTA4NCwgMHhmZmVmLCAweDYwMGEsIDB4NjAxOCwgMHhhMDA1LCAweDAwNDAsIDB4MmQ1OSwgMHg4MDAxLAorCTB4NjAxYSwgMHhhMDA1LCAweDAwNDAsIDB4MmQ1OSwgMHg4MDAxLCAweGEwMDUsIDB4MDA0MCwgMHgyZDU5LAorCTB4NjAxZSwgMHg2ODIwLCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLCAweDI0ODIsIDB4NjgyMCwgMHhhMDg0LAorCTB4ZmZmZSwgMHg2ODIyLCAweDcwNjAsIDB4MGM3ZSwgMHgyMDYwLCAweDY4MDAsIDB4NjAwMiwgMHgwYzdmLAorCTB4NjAwNCwgMHg2ODAyLCAweGEwMDUsIDB4MmQwMCwgMHgwMGMwLCAweDJkNmYsIDB4NjAwMiwgMHg2MDA2LAorCTB4MDA3OCwgMHgyNDgyLCAweDAxN2UsIDB4MTA3OCwgMHgyZTQ2LCAweDAxN2YsIDB4YTY4NCwgMHhkZjAwLAorCTB4NjgxZSwgMHg2ODJiLCAweDAwMDAsIDB4NmYxNCwgMHg4MWZmLCAweDAwNDAsIDB4MmRiYywgMHhhMTg2LAorCTB4MDAwMiwgMHgwMGMwLCAweDJkYmMsIDB4YTY4NCwgMHgwODAwLCAweDAwYzAsIDB4MmQ4ZiwgMHhhNjg0LAorCTB4MDA2MCwgMHgwMDQwLCAweDJkOGYsIDB4NzhkOCwgMHg3YWRjLCAweDY4MmUsIDB4NmEzMiwgMHg2ODIwLAorCTB4YTA4NCwgMHgwODAwLCAweDAwYzAsIDB4MmRiYywgMHg4NzE3LCAweGEyOTQsIDB4MDAwZiwgMHg4MjEzLAorCTB4ODIxMywgMHg4MjEzLCAweGEyOTAsIDB4NTM4MCwgMHhhMjkwLCAweDAwMDAsIDB4MjIxYywgMHhhMzg0LAorCTB4MDEwMCwgMHgwMGMwLCAweDJkYTUsIDB4MDA3OCwgMHgyZGFiLCAweDgyMTAsIDB4MjIwNCwgMHhhMDg1LAorCTB4MDAxOCwgMHgyMDEyLCAweDgyMTEsIDB4YTM4NCwgMHgwNDAwLCAweDAwNDAsIDB4MmRiOCwgMHg2OGEwLAorCTB4YTA4NCwgMHgwMTAwLCAweDAwYzAsIDB4MmRiOCwgMHgxMDc4LCAweDJlY2EsIDB4MDA3OCwgMHgyNDgyLAorCTB4NjAwOCwgMHhhMDg1LCAweDAwMDIsIDB4NjAwYSwgMHg2OTE2LCAweDY4MTgsIDB4YTA4NCwgMHg4MDAwLAorCTB4MDA0MCwgMHgyZGM0LCAweDcwM2MsIDB4NjgxYSwgMHhhNjhjLCAweGRmMDAsIDB4NjkxZSwgMHgxMDc4LAorCTB4MzNkZiwgMHgxMDc4LCAweDMzZWUsIDB4MDBjMCwgMHgyZGQxLCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLAorCTB4NjAwYSwgMHg2ODIwLCAweGEwODQsIDB4MDAwMSwgMHgwMGMwLCAweDJkZGEsIDB4MTA3OCwgMHgzM2Q4LAorCTB4MDA3OCwgMHgyZGRlLCAweDcwNjAsIDB4MjA2MCwgMHg2ODAwLCAweDYwMDIsIDB4MTA3OCwgMHgxYzcwLAorCTB4MDA3OCwgMHgyNDgyLCAweGEyODIsIDB4MDAwNCwgMHgwMDQ4LCAweDJkZTgsIDB4MTA3OCwgMHgyM2ViLAorCTB4MjIwMCwgMHgwMDc5LCAweDJkZWIsIDB4MmRlNiwgMHgyZGVmLCAweDJkZmMsIDB4MmRlZiwgMHg3MDAwLAorCTB4YTA4NiwgMHgwMDA1LCAweDAwNDAsIDB4MmRmOCwgMHgxMDc4LCAweDM2YzEsIDB4NzgyYiwgMHgzMDA4LAorCTB4NzgxYiwgMHgwMDY1LCAweDAwNzgsIDB4MjQ1OSwgMHg3ODkwLCAweDgwMDcsIDB4ODAwMSwgMHhhMDg0LAorCTB4MDAwNywgMHhhMDgwLCAweDAwMTgsIDB4Nzg5YSwgMHg3OWE4LCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LAorCTB4MDAwMywgMHgwMDQwLCAweDJlMTEsIDB4YTE4NiwgMHgwMDAwLCAweDAwNDAsIDB4MmUxMSwgMHgwMDc4LAorCTB4MzY5ZCwgMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDU5LCAweDY4MjAsIDB4YTA4NSwgMHgwMDA0LAorCTB4NjgyMiwgMHg4MmZmLCAweDAwYzAsIDB4MmUyMCwgMHgxMDc4LCAweDM2YzEsIDB4MDA3OCwgMHgyZTI3LAorCTB4ODIxMSwgMHgwMDQwLCAweDJlMjUsIDB4MTA3OCwgMHgyM2ViLCAweDEwNzgsIDB4MzZkMSwgMHg3ODJiLAorCTB4MzAwOCwgMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDU5LCAweDcwMmMsIDB4ODAwMywgMHgwMDQ4LAorCTB4MmUzNywgMHgyMDE5LCAweDRkOWUsIDB4MTA3OCwgMHgyMjc2LCAweDcwMmYsIDB4ODAwMCwgMHgxMDc4LAorCTB4MzkxMiwgMHg3ODMwLCAweGEwODQsIDB4MDBjMCwgMHgwMGMwLCAweDJlNDMsIDB4MDAxOCwgMHgyZTQzLAorCTB4NzkxYSwgMHhhMDA2LCAweDAwN2MsIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsIDB4YTY4NCwgMHgwMDYwLAorCTB4MDBjMCwgMHgyZTUwLCAweDY4MmYsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4MDA3OCwgMHgyZWM5LAorCTB4YTY4NCwgMHgwODAwLCAweDAwYzAsIDB4MmU3MiwgMHg2OGI0LCAweGEwODQsIDB4NDgwMCwgMHhhNjM1LAorCTB4YTY4NCwgMHgwODAwLCAweDAwYzAsIDB4MmU3MiwgMHg2OTk4LCAweDZhOTQsIDB4NjkyZSwgMHg2YTMyLAorCTB4NzAzYywgMHhhMDA1LCAweDAwYzAsIDB4MmU2YSwgMHgyMjAwLCAweGExMDUsIDB4MDA0MCwgMHgyZTcxLAorCTB4NzAzZiwgMHgwMDE1LCAweDcwMDAsIDB4YTA4NiwgMHgwMDA2LCAweDAwNDAsIDB4MmU3MSwgMHgxMDc4LAorCTB4NDc3NiwgMHgwMDdjLCAweGE2ODQsIDB4MDAyMCwgMHgwMDQwLCAweDJlOTQsIDB4YTY4NCwgMHg0MDAwLAorCTB4MDA0MCwgMHgyZTgwLCAweDY4MmYsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4MDA3OCwgMHgyZTZhLAorCTB4NjhiNCwgMHhhMDg0LCAweDQ4MDAsIDB4YTYzNSwgMHhhNjg0LCAweDQwMDAsIDB4MDBjMCwgMHgyZTdhLAorCTB4NzAzYywgMHhhMDA1LCAweDAwYzAsIDB4MmU4ZSwgMHg3MDNmLCAweDAwMTUsIDB4NzlkOCwgMHg3YWRjLAorCTB4NjkyZSwgMHg2YTMyLCAweDAwNzgsIDB4MmU2YSwgMHhhNjg0LCAweDQwMDAsIDB4MDA0MCwgMHgyZTllLAorCTB4NjgyZiwgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHgwMDc4LCAweDJlNmEsIDB4NjhiNCwgMHhhMDg0LAorCTB4NDgwMCwgMHhhNjM1LCAweGE2ODQsIDB4NDAwMCwgMHgwMGMwLCAweDJlOTgsIDB4NzAzYywgMHhhMDA1LAorCTB4MDBjMCwgMHgyZWFjLCAweDcwM2YsIDB4MDAxNSwgMHg3OWQ4LCAweDdhZGMsIDB4NzhkMCwgMHg4MGZiLAorCTB4MDBjOCwgMHgyZWIzLCAweDgwMDAsIDB4YTA4NCwgMHgwMDNmLCAweGExMDgsIDB4YTI5MSwgMHgwMDAwLAorCTB4NjkyZSwgMHg2YTMyLCAweDIxMDAsIDB4YTIwNSwgMHgwMGMwLCAweDJlYzAsIDB4MDA3OCwgMHgyZTZhLAorCTB4NzAwMCwgMHhhMDg2LCAweDAwMDYsIDB4MDA0MCwgMHgyZWM5LCAweDEwNzgsIDB4NGIzMCwgMHgwMDc4LAorCTB4MmU2YSwgMHgwMDdjLCAweDYwMDgsIDB4YTA4NSwgMHgwMjAwLCAweDYwMGEsIDB4YTM4NCwgMHgwMjAwLAorCTB4MDA0MCwgMHgyZWQ2LCAweDYwMDgsIDB4YTA4NSwgMHgwMDAyLCAweDYwMGEsIDB4NjgxYiwgMHgwMDA2LAorCTB4Njg4ZiwgMHgwMDAwLCAweDY4OTMsIDB4MDAwMCwgMHg2YTMwLCAweDY5MmMsIDB4NmEzZSwgMHg2OTQyLAorCTB4NjgyZiwgMHgwMDAzLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM3LCAweDAwMjAsIDB4Njg5NywgMHgwMDAwLAorCTB4Njg5YiwgMHgwMDIwLCAweDY4YjMsIDB4MDAwMCwgMHg2OGFmLCAweDAwMDAsIDB4NzAwMCwgMHgwMDc5LAorCTB4MmVmMSwgMHgyNDgyLCAweDJlZmIsIDB4MmYwNCwgMHgyZWY5LCAweDJlZjksIDB4MmVmOSwgMHgyZWY5LAorCTB4MmVmOSwgMHgxMDc4LCAweDIzZWIsIDB4NjgyMCwgMHhhMDg0LCAweDAwMDEsIDB4MDBjMCwgMHgyZjA0LAorCTB4MTA3OCwgMHgzM2Q4LCAweDAwNzgsIDB4MmYwYSwgMHg3MDYwLCAweDJjNTAsIDB4MjA2MCwgMHg2ODAwLAorCTB4NjAwMiwgMHgyYTYwLCAweDIwMjEsIDB4NTE1YSwgMHgyNDA0LCAweGEwMDUsIDB4MDA0MCwgMHgyZjEzLAorCTB4MjAyMCwgMHgwMDc4LCAweDJmMGMsIDB4MmQyMiwgMHgyMDZiLCAweDAwMDAsIDB4MDA3YywgMHgxMDc4LAorCTB4MzNkZiwgMHgxMDc4LCAweDMzZWUsIDB4NjAwOCwgMHhhMDg0LCAweGZkZmYsIDB4NjAwYSwgMHg2ODJiLAorCTB4MDAwMCwgMHg3ODliLCAweDAwMGUsIDB4NmYxNCwgMHg2ODE3LCAweDAwMDIsIDB4MTA3OCwgMHg0Yjc4LAorCTB4YTY4NCwgMHgwODAwLCAweDAwNDAsIDB4MmYzMCwgMHg2OTFjLCAweGExOGQsIDB4MjAwMCwgMHg2OTFlLAorCTB4NjgxOCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyZjQwLCAweDc4NjgsIDB4YTA4YywgMHgwMGZmLAorCTB4MDA0MCwgMHgyZjNlLCAweDY4MWIsIDB4MDAxZSwgMHgwMDc4LCAweDJmNDAsIDB4NjgxYiwgMHgwMDAwLAorCTB4MjAyMSwgMHg1MTVhLCAweDI0MDQsIDB4YWQwNiwgMHgwMDQwLCAweDJmNDcsIDB4NzQ2MCwgMHg2ODAwLAorCTB4MjAyMiwgMHg2OGMzLCAweDAwMDAsIDB4NmEzYywgMHg2OTQwLCAweDZhMzIsIDB4NjkyZSwgMHgxMDc4LAorCTB4MWM3MCwgMHgwMDc4LCAweDI0ODIsIDB4MTA3OCwgMHgyZTQ2LCAweDY4MmIsIDB4MDAwMCwgMHgyMDAxLAorCTB4MDAwZSwgMHg2ZjE0LCAweDEwNzgsIDB4MzkxOCwgMHhhMDhjLCAweDAwZmYsIDB4NjkxNiwgMHg2ODE4LAorCTB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4MmY2NiwgMHg3MDNjLCAweDY4MWEsIDB4YTY4YywgMHhkZjAwLAorCTB4NjkxZSwgMHg3MDZmLCAweDAwMDAsIDB4MDA3OCwgMHgyNDgyLCAweDcwMDAsIDB4YTAwNSwgMHgwMGMwLAorCTB4MmY3MywgMHgwMDc4LCAweDI0ODIsIDB4YTAwNiwgMHgxMDc4LCAweDQ3NzYsIDB4NjgxNywgMHgwMDAwLAorCTB4NjgxYiwgMHgwMDE0LCAweGE2OGMsIDB4ZGYwMCwgMHg2OTFlLCAweDY4MmIsIDB4MDAwMCwgMHg2ODIwLAorCTB4YTA4NSwgMHgwMGZmLCAweDY4MjIsIDB4NzAwMCwgMHgwMDc5LCAweDJmODYsIDB4MjQ4MiwgMHgyZjkwLAorCTB4MmY5MCwgMHgyZjkyLCAweDJmOTIsIDB4MmY5MiwgMHgyZjkyLCAweDJmOGUsIDB4MTA3OCwgMHgyM2ViLAorCTB4MTA3OCwgMHgzM2VlLCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLCAweDYwMGEsIDB4MDA3OCwgMHgzM2E4LAorCTB4MjMwMCwgMHgwMDc5LCAweDJmOWIsIDB4MmY5ZSwgMHgyZmEwLCAweDJmZDksIDB4MTA3OCwgMHgyM2ViLAorCTB4NzAwMCwgMHgwMDc5LCAweDJmYTMsIDB4MjQ4MiwgMHgyZmFkLCAweDJmYWQsIDB4MmZjOCwgMHgyZmFkLAorCTB4MmZkNSwgMHgyZmM4LCAweDJmYWIsIDB4MTA3OCwgMHgyM2ViLCAweGE2ODQsIDB4MDA2MCwgMHhhMDg2LAorCTB4MDA2MCwgMHgwMGMwLCAweDJmYzQsIDB4YTZiNCwgMHhmZmRmLCAweGE2YjQsIDB4YmZmZiwgMHhhNmI1LAorCTB4MjAwMCwgMHg3ZTVhLCAweDY4MWMsIDB4YTA4NCwgMHhmZmRmLCAweDY4MWUsIDB4MTA3OCwgMHg0Nzc2LAorCTB4MTA3OCwgMHg0YTNhLCAweDAwNzgsIDB4Mzg4OCwgMHhhNjg0LCAweDIwMDAsIDB4MDA0MCwgMHgyZmI3LAorCTB4NjgxOCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyZmQ1LCAweDY4MWIsIDB4MDAxNSwgMHhhNjg0LAorCTB4NDAwMCwgMHgwMDQwLCAweDJmZDUsIDB4NjgxYiwgMHgwMDA3LCAweDEwNzgsIDB4Mzg5YywgMHgwMDc4LAorCTB4MjQ1OSwgMHgxMDc4LCAweDIzZWIsIDB4MjMwMCwgMHgwMDc5LCAweDJmZGUsIDB4MmZlMSwgMHgyZmUzLAorCTB4MzAxNiwgMHgxMDc4LCAweDIzZWIsIDB4NzAwMCwgMHgwMDc5LCAweDJmZTYsIDB4MjQ4MiwgMHgyZmYwLAorCTB4MmZmMCwgMHgzMDBiLCAweDJmZjAsIDB4MzAxMiwgMHgzMDBiLCAweDJmZWUsIDB4MTA3OCwgMHgyM2ViLAorCTB4YTY4NCwgMHgwMDYwLCAweGEwODYsIDB4MDA2MCwgMHgwMGMwLCAweDMwMDcsIDB4YTZiNCwgMHhmZmJmLAorCTB4YTZiNCwgMHhiZmZmLCAweGE2YjUsIDB4MjAwMCwgMHg3ZTVhLCAweDY4MWMsIDB4YTA4NCwgMHhmZmJmLAorCTB4NjgxZSwgMHgxMDc4LCAweDQ3NzYsIDB4MTA3OCwgMHg0YTNhLCAweDAwNzgsIDB4Mzg4OCwgMHhhNjg0LAorCTB4MjAwMCwgMHgwMDQwLCAweDJmZmEsIDB4NjgxOCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgzMDEyLAorCTB4NjgxYiwgMHgwMDA3LCAweDc4MWIsIDB4MDBjZCwgMHgwMDc4LCAweDI0NTksIDB4NjgyMCwgMHhhMDg1LAorCTB4MDAwNCwgMHg2ODIyLCAweDEwNzgsIDB4Mzg1MywgMHhhNmI1LCAweDA4MDAsIDB4MTA3OCwgMHgzNmMxLAorCTB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0NTksIDB4MjMwMCwgMHgwMDc5LAorCTB4MzAyOSwgMHgzMDJjLCAweDMwMmUsIDB4MzAzMCwgMHgxMDc4LCAweDIzZWIsIDB4MDA3OCwgMHgzNmFkLAorCTB4YTY4NCwgMHgwNDAwLCAweDAwYzAsIDB4MzA1OSwgMHg3OWU0LCAweGExODQsIDB4MDAyMCwgMHgwMDQwLAorCTB4MzA0MCwgMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwMDQwLCAweDMwNDAsIDB4NzgyYiwgMHgzMDA5LAorCTB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwMCwgMHhhNjg0LCAweGZmZmIsIDB4Nzg1YSwgMHg3OWU0LAorCTB4YTE4NCwgMHgwMDIwLCAweDAwNDAsIDB4MzA1MSwgMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwMGMwLAorCTB4MzA1NSwgMHgyMDAxLCAweDAwMTQsIDB4MDA3OCwgMHgyZDAxLCAweGExODQsIDB4MDAwNywgMHgwMDc5LAorCTB4MzA5MSwgMHg3YTkwLCAweGEyOTQsIDB4MDAwNywgMHg3ODliLCAweDAwNjAsIDB4NzlhOCwgMHg4MWZmLAorCTB4MDA0MCwgMHgzMDhmLCAweDc4OWIsIDB4MDAxMCwgMHg3YmE4LCAweGEzODQsIDB4MDAwMSwgMHgwMGMwLAorCTB4MzA4MCwgMHg3YmE4LCAweDdiYTgsIDB4YTM4NiwgMHgwMDAxLCAweDAwYzAsIDB4MzA3MywgMHgyMDA5LAorCTB4ZmZmNywgMHgwMDc4LCAweDMwNzksIDB4YTM4NiwgMHgwMDAzLCAweDAwYzAsIDB4MzA4MCwgMHgyMDA5LAorCTB4ZmZlZiwgMHgwYzdlLCAweDcwNTQsIDB4MjA2MCwgMHg2MDA0LCAweGExMDQsIDB4NjAwNiwgMHgwYzdmLAorCTB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwMCwgMHhhNjg0LCAweGZmZmIsIDB4Nzg1YSwgMHg3ODJiLAorCTB4MzAwOSwgMHg2OTIwLCAweGExOGMsIDB4ZmRmZiwgMHhhMThjLCAweGZlZmYsIDB4NjkyMiwgMHgwMDc4LAorCTB4Mzg4OCwgMHgyOTllLCAweDI5YTksIDB4MzA5YiwgMHgzMGEzLCAweDMwOTksIDB4MzA5OSwgMHgzODg4LAorCTB4Mzg4OCwgMHgxMDc4LCAweDIzZWIsIDB4NjkyMCwgMHhhMThjLCAweGZkZmYsIDB4YTE4YywgMHhmZWZmLAorCTB4NjkyMiwgMHgwMDc4LCAweDM4OTIsIDB4NjkyMCwgMHhhMThjLCAweGZkZmYsIDB4YTE4YywgMHhmZWZmLAorCTB4NjkyMiwgMHgwMDc4LCAweDM4ODgsIDB4NzllNCwgMHhhMTg0LCAweDAwMzAsIDB4MDA0MCwgMHgzMGI1LAorCTB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MDBjMCwgMHgzMGRjLCAweDcwMDAsIDB4YTA4NiwgMHgwMDA0LAorCTB4MDBjMCwgMHgzMGNmLCAweDcwNmMsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4MzBjNSwgMHgyMDExLAorCTB4MDAwMiwgMHgyMDE5LCAweDAwMDAsIDB4MDA3OCwgMHgyODQ4LCAweDcwNmMsIDB4YTA4NiwgMHgwMDA2LAorCTB4MDA0MCwgMHgzMGJmLCAweDcwNmMsIDB4YTA4NiwgMHgwMDA0LCAweDAwNDAsIDB4MzBiZiwgMHg3MDAwLAorCTB4YTA4NiwgMHgwMDAwLCAweDAwNDAsIDB4MjQ1OSwgMHg2ODE4LCAweGEwODUsIDB4ODAwMCwgMHg2ODFhLAorCTB4MjAwMSwgMHgwMDE0LCAweDAwNzgsIDB4MmQwMSwgMHhhMTg0LCAweDAwMDcsIDB4MDA3OSwgMHgzMGUwLAorCTB4Mzg4OCwgMHgzODg4LCAweDMwZTgsIDB4Mzg4OCwgMHgzOGVkLCAweDM4ZWQsIDB4Mzg4OCwgMHgzODg4LAorCTB4YTY4NCwgMHgwMDgwLCAweDAwNDAsIDB4MzExNywgMHg3MTk0LCAweDgxZmYsIDB4MDA0MCwgMHgzMTE3LAorCTB4YTE4MiwgMHgwMDBkLCAweDAwZDAsIDB4MzBmOCwgMHg3MDk3LCAweDAwMDAsIDB4MDA3OCwgMHgzMGZkLAorCTB4YTE4MiwgMHgwMDBjLCAweDcwOTYsIDB4MjAwOSwgMHgwMDBjLCAweDc4OWIsIDB4MDA2MSwgMHg3OWFhLAorCTB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4NzA5OCwgMHg4MTE0LCAweGEyMTAsIDB4NzI5YSwgMHhhMDgwLAorCTB4MDAwYiwgMHhhZDAwLCAweDIwOTgsIDB4MjBhMSwgMHgwMTJiLCAweDc4OWIsIDB4MDAwMCwgMHg4MTA4LAorCTB4ODFhYywgMHg1M2E2LCAweDE0N2YsIDB4MTM3ZiwgMHgxNTdmLCAweDAwNzgsIDB4Mzg5MiwgMHhhNjg0LAorCTB4MDQwMCwgMHgwMGMwLCAweDMxNTgsIDB4NjgyMCwgMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgzODkyLAorCTB4YTY4YywgMHgwMDYwLCAweGE2ODQsIDB4MDA2MCwgMHgwMDQwLCAweDMxMmMsIDB4YTA4NiwgMHgwMDYwLAorCTB4MDBjMCwgMHgzMTJjLCAweGExOGQsIDB4NDAwMCwgMHhhMThjLCAweGZmZmIsIDB4Nzk1YSwgMHg2OWI2LAorCTB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwMCwgMHg3ODliLCAweDAwNjEsIDB4NjgxOCwgMHhhMDg1LAorCTB4ODAwMCwgMHg2ODFhLCAweDc4YWEsIDB4ODAwOCwgMHg4MTBjLCAweDAwNDAsIDB4MzQwNywgMHhhMThjLAorCTB4MDBmOCwgMHgwMGMwLCAweDM0MDcsIDB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4MjBhMSwgMHgwMTJiLAorCTB4Nzg5YiwgMHgwMDAwLCAweDgwMDAsIDB4ODBhYywgMHhhZDgwLCAweDAwMGIsIDB4MjA5OCwgMHg1M2E2LAorCTB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsIDB4NjgxNCwgMHg4MDA3LCAweDc4ODIsIDB4MDA3OCwgMHgzODkyLAorCTB4NjgxOCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgzMTVmLCAweDY4MWIsIDB4MDAwOCwgMHg3ODFiLAorCTB4MDBjMywgMHgwMDc4LCAweDI0NTksIDB4MjMwMCwgMHgwMDc5LCAweDMxNjYsIDB4MzE2YiwgMHgzMjBhLAorCTB4MzE2OSwgMHgxMDc4LCAweDIzZWIsIDB4NzAwMCwgMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHgzMTcwLAorCTB4MjQ4MiwgMHgzMTdhLCAweDMxYWYsIDB4MzE4NSwgMHgzMTc4LCAweDI0ODIsIDB4MzE3OCwgMHgzMTc4LAorCTB4MTA3OCwgMHgyM2ViLCAweDY4MWMsIDB4YTA4NCwgMHgyMDAwLCAweDAwNDAsIDB4MzE5MywgMHg2MDA4LAorCTB4YTA4NSwgMHgwMDAyLCAweDYwMGEsIDB4MDA3OCwgMHgzMTkzLCAweDY4YzAsIDB4YTAwNSwgMHgwMGMwLAorCTB4MzFhZiwgMHg2OTIwLCAweGExOGQsIDB4MDAwMSwgMHg2OTIyLCAweDY4YzMsIDB4MDAwMSwgMHg2ODAwLAorCTB4NzA2YSwgMHgwMDc4LCAweDMxYTksIDB4NjkyMCwgMHhhMThkLCAweDAwMDEsIDB4NjkyMiwgMHg2ODAwLAorCTB4NjAwNiwgMHhhMDA1LCAweDAwYzAsIDB4MzE5ZCwgMHg2MDAyLCAweDY4MWMsIDB4YTA4NCwgMHgwMDBlLAorCTB4MDA0MCwgMHgzMWE5LCAweDcwMTQsIDB4NjhiYSwgMHg3MTMwLCAweGExODgsIDB4NzQwMCwgMHgwMDc4LAorCTB4MzFhYiwgMHgyMDA5LCAweDc1MDAsIDB4MjEwNCwgMHg2ODAyLCAweDJkMGEsIDB4NzE2MiwgMHg2ZWI2LAorCTB4YTY4NCwgMHgwMDYwLCAweDAwNDAsIDB4MzIwOCwgMHhhNjg0LCAweDA4MDAsIDB4MDBjMCwgMHgzMWMzLAorCTB4YTY4NCwgMHg3ZmZmLCAweDY4YjYsIDB4Njg5NCwgMHg2OGE2LCAweDY4OTgsIDB4NjhhYSwgMHgxMDc4LAorCTB4NDc3NiwgMHgwMDc4LCAweDMyMDgsIDB4YTY4NCwgMHgwMDIwLCAweDAwNDAsIDB4MzFkOCwgMHg2OGMwLAorCTB4YTAwNSwgMHgwMDQwLCAweDMxY2YsIDB4MTA3OCwgMHg0Yjc4LCAweDAwNzgsIDB4MzFkMiwgMHhhMDA2LAorCTB4MTA3OCwgMHg0YjMwLCAweDc5ZDgsIDB4N2FkYywgMHg2OWFhLCAweDZhYTYsIDB4MDA3OCwgMHgzMWRlLAorCTB4MTA3OCwgMHgzN2ZjLCAweDY5YWEsIDB4NmFhNiwgMHgxMDc4LCAweDRiMzAsIDB4YTY4NCwgMHg4MDAwLAorCTB4MDA0MCwgMHgzMjA4LCAweGE2ODQsIDB4N2ZmZiwgMHg2OGI2LCAweDIwMDEsIDB4MDA3NiwgMHgxMDc4LAorCTB4MzkxOCwgMHgyMDEwLCAweDIwMDEsIDB4MDA3OCwgMHgxMDc4LCAweDM5MTgsIDB4MjAwOCwgMHhhNjg0LAorCTB4MDAyMCwgMHgwMGMwLCAweDMyMDAsIDB4MjAwMSwgMHgwMDdhLCAweDEwNzgsIDB4MzkxOCwgMHg4MDFiLAorCTB4MDBjOCwgMHgzMWZiLCAweDgwMDAsIDB4YTA4NCwgMHgwMDNmLCAweGExMDgsIDB4YTI5MSwgMHgwMDAwLAorCTB4NmI5OCwgMHgyMTAwLCAweGEzMDIsIDB4NjhiMiwgMHg2Yjk0LCAweDIyMDAsIDB4YTMwMywgMHg2OGFlLAorCTB4MDA3OCwgMHgyNDgyLCAweDAwNzgsIDB4MzZhZCwgMHg3MDM3LCAweDAwMDAsIDB4YTI4MiwgMHgwMDA2LAorCTB4MDA1MCwgMHgzMjE0LCAweDEwNzgsIDB4MjNlYiwgMHg3MDAwLCAweGEwODQsIDB4MDAwNywgMHgxMGMwLAorCTB4MzliZSwgMHgyMzAwLCAweDAwNzksIDB4MzIxYywgMHgzMjFmLCAweDMyNDgsIDB4MzI1YywgMHgyMjAwLAorCTB4MDA3OSwgMHgzMjIyLCAweDMyNDYsIDB4MzZhZCwgMHgzMjI4LCAweDMyNDYsIDB4MzI3OCwgMHgzMmJhLAorCTB4NzAwMywgMHgwMDA1LCAweDIwMDEsIDB4NzYxMCwgMHgyMDY4LCAweDcwNGEsIDB4MTU3ZSwgMHgyMGE5LAorCTB4MDAzMSwgMHgyMDAzLCAweDAwMDAsIDB4ODAwMCwgMHgwMDcwLCAweDMyMzgsIDB4MDA3OCwgMHgzMjMxLAorCTB4MTU3ZiwgMHhhZDgwLCAweDAwMDksIDB4NzAzNiwgMHg2ODE3LCAweDAwMDAsIDB4NjhiNywgMHgwNzAwLAorCTB4NjgyMywgMHgwODAwLCAweDY4MjcsIDB4MDAwMywgMHgwMDc4LCAweDM2OWQsIDB4MTA3OCwgMHgyM2ViLAorCTB4NzAwMywgMHgwMDA1LCAweDIwMDEsIDB4NzYxMCwgMHgyMDY4LCAweDcwNGEsIDB4YWQ4MCwgMHgwMDA5LAorCTB4NzAzNiwgMHgyMjAwLCAweDAwNzksIDB4MzI1NCwgMHgzNmFkLCAweDMyNWEsIDB4MzI1YSwgMHgzMjc4LAorCTB4MzI1YSwgMHgzNmFkLCAweDEwNzgsIDB4MjNlYiwgMHg3MDAzLCAweDAwMDUsIDB4MjAwMSwgMHg3NjEwLAorCTB4MjA2OCwgMHg3MDRhLCAweGFkODAsIDB4MDAwOSwgMHg3MDM2LCAweDIyMDAsIDB4MDA3OSwgMHgzMjY4LAorCTB4MzI3MCwgMHgzMjZlLCAweDMyNmUsIDB4MzI3MCwgMHgzMjZlLCAweDMyNzAsIDB4MTA3OCwgMHgyM2ViLAorCTB4MTA3OCwgMHgzNmQxLCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDU5LAorCTB4NzAwMywgMHgwMDAyLCAweDdhODAsIDB4YTI5NCwgMHgwZjAwLCAweDc4OWIsIDB4MDAxOCwgMHg3Y2E4LAorCTB4YTQ4NCwgMHgwMDFmLCAweGEyMTUsIDB4MjA2OSwgMHg3NTAwLCAweDJkMDQsIDB4MmQwOCwgMHg3MTYyLAorCTB4MjA2OCwgMHhhMDA1LCAweDAwNDAsIDB4MzI5MywgMHg2ODE0LCAweGEyMDYsIDB4MDA0MCwgMHgzMmFmLAorCTB4NjgwMCwgMHgwMDc4LCAweDMyODYsIDB4NzAwMywgMHgwMDA1LCAweDIwMDEsIDB4NzYxMCwgMHgyMDY4LAorCTB4NzA0YSwgMHg3MDM2LCAweDE1N2UsIDB4MjBhOSwgMHgwMDMxLCAweDIwMDMsIDB4MDAwMCwgMHg4MDAwLAorCTB4MDA3MCwgMHgzMmE0LCAweDAwNzgsIDB4MzI5ZCwgMHgxNTdmLCAweGFkODAsIDB4MDAwOSwgMHg3MDM2LAorCTB4NmExNiwgMHg2OGI3LCAweDA3MDAsIDB4NjgyMywgMHgwODAwLCAweDY4MjcsIDB4MDAwMywgMHg2ZWI0LAorCTB4N2U1YSwgMHg2ODIwLCAweGEwODQsIDB4MGMwMCwgMHgwMDQwLCAweDMzMDksIDB4MTA3OCwgMHgzNmM5LAorCTB4MDA3OCwgMHgzMzA5LCAweDcwMDMsIDB4MDAwMiwgMHg3YTgwLCAweGEyOTQsIDB4MGYwMCwgMHg3ODliLAorCTB4MDAxOCwgMHg3Y2E4LCAweGE0ODQsIDB4MDAxZiwgMHhhMjE1LCAweDc5YTgsIDB4NzlhOCwgMHhhMThjLAorCTB4MDBmZiwgMHhhMWU4LCAweDc0MDAsIDB4MmQwNCwgMHgyZDA4LCAweDcxNjIsIDB4MjA2OCwgMHhhMDA1LAorCTB4MDA0MCwgMHgzMmQ5LCAweDY4MTQsIDB4YTIwNiwgMHgwMDQwLCAweDMyZjQsIDB4NjgwMCwgMHgwMDc4LAorCTB4MzJjYywgMHg3MDAzLCAweDAwMDUsIDB4MjAwMSwgMHg3NjEwLCAweDIwNjgsIDB4NzA0YSwgMHgxNTdlLAorCTB4MjBhOSwgMHgwMDMxLCAweDIwMDMsIDB4MDAwMCwgMHg4MDAwLCAweDAwNzAsIDB4MzJlOSwgMHgwMDc4LAorCTB4MzJlMiwgMHgxNTdmLCAweGFkODAsIDB4MDAwOSwgMHg3MDM2LCAweDZhMTYsIDB4NjhiNywgMHgwNzAwLAorCTB4NjgyMywgMHgwODAwLCAweDY4MjcsIDB4MDAwMywgMHg2ZWI0LCAweDdlNWEsIDB4NjgyMCwgMHhhMDg0LAorCTB4MGMwMCwgMHgwMDQwLCAweDMzMDksIDB4YTA4NCwgMHgwODAwLCAweDAwNDAsIDB4MzMwMywgMHgxMDc4LAorCTB4MzZjZCwgMHgwMDc4LCAweDMzMDksIDB4MTA3OCwgMHgzNmM5LCAweDcwOGIsIDB4MDAwMCwgMHgwMDc4LAorCTB4MzMwOSwgMHgwMjdlLCAweDgyMDcsIDB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLAorCTB4YTA4MCwgMHg1MzgwLCAweDIwNjAsIDB4NzA1NiwgMHg2MDAwLCAweDcwNWEsIDB4NjAwNCwgMHg3MDVlLAorCTB4YTY4NCwgMHgwMDYwLCAweDAwNDAsIDB4MzM2MSwgMHg2Yjk4LCAweDZjOTQsIDB4NjlhYywgMHg2OGIwLAorCTB4YTEwNSwgMHgwMGMwLCAweDMzNDMsIDB4N2JkMiwgMHg3YmRhLCAweDdjZDYsIDB4N2NkZSwgMHhhNmI0LAorCTB4YjdmZiwgMHg3ZTVhLCAweGE2ODQsIDB4MDA2MCwgMHhhMDg2LCAweDAwNjAsIDB4MDA0MCwgMHgzMzYxLAorCTB4NjhjMCwgMHhhMDA1LCAweDAwNDAsIDB4MzMzYywgMHg3MDAzLCAweDAwMDMsIDB4NjgyYiwgMHgwMDAwLAorCTB4MTA3OCwgMHg0YTI5LCAweDAwNzgsIDB4MzMzZSwgMHgxMDc4LCAweDRhM2EsIDB4YTZiNSwgMHgyMDAwLAorCTB4N2U1YSwgMHgwMDc4LCAweDMzNjEsIDB4NjhiMCwgMHhhMzFhLCAweDIxMDAsIDB4YTQyMywgMHgyNDAwLAorCTB4YTMwNSwgMHgwMDQwLCAweDMzNjEsIDB4N2JkMiwgMHg3YmRhLCAweDdjZDYsIDB4N2NkZSwgMHg2OGIwLAorCTB4YTZiNCwgMHhiZmZmLCAweDdlNWEsIDB4MDA3ZSwgMHg2OGMwLCAweGEwMDUsIDB4MDA3ZiwgMHgwMDQwLAorCTB4MzM1ZiwgMHg3MDAzLCAweDAwMDMsIDB4MTA3OCwgMHg0YTI5LCAweDAwNzgsIDB4MzM2MSwgMHgxMDc4LAorCTB4NGE4NSwgMHgwNzdmLCAweDEwNzgsIDB4MzdlZiwgMHgyMDA5LCAweDAwNjUsIDB4YTY4NCwgMHgwMDA0LAorCTB4MDA0MCwgMHgzMzgyLCAweDc4ZTQsIDB4YTA4NCwgMHgwMDMwLCAweDAwNDAsIDB4MzM3YSwgMHg3OGVjLAorCTB4YTA4NCwgMHgwMDAzLCAweDAwNDAsIDB4MzM3YSwgMHg3ODJiLCAweDMwMDgsIDB4MjAwOSwgMHgwMDY1LAorCTB4MDA3OCwgMHgzMzgyLCAweDBmN2UsIDB4MjA3OSwgMHg1MTAwLCAweDEwNzgsIDB4NDc3NiwgMHgwZjdmLAorCTB4MDA0MCwgMHgyNDgyLCAweDc5MWEsIDB4MmQwMCwgMHg3MDRhLCAweDgyMDcsIDB4YTA4NCwgMHgwMDBmLAorCTB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTA4MCwgMHg1MzgwLCAweDIwNDgsIDB4MDA3OCwgMHgyNDU5LAorCTB4NjAyMCwgMHhhMDA1LCAweDAwNDAsIDB4MzM5YywgMHg4MDAxLCAweDYwMjIsIDB4NjAwOCwgMHhhMDg1LAorCTB4MDAwOCwgMHg2MDBhLCAweDcwMTAsIDB4NjAyNiwgMHgwMDdjLCAweGEwMDYsIDB4MTA3OCwgMHg0Nzc2LAorCTB4NjgxNywgMHgwMDAwLCAweDY4MWIsIDB4MDAwMSwgMHg2ODIzLCAweDAwNDAsIDB4NjgxZiwgMHgwMTAwLAorCTB4NzAwMCwgMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHgzM2FkLCAweDI0ODIsIDB4MzNiNywgMHgzM2I3LAorCTB4MzNkNCwgMHgzM2JmLCAweDMzYmQsIDB4MzNiZiwgMHgzM2I1LCAweDEwNzgsIDB4MjNlYiwgMHgxMDc4LAorCTB4MzNkZiwgMHgxMDc4LCAweDMzZDgsIDB4MTA3OCwgMHgxYzcwLCAweDAwNzgsIDB4MjQ4MiwgMHg3MDZjLAorCTB4NzA2ZiwgMHgwMDAwLCAweDcwOTMsIDB4MDAwMCwgMHgwMDc5LCAweDMzYzYsIDB4MzNkMCwgMHgzM2QwLAorCTB4MzNjZSwgMHgzM2NlLCAweDMzY2UsIDB4MzNkMCwgMHgzM2NlLCAweDMzZDAsIDB4MDA3OSwgMHgyODYxLAorCTB4NzA2ZiwgMHgwMDAwLCAweDAwNzgsIDB4MjQ4MiwgMHg2ODFiLCAweDAwMDAsIDB4MDA3OCwgMHgyZjE3LAorCTB4NjgwMCwgMHhhMDA1LCAweDAwYzAsIDB4MzNkZCwgMHg2MDAyLCAweDYwMDYsIDB4MDA3YywgMHg2MDEwLAorCTB4YTAwNSwgMHgwMDQwLCAweDMzZTgsIDB4ODAwMSwgMHgwMGQwLCAweDMzZTgsIDB4MTA3OCwgMHgyM2ViLAorCTB4NjAxMiwgMHg2MDA4LCAweGEwODQsIDB4ZmZlZiwgMHg2MDBhLCAweDAwN2MsIDB4NjAxOCwgMHhhMDA1LAorCTB4MDA0MCwgMHgzM2Y0LCAweDgwMDEsIDB4NjAxYSwgMHgwMDdjLCAweDEwNzgsIDB4MzkxMiwgMHg2ODFiLAorCTB4MDAxOCwgMHgwMDc4LCAweDM0MmIsIDB4MTA3OCwgMHgzOTEyLCAweDY4MWIsIDB4MDAxOSwgMHgwMDc4LAorCTB4MzQyYiwgMHgxMDc4LCAweDM5MTIsIDB4NjgxYiwgMHgwMDFhLCAweDAwNzgsIDB4MzQyYiwgMHgxMDc4LAorCTB4MzkxMiwgMHg2ODFiLCAweDAwMDMsIDB4MDA3OCwgMHgzNDJiLCAweDc3ODAsIDB4MTA3OCwgMHgzN2VmLAorCTB4NzE4NCwgMHhhMThjLCAweDAwZmYsIDB4YTFlOCwgMHg3NDAwLCAweDJkMDQsIDB4MmQwOCwgMHgyMDY4LAorCTB4YTAwNSwgMHgwMGMwLCAweDM0MWQsIDB4MDA3OCwgMHgyNDgyLCAweDY4MTQsIDB4NzI4MCwgMHhhMjA2LAorCTB4MDA0MCwgMHgzNDI1LCAweDY4MDAsIDB4MDA3OCwgMHgzNDE2LCAweDY4MDAsIDB4MjAwYSwgMHg2ODFiLAorCTB4MDAwNSwgMHg3MDhiLCAweDAwMDAsIDB4MTA3OCwgMHgzM2RmLCAweDY4MjAsIDB4YTA4NCwgMHgwMDAxLAorCTB4MDBjMCwgMHgzNDM0LCAweDEwNzgsIDB4MzNkOCwgMHgxMDc4LCAweDMzZWUsIDB4NjgxZiwgMHgwMDAwLAorCTB4NjgyMywgMHgwMDIwLCAweDEwNzgsIDB4MWM3MCwgMHgwMDc4LCAweDI0ODIsIDB4YTI4MiwgMHgwMDAzLAorCTB4MDBjMCwgMHgzNjlkLCAweDdkYTgsIDB4YTVhYywgMHgwMGZmLCAweDdjYTgsIDB4YTRhNCwgMHgwMGZmLAorCTB4NjkyMCwgMHhhMThkLCAweDAwODAsIDB4NjkyMiwgMHhhMTg0LCAweDAxMDAsIDB4MDA0MCwgMHgzNGEyLAorCTB4YTE4YywgMHhmZWZmLCAweDY5MjIsIDB4YTRhNCwgMHgwMGZmLCAweDAwNDAsIDB4MzQ4YywgMHhhNDgyLAorCTB4MDAwYywgMHgwMDQ4LCAweDM0NWYsIDB4MDA0MCwgMHgzNDVmLCAweDIwMjEsIDB4MDAwYywgMHg4NTJiLAorCTB4ODUyYiwgMHgxMDc4LCAweDM3NjAsIDB4MDA0MCwgMHgzNDY5LCAweDEwNzgsIDB4MzU1YiwgMHgwMDc4LAorCTB4MzQ5NSwgMHgxMDc4LCAweDM3MWIsIDB4MGM3ZSwgMHgyOTYwLCAweDYwMDQsIDB4YTA4NCwgMHhmZmY1LAorCTB4NjAwNiwgMHgxMDc4LCAweDM1ODYsIDB4MGM3ZiwgMHg2OTIwLCAweGExOGQsIDB4MDEwMCwgMHg2OTIyLAorCTB4N2U1OCwgMHhhNmI1LCAweDAwMDQsIDB4N2U1YSwgMHhhNjg0LCAweDA0MDAsIDB4MDBjMCwgMHgzNDg2LAorCTB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA1NiwgMHgwMDc4LCAweDI0NTksIDB4NzgyYiwgMHgzMDA4LAorCTB4NzgxYiwgMHgwMDY1LCAweDAwNzgsIDB4MjQ1OSwgMHgwYzdlLCAweDI5NjAsIDB4NjAwNCwgMHhhMDg0LAorCTB4ZmZmNSwgMHg2MDA2LCAweDEwNzgsIDB4MzU4NiwgMHgwYzdmLCAweDdlNTgsIDB4YTY4NCwgMHgwNDAwLAorCTB4MDBjMCwgMHgzNDllLCAweDc4MWIsIDB4MDA1OCwgMHgwMDc4LCAweDI0NTksIDB4NzgxYiwgMHgwMDY1LAorCTB4MDA3OCwgMHgyNDU5LCAweDBjN2UsIDB4NzA1NCwgMHgyMDYwLCAweDYxMDAsIDB4YTE4YywgMHgxMDAwLAorCTB4MDA0MCwgMHgzNGUyLCAweDYyMDgsIDB4ODIxNywgMHhhMjk0LCAweDAwZmYsIDB4YTI4MiwgMHgwMDBjLAorCTB4MDA0OCwgMHgzNGI2LCAweDAwNDAsIDB4MzRiNiwgMHgyMDExLCAweDAwMGMsIDB4MjQwMCwgMHhhMjAyLAorCTB4MDBjOCwgMHgzNGJiLCAweDIyMjAsIDB4NjIwOCwgMHhhMjk0LCAweDAwZmYsIDB4NzAxOCwgMHhhMDg2LAorCTB4MDAyOCwgMHgwMGMwLCAweDM0Y2IsIDB4YTI4MiwgMHgwMDE5LCAweDAwYzgsIDB4MzRkMSwgMHgyMDExLAorCTB4MDAxOSwgMHgwMDc4LCAweDM0ZDEsIDB4YTI4MiwgMHgwMDBjLCAweDAwYzgsIDB4MzRkMSwgMHgyMDExLAorCTB4MDAwYywgMHgyMjAwLCAweGE1MDIsIDB4MDBjOCwgMHgzNGQ2LCAweDIyMjgsIDB4MTA3OCwgMHgzNzFmLAorCTB4ODUyYiwgMHg4NTJiLCAweDEwNzgsIDB4Mzc2MCwgMHgwMDQwLCAweDM0ZTIsIDB4MTA3OCwgMHgzNTViLAorCTB4MDA3OCwgMHgzNGU2LCAweDEwNzgsIDB4MzcxYiwgMHgxMDc4LCAweDM1ODYsIDB4Nzg1OCwgMHhhMDg1LAorCTB4MDAwNCwgMHg3ODVhLCAweDBjN2YsIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LAorCTB4MjQ1OSwgMHgwYzdlLCAweDI5NjAsIDB4NjAwMCwgMHhhMDg0LCAweDEwMDAsIDB4MDBjMCwgMHgzNTA5LAorCTB4NjAxMCwgMHhhMDg0LCAweDAwMGYsIDB4MDBjMCwgMHgzNTAzLCAweDYxMDQsIDB4YTE4YywgMHhmZmY1LAorCTB4NjEwNiwgMHgwYzdmLCAweDAwN2MsIDB4MjAxMSwgMHgwMDMyLCAweDIwMTksIDB4MDAwMCwgMHgwMDc4LAorCTB4MzUzMCwgMHg2OGEwLCAweGEwODQsIDB4MDIwMCwgMHgwMGMwLCAweDM1MDMsIDB4NjIwOCwgMHhhMjk0LAorCTB4MDBmZiwgMHg3MDE4LCAweGEwODYsIDB4MDAyOCwgMHgwMGMwLCAweDM1MWUsIDB4YTI4MiwgMHgwMDE5LAorCTB4MDBjOCwgMHgzNTI0LCAweDIwMTEsIDB4MDAxOSwgMHgwMDc4LCAweDM1MjQsIDB4YTI4MiwgMHgwMDBjLAorCTB4MDBjOCwgMHgzNTI0LCAweDIwMTEsIDB4MDAwYywgMHg2MzA4LCAweDgzMWYsIDB4YTM5YywgMHgwMGZmLAorCTB4YTM4MiwgMHgwMDBjLCAweDAwNDgsIDB4MzUzMCwgMHgwMDQwLCAweDM1MzAsIDB4MjAxOSwgMHgwMDBjLAorCTB4NzhhYiwgMHgwMDAxLCAweDc4YWIsIDB4MDAwMywgMHg3OGFiLCAweDAwMDEsIDB4N2FhYSwgMHg3YmFhLAorCTB4YThjMCwgMHgwMDA1LCAweDY4MjAsIDB4YTA4NSwgMHgwMTAwLCAweDY4MjIsIDB4MGM3ZiwgMHgwMDdjLAorCTB4MGM3ZSwgMHgyOTYwLCAweGExOGMsIDB4ZmZmNSwgMHg2MTA2LCAweDIwMTEsIDB4MDAzMiwgMHgyMDE5LAorCTB4MDAwMCwgMHgwMDc4LCAweDM1NGIsIDB4NzhhYiwgMHgwMDAxLCAweDc4YWIsIDB4MDAwMywgMHg3OGFiLAorCTB4MDAwMSwgMHg3YWFhLCAweDdiYWEsIDB4YThjMCwgMHgwMDA1LCAweDY4MjAsIDB4YTA4NSwgMHgwMTAwLAorCTB4NjgyMiwgMHgwYzdmLCAweDAwN2MsIDB4MGM3ZSwgMHg3MTU0LCAweDIxNjAsIDB4MTA3OCwgMHgzNTYyLAorCTB4MGM3ZiwgMHgwMDdjLCAweDIwMDgsIDB4YTA4NCwgMHhmZmYwLCAweGE0MjUsIDB4N2M4NiwgMHg2MDE4LAorCTB4Nzg5YSwgMHg3Y2FlLCAweDY0MTIsIDB4NzhhNCwgMHhhMDg0LCAweGZmZjgsIDB4YTE4YywgMHgwMDA3LAorCTB4YTEwNSwgMHg3OGE2LCAweDYwMTYsIDB4Nzg4YSwgMHhhNGE0LCAweDAwMGYsIDB4ODQyNywgMHg4MjA0LAorCTB4ODAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTQwNSwgMHg2MDBlLCAweDc4ZWMsIDB4ZDA4YywgMHgwMGMwLAorCTB4MzU4NSwgMHg2MDA0LCAweGEwODQsIDB4ZmZmNSwgMHg2MDA2LCAweDAwN2MsIDB4MGM3ZSwgMHg3MDU0LAorCTB4MjA2MCwgMHgxMDc4LCAweDM1OGQsIDB4MGM3ZiwgMHgwMDdjLCAweDYwMTgsIDB4Nzg5YSwgMHg3OGE0LAorCTB4YTA4NCwgMHhmZmYwLCAweDc4YTYsIDB4NjAxMiwgMHg3ODg0LCAweGEwODQsIDB4ZmZmMCwgMHg3ODg2LAorCTB4MDA3YywgMHhhMjgyLCAweDAwMDIsIDB4MDBjMCwgMHgzNjlkLCAweDdhYTgsIDB4NjkyMCwgMHhhMThkLAorCTB4MDA4MCwgMHg2OTIyLCAweGExODQsIDB4MDIwMCwgMHgwMDQwLCAweDM1ZTIsIDB4YTE4YywgMHhmZGZmLAorCTB4NjkyMiwgMHhhMjk0LCAweDAwZmYsIDB4YTI4MiwgMHgwMDAyLCAweDAwYzgsIDB4MzY5ZCwgMHgxMDc4LAorCTB4MzYyYiwgMHgxMDc4LCAweDM1ODYsIDB4YTk4MCwgMHgwMDAxLCAweDIwMGMsIDB4MTA3OCwgMHgzN2ViLAorCTB4MTA3OCwgMHgzNGYxLCAweDg4ZmYsIDB4MDA0MCwgMHgzNWQ1LCAweDc4OWIsIDB4MDA2MCwgMHgyODAwLAorCTB4NzhhYSwgMHg3ZTU4LCAweGE2YjUsIDB4MDAwNCwgMHg3ZTVhLCAweGE2ODQsIDB4MDQwMCwgMHgwMGMwLAorCTB4MzVjZiwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDU2LCAweDAwNzgsIDB4MjQ1OSwgMHg3ODJiLAorCTB4MzAwOCwgMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDU5LCAweDdlNTgsIDB4YTY4NCwgMHgwNDAwLAorCTB4MDBjMCwgMHgzNWRlLCAweDc4MWIsIDB4MDA1OCwgMHgwMDc4LCAweDI0NTksIDB4NzgxYiwgMHgwMDY1LAorCTB4MDA3OCwgMHgyNDU5LCAweGEyODIsIDB4MDAwMiwgMHgwMGM4LCAweDM1ZWEsIDB4YTI4NCwgMHgwMDAxLAorCTB4MDA0MCwgMHgzNWY0LCAweDcxNTQsIDB4YTE4OCwgMHgwMDAwLCAweDIxMGMsIDB4YTE4YywgMHgyMDAwLAorCTB4MDBjMCwgMHgzNWY0LCAweDIwMTEsIDB4MDAwMCwgMHgxMDc4LCAweDM3MGQsIDB4MTA3OCwgMHgzNjJiLAorCTB4MTA3OCwgMHgzNTg2LCAweDc4NTgsIDB4YTA4NSwgMHgwMDA0LCAweDc4NWEsIDB4NzgyYiwgMHgzMDA4LAorCTB4NzgxYiwgMHgwMDY1LCAweDAwNzgsIDB4MjQ1OSwgMHgwYzdlLCAweDAyN2UsIDB4Mjk2MCwgMHg2MDAwLAorCTB4MjAxMSwgMHgwMDAxLCAweGEwODQsIDB4MjAwMCwgMHgwMGMwLCAweDM2MWIsIDB4NjAxNCwgMHhhMDg0LAorCTB4MDA0MCwgMHgwMGMwLCAweDM2MTksIDB4YTE4YywgMHhmZmVmLCAweDYxMDYsIDB4YTAwNiwgMHgwMDc4LAorCTB4MzYyOCwgMHgyMDExLCAweDAwMDAsIDB4NzhhYiwgMHgwMDAxLCAweDc4YWIsIDB4MDAwMiwgMHg3OGFiLAorCTB4MDAwMywgMHg3YWFhLCAweGE4YzAsIDB4MDAwNCwgMHg2ODIwLCAweGEwODUsIDB4MDIwMCwgMHg2ODIyLAorCTB4MDI3ZiwgMHgwYzdmLCAweDAwN2MsIDB4MGM3ZSwgMHg3MDU0LCAweDIwNjAsIDB4MTA3OCwgMHgzNjMyLAorCTB4MGM3ZiwgMHgwMDdjLCAweDgyZmYsIDB4MDA0MCwgMHgzNjM3LCAweDIwMTEsIDB4MDA0MCwgMHg2MDE4LAorCTB4YTA4MCwgMHgwMDAyLCAweDc4OWEsIDB4NzhhNCwgMHhhMDg0LCAweGZmYmYsIDB4YTIwNSwgMHg3OGE2LAorCTB4Nzg4YSwgMHg2MDE2LCAweDc4ZWMsIDB4ZDA4YywgMHgwMGMwLCAweDM2NGEsIDB4NjAwNCwgMHhhMDg0LAorCTB4ZmZlZiwgMHg2MDA2LCAweDAwN2MsIDB4MDA3ZSwgMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMDQwLAorCTB4MzY1NCwgMHgwMDdmLCAweDAwNzgsIDB4MzY1NywgMHgwMDdmLCAweDAwNzgsIDB4MzY5OSwgMHhhNjg0LAorCTB4MDAyMCwgMHgwMDQwLCAweDM2OTksIDB4Nzg4OCwgMHhhMDg0LCAweDAwNDAsIDB4MDA0MCwgMHgzNjk5LAorCTB4N2JiOCwgMHhhMzg0LCAweDAwM2YsIDB4ODMxYiwgMHgwMGM4LCAweDM2NjcsIDB4ODAwMCwgMHhhMDA1LAorCTB4MDA0MCwgMHgzNjdkLCAweDgzMWIsIDB4MDBjOCwgMHgzNjcwLCAweDgwMDEsIDB4MDA0MCwgMHgzNjk1LAorCTB4YTY4NCwgMHg0MDAwLCAweDAwNDAsIDB4MzY3ZCwgMHg3OGI4LCAweDgwMWIsIDB4MDBjOCwgMHgzNjc5LAorCTB4ODAwMCwgMHhhMDg0LCAweDAwM2YsIDB4MDBjMCwgMHgzNjk1LCAweGE2YjQsIDB4YmZmZiwgMHg3ZTVhLAorCTB4NzlkOCwgMHg3YWRjLCAweDIwMDEsIDB4MDAwMSwgMHhhMTA4LCAweDAwYzgsIDB4MzY4OSwgMHhhMjkxLAorCTB4MDAwMCwgMHg3OWQyLCAweDc5ZGEsIDB4N2FkNiwgMHg3YWRlLCAweDEwNzgsIDB4NGIzMCwgMHg3ODFiLAorCTB4MDA2NCwgMHgxMDc4LCAweDQ5YjUsIDB4MDA3OCwgMHgyNDU5LCAweDc4MWIsIDB4MDA2NCwgMHgwMDc4LAorCTB4MjQ1OSwgMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDU5LCAweDEwNzgsIDB4MzZkNSwgMHg3ODJiLAorCTB4MzAwOCwgMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDU5LCAweDEwNzgsIDB4MzZjMSwgMHg3ODJiLAorCTB4MzAwOCwgMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDU5LCAweDY4MjcsIDB4MDAwMiwgMHgxMDc4LAorCTB4MzZjOSwgMHg3OGU0LCAweGEwODQsIDB4MDAzMCwgMHgwMDQwLCAweDI0ODIsIDB4NzhlYywgMHhhMDg0LAorCTB4MDAwMywgMHgwMDQwLCAweDI0ODIsIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LAorCTB4MjQ1OSwgMHgyMDAxLCAweDAwMDUsIDB4MDA3OCwgMHgzNmQ3LCAweDIwMDEsIDB4MDAwYywgMHgwMDc4LAorCTB4MzZkNywgMHgyMDAxLCAweDAwMDYsIDB4MDA3OCwgMHgzNmQ3LCAweDIwMDEsIDB4MDAwZCwgMHgwMDc4LAorCTB4MzZkNywgMHgyMDAxLCAweDAwMDksIDB4MDA3OCwgMHgzNmQ3LCAweDIwMDEsIDB4MDAwNywgMHg3ODliLAorCTB4MDAxMCwgMHg3OGFhLCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLCAweDAwMDEsIDB4YTZiNSwgMHgwMDA0LAorCTB4N2U1YSwgMHgwMDdjLCAweDA3N2UsIDB4ODczZiwgMHhhN2JjLCAweDAwMGYsIDB4ODczYiwgMHg4NzNiLAorCTB4ODcwMywgMHhhMGUwLCAweDUzODAsIDB4YTdiOCwgMHgwMDIwLCAweDdmOWEsIDB4NzlhNCwgMHhhMTg0LAorCTB4MDAwZiwgMHgwMDQwLCAweDM2ZmIsIDB4YTE4NCwgMHhmZmYwLCAweDc4YTYsIDB4NjAxMiwgMHg2MDA0LAorCTB4YTA4NSwgMHgwMDA4LCAweDYwMDYsIDB4ODczOCwgMHg4NzM4LCAweDdmOWEsIDB4NzlhNCwgMHhhMTg0LAorCTB4MDA0MCwgMHgwMDQwLCAweDM3MGIsIDB4YTE4NCwgMHhmZmJmLCAweDc4YTYsIDB4NjAxNiwgMHg2MDA0LAorCTB4YTA4NSwgMHgwMDEwLCAweDYwMDYsIDB4MDc3ZiwgMHgwMDdjLCAweDc4OWIsIDB4MDAxMCwgMHg3OGFiLAorCTB4MDAwMSwgMHg3OGFiLCAweDAwMDIsIDB4NzhhYiwgMHgwMDAzLCAweDdhYWEsIDB4Nzg5YiwgMHgwMDYwLAorCTB4NzhhYiwgMHgwMDA0LCAweDAwN2MsIDB4MjAyMSwgMHgwMDAwLCAweDIwMjksIDB4MDAzMiwgMHg3ODliLAorCTB4MDAxMCwgMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwgMHgwMDAzLCAweDc4YWIsIDB4MDAwMSwgMHg3ZGFhLAorCTB4N2NhYSwgMHg3ODliLCAweDAwNjAsIDB4NzhhYiwgMHgwMDA1LCAweDAwN2MsIDB4MTU3ZSwgMHg4MDA3LAorCTB4YTA4NCwgMHgwMGZmLCAweDgwMDMsIDB4ODAwMywgMHhhMDgwLCAweDAwMjAsIDB4Nzg5YSwgMHg3OWE0LAorCTB4YTE4YywgMHhmZmYwLCAweDIwMDEsIDB4NTE0NiwgMHgyMDA0LCAweGEwODIsIDB4MDAyOCwgMHgwMDQwLAorCTB4Mzc0OSwgMHgyMDIxLCAweDM3ZDIsIDB4MjAxOSwgMHgwMDE0LCAweDIwYTksIDB4MDAwYywgMHgwMDc4LAorCTB4Mzc0ZiwgMHgyMDIxLCAweDM3ZGUsIDB4MjAxOSwgMHgwMDE5LCAweDIwYTksIDB4MDAwZCwgMHgyMDExLAorCTB4MDA2NCwgMHgyNDA0LCAweGEwODQsIDB4ZmZmMCwgMHhhMTA2LCAweDAwNDAsIDB4Mzc1ZSwgMHg4NDIwLAorCTB4MjMwMCwgMHhhMjEwLCAweDAwNzAsIDB4Mzc1ZSwgMHgwMDc4LCAweDM3NTEsIDB4MTU3ZiwgMHgwMDdjLAorCTB4MTU3ZSwgMHgyMDA5LCAweDUxNDYsIDB4MjEwYywgMHhhMTgyLCAweDAwMzIsIDB4MDA0OCwgMHgzNzc0LAorCTB4MDA0MCwgMHgzNzc4LCAweDIwMDksIDB4MzdjNCwgMHgyMDE5LCAweDAwMTEsIDB4MjBhOSwgMHgwMDBlLAorCTB4MjAxMSwgMHgwMDMyLCAweDAwNzgsIDB4Mzc4YSwgMHhhMTgyLCAweDAwMjgsIDB4MDA0MCwgMHgzNzgyLAorCTB4MjAwOSwgMHgzN2QyLCAweDIwMTksIDB4MDAxNCwgMHgyMGE5LCAweDAwMGMsIDB4MjAxMSwgMHgwMDY0LAorCTB4MDA3OCwgMHgzNzhhLCAweDIwMDksIDB4MzdkZSwgMHgyMDE5LCAweDAwMTksIDB4MjBhOSwgMHgwMDBkLAorCTB4MjAxMSwgMHgwMDY0LCAweDIyMDAsIDB4YTUwMiwgMHgwMDQwLCAweDM3OWEsIDB4MDA0OCwgMHgzNzlhLAorCTB4ODEwOCwgMHgyMzAwLCAweGEyMTAsIDB4MDA3MCwgMHgzNzk3LCAweDAwNzgsIDB4Mzc4YSwgMHgxNTdmLAorCTB4YTAwNiwgMHgwMDdjLCAweDE1N2YsIDB4YTU4MiwgMHgwMDY0LCAweDAwYzgsIDB4MzdhOSwgMHg3ODA4LAorCTB4YTA4NSwgMHgwMDcwLCAweDc4MGEsIDB4NzA0NCwgMHhhMDg1LCAweDAwNzAsIDB4NzA0NiwgMHgwMDc4LAorCTB4MzdhOSwgMHg3OGVjLCAweGEwODQsIDB4MDMwMCwgMHgwMDQwLCAweDM3YjEsIDB4MjEwNCwgMHgwMDc4LAorCTB4MzdjMiwgMHgyMTA0LCAweGEwOWUsIDB4MTEwMiwgMHgwMGMwLCAweDM3YzIsIDB4MjAwMSwgMHgwNGZkLAorCTB4MjAwNCwgMHhhMDgyLCAweDAwMDUsIDB4MDA0OCwgMHgzN2MxLCAweDIwMDEsIDB4MTIwMSwgMHgwMDc4LAorCTB4MzdjMiwgMHgyMTA0LCAweGEwMDUsIDB4MDA3YywgMHgxMTAyLCAweDMwMDIsIDB4MzIwMiwgMHg0MjAzLAorCTB4NDQwMywgMHg1NDA0LCAweDU2MDQsIDB4NjYwNSwgMHg2ODA1LCAweDc4MDYsIDB4N2EwNiwgMHgwYzA3LAorCTB4MGMwNywgMHgwZTA3LCAweDMyMDIsIDB4NDIwMiwgMHg1MjAyLCAweDYyMDIsIDB4NzIwMiwgMHg2NjA1LAorCTB4NzYwNSwgMHg3ODA1LCAweDdhMDUsIDB4N2MwNSwgMHg3ZTA1LCAweDdmMDUsIDB4MjIwMiwgMHgzMjAyLAorCTB4NDIwMiwgMHg1MjAyLCAweDU0MDQsIDB4NjQwNCwgMHg3NDA0LCAweDc2MDQsIDB4NzgwNCwgMHg3YTA0LAorCTB4N2MwNCwgMHg3ZTA0LCAweDdmMDQsIDB4Nzg5YiwgMHgwMDEwLCAweGEwNDYsIDB4MDA3YywgMHhhNzg0LAorCTB4MGYwMCwgMHg4MDBiLCAweGE3ODQsIDB4MDAxZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLAorCTB4YTEwNSwgMHhhMGUwLCAweDU0MDAsIDB4MDA3YywgMHg3OWQ4LCAweDdhZGMsIDB4NzhkMCwgMHg4MDFiLAorCTB4MDBjOCwgMHgzODAzLCAweDgwMDAsIDB4YTA4NCwgMHgwMDNmLCAweGExMDgsIDB4YTI5MSwgMHgwMDAwLAorCTB4MDA3YywgMHgwZjdlLCAweDIwNzksIDB4MDEwMCwgMHgyMDA5LCAweDUxNDAsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjEwNCwgMHgwMDc5LCAweDM4MTMsIDB4Mzg0OSwgMHgzODFkLCAweDM4MWQsIDB4MzgxZCwgMHgzODFkLAorCTB4MzgxZCwgMHgzODFkLCAweDM4NGQsIDB4MTA3OCwgMHgyM2ViLCAweDc4NGIsIDB4MDAwNCwgMHg3ODQ4LAorCTB4YTA4NCwgMHgwMDA0LCAweDAwYzAsIDB4MzgxZiwgMHg3ODRiLCAweDAwMDgsIDB4Nzg0OCwgMHhhMDg0LAorCTB4MDAwOCwgMHgwMGMwLCAweDM4MjYsIDB4NjhiNCwgMHhhMDg1LCAweDQwMDAsIDB4NjhiNiwgMHg3ODU4LAorCTB4YTA4NSwgMHg0MDAwLCAweDc4NWEsIDB4NzgzMCwgMHhhMDg0LCAweDAwODAsIDB4MDBjMCwgMHgzODQ5LAorCTB4MDAxOCwgMHgzODQ5LCAweDY4MWMsIDB4YTA4NCwgMHgwMDIwLCAweDAwYzAsIDB4Mzg0NywgMHgwZTdlLAorCTB4MjA3MSwgMHg1MTQwLCAweDEwNzgsIDB4Mzg5YywgMHgwZTdmLCAweDAwNzgsIDB4Mzg0OSwgMHg3ODFiLAorCTB4MDBjZCwgMHgyMDkxLCAweDgwMDEsIDB4MGY3ZiwgMHgwMDdjLCAweDcwYjMsIDB4MDAwMCwgMHgxMDc4LAorCTB4M2E3NiwgMHgwMDc4LCAweDM4NDksIDB4MGM3ZSwgMHg2ODE0LCAweDgwMDcsIDB4YTA4NCwgMHgwMDBmLAorCTB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTBlMCwgMHg1MzgwLCAweDYwMDQsIDB4YTA4NCwgMHgwMDBhLAorCTB4MDBjMCwgMHgzODg2LCAweDYxMDgsIDB4YTE5NCwgMHhmZjAwLCAweDAwNDAsIDB4Mzg4NiwgMHhhMThjLAorCTB4MDBmZiwgMHgyMDAxLCAweDAwMTksIDB4YTEwNiwgMHgwMDQwLCAweDM4NzUsIDB4MjAwMSwgMHgwMDMyLAorCTB4YTEwNiwgMHgwMDQwLCAweDM4NzksIDB4MDA3OCwgMHgzODdkLCAweDIwMDksIDB4MDAyMCwgMHgwMDc4LAorCTB4Mzg3ZiwgMHgyMDA5LCAweDAwM2YsIDB4MDA3OCwgMHgzODdmLCAweDIwMTEsIDB4MDAwMCwgMHgyMTAwLAorCTB4YTIwNSwgMHg2MDBhLCAweDYwMDQsIDB4YTA4NSwgMHgwMDAyLCAweDYwMDYsIDB4MGM3ZiwgMHgwMDdjLAorCTB4NzgxYiwgMHgwMDY1LCAweDAwNzgsIDB4MjQ1OSwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDY1LAorCTB4MDA3OCwgMHgyNDU5LCAweDc4MWIsIDB4MDA1OCwgMHgwMDc4LCAweDI0NTksIDB4NzgyYiwgMHgzMDA4LAorCTB4NzgxYiwgMHgwMDU2LCAweDAwNzgsIDB4MjQ1OSwgMHgyMDA5LCAweDUxMjAsIDB4MjEwYywgMHhhMTg2LAorCTB4MDAwMCwgMHgwMDQwLCAweDM4YjAsIDB4YTE4NiwgMHgwMDAxLCAweDAwNDAsIDB4MzhiMywgMHgyMDA5LAorCTB4NTEzOCwgMHgyMDBiLCAweDAwMGIsIDB4NzA2ZiwgMHgwMDAxLCAweDc4MWIsIDB4MDA0OCwgMHgwMDdjLAorCTB4NzgxYiwgMHgwMGM3LCAweDAwN2MsIDB4MjAwOSwgMHg1MTM4LCAweDIwMGIsIDB4MDAwYSwgMHgwMDdjLAorCTB4MjAwOSwgMHg1MTIwLCAweDIxMGMsIDB4YTE4NiwgMHgwMDAwLCAweDAwNDAsIDB4MzhkMywgMHhhMTg2LAorCTB4MDAwMSwgMHgwMDQwLCAweDM4Y2QsIDB4MjAwOSwgMHg1MTM4LCAweDIwMGIsIDB4MDAwYiwgMHg3MDZmLAorCTB4MDAwMSwgMHg3ODFiLCAweDAwNDgsIDB4MDA3OCwgMHgyNDU5LCAweDIwMDksIDB4NTEzOCwgMHgyMDBiLAorCTB4MDAwYSwgMHgwMDc4LCAweDI0NTksIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDBjNywgMHgwMDc4LAorCTB4MjQ1OSwgMHg3ODFiLCAweDAwY2QsIDB4MDA3OCwgMHgyNDU5LCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLAorCTB4MDBjZCwgMHgwMDc4LCAweDI0NTksIDB4NzgxYiwgMHgwMDhlLCAweDAwNzgsIDB4MjQ1OSwgMHg3ODJiLAorCTB4MzAwOCwgMHg3ODFiLCAweDAwOGUsIDB4MDA3OCwgMHgyNDU5LCAweDY4MTgsIDB4YTA4NCwgMHg4MDAwLAorCTB4MDA0MCwgMHgzOGY0LCAweDY4MWIsIDB4MDAxZCwgMHg3MDZmLCAweDAwMDEsIDB4NzgxYiwgMHgwMDQ4LAorCTB4MDA3OCwgMHgyNDU5LCAweDAwN2UsIDB4NzgzMCwgMHhhMDg0LCAweDAwYzAsIDB4MDBjMCwgMHgzOTEwLAorCTB4NzgwOCwgMHhhMDg0LCAweGZmZmMsIDB4NzgwYSwgMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LAorCTB4NzhlYywgMHhhMDg0LCAweDAwMjEsIDB4MDA0MCwgMHgzOTEwLCAweDcwNDQsIDB4NzgwYSwgMHhhMDA1LAorCTB4MDA3ZiwgMHgwMDdjLCAweDcwNDQsIDB4YTA4NSwgMHgwMDAyLCAweDcwNDYsIDB4NzgwYSwgMHgwMDdjLAorCTB4MDA3ZSwgMHg3ODMwLCAweGEwODQsIDB4MDA0MCwgMHgwMGMwLCAweDM5MTksIDB4MDA5OCwgMHgzOTI0LAorCTB4MDA3ZiwgMHg3ODlhLCAweDc4YWMsIDB4MDA3YywgMHg3ODA4LCAweGEwODQsIDB4ZmZmZCwgMHg3ODBhLAorCTB4MDAwNSwgMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHg3OGVjLCAweGEwODQsIDB4MDAyMSwgMHgwMDQwLAorCTB4MzkzMywgMHgwMDk4LCAweDM5MzEsIDB4MDA3ZiwgMHg3ODlhLCAweDc4YWMsIDB4MDA3ZSwgMHg3MDQ0LAorCTB4NzgwYSwgMHgwMDdmLCAweDAwN2MsIDB4NzhlYywgMHhhMDg0LCAweDAwMDIsIDB4MDBjMCwgMHg0NzYwLAorCTB4YTc4NCwgMHgwMDdkLCAweDAwYzAsIDB4Mzk0NywgMHgyNzAwLCAweDEwNzgsIDB4MjNlYiwgMHhhNzg0LAorCTB4MDAwMSwgMHgwMGMwLCAweDJmNmQsIDB4YTc4NCwgMHgwMDcwLCAweDAwNDAsIDB4Mzk1NywgMHgwYzdlLAorCTB4MmQ2MCwgMHgyZjY4LCAweDEwNzgsIDB4MjM5NiwgMHgyZDc4LCAweDJjNjgsIDB4MGM3ZiwgMHhhNzg0LAorCTB4MDAwOCwgMHgwMDQwLCAweDM5NjQsIDB4Nzg0YiwgMHgwMDA4LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLAorCTB4MDA0MCwgMHgyNDgyLCAweDAwNzgsIDB4Mzg4OCwgMHhhNzg0LCAweDAwMDQsIDB4MDA0MCwgMHgzOTk3LAorCTB4NzhiOCwgMHhhMDg0LCAweDQwMDEsIDB4MDA0MCwgMHgzOTk3LCAweDc4NGIsIDB4MDAwOCwgMHg3OGVjLAorCTB4YTA4NCwgMHgwMDAzLCAweDAwNDAsIDB4MjQ4MiwgMHg3OGU0LCAweGEwODQsIDB4MDAwNywgMHhhMDg2LAorCTB4MDAwMSwgMHgwMGMwLCAweDM5OTcsIDB4NzhjMCwgMHhhMDg1LCAweDQ4MDAsIDB4MjAzMCwgMHg3ZTVhLAorCTB4NzgxYiwgMHgwMGNkLCAweDAwNzgsIDB4MjQ1OSwgMHg3ODRiLCAweDAwMDgsIDB4NjgxOCwgMHhhMDg0LAorCTB4ODAwMCwgMHgwMDQwLCAweDM5OTMsIDB4NjgxYiwgMHgwMDE1LCAweGE2ODQsIDB4NDAwMCwgMHgwMDQwLAorCTB4Mzk5MywgMHg2ODFiLCAweDAwMDcsIDB4MTA3OCwgMHgzODljLCAweDAwNzgsIDB4MjQ1OSwgMHg2ODFiLAorCTB4MDAwMywgMHg3ODU4LCAweGEwODQsIDB4M2YwMCwgMHg2ODFlLCAweDY4MmYsIDB4MDAwMCwgMHg2ODMzLAorCTB4MDAwMCwgMHg3ODRiLCAweDAwMDgsIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MDA0MCwgMHgyOTY1LAorCTB4MDAxOCwgMHgyNDU5LCAweDAwNzgsIDB4MzZhNSwgMHg2YjE0LCAweDgzMDcsIDB4YTA4NCwgMHgwMDBmLAorCTB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTA4MCwgMHg1MzgwLCAweDIwNjAsIDB4MjA0OCwgMHg3MDU2LAorCTB4NjAwMCwgMHg3MDVhLCAweDYwMDQsIDB4NzA1ZSwgMHgyYTYwLCAweDAwN2MsIDB4MDA3OSwgMHgzOWMwLAorCTB4MzljOCwgMHgzOWM5LCAweDM5YzgsIDB4MzljYiwgMHgzOWM4LCAweDM5YzgsIDB4MzljOCwgMHgzOWQwLAorCTB4MDA3YywgMHgxMDc4LCAweDMzZWUsIDB4MTA3OCwgMHg0Nzc2LCAweDcwMzgsIDB4NjAwYSwgMHgwMDdjLAorCTB4NzBhMCwgMHhhMDA1LCAweDAwNDAsIDB4MzlkZCwgMHgyMDY4LCAweDEwNzgsIDB4MWI2MiwgMHgxMDc4LAorCTB4NDZmOCwgMHgxMDc4LCAweDQ2ZmYsIDB4NzBhMywgMHgwMDAwLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDcxLCAweDUxNDAsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDcsIDB4MDBjMCwgMHgzOWY0LAorCTB4NjExMCwgMHg3MGJjLCAweGExMDYsIDB4MDBjMCwgMHgzOWY0LCAweDBlN2YsIDB4MTA3OCwgMHgxYjZmLAorCTB4MTA3OCwgMHgzOWZhLCAweGEwMDYsIDB4MDA3YywgMHgyMDkxLCAweDgwMDEsIDB4MGU3ZiwgMHhhMDg1LAorCTB4MDAwMSwgMHgwMDdjLCAweDBmN2UsIDB4MGU3ZSwgMHgyMDcxLCAweDUxNDAsIDB4MDA3OCwgMHgyMWZhLAorCTB4Nzg1YiwgMHgwMDAwLCAweDcwYWYsIDB4MDAwZSwgMHgyMDA5LCAweDAxMDAsIDB4MDE3ZSwgMHg3MGEwLAorCTB4YTA2ZCwgMHgwMDQwLCAweDNhMGYsIDB4NzBhMywgMHgwMDAwLCAweDAwNzgsIDB4M2ExNSwgMHg3MGIzLAorCTB4MDAwMCwgMHgxMDc4LCAweDFiOGIsIDB4MDA0MCwgMHgzYTFiLCAweDcwYWMsIDB4NjgyNiwgMHgxMDc4LAorCTB4M2FmOCwgMHgwMDc4LCAweDNhMGYsIDB4MDE3ZiwgMHgxNTdlLCAweDBjN2UsIDB4MGQ3ZSwgMHgyMGE5LAorCTB4MDAwOCwgMHgyMDYxLCAweDc1MTAsIDB4NjAwMCwgMHhhMTA1LCAweDYwMDIsIDB4NjAxYywgMHhhMDZkLAorCTB4MDA0MCwgMHgzYTMzLCAweDY4MDAsIDB4NjAxZSwgMHgxMDc4LCAweDE5NWEsIDB4NjAwOCwgMHg4MDAwLAorCTB4NjAwYSwgMHgwMDc4LCAweDNhMjYsIDB4NjAxOCwgMHhhMDZkLCAweDAwNDAsIDB4M2EzZCwgMHg2ODAwLAorCTB4NjAxYSwgMHgxMDc4LCAweDE5NWEsIDB4MDA3OCwgMHgzYTMzLCAweGFjZTAsIDB4MDAwOCwgMHgwMDcwLAorCTB4M2E0MywgMHgwMDc4LCAweDNhMjMsIDB4NzA5YywgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgzYTRhLAorCTB4MTA3OCwgMHgzYjcyLCAweDBkN2YsIDB4MGM3ZiwgMHgxNTdmLCAweDAwN2MsIDB4MTI3ZSwgMHgyMDkxLAorCTB4MjMwMCwgMHg2ODA0LCAweGEwODQsIDB4MDAwZiwgMHgwMDc5LCAweDNhNTYsIDB4M2E2NiwgMHgzYTY2LAorCTB4M2E2NiwgMHgzYTY2LCAweDNhNjYsIDB4M2E2NiwgMHgzYTY4LCAweDNhNmUsIDB4M2E2NiwgMHgzYTY2LAorCTB4M2E2NiwgMHgzYTY2LCAweDNhNjYsIDB4M2E3MCwgMHgzYTY2LCAweDNhNjgsIDB4MTA3OCwgMHgyM2ViLAorCTB4MTA3OCwgMHg0NGQwLCAweDEwNzgsIDB4MTk1YSwgMHgwMDc4LCAweDNhNzQsIDB4NjgyNywgMHgwMDBiLAorCTB4MTA3OCwgMHg0NGQwLCAweDEwNzgsIDB4M2FmOCwgMHgxMjdmLCAweDAwN2MsIDB4MTI3ZSwgMHgyMDkxLAorCTB4MjMwMCwgMHgwMDk4LCAweDNhOTIsIDB4NzgzMCwgMHhhMDg0LCAweDAwYzAsIDB4MDBjMCwgMHgzYTkyLAorCTB4MGQ3ZSwgMHgxMDc4LCAweDQ3MDgsIDB4MmQwMCwgMHg2ODJlLCAweDIwMDksIDB4MDAwNCwgMHgyMDAxLAorCTB4MDAwMCwgMHg2ODI3LCAweDAwODQsIDB4MTA3OCwgMHg0NmMxLCAweDEwNzgsIDB4M2FmOCwgMHgwZDdmLAorCTB4MDA3OCwgMHgzYWM2LCAweDc5NDgsIDB4YTE4NSwgMHg0MDAwLCAweDc4NGEsIDB4MDA5OCwgMHgzYTliLAorCTB4Nzk0YSwgMHgwMDc4LCAweDNhODAsIDB4NzgyOCwgMHhhMDg2LCAweDE4MzQsIDB4MDBjMCwgMHgzYWE0LAorCTB4YTE4NSwgMHgwMDA0LCAweDAwNzgsIDB4M2FhYiwgMHg3ODI4LCAweGEwODYsIDB4MTgxNCwgMHgwMGMwLAorCTB4M2E5OCwgMHhhMTg1LCAweDAwMGMsIDB4Nzg0YSwgMHg3ODliLCAweDAwMGUsIDB4NzhhYiwgMHgwMDAyLAorCTB4Nzg1OCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NSwgMHgwNDAwLCAweDc4NWEsIDB4NzBiNCwgMHhhMDgwLAorCTB4MDA5MSwgMHg3ODFhLCAweDY4MjcsIDB4MDI4NCwgMHg2ODJjLCAweDY4MzYsIDB4NjgzMCwgMHg2ODNhLAorCTB4MjAwOSwgMHgwMDA0LCAweDIwMDEsIDB4MDAwMCwgMHgxMDc4LCAweDQ2YzEsIDB4MTI3ZiwgMHgwMDdjLAorCTB4MGQ3ZSwgMHg2YjE0LCAweDEwNzgsIDB4MWJmZCwgMHgwMDQwLCAweDNhZDUsIDB4MjA2OCwgMHg2ODI3LAorCTB4MDAwMiwgMHgxMDc4LCAweDNhZjgsIDB4MDA3OCwgMHgzYWNhLCAweDBkN2YsIDB4MDA3YywgMHgwZDdlLAorCTB4NmIxNCwgMHg2YzI4LCAweGE0YTQsIDB4MDBmZiwgMHgxMDc4LCAweDFiOWIsIDB4MDA0MCwgMHgzYWU1LAorCTB4MjA2OCwgMHg2ODI3LCAweDAwMDIsIDB4MTA3OCwgMHgzYWY4LCAweDBkN2YsIDB4MDA3YywgMHgwZDdlLAorCTB4NmIxNCwgMHhhMzljLCAweDAwZmYsIDB4MTA3OCwgMHgxYmNlLCAweDAwNDAsIDB4M2FmNiwgMHgyMDY4LAorCTB4NjgyNywgMHgwMDAyLCAweDEwNzgsIDB4M2FmOCwgMHgwMDc4LCAweDNhZWIsIDB4MGQ3ZiwgMHgwMDdjLAorCTB4MGM3ZSwgMHg2OTE0LCAweDEwNzgsIDB4M2I2OSwgMHg2OTA0LCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LAorCTB4MDAwNiwgMHgwMDQwLCAweDNiMTMsIDB4YTE4NiwgMHgwMDBkLCAweDAwNDAsIDB4M2IzMiwgMHhhMTg2LAorCTB4MDAxNywgMHgwMGMwLCAweDNiMGYsIDB4MTA3OCwgMHgxOTVhLCAweDAwNzgsIDB4M2IxMSwgMHgxMDc4LAorCTB4MWM3MiwgMHgwYzdmLCAweDAwN2MsIDB4NjAwNCwgMHg4MDAxLCAweDAwNDgsIDB4M2IzMCwgMHg2MDA2LAorCTB4MjAwOSwgMHgwMDAwLCAweGE2ODQsIDB4MDAwMSwgMHgwMGMwLCAweDNiMjAsIDB4YTE4ZCwgMHg4MDAwLAorCTB4YTY4NCwgMHgwMDA0LCAweDAwNDAsIDB4M2IyNiwgMHhhMThkLCAweDAwMDIsIDB4NjkxZSwgMHg2ODIzLAorCTB4MDAwMCwgMHg3MTA0LCAweDgxMGYsIDB4NjgxOCwgMHhhMTA1LCAweDY4MWEsIDB4MDA3OCwgMHgzYjBmLAorCTB4MTA3OCwgMHgyM2ViLCAweDYwMTgsIDB4YTAwNSwgMHgwMGMwLCAweDNiNDEsIDB4NjAwOCwgMHg4MDAxLAorCTB4MDA0OCwgMHgzYjQxLCAweDYwMGEsIDB4NjAxYywgMHg2ODAyLCAweDJkMDAsIDB4NjAxZSwgMHgwMDc4LAorCTB4M2I1NywgMHhhYzg4LCAweDAwMDYsIDB4MjEwNCwgMHhhMDA1LCAweDAwNDAsIDB4M2I0YSwgMHgyMDA4LAorCTB4MDA3OCwgMHgzYjQzLCAweDY4MDIsIDB4MmQwYSwgMHg2MDA4LCAweDgwMDEsIDB4MDA0OCwgMHgzYjExLAorCTB4NjAwYSwgMHg2MDE4LCAweDIwNjgsIDB4NjgwMCwgMHg2MDFhLCAweDAwNzgsIDB4M2IzYiwgMHgxNTdlLAorCTB4MTM3ZSwgMHgxNDdlLCAweDBjN2UsIDB4MGQ3ZSwgMHgxMDc4LCAweDE5MzcsIDB4MmRhMCwgMHgxMzdmLAorCTB4MjBhOSwgMHgwMDMxLCAweDUzYTMsIDB4MGM3ZiwgMHgxNDdmLCAweDEzN2YsIDB4MTU3ZiwgMHgwMDc4LAorCTB4M2IwZiwgMHhhMTg0LCAweDAwMWYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTA4MCwgMHg3NTEwLAorCTB4MjA2MCwgMHgwMDdjLCAweDIwMTksIDB4NTE1MSwgMHgyMzA0LCAweGEwODUsIDB4MDAwMSwgMHgyMDFhLAorCTB4MjAxOSwgMHgwMTAyLCAweDIzMDQsIDB4YTA4NSwgMHgwMDAxLCAweDIwMWEsIDB4MDA3YywgMHgyMDE5LAorCTB4NTE1MSwgMHgyMzA0LCAweGEwODQsIDB4ZmZmZSwgMHgyMDFhLCAweDIwMTksIDB4MDEwMiwgMHgyMzA0LAorCTB4YTA4NCwgMHhmZmZlLCAweDIwMWEsIDB4MDA3YywgMHg3OTkwLCAweGExOGMsIDB4ZmZmOCwgMHg3OTkyLAorCTB4NzBiNCwgMHhhMDgwLCAweDAwZGQsIDB4NzgxYSwgMHgwMDc4LCAweDI0NTksIDB4NzBhMywgMHgwMDAwLAorCTB4NzAwMywgMHgwMDAwLCAweDcwNDMsIDB4MDAwMSwgMHg3MDM3LCAweDAwMDAsIDB4MDAxOCwgMHgyNDEwLAorCTB4MTA3OCwgMHgxYjhiLCAweDAwNDAsIDB4M2JjNywgMHgyMDA5LCAweDUxMGYsIDB4MjAwYiwgMHgwMDAwLAorCTB4NjhiYywgMHgyMDYwLCAweDYxMDAsIDB4YTE4NCwgMHgwMzAwLCAweDAwNDAsIDB4M2JiYiwgMHg2ODI3LAorCTB4MDAwZSwgMHhhMDg0LCAweDAyMDAsIDB4MDA0MCwgMHgzYmI3LCAweDY4MjcsIDB4MDAxNywgMHgxMDc4LAorCTB4M2FmOCwgMHgwMDc4LCAweDNiOTYsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDcsIDB4MDBjMCwgMHgzYzI5LAorCTB4MmQwMCwgMHg3MGEyLCAweGFkODAsIDB4MDAwZiwgMHg3MDM2LCAweDAwNzgsIDB4M2JjZSwgMHg3MDQwLAorCTB4YTA4NiwgMHgwMDAxLCAweDAwNDAsIDB4MjQ5MiwgMHgwMDc4LCAweDI0NTksIDB4MjAzMSwgMHgwMDAwLAorCTB4NjkxYywgMHhhMTg0LCAweDAwMDIsIDB4MDA0MCwgMHgzYmQ3LCAweGE2YjUsIDB4MDAwNCwgMHhhMTg0LAorCTB4MDBjMCwgMHg4MDAzLCAweDgwMDMsIDB4ODAwNywgMHhhMDgwLCAweDNjYzIsIDB4MjAwNCwgMHhhNjM1LAorCTB4NjgyMCwgMHhhMDg0LCAweDA0MDAsIDB4MDA0MCwgMHgzYmVmLCAweDc4OWIsIDB4MDAxOCwgMHg3OGFiLAorCTB4MDAwMywgMHg3ODliLCAweDAwODEsIDB4NzhhYiwgMHgwMDAxLCAweGE2YjUsIDB4MTAwMCwgMHg2ODIwLAorCTB4YTA4NCwgMHg4MDAwLCAweDAwYzAsIDB4M2JmZCwgMHg2ODFjLCAweGEwODQsIDB4ODAwMCwgMHgwMGMwLAorCTB4M2MwNCwgMHhhNmI1LCAweDA4MDAsIDB4MDA3OCwgMHgzYzA0LCAweGE2YjUsIDB4MDQwMCwgMHg3ODliLAorCTB4MDAwZSwgMHg2ODI0LCAweDgwMDcsIDB4NzhhYSwgMHg2ODIwLCAweGEwODQsIDB4MDEwMCwgMHgwMDQwLAorCTB4M2MwYiwgMHhhNmI1LCAweDQwMDAsIDB4YTY4NCwgMHgwMjAwLCAweDAwNDAsIDB4M2MyNSwgMHg2ODJjLAorCTB4NzhkMiwgMHg2ODMwLCAweDc4ZDYsIDB4YTY4NCwgMHgwMTAwLCAweDAwNDAsIDB4M2MyMywgMHg2ODJjLAorCTB4YTA4NCwgMHgwMDAxLCAweDAwNDAsIDB4M2MyMywgMHg3ODg4LCAweGEwODQsIDB4MDA0MCwgMHgwMDQwLAorCTB4M2MyMywgMHhhNmI1LCAweDgwMDAsIDB4MTA3OCwgMHg0NmYwLCAweDdlNWEsIDB4NmViNiwgMHgwMDc4LAorCTB4NDcyNywgMHgxMDc4LCAweDM4ZmEsIDB4MDBjMCwgMHgzY2JjLCAweDcwMmMsIDB4ODAwNCwgMHgwMDQ4LAorCTB4M2MzNywgMHgyMDE5LCAweDRlM2IsIDB4MTA3OCwgMHgyMjc2LCAweDcwMmYsIDB4MDAwMSwgMHgyMDQxLAorCTB4MDAwMSwgMHgyMDMxLCAweDEwMDAsIDB4Nzg5YiwgMHgwMDE4LCAweDY4MTQsIDB4YTA4NCwgMHgwMDFmLAorCTB4YTA4NSwgMHgwMDgwLCAweDc4YWEsIDB4NjkxYywgMHhhMTg0LCAweDAwMDIsIDB4MDA0MCwgMHgzYzUwLAorCTB4YTZiNSwgMHgwMDA0LCAweDc4YWIsIDB4MDAyMCwgMHg2ODI4LCAweDc4YWEsIDB4YThjMCwgMHgwMDAyLAorCTB4NjgxYywgMHhkMGY0LCAweDAwNDAsIDB4M2M1OSwgMHgyYzUwLCAweDEwNzgsIDB4MzlhYywgMHgxMDc4LAorCTB4NDVmZiwgMHg2ODIwLCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDNjNjcsIDB4YTZiNSwgMHgwNDAwLAorCTB4Nzg5YiwgMHgwMDBlLCAweDY4MjQsIDB4ODAwNywgMHg3OGFhLCAweDAwNzgsIDB4M2M2ZSwgMHg2ODFjLAorCTB4YTA4NCwgMHg4MDAwLCAweDAwYzAsIDB4M2M2ZSwgMHhhNmI1LCAweDA4MDAsIDB4NjgyMCwgMHhhMDg0LAorCTB4MDEwMCwgMHgwMDQwLCAweDNjNzUsIDB4YTZiNSwgMHg0MDAwLCAweDY4MWMsIDB4YTA4NCwgMHgwMGMwLAorCTB4ODAwMywgMHg4MDAzLCAweDgwMDcsIDB4YTA4MCwgMHgzY2MyLCAweDIwMDQsIDB4YTYzNSwgMHhhNjg0LAorCTB4MDEwMCwgMHgwMDQwLCAweDNjOGYsIDB4NjgyYywgMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgzYzhmLAorCTB4Nzg4OCwgMHhhMDg0LCAweDAwNDAsIDB4MDA0MCwgMHgzYzhmLCAweGE2YjUsIDB4ODAwMCwgMHg3ODliLAorCTB4MDA3ZSwgMHg3ZWFlLCAweDZlYjYsIDB4NjgxNCwgMHg4MDA3LCAweDc4YWEsIDB4Nzg4MiwgMHgyODEwLAorCTB4N2FhYSwgMHg3ODMwLCAweGEwODQsIDB4MDBjMCwgMHgwMGMwLCAweDNjYmMsIDB4MDAxOCwgMHgzY2JjLAorCTB4NzBiNCwgMHhhMDgwLCAweDAwZTIsIDB4NzgxYSwgMHgxMDc4LCAweDM5MTIsIDB4YTY4NCwgMHgwMjAwLAorCTB4MDA0MCwgMHgzY2IwLCAweDY4MmMsIDB4NzhkMiwgMHg2ODMwLCAweDc4ZDYsIDB4MTA3OCwgMHg0NmYwLAorCTB4MmQwMCwgMHg3MGEyLCAweDcwNGEsIDB4NjgxMCwgMHg3MGJlLCAweDcwMDMsIDB4MDAwNywgMHhhZDgwLAorCTB4MDAwZiwgMHg3MDM2LCAweDAwNzgsIDB4MjQ1OSwgMHgxMDc4LCAweDFiNjIsIDB4MTA3OCwgMHgzOTEyLAorCTB4MDA3OCwgMHgyNDU5LCAweDAwMDAsIDB4MDMwMCwgMHgwMjAwLCAweDAwMDAsIDB4MTA3OCwgMHgyM2ViLAorCTB4MjMwMCwgMHgwMDc5LCAweDNjY2IsIDB4M2NjZSwgMHgzY2NlLCAweDNjZDAsIDB4MTA3OCwgMHgyM2ViLAorCTB4MTA3OCwgMHg0NmZmLCAweDY5MjQsIDB4YTE4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwYSwgMHgwMDQwLAorCTB4M2NlMiwgMHhhMTg0LCAweGZmMDAsIDB4YTA4NSwgMHgwMDBhLCAweDY4MjYsIDB4MTA3OCwgMHgxYjYyLAorCTB4MDA3OCwgMHgzYjk2LCAweDIwMDEsIDB4MDAwYSwgMHgxMDc4LCAweDQ2OTEsIDB4MDA3OCwgMHgzYjk2LAorCTB4YTI4MiwgMHgwMDA1LCAweDAwNTAsIDB4M2NlZSwgMHgxMDc4LCAweDIzZWIsIDB4NzAwMCwgMHhhMDg0LAorCTB4MDAwNywgMHgxMGMwLCAweDM5YmUsIDB4MTA3OCwgMHgxOTM3LCAweDAwYzAsIDB4M2QwZCwgMHhhNjg0LAorCTB4MDAwNCwgMHgwMDQwLCAweDNjZmYsIDB4MjAwMSwgMHgyODAwLCAweDAwNzgsIDB4M2QwMSwgMHgyMDAxLAorCTB4MDgwMCwgMHg3MWI0LCAweGExODgsIDB4MDA5MSwgMHg3ODliLCAweDAwMGUsIDB4NzhhYSwgMHgyMDMxLAorCTB4MDQwMCwgMHg3ZTVhLCAweDc5MWEsIDB4MDA3OCwgMHgyNDU5LCAweDY4MDcsIDB4MDEwNiwgMHg2ODBiLAorCTB4MDAwMCwgMHg2ODlmLCAweDAwMDAsIDB4NjgyNywgMHgwMDAwLCAweGEzODYsIDB4MDAwMiwgMHgwMGMwLAorCTB4M2QyZSwgMHhhMjg2LCAweDAwMDIsIDB4MDBjMCwgMHgzZDJlLCAweDc4YTAsIDB4YTAwNSwgMHgwMGMwLAorCTB4M2QyZSwgMHhhNDg0LCAweDgwMDAsIDB4MDBjMCwgMHgzZDJlLCAweDc4ZTQsIDB4YTA4NCwgMHgwMDA4LAorCTB4MDA0MCwgMHgzZDJlLCAweGE2YjUsIDB4MDAwOCwgMHgyMDE5LCAweDAwMDAsIDB4MTA3OCwgMHg0MTFlLAorCTB4MmQwMCwgMHg3MGEyLCAweDcwNGEsIDB4NzAwMywgMHgwMDA3LCAweDcwMzcsIDB4MDAwMCwgMHg2ODI0LAorCTB4YTA4NCwgMHgwMDgwLCAweDAwNDAsIDB4M2Q0MCwgMHgxMDc4LCAweDQxZDAsIDB4MDA3OCwgMHgyNDU5LAorCTB4MjMwMCwgMHgwMDc5LCAweDNkNDMsIDB4M2Q0NiwgMHgzZGM3LCAweDNkZTYsIDB4MjIwMCwgMHgwMDc5LAorCTB4M2Q0OSwgMHgzZDRlLCAweDNkNWUsIDB4M2Q4NCwgMHgzZDkwLCAweDNkYjMsIDB4MjAyOSwgMHgwMDAxLAorCTB4YTAyNiwgMHgyMDExLCAweDAwMDAsIDB4MTA3OCwgMHg0MmYxLCAweDAwNzksIDB4M2Q1NywgMHgzZDVjLAorCTB4MjQ1OSwgMHgzYjk2LCAweDNkNWMsIDB4M2Q1YywgMHgxMDc4LCAweDIzZWIsIDB4Nzk5MCwgMHhhMThjLAorCTB4MDAwNywgMHgwMGMwLCAweDNkNjUsIDB4MjAwOSwgMHgwMDA4LCAweDIwMTEsIDB4MDAwMSwgMHhhNjg0LAorCTB4MDAwNCwgMHgwMDQwLCAweDNkNmQsIDB4MjAxMSwgMHgwMDAzLCAweDIyMjAsIDB4YTEyYSwgMHgyMDExLAorCTB4MDAwMSwgMHgxMDc4LCAweDQyZjEsIDB4MDA3OSwgMHgzZDc1LCAweDNkN2EsIDB4MjQ1OSwgMHgzYjk2LAorCTB4M2Q4MiwgMHgzZDdjLCAweDAwNzgsIDB4NDcyZCwgMHg3MGFiLCAweDNkODAsIDB4MDA3OCwgMHgyNDU5LAorCTB4MDA3OCwgMHgzZDdhLCAweDEwNzgsIDB4MjNlYiwgMHhhNjg0LCAweDAwMTAsIDB4MDA0MCwgMHgzZDhlLAorCTB4MTA3OCwgMHg0MTlmLCAweDAwNDAsIDB4M2Q4ZSwgMHgwMDc4LCAweDI0NTksIDB4MDA3OCwgMHg0MjBjLAorCTB4NjAwMCwgMHhhMDg0LCAweDAwMDIsIDB4MDA0MCwgMHgzZGFkLCAweDcwYjQsIDB4YTA4MCwgMHgwMGQyLAorCTB4NzgxYSwgMHgwZDdlLCAweDEwNzgsIDB4NDcwOCwgMHgyZDAwLCAweDY4MmUsIDB4NjgyNywgMHgwMDAwLAorCTB4MTA3OCwgMHgzYWY4LCAweDBkN2YsIDB4MTA3OCwgMHgxOTVhLCAweDcwMDMsIDB4MDAwMCwgMHg3MDM3LAorCTB4MDAwMCwgMHg3MDRiLCAweDAwMDAsIDB4MDA3OCwgMHgzYjk2LCAweGE2ODQsIDB4MDAwNCwgMHgwMGMwLAorCTB4M2RiMywgMHgwMDc4LCAweDQ3MmQsIDB4NjAwMCwgMHhhMDg0LCAweDAwMDQsIDB4MDBjMCwgMHgzZGM1LAorCTB4NjAwMCwgMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgzZGM1LCAweDcwYWIsIDB4M2RjNSwgMHgyMDAxLAorCTB4MDAwNywgMHgxMDc4LCAweDQ2ODksIDB4MDA3OCwgMHg0NzMzLCAweDAwNzgsIDB4NDcyZCwgMHgyMjAwLAorCTB4MDA3OSwgMHgzZGNhLCAweDNkY2YsIDB4M2RjZiwgMHgzZGNmLCAweDNkZDEsIDB4M2RjZiwgMHgxMDc4LAorCTB4MjNlYiwgMHg3MGE3LCAweDNkZDUsIDB4MDA3OCwgMHg0NzM5LCAweDIwMTEsIDB4MDAxOCwgMHgxMDc4LAorCTB4NDJlYiwgMHgwMDc5LCAweDNkZGIsIDB4M2RlMCwgMHgyNDU5LCAweDNiOTYsIDB4M2RlMiwgMHgzZGU0LAorCTB4MTA3OCwgMHgyM2ViLCAweDEwNzgsIDB4MjNlYiwgMHgxMDc4LCAweDIzZWIsIDB4MjIwMCwgMHgwMDc5LAorCTB4M2RlOSwgMHgzZGVlLCAweDNkZjAsIDB4M2RmMCwgMHgzZGVlLCAweDNkZWUsIDB4MTA3OCwgMHgyM2ViLAorCTB4NzhlNCwgMHhhMDg0LCAweDAwMDgsIDB4MDA0MCwgMHgzZTA1LCAweDcwYTcsIDB4M2RmOSwgMHgwMDc4LAorCTB4NDczOSwgMHgyMDExLCAweDAwMDQsIDB4MTA3OCwgMHg0MmViLCAweDAwNzksIDB4M2RmZiwgMHgzZTA1LAorCTB4MjQ1OSwgMHgzYjk2LCAweDNlMDUsIDB4M2UwZiwgMHgzZTEzLCAweDcwYWIsIDB4M2UwZCwgMHgyMDAxLAorCTB4MDAwMywgMHgxMDc4LCAweDQ2ODksIDB4MDA3OCwgMHg0NzMzLCAweDAwNzgsIDB4NDcyZCwgMHg3MGFiLAorCTB4M2UwNSwgMHgwMDc4LCAweDI0NTksIDB4NzBhYiwgMHgzZTE3LCAweDAwNzgsIDB4MjQ1OSwgMHgwMDc4LAorCTB4M2UwZCwgMHhhMjgyLCAweDAwMDMsIDB4MDA1MCwgMHgzZTFmLCAweDEwNzgsIDB4MjNlYiwgMHhhMzg2LAorCTB4MDAwMiwgMHgwMGMwLCAweDNlMzgsIDB4YTI4NiwgMHgwMDAyLCAweDAwYzAsIDB4M2UzZSwgMHg3OGEwLAorCTB4YTAwNSwgMHgwMGMwLCAweDNlM2UsIDB4YTQ4NCwgMHg4MDAwLCAweDAwYzAsIDB4M2UzZSwgMHg3OGU0LAorCTB4YTA4NCwgMHgwMDA4LCAweDAwNDAsIDB4M2UzOCwgMHhhNmI1LCAweDAwMDgsIDB4MjAxOSwgMHgwMDAwLAorCTB4YTY4NCwgMHgwMDA4LCAweDAwNDAsIDB4M2UzZSwgMHgxMDc4LCAweDQxN2MsIDB4NjgxMCwgMHg3MGJlLAorCTB4NzAwMywgMHgwMDA3LCAweDIzMDAsIDB4MDA3OSwgMHgzZTQ1LCAweDNlNDgsIDB4M2U3NSwgMHgzZTdkLAorCTB4MjIwMCwgMHgwMDc5LCAweDNlNGIsIDB4M2U1MCwgMHgzZTRlLCAweDNlNjksIDB4MTA3OCwgMHgyM2ViLAorCTB4Nzk5MCwgMHhhMWFjLCAweDAwMDcsIDB4YTAyNiwgMHgyMDExLCAweDAwMDEsIDB4MTA3OCwgMHg0MmYxLAorCTB4MDA3OSwgMHgzZTVhLCAweDNlNWYsIDB4MjQ1OSwgMHgzYjk2LCAweDNlNjcsIDB4M2U2MSwgMHgwMDc4LAorCTB4NDcyZCwgMHg3MGFiLCAweDNlNjUsIDB4MDA3OCwgMHgyNDU5LCAweDAwNzgsIDB4M2U1ZiwgMHgxMDc4LAorCTB4MjNlYiwgMHhhNjg0LCAweDAwMTAsIDB4MDA0MCwgMHgzZTczLCAweDEwNzgsIDB4NDE5ZiwgMHgwMDQwLAorCTB4M2U3MywgMHgwMDc4LCAweDI0NTksIDB4MDA3OCwgMHg0MjBjLCAweDIyMDAsIDB4MDA3OSwgMHgzZTc4LAorCTB4M2U3YiwgMHgzZTdiLCAweDNlN2IsIDB4MTA3OCwgMHgyM2ViLCAweDIyMDAsIDB4MDA3OSwgMHgzZTgwLAorCTB4M2U4MywgMHgzZTg1LCAweDNlODUsIDB4MTA3OCwgMHgyM2ViLCAweDc4ZTQsIDB4YTA4NCwgMHgwMDA4LAorCTB4MDA0MCwgMHgzZTlhLCAweDcwYTcsIDB4M2U4ZSwgMHgwMDc4LCAweDQ3MzksIDB4MjAxMSwgMHgwMDA0LAorCTB4MTA3OCwgMHg0MmViLCAweDAwNzksIDB4M2U5NCwgMHgzZTlhLCAweDI0NTksIDB4M2I5NiwgMHgzZTlhLAorCTB4M2VhNCwgMHgzZWE4LCAweDcwYWIsIDB4M2VhMiwgMHgyMDAxLCAweDAwMDMsIDB4MTA3OCwgMHg0Njg5LAorCTB4MDA3OCwgMHg0NzMzLCAweDAwNzgsIDB4NDcyZCwgMHg3MGFiLCAweDNlOWEsIDB4MDA3OCwgMHgyNDU5LAorCTB4NzBhYiwgMHgzZWFjLCAweDAwNzgsIDB4MjQ1OSwgMHgwMDc4LCAweDNlYTIsIDB4MjMwMCwgMHgwMDc5LAorCTB4M2ViMSwgMHgzZWI2LCAweDNlYjgsIDB4M2ViNCwgMHgxMDc4LCAweDIzZWIsIDB4NzBhNCwgMHgwMDdhLAorCTB4NzBhNCwgMHgwMDdhLCAweGEyODIsIDB4MDAwMiwgMHgwMDUwLCAweDNlYzAsIDB4MTA3OCwgMHgyM2ViLAorCTB4YTY4NCwgMHgwMjAwLCAweDAwNDAsIDB4M2VjYSwgMHgxMDc4LCAweDQ2ZjgsIDB4MTA3OCwgMHg0MmQzLAorCTB4MTA3OCwgMHg0NmZmLCAweDIzMDAsIDB4MDA3OSwgMHgzZWNkLCAweDNlZDAsIDB4M2VmNCwgMHgzZjVhLAorCTB4YTI4NiwgMHgwMDAxLCAweDAwNDAsIDB4M2VkNiwgMHgxMDc4LCAweDIzZWIsIDB4YTY4NCwgMHgwMjAwLAorCTB4MDA0MCwgMHgzZWRlLCAweDEwNzgsIDB4NDZmOCwgMHgxMDc4LCAweDQ2ZmYsIDB4MjAwMSwgMHgwMDAxLAorCTB4MTA3OCwgMHg0NjkxLCAweDc4YjgsIDB4YTA4NCwgMHhjMDAxLCAweDAwNDAsIDB4M2VmMCwgMHg3ODQ4LAorCTB4YTA4NSwgMHgwMDA4LCAweDc4NGEsIDB4Nzg0OCwgMHhhMDg0LCAweDAwMDgsIDB4MDBjMCwgMHgzZWViLAorCTB4NzAwMywgMHgwMDAwLCAweDAwNzgsIDB4M2I5NiwgMHgyMjAwLCAweDAwNzksIDB4M2VmNywgMHgzZWY5LAorCTB4M2YyYSwgMHg3MGE3LCAweDNlZmQsIDB4MDA3OCwgMHg0NzM5LCAweDIwMTEsIDB4MDAwZCwgMHgxMDc4LAorCTB4NDJlYiwgMHgwMDc5LCAweDNmMDMsIDB4M2YwYSwgMHgyNDU5LCAweDNiOTYsIDB4M2YxMiwgMHgzZjFhLAorCTB4M2YyMCwgMHgzZjIyLCAweGE2YjQsIDB4MDBmZiwgMHhhNmI1LCAweDA0MDAsIDB4NmViNiwgMHg3ZTVhLAorCTB4MDA3OCwgMHg0NzI3LCAweGE2YjQsIDB4MDBmZiwgMHhhNmI1LCAweDA0MDAsIDB4NmViNiwgMHg3ZTVhLAorCTB4MDA3OCwgMHg0NzI3LCAweDcwYWIsIDB4M2YxZSwgMHgwMDc4LCAweDI0NTksIDB4MDA3OCwgMHgzZjBhLAorCTB4MTA3OCwgMHgyM2ViLCAweDcwYWIsIDB4M2YyNiwgMHgwMDc4LCAweDI0NTksIDB4MTA3OCwgMHg0NzNmLAorCTB4MDA3OCwgMHgyNDU5LCAweDcwYTcsIDB4M2YyZSwgMHgwMDc4LCAweDQ3MzksIDB4MjAxMSwgMHgwMDEyLAorCTB4MTA3OCwgMHg0MmViLCAweDAwNzksIDB4M2YzNCwgMHgzZjNhLCAweDI0NTksIDB4M2I5NiwgMHgzZjQ2LAorCTB4M2Y0ZSwgMHgzZjU0LCAweGE2YjQsIDB4MDBmZiwgMHhhNmI1LCAweDA0MDAsIDB4NmViNiwgMHg3ZTVhLAorCTB4NzBiNCwgMHhhMDgwLCAweDAwYTYsIDB4NzgxYSwgMHgwMDc4LCAweDI0NTksIDB4YTZiNCwgMHgwMGZmLAorCTB4YTZiNSwgMHgwNDAwLCAweDZlYjYsIDB4N2U1YSwgMHgwMDc4LCAweDQ3MjcsIDB4NzBhYiwgMHgzZjUyLAorCTB4MDA3OCwgMHgyNDU5LCAweDAwNzgsIDB4M2YzYSwgMHg3MGFiLCAweDNmNTgsIDB4MDA3OCwgMHgyNDU5LAorCTB4MDA3OCwgMHgzZjQ2LCAweGEyODYsIDB4MDAwMSwgMHgwMDQwLCAweDNmNjAsIDB4MTA3OCwgMHgyM2ViLAorCTB4NzBhNywgMHgzZjY0LCAweDAwNzgsIDB4NDczOSwgMHgyMDExLCAweDAwMTUsIDB4MTA3OCwgMHg0MmViLAorCTB4MDA3OSwgMHgzZjZhLCAweDNmNmYsIDB4MjQ1OSwgMHgzYjk2LCAweDNmN2QsIDB4M2Y4OSwgMHhhNmI0LAorCTB4MDBmZiwgMHhhNmI1LCAweDA0MDAsIDB4NmViNiwgMHg3ZTVhLCAweDc4M2IsIDB4MTMwMSwgMHg3MGI0LAorCTB4YTA4MCwgMHgwMGI0LCAweDc4MWEsIDB4MDA3OCwgMHgyNDU5LCAweGE2YjQsIDB4MDBmZiwgMHhhNmI1LAorCTB4MDQwMCwgMHg2ZWI2LCAweDdlNWEsIDB4NzBiNCwgMHhhMDgwLCAweDAwYTYsIDB4NzgxYSwgMHgwMDc4LAorCTB4MjQ1OSwgMHg3MGFiLCAweDNmOGQsIDB4MDA3OCwgMHgyNDU5LCAweDAwNzgsIDB4M2Y2ZiwgMHhhMjgyLAorCTB4MDAwMywgMHgwMDUwLCAweDNmOTUsIDB4MTA3OCwgMHgyM2ViLCAweDIzMDAsIDB4MDA3OSwgMHgzZjk4LAorCTB4M2Y5YiwgMHgzZmQyLCAweDQwMmQsIDB4YTI4NiwgMHgwMDAxLCAweDAwNDAsIDB4M2ZhMSwgMHgxMDc4LAorCTB4MjNlYiwgMHg2ODA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHgzZmFlLAorCTB4MTA3OCwgMHgzYWY4LCAweDcwMDMsIDB4MDAwMCwgMHgwMDc4LCAweDNiOTYsIDB4NjgzYiwgMHgwMDAwLAorCTB4NjgzNywgMHgwMDAwLCAweGE2ODQsIDB4MDIwMCwgMHgwMDQwLCAweDNmYmMsIDB4MTA3OCwgMHg0NmY4LAorCTB4MTA3OCwgMHg0MmQzLCAweDEwNzgsIDB4NDZmZiwgMHgyMDAxLCAweDAwMDEsIDB4MTA3OCwgMHg0NjkxLAorCTB4NzhiOCwgMHhhMDg0LCAweGMwMDEsIDB4MDA0MCwgMHgzZmNlLCAweDc4NDgsIDB4YTA4NSwgMHgwMDA4LAorCTB4Nzg0YSwgMHg3ODQ4LCAweGEwODQsIDB4MDAwOCwgMHgwMGMwLCAweDNmYzksIDB4NzAwMywgMHgwMDAwLAorCTB4MDA3OCwgMHgzYjk2LCAweDIyMDAsIDB4MDA3OSwgMHgzZmQ1LCAweDNmZDcsIDB4NDAwOCwgMHg3MGE3LAorCTB4M2ZkYiwgMHgwMDc4LCAweDQ3MzksIDB4MjAxMSwgMHgwMDBkLCAweDEwNzgsIDB4NDJlYiwgMHgwMDc5LAorCTB4M2ZlMSwgMHgzZmU4LCAweDI0NTksIDB4M2I5NiwgMHgzZmYwLCAweDNmZjgsIDB4M2ZmZSwgMHg0MDAwLAorCTB4YTZiNCwgMHgwMGZmLCAweGE2YjUsIDB4MDgwMCwgMHg2ZWI2LCAweDdlNWEsIDB4MDA3OCwgMHg0NzI3LAorCTB4YTZiNCwgMHgwMGZmLCAweGE2YjUsIDB4MDgwMCwgMHg2ZWI2LCAweDdlNWEsIDB4MDA3OCwgMHg0NzI3LAorCTB4NzBhYiwgMHgzZmZjLCAweDAwNzgsIDB4MjQ1OSwgMHgwMDc4LCAweDNmZTgsIDB4MTA3OCwgMHgyM2ViLAorCTB4NzBhYiwgMHg0MDA0LCAweDAwNzgsIDB4MjQ1OSwgMHgxMDc4LCAweDQ3M2YsIDB4MDA3OCwgMHgyNDU5LAorCTB4NzBhNywgMHg0MDBjLCAweDAwNzgsIDB4NDczOSwgMHgyMDExLCAweDAwMDUsIDB4MTA3OCwgMHg0MmViLAorCTB4MDA3OSwgMHg0MDEyLCAweDQwMTcsIDB4MjQ1OSwgMHgzYjk2LCAweDQwMWYsIDB4NDAyNywgMHhhNmI0LAorCTB4MDBmZiwgMHhhNmI1LCAweDA4MDAsIDB4NmViNiwgMHg3ZTVhLCAweDAwNzgsIDB4NDcyNywgMHhhNmI0LAorCTB4MDBmZiwgMHhhNmI1LCAweDA4MDAsIDB4NmViNiwgMHg3ZTVhLCAweDAwNzgsIDB4NDcyNywgMHg3MGFiLAorCTB4NDAyYiwgMHgwMDc4LCAweDI0NTksIDB4MDA3OCwgMHg0MDE3LCAweGEyODYsIDB4MDAwMSwgMHgwMDQwLAorCTB4NDAzMywgMHgxMDc4LCAweDIzZWIsIDB4NzBhNywgMHg0MDM3LCAweDAwNzgsIDB4NDczOSwgMHgyMDExLAorCTB4MDAwNiwgMHgxMDc4LCAweDQyZWIsIDB4MDA3OSwgMHg0MDNkLCAweDQwNDIsIDB4MjQ1OSwgMHgzYjk2LAorCTB4NDA0OCwgMHg0MDUyLCAweGE2YjUsIDB4MDgwMCwgMHg2ZWI2LCAweDdlNWEsIDB4MDA3OCwgMHg0NzI3LAorCTB4YTZiNCwgMHgwMGZmLCAweGE2YjUsIDB4MDgwMCwgMHg2ZWI2LCAweGE2YjUsIDB4NDAwMCwgMHg3ZTVhLAorCTB4MDA3OCwgMHg0NzI3LCAweDcwYWIsIDB4NDA1NiwgMHgwMDc4LCAweDI0NTksIDB4MDA3OCwgMHg0MDQyLAorCTB4MjMwMCwgMHgwMDc5LCAweDQwNWIsIDB4NDA2MCwgMHg0MDVlLCAweDQwNWUsIDB4MTA3OCwgMHgyM2ViLAorCTB4MTA3OCwgMHgyM2ViLCAweDIzMDAsIDB4NzFhOCwgMHhhMDA1LCAweDAxN2EsIDB4NjgxMCwgMHg3MGJlLAorCTB4YTI4MiwgMHgwMDAzLCAweDAwNTAsIDB4NDA2ZSwgMHgxMDc4LCAweDIzZWIsIDB4MjMwMCwgMHgwMDc5LAorCTB4NDA3MSwgMHg0MDc0LCAweDQwODIsIDB4NDBhNCwgMHhhNjg0LCAweDAyMDAsIDB4MDA0MCwgMHg0MDdjLAorCTB4MTA3OCwgMHg0NmY4LCAweDEwNzgsIDB4NDZmZiwgMHgyMDAxLCAweDAwMDEsIDB4MTA3OCwgMHg0NjkxLAorCTB4MDA3OCwgMHgyNDU5LCAweGEyOTYsIDB4MDAwMiwgMHgwMDQwLCAweDQwOGIsIDB4ODJmZiwgMHgwMDQwLAorCTB4NDA4YiwgMHgxMDc4LCAweDIzZWIsIDB4NzBhNywgMHg0MDhmLCAweDAwNzgsIDB4NDczOSwgMHgyMDExLAorCTB4MDAxOCwgMHgxMDc4LCAweDQyZWIsIDB4MDA3OSwgMHg0MDk1LCAweDQwOWEsIDB4MjQ1OSwgMHgzYjk2LAorCTB4NDA5YywgMHg0MDllLCAweDAwNzgsIDB4NDcyNywgMHgwMDc4LCAweDQ3MjcsIDB4NzBhYiwgMHg0MGEyLAorCTB4MDA3OCwgMHgyNDU5LCAweDAwNzgsIDB4NDA5YSwgMHgyMjAwLCAweDAwNzksIDB4NDBhNywgMHg0MGE5LAorCTB4NDBjMiwgMHg3MGE3LCAweDQwYWQsIDB4MDA3OCwgMHg0NzM5LCAweDIwMTEsIDB4MDAxNywgMHgxMDc4LAorCTB4NDJlYiwgMHgwMDc5LCAweDQwYjMsIDB4NDBiOCwgMHgyNDU5LCAweDNiOTYsIDB4NDBiYSwgMHg0MGJjLAorCTB4MDA3OCwgMHg0NzI3LCAweDAwNzgsIDB4NDcyNywgMHg3MGFiLCAweDQwYzAsIDB4MDA3OCwgMHgyNDU5LAorCTB4MDA3OCwgMHg0MGI4LCAweGE0ODQsIDB4ODAwMCwgMHgwMGMwLCAweDQxMGMsIDB4YTY4NCwgMHgwMTAwLAorCTB4MDA0MCwgMHg0MGQ2LCAweDEwNzgsIDB4NDZmOCwgMHgxMDc4LCAweDQyZDMsIDB4MTA3OCwgMHg0NmZmLAorCTB4Nzg0OCwgMHhhMDg1LCAweDAwMGMsIDB4Nzg0YSwgMHgwMDc4LCAweDQwZGEsIDB4NzhkOCwgMHg3OGQyLAorCTB4NzhkYywgMHg3OGQ2LCAweGE2YjQsIDB4ZWZmZiwgMHg3ZTVhLCAweDcwYTcsIDB4NDBlMSwgMHgwMDc4LAorCTB4NDczOSwgMHgyMDExLCAweDAwMGQsIDB4MTA3OCwgMHg0MmViLCAweDAwNzksIDB4NDBlNywgMHg0MGVlLAorCTB4MjQ1OSwgMHgzYjk2LCAweDQwZWUsIDB4NDBmYywgMHg0MTAyLCAweDQxMDQsIDB4YTY4NCwgMHgwMTAwLAorCTB4MDA0MCwgMHg0MGZhLCAweDEwNzgsIDB4NDZiNiwgMHg2ODJjLCAweDc4ZDIsIDB4NjgzMCwgMHg3OGQ2LAorCTB4MTA3OCwgMHg0NmYwLCAweDAwNzgsIDB4NDcyNywgMHg3MGFiLCAweDQxMDAsIDB4MDA3OCwgMHgyNDU5LAorCTB4MDA3OCwgMHg0MGVlLCAweDEwNzgsIDB4MjNlYiwgMHg3MGFiLCAweDQxMDgsIDB4MDA3OCwgMHgyNDU5LAorCTB4MTA3OCwgMHg0NzNmLCAweDAwNzgsIDB4MjQ1OSwgMHgxMDc4LCAweDQ2ZmYsIDB4NzBhYiwgMHg0MTE2LAorCTB4MjAwMSwgMHgwMDAzLCAweDEwNzgsIDB4NDY4OSwgMHgwMDc4LCAweDQ3MzMsIDB4MTA3OCwgMHg0NmYwLAorCTB4NjgyYywgMHg3OGQyLCAweDY4MzAsIDB4NzhkNiwgMHgwMDc4LCAweDQ3MjcsIDB4NzBiOCwgMHg2ODEyLAorCTB4NzBiZSwgMHg4MDAwLCAweDcwYmEsIDB4NjgxYiwgMHgwMDAwLCAweGE2ODQsIDB4MDAwOCwgMHgwMDQwLAorCTB4NDE0MSwgMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHg3ODkwLCAweDgwMDQsIDB4ODAwNCwgMHg4MDA0LAorCTB4ODAwNCwgMHhhMDg0LCAweDAwMGYsIDB4NjgxYSwgMHg4MGFjLCAweDc4OWIsIDB4MDAwMCwgMHhhZjgwLAorCTB4MDAyYiwgMHgyMDk4LCAweGFkODAsIDB4MDAwYiwgMHgyMGEwLCAweDUzYTUsIDB4MTQ3ZiwgMHgxMzdmLAorCTB4MTU3ZiwgMHhhNmM0LCAweDBmMDAsIDB4YTY4NCwgMHgwMDAyLCAweDAwYzAsIDB4NDE1MCwgMHg2OTJjLAorCTB4ODEwZCwgMHg4MTBkLCAweDgxMGQsIDB4YTE4NCwgMHgwMDA3LCAweDIwMDgsIDB4MDA3OCwgMHg0MTVmLAorCTB4Nzg5YiwgMHgwMDEwLCAweDc5YWMsIDB4YTE4NCwgMHgwMDIwLCAweDAwNDAsIDB4NDE1ZiwgMHgwMTdlLAorCTB4MjAwOSwgMHgwMDA1LCAweDIwMDEsIDB4M2QwMCwgMHgxMDc4LCAweDQ2YzEsIDB4MDE3ZiwgMHhhMTg0LAorCTB4MDAxZiwgMHhhODA1LCAweDY4MTYsIDB4MTA3OCwgMHgzYjY5LCAweDY4YmUsIDB4YTY4NCwgMHgwMDA0LAorCTB4MDA0MCwgMHg0MTcwLCAweGExOGMsIDB4ZmYwMCwgMHg3OGE4LCAweGEwODQsIDB4MDBmZiwgMHhhMTA1LAorCTB4NjgyYSwgMHhhNmI0LCAweDAwZmYsIDB4NjAwMCwgMHhhMDg0LCAweDAwMDgsIDB4MDA0MCwgMHg0MTdhLAorCTB4YTZiNSwgMHg0MDAwLCAweDZlYjYsIDB4MDA3YywgMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHg2OTE4LAorCTB4Nzg5MCwgMHg4MDA0LCAweDgwMDQsIDB4ODAwNCwgMHg4MDA0LCAweGEwODQsIDB4MDAwZiwgMHgwMDdlLAorCTB4YTEwMCwgMHg2ODFhLCAweDAwN2YsIDB4ODAwMCwgMHg4MDA0LCAweDAwNDAsIDB4NDE5YiwgMHgyMGE4LAorCTB4ODEwNCwgMHhhMDgwLCAweDAwMGIsIDB4YWQwMCwgMHgyMGEwLCAweDc4OWIsIDB4MDAwMCwgMHhhZjgwLAorCTB4MDAyYiwgMHgyMDk4LCAweDUzYTUsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsIDB4MDA3YywgMHg2ODJjLAorCTB4YTA4NCwgMHgwMDIwLCAweDAwYzAsIDB4NDFhNywgMHg2MjBjLCAweDAwNzgsIDB4NDFhOCwgMHg2MjEwLAorCTB4NmIxOCwgMHgyMzAwLCAweGEyMDIsIDB4MDA0MCwgMHg0MWM4LCAweDIwMTgsIDB4YTM4MiwgMHgwMDBlLAorCTB4MDA0OCwgMHg0MWI4LCAweDAwNDAsIDB4NDFiOCwgMHgyMDE5LCAweDAwMGUsIDB4MDA3OCwgMHg0MWJjLAorCTB4Nzg1OCwgMHhhMDg0LCAweGZmZWYsIDB4Nzg1YSwgMHg3ODNiLCAweDFiMDEsIDB4Nzg5MywgMHgwMDAwLAorCTB4N2JhMiwgMHg3MGI0LCAweGEwODAsIDB4MDA4ZSwgMHg3ODFhLCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLAorCTB4Nzg1OCwgMHhhMDg0LCAweGZmZWYsIDB4Nzg1YSwgMHg3ODkzLCAweDAwMDAsIDB4YTAwNiwgMHgwMDdjLAorCTB4NjkwNCwgMHhhMThjLCAweDAwZmYsIDB4YTE5NiwgMHgwMDA3LCAweDAwNDAsIDB4NDFkZCwgMHhhMTk2LAorCTB4MDAwZiwgMHgwMDQwLCAweDQxZGQsIDB4NjgwNywgMHgwMTE3LCAweDY5MTQsIDB4MTA3OCwgMHgzYjY5LAorCTB4NjEwMCwgMHg4MTA0LCAweDAwYzgsIDB4NDFmOCwgMHg2MDFjLCAweGEwMDUsIDB4MDA0MCwgMHg0MWVjLAorCTB4MjAwMSwgMHgwODAwLCAweDAwNzgsIDB4NDFmYSwgMHgwZDdlLCAweDY4MjQsIDB4MDA3ZSwgMHgxMDc4LAorCTB4NDcwOCwgMHgwMDdmLCAweDY4MjYsIDB4MmQwMCwgMHg2ODJlLCAweDEwNzgsIDB4M2FmOCwgMHgwZDdmLAorCTB4MjAwMSwgMHgwMjAwLCAweDY4MjYsIDB4ODAwNywgMHg3ODliLCAweDAwMGUsIDB4NzhhYSwgMHg2ODIwLAorCTB4YTA4NSwgMHg4MDAwLCAweDY4MjIsIDB4MjAzMSwgMHgwNDAwLCAweDZlYjYsIDB4N2U1YSwgMHg3MWI0LAorCTB4YTE4OCwgMHgwMDkxLCAweDc5MWEsIDB4MDA3YywgMHhhNmM0LCAweDBmMDAsIDB4YTY4NCwgMHgwMDAyLAorCTB4MDBjMCwgMHg0MjIwLCAweDY5MmMsIDB4ODEwZCwgMHg4MTBkLCAweDgxMGQsIDB4YTE4NCwgMHgwMDA3LAorCTB4MjAwOCwgMHhhODA1LCAweDY4MTYsIDB4MTA3OCwgMHgzYjY5LCAweDY4YmUsIDB4MDA3OCwgMHg0MjIzLAorCTB4NjkxNCwgMHgxMDc4LCAweDNiNjksIDB4NjEwMCwgMHg4MTA0LCAweDAwYzgsIDB4NDI4MCwgMHhhMTg0LAorCTB4MDMwMCwgMHgwMDQwLCAweDQyMmYsIDB4NjgwNywgMHgwMTE3LCAweDAwNzgsIDB4NDI0ZCwgMHg2MDA0LAorCTB4YTAwNSwgMHgwMGMwLCAweDQyNTYsIDB4NjgwNywgMHgwMTE3LCAweDYwMWMsIDB4YTAwNSwgMHgwMGMwLAorCTB4NDI0MywgMHgwZDdlLCAweDEwNzgsIDB4NDcwOCwgMHg2ODI3LCAweDAwMzQsIDB4MmQwMCwgMHg2ODJlLAorCTB4MTA3OCwgMHgzYWY4LCAweDBkN2YsIDB4YTY4NCwgMHgwMDA0LCAweDAwNDAsIDB4NDI0ZCwgMHgyMDMxLAorCTB4MDQwMCwgMHgyMDAxLCAweDI4MDAsIDB4MDA3OCwgMHg0MjUxLCAweDIwMzEsIDB4MDQwMCwgMHgyMDAxLAorCTB4MDgwMCwgMHg3MWI0LCAweGExODgsIDB4MDA5MSwgMHgwMDc4LCAweDQyYWUsIDB4NjAxOCwgMHhhMDA1LAorCTB4MDBjMCwgMHg0MjQzLCAweDYwMWMsIDB4YTAwNSwgMHgwMGMwLCAweDQyNDMsIDB4Njg5ZiwgMHgwMDAwLAorCTB4NjgyNywgMHgwMDNkLCAweGE2ODQsIDB4MDAwMSwgMHgwMDQwLCAweDQyYmMsIDB4ZDY5NCwgMHgwMGMwLAorCTB4NDI3OSwgMHg2MTAwLCAweGQxZDQsIDB4MDA0MCwgMHg0Mjc5LCAweDY5MmMsIDB4ODFmZiwgMHgwMDQwLAorCTB4NDJiYywgMHhhMTg2LCAweDAwMDMsIDB4MDA0MCwgMHg0MmJjLCAweGExODYsIDB4MDAxMiwgMHgwMDQwLAorCTB4NDJiYywgMHhhNmI1LCAweDA4MDAsIDB4NzFiNCwgMHhhMTg4LCAweDAwYWYsIDB4MDA3OCwgMHg0MmI3LAorCTB4NjgwNywgMHgwMTE3LCAweDIwMzEsIDB4MDQwMCwgMHg2OTJjLCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LAorCTB4MDAxMiwgMHgwMGMwLCAweDQyOTEsIDB4MjAwMSwgMHg0MmM5LCAweDIwMDksIDB4MDAwMSwgMHgwMDc4LAorCTB4NDJhMiwgMHhhMTg2LCAweDAwMDMsIDB4MDBjMCwgMHg0MjliLCAweDIwMDEsIDB4NDJjYSwgMHgyMDA5LAorCTB4MDAxMiwgMHgwMDc4LCAweDQyYTIsIDB4MjAwMSwgMHgwMjAwLCAweDcxYjQsIDB4YTE4OCwgMHgwMDkxLAorCTB4MDA3OCwgMHg0MmFlLCAweDEwNzgsIDB4NDZkYiwgMHg3OGEzLCAweDAwMDAsIDB4NjgxYywgMHhhMDg1LAorCTB4MDA0MCwgMHg2ODFlLCAweDcxYjQsIDB4YTE4OCwgMHgwMGRmLCAweGEwMDYsIDB4NjgyNiwgMHg4MDA3LAorCTB4Nzg5YiwgMHgwMDBlLCAweDc4YWEsIDB4NjgyMCwgMHhhMDg1LCAweDgwMDAsIDB4NjgyMiwgMHg2ZWI2LAorCTB4N2U1YSwgMHg3OTFhLCAweDAwNzgsIDB4MjQ1OSwgMHg2ZWI2LCAweDEwNzgsIDB4M2FmOCwgMHg2ODEwLAorCTB4NzBiZSwgMHg3MDAzLCAweDAwMDcsIDB4NzBhMywgMHgwMDAwLCAweDcwNGIsIDB4MDAwMCwgMHgwMDc4LAorCTB4MjQ1OSwgMHgwMDIzLCAweDAwNzAsIDB4MDAwNSwgMHgwMDAwLCAweDBhMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAyNSwgMHgwMDAwLCAweDAwMDAsIDB4NjgzYiwgMHgwMDAwLCAweDY4MzcsIDB4MDAwMCwgMHhhNjg0LAorCTB4MDIwMCwgMHgwMDQwLCAweDQyZWEsIDB4NzhiOCwgMHhhMDhjLCAweDAwMWYsIDB4YTA4NCwgMHg4MDAwLAorCTB4MDA0MCwgMHg0MmUzLCAweDgxMDgsIDB4NzhkOCwgMHhhMTAwLCAweDY4MzYsIDB4NzhkYywgMHhhMDgxLAorCTB4MDAwMCwgMHg2ODNhLCAweDAwN2MsIDB4Nzk5MCwgMHg4MTBmLCAweGE1YWMsIDB4MDAwNywgMHgyMDIxLAorCTB4MDAwMCwgMHhhNDgwLCAweDAwMTAsIDB4Nzg5YSwgMHg3OWE4LCAweGExOGMsIDB4MDBmZiwgMHhhMTg0LAorCTB4MDA4MCwgMHgwMGMwLCAweDQzMTksIDB4YTE4MiwgMHgwMDIwLCAweDAwYzgsIDB4NDMzNywgMHhhMTgyLAorCTB4MDAxMiwgMHgwMGM4LCAweDQ2N2IsIDB4MjEwMCwgMHgxMDc5LCAweDQzMDcsIDB4MDA3YywgMHg0NjdiLAorCTB4NDRlOCwgMHg0NjdiLCAweDQ2N2IsIDB4NDM0NCwgMHg0MzQ3LCAweDQzODEsIDB4NDNiNywgMHg0M2ViLAorCTB4NDNlZSwgMHg0NjdiLCAweDQ2N2IsIDB4NDNhMiwgMHg0NDEyLCAweDQ0NGMsIDB4NDY3YiwgMHg0NjdiLAorCTB4NDQ3MywgMHhhMTg0LCAweDAwMjAsIDB4MDBjMCwgMHg0NGE3LCAweGExOGMsIDB4MDAxZiwgMHg2ODE0LAorCTB4YTA4NCwgMHgwMDFmLCAweGExMDYsIDB4MDA0MCwgMHg0MzM0LCAweDcwYjQsIDB4YTA4MCwgMHgwMGQyLAorCTB4NzgxYSwgMHgyMDAxLCAweDAwMTQsIDB4MTA3OCwgMHg0NjkxLCAweDEwNzgsIDB4NDZmZiwgMHg3MDAzLAorCTB4MDAwMCwgMHgyMDAxLCAweDAwMDIsIDB4MDA3YywgMHgyMDAxLCAweDAwMDAsIDB4MDA3YywgMHhhMTgyLAorCTB4MDAyNCwgMHgwMGM4LCAweDQ2N2IsIDB4YTE4NCwgMHgwMDAzLCAweDEwNzksIDB4NDMwNywgMHgwMDdjLAorCTB4NDY3YiwgMHg0NjdiLCAweDQ2N2IsIDB4NDY3YiwgMHgxMDc4LCAweDQ2N2IsIDB4MDA3YywgMHgyMjAwLAorCTB4MDA3OSwgMHg0MzRhLCAweDQ0NzYsIDB4NDQ3NiwgMHg0MzZlLCAweDQzNmUsIDB4NDM2ZSwgMHg0MzZlLAorCTB4NDM2ZSwgMHg0MzZlLCAweDQzNmUsIDB4NDM2ZSwgMHg0MzZjLCAweDQzNmUsIDB4NDM2MywgMHg0MzZlLAorCTB4NDM2ZSwgMHg0MzZlLCAweDQzNmUsIDB4NDM2ZSwgMHg0Mzc2LCAweDQzNzksIDB4NDQ3NiwgMHg0Mzc5LAorCTB4NDM2ZSwgMHg0MzZlLCAweDQzNmUsIDB4MGM3ZSwgMHgwNzdlLCAweDZmMTQsIDB4MTA3OCwgMHgzNmUyLAorCTB4MDc3ZiwgMHgwYzdmLCAweDAwNzgsIDB4NDM2ZSwgMHgxMDc4LCAweDQ1OGIsIDB4NjgyNywgMHgwMmIzLAorCTB4MjAwOSwgMHgwMDBiLCAweDIwMDEsIDB4NDgwMCwgMHgwMDc4LCAweDQ0YWEsIDB4MTA3OCwgMHg0NjcwLAorCTB4MDA3YywgMHg2ODI3LCAweDAwOTMsIDB4MjAwOSwgMHgwMDBiLCAweDIwMDEsIDB4NDgwMCwgMHgwMDc4LAorCTB4NDQ5MiwgMHgyZDU4LCAweDY4MDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgwMGMwLAorCTB4NDM4YiwgMHg2ODA3LCAweDAxMTcsIDB4NjgyNywgMHgwMDAyLCAweDEwNzgsIDB4NDcwOCwgMHg2ODI3LAorCTB4MDAzNiwgMHg2OTMyLCAweDJkMDAsIDB4NjgyZSwgMHgwZDdlLCAweDEwNzgsIDB4M2FjOCwgMHgxMDc4LAorCTB4NDRkMCwgMHgyYjY4LCAweDEwNzgsIDB4M2FmOCwgMHgwZDdmLCAweDEwNzgsIDB4M2FmOCwgMHgyMDAxLAorCTB4MDAwMiwgMHgwMDdjLCAweDEwNzgsIDB4NDRkMCwgMHgyMDAxLCAweDAwMTcsIDB4MTA3OCwgMHg0NjkxLAorCTB4NzBhMywgMHgwMDAwLCAweDIwMDksIDB4NTEzOCwgMHgyMDBiLCAweDAwMDYsIDB4NzBhZiwgMHgwMDE3LAorCTB4MjAwOSwgMHgwMjAwLCAweDEwNzgsIDB4M2EwNiwgMHgyMDAxLCAweDAwMDEsIDB4MDA3YywgMHgyMjAwLAorCTB4MDA3OSwgMHg0M2JhLCAweDQ0NzYsIDB4NDRhNywgMHg0NGE3LCAweDQ0YTcsIDB4NDNkYiwgMHg0NGI3LAorCTB4NDNlMywgMHg0NGI3LCAweDQ0YjcsIDB4NDRiYSwgMHg0NGJhLCAweDQ0YmYsIDB4NDRiZiwgMHg0M2QzLAorCTB4NDNkMywgMHg0NGE3LCAweDQ0YTcsIDB4NDRiNywgMHg0NGE3LCAweDQzZTMsIDB4NDQ3NiwgMHg0M2UzLAorCTB4NDNlMywgMHg0M2UzLCAweDQzZTMsIDB4NjgyNywgMHgwMDg0LCAweDIwMDksIDB4MDAwYiwgMHgyMDAxLAorCTB4NDMwMCwgMHgwMDc4LCAweDQ0YzksIDB4NjgyNywgMHgwMDBkLCAweDIwMDksIDB4MDAwYiwgMHgyMDAxLAorCTB4NDMwMCwgMHgwMDc4LCAweDQ0YWEsIDB4NjgyNywgMHgwMDkzLCAweDIwMDksIDB4MDAwYiwgMHgyMDAxLAorCTB4NDMwMCwgMHgwMDc4LCAweDQ0OTIsIDB4MjAwMSwgMHgwMDAwLCAweDAwN2MsIDB4MjIwMCwgMHgwMDc5LAorCTB4NDNmMSwgMHg0NDc2LCAweDQ0MGEsIDB4NDQwYSwgMHg0NDBhLCAweDQ0MGEsIDB4NDRiNywgMHg0NGI3LAorCTB4NDRiNywgMHg0NGI3LCAweDQ0YjcsIDB4NDRiNywgMHg0NGI3LCAweDQ0YjcsIDB4NDQwYSwgMHg0NDBhLAorCTB4NDQwYSwgMHg0NDBhLCAweDQ0YjcsIDB4NDQwYSwgMHg0NDBhLCAweDQ0YjcsIDB4NDRiNywgMHg0NGI3LAorCTB4NDRiNywgMHg0NDc2LCAweDY4MjcsIDB4MDA5MywgMHgyMDA5LCAweDAwMGIsIDB4MjAwMSwgMHg0MzAwLAorCTB4MDA3OCwgMHg0NDkyLCAweGE2ODQsIDB4MDAwNCwgMHgwMGMwLCAweDQ0MjYsIDB4NjgwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHg0NjdiLCAweDEwNzgsIDB4NDRkMCwgMHg2ODA3LAorCTB4MDExNywgMHgxMDc4LCAweDNhZjgsIDB4MjAwMSwgMHgwMDAyLCAweDAwN2MsIDB4NjAwMCwgMHhhMDg0LAorCTB4MDAwNCwgMHgwMDQwLCAweDQ2N2IsIDB4MmQ1OCwgMHg2ODA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LAorCTB4MDAwNiwgMHgwMGMwLCAweDQ0MzUsIDB4NjgwNywgMHgwMTE3LCAweDY4MjcsIDB4MDAwMiwgMHgxMDc4LAorCTB4NDcwOCwgMHg2ODI3LCAweDAwMzYsIDB4NjkzMiwgMHgyZDAwLCAweDY4MmUsIDB4MGQ3ZSwgMHgxMDc4LAorCTB4M2FkNywgMHgxMDc4LCAweDQ0ZDAsIDB4MmI2OCwgMHgxMDc4LCAweDNhZjgsIDB4MGQ3ZiwgMHgxMDc4LAorCTB4M2FmOCwgMHgyMDAxLCAweDAwMDIsIDB4MDA3YywgMHg2MDAwLCAweGEwODQsIDB4MDAwNCwgMHgwMDQwLAorCTB4NDY3YiwgMHgyZDU4LCAweDZhMDQsIDB4YTI5NCwgMHgwMGZmLCAweGEyODYsIDB4MDAwNiwgMHgwMGMwLAorCTB4NDQ1YiwgMHg2ODA3LCAweDAxMTcsIDB4NjgyNywgMHgwMDAyLCAweDJkNTgsIDB4MTA3OCwgMHg0NzA4LAorCTB4NjgyNywgMHgwMDM2LCAweDY5MzIsIDB4MmQwMCwgMHg2ODJlLCAweDBkN2UsIDB4MTA3OCwgMHgzYWU3LAorCTB4MTA3OCwgMHg0NGQwLCAweDJiNjgsIDB4MTA3OCwgMHgzYWY4LCAweDBkN2YsIDB4MTA3OCwgMHgzYWY4LAorCTB4MjAwMSwgMHgwMDAyLCAweDAwN2MsIDB4MTA3OCwgMHg0NjdiLCAweDAwN2MsIDB4NzBiNCwgMHhhMDgwLAorCTB4MDBkMiwgMHg3ODFhLCAweDIwMDEsIDB4MDAwMSwgMHgxMDc4LCAweDQ2OTEsIDB4MTA3OCwgMHg0NmZmLAorCTB4NzAwMywgMHgwMDAwLCAweDIwMDEsIDB4MDAwMiwgMHgwMDdjLCAweDEwNzgsIDB4NDZjMSwgMHgxMDc4LAorCTB4NDZmOCwgMHgxMDc4LCAweDQyZDMsIDB4MTA3OCwgMHg0MWQwLCAweDEwNzgsIDB4NDZmZiwgMHgyMDAxLAorCTB4MDAwMSwgMHgwMDdjLCAweDEwNzgsIDB4NDZjMSwgMHgxMDc4LCAweDQ2ZjgsIDB4MTA3OCwgMHg0MmQzLAorCTB4NzBiNCwgMHhhMDgwLCAweDAwZDIsIDB4NzgxYSwgMHgyMDAxLCAweDAwMTMsIDB4MTA3OCwgMHg0NjkxLAorCTB4MTA3OCwgMHg0NmZmLCAweDcwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDAwMDIsIDB4MDA3YywgMHgxMDc4LAorCTB4NDY3YiwgMHgwMDdjLCAweDEwNzgsIDB4NDZjMSwgMHgxMDc4LCAweDQ2ZjgsIDB4MTA3OCwgMHg0MmQzLAorCTB4MTA3OCwgMHg0MWQwLCAweDEwNzgsIDB4NDZmZiwgMHgyMDAxLCAweDAwMDEsIDB4MDA3YywgMHgyMDAxLAorCTB4MDAwMywgMHgwMDdjLCAweDEwNzgsIDB4NDU4YiwgMHgyMDAxLCAweDAwMDAsIDB4MDA3YywgMHgwYzdlLAorCTB4MDc3ZSwgMHg2ZjE0LCAweDEwNzgsIDB4MzZlMiwgMHgwNzdmLCAweDBjN2YsIDB4MjAwMSwgMHgwMDAwLAorCTB4MDA3YywgMHgxMDc4LCAweDQ2YzEsIDB4MTA3OCwgMHg0NjdiLCAweDIwMDEsIDB4MDAwNiwgMHgwMDdjLAorCTB4NjkwNCwgMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDA3LCAweDAwNDAsIDB4NDRkYiwgMHhhMTg2LAorCTB4MDAwZiwgMHgwMGMwLCAweDQ0ZGYsIDB4MTA3OCwgMHg0NmY4LCAweDEwNzgsIDB4NDJkMywgMHg3MGI0LAorCTB4YTA4MCwgMHgwMGQyLCAweDc4MWEsIDB4MTA3OCwgMHg0NmZmLCAweDcwMDMsIDB4MDAwMCwgMHgwMDdjLAorCTB4N2FhOCwgMHhhMjk0LCAweDAwZmYsIDB4NzhhOCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4YSwgMHgwMDA0LAorCTB4MDBjOCwgMHg0NjdiLCAweDEwNzksIDB4NDRmNSwgMHgwMDdjLCAweDQ2N2IsIDB4NDRmOSwgMHg0NjdiLAorCTB4NDU5MiwgMHhhMjgyLCAweDAwMDMsIDB4MDA0MCwgMHg0NTAwLCAweDEwNzgsIDB4NDY3YiwgMHgwMDdjLAorCTB4N2RhOCwgMHhhNWFjLCAweDAwZmYsIDB4N2NhOCwgMHhhNGE0LCAweDAwZmYsIDB4NjliOCwgMHhhMTg0LAorCTB4MDEwMCwgMHgwMDQwLCAweDQ1M2YsIDB4YTE4YywgMHhmZWZmLCAweDY5YmEsIDB4NzhhMCwgMHhhMDA1LAorCTB4MDBjMCwgMHg0NTNmLCAweGE0YTQsIDB4MDBmZiwgMHgwMDQwLCAweDQ1MzMsIDB4YTQ4MiwgMHgwMDBjLAorCTB4MDA0MCwgMHg0NTFjLCAweDAwYzgsIDB4NDUyNiwgMHg4NTJiLCAweDg1MmIsIDB4MTA3OCwgMHgzNzYwLAorCTB4MDA0MCwgMHg0NTI2LCAweDEwNzgsIDB4MzU1YiwgMHgwMDc4LCAweDQ1MzUsIDB4MTA3OCwgMHg0NjVkLAorCTB4MTA3OCwgMHgzNTg2LCAweDY5YjgsIDB4YTE4ZCwgMHgwMTAwLCAweDY5YmEsIDB4YTZiNSwgMHgxMDAwLAorCTB4N2U1YSwgMHgwMDc4LCAweDQ1MzgsIDB4MTA3OCwgMHgzNTg2LCAweGE2YjQsIDB4ZWZmZiwgMHg3ZTVhLAorCTB4NzBiNCwgMHhhMDgwLCAweDAwOTEsIDB4NzgxYSwgMHgyMDAxLCAweDAwMDEsIDB4MDA3YywgMHgwYzdlLAorCTB4MTA3OCwgMHg0NTdmLCAweDYyMDAsIDB4ZDJlNCwgMHgwMDQwLCAweDQ1NzAsIDB4NjIwOCwgMHg4MjE3LAorCTB4YTI5NCwgMHgwMGZmLCAweGEyODIsIDB4MDAwYywgMHgwMDQ4LCAweDQ1NTIsIDB4MDA0MCwgMHg0NTUyLAorCTB4MjAxMSwgMHgwMDBjLCAweDI0MDAsIDB4YTIwMiwgMHgwMGM4LCAweDQ1NTcsIDB4MjIyMCwgMHg2MjA4LAorCTB4YTI5NCwgMHgwMGZmLCAweDcwMWMsIDB4YTIwMiwgMHgwMGM4LCAweDQ1NWYsIDB4NzIxYywgMHgyMjAwLAorCTB4YTUwMiwgMHgwMGM4LCAweDQ1NjQsIDB4MjIyOCwgMHgxMDc4LCAweDQ2NjEsIDB4ODUyYiwgMHg4NTJiLAorCTB4MTA3OCwgMHgzNzYwLCAweDAwNDAsIDB4NDU3MCwgMHgxMDc4LCAweDM1NjIsIDB4MDA3OCwgMHg0NTc0LAorCTB4MTA3OCwgMHg0NjVkLCAweDEwNzgsIDB4MzU4ZCwgMHhhNmI1LCAweDEwMDAsIDB4N2U1YSwgMHg3MGI0LAorCTB4YTA4MCwgMHgwMGJlLCAweDc4MWEsIDB4MjAwMSwgMHgwMDA0LCAweDBjN2YsIDB4MDA3YywgMHgwMDdlLAorCTB4NjgxNCwgMHg4MDA3LCAweGEwODQsIDB4MDAwZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMGUwLAorCTB4NTM4MCwgMHgwMDdmLCAweDAwN2MsIDB4MGM3ZSwgMHgxMDc4LCAweDQ1N2YsIDB4MTA3OCwgMHgzNThkLAorCTB4MGM3ZiwgMHgwMDdjLCAweGEyODIsIDB4MDAwMiwgMHgwMGMwLCAweDQ2N2IsIDB4N2FhOCwgMHhhMjk0LAorCTB4MDBmZiwgMHg2OWI4LCAweGExODQsIDB4MDIwMCwgMHgwMDQwLCAweDQ1YzksIDB4YTE4YywgMHhmZGZmLAorCTB4NjliYSwgMHg3OGEwLCAweGEwMDUsIDB4MDBjMCwgMHg0NWM5LCAweGEyODIsIDB4MDAwMiwgMHgwMGM4LAorCTB4MzY5ZCwgMHgxMDc4LCAweDQ2MjcsIDB4MTA3OCwgMHgzNjJiLCAweDEwNzgsIDB4MzU4NiwgMHhhNjg0LAorCTB4MDEwMCwgMHgwMDQwLCAweDQ1YmYsIDB4NjgyYywgMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHg0NWJmLAorCTB4YzZmYywgMHg3ODg4LCAweGEwODQsIDB4MDA0MCwgMHgwMDQwLCAweDQ1YmYsIDB4YzZmZCwgMHhhNmI1LAorCTB4MTAwMCwgMHg3ZTVhLCAweDcwYjQsIDB4YTA4MCwgMHgwMDkxLCAweDc4MWEsIDB4MjAwMSwgMHgwMDAxLAorCTB4MDA3YywgMHgwYzdlLCAweDEwNzgsIDB4NDU3ZiwgMHhhMjg0LCAweGZmZmUsIDB4MDA0MCwgMHg0NWQ0LAorCTB4MjAxMSwgMHgwMDAxLCAweDAwNzgsIDB4NDVkOCwgMHhhMjg0LCAweDAwMDEsIDB4MDA0MCwgMHg0NWRlLAorCTB4NjEwMCwgMHhkMWVjLCAweDAwYzAsIDB4NDVkZSwgMHgyMDExLCAweDAwMDAsIDB4MTA3OCwgMHg0NjE5LAorCTB4MTA3OCwgMHgzNjMyLCAweDEwNzgsIDB4MzU4ZCwgMHhhNjg0LCAweDAxMDAsIDB4MDA0MCwgMHg0NWY0LAorCTB4NjgyYywgMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHg0NWY0LCAweGM2ZmMsIDB4Nzg4OCwgMHhhMDg0LAorCTB4MDA0MCwgMHgwMDQwLCAweDQ1ZjQsIDB4YzZmZCwgMHhhNmI1LCAweDEwMDAsIDB4N2U1YSwgMHg3MGI0LAorCTB4YTA4MCwgMHgwMGJlLCAweDc4MWEsIDB4MjAwMSwgMHgwMDA0LCAweDBjN2YsIDB4MDA3YywgMHgwYzdlLAorCTB4Mjk2MCwgMHg2MDAwLCAweDIwMTEsIDB4MDAwMSwgMHhhMDg0LCAweDIwMDAsIDB4MDBjMCwgMHg0NjBhLAorCTB4MjAxMSwgMHgwMDAwLCAweDc4YWIsIDB4MDAwMSwgMHg3OGFiLCAweDAwMDIsIDB4NzhhYiwgMHgwMDAzLAorCTB4N2FhYSwgMHhhOGMwLCAweDAwMDQsIDB4NjhiOCwgMHhhMDg1LCAweDAyMDAsIDB4NjhiYSwgMHgwYzdmLAorCTB4MDA3YywgMHg3ODliLCAweDAwMTgsIDB4NzhhYiwgMHgwMDAxLCAweDc4YWIsIDB4MDAwMiwgMHg3OGFiLAorCTB4MDAwMywgMHg3YWFhLCAweDc4OWIsIDB4MDA4MSwgMHg3OGFiLCAweDAwMDQsIDB4MDA3YywgMHgwYzdlLAorCTB4NzA1NCwgMHgyMDYwLCAweDYwMDAsIDB4YTA4NCwgMHgxMDAwLCAweDAwYzAsIDB4NDYzNSwgMHgyMDI5LAorCTB4MDAzMiwgMHgyMDIxLCAweDAwMDAsIDB4MDA3OCwgMHg0NjU1LCAweDY1MDgsIDB4YTVhYywgMHgwMGZmLAorCTB4NzAxOCwgMHhhMDg2LCAweDAwMjgsIDB4MDBjMCwgMHg0NjQ1LCAweGE1ODIsIDB4MDAxOSwgMHgwMGM4LAorCTB4NDY0YiwgMHgyMDI5LCAweDAwMTksIDB4MDA3OCwgMHg0NjRiLCAweGE1ODIsIDB4MDAwYywgMHgwMGM4LAorCTB4NDY0YiwgMHgyMDI5LCAweDAwMGMsIDB4NjQwOCwgMHg4NDI3LCAweGE0YTQsIDB4MDBmZiwgMHhhNDgyLAorCTB4MDAwYywgMHgwMDQ4LCAweDQ2NTUsIDB4MjAyMSwgMHgwMDBjLCAweDEwNzgsIDB4NDY2MSwgMHg2OGI4LAorCTB4YTA4NSwgMHgwMTAwLCAweDY4YmEsIDB4MGM3ZiwgMHgwMDdjLCAweDIwMjEsIDB4MDAwMCwgMHgyMDI5LAorCTB4MDAzMiwgMHg3ODliLCAweDAwMTgsIDB4NzhhYiwgMHgwMDAxLCAweDc4YWIsIDB4MDAwMywgMHg3OGFiLAorCTB4MDAwMSwgMHg3ZGFhLCAweDdjYWEsIDB4Nzg5YiwgMHgwMDgxLCAweDc4YWIsIDB4MDAwNSwgMHgwMDdjLAorCTB4MjAwMSwgMHgwMDAzLCAweDEwNzgsIDB4NDY4OSwgMHg3MGI0LCAweGEwODAsIDB4MDBiZSwgMHg3ODFhLAorCTB4MjAwMSwgMHgwMDA1LCAweDAwN2MsIDB4MjAwMSwgMHgwMDA3LCAweDEwNzgsIDB4NDY4OSwgMHhhNmI1LAorCTB4MTAwMCwgMHg3ZTVhLCAweDcwYjQsIDB4YTA4MCwgMHgwMGJlLCAweDc4MWEsIDB4MjAwMSwgMHgwMDA0LAorCTB4MDA3YywgMHg3ODliLCAweDAwMTgsIDB4NzhhYSwgMHg3ODliLCAweDAwODEsIDB4NzhhYiwgMHgwMDAxLAorCTB4MDA3YywgMHg2OTA0LCAweGExOGMsIDB4MDBmZiwgMHhhMTk2LCAweDAwMDcsIDB4MDA0MCwgMHg0NjlmLAorCTB4YTE5NiwgMHgwMDBmLCAweDAwNDAsIDB4NDY5ZiwgMHgxMDc4LCAweDE5NWEsIDB4MDA3YywgMHg2OTI0LAorCTB4YTE5NCwgMHgwMDNmLCAweDAwYzAsIDB4NDZhOCwgMHhhMThjLCAweGZmYzAsIDB4YTEwNSwgMHg2ODI2LAorCTB4MTA3OCwgMHgzYWY4LCAweDY5MWMsIDB4YTE4NCwgMHgwMTAwLCAweDAwNDAsIDB4NDZiNSwgMHg2OTE0LAorCTB4MTA3OCwgMHgzYjY5LCAweDYyMDQsIDB4ODIxMCwgMHg2MjA2LCAweDAwN2MsIDB4NjkyYywgMHg2ODM0LAorCTB4NjgyZSwgMHhhMTEyLCAweDY5MzAsIDB4NjgzOCwgMHg2ODMyLCAweGExMWIsIDB4YTIwMCwgMHhhMzAxLAorCTB4MDA3YywgMHgwYzdlLCAweGFkZTAsIDB4MDAxOCwgMHg2MDAzLCAweDAwNzAsIDB4NjEwNiwgMHg2MDBiLAorCTB4MDAwMCwgMHg2MDBmLCAweDBhMDAsIDB4NjAxMywgMHgwMDAwLCAweDYwMTcsIDB4MDAwMCwgMHg4MDA3LAorCTB4NjAxYSwgMHg2MDFmLCAweDAwMDAsIDB4NjAyMywgMHgwMDAwLCAweDBjN2YsIDB4NjgyNCwgMHhhMDg1LAorCTB4MDA4MCwgMHg2ODI2LCAweDAwN2MsIDB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4MjA5OCwgMHhhZjgwLAorCTB4MDAyZCwgMHgyMGEwLCAweDgxYWMsIDB4MDA0MCwgMHg0NmU2LCAweDUzYTYsIDB4YTE4NCwgMHgwMDAxLAorCTB4MDA0MCwgMHg0NmVjLCAweDMzMDQsIDB4NzhiZSwgMHgxNDdmLCAweDEzN2YsIDB4MTU3ZiwgMHgwMDdjLAorCTB4NzBiMCwgMHhhMDA1LCAweDEwYzAsIDB4MjNlYiwgMHg3MGIzLCAweDgwMDAsIDB4MDA3OCwgMHg0YTNhLAorCTB4NzFiMCwgMHg4MWZmLCAweDAwNDAsIDB4NDZmZSwgMHgxMDc4LCAweDRiMzAsIDB4MDA3YywgMHg3MWIwLAorCTB4ODFmZiwgMHgwMDQwLCAweDQ3MDcsIDB4NzBiMywgMHgwMDAwLCAweDEwNzgsIDB4NDc3NiwgMHgwMDdjLAorCTB4MGM3ZSwgMHgwZDdlLCAweDEwNzgsIDB4MTkzNywgMHgwYzdmLCAweDE1N2UsIDB4MTM3ZSwgMHgxNDdlLAorCTB4MmRhMCwgMHgyYzk4LCAweDIwYTksIDB4MDAzMSwgMHg1M2EzLCAweDE0N2YsIDB4MTM3ZiwgMHgxNTdmLAorCTB4NjgwNywgMHgwMTBkLCAweDY4MGIsIDB4MDAwMCwgMHg3MDA0LCAweDgwMDcsIDB4NjgxYSwgMHg2ODIzLAorCTB4MDAwMCwgMHg2ODFmLCAweDAwMDAsIDB4Njg5ZiwgMHgwMDAwLCAweDBjN2YsIDB4MDA3YywgMHg3MGI0LAorCTB4YTA4MCwgMHgwMDkxLCAweDc4MWEsIDB4MDA3OCwgMHgyNDU5LCAweDcwYjQsIDB4YTA4MCwgMHgwMDgxLAorCTB4NzgxYSwgMHgwMDc4LCAweDI0NTksIDB4NzBiNCwgMHhhMDgwLCAweDAwYmUsIDB4NzgxYSwgMHgwMDc4LAorCTB4MjQ1OSwgMHg3MGI0LCAweGEwODAsIDB4MDBjOCwgMHg3ODFhLCAweDAwNzgsIDB4MjQ1OSwgMHg2OTA0LAorCTB4YTE4YywgMHgwMGZmLCAweGExOTYsIDB4MDAwNywgMHgwMDQwLCAweDQ3NGMsIDB4YTE5NiwgMHgwMDBmLAorCTB4MDA0MCwgMHg0NzRjLCAweDY4MDcsIDB4MDExNywgMHgyMDAxLCAweDAyMDAsIDB4NjgyNiwgMHg4MDA3LAorCTB4Nzg5YiwgMHgwMDBlLCAweDc4YWEsIDB4NjgyMCwgMHhhMDg1LCAweDgwMDAsIDB4NjgyMiwgMHgyMDMxLAorCTB4MDQwMCwgMHg2ZWI2LCAweDdlNWEsIDB4NzFiNCwgMHhhMTg4LCAweDAwOTEsIDB4NzkxYSwgMHgwMDdjLAorCTB4MTA3OCwgMHg0NmZmLCAweDc4NDgsIDB4YTA4NSwgMHgwMDBjLCAweDc4NGEsIDB4NzBiNCwgMHhhMDgwLAorCTB4MDBkMiwgMHg3ODFhLCAweDIwMDksIDB4MDAwYiwgMHgyMDAxLCAweDQ0MDAsIDB4MTA3OCwgMHg0NmMxLAorCTB4MjAwMSwgMHgwMDEzLCAweDEwNzgsIDB4NDY5MSwgMHgwMDc4LCAweDNiOTYsIDB4MTI3ZSwgMHgyMDkxLAorCTB4MjIwMCwgMHgyMDQ5LCAweDQ3NzYsIDB4NzAwMCwgMHg3MjA0LCAweGEyMDUsIDB4NzIwYywgMHhhMjE1LAorCTB4NzAwOCwgMHhhMDg0LCAweGZmZjcsIDB4YTIwNSwgMHgwMDQwLCAweDQ3ODgsIDB4MDA3OCwgMHg0NzhkLAorCTB4NzAwMywgMHgwMDAwLCAweDEyN2YsIDB4MjAwMCwgMHgwMDdjLCAweDcwMDAsIDB4YTA4NCwgMHgwMDAxLAorCTB4MDBjMCwgMHg0N2JiLCAweDcxMDgsIDB4ODEwMywgMHgwMGM4LCAweDQ3OWEsIDB4MTA3OCwgMHg0OGJkLAorCTB4MDA3OCwgMHg0NzkyLCAweDcwMGMsIDB4YTA4YywgMHgwMGZmLCAweDAwNDAsIDB4NDdiYiwgMHg3MDA0LAorCTB4ODAwNCwgMHgwMGM4LCAweDQ3YjIsIDB4NzAxNCwgMHhhMDA1LCAweDAwYzAsIDB4NDdhZSwgMHg3MDEwLAorCTB4YTAwNSwgMHgwMDQwLCAweDQ3YjIsIDB4YTEwMiwgMHgwMGM4LCAweDQ3OTIsIDB4NzAwNywgMHgwMDEwLAorCTB4MDA3OCwgMHg0N2JiLCAweDhhZmYsIDB4MDA0MCwgMHg0N2JiLCAweDEwNzgsIDB4NGIwNywgMHgwMGMwLAorCTB4NDdiNSwgMHgwMDQwLCAweDQ3OTIsIDB4MTA3OCwgMHg0ODQ2LCAweDcwMDMsIDB4MDAwMCwgMHgxMjdmLAorCTB4MjAwMCwgMHgwMDdjLCAweDAxN2UsIDB4NjEwNCwgMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDA3LAorCTB4MDA0MCwgMHg0N2NlLCAweGExOGUsIDB4MDAwZiwgMHgwMGMwLCAweDQ3ZDEsIDB4NjA0MCwgMHgwMDc4LAorCTB4NDdkMiwgMHg2NDI4LCAweDAxN2YsIDB4ODRmZiwgMHgwMDQwLCAweDQ3ZmMsIDB4MmM3MCwgMHg3MDA0LAorCTB4YTBiYywgMHgwMDBmLCAweGE3YjgsIDB4NDgwYywgMHgyNzNjLCAweDg3ZmIsIDB4MDBjMCwgMHg0N2VhLAorCTB4MDA0OCwgMHg0N2U0LCAweDEwNzgsIDB4MjNlYiwgMHg2MDljLCAweGEwNzUsIDB4MDA0MCwgMHg0N2ZjLAorCTB4MDA3OCwgMHg0N2Q3LCAweDI3MDQsIDB4YWU2OCwgMHg2ODA4LCAweGE2MzAsIDB4NjgwYywgMHhhNTI5LAorCTB4ODQyMSwgMHgwMDQwLCAweDQ3ZmMsIDB4ODczOCwgMHgyNzA0LCAweGEwMDUsIDB4MDBjMCwgMHg0N2ViLAorCTB4NzA5YywgMHhhMDc1LCAweDAwYzAsIDB4NDdkNywgMHgwMDdjLCAweDAwMDAsIDB4MDAwNSwgMHgwMDA5LAorCTB4MDAwZCwgMHgwMDExLCAweDAwMTUsIDB4MDAxOSwgMHgwMDFkLCAweDAwMDAsIDB4MDAwMywgMHgwMDA5LAorCTB4MDAwZiwgMHgwMDE1LCAweDAwMWIsIDB4MDAwMCwgMHgwMDAwLCAweDQ4MDEsIDB4NDdmZSwgMHgwMDAwLAorCTB4MDAwMCwgMHg4MDAwLCAweDAwMDAsIDB4NDgwMSwgMHgwMDAwLCAweDQ4MDksIDB4NDgwNiwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NDgwOSwgMHgwMDAwLCAweDQ4MDQsIDB4NDgwNCwgMHgwMDAwLAorCTB4MDAwMCwgMHg4MDAwLCAweDAwMDAsIDB4NDgwNCwgMHgwMDAwLCAweDQ4MGEsIDB4NDgwYSwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NDgwYSwgMHgxMjdlLCAweDIwOTEsIDB4MjIwMCwgMHgyMDc5LAorCTB4NTEwMCwgMHgyMDcxLCAweDAwMTAsIDB4NzAwNywgMHgwMDBhLCAweDcwMDcsIDB4MDAwMiwgMHg3MDAzLAorCTB4MDAwMCwgMHgyMDcxLCAweDAwMjAsIDB4NzAwNywgMHgwMDBhLCAweDcwMDcsIDB4MDAwMiwgMHg3MDAzLAorCTB4MDAwMCwgMHgyMDQ5LCAweDAwMDAsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4MjA0OSwgMHg0ODQ2LAorCTB4MjAxOSwgMHgwMDAwLCAweDcwMDQsIDB4ODAwNCwgMHgwMGM4LCAweDQ4OTksIDB4NzAwNywgMHgwMDEyLAorCTB4NzEwOCwgMHg3MDA4LCAweGExMDYsIDB4MDBjMCwgMHg0ODUwLCAweGExODQsIDB4MDFlMCwgMHgwMDQwLAorCTB4NDg1YiwgMHgxMDc4LCAweDIzZWIsIDB4MjAwMSwgMHgwNGZkLCAweDIwMDQsIDB4YTA4MiwgMHgwMDA1LAorCTB4MDBjOCwgMHg0ODY2LCAweGExODQsIDB4NDAwMCwgMHgwMGMwLCAweDQ4NTAsIDB4YTE5YywgMHgzMDBjLAorCTB4YTM4NiwgMHgyMDA0LCAweDAwNDAsIDB4NDg3NCwgMHhhMzg2LCAweDAwMDgsIDB4MDA0MCwgMHg0ODdmLAorCTB4YTM4NiwgMHgyMDBjLCAweDAwYzAsIDB4NDg1MCwgMHg3MjAwLCAweDgyMDQsIDB4MDA0OCwgMHg0ODdmLAorCTB4NzMwYywgMHhhMzg0LCAweDAwZmYsIDB4MDA0MCwgMHg0ODdmLCAweDEwNzgsIDB4MjNlYiwgMHg3MDA3LAorCTB4MDAxMiwgMHg3MDAwLCAweGEwODQsIDB4MDAwMSwgMHgwMGMwLCAweDQ4OTksIDB4NzAwOCwgMHhhMDg0LAorCTB4MDFlMCwgMHgwMGMwLCAweDQ4OTksIDB4NzMxMCwgMHg3MDE0LCAweGEzMDUsIDB4MDA0MCwgMHg0ODk5LAorCTB4NzEwYywgMHhhMTg0LCAweDAzMDAsIDB4MDBjMCwgMHg0ODk5LCAweGExODQsIDB4MDBmZiwgMHgwMGMwLAorCTB4NDg0NiwgMHg3MDA3LCAweDAwMTIsIDB4NzAwNywgMHgwMDA4LCAweDcwMDQsIDB4YTA4NCwgMHgwMDA4LAorCTB4MDBjMCwgMHg0ODlkLCAweDcwMDcsIDB4MDAxMiwgMHg3MTA4LCAweDgxMDMsIDB4MDA0OCwgMHg0OGEyLAorCTB4NzAwMywgMHgwMDAwLCAweDIwNDksIDB4MDAwMCwgMHgwMDdjLCAweDEwN2UsIDB4MDA3ZSwgMHgxMjdlLAorCTB4MTU3ZSwgMHgyMDkxLCAweDIyMDAsIDB4NzEwOCwgMHgxMDc4LCAweDQ4YmQsIDB4MTU3ZiwgMHgxMjdmLAorCTB4MjA5MSwgMHg4MDAxLCAweDAwN2YsIDB4MTA3ZiwgMHgwMDdjLCAweDcyMDQsIDB4NzUwMCwgMHg3MzBjLAorCTB4YTM4NCwgMHgwMzAwLCAweDAwYzAsIDB4NDhlNCwgMHhhMTg0LCAweDAxZTAsIDB4MDBjMCwgMHg0OTA4LAorCTB4NzEwOCwgMHhhMTg0LCAweDAxZTAsIDB4MDBjMCwgMHg0OTA4LCAweDIwMDEsIDB4MDRmZCwgMHgyMDA0LAorCTB4YTA4MiwgMHgwMDA1LCAweDAwYzgsIDB4NDhkOCwgMHhhMTg0LCAweDQwMDAsIDB4MDBjMCwgMHg0OGM4LAorCTB4YTE4NCwgMHgwMDA3LCAweDAwNzksIDB4NDhkYywgMHg0OGU2LCAweDQ4ZjgsIDB4NDhlNCwgMHg0OGY4LAorCTB4NDhlNCwgMHg0OTQ0LCAweDQ4ZTQsIDB4NDk0MiwgMHgxMDc4LCAweDIzZWIsIDB4NzAwNCwgMHhhMDg0LAorCTB4MDAxMCwgMHhhMDg1LCAweDAwMDIsIDB4NzAwNiwgMHg4YWZmLCAweDAwYzAsIDB4NDhmMywgMHgyMDQ5LAorCTB4MDAwMCwgMHgwMDc4LCAweDQ4ZjcsIDB4MTA3OCwgMHg0YjA3LCAweDAwYzAsIDB4NDhmMywgMHgwMDdjLAorCTB4NzAwNCwgMHhhMDg0LCAweDAwMTAsIDB4YTA4NSwgMHgwMDAyLCAweDcwMDYsIDB4OGFmZiwgMHgwMGMwLAorCTB4NDkwMywgMHgwMDc4LCAweDQ5MDcsIDB4MTA3OCwgMHg0YjA3LCAweDAwYzAsIDB4NDkwMywgMHgwMDdjLAorCTB4NzAwNywgMHgwMDEyLCAweDcxMDgsIDB4MDBlMCwgMHg0OTBiLCAweDIwOTEsIDB4NjAwMCwgMHgwMGUwLAorCTB4NDkwZiwgMHgyMDkxLCAweDYwMDAsIDB4NzAwNywgMHgwMDEyLCAweDcwMDcsIDB4MDAwOCwgMHg3MDA0LAorCTB4YTA4NCwgMHgwMDA4LCAweDAwYzAsIDB4NDkxNywgMHg3MDA3LCAweDAwMTIsIDB4NzEwOCwgMHg4MTAzLAorCTB4MDA0OCwgMHg0OTFjLCAweDcwMDMsIDB4MDAwMCwgMHg3MDAwLCAweGEwMDUsIDB4MDBjMCwgMHg0OTMwLAorCTB4NzAwNCwgMHhhMDA1LCAweDAwYzAsIDB4NDkzMCwgMHg3MDBjLCAweGEwMDUsIDB4MDA0MCwgMHg0OTMyLAorCTB4MDA3OCwgMHg0OTEzLCAweDIwNDksIDB4MDAwMCwgMHgxMDc4LCAweDM4MDksIDB4NjgxOCwgMHhhMDg0LAorCTB4ODAwMCwgMHgwMDQwLCAweDQ5M2QsIDB4NjgxYiwgMHgwMDAyLCAweDAwN2MsIDB4MTA3OCwgMHgyM2ViLAorCTB4MTA3OCwgMHgyM2ViLCAweDEwNzgsIDB4NDlhMCwgMHg3MjEwLCAweDcxMTQsIDB4NzAwYywgMHhhMDljLAorCTB4MDBmZiwgMHgyODAwLCAweGEzMDAsIDB4YTIxMSwgMHhhMTg5LCAweDAwMDAsIDB4MTA3OCwgMHg0OWEwLAorCTB4MjcwNCwgMHgyYzU4LCAweGFjNjAsIDB4NjMwOCwgMHgyMjAwLCAweGEzMjIsIDB4NjMwYywgMHgyMTAwLAorCTB4YTMxYiwgMHgyNDAwLCAweGEzMDUsIDB4MDA0MCwgMHg0OTY3LCAweDAwYzgsIDB4NDk2NywgMHg4NDEyLAorCTB4ODIxMCwgMHg4MzBhLCAweGExODksIDB4MDAwMCwgMHgyYjYwLCAweDAwNzgsIDB4NDk0ZSwgMHgyYjYwLAorCTB4OGEwNywgMHgwMDdlLCAweDYwMDQsIDB4YTA4NCwgMHgwMDA4LCAweDAwNDAsIDB4NDk3MywgMHhhN2JhLAorCTB4NDgwNiwgMHgwMDc4LCAweDQ5NzUsIDB4YTdiYSwgMHg0N2ZlLCAweDAwN2YsIDB4YTczZCwgMHgyYzAwLAorCTB4Njg4NiwgMHg2ZjhhLCAweDZjOTIsIDB4NmI4ZSwgMHg3MDA3LCAweDAwMTIsIDB4MTA3OCwgMHg0ODQ2LAorCTB4MDA3YywgMHg4NzM4LCAweDI3MDQsIDB4YTAwNSwgMHgwMGMwLCAweDQ5OTQsIDB4NjA5YywgMHhhMDA1LAorCTB4MDA0MCwgMHg0OTlkLCAweDIwNjAsIDB4NjAwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHg0ODBjLAorCTB4MjAzYywgMHg4N2ZiLCAweDEwNDAsIDB4MjNlYiwgMHg4YTUxLCAweDAwNDAsIDB4NDk5YywgMHg3MDA4LAorCTB4YTA4NCwgMHgwMDAzLCAweGEwODYsIDB4MDAwMywgMHgwMDdjLCAweDIwNTEsIDB4MDAwMCwgMHgwMDdjLAorCTB4OGE1MCwgMHg4NzM5LCAweDI3MDQsIDB4YTAwNCwgMHgwMGMwLCAweDQ5YjQsIDB4NjAwMCwgMHhhMDY0LAorCTB4MDBjMCwgMHg0OWFiLCAweDJkNjAsIDB4NjAwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHg0ODFjLAorCTB4MjAzYywgMHg4N2ZiLCAweDEwNDAsIDB4MjNlYiwgMHgwMDdjLCAweDEyN2UsIDB4MGQ3ZSwgMHgyMDkxLAorCTB4MjIwMCwgMHgwZDdmLCAweDY4ODQsIDB4MjA2MCwgMHg2ODg4LCAweDZiOGMsIDB4NmM5MCwgMHg4MDU3LAorCTB4YWFkNCwgMHgwMGZmLCAweGEwODQsIDB4MDBmZiwgMHgwMDdlLCAweDY4MDQsIDB4YTA4NCwgMHgwMDA4LAorCTB4MDA3ZiwgMHgwMDQwLCAweDQ5Y2YsIDB4YTBiOCwgMHg0ODA2LCAweDAwNzgsIDB4NDlkMSwgMHhhMGI4LAorCTB4NDdmZSwgMHg3ZTA4LCAweGE2YjUsIDB4MDAwYywgMHg2OTA0LCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LAorCTB4MDAwNywgMHgwMDQwLCAweDQ5ZGYsIDB4YTE4ZSwgMHgwMDBmLCAweDAwYzAsIDB4NDllOCwgMHg2ODFjLAorCTB4YTA4NCwgMHgwMDQwLCAweDAwNDAsIDB4NDllZiwgMHhhNmI1LCAweDAwMDEsIDB4MDA3OCwgMHg0OWVmLAorCTB4NjgxYywgMHhhMDg0LCAweDAwNDAsIDB4MDA0MCwgMHg0OWVmLCAweGE2YjUsIDB4MDAwMSwgMHg3MDA3LAorCTB4MDAwNCwgMHg3MDA0LCAweGEwODQsIDB4MDAwNCwgMHgwMGMwLCAweDQ5ZjEsIDB4MjQwMCwgMHhhMzA1LAorCTB4MDBjMCwgMHg0OWZjLCAweDAwNzgsIDB4NGEyMiwgMHgyYzU4LCAweDI3MDQsIDB4NjEwNCwgMHhhYzYwLAorCTB4NjAwMCwgMHhhNDAwLCAweDcwMWEsIDB4NjAwNCwgMHhhMzAxLCAweDcwMWUsIDB4YTE4NCwgMHgwMDA4LAorCTB4MDA0MCwgMHg0YTEyLCAweDYwMTAsIDB4YTA4MSwgMHgwMDAwLCAweDcwMjIsIDB4NjAxNCwgMHhhMDgxLAorCTB4MDAwMCwgMHg3MDI2LCAweDYyMDgsIDB4MjQwMCwgMHhhMjAyLCAweDcwMTIsIDB4NjIwYywgMHgyMzAwLAorCTB4YTIwMywgMHg3MDE2LCAweDc2MDIsIDB4NzAwNywgMHgwMDAxLCAweDJiNjAsIDB4MTA3OCwgMHg0OTgxLAorCTB4MDA3OCwgMHg0YTI0LCAweDEwNzgsIDB4NGIwNywgMHgwMGMwLCAweDRhMjIsIDB4MTI3ZiwgMHgyMDAwLAorCTB4MDA3YywgMHgxMjdlLCAweDBkN2UsIDB4MjA5MSwgMHgyMjAwLCAweDBkN2YsIDB4NzAwNywgMHgwMDA0LAorCTB4NzAwNCwgMHhhMDg0LCAweDAwMDQsIDB4MDBjMCwgMHg0YTMwLCAweDcwMDMsIDB4MDAwOCwgMHgxMjdmLAorCTB4MjAwMCwgMHgwMDdjLCAweDEyN2UsIDB4MGQ3ZSwgMHgyMDkxLCAweDIyMDAsIDB4MGQ3ZiwgMHgyMDQ5LAorCTB4NGEzYSwgMHg3MDA3LCAweDAwMDQsIDB4NzAwNCwgMHhhMDg0LCAweDAwMDQsIDB4MDBjMCwgMHg0YTQzLAorCTB4N2UwOCwgMHhhNmI1LCAweDAwMGMsIDB4NjkwNCwgMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDA3LAorCTB4MDA0MCwgMHg0YTU2LCAweGExOGUsIDB4MDAwZiwgMHgwMGMwLCAweDRhNjEsIDB4NjgxYywgMHhhMDg0LAorCTB4MDA0MCwgMHgwMDQwLCAweDRhNWQsIDB4YTZiNSwgMHgwMDAxLCAweDY4NDAsIDB4MjA1MCwgMHgwMDc4LAorCTB4NGE2YSwgMHg2ODFjLCAweGEwODQsIDB4MDAyMCwgMHgwMGMwLCAweDRhNjgsIDB4YTZiNSwgMHgwMDAxLAorCTB4NjgyOCwgMHgyMDUwLCAweDJkNjAsIDB4NjAwNCwgMHhhMGJjLCAweDAwMGYsIDB4YTdiOCwgMHg0ODBjLAorCTB4MjczYywgMHg4N2ZiLCAweDAwYzAsIDB4NGE3ZSwgMHgwMDQ4LCAweDRhNzgsIDB4MTA3OCwgMHgyM2ViLAorCTB4Njg5YywgMHhhMDY1LCAweDAwNDAsIDB4NGE4MiwgMHgwMDc4LCAweDRhNmIsIDB4MTA3OCwgMHg0YjA3LAorCTB4MDBjMCwgMHg0YTdlLCAweDEyN2YsIDB4MjAwMCwgMHgwMDdjLCAweDEyN2UsIDB4MDA3ZSwgMHgwMTdlLAorCTB4MGQ3ZSwgMHgyMDkxLCAweDIyMDAsIDB4MGQ3ZiwgMHgwMzdmLCAweDA0N2YsIDB4N2UwOCwgMHhhNmI1LAorCTB4MDAwYywgMHg2OTA0LCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMDcsIDB4MDA0MCwgMHg0YTljLAorCTB4YTE4ZSwgMHgwMDBmLCAweDAwYzAsIDB4NGFhNSwgMHg2ODFjLCAweGEwODQsIDB4MDA0MCwgMHgwMDQwLAorCTB4NGFhYywgMHhhNmI1LCAweDAwMDEsIDB4MDA3OCwgMHg0YWFjLCAweDY4MWMsIDB4YTA4NCwgMHgwMDQwLAorCTB4MDA0MCwgMHg0YWFjLCAweGE2YjUsIDB4MDAwMSwgMHgyMDQ5LCAweDRhODUsIDB4MDE3ZSwgMHg2OTA0LAorCTB4YTE4YywgMHgwMGZmLCAweGExODYsIDB4MDAwNywgMHgwMDQwLCAweDRhYmEsIDB4YTE4ZSwgMHgwMDBmLAorCTB4MDBjMCwgMHg0YWJkLCAweDY4NDAsIDB4MDA3OCwgMHg0YWJlLCAweDY4MjgsIDB4MDE3ZiwgMHhhMDU1LAorCTB4MDA0MCwgMHg0YjA0LCAweDJkNzAsIDB4MmU2MCwgMHg3MDA0LCAweGEwYmMsIDB4MDAwZiwgMHhhN2I4LAorCTB4NDgwYywgMHgyNzNjLCAweDg3ZmIsIDB4MDBjMCwgMHg0YWQ4LCAweDAwNDgsIDB4NGFkMSwgMHgxMDc4LAorCTB4MjNlYiwgMHg3MDljLCAweGEwNzUsIDB4MjA2MCwgMHgwMDQwLCAweDRiMDQsIDB4MDA3OCwgMHg0YWM0LAorCTB4MjcwNCwgMHhhZTY4LCAweDY4MDgsIDB4YTQyMiwgMHg2ODBjLCAweGEzMWIsIDB4MDA0OCwgMHg0YWYxLAorCTB4OGE1MSwgMHgwMGMwLCAweDRhZTUsIDB4MTA3OCwgMHgyM2ViLCAweDg3MzgsIDB4MjcwNCwgMHhhMDA1LAorCTB4MDBjMCwgMHg0YWQ5LCAweDcwOWMsIDB4YTA3NSwgMHgyMDYwLCAweDAwNDAsIDB4NGIwNCwgMHgwMDc4LAorCTB4NGFjNCwgMHg4NDIyLCAweDg0MjAsIDB4ODMxYSwgMHhhMzk5LCAweDAwMDAsIDB4NjkwOCwgMHgyNDAwLAorCTB4YTEyMiwgMHg2OTBjLCAweDIzMDAsIDB4YTExYiwgMHgwMGM4LCAweDRiMDAsIDB4MTA3OCwgMHgyM2ViLAorCTB4MjA3MSwgMHgwMDIwLCAweDAwNzgsIDB4NDllZiwgMHgxMjdmLCAweDIwMDAsIDB4MDA3YywgMHg3MDA4LAorCTB4YTA4NCwgMHgwMDAzLCAweGEwODYsIDB4MDAwMywgMHgwMDQwLCAweDRiMmYsIDB4MjcwNCwgMHhhYzA4LAorCTB4MjEwNCwgMHg3MDFhLCAweDgxMDgsIDB4MjEwNCwgMHg3MDFlLCAweDgxMDgsIDB4MjEwNCwgMHg3MDEyLAorCTB4ODEwOCwgMHgyMTA0LCAweDcwMTYsIDB4NjAwNCwgMHhhMDg0LCAweDAwMDgsIDB4MDA0MCwgMHg0YjI2LAorCTB4ODEwOCwgMHgyMTA0LCAweDcwMjIsIDB4ODEwOCwgMHgyMTA0LCAweDcwMjYsIDB4NzYwMiwgMHg3MDA0LAorCTB4YTA4NCwgMHgwMDEwLCAweGEwODUsIDB4MDAwMSwgMHg3MDA2LCAweDEwNzgsIDB4NDk4MSwgMHgwMDdjLAorCTB4MTI3ZSwgMHgwMDdlLCAweDBkN2UsIDB4MjA5MSwgMHgyMjAwLCAweDIwNDksIDB4NGIzMCwgMHgwZDdmLAorCTB4MDg3ZiwgMHg3MTA4LCAweGExODQsIDB4MDAwMywgMHgwMGMwLCAweDRiNWEsIDB4MDE3ZSwgMHg2OTA0LAorCTB4YTE4YywgMHgwMGZmLCAweGExODYsIDB4MDAwNywgMHgwMDQwLCAweDRiNGEsIDB4YTE4ZSwgMHgwMDBmLAorCTB4MDBjMCwgMHg0YjRkLCAweDY4NDAsIDB4MDA3OCwgMHg0YjRlLCAweDY4MjgsIDB4MDE3ZiwgMHhhMDA1LAorCTB4MDA0MCwgMHg0YjY4LCAweDAwNzgsIDB4NDc4ZCwgMHgwMDIwLCAweDRiNWEsIDB4MTA3OCwgMHg0OTQ0LAorCTB4MDA3OCwgMHg0YjY4LCAweDAwYTAsIDB4NGI2MSwgMHg3MTA4LCAweDEwNzgsIDB4NDhiZCwgMHgwMDc4LAorCTB4NGIzOSwgMHg3MDA3LCAweDAwMTAsIDB4MDBhMCwgMHg0YjYzLCAweDcxMDgsIDB4MTA3OCwgMHg0OGJkLAorCTB4NzAwOCwgMHhhMDg2LCAweDAwMDgsIDB4MDBjMCwgMHg0YjM5LCAweDcwMDAsIDB4YTAwNSwgMHgwMGMwLAorCTB4NGIzOSwgMHg3MDAzLCAweDAwMDAsIDB4MjA0OSwgMHgwMDAwLCAweDEyN2YsIDB4MjAwMCwgMHgwMDdjLAorCTB4MTI3ZSwgMHgxNDdlLCAweDEzN2UsIDB4MTU3ZSwgMHgwYzdlLCAweDBkN2UsIDB4MjA5MSwgMHgyMjAwLAorCTB4MGQ3ZiwgMHgyMDQ5LCAweDRiNzgsIDB4YWQ4MCwgMHgwMDExLCAweDIwYTAsIDB4MjA5OSwgMHgwMDMxLAorCTB4NzAwYywgMHhhMDg0LCAweDAwZmYsIDB4NjgyYSwgMHg3MDA3LCAweDAwMDgsIDB4NzAwNywgMHgwMDAyLAorCTB4NzAwMywgMHgwMDAxLCAweDAwNDAsIDB4NGI5NywgMHg4MDAwLCAweDgwYWMsIDB4NTNhNSwgMHg3MDA3LAorCTB4MDAwNCwgMHg3MDA0LCAweGEwODQsIDB4MDAwNCwgMHgwMGMwLCAweDRiOTksIDB4MGM3ZiwgMHgyMDQ5LAorCTB4MDAwMCwgMHg3MDAzLCAweDAwMDAsIDB4MTU3ZiwgMHgxMzdmLCAweDE0N2YsIDB4MTI3ZiwgMHgyMDAwLAorCTB4MDA3YywgMHgyMDkxLCAweDYwMDAsIDB4MjA5MSwgMHg4MDAwLCAweDc4Y2MsIDB4YTAwNSwgMHgwMDQwLAorCTB4NGJjMCwgMHg3OTk0LCAweDcwZDAsIDB4YTEwNiwgMHgwMGMwLCAweDRiYzAsIDB4NzgwNCwgMHhhMDA1LAorCTB4MDA0MCwgMHg0YmMwLCAweDc4MDcsIDB4MDAwMCwgMHgwMDY4LCAweDRiYzAsIDB4MjA5MSwgMHg0MDgwLAorCTB4NzgyMCwgMHg4MDAxLCAweDc4MjIsIDB4MDBjMCwgMHg0YzFiLCAweDc4MjQsIDB4NzgyMiwgMHgyMDY5LAorCTB4NTE0MCwgMHg2ODAwLCAweGEwODQsIDB4MDAwNywgMHgwMDQwLCAweDRiZGUsIDB4YTA4NiwgMHgwMDAyLAorCTB4MDA0MCwgMHg0YmRlLCAweDY4MzQsIDB4YTAwZCwgMHgwMDQwLCAweDRiZGUsIDB4MjEwNCwgMHhhMDA1LAorCTB4MDA0MCwgMHg0YmRlLCAweDgwMDEsIDB4MjAwYSwgMHgwMDQwLCAweDRjYzMsIDB4Nzg0OCwgMHhhMDA1LAorCTB4MDA0MCwgMHg0YmVjLCAweDgwMDEsIDB4Nzg0YSwgMHgwMGMwLCAweDRiZWMsIDB4MjAwOSwgMHgwMTAyLAorCTB4Njg0NCwgMHgyMDBhLCAweDEwNzgsIDB4MjFkMiwgMHg2ODkwLCAweGEwMDUsIDB4MDA0MCwgMHg0YmY4LAorCTB4ODAwMSwgMHg2ODkyLCAweDAwYzAsIDB4NGJmOCwgMHg2ODZmLCAweDAwMDAsIDB4Njg3MywgMHgwMDAxLAorCTB4MjA2MSwgMHg1NDAwLCAweDIwYTksIDB4MDEwMCwgMHgyMDA5LCAweDAwMDIsIDB4NjAzNCwgMHhhMDA1LAorCTB4MDA0MCwgMHg0YzBlLCAweDgwMDEsIDB4NjAzNiwgMHgwMGMwLCAweDRjMGUsIDB4NjAxMCwgMHhhMDA1LAorCTB4MDA0MCwgMHg0YzBlLCAweDAxN2UsIDB4MTA3OCwgMHgyMWQyLCAweDAxN2YsIDB4YWNlMCwgMHgwMDEwLAorCTB4MDA3MCwgMHg0YzE0LCAweDAwNzgsIDB4NGJmZSwgMHg4MTA5LCAweDAwNDAsIDB4NGMxYiwgMHgyMGE5LAorCTB4MDEwMCwgMHgwMDc4LCAweDRiZmUsIDB4MTA3OCwgMHg0YzI4LCAweDEwNzgsIDB4NGM0ZCwgMHgyMDA5LAorCTB4NTE1MSwgMHgyMTA0LCAweDIwMDksIDB4MDEwMiwgMHgyMDBhLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLAorCTB4NzgzNCwgMHg4MDAxLCAweDc4MzYsIDB4MDBjMCwgMHg0YzRjLCAweDc4MzgsIDB4NzgzNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg3ODQ0LCAweGEwMDUsIDB4MDBjMCwgMHg0YzM3LCAweDIwMDEsIDB4MDEwMSwgMHg4MDAxLAorCTB4Nzg0NiwgMHhhMDgwLCAweDc0MDAsIDB4MjA0MCwgMHgyMDA0LCAweGEwNjUsIDB4MDA0MCwgMHg0YzRjLAorCTB4NjAyNCwgMHhhMDA1LCAweDAwNDAsIDB4NGM0OCwgMHg4MDAxLCAweDYwMjYsIDB4MDA0MCwgMHg0YzdjLAorCTB4NjAwMCwgMHgyYzQwLCAweDAwNzgsIDB4NGMzZCwgMHgwMDdjLCAweDc4MjgsIDB4ODAwMSwgMHg3ODJhLAorCTB4MDBjMCwgMHg0YzdiLCAweDc4MmMsIDB4NzgyYSwgMHg3ODMwLCAweGEwMDUsIDB4MDBjMCwgMHg0YzVhLAorCTB4MjAwMSwgMHgwMjAwLCAweDgwMDEsIDB4NzgzMiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLAorCTB4YTA5MCwgMHg1NDAwLCAweGEyOTgsIDB4MDAwMiwgMHgyMzA0LCAweGEwODQsIDB4MDAwOCwgMHgwMDQwLAorCTB4NGM3YiwgMHhhMjkwLCAweDAwMDksIDB4MjIwNCwgMHhhMDA1LCAweDAwNDAsIDB4NGM3MywgMHg4MDAxLAorCTB4MjAxMiwgMHgwMGMwLCAweDRjN2IsIDB4MjMwNCwgMHhhMDg0LCAweGZmZjcsIDB4YTA4NSwgMHgwMDgwLAorCTB4MjAxYSwgMHgxMDc4LCAweDIxZDIsIDB4MDA3YywgMHgyMDY5LCAweDUxNDAsIDB4NjgwMCwgMHhhMDA1LAorCTB4MDA0MCwgMHg0Yzg2LCAweDY4NDgsIDB4YWMwNiwgMHgwMDQwLCAweDRjYzMsIDB4NjAxYiwgMHgwMDA2LAorCTB4NjBiNCwgMHhhMDg0LCAweDNmMDAsIDB4NjAxZSwgMHg2MDIwLCAweGEwODQsIDB4MDBmZiwgMHhhMDg1LAorCTB4MDA2MCwgMHg2MDIyLCAweDYwMDAsIDB4MjA0MiwgMHg2NzE0LCAweDZmODIsIDB4MTA3OCwgMHgxOTczLAorCTB4NjgxOCwgMHhhMDA1LCAweDAwNDAsIDB4NGM5ZSwgMHg4MDAxLCAweDY4MWEsIDB4NjgwOCwgMHhhMDg0LAorCTB4ZmZlZiwgMHg2ODBhLCAweDY4MTAsIDB4ODAwMSwgMHgwMGQwLCAweDRjYTgsIDB4MTA3OCwgMHgyM2ViLAorCTB4NjgxMiwgMHg2MDJmLCAweDAwMDAsIDB4NjAzMywgMHgwMDAwLCAweDJjNjgsIDB4MTA3OCwgMHgxYzcwLAorCTB4MjA2OSwgMHg1MTQwLCAweDc5NDQsIDB4YTE4NCwgMHgwMTAwLCAweDIwMDEsIDB4MDAwNiwgMHg2ODZlLAorCTB4MDBjMCwgMHg0Y2JlLCAweDY5ODYsIDB4MjAwMSwgMHgwMDA0LCAweDY4NmUsIDB4MTA3OCwgMHgyMWNkLAorCTB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4MjA2OSwgMHgwMTAwLCAweDIwMDksIDB4NTE0MCwgMHgyMTA0LAorCTB4YTA4NCwgMHgwMDA3LCAweDAwNDAsIDB4NGQxZiwgMHhhMDg2LCAweDAwMDcsIDB4MDBjMCwgMHg0Y2Q5LAorCTB4MGQ3ZSwgMHgyMDA5LCAweDUxNTIsIDB4MjE2YywgMHgxMDc4LCAweDNhNGUsIDB4MGQ3ZiwgMHgwMDc4LAorCTB4NGQxZiwgMHgyMDA5LCAweDUxNTIsIDB4MjE2NCwgMHgxMDc4LCAweDIzOTYsIDB4NjAxYiwgMHgwMDA2LAorCTB4Njg1OCwgMHhhMDg0LCAweDNmMDAsIDB4NjAxZSwgMHg2MDIwLCAweGEwODQsIDB4MDBmZiwgMHhhMDg1LAorCTB4MDA0OCwgMHg2MDIyLCAweDYwMmYsIDB4MDAwMCwgMHg2MDMzLCAweDAwMDAsIDB4NjgzMCwgMHhhMDg0LAorCTB4MDA0MCwgMHgwMDQwLCAweDRkMTMsIDB4Njg0YiwgMHgwMDA0LCAweDIwYTksIDB4MDAxNCwgMHg2ODQ4LAorCTB4YTA4NCwgMHgwMDA0LCAweDAwNDAsIDB4NGQwMCwgMHgwMDcwLCAweDRkMDAsIDB4MDA3OCwgMHg0Y2Y3LAorCTB4Njg0YiwgMHgwMDA5LCAweDIwYTksIDB4MDAxNCwgMHg2ODQ4LCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLAorCTB4NGQwZCwgMHgwMDcwLCAweDRkMGQsIDB4MDA3OCwgMHg0ZDA0LCAweDIwYTksIDB4MDBmYSwgMHgwMDcwLAorCTB4NGQxMywgMHgwMDc4LCAweDRkMGYsIDB4NjgwOCwgMHhhMDg0LCAweGZmZmQsIDB4NjgwYSwgMHg2ODFiLAorCTB4MDA0OCwgMHgyMDA5LCAweDUxNWIsIDB4MjAwYiwgMHgwMDA3LCAweDc4NGMsIDB4Nzg0YSwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDdjLCAweDIwNzksIDB4NTEwMCwgMHgxMDc4LCAweDRkNGQsIDB4MTA3OCwgMHg0ZDMxLAorCTB4MTA3OCwgMHg0ZDNmLCAweDc4MzMsIDB4MDAwMCwgMHg3ODQ3LCAweDAwMDAsIDB4Nzg0YiwgMHgwMDAwLAorCTB4MDA3YywgMHgyMDE5LCAweDAwMDMsIDB4MjAxMSwgMHg1MTQ2LCAweDIyMDQsIDB4YTA4NiwgMHgwMDNjLAorCTB4MDA0MCwgMHg0ZDNjLCAweDIwMTksIDB4MDAwMiwgMHg3YjJhLCAweDdiMmUsIDB4MDA3YywgMHgyMDE5LAorCTB4MDAzOSwgMHgyMDExLCAweDUxNDYsIDB4MjIwNCwgMHhhMDg2LCAweDAwM2MsIDB4MDA0MCwgMHg0ZDRhLAorCTB4MjAxOSwgMHgwMDI3LCAweDdiMzYsIDB4N2IzYSwgMHgwMDdjLCAweDIwMTksIDB4Mzk3MSwgMHgyMDExLAorCTB4NTE0NiwgMHgyMjA0LCAweGEwODYsIDB4MDAzYywgMHgwMDQwLCAweDRkNTgsIDB4MjAxOSwgMHgyNjI2LAorCTB4N2IyMiwgMHg3YjI2LCAweDc4M2YsIDB4MDAwMCwgMHg3ODQzLCAweDAwMGEsIDB4MDA3YywgMHgwMDIwLAorCTB4MDAyYiwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLAorCTB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLAorCTB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLAorCTB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLAorCTB4MDAyMCwgMHgwMDAwLCAweDAwMTQsIDB4MDAxNCwgMHg5ODQ5LCAweDAwMTQsIDB4MDAxNCwgMHgwMDE0LAorCTB4MDAxNCwgMHgwMDE0LCAweDAwMTQsIDB4MDAxNCwgMHgwMDgwLCAweDAwMGYsIDB4MDAwMCwgMHgwMjAxLAorCTB4MDYwNCwgMHgwYzA4LCAweDIxMjAsIDB4NDAyMiwgMHhmODgwLCAweDAwMTgsIDB4MzAwYiwgMHhhMjAxLAorCTB4MDAxNCwgMHhhMjAwLCAweDAwMTQsIDB4YTIwMCwgMHgwMjE0LCAweDAwMDAsIDB4MDA2YywgMHgwMDAyLAorCTB4MDAxNCwgMHg5OGQwLCAweDAwOWUsIDB4MDA5NiwgMHhhMjAyLCAweDg4MzgsIDB4MzgwNiwgMHg4ODM5LAorCTB4MjBjMywgMHgwODY0LCAweDk4ODQsIDB4MjhjMSwgMHg5Y2IxLCAweGEyMDMsIDB4MzAwYywgMHgyODQ2LAorCTB4ODE2MSwgMHg4NDZhLCAweDgzMDAsIDB4MTg1NiwgMHg4ODNhLCAweDk4NjUsIDB4MjhmMiwgMHg5YzkwLAorCTB4OTg1OCwgMHgzMDBjLCAweDI4ZTEsIDB4OWM5MCwgMHgyODAyLCAweGEyMDYsIDB4NjRjMywgMHgyODJkLAorCTB4YTIwNywgMHg2NGEwLCAweDY3YTAsIDB4NmZjMCwgMHgxODE0LCAweDg4M2IsIDB4NzgyNCwgMHg2OGMxLAorCTB4Nzg2NCwgMHg4ODNlLCAweDk4NzgsIDB4ODU3NiwgMHg4Njc3LCAweDIwNmIsIDB4MjhjMSwgMHg5Y2IxLAorCTB4MjA0NCwgMHgyMTAzLCAweDIwYTIsIDB4MjA4MSwgMHg5ODY1LCAweGEyMDksIDB4MjkwMSwgMHg5ODhjLAorCTB4MDAxNCwgMHhhMjA1LCAweGEzMDAsIDB4MTg3MiwgMHg4NzlhLCAweDg4M2MsIDB4MWZlMiwgMHhjNjAxLAorCTB4YTIwYSwgMHg4NTZlLCAweDA3MDQsIDB4OWM5MCwgMHgwMDE0LCAweGEyMDQsIDB4YTMwMCwgMHgzMDA5LAorCTB4MTllMiwgMHhmODY4LCAweDgxNzYsIDB4ODZlYiwgMHg4NWViLCAweDg3MmUsIDB4ODdhOSwgMHg4ODNmLAorCTB4MDhlNiwgMHg5ODkwLCAweGY4ODEsIDB4OTg4YiwgMHhjODAxLCAweDAwMTQsIDB4ZjhjMSwgMHgwMDE2LAorCTB4ODViMiwgMHg4MGYwLCAweDk1MzIsIDB4ZmIwMiwgMHgxZGUyLCAweDAwMTQsIDB4ODUzMiwgMHhmMjQxLAorCTB4MDAxNCwgMHgxZGUyLCAweDg0YTgsIDB4ZDdhMCwgMHgxZmU2LCAweDAwMTQsIDB4YTIwOCwgMHg2MDQzLAorCTB4ODAwOCwgMHgxZGMxLCAweDAwMTYsIDB4ODMwMCwgMHg4MTYwLCAweDg0MmEsIDB4ZjA0MSwgMHgzMDA4LAorCTB4ODRhOCwgMHgxMWQ2LCAweDcwNDIsIDB4MjBkZCwgMHgwMDExLCAweDIwZDUsIDB4ODgyMiwgMHgwMDE2LAorCTB4ODAwMCwgMHgyODQ3LCAweDEwMTEsIDB4OThjMywgMHg4MDAwLCAweGEwMDAsIDB4MjgwMiwgMHgxMDExLAorCTB4OThjOSwgMHg5ODY1LCAweDI4M2UsIDB4MTAxMSwgMHg5OGNkLCAweGEyMGIsIDB4MDAxNywgMHgzMDBjLAorCTB4YTMwMCwgMHgxZGUyLCAweGRiODEsIDB4MDAxNCwgMHgwMjEwLCAweDk4ZGEsIDB4MDAxNCwgMHgyNmUwLAorCTB4ODczYSwgMHhmYjAyLCAweDE5ZjIsIDB4MWZlMiwgMHgwMDE0LCAweGEyMGQsIDB4MzgwNiwgMHgwMjEwLAorCTB4OWNiNiwgMHgwNzA0LCAweDAwMDAsIDB4MDA2YywgMHgwMDAyLCAweDk4NGYsIDB4MDAxNCwgMHgwMDllLAorCTB4MDBhNSwgMHgwMDE3LCAweDYwZmYsIDB4MzAwYywgMHg4NzIwLCAweGEyMTEsIDB4OWNkNSwgMHg4NzcyLAorCTB4ODgzNywgMHgyMTAxLCAweDk4N2EsIDB4MTBkMiwgMHg3OGUyLCAweDljZDgsIDB4OTg1OSwgMHhkOTg0LAorCTB4ZjBlMiwgMHhmMGExLCAweDk4ZDIsIDB4MDAxNCwgMHg4ODMxLCAweGQxNjYsIDB4ODgzMCwgMHg4MDBmLAorCTB4OTQwMSwgMHhiNTIwLCAweGM4MDIsIDB4ODgyMCwgMHg5ODdhLCAweDIzMDEsIDB4OTg3YSwgMHgxMGQyLAorCTB4NzhlNCwgMHg5Y2Q4LCAweDg4MjEsIDB4ODgyMCwgMHg5ODU5LCAweGYxMjMsIDB4ZjE0MiwgMHhmMTAxLAorCTB4OThjYiwgMHgxMGQyLCAweDcwZjYsIDB4ODgzMiwgMHg4MjAzLCAweDg3MGMsIDB4ZDk5ZSwgMHg2MDAxLAorCTB4MDAxNCwgMHg2ODQ1LCAweDAyMTQsIDB4YTIxYiwgMHg5Y2Q1LCAweDIwMDEsIDB4OThjYSwgMHg4MjAxLAorCTB4MTg1MiwgMHhkMTg0LCAweGQxNjMsIDB4ODgzNCwgMHg4MDAxLCAweDk4OGQsIDB4MzAyNywgMHg4NGE4LAorCTB4MWE1NiwgMHg4ODMzLCAweDAwMTQsIDB4YTIxOCwgMHg2OTgxLCAweDljYzEsIDB4NjkyYSwgMHg2OTAyLAorCTB4MTgzNCwgMHg5ODlkLCAweDFhMTQsIDB4ODAxMCwgMHg4NTkyLCAweDgwMjYsIDB4ODRiOSwgMHg3MDIxLAorCTB4MDAxNCwgMHhhMzAwLCAweDY5ZTEsIDB4OWNhYSwgMHg2OTRjLCAweGEyMTMsIDB4OWNiYSwgMHgxNDYyLAorCTB4YTIxMywgMHg4MDAwLCAweDE2ZTEsIDB4OThiNCwgMHg4MDIzLCAweDE2ZTEsIDB4ODAwMSwgMHgxMGYxLAorCTB4MDAxNiwgMHg2OTY4LCAweGEyMTQsIDB4OWNiYSwgMHg4MDA0LCAweDE2ZTEsIDB4MDEwMSwgMHgzMDBhLAorCTB4ODgyNywgMHgwMDE0LCAweDljYmEsIDB4MDAxNCwgMHg2MWMyLCAweDgwMDIsIDB4MTRlMSwgMHgwMDE2LAorCTB4YTIxNywgMHg5Y2MxLCAweDAwMTQsIDB4YTMwMCwgMHg4MTgxLCAweDg0MmEsIDB4ODRhOCwgMHgxY2U2LAorCTB4ODgyYywgMHgwMDE2LCAweGEyMTIsIDB4OWNkNSwgMHgxMGQyLCAweDcwZTQsIDB4MDAwNCwgMHg4MDA3LAorCTB4OTQyNCwgMHhjYzFhLCAweDljZDgsIDB4OThjYSwgMHg4ODI3LCAweDMwMGEsIDB4MDAxMywgMHg4MDAwLAorCTB4ODRhNCwgMHgwMDE2LCAweDExYzIsIDB4MjExZSwgMHg4NzBlLCAweGEyMWQsIDB4MDAxNCwgMHg4NzhlLAorCTB4MDAxNiwgMHhhMjFjLCAweDEwMzUsIDB4OTg5MSwgMHhhMjEwLCAweGEwMDAsIDB4ODAxMCwgMHg4NTkyLAorCTB4ODUzYiwgMHhkMDQ0LCAweDgwMjIsIDB4MzgwNywgMHg4NGJiLCAweDk4ZWYsIDB4ODAyMSwgMHgzODA3LAorCTB4ODRiOSwgMHgzMDBjLCAweDgxN2UsIDB4ODcyYiwgMHg4NzcyLCAweDk4OTEsIDB4MDAwMCwgMHgwMDIwLAorCTB4MDAyYiwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLAorCTB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLAorCTB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLAorCTB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLAorCTB4MDAyMCwgMHgwMDAwLCAweDAwMTQsIDB4MDAxNCwgMHg5ODQ5LCAweDAwMTQsIDB4MDAxNCwgMHg5OGU1LAorCTB4OThkMCwgMHgwMDE0LCAweDAwMTQsIDB4MDAxNCwgMHgwMDgwLCAweDAxM2YsIDB4MDAwMCwgMHgwMjAxLAorCTB4MDYwNCwgMHgwYzA4LCAweDIxMjAsIDB4NDAyMiwgMHhmODgwLCAweDAwMTgsIDB4MzAwYiwgMHhhMjAxLAorCTB4MDAxNCwgMHhhMjAwLCAweDAwMTQsIDB4YTIwMCwgMHgwMjE0LCAweGEyMDIsIDB4ODgzOCwgMHgzODA2LAorCTB4ODgzOSwgMHgyMGMzLCAweDA4NjQsIDB4YTgyZSwgMHgyOGMxLCAweDljYjEsIDB4YTIwMywgMHgzMDBjLAorCTB4Mjg0NiwgMHg4MTYxLCAweDg0NmEsIDB4ODMwMCwgMHgxODU2LCAweDg4M2EsIDB4YTgwNCwgMHgyOGYyLAorCTB4OWM5MCwgMHhhOGY0LCAweDMwMGMsIDB4MjhlMSwgMHg5YzkwLCAweDI4MDIsIDB4YTIwNiwgMHg2NGMzLAorCTB4MjgyZCwgMHhhMjA3LCAweDY0YTAsIDB4NjdhMCwgMHg2ZmMwLCAweDE4MTQsIDB4ODgzYiwgMHg3ODI0LAorCTB4NjhjMSwgMHg3ODY0LCAweDg4M2UsIDB4YTgwMiwgMHg4NTc2LCAweDg2NzcsIDB4MjA2YiwgMHgyOGMxLAorCTB4OWNiMSwgMHgyMDQ0LCAweDIxMDMsIDB4MjBhMiwgMHgyMDgxLCAweGE4ZTUsIDB4YTIwOSwgMHgyOTAxLAorCTB4YTgwOSwgMHgwMDE0LCAweGEyMDUsIDB4YTMwMCwgMHgxODcyLCAweDg3OWEsIDB4ODgzYywgMHgxZmUyLAorCTB4YzYwMSwgMHhhMjBhLCAweDg1NmUsIDB4MDcwNCwgMHg5YzkwLCAweDAwMTQsIDB4YTIwNCwgMHhhMzAwLAorCTB4MzAwOSwgMHgxOWUyLCAweGY4NjgsIDB4ODE3NiwgMHg4NmViLCAweDg1ZWIsIDB4ODcyZSwgMHg4N2E5LAorCTB4ODgzZiwgMHgwOGU2LCAweGE4ZjMsIDB4Zjg4MSwgMHhhOGVjLCAweGM4MDEsIDB4MDAxNCwgMHhmOGMxLAorCTB4MDAxNiwgMHg4NWIyLCAweDgwZjAsIDB4OTUzMiwgMHhmYjAyLCAweDFkZTIsIDB4MDAxNCwgMHg4NTMyLAorCTB4ZjI0MSwgMHgwMDE0LCAweDFkZTIsIDB4ODRhOCwgMHhkN2EwLCAweDFmZTYsIDB4MDAxNCwgMHhhMjA4LAorCTB4NjA0MywgMHg4MDA4LCAweDFkYzEsIDB4MDAxNiwgMHg4MzAwLCAweDgxNjAsIDB4ODQyYSwgMHhmMDQxLAorCTB4MzAwOCwgMHg4NGE4LCAweDExZDYsIDB4NzA0MiwgMHgyMGRkLCAweDAwMTEsIDB4MjBkNSwgMHg4ODIyLAorCTB4MDAxNiwgMHg4MDAwLCAweDI4NDcsIDB4MTAxMSwgMHhhOGZjLCAweDgwMDAsIDB4YTAwMCwgMHgyODAyLAorCTB4MTAxMSwgMHhhOGZkLCAweGE4OTgsIDB4MjgzZSwgMHgxMDExLCAweGE4ZmQsIDB4YTIwYiwgMHgwMDE3LAorCTB4MzAwYywgMHhhMzAwLCAweDFkZTIsIDB4ZGI4MSwgMHgwMDE0LCAweDAyMTAsIDB4YTgwMSwgMHgwMDE0LAorCTB4MjZlMCwgMHg4NzNhLCAweGZiMDIsIDB4MTlmMiwgMHgxZmUyLCAweDAwMTQsIDB4YTIwZCwgMHgzODA2LAorCTB4MDIxMCwgMHg5Y2I2LCAweDA3MDQsIDB4MDAxNywgMHg2MGZmLCAweDMwMGMsIDB4ODcyMCwgMHhhMjExLAorCTB4OWQ2YiwgMHg4NzcyLCAweDg4MzcsIDB4MjEwMSwgMHhhODIxLCAweDEwZDIsIDB4NzhlMiwgMHg5ZDZlLAorCTB4YThmYywgMHhkOTg0LCAweGYwZTIsIDB4ZjBhMSwgMHhhODcxLCAweDAwMTQsIDB4ODgzMSwgMHhkMTY2LAorCTB4ODgzMCwgMHg4MDBmLCAweDk0MDEsIDB4YjUyMCwgMHhjODAyLCAweDg4MjAsIDB4YTgwZiwgMHgyMzAxLAorCTB4YTgwZCwgMHgxMGQyLCAweDc4ZTQsIDB4OWQ2ZSwgMHg4ODIxLCAweDg4MjAsIDB4YThlNiwgMHhmMTIzLAorCTB4ZjE0MiwgMHhmMTAxLCAweGE4NTQsIDB4MTBkMiwgMHg3MGY2LCAweDg4MzIsIDB4ODIwMywgMHg4NzBjLAorCTB4ZDk5ZSwgMHg2MDAxLCAweDAwMTQsIDB4Njg0NSwgMHgwMjE0LCAweGEyMWIsIDB4OWQ2YiwgMHgyMDAxLAorCTB4YTg0NSwgMHg4MjAxLCAweDE4NTIsIDB4ZDE4NCwgMHhkMTYzLCAweDg4MzQsIDB4ODAwMSwgMHhhODAxLAorCTB4MzAyNywgMHg4NGE4LCAweDFhNTYsIDB4ODgzMywgMHgwMDE0LCAweGEyMTgsIDB4Njk4MSwgMHg5ZDU3LAorCTB4NjkyYSwgMHg2OTAyLCAweDE4MzQsIDB4YTgwNSwgMHgxYTE0LCAweDgwMTAsIDB4ODU5MiwgMHg4MDI2LAorCTB4ODRiOSwgMHg3MDIxLCAweDAwMTQsIDB4YTMwMCwgMHg2OWUxLCAweDlkNDAsIDB4Njk0YywgMHhhMjEzLAorCTB4OWQ1MCwgMHgxNDYyLCAweGEyMTMsIDB4ODAwMCwgMHgxNmUxLCAweGE4MGEsIDB4ODAyMywgMHgxNmUxLAorCTB4ODAwMSwgMHgxMGYxLCAweDAwMTYsIDB4Njk2OCwgMHhhMjE0LCAweDlkNTAsIDB4ODAwNCwgMHgxNmUxLAorCTB4MDEwMSwgMHgzMDBhLCAweDg4MjcsIDB4MDAxNCwgMHg5ZDUwLCAweDAwMTQsIDB4NjFjMiwgMHg4MDAyLAorCTB4MTRlMSwgMHgwMDE2LCAweGEyMTcsIDB4OWQ1NywgMHgwMDE0LCAweGEzMDAsIDB4ODE4MSwgMHg4NDJhLAorCTB4ODRhOCwgMHgxY2U2LCAweDg4MmMsIDB4MDAxNiwgMHhhMjEyLCAweDlkNmIsIDB4MTBkMiwgMHg3MGU0LAorCTB4MDAwNCwgMHg4MDA3LCAweDk0MjQsIDB4Y2MxYSwgMHg5ZDZlLCAweGE4ZjgsIDB4ODgyNywgMHgzMDBhLAorCTB4MDAxMywgMHg4MDAwLCAweDg0YTQsIDB4MDAxNiwgMHgxMWMyLCAweDIxMWUsIDB4ODcwZSwgMHhhMjFkLAorCTB4MDAxNCwgMHg4NzhlLCAweDAwMTYsIDB4YTIxYywgMHgxMDM1LCAweGE4YWYsIDB4YTIxMCwgMHgzODA3LAorCTB4MzAwYywgMHg4MTdlLCAweDg3MmIsIDB4ODc3MiwgMHhhOGE4LCAweDAwMDAsIDB4ZGYyMQorfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCAgIHJpc2NfY29kZV9sZW5ndGgwMSA9IDB4NDA1NzsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsMTIxNjBfZncuaCBiL2RyaXZlcnMvc2NzaS9xbDEyMTYwX2Z3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiNmEyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbDEyMTYwX2Z3LmgKQEAgLTAsMCArMSwxNzgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgUUxPR0lDIExJTlVYIFNPRlRXQVJFCisgKgorICogUUxvZ2ljIElTUDEyMTYwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuMi54IGFuZCAyLjQueAorICogQ29weXJpZ2h0IChDKSAyMDAyIFFsb2dpYyBDb3Jwb3JhdGlvbiAod3d3LnFsb2dpYy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCSAgICAgICAgICAgLS0tIElTUDEyMTYwQSBJbml0aWF0b3IgRmlybXdhcmUgLS0tICAgICAgICAgICAgICAgICAqCisgKgkJCSAgICAgIDMyIExVTiBTdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglGaXJtd2FyZSBWZXJzaW9uIDEwLjA0LjMyICgxMjowMyBNYXkgMDksIDIwMDEpCisgKi8KKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCitzdGF0aWMgdW5zaWduZWQgY2hhciBmdzEyMTYwaV92ZXJzaW9uX3N0cltdID0gezEwLDQsMzJ9OworI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGZpcm13YXJlX3ZlcnNpb25bXSA9IHsxMCw0LDMyfTsKKyNlbmRpZgorCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKKyNkZWZpbmUgZncxMjE2MGlfVkVSU0lPTl9TVFJJTkcgIjEwLjA0LjMyIgorI2Vsc2UKKyNkZWZpbmUgRldfVkVSU0lPTl9TVFJJTkcgIjEwLjA0LjMyIgorI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQorc3RhdGljIHVuc2lnbmVkIHNob3J0IGZ3MTIxNjBpX2FkZHIwMSA9IDB4MTAwMDsKKyNlbHNlCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmlzY19jb2RlX2FkZHIwMSA9IDB4MTAwMDsKKyNlbmRpZgorCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmdzEyMTYwaV9jb2RlMDFbXSA9IHsKKyNlbHNlCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmlzY19jb2RlMDFbXSA9IHsKKyNlbmRpZgorCTB4MDgwNCwgMHgxMDQxLCAweDAwMDAsIDB4MzVlNiwgMHgwMDAwLCAweDIwNDMsIDB4NGY1MCwgMHg1OTUyLAorCTB4NDk0NywgMHg0ODU0LCAweDIwMzEsIDB4MzkzOSwgMHgzMTJjLCAweDMxMzksIDB4MzkzMiwgMHgyYzMxLAorCTB4MzkzOSwgMHgzMzJjLCAweDMxMzksIDB4MzkzNCwgMHgyMDUxLCAweDRjNGYsIDB4NDc0OSwgMHg0MzIwLAorCTB4NDM0ZiwgMHg1MjUwLCAweDRmNTIsIDB4NDE1NCwgMHg0OTRmLCAweDRlMDAsIDB4MjA0OSwgMHg1MzUwLAorCTB4MzEzMiwgMHgzMTM2LCAweDIwNDYsIDB4Njk3MiwgMHg2ZDc3LCAweDYxNzIsIDB4NjUyMCwgMHgyMDU2LAorCTB4NjU3MiwgMHg3MzY5LCAweDZmNmUsIDB4MjAzMSwgMHgzMDJlLCAweDMwMzQsIDB4MjAyMCwgMHgyMDQzLAorCTB4NzU3MywgMHg3NDZmLCAweDZkNjUsIDB4NzIyMCwgMHg0ZTZmLCAweDJlMjAsIDB4MzAzMCwgMHgyMDUwLAorCTB4NzI2ZiwgMHg2NDc1LCAweDYzNzQsIDB4MjA0ZSwgMHg2ZjJlLCAweDIwMjAsIDB4MzAzMCwgMHgyMDIwLAorCTB4MjQwMCwgMHgyMGM5LCAweDhmZmYsIDB4MjA3MSwgMHgwMjAwLCAweDcwYTAsIDB4NzBhMiwgMHgyMDAxLAorCTB4MDFmZiwgMHgyMDA0LCAweGQwZmMsIDB4MTEyMCwgMHgyMDcxLCAweDAxMDAsIDB4NzBhMCwgMHg3MGEyLAorCTB4MjBjMSwgMHgwMDIwLCAweDIwODksIDB4MTIyMSwgMHgyMDcxLCAweDAwMTAsIDB4NzBjMywgMHgwMDA0LAorCTB4NzBjNywgMHg0OTUzLCAweDcwY2IsIDB4NTAyMCwgMHg3MGNmLCAweDIwMjAsIDB4NzBkMywgMHgwMDBhLAorCTB4MjAwMSwgMHgwNGZkLCAweDIwMDQsIDB4NzBkNiwgMHgyMDA5LCAweGZlZmYsIDB4MjEzMCwgMHgyMTI4LAorCTB4YTFhMiwgMHg0NjAwLCAweDg0MjQsIDB4ODQyNCwgMHg4NDI0LCAweDg0MjQsIDB4ODQyNCwgMHg4NDI0LAorCTB4YTE5MiwgMHg5MDAwLCAweDIwMDksIDB4MDAwMCwgMHgyMDAxLCAweDAwMzIsIDB4MDgwYywgMHgxZGU4LAorCTB4MjIxOCwgMHgyMDc5LCAweDQ2MDAsIDB4MmZhMCwgMHgyNDA4LCAweDIwMTEsIDB4MDAwMCwgMHgyMGE5LAorCTB4MDA0MCwgMHg0MmE0LCAweDgxMDksIDB4MWRkOCwgMHgyMDA5LCAweGZmMDAsIDB4MzQwMCwgMHhhMTAyLAorCTB4MDIxOCwgMHgwMTEwLCAweDIwYTgsIDB4NDJhNCwgMHg3ODFiLCAweDAwNjQsIDB4NzgxNCwgMHhjMGNkLAorCTB4YzBkNSwgMHg3ODE2LCAweDIwNzEsIDB4MDIwMCwgMHgwMGQ2LCAweDIwNjksIDB4NDY0MCwgMHgwODBjLAorCTB4NDU5YSwgMHgyMDAxLCAweDAxZmYsIDB4MjAwNCwgMHhkMGZjLCAweDExMzAsIDB4MjA2OSwgMHg0NjgwLAorCTB4MjA3MSwgMHgwMTAwLCAweDA4MGMsIDB4NDU5YSwgMHg3ODE0LCAweGMwZDQsIDB4NzgxNiwgMHgwMGRlLAorCTB4N2VjYSwgMHg3Y2MyLCAweDdiYzYsIDB4Nzg2NywgMHgwMDAwLCAweDc4MDAsIDB4YzA4ZCwgMHg3ODAyLAorCTB4MjAzMSwgMHgwMDMwLCAweDc4YWYsIDB4MDEwMSwgMHg3ODIzLCAweDAwMDIsIDB4NzgyNywgMHgwMDAyLAorCTB4MjAwOSwgMHgwMDAyLCAweDIwNjksIDB4NDY0MCwgMHg2ODFiLCAweDAwMDMsIDB4NjgyMywgMHgwMDA3LAorCTB4NjgyNywgMHgwMGZhLCAweDY4MmIsIDB4MDAwOCwgMHg2ODJmLCAweDAwMjgsIDB4NjgzNywgMHgwMDA2LAorCTB4NjgzMywgMHgwMDA4LCAweDY4M2IsIDB4MDAwMCwgMHg4MTA5LCAweDA1MDAsIDB4NjhjZiwgMHgwMDBhLAorCTB4NjhiZiwgMHg0NmMwLCAweDIwNzksIDB4NDYwMCwgMHg2OGQzLCAweDc2MmQsIDB4NjhjMywgMHg0YmMwLAorCTB4NjhjNywgMHg0YWMwLCAweDY4Y2IsIDB4OGJjMCwgMHg2OGE3LCAweDhlNDQsIDB4NjhhYiwgMHg4ZTQ5LAorCTB4NjhhZiwgMHg4ZTQ0LCAweDY4YjMsIDB4OGU0NCwgMHg2OGEzLCAweDAwMDEsIDB4MjAwMSwgMHgwMWZmLAorCTB4MjAwNCwgMHhkMGZjLCAweDExYzgsIDB4MjA2OSwgMHg0NjgwLCAweDA4NzAsIDB4NjhjZiwgMHgwMDBhLAorCTB4NjhiZiwgMHg0OGMwLCAweDY4ZDMsIDB4NzgzOSwgMHg2OGMzLCAweDZiYzAsIDB4NjhjNywgMHg0YjQwLAorCTB4NjhjYiwgMHg4Y2QwLCAweDY4YTcsIDB4OGU0OSwgMHg2OGFiLCAweDhlNGUsIDB4NjhhZiwgMHg4ZTQ5LAorCTB4NjhiMywgMHg4ZTQ5LCAweDY4YTMsIDB4MDAwMSwgMHgwMGU2LCAweDIwNjksIDB4NGFjMCwgMHgyMDcxLAorCTB4MDIwMCwgMHg3MGVjLCAweGQwZTQsIDB4MjAxOSwgMHgxODA5LCAweDIwMjEsIDB4MDAwOSwgMHgxMTIwLAorCTB4MjAxOSwgMHgxODBjLCAweDIwMjEsIDB4MDAwYywgMHgwODBjLCAweDFkNTgsIDB4MjAwMSwgMHgwMWZmLAorCTB4MjAwNCwgMHhkMGZjLCAweDExODgsIDB4MjA2OSwgMHg0YjQwLCAweDIwNzEsIDB4MDEwMCwgMHg3MGVjLAorCTB4ZDBlNCwgMHgyMDE5LCAweDE4MDksIDB4MjAyMSwgMHgwMDA5LCAweDExMjAsIDB4MjAxOSwgMHgxODBjLAorCTB4MjAyMSwgMHgwMDBjLCAweDA4MGMsIDB4MWQ1OCwgMHgwMGVlLCAweDIwMTEsIDB4MDAwMiwgMHgyMDY5LAorCTB4NGJjMCwgMHgyMDA5LCAweDAwMDIsIDB4MjBhOSwgMHgwMTAwLCAweDY4MzcsIDB4MDAwMCwgMHg2ODBiLAorCTB4MDA0MCwgMHg3YmM4LCAweGEzODYsIDB4ZmVmZiwgMHgxMTI4LCAweDY4MTcsIDB4MDEwMCwgMHg2ODFmLAorCTB4MDA2NCwgMHgwMDIwLCAweDY4MTcsIDB4MDA2NCwgMHg2ODFmLCAweDAwMDIsIDB4YWRlOCwgMHgwMDEwLAorCTB4MWYwNCwgMHgxMTM1LCAweDgxMDksIDB4MWQzOCwgMHgyMDAxLCAweDAxZmYsIDB4MjAwNCwgMHhkMGZjLAorCTB4MTEyOCwgMHg4MjExLCAweDAxMTgsIDB4MjA2OSwgMHg2YmMwLCAweDA4ZDgsIDB4MDgwYywgMHgyMmNmLAorCTB4MDgwYywgMHg0MDE1LCAweDA4MGMsIDB4MWI2ZCwgMHgwODBjLCAweDQ1NTMsIDB4MjA5MSwgMHgyMjAwLAorCTB4MjA3OSwgMHg0NjAwLCAweDIwNzEsIDB4MDA1MCwgMHgyMDkxLCAweDI0MDAsIDB4MjA3OSwgMHg0NjAwLAorCTB4MjA3MSwgMHgwMDIwLCAweDIwOTEsIDB4MjYwMCwgMHgyMDc5LCAweDAyMDAsIDB4MjA3MSwgMHg0NjQwLAorCTB4MjA5MSwgMHgyODAwLCAweDIwNzksIDB4MDEwMCwgMHgyMDcxLCAweDQ2ODAsIDB4MjA5MSwgMHgyMDAwLAorCTB4MjA3OSwgMHg0NjAwLCAweDIwNzEsIDB4MDAxMCwgMHgzMjAwLCAweGEwODUsIDB4MzAzZCwgMHgyMDkwLAorCTB4MjA3MSwgMHgwMDEwLCAweDcwYzMsIDB4MDAwMCwgMHgxMDA0LCAweDExOGMsIDB4NzBjMCwgMHhhMDg2LAorCTB4MDAwMiwgMHgxMTEwLCAweDA4MGMsIDB4MTNiYSwgMHgyMDM5LCAweDAwMDAsIDB4MDgwYywgMHgxMmFiLAorCTB4NzhhYywgMHhhMDA1LCAweDExODAsIDB4MGUwNCwgMHgxMTlhLCAweDc4NmMsIDB4YTA2NSwgMHgwMTEwLAorCTB4MDgwYywgMHgyMDdhLCAweDA4MGMsIDB4MWUwOSwgMHgwZTA0LCAweDExYWYsIDB4Nzg2YywgMHhhMDY1LAorCTB4MDExMCwgMHgwODBjLCAweDIwN2EsIDB4MGUwNCwgMHgxMWFmLCAweDIwMDksIDB4NDY0NywgMHgyMDExLAorCTB4NDY4NywgMHgyMTA0LCAweDIyMGMsIDB4YTEwNSwgMHgwMTEwLCAweDA4MGMsIDB4MWM3YywgMHgyMDcxLAorCTB4NDY0MCwgMHg3MGEwLCAweGEwMDUsIDB4MDFlOCwgMHg3NDRjLCAweGE0ODUsIDB4MDAwMCwgMHgwMWM4LAorCTB4MjA3OSwgMHgwMjAwLCAweDIwOTEsIDB4ODAwMCwgMHg3MmQwLCAweGEyOGMsIDB4MzAzZCwgMHgyMTkwLAorCTB4MDgwYywgMHgyNzIwLCAweDIwOTEsIDB4ODAwMCwgMHgyMDkxLCAweDMwM2QsIDB4MGUwNCwgMHgxMWQxLAorCTB4MjA3OSwgMHg0NjAwLCAweDc4NmMsIDB4YTA2NSwgMHgwMTIwLCAweDIwNzEsIDB4MDAxMCwgMHgwODBjLAorCTB4MjA3YSwgMHgxZDA0LCAweDExZDksIDB4MjA3OSwgMHg0NjAwLCAweDIwNzEsIDB4MDAxMCwgMHgwODBjLAorCTB4NDM3MCwgMHgyMDcxLCAweDQ2ODAsIDB4NzBhMCwgMHhhMDA1LCAweDAxODgsIDB4NzA0YywgMHhhMDI1LAorCTB4MDE3MCwgMHgyMDc5LCAweDAxMDAsIDB4MjA5MSwgMHg4MDAwLCAweDcyZDAsIDB4YTI4YywgMHgzMDNkLAorCTB4MjE5MCwgMHgwODBjLCAweDI3MjAsIDB4MjA5MSwgMHg4MDAwLCAweDIwOTEsIDB4MzAzZCwgMHgyMDc5LAorCTB4NDYwMCwgMHgyMDcxLCAweDAwMTAsIDB4MGUwNCwgMHgxMWZhLCAweDc4NmMsIDB4YTA2NSwgMHgwMTEwLAorCTB4MDgwYywgMHgyMDdhLCAweDFkMDQsIDB4MTE4ZSwgMHgwODBjLCAweDQzNzAsIDB4MDgwNCwgMHgxMThlLAorCTB4M2MwMCwgMHhhMDg0LCAweDAwMDcsIDB4MDAwMiwgMHgxMjBjLCAweDEyMGMsIDB4MTIwZSwgMHgxMjBlLAorCTB4MTIxMywgMHgxMjEzLCAweDEyMTgsIDB4MTIxOCwgMHgwODBjLCAweDI1NGMsIDB4MjA5MSwgMHgyNDAwLAorCTB4MDgwYywgMHg0MGFkLCAweDAwMDUsIDB4MjA5MSwgMHgyMjAwLCAweDA4MGMsIDB4NDBhZCwgMHgwMDA1LAorCTB4MjA5MSwgMHgyMjAwLCAweDA4MGMsIDB4NDBhZCwgMHgyMDkxLCAweDI0MDAsIDB4MDgwYywgMHg0MGFkLAorCTB4MDAwNSwgMHgxMjQxLCAweDEyNDEsIDB4MTI0MiwgMHgxMjQyLCAweDEyNGQsIDB4MTI0ZCwgMHgxMjRkLAorCTB4MTI0ZCwgMHgxMjU2LCAweDEyNTYsIDB4MTI2MSwgMHgxMjYxLCAweDEyNGQsIDB4MTI0ZCwgMHgxMjRkLAorCTB4MTI0ZCwgMHgxMjcwLCAweDEyNzAsIDB4MTI3MCwgMHgxMjcwLCAweDEyNzAsIDB4MTI3MCwgMHgxMjcwLAorCTB4MTI3MCwgMHgxMjcwLCAweDEyNzAsIDB4MTI3MCwgMHgxMjcwLCAweDEyNzAsIDB4MTI3MCwgMHgxMjcwLAorCTB4MTI3MCwgMHgwY2Y4LCAweDAwMDYsIDB4MDEwNiwgMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwgMHgwODBjLAorCTB4MjU2OSwgMHgwMTJlLCAweDAxMGUsIDB4MDAwZSwgMHgwMDBkLCAweDAwMDYsIDB4MDEwNiwgMHgwMTI2LAorCTB4MDgwYywgMHgxMjAwLCAweDAxMmUsIDB4MDEwZSwgMHgwMDBlLCAweDAwMGQsIDB4MDAwNiwgMHgwMTA2LAorCTB4MDEyNiwgMHgyMDkxLCAweDI2MDAsIDB4MDgwYywgMHgyNTY5LCAweDAxMmUsIDB4MDEwZSwgMHgwMDBlLAorCTB4MDAwZCwgMHgwMDA2LCAweDAxMDYsIDB4MDEyNiwgMHgyMDkxLCAweDI2MDAsIDB4MDgwYywgMHgyNTY5LAorCTB4MjA5MSwgMHgyODAwLCAweDA4MGMsIDB4MjU2OSwgMHgwMTJlLCAweDAxMGUsIDB4MDAwZSwgMHgwMDBkLAorCTB4MDAwNiwgMHgwMTA2LCAweDAxMjYsIDB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MjA3OSwgMHg0NjAwLAorCTB4MjA3MSwgMHgwMjAwLCAweDIwNjksIDB4NDY0MCwgMHgzZDAwLCAweGQwOGMsIDB4MDEzMCwgMHg3MGVjLAorCTB4YTA4NCwgMHgxYzAwLCAweDc4ZTIsIDB4MDgwYywgMHg0NTlhLCAweDNkMDAsIDB4ZDA4NCwgMHgwMTUwLAorCTB4MjA2OSwgMHg0NjgwLCAweDIwNzEsIDB4MDEwMCwgMHg3MGVjLCAweGEwODQsIDB4MWMwMCwgMHg3OGU2LAorCTB4MDgwYywgMHg0NTlhLCAweDA4MGMsIDB4MjRmZCwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMTJlLAorCTB4MDEwZSwgMHgwMDBlLCAweDAwMGQsIDB4NzAwOCwgMHg4MDBiLCAweDEyNDAsIDB4NzAwNywgMHgwMDAyLAorCTB4YTA4YywgMHgwMWUwLCAweDExMjAsIDB4ZDA5YywgMHgwMTA4LCAweDA4ODcsIDB4MDg5NywgMHg3MGMzLAorCTB4NDAwMiwgMHgwODA0LCAweDEzYmQsIDB4MGUwNCwgMHgxMzFlLCAweDIwNjEsIDB4MDAwMCwgMHg2MDE4LAorCTB4ZDA4NCwgMHgxOTA0LCAweDEzMWUsIDB4NzgyOCwgMHhhMDA1LCAweDExMjAsIDB4MDAwNCwgMHgxMzFmLAorCTB4MDgwNCwgMHgxMzFlLCAweGQwZmMsIDB4MDEzMCwgMHgwMDA2LCAweDA4MGMsIDB4MWIwYSwgMHgwMDBlLAorCTB4MDE1MCwgMHgwMDI4LCAweDAwMDYsIDB4MDgwYywgMHgxYWZmLCAweDAwMGUsIDB4MDEyMCwgMHgyMDAxLAorCTB4NDAwNywgMHgwODA0LCAweDEzYmMsIDB4NzkxMCwgMHhkMGZjLCAweDExMjgsIDB4MjA2MSwgMHg0NjQwLAorCTB4YzE5YywgMHhjN2ZjLCAweDAwMjAsIDB4MjA2MSwgMHg0NjgwLCAweGMxOWQsIDB4YzdmZCwgMHg2MDYwLAorCTB4YTAwNSwgMHgxOTA0LCAweDEzMWUsIDB4NzkxMiwgMHg2MDdlLCAweDc4MjgsIDB4YzBmYywgMHhhMDg2LAorCTB4MDAxOCwgMHgxMTIwLCAweDAwYzYsIDB4MDgwYywgMHgxOTE2LCAweDAwY2UsIDB4NzgyYiwgMHgwMDAwLAorCTB4NjA3OCwgMHhhMDY1LCAweDAxZTAsIDB4MDBjNiwgMHg2MDljLCAweDA4MGMsIDB4MWJkNCwgMHgwMGNlLAorCTB4NjA5ZiwgMHgwMDAwLCAweDA4MGMsIDB4MWE0MSwgMHgyMDA5LCAweDAwMTgsIDB4NjA4NywgMHgwMTAzLAorCTB4NzgxMCwgMHgwMDA2LCAweDg0ZmYsIDB4MTExMCwgMHg4NWZmLCAweDAxMTAsIDB4YzBjNSwgMHg3ODEyLAorCTB4MDgwYywgMHgxYjE1LCAweDAwMGUsIDB4NzgxMiwgMHgxMTk4LCAweDA4MGMsIDB4MWI2MCwgMHg3ODEwLAorCTB4ZDA5YywgMHgxMTE4LCAweDIwNjEsIDB4NDY0MCwgMHgwMDIwLCAweDIwNjEsIDB4NDY4MCwgMHhjMDljLAorCTB4NzgxMiwgMHg2MDdiLCAweDAwMDAsIDB4NjBkMCwgMHhkMGM0LCAweDAxMzAsIDB4YzBjNCwgMHg2MGQyLAorCTB4MjAwMSwgMHg0MDA1LCAweDA4MDQsIDB4MTNiYywgMHgwODA0LCAweDEzYmEsIDB4MDAwNSwgMHhhMDA2LAorCTB4NzBjMiwgMHg3MGM2LCAweDcwY2EsIDB4NzBjZSwgMHg3MGRhLCAweDcwYzAsIDB4YTAzZCwgMHhhMDhhLAorCTB4MDA0MCwgMHgxYTA0LCAweDEzNmMsIDB4MDAwMiwgMHgxM2JhLCAweDE0MDgsIDB4MTNkNiwgMHgxNDNjLAorCTB4MTQ3MCwgMHgxNDcwLCAweDEzY2UsIDB4MWE1OSwgMHgxNDdhLCAweDEzYzgsIDB4MTNkYSwgMHgxM2RiLAorCTB4MTNkYywgMHgxM2RkLCAweDFhNWQsIDB4MTNjOCwgMHgxNDg3LCAweDE0ZGIsIDB4MTkzMSwgMHgxYTUzLAorCTB4MTNkZSwgMHgxN2JhLCAweDE3ZjAsIDB4MTgyMiwgMHgxODY4LCAweDE3NzcsIDB4MTc4NCwgMHgxNzk3LAorCTB4MTdhOSwgMHgxNWIwLCAweDEzYzgsIDB4MTUwZCwgMHgxNTE4LCAweDE1MjYsIDB4MTUzNCwgMHgxNTRiLAorCTB4MTU1OSwgMHgxNTVjLCAweDE1NmEsIDB4MTU3OCwgMHgxNTgyLCAweDE1OTYsIDB4MTVhMiwgMHgxM2M4LAorCTB4MTNjOCwgMHgxM2M4LCAweDEzYzgsIDB4MTViZCwgMHgxNWNlLCAweDE1ZTgsIDB4MTYxYywgMHgxNjQ1LAorCTB4MTY1NywgMHgxNjVhLCAweDE2ODUsIDB4MTZiZSwgMHgxNmQwLCAweDE3NDUsIDB4MTc1NSwgMHgxM2M4LAorCTB4MTNjOCwgMHgxM2M4LCAweDEzYzgsIDB4MTc2NywgMHgyMTAwLCAweGEwOGEsIDB4MDA0MCwgMHgxYTA0LAorCTB4MTNjOCwgMHgwMDAyLCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxYTdmLAorCTB4MWE4NSwgMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxYTg5LCAweDFhYzksIDB4MTNjOCwgMHgxM2M4LAorCTB4MTNjOCwgMHgxM2M4LCAweDE0MDMsIDB4MTQ2YiwgMHgxNDgyLCAweDE0ZDYsIDB4MTkyYywgMHgxM2M4LAorCTB4MTNjOCwgMHgxOGZiLCAweDEzYzgsIDB4MWFjZCwgMHgxYTcxLCAweDFhN2IsIDB4MTNjOCwgMHgxM2M4LAorCTB4MTNjOCwgMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LAorCTB4MTNjOCwgMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LAorCTB4MTNjOCwgMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LAorCTB4MTNjOCwgMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LAorCTB4MTNjOCwgMHgxM2M4LCAweDcyY2EsIDB4NzFjNiwgMHgyMDAxLCAweDQwMDYsIDB4MDAyOCwgMHg3M2NlLAorCTB4NzJjYSwgMHg3MWM2LCAweDIwMDEsIDB4NDAwMCwgMHg3MGMyLCAweDBlMDQsIDB4MTNiZCwgMHgyMDYxLAorCTB4MDAwMCwgMHg2MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg1MDAwLCAweDIwOTEsIDB4NDA4MCwgMHgwMDA1LAorCTB4NzBjMywgMHg0MDAxLCAweDBjOTAsIDB4NzBjMywgMHg0MDA2LCAweDBjNzgsIDB4MjA5OSwgMHgwMDQxLAorCTB4MjBhMSwgMHgwMDQxLCAweDIwYTksIDB4MDAwNSwgMHg1M2EzLCAweDBjMjAsIDB4NzBjNCwgMHg3MGMzLAorCTB4MDAwNCwgMHgwODA3LCAweDA4ZjgsIDB4MDhmMCwgMHgwOGU4LCAweDA4ZTAsIDB4MjA5MSwgMHg4MDAwLAorCTB4NzBjMywgMHgwMDA0LCAweDcwYzcsIDB4NDk1MywgMHg3MGNiLCAweDUwMjAsIDB4NzBjZiwgMHgyMDIwLAorCTB4NzBkMywgMHgwMDBhLCAweDIwMDEsIDB4MDAwNCwgMHg3MGQ2LCAweDIwNzksIDB4MDAwMCwgMHg3ODFiLAorCTB4MDAwMSwgMHgyMDMxLCAweDAwMzAsIDB4MjA1OSwgMHgxMDAwLCAweDIwMjksIDB4MDQxYSwgMHgyMDUxLAorCTB4MDQ0NSwgMHgyMDYxLCAweDA0NDcsIDB4MjBjMSwgMHgwMDIwLCAweDIwOTEsIDB4NTAwMCwgMHgyMDkxLAorCTB4NDA4MCwgMHgwODA0LCAweDA0MTgsIDB4NzVkOCwgMHg3NGRjLCAweDc1ZGEsIDB4NzRkZSwgMHgwMDE4LAorCTB4MjAyOSwgMHgwMDAwLCAweDI1MjAsIDB4NzFkMCwgMHg3MmM4LCAweDczY2MsIDB4NzBjNCwgMHgyMGEwLAorCTB4MjA5OSwgMHgwMDMwLCAweDcwMDMsIDB4MDAwMSwgMHg3MDA3LCAweDAwMDYsIDB4NzMxYSwgMHg3MjFlLAorCTB4NzQyMiwgMHg3NTI2LCAweDIwMjEsIDB4MDA0MCwgMHg4MWZmLCAweDA5MDQsIDB4MTNiYSwgMHhhMTgyLAorCTB4MDA0MCwgMHgxMjEwLCAweDIxMjAsIDB4YTAwNiwgMHgyMDA4LCAweDg0MDMsIDB4NzAxMiwgMHg3MDA3LAorCTB4MDAwNCwgMHg3MDA3LCAweDAwMDEsIDB4NzAwOCwgMHhkMGZjLCAweDBkZTgsIDB4NzAwNywgMHgwMDAyLAorCTB4YTA4NCwgMHgwMWUwLCAweDAxMjAsIDB4NzBjMywgMHg0MDAyLCAweDA4MDQsIDB4MTNiZCwgMHgyNGE4LAorCTB4NTNhNSwgMHgwYzEwLCAweDA4MDQsIDB4MTNiYSwgMHgyMDI5LCAweDAwMDAsIDB4MjUyMCwgMHg3MWQwLAorCTB4NzJjOCwgMHg3M2NjLCAweDcwYzQsIDB4MjA5OCwgMHgyMGExLCAweDAwMzAsIDB4NzAwMywgMHgwMDAwLAorCTB4NzAwNywgMHgwMDA2LCAweDczMWEsIDB4NzIxZSwgMHg3NDIyLCAweDc1MjYsIDB4MjAyMSwgMHgwMDQwLAorCTB4NzAwNywgMHgwMDA2LCAweDgxZmYsIDB4MDkwNCwgMHgxM2JhLCAweGExODIsIDB4MDA0MCwgMHgxMjEwLAorCTB4MjEyMCwgMHhhMDA2LCAweDIwMDgsIDB4ODQwMywgMHg3MDEyLCAweDI0YTgsIDB4NTNhNiwgMHg3MDA3LAorCTB4MDAwMSwgMHg3MDA4LCAweGQwZmMsIDB4MGRlOCwgMHhhMDg0LCAweDAxZTAsIDB4MGQ0OCwgMHg3MGMzLAorCTB4NDAwMiwgMHgwODA0LCAweDEzYmQsIDB4NzVkOCwgMHg3NGRjLCAweDc1ZGEsIDB4NzRkZSwgMHgwODc4LAorCTB4NzFjNCwgMHg3MGM4LCAweDIxMTQsIDB4YTc5ZSwgMHgwMDA0LCAweDExMDgsIDB4MjAwYSwgMHg3MmNhLAorCTB4MDgwNCwgMHgxM2I5LCAweDcwYzcsIDB4MDAwYSwgMHg3MGNiLCAweDAwMDQsIDB4NzBjZiwgMHgwMDIwLAorCTB4MDgwNCwgMHgxM2JhLCAweDc1ZDgsIDB4NzZkYywgMHg3NWRhLCAweDc2ZGUsIDB4MDAxOCwgMHgyMDI5LAorCTB4MDAwMCwgMHgyNTMwLCAweDcwYzQsIDB4NzJjOCwgMHg3M2NjLCAweDc0ZDAsIDB4NzBjNiwgMHg3MmNhLAorCTB4NzNjZSwgMHg3NGQyLCAweGEwMDUsIDB4MDVlOCwgMHhhNDBhLCAweDAxMDgsIDB4MTI0MCwgMHg4MDAxLAorCTB4Nzg3MiwgMHhhMDg0LCAweGZjMDAsIDB4MDEzOCwgMHg3OGFjLCAweGMwODUsIDB4NzhhZSwgMHgyMDAxLAorCTB4NDAwNSwgMHgwODA0LCAweDEzYmMsIDB4N2I3ZSwgMHg3YTdhLCAweDdlODYsIDB4N2Q4MiwgMHg3Yzc2LAorCTB4YTQ4YywgMHhmZjAwLCAweDAxNzAsIDB4ODQwNywgMHg4MDA0LCAweDgwMDQsIDB4ODEwYywgMHg4MTBjLAorCTB4ODEwZiwgMHhhMTE4LCAweGEyOTEsIDB4MDAwMCwgMHhhNmIxLCAweDAwMDAsIDB4YTU4MSwgMHgwMDAwLAorCTB4MDA1MCwgMHg4NDA3LCAweDgwMDQsIDB4ODAwNCwgMHhhMzE4LCAweGEyOTEsIDB4MDAwMCwgMHhhNmIxLAorCTB4MDAwMCwgMHhhNTgxLCAweDAwMDAsIDB4NzMxYSwgMHg3MjFlLCAweDc2MjIsIDB4NzAyNiwgMHhhNjA1LAorCTB4MDExOCwgMHg3YTEwLCAweGMyYzUsIDB4N2ExMiwgMHg3OGFjLCAweGEwODQsIDB4ZmZmYywgMHg3OGFlLAorCTB4MDAxOCwgMHg3OGFjLCAweGMwODUsIDB4NzhhZSwgMHgwODA0LCAweDEzYmEsIDB4NzVkOCwgMHg3NmRjLAorCTB4NzVkYSwgMHg3NmRlLCAweDAwMTgsIDB4MjAyOSwgMHgwMDAwLCAweDI1MzAsIDB4NzBjNCwgMHg3MmM4LAorCTB4NzNjYywgMHg3NGQ0LCAweDcwYzYsIDB4NzJjYSwgMHg3M2NlLCAweDc0ZDYsIDB4YTAwNSwgMHgwNTAwLAorCTB4YTQwYSwgMHgwMTEwLCAweDFhMDQsIDB4MTNiYywgMHg4MDAxLCAweDc4OTIsIDB4YTA4NCwgMHhmYzAwLAorCTB4MDEzOCwgMHg3OGFjLCAweGMwYzUsIDB4NzhhZSwgMHgyMDAxLCAweDQwMDUsIDB4MDgwNCwgMHgxM2JjLAorCTB4N2E5YSwgMHg3YjllLCAweDdkYTIsIDB4N2VhNiwgMHgyNjAwLCAweGE1MDUsIDB4MDExOCwgMHg3YTEwLAorCTB4YzJjNSwgMHg3YTEyLCAweDdjOTYsIDB4NzhhYywgMHhhMDg0LCAweGZjZmYsIDB4NzhhZSwgMHgwMDE4LAorCTB4NzhhYywgMHhjMGM1LCAweDc4YWUsIDB4MDgwNCwgMHgxM2JhLCAweDIwMDksIDB4MDAwMCwgMHg3ODZjLAorCTB4YTA2NSwgMHgwMTE4LCAweDgxMDgsIDB4NjAwMCwgMHgwY2Q4LCAweDdhYzQsIDB4MDgwNCwgMHgxM2I4LAorCTB4MjAwOSwgMHg0NjQ4LCAweDIxMGMsIDB4MjAwMSwgMHgwMWZmLCAweDIwMDQsIDB4ZDBmYywgMHgxOTA0LAorCTB4MTNiOSwgMHgyMDExLCAweDQ2ODgsIDB4MjIxNCwgMHgwODA0LCAweDEzYjgsIDB4MjAwOSwgMHg0NjQ5LAorCTB4MjEwYywgMHgyMDAxLCAweDAxZmYsIDB4MjAwNCwgMHhkMGZjLCAweDE5MDQsIDB4MTNiOSwgMHgyMDExLAorCTB4NDY4OSwgMHgyMjE0LCAweDA4MDQsIDB4MTNiOCwgMHgyMDYxLCAweDQ2NDAsIDB4NjEyOCwgMHg2MjJjLAorCTB4ODIxNCwgMHg4MjE0LCAweDgyMTQsIDB4MjAwMSwgMHgwMWZmLCAweDIwMDQsIDB4ZDBmYywgMHgxMTQ4LAorCTB4MjA2MSwgMHg0NjgwLCAweDYzMjgsIDB4NzNkYSwgMHg2MzJjLCAweDgzMWMsIDB4ODMxYywgMHg4MzFjLAorCTB4NzNkZSwgMHgwODA0LCAweDEzYjgsIDB4MjAwOSwgMHg0NjRjLCAweDIxMGMsIDB4MjAwMSwgMHgwMWZmLAorCTB4MjAwNCwgMHhkMGZjLCAweDE5MDQsIDB4MTNiOSwgMHgyMDExLCAweDQ2OGMsIDB4MjIxNCwgMHgwODA0LAorCTB4MTNiOCwgMHg3OTE4LCAweDA4MDQsIDB4MTNiOSwgMHgyMDA5LCAweDAyMDIsIDB4MjEwYywgMHgyMDAxLAorCTB4MDFmZiwgMHgyMDA0LCAweGQwZmMsIDB4MTkwNCwgMHgxM2I5LCAweDIwMTEsIDB4MDEwMiwgMHgyMjE0LAorCTB4MDgwNCwgMHgxM2I4LCAweDIwMDksIDB4NDY0ZCwgMHgyMTBjLCAweDIwMDEsIDB4MDFmZiwgMHgyMDA0LAorCTB4ZDBmYywgMHgxOTA0LCAweDEzYjksIDB4MjAxMSwgMHg0NjhkLCAweDIyMTQsIDB4MDgwNCwgMHgxM2I4LAorCTB4NzkyMCwgMHgyMDAxLCAweDAxZmYsIDB4MjAwNCwgMHhkMGZjLCAweDE5MDQsIDB4MTNiOSwgMHg3YTI0LAorCTB4MDgwNCwgMHgxM2I4LCAweDIwMTEsIDB4NGI0MCwgMHg3MWM0LCAweGQxZmMsIDB4MTExMCwgMHgyMDExLAorCTB4NGFjMCwgMHg4MTA3LCAweGEwODQsIDB4MDAwZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMjY4LAorCTB4NmEwMCwgMHg2YjA4LCAweDZjMWMsIDB4NzRkYSwgMHgwODA0LCAweDEzYjcsIDB4NzdjNCwgMHgwODBjLAorCTB4MWI3YiwgMHgyMDkxLCAweDgwMDAsIDB4NmIxYywgMHg2YTE0LCAweDIwOTEsIDB4ODAwMSwgMHgyNzA4LAorCTB4MDgwNCwgMHgxM2I3LCAweDIwNjEsIDB4NDY0MCwgMHg2MTE4LCAweDIwMDEsIDB4MDFmZiwgMHgyMDA0LAorCTB4ZDBmYywgMHgxOTA0LCAweDEzYjksIDB4MjA2MSwgMHg0NjgwLCAweDYyMTgsIDB4MDgwNCwgMHgxM2I4LAorCTB4NzdjNCwgMHgwODBjLCAweDFiN2IsIDB4MjA5MSwgMHg4MDAwLCAweDY5MDgsIDB4NmExOCwgMHg2YjEwLAorCTB4NzdkYSwgMHgyMDkxLCAweDgwMDEsIDB4MDgwNCwgMHgxM2I3LCAweDcxYzQsIDB4MjExMCwgMHhhMjk0LAorCTB4MDAwZiwgMHhhMjgyLCAweDAwMTAsIDB4MWEwNCwgMHgxM2IzLCAweDA4MGMsIDB4MjM4YiwgMHhhMzg0LAorCTB4NDAwMCwgMHgwMTEwLCAweGEyOTUsIDB4MDAyMCwgMHgwODA0LCAweDEzYjcsIDB4NzFjNCwgMHgyMTAwLAorCTB4YzBiYywgMHhhMDgyLCAweDAwMTAsIDB4MWEwNCwgMHgxM2IzLCAweGQxYmMsIDB4MTEyMCwgMHgyMDExLAorCTB4NDY0OCwgMHgyMjA0LCAweDAwMjAsIDB4MjAxMSwgMHg0Njg4LCAweDIyMDQsIDB4YzBiZCwgMHgwMDA2LAorCTB4MjEwMCwgMHhjMGJjLCAweDIwMTIsIDB4MDgwYywgMHgyMzMxLCAweDAwMWUsIDB4MDgwNCwgMHgxM2I5LAorCTB4NzFjNCwgMHgyMDIxLCAweDQ2NDksIDB4MjQwNCwgMHg3MGM2LCAweDIwMTksIDB4MDAwMCwgMHgwMDMwLAorCTB4NzFjOCwgMHgyMDIxLCAweDQ2ODksIDB4MjQwNCwgMHg3MGNhLCAweGMzZmQsIDB4MjAxMSwgMHgxNjE0LAorCTB4MjBhOSwgMHgwMDA4LCAweDIyMDQsIDB4YTEwNiwgMHgwMTM4LCAweDgyMTAsIDB4MWYwNCwgMHgxNWZhLAorCTB4NzFjNCwgMHg3MmM4LCAweDA4MDQsIDB4MTNiMiwgMHhhMjkyLCAweDE2MTQsIDB4MDAyNiwgMHgyMTIyLAorCTB4MDAxZSwgMHgwODBjLCAweDIzNDMsIDB4MjAwMSwgMHgwMWZmLCAweDIwMDQsIDB4ZDBmYywgMHgxMTEwLAorCTB4ZDNmYywgMHgwOWYwLCAweDA4MDQsIDB4MTNiYSwgMHgwM2U4LCAweDAwZmEsIDB4MDFmNCwgMHgwMmVlLAorCTB4MDAwNCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywgMHgyMDYxLCAweDQ2NDAsIDB4NjEyOCwgMHg2MjJjLAorCTB4ODIxNCwgMHg4MjE0LCAweDgyMTQsIDB4NzBjNCwgMHg2MDJhLCAweDcwYzgsIDB4ODAwMywgMHg4MDAzLAorCTB4ODAwMywgMHg2MDJlLCAweDIwMDEsIDB4MDFmZiwgMHgyMDA0LCAweGQwZmMsIDB4MTFhMCwgMHgwMDI2LAorCTB4MDAxNiwgMHgyMDYxLCAweDQ2ODAsIDB4NjEyOCwgMHg2MjJjLCAweDgyMTQsIDB4ODIxNCwgMHg4MjE0LAorCTB4NzBkOCwgMHg2MDJhLCAweDcwZGMsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4NjAyZSwgMHg3MWRhLAorCTB4NzJkZSwgMHgwMDFlLCAweDAwMmUsIDB4MDgwNCwgMHgxM2I4LCAweDIwNjEsIDB4NDY0MCwgMHg2MTMwLAorCTB4NzBjNCwgMHg2MDMyLCAweDIwMDEsIDB4MDFmZiwgMHgyMDA0LCAweGQwZmMsIDB4MTkwNCwgMHgxM2I5LAorCTB4MjA2MSwgMHg0NjgwLCAweDYyMzAsIDB4NzBjOCwgMHg2MDMyLCAweDA4MDQsIDB4MTNiOCwgMHg3OTE4LAorCTB4MDgwNCwgMHgxM2I5LCAweDcxYzQsIDB4YTE4NCwgMHhmMGNmLCAweDAxNDgsIDB4MjAwMSwgMHgwMWZmLAorCTB4MjAwNCwgMHhkMGZjLCAweDE5MDQsIDB4MTNiMywgMHg3MmM4LCAweDA4MDQsIDB4MTNiMiwgMHgwMDA2LAorCTB4MjAxOSwgMHgwMDAwLCAweDA4MGMsIDB4MjM3ZiwgMHgyMDAxLCAweDAxZmYsIDB4MjAwNCwgMHhkMGZjLAorCTB4MDExOCwgMHgwMDFlLCAweDA4MDQsIDB4MTNiOSwgMHg3MWM4LCAweGExODQsIDB4ZjBjZiwgMHgwMTI4LAorCTB4MDAwNiwgMHgyMTEwLCAweDcxYzQsIDB4MDgwNCwgMHgxM2IyLCAweDAwMDYsIDB4YzNmZCwgMHgwODBjLAorCTB4MjM3ZiwgMHgwMDJlLCAweDAwMWUsIDB4MDgwNCwgMHgxM2I4LCAweDcxYzQsIDB4YTE4MiwgMHgwMDEwLAorCTB4MDI0OCwgMHgyMDAxLCAweDAxZmYsIDB4MjAwNCwgMHhkMGZjLCAweDE5MDQsIDB4MTNiMywgMHg3MmM4LAorCTB4MDgwNCwgMHgxM2IyLCAweDIwMTEsIDB4NDY0ZCwgMHgyMjA0LCAweDAwMDYsIDB4ODEwNCwgMHgxMjA4LAorCTB4ODEwOCwgMHgyMTEyLCAweDIwMTksIDB4MDAwMCwgMHgwODBjLCAweDIzNmMsIDB4MjAwMSwgMHgwMWZmLAorCTB4MjAwNCwgMHhkMGZjLCAweDAxMTgsIDB4MDAxZSwgMHgwODA0LCAweDEzYjksIDB4NzFjOCwgMHhhMTgyLAorCTB4MDAxMCwgMHgwMjI4LCAweDAwMDYsIDB4MjExMCwgMHg3MWM0LCAweDA4MDQsIDB4MTNiMiwgMHgyMDExLAorCTB4NDY4ZCwgMHgyMjA0LCAweDAwMDYsIDB4ODEwNCwgMHgxMjA4LCAweDgxMDgsIDB4MjExMiwgMHhjM2ZkLAorCTB4MDgwYywgMHgyMzZjLCAweDAwMmUsIDB4MDAxZSwgMHgwODA0LCAweDEzYjgsIDB4NzFjNCwgMHg3MmM4LAorCTB4YTE4NCwgMHhmZmZkLCAweDE5MDQsIDB4MTNiMiwgMHhhMjg0LCAweGZmZmQsIDB4MTkwNCwgMHgxM2IyLAorCTB4MjEwMCwgMHg3OTIwLCAweDc4MjIsIDB4MjIwMCwgMHg3YTI0LCAweDc4MjYsIDB4MDgwNCwgMHgxM2I4LAorCTB4MjAxMSwgMHg0YjQwLCAweDcxYzQsIDB4ZDFmYywgMHgxMTEwLCAweDIwMTEsIDB4NGFjMCwgMHg4MTA3LAorCTB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGEyNjgsIDB4NzJjOCwgMHg3M2NjLAorCTB4NzRkOCwgMHg3MWM2LCAweDY4MDAsIDB4NzBjYSwgMHg3M2NlLCAweDc0ZGEsIDB4MjA5MSwgMHg4MDAwLAorCTB4NmEwMiwgMHhkMmFjLCAweDExMTgsIDB4MjAyMSwgMHgwMDAwLCAweDAwOTAsIDB4YTQ4NCwgMHgwMGZmLAorCTB4YTA4MiwgMHgwMDAyLCAweDFhMDQsIDB4MTc0MSwgMHg4NDNmLCAweGE3YmMsIDB4MDBmZiwgMHgwMTQwLAorCTB4YTc4NiwgMHgwMDAyLCAweDE5MDQsIDB4MTc0MSwgMHhhNDg0LCAweDAwZmYsIDB4MDkwNCwgMHgxNzQxLAorCTB4MjA2MSwgMHgwMjAwLCAweGQxZmMsIDB4MDExMCwgMHgyMDYxLCAweDAxMDAsIDB4MjAyOSwgMHgwMDA5LAorCTB4MjAzMSwgMHgwMDYyLCAweDg0M2YsIDB4YTdiYywgMHgwMGZmLCAweDAxMzAsIDB4ODMwNywgMHhhMDg0LAorCTB4MDBmZiwgMHgxMTEwLCAweGE3M2QsIDB4MTEzOCwgMHgyMDQxLCAweDAwMTksIDB4YTM4NCwgMHgwMGZmLAorCTB4YTA4MiwgMHgwMDFhLCAweDAyMTAsIDB4YTRhNCwgMHgwMGZmLCAweDgzMDcsIDB4YTA4NCwgMHgwMGZmLAorCTB4MDE4OCwgMHhhODQyLCAweDAyZjAsIDB4YTA4NiwgMHgwMDEwLCAweDExMjAsIDB4YTM5YywgMHgwMGZmLAorCTB4YTM5ZCwgMHgwZjAwLCAweGEzYmMsIDB4MDBmZiwgMHgyNTAwLCAweGE3MDIsIDB4MDI5MCwgMHgyNjAwLAorCTB4YTcwMiwgMHgxMjc4LCAweDIwMzksIDB4MDAzYSwgMHg2ODA0LCAweGE3MDUsIDB4NjgwNiwgMHg2YjBhLAorCTB4NmIwYywgMHg3M2NlLCAweDY4MWMsIDB4NzBkYSwgMHg2YzFlLCAweDIwOTEsIDB4ODAwMSwgMHgwODA0LAorCTB4MTNiYSwgMHgyMDkxLCAweDgwMDEsIDB4MDgwNCwgMHgxM2I0LCAweDc3YzQsIDB4MDgwYywgMHgxYjdiLAorCTB4MjA5MSwgMHg4MDAwLCAweDZhMTQsIDB4NmIxYywgMHgyMDkxLCAweDgwMDEsIDB4NzBjOCwgMHg2ODE2LAorCTB4NzBjYywgMHg2ODFlLCAweDI3MDgsIDB4MDgwNCwgMHgxM2I3LCAweDcwYzQsIDB4MjA2MSwgMHg0NjQwLAorCTB4NjExOCwgMHg2MDFhLCAweDIwMDEsIDB4MDFmZiwgMHgyMDA0LCAweGQwZmMsIDB4MTkwNCwgMHgxM2I5LAorCTB4NzBjOCwgMHgyMDYxLCAweDQ2ODAsIDB4NjIxOCwgMHg2MDFhLCAweDA4MDQsIDB4MTNiOCwgMHg3MWM0LAorCTB4NzJjOCwgMHg3M2NjLCAweGExODIsIDB4MDAxMCwgMHgxYTA0LCAweDEzYjMsIDB4MDgwYywgMHgyM2FmLAorCTB4YTM4NCwgMHg0MDAwLCAweDAxMTAsIDB4YTI5NSwgMHgwMDIwLCAweDA4MDQsIDB4MTNiNywgMHg3N2M0LAorCTB4MDgwYywgMHgxYjdiLCAweDIwOTEsIDB4ODAwMCwgMHg2YTA4LCAweGMyOGQsIDB4NmEwYSwgMHgyMDkxLAorCTB4ODAwMSwgMHgyNzA4LCAweDA4MDQsIDB4MTNiOCwgMHg3N2M0LCAweDA4MGMsIDB4MWI3YiwgMHgyMDkxLAorCTB4ODAwMCwgMHg2YTA4LCAweGEyOTQsIDB4ZmZmOSwgMHg2YTBhLCAweDY4MDQsIDB4YTAwNSwgMHgwMTEwLAorCTB4MDgwYywgMHgyMmFlLCAweDIwOTEsIDB4ODAwMSwgMHgyNzA4LCAweDA4MDQsIDB4MTNiOCwgMHg3N2M0LAorCTB4MDgwYywgMHgxYjdiLCAweDIwOTEsIDB4ODAwMCwgMHg2YTA4LCAweGMyOTUsIDB4NmEwYSwgMHg2ODA0LAorCTB4YTAwNSwgMHgwMTEwLCAweDA4MGMsIDB4MjJhZSwgMHgyMDkxLCAweDgwMDEsIDB4MjcwOCwgMHgwODA0LAorCTB4MTNiOCwgMHg3N2M0LCAweDIwNDEsIDB4MDAwMSwgMHgyMDQ5LCAweDAwMDUsIDB4MjA1MSwgMHgwMDIwLAorCTB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4MWI5MywgMHgyMDkxLCAweDgwMDEsIDB4MjcwOCwgMHg2YTA4LAorCTB4MDgwNCwgMHgxM2I4LCAweDc3YzQsIDB4ZDdmYywgMHgwMTI4LCAweDA4MGMsIDB4MWIwYSwgMHgwMTM4LAorCTB4MDgwNCwgMHgxM2JjLCAweDA4MGMsIDB4MWFmZiwgMHgwMTEwLCAweDA4MDQsIDB4MTNiYywgMHg3M2M4LAorCTB4NzJjYywgMHg3N2M2LCAweDczY2EsIDB4NzJjZSwgMHgwODBjLCAweDFjMGIsIDB4MTFlOCwgMHg2ODE4LAorCTB4YTAwNSwgMHgwMWEwLCAweDI3MDgsIDB4MDA3NiwgMHgwODBjLCAweDIzY2UsIDB4MDA3ZSwgMHgxMTcwLAorCTB4MjAwMSwgMHgwMDE1LCAweGQ3ZmMsIDB4MTExOCwgMHgyMDYxLCAweDQ2NDAsIDB4MDAxOCwgMHhjMGZkLAorCTB4MjA2MSwgMHg0NjgwLCAweDc4MmEsIDB4MjA5MSwgMHg4MDAxLCAweDAwMDUsIDB4MjA5MSwgMHg4MDAxLAorCTB4MjAwMSwgMHg0MDA1LCAweDA4MDQsIDB4MTNiYywgMHgyMDkxLCAweDgwMDEsIDB4MDgwNCwgMHgxM2JhLAorCTB4NzdjNCwgMHhkN2ZjLCAweDAxMjgsIDB4MDgwYywgMHgxYjBhLCAweDAxMzgsIDB4MDgwNCwgMHgxM2JjLAorCTB4MDgwYywgMHgxYWZmLCAweDAxMTAsIDB4MDgwNCwgMHgxM2JjLCAweDc3YzYsIDB4MjA0MSwgMHgwMDIxLAorCTB4MjA0OSwgMHgwMDA1LCAweDIwNTEsIDB4MDAyMCwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHgxYjkzLAorCTB4MjAwOSwgMHgwMDE2LCAweGQ3ZmMsIDB4MTExOCwgMHgyMDYxLCAweDQ2NDAsIDB4MDAxOCwgMHgyMDYxLAorCTB4NDY4MCwgMHhjMWZkLCAweDYwNjMsIDB4MDAwMywgMHg2MDdiLCAweDAwMDAsIDB4Njc3MiwgMHg2MDdmLAorCTB4MDAwZiwgMHg3OTJhLCAweDYxZDAsIDB4YzFjNCwgMHg2MWQyLCAweDA4MGMsIDB4MjJhZSwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDA1LCAweDc3YzgsIDB4NzdjYSwgMHg3N2M0LCAweDc3YzYsIDB4ZDdmYywgMHgwMTI4LAorCTB4MDgwYywgMHgxYjBhLCAweDAxMzgsIDB4MDgwNCwgMHgxM2JjLCAweDA4MGMsIDB4MWFmZiwgMHgwMTEwLAorCTB4MDgwNCwgMHgxM2JjLCAweGE3YmMsIDB4ZmYwMCwgMHgyMDkxLCAweDgwMDAsIDB4MjAwOSwgMHgwMDE3LAorCTB4ZDdmYywgMHgxMTE4LCAweDIwNjEsIDB4NDY0MCwgMHgwMDE4LCAweDIwNjEsIDB4NDY4MCwgMHhjMWZkLAorCTB4NjA3YiwgMHgwMDAwLCAweDYwNjMsIDB4MDAwMiwgMHg2NzcyLCAweDYwN2YsIDB4MDAwZiwgMHg3OTJhLAorCTB4NjFkMCwgMHhjMWM0LCAweDYxZDIsIDB4MDgwYywgMHgyMmFlLCAweDIwOTEsIDB4ODAwMSwgMHgyMDQxLAorCTB4MDAyMSwgMHgyMDQ5LCAweDAwMDUsIDB4MjA1MSwgMHgwMDMwLCAweDIwOTEsIDB4ODAwMCwgMHg3MGM4LAorCTB4YTAwNSwgMHgwMTE4LCAweDYwZDAsIDB4YzBmZCwgMHg2MGQyLCAweDA4MGMsIDB4MWI5MywgMHg3MGM4LAorCTB4NjgzNiwgMHg4NzM4LCAweGE3ODQsIDB4MDAxZiwgMHgxZGMwLCAweDIwOTEsIDB4ODAwMSwgMHgwMDA1LAorCTB4MjAxOSwgMHgwMDAwLCAweDcyYzgsIDB4ZDI4NCwgMHgwMTI4LCAweDA4MGMsIDB4MWIwYSwgMHgwMTM4LAorCTB4MDgwNCwgMHgxM2JjLCAweDA4MGMsIDB4MWFmZiwgMHgwMTEwLCAweDA4MDQsIDB4MTNiYywgMHg3MmM4LAorCTB4NzJjYSwgMHg3OGFjLCAweGEwODQsIDB4MDAwMywgMHgxNTA4LCAweDIwMzksIDB4MDAwMCwgMHhkMjg0LAorCTB4MDEwOCwgMHhjN2ZkLCAweDIwNDEsIDB4MDAyMSwgMHgyMDQ5LCAweDAwMDQsIDB4MjA1MSwgMHgwMDA4LAorCTB4MDgwYywgMHgxYjdiLCAweDIwOTEsIDB4ODAwMCwgMHg2ODA4LCAweGMwZDQsIDB4YTgwZCwgMHg2OTBhLAorCTB4MjA5MSwgMHg4MDAxLCAweDg3MzgsIDB4YTc4NCwgMHgwMDFmLCAweDFkOTAsIDB4YTdiYywgMHhmZjAwLAorCTB4ODczZiwgMHg4NzM4LCAweDg3M2YsIDB4YTc4NCwgMHgwZjAwLCAweDFkNTAsIDB4MjA5MSwgMHg4MDAwLAorCTB4NzJjOCwgMHgyMDY5LCAweDAxMDAsIDB4ZDI4NCwgMHgxMTEwLCAweDIwNjksIDB4MDIwMCwgMHg2ODA4LAorCTB4YTA4NCwgMHhmZmZkLCAweDY4MGEsIDB4NjgzMCwgMHhkMGI0LCAweDAxYjAsIDB4Njg0YiwgMHgwMDA0LAorCTB4MjBhOSwgMHgwMDE0LCAweDY4NDgsIDB4ZDA5NCwgMHgwMTEwLCAweDFmMDQsIDB4MThiMiwgMHg2ODRiLAorCTB4MDAwOSwgMHgyMGE5LCAweDAwMTQsIDB4Njg0OCwgMHhkMDg0LCAweDAxMTAsIDB4MWYwNCwgMHgxOGJiLAorCTB4MjBhOSwgMHgwMGZhLCAweDFmMDQsIDB4MThjMiwgMHgyMDc5LCAweDQ2MDAsIDB4MjAwOSwgMHgwMDE4LAorCTB4NzJjOCwgMHhkMjg0LCAweDExMTgsIDB4MjA2MSwgMHg0NjQwLCAweDAwMTgsIDB4MjA2MSwgMHg0NjgwLAorCTB4YzFmZCwgMHg2MDdiLCAweDAwMDAsIDB4NzkyYSwgMHg2MDYzLCAweDAwMDEsIDB4NjA3ZiwgMHgwMDBmLAorCTB4NjBhMywgMHgwMDAwLCAweDYwYTQsIDB4NjBhZSwgMHg2MGIyLCAweDYwZDAsIDB4ZDBiNCwgMHgwMTYwLAorCTB4YzBiNCwgMHg2MGQyLCAweDAwYzYsIDB4NjBiNCwgMHhhMDY1LCAweDYwMDgsIDB4YzBkNCwgMHg2MDBhLAorCTB4NjAxOCwgMHg4MDAxLCAweDYwMWEsIDB4MDBjZSwgMHg2MGQwLCAweGEwODQsIDB4N2VmZiwgMHg2MGQyLAorCTB4NzhhYywgMHhjMDhkLCAweDc4YWUsIDB4ODNmZiwgMHgwMTA4LCAweDAwMDUsIDB4NjgxYiwgMHgwMDU0LAorCTB4MjA5MSwgMHg4MDAxLCAweDAwMDUsIDB4NzNjYywgMHgwODBjLCAweDE4NmEsIDB4NjllYywgMHg2YTQ4LAorCTB4YTE4NSwgMHgxODAwLCAweDY4NGEsIDB4YTE4NSwgMHgwMDQwLCAweDY4ZWUsIDB4NzNjYywgMHgyMDIxLAorCTB4MDAwNCwgMHgyMGE5LCAweDA5ZmYsIDB4MWYwNCwgMHgxOTBiLCAweDg0MjEsIDB4MWRkMCwgMHg4MzE5LAorCTB4MWRiMCwgMHg2OWVlLCAweDZhNGEsIDB4MjA5MSwgMHg4MDAxLCAweDAwMDUsIDB4ZDdmYywgMHgxMTE4LAorCTB4MjA2OSwgMHg0NjQwLCAweDAwMTAsIDB4MjA2OSwgMHg0NjgwLCAweDcxYzQsIDB4NzFjNiwgMHg2OTE2LAorCTB4ODFmZiwgMHgxMTEwLCAweDY4YTMsIDB4MDAwMSwgMHg3OGFjLCAweGMwOGMsIDB4NzhhZSwgMHhkMDg0LAorCTB4MTExMCwgMHgwODBjLCAweDFjNWIsIDB4MDAwNSwgMHg3NWQ4LCAweDc0ZGMsIDB4NzVkYSwgMHg3NGRlLAorCTB4MDAxMCwgMHhhMDJlLCAweDI1MjAsIDB4NzFjNCwgMHg3M2M4LCAweDcyY2MsIDB4NzFjNiwgMHg3M2NhLAorCTB4NzJjZSwgMHgyMDc5LCAweDQ2MDAsIDB4N2RkZSwgMHg3Y2RhLCAweDdiZDYsIDB4N2FkMiwgMHgwODBjLAorCTB4MWI1OCwgMHgwOTA0LCAweDFhM2QsIDB4MjBhOSwgMHgwMDA1LCAweDIwYTEsIDB4NDYxNCwgMHgyMDkxLAorCTB4ODAwMCwgMHg0MWExLCAweDIwOTEsIDB4ODAwMSwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywgMHgxZDI0LAorCTB4MDEyMCwgMHgwODBjLCAweDFiNjAsIDB4MDgwNCwgMHgxYTNkLCAweDYwMDQsIDB4YTA4YywgMHgwMGZmLAorCTB4YTE4ZSwgMHgwMDA5LCAweDExMjAsIDB4MDAwNiwgMHgwODBjLCAweDIwNWYsIDB4MDAwZSwgMHhhMDg0LAorCTB4ZmYwMCwgMHg4MDA3LCAweDgwMDksIDB4MDkwNCwgMHgxOWUxLCAweDAwYzYsIDB4MmM2OCwgMHgwODBjLAorCTB4MWI1OCwgMHgwNWE4LCAweDJjMDAsIDB4Njg5ZSwgMHg4MTA5LCAweDFkYzAsIDB4NjA5ZiwgMHgwMDAwLAorCTB4MDBjZSwgMHgwMGM2LCAweDdkZGMsIDB4N2NkOCwgMHg3YmQ0LCAweDdhZDAsIDB4YTI5MCwgMHgwMDQwLAorCTB4YTM5OSwgMHgwMDAwLCAweGE0YTEsIDB4MDAwMCwgMHhhNWE5LCAweDAwMDAsIDB4N2RkZSwgMHg3Y2RhLAorCTB4N2JkNiwgMHg3YWQyLCAweDJjNjgsIDB4Njg5YywgMHhhMDY1LCAweDA5MDQsIDB4MTllMCwgMHgyMDA5LAorCTB4MDA0MCwgMHgwODBjLCAweDFkMjQsIDB4MTVhMCwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LAorCTB4MDAwMiwgMHgxMTY4LCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwYSwgMHgxMTIwLAorCTB4MDAxNiwgMHgwODBjLCAweDIwNWMsIDB4MDAxZSwgMHgyZDAwLCAweDYwMDIsIDB4MDg5OCwgMHgwMGNlLAorCTB4MDBjNiwgMHg2MDljLCAweDA4MGMsIDB4MWJkNCwgMHgwMGNlLCAweDYwOWYsIDB4MDAwMCwgMHgwODBjLAorCTB4MWE0MSwgMHgyMDA5LCAweDAwMTgsIDB4NjAwOCwgMHhjMGNkLCAweDYwMGEsIDB4NjAwNCwgMHg2MDg2LAorCTB4NzgxMCwgMHgwMDA2LCAweDg0ZmYsIDB4MTExMCwgMHg4NWZmLCAweDAxMTAsIDB4YzBjNSwgMHg3ODEyLAorCTB4MDgwYywgMHgxYjE1LCAweDAwMGUsIDB4NzgxMiwgMHgwODBjLCAweDFiNjAsIDB4MDgwNCwgMHgxYTNkLAorCTB4MDBjZSwgMHgwMGM2LCAweDYwOWMsIDB4MDgwYywgMHgxYmQ0LCAweDAwY2UsIDB4NjA5ZiwgMHgwMDAwLAorCTB4MDgwYywgMHgxYTQxLCAweDIwMDksIDB4MDAxOCwgMHg2MDg3LCAweDAxMDMsIDB4NjAxYiwgMHgwMDAzLAorCTB4NzgxMCwgMHgwMDA2LCAweDg0ZmYsIDB4MTExMCwgMHg4NWZmLCAweDAxMTAsIDB4YzBjNSwgMHg3ODEyLAorCTB4MDgwYywgMHgxYjE1LCAweDAwMGUsIDB4NzgxMiwgMHgwODBjLCAweDFiNjAsIDB4MDgwNCwgMHgxYTNkLAorCTB4MDBjZSwgMHg2MTE0LCAweGQxZmMsIDB4MDEyMCwgMHgwODBjLCAweDFiMGEsIDB4MDFmMCwgMHgwMDE4LAorCTB4MDgwYywgMHgxYWZmLCAweDAxZDAsIDB4MDgwYywgMHgxYTQxLCAweDIwMDksIDB4MDAxOCwgMHg2MDg3LAorCTB4MDEwMywgMHg2MDFiLCAweDAwMjEsIDB4NzgxMCwgMHgwMDA2LCAweDg0ZmYsIDB4MTExMCwgMHg4NWZmLAorCTB4MDExMCwgMHhjMGM1LCAweDc4MTIsIDB4MDgwYywgMHgxYjE1LCAweDAwMGUsIDB4NzgxMiwgMHgwODBjLAorCTB4MWI2MCwgMHgyMDAxLCAweDQwMDcsIDB4MDgwNCwgMHgxM2JjLCAweDc0YzQsIDB4NzNjOCwgMHg3MmNjLAorCTB4NjAxNCwgMHgyMDkxLCAweDgwMDAsIDB4MDBlNiwgMHgyMDA5LCAweDAwMTIsIDB4ZDBmYywgMHgxMTE4LAorCTB4MjA3MSwgMHg0NjQwLCAweDAwMTgsIDB4MjA3MSwgMHg0NjgwLCAweGMxZmQsIDB4NzkyYSwgMHg3MDYzLAorCTB4MDAwNSwgMHg3MWQwLCAweGMxYzQsIDB4NzFkMiwgMHg3MzY2LCAweDcyNmEsIDB4NzQ2ZSwgMHg3MDcyLAorCTB4NzA3NywgMHgwMDAwLCAweDJjMDAsIDB4NzA3YSwgMHhhMDJlLCAweDI1MzAsIDB4NjExYywgMHhhMTg0LAorCTB4MDA2MCwgMHgwMTEwLCAweDA4MGMsIDB4M2ZjMSwgMHgwMGVlLCAweDY1OTYsIDB4NjVhNiwgMHg2NjlhLAorCTB4NjZhYSwgMHg2MGFmLCAweDAwMDAsIDB4NjBiMywgMHgwMDAwLCAweDY3MTQsIDB4NjAyMywgMHgwMDAwLAorCTB4MDgwYywgMHgyMmFlLCAweDIwOTEsIDB4ODAwMSwgMHgwMDA1LCAweDcwYzMsIDB4NDAwNSwgMHgwODA0LAorCTB4MTNiZCwgMHgyMGE5LCAweDAwMDUsIDB4MjA5OSwgMHg0NjE0LCAweDIwOTEsIDB4ODAwMCwgMHg1MzBhLAorCTB4MjA5MSwgMHg4MDAxLCAweDIxMDAsIDB4YTIxMCwgMHhhMzk5LCAweDAwMDAsIDB4YTRhMSwgMHgwMDAwLAorCTB4YTVhOSwgMHgwMDAwLCAweDAwMDUsIDB4NzFjNCwgMHg3MGM3LCAweDAwMDAsIDB4NzkxZSwgMHgwODA0LAorCTB4MTNiYSwgMHg3MWM0LCAweDcxYzYsIDB4MjE2OCwgMHgwMDEwLCAweDIwNjksIDB4MTAwMCwgMHg2OTBjLAorCTB4YTAxNiwgMHgyZDA0LCAweGEyMTAsIDB4OGQ2OCwgMHg4MTA5LCAweDFkZDgsIDB4YTI4NSwgMHgwMDAwLAorCTB4MTExOCwgMHg3MGMzLCAweDQwMDAsIDB4MDAxMCwgMHg3MGMzLCAweDQwMDMsIDB4NzBjYSwgMHgwODA0LAorCTB4MTNiZCwgMHg3OTY0LCAweDcxYzYsIDB4NzFjNCwgMHhhMTgyLCAweDAwMDMsIDB4MWEwNCwgMHgxM2IzLAorCTB4Nzk2NiwgMHgwODA0LCAweDEzYmEsIDB4Nzk2NCwgMHg3MWM2LCAweDA4MDQsIDB4MTNiYSwgMHg3OTAwLAorCTB4NzFjNiwgMHg3MWM0LCAweDc5MDIsIDB4MDgwNCwgMHgxM2JhLCAweDc5MDAsIDB4NzFjNiwgMHgwODA0LAorCTB4MTNiYSwgMHg3MGM0LCAweDIwMTEsIDB4MDAwMCwgMHhhMDhjLCAweDAwMGQsIDB4MDE2MCwgMHg4MTBjLAorCTB4MDIzMCwgMHg4MjEwLCAweDgxMGMsIDB4ODEwYywgMHgwMjEwLCAweDgyMTAsIDB4ODEwYywgMHg4MWZmLAorCTB4MTkwNCwgMHgxM2I0LCAweDgyMTAsIDB4N2EwZSwgMHhkMjhjLCAweDA1MzgsIDB4NzkxMCwgMHhjMWNkLAorCTB4NzkxMiwgMHgyMDA5LCAweDAwMjEsIDB4MjAxOSwgMHgwMDAzLCAweGQyODQsIDB4MDFjMCwgMHg4MTA4LAorCTB4MjAxOSwgMHgwMDQxLCAweDIwMTEsIDB4OGU0ZSwgMHgyMzEyLCAweDIwMTksIDB4MDA0MiwgMHg4MjEwLAorCTB4MjMxMiwgMHgyMDE5LCAweDAwNDMsIDB4ODIxMCwgMHgyMzEyLCAweDIwMTksIDB4MDA0NiwgMHg4MjEwLAorCTB4MjMxMiwgMHgyMDE5LCAweDAwNDcsIDB4ODIxMCwgMHgyMzEyLCAweDIwMTksIDB4MDAwNiwgMHgyMDExLAorCTB4OGU1MywgMHgyMTEyLCAweDIwMTEsIDB4OGU3MywgMHgyMzEyLCAweDc5MDQsIDB4NzgwNiwgMHgwODA0LAorCTB4MTNiOSwgMHg3ODA0LCAweDcwYzYsIDB4MDgwNCwgMHgxM2JhLCAweDcxYzQsIDB4ZDFmYywgMHgxMTE4LAorCTB4MjAxMSwgMHg0YWMwLCAweDAwMTAsIDB4MjAxMSwgMHg0YjQwLCAweDgxMDcsIDB4YTA4NCwgMHgwMDBmLAorCTB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTI2OCwgMHgyMDExLCAweDAwMDAsIDB4NjgxNCwgMHhkMGZjLAorCTB4MDExMCwgMHhhMjk1LCAweDAyMDAsIDB4ZDBiNCwgMHgwMTEwLCAweGEyOTUsIDB4MDAwMSwgMHg2YjBjLAorCTB4NjgwMCwgMHg3MGRhLCAweDA4MDQsIDB4MTNiNywgMHg3ODE0LCAweGQwZjQsIDB4MDEzMCwgMHgyMDAxLAorCTB4NDAwNywgMHg3MGRiLCAweDAwMDAsIDB4YTAwNSwgMHgwMDQ4LCAweGQwZmMsIDB4MDEzMCwgMHgyMDAxLAorCTB4NDAwNywgMHg3MGRiLCAweDAwMDEsIDB4YTAwNSwgMHgwMDA4LCAweGEwMDYsIDB4MDAwNSwgMHg3ODE0LAorCTB4ZDBmNCwgMHgwMTMwLCAweDIwMDEsIDB4NDAwNywgMHg3MGRiLCAweDAwMDAsIDB4YTAwNSwgMHgwMDA4LAorCTB4YTAwNiwgMHgwMDA1LCAweDc4MTQsIDB4ZDBmYywgMHgwMTMwLCAweDIwMDEsIDB4NDAwNywgMHg3MGRiLAorCTB4MDAwMSwgMHhhMDA1LCAweDAwMDgsIDB4YTAwNiwgMHgwMDA1LCAweDcxMTIsIDB4NzIxYSwgMHg3MzFlLAorCTB4NzgxMCwgMHhkMGM0LCAweDAxMTAsIDB4NzQyMiwgMHg3NTI2LCAweGFjODAsIDB4MDAwMSwgMHg4MTA4LAorCTB4ODEwYywgMHg4MWE5LCAweDgwOTgsIDB4MjBhMSwgMHgwMDMwLCAweDcwMDMsIDB4MDAwMCwgMHg2MDg0LAorCTB4MjBhMiwgMHg1M2E2LCAweDcwMDcsIDB4MDAwMSwgMHg3OTc0LCAweGExODQsIDB4ZmYwMCwgMHgwMTQwLAorCTB4ODEwZiwgMHg4MTBjLCAweDgxMGMsIDB4ODAwNCwgMHg4MDA0LCAweDgwMDcsIDB4YTEwMCwgMHgwMDE4LAorCTB4ODEwNywgMHg4MDA0LCAweDgwMDQsIDB4Nzk3YywgMHhhMTA4LCAweDdhNzgsIDB4YTAwNiwgMHhhMjExLAorCTB4N2QxMCwgMHhkNWM0LCAweDAxMjAsIDB4N2I4NCwgMHhhMzE5LCAweDdjODAsIDB4YTQyMSwgMHg3MDA4LAorCTB4ZDBmYywgMHgwZGU4LCAweDcwMDMsIDB4MDAwMSwgMHg3MDA3LCAweDAwMDYsIDB4NzExYSwgMHg3MjFlLAorCTB4N2QxMCwgMHhkNWM0LCAweDAxMTAsIDB4NzMyMiwgMHg3NDI2LCAweGEwODQsIDB4MDFlMCwgMHgwMDA1LAorCTB4Nzg0OCwgMHhhMDY1LCAweDAxMjAsIDB4MmMwNCwgMHg3ODRhLCAweDIwNjMsIDB4MDAwMCwgMHgwMDA1LAorCTB4MDBmNiwgMHgyMDc5LCAweDQ2MDAsIDB4Nzg0OCwgMHgyMDYyLCAweDJjMDAsIDB4YTAwNSwgMHgxMTEwLAorCTB4MDgwYywgMHgyNTRjLCAweDc4NGEsIDB4MDBmZSwgMHgwMDA1LCAweDIwMTEsIDB4OTAwMCwgMHg3YTRhLAorCTB4N2JjNCwgMHg4MzE5LCAweDAxMjgsIDB4YTI4MCwgMHgwMDMyLCAweDIwMTIsIDB4MjAxMCwgMHgwY2M4LAorCTB4MjAxMywgMHgwMDAwLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweGQ3ZmMsIDB4MTExOCwgMHgyMDExLAorCTB4NGJjMCwgMHgwMDEwLCAweDIwMTEsIDB4NmJjMCwgMHhhNzg0LCAweDBmMDAsIDB4ODAwYiwgMHhhNzg0LAorCTB4MDAxZiwgMHgwMTIwLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTEwNSwgMHhhMjY4LAorCTB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MGMzOSwgMHgyOTAwLCAweDY4MmEsIDB4MmEwMCwgMHg2ODJlLAorCTB4NjgwOCwgMHhhMDg0LCAweGY5ZWYsIDB4YTgwZCwgMHg2OTBhLCAweDAwZTYsIDB4ZDdmYywgMHgxMTI4LAorCTB4MjAwOSwgMHg0NjUyLCAweDIwNzEsIDB4NDY0MCwgMHgwMDIwLCAweDIwMDksIDB4NDY5MiwgMHgyMDcxLAorCTB4NDY4MCwgMHgyMTBjLCAweDY4MDQsIDB4YTAwNSwgMHgwMTQ4LCAweGExMTYsIDB4MTEzOCwgMHgyMDYwLAorCTB4NjAwMCwgMHg2ODA2LCAweDAwMTYsIDB4MjAwYiwgMHgwMDAwLCAweDAwMTgsIDB4MjAwOSwgMHgwMDAwLAorCTB4MDAxNiwgMHg2ODA0LCAweGEwNjUsIDB4MDE3OCwgMHg2MDAwLCAweDY4MDYsIDB4MDQyMSwgMHgwODBjLAorCTB4MWQ5NSwgMHg2ODEwLCAweDc5MDgsIDB4ODEwOSwgMHg3OTBhLCAweDgwMDEsIDB4NjgxMiwgMHgxZDg4LAorCTB4NzkxMCwgMHhjMWE1LCAweDc5MTIsIDB4MDAxZSwgMHg2OTAyLCAweDY5MDYsIDB4MmQwMCwgMHgyMDYwLAorCTB4MDgwYywgMHgyNjkzLCAweDAwZWUsIDB4MDAwNSwgMHhhMDY1LCAweDAxNjAsIDB4MjAwOCwgMHg2MDljLAorCTB4YTAwNSwgMHgwMTI4LCAweDIwNjIsIDB4NjA5ZiwgMHgwMDAwLCAweGEwNjUsIDB4MGNjMCwgMHg3ODQ4LAorCTB4Nzk0YSwgMHgyMDYyLCAweDAwMDUsIDB4NjAwNywgMHgwMTAzLCAweDYwOGYsIDB4MDAwMCwgMHgyMGE5LAorCTB4MDAxYywgMHhhYzgwLCAweDAwMDUsIDB4MjBhMCwgMHgyMDAxLCAweDAwMDAsIDB4NDBhNCwgMHg2ODI4LAorCTB4NjAxYSwgMHg2ODJjLCAweDYwMjIsIDB4MDAwNSwgMHgwMGU2LCAweGQ3ZmMsIDB4MTEyOCwgMHgyMDcxLAorCTB4NDY0MCwgMHgyMDMxLCAweDQ2YzAsIDB4MDAyMCwgMHgyMDcxLCAweDQ2ODAsIDB4MjAzMSwgMHg0OGMwLAorCTB4NzA0YywgMHhhMDhjLCAweDAyMDAsIDB4MTEyOCwgMHhhNjA4LCAweDJkMGEsIDB4ODAwMCwgMHg3MDRlLAorCTB4YTAwNiwgMHgwMGVlLCAweDAwMDUsIDB4MDBmNiwgMHhkN2ZjLCAweDExMTgsIDB4MjA3OSwgMHg0NjQwLAorCTB4MDAxMCwgMHgyMDc5LCAweDQ2ODAsIDB4MDgwYywgMHgxYjdiLCAweDIwOTEsIDB4ODAwMCwgMHg2ODA0LAorCTB4NzgwYSwgMHhhMDY1LCAweDA1ZjAsIDB4MDAzMCwgMHgyYzAwLCAweDc4MGEsIDB4MjA2MCwgMHg2MDAwLAorCTB4YTA2NSwgMHgwNWI4LCAweDYwMTAsIDB4YTMwNiwgMHgxZGI4LCAweDYwMGMsIDB4YTIwNiwgMHgxZGEwLAorCTB4MmMyOCwgMHg3ODQ4LCAweGFjMDYsIDB4MTEwOCwgMHgwNDQ4LCAweDY4MDQsIDB4YWMwNiwgMHgxMTQwLAorCTB4NjAwMCwgMHgyMDYwLCAweDY4MDYsIDB4YTAwNSwgMHgxMTE4LCAweDY4MDMsIDB4MDAwMCwgMHgwMDQ4LAorCTB4NjQwMCwgMHg3ODA4LCAweDIwNjAsIDB4NjQwMiwgMHhhNDg2LCAweDAwMDAsIDB4MTExMCwgMHgyYzAwLAorCTB4NjgwMiwgMHgyNTYwLCAweDA4MGMsIDB4MWJlMywgMHg2MDFiLCAweDAwMDUsIDB4NjAyMywgMHgwMDIwLAorCTB4MDBmZSwgMHgwODBjLCAweDFkOTUsIDB4MDBmNiwgMHg3OTA4LCAweDgxMDksIDB4NzkwYSwgMHg2ODEwLAorCTB4ODAwMSwgMHg2ODEyLCAweDExMTgsIDB4NzgxMCwgMHhjMGE1LCAweDc4MTIsIDB4MjAwMSwgMHhmZmZmLAorCTB4YTAwNSwgMHgwMGZlLCAweDAwMDUsIDB4MDA3NiwgMHgyNzAwLCAweDIwMzksIDB4MDAwMCwgMHhkMGZjLAorCTB4MDEwOCwgMHhjN2ZkLCAweDIwNDEsIDB4MDAyMSwgMHgyMDQ5LCAweDAwMDQsIDB4MjA1MSwgMHgwMDA4LAorCTB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4MWI5MywgMHg4NzM4LCAweGE3ODQsIDB4MDAxZiwgMHgxZGQwLAorCTB4YTdiYywgMHhmZjAwLCAweDg3M2YsIDB4ODczOCwgMHg4NzNmLCAweGE3ODQsIDB4MGYwMCwgMHgxZDkwLAorCTB4MjA5MSwgMHg4MDAxLCAweDAwN2UsIDB4MDAwNSwgMHg3ODZjLCAweDIwMDksIDB4OGU3NCwgMHgyMTBjLAorCTB4YTEwZCwgMHgwMTE4LCAweGEwNjUsIDB4MDgwNCwgMHgyMDdhLCAweDIwNjEsIDB4MDAwMCwgMHg2MDE4LAorCTB4ZDA4NCwgMHgxMWI4LCAweDc4MTAsIDB4ZDA4YywgMHgwMTMwLCAweGMwOGMsIDB4NzgxMiwgMHhjN2ZjLAorCTB4MjA2OSwgMHg0NjQwLCAweDAwMjgsIDB4YzA4ZCwgMHg3ODEyLCAweDIwNjksIDB4NDY4MCwgMHhjN2ZkLAorCTB4MjA5MSwgMHg4MDAwLCAweDY4MWMsIDB4NjgxZiwgMHgwMDAwLCAweDIwOTEsIDB4ODAwMSwgMHhhMDA1LAorCTB4MTEwOCwgMHgwMDA1LCAweGEwOGMsIDB4ZmZmMCwgMHgwMTEwLCAweDA4MGMsIDB4MjU0YywgMHgwMDAyLAorCTB4MWNiOCwgMHgxY2JiLCAweDFjYzEsIDB4MWNjNSwgMHgxY2I5LCAweDFjYzksIDB4MWNiOSwgMHgxY2I5LAorCTB4MWNiOSwgMHgxY2NmLCAweDFjZmIsIDB4MWNmZSwgMHgxZDAzLCAweDFkMGMsIDB4MWNiOSwgMHgxY2I5LAorCTB4MDAwNSwgMHgwODBjLCAweDI1NGMsIDB4MDgwYywgMHgxYzViLCAweDIwMDEsIDB4ODAwMSwgMHgwODA0LAorCTB4MWQxNSwgMHgyMDAxLCAweDgwMDMsIDB4MDgwNCwgMHgxZDE1LCAweDIwMDEsIDB4ODAwNCwgMHgwODA0LAorCTB4MWQxNSwgMHgwODBjLCAweDFjNWIsIDB4MjAwMSwgMHg4MDA2LCAweDA4MDQsIDB4MWQxNSwgMHgyMDkxLAorCTB4ODAwMCwgMHgwMDc2LCAweGQ3ZmMsIDB4MTEyOCwgMHgyMDY5LCAweDQ2NDAsIDB4MjAzOSwgMHgwMDA5LAorCTB4MDAyMCwgMHgyMDY5LCAweDQ2ODAsIDB4MjAzOSwgMHgwMDA5LCAweDY4MDAsIDB4YTA4NiwgMHgwMDAwLAorCTB4MDEyOCwgMHgwMDBlLCAweDZmMWUsIDB4MjA5MSwgMHg4MDAxLCAweDAwMDUsIDB4Njg3MCwgMHgwMDdlLAorCTB4YTBiYywgMHhmZjAwLCAweDIwNDEsIDB4MDAyMSwgMHgyMDQ5LCAweDAwMDQsIDB4MjA1MSwgMHgwMDEwLAorCTB4MDgwYywgMHgxYjkzLCAweDg3MzgsIDB4YTc4NCwgMHgwMDFmLCAweDFkZDAsIDB4MjA5MSwgMHg4MDAxLAorCTB4MjAwMSwgMHg4MDBhLCAweDAwZDAsIDB4MjAwMSwgMHg4MDBjLCAweDAwYjgsIDB4MDgwYywgMHgxYzViLAorCTB4MjAwMSwgMHg4MDBkLCAweDAwOTAsIDB4ZDdmYywgMHgwMTEwLCAweDc4ZTQsIDB4MDAwOCwgMHg3OGUwLAorCTB4NzBjNiwgMHgyMDAxLCAweDgwMGUsIDB4MDA0OCwgMHhkN2ZjLCAweDAxMTAsIDB4NzhlYywgMHgwMDA4LAorCTB4NzhlOCwgMHg3MGM2LCAweDIwMDEsIDB4ODAwZiwgMHgwMDAwLCAweDcwYzIsIDB4ZDdmYywgMHgxMTE4LAorCTB4NzBkYiwgMHgwMDAwLCAweDAwMTAsIDB4NzBkYiwgMHgwMDAxLCAweDIwNjEsIDB4MDAwMCwgMHg2MDFiLAorCTB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MDAwNSwgMHhhYzgwLCAweDAwMDEsIDB4ODFmZiwgMHgwNTE4LAorCTB4MjA5OSwgMHgwMDMwLCAweDIwYTAsIDB4NzAwYywgMHhhMDg0LCAweDA3ZmYsIDB4MDEwMCwgMHg3MDE4LAorCTB4MDAwNiwgMHg3MDFjLCAweDAwMDYsIDB4NzAyMCwgMHgwMDA2LCAweDcwMjQsIDB4MDAwNiwgMHg3MTEyLAorCTB4ODFhYywgMHg3MjFhLCAweDczMWUsIDB4NzQyMiwgMHg3NTI2LCAweDcwMDMsIDB4MDAwMSwgMHg3MDA3LAorCTB4MDAwMSwgMHg3MDA4LCAweDgwMGIsIDB4MWVlOCwgMHg3MDA3LCAweDAwMDIsIDB4YTA4YywgMHgwMWUwLAorCTB4MTExMCwgMHg1M2E1LCAweGEwMDYsIDB4NzAwMywgMHgwMDAwLCAweDcwMDcsIDB4MDAwNCwgMHgwMDBlLAorCTB4NzAyNiwgMHgwMDBlLCAweDcwMjIsIDB4MDAwZSwgMHg3MDFlLCAweDAwMGUsIDB4NzAxYSwgMHgwMDA1LAorCTB4MjAxMSwgMHgwMDIwLCAweDIwMDksIDB4MDAxMCwgMHg2YjBhLCAweDZjMGUsIDB4NjgxZiwgMHgwMjAxLAorCTB4NjgwMywgMHhmZDIwLCAweDY4MDcsIDB4MDAzOCwgMHg2YTFhLCAweDJkMDAsIDB4YTBlOCwgMHgwMDA4LAorCTB4YTI5MCwgMHgwMDA0LCAweDgxMDksIDB4MWQ4MCwgMHgwMDA1LCAweDcwZWMsIDB4ZDBkYywgMHgxNTIwLAorCTB4MjAyOSwgMHgwMDAxLCAweDc4MTQsIDB4ZDBjYywgMHgxMTYwLCAweDcwZWMsIDB4ZDBlNCwgMHgyMDE5LAorCTB4MGMwYSwgMHgyMDIxLCAweDAwMGEsIDB4MTEyMCwgMHgyMDE5LCAweDBjMGMsIDB4MjAyMSwgMHgwMDBjLAorCTB4MDA3MCwgMHg3MGVjLCAweGQwZTQsIDB4MTEyOCwgMHgyMDE5LCAweDE4MGMsIDB4MjAyMSwgMHgwMDBjLAorCTB4MDAzMCwgMHgyMDE5LCAweDE4MDksIDB4MjAyMSwgMHgwMDA5LCAweGE1YWQsIDB4MDIwMCwgMHg2YjBhLAorCTB4NmMwZSwgMHg2ZDFlLCAweDY4MDcsIDB4MDAzOCwgMHgwMDA1LCAweDYwMDQsIDB4NjA4NiwgMHgyYzA4LAorCTB4MjA2MywgMHgwMDAwLCAweDc4NjgsIDB4YTAwNSwgMHg3OTZhLCAweDAxMTAsIDB4MmMwMiwgMHgwMDA4LAorCTB4Nzk2ZSwgMHgwMDA1LCAweDAwYzYsIDB4MjA2MSwgMHg0NjAwLCAweDY4ODcsIDB4MDEwMywgMHgyZDA4LAorCTB4MjA2YiwgMHgwMDAwLCAweDYwNjgsIDB4YTAwNSwgMHg2MTZhLCAweDAxMTAsIDB4MmQwMiwgMHgwMDA4LAorCTB4NjE2ZSwgMHgwMGNlLCAweDAwMDUsIDB4MjA5MSwgMHg4MDAwLCAweDJjMDQsIDB4Nzg2ZSwgMHhhMDA1LAorCTB4MTEwOCwgMHg3ODZhLCAweDIwOTEsIDB4ODAwMSwgMHg2MDljLCAweGEwMDUsIDB4MDE4OCwgMHgwMGM2LAorCTB4MjA2MCwgMHgyMDA4LCAweDYwOWMsIDB4YTAwNSwgMHgwMTM4LCAweDIwNjIsIDB4NjA5ZiwgMHgwMDAwLAorCTB4YTA2NSwgMHg2MDljLCAweGEwMDUsIDB4MWRjOCwgMHg3ODQ4LCAweDc5NGEsIDB4MjA2MiwgMHgwMGNlLAorCTB4Nzg0OCwgMHgyMDYyLCAweDYwOWYsIDB4MDAwMCwgMHhhYzg1LCAweDAwMDAsIDB4MTExMCwgMHgwODBjLAorCTB4MjU0YywgMHg3ODRhLCAweDAwMDUsIDB4MjBhOSwgMHgwMDEwLCAweGEwMDYsIDB4ODAwNCwgMHg4MDg2LAorCTB4ODE4ZSwgMHgxMjA4LCAweGEyMDAsIDB4MWYwNCwgMHgxZGRmLCAweDgwODYsIDB4ODE4ZSwgMHgwMDA1LAorCTB4MDE1NiwgMHgyMGE5LCAweDAwMTAsIDB4YTAwNSwgMHgwMWI4LCAweGExMWEsIDB4MTJhOCwgMHg4MjEzLAorCTB4ODE4ZCwgMHgwMjI4LCAweGExMWEsIDB4MTIyMCwgMHgxZjA0LCAweDFkZWYsIDB4MDAyOCwgMHhhMTFhLAorCTB4MjMwOCwgMHg4MjEwLCAweDFmMDQsIDB4MWRlZiwgMHgwMDA2LCAweDMyMDAsIDB4YTA4NCwgMHhlZmZmLAorCTB4MjA4MCwgMHgwMDBlLCAweDAxNWUsIDB4MDAwNSwgMHgwMDA2LCAweDMyMDAsIDB4YTA4NSwgMHgxMDAwLAorCTB4MGNiOCwgMHg3ZDc0LCAweDcwZDAsIDB4YTUwNiwgMHgwOTA0LCAweDFlYmQsIDB4NzgxMCwgMHgyMDUwLAorCTB4MDgwYywgMHgxYjU4LCAweDA5MDQsIDB4MWViZCwgMHhhMDQ2LCAweDc5NzAsIDB4MjUwMCwgMHg4MDAwLAorCTB4YTExMiwgMHgyMDA5LCAweDAwNDAsIDB4MTIwOCwgMHgwMDMwLCAweDcyZDAsIDB4YTIwNiwgMHgwMTE4LAorCTB4ODg0MCwgMHgyMDA5LCAweDAwODAsIDB4MDBjNiwgMHg3MTEyLCAweDcwMDcsIDB4MDAwMSwgMHgyMDk5LAorCTB4MDAzMCwgMHgyMGE5LCAweDAwMjAsIDB4YWM4MCwgMHgwMDAxLCAweDIwYTAsIDB4MjA2MSwgMHgwMDAwLAorCTB4ODhmZiwgMHgwMTEwLCAweDA4MGMsIDB4MWI1OCwgMHg3MDA4LCAweGQwZmMsIDB4MGRlOCwgMHg3MDA3LAorCTB4MDAwMiwgMHgyMDkxLCAweDgwMDEsIDB4YTA4YywgMHgwMWUwLCAweDE1MzgsIDB4NTNhNSwgMHg4Y2ZmLAorCTB4MTEyMCwgMHg4OGZmLCAweDA5MDQsIDB4MWVhYSwgMHgwMDUwLCAweDJjMDAsIDB4Nzg4ZSwgMHgyMGE5LAorCTB4MDAyMCwgMHhhYzgwLCAweDAwMDEsIDB4MjBhMCwgMHg1M2E1LCAweDA4MDQsIDB4MWVhYSwgMHhhMDQ2LAorCTB4NzIxOCwgMHg3MzFjLCAweGRhYzQsIDB4MDExMCwgMHg3NDIwLCAweDc1MjQsIDB4YTI5MiwgMHgwMDQwLAorCTB4YTM5YiwgMHgwMDAwLCAweGE0YTMsIDB4MDAwMCwgMHhhNWFiLCAweDAwMDAsIDB4NzIxYSwgMHg3MzFlLAorCTB4ZGFjNCwgMHgwMTE4LCAweDc0MjIsIDB4NzUyNiwgMHhhMDA2LCAweDcwMDcsIDB4MDAwNCwgMHgwOTA0LAorCTB4MWVhYSwgMHg4Y2ZmLCAweDAxMTAsIDB4MDgwYywgMHgxYjYwLCAweDAwY2UsIDB4MDgwYywgMHgxYjYwLAorCTB4YTA0NiwgMHg3ODg4LCAweDgwMDAsIDB4Nzg4YSwgMHhhMDg2LCAweDAwMDIsIDB4MDFjMCwgMHg3YTdjLAorCTB4N2I3OCwgMHhkYWM0LCAweDAxMTAsIDB4N2M4NCwgMHg3ZDgwLCAweDc5NzQsIDB4ODEwNywgMHg4MDA0LAorCTB4ODAwNCwgMHhhMjEwLCAweGEzOTksIDB4MDAwMCwgMHhhNGExLCAweDAwMDAsIDB4YTVhOSwgMHgwMDAwLAorCTB4NzIxYSwgMHg3MzFlLCAweGRhYzQsIDB4MDU4OCwgMHg3NDIyLCAweDc1MjYsIDB4MDQ3MCwgMHg2MDE0LAorCTB4ZDBmYywgMHgxMTE4LCAweDIwNjksIDB4NDY0MCwgMHgwMDEwLCAweDIwNjksIDB4NDY4MCwgMHgyMDkxLAorCTB4ODAwMCwgMHg2ODFmLCAweDAwMDIsIDB4ODhmZiwgMHgwMTIwLCAweGEwNDYsIDB4Nzg4YywgMHgyMDYwLAorCTB4MGM3MCwgMHg3ODhiLCAweDAwMDAsIDB4NzhhYywgMHhhMDg1LCAweDAwMDMsIDB4NzhhZSwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDk4LCAweDAwY2UsIDB4Nzg4YiwgMHgwMDAwLCAweDA4MGMsIDB4MjAzNSwgMHg2MDA0LAorCTB4YTA4NCwgMHgwMDBmLCAweDAwNTksIDB4ODhmZiwgMHgwMTMwLCAweDc4OGMsIDB4MjA2MCwgMHg2MDA0LAorCTB4YTA4NCwgMHgwMDBmLCAweDAwMTksIDB4MDgwNCwgMHgxZTA5LCAweDAwMDUsIDB4MDAwMiwgMHgxZWNmLAorCTB4MWVlYSwgMHgxZjAzLCAweDFlY2YsIDB4MWYxMCwgMHgxZWUwLCAweDFlY2YsIDB4MWVjZiwgMHgxZWNmLAorCTB4MWVlOCwgMHgxZjAxLCAweDFlY2YsIDB4MWVjZiwgMHgxZWNmLCAweDFlY2YsIDB4MWVjZiwgMHgyMDM5LAorCTB4MDQwMCwgMHg3OGJjLCAweGE3MDUsIDB4NzhiZSwgMHg2MDA4LCAweGE3MDUsIDB4NjAwYSwgMHgwODBjLAorCTB4MWY0YywgMHg2MDljLCAweDc4YmEsIDB4NjA5ZiwgMHgwMDAwLCAweDA4MGMsIDB4MjAyMSwgMHgwMDA1LAorCTB4NzhiYywgMHhkMGM0LCAweDAxMDgsIDB4MGM1OCwgMHg2MDFjLCAweGMwYmQsIDB4NjAxZSwgMHgwMDMwLAorCTB4MDgwYywgMHgyMDVmLCAweDc4YmMsIDB4ZDBjNCwgMHgwMTA4LCAweDBjMDgsIDB4NzhiZiwgMHgwMDAwLAorCTB4NjAwNCwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHg3OGIyLCAweDgwMDEsIDB4MDEzOCwgMHgwODBjLAorCTB4MWY0YywgMHgwMTIwLCAweDc4YmMsIDB4YzBjNSwgMHg3OGJlLCAweDAwMTAsIDB4MDgwNCwgMHgxZjY3LAorCTB4MDAwNSwgMHgwODBjLCAweDIwNWMsIDB4NzhiYywgMHhhMDhjLCAweDBlMDAsIDB4MTExMCwgMHhkMGM0LAorCTB4MTEwOCwgMHgwODI4LCAweDA4MGMsIDB4MWY0YywgMHgxMTEwLCAweDA4MDQsIDB4MWY2NywgMHgwMDA1LAorCTB4NzhiYywgMHhkMGM0LCAweDAxMTAsIDB4MDgwNCwgMHgxZWNmLCAweDc4YmYsIDB4MDAwMCwgMHg2NzE0LAorCTB4MjAxMSwgMHgwMDAxLCAweDIyYTgsIDB4NjAxOCwgMHhhMDg0LCAweDAwZmYsIDB4YTAwNSwgMHgwMTg4LAorCTB4YTdiYywgMHhmZjAwLCAweDIwYTksIDB4MDAyMCwgMHhhMDhlLCAweDAwMDEsIDB4MDE1MCwgMHhhN2JjLAorCTB4ODAwMCwgMHgyMDExLCAweDAwMDIsIDB4MjBhOSwgMHgwMTAwLCAweGEwOGUsIDB4MDAwMiwgMHgwMTA4LAorCTB4MDBjMCwgMHgwODBjLCAweDFiN2IsIDB4MmQwMCwgMHgyMDkxLCAweDgwMDAsIDB4NjgyYiwgMHgwMDAwLAorCTB4NjgyZiwgMHgwMDAwLCAweDY4MDgsIDB4YTA4NCwgMHhmZmRlLCAweDY4MGEsIDB4YWRlOCwgMHgwMDEwLAorCTB4MjA5MSwgMHg4MDAxLCAweDFmMDQsIDB4MWYzNCwgMHg4MjExLCAweDAxMTgsIDB4MjBhOSwgMHgwMTAwLAorCTB4MGM1OCwgMHgwODBjLCAweDFiNjAsIDB4MDAwNSwgMHg2MDlmLCAweDAwMDAsIDB4NzhiNCwgMHhhMDZkLAorCTB4MmMwMCwgMHg3OGI2LCAweDExMTAsIDB4NzhiYSwgMHgwMDM4LCAweDY4OWUsIDB4MmQwMCwgMHg2MDAyLAorCTB4NzhiOCwgMHhhZDA2LCAweDExMDgsIDB4NjAwMiwgMHg3OGIwLCAweDgwMDEsIDB4NzhiMiwgMHgxMTMwLAorCTB4NzhiYywgMHhjMGM0LCAweDc4YmUsIDB4NzhiOCwgMHgyMDYwLCAweGEwMDYsIDB4MDAwNSwgMHgwMGU2LAorCTB4YTAyZSwgMHgyNTMwLCAweDdkYmEsIDB4N2RiNiwgMHg2NWFlLCAweDY1YjIsIDB4NjAxYywgMHg2MGEyLAorCTB4MjA0OCwgMHhhOTg0LCAweGUxZmYsIDB4NjAxZSwgMHhhOTg0LCAweDAwNjAsIDB4MDExMCwgMHgwODBjLAorCTB4M2ZjMSwgMHg2NTk2LCAweDY1YTYsIDB4NjY5YSwgMHg2NmFhLCAweDY3MTQsIDB4MjA3MSwgMHg0NjgwLAorCTB4ZDdmYywgMHgxMTEwLCAweDIwNzEsIDB4NDY0MCwgMHhhNzg0LCAweDBmMDAsIDB4ODAwYiwgMHhhNzg0LAorCTB4MDAxZiwgMHgwMTIwLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTEwNSwgMHg3MWMwLAorCTB4YTE2OCwgMHgyNzAwLCAweDgwMDcsIDB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLAorCTB4NzFjNCwgMHhhMTAwLCAweDYwYzIsIDB4MjA5MSwgMHg4MDAwLCAweDc4MTQsIDB4ZDBjNCwgMHgwMTM4LAorCTB4ZDdmYywgMHgxMTE4LCAweGQwZjQsIDB4MTE0MCwgMHgwMDEwLCAweGQwZmMsIDB4MTEyOCwgMHg2ZTA4LAorCTB4ZDY4NCwgMHgwMWYwLCAweGQ5ZmMsIDB4MTFlMCwgMHgyMDkxLCAweDgwMDEsIDB4MDgwYywgMHgxYmUzLAorCTB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4MWQ5NSwgMHgyMDkxLCAweDgwMDEsIDB4NzgxNCwgMHhkMGM0LAorCTB4MDkwNCwgMHgyMDFmLCAweGQ3ZmMsIDB4MTEyMCwgMHhkMGY0LCAweDExMzAsIDB4MDgwNCwgMHgyMDFmLAorCTB4ZDBmYywgMHgxMTEwLCAweDA4MDQsIDB4MjAxZiwgMHg2MDFiLCAweDAwMjEsIDB4MDgwNCwgMHgyMDFmLAorCTB4NjAyNCwgMHhhMDk2LCAweDAwMDEsIDB4MTExMCwgMHg4MDAwLCAweDYwMjYsIDB4NmExMCwgMHg2ODE0LAorCTB4YTIwMiwgMHgwMjY4LCAweDAxNjAsIDB4MjA5MSwgMHg4MDAxLCAweDIwMzksIDB4MDIwMCwgMHg2MDljLAorCTB4NzhiYSwgMHg2MDlmLCAweDAwMDAsIDB4MDgwYywgMHgyMDIxLCAweDA4MDQsIDB4MjAxZiwgMHgyYzA4LAorCTB4ZDlmYywgMHgwMWYwLCAweDY4MDAsIDB4YTA2NSwgMHgwMWQ4LCAweDZhMDQsIDB4NzAwMCwgMHhhMDg0LAorCTB4MDAwMiwgMHgwMTY4LCAweDcwNDgsIDB4YTIwNiwgMHgxMTUwLCAweDZiMDQsIDB4MjE2MCwgMHgyMzA0LAorCTB4NjAwMiwgMHhhMDA1LCAweDExMDgsIDB4NjkwMiwgMHgyMjYwLCAweDYxMDIsIDB4MDA5OCwgMHgyZDAwLAorCTB4MjA2MCwgMHgwODBjLCAweDI2OTMsIDB4NmUwOCwgMHgyMTYwLCAweDYyMDIsIDB4NjkwNiwgMHgwMDUwLAorCTB4NjgwMCwgMHg2OTAyLCAweGEwNjUsIDB4MDExMCwgMHg2MTAyLCAweDAwMDgsIDB4NjkwNiwgMHgyMTYwLAorCTB4NjAwMywgMHgwMDAwLCAweDIxNjAsIDB4ZDlmYywgMHgwMTE4LCAweGE2YjQsIDB4ZmZmYywgMHg2ZTBhLAorCTB4NjgxMCwgMHg3ZDA4LCAweDg1MjgsIDB4N2QwYSwgMHg4MDAwLCAweDY4MTIsIDB4MjA5MSwgMHg4MDAxLAorCTB4ZDZiNCwgMHgwMTI4LCAweGE2YjYsIDB4MDA0MCwgMHg2ZTBhLCAweDA4MGMsIDB4MWJmNCwgMHgwMGVlLAorCTB4MDAwNSwgMHg2MDA4LCAweGE3MDUsIDB4NjAwYSwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHgxZDk1LAorCTB4MjA5MSwgMHg4MDAxLCAweDc4YjgsIDB4YTA2NSwgMHgwMTI4LCAweDYwOWMsIDB4NzhiYSwgMHg2MDlmLAorCTB4MDAwMCwgMHgwYzc4LCAweDc4YjYsIDB4NzhiYSwgMHgwMDA1LCAweDc5NzAsIDB4Nzg3NCwgMHgyODE4LAorCTB4ZDM4NCwgMHgwMTE4LCAweDgwMDAsIDB4YTExMiwgMHgwMjIwLCAweDgwMDAsIDB4YTExMiwgMHgxMjc4LAorCTB4YzM4NCwgMHg3YTdjLCAweDcyMWEsIDB4N2E3OCwgMHg3MjFlLCAweGRhYzQsIDB4MDEyMCwgMHg3YTg0LAorCTB4NzIyMiwgMHg3YTgwLCAweDcyMjYsIDB4YTAwNiwgMHhkMzg0LCAweDAxMDgsIDB4ODAwMCwgMHg3ODc2LAorCTB4NzBkMiwgMHg3ODFjLCAweGEwMDUsIDB4MDEzOCwgMHg4MDAxLCAweDc4MWUsIDB4MTEyMCwgMHgwZTA0LAorCTB4MjA1YiwgMHgyMDkxLCAweDQwODAsIDB4MDAwNSwgMHgyMDM5LCAweDIwNzEsIDB4MDAxMCwgMHgyMDM5LAorCTB4MjA3NywgMHgyNzA0LCAweGEwMDUsIDB4MDE2MCwgMHhhYzAwLCAweDIwNjgsIDB4NjkwOCwgMHg2ODEwLAorCTB4NjkxMiwgMHg2ODBhLCAweDY5MGMsIDB4NjgxNCwgMHg2OTE2LCAweDY4MGUsIDB4ODczOCwgMHgwYzg4LAorCTB4MDAwNSwgMHgwMDAzLCAweDAwMDksIDB4MDAwZiwgMHgwMDE1LCAweDAwMWIsIDB4MDAwMCwgMHgwMDE1LAorCTB4MDAxYiwgMHgwMDAwLCAweDIwNDEsIDB4MDAwMCwgMHg3ODBjLCAweDAwMDIsIDB4MjIyMywgMHgyMWZlLAorCTB4MjA4MiwgMHgyMGYyLCAweDIwMzksIDB4OGU3NCwgMHgyNzM0LCAweDdkMTAsIDB4MDBjMCwgMHg2MDg0LAorCTB4YTA4NiwgMHgwMTAzLCAweDE5MDQsIDB4MjBkYywgMHg2MTE0LCAweDYwMTgsIDB4YTEwNSwgMHgwMTIwLAorCTB4ODZmZiwgMHgxMWQ4LCAweDA4MDQsIDB4MjBkYywgMHg4NjAzLCAweGEwODAsIDB4OGU1NSwgMHg2MjBjLAorCTB4MjIwMiwgMHg4MDAwLCAweDYyMTAsIDB4MjIwMiwgMHgwODBjLCAweDFkYjMsIDB4ODYzMCwgMHhhNjhlLAorCTB4MDAwZiwgMHgwOTA0LCAweDIxNWQsIDB4Nzg2YywgMHhhMDY1LCAweDFkMDgsIDB4NzgwOCwgMHhhNjAyLAorCTB4MTIyMCwgMHhkNWFjLCAweDExMTAsIDB4MjYzYSwgMHgwMDA1LCAweGE2ODIsIDB4MDAwMywgMHgxYTA0LAorCTB4MjE1ZCwgMHgyMDkxLCAweDgwMDAsIDB4MjA2OSwgMHgwMDAwLCAweDY4MTgsIDB4ZDA4NCwgMHgxMWY4LAorCTB4MjAxMSwgMHg4ZTU1LCAweDIyMDQsIDB4NzBjNiwgMHg4MjEwLCAweDIyMDQsIDB4NzBjYSwgMHhkNjg0LAorCTB4MTEzMCwgMHg4MjEwLCAweDIyMDQsIDB4NzBkYSwgMHg4MjEwLCAweDIyMDQsIDB4NzBkZSwgMHhhNjg1LAorCTB4ODAyMCwgMHg3MGMyLCAweDY4MWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4NzgxMCwgMHhhMDg0LAorCTB4ZmZjZiwgMHg3ODEyLCAweDIwOTEsIDB4ODAwMSwgMHgyMDNiLCAweDAwMDAsIDB4MDAwNSwgMHg3ODEwLAorCTB4YzBhZCwgMHg3ODEyLCAweDA4MDQsIDB4MjE1ZCwgMHgyNjNhLCAweDA4MGMsIDB4MjIyOSwgMHgxOTA0LAorCTB4MjI0NSwgMHg3ODZjLCAweGEwNjUsIDB4MTkwNCwgMHgyMDg3LCAweDIwOTEsIDB4ODAwMCwgMHg3ODEwLAorCTB4YTA4NCwgMHhmZmNmLCAweDg2ZmYsIDB4MDEwOCwgMHhjMGFkLCAweDc4MTIsIDB4MjA5MSwgMHg4MDAxLAorCTB4MDgwNCwgMHgyMjQ1LCAweDIwMzksIDB4OGU3NCwgMHgyNzM0LCAweDdkMTAsIDB4MDBhMCwgMHg2MDg0LAorCTB4YTA4NiwgMHgwMTAzLCAweDE5MDQsIDB4MjE0NywgMHg2MTE0LCAweDYwMTgsIDB4YTEwNSwgMHgwMTIwLAorCTB4ODZmZiwgMHgxMWI4LCAweDA4MDQsIDB4MjE0NywgMHhhNjgwLCAweDhlNTUsIDB4NjIwYywgMHgyMjAyLAorCTB4MDgwYywgMHgxZGIzLCAweDg2MzAsIDB4YTY4ZSwgMHgwMDFlLCAweDA5MDQsIDB4MjE1ZCwgMHg3ODZjLAorCTB4YTA2NSwgMHgxZDI4LCAweDc4MDgsIDB4YTYwMiwgMHgxMjIwLCAweGQ1YWMsIDB4MTExMCwgMHgyNjNhLAorCTB4MDAwNSwgMHhhNjgyLCAweDAwMDYsIDB4MWEwNCwgMHgyMTVkLCAweDIwOTEsIDB4ODAwMCwgMHgyMDY5LAorCTB4MDAwMCwgMHg2ODE4LCAweGQwODQsIDB4MTFmOCwgMHgyMDExLCAweDhlNTUsIDB4MjAwOSwgMHg4ZTRlLAorCTB4MjZhOCwgMHgyMTFjLCAweDIyMDQsIDB4MjAxYSwgMHg4MTA4LCAweDgyMTAsIDB4MWYwNCwgMHgyMTI5LAorCTB4YTY4NSwgMHg4MDMwLCAweDcwYzIsIDB4NjgxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHg3ODEwLAorCTB4YTA4NCwgMHhmZmNmLCAweDc4MTIsIDB4MjA5MSwgMHg4MDAxLCAweGEwMDYsIDB4MjAwOSwgMHg4ZTc1LAorCTB4MjAwYSwgMHgyMDNhLCAweDAwMDUsIDB4NzgxMCwgMHhjMGFkLCAweDc4MTIsIDB4MDBiMCwgMHgyNjNhLAorCTB4MDgwYywgMHgyMjI5LCAweDE5MDQsIDB4MjI0NSwgMHg3ODZjLCAweGEwNjUsIDB4MTkwNCwgMHgyMGY3LAorCTB4MjA5MSwgMHg4MDAwLCAweDc4MTAsIDB4YTA4NCwgMHhmZmNmLCAweDg2ZmYsIDB4MDEwOCwgMHhjMGFkLAorCTB4NzgxMiwgMHgyMDkxLCAweDgwMDEsIDB4MDgwNCwgMHgyMjQ1LCAweDIwOTEsIDB4ODAwMCwgMHg3MDA3LAorCTB4MDAwNCwgMHg3OTk0LCAweDcwZDQsIDB4YTEwMiwgMHgwMjI4LCAweDAxNjgsIDB4N2I5MCwgMHhhMzAyLAorCTB4MTE1MCwgMHgwMDEwLCAweDgwMDIsIDB4MTEzOCwgMHgyNjNhLCAweDc4MTAsIDB4YzBhZCwgMHg3ODEyLAorCTB4MjA5MSwgMHg4MDAxLCAweDAwMDUsIDB4YTE4NCwgMHhmZjAwLCAweDAxNDAsIDB4ODEwZiwgMHg4MTBjLAorCTB4ODEwYywgMHg4MDA0LCAweDgwMDQsIDB4ODAwNywgMHhhMTAwLCAweDAwMTgsIDB4ODEwNywgMHg4MDA0LAorCTB4ODAwNCwgMHg3YTljLCAweGEyMTAsIDB4NzIxYSwgMHg3YTk4LCAweGEwMDYsIDB4YTIxMSwgMHg3MjFlLAorCTB4ZDRjNCwgMHgwMTMwLCAweDdhYTQsIDB4YTIxMSwgMHg3MjIyLCAweDdhYTAsIDB4YTIxMSwgMHg3MjI2LAorCTB4MjBhMSwgMHgwMDMwLCAweDcwMDMsIDB4MDAwMCwgMHgyMDA5LCAweDhlNTQsIDB4MjYwYSwgMHg4MTA5LAorCTB4MjE5OCwgMHgyMTA0LCAweGQwODQsIDB4MDEwOCwgMHg4NjMzLCAweGE2YjAsIDB4MDAwMiwgMHgyNmE4LAorCTB4NTNhNiwgMHg4NjAzLCAweDcwMTIsIDB4NzAwNywgMHgwMDAxLCAweDc5OTAsIDB4Nzg5NCwgMHg4MDAwLAorCTB4YTEwYSwgMHgxMjA4LCAweGEwMDYsIDB4MjAyOCwgMHg3OTc0LCAweGExODQsIDB4ZmYwMCwgMHgwMTQwLAorCTB4ODEwZiwgMHg4MTBjLCAweDgxMGMsIDB4ODAwNCwgMHg4MDA0LCAweDgwMDcsIDB4YTEwMCwgMHgwMDE4LAorCTB4ODEwNywgMHg4MDA0LCAweDgwMDQsIDB4Nzk3YywgMHhhMTA4LCAweDdhNzgsIDB4YTAwNiwgMHhhMjExLAorCTB4ZDRjNCwgMHgwMTIwLCAweDdiODQsIDB4YTMxOSwgMHg3YzgwLCAweGE0MjEsIDB4NzAwOCwgMHhkMGZjLAorCTB4MGRlOCwgMHhhMDg0LCAweDAxZTAsIDB4MDFkMCwgMHg3ZDEwLCAweDIwMzEsIDB4OGU1NCwgMHgyNjM0LAorCTB4NzhhOCwgMHg4MDAwLCAweDc4YWEsIDB4ZDA4YywgMHgxMTM4LCAweDcwMDcsIDB4MDAwNiwgMHg3MDA0LAorCTB4ZDA5NCwgMHgxZGU4LCAweDA4MDQsIDB4MjE1ZiwgMHgyMDY5LCAweDQ2NDcsIDB4MjA2YiwgMHgwMDAzLAorCTB4NzhhYywgMHhhMDg1LCAweDAzMDAsIDB4NzhhZSwgMHhhMDA2LCAweDAwNDgsIDB4MjAzMCwgMHg3NWQ2LAorCTB4MjA5MSwgMHg0MDgwLCAweDdkOTYsIDB4N2QxMCwgMHhhNWFjLCAweGZmY2YsIDB4N2QxMiwgMHgyMDkxLAorCTB4ODAwMSwgMHg3OGFhLCAweDcwMDcsIDB4MDAwNiwgMHgyNjNhLCAweDcwMDMsIDB4MDAwMSwgMHg3MTFhLAorCTB4NzIxZSwgMHhkNWM0LCAweDAxMTAsIDB4NzMyMiwgMHg3NDI2LCAweDAwMDUsIDB4NjA4NCwgMHhhMDg2LAorCTB4MDEwMywgMHgxMWQ4LCAweDYxMTQsIDB4NjAxOCwgMHhhMTA1LCAweDExYjgsIDB4MjA2OSwgMHgwMDAwLAorCTB4NjgxOCwgMHhkMDg0LCAweDExOTAsIDB4NjAwYywgMHg3MGM2LCAweDYwMTAsIDB4NzBjYSwgMHg3MGMzLAorCTB4ODAyMCwgMHg2ODFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDA4MGMsIDB4MWRiMywgMHgwZTA0LAorCTB4MjIxYywgMHg3ODZjLCAweGEwNjUsIDB4MWQxMCwgMHgwMDA1LCAweDAwNTksIDB4MTUzMCwgMHg3ODZjLAorCTB4YTA2NSwgMHgxOWUwLCAweDA0MTAsIDB4MDAyOSwgMHgxNTAwLCAweDc4NmMsIDB4YTA2NSwgMHgxZGQ4LAorCTB4MDBlMCwgMHg2MDg0LCAweGEwODYsIDB4MDEwMywgMHgxMTY4LCAweDYwMTgsIDB4YzBmYywgMHg2MDFhLAorCTB4YTA4NiwgMHgwMDA0LCAweDExMzgsIDB4NzgwNCwgMHhkMGE0LCAweDAxMjAsIDB4MDgwYywgMHgxZGIzLAorCTB4YTAwNiwgMHgwMDA1LCAweDAwNzksIDB4MTExOCwgMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMGI5LAorCTB4MTExMCwgMHgyMDQxLCAweDAwMDEsIDB4N2QxMCwgMHgwMDA1LCAweDg4ZmYsIDB4MDExMCwgMHgyMDkxLAorCTB4NDA4MCwgMHgwMDA1LCAweDdiOTAsIDB4Nzk5NCwgMHg3MGQ0LCAweGExMDIsIDB4MTExOCwgMHhhMzg1LAorCTB4MDAwMCwgMHgwMDA1LCAweDAyMTAsIDB4YTMwMiwgMHgwMDA1LCAweDgwMDIsIDB4MDAwNSwgMHhhMTg0LAorCTB4ZmYwMCwgMHgwMTQwLCAweDgxMGYsIDB4ODEwYywgMHg4MTBjLCAweDgwMDQsIDB4ODAwNCwgMHg4MDA3LAorCTB4YTEwMCwgMHgwMDE4LCAweDgxMDcsIDB4ODAwNCwgMHg4MDA0LCAweDdhOWMsIDB4N2I5OCwgMHg3Y2E0LAorCTB4N2RhMCwgMHhhMjEwLCAweGEwMDYsIDB4YTMxOSwgMHhhNDIxLCAweGE1MjksIDB4MjAwOSwgMHgwMDE4LAorCTB4NjAyOCwgMHhhMDA1LCAweDAxMTAsIDB4MjAwOSwgMHgwMDQwLCAweDA4MGMsIDB4MWIxNSwgMHgwMWQwLAorCTB4NzhhOCwgMHg4MDAwLCAweDc4YWEsIDB4ZDA4YywgMHgxNTEwLCAweDYwMTQsIDB4ZDBmYywgMHgxMTE4LAorCTB4MjA2OSwgMHg0NjQwLCAweDAwMTAsIDB4MjA2OSwgMHg0NjgwLCAweDIwOTEsIDB4ODAwMCwgMHg2ODFmLAorCTB4MDAwMywgMHg3OGFiLCAweDAwMDAsIDB4NzhhYywgMHhhMDg1LCAweDAzMDAsIDB4NzhhZSwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDY4LCAweDc4YWIsIDB4MDAwMCwgMHgwODBjLCAweDFkYjMsIDB4Nzk5MCwgMHg3ODk0LAorCTB4ODAwMCwgMHhhMTBhLCAweDEyMDgsIDB4YTAwNiwgMHg3ODk2LCAweDcwZDYsIDB4YTAwNiwgMHgyMDcxLAorCTB4MDAxMCwgMHgyMDkxLCAweDgwMDEsIDB4MDAwNSwgMHhkN2ZjLCAweDExMTgsIDB4MjAwOSwgMHg0NjU4LAorCTB4MDAxMCwgMHgyMDA5LCAweDQ2OTgsIDB4MjA5MSwgMHg4MDAwLCAweDIwMGEsIDB4MDBmNiwgMHgyMDA5LAorCTB4NDY4MCwgMHgyMDc5LCAweDAxMDAsIDB4ZDdmYywgMHgxMTIwLCAweDIwMDksIDB4NDY0MCwgMHgyMDc5LAorCTB4MDIwMCwgMHgyMTA0LCAweGEwODYsIDB4MDAwMCwgMHgxMTgwLCAweGQ3ZmMsIDB4MTExOCwgMHgyMDA5LAorCTB4NDY0NSwgMHgwMDEwLCAweDIwMDksIDB4NDY4NSwgMHgyMTA0LCAweGEwMDUsIDB4MTEzMCwgMHg3ODMwLAorCTB4YTA4NCwgMHgwMGMwLCAweDExMTAsIDB4NzgxYiwgMHgwMDUyLCAweDAwZmUsIDB4MDAwNSwgMHgyMDA5LAorCTB4MDAwMiwgMHgyMDY5LCAweDQ2MDAsIDB4MjAwMSwgMHgwMWZmLCAweDIwMDQsIDB4ZDBmYywgMHgxOTA0LAorCTB4MjMyNCwgMHgyMDcxLCAweDQ2ODAsIDB4MjA3OSwgMHgwMTAwLCAweDIwMjEsIDB4NDhiZiwgMHg3ODRiLAorCTB4MDAwZiwgMHgyMDAxLCAweDAxZmYsIDB4MjAwNCwgMHhkMGZjLCAweDAxMTgsIDB4MjAxOSwgMHgzZTBmLAorCTB4MDAzMCwgMHgyMGExLCAweDAxMmIsIDB4MjAxOSwgMHgzZTBmLCAweGQxODQsIDB4MDExMCwgMHgyMGExLAorCTB4MDIyYiwgMHgyMzA0LCAweGEwMDUsIDB4MDE0MCwgMHg3ODlhLCAweDgzMTgsIDB4MjNhYywgMHg4MzE4LAorCTB4MjM5OCwgMHg1M2E2LCAweDMzMTgsIDB4MGNhOCwgMHg3ODliLCAweDAwMDAsIDB4Nzg5YiwgMHgwMDIwLAorCTB4MjBhOSwgMHgwMDEwLCAweDc4YWYsIDB4MDAwMCwgMHg3OGFmLCAweDIwMjAsIDB4MWYwNCwgMHgyMzAyLAorCTB4NzAwMywgMHgwMDAwLCAweDAwMTYsIDB4ZDE4YywgMHgyMDA5LCAweDAwMDAsIDB4MDEwOCwgMHhjMWJkLAorCTB4MDgwYywgMHgyNDQzLCAweDAwMWUsIDB4NzAyMCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4NSwgMHg2MzAwLAorCTB4NzgwNiwgMHg3ODBmLCAweDkwMDAsIDB4Nzg0MywgMHgwMGQ4LCAweDc4NTMsIDB4MDA5MCwgMHg3ODBiLAorCTB4MmYwOCwgMHg3NDUyLCAweDcwNGYsIDB4MDAwMCwgMHg4MTA5LCAweDAxNDAsIDB4MjA3MSwgMHg0NjQwLAorCTB4MjA3OSwgMHgwMjAwLCAweDIwMjEsIDB4NDZiZiwgMHgwODA0LCAweDIyZGYsIDB4MDgwYywgMHgyNGZkLAorCTB4MDAwNSwgMHgwMDE2LCAweDIwMTEsIDB4MDEwMSwgMHhkMWJjLCAweDExMTAsIDB4MjAxMSwgMHgwMjAxLAorCTB4YTE4YywgMHgwMDBmLCAweDIyMDQsIDB4YTA4NCwgMHhmZmYwLCAweGExMDUsIDB4MjAxMiwgMHgwMDFlLAorCTB4MDgwYywgMHgyNDQzLCAweDAwMDUsIDB4MjAxMSwgMHgwMTAxLCAweGQzZmMsIDB4MTExMCwgMHgyMDExLAorCTB4MDIwMSwgMHgyMGE5LCAweDAwMDksIDB4ODEwYiwgMHgxZjA0LCAweDIzNGIsIDB4YTE4YywgMHgwZTAwLAorCTB4MjIwNCwgMHhhMDg0LCAweGYxZmYsIDB4YTEwNSwgMHgyMDEyLCAweDAwMDUsIDB4MjAxOSwgMHgwMDAyLAorCTB4MjAwOSwgMHgwMTAxLCAweDIwYTksIDB4MDAwNSwgMHg4MjEzLCAweDFmMDQsIDB4MjM1YywgMHhhMjk0LAorCTB4MDBlMCwgMHgyMTA0LCAweGEwODQsIDB4ZmYxZiwgMHhhMjA1LCAweDIwMGEsIDB4ODMxOSwgMHgwMTE4LAorCTB4MjAwOSwgMHgwMjAxLCAweDBjNzgsIDB4MDAwNSwgMHgyMDExLCAweDAxMDEsIDB4ZDNmYywgMHgxMTEwLAorCTB4MjAxMSwgMHgwMjAxLCAweDIwYTksIDB4MDAwYywgMHg4MTBiLCAweDFmMDQsIDB4MjM3NCwgMHhhMThjLAorCTB4ZjAwMCwgMHgyMjA0LCAweGEwODQsIDB4MGZmZiwgMHhhMTA1LCAweDIwMTIsIDB4MDAwNSwgMHgyMDExLAorCTB4MDEwMiwgMHhkM2ZjLCAweDExMTAsIDB4MjAxMSwgMHgwMjAyLCAweDIyMDQsIDB4YTA4NCwgMHhmMGNmLAorCTB4YTEwNSwgMHgyMDEyLCAweDAwMDUsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4ZDFiYywgMHgxMTEwLAorCTB4MjA2MSwgMHgwMjAwLCAweGMxYmMsIDB4ODEwMywgMHg4MDAzLCAweGEwODAsIDB4MDAyMCwgMHg2MDlhLAorCTB4NjJhYywgMHg2M2FjLCAweDAwY2UsIDB4MDAwNSwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHhkMWJjLAorCTB4MTExMCwgMHgyMDYxLCAweDAyMDAsIDB4YzFiYywgMHg4MTAzLCAweDgwMDMsIDB4YTA4MCwgMHgwMDIyLAorCTB4NjA5YSwgMHg2MGE0LCAweGEwODQsIDB4ZmZkZiwgMHg2MGFlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGM2LAorCTB4MjA2MSwgMHgwMTAwLCAweGQxYmMsIDB4MTExMCwgMHgyMDYxLCAweDAyMDAsIDB4YzFiYywgMHg4MTAzLAorCTB4ODAwMywgMHhhMDgwLCAweDAwMjAsIDB4NjA5YSwgMHg2MGE0LCAweGEyOGMsIDB4MDAyMCwgMHgwMTE4LAorCTB4YzJhYywgMHhhMzlkLCAweDQwMDAsIDB4YzNlYywgMHhkM2I0LCAweDExMDgsIDB4YzNlZCwgMHg2MmFlLAorCTB4MjAxMCwgMHg2MGE0LCAweDYzYWUsIDB4MjAxOCwgMHgwMGNlLCAweDAwMDUsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDBjNiwgMHgwMGU2LCAweDY4MTgsIDB4YTAwNSwgMHgwOTA0LCAweDI0MjcsIDB4ZDFmYywgMHgwMTE4LAorCTB4MjA2MSwgMHg4ZGQwLCAweDAwMTAsIDB4MjA2MSwgMHg4Y2MwLCAweDA4MGMsIDB4MjQyZiwgMHgwNTYwLAorCTB4MjBhOSwgMHgwMTAxLCAweGQxZmMsIDB4MDExOCwgMHgyMDYxLCAweDhjZDAsIDB4MDAxMCwgMHgyMDYxLAorCTB4OGJjMCwgMHgwMGM2LCAweDA4MGMsIDB4MjQyZiwgMHgwMTI4LCAweDAwY2UsIDB4OGM2MCwgMHgxZjA0LAorCTB4MjNlOSwgMHgwNGE4LCAweDAwMGUsIDB4ZDFmYywgMHgwMTI4LCAweGEwODIsIDB4OGNkMCwgMHgyMDcxLAorCTB4NDY4MCwgMHgwMDIwLCAweGEwODIsIDB4OGJjMCwgMHgyMDcxLCAweDQ2NDAsIDB4NzA3NiwgMHg3MTcyLAorCTB4MjEzOCwgMHgyMDAxLCAweDAwMDQsIDB4NzA2MiwgMHg3MDdmLCAweDAwMGYsIDB4NzFkMCwgMHhjMWM0LAorCTB4NzFkMiwgMHgwODBjLCAweDIyYTQsIDB4MDBjMCwgMHhkMWZjLCAweDExMTgsIDB4MjA3MSwgMHg0NjQwLAorCTB4MDAxMCwgMHgyMDcxLCAweDQ2ODAsIDB4NjAyMCwgMHhjMGRkLCAweDYwMjIsIDB4NzE3MiwgMHgyMTM4LAorCTB4MmMwMCwgMHg3MDdhLCAweDIwMDEsIDB4MDAwNiwgMHg3MDYyLCAweDcwN2YsIDB4MDAwZiwgMHg3MWQwLAorCTB4YzFjNCwgMHg3MWQyLCAweDA4MGMsIDB4MjJhNCwgMHgyMDAxLCAweDAwMDAsIDB4MDAxMCwgMHgyMDAxLAorCTB4MDAwMSwgMHgyMDkxLCAweDgwMDEsIDB4YTAwNSwgMHgwMGVlLCAweDAwY2UsIDB4MDAwNSwgMHgyYzA0LAorCTB4YTAwNSwgMHgwMTcwLCAweDIwNjAsIDB4NjAxMCwgMHhhMzA2LCAweDExNDAsIDB4NjAwYywgMHhhMjA2LAorCTB4MTEyOCwgMHg2MDE0LCAweGExMDYsIDB4MTExMCwgMHhhMDA2LCAweDAwMjAsIDB4NjAwMCwgMHgwYzgwLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwMTYsIDB4MjA3OSwgMHg0NjgwLAorCTB4MjA3MSwgMHgwMTAwLCAweGQxYmMsIDB4MTEyMCwgMHgyMDc5LCAweDQ2NDAsIDB4MjA3MSwgMHgwMjAwLAorCTB4NzkyMCwgMHhhMThjLCAweDAwMGYsIDB4NzBlYywgMHhkMGM0LCAweDExMTAsIDB4MDAxZSwgMHgwMDYwLAorCTB4ODEwYiwgMHg4MTBiLCAweDgxMGIsIDB4ODEwYiwgMHgwMDBlLCAweGExOGQsIDB4MDgwMCwgMHhkMGJjLAorCTB4MTExMCwgMHhhMThkLCAweDBmMDAsIDB4MjEwNCwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgyMDAxLAorCTB4NDYwMSwgMHgyMDA0LCAweGQwYWMsIDB4MTEzOCwgMHg2OGU0LCAweGQwYWMsIDB4MDEyMCwgMHhhMDg0LAorCTB4MDAwNiwgMHgxMTA4LCAweDAwMDksIDB4MDAwNSwgMHg2MDE0LCAweDAwZTYsIDB4MDAzNiwgMHgyMDE4LAorCTB4MjA3MSwgMHg0YjQwLCAweGQwZmMsIDB4MTExMCwgMHgyMDcxLCAweDRhYzAsIDB4ODAwNywgMHhhMDg0LAorCTB4MDAwZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhZTcwLCAweDcwMDQsIDB4YTA4NCwgMHgwMDBhLAorCTB4MTkwNCwgMHgyNGZhLCAweDcxMDgsIDB4YTE5NCwgMHhmZjAwLCAweDA5MDQsIDB4MjRmYSwgMHhhMThjLAorCTB4MDBmZiwgMHg3MDFjLCAweGEwODQsIDB4ZmYwMCwgMHgwMWMwLCAweDcwMDQsIDB4YTA4NSwgMHgwMDNhLAorCTB4NzAwNiwgMHgyMDAxLCAweDAwMDksIDB4YTEwMiwgMHgxNmQ4LCAweDIwMDEsIDB4MDAwYSwgMHhhMTAyLAorCTB4MTZkMCwgMHgyMDAxLCAweDAwMGMsIDB4YTEwMiwgMHgxNmM4LCAweDcwMWMsIDB4YTA4NCwgMHgwMGZmLAorCTB4NzAxZSwgMHg3MDA0LCAweGEwODQsIDB4ZmZkZiwgMHg3MDA2LCAweDIwMDEsIDB4MDAwYSwgMHhhMTA2LAorCTB4MDFhOCwgMHgyMDAxLCAweDAwMGMsIDB4YTEwNiwgMHgwMWEwLCAweDIwMDEsIDB4MDAxMiwgMHhhMTA2LAorCTB4MDE5OCwgMHgyMDAxLCAweDAwMTQsIDB4YTEwNiwgMHgwMTkwLCAweDIwMDEsIDB4MDAxOSwgMHhhMTA2LAorCTB4MDE4OCwgMHgyMDAxLCAweDAwMzIsIDB4YTEwNiwgMHgwMTgwLCAweDAwZDgsIDB4MjAwOSwgMHgwMDBjLAorCTB4MDBkMCwgMHgyMDA5LCAweDAwMTIsIDB4MDBiOCwgMHgyMDA5LCAweDAwMTQsIDB4MDBhMCwgMHgyMDA5LAorCTB4MDAxOSwgMHgwMDg4LCAweDIwMDksIDB4MDAyMCwgMHgwMDcwLCAweDIwMDksIDB4MDAzZiwgMHgwMDU4LAorCTB4MjAwOSwgMHgwMDBhLCAweDAwNDAsIDB4MjAwOSwgMHgwMDBjLCAweDAwMjgsIDB4MjAwOSwgMHgwMDE5LAorCTB4MDAxMCwgMHgyMDExLCAweDAwMDAsIDB4MjEwMCwgMHhhMjA1LCAweDcwMGEsIDB4NzAwNCwgMHhhMDg1LAorCTB4MDAwYSwgMHg3MDA2LCAweDIwNzEsIDB4NDYwMCwgMHg3MDA0LCAweGQwYmMsIDB4MDE1OCwgMHhkM2ZjLAorCTB4MTEyMCwgMHg3M2VhLCAweDIwNzEsIDB4NDY0MCwgMHgwMDE4LCAweDczZWUsIDB4MjA3MSwgMHg0NjgwLAorCTB4NzAxZiwgMHgwMDBkLCAweDAwM2UsIDB4MDBlZSwgMHgwMDA1LCAweDIwMDEsIDB4MDFmZiwgMHgyMDA0LAorCTB4ZDBmYywgMHgxMWQwLCAweDIwMDEsIDB4MDRmZCwgMHgyMDA0LCAweGEwODIsIDB4MDAwNSwgMHgxMmEwLAorCTB4MjA3MSwgMHgwMjAwLCAweDcxZWMsIDB4YTE4YywgMHgxYzAwLCAweDgxMGYsIDB4ODEwYywgMHg4MTBjLAorCTB4MjA3OSwgMHgwMTAwLCAweDc4ZWMsIDB4YTA4NCwgMHgxYzAwLCAweDgwMDcsIDB4ODAwNCwgMHg4MDA0LAorCTB4YTEwNSwgMHhhMDhhLCAweDAwMDcsIDB4MDIwOCwgMHgwMDA1LCAweDAwMDIsIDB4MjU0YiwgMHgyNTMyLAorCTB4MjU0YiwgMHgyNTMyLCAweDI1MjUsIDB4MjUzZiwgMHgyNTI1LCAweDcwMDgsIDB4YTA4NCwgMHhjM2ZmLAorCTB4YTA4NSwgMHgzMDAwLCAweDcwMGEsIDB4NzgwOCwgMHhhMDg0LCAweGMzZmYsIDB4YTA4NSwgMHgzMDAwLAorCTB4NzgwYSwgMHgwMDA1LCAweDcwMDgsIDB4YTA4NCwgMHhjM2ZmLCAweGEwODUsIDB4MjAwMCwgMHg3MDBhLAorCTB4NzgwOCwgMHhhMDg0LCAweGMzZmYsIDB4YTA4NSwgMHgyMDAwLCAweDc4MGEsIDB4MDAwNSwgMHg3MDA4LAorCTB4YTA4NCwgMHhjM2ZmLCAweGEwODUsIDB4MGMwMCwgMHg3MDBhLCAweDc4MDgsIDB4YTA4NCwgMHhjM2ZmLAorCTB4YTA4NSwgMHgwYzAwLCAweDc4MGEsIDB4MDAwNSwgMHgwZTA0LCAweDI1NGMsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA3MSwgMHgwMDAwLCAweDAwMDYsIDB4NzAxOCwgMHhkMDg0LCAweDFkZTgsIDB4MDAwZSwgMHgyMDcxLAorCTB4MDAxMCwgMHg3MGNhLCAweDAwMGUsIDB4NzBjNiwgMHg3MGMzLCAweDgwMDIsIDB4NzBkYiwgMHgwYTA0LAorCTB4NzBkZiwgMHgwMDIwLCAweDIwNzEsIDB4MDAwMCwgMHg3MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLAorCTB4MGNmOCwgMHg3ZjNjLCAweDdlNTgsIDB4N2MzMCwgMHg3ZDM4LCAweDc4YTAsIDB4NzA4YSwgMHg3NThlLAorCTB4NzQ5MiwgMHg3Njk2LCAweDc3OWEsIDB4YTU5NCwgMHgwMDNmLCAweGQ0ZjQsIDB4MDEzOCwgMHhkN2JjLAorCTB4MTEyOCwgMHhhNzg0LCAweDAwN2QsIDB4MTkwNCwgMHgzYzc0LCAweDA4NzEsIDB4YTQ5YywgMHgwMDBmLAorCTB4YTM4MiwgMHgwMDA0LCAweDAzMjAsIDB4YTNhNiwgMHgwMDA3LCAweDE5MzAsIDB4MjQxOCwgMHg4NTA3LAorCTB4YTA4NCwgMHgwMDBmLCAweDAwMDIsIDB4MmI0OSwgMHgyYzM0LCAweDJjNzIsIDB4MmVkOCwgMHgzMjU2LAorCTB4MzJhZCwgMHgzMzUzLCAweDMzZTIsIDB4MzRiNiwgMHgzNTg4LCAweDI1OWUsIDB4MjU5YiwgMHgyOTcwLAorCTB4MmE1NiwgMHgzMjJhLCAweDI1OWIsIDB4MDgwYywgMHgyNTRjLCAweDAwMDUsIDB4YTAwNiwgMHgwMDM4LAorCTB4NzgwOCwgMHhjMDhkLCAweDc4MGEsIDB4YTAwNiwgMHg3MDAyLCAweDcwNGEsIDB4NzA0MiwgMHg3MGNlLAorCTB4NzA1YywgMHhhMDA1LCAweDE5MDQsIDB4MjZlYywgMHg3MDYwLCAweGEwODQsIDB4MDAwNywgMHgwMDAyLAorCTB4MjViOCwgMHgyNjI2LCAweDI2MmUsIDB4MjYzNywgMHgyNjQwLCAweDI2ZDIsIDB4MjY0OSwgMHgyNjI2LAorCTB4NzgzMCwgMHhkMGJjLCAweDFkMTAsIDB4NzFkMCwgMHhkMWJjLCAweDE5ZjgsIDB4ZDFiNCwgMHgxOTA0LAorCTB4MjYwMywgMHg3MGEwLCAweGEwODYsIDB4MDAwMSwgMHgwOWMwLCAweDcwYjAsIDB4YTA2ZCwgMHg2ODAwLAorCTB4YTA2NSwgMHhhMDU1LCAweDc4OWIsIDB4MDA4MCwgMHg2YjBjLCAweDdiYWEsIDB4NjgwOCwgMHhhMDQ1LAorCTB4NmQxMCwgMHg2ODA0LCAweGEwNmQsIDB4YTA1ZCwgMHhhODg2LCAweDAwMDEsIDB4MDExOCwgMHg2OWJjLAorCTB4N2RhYSwgMHg3OWFhLCAweDY4YzAsIDB4YTA0ZCwgMHg2ZTFjLCAweDIwMDEsIDB4MDAxMCwgMHgwODA0LAorCTB4MjgxZiwgMHg3MDVjLCAweGEwMDUsIDB4MTkwNCwgMHgyNTlkLCAweDAwYzYsIDB4MDBkNiwgMHg3MGIwLAorCTB4YTA2ZCwgMHg2ODAwLCAweGEwNjUsIDB4YTA1NSwgMHg3ODliLCAweDAwODAsIDB4NmIwYywgMHg3YmFhLAorCTB4NjgwOCwgMHhhMDQ1LCAweDZkMTAsIDB4NjgwNCwgMHhhMDZkLCAweGEwNWQsIDB4YTg4NiwgMHgwMDAxLAorCTB4MDExOCwgMHg2OWJjLCAweDdkYWEsIDB4NzlhYSwgMHg2OGMwLCAweGEwNGQsIDB4NmUxYywgMHgyMDAxLAorCTB4MDAyMCwgMHgwODA0LCAweDI4MWYsIDB4MDgwYywgMHgzYzMzLCAweDE5MDQsIDB4MjU5ZCwgMHg3ODFiLAorCTB4MDA2OCwgMHg3MGI4LCAweGEwNmQsIDB4NjhiNCwgMHg3ODVhLCAweDY4OTQsIDB4NzhkNiwgMHg3OGRlLAorCTB4Njg5OCwgMHg3OGQyLCAweDc4ZGEsIDB4NzgwOCwgMHhjMDhkLCAweDc4MGEsIDB4NjhiYywgMHg3MDNlLAorCTB4YzFiNCwgMHg3MWQyLCAweDcwYjQsIDB4YTA2NSwgMHg2OGMwLCAweDcwNTYsIDB4NzAwMywgMHgwMDAyLAorCTB4MmQwMCwgMHg3MDRhLCAweGFkODAsIDB4MDAwOSwgMHg3MDQyLCAweDAwMDUsIDB4MDgwYywgMHgzYzMzLAorCTB4MTEyMCwgMHg3ODFiLCAweDAwNTQsIDB4NzAwMywgMHgwMDA0LCAweDAwMDUsIDB4MDgwYywgMHgzYzMzLAorCTB4MTEyOCwgMHgyMDExLCAweDAwMGMsIDB4MDQxOSwgMHg3MDAzLCAweDAwMDQsIDB4MDAwNSwgMHgwODBjLAorCTB4M2MzMywgMHgxMTI4LCAweDIwMTEsIDB4MDAwNiwgMHgwMGQxLCAweDcwMDMsIDB4MDAwNCwgMHgwMDA1LAorCTB4MDgwYywgMHgzYzMzLCAweDExMjgsIDB4MjAxMSwgMHgwMDBkLCAweDAwODksIDB4NzAwMywgMHgwMDA0LAorCTB4MDAwNSwgMHgwODBjLCAweDNjMzMsIDB4MTE1MCwgMHgyMDExLCAweDAwMDYsIDB4MDA0MSwgMHg3MDc4LAorCTB4NzA3YiwgMHgwMDAwLCAweDIwNjgsIDB4NzA0YSwgMHg3MDAzLCAweDAwMDQsIDB4MDAwNSwgMHg3MTcwLAorCTB4YzFmYywgMHg4MTA3LCAweDc4ODIsIDB4Nzg5YiwgMHgwMDgwLCAweGEyODYsIDB4MDAwYywgMHgxMTIwLAorCTB4N2FhYSwgMHgyMDAxLCAweDAwMDEsIDB4MDA5OCwgMHhhMThjLCAweDAwMWYsIDB4YTE4ZCwgMHgwMGMwLAorCTB4NzlhYSwgMHhhMjg2LCAweDAwMGQsIDB4MDEyMCwgMHg3YWFhLCAweDIwMDEsIDB4MDAwMiwgMHgwMDM4LAorCTB4NzhhYiwgMHgwMDIwLCAweDcxNzQsIDB4NzlhYSwgMHg3YWFhLCAweDIwMDEsIDB4MDAwNCwgMHg3ODliLAorCTB4MDA2MCwgMHg3OGFhLCAweDc4NWIsIDB4MDAwNCwgMHg3ODFiLCAweDAxMTMsIDB4MDgwYywgMHgzYzQ2LAorCTB4NzA3ZiwgMHgwMDBmLCAweDcwZDAsIDB4ZDBiNCwgMHgwMTY4LCAweGMwYjQsIDB4NzBkMiwgMHgwMGM2LAorCTB4NzBiNCwgMHhhMDY1LCAweDYwMDgsIDB4YTA4NCwgMHhmYmVmLCAweDYwMGEsIDB4NjAxOCwgMHg4MDAxLAorCTB4NjAxYSwgMHgwMGNlLCAweDAwMDUsIDB4NzAxNCwgMHhhMDA1LCAweDExMzgsIDB4NzBkMCwgMHhkMGI0LAorCTB4MDEyOCwgMHg3MGI0LCAweGFjMDYsIDB4MTExMCwgMHgwYzI5LCAweDAwMDUsIDB4MDAxNiwgMHg3MWEwLAorCTB4YTE4NiwgMHgwMDAxLCAweDA1MjgsIDB4MDBkNiwgMHgwMDI2LCAweDIxMDAsIDB4MjAxMSwgMHgwMDAxLAorCTB4YTIxMiwgMHg3MGIwLCAweDIwNjgsIDB4NjgwMCwgMHhhYzA2LCAweDAxMjAsIDB4ODIxMSwgMHgwMWIwLAorCTB4MDBjOSwgMHgwY2M4LCAweDAwYzYsIDB4MjEwMCwgMHgyMDExLCAweDAwMDEsIDB4YTIxMiwgMHg3MGIwLAorCTB4MjA2OCwgMHg2ODAwLCAweDIwNjAsIDB4NjAwOCwgMHhhMDg0LCAweGZiZWYsIDB4NjAwYSwgMHg4MjExLAorCTB4MDExMCwgMHgwMDQxLCAweDBjYjAsIDB4NzBhMywgMHgwMDAxLCAweDAwY2UsIDB4MDAyZSwgMHgwMGRlLAorCTB4MDAxZSwgMHgwMDA1LCAweGFkZTgsIDB4MDAwNSwgMHg3MGE4LCAweGFkMDYsIDB4MTExMCwgMHg3MGE0LAorCTB4MjA2OCwgMHgwMDA1LCAweDA4MGMsIDB4M2MzMywgMHgxOTA0LCAweDI1OWQsIDB4NzA3OCwgMHgyMDY4LAorCTB4Nzc3MCwgMHgwODBjLCAweDNiNmYsIDB4MmM1MCwgMHgwODBjLCAweDNjY2UsIDB4Nzg5YiwgMHgwMDgwLAorCTB4NjgxNCwgMHhhMDg0LCAweDAwMWYsIDB4YzBiZCwgMHg3OGFhLCAweDZlMWMsIDB4MjA0MSwgMHgwMDAxLAorCTB4MjAwMSwgMHgwMDA0LCAweDA4MDQsIDB4MjgyNCwgMHgwODBjLCAweDNjMzMsIDB4MTkwNCwgMHgyNTlkLAorCTB4Nzg5YiwgMHgwMDgwLCAweDcwNWMsIDB4MjA2OCwgMHg2ZjE0LCAweDcwZDAsIDB4ZDBiNCwgMHgwMTY4LAorCTB4YzBiNCwgMHg3MGQyLCAweDAwYzYsIDB4NzBiNCwgMHhhMDY1LCAweDYwMDgsIDB4YTA4NCwgMHhmYmVmLAorCTB4NjAwYSwgMHg2MDE4LCAweDgwMDEsIDB4NjAxYSwgMHgwMGNlLCAweDA4MGMsIDB4M2I2ZiwgMHgyYzUwLAorCTB4MDgwYywgMHgzY2NlLCAweDY4MjQsIDB4YTAwNSwgMHgwMTMwLCAweGEwODIsIDB4MDAwNiwgMHgwMjA4LAorCTB4MDAxMCwgMHg2ODI3LCAweDAwMDUsIDB4NjgxNCwgMHhhMDg0LCAweDAwMWYsIDB4YzBiZCwgMHg3OGFhLAorCTB4MjAzMSwgMHgwMDIwLCAweDIwNDEsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDMsIDB4MDgwNCwgMHgyODI0LAorCTB4YzI4ZCwgMHg3MmQyLCAweDcyYmMsIDB4YTIwMCwgMHhhMDE1LCAweDcxNTAsIDB4ODEwOCwgMHhhMTJhLAorCTB4MDIwOCwgMHg3MWJjLCAweDIxNjQsIDB4NjUwNCwgMHg4NWZmLCAweDExNzAsIDB4NzE1MiwgMHg4NDIxLAorCTB4MWRhOCwgMHg3MGQwLCAweGQwOGMsIDB4MDEyOCwgMHg3MGNjLCAweGEwMDUsIDB4MTExMCwgMHg3MGNmLAorCTB4MDAwYSwgMHgwMDA1LCAweDIyMDAsIDB4MGM5MCwgMHg3MGQwLCAweGMwOGMsIDB4NzBkMiwgMHg3MGNmLAorCTB4MDAwMCwgMHg2MDM0LCAweGEwMDUsIDB4MWRiMCwgMHg2NzA4LCAweGE3ODQsIDB4MDczZiwgMHgwMWQwLAorCTB4ZDdkNCwgMHgxZDgwLCAweGE3ODQsIDB4MDAyMSwgMHgxZDY4LCAweGE3ODQsIDB4MDAwMiwgMHgwMTMwLAorCTB4YTc4NCwgMHgwMDA0LCAweDBkMzgsIDB4YTdiYywgMHhmZmZiLCAweDY3MGEsIDB4YTc4NCwgMHgwMjE4LAorCTB4MWQwOCwgMHhhNzg0LCAweDAxMDAsIDB4MDEzMCwgMHg2MDE4LCAweGEwMDUsIDB4MTlkOCwgMHhhN2JjLAorCTB4ZmVmZiwgMHg2NzBhLCAweDI1NjgsIDB4NjgyMywgMHgwMDAwLCAweDZlMWMsIDB4YTY4NCwgMHgwMDBlLAorCTB4NjMxOCwgMHgwMTI4LCAweDYwMWMsIDB4YTMwMiwgMHgwMjIwLCAweDAxMTgsIDB4MDg1OCwgMHg4M2ZmLAorCTB4MTk0OCwgMHgyZDU4LCAweDJjNTAsIDB4NzE1MiwgMHhkN2JjLCAweDExMjAsIDB4NzAyOCwgMHg2MDIyLAorCTB4NjAzYSwgMHgwMDEwLCAweGM3YmMsIDB4NjcwYSwgMHg2OGMwLCAweGEwNjUsIDB4YTA0ZCwgMHg2MTAwLAorCTB4MmE2MCwgMHgyMDQxLCAweDAwMDEsIDB4NmIxNCwgMHhhMzljLCAweDAwMWYsIDB4YTM5ZCwgMHgwMGMwLAorCTB4ZDFmYywgMHgwMTEwLCAweGQ2ODQsIDB4MDExMCwgMHhhMzljLCAweGZmYmYsIDB4ZDZhNCwgMHgwMTEwLAorCTB4YTM5ZCwgMHgwMDIwLCAweGE2ODQsIDB4MDAwZSwgMHgxOTA0LCAweDI3ZDYsIDB4YzdhNSwgMHg2NzBhLAorCTB4MmMwMCwgMHg2OGM2LCAweDc3YTAsIDB4YTc4NiwgMHgwMDAxLCAweDExNzgsIDB4NzBkMCwgMHhkMGI0LAorCTB4MTE2MCwgMHg3MDAwLCAweGEwODIsIDB4MDAwMiwgMHgxMjQwLCAweDc4MzAsIDB4ZDBiYywgMHgxMTI4LAorCTB4Nzg5YiwgMHgwMDgwLCAweDdiYWEsIDB4MDgwNCwgMHgyODFkLCAweDg3MzksIDB4NzdhMiwgMHgyNzUwLAorCTB4NzdhYywgMHhhN2IwLCAweDAwMDUsIDB4NzBhOCwgMHhhNjA2LCAweDExMDgsIDB4NzZhNCwgMHg3NmFlLAorCTB4MmMzYSwgMHg4NzM4LCAweDJkM2EsIDB4ODczOCwgMHgyODNhLCAweDg3MzgsIDB4MjMzYSwgMHg4NzM4LAorCTB4MjUzYSwgMHg3ODMwLCAweGQwYmMsIDB4MDE1MCwgMHgyMDkxLCAweDgwMDAsIDB4MjA5MSwgMHgzMDNkLAorCTB4NzBkMCwgMHhhMDg0LCAweDMwM2QsIDB4MjA5MSwgMHg4MDAwLCAweDIwOTAsIDB4YWFkNSwgMHgwMDAwLAorCTB4MDEyMCwgMHg4NDIxLCAweDIyMDAsIDB4MTkwNCwgMHgyNzI1LCAweDAwMDUsIDB4ZDFkYywgMHgwOTA0LAorCTB4MzdjZSwgMHgyMDI5LCAweDAwMjAsIDB4ZDY5YywgMHgxMTIwLCAweDg1MjgsIDB4ZDY4YywgMHgxMTA4LAorCTB4ODUyOCwgMHg4ODQwLCAweDZmMTQsIDB4NjEwYywgMHg4MTA4LCAweGExOGMsIDB4MDBmZiwgMHg3MGM4LAorCTB4YTE2MCwgMHgyYzY0LCAweDhjZmYsIDB4MDE4OCwgMHg2MDE0LCAweGE3MDYsIDB4MWRkMCwgMHg2MGI4LAorCTB4ODAwMSwgMHg2MGJhLCAweDFkODgsIDB4MmE2MCwgMHg2MDA4LCAweGEwODUsIDB4MDEwMCwgMHg2MDBhLAorCTB4MjIwMCwgMHg4NDIxLCAweDE5MDQsIDB4MjcyNSwgMHgwMDA1LCAweDJhNjAsIDB4NjEwZSwgMHg2OWJlLAorCTB4MmMwMCwgMHg2OGM2LCAweDg4NDAsIDB4NjAwOCwgMHhjMGQ1LCAweDYwMGEsIDB4NzdhMCwgMHhhNzg2LAorCTB4MDAwMSwgMHgxOTA0LCAweDI3YWQsIDB4NzBkMCwgMHhkMGI0LCAweDE5MDQsIDB4MjdhZCwgMHg3MDAwLAorCTB4YTA4MiwgMHgwMDAyLCAweDFhMDQsIDB4MjdhZCwgMHg3ODMwLCAweGQwYmMsIDB4MTkwNCwgMHgyN2FkLAorCTB4Nzg5YiwgMHgwMDgwLCAweDdiYWEsIDB4N2RhYSwgMHg3OWFhLCAweDIwMDEsIDB4MDAwMiwgMHgwMDA2LAorCTB4NjAxOCwgMHg4MDAwLCAweDYwMWEsIDB4MDAwOCwgMHgwMDA2LCAweDI5NjAsIDB4NjEwNCwgMHgyYTYwLAorCTB4MDgwYywgMHgzY2UxLCAweDE1OTAsIDB4YTE4NCwgMHgwMDE4LCAweDAxODAsIDB4YTE4NCwgMHgwMDEwLAorCTB4MDExOCwgMHgwODBjLCAweDM5NzcsIDB4MTU0OCwgMHhhMTg0LCAweDAwMDgsIDB4MDEzOCwgMHg2OWEwLAorCTB4YTE4NCwgMHgwNjAwLCAweDExMTgsIDB4MDgwYywgMHgzODk1LCAweDAwZjgsIDB4NjlhMCwgMHhhMTg0LAorCTB4MWUwMCwgMHgwNTI4LCAweGExODQsIDB4MDgwMCwgMHgwMTc4LCAweDAwYzYsIDB4Mjk2MCwgMHg2MDAwLAorCTB4YTA4NSwgMHgyMDAwLCAweDYwMDIsIDB4NjEwNCwgMHhhMThkLCAweDAwMTAsIDB4NjEwNiwgMHgwMGNlLAorCTB4MDgwYywgMHgzOTc3LCAweDExNTAsIDB4NjlhMCwgMHhhMTg0LCAweDAyMDAsIDB4MDExOCwgMHgwODBjLAorCTB4MzhkYSwgMHgwMDE4LCAweGExODQsIDB4MDQwMCwgMHgxOWYwLCAweDY5YTAsIDB4YTE4NCwgMHgxMDAwLAorCTB4MDEzMCwgMHg2OTE0LCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDA4MGMsIDB4MjM5YywgMHgwMDJlLAorCTB4YTY4YywgMHgwMGUwLCAweGE2ODQsIDB4MDA2MCwgMHgwMTI4LCAweGEwODYsIDB4MDA2MCwgMHgxMTEwLAorCTB4YTE4ZCwgMHg0MDAwLCAweGExOGQsIDB4MDEwNCwgMHg2OWI2LCAweDc4OWIsIDB4MDA2MCwgMHgyODAwLAorCTB4NzhhYSwgMHg2ODE4LCAweGMwZmQsIDB4NjgxYSwgMHhkNmJjLCAweDAxNjgsIDB4YzBmYywgMHg3MDgzLAorCTB4MDAwMCwgMHhhMDhhLCAweDAwMGQsIDB4MDMyOCwgMHhhMDhhLCAweDAwMGMsIDB4NzE4MiwgMHgyMDAxLAorCTB4MDAwYywgMHg4MDBjLCAweDcxODYsIDB4NzhhYSwgMHgzNTE4LCAweDMzNDAsIDB4MzQyOCwgMHg4MDAwLAorCTB4ODBhYywgMHhhZjgwLCAweDAwMmIsIDB4MjBhMCwgMHg3ODliLCAweDAwMDAsIDB4YWQ4MCwgMHgwMDBiLAorCTB4MjA5OCwgMHg1M2E2LCAweDIzYTgsIDB4Mjg5OCwgMHgyNWEwLCAweGEyODYsIDB4MDAyMCwgMHgxNTA4LAorCTB4NzBkMCwgMHhjMGI1LCAweDcwZDIsIDB4MmMwMCwgMHg3MGI2LCAweDJkMDAsIDB4NzBiYSwgMHg2ODE0LAorCTB4YzBmYywgMHg4MDA3LCAweDc4ODIsIDB4YTI4NiwgMHgwMDAyLCAweDA5MDQsIDB4MjhmNSwgMHg3MGEwLAorCTB4ODAwMCwgMHg3MGEyLCAweDc0YjAsIDB4YTQ5OCwgMHgwMDA1LCAweDcwYTgsIDB4YTMwNiwgMHgxMTA4LAorCTB4NzNhNCwgMHg3M2IyLCAweGEyODYsIDB4MDAxMCwgMHgwOTA0LCAweDI1OWQsIDB4MDBkZSwgMHgwMGNlLAorCTB4MDAwNSwgMHg3MDAwLCAweGEwMDUsIDB4MTllMCwgMHhhMjg2LCAweDAwMDIsIDB4MTkwNCwgMHgyOTBjLAorCTB4MDgwYywgMHgzYzMzLCAweDE5YTgsIDB4NjgxNCwgMHhjMGZjLCAweDgwMDcsIDB4Nzg4MiwgMHgyMDkxLAorCTB4ODAwMCwgMHg3ODFiLCAweDAwNjgsIDB4NjhiNCwgMHg3ODVhLCAweDY4OTQsIDB4NzhkNiwgMHg3OGRlLAorCTB4Njg5OCwgMHg3OGQyLCAweDc4ZGEsIDB4MjA5MSwgMHg4MDAxLCAweDc4MDgsIDB4YzA4ZCwgMHg3ODBhLAorCTB4MDEyNiwgMHgwMGQ2LCAweDAwYzYsIDB4NzBkMCwgMHhhMDg0LCAweDJlMDAsIDB4MjA5MCwgMHgwMGNlLAorCTB4MDBkZSwgMHgwMTJlLCAweDI5MDAsIDB4NzA1NiwgMHg2OGJjLCAweDcwM2UsIDB4NzAwMywgMHgwMDAyLAorCTB4MmQwMCwgMHg3MDRhLCAweGFkODAsIDB4MDAwOSwgMHg3MDQyLCAweDc4MzAsIDB4ZDBiYywgMHgwMTQwLAorCTB4MjA5MSwgMHgzMDNkLCAweDcwZDAsIDB4YTA4NCwgMHgzMDNkLCAweDIwOTEsIDB4ODAwMCwgMHgyMDkwLAorCTB4NzBhMCwgMHhhMDA1LCAweDExMDgsIDB4MDAwNSwgMHg4NDIxLCAweDBkZTgsIDB4NzI0YywgMHg3MGJjLAorCTB4YTIwMCwgMHhhMDE1LCAweDA4MDQsIDB4MjcyNSwgMHhhMjg2LCAweDAwMTAsIDB4MTU2MCwgMHgwODBjLAorCTB4M2MzMywgMHgxOTA0LCAweDI4YTAsIDB4NjgxNCwgMHhjMGZjLCAweDgwMDcsIDB4Nzg4MiwgMHg3ODFiLAorCTB4MDA2OCwgMHg2OGI0LCAweDc4NWEsIDB4Njg5NCwgMHg3OGQ2LCAweDc4ZGUsIDB4Njg5OCwgMHg3OGQyLAorCTB4NzhkYSwgMHg3ODA4LCAweGMwOGQsIDB4NzgwYSwgMHg3MGEwLCAweDgwMDAsIDB4NzBhMiwgMHg3NGIwLAorCTB4YTQ5MCwgMHgwMDA1LCAweDcwYTgsIDB4YTIwNiwgMHgxMTA4LCAweDcyYTQsIDB4NzJiMiwgMHgyOTAwLAorCTB4NzA1NiwgMHg2OGJjLCAweDcwM2UsIDB4NzAwMywgMHgwMDAyLCAweDJkMDAsIDB4NzA0YSwgMHhhZDgwLAorCTB4MDAwOSwgMHg3MDQyLCAweDAwMDUsIDB4NmJiNCwgMHhhMzlkLCAweDIwMDAsIDB4N2I1YSwgMHg2ODE0LAorCTB4YzBmYywgMHg4MDA3LCAweDc4ODIsIDB4NmI5NCwgMHg3YmQ2LCAweDdiZGUsIDB4NmU5OCwgMHg3ZWQyLAorCTB4N2VkYSwgMHg3ODFiLCAweDAwNjgsIDB4MjkwMCwgMHg3MDU2LCAweDcyMDIsIDB4NzgwOCwgMHhjMDhkLAorCTB4NzgwYSwgMHgyMzAwLCAweGE2MDUsIDB4MDE3MCwgMHg3MGQwLCAweGEwODQsIDB4MmUwMCwgMHhhMDg2LAorCTB4MjYwMCwgMHgxMTE4LCAweDIwMDksIDB4MDAwMCwgMHgwMDEwLCAweDIwMDksIDB4MDAwMSwgMHhhMjg0LAorCTB4MDAwZiwgMHgwMDIzLCAweGFkODAsIDB4MDAwOSwgMHg3MDQyLCAweDAwMDUsIDB4Mjk2ZSwgMHg0MWQ5LAorCTB4NDFkOSwgMHg0MWM3LCAweDQxZDksIDB4Mjk2ZSwgMHgyOTZlLCAweDI5NmUsIDB4MDgwYywgMHgyNTRjLAorCTB4NzgwOCwgMHhhMDg0LCAweGZmZmQsIDB4NzgwYSwgMHgwMGY2LCAweDIwNzksIDB4NDYwMCwgMHg3OGFjLAorCTB4MDBmZSwgMHhkMDg0LCAweDAxYjAsIDB4NzA2MCwgMHhhMDg2LCAweDAwMDEsIDB4MDkwNCwgMHgyYTMyLAorCTB4NzA2MCwgMHhhMDg2LCAweDAwMDUsIDB4MTE1OCwgMHg3MDc4LCAweDIwNjgsIDB4NjgxYiwgMHgwMDA0LAorCTB4NjgxNywgMHgwMDAwLCAweDY4MjAsIDB4YTA4NCwgMHgwMGZmLCAweGMwOWQsIDB4NjgyMiwgMHg3MDYzLAorCTB4MDAwMCwgMHg3MGEzLCAweDAwMDAsIDB4NzBhNCwgMHg3MGFlLCAweDcwYjIsIDB4MDgwYywgMHgyNjgyLAorCTB4MDE1NiwgMHgyMDExLCAweDAwMDQsIDB4NzE2MCwgMHhhMTg2LCAweDAwMDEsIDB4MDE2MCwgMHhhMTg2LAorCTB4MDAwNywgMHgxMTE4LCAweDcwMWYsIDB4MDAwNSwgMHgwMDMwLCAweDcwMWYsIDB4MDAwMSwgMHg3MGQwLAorCTB4YzBjNSwgMHg3MGQyLCAweDAwMDAsIDB4MjAwMSwgMHg0NjBhLCAweDIwMDQsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4NiwgMHgwMDE4LCAweDAxMzAsIDB4NzAxOCwgMHg3MDE2LCAweGEwMDUsIDB4MTExMCwgMHg3MGEzLAorCTB4MDAwMSwgMHgwMDY2LCAweDA4MGMsIDB4M2YyNiwgMHgyMGE5LCAweDAwMTAsIDB4MjAzOSwgMHgwMDAwLAorCTB4MDgwYywgMHgzYTY2LCAweGE3YjgsIDB4MDEwMCwgMHgxZjA0LCAweDI5YzAsIDB4MDA2ZSwgMHg3MDAwLAorCTB4MDAwMiwgMHgyOWZkLCAweDI5ZGIsIDB4MjlkYiwgMHgyOWQzLCAweDI5ZmQsIDB4MjlmZCwgMHgyOWZkLAorCTB4MjlkMSwgMHgwODBjLCAweDI1NGMsIDB4NzA1YywgMHhhMDA1LCAweDA1MzgsIDB4YWQwNiwgMHgxMTE4LAorCTB4NjgwMCwgMHg3MDVlLCAweDAwODAsIDB4NjgyMCwgMHhkMDg0LCAweDExNDgsIDB4NmYxNCwgMHgwODBjLAorCTB4M2I2ZiwgMHg2MDA4LCAweGMwZDQsIDB4NjAwYSwgMHgwODBjLCAweDM3YTQsIDB4MDAyMCwgMHg3MDU4LAorCTB4MjA2MCwgMHg2ODAwLCAweDYwMDIsIDB4YTY4NCwgMHg1ZjAwLCAweDY4MWUsIDB4NjgxOCwgMHhkMGZjLAorCTB4MDEwOCwgMHg2YTFhLCAweDY4MTcsIDB4MDAwMCwgMHg2ODJiLCAweDAwMDAsIDB4NjgyMCwgMHhhMDg0LAorCTB4MDBmZiwgMHhjMDlkLCAweDY4MjIsIDB4MDgwYywgMHgxZGEyLCAweDIwMTEsIDB4MDAwNCwgMHg3NGM4LAorCTB4YTRhMCwgMHgwMTAwLCAweDA0YjEsIDB4YWVhMCwgMHgwMDE3LCAweDA0OTksIDB4MjBhOSwgMHgwMTAxLAorCTB4NzRjOCwgMHgwNDc5LCAweDg0MjAsIDB4MWYwNCwgMHgyYTA5LCAweDcwYzAsIDB4MjA2MCwgMHgyMDIxLAorCTB4MDAwMiwgMHgyMGE5LCAweDAxMDAsIDB4NjExMCwgMHg4MWZmLCAweDAxOTgsIDB4NjAxOCwgMHgwMDE2LAorCTB4MDAwNiwgMHgyMDExLCAweDQ2MDIsIDB4MjIwYywgMHhhMTAyLCAweDIwMTIsIDB4MDAwZSwgMHgwMDFlLAorCTB4YTEwMiwgMHgwMzM4LCAweDYwMTIsIDB4MTEyOCwgMHgyMDExLCAweDQ2MDQsIDB4MjIwNCwgMHhjMGE1LAorCTB4MjAxMiwgMHg2MDFiLCAweDAwMDAsIDB4YWNlMCwgMHgwMDEwLCAweDFmMDQsIDB4MmExMywgMHg4NDIxLAorCTB4MWQwMCwgMHgwMTVlLCAweDcwNjMsIDB4MDAwMCwgMHg3MDAzLCAweDAwMDAsIDB4NzA0YiwgMHgwMDAwLAorCTB4MDAwNSwgMHgwMDQ2LCAweDI0MDQsIDB4YTAwNSwgMHgwMWE4LCAweDIwNjgsIDB4NjgwMCwgMHgwMDA2LAorCTB4NmExYSwgMHg2ODE3LCAweDAwMDAsIDB4NjgyYiwgMHgwMDAwLCAweDY4YjQsIDB4YTA4NCwgMHg1ZjAwLAorCTB4NjgxZSwgMHg2ODIwLCAweGEwODQsIDB4MDBmZiwgMHhjMDlkLCAweDY4MjIsIDB4MDgwYywgMHgxZGEyLAorCTB4MDAwZSwgMHgwYzQ4LCAweDAwNGUsIDB4MjAyMywgMHgwMDAwLCAweDAwMDUsIDB4YTI4MiwgMHgwMDAzLAorCTB4MDMxMCwgMHgwODBjLCAweDI1NGMsIDB4MjMwMCwgMHgwMDAyLCAweDJhNjAsIDB4MmFkZCwgMHgyYWY3LAorCTB4YTI4MiwgMHgwMDAyLCAweDAxMTAsIDB4MDgwYywgMHgyNTRjLCAweDcwNjAsIDB4NzA2MywgMHgwMDAwLAorCTB4NzA3ZiwgMHgwMDAwLCAweDAwMjIsIDB4NzdkMCwgMHhjN2M1LCAweDc3ZDIsIDB4MDAwMiwgMHgyYTc3LAorCTB4MmE3NywgMHgyYTc5LCAweDJhYjEsIDB4MzdkOCwgMHgyYTc3LCAweDJhYjEsIDB4MmE3NywgMHgwODBjLAorCTB4MjU0YywgMHg3NzcwLCAweDA4MGMsIDB4M2E2NiwgMHg3NzcwLCAweGE3YmMsIDB4OGYwMCwgMHgwODBjLAorCTB4M2I2ZiwgMHg2MDE4LCAweGEwMDUsIDB4MDUyOCwgMHhkN2ZjLCAweDExMTgsIDB4MjAyMSwgMHg4Y2MwLAorCTB4MDAxMCwgMHgyMDIxLCAweDhkZDAsIDB4MjAwOSwgMHgwMDA1LCAweDIwMTEsIDB4MDAxMCwgMHgwODBjLAorCTB4MmIxMSwgMHgwMWI4LCAweDAxNTYsIDB4MjBhOSwgMHgwMTAxLCAweGQ3ZmMsIDB4MTExOCwgMHgyMDIxLAorCTB4OGJjMCwgMHgwMDEwLCAweDIwMjEsIDB4OGNkMCwgMHgwMDQ2LCAweDIwMDksIDB4MDAwNSwgMHgyMDExLAorCTB4MDAxMCwgMHgwODBjLCAweDJiMTEsIDB4MDA0ZSwgMHgwMTE4LCAweDg0MjAsIDB4MWYwNCwgMHgyYTljLAorCTB4MDE1ZSwgMHg4NzM4LCAweGE3ODQsIDB4MDAxZiwgMHgxOTkwLCAweDA4MDQsIDB4MjVhMCwgMHgwODA0LAorCTB4MjVhMCwgMHg3NzcwLCAweDA4MGMsIDB4M2I2ZiwgMHg2MDE4LCAweGEwMDUsIDB4MDUyMCwgMHhkN2ZjLAorCTB4MTExOCwgMHgyMDIxLCAweDhjYzAsIDB4MDAxMCwgMHgyMDIxLCAweDhkZDAsIDB4MjAwOSwgMHgwMDA1LAorCTB4MjAxMSwgMHgwMDIwLCAweDA4MGMsIDB4MmIxMSwgMHgwMWIwLCAweDAxNTYsIDB4MjBhOSwgMHgwMTAxLAorCTB4ZDdmYywgMHgxMTE4LCAweDIwMjEsIDB4OGJjMCwgMHgwMDEwLCAweDIwMjEsIDB4OGNkMCwgMHgwMDQ2LAorCTB4MjAwOSwgMHgwMDA1LCAweDIwMTEsIDB4MDAyMCwgMHgwNGUxLCAweDAwNGUsIDB4MDExOCwgMHg4NDIwLAorCTB4MWYwNCwgMHgyYWNmLCAweDAxNWUsIDB4MDgwNCwgMHgyNWEwLCAweDIyMDAsIDB4MDAwMiwgMHgyYWUyLAorCTB4MmFlNCwgMHgyYWU0LCAweDA4MGMsIDB4MjU0YywgMHgyMDA5LCAweDAwMTIsIDB4NzA2MCwgMHhhMDg2LAorCTB4MDAwMiwgMHgwMTEwLCAweDIwMDksIDB4MDAwZSwgMHg2ODE4LCAweGQwZmMsIDB4MDEwOCwgMHg2OTFhLAorCTB4NzA2MywgMHgwMDAwLCAweDcwZDAsIDB4YzBjNSwgMHg3MGQyLCAweDA4MDQsIDB4M2JlNSwgMHgyMjAwLAorCTB4MDAwMiwgMHgyYWZlLCAweDJhZTQsIDB4MmFmYywgMHgwODBjLCAweDI1NGMsIDB4MDgwYywgMHgzZjI2LAorCTB4NzAwMCwgMHhhMDg2LCAweDAwMDIsIDB4MTkwNCwgMHgzNzVkLCAweDA4MGMsIDB4MzdiZSwgMHg2MDA4LAorCTB4YTA4NCwgMHhmYmVmLCAweDYwMGEsIDB4MDgwYywgMHgzNzRmLCAweDA5MDQsIDB4Mzc1ZCwgMHgwODA0LAorCTB4MjVhMCwgMHgyNDA0LCAweGEwMDUsIDB4MDU5MCwgMHgyMDY4LCAweDJkMDQsIDB4MDAwNiwgMHg2ODE0LAorCTB4YTcwNiwgMHgwMTE4LCAweDJkMjAsIDB4MDAwZSwgMHgwY2E4LCAweDAwMGUsIDB4MjAyMiwgMHg2OTFhLAorCTB4NjgxNywgMHgwMDAwLCAweDY4MmIsIDB4MDAwMCwgMHg2OGI0LCAweGEwODQsIDB4NWYwMCwgMHg2ODFlLAorCTB4NjgyMCwgMHhhMDg0LCAweDAwZmYsIDB4YTIwNSwgMHg2ODIyLCAweDA4MGMsIDB4MWRhMiwgMHgyMDIxLAorCTB4NDYwMiwgMHgyNDFjLCAweDgzMTksIDB4MjMyMiwgMHg2MDEwLCAweDgwMDEsIDB4NjAxMiwgMHgxMTI4LAorCTB4MjAyMSwgMHg0NjA0LCAweDI0MDQsIDB4YzBhNSwgMHgyMDIyLCAweDYwMDgsIDB4YTA4NCwgMHhmOWVmLAorCTB4NjAwYSwgMHgwODBjLCAweDI2OWUsIDB4MDgwYywgMHgzN2JlLCAweDAwMDUsIDB4YTA4NSwgMHgwMDAxLAorCTB4MGNlMCwgMHgyMzAwLCAweDAwMDIsIDB4MmI1MCwgMHgyYjRlLCAweDJiY2IsIDB4MDgwYywgMHgyNTRjLAorCTB4NzhlNCwgMHhhMDA1LCAweDE3YjAsIDB4MzIwOCwgMHhhMThjLCAweDA4MDAsIDB4MDExOCwgMHgwMTA0LAorCTB4MjU5ZCwgMHgwMDEwLCAweDAzMDQsIDB4MjU5ZCwgMHgyMDA4LCAweGEwODQsIDB4MDAzMCwgMHgxMTEwLAorCTB4MDgwNCwgMHgzMjJhLCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDBkZDAsIDB4Nzg4NCwgMHhkMGZjLAorCTB4MTExOCwgMHhhMTg0LCAweDAwMDcsIDB4MDA5MCwgMHhhMTg0LCAweDAwMDcsIDB4YTA4NiwgMHgwMDA0LAorCTB4MTExOCwgMHgyMDAxLCAweDAwMDAsIDB4MDA1MCwgMHhhMTg0LCAweDAwMDcsIDB4YTA4NiwgMHgwMDA1LAorCTB4MDExOCwgMHhhMTg0LCAweDAwMDcsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDEsIDB4MDAwMiwgMHgyYmFlLAorCTB4MmJiNywgMHgyYmE0LCAweDJiODcsIDB4M2MyOSwgMHgzYzI5LCAweDJiODcsIDB4MmJjMSwgMHgwODBjLAorCTB4MjU0YywgMHg3MDAwLCAweGEwODYsIDB4MDAwNCwgMHgxMTkwLCAweDcwNjAsIDB4YTA4NiwgMHgwMDAyLAorCTB4MTEzMCwgMHgyMDExLCAweDAwMDIsIDB4MjAxOSwgMHgwMDAwLCAweDA4MDQsIDB4MmE1NiwgMHg3MDYwLAorCTB4YTA4NiwgMHgwMDA2LCAweDBkYjAsIDB4NzA2MCwgMHhhMDg2LCAweDAwMDQsIDB4MGQ5MCwgMHg3OWU0LAorCTB4MjAwMSwgMHgwMDAzLCAweDA4MDQsIDB4MmYxOCwgMHg2ODE4LCAweGQwZmMsIDB4MDExMCwgMHg2ODFiLAorCTB4MDAxZCwgMHgwODBjLCAweDNhM2MsIDB4NzgxYiwgMHgwMDZlLCAweDAwMDUsIDB4NjgxOCwgMHhkMGZjLAorCTB4MDExMCwgMHg2ODFiLCAweDAwMWQsIDB4MDgwYywgMHgzYTNjLCAweDA4MDQsIDB4M2MwNywgMHg2ODE4LAorCTB4ZDBmYywgMHgwMTEwLCAweDY4MWIsIDB4MDAxZCwgMHgwODBjLCAweDNhM2MsIDB4NzgxYiwgMHgwMGZhLAorCTB4MDAwNSwgMHg2ODE4LCAweGQwZmMsIDB4MDExMCwgMHg2ODFiLCAweDAwMWQsIDB4MDgwYywgMHgzYTNjLAorCTB4NzgxYiwgMHgwMGNiLCAweDAwMDUsIDB4YTU4NCwgMHgwMDBmLCAweDExYzAsIDB4NzAwMCwgMHgwMDAyLAorCTB4MjVhMCwgMHgyYmQ4LCAweDJiZGEsIDB4Mzc1ZCwgMHgzNzVkLCAweDM3NWQsIDB4MmJkOCwgMHgyYmQ4LAorCTB4MDgwYywgMHgyNTRjLCAweDA4MGMsIDB4MzdiZSwgMHg2MDA4LCAweGEwODQsIDB4ZmJlZiwgMHg2MDBhLAorCTB4MDgwYywgMHgzNzRmLCAweDA5MDQsIDB4Mzc1ZCwgMHgwODA0LCAweDI1YTAsIDB4NzhlNCwgMHhhMDA1LAorCTB4MWIwNCwgMHgyYjg5LCAweDMyMDgsIDB4YTE4YywgMHgwODAwLCAweDAxMTgsIDB4MDEwNCwgMHgyYjg5LAorCTB4MDAxMCwgMHgwMzA0LCAweDJiODksIDB4MjAwOCwgMHhhMDg0LCAweDAwMzAsIDB4MTExOCwgMHg3ODFiLAorCTB4MDA2OCwgMHgwMDA1LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDBkYzgsIDB4Nzg4NCwgMHhkMGZjLAorCTB4MTExOCwgMHhhMTg0LCAweDAwMDcsIDB4MDA5MCwgMHhhMTg0LCAweDAwMDcsIDB4YTA4NiwgMHgwMDA0LAorCTB4MTExOCwgMHgyMDAxLCAweDAwMDAsIDB4MDA1MCwgMHhhMTg0LCAweDAwMDcsIDB4YTA4NiwgMHgwMDA1LAorCTB4MDExOCwgMHhhMTg0LCAweDAwMDcsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDEsIDB4MDAwMiwgMHgyYzI2LAorCTB4MmMyYSwgMHgyYzIxLCAweDJjMWYsIDB4M2MyOSwgMHgzYzI5LCAweDJjMWYsIDB4M2MyMywgMHgwODBjLAorCTB4MjU0YywgMHgwODBjLCAweDNhNDIsIDB4NzgxYiwgMHgwMDZlLCAweDAwMDUsIDB4MDgwYywgMHgzYTQyLAorCTB4MDgwNCwgMHgzYzA3LCAweDA4MGMsIDB4M2E0MiwgMHg3ODFiLCAweDAwZmEsIDB4MDAwNSwgMHgwODBjLAorCTB4M2E0MiwgMHg3ODFiLCAweDAwY2IsIDB4MDAwNSwgMHgyMzAwLCAweDAwMDIsIDB4MmMzYiwgMHgyYzM5LAorCTB4MmMzZCwgMHgwODBjLCAweDI1NGMsIDB4MDgwNCwgMHgzM2UyLCAweDY4MWIsIDB4MDAxNiwgMHg3OGEzLAorCTB4MDAwMCwgMHg3OWU0LCAweGExODQsIDB4MDAzMCwgMHgwOTA0LCAweDMzZTIsIDB4NzhlYywgMHhhMDg0LAorCTB4MDAwMywgMHgwOTA0LCAweDMzZTIsIDB4YTE4NCwgMHgwMTAwLCAweDBkOTgsIDB4Nzg4NCwgMHhkMGZjLAorCTB4MTExOCwgMHhhMTg0LCAweDAwMDcsIDB4MDA5MCwgMHhhMTg0LCAweDAwMDcsIDB4YTA4NiwgMHgwMDA0LAorCTB4MTExOCwgMHgyMDAxLCAweDAwMDAsIDB4MDA1MCwgMHhhMTg0LCAweDAwMDcsIDB4YTA4NiwgMHgwMDA1LAorCTB4MDExOCwgMHhhMTg0LCAweDAwMDcsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDEsIDB4MDAwMiwgMHgyYzZmLAorCTB4MmMyYSwgMHgyYmE0LCAweDNiZTUsIDB4M2MyOSwgMHgzYzI5LCAweDNiZTUsIDB4M2MyMywgMHgwODBjLAorCTB4M2JmMSwgMHgwMDA1LCAweGEyODIsIDB4MDAwNSwgMHgwMzEwLCAweDA4MGMsIDB4MjU0YywgMHg3ODk4LAorCTB4MjA0MCwgMHgyMzAwLCAweDAwMDIsIDB4MmM3ZSwgMHgyZWE4LCAweDJlYjIsIDB4MjIwMCwgMHgwMDAyLAorCTB4MmM5YSwgMHgyYzg3LCAweDJjOWEsIDB4MmM4NSwgMHgyZThhLCAweDA4MGMsIDB4MjU0YywgMHg3ODliLAorCTB4MDAxOCwgMHg3OGE4LCAweDIwMTAsIDB4YTA4NCwgMHgwMGZmLCAweGEwODIsIDB4MDAyMCwgMHgwYTA0LAorCTB4M2EwYiwgMHhhMDhhLCAweDAwMDQsIDB4MWEwNCwgMHgzYTBiLCAweDAwMDIsIDB4M2EwYiwgMHgzYTBiLAorCTB4M2EwYiwgMHgzOWMxLCAweDc4OWIsIDB4MDAxOCwgMHg3OWE4LCAweGExODQsIDB4MDA4MCwgMHgwMTQ4LAorCTB4MDgwNCwgMHgzYTBiLCAweDcwMDAsIDB4YTAwNSwgMHgxZGQ4LCAweDIwMTEsIDB4MDAwNCwgMHgwODA0LAorCTB4MzU5NCwgMHhhMTg0LCAweDAwZmYsIDB4YTA4YSwgMHgwMDEwLCAweDFhMDQsIDB4M2EwYiwgMHgwMDAyLAorCTB4MmNjMiwgMHgyY2MwLCAweDJjZDQsIDB4MmNkOCwgMHgyZDg2LCAweDNhMGIsIDB4M2EwYiwgMHgyZDg4LAorCTB4M2EwYiwgMHgzYTBiLCAweDJlODYsIDB4MmU4NiwgMHgzYTBiLCAweDNhMGIsIDB4M2EwYiwgMHgyZTg4LAorCTB4MDgwYywgMHgyNTRjLCAweGQ2ZTQsIDB4MDE0MCwgMHgyMDAxLCAweDAzMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4NzgzYSwgMHg3ODFiLCAweDAwYzcsIDB4MDAwNSwgMHg2ODE4LCAweGQwZmMsIDB4MDExOCwgMHg2ODFiLAorCTB4MDAxZCwgMHgwYzkwLCAweDA4MDQsIDB4M2JlNSwgMHg2ODFiLCAweDAwMWQsIDB4MDgwNCwgMHgzYTM2LAorCTB4NjkyMCwgMHg2OTIyLCAweGE2ODQsIDB4MTgwMCwgMHgxOTA0LCAweDJkMjksIDB4NjgyMCwgMHhkMDg0LAorCTB4MTkwNCwgMHgyZDMxLCAweDY4MTgsIDB4YTA4NiwgMHgwMDA4LCAweDExMTAsIDB4NjgxYiwgMHgwMDAwLAorCTB4ZDZkNCwgMHgwNTY4LCAweGQ2YmMsIDB4MDU1OCwgMHg3MDgzLCAweDAwMDAsIDB4NjgxOCwgMHhhMDg0LAorCTB4MDAzZiwgMHhhMDhhLCAweDAwMGQsIDB4MDcxOCwgMHhhMDhhLCAweDAwMGMsIDB4NzE4MiwgMHgyMDAxLAorCTB4MDAwYywgMHg4MDBjLCAweDcxODYsIDB4Nzg5YiwgMHgwMDYxLCAweDc4YWEsIDB4MDE1NiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMDE2LCAweDMyMDgsIDB4YTE4YywgMHgwNjAwLCAweDAxMTgsIDB4MjBhMSwgMHgwMjJiLAorCTB4MDAxMCwgMHgyMGExLCAweDAxMmIsIDB4MDAxZSwgMHg3ODliLCAweDAwMDAsIDB4ODAwMCwgMHg4MGFjLAorCTB4YWQ4MCwgMHgwMDBiLCAweDIwOTgsIDB4NTNhNiwgMHgwMTRlLCAweDAxM2UsIDB4MDE1ZSwgMHg2MDM4LAorCTB4YTAwNSwgMHgxMTUwLCAweDY4MWMsIDB4YTA4NCwgMHgwMDBlLCAweDA5MDQsIDB4M2EzNiwgMHgwODBjLAorCTB4M2E0OCwgMHg3ODJiLCAweDMwMDgsIDB4MDAxMCwgMHg4MDAxLCAweDYwM2EsIDB4NzgxYiwgMHgwMDcxLAorCTB4MDAwNSwgMHhkNmU0LCAweDAxMzAsIDB4NzgxYiwgMHgwMDgzLCAweDAwMDUsIDB4NzgxYiwgMHgwMDgzLAorCTB4MDAwNSwgMHhhNjg0LCAweDAwNjAsIDB4MGRkMCwgMHhkNmRjLCAweDBkYzAsIDB4ZDZmYywgMHgwMWEwLAorCTB4YzZmYywgMHg3ZTVhLCAweDZlYjYsIDB4N2FkYywgMHg3OWQ4LCAweDc4ZDAsIDB4ODAwNywgMHhhMDg0LAorCTB4MDA3ZiwgMHhhMTA4LCAweGEyOTEsIDB4MDAwMCwgMHg2Yjk4LCAweDIxMDAsIDB4YTMwMiwgMHg2OGIyLAorCTB4NmI5NCwgMHgyMjAwLCAweGEzMDMsIDB4NjhhZSwgMHhkNmY0LCAweDAxMTgsIDB4YzZmNCwgMHg3ZTVhLAorCTB4NmViNiwgMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgxMTQ4LCAweDAwMDYsIDB4MDgwYywgMHgzZjI2LAorCTB4MDgwYywgMHg0MWQ5LCAweDAwMGUsIDB4NzgxYiwgMHgwMDgwLCAweDAwMDUsIDB4YTAwNiwgMHgwODBjLAorCTB4NDJiNSwgMHg2YWIwLCAweDY5YWMsIDB4NmM5OCwgMHg2Yjk0LCAweDIyMDAsIDB4YTEwNSwgMHgwMTIwLAorCTB4MjIwMCwgMHhhNDIyLCAweDIxMDAsIDB4YTMxYiwgMHg2Y2FhLCAweDdjZDIsIDB4N2NkYSwgMHg2YmE2LAorCTB4N2JkNiwgMHg3YmRlLCAweDIzMDAsIDB4YTQwNSwgMHgxMTMwLCAweGM2ZjUsIDB4N2U1YSwgMHg2ZWI2LAorCTB4NzgxYiwgMHgwMDgwLCAweDAwMDUsIDB4NzgxYiwgMHgwMDgwLCAweDIyMDAsIDB4YTExNSwgMHgxMTE4LAorCTB4MDgwYywgMHg0MWQ5LCAweDAwMDUsIDB4MDgwYywgMHg0MjA2LCAweDAwMDUsIDB4MDgwYywgMHgyNTRjLAorCTB4MDgwNCwgMHgyZTFjLCAweDAwYzYsIDB4NzA1NCwgMHgyMDYwLCAweDY5MjAsIDB4YTE4YywgMHhlY2ZmLAorCTB4NjkyMiwgMHg2MDAwLCAweGEwODQsIDB4Y2ZkZiwgMHg2MDAyLCAweDA4MGMsIDB4MzhmNCwgMHhhMDA2LAorCTB4MjA0MCwgMHgyMDM4LCAweDA4MGMsIDB4Mzk5YywgMHgwODA0LCAweDJlMTAsIDB4MDBjNiwgMHg3MDU0LAorCTB4MjA2MCwgMHgyYzQ4LCAweDdhYTgsIDB4YTI5NCwgMHgwMGZmLCAweGEyODYsIDB4MDAwNCwgMHgxMWQ4LAorCTB4NjkyMCwgMHhkMWU0LCAweDExNzAsIDB4MjAzOSwgMHgwMDAwLCAweDIwNDEsIDB4MDAwMCwgMHgyMDMxLAorCTB4MDAwMCwgMHhhMDA2LCAweDIwMTAsIDB4MDgwYywgMHgzOGY3LCAweDA4MGMsIDB4Mzk5YywgMHgwODA0LAorCTB4MmUxMCwgMHhhMThjLCAweGVjZmYsIDB4NjkyMiwgMHg2MTA0LCAweGExOGMsIDB4ZmZkZCwgMHg2MTA2LAorCTB4NjAwMCwgMHhjMGFjLCAweDYwMDIsIDB4YTI4NiwgMHgwMDAzLCAweDAxZDAsIDB4NjEwNCwgMHhhMTg0LAorCTB4MDAxMCwgMHgwNTQ4LCAweDA4MGMsIDB4M2I2YiwgMHgwODBjLCAweDM5NzcsIDB4ODhmZiwgMHgwNTE4LAorCTB4MDBjZSwgMHg3ODliLCAweDAwNjAsIDB4MjgwMCwgMHg3OGFhLCAweDdlNTgsIDB4YzY5NSwgMHg3ZTVhLAorCTB4ZDZkNCwgMHgxMTE4LCAweDc4MWIsIDB4MDA2ZSwgMHgwMDA1LCAweDc4MWIsIDB4MDA4MiwgMHgwMDA1LAorCTB4NjkyMCwgMHhkMWNjLCAweDAxMzAsIDB4YTE4YywgMHhmZGZmLCAweDY5MjIsIDB4NjAwMCwgMHhjMGVjLAorCTB4NjAwMiwgMHgyMDM5LCAweDAwMDAsIDB4MjA0MSwgMHgwMDAwLCAweDIwMzEsIDB4MDAwMCwgMHhhMDA2LAorCTB4MjAxMCwgMHgwODBjLCAweDM5OWMsIDB4YTI4NiwgMHgwMDAxLCAweDAxNTgsIDB4NjEwNCwgMHhhMTg0LAorCTB4MDAwOCwgMHgwMWIwLCAweDA4MGMsIDB4M2I2YiwgMHgwODBjLCAweDM4OTUsIDB4ODhmZiwgMHgxOTgwLAorCTB4MDA3OCwgMHg2OTIwLCAweGQxYzQsIDB4MDEzMCwgMHhhMThjLCAweGZlZmYsIDB4NjkyMiwgMHg2MDAwLAorCTB4YzBlNCwgMHg2MDAyLCAweDIwMzEsIDB4MDAwMCwgMHhhMDA2LCAweDIwMTAsIDB4MDgwYywgMHgzOGY3LAorCTB4MDBjZSwgMHg3ZTU4LCAweGQ2ZDQsIDB4MTExOCwgMHg3ODFiLCAweDAwNzEsIDB4MDAwNSwgMHg3ODFiLAorCTB4MDA4MywgMHgwMDA1LCAweDA4MDQsIDB4M2EzMiwgMHgyODA4LCAweDc4OWIsIDB4MDA4MCwgMHgyMDE5LAorCTB4MDA4MCwgMHg3OGE4LCAweGEwOTQsIDB4MDBmZiwgMHhhMjg2LCAweDAwMDEsIDB4MTFiOCwgMHgyMzAwLAorCTB4YTEwMiwgMHhhMDg2LCAweDAwMDEsIDB4MDkwNCwgMHgyZDhhLCAweDdjYTgsIDB4YTRhNCwgMHgwMGZmLAorCTB4YTQ4MCwgMHgwMDAyLCAweGEzMDAsIDB4MjAxOCwgMHhhMTAyLCAweDBhMDQsIDB4MmQ5ZSwgMHgwOTA0LAorCTB4MmQ5ZSwgMHgyNGE4LCAweDdhYTgsIDB4MWYwNCwgMHgyZTNhLCAweDBjMTgsIDB4YTI4NCwgMHgwMGYwLAorCTB4YTA4MiwgMHgwMDIwLCAweDA2YjgsIDB4MjIwMCwgMHhhMDgyLCAweDAwMjEsIDB4MTY5OCwgMHg3YWE4LAorCTB4ODMxOCwgMHg4MzE4LCAweDIxMDAsIDB4YTMwMiwgMHgwYWEwLCAweGEyODYsIDB4MDAyMywgMHgwOTUwLAorCTB4NjgxYywgMHhhMDg0LCAweGZmZjEsIDB4NjgxZSwgMHg3ZTU4LCAweGE2ODQsIDB4ZmZmMSwgMHhjMGE1LAorCTB4MjAzMCwgMHg3ZTVhLCAweDYwMDgsIDB4YzBhNSwgMHg2MDBhLCAweDc4YTAsIDB4ODAwMSwgMHgwOTA0LAorCTB4MmUxMCwgMHgyMGE4LCAweDc5OTgsIDB4Nzg5YiwgMHgwMDYwLCAweDc4YWEsIDB4MjAxMSwgMHgwMDgwLAorCTB4Nzk5YSwgMHg3OGE4LCAweDc5OTgsIDB4N2E5YSwgMHg3OGFhLCAweDdhOTgsIDB4MWYwNCwgMHgyZTY4LAorCTB4YzY5NSwgMHg3ZTVhLCAweGQ2ZDQsIDB4MTExOCwgMHg3ODFiLCAweDAwNmUsIDB4MDAwNSwgMHg3ODFiLAorCTB4MDA4MiwgMHgwMDA1LCAweDgzMTgsIDB4MjEwMCwgMHhhMzAyLCAweDBhMDQsIDB4MmUyMSwgMHhhMjg0LAorCTB4MDA4MCwgMHgxOTA0LCAweDNhMzYsIDB4NzhhMCwgMHhhMDA1LCAweDA4YzgsIDB4MDgwNCwgMHgzYTM2LAorCTB4MDgwNCwgMHgzYTBiLCAweDcwNTQsIDB4YTA0ZCwgMHg3ODliLCAweDAwMTgsIDB4NzhhOCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDhlLCAweDAwMDEsIDB4MDExMCwgMHgwODBjLCAweDI1NGMsIDB4N2FhOCwgMHhhMjk0LAorCTB4MDBmZiwgMHg3ODRiLCAweDAwMDgsIDB4NzhhOCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4YSwgMHgwMDA1LAorCTB4MWEwNCwgMHgzYTBiLCAweDAwMDIsIDB4M2EwYiwgMHgzODBjLCAweDNhMGIsIDB4MzkyNywgMHgzZDMxLAorCTB4YTI4MiwgMHgwMDAwLCAweDExMTAsIDB4MDgwYywgMHgyNTRjLCAweDA4MGMsIDB4M2EzYywgMHg3ODFiLAorCTB4MDA4MiwgMHgwMDA1LCAweGEyODIsIDB4MDAwMywgMHgxMTEwLCAweDA4MGMsIDB4MjU0YywgMHhkNGZjLAorCTB4MTFkMCwgMHg3MDYwLCAweGEwMDUsIDB4MDExMCwgMHgwODBjLCAweDI1NGMsIDB4NmYxNCwgMHg3NzcyLAorCTB4YTdiYywgMHg4ZjAwLCAweDA4MGMsIDB4M2I2ZiwgMHg2MDA4LCAweGEwODUsIDB4MDAyMSwgMHg2MDBhLAorCTB4ODczOCwgMHhhNzg0LCAweDAwMWYsIDB4MWRiMCwgMHgwODBjLCAweDNhM2YsIDB4NzA2MywgMHgwMDAyLAorCTB4NzAxZiwgMHgwMDA5LCAweDAwMTAsIDB4MDgwYywgMHgzYTRiLCAweDc4MWIsIDB4MDA4MiwgMHgwMDA1LAorCTB4YTI4MiwgMHgwMDA0LCAweDAzMTAsIDB4MDgwYywgMHgyNTRjLCAweDIzMDAsIDB4MDAwMiwgMHgyZWUyLAorCTB4MzA3OCwgMHgzMGI0LCAweGEyODYsIDB4MDAwMywgMHgwNTk4LCAweDcyMDAsIDB4N2NkOCwgMHg3ZGRjLAorCTB4N2ZkMCwgMHg3MWQwLCAweGQxYjQsIDB4MDUyOCwgMHhkMWJjLCAweDE1MTgsIDB4MjAwMSwgMHg0NjAxLAorCTB4MjAwNCwgMHhkMGM0LCAweDExZjAsIDB4Nzg2OCwgMHhhMDg0LCAweDAwZmYsIDB4MTFkMCwgMHhhMjgyLAorCTB4MDAwMiwgMHgxMmI4LCAweDAwZDYsIDB4NzgzYiwgMHg4MzAwLCAweDc4MWIsIDB4MDA1OSwgMHg3MGI4LAorCTB4YTA2ZCwgMHg2OGI0LCAweDc4NWEsIDB4Njg5NCwgMHg3OGQ2LCAweDc4ZGUsIDB4Njg5OCwgMHg3OGQyLAorCTB4NzhkYSwgMHhjMWI0LCAweDcxZDIsIDB4NzAwMywgMHgwMDMwLCAweDAwZGUsIDB4MjAwMSwgMHgwMDAwLAorCTB4MDA1OCwgMHg3ODNiLCAweDEzMDAsIDB4NzgxYiwgMHgwMDU3LCAweDIwMDEsIDB4MDAwMCwgMHgwMDIwLAorCTB4NzIwMCwgMHg3Y2Q4LCAweDdkZGMsIDB4N2ZkMCwgMHg3MDQ2LCAweDY4YTAsIDB4ZDBlYywgMHgwMTE4LAorCTB4NjAwOCwgMHhjMDhkLCAweDYwMGEsIDB4YTI4NCwgMHgwMDBmLCAweDAwMDIsIDB4MzA1OSwgMHgyZjMzLAorCTB4MmYzMCwgMHgzMTg0LCAweDMyMGYsIDB4MjVhMCwgMHgyZjJlLCAweDJmMmUsIDB4MDgwYywgMHgyNTRjLAorCTB4NjAwOCwgMHhjMGQ0LCAweDYwMGEsIDB4ZDZlNCwgMHgwMTIwLCAweDcwNDQsIDB4YTA4NiwgMHgwMDE0LAorCTB4MTFlOCwgMHgwODBjLCAweDNmMjYsIDB4MjAwOSwgMHgwMDAwLCAweDY4MTgsIDB4ZDBmYywgMHgwMTA4LAorCTB4NzA0NCwgMHhhMDg2LCAweDAwMTQsIDB4MDE2OCwgMHg2ODE4LCAweGEwODYsIDB4MDAwOCwgMHgxOTA0LAorCTB4MzAxYiwgMHg3ODU4LCAweGQwOWMsIDB4MDkwNCwgMHgzMDFiLCAweDY4MjAsIDB4ZDBhYywgMHgwOTA0LAorCTB4MzAxYiwgMHg2ODFiLCAweDAwMTQsIDB4MjAwOSwgMHgwMDAyLCAweDA0YTgsIDB4Nzg2OCwgMHhhMDhjLAorCTB4MDBmZiwgMHgwNTg4LCAweGExODYsIDB4MDAwOCwgMHgxMTU4LCAweDYwMDgsIDB4YzBhNCwgMHg2MDBhLAorCTB4MDgwYywgMHgzNzRmLCAweDA1NDAsIDB4MDgwYywgMHgzN2JlLCAweDA4MGMsIDB4M2YyNiwgMHgwMDYwLAorCTB4YTE4NiwgMHgwMDI4LCAweDE1MDAsIDB4NjAxOCwgMHhhMDA1LCAweDBkNzgsIDB4ODAwMSwgMHgwZDY4LAorCTB4ODAwMSwgMHgwZDU4LCAweDYwMWUsIDB4MGM0OCwgMHg2ODIwLCAweGQwODQsIDB4MDkwNCwgMHgyNWEwLAorCTB4YzA4NCwgMHg2ODIyLCAweDA4MGMsIDB4MjY5MywgMHg3MDU4LCAweDAwYzYsIDB4MjA2MCwgMHg2ODAwLAorCTB4NjAwMiwgMHgwMGNlLCAweDYwMDQsIDB4NjgwMiwgMHhhMDA1LCAweDJkMDAsIDB4MTEwOCwgMHg2MDAyLAorCTB4NjAwNiwgMHgwODA0LCAweDI1YTAsIDB4MDAxNiwgMHg4MWZmLCAweDE1ZjAsIDB4NzAwMCwgMHhhMDg2LAorCTB4MDAzMCwgMHgwNWQwLCAweDcxZDAsIDB4ZDFiYywgMHgxNWI4LCAweGQxYjQsIDB4MTFlOCwgMHg3MDVjLAorCTB4YTAwNSwgMHgxNTkwLCAweDcwYTAsIDB4YTA4NiwgMHgwMDAxLCAweDA1NzAsIDB4NzAwMywgMHgwMDAwLAorCTB4MDA0NiwgMHgwMDU2LCAweDAwNzYsIDB4MDA2NiwgMHgwMGM2LCAweDAwZDYsIDB4MDgwYywgMHgyNWM1LAorCTB4MDBkZSwgMHgwMGNlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMDVlLCAweDAwNGUsIDB4NzFkMCwgMHhkMWI0LAorCTB4MTFkOCwgMHg3MDAzLCAweDAwNDAsIDB4MDBjMCwgMHgwODBjLCAweDNjMzMsIDB4MTFhOCwgMHg3ODFiLAorCTB4MDA2OCwgMHgwMGQ2LCAweDcwYjgsIDB4YTA2ZCwgMHg2OGI0LCAweDc4NWEsIDB4Njg5NCwgMHg3OGQ2LAorCTB4NzhkZSwgMHg2ODk4LCAweDc4ZDIsIDB4NzhkYSwgMHhjMWI0LCAweDcxZDIsIDB4NzAwMywgMHgwMDMwLAorCTB4NzgwOCwgMHhjMDhkLCAweDc4MGEsIDB4MDBkZSwgMHgwODBjLCAweDMwZGMsIDB4MDAxZSwgMHg4MWZmLAorCTB4MDkwNCwgMHgzMDFiLCAweGE2ODQsIDB4ZGYwMCwgMHg2ODFlLCAweDY4MmIsIDB4MDAwMCwgMHg2ZjE0LAorCTB4YTE4NiwgMHgwMDAyLCAweDE5MDQsIDB4MzAxYywgMHg2ODE4LCAweGEwODYsIDB4MDAxNCwgMHgxMTMwLAorCTB4MjAwOCwgMHhkNmU0LCAweDAxMTgsIDB4Nzg2OCwgMHhhMDhjLCAweDAwZmYsIDB4MDgwYywgMHgzYTU1LAorCTB4MDgwYywgMHgyNjllLCAweDY4MjAsIDB4ZDBkYywgMHgxNTc4LCAweDg3MTcsIDB4YTI5NCwgMHgwMDBmLAorCTB4ODIxMywgMHg4MjEzLCAweDgyMTMsIDB4YjI4NCwgMHgwNjAwLCAweDAxMTgsIDB4YTI5MCwgMHg0YWMwLAorCTB4MDAxMCwgMHhhMjkwLCAweDRiNDAsIDB4YTI5MCwgMHgwMDAwLCAweDIyMWMsIDB4ZDNjNCwgMHgwMTcwLAorCTB4NjgyMCwgMHhkMGU0LCAweDAxMjgsIDB4YTA4NCwgMHhlZmZmLCAweDY4MjIsIDB4YzNhYywgMHgyMzEyLAorCTB4ODIxMCwgMHgyMjA0LCAweGEwODUsIDB4MDAzOCwgMHgyMDEyLCAweDgyMTEsIDB4ZDNkNCwgMHgwMTM4LAorCTB4NjhhMCwgMHhkMGM0LCAweDExMjAsIDB4MDgwYywgMHgzMTQ0LCAweDA4MDQsIDB4MjVhMCwgMHg2MDA4LAorCTB4YzA4ZCwgMHg2MDBhLCAweDAwMDgsIDB4NjkyYSwgMHg2OTE2LCAweDY4MTgsIDB4ZDBmYywgMHgwMTEwLAorCTB4NzA0NCwgMHg2ODFhLCAweGE2OGMsIDB4ZGYwMCwgMHg2OTFlLCAweDY0MTAsIDB4ODRmZiwgMHgwMTY4LAorCTB4MjAwOSwgMHg0NjAyLCAweDIxMDQsIDB4ODAwMSwgMHgyMDBhLCAweDg0MjEsIDB4NjQxMiwgMHgxMTI4LAorCTB4MjAyMSwgMHg0NjA0LCAweDI0MDQsIDB4YzBhNSwgMHgyMDIyLCAweDYwMTgsIDB4YTAwNSwgMHgwMTE4LAorCTB4ODAwMSwgMHg2MDFhLCAweDExMTgsIDB4NjAwOCwgMHhjMGE0LCAweDYwMGEsIDB4NjgyMCwgMHhkMDg0LAorCTB4MTEzMCwgMHg2ODAwLCAweGEwMDUsIDB4MTEwOCwgMHg2MDAyLCAweDYwMDYsIDB4MDAyMCwgMHg3MDU4LAorCTB4MjA2MCwgMHg2ODAwLCAweDYwMDIsIDB4MjA2MSwgMHg0NjAwLCAweDY4ODcsIDB4MDEwMywgMHgyZDA4LAorCTB4MjA2YiwgMHgwMDAwLCAweDYwNjgsIDB4YTAwNSwgMHg2MTZhLCAweDAxMTAsIDB4MmQwMiwgMHgwMDA4LAorCTB4NjE2ZSwgMHg3MjAwLCAweGEyODYsIDB4MDAzMCwgMHgwMTU4LCAweGEyODYsIDB4MDA0MCwgMHgxOTA0LAorCTB4MjVhMCwgMHg3MDAzLCAweDAwMDIsIDB4NzA0OCwgMHgyMDY4LCAweDY4YzQsIDB4MjA2MCwgMHgwMDA1LAorCTB4NzAwMywgMHgwMDAyLCAweDcwYjgsIDB4YTA2ZCwgMHg2OGJjLCAweDcwM2UsIDB4NzBiNCwgMHhhMDY1LAorCTB4NjhjMCwgMHg3MDU2LCAweDJkMDAsIDB4NzA0YSwgMHhhZDgwLCAweDAwMDksIDB4NzA0MiwgMHgwMDA1LAorCTB4YTI4MiwgMHgwMDA0LCAweDAyMTAsIDB4MDgwYywgMHgyNTRjLCAweDIyMDAsIDB4MDAwMiwgMHgzMDgzLAorCTB4MzA5MiwgMHgzMDllLCAweDMwOTIsIDB4YTU4NiwgMHgxMzAwLCAweDAxNjAsIDB4YTU4NiwgMHg4MzAwLAorCTB4MWQ5MCwgMHg3MDAzLCAweDAwMDAsIDB4NjAxOCwgMHg4MDAxLCAweDYwMWEsIDB4NjAwOCwgMHhhMDg0LAorCTB4ZmJlZiwgMHg2MDBhLCAweDcwMDAsIDB4YTA4NiwgMHgwMDA1LCAweDAxMjgsIDB4MDgwYywgMHgzYTNjLAorCTB4NzgxYiwgMHgwMDgyLCAweDAwMDUsIDB4NzgxYiwgMHgwMDgzLCAweDAwMDUsIDB4Nzg5MCwgMHg4MDA3LAorCTB4ODAwMSwgMHhhMDg0LCAweDAwMDcsIDB4YTA4MCwgMHgwMDE4LCAweDc4OWEsIDB4NzlhOCwgMHhhMThjLAorCTB4MDBmZiwgMHhhMTg2LCAweDAwMDMsIDB4MDEyOCwgMHhhMTg2LCAweDAwMDAsIDB4MDExMCwgMHgwODA0LAorCTB4M2EwYiwgMHg3ODFiLCAweDAwODMsIDB4MDAwNSwgMHg2ODIwLCAweGMwOTUsIDB4NjgyMiwgMHg4MmZmLAorCTB4MTExOCwgMHgwODBjLCAweDNhM2MsIDB4MDAzMCwgMHg4MjExLCAweDAxMTAsIDB4MDgwYywgMHgyNTRjLAorCTB4MDgwYywgMHgzYTRiLCAweDc4MWIsIDB4MDA4MiwgMHgwMDA1LCAweDA4MGMsIDB4M2M0NiwgMHg3ODMwLAorCTB4YTA4NCwgMHgwMGMwLCAweDExNzAsIDB4MDAxNiwgMHgzMjA4LCAweGExOGMsIDB4MDgwMCwgMHgwMDFlLAorCTB4MDExOCwgMHgwMTA0LCAweDMwZDksIDB4MDAxMCwgMHgwMzA0LCAweDMwZDksIDB4NzkxYSwgMHhhMDA2LAorCTB4MDAwNSwgMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHhhNjg0LCAweDAwNjAsIDB4MTEzMCwgMHg2ODJmLAorCTB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4MDgwNCwgMHgzMTQzLCAweGQ2ZGMsIDB4MTE5OCwgMHg2OGI0LAorCTB4ZDBkYywgMHgxMTgwLCAweDY5OTgsIDB4NmE5NCwgMHg2OTJlLCAweDZhMzIsIDB4NzA0NCwgMHhhMDA1LAorCTB4MTEzMCwgMHgyMjAwLCAweGExMDUsIDB4MDkwNCwgMHgzZjI2LCAweDcwNDcsIDB4MDAxNSwgMHgwODA0LAorCTB4M2YyNiwgMHgwMDA1LCAweGQ2YWMsIDB4MDFmMCwgMHhkNmY0LCAweDAxMzAsIDB4NjgyZiwgMHgwMDAwLAorCTB4NjgzMywgMHgwMDAwLCAweDA4MDQsIDB4M2YyNiwgMHg2OGI0LCAweGEwODQsIDB4NDAwMCwgMHhhNjM1LAorCTB4ZDZmNCwgMHgxZGEwLCAweDcwNDQsIDB4YTAwNSwgMHgxMTEwLCAweDcwNDcsIDB4MDAxNSwgMHhkNmRjLAorCTB4MTEyOCwgMHg2OGI0LCAweGQwZGMsIDB4MDExMCwgMHg2Y2E4LCAweDZkYTQsIDB4NmMyZSwgMHg2ZDMyLAorCTB4MDgwNCwgMHgzZjI2LCAweGQ2ZjQsIDB4MDEzMCwgMHg2ODJmLCAweDAwMDAsIDB4NjgzMywgMHgwMDAwLAorCTB4MDgwNCwgMHgzZjI2LCAweDY4YjQsIDB4YTA4NCwgMHg0ODAwLCAweGE2MzUsIDB4ZDZmNCwgMHgxZGEwLAorCTB4NzA0NCwgMHhhMDA1LCAweDExMTAsIDB4NzA0NywgMHgwMDE1LCAweDI0MDgsIDB4MjUxMCwgMHgyNzAwLAorCTB4ODAwNywgMHhhMDg0LCAweDAwN2YsIDB4YTEwOCwgMHhhMjkxLCAweDAwMDAsIDB4NjkyZSwgMHg2YTMyLAorCTB4MjEwMCwgMHhhMjA1LCAweDExMTAsIDB4MDgwNCwgMHgzZjI2LCAweDcwMDAsIDB4YTA4NiwgMHgwMDA2LAorCTB4MDExMCwgMHgwODA0LCAweDNmMjYsIDB4MDAwNSwgMHg2OTQ2LCAweDYwMDgsIDB4YzBjZCwgMHhkM2NjLAorCTB4MDEwOCwgMHhjMDhkLCAweDYwMGEsIDB4NjgxOCwgMHg2ODNhLCAweDY4MWIsIDB4MDAwNiwgMHg2ODhmLAorCTB4MDAwMCwgMHg2ODkzLCAweDAwMDAsIDB4NmEzMCwgMHg2OTJjLCAweDZhM2UsIDB4Njk0MiwgMHg2ODJmLAorCTB4MDAwMywgMHg2ODMzLCAweDAwMDAsIDB4NjgzNywgMHgwMDIwLCAweDY4OTcsIDB4MDAwMCwgMHg2ODliLAorCTB4MDAyMCwgMHg3MDAwLCAweDAwMDIsIDB4MjVhMCwgMHgzMTczLCAweDMxNmQsIDB4MzE2YiwgMHgzMTZiLAorCTB4MzE2YiwgMHgzMTZiLCAweDMxNmIsIDB4MDgwYywgMHgyNTRjLCAweDY4MjAsIDB4ZDA4NCwgMHgxMTE4LAorCTB4MDgwYywgMHgzN2E0LCAweDAwMzAsIDB4NzA1OCwgMHgyYzUwLCAweDIwNjAsIDB4NjgwMCwgMHg2MDAyLAorCTB4MmE2MCwgMHhhZWEwLCAweDAwMTcsIDB4MjQwNCwgMHhhMDA1LCAweDAxMTAsIDB4MjAyMCwgMHgwY2Q4LAorCTB4MmQyMiwgMHgyMDZiLCAweDAwMDAsIDB4MDAwNSwgMHgwODBjLCAweDM3YWEsIDB4MDgwYywgMHgzN2JlLAorCTB4NjAwOCwgMHhjMGNjLCAweDYwMGEsIDB4NjgyYiwgMHgwMDAwLCAweDc4OWIsIDB4MDAwZSwgMHg2ZjE0LAorCTB4NjkzOCwgMHg2OTFhLCAweDY5NDQsIDB4NjkxNiwgMHgyMDA5LCAweDAwMDAsIDB4YWU4NiwgMHg0NjQwLAorCTB4MDExMCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwYywgMHg0MmVjLCAweGQ2ZGMsIDB4MDFjOCwgMHg2OTFjLAorCTB4YzFlZCwgMHg2OTFlLCAweDY4MjgsIDB4YTA4MiwgMHgwMDBlLCAweDAyOTAsIDB4Njg0OCwgMHhhMDg0LAorCTB4MDAwZiwgMHhhMDg2LCAweDAwMGIsIDB4MTE2MCwgMHg2ODVjLCAweGEwODYsIDB4MDA0NywgMHgxMTQwLAorCTB4MjAwMSwgMHg0NjAxLCAweDIwMDQsIDB4ZDBhYywgMHgxMTE4LCAweDI3MDAsIDB4MDgwYywgMHgyNDc1LAorCTB4NjgxOCwgMHhkMGZjLCAweDAxNDAsIDB4NjgxYiwgMHgwMDAwLCAweDc4NjgsIDB4YTA4YywgMHgwMGZmLAorCTB4MDExMCwgMHg2ODFiLCAweDAwMWUsIDB4YWVhMCwgMHgwMDE3LCAweDY4MDAsIDB4MjAyMiwgMHg2YTNjLAorCTB4Njk0MCwgMHg2YTMyLCAweDY5MmUsIDB4NjhjMCwgMHgyMDYwLCAweDYwMDAsIDB4ZDBhNCwgMHgwNTgwLAorCTB4MjA0MSwgMHgwMDIxLCAweDIwNDksIDB4MDAwNSwgMHgyMDUxLCAweDAwMjAsIDB4MDBkNiwgMHgwMGY2LAorCTB4MDE1NiwgMHgwMTQ2LCAweDIwNzksIDB4NDYwMCwgMHgwODBjLCAweDFiOTMsIDB4MDE0ZSwgMHgwMTVlLAorCTB4MDBmZSwgMHg3MGM4LCAweDIwMTAsIDB4MjAwOSwgMHgwMTAxLCAweDAwMjYsIDB4MjIwNCwgMHhhMDZkLAorCTB4MDE0MCwgMHg2ODE0LCAweGE3MDYsIDB4MDExMCwgMHg2ODAwLCAweDBjYzgsIDB4NjgyMCwgMHhjMGQ1LAorCTB4NjgyMiwgMHgwMDJlLCAweDgyMTAsIDB4ODEwOSwgMHgxZDgwLCAweDAwZGUsIDB4NzA2MywgMHgwMDAzLAorCTB4NzA3YiwgMHgwMDAwLCAweDc3NzIsIDB4NzA3ZiwgMHgwMDBmLCAweDcxZDAsIDB4YzFjNCwgMHg3MWQyLAorCTB4NjgxOCwgMHhhMDg2LCAweDAwMDIsIDB4MTEzOCwgMHg2ODE3LCAweDAwMDAsIDB4NjgyYiwgMHgwMDAwLAorCTB4NjgxYywgMHhjMGVjLCAweDY4MWUsIDB4MDgwYywgMHgxZGEyLCAweDA4MDQsIDB4MjVhMCwgMHg3Y2Q4LAorCTB4N2RkYywgMHg3ZmQwLCAweDA4MGMsIDB4MzBkYywgMHg2ODJiLCAweDAwMDAsIDB4Nzg5YiwgMHgwMDBlLAorCTB4NmYxNCwgMHgwODBjLCAweDNjNGEsIDB4YTA4YywgMHgwMGZmLCAweDY5MTYsIDB4NjgxOCwgMHhkMGZjLAorCTB4MDExMCwgMHg3MDQ0LCAweDY4MWEsIDB4YTY4YywgMHhkZjAwLCAweDY5MWUsIDB4NzA2MywgMHgwMDAwLAorCTB4MDgwNCwgMHgyNWEwLCAweDcwMDAsIDB4YTAwNSwgMHgxMTEwLCAweDA4MDQsIDB4MjVhMCwgMHhhMDA2LAorCTB4MDgwYywgMHgzZjI2LCAweDY5MjAsIDB4ZDFhYywgMHgxMTEwLCAweDY4MWIsIDB4MDAxNCwgMHhhNjhjLAorCTB4ZGYwMCwgMHg2OTFlLCAweDY4MmIsIDB4MDAwMCwgMHg2ODIwLCAweGEwODQsIDB4MDBmZiwgMHg2ODIyLAorCTB4NzAwMCwgMHgwMDAyLCAweDI1YTAsIDB4MzI0YywgMHgzMjRjLCAweDMyNGYsIDB4MzI0ZiwgMHgzMjRmLAorCTB4MzI0YSwgMHgzMjRhLCAweDA4MGMsIDB4MjU0YywgMHg2ODE4LCAweDA4MDQsIDB4MmYxOCwgMHg2MDA4LAorCTB4YzBhNCwgMHg2MDBhLCAweDY4MTcsIDB4MDAwMCwgMHgwODA0LCAweDM3NzIsIDB4MjMwMCwgMHgwMDAyLAorCTB4MzI1YiwgMHgzMjVkLCAweDMyYWIsIDB4MDgwYywgMHgyNTRjLCAweGQ2ZmMsIDB4MTkwNCwgMHgyZDM4LAorCTB4NzAwMCwgMHhhMDBkLCAweDAwMDIsIDB4MjVhMCwgMHgzMjZkLCAweDMyNmQsIDB4MzI5NywgMHgzMjZkLAorCTB4MzJhOCwgMHgzMjZiLCAweDMyNmIsIDB4MDgwYywgMHgyNTRjLCAweGE2ODQsIDB4MDA2MCwgMHgwNTM4LAorCTB4YTA4NiwgMHgwMDYwLCAweDE1MTAsIDB4YzZhYywgMHhjNmY0LCAweGM2ZWQsIDB4N2U1YSwgMHg2ZWI2LAorCTB4NjgxYywgMHhjMGFjLCAweDY4MWUsIDB4YTE4NiwgMHgwMDAyLCAweDAxNDgsIDB4MDgwYywgMHgzZjI2LAorCTB4NjlhYywgMHg2OGIwLCAweGExMTUsIDB4MDExOCwgMHgwODBjLCAweDQyMDYsIDB4MDAxMCwgMHgwODBjLAorCTB4NDFkOSwgMHg3ODFiLCAweDAwODMsIDB4NzFkMCwgMHhkMWI0LCAweDE5MDQsIDB4MjU5ZCwgMHg3MGEwLAorCTB4YTA4NiwgMHgwMDAxLCAweDE5MDQsIDB4MjVlMSwgMHgwMDA1LCAweGQ2ZWMsIDB4MDlmMCwgMHg2ODE4LAorCTB4ZDBmYywgMHgwMTcwLCAweGQ2ZjQsIDB4MTEzMCwgMHg2ODFiLCAweDAwMTUsIDB4NzgxYiwgMHgwMDgzLAorCTB4MDgwNCwgMHgyNTlkLCAweDY4MWIsIDB4MDAwNywgMHg2ODJmLCAweDAwMDAsIDB4NjgzMywgMHgwMDAwLAorCTB4MDgwYywgMHgzYmYxLCAweDAwMDUsIDB4MDgwYywgMHgyNTRjLCAweDIzMDAsIDB4MDAwMiwgMHgzMmI0LAorCTB4MzJkNiwgMHgzMzJlLCAweDA4MGMsIDB4MjU0YywgMHg3MDAwLCAweDAwMDIsIDB4MzJiZSwgMHgzMmMwLAorCTB4MzJjNywgMHgzMmJlLCAweDMyYmUsIDB4MzJiZSwgMHgzMmJlLCAweDMyYmUsIDB4MDgwYywgMHgyNTRjLAorCTB4NjlhYywgMHg2OGIwLCAweGExMTUsIDB4MDExOCwgMHgwODBjLCAweDQyMDYsIDB4MDAxMCwgMHgwODBjLAorCTB4NDFkOSwgMHg2ODFjLCAweGMwYjQsIDB4NjgxZSwgMHg3MGQwLCAweGQwYjQsIDB4MTkwNCwgMHgyNTlkLAorCTB4NzBhMCwgMHhhMDg2LCAweDAwMDEsIDB4MTkwNCwgMHgyNWUxLCAweDAwMDUsIDB4ZDZmYywgMHgxOTA0LAorCTB4MzMxZSwgMHg3MDAwLCAweGEwMGQsIDB4MDAwMiwgMHgyNWEwLCAweDMyZWMsIDB4MzJlNiwgMHgzMzE2LAorCTB4MzJlYywgMHgzMzFiLCAweDMyZTQsIDB4MzJlNCwgMHgwODBjLCAweDI1NGMsIDB4Njg5NCwgMHg3OGQ2LAorCTB4NzhkZSwgMHg2ODk4LCAweDc4ZDIsIDB4NzhkYSwgMHhhNjg0LCAweDAwNjAsIDB4MDUzOCwgMHhhMDg2LAorCTB4MDA2MCwgMHgxNTEwLCAweGE2YjQsIDB4YmZiZiwgMHhjNmVkLCAweDdlNWEsIDB4NmViNiwgMHhhMTg2LAorCTB4MDAwMiwgMHgwMTQ4LCAweDA4MGMsIDB4M2YyNiwgMHg2OWFjLCAweDY4YjAsIDB4YTExNSwgMHgwMTE4LAorCTB4MDgwYywgMHg0MjA2LCAweDAwMTAsIDB4MDgwYywgMHg0MWQ5LCAweDc4MWIsIDB4MDA4MywgMHg2ODFjLAorCTB4YzBiNCwgMHg2ODFlLCAweDcxZDAsIDB4ZDFiNCwgMHgxOTA0LCAweDI1OWQsIDB4NzBhMCwgMHhhMDg2LAorCTB4MDAwMSwgMHgxOTA0LCAweDI1ZTEsIDB4MDAwNSwgMHhkNmVjLCAweDA5ZjAsIDB4NjgxOCwgMHhkMGZjLAorCTB4MDExMCwgMHg2ODFiLCAweDAwMDcsIDB4NzgxYiwgMHgwMGZiLCAweDAwMDUsIDB4YzZmYywgMHg3ZTVhLAorCTB4N2FkYywgMHg3OWQ4LCAweDZiOTgsIDB4MjEwMCwgMHhhMzAyLCAweDY4YjIsIDB4NmI5NCwgMHgyMjAwLAorCTB4YTMwMywgMHg2OGFlLCAweDc5ZDIsIDB4NzgxYiwgMHgwMDgzLCAweDAwMDUsIDB4ZDZkYywgMHgwMTMwLAorCTB4NzgyYiwgMHgzMDA5LCAweDc4MWIsIDB4MDA4MywgMHgwODA0LCAweDI1OWQsIDB4Nzg4NCwgMHhjMGFjLAorCTB4Nzg4NiwgMHg3OGU0LCAweGEwODQsIDB4MDAwOCwgMHgxMTUwLCAweGE0ODQsIDB4MDIwMCwgMHgwMTA4LAorCTB4YzZmNSwgMHhjNmRkLCAweDdlNWEsIDB4NzgxYiwgMHgwMDgzLCAweDA4MDQsIDB4MjU5ZCwgMHg2ODIwLAorCTB4YzA5NSwgMHg2ODIyLCAweDA4MGMsIDB4M2JkYywgMHhjNmRkLCAweDA4MGMsIDB4M2EzYywgMHg3ODFiLAorCTB4MDA4MiwgMHgwODA0LCAweDI1OWQsIDB4MjMwMCwgMHgwMDAyLCAweDMzNTgsIDB4MzM1YSwgMHgzMzVjLAorCTB4MDgwYywgMHgyNTRjLCAweDA4MDQsIDB4M2EzNiwgMHg3ZDk4LCAweGQ2ZDQsIDB4MTVhOCwgMHg3OWU0LAorCTB4ZDFhYywgMHgwMTMwLCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDAxMTAsIDB4NzgyYiwgMHgzMDA5LAorCTB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwMCwgMHhhNjg0LCAweGZmZmIsIDB4Nzg1YSwgMHg3ZDlhLAorCTB4NzllNCwgMHhkMWFjLCAweDAxMjAsIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MTEyMCwgMHgyMDAxLAorCTB4MDAxNCwgMHgwODA0LCAweDJmMTgsIDB4Nzg4NCwgMHhkMGZjLCAweDExMTgsIDB4YTE4NCwgMHgwMDA3LAorCTB4MDA5MCwgMHhhMTg0LCAweDAwMDcsIDB4YTA4NiwgMHgwMDA0LCAweDExMTgsIDB4MjAwMSwgMHgwMDAwLAorCTB4MDA1MCwgMHhhMTg0LCAweDAwMDcsIDB4YTA4NiwgMHgwMDA1LCAweDAxMTgsIDB4YTE4NCwgMHgwMDA3LAorCTB4MDAxMCwgMHgyMDAxLCAweDAwMDEsIDB4MDRjMiwgMHg3YTkwLCAweGEyOTQsIDB4MDAwNywgMHg3ODliLAorCTB4MDA2MCwgMHg3OWE4LCAweDgxZmYsIDB4MDU2OCwgMHg3ODliLCAweDAwODAsIDB4N2JhOCwgMHhhMzg0LAorCTB4MDAwMSwgMHgxMWQwLCAweDdiYTgsIDB4N2JhOCwgMHhhMzg2LCAweDAwMDQsIDB4MTExOCwgMHgyMDA5LAorCTB4ZmZkZiwgMHgwMDU4LCAweGEzODYsIDB4MDAwMSwgMHgxMTE4LCAweDIwMDksIDB4ZmZmNywgMHgwMDI4LAorCTB4YTM4NiwgMHgwMDAzLCAweDExNDgsIDB4MjAwOSwgMHhmZmVmLCAweDAwYzYsIDB4NzA1NCwgMHgyMDYwLAorCTB4NjAwNCwgMHhhMTA0LCAweDYwMDYsIDB4MDBjZSwgMHg3ODliLCAweDAwNjAsIDB4NzhhYiwgMHgwMDAwLAorCTB4YTY4NCwgMHhmZmZiLCAweDc4NWEsIDB4NzgyYiwgMHgzMDA5LCAweDY5MjAsIDB4YTE4YywgMHhlY2ZmLAorCTB4NjkyMiwgMHg3ZDlhLCAweDA4MDQsIDB4M2JlNSwgMHgyYmFlLCAweDJiYjcsIDB4MzNkNiwgMHgzM2RjLAorCTB4MzNkNCwgMHgzM2Q0LCAweDNiZTUsIDB4M2JlNSwgMHgwODBjLCAweDI1NGMsIDB4NjkyMCwgMHhhMThjLAorCTB4ZmNmZiwgMHg2OTIyLCAweDA4MDQsIDB4M2JlYiwgMHg2OTIwLCAweGExOGMsIDB4ZmNmZiwgMHg2OTIyLAorCTB4MDgwNCwgMHgzYmU1LCAweDc5ZTQsIDB4YTE4NCwgMHgwMDMwLCAweDAxMjAsIDB4NzhlYywgMHhhMDg0LAorCTB4MDAwMywgMHgxNTcwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDA0LCAweDExOTAsIDB4NzA2MCwgMHhhMDg2LAorCTB4MDAwMiwgMHgxMTMwLCAweDIwMTEsIDB4MDAwMiwgMHgyMDE5LCAweDAwMDAsIDB4MDgwNCwgMHgyYTU2LAorCTB4NzA2MCwgMHhhMDg2LCAweDAwMDYsIDB4MGRiMCwgMHg3MDYwLCAweGEwODYsIDB4MDAwNCwgMHgwZDkwLAorCTB4NzAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDkwNCwgMHgyNTlkLCAweDY5MjAsIDB4YTE4NCwgMHgwNDIwLAorCTB4MDEyOCwgMHhjMWQ0LCAweDY5MjIsIDB4NjgxOCwgMHgwODA0LCAweDJmMTgsIDB4NjgxOCwgMHhhMDhlLAorCTB4MDAwMiwgMHgwMTIwLCAweGMwZmQsIDB4NjgxYSwgMHgyMDAxLCAweDAwMTQsIDB4MDgwNCwgMHgyZjE4LAorCTB4Nzg4NCwgMHhkMGZjLCAweDExMTgsIDB4YTE4NCwgMHgwMDA3LCAweDAwOTAsIDB4YTE4NCwgMHgwMDA3LAorCTB4YTA4NiwgMHgwMDA0LCAweDExMTgsIDB4MjAwMSwgMHgwMDAwLCAweDAwNTAsIDB4YTE4NCwgMHgwMDA3LAorCTB4YTA4NiwgMHgwMDA1LCAweDAxMTgsIDB4YTE4NCwgMHgwMDA3LCAweDAwMTAsIDB4MjAwMSwgMHgwMDAxLAorCTB4MDAwMiwgMHgzYmU1LCAweDNiZTUsIDB4MzQzOSwgMHgzYmU1LCAweDNjMjksIDB4M2MyOSwgMHgzYmU1LAorCTB4M2JlNSwgMHhkNmJjLCAweDA1NzAsIDB4NzE4MCwgMHg4MWZmLCAweDA1NTgsIDB4YTE4MiwgMHgwMDBkLAorCTB4MTMxOCwgMHg3MDgzLCAweDAwMDAsIDB4MDAyOCwgMHhhMTgyLCAweDAwMGMsIDB4NzA4MiwgMHgyMDA5LAorCTB4MDAwYywgMHg3ODliLCAweDAwNjEsIDB4NzlhYSwgMHgwMTU2LCAweDAxMzYsIDB4MDE0NiwgMHg3MDg0LAorCTB4ODExNCwgMHhhMjEwLCAweDcyODYsIDB4YTA4MCwgMHgwMDBiLCAweGFkMDAsIDB4MjA5OCwgMHhiMjg0LAorCTB4MDYwMCwgMHgwMTE4LCAweDIwYTEsIDB4MDIyYiwgMHgwMDEwLCAweDIwYTEsIDB4MDEyYiwgMHg3ODliLAorCTB4MDAwMCwgMHg4MTA4LCAweDgxYWMsIDB4NTNhNiwgMHgwMTRlLCAweDAxM2UsIDB4MDE1ZSwgMHgwODA0LAorCTB4M2JlYiwgMHhkNmQ0LCAweDE5MDQsIDB4MzRhYywgMHg2ODIwLCAweGQwODQsIDB4MDkwNCwgMHgzYmViLAorCTB4YTY4YywgMHgwMDYwLCAweGE2ODQsIDB4MDA2MCwgMHgwMTIwLCAweGEwODYsIDB4MDA2MCwgMHgxMTA4LAorCTB4YzFmNSwgMHhjMTk0LCAweDc5NWEsIDB4NjliNiwgMHg3ODliLCAweDAwNjAsIDB4NzhhYiwgMHgwMDAwLAorCTB4Nzg5YiwgMHgwMDYxLCAweDY4MTgsIDB4YzBmZCwgMHg2ODFhLCAweDc4YWEsIDB4ODAwOCwgMHg4MTBjLAorCTB4MDkwNCwgMHgzN2QzLCAweGExOGMsIDB4MDBmOCwgMHgxOTA0LCAweDM3ZDMsIDB4MDE1NiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMDE2LCAweDIwYTEsIDB4MDEyYiwgMHgzMjA4LCAweGExOGMsIDB4MDYwMCwgMHgwMTEwLAorCTB4MjBhMSwgMHgwMjJiLCAweDAwMWUsIDB4Nzg5YiwgMHgwMDAwLCAweDgwMDAsIDB4ODBhYywgMHhhZDgwLAorCTB4MDAwYiwgMHgyMDk4LCAweDUzYTYsIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsIDB4NjgxNCwgMHhjMGZjLAorCTB4ODAwNywgMHg3ODgyLCAweDA4MDQsIDB4M2JlYiwgMHg2ODE4LCAweGQwZmMsIDB4MDExMCwgMHg2ODFiLAorCTB4MDAwOCwgMHgwODBjLCAweDNhM2MsIDB4NzgxYiwgMHgwMGVkLCAweDAwMDUsIDB4MjMwMCwgMHgwMDAyLAorCTB4MzRiZCwgMHgzNTdhLCAweDM0YmIsIDB4MDgwYywgMHgyNTRjLCAweDdjZDgsIDB4N2RkYywgMHg3ZmQwLAorCTB4ODJmZiwgMHgxNTI4LCAweDcyMDAsIDB4YTI4NiwgMHgwMDAzLCAweDA5MDQsIDB4MmVlNiwgMHg3MWQwLAorCTB4ZDFiYywgMHgxMWY4LCAweGQxYjQsIDB4MDFlOCwgMHgyMDAxLCAweDQ2MDEsIDB4MjAwNCwgMHhkMGM0LAorCTB4MTFjMCwgMHgwMGQ2LCAweDc4M2IsIDB4ODgwMCwgMHg3ODFiLCAweDAwNTksIDB4NzBiOCwgMHhhMDZkLAorCTB4NjhiNCwgMHhjMGE1LCAweDc4NWEsIDB4Njg5NCwgMHg3OGQ2LCAweDc4ZGUsIDB4Njg5OCwgMHg3OGQyLAorCTB4NzhkYSwgMHhjMWI0LCAweDcxZDIsIDB4NzAwMywgMHgwMDMwLCAweDAwZGUsIDB4MDAzMCwgMHg3MjAwLAorCTB4MDAyMCwgMHg3ODNiLCAweDE4MDAsIDB4NzgxYiwgMHgwMDU3LCAweGEyODQsIDB4MDAwZiwgMHgwMDAyLAorCTB4MzU2NSwgMHgzNTIyLCAweDM0ZmEsIDB4MmYxNSwgMHgzNGY4LCAweDM1NjUsIDB4MzRmOCwgMHgzNGY4LAorCTB4MDgwYywgMHgyNTRjLCAweDY4MWMsIDB4ZDBlYywgMHgwMTE4LCAweDYwMDgsIDB4YzA4ZCwgMHg2MDBhLAorCTB4NjkyMCwgMHhjMTg1LCAweDY5MjIsIDB4NjgwMCwgMHg2MDA2LCAweGEwMDUsIDB4MTEwOCwgMHg2MDAyLAorCTB4NjAwOCwgMHhjMGQ0LCAweDYwMGEsIDB4NjgxYywgMHhhMDg0LCAweDAwMGUsIDB4MTEyMCwgMHg3MWM4LAorCTB4YTE4OCwgMHgwMTAwLCAweDAwMjgsIDB4NzAzMCwgMHg2OGJhLCAweDcxM2MsIDB4NzBjOCwgMHhhMTA4LAorCTB4MjEwNCwgMHg2ODAyLCAweDJkMGEsIDB4NzE1YSwgMHhkNmRjLCAweDExMjAsIDB4YzZmYywgMHg2ZWI2LAorCTB4MDgwNCwgMHgzNTY1LCAweDZlYjYsIDB4YTY4NCwgMHgwMDYwLCAweDExMjAsIDB4YTY4NCwgMHg3ZmZmLAorCTB4NjhiNiwgMHgwNGQ4LCAweGQ2ZGMsIDB4MTE1MCwgMHhhNjg0LCAweDdmZmYsIDB4NjhiNiwgMHg2ODk0LAorCTB4NjhhNiwgMHg2ODk4LCAweDY4YWEsIDB4MDgwYywgMHgzZjI2LCAweDA0NzgsIDB4ZDZhYywgMHgwMTQwLAorCTB4YTAwNiwgMHgwODBjLCAweDNmMjYsIDB4MjQwOCwgMHgyNTEwLCAweDY5YWEsIDB4NmFhNiwgMHgwMDY4LAorCTB4MjQwOCwgMHgyNTEwLCAweDI3MDAsIDB4ODAwNywgMHhhMDg0LCAweDAwN2YsIDB4YTEwOCwgMHhhMjkxLAorCTB4MDAwMCwgMHg2OWFhLCAweDZhYTYsIDB4MDgwYywgMHgzZjI2LCAweGQ2ZmMsIDB4MDFiMCwgMHhhNjg0LAorCTB4N2ZmZiwgMHg2OGI2LCAweDI1MTAsIDB4MjQwOCwgMHhkNmFjLCAweDExMzgsIDB4MjcwMCwgMHg4MDA3LAorCTB4YTA4NCwgMHgwMDdmLCAweGExMDgsIDB4YTI5MSwgMHgwMDAwLCAweDZiOTgsIDB4MjEwMCwgMHhhMzAyLAorCTB4NjhiMiwgMHg2Yjk0LCAweDIyMDAsIDB4YTMwMywgMHg2OGFlLCAweDcwMDAsIDB4YTA4NiwgMHgwMDMwLAorCTB4MTkwNCwgMHgyNWEwLCAweDcwMDMsIDB4MDAwMiwgMHg3MGI4LCAweGEwNmQsIDB4NjhiYywgMHg3MDNlLAorCTB4NzBiNCwgMHhhMDY1LCAweDY4YzAsIDB4NzA1NiwgMHgyZDAwLCAweDcwNGEsIDB4YWQ4MCwgMHgwMDA5LAorCTB4NzA0MiwgMHgwMDA1LCAweGE1ODYsIDB4ODgwMCwgMHgxMTQ4LCAweDcwMDMsIDB4MDAwMCwgMHg2MDE4LAorCTB4ODAwMSwgMHg2MDFhLCAweDYwMDgsIDB4YTA4NCwgMHhmYmVmLCAweDYwMGEsIDB4MDgwNCwgMHgzYTM2LAorCTB4NzA0MywgMHgwMDAwLCAweGEyODIsIDB4MDAwNiwgMHgwMzEwLCAweDA4MGMsIDB4MjU0YywgMHgyMzAwLAorCTB4MDAwMiwgMHgzNTk0LCAweDM1YTUsIDB4MzVhZiwgMHgyMjAwLCAweDAwMDIsIDB4MzU5YywgMHgzYTM2LAorCTB4MzU5ZSwgMHgzNTljLCAweDM1ZTAsIDB4MzYyZSwgMHgwODBjLCAweDI1NGMsIDB4N2E4MCwgMHhhMjk0LAorCTB4MGYwMCwgMHgwODBjLCAweDM2ODIsIDB4MDgwNCwgMHgzYTBiLCAweDAwYzEsIDB4MDAwMiwgMHgzYTM2LAorCTB4MzVhZCwgMHgzNWFkLCAweDM1ZTAsIDB4MzVhZCwgMHgzYTM2LCAweDA4MGMsIDB4MjU0YywgMHgwMDcxLAorCTB4MDAwMiwgMHgzNWI5LCAweDM1YjcsIDB4MzViNywgMHgzNWI5LCAweDM1YjcsIDB4MzViOSwgMHgwODBjLAorCTB4MjU0YywgMHgwODBjLCAweDNhNGIsIDB4NzgxYiwgMHgwMDgyLCAweDAwMDUsIDB4NzAwMCwgMHhhMDg2LAorCTB4MDAwMiwgMHgxMTUwLCAweDA4MGMsIDB4MzdiZSwgMHgwMDEwLCAweDA4MGMsIDB4M2YyNiwgMHg2MDA4LAorCTB4YTA4NCwgMHhmYmVmLCAweDYwMGEsIDB4MDAyMCwgMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgwZGE4LAorCTB4NzAwMywgMHgwMDA1LCAweDIwMDEsIDB4OGRlMCwgMHhhZThlLCAweDQ2NDAsIDB4MDExMCwgMHgyMDAxLAorCTB4OGUxMiwgMHgyMDY4LCAweDcwNGEsIDB4YWQ4MCwgMHgwMDA5LCAweDcwNDIsIDB4MjIwMCwgMHgwMDA1LAorCTB4NzAwMCwgMHhhMDg2LCAweDAwMDIsIDB4MTE1OCwgMHg3MGQwLCAweGMwYjUsIDB4NzBkMiwgMHgyYzAwLAorCTB4NzBiNiwgMHgyZDAwLCAweDcwYmEsIDB4MDAzOCwgMHgwODBjLCAweDNmMjYsIDB4MDAyMCwgMHg3MDAwLAorCTB4YTA4NiwgMHgwMDAzLCAweDBkYzgsIDB4NzAwMywgMHgwMDAxLCAweDdhODAsIDB4YTI5NCwgMHgwZjAwLAorCTB4Nzg5YiwgMHgwMDE4LCAweDdjYTgsIDB4YTQ4NCwgMHgwMDFmLCAweGEyMTUsIDB4MjA2OSwgMHg4Y2MwLAorCTB4YjI4NCwgMHgwNjAwLCAweDExMTgsIDB4YzJmZCwgMHgyMDY5LCAweDhkZDAsIDB4MmQwNCwgMHgyZDA4LAorCTB4NzE1YSwgMHhhMDZkLCAweDAxMjgsIDB4NjgxNCwgMHhhMjA2LCAweDAxMjAsIDB4NjgwMCwgMHgwY2I4LAorCTB4MDgwYywgMHgzNjgyLCAweDZlYjQsIDB4N2U1YSwgMHg2OTIwLCAweGExODQsIDB4MGMwMCwgMHgwOTA0LAorCTB4MzZhOCwgMHg3MDYwLCAweGEwODYsIDB4MDAwNiwgMHgxMTI4LCAweDcwNzAsIDB4YTIwNiwgMHgxMTEwLAorCTB4NzA2MiwgMHg3MDdhLCAweDY4MWIsIDB4MDAwNSwgMHhjMWFkLCAweDY4MWIsIDB4MDAwNSwgMHhjMWFkLAorCTB4YzFkNCwgMHg2OTIyLCAweDA4MGMsIDB4M2E0MiwgMHgwODA0LCAweDM2YTgsIDB4NzIwMCwgMHhhMjg2LAorCTB4MDAwMiwgMHgxMTU4LCAweDcwZDAsIDB4YzBiNSwgMHg3MGQyLCAweDJjMDAsIDB4NzBiNiwgMHgyZDAwLAorCTB4NzBiYSwgMHgwMDMwLCAweDA4MGMsIDB4M2YyNiwgMHgwMDE4LCAweGEyODYsIDB4MDAwMywgMHgwZGQwLAorCTB4NzAwMywgMHgwMDAxLCAweDdhODAsIDB4YTI5NCwgMHgwZjAwLCAweDc4OWIsIDB4MDAxOCwgMHg3Y2E4LAorCTB4YTQ4NCwgMHgwMDFmLCAweGEyMTUsIDB4YWU4NiwgMHg0NjQwLCAweDAxMDgsIDB4YzJmZCwgMHg3OWE4LAorCTB4NzlhOCwgMHhhMThjLCAweDAwZmYsIDB4MjExOCwgMHg3MGM4LCAweGExNjgsIDB4MmQwNCwgMHgyZDA4LAorCTB4NzE1YSwgMHhhMDZkLCAweDAxMjgsIDB4NjgxNCwgMHhhMjA2LCAweDAxMTgsIDB4NjgwMCwgMHgwY2I4LAorCTB4MDQwOSwgMHg2ZWI0LCAweDY5MjAsIDB4YTE4NCwgMHgwYzAwLCAweDA5MDQsIDB4MzZhOCwgMHhkMGRjLAorCTB4MDE3OCwgMHg3MDYwLCAweGEwODYsIDB4MDAwNCwgMHgxMTQwLCAweDcwNzAsIDB4YTIwNiwgMHgxMTI4LAorCTB4NzA3NCwgMHhhMzA2LCAweDExMTAsIDB4NzA2MiwgMHg3MDdhLCAweDA4MGMsIDB4M2E0OCwgMHgwNDgwLAorCTB4NjgxYiwgMHgwMDA1LCAweGMxYWQsIDB4YzFkNCwgMHg2OTIyLCAweDA4MGMsIDB4M2E0MiwgMHg3MDdiLAorCTB4MDAwMCwgMHgwNDMwLCAweDcwMDMsIDB4MDAwNSwgMHhiMjg0LCAweDA2MDAsIDB4MDExOCwgMHgyMDAxLAorCTB4OGRlMCwgMHgwMDEwLCAweDIwMDEsIDB4OGUxMiwgMHgyMDY4LCAweDcwNGEsIDB4MDE1NiwgMHgyMGE5LAorCTB4MDAzMiwgMHgyMDAzLCAweDAwMDAsIDB4ODAwMCwgMHgxZjA0LCAweDM2OTEsIDB4MDE1ZSwgMHhiMjg0LAorCTB4MDYwMCwgMHgwMTEwLCAweGMyZmMsIDB4MDAwOCwgMHhjMmZkLCAweDZhMTYsIDB4YWQ4MCwgMHgwMDA5LAorCTB4NzA0MiwgMHg2OGI3LCAweDA3MDAsIDB4NjgyMywgMHgwODAwLCAweDY4MjcsIDB4MDAwMywgMHgwMDA1LAorCTB4YzZlYywgMHhhNmFjLCAweDAwNjAsIDB4MDkwNCwgMHgzNmVmLCAweDZiOTgsIDB4NmM5NCwgMHg2OWFjLAorCTB4NjhiMCwgMHhhMTA1LCAweDExZTAsIDB4N2JkMiwgMHg3YmRhLCAweDdjZDYsIDB4N2NkZSwgMHhhNTg2LAorCTB4MDA2MCwgMHgwNWM4LCAweGQ2ZjQsIDB4MTEwOCwgMHhjNmVkLCAweGE2YjQsIDB4YjdmZiwgMHg3ZTVhLAorCTB4MjAwOSwgMHgwMDgzLCAweGQ2OWMsIDB4MDEyOCwgMHgyMDA5LCAweDAwODIsIDB4MjAxOSwgMHgwMDAwLAorCTB4MjMyMCwgMHg3OTFhLCAweGQ2ZWMsIDB4MDU4OCwgMHgwODBjLCAweDQxZDksIDB4MDQ3MCwgMHg2OGIwLAorCTB4YTMxYSwgMHgyMTAwLCAweGE0MjMsIDB4MjQwMCwgMHhhMzA1LCAweDAxZjgsIDB4N2JkMiwgMHg3YmRhLAorCTB4N2NkNiwgMHg3Y2RlLCAweDY4YjAsIDB4ZDZmNCwgMHgxMTA4LCAweGM2ZWQsIDB4YzZmNCwgMHg3ZTVhLAorCTB4MjAxMSwgMHgwMDgzLCAweGQ2OWMsIDB4MDEyOCwgMHgyMDExLCAweDAwODIsIDB4MjAxOSwgMHgwMDAwLAorCTB4MjMyMCwgMHg3YTFhLCAweGQ2ZWMsIDB4MDE4OCwgMHgwODBjLCAweDQyMDYsIDB4MDA3MCwgMHgyMDE5LAorCTB4MDAwMCwgMHgyMzIwLCAweDAwMTAsIDB4YTZiNCwgMHhiN2ZmLCAweDdlNWEsIDB4MjAwOSwgMHgwMDgzLAorCTB4ZDY5YywgMHgwMTEwLCAweDIwMDksIDB4MDA4MiwgMHg3OTFhLCAweDY4YzAsIDB4NzA1NiwgMHgyZDAwLAorCTB4NzA0YSwgMHg2OGM0LCAweDIwNjAsIDB4NzFkMCwgMHgyMDAxLCAweDQ2MDEsIDB4MjAwNCwgMHhkMGM0LAorCTB4MTVjOCwgMHg3MGQ0LCAweGEwMmQsIDB4MDFiOCwgMHhkMWJjLCAweDA1NDgsIDB4N2E4MCwgMHhhMjk0LAorCTB4MGYwMCwgMHg3MGQ4LCAweGEyMDYsIDB4MDExOCwgMHg3OGUwLCAweGE1MDQsIDB4MTU1OCwgMHg3MGQ2LAorCTB4YzFiYywgMHg3MWQyLCAweDA0MzgsIDB4MjAzMSwgMHgwMDAxLCAweDg1MmMsIDB4MDIxOCwgMHg4NjMzLAorCTB4ODIxMCwgMHgwY2Q4LCAweDAwMDUsIDB4N2RlMCwgMHhhNTk0LCAweGZmMDAsIDB4MDEzMCwgMHgyMDExLAorCTB4MDAwOCwgMHg4NTJmLCAweDBjODEsIDB4ODYzNywgMHgwMDA4LCAweDBjNjksIDB4ODIxNywgMHg3ODgwLAorCTB4YTA4NCwgMHgwZjAwLCAweGEyMDYsIDB4MDE3MCwgMHg3MmRhLCAweDc2ZDYsIDB4MDA1OCwgMHg3YTgwLAorCTB4YTI5NCwgMHgwZjAwLCAweDcwZDgsIDB4YTIzNiwgMHgwZGMwLCAweDc4ZTAsIDB4YTUzNCwgMHgwZGE4LAorCTB4YzFiZCwgMHg3MWQyLCAweGQxYjQsIDB4MTkwNCwgMHgyNTlkLCAweDIzMDAsIDB4YTQwNSwgMHgwOTA0LAorCTB4MjU5ZCwgMHg3MGEwLCAweGEwODYsIDB4MDAwMSwgMHgxOTA0LCAweDI1ZTEsIDB4MDAwNSwgMHg2MDIwLAorCTB4YTAwNSwgMHgwMTUwLCAweDgwMDEsIDB4NjAyMiwgMHg2MDA4LCAweGEwODUsIDB4MDAwOCwgMHg2MDBhLAorCTB4NzAwZiwgMHgwMTAwLCAweDcwMmMsIDB4NjAyNiwgMHgwMDA1LCAweGEwMDYsIDB4MDgwYywgMHgzZjI2LAorCTB4NzAwMCwgMHhhMDg2LCAweDAwMDIsIDB4MDEyMCwgMHg3MDYwLCAweGEwODYsIDB4MDAwNSwgMHgxMTUwLAorCTB4NjgyYiwgMHgwMDAwLCAweDY4MTcsIDB4MDAwMCwgMHg2ODFiLCAweDAwMDEsIDB4NjgyMywgMHgwMDQwLAorCTB4NjgxZiwgMHgwMTAwLCAweDcwMDAsIDB4YTA4NCwgMHgwMDBmLCAweDAwMDIsIDB4MjVhMCwgMHgzNzgzLAorCTB4Mzc4MCwgMHgzN2EwLCAweDM3OGMsIDB4MjVhMCwgMHgzNzdlLCAweDM3N2UsIDB4MDgwYywgMHgyNTRjLAorCTB4MDQ0OSwgMHgwNDExLCAweDAwMjgsIDB4MDQzMSwgMHg3MDU4LCAweDIwNjAsIDB4NjgwMCwgMHg2MDAyLAorCTB4MDgwYywgMHgxZGEyLCAweDA4MDQsIDB4MjVhMCwgMHg3MDYwLCAweDcwNjMsIDB4MDAwMCwgMHg3MDdmLAorCTB4MDAwMCwgMHgwMDAyLCAweDM3OWMsIDB4Mzc5YywgMHgzNzlhLCAweDM3OWEsIDB4Mzc5YSwgMHgzNzljLAorCTB4Mzc5YSwgMHgzNzljLCAweDA4MDQsIDB4MmE2YiwgMHg3MDYzLCAweDAwMDAsIDB4MDgwNCwgMHgyNWEwLAorCTB4NjgxYiwgMHgwMDAwLCAweDA4MDQsIDB4MzE4NCwgMHg2ODAwLCAweGEwMDUsIDB4MTEwOCwgMHg2MDAyLAorCTB4NjAwNiwgMHgwMDA1LCAweDY0MTAsIDB4ODRmZiwgMHgwMTY4LCAweDIwMDksIDB4NDYwMiwgMHgyMTA0LAorCTB4ODAwMSwgMHgyMDBhLCAweDg0MjEsIDB4NjQxMiwgMHgxMTI4LCAweDIwMjEsIDB4NDYwNCwgMHgyNDA0LAorCTB4YzBhNSwgMHgyMDIyLCAweDYwMDgsIDB4YzBhNCwgMHg2MDBhLCAweDAwMDUsIDB4NjAxOCwgMHhhMDA1LAorCTB4MDExMCwgMHg4MDAxLCAweDYwMWEsIDB4MDAwNSwgMHgwODBjLCAweDNjNDYsIDB4NjgxYiwgMHgwMDE4LAorCTB4MDQ5MCwgMHgwODBjLCAweDNjNDYsIDB4NjgxYiwgMHgwMDE5LCAweDA0NjgsIDB4MDgwYywgMHgzYzQ2LAorCTB4NjgxYiwgMHgwMDFhLCAweDA0NDAsIDB4MDgwYywgMHgzYzQ2LCAweDY4MWIsIDB4MDAwMywgMHgwNDE4LAorCTB4Nzc3MCwgMHgwODBjLCAweDNiNmYsIDB4NzE3NCwgMHhhMThjLCAweDAwZmYsIDB4MzIxMCwgMHhhMjk0LAorCTB4MDYwMCwgMHgwMTE4LCAweGExZTgsIDB4OGJjMCwgMHgwMDEwLCAweGExZTgsIDB4OGNkMCwgMHgyZDA0LAorCTB4MmQwOCwgMHgyMDY4LCAweGEwMDUsIDB4MTExOCwgMHg3MDdhLCAweDA4MDQsIDB4MjVhMCwgMHg2ODE0LAorCTB4NzI3MCwgMHhhMjA2LCAweDAxMTAsIDB4NjgwMCwgMHgwYzk4LCAweDY4MDAsIDB4MjAwYSwgMHg2ODFiLAorCTB4MDAwNSwgMHg3MDdiLCAweDAwMDAsIDB4MDgwYywgMHgzN2FhLCAweDY4MjAsIDB4ZDA4NCwgMHgxMTEwLAorCTB4MDgwYywgMHgzN2E0LCAweDA4MGMsIDB4MzdiZSwgMHg2ODFmLCAweDAwMDAsIDB4NjgyMywgMHgwMDIwLAorCTB4MDgwYywgMHgxZGEyLCAweDA4MDQsIDB4MjVhMCwgMHhhMjgyLCAweDAwMDMsIDB4MTkwNCwgMHgzYTEwLAorCTB4N2RhOCwgMHhhNWFjLCAweDAwZmYsIDB4N2VhOCwgMHhhNmI0LCAweDAwZmYsIDB4NjkyMCwgMHhjMWJkLAorCTB4NjkyMiwgMHhkMWM0LCAweDA1YjAsIDB4YzFjNCwgMHg2OTIyLCAweGE2YjQsIDB4MDBmZiwgMHgwNTMwLAorCTB4YTY4MiwgMHgwMDE4LCAweDAyMTgsIDB4MDExMCwgMHgyMDMxLCAweDAwMTgsIDB4YTY4NiwgMHgwMDEwLAorCTB4MTEwOCwgMHg4NjMwLCAweDg1MmIsIDB4ODUyYiwgMHgyMDQxLCAweDAwMDAsIDB4MDgwYywgMHgzYWM5LAorCTB4MDExOCwgMHgwODBjLCAweDM4ZjcsIDB4MDBhMCwgMHgwODBjLCAweDNhOTUsIDB4MDgwYywgMHgzOGY0LAorCTB4NjkyMCwgMHhjMWM1LCAweDY5MjIsIDB4N2U1OCwgMHhjNjk1LCAweDdlNWEsIDB4ZDZkNCwgMHgxMTE4LAorCTB4NzgxYiwgMHgwMDZlLCAweDAwMDUsIDB4NzgxYiwgMHgwMDgyLCAweDAwMDUsIDB4MDgwYywgMHgzOGY0LAorCTB4N2U1OCwgMHhkNmQ0LCAweDExMTgsIDB4NzgxYiwgMHgwMDcxLCAweDAwMDUsIDB4NzgxYiwgMHgwMDgzLAorCTB4MDAwNSwgMHgwMGM2LCAweDcwNTQsIDB4MjA2MCwgMHg2MTAwLCAweGQxZTQsIDB4MDU5OCwgMHg2MjA4LAorCTB4ODIxNywgMHhhMjk0LCAweDAwZmYsIDB4YTI4MiwgMHgwMDE4LCAweDAyMTgsIDB4MDExMCwgMHgyMDExLAorCTB4MDAxOCwgMHgyNjAwLCAweGEyMDIsIDB4MTIwOCwgMHgyMjMwLCAweGE2ODYsIDB4MDAxMCwgMHgxMTA4LAorCTB4ODYzMCwgMHg2MjA4LCAweGEyOTQsIDB4MDBmZiwgMHg3OGVjLCAweGQwZTQsIDB4MDEzMCwgMHhhMjgyLAorCTB4MDAwYSwgMHgxMjQwLCAweDIwMTEsIDB4MDAwYSwgMHgwMDI4LCAweGEyODIsIDB4MDAwYywgMHgxMjEwLAorCTB4MjAxMSwgMHgwMDBjLCAweDIyMDAsIDB4YTUwMiwgMHgxMjA4LCAweDIyMjgsIDB4MDgwYywgMHgzYTk5LAorCTB4ODUyYiwgMHg4NTJiLCAweDIwNDEsIDB4MDAwMCwgMHgwODBjLCAweDNhYzksIDB4MDExOCwgMHgwODBjLAorCTB4MzhmNywgMHgwMDIwLCAweDA4MGMsIDB4M2E5NSwgMHgwODBjLCAweDM4ZjQsIDB4Nzg1OCwgMHhjMDk1LAorCTB4Nzg1YSwgMHgwMGNlLCAweDc4MWIsIDB4MDA4MiwgMHgwMDA1LCAweDAwYzYsIDB4Mjk2MCwgMHg2MDAwLAorCTB4ZDBlNCwgMHgxMTg4LCAweGQwYjQsIDB4MTE1MCwgMHg2MDEwLCAweGEwODQsIDB4MDAwZiwgMHgxMTMwLAorCTB4NjEwNCwgMHhhMThjLCAweGZmZjUsIDB4NjEwNiwgMHgwMGNlLCAweDAwMDUsIDB4MjAxMSwgMHgwMDMyLAorCTB4MjAxOSwgMHgwMDAwLCAweDAwZjAsIDB4NjhhMCwgMHhkMGNjLCAweDFkYzAsIDB4NjIwOCwgMHhhMjk0LAorCTB4MDBmZiwgMHg3OGVjLCAweGQwZTQsIDB4MDEzMCwgMHhhMjgyLCAweDAwMGIsIDB4MTIxOCwgMHgyMDExLAorCTB4MDAwYSwgMHgwMDI4LCAweGEyODIsIDB4MDAwYywgMHgxMjEwLCAweDIwMTEsIDB4MDAwYywgMHg2MzA4LAorCTB4ODMxZiwgMHhhMzljLCAweDAwZmYsIDB4YTM4MiwgMHgwMDE4LCAweDAyMTgsIDB4MDExMCwgMHgyMDE5LAorCTB4MDAxOCwgMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwgMHgwMDAzLCAweDc4YWIsIDB4MDAwMSwgMHg3YWFhLAorCTB4N2JhYSwgMHhhOGMwLCAweDAwMDUsIDB4NjgyMCwgMHhjMGM1LCAweDY4MjIsIDB4MDgwYywgMHgzYTU1LAorCTB4MDBjZSwgMHgwMDA1LCAweDAwYzYsIDB4Mjk2MCwgMHg2MTA0LCAweGExOGMsIDB4ZmZmNSwgMHg2MTA2LAorCTB4MjAxMSwgMHgwMDMyLCAweDIwMTksIDB4MDAwMCwgMHgwMDAwLCAweDc4YWIsIDB4MDAwMSwgMHg3OGFiLAorCTB4MDAwMywgMHg3OGFiLCAweDAwMDEsIDB4N2FhYSwgMHg3YmFhLCAweGE4YzAsIDB4MDAwNSwgMHg2ODIwLAorCTB4YzBjNSwgMHg2ODIyLCAweDAwY2UsIDB4MDAwNSwgMHhhMDA2LCAweDIwMzAsIDB4MjAxMCwgMHgwMGM2LAorCTB4NzE1NCwgMHgyMTYwLCAweDIwMTgsIDB4MjAwOCwgMHhhMDg0LCAweGZmZTAsIDB4YTYzNSwgMHg3ZTg2LAorCTB4NjAxOCwgMHg3ODlhLCAweDdlYWUsIDB4NjYxMiwgMHg3OGE0LCAweGEwODQsIDB4Nzc3MCwgMHhhMThjLAorCTB4MDAwZiwgMHhhMTA1LCAweDIwMjksIDB4NDYwNSwgMHgyNTJjLCAweGQ1Y2MsIDB4MDE0MCwgMHhkM2E0LAorCTB4MDExMCwgMHhhMDg1LCAweDA4MDAsIDB4ZDNmYywgMHgwMTEwLCAweGEwODUsIDB4ODA4MCwgMHg3OGE2LAorCTB4NjAxNiwgMHg3ODhhLCAweGE2YjQsIDB4MDAxZiwgMHg4NjM3LCAweDgyMDQsIDB4ODAwNCwgMHhhNjA1LAorCTB4NjAwZSwgMHg2MDA0LCAweGEwODQsIDB4ZmZkNSwgMHg2MDA2LCAweDAwY2UsIDB4MDAwNSwgMHhhMjgyLAorCTB4MDAwMiwgMHgxOTA0LCAweDNhMWEsIDB4N2FhOCwgMHg2OTIwLCAweGMxYmQsIDB4NjkyMiwgMHhkMWNjLAorCTB4MDU2OCwgMHhjMWNjLCAweDY5MjIsIDB4YTI5NCwgMHgwMGZmLCAweGEyODIsIDB4MDAwMiwgMHgxYTA0LAorCTB4M2EwYiwgMHgwODBjLCAweDM5OWUsIDB4MDgwYywgMHgzOGY0LCAweGE5ODAsIDB4MDAwMSwgMHgyMDBjLAorCTB4MDgwYywgMHgzYjZiLCAweDA4MGMsIDB4Mzg5NSwgMHg4OGZmLCAweDAxNzgsIDB4Nzg5YiwgMHgwMDYwLAorCTB4MjgwMCwgMHg3OGFhLCAweDdlNTgsIDB4YzY5NSwgMHg3ZTVhLCAweGQ2ZDQsIDB4MTExOCwgMHg3ODFiLAorCTB4MDA2ZSwgMHgwMDA1LCAweDc4MWIsIDB4MDA4MiwgMHgwMDA1LCAweDdlNTgsIDB4ZDZkNCwgMHgxMTE4LAorCTB4NzgxYiwgMHgwMDcxLCAweDAwMDUsIDB4NzgxYiwgMHgwMDgzLCAweDAwMDUsIDB4YTI4MiwgMHgwMDAyLAorCTB4MTIxOCwgMHhhMjg0LCAweDAwMDEsIDB4MDE0MCwgMHg3MTU0LCAweGExODgsIDB4MDAwMCwgMHgyMTBjLAorCTB4ZDFlYywgMHgxMTEwLCAweDIwMTEsIDB4MDAwMCwgMHgwODBjLCAweDNhODcsIDB4MDQ3OSwgMHgwODBjLAorCTB4MzhmNCwgMHg3ODU4LCAweGMwOTUsIDB4Nzg1YSwgMHg3ODFiLCAweDAwODIsIDB4MDAwNSwgMHgwMGM2LAorCTB4MDAyNiwgMHgyOTYwLCAweDYwMDAsIDB4MjAxMSwgMHgwMDAxLCAweGQwZWMsIDB4MTE1OCwgMHhkMGJjLAorCTB4MTEzOCwgMHg2MDE0LCAweGQwYjQsIDB4MTEyMCwgMHhjMWE0LCAweDYxMDYsIDB4YTAwNiwgMHgwMDg4LAorCTB4MjAxMSwgMHgwMDAwLCAweDc4YWIsIDB4MDAwMSwgMHg3OGFiLCAweDAwMDIsIDB4NzhhYiwgMHgwMDAzLAorCTB4N2FhYSwgMHhhOGMwLCAweDAwMDQsIDB4MDgwYywgMHgzYTU1LCAweDY4MjAsIDB4YTA4NSwgMHgwMjAwLAorCTB4NjgyMiwgMHgwMDJlLCAweDAwY2UsIDB4MDAwNSwgMHg4ODA3LCAweGE3MTUsIDB4MDBjNiwgMHgyMDA5LAorCTB4MDAwMCwgMHg3MDU0LCAweDIwNjAsIDB4ODJmZiwgMHgwMTEwLCAweDIwMDksIDB4MDA0MCwgMHg2MDE4LAorCTB4YTA4MCwgMHgwMDAyLCAweDc4OWEsIDB4NzhhNCwgMHhhMDg0LCAweGZmOWYsIDB4YTEwNSwgMHhjMGVjLAorCTB4ZDBiNCwgMHgxMTA4LCAweGMwZWQsIDB4NjEwMCwgMHhkMWY0LCAweDAxMTAsIDB4YTA4NSwgMHgwMDIwLAorCTB4NzhhNiwgMHg2MDE2LCAweDc4OGEsIDB4NjAwNCwgMHhhMDg0LCAweGZmZWYsIDB4NjAwNiwgMHgwMGNlLAorCTB4MDAwNSwgMHgwMDA2LCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDAxMTAsIDB4MDAwZSwgMHgwMDEwLAorCTB4MDAwZSwgMHgwNDg4LCAweGQ2YWMsIDB4MDU3OCwgMHg3ODg4LCAweGEwODQsIDB4MDA0MCwgMHgwNTU4LAorCTB4N2JiOCwgMHg4MzA3LCAweGEwODQsIDB4MDA3ZiwgMHgxNTA4LCAweDgyMDcsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA5ZSwgMHgwMDAxLCAweDE5MDQsIDB4M2EzMiwgMHhkNmY0LCAweDExZDAsIDB4NzlkOCwgMHg3YWRjLAorCTB4YTEwOCwgMHhhMjkxLCAweDAwMDAsIDB4NzlkMiwgMHg3OWRhLCAweDdhZDYsIDB4N2FkZSwgMHgwODBjLAorCTB4NDJiNSwgMHg3ODFiLCAweDAwODAsIDB4YjI4NCwgMHgwNjAwLCAweDAxMTgsIDB4MjAwMSwgMHgwMDAwLAorCTB4MDAxMCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHg0MTcyLCAweDAwMDUsIDB4MDgwYywgMHgyNTRjLAorCTB4NzgxYiwgMHgwMDgwLCAweDAwMDUsIDB4NzgxYiwgMHgwMDgzLCAweDAwMDUsIDB4MjAzOSwgMHgwMDAwLAorCTB4MjA0MSwgMHgwMDAwLCAweDIwMzEsIDB4MDAwMCwgMHhhMDA2LCAweDIwMTAsIDB4MDgwYywgMHgzOGY3LAorCTB4MDgwYywgMHgzOTljLCAweDdlNTgsIDB4MDgwYywgMHgzYTRlLCAweDc4MWIsIDB4MDA4MiwgMHgwMDA1LAorCTB4MGNkMSwgMHg2ODIwLCAweGMwYzQsIDB4NjgyMiwgMHgwMGM2LCAweDcwNTQsIDB4MjA2MCwgMHgwODBjLAorCTB4MzkyMSwgMHgwMGIwLCAweDBjODEsIDB4NjgyMCwgMHhjMGNjLCAweDY4MjIsIDB4MDBjNiwgMHg3MDU0LAorCTB4MjA2MCwgMHgwODBjLCAweDM5YmIsIDB4MDA2MCwgMHgwYzMxLCAweDY4MjAsIDB4YTA4NCwgMHhlY2ZmLAorCTB4NjgyMiwgMHgwMGM2LCAweDcwNTQsIDB4MjA2MCwgMHg2MDA0LCAweGEwODQsIDB4ZmZjNSwgMHg2MDA2LAorCTB4MDBjZSwgMHgwMDA1LCAweDAwNDksIDB4NzgxYiwgMHgwMDgyLCAweDAwMDUsIDB4NjgyNywgMHgwMDAyLAorCTB4MDA0OSwgMHg3ODFiLCAweDAwODIsIDB4MDAwNSwgMHgyMDAxLCAweDAwMDUsIDB4MDA4OCwgMHgyMDAxLAorCTB4MDAwYywgMHgwMDcwLCAweDY4MjAsIDB4YzBkNSwgMHg2ODIyLCAweDIwMDEsIDB4MDAwNiwgMHgwMDQwLAorCTB4MjAwMSwgMHgwMDBkLCAweDAwMjgsIDB4MjAwMSwgMHgwMDA5LCAweDAwMTAsIDB4MjAwMSwgMHgwMDA3LAorCTB4Nzg5YiwgMHgwMDdlLCAweDc4YWEsIDB4YzY5ZCwgMHg3ZTVhLCAweDcwZDAsIDB4ZDBiNCwgMHgwMTY4LAorCTB4YzBiNCwgMHg3MGQyLCAweDAwYzYsIDB4NzBiNCwgMHhhMDY1LCAweDYwMDgsIDB4YTA4NCwgMHhmYmVmLAorCTB4NjAwYSwgMHg2MDE4LCAweDgwMDEsIDB4NjAxYSwgMHgwMGNlLCAweDAwMDUsIDB4MDA3NiwgMHg4NzNmLAorCTB4YTdiYywgMHgwMDBmLCAweDg3M2IsIDB4ODczYiwgMHg4NzAzLCAweGEwZTAsIDB4NGFjMCwgMHhhZThlLAorCTB4NDY0MCwgMHgwMTEwLCAweGEwZTAsIDB4NGI0MCwgMHhhN2I4LCAweDAwMjAsIDB4N2Y5YSwgMHg3OWE0LAorCTB4YTE4NCwgMHg3ZmUwLCAweDc4YWUsIDB4NjAxMiwgMHg3OWE0LCAweGExODQsIDB4NzczZiwgMHg3OGE2LAorCTB4NjAxNiwgMHg2MDA0LCAweGEwODUsIDB4MDAzOCwgMHg2MDA2LCAweDAwN2UsIDB4MDAwNSwgMHg3ODliLAorCTB4MDA4MCwgMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwgMHgwMDAyLCAweDc4YWIsIDB4MDAwMywgMHg3YWFhLAorCTB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwNCwgMHgwODAwLCAweDIwMzEsIDB4MDAwMCwgMHgyMDI5LAorCTB4MDAzMiwgMHg3ODliLCAweDAwODAsIDB4NzhhYiwgMHgwMDAxLCAweDc4YWIsIDB4MDAwMywgMHg3OGFiLAorCTB4MDAwMSwgMHg3ZGFhLCAweDdlYWEsIDB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwNSwgMHgwODA0LAorCTB4M2E1NSwgMHgwMTU2LCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLCAweDgwMDMsIDB4ODAwMywgMHhhMDgwLAorCTB4MDAyMCwgMHg3ODlhLCAweDc5YTQsIDB4YTE4YywgMHhmZmUwLCAweDIwMjEsIDB4M2I1NCwgMHgyMDE5LAorCTB4MDAxMSwgMHgyMGE5LCAweDAwMGUsIDB4MjAxMSwgMHgwMDMyLCAweDI0MDQsIDB4YTA4NCwgMHhmZmUwLAorCTB4YTEwNiwgMHgwMTI4LCAweDg0MjAsIDB4MjMwMCwgMHhhMjEwLCAweDFmMDQsIDB4M2FiZCwgMHgwMTVlLAorCTB4MDAwNSwgMHgwMTU2LCAweDA0ZjgsIDB4MjAyMSwgMHgzYjYyLCAweDIwYTksIDB4MDAwOSwgMHgyMDExLAorCTB4MDAyOSwgMHhhNTgyLCAweDAwMjgsIDB4MDU1MCwgMHg4NDIwLCAweDk1YTksIDB4MjAxMSwgMHgwMDMzLAorCTB4YTU4MiwgMHgwMDMzLCAweDA2MTgsIDB4ODQyMCwgMHg5NWE5LCAweDIwMTksIDB4MDAwYSwgMHgyMDExLAorCTB4MDA2NSwgMHgyMjAwLCAweGE1MDIsIDB4MDJkMCwgMHg4NDIwLCAweDIzMDAsIDB4YTIxMCwgMHgxZjA0LAorCTB4M2FlMSwgMHgwMTVlLCAweDAwODgsIDB4MjAyMSwgMHgzYjU0LCAweDIwMTksIDB4MDAxMSwgMHgyMGE5LAorCTB4MDAwZSwgMHgyMDExLCAweDAwMzMsIDB4MjIwMCwgMHhhNTAyLCAweDAyNDAsIDB4ODQyMCwgMHgyMzAwLAorCTB4YTIxMCwgMHgxZjA0LCAweDNhZjMsIDB4MDE1ZSwgMHhhMDA2LCAweDAwMDUsIDB4ODIxMSwgMHgwMTVlLAorCTB4YTU4MiwgMHgwMDY0LCAweDEyMjAsIDB4NzgwOCwgMHhhMDg1LCAweDAwNzAsIDB4NzgwYSwgMHgyNDA0LAorCTB4YTAwNSwgMHgwMDA1LCAweGE4ODYsIDB4MDAwMiwgMHgwMWU4LCAweDIwMjEsIDB4M2I0MCwgMHgyMGE5LAorCTB4MDAwZCwgMHgyMDExLCAweDAwMjgsIDB4YTU4MiwgMHgwMDI4LCAweDBkNDgsIDB4ODQyMCwgMHgyMDE5LAorCTB4MDAxOSwgMHgyMDExLCAweDAwMzMsIDB4MjIwMCwgMHhhNTAyLCAweDBlMDAsIDB4ODQyMCwgMHgyMzAwLAorCTB4YTIxMCwgMHgxZjA0LCAweDNiMWIsIDB4MDE1ZSwgMHgyMDExLCAweDAxODQsIDB4YTU4MiwgMHgwMTg1LAorCTB4MGFiMCwgMHgwODkwLCAweDIwMjEsIDB4M2I0ZiwgMHgyMGE5LCAweDAwMDMsIDB4MjAxMSwgMHgwMDI0LAorCTB4YTU4NiwgMHgwMDI0LCAweDA5NjAsIDB4ODQyMCwgMHgyMDExLCAweDAwMjgsIDB4YTU4NiwgMHgwMDI4LAorCTB4MDkzMCwgMHg4NDIwLCAweDIwMTksIDB4MDAxOSwgMHgyMDExLCAweDAwMzMsIDB4MDgwNCwgMHgzYWYzLAorCTB4MTAyMSwgMHgyMjAyLCAweDM0MDMsIDB4NDYwNCwgMHg1ODA1LCAweDZhMDYsIDB4N2MwNywgMHg0NjEwLAorCTB4NDYxMiwgMHg1ODEyLCAweDVhMTIsIDB4NmExNCwgMHg2YzE0LCAweDZlMTQsIDB4N2UxNywgMHg5MDIxLAorCTB4YjAwMiwgMHhlMjA0LCAweGUyMTAsIDB4ZTIxMCwgMHgxMjA5LCAweDMwMDIsIDB4MzIwMiwgMHg0MjAzLAorCTB4NDQwMywgMHg1NDA0LCAweDU2MDQsIDB4NjYwNSwgMHg2ODA1LCAweDc4MDYsIDB4N2EwNiwgMHgwYzA3LAorCTB4MGMwNywgMHgwZTA3LCAweDEwZTEsIDB4MzMwYSwgMHg1ODA1LCAweDVhMDUsIDB4NmEwNiwgMHg2YzA2LAorCTB4N2MwNywgMHg3ZTA3LCAweDBlMDAsIDB4Nzg5YiwgMHgwMDgwLCAweGEwNDYsIDB4MDAwNSwgMHhhNzg0LAorCTB4MGYwMCwgMHg4MDBiLCAweGE3ODQsIDB4MDAxZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLAorCTB4YTEwNSwgMHhkN2ZjLCAweDAxMTgsIDB4YTBlMCwgMHg2YmMwLCAweDAwMTAsIDB4YTBlMCwgMHg0YmMwLAorCTB4MDAwNSwgMHgwMGU2LCAweDAwZjYsIDB4ZDA4NCwgMHgwMTM4LCAweDIwNzksIDB4MDEwMCwgMHgyMDA5LAorCTB4NDY4MCwgMHgyMDcxLCAweDQ2ODAsIDB4MDAzMCwgMHgyMDA5LCAweDQ2NDAsIDB4MjA3OSwgMHgwMjAwLAorCTB4MjA3MSwgMHg0NjQwLCAweDIwOTEsIDB4ODAwMCwgMHgyMTA0LCAweGEwODQsIDB4MDAwZiwgMHgwMDAyLAorCTB4M2JhMiwgMHgzYmEyLCAweDNiYTIsIDB4M2JhMiwgMHgzYmEyLCAweDNiYTIsIDB4M2JhMCwgMHgzYmEwLAorCTB4MDgwYywgMHgyNTRjLCAweDY5YjQsIDB4YzFmNSwgMHhhMThjLCAweGZmOWYsIDB4NjliNiwgMHhhMDA1LAorCTB4MDU4MCwgMHg3ODU4LCAweGEwODQsIDB4ZmY5ZiwgMHhhMDg1LCAweDYwMDAsIDB4Nzg1YSwgMHg3ODI4LAorCTB4YTA4NiwgMHgxODE0LCAweDE1MzAsIDB4Nzg0YiwgMHgwMDA0LCAweDc4NDgsIDB4YTA4NCwgMHgwMDA0LAorCTB4MWRlMCwgMHg3ODRiLCAweDAwMDgsIDB4Nzg0OCwgMHhhMDg0LCAweDAwMDgsIDB4MWRlMCwgMHg3ODMwLAorCTB4ZDBiYywgMHgxMWI4LCAweGIyODQsIDB4MDgwMCwgMHgwMTE4LCAweDAxMDQsIDB4M2JkOSwgMHgwMDEwLAorCTB4MDMwNCwgMHgzYmQ5LCAweDc5ZTQsIDB4YTE4NCwgMHgwMDMwLCAweDAxNTgsIDB4NzhlYywgMHhhMDg0LAorCTB4MDAwMywgMHgwMTM4LCAweDY4MWMsIDB4ZDBhYywgMHgxMTEwLCAweDAwZDksIDB4MDAxMCwgMHg3ODFiLAorCTB4MDBmYiwgMHgwMGZlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDAxLCAweDQ2MDEsIDB4MjAwNCwgMHhkMGFjLAorCTB4MTExOCwgMHg2ODE0LCAweDA4MGMsIDB4MjQ3NSwgMHgwMDA1LCAweDc4MWIsIDB4MDA4MywgMHgwMDA1LAorCTB4NzgxYiwgMHgwMDgyLCAweDAwMDUsIDB4NzgxYiwgMHgwMDcxLCAweDAwMDUsIDB4NzgxYiwgMHgwMDZlLAorCTB4MDAwNSwgMHgyMDA5LCAweDQ2MTksIDB4MjEwYywgMHhhMTg2LCAweDAwMDAsIDB4MDE1MCwgMHhhMTg2LAorCTB4MDAwMSwgMHgwMTUwLCAweDcwMWYsIDB4MDAwYiwgMHg3MDYzLCAweDAwMDEsIDB4NzgxYiwgMHgwMDU0LAorCTB4MDAwNSwgMHg3ODFiLCAweDAwZjMsIDB4MDAwNSwgMHg3MDFmLCAweDAwMGEsIDB4MDAwNSwgMHgyMDA5LAorCTB4NDYxOSwgMHgyMTBjLCAweGExODYsIDB4MDAwMCwgMHgwMTY4LCAweGExODYsIDB4MDAwMSwgMHgwMTM4LAorCTB4NzAxZiwgMHgwMDBiLCAweDcwNjMsIDB4MDAwMSwgMHg3ODFiLCAweDAwNTQsIDB4MDAwNSwgMHg3MDFmLAorCTB4MDAwYSwgMHgwMDA1LCAweDc4MWIsIDB4MDBmMiwgMHgwMDA1LCAweDc4MWIsIDB4MDBmYiwgMHgwMDA1LAorCTB4NzgxYiwgMHgwMGZhLCAweDAwMDUsIDB4NzgxYiwgMHgwMGNjLCAweDAwMDUsIDB4NzgxYiwgMHgwMGNiLAorCTB4MDAwNSwgMHg2ODE4LCAweGQwZmMsIDB4MDExMCwgMHg2ODFiLCAweDAwMWQsIDB4NzA2MywgMHgwMDAxLAorCTB4NzgxYiwgMHgwMDU0LCAweDAwMDUsIDB4NzgzMCwgMHhhMDg0LCAweDAwYzAsIDB4MTE3MCwgMHg3ODA4LAorCTB4YzA4YywgMHg3ODBhLCAweGUwMDAsIDB4ZTAwMCwgMHhlMDAwLCAweGUwMDAsIDB4NzhlYywgMHhhMDg0LAorCTB4MDAyMSwgMHgwMTE4LCAweDc4MDgsIDB4YzA4ZCwgMHg3ODBhLCAweDAwMDUsIDB4NzgwOCwgMHhjMDhkLAorCTB4NzgwYSwgMHgwMDA1LCAweDc4MzAsIDB4YTA4NCwgMHgwMDQwLCAweDFkZTAsIDB4YjI4NCwgMHgwODAwLAorCTB4MDExOCwgMHgxMTA0LCAweDNjNTgsIDB4MDAxMCwgMHgxMzA0LCAweDNjNTgsIDB4NzhhYywgMHgwMDA1LAorCTB4NzgwOCwgMHhhMDg0LCAweGZmZmQsIDB4NzgwYSwgMHhlMDAwLCAweGUwMDAsIDB4ZTAwMCwgMHhlMDAwLAorCTB4NzhlYywgMHhhMDg0LCAweDAwMjEsIDB4MDE0MCwgMHhiMjg0LCAweDA4MDAsIDB4MDExOCwgMHgxMTA0LAorCTB4M2M2NywgMHgwMDEwLCAweDEzMDQsIDB4M2M2YSwgMHg3OGFjLCAweDAwMDYsIDB4NzgwOCwgMHhhMDg1LAorCTB4MDAwMiwgMHg3ODBhLCAweDAwMGUsIDB4MDAwNSwgMHhhNzg0LCAweDAwMDEsIDB4MTkwNCwgMHgzMjJhLAorCTB4YTc4NCwgMHgwMDcwLCAweDAxNDAsIDB4MDBjNiwgMHgyZDYwLCAweDJmNjgsIDB4MDgwYywgMHgyNDY3LAorCTB4MmQ3OCwgMHgyYzY4LCAweDAwY2UsIDB4YTc4NCwgMHgwMDA4LCAweDAxNDgsIDB4Nzg0YiwgMHgwMDA4LAorCTB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MDkwNCwgMHgzMjJhLCAweDA4MDQsIDB4M2JlNSwgMHhhNzg0LAorCTB4MDAwNCwgMHgwMWM4LCAweDc4YjgsIDB4YTA4NCwgMHg4MDAwLCAweDAxYTgsIDB4Nzg0YiwgMHgwMDA4LAorCTB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MDkwNCwgMHgzMjJhLCAweDc4ZTQsIDB4YTA4NCwgMHgwMDA3LAorCTB4YTA4NiwgMHgwMDAxLCAweDExNDAsIDB4NzhjMCwgMHhhNjg1LCAweDQ4MDAsIDB4MjAzMCwgMHg3ZTVhLAorCTB4NzgxYiwgMHgwMGZiLCAweDAwMDUsIDB4YTc4NCwgMHgwMDgwLCAweDAxNDAsIDB4Nzg4NCwgMHhkMGZjLAorCTB4MDEyOCwgMHgwODBjLCAweDNhMzIsIDB4NjgxYiwgMHgwMDIyLCAweDAwMDUsIDB4NjgxYiwgMHgwMDAzLAorCTB4Nzg1OCwgMHhhMDg0LCAweDVmMDAsIDB4NjgxZSwgMHg2ODJmLCAweDAwMDAsIDB4NjgzMywgMHgwMDAwLAorCTB4Nzg0YiwgMHgwMDA4LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDA5MDQsIDB4MmI4OSwgMHhiMjg0LAorCTB4MDgwMCwgMHgwMTEwLCAweDAxMDQsIDB4MjU5ZCwgMHgwMzA0LCAweDI1OWQsIDB4NmIxNCwgMHg4MzA3LAorCTB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGQzZmMsIDB4MDExOCwgMHhhMDgwLAorCTB4NGI0MCwgMHgwMDEwLCAweGEwODAsIDB4NGFjMCwgMHgyMDYwLCAweDIwNDgsIDB4NzA1NiwgMHgyYTYwLAorCTB4MDAwNSwgMHgwMGM2LCAweDI5NjAsIDB4NjAwMCwgMHhkMGFjLCAweDA5MDQsIDB4M2QyZiwgMHg2OGEwLAorCTB4ZDFhYywgMHgxMTIwLCAweGEwODQsIDB4MGUwMCwgMHgwOTA0LCAweDNkMmQsIDB4NjEwOCwgMHg4MTE3LAorCTB4YTE4YywgMHgwMGZmLCAweDYzMWMsIDB4ODMyZiwgMHhkMGRjLCAweDAxMTAsIDB4YTM5ZCwgMHgwMDAxLAorCTB4ZDBjYywgMHgxMWM4LCAweGE1ODQsIDB4MDBmZiwgMHgwMTM4LCAweDc4ZWMsIDB4ZDBlNCwgMHgwMTEwLAorCTB4ODIxMywgMHgwMGI4LCAweDIwMjksIDB4MDAwMCwgMHhhMTgyLCAweDAwMGMsIDB4MTI5MCwgMHg3OGVjLAorCTB4ZDBlNCwgMHgxMTE4LCAweDIwMDksIDB4MDAwYywgMHgwMDYwLCAweGExODIsIDB4MDAwYiwgMHgxMjQ4LAorCTB4MjAwOSwgMHgwMDBhLCAweDAwMzAsIDB4MjAwOSwgMHgwMDMyLCAweDIwMTEsIDB4MDAwMCwgMHgyMDI5LAorCTB4MDAwMCwgMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwgMHgwMDA2LCAweDc4YWIsIDB4MDAwNCwgMHg3OWFhLAorCTB4NzhhYiwgMHgwMDAwLCAweDdhYWEsIDB4N2JhYSwgMHg3ZGFhLCAweGE4YzAsIDB4MDAwOCwgMHg2ODIwLAorCTB4YTA4NSwgMHgxMDAwLCAweDY4MjIsIDB4MDgwYywgMHgzYTU1LCAweGEwODUsIDB4MDAwMSwgMHgwMGNlLAorCTB4MDAwNSwgMHhhMjgyLCAweDAwMDYsIDB4MTkwNCwgMHgzYTI0LCAweDdkYTgsIDB4N2VhYywgMHg4NjM3LAorCTB4YTVhYywgMHgwMGZmLCAweGE2YjQsIDB4MDBmZiwgMHg3ZmFjLCAweDg3NDcsIDB4YTdiYywgMHgwMGZmLAorCTB4YThjNCwgMHgwMGZmLCAweDY5MjAsIDB4YzFiZCwgMHg2OTIyLCAweGQxZTQsIDB4MDkwNCwgMHgzZGEzLAorCTB4YTE4YywgMHhlY2ZmLCAweDY5MjIsIDB4YTc4MiwgMHgwMDAyLCAweDFhMDQsIDB4MzlmZSwgMHhhNmI0LAorCTB4MDBmZiwgMHgwOTA0LCAweDNkYTAsIDB4YTY4MiwgMHgwMDMxLCAweDFhMDQsIDB4MzlmZSwgMHhhNTgyLAorCTB4MDAwOSwgMHgwYTA0LCAweDM5ZmUsIDB4YTg4MiwgMHgwMDAzLCAweDFhMDQsIDB4MzlmZSwgMHhhODg2LAorCTB4MDAwMiwgMHgwMWQwLCAweGE4ODYsIDB4MDAwMCwgMHgxOTA0LCAweDM5ZmUsIDB4MjAwMSwgMHgwMDBjLAorCTB4NzllYywgMHhkMWU0LCAweDAxMTAsIDB4MjAwMSwgMHgwMDBhLCAweGE1MDIsIDB4MTI5MCwgMHgwODBjLAorCTB4MzlmZSwgMHgwMGM2LCAweDI5NjAsIDB4NjAwNCwgMHhhMDg1LCAweDAwMWEsIDB4NjAwNiwgMHg2MDAwLAorCTB4YzBhYywgMHg2MDAyLCAweDAwY2UsIDB4MDAwNSwgMHhhNzg2LCAweDAwMDAsIDB4MDkwNCwgMHgzOWZlLAorCTB4ODYzNCwgMHhhNjgyLCAweDAwMTgsIDB4MDIyOCwgMHgwMTIwLCAweDIwMzEsIDB4MDAxOCwgMHgwODA0LAorCTB4M2RmMSwgMHhhNjg2LCAweDAwMTAsIDB4MTEwOCwgMHg4NjMwLCAweDg1MmIsIDB4ODUyYiwgMHgwODBjLAorCTB4M2FjOSwgMHgwOTA0LCAweDM5ZmUsIDB4MDgwYywgMHgzOGY3LCAweDA4MGMsIDB4Mzk5YywgMHg3ZTU4LAorCTB4ZDZkNCwgMHgxMTE4LCAweDc4MWIsIDB4MDA3MSwgMHgwMDA1LCAweDc4MWIsIDB4MDA4MywgMHgwMDA1LAorCTB4MDgwYywgMHgzOGY0LCAweDBjOTAsIDB4YTg4NiwgMHgwMDAyLCAweDExMDgsIDB4ODYzNCwgMHg3MTU0LAorCTB4YTE4OCwgMHgwMDAwLCAweDIxMGMsIDB4ZDFhYywgMHgwOTA0LCAweDM5ZmUsIDB4ZDFlYywgMHgxMTIwLAorCTB4MjAzOSwgMHgwMDAwLCAweDIwNDEsIDB4MDAwMCwgMHhkMWU0LCAweDExMjAsIDB4MjAzMSwgMHgwMDAwLAorCTB4MjA0MSwgMHgwMDAwLCAweGE3ODIsIDB4MDAwMiwgMHgxMmM4LCAweDYyMWMsIDB4YTI4NCwgMHgwMGZmLAorCTB4YTcwNiwgMHgwMTEwLCAweDIwMzksIDB4MDAwMCwgMHhhNjA1LCAweDAxOTAsIDB4NjEwOCwgMHg4MTFmLAorCTB4YTM5YywgMHgwMGZmLCAweDAxNjgsIDB4YTMwMiwgMHgxMjA4LCAweDIzMzAsIDB4ODgwNywgMHhhNzA1LAorCTB4YTA4NiwgMHgwMjAxLCAweDAxNjAsIDB4YTg4NiwgMHgwMDAwLCAweDAxNjgsIDB4MjAzOSwgMHgwMDAwLAorCTB4MjA0MSwgMHgwMDAwLCAweDIwMzEsIDB4MDAwMCwgMHhhMDA2LCAweDIwMTAsIDB4MDA3MCwgMHhhMjg0LAorCTB4ZmYwMCwgMHgxMTA4LCAweDIwNDAsIDB4YTE4NCwgMHgwMGZmLCAweGE1MDIsIDB4MDEwOCwgMHgyMTI4LAorCTB4ODUyYiwgMHg4NTJiLCAweDA4MGMsIDB4M2FjOSwgMHgwZDU4LCAweDA4MGMsIDB4MzhmNywgMHgwODBjLAorCTB4Mzk5YywgMHg3ODliLCAweDAwODAsIDB4NzhhYiwgMHgwMDAxLCAweDc4YWIsIDB4MDAwNiwgMHg3OGFiLAorCTB4MDAwNCwgMHg3ZGFhLCAweDc4YWIsIDB4MDAwMCwgMHg3ZWFhLCAweDdmYWEsIDB4MjgwMCwgMHg3OGFhLAorCTB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwOCwgMHg2ODIwLCAweGMwZTUsIDB4NjgyMiwgMHgwODBjLAorCTB4M2E1NSwgMHg3ODU4LCAweGMwOTUsIDB4Nzg1YSwgMHg3ODFiLCAweDAwODIsIDB4MDAwNSwgMHgwMDIwLAorCTB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLAorCTB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLAorCTB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLAorCTB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLAorCTB4MDAyMCwgMHgwMDYyLCAweDAwMDksIDB4MDAxNCwgMHgwMDE0LCAweDk4NTUsIDB4OTg0ZCwgMHgwMDE0LAorCTB4OTkxMSwgMHg5OGZmLCAweDAwMTQsIDB4MDAxNCwgMHgwMDkwLCAweDAwZTcsIDB4MDEwMCwgMHgwNDAyLAorCTB4MjAwOCwgMHhmODgwLCAweDAwMTgsIDB4MDAxNywgMHg4NDBmLCAweGQ4YzEsIDB4MDAxNCwgMHgwMDE2LAorCTB4YTIwYSwgMHgwMDE0LCAweDMwMGIsIDB4YTIwYywgMHgwMDE0LCAweDI1MDAsIDB4MDAxMywgMHgyNTAwLAorCTB4MDAxMCwgMHgwMDEwLCAweDAwMTAsIDB4MDAxMCwgMHgwMDEwLCAweDAwMTAsIDB4MDAxMCwgMHgwMDEwLAorCTB4MDAxMCwgMHgwMDEwLCAweDAwMTAsIDB4MDAxMCwgMHgwMDEwLCAweDAwMTAsIDB4YTIwMCwgMHgzODA2LAorCTB4ODgzOSwgMHgyMGM0LCAweDA4NjQsIDB4YTg1MCwgMHgzMDA4LCAweDI4YzEsIDB4OWQxOCwgMHhhMjAxLAorCTB4MzAwYywgMHgyODQ3LCAweDgxNjEsIDB4ODQ2YSwgMHg4MDAwLCAweDg0YTQsIDB4MTg1NiwgMHg4ODNhLAorCTB4YTgwOCwgMHgyOGUyLCAweDljY2UsIDB4YThmMywgMHgwODY0LCAweGE4M2UsIDB4MzAwYywgMHhhODAxLAorCTB4MzAwOCwgMHgyOGUxLCAweDljY2UsIDB4MjhhMiwgMHg3MTYzLCAweGE4MzEsIDB4MjAyMSwgMHhhODE4LAorCTB4YTIwNSwgMHg4NzBjLCAweGQ4ZGUsIDB4NjRhMCwgMHg2ZGUwLCAweDZmYzAsIDB4NjdhNCwgMHg2YzgwLAorCTB4MDIxMiwgMHhhMjA1LCAweDg4M2QsIDB4ODgyYiwgMHgxODE0LCAweDg4M2IsIDB4NzAyNywgMHg4NWYyLAorCTB4YTczNywgMHhhNTMyLCAweGYwMDMsIDB4ODU3NiwgMHg4Njc3LCAweGE4MTMsIDB4ODgzZSwgMHhhODExLAorCTB4Mjg4MiwgMHg3MTYyLCAweGE4MTQsIDB4MjgwYSwgMHhhMjA0LCAweDY0YzAsIDB4NmRlMCwgMHg2N2EwLAorCTB4NmZjMCwgMHgxODE0LCAweDg4M2IsIDB4NzAyMywgMHg4NTc2LCAweDg2NzcsIDB4YTgwMiwgMHg3ODYxLAorCTB4ODgzZSwgMHgyMDZhLCAweDI4YzEsIDB4OWQxOCwgMHgyMDQyLCAweDIxMDEsIDB4YThjYSwgMHgyOTAyLAorCTB4YTIwZSwgMHhhODBiLCAweGEyMDcsIDB4MDAxNCwgMHhhMjAzLCAweDgwMDAsIDB4ODVhNCwgMHgxODcyLAorCTB4ODc5YSwgMHg4ODNjLCAweDFmZTIsIDB4ZjYwMSwgMHhhMjA4LCAweDg1NmUsIDB4NzEyMSwgMHgwMDE0LAorCTB4MDcwNCwgMHgzMDA4LCAweDljY2UsIDB4MDAxNCwgMHhhMjAyLCAweDgwMDAsIDB4ODVhNCwgMHgzMDA5LAorCTB4ODRhOCwgMHgxOWUyLCAweGY4NDQsIDB4ODU2ZSwgMHg4ODNmLCAweDA4ZTYsIDB4YThmNSwgMHhmODYxLAorCTB4YThlYiwgMHhmODAxLCAweDAwMTQsIDB4Zjg4MSwgMHgwMDE2LCAweDg1YjIsIDB4ODBmMCwgMHg5NTMyLAorCTB4ZmFhMiwgMHgxZGUyLCAweDAwMTQsIDB4ODUzMiwgMHhmMjIxLCAweDAwMTQsIDB4MWRlMiwgMHg4NGE4LAorCTB4ZDZlMCwgMHgxZmU2LCAweDAwMTQsIDB4MzAwOCwgMHg4MDAwLCAweDI4NDksIDB4MTAxMSwgMHhhOGZjLAorCTB4MzAwOCwgMHg4MDAwLCAweGEwMDAsIDB4MjA4MSwgMHgyODAyLCAweDEwMTEsIDB4YThmYywgMHhhODg5LAorCTB4MzAwOCwgMHgyMGExLCAweDI4M2MsIDB4MTAxMSwgMHhhOGZjLCAweGEyMDksIDB4MDAxNywgMHgzMDBjLAorCTB4ODAwMCwgMHg4NWE0LCAweDFkZTIsIDB4ZGFjMSwgMHgwMDE0LCAweDAyMTAsIDB4YTgwMSwgMHgwMDE0LAorCTB4MjZlMCwgMHg4NzNhLCAweGZhYTMsIDB4MTlmMiwgMHgyNmUwLCAweDE4ZjIsIDB4MDAxNCwgMHhhMjBiLAorCTB4MDAxNCwgMHhhMjBkLCAweDM4MDYsIDB4MDIxMCwgMHg5ZDIyLCAweDA3MDQsIDB4YTIwNiwgMHg2ODY1LAorCTB4ODE3ZSwgMHg4NDJhLCAweDFkYzEsIDB4ODgyMywgMHgwMDE2LCAweDYwNDIsIDB4ODAwOCwgMHhhOGZhLAorCTB4ODE2MCwgMHg4NDJhLCAweDgxODAsIDB4ZjAyMSwgMHgzMDA4LCAweDg0YTgsIDB4MTFkNywgMHg3MDQyLAorCTB4MjBkZCwgMHgwMDExLCAweDIwZDUsIDB4ODgyMiwgMHgwMDE2LCAweDAwMDAsIDB4MDEyNiwgMHg3MGQwLAorCTB4YTA4NCwgMHg0YzAwLCAweDgwMDQsIDB4MjA5MCwgMHg3MjA0LCAweDcwMDgsIDB4YzA5YywgMHhhMjA1LAorCTB4MTFhMCwgMHg3MjBjLCAweDgyZmYsIDB4MDEyOCwgMHg4YWZmLCAweDExNzgsIDB4NzIwMCwgMHhkMjg0LAorCTB4MTE2MCwgMHg3ODA0LCAweGQwY2MsIDB4MDExMCwgMHgwODBjLCAweDQzMjgsIDB4NzAwNywgMHgwMDA4LAorCTB4NzAwMywgMHgwMDA4LCAweDAxMmUsIDB4MjAwMCwgMHgwMDA1LCAweDcwMDAsIDB4YTA4NCwgMHgwMDAzLAorCTB4NzAwMiwgMHhjNjljLCAweGQwODQsIDB4MDU4OCwgMHg3MTA4LCAweGUwMDAsIDB4NzAwOCwgMHhhMTA2LAorCTB4MWRkOCwgMHhhMTg0LCAweDAwMDMsIDB4MDkwNCwgMHgzZmEyLCAweGExODQsIDB4MDFlMCwgMHgxOTA0LAorCTB4M2ZhMiwgMHhkMWY0LCAweDFkODgsIDB4YTE4NCwgMHgzMDAwLCAweGEwODYsIDB4MTAwMCwgMHgwZDYwLAorCTB4MjAxMSwgMHgwMTgwLCAweDcxMGMsIDB4ODIxMSwgMHgwMTMwLCAweDcwMDgsIDB4ZDBmNCwgMHgxZDIwLAorCTB4NzAwYywgMHhhMTA2LCAweDBkYzAsIDB4NzAwNywgMHgwMDEyLCAweDcxMDgsIDB4ZTAwMCwgMHg3MDA4LAorCTB4YTEwNiwgMHgxZGQ4LCAweGExODQsIDB4MDAwMywgMHgwNTY4LCAweGQxOTQsIDB4MGRiMCwgMHhkMWY0LAorCTB4MDU0OCwgMHg3MDA3LCAweDAwMDIsIDB4MDg4MCwgMHgwNDI4LCAweDcxMDgsIDB4ZDFmYywgMHgwMTMwLAorCTB4MDgwYywgMHg0MGFlLCAweDhhZmYsIDB4MDkwNCwgMHgzZjJjLCAweDBjYjgsIDB4NzAwYywgMHhhMDhjLAorCTB4MDdmZiwgMHgwMWU4LCAweDcwMDQsIDB4ZDA4NCwgMHgwMTc4LCAweDcwMTQsIDB4YTAwNSwgMHgxMTQ4LAorCTB4NzAxMCwgMHg3MzEwLCAweGEzMDYsIDB4MWRlMCwgMHgyMzAwLCAweGEwMDUsIDB4MDEyOCwgMHhhMTAyLAorCTB4MWUyMCwgMHg3MDA3LCAweDAwMTAsIDB4MDAzMCwgMHg4YWZmLCAweDAxNDgsIDB4MDgwYywgMHg0MjZiLAorCTB4MWRlOCwgMHgwOWQ4LCAweDA4MGMsIDB4NDAzNCwgMHgwMTJlLCAweDIwMDAsIDB4MDAwNSwgMHg3MjA0LAorCTB4NzEwOCwgMHhjMTljLCAweDgxMDMsIDB4MTIxOCwgMHg3MDA3LCAweDAwMDIsIDB4MGNjMCwgMHhhMjA1LAorCTB4MWQ4OCwgMHg3MDA3LCAweDAwMDgsIDB4NzAwMywgMHgwMDA4LCAweDAwMDYsIDB4MjAwMSwgMHg0NjAxLAorCTB4MjAwNCwgMHhkMGNjLCAweDAxMTAsIDB4MDgwYywgMHg0MzI4LCAweDAwMGUsIDB4MDEyZSwgMHgyMDAwLAorCTB4MDAwNSwgMHg2NDI4LCAweDg0ZmYsIDB4MDUwOCwgMHgyYzcwLCAweDcwMDQsIDB4YTBiYywgMHgwMDBmLAorCTB4YTdiOCwgMHgzZmY1LCAweDI3M2MsIDB4ODdmYiwgMHgxMTQ4LCAweDAyMTAsIDB4MDgwYywgMHgyNTRjLAorCTB4NjA5YywgMHhhMDc1LCAweDAxOTAsIDB4MGM4OCwgMHgyMDM5LCAweDNmZWEsIDB4MjcwNCwgMHhhZTY4LAorCTB4NjgwOCwgMHhhNjMwLCAweDY4MGMsIDB4YTUyOSwgMHg4NDIxLCAweDAxMzgsIDB4ODczOCwgMHgyNzA0LAorCTB4YTAwNSwgMHgxZGE4LCAweDcwOWMsIDB4YTA3NSwgMHgxZDAwLCAweDAwMDUsIDB4MDAwMCwgMHgwMDA1LAorCTB4MDAwOSwgMHgwMDBkLCAweDAwMTEsIDB4MDAxNSwgMHgwMDE5LCAweDAwMWQsIDB4MDAwMCwgMHgwMDAzLAorCTB4MDAwOSwgMHgwMDBmLCAweDAwMTUsIDB4MDAxYiwgMHgwMDAwLCAweDAwMDAsIDB4M2ZlYSwgMHgzZmU3LAorCTB4MDAwMCwgMHgwMDAwLCAweDgwMDAsIDB4MDAwMCwgMHgzZmVhLCAweDAwMDAsIDB4M2ZmMiwgMHgzZmVmLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzZmYyLCAweDAwMDAsIDB4M2ZlZCwgMHgzZmVkLAorCTB4MDAwMCwgMHgwMDAwLCAweDgwMDAsIDB4MDAwMCwgMHgzZmVkLCAweDAwMDAsIDB4M2ZmMywgMHgzZmYzLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzZmYzLCAweDIwNzksIDB4NDYwMCwgMHgyMDcxLAorCTB4MDAxMCwgMHg3MDA3LCAweDAwMGEsIDB4NzAwNywgMHgwMDAyLCAweDcwMDMsIDB4MDAwMSwgMHgyMDA5LAorCTB4MDAwMiwgMHgyMDcxLCAweDAwNTAsIDB4NzAwNywgMHgwMDBhLCAweDcwMDcsIDB4MDAwMiwgMHg3MDAzLAorCTB4MDAwMCwgMHgyMDAxLCAweDAxZmYsIDB4MjAwNCwgMHhkMGZjLCAweDExMjgsIDB4ODEwOSwgMHgwMTE4LAorCTB4MjA3MSwgMHgwMDIwLCAweDBjODAsIDB4MDAwNSwgMHg3MDA0LCAweDgwMDQsIDB4MWEwNCwgMHg0MDhhLAorCTB4NzEwOCwgMHg3MDA4LCAweGExMDYsIDB4MWRlMCwgMHhhMTg0LCAweDAxZTAsIDB4MDEyMCwgMHgwODBjLAorCTB4NDBlNiwgMHgwODA0LCAweDQwYWEsIDB4NzAwNywgMHgwMDEyLCAweDIwMTksIDB4MDAwMCwgMHg3MTA4LAorCTB4NzAwOCwgMHhhMTA2LCAweDFkZTAsIDB4YTE4NCwgMHgwMWUwLCAweDAxMjAsIDB4MDgwYywgMHg0MGU2LAorCTB4MDgwNCwgMHg0MGFhLCAweGExOWMsIDB4MzAwYywgMHhhMzg2LCAweDIwMDQsIDB4MDE5MCwgMHhhMzg2LAorCTB4MDAwOCwgMHgwMWMwLCAweDcwMDQsIDB4ZDA4NCwgMHgxMTQ4LCAweDcxMDgsIDB4NzAwOCwgMHhhMTA2LAorCTB4MWRlMCwgMHhhMTg0LCAweDAwMDMsIDB4MDExMCwgMHgwODA0LCAweDQwZTYsIDB4YTM4NiwgMHgyMDBjLAorCTB4MTlmMCwgMHg3MjAwLCAweDgyMDQsIDB4MDIzMCwgMHg3MzBjLCAweGEzODQsIDB4MDdmZiwgMHgwMTEwLAorCTB4MDgwYywgMHgyNTRjLCAweDcxMDgsIDB4NzAwOCwgMHhhMTA2LCAweDFkZTAsIDB4YTE4NCwgMHgwMWUwLAorCTB4MDExOCwgMHgwODBjLCAweDQwZTYsIDB4MDQ3MCwgMHg3MDA3LCAweDAwMTIsIDB4NzAwMCwgMHhkMDg0LAorCTB4MTE0OCwgMHg3MzEwLCAweDcwMTQsIDB4YTMwNSwgMHgwMTI4LCAweDcxMGMsIDB4YTE4NCwgMHgwN2ZmLAorCTB4MTkwNCwgMHg0MDM0LCAweDcxMDgsIDB4NzAwOCwgMHhhMTA2LCAweDFkZTAsIDB4YTE4NCwgMHgwMWUwLAorCTB4MDExOCwgMHgwODBjLCAweDQwZTYsIDB4MDBiMCwgMHg3MDA3LCAweDAwMTIsIDB4NzAwNywgMHgwMDA4LAorCTB4NzAwNCwgMHhkMDljLCAweDFkZTgsIDB4NzEwOCwgMHg3MDA4LCAweGExMDYsIDB4MWRlMCwgMHhhMTg0LAorCTB4MDFlMCwgMHgwMTE4LCAweDA4MGMsIDB4NDBlNiwgMHgwMDI4LCAweDcwMDcsIDB4MDAxMiwgMHg3MTA4LAorCTB4ODEwMywgMHgwZTg4LCAweDcwMDMsIDB4MDAwOCwgMHgwMDA1LCAweDcxMDgsIDB4YTE4NCwgMHgwMWUwLAorCTB4MTVhOCwgMHg3MTA4LCAweGExODQsIDB4MDFlMCwgMHgxNTg4LCAweGExODQsIDB4MDAwNywgMHgwMDAyLAorCTB4NDBjMiwgMHg0MGQwLCAweDQwYzAsIDB4NDBkMCwgMHg0MGMwLCAweDQxMjAsIDB4NDBjMCwgMHg0MTFlLAorCTB4MDgwYywgMHgyNTRjLCAweDcwMDQsIDB4YTA4NCwgMHgwMDEwLCAweGMwOGQsIDB4NzAwNiwgMHg4YWZmLAorCTB4MTExOCwgMHgyMDQ5LCAweDAwMDAsIDB4MDAwNSwgMHgwODBjLCAweDQyNmIsIDB4MWRlOCwgMHgwMDA1LAorCTB4NzAwNCwgMHhhMDg0LCAweDAwMTAsIDB4YzA4ZCwgMHg3MDA2LCAweDcwMDQsIDB4ZDA4NCwgMHgxMTQwLAorCTB4NzEwOCwgMHg3MDA4LCAweGExMDYsIDB4MWRlMCwgMHhhMTg0LCAweDAwMDMsIDB4MDEwOCwgMHgwMDMwLAorCTB4OGFmZiwgMHgwMTE4LCAweDA4MGMsIDB4NDI2YiwgMHgxZGU4LCAweDAwMDUsIDB4NzAwNywgMHgwMDEyLAorCTB4NzEwOCwgMHgxZDA0LCAweDQwZTksIDB4MjA5MSwgMHg2MDAwLCAweDFkMDQsIDB4NDBlZCwgMHgyMDkxLAorCTB4NjAwMCwgMHg3MDA3LCAweDAwMTIsIDB4NzAwNywgMHgwMDA4LCAweDcwMDQsIDB4ZDA5YywgMHgxZGU4LAorCTB4NzAwNywgMHgwMDEyLCAweDcxMDgsIDB4ZDFmYywgMHgxZGQ4LCAweDcwMDMsIDB4MDAwMCwgMHg3MDAwLAorCTB4YTAwNSwgMHgxMTMwLCAweDcwMDQsIDB4YTAwNSwgMHgxMTE4LCAweDcwMGMsIDB4YTAwNSwgMHgwMTA4LAorCTB4MGM0MCwgMHgyMDQ5LCAweDAwMDAsIDB4YjI4NCwgMHgwMjAwLCAweDAxMTgsIDB4MjAwMSwgMHgwMDAwLAorCTB4MDAxMCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgzYjgxLCAweDY4MWIsIDB4MDAwMiwgMHgyMDUxLAorCTB4MDAwMCwgMHgwMDA1LCAweDA4MGMsIDB4MjU0YywgMHgwODBjLCAweDI1NGMsIDB4MDgwYywgMHg0MTVmLAorCTB4NzIxMCwgMHg3MTE0LCAweDcwMGMsIDB4YTA5YywgMHgwN2ZmLCAweDI4MDAsIDB4YTMwMCwgMHhhMjExLAorCTB4YTE4OSwgMHgwMDAwLCAweDA0YTEsIDB4MjcwNCwgMHgyYzU4LCAweGFjNjAsIDB4NjMwOCwgMHgyMjAwLAorCTB4YTMyMiwgMHg2MzBjLCAweDIxMDAsIDB4YTMxYiwgMHgyNDAwLCAweGEzMDUsIDB4MDE0MCwgMHgxMjM4LAorCTB4ODQxMiwgMHg4MjEwLCAweDgzMGEsIDB4YTE4OSwgMHgwMDAwLCAweDJiNjAsIDB4MGM1OCwgMHgyYjYwLAorCTB4OGEwNywgMHgwMDA2LCAweDYwMDQsIDB4ZDA5YywgMHgwMTE4LCAweGE3YmEsIDB4M2ZlZiwgMHgwMDEwLAorCTB4YTdiYSwgMHgzZmU3LCAweDAwMGUsIDB4YTczZCwgMHgyYzAwLCAweDY4ODYsIDB4NmY4YSwgMHg2YzkyLAorCTB4NmI4ZSwgMHg3MTA4LCAweDcwMDgsIDB4YTEwNiwgMHgxZGUwLCAweGExODQsIDB4MDFlMCwgMHgwMTEwLAorCTB4MDgwYywgMHg0MGU2LCAweDcwMDcsIDB4MDAxMiwgMHgwODBjLCAweDQwMzQsIDB4MDAwNSwgMHg4YTUwLAorCTB4ODczOSwgMHgyNzA0LCAweGEwMDQsIDB4MTE2OCwgMHg2MDAwLCAweGEwNjQsIDB4MTEwOCwgMHgyZDYwLAorCTB4NjAwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHg0MDA1LCAweDIwM2MsIDB4ODdmYiwgMHgwOTBjLAorCTB4MjU0YywgMHgwMDA1LCAweDAxMjYsIDB4MDBkNiwgMHg3MGQwLCAweGEwODQsIDB4NGMwMCwgMHg4MDA0LAorCTB4MjA5MCwgMHgwMGRlLCAweDY4ODQsIDB4MjA2MCwgMHg2ODg4LCAweDZiOGMsIDB4NmM5MCwgMHg4MDU3LAorCTB4YWFkNCwgMHgwMGZmLCAweGEwODQsIDB4MDBmZiwgMHgwMDA2LCAweDY4MDQsIDB4YTA4NCwgMHgwMDA4LAorCTB4MDAwZSwgMHgwMTE4LCAweGEwYjgsIDB4M2ZlZiwgMHgwMDEwLCAweGEwYjgsIDB4M2ZlNywgMHhiMjg0LAorCTB4MDIwMCwgMHgwMTEwLCAweDdlMjAsIDB4MDAwOCwgMHg3ZTI0LCAweGE2YjUsIDB4MDAwYywgMHg2ODFjLAorCTB4ZDBiNCwgMHgwMTA4LCAweGM2ODUsIDB4MjQwMCwgMHhhMzA1LCAweDA1MTgsIDB4MmM1OCwgMHgyNzA0LAorCTB4NjEwNCwgMHhhYzYwLCAweDYwMDAsIDB4YTQwMCwgMHg3MDFhLCAweDYwMDQsIDB4YTMwMSwgMHg3MDFlLAorCTB4ZDE5YywgMHgwMTQwLCAweDYwMTAsIDB4YTA4MSwgMHgwMDAwLCAweDcwMjIsIDB4NjAxNCwgMHhhMDgxLAorCTB4MDAwMCwgMHg3MDI2LCAweDYyMDgsIDB4MjQwMCwgMHhhMjAyLCAweDcwMTIsIDB4NjIwYywgMHgyMzAwLAorCTB4YTIwMywgMHg3MDE2LCAweDc2MDIsIDB4NzAwNywgMHgwMDAxLCAweDJiNjAsIDB4MDgwYywgMHg0MjkyLAorCTB4MDAxMCwgMHgwODBjLCAweDQyNmIsIDB4MWRlOCwgMHgwMTJlLCAweDIwMDAsIDB4MDAwNSwgMHgwMTI2LAorCTB4MDBkNiwgMHg3MGQwLCAweGEwODQsIDB4NGMwMCwgMHg4MDA0LCAweDIwOTAsIDB4MDBkZSwgMHg3MDA3LAorCTB4MDAwNCwgMHg3MDA0LCAweGQwOTQsIDB4MWRlOCwgMHg3MDAzLCAweDAwMDgsIDB4MDEyZSwgMHgyMDAwLAorCTB4MDAwNSwgMHgwMTI2LCAweDAwZDYsIDB4NzBkMCwgMHhhMDg0LCAweDRjMDAsIDB4ODAwNCwgMHgyMDkwLAorCTB4MDBkZSwgMHg3ZTIwLCAweGIyODQsIDB4MDIwMCwgMHgxMTA4LCAweDdlMjQsIDB4YTZiNSwgMHgwMDBjLAorCTB4NjgxYywgMHhkMGFjLCAweDExMTgsIDB4YzY4NSwgMHg3MDAzLCAweDAwMDAsIDB4NjgyOCwgMHgyMDUwLAorCTB4MmQ2MCwgMHg2MDA0LCAweGEwYmMsIDB4MDAwZiwgMHhhN2I4LCAweDNmZjUsIDB4MjczYywgMHg4N2ZiLAorCTB4MTEzOCwgMHgwMjEwLCAweDA4MGMsIDB4MjU0YywgMHg2ODljLCAweGEwNjUsIDB4MDEyMCwgMHgwYzg4LAorCTB4MDgwYywgMHg0MjZiLCAweDFkZTgsIDB4MDEyZSwgMHgyMDAwLCAweDAwMDUsIDB4MDEyNiwgMHgwMDA2LAorCTB4MDAxNiwgMHgwMGQ2LCAweDcwZDAsIDB4YTA4NCwgMHg0YzAwLCAweDgwMDQsIDB4MjA5MCwgMHg3ZTIwLAorCTB4YjI4NCwgMHgwMjAwLCAweDExMDgsIDB4N2UyNCwgMHgwMGRlLCAweDAwM2UsIDB4MDA0ZSwgMHhhNmI1LAorCTB4MDAwYywgMHg2ODFjLCAweGQwYjQsIDB4MDEyOCwgMHhjNjg1LCAweDcwMDMsIDB4MDAwMCwgMHg3MDA3LAorCTB4MDAwNCwgMHgyMDQ5LCAweDQyMDYsIDB4NjgyOCwgMHhhMDU1LCAweDAwZDYsIDB4MDkwNCwgMHg0MjY3LAorCTB4MmQ3MCwgMHgyZTYwLCAweDcwMDQsIDB4YTBiYywgMHgwMDBmLCAweGE3YjgsIDB4M2ZmNSwgMHgyNzNjLAorCTB4ODdmYiwgMHgxMTQwLCAweDAyMTAsIDB4MDgwYywgMHgyNTRjLCAweDcwOWMsIDB4YTA3NSwgMHgyMDYwLAorCTB4MDU3MCwgMHgwYzgwLCAweDI3MDQsIDB4YWU2OCwgMHg2ODA4LCAweGE0MjIsIDB4NjgwYywgMHhhMzFiLAorCTB4MDI2OCwgMHg4YTUxLCAweDExMTAsIDB4MDgwYywgMHgyNTRjLCAweDg3MzgsIDB4MjcwNCwgMHhhMDA1LAorCTB4MWQ5MCwgMHg3MDljLCAweGEwNzUsIDB4MjA2MCwgMHgwMWQwLCAweDA4ZTAsIDB4ODQyMiwgMHg4NDIwLAorCTB4ODMxYSwgMHhhMzk5LCAweDAwMDAsIDB4NjkwOCwgMHgyNDAwLCAweGExMjIsIDB4NjkwYywgMHgyMzAwLAorCTB4YTExYiwgMHgxMjEwLCAweDA4MGMsIDB4MjU0YywgMHhiMjg0LCAweDAyMDAsIDB4MDExOCwgMHgyMDcxLAorCTB4MDA1MCwgMHgwMDEwLCAweDIwNzEsIDB4MDAyMCwgMHgwMGRlLCAweDA4MDQsIDB4NDE5YiwgMHgwMGRlLAorCTB4MDEyZSwgMHgyMDAwLCAweDAwMDUsIDB4NzAwOCwgMHgwMDA2LCAweGEwODQsIDB4MDFlMCwgMHgwMDBlLAorCTB4MDExMCwgMHhhMDA2LCAweDAwMDUsIDB4YTA4NCwgMHgwMDAzLCAweGEwODYsIDB4MDAwMywgMHgxMTA4LAorCTB4MDAwNSwgMHgyNzA0LCAweGFjNzgsIDB4NzgwMCwgMHg3MDFhLCAweDc4MDQsIDB4NzAxZSwgMHg3ODA4LAorCTB4NzAxMiwgMHg3ODBjLCAweDcwMTYsIDB4NjAwNCwgMHhkMDljLCAweDAxMjAsIDB4NzgxMCwgMHg3MDIyLAorCTB4NzgxNCwgMHg3MDI2LCAweDc2MDIsIDB4NzAwNCwgMHhhMDg0LCAweDAwMTAsIDB4YzA4NSwgMHg3MDA2LAorCTB4MjA3OSwgMHg0NjAwLCAweDhhNTEsIDB4MDFlOCwgMHg4NzM4LCAweDI3MDQsIDB4YTAwNSwgMHgxMTY4LAorCTB4NjA5YywgMHhhMDA1LCAweDAxYjgsIDB4MjA2MCwgMHg2MDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLAorCTB4M2ZmNSwgMHgyMDNjLCAweDg3ZmIsIDB4MDkwYywgMHgyNTRjLCAweDcwMDgsIDB4MDAwNiwgMHhhMDg0LAorCTB4MDFlMCwgMHgwMDBlLCAweDAxMTAsIDB4YTAwNiwgMHgwMDI4LCAweGEwODQsIDB4MDAwMywgMHhhMDg2LAorCTB4MDAwMywgMHgwMDA1LCAweDIwNTEsIDB4MDAwMCwgMHgwMDA1LCAweDAxMjYsIDB4MDAwNiwgMHgwMGQ2LAorCTB4NzBkMCwgMHhhMDg0LCAweDRjMDAsIDB4ODAwNCwgMHgyMDkwLCAweDAwZGUsIDB4MDA4ZSwgMHg3MTA4LAorCTB4YTE4NCwgMHgwMDAzLCAweDExMjgsIDB4NjgyOCwgMHhhMDA1LCAweDAxNzgsIDB4MDgwNCwgMHgzZjQ1LAorCTB4NzEwOCwgMHhkMWZjLCAweDAxMTgsIDB4MDgwYywgMHg0MGFlLCAweDBjODgsIDB4NzAwNywgMHgwMDEwLAorCTB4NzEwOCwgMHhkMWZjLCAweDBkZTgsIDB4MDgwYywgMHg0MGFlLCAweDcwMDgsIDB4YTA4NiwgMHgwMDA4LAorCTB4MWQzMCwgMHg3MDAwLCAweGEwMDUsIDB4MWQxOCwgMHg3MDAzLCAweDAwMDAsIDB4MjA0OSwgMHgwMDAwLAorCTB4MDAwNiwgMHgyMDAxLCAweDQ2MDEsIDB4MjAwNCwgMHhkMGNjLCAweDAxMTAsIDB4MDgwYywgMHg0MzI4LAorCTB4MDAwZSwgMHgwMTJlLCAweDIwMDAsIDB4MDAwNSwgMHgwMTI2LCAweDAxNDYsIDB4MDEzNiwgMHgwMTU2LAorCTB4MDBjNiwgMHgwMGQ2LCAweDcwZDAsIDB4YTA4NCwgMHg0YzAwLCAweDgwMDQsIDB4MjA5MCwgMHgwMGRlLAorCTB4MjA0OSwgMHg0MmVjLCAweGFkODAsIDB4MDAxMSwgMHgyMGEwLCAweGIyODQsIDB4MDIwMCwgMHgwMTE4LAorCTB4MjA5OSwgMHgwMDMyLCAweDAwMTAsIDB4MjA5OSwgMHgwMDMxLCAweDcwMGMsIDB4YTA4NCwgMHgwN2ZmLAorCTB4NjgyYSwgMHg3MDA3LCAweDAwMDgsIDB4NzAwNywgMHgwMDAyLCAweDcwMDMsIDB4MDAwMSwgMHgwMTE4LAorCTB4ODAwMCwgMHg4MGFjLCAweDUzYTUsIDB4NzAwYywgMHhhMDg0LCAweDA3ZmYsIDB4MDEzMCwgMHg3MDA3LAorCTB4MDAwNCwgMHg3MDA0LCAweGEwODQsIDB4MDAwNCwgMHgxZGUwLCAweDAwY2UsIDB4MjA0OSwgMHgwMDAwLAorCTB4NzAwMywgMHgwMDAwLCAweDAxNWUsIDB4MDEzZSwgMHgwMTRlLCAweDAxMmUsIDB4MjAwMCwgMHgwMDA1LAorCTB4NjgxNCwgMHhkMGZjLCAweDA5MDQsIDB4NDM2YiwgMHg3MDAwLCAweGQwODQsIDB4MDVlMCwgMHg3ZTI0LAorCTB4YTZiNSwgMHgwMDA0LCAweDcwMDcsIDB4MDAwNCwgMHg3MDA0LCAweGEwODQsIDB4MDAwNCwgMHgxZGUwLAorCTB4NzExOCwgMHgwMDE2LCAweDcxMWMsIDB4MDAxNiwgMHg3MTIwLCAweDAwMTYsIDB4NzEyNCwgMHgwMDE2LAorCTB4NzAxYiwgMHgwMDAwLCAweDcwMWYsIDB4M2ZmZiwgMHg3MDIzLCAweDAwMDAsIDB4NzAyNywgMHgwMDAwLAorCTB4NzAxMywgMHgwMDA0LCAweDcwMTcsIDB4MDAwMCwgMHg3NjAyLCAweDcwMDcsIDB4MDAwMSwgMHgyMDAxLAorCTB4ZmZmZiwgMHgyMDA5LCAweDAwMzEsIDB4MjAwYSwgMHgyMDBhLCAweDcxMDgsIDB4NzAwOCwgMHhhMTA2LAorCTB4MWRlMCwgMHhkMWZjLCAweDBkZDAsIDB4MDAyZSwgMHg3MjI2LCAweDAwMmUsIDB4NzIyMiwgMHgwMDJlLAorCTB4NzIxZSwgMHgwMDJlLCAweDcyMWEsIDB4NzAwNywgMHgwMDAyLCAweDcwMDgsIDB4YTA4NiwgMHgwMDA4LAorCTB4MDExMCwgMHgwODA0LCAweDQwZTYsIDB4NzAwNywgMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwgMHgwMDA1LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwOTEsIDB4NjAwMCwgMHg3OGFjLCAweGEwMDUsIDB4MTE2OCwgMHg3OTc0LAorCTB4NzBkMCwgMHhhMTA2LCAweDExNDgsIDB4NzgxYywgMHhhMDA1LCAweDAxMzAsIDB4NzgxZiwgMHgwMDAwLAorCTB4MGUwNCwgMHg0Mzg0LCAweDIwOTEsIDB4NDA4MCwgMHgyMDY5LCAweDQ2ODAsIDB4ZDdmYywgMHgxMTEwLAorCTB4MjA2OSwgMHg0NjQwLCAweDY4MDAsIDB4YTA4NCwgMHgwMDBmLCAweDExOTgsIDB4NjhkMCwgMHhkMGI0LAorCTB4MDE4MCwgMHhkMGJjLCAweDExNzAsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4ZDdmYywgMHgxMTEwLAorCTB4MjA3OSwgMHgwMjAwLCAweDc4MzAsIDB4YTA4NCwgMHgwMGMwLCAweDExMTAsIDB4MDgwYywgMHgyMmFlLAorCTB4MDBmZSwgMHg3ODMwLCAweDgwMDEsIDB4NzgzMiwgMHgxOTA0LCAweDQ0MGIsIDB4NzgzNCwgMHg3ODMyLAorCTB4MjA2MSwgMHg2YmMwLCAweDIwNjksIDB4NDY4MCwgMHhjN2ZkLCAweDY4Y2MsIDB4YTAwNSwgMHgwMTI4LAorCTB4ODAwMSwgMHg2OGNlLCAweDExMTAsIDB4MDgwYywgMHg0NTc3LCAweDY4MDAsIDB4YTA4NCwgMHgwMDBmLAorCTB4MDE2OCwgMHhhMDg2LCAweDAwMDEsIDB4MDE1MCwgMHg2ODQwLCAweGEwMGQsIDB4MDEzOCwgMHgyMTA0LAorCTB4YTAwNSwgMHgwMTIwLCAweDgwMDEsIDB4MjAwYSwgMHgwOTA0LCAweDQ1MTQsIDB4NjgxNCwgMHhhMDA1LAorCTB4MDFhOCwgMHg4MDAxLCAweDY4MTYsIDB4MTE5MCwgMHg2OGEzLCAweDAwMDEsIDB4MDBmNiwgMHhkN2ZjLAorCTB4MTExOCwgMHgyMDc5LCAweDAyMDAsIDB4MDAxMCwgMHgyMDc5LCAweDAxMDAsIDB4MDgwYywgMHgzYzQ2LAorCTB4MDBmZSwgMHg2ODYwLCAweGEwMDUsIDB4MDExMCwgMHgwODBjLCAweDIyYWUsIDB4Njg3YywgMHhhMDA1LAorCTB4MDE0MCwgMHg4MDAxLCAweDY4N2UsIDB4MTEyOCwgMHg2ODYzLCAweDAwMDAsIDB4NjhkMCwgMHhjMGM1LAorCTB4NjhkMiwgMHg2OGQwLCAweGQwZmMsIDB4MDFiMCwgMHhjMGZjLCAweDY4ZDIsIDB4MjBhOSwgMHgwMjAwLAorCTB4NjAzNCwgMHhhMDA1LCAweDAxNTgsIDB4ODAwMSwgMHg2MDM2LCAweDY4ZDAsIDB4YzBmZCwgMHg2OGQyLAorCTB4MTEyOCwgMHg2MDEwLCAweGEwMDUsIDB4MDExMCwgMHgwODBjLCAweDIyYWUsIDB4YWNlMCwgMHgwMDEwLAorCTB4MWYwNCwgMHg0M2YwLCAweGQ3ZmMsIDB4MDEzOCwgMHgyMDYxLCAweDRiYzAsIDB4MjA2OSwgMHg0NjQwLAorCTB4YzdmYywgMHgwODA0LCAweDQzYWQsIDB4MDQ1OSwgMHg3ODM4LCAweDgwMDEsIDB4NzgzYSwgMHgxMWEwLAorCTB4NzgzYywgMHg3ODNhLCAweDIwNjEsIDB4NGJjMCwgMHgyMDY5LCAweDQ2NDAsIDB4YzdmYywgMHg2ODBjLAorCTB4YTAwNSwgMHgwMTEwLCAweDA4MGMsIDB4NDQ4NywgMHhkN2ZjLCAweDExMzAsIDB4MjA2MSwgMHg2YmMwLAorCTB4MjA2OSwgMHg0NjgwLCAweGM3ZmQsIDB4MGM5OCwgMHg3ODEwLCAweGQwY2MsIDB4MDE2OCwgMHhkMGFjLAorCTB4MTEyMCwgMHhkMGE0LCAweDAxNDgsIDB4YzBhZCwgMHg3ODEyLCAweDIwOTEsIDB4ODAwMSwgMHgwZTA0LAorCTB4NDQzMywgMHgwODBjLCAweDIwN2EsIDB4MDAwNSwgMHgyMDkxLCAweDgwMDEsIDB4MDAwNSwgMHg3ODQwLAorCTB4ODAwMSwgMHg3ODQyLCAweDE5MDQsIDB4NDQ4NiwgMHg3ODQ0LCAweDc4NDIsIDB4MjA2OSwgMHg0NjQwLAorCTB4YzdmYywgMHgyMDc5LCAweDAyMDAsIDB4NjhkNCwgMHhhMDA1LCAweDAxMzgsIDB4N2RlMCwgMHhhNTA0LAorCTB4MTEyMCwgMHg2OGQ2LCAweDY4ZDAsIDB4YzBiYywgMHg2OGQyLCAweDIwNzksIDB4NDYwMCwgMHg2ODEwLAorCTB4YTAwNSwgMHgxMTEwLCAweDIwMDEsIDB4MDEwMSwgMHg4MDAxLCAweDY4MTIsIDB4ZDdmYywgMHgwMTE4LAorCTB4YTA4MCwgMHg4Y2QwLCAweDAwMTAsIDB4YTA4MCwgMHg4YmMwLCAweDIwNDAsIDB4MjAwNCwgMHhhMDY1LAorCTB4MDFlMCwgMHg2MDI0LCAweGEwMDUsIDB4MDFiMCwgMHg4MDAxLCAweDYwMjYsIDB4MTE5OCwgMHg2ODAwLAorCTB4YTAwNSwgMHgwMTMwLCAweDY4NDgsIDB4YWMwNiwgMHgxMTE4LCAweDA4MGMsIDB4NDUxNCwgMHgwMDY4LAorCTB4Njg2MCwgMHhhMDA1LCAweDAxMTgsIDB4NjAyNywgMHgwMDAxLCAweDAwMjAsIDB4MDgwYywgMHg0NGM4LAorCTB4MjgwNCwgMHgwYzI4LCAweDYwMDAsIDB4MmM0MCwgMHgwYzEwLCAweGQ3ZmMsIDB4MTEzOCwgMHgyMDY5LAorCTB4NDY4MCwgMHhjN2ZkLCAweDIwNzksIDB4MDEwMCwgMHgwODA0LCAweDQ0NDMsIDB4MDAwNSwgMHgyMDA5LAorCTB4MDAwMCwgMHgyMGE5LCAweDAyMDAsIDB4NjAwOCwgMHhkMDljLCAweDA1NTgsIDB4NjAyNCwgMHhhMDA1LAorCTB4MDExOCwgMHg4MDAxLCAweDYwMjYsIDB4MDQxOCwgMHg2MDA4LCAweGMwOWMsIDB4ZDA4NCwgMHgxMTEwLAorCTB4ZDBhYywgMHgwMWMwLCAweDYwMGEsIDB4NjAwNCwgMHhhMDA1LCAweDAxZDgsIDB4MDBkNiwgMHgwMGM2LAorCTB4MDAxNiwgMHgyMDY4LCAweDYwMTAsIDB4ODAwMSwgMHg2MDEyLCAweDA4MGMsIDB4MzdhNCwgMHgyZDAwLAorCTB4MmM2OCwgMHgyMDYwLCAweDA4MGMsIDB4MWJlMywgMHgwODBjLCAweDFkOTUsIDB4MDAxZSwgMHgwMGNlLAorCTB4MDBkZSwgMHgwMDM4LCAweGMwYmQsIDB4NjAwYSwgMHhhMThkLCAweDAwMDEsIDB4MDAxMCwgMHhhMThkLAorCTB4MDEwMCwgMHhhY2UwLCAweDAwMTAsIDB4MWYwNCwgMHg0NDhiLCAweGExODQsIDB4MDAwMSwgMHgwMTMwLAorCTB4YTE4YywgMHhmZmZlLCAweDY5MGUsIDB4MDgwYywgMHgyMmFlLCAweDAwMDgsIDB4NjkwZSwgMHgwMDA1LAorCTB4MmMwMCwgMHg2ODdhLCAweDY3MTQsIDB4NmY3MiwgMHg2MDE3LCAweDAwMDAsIDB4NjAyYiwgMHgwMDAwLAorCTB4NjAxYiwgMHgwMDA2LCAweDYwYjQsIDB4YTA4NCwgMHg1ZjAwLCAweDYwMWUsIDB4NjAyMCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg1LCAweDAwNjAsIDB4NjAyMiwgMHg2MDAwLCAweDIwNDIsIDB4Njg1OCwgMHhhYzA2LAorCTB4MTExMCwgMHgyODAwLCAweDY4NWEsIDB4MDgwYywgMHgxYjdiLCAweDY4MTgsIDB4YTAwNSwgMHgwMTEwLAorCTB4ODAwMSwgMHg2ODFhLCAweDY4MDgsIDB4YzBhNCwgMHg2ODBhLCAweDY4MTAsIDB4NzkwOCwgMHg4MTA5LAorCTB4NzkwYSwgMHg4MDAxLCAweDEzMTAsIDB4MDgwYywgMHgyNTRjLCAweDY4MTIsIDB4MTExOCwgMHg3OTEwLAorCTB4YzFhNSwgMHg3OTEyLCAweDYwMmYsIDB4MDAwMCwgMHg2MDMzLCAweDAwMDAsIDB4MmM2OCwgMHgwODBjLAorCTB4MWRhMiwgMHhkN2ZjLCAweDExMTgsIDB4MjA2OSwgMHg0NjQwLCAweDAwMTAsIDB4MjA2OSwgMHg0NjgwLAorCTB4NjkxMCwgMHhhMTg0LCAweDAxMDAsIDB4MjAwMSwgMHgwMDA2LCAweDExMTgsIDB4Njk3NiwgMHgyMDAxLAorCTB4MDAwNCwgMHgwODBjLCAweDIyYTQsIDB4MDAwNSwgMHgwMGQ2LCAweDY5NDgsIDB4MjE2MCwgMHhkN2ZjLAorCTB4MTExOCwgMHgyMDY5LCAweDAyMDAsIDB4MDAxMCwgMHgyMDY5LCAweDAxMDAsIDB4MDgwYywgMHgyNDY3LAorCTB4NjAxYiwgMHgwMDA2LCAweDY4NTgsIDB4YTA4NCwgMHg1ZjAwLCAweDYwMWUsIDB4NjAyMCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg1LCAweDAwNDgsIDB4NjAyMiwgMHg2MDJmLCAweDAwMDAsIDB4NjAzMywgMHgwMDAwLAorCTB4NjgwOCwgMHhhMDg0LCAweGZmZmQsIDB4NjgwYSwgMHg2ODMwLCAweGQwYjQsIDB4MDFiMCwgMHg2ODRiLAorCTB4MDAwNCwgMHgyMGE5LCAweDAwMTQsIDB4Njg0OCwgMHhkMDk0LCAweDAxMTAsIDB4MWYwNCwgMHg0NTNiLAorCTB4Njg0YiwgMHgwMDA5LCAweDIwYTksIDB4MDAxNCwgMHg2ODQ4LCAweGQwODQsIDB4MDExMCwgMHgxZjA0LAorCTB4NDU0NCwgMHgyMGE5LCAweDAwZmEsIDB4MWYwNCwgMHg0NTRiLCAweDY4MWIsIDB4MDA1NCwgMHgwMGRlLAorCTB4Njg2MywgMHgwMDA3LCAweDAwMDUsIDB4MjA3OSwgMHg0NjAwLCAweDAwZTEsIDB4MDA4OSwgMHgwMGE5LAorCTB4MjAwOSwgMHgwMDAyLCAweDIwNjksIDB4NDY4MCwgMHg2ODBmLCAweDAwMDAsIDB4NjgxMywgMHgwMDAwLAorCTB4NjgxNywgMHgwMDAwLCAweDgxMDksIDB4MDExOCwgMHgyMDY5LCAweDQ2NDAsIDB4MGNhOCwgMHgwMDA1LAorCTB4MjAxOSwgMHgwMGEzLCAweDdiM2EsIDB4N2IzZSwgMHgwMDA1LCAweDIwMTksIDB4MDAzMywgMHg3YjQyLAorCTB4N2I0NiwgMHgwMDA1LCAweDIwMTksIDB4MzJkZCwgMHg3YjMyLCAweDdiMzYsIDB4MDAwNSwgMHg2YTRjLAorCTB4YTI4NSwgMHgwMDAwLCAweDAxZjAsIDB4Njk1MCwgMHg2YmJjLCAweGEzMDAsIDB4MDBjNiwgMHgyMTY0LAorCTB4NjMwNCwgMHg4M2ZmLCAweDExMzgsIDB4ODIxMSwgMHgwMTQ4LCAweDgxMDgsIDB4YTExYSwgMHgwZWI4LAorCTB4NjliYywgMHgwY2E4LCAweDY4Y2YsIDB4MDAwYSwgMHgwMGNlLCAweDAwMDUsIDB4Njk0YywgMHg2YWJjLAorCTB4MjI2NCwgMHg2MDA4LCAweGMwYjUsIDB4NjAwYSwgMHg4MjEwLCAweDgxMDksIDB4MWRjOCwgMHg2OTRlLAorCTB4MDBjZSwgMHgwMDA1LCAweDFkMDQsIDB4NDU5YSwgMHgyMDkxLCAweDYwMDAsIDB4MWQwNCwgMHg0NTllLAorCTB4MjA5MSwgMHg2MDAwLCAweDcwZWMsIDB4ZDBkYywgMHgxMTE4LCAweGQwZDQsIDB4MDE5MCwgMHgwMDk4LAorCTB4YWU4ZSwgMHgwMTAwLCAweDAxMzgsIDB4NzgxNCwgMHhjMGY1LCAweGMwYzUsIDB4NzgxNiwgMHhkMGQ0LAorCTB4MTU3OCwgMHgwNDU4LCAweDc4MTQsIDB4YzBmZCwgMHhjMGM1LCAweDc4MTYsIDB4ZDBkNCwgMHgxNTQwLAorCTB4MDQyMCwgMHhkMGU0LCAweDA1MzgsIDB4MWQwNCwgMHg0NWJiLCAweDIwOTEsIDB4NjAwMCwgMHgyMDA5LAorCTB4MDAwYywgMHgxZDA0LCAweDQ1YzEsIDB4MjA5MSwgMHg2MDAwLCAweDgxMDksIDB4MWRkMCwgMHg3MGU0LAorCTB4YTA4NCwgMHgwMWZmLCAweGEwODYsIDB4MDFmZiwgMHgxMTEwLCAweDcwZWMsIDB4MDhjOCwgMHhhZThlLAorCTB4MDEwMCwgMHgwMTI4LCAweDc4MTQsIDB4YzBmNCwgMHhkMGZjLCAweDExMzAsIDB4MDAyMCwgMHg3ODE0LAorCTB4YzBmYywgMHhkMGY0LCAweDExMDgsIDB4YzBjNCwgMHg3ODE2LCAweDc4MDQsIDB4ZDA4YywgMHgwMTEwLAorCTB4NjgxZiwgMHgwMDBjLCAweDcwYTAsIDB4NzBhMiwgMHgwMDA1LCAweDdjMTIKK307CisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCAgIGZ3MTIxNjBpX2xlbmd0aDAxID0gMHgzNWU2OworI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCAgIHJpc2NfY29kZV9sZW5ndGgwMSA9IDB4MzVlNjsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsMTI4MF9mdy5oIGIvZHJpdmVycy9zY3NpL3FsMTI4MF9mdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MjFlOTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWwxMjgwX2Z3LmgKQEAgLTAsMCArMSwyMDE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgUUxPR0lDIExJTlVYIFNPRlRXQVJFCisgKgorICogUUxvZ2ljIElTUDEyODAvIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuMi54IGFuZCAyLjQueAorICogQ29weXJpZ2h0IChDKSAyMDAxIFFsb2dpYyBDb3Jwb3JhdGlvbiAod3d3LnFsb2dpYy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCSAgICAgICAgIC0tLSBJU1AxMjQwLzEwODAvMTI4MCBJbml0aWF0b3IgRmlybXdhcmUgLS0tICAgICAgICAgICAqCisgKgkJCSAgICAgIDMyIExVTiBTdXBwb3J0CQkJCSoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKyAqCUZpcm13YXJlIFZlcnNpb24gOC4xNS4wMCAoMTQ6MzUgQXVnIDIyLCAyMDAwKQorICovCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQorc3RhdGljIHVuc2lnbmVkIGNoYXIgZncxMjgwZWlfdmVyc2lvbl9zdHJbXSA9IHs4LDE1LDB9OworI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGZpcm13YXJlX3ZlcnNpb25bXSA9IHs4LDE1LDB9OworI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQorI2RlZmluZSBmdzEyODBlaV9WRVJTSU9OX1NUUklORyAiOC4xNS4wMCIKKyNlbHNlCisjZGVmaW5lIEZXX1ZFUlNJT05fU1RSSU5HICI4LjE1LjAwIgorI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQorc3RhdGljIHVuc2lnbmVkIHNob3J0IGZ3MTI4MGVpX2FkZHIwMSA9IDB4MTAwMDsKKyNlbHNlCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmlzY19jb2RlX2FkZHIwMSA9IDB4MTAwMDsKKyNlbmRpZgorCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmdzEyODBlaV9jb2RlMDFbXSA9IHsKKyNlbHNlCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmlzY19jb2RlMDFbXSA9IHsKKyNlbmRpZgorCTB4MDA3OCwgMHgxMDQxLCAweDAwMDAsIDB4M2QzYiwgMHgwMDAwLCAweDIwNDMsIDB4NGY1MCwgMHg1OTUyLAorCTB4NDk0NywgMHg0ODU0LCAweDIwMzEsIDB4MzkzOSwgMHgzMTJjLCAweDMxMzksIDB4MzkzMiwgMHgyYzMxLAorCTB4MzkzOSwgMHgzMzJjLCAweDMxMzksIDB4MzkzNCwgMHgyMDUxLCAweDRjNGYsIDB4NDc0OSwgMHg0MzIwLAorCTB4NDM0ZiwgMHg1MjUwLCAweDRmNTIsIDB4NDE1NCwgMHg0OTRmLCAweDRlMDAsIDB4MjA0OSwgMHg1MzUwLAorCTB4MzEzMiwgMHgzNDMwLCAweDIwNDYsIDB4Njk3MiwgMHg2ZDc3LCAweDYxNzIsIDB4NjUyMCwgMHgyMDU2LAorCTB4NjU3MiwgMHg3MzY5LCAweDZmNmUsIDB4MjAzMCwgMHgzODJlLCAweDMxMzUsIDB4MjAyMCwgMHgyMDQzLAorCTB4NzU3MywgMHg3NDZmLCAweDZkNjUsIDB4NzIyMCwgMHg0ZTZmLCAweDJlMjAsIDB4MzAzMCwgMHgyMDUwLAorCTB4NzI2ZiwgMHg2NDc1LCAweDYzNzQsIDB4MjA0ZSwgMHg2ZjJlLCAweDIwMjAsIDB4MzAzMCwgMHgyMDIwLAorCTB4MjQwMCwgMHgyMGM5LCAweDk3ZmYsIDB4MjAwMSwgMHgwNGZjLCAweDIwMDQsIDB4YTA4NiwgMHgxMDgwLAorCTB4MDBjMCwgMHgxMDU0LCAweDIwNzEsIDB4MDEwMCwgMHg3MGEwLCAweDcwYTIsIDB4MjBjMSwgMHgwMDEwLAorCTB4MjA4OSwgMHgxMzc0LCAweDAwNzgsIDB4MTA2ZCwgMHgyMDAxLCAweDA0ZmMsIDB4MjAwNCwgMHhhMDg2LAorCTB4MTI4MCwgMHgwMGMwLCAweDEwNjksIDB4MjA3MSwgMHgwMjAwLCAweDcwYTAsIDB4NzBhMiwgMHgyMDcxLAorCTB4MDEwMCwgMHg3MGEwLCAweDcwYTIsIDB4MjBjMSwgMHgwMDEwLCAweDIwODksIDB4MTNmOCwgMHgwMDc4LAorCTB4MTA2ZCwgMHgyMGMxLCAweDAwMjAsIDB4MjA4OSwgMHgxMzFjLCAweDIwNzEsIDB4MDAxMCwgMHg3MGMzLAorCTB4MDAwNCwgMHg3MGM3LCAweDQ5NTMsIDB4NzBjYiwgMHg1MDIwLCAweDcwY2YsIDB4MjAyMCwgMHg3MGQzLAorCTB4MDAwOCwgMHgyMDAxLCAweDA0ZmUsIDB4NzBkNiwgMHgyMGMxLCAweDAwMjEsIDB4MjAxOSwgMHgwMDAwLAorCTB4MjAwOSwgMHhmZWZmLCAweDIxMDAsIDB4MjAwYiwgMHhhNWE1LCAweGExZWMsIDB4N2ZmZiwgMHgyZDY0LAorCTB4MjA2YiwgMHgwYTBhLCAweGFkZGMsIDB4M2ZmZiwgMHgyYjU0LCAweDIwNWIsIDB4NTA1MCwgMHgyMTE0LAorCTB4YTI4NiwgMHhhNWE1LCAweDAwNDAsIDB4MTBhNCwgMHhhMzg2LCAweDAwMGYsIDB4MDA0MCwgMHgxMGEwLAorCTB4MmM2YSwgMHgyYTVhLCAweDIwYzEsIDB4MDAyMCwgMHgyMDE5LCAweDAwMGYsIDB4MDA3OCwgMHgxMDgwLAorCTB4MmM2YSwgMHgyYTVhLCAweDAwNzgsIDB4MTBhMiwgMHgyYzZhLCAweDJhNWEsIDB4MjEzMCwgMHgyMTI4LAorCTB4YTFhMiwgMHg0ZTAwLCAweDg0MjQsIDB4ODQyNCwgMHg4NDI0LCAweDg0MjQsIDB4ODQyNCwgMHg4NDI0LAorCTB4YTE5MiwgMHg5ODAwLCAweDIwMDksIDB4MDAwMCwgMHgyMDAxLCAweDAwMzIsIDB4MTA3OCwgMHgyMDdhLAorCTB4MjIxOCwgMHgyMDc5LCAweDRlMDAsIDB4MmZhMCwgMHgyNDA4LCAweDIwMTEsIDB4MDAwMCwgMHgyMGE5LAorCTB4MDA0MCwgMHg0MmE0LCAweDgxMDksIDB4MDBjMCwgMHgxMGJmLCAweDIwMDksIDB4ZmYwMCwgMHgzNDAwLAorCTB4YTEwMiwgMHgwMDQ4LCAweDEwY2YsIDB4MDA0MCwgMHgxMGNmLCAweDIwYTgsIDB4NDJhNCwgMHgyMDAxLAorCTB4MDRmYywgMHgyMDA0LCAweGEwODYsIDB4MTA4MCwgMHgwMGMwLCAweDEwZTUsIDB4MjA3MSwgMHgwMTAwLAorCTB4MGQ3ZSwgMHgyMDY5LCAweDRlNDAsIDB4MTA3OCwgMHg0Y2RkLCAweDBkN2YsIDB4NzgxMCwgMHhjMGVkLAorCTB4NzgxMiwgMHg3ODFiLCAweDAwNjQsIDB4MDA3OCwgMHgxMTBhLCAweDIwMDEsIDB4MDRmYywgMHgyMDA0LAorCTB4YTA4NiwgMHgxMjgwLCAweDAwYzAsIDB4MTEwNSwgMHg3ODE0LCAweGMwZWQsIDB4YzBkNSwgMHg3ODE2LAorCTB4NzgxYiwgMHgwMDY0LCAweDIwNzEsIDB4MDIwMCwgMHgwZDdlLCAweDIwNjksIDB4NGU0MCwgMHgxMDc4LAorCTB4NGNkZCwgMHgyMDY5LCAweDRlODAsIDB4MjA3MSwgMHgwMTAwLCAweDEwNzgsIDB4NGNkZCwgMHg3ODE0LAorCTB4YzBkNCwgMHg3ODE2LCAweDBkN2YsIDB4MDA3OCwgMHgxMTBhLCAweDc4MTQsIDB4YzBlNSwgMHg3ODE2LAorCTB4NzgxYiwgMHgwMDNjLCAweDdlY2EsIDB4N2NjMiwgMHg3YmM2LCAweDc4NjcsIDB4MDAwMCwgMHg3ODAwLAorCTB4YzA4ZCwgMHg3ODAyLCAweDIwMzEsIDB4MDAzMCwgMHg3OGFmLCAweDAxMDEsIDB4NzgyMywgMHgwMDAyLAorCTB4NzgyNywgMHgwMDAyLCAweDIwMDksIDB4MDAwMiwgMHgyMDY5LCAweDRlNDAsIDB4NjgxYiwgMHgwMDAzLAorCTB4NjgyMywgMHgwMDA3LCAweDY4MjcsIDB4MDBmYSwgMHg2ODJiLCAweDAwMDgsIDB4NjgyZiwgMHgwMDI4LAorCTB4NjgzNywgMHgwMDAwLCAweDY4M2IsIDB4MDAwNiwgMHg2ODMzLCAweDAwMDgsIDB4NjgzZiwgMHgwMDAwLAorCTB4ODEwOSwgMHgwMDQwLCAweDExNWUsIDB4NjhkMywgMHgwMDBhLCAweDY4YzMsIDB4NGVjMCwgMHgyMDc5LAorCTB4NGUwMCwgMHg3ODE0LCAweGQwZTQsIDB4MDBjMCwgMHgxMTQ0LCAweGQwZWMsIDB4MDBjMCwgMHgxMTQ4LAorCTB4NjhkNywgMHg3MzI5LCAweDAwNzgsIDB4MTE0YSwgMHg2OGQ3LCAweDczMGQsIDB4MDA3OCwgMHgxMTRhLAorCTB4NjhkNywgMHg3MzJkLCAweDY4YzcsIDB4NTNjMCwgMHg2OGNiLCAweDUyYzAsIDB4NjhjZiwgMHg5M2MwLAorCTB4NjhhYiwgMHg5NjQ0LCAweDY4YWYsIDB4OTY0OSwgMHg2OGIzLCAweDk2NDQsIDB4NjhiNywgMHg5NjQ0LAorCTB4NjhhNywgMHgwMDAxLCAweDIwNjksIDB4NGU4MCwgMHgwMDc4LCAweDExMWUsIDB4NjhkMywgMHgwMDBhLAorCTB4NjhjMywgMHg1MGMwLCAweDc4MTQsIDB4ZDBlNCwgMHgwMGMwLCAweDExNmEsIDB4NjhkNywgMHg3NDM5LAorCTB4MDA3OCwgMHgxMTZjLCAweDY4ZDcsIDB4NzQxOSwgMHg2OGM3LCAweDczYzAsIDB4NjhjYiwgMHg1MzQwLAorCTB4NjhjZiwgMHg5NGQwLCAweDY4YWIsIDB4OTY0OSwgMHg2OGFmLCAweDk2NGUsIDB4NjhiMywgMHg5NjQ5LAorCTB4NjhiNywgMHg5NjQ5LCAweDY4YTcsIDB4MDAwMSwgMHg3ODEwLCAweGQwZWMsIDB4MDBjMCwgMHgxMWMyLAorCTB4NzgxNCwgMHhkMGU0LCAweDAwYzAsIDB4MTFiNCwgMHgwZTdlLCAweDIwNjksIDB4NTJjMCwgMHgyMDcxLAorCTB4MDIwMCwgMHg3MGVjLCAweGQwZTQsIDB4MDBjMCwgMHgxMTk1LCAweDIwMTksIDB4MGMwYywgMHgyMDIxLAorCTB4MDAwYywgMHgxMDc4LCAweDIwMDksIDB4MDA3OCwgMHgxMTliLCAweDIwMTksIDB4MGMwYSwgMHgyMDIxLAorCTB4MDAwYSwgMHgxMDc4LCAweDIwMDksIDB4MjA2OSwgMHg1MzQwLCAweDIwNzEsIDB4MDEwMCwgMHg3MGVjLAorCTB4ZDBlNCwgMHgwMGMwLCAweDExYWIsIDB4MjAxOSwgMHgwYzBjLCAweDIwMjEsIDB4MDAwYywgMHgxMDc4LAorCTB4MjAwOSwgMHgwMDc4LCAweDExYjEsIDB4MjAxOSwgMHgwYzBhLCAweDIwMjEsIDB4MDAwYSwgMHgxMDc4LAorCTB4MjAwOSwgMHgwZTdmLCAweDAwNzgsIDB4MTFkYiwgMHgyMDE5LCAweDBjMGMsIDB4MjAyMSwgMHgwMDBjLAorCTB4MjA2OSwgMHg1MmMwLCAweDEwNzgsIDB4MjAwOSwgMHgyMDY5LCAweDUzNDAsIDB4MTA3OCwgMHgyMDA5LAorCTB4MDA3OCwgMHgxMWRiLCAweDIwNjksIDB4NTJjMCwgMHgwZTdlLCAweDIwNzEsIDB4MDEwMCwgMHg3MGVjLAorCTB4ZDBlNCwgMHgwMGMwLCAweDExZDQsIDB4MjAxOSwgMHgwYzBjLCAweDIwMjEsIDB4MDAwYywgMHgxMDc4LAorCTB4MjAwOSwgMHgwZTdmLCAweDAwNzgsIDB4MTFkYiwgMHgyMDE5LCAweDBjMGEsIDB4MjAyMSwgMHgwMDBhLAorCTB4MTA3OCwgMHgyMDA5LCAweDBlN2YsIDB4MjAxMSwgMHgwMDAyLCAweDIwNjksIDB4NTNjMCwgMHgyMDA5LAorCTB4MDAwMiwgMHgyMGE5LCAweDAxMDAsIDB4NjgzNywgMHgwMDAwLCAweDY4MGIsIDB4MDA0MCwgMHg3YmM4LAorCTB4YTM4NiwgMHhmZWZmLCAweDAwYzAsIDB4MTFmMiwgMHg2ODE3LCAweDAxMDAsIDB4NjgxZiwgMHgwMDY0LAorCTB4MDA3OCwgMHgxMWY2LCAweDY4MTcsIDB4MDA2NCwgMHg2ODFmLCAweDAwMDIsIDB4YWRlOCwgMHgwMDEwLAorCTB4MDBmMCwgMHgxMWUzLCAweDgxMDksIDB4MDBjMCwgMHgxMWUxLCAweDgyMTEsIDB4MDA0MCwgMHgxMjA0LAorCTB4MjA2OSwgMHg3M2MwLCAweDAwNzgsIDB4MTFkZiwgMHgxMDc4LCAweDI2NWIsIDB4MTA3OCwgMHg0NjhlLAorCTB4MTA3OCwgMHgxZGQ0LCAweDEwNzgsIDB4NGM2ZiwgMHgyMDkxLCAweDIxMDAsIDB4MjA3OSwgMHg0ZTAwLAorCTB4NzgxMCwgMHhkMGVjLCAweDAwNDAsIDB4MTIxOCwgMHgyMDcxLCAweDAwMjAsIDB4MDA3OCwgMHgxMjFhLAorCTB4MjA3MSwgMHgwMDUwLCAweDIwOTEsIDB4MjIwMCwgMHgyMDc5LCAweDRlMDAsIDB4MjA3MSwgMHgwMDIwLAorCTB4MjA5MSwgMHgyMzAwLCAweDIwNzksIDB4NGUwMCwgMHg3ODEwLCAweGQwZWMsIDB4MDA0MCwgMHgxMjJjLAorCTB4MjA3OSwgMHgwMTAwLCAweDAwNzgsIDB4MTIyZSwgMHgyMDc5LCAweDAyMDAsIDB4MjA3MSwgMHg0ZTQwLAorCTB4MjA5MSwgMHgyNDAwLCAweDIwNzksIDB4MDEwMCwgMHgyMDcxLCAweDRlODAsIDB4MjA5MSwgMHgyMDAwLAorCTB4MjA3OSwgMHg0ZTAwLCAweDIwNzEsIDB4MDAxMCwgMHgzMjAwLCAweGEwODUsIDB4MzAzZCwgMHgyMDkwLAorCTB4MjA3MSwgMHgwMDEwLCAweDcwYzMsIDB4MDAwMCwgMHgwMDkwLCAweDEyNGQsIDB4NzBjMCwgMHhhMDg2LAorCTB4MDAwMiwgMHgwMGMwLCAweDEyNGQsIDB4MTA3OCwgMHgxNWJhLCAweDIwMzksIDB4MDAwMCwgMHg3ODEwLAorCTB4ZDBlYywgMHgwMGMwLCAweDEyY2YsIDB4MTA3OCwgMHgxNDhlLCAweDc4YWMsIDB4YTAwNSwgMHgwMGMwLAorCTB4MTI2YiwgMHgwMDY4LCAweDEyNjEsIDB4Nzg2YywgMHhhMDY1LCAweDAwNDAsIDB4MTI2MSwgMHgxMDc4LAorCTB4MjM5NSwgMHgxMDc4LCAweDIwYTEsIDB4MDA2OCwgMHgxMjc4LCAweDc4NmMsIDB4YTA2NSwgMHgwMDQwLAorCTB4MTI2YiwgMHgxMDc4LCAweDIzOTUsIDB4MDA2OCwgMHgxMjc4LCAweDIwMDksIDB4NGU0NywgMHgyMDExLAorCTB4NGU4NywgMHgyMTA0LCAweDIyMGMsIDB4YTEwNSwgMHgwMDQwLCAweDEyNzgsIDB4MTA3OCwgMHgxZjBhLAorCTB4MjA3MSwgMHg0ZTQwLCAweDcwYTQsIDB4YTAwNSwgMHgwMDQwLCAweDEyOWQsIDB4NzQ1MCwgMHhhNDg1LAorCTB4MDAwMCwgMHgwMDQwLCAweDEyOWQsIDB4MjA3OSwgMHgwMjAwLCAweDIwOTEsIDB4ODAwMCwgMHg3MmQ0LAorCTB4YTI4YywgMHgzMDNkLCAweDIxOTAsIDB4MTA3OCwgMHgyYjZhLCAweDIwOTEsIDB4ODAwMCwgMHgyMDkxLAorCTB4MzAzZCwgMHgwMDY4LCAweDEyOWQsIDB4MjA3OSwgMHg0ZTAwLCAweDc4NmMsIDB4YTA2NSwgMHgwMDQwLAorCTB4MTI5ZCwgMHgyMDcxLCAweDAwMTAsIDB4MTA3OCwgMHgyMzk1LCAweDAwZTAsIDB4MTJhNSwgMHgyMDc5LAorCTB4NGUwMCwgMHgyMDcxLCAweDAwMTAsIDB4MTA3OCwgMHg0YTQzLCAweDIwNzEsIDB4NGU4MCwgMHg3MGE0LAorCTB4YTAwNSwgMHgwMDQwLCAweDEyYmQsIDB4NzA1MCwgMHhhMDI1LCAweDAwNDAsIDB4MTJiZCwgMHgyMDc5LAorCTB4MDEwMCwgMHgyMDkxLCAweDgwMDAsIDB4NzJkNCwgMHhhMjhjLCAweDMwM2QsIDB4MjE5MCwgMHgxMDc4LAorCTB4MmI2YSwgMHgyMDkxLCAweDgwMDAsIDB4MjA5MSwgMHgzMDNkLCAweDIwNzksIDB4NGUwMCwgMHgyMDcxLAorCTB4MDAxMCwgMHgwMDY4LCAweDEyYzksIDB4Nzg2YywgMHhhMDY1LCAweDAwNDAsIDB4MTJjOSwgMHgxMDc4LAorCTB4MjM5NSwgMHgwMGUwLCAweDEyNTMsIDB4MTA3OCwgMHg0YTQzLCAweDAwNzgsIDB4MTI1MywgMHgxMDc4LAorCTB4MTQ4ZSwgMHg3OGFjLCAweGEwMDUsIDB4MDBjMCwgMHgxMmU3LCAweDAwNjgsIDB4MTJkZCwgMHg3ODZjLAorCTB4YTA2NSwgMHgwMDQwLCAweDEyZGQsIDB4MTA3OCwgMHgyMzk1LCAweDEwNzgsIDB4MjBhMSwgMHgwMDY4LAorCTB4MTJmMSwgMHg3ODZjLCAweGEwNjUsIDB4MDA0MCwgMHgxMmU3LCAweDEwNzgsIDB4MjM5NSwgMHgwMDY4LAorCTB4MTJmMSwgMHgyMDA5LCAweDRlNDcsIDB4MjEwNCwgMHhhMDA1LCAweDAwNDAsIDB4MTJmMSwgMHgxMDc4LAorCTB4MWYwYSwgMHgyMDcxLCAweDRlNDAsIDB4NzBhNCwgMHhhMDA1LCAweDAwNDAsIDB4MTMwYywgMHg3NDUwLAorCTB4YTQ4NSwgMHgwMDAwLCAweDAwNDAsIDB4MTMwYywgMHgyMDc5LCAweDAxMDAsIDB4MjA5MSwgMHg4MDAwLAorCTB4NzJkNCwgMHhhMjhjLCAweDMwM2QsIDB4MjE5MCwgMHgxMDc4LCAweDJiNmEsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA5MSwgMHgzMDNkLCAweDIwNzksIDB4NGUwMCwgMHgyMDcxLCAweDAwMTAsIDB4MDA2OCwgMHgxMzE2LAorCTB4Nzg2YywgMHhhMDY1LCAweDAwNDAsIDB4MTMxNiwgMHgxMDc4LCAweDIzOTUsIDB4MDBlMCwgMHgxMmNmLAorCTB4MTA3OCwgMHg0YTQzLCAweDAwNzgsIDB4MTJjZiwgMHgxMzNjLCAweDEzM2MsIDB4MTMzZSwgMHgxMzNlLAorCTB4MTM0YiwgMHgxMzRiLCAweDEzNGIsIDB4MTM0YiwgMHgxMzU2LCAweDEzNTYsIDB4MTM2MywgMHgxMzYzLAorCTB4MTM0YiwgMHgxMzRiLCAweDEzNGIsIDB4MTM0YiwgMHgxMzNjLCAweDEzM2MsIDB4MTMzZSwgMHgxMzNlLAorCTB4MTM0YiwgMHgxMzRiLCAweDEzNGIsIDB4MTM0YiwgMHgxMzU2LCAweDEzNTYsIDB4MTM2MywgMHgxMzYzLAorCTB4MTM0YiwgMHgxMzRiLCAweDEzNGIsIDB4MTM0YiwgMHgwMDc4LCAweDEzM2MsIDB4MDA3ZSwgMHgxMDdlLAorCTB4MTI3ZSwgMHgyMDkxLCAweDI0MDAsIDB4MTA3OCwgMHgyOThhLCAweDEyN2YsIDB4MTA3ZiwgMHgwMDdmLAorCTB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4MDA3ZSwgMHgxMDdlLCAweDEyN2UsIDB4MTA3OCwgMHgxM2M4LAorCTB4MTI3ZiwgMHgxMDdmLCAweDAwN2YsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4MDA3ZSwgMHgxMDdlLAorCTB4MTI3ZSwgMHgyMDkxLCAweDIzMDAsIDB4MTA3OCwgMHgyOThhLCAweDEyN2YsIDB4MTA3ZiwgMHgwMDdmLAorCTB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4MDA3ZSwgMHgxMDdlLCAweDEyN2UsIDB4MjA5MSwgMHgyMzAwLAorCTB4MTA3OCwgMHgyOThhLCAweDIwOTEsIDB4MjQwMCwgMHgxMDc4LCAweDI5OGEsIDB4MTI3ZiwgMHgxMDdmLAorCTB4MDA3ZiwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHgxMzk0LCAweDEzOTQsIDB4MTM5NiwgMHgxMzk2LAorCTB4MTNhMywgMHgxM2EzLCAweDEzYTMsIDB4MTNhMywgMHgxM2FlLCAweDEzYWUsIDB4MTM5NiwgMHgxMzk2LAorCTB4MTNhMywgMHgxM2EzLCAweDEzYTMsIDB4MTNhMywgMHgxM2FmLCAweDEzYWYsIDB4MTNhZiwgMHgxM2FmLAorCTB4MTNhZiwgMHgxM2FmLCAweDEzYWYsIDB4MTNhZiwgMHgxM2FmLCAweDEzYWYsIDB4MTNhZiwgMHgxM2FmLAorCTB4MTNhZiwgMHgxM2FmLCAweDEzYWYsIDB4MTNhZiwgMHgwMDc4LCAweDEzOTQsIDB4MDA3ZSwgMHgxMDdlLAorCTB4MTI3ZSwgMHgyMDkxLCAweDIzMDAsIDB4MTA3OCwgMHgyOThhLCAweDEyN2YsIDB4MTA3ZiwgMHgwMDdmLAorCTB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4MDA3ZSwgMHgxMDdlLCAweDEyN2UsIDB4MTA3OCwgMHgxM2Q1LAorCTB4MTI3ZiwgMHgxMDdmLCAweDAwN2YsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4MDA3YywgMHgxMDdlLAorCTB4MTI3ZSwgMHgwZDdlLCAweDBlN2UsIDB4MGY3ZSwgMHgwMDdlLCAweDIwNzEsIDB4MDEwMCwgMHgyMDY5LAorCTB4NGU0MCwgMHgyMDc5LCAweDRlMDAsIDB4NzBlYywgMHhhMDg0LCAweDFjMDAsIDB4NzhlMiwgMHgxMDc4LAorCTB4NGNkZCwgMHgwMDdmLCAweDBmN2YsIDB4MGU3ZiwgMHgwZDdmLCAweDEyN2YsIDB4MTA3ZiwgMHgwMDdjLAorCTB4M2MwMCwgMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHgxM2NkLCAweDEzZGUsIDB4MTNkZSwgMHgxM2UwLAorCTB4MTNlMCwgMHgxM2U1LCAweDEzZTUsIDB4MTNlYSwgMHgxM2VhLCAweDNjMDAsIDB4YTA4NCwgMHgwMDAzLAorCTB4MDA3OSwgMHgxM2RhLCAweDEzZGUsIDB4MTNkZSwgMHgxM2YzLCAweDEzZjMsIDB4MTA3OCwgMHgyOTZiLAorCTB4MjA5MSwgMHgyMjAwLCAweDEwNzgsIDB4NDc2OCwgMHgwMDdjLCAweDIwOTEsIDB4MjEwMCwgMHgxMDc4LAorCTB4NDc2OCwgMHgwMDdjLCAweDIwOTEsIDB4MjEwMCwgMHgxMDc4LCAweDQ3NjgsIDB4MjA5MSwgMHgyMjAwLAorCTB4MTA3OCwgMHg0NzY4LCAweDAwN2MsIDB4MjA5MSwgMHgyMTAwLCAweDEwNzgsIDB4NDc2OCwgMHgwMDdjLAorCTB4MTQxOCwgMHgxNDE4LCAweDE0MWEsIDB4MTQxYSwgMHgxNDI3LCAweDE0MjcsIDB4MTQyNywgMHgxNDI3LAorCTB4MTQzMiwgMHgxNDMyLCAweDE0M2YsIDB4MTQzZiwgMHgxNDI3LCAweDE0MjcsIDB4MTQyNywgMHgxNDI3LAorCTB4MTQ1MCwgMHgxNDUwLCAweDE0NTAsIDB4MTQ1MCwgMHgxNDUwLCAweDE0NTAsIDB4MTQ1MCwgMHgxNDUwLAorCTB4MTQ1MCwgMHgxNDUwLCAweDE0NTAsIDB4MTQ1MCwgMHgxNDUwLCAweDE0NTAsIDB4MTQ1MCwgMHgxNDUwLAorCTB4MDA3OCwgMHgxNDE4LCAweDAwN2UsIDB4MTA3ZSwgMHgxMjdlLCAweDIwOTEsIDB4MjQwMCwgMHgxMDc4LAorCTB4Mjk4YSwgMHgxMjdmLCAweDEwN2YsIDB4MDA3ZiwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHgwMDdlLAorCTB4MTA3ZSwgMHgxMjdlLCAweDEwNzgsIDB4MTNjOCwgMHgxMjdmLCAweDEwN2YsIDB4MDA3ZiwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDdjLCAweDAwN2UsIDB4MTA3ZSwgMHgxMjdlLCAweDIwOTEsIDB4MjMwMCwgMHgxMDc4LAorCTB4Mjk4YSwgMHgxMjdmLCAweDEwN2YsIDB4MDA3ZiwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHgwMDdlLAorCTB4MTA3ZSwgMHgxMjdlLCAweDIwOTEsIDB4MjMwMCwgMHgxMDc4LCAweDI5OGEsIDB4MjA5MSwgMHgyNDAwLAorCTB4MTA3OCwgMHgyOThhLCAweDEyN2YsIDB4MTA3ZiwgMHgwMDdmLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLAorCTB4MDA3ZSwgMHgxMDdlLCAweDEyN2UsIDB4MGQ3ZSwgMHgwZTdlLCAweDBmN2UsIDB4MjA3OSwgMHg0ZTAwLAorCTB4MjA3MSwgMHgwMjAwLCAweDIwNjksIDB4NGU0MCwgMHgzZDAwLCAweGQwOGMsIDB4MDA0MCwgMHgxNDY2LAorCTB4NzBlYywgMHhhMDg0LCAweDFjMDAsIDB4NzhlMiwgMHgxMDc4LCAweDRjZGQsIDB4M2QwMCwgMHhkMDg0LAorCTB4MDA0MCwgMHgxNDc0LCAweDIwNjksIDB4NGU4MCwgMHgyMDcxLCAweDAxMDAsIDB4NzBlYywgMHhhMDg0LAorCTB4MWMwMCwgMHg3OGU2LCAweDEwNzgsIDB4NGNkZCwgMHgwZjdmLCAweDBlN2YsIDB4MGQ3ZiwgMHgxMjdmLAorCTB4MTA3ZiwgMHgwMDdmLCAweDAwN2MsIDB4NzAwOCwgMHg4MDBiLCAweDAwYzgsIDB4MTQ4OSwgMHg3MDA3LAorCTB4MDAwMiwgMHhhMDhjLCAweDAxZTAsIDB4MDBjMCwgMHgxNDhhLCAweGQwOWMsIDB4MDA0MCwgMHgxNDg5LAorCTB4MDg3YSwgMHgwOTdhLCAweDcwYzMsIDB4NDAwMiwgMHgwMDc4LCAweDE1YmQsIDB4MDA2OCwgMHgxNTEzLAorCTB4MjA2MSwgMHgwMDAwLCAweDYwMTgsIDB4ZDA4NCwgMHgwMGMwLCAweDE1MTMsIDB4NzgyOCwgMHhhMDA1LAorCTB4MDBjMCwgMHgxNDllLCAweDAwMTAsIDB4MTUxNCwgMHgwMDc4LCAweDE1MTMsIDB4NzkxMCwgMHhkMWY0LAorCTB4MDA0MCwgMHgxNGE2LCAweDIwMDEsIDB4NDAwNywgMHgwMDc4LCAweDE1YmMsIDB4NzkxNCwgMHhkMWVjLAorCTB4MDA0MCwgMHgxNGMxLCAweGQwZmMsIDB4MDA0MCwgMHgxNGI3LCAweDAwN2UsIDB4MTA3OCwgMHgxZDY0LAorCTB4MDA3ZiwgMHgwMDQwLCAweDE0YzEsIDB4MjAwMSwgMHg0MDA3LCAweDAwNzgsIDB4MTViYywgMHgwMDdlLAorCTB4MTA3OCwgMHgxZDU0LCAweDAwN2YsIDB4MDA0MCwgMHgxNGMxLCAweDIwMDEsIDB4NDAwNywgMHgwMDc4LAorCTB4MTViYywgMHg3OTEwLCAweGQwZmMsIDB4MDBjMCwgMHgxNGNiLCAweDIwNjEsIDB4NGU0MCwgMHhjMTljLAorCTB4YzdmYywgMHgwMDc4LCAweDE0Y2YsIDB4MjA2MSwgMHg0ZTgwLCAweGMxOWQsIDB4YzdmZCwgMHg2MDY0LAorCTB4YTAwNSwgMHgwMGMwLCAweDE1MTMsIDB4NzkxMiwgMHg2MDgzLCAweDAwMDAsIDB4NzgyOCwgMHhjMGZjLAorCTB4YTA4NiwgMHgwMDE4LCAweDAwYzAsIDB4MTRlMCwgMHgwYzdlLCAweDEwNzgsIDB4MWI1YiwgMHgwYzdmLAorCTB4NzgyYiwgMHgwMDAwLCAweDYwN2MsIDB4YTA2NSwgMHgwMDQwLCAweDE0ZjksIDB4MGM3ZSwgMHg2MDljLAorCTB4MTA3OCwgMHgxZTQ5LCAweDBjN2YsIDB4NjA5ZiwgMHgwMDAwLCAweDEwNzgsIDB4MWM4NCwgMHgyMDA5LAorCTB4MDAxOCwgMHg2MDg3LCAweDAxMDMsIDB4MTA3OCwgMHgxZDc0LCAweDAwYzAsIDB4MTUwZCwgMHgxMDc4LAorCTB4MWRjNiwgMHg3ODEwLCAweGQwOWMsIDB4MDBjMCwgMHgxNTAxLCAweDIwNjEsIDB4NGU0MCwgMHgwMDc4LAorCTB4MTUwNSwgMHgyMDYxLCAweDRlODAsIDB4YzA5YywgMHg3ODEyLCAweDYwN2YsIDB4MDAwMCwgMHg2MGQ0LAorCTB4ZDBkYywgMHgwMDQwLCAweDE1MTEsIDB4YzBkYywgMHg2MGQ2LCAweDIwMDEsIDB4NDAwNSwgMHgwMDc4LAorCTB4MTViYywgMHgwMDc4LCAweDE1YmEsIDB4MDA3YywgMHg3ODEwLCAweGQwZjQsIDB4MDA0MCwgMHgxNTFjLAorCTB4MjAwMSwgMHg0MDA3LCAweDAwNzgsIDB4MTViYywgMHhhMDA2LCAweDcwYzIsIDB4NzBjNiwgMHg3MGNhLAorCTB4NzBjZSwgMHg3MGRhLCAweDcwYzAsIDB4YTAzZCwgMHhhMDhhLCAweDAwNDAsIDB4MDBjOCwgMHgxNTJhLAorCTB4MDA3OSwgMHgxNTMxLCAweDIxMDAsIDB4YTA4YSwgMHgwMDQwLCAweDAwYzgsIDB4MTVjOCwgMHgwMDc5LAorCTB4MTU3MSwgMHgxNWJhLCAweDE2MTAsIDB4MTVkOSwgMHgxNjQ4LCAweDE2ODAsIDB4MTY4MCwgMHgxNWQwLAorCTB4MWM5YywgMHgxNjhiLCAweDE1YzgsIDB4MTVkZCwgMHgxNWRmLCAweDE1ZTEsIDB4MTVlMywgMHgxY2ExLAorCTB4MTVjOCwgMHgxNjk5LCAweDE2ZjYsIDB4MWI3YiwgMHgxYzk2LCAweDE1ZTUsIDB4MTljMCwgMHgxYTAyLAorCTB4MWEzZCwgMHgxYThlLCAweDE5N2IsIDB4MTk4OCwgMHgxOTljLCAweDE5YWYsIDB4MTdjYiwgMHgxNWM4LAorCTB4MTcyZCwgMHgxNzNhLCAweDE3NDYsIDB4MTc1MiwgMHgxNzY4LCAweDE3NzQsIDB4MTc3NywgMHgxNzgzLAorCTB4MTc4ZiwgMHgxNzk3LCAweDE3YjMsIDB4MTdiZiwgMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LAorCTB4MTdkOCwgMHgxN2VhLCAweDE4MDYsIDB4MTgzYywgMHgxODY0LCAweDE4NzQsIDB4MTg3NywgMHgxOGE4LAorCTB4MThkOSwgMHgxOGViLCAweDE5NGEsIDB4MTk1YSwgMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LAorCTB4MTk2YSwgMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LCAweDE1YzgsIDB4MWNjNiwgMHgxY2NjLAorCTB4MTVjOCwgMHgxNWM4LCAweDE1YzgsIDB4MWNkMCwgMHgxZDE1LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LAorCTB4MTVjOCwgMHgxNjBhLCAweDE2N2EsIDB4MTY5MywgMHgxNmYwLCAweDFiNzUsIDB4MTVjOCwgMHgxNWM4LAorCTB4MWIzZSwgMHgxNWM4LCAweDFkMTksIDB4MWNiOCwgMHgxY2MyLCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LAorCTB4MTVjOCwgMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LAorCTB4MTVjOCwgMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LAorCTB4MTVjOCwgMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LAorCTB4MTVjOCwgMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LAorCTB4MTVjOCwgMHg3MmNhLCAweDcxYzYsIDB4MjAwMSwgMHg0MDA2LCAweDAwNzgsIDB4MTViYywgMHg3M2NlLAorCTB4NzJjYSwgMHg3MWM2LCAweDIwMDEsIDB4NDAwMCwgMHg3MGMyLCAweDAwNjgsIDB4MTViZCwgMHgyMDYxLAorCTB4MDAwMCwgMHg2MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg1MDAwLCAweDIwOTEsIDB4NDA4MCwgMHgwMDdjLAorCTB4NzBjMywgMHg0MDAxLCAweDAwNzgsIDB4MTViZCwgMHg3MGMzLCAweDQwMDYsIDB4MDA3OCwgMHgxNWJkLAorCTB4MjA5OSwgMHgwMDQxLCAweDIwYTEsIDB4MDA0MSwgMHgyMGE5LCAweDAwMDUsIDB4NTNhMywgMHgwMDc4LAorCTB4MTViYSwgMHg3MGM0LCAweDcwYzMsIDB4MDAwNCwgMHgwMDdhLCAweDAwNzgsIDB4MTViYSwgMHgwMDc4LAorCTB4MTViYSwgMHgwMDc4LCAweDE1YmEsIDB4MDA3OCwgMHgxNWJhLCAweDIwOTEsIDB4ODAwMCwgMHg3MGMzLAorCTB4MDAwNCwgMHg3MGM3LCAweDQ5NTMsIDB4NzBjYiwgMHg1MDIwLCAweDcwY2YsIDB4MjAyMCwgMHg3MGQzLAorCTB4MDAwOCwgMHgyMDAxLCAweDAwMGYsIDB4NzBkNiwgMHgyMDc5LCAweDAwMDAsIDB4NzgxYiwgMHgwMDAxLAorCTB4MjAzMSwgMHgwMDMwLCAweDIwNTksIDB4MTAwMCwgMHgyMDI5LCAweDA0MWEsIDB4MjA1MSwgMHgwNDQ1LAorCTB4MjA2MSwgMHgwNDQ3LCAweDIwYzEsIDB4MDAyMCwgMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwgMHg0MDgwLAorCTB4MDA3OCwgMHgwNDE4LCAweDc1ZDgsIDB4NzRkYywgMHg3NWRhLCAweDc0ZGUsIDB4MDA3OCwgMHgxNjEzLAorCTB4MjAyOSwgMHgwMDAwLCAweDI1MjAsIDB4NzFkMCwgMHg3MmM4LCAweDczY2MsIDB4NzBjNCwgMHgyMGEwLAorCTB4MjA5OSwgMHgwMDMwLCAweDcwMDMsIDB4MDAwMSwgMHg3MDA3LCAweDAwMDYsIDB4NzMxYSwgMHg3MjFlLAorCTB4NzQyMiwgMHg3NTI2LCAweDIwMjEsIDB4MDA0MCwgMHg4MWZmLCAweDAwNDAsIDB4MTViYSwgMHhhMTgyLAorCTB4MDA0MCwgMHgwMGM4LCAweDE2MmQsIDB4MjEyMCwgMHhhMDA2LCAweDIwMDgsIDB4ODQwMywgMHg3MDEyLAorCTB4NzAwNywgMHgwMDA0LCAweDcwMDcsIDB4MDAwMSwgMHg3MDA4LCAweGQwZmMsIDB4MDA0MCwgMHgxNjM0LAorCTB4NzAwNywgMHgwMDAyLCAweGEwODQsIDB4MDFlMCwgMHgwMDQwLCAweDE2NDIsIDB4NzBjMywgMHg0MDAyLAorCTB4MDA3OCwgMHgxNWJkLCAweDI0YTgsIDB4NTNhNSwgMHgwMDc4LCAweDE2MjQsIDB4MDA3OCwgMHgxNWJhLAorCTB4MjAyOSwgMHgwMDAwLCAweDI1MjAsIDB4NzFkMCwgMHg3MmM4LCAweDczY2MsIDB4NzBjNCwgMHgyMDk4LAorCTB4MjBhMSwgMHgwMDMwLCAweDcwMDMsIDB4MDAwMCwgMHg3MDA3LCAweDAwMDYsIDB4NzMxYSwgMHg3MjFlLAorCTB4NzQyMiwgMHg3NTI2LCAweDIwMjEsIDB4MDA0MCwgMHg3MDA3LCAweDAwMDYsIDB4ODFmZiwgMHgwMDQwLAorCTB4MTViYSwgMHhhMTgyLCAweDAwNDAsIDB4MDBjOCwgMHgxNjY3LCAweDIxMjAsIDB4YTAwNiwgMHgyMDA4LAorCTB4ODQwMywgMHg3MDEyLCAweDI0YTgsIDB4NTNhNiwgMHg3MDA3LCAweDAwMDEsIDB4NzAwOCwgMHhkMGZjLAorCTB4MDA0MCwgMHgxNjZlLCAweGEwODQsIDB4MDFlMCwgMHgwMDQwLCAweDE2NWMsIDB4NzBjMywgMHg0MDAyLAorCTB4MDA3OCwgMHgxNWJkLCAweDc1ZDgsIDB4NzRkYywgMHg3NWRhLCAweDc0ZGUsIDB4MDA3OCwgMHgxNjRiLAorCTB4NzFjNCwgMHg3MGM4LCAweDIxMTQsIDB4YTc5ZSwgMHgwMDA0LCAweDAwYzAsIDB4MTY4OCwgMHgyMDBhLAorCTB4NzJjYSwgMHgwMDc4LCAweDE1YjksIDB4NzBjNywgMHgwMDA4LCAweDcwY2IsIDB4MDAwZiwgMHg3MGNmLAorCTB4MDAwMCwgMHgwMDc4LCAweDE1YmEsIDB4NzVkOCwgMHg3NmRjLCAweDc1ZGEsIDB4NzZkZSwgMHgwMDc4LAorCTB4MTY5YywgMHgyMDI5LCAweDAwMDAsIDB4MjUzMCwgMHg3MGM0LCAweDcyYzgsIDB4NzNjYywgMHg3NGQwLAorCTB4NzBjNiwgMHg3MmNhLCAweDczY2UsIDB4NzRkMiwgMHhhMDA1LCAweDAwNDAsIDB4MTZlYiwgMHhhNDBhLAorCTB4MDA0MCwgMHgxNmFjLCAweDAwYzgsIDB4MTZiNSwgMHg4MDAxLCAweDc4NzIsIDB4YTA4NCwgMHhmYzAwLAorCTB4MDA0MCwgMHgxNmI5LCAweDc4YWMsIDB4YzA4NSwgMHg3OGFlLCAweDIwMDEsIDB4NDAwNSwgMHgwMDc4LAorCTB4MTViYywgMHg3YjdlLCAweDdhN2EsIDB4N2U4NiwgMHg3ZDgyLCAweDdjNzYsIDB4YTQ4YywgMHhmZjAwLAorCTB4MDA0MCwgMHgxNmQxLCAweDg0MDcsIDB4ODAwNCwgMHg4MDA0LCAweDgxMGMsIDB4ODEwYywgMHg4MTBmLAorCTB4YTExOCwgMHhhMjkxLCAweDAwMDAsIDB4YTZiMSwgMHgwMDAwLCAweGE1ODEsIDB4MDAwMCwgMHgwMDc4LAorCTB4MTZkYiwgMHg4NDA3LCAweDgwMDQsIDB4ODAwNCwgMHhhMzE4LCAweGEyOTEsIDB4MDAwMCwgMHhhNmIxLAorCTB4MDAwMCwgMHhhNTgxLCAweDAwMDAsIDB4NzMxYSwgMHg3MjFlLCAweDc2MjIsIDB4NzAyNiwgMHhhNjA1LAorCTB4MDA0MCwgMHgxNmU1LCAweDdhMTAsIDB4YzJjNSwgMHg3YTEyLCAweDc4YWMsIDB4YTA4NCwgMHhmZmZjLAorCTB4NzhhZSwgMHgwMDc4LCAweDE2ZWUsIDB4NzhhYywgMHhjMDg1LCAweDc4YWUsIDB4MDA3OCwgMHgxNWJhLAorCTB4NzVkOCwgMHg3NmRjLCAweDc1ZGEsIDB4NzZkZSwgMHgwMDc4LCAweDE2ZjksIDB4MjAyOSwgMHgwMDAwLAorCTB4MjUzMCwgMHg3MGM0LCAweDcyYzgsIDB4NzNjYywgMHg3NGQ0LCAweDcwYzYsIDB4NzJjYSwgMHg3M2NlLAorCTB4NzRkNiwgMHhhMDA1LCAweDAwNDAsIDB4MTcyOCwgMHhhNDBhLCAweDAwNDAsIDB4MTcwOSwgMHgwMGM4LAorCTB4MTViYywgMHg4MDAxLCAweDc4OTIsIDB4YTA4NCwgMHhmYzAwLCAweDAwNDAsIDB4MTcxNiwgMHg3OGFjLAorCTB4YzBjNSwgMHg3OGFlLCAweDIwMDEsIDB4NDAwNSwgMHgwMDc4LCAweDE1YmMsIDB4N2E5YSwgMHg3YjllLAorCTB4N2RhMiwgMHg3ZWE2LCAweDI2MDAsIDB4YTUwNSwgMHgwMDQwLCAweDE3MjEsIDB4N2ExMCwgMHhjMmM1LAorCTB4N2ExMiwgMHg3Yzk2LCAweDc4YWMsIDB4YTA4NCwgMHhmY2ZmLCAweDc4YWUsIDB4MDA3OCwgMHgxNzJiLAorCTB4NzhhYywgMHhjMGM1LCAweDc4YWUsIDB4MDA3OCwgMHgxNWJhLCAweDIwMDksIDB4MDAwMCwgMHg3ODZjLAorCTB4YTA2NSwgMHgwMDQwLCAweDE3MzcsIDB4ODEwOCwgMHg2MDAwLCAweDAwNzgsIDB4MTczMCwgMHg3YWM0LAorCTB4MDA3OCwgMHgxNWI4LCAweDIwMDksIDB4NGU0OCwgMHgyMTBjLCAweDc4MTAsIDB4ZDBlYywgMHgwMGMwLAorCTB4MTViOSwgMHgyMDExLCAweDRlODgsIDB4MjIxNCwgMHgwMDc4LCAweDE1YjgsIDB4MjAwOSwgMHg0ZTQ5LAorCTB4MjEwYywgMHg3ODEwLCAweGQwZWMsIDB4MDBjMCwgMHgxNWI5LCAweDIwMTEsIDB4NGU4OSwgMHgyMjE0LAorCTB4MDA3OCwgMHgxNWI4LCAweDIwNjEsIDB4NGU0MCwgMHg2MTI4LCAweDYyMmMsIDB4ODIxNCwgMHg4MjE0LAorCTB4ODIxNCwgMHg3ODEwLCAweGQwZWMsIDB4MDBjMCwgMHgxNzY2LCAweDIwNjEsIDB4NGU4MCwgMHg2MzI4LAorCTB4NzNkYSwgMHg2MzJjLCAweDgzMWMsIDB4ODMxYywgMHg4MzFjLCAweDczZGUsIDB4MDA3OCwgMHgxNWI4LAorCTB4MjAwOSwgMHg0ZTRjLCAweDIxMGMsIDB4NzgxMCwgMHhkMGVjLCAweDAwYzAsIDB4MTViOSwgMHgyMDExLAorCTB4NGU4YywgMHgyMjE0LCAweDAwNzgsIDB4MTViOCwgMHg3OTE4LCAweDAwNzgsIDB4MTViOSwgMHgyMDA5LAorCTB4NGU0ZCwgMHgyMTBjLCAweDc4MTAsIDB4ZDBlYywgMHgwMGMwLCAweDE1YjksIDB4MjAxMSwgMHg0ZThkLAorCTB4MjIxNCwgMHgwMDc4LCAweDE1YjgsIDB4MjAwOSwgMHg0ZTRlLCAweDIxMGMsIDB4NzgxMCwgMHhkMGVjLAorCTB4MDBjMCwgMHgxNWI5LCAweDIwMTEsIDB4NGU4ZSwgMHgyMjE0LCAweDAwNzgsIDB4MTViOCwgMHg3OTIwLAorCTB4NzgxMCwgMHhkMGVjLCAweDAwYzAsIDB4MTViOSwgMHg3YTI0LCAweDAwNzgsIDB4MTViOCwgMHg3MWM0LAorCTB4ZDFmYywgMHgwMGMwLCAweDE3OWYsIDB4MjAxMSwgMHg1MmMwLCAweDAwNzgsIDB4MTdhMSwgMHgyMDExLAorCTB4NTM0MCwgMHg4MTA3LCAweGEwODQsIDB4MDAwZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMjY4LAorCTB4NmEwMCwgMHg2ODA0LCAweGQwOWMsIDB4MDA0MCwgMHgxN2IwLCAweDZiMDgsIDB4MDA3OCwgMHgxN2IxLAorCTB4NmIwYywgMHgwMDc4LCAweDE1YjcsIDB4NzdjNCwgMHgxMDc4LCAweDFkZTQsIDB4MjA5MSwgMHg4MDAwLAorCTB4NmIxYywgMHg2YTE0LCAweDIwOTEsIDB4ODAwMSwgMHgyNzA4LCAweDAwNzgsIDB4MTViNywgMHgyMDYxLAorCTB4NGU0MCwgMHg2MTE4LCAweDc4MTAsIDB4ZDBlYywgMHgwMGMwLCAweDE1YjksIDB4MjA2MSwgMHg0ZTgwLAorCTB4NjIxOCwgMHgwMDc4LCAweDE1YjgsIDB4NzdjNCwgMHgxMDc4LCAweDFkZTQsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjkwOCwgMHg2YTE4LCAweDZiMTAsIDB4NzdkYSwgMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwgMHgxNWI3LAorCTB4NzFjNCwgMHgyMTEwLCAweGEyOTQsIDB4MDAwZiwgMHhhMjgyLCAweDAwMTAsIDB4MDBjOCwgMHgxNWIyLAorCTB4MTA3OCwgMHgyNzdmLCAweGEzODQsIDB4NDAwMCwgMHgwMDQwLCAweDE3ZTgsIDB4YTI5NSwgMHgwMDIwLAorCTB4MDA3OCwgMHgxNWI3LCAweDcxYzQsIDB4MjEwMCwgMHhjMGJjLCAweGEwODIsIDB4MDAxMCwgMHgwMGM4LAorCTB4MTViMiwgMHhkMWJjLCAweDAwYzAsIDB4MTdmOSwgMHgyMDExLCAweDRlNDgsIDB4MjIwNCwgMHgwMDc4LAorCTB4MTdmZCwgMHgyMDExLCAweDRlODgsIDB4MjIwNCwgMHhjMGJkLCAweDAwN2UsIDB4MjEwMCwgMHhjMGJjLAorCTB4MjAxMiwgMHgxMDc4LCAweDI2ZGMsIDB4MDE3ZiwgMHgwMDc4LCAweDE1YjksIDB4NzFjNCwgMHgyMDIxLAorCTB4NGU0OSwgMHgyNDA0LCAweDcwYzYsIDB4MjAxOSwgMHgwMDAwLCAweDAwNzgsIDB4MTgxNSwgMHg3MWM4LAorCTB4MjAyMSwgMHg0ZTg5LCAweDI0MDQsIDB4NzBjYSwgMHhjM2ZkLCAweDIwMTEsIDB4MTgzNCwgMHgyMGE5LAorCTB4MDAwOCwgMHgyMjA0LCAweGExMDYsIDB4MDA0MCwgMHgxODI0LCAweDgyMTAsIDB4MDBmMCwgMHgxODE5LAorCTB4NzFjNCwgMHg3MmM4LCAweDAwNzgsIDB4MTViMSwgMHhhMjkyLCAweDE4MzQsIDB4MDI3ZSwgMHgyMTIyLAorCTB4MDE3ZiwgMHgxMDc4LCAweDI2ZmQsIDB4NzgxMCwgMHhkMGVjLCAweDAwYzAsIDB4MTgzMiwgMHhkM2ZjLAorCTB4MDA0MCwgMHgxODBmLCAweDAwNzgsIDB4MTViYSwgMHgwM2U4LCAweDAwZmEsIDB4MDFmNCwgMHgwMmVlLAorCTB4MDAwNCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywgMHgyMDYxLCAweDRlNDAsIDB4NjEyOCwgMHg2MjJjLAorCTB4ODIxNCwgMHg4MjE0LCAweDgyMTQsIDB4NzBjNCwgMHg2MDJhLCAweDcwYzgsIDB4ODAwMywgMHg4MDAzLAorCTB4ODAwMywgMHg2MDJlLCAweDc4MTAsIDB4ZDBlYywgMHgwMGMwLCAweDE4NjIsIDB4MDI3ZSwgMHgwMTdlLAorCTB4MjA2MSwgMHg0ZTgwLCAweDYxMjgsIDB4NjIyYywgMHg4MjE0LCAweDgyMTQsIDB4ODIxNCwgMHg3MGQ4LAorCTB4NjAyYSwgMHg3MGRjLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweDYwMmUsIDB4NzFkYSwgMHg3MmRlLAorCTB4MDE3ZiwgMHgwMjdmLCAweDAwNzgsIDB4MTViOCwgMHgyMDYxLCAweDRlNDAsIDB4NjEzMCwgMHg3MGM0LAorCTB4NjAzMiwgMHg3ODEwLCAweGQwZWMsIDB4MDBjMCwgMHgxNWI5LCAweDIwNjEsIDB4NGU4MCwgMHg2MjMwLAorCTB4NzBjOCwgMHg2MDMyLCAweDAwNzgsIDB4MTViOCwgMHg3OTE4LCAweDAwNzgsIDB4MTViOSwgMHg3MWM0LAorCTB4YTE4NCwgMHhmZmNmLCAweDAwNDAsIDB4MTg4MywgMHg3ODEwLCAweGQwZWMsIDB4MDBjMCwgMHgxNWIyLAorCTB4NzJjOCwgMHgwMDc4LCAweDE1YjEsIDB4MjAxMSwgMHg0ZTRkLCAweDIyMDQsIDB4MjExMiwgMHgwMDdlLAorCTB4MjAxOSwgMHgwMDAwLCAweDEwNzgsIDB4Mjc2NCwgMHg3ODEwLCAweGQwZWMsIDB4MDA0MCwgMHgxODkzLAorCTB4MDE3ZiwgMHgwMDc4LCAweDE1YjksIDB4NzFjOCwgMHhhMTg0LCAweGZmY2YsIDB4MDA0MCwgMHgxODljLAorCTB4MjExMCwgMHg3MWM0LCAweDAwNzgsIDB4MTViMSwgMHgyMDExLCAweDRlOGQsIDB4MjIwNCwgMHgyMTEyLAorCTB4MDA3ZSwgMHhjM2ZkLCAweDEwNzgsIDB4Mjc2NCwgMHgwMjdmLCAweDAxN2YsIDB4MDA3OCwgMHgxNWI4LAorCTB4NzFjNCwgMHhhMTgyLCAweDAwMTAsIDB4MDA0OCwgMHgxOGI0LCAweDc4MTAsIDB4ZDBlYywgMHgwMGMwLAorCTB4MTViMiwgMHg3MmM4LCAweDAwNzgsIDB4MTViMSwgMHgyMDExLCAweDRlNGUsIDB4MjIwNCwgMHgwMDdlLAorCTB4MjExMiwgMHgyMDE5LCAweDAwMDAsIDB4MTA3OCwgMHgyNzQyLCAweDc4MTAsIDB4ZDBlYywgMHgwMDQwLAorCTB4MThjNCwgMHgwMTdmLCAweDAwNzgsIDB4MTViOSwgMHg3MWM4LCAweGExODIsIDB4MDAxMCwgMHgwMDQ4LAorCTB4MThjZCwgMHgyMTEwLCAweDcxYzQsIDB4MDA3OCwgMHgxNWIxLCAweDIwMTEsIDB4NGU4ZSwgMHgyMjA0LAorCTB4MDA3ZSwgMHgyMTEyLCAweGMzZmQsIDB4MTA3OCwgMHgyNzQyLCAweDAyN2YsIDB4MDE3ZiwgMHgwMDc4LAorCTB4MTViOCwgMHg3MWM0LCAweDcyYzgsIDB4YTE4NCwgMHhmZmZkLCAweDAwYzAsIDB4MTViMSwgMHhhMjg0LAorCTB4ZmZmZCwgMHgwMGMwLCAweDE1YjEsIDB4MjEwMCwgMHg3OTIwLCAweDc4MjIsIDB4MjIwMCwgMHg3YTI0LAorCTB4NzgyNiwgMHgwMDc4LCAweDE1YjgsIDB4NzFjNCwgMHhkMWZjLCAweDAwYzAsIDB4MThmMywgMHgyMDExLAorCTB4NTJjMCwgMHgwMDc4LCAweDE4ZjUsIDB4MjAxMSwgMHg1MzQwLCAweDgxMDcsIDB4YTA4NCwgMHgwMDBmLAorCTB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTI2OCwgMHgyMDE5LCAweDAwMDAsIDB4NzJjOCwgMHgyMDkxLAorCTB4ODAwMCwgMHg2ODAwLCAweDAwN2UsIDB4YTIyNiwgMHgwMDQwLCAweDE5MWUsIDB4NmEwMiwgMHhkNGVjLAorCTB4MDA0MCwgMHgxOTBiLCAweGMzYTUsIDB4ZDRlNCwgMHgwMDQwLCAweDE5MGYsIDB4YzM5ZCwgMHhkNGY0LAorCTB4MDA0MCwgMHgxOTFlLCAweDgxMGYsIDB4ZDJmNCwgMHgwMDQwLCAweDE5MWEsIDB4MTA3OCwgMHgyN2MxLAorCTB4MDA3OCwgMHgxOTFlLCAweDEwNzgsIDB4Mjc5ZiwgMHgwMDc4LCAweDE5MWUsIDB4NzJjYywgMHg2ODA4LAorCTB4YTIwNiwgMHgwMDQwLCAweDE5NDAsIDB4YTJhNCwgMHgwMGZmLCAweDc4MTQsIDB4ZDBlNCwgMHgwMGMwLAorCTB4MTkzMSwgMHhhNDgyLCAweDAwMjgsIDB4MDA0OCwgMHgxOTNkLCAweDAwNDAsIDB4MTkzZCwgMHgwMDc4LAorCTB4MTkzNSwgMHhhNDgyLCAweDAwNDMsIDB4MDA0OCwgMHgxOTNkLCAweDcxYzQsIDB4NzFjNiwgMHgwMjdmLAorCTB4NzJjYSwgMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwgMHgxNWIzLCAweDZhMGEsIDB4YTM5ZCwgMHgwMDBhLAorCTB4NjgwNCwgMHhhMzA1LCAweDY4MDYsIDB4MDI3ZiwgMHg2YjBjLCAweDcxYzQsIDB4MjA5MSwgMHg4MDAxLAorCTB4MDA3OCwgMHgxNWI3LCAweDc3YzQsIDB4MTA3OCwgMHgxZGU0LCAweDIwOTEsIDB4ODAwMCwgMHg2YTE0LAorCTB4NmIxYywgMHgyMDkxLCAweDgwMDEsIDB4NzBjOCwgMHg2ODE2LCAweDcwY2MsIDB4NjgxZSwgMHgyNzA4LAorCTB4MDA3OCwgMHgxNWI3LCAweDcwYzQsIDB4MjA2MSwgMHg0ZTQwLCAweDYxMTgsIDB4NjAxYSwgMHg3ODEwLAorCTB4ZDBlYywgMHgwMGMwLCAweDE1YjksIDB4NzBjOCwgMHgyMDYxLCAweDRlODAsIDB4NjIxOCwgMHg2MDFhLAorCTB4MDA3OCwgMHgxNWI4LCAweDcxYzQsIDB4NzJjOCwgMHg3M2NjLCAweGExODIsIDB4MDAxMCwgMHgwMGM4LAorCTB4MTViMiwgMHgxMDc4LCAweDI3ZTMsIDB4YTM4NCwgMHg0MDAwLCAweDAwNDAsIDB4MTk3OSwgMHhhMjk1LAorCTB4MDAyMCwgMHgwMDc4LCAweDE1YjcsIDB4NzdjNCwgMHgxMDc4LCAweDFkZTQsIDB4MjA5MSwgMHg4MDAwLAorCTB4NmEwOCwgMHhjMjhkLCAweDZhMGEsIDB4MjA5MSwgMHg4MDAxLCAweDI3MDgsIDB4MDA3OCwgMHgxNWI4LAorCTB4NzdjNCwgMHgxMDc4LCAweDFkZTQsIDB4MjA5MSwgMHg4MDAwLCAweDZhMDgsIDB4YTI5NCwgMHhmZmY5LAorCTB4NmEwYSwgMHg2ODA0LCAweGEwMDUsIDB4MDA0MCwgMHgxOTk3LCAweDEwNzgsIDB4MjYyOCwgMHgyMDkxLAorCTB4ODAwMSwgMHgyNzA4LCAweDAwNzgsIDB4MTViOCwgMHg3N2M0LCAweDEwNzgsIDB4MWRlNCwgMHgyMDkxLAorCTB4ODAwMCwgMHg2YTA4LCAweGMyOTUsIDB4NmEwYSwgMHg2ODA0LCAweGEwMDUsIDB4MDA0MCwgMHgxOWFhLAorCTB4MTA3OCwgMHgyNjI4LCAweDIwOTEsIDB4ODAwMSwgMHgyNzA4LCAweDAwNzgsIDB4MTViOCwgMHg3N2M0LAorCTB4MjA0MSwgMHgwMDAxLCAweDIwNDksIDB4MDAwNSwgMHgyMDUxLCAweDAwMjAsIDB4MjA5MSwgMHg4MDAwLAorCTB4MTA3OCwgMHgxZGZmLCAweDIwOTEsIDB4ODAwMSwgMHgyNzA4LCAweDZhMDgsIDB4MDA3OCwgMHgxNWI4LAorCTB4NzdjNCwgMHg3ODE0LCAweGQwZTQsIDB4MDBjMCwgMHgxOWQ0LCAweGQ3ZmMsIDB4MDA0MCwgMHgxOWNlLAorCTB4MTA3OCwgMHgxZDY0LCAweDAwNDAsIDB4MTlkNCwgMHgwMDc4LCAweDE1YmMsIDB4MTA3OCwgMHgxZDU0LAorCTB4MDA0MCwgMHgxOWQ0LCAweDAwNzgsIDB4MTViYywgMHg3M2M4LCAweDcyY2MsIDB4NzdjNiwgMHg3M2NhLAorCTB4NzJjZSwgMHgxMDc4LCAweDFlODYsIDB4MDBjMCwgMHgxOWZlLCAweDY4MTgsIDB4YTAwNSwgMHgwMDQwLAorCTB4MTlmOCwgMHgyNzA4LCAweDA3N2UsIDB4MTA3OCwgMHgyODEzLCAweDA3N2YsIDB4MDBjMCwgMHgxOWY4LAorCTB4MjAwMSwgMHgwMDE1LCAweGQ3ZmMsIDB4MDBjMCwgMHgxOWYxLCAweDIwNjEsIDB4NGU0MCwgMHgwMDc4LAorCTB4MTlmNCwgMHhjMGZkLCAweDIwNjEsIDB4NGU4MCwgMHg3ODJhLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLAorCTB4MjA5MSwgMHg4MDAxLCAweDIwMDEsIDB4NDAwNSwgMHgwMDc4LCAweDE1YmMsIDB4MjA5MSwgMHg4MDAxLAorCTB4MDA3OCwgMHgxNWJhLCAweDc3YzQsIDB4NzgxNCwgMHhkMGU0LCAweDAwYzAsIDB4MWExNiwgMHhkN2ZjLAorCTB4MDA0MCwgMHgxYTEwLCAweDEwNzgsIDB4MWQ2NCwgMHgwMDQwLCAweDFhMTYsIDB4MDA3OCwgMHgxNWJjLAorCTB4MTA3OCwgMHgxZDU0LCAweDAwNDAsIDB4MWExNiwgMHgwMDc4LCAweDE1YmMsIDB4NzdjNiwgMHgyMDQxLAorCTB4MDAyMSwgMHgyMDQ5LCAweDAwMDUsIDB4MjA1MSwgMHgwMDIwLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LAorCTB4MWRmZiwgMHgyMDA5LCAweDAwMTYsIDB4ZDdmYywgMHgwMGMwLCAweDFhMmEsIDB4MjA2MSwgMHg0ZTQwLAorCTB4MDA3OCwgMHgxYTJkLCAweDIwNjEsIDB4NGU4MCwgMHhjMWZkLCAweDYwNjcsIDB4MDAwMywgMHg2MDdmLAorCTB4MDAwMCwgMHg2Nzc2LCAweDYwODMsIDB4MDAwZiwgMHg3OTJhLCAweDYxZDQsIDB4YzFkYywgMHg2MWQ2LAorCTB4MTA3OCwgMHgyNjI4LCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDc3YzgsIDB4NzdjYSwgMHg3N2M0LAorCTB4NzdjNiwgMHg3ODE0LCAweGQwZTQsIDB4MDBjMCwgMHgxYTU0LCAweGQ3ZmMsIDB4MDA0MCwgMHgxYTRlLAorCTB4MTA3OCwgMHgxZDY0LCAweDAwNDAsIDB4MWE1NCwgMHgwMDc4LCAweDE1YmMsIDB4MTA3OCwgMHgxZDU0LAorCTB4MDA0MCwgMHgxYTU0LCAweDAwNzgsIDB4MTViYywgMHhhN2JjLCAweGZmMDAsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjAwOSwgMHgwMDE3LCAweGQ3ZmMsIDB4MDBjMCwgMHgxYTYxLCAweDIwNjEsIDB4NGU0MCwgMHgwMDc4LAorCTB4MWE2NCwgMHgyMDYxLCAweDRlODAsIDB4YzFmZCwgMHg2MDdmLCAweDAwMDAsIDB4NjA2NywgMHgwMDAyLAorCTB4Njc3NiwgMHg2MDgzLCAweDAwMGYsIDB4NzkyYSwgMHg2MWQ0LCAweGMxZGMsIDB4NjFkNiwgMHgxMDc4LAorCTB4MjYyOCwgMHgyMDkxLCAweDgwMDEsIDB4MjA0MSwgMHgwMDIxLCAweDIwNDksIDB4MDAwNSwgMHgyMDUxLAorCTB4MDAxMCwgMHgyMDkxLCAweDgwMDAsIDB4NzBjOCwgMHhhMDA1LCAweDAwNDAsIDB4MWE4MiwgMHg2MGQ0LAorCTB4YzBmZCwgMHg2MGQ2LCAweDEwNzgsIDB4MWRmZiwgMHg3MGM4LCAweDY4MzYsIDB4ODczOCwgMHhhNzg0LAorCTB4MDAxZiwgMHgwMGMwLCAweDFhODIsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4MjAxOSwgMHgwMDAwLAorCTB4NzgxNCwgMHhkMGU0LCAweDAwYzAsIDB4MWFhNCwgMHg3MmM4LCAweGQyODQsIDB4MDA0MCwgMHgxYTllLAorCTB4MTA3OCwgMHgxZDY0LCAweDAwNDAsIDB4MWFhNCwgMHgwMDc4LCAweDE1YmMsIDB4MTA3OCwgMHgxZDU0LAorCTB4MDA0MCwgMHgxYWE0LCAweDAwNzgsIDB4MTViYywgMHg3MmM4LCAweDcyY2EsIDB4NzhhYywgMHhhMDg0LAorCTB4MDAwMywgMHgwMGMwLCAweDFhY2YsIDB4MjAzOSwgMHgwMDAwLCAweGQyODQsIDB4MDA0MCwgMHgxYWIxLAorCTB4YzdmZCwgMHgyMDQxLCAweDAwMjEsIDB4MjA0OSwgMHgwMDA0LCAweDIwNTEsIDB4MDAwOCwgMHgxMDc4LAorCTB4MWRlNCwgMHgyMDkxLCAweDgwMDAsIDB4NjgwOCwgMHhjMGQ0LCAweGE4MGQsIDB4NjkwYSwgMHgyMDkxLAorCTB4ODAwMSwgMHg4NzM4LCAweGE3ODQsIDB4MDAxZiwgMHgwMGMwLCAweDFhYjcsIDB4YTdiYywgMHhmZjAwLAorCTB4ODczZiwgMHg4NzM4LCAweDg3M2YsIDB4YTc4NCwgMHgwZjAwLCAweDAwYzAsIDB4MWFiNywgMHgyMDkxLAorCTB4ODAwMCwgMHg3MmM4LCAweGQyODQsIDB4MDBjMCwgMHgxYWUxLCAweDc4MTAsIDB4ZDBlYywgMHgwMDQwLAorCTB4MWFkZCwgMHgyMDY5LCAweDAxMDAsIDB4MDA3OCwgMHgxYWUzLCAweDIwNjksIDB4MDIwMCwgMHgwMDc4LAorCTB4MWFlMywgMHgyMDY5LCAweDAxMDAsIDB4NjgwOCwgMHhhMDg0LCAweGZmZmQsIDB4NjgwYSwgMHg2ODMwLAorCTB4ZDBiNCwgMHgwMDQwLCAweDFiMDMsIDB4Njg0YiwgMHgwMDA0LCAweDIwYTksIDB4MDAxNCwgMHg2ODQ4LAorCTB4ZDA5NCwgMHgwMDQwLCAweDFhZjUsIDB4MDBmMCwgMHgxYWVmLCAweDY4NGIsIDB4MDAwOSwgMHgyMGE5LAorCTB4MDAxNCwgMHg2ODQ4LCAweGQwODQsIDB4MDA0MCwgMHgxYWZmLCAweDAwZjAsIDB4MWFmOSwgMHgyMGE5LAorCTB4MDBmYSwgMHgwMGYwLCAweDFiMDEsIDB4MjA3OSwgMHg0ZTAwLCAweDIwMDksIDB4MDAxOCwgMHg3MmM4LAorCTB4ZDI4NCwgMHgwMGMwLCAweDFiMGYsIDB4MjA2MSwgMHg0ZTQwLCAweDAwNzgsIDB4MWIxMiwgMHgyMDYxLAorCTB4NGU4MCwgMHhjMWZkLCAweDYwN2YsIDB4MDAwMCwgMHg3OTJhLCAweDYwNjcsIDB4MDAwMSwgMHg2MDgzLAorCTB4MDAwZiwgMHg2MGE3LCAweDAwMDAsIDB4NjBhOCwgMHg2MGIyLCAweDYwYjYsIDB4NjBkNCwgMHhkMGI0LAorCTB4MDA0MCwgMHgxYjJlLCAweGMwYjQsIDB4NjBkNiwgMHgwYzdlLCAweDYwYjgsIDB4YTA2NSwgMHg2MDA4LAorCTB4YzBkNCwgMHg2MDBhLCAweDYwMTgsIDB4ODAwMSwgMHg2MDFhLCAweDBjN2YsIDB4NjBkNCwgMHhhMDg0LAorCTB4NzdmZiwgMHg2MGQ2LCAweDc4YWMsIDB4YzA4ZCwgMHg3OGFlLCAweDgzZmYsIDB4MDA0MCwgMHgxYjM5LAorCTB4MDA3YywgMHg2ODFiLCAweDAwNDcsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4NzNjYywgMHgxMDc4LAorCTB4MWE5MCwgMHg2OWVjLCAweDZhNDgsIDB4YTE4NSwgMHgxODAwLCAweDY4NGEsIDB4YTE4NSwgMHgwMDQwLAorCTB4NjhlZSwgMHg3M2NjLCAweDIwMjEsIDB4MDAwNCwgMHgyMGE5LCAweDA5ZmYsIDB4MDBmMCwgMHgxYjRlLAorCTB4ODQyMSwgMHgwMGMwLCAweDFiNGMsIDB4ODMxOSwgMHgwMGMwLCAweDFiNGEsIDB4NjllZSwgMHg2YTRhLAorCTB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4ZDdmYywgMHgwMGMwLCAweDFiNjIsIDB4MjA2OSwgMHg0ZTQwLAorCTB4MDA3OCwgMHgxYjY0LCAweDIwNjksIDB4NGU4MCwgMHg3MWM0LCAweDcxYzYsIDB4NjkxNiwgMHg4MWZmLAorCTB4MDBjMCwgMHgxYjZjLCAweDY4YTcsIDB4MDAwMSwgMHg3OGFjLCAweGMwOGMsIDB4NzhhZSwgMHhkMDg0LAorCTB4MDBjMCwgMHgxYjc0LCAweDEwNzgsIDB4MWVlNiwgMHgwMDdjLCAweDc1ZDgsIDB4NzRkYywgMHg3NWRhLAorCTB4NzRkZSwgMHgwMDc4LCAweDFiN2UsIDB4MjAyOSwgMHgwMDAwLCAweDI1MjAsIDB4NzFjNCwgMHg3M2M4LAorCTB4NzJjYywgMHg3MWM2LCAweDczY2EsIDB4NzJjZSwgMHgyMDc5LCAweDRlMDAsIDB4N2RkZSwgMHg3Y2RhLAorCTB4N2JkNiwgMHg3YWQyLCAweDEwNzgsIDB4MWRiZCwgMHgwMDQwLCAweDFjODAsIDB4MjBhOSwgMHgwMDA1LAorCTB4MjBhMSwgMHg0ZTE0LCAweDIwOTEsIDB4ODAwMCwgMHg0MWExLCAweDIwOTEsIDB4ODAwMSwgMHgyMDA5LAorCTB4MDA0MCwgMHgxMDc4LCAweDFmZDEsIDB4MDA0MCwgMHgxYmExLCAweDEwNzgsIDB4MWRjNiwgMHgwMDc4LAorCTB4MWM4MCwgMHg2MDA0LCAweGEwOGMsIDB4MDBmZiwgMHhhMThlLCAweDAwMDksIDB4MDBjMCwgMHgxYmFjLAorCTB4MDA3ZSwgMHgxMDc4LCAweDIzNzgsIDB4MDA3ZiwgMHhhMDg0LCAweGZmMDAsIDB4ODAwNywgMHg4MDA5LAorCTB4MDA0MCwgMHgxYzIwLCAweDBjN2UsIDB4MmM2OCwgMHgxMDc4LCAweDFkYmQsIDB4MDA0MCwgMHgxYmYyLAorCTB4MmMwMCwgMHg2ODllLCAweDgxMDksIDB4MDBjMCwgMHgxYmIzLCAweDYwOWYsIDB4MDAwMCwgMHgwYzdmLAorCTB4MGM3ZSwgMHg3ZGRjLCAweDdjZDgsIDB4N2JkNCwgMHg3YWQwLCAweGEyOTAsIDB4MDA0MCwgMHhhMzk5LAorCTB4MDAwMCwgMHhhNGExLCAweDAwMDAsIDB4YTVhOSwgMHgwMDAwLCAweDdkZGUsIDB4N2NkYSwgMHg3YmQ2LAorCTB4N2FkMiwgMHgyYzY4LCAweDY4OWMsIDB4YTA2NSwgMHgwMDQwLCAweDFjMWYsIDB4MjAwOSwgMHgwMDQwLAorCTB4MTA3OCwgMHgxZmQxLCAweDAwYzAsIDB4MWMwOSwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LAorCTB4MDAwMiwgMHgwMGMwLCAweDFiZjIsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDBhLAorCTB4MDBjMCwgMHgxYmVlLCAweDAxN2UsIDB4MTA3OCwgMHgyMzc0LCAweDAxN2YsIDB4MmQwMCwgMHg2MDAyLAorCTB4MDA3OCwgMHgxYmMxLCAweDBjN2YsIDB4MGM3ZSwgMHg2MDljLCAweDEwNzgsIDB4MWU0OSwgMHgwYzdmLAorCTB4NjA5ZiwgMHgwMDAwLCAweDEwNzgsIDB4MWM4NCwgMHgyMDA5LCAweDAwMTgsIDB4NjAwOCwgMHhjMGNkLAorCTB4NjAwYSwgMHg2MDA0LCAweDYwODYsIDB4MTA3OCwgMHgxZDc0LCAweDEwNzgsIDB4MWRjNiwgMHgwMDc4LAorCTB4MWM4MCwgMHgwYzdmLCAweDBjN2UsIDB4NjA5YywgMHgxMDc4LCAweDFlNDksIDB4MGM3ZiwgMHg2MDlmLAorCTB4MDAwMCwgMHgxMDc4LCAweDFjODQsIDB4MjAwOSwgMHgwMDE4LCAweDYwODcsIDB4MDEwMywgMHg2MDFiLAorCTB4MDAwMywgMHgxMDc4LCAweDFkNzQsIDB4MTA3OCwgMHgxZGM2LCAweDAwNzgsIDB4MWM4MCwgMHgwYzdmLAorCTB4NzgxNCwgMHhkMGU0LCAweDAwYzAsIDB4MWM0NSwgMHg2MTE0LCAweGQxZmMsIDB4MDA0MCwgMHgxYzJlLAorCTB4MTA3OCwgMHgxZDY0LCAweDAwNDAsIDB4MWM0NSwgMHgwMDc4LCAweDFjMzIsIDB4MTA3OCwgMHgxZDU0LAorCTB4MDA0MCwgMHgxYzQ1LCAweDIwMjksIDB4MDAwMCwgMHgyNTIwLCAweDIwMDksIDB4MDAxOCwgMHg3M2M4LAorCTB4NzJjYywgMHg2MDg3LCAweDAxMDMsIDB4NjAxYiwgMHgwMDIxLCAweDEwNzgsIDB4MWQ3NCwgMHgxMDc4LAorCTB4MWRjNiwgMHgyMDAxLCAweDQwMDcsIDB4MDA3OCwgMHgxNWJjLCAweDc0YzQsIDB4NzNjOCwgMHg3MmNjLAorCTB4NjAxNCwgMHgyMDkxLCAweDgwMDAsIDB4MGU3ZSwgMHgyMDA5LCAweDAwMTIsIDB4ZDBmYywgMHgwMGMwLAorCTB4MWM1NSwgMHgyMDcxLCAweDRlNDAsIDB4MDA3OCwgMHgxYzU4LCAweDIwNzEsIDB4NGU4MCwgMHhjMWZkLAorCTB4NzkyYSwgMHg3MDY3LCAweDAwMDUsIDB4NzFkNCwgMHhjMWRjLCAweDcxZDYsIDB4NzM2YSwgMHg3MjZlLAorCTB4NzQ3MiwgMHg3MDc2LCAweDcwN2IsIDB4MDAwMCwgMHgyYzAwLCAweDcwN2UsIDB4YTAyZSwgMHgyNTMwLAorCTB4NjExYywgMHhhMTg0LCAweDAwNjAsIDB4MDA0MCwgMHgxYzZmLCAweDEwNzgsIDB4NDYzMiwgMHgwZTdmLAorCTB4NjU5NiwgMHg2NWE2LCAweDY2OWEsIDB4NjZhYSwgMHg2MGFmLCAweDAwMDAsIDB4NjBiMywgMHgwMDAwLAorCTB4NjcxNCwgMHg2MDIzLCAweDAwMDAsIDB4MTA3OCwgMHgyNjI4LCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLAorCTB4NzBjMywgMHg0MDA1LCAweDAwNzgsIDB4MTViZCwgMHgyMGE5LCAweDAwMDUsIDB4MjA5OSwgMHg0ZTE0LAorCTB4MjA5MSwgMHg4MDAwLCAweDUzMGEsIDB4MjA5MSwgMHg4MDAxLCAweDIxMDAsIDB4YTIxMCwgMHhhMzk5LAorCTB4MDAwMCwgMHhhNGExLCAweDAwMDAsIDB4YTVhOSwgMHgwMDAwLCAweDAwN2MsIDB4NzFjNCwgMHg3MGM3LAorCTB4MDAwMCwgMHg3OTFlLCAweDAwNzgsIDB4MTViYSwgMHg3MWM0LCAweDcxYzYsIDB4MjE2OCwgMHgwMDc4LAorCTB4MWNhMywgMHgyMDY5LCAweDEwMDAsIDB4NjkwYywgMHhhMDE2LCAweDJkMDQsIDB4YTIxMCwgMHg4ZDY4LAorCTB4ODEwOSwgMHgwMGMwLCAweDFjYTUsIDB4YTI4NSwgMHgwMDAwLCAweDAwYzAsIDB4MWNiMywgMHg3MGMzLAorCTB4NDAwMCwgMHgwMDc4LCAweDFjYjUsIDB4NzBjMywgMHg0MDAzLCAweDcwY2EsIDB4MDA3OCwgMHgxNWJkLAorCTB4Nzk2NCwgMHg3MWM2LCAweDcxYzQsIDB4YTE4MiwgMHgwMDAzLCAweDAwYzgsIDB4MTViMiwgMHg3OTY2LAorCTB4MDA3OCwgMHgxNWJhLCAweDc5NjQsIDB4NzFjNiwgMHgwMDc4LCAweDE1YmEsIDB4NzkwMCwgMHg3MWM2LAorCTB4NzFjNCwgMHg3OTAyLCAweDAwNzgsIDB4MTViYSwgMHg3OTAwLCAweDcxYzYsIDB4MDA3OCwgMHgxNWJhLAorCTB4NzBjNCwgMHgyMDExLCAweDAwMDAsIDB4YTA4YywgMHgwMDBkLCAweDAwNDAsIDB4MWNlNSwgMHg4MTBjLAorCTB4MDA0OCwgMHgxY2UxLCAweDgyMTAsIDB4ODEwYywgMHg4MTBjLCAweDAwNDgsIDB4MWNlMSwgMHg4MjEwLAorCTB4ODEwYywgMHg4MWZmLCAweDAwYzAsIDB4MTViMywgMHg4MjEwLCAweDdhMGUsIDB4ZDI4YywgMHgwMDQwLAorCTB4MWQxMSwgMHg3OTEwLCAweGMxY2QsIDB4NzkxMiwgMHgyMDA5LCAweDAwMjEsIDB4MjAxOSwgMHgwMDAzLAorCTB4ZDI4NCwgMHgwMDQwLCAweDFkMGIsIDB4ODEwOCwgMHgyMDE5LCAweDAwNDEsIDB4MjAxMSwgMHg5NjRlLAorCTB4MjMxMiwgMHgyMDE5LCAweDAwNDIsIDB4ODIxMCwgMHgyMzEyLCAweDIwMTksIDB4MDA0MywgMHg4MjEwLAorCTB4MjMxMiwgMHgyMDE5LCAweDAwNDYsIDB4ODIxMCwgMHgyMzEyLCAweDIwMTksIDB4MDA0NywgMHg4MjEwLAorCTB4MjMxMiwgMHgyMDE5LCAweDAwMDYsIDB4MjAxMSwgMHg5NjUzLCAweDIxMTIsIDB4MjAxMSwgMHg5NjczLAorCTB4MjMxMiwgMHg3OTA0LCAweDc4MDYsIDB4MDA3OCwgMHgxNWI5LCAweDc4MDQsIDB4NzBjNiwgMHgwMDc4LAorCTB4MTViYSwgMHg3MWM0LCAweGQxZmMsIDB4MDBjMCwgMHgxZDIxLCAweDIwMTEsIDB4NTJjMCwgMHgwMDc4LAorCTB4MWQyMywgMHgyMDExLCAweDUzNDAsIDB4ODEwNywgMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLAorCTB4ODAwMywgMHhhMjY4LCAweDZhMTQsIDB4ZDJiNCwgMHgwMDQwLCAweDFkMzIsIDB4MjAxMSwgMHgwMDAxLAorCTB4MDA3OCwgMHgxZDM0LCAweDIwMTEsIDB4MDAwMCwgMHg2YjBjLCAweDY4MDAsIDB4NzBkYSwgMHgwMDc4LAorCTB4MTViNywgMHgwMTdlLCAweDc4MTQsIDB4ZDBmNCwgMHgwMDQwLCAweDFkNDYsIDB4MjAwMSwgMHg0MDA3LAorCTB4NzBkYiwgMHgwMDAwLCAweGExOGQsIDB4MDAwMSwgMHgwMDc4LCAweDFkNTIsIDB4ZDBmYywgMHgwMDQwLAorCTB4MWQ1MSwgMHgyMDAxLCAweDQwMDcsIDB4NzBkYiwgMHgwMDAxLCAweGExOGQsIDB4MDAwMSwgMHgwMDc4LAorCTB4MWQ1MiwgMHhhMDA2LCAweDAxN2YsIDB4MDA3YywgMHgwMTdlLCAweDc4MTQsIDB4ZDBmNCwgMHgwMDQwLAorCTB4MWQ2MSwgMHgyMDAxLCAweDQwMDcsIDB4NzBkYiwgMHgwMDAwLCAweGExOGQsIDB4MDAwMSwgMHgwMDc4LAorCTB4MWQ2MiwgMHhhMDA2LCAweDAxN2YsIDB4MDA3YywgMHgwMTdlLCAweDc4MTQsIDB4ZDBmYywgMHgwMDQwLAorCTB4MWQ3MSwgMHgyMDAxLCAweDQwMDcsIDB4NzBkYiwgMHgwMDAxLCAweGExOGQsIDB4MDAwMSwgMHgwMDc4LAorCTB4MWQ3MiwgMHhhMDA2LCAweDAxN2YsIDB4MDA3YywgMHg3MTEyLCAweDcyMWEsIDB4NzMxZSwgMHg3ODEwLAorCTB4ZDBjNCwgMHgwMDQwLCAweDFkN2QsIDB4NzQyMiwgMHg3NTI2LCAweGFjODAsIDB4MDAwMSwgMHg4MTA4LAorCTB4ODEwYywgMHg4MWE5LCAweDgwOTgsIDB4MjBhMSwgMHgwMDMwLCAweDcwMDMsIDB4MDAwMCwgMHg2MDg0LAorCTB4MjBhMiwgMHg1M2E2LCAweDcwMDcsIDB4MDAwMSwgMHg3OTc0LCAweGExODQsIDB4ZmYwMCwgMHgwMDQwLAorCTB4MWQ5YSwgMHg4MTBmLCAweDgxMGMsIDB4ODEwYywgMHg4MDA0LCAweDgwMDQsIDB4ODAwNywgMHhhMTAwLAorCTB4MDA3OCwgMHgxZDlkLCAweDgxMDcsIDB4ODAwNCwgMHg4MDA0LCAweDc5N2MsIDB4YTEwOCwgMHg3YTc4LAorCTB4YTAwNiwgMHhhMjExLCAweDdkMTAsIDB4ZDVjNCwgMHgwMDQwLCAweDFkYWEsIDB4N2I4NCwgMHhhMzE5LAorCTB4N2M4MCwgMHhhNDIxLCAweDcwMDgsIDB4ZDBmYywgMHgwMDQwLCAweDFkYWEsIDB4NzAwMywgMHgwMDAxLAorCTB4NzAwNywgMHgwMDA2LCAweDcxMWEsIDB4NzIxZSwgMHg3ZDEwLCAweGQ1YzQsIDB4MDA0MCwgMHgxZGJhLAorCTB4NzMyMiwgMHg3NDI2LCAweGEwODQsIDB4MDFlMCwgMHgwMDdjLCAweDc4NDgsIDB4YTA2NSwgMHgwMDQwLAorCTB4MWRjNSwgMHgyYzA0LCAweDc4NGEsIDB4MjA2MywgMHgwMDAwLCAweDAwN2MsIDB4MGY3ZSwgMHgyMDc5LAorCTB4NGUwMCwgMHg3ODQ4LCAweDIwNjIsIDB4MmMwMCwgMHhhMDA1LCAweDAwYzAsIDB4MWRkMSwgMHgxMDc4LAorCTB4Mjk2YiwgMHg3ODRhLCAweDBmN2YsIDB4MDA3YywgMHgyMDExLCAweDk4MDAsIDB4N2E0YSwgMHg3YmM0LAorCTB4ODMxOSwgMHgwMDQwLCAweDFkZTEsIDB4YTI4MCwgMHgwMDMyLCAweDIwMTIsIDB4MjAxMCwgMHgwMDc4LAorCTB4MWRkOCwgMHgyMDEzLCAweDAwMDAsIDB4MDA3YywgMHgwMTdlLCAweDAyN2UsIDB4ZDdmYywgMHgwMGMwLAorCTB4MWRlZCwgMHgyMDExLCAweDUzYzAsIDB4MDA3OCwgMHgxZGVmLCAweDIwMTEsIDB4NzNjMCwgMHhhNzg0LAorCTB4MGYwMCwgMHg4MDBiLCAweGE3ODQsIDB4MDAxZiwgMHgwMDQwLCAweDFkZmEsIDB4ODAwMywgMHg4MDAzLAorCTB4ODAwMywgMHg4MDAzLCAweGExMDUsIDB4YTI2OCwgMHgwMjdmLCAweDAxN2YsIDB4MDA3YywgMHgxMDc4LAorCTB4MWRlNCwgMHgyOTAwLCAweDY4MmEsIDB4MmEwMCwgMHg2ODJlLCAweDY4MDgsIDB4YTA4NCwgMHhmOWVmLAorCTB4YTgwZCwgMHg2OTBhLCAweDBlN2UsIDB4ZDdmYywgMHgwMGMwLCAweDFlMTQsIDB4MjAwOSwgMHg0ZTUzLAorCTB4MjA3MSwgMHg0ZTQwLCAweDAwNzgsIDB4MWUxOCwgMHgyMDA5LCAweDRlOTMsIDB4MjA3MSwgMHg0ZTgwLAorCTB4MjEwYywgMHg2ODA0LCAweGEwMDUsIDB4MDA0MCwgMHgxZTI4LCAweGExMTYsIDB4MDBjMCwgMHgxZTI4LAorCTB4MjA2MCwgMHg2MDAwLCAweDY4MDYsIDB4MDE3ZSwgMHgyMDBiLCAweDAwMDAsIDB4MDA3OCwgMHgxZTJiLAorCTB4MjAwOSwgMHgwMDAwLCAweDAxN2UsIDB4NjgwNCwgMHhhMDY1LCAweDAwNDAsIDB4MWU0MCwgMHg2MDAwLAorCTB4NjgwNiwgMHgxMDc4LCAweDFlNWIsIDB4MTA3OCwgMHgyMDFkLCAweDY4MTAsIDB4NzkwOCwgMHg4MTA5LAorCTB4NzkwYSwgMHg4MDAxLCAweDY4MTIsIDB4MDBjMCwgMHgxZTJiLCAweDc5MTAsIDB4YzFhNSwgMHg3OTEyLAorCTB4MDE3ZiwgMHg2OTAyLCAweDY5MDYsIDB4MmQwMCwgMHgyMDYwLCAweDEwNzgsIDB4MmFjYywgMHgwZTdmLAorCTB4MDA3YywgMHhhMDY1LCAweDAwNDAsIDB4MWU1YSwgMHgyMDA4LCAweDYwOWMsIDB4YTAwNSwgMHgwMDQwLAorCTB4MWU1NywgMHgyMDYyLCAweDYwOWYsIDB4MDAwMCwgMHhhMDY1LCAweDAwNzgsIDB4MWU0ZCwgMHg3ODQ4LAorCTB4Nzk0YSwgMHgyMDYyLCAweDAwN2MsIDB4NjAwNywgMHgwMTAzLCAweDYwOGYsIDB4MDAwMCwgMHgyMGE5LAorCTB4MDAxYywgMHhhYzgwLCAweDAwMDUsIDB4MjBhMCwgMHgyMDAxLCAweDAwMDAsIDB4NDBhNCwgMHg2ODI4LAorCTB4NjAxYSwgMHg2ODJjLCAweDYwMjIsIDB4MDA3YywgMHgwZTdlLCAweGQ3ZmMsIDB4MDBjMCwgMHgxZTc2LAorCTB4MjA3MSwgMHg0ZTQwLCAweDIwMzEsIDB4NGVjMCwgMHgwMDc4LCAweDFlN2EsIDB4MjA3MSwgMHg0ZTgwLAorCTB4MjAzMSwgMHg1MGMwLCAweDcwNTAsIDB4YTA4YywgMHgwMjAwLCAweDAwYzAsIDB4MWU4NCwgMHhhNjA4LAorCTB4MmQwYSwgMHg4MDAwLCAweDcwNTIsIDB4YTAwNiwgMHgwZTdmLCAweDAwN2MsIDB4MGY3ZSwgMHhkN2ZjLAorCTB4MDBjMCwgMHgxZThlLCAweDIwNzksIDB4NGU0MCwgMHgwMDc4LCAweDFlOTAsIDB4MjA3OSwgMHg0ZTgwLAorCTB4MTA3OCwgMHgxZGU0LCAweDIwOTEsIDB4ODAwMCwgMHg2ODA0LCAweDc4MGEsIDB4YTA2NSwgMHgwMDQwLAorCTB4MWVlNCwgMHgwMDc4LCAweDFlYTIsIDB4MmMwMCwgMHg3ODBhLCAweDIwNjAsIDB4NjAwMCwgMHhhMDY1LAorCTB4MDA0MCwgMHgxZWU0LCAweDYwMTAsIDB4YTMwNiwgMHgwMGMwLCAweDFlOWIsIDB4NjAwYywgMHhhMjA2LAorCTB4MDBjMCwgMHgxZTliLCAweDJjMjgsIDB4Nzg0YywgMHhhYzA2LCAweDAwYzAsIDB4MWViMSwgMHgwMDc4LAorCTB4MWVlMSwgMHg2ODA0LCAweGFjMDYsIDB4MDBjMCwgMHgxZWJmLCAweDYwMDAsIDB4MjA2MCwgMHg2ODA2LAorCTB4YTAwNSwgMHgwMGMwLCAweDFlYmYsIDB4NjgwMywgMHgwMDAwLCAweDAwNzgsIDB4MWVjOSwgMHg2NDAwLAorCTB4NzgwOCwgMHgyMDYwLCAweDY0MDIsIDB4YTQ4NiwgMHgwMDAwLCAweDAwYzAsIDB4MWVjOSwgMHgyYzAwLAorCTB4NjgwMiwgMHgyNTYwLCAweDBmN2YsIDB4MTA3OCwgMHgxZTViLCAweDBmN2UsIDB4NjAxYiwgMHgwMDA1LAorCTB4NjAyMywgMHgwMDIwLCAweDBmN2YsIDB4MTA3OCwgMHgyMDFkLCAweDBmN2UsIDB4NzkwOCwgMHg4MTA5LAorCTB4NzkwYSwgMHg2ODEwLCAweDgwMDEsIDB4NjgxMiwgMHgwMGMwLCAweDFlZTEsIDB4NzgxMCwgMHhjMGE1LAorCTB4NzgxMiwgMHgyMDAxLCAweGZmZmYsIDB4YTAwNSwgMHgwZjdmLCAweDAwN2MsIDB4MDc3ZSwgMHgyNzAwLAorCTB4MjAzOSwgMHgwMDAwLCAweGQwZmMsIDB4MDA0MCwgMHgxZWVlLCAweGM3ZmQsIDB4MjA0MSwgMHgwMDIxLAorCTB4MjA0OSwgMHgwMDA0LCAweDIwNTEsIDB4MDAwOCwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHgxZGZmLAorCTB4ODczOCwgMHhhNzg0LCAweDAwMWYsIDB4MDBjMCwgMHgxZWY2LCAweGE3YmMsIDB4ZmYwMCwgMHg4NzNmLAorCTB4ODczOCwgMHg4NzNmLCAweGE3ODQsIDB4MGYwMCwgMHgwMGMwLCAweDFlZjYsIDB4MjA5MSwgMHg4MDAxLAorCTB4MDc3ZiwgMHgwMDdjLCAweDc4NmMsIDB4MjAwOSwgMHg5Njc0LCAweDIxMGMsIDB4YTEwZCwgMHgwMDQwLAorCTB4MWYxNCwgMHhhMDY1LCAweDAwNzgsIDB4MjM5NSwgMHgyMDYxLCAweDAwMDAsIDB4NjAxOCwgMHhkMDg0LAorCTB4MDBjMCwgMHgxZjM0LCAweDc4MTAsIDB4ZDA4YywgMHgwMDQwLCAweDFmMjUsIDB4YzA4YywgMHg3ODEyLAorCTB4YzdmYywgMHgyMDY5LCAweDRlNDAsIDB4MDA3OCwgMHgxZjJhLCAweGMwOGQsIDB4NzgxMiwgMHgyMDY5LAorCTB4NGU4MCwgMHhjN2ZkLCAweDIwOTEsIDB4ODAwMCwgMHg2ODFjLCAweDY4MWYsIDB4MDAwMCwgMHgyMDkxLAorCTB4ODAwMSwgMHhhMDA1LCAweDAwYzAsIDB4MWYzNSwgMHgwMDdjLCAweGEwOGMsIDB4ZmZmMCwgMHgwMDQwLAorCTB4MWYzYiwgMHgxMDc4LCAweDI5NmIsIDB4MDA3OSwgMHgxZjNkLCAweDFmNGQsIDB4MWY1MCwgMHgxZjU2LAorCTB4MWY1YSwgMHgxZjRlLCAweDFmNWUsIDB4MWY0ZSwgMHgxZjRlLCAweDFmNGUsIDB4MWY2NCwgMHgxZjk1LAorCTB4MWY5OSwgMHgxZjlmLCAweDFmYjQsIDB4MWY0ZSwgMHgxZjRlLCAweDAwN2MsIDB4MTA3OCwgMHgyOTZiLAorCTB4MTA3OCwgMHgxZWU2LCAweDIwMDEsIDB4ODAwMSwgMHgwMDc4LCAweDFmYzAsIDB4MjAwMSwgMHg4MDAzLAorCTB4MDA3OCwgMHgxZmMwLCAweDIwMDEsIDB4ODAwNCwgMHgwMDc4LCAweDFmYzAsIDB4MTA3OCwgMHgxZWU2LAorCTB4MjAwMSwgMHg4MDA2LCAweDAwNzgsIDB4MWZjMCwgMHgyMDkxLCAweDgwMDAsIDB4MDc3ZSwgMHhkN2ZjLAorCTB4MDBjMCwgMHgxZjcwLCAweDIwNjksIDB4NGU0MCwgMHgyMDM5LCAweDAwMDksIDB4MDA3OCwgMHgxZjc0LAorCTB4MjA2OSwgMHg0ZTgwLCAweDIwMzksIDB4MDAwOSwgMHg2ODAwLCAweGEwODYsIDB4MDAwMCwgMHgwMDQwLAorCTB4MWY3ZSwgMHgwMDdmLCAweDZmMWUsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4Njg3NCwgMHgwNzdmLAorCTB4YTBiYywgMHhmZjAwLCAweDIwNDEsIDB4MDAyMSwgMHgyMDQ5LCAweDAwMDQsIDB4MjA1MSwgMHgwMDEwLAorCTB4MTA3OCwgMHgxZGZmLCAweDg3MzgsIDB4YTc4NCwgMHgwMDFmLCAweDAwYzAsIDB4MWY4OCwgMHgyMDkxLAorCTB4ODAwMSwgMHgyMDAxLCAweDgwMGEsIDB4MDA3OCwgMHgxZmMwLCAweDIwMDEsIDB4ODAwYywgMHgwMDc4LAorCTB4MWZjMCwgMHgxMDc4LCAweDFlZTYsIDB4MjAwMSwgMHg4MDBkLCAweDAwNzgsIDB4MWZjMCwgMHg3ODE0LAorCTB4ZDBlNCwgMHgwMGMwLCAweDFmYjIsIDB4ZDBlYywgMHgwMDQwLCAweDFmYWMsIDB4ZDdmYywgMHgwMDQwLAorCTB4MWZhYywgMHg3OGU0LCAweDAwNzgsIDB4MWZhZCwgMHg3OGUwLCAweDcwYzYsIDB4MjAwMSwgMHg4MDBlLAorCTB4MDA3OCwgMHgxZmMwLCAweDAwNzgsIDB4MWY0ZSwgMHhkN2ZjLCAweDAwNDAsIDB4MWZiYSwgMHg3OGVjLAorCTB4MDA3OCwgMHgxZmJiLCAweDc4ZTgsIDB4NzBjNiwgMHgyMDAxLCAweDgwMGYsIDB4MDA3OCwgMHgxZmMwLAorCTB4NzBjMiwgMHhkN2ZjLCAweDAwYzAsIDB4MWZjOCwgMHg3MGRiLCAweDAwMDAsIDB4MDA3OCwgMHgxZmNhLAorCTB4NzBkYiwgMHgwMDAxLCAweDIwNjEsIDB4MDAwMCwgMHg2MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLAorCTB4MDA3YywgMHhhYzgwLCAweDAwMDEsIDB4ODFmZiwgMHgwMDQwLCAweDFmZmMsIDB4MjA5OSwgMHgwMDMwLAorCTB4MjBhMCwgMHg3MDBjLCAweGEwODQsIDB4MDNmZiwgMHgwMDQwLCAweDFmZGUsIDB4NzAxOCwgMHgwMDdlLAorCTB4NzAxYywgMHgwMDdlLCAweDcwMjAsIDB4MDA3ZSwgMHg3MDI0LCAweDAwN2UsIDB4NzExMiwgMHg4MWFjLAorCTB4NzIxYSwgMHg3MzFlLCAweDc0MjIsIDB4NzUyNiwgMHg3MDAzLCAweDAwMDEsIDB4NzAwNywgMHgwMDAxLAorCTB4NzAwOCwgMHg4MDBiLCAweDAwYzgsIDB4MWZmMCwgMHg3MDA3LCAweDAwMDIsIDB4YTA4YywgMHgwMWUwLAorCTB4MDBjMCwgMHgxZmZjLCAweDUzYTUsIDB4YTAwNiwgMHg3MDAzLCAweDAwMDAsIDB4NzAwNywgMHgwMDA0LAorCTB4MDA3ZiwgMHg3MDI2LCAweDAwN2YsIDB4NzAyMiwgMHgwMDdmLCAweDcwMWUsIDB4MDA3ZiwgMHg3MDFhLAorCTB4MDA3YywgMHgyMDExLCAweDAwMjAsIDB4MjAwOSwgMHgwMDEwLCAweDZiMGEsIDB4NmMwZSwgMHg2ODAzLAorCTB4ZmQwMCwgMHg2ODA3LCAweDAwMTgsIDB4NmExYSwgMHgyZDAwLCAweGEwZTgsIDB4MDAwOCwgMHhhMjkwLAorCTB4MDAwNCwgMHg4MTA5LCAweDAwYzAsIDB4MjAwZCwgMHgwMDdjLCAweDYwMDQsIDB4NjA4NiwgMHgyYzA4LAorCTB4MjA2MywgMHgwMDAwLCAweDc4NjgsIDB4YTAwNSwgMHg3OTZhLCAweDAwNDAsIDB4MjAyYSwgMHgyYzAyLAorCTB4MDA3OCwgMHgyMDJiLCAweDc5NmUsIDB4MDA3YywgMHgwYzdlLCAweDIwNjEsIDB4NGUwMCwgMHg2ODg3LAorCTB4MDEwMywgMHgyZDA4LCAweDIwNmIsIDB4MDAwMCwgMHg2MDY4LCAweGEwMDUsIDB4NjE2YSwgMHgwMDQwLAorCTB4MjAzYywgMHgyZDAyLCAweDAwNzgsIDB4MjAzZCwgMHg2MTZlLCAweDBjN2YsIDB4MDA3YywgMHgyMDkxLAorCTB4ODAwMCwgMHgyYzA0LCAweDc4NmUsIDB4YTAwNSwgMHgwMGMwLCAweDIwNDcsIDB4Nzg2YSwgMHgyMDkxLAorCTB4ODAwMSwgMHg2MDljLCAweGEwMDUsIDB4MDA0MCwgMHgyMDYwLCAweDBjN2UsIDB4MjA2MCwgMHgyMDA4LAorCTB4NjA5YywgMHhhMDA1LCAweDAwNDAsIDB4MjA1YywgMHgyMDYyLCAweDYwOWYsIDB4MDAwMCwgMHhhMDY1LAorCTB4NjA5YywgMHhhMDA1LCAweDAwYzAsIDB4MjA1NCwgMHg3ODQ4LCAweDc5NGEsIDB4MjA2MiwgMHgwYzdmLAorCTB4Nzg0OCwgMHgyMDYyLCAweDYwOWYsIDB4MDAwMCwgMHhhYzg1LCAweDAwMDAsIDB4MDBjMCwgMHgyMDZhLAorCTB4MTA3OCwgMHgyOTZiLCAweDc4NGEsIDB4MDA3YywgMHgyMGE5LCAweDAwMTAsIDB4YTAwNiwgMHg4MDA0LAorCTB4ODA4NiwgMHg4MThlLCAweDAwYzgsIDB4MjA3NSwgMHhhMjAwLCAweDAwZjAsIDB4MjA3MCwgMHg4MDg2LAorCTB4ODE4ZSwgMHgwMDdjLCAweDE1N2UsIDB4MjBhOSwgMHgwMDEwLCAweGEwMDUsIDB4MDA0MCwgMHgyMDliLAorCTB4YTExYSwgMHgwMGM4LCAweDIwOWIsIDB4ODIxMywgMHg4MThkLCAweDAwNDgsIDB4MjA4ZSwgMHhhMTFhLAorCTB4MDBjOCwgMHgyMDhmLCAweDAwZjAsIDB4MjA4MywgMHgwMDc4LCAweDIwOTMsIDB4YTExYSwgMHgyMzA4LAorCTB4ODIxMCwgMHgwMGYwLCAweDIwODMsIDB4MDA3ZSwgMHgzMjAwLCAweGEwODQsIDB4ZjdmZiwgMHgyMDgwLAorCTB4MDA3ZiwgMHgxNTdmLCAweDAwN2MsIDB4MDA3ZSwgMHgzMjAwLCAweGEwODUsIDB4MDgwMCwgMHgwMDc4LAorCTB4MjA5NywgMHg3ZDc0LCAweDcwZDAsIDB4YTUwNiwgMHgwMDQwLCAweDIxODcsIDB4NzgxMCwgMHgyMDUwLAorCTB4NzgwMCwgMHhkMDhjLCAweDAwNDAsIDB4MjBjMywgMHhkYWVjLCAweDAwNDAsIDB4MjBjMywgMHgwZTdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MDAyMCwgMHg3MDA0LCAweGEwMDUsIDB4MDBjMCwgMHgyMGMwLAorCTB4NzAwOCwgMHgwZTdmLCAweGEwODYsIDB4MDAwOCwgMHgwMDQwLCAweDIwYzMsIDB4MDA3OCwgMHgyMTg3LAorCTB4MGU3ZiwgMHgwMDc4LCAweDIxODcsIDB4MTA3OCwgMHgxZGJkLCAweDAwNDAsIDB4MjE4NywgMHhhMDQ2LAorCTB4Nzk3MCwgMHgyNTAwLCAweDgwMDAsIDB4YTExMiwgMHgyMDA5LCAweDAwNDAsIDB4MDBjOCwgMHgyMGQyLAorCTB4MDA3OCwgMHgyMGQ5LCAweDcyZDAsIDB4YTIwNiwgMHgwMDQwLCAweDIwZDksIDB4ODg0MCwgMHgyMDA5LAorCTB4MDA4MCwgMHgwYzdlLCAweDcxMTIsIDB4NzAwNywgMHgwMDAxLCAweDIwOTksIDB4MDAzMCwgMHgyMGE5LAorCTB4MDAyMCwgMHhhYzgwLCAweDAwMDEsIDB4MjBhMCwgMHgyMDYxLCAweDAwMDAsIDB4ODhmZiwgMHgwMDQwLAorCTB4MjBlYiwgMHgxMDc4LCAweDFkYmQsIDB4NzAwOCwgMHhkMGZjLCAweDAwNDAsIDB4MjBlYiwgMHg3MDA3LAorCTB4MDAwMiwgMHgyMDkxLCAweDgwMDEsIDB4YTA4YywgMHgwMWUwLCAweDAwYzAsIDB4MjEyMiwgMHg1M2E1LAorCTB4OGNmZiwgMHgwMGMwLCAweDIxMDAsIDB4ODhmZiwgMHgwMDQwLCAweDIxNzEsIDB4MDA3OCwgMHgyMTBhLAorCTB4MmMwMCwgMHg3ODhlLCAweDIwYTksIDB4MDAyMCwgMHhhYzgwLCAweDAwMDEsIDB4MjBhMCwgMHg1M2E1LAorCTB4MDA3OCwgMHgyMTcxLCAweGEwNDYsIDB4NzIxOCwgMHg3MzFjLCAweGRhYzQsIDB4MDA0MCwgMHgyMTEyLAorCTB4NzQyMCwgMHg3NTI0LCAweGEyOTIsIDB4MDA0MCwgMHhhMzliLCAweDAwMDAsIDB4YTRhMywgMHgwMDAwLAorCTB4YTVhYiwgMHgwMDAwLCAweDcyMWEsIDB4NzMxZSwgMHhkYWM0LCAweDAwNDAsIDB4MjEyMiwgMHg3NDIyLAorCTB4NzUyNiwgMHhhMDA2LCAweDcwMDcsIDB4MDAwNCwgMHgwMDQwLCAweDIxNzEsIDB4OGNmZiwgMHgwMDQwLAorCTB4MjEyYiwgMHgxMDc4LCAweDFkYzYsIDB4MGM3ZiwgMHgxMDc4LCAweDFkYzYsIDB4YTA0NiwgMHg3ODg4LAorCTB4ODAwMCwgMHg3ODhhLCAweGEwODYsIDB4MDAwMiwgMHgwMDQwLCAweDIxNTEsIDB4N2E3YywgMHg3Yjc4LAorCTB4ZGFjNCwgMHgwMDQwLCAweDIxM2QsIDB4N2M4NCwgMHg3ZDgwLCAweDc5NzQsIDB4ODEwNywgMHg4MDA0LAorCTB4ODAwNCwgMHhhMjEwLCAweGEzOTksIDB4MDAwMCwgMHhhNGExLCAweDAwMDAsIDB4YTVhOSwgMHgwMDAwLAorCTB4NzIxYSwgMHg3MzFlLCAweGRhYzQsIDB4MDA0MCwgMHgyMTg3LCAweDc0MjIsIDB4NzUyNiwgMHgwMDc4LAorCTB4MjE4NywgMHg2MDE0LCAweGQwZmMsIDB4MDBjMCwgMHgyMTU5LCAweDIwNjksIDB4NGU0MCwgMHgwMDc4LAorCTB4MjE1YiwgMHgyMDY5LCAweDRlODAsIDB4MjA5MSwgMHg4MDAwLCAweDY4MWYsIDB4MDAwMiwgMHg4OGZmLAorCTB4MDA0MCwgMHgyMTY3LCAweGEwNDYsIDB4Nzg4YywgMHgyMDYwLCAweDAwNzgsIDB4MjE1MSwgMHg3ODhiLAorCTB4MDAwMCwgMHg3OGFjLCAweGEwODUsIDB4MDAwMywgMHg3OGFlLCAweDIwOTEsIDB4ODAwMSwgMHgwMDc4LAorCTB4MjE4NywgMHgwYzdmLCAweDc4OGIsIDB4MDAwMCwgMHgxMDc4LCAweDIzNDYsIDB4NjAwNCwgMHhhMDg0LAorCTB4MDAwZiwgMHgxMDc4LCAweDIxODgsIDB4ODhmZiwgMHgwMDQwLCAweDIxODUsIDB4Nzg4YywgMHgyMDYwLAorCTB4NjAwNCwgMHhhMDg0LCAweDAwMGYsIDB4MTA3OCwgMHgyMTg4LCAweDAwNzgsIDB4MjBhMSwgMHgwMDdjLAorCTB4MDA3OSwgMHgyMThhLCAweDIxOWEsIDB4MjFiOCwgMHgyMWQ2LCAweDIxOWEsIDB4MjFlNywgMHgyMWFiLAorCTB4MjE5YSwgMHgyMTlhLCAweDIxOWEsIDB4MjFiNiwgMHgyMWQ0LCAweDIxOWEsIDB4MjE5YSwgMHgyMTlhLAorCTB4MjE5YSwgMHgyMTlhLCAweDIwMzksIDB4MDQwMCwgMHg3OGJjLCAweGE3MDUsIDB4NzhiZSwgMHg2MDA4LAorCTB4YTcwNSwgMHg2MDBhLCAweDEwNzgsIDB4MjIyYSwgMHg2MDljLCAweDc4YmEsIDB4NjA5ZiwgMHgwMDAwLAorCTB4MTA3OCwgMHgyMzMwLCAweDAwN2MsIDB4NzhiYywgMHhkMGM0LCAweDAwNDAsIDB4MjFiMSwgMHgwMDc4LAorCTB4MjE5YSwgMHg2MDFjLCAweGMwYmQsIDB4NjAxZSwgMHgwMDc4LCAweDIxYmUsIDB4MTA3OCwgMHgyMzc4LAorCTB4NzhiYywgMHhkMGM0LCAweDAwNDAsIDB4MjFiZSwgMHgwMDc4LCAweDIxOWEsIDB4NzhiZiwgMHgwMDAwLAorCTB4NjAwNCwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHg3OGIyLCAweDgwMDEsIDB4MDA0MCwgMHgyMWQxLAorCTB4MTA3OCwgMHgyMjJhLCAweDAwNDAsIDB4MjFkMSwgMHg3OGJjLCAweGMwYzUsIDB4NzhiZSwgMHgwMDc4LAorCTB4MjFkMywgMHgwMDc4LCAweDIyNDksIDB4MDA3YywgMHgxMDc4LCAweDIzNzQsIDB4NzhiYywgMHhhMDhjLAorCTB4MGUwMCwgMHgwMGMwLCAweDIxZGUsIDB4ZDBjNCwgMHgwMGMwLCAweDIxZTAsIDB4MDA3OCwgMHgyMTlhLAorCTB4MTA3OCwgMHgyMjJhLCAweDAwYzAsIDB4MjFlNiwgMHgwMDc4LCAweDIyNDksIDB4MDA3YywgMHg3OGJjLAorCTB4ZDBjNCwgMHgwMDQwLCAweDIxZWQsIDB4MDA3OCwgMHgyMTlhLCAweDc4YmYsIDB4MDAwMCwgMHg2NzE0LAorCTB4MjAxMSwgMHgwMDAxLCAweDIyYTgsIDB4NjAxOCwgMHhhMDg0LCAweDAwZmYsIDB4YTAwNSwgMHgwMDQwLAorCTB4MjIwZCwgMHhhN2JjLCAweGZmMDAsIDB4MjBhOSwgMHgwMDIwLCAweGEwOGUsIDB4MDAwMSwgMHgwMDQwLAorCTB4MjIwZCwgMHhhN2JjLCAweDgwMDAsIDB4MjAxMSwgMHgwMDAyLCAweDIwYTksIDB4MDEwMCwgMHhhMDhlLAorCTB4MDAwMiwgMHgwMDQwLCAweDIyMGQsIDB4MDA3OCwgMHgyMjI3LCAweDEwNzgsIDB4MWRlNCwgMHgyZDAwLAorCTB4MjA5MSwgMHg4MDAwLCAweDY4MmIsIDB4MDAwMCwgMHg2ODJmLCAweDAwMDAsIDB4NjgwOCwgMHhhMDg0LAorCTB4ZmZkZSwgMHg2ODBhLCAweGFkZTgsIDB4MDAxMCwgMHgyMDkxLCAweDgwMDEsIDB4MDBmMCwgMHgyMjEwLAorCTB4ODIxMSwgMHgwMDQwLCAweDIyMjcsIDB4MjBhOSwgMHgwMTAwLCAweDAwNzgsIDB4MjIxMCwgMHgxMDc4LAorCTB4MWRjNiwgMHgwMDdjLCAweDYwOWYsIDB4MDAwMCwgMHg3OGI0LCAweGEwNmQsIDB4MmMwMCwgMHg3OGI2LAorCTB4MDBjMCwgMHgyMjM1LCAweDc4YmEsIDB4MDA3OCwgMHgyMjNkLCAweDY4OWUsIDB4MmQwMCwgMHg2MDAyLAorCTB4NzhiOCwgMHhhZDA2LCAweDAwYzAsIDB4MjIzZCwgMHg2MDAyLCAweDc4YjAsIDB4ODAwMSwgMHg3OGIyLAorCTB4MDBjMCwgMHgyMjQ4LCAweDc4YmMsIDB4YzBjNCwgMHg3OGJlLCAweDc4YjgsIDB4MjA2MCwgMHhhMDA2LAorCTB4MDA3YywgMHgwZTdlLCAweGEwMmUsIDB4MjUzMCwgMHg3ZGJhLCAweDdkYjYsIDB4NjVhZSwgMHg2NWIyLAorCTB4NjAxYywgMHg2MGEyLCAweDIwNDgsIDB4YTk4NCwgMHhlMWZmLCAweDYwMWUsIDB4YTk4NCwgMHgwMDYwLAorCTB4MDA0MCwgMHgyMjVjLCAweDEwNzgsIDB4NDYzMiwgMHg2NTk2LCAweDY1YTYsIDB4NjY5YSwgMHg2NmFhLAorCTB4NjcxNCwgMHgyMDcxLCAweDRlODAsIDB4ZDdmYywgMHgwMGMwLCAweDIyNjgsIDB4MjA3MSwgMHg0ZTQwLAorCTB4YTc4NCwgMHgwZjAwLCAweDgwMGIsIDB4YTc4NCwgMHgwMDFmLCAweDAwNDAsIDB4MjI3MywgMHg4MDAzLAorCTB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTEwNSwgMHg3MWM0LCAweGExNjgsIDB4MjcwMCwgMHg4MDA3LAorCTB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweDcxYzgsIDB4YTEwMCwgMHg2MGMyLAorCTB4MjA5MSwgMHg4MDAwLCAweDc4MTQsIDB4ZDBjNCwgMHgwMDQwLCAweDIyOTgsIDB4ZDBlYywgMHgwMDQwLAorCTB4MjI5NCwgMHhkN2ZjLCAweDAwYzAsIDB4MjI5MSwgMHhkMGY0LCAweDAwYzAsIDB4MjI5ZiwgMHgwMDc4LAorCTB4MjI5OCwgMHhkMGZjLCAweDAwYzAsIDB4MjI5ZiwgMHg3ODEwLCAweGQwZjQsIDB4MDBjMCwgMHgyMjlmLAorCTB4NmUwOCwgMHhkNjg0LCAweDAwNDAsIDB4MjJjOSwgMHhkOWZjLCAweDAwYzAsIDB4MjJjOSwgMHgyMDkxLAorCTB4ODAwMSwgMHgxMDc4LCAweDFlNWIsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4MjAxZCwgMHgyMDkxLAorCTB4ODAwMSwgMHg3ODE0LCAweGQwZTQsIDB4MDBjMCwgMHgyMzJlLCAweDc4MTQsIDB4ZDBjNCwgMHgwMDQwLAorCTB4MjMyZSwgMHhkMGVjLCAweDAwNDAsIDB4MjJjMSwgMHhkN2ZjLCAweDAwYzAsIDB4MjJiYywgMHhkMGY0LAorCTB4MDBjMCwgMHgyMmM1LCAweDAwNzgsIDB4MjMyZSwgMHhkMGZjLCAweDAwYzAsIDB4MjJjNSwgMHgwMDc4LAorCTB4MjMyZSwgMHg3ODEwLCAweGQwZjQsIDB4MDA0MCwgMHgyMzJlLCAweDYwMWIsIDB4MDAyMSwgMHgwMDc4LAorCTB4MjMyZSwgMHg2MDI0LCAweGEwOTYsIDB4MDAwMSwgMHgwMGMwLCAweDIyZDAsIDB4ODAwMCwgMHg2MDI2LAorCTB4NmExMCwgMHg2ODE0LCAweGEyMDIsIDB4MDA0OCwgMHgyMmUzLCAweDAwNDAsIDB4MjJlMywgMHgyMDkxLAorCTB4ODAwMSwgMHgyMDM5LCAweDAyMDAsIDB4NjA5YywgMHg3OGJhLCAweDYwOWYsIDB4MDAwMCwgMHgxMDc4LAorCTB4MjMzMCwgMHgwMDc4LCAweDIzMmUsIDB4MmMwOCwgMHhkOWZjLCAweDAwNDAsIDB4MjMwYiwgMHg2ODAwLAorCTB4YTA2NSwgMHgwMDQwLCAweDIzMGIsIDB4NmEwNCwgMHg3MDAwLCAweGEwODQsIDB4MDAwMiwgMHgwMDQwLAorCTB4MjMwMSwgMHg3MDRjLCAweGEyMDYsIDB4MDBjMCwgMHgyMzAxLCAweDZiMDQsIDB4MjE2MCwgMHgyMzA0LAorCTB4NjAwMiwgMHhhMDA1LCAweDAwYzAsIDB4MjJmZCwgMHg2OTAyLCAweDIyNjAsIDB4NjEwMiwgMHgwMDc4LAorCTB4MjMxNywgMHgyZDAwLCAweDIwNjAsIDB4MTA3OCwgMHgyYWNjLCAweDZlMDgsIDB4MjE2MCwgMHg2MjAyLAorCTB4NjkwNiwgMHgwMDc4LCAweDIzMTcsIDB4NjgwMCwgMHg2OTAyLCAweGEwNjUsIDB4MDA0MCwgMHgyMzEzLAorCTB4NjEwMiwgMHgwMDc4LCAweDIzMTQsIDB4NjkwNiwgMHgyMTYwLCAweDYwMDMsIDB4MDAwMCwgMHgyMTYwLAorCTB4ZDlmYywgMHgwMDQwLCAweDIzMWUsIDB4YTZiNCwgMHhmZmZjLCAweDZlMGEsIDB4NjgxMCwgMHg3ZDA4LAorCTB4ODUyOCwgMHg3ZDBhLCAweDgwMDAsIDB4NjgxMiwgMHgyMDkxLCAweDgwMDEsIDB4ZDZiNCwgMHgwMDQwLAorCTB4MjMyZSwgMHhhNmI2LCAweDAwNDAsIDB4NmUwYSwgMHgxMDc4LCAweDFlNmMsIDB4MGU3ZiwgMHgwMDdjLAorCTB4NjAwOCwgMHhhNzA1LCAweDYwMGEsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4MjAxZCwgMHgyMDkxLAorCTB4ODAwMSwgMHg3OGI4LCAweGEwNjUsIDB4MDA0MCwgMHgyMzQzLCAweDYwOWMsIDB4NzhiYSwgMHg2MDlmLAorCTB4MDAwMCwgMHgwMDc4LCAweDIzMzAsIDB4NzhiNiwgMHg3OGJhLCAweDAwN2MsIDB4Nzk3MCwgMHg3ODc0LAorCTB4MjgxOCwgMHhkMzg0LCAweDAwNDAsIDB4MjM1MCwgMHg4MDAwLCAweGExMTIsIDB4MDA0OCwgMHgyMzU1LAorCTB4ODAwMCwgMHhhMTEyLCAweDAwYzgsIDB4MjM2NSwgMHhjMzg0LCAweDdhN2MsIDB4NzIxYSwgMHg3YTc4LAorCTB4NzIxZSwgMHhkYWM0LCAweDAwNDAsIDB4MjM2MCwgMHg3YTg0LCAweDcyMjIsIDB4N2E4MCwgMHg3MjI2LAorCTB4YTAwNiwgMHhkMzg0LCAweDAwNDAsIDB4MjM2NSwgMHg4MDAwLCAweDc4NzYsIDB4NzBkMiwgMHg3ODFjLAorCTB4YTAwNSwgMHgwMDQwLCAweDIzNzMsIDB4ODAwMSwgMHg3ODFlLCAweDAwYzAsIDB4MjM3MywgMHgwMDY4LAorCTB4MjM3MywgMHgyMDkxLCAweDQwODAsIDB4MDA3YywgMHgyMDM5LCAweDIzOGMsIDB4MDA3OCwgMHgyMzdhLAorCTB4MjAzOSwgMHgyMzkyLCAweDI3MDQsIDB4YTAwNSwgMHgwMDQwLCAweDIzOGIsIDB4YWMwMCwgMHgyMDY4LAorCTB4NjkwOCwgMHg2ODEwLCAweDY5MTIsIDB4NjgwYSwgMHg2OTBjLCAweDY4MTQsIDB4NjkxNiwgMHg2ODBlLAorCTB4ODczOCwgMHgwMDc4LCAweDIzN2EsIDB4MDA3YywgMHgwMDAzLCAweDAwMDksIDB4MDAwZiwgMHgwMDE1LAorCTB4MDAxYiwgMHgwMDAwLCAweDAwMTUsIDB4MDAxYiwgMHgwMDAwLCAweDIwNDEsIDB4MDAwMCwgMHg3ODBjLAorCTB4MDA3OSwgMHgyMzlhLCAweDI1NmMsIDB4MjUzZiwgMHgyMzllLCAweDI0MTcsIDB4MjAzOSwgMHg5Njc0LAorCTB4MjczNCwgMHg3ZDEwLCAweDAwNzgsIDB4MjNiZSwgMHg2MDg0LCAweGEwODYsIDB4MDEwMywgMHgwMGMwLAorCTB4MjQwMCwgMHg2MTE0LCAweDYwMTgsIDB4YTEwNSwgMHgwMDQwLCAweDIzYjMsIDB4ODZmZiwgMHgwMGMwLAorCTB4MjNjZiwgMHgwMDc4LCAweDI0MDAsIDB4ODYwMywgMHhhMDgwLCAweDk2NTUsIDB4NjIwYywgMHgyMjAyLAorCTB4ODAwMCwgMHg2MjEwLCAweDIyMDIsIDB4MTA3OCwgMHgyMDNmLCAweDg2MzAsIDB4YTY4ZSwgMHgwMDBmLAorCTB4MDA0MCwgMHgyNDhiLCAweDc4NmMsIDB4YTA2NSwgMHgwMGMwLCAweDIzYTQsIDB4NzgwOCwgMHhhNjAyLAorCTB4MDBjOCwgMHgyM2NmLCAweGQ1YWMsIDB4MDBjMCwgMHgyM2NmLCAweDI2M2EsIDB4MDA3YywgMHhhNjgyLAorCTB4MDAwMywgMHgwMGM4LCAweDI0OGIsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksIDB4MDAwMCwgMHg2ODE4LAorCTB4ZDA4NCwgMHgwMGMwLCAweDIzZmIsIDB4MjAxMSwgMHg5NjU1LCAweDIyMDQsIDB4NzBjNiwgMHg4MjEwLAorCTB4MjIwNCwgMHg3MGNhLCAweGQ2ODQsIDB4MDBjMCwgMHgyM2ViLCAweDgyMTAsIDB4MjIwNCwgMHg3MGRhLAorCTB4ODIxMCwgMHgyMjA0LCAweDcwZGUsIDB4YTY4NSwgMHg4MDIwLCAweDcwYzIsIDB4NjgxYiwgMHgwMDAxLAorCTB4MjA5MSwgMHg0MDgwLCAweDc4MTAsIDB4YTA4NCwgMHhmZmNmLCAweDc4MTIsIDB4MjA5MSwgMHg4MDAxLAorCTB4MjAzYiwgMHgwMDAwLCAweDAwN2MsIDB4NzgxMCwgMHhjMGFkLCAweDc4MTIsIDB4MDA3OCwgMHgyNDhiLAorCTB4MjYzYSwgMHgxMDc4LCAweDI1NzYsIDB4MDBjMCwgMHgyNTk5LCAweDc4NmMsIDB4YTA2NSwgMHgwMGMwLAorCTB4MjNhNCwgMHgyMDkxLCAweDgwMDAsIDB4NzgxMCwgMHhhMDg0LCAweGZmY2YsIDB4ODZmZiwgMHgwMDQwLAorCTB4MjQxMiwgMHhjMGFkLCAweDc4MTIsIDB4MjA5MSwgMHg4MDAxLCAweDAwNzgsIDB4MjU5OSwgMHgyMDM5LAorCTB4OTY3NCwgMHgyNzM0LCAweDdkMTAsIDB4MDA3OCwgMHgyNDMzLCAweDYwODQsIDB4YTA4NiwgMHgwMTAzLAorCTB4MDBjMCwgMHgyNDc0LCAweDYxMTQsIDB4NjAxOCwgMHhhMTA1LCAweDAwNDAsIDB4MjQyYywgMHg4NmZmLAorCTB4MDBjMCwgMHgyNDQ0LCAweDAwNzgsIDB4MjQ3NCwgMHhhNjgwLCAweDk2NTUsIDB4NjIwYywgMHgyMjAyLAorCTB4MTA3OCwgMHgyMDNmLCAweDg2MzAsIDB4YTY4ZSwgMHgwMDFlLCAweDAwNDAsIDB4MjQ4YiwgMHg3ODZjLAorCTB4YTA2NSwgMHgwMGMwLCAweDI0MWQsIDB4NzgwOCwgMHhhNjAyLCAweDAwYzgsIDB4MjQ0NCwgMHhkNWFjLAorCTB4MDBjMCwgMHgyNDQ0LCAweDI2M2EsIDB4MDA3YywgMHhhNjgyLCAweDAwMDYsIDB4MDBjOCwgMHgyNDhiLAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNjksIDB4MDAwMCwgMHg2ODE4LCAweGQwODQsIDB4MDBjMCwgMHgyNDZmLAorCTB4MjAxMSwgMHg5NjU1LCAweDIwMDksIDB4OTY0ZSwgMHgyNmE4LCAweDIxMWMsIDB4MjIwNCwgMHgyMDFhLAorCTB4ODEwOCwgMHg4MjEwLCAweDAwZjAsIDB4MjQ1NSwgMHhhNjg1LCAweDgwMzAsIDB4NzBjMiwgMHg2ODFiLAorCTB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4NzgxMCwgMHhhMDg0LCAweGZmY2YsIDB4NzgxMiwgMHgyMDkxLAorCTB4ODAwMSwgMHhhMDA2LCAweDIwMDksIDB4OTY3NSwgMHgyMDBhLCAweDIwM2EsIDB4MDA3YywgMHg3ODEwLAorCTB4YzBhZCwgMHg3ODEyLCAweDAwNzgsIDB4MjQ4YiwgMHgyNjNhLCAweDEwNzgsIDB4MjU3NiwgMHgwMGMwLAorCTB4MjU5OSwgMHg3ODZjLCAweGEwNjUsIDB4MDBjMCwgMHgyNDFkLCAweDIwOTEsIDB4ODAwMCwgMHg3ODEwLAorCTB4YTA4NCwgMHhmZmNmLCAweDg2ZmYsIDB4MDA0MCwgMHgyNDg2LCAweGMwYWQsIDB4NzgxMiwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDc4LCAweDI1OTksIDB4MjA5MSwgMHg4MDAwLCAweDcwMDcsIDB4MDAwNCwgMHg3OTk0LAorCTB4NzBkNCwgMHhhMTAyLCAweDAwNDgsIDB4MjQ5YywgMHgwMDQwLCAweDI0YTYsIDB4N2I5MCwgMHhhMzAyLAorCTB4MDBjMCwgMHgyNGE2LCAweDAwNzgsIDB4MjQ5ZiwgMHg4MDAyLCAweDAwYzAsIDB4MjRhNiwgMHgyNjNhLAorCTB4NzgxMCwgMHhjMGFkLCAweDc4MTIsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4YTE4NCwgMHhmZjAwLAorCTB4MDA0MCwgMHgyNGIzLCAweDgxMGYsIDB4ODEwYywgMHg4MTBjLCAweDgwMDQsIDB4ODAwNCwgMHg4MDA3LAorCTB4YTEwMCwgMHgwMDc4LCAweDI0YjYsIDB4ODEwNywgMHg4MDA0LCAweDgwMDQsIDB4N2E5YywgMHhhMjEwLAorCTB4NzIxYSwgMHg3YTk4LCAweGEwMDYsIDB4YTIxMSwgMHg3MjFlLCAweGQ0YzQsIDB4MDA0MCwgMHgyNGM2LAorCTB4N2FhNCwgMHhhMjExLCAweDcyMjIsIDB4N2FhMCwgMHhhMjExLCAweDcyMjYsIDB4MjBhMSwgMHgwMDMwLAorCTB4NzAwMywgMHgwMDAwLCAweDIwMDksIDB4OTY1NCwgMHgyNjBhLCAweDgxMDksIDB4MjE5OCwgMHgyMTA0LAorCTB4ZDA4NCwgMHgwMDQwLCAweDI0ZDQsIDB4ODYzMywgMHhhNmIwLCAweDAwMDIsIDB4MjZhOCwgMHg1M2E2LAorCTB4ODYwMywgMHg3MDEyLCAweDcwMDcsIDB4MDAwMSwgMHg3OTkwLCAweDc4OTQsIDB4ODAwMCwgMHhhMTBhLAorCTB4MDBjOCwgMHgyNGUzLCAweGEwMDYsIDB4MjAyOCwgMHg3OTc0LCAweGExODQsIDB4ZmYwMCwgMHgwMDQwLAorCTB4MjRmMiwgMHg4MTBmLCAweDgxMGMsIDB4ODEwYywgMHg4MDA0LCAweDgwMDQsIDB4ODAwNywgMHhhMTAwLAorCTB4MDA3OCwgMHgyNGY1LCAweDgxMDcsIDB4ODAwNCwgMHg4MDA0LCAweDc5N2MsIDB4YTEwOCwgMHg3YTc4LAorCTB4YTAwNiwgMHhhMjExLCAweGQ0YzQsIDB4MDA0MCwgMHgyNTAxLCAweDdiODQsIDB4YTMxOSwgMHg3YzgwLAorCTB4YTQyMSwgMHg3MDA4LCAweGQwZmMsIDB4MDA0MCwgMHgyNTAxLCAweGEwODQsIDB4MDFlMCwgMHgwMDQwLAorCTB4MjUyNiwgMHg3ZDEwLCAweDIwMzEsIDB4OTY1NCwgMHgyNjM0LCAweDc4YTgsIDB4ODAwMCwgMHg3OGFhLAorCTB4ZDA4YywgMHgwMGMwLCAweDI1MWIsIDB4NzAwNywgMHgwMDA2LCAweDcwMDQsIDB4ZDA5NCwgMHgwMGMwLAorCTB4MjUxNSwgMHgwMDc4LCAweDI0OGQsIDB4MjA2OSwgMHg0ZTQ3LCAweDIwNmIsIDB4MDAwMywgMHg3OGFjLAorCTB4YTA4NSwgMHgwMzAwLCAweDc4YWUsIDB4YTAwNiwgMHgwMDc4LCAweDI1MmYsIDB4MjAzMCwgMHg3NWQ2LAorCTB4MjA5MSwgMHg0MDgwLCAweDdkOTYsIDB4N2QxMCwgMHhhNWFjLCAweGZmY2YsIDB4N2QxMiwgMHgyMDkxLAorCTB4ODAwMSwgMHg3OGFhLCAweDcwMDcsIDB4MDAwNiwgMHgyNjNhLCAweDcwMDMsIDB4MDAwMSwgMHg3MTFhLAorCTB4NzIxZSwgMHhkNWM0LCAweDAwNDAsIDB4MjUzZSwgMHg3MzIyLCAweDc0MjYsIDB4MDA3YywgMHg2MDg0LAorCTB4YTA4NiwgMHgwMTAzLCAweDAwYzAsIDB4MjU2MiwgMHg2MTE0LCAweDYwMTgsIDB4YTEwNSwgMHgwMGMwLAorCTB4MjU2MiwgMHgyMDY5LCAweDAwMDAsIDB4NjgxOCwgMHhkMDg0LCAweDAwYzAsIDB4MjU2MiwgMHg2MDBjLAorCTB4NzBjNiwgMHg2MDEwLCAweDcwY2EsIDB4NzBjMywgMHg4MDIwLCAweDY4MWIsIDB4MDAwMSwgMHgyMDkxLAorCTB4NDA4MCwgMHgxMDc4LCAweDIwM2YsIDB4MDA2OCwgMHgyNTYxLCAweDc4NmMsIDB4YTA2NSwgMHgwMGMwLAorCTB4MjUzZiwgMHgwMDdjLCAweDEwNzgsIDB4MjU3NiwgMHgwMGMwLCAweDI1OTksIDB4Nzg2YywgMHhhMDY1LAorCTB4MDBjMCwgMHgyNTNmLCAweDAwNzgsIDB4MjU5OSwgMHgxMDc4LCAweDI1NzYsIDB4MDBjMCwgMHgyNTk5LAorCTB4Nzg2YywgMHhhMDY1LCAweDAwYzAsIDB4MjU2YywgMHgwMDc4LCAweDI1OTksIDB4NjA4NCwgMHhhMDg2LAorCTB4MDEwMywgMHgwMGMwLCAweDI1OGEsIDB4NjAxOCwgMHhjMGZjLCAweDYwMWEsIDB4YTA4NiwgMHgwMDA0LAorCTB4MDBjMCwgMHgyNThhLCAweDc4MDQsIDB4ZDBhNCwgMHgwMDQwLCAweDI1OGEsIDB4MTA3OCwgMHgyMDNmLAorCTB4YTAwNiwgMHgwMDdjLCAweDEwNzgsIDB4MjU5ZiwgMHgwMGMwLCAweDI1OTEsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDA3YywgMHgxMDc4LCAweDI1YWUsIDB4MDBjMCwgMHgyNTk3LCAweDIwNDEsIDB4MDAwMSwgMHg3ZDEwLAorCTB4MDA3YywgMHg4OGZmLCAweDAwNDAsIDB4MjU5ZSwgMHgyMDkxLCAweDQwODAsIDB4MDA3YywgMHg3YjkwLAorCTB4Nzk5NCwgMHg3MGQ0LCAweGExMDIsIDB4MDBjMCwgMHgyNWE4LCAweGEzODUsIDB4MDAwMCwgMHgwMDdjLAorCTB4MDA0OCwgMHgyNWFjLCAweGEzMDIsIDB4MDA3YywgMHg4MDAyLCAweDAwN2MsIDB4NzgxMCwgMHhkMGVjLAorCTB4MDA0MCwgMHgyNWM2LCAweDBlN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MDAyMCwgMHg3MDA0LAorCTB4YTAwNSwgMHgwMGMwLCAweDI1YzMsIDB4NzAwOCwgMHgwZTdmLCAweGEwODYsIDB4MDAwOCwgMHgwMDQwLAorCTB4MjVjNiwgMHgwMDc4LCAweDI2MTcsIDB4MGU3ZiwgMHgwMDc4LCAweDI2MTcsIDB4YTE4NCwgMHhmZjAwLAorCTB4MDA0MCwgMHgyNWQzLCAweDgxMGYsIDB4ODEwYywgMHg4MTBjLCAweDgwMDQsIDB4ODAwNCwgMHg4MDA3LAorCTB4YTEwMCwgMHgwMDc4LCAweDI1ZDYsIDB4ODEwNywgMHg4MDA0LCAweDgwMDQsIDB4N2E5YywgMHg3Yjk4LAorCTB4N2NhNCwgMHg3ZGEwLCAweGEyMTAsIDB4YTAwNiwgMHhhMzE5LCAweGE0MjEsIDB4YTUyOSwgMHgyMDA5LAorCTB4MDAxOCwgMHg2MDI4LCAweGEwMDUsIDB4MDA0MCwgMHgyNWU3LCAweDIwMDksIDB4MDA0MCwgMHgxMDc4LAorCTB4MWQ3NCwgMHgwMDQwLCAweDI2MDksIDB4NzhhOCwgMHg4MDAwLCAweDc4YWEsIDB4ZDA4YywgMHgwMGMwLAorCTB4MjYxNywgMHg2MDE0LCAweGQwZmMsIDB4MDBjMCwgMHgyNWY5LCAweDIwNjksIDB4NGU0MCwgMHgwMDc4LAorCTB4MjVmYiwgMHgyMDY5LCAweDRlODAsIDB4MjA5MSwgMHg4MDAwLCAweDY4MWYsIDB4MDAwMywgMHg3OGFiLAorCTB4MDAwMCwgMHg3OGFjLCAweGEwODUsIDB4MDMwMCwgMHg3OGFlLCAweDIwOTEsIDB4ODAwMSwgMHgwMDc4LAorCTB4MjYxNywgMHg3OGFiLCAweDAwMDAsIDB4MTA3OCwgMHgyMDNmLCAweDc5OTAsIDB4Nzg5NCwgMHg4MDAwLAorCTB4YTEwYSwgMHgwMGM4LCAweDI2MTQsIDB4YTAwNiwgMHg3ODk2LCAweDcwZDYsIDB4YTAwNiwgMHgyMDcxLAorCTB4MDAxMCwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHhkN2ZjLCAweDAwYzAsIDB4MjYyMywgMHgyMDA5LAorCTB4NGU1OSwgMHgwMDc4LCAweDI2MjUsIDB4MjAwOSwgMHg0ZTk5LCAweDIwOTEsIDB4ODAwMCwgMHgyMDBhLAorCTB4MGY3ZSwgMHhkN2ZjLCAweDAwYzAsIDB4MjYzYywgMHgyMDA5LCAweDRlNDAsIDB4MjAwMSwgMHg0ZTA0LAorCTB4MjAwNCwgMHhkMGVjLCAweDAwNDAsIDB4MjYzOCwgMHgyMDc5LCAweDAxMDAsIDB4MDA3OCwgMHgyNjQwLAorCTB4MjA3OSwgMHgwMjAwLCAweDAwNzgsIDB4MjY0MCwgMHgyMDA5LCAweDRlODAsIDB4MjA3OSwgMHgwMTAwLAorCTB4MjEwNCwgMHhhMDg2LCAweDAwMDAsIDB4MDBjMCwgMHgyNjU5LCAweGQ3ZmMsIDB4MDBjMCwgMHgyNjRjLAorCTB4MjAwOSwgMHg0ZTQ1LCAweDAwNzgsIDB4MjY0ZSwgMHgyMDA5LCAweDRlODUsIDB4MjEwNCwgMHhhMDA1LAorCTB4MDBjMCwgMHgyNjU5LCAweDc4MzAsIDB4YTA4NCwgMHgwMGMwLCAweDAwYzAsIDB4MjY1OSwgMHg3ODFiLAorCTB4MDA0NSwgMHgwZjdmLCAweDAwN2MsIDB4MjAwOSwgMHgwMDAyLCAweDIwNjksIDB4NGUwMCwgMHg2ODEwLAorCTB4ZDBlYywgMHgwMGMwLCAweDI2YzgsIDB4MjA3MSwgMHg0ZTgwLCAweDIwNzksIDB4MDEwMCwgMHgyMDIxLAorCTB4NTBiZiwgMHg3ODRiLCAweDAwMGYsIDB4MjAxOSwgMHg0NDU3LCAweGQxODQsIDB4MDA0MCwgMHgyNjdjLAorCTB4NjgxMCwgMHhkMGVjLCAweDAwNDAsIDB4MjY3OCwgMHgyMGExLCAweDAxMmIsIDB4MDA3OCwgMHgyNjdlLAorCTB4MjBhMSwgMHgwMjJiLCAweDAwNzgsIDB4MjY3ZSwgMHgyMGExLCAweDAxMmIsIDB4MjMwNCwgMHhhMDA1LAorCTB4MDA0MCwgMHgyNjhiLCAweDc4OWEsIDB4ODMxOCwgMHgyM2FjLCAweDgzMTgsIDB4MjM5OCwgMHg1M2E2LAorCTB4MzMxOCwgMHgwMDc4LCAweDI2N2UsIDB4Nzg5YiwgMHgwMDIwLCAweDIwYTksIDB4MDAxMCwgMHg2ODE0LAorCTB4ZDBlNCwgMHgwMDQwLCAweDI2OWIsIDB4NzhhZiwgMHgwMDAwLCAweDc4YWYsIDB4OTAyMCwgMHgwMGYwLAorCTB4MjY5MywgMHgwMDc4LCAweDI2YTEsIDB4NzhhZiwgMHgwMDAwLCAweDc4YWYsIDB4ODAyMCwgMHgwMGYwLAorCTB4MjY5YiwgMHg3MDAzLCAweDAwMDAsIDB4MDE3ZSwgMHhkMThjLCAweDIwMDksIDB4MDAwMCwgMHgwMDQwLAorCTB4MjZhYSwgMHhjMWJkLCAweDEwNzgsIDB4Mjg5YiwgMHgwMTdmLCAweDcwMjAsIDB4YTA4NCwgMHgwMDBmLAorCTB4MDA3ZSwgMHg2ODE0LCAweGQwZTQsIDB4MDA3ZiwgMHgwMGMwLCAweDI2YmEsIDB4YTA4NSwgMHg2MzQwLAorCTB4MDA3OCwgMHgyNmJjLCAweGEwODUsIDB4NjJjMCwgMHg3ODA2LCAweDc4MGYsIDB4OTIwMCwgMHg3ODQzLAorCTB4MDBkOCwgMHg3ODUzLCAweDAwODAsIDB4NzgwYiwgMHgwMDA4LCAweDc0NTYsIDB4NzA1MywgMHgwMDAwLAorCTB4ODEwOSwgMHgwMDQwLCAweDI2ZGIsIDB4MjA3MSwgMHg0ZTQwLCAweDY4MTAsIDB4ZDBlYywgMHgwMDQwLAorCTB4MjZkNSwgMHgyMDc5LCAweDAxMDAsIDB4MDA3OCwgMHgyNmQ3LCAweDIwNzksIDB4MDIwMCwgMHgyMDIxLAorCTB4NGViZiwgMHgwMDc4LCAweDI2NjksIDB4MDA3YywgMHgwMTdlLCAweGQxYmMsIDB4MDBjMCwgMHgyNmYwLAorCTB4MDA3ZSwgMHgyMDAxLCAweDRlMDQsIDB4MjAwNCwgMHhkMGVjLCAweDAwN2YsIDB4MDA0MCwgMHgyNmVjLAorCTB4MjAxMSwgMHgwMTAxLCAweDAwNzgsIDB4MjZmMiwgMHgyMDExLCAweDAyMDEsIDB4MDA3OCwgMHgyNmYyLAorCTB4MjAxMSwgMHgwMTAxLCAweGExOGMsIDB4MDAwZiwgMHgyMjA0LCAweGEwODQsIDB4ZmZmMCwgMHhhMTA1LAorCTB4MjAxMiwgMHgwMTdmLCAweDEwNzgsIDB4Mjg5YiwgMHgwMDdjLCAweGQzZmMsIDB4MDBjMCwgMHgyNzEwLAorCTB4MDA3ZSwgMHgyMDAxLCAweDRlMDQsIDB4MjAwNCwgMHhkMGVjLCAweDAwN2YsIDB4MDA0MCwgMHgyNzBjLAorCTB4MjAxMSwgMHgwMTAxLCAweDAwNzgsIDB4MjcxMiwgMHgyMDExLCAweDAyMDEsIDB4MDA3OCwgMHgyNzEyLAorCTB4MjAxMSwgMHgwMTAxLCAweDIwYTksIDB4MDAwOSwgMHg4MTBiLCAweDAwZjAsIDB4MjcxNCwgMHhhMThjLAorCTB4MGUwMCwgMHgyMjA0LCAweGEwODQsIDB4ZjFmZiwgMHhhMTA1LCAweDIwMTIsIDB4MDA3YywgMHgyMDE5LAorCTB4MDAwMiwgMHgyMDAxLCAweDRlMDQsIDB4MjAwNCwgMHhkMGVjLCAweDAwNDAsIDB4MjcyYywgMHg4MzE5LAorCTB4MjAwOSwgMHgwMTAxLCAweDAwNzgsIDB4MjcyZSwgMHgyMDA5LCAweDAxMDEsIDB4MjBhOSwgMHgwMDA1LAorCTB4ODIxMywgMHgwMGYwLCAweDI3MzAsIDB4YTI5NCwgMHgwMGUwLCAweDIxMDQsIDB4YTA4NCwgMHhmZjFmLAorCTB4YTIwNSwgMHgyMDBhLCAweDgzMTksIDB4MDA0MCwgMHgyNzQxLCAweDIwMDksIDB4MDIwMSwgMHgwMDc4LAorCTB4MjcyZSwgMHgwMDdjLCAweGQzZmMsIDB4MDBjMCwgMHgyNzU1LCAweDAwN2UsIDB4MjAwMSwgMHg0ZTA0LAorCTB4MjAwNCwgMHhkMGVjLCAweDAwN2YsIDB4MDA0MCwgMHgyNzUxLCAweDIwMTEsIDB4MDEwMSwgMHgwMDc4LAorCTB4Mjc1NywgMHgyMDExLCAweDAyMDEsIDB4MDA3OCwgMHgyNzU3LCAweDIwMTEsIDB4MDEwMSwgMHgyMGE5LAorCTB4MDAwYywgMHg4MTBiLCAweDAwZjAsIDB4Mjc1OSwgMHhhMThjLCAweGYwMDAsIDB4MjIwNCwgMHhhMDg0LAorCTB4MGZmZiwgMHhhMTA1LCAweDIwMTIsIDB4MDA3YywgMHhkM2ZjLCAweDAwYzAsIDB4Mjc3NywgMHgwMDdlLAorCTB4MjAwMSwgMHg0ZTA0LCAweDIwMDQsIDB4ZDBlYywgMHgwMDdmLCAweDAwNDAsIDB4Mjc3MywgMHgyMDExLAorCTB4MDEwMiwgMHgwMDc4LCAweDI3NzksIDB4MjAxMSwgMHgwMjAyLCAweDAwNzgsIDB4Mjc3OSwgMHgyMDExLAorCTB4MDEwMiwgMHgyMjA0LCAweGEwODQsIDB4ZmZjZiwgMHhhMTA1LCAweDIwMTIsIDB4MDA3YywgMHgwYzdlLAorCTB4ZDFiYywgMHgwMGMwLCAweDI3OTMsIDB4MDA3ZSwgMHgyMDAxLCAweDRlMDQsIDB4MjAwNCwgMHhkMGVjLAorCTB4MDA3ZiwgMHgwMDQwLCAweDI3OGYsIDB4MjA2MSwgMHgwMTAwLCAweDAwNzgsIDB4Mjc5NSwgMHgyMDYxLAorCTB4MDIwMCwgMHgwMDc4LCAweDI3OTUsIDB4MjA2MSwgMHgwMTAwLCAweGMxYmMsIDB4ODEwMywgMHg4MDAzLAorCTB4YTA4MCwgMHgwMDIwLCAweDYwOWEsIDB4NjJhYywgMHg2M2FjLCAweDBjN2YsIDB4MDA3YywgMHgwYzdlLAorCTB4ZDFiYywgMHgwMGMwLCAweDI3YjMsIDB4MDA3ZSwgMHgyMDAxLCAweDRlMDQsIDB4MjAwNCwgMHhkMGVjLAorCTB4MDA3ZiwgMHgwMDQwLCAweDI3YWYsIDB4MjA2MSwgMHgwMTAwLCAweDAwNzgsIDB4MjdiNSwgMHgyMDYxLAorCTB4MDIwMCwgMHgwMDc4LCAweDI3YjUsIDB4MjA2MSwgMHgwMTAwLCAweGMxYmMsIDB4ODEwMywgMHg4MDAzLAorCTB4YTA4MCwgMHgwMDIyLCAweDYwOWEsIDB4NjBhNCwgMHhhMDg0LCAweGZmZGYsIDB4NjBhZSwgMHgwYzdmLAorCTB4MDA3YywgMHgwYzdlLCAweGQxYmMsIDB4MDBjMCwgMHgyN2Q1LCAweDAwN2UsIDB4MjAwMSwgMHg0ZTA0LAorCTB4MjAwNCwgMHhkMGVjLCAweDAwN2YsIDB4MDA0MCwgMHgyN2QxLCAweDIwNjEsIDB4MDEwMCwgMHgwMDc4LAorCTB4MjdkNywgMHgyMDYxLCAweDAyMDAsIDB4MDA3OCwgMHgyN2Q3LCAweDIwNjEsIDB4MDEwMCwgMHhjMWJjLAorCTB4ODEwMywgMHg4MDAzLCAweGEwODAsIDB4MDAyMiwgMHg2MDlhLCAweDYwYTQsIDB4YTA4NSwgMHgwMDIwLAorCTB4NjBhZSwgMHgwYzdmLCAweDAwN2MsIDB4MGM3ZSwgMHhkMWJjLCAweDAwYzAsIDB4MjdmNywgMHgwMDdlLAorCTB4MjAwMSwgMHg0ZTA0LCAweDIwMDQsIDB4ZDBlYywgMHgwMDdmLCAweDAwNDAsIDB4MjdmMywgMHgyMDYxLAorCTB4MDEwMCwgMHgwMDc4LCAweDI3ZjksIDB4MjA2MSwgMHgwMjAwLCAweDAwNzgsIDB4MjdmOSwgMHgyMDYxLAorCTB4MDEwMCwgMHhjMWJjLCAweDgxMDMsIDB4ODAwMywgMHhhMDgwLCAweDAwMjAsIDB4NjA5YSwgMHg2MGE0LAorCTB4YTI4YywgMHgwMDIwLCAweDAwNDAsIDB4MjgwNywgMHhjMmFjLCAweGEzOWQsIDB4NDAwMCwgMHhjM2ZjLAorCTB4ZDNiNCwgMHgwMGMwLCAweDI4MGMsIDB4YzNmZCwgMHg2MmFlLCAweDIwMTAsIDB4NjBhNCwgMHg2M2FlLAorCTB4MjAxOCwgMHgwYzdmLCAweDAwN2MsIDB4MjA5MSwgMHg4MDAwLCAweDBjN2UsIDB4MGU3ZSwgMHg2ODE4LAorCTB4YTAwNSwgMHgwMDQwLCAweDI4NzksIDB4ZDFmYywgMHgwMDQwLCAweDI4MjIsIDB4MjA2MSwgMHg5NWQwLAorCTB4MDA3OCwgMHgyODI0LCAweDIwNjEsIDB4OTRjMCwgMHgxMDc4LCAweDI4ODEsIDB4MDA0MCwgMHgyODViLAorCTB4MjBhOSwgMHgwMTAxLCAweGQxZmMsIDB4MDA0MCwgMHgyODMxLCAweDIwNjEsIDB4OTRkMCwgMHgwMDc4LAorCTB4MjgzMywgMHgyMDYxLCAweDkzYzAsIDB4MGM3ZSwgMHgxMDc4LCAweDI4ODEsIDB4MDA0MCwgMHgyODNlLAorCTB4MGM3ZiwgMHg4YzYwLCAweDAwZjAsIDB4MjgzMywgMHgwMDc4LCAweDI4NzksIDB4MDA3ZiwgMHhkMWZjLAorCTB4MDA0MCwgMHgyODQ4LCAweGEwODIsIDB4OTRkMCwgMHgyMDcxLCAweDRlODAsIDB4MDA3OCwgMHgyODRjLAorCTB4YTA4MiwgMHg5M2MwLCAweDIwNzEsIDB4NGU0MCwgMHg3MDdhLCAweDcxNzYsIDB4MjEzOCwgMHgyMDAxLAorCTB4MDAwNCwgMHg3MDY2LCAweDcwODMsIDB4MDAwZiwgMHg3MWQ0LCAweGMxZGMsIDB4NzFkNiwgMHgxMDc4LAorCTB4MjYxYywgMHgwMDc4LCAweDI4NzUsIDB4ZDFmYywgMHgwMGMwLCAweDI4NjIsIDB4MjA3MSwgMHg0ZTQwLAorCTB4MDA3OCwgMHgyODY0LCAweDIwNzEsIDB4NGU4MCwgMHg2MDIwLCAweGMwZGQsIDB4NjAyMiwgMHg3MTc2LAorCTB4MjEzOCwgMHgyYzAwLCAweDcwN2UsIDB4MjAwMSwgMHgwMDA2LCAweDcwNjYsIDB4NzA4MywgMHgwMDBmLAorCTB4NzFkNCwgMHhjMWRjLCAweDcxZDYsIDB4MTA3OCwgMHgyNjFjLCAweDIwMDEsIDB4MDAwMCwgMHgwMDc4LAorCTB4Mjg3YiwgMHgyMDAxLCAweDAwMDEsIDB4MjA5MSwgMHg4MDAxLCAweGEwMDUsIDB4MGU3ZiwgMHgwYzdmLAorCTB4MDA3YywgMHgyYzA0LCAweGEwMDUsIDB4MDA0MCwgMHgyODk4LCAweDIwNjAsIDB4NjAxMCwgMHhhMzA2LAorCTB4MDBjMCwgMHgyODk1LCAweDYwMGMsIDB4YTIwNiwgMHgwMGMwLCAweDI4OTUsIDB4NjAxNCwgMHhhMTA2LAorCTB4MDBjMCwgMHgyODk1LCAweGEwMDYsIDB4MDA3OCwgMHgyODlhLCAweDYwMDAsIDB4MDA3OCwgMHgyODgyLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwN2MsIDB4MGY3ZSwgMHgwZTdlLCAweDAxN2UsIDB4ZDFiYywgMHgwMGMwLAorCTB4MjhiMywgMHgyMDc5LCAweDRlNDAsIDB4MDA3ZSwgMHgyMDAxLCAweDRlMDQsIDB4MjAwNCwgMHhkMGVjLAorCTB4MDA3ZiwgMHgwMDQwLCAweDI4YWYsIDB4MjA3MSwgMHgwMTAwLCAweDAwNzgsIDB4MjhiNywgMHgyMDcxLAorCTB4MDIwMCwgMHgwMDc4LCAweDI4YjcsIDB4MjA3OSwgMHg0ZTgwLCAweDIwNzEsIDB4MDEwMCwgMHg3OTIwLAorCTB4YTE4YywgMHgwMDBmLCAweDcwZWMsIDB4ZDBjNCwgMHgwMGMwLCAweDI4YzEsIDB4MDE3ZiwgMHgwMDc4LAorCTB4MjhkYywgMHg4MTBiLCAweDgxMGIsIDB4ODEwYiwgMHg4MTBiLCAweDAwN2YsIDB4ZDBiYywgMHgwMGMwLAorCTB4MjhkOSwgMHgwMDdlLCAweDIwMDEsIDB4NGUwNCwgMHgyMDA0LCAweGQwZWMsIDB4MDA3ZiwgMHgwMDQwLAorCTB4MjhkNSwgMHhhMThkLCAweDBmMDAsIDB4MDA3OCwgMHgyOGRiLCAweGExOGQsIDB4MGYwMCwgMHgwMDc4LAorCTB4MjhkYiwgMHhhMThkLCAweDA4MDAsIDB4MjEwNCwgMHgwZTdmLCAweDBmN2YsIDB4MDA3YywgMHgwZTdlLAorCTB4MjAwMSwgMHg0ZTAxLCAweDIwMDQsIDB4ZDBhYywgMHgwMGMwLCAweDI5NWMsIDB4NjhlNCwgMHhkMGFjLAorCTB4MDA0MCwgMHgyOTVjLCAweGEwODQsIDB4MDAwNiwgMHgwMGMwLCAweDI5NWMsIDB4NjAxNCwgMHhkMGZjLAorCTB4MDBjMCwgMHgyOGY2LCAweDIwNzEsIDB4NTJjMCwgMHgwMDc4LCAweDI4ZjgsIDB4MjA3MSwgMHg1MzQwLAorCTB4ODAwNywgMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YWU3MCwgMHg3MDA0LAorCTB4YTA4NCwgMHgwMDBhLCAweDAwYzAsIDB4Mjk1YywgMHg3MTA4LCAweGExOTQsIDB4ZmYwMCwgMHgwMDQwLAorCTB4Mjk1YywgMHhhMThjLCAweDAwZmYsIDB4MjAwMSwgMHgwMDBhLCAweGExMDYsIDB4MDA0MCwgMHgyOTJiLAorCTB4MjAwMSwgMHgwMDBjLCAweGExMDYsIDB4MDA0MCwgMHgyOTJmLCAweDIwMDEsIDB4MDAxMiwgMHhhMTA2LAorCTB4MDA0MCwgMHgyOTMzLCAweDIwMDEsIDB4MDAxNCwgMHhhMTA2LCAweDAwNDAsIDB4MjkzNywgMHgyMDAxLAorCTB4MDAxOSwgMHhhMTA2LCAweDAwNDAsIDB4MjkzYiwgMHgyMDAxLCAweDAwMzIsIDB4YTEwNiwgMHgwMDQwLAorCTB4MjkzZiwgMHgwMDc4LCAweDI5NDMsIDB4MjAwOSwgMHgwMDBjLCAweDAwNzgsIDB4Mjk0NSwgMHgyMDA5LAorCTB4MDAxMiwgMHgwMDc4LCAweDI5NDUsIDB4MjAwOSwgMHgwMDE0LCAweDAwNzgsIDB4Mjk0NSwgMHgyMDA5LAorCTB4MDAxOSwgMHgwMDc4LCAweDI5NDUsIDB4MjAwOSwgMHgwMDIwLCAweDAwNzgsIDB4Mjk0NSwgMHgyMDA5LAorCTB4MDAzZiwgMHgwMDc4LCAweDI5NDUsIDB4MjAxMSwgMHgwMDAwLCAweDIxMDAsIDB4YTIwNSwgMHg3MDBhLAorCTB4MjA3MSwgMHg0ZTAwLCAweDcwMDQsIDB4ZDBiYywgMHgwMDQwLCAweDI5NWMsIDB4NjAxNCwgMHhkMGZjLAorCTB4MDBjMCwgMHgyOTU3LCAweDcwZWEsIDB4MjA3MSwgMHg0ZTQwLCAweDAwNzgsIDB4Mjk1YSwgMHg3MGVlLAorCTB4MjA3MSwgMHg0ZTgwLCAweDcwMWYsIDB4MDAwZCwgMHgwZTdmLCAweDAwN2MsIDB4MjAwMSwgMHg0ZTA1LAorCTB4MjAwNCwgMHhkMGU0LCAweDAwYzAsIDB4Mjk2YSwgMHg3ODA0LCAweGEwODQsIDB4ZmYxZiwgMHhhMDg1LAorCTB4NjM0MCwgMHg3ODA2LCAweDAwN2MsIDB4MDA2OCwgMHgyOTZiLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLAorCTB4MDAwMCwgMHgwMDdlLCAweDcwMTgsIDB4ZDA4NCwgMHgwMGMwLCAweDI5NzIsIDB4MDA3ZiwgMHgyMDcxLAorCTB4MDAxMCwgMHg3MGNhLCAweDAwN2YsIDB4NzBjNiwgMHg3MGMzLCAweDgwMDIsIDB4NzBkYiwgMHgwODBmLAorCTB4NzBkZiwgMHgwMDAwLCAweDIwNzEsIDB4MDAwMCwgMHg3MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLAorCTB4MDA3OCwgMHgyOTg4LCAweDdmM2MsIDB4N2U1OCwgMHg3YzMwLCAweDdkMzgsIDB4NzhhMCwgMHg3MDhlLAorCTB4NzU5MiwgMHg3NDk2LCAweDc2OWEsIDB4Nzc5ZSwgMHhhNTk0LCAweDAwM2YsIDB4ZDRmNCwgMHgwMDQwLAorCTB4Mjk5ZiwgMHhhNzg0LCAweDAwN2QsIDB4MDBjMCwgMHg0M2NkLCAweDEwNzgsIDB4Mjk2YiwgMHhhNDljLAorCTB4MDAwZiwgMHhhMzgyLCAweDAwMDQsIDB4MDA1MCwgMHgyOWFhLCAweGEzYTYsIDB4MDAwNywgMHgwMGMwLAorCTB4Mjk2YiwgMHgyNDE4LCAweDg1MDcsIDB4YTA4NCwgMHgwMDBmLCAweDAwNzksIDB4MjlhZiwgMHgzMDI4LAorCTB4MzExOSwgMHgzMTQ0LCAweDMzYjYsIDB4Mzc5ZiwgMHgzODE5LCAweDM4Y2UsIDB4Mzk1ZiwgMHgzYTRkLAorCTB4M2IzYywgMHgyOWMyLCAweDI5YmYsIDB4MmRmOSwgMHgyZjFjLCAweDM3NzAsIDB4MjliZiwgMHgxMDc4LAorCTB4Mjk2YiwgMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHgyOWNjLCAweDc4MDgsIDB4YzA4ZCwgMHg3ODBhLAorCTB4YTAwNiwgMHg3MDAyLCAweDcwNGUsIDB4NzA0NiwgMHg3MGQyLCAweDcwNjAsIDB4YTAwNSwgMHgwMGMwLAorCTB4MmIzMiwgMHg3MDY0LCAweGEwODQsIDB4MDAwNywgMHgwMDc5LCAweDI5ZDYsIDB4MjlkZSwgMHgyYTUxLAorCTB4MmE1YSwgMHgyYTY1LCAweDJhNzAsIDB4MmIxOCwgMHgyYTdiLCAweDJhNTEsIDB4NzgzMCwgMHhkMGJjLAorCTB4MDBjMCwgMHgyOWMxLCAweDcxZDQsIDB4ZDFiYywgMHgwMGMwLCAweDI5YzEsIDB4ZDFiNCwgMHgwMGMwLAorCTB4MmEyZSwgMHg3MGE0LCAweGEwODYsIDB4MDAwMSwgMHgwMDQwLCAweDI5YzEsIDB4NzBiNCwgMHhhMDZkLAorCTB4NjgwMCwgMHhhMDY1LCAweGEwNTUsIDB4Nzg5YiwgMHgwMDEwLCAweDZiMGMsIDB4N2JhYSwgMHg2ODA4LAorCTB4YTA0NSwgMHg2ZDEwLCAweDY4MDQsIDB4YTA2ZCwgMHhhMDVkLCAweGE4ODYsIDB4MDAwMSwgMHgwMDQwLAorCTB4MmEwNCwgMHg2OWJjLCAweDdkYWEsIDB4NzlhYSwgMHg2OGMwLCAweGEwNGQsIDB4NmUxYywgMHgyMDAxLAorCTB4MDAxMCwgMHgwMDc4LCAweDJjOGMsIDB4NzA2MCwgMHhhMDA1LCAweDAwYzAsIDB4MjljMSwgMHgwYzdlLAorCTB4MGQ3ZSwgMHg3MGI0LCAweGEwNmQsIDB4NjgwMCwgMHhhMDY1LCAweGEwNTUsIDB4Nzg5YiwgMHgwMDEwLAorCTB4NmIwYywgMHg3YmFhLCAweDY4MDgsIDB4YTA0NSwgMHg2ZDEwLCAweDY4MDQsIDB4YTA2ZCwgMHhhMDVkLAorCTB4YTg4NiwgMHgwMDAxLCAweDAwNDAsIDB4MmEyNywgMHg2OWJjLCAweDdkYWEsIDB4NzlhYSwgMHg2OGMwLAorCTB4YTA0ZCwgMHg2ZTFjLCAweDIwMDEsIDB4MDAyMCwgMHgwMDc4LCAweDJjOGMsIDB4MTA3OCwgMHg0MzYwLAorCTB4MDBjMCwgMHgyOWMxLCAweDc4MWIsIDB4MDA1YiwgMHg3MGJjLCAweGEwNmQsIDB4NjhiNCwgMHg3ODVhLAorCTB4Njg5NCwgMHg3OGQ2LCAweDc4ZGUsIDB4Njg5OCwgMHg3OGQyLCAweDc4ZGEsIDB4NzgwOCwgMHhjMDhkLAorCTB4NzgwYSwgMHg2OGJjLCAweDcwNDIsIDB4YzFiNCwgMHg3MWQ2LCAweDcwYjgsIDB4YTA2NSwgMHg2OGMwLAorCTB4NzA1YSwgMHg3MDAzLCAweDAwMDIsIDB4MmQwMCwgMHg3MDRlLCAweGFkODAsIDB4MDAwOSwgMHg3MDQ2LAorCTB4MDA3YywgMHgxMDc4LCAweDQzNjAsIDB4MDBjMCwgMHgyYTU5LCAweDc4MWIsIDB4MDA0NywgMHg3MDAzLAorCTB4MDAwNCwgMHgwMDdjLCAweDEwNzgsIDB4NDM2MCwgMHgwMGMwLCAweDJhNjQsIDB4MjAxMSwgMHgwMDBjLAorCTB4MTA3OCwgMHgyYThiLCAweDcwMDMsIDB4MDAwNCwgMHgwMDdjLCAweDEwNzgsIDB4NDM2MCwgMHgwMGMwLAorCTB4MmE2ZiwgMHgyMDExLCAweDAwMDYsIDB4MTA3OCwgMHgyYThiLCAweDcwMDMsIDB4MDAwNCwgMHgwMDdjLAorCTB4MTA3OCwgMHg0MzYwLCAweDAwYzAsIDB4MmE3YSwgMHgyMDExLCAweDAwMGQsIDB4MTA3OCwgMHgyYThiLAorCTB4NzAwMywgMHgwMDA0LCAweDAwN2MsIDB4MTA3OCwgMHg0MzYwLCAweDAwYzAsIDB4MmE4YSwgMHgyMDExLAorCTB4MDAwNiwgMHgxMDc4LCAweDJhOGIsIDB4NzA3YywgMHg3MDdmLCAweDAwMDAsIDB4MjA2OCwgMHg3MDRlLAorCTB4NzAwMywgMHgwMDAxLCAweDAwN2MsIDB4NzE3NCwgMHhjMWZjLCAweDgxMDcsIDB4Nzg4MiwgMHg3ODliLAorCTB4MDAxMCwgMHhhMjg2LCAweDAwMGMsIDB4MDBjMCwgMHgyYTlhLCAweDdhYWEsIDB4MjAwMSwgMHgwMDAxLAorCTB4MDA3OCwgMHgyYWFmLCAweGExOGMsIDB4MDAxZiwgMHhhMThkLCAweDAwYzAsIDB4NzlhYSwgMHhhMjg2LAorCTB4MDAwZCwgMHgwMDQwLCAweDJhYTgsIDB4N2FhYSwgMHgyMDAxLCAweDAwMDIsIDB4MDA3OCwgMHgyYWFmLAorCTB4NzhhYiwgMHgwMDIwLCAweDcxNzgsIDB4NzlhYSwgMHg3YWFhLCAweDIwMDEsIDB4MDAwNCwgMHg3ODliLAorCTB4MDA2MCwgMHg3OGFhLCAweDc4NWIsIDB4MDAwNCwgMHg3ODFiLCAweDAxMTYsIDB4MTA3OCwgMHg0MzgzLAorCTB4NzA4MywgMHgwMDBmLCAweDcwZDQsIDB4ZDBiNCwgMHgwMDQwLCAweDJhY2IsIDB4YzBiNCwgMHg3MGQ2LAorCTB4MGM3ZSwgMHg3MGI4LCAweGEwNjUsIDB4NjAwOCwgMHhhMDg0LCAweGZiZWYsIDB4NjAwYSwgMHg2MDE4LAorCTB4ODAwMSwgMHg2MDFhLCAweDBjN2YsIDB4MDA3YywgMHg3MDE0LCAweGEwMDUsIDB4MDBjMCwgMHgyYWRhLAorCTB4NzBkNCwgMHhkMGI0LCAweDAwNDAsIDB4MmFkYiwgMHg3MGI4LCAweGFjMDYsIDB4MDBjMCwgMHgyYWRiLAorCTB4MTA3OCwgMHgyYWJhLCAweDAwN2MsIDB4MDE3ZSwgMHg3MWE0LCAweGExODYsIDB4MDAwMSwgMHgwMDQwLAorCTB4MmIwZCwgMHgwZDdlLCAweDAyN2UsIDB4MjEwMCwgMHgyMDExLCAweDAwMDEsIDB4YTIxMiwgMHg3MGI0LAorCTB4MjA2OCwgMHg2ODAwLCAweGFjMDYsIDB4MDA0MCwgMHgyYWY0LCAweDgyMTEsIDB4MDA0MCwgMHgyYjBiLAorCTB4MTA3OCwgMHgyYjBmLCAweDAwNzgsIDB4MmFlOSwgMHgwYzdlLCAweDIxMDAsIDB4MjAxMSwgMHgwMDAxLAorCTB4YTIxMiwgMHg3MGI0LCAweDIwNjgsIDB4NjgwMCwgMHgyMDYwLCAweDYwMDgsIDB4YTA4NCwgMHhmYmVmLAorCTB4NjAwYSwgMHg4MjExLCAweDAwNDAsIDB4MmIwOCwgMHgxMDc4LCAweDJiMGYsIDB4MDA3OCwgMHgyYWZiLAorCTB4NzBhNywgMHgwMDAxLCAweDBjN2YsIDB4MDI3ZiwgMHgwZDdmLCAweDAxN2YsIDB4MDA3YywgMHhhZGU4LAorCTB4MDAwNSwgMHg3MGFjLCAweGFkMDYsIDB4MDBjMCwgMHgyYjE3LCAweDcwYTgsIDB4MjA2OCwgMHgwMDdjLAorCTB4MTA3OCwgMHg0MzYwLCAweDAwYzAsIDB4MjljMSwgMHg3MDdjLCAweDIwNjgsIDB4Nzc3NCwgMHgxMDc4LAorCTB4NDFmZSwgMHgyYzUwLCAweDEwNzgsIDB4NDQ0MiwgMHg3ODliLCAweDAwMTAsIDB4NjgxNCwgMHhhMDg0LAorCTB4MDAxZiwgMHhjMGJkLCAweDc4YWEsIDB4NmUxYywgMHgyMDQxLCAweDAwMDEsIDB4MjAwMSwgMHgwMDA0LAorCTB4MDA3OCwgMHgyYzkyLCAweDEwNzgsIDB4NDM2MCwgMHgwMGMwLCAweDI5YzEsIDB4Nzg5YiwgMHgwMDEwLAorCTB4NzA2MCwgMHgyMDY4LCAweDZmMTQsIDB4NzBkNCwgMHhkMGI0LCAweDAwNDAsIDB4MmI0YywgMHhjMGI0LAorCTB4NzBkNiwgMHgwYzdlLCAweDcwYjgsIDB4YTA2NSwgMHg2MDA4LCAweGEwODQsIDB4ZmJlZiwgMHg2MDBhLAorCTB4NjAxOCwgMHg4MDAxLCAweDYwMWEsIDB4MGM3ZiwgMHgxMDc4LCAweDQxZmUsIDB4MmM1MCwgMHgxMDc4LAorCTB4NDQ0MiwgMHg2ODI0LCAweGEwMDUsIDB4MDA0MCwgMHgyYjVkLCAweGEwODIsIDB4MDAwNiwgMHgwMDQ4LAorCTB4MmI1YiwgMHgwMDc4LCAweDJiNWQsIDB4NjgyNywgMHgwMDA1LCAweDY4MTQsIDB4YTA4NCwgMHgwMDFmLAorCTB4YzBiZCwgMHg3OGFhLCAweDIwMzEsIDB4MDAyMCwgMHgyMDQxLCAweDAwMDEsIDB4MjAwMSwgMHgwMDAzLAorCTB4MDA3OCwgMHgyYzkyLCAweGMyOGQsIDB4NzJkNiwgMHg3MmMwLCAweGEyMDAsIDB4YTAxNSwgMHg3MTU0LAorCTB4ODEwOCwgMHhhMTJhLCAweDAwNDgsIDB4MmI3NSwgMHg3MWMwLCAweDIxNjQsIDB4NjUwNCwgMHg4NWZmLAorCTB4MDBjMCwgMHgyYjhjLCAweDcxNTYsIDB4ODQyMSwgMHgwMGMwLCAweDJiNzAsIDB4NzBkNCwgMHhkMDhjLAorCTB4MDA0MCwgMHgyYjg4LCAweDcwZDAsIDB4YTAwNSwgMHgwMGMwLCAweDJiODgsIDB4NzBkMywgMHgwMDBhLAorCTB4MDA3YywgMHgyMjAwLCAweDAwNzgsIDB4MmI3YSwgMHg3MGQ0LCAweGMwOGMsIDB4NzBkNiwgMHg3MGQzLAorCTB4MDAwMCwgMHg2MDM0LCAweGEwMDUsIDB4MDBjMCwgMHgyYjg5LCAweDY3MDgsIDB4YTc4NCwgMHgwNzNmLAorCTB4MDA0MCwgMHgyYmJiLCAweGQ3ZDQsIDB4MDBjMCwgMHgyYjg5LCAweGE3ODQsIDB4MDAyMSwgMHgwMGMwLAorCTB4MmI4OSwgMHhhNzg0LCAweDAwMDIsIDB4MDA0MCwgMHgyYmFjLCAweGE3ODQsIDB4MDAwNCwgMHgwMDQwLAorCTB4MmI4OSwgMHhhN2JjLCAweGZmZmIsIDB4NjcwYSwgMHhhNzg0LCAweDAyMTgsIDB4MDBjMCwgMHgyYjg5LAorCTB4YTc4NCwgMHgwMTAwLCAweDAwNDAsIDB4MmJiYiwgMHg2MDE4LCAweGEwMDUsIDB4MDBjMCwgMHgyYjg5LAorCTB4YTdiYywgMHhmZWZmLCAweDY3MGEsIDB4MjU2OCwgMHg2ODIzLCAweDAwMDAsIDB4NmUxYywgMHhhNjg0LAorCTB4MDAwZSwgMHg2MzE4LCAweDAwNDAsIDB4MmJjYywgMHg2MDFjLCAweGEzMDIsIDB4MDA0OCwgMHgyYmNmLAorCTB4MDA0MCwgMHgyYmNmLCAweDAwNzgsIDB4MmI4OSwgMHg4M2ZmLCAweDAwYzAsIDB4MmI4OSwgMHgyZDU4LAorCTB4MmM1MCwgMHg3MTU2LCAweGQ3YmMsIDB4MDBjMCwgMHgyYmQ4LCAweDcwMjgsIDB4NjAyMiwgMHg2MDNhLAorCTB4YzdiYywgMHg2NzBhLCAweDY4YzAsIDB4YTA2NSwgMHhhMDRkLCAweDYxMDAsIDB4MmE2MCwgMHgyMDQxLAorCTB4MDAwMSwgMHg2YjE0LCAweGEzOWMsIDB4MDAxZiwgMHhhMzlkLCAweDAwYzAsIDB4ZDFmYywgMHgwMDQwLAorCTB4MmJlYywgMHhkNjg0LCAweDAwNDAsIDB4MmJlZSwgMHhhMzljLCAweGZmYmYsIDB4ZDZhNCwgMHgwMDQwLAorCTB4MmJmMywgMHhhMzlkLCAweDAwMjAsIDB4YTY4NCwgMHgwMDBlLCAweDAwYzAsIDB4MmMzZSwgMHhjN2E1LAorCTB4NjcwYSwgMHgyYzAwLCAweDY4YzYsIDB4NzdhNCwgMHhhNzg2LCAweDAwMDEsIDB4MDBjMCwgMHgyYzEyLAorCTB4NzBkNCwgMHhkMGI0LCAweDAwYzAsIDB4MmMxMiwgMHg3MDAwLCAweGEwODIsIDB4MDAwMiwgMHgwMGM4LAorCTB4MmMxMiwgMHg3ODMwLCAweGQwYmMsIDB4MDBjMCwgMHgyYzEyLCAweDc4OWIsIDB4MDAxMCwgMHg3YmFhLAorCTB4MDA3OCwgMHgyYzhhLCAweDg3MzksIDB4NzdhNiwgMHgyNzUwLCAweDc3YjAsIDB4YTdiMCwgMHgwMDA1LAorCTB4NzBhYywgMHhhNjA2LCAweDAwYzAsIDB4MmMxZCwgMHg3NmE4LCAweDc2YjIsIDB4MmMzYSwgMHg4NzM4LAorCTB4MmQzYSwgMHg4NzM4LCAweDI4M2EsIDB4ODczOCwgMHgyMzNhLCAweDg3MzgsIDB4MjUzYSwgMHg3ODMwLAorCTB4ZDBiYywgMHgwMDQwLCAweDJjMzUsIDB4MjA5MSwgMHg4MDAwLCAweDIwOTEsIDB4MzAzZCwgMHg3MGQ0LAorCTB4YTA4NCwgMHgzMDNkLCAweDIwOTEsIDB4ODAwMCwgMHgyMDkwLCAweGFhZDUsIDB4MDAwMCwgMHgwMDQwLAorCTB4MmMzZCwgMHg4NDIxLCAweDIyMDAsIDB4MDBjMCwgMHgyYjZmLCAweDAwN2MsIDB4ZDFkYywgMHgwMDQwLAorCTB4M2UwMCwgMHgyMDI5LCAweDAwMjAsIDB4ZDY5YywgMHgwMGMwLCAweDJjNGIsIDB4ODUyOCwgMHhkNjhjLAorCTB4MDBjMCwgMHgyYzRiLCAweDg1MjgsIDB4ODg0MCwgMHg2ZjE0LCAweDYxMGMsIDB4ODEwOCwgMHhhMThjLAorCTB4MDBmZiwgMHg3MGNjLCAweGExNjAsIDB4MmM2NCwgMHg4Y2ZmLCAweDAwNDAsIDB4MmM2YSwgMHg2MDE0LAorCTB4YTcwNiwgMHgwMGMwLCAweDJjNTMsIDB4NjBiOCwgMHg4MDAxLCAweDYwYmEsIDB4MDBjMCwgMHgyYzRlLAorCTB4MmE2MCwgMHg2MDA4LCAweGEwODUsIDB4MDEwMCwgMHg2MDBhLCAweDIyMDAsIDB4ODQyMSwgMHgwMGMwLAorCTB4MmI2ZiwgMHgwMDdjLCAweDJhNjAsIDB4NjEwZSwgMHg2OWJlLCAweDJjMDAsIDB4NjhjNiwgMHg4ODQwLAorCTB4NjAwOCwgMHhjMGQ1LCAweDYwMGEsIDB4NzdhNCwgMHhhNzg2LCAweDAwMDEsIDB4MDBjMCwgMHgyYzEyLAorCTB4NzBkNCwgMHhkMGI0LCAweDAwYzAsIDB4MmMxMiwgMHg3MDAwLCAweGEwODIsIDB4MDAwMiwgMHgwMGM4LAorCTB4MmMxMiwgMHg3ODMwLCAweGQwYmMsIDB4MDBjMCwgMHgyYzEyLCAweDc4OWIsIDB4MDAxMCwgMHg3YmFhLAorCTB4N2RhYSwgMHg3OWFhLCAweDIwMDEsIDB4MDAwMiwgMHgwMDdlLCAweDYwMTgsIDB4ODAwMCwgMHg2MDFhLAorCTB4MDA3OCwgMHgyYzkzLCAweDAwN2UsIDB4Mjk2MCwgMHg2MTA0LCAweDJhNjAsIDB4YTE4NCwgMHgwMDE4LAorCTB4MDA0MCwgMHgyY2FmLCAweGExODQsIDB4MDAxMCwgMHgwMDQwLCAweDJjYTIsIDB4MTA3OCwgMHg0MDExLAorCTB4MDBjMCwgMHgyY2Q0LCAweGExODQsIDB4MDAwOCwgMHgwMDQwLCAweDJjYWYsIDB4NjlhMCwgMHhhMTg0LAorCTB4MDYwMCwgMHgwMGMwLCAweDJjYWYsIDB4MTA3OCwgMHgzZWY1LCAweDAwNzgsIDB4MmNkNCwgMHg2OWEwLAorCTB4YTE4NCwgMHgxZTAwLCAweDAwNDAsIDB4MmNkZiwgMHhhMTg0LCAweDA4MDAsIDB4MDA0MCwgMHgyY2M4LAorCTB4MGM3ZSwgMHgyOTYwLCAweDYwMDAsIDB4YTA4NSwgMHgyMDAwLCAweDYwMDIsIDB4NjEwNCwgMHhhMThkLAorCTB4MDAxMCwgMHg2MTA2LCAweDBjN2YsIDB4MTA3OCwgMHg0MDExLCAweDAwYzAsIDB4MmNkNCwgMHg2OWEwLAorCTB4YTE4NCwgMHgwMjAwLCAweDAwNDAsIDB4MmNkMCwgMHgxMDc4LCAweDNmNTQsIDB4MDA3OCwgMHgyY2Q0LAorCTB4YTE4NCwgMHgwNDAwLCAweDAwYzAsIDB4MmNhYiwgMHg2OWEwLCAweGExODQsIDB4MTAwMCwgMHgwMDQwLAorCTB4MmNkZiwgMHg2OTE0LCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDEwNzgsIDB4Mjc5ZiwgMHgwMjdmLAorCTB4YTY4YywgMHgwMGUwLCAweGE2ODQsIDB4MDA2MCwgMHgwMDQwLCAweDJjZWMsIDB4YTA4NiwgMHgwMDYwLAorCTB4MDBjMCwgMHgyY2VjLCAweGExOGQsIDB4NDAwMCwgMHhhMThkLCAweDAxMDQsIDB4NjliNiwgMHg3ODliLAorCTB4MDA2MCwgMHgyODAwLCAweDc4YWEsIDB4NjgxOCwgMHhjMGZkLCAweDY4MWEsIDB4ZDZiYywgMHgwMDQwLAorCTB4MmQwNywgMHhjMGZjLCAweDcwODcsIDB4MDAwMCwgMHhhMDhhLCAweDAwMGQsIDB4MDA1MCwgMHgyZDA1LAorCTB4YTA4YSwgMHgwMDBjLCAweDcxODYsIDB4MjAwMSwgMHgwMDBjLCAweDgwMGMsIDB4NzE4YSwgMHg3OGFhLAorCTB4MzUxOCwgMHgzMzQwLCAweDM0MjgsIDB4ODAwMCwgMHg4MGFjLCAweGFmODAsIDB4MDAyYiwgMHgyMGEwLAorCTB4Nzg5YiwgMHgwMDAwLCAweGFkODAsIDB4MDAwYiwgMHgyMDk4LCAweDUzYTYsIDB4MjNhOCwgMHgyODk4LAorCTB4MjVhMCwgMHhhMjg2LCAweDAwMjAsIDB4MDBjMCwgMHgyZDNmLCAweDcwZDQsIDB4YzBiNSwgMHg3MGQ2LAorCTB4MmMwMCwgMHg3MGJhLCAweDJkMDAsIDB4NzBiZSwgMHg2ODE0LCAweGMwZmMsIDB4ODAwNywgMHg3ODgyLAorCTB4YTI4NiwgMHgwMDAyLCAweDAwNDAsIDB4MmQ3NSwgMHg3MGE0LCAweDgwMDAsIDB4NzBhNiwgMHg3NGI0LAorCTB4YTQ5OCwgMHgwMDA1LCAweDcwYWMsIDB4YTMwNiwgMHgwMGMwLCAweDJkMzcsIDB4NzNhOCwgMHg3M2I2LAorCTB4YTI4NiwgMHgwMDEwLCAweDAwNDAsIDB4MjljMSwgMHgwZDdmLCAweDBjN2YsIDB4MDA3YywgMHg3MDAwLAorCTB4YTAwNSwgMHgwMGMwLCAweDJkMWQsIDB4YTI4NiwgMHgwMDAyLCAweDAwYzAsIDB4MmQ4ZiwgMHgxMDc4LAorCTB4NDM2MCwgMHgwMGMwLCAweDJkMWQsIDB4NjgxNCwgMHhjMGZjLCAweDgwMDcsIDB4Nzg4MiwgMHgyMDkxLAorCTB4ODAwMCwgMHg3ODFiLCAweDAwNWIsIDB4NjhiNCwgMHg3ODVhLCAweDY4OTQsIDB4NzhkNiwgMHg3OGRlLAorCTB4Njg5OCwgMHg3OGQyLCAweDc4ZGEsIDB4MjA5MSwgMHg4MDAxLCAweDc4MDgsIDB4YzA4ZCwgMHg3ODBhLAorCTB4MTI3ZSwgMHgwZDdlLCAweDBjN2UsIDB4NzBkNCwgMHhhMDg0LCAweDI3MDAsIDB4MjA5MCwgMHgwYzdmLAorCTB4MGQ3ZiwgMHgxMjdmLCAweDI5MDAsIDB4NzA1YSwgMHg2OGJjLCAweDcwNDIsIDB4NzAwMywgMHgwMDAyLAorCTB4MmQwMCwgMHg3MDRlLCAweGFkODAsIDB4MDAwOSwgMHg3MDQ2LCAweDc4MzAsIDB4ZDBiYywgMHgwMDQwLAorCTB4MmQ4MSwgMHgyMDkxLCAweDMwM2QsIDB4NzBkNCwgMHhhMDg0LCAweDMwM2QsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA5MCwgMHg3MGE0LCAweGEwMDUsIDB4MDBjMCwgMHgyZDg2LCAweDAwN2MsIDB4ODQyMSwgMHgwMDQwLAorCTB4MmQ4NSwgMHg3MjUwLCAweDcwYzAsIDB4YTIwMCwgMHhhMDE1LCAweDAwNzgsIDB4MmI2ZiwgMHhhMjg2LAorCTB4MDAxMCwgMHgwMGMwLCAweDJkYzAsIDB4MTA3OCwgMHg0MzYwLCAweDAwYzAsIDB4MmQxZCwgMHg2ODE0LAorCTB4YzBmYywgMHg4MDA3LCAweDc4ODIsIDB4NzgxYiwgMHgwMDViLCAweDY4YjQsIDB4Nzg1YSwgMHg2ODk0LAorCTB4NzhkNiwgMHg3OGRlLCAweDY4OTgsIDB4NzhkMiwgMHg3OGRhLCAweDc4MDgsIDB4YzA4ZCwgMHg3ODBhLAorCTB4NzBhNCwgMHg4MDAwLCAweDcwYTYsIDB4NzRiNCwgMHhhNDkwLCAweDAwMDUsIDB4NzBhYywgMHhhMjA2LAorCTB4MDBjMCwgMHgyZGIzLCAweDcyYTgsIDB4NzJiNiwgMHgyOTAwLCAweDcwNWEsIDB4NjhiYywgMHg3MDQyLAorCTB4NzAwMywgMHgwMDAyLCAweDJkMDAsIDB4NzA0ZSwgMHhhZDgwLCAweDAwMDksIDB4NzA0NiwgMHgwMDdjLAorCTB4NmJiNCwgMHhhMzlkLCAweDIwMDAsIDB4N2I1YSwgMHg2ODE0LCAweGMwZmMsIDB4ODAwNywgMHg3ODgyLAorCTB4NmI5NCwgMHg3YmQ2LCAweDdiZGUsIDB4NmU5OCwgMHg3ZWQyLCAweDdlZGEsIDB4NzgxYiwgMHgwMDViLAorCTB4MjkwMCwgMHg3MDVhLCAweDcyMDIsIDB4NzgwOCwgMHhjMDhkLCAweDc4MGEsIDB4MjMwMCwgMHhhNjA1LAorCTB4MDA0MCwgMHgyZGViLCAweDcwZDQsIDB4YTA4NCwgMHgyNzAwLCAweGEwODYsIDB4MjMwMCwgMHgwMGMwLAorCTB4MmRlNSwgMHgyMDA5LCAweDAwMDAsIDB4MDA3OCwgMHgyZGU3LCAweDIwMDksIDB4MDAwMSwgMHhhMjg0LAorCTB4MDAwZiwgMHgxMDc5LCAweDJkZWYsIDB4YWQ4MCwgMHgwMDA5LCAweDcwNDYsIDB4MDA3YywgMHgyZGY3LAorCTB4NDhiZCwgMHg0OGJkLCAweDQ4YWEsIDB4NDhiZCwgMHgyZGY3LCAweDJkZjcsIDB4MmRmNywgMHgxMDc4LAorCTB4Mjk2YiwgMHg3ODA4LCAweGEwODQsIDB4ZmZmZCwgMHg3ODBhLCAweDEwNzgsIDB4Mjk1ZSwgMHgwZjdlLAorCTB4MjA3OSwgMHg0ZTAwLCAweDc4YWMsIDB4MGY3ZiwgMHhkMDg0LCAweDAwNDAsIDB4MmUyMSwgMHg3MDY0LAorCTB4YTA4NiwgMHgwMDAxLCAweDAwYzAsIDB4MmUwZiwgMHg3MDY2LCAweDAwNzgsIDB4MmVmOCwgMHg3MDY0LAorCTB4YTA4NiwgMHgwMDA1LCAweDAwYzAsIDB4MmUxZiwgMHg3MDdjLCAweDIwNjgsIDB4NjgxYiwgMHgwMDA0LAorCTB4NjgxNywgMHgwMDAwLCAweDY4MjAsIDB4YTA4NCwgMHgwMGZmLCAweGMwOWQsIDB4NjgyMiwgMHg3MDY3LAorCTB4MDAwMCwgMHg3MGE3LCAweDAwMDAsIDB4NzBhOCwgMHg3MGIyLCAweDcwYjYsIDB4MTA3OCwgMHgyYWJhLAorCTB4MTU3ZSwgMHgyMDExLCAweDAwMDQsIDB4NzE2NCwgMHhhMTg2LCAweDAwMDEsIDB4MDA0MCwgMHgyZTQxLAorCTB4YTE4NiwgMHgwMDA3LCAweDAwYzAsIDB4MmUzOCwgMHg3MDFmLCAweDAwMDUsIDB4MDA3OCwgMHgyZTQxLAorCTB4NzAxZiwgMHgwMDAxLCAweDcwNjcsIDB4MDAwMCwgMHg3MGQ0LCAweGMwZGQsIDB4NzBkNiwgMHgwMDc4LAorCTB4MmU0MywgMHg3MDY3LCAweDAwMDAsIDB4MjAwMSwgMHg0ZTBhLCAweDIwMDQsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4NiwgMHgwMDE4LCAweDAwNDAsIDB4MmU1MywgMHg3MDE4LCAweDcwMTYsIDB4YTAwNSwgMHgwMGMwLAorCTB4MmU1MywgMHg3MGE3LCAweDAwMDEsIDB4MDY3ZSwgMHgxMDc4LCAweDQ1ODYsIDB4MjBhOSwgMHgwMDEwLAorCTB4MjAzOSwgMHgwMDAwLCAweDEwNzgsIDB4NDBmOCwgMHhhN2I4LCAweDAxMDAsIDB4MDBmMCwgMHgyZTVhLAorCTB4MDY3ZiwgMHg3MDAwLCAweDAwNzksIDB4MmU2NCwgMHgyZTllLCAweDJlNzksIDB4MmU3OSwgMHgyZTZlLAorCTB4MmU5ZSwgMHgyZTllLCAweDJlOWUsIDB4MmU2YywgMHgxMDc4LCAweDI5NmIsIDB4NzA2MCwgMHhhMDA1LAorCTB4MDA0MCwgMHgyZTllLCAweGFkMDYsIDB4MDBjMCwgMHgyZTc5LCAweDY4MDAsIDB4NzA2MiwgMHgwMDc4LAorCTB4MmU4YiwgMHg2ODIwLCAweGQwODQsIDB4MDBjMCwgMHgyZTg3LCAweDZmMTQsIDB4MTA3OCwgMHg0MWZlLAorCTB4NjAwOCwgMHhjMGQ0LCAweDYwMGEsIDB4MTA3OCwgMHgzZGQwLCAweDAwNzgsIDB4MmU4YiwgMHg3MDVjLAorCTB4MjA2MCwgMHg2ODAwLCAweDYwMDIsIDB4YTY4NCwgMHg1ZjAwLCAweDY4MWUsIDB4NjgxOCwgMHhkMGZjLAorCTB4MDA0MCwgMHgyZTkzLCAweDZhMWEsIDB4NjgxNywgMHgwMDAwLCAweDY4MmIsIDB4MDAwMCwgMHg2ODIwLAorCTB4YTA4NCwgMHgwMGZmLCAweGMwOWQsIDB4NjgyMiwgMHgxMDc4LCAweDIwMmMsIDB4YjI4NCwgMHgwNDAwLAorCTB4MDA0MCwgMHgyZWE2LCAweDIwMjEsIDB4OTVkMCwgMHgwMDc4LCAweDJlYTgsIDB4MjAyMSwgMHg5NGMwLAorCTB4MTA3OCwgMHgyZWZkLCAweGIyODQsIDB4MDQwMCwgMHgwMDQwLCAweDJlYjIsIDB4MjAyMSwgMHg0ZTk4LAorCTB4MDA3OCwgMHgyZWI0LCAweDIwMjEsIDB4NGU1OCwgMHgxMDc4LCAweDJlZmQsIDB4MjBhOSwgMHgwMTAxLAorCTB4YjI4NCwgMHgwNDAwLCAweDAwNDAsIDB4MmVjMCwgMHgyMDIxLCAweDk0ZDAsIDB4MDA3OCwgMHgyZWMyLAorCTB4MjAyMSwgMHg5M2MwLCAweDEwNzgsIDB4MmVmZCwgMHg4NDIwLCAweDAwZjAsIDB4MmVjMiwgMHhiMjg0LAorCTB4MDMwMCwgMHgwMDQwLCAweDJlY2YsIDB4MjA2MSwgMHg1M2MwLCAweDAwNzgsIDB4MmVkMSwgMHgyMDYxLAorCTB4NzNjMCwgMHgyMDIxLCAweDAwMDIsIDB4MjBhOSwgMHgwMTAwLCAweDYxMTAsIDB4ODFmZiwgMHgwMDQwLAorCTB4MmVlZSwgMHg2MDE4LCAweDAxN2UsIDB4MDA3ZSwgMHgyMDExLCAweDRlMDIsIDB4MjIwYywgMHhhMTAyLAorCTB4MjAxMiwgMHgwMDdmLCAweDAxN2YsIDB4YTEwMiwgMHgwMDUwLCAweDJlZWUsIDB4NjAxMiwgMHgwMGMwLAorCTB4MmVlZSwgMHgyMDExLCAweDRlMDQsIDB4MjIwNCwgMHhjMGE1LCAweDIwMTIsIDB4NjAxYiwgMHgwMDAwLAorCTB4YWNlMCwgMHgwMDEwLCAweDAwZjAsIDB4MmVkNSwgMHg4NDIxLCAweDAwYzAsIDB4MmVkMywgMHgxNTdmLAorCTB4NzAwMywgMHgwMDAwLCAweDcwNGYsIDB4MDAwMCwgMHgwMDdjLCAweDA0N2UsIDB4MjQwNCwgMHhhMDA1LAorCTB4MDA0MCwgMHgyZjE4LCAweDIwNjgsIDB4NjgwMCwgMHgwMDdlLCAweDZhMWEsIDB4NjgxNywgMHgwMDAwLAorCTB4NjgyYiwgMHgwMDAwLCAweDY4YjQsIDB4YTA4NCwgMHg1ZjAwLCAweDY4MWUsIDB4NjgyMCwgMHhhMDg0LAorCTB4MDBmZiwgMHhjMDlkLCAweDY4MjIsIDB4MTA3OCwgMHgyMDJjLCAweDAwN2YsIDB4MDA3OCwgMHgyZWZmLAorCTB4MDQ3ZiwgMHgyMDIzLCAweDAwMDAsIDB4MDA3YywgMHhhMjgyLCAweDAwMDMsIDB4MDA1MCwgMHgyZjIyLAorCTB4MTA3OCwgMHgyOTZiLCAweDIzMDAsIDB4MDA3OSwgMHgyZjI1LCAweDJmMjgsIDB4MmZiMywgMHgyZmQwLAorCTB4YTI4MiwgMHgwMDAyLCAweDAwNDAsIDB4MmYyZSwgMHgxMDc4LCAweDI5NmIsIDB4NzA2NCwgMHg3MDY3LAorCTB4MDAwMCwgMHg3MDgzLCAweDAwMDAsIDB4MDA3OSwgMHgyZjM1LCAweDJmM2QsIDB4MmYzZCwgMHgyZjNmLAorCTB4MmY3ZiwgMHgzZTBjLCAweDJmM2QsIDB4MmY3ZiwgMHgyZjNkLCAweDEwNzgsIDB4Mjk2YiwgMHg3Nzc0LAorCTB4MTA3OCwgMHg0MGY4LCAweDc3NzQsIDB4YTdiYywgMHg4ZjAwLCAweDEwNzgsIDB4NDFmZSwgMHg2MDE4LAorCTB4YTAwNSwgMHgwMDQwLCAweDJmNzYsIDB4ZDdmYywgMHgwMGMwLCAweDJmNTIsIDB4MjAyMSwgMHg5NGMwLAorCTB4MDA3OCwgMHgyZjU0LCAweDIwMjEsIDB4OTVkMCwgMHgyMDA5LCAweDAwMDUsIDB4MjAxMSwgMHgwMDEwLAorCTB4MTA3OCwgMHgyZmViLCAweDAwNDAsIDB4MmY3NiwgMHgxNTdlLCAweDIwYTksIDB4MDEwMSwgMHhkN2ZjLAorCTB4MDBjMCwgMHgyZjY2LCAweDIwMjEsIDB4OTNjMCwgMHgwMDc4LCAweDJmNjgsIDB4MjAyMSwgMHg5NGQwLAorCTB4MDQ3ZSwgMHgyMDA5LCAweDAwMDUsIDB4MjAxMSwgMHgwMDEwLCAweDEwNzgsIDB4MmZlYiwgMHgwNDdmLAorCTB4MDA0MCwgMHgyZjc1LCAweDg0MjAsIDB4MDBmMCwgMHgyZjY4LCAweDE1N2YsIDB4ODczOCwgMHhhNzg0LAorCTB4MDAxZiwgMHgwMGMwLCAweDJmNDUsIDB4MDA3OCwgMHgyOWM1LCAweDAwNzgsIDB4MjljNSwgMHg3Nzc0LAorCTB4MTA3OCwgMHg0MWZlLCAweDYwMTgsIDB4YTAwNSwgMHgwMDQwLCAweDJmYjEsIDB4ZDdmYywgMHgwMGMwLAorCTB4MmY4ZCwgMHgyMDIxLCAweDk0YzAsIDB4MDA3OCwgMHgyZjhmLCAweDIwMjEsIDB4OTVkMCwgMHgyMDA5LAorCTB4MDAwNSwgMHgyMDExLCAweDAwMjAsIDB4MTA3OCwgMHgyZmViLCAweDAwNDAsIDB4MmZiMSwgMHgxNTdlLAorCTB4MjBhOSwgMHgwMTAxLCAweGQ3ZmMsIDB4MDBjMCwgMHgyZmExLCAweDIwMjEsIDB4OTNjMCwgMHgwMDc4LAorCTB4MmZhMywgMHgyMDIxLCAweDk0ZDAsIDB4MDQ3ZSwgMHgyMDA5LCAweDAwMDUsIDB4MjAxMSwgMHgwMDIwLAorCTB4MTA3OCwgMHgyZmViLCAweDA0N2YsIDB4MDA0MCwgMHgyZmIwLCAweDg0MjAsIDB4MDBmMCwgMHgyZmEzLAorCTB4MTU3ZiwgMHgwMDc4LCAweDI5YzUsIDB4MjIwMCwgMHgwMDc5LCAweDJmYjYsIDB4MmZiOSwgMHgyZmJiLAorCTB4MmZiYiwgMHgxMDc4LCAweDI5NmIsIDB4MjAwOSwgMHgwMDEyLCAweDcwNjQsIDB4YTA4NiwgMHgwMDAyLAorCTB4MDA0MCwgMHgyZmM0LCAweDIwMDksIDB4MDAwZSwgMHg2ODE4LCAweGQwZmMsIDB4MDA0MCwgMHgyZmM5LAorCTB4NjkxYSwgMHg3MDY3LCAweDAwMDAsIDB4NzBkNCwgMHhjMGRkLCAweDcwZDYsIDB4MDA3OCwgMHg0MzBkLAorCTB4MjIwMCwgMHgwMDc5LCAweDJmZDMsIDB4MmZkOCwgMHgyZmJiLCAweDJmZDYsIDB4MTA3OCwgMHgyOTZiLAorCTB4MTA3OCwgMHg0NTg2LCAweDcwMDAsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4M2Q3ZSwgMHgxMDc4LAorCTB4M2RlZCwgMHg2MDA4LCAweGEwODQsIDB4ZmJlZiwgMHg2MDBhLCAweDEwNzgsIDB4M2Q2ZiwgMHgwMDQwLAorCTB4M2Q3ZSwgMHgwMDc4LCAweDI5YzUsIDB4MjQwNCwgMHhhMDA1LCAweDAwNDAsIDB4MzAyNCwgMHgyMDY4LAorCTB4MmQwNCwgMHgwMDdlLCAweDY4MTQsIDB4YTcwNiwgMHgwMDQwLCAweDJmZmEsIDB4MmQyMCwgMHgwMDdmLAorCTB4MDA3OCwgMHgyZmVjLCAweDAwN2YsIDB4MjAyMiwgMHg2OTFhLCAweDY4MTcsIDB4MDAwMCwgMHg2ODJiLAorCTB4MDAwMCwgMHg2OGI0LCAweGEwODQsIDB4NWYwMCwgMHg2ODFlLCAweDY4MjAsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTIwNSwgMHg2ODIyLCAweDEwNzgsIDB4MjAyYywgMHgyMDIxLCAweDRlMDIsIDB4MjQxYywgMHg4MzE5LAorCTB4MjMyMiwgMHg2MDEwLCAweDgwMDEsIDB4NjAxMiwgMHgwMGMwLCAweDMwMWIsIDB4MjAyMSwgMHg0ZTA0LAorCTB4MjQwNCwgMHhjMGE1LCAweDIwMjIsIDB4NjAwOCwgMHhhMDg0LCAweGY5ZWYsIDB4NjAwYSwgMHgxMDc4LAorCTB4MmFkYiwgMHgxMDc4LCAweDNkZWQsIDB4MDA3YywgMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwgMHgzMDIzLAorCTB4MjMwMCwgMHgwMDc5LCAweDMwMmIsIDB4MzAzMCwgMHgzMDJlLCAweDMwYjAsIDB4MTA3OCwgMHgyOTZiLAorCTB4NzhlNCwgMHhhMDA1LCAweDAwZDAsIDB4MzA2NiwgMHgzMjA4LCAweDAwN2UsIDB4MjAwMSwgMHg0ZTA0LAorCTB4MjAwNCwgMHhkMGVjLCAweDAwN2YsIDB4MDA0MCwgMHgzMDQxLCAweGExOGMsIDB4MDMwMCwgMHgwMDc4LAorCTB4MzA0MywgMHhhMThjLCAweDA0MDAsIDB4MDA0MCwgMHgzMDQ5LCAweDAwMTgsIDB4MjljMSwgMHgwMDc4LAorCTB4MzA0YiwgMHgwMDI4LCAweDI5YzEsIDB4MjAwOCwgMHhhMDg0LCAweDAwMzAsIDB4MDBjMCwgMHgzMDUyLAorCTB4MDA3OCwgMHgzNzcwLCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDAwNDAsIDB4MzA1MCwgMHgyMTAwLAorCTB4YTA4NCwgMHgwMDA3LCAweDAwNzksIDB4MzA1YywgMHgzMDkwLCAweDMwOWEsIDB4MzA4NSwgMHgzMDY0LAorCTB4NDM1NSwgMHg0MzU1LCAweDMwNjQsIDB4MzBhNSwgMHgxMDc4LCAweDI5NmIsIDB4NzAwMCwgMHhhMDg2LAorCTB4MDAwNCwgMHgwMGMwLCAweDMwODAsIDB4NzA2NCwgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHgzMDc2LAorCTB4MjAxMSwgMHgwMDAyLCAweDIwMTksIDB4MDAwMCwgMHgwMDc4LCAweDJmMWMsIDB4NzA2NCwgMHhhMDg2LAorCTB4MDAwNiwgMHgwMDQwLCAweDMwNzAsIDB4NzA2NCwgMHhhMDg2LCAweDAwMDQsIDB4MDA0MCwgMHgzMDcwLAorCTB4NzllNCwgMHgyMDAxLCAweDAwMDMsIDB4MDA3OCwgMHgzM2ZhLCAweDY4MTgsIDB4ZDBmYywgMHgwMDQwLAorCTB4MzA4YiwgMHg2ODFiLCAweDAwMWQsIDB4MTA3OCwgMHg0MGM4LCAweDc4MWIsIDB4MDA2NCwgMHgwMDdjLAorCTB4NjgxOCwgMHhkMGZjLCAweDAwNDAsIDB4MzA5NiwgMHg2ODFiLCAweDAwMWQsIDB4MTA3OCwgMHg0MGM4LAorCTB4MDA3OCwgMHg0MzMxLCAweDY4MTgsIDB4ZDBmYywgMHgwMDQwLCAweDMwYTAsIDB4NjgxYiwgMHgwMDFkLAorCTB4MTA3OCwgMHg0MGM4LCAweDc4MWIsIDB4MDBmOCwgMHgwMDdjLCAweDY4MTgsIDB4ZDBmYywgMHgwMDQwLAorCTB4MzBhYiwgMHg2ODFiLCAweDAwMWQsIDB4MTA3OCwgMHg0MGM4LCAweDc4MWIsIDB4MDBjOCwgMHgwMDdjLAorCTB4YTU4NCwgMHgwMDBmLCAweDAwYzAsIDB4MzBjZiwgMHgxMDc4LCAweDI5NWUsIDB4NzAwMCwgMHgwMDc5LAorCTB4MzBiOSwgMHgyOWM1LCAweDMwYzEsIDB4MzBjMywgMHgzZDdlLCAweDNkN2UsIDB4M2Q3ZSwgMHgzMGMxLAorCTB4MzBjMSwgMHgxMDc4LCAweDI5NmIsIDB4MTA3OCwgMHgzZGVkLCAweDYwMDgsIDB4YTA4NCwgMHhmYmVmLAorCTB4NjAwYSwgMHgxMDc4LCAweDNkNmYsIDB4MDA0MCwgMHgzZDdlLCAweDAwNzgsIDB4MjljNSwgMHg3OGU0LAorCTB4YTAwNSwgMHgwMGQwLCAweDMwNjYsIDB4MzIwOCwgMHgwMDdlLCAweDIwMDEsIDB4NGUwNCwgMHgyMDA0LAorCTB4ZDBlYywgMHgwMDdmLCAweDAwNDAsIDB4MzBlMCwgMHhhMThjLCAweDAzMDAsIDB4MDA3OCwgMHgzMGUyLAorCTB4YTE4YywgMHgwNDAwLCAweDAwNDAsIDB4MzBlOCwgMHgwMDE4LCAweDMwNjYsIDB4MDA3OCwgMHgzMGVhLAorCTB4MDAyOCwgMHgzMDY2LCAweDIwMDgsIDB4YTA4NCwgMHgwMDMwLCAweDAwYzAsIDB4MzBmMiwgMHg3ODFiLAorCTB4MDA1YiwgMHgwMDdjLCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDAwNDAsIDB4MzBlZiwgMHgyMTAwLAorCTB4YTE4NCwgMHgwMDA3LCAweDAwNzksIDB4MzBmYywgMHgzMTBiLCAweDMxMGYsIDB4MzEwNiwgMHgzMTA0LAorCTB4NDM1NSwgMHg0MzU1LCAweDMxMDQsIDB4NDM0ZiwgMHgxMDc4LCAweDI5NmIsIDB4MTA3OCwgMHg0MGQwLAorCTB4NzgxYiwgMHgwMDY0LCAweDAwN2MsIDB4MTA3OCwgMHg0MGQwLCAweDAwNzgsIDB4NDMzMSwgMHgxMDc4LAorCTB4NDBkMCwgMHg3ODFiLCAweDAwZjgsIDB4MDA3YywgMHgxMDc4LCAweDQwZDAsIDB4NzgxYiwgMHgwMGM4LAorCTB4MDA3YywgMHgyMzAwLCAweDAwNzksIDB4MzExYywgMHgzMTIxLCAweDMxMWYsIDB4MzEyMywgMHgxMDc4LAorCTB4Mjk2YiwgMHgwMDc4LCAweDM5NWYsIDB4NjgxYiwgMHgwMDE2LCAweDc4YTMsIDB4MDAwMCwgMHg3OWU0LAorCTB4YTE4NCwgMHgwMDMwLCAweDAwNDAsIDB4Mzk1ZiwgMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwMDQwLAorCTB4Mzk1ZiwgMHhhMTg0LCAweDAxMDAsIDB4MDA0MCwgMHgzMTI3LCAweGExODQsIDB4MDAwNywgMHgwMDc5LAorCTB4MzEzOSwgMHgzMTQxLCAweDMxMGYsIDB4MzA4NSwgMHg0MzBkLCAweDQzNTUsIDB4NDM1NSwgMHg0MzBkLAorCTB4NDM0ZiwgMHgxMDc4LCAweDQzMTksIDB4MDA3YywgMHhhMjgyLCAweDAwMDUsIDB4MDA1MCwgMHgzMTRhLAorCTB4MTA3OCwgMHgyOTZiLCAweDIzMDAsIDB4MDA3OSwgMHgzMTRkLCAweDMxNTAsIDB4MzM4MCwgMHgzMzhiLAorCTB4MjIwMCwgMHgwMDc5LCAweDMxNTMsIDB4MzE2ZCwgMHgzMTVhLCAweDMxNmQsIDB4MzE1OCwgMHgzMzYzLAorCTB4MTA3OCwgMHgyOTZiLCAweDc4OWIsIDB4MDAxOCwgMHg3OGE4LCAweGEwODQsIDB4MDBmZiwgMHhhMDgyLAorCTB4MDAyMCwgMHgwMDQ4LCAweDQwYjcsIDB4YTA4YSwgMHgwMDA0LCAweDAwYzgsIDB4NDBiNywgMHgwMDc5LAorCTB4MzE2OSwgMHg0MGI3LCAweDQwYjcsIDB4NDBiNywgMHg0MDYxLCAweDc4OWIsIDB4MDAxOCwgMHg3OWE4LAorCTB4YTE4NCwgMHgwMDgwLCAweDAwNDAsIDB4MzE3ZSwgMHgwMDc4LCAweDQwYjcsIDB4NzAwMCwgMHhhMDA1LAorCTB4MDBjMCwgMHgzMTc0LCAweDIwMTEsIDB4MDAwNCwgMHgwMDc4LCAweDNiNGEsIDB4YTE4NCwgMHgwMGZmLAorCTB4YTA4YSwgMHgwMDEwLCAweDAwYzgsIDB4NDBiNywgMHgwMDc5LCAweDMxODYsIDB4MzE5OCwgMHgzMTk2LAorCTB4MzFhZCwgMHgzMWIxLCAweDMyODQsIDB4NDBiNywgMHg0MGI3LCAweDMyODYsIDB4NDBiNywgMHg0MGI3LAorCTB4MzM1ZiwgMHgzMzVmLCAweDQwYjcsIDB4NDBiNywgMHg0MGI3LCAweDMzNjEsIDB4MTA3OCwgMHgyOTZiLAorCTB4ZDZlNCwgMHgwMDQwLCAweDMxYTMsIDB4MjAwMSwgMHgwMzAwLCAweDgwMDAsIDB4ODAwMCwgMHg3ODNhLAorCTB4NzgxYiwgMHgwMGMzLCAweDAwN2MsIDB4NjgxOCwgMHhkMGZjLCAweDAwNDAsIDB4MzFhYiwgMHg2ODFiLAorCTB4MDAxZCwgMHgwMDc4LCAweDMxOWIsIDB4MDA3OCwgMHg0MzBkLCAweDY4MWIsIDB4MDAxZCwgMHgwMDc4LAorCTB4NDBjMSwgMHg2OTIwLCAweDY5MjIsIDB4YTY4NCwgMHgxODAwLCAweDAwYzAsIDB4MzIxNiwgMHg2ODIwLAorCTB4ZDA4NCwgMHgwMGMwLCAweDMyMWMsIDB4NjgxOCwgMHhhMDg2LCAweDAwMDgsIDB4MDBjMCwgMHgzMWMyLAorCTB4NjgxYiwgMHgwMDAwLCAweGQ2ZDQsIDB4MDA0MCwgMHgzMjgxLCAweGQ2YmMsIDB4MDA0MCwgMHgzMjAyLAorCTB4NzA4NywgMHgwMDAwLCAweDY4MTgsIDB4YTA4NCwgMHgwMDNmLCAweGEwOGEsIDB4MDAwZCwgMHgwMDUwLAorCTB4MzIwMiwgMHhhMDhhLCAweDAwMGMsIDB4NzE4NiwgMHgyMDAxLCAweDAwMGMsIDB4ODAwYywgMHg3MThhLAorCTB4Nzg5YiwgMHgwMDYxLCAweDc4YWEsIDB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4MDE3ZSwgMHgzMjA4LAorCTB4YTE4YywgMHgwMzAwLCAweDAwNDAsIDB4MzFmNCwgMHgwMDdlLCAweDIwMDEsIDB4NGUwNCwgMHgyMDA0LAorCTB4ZDBlYywgMHgwMDdmLCAweDAwNDAsIDB4MzFmMCwgMHgyMGExLCAweDAxMmIsIDB4MDA3OCwgMHgzMWY2LAorCTB4MjBhMSwgMHgwMjJiLCAweDAwNzgsIDB4MzFmNiwgMHgyMGExLCAweDAxMmIsIDB4MDE3ZiwgMHg3ODliLAorCTB4MDAwMCwgMHg4MDAwLCAweDgwYWMsIDB4YWQ4MCwgMHgwMDBiLCAweDIwOTgsIDB4NTNhNiwgMHgxNDdmLAorCTB4MTM3ZiwgMHgxNTdmLCAweDYwMzgsIDB4YTAwNSwgMHgwMGMwLCAweDMyMTEsIDB4NjgxYywgMHhhMDg0LAorCTB4MDAwZSwgMHgwMDQwLCAweDQwYzEsIDB4MTA3OCwgMHg0MGQ3LCAweDc4MmIsIDB4MzAwOCwgMHgwMDc4LAorCTB4MzIxMywgMHg4MDAxLCAweDYwM2EsIDB4NzgxYiwgMHgwMDY3LCAweDAwN2MsIDB4ZDZlNCwgMHgwMDQwLAorCTB4MzIxYywgMHg3ODFiLCAweDAwNzksIDB4MDA3YywgMHhhNjg0LCAweDAwNjAsIDB4MDA0MCwgMHgzMjdlLAorCTB4ZDZkYywgMHgwMDQwLCAweDMyN2UsIDB4ZDZmYywgMHgwMGMwLCAweDMyMjgsIDB4MDA3OCwgMHgzMjNmLAorCTB4YzZmYywgMHg3ZTVhLCAweDZlYjYsIDB4N2FkYywgMHg3OWQ4LCAweDc4ZDAsIDB4ODAxYiwgMHgwMGM4LAorCTB4MzIzMiwgMHg4MDAwLCAweGEwODQsIDB4MDAzZiwgMHhhMTA4LCAweGEyOTEsIDB4MDAwMCwgMHg2Yjk4LAorCTB4MjEwMCwgMHhhMzAyLCAweDY4YjIsIDB4NmI5NCwgMHgyMjAwLCAweGEzMDMsIDB4NjhhZSwgMHhkNmY0LAorCTB4MDA0MCwgMHgzMjQ1LCAweGM2ZjQsIDB4N2U1YSwgMHg2ZWI2LCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLAorCTB4MDBjMCwgMHgzMjUzLCAweDAwN2UsIDB4MTA3OCwgMHg0NTg2LCAweDEwNzgsIDB4NDhiZCwgMHgwMDdmLAorCTB4NzgxYiwgMHgwMDc2LCAweDAwN2MsIDB4YTAwNiwgMHgxMDc4LCAweDQ5YzMsIDB4NmFiMCwgMHg2OWFjLAorCTB4NmM5OCwgMHg2Yjk0LCAweDIyMDAsIDB4YTEwNSwgMHgwMDQwLCAweDMyNjIsIDB4MjIwMCwgMHhhNDIyLAorCTB4MjEwMCwgMHhhMzFiLCAweDZjYWEsIDB4N2NkMiwgMHg3Y2RhLCAweDZiYTYsIDB4N2JkNiwgMHg3YmRlLAorCTB4MjMwMCwgMHhhNDA1LCAweDAwYzAsIDB4MzI3MiwgMHhjNmY1LCAweDdlNWEsIDB4NmViNiwgMHg3ODFiLAorCTB4MDA3NiwgMHgwMDdjLCAweDc4MWIsIDB4MDA3NiwgMHgyMjAwLCAweGExMTUsIDB4MDBjMCwgMHgzMjdiLAorCTB4MTA3OCwgMHg0OGJkLCAweDAwN2MsIDB4MTA3OCwgMHg0OGY1LCAweDAwN2MsIDB4NzgxYiwgMHgwMDc5LAorCTB4MDA3YywgMHg3ODFiLCAweDAwNjcsIDB4MDA3YywgMHgxMDc4LCAweDI5NmIsIDB4MDA3OCwgMHgzMmQyLAorCTB4NjkyMCwgMHhkMWM0LCAweDAwNDAsIDB4MzI5YiwgMHhjMWM0LCAweDY5MjIsIDB4MGM3ZSwgMHg3MDU4LAorCTB4MjA2MCwgMHg2MDAwLCAweGMwZTQsIDB4NjAwMiwgMHg2MDA0LCAweGEwODQsIDB4ZmZmNSwgMHg2MDA2LAorCTB4MGM3ZiwgMHgwMDc4LCAweDMyYzYsIDB4ZDFjYywgMHgwMDQwLCAweDMyYzYsIDB4YzFjYywgMHg2OTIyLAorCTB4MGM3ZSwgMHg3MDU4LCAweDIwNjAsIDB4NjAwMCwgMHhjMGVjLCAweDYwMDIsIDB4NjAwNCwgMHhjMGE0LAorCTB4NjAwNiwgMHgyMDA4LCAweDJjNDgsIDB4MGM3ZiwgMHhkMTljLCAweDAwNDAsIDB4MzJjNiwgMHgxMDc4LAorCTB4NDFmYSwgMHgxMDc4LCAweDNlZjUsIDB4ODhmZiwgMHgwMDQwLCAweDMyYzYsIDB4Nzg5YiwgMHgwMDYwLAorCTB4MjgwMCwgMHg3OGFhLCAweDdlNTgsIDB4YzY5NSwgMHg3ZTVhLCAweGQ2ZDQsIDB4MDBjMCwgMHgzMmMzLAorCTB4NzgxYiwgMHgwMDY0LCAweDAwN2MsIDB4NzgxYiwgMHgwMDc4LCAweDAwN2MsIDB4N2U1OCwgMHhkNmQ0LAorCTB4MDBjMCwgMHgzMmNkLCAweDc4MWIsIDB4MDA2NywgMHgwMDdjLCAweDc4MWIsIDB4MDA3OSwgMHgwMDdjLAorCTB4MDA3OCwgMHg0MGJjLCAweDIwMTksIDB4MDAwMCwgMHg3OTkwLCAweGExOGMsIDB4MDAwNywgMHgwMGMwLAorCTB4MzJlMCwgMHg2ODIwLCAweGEwODQsIDB4MDEwMCwgMHgwMDQwLCAweDMyZDAsIDB4MjAwOSwgMHgwMDA4LAorCTB4Nzg5YiwgMHgwMDEwLCAweDc4YTgsIDB4YTA5NCwgMHgwMGZmLCAweGEyODYsIDB4MDAwMSwgMHgwMGMwLAorCTB4MzJmYywgMHgyMzAwLCAweDdjYTgsIDB4YTQwMCwgMHgyMDE4LCAweGExMDIsIDB4MDA0MCwgMHgzMmY0LAorCTB4MDA0OCwgMHgzMmY0LCAweDAwNzgsIDB4MzJmNiwgMHgwMDc4LCAweDMyODgsIDB4MjRhOCwgMHg3YWE4LAorCTB4MDBmMCwgMHgzMmY2LCAweDAwNzgsIDB4MzJlMiwgMHhhMjg0LCAweDAwZjAsIDB4YTA4NiwgMHgwMDIwLAorCTB4MDBjMCwgMHgzMzUwLCAweDgzMTgsIDB4ODMxOCwgMHgyMzAwLCAweGExMDIsIDB4MDA0MCwgMHgzMzBjLAorCTB4MDA0OCwgMHgzMzBjLCAweDAwNzgsIDB4MzM0ZCwgMHhhMjg2LCAweDAwMjMsIDB4MDA0MCwgMHgzMmQwLAorCTB4NjgxYywgMHhhMDg0LCAweGZmZjEsIDB4NjgxZSwgMHg3ZTU4LCAweGE2ODQsIDB4ZmZmMSwgMHhjMGE1LAorCTB4MjAzMCwgMHg3ZTVhLCAweDYwMDgsIDB4YzBhNSwgMHg2MDBhLCAweDBjN2UsIDB4NzA1OCwgMHgyMDYwLAorCTB4NjAwNCwgMHgyMDA4LCAweDJjNDgsIDB4MGM3ZiwgMHhkMWE0LCAweDAwNDAsIDB4MzMyZCwgMHgxMDc4LAorCTB4NDFmYSwgMHgxMDc4LCAweDQwMTEsIDB4MDA3OCwgMHgzMzNiLCAweDBjN2UsIDB4NzA1OCwgMHgyMDYwLAorCTB4NjAwNCwgMHgyMDA4LCAweDJjNDgsIDB4MGM3ZiwgMHhkMTljLCAweDAwNDAsIDB4MzJjNiwgMHgxMDc4LAorCTB4NDFmYSwgMHgxMDc4LCAweDNlZjUsIDB4ODhmZiwgMHgwMDQwLCAweDMyYzYsIDB4Nzg5YiwgMHgwMDYwLAorCTB4MjgwMCwgMHg3OGFhLCAweGM2OTUsIDB4N2U1YSwgMHhkNmQ0LCAweDAwYzAsIDB4MzM0YSwgMHg3ODFiLAorCTB4MDA2NCwgMHgwMDdjLCAweDc4MWIsIDB4MDA3OCwgMHgwMDdjLCAweDdhYTgsIDB4MDA3OCwgMHgzMmUyLAorCTB4ODMxOCwgMHgyMzAwLCAweGExMDIsIDB4MDA0MCwgMHgzMzU5LCAweDAwNDgsIDB4MzM1OSwgMHgwMDc4LAorCTB4MzJlMiwgMHhhMjg0LCAweDAwODAsIDB4MDBjMCwgMHg0MGMxLCAweDAwNzgsIDB4NDBiYywgMHgwMDc4LAorCTB4NDBjMSwgMHgwMDc4LCAweDQwYjcsIDB4NzA1OCwgMHhhMDRkLCAweDc4OWIsIDB4MDAxOCwgMHg3OGE4LAorCTB4YTA4NCwgMHgwMGZmLCAweGEwOGUsIDB4MDAwMSwgMHgwMDQwLCAweDMzNzAsIDB4MTA3OCwgMHgyOTZiLAorCTB4N2FhOCwgMHhhMjk0LCAweDAwZmYsIDB4NzhhOCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4YSwgMHgwMDA0LAorCTB4MDBjOCwgMHg0MGI3LCAweDAwNzksIDB4MzM3YywgMHg0MGI3LCAweDNlNDYsIDB4NDBiNywgMHgzZmI5LAorCTB4YTI4MiwgMHgwMDAwLCAweDAwYzAsIDB4MzM4NiwgMHgxMDc4LCAweDI5NmIsIDB4MTA3OCwgMHg0MGM4LAorCTB4NzgxYiwgMHgwMDc4LCAweDAwN2MsIDB4YTI4MiwgMHgwMDAzLCAweDAwYzAsIDB4MzM5MSwgMHgxMDc4LAorCTB4Mjk2YiwgMHhkNGZjLCAweDAwYzAsIDB4MzNiMSwgMHg3MDY0LCAweGEwMDUsIDB4MDA0MCwgMHgzMzlhLAorCTB4MTA3OCwgMHgyOTZiLCAweDZmMTQsIDB4Nzc3NiwgMHhhN2JjLCAweDhmMDAsIDB4MTA3OCwgMHg0MWZlLAorCTB4NjAwOCwgMHhhMDg1LCAweDAwMjEsIDB4NjAwYSwgMHg4NzM4LCAweGE3ODQsIDB4MDAxZiwgMHgwMGMwLAorCTB4MzM5ZSwgMHgxMDc4LCAweDQwY2MsIDB4NzA2NywgMHgwMDAyLCAweDcwMWYsIDB4MDAwOSwgMHgwMDc4LAorCTB4MzNiMywgMHgxMDc4LCAweDQwZGIsIDB4NzgxYiwgMHgwMDc4LCAweDAwN2MsIDB4YTI4MiwgMHgwMDA0LAorCTB4MDA1MCwgMHgzM2JjLCAweDEwNzgsIDB4Mjk2YiwgMHgyMzAwLCAweDAwNzksIDB4MzNiZiwgMHgzM2MyLAorCTB4MzU4MiwgMHgzNWM1LCAweGEyODYsIDB4MDAwMywgMHgwMDQwLCAweDMzZmEsIDB4NzIwMCwgMHg3Y2Q4LAorCTB4N2RkYywgMHg3ZmQwLCAweDcxZDQsIDB4ZDFiYywgMHgwMGMwLCAweDMzZjIsIDB4ZDFiNCwgMHgwMDQwLAorCTB4MzNmMiwgMHg3ODY4LCAweGEwODQsIDB4MDBmZiwgMHgwMGMwLCAweDMzZjIsIDB4YTI4MiwgMHgwMDAyLAorCTB4MDBjOCwgMHgzM2YyLCAweDBkN2UsIDB4NzgzYiwgMHg4MzAwLCAweDc4MWIsIDB4MDA0YywgMHg3MGJjLAorCTB4YTA2ZCwgMHg2OGI0LCAweDc4NWEsIDB4Njg5NCwgMHg3OGQ2LCAweDc4ZGUsIDB4Njg5OCwgMHg3OGQyLAorCTB4NzhkYSwgMHhjMWI0LCAweDcxZDYsIDB4NzAwMywgMHgwMDMwLCAweDBkN2YsIDB4MjAwMSwgMHgwMDAwLAorCTB4MDA3OCwgMHgzM2ZlLCAweDc4M2IsIDB4MTMwMCwgMHg3ODFiLCAweDAwNGEsIDB4MjAwMSwgMHgwMDAwLAorCTB4MDA3OCwgMHgzM2ZlLCAweDcyMDAsIDB4N2NkOCwgMHg3ZGRjLCAweDdmZDAsIDB4NzA0YSwgMHg2OGEwLAorCTB4ZDBlYywgMHgwMDQwLCAweDM0MDYsIDB4NjAwOCwgMHhjMDhkLCAweDYwMGEsIDB4YTI4NCwgMHgwMDBmLAorCTB4MDA3OSwgMHgzNDBhLCAweDM1NjIsIDB4MzQxNywgMHgzNDE0LCAweDM2YzgsIDB4Mzc1NCwgMHgyOWM1LAorCTB4MzQxMiwgMHgzNDEyLCAweDEwNzgsIDB4Mjk2YiwgMHg2MDA4LCAweGMwZDQsIDB4NjAwYSwgMHhkNmU0LAorCTB4MDA0MCwgMHgzNDFmLCAweDcwNDgsIDB4YTA4NiwgMHgwMDE0LCAweDAwYzAsIDB4MzQzZiwgMHgxMDc4LAorCTB4NDU4NiwgMHgyMDA5LCAweDAwMDAsIDB4NjgxOCwgMHhkMGZjLCAweDAwNDAsIDB4MzQyOCwgMHg3MDQ4LAorCTB4YTA4NiwgMHgwMDE0LCAweDAwNDAsIDB4MzQzOSwgMHg2ODE4LCAweGEwODYsIDB4MDAwOCwgMHgwMGMwLAorCTB4MzUxYSwgMHg3ODU4LCAweGQwOWMsIDB4MDA0MCwgMHgzNTFhLCAweDY4MjAsIDB4ZDBhYywgMHgwMDQwLAorCTB4MzUxYSwgMHg2ODFiLCAweDAwMTQsIDB4MjAwOSwgMHgwMDAyLCAweDAwNzgsIDB4MzQ3ZSwgMHg3ODY4LAorCTB4YTA4YywgMHgwMGZmLCAweDAwNDAsIDB4MzQ3ZSwgMHhhMTg2LCAweDAwMDgsIDB4MDBjMCwgMHgzNDU1LAorCTB4NjAwOCwgMHhjMGE0LCAweDYwMGEsIDB4MTA3OCwgMHgzZDZmLCAweDAwNDAsIDB4MzQ3ZSwgMHgxMDc4LAorCTB4M2RlZCwgMHgxMDc4LCAweDQ1ODYsIDB4MDA3OCwgMHgzNDY2LCAweGExODYsIDB4MDAyOCwgMHgwMGMwLAorCTB4MzQ3ZSwgMHg2MDE4LCAweGEwMDUsIDB4MDA0MCwgMHgzNDQ4LCAweDgwMDEsIDB4MDA0MCwgMHgzNDQ4LAorCTB4ODAwMSwgMHgwMDQwLCAweDM0NDgsIDB4NjAxZSwgMHgwMDc4LCAweDM0NDgsIDB4NjgyMCwgMHhkMDg0LAorCTB4MDA0MCwgMHgyOWM1LCAweGMwODQsIDB4NjgyMiwgMHgxMDc4LCAweDJhY2MsIDB4NzA1YywgMHgwYzdlLAorCTB4MjA2MCwgMHg2ODAwLCAweDYwMDIsIDB4MGM3ZiwgMHg2MDA0LCAweDY4MDIsIDB4YTAwNSwgMHgyZDAwLAorCTB4MDBjMCwgMHgzNDdiLCAweDYwMDIsIDB4NjAwNiwgMHgwMDc4LCAweDI5YzUsIDB4MDE3ZSwgMHg4MWZmLAorCTB4MDBjMCwgMHgzNGM4LCAweDcwMDAsIDB4YTA4NiwgMHgwMDMwLCAweDAwNDAsIDB4MzRjOCwgMHg3MWQ0LAorCTB4ZDFiYywgMHgwMGMwLCAweDM0YzgsIDB4ZDFiNCwgMHgwMGMwLCAweDM0YWYsIDB4NzA2MCwgMHhhMDA1LAorCTB4MDBjMCwgMHgzNGM4LCAweDcwYTQsIDB4YTA4NiwgMHgwMDAxLCAweDAwNDAsIDB4MzRjOCwgMHg3MDAzLAorCTB4MDAwMCwgMHgwNDdlLCAweDA1N2UsIDB4MDc3ZSwgMHgwNjdlLCAweDBjN2UsIDB4MGQ3ZSwgMHgxMDc4LAorCTB4MjllZSwgMHgwZDdmLCAweDBjN2YsIDB4MDY3ZiwgMHgwNzdmLCAweDA1N2YsIDB4MDQ3ZiwgMHg3MWQ0LAorCTB4ZDFiNCwgMHgwMGMwLCAweDM0YzgsIDB4NzAwMywgMHgwMDQwLCAweDAwNzgsIDB4MzRjOCwgMHgxMDc4LAorCTB4NDM2MCwgMHgwMGMwLCAweDM0YzgsIDB4NzgxYiwgMHgwMDViLCAweDBkN2UsIDB4NzBiYywgMHhhMDZkLAorCTB4NjhiNCwgMHg3ODVhLCAweDY4OTQsIDB4NzhkNiwgMHg3OGRlLCAweDY4OTgsIDB4NzhkMiwgMHg3OGRhLAorCTB4YzFiNCwgMHg3MWQ2LCAweDcwMDMsIDB4MDAzMCwgMHg3ODA4LCAweGMwOGQsIDB4NzgwYSwgMHgwZDdmLAorCTB4MTA3OCwgMHgzNWZmLCAweDAxN2YsIDB4ODFmZiwgMHgwMDQwLCAweDM1MWEsIDB4YTY4NCwgMHhkZjAwLAorCTB4NjgxZSwgMHg2ODJiLCAweDAwMDAsIDB4NmYxNCwgMHhhMTg2LCAweDAwMDIsIDB4MDBjMCwgMHgzNTFiLAorCTB4NjgxOCwgMHhhMDg2LCAweDAwMTQsIDB4MDBjMCwgMHgzNGU0LCAweDIwMDgsIDB4ZDZlNCwgMHgwMDQwLAorCTB4MzRlNCwgMHg3ODY4LCAweGEwOGMsIDB4MDBmZiwgMHgxMDc4LCAweDJhYmEsIDB4MTA3OCwgMHgyYWRiLAorCTB4NjgyMCwgMHhkMGRjLCAweDAwYzAsIDB4MzUxYiwgMHg4NzE3LCAweGEyOTQsIDB4MDAwZiwgMHg4MjEzLAorCTB4ODIxMywgMHg4MjEzLCAweGIyODQsIDB4MDMwMCwgMHgwMDQwLCAweDM0ZmEsIDB4YTI5MCwgMHg1MmMwLAorCTB4MDA3OCwgMHgzNGZjLCAweGEyOTAsIDB4NTM0MCwgMHhhMjkwLCAweDAwMDAsIDB4MjIxYywgMHhkM2M0LAorCTB4MDBjMCwgMHgzNTA0LCAweDAwNzgsIDB4MzUwYSwgMHg4MjEwLCAweDIyMDQsIDB4YTA4NSwgMHgwMDE4LAorCTB4MjAxMiwgMHg4MjExLCAweGQzZDQsIDB4MDA0MCwgMHgzNTE1LCAweDY4YTAsIDB4ZDBjNCwgMHgwMGMwLAorCTB4MzUxNSwgMHgxMDc4LCAweDM2NzksIDB4MDA3OCwgMHgyOWM1LCAweDYwMDgsIDB4YzA4ZCwgMHg2MDBhLAorCTB4MDA3OCwgMHgzNTFiLCAweDY5MmEsIDB4NjkxNiwgMHg2ODE4LCAweGQwZmMsIDB4MDA0MCwgMHgzNTIyLAorCTB4NzA0OCwgMHg2ODFhLCAweGE2OGMsIDB4ZGYwMCwgMHg2OTFlLCAweDY0MTAsIDB4ODRmZiwgMHgwMDQwLAorCTB4MzUzNywgMHgyMDA5LCAweDRlMDIsIDB4MjEwNCwgMHg4MDAxLCAweDIwMGEsIDB4ODQyMSwgMHg2NDEyLAorCTB4MDBjMCwgMHgzNTM3LCAweDIwMjEsIDB4NGUwNCwgMHgyNDA0LCAweGMwYTUsIDB4MjAyMiwgMHg2MDE4LAorCTB4YTAwNSwgMHgwMDQwLCAweDM1M2YsIDB4ODAwMSwgMHg2MDFhLCAweDAwYzAsIDB4MzU0MiwgMHg2MDA4LAorCTB4YzBhNCwgMHg2MDBhLCAweDY4MjAsIDB4ZDA4NCwgMHgwMGMwLCAweDM1NGUsIDB4NjgwMCwgMHhhMDA1LAorCTB4MDBjMCwgMHgzNTRiLCAweDYwMDIsIDB4NjAwNiwgMHgwMDc4LCAweDM1NTIsIDB4NzA1YywgMHgyMDYwLAorCTB4NjgwMCwgMHg2MDAyLCAweDIwNjEsIDB4NGUwMCwgMHg2ODg3LCAweDAxMDMsIDB4MmQwOCwgMHgyMDZiLAorCTB4MDAwMCwgMHg2MDY4LCAweGEwMDUsIDB4NjE2YSwgMHgwMDQwLCAweDM1NjEsIDB4MmQwMiwgMHgwMDc4LAorCTB4MzU2MiwgMHg2MTZlLCAweDcyMDAsIDB4YTI4NiwgMHgwMDMwLCAweDAwNDAsIDB4MzU3MiwgMHhhMjg2LAorCTB4MDA0MCwgMHgwMGMwLCAweDI5YzUsIDB4NzAwMywgMHgwMDAyLCAweDcwNGMsIDB4MjA2OCwgMHg2OGM0LAorCTB4MjA2MCwgMHgwMDdjLCAweDcwMDMsIDB4MDAwMiwgMHg3MGJjLCAweGEwNmQsIDB4NjhiYywgMHg3MDQyLAorCTB4NzBiOCwgMHhhMDY1LCAweDY4YzAsIDB4NzA1YSwgMHgyZDAwLCAweDcwNGUsIDB4YWQ4MCwgMHgwMDA5LAorCTB4NzA0NiwgMHgwMDdjLCAweGEyODIsIDB4MDAwNCwgMHgwMDQ4LCAweDM1ODgsIDB4MTA3OCwgMHgyOTZiLAorCTB4MjIwMCwgMHgwMDc5LCAweDM1OGIsIDB4MzU4ZiwgMHgzNWEwLCAweDM1YWQsIDB4MzVhMCwgMHhhNTg2LAorCTB4MTMwMCwgMHgwMDQwLCAweDM1YTAsIDB4YTU4NiwgMHg4MzAwLCAweDAwYzAsIDB4MzU4NiwgMHg3MDAzLAorCTB4MDAwMCwgMHg2MDE4LCAweDgwMDEsIDB4NjAxYSwgMHg2MDA4LCAweGEwODQsIDB4ZmJlZiwgMHg2MDBhLAorCTB4NzAwMCwgMHhhMDg2LCAweDAwMDUsIDB4MDA0MCwgMHgzNWFhLCAweDEwNzgsIDB4NDBjOCwgMHg3ODFiLAorCTB4MDA3OCwgMHgwMDdjLCAweDc4MWIsIDB4MDA3OSwgMHgwMDdjLCAweDc4OTAsIDB4ODAwNywgMHg4MDAxLAorCTB4YTA4NCwgMHgwMDA3LCAweGEwODAsIDB4MDAxOCwgMHg3ODlhLCAweDc5YTgsIDB4YTE4YywgMHgwMGZmLAorCTB4YTE4NiwgMHgwMDAzLCAweDAwNDAsIDB4MzVjMiwgMHhhMTg2LCAweDAwMDAsIDB4MDA0MCwgMHgzNWMyLAorCTB4MDA3OCwgMHg0MGI3LCAweDc4MWIsIDB4MDA3OSwgMHgwMDdjLCAweDY4MjAsIDB4YzA5NSwgMHg2ODIyLAorCTB4ODJmZiwgMHgwMGMwLCAweDM1Y2YsIDB4MTA3OCwgMHg0MGM4LCAweDAwNzgsIDB4MzVkNiwgMHg4MjExLAorCTB4MDA0MCwgMHgzNWQ0LCAweDEwNzgsIDB4Mjk2YiwgMHgxMDc4LCAweDQwZGIsIDB4NzgxYiwgMHgwMDc4LAorCTB4MDA3YywgMHgxMDc4LCAweDQzODMsIDB4NzgzMCwgMHhhMDg0LCAweDAwYzAsIDB4MDBjMCwgMHgzNWZjLAorCTB4MDE3ZSwgMHgzMjA4LCAweDAwN2UsIDB4MjAwMSwgMHg0ZTA0LCAweDIwMDQsIDB4ZDBlYywgMHgwMDdmLAorCTB4MDA0MCwgMHgzNWVlLCAweGExOGMsIDB4MDMwMCwgMHgwMDc4LCAweDM1ZjAsIDB4YTE4YywgMHgwNDAwLAorCTB4MDE3ZiwgMHgwMDQwLCAweDM1ZjcsIDB4MDAxOCwgMHgzNWZjLCAweDAwNzgsIDB4MzVmOSwgMHgwMDI4LAorCTB4MzVmYywgMHg3OTFhLCAweGEwMDYsIDB4MDA3YywgMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHhhNjg0LAorCTB4MDA2MCwgMHgwMGMwLCAweDM2MDksIDB4NjgyZiwgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHgwMDc4LAorCTB4MzY3OCwgMHhkNmRjLCAweDAwYzAsIDB4MzYyMSwgMHg2OGI0LCAweGQwZGMsIDB4MDBjMCwgMHgzNjIxLAorCTB4Njk5OCwgMHg2YTk0LCAweDY5MmUsIDB4NmEzMiwgMHg3MDQ4LCAweGEwMDUsIDB4MDBjMCwgMHgzNjFlLAorCTB4MjIwMCwgMHhhMTA1LCAweDAwNDAsIDB4NDU4NiwgMHg3MDRiLCAweDAwMTUsIDB4MDA3OCwgMHg0NTg2LAorCTB4MDA3YywgMHhkNmFjLCAweDAwNDAsIDB4MzY0NywgMHhkNmY0LCAweDAwNDAsIDB4MzYyZCwgMHg2ODJmLAorCTB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4MDA3OCwgMHg0NTg2LCAweDY4YjQsIDB4YTA4NCwgMHg0MDAwLAorCTB4YTYzNSwgMHhkNmY0LCAweDAwYzAsIDB4MzYyNywgMHg3MDQ4LCAweGEwMDUsIDB4MDBjMCwgMHgzNjNhLAorCTB4NzA0YiwgMHgwMDE1LCAweGQ2ZGMsIDB4MDBjMCwgMHgzNjQzLCAweDY4YjQsIDB4ZDBkYywgMHgwMDQwLAorCTB4MzY0MywgMHg2Y2E4LCAweDZkYTQsIDB4NmMyZSwgMHg2ZDMyLCAweDAwNzgsIDB4NDU4NiwgMHhkNmY0LAorCTB4MDA0MCwgMHgzNjUwLCAweDY4MmYsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4MDA3OCwgMHg0NTg2LAorCTB4NjhiNCwgMHhhMDg0LCAweDQ4MDAsIDB4YTYzNSwgMHhkNmY0LCAweDAwYzAsIDB4MzY0YSwgMHg3MDQ4LAorCTB4YTAwNSwgMHgwMGMwLCAweDM2NWQsIDB4NzA0YiwgMHgwMDE1LCAweDI0MDgsIDB4MjUxMCwgMHgyNzAwLAorCTB4ODBmYiwgMHgwMGM4LCAweDM2NjQsIDB4ODAwMCwgMHhhMDg0LCAweDAwM2YsIDB4YTEwOCwgMHhhMjkxLAorCTB4MDAwMCwgMHg2OTJlLCAweDZhMzIsIDB4MjEwMCwgMHhhMjA1LCAweDAwYzAsIDB4MzY3MSwgMHgwMDc4LAorCTB4NDU4NiwgMHg3MDAwLCAweGEwODYsIDB4MDAwNiwgMHgwMDQwLCAweDM2NzgsIDB4MDA3OCwgMHg0NTg2LAorCTB4MDA3YywgMHg2OTQ2LCAweDYwMDgsIDB4YzBjZCwgMHhkM2NjLCAweDAwNDAsIDB4MzY4MCwgMHhjMDhkLAorCTB4NjAwYSwgMHg2ODE4LCAweDY4M2EsIDB4NjgxYiwgMHgwMDA2LCAweDY4OGYsIDB4MDAwMCwgMHg2ODkzLAorCTB4MDAwMCwgMHg2YTMwLCAweDY5MmMsIDB4NmEzZSwgMHg2OTQyLCAweDY4MmYsIDB4MDAwMywgMHg2ODMzLAorCTB4MDAwMCwgMHg2ODM3LCAweDAwMjAsIDB4Njg5NywgMHgwMDAwLCAweDY4OWIsIDB4MDAyMCwgMHg3MDAwLAorCTB4MDA3OSwgMHgzNjlhLCAweDI5YzUsIDB4MzZhYywgMHgzNmE0LCAweDM2YTIsIDB4MzZhMiwgMHgzNmEyLAorCTB4MzZhMiwgMHgzNmEyLCAweDEwNzgsIDB4Mjk2YiwgMHg2ODIwLCAweGQwODQsIDB4MDBjMCwgMHgzNmFjLAorCTB4MTA3OCwgMHgzZGQwLCAweDAwNzgsIDB4MzZiMiwgMHg3MDVjLCAweDJjNTAsIDB4MjA2MCwgMHg2ODAwLAorCTB4NjAwMiwgMHgyYTYwLCAweDMyMDgsIDB4YTE4YywgMHgwMzAwLCAweDAwNDAsIDB4MzZiYiwgMHgyMDIxLAorCTB4NGU1OCwgMHgwMDc4LCAweDM2YmQsIDB4MjAyMSwgMHg0ZTk4LCAweDI0MDQsIDB4YTAwNSwgMHgwMDQwLAorCTB4MzZjNCwgMHgyMDIwLCAweDAwNzgsIDB4MzZiZCwgMHgyZDIyLCAweDIwNmIsIDB4MDAwMCwgMHgwMDdjLAorCTB4MTA3OCwgMHgzZGQ3LCAweDEwNzgsIDB4M2RlZCwgMHg2MDA4LCAweGMwY2MsIDB4NjAwYSwgMHg2ODJiLAorCTB4MDAwMCwgMHg3ODliLCAweDAwMGUsIDB4NmYxNCwgMHg2OTM4LCAweDY5MWEsIDB4Njk0NCwgMHg2OTE2LAorCTB4MzIwOCwgMHhhMThjLCAweDAzMDAsIDB4MDA0MCwgMHgzNmUxLCAweDIwMDksIDB4MDAwMCwgMHgwMDc4LAorCTB4MzZlMywgMHgyMDA5LCAweDAwMDEsIDB4MTA3OCwgMHg0OWY4LCAweGQ2ZGMsIDB4MDA0MCwgMHgzNmViLAorCTB4NjkxYywgMHhjMWVkLCAweDY5MWUsIDB4NjgxOCwgMHhkMGZjLCAweDAwNDAsIDB4MzZmYSwgMHg3ODY4LAorCTB4YTA4YywgMHgwMGZmLCAweDAwNDAsIDB4MzZmOCwgMHg2ODFiLCAweDAwMWUsIDB4MDA3OCwgMHgzNmZhLAorCTB4NjgxYiwgMHgwMDAwLCAweGIyODQsIDB4MDMwMCwgMHgwMGMwLCAweDM3MDIsIDB4MjAyMSwgMHg0ZTk4LAorCTB4MDA3OCwgMHgzNzA0LCAweDIwMjEsIDB4NGU1OCwgMHg2ODAwLCAweDIwMjIsIDB4NmEzYywgMHg2OTQwLAorCTB4NmEzMiwgMHg2OTJlLCAweDY4YzAsIDB4MjA2MCwgMHg2MDAwLCAweGQwYTQsIDB4MDA0MCwgMHgzNzQ0LAorCTB4MjA0MSwgMHgwMDIxLCAweDIwNDksIDB4MDAwNSwgMHgyMDUxLCAweDAwMjAsIDB4MGQ3ZSwgMHgwZjdlLAorCTB4MTU3ZSwgMHgxNDdlLCAweDIwNzksIDB4NGUwMCwgMHgxMDc4LCAweDFkZmYsIDB4MTQ3ZiwgMHgxNTdmLAorCTB4MGY3ZiwgMHg3MGNjLCAweDIwMTAsIDB4MjAwOSwgMHgwMTAxLCAweDAyN2UsIDB4MjIwNCwgMHhhMDZkLAorCTB4MDA0MCwgMHgzNzM0LCAweDY4MTQsIDB4YTcwNiwgMHgwMDQwLCAweDM3MzEsIDB4NjgwMCwgMHgwMDc4LAorCTB4MzcyNywgMHg2ODIwLCAweGMwZDUsIDB4NjgyMiwgMHgwMjdmLCAweDgyMTAsIDB4ODEwOSwgMHgwMGMwLAorCTB4MzcyNSwgMHgwZDdmLCAweDcwNjcsIDB4MDAwMywgMHg3MDdmLCAweDAwMDAsIDB4Nzc3NiwgMHg3MDgzLAorCTB4MDAwZiwgMHg3MWQ0LCAweGMxZGMsIDB4NzFkNiwgMHg2ODE4LCAweGEwODYsIDB4MDAwMiwgMHgwMGMwLAorCTB4Mzc1MCwgMHg2ODE3LCAweDAwMDAsIDB4NjgyYiwgMHgwMDAwLCAweDY4MWMsIDB4YzBlYywgMHg2ODFlLAorCTB4MTA3OCwgMHgyMDJjLCAweDAwNzgsIDB4MjljNSwgMHg3Y2Q4LCAweDdkZGMsIDB4N2ZkMCwgMHgxMDc4LAorCTB4MzVmZiwgMHg2ODJiLCAweDAwMDAsIDB4Nzg5YiwgMHgwMDBlLCAweDZmMTQsIDB4MTA3OCwgMHg0Mzg3LAorCTB4YTA4YywgMHgwMGZmLCAweDY5MTYsIDB4NjgxOCwgMHhkMGZjLCAweDAwNDAsIDB4Mzc2OSwgMHg3MDQ4LAorCTB4NjgxYSwgMHhhNjhjLCAweGRmMDAsIDB4NjkxZSwgMHg3MDY3LCAweDAwMDAsIDB4MDA3OCwgMHgyOWM1LAorCTB4NzAwMCwgMHhhMDA1LCAweDAwYzAsIDB4Mzc3NiwgMHgwMDc4LCAweDI5YzUsIDB4YTAwNiwgMHgxMDc4LAorCTB4NDU4NiwgMHg2OTIwLCAweGQxYWMsIDB4MDBjMCwgMHgzNzdmLCAweDY4MWIsIDB4MDAxNCwgMHhhNjhjLAorCTB4ZGYwMCwgMHg2OTFlLCAweDY4MmIsIDB4MDAwMCwgMHg2ODIwLCAweGEwODQsIDB4MDBmZiwgMHg2ODIyLAorCTB4NzAwMCwgMHgwMDc5LCAweDM3OGIsIDB4MjljNSwgMHgzNzk1LCAweDM3OTUsIDB4Mzc5OCwgMHgzNzk4LAorCTB4Mzc5OCwgMHgzNzkzLCAweDM3OTMsIDB4MTA3OCwgMHgyOTZiLCAweDY4MTgsIDB4MDA3OCwgMHgzM2ZhLAorCTB4NjAwOCwgMHhjMGE0LCAweDYwMGEsIDB4NjgxNywgMHgwMDAwLCAweDAwNzgsIDB4M2Q5NSwgMHgyMzAwLAorCTB4MDA3OSwgMHgzN2EyLCAweDM3YTUsIDB4MzdhNywgMHgzODE3LCAweDEwNzgsIDB4Mjk2YiwgMHhkNmZjLAorCTB4MDBjMCwgMHgzN2ZlLCAweDcwMDAsIDB4YTAwZCwgMHgwMDc5LCAweDM3YWUsIDB4MjljNSwgMHgzN2I4LAorCTB4MzdiOCwgMHgzN2U4LCAweDM3YjgsIDB4MzdmYiwgMHgzN2I2LCAweDM3YjYsIDB4MTA3OCwgMHgyOTZiLAorCTB4YTY4NCwgMHgwMDYwLCAweDAwNDAsIDB4MzdlOCwgMHhhMDg2LCAweDAwNjAsIDB4MDBjMCwgMHgzN2U1LAorCTB4YzZhYywgMHhjNmY0LCAweGM2ZWQsIDB4N2U1YSwgMHg2ZWI2LCAweDY4MWMsIDB4YzBhYywgMHg2ODFlLAorCTB4YTE4NiwgMHgwMDAyLCAweDAwNDAsIDB4MzdkNywgMHgxMDc4LCAweDQ1ODYsIDB4NjlhYywgMHg2OGIwLAorCTB4YTExNSwgMHgwMDQwLCAweDM3ZDcsIDB4MTA3OCwgMHg0OGY1LCAweDAwNzgsIDB4MzdkOSwgMHgxMDc4LAorCTB4NDhiZCwgMHg3ODFiLCAweDAwNzksIDB4NzFkNCwgMHhkMWI0LCAweDAwYzAsIDB4MjljMSwgMHg3MGE0LAorCTB4YTA4NiwgMHgwMDAxLCAweDAwYzAsIDB4MmEwYiwgMHgwMDdjLCAweGQ2ZWMsIDB4MDA0MCwgMHgzN2MyLAorCTB4NjgxOCwgMHhkMGZjLCAweDAwNDAsIDB4MzdmYiwgMHhkNmY0LCAweDAwYzAsIDB4MzdmNSwgMHg2ODFiLAorCTB4MDAxNSwgMHg3ODFiLCAweDAwNzksIDB4MDA3OCwgMHgyOWMxLCAweDY4MWIsIDB4MDAwNywgMHg2ODJmLAorCTB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4MTA3OCwgMHg0MzE5LCAweDAwN2MsIDB4YzZmYywgMHg3ZTVhLAorCTB4N2FkYywgMHg3OWQ4LCAweDc4ZDAsIDB4ODAxYiwgMHgwMGM4LCAweDM4MDcsIDB4ODAwMCwgMHhhMDg0LAorCTB4MDAzZiwgMHhhMTA4LCAweGEyOTEsIDB4MDAwMCwgMHg2Yjk4LCAweDIxMDAsIDB4YTMwMiwgMHg2OGIyLAorCTB4NmI5NCwgMHgyMjAwLCAweGEzMDMsIDB4NjhhZSwgMHg3ODFiLCAweDAwNzksIDB4MDA3YywgMHgxMDc4LAorCTB4Mjk2YiwgMHgyMzAwLCAweDAwNzksIDB4MzgxYywgMHgzODIxLCAweDM4NDYsIDB4MzhhNiwgMHgxMDc4LAorCTB4Mjk2YiwgMHg3MDAwLCAweDAwNzksIDB4MzgyNCwgMHgzODJjLCAweDM4MmUsIDB4MzgzNywgMHgzODJjLAorCTB4MzgyYywgMHgzODJjLCAweDM4MmMsIDB4MzgyYywgMHgxMDc4LCAweDI5NmIsIDB4NjlhYywgMHg2OGIwLAorCTB4YTExNSwgMHgwMDQwLCAweDM4MzcsIDB4MTA3OCwgMHg0OGY1LCAweDAwNzgsIDB4MzgzOSwgMHgxMDc4LAorCTB4NDhiZCwgMHg2ODFjLCAweGMwYjQsIDB4NjgxZSwgMHg3MGQ0LCAweGQwYjQsIDB4MDBjMCwgMHgyOWMxLAorCTB4NzBhNCwgMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHgyYTBiLCAweDAwN2MsIDB4ZDZmYywgMHgwMGMwLAorCTB4Mzg5NiwgMHg3MDAwLCAweGEwMGQsIDB4MDA3OSwgMHgzODRkLCAweDI5YzUsIDB4Mzg1ZCwgMHgzODU3LAorCTB4Mzg4ZCwgMHgzODVkLCAweDM4OTMsIDB4Mzg1NSwgMHgzODU1LCAweDEwNzgsIDB4Mjk2YiwgMHg2ODk0LAorCTB4NzhkNiwgMHg3OGRlLCAweDY4OTgsIDB4NzhkMiwgMHg3OGRhLCAweGE2ODQsIDB4MDA2MCwgMHgwMDQwLAorCTB4Mzg4ZCwgMHhhMDg2LCAweDAwNjAsIDB4MDBjMCwgMHgzODhhLCAweGE2YjQsIDB4YmZiZiwgMHhjNmVkLAorCTB4N2U1YSwgMHg2ZWI2LCAweGExODYsIDB4MDAwMiwgMHgwMDQwLCAweDM4NzksIDB4MTA3OCwgMHg0NTg2LAorCTB4NjlhYywgMHg2OGIwLCAweGExMTUsIDB4MDA0MCwgMHgzODc5LCAweDEwNzgsIDB4NDhmNSwgMHgwMDc4LAorCTB4Mzg3YiwgMHgxMDc4LCAweDQ4YmQsIDB4NzgxYiwgMHgwMDc5LCAweDY4MWMsIDB4YzBiNCwgMHg2ODFlLAorCTB4NzFkNCwgMHhkMWI0LCAweDAwYzAsIDB4MjljMSwgMHg3MGE0LCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLAorCTB4MmEwYiwgMHgwMDdjLCAweGQ2ZWMsIDB4MDA0MCwgMHgzODY3LCAweDY4MTgsIDB4ZDBmYywgMHgwMDQwLAorCTB4Mzg5MywgMHg2ODFiLCAweDAwMDcsIDB4NzgxYiwgMHgwMGY5LCAweDAwN2MsIDB4YzZmYywgMHg3ZTVhLAorCTB4N2FkYywgMHg3OWQ4LCAweDZiOTgsIDB4MjEwMCwgMHhhMzAyLCAweDY4YjIsIDB4NmI5NCwgMHgyMjAwLAorCTB4YTMwMywgMHg2OGFlLCAweDc5ZDIsIDB4NzgxYiwgMHgwMDc5LCAweDAwN2MsIDB4ZDZkYywgMHgwMDQwLAorCTB4MzhhZiwgMHg3ODJiLCAweDMwMDksIDB4NzgxYiwgMHgwMDc5LCAweDAwNzgsIDB4MjljMSwgMHg3ODg0LAorCTB4YzBhYywgMHg3ODg2LCAweDc4ZTQsIDB4YTA4NCwgMHgwMDA4LCAweDAwYzAsIDB4MzhjMiwgMHhhNDg0LAorCTB4MDIwMCwgMHgwMDQwLCAweDM4YmMsIDB4YzZmNSwgMHhjNmRkLCAweDdlNWEsIDB4NzgxYiwgMHgwMDc5LAorCTB4MDA3OCwgMHgyOWMxLCAweDY4MjAsIDB4YzA5NSwgMHg2ODIyLCAweDEwNzgsIDB4NDI5MiwgMHhjNmRkLAorCTB4MTA3OCwgMHg0MGM4LCAweDc4MWIsIDB4MDA3OCwgMHgwMDc4LCAweDI5YzEsIDB4MjMwMCwgMHgwMDc5LAorCTB4MzhkMSwgMHgzOGQ0LCAweDM4ZDYsIDB4MzhkOCwgMHgxMDc4LCAweDI5NmIsIDB4MDA3OCwgMHg0MGMxLAorCTB4ZDZkNCwgMHgwMGMwLCAweDM5MTMsIDB4NzllNCwgMHhkMWFjLCAweDAwNDAsIDB4MzhlNiwgMHg3OGVjLAorCTB4YTA4NCwgMHgwMDAzLCAweDAwNDAsIDB4MzhlNiwgMHg3ODJiLCAweDMwMDksIDB4Nzg5YiwgMHgwMDYwLAorCTB4NzhhYiwgMHgwMDAwLCAweGE2ODQsIDB4ZmZmYiwgMHg3ODVhLCAweDc5ZTQsIDB4ZDFhYywgMHgwMDQwLAorCTB4MzhmNiwgMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwMGMwLCAweDM5MGYsIDB4MjAwMSwgMHg0ZTA0LAorCTB4MjAwNCwgMHhkMGU0LCAweDAwYzAsIDB4MzkwYiwgMHg2ODIwLCAweGQwYzQsIDB4MDA0MCwgMHgzOTBiLAorCTB4MGM3ZSwgMHg3MDU4LCAweDIwNjAsIDB4NjAwNCwgMHhjMDlkLCAweDYwMDYsIDB4NjAwOCwgMHhhMDg0LAorCTB4MDBmZiwgMHg2MDBhLCAweDBjN2YsIDB4MjAwMSwgMHgwMDE0LCAweDAwNzgsIDB4MzNmYSwgMHhhMTg0LAorCTB4MDAwNywgMHgwMDc5LCAweDM5NDksIDB4N2E5MCwgMHhhMjk0LCAweDAwMDcsIDB4Nzg5YiwgMHgwMDYwLAorCTB4NzlhOCwgMHg4MWZmLCAweDAwNDAsIDB4Mzk0NywgMHg3ODliLCAweDAwMTAsIDB4N2JhOCwgMHhhMzg0LAorCTB4MDAwMSwgMHgwMGMwLCAweDM5M2EsIDB4N2JhOCwgMHg3YmE4LCAweGEzODYsIDB4MDAwMSwgMHgwMGMwLAorCTB4MzkyZCwgMHgyMDA5LCAweGZmZjcsIDB4MDA3OCwgMHgzOTMzLCAweGEzODYsIDB4MDAwMywgMHgwMGMwLAorCTB4MzkzYSwgMHgyMDA5LCAweGZmZWYsIDB4MGM3ZSwgMHg3MDU4LCAweDIwNjAsIDB4NjAwNCwgMHhhMTA0LAorCTB4NjAwNiwgMHgwYzdmLCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLCAweDAwMDAsIDB4YTY4NCwgMHhmZmZiLAorCTB4Nzg1YSwgMHg3ODJiLCAweDMwMDksIDB4NjkyMCwgMHhhMThjLCAweGZjZmYsIDB4NjkyMiwgMHgwMDc4LAorCTB4NDMwZCwgMHgzMDkwLCAweDMwOWEsIDB4Mzk1MywgMHgzOTU5LCAweDM5NTEsIDB4Mzk1MSwgMHg0MzBkLAorCTB4NDMwZCwgMHgxMDc4LCAweDI5NmIsIDB4NjkyMCwgMHhhMThjLCAweGZjZmYsIDB4NjkyMiwgMHgwMDc4LAorCTB4NDMxMywgMHg2OTIwLCAweGExOGMsIDB4ZmNmZiwgMHg2OTIyLCAweDAwNzgsIDB4NDMwZCwgMHg3OWU0LAorCTB4YTE4NCwgMHgwMDMwLCAweDAwNDAsIDB4Mzk2OSwgMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwMGMwLAorCTB4Mzk5ZCwgMHg3MDAwLCAweGEwODYsIDB4MDAwNCwgMHgwMGMwLCAweDM5ODMsIDB4NzA2NCwgMHhhMDg2LAorCTB4MDAwMiwgMHgwMGMwLCAweDM5NzksIDB4MjAxMSwgMHgwMDAyLCAweDIwMTksIDB4MDAwMCwgMHgwMDc4LAorCTB4MmYxYywgMHg3MDY0LCAweGEwODYsIDB4MDAwNiwgMHgwMDQwLCAweDM5NzMsIDB4NzA2NCwgMHhhMDg2LAorCTB4MDAwNCwgMHgwMDQwLCAweDM5NzMsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwgMHgyOWMxLAorCTB4NjkyMCwgMHhhMTg0LCAweDA0MjAsIDB4MDA0MCwgMHgzOTkyLCAweGMxZDQsIDB4NjkyMiwgMHg2ODE4LAorCTB4MDA3OCwgMHgzM2ZhLCAweDY4MTgsIDB4YTA4ZSwgMHgwMDAyLCAweDAwNDAsIDB4Mzk5YiwgMHhjMGZkLAorCTB4NjgxYSwgMHgyMDAxLCAweDAwMTQsIDB4MDA3OCwgMHgzM2ZhLCAweGExODQsIDB4MDAwNywgMHgwMDc5LAorCTB4MzlhMSwgMHg0MzBkLCAweDQzMGQsIDB4MzlhOSwgMHg0MzBkLCAweDQzNTUsIDB4NDM1NSwgMHg0MzBkLAorCTB4NDMwZCwgMHhkNmJjLCAweDAwNDAsIDB4MzllYiwgMHg3MTg0LCAweDgxZmYsIDB4MDA0MCwgMHgzOWViLAorCTB4YTE4MiwgMHgwMDBkLCAweDAwZDAsIDB4MzliOCwgMHg3MDg3LCAweDAwMDAsIDB4MDA3OCwgMHgzOWJkLAorCTB4YTE4MiwgMHgwMDBjLCAweDcwODYsIDB4MjAwOSwgMHgwMDBjLCAweDc4OWIsIDB4MDA2MSwgMHg3OWFhLAorCTB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4NzA4OCwgMHg4MTE0LCAweGEyMTAsIDB4NzI4YSwgMHhhMDgwLAorCTB4MDAwYiwgMHhhZDAwLCAweDIwOTgsIDB4YjI4NCwgMHgwMzAwLCAweDAwNDAsIDB4MzlkZiwgMHgwMDdlLAorCTB4MjAwMSwgMHg0ZTA0LCAweDIwMDQsIDB4ZDBlYywgMHgwMDdmLCAweDAwNDAsIDB4MzlkYiwgMHgyMGExLAorCTB4MDEyYiwgMHgwMDc4LCAweDM5ZTEsIDB4MjBhMSwgMHgwMjJiLCAweDAwNzgsIDB4MzllMSwgMHgyMGExLAorCTB4MDEyYiwgMHg3ODliLCAweDAwMDAsIDB4ODEwOCwgMHg4MWFjLCAweDUzYTYsIDB4MTQ3ZiwgMHgxMzdmLAorCTB4MTU3ZiwgMHgwMDc4LCAweDQzMTMsIDB4ZDZkNCwgMHgwMGMwLCAweDNhM2YsIDB4NjgyMCwgMHhkMDg0LAorCTB4MDA0MCwgMHg0MzEzLCAweGE2OGMsIDB4MDA2MCwgMHhhNjg0LCAweDAwNjAsIDB4MDA0MCwgMHgzOWZkLAorCTB4YTA4NiwgMHgwMDYwLCAweDAwYzAsIDB4MzlmZCwgMHhjMWY1LCAweGMxOTQsIDB4Nzk1YSwgMHg2OWI2LAorCTB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwMCwgMHg3ODliLCAweDAwNjEsIDB4NjgxOCwgMHhjMGZkLAorCTB4NjgxYSwgMHg3OGFhLCAweDgwMDgsIDB4ODEwYywgMHgwMDQwLCAweDNlMDYsIDB4YTE4YywgMHgwMGY4LAorCTB4MDBjMCwgMHgzZTA2LCAweDE1N2UsIDB4MTM3ZSwgMHgxNDdlLCAweDAxN2UsIDB4MzIwOCwgMHhhMThjLAorCTB4MDMwMCwgMHgwMDQwLCAweDNhMmIsIDB4MDA3ZSwgMHgyMDAxLCAweDRlMDQsIDB4MjAwNCwgMHhkMGVjLAorCTB4MDA3ZiwgMHgwMDQwLCAweDNhMjcsIDB4MjBhMSwgMHgwMTJiLCAweDAwNzgsIDB4M2EyZCwgMHgyMGExLAorCTB4MDIyYiwgMHgwMDc4LCAweDNhMmQsIDB4MjBhMSwgMHgwMTJiLCAweDAxN2YsIDB4Nzg5YiwgMHgwMDAwLAorCTB4ODAwMCwgMHg4MGFjLCAweGFkODAsIDB4MDAwYiwgMHgyMDk4LCAweDUzYTYsIDB4MTQ3ZiwgMHgxMzdmLAorCTB4MTU3ZiwgMHg2ODE0LCAweGMwZmMsIDB4ODAwNywgMHg3ODgyLCAweDAwNzgsIDB4NDMxMywgMHg2ODE4LAorCTB4ZDBmYywgMHgwMDQwLCAweDNhNDUsIDB4NjgxYiwgMHgwMDA4LCAweDY4MjAsIDB4YzBhZCwgMHg2ODIyLAorCTB4MTA3OCwgMHg0MGQwLCAweDc4MWIsIDB4MDBlYSwgMHgwMDdjLCAweDIzMDAsIDB4MDA3OSwgMHgzYTUwLAorCTB4M2E1NSwgMHgzYjJkLCAweDNhNTMsIDB4MTA3OCwgMHgyOTZiLCAweDdjZDgsIDB4N2RkYywgMHg3ZmQwLAorCTB4ODJmZiwgMHgwMGMwLCAweDNhN2UsIDB4NzIwMCwgMHhhMjg2LCAweDAwMDMsIDB4MDA0MCwgMHgzM2M3LAorCTB4NzFkNCwgMHhkMWJjLCAweDAwYzAsIDB4M2E4MSwgMHhkMWI0LCAweDAwNDAsIDB4M2E4MSwgMHgwZDdlLAorCTB4NzgzYiwgMHg4ODAwLCAweDc4MWIsIDB4MDA0YywgMHg3MGJjLCAweGEwNmQsIDB4NjhiNCwgMHhjMGE1LAorCTB4Nzg1YSwgMHg2ODk0LCAweDc4ZDYsIDB4NzhkZSwgMHg2ODk4LCAweDc4ZDIsIDB4NzhkYSwgMHhjMWI0LAorCTB4NzFkNiwgMHg3MDAzLCAweDAwMzAsIDB4MGQ3ZiwgMHgwMDc4LCAweDNhODUsIDB4NzIwMCwgMHgwMDc4LAorCTB4M2E4NSwgMHg3ODNiLCAweDE4MDAsIDB4NzgxYiwgMHgwMDRhLCAweGEyODQsIDB4MDAwZiwgMHgwMDc5LAorCTB4M2E4OSwgMHgzYjE4LCAweDNhYzcsIDB4M2E5MywgMHgzM2Y2LCAweDNhOTEsIDB4M2IxOCwgMHgzYTkxLAorCTB4M2E5MSwgMHgxMDc4LCAweDI5NmIsIDB4NjgxYywgMHhkMGVjLCAweDAwNDAsIDB4M2E5YSwgMHg2MDA4LAorCTB4YzA4ZCwgMHg2MDBhLCAweDY5MjAsIDB4YzE4NSwgMHg2OTIyLCAweDY4MDAsIDB4NjAwNiwgMHhhMDA1LAorCTB4MDBjMCwgMHgzYWEzLCAweDYwMDIsIDB4NjAwOCwgMHhjMGQ0LCAweDYwMGEsIDB4NjgxYywgMHhhMDg0LAorCTB4MDAwZSwgMHgwMGMwLCAweDNhYjcsIDB4YjI4NCwgMHgwMzAwLCAweDAwNDAsIDB4M2FiMywgMHgyMDA5LAorCTB4OTRjMCwgMHgwMDc4LCAweDNhYmMsIDB4MjAwOSwgMHg5NWQwLCAweDAwNzgsIDB4M2FiYywgMHg3MDMwLAorCTB4NjhiYSwgMHg3MTQwLCAweDcwY2MsIDB4YTEwOCwgMHgyMTA0LCAweDY4MDIsIDB4MmQwYSwgMHg3MTVlLAorCTB4ZDZkYywgMHgwMGMwLCAweDNhYzcsIDB4YzZmYywgMHg2ZWI2LCAweDAwNzgsIDB4M2IxOCwgMHg2ZWI2LAorCTB4YTY4NCwgMHgwMDYwLCAweDAwYzAsIDB4M2FkMSwgMHhhNjg0LCAweDdmZmYsIDB4NjhiNiwgMHgwMDc4LAorCTB4M2IxOCwgMHhkNmRjLCAweDAwYzAsIDB4M2FkZiwgMHhhNjg0LCAweDdmZmYsIDB4NjhiNiwgMHg2ODk0LAorCTB4NjhhNiwgMHg2ODk4LCAweDY4YWEsIDB4MTA3OCwgMHg0NTg2LCAweDAwNzgsIDB4M2IxOCwgMHhkNmFjLAorCTB4MDA0MCwgMHgzYWViLCAweGEwMDYsIDB4MTA3OCwgMHg0NTg2LCAweDI0MDgsIDB4MjUxMCwgMHg2OWFhLAorCTB4NmFhNiwgMHgwMDc4LCAweDNhZmIsIDB4MjQwOCwgMHgyNTEwLCAweDI3MDAsIDB4ODAxYiwgMHgwMGM4LAorCTB4M2FmMiwgMHg4MDAwLCAweGEwODQsIDB4MDAzZiwgMHhhMTA4LCAweGEyOTEsIDB4MDAwMCwgMHg2OWFhLAorCTB4NmFhNiwgMHgxMDc4LCAweDQ1ODYsIDB4ZDZmYywgMHgwMDQwLCAweDNiMTgsIDB4YTY4NCwgMHg3ZmZmLAorCTB4NjhiNiwgMHgyNTEwLCAweDI0MDgsIDB4ZDZhYywgMHgwMGMwLCAweDNiMTAsIDB4MjcwMCwgMHg4MDFiLAorCTB4MDBjOCwgMHgzYjBiLCAweDgwMDAsIDB4YTA4NCwgMHgwMDNmLCAweGExMDgsIDB4YTI5MSwgMHgwMDAwLAorCTB4NmI5OCwgMHgyMTAwLCAweGEzMDIsIDB4NjhiMiwgMHg2Yjk0LCAweDIyMDAsIDB4YTMwMywgMHg2OGFlLAorCTB4NzAwMCwgMHhhMDg2LCAweDAwMzAsIDB4MDBjMCwgMHgyOWM1LCAweDcwMDMsIDB4MDAwMiwgMHg3MGJjLAorCTB4YTA2ZCwgMHg2OGJjLCAweDcwNDIsIDB4NzBiOCwgMHhhMDY1LCAweDY4YzAsIDB4NzA1YSwgMHgyZDAwLAorCTB4NzA0ZSwgMHhhZDgwLCAweDAwMDksIDB4NzA0NiwgMHgwMDdjLCAweGE1ODYsIDB4ODgwMCwgMHgwMGMwLAorCTB4M2IzYSwgMHg3MDAzLCAweDAwMDAsIDB4NjAxOCwgMHg4MDAxLCAweDYwMWEsIDB4NjAwOCwgMHhhMDg0LAorCTB4ZmJlZiwgMHg2MDBhLCAweDAwNzgsIDB4NDBjMSwgMHg3MDQ3LCAweDAwMDAsIDB4YTI4MiwgMHgwMDA2LAorCTB4MDA1MCwgMHgzYjQ0LCAweDEwNzgsIDB4Mjk2YiwgMHgyMzAwLCAweDAwNzksIDB4M2I0NywgMHgzYjRhLAorCTB4M2I1YywgMHgzYjY4LCAweDIyMDAsIDB4MDA3OSwgMHgzYjRkLCAweDNiNTMsIDB4NDBjMSwgMHgzYjU1LAorCTB4M2I1MywgMHgzYmEyLCAweDNiZjcsIDB4MTA3OCwgMHgyOTZiLCAweDdhODAsIDB4YTI5NCwgMHgwZjAwLAorCTB4MTA3OCwgMHgzYzgxLCAweDAwNzgsIDB4NDBiNywgMHgxMDc4LCAweDNiNzksIDB4MDA3OSwgMHgzYjYwLAorCTB4NDBjMSwgMHgzYjY2LCAweDNiNjYsIDB4M2JhMiwgMHgzYjY2LCAweDQwYzEsIDB4MTA3OCwgMHgyOTZiLAorCTB4MTA3OCwgMHgzYjc5LCAweDAwNzksIDB4M2I2YywgMHgzYjc0LCAweDNiNzIsIDB4M2I3MiwgMHgzYjc0LAorCTB4M2I3MiwgMHgzYjc0LCAweDEwNzgsIDB4Mjk2YiwgMHgxMDc4LCAweDQwZGIsIDB4NzgxYiwgMHgwMDc4LAorCTB4MDA3YywgMHg3MDAwLCAweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDNiOGEsIDB4MTA3OCwgMHgzZGVkLAorCTB4MDA3OCwgMHgzYjg0LCAweDEwNzgsIDB4NDU4NiwgMHg2MDA4LCAweGEwODQsIDB4ZmJlZiwgMHg2MDBhLAorCTB4MDA3OCwgMHgzYjhmLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDAwNDAsIDB4M2I4MiwgMHg3MDAzLAorCTB4MDAwNSwgMHhiMjg0LCAweDAzMDAsIDB4MDA0MCwgMHgzYjk5LCAweDIwMDEsIDB4OTVlMCwgMHgwMDc4LAorCTB4M2I5YiwgMHgyMDAxLCAweDk2MTIsIDB4MjA2OCwgMHg3MDRlLCAweGFkODAsIDB4MDAwOSwgMHg3MDQ2LAorCTB4MjIwMCwgMHgwMDdjLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4M2JiNCwgMHg3MGQ0LAorCTB4YzBiNSwgMHg3MGQ2LCAweDJjMDAsIDB4NzBiYSwgMHgyZDAwLCAweDcwYmUsIDB4MDA3OCwgMHgzYmI5LAorCTB4MTA3OCwgMHg0NTg2LCAweDAwNzgsIDB4M2JiOSwgMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMDQwLAorCTB4M2JiMCwgMHg3MDAzLCAweDAwMDEsIDB4N2E4MCwgMHhhMjk0LCAweDBmMDAsIDB4Nzg5YiwgMHgwMDE4LAorCTB4N2NhOCwgMHhhNDg0LCAweDAwMWYsIDB4YTIxNSwgMHgyMDY5LCAweDk0YzAsIDB4YjI4NCwgMHgwMzAwLAorCTB4MDBjMCwgMHgzYmNkLCAweGMyZmQsIDB4MjA2OSwgMHg5NWQwLCAweDJkMDQsIDB4MmQwOCwgMHg3MTVlLAorCTB4YTA2ZCwgMHgwMDQwLCAweDNiZGEsIDB4NjgxNCwgMHhhMjA2LCAweDAwNDAsIDB4M2JkYywgMHg2ODAwLAorCTB4MDA3OCwgMHgzYmNlLCAweDEwNzgsIDB4M2M4MSwgMHg2ZWI0LCAweDdlNWEsIDB4NjkyMCwgMHhhMTg0LAorCTB4MGMwMCwgMHgwMDQwLCAweDNjYWIsIDB4NzA2NCwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHgzYmVlLAorCTB4NzA3NCwgMHhhMjA2LCAweDAwYzAsIDB4M2JlZSwgMHg3MDY2LCAweDcwN2UsIDB4NjgxYiwgMHgwMDA1LAorCTB4YzFhZCwgMHhjMWQ0LCAweDY5MjIsIDB4MTA3OCwgMHg0MGQwLCAweDAwNzgsIDB4M2NhYiwgMHg3MjAwLAorCTB4YTI4NiwgMHgwMDAyLCAweDAwYzAsIDB4M2MwOSwgMHg3MGQ0LCAweGMwYjUsIDB4NzBkNiwgMHgyYzAwLAorCTB4NzBiYSwgMHgyZDAwLCAweDcwYmUsIDB4MDA3OCwgMHgzYzBkLCAweDEwNzgsIDB4NDU4NiwgMHgwMDc4LAorCTB4M2MwZCwgMHhhMjg2LCAweDAwMDMsIDB4MDA0MCwgMHgzYzA1LCAweDcwMDMsIDB4MDAwMSwgMHg3YTgwLAorCTB4YTI5NCwgMHgwZjAwLCAweDc4OWIsIDB4MDAxOCwgMHg3Y2E4LCAweGE0ODQsIDB4MDAxZiwgMHhhMjE1LAorCTB4YjI4NCwgMHgwMzAwLCAweDAwYzAsIDB4M2MxZCwgMHhjMmZkLCAweDc5YTgsIDB4NzlhOCwgMHhhMThjLAorCTB4MDBmZiwgMHgyMTE4LCAweDcwY2MsIDB4YTE2OCwgMHgyZDA0LCAweDJkMDgsIDB4NzE1ZSwgMHhhMDZkLAorCTB4MDA0MCwgMHgzYzMxLCAweDY4MTQsIDB4YTIwNiwgMHgwMDQwLCAweDNjNWEsIDB4NjgwMCwgMHgwMDc4LAorCTB4M2MyNSwgMHg3MDAzLCAweDAwMDUsIDB4YjI4NCwgMHgwMzAwLCAweDAwNDAsIDB4M2MzYiwgMHgyMDAxLAorCTB4OTVlMCwgMHgwMDc4LCAweDNjM2QsIDB4MjAwMSwgMHg5NjEyLCAweDIwNjgsIDB4NzA0ZSwgMHgxNTdlLAorCTB4MjBhOSwgMHgwMDMyLCAweDIwMDMsIDB4MDAwMCwgMHg4MDAwLCAweDAwZjAsIDB4M2M0MiwgMHgxNTdmLAorCTB4YjI4NCwgMHgwMzAwLCAweDAwNDAsIDB4M2M0ZiwgMHhjMmZjLCAweDAwNzgsIDB4M2M1MCwgMHhjMmZkLAorCTB4NmExNiwgMHhhZDgwLCAweDAwMDksIDB4NzA0NiwgMHg2OGI3LCAweDA3MDAsIDB4NjgyMywgMHgwODAwLAorCTB4NjgyNywgMHgwMDAzLCAweDZlYjQsIDB4NjkyMCwgMHhhMTg0LCAweDBjMDAsIDB4MDA0MCwgMHgzY2FiLAorCTB4ZDBkYywgMHgwMDQwLCAweDNjNzYsIDB4NzA2NCwgMHhhMDg2LCAweDAwMDQsIDB4MDBjMCwgMHgzYzcyLAorCTB4NzA3NCwgMHhhMjA2LCAweDAwYzAsIDB4M2M3MiwgMHg3MDc4LCAweGEzMDYsIDB4MDBjMCwgMHgzYzcyLAorCTB4NzA2NiwgMHg3MDdlLCAweDEwNzgsIDB4NDBkNywgMHgwMDc4LCAweDNjYWIsIDB4NjgxYiwgMHgwMDA1LAorCTB4YzFhZCwgMHhjMWQ0LCAweDY5MjIsIDB4MTA3OCwgMHg0MGQwLCAweDcwN2YsIDB4MDAwMCwgMHgwMDc4LAorCTB4M2NhYiwgMHg3MDAzLCAweDAwMDUsIDB4YjI4NCwgMHgwMzAwLCAweDAwNDAsIDB4M2M4YiwgMHgyMDAxLAorCTB4OTVlMCwgMHgwMDc4LCAweDNjOGQsIDB4MjAwMSwgMHg5NjEyLCAweDIwNjgsIDB4NzA0ZSwgMHgxNTdlLAorCTB4MjBhOSwgMHgwMDMyLCAweDIwMDMsIDB4MDAwMCwgMHg4MDAwLCAweDAwZjAsIDB4M2M5MiwgMHgxNTdmLAorCTB4YjI4NCwgMHgwMzAwLCAweDAwNDAsIDB4M2M5ZiwgMHhjMmZjLCAweDAwNzgsIDB4M2NhMCwgMHhjMmZkLAorCTB4NmExNiwgMHhhZDgwLCAweDAwMDksIDB4NzA0NiwgMHg2OGI3LCAweDA3MDAsIDB4NjgyMywgMHgwODAwLAorCTB4NjgyNywgMHgwMDAzLCAweDAwN2MsIDB4YzZlYywgMHhhNmFjLCAweDAwNjAsIDB4MDA0MCwgMHgzY2ZkLAorCTB4NmI5OCwgMHg2Yzk0LCAweDY5YWMsIDB4NjhiMCwgMHhhMTA1LCAweDAwYzAsIDB4M2NkOCwgMHg3YmQyLAorCTB4N2JkYSwgMHg3Y2Q2LCAweDdjZGUsIDB4YTU4NiwgMHgwMDYwLCAweDAwNDAsIDB4M2QwMiwgMHhkNmY0LAorCTB4MDBjMCwgMHgzY2MzLCAweGM2ZWQsIDB4YTZiNCwgMHhiN2ZmLCAweDdlNWEsIDB4MjAwOSwgMHgwMDc5LAorCTB4ZDY5YywgMHgwMDQwLCAweDNjZDAsIDB4MjAwOSwgMHgwMDc4LCAweDIwMTksIDB4MDAwMCwgMHgyMzIwLAorCTB4NzkxYSwgMHhkNmVjLCAweDAwNDAsIDB4M2QwZCwgMHgxMDc4LCAweDQ4YmQsIDB4MDA3OCwgMHgzZDBkLAorCTB4NjhiMCwgMHhhMzFhLCAweDIxMDAsIDB4YTQyMywgMHgyNDAwLCAweGEzMDUsIDB4MDA0MCwgMHgzZDA0LAorCTB4N2JkMiwgMHg3YmRhLCAweDdjZDYsIDB4N2NkZSwgMHg2OGIwLCAweGQ2ZjQsIDB4MDBjMCwgMHgzY2U5LAorCTB4YzZlZCwgMHhjNmY0LCAweDdlNWEsIDB4MjAxMSwgMHgwMDc5LCAweGQ2OWMsIDB4MDA0MCwgMHgzY2Y1LAorCTB4MjAxMSwgMHgwMDc4LCAweDIwMTksIDB4MDAwMCwgMHgyMzIwLCAweDdhMWEsIDB4ZDZlYywgMHgwMDQwLAorCTB4M2QwZCwgMHgxMDc4LCAweDQ4ZjUsIDB4MDA3OCwgMHgzZDBkLCAweDIwMTksIDB4MDAwMCwgMHgyMzIwLAorCTB4MDA3OCwgMHgzZDA0LCAweGE2YjQsIDB4YjdmZiwgMHg3ZTVhLCAweDIwMDksIDB4MDA3OSwgMHhkNjljLAorCTB4MDA0MCwgMHgzZDBjLCAweDIwMDksIDB4MDA3OCwgMHg3OTFhLCAweDY4YzAsIDB4NzA1YSwgMHgyZDAwLAorCTB4NzA0ZSwgMHg2OGM0LCAweDIwNjAsIDB4NzFkNCwgMHgyMDAxLCAweDRlMDEsIDB4MjAwNCwgMHhkMGM0LAorCTB4MDBjMCwgMHgzZDYyLCAweDcwZDgsIDB4YTAyZCwgMHgwMDQwLCAweDNkM2IsIDB4ZDFiYywgMHgwMDQwLAorCTB4M2Q1NSwgMHg3YTgwLCAweGEyOTQsIDB4MGYwMCwgMHg3MGRjLCAweGEyMDYsIDB4MDA0MCwgMHgzZDJjLAorCTB4NzhlMCwgMHhhNTA0LCAweDAwYzAsIDB4M2Q2MiwgMHg3MGRhLCAweGMxYmMsIDB4NzFkNiwgMHgwMDc4LAorCTB4M2Q2MiwgMHgyMDMxLCAweDAwMDEsIDB4ODUyYywgMHgwMDQ4LCAweDNkM2EsIDB4ODYzMywgMHg4MjEwLAorCTB4MDA3OCwgMHgzZDMzLCAweDAwN2MsIDB4N2RlMCwgMHhhNTk0LCAweGZmMDAsIDB4MDA0MCwgMHgzZDQ4LAorCTB4MjAxMSwgMHgwMDA4LCAweDg1MmYsIDB4MTA3OCwgMHgzZDMxLCAweDg2MzcsIDB4MDA3OCwgMHgzZDRhLAorCTB4MTA3OCwgMHgzZDMxLCAweDgyMTcsIDB4Nzg4MCwgMHhhMDg0LCAweDBmMDAsIDB4YTIwNiwgMHgwMDQwLAorCTB4M2Q2MiwgMHg3MmRlLCAweDc2ZGEsIDB4MDA3OCwgMHgzZDYyLCAweDdhODAsIDB4YTI5NCwgMHgwZjAwLAorCTB4NzBkYywgMHhhMjM2LCAweDAwNDAsIDB4M2Q1MiwgMHg3OGUwLCAweGE1MzQsIDB4MDA0MCwgMHgzZDUyLAorCTB4YzFiZCwgMHg3MWQ2LCAweGQxYjQsIDB4MDBjMCwgMHgyOWMxLCAweDIzMDAsIDB4YTQwNSwgMHgwMDQwLAorCTB4MjljMSwgMHg3MGE0LCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDJhMGIsIDB4MDA3YywgMHg2MDIwLAorCTB4YTAwNSwgMHgwMDQwLCAweDNkN2QsIDB4ODAwMSwgMHg2MDIyLCAweDYwMDgsIDB4YTA4NSwgMHgwMDA4LAorCTB4NjAwYSwgMHg3MDBmLCAweDAxMDAsIDB4NzAyYywgMHg2MDI2LCAweDAwN2MsIDB4YTAwNiwgMHgxMDc4LAorCTB4NDU4NiwgMHg3MDAwLCAweGEwODYsIDB4MDAwMiwgMHgwMDQwLCAweDNkOGIsIDB4NzA2NCwgMHhhMDg2LAorCTB4MDAwNSwgMHgwMGMwLCAweDNkOTUsIDB4NjgyYiwgMHgwMDAwLCAweDY4MTcsIDB4MDAwMCwgMHg2ODFiLAorCTB4MDAwMSwgMHg2ODIzLCAweDAwNDAsIDB4NjgxZiwgMHgwMTAwLCAweDcwMDAsIDB4YTA4NCwgMHgwMDBmLAorCTB4MDA3OSwgMHgzZDlhLCAweDI5YzUsIDB4M2RhYSwgMHgzZGE0LCAweDNkY2MsIDB4M2RiNCwgMHgyOWM1LAorCTB4M2RhMiwgMHgzZGEyLCAweDEwNzgsIDB4Mjk2YiwgMHgxMDc4LCAweDNkZDcsIDB4MTA3OCwgMHgzZGQwLAorCTB4MDA3OCwgMHgzZGIwLCAweDEwNzgsIDB4M2RkNywgMHg3MDVjLCAweDIwNjAsIDB4NjgwMCwgMHg2MDAyLAorCTB4MTA3OCwgMHgyMDJjLCAweDAwNzgsIDB4MjljNSwgMHg3MDY0LCAweDcwNjcsIDB4MDAwMCwgMHg3MDgzLAorCTB4MDAwMCwgMHgwMDc5LCAweDNkYmIsIDB4M2RjOCwgMHgzZGM4LCAweDNkYzMsIDB4M2RjMywgMHgzZGMzLAorCTB4M2RjOCwgMHgzZGMzLCAweDNkYzgsIDB4NzdkNCwgMHhjN2RkLCAweDc3ZDYsIDB4MDA3OSwgMHgyZjM1LAorCTB4NzA2NywgMHgwMDAwLCAweDAwNzgsIDB4MjljNSwgMHg2ODFiLCAweDAwMDAsIDB4MDA3OCwgMHgzNmM4LAorCTB4NjgwMCwgMHhhMDA1LCAweDAwYzAsIDB4M2RkNSwgMHg2MDAyLCAweDYwMDYsIDB4MDA3YywgMHg2NDEwLAorCTB4ODRmZiwgMHgwMDQwLCAweDNkZTksIDB4MjAwOSwgMHg0ZTAyLCAweDIxMDQsIDB4ODAwMSwgMHgyMDBhLAorCTB4ODQyMSwgMHg2NDEyLCAweDAwYzAsIDB4M2RlOSwgMHgyMDIxLCAweDRlMDQsIDB4MjQwNCwgMHhjMGE1LAorCTB4MjAyMiwgMHg2MDA4LCAweGMwYTQsIDB4NjAwYSwgMHgwMDdjLCAweDYwMTgsIDB4YTAwNSwgMHgwMDQwLAorCTB4M2RmMywgMHg4MDAxLCAweDYwMWEsIDB4MDA3YywgMHgxMDc4LCAweDQzODMsIDB4NjgxYiwgMHgwMDE4LAorCTB4MDA3OCwgMHgzZTM0LCAweDEwNzgsIDB4NDM4MywgMHg2ODFiLCAweDAwMTksIDB4MDA3OCwgMHgzZTM0LAorCTB4MTA3OCwgMHg0MzgzLCAweDY4MWIsIDB4MDAxYSwgMHgwMDc4LCAweDNlMzQsIDB4MTA3OCwgMHg0MzgzLAorCTB4NjgxYiwgMHgwMDAzLCAweDAwNzgsIDB4M2UzNCwgMHg3Nzc0LCAweDEwNzgsIDB4NDFmZSwgMHg3MTc4LAorCTB4YTE4YywgMHgwMGZmLCAweDMyMTAsIDB4YTI5NCwgMHgwMzAwLCAweDAwNDAsIDB4M2UxYiwgMHhhMWU4LAorCTB4OTNjMCwgMHgwMDc4LCAweDNlMWQsIDB4YTFlOCwgMHg5NGQwLCAweDJkMDQsIDB4MmQwOCwgMHgyMDY4LAorCTB4YTAwNSwgMHgwMGMwLCAweDNlMjYsIDB4NzA3ZSwgMHgwMDc4LCAweDI5YzUsIDB4NjgxNCwgMHg3Mjc0LAorCTB4YTIwNiwgMHgwMDQwLCAweDNlMmUsIDB4NjgwMCwgMHgwMDc4LCAweDNlMWUsIDB4NjgwMCwgMHgyMDBhLAorCTB4NjgxYiwgMHgwMDA1LCAweDcwN2YsIDB4MDAwMCwgMHgxMDc4LCAweDNkZDcsIDB4NjgyMCwgMHhkMDg0LAorCTB4MDBjMCwgMHgzZTNjLCAweDEwNzgsIDB4M2RkMCwgMHgxMDc4LCAweDNkZWQsIDB4NjgxZiwgMHgwMDAwLAorCTB4NjgyMywgMHgwMDIwLCAweDEwNzgsIDB4MjAyYywgMHgwMDc4LCAweDI5YzUsIDB4YTI4MiwgMHgwMDAzLAorCTB4MDBjMCwgMHg0MGI3LCAweDdkYTgsIDB4YTVhYywgMHgwMGZmLCAweDdlNWEsIDB4N2VhOCwgMHhhNmI0LAorCTB4MDBmZiwgMHg2OTIwLCAweGMxYmQsIDB4NjkyMiwgMHhkMWM0LCAweDAwNDAsIDB4M2VhMSwgMHhjMWM0LAorCTB4NjkyMiwgMHhhNmI0LCAweDAwZmYsIDB4MDA0MCwgMHgzZThlLCAweGE2ODIsIDB4MDAwYywgMHgwMDQ4LAorCTB4M2U2NSwgMHgwMDQwLCAweDNlNjUsIDB4MjAzMSwgMHgwMDBjLCAweDI1MDAsIDB4YTA4NiwgMHgwMDBhLAorCTB4MDA0MCwgMHgzZTZjLCAweDg1MmIsIDB4ODUyYiwgMHgxMDc4LCAweDQxOTAsIDB4MDA0MCwgMHgzZTc0LAorCTB4MTA3OCwgMHgzZjZmLCAweDAwNzgsIDB4M2U5NywgMHgxMDc4LCAweDQxNGIsIDB4MGM3ZSwgMHgyOTYwLAorCTB4NjAwNCwgMHhhMDg0LCAweGZmZjUsIDB4NjAwNiwgMHgxMDc4LCAweDNmYTUsIDB4MGM3ZiwgMHg2OTIwLAorCTB4YzFjNSwgMHg2OTIyLCAweDdlNTgsIDB4YzY5NSwgMHg3ZTVhLCAweGQ2ZDQsIDB4MDBjMCwgMHgzZThiLAorCTB4NzgxYiwgMHgwMDY0LCAweDAwN2MsIDB4NzgxYiwgMHgwMDc4LCAweDAwN2MsIDB4MGM3ZSwgMHgyOTYwLAorCTB4NjAwNCwgMHhhMDg0LCAweGZmZjUsIDB4NjAwNiwgMHgxMDc4LCAweDNmYTUsIDB4MGM3ZiwgMHg3ZTU4LAorCTB4ZDZkNCwgMHgwMGMwLCAweDNlOWUsIDB4NzgxYiwgMHgwMDY3LCAweDAwN2MsIDB4NzgxYiwgMHgwMDc5LAorCTB4MDA3YywgMHgwYzdlLCAweDcwNTgsIDB4MjA2MCwgMHg2MTAwLCAweGQxZTQsIDB4MDA0MCwgMHgzZWVhLAorCTB4NjIwOCwgMHg4MjE3LCAweGEyOTQsIDB4MDBmZiwgMHhhMjgyLCAweDAwMGMsIDB4MDA0OCwgMHgzZWI0LAorCTB4MDA0MCwgMHgzZWI0LCAweDIwMTEsIDB4MDAwYywgMHgyNjAwLCAweGEyMDIsIDB4MDBjOCwgMHgzZWI5LAorCTB4MjIzMCwgMHg2MjA4LCAweGEyOTQsIDB4MDBmZiwgMHgyMDAxLCAweDRlMDUsIDB4MjAwNCwgMHhkMGU0LAorCTB4MDBjMCwgMHgzZWNlLCAweDc4ZWMsIDB4ZDBlNCwgMHgwMDQwLCAweDNlY2UsIDB4YTI4MiwgMHgwMDBhLAorCTB4MDBjOCwgMHgzZWQ0LCAweDIwMTEsIDB4MDAwYSwgMHgwMDc4LCAweDNlZDQsIDB4YTI4MiwgMHgwMDBjLAorCTB4MDBjOCwgMHgzZWQ0LCAweDIwMTEsIDB4MDAwYywgMHgyMjAwLCAweGE1MDIsIDB4MDBjOCwgMHgzZWQ5LAorCTB4MjIyOCwgMHgxMDc4LCAweDQxNGYsIDB4MjUwMCwgMHhhMDg2LCAweDAwMGEsIDB4MDA0MCwgMHgzZWUyLAorCTB4ODUyYiwgMHg4NTJiLCAweDEwNzgsIDB4NDE5MCwgMHgwMDQwLCAweDNlZWEsIDB4MTA3OCwgMHgzZjZmLAorCTB4MDA3OCwgMHgzZWVlLCAweDEwNzgsIDB4NDE0YiwgMHgxMDc4LCAweDNmYTUsIDB4Nzg1OCwgMHhjMDk1LAorCTB4Nzg1YSwgMHgwYzdmLCAweDc4MWIsIDB4MDA3OCwgMHgwMDdjLCAweDBjN2UsIDB4Mjk2MCwgMHg2MDAwLAorCTB4ZDBlNCwgMHgwMGMwLCAweDNmMGIsIDB4YTA4NCwgMHgwMDQwLCAweDAwYzAsIDB4M2YwNSwgMHg2MTA0LAorCTB4YTE4YywgMHhmZmY1LCAweDYxMDYsIDB4MGM3ZiwgMHgwMDdjLCAweDIwMTEsIDB4MDAzMiwgMHgyMDE5LAorCTB4MDAwMCwgMHgwMDc4LCAweDNmMzYsIDB4NjhhMCwgMHhkMGNjLCAweDAwYzAsIDB4M2YwNSwgMHg2MjA4LAorCTB4YTI5NCwgMHgwMGZmLCAweDIwMDEsIDB4NGUwNSwgMHgyMDA0LCAweGQwZTQsIDB4MDBjMCwgMHgzZjI0LAorCTB4NzhlYywgMHhkMGU0LCAweDAwNDAsIDB4M2YyNCwgMHhhMjgyLCAweDAwMGIsIDB4MDBjOCwgMHgzZjI0LAorCTB4MjAxMSwgMHgwMDBhLCAweDAwNzgsIDB4M2YyYSwgMHhhMjgyLCAweDAwMGMsIDB4MDBjOCwgMHgzZjJhLAorCTB4MjAxMSwgMHgwMDBjLCAweDYzMDgsIDB4ODMxZiwgMHhhMzljLCAweDAwZmYsIDB4YTM4MiwgMHgwMDBjLAorCTB4MDA0OCwgMHgzZjM2LCAweDAwNDAsIDB4M2YzNiwgMHgyMDE5LCAweDAwMGMsIDB4NzhhYiwgMHgwMDAxLAorCTB4NzhhYiwgMHgwMDAzLCAweDc4YWIsIDB4MDAwMSwgMHg3YWFhLCAweDdiYWEsIDB4YThjMCwgMHgwMDA1LAorCTB4NjgyMCwgMHhjMGM1LCAweDY4MjIsIDB4NzBkNCwgMHhkMGI0LCAweDAwNDAsIDB4M2Y1MiwgMHhjMGI0LAorCTB4NzBkNiwgMHg3MGI4LCAweGEwNjUsIDB4NjAwOCwgMHhhMDg0LCAweGZiZWYsIDB4NjAwYSwgMHg2MDE4LAorCTB4ODAwMSwgMHg2MDFhLCAweDBjN2YsIDB4MDA3YywgMHgwYzdlLCAweDI5NjAsIDB4NjEwNCwgMHhhMThjLAorCTB4ZmZmNSwgMHg2MTA2LCAweDIwMTEsIDB4MDAzMiwgMHgyMDE5LCAweDAwMDAsIDB4MDA3OCwgMHgzZjYwLAorCTB4NzhhYiwgMHgwMDAxLCAweDc4YWIsIDB4MDAwMywgMHg3OGFiLCAweDAwMDEsIDB4N2FhYSwgMHg3YmFhLAorCTB4YThjMCwgMHgwMDA1LCAweDY4MjAsIDB4YzBjNSwgMHg2ODIyLCAweDBjN2YsIDB4MDA3YywgMHgwYzdlLAorCTB4NzE1OCwgMHgyMTYwLCAweDIwMTgsIDB4YTA4YywgMHgwMDIwLCAweDAwNDAsIDB4M2Y3OCwgMHhjMGFjLAorCTB4MjAwOCwgMHhhMDg0LCAweGZmZjAsIDB4YTYzNSwgMHg3ZTg2LCAweDYwMTgsIDB4Nzg5YSwgMHg3ZWFlLAorCTB4NjYxMiwgMHg3OGE0LCAweGEwODQsIDB4ZmZmMCwgMHhhMThjLCAweDAwMGYsIDB4YTEwNSwgMHhjMGY0LAorCTB4YTM5YywgMHgwMDIwLCAweDAwNDAsIDB4M2Y4ZSwgMHhhMDg1LCAweDQwMDAsIDB4YzBmYywgMHhkMGI0LAorCTB4MDBjMCwgMHgzZjkzLCAweGMwZmQsIDB4NzhhNiwgMHg2MDE2LCAweDc4OGEsIDB4YTZiNCwgMHgwMDBmLAorCTB4ODYzNywgMHg4MjA0LCAweDgwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGE2MDUsIDB4NjAwZSwgMHg2MDA0LAorCTB4YTA4NCwgMHhmZmY1LCAweDYwMDYsIDB4MGM3ZiwgMHgwMDdjLCAweDBjN2UsIDB4NzA1OCwgMHgyMDYwLAorCTB4NjAxOCwgMHg3ODlhLCAweDc4YTQsIDB4YTA4NCwgMHhmZmYwLCAweDc4YTYsIDB4NjAxMiwgMHg3ODg0LAorCTB4YTA4NCwgMHhmZmYwLCAweDc4ODYsIDB4NjAwYywgMHhhMDg0LCAweDAwZmYsIDB4NjAwZSwgMHgwYzdmLAorCTB4MDA3YywgMHhhMjgyLCAweDAwMDIsIDB4MDBjMCwgMHg0MGI3LCAweDdhYTgsIDB4NjkyMCwgMHhjMWJkLAorCTB4NjkyMiwgMHhkMWNjLCAweDAwNDAsIDB4M2ZmNCwgMHhjMWNjLCAweDY5MjIsIDB4YTI5NCwgMHgwMGZmLAorCTB4YTI4MiwgMHgwMDAyLCAweDAwYzgsIDB4NDBiNywgMHgxMDc4LCAweDQwNDQsIDB4MTA3OCwgMHgzZmE1LAorCTB4YTk4MCwgMHgwMDAxLCAweDIwMGMsIDB4MTA3OCwgMHg0MWZhLCAweDEwNzgsIDB4M2VmNSwgMHg4OGZmLAorCTB4MDA0MCwgMHgzZmVhLCAweDc4OWIsIDB4MDA2MCwgMHgyODAwLCAweDc4YWEsIDB4N2U1OCwgMHhjNjk1LAorCTB4N2U1YSwgMHhkNmQ0LCAweDAwYzAsIDB4M2ZlNywgMHg3ODFiLCAweDAwNjQsIDB4MDA3YywgMHg3ODFiLAorCTB4MDA3OCwgMHgwMDdjLCAweDdlNTgsIDB4ZDZkNCwgMHgwMGMwLCAweDNmZjEsIDB4NzgxYiwgMHgwMDY3LAorCTB4MDA3YywgMHg3ODFiLCAweDAwNzksIDB4MDA3YywgMHhhMjgyLCAweDAwMDIsIDB4MDBjOCwgMHgzZmZjLAorCTB4YTI4NCwgMHgwMDAxLCAweDAwNDAsIDB4NDAwNSwgMHg3MTU4LCAweGExODgsIDB4MDAwMCwgMHgyMTBjLAorCTB4ZDFlYywgMHgwMGMwLCAweDQwMDUsIDB4MjAxMSwgMHgwMDAwLCAweDEwNzgsIDB4NDEyYywgMHgxMDc4LAorCTB4NDA0NCwgMHgxMDc4LCAweDNmYTUsIDB4Nzg1OCwgMHhjMDk1LCAweDc4NWEsIDB4NzgxYiwgMHgwMDc4LAorCTB4MDA3YywgMHgwYzdlLCAweDAyN2UsIDB4Mjk2MCwgMHg2MDAwLCAweDIwMTEsIDB4MDAwMSwgMHhkMGVjLAorCTB4MDBjMCwgMHg0MDI1LCAweGEwODQsIDB4MDA4MCwgMHgwMGMwLCAweDQwMjMsIDB4YzFhNCwgMHg2MTA2LAorCTB4YTAwNiwgMHgwMDc4LCAweDQwNDEsIDB4MjAxMSwgMHgwMDAwLCAweDc4YWIsIDB4MDAwMSwgMHg3OGFiLAorCTB4MDAwMiwgMHg3OGFiLCAweDAwMDMsIDB4N2FhYSwgMHhhOGMwLCAweDAwMDQsIDB4NzBkNCwgMHhkMGI0LAorCTB4MDA0MCwgMHg0MDNkLCAweGMwYjQsIDB4NzBkNiwgMHg3MGI4LCAweGEwNjUsIDB4NjAwOCwgMHhhMDg0LAorCTB4ZmJlZiwgMHg2MDBhLCAweDYwMTgsIDB4ODAwMSwgMHg2MDFhLCAweDY4MjAsIDB4YTA4NSwgMHgwMjAwLAorCTB4NjgyMiwgMHgwMjdmLCAweDBjN2YsIDB4MDA3YywgMHgwYzdlLCAweDcwNTgsIDB4MjA2MCwgMHg4MmZmLAorCTB4MDA0MCwgMHg0MDRjLCAweDIwMTEsIDB4MDA0MCwgMHg2MDE4LCAweGEwODAsIDB4MDAwMiwgMHg3ODlhLAorCTB4NzhhNCwgMHhhMDg0LCAweGZmYmYsIDB4YTIwNSwgMHhjMGZjLCAweGQwYjQsIDB4MDBjMCwgMHg0MDU5LAorCTB4YzBmZCwgMHg3OGE2LCAweDYwMTYsIDB4Nzg4YSwgMHg2MDA0LCAweGMwYTQsIDB4NjAwNiwgMHgwYzdmLAorCTB4MDA3YywgMHgwMDdlLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDAwNDAsIDB4NDA2YSwgMHgwMDdmLAorCTB4MDA3OCwgMHg0MDZkLCAweDAwN2YsIDB4MDA3OCwgMHg0MGI0LCAweGQ2YWMsIDB4MDA0MCwgMHg0MGI0LAorCTB4Nzg4OCwgMHhhMDg0LCAweDAwNDAsIDB4MDA0MCwgMHg0MGI0LCAweDdiYjgsIDB4YTM4NCwgMHgwMDNmLAorCTB4ODMxYiwgMHgwMGM4LCAweDQwN2MsIDB4ODAwMCwgMHhhMDA1LCAweDAwNDAsIDB4NDA5MSwgMHg4MzFiLAorCTB4MDBjOCwgMHg0MDg1LCAweDgwMDEsIDB4MDA0MCwgMHg0MGIxLCAweGQ2ZjQsIDB4MDA0MCwgMHg0MDkxLAorCTB4NzhiOCwgMHg4MDFiLCAweDAwYzgsIDB4NDA4ZCwgMHg4MDAwLCAweGEwODQsIDB4MDAzZiwgMHgwMGMwLAorCTB4NDBiMSwgMHhjNmY0LCAweDdlNWEsIDB4NzlkOCwgMHg3YWRjLCAweDIwMDEsIDB4MDAwMSwgMHhhMTA4LAorCTB4MDBjOCwgMHg0MDljLCAweGEyOTEsIDB4MDAwMCwgMHg3OWQyLCAweDc5ZGEsIDB4N2FkNiwgMHg3YWRlLAorCTB4MTA3OCwgMHg0OWMzLCAweDc4MWIsIDB4MDA3NiwgMHhiMjg0LCAweDAzMDAsIDB4MDA0MCwgMHg0MGFjLAorCTB4MjAwMSwgMHgwMDAwLCAweDAwNzgsIDB4NDBhZSwgMHgyMDAxLCAweDAwMDEsIDB4MTA3OCwgMHg0ODRiLAorCTB4MDA3YywgMHg3ODFiLCAweDAwNzYsIDB4MDA3YywgMHg3ODFiLCAweDAwNzksIDB4MDA3YywgMHgxMDc4LAorCTB4NDBkZiwgMHg3ODFiLCAweDAwNzgsIDB4MDA3YywgMHgxMDc4LCAweDQwYzgsIDB4NzgxYiwgMHgwMDc4LAorCTB4MDA3YywgMHg2ODI3LCAweDAwMDIsIDB4MTA3OCwgMHg0MGQwLCAweDc4MWIsIDB4MDA3OCwgMHgwMDdjLAorCTB4MjAwMSwgMHgwMDA1LCAweDAwNzgsIDB4NDBlMSwgMHgyMDAxLCAweDAwMGMsIDB4MDA3OCwgMHg0MGUxLAorCTB4NjgyMCwgMHhjMGQ1LCAweDY4MjIsIDB4MjAwMSwgMHgwMDA2LCAweDAwNzgsIDB4NDBlMSwgMHgyMDAxLAorCTB4MDAwZCwgMHgwMDc4LCAweDQwZTEsIDB4MjAwMSwgMHgwMDA5LCAweDAwNzgsIDB4NDBlMSwgMHgyMDAxLAorCTB4MDAwNywgMHg3ODliLCAweDAwN2UsIDB4NzhhYSwgMHhjNjlkLCAweDdlNWEsIDB4NzBkNCwgMHhkMGI0LAorCTB4MDA0MCwgMHg0MGY3LCAweGMwYjQsIDB4NzBkNiwgMHgwYzdlLCAweDcwYjgsIDB4YTA2NSwgMHg2MDA4LAorCTB4YTA4NCwgMHhmYmVmLCAweDYwMGEsIDB4NjAxOCwgMHg4MDAxLCAweDYwMWEsIDB4MGM3ZiwgMHgwMDdjLAorCTB4MDc3ZSwgMHg4NzNmLCAweGE3YmMsIDB4MDAwZiwgMHg4NzNiLCAweDg3M2IsIDB4ODcwMywgMHgwMTdlLAorCTB4YjI4YywgMHgwMzAwLCAweDAwNDAsIDB4NDEwOCwgMHhhMGUwLCAweDUyYzAsIDB4MDA3OCwgMHg0MTBhLAorCTB4YTBlMCwgMHg1MzQwLCAweDAxN2YsIDB4YTdiOCwgMHgwMDIwLCAweDdmOWEsIDB4NzlhNCwgMHhhMTg0LAorCTB4MDAwZiwgMHgwMDQwLCAweDQxMWEsIDB4YTE4NCwgMHhmZmYwLCAweDc4YTYsIDB4NjAxMiwgMHg2MDA0LAorCTB4YzA5ZCwgMHg2MDA2LCAweDg3MzgsIDB4ODczOCwgMHg3ZjlhLCAweDc5YTQsIDB4YTE4NCwgMHgwMDQwLAorCTB4MDA0MCwgMHg0MTJhLCAweGExODQsIDB4ZmZiZiwgMHhjMGZkLCAweDc4YTYsIDB4NjAxNiwgMHg2MDA0LAorCTB4YzBhNSwgMHg2MDA2LCAweDA3N2YsIDB4MDA3YywgMHg3ODliLCAweDAwMTAsIDB4NzhhYiwgMHgwMDAxLAorCTB4NzhhYiwgMHgwMDAyLCAweDc4YWIsIDB4MDAwMywgMHg3YWFhLCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLAorCTB4MDAwNCwgMHg3MGQ0LCAweGQwYjQsIDB4MDA0MCwgMHg0MTRhLCAweGMwYjQsIDB4NzBkNiwgMHgwYzdlLAorCTB4NzBiOCwgMHhhMDY1LCAweDYwMDgsIDB4YTA4NCwgMHhmYmVmLCAweDYwMGEsIDB4NjAxOCwgMHg4MDAxLAorCTB4NjAxYSwgMHgwYzdmLCAweDAwN2MsIDB4MjAzMSwgMHgwMDAwLCAweDIwMjksIDB4MDAzMiwgMHg3ODliLAorCTB4MDAxMCwgMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwgMHgwMDAzLCAweDc4YWIsIDB4MDAwMSwgMHg3ZGFhLAorCTB4N2VhYSwgMHg3ODliLCAweDAwNjAsIDB4NzhhYiwgMHgwMDA1LCAweDcwZDQsIDB4ZDBiNCwgMHgwMDQwLAorCTB4NDE2ZSwgMHhjMGI0LCAweDcwZDYsIDB4MGM3ZSwgMHg3MGI4LCAweGEwNjUsIDB4NjAwOCwgMHhhMDg0LAorCTB4ZmJlZiwgMHg2MDBhLCAweDYwMTgsIDB4ODAwMSwgMHg2MDFhLCAweDBjN2YsIDB4MDA3YywgMHgxNTdlLAorCTB4ODAwNywgMHhhMDg0LCAweDAwZmYsIDB4ODAwMywgMHg4MDAzLCAweGEwODAsIDB4MDAyMCwgMHg3ODlhLAorCTB4NzlhNCwgMHhhMThjLCAweGZmZjAsIDB4MjAyMSwgMHg0MWUzLCAweDIwMTksIDB4MDAxMSwgMHgyMGE5LAorCTB4MDAwZSwgMHgyMDExLCAweDAwMzIsIDB4MjQwNCwgMHhhMDg0LCAweGZmZjAsIDB4YTEwNiwgMHgwMDQwLAorCTB4NDE4ZSwgMHg4NDIwLCAweDIzMDAsIDB4YTIxMCwgMHgwMGYwLCAweDQxODMsIDB4MTU3ZiwgMHgwMDdjLAorCTB4MTU3ZSwgMHgyMDAxLCAweDRlMDUsIDB4MjAwNCwgMHhkMGU0LCAweDAwYzAsIDB4NDFjMSwgMHgyMDIxLAorCTB4NDFmMSwgMHgyMGE5LCAweDAwMDksIDB4MjAxMSwgMHgwMDI4LCAweGE1ODIsIDB4MDAxOSwgMHgwMDQwLAorCTB4NDFkNywgMHgwMDQ4LCAweDQxZDcsIDB4ODQyMCwgMHg5NWE5LCAweDIwMTEsIDB4MDAzMiwgMHhhNTgyLAorCTB4MDAzMiwgMHgwMDQwLCAweDQxZDcsIDB4MDA0OCwgMHg0MWQ3LCAweDg0MjAsIDB4OTVhOSwgMHgyMDE5LAorCTB4MDAwYSwgMHgyMDExLCAweDAwNjQsIDB4MjIwMCwgMHhhNTAyLCAweDAwNDAsIDB4NDFkNywgMHgwMDQ4LAorCTB4NDFkNywgMHg4NDIwLCAweDIzMDAsIDB4YTIxMCwgMHgwMGYwLCAweDQxYjMsIDB4MTU3ZiwgMHgwMDc4LAorCTB4NDFkNSwgMHgyMDIxLCAweDQxZTMsIDB4MjAxOSwgMHgwMDExLCAweDIwYTksIDB4MDAwZSwgMHgyMDExLAorCTB4MDAzMiwgMHgyMjAwLCAweGE1MDIsIDB4MDA0MCwgMHg0MWQ3LCAweDAwNDgsIDB4NDFkNywgMHg4NDIwLAorCTB4MjMwMCwgMHhhMjEwLCAweDAwZjAsIDB4NDFjOSwgMHgxNTdmLCAweGEwMDYsIDB4MDA3YywgMHgxNTdmLAorCTB4YTU4MiwgMHgwMDY0LCAweDAwYzgsIDB4NDFlMCwgMHg3ODA4LCAweGEwODUsIDB4MDA3MCwgMHg3ODBhLAorCTB4MjQwNCwgMHhhMDA1LCAweDAwN2MsIDB4MTIwOSwgMHgzMDAyLCAweDMyMDIsIDB4NDIwMywgMHg0NDAzLAorCTB4NTQwNCwgMHg1NjA0LCAweDY2MDUsIDB4NjgwNSwgMHg3ODA2LCAweDdhMDYsIDB4MGMwNywgMHgwYzA3LAorCTB4MGUwNywgMHgxMGUxLCAweDMzMGEsIDB4NTgwNSwgMHg1YTA1LCAweDZhMDYsIDB4NmMwNiwgMHg3YzA3LAorCTB4N2UwNywgMHgwZTAwLCAweDc4OWIsIDB4MDAxMCwgMHhhMDQ2LCAweDAwN2MsIDB4YTc4NCwgMHgwZjAwLAorCTB4ODAwYiwgMHhhNzg0LCAweDAwMWYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMTA1LAorCTB4ZDdmYywgMHgwMDQwLCAweDQyMGYsIDB4YTBlMCwgMHg3M2MwLCAweDAwNzgsIDB4NDIxMSwgMHhhMGUwLAorCTB4NTNjMCwgMHgwMDdjLCAweDBlN2UsIDB4MGY3ZSwgMHhkMDg0LCAweDAwNDAsIDB4NDIxZiwgMHgyMDc5LAorCTB4MDEwMCwgMHgyMDA5LCAweDRlODAsIDB4MjA3MSwgMHg0ZTgwLCAweDAwNzgsIDB4NDIyZiwgMHgyMDA5LAorCTB4NGU0MCwgMHgyMDcxLCAweDRlNDAsIDB4MjAwMSwgMHg0ZTA0LCAweDIwMDQsIDB4ZDBlYywgMHgwMDQwLAorCTB4NDIyZCwgMHgyMDc5LCAweDAxMDAsIDB4MDA3OCwgMHg0MjJmLCAweDIwNzksIDB4MDIwMCwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMTA0LCAweGEwODQsIDB4MDAwZiwgMHgwMDc5LCAweDQyMzYsIDB4NDI0MCwgMHg0MjQwLAorCTB4NDI0MCwgMHg0MjQwLCAweDQyNDAsIDB4NDI0MCwgMHg0MjNlLCAweDQyM2UsIDB4MTA3OCwgMHgyOTZiLAorCTB4NjliNCwgMHhjMWY1LCAweGExOGMsIDB4ZmY5ZiwgMHg2OWI2LCAweGEwMDUsIDB4MDA0MCwgMHg0MjhmLAorCTB4Nzg1OCwgMHhhMDg0LCAweGZmOWYsIDB4YTA4NSwgMHg2MDAwLCAweDc4NWEsIDB4NzgyOCwgMHhhMDg2LAorCTB4MTgxNCwgMHgwMGMwLCAweDQyOGYsIDB4Nzg0YiwgMHgwMDA0LCAweDc4NDgsIDB4YTA4NCwgMHgwMDA0LAorCTB4MDBjMCwgMHg0MjU1LCAweDc4NGIsIDB4MDAwOCwgMHg3ODQ4LCAweGEwODQsIDB4MDAwOCwgMHgwMGMwLAorCTB4NDI1YywgMHg3ODMwLCAweGQwYmMsIDB4MDBjMCwgMHg0MjhmLCAweDAwN2UsIDB4MjAwMSwgMHg0ZTA0LAorCTB4MjAwNCwgMHhkMGVjLCAweDAwN2YsIDB4MDA0MCwgMHg0MjcxLCAweGIyODQsIDB4MDMwMCwgMHgwMDc4LAorCTB4NDI3MywgMHhiMjg0LCAweDA0MDAsIDB4MDA0MCwgMHg0Mjc5LCAweDAwMTgsIDB4NDI4ZiwgMHgwMDc4LAorCTB4NDI3YiwgMHgwMDI4LCAweDQyOGYsIDB4NzllNCwgMHhhMTg0LCAweDAwMzAsIDB4MDA0MCwgMHg0MjhmLAorCTB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MDA0MCwgMHg0MjhmLCAweDY4MWMsIDB4ZDBhYywgMHgwMGMwLAorCTB4NDI4ZCwgMHgxMDc4LCAweDQzMTksIDB4MDA3OCwgMHg0MjhmLCAweDc4MWIsIDB4MDBmOSwgMHgwZjdmLAorCTB4MGU3ZiwgMHgwMDdjLCAweDBjN2UsIDB4MjAwMSwgMHg0ZTAxLCAweDIwMDQsIDB4ZDBhYywgMHgwMGMwLAorCTB4NDMwYiwgMHg2ODE0LCAweDgwMDcsIDB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLAorCTB4YjI4YywgMHgwMzAwLCAweDAwNDAsIDB4NDJhOCwgMHhhMGUwLCAweDUyYzAsIDB4MDA3OCwgMHg0MmFhLAorCTB4YTBlMCwgMHg1MzQwLCAweDYwMDQsIDB4YTA4NCwgMHgwMDBhLCAweDAwYzAsIDB4NDMwYiwgMHg2MTA4LAorCTB4YTE5NCwgMHhmZjAwLCAweDAwNDAsIDB4NDMwYiwgMHhhMThjLCAweDAwZmYsIDB4MjAwMSwgMHgwMDBhLAorCTB4YTEwNiwgMHgwMDQwLCAweDQyZDYsIDB4MjAwMSwgMHgwMDBjLCAweGExMDYsIDB4MDA0MCwgMHg0MmRhLAorCTB4MjAwMSwgMHgwMDEyLCAweGExMDYsIDB4MDA0MCwgMHg0MmRlLCAweDIwMDEsIDB4MDAxNCwgMHhhMTA2LAorCTB4MDA0MCwgMHg0MmUyLCAweDIwMDEsIDB4MDAxOSwgMHhhMTA2LCAweDAwNDAsIDB4NDJlNiwgMHgyMDAxLAorCTB4MDAzMiwgMHhhMTA2LCAweDAwNDAsIDB4NDJlYSwgMHgwMDc4LCAweDQyZWUsIDB4MjAwOSwgMHgwMDBjLAorCTB4MDA3OCwgMHg0MmYwLCAweDIwMDksIDB4MDAxMiwgMHgwMDc4LCAweDQyZjAsIDB4MjAwOSwgMHgwMDE0LAorCTB4MDA3OCwgMHg0MmYwLCAweDIwMDksIDB4MDAxOSwgMHgwMDc4LCAweDQyZjAsIDB4MjAwOSwgMHgwMDIwLAorCTB4MDA3OCwgMHg0MmYwLCAweDIwMDksIDB4MDAzZiwgMHgwMDc4LCAweDQyZjAsIDB4MjAxMSwgMHgwMDAwLAorCTB4MjEwMCwgMHhhMjA1LCAweDYwMGEsIDB4NjAwNCwgMHhhMDg1LCAweDAwMDIsIDB4NjAwNiwgMHgyMDYxLAorCTB4NGUwMCwgMHg2MDA0LCAweGQwYmMsIDB4MDA0MCwgMHg0MzBiLCAweDY4MTQsIDB4ZDBmYywgMHgwMGMwLAorCTB4NDMwNiwgMHg2MGVhLCAweDIwNjEsIDB4NGU0MCwgMHgwMDc4LCAweDQzMDksIDB4NjBlZSwgMHgyMDYxLAorCTB4NGU4MCwgMHg2MDFmLCAweDgwMGYsIDB4MGM3ZiwgMHgwMDdjLCAweDc4MWIsIDB4MDA3OSwgMHgwMDdjLAorCTB4NzgxYiwgMHgwMDc4LCAweDAwN2MsIDB4NzgxYiwgMHgwMDY3LCAweDAwN2MsIDB4NzgxYiwgMHgwMDY0LAorCTB4MDA3YywgMHgyMDA5LCAweDRlMTksIDB4MjEwYywgMHhhMTg2LCAweDAwMDAsIDB4MDA0MCwgMHg0MzJiLAorCTB4YTE4NiwgMHgwMDAxLCAweDAwNDAsIDB4NDMyZSwgMHg3MDFmLCAweDAwMGIsIDB4NzA2NywgMHgwMDAxLAorCTB4NzgxYiwgMHgwMDQ3LCAweDAwN2MsIDB4NzgxYiwgMHgwMGYwLCAweDAwN2MsIDB4NzAxZiwgMHgwMDBhLAorCTB4MDA3YywgMHgyMDA5LCAweDRlMTksIDB4MjEwYywgMHhhMTg2LCAweDAwMDAsIDB4MDA0MCwgMHg0MzQ2LAorCTB4YTE4NiwgMHgwMDAxLCAweDAwNDAsIDB4NDM0MywgMHg3MDFmLCAweDAwMGIsIDB4NzA2NywgMHgwMDAxLAorCTB4NzgxYiwgMHgwMDQ3LCAweDAwN2MsIDB4NzAxZiwgMHgwMDBhLCAweDAwN2MsIDB4NzgxYiwgMHgwMGVmLAorCTB4MDA3YywgMHg3ODFiLCAweDAwZjksIDB4MDA3YywgMHg3ODFiLCAweDAwZjgsIDB4MDA3YywgMHg3ODFiLAorCTB4MDBjOSwgMHgwMDdjLCAweDc4MWIsIDB4MDBjOCwgMHgwMDdjLCAweDY4MTgsIDB4ZDBmYywgMHgwMDQwLAorCTB4NDM1YiwgMHg2ODFiLCAweDAwMWQsIDB4NzA2NywgMHgwMDAxLCAweDc4MWIsIDB4MDA0NywgMHgwMDdjLAorCTB4NzgzMCwgMHhhMDg0LCAweDAwYzAsIDB4MDBjMCwgMHg0MzgyLCAweDc4MDgsIDB4YzA4YywgMHg3ODBhLAorCTB4MDAwNSwgMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHg3OGVjLCAweGEwODQsIDB4MDAyMSwgMHgwMGMwLAorCTB4NDM3ZiwgMHgyMDAxLCAweDRlMDUsIDB4MjAwNCwgMHhkMGU0LCAweDAwYzAsIDB4NDM3ZCwgMHg3ODA0LAorCTB4YTA4NCwgMHhmZjFmLCAweGEwODUsIDB4MDBlMCwgMHg3ODA2LCAweGEwMDYsIDB4MDA3YywgMHg3ODA4LAorCTB4YzA4ZCwgMHg3ODBhLCAweDAwN2MsIDB4NzgwOCwgMHhjMDhkLCAweDc4MGEsIDB4MDA3YywgMHg3ODMwLAorCTB4YTA4NCwgMHgwMDQwLCAweDAwYzAsIDB4NDM4NywgMHgyMDAxLCAweDRlMDQsIDB4MjAwNCwgMHhkMGVjLAorCTB4MDA0MCwgMHg0Mzk2LCAweGIyODQsIDB4MDMwMCwgMHgwMDc4LCAweDQzOTgsIDB4YjI4NCwgMHgwNDAwLAorCTB4MDA0MCwgMHg0MzllLCAweDAwOTgsIDB4NDNhMiwgMHgwMDc4LCAweDQzYTAsIDB4MDBhOCwgMHg0M2EyLAorCTB4NzhhYywgMHgwMDdjLCAweDc4MDgsIDB4YTA4NCwgMHhmZmZkLCAweDc4MGEsIDB4MDAwNSwgMHgwMDA1LAorCTB4MDAwNSwgMHgwMDA1LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDIxLCAweDAwNDAsIDB4NDNjNSwgMHgwMDdlLAorCTB4MjAwMSwgMHg0ZTA0LCAweDIwMDQsIDB4ZDBlYywgMHgwMDdmLCAweDAwNDAsIDB4NDNiYiwgMHhiMjg0LAorCTB4MDMwMCwgMHgwMDc4LCAweDQzYmQsIDB4YjI4NCwgMHgwNDAwLCAweDAwNDAsIDB4NDNjMywgMHgwMDk4LAorCTB4NDNiZiwgMHgwMDc4LCAweDQzYzUsIDB4MDBhOCwgMHg0M2MzLCAweDc4YWMsIDB4MDA3ZSwgMHg3ODA4LAorCTB4YTA4NSwgMHgwMDAyLCAweDc4MGEsIDB4MDA3ZiwgMHgwMDdjLCAweGE3ODQsIDB4MDAwMSwgMHgwMGMwLAorCTB4Mzc3MCwgMHhhNzg0LCAweDAwNzAsIDB4MDA0MCwgMHg0M2RkLCAweDBjN2UsIDB4MmQ2MCwgMHgyZjY4LAorCTB4MTA3OCwgMHgyOGRmLCAweDJkNzgsIDB4MmM2OCwgMHgwYzdmLCAweGE3ODQsIDB4MDAwOCwgMHgwMDQwLAorCTB4NDNlYSwgMHg3ODRiLCAweDAwMDgsIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MDA0MCwgMHgzNzcwLAorCTB4MDA3OCwgMHg0MzBkLCAweGE3ODQsIDB4MDAwNCwgMHgwMDQwLCAweDQ0MTksIDB4NzhiOCwgMHhhMDg0LAorCTB4NDAwMSwgMHgwMDQwLCAweDQ0MTksIDB4Nzg0YiwgMHgwMDA4LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLAorCTB4MDA0MCwgMHgzNzcwLCAweDc4ZTQsIDB4YTA4NCwgMHgwMDA3LCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLAorCTB4NDQxOSwgMHg3OGMwLCAweGE2ODUsIDB4NDgwMCwgMHgyMDMwLCAweDdlNWEsIDB4NzgxYiwgMHgwMGY5LAorCTB4MDA3YywgMHg3ODRiLCAweDAwMDgsIDB4NjgxOCwgMHhkMGZjLCAweDAwNDAsIDB4NDQxNiwgMHg2ODFiLAorCTB4MDAxNSwgMHhkNmY0LCAweDAwNDAsIDB4NDQxNiwgMHg2ODFiLCAweDAwMDcsIDB4MTA3OCwgMHg0MzE5LAorCTB4MDA3YywgMHg2ODFiLCAweDAwMDMsIDB4Nzg1OCwgMHhhMDg0LCAweDNmMDAsIDB4NjgxZSwgMHg2ODJmLAorCTB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4Nzg0YiwgMHgwMDA4LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLAorCTB4MDA0MCwgMHgzMDY2LCAweDAwN2UsIDB4MjAwMSwgMHg0ZTA0LCAweDIwMDQsIDB4ZDBlYywgMHgwMDdmLAorCTB4MDA0MCwgMHg0NDM2LCAweGIyODQsIDB4MDMwMCwgMHgwMDc4LCAweDQ0MzgsIDB4YjI4NCwgMHgwNDAwLAorCTB4MDA0MCwgMHg0NDNlLCAweDAwMTgsIDB4MjljMSwgMHgwMDc4LCAweDQ0NDAsIDB4MDAyOCwgMHgyOWMxLAorCTB4MDA3OCwgMHg0MGJjLCAweDZiMTQsIDB4ODMwNywgMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLAorCTB4ODAwMywgMHhkM2ZjLCAweDAwNDAsIDB4NDQ1MCwgMHhhMDgwLCAweDUzNDAsIDB4MDA3OCwgMHg0NDUyLAorCTB4YTA4MCwgMHg1MmMwLCAweDIwNjAsIDB4MjA0OCwgMHg3MDVhLCAweDJhNjAsIDB4MDA3YywgMHgwMDIwLAorCTB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLAorCTB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLAorCTB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLAorCTB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLAorCTB4MDAyMCwgMHgwMDYyLCAweDAwMDksIDB4MDAxNCwgMHgwMDE0LCAweDk4NDgsIDB4MDAxNCwgMHgwMDE0LAorCTB4OTkxNCwgMHg5OGZkLCAweDAwMTQsIDB4MDAxNCwgMHgwMDgwLCAweDAwZmYsIDB4MDEwMCwgMHgwNDAyLAorCTB4MjAwOCwgMHhmODgwLCAweDAwMTgsIDB4YTIwYSwgMHgwMDE0LCAweDMwMGIsIDB4YTIwYywgMHgwMDE0LAorCTB4MjUwMCwgMHgwMDEzLCAweDI1MDAsIDB4MDAxMCwgMHgwMDEwLCAweDAwMTAsIDB4MDAxMCwgMHgwMDEwLAorCTB4MDAxMCwgMHgwMDEwLCAweDAwMTAsIDB4MDAxMCwgMHgwMDEwLCAweDAwMTAsIDB4MDAxMCwgMHgwMDEwLAorCTB4MDAxMCwgMHhhMjAwLCAweDM4MDYsIDB4NzEwMiwgMHg4MDVmLCAweDk0ODEsIDB4ODgzOSwgMHgyMGM0LAorCTB4MDg2NCwgMHhhODU2LCAweDMwMDgsIDB4MjhjMSwgMHg5ZDFiLCAweGEyMDEsIDB4MzAwYywgMHgyODQ3LAorCTB4ODE2MSwgMHg4NDZhLCAweDgwMDAsIDB4ODRhNCwgMHgxODU2LCAweDg4M2EsIDB4YTgwOCwgMHgyOGUyLAorCTB4OWNjYiwgMHhhOGYzLCAweDA4NjQsIDB4YTg0NCwgMHgzMDBjLCAweGE4MDEsIDB4MzAwOCwgMHgyOGUxLAorCTB4OWNjYiwgMHgyMDIxLCAweGE4MWQsIDB4YTIwNSwgMHg4NzBjLCAweGQ4ZGUsIDB4NjRhMCwgMHg2ZGUwLAorCTB4NmZjMCwgMHg2M2E0LCAweDZjODAsIDB4MDIxMiwgMHhhMjA1LCAweDg4M2QsIDB4Nzk0MiwgMHg4MDIwLAorCTB4YTRhMSwgMHg4ODJiLCAweDE4MTQsIDB4ODgzYiwgMHg4MGRmLCAweDk0YTEsIDB4NzAyNywgMHg4NWYyLAorCTB4YTczNywgMHhhNTMyLCAweGYwMDMsIDB4ODU3NiwgMHg4Njc3LCAweGE4MTYsIDB4ODgzZSwgMHhhODE0LAorCTB4MjAwMSwgMHhhODEyLCAweGEyMDQsIDB4NjRjMCwgMHg2ZGUwLCAweDY3YTAsIDB4NmZjMCwgMHg3OTQyLAorCTB4ODAyMCwgMHhhNGExLCAweDE4MTQsIDB4ODBkZiwgMHg5NGExLCAweDg4M2IsIDB4NzAyMywgMHg4NTc2LAorCTB4ODY3NywgMHhhODAyLCAweDc4NjEsIDB4ODgzZSwgMHgyMDZiLCAweDI4YzEsIDB4OWQxYiwgMHgyMDQ0LAorCTB4MjEwMywgMHgyMGEyLCAweDIwODEsIDB4YThjMywgMHhhMjA3LCAweDA5MDQsIDB4YTIwZSwgMHhhODA5LAorCTB4YTIwMywgMHg4MDAwLCAweDg1YTQsIDB4MTg3MiwgMHg4NzlhLCAweDg4M2MsIDB4MWZlMiwgMHhmNjAxLAorCTB4YTIwOCwgMHg4NTZlLCAweDg2NmYsIDB4NzE2MSwgMHgwMDE0LCAweDA3MDQsIDB4MzAwOCwgMHg5Y2NiLAorCTB4MDAxNCwgMHhhMjAyLCAweDgwMDAsIDB4ODVhNCwgMHgzMDA5LCAweDg0YTgsIDB4MTllMiwgMHhmODQ0LAorCTB4ODU2ZSwgMHg4ODNmLCAweDA4ZTYsIDB4YThmNSwgMHhmODYxLCAweGE4ZWEsIDB4ZjgwMSwgMHgwMDE0LAorCTB4Zjg4MSwgMHgwMDE2LCAweDg1YjIsIDB4ODBmMCwgMHg5NTMyLCAweGZhYTIsIDB4MWRlMiwgMHgwMDE0LAorCTB4ODUzMiwgMHhmMjIxLCAweDAwMTQsIDB4MWRlMiwgMHg4NGE4LCAweGQ2ZTAsIDB4MWZlNiwgMHgwMDE0LAorCTB4MzAwOCwgMHg4MDAwLCAweDI4NGEsIDB4MTAxMSwgMHhhOGZjLCAweDMwMDgsIDB4OWQzMywgMHg4MDAwLAorCTB4YTAwMCwgMHgyODAyLCAweDEwMTEsIDB4YThmZCwgMHg5ZDM5LCAweGE4YmQsIDB4MzAwOCwgMHg5ZDMzLAorCTB4MjgzYiwgMHgxMDExLCAweGE4ZmQsIDB4YTIwOSwgMHg3MTAyLCAweDgwNWYsIDB4OTQ4MSwgMHgwMDE3LAorCTB4MzAwYywgMHhhMjA5LCAweDgwMDAsIDB4ODVhNCwgMHgxZGUyLCAweGEyMDksIDB4ZGFjMSwgMHgwMDE0LAorCTB4MDIxMCwgMHhhODAxLCAweDAwMTQsIDB4MjZlMCwgMHg4NzNhLCAweGZhYTMsIDB4MTlmMiwgMHgyNmUwLAorCTB4MThmMiwgMHgwMDE0LCAweGEyMGIsIDB4MDAxNCwgMHhhMjBkLCAweDM4MDYsIDB4MDIxMCwgMHg5ZDI1LAorCTB4MDcwNCwgMHhhMjA2LCAweDY4NjUsIDB4ODE3ZSwgMHg4NDJhLCAweDFkYzEsIDB4ODgyMywgMHgwMDE2LAorCTB4NjA0MiwgMHg4MDA4LCAweGE4ZmEsIDB4ODAwMCwgMHg4NGE0LCAweDgxNjAsIDB4ODQyYSwgMHhmMDIxLAorCTB4MzAwOCwgMHg4NGE4LCAweDExZDYsIDB4NzA0MiwgMHgyMGRkLCAweDAwMTEsIDB4MjBkNCwgMHg4ODIyLAorCTB4MDAxNiwgMHg3OTQ0LCAweDg0MjEsIDB4YTAyMCwgMHhhNTMyLCAweDg0YTEsIDB4MDAxNiwgMHg3OTQ0LAorCTB4ODQyMSwgMHhhMGRmLCAweDk1MzIsIDB4ODRhMSwgMHgwMDE2LCAweDAwMDAsIDB4MTI3ZSwgMHg3MGQ0LAorCTB4YTA4NCwgMHg0NjAwLCAweDgwMDQsIDB4MjA5MCwgMHg3MjA0LCAweDcwMDgsIDB4YzA5YywgMHhhMjA1LAorCTB4MDBjMCwgMHg0NWEyLCAweDcyMGMsIDB4ODJmZiwgMHgwMDQwLCAweDQ1OWQsIDB4OGFmZiwgMHgwMGMwLAorCTB4NDVhMiwgMHg3MjAwLCAweGQyODQsIDB4MDBjMCwgMHg0NWEyLCAweDcwMDMsIDB4MDAwOCwgMHgxMjdmLAorCTB4MjAwMCwgMHgwMDdjLCAweDcwMDAsIDB4YTA4NCwgMHgwMDAzLCAweDcwMDIsIDB4YzY5YywgMHhkMDg0LAorCTB4MDA0MCwgMHg0NWU1LCAweDcxMDgsIDB4MDAwNSwgMHg3MDA4LCAweGExMDYsIDB4MDBjMCwgMHg0NWFhLAorCTB4YTE4NCwgMHgwMDAzLCAweDAwNDAsIDB4NDYxNiwgMHhhMTg0LCAweDAxZTAsIDB4MDBjMCwgMHg0NjE2LAorCTB4ZDFmNCwgMHgwMGMwLCAweDQ1YWEsIDB4YTE4NCwgMHgzMDAwLCAweGEwODYsIDB4MTAwMCwgMHgwMDQwLAorCTB4NDVhYSwgMHgyMDExLCAweDAxODAsIDB4NzEwYywgMHg4MjExLCAweDAwNDAsIDB4NDVjZiwgMHg3MDA4LAorCTB4ZDBmNCwgMHgwMGMwLCAweDQ1YWEsIDB4NzAwYywgMHhhMTA2LCAweDAwNDAsIDB4NDVjNCwgMHg3MDA3LAorCTB4MDAxMiwgMHg3MTA4LCAweDAwMDUsIDB4NzAwOCwgMHhhMTA2LCAweDAwYzAsIDB4NDVkMSwgMHhhMTg0LAorCTB4MDAwMywgMHgwMDQwLCAweDQ2MTYsIDB4ZDE5NCwgMHgwMDQwLCAweDQ1ZDEsIDB4ZDFmNCwgMHgwMDQwLAorCTB4NDYxNiwgMHg3MDA3LCAweDAwMDIsIDB4MDA3OCwgMHg0NWFhLCAweDcxMDgsIDB4ZDFmYywgMHgwMDQwLAorCTB4NDVmMCwgMHgxMDc4LCAweDQ3NjksIDB4OGFmZiwgMHgwMDQwLCAweDQ1OGMsIDB4MDA3OCwgMHg0NWU1LAorCTB4NzAwYywgMHhhMDhjLCAweDAzZmYsIDB4MDA0MCwgMHg0NjFiLCAweDcwMDQsIDB4ZDA4NCwgMHgwMDQwLAorCTB4NDYwZCwgMHg3MDE0LCAweGEwMDUsIDB4MDBjMCwgMHg0NjA5LCAweDcwMTAsIDB4NzMxMCwgMHhhMzA2LAorCTB4MDBjMCwgMHg0NWZkLCAweDIzMDAsIDB4YTAwNSwgMHgwMDQwLCAweDQ2MGQsIDB4YTEwMiwgMHgwMGM4LAorCTB4NDVlNSwgMHg3MDA3LCAweDAwMTAsIDB4MDA3OCwgMHg0NjE2LCAweDhhZmYsIDB4MDA0MCwgMHg0NjFiLAorCTB4MTA3OCwgMHg0OTcwLCAweDAwYzAsIDB4NDYxMCwgMHgwMDQwLCAweDQ1ZTUsIDB4MTA3OCwgMHg0NmI0LAorCTB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4NzIwNCwgMHg3MTA4LCAweGMxOWMsIDB4ODEwMywgMHgwMGM4LAorCTB4NDYyYSwgMHg3MDA3LCAweDAwMDIsIDB4MDA3OCwgMHg0NjFiLCAweDcwMDMsIDB4MDAwOCwgMHgxMjdmLAorCTB4MjAwMCwgMHgwMDdjLCAweGEyMDUsIDB4MDBjMCwgMHg0NjE2LCAweDcwMDMsIDB4MDAwOCwgMHgxMjdmLAorCTB4MjAwMCwgMHgwMDdjLCAweDY0MjgsIDB4ODRmZiwgMHgwMDQwLCAweDQ2NWUsIDB4MmM3MCwgMHg3MDA0LAorCTB4YTBiYywgMHgwMDBmLCAweGE3YjgsIDB4NDY2ZSwgMHgyNzNjLCAweDg3ZmIsIDB4MDBjMCwgMHg0NjRjLAorCTB4MDA0OCwgMHg0NjQ0LCAweDEwNzgsIDB4Mjk2YiwgMHg2MDljLCAweGEwNzUsIDB4MDA0MCwgMHg0NjVlLAorCTB4MDA3OCwgMHg0NjM3LCAweDIwMzksIDB4NDY2MywgMHgyNzA0LCAweGFlNjgsIDB4NjgwOCwgMHhhNjMwLAorCTB4NjgwYywgMHhhNTI5LCAweDg0MjEsIDB4MDA0MCwgMHg0NjVlLCAweDg3MzgsIDB4MjcwNCwgMHhhMDA1LAorCTB4MDBjMCwgMHg0NjRkLCAweDcwOWMsIDB4YTA3NSwgMHgwMGMwLCAweDQ2MzcsIDB4MDA3YywgMHgwMDAwLAorCTB4MDAwNSwgMHgwMDA5LCAweDAwMGQsIDB4MDAxMSwgMHgwMDE1LCAweDAwMTksIDB4MDAxZCwgMHgwMDAwLAorCTB4MDAwMywgMHgwMDA5LCAweDAwMGYsIDB4MDAxNSwgMHgwMDFiLCAweDAwMDAsIDB4MDAwMCwgMHg0NjYzLAorCTB4NDY2MCwgMHgwMDAwLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLCAweDQ2NjMsIDB4MDAwMCwgMHg0NjZiLAorCTB4NDY2OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDQ2NmIsIDB4MDAwMCwgMHg0NjY2LAorCTB4NDY2NiwgMHgwMDAwLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLCAweDQ2NjYsIDB4MDAwMCwgMHg0NjZjLAorCTB4NDY2YywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDQ2NmMsIDB4MjA3OSwgMHg0ZTAwLAorCTB4MjA3MSwgMHgwMDEwLCAweDcwMDcsIDB4MDAwYSwgMHg3MDA3LCAweDAwMDIsIDB4NzAwMywgMHgwMDAxLAorCTB4NzgxMCwgMHhkMGVjLCAweDAwNDAsIDB4NDZhMiwgMHgyMDA5LCAweDAwMDEsIDB4MjA3MSwgMHgwMDIwLAorCTB4MDA3OCwgMHg0NmE2LCAweDIwMDksIDB4MDAwMiwgMHgyMDcxLCAweDAwNTAsIDB4NzAwNywgMHgwMDBhLAorCTB4NzAwNywgMHgwMDAyLCAweDcwMDMsIDB4MDAwMCwgMHg4MTA5LCAweDAwNDAsIDB4NDZiMywgMHgyMDcxLAorCTB4MDAyMCwgMHgwMDc4LCAweDQ2YTYsIDB4MDA3YywgMHg3MDA0LCAweDgwMDQsIDB4MDBjOCwgMHg0NzNkLAorCTB4NzEwOCwgMHg3MDA4LCAweGExMDYsIDB4MDBjMCwgMHg0NmI4LCAweGExODQsIDB4MDFlMCwgMHgwMDQwLAorCTB4NDZjNSwgMHgxMDc4LCAweDQ3YWMsIDB4MDA3OCwgMHg0NzY1LCAweDcwMDcsIDB4MDAxMiwgMHgyMDE5LAorCTB4MDAwMCwgMHg3MTA4LCAweDcwMDgsIDB4YTEwNiwgMHgwMGMwLCAweDQ2YzksIDB4YTE4NCwgMHgwMWUwLAorCTB4MDA0MCwgMHg0NmQ2LCAweDEwNzgsIDB4NDdhYywgMHgwMDc4LCAweDQ3NjUsIDB4NzgxMCwgMHhkMGVjLAorCTB4MDA0MCwgMHg0NmYwLCAweDIwMDEsIDB4MDRmZCwgMHgyMDA0LCAweGEwODYsIDB4MDAwMywgMHgwMGMwLAorCTB4NDZmNCwgMHhhMTg0LCAweDQwMDAsIDB4MDA0MCwgMHg0NmY4LCAweGEzODIsIDB4MDAwMywgMHgwMGM4LAorCTB4NDZmOCwgMHhhMTg0LCAweDAwMDQsIDB4MDA0MCwgMHg0NmM5LCAweDgzMTgsIDB4MDA3OCwgMHg0NmM5LAorCTB4NzgxNCwgMHhkMGVjLCAweDAwYzAsIDB4NDZmOCwgMHhhMTg0LCAweDQwMDAsIDB4MDBjMCwgMHg0NmM5LAorCTB4YTE5YywgMHgzMDBjLCAweGEzODYsIDB4MjAwNCwgMHgwMDQwLCAweDQ3MTUsIDB4YTM4NiwgMHgwMDA4LAorCTB4MDA0MCwgMHg0NzIwLCAweDcwMDQsIDB4ZDA4NCwgMHgwMGMwLCAweDQ3MTEsIDB4NzEwOCwgMHg3MDA4LAorCTB4YTEwNiwgMHgwMGMwLCAweDQ3MDYsIDB4YTE4NCwgMHgwMDAzLCAweDAwNDAsIDB4NDcxMSwgMHgwMDc4LAorCTB4NDdhYywgMHhhMzg2LCAweDIwMGMsIDB4MDBjMCwgMHg0NmM5LCAweDcyMDAsIDB4ODIwNCwgMHgwMDQ4LAorCTB4NDcyMCwgMHg3MzBjLCAweGEzODQsIDB4MDNmZiwgMHgwMDQwLCAweDQ3MjAsIDB4MTA3OCwgMHgyOTZiLAorCTB4NzEwOCwgMHg3MDA4LCAweGExMDYsIDB4MDBjMCwgMHg0NzIwLCAweGExODQsIDB4MDFlMCwgMHgwMDQwLAorCTB4NDcyZCwgMHgxMDc4LCAweDQ3YWMsIDB4MDA3OCwgMHg0NzY1LCAweDcwMDcsIDB4MDAxMiwgMHg3MDAwLAorCTB4ZDA4NCwgMHgwMGMwLCAweDQ3M2QsIDB4NzMxMCwgMHg3MDE0LCAweGEzMDUsIDB4MDA0MCwgMHg0NzNkLAorCTB4NzEwYywgMHhhMTg0LCAweDAzZmYsIDB4MDBjMCwgMHg0NmI0LCAweDcxMDgsIDB4NzAwOCwgMHhhMTA2LAorCTB4MDBjMCwgMHg0NzNkLCAweGExODQsIDB4MDFlMCwgMHgwMDQwLCAweDQ3NGEsIDB4MTA3OCwgMHg0N2FjLAorCTB4MDA3OCwgMHg0NzY1LCAweDcwMDcsIDB4MDAxMiwgMHg3MDA3LCAweDAwMDgsIDB4NzAwNCwgMHhkMDljLAorCTB4MDBjMCwgMHg0NzRlLCAweDcxMDgsIDB4NzAwOCwgMHhhMTA2LCAweDAwYzAsIDB4NDc1MiwgMHhhMTg0LAorCTB4MDFlMCwgMHgwMDQwLCAweDQ3NWYsIDB4MTA3OCwgMHg0N2FjLCAweDAwNzgsIDB4NDc2NSwgMHg3MDA3LAorCTB4MDAxMiwgMHg3MTA4LCAweDgxMDMsIDB4MDA0OCwgMHg0NzUyLCAweDcwMDMsIDB4MDAwOCwgMHgwMDdjLAorCTB4NzEwOCwgMHhhMTg0LCAweDAxZTAsIDB4MDBjMCwgMHg0N2FjLCAweDcxMDgsIDB4YTE4NCwgMHgwMWUwLAorCTB4MDBjMCwgMHg0N2FjLCAweGExODQsIDB4MDAwNywgMHgwMDc5LCAweDQ3NzYsIDB4NDc4MCwgMHg0NzkwLAorCTB4NDc3ZSwgMHg0NzkwLCAweDQ3N2UsIDB4NDdlZSwgMHg0NzdlLCAweDQ3ZWMsIDB4MTA3OCwgMHgyOTZiLAorCTB4NzAwNCwgMHhhMDg0LCAweDAwMTAsIDB4YzA4ZCwgMHg3MDA2LCAweDhhZmYsIDB4MDBjMCwgMHg0NzhiLAorCTB4MjA0OSwgMHgwMDAwLCAweDAwN2MsIDB4MTA3OCwgMHg0OTcwLCAweDAwYzAsIDB4NDc4YiwgMHgwMDdjLAorCTB4NzAwNCwgMHhhMDg0LCAweDAwMTAsIDB4YzA4ZCwgMHg3MDA2LCAweDcwMDQsIDB4ZDA4NCwgMHgwMGMwLAorCTB4NDdhNCwgMHg3MTA4LCAweDcwMDgsIDB4YTEwNiwgMHgwMGMwLCAweDQ3OTksIDB4YTE4NCwgMHgwMDAzLAorCTB4MDA0MCwgMHg0N2E0LCAweDAwNzgsIDB4NDdhYywgMHg4YWZmLCAweDAwNDAsIDB4NDdhYiwgMHgxMDc4LAorCTB4NDk3MCwgMHgwMGMwLCAweDQ3YTcsIDB4MDA3YywgMHg3MDA3LCAweDAwMTIsIDB4NzEwOCwgMHgwMGUwLAorCTB4NDdhZiwgMHgyMDkxLCAweDYwMDAsIDB4MDBlMCwgMHg0N2IzLCAweDIwOTEsIDB4NjAwMCwgMHg3MDA3LAorCTB4MDAxMiwgMHg3MDA3LCAweDAwMDgsIDB4NzAwNCwgMHhkMDljLCAweDAwYzAsIDB4NDdiYiwgMHg3MDA3LAorCTB4MDAxMiwgMHg3MTA4LCAweGQxZmMsIDB4MDBjMCwgMHg0N2JmLCAweDcwMDMsIDB4MDAwMCwgMHg3MDAwLAorCTB4YTAwNSwgMHgwMGMwLCAweDQ3ZDMsIDB4NzAwNCwgMHhhMDA1LCAweDAwYzAsIDB4NDdkMywgMHg3MDBjLAorCTB4YTAwNSwgMHgwMDQwLCAweDQ3ZDUsIDB4MDA3OCwgMHg0N2I3LCAweDIwNDksIDB4MDAwMCwgMHhiMjg0LAorCTB4MDEwMCwgMHgwMDQwLCAweDQ3ZGYsIDB4MjAwMSwgMHgwMDAwLCAweDAwNzgsIDB4NDdlMSwgMHgyMDAxLAorCTB4MDAwMSwgMHgxMDc4LCAweDQyMTIsIDB4NjgxYiwgMHgwMDAyLCAweDIwNTEsIDB4MDAwMCwgMHgwMDdjLAorCTB4MTA3OCwgMHgyOTZiLCAweDEwNzgsIDB4Mjk2YiwgMHgxMDc4LCAweDQ4MzYsIDB4NzIxMCwgMHg3MTE0LAorCTB4NzAwYywgMHhhMDljLCAweDAzZmYsIDB4MjgwMCwgMHhhMzAwLCAweGEyMTEsIDB4YTE4OSwgMHgwMDAwLAorCTB4MTA3OCwgMHg0ODM2LCAweDI3MDQsIDB4MmM1OCwgMHhhYzYwLCAweDYzMDgsIDB4MjIwMCwgMHhhMzIyLAorCTB4NjMwYywgMHgyMTAwLCAweGEzMWIsIDB4MjQwMCwgMHhhMzA1LCAweDAwNDAsIDB4NDgxMSwgMHgwMGM4LAorCTB4NDgxMSwgMHg4NDEyLCAweDgyMTAsIDB4ODMwYSwgMHhhMTg5LCAweDAwMDAsIDB4MmI2MCwgMHgwMDc4LAorCTB4NDdmOCwgMHgyYjYwLCAweDhhMDcsIDB4MDA3ZSwgMHg2MDA0LCAweGEwODQsIDB4MDAwOCwgMHgwMDQwLAorCTB4NDgxZCwgMHhhN2JhLCAweDQ2NjgsIDB4MDA3OCwgMHg0ODFmLCAweGE3YmEsIDB4NDY2MCwgMHgwMDdmLAorCTB4YTczZCwgMHgyYzAwLCAweDY4ODYsIDB4NmY4YSwgMHg2YzkyLCAweDZiOGUsIDB4NzEwOCwgMHg3MDA4LAorCTB4YTEwNiwgMHgwMGMwLCAweDQ4MjYsIDB4YTE4NCwgMHgwMWUwLCAweDAwNDAsIDB4NDgzMSwgMHgxMDc4LAorCTB4NDdhYywgMHg3MDA3LCAweDAwMTIsIDB4MTA3OCwgMHg0NmI0LCAweDAwN2MsIDB4OGE1MCwgMHg4NzM5LAorCTB4MjcwNCwgMHhhMDA0LCAweDAwYzAsIDB4NDg0YSwgMHg2MDAwLCAweGEwNjQsIDB4MDBjMCwgMHg0ODQxLAorCTB4MmQ2MCwgMHg2MDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDQ2N2UsIDB4MjAzYywgMHg4N2ZiLAorCTB4MTA0MCwgMHgyOTZiLCAweDAwN2MsIDB4MTI3ZSwgMHgwZDdlLCAweDcwZDQsIDB4YTA4NCwgMHg0NjAwLAorCTB4ODAwNCwgMHgyMDkwLCAweDBkN2YsIDB4Njg4NCwgMHgyMDYwLCAweDY4ODgsIDB4NmI4YywgMHg2YzkwLAorCTB4ODA1NywgMHhhYWQ0LCAweDAwZmYsIDB4YTA4NCwgMHgwMGZmLCAweDAwN2UsIDB4NjgwNCwgMHhhMDg0LAorCTB4MDAwOCwgMHgwMDdmLCAweDAwNDAsIDB4NDg2OCwgMHhhMGI4LCAweDQ2NjgsIDB4MDA3OCwgMHg0ODZhLAorCTB4YTBiOCwgMHg0NjYwLCAweGIyODQsIDB4MDEwMCwgMHgwMDQwLCAweDQ4NzEsIDB4N2UyMCwgMHgwMDc4LAorCTB4NDg3MiwgMHg3ZTI0LCAweGE2YjUsIDB4MDAwYywgMHg2ODFjLCAweGQwYjQsIDB4MDA0MCwgMHg0ODc5LAorCTB4YzY4NSwgMHgyNDAwLCAweGEzMDUsIDB4MDA0MCwgMHg0OGEzLCAweDJjNTgsIDB4MjcwNCwgMHg2MTA0LAorCTB4YWM2MCwgMHg2MDAwLCAweGE0MDAsIDB4NzAxYSwgMHg2MDA0LCAweGEzMDEsIDB4NzAxZSwgMHhhMTg0LAorCTB4MDAwOCwgMHgwMDQwLCAweDQ4OTMsIDB4NjAxMCwgMHhhMDgxLCAweDAwMDAsIDB4NzAyMiwgMHg2MDE0LAorCTB4YTA4MSwgMHgwMDAwLCAweDcwMjYsIDB4NjIwOCwgMHgyNDAwLCAweGEyMDIsIDB4NzAxMiwgMHg2MjBjLAorCTB4MjMwMCwgMHhhMjAzLCAweDcwMTYsIDB4NzYwMiwgMHg3MDA3LCAweDAwMDEsIDB4MmI2MCwgMHgxMDc4LAorCTB4NDk5YiwgMHgwMDc4LCAweDQ4YTUsIDB4MTA3OCwgMHg0OTcwLCAweDAwYzAsIDB4NDhhMywgMHgxMjdmLAorCTB4MjAwMCwgMHgwMDdjLCAweDEyN2UsIDB4MGQ3ZSwgMHg3MGQ0LCAweGEwODQsIDB4NDYwMCwgMHg4MDA0LAorCTB4MjA5MCwgMHgwZDdmLCAweDcwMDcsIDB4MDAwNCwgMHg3MDA0LCAweGQwOTQsIDB4MDBjMCwgMHg0OGI0LAorCTB4NzAwMywgMHgwMDA4LCAweDEyN2YsIDB4MjAwMCwgMHgwMDdjLCAweDEyN2UsIDB4MGQ3ZSwgMHg3MGQ0LAorCTB4YTA4NCwgMHg0NjAwLCAweDgwMDQsIDB4MDA3ZSwgMHgyMDkwLCAweDAwN2YsIDB4MGQ3ZiwgMHg3ZTIwLAorCTB4YjI4NCwgMHgwMTAwLCAweDAwYzAsIDB4NDhjZCwgMHg3ZTI0LCAweGE2YjUsIDB4MDAwYywgMHg2ODFjLAorCTB4ZDBhYywgMHgwMGMwLCAweDQ4ZDgsIDB4YzY4NSwgMHg3MDAzLCAweDAwMDAsIDB4NzAwNywgMHgwMDA0LAorCTB4NjgyOCwgMHgyMDUwLCAweDJkNjAsIDB4NjAwNCwgMHhhMGJjLCAweDAwMGYsIDB4YTdiOCwgMHg0NjZlLAorCTB4MjczYywgMHg4N2ZiLCAweDAwYzAsIDB4NDhlZSwgMHgwMDQ4LCAweDQ4ZTgsIDB4MTA3OCwgMHgyOTZiLAorCTB4Njg5YywgMHhhMDY1LCAweDAwNDAsIDB4NDhmMiwgMHgwMDc4LCAweDQ4ZGIsIDB4MTA3OCwgMHg0OTcwLAorCTB4MDBjMCwgMHg0OGVlLCAweDEyN2YsIDB4MjAwMCwgMHgwMDdjLCAweDEyN2UsIDB4MDA3ZSwgMHgwMTdlLAorCTB4MGQ3ZSwgMHg3MGQ0LCAweGEwODQsIDB4NDYwMCwgMHg4MDA0LCAweDAwN2UsIDB4MjA5MCwgMHgwMDdmLAorCTB4N2UyMCwgMHhiMjg0LCAweDAxMDAsIDB4MDBjMCwgMHg0OTA2LCAweDdlMjQsIDB4MGQ3ZiwgMHgwMzdmLAorCTB4MDQ3ZiwgMHhhNmI1LCAweDAwMGMsIDB4NjgxYywgMHhkMGI0LCAweDAwNDAsIDB4NDkxNCwgMHhjNjg1LAorCTB4NzAwMywgMHgwMDAwLCAweDcwMDcsIDB4MDAwNCwgMHgyMDQ5LCAweDQ4ZjUsIDB4NjgyOCwgMHhhMDU1LAorCTB4MGQ3ZSwgMHgwMDQwLCAweDQ5NmMsIDB4MmQ3MCwgMHgyZTYwLCAweDcwMDQsIDB4YTBiYywgMHgwMDBmLAorCTB4YTdiOCwgMHg0NjZlLCAweDI3M2MsIDB4ODdmYiwgMHgwMGMwLCAweDQ5MzEsIDB4MDA0OCwgMHg0OTJhLAorCTB4MTA3OCwgMHgyOTZiLCAweDcwOWMsIDB4YTA3NSwgMHgyMDYwLCAweDAwNDAsIDB4NDk2YywgMHgwMDc4LAorCTB4NDkxZCwgMHgyNzA0LCAweGFlNjgsIDB4NjgwOCwgMHhhNDIyLCAweDY4MGMsIDB4YTMxYiwgMHgwMDQ4LAorCTB4NDk0YSwgMHg4YTUxLCAweDAwYzAsIDB4NDkzZSwgMHgxMDc4LCAweDI5NmIsIDB4ODczOCwgMHgyNzA0LAorCTB4YTAwNSwgMHgwMGMwLCAweDQ5MzIsIDB4NzA5YywgMHhhMDc1LCAweDIwNjAsIDB4MDA0MCwgMHg0OTZjLAorCTB4MDA3OCwgMHg0OTFkLCAweDg0MjIsIDB4ODQyMCwgMHg4MzFhLCAweGEzOTksIDB4MDAwMCwgMHg2OTA4LAorCTB4MjQwMCwgMHhhMTIyLCAweDY5MGMsIDB4MjMwMCwgMHhhMTFiLCAweDAwYzgsIDB4NDk1OSwgMHgxMDc4LAorCTB4Mjk2YiwgMHhiMjg0LCAweDAxMDAsIDB4MDA0MCwgMHg0OTY3LCAweDIwMDEsIDB4NGUwNCwgMHgyMDA0LAorCTB4ZDBlYywgMHgwMGMwLCAweDQ5NjcsIDB4MjA3MSwgMHgwMDUwLCAweDAwNzgsIDB4NDk2OSwgMHgyMDcxLAorCTB4MDAyMCwgMHgwZDdmLCAweDAwNzgsIDB4NDg3OSwgMHgwZDdmLCAweDEyN2YsIDB4MjAwMCwgMHgwMDdjLAorCTB4NzAwOCwgMHgwMDdlLCAweGEwODQsIDB4MDFlMCwgMHgwMDdmLCAweDAwNDAsIDB4NDk3OSwgMHhhMDA2LAorCTB4MDA3YywgMHhhMDg0LCAweDAwMDMsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsIDB4NDk4MCwgMHgwMDdjLAorCTB4MjcwNCwgMHhhYzc4LCAweDc4MDAsIDB4NzAxYSwgMHg3ODA0LCAweDcwMWUsIDB4NzgwOCwgMHg3MDEyLAorCTB4NzgwYywgMHg3MDE2LCAweDYwMDQsIDB4YTA4NCwgMHgwMDA4LCAweDAwNDAsIDB4NDk5MywgMHg3ODEwLAorCTB4NzAyMiwgMHg3ODE0LCAweDcwMjYsIDB4NzYwMiwgMHg3MDA0LCAweGEwODQsIDB4MDAxMCwgMHhjMDg1LAorCTB4NzAwNiwgMHgyMDc5LCAweDRlMDAsIDB4OGE1MSwgMHgwMDQwLCAweDQ5YmYsIDB4ODczOCwgMHgyNzA0LAorCTB4YTAwNSwgMHgwMGMwLCAweDQ5YjEsIDB4NjA5YywgMHhhMDA1LCAweDAwNDAsIDB4NDljMCwgMHgyMDYwLAorCTB4NjAwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHg0NjZlLCAweDIwM2MsIDB4ODdmYiwgMHgxMDQwLAorCTB4Mjk2YiwgMHg3MDA4LCAweDAwN2UsIDB4YTA4NCwgMHgwMWUwLCAweDAwN2YsIDB4MDA0MCwgMHg0OWJiLAorCTB4YTAwNiwgMHgwMDc4LCAweDQ5YzAsIDB4YTA4NCwgMHgwMDAzLCAweGEwODYsIDB4MDAwMywgMHgwMDdjLAorCTB4MjA1MSwgMHgwMDAwLCAweDAwN2MsIDB4MTI3ZSwgMHgwMDdlLCAweDBkN2UsIDB4NzBkNCwgMHhhMDg0LAorCTB4NDYwMCwgMHg4MDA0LCAweDIwOTAsIDB4MGQ3ZiwgMHgwODdmLCAweDcxMDgsIDB4YTE4NCwgMHgwMDAzLAorCTB4MDBjMCwgMHg0OWQ4LCAweDY4MjgsIDB4YTAwNSwgMHgwMDQwLCAweDQ5ZTgsIDB4MDA3OCwgMHg0NWEyLAorCTB4NzEwOCwgMHhkMWZjLCAweDAwNDAsIDB4NDllMCwgMHgxMDc4LCAweDQ3NjksIDB4MDA3OCwgMHg0OWNkLAorCTB4NzAwNywgMHgwMDEwLCAweDcxMDgsIDB4ZDFmYywgMHgwMDQwLCAweDQ5ZTIsIDB4MTA3OCwgMHg0NzY5LAorCTB4NzAwOCwgMHhhMDg2LCAweDAwMDgsIDB4MDBjMCwgMHg0OWNkLCAweDcwMDAsIDB4YTAwNSwgMHgwMGMwLAorCTB4NDljZCwgMHg3MDAzLCAweDAwMDAsIDB4MjA0OSwgMHgwMDAwLCAweDEyN2YsIDB4MjAwMCwgMHgwMDdjLAorCTB4MTI3ZSwgMHgxNDdlLCAweDEzN2UsIDB4MTU3ZSwgMHgwYzdlLCAweDBkN2UsIDB4NzBkNCwgMHhhMDg0LAorCTB4NDYwMCwgMHg4MDA0LCAweDIwOTAsIDB4MGQ3ZiwgMHgyMDQ5LCAweDQ5ZjgsIDB4YWQ4MCwgMHgwMDExLAorCTB4MjBhMCwgMHhiMjg0LCAweDAxMDAsIDB4MDA0MCwgMHg0YTFiLCAweDIwMDEsIDB4NGUwNCwgMHgyMDA0LAorCTB4ZDBlYywgMHgwMDQwLCAweDRhMTcsIDB4MjA5OSwgMHgwMDMxLCAweDAwNzgsIDB4NGExZCwgMHgyMDk5LAorCTB4MDAzMiwgMHgwMDc4LCAweDRhMWQsIDB4MjA5OSwgMHgwMDMxLCAweDcwMGMsIDB4YTA4NCwgMHgwM2ZmLAorCTB4NjgyYSwgMHg3MDA3LCAweDAwMDgsIDB4NzAwNywgMHgwMDAyLCAweDcwMDMsIDB4MDAwMSwgMHgwMDQwLAorCTB4NGEyYywgMHg4MDAwLCAweDgwYWMsIDB4NTNhNSwgMHg3MDBjLCAweGEwODQsIDB4MDNmZiwgMHgwMDQwLAorCTB4NGEzOCwgMHg3MDA3LCAweDAwMDQsIDB4NzAwNCwgMHhhMDg0LCAweDAwMDQsIDB4MDBjMCwgMHg0YTMzLAorCTB4MGM3ZiwgMHgyMDQ5LCAweDAwMDAsIDB4NzAwMywgMHgwMDAwLCAweDE1N2YsIDB4MTM3ZiwgMHgxNDdmLAorCTB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4MjA5MSwgMHg4MDAwLCAweDIwOTEsIDB4NjAwMCwgMHg3OGFjLAorCTB4YTAwNSwgMHgwMGMwLCAweDRhNWEsIDB4Nzk3NCwgMHg3MGQwLCAweGExMDYsIDB4MDBjMCwgMHg0YTVhLAorCTB4NzgxYywgMHhhMDA1LCAweDAwNDAsIDB4NGE1YSwgMHg3ODFmLCAweDAwMDAsIDB4MDA2OCwgMHg0YTVhLAorCTB4MjA5MSwgMHg0MDgwLCAweDc4MzAsIDB4ODAwMSwgMHg3ODMyLCAweDAwYzAsIDB4NGFlMiwgMHg3ODM0LAorCTB4NzgzMiwgMHg3ODEwLCAweGQwZWMsIDB4MDBjMCwgMHg0YWRiLCAweDIwNjEsIDB4NzNjMCwgMHgyMDY5LAorCTB4NGU4MCwgMHhjN2ZkLCAweDY4ZDAsIDB4YTAwNSwgMHgwMDQwLCAweDRhNzQsIDB4ODAwMSwgMHg2OGQyLAorCTB4MDBjMCwgMHg0YTc0LCAweDEwNzgsIDB4NGNiMCwgMHg2ODAwLCAweGEwODQsIDB4MDAwZiwgMHgwMDQwLAorCTB4NGE4OSwgMHhhMDg2LCAweDAwMDEsIDB4MDA0MCwgMHg0YTg5LCAweDY4NDQsIDB4YTAwZCwgMHgwMDQwLAorCTB4NGE4OSwgMHgyMTA0LCAweGEwMDUsIDB4MDA0MCwgMHg0YTg5LCAweDgwMDEsIDB4MjAwYSwgMHgwMDQwLAorCTB4NGMyMywgMHg2ODE0LCAweGEwMDUsIDB4MDA0MCwgMHg0YWFlLCAweDgwMDEsIDB4NjgxNiwgMHgwMGMwLAorCTB4NGFhZSwgMHg2OGE3LCAweDAwMDEsIDB4MGY3ZSwgMHhkN2ZjLCAweDAwYzAsIDB4NGFhMywgMHg3ODEwLAorCTB4ZDBlYywgMHgwMDQwLCAweDRhOWYsIDB4MjA3OSwgMHgwMTAwLCAweDAwNzgsIDB4NGFhNSwgMHgyMDc5LAorCTB4MDIwMCwgMHgwMDc4LCAweDRhYTUsIDB4MjA3OSwgMHgwMTAwLCAweDEwNzgsIDB4NDM4MywgMHgwZjdmLAorCTB4Njg2NCwgMHhhMDA1LCAweDAwNDAsIDB4NGFhZSwgMHgxMDc4LCAweDI2MjgsIDB4Njg4MCwgMHhhMDA1LAorCTB4MDA0MCwgMHg0YWJiLCAweDgwMDEsIDB4Njg4MiwgMHgwMGMwLCAweDRhYmIsIDB4Njg2NywgMHgwMDAwLAorCTB4NjhkNCwgMHhjMGRkLCAweDY4ZDYsIDB4NjhkNCwgMHhkMGZjLCAweDAwNDAsIDB4NGFkOCwgMHhjMGZjLAorCTB4NjhkNiwgMHgyMGE5LCAweDAyMDAsIDB4NjAzNCwgMHhhMDA1LCAweDAwNDAsIDB4NGFkNCwgMHg4MDAxLAorCTB4NjAzNiwgMHg2OGQ0LCAweGMwZmQsIDB4NjhkNiwgMHgwMGMwLCAweDRhZDQsIDB4NjAxMCwgMHhhMDA1LAorCTB4MDA0MCwgMHg0YWQ0LCAweDEwNzgsIDB4MjYyOCwgMHhhY2UwLCAweDAwMTAsIDB4MDBmMCwgMHg0YWMzLAorCTB4ZDdmYywgMHgwMDQwLCAweDRhZTIsIDB4MjA2MSwgMHg1M2MwLCAweDIwNjksIDB4NGU0MCwgMHhjN2ZjLAorCTB4MDA3OCwgMHg0YTZhLCAweDEwNzgsIDB4NGIxZSwgMHg3ODM4LCAweDgwMDEsIDB4NzgzYSwgMHgwMGMwLAorCTB4NGIwNCwgMHg3ODNjLCAweDc4M2EsIDB4MjA2MSwgMHg1M2MwLCAweDIwNjksIDB4NGU0MCwgMHhjN2ZjLAorCTB4NjgwYywgMHhhMDA1LCAweDAwNDAsIDB4NGFmNiwgMHgxMDc4LCAweDRiODgsIDB4ZDdmYywgMHgwMGMwLAorCTB4NGIwNCwgMHg3ODEwLCAweGQwZWMsIDB4MDBjMCwgMHg0YjA0LCAweDIwNjEsIDB4NzNjMCwgMHgyMDY5LAorCTB4NGU4MCwgMHhjN2ZkLCAweDAwNzgsIDB4NGFmMCwgMHg3ODE0LCAweGQwZTQsIDB4MDBjMCwgMHg0YjA4LAorCTB4NzgxMCwgMHhkMGNjLCAweDAwNDAsIDB4NGIxYiwgMHhkMGFjLCAweDAwYzAsIDB4NGIxNCwgMHhkMGE0LAorCTB4MDA0MCwgMHg0YjFiLCAweGMwYWQsIDB4NzgxMiwgMHgyMDkxLCAweDgwMDEsIDB4MDA2OCwgMHg0YjFhLAorCTB4MTA3OCwgMHgyMzk1LCAweDAwN2MsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4Nzg0MCwgMHg4MDAxLAorCTB4Nzg0MiwgMHgwMGMwLCAweDRiODcsIDB4Nzg0NCwgMHg3ODQyLCAweDIwNjksIDB4NGU0MCwgMHhjN2ZjLAorCTB4NzgxMCwgMHgyMDc5LCAweDAyMDAsIDB4ZDBlYywgMHgwMDQwLCAweDRiMzAsIDB4MjA3OSwgMHgwMTAwLAorCTB4NjhkOCwgMHhhMDA1LCAweDAwNDAsIDB4NGIzYywgMHg3ZGUwLCAweGE1MDQsIDB4MDBjMCwgMHg0YjNjLAorCTB4NjhkYSwgMHg2OGQ0LCAweGMwYmMsIDB4NjhkNiwgMHgyMDc5LCAweDRlMDAsIDB4NjgxMCwgMHhhMDA1LAorCTB4MDBjMCwgMHg0YjQ0LCAweDIwMDEsIDB4MDEwMSwgMHg4MDAxLCAweDY4MTIsIDB4ZDdmYywgMHgwMDQwLAorCTB4NGI0ZCwgMHhhMDgwLCAweDk0ZDAsIDB4MDA3OCwgMHg0YjRmLCAweGEwODAsIDB4OTNjMCwgMHgyMDQwLAorCTB4MjAwNCwgMHhhMDY1LCAweDAwNDAsIDB4NGI3OSwgMHg2MDI0LCAweGEwMDUsIDB4MDA0MCwgMHg0Yjc1LAorCTB4ODAwMSwgMHg2MDI2LCAweDAwYzAsIDB4NGI3NSwgMHg2ODAwLCAweGEwMDUsIDB4MDA0MCwgMHg0YjY4LAorCTB4Njg0YywgMHhhYzA2LCAweDAwYzAsIDB4NGI2OCwgMHgxMDc4LCAweDRjMjMsIDB4MDA3OCwgMHg0Yjc5LAorCTB4Njg2NCwgMHhhMDA1LCAweDAwNDAsIDB4NGI3MCwgMHg2MDI3LCAweDAwMDEsIDB4MDA3OCwgMHg0Yjc1LAorCTB4MTA3OCwgMHg0YmQ2LCAweDI4MDQsIDB4MDA3OCwgMHg0YjUxLCAweDYwMDAsIDB4MmM0MCwgMHgwMDc4LAorCTB4NGI1MSwgMHhkN2ZjLCAweDAwYzAsIDB4NGI4NywgMHg3ODEwLCAweGQwZWMsIDB4MDBjMCwgMHg0Yjg3LAorCTB4MjA2OSwgMHg0ZTgwLCAweGM3ZmQsIDB4MjA3OSwgMHgwMTAwLCAweDAwNzgsIDB4NGIzMCwgMHgwMDdjLAorCTB4MjAwOSwgMHgwMDAwLCAweDIwYTksIDB4MDIwMCwgMHg2MDA4LCAweGQwOWMsIDB4MDA0MCwgMHg0YmMyLAorCTB4NjAyNCwgMHhhMDA1LCAweDAwNDAsIDB4NGI5OCwgMHg4MDAxLCAweDYwMjYsIDB4MDA3OCwgMHg0YmMwLAorCTB4NjAwOCwgMHhjMDljLCAweGQwODQsIDB4MDBjMCwgMHg0YmEwLCAweGQwYWMsIDB4MDA0MCwgMHg0YmJhLAorCTB4NjAwYSwgMHg2MDA0LCAweGEwMDUsIDB4MDA0MCwgMHg0YmMyLCAweDBkN2UsIDB4MGM3ZSwgMHgwMTdlLAorCTB4MjA2OCwgMHg2MDEwLCAweDgwMDEsIDB4NjAxMiwgMHgxMDc4LCAweDNkZDAsIDB4MmQwMCwgMHgyYzY4LAorCTB4MjA2MCwgMHgxMDc4LCAweDFlNWIsIDB4MTA3OCwgMHgyMDFkLCAweDAxN2YsIDB4MGM3ZiwgMHgwZDdmLAorCTB4MDA3OCwgMHg0YmMyLCAweGMwYmQsIDB4NjAwYSwgMHhhMThkLCAweDAwMDEsIDB4MDA3OCwgMHg0YmMyLAorCTB4YTE4ZCwgMHgwMTAwLCAweGFjZTAsIDB4MDAxMCwgMHgwMGYwLCAweDRiOGMsIDB4YTE4NCwgMHgwMDAxLAorCTB4MDA0MCwgMHg0YmQxLCAweGExOGMsIDB4ZmZmZSwgMHg2OTBlLCAweDEwNzgsIDB4MjYyOCwgMHgwMDc4LAorCTB4NGJkMiwgMHg2OTBlLCAweDAwN2MsIDB4MDBjMCwgMHg0YmQyLCAweDc4NmMsIDB4MmMwMCwgMHg2ODdlLAorCTB4NjcxNCwgMHg2Zjc2LCAweDYwMTcsIDB4MDAwMCwgMHg2MDJiLCAweDAwMDAsIDB4NjAxYiwgMHgwMDA2LAorCTB4NjBiNCwgMHhhMDg0LCAweDNmMDAsIDB4NjAxZSwgMHg2MDIwLCAweGEwODQsIDB4MDBmZiwgMHhhMDg1LAorCTB4MDA2MCwgMHg2MDIyLCAweDYwMDAsIDB4MjA0MiwgMHgxMDc4LCAweDFkZTQsIDB4NjgxOCwgMHhhMDA1LAorCTB4MDA0MCwgMHg0YmY0LCAweDgwMDEsIDB4NjgxYSwgMHg2ODA4LCAweGMwYTQsIDB4NjgwYSwgMHg2ODEwLAorCTB4NzkwOCwgMHg4MTA5LCAweDc5MGEsIDB4ODAwMSwgMHgwMGQwLCAweDRjMDAsIDB4MTA3OCwgMHgyOTZiLAorCTB4NjgxMiwgMHgwMGMwLCAweDRjMDYsIDB4NzkxMCwgMHhjMWE1LCAweDc5MTIsIDB4NjAyZiwgMHgwMDAwLAorCTB4NjAzMywgMHgwMDAwLCAweDJjNjgsIDB4MTA3OCwgMHgyMDJjLCAweGQ3ZmMsIDB4MDBjMCwgMHg0YzE0LAorCTB4MjA2OSwgMHg0ZTQwLCAweDAwNzgsIDB4NGMxNiwgMHgyMDY5LCAweDRlODAsIDB4NjkxMCwgMHhhMTg0LAorCTB4MDEwMCwgMHgyMDAxLCAweDAwMDYsIDB4MDBjMCwgMHg0YzIwLCAweDY5N2EsIDB4MjAwMSwgMHgwMDA0LAorCTB4MTA3OCwgMHgyNjFjLCAweDAwN2MsIDB4MGQ3ZSwgMHg2OTRjLCAweDIxNjAsIDB4ZDdmYywgMHgwMGMwLAorCTB4NGMzNSwgMHg3ODEwLCAweGQwZWMsIDB4MDA0MCwgMHg0YzMxLCAweDIwNjksIDB4MDEwMCwgMHgwMDc4LAorCTB4NGMzNywgMHgyMDY5LCAweDAyMDAsIDB4MDA3OCwgMHg0YzM3LCAweDIwNjksIDB4MDEwMCwgMHgxMDc4LAorCTB4MjhkZiwgMHg2MDFiLCAweDAwMDYsIDB4Njg1OCwgMHhhMDg0LCAweDNmMDAsIDB4NjAxZSwgMHg2MDIwLAorCTB4YTA4NCwgMHgwMGZmLCAweGEwODUsIDB4MDA0OCwgMHg2MDIyLCAweDYwMmYsIDB4MDAwMCwgMHg2MDMzLAorCTB4MDAwMCwgMHg2ODA4LCAweGEwODQsIDB4ZmZmZCwgMHg2ODBhLCAweDY4MzAsIDB4ZDBiNCwgMHgwMDQwLAorCTB4NGM2OSwgMHg2ODRiLCAweDAwMDQsIDB4MjBhOSwgMHgwMDE0LCAweDY4NDgsIDB4ZDA5NCwgMHgwMDQwLAorCTB4NGM1YiwgMHgwMGYwLCAweDRjNTUsIDB4Njg0YiwgMHgwMDA5LCAweDIwYTksIDB4MDAxNCwgMHg2ODQ4LAorCTB4ZDA4NCwgMHgwMDQwLCAweDRjNjUsIDB4MDBmMCwgMHg0YzVmLCAweDIwYTksIDB4MDBmYSwgMHgwMGYwLAorCTB4NGM2NywgMHg2ODFiLCAweDAwNDcsIDB4MGQ3ZiwgMHg2ODY3LCAweDAwMDcsIDB4MDA3YywgMHgyMDc5LAorCTB4NGUwMCwgMHgxMDc4LCAweDRjYTMsIDB4MTA3OCwgMHg0Yzg5LCAweDEwNzgsIDB4NGM5NiwgMHgyMDA5LAorCTB4MDAwMiwgMHgyMDY5LCAweDRlODAsIDB4NjgwZiwgMHgwMDAwLCAweDY4MTMsIDB4MDAwMCwgMHg2ODE3LAorCTB4MDAwMCwgMHg4MTA5LCAweDAwNDAsIDB4NGM4OCwgMHgyMDY5LCAweDRlNDAsIDB4MDA3OCwgMHg0YzdiLAorCTB4MDA3YywgMHg3ODEwLCAweGQwZWMsIDB4MDA0MCwgMHg0YzkxLCAweDIwMTksIDB4MDBjYywgMHgwMDc4LAorCTB4NGM5MywgMHgyMDE5LCAweDAwN2IsIDB4N2IzYSwgMHg3YjNlLCAweDAwN2MsIDB4NzgxNCwgMHhkMGU0LAorCTB4MDBjMCwgMHg0YzllLCAweDIwMTksIDB4MDA0MCwgMHgwMDc4LCAweDRjYTAsIDB4MjAxOSwgMHgwMDI2LAorCTB4N2I0MiwgMHg3YjQ2LCAweDAwN2MsIDB4NzgxNCwgMHhkMGU0LCAweDAwYzAsIDB4NGNhYiwgMHgyMDE5LAorCTB4M2Y5NCwgMHgwMDc4LCAweDRjYWQsIDB4MjAxOSwgMHgyNjI0LCAweDdiMzIsIDB4N2IzNiwgMHgwMDdjLAorCTB4NmE1MCwgMHhhMjg1LCAweDAwMDAsIDB4MDA0MCwgMHg0Y2RjLCAweDY5NTQsIDB4NmJjMCwgMHhhMzAwLAorCTB4MGM3ZSwgMHgyMTY0LCAweDYzMDQsIDB4ODNmZiwgMHgwMGMwLCAweDRjYzgsIDB4ODIxMSwgMHgwMDQwLAorCTB4NGNjYywgMHg4MTA4LCAweGExMWEsIDB4MDA0OCwgMHg0Y2I5LCAweDY5YzAsIDB4MDA3OCwgMHg0Y2I5LAorCTB4NjhkMywgMHgwMDBhLCAweDBjN2YsIDB4MDA3YywgMHg2OTUwLCAweDZhYzAsIDB4MjI2NCwgMHg2MDJiLAorCTB4MDAwMCwgMHg2MDJmLCAweDAwMDAsIDB4NjAwOCwgMHhjMGI1LCAweDYwMGEsIDB4ODIxMCwgMHg4MTA5LAorCTB4MDBjMCwgMHg0Y2NlLCAweDY5NTIsIDB4MGM3ZiwgMHgwMDdjLCAweDAwZTAsIDB4NGNkZCwgMHgyMDkxLAorCTB4NjAwMCwgMHgwMGUwLCAweDRjZTEsIDB4MjA5MSwgMHg2MDAwLCAweDcwZWMsIDB4ZDBkYywgMHgwMGMwLAorCTB4NGNlZSwgMHhkMGQ0LCAweDAwNDAsIDB4NGQxNywgMHgwMDc4LCAweDRkMWEsIDB4MjAwOCwgMHg3ODEwLAorCTB4ZDBlYywgMHgwMDQwLCAweDRkMDEsIDB4ZDFjNCwgMHgwMGMwLCAweDRkMzksIDB4NzgxNCwgMHhjMGM1LAorCTB4NzgxNiwgMHg3ODEwLCAweGMwZjUsIDB4NzgxMiwgMHhkMGVjLCAweDAwNDAsIDB4NGQzNSwgMHgwMDc4LAorCTB4NGQzMSwgMHhhZThlLCAweDAxMDAsIDB4MDA0MCwgMHg0ZDBlLCAweDc4MTQsIDB4YzBmNSwgMHhjMGM1LAorCTB4NzgxNiwgMHhkMGQ0LCAweDAwYzAsIDB4NGQzNSwgMHgwMDc4LCAweDRkMzEsIDB4NzgxNCwgMHhjMGZkLAorCTB4YzBjNSwgMHg3ODE2LCAweGQwZDQsIDB4MDBjMCwgMHg0ZDM1LCAweDAwNzgsIDB4NGQzMSwgMHhkMGU0LAorCTB4MDA0MCwgMHg0ZDM3LCAweDAwZTAsIDB4NGQxYSwgMHgyMDkxLCAweDYwMDAsIDB4MjAwOSwgMHgwMDBjLAorCTB4MDBlMCwgMHg0ZDIwLCAweDIwOTEsIDB4NjAwMCwgMHg4MTA5LCAweDAwYzAsIDB4NGQyMCwgMHg3MGU0LAorCTB4YTA4NCwgMHgwMWZmLCAweGEwODYsIDB4MDFmZiwgMHgwMGMwLCAweDRkMzEsIDB4NzBlYywgMHgwMDc4LAorCTB4NGNlZSwgMHg3ODA0LCAweGQwOGMsIDB4MDA0MCwgMHg0ZDM3LCAweDY4MWYsIDB4MDAwYywgMHg3MGEwLAorCTB4NzBhMiwgMHgwMDdjLCAweDIwNWIKK307CisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCAgIGZ3MTI4MGVpX2xlbmd0aDAxID0gMHgzZDNiOworI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCAgIHJpc2NfY29kZV9sZW5ndGgwMSA9IDB4M2QzYjsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTEyODAuYyBiL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFkMjgwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMKQEAgLTAsMCArMSw0ODYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgUUxPR0lDIExJTlVYIFNPRlRXQVJFCisqCisqIFFMb2dpYyAgUUxBMTI4MCAoVWx0cmEyKSAgYW5kICBRTEExMjE2MCAoVWx0cmEzKSBTQ1NJIGRyaXZlcgorKiBDb3B5cmlnaHQgKEMpIDIwMDAgUWxvZ2ljIENvcnBvcmF0aW9uICh3d3cucWxvZ2ljLmNvbSkKKyogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgSmVzIFNvcmVuc2VuLCBXaWxkIE9wZW4gU291cmNlIEluYy4KKyogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgQ2hyaXN0b3BoIEhlbGx3aWcKKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyogbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUUxBMTI4MF9WRVJTSU9OICAgICAgIjMuMjUiCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFJldiAgMy4yNS4xLCBGZWJydWFyeSAxMCwgMjAwNSBDaHJpc3RvcGggSGVsbHdpZworCS0gdXNlIHBjaV9tYXBfc2luZ2xlIHRvIG1hcCBub24tUy9HIHJlcXVlc3RzCisJLSByZW1vdmUgcWxhMTI4MF9wcm9jX2luZm8KKyAgICBSZXYgIDMuMjUsIFNlcHRlbWJlciAyOCwgMjAwNCwgQ2hyaXN0b3BoIEhlbGx3aWcKKwktIGFkZCBzdXBwb3J0IGZvciBJU1AxMDIwLzEwNDAKKwktIGRvbid0IGluY2x1ZGUgInNjc2kuaCIgYW55bW9yZSBmb3IgMi42LngKKyAgICBSZXYgIDMuMjQuNCBKdW5lIDcsIDIwMDQgQ2hyaXN0b3BoIEhlbGx3aWcKKwktIHJlc3RydWN0dXJlIGZpcm13YXJlIGxvYWRpbmcsIGNsZWFudXAgaW5pdGlhbGl6YXRpb24gY29kZQorCS0gcHJlcGFyZSBzdXBwb3J0IGZvciBJU1AxMDIwLzEwNDAgY2hpcHMKKyAgICBSZXYgIDMuMjQuMyBKYW51YXJ5IDE5LCAyMDA0LCBKZXMgU29yZW5zZW4KKwktIEhhbmRsZSBQQ0kgRE1BIG1hc2sgc2V0dGluZ3MgY29ycmVjdGx5CisJLSBDb3JyZWN0IG9yZGVyIG9mIGVycm9yIGhhbmRsaW5nIGluIHByb2JlX29uZSwgZnJlZV9pcnEgc2hvdWxkIG5vdAorCSAgYmUgY2FsbGVkIGlmIHJlcXVlc3RfaXJxIGZhaWxlZAorICAgIFJldiAgMy4yNC4yIEphbnVhcnkgMTksIDIwMDQsIEphbWVzIEJvdHRvbWxleSAmIEFuZHJldyBWYXNxdWV6CisJLSBCaWcgZW5kaWFuIGZpeGVzIChKYW1lcykKKwktIFJlbW92ZSBib2d1cyBJT0NCIGNvbnRlbnQgb24gemVybyBkYXRhIHRyYW5zZmVyIGNvbW1hbmRzIChBbmRyZXcpCisgICAgUmV2ICAzLjI0LjEgSmFudWFyeSA1LCAyMDA0LCBKZXMgU29yZW5zZW4KKwktIEluaXRpYWxpemUgY29tcGxldGlvbiBxdWV1ZSB0byBhdm9pZCBPT1BTIG9uIHByb2JlCisJLSBIYW5kbGUgaW50ZXJydXB0cyBkdXJpbmcgbWFpbGJveCB0ZXN0aW5nCisgICAgUmV2ICAzLjI0IE5vdmVtYmVyIDE3LCAyMDAzLCBDaHJpc3RvcGggSGVsbHdpZworICAgIAktIHVzZSBzdHJ1Y3QgbGlzdF9oZWFkIGZvciBjb21wbGV0aW9uIHF1ZXVlCisJLSBhdm9pZCBvbGQgU2NzaV9GT08gdHlwZWRlZnMKKwktIGNsZWFudXAgMi40IGNvbXBhdCBnbHVlIGEgYml0CisJLSB1c2UgPHNjc2kvc2NzaV8qLmg+IGhlYWRlcnMgb24gMi42IGluc3RlYWQgb2YgInNjc2kuaCIKKwktIG1ha2UgaW5pdGlhbGl6YXRpb24gZm9yIG1lbW9yeSBtYXBwZWQgdnMgcG9ydCBJL08gbW9yZSBzaW1pbGFyCisJLSByZW1vdmUgYnJva2VuIHBjaSBjb25maWcgc3BhY2UgbWFuaXB1bGF0aW9uCisJLSBraWxsIG1vcmUgY3J1ZnQKKwktIHRoaXMgaXMgYW4gYWxtb3N0IHBlcmZlY3QgMi42IHNjc2kgZHJpdmVyIG5vdyEgOykKKyAgICBSZXYgIDMuMjMuMzkgRGVjZW1iZXIgMTcsIDIwMDMsIEplcyBTb3JlbnNlbgorCS0gRGVsZXRlIGNvbXBsZXRpb24gcXVldWUgZnJvbSBzcmIgaWYgbWFpbGJveCBjb21tYW5kIGZhaWxlZCB0bworCSAgdG8gYXZvaWQgcWxhMTI4MF9kb25lIGNvbXBsZXRldGluZyBxbGExMjgwX2Vycm9yX2FjdGlvbidzCisJICBvYnNvbGV0ZSBjb250ZXh0CisJLSBSZWR1Y2UgYXJndW1lbnRzIGZvciBxbGExMjgwX2RvbmUKKyAgICBSZXYgIDMuMjMuMzggT2N0b2JlciAxOCwgMjAwMywgQ2hyaXN0b3BoIEhlbGx3aWcKKwktIENvbnZlcnQgdG8gbmV3LXN0eWxlIGhvdHBsdWdhYmxlIGRyaXZlciBmb3IgMi42CisJLSBGaXggbWlzc2luZyBzY3NpX3VucmVnaXN0ZXIvc2NzaV9ob3N0X3B1dCBvbiBIQkEgcmVtb3ZhbAorCS0gS2lsbCBzb21lIG1vcmUgY3J1ZnQKKyAgICBSZXYgIDMuMjMuMzcgT2N0b2JlciAxLCAyMDAzLCBKZXMgU29yZW5zZW4KKwktIE1ha2UgTU1JTyBkZXBlbmQgb24gQ09ORklHX1g4Nl9WSVNXUyBpbnN0ZWFkIG9mIHlldCBhbm90aGVyCisJICByYW5kb20gQ09ORklHIG9wdGlvbgorCS0gQ2xlYW4gdXAgbG9ja2luZyBpbiBwcm9iZSBwYXRoCisgICAgUmV2ICAzLjIzLjM2IE9jdG9iZXIgMSwgMjAwMywgQ2hyaXN0b3BoIEhlbGx3aWcKKwktIHF1ZXVlY29tbWFuZCBvbmx5IGV2ZXIgcmVjZWl2ZXMgbmV3IGNvbW1hbmRzIC0gY2xlYXIgZmxhZ3MKKwktIFJlaW50ZWdyYXRlIGxvc3QgZml4ZXMgZnJvbSBMaW51eCAyLjUKKyAgICBSZXYgIDMuMjMuMzUgQXVndXN0IDE0LCAyMDAzLCBKZXMgU29yZW5zZW4KKwktIEJ1aWxkIGFnYWluc3QgMi42CisgICAgUmV2ICAzLjIzLjM0IEp1bHkgMjMsIDIwMDMsIEplcyBTb3JlbnNlbgorCS0gUmVtb3ZlIHBvaW50bGVzcyBUUlVFL0ZBTFNFIG1hY3JvcworCS0gQ2xlYW4gdXAgdmNoYW4gaGFuZGxpbmcKKyAgICBSZXYgIDMuMjMuMzMgSnVseSAzLCAyMDAzLCBKZXMgU29yZW5zZW4KKwktIERvbid0IGRlZmluZSByZWdpc3RlciBhY2Nlc3MgbWFjcm9zIGJlZm9yZSBkZWZpbmUgZGV0ZXJtaW5pbmcgTU1JTy4KKwkgIFRoaXMganVzdCBoYXBwZW5kIHRvIHdvcmsgb3V0IG9uIGlhNjQgYnV0IG5vdCBlbHNld2hlcmUuCisJLSBEb24ndCB0cnkgYW5kIHJlYWQgZnJvbSB0aGUgY2FyZCB3aGlsZSBpdCBpcyBpbiByZXNldCBhcworCSAgaXQgd29uJ3QgcmVzcG9uZCBhbmQgY2F1c2VzIGFuIE1DQQorICAgIFJldiAgMy4yMy4zMiBKdW5lIDIzLCAyMDAzLCBKZXMgU29yZW5zZW4KKwktIEJhc2ljIHN1cHBvcnQgZm9yIGJvb3QgdGltZSBhcmd1bWVudHMKKyAgICBSZXYgIDMuMjMuMzEgSnVuZSA4LCAyMDAzLCBKZXMgU29yZW5zZW4KKwktIFJlZHVjZSBib290IHRpbWUgbWVzc2FnZXMKKyAgICBSZXYgIDMuMjMuMzAgSnVuZSA2LCAyMDAzLCBKZXMgU29yZW5zZW4KKwktIERvIG5vdCBlbmFibGUgc3luYy93aWRlL3BwciBiZWZvcmUgaXQgaGFzIGJlZW4gZGV0ZXJtaW5lZAorCSAgdGhhdCB0aGUgdGFyZ2V0IGRldmljZSBhY3R1YWxseSBzdXBwb3J0cyBpdAorCS0gRW5hYmxlIERNQSBhcmJpdHJhdGlvbiBmb3IgbXVsdGkgY2hhbm5lbCBjb250cm9sbGVycworICAgIFJldiAgMy4yMy4yOSBKdW5lIDMsIDIwMDMsIEplcyBTb3JlbnNlbgorCS0gUG9ydCB0byAyLjUuNjkKKyAgICBSZXYgIDMuMjMuMjggSnVuZSAzLCAyMDAzLCBKZXMgU29yZW5zZW4KKwktIEVsaW1pbmF0ZSBkdXBsaWNhdGUgbWFya2VyIGNvbW1hbmRzIG9uIGJ1cyByZXNldHMKKwktIEhhbmRsZSBvdXRzdGFuZGluZyBjb21tYW5kcyBhcHByb3ByaWF0ZWx5IG9uIGJ1cy9kZXZpY2UgcmVzZXRzCisgICAgUmV2ICAzLjIzLjI3IE1heSAyOCwgMjAwMywgSmVzIFNvcmVuc2VuCisJLSBSZW1vdmUgYm9ndXMgaW5wdXQgcXVldWUgY29kZSwgbGV0IHRoZSBMaW51eCBTQ1NJIGxheWVyIGRvIHRoZSB3b3JrCisJLSBDbGVhbiB1cCBOVlJBTSBoYW5kbGluZywgb25seSByZWFkIGl0IG9uY2UgZnJvbSB0aGUgY2FyZAorCS0gQWRkIGEgbnVtYmVyIG9mIG1pc3NpbmcgZGVmYXVsdCBudnJhbSBwYXJhbWV0ZXJzCisgICAgUmV2ICAzLjIzLjI2IEJldGEgTWF5IDI4LCAyMDAzLCBKZXMgU29yZW5zZW4KKwktIFVzZSBjb21wbGV0aW9uIHF1ZXVlIGZvciBtYWlsYm94IGNvbW1hbmRzIGluc3RlYWQgb2YgYnVzeSB3YWl0CisgICAgUmV2ICAzLjIzLjI1IEJldGEgTWF5IDI3LCAyMDAzLCBKYW1lcyBCb3R0b21sZXkKKwktIE1pZ3JhdGUgdG8gdXNlIG5ldyBlcnJvciBoYW5kbGluZyBjb2RlCisgICAgUmV2ICAzLjIzLjI0IEJldGEgTWF5IDIxLCAyMDAzLCBKYW1lcyBCb3R0b21sZXkKKwktIEJpZyBlbmRpYW4gc3VwcG9ydAorCS0gQ2xlYW51cCBkYXRhIGRpcmVjdGlvbiBjb2RlCisgICAgUmV2ICAzLjIzLjIzIEJldGEgTWF5IDEyLCAyMDAzLCBKZXMgU29yZW5zZW4KKwktIFN3aXRjaCB0byB1c2luZyBNTUlPIGluc3RlYWQgb2YgUElPCisgICAgUmV2ICAzLjIzLjIyIEJldGEgQXByaWwgMTUsIDIwMDMsIEplcyBTb3JlbnNlbgorCS0gRml4IFBDSSBwYXJpdHkgcHJvYmxlbSB3aXRoIDEyMTYwIGR1cmluZyByZXNldC4KKyAgICBSZXYgIDMuMjMuMjEgQmV0YSBBcHJpbCAxNCwgMjAwMywgSmVzIFNvcmVuc2VuCisJLSBVc2UgcGNpX21hcF9wYWdlKCkvcGNpX3VubWFwX3BhZ2UoKSBpbnN0ZWFkIG9mIG1hcF9zaW5nbGUgdmVyc2lvbi4KKyAgICBSZXYgIDMuMjMuMjAgQmV0YSBBcHJpbCA5LCAyMDAzLCBKZXMgU29yZW5zZW4KKwktIFJlbW92ZSA8IDIuNC54IHN1cHBvcnQKKwktIEludHJvZHVjZSBIT1NUX0xPQ0sgdG8gbWFrZSB0aGUgc3BpbiBsb2NrIGNoYW5nZXMgcG9ydGFibGUuCisJLSBSZW1vdmUgYSBidW5jaCBvZiBpZGlvdGljIGFuZCB1bm5lY2Vzc2FyeSB0eXBlZGVmJ3MKKwktIEtpbGwgYWxsIGxlZnRvdmVycyBvZiB0YXJnZXQtbW9kZSBzdXBwb3J0IHdoaWNoIG5ldmVyIHdvcmtlZCBhbnl3YXkKKyAgICBSZXYgIDMuMjMuMTkgQmV0YSBBcHJpbCAxMSwgMjAwMiwgTGludXMgVG9ydmFsZHMKKwktIERvIHFsYTEyODBfcGNpX2NvbmZpZygpIGJlZm9yZSBjYWxsaW5nIHJlcXVlc3RfaXJxKCkgYW5kCisJICByZXF1ZXN0X3JlZ2lvbigpCisJLSBVc2UgcGNpX2RtYV9oaTMyKCkgdG8gaGFuZGxlIHVwcGVyIHdvcmQgb2YgRE1BIGFkZHJlc3NlcyBpbnN0ZWFkCisJICBvZiBsYXJnZSBzaGlmdHMKKwktIEhhbmQgY29ycmVjdCBhcmd1bWVudHMgdG8gZnJlZV9pcnEoKSBpbiBjYXNlIG9mIGZhaWx1cmUKKyAgICBSZXYgIDMuMjMuMTggQmV0YSBBcHJpbCAxMSwgMjAwMiwgSmVzIFNvcmVuc2VuCisJLSBSdW4gc291cmNlIHRocm91Z2ggTGluZGVudCBhbmQgY2xlYW4gdXAgdGhlIG91dHB1dAorICAgIFJldiAgMy4yMy4xNyBCZXRhIEFwcmlsIDExLCAyMDAyLCBKZXMgU29yZW5zZW4KKwktIFVwZGF0ZSBTQ1NJIGZpcm13YXJlIHRvIHFsYTEyODAgdjguMTUuMDAgYW5kIHFsYTEyMTYwIHYxMC4wNC4zMgorICAgIFJldiAgMy4yMy4xNiBCZXRhIE1hcmNoIDE5LCAyMDAyLCBKZXMgU29yZW5zZW4KKwktIFJlbHkgb24gbWFpbGJveCBjb21tYW5kcyBnZW5lcmF0aW5nIGludGVycnVwdHMgLSBkbyBub3QKKwkgIHJ1biBxbGExMjgwX2lzcigpIGZyb20gcWwxMjgwX21haWxib3hfY29tbWFuZCgpCisJLSBSZW1vdmUgZGV2aWNlX3JlZ190CisJLSBJbnRlZ3JhdGUgcWwxMjE2MF9zZXRfdGFyZ2V0X3BhcmFtZXRlcnMoKSB3aXRoIDEyODAgdmVyc2lvbgorCS0gTWFrZSBxbGExMjgwX3NldHVwKCkgbm9uIHN0YXRpYworCS0gRG8gbm90IGNhbGwgcWxhMTI4MF9jaGVja19mb3JfZGVhZF9zY3NpX2J1cygpIG9uIGV2ZXJ5IEkvTyByZXF1ZXN0CisJICBzZW50IHRvIHRoZSBjYXJkIC0gdGhpcyBjb21tYW5kIHBhdXNlcyB0aGUgZmlybWFyZSEhIQorICAgIFJldiAgMy4yMy4xNSBCZXRhIE1hcmNoIDE5LCAyMDAyLCBKZXMgU29yZW5zZW4KKwktIENsZWFuIHVwIHFsYTEyODAuaCAtIHJlbW92ZSBvYnNvbGV0ZSBRTF9ERUJVR19MRVZFTF94IGRlZmluaXRpb25zCisJLSBSZW1vdmUgYSBwaWxlIG9mIHBvaW50bGVzcyBhbmQgY29uZnVzaW5nIChzcmJfdCAqKikgYW5kCisJICAoc2NzaV9sdV90ICopIHR5cGVjYXN0cworCS0gRXhwbGljaXQgbWFyayB0aGF0IHdlIGRvIG5vdCB1c2UgdGhlIG5ldyBlcnJvciBoYW5kbGluZyAoZm9yIG5vdykKKwktIFJlbW92ZSBzY3NpX3FsYV9ob3N0X3QgYW5kIHVzZSAnc3RydWN0JyBpbnN0ZWFkCisJLSBSZW1vdmUgaW5fYWJvcnQsIHdhdGNoZG9nX2VuYWJsZWQsIGRwYywgZHBjX3NjaGVkLCBiaW9zX2VuYWJsZWQsCisJICBwY2lfNjRiaXRfc2xvdCBmbGFncyB3aGljaCB3ZXJlbid0IHVzZWQgZm9yIGFueXRoaW5nIGFueXdheQorCS0gR3JhYiBob3N0LT5ob3N0X2xvY2sgd2hpbGUgY2FsbGluZyBxbGExMjgwX2lzcigpIGZyb20gYWJvcnQoKQorCS0gVXNlIHNwaW5fbG9jaygpL3NwaW5fdW5sb2NrKCkgaW4gcWxhMTI4MF9pbnRyX2hhbmRsZXIoKSAtIHdlCisJICBkbyBub3QgbmVlZCB0byBzYXZlL3Jlc3RvcmUgZmxhZ3MgaW4gdGhlIGludGVycnVwdCBoYW5kbGVyCisJLSBFbmFibGUgaW50ZXJydXB0cyBlYXJseSAoYmVmb3JlIGFueSBtYWlsYm94IGFjY2VzcykgaW4gcHJlcGFyYXRpb24KKwkgIGZvciBjbGVhbmluZyB1cCB0aGUgbWFpbGJveCBoYW5kbGluZworICAgIFJldiAgMy4yMy4xNCBCZXRhIE1hcmNoIDE0LCAyMDAyLCBKZXMgU29yZW5zZW4KKwktIEZ1cnRoZXIgY2xlYW51cHMuIFJlbW92ZSBhbGwgdHJhY2Ugb2YgUUxfREVCVUdfTEVWRUxfeCBhbmQgcmVwbGFjZQorCSAgaXQgd2l0aCBwcm9wZXIgdXNlIG9mIGRwcmludGsoKS4KKwktIE1ha2UgcWxhMTI4MF9wcmludF9zY3NpX2NtZCgpIGFuZCBxbGExMjgwX2R1bXBfYnVmZmVyKCkgYm90aCB0YWtlCisJICBhIGRlYnVnIGxldmVsIGFyZ3VtZW50IHRvIGRldGVybWluZSBpZiBkYXRhIGlzIHRvIGJlIHByaW50ZWQKKwktIEFkZCBLRVJOXyogaW5mbyB0byBwcmludGsoKQorICAgIFJldiAgMy4yMy4xMyBCZXRhIE1hcmNoIDE0LCAyMDAyLCBKZXMgU29yZW5zZW4KKwktIFNpZ25pZmljYW50IGNvc21ldGljIGNsZWFudXBzCisJLSBDaGFuZ2UgZGVidWcgY29kZSB0byB1c2UgZHByaW50aygpIGFuZCByZW1vdmUgI2lmIG1lc3MKKyAgICBSZXYgIDMuMjMuMTIgQmV0YSBNYXJjaCAxMywgMjAwMiwgSmVzIFNvcmVuc2VuCisJLSBNb3JlIGNvc21ldGljIGNsZWFudXBzLCBmaXggcGxhY2VzIHRyZWF0aW5nIHJldHVybiBhcyBmdW5jdGlvbgorCS0gdXNlIGNwdV9yZWxheCgpIGluIHFsYTEyODBfZGVib3VuY2VfcmVnaXN0ZXIoKQorICAgIFJldiAgMy4yMy4xMSBCZXRhIE1hcmNoIDEzLCAyMDAyLCBKZXMgU29yZW5zZW4KKwktIE1ha2UgaXQgY29tcGlsZSB1bmRlciAyLjUuNQorICAgIFJldiAgMy4yMy4xMCBCZXRhIE9jdG9iZXIgMSwgMjAwMSwgSmVzIFNvcmVuc2VuCisJLSBEbyBubyB0eXBlY2FzdCBzaG9ydCAqIHRvIGxvbmcgKiBpbiBRTDEyODBCb2FyZFRibCwgdGhpcworCSAgYnJva2UgbWlzZXJhYmx5IG9uIGJpZyBlbmRpYW4gYm94ZXMKKyAgICBSZXYgIDMuMjMuOSBCZXRhIFNlcHRlbWJlciAzMCwgMjAwMSwgSmVzIFNvcmVuc2VuCisJLSBSZW1vdmUgcHJlIDIuMiBoYWNrIGZvciBjaGVja2luZyBmb3IgcmVlbnRyYW5jZSBpbiBpbnRlcnJ1cHQgaGFuZGxlcgorCS0gTWFrZSBkYXRhIHR5cGVzIHVzZWQgdG8gcmVjZWl2ZSBmcm9tIFNDU0lfe0JVUyxUQ04sTFVOfV8zMgorCSAgdW5zaWduZWQgaW50IHRvIG1hdGNoIHRoZSB0eXBlcyBmcm9tIHN0cnVjdCBzY3NpX2NtbmQKKyAgICBSZXYgIDMuMjMuOCBCZXRhIFNlcHRlbWJlciAyOSwgMjAwMSwgSmVzIFNvcmVuc2VuCisJLSBSZW1vdmUgYm9ndXMgdGltZXJfdCB0eXBlZGVmIGZyb20gcWxhMTI4MC5oCisJLSBSZW1vdmUgb2Jzb2xldGUgcHJlIDIuMiBQQ0kgc2V0dXAgY29kZSwgdXNlIHByb3BlciAjZGVmaW5lJ3MKKwkgIGZvciBQQ0lfIHZhbHVlcywgY2FsbCBwY2lfc2V0X21hc3RlcigpCisJLSBGaXggbWVtbGVhayBvZiBxbGExMjgwX2J1ZmZlciBvbiBtb2R1bGUgdW5sb2FkCisJLSBPbmx5IGNvbXBpbGUgbW9kdWxlIHBhcnNpbmcgY29kZSAjaWZkZWYgTU9EVUxFIC0gc2hvdWxkIGJlCisJICBjaGFuZ2VkIHRvIHVzZSBpbmRpdmlkdWFsIE1PRFVMRV9QQVJNJ3MgbGF0ZXIKKwktIFJlbW92ZSBkdW1teV9idWZmZXIgdGhhdCB3YXMgbmV2ZXIgbW9kaWZpZWQgbm9yIHByaW50ZWQKKwktIEVOVEVSKCkvTEVBVkUoKSBhcmUgbm9vcHMgdW5sZXNzIFFMX0RFQlVHX0xFVkVMXzMsIGhlbmNlIHJlbW92ZQorCSAgI2lmZGVmIFFMX0RFQlVHX0xFVkVMXzMvI2VuZGlmIGFyb3VuZCBFTlRFUigpL0xFQVZFKCkgY2FsbHMKKwktIFJlbW92ZSBcciBmcm9tIHByaW50IHN0YXRlbWVudHMsIHRoaXMgaXMgTGludXgsIG5vdCBET1MKKwktIFJlbW92ZSBvYnNvbGV0ZSBRTEExMjgwX3tTQ1NJTFUsSU5UUixSSU5HfV97TE9DSyxVTkxPQ0t9CisJICBkdW1teSBtYWNyb3MKKwktIFJlbW92ZSBDKysgY29tcGlsZSBoYWNrIGluIGhlYWRlciBmaWxlIGFzIExpbnV4IGRyaXZlciBhcmUgbm90CisJICBzdXBwb3NlZCB0byBiZSBjb21waWxlZCBhcyBDKysKKwktIEtpbGwgTVNfNjRCSVRTIG1hY3JvIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUKKwktIFJlbW92ZSB1bm5lY2Vzc2FyeSBmbGFncy5pbl9pbnRlcnJ1cHRzIGJpdAorICAgIFJldiAgMy4yMy43IEJldGEgQXVndXN0IDIwLCAyMDAxLCBKZXMgU29yZW5zZW4KKwktIERvbnQnIGNoZWNrIGZvciBzZXQgZmxhZ3Mgb24gcS0+cV9mbGFnIG9uZSBieSBvbmUgaW4gcWxhMTI4MF9uZXh0KCkKKyAgICAgICAgLSBDaGVjayB3aGV0aGVyIHRoZSBpbnRlcnJ1cHQgd2FzIGdlbmVyYXRlZCBieSB0aGUgUUxBMTI4MCBiZWZvcmUKKyAgICAgICAgICBkb2luZyBhbnkgcHJvY2Vzc2luZworCS0gcWxhMTI4MF9zdGF0dXNfZW50cnkoKTogT25seSB6ZXJvIG91dCBwYXJ0IG9mIHNlbnNlX2J1ZmZlciB0aGF0CisJICBpcyBub3QgYmVpbmcgY29waWVkIGludG8KKwktIFJlbW92ZSBtb3JlIHN1cGVyZmxvdW91cyB0eXBlY2FzdHMKKwktIHFsYTEyODBfMzJiaXRfc3RhcnRfc2NzaSgpIHJlcGxhY2UgaG9tZS1icmV3IG1lbWNweSgpIHdpdGggbWVtY3B5KCkKKyAgICBSZXYgIDMuMjMuNiBCZXRhIEF1Z3VzdCAyMCwgMjAwMSwgVG9ueSBMdWNrLCBJbnRlbAorICAgICAgICAtIERvbid0IHdhbGsgdGhlIGVudGlyZSBsaXN0IGluIHFsYTEyODBfcHV0cV90KCkganVzdCB0byBkaXJlY3RseQorCSAgZ3JhYiB0aGUgcG9pbnRlciB0byB0aGUgbGFzdCBlbGVtZW50IGFmdGVyd2FyZHMKKyAgICBSZXYgIDMuMjMuNSBCZXRhIEF1Z3VzdCA5LCAyMDAxLCBKZXMgU29yZW5zZW4KKwktIERvbid0IHVzZSBTQV9JTlRFUlJVUFQsIGl0J3MgdXNlIGlzIGRlcHJlY2F0ZWQgZm9yIHRoaXMga2luZGEgZHJpdmVyCisgICAgUmV2ICAzLjIzLjQgQmV0YSBBdWd1c3QgOCwgMjAwMSwgSmVzIFNvcmVuc2VuCisJLSBTZXQgZGV2LT5tYXhfc2VjdG9ycyB0byAxMDI0CisgICAgUmV2ICAzLjIzLjMgQmV0YSBBdWd1c3QgNiwgMjAwMSwgSmVzIFNvcmVuc2VuCisJLSBQcm92aWRlIGNvbXBhdCBtYWNyb3MgZm9yIHBjaV9lbmFibGVfZGV2aWNlKCksIHBjaV9maW5kX3N1YnN5cygpCisJICBhbmQgc2NzaV9zZXRfcGNpX2RldmljZSgpCisJLSBDYWxsIHNjc2lfc2V0X3BjaV9kZXZpY2UoKSBmb3IgYWxsIGRldmljZXMKKwktIFJlZHVjZSBzaXplIG9mIGtlcm5lbCB2ZXJzaW9uIGRlcGVuZGVudCBkZXZpY2UgcHJvYmUgY29kZQorCS0gTW92ZSBkdXBsaWNhdGUgcHJvYmUvaW5pdCBjb2RlIHRvIHNlcGFyYXRlIGZ1bmN0aW9uCisJLSBIYW5kbGUgZXJyb3IgaWYgcWxhMTI4MF9tZW1fYWxsb2MoKSBmYWlscworCS0gS2lsbCBPRkZTRVQoKSBtYWNybyBhbmQgdXNlIExpbnV4J3MgUENJIGRlZmluaXRpb25zIGluc3RlYWQKKyAgICAgICAgLSBLaWxsIHByaXZhdGUgc3RydWN0dXJlIGRlZmluaW5nIFBDSSBjb25maWcgc3BhY2UgKHN0cnVjdCBjb25maWdfcmVnKQorCS0gT25seSBhbGxvY2F0ZSBJL08gcG9ydCByZWdpb24gaWYgbm90IGluIE1NSU8gbW9kZQorCS0gUmVtb3ZlIGR1cGxpY2F0ZSAodW51c2VkKSBzYW5pdHkgY2hlY2sgb2Ygc2lmZSBvZiBzcmJfdAorICAgIFJldiAgMy4yMy4yIEJldGEgQXVndXN0IDYsIDIwMDEsIEplcyBTb3JlbnNlbgorCS0gQ2hhbmdlIGhvbWUtYnJldyBtZW1zZXQoKSBpbXBsZW1lbnRhdGlvbnMgdG8gdXNlIG1lbXNldCgpCisgICAgICAgIC0gUmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIENPTVRSQUNFKCkgLSBhY2Nlc3NpbmcgYSBQQydzIENPTTIgc2VyaWFsCisgICAgICAgICAgcG9ydCBkaXJlY3RseSBpcyBub3QgbGVnYWwgdW5kZXIgTGludXguCisgICAgUmV2ICAzLjIzLjEgQmV0YSBBcHJpbCAyNCwgMjAwMSwgSmVzIFNvcmVuc2VuCisgICAgICAgIC0gUmVtb3ZlIHByZSAyLjIga2VybmVsIHN1cHBvcnQKKyAgICAgICAgLSBjbGVhbiB1cCA2NCBiaXQgRE1BIHNldHRpbmcgdG8gdXNlIDIuNCBBUEkgKHByb3ZpZGUgYmFja3dhcmRzIGNvbXBhdCkKKyAgICAgICAgLSBGaXggTU1JTyBhY2Nlc3MgdG8gdXNlIHJlYWRsL3dyaXRlbCBpbnN0ZWFkIG9mIGRpcmVjdGx5CisgICAgICAgICAgZGVyZWZlcmVuY2luZyBwb2ludGVycworICAgICAgICAtIE51a2UgTVNET1MgZGVidWdnaW5nIGNvZGUKKyAgICAgICAgLSBDaGFuZ2UgdHJ1ZS9mYWxzZSBkYXRhIHR5cGVzIHRvIGludCBmcm9tIHVpbnQ4X3QKKyAgICAgICAgLSBVc2UgaW50IGZvciBjb3VudGVycyBpbnN0ZWFkIG9mIHVpbnQ4X3QgZXRjLgorICAgICAgICAtIENsZWFuIHVwIHNpemUgJiBieXRlIG9yZGVyIGNvbnZlcnNpb24gbWFjcm8gdXNhZ2UKKyAgICBSZXYgIDMuMjMgQmV0YSBKYW51YXJ5IDExLCAyMDAxIEJOIFFsb2dpYworICAgICAgICAtIEFkZGVkIGNoZWNrIG9mIGRldmljZV9pZCB3aGVuIGhhbmRsaW5nIG5vbgorICAgICAgICAgIFFMQTEyMTYwcyBkdXJpbmcgZGV0ZWN0KCkuCisgICAgUmV2ICAzLjIyIEJldGEgSmFudWFyeSA1LCAyMDAxIEJOIFFsb2dpYworICAgICAgICAtIENoYW5nZWQgcXVldWVfdGFzaygpIHRvIHNjaGVkdWxlX3Rhc2soKQorICAgICAgICAgIGZvciBrZXJuZWxzIDIuNC4wIGFuZCBoaWdoZXIuCisgICAgICAgICAgTm90ZTogMi40LjAtdGVzdHh4IGtlcm5lbHMgcmVsZWFzZWQgcHJpb3IgdG8KKyAgICAgICAgICAgICAgICB0aGUgYWN0dWFsIDIuNC4wIGtlcm5lbCByZWxlYXNlIG9uIEphbnVhcnkgMjAwMQorICAgICAgICAgICAgICAgIHdpbGwgZ2V0IGNvbXBpbGUvbGluayBlcnJvcnMgd2l0aCBzY2hlZHVsZV90YXNrKCkuCisgICAgICAgICAgICAgICAgUGxlYXNlIHVwZGF0ZSB5b3VyIGtlcm5lbCB0byByZWxlYXNlZCAyLjQuMCBsZXZlbCwKKyAgICAgICAgICAgICAgICBvciBjb21tZW50IGxpbmVzIGluIHRoaXMgZmlsZSBmbGFnZ2VkIHdpdGggIDMuMjIKKyAgICAgICAgICAgICAgICB0byByZXNvbHZlIGNvbXBpbGUvbGluayBlcnJvciBvZiBzY2hlZHVsZV90YXNrKCkuCisgICAgICAgIC0gQWRkZWQgLURDT05GSUdfU01QIGluIGFkZGl0aW9uIHRvIC1EX19TTVBfXworICAgICAgICAgIGluIE1ha2VmaWxlIGZvciAyLjQuMCBidWlsZHMgb2YgZHJpdmVyIGFzIG1vZHVsZS4KKyAgICBSZXYgIDMuMjEgQmV0YSBKYW51YXJ5IDQsIDIwMDEgQk4gUWxvZ2ljCisgICAgICAgIC0gQ2hhbmdlZCBjcml0ZXJpYSBvZiA2NC8zMiBCaXQgbW9kZSBvZiBIQkEKKyAgICAgICAgICBvcGVyYXRpb24gYWNjb3JkaW5nIHRvIEJJVFNfUEVSX0xPTkcgcmF0aGVyCisgICAgICAgICAgdGhhbiBIQkEncyBOVlJBTSBzZXR0aW5nIG9mID40R2lnIG1lbW9yeSBiaXQ7CisgICAgICAgICAgc28gdGhhdCB0aGUgSEJBIGF1dG8tY29uZmlndXJlcyB3aXRob3V0IHRoZSBuZWVkCisgICAgICAgICAgdG8gc2V0dXAgZWFjaCBzeXN0ZW0gaW5kaXZpZHVhbGx5LgorICAgIFJldiAgMy4yMCBCZXRhIERlY2VtYmVyIDUsIDIwMDAgQk4gUWxvZ2ljCisgICAgICAgIC0gQWRkZWQgcHJpb3JpdHkgaGFuZGxpbmcgdG8gSUEtNjQgIG9uYm9hcmQgU0NTSQorICAgICAgICAgIElTUDEyMTYwIGNoaXAgZm9yIGtlcm5lbHMgZ3JlYXRlciB0aGFuIDIuMy4xOC4KKyAgICAgICAgLSBBZGRlZCBpcnFyZXN0b3JlIGZvciBxbGExMjgwX2ludHJfaGFuZGxlci4KKyAgICAgICAgLSBFbmFibGVkIC9wcm9jL3Njc2kvcWxhMTI4MCBpbnRlcmZhY2UuCisgICAgICAgIC0gQ2xlYXIgL3Byb2Mvc2NzaS9xbGExMjgwIGNvdW50ZXJzIGluIGRldGVjdCgpLgorICAgIFJldiAgMy4xOSBCZXRhIE9jdG9iZXIgMTMsIDIwMDAgQk4gUWxvZ2ljCisgICAgICAgIC0gRGVjbGFyZSBkcml2ZXJfdGVtcGxhdGUgZm9yIG5ldyBrZXJuZWwKKyAgICAgICAgICAoMi40LjAgYW5kIGdyZWF0ZXIpIHNjc2kgaW5pdGlhbGl6YXRpb24gc2NoZW1lLgorICAgICAgICAtIFVwZGF0ZSAvcHJvYy9zY3NpIGVudHJ5IGZvciAyLjMuMTgga2VybmVscyBhbmQKKyAgICAgICAgICBhYm92ZSBhcyBxbGExMjgwCisgICAgUmV2ICAzLjE4IEJldGEgT2N0b2JlciAxMCwgMjAwMCBCTiBRbG9naWMKKyAgICAgICAgLSBDaGFuZ2VkIHNjYW4gb3JkZXIgb2YgYWRhcHRlcnMgdG8gbWFwCisgICAgICAgICAgdGhlIFFMQTEyMTYwIGZvbGxvd2VkIGJ5IHRoZSBRTEExMjgwLgorICAgIFJldiAgMy4xNyBCZXRhIFNlcHRlbWJlciAxOCwgMjAwMCBCTiBRbG9naWMKKyAgICAgICAgLSBSZW1vdmVkIHdhcm5pbmdzIGZvciAzMiBiaXQgMi40LnggY29tcGlsZXMKKyAgICAgICAgLSBDb3JyZWN0ZWQgZGVjbGFyZWQgc2l6ZSBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UKKyAgICAgICAgICBETUEgYWRkcmVzc2VzIHRoYXQgYXJlIGtlcHQgaW4gZWFjaCBoYQorICAgIFJldi4gMy4xNiBCZXRhICBBdWd1c3QgMjUsIDIwMDAgICBCTiAgUWxvZ2ljCisgICAgICAgIC0gQ29ycmVjdGVkIDY0IGJpdCBhZGRyZXNzaW5nIGlzc3VlIG9uIElBLTY0CisgICAgICAgICAgd2hlcmUgdGhlIHVwcGVyIDMyIGJpdHMgd2VyZSBub3QgcHJvcGVybHkKKyAgICAgICAgICBwYXNzZWQgdG8gdGhlIFJJU0MgZW5naW5lLgorICAgIFJldi4gMy4xNSBCZXRhICBBdWd1c3QgMjIsIDIwMDAgICBCTiAgUWxvZ2ljCisgICAgICAgIC0gTW9kaWZpZWQgcWxhMTI4MF9zZXR1cF9jaGlwIHRvIHByb3Blcmx5IGxvYWQKKyAgICAgICAgICBJU1AgZmlybXdhcmUgZm9yIGdyZWF0ZXIgdGhhdCA0IEdpZyBtZW1vcnkgb24gSUEtNjQKKyAgICBSZXYuIDMuMTQgQmV0YSAgQXVndXN0IDE2LCAyMDAwICAgQk4gIFFsb2dpYworICAgICAgICAtIEFkZGVkIHNldHRpbmcgb2YgZG1hX21hc2sgdG8gZnVsbCA2NCBiaXQKKyAgICAgICAgICBpZiBmbGFncy5lbmFibGVfNjRiaXRfYWRkcmVzc2luZyBpcyBzZXQgaW4gTlZSQU0KKyAgICBSZXYuIDMuMTMgQmV0YSAgQXVndXN0IDE2LCAyMDAwICAgQk4gIFFsb2dpYworICAgICAgICAtIFVzZSBuZXcgUENJIERNQSBtYXBwaW5nIEFQSXMgZm9yIDIuNC54IGtlcm5lbAorICAgIFJldi4gMy4xMiAgICAgICBKdWx5IDE4LCAyMDAwICAgIFJlZGhhdCAmIEJOIFFsb2dpYworICAgICAgICAtIEFkZGVkIGNoZWNrIG9mIHBjaV9lbmFibGVfZGV2aWNlIHRvIGRldGVjdCgpIGZvciAyLjMueAorICAgICAgICAtIFVzZSBwY2lfcmVzb3VyY2Vfc3RhcnQoKSBpbnN0ZWFkIG9mCisgICAgICAgICAgcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQgaW4gZGV0ZWN0KCkgZm9yIDIuMy54CisgICAgICAgIC0gVXBkYXRlZCBkcml2ZXIgdmVyc2lvbgorICAgIFJldi4gMy4xMSAgICAgICBKdWx5IDE0LCAyMDAwICAgIEJOICBRbG9naWMKKwktIFVwZGF0ZWQgU0NTSSBGaXJtd2FyZSB0byBmb2xsb3dpbmcgdmVyc2lvbnM6CisJICBxbGExeDgwOiAgIDguMTMuMDgKKwkgIHFsYTF4MTYwOiAgMTAuMDQuMDgKKwktIFVwZGF0ZWQgZHJpdmVyIHZlcnNpb24gdG8gMy4xMQorICAgIFJldi4gMy4xMCAgICBKdW5lIDIzLCAyMDAwICAgQk4gUWxvZ2ljCisgICAgICAgIC0gQWRkZWQgZmlsdGVyaW5nIG9mIEFNSSBTdWJTeXMgVmVuZG9yIElEIGRldmljZXMKKyAgICBSZXYuIDMuOQorICAgICAgICAtIERFQlVHX1FMQTEyODAgdW5kZWZpbmVkIGFuZCAgbmV3IHZlcnNpb24gIEJOIFFsb2dpYworICAgIFJldi4gMy4wOGIgICAgICBNYXkgOSwgMjAwMCAgICBNRCBEZWxsCisgICAgICAgIC0gQWRkZWQgbG9naWMgdG8gY2hlY2sgYWdhaW5zdCBBTUkgc3Vic3lzdGVtIHZlbmRvciBJRAorCVJldi4gMy4wOCAgICAgICBNYXkgNCwgMjAwMCAgICBERyAgUWxvZ2ljCisgICAgICAgIC0gQWRkZWQgbG9naWMgdG8gY2hlY2sgZm9yIFBDSSBzdWJzeXN0ZW0gSUQuCisJUmV2LiAzLjA3ICAgICAgIEFwciAyNCwgMjAwMCAgICBERyAmIEJOICBRbG9naWMKKwkgICAtIFVwZGF0ZWQgU0NTSSBGaXJtd2FyZSB0byBmb2xsb3dpbmcgdmVyc2lvbnM6CisJICAgICBxbGExMjE2MDogICAxMC4wMS4xOQorCQkgcWxhMTI4MDogICAgIDguMDkuMDAKKwlSZXYuIDMuMDYgICAgICAgQXByIDEyLCAyMDAwICAgIERHICYgQk4gIFFsb2dpYworCSAgIC0gSW50ZXJuYWwgcmV2aXNpb247IG5vdCByZWxlYXNlZAorICAgIFJldi4gMy4wNSAgICAgICBNYXIgMjgsIDIwMDAgICAgREcgJiBCTiAgUWxvZ2ljCisgICAgICAgLSBFZGl0IGNvcnJlY3Rpb24gZm9yIHZpcnRfdG9fYnVzIGFuZCBQUk9DLgorICAgIFJldi4gMy4wNCAgICAgICBNYXIgMjgsIDIwMDAgICAgREcgJiBCTiAgUWxvZ2ljCisgICAgICAgLSBNZXJnZSBjaGFuZ2VzIGZyb20gaWE2NCBwb3J0LgorICAgIFJldi4gMy4wMyAgICAgICBNYXIgMjgsIDIwMDAgICAgQk4gIFFsb2dpYworICAgICAgIC0gSW5jcmVhc2UgdmVyc2lvbiB0byByZWZsZWN0IG5ldyBjb2RlIGRyb3Agd2l0aCBjb21waWxlIGZpeAorICAgICAgICAgb2YgaXNzdWUgd2l0aCBpbmNsdXNpb24gb2YgbGludXgvc3BpbmxvY2sgZm9yIDIuMyBrZXJuZWxzCisgICAgUmV2LiAzLjAyICAgICAgIE1hciAxNSwgMjAwMCAgICBCTiAgUWxvZ2ljCisgICAgICAgLSBNZXJnZSBxbGExMjgwX3Byb2NfaW5mbyBmcm9tIDIuMTAgY29kZSBiYXNlCisgICAgUmV2LiAzLjAxICAgICAgIEZlYiAxMCwgMjAwMCAgICBCTiAgUWxvZ2ljCisgICAgICAgLSBDb3JyZWN0ZWQgY29kZSB0byBjb21waWxlIG9uIGEgMi4yLngga2VybmVsLgorICAgIFJldi4gMy4wMCAgICAgICBKYW4gMTcsIDIwMDAgICAgREcgIFFsb2dpYworCSAgIC0gQWRkZWQgNjQtYml0IHN1cHBvcnQuCisgICAgUmV2LiAyLjA3ICAgICAgIE5vdiA5LCAxOTk5ICAgICBERyAgUWxvZ2ljCisJICAgLSBBZGRlZCBuZXcgcm91dGluZSB0byBzZXQgdGFyZ2V0IHBhcmFtZXRlcnMgZm9yIElTUDEyMTYwLgorICAgIFJldi4gMi4wNiAgICAgICBTZXB0IDEwLCAxOTk5ICAgICBERyAgUWxvZ2ljCisgICAgICAgLSBBZGRlZCBzdXBwb3J0IGZvciBJU1AxMjE2MCBVbHRyYSAzIGNoaXAuCisgICAgUmV2LiAyLjAzICAgICAgIEF1Z3VzdCAzLCAxOTk5ICAgIEZyZWQgTGV3aXMsIEludGVsIER1UG9udAorCS0gTW9kaWZpZWQgY29kZSB0byByZW1vdmUgZXJyb3JzIGdlbmVyYXRlZCB3aGVuIGNvbXBpbGluZyB3aXRoCisJICBDeWdudXMgSUE2NCBDb21waWxlci4KKyAgICAgICAgLSBDaGFuZ2VkIGNvbnZlcnNpb24gb2YgcG9pbnRlcnMgdG8gdW5zaWduZWQgbG9uZ3MgaW5zdGVhZCBvZiBpbnRlZ2Vycy4KKyAgICAgICAgLSBDaGFuZ2VkIHR5cGUgb2YgSS9PIHBvcnQgdmFyaWFibGVzIGZyb20gdWludDMyX3QgdG8gdW5zaWduZWQgbG9uZy4KKyAgICAgICAgLSBNb2RpZmllZCBPRkZTRVQgbWFjcm8gdG8gd29yayB3aXRoIDY0LWJpdCBhcyB3ZWxsIGFzIDMyLWJpdC4KKyAgICAgICAgLSBDaGFuZ2VkIHNwcmludGYgYW5kIHByaW50ayBmb3JtYXQgc3BlY2lmaWVycyBmb3IgcG9pbnRlcnMgdG8gJXAuCisgICAgICAgIC0gQ2hhbmdlZCBzb21lIGludCB0byBsb25nIHR5cGUgY2FzdHMgd2hlcmUgbmVlZGVkIGluIHNwcmludGYgJiBwcmludGsuCisgICAgICAgIC0gQWRkZWQgbCBtb2RpZmllcnMgdG8gc3ByaW50ZiBhbmQgcHJpbnRrIGZvcm1hdCBzcGVjaWZpZXJzIGZvciBsb25ncy4KKyAgICAgICAgLSBSZW1vdmVkIHVudXNlZCBsb2NhbCB2YXJpYWJsZXMuCisgICAgUmV2LiAxLjIwICAgICAgIEp1bmUgOCwgMTk5OSAgICAgIERHLCAgUWxvZ2ljCisgICAgICAgICBDaGFuZ2VzIHRvIHN1cHBvcnQgUmVkSGF0IHJlbGVhc2UgNi4wIChrZXJuZWwgMi4yLjUpLgorICAgICAgIC0gQWRkZWQgU0NTSSBleGNsdXNpdmUgYWNjZXNzIGxvY2sgKGlvX3JlcXVlc3RfbG9jaykgd2hlbiBhY2Nlc3NpbmcKKyAgICAgICAgIHRoZSBhZGFwdGVyLgorICAgICAgIC0gQWRkZWQgY2hhbmdlcyBmb3IgdGhlIG5ldyBMSU5VWCBpbnRlcmZhY2UgdGVtcGxhdGUuIFNvbWUgbmV3IGVycm9yCisgICAgICAgICBoYW5kbGluZyByb3V0aW5lcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHRlbXBsYXRlLCBidXQgZm9yIG5vdyB3ZQorICAgICAgICAgd2lsbCB1c2UgdGhlIG9sZCBvbmVzLgorICAgIC0gICBJbml0aWFsIEJldGEgUmVsZWFzZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSAweDAyMDU0NQorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9ibGsuaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJzZC5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19JQTY0X0dFTkVSSUMpIHx8IGRlZmluZWQoQ09ORklHX0lBNjRfU0dJX1NOMikKKyNpbmNsdWRlIDxhc20vc24vaW8uaD4KKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgMHgwMjA0MDcKKyNlcnJvciAiS2VybmVscyBvbGRlciB0aGFuIDIuNC43IGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIgorI2VuZGlmCisKKworLyoKKyAqIENvbXBpbGUgdGltZSBPcHRpb25zOgorICogICAgICAgICAgICAwIC0gRGlzYWJsZSBhbmQgMSAtIEVuYWJsZQorICovCisjZGVmaW5lICBERUJVR19RTEExMjgwX0lOVFIJMAorI2RlZmluZSAgREVCVUdfUFJJTlRfTlZSQU0JMAorI2RlZmluZSAgREVCVUdfUUxBMTI4MAkJMAorCisvKgorICogVGhlIFNHSSBWSVNXUyBpcyBicm9rZW4gYW5kIGRvZXNuJ3Qgc3VwcG9ydCBNTUlPIDstKAorICovCisjaWZkZWYgQ09ORklHX1g4Nl9WSVNXUworI2RlZmluZQlNRU1PUllfTUFQUEVEX0lPCTAKKyNlbHNlCisjZGVmaW5lCU1FTU9SWV9NQVBQRURfSU8JMQorI2VuZGlmCisKKyNkZWZpbmUgVU5JUVVFX0ZXX05BTUUKKyNpbmNsdWRlICJxbGExMjgwLmgiCisjaW5jbHVkZSAicWwxMjE2MF9mdy5oIgkJLyogSVNQIFJJU0MgY29kZXMgKi8KKyNpbmNsdWRlICJxbDEyODBfZncuaCIKKyNpbmNsdWRlICJxbDEwNDBfZncuaCIKKworCisvKgorICogTWlzc2luZyBQQ0kgSUQncworICovCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEwODAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTA4MAkweDEwODAKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMjQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEyNDAJMHgxMjQwCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTI4MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMjgwCTB4MTI4MAorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEwMTYwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEwMTYwCTB4MTAxNgorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEyMTYwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEyMTYwCTB4MTIxNgorI2VuZGlmCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9BTUkKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BTUkgICAgICAgICAgICAgICAweDEwMWUKKyNlbmRpZgorCisjaWZuZGVmIEJJVFNfUEVSX0xPTkcKKyNlcnJvciAiQklUU19QRVJfTE9ORyBub3QgZGVmaW5lZCEiCisjZW5kaWYKKyNpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkgfHwgZGVmaW5lZCBDT05GSUdfSElHSE1FTQorI2RlZmluZSBRTEFfNjRCSVRfUFRSCTEKKyNlbmRpZgorCisjaWZkZWYgUUxBXzY0QklUX1BUUgorI2RlZmluZSBwY2lfZG1hX2hpMzIoYSkJCQkoKGEgPj4gMTYpID4+IDE2KQorI2Vsc2UKKyNkZWZpbmUgcGNpX2RtYV9oaTMyKGEpCQkJMAorI2VuZGlmCisjZGVmaW5lIHBjaV9kbWFfbG8zMihhKQkJCShhICYgMHhmZmZmZmZmZikKKworI2RlZmluZSBOVlJBTV9ERUxBWSgpCQkJdWRlbGF5KDUwMCkJLyogMiBtaWNyb3NlY29uZHMgKi8KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IDB4MDIwNTAwCisjZGVmaW5lIEhPU1RfTE9DSwkJCSZpb19yZXF1ZXN0X2xvY2sKKyNkZWZpbmUgaXJxcmV0dXJuX3QJCQl2b2lkCisjZGVmaW5lIElSUV9SRVRWQUwoZm9vKQorI2RlZmluZSBNU0dfT1JERVJFRF9UQUcJCQkxCisKKyNkZWZpbmUgRE1BX0JJRElSRUNUSU9OQUwJU0NTSV9EQVRBX1VOS05PV04KKyNkZWZpbmUgRE1BX1RPX0RFVklDRQkJU0NTSV9EQVRBX1dSSVRFCisjZGVmaW5lIERNQV9GUk9NX0RFVklDRQkJU0NTSV9EQVRBX1JFQUQKKyNkZWZpbmUgRE1BX05PTkUJCVNDU0lfREFUQV9OT05FCisKKyNpZm5kZWYgSEFWRV9TRUNUT1JfVAordHlwZWRlZiB1bnNpZ25lZCBpbnQgc2VjdG9yX3Q7CisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkCitzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZSwgaW50IHRhZywgaW50IGRlcHRoKQoreworCWlmICh0YWcpIHsKKwkJZGV2aWNlLT50YWdnZWRfcXVldWUgPSB0YWc7CisJCWRldmljZS0+Y3VycmVudF90YWcgPSAwOworCX0KKwlkZXZpY2UtPnF1ZXVlX2RlcHRoID0gZGVwdGg7Cit9CitzdGF0aWMgaW5saW5lIHN0cnVjdCBTY3NpX0hvc3QgKnNjc2lfaG9zdF9hbGxvYyhTY3NpX0hvc3RfVGVtcGxhdGUgKnQsIHNpemVfdCBzKQoreworCXJldHVybiBzY3NpX3JlZ2lzdGVyKHQsIHMpOworfQorc3RhdGljIGlubGluZSB2b2lkIHNjc2lfaG9zdF9wdXQoc3RydWN0IFNjc2lfSG9zdCAqaCkKK3sKKwlzY3NpX3VucmVnaXN0ZXIoaCk7Cit9CisjZWxzZQorI2RlZmluZSBIT1NUX0xPQ0sJCQloYS0+aG9zdC0+aG9zdF9sb2NrCisjZW5kaWYKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCAweDAyMDYwMAorI2RlZmluZSBERVZfU0lNUExFX1RBR1MoZGV2aWNlKQkJZGV2aWNlLT50YWdnZWRfcXVldWUKKy8qCisgKiBIYWNrIGFyb3VuZCB0aGF0IHFsYTEyODBfcmVtb3ZlX29uZSBpcyBjYWxsZWQgZnJvbQorICogcWxhMTI4MF9yZWxlYXNlIGluIDIuNAorICovCisjdW5kZWYgX19kZXZleGl0CisjZGVmaW5lIF9fZGV2ZXhpdAorI2Vsc2UKKyNkZWZpbmUgREVWX1NJTVBMRV9UQUdTKGRldmljZSkJCWRldmljZS0+c2ltcGxlX3RhZ3MKKyNlbmRpZgorI2lmIGRlZmluZWQoX19pYTY0X18pICYmICFkZWZpbmVkKGlhNjRfcGxhdGZvcm1faXMpCisjZGVmaW5lIGlhNjRfcGxhdGZvcm1faXMoZm9vKQkJKCFzdHJjbXAoeCwgcGxhdGZvcm1fbmFtZSkpCisjZW5kaWYKKworCisjZGVmaW5lIElTX0lTUDEwNDAoaGEpIChoYS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEwMjApCisjZGVmaW5lIElTX0lTUDF4NDAoaGEpIChoYS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEwMjAgfHwgXAorCQkJaGEtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMjQwKQorI2RlZmluZSBJU19JU1AxeDE2MChoYSkgICAgICAgIChoYS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEwMTYwIHx8IFwKKwkJCQloYS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEyMTYwKQorCisKK3N0YXRpYyBpbnQgcWxhMTI4MF9wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7CitzdGF0aWMgdm9pZCBxbGExMjgwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKik7CisKKy8qCisgKiAgUUxvZ2ljIERyaXZlciBTdXBwb3J0IEZ1bmN0aW9uIFByb3RvdHlwZXMuCisgKi8KK3N0YXRpYyB2b2lkIHFsYTEyODBfZG9uZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCAweDAyMDU0NQorc3RhdGljIHZvaWQgcWxhMTI4MF9nZXRfdGFyZ2V0X29wdGlvbnMoc3RydWN0IHNjc2lfY21uZCAqLCBzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKKyNlbmRpZgorc3RhdGljIGludCBxbGExMjgwX2dldF90b2tlbihjaGFyICopOworc3RhdGljIGludCBxbGExMjgwX3NldHVwKGNoYXIgKnMpIF9faW5pdDsKKworLyoKKyAqICBRTG9naWMgSVNQMTI4MCBIYXJkd2FyZSBTdXBwb3J0IEZ1bmN0aW9uIFByb3RvdHlwZXMuCisgKi8KK3N0YXRpYyBpbnQgcWxhMTI4MF9sb2FkX2Zpcm13YXJlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOworc3RhdGljIGludCBxbGExMjgwX2luaXRfcmluZ3Moc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CitzdGF0aWMgaW50IHFsYTEyODBfbnZyYW1fY29uZmlnKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOworc3RhdGljIGludCBxbGExMjgwX21haWxib3hfY29tbWFuZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLAorCQkJCSAgIHVpbnQ4X3QsIHVpbnQxNl90ICopOworc3RhdGljIGludCBxbGExMjgwX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCBpbnQpOworc3RhdGljIGludCBxbGExMjgwX2RldmljZV9yZXNldChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCBpbnQsIGludCk7CitzdGF0aWMgaW50IHFsYTEyODBfYWJvcnRfZGV2aWNlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIGludCwgaW50LCBpbnQpOworc3RhdGljIGludCBxbGExMjgwX2Fib3J0X2NvbW1hbmQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgc3RydWN0IHNyYiAqLCBpbnQpOworc3RhdGljIGludCBxbGExMjgwX2Fib3J0X2lzcChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKKyNpZmRlZiBRTEFfNjRCSVRfUFRSCitzdGF0aWMgaW50IHFsYTEyODBfNjRiaXRfc3RhcnRfc2NzaShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCBzdHJ1Y3Qgc3JiICopOworI2Vsc2UKK3N0YXRpYyBpbnQgcWxhMTI4MF8zMmJpdF9zdGFydF9zY3NpKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHN0cnVjdCBzcmIgKik7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHFsYTEyODBfbnZfd3JpdGUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgdWludDE2X3QpOworc3RhdGljIHZvaWQgcWxhMTI4MF9wb2xsKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOworc3RhdGljIHZvaWQgcWxhMTI4MF9yZXNldF9hZGFwdGVyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOworc3RhdGljIHZvaWQgcWxhMTI4MF9tYXJrZXIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgaW50LCBpbnQsIGludCwgdTgpOworc3RhdGljIHZvaWQgcWxhMTI4MF9pc3BfY21kKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOworc3RhdGljIHZvaWQgcWxhMTI4MF9pc3Ioc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgc3RydWN0IGxpc3RfaGVhZCAqKTsKK3N0YXRpYyB2b2lkIHFsYTEyODBfcnN0X2FlbihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKK3N0YXRpYyB2b2lkIHFsYTEyODBfc3RhdHVzX2VudHJ5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHN0cnVjdCByZXNwb25zZSAqLAorCQkJCSBzdHJ1Y3QgbGlzdF9oZWFkICopOworc3RhdGljIHZvaWQgcWxhMTI4MF9lcnJvcl9lbnRyeShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCBzdHJ1Y3QgcmVzcG9uc2UgKiwKKwkJCQlzdHJ1Y3QgbGlzdF9oZWFkICopOworc3RhdGljIHVpbnQxNl90IHFsYTEyODBfZ2V0X252cmFtX3dvcmQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgdWludDMyX3QpOworc3RhdGljIHVpbnQxNl90IHFsYTEyODBfbnZyYW1fcmVxdWVzdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCB1aW50MzJfdCk7CitzdGF0aWMgdWludDE2X3QgcWxhMTI4MF9kZWJvdW5jZV9yZWdpc3Rlcih2b2xhdGlsZSB1aW50MTZfdCBfX2lvbWVtICopOworc3RhdGljIHJlcXVlc3RfdCAqcWxhMTI4MF9yZXFfcGt0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOworc3RhdGljIGludCBxbGExMjgwX2NoZWNrX2Zvcl9kZWFkX3Njc2lfYnVzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosCisJCQkJCSAgIHVuc2lnbmVkIGludCk7CitzdGF0aWMgdm9pZCBxbGExMjgwX2dldF90YXJnZXRfcGFyYW1ldGVycyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLAorCQkJCQkgICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CitzdGF0aWMgaW50IHFsYTEyODBfc2V0X3RhcmdldF9wYXJhbWV0ZXJzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIGludCwgaW50KTsKKworCitzdGF0aWMgc3RydWN0IHFsYV9kcml2ZXJfc2V0dXAgZHJpdmVyX3NldHVwOworCisvKgorICogY29udmVydCBzY3NpIGRhdGEgZGlyZWN0aW9uIHRvIHJlcXVlc3RfdCBjb250cm9sIGZsYWdzCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDE2X3QKK3FsYTEyODBfZGF0YV9kaXJlY3Rpb24oc3RydWN0IHNjc2lfY21uZCAqY21uZCkKK3sKKwlzd2l0Y2goY21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pIHsKKwljYXNlIERNQV9GUk9NX0RFVklDRToKKwkJcmV0dXJuIEJJVF81OworCWNhc2UgRE1BX1RPX0RFVklDRToKKwkJcmV0dXJuIEJJVF82OworCWNhc2UgRE1BX0JJRElSRUNUSU9OQUw6CisJCXJldHVybiBCSVRfNSB8IEJJVF82OworCS8qCisJICogV2UgY291bGQgQlVHKCkgb24gZGVmYXVsdCBoZXJlIGlmIG9uZSBvZiB0aGUgZm91ciBjYXNlcyBhcmVuJ3QKKwkgKiBtZXQsIGJ1dCB0aGVuIGFnYWluIGlmIHdlIHJlY2VpdmUgc29tZXRoaW5nIGxpa2UgdGhhdCBmcm9tIHRoZQorCSAqIFNDU0kgbGF5ZXIgd2UgaGF2ZSBtb3JlIHNlcmlvdXMgcHJvYmxlbXMuIFRoaXMgc2h1dHMgdXAgR0NDLgorCSAqLworCWNhc2UgRE1BX05PTkU6CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCQkKKyNpZiBERUJVR19RTEExMjgwCitzdGF0aWMgdm9pZCBfX3FsYTEyODBfcHJpbnRfc2NzaV9jbWQoc3RydWN0IHNjc2lfY21uZCAqIGNtZCk7CitzdGF0aWMgdm9pZCBfX3FsYTEyODBfZHVtcF9idWZmZXIoY2hhciAqLCBpbnQpOworI2VuZGlmCisKKworLyoKKyAqIGluc21vZCBuZWVkcyB0byBmaW5kIHRoZSB2YXJpYWJsZSBhbmQgbWFrZSBpdCBwb2ludCB0byBzb21ldGhpbmcKKyAqLworI2lmZGVmIE1PRFVMRQorc3RhdGljIGNoYXIgKnFsYTEyODA7CisKKy8qIGluc21vZCBxbGExMjgwIG9wdGlvbnM9dmVyYm9zZSIgKi8KK21vZHVsZV9wYXJhbShxbGExMjgwLCBjaGFycCwgMCk7CisjZWxzZQorX19zZXR1cCgicWxhMTI4MD0iLCBxbGExMjgwX3NldHVwKTsKKyNlbmRpZgorCisKKy8qCisgKiBXZSB1c2UgdGhlIHNjc2lfcG9pbnRlciBzdHJ1Y3R1cmUgdGhhdCdzIGluY2x1ZGVkIHdpdGggZWFjaCBzY3NpX2NvbW1hbmQKKyAqIHRvIG92ZXJsYXkgb3VyIHN0cnVjdCBzcmIgb3ZlciBpdC4gcWxhMTI4MF9pbml0KCkgY2hlY2tzIHRoYXQgYSBzcmIgaXMgbm90CisgKiBiaWdnZXIgdGhhbiBhIHNjc2lfcG9pbnRlci4KKyAqLworCisjZGVmaW5lCUNNRF9TUChDbW5kKQkJJkNtbmQtPlNDcAorI2RlZmluZQlDTURfQ0RCTEVOKENtbmQpCUNtbmQtPmNtZF9sZW4KKyNkZWZpbmUJQ01EX0NEQlAoQ21uZCkJCUNtbmQtPmNtbmQKKyNkZWZpbmUJQ01EX1NOU1AoQ21uZCkJCUNtbmQtPnNlbnNlX2J1ZmZlcgorI2RlZmluZQlDTURfU05TTEVOKENtbmQpCXNpemVvZihDbW5kLT5zZW5zZV9idWZmZXIpCisjZGVmaW5lCUNNRF9SRVNVTFQoQ21uZCkJQ21uZC0+cmVzdWx0CisjZGVmaW5lCUNNRF9IQU5ETEUoQ21uZCkJQ21uZC0+aG9zdF9zY3JpYmJsZQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IDB4MDIwNTQ1CisjZGVmaW5lIENNRF9SRVFVRVNUKENtbmQpCUNtbmQtPnJlcXVlc3QuY21kCisjZWxzZQorI2RlZmluZSBDTURfUkVRVUVTVChDbW5kKQlDbW5kLT5yZXF1ZXN0LT5jbWQKKyNlbmRpZgorCisjZGVmaW5lIENNRF9IT1NUKENtbmQpCQlDbW5kLT5kZXZpY2UtPmhvc3QKKyNkZWZpbmUgU0NTSV9CVVNfMzIoQ21uZCkJQ21uZC0+ZGV2aWNlLT5jaGFubmVsCisjZGVmaW5lIFNDU0lfVENOXzMyKENtbmQpCUNtbmQtPmRldmljZS0+aWQKKyNkZWZpbmUgU0NTSV9MVU5fMzIoQ21uZCkJQ21uZC0+ZGV2aWNlLT5sdW4KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgIElTUCBCb2FyZHMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBxbGFfYm9hcmRzIHsKKwl1bnNpZ25lZCBjaGFyIG5hbWVbOV07CS8qIEJvYXJkIElEIFN0cmluZyAqLworCWludCBudW1Qb3J0czsJCS8qIE51bWJlciBvZiBTQ1NJIHBvcnRzICovCisJdW5zaWduZWQgc2hvcnQgKmZ3Y29kZTsJLyogcG9pbnRlciB0byBGVyBhcnJheSAgICAgICAgICovCisJdW5zaWduZWQgc2hvcnQgKmZ3bGVuOwkvKiBudW1iZXIgb2Ygd29yZHMgaW4gYXJyYXkgICAgKi8KKwl1bnNpZ25lZCBzaG9ydCAqZndzdGFydDsJLyogc3RhcnQgYWRkcmVzcyBmb3IgRi9XICAgICAgICovCisJdW5zaWduZWQgY2hhciAqZnd2ZXI7CS8qIFB0ciB0byBGL1cgdmVyc2lvbiBhcnJheSAgICAqLworfTsKKworLyogTk9URTogdGhlIGxhc3QgYXJndW1lbnQgaW4gZWFjaCBlbnRyeSBpcyB1c2VkIHRvIGluZGV4IHFsMTI4MF9ib2FyZF90YmwgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBxbGExMjgwX3BjaV90YmxbXSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9RTE9HSUMsIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEyMTYwLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKyNpZmRlZiBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MF8xMDQwCisJe1BDSV9WRU5ET1JfSURfUUxPR0lDLCBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMDIwLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxfSwKKyNlbmRpZgorCXtQQ0lfVkVORE9SX0lEX1FMT0dJQywgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTA4MCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMn0sCisJe1BDSV9WRU5ET1JfSURfUUxPR0lDLCBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMjQwLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAzfSwKKwl7UENJX1ZFTkRPUl9JRF9RTE9HSUMsIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEyODAsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDR9LAorCXtQQ0lfVkVORE9SX0lEX1FMT0dJQywgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTAxNjAsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDV9LAorCXswLH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcWxhMTI4MF9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBxbGFfYm9hcmRzIHFsMTI4MF9ib2FyZF90YmxbXSA9IHsKKwkvKiBOYW1lICwgIE51bWJlciBvZiBwb3J0cywgRlcgZGV0YWlscyAqLworCXsiUUxBMTIxNjAiLCAyLCAmZncxMjE2MGlfY29kZTAxWzBdLCAmZncxMjE2MGlfbGVuZ3RoMDEsCisJICZmdzEyMTYwaV9hZGRyMDEsICZmdzEyMTYwaV92ZXJzaW9uX3N0clswXX0sCisJeyJRTEExMDQwIiwgMSwgJnJpc2NfY29kZTAxWzBdLCAmcmlzY19jb2RlX2xlbmd0aDAxLAorCSAmcmlzY19jb2RlX2FkZHIwMSwgJmZpcm13YXJlX3ZlcnNpb25bMF19LAorCXsiUUxBMTA4MCIsIDEsICZmdzEyODBlaV9jb2RlMDFbMF0sICZmdzEyODBlaV9sZW5ndGgwMSwKKwkgJmZ3MTI4MGVpX2FkZHIwMSwgJmZ3MTI4MGVpX3ZlcnNpb25fc3RyWzBdfSwKKwl7IlFMQTEyNDAiLCAyLCAmZncxMjgwZWlfY29kZTAxWzBdLCAmZncxMjgwZWlfbGVuZ3RoMDEsCisJICZmdzEyODBlaV9hZGRyMDEsICZmdzEyODBlaV92ZXJzaW9uX3N0clswXX0sCisJeyJRTEExMjgwIiwgMiwgJmZ3MTI4MGVpX2NvZGUwMVswXSwgJmZ3MTI4MGVpX2xlbmd0aDAxLAorCSAmZncxMjgwZWlfYWRkcjAxLCAmZncxMjgwZWlfdmVyc2lvbl9zdHJbMF19LAorCXsiUUxBMTAxNjAiLCAxLCAmZncxMjE2MGlfY29kZTAxWzBdLCAmZncxMjE2MGlfbGVuZ3RoMDEsCisJICZmdzEyMTYwaV9hZGRyMDEsICZmdzEyMTYwaV92ZXJzaW9uX3N0clswXX0sCisJeyIgICAgICAgICIsIDB9Cit9OworCitzdGF0aWMgaW50IHFsYTEyODBfdmVyYm9zZSA9IDE7CisKKyNpZiBERUJVR19RTEExMjgwCitzdGF0aWMgaW50IHFsX2RlYnVnX2xldmVsID0gMTsKKyNkZWZpbmUgZHByaW50ayhsZXZlbCwgZm9ybWF0LCBhLi4uKQlcCisJZG8geyBpZiAocWxfZGVidWdfbGV2ZWwgPj0gbGV2ZWwpIHByaW50ayhLRVJOX0VSUiBmb3JtYXQsICMjYSk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgcWxhMTI4MF9kdW1wX2J1ZmZlcihsZXZlbCwgYnVmLCBzaXplKQlcCisJaWYgKHFsX2RlYnVnX2xldmVsID49IGxldmVsKSBfX3FsYTEyODBfZHVtcF9idWZmZXIoYnVmLCBzaXplKQorI2RlZmluZSBxbGExMjgwX3ByaW50X3Njc2lfY21kKGxldmVsLCBjbWQpCVwKKwlpZiAocWxfZGVidWdfbGV2ZWwgPj0gbGV2ZWwpIF9fcWxhMTI4MF9wcmludF9zY3NpX2NtZChjbWQpCisjZWxzZQorI2RlZmluZSBxbF9kZWJ1Z19sZXZlbAkJCTAKKyNkZWZpbmUgZHByaW50ayhsZXZlbCwgZm9ybWF0LCBhLi4uKQlkb3t9d2hpbGUoMCkKKyNkZWZpbmUgcWxhMTI4MF9kdW1wX2J1ZmZlcihhLCBiLCBjKQlkb3t9d2hpbGUoMCkKKyNkZWZpbmUgcWxhMTI4MF9wcmludF9zY3NpX2NtZChhLCBiKQlkb3t9d2hpbGUoMCkKKyNlbmRpZgorCisjZGVmaW5lIEVOVEVSKHgpCQlkcHJpbnRrKDMsICJxbGExMjgwIDogRW50ZXJpbmcgJXMoKVxuIiwgeCk7CisjZGVmaW5lIExFQVZFKHgpCQlkcHJpbnRrKDMsICJxbGExMjgwIDogTGVhdmluZyAlcygpXG4iLCB4KTsKKyNkZWZpbmUgRU5URVJfSU5UUih4KQkJZHByaW50ayg0LCAicWxhMTI4MCA6IEVudGVyaW5nICVzKClcbiIsIHgpOworI2RlZmluZSBMRUFWRV9JTlRSKHgpCQlkcHJpbnRrKDQsICJxbGExMjgwIDogTGVhdmluZyAlcygpXG4iLCB4KTsKKworCitzdGF0aWMgaW50IHFsYTEyODBfcmVhZF9udnJhbShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJdWludDE2X3QgKndwdHI7CisJdWludDhfdCBjaGtzdW07CisJaW50IGNudCwgaTsKKwlzdHJ1Y3QgbnZyYW0gKm52OworCisJRU5URVIoInFsYTEyODBfcmVhZF9udnJhbSIpOworCisJaWYgKGRyaXZlcl9zZXR1cC5ub19udnJhbSkKKwkJcmV0dXJuIDE7CisKKwlwcmludGsoS0VSTl9JTkZPICJzY3NpKCVsZCk6IFJlYWRpbmcgTlZSQU1cbiIsIGhhLT5ob3N0X25vKTsKKworCXdwdHIgPSAodWludDE2X3QgKikmaGEtPm52cmFtOworCW52ID0gJmhhLT5udnJhbTsKKwljaGtzdW0gPSAwOworCWZvciAoY250ID0gMDsgY250IDwgMzsgY250KyspIHsKKwkJKndwdHIgPSBxbGExMjgwX2dldF9udnJhbV93b3JkKGhhLCBjbnQpOworCQljaGtzdW0gKz0gKndwdHIgJiAweGZmOworCQljaGtzdW0gKz0gKCp3cHRyID4+IDgpICYgMHhmZjsKKwkJd3B0cisrOworCX0KKworCWlmIChudi0+aWQwICE9ICdJJyB8fCBudi0+aWQxICE9ICdTJyB8fAorCSAgICBudi0+aWQyICE9ICdQJyB8fCBudi0+aWQzICE9ICcgJyB8fCBudi0+dmVyc2lvbiA8IDEpIHsKKwkJZHByaW50aygyLCAiSW52YWxpZCBudnJhbSBJRCBvciB2ZXJzaW9uIVxuIik7CisJCWNoa3N1bSA9IDE7CisJfSBlbHNlIHsKKwkJZm9yICg7IGNudCA8IHNpemVvZihzdHJ1Y3QgbnZyYW0pOyBjbnQrKykgeworCQkJKndwdHIgPSBxbGExMjgwX2dldF9udnJhbV93b3JkKGhhLCBjbnQpOworCQkJY2hrc3VtICs9ICp3cHRyICYgMHhmZjsKKwkJCWNoa3N1bSArPSAoKndwdHIgPj4gOCkgJiAweGZmOworCQkJd3B0cisrOworCQl9CisJfQorCisJZHByaW50aygzLCAicWxhMTI4MF9yZWFkX252cmFtOiBOVlJBTSBNYWdpYyBJRD0gJWMgJWMgJWMgJTAyeCIKKwkgICAgICAgIiB2ZXJzaW9uICVpXG4iLCBudi0+aWQwLCBudi0+aWQxLCBudi0+aWQyLCBudi0+aWQzLAorCSAgICAgICBudi0+dmVyc2lvbik7CisKKworCWlmIChjaGtzdW0pIHsKKwkJaWYgKCFkcml2ZXJfc2V0dXAubm9fbnZyYW0pCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpKCVsZCk6IFVuYWJsZSB0byBpZGVudGlmeSBvciAiCisJCQkgICAgICAgInZhbGlkYXRlIE5WUkFNIGNoZWNrc3VtLCB1c2luZyBkZWZhdWx0ICIKKwkJCSAgICAgICAic2V0dGluZ3NcbiIsIGhhLT5ob3N0X25vKTsKKwkJaGEtPm52cmFtX3ZhbGlkID0gMDsKKwl9IGVsc2UKKwkJaGEtPm52cmFtX3ZhbGlkID0gMTsKKworCS8qIFRoZSBmaXJtd2FyZSBpbnRlcmZhY2UgaXMsIHVtLCBpbnRlcmVzdGluZywgaW4gdGhhdCB0aGUKKwkgKiBhY3R1YWwgZmlybXdhcmUgaW1hZ2Ugb24gdGhlIGNoaXAgaXMgbGl0dGxlIGVuZGlhbiwgdGh1cywKKwkgKiB0aGUgcHJvY2VzcyBvZiB0YWtpbmcgdGhhdCBpbWFnZSB0byB0aGUgQ1BVIHdvdWxkIGVuZCB1cAorCSAqIGxpdHRsZSBlbmRpYW4uICBIb3dldmVyLCB0aGUgZmlybWFyZSBpbnRlcmZhY2UgcmVxdWlyZXMgaXQKKwkgKiB0byBiZSByZWFkIGEgd29yZCAodHdvIGJ5dGVzKSBhdCBhIHRpbWUuCisJICoKKwkgKiBUaGUgbmV0IHJlc3VsdCBvZiB0aGlzIHdvdWxkIGJlIHRoYXQgdGhlIHdvcmQgKGFuZAorCSAqIGRvdWJsZXdvcmQpIHF1YW50aXRlcyBpbiB0aGUgZmlybXdhcmUgd291bGQgYmUgY29ycmVjdCwgYnV0CisJICogdGhlIGJ5dGVzIHdvdWxkIGJlIHBhaXJ3aXNlIHJldmVyc2VkLiAgU2luY2UgbW9zdCBvZiB0aGUKKwkgKiBmaXJtd2FyZSBxdWFudGl0ZXMgYXJlLCBpbiBmYWN0LCBieXRlcywgd2UgZG8gYW4gZXh0cmEKKwkgKiBsZTE2X3RvX2NwdSgpIGluIHRoZSBmaXJtd2FyZSByZWFkIHJvdXRpbmUuCisJICoKKwkgKiBUaGUgdXBzaG90IG9mIGFsbCB0aGlzIGlzIHRoYXQgdGhlIGJ5dGVzIGluIHRoZSBmaXJtd2FyZQorCSAqIGFyZSBpbiB0aGUgY29ycmVjdCBwbGFjZXMsIGJ1dCB0aGUgMTYgYW5kIDMyIGJpdCBxdWFudGl0ZXMKKwkgKiBhcmUgc3RpbGwgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQuICBXZSBmaXggdGhhdCB1cCBiZWxvdyBieQorCSAqIGRvaW5nIGV4dHJhIHJldmVyc2VzIG9uIHRoZW0gKi8KKwludi0+aXNwX3BhcmFtZXRlciA9IGNwdV90b19sZTE2KG52LT5pc3BfcGFyYW1ldGVyKTsKKwludi0+ZmlybXdhcmVfZmVhdHVyZS53ID0gY3B1X3RvX2xlMTYobnYtPmZpcm13YXJlX2ZlYXR1cmUudyk7CisJZm9yKGkgPSAwOyBpIDwgTUFYX0JVU0VTOyBpKyspIHsKKwkJbnYtPmJ1c1tpXS5zZWxlY3Rpb25fdGltZW91dCA9IGNwdV90b19sZTE2KG52LT5idXNbaV0uc2VsZWN0aW9uX3RpbWVvdXQpOworCQludi0+YnVzW2ldLm1heF9xdWV1ZV9kZXB0aCA9IGNwdV90b19sZTE2KG52LT5idXNbaV0ubWF4X3F1ZXVlX2RlcHRoKTsKKwl9CisJZHByaW50aygxLCAicWxhMTI4MF9yZWFkX252cmFtOiBDb21wbGV0ZWQgUmVhZGluZyBOVlJBTVxuIik7CisJTEVBVkUoInFsYTEyODBfcmVhZF9udnJhbSIpOworCisJcmV0dXJuIGNoa3N1bTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIHFsYTEyODBfaW5mbworICogICAgIFJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBkcml2ZXIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY29uc3QgY2hhciAqCitxbGExMjgwX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdGF0aWMgY2hhciBxbGExMjgwX3Njc2lfbmFtZV9idWZmZXJbMTI1XTsKKwljaGFyICpicDsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisJc3RydWN0IHFsYV9ib2FyZHMgKmJkcDsKKworCWJwID0gJnFsYTEyODBfc2NzaV9uYW1lX2J1ZmZlclswXTsKKwloYSA9IChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKWhvc3QtPmhvc3RkYXRhOworCWJkcCA9ICZxbDEyODBfYm9hcmRfdGJsW2hhLT5kZXZudW1dOworCW1lbXNldChicCwgMCwgc2l6ZW9mKHFsYTEyODBfc2NzaV9uYW1lX2J1ZmZlcikpOworCisJc3ByaW50ZiAoYnAsCisJCSAiUUxvZ2ljICVzIFBDSSB0byBTQ1NJIEhvc3QgQWRhcHRlclxuIgorCQkgIiAgICAgICBGaXJtd2FyZSB2ZXJzaW9uOiAlMmQuJTAyZC4lMDJkLCBEcml2ZXIgdmVyc2lvbiAlcyIsCisJCSAmYmRwLT5uYW1lWzBdLCBiZHAtPmZ3dmVyWzBdLCBiZHAtPmZ3dmVyWzFdLCBiZHAtPmZ3dmVyWzJdLAorCQkgUUxBMTI4MF9WRVJTSU9OKTsKKwlyZXR1cm4gYnA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBxbGExMjAwX3F1ZXVlY29tbWFuZAorICogICAgIFF1ZXVlIGEgY29tbWFuZCB0byB0aGUgY29udHJvbGxlci4KKyAqCisgKiBOb3RlOgorICogVGhlIG1pZC1sZXZlbCBkcml2ZXIgdHJpZXMgdG8gZW5zdXJlcyB0aGF0IHF1ZXVlY29tbWFuZCBuZXZlciBnZXRzIGludm9rZWQKKyAqIGNvbmN1cnJlbnRseSB3aXRoIGl0c2VsZiBvciB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKGFsdGhvdWdoIHRoZQorICogaW50ZXJydXB0IGhhbmRsZXIgbWF5IGNhbGwgdGhpcyByb3V0aW5lIGFzIHBhcnQgb2YgcmVxdWVzdC1jb21wbGV0aW9uCisgKiBoYW5kbGluZykuICAgVW5mb3J0dW5lbHksIGl0IHNvbWV0aW1lcyBjYWxscyB0aGUgc2NoZWR1bGVyIGluIGludGVycnVwdAorICogY29udGV4dCB3aGljaCBpcyBhIGJpZyBOTyEgTk8hLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorcWxhMTI4MF9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kLCB2b2lkICgqZm4pKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKWhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBzcmIgKnNwID0gKHN0cnVjdCBzcmIgKikmY21kLT5TQ3A7CisJaW50IHN0YXR1czsKKworCWNtZC0+c2NzaV9kb25lID0gZm47CisJc3AtPmNtZCA9IGNtZDsKKwlzcC0+ZmxhZ3MgPSAwOworCisJcWxhMTI4MF9wcmludF9zY3NpX2NtZCg1LCBjbWQpOworCisjaWZkZWYgUUxBXzY0QklUX1BUUgorCS8qCisJICogVXNpbmcgNjQgYml0IGNvbW1hbmRzIGlmIHRoZSBQQ0kgYnJpZGdlIGRvZXNuJ3Qgc3VwcG9ydCBpdCBpcyBhCisJICogYml0IHdhc3RlZnVsLCBob3dldmVyIHRoaXMgc2hvdWxkIHJlYWxseSBvbmx5IGhhcHBlbiBpZiBvbmUncworCSAqIFBDSSBjb250cm9sbGVyIGlzIGNvbXBsZXRlbHkgYnJva2VuLCBsaWtlIHRoZSBCQ00xMjUwLiBGb3IKKwkgKiBzYW5lIGhhcmR3YXJlIHRoaXMgaXMgbm90IGFuIGlzc3VlLgorCSAqLworCXN0YXR1cyA9IHFsYTEyODBfNjRiaXRfc3RhcnRfc2NzaShoYSwgc3ApOworI2Vsc2UKKwlzdGF0dXMgPSBxbGExMjgwXzMyYml0X3N0YXJ0X3Njc2koaGEsIHNwKTsKKyNlbmRpZgorCXJldHVybiBzdGF0dXM7Cit9CisKK2VudW0gYWN0aW9uIHsKKwlBQk9SVF9DT01NQU5ELAorCUFCT1JUX0RFVklDRSwKKwlERVZJQ0VfUkVTRVQsCisJQlVTX1JFU0VULAorCUFEQVBURVJfUkVTRVQsCisJRkFJTAorfTsKKworLyogdGltZXIgYWN0aW9uIGZvciBlcnJvciBhY3Rpb24gcHJvY2Vzc29yICovCitzdGF0aWMgdm9pZCBxbGExMjgwX2Vycm9yX3dhaXRfdGltZW91dCh1bnNpZ25lZCBsb25nIF9fZGF0YSkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKV9fZGF0YTsKKwlzdHJ1Y3Qgc3JiICpzcCA9IChzdHJ1Y3Qgc3JiICopQ01EX1NQKGNtZCk7CisKKwljb21wbGV0ZShzcC0+d2FpdCk7Cit9CisKK3N0YXRpYyB2b2lkIHFsYTEyODBfbWFpbGJveF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgX19kYXRhKQoreworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKV9fZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlX3JlZyBfX2lvbWVtICpyZWc7CisJcmVnID0gaGEtPmlvYmFzZTsKKworCWhhLT5tYWlsYm94X291dFswXSA9IFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gwKTsKKwlwcmludGsoS0VSTl9FUlIgInNjc2koJWxkKTogbWFpbGJveCB0aW1lZCBvdXQsIG1haWxib3gwICUwNHgsICIKKwkgICAgICAgImljdHJsICUwNHgsIGlzdGF0dXMgJTA0eFxuIiwgaGEtPmhvc3Rfbm8sIGhhLT5tYWlsYm94X291dFswXSwKKwkgICAgICAgUkRfUkVHX1dPUkQoJnJlZy0+aWN0cmwpLCBSRF9SRUdfV09SRCgmcmVnLT5pc3RhdHVzKSk7CisJY29tcGxldGUoaGEtPm1haWxib3hfd2FpdCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcWxhMTIwMF9lcnJvcl9hY3Rpb24KKyAqICAgIFRoZSBmdW5jdGlvbiB3aWxsIGF0dGVtcHQgdG8gcGVyZm9ybSBhIHNwZWNpZmllZCBlcnJvciBhY3Rpb24gYW5kCisgKiAgICB3YWl0IGZvciB0aGUgcmVzdWx0cyAob3IgdGltZSBvdXQpLgorICoKKyAqIElucHV0OgorICogICAgICBjbWQgPSBMaW51eCBTQ1NJIGNvbW1hbmQgcGFja2V0IG9mIHRoZSBjb21tYW5kIHRoYXQgY2F1c2UgdGhlCisgKiAgICAgICAgICAgIGJ1cyByZXNldC4KKyAqICAgICAgYWN0aW9uID0gZXJyb3IgYWN0aW9uIHRvIHRha2UgKHNlZSBhY3Rpb25fdCkKKyAqCisgKiBSZXR1cm5zOgorICogICAgICBTVUNDRVNTIG9yIEZBSUxFRAorICoKKyAqIE5vdGU6CisgKiAgICAgIFJlc2V0dGluZyB0aGUgYnVzIGFsd2F5cyBzdWNjZWVkcyAtIGlzIGhhcyB0bywgb3RoZXJ3aXNlIHRoZQorICogICAgICBrZXJuZWwgd2lsbCBwYW5pYyEgVHJ5IGEgc3VyZ2ljYWwgdGVjaG5pcXVlIC0gc2VuZGluZyBhIEJVUworICogICAgICBERVZJQ0UgUkVTRVQgbWVzc2FnZSAtIG9uIHRoZSBvZmZlbmRpbmcgdGFyZ2V0IGJlZm9yZSBwdWxsaW5nCisgKiAgICAgIHRoZSBTQ1NJIGJ1cyByZXNldCBsaW5lLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorcWxhMTI4MF9lcnJvcl9hY3Rpb24oc3RydWN0IHNjc2lfY21uZCAqY21kLCBlbnVtIGFjdGlvbiBhY3Rpb24pCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCWludCBidXMsIHRhcmdldCwgbHVuOworCXN0cnVjdCBzcmIgKnNwOworCXVpbnQxNl90IGRhdGE7CisJdW5zaWduZWQgY2hhciAqaGFuZGxlOworCWludCByZXN1bHQsIGk7CisJREVDTEFSRV9DT01QTEVUSU9OKHdhaXQpOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCisJaGEgPSAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKikoQ01EX0hPU1QoY21kKS0+aG9zdGRhdGEpOworCisJZHByaW50ayg0LCAiZXJyb3JfYWN0aW9uICVpLCBpc3RhdHVzIDB4JTA0eFxuIiwgYWN0aW9uLAorCQlSRF9SRUdfV09SRCgmaGEtPmlvYmFzZS0+aXN0YXR1cykpOworCisJZHByaW50ayg0LCAiaG9zdF9jbWQgMHglMDR4LCBpY3RybCAweCUwNHgsIGppZmZpZXMgJWxpXG4iLAorCQlSRF9SRUdfV09SRCgmaGEtPmlvYmFzZS0+aG9zdF9jbWQpLAorCQlSRF9SRUdfV09SRCgmaGEtPmlvYmFzZS0+aWN0cmwpLCBqaWZmaWVzKTsKKworCUVOVEVSKCJxbGExMjgwX2Vycm9yX2FjdGlvbiIpOworCWlmIChxbGExMjgwX3ZlcmJvc2UpCisJCXByaW50ayhLRVJOX0lORk8gInNjc2koJWxpKTogUmVzZXR0aW5nIENtbmQ9MHglcCwgIgorCQkgICAgICAgIkhhbmRsZT0weCVwLCBhY3Rpb249MHgleFxuIiwKKwkJICAgICAgIGhhLT5ob3N0X25vLCBjbWQsIENNRF9IQU5ETEUoY21kKSwgYWN0aW9uKTsKKworCWlmIChjbWQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIoc2NzaT86Pzo/Oj8pIFJlc2V0IGNhbGxlZCB3aXRoIE5VTEwgIgorCQkgICAgICAgInNpX0NtbmQgcG9pbnRlciwgZmFpbGluZy5cbiIpOworCQlMRUFWRSgicWxhMTI4MF9lcnJvcl9hY3Rpb24iKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwloYSA9IChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlzcCA9IChzdHJ1Y3Qgc3JiICopQ01EX1NQKGNtZCk7CisJaGFuZGxlID0gQ01EX0hBTkRMRShjbWQpOworCisJLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KKwlkYXRhID0gcWxhMTI4MF9kZWJvdW5jZV9yZWdpc3RlcigmaGEtPmlvYmFzZS0+aXN0YXR1cyk7CisJLyoKKwkgKiBUaGUgaW9fcmVxdWVzdF9sb2NrIGlzIGhlbGQgd2hlbiB0aGUgcmVzZXQgaGFuZGxlciBpcyBjYWxsZWQsIGhlbmNlCisJICogdGhlIGludGVycnVwdCBoYW5kbGVyIGNhbm5vdCBiZSBydW5uaW5nIGluIHBhcmFsbGVsIGFzIGl0IGFsc28KKwkgKiBncmFicyB0aGUgbG9jay4gL0plcworCSAqLworCWlmIChkYXRhICYgUklTQ19JTlQpCisJCXFsYTEyODBfaXNyKGhhLCAmaGEtPmRvbmVfcSk7CisKKwkvKgorCSAqIERldGVybWluZSB0aGUgc3VnZ2VzdGVkIGFjdGlvbiB0aGF0IHRoZSBtaWQtbGV2ZWwgZHJpdmVyIHdhbnRzCisJICogdXMgdG8gcGVyZm9ybS4KKwkgKi8KKwlpZiAoaGFuZGxlID09ICh1bnNpZ25lZCBjaGFyICopSU5WQUxJRF9IQU5ETEUgfHwgaGFuZGxlID09IE5VTEwpIHsKKwkJaWYoYWN0aW9uID09IEFCT1JUX0NPTU1BTkQpIHsKKwkJCS8qIHdlIG5ldmVyIGdvdCB0aGlzIGNvbW1hbmQgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gInFsYTEyODA6IEFib3J0aW5nIGEgTlVMTCBoYW5kbGVcbiIpOworCQkJcmV0dXJuIFNVQ0NFU1M7CS8qIG5vIGFjdGlvbiAtIHdlIGRvbid0IGhhdmUgY29tbWFuZCAqLworCQl9CisJfSBlbHNlIHsKKwkJc3AtPndhaXQgPSAmd2FpdDsKKwl9CisKKwlidXMgPSBTQ1NJX0JVU18zMihjbWQpOworCXRhcmdldCA9IFNDU0lfVENOXzMyKGNtZCk7CisJbHVuID0gU0NTSV9MVU5fMzIoY21kKTsKKworCS8qIE92ZXJsb2FkaW5nIHJlc3VsdC4gIEhlcmUgaXQgbWVhbnMgdGhlIHN1Y2Nlc3Mgb3IgZmFpbCBvZiB0aGUKKwkgKiAqaXNzdWUqIG9mIHRoZSBhY3Rpb24uICBXaGVuIHdlIHJldHVybiBmcm9tIHRoZSByb3V0aW5lLCBpdCBtdXN0CisJICogbWVhbiB0aGUgYWN0dWFsIHN1Y2Nlc3Mgb3IgZmFpbCBvZiB0aGUgYWN0aW9uICovCisJcmVzdWx0ID0gRkFJTEVEOworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBGQUlMOgorCQlicmVhazsKKworCWNhc2UgQUJPUlRfQ09NTUFORDoKKwkJaWYgKChzcC0+ZmxhZ3MgJiBTUkJfQUJPUlRfUEVORElORykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAic2NzaSgpOiBDb21tYW5kIGhhcyBhIHBlbmRpbmcgYWJvcnQgIgorCQkJICAgICAgICJtZXNzYWdlIC0gQUJPUlRfUEVORElORy5cbiIpOworCQkJLyogVGhpcyBzaG91bGQgdGVjaG5pY2FsbHkgYmUgaW1wb3NzaWJsZSBzaW5jZSB3ZQorCQkJICogbm93IHdhaXQgZm9yIGFib3J0IGNvbXBsZXRpb24gKi8KKwkJCWJyZWFrOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgaSsrKSB7CisJCQlpZiAoc3AgPT0gaGEtPm91dHN0YW5kaW5nX2NtZHNbaV0pIHsKKwkJCQlkcHJpbnRrKDEsICJxbGExMjgwOiBSSVNDIGFib3J0aW5nIGNvbW1hbmRcbiIpOworCQkJCWlmIChxbGExMjgwX2Fib3J0X2NvbW1hbmQoaGEsIHNwLCBpKSA9PSAwKQorCQkJCQlyZXN1bHQgPSBTVUNDRVNTOworCQkJCWVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBTaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQgbWlnaHQKKwkJCQkJICogaGF2ZSBoYXBwZW5kIHRvIHRoZSBjb21tYW5kLCBpdAorCQkJCQkgKiBpcyB1bnNhZmUgdG8gcmVtb3ZlIGl0IGZyb20gdGhlCisJCQkJCSAqIGRldmljZSdzIHF1ZXVlIGF0IHRoaXMgcG9pbnQuCisJCQkJCSAqIFdhaXQgYW5kIGxldCB0aGUgZXNjYWxhdGlvbgorCQkJCQkgKiBwcm9jZXNzIHRha2UgY2FyZSBvZiBpdC4KKwkJCQkJICovCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJICAgICAgICJzY3NpKCVsaTolaTolaTolaSk6IFVuYWJsZSIKKwkJCQkJICAgICAgICIgdG8gYWJvcnQgY29tbWFuZCFcbiIsCisJCQkJCSAgICAgICBoYS0+aG9zdF9ubywgYnVzLCB0YXJnZXQsIGx1bik7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBBQk9SVF9ERVZJQ0U6CisJCWhhLT5mbGFncy5pbl9yZXNldCA9IDE7CisJCWlmIChxbGExMjgwX3ZlcmJvc2UpCisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgInNjc2koJWxkOiVkOiVkOiVkKTogUXVldWVpbmcgYWJvcnQgZGV2aWNlICIKKwkJCSAgICAgICAiY29tbWFuZC5cbiIsIGhhLT5ob3N0X25vLCBidXMsIHRhcmdldCwgbHVuKTsKKwkJaWYgKHFsYTEyODBfYWJvcnRfZGV2aWNlKGhhLCBidXMsIHRhcmdldCwgbHVuKSA9PSAwKQorCQkJcmVzdWx0ID0gU1VDQ0VTUzsKKwkJYnJlYWs7CisKKwljYXNlIERFVklDRV9SRVNFVDoKKwkJaWYgKHFsYTEyODBfdmVyYm9zZSkKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAic2NzaSglbGQ6JWQ6JWQ6JWQpOiBRdWV1ZWluZyBkZXZpY2UgcmVzZXQgIgorCQkJICAgICAgICJjb21tYW5kLlxuIiwgaGEtPmhvc3Rfbm8sIGJ1cywgdGFyZ2V0LCBsdW4pOworCQloYS0+ZmxhZ3MuaW5fcmVzZXQgPSAxOworCQlpZiAocWxhMTI4MF9kZXZpY2VfcmVzZXQoaGEsIGJ1cywgdGFyZ2V0KSA9PSAwKQorCQkJcmVzdWx0ID0gU1VDQ0VTUzsKKwkJYnJlYWs7CisKKwljYXNlIEJVU19SRVNFVDoKKwkJaWYgKHFsYTEyODBfdmVyYm9zZSkKKwkJCXByaW50ayhLRVJOX0lORk8gInFsYTEyODAoJWxkOiVkKTogSXNzdWluZyBCVVMgIgorCQkJICAgICAgICJERVZJQ0UgUkVTRVRcbiIsIGhhLT5ob3N0X25vLCBidXMpOworCQloYS0+ZmxhZ3MuaW5fcmVzZXQgPSAxOworCQlpZiAocWxhMTI4MF9idXNfcmVzZXQoaGEsIGJ1cyA9PSAwKSkKKwkJCXJlc3VsdCA9IFNVQ0NFU1M7CisKKwkJYnJlYWs7CisKKwljYXNlIEFEQVBURVJfUkVTRVQ6CisJZGVmYXVsdDoKKwkJaWYgKHFsYTEyODBfdmVyYm9zZSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICJzY3NpKCVsZCk6IElzc3VlZCBBREFQVEVSIFJFU0VUXG4iLAorCQkJICAgICAgIGhhLT5ob3N0X25vKTsKKwkJCXByaW50ayhLRVJOX0lORk8gInNjc2koJWxkKTogSS9PIHByb2Nlc3Npbmcgd2lsbCAiCisJCQkgICAgICAgImNvbnRpbnVlIGF1dG9tYXRpY2FsbHlcbiIsIGhhLT5ob3N0X25vKTsKKwkJfQorCQloYS0+ZmxhZ3MucmVzZXRfYWN0aXZlID0gMTsKKwkJLyoKKwkJICogV2UgcmVzdGFydGVkIGFsbCBvZiB0aGUgY29tbWFuZHMgYXV0b21hdGljYWxseSwgc28gdGhlCisJCSAqIG1pZC1sZXZlbCBjb2RlIGNhbiBleHBlY3QgY29tcGxldGlvbnMgbW9tZW50aXRhcmlseS4KKwkJICovCisJCWlmIChxbGExMjgwX2Fib3J0X2lzcChoYSkgPT0gMCkKKwkJCXJlc3VsdCA9IFNVQ0NFU1M7CisKKwkJaGEtPmZsYWdzLnJlc2V0X2FjdGl2ZSA9IDA7CisJfQorCisJaWYgKCFsaXN0X2VtcHR5KCZoYS0+ZG9uZV9xKSkKKwkJcWxhMTI4MF9kb25lKGhhKTsKKwloYS0+ZmxhZ3MuaW5fcmVzZXQgPSAwOworCisJLyogSWYgd2UgZGlkbid0IG1hbmFnZSB0byBpc3N1ZSB0aGUgYWN0aW9uLCBvciB3ZSBoYXZlIG5vCisJICogY29tbWFuZCB0byB3YWl0IGZvciwgZXhpdCBoZXJlICovCisJaWYgKHJlc3VsdCA9PSBGQUlMRUQgfHwgaGFuZGxlID09IE5VTEwgfHwKKwkgICAgaGFuZGxlID09ICh1bnNpZ25lZCBjaGFyICopSU5WQUxJRF9IQU5ETEUpIHsKKwkJLyoKKwkJICogQ2xlYXIgY29tcGxldGlvbiBxdWV1ZSB0byBhdm9pZCBxbGExMjgwX2RvbmUoKSB0cnlpbmcKKwkJICogdG8gY29tcGxldGUgdGhlIGNvbW1hbmQgYXQgYSBsYXRlciBzdGFnZSBhZnRlciB3ZQorCQkgKiBoYXZlIGV4aXRlZCB0aGUgY3VycmVudCBjb250ZXh0CisJCSAqLworCQlzcC0+d2FpdCA9IE5VTEw7CisJCWdvdG8gbGVhdmU7CisJfQorCisJLyogc2V0IHVwIGEgdGltZXIganVzdCBpbiBjYXNlIHdlJ3JlIHJlYWxseSBqYW1tZWQgKi8KKwlpbml0X3RpbWVyKCZ0aW1lcik7CisJdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyA0KkhaOworCXRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyljbWQ7CisJdGltZXIuZnVuY3Rpb24gPSBxbGExMjgwX2Vycm9yX3dhaXRfdGltZW91dDsKKwlhZGRfdGltZXIoJnRpbWVyKTsKKworCS8qIHdhaXQgZm9yIHRoZSBhY3Rpb24gdG8gY29tcGxldGUgKG9yIHRoZSB0aW1lciB0byBleHBpcmUpICovCisJc3Bpbl91bmxvY2tfaXJxKEhPU1RfTE9DSyk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmd2FpdCk7CisJZGVsX3RpbWVyX3N5bmMoJnRpbWVyKTsKKwlzcGluX2xvY2tfaXJxKEhPU1RfTE9DSyk7CisJc3AtPndhaXQgPSBOVUxMOworCisJLyogdGhlIG9ubHkgYWN0aW9uIHdlIG1pZ2h0IGdldCBhIGZhaWwgZm9yIGlzIGFib3J0ICovCisJaWYgKGFjdGlvbiA9PSBBQk9SVF9DT01NQU5EKSB7CisJCWlmKHNwLT5mbGFncyAmIFNSQl9BQk9SVEVEKQorCQkJcmVzdWx0ID0gU1VDQ0VTUzsKKwkJZWxzZQorCQkJcmVzdWx0ID0gRkFJTEVEOworCX0KKworIGxlYXZlOgorCWRwcmludGsoMSwgIlJFU0VUIHJldHVybmluZyAlZFxuIiwgcmVzdWx0KTsKKworCUxFQVZFKCJxbGExMjgwX2Vycm9yX2FjdGlvbiIpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBxbGExMjgwX2Fib3J0CisgKiAgICAgQWJvcnQgdGhlIHNwZWNpZmllZCBTQ1NJIGNvbW1hbmQocykuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitxbGExMjgwX2VoX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKiBjbWQpCit7CisJcmV0dXJuIHFsYTEyODBfZXJyb3JfYWN0aW9uKGNtZCwgQUJPUlRfQ09NTUFORCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBxbGExMjgwX2RldmljZV9yZXNldAorICogICAgIFJlc2V0IHRoZSBzcGVjaWZpZWQgU0NTSSBkZXZpY2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK3FsYTEyODBfZWhfZGV2aWNlX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlyZXR1cm4gcWxhMTI4MF9lcnJvcl9hY3Rpb24oY21kLCBERVZJQ0VfUkVTRVQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgcWxhMTI4MF9idXNfcmVzZXQKKyAqICAgICBSZXNldCB0aGUgc3BlY2lmaWVkIGJ1cy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK3FsYTEyODBfZWhfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlyZXR1cm4gcWxhMTI4MF9lcnJvcl9hY3Rpb24oY21kLCBCVVNfUkVTRVQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgcWxhMTI4MF9hZGFwdGVyX3Jlc2V0CisgKiAgICAgUmVzZXQgdGhlIHNwZWNpZmllZCBhZGFwdGVyIChib3RoIGNoYW5uZWxzKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorcWxhMTI4MF9laF9hZGFwdGVyX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlyZXR1cm4gcWxhMTI4MF9lcnJvcl9hY3Rpb24oY21kLCBBREFQVEVSX1JFU0VUKTsKK30KKworc3RhdGljIGludAorcWxhMTI4MF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkgIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgZ2VvbVtdKQoreworCWludCBoZWFkcywgc2VjdG9ycywgY3lsaW5kZXJzOworCisJaGVhZHMgPSA2NDsKKwlzZWN0b3JzID0gMzI7CisJY3lsaW5kZXJzID0gKHVuc2lnbmVkIGxvbmcpY2FwYWNpdHkgLyAoaGVhZHMgKiBzZWN0b3JzKTsKKwlpZiAoY3lsaW5kZXJzID4gMTAyNCkgeworCQloZWFkcyA9IDI1NTsKKwkJc2VjdG9ycyA9IDYzOworCQljeWxpbmRlcnMgPSAodW5zaWduZWQgbG9uZyljYXBhY2l0eSAvIChoZWFkcyAqIHNlY3RvcnMpOworCQkvKiBpZiAoY3lsaW5kZXJzID4gMTAyMykKKwkJICAgY3lsaW5kZXJzID0gMTAyMzsgKi8KKwl9CisKKwlnZW9tWzBdID0gaGVhZHM7CisJZ2VvbVsxXSA9IHNlY3RvcnM7CisJZ2VvbVsyXSA9IGN5bGluZGVyczsKKworCXJldHVybiAwOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgMHgwMjA2MDAKK3N0YXRpYyBpbnQKK3FsYTEyODBfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdGVtcGxhdGUpCit7CisJc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkID0gJnFsYTEyODBfcGNpX3RibFswXTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJaW50IG51bV9ob3N0cyA9IDA7CisKKwlpZiAoc2l6ZW9mKHN0cnVjdCBzcmIpID4gc2l6ZW9mKFNjc2lfUG9pbnRlcikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgInFsYTEyODA6IHN0cnVjdCBzcmIgdG9vIGJpZywgYWJvcnRpbmdcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKERNQV9CSURJUkVDVElPTkFMICE9IFBDSV9ETUFfQklESVJFQ1RJT05BTCkgfHwKKwkgICAgKERNQV9UT19ERVZJQ0UgIT0gUENJX0RNQV9UT0RFVklDRSkgfHwKKwkgICAgKERNQV9GUk9NX0RFVklDRSAhPSBQQ0lfRE1BX0ZST01ERVZJQ0UpIHx8CisJICAgIChETUFfTk9ORSAhPSBQQ0lfRE1BX05PTkUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJxbGExMjgwOiBkbWEgZGlyZWN0aW9uIGJpdHMgZG9uJ3QgbWF0Y2hcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBNT0RVTEUKKwkvKgorCSAqIElmIHdlIGFyZSBjYWxsZWQgYXMgYSBtb2R1bGUsIHRoZSBxbGExMjgwIHBvaW50ZXIgbWF5IG5vdCBiZSBudWxsCisJICogYW5kIGl0IHdvdWxkIHBvaW50IHRvIG91ciBib290dXAgc3RyaW5nLCBqdXN0IGxpa2Ugb24gdGhlIGxpbG8KKwkgKiBjb21tYW5kIGxpbmUuICBJRiBub3QgTlVMTCwgdGhlbiBwcm9jZXNzIHRoaXMgY29uZmlnIHN0cmluZyB3aXRoCisJICogcWxhMTI4MF9zZXR1cAorCSAqCisJICogQm9vdCB0aW1lIE9wdGlvbnMKKwkgKiBUbyBhZGQgb3B0aW9ucyBhdCBib290IHRpbWUgYWRkIGEgbGluZSB0byB5b3VyIGxpbG8uY29uZiBmaWxlIGxpa2U6CisJICogYXBwZW5kPSJxbGExMjgwPXZlcmJvc2UsbWF4X3RhZ3M6e3syNTUsMjU1LDI1NSwyNTV9LHsyNTUsMjU1LDI1NSwyNTV9fSIKKwkgKiB3aGljaCB3aWxsIHJlc3VsdCBpbiB0aGUgZmlyc3QgZm91ciBkZXZpY2VzIG9uIHRoZSBmaXJzdCB0d28KKwkgKiBjb250cm9sbGVycyBiZWluZyBzZXQgdG8gYSB0YWdnZWQgcXVldWUgZGVwdGggb2YgMzIuCisJICovCisJaWYgKHFsYTEyODApCisJCXFsYTEyODBfc2V0dXAocWxhMTI4MCk7CisjZW5kaWYKKworCS8qIEZpcnN0IEluaXRpYWxpemUgUUxBMTIxNjAgb24gUENJIEJ1cyAxIERldiAyICovCisJd2hpbGUgKChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKGlkLT52ZW5kb3IsIGlkLT5kZXZpY2UsIHBkZXYpKSkgeworCQlpZiAocGRldi0+YnVzLT5udW1iZXIgPT0gMSAmJiBQQ0lfU0xPVChwZGV2LT5kZXZmbikgPT0gMikgeworCQkJaWYgKCFxbGExMjgwX3Byb2JlX29uZShwZGV2LCBpZCkpCisJCQkJbnVtX2hvc3RzKys7CisJCX0KKwl9CisKKwlwZGV2ID0gTlVMTDsKKwkvKiBUcnkgYW5kIGZpbmQgZWFjaCBkaWZmZXJlbnQgdHlwZSBvZiBhZGFwdGVyIHdlIHN1cHBvcnQgKi8KKwlmb3IgKGlkID0gJnFsYTEyODBfcGNpX3RibFswXTsgaWQtPmRldmljZTsgaWQrKykgeworCQl3aGlsZSAoKHBkZXYgPSBwY2lfZmluZF9kZXZpY2UoaWQtPnZlbmRvciwgaWQtPmRldmljZSwgcGRldikpKSB7CisJCQkvKgorCQkJICogc2tpcCBRTEExMjE2MCBhbHJlYWR5IGluaXRpYWxpemVkIG9uCisJCQkgKiBQQ0kgQnVzIDEgRGV2IDIgc2luY2Ugd2UgYWxyZWFkeSBpbml0aWFsaXplZAorCQkJICogYW5kIHByZXNlbnRlZCBpdAorCQkJICovCisJCQlpZiAoaWQtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMjE2MCAmJgorCQkJICAgIHBkZXYtPmJ1cy0+bnVtYmVyID09IDEgJiYKKwkJCSAgICBQQ0lfU0xPVChwZGV2LT5kZXZmbikgPT0gMikKKwkJCQljb250aW51ZTsKKworCQkJaWYgKCFxbGExMjgwX3Byb2JlX29uZShwZGV2LCBpZCkpCisJCQkJbnVtX2hvc3RzKys7CisJCX0KKwl9CisKKwlyZXR1cm4gbnVtX2hvc3RzOworfQorCisvKgorICogVGhpcyBsb29rcyBhIGJpdCB1Z2x5IGFzIHdlIGNvdWxkIGp1c3QgcGFzcyBkb3duIGhvc3QgdG8KKyAqIHFsYTEyODBfcmVtb3ZlX29uZSwgYnV0IEkgd2FudCB0byBrZWVwIHFsYTEyODBfcmVsZWFzZSBwdXJlbHkgYSB3cmFwcGVyCisgKiBhcm91bmQgcGNpX2RyaXZlcjo6cmVtb3ZlIGFzIHVzZWQgZnJvbSAyLjYgb253YXJkcy4KKyAqLworc3RhdGljIGludAorcWxhMTI4MF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopaG9zdC0+aG9zdGRhdGE7CisKKwlxbGExMjgwX3JlbW92ZV9vbmUoaGEtPnBkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitxbGExMjgwX2Jpb3NwYXJhbV9vbGQoRGlzayAqIGRpc2ssIGtkZXZfdCBkZXYsIGludCBnZW9tW10pCit7CisJcmV0dXJuIHFsYTEyODBfYmlvc3BhcmFtKGRpc2stPmRldmljZSwgTlVMTCwgZGlzay0+Y2FwYWNpdHksIGdlb20pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcWxhMTI4MF9pbnRyX2hhbmRsZXIKKyAqICAgSGFuZGxlcyB0aGUgSC9XIGludGVycnVwdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlycXJldHVybl90CitxbGExMjgwX2ludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKKwlzdHJ1Y3QgZGV2aWNlX3JlZyBfX2lvbWVtICpyZWc7CisJdTE2IGRhdGE7CisJaW50IGhhbmRsZWQgPSAwOworCisJRU5URVJfSU5UUiAoInFsYTEyODBfaW50cl9oYW5kbGVyIik7CisJaGEgPSAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKilkZXZfaWQ7CisKKwlzcGluX2xvY2soSE9TVF9MT0NLKTsKKworCWhhLT5pc3JfY291bnQrKzsKKwlyZWcgPSBoYS0+aW9iYXNlOworCisJV1JUX1JFR19XT1JEKCZyZWctPmljdHJsLCAwKTsJLyogZGlzYWJsZSBvdXIgaW50ZXJydXB0LiAqLworCisJZGF0YSA9IHFsYTEyODBfZGVib3VuY2VfcmVnaXN0ZXIoJnJlZy0+aXN0YXR1cyk7CisJLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KKwlpZiAoZGF0YSAmIFJJU0NfSU5UKSB7CQorCQlxbGExMjgwX2lzcihoYSwgJmhhLT5kb25lX3EpOworCQloYW5kbGVkID0gMTsKKwl9CisJaWYgKCFsaXN0X2VtcHR5KCZoYS0+ZG9uZV9xKSkKKwkJcWxhMTI4MF9kb25lKGhhKTsKKworCXNwaW5fdW5sb2NrKEhPU1RfTE9DSyk7CisKKwkvKiBlbmFibGUgb3VyIGludGVycnVwdC4gKi8KKwlXUlRfUkVHX1dPUkQoJnJlZy0+aWN0cmwsIChJU1BfRU5fSU5UIHwgSVNQX0VOX1JJU0MpKTsKKworCUxFQVZFX0lOVFIoInFsYTEyODBfaW50cl9oYW5kbGVyIik7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKworc3RhdGljIGludAorcWxhMTI4MF9zZXRfdGFyZ2V0X3BhcmFtZXRlcnMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBpbnQgYnVzLCBpbnQgdGFyZ2V0KQoreworCXVpbnQ4X3QgbXI7CisJdWludDE2X3QgbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF07CisJc3RydWN0IG52cmFtICpudjsKKwlpbnQgc3RhdHVzOworCisJbnYgPSAmaGEtPm52cmFtOworCisJbXIgPSBCSVRfMyB8IEJJVF8yIHwgQklUXzEgfCBCSVRfMDsKKworCS8qIFNldCBUYXJnZXQgUGFyYW1ldGVycy4gKi8KKwltYlswXSA9IE1CQ19TRVRfVEFSR0VUX1BBUkFNRVRFUlM7CisJbWJbMV0gPSAodWludDE2X3QpIChidXMgPyB0YXJnZXQgfCBCSVRfNyA6IHRhcmdldCk7CisJbWJbMV0gPDw9IDg7CisKKwltYlsyXSA9IChudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmMgPDwgOCk7CisKKwlpZiAoSVNfSVNQMXgxNjAoaGEpKSB7CisJCW1iWzJdIHw9IG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wcHJfMXgxNjAuZmxhZ3MuZW5hYmxlX3BwciA8PCA1OworCQltYlszXSA9CShudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uZmxhZ3MuZmxhZ3MxeDE2MC5zeW5jX29mZnNldCA8PCA4KSB8CisJCQkgbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnN5bmNfcGVyaW9kOworCQltYls2XSA9CShudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucHByXzF4MTYwLmZsYWdzLnBwcl9vcHRpb25zIDw8IDgpIHwKKwkJCSBudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucHByXzF4MTYwLmZsYWdzLnBwcl9idXNfd2lkdGg7CisJCW1yIHw9IEJJVF82OworCX0gZWxzZSB7CisJCW1iWzNdID0JKG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5mbGFncy5mbGFnczF4ODAuc3luY19vZmZzZXQgPDwgOCkgfAorCQkJIG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5zeW5jX3BlcmlvZDsKKwl9CisKKwlzdGF0dXMgPSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgbXIsICZtYlswXSk7CisKKwlpZiAoc3RhdHVzKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpKCVsZDolaTolaSk6ICIKKwkJICAgICAgICJxbGExMjgwX3NldF90YXJnZXRfcGFyYW1ldGVycygpIGZhaWxlZFxuIiwKKwkJICAgICAgIGhhLT5ob3N0X25vLCBidXMsIHRhcmdldCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgcWxhMTI4MF9zbGF2ZV9jb25maWd1cmUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgRGV0ZXJtaW5lcyB0aGUgcXVldWUgZGVwdGggZm9yIGEgZ2l2ZW4gZGV2aWNlLiAgVGhlcmUgYXJlIHR3byB3YXlzCisgKiAgIGEgcXVldWUgZGVwdGggY2FuIGJlIG9idGFpbmVkIGZvciBhIHRhZ2dlZCBxdWV1ZWluZyBkZXZpY2UuICBPbmUKKyAqICAgd2F5IGlzIHRoZSBkZWZhdWx0IHF1ZXVlIGRlcHRoIHdoaWNoIGlzIGRldGVybWluZWQgYnkgd2hldGhlcgorICogICBJZiBpdCBpcyBkZWZpbmVkLCB0aGVuIGl0IGlzIHVzZWQKKyAqICAgYXMgdGhlIGRlZmF1bHQgcXVldWUgZGVwdGguICBPdGhlcndpc2UsIHdlIHVzZSBlaXRoZXIgNCBvciA4IGFzIHRoZQorICogICBkZWZhdWx0IHF1ZXVlIGRlcHRoIChkZXBlbmRlbnQgb24gdGhlIG51bWJlciBvZiBoYXJkd2FyZSBTQ0JzKS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK3FsYTEyODBfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKKwlpbnQgZGVmYXVsdF9kZXB0aCA9IDM7CisJaW50IGJ1cyA9IGRldmljZS0+Y2hhbm5lbDsKKwlpbnQgdGFyZ2V0ID0gZGV2aWNlLT5pZDsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgbnZyYW0gKm52OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwloYSA9IChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKWRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJbnYgPSAmaGEtPm52cmFtOworCisJaWYgKHFsYTEyODBfY2hlY2tfZm9yX2RlYWRfc2NzaV9idXMoaGEsIGJ1cykpCisJCXJldHVybiAxOworCisJaWYgKGRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCAmJgorCSAgICAoaGEtPmJ1c19zZXR0aW5nc1tidXNdLnF0YWdfZW5hYmxlcyAmIChCSVRfMCA8PCB0YXJnZXQpKSkgeworCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXZpY2UsIE1TR19PUkRFUkVEX1RBRywKKwkJCQkJaGEtPmJ1c19zZXR0aW5nc1tidXNdLmhpd2F0KTsKKwl9IGVsc2UgeworCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXZpY2UsIDAsIGRlZmF1bHRfZGVwdGgpOworCX0KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IDB4MDIwNTAwCisJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV9zeW5jID0gZGV2aWNlLT5zZHRyOworCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5lbmFibGVfd2lkZSA9IGRldmljZS0+d2R0cjsKKwludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucHByXzF4MTYwLmZsYWdzLmVuYWJsZV9wcHIgPSBkZXZpY2UtPnBwcjsKKyNlbmRpZgorCisJaWYgKGRyaXZlcl9zZXR1cC5ub19zeW5jIHx8CisJICAgIChkcml2ZXJfc2V0dXAuc3luY19tYXNrICYmCisJICAgICAofmRyaXZlcl9zZXR1cC5zeW5jX21hc2sgJiAoMSA8PCB0YXJnZXQpKSkpCisJCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5lbmFibGVfc3luYyA9IDA7CisJaWYgKGRyaXZlcl9zZXR1cC5ub193aWRlIHx8CisJICAgIChkcml2ZXJfc2V0dXAud2lkZV9tYXNrICYmCisJICAgICAofmRyaXZlcl9zZXR1cC53aWRlX21hc2sgJiAoMSA8PCB0YXJnZXQpKSkpCisJCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5lbmFibGVfd2lkZSA9IDA7CisJaWYgKElTX0lTUDF4MTYwKGhhKSkgeworCQlpZiAoZHJpdmVyX3NldHVwLm5vX3BwciB8fAorCQkgICAgKGRyaXZlcl9zZXR1cC5wcHJfbWFzayAmJgorCQkgICAgICh+ZHJpdmVyX3NldHVwLnBwcl9tYXNrICYgKDEgPDwgdGFyZ2V0KSkpKQorCQkJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBwcl8xeDE2MC5mbGFncy5lbmFibGVfcHByID0gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZShIT1NUX0xPQ0ssIGZsYWdzKTsKKwlpZiAobnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV9zeW5jKQorCQlzdGF0dXMgPSBxbGExMjgwX3NldF90YXJnZXRfcGFyYW1ldGVycyhoYSwgYnVzLCB0YXJnZXQpOworCXFsYTEyODBfZ2V0X3RhcmdldF9wYXJhbWV0ZXJzKGhhLCBkZXZpY2UpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoSE9TVF9MT0NLLCBmbGFncyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IDB4MDIwNTQ1CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgcWxhMTI4MF9zZWxlY3RfcXVldWVfZGVwdGgKKyAqCisgKiAgIFNldHMgdGhlIHF1ZXVlIGRlcHRoIGZvciBlYWNoIFNDU0kgZGV2aWNlIGhhbmdpbmcgb2ZmIHRoZSBpbnB1dAorICogICBob3N0IGFkYXB0ZXIuICBXZSB1c2UgYSBxdWV1ZSBkZXB0aCBvZiAyIGZvciBkZXZpY2VzIHRoYXQgZG8gbm90CisgKiAgIHN1cHBvcnQgdGFnZ2VkIHF1ZXVlaW5nLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3FsYTEyODBfc2VsZWN0X3F1ZXVlX2RlcHRoKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldl9xKQoreworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKWhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKworCUVOVEVSKCJxbGExMjgwX3NlbGVjdF9xdWV1ZV9kZXB0aCIpOworCWZvciAoc2RldiA9IHNkZXZfcTsgc2Rldjsgc2RldiA9IHNkZXYtPm5leHQpCisJCWlmIChzZGV2LT5ob3N0ID09IGhvc3QpCisJCQlxbGExMjgwX3NsYXZlX2NvbmZpZ3VyZShzZGV2KTsKKworCWlmIChzZGV2X3EpCisJCXFsYTEyODBfY2hlY2tfZm9yX2RlYWRfc2NzaV9idXMoaGEsIHNkZXZfcS0+Y2hhbm5lbCk7CisJTEVBVkUoInFsYTEyODBfc2VsZWN0X3F1ZXVlX2RlcHRoIik7Cit9CisjZW5kaWYKKworLyoKKyAqIHFsYTEyODBfZG9uZQorICogICAgICBQcm9jZXNzIGNvbXBsZXRlZCBjb21tYW5kcy4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgICAgICAgICAgID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICogICAgICBkb25lX3EgICAgICAgPSBkb25lIHF1ZXVlLgorICovCitzdGF0aWMgdm9pZAorcWxhMTI4MF9kb25lKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlzdHJ1Y3Qgc3JiICpzcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpkb25lX3E7CisJaW50IGJ1cywgdGFyZ2V0LCBsdW47CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCisJRU5URVIoInFsYTEyODBfZG9uZSIpOworCisJZG9uZV9xID0gJmhhLT5kb25lX3E7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoZG9uZV9xKSkgeworCQlzcCA9IGxpc3RfZW50cnkoZG9uZV9xLT5uZXh0LCBzdHJ1Y3Qgc3JiLCBsaXN0KTsKKworCQlsaXN0X2RlbCgmc3AtPmxpc3QpOworCQorCQljbWQgPSBzcC0+Y21kOworCQlidXMgPSBTQ1NJX0JVU18zMihjbWQpOworCQl0YXJnZXQgPSBTQ1NJX1RDTl8zMihjbWQpOworCQlsdW4gPSBTQ1NJX0xVTl8zMihjbWQpOworCisJCXN3aXRjaCAoKENNRF9SRVNVTFQoY21kKSA+PiAxNikpIHsKKwkJY2FzZSBESURfUkVTRVQ6CisJCQkvKiBJc3N1ZSBtYXJrZXIgY29tbWFuZC4gKi8KKwkJCXFsYTEyODBfbWFya2VyKGhhLCBidXMsIHRhcmdldCwgMCwgTUtfU1lOQ19JRCk7CisJCQlicmVhazsKKwkJY2FzZSBESURfQUJPUlQ6CisJCQlzcC0+ZmxhZ3MgJj0gflNSQl9BQk9SVF9QRU5ESU5HOworCQkJc3AtPmZsYWdzIHw9IFNSQl9BQk9SVEVEOworCQkJaWYgKHNwLT5mbGFncyAmIFNSQl9USU1FT1VUKQorCQkJCUNNRF9SRVNVTFQoc3AtPmNtZCkgPSBESURfVElNRV9PVVQgPDwgMTY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJLyogUmVsZWFzZSBtZW1vcnkgdXNlZCBmb3IgdGhpcyBJL08gKi8KKwkJaWYgKGNtZC0+dXNlX3NnKSB7CisJCQlwY2lfdW5tYXBfc2coaGEtPnBkZXYsIGNtZC0+cmVxdWVzdF9idWZmZXIsCisJCQkJCWNtZC0+dXNlX3NnLCBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJfSBlbHNlIGlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbikgeworCQkJcGNpX3VubWFwX3NpbmdsZShoYS0+cGRldiwgc3AtPnNhdmVkX2RtYV9oYW5kbGUsCisJCQkJCWNtZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCQljbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJfQorCisJCS8qIENhbGwgdGhlIG1pZC1sZXZlbCBkcml2ZXIgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwkJQ01EX0hBTkRMRShzcC0+Y21kKSA9ICh1bnNpZ25lZCBjaGFyICopSU5WQUxJRF9IQU5ETEU7CisJCWhhLT5hY3R0aHJlYWRzLS07CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCAweDAyMDUwMAorCQlpZiAoY21kLT5jbW5kWzBdID09IElOUVVJUlkpCisJCQlxbGExMjgwX2dldF90YXJnZXRfb3B0aW9ucyhjbWQsIGhhKTsKKyNlbmRpZgorCQkoKihjbWQpLT5zY3NpX2RvbmUpKGNtZCk7CisKKwkJaWYoc3AtPndhaXQgIT0gTlVMTCkKKwkJCWNvbXBsZXRlKHNwLT53YWl0KTsKKwl9CisJTEVBVkUoInFsYTEyODBfZG9uZSIpOworfQorCisvKgorICogVHJhbnNsYXRlcyBhIElTUCBlcnJvciB0byBhIExpbnV4IFNDU0kgZXJyb3IKKyAqLworc3RhdGljIGludAorcWxhMTI4MF9yZXR1cm5fc3RhdHVzKHN0cnVjdCByZXNwb25zZSAqIHN0cywgc3RydWN0IHNjc2lfY21uZCAqY3ApCit7CisJaW50IGhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCXVpbnQxNl90IGNvbXBfc3RhdHVzID0gbGUxNl90b19jcHUoc3RzLT5jb21wX3N0YXR1cyk7CisJdWludDE2X3Qgc3RhdGVfZmxhZ3MgPSBsZTE2X3RvX2NwdShzdHMtPnN0YXRlX2ZsYWdzKTsKKwl1aW50MTZfdCByZXNpZHVhbF9sZW5ndGggPSBsZTE2X3RvX2NwdShzdHMtPnJlc2lkdWFsX2xlbmd0aCk7CisJdWludDE2X3Qgc2NzaV9zdGF0dXMgPSBsZTE2X3RvX2NwdShzdHMtPnNjc2lfc3RhdHVzKTsKKyNpZiBERUJVR19RTEExMjgwX0lOVFIKKwlzdGF0aWMgY2hhciAqcmVhc29uW10gPSB7CisJCSJESURfT0siLAorCQkiRElEX05PX0NPTk5FQ1QiLAorCQkiRElEX0JVU19CVVNZIiwKKwkJIkRJRF9USU1FX09VVCIsCisJCSJESURfQkFEX1RBUkdFVCIsCisJCSJESURfQUJPUlQiLAorCQkiRElEX1BBUklUWSIsCisJCSJESURfRVJST1IiLAorCQkiRElEX1JFU0VUIiwKKwkJIkRJRF9CQURfSU5UUiIKKwl9OworI2VuZGlmCQkJCS8qIERFQlVHX1FMQTEyODBfSU5UUiAqLworCisJRU5URVIoInFsYTEyODBfcmV0dXJuX3N0YXR1cyIpOworCisjaWYgREVCVUdfUUxBMTI4MF9JTlRSCisJLyoKKwkgIGRwcmludGsoMSwgInFsYTEyODBfcmV0dXJuX3N0YXR1czogY29tcGwgc3RhdHVzID0gMHglMDR4XG4iLAorCSAgY29tcF9zdGF0dXMpOworCSovCisjZW5kaWYKKworCXN3aXRjaCAoY29tcF9zdGF0dXMpIHsKKwljYXNlIENTX0NPTVBMRVRFOgorCQlob3N0X3N0YXR1cyA9IERJRF9PSzsKKwkJYnJlYWs7CisKKwljYXNlIENTX0lOQ09NUExFVEU6CisJCWlmICghKHN0YXRlX2ZsYWdzICYgU0ZfR09UX0JVUykpCisJCQlob3N0X3N0YXR1cyA9IERJRF9OT19DT05ORUNUOworCQllbHNlIGlmICghKHN0YXRlX2ZsYWdzICYgU0ZfR09UX1RBUkdFVCkpCisJCQlob3N0X3N0YXR1cyA9IERJRF9CQURfVEFSR0VUOworCQllbHNlIGlmICghKHN0YXRlX2ZsYWdzICYgU0ZfU0VOVF9DREIpKQorCQkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJCWVsc2UgaWYgKCEoc3RhdGVfZmxhZ3MgJiBTRl9UUkFOU0ZFUlJFRF9EQVRBKSkKKwkJCWhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCQllbHNlIGlmICghKHN0YXRlX2ZsYWdzICYgU0ZfR09UX1NUQVRVUykpCisJCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJZWxzZSBpZiAoIShzdGF0ZV9mbGFncyAmIFNGX0dPVF9TRU5TRSkpCisJCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJYnJlYWs7CisKKwljYXNlIENTX1JFU0VUOgorCQlob3N0X3N0YXR1cyA9IERJRF9SRVNFVDsKKwkJYnJlYWs7CisKKwljYXNlIENTX0FCT1JURUQ6CisJCWhvc3Rfc3RhdHVzID0gRElEX0FCT1JUOworCQlicmVhazsKKworCWNhc2UgQ1NfVElNRU9VVDoKKwkJaG9zdF9zdGF0dXMgPSBESURfVElNRV9PVVQ7CisJCWJyZWFrOworCisJY2FzZSBDU19EQVRBX09WRVJSVU46CisJCWRwcmludGsoMiwgIkRhdGEgb3ZlcnJ1biAweCV4XG4iLCByZXNpZHVhbF9sZW5ndGgpOworCQlkcHJpbnRrKDIsICJxbGExMjgwX2lzcjogcmVzcG9uc2UgcGFja2V0IGRhdGFcbiIpOworCQlxbGExMjgwX2R1bXBfYnVmZmVyKDIsIChjaGFyICopc3RzLCBSRVNQT05TRV9FTlRSWV9TSVpFKTsKKwkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJCWJyZWFrOworCisJY2FzZSBDU19EQVRBX1VOREVSUlVOOgorCQlpZiAoKGNwLT5yZXF1ZXN0X2J1ZmZsZW4gLSByZXNpZHVhbF9sZW5ndGgpIDwKKwkJICAgIGNwLT51bmRlcmZsb3cpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAic2NzaTogVW5kZXJmbG93IGRldGVjdGVkIC0gcmV0cnlpbmcgIgorCQkJICAgICAgICJjb21tYW5kLlxuIik7CisJCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJfSBlbHNlCisJCQlob3N0X3N0YXR1cyA9IERJRF9PSzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJYnJlYWs7CisJfQorCisjaWYgREVCVUdfUUxBMTI4MF9JTlRSCisJZHByaW50aygxLCAicWxhMTI4MCBJU1Agc3RhdHVzOiBob3N0IHN0YXR1cyAoJXMpIHNjc2kgc3RhdHVzICV4XG4iLAorCQlyZWFzb25baG9zdF9zdGF0dXNdLCBzY3NpX3N0YXR1cyk7CisjZW5kaWYKKworCUxFQVZFKCJxbGExMjgwX3JldHVybl9zdGF0dXMiKTsKKworCXJldHVybiAoc2NzaV9zdGF0dXMgJiAweGZmKSB8IChob3N0X3N0YXR1cyA8PCAxNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgUUxvZ2ljIElTUDEyODAgSGFyZHdhcmUgU3VwcG9ydCBGdW5jdGlvbnMuICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIC8qCisgICogcWxhMjEwMF9lbmFibGVfaW50cnMKKyAgKiBxbGEyMTAwX2Rpc2FibGVfaW50cnMKKyAgKgorICAqIElucHV0OgorICAqICAgICAgaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgICoKKyAgKiBSZXR1cm5zOgorICAqICAgICAgTm9uZQorICAqLworc3RhdGljIGlubGluZSB2b2lkCitxbGExMjgwX2VuYWJsZV9pbnRycyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJc3RydWN0IGRldmljZV9yZWcgX19pb21lbSAqcmVnOworCisJcmVnID0gaGEtPmlvYmFzZTsKKwkvKiBlbmFibGUgcmlzYyBhbmQgaG9zdCBpbnRlcnJ1cHRzICovCisJV1JUX1JFR19XT1JEKCZyZWctPmljdHJsLCAoSVNQX0VOX0lOVCB8IElTUF9FTl9SSVNDKSk7CisJUkRfUkVHX1dPUkQoJnJlZy0+aWN0cmwpOwkvKiBQQ0kgUG9zdGVkIFdyaXRlIGZsdXNoICovCisJaGEtPmZsYWdzLmludHNfZW5hYmxlZCA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMTI4MF9kaXNhYmxlX2ludHJzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZyBfX2lvbWVtICpyZWc7CisKKwlyZWcgPSBoYS0+aW9iYXNlOworCS8qIGRpc2FibGUgcmlzYyBhbmQgaG9zdCBpbnRlcnJ1cHRzICovCisJV1JUX1JFR19XT1JEKCZyZWctPmljdHJsLCAwKTsKKwlSRF9SRUdfV09SRCgmcmVnLT5pY3RybCk7CS8qIFBDSSBQb3N0ZWQgV3JpdGUgZmx1c2ggKi8KKwloYS0+ZmxhZ3MuaW50c19lbmFibGVkID0gMDsKK30KKworLyoKKyAqIHFsYTEyODBfaW5pdGlhbGl6ZV9hZGFwdGVyCisgKiAgICAgIEluaXRpYWxpemUgYm9hcmQuCisgKgorICogSW5wdXQ6CisgKiAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgIDAgPSBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0CitxbGExMjgwX2luaXRpYWxpemVfYWRhcHRlcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJc3RydWN0IGRldmljZV9yZWcgX19pb21lbSAqcmVnOworCWludCBzdGF0dXM7CisJaW50IGJ1czsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiAweDAyMDUwMAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjZW5kaWYKKworCUVOVEVSKCJxbGExMjgwX2luaXRpYWxpemVfYWRhcHRlciIpOworCisJLyogQ2xlYXIgYWRhcHRlciBmbGFncy4gKi8KKwloYS0+ZmxhZ3Mub25saW5lID0gMDsKKwloYS0+ZmxhZ3MuZGlzYWJsZV9ob3N0X2FkYXB0ZXIgPSAwOworCWhhLT5mbGFncy5yZXNldF9hY3RpdmUgPSAwOworCWhhLT5mbGFncy5hYm9ydF9pc3BfYWN0aXZlID0gMDsKKworCWhhLT5mbGFncy5pbnRzX2VuYWJsZWQgPSAwOworI2lmIGRlZmluZWQoQ09ORklHX0lBNjRfR0VORVJJQykgfHwgZGVmaW5lZChDT05GSUdfSUE2NF9TR0lfU04yKQorCWlmIChpYTY0X3BsYXRmb3JtX2lzKCJzbjIiKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJzY3NpKCVsaSk6IEVuYWJsaW5nIFNOMiBQQ0kgRE1BICIKKwkJICAgICAgICJkdWFsIGNoYW5uZWwgbG9ja3VwIHdvcmthcm91bmRcbiIsIGhhLT5ob3N0X25vKTsKKwkJaGEtPmZsYWdzLnVzZV9wY2lfdmNoYW5uZWwgPSAxOworCQlkcml2ZXJfc2V0dXAubm9fbnZyYW0gPSAxOworCX0KKyNlbmRpZgorCisJLyogVE9ETzogaW1wbGVtZW50IHN1cHBvcnQgZm9yIHRoZSAxMDQwIG52cmFtIGZvcm1hdCAqLworCWlmIChJU19JU1AxMDQwKGhhKSkKKwkJZHJpdmVyX3NldHVwLm5vX252cmFtID0gMTsKKworCWRwcmludGsoMSwgIkNvbmZpZ3VyZSBQQ0kgc3BhY2UgZm9yIGFkYXB0ZXIuLi5cbiIpOworCisJcmVnID0gaGEtPmlvYmFzZTsKKworCS8qIEluc3VyZSBtYWlsYm94IHJlZ2lzdGVycyBhcmUgZnJlZS4gKi8KKwlXUlRfUkVHX1dPUkQoJnJlZy0+c2VtYXBob3JlLCAwKTsKKwlXUlRfUkVHX1dPUkQoJnJlZy0+aG9zdF9jbWQsIEhDX0NMUl9SSVNDX0lOVCk7CisJV1JUX1JFR19XT1JEKCZyZWctPmhvc3RfY21kLCBIQ19DTFJfSE9TVF9JTlQpOworCVJEX1JFR19XT1JEKCZyZWctPmhvc3RfY21kKTsKKworCWlmIChxbGExMjgwX3JlYWRfbnZyYW0oaGEpKSB7CisJCWRwcmludGsoMiwgInFsYTEyODBfaW5pdGlhbGl6ZV9hZGFwdGVyOiBmYWlsZWQgdG8gcmVhZCAiCisJCQkiTlZSQU1cbiIpOworCX0KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSAweDAyMDUwMAorCS8qCisJICogSXQncyBuZWNlc3NhcnkgdG8gZ3JhYiB0aGUgc3BpbiBoZXJlIGFzIHFsYTEyODBfbWFpbGJveF9jb21tYW5kCisJICogbmVlZHMgdG8gYmUgYWJsZSB0byBkcm9wIHRoZSBsb2NrIHVuY29uZGl0aW9uYWxseSB0byB3YWl0CisJICogZm9yIGNvbXBsZXRpb24uCisJICogSW4gMi40IC0+ZGV0ZWN0IGlzIGNhbGxlZCB3aXRoIHRoZSBpb19yZXF1ZXN0X2xvY2sgaGVsZC4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZShIT1NUX0xPQ0ssIGZsYWdzKTsKKyNlbmRpZgorCisJc3RhdHVzID0gcWxhMTI4MF9sb2FkX2Zpcm13YXJlKGhhKTsKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2NzaSglbGkpOiBpbml0aWFsaXplOiBwY2kgcHJvYmUgZmFpbGVkIVxuIiwKKwkJICAgICAgIGhhLT5ob3N0X25vKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU2V0dXAgYWRhcHRlciBiYXNlZCBvbiBOVlJBTSBwYXJhbWV0ZXJzLiAqLworCWRwcmludGsoMSwgInNjc2koJWxkKTogQ29uZmlndXJlIE5WUkFNIHBhcmFtZXRlcnNcbiIsIGhhLT5ob3N0X25vKTsKKwlxbGExMjgwX252cmFtX2NvbmZpZyhoYSk7CisKKwlpZiAoaGEtPmZsYWdzLmRpc2FibGVfaG9zdF9hZGFwdGVyKSB7CisJCXN0YXR1cyA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCXN0YXR1cyA9IHFsYTEyODBfaW5pdF9yaW5ncyhoYSk7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisKKwkvKiBJc3N1ZSBTQ1NJIHJlc2V0LCBpZiB3ZSBjYW4ndCByZXNldCB0d2ljZSB0aGVuIGJ1cyBpcyBkZWFkICovCisJZm9yIChidXMgPSAwOyBidXMgPCBoYS0+cG9ydHM7IGJ1cysrKSB7CisJCWlmICghaGEtPmJ1c19zZXR0aW5nc1tidXNdLmRpc2FibGVfc2NzaV9yZXNldCAmJgorCQkgICAgcWxhMTI4MF9idXNfcmVzZXQoaGEsIGJ1cykgJiYKKwkJICAgIHFsYTEyODBfYnVzX3Jlc2V0KGhhLCBidXMpKQorCQkJaGEtPmJ1c19zZXR0aW5nc1tidXNdLnNjc2lfYnVzX2RlYWQgPSAxOworCX0KKworCWhhLT5mbGFncy5vbmxpbmUgPSAxOworIG91dDoKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gMHgwMjA1MDAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKEhPU1RfTE9DSywgZmxhZ3MpOworI2VuZGlmCisJaWYgKHN0YXR1cykKKwkJZHByaW50aygyLCAicWxhMTI4MF9pbml0aWFsaXplX2FkYXB0ZXI6ICoqKiogRkFJTEVEICoqKipcbiIpOworCisJTEVBVkUoInFsYTEyODBfaW5pdGlhbGl6ZV9hZGFwdGVyIik7CisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKgorICogSVNQIEZpcm13YXJlIFRlc3QKKyAqICAgICAgQ2hlY2tzIGlmIHByZXNlbnQgdmVyc2lvbiBvZiBSSVNDIGZpcm13YXJlIGlzIG9sZGVyIHRoYW4KKyAqICAgICAgZHJpdmVyIGZpcm13YXJlLgorICoKKyAqIElucHV0OgorICogICAgICBoYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICAwID0gZmlybXdhcmUgZG9lcyBub3QgbmVlZCB0byBiZSBsb2FkZWQuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTEyODBfaXNwX2Zpcm13YXJlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlzdHJ1Y3QgbnZyYW0gKm52ID0gKHN0cnVjdCBudnJhbSAqKSBoYS0+cmVzcG9uc2VfcmluZzsKKwlpbnQgc3RhdHVzID0gMDsJCS8qIGRnIDIvMjcgYWx3YXlzIGxvYWRzIFJJU0MgKi8KKwl1aW50MTZfdCBtYltNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXTsKKworCUVOVEVSKCJxbGExMjgwX2lzcF9maXJtd2FyZSIpOworCisJZHByaW50aygxLCAic2NzaSglbGkpOiBEZXRlcm1pbmluZyBpZiBSSVNDIGlzIGxvYWRlZFxuIiwgaGEtPmhvc3Rfbm8pOworCisJLyogQmFkIE5WUkFNIGRhdGEsIGxvYWQgUklTQyBjb2RlLiAqLworCWlmICghaGEtPm52cmFtX3ZhbGlkKSB7CisJCWhhLT5mbGFncy5kaXNhYmxlX3Jpc2NfY29kZV9sb2FkID0gMDsKKwl9IGVsc2UKKwkJaGEtPmZsYWdzLmRpc2FibGVfcmlzY19jb2RlX2xvYWQgPQorCQkJbnYtPmNudHJfZmxhZ3NfMS5kaXNhYmxlX2xvYWRpbmdfcmlzY19jb2RlOworCisJaWYgKGhhLT5mbGFncy5kaXNhYmxlX3Jpc2NfY29kZV9sb2FkKSB7CisJCWRwcmludGsoMywgInFsYTEyODBfaXNwX2Zpcm13YXJlOiBUZWxsaW5nIFJJU0MgdG8gdmVyaWZ5ICIKKwkJCSJjaGVja3N1bSBvZiBsb2FkZWQgQklPUyBjb2RlLlxuIik7CisKKwkJLyogVmVyaWZ5IGNoZWNrc3VtIG9mIGxvYWRlZCBSSVNDIGNvZGUuICovCisJCW1iWzBdID0gTUJDX1ZFUklGWV9DSEVDS1NVTTsKKwkJLyogbWJbMV0gPSBxbDEyX3Jpc2NfY29kZV9hZGRyMDE7ICovCisJCW1iWzFdID0gKnFsMTI4MF9ib2FyZF90YmxbaGEtPmRldm51bV0uZndzdGFydDsKKworCQlpZiAoIShzdGF0dXMgPQorCQkgICAgICBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzEgfCBCSVRfMCwgJm1iWzBdKSkpIHsKKwkJCS8qIFN0YXJ0IGZpcm13YXJlIGV4ZWN1dGlvbi4gKi8KKwkJCWRwcmludGsoMywgInFsYTEyODBfaXNwX2Zpcm13YXJlOiBTdGFydG5nIEYvVyAiCisJCQkJImV4ZWN1dGlvbi5cbiIpOworCisJCQltYlswXSA9IE1CQ19FWEVDVVRFX0ZJUk1XQVJFOworCQkJLyogbWJbMV0gPSBxbDEyX3Jpc2NfY29kZV9hZGRyMDE7ICovCisJCQltYlsxXSA9ICpxbDEyODBfYm9hcmRfdGJsW2hhLT5kZXZudW1dLmZ3c3RhcnQ7CisJCQlxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzEgfCBCSVRfMCwgJm1iWzBdKTsKKwkJfSBlbHNlCisJCQlwcmludGsoS0VSTl9JTkZPICJxbGExMjgwOiBSSVNDIGNoZWNrc3VtIGZhaWxlZC5cbiIpOworCX0gZWxzZSB7CisJCWRwcmludGsoMSwgInFsYTEyODA6IE5WUkFNIGNvbmZpZ3VyZWQgdG8gbG9hZCBSSVNDIGxvYWQuXG4iKTsKKwkJc3RhdHVzID0gMTsKKwl9CisKKwlpZiAoc3RhdHVzKQorCQlkcHJpbnRrKDIsICJxbGExMjgwX2lzcF9maXJtd2FyZTogKioqKiBMb2FkIFJJU0MgY29kZSAqKioqXG4iKTsKKworCUxFQVZFKCJxbGExMjgwX2lzcF9maXJtd2FyZSIpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBDaGlwIGRpYWdub3N0aWNzCisgKiAgICAgIFRlc3QgY2hpcCBmb3IgcHJvcGVyIG9wZXJhdGlvbi4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgMCA9IHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTEyODBfY2hpcF9kaWFnKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwl1aW50MTZfdCBtYltNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXTsKKwlzdHJ1Y3QgZGV2aWNlX3JlZyBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCWludCBzdGF0dXMgPSAwOworCWludCBjbnQ7CisJdWludDE2X3QgZGF0YTsKKwlkcHJpbnRrKDMsICJxbGExMjgwX2NoaXBfZGlhZzogdGVzdGluZyBkZXZpY2UgYXQgMHglcCBcbiIsICZyZWctPmlkX2wpOworCisJZHByaW50aygxLCAic2NzaSglbGQpOiBWZXJpZnlpbmcgY2hpcFxuIiwgaGEtPmhvc3Rfbm8pOworCisJLyogU29mdCByZXNldCBjaGlwIGFuZCB3YWl0IGZvciBpdCB0byBmaW5pc2guICovCisJV1JUX1JFR19XT1JEKCZyZWctPmljdHJsLCBJU1BfUkVTRVQpOworCisJLyoKKwkgKiBXZSBjYW4ndCBkbyBhIHRyYWRpdGlvbmFsIFBDSSB3cml0ZSBmbHVzaCBoZXJlIGJ5IHJlYWRpbmcKKwkgKiBiYWNrIHRoZSByZWdpc3Rlci4gVGhlIGNhcmQgd2lsbCBub3QgcmVzcG9uZCBvbmNlIHRoZSByZXNldAorCSAqIGlzIGluIGFjdGlvbiBhbmQgd2UgZW5kIHVwIHdpdGggYSBtYWNoaW5lIGNoZWNrIGV4Y2VwdGlvbgorCSAqIGluc3RlYWQuIE5vdGhpbmcgdG8gZG8gYnV0IHdhaXQgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LgorCSAqIEEgcG9ydGFibGUgcGNpX3dyaXRlX2ZsdXNoKHBkZXYpIGNhbGwgd291bGQgYmUgdmVyeSB1c2VmdWwgaGVyZS4KKwkgKi8KKwl1ZGVsYXkoMjApOworCWRhdGEgPSBxbGExMjgwX2RlYm91bmNlX3JlZ2lzdGVyKCZyZWctPmljdHJsKTsKKwkvKgorCSAqIFlldCBhbm90aGVyIFFMb2dpYyBnZW0gOy0oCisJICovCisJZm9yIChjbnQgPSAxMDAwMDAwOyBjbnQgJiYgZGF0YSAmIElTUF9SRVNFVDsgY250LS0pIHsKKwkJdWRlbGF5KDUpOworCQlkYXRhID0gUkRfUkVHX1dPUkQoJnJlZy0+aWN0cmwpOworCX0KKworCWlmICghY250KQorCQlnb3RvIGZhaWw7CisKKwkvKiBSZXNldCByZWdpc3RlciBjbGVhcmVkIGJ5IGNoaXAgcmVzZXQuICovCisJZHByaW50aygzLCAicWxhMTI4MF9jaGlwX2RpYWc6IHJlc2V0IHJlZ2lzdGVyIGNsZWFyZWQgYnkgY2hpcCByZXNldFxuIik7CisKKwlXUlRfUkVHX1dPUkQoJnJlZy0+Y2ZnXzEsIDApOworCisJLyogUmVzZXQgUklTQyBhbmQgZGlzYWJsZSBCSU9TIHdoaWNoCisJICAgYWxsb3dzIFJJU0MgdG8gZXhlY3V0ZSBvdXQgb2YgUkFNLiAqLworCVdSVF9SRUdfV09SRCgmcmVnLT5ob3N0X2NtZCwgSENfUkVTRVRfUklTQyB8CisJCSAgICAgSENfUkVMRUFTRV9SSVNDIHwgSENfRElTQUJMRV9CSU9TKTsKKworCVJEX1JFR19XT1JEKCZyZWctPmlkX2wpOwkvKiBGbHVzaCBQQ0kgd3JpdGUgKi8KKwlkYXRhID0gcWxhMTI4MF9kZWJvdW5jZV9yZWdpc3RlcigmcmVnLT5tYWlsYm94MCk7CisKKwkvKgorCSAqIEkgKkxPVkUqIHRoaXMgY29kZSEKKwkgKi8KKwlmb3IgKGNudCA9IDEwMDAwMDA7IGNudCAmJiBkYXRhID09IE1CU19CVVNZOyBjbnQtLSkgeworCQl1ZGVsYXkoNSk7CisJCWRhdGEgPSBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MCk7CisJfQorCisJaWYgKCFjbnQpCisJCWdvdG8gZmFpbDsKKworCS8qIENoZWNrIHByb2R1Y3QgSUQgb2YgY2hpcCAqLworCWRwcmludGsoMywgInFsYTEyODBfY2hpcF9kaWFnOiBDaGVja2luZyBwcm9kdWN0IElEIG9mIGNoaXBcbiIpOworCisJaWYgKFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gxKSAhPSBQUk9EX0lEXzEgfHwKKwkgICAgKFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gyKSAhPSBQUk9EX0lEXzIgJiYKKwkgICAgIFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gyKSAhPSBQUk9EX0lEXzJhKSB8fAorCSAgICBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MykgIT0gUFJPRF9JRF8zIHx8CisJICAgIFJEX1JFR19XT1JEKCZyZWctPm1haWxib3g0KSAhPSBQUk9EX0lEXzQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicWxhMTI4MDogV3JvbmcgcHJvZHVjdCBJRCA9ICIKKwkJICAgICAgICIweCV4LDB4JXgsMHgleCwweCV4XG4iLAorCQkgICAgICAgUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDEpLAorCQkgICAgICAgUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDIpLAorCQkgICAgICAgUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDMpLAorCQkgICAgICAgUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDQpKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qCisJICogRW5hYmxlIGludHMgZWFybHkhISEKKwkgKi8KKwlxbGExMjgwX2VuYWJsZV9pbnRycyhoYSk7CisKKwlkcHJpbnRrKDEsICJxbGExMjgwX2NoaXBfZGlhZzogQ2hlY2tpbmcgbWFpbGJveGVzIG9mIGNoaXBcbiIpOworCS8qIFdyYXAgSW5jb21pbmcgTWFpbGJveGVzIFRlc3QuICovCisJbWJbMF0gPSBNQkNfTUFJTEJPWF9SRUdJU1RFUl9URVNUOworCW1iWzFdID0gMHhBQUFBOworCW1iWzJdID0gMHg1NTU1OworCW1iWzNdID0gMHhBQTU1OworCW1iWzRdID0gMHg1NUFBOworCW1iWzVdID0gMHhBNUE1OworCW1iWzZdID0gMHg1QTVBOworCW1iWzddID0gMHgyNTI1OworCisJc3RhdHVzID0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIDB4ZmYsIG1iKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZhaWw7CisKKwlpZiAobWJbMV0gIT0gMHhBQUFBIHx8IG1iWzJdICE9IDB4NTU1NSB8fCBtYlszXSAhPSAweEFBNTUgfHwKKwkgICAgbWJbNF0gIT0gMHg1NUFBIHx8IG1iWzVdICE9IDB4QTVBNSB8fCBtYls2XSAhPSAweDVBNUEgfHwKKwkgICAgbWJbN10gIT0gMHgyNTI1KSB7CisJCXByaW50ayhLRVJOX0lORk8gInFsYTEyODA6IEZhaWxlZCBtYm94IGNoZWNrXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCWRwcmludGsoMywgInFsYTEyODBfY2hpcF9kaWFnOiBleGl0aW5nIG5vcm1hbGx5XG4iKTsKKwlyZXR1cm4gMDsKKyBmYWlsOgorCWRwcmludGsoMiwgInFsYTEyODBfY2hpcF9kaWFnOiAqKioqIEZBSUxFRCAqKioqXG4iKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CitxbGExMjgwX2xvYWRfZmlybXdhcmVfcGlvKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwl1aW50MTZfdCByaXNjX2FkZHJlc3MsICpyaXNjX2NvZGVfYWRkcmVzcywgcmlzY19jb2RlX3NpemU7CisJdWludDE2X3QgbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF0sIGk7CisJaW50IGVycjsKKworCS8qIExvYWQgUklTQyBjb2RlLiAqLworCXJpc2NfYWRkcmVzcyA9ICpxbDEyODBfYm9hcmRfdGJsW2hhLT5kZXZudW1dLmZ3c3RhcnQ7CisJcmlzY19jb2RlX2FkZHJlc3MgPSBxbDEyODBfYm9hcmRfdGJsW2hhLT5kZXZudW1dLmZ3Y29kZTsKKwlyaXNjX2NvZGVfc2l6ZSA9ICpxbDEyODBfYm9hcmRfdGJsW2hhLT5kZXZudW1dLmZ3bGVuOworCisJZm9yIChpID0gMDsgaSA8IHJpc2NfY29kZV9zaXplOyBpKyspIHsKKwkJbWJbMF0gPSBNQkNfV1JJVEVfUkFNX1dPUkQ7CisJCW1iWzFdID0gcmlzY19hZGRyZXNzICsgaTsKKwkJbWJbMl0gPSByaXNjX2NvZGVfYWRkcmVzc1tpXTsKKworCQllcnIgPSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzAgfCBCSVRfMSB8IEJJVF8yLCBtYik7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic2NzaSglbGkpOiBGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZVxuIiwKKwkJCQkJaGEtPmhvc3Rfbm8pOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIERVTVBfSVRfQkFDSyAwCQkvKiBmb3IgZGVidWcgb2YgUklTQyBsb2FkaW5nICovCitzdGF0aWMgaW50CitxbGExMjgwX2xvYWRfZmlybXdhcmVfZG1hKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwl1aW50MTZfdCByaXNjX2FkZHJlc3MsICpyaXNjX2NvZGVfYWRkcmVzcywgcmlzY19jb2RlX3NpemU7CisJdWludDE2X3QgbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF0sIGNudDsKKwlpbnQgZXJyID0gMCwgbnVtLCBpOworI2lmIERVTVBfSVRfQkFDSworCXVpbnQ4X3QgKnNwLCAqdGJ1ZjsKKwlkbWFfYWRkcl90IHBfdGJ1ZjsKKworCXRidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChoYS0+cGRldiwgODAwMCwgJnBfdGJ1Zik7CisJaWYgKCF0YnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKyNlbmRpZgorCisJLyogTG9hZCBSSVNDIGNvZGUuICovCisJcmlzY19hZGRyZXNzID0gKnFsMTI4MF9ib2FyZF90YmxbaGEtPmRldm51bV0uZndzdGFydDsKKwlyaXNjX2NvZGVfYWRkcmVzcyA9IHFsMTI4MF9ib2FyZF90YmxbaGEtPmRldm51bV0uZndjb2RlOworCXJpc2NfY29kZV9zaXplID0gKnFsMTI4MF9ib2FyZF90YmxbaGEtPmRldm51bV0uZndsZW47CisKKwlkcHJpbnRrKDEsICIlczogRE1BIFJJU0MgY29kZSAoJWkpIHdvcmRzXG4iLAorCQkJX19GVU5DVElPTl9fLCByaXNjX2NvZGVfc2l6ZSk7CisKKwludW0gPSAwOworCXdoaWxlIChyaXNjX2NvZGVfc2l6ZSA+IDApIHsKKwkJaW50IHdhcm4gX19hdHRyaWJ1dGVfXygodW51c2VkKSkgPSAwOworCisJCWNudCA9IDIwMDAgPj4gMTsKKworCQlpZiAoY250ID4gcmlzY19jb2RlX3NpemUpCisJCQljbnQgPSByaXNjX2NvZGVfc2l6ZTsKKworCQlkcHJpbnRrKDIsICJxbGExMjgwX3NldHVwX2NoaXA6ICBsb2FkaW5nIHJpc2MgQCA9KDB4JXApLCIKKwkJCSIlZCwlZCgweCV4KVxuIiwKKwkJCXJpc2NfY29kZV9hZGRyZXNzLCBjbnQsIG51bSwgcmlzY19hZGRyZXNzKTsKKwkJZm9yKGkgPSAwOyBpIDwgY250OyBpKyspCisJCQkoKHVpbnQxNl90ICopaGEtPnJlcXVlc3RfcmluZylbaV0gPQorCQkJCWNwdV90b19sZTE2KHJpc2NfY29kZV9hZGRyZXNzW2ldKTsKKworCQltYlswXSA9IE1CQ19MT0FEX1JBTTsKKwkJbWJbMV0gPSByaXNjX2FkZHJlc3M7CisJCW1iWzRdID0gY250OworCQltYlszXSA9IGhhLT5yZXF1ZXN0X2RtYSAmIDB4ZmZmZjsKKwkJbWJbMl0gPSAoaGEtPnJlcXVlc3RfZG1hID4+IDE2KSAmIDB4ZmZmZjsKKwkJbWJbN10gPSBwY2lfZG1hX2hpMzIoaGEtPnJlcXVlc3RfZG1hKSAmIDB4ZmZmZjsKKwkJbWJbNl0gPSBwY2lfZG1hX2hpMzIoaGEtPnJlcXVlc3RfZG1hKSA+PiAxNjsKKwkJZHByaW50aygyLCAiJXM6IG9wPSVkICAweCVwID0gMHglNHgsMHglNHgsMHglNHgsMHglNHhcbiIsCisJCQkJX19GVU5DVElPTl9fLCBtYlswXSwKKwkJCQkodm9pZCAqKShsb25nKWhhLT5yZXF1ZXN0X2RtYSwKKwkJCQltYls2XSwgbWJbN10sIG1iWzJdLCBtYlszXSk7CisJCWVyciA9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfNCB8IEJJVF8zIHwgQklUXzIgfAorCQkJCUJJVF8xIHwgQklUXzAsIG1iKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpKCVsaSk6IEZhaWxlZCB0byBsb2FkIHBhcnRpYWwgIgorCQkJICAgICAgICJzZWdtZW50IG9mIGZcbiIsIGhhLT5ob3N0X25vKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKyNpZiBEVU1QX0lUX0JBQ0sKKwkJbWJbMF0gPSBNQkNfRFVNUF9SQU07CisJCW1iWzFdID0gcmlzY19hZGRyZXNzOworCQltYls0XSA9IGNudDsKKwkJbWJbM10gPSBwX3RidWYgJiAweGZmZmY7CisJCW1iWzJdID0gKHBfdGJ1ZiA+PiAxNikgJiAweGZmZmY7CisJCW1iWzddID0gcGNpX2RtYV9oaTMyKHBfdGJ1ZikgJiAweGZmZmY7CisJCW1iWzZdID0gcGNpX2RtYV9oaTMyKHBfdGJ1ZikgPj4gMTY7CisKKwkJZXJyID0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF80IHwgQklUXzMgfCBCSVRfMiB8CisJCQkJQklUXzEgfCBCSVRfMCwgbWIpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiRmFpbGVkIHRvIGR1bXAgcGFydGlhbCBzZWdtZW50IG9mIGYvd1xuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzcCA9ICh1aW50OF90ICopaGEtPnJlcXVlc3RfcmluZzsKKwkJZm9yIChpID0gMDsgaSA8IChjbnQgPDwgMSk7IGkrKykgeworCQkJaWYgKHRidWZbaV0gIT0gc3BbaV0gJiYgd2FybisrIDwgMTApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGVyBjb21wYXJlIGVycm9yIEAgIgorCQkJCQkJImJ5dGUoMHgleCkgbG9vcCM9JXhcbiIsCisJCQkJCQlfX0ZVTkNUSU9OX18sIGksIG51bSk7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRldieXRlPSV4ICAiCisJCQkJCQkiRldmcm9tQ2hpcD0leFxuIiwKKwkJCQkJCV9fRlVOQ1RJT05fXywgc3BbaV0sIHRidWZbaV0pOworCQkJCS8qYnJlYWs7ICovCisJCQl9CisJCX0KKyNlbmRpZgorCQlyaXNjX2FkZHJlc3MgKz0gY250OworCQlyaXNjX2NvZGVfc2l6ZSA9IHJpc2NfY29kZV9zaXplIC0gY250OworCQlyaXNjX2NvZGVfYWRkcmVzcyA9IHJpc2NfY29kZV9hZGRyZXNzICsgY250OworCQludW0rKzsKKwl9CisKKyBvdXQ6CisjaWYgRFVNUF9JVF9CQUNLCisJcGNpX2ZyZWVfY29uc2lzdGVudChoYS0+cGRldiwgODAwMCwgdGJ1ZiwgcF90YnVmKTsKKyNlbmRpZgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTEyODBfc3RhcnRfZmlybXdhcmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXVpbnQxNl90IG1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOworCWludCBlcnI7CisKKwlkcHJpbnRrKDEsICIlczogVmVyaWZ5aW5nIGNoZWNrc3VtIG9mIGxvYWRlZCBSSVNDIGNvZGUuXG4iLAorCQkJX19GVU5DVElPTl9fKTsKKworCS8qIFZlcmlmeSBjaGVja3N1bSBvZiBsb2FkZWQgUklTQyBjb2RlLiAqLworCW1iWzBdID0gTUJDX1ZFUklGWV9DSEVDS1NVTTsKKwkvKiBtYlsxXSA9IHFsMTJfcmlzY19jb2RlX2FkZHIwMTsgKi8KKwltYlsxXSA9ICpxbDEyODBfYm9hcmRfdGJsW2hhLT5kZXZudW1dLmZ3c3RhcnQ7CisJZXJyID0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8xIHwgQklUXzAsIG1iKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2NzaSglbGkpOiBGYWlsZWQgY2hlY2tzdW1cbiIsIGhhLT5ob3N0X25vKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBTdGFydCBmaXJtd2FyZSBleGVjdXRpb24uICovCisJZHByaW50aygxLCAiJXM6IHN0YXJ0IGZpcm13YXJlIHJ1bm5pbmcuXG4iLCBfX0ZVTkNUSU9OX18pOworCW1iWzBdID0gTUJDX0VYRUNVVEVfRklSTVdBUkU7CisJbWJbMV0gPSAqcWwxMjgwX2JvYXJkX3RibFtoYS0+ZGV2bnVtXS5md3N0YXJ0OworCWVyciA9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpKCVsaSk6IEZhaWxlZCB0byBzdGFydCBmaXJtd2FyZVxuIiwKKwkJCQloYS0+aG9zdF9ubyk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorcWxhMTI4MF9sb2FkX2Zpcm13YXJlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworCS8qIElmIGZpcm13YXJlIG5lZWRzIHRvIGJlIGxvYWRlZCAqLworCWlmICghcWxhMTI4MF9pc3BfZmlybXdhcmUoaGEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2NzaSglbGkpOiBpc3BfZmlybXdhcmUoKSBmYWlsZWQhXG4iLAorCQkJCWhhLT5ob3N0X25vKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gcWxhMTI4MF9jaGlwX2RpYWcoaGEpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWlmIChJU19JU1AxMDQwKGhhKSkKKwkJZXJyID0gcWxhMTI4MF9sb2FkX2Zpcm13YXJlX3BpbyhoYSk7CisJZWxzZQorCQllcnIgPSBxbGExMjgwX2xvYWRfZmlybXdhcmVfZG1hKGhhKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSBxbGExMjgwX3N0YXJ0X2Zpcm13YXJlKGhhKTsKKyBvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIEluaXRpYWxpemUgcmluZ3MKKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgICAgICAgICAgICAgICAgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKiAgICAgIGhhLT5yZXF1ZXN0X3JpbmcgID0gcmVxdWVzdCByaW5nIHZpcnR1YWwgYWRkcmVzcworICogICAgICBoYS0+cmVzcG9uc2VfcmluZyA9IHJlc3BvbnNlIHJpbmcgdmlydHVhbCBhZGRyZXNzCisgKiAgICAgIGhhLT5yZXF1ZXN0X2RtYSAgID0gcmVxdWVzdCByaW5nIHBoeXNpY2FsIGFkZHJlc3MKKyAqICAgICAgaGEtPnJlc3BvbnNlX2RtYSAgPSByZXNwb25zZSByaW5nIHBoeXNpY2FsIGFkZHJlc3MKKyAqCisgKiBSZXR1cm5zOgorICogICAgICAwID0gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludAorcWxhMTI4MF9pbml0X3JpbmdzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwl1aW50MTZfdCBtYltNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXTsKKwlpbnQgc3RhdHVzID0gMDsKKworCUVOVEVSKCJxbGExMjgwX2luaXRfcmluZ3MiKTsKKworCS8qIENsZWFyIG91dHN0YW5kaW5nIGNvbW1hbmRzIGFycmF5LiAqLworCW1lbXNldChoYS0+b3V0c3RhbmRpbmdfY21kcywgMCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBzcmIgKikgKiBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMpOworCisJLyogSW5pdGlhbGl6ZSByZXF1ZXN0IHF1ZXVlLiAqLworCWhhLT5yZXF1ZXN0X3JpbmdfcHRyID0gaGEtPnJlcXVlc3RfcmluZzsKKwloYS0+cmVxX3JpbmdfaW5kZXggPSAwOworCWhhLT5yZXFfcV9jbnQgPSBSRVFVRVNUX0VOVFJZX0NOVDsKKwkvKiBtYlswXSA9IE1CQ19JTklUX1JFUVVFU1RfUVVFVUU7ICovCisJbWJbMF0gPSBNQkNfSU5JVF9SRVFVRVNUX1FVRVVFX0E2NDsKKwltYlsxXSA9IFJFUVVFU1RfRU5UUllfQ05UOworCW1iWzNdID0gaGEtPnJlcXVlc3RfZG1hICYgMHhmZmZmOworCW1iWzJdID0gKGhhLT5yZXF1ZXN0X2RtYSA+PiAxNikgJiAweGZmZmY7CisJbWJbNF0gPSAwOworCW1iWzddID0gcGNpX2RtYV9oaTMyKGhhLT5yZXF1ZXN0X2RtYSkgJiAweGZmZmY7CisJbWJbNl0gPSBwY2lfZG1hX2hpMzIoaGEtPnJlcXVlc3RfZG1hKSA+PiAxNjsKKwlpZiAoIShzdGF0dXMgPSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzcgfCBCSVRfNiB8IEJJVF80IHwKKwkJCQkJICAgICAgIEJJVF8zIHwgQklUXzIgfCBCSVRfMSB8IEJJVF8wLAorCQkJCQkgICAgICAgJm1iWzBdKSkpIHsKKwkJLyogSW5pdGlhbGl6ZSByZXNwb25zZSBxdWV1ZS4gKi8KKwkJaGEtPnJlc3BvbnNlX3JpbmdfcHRyID0gaGEtPnJlc3BvbnNlX3Jpbmc7CisJCWhhLT5yc3BfcmluZ19pbmRleCA9IDA7CisJCS8qIG1iWzBdID0gTUJDX0lOSVRfUkVTUE9OU0VfUVVFVUU7ICovCisJCW1iWzBdID0gTUJDX0lOSVRfUkVTUE9OU0VfUVVFVUVfQTY0OworCQltYlsxXSA9IFJFU1BPTlNFX0VOVFJZX0NOVDsKKwkJbWJbM10gPSBoYS0+cmVzcG9uc2VfZG1hICYgMHhmZmZmOworCQltYlsyXSA9IChoYS0+cmVzcG9uc2VfZG1hID4+IDE2KSAmIDB4ZmZmZjsKKwkJbWJbNV0gPSAwOworCQltYls3XSA9IHBjaV9kbWFfaGkzMihoYS0+cmVzcG9uc2VfZG1hKSAmIDB4ZmZmZjsKKwkJbWJbNl0gPSBwY2lfZG1hX2hpMzIoaGEtPnJlc3BvbnNlX2RtYSkgPj4gMTY7CisJCXN0YXR1cyA9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfNyB8IEJJVF82IHwgQklUXzUgfAorCQkJCQkJIEJJVF8zIHwgQklUXzIgfCBCSVRfMSB8IEJJVF8wLAorCQkJCQkJICZtYlswXSk7CisJfQorCisJaWYgKHN0YXR1cykKKwkJZHByaW50aygyLCAicWxhMTI4MF9pbml0X3JpbmdzOiAqKioqIEZBSUxFRCAqKioqXG4iKTsKKworCUxFQVZFKCJxbGExMjgwX2luaXRfcmluZ3MiKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZAorcWxhMTI4MF9wcmludF9zZXR0aW5ncyhzdHJ1Y3QgbnZyYW0gKm52KQoreworCWRwcmludGsoMSwgInFsYTEyODAgOiBpbml0aWF0b3Igc2NzaSBpZCBidXNbMF09JWRcbiIsCisJCW52LT5idXNbMF0uY29uZmlnXzEuaW5pdGlhdG9yX2lkKTsKKwlkcHJpbnRrKDEsICJxbGExMjgwIDogaW5pdGlhdG9yIHNjc2kgaWQgYnVzWzFdPSVkXG4iLAorCQludi0+YnVzWzFdLmNvbmZpZ18xLmluaXRpYXRvcl9pZCk7CisKKwlkcHJpbnRrKDEsICJxbGExMjgwIDogYnVzIHJlc2V0IGRlbGF5WzBdPSVkXG4iLAorCQludi0+YnVzWzBdLmJ1c19yZXNldF9kZWxheSk7CisJZHByaW50aygxLCAicWxhMTI4MCA6IGJ1cyByZXNldCBkZWxheVsxXT0lZFxuIiwKKwkJbnYtPmJ1c1sxXS5idXNfcmVzZXRfZGVsYXkpOworCisJZHByaW50aygxLCAicWxhMTI4MCA6IHJldHJ5IGNvdW50WzBdPSVkXG4iLCBudi0+YnVzWzBdLnJldHJ5X2NvdW50KTsKKwlkcHJpbnRrKDEsICJxbGExMjgwIDogcmV0cnkgZGVsYXlbMF09JWRcbiIsIG52LT5idXNbMF0ucmV0cnlfZGVsYXkpOworCWRwcmludGsoMSwgInFsYTEyODAgOiByZXRyeSBjb3VudFsxXT0lZFxuIiwgbnYtPmJ1c1sxXS5yZXRyeV9jb3VudCk7CisJZHByaW50aygxLCAicWxhMTI4MCA6IHJldHJ5IGRlbGF5WzFdPSVkXG4iLCBudi0+YnVzWzFdLnJldHJ5X2RlbGF5KTsKKworCWRwcmludGsoMSwgInFsYTEyODAgOiBhc3luYyBkYXRhIHNldHVwIHRpbWVbMF09JWRcbiIsCisJCW52LT5idXNbMF0uY29uZmlnXzIuYXN5bmNfZGF0YV9zZXR1cF90aW1lKTsKKwlkcHJpbnRrKDEsICJxbGExMjgwIDogYXN5bmMgZGF0YSBzZXR1cCB0aW1lWzFdPSVkXG4iLAorCQludi0+YnVzWzFdLmNvbmZpZ18yLmFzeW5jX2RhdGFfc2V0dXBfdGltZSk7CisKKwlkcHJpbnRrKDEsICJxbGExMjgwIDogcmVxL2FjayBhY3RpdmUgbmVnYXRpb25bMF09JWRcbiIsCisJCW52LT5idXNbMF0uY29uZmlnXzIucmVxX2Fja19hY3RpdmVfbmVnYXRpb24pOworCWRwcmludGsoMSwgInFsYTEyODAgOiByZXEvYWNrIGFjdGl2ZSBuZWdhdGlvblsxXT0lZFxuIiwKKwkJbnYtPmJ1c1sxXS5jb25maWdfMi5yZXFfYWNrX2FjdGl2ZV9uZWdhdGlvbik7CisKKwlkcHJpbnRrKDEsICJxbGExMjgwIDogZGF0YSBsaW5lIGFjdGl2ZSBuZWdhdGlvblswXT0lZFxuIiwKKwkJbnYtPmJ1c1swXS5jb25maWdfMi5kYXRhX2xpbmVfYWN0aXZlX25lZ2F0aW9uKTsKKwlkcHJpbnRrKDEsICJxbGExMjgwIDogZGF0YSBsaW5lIGFjdGl2ZSBuZWdhdGlvblsxXT0lZFxuIiwKKwkJbnYtPmJ1c1sxXS5jb25maWdfMi5kYXRhX2xpbmVfYWN0aXZlX25lZ2F0aW9uKTsKKworCWRwcmludGsoMSwgInFsYTEyODAgOiBkaXNhYmxlIGxvYWRpbmcgcmlzYyBjb2RlPSVkXG4iLAorCQludi0+Y250cl9mbGFnc18xLmRpc2FibGVfbG9hZGluZ19yaXNjX2NvZGUpOworCisJZHByaW50aygxLCAicWxhMTI4MCA6IGVuYWJsZSA2NGJpdCBhZGRyZXNzaW5nPSVkXG4iLAorCQludi0+Y250cl9mbGFnc18xLmVuYWJsZV82NGJpdF9hZGRyZXNzaW5nKTsKKworCWRwcmludGsoMSwgInFsYTEyODAgOiBzZWxlY3Rpb24gdGltZW91dCBsaW1pdFswXT0lZFxuIiwKKwkJbnYtPmJ1c1swXS5zZWxlY3Rpb25fdGltZW91dCk7CisJZHByaW50aygxLCAicWxhMTI4MCA6IHNlbGVjdGlvbiB0aW1lb3V0IGxpbWl0WzFdPSVkXG4iLAorCQludi0+YnVzWzFdLnNlbGVjdGlvbl90aW1lb3V0KTsKKworCWRwcmludGsoMSwgInFsYTEyODAgOiBtYXggcXVldWUgZGVwdGhbMF09JWRcbiIsCisJCW52LT5idXNbMF0ubWF4X3F1ZXVlX2RlcHRoKTsKKwlkcHJpbnRrKDEsICJxbGExMjgwIDogbWF4IHF1ZXVlIGRlcHRoWzFdPSVkXG4iLAorCQludi0+YnVzWzFdLm1heF9xdWV1ZV9kZXB0aCk7Cit9CisKK3N0YXRpYyB2b2lkCitxbGExMjgwX3NldF90YXJnZXRfZGVmYXVsdHMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBpbnQgYnVzLCBpbnQgdGFyZ2V0KQoreworCXN0cnVjdCBudnJhbSAqbnYgPSAmaGEtPm52cmFtOworCisJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLnJlbmVnb3RpYXRlX29uX2Vycm9yID0gMTsKKwludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuYXV0b19yZXF1ZXN0X3NlbnNlID0gMTsKKwludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYudGFnX3F1ZXVpbmcgPSAxOworCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5lbmFibGVfc3luYyA9IDE7CisjaWYgMQkvKiBTb21lIFNDU0kgUHJvY2Vzc29ycyBkbyBub3Qgc2VlbSB0byBsaWtlIHRoaXMgKi8KKwludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuZW5hYmxlX3dpZGUgPSAxOworI2VuZGlmCisJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLnBhcml0eV9jaGVja2luZyA9IDE7CisJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmRpc2Nvbm5lY3RfYWxsb3dlZCA9IDE7CisJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLmV4ZWN1dGlvbl90aHJvdHRsZSA9CisJCW52LT5idXNbYnVzXS5tYXhfcXVldWVfZGVwdGggLSAxOworCisJaWYgKElTX0lTUDF4MTYwKGhhKSkgeworCQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uZmxhZ3MuZmxhZ3MxeDE2MC5kZXZpY2VfZW5hYmxlID0gMTsKKwkJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLmZsYWdzLmZsYWdzMXgxNjAuc3luY19vZmZzZXQgPSAweDBlOworCQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uc3luY19wZXJpb2QgPSA5OworCQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucHByXzF4MTYwLmZsYWdzLmVuYWJsZV9wcHIgPSAxOworCQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucHByXzF4MTYwLmZsYWdzLnBwcl9vcHRpb25zID0gMjsKKwkJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBwcl8xeDE2MC5mbGFncy5wcHJfYnVzX3dpZHRoID0gMTsKKwl9IGVsc2UgeworCQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uZmxhZ3MuZmxhZ3MxeDgwLmRldmljZV9lbmFibGUgPSAxOworCQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uZmxhZ3MuZmxhZ3MxeDgwLnN5bmNfb2Zmc2V0ID0gMTI7CisJCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5zeW5jX3BlcmlvZCA9IDEwOworCX0KK30KKworc3RhdGljIHZvaWQKK3FsYTEyODBfc2V0X2RlZmF1bHRzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlzdHJ1Y3QgbnZyYW0gKm52ID0gJmhhLT5udnJhbTsKKwlpbnQgYnVzLCB0YXJnZXQ7CisKKwlkcHJpbnRrKDEsICJVc2luZyBkZWZhdWx0cyBmb3IgTlZSQU06IFxuIik7CisJbWVtc2V0KG52LCAwLCBzaXplb2Yoc3RydWN0IG52cmFtKSk7CisKKwkvKiBudi0+Y250cl9mbGFnc18xLmRpc2FibGVfbG9hZGluZ19yaXNjX2NvZGUgPSAxOyAqLworCW52LT5maXJtd2FyZV9mZWF0dXJlLmYuZW5hYmxlX2Zhc3RfcG9zdGluZyA9IDE7CisJbnYtPmZpcm13YXJlX2ZlYXR1cmUuZi5kaXNhYmxlX3N5bmNocm9ub3VzX2JhY2tvZmYgPSAxOworCW52LT50ZXJtaW5hdGlvbi5mLnNjc2lfYnVzXzBfY29udHJvbCA9IDM7CisJbnYtPnRlcm1pbmF0aW9uLmYuc2NzaV9idXNfMV9jb250cm9sID0gMzsKKwludi0+dGVybWluYXRpb24uZi5hdXRvX3Rlcm1fc3VwcG9ydCA9IDE7CisKKwkvKgorCSAqIFNldCBkZWZhdWx0IEZJRk8gbWFnaWMgLSBXaGF0IGFwcHJvcHJpYXRlIHZhbHVlcyB3b3VsZCBiZSBoZXJlCisJICogaXMgdW5rbm93bi4gVGhpcyBpcyB3aGF0IEkgaGF2ZSBmb3VuZCB0ZXN0aW5nIHdpdGggMTIxNjBzLgorCSAqCisJICogTm93LCBJIHdvdWxkIGxvdmUgdGhlIG1hZ2ljIGRlY29kZXIgcmluZyBmb3IgdGhpcyBvbmUsIHRoZQorCSAqIGhlYWRlciBmaWxlIHByb3ZpZGVkIGJ5IFFMb2dpYyBzZWVtcyB0byBiZSBib2d1cyBvciBpbmNvbXBsZXRlCisJICogYXQgYmVzdC4KKwkgKi8KKwludi0+aXNwX2NvbmZpZy5jID0gSVNQX0NGRzFfQkVOQUJ8SVNQX0NGRzFfRjEyODsKKwlpZiAoSVNfSVNQMXgxNjAoaGEpKQorCQludi0+aXNwX3BhcmFtZXRlciA9IDB4MDE7IC8qIGZhc3QgbWVtb3J5IGVuYWJsZSAqLworCisJZm9yIChidXMgPSAwOyBidXMgPCBNQVhfQlVTRVM7IGJ1cysrKSB7CisJCW52LT5idXNbYnVzXS5jb25maWdfMS5pbml0aWF0b3JfaWQgPSA3OworCQludi0+YnVzW2J1c10uY29uZmlnXzIucmVxX2Fja19hY3RpdmVfbmVnYXRpb24gPSAxOworCQludi0+YnVzW2J1c10uY29uZmlnXzIuZGF0YV9saW5lX2FjdGl2ZV9uZWdhdGlvbiA9IDE7CisJCW52LT5idXNbYnVzXS5zZWxlY3Rpb25fdGltZW91dCA9IDI1MDsKKwkJbnYtPmJ1c1tidXNdLm1heF9xdWV1ZV9kZXB0aCA9IDI1NjsKKworCQlpZiAoSVNfSVNQMTA0MChoYSkpIHsKKwkJCW52LT5idXNbYnVzXS5idXNfcmVzZXRfZGVsYXkgPSAzOworCQkJbnYtPmJ1c1tidXNdLmNvbmZpZ18yLmFzeW5jX2RhdGFfc2V0dXBfdGltZSA9IDY7CisJCQludi0+YnVzW2J1c10ucmV0cnlfZGVsYXkgPSAxOworCQl9IGVsc2UgeworCQkJbnYtPmJ1c1tidXNdLmJ1c19yZXNldF9kZWxheSA9IDU7CisJCQludi0+YnVzW2J1c10uY29uZmlnXzIuYXN5bmNfZGF0YV9zZXR1cF90aW1lID0gODsKKwkJfQorCisJCWZvciAodGFyZ2V0ID0gMDsgdGFyZ2V0IDwgTUFYX1RBUkdFVFM7IHRhcmdldCsrKQorCQkJcWxhMTI4MF9zZXRfdGFyZ2V0X2RlZmF1bHRzKGhhLCBidXMsIHRhcmdldCk7CisJfQorfQorCitzdGF0aWMgaW50CitxbGExMjgwX2NvbmZpZ190YXJnZXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBpbnQgYnVzLCBpbnQgdGFyZ2V0KQoreworCXN0cnVjdCBudnJhbSAqbnYgPSAmaGEtPm52cmFtOworCXVpbnQxNl90IG1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOworCWludCBzdGF0dXMsIGx1bjsKKworCS8qIFNldCBUYXJnZXQgUGFyYW1ldGVycy4gKi8KKwltYlswXSA9IE1CQ19TRVRfVEFSR0VUX1BBUkFNRVRFUlM7CisJbWJbMV0gPSAodWludDE2X3QpIChidXMgPyB0YXJnZXQgfCBCSVRfNyA6IHRhcmdldCk7CisJbWJbMV0gPDw9IDg7CisKKwkvKgorCSAqIERvIG5vdCBlbmFibGUgd2lkZSwgc3luYywgYW5kIHBwciBmb3IgdGhlIGluaXRpYWwKKwkgKiBJTlFVSVJZIHJ1bi4gV2UgZW5hYmxlIHRoaXMgbGF0ZXIgaWYgd2UgZGV0ZXJtaW5lCisJICogdGhlIHRhcmdldCBhY3R1YWxseSBzdXBwb3J0cyBpdC4KKwkgKi8KKwludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuCisJCWF1dG9fcmVxdWVzdF9zZW5zZSA9IDE7CisJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLgorCQlzdG9wX3F1ZXVlX29uX2NoZWNrID0gMDsKKworCWlmIChJU19JU1AxeDE2MChoYSkpCisJCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wcHJfMXgxNjAuCisJCQlmbGFncy5lbmFibGVfcHByID0gMDsKKworCS8qCisJICogTm8gc3luYywgd2lkZSwgZXRjLiB3aGlsZSBwcm9iaW5nCisJICovCisJbWJbMl0gPSAobnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5jIDw8IDgpICYKKwkJfihUUF9TWU5DIC8qfCBUUF9XSURFIHwgVFBfUFBSKi8pOworCisJaWYgKElTX0lTUDF4MTYwKGhhKSkKKwkJbWJbM10gPQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uZmxhZ3MuZmxhZ3MxeDE2MC5zeW5jX29mZnNldCA8PCA4OworCWVsc2UKKwkJbWJbM10gPQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uZmxhZ3MuZmxhZ3MxeDgwLnN5bmNfb2Zmc2V0IDw8IDg7CisJbWJbM10gfD0gbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnN5bmNfcGVyaW9kOworCisJc3RhdHVzID0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8zIHwgQklUXzIgfCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pOworCisJLyogU2F2ZSBUYWcgcXVldWluZyBlbmFibGUgZmxhZy4gKi8KKwltYlswXSA9IEJJVF8wIDw8IHRhcmdldDsKKwlpZiAobnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLnRhZ19xdWV1aW5nKQorCQloYS0+YnVzX3NldHRpbmdzW2J1c10ucXRhZ19lbmFibGVzIHw9IG1iWzBdOworCisJLyogU2F2ZSBEZXZpY2UgZW5hYmxlIGZsYWcuICovCisJaWYgKElTX0lTUDF4MTYwKGhhKSkgeworCQlpZiAobnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLmZsYWdzLmZsYWdzMXgxNjAuZGV2aWNlX2VuYWJsZSkKKwkJCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5kZXZpY2VfZW5hYmxlcyB8PSBtYlswXTsKKwkJaGEtPmJ1c19zZXR0aW5nc1tidXNdLmx1bl9kaXNhYmxlcyB8PSAwOworCX0gZWxzZSB7CisJCWlmIChudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uZmxhZ3MuZmxhZ3MxeDgwLmRldmljZV9lbmFibGUpCisJCQloYS0+YnVzX3NldHRpbmdzW2J1c10uZGV2aWNlX2VuYWJsZXMgfD0gbWJbMF07CisJCS8qIFNhdmUgTFVOIGRpc2FibGUgZmxhZy4gKi8KKwkJaWYgKG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5mbGFncy5mbGFnczF4ODAubHVuX2Rpc2FibGUpCisJCQloYS0+YnVzX3NldHRpbmdzW2J1c10ubHVuX2Rpc2FibGVzIHw9IG1iWzBdOworCX0KKworCS8qIFNldCBEZXZpY2UgUXVldWUgUGFyYW1ldGVycy4gKi8KKwlmb3IgKGx1biA9IDA7IGx1biA8IE1BWF9MVU5TOyBsdW4rKykgeworCQltYlswXSA9IE1CQ19TRVRfREVWSUNFX1FVRVVFOworCQltYlsxXSA9ICh1aW50MTZfdCkoYnVzID8gdGFyZ2V0IHwgQklUXzcgOiB0YXJnZXQpOworCQltYlsxXSA9IG1iWzFdIDw8IDggfCBsdW47CisJCW1iWzJdID0gbnYtPmJ1c1tidXNdLm1heF9xdWV1ZV9kZXB0aDsKKwkJbWJbM10gPSBudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uZXhlY3V0aW9uX3Rocm90dGxlOworCQlzdGF0dXMgfD0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIDB4MGYsICZtYlswXSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorcWxhMTI4MF9jb25maWdfYnVzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgaW50IGJ1cykKK3sKKwlzdHJ1Y3QgbnZyYW0gKm52ID0gJmhhLT5udnJhbTsKKwl1aW50MTZfdCBtYltNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXTsKKwlpbnQgdGFyZ2V0LCBzdGF0dXM7CisKKwkvKiBTQ1NJIFJlc2V0IERpc2FibGUuICovCisJaGEtPmJ1c19zZXR0aW5nc1tidXNdLmRpc2FibGVfc2NzaV9yZXNldCA9CisJCW52LT5idXNbYnVzXS5jb25maWdfMS5zY3NpX3Jlc2V0X2Rpc2FibGU7CisKKwkvKiBJbml0aWF0b3IgSUQuICovCisJaGEtPmJ1c19zZXR0aW5nc1tidXNdLmlkID0gbnYtPmJ1c1tidXNdLmNvbmZpZ18xLmluaXRpYXRvcl9pZDsKKwltYlswXSA9IE1CQ19TRVRfSU5JVElBVE9SX0lEOworCW1iWzFdID0gYnVzID8gaGEtPmJ1c19zZXR0aW5nc1tidXNdLmlkIHwgQklUXzcgOgorCQloYS0+YnVzX3NldHRpbmdzW2J1c10uaWQ7CisJc3RhdHVzID0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8xIHwgQklUXzAsICZtYlswXSk7CisKKwkvKiBSZXNldCBEZWxheS4gKi8KKwloYS0+YnVzX3NldHRpbmdzW2J1c10uYnVzX3Jlc2V0X2RlbGF5ID0KKwkJbnYtPmJ1c1tidXNdLmJ1c19yZXNldF9kZWxheTsKKworCS8qIENvbW1hbmQgcXVldWUgZGVwdGggcGVyIGRldmljZS4gKi8KKwloYS0+YnVzX3NldHRpbmdzW2J1c10uaGl3YXQgPSBudi0+YnVzW2J1c10ubWF4X3F1ZXVlX2RlcHRoIC0gMTsKKworCS8qIFNldCB0YXJnZXQgcGFyYW1ldGVycy4gKi8KKwlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8IE1BWF9UQVJHRVRTOyB0YXJnZXQrKykKKwkJc3RhdHVzIHw9IHFsYTEyODBfY29uZmlnX3RhcmdldChoYSwgYnVzLCB0YXJnZXQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorcWxhMTI4MF9udnJhbV9jb25maWcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXN0cnVjdCBkZXZpY2VfcmVnIF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisJc3RydWN0IG52cmFtICpudiA9ICZoYS0+bnZyYW07CisJaW50IGJ1cywgdGFyZ2V0LCBzdGF0dXMgPSAwOworCXVpbnQxNl90IG1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOworCXVpbnQxNl90IG1hc2s7CisKKwlFTlRFUigicWxhMTI4MF9udnJhbV9jb25maWciKTsKKworCWlmIChoYS0+bnZyYW1fdmFsaWQpIHsKKwkJLyogQWx3YXlzIGZvcmNlIEFVVE8gc2Vuc2UgZm9yIExJTlVYIFNDU0kgKi8KKwkJZm9yIChidXMgPSAwOyBidXMgPCBNQVhfQlVTRVM7IGJ1cysrKQorCQkJZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPCBNQVhfVEFSR0VUUzsgdGFyZ2V0KyspIHsKKwkJCQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuCisJCQkJCWF1dG9fcmVxdWVzdF9zZW5zZSA9IDE7CisJCQl9CisJfSBlbHNlIHsKKwkJcWxhMTI4MF9zZXRfZGVmYXVsdHMoaGEpOworCX0KKworCXFsYTEyODBfcHJpbnRfc2V0dGluZ3MobnYpOworCisJLyogRGlzYWJsZSBSSVNDIGxvYWQgb2YgZmlybXdhcmUuICovCisJaGEtPmZsYWdzLmRpc2FibGVfcmlzY19jb2RlX2xvYWQgPQorCQludi0+Y250cl9mbGFnc18xLmRpc2FibGVfbG9hZGluZ19yaXNjX2NvZGU7CisKKwlpZiAoSVNfSVNQMTA0MChoYSkpIHsKKwkJdWludDE2X3QgaHdyZXYsIGNmZzEsIGNkbWFfY29uZiwgZGRtYV9jb25mOworCisJCWh3cmV2ID0gUkRfUkVHX1dPUkQoJnJlZy0+Y2ZnXzApICYgSVNQX0NGRzBfSFdNU0s7CisKKwkJY2ZnMSA9IFJEX1JFR19XT1JEKCZyZWctPmNmZ18xKTsKKwkJY2RtYV9jb25mID0gUkRfUkVHX1dPUkQoJnJlZy0+Y2RtYV9jZmcpOworCQlkZG1hX2NvbmYgPSBSRF9SRUdfV09SRCgmcmVnLT5kZG1hX2NmZyk7CisKKwkJLyogQnVzdGVkIGZpZm8sIHNheXMgbWphY29iLiAqLworCQlpZiAoaHdyZXYgPT0gSVNQX0NGRzBfMTA0MEEpCisJCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y2ZnXzEsIGNmZzEgfCBJU1BfQ0ZHMV9GNjQpOworCQllbHNlCisJCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y2ZnXzEsIGNmZzEgfCBJU1BfQ0ZHMV9GNjQgfCBJU1BfQ0ZHMV9CRU5BQik7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPmNkbWFfY2ZnLCBjZG1hX2NvbmYgfCBDRE1BX0NPTkZfQkVOQUIpOworCQlXUlRfUkVHX1dPUkQoJnJlZy0+ZGRtYV9jZmcsIGNkbWFfY29uZiB8IERETUFfQ09ORl9CRU5BQik7CisJfSBlbHNlIHsKKwkJLyogU2V0IElTUCBoYXJkd2FyZSBETUEgYnVyc3QgKi8KKwkJbWJbMF0gPSBudi0+aXNwX2NvbmZpZy5jOworCQkvKiBFbmFibGUgRE1BIGFyYml0cmF0aW9uIG9uIGR1YWwgY2hhbm5lbCBjb250cm9sbGVycyAqLworCQlpZiAoaGEtPnBvcnRzID4gMSkKKwkJCW1iWzBdIHw9IEJJVF8xMzsKKwkJV1JUX1JFR19XT1JEKCZyZWctPmNmZ18xLCBtYlswXSk7CisKKwkJLyogU2V0IFNDU0kgdGVybWluYXRpb24uICovCisJCVdSVF9SRUdfV09SRCgmcmVnLT5ncGlvX2VuYWJsZSwgKEJJVF8zICsgQklUXzIgKyBCSVRfMSArIEJJVF8wKSk7CisJCW1iWzBdID0gbnYtPnRlcm1pbmF0aW9uLmMgJiAoQklUXzMgKyBCSVRfMiArIEJJVF8xICsgQklUXzApOworCQlXUlRfUkVHX1dPUkQoJnJlZy0+Z3Bpb19kYXRhLCBtYlswXSk7CisJfQorCisJLyogSVNQIHBhcmFtZXRlciB3b3JkLiAqLworCW1iWzBdID0gTUJDX1NFVF9TWVNURU1fUEFSQU1FVEVSOworCW1iWzFdID0gbnYtPmlzcF9wYXJhbWV0ZXI7CisJc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pOworCisJaWYgKElTX0lTUDF4NDAoaGEpKSB7CisJCS8qIGNsb2NrIHJhdGUgLSBmb3IgcWxhMTI0MCBhbmQgb2xkZXIsIG9ubHkgKi8KKwkJbWJbMF0gPSBNQkNfU0VUX0NMT0NLX1JBVEU7CisJCW1iWzFdID0gNDA7CisJIAlzdGF0dXMgfD0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8xIHwgQklUXzAsIG1iKTsKKwl9CisKKwkvKiBGaXJtd2FyZSBmZWF0dXJlIHdvcmQuICovCisJbWJbMF0gPSBNQkNfU0VUX0ZJUk1XQVJFX0ZFQVRVUkVTOworCW1hc2sgPSBCSVRfNSB8IEJJVF8xIHwgQklUXzA7CisJbWJbMV0gPSBsZTE2X3RvX2NwdShudi0+ZmlybXdhcmVfZmVhdHVyZS53KSAmIChtYXNrKTsKKyNpZiBkZWZpbmVkKENPTkZJR19JQTY0X0dFTkVSSUMpIHx8IGRlZmluZWQgKENPTkZJR19JQTY0X1NHSV9TTjIpCisJaWYgKGlhNjRfcGxhdGZvcm1faXMoInNuMiIpKSB7CisJCXByaW50ayhLRVJOX0lORk8gInNjc2koJWxpKTogRW5hYmxpbmcgU04yIFBDSSBETUEgIgorCQkgICAgICAgIndvcmthcm91bmRcbiIsIGhhLT5ob3N0X25vKTsKKwkJbWJbMV0gfD0gQklUXzk7CisJfQorI2VuZGlmCisJc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBtYXNrLCAmbWJbMF0pOworCisJLyogUmV0cnkgY291bnQgYW5kIGRlbGF5LiAqLworCW1iWzBdID0gTUJDX1NFVF9SRVRSWV9DT1VOVDsKKwltYlsxXSA9IG52LT5idXNbMF0ucmV0cnlfY291bnQ7CisJbWJbMl0gPSBudi0+YnVzWzBdLnJldHJ5X2RlbGF5OworCW1iWzZdID0gbnYtPmJ1c1sxXS5yZXRyeV9jb3VudDsKKwltYls3XSA9IG52LT5idXNbMV0ucmV0cnlfZGVsYXk7CisJc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfNyB8IEJJVF82IHwgQklUXzIgfAorCQkJCQkgIEJJVF8xIHwgQklUXzAsICZtYlswXSk7CisKKwkvKiBBU1lOQyBkYXRhIHNldHVwIHRpbWUuICovCisJbWJbMF0gPSBNQkNfU0VUX0FTWU5DX0RBVEFfU0VUVVA7CisJbWJbMV0gPSBudi0+YnVzWzBdLmNvbmZpZ18yLmFzeW5jX2RhdGFfc2V0dXBfdGltZTsKKwltYlsyXSA9IG52LT5idXNbMV0uY29uZmlnXzIuYXN5bmNfZGF0YV9zZXR1cF90aW1lOworCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzIgfCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pOworCisJLyogQWN0aXZlIG5lZ2F0aW9uIHN0YXRlcy4gKi8KKwltYlswXSA9IE1CQ19TRVRfQUNUSVZFX05FR0FUSU9OOworCW1iWzFdID0gMDsKKwlpZiAobnYtPmJ1c1swXS5jb25maWdfMi5yZXFfYWNrX2FjdGl2ZV9uZWdhdGlvbikKKwkJbWJbMV0gfD0gQklUXzU7CisJaWYgKG52LT5idXNbMF0uY29uZmlnXzIuZGF0YV9saW5lX2FjdGl2ZV9uZWdhdGlvbikKKwkJbWJbMV0gfD0gQklUXzQ7CisJbWJbMl0gPSAwOworCWlmIChudi0+YnVzWzFdLmNvbmZpZ18yLnJlcV9hY2tfYWN0aXZlX25lZ2F0aW9uKQorCQltYlsyXSB8PSBCSVRfNTsKKwlpZiAobnYtPmJ1c1sxXS5jb25maWdfMi5kYXRhX2xpbmVfYWN0aXZlX25lZ2F0aW9uKQorCQltYlsyXSB8PSBCSVRfNDsKKwlzdGF0dXMgfD0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8yIHwgQklUXzEgfCBCSVRfMCwgJm1iWzBdKTsKKworCW1iWzBdID0gTUJDX1NFVF9EQVRBX09WRVJSVU5fUkVDT1ZFUlk7CisJbWJbMV0gPSAyOwkvKiBSZXNldCBTQ1NJIGJ1cyBhbmQgcmV0dXJuIGFsbCBvdXRzdGFuZGluZyBJTyAqLworCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzEgfCBCSVRfMCwgJm1iWzBdKTsKKworCS8qIHRoaW5neSAqLworCW1iWzBdID0gTUJDX1NFVF9QQ0lfQ09OVFJPTDsKKwltYlsxXSA9IDI7CS8qIERhdGEgRE1BIENoYW5uZWwgQnVyc3QgRW5hYmxlICovCisJbWJbMl0gPSAyOwkvKiBDb21tYW5kIERNQSBDaGFubmVsIEJ1cnN0IEVuYWJsZSAqLworCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzIgfCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pOworCisJbWJbMF0gPSBNQkNfU0VUX1RBR19BR0VfTElNSVQ7CisJbWJbMV0gPSA4OworCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzEgfCBCSVRfMCwgJm1iWzBdKTsKKworCS8qIFNlbGVjdGlvbiB0aW1lb3V0LiAqLworCW1iWzBdID0gTUJDX1NFVF9TRUxFQ1RJT05fVElNRU9VVDsKKwltYlsxXSA9IG52LT5idXNbMF0uc2VsZWN0aW9uX3RpbWVvdXQ7CisJbWJbMl0gPSBudi0+YnVzWzFdLnNlbGVjdGlvbl90aW1lb3V0OworCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzIgfCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pOworCisJZm9yIChidXMgPSAwOyBidXMgPCBoYS0+cG9ydHM7IGJ1cysrKQorCQlzdGF0dXMgfD0gcWxhMTI4MF9jb25maWdfYnVzKGhhLCBidXMpOworCisJaWYgKHN0YXR1cykKKwkJZHByaW50aygyLCAicWxhMTI4MF9udnJhbV9jb25maWc6ICoqKiogRkFJTEVEICoqKipcbiIpOworCisJTEVBVkUoInFsYTEyODBfbnZyYW1fY29uZmlnIik7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEdldCBOVlJBTSBkYXRhIHdvcmQKKyAqICAgICAgQ2FsY3VsYXRlcyB3b3JkIHBvc2l0aW9uIGluIE5WUkFNIGFuZCBjYWxscyByZXF1ZXN0IHJvdXRpbmUgdG8KKyAqICAgICAgZ2V0IHRoZSB3b3JkIGZyb20gTlZSQU0uCisgKgorICogSW5wdXQ6CisgKiAgICAgIGhhICAgICAgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKiAgICAgIGFkZHJlc3MgPSBOVlJBTSB3b3JkIGFkZHJlc3MuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgZGF0YSB3b3JkLgorICovCitzdGF0aWMgdWludDE2X3QKK3FsYTEyODBfZ2V0X252cmFtX3dvcmQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MzJfdCBhZGRyZXNzKQoreworCXVpbnQzMl90IG52X2NtZDsKKwl1aW50MTZfdCBkYXRhOworCisJbnZfY21kID0gYWRkcmVzcyA8PCAxNjsKKwludl9jbWQgfD0gTlZfUkVBRF9PUDsKKworCWRhdGEgPSBsZTE2X3RvX2NwdShxbGExMjgwX252cmFtX3JlcXVlc3QoaGEsIG52X2NtZCkpOworCisJZHByaW50ayg4LCAicWxhMTI4MF9nZXRfbnZyYW1fd29yZDogZXhpdGluZyBub3JtYWxseSBOVlJBTSBkYXRhID0gIgorCQkiMHgleCIsIGRhdGEpOworCisJcmV0dXJuIGRhdGE7Cit9CisKKy8qCisgKiBOVlJBTSByZXF1ZXN0CisgKiAgICAgIFNlbmRzIHJlYWQgY29tbWFuZCB0byBOVlJBTSBhbmQgZ2V0cyBkYXRhIGZyb20gTlZSQU0uCisgKgorICogSW5wdXQ6CisgKiAgICAgIGhhICAgICA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqICAgICAgbnZfY21kID0gQml0IDI2ICAgICA9IHN0YXJ0IGJpdAorICogICAgICAgICAgICAgICBCaXQgMjUsIDI0ID0gb3Bjb2RlCisgKiAgICAgICAgICAgICAgIEJpdCAyMy0xNiAgPSBhZGRyZXNzCisgKiAgICAgICAgICAgICAgIEJpdCAxNS0wICAgPSB3cml0ZSBkYXRhCisgKgorICogUmV0dXJuczoKKyAqICAgICAgZGF0YSB3b3JkLgorICovCitzdGF0aWMgdWludDE2X3QKK3FsYTEyODBfbnZyYW1fcmVxdWVzdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90IG52X2NtZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZyBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCWludCBjbnQ7CisJdWludDE2X3QgZGF0YSA9IDA7CisJdWludDE2X3QgcmVnX2RhdGE7CisKKwkvKiBTZW5kIGNvbW1hbmQgdG8gTlZSQU0uICovCisKKwludl9jbWQgPDw9IDU7CisJZm9yIChjbnQgPSAwOyBjbnQgPCAxMTsgY250KyspIHsKKwkJaWYgKG52X2NtZCAmIEJJVF8zMSkKKwkJCXFsYTEyODBfbnZfd3JpdGUoaGEsIE5WX0RBVEFfT1VUKTsKKwkJZWxzZQorCQkJcWxhMTI4MF9udl93cml0ZShoYSwgMCk7CisJCW52X2NtZCA8PD0gMTsKKwl9CisKKwkvKiBSZWFkIGRhdGEgZnJvbSBOVlJBTS4gKi8KKworCWZvciAoY250ID0gMDsgY250IDwgMTY7IGNudCsrKSB7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5udnJhbSwgKE5WX1NFTEVDVCB8IE5WX0NMT0NLKSk7CisJCVJEX1JFR19XT1JEKCZyZWctPmlkX2wpOwkvKiBGbHVzaCBQQ0kgd3JpdGUgKi8KKwkJTlZSQU1fREVMQVkoKTsKKwkJZGF0YSA8PD0gMTsKKwkJcmVnX2RhdGEgPSBSRF9SRUdfV09SRCgmcmVnLT5udnJhbSk7CisJCWlmIChyZWdfZGF0YSAmIE5WX0RBVEFfSU4pCisJCQlkYXRhIHw9IEJJVF8wOworCQlXUlRfUkVHX1dPUkQoJnJlZy0+bnZyYW0sIE5WX1NFTEVDVCk7CisJCVJEX1JFR19XT1JEKCZyZWctPmlkX2wpOwkvKiBGbHVzaCBQQ0kgd3JpdGUgKi8KKwkJTlZSQU1fREVMQVkoKTsKKwl9CisKKwkvKiBEZXNlbGVjdCBjaGlwLiAqLworCisJV1JUX1JFR19XT1JEKCZyZWctPm52cmFtLCBOVl9ERVNFTEVDVCk7CisJUkRfUkVHX1dPUkQoJnJlZy0+aWRfbCk7CS8qIEZsdXNoIFBDSSB3cml0ZSAqLworCU5WUkFNX0RFTEFZKCk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQKK3FsYTEyODBfbnZfd3JpdGUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MTZfdCBkYXRhKQoreworCXN0cnVjdCBkZXZpY2VfcmVnIF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisKKwlXUlRfUkVHX1dPUkQoJnJlZy0+bnZyYW0sIGRhdGEgfCBOVl9TRUxFQ1QpOworCVJEX1JFR19XT1JEKCZyZWctPmlkX2wpOwkvKiBGbHVzaCBQQ0kgd3JpdGUgKi8KKwlOVlJBTV9ERUxBWSgpOworCVdSVF9SRUdfV09SRCgmcmVnLT5udnJhbSwgZGF0YSB8IE5WX1NFTEVDVCB8IE5WX0NMT0NLKTsKKwlSRF9SRUdfV09SRCgmcmVnLT5pZF9sKTsJLyogRmx1c2ggUENJIHdyaXRlICovCisJTlZSQU1fREVMQVkoKTsKKwlXUlRfUkVHX1dPUkQoJnJlZy0+bnZyYW0sIGRhdGEgfCBOVl9TRUxFQ1QpOworCVJEX1JFR19XT1JEKCZyZWctPmlkX2wpOwkvKiBGbHVzaCBQQ0kgd3JpdGUgKi8KKwlOVlJBTV9ERUxBWSgpOworfQorCisvKgorICogTWFpbGJveCBDb21tYW5kCisgKiAgICAgIElzc3VlIG1haWxib3ggY29tbWFuZCBhbmQgd2FpdHMgZm9yIGNvbXBsZXRpb24uCisgKgorICogSW5wdXQ6CisgKiAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICogICAgICBtciA9IG1haWxib3ggcmVnaXN0ZXJzIHRvIGxvYWQuCisgKiAgICAgIG1iID0gZGF0YSBwb2ludGVyIGZvciBtYWlsYm94IHJlZ2lzdGVycy4KKyAqCisgKiBPdXRwdXQ6CisgKiAgICAgIG1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdID0gcmV0dXJuZWQgbWFpbGJveCBkYXRhLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgIDAgPSBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK3FsYTEyODBfbWFpbGJveF9jb21tYW5kKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDhfdCBtciwgdWludDE2X3QgKm1iKQoreworCXN0cnVjdCBkZXZpY2VfcmVnIF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisjaWYgMAorCUxJU1RfSEVBRChkb25lX3EpOworI2VuZGlmCisJaW50IHN0YXR1cyA9IDA7CisJaW50IGNudDsKKwl1aW50MTZfdCAqb3B0ciwgKmlwdHI7CisJdWludDE2X3QgX19pb21lbSAqbXB0cjsKKwl1aW50MTZfdCBkYXRhOworCURFQ0xBUkVfQ09NUExFVElPTih3YWl0KTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKworCUVOVEVSKCJxbGExMjgwX21haWxib3hfY29tbWFuZCIpOworCisJaWYgKGhhLT5tYWlsYm94X3dhaXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJXYXJuaW5nIG1haWxib3ggd2FpdCBhbHJlYWR5IGluIHVzZSFcbiIpOworCX0KKwloYS0+bWFpbGJveF93YWl0ID0gJndhaXQ7CisKKwkvKgorCSAqIFdlIHJlYWxseSBzaG91bGQgc3RhcnQgb3V0IGJ5IHZlcmlmeWluZyB0aGF0IHRoZSBtYWlsYm94IGlzCisJICogYXZhaWxhYmxlIGJlZm9yZSBzdGFydGluZyBzZW5kaW5nIHRoZSBjb21tYW5kIGRhdGEKKwkgKi8KKwkvKiBMb2FkIG1haWxib3ggcmVnaXN0ZXJzLiAqLworCW1wdHIgPSAodWludDE2X3QgX19pb21lbSAqKSAmcmVnLT5tYWlsYm94MDsKKwlpcHRyID0gbWI7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQUlMQk9YX1JFR0lTVEVSX0NPVU5UOyBjbnQrKykgeworCQlpZiAobXIgJiBCSVRfMCkgeworCQkJV1JUX1JFR19XT1JEKG1wdHIsICgqaXB0cikpOworCQl9CisKKwkJbXIgPj49IDE7CisJCW1wdHIrKzsKKwkJaXB0cisrOworCX0KKworCS8qIElzc3VlIHNldCBob3N0IGludGVycnVwdCBjb21tYW5kLiAqLworCisJLyogc2V0IHVwIGEgdGltZXIganVzdCBpbiBjYXNlIHdlJ3JlIHJlYWxseSBqYW1tZWQgKi8KKwlpbml0X3RpbWVyKCZ0aW1lcik7CisJdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAyMCpIWjsKKwl0aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaGE7CisJdGltZXIuZnVuY3Rpb24gPSBxbGExMjgwX21haWxib3hfdGltZW91dDsKKwlhZGRfdGltZXIoJnRpbWVyKTsKKworCXNwaW5fdW5sb2NrX2lycShIT1NUX0xPQ0spOworCVdSVF9SRUdfV09SRCgmcmVnLT5ob3N0X2NtZCwgSENfU0VUX0hPU1RfSU5UKTsKKwlkYXRhID0gcWxhMTI4MF9kZWJvdW5jZV9yZWdpc3RlcigmcmVnLT5pc3RhdHVzKTsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOworCWRlbF90aW1lcl9zeW5jKCZ0aW1lcik7CisKKwlzcGluX2xvY2tfaXJxKEhPU1RfTE9DSyk7CisKKwloYS0+bWFpbGJveF93YWl0ID0gTlVMTDsKKworCS8qIENoZWNrIGZvciBtYWlsYm94IGNvbW1hbmQgdGltZW91dC4gKi8KKwlpZiAoaGEtPm1haWxib3hfb3V0WzBdICE9IE1CU19DTURfQ01QKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInFsYTEyODBfbWFpbGJveF9jb21tYW5kOiBDb21tYW5kIGZhaWxlZCwgIgorCQkgICAgICAgIm1haWxib3gwID0gMHglMDR4LCBtYWlsYm94X291dDAgPSAweCUwNHgsIGlzdGF0dXMgPSAiCisJCSAgICAgICAiMHglMDR4XG4iLCAKKwkJICAgICAgIG1iWzBdLCBoYS0+bWFpbGJveF9vdXRbMF0sIFJEX1JFR19XT1JEKCZyZWctPmlzdGF0dXMpKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibTAgJTA0eCwgbTEgJTA0eCwgbTIgJTA0eCwgbTMgJTA0eFxuIiwKKwkJICAgICAgIFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gwKSwgUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDEpLAorCQkgICAgICAgUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDIpLCBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MykpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtNCAlMDR4LCBtNSAlMDR4LCBtNiAlMDR4LCBtNyAlMDR4XG4iLAorCQkgICAgICAgUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDQpLCBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94NSksCisJCSAgICAgICBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94NiksIFJEX1JFR19XT1JEKCZyZWctPm1haWxib3g3KSk7CisJCXN0YXR1cyA9IDE7CisJfQorCisJLyogTG9hZCByZXR1cm4gbWFpbGJveCByZWdpc3RlcnMuICovCisJb3B0ciA9IG1iOworCWlwdHIgPSAodWludDE2X3QgKikgJmhhLT5tYWlsYm94X291dFswXTsKKwltciA9IE1BSUxCT1hfUkVHSVNURVJfQ09VTlQ7CisJbWVtY3B5KG9wdHIsIGlwdHIsIE1BSUxCT1hfUkVHSVNURVJfQ09VTlQgKiBzaXplb2YodWludDE2X3QpKTsKKworI2lmIDAKKwkvKiBHbyBjaGVjayBmb3IgYW55IHJlc3BvbnNlIGludGVycnVwdHMgcGVuZGluZy4gKi8KKwlxbGExMjgwX2lzcihoYSwgJmRvbmVfcSk7CisjZW5kaWYKKworCWlmIChoYS0+ZmxhZ3MucmVzZXRfbWFya2VyKQorCQlxbGExMjgwX3JzdF9hZW4oaGEpOworCisjaWYgMAorCWlmICghbGlzdF9lbXB0eSgmZG9uZV9xKSkKKwkJcWxhMTI4MF9kb25lKGhhLCAmZG9uZV9xKTsKKyNlbmRpZgorCisJaWYgKHN0YXR1cykKKwkJZHByaW50aygyLCAicWxhMTI4MF9tYWlsYm94X2NvbW1hbmQ6ICoqKiogRkFJTEVELCBtYWlsYm94MCA9ICIKKwkJCSIweCV4ICoqKipcbiIsIG1iWzBdKTsKKworCUxFQVZFKCJxbGExMjgwX21haWxib3hfY29tbWFuZCIpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBxbGExMjgwX3BvbGwKKyAqICAgICAgUG9sbHMgSVNQIGZvciBpbnRlcnJ1cHRzLgorICoKKyAqIElucHV0OgorICogICAgICBoYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqLworc3RhdGljIHZvaWQKK3FsYTEyODBfcG9sbChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJc3RydWN0IGRldmljZV9yZWcgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKwl1aW50MTZfdCBkYXRhOworCUxJU1RfSEVBRChkb25lX3EpOworCisJLyogRU5URVIoInFsYTEyODBfcG9sbCIpOyAqLworCisJLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KKwlkYXRhID0gUkRfUkVHX1dPUkQoJnJlZy0+aXN0YXR1cyk7CisJaWYgKGRhdGEgJiBSSVNDX0lOVCkKKwkJcWxhMTI4MF9pc3IoaGEsICZkb25lX3EpOworCisJaWYgKCFoYS0+bWFpbGJveF93YWl0KSB7CisJCWlmIChoYS0+ZmxhZ3MucmVzZXRfbWFya2VyKQorCQkJcWxhMTI4MF9yc3RfYWVuKGhhKTsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJmRvbmVfcSkpCisJCXFsYTEyODBfZG9uZShoYSk7CisKKwkvKiBMRUFWRSgicWxhMTI4MF9wb2xsIik7ICovCit9CisKKy8qCisgKiBxbGExMjgwX2J1c19yZXNldAorICogICAgICBJc3N1ZSBTQ1NJIGJ1cyByZXNldC4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICogICAgICBidXMgPSBTQ1NJIGJ1cyBudW1iZXIuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgMCA9IHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorcWxhMTI4MF9idXNfcmVzZXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBpbnQgYnVzKQoreworCXVpbnQxNl90IG1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOworCXVpbnQxNl90IHJlc2V0X2RlbGF5OworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDMsICJxbGExMjgwX2J1c19yZXNldDogZW50ZXJlZFxuIik7CisKKwlpZiAocWxhMTI4MF92ZXJib3NlKQorCQlwcmludGsoS0VSTl9JTkZPICJzY3NpKCVsaTolaSk6IFJlc2V0dGluZyBTQ1NJIEJVU1xuIiwKKwkJICAgICAgIGhhLT5ob3N0X25vLCBidXMpOworCisJcmVzZXRfZGVsYXkgPSBoYS0+YnVzX3NldHRpbmdzW2J1c10uYnVzX3Jlc2V0X2RlbGF5OworCW1iWzBdID0gTUJDX0JVU19SRVNFVDsKKwltYlsxXSA9IHJlc2V0X2RlbGF5OworCW1iWzJdID0gKHVpbnQxNl90KSBidXM7CisJc3RhdHVzID0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8yIHwgQklUXzEgfCBCSVRfMCwgJm1iWzBdKTsKKworCWlmIChzdGF0dXMpIHsKKwkJaWYgKGhhLT5idXNfc2V0dGluZ3NbYnVzXS5mYWlsZWRfcmVzZXRfY291bnQgPiAyKQorCQkJaGEtPmJ1c19zZXR0aW5nc1tidXNdLnNjc2lfYnVzX2RlYWQgPSAxOworCQloYS0+YnVzX3NldHRpbmdzW2J1c10uZmFpbGVkX3Jlc2V0X2NvdW50Kys7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxKEhPU1RfTE9DSyk7CisJCXNjaGVkdWxlX3RpbWVvdXQocmVzZXRfZGVsYXkgKiBIWik7CisJCXNwaW5fbG9ja19pcnEoSE9TVF9MT0NLKTsKKworCQloYS0+YnVzX3NldHRpbmdzW2J1c10uc2NzaV9idXNfZGVhZCA9IDA7CisJCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5mYWlsZWRfcmVzZXRfY291bnQgPSAwOworCQloYS0+YnVzX3NldHRpbmdzW2J1c10ucmVzZXRfbWFya2VyID0gMDsKKwkJLyogSXNzdWUgbWFya2VyIGNvbW1hbmQuICovCisJCXFsYTEyODBfbWFya2VyKGhhLCBidXMsIDAsIDAsIE1LX1NZTkNfQUxMKTsKKwl9CisKKwkvKgorCSAqIFdlIHNob3VsZCBwcm9iYWJseSBjYWxsIHFsYTEyODBfc2V0X3RhcmdldF9wYXJhbWV0ZXJzKCkKKwkgKiBoZXJlIGFzIHdlbGwgZm9yIGFsbCBkZXZpY2VzIG9uIHRoZSBidXMuCisJICovCisKKwlpZiAoc3RhdHVzKQorCQlkcHJpbnRrKDIsICJxbGExMjgwX2J1c19yZXNldDogKioqKiBGQUlMRUQgKioqKlxuIik7CisJZWxzZQorCQlkcHJpbnRrKDMsICJxbGExMjgwX2J1c19yZXNldDogZXhpdGluZyBub3JtYWxseVxuIik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogcWxhMTI4MF9kZXZpY2VfcmVzZXQKKyAqICAgICAgSXNzdWUgYnVzIGRldmljZSByZXNldCBtZXNzYWdlIHRvIHRoZSB0YXJnZXQuCisgKgorICogSW5wdXQ6CisgKiAgICAgIGhhICAgICAgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKiAgICAgIGJ1cyAgICAgPSBTQ1NJIEJVUyBudW1iZXIuCisgKiAgICAgIHRhcmdldCAgPSBTQ1NJIElELgorICoKKyAqIFJldHVybnM6CisgKiAgICAgIDAgPSBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK3FsYTEyODBfZGV2aWNlX3Jlc2V0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgaW50IGJ1cywgaW50IHRhcmdldCkKK3sKKwl1aW50MTZfdCBtYltNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXTsKKwlpbnQgc3RhdHVzOworCisJRU5URVIoInFsYTEyODBfZGV2aWNlX3Jlc2V0Iik7CisKKwltYlswXSA9IE1CQ19BQk9SVF9UQVJHRVQ7CisJbWJbMV0gPSAoYnVzID8gKHRhcmdldCB8IEJJVF83KSA6IHRhcmdldCkgPDwgODsKKwltYlsyXSA9IDE7CisJc3RhdHVzID0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8yIHwgQklUXzEgfCBCSVRfMCwgJm1iWzBdKTsKKworCS8qIElzc3VlIG1hcmtlciBjb21tYW5kLiAqLworCXFsYTEyODBfbWFya2VyKGhhLCBidXMsIHRhcmdldCwgMCwgTUtfU1lOQ19JRCk7CisKKwlpZiAoc3RhdHVzKQorCQlkcHJpbnRrKDIsICJxbGExMjgwX2RldmljZV9yZXNldDogKioqKiBGQUlMRUQgKioqKlxuIik7CisKKwlMRUFWRSgicWxhMTI4MF9kZXZpY2VfcmVzZXQiKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogcWxhMTI4MF9hYm9ydF9kZXZpY2UKKyAqICAgICAgSXNzdWUgYW4gYWJvcnQgbWVzc2FnZSB0byB0aGUgZGV2aWNlCisgKgorICogSW5wdXQ6CisgKiAgICAgIGhhICAgICA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqICAgICAgYnVzICAgID0gU0NTSSBCVVMuCisgKiAgICAgIHRhcmdldCA9IFNDU0kgSUQuCisgKiAgICAgIGx1biAgICA9IFNDU0kgTFVOLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgIDAgPSBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK3FsYTEyODBfYWJvcnRfZGV2aWNlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgaW50IGJ1cywgaW50IHRhcmdldCwgaW50IGx1bikKK3sKKwl1aW50MTZfdCBtYltNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXTsKKwlpbnQgc3RhdHVzOworCisJRU5URVIoInFsYTEyODBfYWJvcnRfZGV2aWNlIik7CisKKwltYlswXSA9IE1CQ19BQk9SVF9ERVZJQ0U7CisJbWJbMV0gPSAoYnVzID8gdGFyZ2V0IHwgQklUXzcgOiB0YXJnZXQpIDw8IDggfCBsdW47CisJc3RhdHVzID0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8xIHwgQklUXzAsICZtYlswXSk7CisKKwkvKiBJc3N1ZSBtYXJrZXIgY29tbWFuZC4gKi8KKwlxbGExMjgwX21hcmtlcihoYSwgYnVzLCB0YXJnZXQsIGx1biwgTUtfU1lOQ19JRF9MVU4pOworCisJaWYgKHN0YXR1cykKKwkJZHByaW50aygyLCAicWxhMTI4MF9hYm9ydF9kZXZpY2U6ICoqKiogRkFJTEVEICoqKipcbiIpOworCisJTEVBVkUoInFsYTEyODBfYWJvcnRfZGV2aWNlIik7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIHFsYTEyODBfYWJvcnRfY29tbWFuZAorICogICAgICBBYm9ydCBjb21tYW5kIGFib3J0cyBhIHNwZWNpZmllZCBJT0NCLgorICoKKyAqIElucHV0OgorICogICAgICBoYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqICAgICAgc3AgPSBTQiBzdHJ1Y3R1cmUgcG9pbnRlci4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICAwID0gc3VjY2VzcworICovCitzdGF0aWMgaW50CitxbGExMjgwX2Fib3J0X2NvbW1hbmQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBzdHJ1Y3Qgc3JiICogc3AsIGludCBoYW5kbGUpCit7CisJdWludDE2X3QgbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF07CisJdW5zaWduZWQgaW50IGJ1cywgdGFyZ2V0LCBsdW47CisJaW50IHN0YXR1czsKKworCUVOVEVSKCJxbGExMjgwX2Fib3J0X2NvbW1hbmQiKTsKKworCWJ1cyA9IFNDU0lfQlVTXzMyKHNwLT5jbWQpOworCXRhcmdldCA9IFNDU0lfVENOXzMyKHNwLT5jbWQpOworCWx1biA9IFNDU0lfTFVOXzMyKHNwLT5jbWQpOworCisJc3AtPmZsYWdzIHw9IFNSQl9BQk9SVF9QRU5ESU5HOworCisJbWJbMF0gPSBNQkNfQUJPUlRfQ09NTUFORDsKKwltYlsxXSA9IChidXMgPyB0YXJnZXQgfCBCSVRfNyA6IHRhcmdldCkgPDwgOCB8IGx1bjsKKwltYlsyXSA9IGhhbmRsZSA+PiAxNjsKKwltYlszXSA9IGhhbmRsZSAmIDB4ZmZmZjsKKwlzdGF0dXMgPSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgMHgwZiwgJm1iWzBdKTsKKworCWlmIChzdGF0dXMpIHsKKwkJZHByaW50aygyLCAicWxhMTI4MF9hYm9ydF9jb21tYW5kOiAqKioqIEZBSUxFRCAqKioqXG4iKTsKKwkJc3AtPmZsYWdzICY9IH5TUkJfQUJPUlRfUEVORElORzsKKwl9CisKKworCUxFQVZFKCJxbGExMjgwX2Fib3J0X2NvbW1hbmQiKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogcWxhMTI4MF9yZXNldF9hZGFwdGVyCisgKiAgICAgIFJlc2V0IGFkYXB0ZXIuCisgKgorICogSW5wdXQ6CisgKiAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICovCitzdGF0aWMgdm9pZAorcWxhMTI4MF9yZXNldF9hZGFwdGVyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZyBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCisJRU5URVIoInFsYTEyODBfcmVzZXRfYWRhcHRlciIpOworCisJLyogRGlzYWJsZSBJU1AgY2hpcCAqLworCWhhLT5mbGFncy5vbmxpbmUgPSAwOworCVdSVF9SRUdfV09SRCgmcmVnLT5pY3RybCwgSVNQX1JFU0VUKTsKKwlXUlRfUkVHX1dPUkQoJnJlZy0+aG9zdF9jbWQsCisJCSAgICAgSENfUkVTRVRfUklTQyB8IEhDX1JFTEVBU0VfUklTQyB8IEhDX0RJU0FCTEVfQklPUyk7CisJUkRfUkVHX1dPUkQoJnJlZy0+aWRfbCk7CS8qIEZsdXNoIFBDSSB3cml0ZSAqLworCisJTEVBVkUoInFsYTEyODBfcmVzZXRfYWRhcHRlciIpOworfQorCisvKgorICogIElzc3VlIG1hcmtlciBjb21tYW5kLgorICogICAgICBGdW5jdGlvbiBpc3N1ZXMgbWFya2VyIElPQ0IuCisgKgorICogSW5wdXQ6CisgKiAgICAgIGhhICAgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKiAgICAgIGJ1cyAgPSBTQ1NJIEJVUyBudW1iZXIKKyAqICAgICAgaWQgICA9IFNDU0kgSUQKKyAqICAgICAgbHVuICA9IFNDU0kgTFVOCisgKiAgICAgIHR5cGUgPSBtYXJrZXIgbW9kaWZpZXIKKyAqLworc3RhdGljIHZvaWQKK3FsYTEyODBfbWFya2VyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgaW50IGJ1cywgaW50IGlkLCBpbnQgbHVuLCB1OCB0eXBlKQoreworCXN0cnVjdCBtcmtfZW50cnkgKnBrdDsKKworCUVOVEVSKCJxbGExMjgwX21hcmtlciIpOworCisJLyogR2V0IHJlcXVlc3QgcGFja2V0LiAqLworCWlmICgocGt0ID0gKHN0cnVjdCBtcmtfZW50cnkgKikgcWxhMTI4MF9yZXFfcGt0KGhhKSkpIHsKKwkJcGt0LT5lbnRyeV90eXBlID0gTUFSS0VSX1RZUEU7CisJCXBrdC0+bHVuID0gKHVpbnQ4X3QpIGx1bjsKKwkJcGt0LT50YXJnZXQgPSAodWludDhfdCkgKGJ1cyA/IChpZCB8IEJJVF83KSA6IGlkKTsKKwkJcGt0LT5tb2RpZmllciA9IHR5cGU7CisJCXBrdC0+ZW50cnlfc3RhdHVzID0gMDsKKworCQkvKiBJc3N1ZSBjb21tYW5kIHRvIElTUCAqLworCQlxbGExMjgwX2lzcF9jbWQoaGEpOworCX0KKworCUxFQVZFKCJxbGExMjgwX21hcmtlciIpOworfQorCisKKy8qCisgKiBxbGExMjgwXzY0Yml0X3N0YXJ0X3Njc2kKKyAqICAgICAgVGhlIHN0YXJ0IFNDU0kgaXMgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIHJlcXVlc3QgcGFja2V0cyBvbgorICogICAgICByZXF1ZXN0IHJpbmcgYW5kIG1vZGlmeWluZyBJU1AgaW5wdXQgcG9pbnRlci4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKiAgICAgIHNwID0gU0Igc3RydWN0dXJlIHBvaW50ZXIuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgMCA9IHN1Y2Nlc3MsIHdhcyBhYmxlIHRvIGlzc3VlIGNvbW1hbmQuCisgKi8KKyNpZmRlZiBRTEFfNjRCSVRfUFRSCitzdGF0aWMgaW50CitxbGExMjgwXzY0Yml0X3N0YXJ0X3Njc2koc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBzdHJ1Y3Qgc3JiICogc3ApCit7CisJc3RydWN0IGRldmljZV9yZWcgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBzcC0+Y21kOworCWNtZF9hNjRfZW50cnlfdCAqcGt0OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBOVUxMOworCXUzMiAqZHdvcmRfcHRyOworCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgY250OworCWludCByZXFfY250OworCXUxNiBzZWdfY250OworCXU4IGRpcjsKKworCUVOVEVSKCJxbGExMjgwXzY0Yml0X3N0YXJ0X3Njc2k6Iik7CisKKwkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGVudHJpZXMgYW5kIHNlZ21lbnRzIHJlcXVpcmVkLiAqLworCXJlcV9jbnQgPSAxOworCWlmIChjbWQtPnVzZV9zZykgeworCQlzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJc2VnX2NudCA9IHBjaV9tYXBfc2coaGEtPnBkZXYsIHNnLCBjbWQtPnVzZV9zZywKKwkJCQkgICAgIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCisJCWlmIChzZWdfY250ID4gMikgeworCQkJcmVxX2NudCArPSAoc2VnX2NudCAtIDIpIC8gNTsKKwkJCWlmICgoc2VnX2NudCAtIDIpICUgNSkKKwkJCQlyZXFfY250Kys7CisJCX0KKwl9IGVsc2UgaWYgKGNtZC0+cmVxdWVzdF9idWZmbGVuKSB7CS8qIElmIGRhdGEgdHJhbnNmZXIuICovCisJCXNlZ19jbnQgPSAxOworCX0gZWxzZSB7CisJCXNlZ19jbnQgPSAwOworCX0KKworCWlmICgocmVxX2NudCArIDIpID49IGhhLT5yZXFfcV9jbnQpIHsKKwkJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBmcmVlIHJlcXVlc3QgZW50cmllcy4gKi8KKwkJY250ID0gUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDQpOworCQlpZiAoaGEtPnJlcV9yaW5nX2luZGV4IDwgY250KQorCQkJaGEtPnJlcV9xX2NudCA9IGNudCAtIGhhLT5yZXFfcmluZ19pbmRleDsKKwkJZWxzZQorCQkJaGEtPnJlcV9xX2NudCA9CisJCQkJUkVRVUVTVF9FTlRSWV9DTlQgLSAoaGEtPnJlcV9yaW5nX2luZGV4IC0gY250KTsKKwl9CisKKwkvKiBJZiByb29tIGZvciByZXF1ZXN0IGluIHJlcXVlc3QgcmluZy4gKi8KKwlpZiAoKHJlcV9jbnQgKyAyKSA+PSBoYS0+cmVxX3FfY250KSB7CisJCXN0YXR1cyA9IDE7CisJCWRwcmludGsoMiwgInFsYTEyODBfNjRiaXRfc3RhcnRfc2NzaTogaW4tcHRyPTB4JXggIHJlcV9xX2NudD0iCisJCQkiMHgleHJlcV9jbnQ9MHgleCIsIGhhLT5yZXFfcmluZ19pbmRleCwgaGEtPnJlcV9xX2NudCwKKwkJCXJlcV9jbnQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDaGVjayBmb3Igcm9vbSBpbiBvdXRzdGFuZGluZyBjb21tYW5kIGxpc3QuICovCisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMgJiYKKwkJICAgICBoYS0+b3V0c3RhbmRpbmdfY21kc1tjbnRdICE9IDA7IGNudCsrKTsKKworCWlmIChjbnQgPj0gTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKSB7CisJCXN0YXR1cyA9IDE7CisJCWRwcmludGsoMiwgInFsYTEyODBfNjRiaXRfc3RhcnRfc2NzaTogTk8gUk9PTSBJTiAiCisJCQkiT1VUU1RBTkRJTkcgQVJSQVksIHJlcV9xX2NudD0weCV4IiwgaGEtPnJlcV9xX2NudCk7CisJCWdvdG8gb3V0OworCX0KKworCWhhLT5vdXRzdGFuZGluZ19jbWRzW2NudF0gPSBzcDsKKwloYS0+cmVxX3FfY250IC09IHJlcV9jbnQ7CisJQ01EX0hBTkRMRShzcC0+Y21kKSA9ICh1bnNpZ25lZCBjaGFyICopKHVuc2lnbmVkIGxvbmcpKGNudCArIDEpOworCisJZHByaW50aygyLCAiNjRiaXRfc3RhcnQ6IGNtZD0lcCBzcD0lcCBDREI9JXhtLCBoYW5kbGUgJWx4XG4iLCBjbWQsIHNwLAorCQljbWQtPmNtbmRbMF0sIChsb25nKUNNRF9IQU5ETEUoc3AtPmNtZCkpOworCWRwcmludGsoMiwgIiAgICAgICAgICAgICBidXMgJWksIHRhcmdldCAlaSwgbHVuICVpXG4iLAorCQlTQ1NJX0JVU18zMihjbWQpLCBTQ1NJX1RDTl8zMihjbWQpLCBTQ1NJX0xVTl8zMihjbWQpKTsKKwlxbGExMjgwX2R1bXBfYnVmZmVyKDIsIGNtZC0+Y21uZCwgTUFYX0NPTU1BTkRfU0laRSk7CisKKwkvKgorCSAqIEJ1aWxkIGNvbW1hbmQgcGFja2V0LgorCSAqLworCXBrdCA9IChjbWRfYTY0X2VudHJ5X3QgKikgaGEtPnJlcXVlc3RfcmluZ19wdHI7CisKKwlwa3QtPmVudHJ5X3R5cGUgPSBDT01NQU5EX0E2NF9UWVBFOworCXBrdC0+ZW50cnlfY291bnQgPSAodWludDhfdCkgcmVxX2NudDsKKwlwa3QtPnN5c19kZWZpbmUgPSAodWludDhfdCkgaGEtPnJlcV9yaW5nX2luZGV4OworCXBrdC0+ZW50cnlfc3RhdHVzID0gMDsKKwlwa3QtPmhhbmRsZSA9IGNwdV90b19sZTMyKGNudCk7CisKKwkvKiBaZXJvIG91dCByZW1haW5pbmcgcG9ydGlvbiBvZiBwYWNrZXQuICovCisJbWVtc2V0KCgoY2hhciAqKXBrdCArIDgpLCAwLCAoUkVRVUVTVF9FTlRSWV9TSVpFIC0gOCkpOworCisJLyogU2V0IElTUCBjb21tYW5kIHRpbWVvdXQuICovCisJcGt0LT50aW1lb3V0ID0gY3B1X3RvX2xlMTYoMzApOworCisJLyogU2V0IGRldmljZSB0YXJnZXQgSUQgYW5kIExVTiAqLworCXBrdC0+bHVuID0gU0NTSV9MVU5fMzIoY21kKTsKKwlwa3QtPnRhcmdldCA9IFNDU0lfQlVTXzMyKGNtZCkgPworCQkoU0NTSV9UQ05fMzIoY21kKSB8IEJJVF83KSA6IFNDU0lfVENOXzMyKGNtZCk7CisKKwkvKiBFbmFibGUgc2ltcGxlIHRhZyBxdWV1aW5nIGlmIGRldmljZSBzdXBwb3J0cyBpdC4gKi8KKwlpZiAoREVWX1NJTVBMRV9UQUdTKGNtZC0+ZGV2aWNlKSkKKwkJcGt0LT5jb250cm9sX2ZsYWdzIHw9IGNwdV90b19sZTE2KEJJVF8zKTsKKworCS8qIExvYWQgU0NTSSBjb21tYW5kIHBhY2tldC4gKi8KKwlwa3QtPmNkYl9sZW4gPSBjcHVfdG9fbGUxNihDTURfQ0RCTEVOKGNtZCkpOworCW1lbWNweShwa3QtPnNjc2lfY2RiLCAmKENNRF9DREJQKGNtZCkpLCBDTURfQ0RCTEVOKGNtZCkpOworCS8qIGRwcmludGsoMSwgIkJ1aWxkIHBhY2tldCBmb3IgY29tbWFuZFswXT0weCV4XG4iLHBrdC0+c2NzaV9jZGJbMF0pOyAqLworCisJLyogU2V0IHRyYW5zZmVyIGRpcmVjdGlvbi4gKi8KKwlkaXIgPSBxbGExMjgwX2RhdGFfZGlyZWN0aW9uKGNtZCk7CisJcGt0LT5jb250cm9sX2ZsYWdzIHw9IGNwdV90b19sZTE2KGRpcik7CisKKwkvKiBTZXQgdG90YWwgZGF0YSBzZWdtZW50IGNvdW50LiAqLworCXBrdC0+ZHNlZ19jb3VudCA9IGNwdV90b19sZTE2KHNlZ19jbnQpOworCisJLyoKKwkgKiBMb2FkIGRhdGEgc2VnbWVudHMuCisJICovCisJaWYgKHNlZ19jbnQpIHsJLyogSWYgZGF0YSB0cmFuc2Zlci4gKi8KKwkJLyogU2V0dXAgcGFja2V0IGFkZHJlc3Mgc2VnbWVudCBwb2ludGVyLiAqLworCQlkd29yZF9wdHIgPSAodTMyICopJnBrdC0+ZHNlZ18wX2FkZHJlc3M7CisKKwkJaWYgKGNtZC0+dXNlX3NnKSB7CS8qIElmIHNjYXR0ZXIgZ2F0aGVyICovCisJCQkvKiBMb2FkIGNvbW1hbmQgZW50cnkgZGF0YSBzZWdtZW50cy4gKi8KKwkJCWZvciAoY250ID0gMDsgY250IDwgMiAmJiBzZWdfY250OyBjbnQrKywgc2VnX2NudC0tKSB7CisJCQkJZG1hX2hhbmRsZSA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKyNpZiBkZWZpbmVkKENPTkZJR19JQTY0X0dFTkVSSUMpIHx8IGRlZmluZWQoQ09ORklHX0lBNjRfU0dJX1NOMikKKwkJCQlpZiAoaGEtPmZsYWdzLnVzZV9wY2lfdmNoYW5uZWwpCisJCQkJCXNuX3BjaV9zZXRfdmNoYW4oaGEtPnBkZXYsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgKikmZG1hX2hhbmRsZSwKKwkJCQkJCQkgU0NTSV9CVVNfMzIoY21kKSk7CisjZW5kaWYKKwkJCQkqZHdvcmRfcHRyKysgPQorCQkJCQljcHVfdG9fbGUzMihwY2lfZG1hX2xvMzIoZG1hX2hhbmRsZSkpOworCQkJCSpkd29yZF9wdHIrKyA9CisJCQkJCWNwdV90b19sZTMyKHBjaV9kbWFfaGkzMihkbWFfaGFuZGxlKSk7CisJCQkJKmR3b3JkX3B0cisrID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzZykpOworCQkJCXNnKys7CisJCQkJZHByaW50aygzLCAiUy9HIFNlZ21lbnQgcGh5c19hZGRyPSV4ICV4LCBsZW49MHgleFxuIiwKKwkJCQkJY3B1X3RvX2xlMzIocGNpX2RtYV9oaTMyKGRtYV9oYW5kbGUpKSwKKwkJCQkJY3B1X3RvX2xlMzIocGNpX2RtYV9sbzMyKGRtYV9oYW5kbGUpKSwKKwkJCQkJY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzZykpKTsKKwkJCX0KKwkJCWRwcmludGsoNSwgInFsYTEyODBfNjRiaXRfc3RhcnRfc2NzaTogU2NhdHRlci9nYXRoZXIgIgorCQkJCSJjb21tYW5kIHBhY2tldCBkYXRhIC0gYiAlaSwgdCAlaSwgbCAlaSBcbiIsCisJCQkJU0NTSV9CVVNfMzIoY21kKSwgU0NTSV9UQ05fMzIoY21kKSwKKwkJCQlTQ1NJX0xVTl8zMihjbWQpKTsKKwkJCXFsYTEyODBfZHVtcF9idWZmZXIoNSwgKGNoYXIgKilwa3QsCisJCQkJCSAgICBSRVFVRVNUX0VOVFJZX1NJWkUpOworCisJCQkvKgorCQkJICogQnVpbGQgY29udGludWF0aW9uIHBhY2tldHMuCisJCQkgKi8KKwkJCWRwcmludGsoMywgIlMvRyBCdWlsZGluZyBDb250aW51YXRpb24uLi5zZWdfY250PTB4JXggIgorCQkJCSJyZW1haW5zXG4iLCBzZWdfY250KTsKKworCQkJd2hpbGUgKHNlZ19jbnQgPiAwKSB7CisJCQkJLyogQWRqdXN0IHJpbmcgaW5kZXguICovCisJCQkJaGEtPnJlcV9yaW5nX2luZGV4Kys7CisJCQkJaWYgKGhhLT5yZXFfcmluZ19pbmRleCA9PSBSRVFVRVNUX0VOVFJZX0NOVCkgeworCQkJCQloYS0+cmVxX3JpbmdfaW5kZXggPSAwOworCQkJCQloYS0+cmVxdWVzdF9yaW5nX3B0ciA9CisJCQkJCQloYS0+cmVxdWVzdF9yaW5nOworCQkJCX0gZWxzZQorCQkJCQkJaGEtPnJlcXVlc3RfcmluZ19wdHIrKzsKKworCQkJCXBrdCA9IChjbWRfYTY0X2VudHJ5X3QgKiloYS0+cmVxdWVzdF9yaW5nX3B0cjsKKworCQkJCS8qIFplcm8gb3V0IHBhY2tldC4gKi8KKwkJCQltZW1zZXQocGt0LCAwLCBSRVFVRVNUX0VOVFJZX1NJWkUpOworCisJCQkJLyogTG9hZCBwYWNrZXQgZGVmYXVsdHMuICovCisJCQkJKChzdHJ1Y3QgY29udF9hNjRfZW50cnkgKikgcGt0KS0+ZW50cnlfdHlwZSA9CisJCQkJCUNPTlRJTlVFX0E2NF9UWVBFOworCQkJCSgoc3RydWN0IGNvbnRfYTY0X2VudHJ5ICopIHBrdCktPmVudHJ5X2NvdW50ID0gMTsKKwkJCQkoKHN0cnVjdCBjb250X2E2NF9lbnRyeSAqKSBwa3QpLT5zeXNfZGVmaW5lID0KKwkJCQkJKHVpbnQ4X3QpaGEtPnJlcV9yaW5nX2luZGV4OworCQkJCS8qIFNldHVwIHBhY2tldCBhZGRyZXNzIHNlZ21lbnQgcG9pbnRlci4gKi8KKwkJCQlkd29yZF9wdHIgPQorCQkJCQkodTMyICopJigoc3RydWN0IGNvbnRfYTY0X2VudHJ5ICopIHBrdCktPmRzZWdfMF9hZGRyZXNzOworCisJCQkJLyogTG9hZCBjb250aW51YXRpb24gZW50cnkgZGF0YSBzZWdtZW50cy4gKi8KKwkJCQlmb3IgKGNudCA9IDA7IGNudCA8IDUgJiYgc2VnX2NudDsKKwkJCQkgICAgIGNudCsrLCBzZWdfY250LS0pIHsKKwkJCQkJZG1hX2hhbmRsZSA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKyNpZiBkZWZpbmVkKENPTkZJR19JQTY0X0dFTkVSSUMpIHx8IGRlZmluZWQoQ09ORklHX0lBNjRfU0dJX1NOMikKKwkJCQlpZiAoaGEtPmZsYWdzLnVzZV9wY2lfdmNoYW5uZWwpCisJCQkJCXNuX3BjaV9zZXRfdmNoYW4oaGEtPnBkZXYsIAorCQkJCQkJCSh1bnNpZ25lZCBsb25nICopJmRtYV9oYW5kbGUsCisJCQkJCQkJIFNDU0lfQlVTXzMyKGNtZCkpOworI2VuZGlmCisJCQkJCSpkd29yZF9wdHIrKyA9CisJCQkJCQljcHVfdG9fbGUzMihwY2lfZG1hX2xvMzIoZG1hX2hhbmRsZSkpOworCQkJCQkqZHdvcmRfcHRyKysgPQorCQkJCQkJY3B1X3RvX2xlMzIocGNpX2RtYV9oaTMyKGRtYV9oYW5kbGUpKTsKKwkJCQkJKmR3b3JkX3B0cisrID0KKwkJCQkJCWNwdV90b19sZTMyKHNnX2RtYV9sZW4oc2cpKTsKKwkJCQkJZHByaW50aygzLCAiUy9HIFNlZ21lbnQgQ29udC4gcGh5c19hZGRyPSV4ICV4LCBsZW49MHgleFxuIiwKKwkJCQkJCWNwdV90b19sZTMyKHBjaV9kbWFfaGkzMihkbWFfaGFuZGxlKSksCisJCQkJCQljcHVfdG9fbGUzMihwY2lfZG1hX2xvMzIoZG1hX2hhbmRsZSkpLAorCQkJCQkJY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzZykpKTsKKwkJCQkJc2crKzsKKwkJCQl9CisJCQkJZHByaW50ayg1LCAicWxhMTI4MF82NGJpdF9zdGFydF9zY3NpOiAiCisJCQkJCSJjb250aW51YXRpb24gcGFja2V0IGRhdGEgLSBiICVpLCB0ICIKKwkJCQkJIiVpLCBsICVpIFxuIiwgU0NTSV9CVVNfMzIoY21kKSwKKwkJCQkJU0NTSV9UQ05fMzIoY21kKSwgU0NTSV9MVU5fMzIoY21kKSk7CisJCQkJcWxhMTI4MF9kdW1wX2J1ZmZlcig1LCAoY2hhciAqKXBrdCwKKwkJCQkJCSAgICBSRVFVRVNUX0VOVFJZX1NJWkUpOworCQkJfQorCQl9IGVsc2UgewkvKiBObyBzY2F0dGVyIGdhdGhlciBkYXRhIHRyYW5zZmVyICovCisJCQlkbWFfaGFuZGxlID0gcGNpX21hcF9zaW5nbGUoaGEtPnBkZXYsCisJCQkJCWNtZC0+cmVxdWVzdF9idWZmZXIsCisJCQkJCWNtZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCQljbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworCQkJc3AtPnNhdmVkX2RtYV9oYW5kbGUgPSBkbWFfaGFuZGxlOworI2lmIGRlZmluZWQoQ09ORklHX0lBNjRfR0VORVJJQykgfHwgZGVmaW5lZChDT05GSUdfSUE2NF9TR0lfU04yKQorCQkJaWYgKGhhLT5mbGFncy51c2VfcGNpX3ZjaGFubmVsKQorCQkJCXNuX3BjaV9zZXRfdmNoYW4oaGEtPnBkZXYsIAorCQkJCQkJKHVuc2lnbmVkIGxvbmcgKikmZG1hX2hhbmRsZSwKKwkJCQkJCSBTQ1NJX0JVU18zMihjbWQpKTsKKyNlbmRpZgorCQkJKmR3b3JkX3B0cisrID0gY3B1X3RvX2xlMzIocGNpX2RtYV9sbzMyKGRtYV9oYW5kbGUpKTsKKwkJCSpkd29yZF9wdHIrKyA9IGNwdV90b19sZTMyKHBjaV9kbWFfaGkzMihkbWFfaGFuZGxlKSk7CisJCQkqZHdvcmRfcHRyID0gY3B1X3RvX2xlMzIoY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCisJCQlkcHJpbnRrKDUsICJxbGExMjgwXzY0Yml0X3N0YXJ0X3Njc2k6IE5vIHNjYXR0ZXIvIgorCQkJCSJnYXRoZXIgY29tbWFuZCBwYWNrZXQgZGF0YSAtIGIgJWksIHQgJWksICIKKwkJCQkibCAlaSBcbiIsIFNDU0lfQlVTXzMyKGNtZCksIFNDU0lfVENOXzMyKGNtZCksCisJCQkJU0NTSV9MVU5fMzIoY21kKSk7CisJCQlxbGExMjgwX2R1bXBfYnVmZmVyKDUsIChjaGFyICopcGt0LAorCQkJCQkgICAgUkVRVUVTVF9FTlRSWV9TSVpFKTsKKwkJfQorCX0gZWxzZSB7CS8qIE5vIGRhdGEgdHJhbnNmZXIgKi8KKwkJZHByaW50ayg1LCAicWxhMTI4MF82NGJpdF9zdGFydF9zY3NpOiBObyBkYXRhLCBjb21tYW5kICIKKwkJCSJwYWNrZXQgZGF0YSAtIGIgJWksIHQgJWksIGwgJWkgXG4iLAorCQkJU0NTSV9CVVNfMzIoY21kKSwgU0NTSV9UQ05fMzIoY21kKSwgU0NTSV9MVU5fMzIoY21kKSk7CisJCXFsYTEyODBfZHVtcF9idWZmZXIoNSwgKGNoYXIgKilwa3QsIFJFUVVFU1RfRU5UUllfU0laRSk7CisJfQorCS8qIEFkanVzdCByaW5nIGluZGV4LiAqLworCWhhLT5yZXFfcmluZ19pbmRleCsrOworCWlmIChoYS0+cmVxX3JpbmdfaW5kZXggPT0gUkVRVUVTVF9FTlRSWV9DTlQpIHsKKwkJaGEtPnJlcV9yaW5nX2luZGV4ID0gMDsKKwkJaGEtPnJlcXVlc3RfcmluZ19wdHIgPSBoYS0+cmVxdWVzdF9yaW5nOworCX0gZWxzZQorCQloYS0+cmVxdWVzdF9yaW5nX3B0cisrOworCisJLyogU2V0IGNoaXAgbmV3IHJpbmcgaW5kZXguICovCisJZHByaW50aygyLAorCQkicWxhMTI4MF82NGJpdF9zdGFydF9zY3NpOiBXYWtldXAgUklTQyBmb3IgcGVuZGluZyBjb21tYW5kXG4iKTsKKwlzcC0+ZmxhZ3MgfD0gU1JCX1NFTlQ7CisJaGEtPmFjdHRocmVhZHMrKzsKKwlXUlRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDQsIGhhLT5yZXFfcmluZ19pbmRleCk7CisJLyogRW5mb3JjZSBtbWlvIHdyaXRlIG9yZGVyaW5nOyBzZWUgY29tbWVudCBpbiBxbGExMjgwX2lzcF9jbWQoKS4gKi8KKwltbWlvd2IoKTsKKworIG91dDoKKwlpZiAoc3RhdHVzKQorCQlkcHJpbnRrKDIsICJxbGExMjgwXzY0Yml0X3N0YXJ0X3Njc2k6ICoqKiogRkFJTEVEICoqKipcbiIpOworCWVsc2UKKwkJZHByaW50aygzLCAicWxhMTI4MF82NGJpdF9zdGFydF9zY3NpOiBleGl0aW5nIG5vcm1hbGx5XG4iKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisjZWxzZSAvKiAhUUxBXzY0QklUX1BUUiAqLworCisvKgorICogcWxhMTI4MF8zMmJpdF9zdGFydF9zY3NpCisgKiAgICAgIFRoZSBzdGFydCBTQ1NJIGlzIHJlc3BvbnNpYmxlIGZvciBidWlsZGluZyByZXF1ZXN0IHBhY2tldHMgb24KKyAqICAgICAgcmVxdWVzdCByaW5nIGFuZCBtb2RpZnlpbmcgSVNQIGlucHV0IHBvaW50ZXIuCisgKgorICogICAgICBUaGUgUWxvZ2ljIGZpcm13YXJlIGludGVyZmFjZSBhbGxvd3MgZXZlcnkgcXVldWUgc2xvdCB0byBoYXZlIGEgU0NTSQorICogICAgICBjb21tYW5kIGFuZCB1cCB0byA0IHNjYXR0ZXIvZ2F0aGVyIChTRykgZW50cmllcy4gIElmIHdlIG5lZWQgbW9yZQorICogICAgICB0aGFuIDQgU0cgZW50cmllcywgdGhlbiBjb250aW51YXRpb24gZW50cmllcyBhcmUgdXNlZCB0aGF0IGNhbgorICogICAgICBob2xkIGFub3RoZXIgNyBlbnRyaWVzIGVhY2guICBUaGUgc3RhcnQgcm91dGluZSBkZXRlcm1pbmVzIGlmIHRoZXJlCisgKiAgICAgIGlzIGVvdWdodCBlbXB0eSBzbG90cyB0aGVuIGJ1aWxkIHRoZSBjb21iaW5hdGlvbiBvZiByZXF1ZXN0cyB0bworICogICAgICBmdWxmaWxsIHRoZSBPUyByZXF1ZXN0LgorICoKKyAqIElucHV0OgorICogICAgICBoYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqICAgICAgc3AgPSBTQ1NJIFJlcXVlc3QgQmxvY2sgc3RydWN0dXJlIHBvaW50ZXIuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgMCA9IHN1Y2Nlc3MsIHdhcyBhYmxlIHRvIGlzc3VlIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTEyODBfMzJiaXRfc3RhcnRfc2NzaShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHN0cnVjdCBzcmIgKiBzcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZyBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHNwLT5jbWQ7CisJc3RydWN0IGNtZF9lbnRyeSAqcGt0OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBOVUxMOworCXVpbnQzMl90ICpkd29yZF9wdHI7CisJaW50IHN0YXR1cyA9IDA7CisJaW50IGNudDsKKwlpbnQgcmVxX2NudDsKKwl1aW50MTZfdCBzZWdfY250OworCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKKwl1OCBkaXI7CisKKwlFTlRFUigicWxhMTI4MF8zMmJpdF9zdGFydF9zY3NpIik7CisKKwlkcHJpbnRrKDEsICIzMmJpdF9zdGFydDogY21kPSVwIHNwPSVwIENEQj0leFxuIiwgY21kLCBzcCwKKwkJY21kLT5jbW5kWzBdKTsKKworCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgZW50cmllcyBhbmQgc2VnbWVudHMgcmVxdWlyZWQuICovCisJcmVxX2NudCA9IDE7CisJaWYgKGNtZC0+dXNlX3NnKSB7CisJCS8qCisJCSAqIFdlIG11c3QgYnVpbGQgYW4gU0cgbGlzdCBpbiBhZGFwdGVyIGZvcm1hdCwgYXMgdGhlIGtlcm5lbCdzCisJCSAqIFNHIGxpc3QgY2Fubm90IGJlIHVzZWQgZGlyZWN0bHkgYmVjYXVzZSBvZiBkYXRhIGZpZWxkIHNpemUKKwkJICogKF9fYWxwaGFfXykgZGlmZmVyZW5jZXMgYW5kIHRoZSBrZXJuZWwgU0cgbGlzdCB1c2VzIHZpcnR1YWwKKwkJICogYWRkcmVzc2VzIHdoZXJlIHdlIG5lZWQgcGh5c2ljYWwgYWRkcmVzc2VzLgorCQkgKi8KKwkJc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIGNtZC0+cmVxdWVzdF9idWZmZXI7CisJCXNlZ19jbnQgPSBwY2lfbWFwX3NnKGhhLT5wZGV2LCBzZywgY21kLT51c2Vfc2csCisJCQkJICAgICBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworCQkvKgorCQkgKiBpZiBncmVhdGVyIHRoYW4gZm91ciBzZyBlbnRyaWVzIHRoZW4gd2UgbmVlZCB0byBhbGxvY2F0ZQorCQkgKiBjb250aW51YXRpb24gZW50cmllcworCQkgKi8KKwkJaWYgKHNlZ19jbnQgPiA0KSB7CisJCQlyZXFfY250ICs9IChzZWdfY250IC0gNCkgLyA3OworCQkJaWYgKChzZWdfY250IC0gNCkgJSA3KQorCQkJCXJlcV9jbnQrKzsKKwkJfQorCQlkcHJpbnRrKDMsICJTL0cgVHJhbnNmZXIgY21kPSVwIHNlZ19jbnQ9MHgleCwgcmVxX2NudD0leFxuIiwKKwkJCWNtZCwgc2VnX2NudCwgcmVxX2NudCk7CisJfSBlbHNlIGlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbikgewkvKiBJZiBkYXRhIHRyYW5zZmVyLiAqLworCQlkcHJpbnRrKDMsICJObyBTL0cgdHJhbnNmZXIgdD0leCBjbWQ9JXAgbGVuPSV4IENEQj0leFxuIiwKKwkJCVNDU0lfVENOXzMyKGNtZCksIGNtZCwgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQljbWQtPmNtbmRbMF0pOworCQlzZWdfY250ID0gMTsKKwl9IGVsc2UgeworCQkvKiBkcHJpbnRrKDEsICJObyBkYXRhIHRyYW5zZmVyIFxuIik7ICovCisJCXNlZ19jbnQgPSAwOworCX0KKworCWlmICgocmVxX2NudCArIDIpID49IGhhLT5yZXFfcV9jbnQpIHsKKwkJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBmcmVlIHJlcXVlc3QgZW50cmllcy4gKi8KKwkJY250ID0gUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDQpOworCQlpZiAoaGEtPnJlcV9yaW5nX2luZGV4IDwgY250KQorCQkJaGEtPnJlcV9xX2NudCA9IGNudCAtIGhhLT5yZXFfcmluZ19pbmRleDsKKwkJZWxzZQorCQkJaGEtPnJlcV9xX2NudCA9CisJCQkJUkVRVUVTVF9FTlRSWV9DTlQgLSAoaGEtPnJlcV9yaW5nX2luZGV4IC0gY250KTsKKwl9CisKKwlkcHJpbnRrKDMsICJOdW1iZXIgb2YgZnJlZSBlbnRyaWVzPSglZCkgc2VnX2NudD0weCV4XG4iLAorCQloYS0+cmVxX3FfY250LCBzZWdfY250KTsKKwkvKiBJZiByb29tIGZvciByZXF1ZXN0IGluIHJlcXVlc3QgcmluZy4gKi8KKwlpZiAoKHJlcV9jbnQgKyAyKSA+PSBoYS0+cmVxX3FfY250KSB7CisJCXN0YXR1cyA9IDE7CisJCWRwcmludGsoMiwgInFsYTEyODBfMzJiaXRfc3RhcnRfc2NzaTogaW4tcHRyPTB4JXgsICIKKwkJCSJyZXFfcV9jbnQ9MHgleCwgcmVxX2NudD0weCV4IiwgaGEtPnJlcV9yaW5nX2luZGV4LAorCQkJaGEtPnJlcV9xX2NudCwgcmVxX2NudCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIENoZWNrIGZvciBlbXB0eSBzbG90IGluIG91dHN0YW5kaW5nIGNvbW1hbmQgbGlzdC4gKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUyAmJgorCQkgICAgIChoYS0+b3V0c3RhbmRpbmdfY21kc1tjbnRdICE9IDApOyBjbnQrKykgOworCisJaWYgKGNudCA+PSBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMpIHsKKwkJc3RhdHVzID0gMTsKKwkJZHByaW50aygyLCAicWxhMTI4MF8zMmJpdF9zdGFydF9zY3NpOiBOTyBST09NIElOIE9VVFNUQU5ESU5HICIKKwkJCSJBUlJBWSwgcmVxX3FfY250PTB4JXhcbiIsIGhhLT5yZXFfcV9jbnQpOworCQlnb3RvIG91dDsKKwl9CisKKwlDTURfSEFORExFKHNwLT5jbWQpID0gKHVuc2lnbmVkIGNoYXIgKikgKHVuc2lnbmVkIGxvbmcpKGNudCArIDEpOworCWhhLT5vdXRzdGFuZGluZ19jbWRzW2NudF0gPSBzcDsKKwloYS0+cmVxX3FfY250IC09IHJlcV9jbnQ7CisKKwkvKgorCSAqIEJ1aWxkIGNvbW1hbmQgcGFja2V0LgorCSAqLworCXBrdCA9IChzdHJ1Y3QgY21kX2VudHJ5ICopIGhhLT5yZXF1ZXN0X3JpbmdfcHRyOworCisJcGt0LT5lbnRyeV90eXBlID0gQ09NTUFORF9UWVBFOworCXBrdC0+ZW50cnlfY291bnQgPSAodWludDhfdCkgcmVxX2NudDsKKwlwa3QtPnN5c19kZWZpbmUgPSAodWludDhfdCkgaGEtPnJlcV9yaW5nX2luZGV4OworCXBrdC0+ZW50cnlfc3RhdHVzID0gMDsKKwlwa3QtPmhhbmRsZSA9IGNwdV90b19sZTMyKGNudCk7CisKKwkvKiBaZXJvIG91dCByZW1haW5pbmcgcG9ydGlvbiBvZiBwYWNrZXQuICovCisJbWVtc2V0KCgoY2hhciAqKXBrdCArIDgpLCAwLCAoUkVRVUVTVF9FTlRSWV9TSVpFIC0gOCkpOworCisJLyogU2V0IElTUCBjb21tYW5kIHRpbWVvdXQuICovCisJcGt0LT50aW1lb3V0ID0gY3B1X3RvX2xlMTYoMzApOworCisJLyogU2V0IGRldmljZSB0YXJnZXQgSUQgYW5kIExVTiAqLworCXBrdC0+bHVuID0gU0NTSV9MVU5fMzIoY21kKTsKKwlwa3QtPnRhcmdldCA9IFNDU0lfQlVTXzMyKGNtZCkgPworCQkoU0NTSV9UQ05fMzIoY21kKSB8IEJJVF83KSA6IFNDU0lfVENOXzMyKGNtZCk7CisKKwkvKiBFbmFibGUgc2ltcGxlIHRhZyBxdWV1aW5nIGlmIGRldmljZSBzdXBwb3J0cyBpdC4gKi8KKwlpZiAoREVWX1NJTVBMRV9UQUdTKGNtZC0+ZGV2aWNlKSkKKwkJcGt0LT5jb250cm9sX2ZsYWdzIHw9IGNwdV90b19sZTE2KEJJVF8zKTsKKworCS8qIExvYWQgU0NTSSBjb21tYW5kIHBhY2tldC4gKi8KKwlwa3QtPmNkYl9sZW4gPSBjcHVfdG9fbGUxNihDTURfQ0RCTEVOKGNtZCkpOworCW1lbWNweShwa3QtPnNjc2lfY2RiLCAmKENNRF9DREJQKGNtZCkpLCBDTURfQ0RCTEVOKGNtZCkpOworCisJLypkcHJpbnRrKDEsICJCdWlsZCBwYWNrZXQgZm9yIGNvbW1hbmRbMF09MHgleFxuIixwa3QtPnNjc2lfY2RiWzBdKTsgKi8KKwkvKiBTZXQgdHJhbnNmZXIgZGlyZWN0aW9uLiAqLworCWRpciA9IHFsYTEyODBfZGF0YV9kaXJlY3Rpb24oY21kKTsKKwlwa3QtPmNvbnRyb2xfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoZGlyKTsKKworCS8qIFNldCB0b3RhbCBkYXRhIHNlZ21lbnQgY291bnQuICovCisJcGt0LT5kc2VnX2NvdW50ID0gY3B1X3RvX2xlMTYoc2VnX2NudCk7CisKKwkvKgorCSAqIExvYWQgZGF0YSBzZWdtZW50cy4KKwkgKi8KKwlpZiAoc2VnX2NudCkgeworCQkvKiBTZXR1cCBwYWNrZXQgYWRkcmVzcyBzZWdtZW50IHBvaW50ZXIuICovCisJCWR3b3JkX3B0ciA9ICZwa3QtPmRzZWdfMF9hZGRyZXNzOworCisJCWlmIChjbWQtPnVzZV9zZykgewkvKiBJZiBzY2F0dGVyIGdhdGhlciAqLworCQkJZHByaW50aygzLCAiQnVpbGRpbmcgUy9HIGRhdGEgc2VnbWVudHMuLlxuIik7CisJCQlxbGExMjgwX2R1bXBfYnVmZmVyKDEsIChjaGFyICopc2csIDQgKiAxNik7CisKKwkJCS8qIExvYWQgY29tbWFuZCBlbnRyeSBkYXRhIHNlZ21lbnRzLiAqLworCQkJZm9yIChjbnQgPSAwOyBjbnQgPCA0ICYmIHNlZ19jbnQ7IGNudCsrLCBzZWdfY250LS0pIHsKKwkJCQkqZHdvcmRfcHRyKysgPQorCQkJCQljcHVfdG9fbGUzMihwY2lfZG1hX2xvMzIoc2dfZG1hX2FkZHJlc3Moc2cpKSk7CisJCQkJKmR3b3JkX3B0cisrID0KKwkJCQkJY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzZykpOworCQkJCWRwcmludGsoMywgIlMvRyBTZWdtZW50IHBoeXNfYWRkcj0weCVseCwgbGVuPTB4JXhcbiIsCisJCQkJCShwY2lfZG1hX2xvMzIoc2dfZG1hX2FkZHJlc3Moc2cpKSksCisJCQkJCShzZ19kbWFfbGVuKHNnKSkpOworCQkJCXNnKys7CisJCQl9CisJCQkvKgorCQkJICogQnVpbGQgY29udGludWF0aW9uIHBhY2tldHMuCisJCQkgKi8KKwkJCWRwcmludGsoMywgIlMvRyBCdWlsZGluZyBDb250aW51YXRpb24iCisJCQkJIi4uLnNlZ19jbnQ9MHgleCByZW1haW5zXG4iLCBzZWdfY250KTsKKwkJCXdoaWxlIChzZWdfY250ID4gMCkgeworCQkJCS8qIEFkanVzdCByaW5nIGluZGV4LiAqLworCQkJCWhhLT5yZXFfcmluZ19pbmRleCsrOworCQkJCWlmIChoYS0+cmVxX3JpbmdfaW5kZXggPT0gUkVRVUVTVF9FTlRSWV9DTlQpIHsKKwkJCQkJaGEtPnJlcV9yaW5nX2luZGV4ID0gMDsKKwkJCQkJaGEtPnJlcXVlc3RfcmluZ19wdHIgPQorCQkJCQkJaGEtPnJlcXVlc3RfcmluZzsKKwkJCQl9IGVsc2UKKwkJCQkJaGEtPnJlcXVlc3RfcmluZ19wdHIrKzsKKworCQkJCXBrdCA9IChzdHJ1Y3QgY21kX2VudHJ5ICopaGEtPnJlcXVlc3RfcmluZ19wdHI7CisKKwkJCQkvKiBaZXJvIG91dCBwYWNrZXQuICovCisJCQkJbWVtc2V0KHBrdCwgMCwgUkVRVUVTVF9FTlRSWV9TSVpFKTsKKworCQkJCS8qIExvYWQgcGFja2V0IGRlZmF1bHRzLiAqLworCQkJCSgoc3RydWN0IGNvbnRfZW50cnkgKikgcGt0KS0+CisJCQkJCWVudHJ5X3R5cGUgPSBDT05USU5VRV9UWVBFOworCQkJCSgoc3RydWN0IGNvbnRfZW50cnkgKikgcGt0KS0+ZW50cnlfY291bnQgPSAxOworCisJCQkJKChzdHJ1Y3QgY29udF9lbnRyeSAqKSBwa3QpLT5zeXNfZGVmaW5lID0KKwkJCQkJKHVpbnQ4X3QpIGhhLT5yZXFfcmluZ19pbmRleDsKKworCQkJCS8qIFNldHVwIHBhY2tldCBhZGRyZXNzIHNlZ21lbnQgcG9pbnRlci4gKi8KKwkJCQlkd29yZF9wdHIgPQorCQkJCQkmKChzdHJ1Y3QgY29udF9lbnRyeSAqKSBwa3QpLT5kc2VnXzBfYWRkcmVzczsKKworCQkJCS8qIExvYWQgY29udGludWF0aW9uIGVudHJ5IGRhdGEgc2VnbWVudHMuICovCisJCQkJZm9yIChjbnQgPSAwOyBjbnQgPCA3ICYmIHNlZ19jbnQ7CisJCQkJICAgICBjbnQrKywgc2VnX2NudC0tKSB7CisJCQkJCSpkd29yZF9wdHIrKyA9CisJCQkJCQljcHVfdG9fbGUzMihwY2lfZG1hX2xvMzIoc2dfZG1hX2FkZHJlc3Moc2cpKSk7CisJCQkJCSpkd29yZF9wdHIrKyA9CisJCQkJCQljcHVfdG9fbGUzMihzZ19kbWFfbGVuKHNnKSk7CisJCQkJCWRwcmludGsoMSwKKwkJCQkJCSJTL0cgU2VnbWVudCBDb250LiBwaHlzX2FkZHI9MHgleCwgIgorCQkJCQkJImxlbj0weCV4XG4iLAorCQkJCQkJY3B1X3RvX2xlMzIocGNpX2RtYV9sbzMyKHNnX2RtYV9hZGRyZXNzKHNnKSkpLAorCQkJCQkJY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzZykpKTsKKwkJCQkJc2crKzsKKwkJCQl9CisJCQkJZHByaW50ayg1LCAicWxhMTI4MF8zMmJpdF9zdGFydF9zY3NpOiAiCisJCQkJCSJjb250aW51YXRpb24gcGFja2V0IGRhdGEgLSAiCisJCQkJCSJzY3NpKCVpOiVpOiVpKVxuIiwgU0NTSV9CVVNfMzIoY21kKSwKKwkJCQkJU0NTSV9UQ05fMzIoY21kKSwgU0NTSV9MVU5fMzIoY21kKSk7CisJCQkJcWxhMTI4MF9kdW1wX2J1ZmZlcig1LCAoY2hhciAqKXBrdCwKKwkJCQkJCSAgICBSRVFVRVNUX0VOVFJZX1NJWkUpOworCQkJfQorCQl9IGVsc2UgewkvKiBObyBTL0cgZGF0YSB0cmFuc2ZlciAqLworCQkJZG1hX2hhbmRsZSA9IHBjaV9tYXBfc2luZ2xlKGhhLT5wZGV2LAorCQkJCQljbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCQljbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkJY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCQlzcC0+c2F2ZWRfZG1hX2hhbmRsZSA9IGRtYV9oYW5kbGU7CisKKwkJCSpkd29yZF9wdHIrKyA9IGNwdV90b19sZTMyKHBjaV9kbWFfbG8zMihkbWFfaGFuZGxlKSk7CisJCQkqZHdvcmRfcHRyID0gY3B1X3RvX2xlMzIoY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCQl9CisJfSBlbHNlIHsJLyogTm8gZGF0YSB0cmFuc2ZlciBhdCBhbGwgKi8KKwkJZHByaW50ayg1LCAicWxhMTI4MF8zMmJpdF9zdGFydF9zY3NpOiBObyBkYXRhLCBjb21tYW5kICIKKwkJCSJwYWNrZXQgZGF0YSAtIFxuIik7CisJCXFsYTEyODBfZHVtcF9idWZmZXIoNSwgKGNoYXIgKilwa3QsIFJFUVVFU1RfRU5UUllfU0laRSk7CisJfQorCWRwcmludGsoNSwgInFsYTEyODBfMzJiaXRfc3RhcnRfc2NzaTogRmlyc3QgSU9DQiBibG9jazpcbiIpOworCXFsYTEyODBfZHVtcF9idWZmZXIoNSwgKGNoYXIgKiloYS0+cmVxdWVzdF9yaW5nX3B0ciwKKwkJCSAgICBSRVFVRVNUX0VOVFJZX1NJWkUpOworCisJLyogQWRqdXN0IHJpbmcgaW5kZXguICovCisJaGEtPnJlcV9yaW5nX2luZGV4Kys7CisJaWYgKGhhLT5yZXFfcmluZ19pbmRleCA9PSBSRVFVRVNUX0VOVFJZX0NOVCkgeworCQloYS0+cmVxX3JpbmdfaW5kZXggPSAwOworCQloYS0+cmVxdWVzdF9yaW5nX3B0ciA9IGhhLT5yZXF1ZXN0X3Jpbmc7CisJfSBlbHNlCisJCWhhLT5yZXF1ZXN0X3JpbmdfcHRyKys7CisKKwkvKiBTZXQgY2hpcCBuZXcgcmluZyBpbmRleC4gKi8KKwlkcHJpbnRrKDIsICJxbGExMjgwXzMyYml0X3N0YXJ0X3Njc2k6IFdha2V1cCBSSVNDICIKKwkJImZvciBwZW5kaW5nIGNvbW1hbmRcbiIpOworCXNwLT5mbGFncyB8PSBTUkJfU0VOVDsKKwloYS0+YWN0dGhyZWFkcysrOworCVdSVF9SRUdfV09SRCgmcmVnLT5tYWlsYm94NCwgaGEtPnJlcV9yaW5nX2luZGV4KTsKKwkvKiBFbmZvcmNlIG1taW8gd3JpdGUgb3JkZXJpbmc7IHNlZSBjb21tZW50IGluIHFsYTEyODBfaXNwX2NtZCgpLiAqLworCW1taW93YigpOworCitvdXQ6CisJaWYgKHN0YXR1cykKKwkJZHByaW50aygyLCAicWxhMTI4MF8zMmJpdF9zdGFydF9zY3NpOiAqKioqIEZBSUxFRCAqKioqXG4iKTsKKworCUxFQVZFKCJxbGExMjgwXzMyYml0X3N0YXJ0X3Njc2kiKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKworLyoKKyAqIHFsYTEyODBfcmVxX3BrdAorICogICAgICBGdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgbG9ja2luZyByaW5nIGFuZAorICogICAgICBnZXR0aW5nIGEgemVyb2VkIG91dCByZXF1ZXN0IHBhY2tldC4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgIDAgPSBmYWlsZWQgdG8gZ2V0IHNsb3QuCisgKi8KK3N0YXRpYyByZXF1ZXN0X3QgKgorcWxhMTI4MF9yZXFfcGt0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZyBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCXJlcXVlc3RfdCAqcGt0ID0gTlVMTDsKKwlpbnQgY250OworCXVpbnQzMl90IHRpbWVyOworCisJRU5URVIoInFsYTEyODBfcmVxX3BrdCIpOworCisJLyoKKwkgKiBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCwgZGFtbiBpdCEhIQorCSAqLworCS8qIFdhaXQgZm9yIDMwIHNlY29uZHMgZm9yIHNsb3QuICovCisJZm9yICh0aW1lciA9IDE1MDAwMDAwOyB0aW1lcjsgdGltZXItLSkgeworCQlpZiAoaGEtPnJlcV9xX2NudCA+IDApIHsKKwkJCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgZnJlZSByZXF1ZXN0IGVudHJpZXMuICovCisJCQljbnQgPSBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94NCk7CisJCQlpZiAoaGEtPnJlcV9yaW5nX2luZGV4IDwgY250KQorCQkJCWhhLT5yZXFfcV9jbnQgPSBjbnQgLSBoYS0+cmVxX3JpbmdfaW5kZXg7CisJCQllbHNlCisJCQkJaGEtPnJlcV9xX2NudCA9CisJCQkJCVJFUVVFU1RfRU5UUllfQ05UIC0gKGhhLT5yZXFfcmluZ19pbmRleCAtIGNudCk7CisJCX0KKworCQkvKiBGb3VuZCBlbXB0eSByZXF1ZXN0IHJpbmcgc2xvdD8gKi8KKwkJaWYgKGhhLT5yZXFfcV9jbnQgPiAwKSB7CisJCQloYS0+cmVxX3FfY250LS07CisJCQlwa3QgPSBoYS0+cmVxdWVzdF9yaW5nX3B0cjsKKworCQkJLyogWmVybyBvdXQgcGFja2V0LiAqLworCQkJbWVtc2V0KHBrdCwgMCwgUkVRVUVTVF9FTlRSWV9TSVpFKTsKKworCQkJLyoKKwkJCSAqIEhvdyBjYW4gdGhpcyBiZSByaWdodCB3aGVuIHdlIGhhdmUgYSByaW5nCisJCQkgKiBzaXplIG9mIDUxMj8/PworCQkJICovCisJCQkvKiBTZXQgc3lzdGVtIGRlZmluZWQgZmllbGQuICovCisJCQlwa3QtPnN5c19kZWZpbmUgPSAodWludDhfdCkgaGEtPnJlcV9yaW5nX2luZGV4OworCisJCQkvKiBTZXQgZW50cnkgY291bnQuICovCisJCQlwa3QtPmVudHJ5X2NvdW50ID0gMTsKKworCQkJYnJlYWs7CisJCX0KKworCQl1ZGVsYXkoMik7CS8qIDEwICovCisKKwkJLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KKwkJcWxhMTI4MF9wb2xsKGhhKTsKKwl9CisKKwlpZiAoIXBrdCkKKwkJZHByaW50aygyLCAicWxhMTI4MF9yZXFfcGt0OiAqKioqIEZBSUxFRCAqKioqXG4iKTsKKwllbHNlCisJCWRwcmludGsoMywgInFsYTEyODBfcmVxX3BrdDogZXhpdGluZyBub3JtYWxseVxuIik7CisKKwlyZXR1cm4gcGt0OworfQorCisvKgorICogcWxhMTI4MF9pc3BfY21kCisgKiAgICAgIEZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBtb2RpZnlpbmcgSVNQIGlucHV0IHBvaW50ZXIuCisgKiAgICAgIFJlbGVhc2VzIHJpbmcgbG9jay4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICovCitzdGF0aWMgdm9pZAorcWxhMTI4MF9pc3BfY21kKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZyBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCisJRU5URVIoInFsYTEyODBfaXNwX2NtZCIpOworCisJZHByaW50ayg1LCAicWxhMTI4MF9pc3BfY21kOiBJT0NCIGRhdGE6XG4iKTsKKwlxbGExMjgwX2R1bXBfYnVmZmVyKDUsIChjaGFyICopaGEtPnJlcXVlc3RfcmluZ19wdHIsCisJCQkgICAgUkVRVUVTVF9FTlRSWV9TSVpFKTsKKworCS8qIEFkanVzdCByaW5nIGluZGV4LiAqLworCWhhLT5yZXFfcmluZ19pbmRleCsrOworCWlmIChoYS0+cmVxX3JpbmdfaW5kZXggPT0gUkVRVUVTVF9FTlRSWV9DTlQpIHsKKwkJaGEtPnJlcV9yaW5nX2luZGV4ID0gMDsKKwkJaGEtPnJlcXVlc3RfcmluZ19wdHIgPSBoYS0+cmVxdWVzdF9yaW5nOworCX0gZWxzZQorCQloYS0+cmVxdWVzdF9yaW5nX3B0cisrOworCisJLyoKKwkgKiBVcGRhdGUgcmVxdWVzdCBpbmRleCB0byBtYWlsYm94NCAoUmVxdWVzdCBRdWV1ZSBJbikuCisJICogVGhlIG1taW93YigpIGVuc3VyZXMgdGhhdCB0aGlzIHdyaXRlIGlzIG9yZGVyZWQgd2l0aCB3cml0ZXMgYnkgb3RoZXIKKwkgKiBDUFVzLiAgV2l0aG91dCB0aGUgbW1pb3diKCksIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgZm9sbG93aW5nOgorCSAqICAgIENQVUEgcG9zdHMgd3JpdGUgb2YgaW5kZXggNSB0byBtYWlsYm94NAorCSAqICAgIENQVUEgcmVsZWFzZXMgaG9zdCBsb2NrCisJICogICAgQ1BVQiBhY3F1aXJlcyBob3N0IGxvY2sKKwkgKiAgICBDUFVCIHBvc3RzIHdyaXRlIG9mIGluZGV4IDYgdG8gbWFpbGJveDQKKwkgKiAgICBPbiBQQ0kgYnVzLCBvcmRlciByZXZlcnNlcyBhbmQgd3JpdGUgb2YgNiBwb3N0cywgdGhlbiBpbmRleCA1LAorCSAqICAgICAgIGNhdXNpbmcgY2hpcCB0byBpc3N1ZSBmdWxsIHF1ZXVlIG9mIHN0YWxlIGNvbW1hbmRzCisJICogVGhlIG1taW93YigpIHByZXZlbnRzIGZ1dHVyZSB3cml0ZXMgZnJvbSBjcm9zc2luZyB0aGUgYmFycmllci4KKwkgKiBTZWUgRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2RldmljZWlvYm9vay50bXBsIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCSAqLworCVdSVF9SRUdfV09SRCgmcmVnLT5tYWlsYm94NCwgaGEtPnJlcV9yaW5nX2luZGV4KTsKKwltbWlvd2IoKTsKKworCUxFQVZFKCJxbGExMjgwX2lzcF9jbWQiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIHFsYTEyODBfaXNyCisgKiAgICAgIENhbGxzIEkvTyBkb25lIG9uIGNvbW1hbmQgY29tcGxldGlvbi4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgICAgICAgICAgID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICogICAgICBkb25lX3EgICAgICAgPSBkb25lIHF1ZXVlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorcWxhMTI4MF9pc3Ioc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBzdHJ1Y3QgbGlzdF9oZWFkICpkb25lX3EpCit7CisJc3RydWN0IGRldmljZV9yZWcgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKwlzdHJ1Y3QgcmVzcG9uc2UgKnBrdDsKKwlzdHJ1Y3Qgc3JiICpzcCA9IE5VTEw7CisJdWludDE2X3QgbWFpbGJveFtNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXTsKKwl1aW50MTZfdCAqd3B0cjsKKwl1aW50MzJfdCBpbmRleDsKKwl1MTYgaXN0YXR1czsKKworCUVOVEVSKCJxbGExMjgwX2lzciIpOworCisJaXN0YXR1cyA9IFJEX1JFR19XT1JEKCZyZWctPmlzdGF0dXMpOworCWlmICghKGlzdGF0dXMgJiAoUklTQ19JTlQgfCBQQ0lfSU5UKSkpCisJCXJldHVybjsKKworCS8qIFNhdmUgbWFpbGJveCByZWdpc3RlciA1ICovCisJbWFpbGJveFs1XSA9IFJEX1JFR19XT1JEKCZyZWctPm1haWxib3g1KTsKKworCS8qIENoZWNrIGZvciBtYWlsYm94IGludGVycnVwdC4gKi8KKworCW1haWxib3hbMF0gPSBSRF9SRUdfV09SRF9kbWFzeW5jKCZyZWctPnNlbWFwaG9yZSk7CisKKwlpZiAobWFpbGJveFswXSAmIEJJVF8wKSB7CisJCS8qIEdldCBtYWlsYm94IGRhdGEuICovCisJCS8qIGRwcmludGsoMSwgInFsYTEyODBfaXNyOiBJbiBHZXQgbWFpbGJveCBkYXRhIFxuIik7ICovCisKKwkJd3B0ciA9ICZtYWlsYm94WzBdOworCQkqd3B0cisrID0gUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDApOworCQkqd3B0cisrID0gUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDEpOworCQkqd3B0ciA9IFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gyKTsKKwkJaWYgKG1haWxib3hbMF0gIT0gTUJBX1NDU0lfQ09NUExFVElPTikgeworCQkJd3B0cisrOworCQkJKndwdHIrKyA9IFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gzKTsKKwkJCSp3cHRyKysgPSBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94NCk7CisJCQl3cHRyKys7CisJCQkqd3B0cisrID0gUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDYpOworCQkJKndwdHIgPSBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94Nyk7CisJCX0KKworCQkvKiBSZWxlYXNlIG1haWxib3ggcmVnaXN0ZXJzLiAqLworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5zZW1hcGhvcmUsIDApOworCQlXUlRfUkVHX1dPUkQoJnJlZy0+aG9zdF9jbWQsIEhDX0NMUl9SSVNDX0lOVCk7CisKKwkJZHByaW50ayg1LCAicWxhMTI4MF9pc3I6IG1haWxib3ggaW50ZXJydXB0IG1haWxib3hbMF0gPSAweCV4IiwKKwkJCW1haWxib3hbMF0pOworCisJCS8qIEhhbmRsZSBhc3luY2hyb25vdXMgZXZlbnQgKi8KKwkJc3dpdGNoIChtYWlsYm94WzBdKSB7CisJCWNhc2UgTUJBX1NDU0lfQ09NUExFVElPTjoJLyogUmVzcG9uc2UgY29tcGxldGlvbiAqLworCQkJZHByaW50ayg1LCAicWxhMTI4MF9pc3I6IG1haWxib3ggU0NTSSByZXNwb25zZSAiCisJCQkJImNvbXBsZXRpb25cbiIpOworCisJCQlpZiAoaGEtPmZsYWdzLm9ubGluZSkgeworCQkJCS8qIEdldCBvdXRzdGFuZGluZyBjb21tYW5kIGluZGV4LiAqLworCQkJCWluZGV4ID0gbWFpbGJveFsyXSA8PCAxNiB8IG1haWxib3hbMV07CisKKwkJCQkvKiBWYWxpZGF0ZSBoYW5kbGUuICovCisJCQkJaWYgKGluZGV4IDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKQorCQkJCQlzcCA9IGhhLT5vdXRzdGFuZGluZ19jbWRzW2luZGV4XTsKKwkJCQllbHNlCisJCQkJCXNwID0gTlVMTDsKKworCQkJCWlmIChzcCkgeworCQkJCQkvKiBGcmVlIG91dHN0YW5kaW5nIGNvbW1hbmQgc2xvdC4gKi8KKwkJCQkJaGEtPm91dHN0YW5kaW5nX2NtZHNbaW5kZXhdID0gTlVMTDsKKworCQkJCQkvKiBTYXZlIElTUCBjb21wbGV0aW9uIHN0YXR1cyAqLworCQkJCQlDTURfUkVTVUxUKHNwLT5jbWQpID0gMDsKKworCQkJCQkvKiBQbGFjZSBibG9jayBvbiBkb25lIHF1ZXVlICovCisJCQkJCWxpc3RfYWRkX3RhaWwoJnNwLT5saXN0LCBkb25lX3EpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qCisJCQkJCSAqIElmIHdlIGdldCBoZXJlIHdlIGhhdmUgYSByZWFsIHByb2JsZW0hCisJCQkJCSAqLworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSAgICAgICAicWxhMTI4MDogSVNQIGludmFsaWQgaGFuZGxlIik7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNQkFfQlVTX1JFU0VUOgkvKiBTQ1NJIEJ1cyBSZXNldCAqLworCQkJaGEtPmZsYWdzLnJlc2V0X21hcmtlciA9IDE7CisJCQlpbmRleCA9IG1haWxib3hbNl0gJiBCSVRfMDsKKwkJCWhhLT5idXNfc2V0dGluZ3NbaW5kZXhdLnJlc2V0X21hcmtlciA9IDE7CisKKwkJCXByaW50ayhLRVJOX0RFQlVHICJxbGExMjgwX2lzcigpOiBpbmRleCAlaSAiCisJCQkgICAgICAgImFzeW5jaHJvbm91cyBCVVNfUkVTRVRcbiIsIGluZGV4KTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUJBX1NZU1RFTV9FUlI6CS8qIFN5c3RlbSBFcnJvciAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJxbGExMjgwOiBJU1AgU3lzdGVtIEVycm9yIC0gbWJ4MT0leGgsIG1ieDI9IgorCQkJICAgICAgICIleGgsIG1ieDM9JXhoXG4iLCBtYWlsYm94WzFdLCBtYWlsYm94WzJdLAorCQkJICAgICAgIG1haWxib3hbM10pOworCQkJYnJlYWs7CisKKwkJY2FzZSBNQkFfUkVRX1RSQU5TRkVSX0VSUjoJLyogUmVxdWVzdCBUcmFuc2ZlciBFcnJvciAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJxbGExMjgwOiBJU1AgUmVxdWVzdCBUcmFuc2ZlciBFcnJvclxuIik7CisJCQlicmVhazsKKworCQljYXNlIE1CQV9SU1BfVFJBTlNGRVJfRVJSOgkvKiBSZXNwb25zZSBUcmFuc2ZlciBFcnJvciAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJxbGExMjgwOiBJU1AgUmVzcG9uc2UgVHJhbnNmZXIgRXJyb3JcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNQkFfV0FLRVVQX1RIUkVTOgkvKiBSZXF1ZXN0IFF1ZXVlIFdha2UtdXAgKi8KKwkJCWRwcmludGsoMiwgInFsYTEyODBfaXNyOiBhc3luY2hyb25vdXMgV0FLRVVQX1RIUkVTXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUJBX1RJTUVPVVRfUkVTRVQ6CS8qIEV4ZWN1dGlvbiBUaW1lb3V0IFJlc2V0ICovCisJCQlkcHJpbnRrKDIsCisJCQkJInFsYTEyODBfaXNyOiBhc3luY2hyb25vdXMgVElNRU9VVF9SRVNFVFxuIik7CisJCQlicmVhazsKKworCQljYXNlIE1CQV9ERVZJQ0VfUkVTRVQ6CS8qIEJ1cyBEZXZpY2UgUmVzZXQgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gInFsYTEyODBfaXNyKCk6IGFzeW5jaHJvbm91cyAiCisJCQkgICAgICAgIkJVU19ERVZJQ0VfUkVTRVRcbiIpOworCisJCQloYS0+ZmxhZ3MucmVzZXRfbWFya2VyID0gMTsKKwkJCWluZGV4ID0gbWFpbGJveFs2XSAmIEJJVF8wOworCQkJaGEtPmJ1c19zZXR0aW5nc1tpbmRleF0ucmVzZXRfbWFya2VyID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUJBX0JVU19NT0RFX0NIQU5HRToKKwkJCWRwcmludGsoMiwKKwkJCQkicWxhMTI4MF9pc3I6IGFzeW5jaHJvbm91cyBCVVNfTU9ERV9DSEFOR0VcbiIpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qIGRwcmludGsoMSwgInFsYTEyODBfaXNyOiBkZWZhdWx0IGNhc2Ugb2Ygc3dpdGNoIE1CIFxuIik7ICovCisJCQlpZiAobWFpbGJveFswXSA8IE1CQV9BU1lOQ19FVkVOVCkgeworCQkJCXdwdHIgPSAmbWFpbGJveFswXTsKKwkJCQltZW1jcHkoKHVpbnQxNl90ICopIGhhLT5tYWlsYm94X291dCwgd3B0ciwKKwkJCQkgICAgICAgTUFJTEJPWF9SRUdJU1RFUl9DT1VOVCAqCisJCQkJICAgICAgIHNpemVvZih1aW50MTZfdCkpOworCisJCQkJaWYoaGEtPm1haWxib3hfd2FpdCAhPSBOVUxMKQorCQkJCQljb21wbGV0ZShoYS0+bWFpbGJveF93YWl0KTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJV1JUX1JFR19XT1JEKCZyZWctPmhvc3RfY21kLCBIQ19DTFJfUklTQ19JTlQpOworCX0KKworCS8qCisJICogV2Ugd2lsbCByZWNlaXZlIGludGVycnVwdHMgZHVyaW5nIG1haWxib3ggdGVzdGluZyBwcmlvciB0bworCSAqIHRoZSBjYXJkIGJlaW5nIG1hcmtlZCBvbmxpbmUsIGhlbmNlIHRoZSBkb3VibGUgY2hlY2suCisJICovCisJaWYgKCEoaGEtPmZsYWdzLm9ubGluZSAmJiAhaGEtPm1haWxib3hfd2FpdCkpIHsKKwkJZHByaW50aygyLCAicWxhMTI4MF9pc3I6IFJlc3BvbnNlIHBvaW50ZXIgRXJyb3JcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobWFpbGJveFs1XSA+PSBSRVNQT05TRV9FTlRSWV9DTlQpCisJCWdvdG8gb3V0OworCisJd2hpbGUgKGhhLT5yc3BfcmluZ19pbmRleCAhPSBtYWlsYm94WzVdKSB7CisJCXBrdCA9IGhhLT5yZXNwb25zZV9yaW5nX3B0cjsKKworCQlkcHJpbnRrKDUsICJxbGExMjgwX2lzcjogaGEtPnJzcF9yaW5nX2luZGV4ID0gMHgleCwgbWFpbGJveFs1XSIKKwkJCSIgPSAweCV4XG4iLCBoYS0+cnNwX3JpbmdfaW5kZXgsIG1haWxib3hbNV0pOworCQlkcHJpbnRrKDUsInFsYTEyODBfaXNyOiByZXNwb25zZSBwYWNrZXQgZGF0YVxuIik7CisJCXFsYTEyODBfZHVtcF9idWZmZXIoNSwgKGNoYXIgKilwa3QsIFJFU1BPTlNFX0VOVFJZX1NJWkUpOworCisJCWlmIChwa3QtPmVudHJ5X3R5cGUgPT0gU1RBVFVTX1RZUEUpIHsKKwkJCWlmICgobGUxNl90b19jcHUocGt0LT5zY3NpX3N0YXR1cykgJiAweGZmKQorCQkJICAgIHx8IHBrdC0+Y29tcF9zdGF0dXMgfHwgcGt0LT5lbnRyeV9zdGF0dXMpIHsKKwkJCQlkcHJpbnRrKDIsICJxbGExMjgwX2lzcjogaGEtPnJzcF9yaW5nX2luZGV4ID0gIgorCQkJCQkiMHgleCBtYWlsYm94WzVdID0gMHgleCwgY29tcF9zdGF0dXMgIgorCQkJCQkiPSAweCV4LCBzY3NpX3N0YXR1cyA9IDB4JXhcbiIsCisJCQkJCWhhLT5yc3BfcmluZ19pbmRleCwgbWFpbGJveFs1XSwKKwkJCQkJbGUxNl90b19jcHUocGt0LT5jb21wX3N0YXR1cyksCisJCQkJCWxlMTZfdG9fY3B1KHBrdC0+c2NzaV9zdGF0dXMpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRwcmludGsoMiwgInFsYTEyODBfaXNyOiBoYS0+cnNwX3JpbmdfaW5kZXggPSAiCisJCQkJIjB4JXgsIG1haWxib3hbNV0gPSAweCV4XG4iLAorCQkJCWhhLT5yc3BfcmluZ19pbmRleCwgbWFpbGJveFs1XSk7CisJCQlkcHJpbnRrKDIsICJxbGExMjgwX2lzcjogcmVzcG9uc2UgcGFja2V0IGRhdGFcbiIpOworCQkJcWxhMTI4MF9kdW1wX2J1ZmZlcigyLCAoY2hhciAqKXBrdCwKKwkJCQkJICAgIFJFU1BPTlNFX0VOVFJZX1NJWkUpOworCQl9CisKKwkJaWYgKHBrdC0+ZW50cnlfdHlwZSA9PSBTVEFUVVNfVFlQRSB8fCBwa3QtPmVudHJ5X3N0YXR1cykgeworCQkJZHByaW50aygyLCAic3RhdHVzOiBDbWQgJXAsIGhhbmRsZSAlaVxuIiwKKwkJCQloYS0+b3V0c3RhbmRpbmdfY21kc1twa3QtPmhhbmRsZV0tPmNtZCwKKwkJCQlwa3QtPmhhbmRsZSk7CisJCQlpZiAocGt0LT5lbnRyeV90eXBlID09IFNUQVRVU19UWVBFKQorCQkJCXFsYTEyODBfc3RhdHVzX2VudHJ5KGhhLCBwa3QsIGRvbmVfcSk7CisJCQllbHNlCisJCQkJcWxhMTI4MF9lcnJvcl9lbnRyeShoYSwgcGt0LCBkb25lX3EpOworCQkJLyogQWRqdXN0IHJpbmcgaW5kZXguICovCisJCQloYS0+cnNwX3JpbmdfaW5kZXgrKzsKKwkJCWlmIChoYS0+cnNwX3JpbmdfaW5kZXggPT0gUkVTUE9OU0VfRU5UUllfQ05UKSB7CisJCQkJaGEtPnJzcF9yaW5nX2luZGV4ID0gMDsKKwkJCQloYS0+cmVzcG9uc2VfcmluZ19wdHIgPQloYS0+cmVzcG9uc2VfcmluZzsKKwkJCX0gZWxzZQorCQkJCWhhLT5yZXNwb25zZV9yaW5nX3B0cisrOworCQkJV1JUX1JFR19XT1JEKCZyZWctPm1haWxib3g1LCBoYS0+cnNwX3JpbmdfaW5kZXgpOworCQl9CisJfQorCQorIG91dDoKKwlMRUFWRSgicWxhMTI4MF9pc3IiKTsKK30KKworLyoKKyAqICBxbGExMjgwX3JzdF9hZW4KKyAqICAgICAgUHJvY2Vzc2VzIGFzeW5jaHJvbm91cyByZXNldC4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICovCitzdGF0aWMgdm9pZAorcWxhMTI4MF9yc3RfYWVuKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwl1aW50OF90IGJ1czsKKworCUVOVEVSKCJxbGExMjgwX3JzdF9hZW4iKTsKKworCWlmIChoYS0+ZmxhZ3Mub25saW5lICYmICFoYS0+ZmxhZ3MucmVzZXRfYWN0aXZlICYmCisJICAgICFoYS0+ZmxhZ3MuYWJvcnRfaXNwX2FjdGl2ZSkgeworCQloYS0+ZmxhZ3MucmVzZXRfYWN0aXZlID0gMTsKKwkJd2hpbGUgKGhhLT5mbGFncy5yZXNldF9tYXJrZXIpIHsKKwkJCS8qIElzc3VlIG1hcmtlciBjb21tYW5kLiAqLworCQkJaGEtPmZsYWdzLnJlc2V0X21hcmtlciA9IDA7CisJCQlmb3IgKGJ1cyA9IDA7IGJ1cyA8IGhhLT5wb3J0cyAmJgorCQkJCSAgICAgIWhhLT5mbGFncy5yZXNldF9tYXJrZXI7IGJ1cysrKSB7CisJCQkJaWYgKGhhLT5idXNfc2V0dGluZ3NbYnVzXS5yZXNldF9tYXJrZXIpIHsKKwkJCQkJaGEtPmJ1c19zZXR0aW5nc1tidXNdLnJlc2V0X21hcmtlciA9IDA7CisJCQkJCXFsYTEyODBfbWFya2VyKGhhLCBidXMsIDAsIDAsCisJCQkJCQkgICAgICAgTUtfU1lOQ19BTEwpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCUxFQVZFKCJxbGExMjgwX3JzdF9hZW4iKTsKK30KKworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgMHgwMjA1MDAKKy8qCisgKgorICovCitzdGF0aWMgdm9pZAorcWxhMTI4MF9nZXRfdGFyZ2V0X29wdGlvbnMoc3RydWN0IHNjc2lfY21uZCAqY21kLCBzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJdW5zaWduZWQgY2hhciAqcmVzdWx0OworCXN0cnVjdCBudnJhbSAqbjsKKwlpbnQgYnVzLCB0YXJnZXQsIGx1bjsKKworCWJ1cyA9IFNDU0lfQlVTXzMyKGNtZCk7CisJdGFyZ2V0ID0gU0NTSV9UQ05fMzIoY21kKTsKKwlsdW4gPSBTQ1NJX0xVTl8zMihjbWQpOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdG8gbm90IHRvdWNoIGFueXRoaW5nIGlmIHNvbWVvbmUgaXMgdXNpbmcgdGhlCisJICogc2cgaW50ZXJmYWNlLgorCSAqLworCWlmIChjbWQtPnVzZV9zZyB8fCAoQ01EX1JFU1VMVChjbWQpID4+IDE2KSAhPSBESURfT0sgfHwgbHVuKQorCQlyZXR1cm47CisKKwlyZXN1bHQgPSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCW4gPSAmaGEtPm52cmFtOworCisJbi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuZW5hYmxlX3dpZGUgPSAwOworCW4tPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV9zeW5jID0gMDsKKwluLT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wcHJfMXgxNjAuZmxhZ3MuZW5hYmxlX3BwciA9IDA7CisKKyAgICAgICAgaWYgKHJlc3VsdFs3XSAmIDB4NjApCisJCW4tPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV93aWRlID0gMTsKKyAgICAgICAgaWYgKHJlc3VsdFs3XSAmIDB4MTApCisJCW4tPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV9zeW5jID0gMTsKKwlpZiAoKHJlc3VsdFsyXSA+PSAzKSAmJiAocmVzdWx0WzRdICsgNSA+IDU2KSAmJgorCSAgICAocmVzdWx0WzU2XSAmIDB4NCkpCisJCW4tPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBwcl8xeDE2MC5mbGFncy5lbmFibGVfcHByID0gMTsKKworCWRwcmludGsoMiwgImdldF90YXJnZXRfb3B0aW9ucygpOiB3aWRlICVpLCBzeW5jICVpLCBwcHIgJWlcbiIsCisJCW4tPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV93aWRlLAorCQluLT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5lbmFibGVfc3luYywKKwkJbi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucHByXzF4MTYwLmZsYWdzLmVuYWJsZV9wcHIpOworfQorI2VuZGlmCisKKy8qCisgKiAgcWxhMTI4MF9zdGF0dXNfZW50cnkKKyAqICAgICAgUHJvY2Vzc2VzIHJlY2VpdmVkIElTUCBzdGF0dXMgZW50cnkuCisgKgorICogSW5wdXQ6CisgKiAgICAgIGhhICAgICAgICAgICA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqICAgICAgcGt0ICAgICAgICAgID0gZW50cnkgcG9pbnRlci4KKyAqICAgICAgZG9uZV9xICAgICAgID0gZG9uZSBxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQKK3FsYTEyODBfc3RhdHVzX2VudHJ5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgc3RydWN0IHJlc3BvbnNlICpwa3QsCisJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqZG9uZV9xKQoreworCXVuc2lnbmVkIGludCBidXMsIHRhcmdldCwgbHVuOworCWludCBzZW5zZV9zejsKKwlzdHJ1Y3Qgc3JiICpzcDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJdWludDMyX3QgaGFuZGxlID0gbGUzMl90b19jcHUocGt0LT5oYW5kbGUpOworCXVpbnQxNl90IHNjc2lfc3RhdHVzID0gbGUxNl90b19jcHUocGt0LT5zY3NpX3N0YXR1cyk7CisJdWludDE2X3QgY29tcF9zdGF0dXMgPSBsZTE2X3RvX2NwdShwa3QtPmNvbXBfc3RhdHVzKTsKKworCUVOVEVSKCJxbGExMjgwX3N0YXR1c19lbnRyeSIpOworCisJLyogVmFsaWRhdGUgaGFuZGxlLiAqLworCWlmIChoYW5kbGUgPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMpCisJCXNwID0gaGEtPm91dHN0YW5kaW5nX2NtZHNbaGFuZGxlXTsKKwllbHNlCisJCXNwID0gTlVMTDsKKworCWlmICghc3ApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicWxhMTI4MDogU3RhdHVzIEVudHJ5IGludmFsaWQgaGFuZGxlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRnJlZSBvdXRzdGFuZGluZyBjb21tYW5kIHNsb3QuICovCisJaGEtPm91dHN0YW5kaW5nX2NtZHNbaGFuZGxlXSA9IE5VTEw7CisKKwljbWQgPSBzcC0+Y21kOworCisJLyogR2VuZXJhdGUgTFUgcXVldWUgb24gY250cmwsIHRhcmdldCwgTFVOICovCisJYnVzID0gU0NTSV9CVVNfMzIoY21kKTsKKwl0YXJnZXQgPSBTQ1NJX1RDTl8zMihjbWQpOworCWx1biA9IFNDU0lfTFVOXzMyKGNtZCk7CisKKwlpZiAoY29tcF9zdGF0dXMgfHwgc2NzaV9zdGF0dXMpIHsKKwkJZHByaW50aygzLCAic2NzaTogY29tcF9zdGF0dXMgPSAweCV4LCBzY3NpX3N0YXR1cyA9ICIKKwkJCSIweCV4LCBoYW5kbGUgPSAweCV4XG4iLCBjb21wX3N0YXR1cywKKwkJCXNjc2lfc3RhdHVzLCBoYW5kbGUpOworCX0KKworCS8qIFRhcmdldCBidXN5ICovCisJaWYgKHNjc2lfc3RhdHVzICYgU1NfQlVTWV9DT05ESVRJT04gJiYKKwkgICAgc2NzaV9zdGF0dXMgIT0gU1NfUkVTRVJWRV9DT05GTElDVCkgeworCQlDTURfUkVTVUxUKGNtZCkgPQorCQkJRElEX0JVU19CVVNZIDw8IDE2IHwgKHNjc2lfc3RhdHVzICYgMHhmZik7CisJfSBlbHNlIHsKKworCQkvKiBTYXZlIElTUCBjb21wbGV0aW9uIHN0YXR1cyAqLworCQlDTURfUkVTVUxUKGNtZCkgPSBxbGExMjgwX3JldHVybl9zdGF0dXMocGt0LCBjbWQpOworCisJCWlmIChzY3NpX3N0YXR1cyAmIFNTX0NIRUNLX0NPTkRJVElPTikgeworCQkJaWYgKGNvbXBfc3RhdHVzICE9IENTX0FSU19GQUlMRUQpIHsKKwkJCQl1aW50MTZfdCByZXFfc2Vuc2VfbGVuZ3RoID0KKwkJCQkJbGUxNl90b19jcHUocGt0LT5yZXFfc2Vuc2VfbGVuZ3RoKTsKKwkJCQlpZiAocmVxX3NlbnNlX2xlbmd0aCA8IENNRF9TTlNMRU4oY21kKSkKKwkJCQkJc2Vuc2Vfc3ogPSByZXFfc2Vuc2VfbGVuZ3RoOworCQkJCWVsc2UKKwkJCQkJLyoKKwkJCQkJICogc2NzaV9jbW5kLT5zZW5zZV9idWZmZXIgaXMKKwkJCQkJICogNjQgYnl0ZXMsIHdoeSBvbmx5IGNvcHkgNjM/CisJCQkJCSAqIFRoaXMgbG9va3Mgd3JvbmchIC9KZXMKKwkJCQkJICovCisJCQkJCXNlbnNlX3N6ID0gQ01EX1NOU0xFTihjbWQpIC0gMTsKKworCQkJCW1lbWNweShjbWQtPnNlbnNlX2J1ZmZlciwKKwkJCQkgICAgICAgJnBrdC0+cmVxX3NlbnNlX2RhdGEsIHNlbnNlX3N6KTsKKwkJCX0gZWxzZQorCQkJCXNlbnNlX3N6ID0gMDsKKwkJCW1lbXNldChjbWQtPnNlbnNlX2J1ZmZlciArIHNlbnNlX3N6LCAwLAorCQkJICAgICAgIHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikgLSBzZW5zZV9zeik7CisKKwkJCWRwcmludGsoMiwgInFsYTEyODBfc3RhdHVzX2VudHJ5OiBDaGVjayAiCisJCQkJImNvbmRpdGlvbiBTZW5zZSBkYXRhLCBiICVpLCB0ICVpLCAiCisJCQkJImwgJWlcbiIsIGJ1cywgdGFyZ2V0LCBsdW4pOworCQkJaWYgKHNlbnNlX3N6KQorCQkJCXFsYTEyODBfZHVtcF9idWZmZXIoMiwKKwkJCQkJCSAgICAoY2hhciAqKWNtZC0+c2Vuc2VfYnVmZmVyLAorCQkJCQkJICAgIHNlbnNlX3N6KTsKKwkJfQorCX0KKworCS8qIFBsYWNlIGNvbW1hbmQgb24gZG9uZSBxdWV1ZS4gKi8KKwlsaXN0X2FkZF90YWlsKCZzcC0+bGlzdCwgZG9uZV9xKTsKKyBvdXQ6CisJTEVBVkUoInFsYTEyODBfc3RhdHVzX2VudHJ5Iik7Cit9CisKKy8qCisgKiAgcWxhMTI4MF9lcnJvcl9lbnRyeQorICogICAgICBQcm9jZXNzZXMgZXJyb3IgZW50cnkuCisgKgorICogSW5wdXQ6CisgKiAgICAgIGhhICAgICAgICAgICA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqICAgICAgcGt0ICAgICAgICAgID0gZW50cnkgcG9pbnRlci4KKyAqICAgICAgZG9uZV9xICAgICAgID0gZG9uZSBxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQKK3FsYTEyODBfZXJyb3JfZW50cnkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBzdHJ1Y3QgcmVzcG9uc2UgKnBrdCwKKwkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKmRvbmVfcSkKK3sKKwlzdHJ1Y3Qgc3JiICpzcDsKKwl1aW50MzJfdCBoYW5kbGUgPSBsZTMyX3RvX2NwdShwa3QtPmhhbmRsZSk7CisKKwlFTlRFUigicWxhMTI4MF9lcnJvcl9lbnRyeSIpOworCisJaWYgKHBrdC0+ZW50cnlfc3RhdHVzICYgQklUXzMpCisJCWRwcmludGsoMiwgInFsYTEyODBfZXJyb3JfZW50cnk6IEJBRCBQQVlMT0FEIGZsYWcgZXJyb3JcbiIpOworCWVsc2UgaWYgKHBrdC0+ZW50cnlfc3RhdHVzICYgQklUXzIpCisJCWRwcmludGsoMiwgInFsYTEyODBfZXJyb3JfZW50cnk6IEJBRCBIRUFERVIgZmxhZyBlcnJvclxuIik7CisJZWxzZSBpZiAocGt0LT5lbnRyeV9zdGF0dXMgJiBCSVRfMSkKKwkJZHByaW50aygyLCAicWxhMTI4MF9lcnJvcl9lbnRyeTogRlVMTCBmbGFnIGVycm9yXG4iKTsKKwllbHNlCisJCWRwcmludGsoMiwgInFsYTEyODBfZXJyb3JfZW50cnk6IFVOS05PV04gZmxhZyBlcnJvclxuIik7CisKKwkvKiBWYWxpZGF0ZSBoYW5kbGUuICovCisJaWYgKGhhbmRsZSA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUykKKwkJc3AgPSBoYS0+b3V0c3RhbmRpbmdfY21kc1toYW5kbGVdOworCWVsc2UKKwkJc3AgPSBOVUxMOworCisJaWYgKHNwKSB7CisJCS8qIEZyZWUgb3V0c3RhbmRpbmcgY29tbWFuZCBzbG90LiAqLworCQloYS0+b3V0c3RhbmRpbmdfY21kc1toYW5kbGVdID0gTlVMTDsKKworCQkvKiBCYWQgcGF5bG9hZCBvciBoZWFkZXIgKi8KKwkJaWYgKHBrdC0+ZW50cnlfc3RhdHVzICYgKEJJVF8zICsgQklUXzIpKSB7CisJCQkvKiBCYWQgcGF5bG9hZCBvciBoZWFkZXIsIHNldCBlcnJvciBzdGF0dXMuICovCisJCQkvKiBDTURfUkVTVUxUKHNwLT5jbWQpID0gQ1NfQkFEX1BBWUxPQUQ7ICovCisJCQlDTURfUkVTVUxUKHNwLT5jbWQpID0gRElEX0VSUk9SIDw8IDE2OworCQl9IGVsc2UgaWYgKHBrdC0+ZW50cnlfc3RhdHVzICYgQklUXzEpIHsJLyogRlVMTCBmbGFnICovCisJCQlDTURfUkVTVUxUKHNwLT5jbWQpID0gRElEX0JVU19CVVNZIDw8IDE2OworCQl9IGVsc2UgeworCQkJLyogU2V0IGVycm9yIHN0YXR1cy4gKi8KKwkJCUNNRF9SRVNVTFQoc3AtPmNtZCkgPSBESURfRVJST1IgPDwgMTY7CisJCX0KKworCQkvKiBQbGFjZSBjb21tYW5kIG9uIGRvbmUgcXVldWUuICovCisJCWxpc3RfYWRkX3RhaWwoJnNwLT5saXN0LCBkb25lX3EpOworCX0KKyNpZmRlZiBRTEFfNjRCSVRfUFRSCisJZWxzZSBpZiAocGt0LT5lbnRyeV90eXBlID09IENPTU1BTkRfQTY0X1RZUEUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiIXFsYTEyODA6IEVycm9yIEVudHJ5IGludmFsaWQgaGFuZGxlIik7CisJfQorI2VuZGlmCisKKwlMRUFWRSgicWxhMTI4MF9lcnJvcl9lbnRyeSIpOworfQorCisvKgorICogIHFsYTEyODBfYWJvcnRfaXNwCisgKiAgICAgIFJlc2V0cyBJU1AgYW5kIGFib3J0cyBhbGwgb3V0c3RhbmRpbmcgY29tbWFuZHMuCisgKgorICogSW5wdXQ6CisgKiAgICAgIGhhICAgICAgICAgICA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICAwID0gc3VjY2VzcworICovCitzdGF0aWMgaW50CitxbGExMjgwX2Fib3J0X2lzcChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJc3RydWN0IGRldmljZV9yZWcgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKwlzdHJ1Y3Qgc3JiICpzcDsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgY250OworCWludCBidXM7CisKKwlFTlRFUigicWxhMTI4MF9hYm9ydF9pc3AiKTsKKworCWlmIChoYS0+ZmxhZ3MuYWJvcnRfaXNwX2FjdGl2ZSB8fCAhaGEtPmZsYWdzLm9ubGluZSkKKwkJZ290byBvdXQ7CisJCisJaGEtPmZsYWdzLmFib3J0X2lzcF9hY3RpdmUgPSAxOworCisJLyogRGlzYWJsZSBJU1AgaW50ZXJydXB0cy4gKi8KKwlxbGExMjgwX2Rpc2FibGVfaW50cnMoaGEpOworCVdSVF9SRUdfV09SRCgmcmVnLT5ob3N0X2NtZCwgSENfUEFVU0VfUklTQyk7CisJUkRfUkVHX1dPUkQoJnJlZy0+aWRfbCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJzY3NpKCVsaSk6IGRlcXVldWluZyBvdXRzdGFuZGluZyBjb21tYW5kc1xuIiwKKwkgICAgICAgaGEtPmhvc3Rfbm8pOworCS8qIERlcXVldWUgYWxsIGNvbW1hbmRzIGluIG91dHN0YW5kaW5nIGNvbW1hbmQgbGlzdC4gKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgY250KyspIHsKKwkJc3RydWN0IHNjc2lfY21uZCAqY21kOworCQlzcCA9IGhhLT5vdXRzdGFuZGluZ19jbWRzW2NudF07CisJCWlmIChzcCkgeworCisJCQljbWQgPSBzcC0+Y21kOworCQkJQ01EX1JFU1VMVChjbWQpID0gRElEX1JFU0VUIDw8IDE2OworCisJCQlzcC0+Y21kID0gTlVMTDsKKwkJCWhhLT5vdXRzdGFuZGluZ19jbWRzW2NudF0gPSBOVUxMOworCisJCQkoKmNtZC0+c2NzaV9kb25lKShjbWQpOworCisJCQlzcC0+ZmxhZ3MgPSAwOworCQl9CisJfQorCisJc3RhdHVzID0gcWxhMTI4MF9sb2FkX2Zpcm13YXJlKGhhKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKworCS8qIFNldHVwIGFkYXB0ZXIgYmFzZWQgb24gTlZSQU0gcGFyYW1ldGVycy4gKi8KKwlxbGExMjgwX252cmFtX2NvbmZpZyAoaGEpOworCisJc3RhdHVzID0gcWxhMTI4MF9pbml0X3JpbmdzKGhhKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwkJCisJLyogSXNzdWUgU0NTSSByZXNldC4gKi8KKwlmb3IgKGJ1cyA9IDA7IGJ1cyA8IGhhLT5wb3J0czsgYnVzKyspCisJCXFsYTEyODBfYnVzX3Jlc2V0KGhhLCBidXMpOworCQkKKwloYS0+ZmxhZ3MuYWJvcnRfaXNwX2FjdGl2ZSA9IDA7Cisgb3V0OgorCWlmIChzdGF0dXMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgInFsYTEyODA6IElTUCBlcnJvciByZWNvdmVyeSBmYWlsZWQsIGJvYXJkIGRpc2FibGVkIik7CisJCXFsYTEyODBfcmVzZXRfYWRhcHRlcihoYSk7CisJCWRwcmludGsoMiwgInFsYTEyODBfYWJvcnRfaXNwOiAqKioqIEZBSUxFRCAqKioqXG4iKTsKKwl9CisKKwlMRUFWRSgicWxhMTI4MF9hYm9ydF9pc3AiKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgKiBxbGExMjgwX2RlYm91bmNlX3JlZ2lzdGVyCisgKiAgICAgIERlYm91bmNlIHJlZ2lzdGVyLgorICoKKyAqIElucHV0OgorICogICAgICBwb3J0ID0gcmVnaXN0ZXIgYWRkcmVzcy4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICByZWdpc3RlciB2YWx1ZS4KKyAqLworc3RhdGljIHUxNgorcWxhMTI4MF9kZWJvdW5jZV9yZWdpc3Rlcih2b2xhdGlsZSB1MTYgX19pb21lbSAqIGFkZHIpCit7CisJdm9sYXRpbGUgdTE2IHJldDsKKwl2b2xhdGlsZSB1MTYgcmV0MjsKKworCXJldCA9IFJEX1JFR19XT1JEKGFkZHIpOworCXJldDIgPSBSRF9SRUdfV09SRChhZGRyKTsKKworCWlmIChyZXQgPT0gcmV0MikKKwkJcmV0dXJuIHJldDsKKworCWRvIHsKKwkJY3B1X3JlbGF4KCk7CisJCXJldCA9IFJEX1JFR19XT1JEKGFkZHIpOworCQlyZXQyID0gUkRfUkVHX1dPUkQoYWRkcik7CisJfSB3aGlsZSAocmV0ICE9IHJldDIpOworCisJcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBxbGExMjgwX2NoZWNrX2Zvcl9kZWFkX3Njc2lfYnVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICBUaGlzIHJvdXRpbmUgY2hlY2tzIGZvciBhIGRlYWQgU0NTSSBidXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTRVRfU1hQX0JBTksgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgU0NTSV9QSEFTRV9JTlZBTElEICAgICAgMHg4N0ZGCitzdGF0aWMgaW50CitxbGExMjgwX2NoZWNrX2Zvcl9kZWFkX3Njc2lfYnVzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdW5zaWduZWQgaW50IGJ1cykKK3sKKwl1aW50MTZfdCBjb25maWdfcmVnLCBzY3NpX2NvbnRyb2w7CisJc3RydWN0IGRldmljZV9yZWcgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKworCWlmIChoYS0+YnVzX3NldHRpbmdzW2J1c10uc2NzaV9idXNfZGVhZCkgeworCQlXUlRfUkVHX1dPUkQoJnJlZy0+aG9zdF9jbWQsIEhDX1BBVVNFX1JJU0MpOworCQljb25maWdfcmVnID0gUkRfUkVHX1dPUkQoJnJlZy0+Y2ZnXzEpOworCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y2ZnXzEsIFNFVF9TWFBfQkFOSyk7CisJCXNjc2lfY29udHJvbCA9IFJEX1JFR19XT1JEKCZyZWctPnNjc2lDb250cm9sUGlucyk7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5jZmdfMSwgY29uZmlnX3JlZyk7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5ob3N0X2NtZCwgSENfUkVMRUFTRV9SSVNDKTsKKworCQlpZiAoc2NzaV9jb250cm9sID09IFNDU0lfUEhBU0VfSU5WQUxJRCkgeworCQkJaGEtPmJ1c19zZXR0aW5nc1tidXNdLnNjc2lfYnVzX2RlYWQgPSAxOworI2lmIDAKKwkJCUNNRF9SRVNVTFQoY3ApID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCQlDTURfSEFORExFKGNwKSA9IElOVkFMSURfSEFORExFOworCQkJLyogaGEtPmFjdHRocmVhZHMtLTsgKi8KKworCQkJKCooY3ApLT5zY3NpX2RvbmUpKGNwKTsKKyNlbmRpZgorCQkJcmV0dXJuIDE7CS8qIGJ1cyBpcyBkZWFkICovCisJCX0gZWxzZSB7CisJCQloYS0+YnVzX3NldHRpbmdzW2J1c10uc2NzaV9idXNfZGVhZCA9IDA7CisJCQloYS0+YnVzX3NldHRpbmdzW2J1c10uZmFpbGVkX3Jlc2V0X2NvdW50ID0gMDsKKwkJfQorCX0KKwlyZXR1cm4gMDsJCS8qIGJ1cyBpcyBub3QgZGVhZCAqLworfQorCitzdGF0aWMgdm9pZAorcWxhMTI4MF9nZXRfdGFyZ2V0X3BhcmFtZXRlcnMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQkJICAgICAgc3RydWN0IHNjc2lfZGV2aWNlICpkZXZpY2UpCit7CisJdWludDE2X3QgbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF07CisJaW50IGJ1cywgdGFyZ2V0LCBsdW47CisKKwlidXMgPSBkZXZpY2UtPmNoYW5uZWw7CisJdGFyZ2V0ID0gZGV2aWNlLT5pZDsKKwlsdW4gPSBkZXZpY2UtPmx1bjsKKworCisJbWJbMF0gPSBNQkNfR0VUX1RBUkdFVF9QQVJBTUVURVJTOworCW1iWzFdID0gKHVpbnQxNl90KSAoYnVzID8gdGFyZ2V0IHwgQklUXzcgOiB0YXJnZXQpOworCW1iWzFdIDw8PSA4OworCXFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfNiB8IEJJVF8zIHwgQklUXzIgfCBCSVRfMSB8IEJJVF8wLAorCQkJCSZtYlswXSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJzY3NpKCVsaTolZDolZDolZCk6IiwgaGEtPmhvc3Rfbm8sIGJ1cywgdGFyZ2V0LCBsdW4pOworCisJaWYgKG1iWzNdICE9IDApIHsKKwkJcHJpbnRrKCIgU3luYzogcGVyaW9kICVkLCBvZmZzZXQgJWQiLAorCQkgICAgICAgKG1iWzNdICYgMHhmZiksIChtYlszXSA+PiA4KSk7CisJCWlmIChtYlsyXSAmIEJJVF8xMykKKwkJCXByaW50aygiLCBXaWRlIik7CisJCWlmICgobWJbMl0gJiBCSVRfNSkgJiYgKChtYls2XSA+PiA4KSAmIDB4ZmYpID49IDIpCisJCQlwcmludGsoIiwgRFQiKTsKKwl9IGVsc2UKKwkJcHJpbnRrKCIgQXN5bmMiKTsKKworCWlmIChERVZfU0lNUExFX1RBR1MoZGV2aWNlKSkKKwkJcHJpbnRrKCIsIFRhZ2dlZCBxdWV1aW5nOiBkZXB0aCAlZCIsIGRldmljZS0+cXVldWVfZGVwdGgpOworCXByaW50aygiXG4iKTsKK30KKworCisjaWYgREVCVUdfUUxBMTI4MAorc3RhdGljIHZvaWQKK19fcWxhMTI4MF9kdW1wX2J1ZmZlcihjaGFyICpiLCBpbnQgc2l6ZSkKK3sKKwlpbnQgY250OworCXU4IGM7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgIDkgICBBaCAgIgorCSAgICAgICAiQmggIENoICBEaCAgRWggIEZoXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCSAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZTspIHsKKwkJYyA9ICpiKys7CisKKwkJcHJpbnRrKCIweCUwMngiLCBjKTsKKwkJY250Kys7CisJCWlmICghKGNudCAlIDE2KSkKKwkJCXByaW50aygiXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCIgIik7CisJfQorCWlmIChjbnQgJSAxNikKKwkJcHJpbnRrKCJcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgcWwxMjgwX3ByaW50X3Njc2lfY21kCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK19fcWxhMTI4MF9wcmludF9zY3NpX2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBDTURfSE9TVChjbWQpOworCXN0cnVjdCBzcmIgKnNwOworCS8qIHN0cnVjdCBzY2F0dGVybGlzdCAqc2c7ICovCisKKwlpbnQgaTsKKwloYSA9IChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKWhvc3QtPmhvc3RkYXRhOworCisJc3AgPSAoc3RydWN0IHNyYiAqKUNNRF9TUChjbWQpOworCXByaW50aygiU0NTSSBDb21tYW5kIEA9IDB4JXAsIEhhbmRsZT0weCVwXG4iLCBjbWQsIENNRF9IQU5ETEUoY21kKSk7CisJcHJpbnRrKCIgIGNoYW49JWQsIHRhcmdldCA9IDB4JTAyeCwgbHVuID0gMHglMDJ4LCBjbWRfbGVuID0gMHglMDJ4XG4iLAorCSAgICAgICBTQ1NJX0JVU18zMihjbWQpLCBTQ1NJX1RDTl8zMihjbWQpLCBTQ1NJX0xVTl8zMihjbWQpLAorCSAgICAgICBDTURfQ0RCTEVOKGNtZCkpOworCXByaW50aygiIENEQiA9ICIpOworCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNtZF9sZW47IGkrKykgeworCQlwcmludGsoIjB4JTAyeCAiLCBjbWQtPmNtbmRbaV0pOworCX0KKwlwcmludGsoIiAgc2VnX2NudCA9JWRcbiIsIGNtZC0+dXNlX3NnKTsKKwlwcmludGsoIiAgcmVxdWVzdCBidWZmZXI9MHglcCwgcmVxdWVzdCBidWZmZXIgbGVuPTB4JXhcbiIsCisJICAgICAgIGNtZC0+cmVxdWVzdF9idWZmZXIsIGNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwkvKiBpZiAoY21kLT51c2Vfc2cpCisJICAgeworCSAgIHNnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCSAgIHByaW50aygiICBTRyBidWZmZXI6IFxuIik7CisJICAgcWxhMTI4MF9kdW1wX2J1ZmZlcigxLCAoY2hhciAqKXNnLCAoY21kLT51c2Vfc2cqc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCkpKTsKKwkgICB9ICovCisJcHJpbnRrKCIgIHRhZz0lZCwgdHJhbnNmZXJzaXplPTB4JXggXG4iLAorCSAgICAgICBjbWQtPnRhZywgY21kLT50cmFuc2ZlcnNpemUpOworCXByaW50aygiICBQaWQ9JWxpLCBTUD0weCVwXG4iLCBjbWQtPnBpZCwgQ01EX1NQKGNtZCkpOworCXByaW50aygiIHVuZGVyZmxvdyBzaXplID0gMHgleCwgZGlyZWN0aW9uPTB4JXhcbiIsCisJICAgICAgIGNtZC0+dW5kZXJmbG93LCBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIHFsMTI4MF9kdW1wX2RldmljZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitxbDEyODBfZHVtcF9kZXZpY2Uoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCisJc3RydWN0IHNjc2lfY21uZCAqY3A7CisJc3RydWN0IHNyYiAqc3A7CisJaW50IGk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiT3V0c3RhbmRpbmcgQ29tbWFuZHMgb24gY29udHJvbGxlcjpcbiIpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgaSsrKSB7CisJCWlmICgoc3AgPSBoYS0+b3V0c3RhbmRpbmdfY21kc1tpXSkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGNwID0gc3AtPmNtZCkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlxbGExMjgwX3ByaW50X3Njc2lfY21kKDEsIGNwKTsKKwl9Cit9CisjZW5kaWYKKworCitlbnVtIHRva2VucyB7CisJVE9LRU5fTlZSQU0sCisJVE9LRU5fU1lOQywKKwlUT0tFTl9XSURFLAorCVRPS0VOX1BQUiwKKwlUT0tFTl9WRVJCT1NFLAorCVRPS0VOX0RFQlVHLAorfTsKKworc3RydWN0IHNldHVwX3Rva2VucyB7CisJY2hhciAqdG9rZW47CisJaW50IHZhbDsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2V0dXBfdG9rZW5zIHNldHVwX3Rva2VuW10gX19pbml0ZGF0YSA9IAoreworCXsgIm52cmFtIiwgVE9LRU5fTlZSQU0gfSwKKwl7ICJzeW5jIiwgVE9LRU5fU1lOQyB9LAorCXsgIndpZGUiLCBUT0tFTl9XSURFIH0sCisJeyAicHByIiwgVE9LRU5fUFBSIH0sCisJeyAidmVyYm9zZSIsIFRPS0VOX1ZFUkJPU0UgfSwKKwl7ICJkZWJ1ZyIsIFRPS0VOX0RFQlVHIH0sCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBxbGExMjgwX3NldHVwCisgKgorICogICBIYW5kbGUgYm9vdCBwYXJhbWV0ZXJzLiBUaGlzIHJlYWxseSBuZWVkcyB0byBiZSBjaGFuZ2VkIHNvIG9uZQorICogICBjYW4gc3BlY2lmeSBwZXIgYWRhcHRlciBwYXJhbWV0ZXJzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBfX2luaXQKK3FsYTEyODBfc2V0dXAoY2hhciAqcykKK3sKKwljaGFyICpjcCwgKnB0cjsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgdG9rZTsKKworCWNwID0gczsKKworCXdoaWxlIChjcCAmJiAocHRyID0gc3RyY2hyKGNwLCAnOicpKSkgeworCQlwdHIrKzsKKwkJaWYgKCFzdHJjbXAocHRyLCAieWVzIikpIHsKKwkJCXZhbCA9IDB4MTAwMDA7CisJCQlwdHIgKz0gMzsKKwkJfSBlbHNlIGlmICghc3RyY21wKHB0ciwgIm5vIikpIHsKKyAJCQl2YWwgPSAwOworCQkJcHRyICs9IDI7CisJCX0gZWxzZQorCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwocHRyLCAmcHRyLCAwKTsKKworCQlzd2l0Y2ggKCh0b2tlID0gcWxhMTI4MF9nZXRfdG9rZW4oY3ApKSkgeworCQljYXNlIFRPS0VOX05WUkFNOgorCQkJaWYgKCF2YWwpCisJCQkJZHJpdmVyX3NldHVwLm5vX252cmFtID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFRPS0VOX1NZTkM6CisJCQlpZiAoIXZhbCkKKwkJCQlkcml2ZXJfc2V0dXAubm9fc3luYyA9IDE7CisJCQllbHNlIGlmICh2YWwgIT0gMHgxMDAwMCkKKwkJCQlkcml2ZXJfc2V0dXAuc3luY19tYXNrID0gdmFsOworCQkJYnJlYWs7CisJCWNhc2UgVE9LRU5fV0lERToKKwkJCWlmICghdmFsKQorCQkJCWRyaXZlcl9zZXR1cC5ub193aWRlID0gMTsKKwkJCWVsc2UgaWYgKHZhbCAhPSAweDEwMDAwKQorCQkJCWRyaXZlcl9zZXR1cC53aWRlX21hc2sgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBUT0tFTl9QUFI6CisJCQlpZiAoIXZhbCkKKwkJCQlkcml2ZXJfc2V0dXAubm9fcHByID0gMTsKKwkJCWVsc2UgaWYgKHZhbCAhPSAweDEwMDAwKQorCQkJCWRyaXZlcl9zZXR1cC5wcHJfbWFzayA9IHZhbDsKKwkJCWJyZWFrOworCQljYXNlIFRPS0VOX1ZFUkJPU0U6CisJCQlxbGExMjgwX3ZlcmJvc2UgPSB2YWw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8gInFsYTEyODA6IHVua25vd24gYm9vdCBvcHRpb24gJXNcbiIsCisJCQkgICAgICAgY3ApOworCQl9CisKKwkJY3AgPSBzdHJjaHIocHRyLCAnOycpOworCQlpZiAoY3ApCisJCQljcCsrOworCQllbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQKK3FsYTEyODBfZ2V0X3Rva2VuKGNoYXIgKnN0cikKK3sKKwljaGFyICpzZXA7CisJbG9uZyByZXQgPSAtMTsKKwlpbnQgaSwgbGVuOworCisJbGVuID0gc2l6ZW9mKHNldHVwX3Rva2VuKS9zaXplb2Yoc3RydWN0IHNldHVwX3Rva2Vucyk7CisKKwlzZXAgPSBzdHJjaHIoc3RyLCAnOicpOworCisJaWYgKHNlcCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspeworCisJCQlpZiAoIXN0cm5jbXAoc2V0dXBfdG9rZW5baV0udG9rZW4sIHN0ciwgKHNlcCAtIHN0cikpKSB7CisJCQkJcmV0ID0gIHNldHVwX3Rva2VuW2ldLnZhbDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gMHgwMjA2MDAKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHFsYTEyODBfZHJpdmVyX3RlbXBsYXRlID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5wcm9jX25hbWUJCT0gInFsYTEyODAiLAorCS5uYW1lCQkJPSAiUWxvZ2ljIElTUCAxMjgwLzEyMTYwIiwKKwkuaW5mbwkJCT0gcWxhMTI4MF9pbmZvLAorCS5zbGF2ZV9jb25maWd1cmUJPSBxbGExMjgwX3NsYXZlX2NvbmZpZ3VyZSwKKwkucXVldWVjb21tYW5kCQk9IHFsYTEyODBfcXVldWVjb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gcWxhMTI4MF9laF9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXI9IHFsYTEyODBfZWhfZGV2aWNlX3Jlc2V0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IHFsYTEyODBfZWhfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSBxbGExMjgwX2VoX2FkYXB0ZXJfcmVzZXQsCisJLmJpb3NfcGFyYW0JCT0gcWxhMTI4MF9iaW9zcGFyYW0sCisJLmNhbl9xdWV1ZQkJPSAweGZmZmZmLAorCS50aGlzX2lkCQk9IC0xLAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKK307CisjZWxzZQorc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBxbGExMjgwX2RyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJxbGExMjgwIiwKKwkubmFtZQkJCT0gIlFsb2dpYyBJU1AgMTI4MC8xMjE2MCIsCisJLmRldGVjdAkJCT0gcWxhMTI4MF9kZXRlY3QsCisJLnJlbGVhc2UJCT0gcWxhMTI4MF9yZWxlYXNlLAorCS5pbmZvCQkJPSBxbGExMjgwX2luZm8sCisJLnF1ZXVlY29tbWFuZAkJPSBxbGExMjgwX3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IHFsYTEyODBfZWhfYWJvcnQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyPSBxbGExMjgwX2VoX2RldmljZV9yZXNldCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBxbGExMjgwX2VoX2J1c19yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCT0gcWxhMTI4MF9laF9hZGFwdGVyX3Jlc2V0LAorCS5iaW9zX3BhcmFtCQk9IHFsYTEyODBfYmlvc3BhcmFtX29sZCwKKwkuY2FuX3F1ZXVlCQk9IDB4ZmZmZmYsCisJLnRoaXNfaWQJCT0gLTEsCisJLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAorCS51c2VfbmV3X2VoX2NvZGUJPSAxLAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorcWxhMTI4MF9wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgZGV2bnVtID0gaWQtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBxbGFfYm9hcmRzICpiZHAgPSAmcWwxMjgwX2JvYXJkX3RibFtkZXZudW1dOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCWludCBlcnJvciA9IC1FTk9ERVY7CisKKwkvKiBCeXBhc3MgYWxsIEFNSSBTVUJTWVMgVkVORE9SIElEcyAqLworCWlmIChwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfQU1JKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJxbGExMjgwOiBTa2lwcGluZyBBTUkgU3ViU3lzIFZlbmRvciBJRCBDaGlwXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJxbGExMjgwOiAlcyBmb3VuZCBvbiBQQ0kgYnVzICVpLCBkZXYgJWlcbiIsCisJICAgICAgIGJkcC0+bmFtZSwgcGRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKHBkZXYtPmRldmZuKSk7CisJCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJxbGExMjgwOiBGYWlsZWQgdG8gZW5hYmxlZCBwY2kgZGV2aWNlLCBhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJZXJyb3IgPSAtRU5PTUVNOworCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJnFsYTEyODBfZHJpdmVyX3RlbXBsYXRlLCBzaXplb2YoKmhhKSk7CisJaWYgKCFob3N0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJxbGExMjgwOiBGYWlsZWQgdG8gcmVnaXN0ZXIgaG9zdCwgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJvcl9kaXNhYmxlX2RldmljZTsKKwl9CisKKwloYSA9IChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKWhvc3QtPmhvc3RkYXRhOworCW1lbXNldChoYSwgMCwgc2l6ZW9mKHN0cnVjdCBzY3NpX3FsYV9ob3N0KSk7CisKKwloYS0+cGRldiA9IHBkZXY7CisJaGEtPmRldm51bSA9IGRldm51bTsJLyogc3BlY2lmaWVzIG1pY3JvY29kZSBsb2FkIGFkZHJlc3MgKi8KKworI2lmZGVmIFFMQV82NEJJVF9QVFIKKwlpZiAocGNpX3NldF9kbWFfbWFzayhoYS0+cGRldiwgKGRtYV9hZGRyX3QpIH4gMFVMTCkpIHsKKwkJaWYgKHBjaV9zZXRfZG1hX21hc2soaGEtPnBkZXYsIDB4ZmZmZmZmZmYpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpKCVsaSk6IFVuYWJsZSB0byBzZXQgYSAiCisJCQkgICAgICAgIiBzdWl0YWJsZSBETUEgbWFzayAtIGFib3JpbmdcbiIsIGhhLT5ob3N0X25vKTsKKwkJCWVycm9yID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyb3JfZnJlZV9pcnE7CisJCX0KKwl9IGVsc2UKKwkJZHByaW50aygyLCAic2NzaSglbGkpOiA2NCBCaXQgUENJIEFkZHJlc3NpbmcgRW5hYmxlZFxuIiwKKwkJCWhhLT5ob3N0X25vKTsKKyNlbHNlCisJaWYgKHBjaV9zZXRfZG1hX21hc2soaGEtPnBkZXYsIDB4ZmZmZmZmZmYpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2koJWxpKTogVW5hYmxlIHRvIHNldCBhICIKKwkJICAgICAgICIgc3VpdGFibGUgRE1BIG1hc2sgLSBhYm9yaW5nXG4iLCBoYS0+aG9zdF9ubyk7CisJCWVycm9yID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcl9mcmVlX2lycTsKKwl9CisjZW5kaWYKKworCWhhLT5yZXF1ZXN0X3JpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChoYS0+cGRldiwKKwkJCSgoUkVRVUVTVF9FTlRSWV9DTlQgKyAxKSAqIChzaXplb2YocmVxdWVzdF90KSkpLAorCQkJJmhhLT5yZXF1ZXN0X2RtYSk7CisJaWYgKCFoYS0+cmVxdWVzdF9yaW5nKSB7CisJCXByaW50ayhLRVJOX0lORk8gInFsYTEyODA6IEZhaWxlZCB0byBnZXQgcmVxdWVzdCBtZW1vcnlcbiIpOworCQlnb3RvIGVycm9yX3B1dF9ob3N0OworCX0KKworCWhhLT5yZXNwb25zZV9yaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGEtPnBkZXYsCisJCQkoKFJFU1BPTlNFX0VOVFJZX0NOVCArIDEpICogKHNpemVvZihzdHJ1Y3QgcmVzcG9uc2UpKSksCisJCQkmaGEtPnJlc3BvbnNlX2RtYSk7CisJaWYgKCFoYS0+cmVzcG9uc2VfcmluZykgeworCQlwcmludGsoS0VSTl9JTkZPICJxbGExMjgwOiBGYWlsZWQgdG8gZ2V0IHJlc3BvbnNlIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyb3JfZnJlZV9yZXF1ZXN0X3Jpbmc7CisJfQorCisJaGEtPnBvcnRzID0gYmRwLT5udW1Qb3J0czsKKworCWhhLT5ob3N0ID0gaG9zdDsKKwloYS0+aG9zdF9ubyA9IGhvc3QtPmhvc3Rfbm87CisKKwlob3N0LT5pcnEgPSBwZGV2LT5pcnE7CisJaG9zdC0+bWF4X2NoYW5uZWwgPSBiZHAtPm51bVBvcnRzIC0gMTsKKwlob3N0LT5tYXhfbHVuID0gTUFYX0xVTlMgLSAxOworCWhvc3QtPm1heF9pZCA9IE1BWF9UQVJHRVRTOworCWhvc3QtPm1heF9zZWN0b3JzID0gMTAyNDsKKwlob3N0LT51bmlxdWVfaWQgPSBob3N0LT5ob3N0X25vOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgMHgwMjA1NDUKKwlob3N0LT5zZWxlY3RfcXVldWVfZGVwdGhzID0gcWxhMTI4MF9zZWxlY3RfcXVldWVfZGVwdGg7CisjZW5kaWYKKworCWVycm9yID0gLUVOT0RFVjsKKworI2lmIE1FTU9SWV9NQVBQRURfSU8KKwloYS0+bW1wYmFzZSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGhhLT5wZGV2LCAxKSwKKwkJCSAgICAgIHBjaV9yZXNvdXJjZV9sZW4oaGEtPnBkZXYsIDEpKTsKKwlpZiAoIWhhLT5tbXBiYXNlKSB7CisJCXByaW50ayhLRVJOX0lORk8gInFsYTEyODA6IFVuYWJsZSB0byBtYXAgSS9PIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyb3JfZnJlZV9yZXNwb25zZV9yaW5nOworCX0KKworCWhvc3QtPmJhc2UgPSAodW5zaWduZWQgbG9uZyloYS0+bW1wYmFzZTsKKwloYS0+aW9iYXNlID0gKHN0cnVjdCBkZXZpY2VfcmVnIF9faW9tZW0gKiloYS0+bW1wYmFzZTsKKyNlbHNlCisJaG9zdC0+aW9fcG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChoYS0+cGRldiwgMCk7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihob3N0LT5pb19wb3J0LCAweGZmLCAicWxhMTI4MCIpKSB7CisJCXByaW50ayhLRVJOX0lORk8gInFsYTEyODA6IEZhaWxlZCB0byByZXNlcnZlIGkvbyByZWdpb24gIgorCQkJCSAiMHglMDRseC0weCUwNGx4IC0gYWxyZWFkeSBpbiB1c2VcbiIsCisJCSAgICAgICBob3N0LT5pb19wb3J0LCBob3N0LT5pb19wb3J0ICsgMHhmZik7CisJCWdvdG8gZXJyb3JfZnJlZV9yZXNwb25zZV9yaW5nOworCX0KKworCWhhLT5pb2Jhc2UgPSAoc3RydWN0IGRldmljZV9yZWcgKilob3N0LT5pb19wb3J0OworI2VuZGlmCisKKwlJTklUX0xJU1RfSEVBRCgmaGEtPmRvbmVfcSk7CisKKwkvKiBEaXNhYmxlIElTUCBpbnRlcnJ1cHRzLiAqLworCXFsYTEyODBfZGlzYWJsZV9pbnRycyhoYSk7CisKKwlpZiAocmVxdWVzdF9pcnEocGRldi0+aXJxLCBxbGExMjgwX2ludHJfaGFuZGxlciwgU0FfU0hJUlEsCisJCQkJInFsYTEyODAiLCBoYSkpIHsKKwkJcHJpbnRrKCJxbGExMjgwIDogRmFpbGVkIHRvIHJlc2VydmUgaW50ZXJydXB0ICVkIGFscmVhZHkgIgorCQkgICAgICAgImluIHVzZVxuIiwgcGRldi0+aXJxKTsKKwkJZ290byBlcnJvcl9yZWxlYXNlX3JlZ2lvbjsKKwl9CisKKwkvKiBsb2FkIHRoZSBGL1csIHJlYWQgcGFyYW1hdGVycywgYW5kIGluaXQgdGhlIEgvVyAqLworCWlmIChxbGExMjgwX2luaXRpYWxpemVfYWRhcHRlcihoYSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicWxhMXgxNjA6IEZhaWxlZCB0byBpbml0aWFsaXplIGFkYXB0ZXJcbiIpOworCQlnb3RvIGVycm9yX2ZyZWVfaXJxOworCX0KKworCS8qIHNldCBvdXIgaG9zdCBJRCAgKG5lZWQgdG8gZG8gc29tZXRoaW5nIGFib3V0IG91ciB0d28gSURzKSAqLworCWhvc3QtPnRoaXNfaWQgPSBoYS0+YnVzX3NldHRpbmdzWzBdLmlkOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IDB4MDIwNjAwCisJZXJyb3IgPSBzY3NpX2FkZF9ob3N0KGhvc3QsICZwZGV2LT5kZXYpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJvcl9kaXNhYmxlX2FkYXB0ZXI7CisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisjZWxzZQorCXNjc2lfc2V0X3BjaV9kZXZpY2UoaG9zdCwgcGRldik7CisjZW5kaWYKKworCXJldHVybiAwOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IDB4MDIwNjAwCisgZXJyb3JfZGlzYWJsZV9hZGFwdGVyOgorCVdSVF9SRUdfV09SRCgmaGEtPmlvYmFzZS0+aWN0cmwsIDApOworI2VuZGlmCisgZXJyb3JfZnJlZV9pcnE6CisJZnJlZV9pcnEocGRldi0+aXJxLCBoYSk7CisgZXJyb3JfcmVsZWFzZV9yZWdpb246CisjaWYgTUVNT1JZX01BUFBFRF9JTworCWlvdW5tYXAoaGEtPm1tcGJhc2UpOworI2Vsc2UKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCAweGZmKTsKKyNlbmRpZgorIGVycm9yX2ZyZWVfcmVzcG9uc2VfcmluZzoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LAorCQkJKChSRVNQT05TRV9FTlRSWV9DTlQgKyAxKSAqIChzaXplb2Yoc3RydWN0IHJlc3BvbnNlKSkpLAorCQkJaGEtPnJlc3BvbnNlX3JpbmcsIGhhLT5yZXNwb25zZV9kbWEpOworIGVycm9yX2ZyZWVfcmVxdWVzdF9yaW5nOgorCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBkZXYsCisJCQkoKFJFUVVFU1RfRU5UUllfQ05UICsgMSkgKiAoc2l6ZW9mKHJlcXVlc3RfdCkpKSwKKwkJCWhhLT5yZXF1ZXN0X3JpbmcsIGhhLT5yZXF1ZXN0X2RtYSk7CisgZXJyb3JfcHV0X2hvc3Q6CisJc2NzaV9ob3N0X3B1dChob3N0KTsKKyBlcnJvcl9kaXNhYmxlX2RldmljZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisgZXJyb3I6CisJcmV0dXJuIGVycm9yOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAorcWxhMTI4MF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopaG9zdC0+aG9zdGRhdGE7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gMHgwMjA2MDAKKwlzY3NpX3JlbW92ZV9ob3N0KGhvc3QpOworI2VuZGlmCisKKwlXUlRfUkVHX1dPUkQoJmhhLT5pb2Jhc2UtPmljdHJsLCAwKTsKKworCWZyZWVfaXJxKHBkZXYtPmlycSwgaGEpOworCisjaWYgTUVNT1JZX01BUFBFRF9JTworCWlvdW5tYXAoaGEtPm1tcGJhc2UpOworI2Vsc2UKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCAweGZmKTsKKyNlbmRpZgorCisJcGNpX2ZyZWVfY29uc2lzdGVudChoYS0+cGRldiwKKwkJCSgoUkVRVUVTVF9FTlRSWV9DTlQgKyAxKSAqIChzaXplb2YocmVxdWVzdF90KSkpLAorCQkJaGEtPnJlcXVlc3RfcmluZywgaGEtPnJlcXVlc3RfZG1hKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LAorCQkJKChSRVNQT05TRV9FTlRSWV9DTlQgKyAxKSAqIChzaXplb2Yoc3RydWN0IHJlc3BvbnNlKSkpLAorCQkJaGEtPnJlc3BvbnNlX3JpbmcsIGhhLT5yZXNwb25zZV9kbWEpOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJc2NzaV9ob3N0X3B1dChob3N0KTsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSAweDAyMDYwMAorc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHFsYTEyODBfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAicWxhMTI4MCIsCisJLmlkX3RhYmxlCT0gcWxhMTI4MF9wY2lfdGJsLAorCS5wcm9iZQkJPSBxbGExMjgwX3Byb2JlX29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHFsYTEyODBfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdAorcWxhMTI4MF9pbml0KHZvaWQpCit7CisJaWYgKHNpemVvZihzdHJ1Y3Qgc3JiKSA+IHNpemVvZihzdHJ1Y3Qgc2NzaV9wb2ludGVyKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAicWxhMTI4MDogc3RydWN0IHNyYiB0b28gYmlnLCBhYm9ydGluZ1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworI2lmZGVmIE1PRFVMRQorCS8qCisJICogSWYgd2UgYXJlIGNhbGxlZCBhcyBhIG1vZHVsZSwgdGhlIHFsYTEyODAgcG9pbnRlciBtYXkgbm90IGJlIG51bGwKKwkgKiBhbmQgaXQgd291bGQgcG9pbnQgdG8gb3VyIGJvb3R1cCBzdHJpbmcsIGp1c3QgbGlrZSBvbiB0aGUgbGlsbworCSAqIGNvbW1hbmQgbGluZS4gIElGIG5vdCBOVUxMLCB0aGVuIHByb2Nlc3MgdGhpcyBjb25maWcgc3RyaW5nIHdpdGgKKwkgKiBxbGExMjgwX3NldHVwCisJICoKKwkgKiBCb290IHRpbWUgT3B0aW9ucworCSAqIFRvIGFkZCBvcHRpb25zIGF0IGJvb3QgdGltZSBhZGQgYSBsaW5lIHRvIHlvdXIgbGlsby5jb25mIGZpbGUgbGlrZToKKwkgKiBhcHBlbmQ9InFsYTEyODA9dmVyYm9zZSxtYXhfdGFnczp7ezI1NSwyNTUsMjU1LDI1NX0sezI1NSwyNTUsMjU1LDI1NX19IgorCSAqIHdoaWNoIHdpbGwgcmVzdWx0IGluIHRoZSBmaXJzdCBmb3VyIGRldmljZXMgb24gdGhlIGZpcnN0IHR3bworCSAqIGNvbnRyb2xsZXJzIGJlaW5nIHNldCB0byBhIHRhZ2dlZCBxdWV1ZSBkZXB0aCBvZiAzMi4KKwkgKi8KKwlpZiAocWxhMTI4MCkKKwkJcWxhMTI4MF9zZXR1cChxbGExMjgwKTsKKyNlbmRpZgorCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcWxhMTI4MF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitxbGExMjgwX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnFsYTEyODBfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHFsYTEyODBfaW5pdCk7Cittb2R1bGVfZXhpdChxbGExMjgwX2V4aXQpOworCisjZWxzZQorIyBkZWZpbmUgZHJpdmVyX3RlbXBsYXRlIHFsYTEyODBfZHJpdmVyX3RlbXBsYXRlCisjIGluY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisjZW5kaWYKKworTU9EVUxFX0FVVEhPUigiUWxvZ2ljICYgSmVzIFNvcmVuc2VuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlFsb2dpYyBJU1AgU0NTSSAocWxhMXg4MC9xbGExeDE2MCkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihRTEExMjgwX1ZFUlNJT04pOworCisvKgorICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGFsbW9zdCBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgorICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5CisgKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCisgKiBvZiB0aGUgZmlsZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMTI4MC5oIGIvZHJpdmVycy9zY3NpL3FsYTEyODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjQ1YWUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTEyODAuaApAQCAtMCwwICsxLDEwOTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyoKKyogUUxvZ2ljIElTUDEyODAgKFVsdHJhMikgLzEyMTYwIChVbHRyYTMpIFNDU0kgZHJpdmVyCisqIENvcHlyaWdodCAoQykgMjAwMCBRbG9naWMgQ29ycG9yYXRpb24KKyogKHd3dy5xbG9naWMuY29tKQorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorKiBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCV9RTEExMjgwX0gKKyNkZWZpbmUJX1FMQTEyODBfSAorCisvKgorICogRGF0YSBiaXQgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUgQklUXzAJMHgxCisjZGVmaW5lIEJJVF8xCTB4MgorI2RlZmluZSBCSVRfMgkweDQKKyNkZWZpbmUgQklUXzMJMHg4CisjZGVmaW5lIEJJVF80CTB4MTAKKyNkZWZpbmUgQklUXzUJMHgyMAorI2RlZmluZSBCSVRfNgkweDQwCisjZGVmaW5lIEJJVF83CTB4ODAKKyNkZWZpbmUgQklUXzgJMHgxMDAKKyNkZWZpbmUgQklUXzkJMHgyMDAKKyNkZWZpbmUgQklUXzEwCTB4NDAwCisjZGVmaW5lIEJJVF8xMQkweDgwMAorI2RlZmluZSBCSVRfMTIJMHgxMDAwCisjZGVmaW5lIEJJVF8xMwkweDIwMDAKKyNkZWZpbmUgQklUXzE0CTB4NDAwMAorI2RlZmluZSBCSVRfMTUJMHg4MDAwCisjZGVmaW5lIEJJVF8xNgkweDEwMDAwCisjZGVmaW5lIEJJVF8xNwkweDIwMDAwCisjZGVmaW5lIEJJVF8xOAkweDQwMDAwCisjZGVmaW5lIEJJVF8xOQkweDgwMDAwCisjZGVmaW5lIEJJVF8yMAkweDEwMDAwMAorI2RlZmluZSBCSVRfMjEJMHgyMDAwMDAKKyNkZWZpbmUgQklUXzIyCTB4NDAwMDAwCisjZGVmaW5lIEJJVF8yMwkweDgwMDAwMAorI2RlZmluZSBCSVRfMjQJMHgxMDAwMDAwCisjZGVmaW5lIEJJVF8yNQkweDIwMDAwMDAKKyNkZWZpbmUgQklUXzI2CTB4NDAwMDAwMAorI2RlZmluZSBCSVRfMjcJMHg4MDAwMDAwCisjZGVmaW5lIEJJVF8yOAkweDEwMDAwMDAwCisjZGVmaW5lIEJJVF8yOQkweDIwMDAwMDAwCisjZGVmaW5lIEJJVF8zMAkweDQwMDAwMDAwCisjZGVmaW5lIEJJVF8zMQkweDgwMDAwMDAwCisKKyNpZiBNRU1PUllfTUFQUEVEX0lPCisjZGVmaW5lIFJEX1JFR19XT1JEKGFkZHIpCQlyZWFkd19yZWxheGVkKGFkZHIpCisjZGVmaW5lIFJEX1JFR19XT1JEX2RtYXN5bmMoYWRkcikJcmVhZHcoYWRkcikKKyNkZWZpbmUgV1JUX1JFR19XT1JEKGFkZHIsIGRhdGEpCXdyaXRldyhkYXRhLCBhZGRyKQorI2Vsc2UJCQkJLyogTUVNT1JZX01BUFBFRF9JTyAqLworI2RlZmluZSBSRF9SRUdfV09SRChhZGRyKQkJaW53KCh1bnNpZ25lZCBsb25nKWFkZHIpCisjZGVmaW5lIFJEX1JFR19XT1JEX2RtYXN5bmMoYWRkcikJUkRfUkVHX1dPUkQoYWRkcikKKyNkZWZpbmUgV1JUX1JFR19XT1JEKGFkZHIsIGRhdGEpCW91dHcoZGF0YSwgKHVuc2lnbmVkIGxvbmcpYWRkcikKKyNlbmRpZgkJCQkvKiBNRU1PUllfTUFQUEVEX0lPICovCisKKy8qCisgKiBIb3N0IGFkYXB0ZXIgZGVmYXVsdCBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBNQVhfQlVTRVMJMgkvKiAyICovCisjZGVmaW5lIE1BWF9CX0JJVFMJMQorCisjZGVmaW5lIE1BWF9UQVJHRVRTCTE2CS8qIDE2ICovCisjZGVmaW5lIE1BWF9UX0JJVFMJNAkvKiA0ICovCisKKyNkZWZpbmUgTUFYX0xVTlMJOAkvKiAzMiAqLworI2RlZmluZSBNQVhfTF9CSVRTCTMJLyogNSAqLworCisvKgorICogV2F0Y2hkb2cgdGltZSBxdWFudHVtCisgKi8KKyNkZWZpbmUgUUxBMTI4MF9XREdfVElNRV9RVUFOVFVNCTUJLyogSW4gc2Vjb25kcyAqLworCisvKiBDb21tYW5kIHJldHJ5IGNvdW50ICgwLTY1NTM1KSAqLworI2RlZmluZSBDT01NQU5EX1JFVFJZX0NPVU5UCQkyNTUKKworLyogTWF4aW11bSBvdXRzdGFuZGluZyBjb21tYW5kcyBpbiBJU1AgcXVldWVzICovCisjZGVmaW5lIE1BWF9PVVRTVEFORElOR19DT01NQU5EUwk1MTIKKyNkZWZpbmUgSU5WQUxJRF9IQU5ETEUJCQkoTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTICsgMikKKworLyogSVNQIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGVudHJ5IGNvdW50cyAoMzctNjU1MzUpICovCisjZGVmaW5lIFJFUVVFU1RfRU5UUllfQ05UCQkyNTYgLyogTnVtYmVyIG9mIHJlcXVlc3QgZW50cmllcy4gKi8KKyNkZWZpbmUgUkVTUE9OU0VfRU5UUllfQ05UCQkxNiAgLyogTnVtYmVyIG9mIHJlc3BvbnNlIGVudHJpZXMuICovCisKKy8qIE51bWJlciBvZiBzZWdtZW50cyAxIC0gNjU1MzUgKi8KKyNkZWZpbmUgU0dfU0VHTUVOVFMJCQkzMiAgLyogQ21kIGVudHJ5ICsgNiBjb250aW51YXRpb25zICovCisKKy8qCisgKiBTQ1NJIFJlcXVlc3QgQmxvY2sgc3RydWN0dXJlICAoc3ApICB0aGF0IGlzIHBsYWNlZAorICogb24gY21kLT5TQ3AgbG9jYXRpb24gb2YgZXZlcnkgSS9PCisgKi8KK3N0cnVjdCBzcmIgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qICg4LzE2KSBMVSBxdWV1ZSAqLworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsJLyogKDQvOCkgU0NTSSBjb21tYW5kIGJsb2NrICovCisJLyogTk9URTogdGhlIHNwLT5jbWQgd2lsbCBiZSBOVUxMIHdoZW4gdGhpcyBjb21wbGV0aW9uIGlzCisJICogY2FsbGVkLCBzbyB5b3Ugc2hvdWxkIGtub3cgdGhlIHNjc2lfY21uZCB3aGVuIHVzaW5nIHRoaXMgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiAqd2FpdDsKKwlkbWFfYWRkcl90IHNhdmVkX2RtYV9oYW5kbGU7CS8qIGZvciB1bm1hcCBvZiBzaW5nbGUgdHJhbnNmZXJzICovCisJdWludDhfdCBmbGFnczsJCS8qICgxKSBTdGF0dXMgZmxhZ3MuICovCisJdWludDhfdCBkaXI7CQkvKiBkaXJlY3Rpb24gb2YgdHJhbnNmZXIgKi8KK307CisKKy8qCisgKiBTUkIgZmxhZyBkZWZpbml0aW9ucworICovCisjZGVmaW5lIFNSQl9USU1FT1VUCQkoMSA8PCAwKQkvKiBDb21tYW5kIHRpbWVkIG91dCAqLworI2RlZmluZSBTUkJfU0VOVAkJKDEgPDwgMSkJLyogQ29tbWFuZCBzZW50IHRvIElTUCAqLworI2RlZmluZSBTUkJfQUJPUlRfUEVORElORwkoMSA8PCAyKQkvKiBDb21tYW5kIGFib3J0IHNlbnQgdG8gZGV2aWNlICovCisjZGVmaW5lIFNSQl9BQk9SVEVECQkoMSA8PCAzKQkvKiBDb21tYW5kIGFib3J0ZWQgY29tbWFuZCBhbHJlYWR5ICovCisKKy8qCisgKiAgSVNQIEkvTyBSZWdpc3RlciBTZXQgc3RydWN0dXJlIGRlZmluaXRpb25zLgorICovCitzdHJ1Y3QgZGV2aWNlX3JlZyB7CisJdWludDE2X3QgaWRfbDsJCS8qIElEIGxvdyAqLworCXVpbnQxNl90IGlkX2g7CQkvKiBJRCBoaWdoICovCisJdWludDE2X3QgY2ZnXzA7CQkvKiBDb25maWd1cmF0aW9uIDAgKi8KKyNkZWZpbmUgSVNQX0NGRzBfSFdNU0sgICAweDAwMGYJLyogSGFyZHdhcmUgcmV2aXNpb24gbWFzayAqLworI2RlZmluZSBJU1BfQ0ZHMF8xMDIwICAgIEJJVF8wCS8qIElTUDEwMjAgKi8KKyNkZWZpbmUgSVNQX0NGRzBfMTAyMEEJIEJJVF8xCS8qIElTUDEwMjBBICovCisjZGVmaW5lIElTUF9DRkcwXzEwNDAJIEJJVF8yCS8qIElTUDEwNDAgKi8KKyNkZWZpbmUgSVNQX0NGRzBfMTA0MEEJIEJJVF8zCS8qIElTUDEwNDBBICovCisjZGVmaW5lIElTUF9DRkcwXzEwNDBCCSBCSVRfNAkvKiBJU1AxMDQwQiAqLworI2RlZmluZSBJU1BfQ0ZHMF8xMDQwQwkgQklUXzUJLyogSVNQMTA0MEMgKi8KKwl1aW50MTZfdCBjZmdfMTsJCS8qIENvbmZpZ3VyYXRpb24gMSAqLworI2RlZmluZSBJU1BfQ0ZHMV9GMTI4ICAgIEJJVF82ICAvKiAxMjgtYnl0ZSBGSUZPIHRocmVzaG9sZCAqLworI2RlZmluZSBJU1BfQ0ZHMV9GNjQgICAgIEJJVF80fEJJVF81IC8qIDEyOC1ieXRlIEZJRk8gdGhyZXNob2xkICovCisjZGVmaW5lIElTUF9DRkcxX0YzMiAgICAgQklUXzUgIC8qIDEyOC1ieXRlIEZJRk8gdGhyZXNob2xkICovCisjZGVmaW5lIElTUF9DRkcxX0YxNiAgICAgQklUXzQgIC8qIDEyOC1ieXRlIEZJRk8gdGhyZXNob2xkICovCisjZGVmaW5lIElTUF9DRkcxX0JFTkFCICAgQklUXzIgIC8qIEdsb2JhbCBCdXMgYnVyc3QgZW5hYmxlICovCisjZGVmaW5lIElTUF9DRkcxX1NYUCAgICAgQklUXzAgIC8qIFNYUCByZWdpc3RlciBzZWxlY3QgKi8KKwl1aW50MTZfdCBpY3RybDsJCS8qIEludGVyZmFjZSBjb250cm9sICovCisjZGVmaW5lIElTUF9SRVNFVCAgICAgICAgQklUXzAJLyogSVNQIHNvZnQgcmVzZXQgKi8KKyNkZWZpbmUgSVNQX0VOX0lOVCAgICAgICBCSVRfMQkvKiBJU1AgZW5hYmxlIGludGVycnVwdHMuICovCisjZGVmaW5lIElTUF9FTl9SSVNDICAgICAgQklUXzIJLyogSVNQIGVuYWJsZSBSSVNDIGludGVycnVwdHMuICovCisjZGVmaW5lIElTUF9GTEFTSF9FTkFCTEUgQklUXzgJLyogRmxhc2ggQklPUyBSZWFkL1dyaXRlIGVuYWJsZSAqLworI2RlZmluZSBJU1BfRkxBU0hfVVBQRVIgIEJJVF85CS8qIEZsYXNoIHVwcGVyIGJhbmsgc2VsZWN0ICovCisJdWludDE2X3QgaXN0YXR1czsJLyogSW50ZXJmYWNlIHN0YXR1cyAqLworI2RlZmluZSBQQ0lfNjRCSVRfU0xPVCAgIEJJVF8xNAkvKiBQQ0kgNjQtYml0IHNsb3QgaW5kaWNhdG9yLiAqLworI2RlZmluZSBSSVNDX0lOVCAgICAgICAgIEJJVF8yCS8qIFJJU0MgaW50ZXJydXB0ICovCisjZGVmaW5lIFBDSV9JTlQgICAgICAgICAgQklUXzEJLyogUENJIGludGVycnVwdCAqLworCXVpbnQxNl90IHNlbWFwaG9yZTsJLyogU2VtYXBob3JlICovCisJdWludDE2X3QgbnZyYW07CQkvKiBOVlJBTSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTlZfREVTRUxFQ1QgICAgIDAKKyNkZWZpbmUgTlZfQ0xPQ0sgICAgICAgIEJJVF8wCisjZGVmaW5lIE5WX1NFTEVDVCAgICAgICBCSVRfMQorI2RlZmluZSBOVl9EQVRBX09VVCAgICAgQklUXzIKKyNkZWZpbmUgTlZfREFUQV9JTiAgICAgIEJJVF8zCisJdWludDE2X3QgZmxhc2hfZGF0YTsJLyogRmxhc2ggQklPUyBkYXRhICovCisJdWludDE2X3QgZmxhc2hfYWRkcmVzczsJLyogRmxhc2ggQklPUyBhZGRyZXNzICovCisKKwl1aW50MTZfdCB1bnVzZWRfMVsweDA2XTsKKwkKKwkvKiBjZG1hXyogYW5kIGRkbWFfKiBhcmUgMTA0MCBvbmx5ICovCisJdWludDE2X3QgY2RtYV9jZmc7CisjZGVmaW5lIENETUFfQ09ORl9TRU5BQiAgQklUXzMJLyogU1hQIHRvIERNQSBEYXRhIGVuYWJsZSAqLworI2RlZmluZSBDRE1BX0NPTkZfUklSUSAgIEJJVF8yCS8qIFJJU0MgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBDRE1BX0NPTkZfQkVOQUIgIEJJVF8xCS8qIEJ1cyBidXJzdCBlbmFibGUgKi8KKyNkZWZpbmUgQ0RNQV9DT05GX0RJUiAgICBCSVRfMAkvKiBETUEgZGlyZWN0aW9uICgwPWZpZm8tPmhvc3QgMT1ob3N0LT5maWZvKSAqLworCXVpbnQxNl90IGNkbWFfY3RybDsgCisJdWludDE2X3QgY2RtYV9zdGF0dXM7ICAgCisJdWludDE2X3QgY2RtYV9maWZvX3N0YXR1czsKKwl1aW50MTZfdCBjZG1hX2NvdW50OworCXVpbnQxNl90IGNkbWFfcmVzZXJ2ZWQ7CisJdWludDE2X3QgY2RtYV9hZGRyZXNzX2NvdW50XzA7CisJdWludDE2X3QgY2RtYV9hZGRyZXNzX2NvdW50XzE7CisJdWludDE2X3QgY2RtYV9hZGRyZXNzX2NvdW50XzI7CisJdWludDE2X3QgY2RtYV9hZGRyZXNzX2NvdW50XzM7CisKKwl1aW50MTZfdCB1bnVzZWRfMlsweDA2XTsKKworCXVpbnQxNl90IGRkbWFfY2ZnOworI2RlZmluZSBERE1BX0NPTkZfU0VOQUIgIEJJVF8zCS8qIFNYUCB0byBETUEgRGF0YSBlbmFibGUgKi8KKyNkZWZpbmUgRERNQV9DT05GX1JJUlEgICBCSVRfMgkvKiBSSVNDIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgRERNQV9DT05GX0JFTkFCICBCSVRfMQkvKiBCdXMgYnVyc3QgZW5hYmxlICovCisjZGVmaW5lIERETUFfQ09ORl9ESVIgICAgQklUXzAJLyogRE1BIGRpcmVjdGlvbiAoMD1maWZvLT5ob3N0IDE9aG9zdC0+ZmlmbykgKi8KKwl1aW50MTZfdCBkZG1hX2N0cmw7CisJdWludDE2X3QgZGRtYV9zdGF0dXM7IAorCXVpbnQxNl90IGRkbWFfZmlmb19zdGF0dXM7CisJdWludDE2X3QgZGRtYV94ZmVyX2NvdW50X2xvdzsKKwl1aW50MTZfdCBkZG1hX3hmZXJfY291bnRfaGlnaDsKKwl1aW50MTZfdCBkZG1hX2FkZHJfY291bnRfMDsKKwl1aW50MTZfdCBkZG1hX2FkZHJfY291bnRfMTsKKwl1aW50MTZfdCBkZG1hX2FkZHJfY291bnRfMjsKKwl1aW50MTZfdCBkZG1hX2FkZHJfY291bnRfMzsgCisKKwl1aW50MTZfdCB1bnVzZWRfM1sweDBlXTsKKworCXVpbnQxNl90IG1haWxib3gwOwkvKiBNYWlsYm94IDAgKi8KKwl1aW50MTZfdCBtYWlsYm94MTsJLyogTWFpbGJveCAxICovCisJdWludDE2X3QgbWFpbGJveDI7CS8qIE1haWxib3ggMiAqLworCXVpbnQxNl90IG1haWxib3gzOwkvKiBNYWlsYm94IDMgKi8KKwl1aW50MTZfdCBtYWlsYm94NDsJLyogTWFpbGJveCA0ICovCisJdWludDE2X3QgbWFpbGJveDU7CS8qIE1haWxib3ggNSAqLworCXVpbnQxNl90IG1haWxib3g2OwkvKiBNYWlsYm94IDYgKi8KKwl1aW50MTZfdCBtYWlsYm94NzsJLyogTWFpbGJveCA3ICovCisKKwl1aW50MTZfdCB1bnVzZWRfNFsweDIwXTsvKiAweDgwLTB4YmYgR2FwICovCisKKwl1aW50MTZfdCBob3N0X2NtZDsJLyogSG9zdCBjb21tYW5kIGFuZCBjb250cm9sICovCisjZGVmaW5lIEhPU1RfSU5UICAgICAgQklUXzcJLyogaG9zdCBpbnRlcnJ1cHQgYml0ICovCisjZGVmaW5lIEJJT1NfRU5BQkxFICAgQklUXzAKKworCXVpbnQxNl90IHVudXNlZF81WzB4NV07CS8qIDB4YzItMHhjYiBHYXAgKi8KKworCXVpbnQxNl90IGdwaW9fZGF0YTsKKwl1aW50MTZfdCBncGlvX2VuYWJsZTsKKworCXVpbnQxNl90IHVudXNlZF82WzB4MTFdOwkvKiBkMC1mMCAqLworCXVpbnQxNl90IHNjc2lDb250cm9sUGluczsJLyogZjIgKi8KK307CisKKyNkZWZpbmUgTUFJTEJPWF9SRUdJU1RFUl9DT1VOVAk4CisKKy8qCisgKiAgSVNQIHByb2R1Y3QgaWRlbnRpZmljYXRpb24gZGVmaW5pdGlvbnMgaW4gbWFpbGJveGVzIGFmdGVyIHJlc2V0LgorICovCisjZGVmaW5lIFBST0RfSURfMQkJMHg0OTUzCisjZGVmaW5lIFBST0RfSURfMgkJMHgwMDAwCisjZGVmaW5lIFBST0RfSURfMmEJCTB4NTAyMAorI2RlZmluZSBQUk9EX0lEXzMJCTB4MjAyMAorI2RlZmluZSBQUk9EX0lEXzQJCTB4MQorCisvKgorICogSVNQIGhvc3QgY29tbWFuZCBhbmQgY29udHJvbCByZWdpc3RlciBjb21tYW5kIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgSENfUkVTRVRfUklTQwkJMHgxMDAwCS8qIFJlc2V0IFJJU0MgKi8KKyNkZWZpbmUgSENfUEFVU0VfUklTQwkJMHgyMDAwCS8qIFBhdXNlIFJJU0MgKi8KKyNkZWZpbmUgSENfUkVMRUFTRV9SSVNDCQkweDMwMDAJLyogUmVsZWFzZSBSSVNDIGZyb20gcmVzZXQuICovCisjZGVmaW5lIEhDX1NFVF9IT1NUX0lOVAkJMHg1MDAwCS8qIFNldCBob3N0IGludGVycnVwdCAqLworI2RlZmluZSBIQ19DTFJfSE9TVF9JTlQJCTB4NjAwMAkvKiBDbGVhciBIT1NUIGludGVycnVwdCAqLworI2RlZmluZSBIQ19DTFJfUklTQ19JTlQJCTB4NzAwMAkvKiBDbGVhciBSSVNDIGludGVycnVwdCAqLworI2RlZmluZSBIQ19ESVNBQkxFX0JJT1MJCTB4OTAwMAkvKiBEaXNhYmxlIEJJT1MuICovCisKKy8qCisgKiBJU1AgbWFpbGJveCBTZWxmLVRlc3Qgc3RhdHVzIGNvZGVzCisgKi8KKyNkZWZpbmUgTUJTX0ZSTV9BTElWRQkJMAkvKiBGaXJtd2FyZSBBbGl2ZS4gKi8KKyNkZWZpbmUgTUJTX0NIS1NVTV9FUlIJCTEJLyogQ2hlY2tzdW0gRXJyb3IuICovCisjZGVmaW5lIE1CU19TSEFET1dfTERfRVJSCTIJLyogU2hhZG93IExvYWQgRXJyb3IuICovCisjZGVmaW5lIE1CU19CVVNZCQk0CS8qIEJ1c3kuICovCisKKy8qCisgKiBJU1AgbWFpbGJveCBjb21tYW5kIGNvbXBsZXRlIHN0YXR1cyBjb2RlcworICovCisjZGVmaW5lIE1CU19DTURfQ01QCQkweDQwMDAJLyogQ29tbWFuZCBDb21wbGV0ZS4gKi8KKyNkZWZpbmUgTUJTX0lOVl9DTUQJCTB4NDAwMQkvKiBJbnZhbGlkIENvbW1hbmQuICovCisjZGVmaW5lIE1CU19IT1NUX0lORl9FUlIJMHg0MDAyCS8qIEhvc3QgSW50ZXJmYWNlIEVycm9yLiAqLworI2RlZmluZSBNQlNfVEVTVF9GQUlMRUQJCTB4NDAwMwkvKiBUZXN0IEZhaWxlZC4gKi8KKyNkZWZpbmUgTUJTX0NNRF9FUlIJCTB4NDAwNQkvKiBDb21tYW5kIEVycm9yLiAqLworI2RlZmluZSBNQlNfQ01EX1BBUkFNX0VSUgkweDQwMDYJLyogQ29tbWFuZCBQYXJhbWV0ZXIgRXJyb3IuICovCisKKy8qCisgKiBJU1AgbWFpbGJveCBhc3luY2hyb25vdXMgZXZlbnQgc3RhdHVzIGNvZGVzCisgKi8KKyNkZWZpbmUgTUJBX0FTWU5DX0VWRU5UCQkweDgwMDAJLyogQXN5bmNocm9ub3VzIGV2ZW50LiAqLworI2RlZmluZSBNQkFfQlVTX1JFU0VUCQkweDgwMDEJLyogU0NTSSBCdXMgUmVzZXQuICovCisjZGVmaW5lIE1CQV9TWVNURU1fRVJSCQkweDgwMDIJLyogU3lzdGVtIEVycm9yLiAqLworI2RlZmluZSBNQkFfUkVRX1RSQU5TRkVSX0VSUgkweDgwMDMJLyogUmVxdWVzdCBUcmFuc2ZlciBFcnJvci4gKi8KKyNkZWZpbmUgTUJBX1JTUF9UUkFOU0ZFUl9FUlIJMHg4MDA0CS8qIFJlc3BvbnNlIFRyYW5zZmVyIEVycm9yLiAqLworI2RlZmluZSBNQkFfV0FLRVVQX1RIUkVTCTB4ODAwNQkvKiBSZXF1ZXN0IFF1ZXVlIFdha2UtdXAuICovCisjZGVmaW5lIE1CQV9USU1FT1VUX1JFU0VUCTB4ODAwNgkvKiBFeGVjdXRpb24gVGltZW91dCBSZXNldC4gKi8KKyNkZWZpbmUgTUJBX0RFVklDRV9SRVNFVAkweDgwMDcJLyogQnVzIERldmljZSBSZXNldC4gKi8KKyNkZWZpbmUgTUJBX0JVU19NT0RFX0NIQU5HRQkweDgwMEUJLyogU0NTSSBidXMgbW9kZSB0cmFuc2l0aW9uLiAqLworI2RlZmluZSBNQkFfU0NTSV9DT01QTEVUSU9OCTB4ODAyMAkvKiBDb21wbGV0aW9uIHJlc3BvbnNlLiAqLworCisvKgorICogSVNQIG1haWxib3ggY29tbWFuZHMKKyAqLworI2RlZmluZSBNQkNfTk9QCQkJCTAJLyogTm8gT3BlcmF0aW9uICovCisjZGVmaW5lIE1CQ19MT0FEX1JBTQkJCTEJLyogTG9hZCBSQU0gKi8KKyNkZWZpbmUgTUJDX0VYRUNVVEVfRklSTVdBUkUJCTIJLyogRXhlY3V0ZSBmaXJtd2FyZSAqLworI2RlZmluZSBNQkNfRFVNUF9SQU0JCQkzCS8qIER1bXAgUkFNIGNvbnRlbnRzICovCisjZGVmaW5lIE1CQ19XUklURV9SQU1fV09SRAkJNAkvKiBXcml0ZSByYW0gd29yZCAqLworI2RlZmluZSBNQkNfUkVBRF9SQU1fV09SRAkJNQkvKiBSZWFkIHJhbSB3b3JkICovCisjZGVmaW5lIE1CQ19NQUlMQk9YX1JFR0lTVEVSX1RFU1QJNgkvKiBXcmFwIGluY29taW5nIG1haWxib3hlcyAqLworI2RlZmluZSBNQkNfVkVSSUZZX0NIRUNLU1VNCQk3CS8qIFZlcmlmeSBjaGVja3N1bSAqLworI2RlZmluZSBNQkNfQUJPVVRfRklSTVdBUkUJCTgJLyogR2V0IGZpcm13YXJlIHJldmlzaW9uICovCisjZGVmaW5lIE1CQ19JTklUX1JFUVVFU1RfUVVFVUUJCTB4MTAJLyogSW5pdGlhbGl6ZSByZXF1ZXN0IHF1ZXVlICovCisjZGVmaW5lIE1CQ19JTklUX1JFU1BPTlNFX1FVRVVFCQkweDExCS8qIEluaXRpYWxpemUgcmVzcG9uc2UgcXVldWUgKi8KKyNkZWZpbmUgTUJDX0VYRUNVVEVfSU9DQgkJMHgxMgkvKiBFeGVjdXRlIElPQ0IgY29tbWFuZCAqLworI2RlZmluZSBNQkNfQUJPUlRfQ09NTUFORAkJMHgxNQkvKiBBYm9ydCBJT0NCIGNvbW1hbmQgKi8KKyNkZWZpbmUgTUJDX0FCT1JUX0RFVklDRQkJMHgxNgkvKiBBYm9ydCBkZXZpY2UgKElEL0xVTikgKi8KKyNkZWZpbmUgTUJDX0FCT1JUX1RBUkdFVAkJMHgxNwkvKiBBYm9ydCB0YXJnZXQgKElEKSAqLworI2RlZmluZSBNQkNfQlVTX1JFU0VUCQkJMHgxOAkvKiBTQ1NJIGJ1cyByZXNldCAqLworI2RlZmluZSBNQkNfR0VUX1JFVFJZX0NPVU5UCQkweDIyCS8qIEdldCByZXRyeSBjb3VudCBhbmQgZGVsYXkgKi8KKyNkZWZpbmUgTUJDX0dFVF9UQVJHRVRfUEFSQU1FVEVSUwkweDI4CS8qIEdldCB0YXJnZXQgcGFyYW1ldGVycyAqLworI2RlZmluZSBNQkNfU0VUX0lOSVRJQVRPUl9JRAkJMHgzMAkvKiBTZXQgaW5pdGlhdG9yIFNDU0kgSUQgKi8KKyNkZWZpbmUgTUJDX1NFVF9TRUxFQ1RJT05fVElNRU9VVAkweDMxCS8qIFNldCBzZWxlY3Rpb24gdGltZW91dCAqLworI2RlZmluZSBNQkNfU0VUX1JFVFJZX0NPVU5UCQkweDMyCS8qIFNldCByZXRyeSBjb3VudCBhbmQgZGVsYXkgKi8KKyNkZWZpbmUgTUJDX1NFVF9UQUdfQUdFX0xJTUlUCQkweDMzCS8qIFNldCB0YWcgYWdlIGxpbWl0ICovCisjZGVmaW5lIE1CQ19TRVRfQ0xPQ0tfUkFURQkJMHgzNAkvKiBTZXQgY2xvY2sgcmF0ZSAqLworI2RlZmluZSBNQkNfU0VUX0FDVElWRV9ORUdBVElPTgkJMHgzNQkvKiBTZXQgYWN0aXZlIG5lZ2F0aW9uIHN0YXRlICovCisjZGVmaW5lIE1CQ19TRVRfQVNZTkNfREFUQV9TRVRVUAkweDM2CS8qIFNldCBhc3luYyBkYXRhIHNldHVwIHRpbWUgKi8KKyNkZWZpbmUgTUJDX1NFVF9QQ0lfQ09OVFJPTAkJMHgzNwkvKiBTZXQgQlVTIGNvbnRyb2wgcGFyYW1ldGVycyAqLworI2RlZmluZSBNQkNfU0VUX1RBUkdFVF9QQVJBTUVURVJTCTB4MzgJLyogU2V0IHRhcmdldCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIE1CQ19TRVRfREVWSUNFX1FVRVVFCQkweDM5CS8qIFNldCBkZXZpY2UgcXVldWUgcGFyYW1ldGVycyAqLworI2RlZmluZSBNQkNfU0VUX1JFU0VUX0RFTEFZX1BBUkFNRVRFUlMJMHgzQQkvKiBTZXQgcmVzZXQgZGVsYXkgcGFyYW1ldGVycyAqLworI2RlZmluZSBNQkNfU0VUX1NZU1RFTV9QQVJBTUVURVIJMHg0NQkvKiBTZXQgc3lzdGVtIHBhcmFtZXRlciB3b3JkICovCisjZGVmaW5lIE1CQ19TRVRfRklSTVdBUkVfRkVBVFVSRVMJMHg0QQkvKiBTZXQgZmlybXdhcmUgZmVhdHVyZSB3b3JkICovCisjZGVmaW5lIE1CQ19JTklUX1JFUVVFU1RfUVVFVUVfQTY0CTB4NTIJLyogSW5pdGlhbGl6ZSByZXF1ZXN0IHF1ZXVlIEE2NCAqLworI2RlZmluZSBNQkNfSU5JVF9SRVNQT05TRV9RVUVVRV9BNjQJMHg1MwkvKiBJbml0aWFsaXplIHJlc3BvbnNlIHEgQTY0ICovCisjZGVmaW5lIE1CQ19FTkFCTEVfVEFSR0VUX01PREUJCTB4NTUJLyogRW5hYmxlIHRhcmdldCBtb2RlICovCisjZGVmaW5lIE1CQ19TRVRfREFUQV9PVkVSUlVOX1JFQ09WRVJZCTB4NUEJLyogU2V0IGRhdGEgb3ZlcnJ1biByZWNvdmVyeSBtb2RlICovCisKKy8qCisgKiBJU1AgR2V0L1NldCBUYXJnZXQgUGFyYW1ldGVycyBtYWlsYm94IGNvbW1hbmQgY29udHJvbCBmbGFncy4KKyAqLworI2RlZmluZSBUUF9QUFIJCQlCSVRfNQkvKiBQUFIgKi8KKyNkZWZpbmUgVFBfUkVORUdPVElBVEUJCUJJVF84CS8qIFJlbmVnb3RpYXRlIG9uIGVycm9yLiAqLworI2RlZmluZSBUUF9TVE9QX1FVRVVFICAgICAgICAgICBCSVRfOQkvKiBTdG9wIHF1ZSBvbiBjaGVjayBjb25kaXRpb24gKi8KKyNkZWZpbmUgVFBfQVVUT19SRVFVRVNUX1NFTlNFICAgQklUXzEwCS8qIEF1dG9tYXRpYyByZXF1ZXN0IHNlbnNlLiAqLworI2RlZmluZSBUUF9UQUdHRURfUVVFVUUgICAgICAgICBCSVRfMTEJLyogVGFnZ2VkIHF1ZXVpbmcuICovCisjZGVmaW5lIFRQX1NZTkMgICAgICAgICAgICAgICAgIEJJVF8xMgkvKiBTeW5jaHJvbm91cyBkYXRhIHRyYW5zZmVycy4gKi8KKyNkZWZpbmUgVFBfV0lERSAgICAgICAgICAgICAgICAgQklUXzEzCS8qIFdpZGUgZGF0YSB0cmFuc2ZlcnMuICovCisjZGVmaW5lIFRQX1BBUklUWSAgICAgICAgICAgICAgIEJJVF8xNAkvKiBQYXJpdHkgY2hlY2tpbmcuICovCisjZGVmaW5lIFRQX0RJU0NPTk5FQ1QgICAgICAgICAgIEJJVF8xNQkvKiBEaXNjb25uZWN0IHByaXZpbGVnZS4gKi8KKworLyoKKyAqIE5WUkFNIENvbW1hbmQgdmFsdWVzLgorICovCisjZGVmaW5lIE5WX1NUQVJUX0JJVAkJQklUXzIKKyNkZWZpbmUgTlZfV1JJVEVfT1AJCShCSVRfMjYgfCBCSVRfMjQpCisjZGVmaW5lIE5WX1JFQURfT1AJCShCSVRfMjYgfCBCSVRfMjUpCisjZGVmaW5lIE5WX0VSQVNFX09QCQkoQklUXzI2IHwgQklUXzI1IHwgQklUXzI0KQorI2RlZmluZSBOVl9NQVNLX09QCQkoQklUXzI2IHwgQklUXzI1IHwgQklUXzI0KQorI2RlZmluZSBOVl9ERUxBWV9DT1VOVAkJMTAKKworLyoKKyAqICBRTG9naWMgSVNQMTI4MC9JU1AxMjE2MCBOVlJBTSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworc3RydWN0IG52cmFtIHsKKwl1aW50OF90IGlkMDsJCS8qIDAgKi8KKwl1aW50OF90IGlkMTsJCS8qIDEgKi8KKwl1aW50OF90IGlkMjsJCS8qIDIgKi8KKwl1aW50OF90IGlkMzsJCS8qIDMgKi8KKwl1aW50OF90IHZlcnNpb247CS8qIDQgKi8KKworCXN0cnVjdCB7CisJCXVpbnQ4X3QgYmlvc19jb25maWd1cmF0aW9uX21vZGU6MjsKKwkJdWludDhfdCBiaW9zX2Rpc2FibGU6MTsKKwkJdWludDhfdCBzZWxlY3RhYmxlX3Njc2lfYm9vdF9lbmFibGU6MTsKKwkJdWludDhfdCBjZF9yb21fYm9vdF9lbmFibGU6MTsKKwkJdWludDhfdCBkaXNhYmxlX2xvYWRpbmdfcmlzY19jb2RlOjE7CisJCXVpbnQ4X3QgZW5hYmxlXzY0Yml0X2FkZHJlc3Npbmc6MTsKKwkJdWludDhfdCB1bnVzZWRfNzoxOworCX0gY250cl9mbGFnc18xOwkJLyogNSAqLworCisJc3RydWN0IHsKKwkJdWludDhfdCBib290X2x1bl9udW1iZXI6NTsKKwkJdWludDhfdCBzY3NpX2J1c19udW1iZXI6MTsKKwkJdWludDhfdCB1bnVzZWRfNjoxOworCQl1aW50OF90IHVudXNlZF83OjE7CisJfSBjbnRyX2ZsYWdzXzJsOwkvKiA3ICovCisKKwlzdHJ1Y3QgeworCQl1aW50OF90IGJvb3RfdGFyZ2V0X251bWJlcjo0OworCQl1aW50OF90IHVudXNlZF8xMjoxOworCQl1aW50OF90IHVudXNlZF8xMzoxOworCQl1aW50OF90IHVudXNlZF8xNDoxOworCQl1aW50OF90IHVudXNlZF8xNToxOworCX0gY250cl9mbGFnc18yaDsJLyogOCAqLworCisJdWludDE2X3QgdW51c2VkXzg7CS8qIDgsIDkgKi8KKwl1aW50MTZfdCB1bnVzZWRfMTA7CS8qIDEwLCAxMSAqLworCXVpbnQxNl90IHVudXNlZF8xMjsJLyogMTIsIDEzICovCisJdWludDE2X3QgdW51c2VkXzE0OwkvKiAxNCwgMTUgKi8KKworCXVuaW9uIHsKKwkJdWludDhfdCBjOworCQlzdHJ1Y3QgeworCQkJdWludDhfdCByZXNlcnZlZDoyOworCQkJdWludDhfdCBidXJzdF9lbmFibGU6MTsKKwkJCXVpbnQ4X3QgcmVzZXJ2ZWRfMToxOworCQkJdWludDhfdCBmaWZvX3RocmVzaG9sZDo0OworCQl9IGY7CisJfSBpc3BfY29uZmlnOwkJLyogMTYgKi8KKworCS8qIFRlcm1pbmF0aW9uCisJICogMCA9IERpc2FibGUsIDEgPSBoaWdoIG9ubHksIDMgPSBBdXRvIHRlcm0KKwkgKi8KKwl1bmlvbiB7CisJCXVpbnQ4X3QgYzsKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3Qgc2NzaV9idXNfMV9jb250cm9sOjI7CisJCQl1aW50OF90IHNjc2lfYnVzXzBfY29udHJvbDoyOworCQkJdWludDhfdCB1bnVzZWRfMDoxOworCQkJdWludDhfdCB1bnVzZWRfMToxOworCQkJdWludDhfdCB1bnVzZWRfMjoxOworCQkJdWludDhfdCBhdXRvX3Rlcm1fc3VwcG9ydDoxOworCQl9IGY7CisJfSB0ZXJtaW5hdGlvbjsJCS8qIDE3ICovCisKKwl1aW50MTZfdCBpc3BfcGFyYW1ldGVyOwkvKiAxOCwgMTkgKi8KKworCXVuaW9uIHsKKwkJdWludDE2X3QgdzsKKwkJc3RydWN0IHsKKwkJCXVpbnQxNl90IGVuYWJsZV9mYXN0X3Bvc3Rpbmc6MTsKKwkJCXVpbnQxNl90IHJlcG9ydF9sdmRfYnVzX3RyYW5zaXRpb246MTsKKwkJCXVpbnQxNl90IHVudXNlZF8yOjE7CisJCQl1aW50MTZfdCB1bnVzZWRfMzoxOworCQkJdWludDE2X3QgZGlzYWJsZV9pb3Nic193aXRoX2J1c19yZXNldF9zdGF0dXM6MTsKKwkJCXVpbnQxNl90IGRpc2FibGVfc3luY2hyb25vdXNfYmFja29mZjoxOworCQkJdWludDE2X3QgdW51c2VkXzY6MTsKKwkJCXVpbnQxNl90IHN5bmNocm9ub3VzX2JhY2tvZmZfcmVwb3J0aW5nOjE7CisJCQl1aW50MTZfdCBkaXNhYmxlX3Jlc2VsZWN0aW9uX2ZhaXJuZXNzOjE7CisJCQl1aW50MTZfdCB1bnVzZWRfOToxOworCQkJdWludDE2X3QgdW51c2VkXzEwOjE7CisJCQl1aW50MTZfdCB1bnVzZWRfMTE6MTsKKwkJCXVpbnQxNl90IHVudXNlZF8xMjoxOworCQkJdWludDE2X3QgdW51c2VkXzEzOjE7CisJCQl1aW50MTZfdCB1bnVzZWRfMTQ6MTsKKwkJCXVpbnQxNl90IHVudXNlZF8xNToxOworCQl9IGY7CisJfSBmaXJtd2FyZV9mZWF0dXJlOwkvKiAyMCwgMjEgKi8KKworCXVpbnQxNl90IHVudXNlZF8yMjsJLyogMjIsIDIzICovCisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBpbml0aWF0b3JfaWQ6NDsKKwkJCXVpbnQ4X3Qgc2NzaV9yZXNldF9kaXNhYmxlOjE7CisJCQl1aW50OF90IHNjc2lfYnVzX3NpemU6MTsKKwkJCXVpbnQ4X3Qgc2NzaV9idXNfdHlwZToxOworCQkJdWludDhfdCB1bnVzZWRfNzoxOworCQl9IGNvbmZpZ18xOwkvKiAyNCAqLworCisJCXVpbnQ4X3QgYnVzX3Jlc2V0X2RlbGF5OwkvKiAyNSAqLworCQl1aW50OF90IHJldHJ5X2NvdW50OwkvKiAyNiAqLworCQl1aW50OF90IHJldHJ5X2RlbGF5OwkvKiAyNyAqLworCisJCXN0cnVjdCB7CisJCQl1aW50OF90IGFzeW5jX2RhdGFfc2V0dXBfdGltZTo0OworCQkJdWludDhfdCByZXFfYWNrX2FjdGl2ZV9uZWdhdGlvbjoxOworCQkJdWludDhfdCBkYXRhX2xpbmVfYWN0aXZlX25lZ2F0aW9uOjE7CisJCQl1aW50OF90IHVudXNlZF82OjE7CisJCQl1aW50OF90IHVudXNlZF83OjE7CisJCX0gY29uZmlnXzI7CS8qIDI4ICovCisKKwkJdWludDhfdCB1bnVzZWRfMjk7CS8qIDI5ICovCisKKwkJdWludDE2X3Qgc2VsZWN0aW9uX3RpbWVvdXQ7CS8qIDMwLCAzMSAqLworCQl1aW50MTZfdCBtYXhfcXVldWVfZGVwdGg7CS8qIDMyLCAzMyAqLworCisJCXVpbnQxNl90IHVudXNlZF8zNDsJLyogMzQsIDM1ICovCisJCXVpbnQxNl90IHVudXNlZF8zNjsJLyogMzYsIDM3ICovCisJCXVpbnQxNl90IHVudXNlZF8zODsJLyogMzgsIDM5ICovCisKKwkJc3RydWN0IHsKKwkJCXVuaW9uIHsKKwkJCQl1aW50OF90IGM7CisJCQkJc3RydWN0IHsKKwkJCQkJdWludDhfdCByZW5lZ290aWF0ZV9vbl9lcnJvcjoxOworCQkJCQl1aW50OF90IHN0b3BfcXVldWVfb25fY2hlY2s6MTsKKwkJCQkJdWludDhfdCBhdXRvX3JlcXVlc3Rfc2Vuc2U6MTsKKwkJCQkJdWludDhfdCB0YWdfcXVldWluZzoxOworCQkJCQl1aW50OF90IGVuYWJsZV9zeW5jOjE7CisJCQkJCXVpbnQ4X3QgZW5hYmxlX3dpZGU6MTsKKwkJCQkJdWludDhfdCBwYXJpdHlfY2hlY2tpbmc6MTsKKwkJCQkJdWludDhfdCBkaXNjb25uZWN0X2FsbG93ZWQ6MTsKKwkJCQl9IGY7CisJCQl9IHBhcmFtZXRlcjsJLyogNDAgKi8KKworCQkJdWludDhfdCBleGVjdXRpb25fdGhyb3R0bGU7CS8qIDQxICovCisJCQl1aW50OF90IHN5bmNfcGVyaW9kOwkvKiA0MiAqLworCisJCQl1bmlvbiB7CQkvKiA0MyAqLworCQkJCXVpbnQ4X3QgZmxhZ3NfNDM7CisJCQkJc3RydWN0IHsKKwkJCQkJdWludDhfdCBzeW5jX29mZnNldDo0OworCQkJCQl1aW50OF90IGRldmljZV9lbmFibGU6MTsKKwkJCQkJdWludDhfdCBsdW5fZGlzYWJsZToxOworCQkJCQl1aW50OF90IHVudXNlZF82OjE7CisJCQkJCXVpbnQ4X3QgdW51c2VkXzc6MTsKKwkJCQl9IGZsYWdzMXg4MDsKKwkJCQlzdHJ1Y3QgeworCQkJCQl1aW50OF90IHN5bmNfb2Zmc2V0OjU7CisJCQkJCXVpbnQ4X3QgZGV2aWNlX2VuYWJsZToxOworCQkJCQl1aW50OF90IHVudXNlZF82OjE7CisJCQkJCXVpbnQ4X3QgdW51c2VkXzc6MTsKKwkJCQl9IGZsYWdzMXgxNjA7CisJCQl9IGZsYWdzOworCQkJdW5pb24gewkvKiBQUFIgZmxhZ3MgZm9yIHRoZSAxeDE2MCBjb250cm9sbGVycyAqLworCQkJCXVpbnQ4X3QgdW51c2VkXzQ0OworCQkJCXN0cnVjdCB7CisJCQkJCXVpbnQ4X3QgcHByX29wdGlvbnM6NDsKKwkJCQkJdWludDhfdCBwcHJfYnVzX3dpZHRoOjI7CisJCQkJCXVpbnQ4X3QgdW51c2VkXzg6MTsKKwkJCQkJdWludDhfdCBlbmFibGVfcHByOjE7CisJCQkJfSBmbGFnczsJLyogNDQgKi8KKwkJCX0gcHByXzF4MTYwOworCQkJdWludDhfdCB1bnVzZWRfNDU7CS8qIDQ1ICovCisJCX0gdGFyZ2V0W01BWF9UQVJHRVRTXTsKKwl9IGJ1c1tNQVhfQlVTRVNdOworCisJdWludDE2X3QgdW51c2VkXzI0ODsJLyogMjQ4LCAyNDkgKi8KKworCXVpbnQxNl90IHN1YnN5c3RlbV9pZFsyXTsJLyogMjUwLCAyNTEsIDI1MiwgMjUzICovCisKKwl1bmlvbiB7CQkJCS8qIDI1NCAqLworCQl1aW50OF90IHVudXNlZF8yNTQ7CisJCXVpbnQ4X3Qgc3lzdGVtX2lkX3BvaW50ZXI7CisJfSBzeXNpZF8xeDE2MDsKKworCXVpbnQ4X3QgY2hrc3VtOwkJLyogMjU1ICovCit9OworCisvKgorICogSVNQIHF1ZXVlIC0gY29tbWFuZCBlbnRyeSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworI2RlZmluZSBNQVhfQ01EU1oJMTIJCS8qIFNDU0kgbWF4aW11bSBDREIgc2l6ZS4gKi8KK3N0cnVjdCBjbWRfZW50cnkgeworCXVpbnQ4X3QgZW50cnlfdHlwZTsJCS8qIEVudHJ5IHR5cGUuICovCisjZGVmaW5lIENPTU1BTkRfVFlQRSAgICAxCQkvKiBDb21tYW5kIGVudHJ5ICovCisJdWludDhfdCBlbnRyeV9jb3VudDsJCS8qIEVudHJ5IGNvdW50LiAqLworCXVpbnQ4X3Qgc3lzX2RlZmluZTsJCS8qIFN5c3RlbSBkZWZpbmVkLiAqLworCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkJLyogRW50cnkgU3RhdHVzLiAqLworCXVpbnQzMl90IGhhbmRsZTsJCS8qIFN5c3RlbSBoYW5kbGUuICovCisJdWludDhfdCBsdW47CQkJLyogU0NTSSBMVU4gKi8KKwl1aW50OF90IHRhcmdldDsJCQkvKiBTQ1NJIElEICovCisJdWludDE2X3QgY2RiX2xlbjsJCS8qIFNDU0kgY29tbWFuZCBsZW5ndGguICovCisJdWludDE2X3QgY29udHJvbF9mbGFnczsJCS8qIENvbnRyb2wgZmxhZ3MuICovCisJdWludDE2X3QgcmVzZXJ2ZWQ7CisJdWludDE2X3QgdGltZW91dDsJCS8qIENvbW1hbmQgdGltZW91dC4gKi8KKwl1aW50MTZfdCBkc2VnX2NvdW50OwkJLyogRGF0YSBzZWdtZW50IGNvdW50LiAqLworCXVpbnQ4X3Qgc2NzaV9jZGJbTUFYX0NNRFNaXTsJLyogU0NTSSBjb21tYW5kIHdvcmRzLiAqLworCXVpbnQzMl90IGRzZWdfMF9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMF9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ18xX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAxIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18xX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAxIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzJfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDIgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzJfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDIgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfM19hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMyBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfM19sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMyBsZW5ndGguICovCit9OworCisvKgorICogSVNQIHF1ZXVlIC0gY29udGludWF0aW9uIGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCitzdHJ1Y3QgY29udF9lbnRyeSB7CisJdWludDhfdCBlbnRyeV90eXBlOwkJLyogRW50cnkgdHlwZS4gKi8KKyNkZWZpbmUgQ09OVElOVUVfVFlQRSAgIDIJCS8qIENvbnRpbnVhdGlvbiBlbnRyeS4gKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCBzeXNfZGVmaW5lOwkJLyogU3lzdGVtIGRlZmluZWQuICovCisJdWludDhfdCBlbnRyeV9zdGF0dXM7CQkvKiBFbnRyeSBTdGF0dXMuICovCisJdWludDMyX3QgcmVzZXJ2ZWQ7CQkvKiBSZXNlcnZlZCAqLworCXVpbnQzMl90IGRzZWdfMF9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMF9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ18xX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAxIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18xX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAxIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzJfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDIgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzJfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDIgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfM19hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMyBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfM19sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMyBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ180X2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCA0IGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ180X2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCA0IGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzVfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDUgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzVfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDUgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfNl9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgNiBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfNl9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgNiBsZW5ndGguICovCit9OworCisvKgorICogSVNQIHF1ZXVlIC0gc3RhdHVzIGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCitzdHJ1Y3QgcmVzcG9uc2UgeworCXVpbnQ4X3QgZW50cnlfdHlwZTsJLyogRW50cnkgdHlwZS4gKi8KKyNkZWZpbmUgU1RBVFVTX1RZUEUgICAgIDMJLyogU3RhdHVzIGVudHJ5LiAqLworCXVpbnQ4X3QgZW50cnlfY291bnQ7CS8qIEVudHJ5IGNvdW50LiAqLworCXVpbnQ4X3Qgc3lzX2RlZmluZTsJLyogU3lzdGVtIGRlZmluZWQuICovCisJdWludDhfdCBlbnRyeV9zdGF0dXM7CS8qIEVudHJ5IFN0YXR1cy4gKi8KKyNkZWZpbmUgUkZfQ09OVCAgICAgICAgIEJJVF8wCS8qIENvbnRpbnVhdGlvbi4gKi8KKyNkZWZpbmUgUkZfRlVMTCAgICAgICAgIEJJVF8xCS8qIEZ1bGwgKi8KKyNkZWZpbmUgUkZfQkFEX0hFQURFUiAgIEJJVF8yCS8qIEJhZCBoZWFkZXIuICovCisjZGVmaW5lIFJGX0JBRF9QQVlMT0FEICBCSVRfMwkvKiBCYWQgcGF5bG9hZC4gKi8KKwl1aW50MzJfdCBoYW5kbGU7CS8qIFN5c3RlbSBoYW5kbGUuICovCisJdWludDE2X3Qgc2NzaV9zdGF0dXM7CS8qIFNDU0kgc3RhdHVzLiAqLworCXVpbnQxNl90IGNvbXBfc3RhdHVzOwkvKiBDb21wbGV0aW9uIHN0YXR1cy4gKi8KKwl1aW50MTZfdCBzdGF0ZV9mbGFnczsJLyogU3RhdGUgZmxhZ3MuICovCisjZGVmaW5lIFNGX1RSQU5TRkVSX0NNUEwgQklUXzE0CS8qIFRyYW5zZmVyIENvbXBsZXRlLiAqLworI2RlZmluZSBTRl9HT1RfU0VOU0UgICAgQklUXzEzCS8qIEdvdCBTZW5zZSAqLworI2RlZmluZSBTRl9HT1RfU1RBVFVTICAgIEJJVF8xMgkvKiBHb3QgU3RhdHVzICovCisjZGVmaW5lIFNGX1RSQU5TRkVSUkVEX0RBVEEgQklUXzExCS8qIFRyYW5zZmVycmVkIGRhdGEgKi8KKyNkZWZpbmUgU0ZfU0VOVF9DREIgICBCSVRfMTAJLyogU2VuZCBDREIgKi8KKyNkZWZpbmUgU0ZfR09UX1RBUkdFVCAgQklUXzkJLyogICovCisjZGVmaW5lIFNGX0dPVF9CVVMgICAgIEJJVF84CS8qICAqLworCXVpbnQxNl90IHN0YXR1c19mbGFnczsJLyogU3RhdHVzIGZsYWdzLiAqLworCXVpbnQxNl90IHRpbWU7CQkvKiBUaW1lLiAqLworCXVpbnQxNl90IHJlcV9zZW5zZV9sZW5ndGg7CS8qIFJlcXVlc3Qgc2Vuc2UgZGF0YSBsZW5ndGguICovCisJdWludDMyX3QgcmVzaWR1YWxfbGVuZ3RoOwkvKiBSZXNpZHVhbCB0cmFuc2ZlciBsZW5ndGguICovCisJdWludDE2X3QgcmVzZXJ2ZWRbNF07CisJdWludDhfdCByZXFfc2Vuc2VfZGF0YVszMl07CS8qIFJlcXVlc3Qgc2Vuc2UgZGF0YS4gKi8KK307CisKKy8qCisgKiBJU1AgcXVldWUgLSBtYXJrZXIgZW50cnkgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KK3N0cnVjdCBtcmtfZW50cnkgeworCXVpbnQ4X3QgZW50cnlfdHlwZTsJLyogRW50cnkgdHlwZS4gKi8KKyNkZWZpbmUgTUFSS0VSX1RZUEUgICAgIDQJLyogTWFya2VyIGVudHJ5LiAqLworCXVpbnQ4X3QgZW50cnlfY291bnQ7CS8qIEVudHJ5IGNvdW50LiAqLworCXVpbnQ4X3Qgc3lzX2RlZmluZTsJLyogU3lzdGVtIGRlZmluZWQuICovCisJdWludDhfdCBlbnRyeV9zdGF0dXM7CS8qIEVudHJ5IFN0YXR1cy4gKi8KKwl1aW50MzJfdCByZXNlcnZlZDsKKwl1aW50OF90IGx1bjsJCS8qIFNDU0kgTFVOICovCisJdWludDhfdCB0YXJnZXQ7CQkvKiBTQ1NJIElEICovCisJdWludDhfdCBtb2RpZmllcjsJLyogTW9kaWZpZXIgKDctMCkuICovCisjZGVmaW5lIE1LX1NZTkNfSURfTFVOICAgICAgMAkvKiBTeW5jaHJvbml6ZSBJRC9MVU4gKi8KKyNkZWZpbmUgTUtfU1lOQ19JRCAgICAgICAgICAxCS8qIFN5bmNocm9uaXplIElEICovCisjZGVmaW5lIE1LX1NZTkNfQUxMICAgICAgICAgMgkvKiBTeW5jaHJvbml6ZSBhbGwgSUQvTFVOICovCisJdWludDhfdCByZXNlcnZlZF8xWzUzXTsKK307CisKKy8qCisgKiBJU1AgcXVldWUgLSBleHRlbmRlZCBjb21tYW5kIGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICoKKyAqIFVudXNlZCBieSB0aGUgZHJpdmVyIQorICovCitzdHJ1Y3QgZWNtZF9lbnRyeSB7CisJdWludDhfdCBlbnRyeV90eXBlOwkvKiBFbnRyeSB0eXBlLiAqLworI2RlZmluZSBFWFRFTkRFRF9DTURfVFlQRSAgNQkvKiBFeHRlbmRlZCBjb21tYW5kIGVudHJ5LiAqLworCXVpbnQ4X3QgZW50cnlfY291bnQ7CS8qIEVudHJ5IGNvdW50LiAqLworCXVpbnQ4X3Qgc3lzX2RlZmluZTsJLyogU3lzdGVtIGRlZmluZWQuICovCisJdWludDhfdCBlbnRyeV9zdGF0dXM7CS8qIEVudHJ5IFN0YXR1cy4gKi8KKwl1aW50MzJfdCBoYW5kbGU7CS8qIFN5c3RlbSBoYW5kbGUuICovCisJdWludDhfdCBsdW47CQkvKiBTQ1NJIExVTiAqLworCXVpbnQ4X3QgdGFyZ2V0OwkJLyogU0NTSSBJRCAqLworCXVpbnQxNl90IGNkYl9sZW47CS8qIFNDU0kgY29tbWFuZCBsZW5ndGguICovCisJdWludDE2X3QgY29udHJvbF9mbGFnczsJLyogQ29udHJvbCBmbGFncy4gKi8KKwl1aW50MTZfdCByZXNlcnZlZDsKKwl1aW50MTZfdCB0aW1lb3V0OwkvKiBDb21tYW5kIHRpbWVvdXQuICovCisJdWludDE2X3QgZHNlZ19jb3VudDsJLyogRGF0YSBzZWdtZW50IGNvdW50LiAqLworCXVpbnQ4X3Qgc2NzaV9jZGJbODhdOwkvKiBTQ1NJIGNvbW1hbmQgd29yZHMuICovCit9OworCisvKgorICogSVNQIHF1ZXVlIC0gNjQtQml0IGFkZHJlc3NpbmcsIGNvbW1hbmQgZW50cnkgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IGVudHJ5X3R5cGU7CS8qIEVudHJ5IHR5cGUuICovCisjZGVmaW5lIENPTU1BTkRfQTY0X1RZUEUgOQkvKiBDb21tYW5kIEE2NCBlbnRyeSAqLworCXVpbnQ4X3QgZW50cnlfY291bnQ7CS8qIEVudHJ5IGNvdW50LiAqLworCXVpbnQ4X3Qgc3lzX2RlZmluZTsJLyogU3lzdGVtIGRlZmluZWQuICovCisJdWludDhfdCBlbnRyeV9zdGF0dXM7CS8qIEVudHJ5IFN0YXR1cy4gKi8KKwl1aW50MzJfdCBoYW5kbGU7CS8qIFN5c3RlbSBoYW5kbGUuICovCisJdWludDhfdCBsdW47CQkvKiBTQ1NJIExVTiAqLworCXVpbnQ4X3QgdGFyZ2V0OwkJLyogU0NTSSBJRCAqLworCXVpbnQxNl90IGNkYl9sZW47CS8qIFNDU0kgY29tbWFuZCBsZW5ndGguICovCisJdWludDE2X3QgY29udHJvbF9mbGFnczsJLyogQ29udHJvbCBmbGFncy4gKi8KKwl1aW50MTZfdCByZXNlcnZlZDsKKwl1aW50MTZfdCB0aW1lb3V0OwkvKiBDb21tYW5kIHRpbWVvdXQuICovCisJdWludDE2X3QgZHNlZ19jb3VudDsJLyogRGF0YSBzZWdtZW50IGNvdW50LiAqLworCXVpbnQ4X3Qgc2NzaV9jZGJbTUFYX0NNRFNaXTsJLyogU0NTSSBjb21tYW5kIHdvcmRzLiAqLworCXVpbnQzMl90IHJlc2VydmVkXzFbMl07CS8qIHVudXNlZCAqLworCXVpbnQzMl90IGRzZWdfMF9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMF9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzFfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzFfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMSBsZW5ndGguICovCit9IGNtZF9hNjRfZW50cnlfdCwgcmVxdWVzdF90OworCisvKgorICogSVNQIHF1ZXVlIC0gNjQtQml0IGFkZHJlc3NpbmcsIGNvbnRpbnVhdGlvbiBlbnRyeSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworc3RydWN0IGNvbnRfYTY0X2VudHJ5IHsKKwl1aW50OF90IGVudHJ5X3R5cGU7CS8qIEVudHJ5IHR5cGUuICovCisjZGVmaW5lIENPTlRJTlVFX0E2NF9UWVBFIDB4QQkvKiBDb250aW51YXRpb24gQTY0IGVudHJ5LiAqLworCXVpbnQ4X3QgZW50cnlfY291bnQ7CS8qIEVudHJ5IGNvdW50LiAqLworCXVpbnQ4X3Qgc3lzX2RlZmluZTsJLyogU3lzdGVtIGRlZmluZWQuICovCisJdWludDhfdCBlbnRyeV9zdGF0dXM7CS8qIEVudHJ5IFN0YXR1cy4gKi8KKwl1aW50MzJfdCBkc2VnXzBfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDAgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzBfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ18xX2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCAxIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18xX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfMl9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMiBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMl9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAyIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzNfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDMgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzNfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMyBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ180X2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCA0IGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ180X2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDQgbGVuZ3RoLiAqLworfTsKKworLyoKKyAqIElTUCBxdWV1ZSAtIGVuYWJsZSBMVU4gZW50cnkgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KK3N0cnVjdCBlbHVuX2VudHJ5IHsKKwl1aW50OF90IGVudHJ5X3R5cGU7CS8qIEVudHJ5IHR5cGUuICovCisjZGVmaW5lIEVOQUJMRV9MVU5fVFlQRSAweEIJLyogRW5hYmxlIExVTiBlbnRyeS4gKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkvKiBFbnRyeSBjb3VudC4gKi8KKwl1aW50OF90IHJlc2VydmVkXzE7CisJdWludDhfdCBlbnRyeV9zdGF0dXM7CS8qIEVudHJ5IFN0YXR1cyBub3QgdXNlZC4gKi8KKwl1aW50MzJfdCByZXNlcnZlZF8yOworCXVpbnQxNl90IGx1bjsJCS8qIEJpdCAxNSBpcyBidXMgbnVtYmVyLiAqLworCXVpbnQxNl90IHJlc2VydmVkXzQ7CisJdWludDMyX3Qgb3B0aW9uX2ZsYWdzOworCXVpbnQ4X3Qgc3RhdHVzOworCXVpbnQ4X3QgcmVzZXJ2ZWRfNTsKKwl1aW50OF90IGNvbW1hbmRfY291bnQ7CS8qIE51bWJlciBvZiBBVElPcyBhbGxvY2F0ZWQuICovCisJdWludDhfdCBpbW1lZF9ub3RpZnlfY291bnQ7CS8qIE51bWJlciBvZiBJbW1lZGlhdGUgTm90aWZ5ICovCisJLyogZW50cmllcyBhbGxvY2F0ZWQuICovCisJdWludDhfdCBncm91cF82X2xlbmd0aDsJLyogU0NTSSBDREIgbGVuZ3RoIGZvciBncm91cCA2ICovCisJLyogY29tbWFuZHMgKDItMjYpLiAqLworCXVpbnQ4X3QgZ3JvdXBfN19sZW5ndGg7CS8qIFNDU0kgQ0RCIGxlbmd0aCBmb3IgZ3JvdXAgNyAqLworCS8qIGNvbW1hbmRzICgyLTI2KS4gKi8KKwl1aW50MTZfdCB0aW1lb3V0OwkvKiAwID0gMzAgc2Vjb25kcywgMHhGRkZGID0gZGlzYWJsZSAqLworCXVpbnQxNl90IHJlc2VydmVkXzZbMjBdOworfTsKKworLyoKKyAqIElTUCBxdWV1ZSAtIG1vZGlmeSBMVU4gZW50cnkgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKgorICogVW51c2VkIGJ5IHRoZSBkcml2ZXIhCisgKi8KK3N0cnVjdCBtb2RpZnlfbHVuX2VudHJ5IHsKKwl1aW50OF90IGVudHJ5X3R5cGU7CS8qIEVudHJ5IHR5cGUuICovCisjZGVmaW5lIE1PRElGWV9MVU5fVFlQRSAweEMJLyogTW9kaWZ5IExVTiBlbnRyeS4gKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkvKiBFbnRyeSBjb3VudC4gKi8KKwl1aW50OF90IHJlc2VydmVkXzE7CisJdWludDhfdCBlbnRyeV9zdGF0dXM7CS8qIEVudHJ5IFN0YXR1cy4gKi8KKwl1aW50MzJfdCByZXNlcnZlZF8yOworCXVpbnQ4X3QgbHVuOwkJLyogU0NTSSBMVU4gKi8KKwl1aW50OF90IHJlc2VydmVkXzM7CisJdWludDhfdCBvcGVyYXRvcnM7CisJdWludDhfdCByZXNlcnZlZF80OworCXVpbnQzMl90IG9wdGlvbl9mbGFnczsKKwl1aW50OF90IHN0YXR1czsKKwl1aW50OF90IHJlc2VydmVkXzU7CisJdWludDhfdCBjb21tYW5kX2NvdW50OwkvKiBOdW1iZXIgb2YgQVRJT3MgYWxsb2NhdGVkLiAqLworCXVpbnQ4X3QgaW1tZWRfbm90aWZ5X2NvdW50OwkvKiBOdW1iZXIgb2YgSW1tZWRpYXRlIE5vdGlmeSAqLworCS8qIGVudHJpZXMgYWxsb2NhdGVkLiAqLworCXVpbnQxNl90IHJlc2VydmVkXzY7CisJdWludDE2X3QgdGltZW91dDsJLyogMCA9IDMwIHNlY29uZHMsIDB4RkZGRiA9IGRpc2FibGUgKi8KKwl1aW50MTZfdCByZXNlcnZlZF83WzIwXTsKK307CisKKy8qCisgKiBJU1AgcXVldWUgLSBpbW1lZGlhdGUgbm90aWZ5IGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCitzdHJ1Y3Qgbm90aWZ5X2VudHJ5IHsKKwl1aW50OF90IGVudHJ5X3R5cGU7CS8qIEVudHJ5IHR5cGUuICovCisjZGVmaW5lIElNTUVEX05PVElGWV9UWVBFIDB4RAkvKiBJbW1lZGlhdGUgbm90aWZ5IGVudHJ5LiAqLworCXVpbnQ4X3QgZW50cnlfY291bnQ7CS8qIEVudHJ5IGNvdW50LiAqLworCXVpbnQ4X3QgcmVzZXJ2ZWRfMTsKKwl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzLiAqLworCXVpbnQzMl90IHJlc2VydmVkXzI7CisJdWludDhfdCBsdW47CisJdWludDhfdCBpbml0aWF0b3JfaWQ7CisJdWludDhfdCByZXNlcnZlZF8zOworCXVpbnQ4X3QgdGFyZ2V0X2lkOworCXVpbnQzMl90IG9wdGlvbl9mbGFnczsKKwl1aW50OF90IHN0YXR1czsKKwl1aW50OF90IHJlc2VydmVkXzQ7CisJdWludDhfdCB0YWdfdmFsdWU7CS8qIFJlY2VpdmVkIHF1ZXVlIHRhZyBtZXNzYWdlIHZhbHVlICovCisJdWludDhfdCB0YWdfdHlwZTsJLyogUmVjZWl2ZWQgcXVldWUgdGFnIG1lc3NhZ2UgdHlwZSAqLworCS8qIGVudHJpZXMgYWxsb2NhdGVkLiAqLworCXVpbnQxNl90IHNlcV9pZDsKKwl1aW50OF90IHNjc2lfbXNnWzhdOwkvKiBTQ1NJIG1lc3NhZ2Ugbm90IGhhbmRsZWQgYnkgSVNQICovCisJdWludDE2X3QgcmVzZXJ2ZWRfNVs4XTsKKwl1aW50OF90IHNlbnNlX2RhdGFbMThdOworfTsKKworLyoKKyAqIElTUCBxdWV1ZSAtIG5vdGlmeSBhY2tub3dsZWRnZSBlbnRyeSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworc3RydWN0IG5hY2tfZW50cnkgeworCXVpbnQ4X3QgZW50cnlfdHlwZTsJLyogRW50cnkgdHlwZS4gKi8KKyNkZWZpbmUgTk9USUZZX0FDS19UWVBFIDB4RQkvKiBOb3RpZnkgYWNrbm93bGVkZ2UgZW50cnkuICovCisJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCByZXNlcnZlZF8xOworCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkvKiBFbnRyeSBTdGF0dXMuICovCisJdWludDMyX3QgcmVzZXJ2ZWRfMjsKKwl1aW50OF90IGx1bjsKKwl1aW50OF90IGluaXRpYXRvcl9pZDsKKwl1aW50OF90IHJlc2VydmVkXzM7CisJdWludDhfdCB0YXJnZXRfaWQ7CisJdWludDMyX3Qgb3B0aW9uX2ZsYWdzOworCXVpbnQ4X3Qgc3RhdHVzOworCXVpbnQ4X3QgZXZlbnQ7CisJdWludDE2X3Qgc2VxX2lkOworCXVpbnQxNl90IHJlc2VydmVkXzRbMjJdOworfTsKKworLyoKKyAqIElTUCBxdWV1ZSAtIEFjY2VwdCBUYXJnZXQgSS9PIChBVElPKSBlbnRyeSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworc3RydWN0IGF0aW9fZW50cnkgeworCXVpbnQ4X3QgZW50cnlfdHlwZTsJLyogRW50cnkgdHlwZS4gKi8KKyNkZWZpbmUgQUNDRVBUX1RHVF9JT19UWVBFIDYJLyogQWNjZXB0IHRhcmdldCBJL08gZW50cnkuICovCisJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCByZXNlcnZlZF8xOworCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkvKiBFbnRyeSBTdGF0dXMuICovCisJdWludDMyX3QgcmVzZXJ2ZWRfMjsKKwl1aW50OF90IGx1bjsKKwl1aW50OF90IGluaXRpYXRvcl9pZDsKKwl1aW50OF90IGNkYl9sZW47CisJdWludDhfdCB0YXJnZXRfaWQ7CisJdWludDMyX3Qgb3B0aW9uX2ZsYWdzOworCXVpbnQ4X3Qgc3RhdHVzOworCXVpbnQ4X3Qgc2NzaV9zdGF0dXM7CisJdWludDhfdCB0YWdfdmFsdWU7CS8qIFJlY2VpdmVkIHF1ZXVlIHRhZyBtZXNzYWdlIHZhbHVlICovCisJdWludDhfdCB0YWdfdHlwZTsJLyogUmVjZWl2ZWQgcXVldWUgdGFnIG1lc3NhZ2UgdHlwZSAqLworCXVpbnQ4X3QgY2RiWzI2XTsKKwl1aW50OF90IHNlbnNlX2RhdGFbMThdOworfTsKKworLyoKKyAqIElTUCBxdWV1ZSAtIENvbnRpbnVlIFRhcmdldCBJL08gKENUSU8pIGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCitzdHJ1Y3QgY3Rpb19lbnRyeSB7CisJdWludDhfdCBlbnRyeV90eXBlOwkvKiBFbnRyeSB0eXBlLiAqLworI2RlZmluZSBDT05USU5VRV9UR1RfSU9fVFlQRSA3CS8qIENUSU8gZW50cnkgKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkvKiBFbnRyeSBjb3VudC4gKi8KKwl1aW50OF90IHJlc2VydmVkXzE7CisJdWludDhfdCBlbnRyeV9zdGF0dXM7CS8qIEVudHJ5IFN0YXR1cy4gKi8KKwl1aW50MzJfdCByZXNlcnZlZF8yOworCXVpbnQ4X3QgbHVuOwkJLyogU0NTSSBMVU4gKi8KKwl1aW50OF90IGluaXRpYXRvcl9pZDsKKwl1aW50OF90IHJlc2VydmVkXzM7CisJdWludDhfdCB0YXJnZXRfaWQ7CisJdWludDMyX3Qgb3B0aW9uX2ZsYWdzOworCXVpbnQ4X3Qgc3RhdHVzOworCXVpbnQ4X3Qgc2NzaV9zdGF0dXM7CisJdWludDhfdCB0YWdfdmFsdWU7CS8qIFJlY2VpdmVkIHF1ZXVlIHRhZyBtZXNzYWdlIHZhbHVlICovCisJdWludDhfdCB0YWdfdHlwZTsJLyogUmVjZWl2ZWQgcXVldWUgdGFnIG1lc3NhZ2UgdHlwZSAqLworCXVpbnQzMl90IHRyYW5zZmVyX2xlbmd0aDsKKwl1aW50MzJfdCByZXNpZHVhbDsKKwl1aW50MTZfdCB0aW1lb3V0OwkvKiAwID0gMzAgc2Vjb25kcywgMHhGRkZGID0gZGlzYWJsZSAqLworCXVpbnQxNl90IGRzZWdfY291bnQ7CS8qIERhdGEgc2VnbWVudCBjb3VudC4gKi8KKwl1aW50MzJfdCBkc2VnXzBfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDAgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzBfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ18xX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAxIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18xX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfMl9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMiBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMl9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAyIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzNfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDMgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzNfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMyBsZW5ndGguICovCit9OworCisvKgorICogSVNQIHF1ZXVlIC0gQ1RJTyByZXR1cm5lZCBlbnRyeSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworc3RydWN0IGN0aW9fcmV0X2VudHJ5IHsKKwl1aW50OF90IGVudHJ5X3R5cGU7CS8qIEVudHJ5IHR5cGUuICovCisjZGVmaW5lIENUSU9fUkVUX1RZUEUgICA3CS8qIENUSU8gcmV0dXJuIGVudHJ5ICovCisJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCByZXNlcnZlZF8xOworCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkvKiBFbnRyeSBTdGF0dXMuICovCisJdWludDMyX3QgcmVzZXJ2ZWRfMjsKKwl1aW50OF90IGx1bjsJCS8qIFNDU0kgTFVOICovCisJdWludDhfdCBpbml0aWF0b3JfaWQ7CisJdWludDhfdCByZXNlcnZlZF8zOworCXVpbnQ4X3QgdGFyZ2V0X2lkOworCXVpbnQzMl90IG9wdGlvbl9mbGFnczsKKwl1aW50OF90IHN0YXR1czsKKwl1aW50OF90IHNjc2lfc3RhdHVzOworCXVpbnQ4X3QgdGFnX3ZhbHVlOwkvKiBSZWNlaXZlZCBxdWV1ZSB0YWcgbWVzc2FnZSB2YWx1ZSAqLworCXVpbnQ4X3QgdGFnX3R5cGU7CS8qIFJlY2VpdmVkIHF1ZXVlIHRhZyBtZXNzYWdlIHR5cGUgKi8KKwl1aW50MzJfdCB0cmFuc2Zlcl9sZW5ndGg7CisJdWludDMyX3QgcmVzaWR1YWw7CisJdWludDE2X3QgdGltZW91dDsJLyogMCA9IDMwIHNlY29uZHMsIDB4RkZGRiA9IGRpc2FibGUgKi8KKwl1aW50MTZfdCBkc2VnX2NvdW50OwkvKiBEYXRhIHNlZ21lbnQgY291bnQuICovCisJdWludDMyX3QgZHNlZ18wX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAwIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18wX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDAgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfMV9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMSBhZGRyZXNzLiAqLworCXVpbnQxNl90IGRzZWdfMV9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAxIGxlbmd0aC4gKi8KKwl1aW50OF90IHNlbnNlX2RhdGFbMThdOworfTsKKworLyoKKyAqIElTUCBxdWV1ZSAtIENUSU8gQTY0IGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCitzdHJ1Y3QgY3Rpb19hNjRfZW50cnkgeworCXVpbnQ4X3QgZW50cnlfdHlwZTsJLyogRW50cnkgdHlwZS4gKi8KKyNkZWZpbmUgQ1RJT19BNjRfVFlQRSAweEYJLyogQ1RJTyBBNjQgZW50cnkgKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkvKiBFbnRyeSBjb3VudC4gKi8KKwl1aW50OF90IHJlc2VydmVkXzE7CisJdWludDhfdCBlbnRyeV9zdGF0dXM7CS8qIEVudHJ5IFN0YXR1cy4gKi8KKwl1aW50MzJfdCByZXNlcnZlZF8yOworCXVpbnQ4X3QgbHVuOwkJLyogU0NTSSBMVU4gKi8KKwl1aW50OF90IGluaXRpYXRvcl9pZDsKKwl1aW50OF90IHJlc2VydmVkXzM7CisJdWludDhfdCB0YXJnZXRfaWQ7CisJdWludDMyX3Qgb3B0aW9uX2ZsYWdzOworCXVpbnQ4X3Qgc3RhdHVzOworCXVpbnQ4X3Qgc2NzaV9zdGF0dXM7CisJdWludDhfdCB0YWdfdmFsdWU7CS8qIFJlY2VpdmVkIHF1ZXVlIHRhZyBtZXNzYWdlIHZhbHVlICovCisJdWludDhfdCB0YWdfdHlwZTsJLyogUmVjZWl2ZWQgcXVldWUgdGFnIG1lc3NhZ2UgdHlwZSAqLworCXVpbnQzMl90IHRyYW5zZmVyX2xlbmd0aDsKKwl1aW50MzJfdCByZXNpZHVhbDsKKwl1aW50MTZfdCB0aW1lb3V0OwkvKiAwID0gMzAgc2Vjb25kcywgMHhGRkZGID0gZGlzYWJsZSAqLworCXVpbnQxNl90IGRzZWdfY291bnQ7CS8qIERhdGEgc2VnbWVudCBjb3VudC4gKi8KKwl1aW50MzJfdCByZXNlcnZlZF80WzJdOworCXVpbnQzMl90IGRzZWdfMF9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMF9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzFfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzFfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMSBsZW5ndGguICovCit9OworCisvKgorICogSVNQIHF1ZXVlIC0gQ1RJTyByZXR1cm5lZCBlbnRyeSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworc3RydWN0IGN0aW9fYTY0X3JldF9lbnRyeSB7CisJdWludDhfdCBlbnRyeV90eXBlOwkvKiBFbnRyeSB0eXBlLiAqLworI2RlZmluZSBDVElPX0E2NF9SRVRfVFlQRSAweEYJLyogQ1RJTyBBNjQgcmV0dXJuZWQgZW50cnkgKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkvKiBFbnRyeSBjb3VudC4gKi8KKwl1aW50OF90IHJlc2VydmVkXzE7CisJdWludDhfdCBlbnRyeV9zdGF0dXM7CS8qIEVudHJ5IFN0YXR1cy4gKi8KKwl1aW50MzJfdCByZXNlcnZlZF8yOworCXVpbnQ4X3QgbHVuOwkJLyogU0NTSSBMVU4gKi8KKwl1aW50OF90IGluaXRpYXRvcl9pZDsKKwl1aW50OF90IHJlc2VydmVkXzM7CisJdWludDhfdCB0YXJnZXRfaWQ7CisJdWludDMyX3Qgb3B0aW9uX2ZsYWdzOworCXVpbnQ4X3Qgc3RhdHVzOworCXVpbnQ4X3Qgc2NzaV9zdGF0dXM7CisJdWludDhfdCB0YWdfdmFsdWU7CS8qIFJlY2VpdmVkIHF1ZXVlIHRhZyBtZXNzYWdlIHZhbHVlICovCisJdWludDhfdCB0YWdfdHlwZTsJLyogUmVjZWl2ZWQgcXVldWUgdGFnIG1lc3NhZ2UgdHlwZSAqLworCXVpbnQzMl90IHRyYW5zZmVyX2xlbmd0aDsKKwl1aW50MzJfdCByZXNpZHVhbDsKKwl1aW50MTZfdCB0aW1lb3V0OwkvKiAwID0gMzAgc2Vjb25kcywgMHhGRkZGID0gZGlzYWJsZSAqLworCXVpbnQxNl90IGRzZWdfY291bnQ7CS8qIERhdGEgc2VnbWVudCBjb3VudC4gKi8KKwl1aW50MTZfdCByZXNlcnZlZF80WzddOworCXVpbnQ4X3Qgc2Vuc2VfZGF0YVsxOF07Cit9OworCisvKgorICogSVNQIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHF1ZXVlIGVudHJ5IHNpemVzCisgKi8KKyNkZWZpbmUgUkVTUE9OU0VfRU5UUllfU0laRQkoc2l6ZW9mKHN0cnVjdCByZXNwb25zZSkpCisjZGVmaW5lIFJFUVVFU1RfRU5UUllfU0laRQkoc2l6ZW9mKHJlcXVlc3RfdCkpCisKKy8qCisgKiBJU1Agc3RhdHVzIGVudHJ5IC0gY29tcGxldGlvbiBzdGF0dXMgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUgQ1NfQ09NUExFVEUgICAgICAgICAweDAJLyogTm8gZXJyb3JzICovCisjZGVmaW5lIENTX0lOQ09NUExFVEUgICAgICAgMHgxCS8qIEluY29tcGxldGUgdHJhbnNmZXIgb2YgY21kLiAqLworI2RlZmluZSBDU19ETUEgICAgICAgICAgICAgIDB4MgkvKiBBIERNQSBkaXJlY3Rpb24gZXJyb3IuICovCisjZGVmaW5lIENTX1RSQU5TUE9SVCAgICAgICAgMHgzCS8qIFRyYW5zcG9ydCBlcnJvci4gKi8KKyNkZWZpbmUgQ1NfUkVTRVQgICAgICAgICAgICAweDQJLyogU0NTSSBidXMgcmVzZXQgb2NjdXJyZWQgKi8KKyNkZWZpbmUgQ1NfQUJPUlRFRCAgICAgICAgICAweDUJLyogU3lzdGVtIGFib3J0ZWQgY29tbWFuZC4gKi8KKyNkZWZpbmUgQ1NfVElNRU9VVCAgICAgICAgICAweDYJLyogVGltZW91dCBlcnJvci4gKi8KKyNkZWZpbmUgQ1NfREFUQV9PVkVSUlVOICAgICAweDcJLyogRGF0YSBvdmVycnVuLiAqLworI2RlZmluZSBDU19DT01NQU5EX09WRVJSVU4gIDB4OAkvKiBDb21tYW5kIE92ZXJydW4uICovCisjZGVmaW5lIENTX1NUQVRVU19PVkVSUlVOICAgMHg5CS8qIFN0YXR1cyBPdmVycnVuLiAqLworI2RlZmluZSBDU19CQURfTVNHICAgICAgICAgIDB4QQkvKiBCYWQgbXNnIGFmdGVyIHN0YXR1cyBwaGFzZS4gKi8KKyNkZWZpbmUgQ1NfTk9fTVNHX09VVCAgICAgICAweEIJLyogTm8gbXNnIG91dCBhZnRlciBzZWxlY3Rpb24uICovCisjZGVmaW5lIENTX0VYVEVOREVEX0lEICAgICAgMHhDCS8qIEV4dGVuZGVkIElEIGZhaWxlZC4gKi8KKyNkZWZpbmUgQ1NfSURFX01TRyAgICAgICAgICAweEQJLyogVGFyZ2V0IHJlamVjdGVkIElERSBtc2cuICovCisjZGVmaW5lIENTX0FCT1JUX01TRyAgICAgICAgMHhFCS8qIFRhcmdldCByZWplY3RlZCBhYm9ydCBtc2cuICovCisjZGVmaW5lIENTX1JFSkVDVF9NU0cgICAgICAgMHhGCS8qIFRhcmdldCByZWplY3RlZCByZWplY3QgbXNnLiAqLworI2RlZmluZSBDU19OT1BfTVNHICAgICAgICAgIDB4MTAJLyogVGFyZ2V0IHJlamVjdGVkIE5PUCBtc2cuICovCisjZGVmaW5lIENTX1BBUklUWV9NU0cgICAgICAgMHgxMQkvKiBUYXJnZXQgcmVqZWN0ZWQgcGFyaXR5IG1zZy4gKi8KKyNkZWZpbmUgQ1NfREVWX1JFU0VUX01TRyAgICAweDEyCS8qIFRhcmdldCByZWplY3RlZCBkZXYgcnN0IG1zZy4gKi8KKyNkZWZpbmUgQ1NfSURfTVNHICAgICAgICAgICAweDEzCS8qIFRhcmdldCByZWplY3RlZCBJRCBtc2cuICovCisjZGVmaW5lIENTX0ZSRUUgICAgICAgICAgICAgMHgxNAkvKiBVbmV4cGVjdGVkIGJ1cyBmcmVlLiAqLworI2RlZmluZSBDU19EQVRBX1VOREVSUlVOICAgIDB4MTUJLyogRGF0YSBVbmRlcnJ1bi4gKi8KKyNkZWZpbmUgQ1NfVFJBTkFDVElPTl8xICAgICAweDE4CS8qIFRyYW5zYWN0aW9uIGVycm9yIDEgKi8KKyNkZWZpbmUgQ1NfVFJBTkFDVElPTl8yICAgICAweDE5CS8qIFRyYW5zYWN0aW9uIGVycm9yIDIgKi8KKyNkZWZpbmUgQ1NfVFJBTkFDVElPTl8zICAgICAweDFhCS8qIFRyYW5zYWN0aW9uIGVycm9yIDMgKi8KKyNkZWZpbmUgQ1NfSU5WX0VOVFJZX1RZUEUgICAweDFiCS8qIEludmFsaWQgZW50cnkgdHlwZSAqLworI2RlZmluZSBDU19ERVZfUVVFVUVfRlVMTCAgIDB4MWMJLyogRGV2aWNlIHF1ZXVlIGZ1bGwgKi8KKyNkZWZpbmUgQ1NfUEhBU0VEX1NLSVBQRUQgICAweDFkCS8qIFNDU0kgcGhhc2Ugc2tpcHBlZCAqLworI2RlZmluZSBDU19BUlNfRkFJTEVEICAgICAgIDB4MWUJLyogQVJTIGZhaWxlZCAqLworI2RlZmluZSBDU19MVkRfQlVTX0VSUk9SICAgIDB4MjEJLyogTFZEIGJ1cyBlcnJvciAqLworI2RlZmluZSBDU19CQURfUEFZTE9BRCAgICAgIDB4ODAJLyogRHJpdmVyIGRlZmluZWQgKi8KKyNkZWZpbmUgQ1NfVU5LTk9XTiAgICAgICAgICAweDgxCS8qIERyaXZlciBkZWZpbmVkICovCisjZGVmaW5lIENTX1JFVFJZICAgICAgICAgICAgMHg4MgkvKiBEcml2ZXIgZGVmaW5lZCAqLworCisvKgorICogSVNQIHN0YXR1cyBlbnRyeSAtIFNDU0kgc3RhdHVzIGJ5dGUgYml0IGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIFNTX0NIRUNLX0NPTkRJVElPTiAgQklUXzEKKyNkZWZpbmUgU1NfQ09ORElUSU9OX01FVCAgICBCSVRfMgorI2RlZmluZSBTU19CVVNZX0NPTkRJVElPTiAgIEJJVF8zCisjZGVmaW5lIFNTX1JFU0VSVkVfQ09ORkxJQ1QgKEJJVF80IHwgQklUXzMpCisKKy8qCisgKiBJU1AgdGFyZ2V0IGVudHJpZXMgLSBPcHRpb24gZmxhZ3MgYml0IGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIE9GX0VOQUJMRV9UQUcgICAgICAgQklUXzEJLyogVGFnZ2VkIHF1ZXVlIGFjdGlvbiBlbmFibGUgKi8KKyNkZWZpbmUgT0ZfREFUQV9JTiAgICAgICAgICBCSVRfNgkvKiBEYXRhIGluIHRvIGluaXRpYXRvciAqLworCQkJCQkvKiAgKGRhdGEgZnJvbSB0YXJnZXQgdG8gaW5pdGlhdG9yKSAqLworI2RlZmluZSBPRl9EQVRBX09VVCAgICAgICAgIEJJVF83CS8qIERhdGEgb3V0IGZyb20gaW5pdGlhdG9yICovCisJCQkJCS8qICAoZGF0YSBmcm9tIGluaXRpYXRvciB0byB0YXJnZXQpICovCisjZGVmaW5lIE9GX05PX0RBVEEgICAgICAgICAgKEJJVF83IHwgQklUXzYpCisjZGVmaW5lIE9GX0RJU0NfRElTQUJMRUQgICAgQklUXzE1CS8qIERpc2Nvbm5lY3RzIGRpc2FibGVkICovCisjZGVmaW5lIE9GX0RJU0FCTEVfU0RQICAgICAgQklUXzI0CS8qIERpc2FibGUgc2VuZGluZyBzYXZlIGRhdGEgcHRyICovCisjZGVmaW5lIE9GX1NFTkRfUkRQICAgICAgICAgQklUXzI2CS8qIFNlbmQgcmVzdG9yZSBkYXRhIHBvaW50ZXJzIG1zZyAqLworI2RlZmluZSBPRl9GT1JDRV9ESVNDICAgICAgIEJJVF8zMAkvKiBEaXNjb25uZWN0cyBtYW5kYXRvcnkgKi8KKyNkZWZpbmUgT0ZfU1NUUyAgICAgICAgICAgICBCSVRfMzEJLyogU2VuZCBTQ1NJIHN0YXR1cyAqLworCisKKy8qCisgKiBCVVMgcGFyYW1ldGVycy9zZXR0aW5ncyBzdHJ1Y3R1cmUgLSBVTlVTRUQKKyAqLworc3RydWN0IGJ1c19wYXJhbSB7CisJdWludDhfdCBpZDsJCS8qIEhvc3QgYWRhcHRlciBTQ1NJIGlkICovCisJdWludDhfdCBidXNfcmVzZXRfZGVsYXk7CS8qIFNDU0kgYnVzIHJlc2V0IGRlbGF5LiAqLworCXVpbnQ4X3QgZmFpbGVkX3Jlc2V0X2NvdW50OwkvKiBudW1iZXIgb2YgdGltZSByZXNldCBmYWlsZWQgKi8KKwl1aW50OF90IHVudXNlZDsKKwl1aW50MTZfdCBkZXZpY2VfZW5hYmxlczsJLyogRGV2aWNlIGVuYWJsZSBiaXRzLiAqLworCXVpbnQxNl90IGx1bl9kaXNhYmxlczsJLyogTFVOIGRpc2FibGUgYml0cy4gKi8KKwl1aW50MTZfdCBxdGFnX2VuYWJsZXM7CS8qIFRhZyBxdWV1ZSBlbmFibGVzLiAqLworCXVpbnQxNl90IGhpd2F0OwkJLyogSGlnaCB3YXRlciBtYXJrIHBlciBkZXZpY2UuICovCisJdWludDhfdCByZXNldF9tYXJrZXI6MTsKKwl1aW50OF90IGRpc2FibGVfc2NzaV9yZXNldDoxOworCXVpbnQ4X3Qgc2NzaV9idXNfZGVhZDoxOwkvKiBTQ1NJIEJ1cyBpcyBEZWFkLCB3aGVuIDUgYmFjayB0byBiYWNrIHJlc2V0cyBmYWlsZWQgKi8KK307CisKKworc3RydWN0IHFsYV9kcml2ZXJfc2V0dXAgeworCXVpbnQzMl90IG5vX3N5bmM6MTsKKwl1aW50MzJfdCBub193aWRlOjE7CisJdWludDMyX3Qgbm9fcHByOjE7CisJdWludDMyX3Qgbm9fbnZyYW06MTsKKwl1aW50MTZfdCBzeW5jX21hc2s7CisJdWludDE2X3Qgd2lkZV9tYXNrOworCXVpbnQxNl90IHBwcl9tYXNrOworfTsKKworCisvKgorICogTGludXggSG9zdCBBZGFwdGVyIHN0cnVjdHVyZQorICovCitzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCB7CisJLyogTGludXggYWRhcHRlciBjb25maWd1cmF0aW9uIGRhdGEgKi8KKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwkvKiBwb2ludGVyIHRvIGhvc3QgZGF0YSAqLworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpuZXh0OworCXN0cnVjdCBkZXZpY2VfcmVnIF9faW9tZW0gKmlvYmFzZTsJLyogQmFzZSBNZW1vcnktbWFwcGVkIEkvTyBhZGRyZXNzICovCisKKwl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKm1tcGJhc2U7CS8qIG1lbW9yeSBtYXBwZWQgYWRkcmVzcyAqLworCXVuc2lnbmVkIGxvbmcgaG9zdF9ubzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl1aW50OF90IGRldm51bTsKKwl1aW50OF90IHJldmlzaW9uOworCXVpbnQ4X3QgcG9ydHM7CisKKwl1bnNpZ25lZCBsb25nIGFjdHRocmVhZHM7CisJdW5zaWduZWQgbG9uZyBpc3JfY291bnQ7CS8qIEludGVycnVwdCBjb3VudCAqLworCXVuc2lnbmVkIGxvbmcgc3B1cmlvdXNfaW50OworCisJLyogT3V0c3RhbmRpbmdzIElTUCBjb21tYW5kcy4gKi8KKwlzdHJ1Y3Qgc3JiICpvdXRzdGFuZGluZ19jbWRzW01BWF9PVVRTVEFORElOR19DT01NQU5EU107CisKKwkvKiBCVVMgY29uZmlndXJhdGlvbiBkYXRhICovCisJc3RydWN0IGJ1c19wYXJhbSBidXNfc2V0dGluZ3NbTUFYX0JVU0VTXTsKKworCS8qIFJlY2VpdmVkIElTUCBtYWlsYm94IGRhdGEuICovCisJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveF9vdXRbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF07CisKKwlkbWFfYWRkcl90IHJlcXVlc3RfZG1hOwkJLyogUGh5c2ljYWwgQWRkcmVzcyAqLworCXJlcXVlc3RfdCAqcmVxdWVzdF9yaW5nOwkvKiBCYXNlIHZpcnR1YWwgYWRkcmVzcyAqLworCXJlcXVlc3RfdCAqcmVxdWVzdF9yaW5nX3B0cjsJLyogQ3VycmVudCBhZGRyZXNzLiAqLworCXVpbnQxNl90IHJlcV9yaW5nX2luZGV4OwkvKiBDdXJyZW50IGluZGV4LiAqLworCXVpbnQxNl90IHJlcV9xX2NudDsJCS8qIE51bWJlciBvZiBhdmFpbGFibGUgZW50cmllcy4gKi8KKworCWRtYV9hZGRyX3QgcmVzcG9uc2VfZG1hOwkvKiBQaHlzaWNhbCBhZGRyZXNzLiAqLworCXN0cnVjdCByZXNwb25zZSAqcmVzcG9uc2VfcmluZzsJLyogQmFzZSB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgcmVzcG9uc2UgKnJlc3BvbnNlX3JpbmdfcHRyOwkvKiBDdXJyZW50IGFkZHJlc3MuICovCisJdWludDE2X3QgcnNwX3JpbmdfaW5kZXg7CS8qIEN1cnJlbnQgaW5kZXguICovCisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRvbmVfcTsJLyogRG9uZSBxdWV1ZSAqLworCisJc3RydWN0IGNvbXBsZXRpb24gKm1haWxib3hfd2FpdDsKKworCXZvbGF0aWxlIHN0cnVjdCB7CisJCXVpbnQzMl90IG9ubGluZToxOwkJCS8qIDAgKi8KKwkJdWludDMyX3QgcmVzZXRfbWFya2VyOjE7CQkvKiAxICovCisJCXVpbnQzMl90IGRpc2FibGVfaG9zdF9hZGFwdGVyOjE7CS8qIDIgKi8KKwkJdWludDMyX3QgcmVzZXRfYWN0aXZlOjE7CQkvKiAzICovCisJCXVpbnQzMl90IGFib3J0X2lzcF9hY3RpdmU6MTsJCS8qIDQgKi8KKwkJdWludDMyX3QgZGlzYWJsZV9yaXNjX2NvZGVfbG9hZDoxOwkvKiA1ICovCisJCXVpbnQzMl90IGVuYWJsZV82NGJpdF9hZGRyZXNzaW5nOjE7CS8qIDYgKi8KKwkJdWludDMyX3QgaW5fcmVzZXQ6MTsJCQkvKiA3ICovCisJCXVpbnQzMl90IGludHNfZW5hYmxlZDoxOworCQl1aW50MzJfdCBpZ25vcmVfbnZyYW06MTsKKyNpZmRlZiBfX2lhNjRfXworCQl1aW50MzJfdCB1c2VfcGNpX3ZjaGFubmVsOjE7CisjZW5kaWYKKwl9IGZsYWdzOworCisJc3RydWN0IG52cmFtIG52cmFtOworCWludCBudnJhbV92YWxpZDsKK307CisKKyNlbmRpZiAvKiBfUUxBMTI4MF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9LY29uZmlnIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzczYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvS2NvbmZpZwpAQCAtMCwwICsxLDQxIEBACitjb25maWcgU0NTSV9RTEEyWFhYCisJdHJpc3RhdGUKKwlkZWZhdWx0IChTQ1NJICYmIFBDSSkKKwlkZXBlbmRzIG9uIFNDU0kgJiYgUENJCisKK2NvbmZpZyBTQ1NJX1FMQTIxWFgKKwl0cmlzdGF0ZSAiUUxvZ2ljIElTUDIxMDAgaG9zdCBhZGFwdGVyIGZhbWlseSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0NTSV9RTEEyWFhYCisgICAgICAgIHNlbGVjdCBTQ1NJX0ZDX0FUVFJTCisJLS0taGVscC0tLQorCVRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBRTG9naWMgMjF4eCAoSVNQMjEwMCkgaG9zdCBhZGFwdGVyIGZhbWlseS4KKworY29uZmlnIFNDU0lfUUxBMjJYWAorCXRyaXN0YXRlICJRTG9naWMgSVNQMjIwMCBob3N0IGFkYXB0ZXIgZmFtaWx5IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1FMQTJYWFgKKyAgICAgICAgc2VsZWN0IFNDU0lfRkNfQVRUUlMKKwktLS1oZWxwLS0tCisJVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIFFMb2dpYyAyMnh4IChJU1AyMjAwKSBob3N0IGFkYXB0ZXIgZmFtaWx5LgorCitjb25maWcgU0NTSV9RTEEyMzAwCisJdHJpc3RhdGUgIlFMb2dpYyBJU1AyMzAwIGhvc3QgYWRhcHRlciBmYW1pbHkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0lfUUxBMlhYWAorICAgICAgICBzZWxlY3QgU0NTSV9GQ19BVFRSUworCS0tLWhlbHAtLS0KKwlUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgUUxvZ2ljIDIzMDAgKElTUDIzMDAgYW5kIElTUDIzMTIpIGhvc3QKKwlhZGFwdGVyIGZhbWlseS4KKworY29uZmlnIFNDU0lfUUxBMjMyMgorCXRyaXN0YXRlICJRTG9naWMgSVNQMjMyMiBob3N0IGFkYXB0ZXIgZmFtaWx5IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1FMQTJYWFgKKyAgICAgICAgc2VsZWN0IFNDU0lfRkNfQVRUUlMKKwktLS1oZWxwLS0tCisJVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIFFMb2dpYyAyMzIyIChJU1AyMzIyKSBob3N0IGFkYXB0ZXIgZmFtaWx5LgorCitjb25maWcgU0NTSV9RTEE2MzEyCisJdHJpc3RhdGUgIlFMb2dpYyBJU1A2M3h4IGhvc3QgYWRhcHRlciBmYW1pbHkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0lfUUxBMlhYWAorICAgICAgICBzZWxlY3QgU0NTSV9GQ19BVFRSUworCS0tLWhlbHAtLS0KKwlUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgUUxvZ2ljIDYzeHggKElTUDYzMTIgYW5kIElTUDYzMjIpIGhvc3QKKwlhZGFwdGVyIGZhbWlseS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhMjQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L01ha2VmaWxlCkBAIC0wLDAgKzEsMTYgQEAKK0VYVFJBX0NGTEFHUyArPSAtRFVOSVFVRV9GV19OQU1FCisKK3FsYTJ4eHgteSA6PSBxbGFfb3MubyBxbGFfaW5pdC5vIHFsYV9tYngubyBxbGFfaW9jYi5vIHFsYV9pc3IubyBxbGFfZ3MubyBcCisJCXFsYV9kYmcubyBxbGFfc3VwLm8gcWxhX3JzY24ubworCitxbGEyMTAwLXkgOj0gcWwyMTAwLm8gcWwyMTAwX2Z3Lm8KK3FsYTIyMDAteSA6PSBxbDIyMDAubyBxbDIyMDBfZncubworcWxhMjMwMC15IDo9IHFsMjMwMC5vIHFsMjMwMF9mdy5vCitxbGEyMzIyLXkgOj0gcWwyMzIyLm8gcWwyMzIyX2Z3Lm8KK3FsYTYzMTIteSA6PSBxbDYzMTIubyBxbDYzMTJfZncubworCitvYmotJChDT05GSUdfU0NTSV9RTEEyMVhYKSArPSBxbGEyeHh4Lm8gcWxhMjEwMC5vCitvYmotJChDT05GSUdfU0NTSV9RTEEyMlhYKSArPSBxbGEyeHh4Lm8gcWxhMjIwMC5vCitvYmotJChDT05GSUdfU0NTSV9RTEEyMzAwKSArPSBxbGEyeHh4Lm8gcWxhMjMwMC5vCitvYmotJChDT05GSUdfU0NTSV9RTEEyMzIyKSArPSBxbGEyeHh4Lm8gcWxhMjMyMi5vCitvYmotJChDT05GSUdfU0NTSV9RTEE2MzEyKSArPSBxbGEyeHh4Lm8gcWxhNjMxMi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDIxMDAuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsMjEwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMTM2YTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDIxMDAuYwpAQCAtMCwwICsxLDkyIEBACisvKgorICogUUxvZ2ljIElTUDIxMDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi42LngKKyAqIENvcHlyaWdodCAoQykgMjAwMyBDaHJpc3RvcGggSGVsbHdpZy4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFFMb2dpYyBDb3Jwb3JhdGlvbiAod3d3LnFsb2dpYy5jb20pCisgKgorICogUmVsZWFzZWQgdW5kZXIgR1BMIHYyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlICJxbGFfZGVmLmgiCisKK3N0YXRpYyBjaGFyIHFsYV9kcml2ZXJfbmFtZVtdID0gInFsYTIxMDAiOworCitleHRlcm4gdW5zaWduZWQgY2hhciAgZncyMTAwdHBfdmVyc2lvbltdOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgIGZ3MjEwMHRwX3ZlcnNpb25fc3RyW107CitleHRlcm4gdW5zaWduZWQgc2hvcnQgZncyMTAwdHBfYWRkcjAxOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGZ3MjEwMHRwX2NvZGUwMVtdOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGZ3MjEwMHRwX2xlbmd0aDAxOworCitzdGF0aWMgc3RydWN0IHFsYV9md19pbmZvIHFsYV9md190YmxbXSA9IHsKKwl7CisJCS5hZGRyZXNzaW5nCT0gRldfSU5GT19BRERSX05PUk1BTCwKKwkJLmZ3Y29kZQkJPSAmZncyMTAwdHBfY29kZTAxWzBdLAorCQkuZndsZW4JCT0gJmZ3MjEwMHRwX2xlbmd0aDAxLAorCQkuZndzdGFydAk9ICZmdzIxMDB0cF9hZGRyMDEsCisJfSwKKworCXsgRldfSU5GT19BRERSX05PTU9SRSwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcWxhX2JvYXJkX2luZm8gcWxhX2JvYXJkX3RibCA9IHsKKwkuZHJ2X25hbWUJPSBxbGFfZHJpdmVyX25hbWUsCisKKwkuaXNwX25hbWUJPSAiSVNQMjEwMCIsCisJLmZ3X2luZm8JPSBxbGFfZndfdGJsLAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHFsYTIxMDBfcGNpX3RibFtdID0geworCXsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX1FMT0dJQywKKwkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMTAwLAorCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YQk9ICh1bnNpZ25lZCBsb25nKSZxbGFfYm9hcmRfdGJsLAorCX0sCisKKwl7MCwgMH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHFsYTIxMDBfcGNpX3RibCk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitxbGEyMTAwX3Byb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBxbGEyeDAwX3Byb2JlX29uZShwZGV2LAorCSAgICAoc3RydWN0IHFsYV9ib2FyZF9pbmZvICopaWQtPmRyaXZlcl9kYXRhKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0CitxbGEyMTAwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcWxhMngwMF9yZW1vdmVfb25lKHBkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcWxhMjEwMF9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJxbGEyMTAwIiwKKwkuaWRfdGFibGUJPSBxbGEyMTAwX3BjaV90YmwsCisJLnByb2JlCQk9IHFsYTIxMDBfcHJvYmVfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocWxhMjEwMF9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitxbGEyMTAwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZxbGEyMTAwX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3FsYTIxMDBfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcWxhMjEwMF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocWxhMjEwMF9pbml0KTsKK21vZHVsZV9leGl0KHFsYTIxMDBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlFMb2dpYyBDb3Jwb3JhdGlvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJRTG9naWMgSVNQMjF4eCBGQy1TQ1NJIEhvc3QgQnVzIEFkYXB0ZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihRTEEyWFhYX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWwyMTAwX2Z3LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDIxMDBfZncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzJmOWYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWwyMTAwX2Z3LmMKQEAgLTAsMCArMSw0ODU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIFFMT0dJQyBMSU5VWCBTT0ZUV0FSRQorICoKKyAqIFFMb2dpYyBJU1AyeDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBRTG9naWMgQ29ycG9yYXRpb24KKyAqICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglGaXJtd2FyZSBWZXJzaW9uIDEuMTkuMjQgKDE0OjAyIEp1bCAxNiwgMjAwMikKKyAqLworCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3Vuc2lnbmVkIHNob3J0IGZ3MjEwMHRwX3ZlcnNpb24gPSAxKjEwMjQrMTk7CisjZWxzZQordW5zaWduZWQgc2hvcnQgcmlzY19jb2RlX3ZlcnNpb24gPSAxKjEwMjQrMTk7CisjZW5kaWYKKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCit1bnNpZ25lZCBjaGFyIGZ3MjEwMHRwX3ZlcnNpb25fc3RyW10gPSB7MSwxOSwyNH07CisjZWxzZQordW5zaWduZWQgY2hhciBmaXJtd2FyZV92ZXJzaW9uW10gPSB7MSwxOSwyNH07CisjZW5kaWYKKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCisjZGVmaW5lIGZ3MjEwMHRwX1ZFUlNJT05fU1RSSU5HICIxLjE5LjI0IgorI2Vsc2UKKyNkZWZpbmUgRldfVkVSU0lPTl9TVFJJTkcgIjEuMTkuMjQiCisjZW5kaWYKKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCit1bnNpZ25lZCBzaG9ydCBmdzIxMDB0cF9hZGRyMDEgPSAweDEwMDAgOworI2Vsc2UKK3Vuc2lnbmVkIHNob3J0IHJpc2NfY29kZV9hZGRyMDEgPSAweDEwMDAgOworI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQordW5zaWduZWQgc2hvcnQgZncyMTAwdHBfY29kZTAxW10gPSB7IAorI2Vsc2UKK3Vuc2lnbmVkIHNob3J0IHJpc2NfY29kZTAxW10gPSB7IAorI2VuZGlmCisJMHgwMDc4LCAweDEwMmQsIDB4MDAwMCwgMHg5NWYxLCAweDAwMDAsIDB4MDAwMSwgMHgwMDEzLCAweDAwMTgsCisJMHgwMDE3LCAweDIwNDMsIDB4NGY1MCwgMHg1OTUyLCAweDQ5NDcsIDB4NDg1NCwgMHgyMDMyLCAweDMwMzAsCisJMHgzMTIwLCAweDUxNGMsIDB4NGY0NywgMHg0OTQzLCAweDIwNDMsIDB4NGY1MiwgMHg1MDRmLCAweDUyNDEsCisJMHg1NDQ5LCAweDRmNGUsIDB4MjA0OSwgMHg1MzUwLCAweDMyMzEsIDB4MzAzMCwgMHgyMDQ2LCAweDY5NzIsCisJMHg2ZDc3LCAweDYxNzIsIDB4NjUyMCwgMHgyMDU2LCAweDY1NzIsIDB4NzM2OSwgMHg2ZjZlLCAweDIwMzAsCisJMHgzMTJlLCAweDMxMzksIDB4MjAyMCwgMHgyMDIwLCAweDI0MDAsIDB4MjA5MSwgMHgyMDAwLCAweDIwYzEsCisJMHgwMDIxLCAweDIwMzksIDB4ZmZmZiwgMHgyMDE5LCAweGFhYWEsIDB4Mjc2MCwgMHgyMDY5LCAweDdmZmYsCisJMHgyMGMxLCAweDAwMjAsIDB4MmMyYywgMHgyZDM0LCAweDI3NjIsIDB4MjM2YSwgMHgyYzI0LCAweDJkMDQsCisJMHgyNjZhLCAweDI1NjIsIDB4YTQwNiwgMHgwMGMwLCAweDEwNTIsIDB4MjBjMSwgMHgwMDIxLCAweDJjMmMsCisJMHgyMzYyLCAweDJjMDQsIDB4MjU2MiwgMHhhMzA2LCAweDAwNDAsIDB4MTA1MiwgMHgyMGMxLCAweDAwMjAsCisJMHgyMDM5LCAweDhmZmYsIDB4MjBhMSwgMHhhZDAwLCAweDI3MDgsIDB4ODEwZCwgMHg4MTBkLCAweDgxMGQsCisJMHg4MTBkLCAweGExOGMsIDB4MDAwZiwgMHgyMDAxLCAweDAwMGEsIDB4YTExMiwgMHhhMDBlLCAweDIxYTgsCisJMHg0MWE0LCAweDM0MDAsIDB4ODIxMSwgMHgwMGMwLCAweDEwNWYsIDB4MjcwOCwgMHgzNDAwLCAweGExMDIsCisJMHgwMDQwLCAweDEwNmYsIDB4MDA0OCwgMHgxMDZmLCAweDIwYTgsIDB4YTAwZSwgMHg0MWE0LCAweDIwYTEsCisJMHhhNWYxLCAweDIwMDksIDB4MDAwMCwgMHgyMGE5LCAweDA3MGYsIDB4NDFhNCwgMHgzNDAwLCAweDIwYzksCisJMHhhYWZmLCAweDIwNTksIDB4MDAwMCwgMHgyYjc4LCAweDc4MjMsIDB4MDAwNCwgMHgyMDg5LCAweDI1YzcsCisJMHgyMDUxLCAweGE2MDAsIDB4MmE3MCwgMHg3NzYyLCAweGE3ODYsIDB4OGZmZiwgMHgwMDQwLCAweDEwOTIsCisJMHg3MDVmLCAweGNkMDAsIDB4NzA1YiwgMHhjY2YxLCAweDcwNjcsIDB4MDIwMCwgMHg3MDZiLCAweDAyMDAsCisJMHgwMDc4LCAweDEwOWEsIDB4NzA1YiwgMHhiZDAxLCAweDcwNjcsIDB4MDEwMCwgMHg3MDZiLCAweDAxMDAsCisJMHg3MDVmLCAweGJkMDAsIDB4MTA3OCwgMHgxMmRmLCAweDEwNzgsIDB4MTNjYSwgMHgxMDc4LCAweDE1NzcsCisJMHgxMDc4LCAweDFjZTksIDB4MTA3OCwgMHg0MmVjLCAweDEwNzgsIDB4NzZiZiwgMHgxMDc4LCAweDEzNTUsCisJMHgxMDc4LCAweDJhYzAsIDB4MTA3OCwgMHg0ZTkzLCAweDEwNzgsIDB4NDlhMywgMHgxMDc4LCAweDU5NGEsCisJMHgxMDc4LCAweDIyNjMsIDB4MTA3OCwgMHg1YzQzLCAweDEwNzgsIDB4NTQ4NSwgMHgxMDc4LCAweDIxNjIsCisJMHgxMDc4LCAweDIyNDAsIDB4MjA5MSwgMHgzMDA5LCAweDc4MjMsIDB4MDAwMCwgMHgwMDkwLCAweDEwY2YsCisJMHg3ODIwLCAweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDEwY2YsIDB4NzgyMywgMHg0MDAwLCAweDAwNjgsCisJMHgxMGM3LCAweDc4MWIsIDB4MDAwMSwgMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwgMHg0MDgwLCAweDJhNzAsCisJMHg3MDAzLCAweDAwMDAsIDB4MjAwMSwgMHgwMTdmLCAweDIwMDMsIDB4MDAwMCwgMHgyYTcwLCAweDcwMDAsCisJMHhhMDhlLCAweDAwMDMsIDB4MDBjMCwgMHgxMGVmLCAweDEwNzgsIDB4MzY1ZSwgMHgxMDc4LCAweDJhZTgsCisJMHgxMDc4LCAweDRlZTMsIDB4MTA3OCwgMHg0YjY2LCAweDIwMDksIDB4MDEwMCwgMHgyMTA0LCAweGEwODIsCisJMHgwMDAyLCAweDAwNDgsIDB4MTBmMywgMHgxMDc4LCAweDU5NjYsIDB4MDA3OCwgMHgxMGQ2LCAweDEwNzksCisJMHgxMGY3LCAweDAwNzgsIDB4MTBkYywgMHgxMDc4LCAweDcxOTcsIDB4MDA3OCwgMHgxMGViLCAweDExMDEsCisJMHgxMTAyLCAweDExYmUsIDB4MTBmZiwgMHgxMjQ2LCAweDEyZGMsIDB4MTJkZCwgMHgxMmRlLCAweDEwNzgsCisJMHgxMzMyLCAweDAwN2MsIDB4MTI3ZSwgMHgwZjdlLCAweDIwOTEsIDB4ODAwMCwgMHg3MDAwLCAweGEwODYsCisJMHgwMDAxLCAweDAwYzAsIDB4MTE5OCwgMHgxMDc4LCAweDNhZWMsIDB4MjA3OSwgMHgwMTAwLCAweDc4NDQsCisJMHhhMDA1LCAweDAwYzAsIDB4MTE5OCwgMHgyMDExLCAweDQxZGMsIDB4MTA3OCwgMHg1YTQ1LCAweDEwNzgsCisJMHgxYWRmLCAweDc4MGYsIDB4MDBmZiwgMHg3ODQwLCAweGEwODQsIDB4ZmZmYiwgMHg3ODQyLCAweDIwMTEsCisJMHg4MDEwLCAweDczYzQsIDB4MTA3OCwgMHgzNjFiLCAweDIwMDEsIDB4ZmZmZiwgMHgxMDc4LCAweDVhZTYsCisJMHg3MjNjLCAweGMyODQsIDB4NzIzZSwgMHgyMDAxLCAweGE2MGMsIDB4MjAxNCwgMHhjMmFjLCAweDIyMDIsCisJMHgxMDc4LCAweDZmOWYsIDB4MjAxMSwgMHgwMDA0LCAweDEwNzgsIDB4OGQxYiwgMHgxMDc4LCAweDQ4OWUsCisJMHgxMDc4LCAweDQyZDQsIDB4MDA0MCwgMHgxMTQ0LCAweDcwODcsIDB4MDAwMSwgMHg3MGJmLCAweDAwMDAsCisJMHgxMDc4LCAweDNjOWUsIDB4MDA3OCwgMHgxMTk4LCAweDEwNzgsIDB4NDk2NywgMHgwMDQwLCAweDExNGQsCisJMHg3YTBjLCAweGMyYjQsIDB4N2EwZSwgMHgwMDc4LCAweDExNTksIDB4MTA3OCwgMHg5MGE2LCAweDcwY2MsCisJMHhkMDljLCAweDAwYzAsIDB4MTE1OSwgMHg3MDk4LCAweGEwMDUsIDB4MDA0MCwgMHgxMTU5LCAweDEwNzgsCisJMHg0MmI4LCAweDcwZDcsIDB4MDAwMCwgMHg3MGQzLCAweDAwMDAsIDB4NzJjYywgMHgyMDc5LCAweGE2NTIsCisJMHg3ODA0LCAweGQwYWMsIDB4MDA0MCwgMHgxMTY1LCAweGMyOTUsIDB4NzJjZSwgMHhhMjk2LCAweDAwMDQsCisJMHgwMDQwLCAweDExODYsIDB4MjAxMSwgMHgwMDAxLCAweDEwNzgsIDB4OGQxYiwgMHg3MDkzLCAweDAwMDAsCisJMHg3MDk3LCAweGZmZmYsIDB4NzAwMywgMHgwMDAyLCAweDBmN2YsIDB4MTA3OCwgMHgyNjc3LCAweDIwMTEsCisJMHgwMDA1LCAweDEwNzgsIDB4NzBlMCwgMHgxMDc4LCAweDYyZDEsIDB4MGM3ZSwgMHgyMDYxLCAweDAxMDAsCisJMHg2MGUzLCAweDAwMDgsIDB4MGM3ZiwgMHgxMjdmLCAweDAwNzgsIDB4MTE5YSwgMHg3MDkzLCAweDAwMDAsCisJMHg3MDk3LCAweGZmZmYsIDB4NzAwMywgMHgwMDAyLCAweDIwMTEsIDB4MDAwNSwgMHgxMDc4LCAweDcwZTAsCisJMHgxMDc4LCAweDYyZDEsIDB4MGM3ZSwgMHgyMDYxLCAweDAxMDAsIDB4NjBlMywgMHgwMDA4LCAweDBjN2YsCisJMHgwZjdmLCAweDEyN2YsIDB4MDA3YywgMHgwYzdlLCAweDIwYTksIDB4MDA4MiwgMHgyMDA5LCAweDAwN2UsCisJMHgwMTdlLCAweDAyN2UsIDB4MDM3ZSwgMHgyMTEwLCAweDAyN2UsIDB4MjAxOSwgMHgwMDI5LCAweDEwNzgsCisJMHg3M2QwLCAweDAyN2YsIDB4MTA3OCwgMHhhNGYxLCAweDAzN2YsIDB4MDI3ZiwgMHgwMTdmLCAweDEwNzgsCisJMHgyOThlLCAweDgxMDgsIDB4MDBmMCwgMHgxMWEwLCAweDBjN2YsIDB4NzA2ZiwgMHgwMDAwLCAweDcwNzAsCisJMHhhMDg0LCAweDAwZmYsIDB4NzA3MiwgMHg3MDliLCAweDAwMDAsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4MTI0NCwgMHg3MDk0LCAweGEwODYsCisJMHhmZmZmLCAweDAwNDAsIDB4MTFkMSwgMHgxMDc4LCAweDI2NzcsIDB4MTA3OCwgMHg2MmQxLCAweDAwNzgsCisJMHgxMjQ0LCAweDcwY2MsIDB4ZDA5YywgMHgwMDQwLCAweDExZmQsIDB4ZDA4NCwgMHgwMDQwLCAweDExZmQsCisJMHgwZjdlLCAweDIwNzksIDB4MDEwMCwgMHg3OTBjLCAweGMxYjUsIDB4NzkwZSwgMHgwZjdmLCAweGQwOGMsCisJMHgwMDQwLCAweDExZmQsIDB4NzBkMCwgMHhhMDg2LCAweGZmZmYsIDB4MDA0MCwgMHgxMWY5LCAweDEwNzgsCisJMHgyN2Y3LCAweDEwNzgsIDB4NjJkMSwgMHg3MGNjLCAweGQwOTQsIDB4MDBjMCwgMHgxMjQ0LCAweDIwMTEsCisJMHgwMDAxLCAweDIwMTksIDB4MDAwMCwgMHgxMDc4LCAweDI4MmYsIDB4MTA3OCwgMHg2MmQxLCAweDAwNzgsCisJMHgxMjQ0LCAweDcwZDQsIDB4YTAwNSwgMHgwMGMwLCAweDEyNDQsIDB4NzA5MCwgMHhhMDA1LCAweDAwYzAsCisJMHgxMjQ0LCAweDEwNzgsIDB4NDk2NywgMHgwMGMwLCAweDEyNDQsIDB4MjAwMSwgMHhhNjUzLCAweDIwMDQsCisJMHhkMGFjLCAweDAwNDAsIDB4MTIyNywgMHgxNTdlLCAweDBjN2UsIDB4MjBhOSwgMHgwMDdmLCAweDIwMDksCisJMHgwMDAwLCAweDAxN2UsIDB4MTA3OCwgMHg0NWM0LCAweDAwYzAsIDB4MTIxYSwgMHg2MDAwLCAweGQwZWMsCisJMHgwMGMwLCAweDEyMjIsIDB4MDE3ZiwgMHg4MTA4LCAweDAwZjAsIDB4MTIxMSwgMHgwYzdmLCAweDE1N2YsCisJMHgwMDc4LCAweDEyMjcsIDB4MDE3ZiwgMHgwYzdmLCAweDE1N2YsIDB4MDA3OCwgMHgxMjQ0LCAweDcwMDMsCisJMHgwMDAzLCAweDcwOTcsIDB4ZmZmZiwgMHgyMDAxLCAweDAwMDAsIDB4MTA3OCwgMHgyNGU4LCAweDEwNzgsCisJMHgzNjk5LCAweDIwMDEsIDB4YThiMiwgMHgyMDA0LCAweGEwODYsIDB4MDAwNSwgMHgwMGMwLCAweDEyM2MsCisJMHgyMDExLCAweDAwMDAsIDB4MTA3OCwgMHg3MGUwLCAweDIwMTEsIDB4MDAwMCwgMHgxMDc4LCAweDcwZWEsCisJMHgxMDc4LCAweDYyZDEsIDB4MTA3OCwgMHg2MzliLCAweDEyN2YsIDB4MDA3YywgMHgwMTdlLCAweDBmN2UsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDc5LCAweDAxMDAsIDB4MjAwOSwgMHgwMGY3LCAweDEwNzgsCisJMHg0MmExLCAweDc5NDAsIDB4YTE4YywgMHgwMDEwLCAweDc5NDIsIDB4NzkyNCwgMHhkMWI0LCAweDAwNDAsCisJMHgxMjViLCAweDc4MjcsIDB4MDA0MCwgMHhkMTljLCAweDAwNDAsIDB4MTI2MCwgMHg3ODI3LCAweDAwMDgsCisJMHgwMDdlLCAweDAzN2UsIDB4MTU3ZSwgMHhhMDA2LCAweDEwNzgsIDB4NWFlNiwgMHg3OTAwLCAweGExOGEsCisJMHgwMDAzLCAweDAwNTAsIDB4MTI4OSwgMHg3OTU0LCAweGQxYWMsIDB4MDBjMCwgMHgxMjg5LCAweDIwMDksCisJMHgwMGY4LCAweDEwNzgsIDB4NDJhMSwgMHg3ODQzLCAweDAwOTAsIDB4Nzg0MywgMHgwMDEwLCAweDIwYTksCisJMHgwOWM0LCAweDc4MjAsIDB4ZDA5YywgMHgwMGMwLCAweDEyODEsIDB4NzgyNCwgMHhkMGFjLCAweDAwYzAsCisJMHgxMmNhLCAweDAwZjAsIDB4MTI3OSwgMHgyMDAxLCAweDAwMDEsIDB4MTA3OCwgMHgyNGU4LCAweDAwNzgsCisJMHgxMmQ1LCAweDc4NTMsIDB4MDAwMCwgMHg3ODJmLCAweDAwMjAsIDB4MjBhOSwgMHgwMDUwLCAweDAwZTAsCisJMHgxMjhmLCAweDIwOTEsIDB4NjAwMCwgMHgwMGYwLCAweDEyOGYsIDB4Nzg1MywgMHgwNDAwLCAweDc4MmYsCisJMHgwMDAwLCAweDIwMDksIDB4MDBmOCwgMHgxMDc4LCAweDQyYTEsIDB4MjBhOSwgMHgwMDBlLCAweDAwMDUsCisJMHgwMGYwLCAweDEyOWYsIDB4Nzg1MywgMHgxNDAwLCAweDc4NDMsIDB4MDA5MCwgMHg3ODQzLCAweDAwMTAsCisJMHgyMDE5LCAweDYxYTgsIDB4Nzg1NCwgMHgwMDA1LCAweDAwMDUsIDB4ZDA4YywgMHgwMDQwLCAweDEyYjQsCisJMHg3ODI0LCAweGQwYWMsIDB4MDBjMCwgMHgxMmNhLCAweDgzMTksIDB4MDBjMCwgMHgxMmFhLCAweDIwMDksCisJMHhhNjMyLCAweDIxMDQsIDB4ODAwMCwgMHgyMDBhLCAweGEwODQsIDB4ZmZmMCwgMHgwMDQwLCAweDEyYzQsCisJMHgyMDBiLCAweDAwMDAsIDB4MTA3OCwgMHgyNTg4LCAweDIwMDEsIDB4MDAwMSwgMHgxMDc4LCAweDI0ZTgsCisJMHgwMDc4LCAweDEyZDMsIDB4MjAwMSwgMHhhNjMyLCAweDIwMDMsIDB4MDAwMCwgMHg3ODI4LCAweGMwOWQsCisJMHg3ODJhLCAweDc4MjcsIDB4MDA0OCwgMHg3ODUzLCAweDA0MDAsIDB4MTU3ZiwgMHgwMzdmLCAweDAwN2YsCisJMHgxMjdmLCAweDBmN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDAwN2MsIDB4MDA3YywgMHgwMDdjLCAweDJhNzAsCisJMHgyMDYxLCAweGE4YWQsIDB4MjA2MywgMHgwMDAxLCAweDYwMDcsIDB4MDAxMywgMHg2MDBiLCAweDAwMTgsCisJMHg2MDBmLCAweDAwMTcsIDB4MjAwOSwgMHgwMTAwLCAweDIxMDQsIDB4YTA4MiwgMHgwMDAyLCAweDAwNDgsCisJMHgxMmY1LCAweDcwNTMsIDB4ZmZmZiwgMHgwMDc4LCAweDEyZjcsIDB4NzA1MywgMHgwMDAwLCAweDcwNTcsCisJMHhmZmZmLCAweDcwNmYsIDB4MDAwMCwgMHg3MDczLCAweDAwMDAsIDB4MTA3OCwgMHg5MGE2LCAweDIwNjEsCisJMHhhODhkLCAweDYwMDMsIDB4MDkwOSwgMHg2MDA3LCAweDAwMDAsIDB4NjAwYiwgMHg4ODAwLCAweDYwMGYsCisJMHgwMjAwLCAweDYwMTMsIDB4MDBmZiwgMHg2MDE3LCAweDAwMDMsIDB4NjAxYiwgMHgwMDAwLCAweDYwMWYsCisJMHgwN2QwLCAweDIwNjEsIDB4YTg5NSwgMHg2MDAzLCAweDgwMDAsIDB4NjAwNywgMHgwMDAwLCAweDYwMGIsCisJMHgwMDAwLCAweDYwMGYsIDB4MDIwMCwgMHg2MDEzLCAweDAwZmYsIDB4NjAxNywgMHgwMDAwLCAweDYwMWIsCisJMHgwMDAxLCAweDYwMWYsIDB4MDAwMCwgMHgyMDYxLCAweGE4YTUsIDB4NjAwMywgMHg1MTRjLCAweDYwMDcsCisJMHg0ZjQ3LCAweDYwMGIsIDB4NDk0MywgMHg2MDBmLCAweDIwMjAsIDB4MjAwMSwgMHhhNjI2LCAweDIwMDMsCisJMHgwMDAwLCAweDAwN2MsIDB4MjA5MSwgMHg4MDAwLCAweDAwNjgsIDB4MTMzNCwgMHgwMDdlLCAweDAxN2UsCisJMHgyMDc5LCAweDAwMDAsIDB4NzgxOCwgMHhkMDg0LCAweDAwYzAsIDB4MTMzYSwgMHgwMTdmLCAweDc5MmUsCisJMHgwMDdmLCAweDc4MmEsIDB4MDA3ZiwgMHg3ODI2LCAweDM5MDAsIDB4NzgzYSwgMHg3ODIzLCAweDgwMDIsCisJMHg3ODFiLCAweDAwMDEsIDB4MjA5MSwgMHg1MDAwLCAweDIwOTEsIDB4NDA4MCwgMHgyMDc5LCAweGE2MDAsCisJMHg3ODAzLCAweDAwMDUsIDB4MDA3OCwgMHgxMzUyLCAweDAwN2MsIDB4MjA3MSwgMHhhNjAwLCAweDcxNWMsCisJMHg3MTJlLCAweDIwMjEsIDB4MDAwMSwgMHhhMTkwLCAweDAwMmQsIDB4YTI5OCwgMHgwMDJkLCAweDAwNDgsCisJMHgxMzZiLCAweDcwNjAsIDB4YTMwMiwgMHgwMGM4LCAweDEzNmIsIDB4MjIwYSwgMHgyMjA4LCAweDIzMTAsCisJMHg4NDIwLCAweDAwNzgsIDB4MTM1ZCwgMHgyMDBiLCAweDAwMDAsIDB4NzRhYSwgMHg3NGFlLCAweDAwN2MsCisJMHgwZTdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YTYwMCwgMHg3MGFjLCAweGEwZWEsCisJMHgwMDEwLCAweDAwYzgsIDB4MTM3ZSwgMHhhMDZlLCAweDAwNzgsIDB4MTM4OCwgMHg4MDAxLCAweDcwYWUsCisJMHg3MDJjLCAweDIwNjgsIDB4MmQwNCwgMHg3MDJlLCAweDIwNmIsIDB4MDAwMCwgMHg2ODA3LCAweDAwMDAsCisJMHgxMjdmLCAweDBlN2YsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YTYwMCwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDcwYWMsIDB4ODAwMSwgMHgwMGM4LCAweDEzOTgsIDB4YTA2ZSwgMHgwMDc4LCAweDEzYTEsCisJMHg3MGFlLCAweDcwMmMsIDB4MjA2OCwgMHgyZDA0LCAweDcwMmUsIDB4MjA2YiwgMHgwMDAwLCAweDY4MDcsCisJMHgwMDAwLCAweDEyN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDcxLCAweGE2MDAsIDB4NzAyYywgMHgyMDZhLCAweDJkMDAsIDB4NzAyZSwgMHg3MGFjLCAweDgwMDAsCisJMHg3MGFlLCAweDEyN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDhkZmYsIDB4MDA0MCwgMHgxM2MwLCAweDY4MDQsCisJMHg2ODA3LCAweDAwMDAsIDB4MDA3ZSwgMHgxMDc4LCAweDEzYTQsIDB4MGQ3ZiwgMHgwMDc4LCAweDEzYjQsCisJMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhNjAwLCAweDcwYWMsIDB4YTA4YSwgMHgwMDEwLCAweGEwMGQsCisJMHgwZTdmLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGE4ZDYsIDB4NzAwNywgMHgwMDAwLCAweDcwMWIsCisJMHgwMDAwLCAweDcwMWYsIDB4MDAwMCwgMHgyMDcxLCAweDAwMDAsIDB4NzAxMCwgMHhhMDg1LCAweDgwMDQsCisJMHg3MDEyLCAweDBlN2YsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwZTdlLCAweDIyNzAsCisJMHg3MDBiLCAweDAwMDAsIDB4MjA3MSwgMHhhOGQ2LCAweDcwMTgsIDB4YTA4OCwgMHhhOGRmLCAweDIyMGEsCisJMHg4MDAwLCAweGEwODQsIDB4MDAwNywgMHg3MDFhLCAweDcwMDQsIDB4YTAwNSwgMHgwMGMwLCAweDEzZjYsCisJMHgwZjdlLCAweDIwNzksIDB4MDAxMCwgMHgxMDc4LCAweDE0MDgsIDB4MGY3ZiwgMHgwZTdmLCAweDEyN2YsCisJMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhOGQ2LCAweDcwMDQsIDB4YTAwNSwgMHgwMGMwLCAweDE0MDYsCisJMHgwZjdlLCAweDIwNzksIDB4MDAxMCwgMHgxMDc4LCAweDE0MDgsIDB4MGY3ZiwgMHgwZTdmLCAweDAwN2MsCisJMHg3MDAwLCAweDAwNzksIDB4MTQwYiwgMHgxNDBmLCAweDE0NzksIDB4MTQ5NiwgMHgxNDk2LCAweDcwMTgsCisJMHg3MTFjLCAweGExMDYsIDB4MDBjMCwgMHgxNDE3LCAweDcwMDcsIDB4MDAwMCwgMHgwMDdjLCAweDBkN2UsCisJMHhhMTgwLCAweGE4ZGYsIDB4MjAwNCwgMHg3MDBhLCAweDIwNjgsIDB4ODEwOCwgMHhhMThjLCAweDAwMDcsCisJMHg3MTFlLCAweDc4MDMsIDB4MDAyNiwgMHg2ODI0LCAweDc4MzIsIDB4NjgyOCwgMHg3ODM2LCAweDY4MmMsCisJMHg3ODNhLCAweDY4MzAsIDB4NzgzZSwgMHg2ODEwLCAweDcwMGUsIDB4NjgwYywgMHg3MDE2LCAweDY4MDQsCisJMHgwZDdmLCAweGQwODQsIDB4MDA0MCwgMHgxNDM5LCAweDcwMDcsIDB4MDAwMSwgMHgxMDc4LCAweDE0M2UsCisJMHgwMDdjLCAweDcwMDcsIDB4MDAwMiwgMHgxMDc4LCAweDE0NTQsIDB4MDA3YywgMHgwMTdlLCAweDAyN2UsCisJMHg3MTBjLCAweDIwMTEsIDB4MDA0MCwgMHhhMTgyLCAweDAwNDAsIDB4MDBjOCwgMHgxNDQ5LCAweDIxMTAsCisJMHhhMDA2LCAweDcwMGUsIDB4NzIxMiwgMHg4MjAzLCAweDc4MjIsIDB4NzgwMywgMHgwMDIwLCAweDc4MDMsCisJMHgwMDQxLCAweDAyN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDAxN2UsIDB4MDI3ZSwgMHgxMzdlLCAweDE0N2UsCisJMHgxNTdlLCAweDcwMTQsIDB4MjA5OCwgMHgyMGExLCAweDAwMTQsIDB4NzgwMywgMHgwMDI2LCAweDcxMGMsCisJMHgyMDExLCAweDAwNDAsIDB4YTE4MiwgMHgwMDQwLCAweDAwYzgsIDB4MTQ2OCwgMHgyMTEwLCAweGEwMDYsCisJMHg3MDBlLCAweDIyYTgsIDB4NTNhNiwgMHg4MjAzLCAweDc4MjIsIDB4NzgwMywgMHgwMDIwLCAweDMzMDAsCisJMHg3MDE2LCAweDc4MDMsIDB4MDAwMSwgMHgxNTdmLCAweDE0N2YsIDB4MTM3ZiwgMHgwMjdmLCAweDAxN2YsCisJMHgwMDdjLCAweDEzN2UsIDB4MTQ3ZSwgMHgxNTdlLCAweDIwOTksIDB4YTZmYSwgMHgyMGExLCAweDAwMTgsCisJMHgyMGE5LCAweDAwMDgsIDB4NTNhMywgMHg3ODAzLCAweDAwMjAsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHg3ODAzLCAweDAwNDEsIDB4NzAwNywgMHgwMDAzLCAweDcwMDAsIDB4YzA4NCwgMHg3MDAyLCAweDcwMGIsCisJMHhhNmY1LCAweDEyN2YsIDB4MTU3ZiwgMHgxNDdmLCAweDEzN2YsIDB4MDA3YywgMHgxMzdlLCAweDE0N2UsCisJMHgxNTdlLCAweDIwMDEsIDB4YTcyOSwgMHgyMDljLCAweDIwYTEsIDB4MDAxNCwgMHg3ODAzLCAweDAwMjYsCisJMHgyMDAxLCAweGE3MmEsIDB4MjBhYywgMHg1M2E2LCAweDIwOTksIDB4YTcyYiwgMHgyMGExLCAweDAwMTgsCisJMHgyMGE5LCAweDAwMDgsIDB4NTNhMywgMHg3ODAzLCAweDAwMjAsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHg3ODAzLCAweDAwMDEsIDB4NzAwNywgMHgwMDA0LCAweDcwMDAsIDB4YzA4YywgMHg3MDAyLCAweDcwMGIsCisJMHhhNzI2LCAweDEyN2YsIDB4MTU3ZiwgMHgxNDdmLCAweDEzN2YsIDB4MDA3YywgMHgwMTdlLCAweDBlN2UsCisJMHgyMDcxLCAweGE4ZDYsIDB4MGY3ZSwgMHgyMDc5LCAweDAwMTAsIDB4NzkwNCwgMHg3ODAzLCAweDAwMDIsCisJMHhkMWZjLCAweDAwNDAsIDB4MTRkMCwgMHhhMThjLCAweDA3MDAsIDB4NzAwNCwgMHgxMDc5LCAweDE0ZDQsCisJMHgwZjdmLCAweDBlN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDE0MDgsIDB4MTRkYywgMHgxNTA5LCAweDE1MzEsCisJMHgxNTY0LCAweDE0ZGEsIDB4MDA3OCwgMHgxNGRhLCAweGExOGMsIDB4MDcwMCwgMHgwMGMwLCAweDE1MDIsCisJMHgxMzdlLCAweDE0N2UsIDB4MTU3ZSwgMHg3MDE0LCAweDIwYTAsIDB4MjA5OSwgMHgwMDE0LCAweDc4MDMsCisJMHgwMDQwLCAweDcwMTAsIDB4MjBhOCwgMHg1M2E1LCAweDM0MDAsIDB4NzAxNiwgMHgxNTdmLCAweDE0N2YsCisJMHgxMzdmLCAweDcwMGMsIDB4YTAwNSwgMHgwMDQwLCAweDE1MWUsIDB4MTA3OCwgMHgxNDNlLCAweDAwN2MsCisJMHg3MDA4LCAweGEwODAsIDB4MDAwMiwgMHgyMDAzLCAweDAxMDAsIDB4NzAwNywgMHgwMDAwLCAweDEwNzgsCisJMHgxNDA4LCAweDAwN2MsIDB4NzAwOCwgMHhhMDgwLCAweDAwMDIsIDB4MjAwMywgMHgwMjAwLCAweDAwNzgsCisJMHgxNGZkLCAweGExOGMsIDB4MDcwMCwgMHgwMGMwLCAweDE1MTQsIDB4NzAwYywgMHhhMDA1LCAweDAwNDAsCisJMHgxNTFlLCAweDEwNzgsIDB4MTQ1NCwgMHgwMDdjLCAweDcwMDgsIDB4YTA4MCwgMHgwMDAyLCAweDIwMDMsCisJMHgwMjAwLCAweDcwMDcsIDB4MDAwMCwgMHgxMDc4LCAweDE0MDgsIDB4MDA3YywgMHgwZDdlLCAweDcwMDgsCisJMHgyMDY4LCAweDc4MzAsIDB4NjgyNiwgMHg3ODM0LCAweDY4MmEsIDB4NzgzOCwgMHg2ODJlLCAweDc4M2MsCisJMHg2ODMyLCAweDY4MGIsIDB4MDEwMCwgMHgwZDdmLCAweDcwMDcsIDB4MDAwMCwgMHgxMDc4LCAweDE0MDgsCisJMHgwMDdjLCAweGExOGMsIDB4MDcwMCwgMHgwMGMwLCAweDE1NWUsIDB4MTM3ZSwgMHgxNDdlLCAweDE1N2UsCisJMHgyMDAxLCAweGE2ZjgsIDB4MjAwNCwgMHhhMDgwLCAweDAwMGQsIDB4MjBhMCwgMHgyMDk5LCAweDAwMTQsCisJMHg3ODAzLCAweDAwNDAsIDB4MjBhOSwgMHgwMDIwLCAweDUzYTUsIDB4MjAwMSwgMHhhNmZhLCAweDIwMDQsCisJMHhkMGJjLCAweDAwNDAsIDB4MTU1NCwgMHgyMDAxLCAweGE3MDMsIDB4MjAwNCwgMHhhMDgwLCAweDAwMGQsCisJMHgyMGEwLCAweDIwYTksIDB4MDAyMCwgMHg1M2E1LCAweDE1N2YsIDB4MTQ3ZiwgMHgxMzdmLCAweDcwMDcsCisJMHgwMDAwLCAweDEwNzgsIDB4NGY4YywgMHgxMDc4LCAweDE0MDgsIDB4MDA3YywgMHgyMDExLCAweDgwMDMsCisJMHgxMDc4LCAweDM2MWIsIDB4MDA3OCwgMHgxNTYyLCAweGExOGMsIDB4MDcwMCwgMHgwMGMwLCAweDE1NzEsCisJMHgyMDAxLCAweGE3MjgsIDB4MjAwMywgMHgwMTAwLCAweDcwMDcsIDB4MDAwMCwgMHgxMDc4LCAweDE0MDgsCisJMHgwMDdjLCAweDIwMTEsIDB4ODAwNCwgMHgxMDc4LCAweDM2MWIsIDB4MDA3OCwgMHgxNTc1LCAweDEyN2UsCisJMHgyMDkxLCAweDIxMDAsIDB4MjA3OSwgMHgwMDMwLCAweDIwNzEsIDB4YThlNywgMHg3ODAzLCAweDAwMDQsCisJMHg3MDAzLCAweDAwMDAsIDB4NzAwZiwgMHhhOGVkLCAweDcwMTMsIDB4YThlZCwgMHg3ODBmLCAweDAwNzYsCisJMHg3ODAzLCAweDAwMDQsIDB4MTI3ZiwgMHgwMDdjLCAweDY5MzQsIDB4YTE4NCwgMHgwMDA3LCAweDAwNzksCisJMHgxNTkxLCAweDE1OTksIDB4MTVkZiwgMHgxNTk5LCAweDE1OTksIDB4MTU5OSwgMHgxNWM0LCAweDE1YTgsCisJMHgxNTlkLCAweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDE1ZjksIDB4Njg0YywgMHhkMGJjLCAweDAwNDAsCisJMHgxNTk5LCAweDY4NjAsIDB4NjgyZSwgMHg2ODVjLCAweDY4MmEsIDB4Njg1OCwgMHgwMDc4LCAweDE1ZTcsCisJMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDFlLCAweDAwYzAsIDB4MTU5OSwgMHg2ODRjLCAweGQwYmMsCisJMHgwMDQwLCAweDE1OTksIDB4Njg2MCwgMHg2ODJlLCAweDY4NWMsIDB4NjgyYSwgMHg2ODA0LCAweDY4MWEsCisJMHhhMDgwLCAweDAwMGQsIDB4MjAwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHgyMDZhLCAweDIwMDQsCisJMHg2ODMyLCAweDY4NTgsIDB4MDA3OCwgMHgxNWVmLCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMTUsCisJMHgwMGMwLCAweDE1OTksIDB4Njg0YywgMHhkMGFjLCAweDAwNDAsIDB4MTU5OSwgMHg2ODA0LCAweDY4MWEsCisJMHhhMDgwLCAweDAwMGQsIDB4MjAwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHgyMDZhLCAweDIwMDQsCisJMHg2ODMyLCAweGEwMDYsIDB4NjgyZSwgMHg2ODJhLCAweDY4NTgsIDB4MDA3OCwgMHgxNWVmLCAweDY4NGMsCisJMHhkMGFjLCAweDAwNDAsIDB4MTU5OSwgMHhhMDA2LCAweDY4MmUsIDB4NjgyYSwgMHg2ODU4LCAweGExOGMsCisJMHgwMDBmLCAweGExODgsIDB4MjA2YSwgMHgyMTBjLCAweDY5MzIsIDB4MmQwOCwgMHg2OTFhLCAweDY4MjYsCisJMHg2ODRjLCAweGMwZGQsIDB4Njg0ZSwgMHhhMDA2LCAweDY4MGEsIDB4Njk3YywgMHg2OTEyLCAweDY5ODAsCisJMHg2OTE2LCAweDAwN2MsIDB4MjBlMSwgMHgwMDA3LCAweDIwZTEsIDB4MjAwMCwgMHgyMDAxLCAweDAyMGEsCisJMHgyMDA0LCAweDgyZmYsIDB4MDA0MCwgMHgxNjFjLCAweGEyODAsIDB4MDAwNCwgMHgwZDdlLCAweDIwNmMsCisJMHg2ODRjLCAweGQwZGMsIDB4MDBjMCwgMHgxNjE4LCAweDEwNzgsIDB4MTU4YywgMHgwMDQwLCAweDE2MTgsCisJMHgwZDdmLCAweGEyODAsIDB4MDAwMCwgMHgyMDAzLCAweDAwMDIsIDB4YTAxNiwgMHgwMDc4LCAweDE2MWMsCisJMHg2ODA4LCAweDgwMDAsIDB4NjgwYSwgMHgwZDdmLCAweDEyN2UsIDB4MDQ3ZSwgMHgwMzdlLCAweDAyN2UsCisJMHgyMDkxLCAweDIxMDAsIDB4MDI3ZiwgMHgwMzdmLCAweDA0N2YsIDB4NzAwMCwgMHhhMDA1LCAweDAwYzAsCisJMHgxNjMwLCAweDcyMDYsIDB4MjAwMSwgMHgxNjUxLCAweDAwN2UsIDB4MjI2MCwgMHgwMDc4LCAweDE3ZTAsCisJMHg3MTBjLCAweDIyMGEsIDB4ODEwOCwgMHgyMzBhLCAweDgxMDgsIDB4MjQwYSwgMHg4MTA4LCAweGExODIsCisJMHhhOTA4LCAweDAwNDgsIDB4MTYzZCwgMHgyMDA5LCAweGE4ZWQsIDB4NzEwZSwgMHg3MDEwLCAweGExMDIsCisJMHhhMDgyLCAweDAwMDksIDB4MDA0MCwgMHgxNjQ4LCAweGEwODAsIDB4MDAxYiwgMHgwMGMwLCAweDE2NGIsCisJMHgyMDA5LCAweDAxMzgsIDB4MjAwYSwgMHg3MDAwLCAweGEwMDUsIDB4MDBjMCwgMHgxNjUxLCAweDEwNzgsCisJMHgxN2MxLCAweDEyN2YsIDB4MDA3YywgMHgxMjdlLCAweDAyN2UsIDB4MDM3ZSwgMHgwYzdlLCAweDAwN2UsCisJMHgyMDkxLCAweDIxMDAsIDB4MDA3ZiwgMHgwNDdmLCAweDAzN2YsIDB4MDI3ZiwgMHgwZDdlLCAweDBjN2UsCisJMHgyNDYwLCAweDYxMTAsIDB4MjE2OCwgMHg2YTYyLCAweDZiNWUsIDB4YTAwNSwgMHgwMDQwLCAweDE2ZGQsCisJMHg2ODA4LCAweGEwMDUsIDB4MDA0MCwgMHgxNzRhLCAweDcwMDAsIDB4YTAwNSwgMHgwMGMwLCAweDE2NzIsCisJMHgwMDc4LCAweDE2ZDIsIDB4NzAwYywgMHg3MTEwLCAweGExMDYsIDB4MDBjMCwgMHgxNzUzLCAweDcwMDQsCisJMHhhNDA2LCAweDAwYzAsIDB4MTZkMiwgMHgyMDAxLCAweDAwMDUsIDB4MjAwNCwgMHhkMDhjLCAweDAwNDAsCisJMHgxNjhmLCAweDA0N2UsIDB4MTA3OCwgMHgxOTEzLCAweDA0N2YsIDB4MjQ2MCwgMHg2MDEwLCAweGEwODAsCisJMHgwMDAyLCAweDIwMDQsIDB4YTAwNSwgMHgwMDQwLCAweDE3NGEsIDB4MDA3OCwgMHgxNjZjLCAweDIwMDEsCisJMHgwMjA3LCAweDIwMDQsIDB4ZDA5YywgMHgwMGMwLCAweDE2N2IsIDB4NzgwNCwgMHhhMDg0LCAweDYwMDAsCisJMHgwMDQwLCAweDE2YTAsIDB4YTA4NiwgMHg2MDAwLCAweDAwNDAsIDB4MTZhMCwgMHgwMDc4LCAweDE2N2IsCisJMHg3MTAwLCAweGExODYsIDB4MDAwMiwgMHgwMGMwLCAweDE2YzAsIDB4MGU3ZSwgMHgyYjY4LCAweDY4MTgsCisJMHgyMDYwLCAweDEwNzgsIDB4MjAzZiwgMHgyODA0LCAweGFjNzAsIDB4NjAzNCwgMHhkMDljLCAweDAwYzAsCisJMHgxNmI1LCAweDcxMDgsIDB4NzIwYywgMHgwMDc4LCAweDE2YjcsIDB4NzExMCwgMHg3MjE0LCAweDY4MTAsCisJMHhhMTAwLCAweDY4MTIsIDB4NjgxNCwgMHhhMjAxLCAweDY4MTYsIDB4MGU3ZiwgMHgwMDc4LCAweDE2YzQsCisJMHhhMTg2LCAweDAwMDEsIDB4MDBjMCwgMHgxNmNjLCAweDc4MjAsIDB4NjkxMCwgMHhhMTAwLCAweDY4MTIsCisJMHg3ODI0LCAweDY5MTQsIDB4YTEwMSwgMHg2ODE2LCAweDc4MDMsIDB4MDAwNCwgMHg3MDAzLCAweDAwMDAsCisJMHg3MDA0LCAweDIwNjAsIDB4NjEwMCwgMHhhMThlLCAweDAwMDQsIDB4MDBjMCwgMHgxNzUzLCAweDIwMDksCisJMHgwMDQ4LCAweDEwNzgsIDB4Nzc1YywgMHgwMDc4LCAweDE3NTMsIDB4NjgwOCwgMHhhMDA1LCAweDAwNDAsCisJMHgxNzRhLCAweDcwMDAsIDB4YTAwNSwgMHgwMGMwLCAweDE2ZTcsIDB4MDA3OCwgMHgxNzRhLCAweDcwMGMsCisJMHg3MTEwLCAweGExMDYsIDB4MDBjMCwgMHgxNmYwLCAweDcwMDQsIDB4YTQwNiwgMHgwMGMwLCAweDE3NGEsCisJMHgyMDAxLCAweDAwMDUsIDB4MjAwNCwgMHhkMDhjLCAweDAwNDAsIDB4MTcwNCwgMHgwNDdlLCAweDEwNzgsCisJMHgxOTEzLCAweDA0N2YsIDB4MjQ2MCwgMHg2MDEwLCAweGEwODAsIDB4MDAwMiwgMHgyMDA0LCAweGEwMDUsCisJMHgwMDQwLCAweDE3NGEsIDB4MDA3OCwgMHgxNmUxLCAweDIwMDEsIDB4MDIwNywgMHgyMDA0LCAweGQwOWMsCisJMHgwMGMwLCAweDE2ZjAsIDB4MjAwMSwgMHgwMDA1LCAweDIwMDQsIDB4ZDA4YywgMHgwMGMwLCAweDE2ZjYsCisJMHg3ODA0LCAweGEwODQsIDB4NjAwMCwgMHgwMDQwLCAweDE3MWIsIDB4YTA4NiwgMHg2MDAwLCAweDAwNDAsCisJMHgxNzFiLCAweDAwNzgsIDB4MTZmMCwgMHg3MDA3LCAweDAwMDAsIDB4YTAxNiwgMHgyMjE4LCAweDcwMDAsCisJMHhhMDhlLCAweDAwMDEsIDB4MDA0MCwgMHgxNzNjLCAweGEwOGUsIDB4MDAwMiwgMHgwMGMwLCAweDE3NGEsCisJMHgwYzdlLCAweDBlN2UsIDB4NjgxOCwgMHgyMDYwLCAweDEwNzgsIDB4MjAzZiwgMHgyODA0LCAweGFjNzAsCisJMHg2MDM0LCAweGQwOWMsIDB4MDBjMCwgMHgxNzM4LCAweDczMDgsIDB4NzIwYywgMHgwMDc4LCAweDE3M2EsCisJMHg3MzEwLCAweDcyMTQsIDB4MGU3ZiwgMHgwYzdmLCAweDc4MjAsIDB4YTMxOCwgMHg3ODI0LCAweGEyMTEsCisJMHg2ODEwLCAweGEzMDAsIDB4NjgxMiwgMHg2ODE0LCAweGEyMDEsIDB4NjgxNiwgMHg3ODAzLCAweDAwMDQsCisJMHg3MDAzLCAweDAwMDAsIDB4NjEwMCwgMHhhMThlLCAweDAwMDQsIDB4MDBjMCwgMHgxNzUzLCAweDIwMDksCisJMHgwMDQ4LCAweDEwNzgsIDB4Nzc1YywgMHgwYzdmLCAweDBkN2YsIDB4MTI3ZiwgMHgwMDdjLCAweDBmN2UsCisJMHgwZTdlLCAweDAyN2UsIDB4MDM3ZSwgMHgwNDdlLCAweDA1N2UsIDB4MjA3MSwgMHhhOGU3LCAweDcwMDAsCisJMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwgMHgxN2JhLCAweDcwMDQsIDB4YWMwNiwgMHgwMGMwLCAweDE3YWIsCisJMHgyMDc5LCAweDAwMzAsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDMsIDB4MDA0MCwgMHgxN2FiLCAweDc4MDQsCisJMHhkMGZjLCAweDAwYzAsIDB4MTdhNywgMHgyMGUxLCAweDYwMDAsIDB4MjAxMSwgMHgwMDMyLCAweDIwMDEsCisJMHgwMjA4LCAweDIwMGMsIDB4MjAwMSwgMHgwMjA5LCAweDIwMDQsIDB4YTEwNiwgMHgwMGMwLCAweDE3NmYsCisJMHg4MjExLCAweDAwYzAsIDB4MTc3NywgMHg3ODA0LCAweGQwZmMsIDB4MDBjMCwgMHgxN2E3LCAweDEwNzgsCisJMHgxYjIyLCAweDAyN2UsIDB4MDU3ZSwgMHg3ODAzLCAweDAwMDQsIDB4NzgwNCwgMHhkMGFjLCAweDAwYzAsCisJMHgxNzhkLCAweDc4MDMsIDB4MDAwMiwgMHg3ODAzLCAweDAwMDksIDB4NzAwMywgMHgwMDAzLCAweDcwMDcsCisJMHgwMDAwLCAweDA1N2YsIDB4MDI3ZiwgMHgyMDAxLCAweDAxNWQsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsCisJMHgwMTYwLCAweDI1MDIsIDB4MjAwMSwgMHgwMTM4LCAweDIyMDIsIDB4MDA3OCwgMHgxN2FiLCAweDEwNzgsCisJMHgxOTEzLCAweDAwNzgsIDB4MTc1ZiwgMHgxNTdlLCAweDIwYTksIDB4MDAwOSwgMHgyMDA5LCAweGE4ZWQsCisJMHgyMTA0LCAweGFjMDYsIDB4MDBjMCwgMHgxN2I1LCAweDIwMGEsIDB4YTE4OCwgMHgwMDAzLCAweDAwZjAsCisJMHgxN2IwLCAweDE1N2YsIDB4MDU3ZiwgMHgwNDdmLCAweDAzN2YsIDB4MDI3ZiwgMHgwZTdmLCAweDBmN2YsCisJMHgwMDdjLCAweDcwMGMsIDB4NzExMCwgMHhhMTA2LCAweDAwYzAsIDB4MTdjOSwgMHg3MDAzLCAweDAwMDAsCisJMHgwMDdjLCAweDIxMDQsIDB4NzAwNiwgMHgyMDYwLCAweDgxMDgsIDB4MjExYywgMHg4MTA4LCAweDIxMjQsCisJMHg4MTA4LCAweGExODIsIDB4YTkwOCwgMHgwMDQ4LCAweDE3ZDcsIDB4MjAwOSwgMHhhOGVkLCAweDcxMTIsCisJMHg3MDBjLCAweGExMDYsIDB4MDBjMCwgMHgxN2UwLCAweDIwMDEsIDB4MDEzOCwgMHgyMDAzLCAweDAwMDgsCisJMHg4Y2ZmLCAweDAwYzAsIDB4MTdlNywgMHgxMDc4LCAweDFiNGQsIDB4MDA3OCwgMHgxODU0LCAweDYwMTAsCisJMHgyMDY4LCAweDJkNTgsIDB4NjgyOCwgMHhhNDA2LCAweDAwYzAsIDB4MTdmMiwgMHg2ODJjLCAweGEzMDYsCisJMHgwMDQwLCAweDE4MmYsIDB4NjAxYywgMHhhMDg2LCAweDAwMDgsIDB4MDA0MCwgMHgxODJmLCAweDYwMjQsCisJMHhkMGY0LCAweDAwYzAsIDB4MTgxYywgMHhkMGQ0LCAweDAwNDAsIDB4MTgxOCwgMHg2MDM4LCAweGE0MDIsCisJMHg2MDM0LCAweGEzMDMsIDB4MDA0MCwgMHgxODA2LCAweDAwYzgsIDB4MTgxOCwgMHg2NDNhLCAweDYzMzYsCisJMHg2YzJhLCAweDZiMmUsIDB4MDQ3ZSwgMHgwMzdlLCAweDI0MDAsIDB4NmM3YywgMHhhNDAyLCAweDY4MTIsCisJMHgyMzAwLCAweDZiODAsIDB4YTMwMywgMHg2ODE2LCAweDAzN2YsIDB4MDQ3ZiwgMHgwMDc4LCAweDE4MWMsCisJMHgxMDc4LCAweDkwNTMsIDB4MDA0MCwgMHgxN2UzLCAweDIwMDEsIDB4YTY3NCwgMHgyMDA0LCAweGQwYjQsCisJMHgwMGMwLCAweDE4MmIsIDB4NjAxOCwgMHgyMDA0LCAweGQwYmMsIDB4MDBjMCwgMHgxODJiLCAweDY4MTcsCisJMHg3ZmZmLCAweDY4MTMsIDB4ZmZmZiwgMHgxMDc4LCAweDIwOGEsIDB4MDBjMCwgMHgxN2UzLCAweDBjN2UsCisJMHg3MDA0LCAweDIwNjAsIDB4NjAyNCwgMHhjMGQ0LCAweDYwMjYsIDB4MGM3ZiwgMHg2ODRjLCAweGQwZjQsCisJMHgwMDQwLCAweDE4NDAsIDB4NjgxNywgMHhmZmZmLCAweDY4MTMsIDB4ZmZmZiwgMHgwMDc4LCAweDE3ZTMsCisJMHg2ODI0LCAweDIwNTAsIDB4NjgxOCwgMHgyMDYwLCAweDY4MzAsIDB4MjA0MCwgMHg2MDM0LCAweGEwY2MsCisJMHgwMDBmLCAweDIwMDksIDB4MDAxMSwgMHgxMDc4LCAweDE4NTUsIDB4MDA0MCwgMHgxODUzLCAweDIwMDksCisJMHgwMDAxLCAweDEwNzgsIDB4MTg1NSwgMHgyZDU4LCAweDAwN2MsIDB4OGFmZiwgMHgwMDQwLCAweDE4ZWMsCisJMHhhMDNlLCAweDI3MzAsIDB4Njg1MCwgMHhkMGZjLCAweDAwYzAsIDB4MTg3NywgMHhkMGY0LCAweDAwYzAsCisJMHgxODg3LCAweDBkN2UsIDB4MjgwNCwgMHhhYzY4LCAweDI5MDAsIDB4MDA3OSwgMHgxODY3LCAweDE4Y2UsCisJMHgxODhlLCAweDE4OGUsIDB4MThjZSwgMHgxOGNlLCAweDE4YzYsIDB4MThjZSwgMHgxODhlLCAweDE4Y2UsCisJMHgxODk0LCAweDE4OTQsIDB4MThjZSwgMHgxOGNlLCAweDE4Y2UsIDB4MThiZCwgMHgxODk0LCAweGMwZmMsCisJMHg2ODUyLCAweDZiNmMsIDB4NmE3MCwgMHg2ZDFjLCAweDZjMjAsIDB4MGQ3ZSwgMHhkOTljLCAweDAwNDAsCisJMHgxOGQxLCAweDI4MDQsIDB4YWM2OCwgMHg2ZjA4LCAweDZlMGMsIDB4MDA3OCwgMHgxOGQxLCAweGMwZjQsCisJMHg2ODUyLCAweDZiNmMsIDB4NmE3MCwgMHgwZDdlLCAweDAwNzgsIDB4MThkOCwgMHg2YjA4LCAweDZhMGMsCisJMHg2ZDAwLCAweDZjMDQsIDB4MDA3OCwgMHgxOGQxLCAweDdiMGMsIDB4ZDNiYywgMHgwMDQwLCAweDE4YjUsCisJMHg3MDA0LCAweDBlN2UsIDB4MjA3MCwgMHg3MDFjLCAweDBlN2YsIDB4YTA4NiwgMHgwMDA4LCAweDAwYzAsCisJMHgxOGI1LCAweDdiMDgsIDB4YTM5YywgMHgwZmZmLCAweDJkMjAsIDB4MGQ3ZiwgMHgwZDdlLCAweDZhMTQsCisJMHg4MmZmLCAweDAwYzAsIDB4MThiMCwgMHg2ODEwLCAweGEzMDIsIDB4MDA0OCwgMHgxOGIwLCAweDZiMTAsCisJMHgyMDExLCAweDAwMDAsIDB4MjQ2OCwgMHgwMDc4LCAweDE4YjcsIDB4NmIxMCwgMHg2YTE0LCAweDZkMDAsCisJMHg2YzA0LCAweDZmMDgsIDB4NmUwYywgMHgwMDc4LCAweDE4ZDEsIDB4MGQ3ZiwgMHgwZDdlLCAweDY4MzQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDFlLCAweDAwYzAsIDB4MThjZSwgMHgwZDdmLCAweDEwNzgsCisJMHgyMDI2LCAweDAwYzAsIDB4MTg1NSwgMHhhMDBlLCAweDAwNzgsIDB4MThlYywgMHgwZDdmLCAweDEwNzgsCisJMHgxMzMyLCAweDdiMjIsIDB4N2EyNiwgMHg3ZDMyLCAweDdjMzYsIDB4N2YzYSwgMHg3ZTNlLCAweDc5MDIsCisJMHg3MDAwLCAweDgwMDAsIDB4NzAwMiwgMHgwZDdmLCAweDY4MjgsIDB4YTMwMCwgMHg2ODJhLCAweDY4MmMsCisJMHhhMjAxLCAweDY4MmUsIDB4MjMwMCwgMHg2YjEwLCAweGEzMDIsIDB4NjgxMiwgMHgyMjAwLCAweDZhMTQsCisJMHhhMjAzLCAweDY4MTYsIDB4MTA3OCwgMHgyMDI2LCAweDAwN2MsIDB4MTA3OCwgMHgxMzMyLCAweDEwNzgsCisJMHgxYzk3LCAweDcwMDQsIDB4MjA2MCwgMHgwZDdlLCAweDYwMTAsIDB4MjA2OCwgMHg3MDAzLCAweDAwMDAsCisJMHgxMDc4LCAweDFhZjQsIDB4MTA3OCwgMHg4ZDA2LCAweDAwNDAsIDB4MTkwYywgMHg2ODA4LCAweDgwMDEsCisJMHg2ODBhLCAweDY5N2MsIDB4NjkxMiwgMHg2OTgwLCAweDY5MTYsIDB4NjgyYiwgMHhmZmZmLCAweDY4MmYsCisJMHhmZmZmLCAweDY4NTAsIDB4YzBiZCwgMHg2ODUyLCAweDBkN2YsIDB4MTA3OCwgMHg4YTAxLCAweDAwNzgsCisJMHgxYWRiLCAweDEwNzgsIDB4MTMzMiwgMHgxMjdlLCAweDIwOTEsIDB4MjEwMCwgMHgwMDdlLCAweDAxN2UsCisJMHgyYjY4LCAweDY4MTgsIDB4MjA2MCwgMHg3OTA0LCAweDc4MDMsIDB4MDAwMiwgMHhhMTg0LCAweDA3MDAsCisJMHgwMGMwLCAweDE4ZWYsIDB4YTE4NCwgMHgwMDAzLCAweGEwODYsIDB4MDAwMywgMHgwMDQwLCAweDE5MTEsCisJMHg3MDAwLCAweDAwNzksIDB4MTkyYiwgMHgxOTMzLCAweDE5MzUsIDB4MWEzNCwgMHgxYWIyLCAweDFhYzksCisJMHgxOTMzLCAweDE5MzMsIDB4MTkzMywgMHgxMDc4LCAweDEzMzIsIDB4ODAwMSwgMHg3MDAyLCAweGExODQsCisJMHgwODgwLCAweDAwYzAsIDB4MTk0YSwgMHg4YWZmLCAweDAwNDAsIDB4MTlkNCwgMHgyMDA5LCAweDAwMDEsCisJMHgxMDc4LCAweDE4NTUsIDB4MDA0MCwgMHgxYWRiLCAweDIwMDksIDB4MDAwMSwgMHgxMDc4LCAweDE4NTUsCisJMHgwMDc4LCAweDFhZGIsIDB4NzgwMywgMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwgMHhkMWJjLCAweDAwYzAsCisJMHgxOWIyLCAweDAyN2UsIDB4MDM3ZSwgMHgwMTdlLCAweDc4MDgsIDB4ZDBlYywgMHgwMGMwLCAweDE5NjIsCisJMHg3YzIwLCAweDdkMjQsIDB4N2UzMCwgMHg3ZjM0LCAweDc4MDMsIDB4MDAwOSwgMHg3MDAzLCAweDAwMDQsCisJMHgwMDc4LCAweDE5NjQsIDB4MTA3OCwgMHgxYmQ3LCAweDAxN2YsIDB4ZDE5NCwgMHgwMDQwLCAweDE5NmIsCisJMHg4YWZmLCAweDAwNDAsIDB4MTlhMSwgMHg2YjI4LCAweDZhMmMsIDB4MjQwMCwgMHg2ODZlLCAweGEzMWEsCisJMHgyNTAwLCAweDY4NzIsIDB4YTIxMywgMHg2YjJhLCAweDZhMmUsIDB4MGM3ZSwgMHg3MDA0LCAweDIwNjAsCisJMHg2MDI0LCAweGQwZjQsIDB4MDBjMCwgMHgxOTdlLCAweDYzM2EsIDB4NjIzNiwgMHgwYzdmLCAweDI0MDAsCisJMHg2OTEwLCAweGExMDAsIDB4NjgxMiwgMHgyNTAwLCAweDY5MTQsIDB4YTEwMSwgMHg2ODE2LCAweDAzN2YsCisJMHgwMjdmLCAweDI2MDAsIDB4NjgxZSwgMHgyNzAwLCAweDY4MjIsIDB4MTA3OCwgMHgyMDNmLCAweDJhMDAsCisJMHg2ODI2LCAweDJjMDAsIDB4NjgxYSwgMHgyODAwLCAweDY4MzIsIDB4Njg1MCwgMHhjMGZkLCAweDY4NTIsCisJMHg2ODA4LCAweDgwMDEsIDB4NjgwYSwgMHgwMGMwLCAweDE5YTcsIDB4Njg0YywgMHhkMGU0LCAweDAwNDAsCisJMHgxOWE3LCAweDcwMDQsIDB4MjA2MCwgMHgyMDA5LCAweDAwNDgsIDB4MTA3OCwgMHg3NzVjLCAweDcwMDAsCisJMHhhMDg2LCAweDAwMDQsIDB4MDA0MCwgMHgxYWRiLCAweDcwMDMsIDB4MDAwMCwgMHgxMDc4LCAweDE3YzEsCisJMHgwMDc4LCAweDFhZGIsIDB4MDU3ZSwgMHg3ZDBjLCAweGQ1YmMsIDB4MDBjMCwgMHgxOWI5LCAweDEwNzgsCisJMHhhNTdlLCAweDA1N2YsIDB4MTA3OCwgMHgxYWY0LCAweDBmN2UsIDB4NzAwNCwgMHgyMDc4LCAweDEwNzgsCisJMHg0OTYzLCAweDAwNDAsIDB4MTljNiwgMHg3ODI0LCAweGMwZjUsIDB4NzgyNiwgMHgwZjdmLCAweDY4MmIsCisJMHhmZmZmLCAweDY4MmYsIDB4ZmZmZiwgMHg2ODA4LCAweDgwMDEsIDB4NjgwYSwgMHg2OTdjLCAweDY5MTIsCisJMHg2OTgwLCAweDY5MTYsIDB4MDA3OCwgMHgxYWRiLCAweDcwMDQsIDB4MGM3ZSwgMHgyMDYwLCAweDYwMjQsCisJMHgwYzdmLCAweGQwZjQsIDB4MDA0MCwgMHgxOWUxLCAweDY4MDgsIDB4ODAwMSwgMHg2ODBhLCAweDAwNzgsCisJMHgxOWY1LCAweDY4NGMsIDB4YzBmNSwgMHg2ODRlLCAweDc4MTQsIDB4YTAwNSwgMHgwMGMwLCAweDE5ZjksCisJMHg3MDAzLCAweDAwMDAsIDB4NjgwOCwgMHg4MDAxLCAweDY4MGEsIDB4MDBjMCwgMHgxOWY1LCAweDcwMDQsCisJMHgyMDYwLCAweDIwMDksIDB4MDA0OCwgMHgxMDc4LCAweDc3NWMsIDB4MTA3OCwgMHgxN2MxLCAweDAwNzgsCisJMHgxYWRiLCAweDc4MTQsIDB4NjkxMCwgMHhhMTAyLCAweDY4MTIsIDB4NjkxNCwgMHhhMTgzLCAweDAwMDAsCisJMHg2ODE2LCAweDc4MTQsIDB4NzkwOCwgMHhhMThjLCAweDBmZmYsIDB4YTE5MiwgMHgwODQxLCAweDAwYzgsCisJMHgxOGVmLCAweGExODgsIDB4MDAwNywgMHg4MTE0LCAweDgyMTQsIDB4ODIxNCwgMHhhMTBhLCAweDgxMDQsCisJMHg4MDA0LCAweDgwMDQsIDB4YTIwYSwgMHg4MTBiLCAweDgxMGIsIDB4ODEwYiwgMHgxMDc4LCAweDFiNWUsCisJMHg3ODAzLCAweDAwMDQsIDB4NzgwZiwgMHhmZmZmLCAweDc4MDMsIDB4MDAwMSwgMHg3ODA0LCAweGQwZmMsCisJMHgwMDQwLCAweDFhMWUsIDB4NzgwMywgMHgwMDAyLCAweDc4MDMsIDB4MDAwNCwgMHg3ODBmLCAweDAwNzYsCisJMHg3MDA0LCAweDcwMDcsIDB4MDAwMCwgMHgyMDYwLCAweDIwMDksIDB4MDA0OCwgMHgxMDc4LCAweDc3NWMsCisJMHgxMDc4LCAweDFiOTIsIDB4MDA0MCwgMHgxOWY1LCAweDgwMDEsIDB4NzAwMiwgMHhkMTk0LCAweDAwNDAsCisJMHgxYTQ2LCAweDc4MDQsIDB4ZDBmYywgMHgwMGMwLCAweDE5MWIsIDB4OGFmZiwgMHgwMDQwLCAweDFhZGIsCisJMHgyMDA5LCAweDAwMDEsIDB4MTA3OCwgMHgxODU1LCAweDAwNzgsIDB4MWFkYiwgMHhhMTg0LCAweDA4ODAsCisJMHgwMGMwLCAweDFhNTMsIDB4OGFmZiwgMHgwMDQwLCAweDFhZGIsIDB4MjAwOSwgMHgwMDAxLCAweDEwNzgsCisJMHgxODU1LCAweDAwNzgsIDB4MWFkYiwgMHg3ODAzLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLCAweGQxYmMsCisJMHgwMGMwLCAweDFhOTMsIDB4MDI3ZSwgMHgwMzdlLCAweDc4MDgsIDB4ZDBlYywgMHgwMGMwLCAweDFhNjYsCisJMHg3ODAzLCAweDAwMDksIDB4NzAwMywgMHgwMDA0LCAweDAwNzgsIDB4MWE2OCwgMHgxMDc4LCAweDFiZDcsCisJMHg2YjI4LCAweDZhMmMsIDB4MTA3OCwgMHgyMDNmLCAweDBkN2UsIDB4MGY3ZSwgMHgyZDc4LCAweDI4MDQsCisJMHhhYzY4LCAweDYwMzQsIDB4ZDA5YywgMHgwMGMwLCAweDFhODMsIDB4NjgwOCwgMHgyMDA4LCAweGEzMWEsCisJMHg2ODBjLCAweGEyMTMsIDB4NzgxMCwgMHhhMTAwLCAweDc4MTIsIDB4NjkwYywgMHg3ODE0LCAweGExMDEsCisJMHg3ODE2LCAweDAwNzgsIDB4MWE4ZiwgMHg2ODEwLCAweDIwMDgsIDB4YTMxYSwgMHg2ODE0LCAweGEyMTMsCisJMHg3ODEwLCAweGExMDAsIDB4NzgxMiwgMHg2OTE0LCAweDc4MTQsIDB4YTEwMSwgMHg3ODE2LCAweDBmN2YsCisJMHgwZDdmLCAweDAwNzgsIDB4MTk2ZCwgMHgwNTdlLCAweDdkMGMsIDB4MTA3OCwgMHhhNTdlLCAweDA1N2YsCisJMHgxMDc4LCAweDFhZjQsIDB4MGY3ZSwgMHg3MDA0LCAweDIwNzgsIDB4MTA3OCwgMHg0OTYzLCAweDAwNDAsCisJMHgxYWE0LCAweDc4MjQsIDB4YzBmNSwgMHg3ODI2LCAweDBmN2YsIDB4NjgyYiwgMHhmZmZmLCAweDY4MmYsCisJMHhmZmZmLCAweDY4MDgsIDB4ODAwMSwgMHg2ODBhLCAweDY5N2MsIDB4NjkxMiwgMHg2OTgwLCAweDY5MTYsCisJMHgwMDc4LCAweDFhZGIsIDB4NzgwMywgMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwgMHg3MDA0LCAweGEwMGQsCisJMHgwMDQwLCAweDFhYzUsIDB4NjgwOCwgMHg4MDAxLCAweDY4MGEsIDB4MDBjMCwgMHgxYWM1LCAweDcwMDQsCisJMHgyMDYwLCAweDIwMDksIDB4MDA0OCwgMHgxMDc4LCAweDc3NWMsIDB4MTA3OCwgMHgxN2MxLCAweDAwNzgsCisJMHgxYWRiLCAweDc4MDMsIDB4MDAwNCwgMHg3MDAzLCAweDAwMDAsIDB4NzAwNCwgMHgyMDYwLCAweDYwMTAsCisJMHhhMDA1LCAweDAwNDAsIDB4MWFjNSwgMHgyMDY4LCAweDY4MDgsIDB4ODAwMCwgMHg2ODBhLCAweDZjMjgsCisJMHg2YjJjLCAweDEwNzgsIDB4MTdlMCwgMHgwMTdmLCAweDAwN2YsIDB4MTI3ZiwgMHgwMDdjLCAweDEyN2UsCisJMHgyMDkxLCAweDIxMDAsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHgxYWYyLCAweDcwMGMsCisJMHg3MTEwLCAweGExMDYsIDB4MDA0MCwgMHgxYWYyLCAweDIwZTEsIDB4OTAyOCwgMHg3MDBmLCAweGE4ZWQsCisJMHg3MDEzLCAweGE4ZWQsIDB4MTI3ZiwgMHgwMDdjLCAweDBjN2UsIDB4MTA3OCwgMHgxYjIyLCAweDIwZTEsCisJMHg5MDI4LCAweDcwMGMsIDB4NzExMCwgMHhhMTA2LCAweDAwNDAsIDB4MWIxOSwgMHgyMTA0LCAweGEwMDUsCisJMHgwMDQwLCAweDFiMDgsIDB4MjA2MCwgMHg2MDEwLCAweDIwNjAsIDB4NjAwOCwgMHg4MDAxLCAweDYwMGEsCisJMHhhMTg4LCAweDAwMDMsIDB4YTE4MiwgMHhhOTA4LCAweDAwNDgsIDB4MWIxMCwgMHgyMDA5LCAweGE4ZWQsCisJMHg3MTEyLCAweDcwMGMsIDB4YTEwNiwgMHgwMGMwLCAweDFhZjksIDB4MjAxMSwgMHgwMDA4LCAweDAwNzgsCisJMHgxYWY5LCAweDIwMDEsIDB4MDE1ZCwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgwMTM4LCAweDIyMDIsCisJMHgwYzdmLCAweDAwN2MsIDB4MjAwMSwgMHgwMTM4LCAweDIwMTQsIDB4MjAwMywgMHgwMDAwLCAweDIwMjEsCisJMHhiMDE1LCAweDIwMDEsIDB4MDE0MSwgMHgyMDFjLCAweGQzZGMsIDB4MDBjMCwgMHgxYjNmLCAweDIwMDEsCisJMHgwMTA5LCAweDIwMWMsIDB4YTM5YywgMHgwMDQ4LCAweDAwYzAsIDB4MWIzZiwgMHgyMDAxLCAweDAxMTEsCisJMHgyMDFjLCAweDgzZmYsIDB4MDBjMCwgMHgxYjNmLCAweDg0MjEsIDB4MDBjMCwgMHgxYjI5LCAweDAwN2MsCisJMHgyMDExLCAweDAyMDEsIDB4MjAwOSwgMHgwMDNjLCAweDIyMDQsIDB4YTAwNSwgMHgwMGMwLCAweDFiNGMsCisJMHg4MTA5LCAweDAwYzAsIDB4MWI0NCwgMHgwMDdjLCAweDAwN2MsIDB4MTA3OCwgMHgxYjQwLCAweDAwNDAsCisJMHgxYjU1LCAweDc4MGMsIDB4ZDBhNCwgMHgwMDQwLCAweDFiNWIsIDB4MTA3OCwgMHgxYWY0LCAweGEwODUsCisJMHgwMDAxLCAweDAwNzgsIDB4MWI1ZCwgMHgxMDc4LCAweDFiOTIsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsCisJMHgwMjAwLCAweDc4MDgsIDB4YTA4NCwgMHhmMDAwLCAweGExMGQsIDB4MTA3OCwgMHgxYjIyLCAweDIwMTksCisJMHg1MDAwLCAweDgzMTksIDB4MDA0MCwgMHgxYjdjLCAweDIwMDEsIDB4YTkwOCwgMHgyMDA0LCAweGEwODYsCisJMHgwMDAwLCAweDAwNDAsIDB4MWI3YywgMHgyMDAxLCAweDAwMjEsIDB4ZDBmYywgMHgwMDQwLCAweDFiNjksCisJMHgxMDc4LCAweDFlYWEsIDB4MDA3OCwgMHgxYjY3LCAweDIwZTEsIDB4NzAwMCwgMHg3MzI0LCAweDc0MjAsCisJMHg3MDI4LCAweDcwMjgsIDB4NzQyNiwgMHg3MDM3LCAweDAwMDEsIDB4ODEwZiwgMHg3MTJlLCAweDcwMmYsCisJMHgwMTAwLCAweDcwMzcsIDB4MDAwOCwgMHg3MzI2LCAweDc0MjIsIDB4MjAwMSwgMHgwMTM4LCAweDIyMDIsCisJMHgwZTdmLCAweDAwN2MsIDB4MDI3ZSwgMHgyMDAxLCAweDAxNWQsIDB4MjAwMSwgMHgwMDAwLCAweDc5MDgsCisJMHhhMThjLCAweDBmZmYsIDB4YTE4MiwgMHgwZmZkLCAweDAwNDgsIDB4MWJhMCwgMHgyMDA5LCAweDAwMDAsCisJMHhhMTkwLCAweDAwMDcsIDB4YTI5NCwgMHgxZmY4LCAweDgyMTQsIDB4ODIxNCwgMHg4MjE0LCAweDIwMDEsCisJMHgwMjBhLCAweDgyZmYsIDB4MDA0MCwgMHgxYmI1LCAweDIwZTEsIDB4NjAwMCwgMHgyMDBjLCAweDIwMGMsCisJMHgyMDBjLCAweDIwMGMsIDB4ODIxMSwgMHgwMGMwLCAweDFiYWUsIDB4MjBlMSwgMHg3MDAwLCAweDIwMGMsCisJMHgyMDBjLCAweDcwMDMsIDB4MDAwMCwgMHgyMGUxLCAweDYwMDAsIDB4MjAwMSwgMHgwMjA4LCAweDIwMGMsCisJMHgyMDAxLCAweDAyMDksIDB4MjAwNCwgMHhhMTA2LCAweDAwNDAsIDB4MWJkNCwgMHgxMDc4LCAweDFiNDAsCisJMHgwMDQwLCAweDFiZDIsIDB4NzkwOCwgMHhkMWVjLCAweDAwYzAsIDB4MWJkNCwgMHg3OTBjLCAweGQxYTQsCisJMHgwMDQwLCAweDFiOTcsIDB4MTA3OCwgMHgxYWY0LCAweGEwMDYsIDB4MDI3ZiwgMHgwMDdjLCAweDdjMjAsCisJMHg3ZDI0LCAweDdlMzAsIDB4N2YzNCwgMHg3MDBjLCAweDcxMTAsIDB4YTEwNiwgMHgwMDQwLCAweDFjNjksCisJMHg3MDA0LCAweDAxN2UsIDB4MjEwYywgMHhhMTA2LCAweDAxN2YsIDB4MDA0MCwgMHgxYzY5LCAweDBkN2UsCisJMHgwYzdlLCAweDIxNmMsIDB4MmQwMCwgMHhhMDA1LCAweDAwNDAsIDB4MWM2NywgMHg2ODFjLCAweGEwODYsCisJMHgwMDA4LCAweDAwNDAsIDB4MWM2NywgMHg2ODI0LCAweGQwZDQsIDB4MDBjMCwgMHgxYzY3LCAweDY4MTAsCisJMHgyMDY4LCAweDY4NTAsIDB4ZDBmYywgMHgwMDQwLCAweDFjMjksIDB4ODEwOCwgMHgyMTA0LCAweDZiMmMsCisJMHhhMzA2LCAweDAwYzAsIDB4MWM2NywgMHg4MTA4LCAweDIxMDQsIDB4NmEyOCwgMHhhMjA2LCAweDAwYzAsCisJMHgxYzY3LCAweDY4NTAsIDB4YzBmYywgMHhjMGY1LCAweDY4NTIsIDB4Njg2YywgMHg3ODIyLCAweDY4NzAsCisJMHg3ODI2LCAweDY4MWMsIDB4NzgzMiwgMHg2ODIwLCAweDc4MzYsIDB4NjgxOCwgMHgyMDYwLCAweDYwMzQsCisJMHhkMDljLCAweDAwNDAsIDB4MWMyNCwgMHg2ODMwLCAweDIwMDQsIDB4YWM2OCwgMHg2ODA4LCAweDc4M2EsCisJMHg2ODBjLCAweDc4M2UsIDB4MDA3OCwgMHgxYzY1LCAweGEwMDYsIDB4NzgzYSwgMHg3ODNlLCAweDAwNzgsCisJMHgxYzY1LCAweDgxMDgsIDB4MjEwNCwgMHhhMDA1LCAweDAwYzAsIDB4MWM2NywgMHg2YjJjLCAweGEzMDYsCisJMHgwMGMwLCAweDFjNjcsIDB4ODEwOCwgMHgyMTA0LCAweGEwMDUsIDB4MDBjMCwgMHgxYzY3LCAweDZhMjgsCisJMHhhMjA2LCAweDAwYzAsIDB4MWM2NywgMHg2ODUwLCAweGMwZjUsIDB4Njg1MiwgMHg2ODMwLCAweDIwMDQsCisJMHg2OTE4LCAweGExNjAsIDB4YTE4MCwgMHgwMDBkLCAweDIwMDQsIDB4ZDA5YywgMHgwMGMwLCAweDFjNTcsCisJMHg2MDA4LCAweDc4MjIsIDB4Njg2ZSwgMHg2MDBjLCAweDc4MjYsIDB4Njg3MiwgMHg2MDAwLCAweDc4MzIsCisJMHg2MDA0LCAweDc4MzYsIDB4YTAwNiwgMHg3ODNhLCAweDc4M2UsIDB4MDA3OCwgMHgxYzY1LCAweDYwMTAsCisJMHg3ODIyLCAweDY4NmUsIDB4NjAxNCwgMHg3ODI2LCAweDY4NzIsIDB4NjAwMCwgMHg3ODMyLCAweDYwMDQsCisJMHg3ODM2LCAweDYwMDgsIDB4NzgzYSwgMHg2MDBjLCAweDc4M2UsIDB4NzgwMywgMHgwMDExLCAweDBjN2YsCisJMHgwZDdmLCAweDAwN2MsIDB4MGY3ZSwgMHgwZTdlLCAweDAxN2UsIDB4MDI3ZSwgMHgyMDcxLCAweGE4ZTcsCisJMHgyMDc5LCAweDAwMzAsIDB4MjAxMSwgMHgwMDUwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAwLCAweDAwNDAsCisJMHgxYzkyLCAweDgyMTEsIDB4MDA0MCwgMHgxYzkwLCAweDIwMDEsIDB4MDAwNSwgMHgyMDA0LCAweGQwOGMsCisJMHgwMDQwLCAweDFjNzksIDB4NzkwNCwgMHhhMThjLCAweDA3ODAsIDB4MDE3ZSwgMHgxMDc4LCAweDE5MTMsCisJMHgwMTdmLCAweDgxZmYsIDB4MDBjMCwgMHgxYzkwLCAweDIwMTEsIDB4MDA1MCwgMHgwMDc4LCAweDFjNzQsCisJMHhhMDg1LCAweDAwMDEsIDB4MDI3ZiwgMHgwMTdmLCAweDBlN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDc4MDMsCisJMHgwMDA0LCAweDIwMDksIDB4MDA2NCwgMHg3ODA0LCAweGQwYWMsIDB4MDA0MCwgMHgxY2U4LCAweDgxMDksCisJMHgwMGMwLCAweDFjOWIsIDB4MjAwOSwgMHgwMTAwLCAweDIxMGMsIDB4YTE4YSwgMHgwMDAzLCAweDEwNDgsCisJMHgxMzMyLCAweDEwNzgsIDB4MWZjYSwgMHgwZTdlLCAweDBmN2UsIDB4MjA3MSwgMHhhOGQ2LCAweDIwNzksCisJMHgwMDEwLCAweDcwMDQsIDB4YTA4NiwgMHgwMDAwLCAweDAwNDAsIDB4MWNlMCwgMHg3ODAwLCAweDAwN2UsCisJMHg3ODIwLCAweDAwN2UsIDB4NzgzMCwgMHgwMDdlLCAweDc4MzQsIDB4MDA3ZSwgMHg3ODM4LCAweDAwN2UsCisJMHg3ODNjLCAweDAwN2UsIDB4NzgwMywgMHgwMDA0LCAweDc4MjMsIDB4MDAwMCwgMHgwMDA1LCAweDAwMDUsCisJMHgyMDc5LCAweDAwMzAsIDB4NzgwNCwgMHhkMGFjLCAweDEwYzAsIDB4MTMzMiwgMHgyMDc5LCAweDAwMTAsCisJMHgwMDdmLCAweDc4M2UsIDB4MDA3ZiwgMHg3ODNhLCAweDAwN2YsIDB4NzgzNiwgMHgwMDdmLCAweDc4MzIsCisJMHgwMDdmLCAweDc4MjIsIDB4MDA3ZiwgMHg3ODAyLCAweDBmN2YsIDB4MGU3ZiwgMHgwMDc4LCAweDFjZTYsCisJMHgwZjdmLCAweDBlN2YsIDB4NzgwNCwgMHhkMGFjLCAweDEwYzAsIDB4MTMzMiwgMHgxMDc4LCAweDYzOWIsCisJMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhOTA4LCAweDcwMDMsIDB4MDAwMCwgMHgwZTdmLCAweDAwN2MsCisJMHgwZDdlLCAweGEyODAsIDB4MDAwNCwgMHgyMDZjLCAweDY5NGMsIDB4ZDFkYywgMHgwMGMwLCAweDFkNmIsCisJMHg2OTM0LCAweGExODQsIDB4MDAwNywgMHgwMDc5LCAweDFjZmQsIDB4MWQwNSwgMHgxZDU2LCAweDFkMDUsCisJMHgxZDA1LCAweDFkMDUsIDB4MWQzYiwgMHgxZDE4LCAweDFkMDcsIDB4MTA3OCwgMHgxMzMyLCAweDY4NGMsCisJMHhkMGI0LCAweDAwNDAsIDB4MWU3OSwgMHg2ODYwLCAweDY4MmUsIDB4NjgxNiwgMHg2ODVjLCAweDY4MmEsCisJMHg2ODEyLCAweDY4N2MsIDB4NjgwYSwgMHg2ODgwLCAweDY4MGUsIDB4Njk1OCwgMHgwMDc4LCAweDFkNWUsCisJMHg2ODM0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMWUsIDB4MDBjMCwgMHgxZDA1LCAweDY4NGMsCisJMHhkMGI0LCAweDAwNDAsIDB4MWU3OSwgMHg2ODYwLCAweDY4MmUsIDB4NjgxNiwgMHg2ODVjLCAweDY4MmEsCisJMHg2ODEyLCAweDY4N2MsIDB4NjgwYSwgMHg2ODgwLCAweDY4MGUsIDB4NjgwNCwgMHg2ODFhLCAweGEwODAsCisJMHgwMDBkLCAweDIwMDQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODAsIDB4MjA2YSwgMHgyMDA0LCAweDY4MzIsCisJMHg2OTU4LCAweDAwNzgsIDB4MWQ2NywgMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDE1LCAweDAwYzAsCisJMHgxZDZiLCAweDY4NGMsIDB4ZDBiNCwgMHgwMDQwLCAweDFlNzksIDB4NjgwNCwgMHg2ODFhLCAweGEwODAsCisJMHgwMDBkLCAweDIwMDQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODAsIDB4MjA2YSwgMHgyMDA0LCAweDY4MzIsCisJMHg2OTU4LCAweGEwMDYsIDB4NjgyZSwgMHg2ODJhLCAweDAwNzgsIDB4MWQ2NywgMHg2ODRjLCAweGQwYjQsCisJMHgwMDQwLCAweDE4ZWQsIDB4Njk1OCwgMHhhMDA2LCAweDY4MmUsIDB4NjgyYSwgMHgyZDAwLCAweDY4MWEsCisJMHg2ODM0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDIwNmEsIDB4MjAwNCwgMHg2ODMyLCAweDY5MjYsCisJMHg2ODRjLCAweGMwZGQsIDB4Njg0ZSwgMHgwZDdmLCAweDAwN2MsIDB4MGY3ZSwgMHgyMDc5LCAweDAwMjAsCisJMHg3ODA0LCAweGQwZmMsIDB4MTBjMCwgMHgxZWFhLCAweDBlN2UsIDB4MGQ3ZSwgMHgyMDcxLCAweGE5MDgsCisJMHg3MDAwLCAweGEwMDUsIDB4MDBjMCwgMHgxZGYwLCAweDBjN2UsIDB4NzIwNiwgMHhhMjgwLCAweDAwMDQsCisJMHgyMDVjLCAweDcwMDQsIDB4MjA2OCwgMHg3ODAzLCAweDAwMDQsIDB4NjgxOCwgMHgwZDdlLCAweDIwNjgsCisJMHg2ODZjLCAweDc4MTIsIDB4Njg5MCwgMHgwZjdlLCAweDIwZTEsIDB4OTA0MCwgMHgyMDc5LCAweDAyMDAsCisJMHg3ODFhLCAweDIwNzksIDB4MDEwMCwgMHg4MDA0LCAweDc4ZDYsIDB4MGY3ZiwgMHgwZDdmLCAweDJiNjgsCisJMHg2ODI0LCAweDIwNTAsIDB4NjgxOCwgMHgyMDYwLCAweDY4MzAsIDB4MjA0MCwgMHg2MDM0LCAweGEwY2MsCisJMHgwMDBmLCAweDY5MDgsIDB4MjAwMSwgMHgwNGZkLCAweDIwMDQsIDB4YTA4NiwgMHgwMDA3LCAweDAwNDAsCisJMHgxZGIyLCAweGExODQsIDB4MDAwNywgMHgwMDQwLCAweDFkYjIsIDB4MDE3ZSwgMHgyMDA5LCAweDAwMDgsCisJMHhhMTAyLCAweDAxN2YsIDB4YTEwOCwgMHg3OTFhLCAweDcxMTYsIDB4NzAxZSwgMHg2ODBjLCAweGEwODEsCisJMHgwMDAwLCAweDc4MWUsIDB4NzAxYSwgMHhhMDA2LCAweDcwMGUsIDB4NzAxMiwgMHg3MDA0LCAweDY5MmMsCisJMHg2ODE0LCAweGExMDYsIDB4MDBjMCwgMHgxZGM5LCAweDY5MjgsIDB4NjgxMCwgMHhhMTA2LCAweDAwNDAsCisJMHgxZGQ2LCAweDAzN2UsIDB4MDQ3ZSwgMHg2YjE0LCAweDZjMTAsIDB4MTA3OCwgMHgyMDhhLCAweDA0N2YsCisJMHgwMzdmLCAweDAwNDAsIDB4MWRkNiwgMHgwYzdmLCAweDAwNzgsIDB4MWRmMCwgMHg4YWZmLCAweDAwYzAsCisJMHgxZGRlLCAweDBjN2YsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsIDB4MWRmMCwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDIwNzksIDB4MDAyMCwgMHgyMDA5LCAweDAwMDEsIDB4MTA3OCwgMHgxZGY0LCAweDAwNDAsCisJMHgxZGVkLCAweDIwMDksIDB4MDAwMSwgMHgxMDc4LCAweDFkZjQsIDB4MTI3ZiwgMHgwYzdmLCAweGEwMDYsCisJMHgwZDdmLCAweDBlN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDA3N2UsIDB4MDY3ZSwgMHgwNTdlLCAweDA0N2UsCisJMHgwMzdlLCAweDAyN2UsIDB4OGFmZiwgMHgwMDQwLCAweDFlNzIsIDB4NzAwYywgMHg3MjE0LCAweGEyM2EsCisJMHg3MDEwLCAweDcyMTgsIDB4YTIwMywgMHgwMDQ4LCAweDFlNzEsIDB4YTcwNSwgMHgwMDQwLCAweDFlNzEsCisJMHhhMDNlLCAweDI3MzAsIDB4Njg1MCwgMHhkMGZjLCAweDAwYzAsIDB4MWUyNCwgMHgwZDdlLCAweDI4MDQsCisJMHhhYzY4LCAweDI5MDAsIDB4MDA3OSwgMHgxZTE0LCAweDFlNTMsIDB4MWUzNCwgMHgxZTM0LCAweDFlNTMsCisJMHgxZTUzLCAweDFlNGIsIDB4MWU1MywgMHgxZTM0LCAweDFlNTMsIDB4MWUzYSwgMHgxZTNhLCAweDFlNTMsCisJMHgxZTUzLCAweDFlNTMsIDB4MWU0MiwgMHgxZTNhLCAweGMwZmMsIDB4Njg1MiwgMHg2YjZjLCAweDZhNzAsCisJMHg2ZDFjLCAweDZjMjAsIDB4ZDk5YywgMHgwMDQwLCAweDFlNTcsIDB4MGQ3ZSwgMHgyODA0LCAweGFjNjgsCisJMHg2ZjA4LCAweDZlMGMsIDB4MDA3OCwgMHgxZTU2LCAweDZiMDgsIDB4NmEwYywgMHg2ZDAwLCAweDZjMDQsCisJMHgwMDc4LCAweDFlNTYsIDB4NmIxMCwgMHg2YTE0LCAweDZkMDAsIDB4NmMwNCwgMHg2ZjA4LCAweDZlMGMsCisJMHgwMDc4LCAweDFlNTYsIDB4MGQ3ZiwgMHgwZDdlLCAweDY4MzQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsCisJMHgwMDFlLCAweDAwYzAsIDB4MWU1MywgMHgwZDdmLCAweDEwNzgsIDB4MjAyNiwgMHgwMGMwLCAweDFkZmEsCisJMHhhMDBlLCAweDAwNzgsIDB4MWU3MiwgMHgwZDdmLCAweDEwNzgsIDB4MTMzMiwgMHgwZDdmLCAweDdiMjIsCisJMHg3YTI2LCAweDdkMzIsIDB4N2MzNiwgMHg3ZjNhLCAweDdlM2UsIDB4NzkwMiwgMHg3MDAwLCAweDgwMDAsCisJMHg3MDAyLCAweDY4MjgsIDB4YTMwMCwgMHg2ODJhLCAweDY4MmMsIDB4YTIwMSwgMHg2ODJlLCAweDcwMGMsCisJMHhhMzAwLCAweDcwMGUsIDB4NzAxMCwgMHhhMjAxLCAweDcwMTIsIDB4MTA3OCwgMHgyMDI2LCAweDAwNzgsCisJMHgxZTcyLCAweGEwMDYsIDB4MDI3ZiwgMHgwMzdmLCAweDA0N2YsIDB4MDU3ZiwgMHgwNjdmLCAweDA3N2YsCisJMHgwMDdjLCAweDEwNzgsIDB4MTMzMiwgMHgwMjdlLCAweDIwMDEsIDB4MDEwNSwgMHgyMDAzLCAweDAwMTAsCisJMHgyMGUxLCAweDkwNDAsIDB4NzgwMywgMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwgMHg3MDA0LCAweDIwNjAsCisJMHgwZDdlLCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LCAweDhkMDYsIDB4MDA0MCwgMHgxZTkyLCAweDY4NTAsCisJMHhjMGJkLCAweDY4NTIsIDB4MGQ3ZiwgMHgwYzdlLCAweDEwNzgsIDB4OGEwMSwgMHgwYzdmLCAweDIwMDEsCisJMHhhOGMwLCAweDIwMDQsIDB4YWMwNiwgMHgwMGMwLCAweDFlYTcsIDB4MjBlMSwgMHg5MDQwLCAweDEwNzgsCisJMHg3MzhhLCAweDIwMTEsIDB4MDAwMCwgMHgxMDc4LCAweDcwZWEsIDB4MTA3OCwgMHg2MzliLCAweDAyN2YsCisJMHgwMDc4LCAweDFmNzYsIDB4MTI3ZSwgMHgyMDkxLCAweDIyMDAsIDB4MDA3ZSwgMHgwMTdlLCAweDBmN2UsCisJMHgwZTdlLCAweDBkN2UsIDB4MGM3ZSwgMHgyMDc5LCAweDAwMjAsIDB4MjA3MSwgMHhhOTA4LCAweDJiNjgsCisJMHg2ODE4LCAweDIwNjAsIDB4NzkwNCwgMHg3ODAzLCAweDAwMDIsIDB4YTE4NCwgMHgwNzAwLCAweDAwYzAsCisJMHgxZTdiLCAweDcwMDAsIDB4MDA3OSwgMHgxZWM0LCAweDFmNzYsIDB4MWVjOCwgMHgxZjQzLCAweDFmNzQsCisJMHg4MDAxLCAweDcwMDIsIDB4ZDE5YywgMHgwMGMwLCAweDFlZGMsIDB4OGFmZiwgMHgwMDQwLCAweDFlZmIsCisJMHgyMDA5LCAweDAwMDEsIDB4MTA3OCwgMHgxZGY0LCAweDAwNDAsIDB4MWY3NiwgMHgyMDA5LCAweDAwMDEsCisJMHgxMDc4LCAweDFkZjQsIDB4MDA3OCwgMHgxZjc2LCAweDc4MDMsIDB4MDAwNCwgMHhkMTk0LCAweDAwNDAsCisJMHgxZWVjLCAweDY4NTAsIDB4YzBmYywgMHg2ODUyLCAweDhhZmYsIDB4MDBjMCwgMHgxZWYxLCAweDY4NGMsCisJMHhjMGY1LCAweDY4NGUsIDB4MDA3OCwgMHgxZWYxLCAweDEwNzgsIDB4MjAzZiwgMHg2ODUwLCAweGMwZmQsCisJMHg2ODUyLCAweDJhMDAsIDB4NjgyNiwgMHgyYzAwLCAweDY4MWEsIDB4MjgwMCwgMHg2ODMyLCAweDcwMDMsCisJMHgwMDAwLCAweDAwNzgsIDB4MWY3NiwgMHg3MTFjLCAweDgxZmYsIDB4MDA0MCwgMHgxZjExLCAweDc5MTgsCisJMHg3OTIyLCAweDc4MjcsIDB4MDAwMCwgMHg3ODAzLCAweDAwMDEsIDB4NzAwMCwgMHg4MDAwLCAweDcwMDIsCisJMHg3MDBjLCAweGExMDAsIDB4NzAwZSwgMHg3MDEwLCAweGEwODEsIDB4MDAwMCwgMHg3MDEyLCAweDAwNzgsCisJMHgxZjc2LCAweDBmN2UsIDB4MDI3ZSwgMHg3ODFjLCAweDAwN2UsIDB4NzgxOCwgMHgwMDdlLCAweDIwNzksCisJMHgwMTAwLCAweDdhMTQsIDB4YTI4NCwgMHgwMDA0LCAweGEwODUsIDB4MDAxMiwgMHg3ODE2LCAweDAzN2UsCisJMHgyMDE5LCAweDEwMDAsIDB4ODMxOSwgMHgxMDQwLCAweDEzMzIsIDB4NzgyMCwgMHhkMGJjLCAweDAwYzAsCisJMHgxZjIyLCAweDAzN2YsIDB4NzljOCwgMHgwMDdmLCAweGExMDIsIDB4MDE3ZiwgMHgwMDdlLCAweDAxN2UsCisJMHg3OWM0LCAweDAwN2YsIDB4YTEwMywgMHg3OGM2LCAweDAwN2YsIDB4NzhjYSwgMHhhMjg0LCAweDAwMDQsCisJMHhhMDg1LCAweDAwMTIsIDB4NzgxNiwgMHgwMjdmLCAweDBmN2YsIDB4NzgwMywgMHgwMDA4LCAweDcwMDMsCisJMHgwMDAwLCAweDAwNzgsIDB4MWY3NiwgMHg4MDAxLCAweDcwMDIsIDB4ZDE5NCwgMHgwMDQwLCAweDFmNTgsCisJMHg3ODA0LCAweGQwZmMsIDB4MDBjMCwgMHgxZWJhLCAweGQxOWMsIDB4MDBjMCwgMHgxZjcyLCAweDhhZmYsCisJMHgwMDQwLCAweDFmNzYsIDB4MjAwOSwgMHgwMDAxLCAweDEwNzgsIDB4MWRmNCwgMHgwMDc4LCAweDFmNzYsCisJMHgwMjdlLCAweDAzN2UsIDB4NmIyOCwgMHg2YTJjLCAweDEwNzgsIDB4MjAzZiwgMHgwZDdlLCAweDI4MDQsCisJMHhhYzY4LCAweDYwMzQsIDB4ZDA5YywgMHgwMGMwLCAweDFmNmIsIDB4NjgwOCwgMHhhMzFhLCAweDY4MGMsCisJMHhhMjEzLCAweDAwNzgsIDB4MWY2ZiwgMHg2ODEwLCAweGEzMWEsIDB4NjgxNCwgMHhhMjEzLCAweDBkN2YsCisJMHgwMDc4LCAweDFlZWMsIDB4MDA3OCwgMHgxZWVjLCAweDEwNzgsIDB4MTMzMiwgMHgwYzdmLCAweDBkN2YsCisJMHgwZTdmLCAweDBmN2YsIDB4MDE3ZiwgMHgwMDdmLCAweDEyN2YsIDB4MDA3YywgMHgwZjdlLCAweDBlN2UsCisJMHgyMDcxLCAweGE5MDgsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwgMHgxZmM3LCAweDIwNzksCisJMHgwMDIwLCAweDAxN2UsIDB4MjAwOSwgMHgwMjA3LCAweDIxMGMsIDB4ZDE5NCwgMHgwMDQwLCAweDFmYTQsCisJMHgyMDA5LCAweDAyMGMsIDB4MjEwYywgMHhhMTg0LCAweDAwMDMsIDB4MDA0MCwgMHgxZmE0LCAweDEwNzgsCisJMHhhNWQyLCAweDIwMDEsIDB4MDEzMywgMHgyMDA0LCAweGEwMDUsIDB4MTA0MCwgMHgxMzMyLCAweDIwZTEsCisJMHg5MDQwLCAweDIwMDEsIDB4MDIwYywgMHgyMTAyLCAweDIwMDksIDB4MDIwNiwgMHgyMTA0LCAweDIwMDksCisJMHgwMjAzLCAweDIxMGMsIDB4YTEwNiwgMHgwMGMwLCAweDFmYWYsIDB4MjBlMSwgMHg5MDQwLCAweDc4MDQsCisJMHhkMGZjLCAweDAwNDAsIDB4MWY4YSwgMHgxMDc4LCAweDFlYWEsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDAsCisJMHgwMGMwLCAweDFmOGEsIDB4MDE3ZiwgMHg3ODAzLCAweDAwMDQsIDB4NzgwNCwgMHhkMGFjLCAweDAwYzAsCisJMHgxZmJkLCAweDIwZTEsIDB4OTA0MCwgMHg3ODAzLCAweDAwMDIsIDB4NzAwMywgMHgwMDAwLCAweDBlN2YsCisJMHgwZjdmLCAweDAwN2MsIDB4MDI3ZSwgMHgwYzdlLCAweDBkN2UsIDB4MGU3ZSwgMHgwZjdlLCAweDIwNzEsCisJMHhhOTA4LCAweDIwNzksIDB4MDAyMCwgMHg3MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwMDQwLCAweDIwMDMsCisJMHg3MDA0LCAweDIwNjAsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDFmZWQsCisJMHg2ODUwLCAweGMwYjUsIDB4Njg1MiwgMHg2ODBjLCAweDdhMWMsIDB4YTIwNiwgMHgwMGMwLCAweDFmZWQsCisJMHg2ODA4LCAweDdhMTgsIDB4YTIwNiwgMHgwMDQwLCAweDIwMDksIDB4MjAwMSwgMHgwMTA1LCAweDIwMDMsCisJMHgwMDEwLCAweDIwZTEsIDB4OTA0MCwgMHg3ODAzLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLCAweDcwMDQsCisJMHgyMDYwLCAweDEwNzgsIDB4OGEwMSwgMHgyMGUxLCAweDkwNDAsIDB4MTA3OCwgMHg3MzhhLCAweDIwMTEsCisJMHgwMDAwLCAweDEwNzgsIDB4NzBlYSwgMHgwZjdmLCAweDBlN2YsIDB4MGQ3ZiwgMHgwYzdmLCAweDAyN2YsCisJMHgwMDdjLCAweDY4MTAsIDB4NmExNCwgMHhhMjA1LCAweDAwYzAsIDB4MWZlZCwgMHg2ODRjLCAweGMwZGMsCisJMHg2ODRlLCAweDJjMTAsIDB4MTA3OCwgMHgxY2YwLCAweDIwMDEsIDB4MDEwNSwgMHgyMDAzLCAweDAwMTAsCisJMHgyMGUxLCAweDkwNDAsIDB4NzgwMywgMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwgMHgyMDY5LCAweGE4YjEsCisJMHg2ODMzLCAweDAwMDAsIDB4NjgzZiwgMHgwMDAwLCAweDAwNzgsIDB4MjAwMywgMHg4ODQwLCAweDI4MDQsCisJMHhhMDA1LCAweDAwYzAsIDB4MjAzYSwgMHg2MDA0LCAweGEwMDUsIDB4MDA0MCwgMHgyMDNjLCAweDY4MWEsCisJMHgyMDYwLCAweDYwMzQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODAsIDB4MjA2YSwgMHgyMDQ0LCAweDg4ZmYsCisJMHgxMDQwLCAweDEzMzIsIDB4OGE1MSwgMHgwMDdjLCAweDIwNTEsIDB4MDAwMCwgMHgwMDdjLCAweDhhNTAsCisJMHg4ODQxLCAweDI4MDQsIDB4YTAwNSwgMHgwMGMwLCAweDIwNTksIDB4MmMwMCwgMHhhZDA2LCAweDAwNDAsCisJMHgyMDRlLCAweDYwMDAsIDB4YTAwNSwgMHgwMGMwLCAweDIwNGUsIDB4MmQwMCwgMHgyMDYwLCAweDY4MWEsCisJMHg2MDM0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDIwN2EsIDB4MjA0NCwgMHg4OGZmLCAweDEwNDAsCisJMHgxMzMyLCAweDAwN2MsIDB4MDAwMCwgMHgwMDExLCAweDAwMTUsIDB4MDAxOSwgMHgwMDFkLCAweDAwMjEsCisJMHgwMDI1LCAweDAwMjksIDB4MDAwMCwgMHgwMDBmLCAweDAwMTUsIDB4MDAxYiwgMHgwMDIxLCAweDAwMjcsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDVmLCAweDIwNWIsIDB4MDAwMCwgMHgwMDAwLCAweDIwNjksCisJMHgwMDAwLCAweDIwNWYsIDB4MDAwMCwgMHgyMDY2LCAweDIwNjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgyMDY5LCAweDIwNjYsIDB4MDAwMCwgMHgyMDYxLCAweDIwNjEsIDB4MDAwMCwgMHgwMDAwLCAweDIwNjksCisJMHgwMDAwLCAweDIwNjEsIDB4MDAwMCwgMHgyMDY3LCAweDIwNjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgyMDY5LCAweDIwNjcsIDB4MGE3ZSwgMHgwOTdlLCAweDA4N2UsIDB4NmIyZSwgMHg2YzJhLCAweDY4NTgsCisJMHhhMDU1LCAweDAwNDAsIDB4MjEyZCwgMHgyZDYwLCAweDYwMzQsIDB4YTBjYywgMHgwMDBmLCAweGE5YzAsCisJMHgyMDZhLCAweGE5ODYsIDB4MDAwNywgMHgwMDQwLCAweDIwYTUsIDB4YTk4NiwgMHgwMDBlLCAweDAwNDAsCisJMHgyMGE1LCAweGE5ODYsIDB4MDAwZiwgMHgwMGMwLCAweDIwYTksIDB4NjA1YywgMHhhNDIyLCAweDYwNjAsCisJMHhhMzFhLCAweDI4MDQsIDB4YTA0NSwgMHgwMGMwLCAweDIwYjcsIDB4MDA1MCwgMHgyMGIxLCAweDAwNzgsCisJMHgyMTJkLCAweDYwMDQsIDB4YTA2NSwgMHgwMDQwLCAweDIxMmQsIDB4MDA3OCwgMHgyMDk0LCAweDI4MDQsCisJMHhhMDA1LCAweDAwNDAsIDB4MjBkNSwgMHhhYzY4LCAweGQ5OWMsIDB4MDBjMCwgMHgyMGM1LCAweDY4MDgsCisJMHhhNDIyLCAweDY4MGMsIDB4YTMxYiwgMHgwMDc4LCAweDIwYzksIDB4NjgxMCwgMHhhNDIyLCAweDY4MTQsCisJMHhhMzFiLCAweDAwNDgsIDB4MjBmNCwgMHgyMzAwLCAweGE0MDUsIDB4MDA0MCwgMHgyMGRiLCAweDhhNTEsCisJMHgwMDQwLCAweDIxMmQsIDB4ODg0MCwgMHgwMDc4LCAweDIwYjcsIDB4NjAwNCwgMHhhMDY1LCAweDAwNDAsCisJMHgyMTJkLCAweDAwNzgsIDB4MjA5NCwgMHg4YTUxLCAweDAwNDAsIDB4MjEyZCwgMHg4ODQwLCAweDI4MDQsCisJMHhhMDA1LCAweDAwYzAsIDB4MjBlZSwgMHg2MDA0LCAweGEwNjUsIDB4MDA0MCwgMHgyMTJkLCAweDYwMzQsCisJMHhhMGNjLCAweDAwMGYsIDB4YTljMCwgMHgyMDZhLCAweDI4MDQsIDB4MjA0MCwgMHgyYjY4LCAweDY4NTAsCisJMHhjMGZjLCAweDY4NTIsIDB4MDA3OCwgMHgyMTIxLCAweDg0MjIsIDB4ODQyMCwgMHg4MzFhLCAweGEzOTksCisJMHgwMDAwLCAweDBkN2UsIDB4MmI2OCwgMHg2YzZlLCAweDZiNzIsIDB4MGQ3ZiwgMHhkOTljLCAweDAwYzAsCisJMHgyMTBmLCAweDY5MDgsIDB4MjQwMCwgMHhhMTIyLCAweDY5MGMsIDB4MjMwMCwgMHhhMTFiLCAweDEwNDgsCisJMHgxMzMyLCAweDY4MDAsIDB4YTQyMCwgMHg2ODA0LCAweGEzMTksIDB4MDA3OCwgMHgyMTFiLCAweDY5MTAsCisJMHgyNDAwLCAweGExMjIsIDB4NjkxNCwgMHgyMzAwLCAweGExMWIsIDB4MTA0OCwgMHgxMzMyLCAweDY4MDAsCisJMHhhNDIwLCAweDY4MDQsIDB4YTMxOSwgMHgyYjY4LCAweDZjMWUsIDB4NmIyMiwgMHg2ODUwLCAweGMwZmQsCisJMHg2ODUyLCAweDJjMDAsIDB4NjgxYSwgMHgyODAwLCAweDY4MzIsIDB4MmEwMCwgMHg2ODI2LCAweDAwN2YsCisJMHgwMDdmLCAweDAwN2YsIDB4YTAwNiwgMHgwMDc4LCAweDIxMzIsIDB4MDg3ZiwgMHgwOTdmLCAweDBhN2YsCisJMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHgyMDAxLCAweDAwMDUsIDB4MjAwNCwgMHhhMDg0LCAweDAwMDcsCisJMHgwMDc5LCAweDIxM2EsIDB4MjE0MiwgMHgyMTQzLCAweDIxNDYsIDB4MjE0OSwgMHgyMTRlLCAweDIxNTEsCisJMHgyMTU2LCAweDIxNWIsIDB4MDA3YywgMHgxMDc4LCAweDFlYWEsIDB4MDA3YywgMHgxMDc4LCAweDE5MTMsCisJMHgwMDdjLCAweDEwNzgsIDB4MTkxMywgMHgxMDc4LCAweDFlYWEsIDB4MDA3YywgMHgxMDc4LCAweDE0YmUsCisJMHgwMDdjLCAweDEwNzgsIDB4MWVhYSwgMHgxMDc4LCAweDE0YmUsIDB4MDA3YywgMHgxMDc4LCAweDE5MTMsCisJMHgxMDc4LCAweDE0YmUsIDB4MDA3YywgMHgxMDc4LCAweDE5MTMsIDB4MTA3OCwgMHgxZWFhLCAweDEwNzgsCisJMHgxNGJlLCAweDAwN2MsIDB4MTI3ZSwgMHgyMDkxLCAweDIzMDAsIDB4MjA3OSwgMHgwMjAwLCAweDIwNzEsCisJMHhhYjgwLCAweDIwNjksIDB4YTYwMCwgMHgyMDA5LCAweDAwMDQsIDB4NzkxMiwgMHg3ODE3LCAweDAwMDQsCisJMHgxMDc4LCAweDI1MWYsIDB4NzgxYiwgMHgwMDAyLCAweDIwZTEsIDB4ODcwMCwgMHgxMjdmLCAweDAwN2MsCisJMHgxMjdlLCAweDIwOTEsIDB4MjMwMCwgMHg3ODFjLCAweGEwODQsIDB4MDAwNywgMHgwMDc5LCAweDIxODAsCisJMHgyMWE0LCAweDIxODgsIDB4MjE4YywgMHgyMTkwLCAweDIxOTYsIDB4MjE5YSwgMHgyMTllLCAweDIxYTIsCisJMHgxMDc4LCAweDU0OGUsIDB4MDA3OCwgMHgyMWE0LCAweDEwNzgsIDB4NTRkYSwgMHgwMDc4LCAweDIxYTQsCisJMHgxMDc4LCAweDU0OGUsIDB4MTA3OCwgMHg1NGRhLCAweDAwNzgsIDB4MjFhNCwgMHgxMDc4LCAweDIxYTYsCisJMHgwMDc4LCAweDIxYTQsIDB4MTA3OCwgMHgyMWE2LCAweDAwNzgsIDB4MjFhNCwgMHgxMDc4LCAweDIxYTYsCisJMHgwMDc4LCAweDIxYTQsIDB4MTA3OCwgMHgyMWE2LCAweDEyN2YsIDB4MDA3YywgMHgwMDdlLCAweDAxN2UsCisJMHgwMjdlLCAweDEwNzgsIDB4YTVkMiwgMHg3OTMwLCAweGExODQsIDB4MDAwMywgMHgwMDQwLCAweDIxYzksCisJMHgyMDAxLCAweGE4YzAsIDB4MjAwNCwgMHhhMDA1LCAweDAwNDAsIDB4MjFjNSwgMHgyMDAxLCAweDAxMzMsCisJMHgyMDA0LCAweGEwMDUsIDB4MTA0MCwgMHgxMzMyLCAweDBjN2UsIDB4MjAwMSwgMHhhOGMwLCAweDIwNjQsCisJMHgxMDc4LCAweDhhMDEsIDB4MGM3ZiwgMHgwMDc4LCAweDIxZjIsIDB4MjBlMSwgMHg5MDQwLCAweDAwNzgsCisJMHgyMWYyLCAweGExODQsIDB4MDAzMCwgMHgwMDQwLCAweDIxZGEsIDB4NmEwMCwgMHhhMjg2LCAweDAwMDMsCisJMHgwMGMwLCAweDIxZDQsIDB4MDA3OCwgMHgyMWQ2LCAweDEwNzgsIDB4NDIyNCwgMHgyMGUxLCAweDkwMTAsCisJMHgwMDc4LCAweDIxZjIsIDB4YTE4NCwgMHgwMGMwLCAweDAwNDAsIDB4MjFlYywgMHgwZTdlLCAweDAzN2UsCisJMHgwNDdlLCAweDA1N2UsIDB4MjA3MSwgMHhhOGU3LCAweDEwNzgsIDB4MWFmNCwgMHgwNTdmLCAweDA0N2YsCisJMHgwMzdmLCAweDBlN2YsIDB4MDA3OCwgMHgyMWYyLCAweGExODQsIDB4MDMwMCwgMHgwMDQwLCAweDIxZjIsCisJMHgyMGUxLCAweDkwMjAsIDB4NzkzMiwgMHgwMjdmLCAweDAxN2YsIDB4MDA3ZiwgMHgwMDdjLCAweDAxN2UsCisJMHgwZTdlLCAweDBmN2UsIDB4MjA3MSwgMHhhNjAwLCAweDcxMjgsIDB4MjAwMSwgMHhhODkwLCAweDIxMDIsCisJMHgyMDAxLCAweGE4OTgsIDB4MjEwMiwgMHhhMTgyLCAweDAyMTEsIDB4MDBjOCwgMHgyMjBiLCAweDIwMDksCisJMHgwMDA4LCAweDAwNzgsIDB4MjIzNSwgMHhhMTgyLCAweDAyNTksIDB4MDBjOCwgMHgyMjEzLCAweDIwMDksCisJMHgwMDA3LCAweDAwNzgsIDB4MjIzNSwgMHhhMTgyLCAweDAyYzEsIDB4MDBjOCwgMHgyMjFiLCAweDIwMDksCisJMHgwMDA2LCAweDAwNzgsIDB4MjIzNSwgMHhhMTgyLCAweDAzNDksIDB4MDBjOCwgMHgyMjIzLCAweDIwMDksCisJMHgwMDA1LCAweDAwNzgsIDB4MjIzNSwgMHhhMTgyLCAweDA0MjEsIDB4MDBjOCwgMHgyMjJiLCAweDIwMDksCisJMHgwMDA0LCAweDAwNzgsIDB4MjIzNSwgMHhhMTgyLCAweDA1ODEsIDB4MDBjOCwgMHgyMjMzLCAweDIwMDksCisJMHgwMDAzLCAweDAwNzgsIDB4MjIzNSwgMHgyMDA5LCAweDAwMDIsIDB4MjA3OSwgMHgwMjAwLCAweDc5MTIsCisJMHg3ODE3LCAweDAwMDQsIDB4MTA3OCwgMHgyNTFmLCAweDBmN2YsIDB4MGU3ZiwgMHgwMTdmLCAweDAwN2MsCisJMHgxMjdlLCAweDIwOTEsIDB4MjIwMCwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHhhNjAwLCAweDYwMjQsCisJMHg2MDI2LCAweDYwNTMsIDB4MDAzMCwgMHg2MDMzLCAweDAwZWYsIDB4NjBlNywgMHgwMDAwLCAweDYwZWIsCisJMHgwMGVmLCAweDYwZTMsIDB4MDAwOCwgMHg2MDRiLCAweGY3ZjcsIDB4NjA0MywgMHgwMDAwLCAweDYwMmYsCisJMHgwMDgwLCAweDYwMmYsIDB4MDAwMCwgMHg2MDA3LCAweDBlYWYsIDB4NjAwZiwgMHgwMGZmLCAweDYwMmIsCisJMHgwMDJmLCAweDEyN2YsIDB4MDA3YywgMHgyMDAxLCAweGE2MzAsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsCisJMHhhNjJmLCAweDIwMDMsIDB4MDAwMSwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHgyMjAwLCAweDAwN2UsCisJMHgwMTdlLCAweDAyN2UsIDB4NjEyNCwgMHhhMTg0LCAweDAwMmMsIDB4MDBjMCwgMHgyMjdiLCAweGExODQsCisJMHgwMDA3LCAweDAwNzksIDB4MjI4MSwgMHhhMTk1LCAweDAwMDQsIDB4YTI4NCwgMHgwMDA3LCAweDAwNzksCisJMHgyMjgxLCAweDIyYWQsIDB4MjI4OSwgMHgyMjhkLCAweDIyOTEsIDB4MjI5NywgMHgyMjliLCAweDIyYTEsCisJMHgyMmE3LCAweDEwNzgsIDB4NWM1NiwgMHgwMDc4LCAweDIyYWQsIDB4MTA3OCwgMHg1ZDQ1LCAweDAwNzgsCisJMHgyMmFkLCAweDEwNzgsIDB4NWQ0NSwgMHgxMDc4LCAweDVjNTYsIDB4MDA3OCwgMHgyMmFkLCAweDEwNzgsCisJMHgyMmIyLCAweDAwNzgsIDB4MjJhZCwgMHgxMDc4LCAweDVjNTYsIDB4MTA3OCwgMHgyMmIyLCAweDAwNzgsCisJMHgyMmFkLCAweDEwNzgsIDB4NWQ0NSwgMHgxMDc4LCAweDIyYjIsIDB4MDA3OCwgMHgyMmFkLCAweDEwNzgsCisJMHg1ZDQ1LCAweDEwNzgsIDB4NWM1NiwgMHgxMDc4LCAweDIyYjIsIDB4MDI3ZiwgMHgwMTdmLCAweDAwN2YsCisJMHgxMjdmLCAweDAwN2MsIDB4NjEyNCwgMHhkMWFjLCAweDAwNDAsIDB4MjNhYywgMHgwMTdlLCAweDA0N2UsCisJMHgwYzdlLCAweDY0NGMsIDB4YTQ4NiwgMHhmMGYwLCAweDAwYzAsIDB4MjJjNSwgMHgyMDYxLCAweDAxMDAsCisJMHg2NDRhLCAweDYwNDMsIDB4MDA5MCwgMHg2MDQzLCAweDAwMTAsIDB4NzRjNiwgMHhhNDhjLCAweGZmMDAsCisJMHg3MDM0LCAweGQwODQsIDB4MDA0MCwgMHgyMmRkLCAweGExODYsIDB4ZjgwMCwgMHgwMGMwLCAweDIyZGQsCisJMHg3MDNjLCAweGQwODQsIDB4MDBjMCwgMHgyMmRkLCAweGMwODUsIDB4NzAzZSwgMHgwMzdlLCAweDI0MTgsCisJMHgyMDExLCAweDgwMTYsIDB4MTA3OCwgMHgzNjFiLCAweDAzN2YsIDB4YTE5NiwgMHhmZjAwLCAweDAwNDAsCisJMHgyMzFmLCAweDYwMzAsIDB4YTA4NCwgMHgwMGZmLCAweDgxMGYsIDB4YTExNiwgMHgwMDQwLCAweDIzMWYsCisJMHg3MTMwLCAweGQxODQsIDB4MDBjMCwgMHgyMzFmLCAweDIwMTEsIDB4YTY1MywgMHgyMjE0LCAweGQyZWMsCisJMHgwMDQwLCAweDIyZmEsIDB4YzE4ZCwgMHg3MTMyLCAweDIwMTEsIDB4YTY1MywgMHgyMjE0LCAweGQyYWMsCisJMHgwMGMwLCAweDIzMWYsIDB4NjI0MCwgMHhhMjk0LCAweDAwMTAsIDB4MDA0MCwgMHgyMzA2LCAweDYyNDgsCisJMHhhMjk0LCAweGZmMDAsIDB4YTI5NiwgMHhmZjAwLCAweDAwNDAsIDB4MjMxZiwgMHg3MDMwLCAweGQwOGMsCisJMHgwMDQwLCAweDIzNzEsIDB4NzAzNCwgMHhkMDhjLCAweDAwYzAsIDB4MjMxNiwgMHgyMDAxLCAweGE2MGMsCisJMHgyMDBjLCAweGQxYWMsIDB4MDBjMCwgMHgyMzcxLCAweGMxYWQsIDB4MjEwMiwgMHgwMzdlLCAweDczYzQsCisJMHgyMDExLCAweDgwMTMsIDB4MTA3OCwgMHgzNjFiLCAweDAzN2YsIDB4MDA3OCwgMHgyMzcxLCAweDcwMzQsCisJMHhkMDhjLCAweDAwYzAsIDB4MjMyYiwgMHgyMDAxLCAweGE2MGMsIDB4MjAwYywgMHhkMWFjLCAweDAwYzAsCisJMHgyMzcxLCAweGMxYWQsIDB4MjEwMiwgMHgwMzdlLCAweDczYzQsIDB4MjAxMSwgMHg4MDEzLCAweDEwNzgsCisJMHgzNjFiLCAweDAzN2YsIDB4NzEzMCwgMHhjMTg1LCAweDcxMzIsIDB4MjAxMSwgMHhhNjUzLCAweDIyMGMsCisJMHhkMWE0LCAweDAwNDAsIDB4MjM1NSwgMHgwMTdlLCAweDIwMDksIDB4MDAwMSwgMHgyMDExLCAweDAxMDAsCisJMHgxMDc4LCAweDViZjEsIDB4MjAxOSwgMHgwMDBlLCAweDEwNzgsIDB4YTE5NSwgMHhhNDg0LCAweDAwZmYsCisJMHhhMDgwLCAweDI5YzAsIDB4MjAwYywgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHg4MTI3LCAweGEwMDYsCisJMHgyMDA5LCAweDAwMGUsIDB4MTA3OCwgMHhhMjFkLCAweDAxN2YsIDB4ZDFhYywgMHgwMGMwLCAweDIzNjIsCisJMHgwMTdlLCAweDIwMDksIDB4MDAwMCwgMHgyMDE5LCAweDAwMDQsIDB4MTA3OCwgMHgyODRmLCAweDAxN2YsCisJMHgwMDc4LCAweDIzNzEsIDB4MTU3ZSwgMHgyMGE5LCAweDAwN2YsIDB4MjAwOSwgMHgwMDAwLCAweDEwNzgsCisJMHg0NWM0LCAweDAwYzAsIDB4MjM2ZCwgMHgxMDc4LCAweDQyZjgsIDB4ODEwOCwgMHgwMGYwLCAweDIzNjcsCisJMHgxNTdmLCAweDBjN2YsIDB4MDQ3ZiwgMHgwZjdlLCAweDIwNzksIDB4YThjNCwgMHg3ODNjLCAweGEwODYsCisJMHgwMDAwLCAweDAwNDAsIDB4MjM4MywgMHg2MDI3LCAweDAwMDQsIDB4NzgzZiwgMHgwMDAwLCAweDIwNzksCisJMHgwMTQwLCAweDc4MDMsIDB4MDAwMCwgMHgwZjdmLCAweDIwMTEsIDB4MDAwMywgMHgxMDc4LCAweDcwZTAsCisJMHgyMDExLCAweDAwMDIsIDB4MTA3OCwgMHg3MGVhLCAweDEwNzgsIDB4NmZjNCwgMHgwMzdlLCAweDIwMTksCisJMHgwMDAwLCAweDEwNzgsIDB4NzA1OCwgMHgwMzdmLCAweDYwZTMsIDB4MDAwMCwgMHgwMTdmLCAweDIwMDEsCisJMHhhNjAwLCAweDIwMTQsIDB4YTI5NiwgMHgwMDA0LCAweDAwYzAsIDB4MjNhNCwgMHhkMTljLCAweDAwYzAsCisJMHgyM2FjLCAweDYyMjgsIDB4YzI5ZCwgMHg2MjJhLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLCAweGE2MjIsCisJMHgyMDAzLCAweDAwMDAsIDB4NjAyNywgMHgwMDIwLCAweGQxOTQsIDB4MDA0MCwgMHgyNDkwLCAweDBmN2UsCisJMHgyMDc5LCAweGE4YzQsIDB4NzgzYywgMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHgyM2QwLCAweDAxN2UsCisJMHg2MDI3LCAweDAwMDQsIDB4NzgzZiwgMHgwMDAwLCAweDIwNzksIDB4MDE0MCwgMHg3ODAzLCAweDEwMDAsCisJMHg3ODAzLCAweDAwMDAsIDB4MjA3OSwgMHhhOGIxLCAweDc4MDcsIDB4MDAwMCwgMHg3ODMzLCAweDAwMDAsCisJMHgxMDc4LCAweDYyZDEsIDB4MTA3OCwgMHg2MzliLCAweDAxN2YsIDB4MGY3ZiwgMHgwMDc4LCAweDI0OTAsCisJMHgwZjdmLCAweDAxN2UsIDB4MzkwMCwgMHhhMDgyLCAweGE5ZTMsIDB4MDBjOCwgMHgyM2RiLCAweDAxN2UsCisJMHgxMDc4LCAweDc0N2EsIDB4MDE3ZiwgMHg2MjIwLCAweGQyYjQsIDB4MDA0MCwgMHgyNDQ2LCAweDEwNzgsCisJMHg1YWNiLCAweDEwNzgsIDB4NmUwZiwgMHg2MDI3LCAweDAwMDQsIDB4MGY3ZSwgMHgyMDE5LCAweGE4YmEsCisJMHgyMzA0LCAweGEwN2QsIDB4MDA0MCwgMHgyNDFjLCAweDc4MDQsIDB4YTA4NiwgMHgwMDMyLCAweDAwYzAsCisJMHgyNDFjLCAweDBkN2UsIDB4MGM3ZSwgMHgwZTdlLCAweDIwNjksIDB4MDE0MCwgMHg2MThjLCAweDYyODgsCisJMHg3ODE4LCAweDYwOGUsIDB4NzgwOCwgMHg2MDhhLCAweDYwNDMsIDB4MDAwMiwgMHgyMDAxLCAweDAwMDMsCisJMHg4MDAxLCAweDAwYzAsIDB4MjQwMCwgMHg2MDQzLCAweDAwMDAsIDB4NjgwMywgMHgxMDAwLCAweDY4MDMsCisJMHgwMDAwLCAweDYxOGUsIDB4NjI4YSwgMHgxMDc4LCAweDYxY2QsIDB4MTA3OCwgMHg2MmQxLCAweDc4MTAsCisJMHgyMDcwLCAweDcwMzcsIDB4MDEwMywgMHgyZjYwLCAweDEwNzgsIDB4NzcyZCwgMHgwZTdmLCAweDBjN2YsCisJMHgwZDdmLCAweDBmN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDBmN2YsIDB4MGQ3ZSwgMHgyMDY5LCAweDAxNDAsCisJMHg2ODA0LCAweGEwODQsIDB4NDAwMCwgMHgwMDQwLCAweDI0MjksIDB4NjgwMywgMHgxMDAwLCAweDY4MDMsCisJMHgwMDAwLCAweDBkN2YsIDB4MGM3ZSwgMHgyMDYxLCAweGE4YjEsIDB4NjAyOCwgMHhhMDlhLCAweDAwYzgsCisJMHgwMGM4LCAweDI0MzksIDB4ODAwMCwgMHg2MDJhLCAweDBjN2YsIDB4MTA3OCwgMHg2ZTAxLCAweDAwNzgsCisJMHgyNDhmLCAweDIwMTksIDB4YThiYSwgMHgyMzA0LCAweGEwNjUsIDB4MDA0MCwgMHgyNDQzLCAweDIwMDksCisJMHgwMDI3LCAweDEwNzgsIDB4Nzc1YywgMHgwYzdmLCAweDAwNzgsIDB4MjQ4ZiwgMHhkMmJjLCAweDAwNDAsCisJMHgyNDhmLCAweDEwNzgsIDB4NWFkOCwgMHg2MDE3LCAweDAwMTAsIDB4NjAyNywgMHgwMDA0LCAweDBkN2UsCisJMHgyMDY5LCAweDAxNDAsIDB4NjgwNCwgMHhhMDg0LCAweDQwMDAsIDB4MDA0MCwgMHgyNDViLCAweDY4MDMsCisJMHgxMDAwLCAweDY4MDMsIDB4MDAwMCwgMHgwZDdmLCAweDBjN2UsIDB4MjA2MSwgMHhhOGIxLCAweDYwNDQsCisJMHhhMDlhLCAweDAwYzgsIDB4MDBjOCwgMHgyNDdlLCAweDgwMDAsIDB4NjA0NiwgMHg2MDNjLCAweDBjN2YsCisJMHhhMDA1LCAweDAwNDAsIDB4MjQ4ZiwgMHgyMDA5LCAweDA3ZDAsIDB4MTA3OCwgMHg1YWQwLCAweGEwODAsCisJMHgwMDA3LCAweDIwMDQsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4MjQ3YSwgMHg2MDE3LCAweDAwMTIsCisJMHgwMDc4LCAweDI0OGYsIDB4NjAxNywgMHgwMDE2LCAweDAwNzgsIDB4MjQ4ZiwgMHgwMzdlLCAweDIwMTksCisJMHgwMDAxLCAweDEwNzgsIDB4NzA1OCwgMHgwMzdmLCAweDIwMTksIDB4YThjMCwgMHgyMzA0LCAweGEwNjUsCisJMHgwMDQwLCAweDI0OGUsIDB4MjAwOSwgMHgwMDRmLCAweDEwNzgsIDB4Nzc1YywgMHgwYzdmLCAweDAxN2YsCisJMHhkMTljLCAweDAwNDAsIDB4MjRlNCwgMHg3MDM0LCAweGQwYWMsIDB4MDBjMCwgMHgyNGMxLCAweDAxN2UsCisJMHgxNTdlLCAweDYwMjcsIDB4MDAwOCwgMHg2MDJmLCAweDAwMjAsIDB4MjBhOSwgMHgwMDBhLCAweDAwZjAsCisJMHgyNDlmLCAweDYwMmYsIDB4MDAwMCwgMHg2MTUwLCAweGExODUsIDB4MTQwMCwgMHg2MDUyLCAweDIwYTksCisJMHgwMzIwLCAweDAwZTAsIDB4MjRhOSwgMHgyMDkxLCAweDYwMDAsIDB4NjAyMCwgMHhkMDljLCAweDAwYzAsCisJMHgyNGI4LCAweDE1N2YsIDB4NjE1MiwgMHgwMTdmLCAweDYwMjcsIDB4MDAwOCwgMHgwMDc4LCAweDI0ZTQsCisJMHgxMDc4LCAweDI1NzcsIDB4MDBmMCwgMHgyNGE5LCAweDE1N2YsIDB4NjE1MiwgMHgwMTdmLCAweDYwMjcsCisJMHgwMDA4LCAweDAxN2UsIDB4NjAyOCwgMHhjMDljLCAweDYwMmEsIDB4MjAxMSwgMHgwMDAzLCAweDEwNzgsCisJMHg3MGUwLCAweDIwMTEsIDB4MDAwMiwgMHgxMDc4LCAweDcwZWEsIDB4MTA3OCwgMHg2ZmM0LCAweDAzN2UsCisJMHgyMDE5LCAweDAwMDAsIDB4MTA3OCwgMHg3MDU4LCAweDAzN2YsIDB4NjBlMywgMHgwMDAwLCAweDEwNzgsCisJMHhhNWFkLCAweDEwNzgsIDB4YTVjYiwgMHgyMDAxLCAweGE2MDAsIDB4MjAwMywgMHgwMDA0LCAweDYwMjcsCisJMHgwMDA4LCAweDEwNzgsIDB4MTI0NiwgMHgwMTdmLCAweGExOGMsIDB4ZmZkMCwgMHg2MTI2LCAweDAwN2MsCisJMHgwMDdlLCAweDAxN2UsIDB4MDI3ZSwgMHgwZTdlLCAweDBmN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDcxLCAweGE2MDAsIDB4NzFiYywgMHg3MGJlLCAweGExMTYsIDB4MDA0MCwgMHgyNTE4LCAweDgxZmYsCisJMHgwMDQwLCAweDI1MDAsIDB4MjAxMSwgMHg4MDExLCAweDEwNzgsIDB4MzYxYiwgMHgwMDc4LCAweDI1MTgsCisJMHgyMDExLCAweDgwMTIsIDB4MTA3OCwgMHgzNjFiLCAweDIwMDEsIDB4YTY3MiwgMHgyMDA0LCAweGQwZmMsCisJMHgwMGMwLCAweDI1MTgsIDB4MDM3ZSwgMHgwYzdlLCAweDEwNzgsIDB4NmY5ZiwgMHgyMDYxLCAweDAxMDAsCisJMHgyMDE5LCAweDAwMjgsIDB4MjAwOSwgMHgwMDAwLCAweDEwNzgsIDB4Mjg0ZiwgMHgwYzdmLCAweDAzN2YsCisJMHgxMjdmLCAweDBmN2YsIDB4MGU3ZiwgMHgwMjdmLCAweDAxN2YsIDB4MDA3ZiwgMHgwMDdjLCAweDBjN2UsCisJMHgwZjdlLCAweDAwN2UsIDB4MDI3ZSwgMHgyMDYxLCAweDAxMDAsIDB4YTE5MCwgMHgyNTNiLCAweDIyMDQsCisJMHg2MGYyLCAweDIwMTEsIDB4MjU0OCwgMHg2MDAwLCAweGEwODIsIDB4MDAwMywgMHgwMGM4LCAweDI1MzQsCisJMHgyMDAxLCAweDAwZmYsIDB4MDA3OCwgMHgyNTM1LCAweDIyMDQsIDB4NjBlZSwgMHgwMjdmLCAweDAwN2YsCisJMHgwZjdmLCAweDBjN2YsIDB4MDA3YywgMHgwODQwLCAweDA4NDAsIDB4MDg0MCwgMHgwNTgwLCAweDA0MjAsCisJMHgwMzQ4LCAweDAyYzAsIDB4MDI1OCwgMHgwMjEwLCAweDAxYTgsIDB4MDFhOCwgMHgwMWE4LCAweDAxYTgsCisJMHgwMTQwLCAweDAwZjgsIDB4MDBkMCwgMHgwMGIwLCAweDAwYTAsIDB4MjAyOCwgMHhhMThjLCAweDAwZmYsCisJMHgyMTMwLCAweGEwOTQsIDB4ZmYwMCwgMHgwMGMwLCAweDI1NTgsIDB4ODFmZiwgMHgwMDQwLCAweDI1NWMsCisJMHgxMDc4LCAweDU3NjEsIDB4MDA3OCwgMHgyNTYzLCAweGEwODAsIDB4MjljMCwgMHgyMDBjLCAweGExOGMsCisJMHhmZjAwLCAweDgxMGYsIDB4YTAwNiwgMHgwMDdjLCAweGEwODAsIDB4MjljMCwgMHgyMDBjLCAweGExOGMsCisJMHgwMGZmLCAweDAwN2MsIDB4MGM3ZSwgMHgyMDYxLCAweGE2MDAsIDB4NjAzMCwgMHgwMDQwLCAweDI1NzMsCisJMHhjMDlkLCAweDAwNzgsIDB4MjU3NCwgMHhjMDljLCAweDYwMzIsIDB4MGM3ZiwgMHgwMDdjLCAweDAwN2UsCisJMHgxNTdlLCAweDBmN2UsIDB4MjA3OSwgMHgwMTAwLCAweDIwYTksIDB4MDAwYSwgMHg3ODU0LCAweGQwOGMsCisJMHgwMGMwLCAweDI1ODQsIDB4MDBmMCwgMHgyNTdlLCAweDBmN2YsIDB4MTU3ZiwgMHgwMDdmLCAweDAwN2MsCisJMHgwYzdlLCAweDAwN2UsIDB4MjA2MSwgMHgwMTAwLCAweDYwMzAsIDB4MDA3ZSwgMHg2MDQ4LCAweDAwN2UsCisJMHg2MGU0LCAweDAwN2UsIDB4NjBlOCwgMHgwMDdlLCAweDYwNTAsIDB4MDA3ZSwgMHg2MGYwLCAweDAwN2UsCisJMHg2MGVjLCAweDAwN2UsIDB4NjAwYywgMHgwMDdlLCAweDYwMDQsIDB4MDA3ZSwgMHg2MDI4LCAweDAwN2UsCisJMHg2MGUwLCAweDAwN2UsIDB4NjAyZiwgMHgwMTAwLCAweDYwMmYsIDB4MDAwMCwgMHgwMDA1LCAweDAwMDUsCisJMHgwMDA1LCAweDAwMDUsIDB4NjAyZiwgMHgwMDQwLCAweDYwMmYsIDB4MDAwMCwgMHgwMDdmLCAweDYwZTIsCisJMHgwMDdmLCAweDYwMmEsIDB4MDA3ZiwgMHg2MDA2LCAweDAwN2YsIDB4NjAwZSwgMHgwMDdmLCAweDYwZWUsCisJMHgwMDdmLCAweDYwZjIsIDB4MDA3ZiwgMHg2MDUyLCAweDAwN2YsIDB4NjBlYSwgMHgwMDdmLCAweDYwZTYsCisJMHgwMDdmLCAweDYwNGEsIDB4MDA3ZiwgMHg2MDMyLCAweDAwN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDI1ZTcsCisJMHgyNWViLCAweDI1ZWYsIDB4MjVmNSwgMHgyNWZiLCAweDI2MDEsIDB4MjYwNywgMHgyNjBmLCAweDI2MTcsCisJMHgyNjFkLCAweDI2MjMsIDB4MjYyYiwgMHgyNjMzLCAweDI2M2IsIDB4MjY0MywgMHgyNjRkLCAweDI2NTcsCisJMHgyNjU3LCAweDI2NTcsIDB4MjY1NywgMHgyNjU3LCAweDI2NTcsIDB4MjY1NywgMHgyNjU3LCAweDI2NTcsCisJMHgyNjU3LCAweDI2NTcsIDB4MjY1NywgMHgyNjU3LCAweDI2NTcsIDB4MjY1NywgMHgyNjU3LCAweDEwN2UsCisJMHgwMDdlLCAweDAwNzgsIDB4MjY3MCwgMHgxMDdlLCAweDAwN2UsIDB4MDA3OCwgMHgyNjcwLCAweDEwN2UsCisJMHgwMDdlLCAweDEwNzgsIDB4MjI2YywgMHgwMDc4LCAweDI2NzAsIDB4MTA3ZSwgMHgwMDdlLCAweDEwNzgsCisJMHgyMjZjLCAweDAwNzgsIDB4MjY3MCwgMHgxMDdlLCAweDAwN2UsIDB4MTA3OCwgMHgyMTMzLCAweDAwNzgsCisJMHgyNjcwLCAweDEwN2UsIDB4MDA3ZSwgMHgxMDc4LCAweDIxMzMsIDB4MDA3OCwgMHgyNjcwLCAweDEwN2UsCisJMHgwMDdlLCAweDEwNzgsIDB4MjI2YywgMHgxMDc4LCAweDIxMzMsIDB4MDA3OCwgMHgyNjcwLCAweDEwN2UsCisJMHgwMDdlLCAweDEwNzgsIDB4MjI2YywgMHgxMDc4LCAweDIxMzMsIDB4MDA3OCwgMHgyNjcwLCAweDEwN2UsCisJMHgwMDdlLCAweDEwNzgsIDB4MjE3OCwgMHgwMDc4LCAweDI2NzAsIDB4MTA3ZSwgMHgwMDdlLCAweDEwNzgsCisJMHgyMTc4LCAweDAwNzgsIDB4MjY3MCwgMHgxMDdlLCAweDAwN2UsIDB4MTA3OCwgMHgyMjZjLCAweDEwNzgsCisJMHgyMTc4LCAweDAwNzgsIDB4MjY3MCwgMHgxMDdlLCAweDAwN2UsIDB4MTA3OCwgMHgyMjZjLCAweDEwNzgsCisJMHgyMTc4LCAweDAwNzgsIDB4MjY3MCwgMHgxMDdlLCAweDAwN2UsIDB4MTA3OCwgMHgyMTMzLCAweDEwNzgsCisJMHgyMTc4LCAweDAwNzgsIDB4MjY3MCwgMHgxMDdlLCAweDAwN2UsIDB4MTA3OCwgMHgyMTMzLCAweDEwNzgsCisJMHgyMTc4LCAweDAwNzgsIDB4MjY3MCwgMHgxMDdlLCAweDAwN2UsIDB4MTA3OCwgMHgyMjZjLCAweDEwNzgsCisJMHgyMTMzLCAweDEwNzgsIDB4MjE3OCwgMHgwMDc4LCAweDI2NzAsIDB4MTA3ZSwgMHgwMDdlLCAweDEwNzgsCisJMHgyMjZjLCAweDEwNzgsIDB4MjEzMywgMHgxMDc4LCAweDIxNzgsIDB4MDA3OCwgMHgyNjcwLCAweDAwMDUsCisJMHgwMDc4LCAweDI2NTcsIDB4YjA4NCwgMHgwMDNjLCAweDgwMDQsIDB4ODAwNCwgMHgwMDc5LCAweDI2NjAsCisJMHgyNjcwLCAweDI1ZWQsIDB4MjVmMSwgMHgyNWY3LCAweDI1ZmQsIDB4MjYwMywgMHgyNjA5LCAweDI2MTEsCisJMHgyNjE5LCAweDI2MWYsIDB4MjYyNSwgMHgyNjJkLCAweDI2MzUsIDB4MjYzZCwgMHgyNjQ1LCAweDI2NGYsCisJMHgwMDA4LCAweDI2NWEsIDB4MDA3ZiwgMHgxMDdmLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDBjN2UsCisJMHgwMjdlLCAweDA0N2UsIDB4MjAyMSwgMHgwMDAwLCAweDEwNzgsIDB4NDk2NywgMHgwMGMwLCAweDI3NzIsCisJMHg3MGNjLCAweGQwOWMsIDB4MDA0MCwgMHgyNjhlLCAweGQwODQsIDB4MDBjMCwgMHgyNjhlLCAweGQwYmMsCisJMHgwMGMwLCAweDI3NzIsIDB4MTA3OCwgMHgyNzc2LCAweDAwNzgsIDB4Mjc3MiwgMHhkMGNjLCAweDAwYzAsCisJMHgyNzcyLCAweGQwOTQsIDB4MDA0MCwgMHgyNjk4LCAweDcwOTcsIDB4ZmZmZiwgMHgwMDc4LCAweDI3NzIsCisJMHgyMDAxLCAweDAxMGMsIDB4MjAzYywgMHg3Mjg0LCAweGQyODQsIDB4MDA0MCwgMHgyNzAxLCAweGQyOGMsCisJMHgwMGMwLCAweDI3MDEsIDB4MDM3ZSwgMHg3Mzk0LCAweGEzOGUsIDB4ZmZmZiwgMHgwMDQwLCAweDI2YWIsCisJMHg4M2ZmLCAweDAwYzAsIDB4MjZhZCwgMHgyMDE5LCAweDAwMDEsIDB4ODMxNCwgMHhhMmUwLCAweGFjYzAsCisJMHgyYzA0LCAweGEzOGMsIDB4MDAwMSwgMHgwMDQwLCAweDI2YmEsIDB4YTA4NCwgMHhmZjAwLCAweDgwMDcsCisJMHgwMDc4LCAweDI2YmMsIDB4YTA4NCwgMHgwMGZmLCAweGE3MGUsIDB4MDA0MCwgMHgyNmY2LCAweGEwOGUsCisJMHgwMDAwLCAweDAwNDAsIDB4MjZmNiwgMHhhMDhlLCAweDAwZmYsIDB4MDBjMCwgMHgyNmQzLCAweDcyMzAsCisJMHhkMjg0LCAweDAwYzAsIDB4MjZmYywgMHg3Mjg0LCAweGMyOGQsIDB4NzI4NiwgMHg3MDk3LCAweGZmZmYsCisJMHgwMzdmLCAweDAwNzgsIDB4MjcwMSwgMHgyMDA5LCAweDAwMDAsIDB4MTA3OCwgMHgyNTRkLCAweDEwNzgsCisJMHg0NTVjLCAweDAwYzAsIDB4MjZmOSwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsCisJMHgwMGMwLCAweDI2ZjAsIDB4NzAzMCwgMHhkMDhjLCAweDAwNDAsIDB4MjZlYSwgMHg2MDAwLCAweGQwYmMsCisJMHgwMDQwLCAweDI2ZjAsIDB4MTA3OCwgMHgyNzhjLCAweDAwNDAsIDB4MjZmOSwgMHgwMDc4LCAweDI2ZjYsCisJMHgxMDc4LCAweDI4YzQsIDB4MTA3OCwgMHgyN2I5LCAweDAwNDAsIDB4MjZmOSwgMHg4MzE4LCAweDAwNzgsCisJMHgyNmFkLCAweDczOTYsIDB4MDA3OCwgMHgyNmZlLCAweDcwOTcsIDB4ZmZmZiwgMHgwMzdmLCAweDAwNzgsCisJMHgyNzcyLCAweGE3ODAsIDB4MjljMCwgMHgyMDNjLCAweGE3YmMsIDB4ZmYwMCwgMHg4NzNmLCAweDIwNDEsCisJMHgwMDdlLCAweDcwOTQsIDB4YTA5NiwgMHhmZmZmLCAweDAwYzAsIDB4MjcxMywgMHgyMDA5LCAweDAwMDAsCisJMHgyOGE4LCAweDAwNzgsIDB4MjcxZiwgMHhhODEyLCAweDAwNDgsIDB4MjcxYiwgMHgyMDA4LCAweGE4MDIsCisJMHgyMGE4LCAweDAwNzgsIDB4MjcxZiwgMHg3MDk3LCAweGZmZmYsIDB4MDA3OCwgMHgyNzcyLCAweDI3MDAsCisJMHgxNTdlLCAweDAxN2UsIDB4YTEwNiwgMHgwMDQwLCAweDI3NjYsIDB4YzQ4NCwgMHgxMDc4LCAweDQ1YzQsCisJMHgwMDQwLCAweDI3MzAsIDB4MTA3OCwgMHg0NTVjLCAweDAwYzAsIDB4Mjc2ZiwgMHgwMDc4LCAweDI3MzEsCisJMHhjNDg1LCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgwMGMwLCAweDI3NDAsCisJMHg3MDMwLCAweGQwOGMsIDB4MDA0MCwgMHgyNzVlLCAweDYwMDAsIDB4ZDBiYywgMHgwMGMwLCAweDI3NWUsCisJMHg3Mjg0LCAweGQyOGMsIDB4MDA0MCwgMHgyNzU2LCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODIsCisJMHgwMDA2LCAweDAwNDgsIDB4Mjc2NiwgMHhkNDg0LCAweDAwYzAsIDB4Mjc1MiwgMHgxMDc4LCAweDQ1N2YsCisJMHgwMDc4LCAweDI3NTQsIDB4MTA3OCwgMHgyOThlLCAweDAwNzgsIDB4Mjc2NiwgMHgxMDc4LCAweDI4YzQsCisJMHgxMDc4LCAweDI3YjksIDB4MDA0MCwgMHgyNzZmLCAweDAwNzgsIDB4Mjc2NiwgMHgxMDc4LCAweDI5NTksCisJMHgwMDQwLCAweDI3NjYsIDB4MTA3OCwgMHgyNzhjLCAweDAwNDAsIDB4Mjc2ZiwgMHgwMTdmLCAweDgxMDgsCisJMHgxNTdmLCAweDAwZjAsIDB4MjcxZiwgMHg3MDk3LCAweGZmZmYsIDB4MDA3OCwgMHgyNzcyLCAweDAxN2YsCisJMHgxNTdmLCAweDcxOTYsIDB4MDQ3ZiwgMHgwMjdmLCAweDBjN2YsIDB4MDA3YywgMHgwYzdlLCAweDAxN2UsCisJMHg3MDk3LCAweDAwMDEsIDB4MjAwOSwgMHgwMDdlLCAweDEwNzgsIDB4NDU1YywgMHgwMGMwLCAweDI3ODksCisJMHgxMDc4LCAweDI4YzQsIDB4MTA3OCwgMHgyN2I5LCAweDAwNDAsIDB4Mjc4OSwgMHg3MGNjLCAweGMwYmQsCisJMHg3MGNlLCAweDAxN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDAxN2UsIDB4MDc3ZSwgMHgwZDdlLCAweDBjN2UsCisJMHgyYzY4LCAweDIwMDEsIDB4YTY1NywgMHgyMDA0LCAweGEwODQsIDB4MDBmZiwgMHg2ODQyLCAweDEwNzgsCisJMHg3NmM3LCAweDAwNDAsIDB4MjdiNCwgMHgyZDAwLCAweDYwMWEsIDB4NjAxZiwgMHgwMDAxLCAweDIwMDEsCisJMHgwMDAwLCAweDEwNzgsIDB4NDRlZSwgMHgyMDAxLCAweDAwMDAsIDB4MTA3OCwgMHg0NTAyLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4NzA5MCwgMHg4MDAwLCAweDcwOTIsIDB4MTI3ZiwgMHgyMDA5LCAweDAwMDQsCisJMHgxMDc4LCAweDc3NWMsIDB4YTA4NSwgMHgwMDAxLCAweDBjN2YsIDB4MGQ3ZiwgMHgwNzdmLCAweDAxN2YsCisJMHgwMDdjLCAweDAxN2UsIDB4MDc3ZSwgMHgwZDdlLCAweDBjN2UsIDB4MmM2OCwgMHgyMDAxLCAweGE2NTcsCisJMHgyMDA0LCAweGEwODQsIDB4MDBmZiwgMHg2ODQyLCAweDEwNzgsIDB4OTE4NywgMHgwMDQwLCAweDI3ZjIsCisJMHgyZDAwLCAweDYwMWEsIDB4NjgwMCwgMHhjMGM0LCAweDY4MDIsIDB4NjhhMCwgMHhhMDg2LCAweDAwN2UsCisJMHgwMDQwLCAweDI3ZGIsIDB4NjgwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsCisJMHgyN2RiLCAweDEwNzgsIDB4Mjg4MCwgMHg2MDFmLCAweDAwMDEsIDB4MjAwMSwgMHgwMDAwLCAweDEwNzgsCisJMHg0NGVlLCAweDIwMDEsIDB4MDAwMiwgMHgxMDc4LCAweDQ1MDIsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHg3MDkwLCAweDgwMDAsIDB4NzA5MiwgMHgxMjdmLCAweDIwMDksIDB4MDAwMiwgMHgxMDc4LCAweDc3NWMsCisJMHhhMDg1LCAweDAwMDEsIDB4MGM3ZiwgMHgwZDdmLCAweDA3N2YsIDB4MDE3ZiwgMHgwMDdjLCAweDBjN2UsCisJMHgwMjdlLCAweDIwMDksIDB4MDA4MCwgMHgxMDc4LCAweDQ1NWMsIDB4MDBjMCwgMHgyODA1LCAweDEwNzgsCisJMHgyODA4LCAweDAwNDAsIDB4MjgwNSwgMHg3MGQzLCAweGZmZmYsIDB4MDI3ZiwgMHgwYzdmLCAweDAwN2MsCisJMHgwMTdlLCAweDA3N2UsIDB4MGQ3ZSwgMHgwYzdlLCAweDJjNjgsIDB4MTA3OCwgMHg3NmM3LCAweDAwNDAsCisJMHgyODJhLCAweDJkMDAsIDB4NjAxYSwgMHg2MDFmLCAweDAwMDEsIDB4MjAwMSwgMHgwMDAwLCAweDEwNzgsCisJMHg0NGVlLCAweDIwMDEsIDB4MDAwMiwgMHgxMDc4LCAweDQ1MDIsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHg3MGQ0LCAweDgwMDAsIDB4NzBkNiwgMHgxMjdmLCAweDIwMDksIDB4MDAwMiwgMHgxMDc4LCAweDc3NWMsCisJMHhhMDg1LCAweDAwMDEsIDB4MGM3ZiwgMHgwZDdmLCAweDA3N2YsIDB4MDE3ZiwgMHgwMDdjLCAweDBjN2UsCisJMHgwZDdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDksIDB4MDA3ZiwgMHgxMDc4LCAweDQ1NWMsCisJMHgwMGMwLCAweDI4NGIsIDB4MmM2OCwgMHgxMDc4LCAweDc2YzcsIDB4MDA0MCwgMHgyODRiLCAweDJkMDAsCisJMHg2MDFhLCAweDYzMTIsIDB4NjAxZiwgMHgwMDAxLCAweDYyMGEsIDB4MjAwOSwgMHgwMDIyLCAweDEwNzgsCisJMHg3NzVjLCAweGEwODUsIDB4MDAwMSwgMHgxMjdmLCAweDBkN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDBlN2UsCisJMHgwYzdlLCAweDA2N2UsIDB4MDM3ZSwgMHgwMjdlLCAweDEwNzgsIDB4NWYwZSwgMHgxMDc4LCAweDVlYWUsCisJMHgxMDc4LCAweDgwNjgsIDB4MjEzMCwgMHg4MWZmLCAweDAwNDAsIDB4Mjg2NCwgMHgyMGE5LCAweDAwN2UsCisJMHgyMDA5LCAweDAwMDAsIDB4MDA3OCwgMHgyODY4LCAweDIwYTksIDB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsCisJMHgwMTdlLCAweDEwNzgsIDB4NDVjNCwgMHgwMGMwLCAweDI4NzEsIDB4MTA3OCwgMHg0N2U5LCAweDEwNzgsCisJMHg0MmY4LCAweDAxN2YsIDB4ODEwOCwgMHgwMGYwLCAweDI4NjgsIDB4ODZmZiwgMHgwMGMwLCAweDI4N2EsCisJMHgxMDc4LCAweDExOWIsIDB4MDI3ZiwgMHgwMzdmLCAweDA2N2YsIDB4MGM3ZiwgMHgwZTdmLCAweDAwN2MsCisJMHgwZTdlLCAweDBjN2UsIDB4MDM3ZSwgMHgwMjdlLCAweDAxN2UsIDB4NjIxOCwgMHgyMjcwLCAweDcyYTAsCisJMHgwMjdlLCAweDIwMTksIDB4MDAyOSwgMHgxMDc4LCAweDVmMDEsIDB4MDc3ZSwgMHgyMDM5LCAweDAwMDAsCisJMHgxMDc4LCAweDVlMGEsIDB4MmMwOCwgMHgxMDc4LCAweDlmOGIsIDB4MDc3ZiwgMHgwMTdmLCAweDJlNjAsCisJMHgxMDc4LCAweDQ3ZTksIDB4NjIxMCwgMHg2MzE0LCAweDEwNzgsIDB4NDJmOCwgMHg2MjEyLCAweDYzMTYsCisJMHgwMTdmLCAweDAyN2YsIDB4MDM3ZiwgMHgwYzdmLCAweDBlN2YsIDB4MDA3YywgMHgwZTdlLCAweDAwN2UsCisJMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGQwYmMsIDB4MDBjMCwgMHgyOGJhLCAweDIwNzEsCisJMHhhNjAwLCAweDcwOTAsIDB4YTAwNSwgMHgwMDQwLCAweDI4YjcsIDB4ODAwMSwgMHg3MDkyLCAweDAwN2YsCisJMHgwZTdmLCAweDAwN2MsIDB4MjA3MSwgMHhhNjAwLCAweDcwZDQsIDB4YTAwNSwgMHgwMDQwLCAweDI4YjcsCisJMHg4MDAxLCAweDcwZDYsIDB4MDA3OCwgMHgyOGI3LCAweDYwMDAsIDB4YzA4YywgMHg2MDAyLCAweDAwN2MsCisJMHgwZjdlLCAweDBlN2UsIDB4MGM3ZSwgMHgwMzdlLCAweDAyN2UsIDB4MDE3ZSwgMHgxNTdlLCAweDIxNzgsCisJMHg4MWZmLCAweDAwYzAsIDB4MjhkNywgMHgyMGE5LCAweDAwMDEsIDB4MDA3OCwgMHgyOGYyLCAweDIwMDEsCisJMHhhNjUzLCAweDIwMDQsIDB4ZDBjNCwgMHgwMDQwLCAweDI4ZWUsIDB4ZDBhNCwgMHgwMDQwLCAweDI4ZWUsCisJMHgwNDdlLCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMjQsIDB4YTRhNCwgMHgwMGZmLCAweDg0MjcsCisJMHhhMDA2LCAweDIwMDksIDB4MDAyZCwgMHgxMDc4LCAweGEyMWQsIDB4MDQ3ZiwgMHgyMGE5LCAweDAwZmYsCisJMHgyMDExLCAweDAwMDAsIDB4MDI3ZSwgMHhhMjhlLCAweDAwN2UsIDB4MDA0MCwgMHgyOTM2LCAweGEyOGUsCisJMHgwMDdmLCAweDAwNDAsIDB4MjkzNiwgMHhhMjhlLCAweDAwODAsIDB4MDA0MCwgMHgyOTM2LCAweGEyODgsCisJMHhhNzM1LCAweDIxMGMsIDB4ODFmZiwgMHgwMDQwLCAweDI5MzYsIDB4OGZmZiwgMHgxMDQwLCAweDI5NDIsCisJMHgwYzdlLCAweDIxNjAsIDB4MjAwMSwgMHgwMDAxLCAweDEwNzgsIDB4NDk3MiwgMHgwYzdmLCAweDIwMTksCisJMHgwMDI5LCAweDEwNzgsIDB4NWYwMSwgMHgwNzdlLCAweDIwMzksIDB4MDAwMCwgMHgxMDc4LCAweDVlMGEsCisJMHgwYzdlLCAweDAyN2UsIDB4MjE2MCwgMHg2MjA0LCAweGEyOTQsIDB4MDBmZiwgMHhhMjg2LCAweDAwMDYsCisJMHgwMGMwLCAweDI5MjYsIDB4NjAwNywgMHgwNDA0LCAweDAwNzgsIDB4MjkyYiwgMHgyMDAxLCAweDAwMDQsCisJMHg4MDA3LCAweGEyMTUsIDB4NjIwNiwgMHgwMjdmLCAweDBjN2YsIDB4MDE3ZSwgMHgyYzA4LCAweDEwNzgsCisJMHg5ZjhiLCAweDAxN2YsIDB4MDc3ZiwgMHgyMTYwLCAweDEwNzgsIDB4NDdlOSwgMHgwMjdmLCAweDgyMTAsCisJMHgwMGYwLCAweDI4ZjIsIDB4MTU3ZiwgMHgwMTdmLCAweDAyN2YsIDB4MDM3ZiwgMHgwYzdmLCAweDBlN2YsCisJMHgwZjdmLCAweDAwN2MsIDB4MDQ3ZSwgMHgwMjdlLCAweDAxN2UsIDB4MjAwMSwgMHhhNjUzLCAweDIwMDQsCisJMHhkMGM0LCAweDAwNDAsIDB4Mjk1NSwgMHhkMGE0LCAweDAwNDAsIDB4Mjk1NSwgMHhhMDA2LCAweDIyMjAsCisJMHg4NDI3LCAweDIwMDksIDB4MDAyOSwgMHgxMDc4LCAweGEyMWQsIDB4MDE3ZiwgMHgwMjdmLCAweDA0N2YsCisJMHgwMDdjLCAweDAxN2UsIDB4MDI3ZSwgMHgwMzdlLCAweDBjN2UsIDB4NzI4NCwgMHg4MmZmLCAweDAwNDAsCisJMHgyOTg3LCAweGEyOTAsIDB4YTY1MywgMHgyMjE0LCAweGQyYWMsIDB4MDBjMCwgMHgyOTg3LCAweDIxMDAsCisJMHgxMDc4LCAweDI1NjQsIDB4ODFmZiwgMHgwMDQwLCAweDI5ODksIDB4MjAxOSwgMHgwMDAxLCAweDgzMTQsCisJMHhhMmUwLCAweGFjYzAsIDB4MmMwNCwgMHhkMzg0LCAweDAwNDAsIDB4Mjk3YiwgMHhhMDg0LCAweGZmMDAsCisJMHg4MDA3LCAweDAwNzgsIDB4Mjk3ZCwgMHhhMDg0LCAweDAwZmYsIDB4YTExNiwgMHgwMDQwLCAweDI5ODksCisJMHhhMDk2LCAweDAwZmYsIDB4MDA0MCwgMHgyOTg3LCAweDgzMTgsIDB4MDA3OCwgMHgyOTZmLCAweGEwODUsCisJMHgwMDAxLCAweDBjN2YsIDB4MDM3ZiwgMHgwMjdmLCAweDAxN2YsIDB4MDA3YywgMHgwMTdlLCAweDBjN2UsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwMTdlLCAweDAyN2UsIDB4MDM3ZSwgMHgyMTEwLCAweDAyN2UsCisJMHgyMDE5LCAweDAwMjksIDB4MTA3OCwgMHg3M2QwLCAweDAyN2YsIDB4MTA3OCwgMHhhNGYxLCAweDAzN2YsCisJMHgwMjdmLCAweDAxN2YsIDB4YTE4MCwgMHhhNzM1LCAweDIwMDQsIDB4YTA2NSwgMHgwMDQwLCAweDI5YjcsCisJMHgwMTdlLCAweDBjN2UsIDB4MTA3OCwgMHg5MTg3LCAweDAxN2YsIDB4MTA0MCwgMHgxMzMyLCAweDYxMWEsCisJMHgxMDc4LCAweDI4ODAsIDB4MTA3OCwgMHg3NzJkLCAweDAxN2YsIDB4MTA3OCwgMHg0NTdmLCAweDEyN2YsCisJMHgwYzdmLCAweDAxN2YsIDB4MDA3YywgMHgyMDAxLCAweGE2MzMsIDB4MjAwNCwgMHhkMGNjLCAweDAwN2MsCisJMHg3ZWVmLCAweDdkZTgsIDB4N2NlNCwgMHg4MGUyLCAweDdiZTEsIDB4ODBlMCwgMHg4MGRjLCAweDgwZGEsCisJMHg3YWQ5LCAweDgwZDYsIDB4ODBkNSwgMHg4MGQ0LCAweDgwZDMsIDB4ODBkMiwgMHg4MGQxLCAweDc5Y2UsCisJMHg3OGNkLCAweDgwY2MsIDB4ODBjYiwgMHg4MGNhLCAweDgwYzksIDB4ODBjNywgMHg4MGM2LCAweDc3YzUsCisJMHg3NmMzLCAweDgwYmMsIDB4ODBiYSwgMHg3NWI5LCAweDgwYjYsIDB4NzRiNSwgMHg3M2I0LCAweDcyYjMsCisJMHg4MGIyLCAweDgwYjEsIDB4ODBhZSwgMHg3MWFkLCAweDgwYWMsIDB4NzBhYiwgMHg2ZmFhLCAweDZlYTksCisJMHg4MGE3LCAweDZkYTYsIDB4NmNhNSwgMHg2YmEzLCAweDZhOWYsIDB4Njk5ZSwgMHg2ODlkLCAweDgwOWIsCisJMHg4MDk4LCAweDY3OTcsIDB4NjY5MCwgMHg2NThmLCAweDY0ODgsIDB4NjM4NCwgMHg2MjgyLCAweDgwODEsCisJMHg4MDgwLCAweDYxN2MsIDB4NjA3YSwgMHg4MDc5LCAweDVmNzYsIDB4ODA3NSwgMHg4MDc0LCAweDgwNzMsCisJMHg4MDcyLCAweDgwNzEsIDB4ODA2ZSwgMHg1ZTZkLCAweDgwNmMsIDB4NWQ2YiwgMHg1YzZhLCAweDViNjksCisJMHg4MDY3LCAweDVhNjYsIDB4NTk2NSwgMHg1ODYzLCAweDU3NWMsIDB4NTY1YSwgMHg1NTU5LCAweDgwNTYsCisJMHg4MDU1LCAweDU0NTQsIDB4NTM1MywgMHg1MjUyLCAweDUxNTEsIDB4NTA0ZSwgMHg0ZjRkLCAweDgwNGMsCisJMHg4MDRiLCAweDRlNGEsIDB4NGQ0OSwgMHg4MDQ3LCAweDRjNDYsIDB4ODA0NSwgMHg4MDQzLCAweDgwM2MsCisJMHg4MDNhLCAweDgwMzksIDB4ODAzNiwgMHg0YjM1LCAweDgwMzQsIDB4NGEzMywgMHg0OTMyLCAweDQ4MzEsCisJMHg4MDJlLCAweDQ3MmQsIDB4NDYyYywgMHg0NTJiLCAweDQ0MmEsIDB4NDMyOSwgMHg0MjI3LCAweDgwMjYsCisJMHg4MDI1LCAweDQxMjMsIDB4NDAxZiwgMHgzZjFlLCAweDNlMWQsIDB4M2QxYiwgMHgzYzE4LCAweDgwMTcsCisJMHg4MDEwLCAweDNiMGYsIDB4M2EwOCwgMHg4MDA0LCAweDM5MDIsIDB4ODAwMSwgMHg4MDAwLCAweDgwMDAsCisJMHgzODAwLCAweDM3MDAsIDB4MzYwMCwgMHg4MDAwLCAweDM1MDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHgzNDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDMzMDAsCisJMHgzMjAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDMxMDAsCisJMHgzMDAwLCAweDgwMDAsIDB4ODAwMCwgMHgyZjAwLCAweDgwMDAsIDB4MmUwMCwgMHgyZDAwLCAweDJjMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgyYjAwLCAweDgwMDAsIDB4MmEwMCwgMHgyOTAwLCAweDI4MDAsCisJMHg4MDAwLCAweDI3MDAsIDB4MjYwMCwgMHgyNTAwLCAweDI0MDAsIDB4MjMwMCwgMHgyMjAwLCAweDgwMDAsCisJMHg4MDAwLCAweDIxMDAsIDB4MjAwMCwgMHgxZjAwLCAweDFlMDAsIDB4MWQwMCwgMHgxYzAwLCAweDgwMDAsCisJMHg4MDAwLCAweDFiMDAsIDB4MWEwMCwgMHg4MDAwLCAweDE5MDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgxODAwLCAweDgwMDAsIDB4MTcwMCwgMHgxNjAwLCAweDE1MDAsCisJMHg4MDAwLCAweDE0MDAsIDB4MTMwMCwgMHgxMjAwLCAweDExMDAsIDB4MTAwMCwgMHgwZjAwLCAweDgwMDAsCisJMHg4MDAwLCAweDBlMDAsIDB4MGQwMCwgMHgwYzAwLCAweDBiMDAsIDB4MGEwMCwgMHgwOTAwLCAweDgwMDAsCisJMHg4MDAwLCAweDA4MDAsIDB4MDcwMCwgMHg4MDAwLCAweDA2MDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHgwNTAwLCAweDA0MDAsIDB4MDMwMCwgMHg4MDAwLCAweDAyMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHgwMTAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDAwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHgyMDcxLCAweGE2ODIsIDB4NzAwMywgMHgwMDAyLCAweGEwMDYsIDB4NzAxMiwgMHg3MDE2LCAweDcwM2EsCisJMHg3MDNlLCAweDcwMzMsIDB4YTY5MiwgMHg3MDM3LCAweGE2OTIsIDB4NzAwNywgMHgwMDAxLCAweDIwNjEsCisJMHhhNmQyLCAweDYwMDMsIDB4MDAwMiwgMHgwMDdjLCAweDAwOTAsIDB4MmFlNywgMHgwMDY4LCAweDJhZTcsCisJMHgyMDcxLCAweGE2ODIsIDB4MmI3OCwgMHg3ODE4LCAweGQwODQsIDB4MDBjMCwgMHgyYWU3LCAweDJhNjAsCisJMHg3ODIwLCAweGEwOGUsIDB4MDA2OSwgMHgwMGMwLCAweDJiZDcsIDB4MDA3OSwgMHgyYjZiLCAweDAwN2MsCisJMHgyMDcxLCAweGE2ODIsIDB4NzAwNCwgMHgwMDc5LCAweDJhZWQsIDB4MmFmMSwgMHgyYWYyLCAweDJhZmMsCisJMHgyYjBlLCAweDAwN2MsIDB4MDA5MCwgMHgyYWZiLCAweDAwNjgsIDB4MmFmYiwgMHgyYjc4LCAweDc4MTgsCisJMHhkMDg0LCAweDAwNDAsIDB4MmIxYSwgMHgwMDdjLCAweDJiNzgsIDB4MjA2MSwgMHhhNmQyLCAweDYwMDgsCisJMHhhMDhlLCAweDAxMDAsIDB4MDA0MCwgMHgyYjA5LCAweGEwODYsIDB4MDIwMCwgMHgwMDQwLCAweDJiY2YsCisJMHgwMDdjLCAweDcwMTQsIDB4MjA2OCwgMHgyYTYwLCAweDcwMTgsIDB4MDA3YSwgMHg3MDEwLCAweDIwNjgsCisJMHg2ODM0LCAweGEwODYsIDB4MDEwMywgMHgwMDQwLCAweDJiMTYsIDB4MDA3YywgMHgyYTYwLCAweDJiNzgsCisJMHg3MDE4LCAweDAwN2EsIDB4MmE2MCwgMHg3ODIwLCAweGEwOGEsIDB4MDA0MCwgMHgwMGM4LCAweDJiMjMsCisJMHg2MWJjLCAweDAwNzksIDB4MmIyYiwgMHgyMTAwLCAweGEwOGEsIDB4MDAzZiwgMHgwMGM4LCAweDJiY2IsCisJMHg2MWJjLCAweDAwNzksIDB4MmI2YiwgMHgyYmFkLCAweDJiZGYsIDB4MmJlNywgMHgyYmViLCAweDJiZjMsCisJMHgyYmY5LCAweDJiZmQsIDB4MmMwOSwgMHgyYzBkLCAweDJjMTcsIDB4MmMxYiwgMHgyYmNiLCAweDJiY2IsCisJMHgyYmNiLCAweDJjMWYsIDB4MmJjYiwgMHgyYzJmLCAweDJjNDYsIDB4MmM1ZCwgMHgyY2RkLCAweDJjZTIsCisJMHgyZDBmLCAweDJkNjksIDB4MmQ3YSwgMHgyZDk4LCAweDJkZDksIDB4MmRlMywgMHgyZGYwLCAweDJlMDMsCisJMHgyZTIyLCAweDJlMmIsIDB4MmU2OCwgMHgyZTZlLCAweDJiY2IsIDB4MmU4YSwgMHgyYmNiLCAweDJiY2IsCisJMHgyYmNiLCAweDJiY2IsIDB4MmJjYiwgMHgyZTkxLCAweDJlOWIsIDB4MmJjYiwgMHgyYmNiLCAweDJiY2IsCisJMHgyYmNiLCAweDJiY2IsIDB4MmJjYiwgMHgyYmNiLCAweDJiY2IsIDB4MmVhMywgMHgyYmNiLCAweDJiY2IsCisJMHgyYmNiLCAweDJiY2IsIDB4MmJjYiwgMHgyZWI1LCAweDJlY2UsIDB4MmJjYiwgMHgyYmNiLCAweDJiY2IsCisJMHgyYmNiLCAweDJiY2IsIDB4MmJjYiwgMHgyZWUwLCAweDJmMzcsIDB4MmY5NSwgMHgyZmE5LCAweDJiY2IsCisJMHgyYmNiLCAweDJiY2IsIDB4Mzk4ZSwgMHgyYmNiLCAweDJiY2IsIDB4MmJjYiwgMHgyYmNiLCAweDJiY2IsCisJMHgyYmNiLCAweDJiY2IsIDB4MmJjYiwgMHgyYzE3LCAweDJjMWIsIDB4MmZjMCwgMHgyYmNiLCAweDJmY2QsCisJMHgzYTI2LCAweDNhODMsIDB4MmJjYiwgMHgyYmNiLCAweDJiY2IsIDB4MmJjYiwgMHgyYmNiLCAweDJiY2IsCisJMHgyYmNiLCAweDJiY2IsIDB4MmJjYiwgMHgzMDFhLCAweDMxNGYsIDB4MzE2YiwgMHgzMTc3LCAweDMxZGEsCisJMHgzMjMzLCAweDMyM2UsIDB4MzI3ZCwgMHgzMjhjLCAweDMyOWIsIDB4MzI5ZSwgMHgyZmQxLCAweDMyYzIsCisJMHgzMzFlLCAweDMzMmIsIDB4MzQzYywgMHgzNTZmLCAweDM1OTksIDB4MzZhNiwgMHgyYmNiLCAweDM2YjYsCisJMHgzNmYwLCAweDM3YmYsIDB4MmJjYiwgMHgyYmNiLCAweDJiY2IsIDB4MmJjYiwgMHgzODI3LCAweDM4NDMsCisJMHgzOGJkLCAweDM5NzcsIDB4NzEzYywgMHgwMDc4LCAweDJiYWQsIDB4MjAyMSwgMHg0MDAwLCAweDEwNzgsCisJMHgzNWY1LCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDAwNjgsIDB4MmJiYSwgMHg3ODE4LCAweGQwODQsCisJMHgwMDQwLCAweDJiYmQsIDB4MTI3ZiwgMHgwMDc4LCAweDJiYjEsIDB4N2MyMiwgMHg3OTI2LCAweDdhMmEsCisJMHg3YjJlLCAweDc4MWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4NzAwNywgMHgwMDAxLCAweDIwOTEsCisJMHg1MDAwLCAweDEyN2YsIDB4MDA3YywgMHgyMDIxLCAweDQwMDEsIDB4MDA3OCwgMHgyYmFmLCAweDIwMjEsCisJMHg0MDAyLCAweDAwNzgsIDB4MmJhZiwgMHgyMDIxLCAweDQwMDMsIDB4MDA3OCwgMHgyYmFmLCAweDIwMjEsCisJMHg0MDA1LCAweDAwNzgsIDB4MmJhZiwgMHgyMDIxLCAweDQwMDYsIDB4MDA3OCwgMHgyYmFmLCAweGEwMmUsCisJMHgyNTIwLCAweDdiMjgsIDB4N2EyYywgMHg3ODI0LCAweDc5MzAsIDB4MDA3OCwgMHgzNjA0LCAweDc4MjMsCisJMHgwMDA0LCAweDc4MjQsIDB4MDA3YSwgMHhhMDJlLCAweDI1MjAsIDB4N2IyOCwgMHg3YTJjLCAweDc4MjQsCisJMHg3OTMwLCAweDAwNzgsIDB4MzYwOCwgMHg3OTI0LCAweDc4MjgsIDB4MjExNCwgMHgyMDBhLCAweDAwNzgsCisJMHgyYmFkLCAweDc5MjQsIDB4MjExNCwgMHgwMDc4LCAweDJiYWQsIDB4MjA5OSwgMHgwMDA5LCAweDIwYTEsCisJMHgwMDA5LCAweDIwYTksIDB4MDAwNywgMHg1M2EzLCAweDc5MjQsIDB4N2EyOCwgMHg3YjJjLCAweDAwNzgsCisJMHgyYmFkLCAweDc4MjQsIDB4MjA2MCwgMHgwMDc4LCAweDJjMjEsIDB4MjAwOSwgMHgwMDAxLCAweDIwMTEsCisJMHgwMDEzLCAweDIwMTksIDB4MDAxOCwgMHg3ODNiLCAweDAwMTcsIDB4MDA3OCwgMHgyYmFkLCAweDdkMzgsCisJMHg3YzNjLCAweDAwNzgsIDB4MmJlMSwgMHg3ZDM4LCAweDdjM2MsIDB4MDA3OCwgMHgyYmVkLCAweDIwNjEsCisJMHgxMDAwLCAweDYxMGMsIDB4YTAwNiwgMHgyYzE0LCAweGEyMDAsIDB4OGM2MCwgMHg4MTA5LCAweDAwYzAsCisJMHgyYzIzLCAweDIwMTAsIDB4YTAwNSwgMHgwMDQwLCAweDJiYWQsIDB4MDA3OCwgMHgyYmQzLCAweDIwNjksCisJMHhhNjUyLCAweDc4MjQsIDB4NzkzMCwgMHhhMTFhLCAweDAwYzgsIDB4MmJkYiwgMHg4MDE5LCAweDAwNDAsCisJMHgyYmRiLCAweDY4NGEsIDB4Njk0MiwgMHg3ODJjLCAweDY4NTIsIDB4NzgyOCwgMHg2ODU2LCAweGEwMDYsCisJMHg2ODVhLCAweDY4NWUsIDB4MTA3OCwgMHg0ZWFlLCAweDAwNzgsIDB4MmJhZCwgMHgyMDY5LCAweGE2NTIsCisJMHg3ODI0LCAweDc5MzQsIDB4YTExYSwgMHgwMGM4LCAweDJiZGIsIDB4ODAxOSwgMHgwMDQwLCAweDJiZGIsCisJMHg2ODRlLCAweDY5NDYsIDB4NzgyYywgMHg2ODYyLCAweDc4MjgsIDB4Njg2NiwgMHhhMDA2LCAweDY4NmEsCisJMHg2ODZlLCAweDEwNzgsIDB4NGEzZSwgMHgwMDc4LCAweDJiYWQsIDB4YTAyZSwgMHgyNTIwLCAweDgxZmYsCisJMHgwMGMwLCAweDJiZDcsIDB4NzkyNCwgMHg3YjI4LCAweDdhMmMsIDB4MjBhOSwgMHgwMDA1LCAweDIwYTEsCisJMHhhNjg5LCAweDQxYTEsIDB4MTA3OCwgMHgzNWJhLCAweDAwNDAsIDB4MmJkNywgMHgyMDA5LCAweDAwMjAsCisJMHgxMDc4LCAweDM2MDQsIDB4NzAxYiwgMHgyYzc1LCAweDAwN2MsIDB4NjgzNCwgMHgyMDA4LCAweGEwODQsCisJMHgwMGZmLCAweGEwOTYsIDB4MDAxMSwgMHgwMDQwLCAweDJjODUsIDB4YTA5NiwgMHgwMDE5LCAweDAwNDAsCisJMHgyYzg1LCAweGEwOTYsIDB4MDAxNSwgMHgwMGMwLCAweDJiZDcsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsCisJMHgwMDQwLCAweDJiZDcsIDB4NzEwZSwgMHg3MDBjLCAweDgwMDEsIDB4MDA0MCwgMHgyY2I2LCAweDcwMGUsCisJMHgxMDc4LCAweDM1YmEsIDB4MDA0MCwgMHgyYmQ3LCAweDIwMDksIDB4MDAyMCwgMHgyMDYxLCAweGE2ZDIsCisJMHg2MjI0LCAweDYzMjgsIDB4NjQyYywgMHg2NTMwLCAweGEyOTAsIDB4MDA0MCwgMHhhMzk5LCAweDAwMDAsCisJMHhhNGExLCAweDAwMDAsIDB4YTVhOSwgMHgwMDAwLCAweDEwNzgsIDB4MzYwNCwgMHg3MDFiLCAweDJjYTksCisJMHgwMDdjLCAweDY4MzQsIDB4YTA4NCwgMHgwMGZmLCAweGEwOTYsIDB4MDAwMiwgMHgwMDQwLCAweDJjYjQsCisJMHhhMDk2LCAweDAwMGEsIDB4MDBjMCwgMHgyYmQ3LCAweDAwNzgsIDB4MmM4YiwgMHg3MDEwLCAweDIwNjgsCisJMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHgxMDc4LCAweDQ0MzEsIDB4MDBjMCwgMHgyY2M0LCAweDcwMDcsCisJMHgwMDAzLCAweDcwMWIsIDB4MmNjNiwgMHgwMDdjLCAweDEwNzgsIDB4NGI1MSwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDIwYTksIDB4MDAwNSwgMHgyMDk5LCAweGE2ODksIDB4NTMwYSwgMHgyMTAwLCAweGEyMTAsCisJMHhhMzk5LCAweDAwMDAsIDB4YTRhMSwgMHgwMDAwLCAweGE1YTksIDB4MDAwMCwgMHhhZDgwLCAweDAwMGQsCisJMHgyMDA5LCAweDAwMjAsIDB4MTI3ZiwgMHgwMDc4LCAweDM2MDgsIDB4NjFhNCwgMHg3ODI0LCAweDYwYTYsCisJMHgwMDc4LCAweDJiYWQsIDB4MjA5MSwgMHg4MDAwLCAweDc4MjMsIDB4NDAwMCwgMHg3ODI3LCAweDQ5NTMsCisJMHg3ODJiLCAweDUwMjAsIDB4NzgyZiwgMHgyMDIwLCAweDIwMDksIDB4MDE3ZiwgMHgyMTA0LCAweDc4MzIsCisJMHgzZjAwLCAweDc4MzYsIDB4MjA2MSwgMHgwMTAwLCAweDYyMDAsIDB4MjA2MSwgMHgwMjAwLCAweDYwM2MsCisJMHg4MDA3LCAweGEyMDUsIDB4NzgzYSwgMHgyMDA5LCAweDA0ZmQsIDB4MjEwNCwgMHg3ODNlLCAweDc4MWIsCisJMHgwMDAxLCAweDIwOTEsIDB4NTAwMCwgMHgyMDkxLCAweDQwODAsIDB4MjA3MSwgMHgwMDEwLCAweDIwYzEsCisJMHgwMGYwLCAweGEwOGEsIDB4MDAwMywgMHgwMGM4LCAweDA0MjcsIDB4MDA3OCwgMHgwNDIzLCAweDgxZmYsCisJMHgwMGMwLCAweDJiZDcsIDB4NzkyNCwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHgxMDc4LCAweDQ1YzQsCisJMHgwMGMwLCAweDJiZGIsIDB4N2UzOCwgMHhhNjg0LCAweDNmZmYsIDB4YTA4MiwgMHg0MDAwLCAweDAwNDgsCisJMHgyZDIzLCAweDAwNzgsIDB4MmJkYiwgMHg3YzI4LCAweDdkMmMsIDB4MTA3OCwgMHg0N2E0LCAweGQyOGMsCisJMHgwMGMwLCAweDJkMmUsIDB4MTA3OCwgMHg0NzM2LCAweDAwNzgsIDB4MmQzMCwgMHgxMDc4LCAweDQ3NzIsCisJMHgwMGMwLCAweDJkNWEsIDB4MjA2MSwgMHhhZDAwLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYwMDAsCisJMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwgMHgyZDQ4LCAweDYwMTAsIDB4YTA2ZCwgMHgwMDQwLCAweDJkNDgsCisJMHg2ODNjLCAweGE0MDYsIDB4MDBjMCwgMHgyZDQ4LCAweDY4NDAsIDB4YTUwNiwgMHgwMDQwLCAweDJkNTMsCisJMHgxMjdmLCAweGFjZTAsIDB4MDAxMCwgMHgyMDAxLCAweGE2MTYsIDB4MjAwNCwgMHhhYzAyLCAweDAwYzgsCisJMHgyYmQ3LCAweDAwNzgsIDB4MmQzNCwgMHgxMDc4LCAweDhhMDEsIDB4MTI3ZiwgMHgwMDQwLCAweDJiZDcsCisJMHgwMDc4LCAweDJiYWQsIDB4YTAwZSwgMHgyMDAxLCAweDAwMDUsIDB4MTA3OCwgMHg0YjUxLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg4Zjg1LCAweDEwNzgsIDB4NGE3MywgMHgxMjdmLCAweDAwNzgsCisJMHgyYmFkLCAweDgxZmYsIDB4MDBjMCwgMHgyYmQ3LCAweDEwNzgsIDB4MzVkMiwgMHgwMDQwLCAweDJiZGIsCisJMHgxMDc4LCAweDQ2NzMsIDB4MDA0MCwgMHgyYmQ3LCAweDEwNzgsIDB4NDdiMiwgMHgwMDQwLCAweDJiZDcsCisJMHgwMDc4LCAweDJiYWQsIDB4ODFmZiwgMHgwMGMwLCAweDJiZDcsIDB4MTA3OCwgMHgzNWU0LCAweDAwNDAsCisJMHgyYmRiLCAweDEwNzgsIDB4NDgyZiwgMHgwMDQwLCAweDJiZDcsIDB4MjAxOSwgMHgwMDA1LCAweDEwNzgsCisJMHg0N2QzLCAweDAwNDAsIDB4MmJkNywgMHg3ODI4LCAweGEwOGEsIDB4MTAwMCwgMHgwMGM4LCAweDJiZGIsCisJMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHhhMTA4LCAweDEwNzgsIDB4NWE1MiwgMHgwMDc4LCAweDJiYWQsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg4MWZmLCAweDAwNDAsIDB4MmRhMiwgMHgyMDA5LCAweDAwMDEsCisJMHgwMDc4LCAweDJkZDMsIDB4MjAyOSwgMHgwMGZmLCAweDY0NTAsIDB4MjQwMCwgMHhhNTA2LCAweDAwNDAsCisJMHgyZGNkLCAweDI1MDgsIDB4MTA3OCwgMHg0NWM0LCAweDAwYzAsIDB4MmRjZCwgMHgxMDc4LCAweDQ4MmYsCisJMHgwMGMwLCAweDJkYjgsIDB4MjAwOSwgMHgwMDAyLCAweDYyYWMsIDB4MjUxOCwgMHgwMDc4LCAweDJkZDMsCisJMHgyMDE5LCAweDAwMDQsIDB4MTA3OCwgMHg0N2QzLCAweDAwYzAsIDB4MmRjMiwgMHgyMDA5LCAweDAwMDYsCisJMHgwMDc4LCAweDJkZDMsIDB4NzgyNCwgMHhhMDhhLCAweDEwMDAsIDB4MDBjOCwgMHgyZGQ2LCAweDgwMDMsCisJMHg4MDBiLCAweDgxMGIsIDB4YTEwOCwgMHgxMDc4LCAweDVhNTIsIDB4ODUyOSwgMHgwMGM4LCAweDJkYTUsCisJMHgxMjdmLCAweDAwNzgsIDB4MmJhZCwgMHgxMjdmLCAweDAwNzgsIDB4MmJkNywgMHgxMjdmLCAweDAwNzgsCisJMHgyYmRiLCAweDEwNzgsIDB4MzVkMiwgMHgwMDQwLCAweDJiZGIsIDB4MTA3OCwgMHg0NmU3LCAweDEwNzgsCisJMHg0N2E0LCAweDAwNzgsIDB4MmJhZCwgMHg4MWZmLCAweDAwYzAsIDB4MmJkNywgMHgxMDc4LCAweDM1ZDIsCisJMHgwMDQwLCAweDJiZGIsIDB4MTA3OCwgMHg0NmQ2LCAweDEwNzgsIDB4NDdhNCwgMHgwMDc4LCAweDJiYWQsCisJMHg4MWZmLCAweDAwYzAsIDB4MmJkNywgMHgxMDc4LCAweDM1ZDIsIDB4MDA0MCwgMHgyYmRiLCAweDEwNzgsCisJMHg0Nzc1LCAweDAwNDAsIDB4MmJkNywgMHgxMDc4LCAweDQ0ODQsIDB4MTA3OCwgMHg0NzJmLCAweDEwNzgsCisJMHg0N2E0LCAweDAwNzgsIDB4MmJhZCwgMHgxMDc4LCAweDM1ZDIsIDB4MDA0MCwgMHgyYmRiLCAweDEwNzgsCisJMHg0NjczLCAweDAwNDAsIDB4MmJkNywgMHg2MmEwLCAweDIwMTksIDB4MDAwNSwgMHgwYzdlLCAweDEwNzgsCisJMHg0N2U5LCAweDBjN2YsIDB4MTA3OCwgMHg1ZjAxLCAweDA3N2UsIDB4MjAzOSwgMHgwMDAwLCAweDEwNzgsCisJMHg1ZTBhLCAweDIwMDksIDB4MDAwMCwgMHgxMDc4LCAweDlmOGIsIDB4MDc3ZiwgMHgxMDc4LCAweDQ3YTQsCisJMHgwMDc4LCAweDJiYWQsIDB4MTA3OCwgMHgzNWQyLCAweDAwNDAsIDB4MmJkYiwgMHgxMDc4LCAweDQ3YTQsCisJMHgyMjA4LCAweDAwNzgsIDB4MmJhZCwgMHgxNTdlLCAweDBkN2UsIDB4MGU3ZSwgMHgyMDY5LCAweGE3MTQsCisJMHg2ODEwLCAweDY5MTQsIDB4YTEwYSwgMHgwMGM4LCAweDJlMzcsIDB4MjAwOSwgMHgwMDAwLCAweDY4MTYsCisJMHgyMDExLCAweDAwMDAsIDB4MjAxOSwgMHgwMDAwLCAweDIwYTksIDB4MDBmZiwgMHgyMDY5LCAweGE3MzUsCisJMHgyZDA0LCAweGEwNzUsIDB4MDA0MCwgMHgyZTRjLCAweDcwNGMsIDB4MTA3OCwgMHgyZTU2LCAweGEyMTAsCisJMHg3MDgwLCAweDEwNzgsIDB4MmU1NiwgMHhhMzE4LCAweDhkNjgsIDB4MDBmMCwgMHgyZTQwLCAweDIzMDAsCisJMHhhMjE4LCAweDBlN2YsIDB4MGQ3ZiwgMHgxNTdmLCAweDAwNzgsIDB4MmJhZCwgMHgwZjdlLCAweDAxN2UsCisJMHhhMDdkLCAweDAwNDAsIDB4MmU2NSwgMHgyMDAxLCAweDAwMDAsIDB4ODAwMCwgMHgyZjBjLCAweDgxZmYsCisJMHgwMDQwLCAweDJlNjUsIDB4MjE3OCwgMHgwMDc4LCAweDJlNWQsIDB4MDE3ZiwgMHgwZjdmLCAweDAwN2MsCisJMHgyMDY5LCAweGE3MTQsIDB4NjkxMCwgMHg2MmE4LCAweDAwNzgsIDB4MmJhZCwgMHg4MWZmLCAweDAwYzAsCisJMHgyYmQ3LCAweDYxNTAsIDB4YTE5MCwgMHgyOWMwLCAweDIyMTQsIDB4YTI5NCwgMHgwMGZmLCAweDYwNzAsCisJMHhhMDg0LCAweGZmMDAsIDB4YTIxNSwgMHg2MzZjLCAweDY3Y2MsIDB4ZDc5YywgMHgwMDQwLCAweDJlODQsCisJMHgyMDMxLCAweDAwMDEsIDB4MDA3OCwgMHgyZTg2LCAweDIwMzEsIDB4MDAwMCwgMHg3ZTNhLCAweDdmM2UsCisJMHgwMDc4LCAweDJiYWQsIDB4NjE0MCwgMHg2MjQ0LCAweDIwMTksIDB4YThhMiwgMHgyMzFjLCAweDAwNzgsCisJMHgyYmFkLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYxMzQsIDB4NjMzOCwgMHhhMDA2LCAweDIwMTAsCisJMHgxMjdmLCAweDAwNzgsIDB4MmJhZCwgMHgxMDc4LCAweDM1ZTQsIDB4MDA0MCwgMHgyYmRiLCAweDYyNDQsCisJMHg2MzM4LCAweDAwNzgsIDB4MmJhZCwgMHg2MTQwLCAweDYyNDQsIDB4NzgyNCwgMHg2MDQyLCAweDdiMjgsCisJMHg2MzQ2LCAweDIwNjksIDB4YTY1MiwgMHg4MzFmLCAweGEzMDUsIDB4NjgxNiwgMHg3ODJjLCAweDIwNjksCisJMHhhOGEyLCAweDJkMWMsIDB4MjA2YSwgMHgwMDc4LCAweDJiYWQsIDB4MDE3ZSwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDc4MjQsIDB4NjAzNiwgMHhkMDk0LCAweDAwNDAsIDB4MmVjOCwgMHg3ODI4LCAweGEwODUsCisJMHgwMDAxLCAweDIwMDksIDB4YThhYiwgMHgyMDBhLCAweDIwMDEsIDB4ZmZmZiwgMHgxMDc4LCAweDVhZTYsCisJMHg3ODJjLCAweDYwM2EsIDB4MTI3ZiwgMHgwMTdmLCAweDAwNzgsIDB4MmJhZCwgMHgxMDc4LCAweDM1ZTQsCisJMHgwMDQwLCAweDJiZGIsIDB4NzgyOCwgMHhhMDBkLCAweDAwNDAsIDB4MmJkYiwgMHg3ODJjLCAweGEwMDUsCisJMHgwMDQwLCAweDJiZGIsIDB4NjI0NCwgMHg2MTQ2LCAweDYzMzgsIDB4NjAzYSwgMHgwMDc4LCAweDJiYWQsCisJMHgyMDAxLCAweGE2MDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHgyYmQ3LCAweDBjN2UsCisJMHgyMDYxLCAweDAxMDAsIDB4NzkyNCwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHhhMTk2LCAweDAwZmYsCisJMHgwMGMwLCAweDJlZjcsIDB4NjAzMCwgMHhhMDg1LCAweGZmMDAsIDB4MDA3OCwgMHgyZjA2LCAweGExODIsCisJMHgwMDdmLCAweDAwYzgsIDB4MmYzMCwgMHhhMTg4LCAweDI5YzAsIDB4MjEwYywgMHhhMThjLCAweDAwZmYsCisJMHg2MDMwLCAweGExMTYsIDB4MDA0MCwgMHgyZjMwLCAweDgxMGYsIDB4YTEwNSwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDAwN2UsIDB4MTA3OCwgMHg3NmM3LCAweDAwN2YsIDB4MDA0MCwgMHgyZjJjLCAweDYwMWEsCisJMHg2MDBiLCAweGJjMDksIDB4NjAxZiwgMHgwMDAxLCAweDEwNzgsIDB4MzViYSwgMHgwMDQwLCAweDJmMzMsCisJMHg2ODM3LCAweDAwMDAsIDB4NzAwNywgMHgwMDAzLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsCisJMHg2ODNhLCAweDcwMWIsIDB4MmY4ZSwgMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDMyLCAweDEwNzgsCisJMHg3NzVjLCAweDEyN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDEyN2YsIDB4MGM3ZiwgMHgwMDc4LCAweDJiZDcsCisJMHgwYzdmLCAweDAwNzgsIDB4MmJkYiwgMHgxMDc4LCAweDc3MmQsIDB4MDA3OCwgMHgyZjJjLCAweDIwMDEsCisJMHhhNjAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsIDB4MmJkNywgMHgwYzdlLCAweDIwNjEsCisJMHgwMTAwLCAweDc5MjQsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4YTE5NiwgMHgwMGZmLCAweDAwYzAsCisJMHgyZjRlLCAweDYwMzAsIDB4YTA4NSwgMHhmZjAwLCAweDAwNzgsIDB4MmY1ZCwgMHhhMTgyLCAweDAwN2YsCisJMHgwMGM4LCAweDJmODcsIDB4YTE4OCwgMHgyOWMwLCAweDIxMGMsIDB4YTE4YywgMHgwMGZmLCAweDYwMzAsCisJMHhhMTE2LCAweDAwNDAsIDB4MmY4NywgMHg4MTBmLCAweGExMDUsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHgwMDdlLCAweDEwNzgsIDB4NzZjNywgMHgwMDdmLCAweDAwNDAsIDB4MmY4MywgMHg2MDFhLCAweDYwMGIsCisJMHhiYzA1LCAweDYwMWYsIDB4MDAwMSwgMHgxMDc4LCAweDM1YmEsIDB4MDA0MCwgMHgyZjhhLCAweDY4MzcsCisJMHgwMDAwLCAweDcwMDcsIDB4MDAwMywgMHg2ODMzLCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLCAweDY4M2EsCisJMHg3MDFiLCAweDJmOGUsIDB4MmQwMCwgMHg2MDEyLCAweDIwMDksIDB4MDAzMiwgMHgxMDc4LCAweDc3NWMsCisJMHgxMjdmLCAweDBjN2YsIDB4MDA3YywgMHgxMjdmLCAweDBjN2YsIDB4MDA3OCwgMHgyYmQ3LCAweDBjN2YsCisJMHgwMDc4LCAweDJiZGIsIDB4MTA3OCwgMHg3NzJkLCAweDAwNzgsIDB4MmY4MywgMHg2ODMwLCAweGEwODYsCisJMHgwMTAwLCAweDAwNDAsIDB4MmJkNywgMHgwMDc4LCAweDJiYWQsIDB4MjA2MSwgMHhhOTMzLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4NjAwMCwgMHhkMDg0LCAweDAwNDAsIDB4MmZhNiwgMHg2MTA0LCAweDYyMDgsCisJMHgyMDE5LCAweGE2MTIsIDB4MjMxYywgMHgxMjdmLCAweDAwNzgsIDB4MmJhZCwgMHgxMjdmLCAweDAwNzgsCisJMHgyYmRiLCAweDgxZmYsIDB4MDBjMCwgMHgyYmQ3LCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYyNDgsCisJMHg2MDY0LCAweGEyMDIsIDB4MDA0OCwgMHgyZmJkLCAweGEwODUsIDB4MDAwMSwgMHgxMDc4LCAweDI1NmEsCisJMHgxMDc4LCAweDNjOWUsIDB4MTI3ZiwgMHgwMDc4LCAweDJiYWQsIDB4MTI3ZiwgMHgwMDc4LCAweDJiZGIsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMGE5LCAweDAwMTIsIDB4MjAwMSwgMHhhNjQwLCAweDIwYTAsCisJMHhhMDA2LCAweDQwYTQsIDB4MTI3ZiwgMHgwMDc4LCAweDJiYWQsIDB4N2QzOCwgMHg3YzNjLCAweDAwNzgsCisJMHgyYzVmLCAweDc4MjQsIDB4YTA5YywgMHgwMGZmLCAweGEzOWEsIDB4MDAwMywgMHgwMGM4LCAweDJiZDcsCisJMHg2MjUwLCAweGEwODQsIDB4ZmYwMCwgMHg4MDA3LCAweGEyMDYsIDB4MDBjMCwgMHgyZmU5LCAweDIwMDEsCisJMHhhNjQwLCAweDIwMDksIDB4MDAwYywgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDAwNzgsCisJMHgzNjA4LCAweDgxZmYsIDB4MDBjMCwgMHgyYmQ3LCAweDEwNzgsIDB4MzVlNCwgMHgwMDQwLCAweDJiZGIsCisJMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHgyYmQ3LCAweDBjN2UsCisJMHgxMDc4LCAweDM1YmEsIDB4MGM3ZiwgMHgwMDQwLCAweDJiZDcsIDB4NjgzNywgMHgwMDAwLCAweDY4MzgsCisJMHhjMGZkLCAweDY4M2EsIDB4MTA3OCwgMHg4ZTRhLCAweDAwNDAsIDB4MmJkNywgMHg3MDA3LCAweDAwMDMsCisJMHg3MDFiLCAweDMwMGIsIDB4MDA3YywgMHg2ODMwLCAweGEwODYsIDB4MDEwMCwgMHgwMDQwLCAweDJiZDcsCisJMHhhZDgwLCAweDAwMGUsIDB4MjAwOSwgMHgwMDBjLCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsCisJMHgwMDc4LCAweDM2MDgsIDB4MTA3OCwgMHgzNWJhLCAweDAwNDAsIDB4MmJkNywgMHgxMDc4LCAweDQyZGQsCisJMHgyMDA5LCAweDAwMWMsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgxMDc4LCAweDM2MDQsCisJMHg3MDFiLCAweDMwMmIsIDB4MDA3YywgMHhhZGU4LCAweDAwMGQsIDB4NjgwMCwgMHhhMDA1LCAweDAwNDAsCisJMHgyYmRiLCAweDY4MDQsIDB4ZDBhYywgMHgwMDQwLCAweDMwMzgsIDB4ZDBhNCwgMHgwMDQwLCAweDJiZGIsCisJMHhkMDk0LCAweDAwNDAsIDB4MzA0MywgMHgwYzdlLCAweDIwNjEsIDB4MDEwMCwgMHg2MTA0LCAweGExOGMsCisJMHhmZmRmLCAweDYxMDYsIDB4MGM3ZiwgMHhkMDhjLCAweDAwNDAsIDB4MzA0ZSwgMHgwYzdlLCAweDIwNjEsCisJMHgwMTAwLCAweDYxMDQsIDB4YTE4ZCwgMHgwMDEwLCAweDYxMDYsIDB4MGM3ZiwgMHgyMDA5LCAweDAxMDAsCisJMHgyMTBjLCAweGExOGEsIDB4MDAwMiwgMHgwMDQ4LCAweDMwNjMsIDB4ZDA4NCwgMHgwMDQwLCAweDMwNjMsCisJMHg2YTI4LCAweGEyOGEsIDB4MDA3ZiwgMHgwMGM4LCAweDJiZGIsIDB4YTI4OCwgMHgyOWMwLCAweDIxMGMsCisJMHhhMThjLCAweDAwZmYsIDB4NjE1NiwgMHhkMGRjLCAweDAwNDAsIDB4MzA2YywgMHg2ODI4LCAweGEwOGEsCisJMHgwMDdmLCAweDAwYzgsIDB4MmJkYiwgMHg2MDUyLCAweDY4MDgsIDB4YTA4YSwgMHgwMTAwLCAweDAwNDgsCisJMHgyYmRiLCAweGEwOGEsIDB4MDg0MSwgMHgwMGM4LCAweDJiZGIsIDB4YTA4NCwgMHgwMDA3LCAweDAwYzAsCisJMHgyYmRiLCAweDY4MGMsIDB4YTAwNSwgMHgwMDQwLCAweDJiZGIsIDB4NjgxMCwgMHhhMDA1LCAweDAwNDAsCisJMHgyYmRiLCAweDY4NDgsIDB4Njk0MCwgMHhhMTBhLCAweDAwYzgsIDB4MmJkYiwgMHg4MDAxLCAweDAwNDAsCisJMHgyYmRiLCAweDY4NGMsIDB4Njk0NCwgMHhhMTBhLCAweDAwYzgsIDB4MmJkYiwgMHg4MDAxLCAweDAwNDAsCisJMHgyYmRiLCAweDY4MDQsIDB4ZDBmYywgMHgwMDQwLCAweDMwYzIsIDB4MTA3OCwgMHgzNWJhLCAweDAwNDAsCisJMHgyYmQ3LCAweDIwMDksIDB4MDAxNCwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweGEyOTAsCisJMHgwMDM4LCAweGEzOTksIDB4MDAwMCwgMHgxMDc4LCAweDM2MDQsIDB4NzAxYiwgMHgzMGE4LCAweDAwN2MsCisJMHhhZGU4LCAweDAwMGQsIDB4MjBhOSwgMHgwMDE0LCAweDJkOTgsIDB4MjA2OSwgMHhhNjZlLCAweDJkYTAsCisJMHg1M2EzLCAweDcwMTAsIDB4YTBlOCwgMHgwMDBkLCAweDIwMDEsIDB4YTY3MiwgMHgyMDBjLCAweGQxZTQsCisJMHgwMDQwLCAweDMwYzIsIDB4MGM3ZSwgMHgyMDYxLCAweDAxMDAsIDB4NjAwNCwgMHhhMDg1LCAweDBiMDAsCisJMHg2MDA2LCAweDBjN2YsIDB4MjBhOSwgMHgwMDFjLCAweDJkOTgsIDB4MjA2OSwgMHhhNjUyLCAweDJkYTAsCisJMHg1M2EzLCAweDY4MTQsIDB4YTA4YywgMHgwMGZmLCAweDYxNDIsIDB4ODAwNywgMHhhMDg0LCAweDAwZmYsCisJMHg2MDQ2LCAweDEwNzgsIDB4NGVhZSwgMHgxMDc4LCAweDQ5Y2UsIDB4MTA3OCwgMHg0YTNlLCAweDYwMDAsCisJMHhhMDg2LCAweDAwMDAsIDB4MDBjMCwgMHgzMTRkLCAweDY4MDgsIDB4NjAyYSwgMHgxMDc4LCAweDIxZjcsCisJMHg2ODE4LCAweDY5MWMsIDB4NmEyMCwgMHg2YjI0LCAweDgwMDcsIDB4ODEwZiwgMHg4MjE3LCAweDgzMWYsCisJMHg2MDE2LCAweDYxMWEsIDB4NjIxZSwgMHg2MzIyLCAweDZjMDQsIDB4ZDRmNCwgMHgwMDQwLCAweDMwZmEsCisJMHg2ODMwLCAweDY5MzQsIDB4NmEzOCwgMHg2YjNjLCAweDgwMDcsIDB4ODEwZiwgMHg4MjE3LCAweDgzMWYsCisJMHgwMDc4LCAweDMwZmMsIDB4YTA4NCwgMHhmMGZmLCAweDYwMDYsIDB4NjEwYSwgMHg2MjBlLCAweDYzMTIsCisJMHgxMDc4LCAweDViMTksIDB4NjkwNCwgMHhkMWZjLCAweDAwNDAsIDB4MzEyZiwgMHgwYzdlLCAweDIwMDksCisJMHgwMDAwLCAweDIwYTksIDB4MDAwMSwgMHg2YjcwLCAweGQzODQsIDB4MDA0MCwgMHgzMTJjLCAweDAwNzgsCisJMHgzMTE2LCAweDgzOWQsIDB4MDBjOCwgMHgzMTJjLCAweDM1MDgsIDB4ODEwOSwgMHgxMDc4LCAweDU0ODAsCisJMHg2ODc4LCAweDYwMTYsIDB4Njg3NCwgMHgyMDA4LCAweGEwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDYwMGEsCisJMHhhMTg0LCAweDAwZmYsIDB4NjAwNiwgMHg4MTA4LCAweDAwYzAsIDB4MzEyYSwgMHg2MDAzLCAweDAwMDMsCisJMHgwMDc4LCAweDMxMmMsIDB4NjAwMywgMHgwMDAxLCAweDAwZjAsIDB4MzExMSwgMHgwYzdmLCAweDBjN2UsCisJMHgyMDYxLCAweDAxMDAsIDB4NjAyZiwgMHgwMDQwLCAweDYwMmYsIDB4MDAwMCwgMHgwYzdmLCAweDEwNzgsCisJMHgzODE5LCAweDAwNDAsIDB4MzEzZCwgMHgxMDc4LCAweDI1NmEsIDB4NjBjMCwgMHhhMDA1LCAweDAwNDAsCisJMHgzMTQ5LCAweDYwMDMsIDB4MDAwMSwgMHgyMDkxLCAweDMwMWQsIDB4MTA3OCwgMHg0MjI0LCAweDAwNzgsCisJMHgzMTRkLCAweDYwMDMsIDB4MDAwNCwgMHgyMDkxLCAweDMwMWQsIDB4MDA3OCwgMHgyYmFkLCAweDYwMDAsCisJMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwgMHgyYmQ3LCAweDIwNjksIDB4YTY1MiwgMHg3ODMwLCAweDY4NDIsCisJMHg3ODM0LCAweDY4NDYsIDB4NjgwNCwgMHhkMGZjLCAweDAwNDAsIDB4MzE2MiwgMHgyMDA5LCAweDAwMzAsCisJMHgwMDc4LCAweDMxNjQsIDB4MjAwOSwgMHgwMDFjLCAweDJkMDAsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsCisJMHg3ZDM4LCAweDAwNzgsIDB4MzYwOCwgMHhhMDA2LCAweDEwNzgsIDB4MjU2YSwgMHg4MWZmLCAweDAwYzAsCisJMHgyYmQ3LCAweDEwNzgsIDB4NDJkZCwgMHgxMDc4LCAweDQyMjQsIDB4MDA3OCwgMHgyYmFkLCAweDgxZmYsCisJMHgwMGMwLCAweDJiZDcsIDB4NjE4NCwgMHg4MWZmLCAweDAwNDAsIDB4MzE5MSwgMHg3MDNmLCAweDAwMDAsCisJMHgyMDAxLCAweGFjYzAsIDB4MjAwOSwgMHgwMDQwLCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDM2MDgsIDB4NzAxYiwgMHgyYmFhLCAweDEyN2YsCisJMHgwMDdjLCAweDcwM2YsIDB4MDAwMSwgMHgwZDdlLCAweDIwNjksIDB4YWNjMCwgMHgyMGE5LCAweDAwNDAsCisJMHgyMGExLCAweGFjYzAsIDB4MjAxOSwgMHhmZmZmLCAweDQzYTQsIDB4NjU1MCwgMHhhNTg4LCAweDI5YzAsCisJMHgyMTBjLCAweGExOGMsIDB4MDBmZiwgMHgyMTZhLCAweGEwMGUsIDB4MjAxMSwgMHgwMDAyLCAweDIxMDAsCisJMHhhNTA2LCAweDAwNDAsIDB4MzFjMywgMHgxMDc4LCAweDQ1YzQsIDB4MDBjMCwgMHgzMWMzLCAweDYwMTQsCisJMHg4MjFjLCAweDAwNDgsIDB4MzFiYiwgMHhhMzk4LCAweGFjYzAsIDB4YTA4NSwgMHhmZjAwLCAweDgwMDcsCisJMHgyMDFhLCAweDAwNzgsIDB4MzFjMiwgMHhhMzk4LCAweGFjYzAsIDB4MjMyNCwgMHhhNGE0LCAweGZmMDAsCisJMHhhNDA1LCAweDIwMWEsIDB4ODIxMCwgMHg4MTA4LCAweGExODIsIDB4MDA4MCwgMHgwMGM4LCAweDMxY2EsCisJMHgwMDc4LCAweDMxYTcsIDB4ODIwMSwgMHg4MDA3LCAweDJkMGMsIDB4YTEwNSwgMHgyMDZhLCAweDBkN2YsCisJMHgyMGE5LCAweDAwNDAsIDB4MjBhMSwgMHhhY2MwLCAweDIwOTksIDB4YWNjMCwgMHgxMDc4LCAweDQyODEsCisJMHgwMDc4LCAweDMxODAsIDB4MTA3OCwgMHgzNWU0LCAweDAwNDAsIDB4MmJkYiwgMHgwYzdlLCAweDEwNzgsCisJMHgzNWJhLCAweDBjN2YsIDB4MDBjMCwgMHgzMWU4LCAweDIwMDksIDB4MDAwMiwgMHgwMDc4LCAweDJiZDcsCisJMHgyMDAxLCAweGE2NTMsIDB4MjAwNCwgMHhkMGI0LCAweDAwNDAsIDB4MzIwZiwgMHg2MDAwLCAweGQwOGMsCisJMHgwMGMwLCAweDMyMGYsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsCisJMHgzMjBmLCAweDY4MzcsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHgxMDc4LCAweDhlOWUsCisJMHgwMGMwLCAweDMyMDYsIDB4MjAwOSwgMHgwMDAzLCAweDAwNzgsIDB4MmJkNywgMHg3MDA3LCAweDAwMDMsCisJMHg3MDFiLCAweDMyMGIsIDB4MDA3YywgMHgxMDc4LCAweDM1ZTQsIDB4MDA0MCwgMHgyYmRiLCAweDIwYTksCisJMHgwMDJiLCAweDJjOTgsIDB4YWRlOCwgMHgwMDAyLCAweDJkYTAsIDB4NTNhMywgMHgyMGE5LCAweDAwMDQsCisJMHhhYzgwLCAweDAwMDYsIDB4MjA5OCwgMHhhZDgwLCAweDAwMDYsIDB4MjBhMCwgMHgxMDc4LCAweDQyODEsCisJMHgyMGE5LCAweDAwMDQsIDB4YWM4MCwgMHgwMDBhLCAweDIwOTgsIDB4YWQ4MCwgMHgwMDBhLCAweDIwYTAsCisJMHgxMDc4LCAweDQyODEsIDB4MmQwMCwgMHgyMDA5LCAweDAwMmIsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsCisJMHg3ZDM4LCAweDAwNzgsIDB4MzYwOCwgMHg4MWZmLCAweDAwYzAsIDB4MmJkNywgMHgxMDc4LCAweDM1ZDIsCisJMHgwMDQwLCAweDJiZGIsIDB4MTA3OCwgMHg0N2JkLCAweDAwNzgsIDB4MmJhZCwgMHg4MWZmLCAweDAwYzAsCisJMHgyYmQ3LCAweDc4MjgsIDB4YTA4YSwgMHgxMDAwLCAweDAwYzgsIDB4MmJkYiwgMHgxMDc4LCAweDM1ZTQsCisJMHgwMDQwLCAweDJiZGIsIDB4MTA3OCwgMHg0ODJmLCAweDAwNDAsIDB4MmJkNywgMHgyMDE5LCAweDAwMDQsCisJMHgxMDc4LCAweDQ3ZDMsIDB4NzkyNCwgMHg4MTBmLCAweDdhMjgsIDB4MTA3OCwgMHgzMjU5LCAweDAwNzgsCisJMHgyYmFkLCAweGExODYsIDB4MDBmZiwgMHgwMDQwLCAweDMyNjEsIDB4MTA3OCwgMHgzMjcxLCAweDAwNzgsCisJMHgzMjcwLCAweDIwMjksIDB4MDA3ZSwgMHgyMDYxLCAweGE2MDAsIDB4NjQ1MCwgMHgyNDAwLCAweGE1MDYsCisJMHgwMDQwLCAweDMyNmQsIDB4MjUwOCwgMHgxMDc4LCAweDMyNzEsIDB4ODUyOSwgMHgwMGM4LCAweDMyNjYsCisJMHgwMDdjLCAweDEwNzgsIDB4NDVjNCwgMHgwMGMwLCAweDMyN2MsIDB4MjIwMCwgMHg4MDAzLCAweDgwMGIsCisJMHg4MTBiLCAweGExMDgsIDB4MTA3OCwgMHg1YTUyLCAweDAwN2MsIDB4ODFmZiwgMHgwMGMwLCAweDJiZDcsCisJMHgxMDc4LCAweDM1ZDIsIDB4MDA0MCwgMHgyYmRiLCAweDEwNzgsIDB4NDY3MywgMHgwMDQwLCAweDJiZDcsCisJMHgxMDc4LCAweDQ3YzgsIDB4MDA3OCwgMHgyYmFkLCAweDgxZmYsIDB4MDBjMCwgMHgyYmQ3LCAweDEwNzgsCisJMHgzNWQyLCAweDAwNDAsIDB4MmJkYiwgMHgxMDc4LCAweDQ2NzMsIDB4MDA0MCwgMHgyYmQ3LCAweDEwNzgsCisJMHg0N2IyLCAweDAwNzgsIDB4MmJhZCwgMHg2MTAwLCAweDAwNzgsIDB4MmJhZCwgMHgxMDc4LCAweDM1ZTQsCisJMHgwMDQwLCAweDJiZGIsIDB4MjAwMSwgMHhhNjAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsCisJMHgyYmQ3LCAweDBkN2UsIDB4YWNlOCwgMHgwMDBhLCAweDc5MjQsIDB4ZDE4NCwgMHgwMDQwLCAweDMyYjIsCisJMHhhY2U4LCAweDAwMDYsIDB4NjgwYywgMHg4MDA3LCAweDc4M2UsIDB4NjgwOCwgMHg4MDA3LCAweDc4M2EsCisJMHg2YjA0LCAweDgzMWYsIDB4NmEwMCwgMHg4MjE3LCAweDBkN2YsIDB4NjEwMCwgMHhhMThjLCAweDAyMDAsCisJMHgwMDc4LCAweDJiYWQsIDB4YTAwNiwgMHgxMDc4LCAweDI1NmEsIDB4NzgyNCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDg2LCAweDAwZmYsIDB4MDA0MCwgMHgzMmNmLCAweDgxZmYsIDB4MDBjMCwgMHgyYmQ3LCAweDEwNzgsCisJMHg0MmRkLCAweDc4MjgsIDB4YTA4YSwgMHgxMDAwLCAweDAwYzgsIDB4MmJkYiwgMHg3OTI0LCAweGExOGMsCisJMHhmZjAwLCAweDgxMGYsIDB4YTE4NiwgMHgwMGZmLCAweDAwNDAsIDB4MzJlNSwgMHhhMTgyLCAweDAwN2YsCisJMHgwMGM4LCAweDJiZGIsIDB4MjEwMCwgMHgxMDc4LCAweDI1NjQsIDB4MDI3ZSwgMHgwYzdlLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MjA2MSwgMHhhOGM0LCAweDYwMWIsIDB4MDAwMCwgMHg2MDFmLCAweDAwMDAsCisJMHgyMDExLCAweDAwMDMsIDB4MTA3OCwgMHg3MGUwLCAweDIwMTEsIDB4MDAwMiwgMHgxMDc4LCAweDcwZWEsCisJMHgxMDc4LCAweDZmYzQsIDB4MDM3ZSwgMHgyMDE5LCAweDAwMDAsIDB4MTA3OCwgMHg3MDU4LCAweDAzN2YsCisJMHgyMDYxLCAweDAxMDAsIDB4NjAzMCwgMHhhMDg0LCAweDAwZmYsIDB4ODEwZiwgMHhhMTA1LCAweDYwNGEsCisJMHg2MDQzLCAweDAwOTAsIDB4NjA0MywgMHgwMDEwLCAweDIwMDksIDB4MDAyZCwgMHgyMDExLCAweDQyNTksCisJMHgxMDc4LCAweDVhZGQsIDB4NzkyNCwgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHg3YTI4LCAweDEwNzgsCisJMHgzMjU5LCAweDEyN2YsIDB4MGM3ZiwgMHgwMjdmLCAweDAwNzgsIDB4MmJhZCwgMHg3OTI0LCAweGExOGMsCisJMHhmZjAwLCAweDgxMGYsIDB4MGM3ZSwgMHgxMDc4LCAweDQ1NWMsIDB4MmMwOCwgMHgwYzdmLCAweDAwYzAsCisJMHgyYmRiLCAweDAwNzgsIDB4MmJhZCwgMHg4MWZmLCAweDAwNDAsIDB4MzMzMiwgMHgyMDA5LCAweDAwMDEsCisJMHgwMDc4LCAweDJiZDcsIDB4NjBjYywgMHhkMDljLCAweDAwYzAsIDB4MzMzYSwgMHgyMDA5LCAweDAwMDUsCisJMHgwMDc4LCAweDJiZDcsIDB4MTA3OCwgMHgzNWJhLCAweDAwYzAsIDB4MzM0MiwgMHgyMDA5LCAweDAwMDIsCisJMHgwMDc4LCAweDJiZDcsIDB4NzkyNCwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDEwNzgsCisJMHgzNjA0LCAweDcwMWIsIDB4MzM0YywgMHgwMDdjLCAweDIwMDksIDB4MDA4MCwgMHgxMDc4LCAweDQ1YzQsCisJMHgwMGMwLCAweDMzNTksIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDAwNDAsCisJMHgzMzVkLCAweDIwMjEsIDB4NDAwYSwgMHgwMDc4LCAweDJiYWYsIDB4MGQ3ZSwgMHhhZGU4LCAweDAwMGQsCisJMHg2OTAwLCAweDZhMDgsIDB4NmIwYywgMHg2YzEwLCAweDZkMTQsIDB4NmUxOCwgMHg2ODIwLCAweGEwYmUsCisJMHgwMTAwLCAweDAwNDAsIDB4MzNkMCwgMHhhMGJlLCAweDAxMTIsIDB4MDA0MCwgMHgzM2QwLCAweGEwYmUsCisJMHgwMTEzLCAweDAwNDAsIDB4MzNkMCwgMHhhMGJlLCAweDAxMTQsIDB4MDA0MCwgMHgzM2QwLCAweGEwYmUsCisJMHgwMTE3LCAweDAwNDAsIDB4MzNkMCwgMHhhMGJlLCAweDAxMWEsIDB4MDA0MCwgMHgzM2QwLCAweGEwYmUsCisJMHgwMTIxLCAweDAwNDAsIDB4MzNjNiwgMHhhMGJlLCAweDAxMzEsIDB4MDA0MCwgMHgzM2M2LCAweGEwYmUsCisJMHgwMTcxLCAweDAwNDAsIDB4MzNkMCwgMHhhMGJlLCAweDAxNzMsIDB4MDA0MCwgMHgzM2QwLCAweGEwYmUsCisJMHgwMWExLCAweDAwYzAsIDB4MzM5OCwgMHg2ODMwLCAweDgwMDcsIDB4NjgzMiwgMHgwMDc4LCAweDMzZDYsCisJMHhhMGJlLCAweDAyMTIsIDB4MDA0MCwgMHgzM2NjLCAweGEwYmUsIDB4MDIxMywgMHgwMDQwLCAweDMzY2MsCisJMHhhMGJlLCAweDAyMTQsIDB4MDA0MCwgMHgzM2JlLCAweGEwYmUsIDB4MDIxNywgMHgwMDQwLCAweDMzYjgsCisJMHhhMGJlLCAweDAyMWEsIDB4MDBjMCwgMHgzM2IxLCAweDY4MzgsIDB4ODAwNywgMHg2ODNhLCAweDAwNzgsCisJMHgzM2QwLCAweGEwYmUsIDB4MDMwMCwgMHgwMDQwLCAweDMzZDAsIDB4MGQ3ZiwgMHgwMDc4LCAweDJiZGIsCisJMHhhZDgwLCAweDAwMTAsIDB4MjBhOSwgMHgwMDA3LCAweDEwNzgsIDB4MzQxOCwgMHhhZDgwLCAweDAwMGUsCisJMHgyMGE5LCAweDAwMDEsIDB4MTA3OCwgMHgzNDE4LCAweDAwNzgsIDB4MzNkMCwgMHhhZDgwLCAweDAwMGMsCisJMHgxMDc4LCAweDM0MjYsIDB4MDA3OCwgMHgzM2Q2LCAweGFkODAsIDB4MDAwZSwgMHgxMDc4LCAweDM0MjYsCisJMHhhZDgwLCAweDAwMGMsIDB4MjBhOSwgMHgwMDAxLCAweDEwNzgsIDB4MzQxOCwgMHgwYzdlLCAweDEwNzgsCisJMHgzNWJhLCAweDAwNDAsIDB4MzQwOSwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHg2ODM3LCAweDAxMTksCisJMHg2ODUzLCAweDAwMDAsIDB4Njg0ZiwgMHgwMDIwLCAweDY4NWIsIDB4MDAwMSwgMHg4MTBiLCAweDY5N2UsCisJMHg2ODgzLCAweDAwMDAsIDB4NmE4NiwgMHg2YjhhLCAweDZjOGUsIDB4NmQ5MiwgMHg2OTk2LCAweDY4OWIsCisJMHgwMDAwLCAweDBjN2YsIDB4MGQ3ZiwgMHg2ODM3LCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLCAweDY4M2EsCisJMHg2ODIzLCAweDAwMDAsIDB4NjgwNCwgMHgyMDY4LCAweDEwNzgsIDB4OGU2NiwgMHgwMGMwLCAweDM0MDQsCisJMHgyMDA5LCAweDAwMDMsIDB4MDA3OCwgMHgyYmQ3LCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDM0MGYsCisJMHgwMDdjLCAweDBjN2YsIDB4MGQ3ZiwgMHgyMDA5LCAweDAwMDIsIDB4MDA3OCwgMHgyYmQ3LCAweDY4MjAsCisJMHhhMDg2LCAweDgwMDEsIDB4MDBjMCwgMHgyYmFkLCAweDIwMDksIDB4MDAwNCwgMHgwMDc4LCAweDJiZDcsCisJMHgwMTdlLCAweDIwMDgsIDB4MjA0NCwgMHg4MDAwLCAweDIwNGMsIDB4ODAwMCwgMHgyOTBhLCAweDgxMDgsCisJMHgyODBhLCAweDgxMDgsIDB4MDBmMCwgMHgzNDFhLCAweDAxN2YsIDB4MDA3YywgMHgwMTdlLCAweDBhN2UsCisJMHgwYjdlLCAweDIwMDgsIDB4MjA0NCwgMHg4MDAwLCAweDIwNGMsIDB4ODAwMCwgMHgyMDU0LCAweDgwMDAsCisJMHgyMDVjLCAweDJiMGEsIDB4ODEwOCwgMHgyYTBhLCAweDgxMDgsIDB4MjkwYSwgMHg4MTA4LCAweDI4MGEsCisJMHgwYjdmLCAweDBhN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDgxZmYsIDB4MDA0MCwgMHgzNDQzLCAweDIwMDksCisJMHgwMDAxLCAweDAwNzgsIDB4MmJkNywgMHg2MGNjLCAweGQwOWMsIDB4MDBjMCwgMHgzNDRiLCAweDIwMDksCisJMHgwMDA1LCAweDAwNzgsIDB4MmJkNywgMHg3OTI0LCAweDIxNDAsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsCisJMHhhMTgyLCAweDAwODAsIDB4MDA0OCwgMHgyYmRiLCAweGExODIsIDB4MDBmZiwgMHgwMGM4LCAweDJiZGIsCisJMHg3YTJjLCAweDdiMjgsIDB4NjA2YywgMHhhMzA2LCAweDAwYzAsIDB4MzQ2NiwgMHg2MDcwLCAweGEyNGUsCisJMHgwMDQwLCAweDJiZGIsIDB4YTljYywgMHhmZjAwLCAweDAwNDAsIDB4MmJkYiwgMHgwYzdlLCAweDEwNzgsCisJMHgzNTBmLCAweDJjNjgsIDB4MGM3ZiwgMHgwMDQwLCAweDM0OWUsIDB4YTBjNiwgMHg0MDAwLCAweDAwYzAsCisJMHgzNDg0LCAweDBjN2UsIDB4MDA3ZSwgMHgyZDYwLCAweDIwMDksIDB4MDAwMCwgMHgxMDc4LCAweDQ4OWIsCisJMHgwMGMwLCAweDM0N2IsIDB4YzE4NSwgMHg2MDAwLCAweGQwYmMsIDB4MDA0MCwgMHgzNDgwLCAweGMxOGQsCisJMHgwMDdmLCAweDBjN2YsIDB4MDA3OCwgMHgzNDliLCAweGEwYzYsIDB4NDAwNywgMHgwMGMwLCAweDM0OGIsCisJMHgyNDA4LCAweDAwNzgsIDB4MzQ5YiwgMHhhMGM2LCAweDQwMDgsIDB4MDBjMCwgMHgzNDkzLCAweDI3MDgsCisJMHgyNjEwLCAweDAwNzgsIDB4MzQ5YiwgMHhhMGM2LCAweDQwMDksIDB4MDBjMCwgMHgzNDk5LCAweDAwNzgsCisJMHgzNDliLCAweDIwMDEsIDB4NDAwNiwgMHgyMDIwLCAweDAwNzgsIDB4MmJhZiwgMHgyZDAwLCAweDcwMjIsCisJMHgwMTdlLCAweDBiN2UsIDB4MGM3ZSwgMHgwZTdlLCAweDJjNzAsIDB4MTA3OCwgMHg3NmM3LCAweDAwNDAsCisJMHgzNGU0LCAweDJkMDAsIDB4NjAxYSwgMHgyMDAxLCAweGE2NTcsIDB4MjAwNCwgMHhhMDg0LCAweDAwZmYsCisJMHg2ODQyLCAweDJlNTgsIDB4MGU3ZiwgMHgwZTdlLCAweDBjN2UsIDB4MTA3OCwgMHgzNWJhLCAweDBjN2YsCisJMHgyYjcwLCAweDAwYzAsIDB4MzRjNSwgMHgxMDc4LCAweDc3MmQsIDB4MGU3ZiwgMHgwYzdmLCAweDBiN2YsCisJMHgwMTdmLCAweDIwMDksIDB4MDAwMiwgMHgwMDc4LCAweDJiZDcsIDB4NjgzNywgMHgwMDAwLCAweDJkMDAsCisJMHg2MDEyLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDEwNzgsIDB4Mjg4MCwgMHgxMjdmLCAweDYwMWYsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDAsCisJMHgxMDc4LCAweDQ0ZWUsIDB4MjAwMSwgMHgwMDAyLCAweDEwNzgsIDB4NDUwMiwgMHgyMDA5LCAweDAwMDIsCisJMHgxMDc4LCAweDc3NWMsIDB4YTA4NSwgMHgwMDAxLCAweDBlN2YsIDB4MGM3ZiwgMHgwYjdmLCAweDAxN2YsCisJMHgwMGMwLCAweDM0ZWUsIDB4MjAwOSwgMHgwMDAzLCAweDAwNzgsIDB4MmJkNywgMHg3MDA3LCAweDAwMDMsCisJMHg3MDFiLCAweDM0ZjMsIDB4MDA3YywgMHg2ODMwLCAweGEwODYsIDB4MDEwMCwgMHg3MDIwLCAweDIwNjAsCisJMHgwMGMwLCAweDM1MDEsIDB4MjAwOSwgMHgwMDA0LCAweDYyMDQsIDB4YTI5NCwgMHgwMGZmLCAweDAwNzgsCisJMHgyYmQ3LCAweDIwMDksIDB4MDAwMCwgMHgxMDc4LCAweDQ4OWIsIDB4MDBjMCwgMHgzNTA4LCAweGMxODUsCisJMHg2MDAwLCAweGQwYmMsIDB4MDA0MCwgMHgzNTBkLCAweGMxOGQsIDB4MDA3OCwgMHgyYmFkLCAweDBlN2UsCisJMHgwZDdlLCAweDIwMjksIDB4MDAwMCwgMHgyMDIxLCAweDAwODAsIDB4MjBhOSwgMHgwMDdmLCAweDIwNzEsCisJMHhhN2I1LCAweDJlMDQsIDB4YTAwNSwgMHgwMGMwLCAweDM1MjQsIDB4MjEwMCwgMHhhNDA2LCAweDAwYzAsCisJMHgzNTU1LCAweDI0MjgsIDB4MDA3OCwgMHgzNTU1LCAweDIwNjgsIDB4NmYxMCwgMHgyNzAwLCAweGEzMDYsCisJMHgwMGMwLCAweDM1NDYsIDB4NmUxNCwgMHgyNjAwLCAweGEyMDYsIDB4MDBjMCwgMHgzNTQ2LCAweDI0MDAsCisJMHhhMTA2LCAweDAwYzAsIDB4MzU0MiwgMHgyZDYwLCAweGQ4ODQsIDB4MDA0MCwgMHgzNTZhLCAweDYwMDQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4MzU2YSwgMHgyMDAxLCAweDQwMDAsCisJMHgwMDc4LCAweDM1NmIsIDB4MjAwMSwgMHg0MDA3LCAweDAwNzgsIDB4MzU2YiwgMHgyNDAwLCAweGExMDYsCisJMHgwMGMwLCAweDM1NTUsIDB4NmUxNCwgMHg4N2ZmLCAweDAwYzAsIDB4MzU1MSwgMHg4NmZmLCAweDAwNDAsCisJMHgzNTIxLCAweDIwMDEsIDB4NDAwOCwgMHgwMDc4LCAweDM1NmIsIDB4ODQyMCwgMHg4ZTcwLCAweDAwZjAsCisJMHgzNTE5LCAweDg1ZmYsIDB4MDBjMCwgMHgzNTY0LCAweDIwMDEsIDB4NDAwOSwgMHgwMDc4LCAweDM1NmIsCisJMHgyMDAxLCAweDAwMDEsIDB4MDA3OCwgMHgzNTZiLCAweDEwNzgsIDB4NDU1YywgMHgwMGMwLCAweDM1NjAsCisJMHg2MzEyLCAweDYyMTYsIDB4YTAwNiwgMHhhMDA1LCAweDBkN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDgxZmYsCisJMHgwMGMwLCAweDJiZDcsIDB4MTA3OCwgMHgzNWJhLCAweDAwNDAsIDB4MmJkNywgMHg2ODM3LCAweDAwMDAsCisJMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHg3ODI0LCAweGEwMDUsIDB4MDA0MCwgMHgyYmRiLCAweGEwOTYsCisJMHgwMGZmLCAweDAwNDAsIDB4MzU4NywgMHhhMDkyLCAweDAwMDQsIDB4MDBjOCwgMHgyYmRiLCAweDIwMTAsCisJMHgyZDE4LCAweDEwNzgsIDB4MjgyZiwgMHgwMDQwLCAweDJiZDcsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsCisJMHgzNTkyLCAweDAwN2MsIDB4NjgzMCwgMHhhMDg2LCAweDAxMDAsIDB4MDA0MCwgMHgyYmQ3LCAweDAwNzgsCisJMHgyYmFkLCAweDc5MjQsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE4MiwgMHgwMDgwLCAweDAwNDgsCisJMHgyYmRiLCAweGExODIsIDB4MDBmZiwgMHgwMGM4LCAweDJiZGIsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHgxMDc4LCAweDhkNGIsIDB4MDBjMCwgMHgzNWI3LCAweGExOTAsIDB4YTczNSwgMHgyMjA0LCAweGEwNjUsCisJMHgwMDQwLCAweDM1YjcsIDB4MTA3OCwgMHg0MmY4LCAweDEyN2YsIDB4MDA3OCwgMHgyYmFkLCAweDEyN2YsCisJMHgwMDc4LCAweDJiZDcsIDB4MTA3OCwgMHgxMzhiLCAweDAwNDAsIDB4MzVkMSwgMHhhMDA2LCAweDY4MDIsCisJMHg3MDEwLCAweGEwMDUsIDB4MDBjMCwgMHgzNWM5LCAweDJkMDAsIDB4NzAxMiwgMHg3MDE2LCAweDAwNzgsCisJMHgzNWNmLCAweDcwMTQsIDB4NjgwMiwgMHgyMDYwLCAweDJkMDAsIDB4NjAwNiwgMHg3MDE2LCAweGFkODAsCisJMHgwMDBkLCAweDAwN2MsIDB4NzkyNCwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHgxMDc4LCAweDQ1YzQsCisJMHgwMGMwLCAweDM1ZTEsIDB4N2UyOCwgMHhhNjg0LCAweDNmZmYsIDB4YTA4MiwgMHg0MDAwLCAweDAwNDgsCisJMHgzNWUyLCAweGEwNjYsIDB4OGNmZiwgMHgwMDdjLCAweDdlMjQsIDB4ODYwZiwgMHhhMThjLCAweDAwZmYsCisJMHgxMDc4LCAweDQ1YzQsIDB4MDBjMCwgMHgzNWYyLCAweGE2YjQsIDB4MDBmZiwgMHhhNjgyLCAweDQwMDAsCisJMHgwMDQ4LCAweDM1ZjMsIDB4YTA2NiwgMHg4Y2ZmLCAweDAwN2MsIDB4MDE3ZSwgMHg3MTEwLCAweDgxZmYsCisJMHgwMDQwLCAweDM2MDAsIDB4MjE2OCwgMHg2OTA0LCAweDEwNzgsIDB4MTNhNCwgMHgwMDc4LCAweDM1ZjcsCisJMHg3MTEyLCAweDcxMTYsIDB4MDE3ZiwgMHgwMDdjLCAweDIwMzEsIDB4MDAwMSwgMHgwMDc4LCAweDM2MGEsCisJMHgyMDMxLCAweDAwMDAsIDB4MjA2MSwgMHhhNmQyLCAweDY2MDYsIDB4NjExMiwgMHg2MDBlLCAweDYyMjYsCisJMHg2MzJhLCAweDY0MmUsIDB4NjUzMiwgMHgyYzEwLCAweDEwNzgsIDB4MTNkYiwgMHg3MDA3LCAweDAwMDIsCisJMHg3MDFiLCAweDJiYWQsIDB4MDA3YywgMHgwZjdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzksCisJMHgwMDAwLCAweDIwMDEsIDB4YTY5MCwgMHgyMDA0LCAweGEwMDUsIDB4MDBjMCwgMHgzNjM2LCAweDAwNjgsCisJMHgzNjM2LCAweDc4MTgsIDB4ZDA4NCwgMHgwMGMwLCAweDM2MzYsIDB4N2EyMiwgMHg3YjI2LCAweDdjMmEsCisJMHg3ODFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDAwNzgsIDB4MzY1YiwgMHgwMTdlLCAweDBjN2UsCisJMHgwZTdlLCAweDIwNzEsIDB4YTY4MiwgMHg3MTM4LCAweGExODIsIDB4MDAwOCwgMHgwMDQ4LCAweDM2NDQsCisJMHg3MDMwLCAweDIwNjAsIDB4MDA3OCwgMHgzNjU1LCAweDcwMzAsIDB4YTBlMCwgMHgwMDA4LCAweGFjODIsCisJMHhhNmQyLCAweDAwNDgsIDB4MzY0ZCwgMHgyMDYxLCAweGE2OTIsIDB4MmMwMCwgMHg3MDMyLCAweDgxZmYsCisJMHgwMGMwLCAweDM2NTMsIDB4NzAzNiwgMHg4MTA4LCAweDcxM2EsIDB4MjI2MiwgMHg2MzA2LCAweDY0MGEsCisJMHgwZTdmLCAweDBjN2YsIDB4MDE3ZiwgMHgxMjdmLCAweDBmN2YsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsCisJMHhhNjgyLCAweDcwMzgsIDB4YTAwNSwgMHgwMDQwLCAweDM2OTcsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHgwMDY4LCAweDM2OTYsIDB4MGY3ZSwgMHgyMDc5LCAweDAwMDAsIDB4NzgxOCwgMHhkMDg0LCAweDAwYzAsCisJMHgzNjk1LCAweDBjN2UsIDB4NzAzNCwgMHgyMDYwLCAweDJjMDQsIDB4NzgyMiwgMHg2MDA0LCAweDc4MjYsCisJMHg2MDA4LCAweDc4MmEsIDB4NzgxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHg3MDM4LCAweDgwMDEsCisJMHg3MDNhLCAweGEwMDUsIDB4MDBjMCwgMHgzNjhiLCAweDcwMzMsIDB4YTY5MiwgMHg3MDM3LCAweGE2OTIsCisJMHgwYzdmLCAweDAwNzgsIDB4MzY5NSwgMHhhYzgwLCAweDAwMDgsIDB4YTBmYSwgMHhhNmQyLCAweDAwNDgsCisJMHgzNjkzLCAweDIwMDEsIDB4YTY5MiwgMHg3MDM2LCAweDBjN2YsIDB4MGY3ZiwgMHgxMjdmLCAweDBlN2YsCisJMHgwMDdjLCAweDAyN2UsIDB4MjAwMSwgMHhhNjUzLCAweDIwMDQsIDB4ZDBjNCwgMHgwMDQwLCAweDM2YTQsCisJMHgyMDExLCAweDgwMTQsIDB4MTA3OCwgMHgzNjFiLCAweDAyN2YsIDB4MDA3YywgMHg4MWZmLCAweDAwYzAsCisJMHgyYmQ3LCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYwMzAsIDB4YzA4ZCwgMHhjMDg1LCAweGMwYWMsCisJMHg2MDMyLCAweDEwNzgsIDB4NDIyNCwgMHgxMjdmLCAweDAwNzgsIDB4MmJhZCwgMHg4MWZmLCAweDAwYzAsCisJMHgyYmQ3LCAweDYwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsIDB4MmJkNywgMHgyMDAxLCAweGE2NTMsCisJMHgyMDA0LCAweGQwYWMsIDB4MDBjMCwgMHgyYmQ3LCAweDEwNzgsIDB4MzVlNCwgMHgwMDQwLCAweDJiZGIsCisJMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHgzNmQzLCAweDc4MjgsCisJMHhhMDA1LCAweDAwNDAsIDB4MmJhZCwgMHgwYzdlLCAweDEwNzgsIDB4MzViYSwgMHgwYzdmLCAweDAwNDAsCisJMHgyYmQ3LCAweDY4MzcsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLCAweDY4M2EsCisJMHgxMDc4LCAweDhmMTIsIDB4MDA0MCwgMHgyYmQ3LCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDM2ZTksCisJMHgwMDdjLCAweDY4MzAsIDB4YTA4NiwgMHgwMTAwLCAweDAwNDAsIDB4MmJkNywgMHgwMDc4LCAweDJiYWQsCisJMHgyMDAxLCAweGE2MDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHgyYmQ3LCAweDdmMjQsCisJMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDEwNzgsIDB4MzViYSwgMHgwMDQwLCAweDJiZDcsCisJMHgyMDA5LCAweDAwMDAsIDB4MjAzMSwgMHgwMDAwLCAweDcwMjMsIDB4MDAwMCwgMHg3MDJmLCAweDAwMDAsCisJMHhhZDgwLCAweDAwMDUsIDB4NzAyNiwgMHgyMGEwLCAweDEwNzgsIDB4NDVjNCwgMHgwMGMwLCAweDM3NmQsCisJMHg2MDA0LCAweGEwYzQsIDB4MDBmZiwgMHhhOGM2LCAweDAwMDYsIDB4MDA0MCwgMHgzNzFkLCAweGEwYzQsCisJMHhmZjAwLCAweGE4YzYsIDB4MDYwMCwgMHgwMGMwLCAweDM3NmQsIDB4MjAwMSwgMHhhNjUzLCAweDIwMDQsCisJMHhkMGFjLCAweDAwYzAsIDB4MzcyYSwgMHgxMDc4LCAweDQ4OWIsIDB4MDBjMCwgMHgzNzJhLCAweGQ3OWMsCisJMHgwMDQwLCAweDM3NmQsIDB4ZDc5NCwgMHgwMGMwLCAweDM3MzAsIDB4ZDc4NCwgMHgwMDQwLCAweDM3M2MsCisJMHhhYzgwLCAweDAwMDYsIDB4MjA5OCwgMHgzNDAwLCAweDIwYTksIDB4MDAwNCwgMHg1M2EzLCAweDEwNzgsCisJMHgzNDI2LCAweGQ3OTQsIDB4MDA0MCwgMHgzNzQ1LCAweGFjODAsIDB4MDAwYSwgMHgyMDk4LCAweDM0MDAsCisJMHgyMGE5LCAweDAwMDQsIDB4NTNhMywgMHgxMDc4LCAweDM0MjYsIDB4MjFhMiwgMHhkNzk0LCAweDAwNDAsCisJMHgzNzY1LCAweGFjODAsIDB4MDAwMCwgMHgyMDk4LCAweDk0YTAsIDB4MjBhOSwgMHgwMDAyLCAweDUzYTMsCisJMHhhYzgwLCAweDAwMDMsIDB4MjBhNiwgMHg5NGEwLCAweGFjODAsIDB4MDAwNCwgMHgyMDk4LCAweDM0MDAsCisJMHgyMGE5LCAweDAwMDIsIDB4NTNhMywgMHgxMDc4LCAweDM0MTgsIDB4YWM4MCwgMHgwMDI2LCAweDIwOTgsCisJMHgyMGE5LCAweDAwMDIsIDB4NTNhMywgMHgwMDc4LCAweDM3NjYsIDB4OTRhMCwgMHhkNzk0LCAweDAwNDAsCisJMHgzNzZiLCAweGE2YjAsIDB4MDAwYiwgMHhhNmIwLCAweDAwMDUsIDB4ODEwOCwgMHhkNzhjLCAweDAwNDAsCisJMHgzNzc3LCAweGExODYsIDB4MDEwMCwgMHgwMDQwLCAweDM3ODgsIDB4MDA3OCwgMHgzNzdiLCAweGExODYsCisJMHgwMDdlLCAweDAwNDAsIDB4Mzc4OCwgMHhkNzk0LCAweDAwNDAsIDB4Mzc4MiwgMHhhNjg2LCAweDAwMjAsCisJMHgwMDc4LCAweDM3ODQsIDB4YTY4NiwgMHgwMDI4LCAweDAwNDAsIDB4Mzc5MSwgMHgwMDc4LCAweDM3MGMsCisJMHg4NmZmLCAweDAwYzAsIDB4Mzc4ZiwgMHg3MTIwLCAweDgxMGIsIDB4MDA3OCwgMHgyYmFkLCAweDcwMmYsCisJMHgwMDAxLCAweDcxMWUsIDB4NzAyMCwgMHhhNjAwLCAweDcwMjIsIDB4NzcyYSwgMHgyMDYxLCAweGE2ZDIsCisJMHg2MDA3LCAweDAwMDAsIDB4NjYxMiwgMHg3MDI0LCAweDYwMGUsIDB4NjIyNiwgMHg2MzJhLCAweDY0MmUsCisJMHg2NTMyLCAweDJjMTAsIDB4MTA3OCwgMHgxM2RiLCAweDcwMDcsIDB4MDAwMiwgMHg3MDFiLCAweDM3YTksCisJMHgwMDdjLCAweDcwMmMsIDB4YTAwNSwgMHgwMGMwLCAweDM3YmIsIDB4NzExYywgMHg3MDI0LCAweDIwYTAsCisJMHg3NzI4LCAweDIwMzEsIDB4MDAwMCwgMHgyMDYxLCAweGE2ZDIsIDB4NjIyNCwgMHg2MzI4LCAweDY0MmMsCisJMHg2NTMwLCAweDAwNzgsIDB4MzcwYywgMHg3MTIwLCAweDgxMGIsIDB4MDA3OCwgMHgyYmFkLCAweDIwMjksCisJMHgwMDdlLCAweDc5MjQsIDB4N2EyOCwgMHg3YjJjLCAweDdjMzgsIDB4YTE4NCwgMHhmZjAwLCAweDgwMDcsCisJMHhhMGUyLCAweDAwMjAsIDB4MDA0OCwgMHgyYmRiLCAweGE1MDIsIDB4MDA0OCwgMHgyYmRiLCAweGExODQsCisJMHgwMGZmLCAweGEwZTIsIDB4MDAyMCwgMHgwMDQ4LCAweDJiZGIsIDB4YTUwMiwgMHgwMDQ4LCAweDJiZGIsCisJMHhhMjg0LCAweGZmMDAsIDB4ODAwNywgMHhhMGUyLCAweDAwMjAsIDB4MDA0OCwgMHgyYmRiLCAweGE1MDIsCisJMHgwMDQ4LCAweDJiZGIsIDB4YTI4NCwgMHgwMGZmLCAweGEwZTIsIDB4MDAyMCwgMHgwMDQ4LCAweDJiZGIsCisJMHhhNTAyLCAweDAwNDgsIDB4MmJkYiwgMHhhMzg0LCAweGZmMDAsIDB4ODAwNywgMHhhMGUyLCAweDAwMjAsCisJMHgwMDQ4LCAweDJiZGIsIDB4YTUwMiwgMHgwMDQ4LCAweDJiZGIsIDB4YTM4NCwgMHgwMGZmLCAweGEwZTIsCisJMHgwMDIwLCAweDAwNDgsIDB4MmJkYiwgMHhhNTAyLCAweDAwNDgsIDB4MmJkYiwgMHhhNDg0LCAweGZmMDAsCisJMHg4MDA3LCAweGEwZTIsIDB4MDAyMCwgMHgwMDQ4LCAweDJiZGIsIDB4YTUwMiwgMHgwMDQ4LCAweDJiZGIsCisJMHhhNDg0LCAweDAwZmYsIDB4YTBlMiwgMHgwMDIwLCAweDAwNDgsIDB4MmJkYiwgMHhhNTAyLCAweDAwNDgsCisJMHgyYmRiLCAweDIwNjEsIDB4YThhNSwgMHg2MTAyLCAweDYyMDYsIDB4NjMwYSwgMHg2NDBlLCAweDAwNzgsCisJMHgyYmFkLCAweDAwN2UsIDB4MjAwMSwgMHhhNjUzLCAweDIwMDQsIDB4ZDBjYywgMHgwMDdmLCAweDAwN2MsCisJMHgwMDdlLCAweDIwMDEsIDB4YTY3MiwgMHgyMDA0LCAweGQwYmMsIDB4MDA3ZiwgMHgwMDdjLCAweDYxNjQsCisJMHg3YTI0LCAweDYzMDAsIDB4ODJmZiwgMHgwMGMwLCAweDM4MzAsIDB4NzkyNiwgMHgwMDc4LCAweDJiYWQsCisJMHg4M2ZmLCAweDAwYzAsIDB4MmJkYiwgMHgyMDAxLCAweGZmZjAsIDB4YTIwMCwgMHgwMGM4LCAweDJiZGIsCisJMHgyMDE5LCAweGZmZmYsIDB4NjA2OCwgMHhhMzAyLCAweGEyMDAsIDB4MDA0OCwgMHgyYmRiLCAweDc5MjYsCisJMHg2MjY2LCAweDAwNzgsIDB4MmJhZCwgMHgyMDAxLCAweGE2MDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsCisJMHgwMGMwLCAweDJiZDcsIDB4N2MyOCwgMHg3ZDI0LCAweDdlMzgsIDB4N2YyYywgMHgxMDc4LCAweDM1YmEsCisJMHgwMDQwLCAweDJiZDcsIDB4MjAwOSwgMHgwMDAwLCAweDIwMTksIDB4MDAwMCwgMHg3MDIzLCAweDAwMDAsCisJMHg3MDJmLCAweDAwMDAsIDB4YWQ4MCwgMHgwMDAzLCAweDcwMjYsIDB4MjBhMCwgMHhhMWUwLCAweGE3MzUsCisJMHgyYzY0LCAweDhjZmYsIDB4MDA0MCwgMHgzODdkLCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsCisJMHgwMDA2LCAweDAwNDAsIDB4Mzg3MiwgMHg2MDA0LCAweGEwODQsIDB4ZmYwMCwgMHhhMDg2LCAweDA2MDAsCisJMHgwMGMwLCAweDM4N2QsIDB4NjAxNCwgMHgyMGEyLCAweDk0YTAsIDB4NjAxMCwgMHg4MDA3LCAweGExMDUsCisJMHg4MDA3LCAweDIwYTIsIDB4OTRhMCwgMHhhMzk4LCAweDAwMDIsIDB4ODEwOCwgMHhhMTgyLCAweDAwZmYsCisJMHgwMDQwLCAweDM4ODgsIDB4YTM4NiwgMHgwMDJhLCAweDAwNDAsIDB4Mzg5MSwgMHgwMDc4LCAweDM4NWUsCisJMHg4M2ZmLCAweDAwYzAsIDB4Mzg4ZiwgMHg3MTIwLCAweDgxMGMsIDB4MDA3OCwgMHgyYmFkLCAweDcwMmYsCisJMHgwMDAxLCAweDcxMWUsIDB4NzAyMCwgMHhhMzAwLCAweDcwMjIsIDB4MjA2MSwgMHhhNmQyLCAweDYwMDcsCisJMHgwMDAwLCAweDYzMTIsIDB4NzAyNCwgMHg2MDBlLCAweDY0MjYsIDB4NjUyYSwgMHg2NjJlLCAweDY3MzIsCisJMHgyYzEwLCAweDEwNzgsIDB4MTNkYiwgMHg3MDA3LCAweDAwMDIsIDB4NzAxYiwgMHgzOGE4LCAweDAwN2MsCisJMHg3MDJjLCAweGEwMDUsIDB4MDBjMCwgMHgzOGI5LCAweDcxMWMsIDB4NzAyNCwgMHgyMGEwLCAweDIwMTksCisJMHgwMDAwLCAweDIwNjEsIDB4YTZkMiwgMHg2NDI0LCAweDY1MjgsIDB4NjYyYywgMHg2NzMwLCAweDAwNzgsCisJMHgzODVlLCAweDcxMjAsIDB4ODEwYywgMHgwMDc4LCAweDJiYWQsIDB4ODFmZiwgMHgwMGMwLCAweDJiZDcsCisJMHg2MGNjLCAweGQwOWMsIDB4MDA0MCwgMHgyYmQ3LCAweDEwNzgsIDB4MzViYSwgMHgwMDQwLCAweDJiZDcsCisJMHg3OTI0LCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MTA3OCwgMHgzNjA0LCAweDcwMWIsCisJMHgzOGQyLCAweDAwN2MsIDB4MGQ3ZSwgMHhhZGU4LCAweDAwMGQsIDB4NjgyOCwgMHhhMGJlLCAweDcwMDAsCisJMHgwMDQwLCAweDM4ZTUsIDB4YTBiZSwgMHg3MTAwLCAweDAwNDAsIDB4MzhlNSwgMHhhMGJlLCAweDcyMDAsCisJMHgwMDQwLCAweDM4ZTUsIDB4MGQ3ZiwgMHgwMDc4LCAweDJiZGIsIDB4NjgyMCwgMHg2OTI0LCAweDEwNzgsCisJMHgyNTRkLCAweDAwYzAsIDB4MzkxMCwgMHgxMDc4LCAweDQ1NWMsIDB4MDBjMCwgMHgzOTEwLCAweDcxMjIsCisJMHg2NjEyLCAweDY1MTYsIDB4NmUxOCwgMHgwYzdlLCAweDEwNzgsIDB4MzViYSwgMHgwMDQwLCAweDM5MTAsCisJMHgxMDc4LCAweDM1YmEsIDB4MDA0MCwgMHgzOTEwLCAweDBjN2YsIDB4MGQ3ZiwgMHg2ODM3LCAweDAwMDAsCisJMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHg2ODIzLCAweDAwMDAsIDB4NjgwNCwgMHgyMDY4LCAweDEwNzgsCisJMHg4ZTgyLCAweDAwNDAsIDB4MmJkNywgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgzOTEzLCAweDAwN2MsCisJMHgwZDdmLCAweDAwNzgsIDB4MmJkNywgMHg3MTIwLCAweDEwNzgsIDB4Mjk4ZSwgMHg2ODIwLCAweGEwODYsCisJMHg4MDAxLCAweDAwNDAsIDB4MmJkNywgMHgyZDAwLCAweDcwMWUsIDB4NjgwNCwgMHhhMDgwLCAweDAwMDIsCisJMHgwMDdlLCAweDIwYTksIDB4MDAyYSwgMHgyMDk4LCAweDIwYTAsIDB4MTA3OCwgMHg0MjgxLCAweDAwN2YsCisJMHhhZGU4LCAweDAwMGQsIDB4NmEwOCwgMHg2YjBjLCAweDZjMTAsIDB4NmQxNCwgMHgyMDYxLCAweGE2ZDIsCisJMHg2MDA3LCAweDAwMDAsIDB4NmUwMCwgMHg2ZjI4LCAweGE3YzYsIDB4NzAwMCwgMHgwMGMwLCAweDM5M2EsCisJMHgwMDc4LCAweDM5M2UsIDB4YTdjNiwgMHg3MTAwLCAweDAwYzAsIDB4Mzk0NiwgMHhhNmMyLCAweDAwMDQsCisJMHgwMDQ4LCAweDJiZGIsIDB4MjAwOSwgMHgwMDA0LCAweDAwNzgsIDB4MzYwOCwgMHhhN2M2LCAweDcyMDAsCisJMHgwMGMwLCAweDJiZGIsIDB4YTZjMiwgMHgwMDU0LCAweDAwNDgsIDB4MmJkYiwgMHg2MDBlLCAweDYwMTMsCisJMHgwMDJhLCAweDYyMjYsIDB4NjMyYSwgMHg2NDJlLCAweDY1MzIsIDB4MmMxMCwgMHgxMDc4LCAweDEzZGIsCisJMHg3MDA3LCAweDAwMDIsIDB4NzAxYiwgMHgzOTVkLCAweDAwN2MsIDB4NzAxYywgMHgyMDY4LCAweDY4MDQsCisJMHhhMDgwLCAweDAwMDEsIDB4MjAwNCwgMHhhMDgwLCAweDAwMDIsIDB4MDA3ZSwgMHgyMGE5LCAweDAwMmEsCisJMHgyMDk4LCAweDIwYTAsIDB4MTA3OCwgMHg0MjgxLCAweDAwN2YsIDB4MjAwOSwgMHgwMDJhLCAweDIwNjEsCisJMHhhNmQyLCAweDYyMjQsIDB4NjMyOCwgMHg2NDJjLCAweDY1MzAsIDB4MDA3OCwgMHgzNjA4LCAweDgxZmYsCisJMHgwMGMwLCAweDJiZDcsIDB4NzkyYywgMHgyMDAxLCAweGE4OWQsIDB4MjEwMiwgMHgxMDc4LCAweDM1ZDIsCisJMHgwMDQwLCAweDJiZGIsIDB4MTA3OCwgMHg0NjczLCAweDAwNDAsIDB4MmJkNywgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDEwNzgsIDB4NDdkZSwgMHgxMjdmLCAweDAwNzgsIDB4MmJhZCwgMHg3ODI0LCAweGQwOGMsCisJMHgwMGMwLCAweDM5OTUsIDB4ZDA4NCwgMHgwMDQwLCAweDMxZGEsIDB4MTA3OCwgMHgzNWU0LCAweDAwNDAsCisJMHgyYmRiLCAweDBjN2UsIDB4MTA3OCwgMHgzNWJhLCAweDBjN2YsIDB4MDBjMCwgMHgzOWEzLCAweDIwMDksCisJMHgwMDAyLCAweDAwNzgsIDB4MmJkNywgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsCisJMHgwMDQwLCAweDM5YjAsIDB4YTA4ZSwgMHgwMDA0LCAweDAwNDAsIDB4MzliMCwgMHhhMDhlLCAweDAwMDUsCisJMHgwMGMwLCAweDM5ZGQsIDB4NzgyNCwgMHhkMDhjLCAweDAwNDAsIDB4MzliYiwgMHg2MDAwLCAweGMwOGMsCisJMHg2MDAyLCAweDAwNzgsIDB4MzljNSwgMHgyMDAxLCAweGE2NTMsIDB4MjAwNCwgMHhkMGI0LCAweDAwNDAsCisJMHgzMjBmLCAweDYwMDAsIDB4ZDA4YywgMHgwMGMwLCAweDMyMGYsIDB4NjgzNywgMHgwMDAwLCAweDY4MzgsCisJMHhjMGZkLCAweDY4M2EsIDB4MTA3OCwgMHg4ZTllLCAweDAwYzAsIDB4MzlkMiwgMHgyMDA5LCAweDAwMDMsCisJMHgwMDc4LCAweDJiZDcsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsIDB4MzlkNywgMHgwMDdjLCAweDEwNzgsCisJMHgzNWU0LCAweDAwNDAsIDB4MmJkYiwgMHgwMDc4LCAweDMyMGYsIDB4MjAwOSwgMHhhNjJmLCAweDIxMGMsCisJMHg4MWZmLCAweDAwNDAsIDB4MzllNywgMHgyMDA5LCAweDAwMDEsIDB4MDA3OCwgMHgyYmQ3LCAweDIwMDEsCisJMHhhNjAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLCAweDAwNDAsIDB4MzlmMiwgMHgyMDA5LCAweDAwMDcsCisJMHgwMDc4LCAweDJiZDcsIDB4MjAwMSwgMHhhNjUzLCAweDIwMDQsIDB4ZDBhYywgMHgwMDQwLCAweDM5ZmMsCisJMHgyMDA5LCAweDAwMDgsIDB4MDA3OCwgMHgyYmQ3LCAweDYwOWMsIDB4ZDBhNCwgMHgwMGMwLCAweDNhMDMsCisJMHhkMGFjLCAweDAwYzAsIDB4MzIwZiwgMHg2ODM3LCAweDAwMDAsIDB4NjgzMywgMHgwMDAwLCAweDY4MzgsCisJMHhjMGZkLCAweDY4M2EsIDB4MTA3OCwgMHg4ZjEyLCAweDAwYzAsIDB4M2ExMiwgMHgyMDA5LCAweDAwMDMsCisJMHgwMDc4LCAweDJiZDcsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsIDB4M2ExNywgMHgwMDdjLCAweDY4MzAsCisJMHhhMDg2LCAweDAxMDAsIDB4MDBjMCwgMHgzYTIwLCAweDIwMDksIDB4MDAwNCwgMHgwMDc4LCAweDJiZDcsCisJMHgxMDc4LCAweDM1ZTQsIDB4MDA0MCwgMHgyYmRiLCAweDAwNzgsIDB4MzliMiwgMHg4MWZmLCAweDIwMDksCisJMHgwMDAxLCAweDAwYzAsIDB4MmJkNywgMHg2MDAwLCAweGEwODYsIDB4MDAwMywgMHgyMDA5LCAweDAwMDcsCisJMHgwMGMwLCAweDJiZDcsIDB4MjAwMSwgMHhhNjUzLCAweDIwMDQsIDB4ZDBhYywgMHgyMDA5LCAweDAwMDgsCisJMHgwMGMwLCAweDJiZDcsIDB4MTA3OCwgMHgzNWU0LCAweDAwNDAsIDB4MmJkYiwgMHg2MDA0LCAweGEwODQsCisJMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgyMDA5LCAweDAwMDksIDB4MDBjMCwgMHgyYmQ3LCAweDBjN2UsCisJMHgxMDc4LCAweDM1YmEsIDB4MGM3ZiwgMHgyMDA5LCAweDAwMDIsIDB4MDA0MCwgMHgyYmQ3LCAweDY4MzcsCisJMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHg3OTI4LCAweGExOTQsCisJMHhmZjAwLCAweGExOGMsIDB4MDBmZiwgMHhhMDA2LCAweDgyZmYsIDB4MDBjMCwgMHgzYTY1LCAweGMwZWQsCisJMHg2OTUyLCAweDc5MmMsIDB4Njk1NiwgMHgwMDc4LCAweDNhNmUsIDB4YTI4ZSwgMHgwMTAwLCAweDAwYzAsCisJMHgyYmRiLCAweGMwZTUsIDB4Njg1MywgMHgwMDAwLCAweDY4NTcsIDB4MDAwMCwgMHg2ODNlLCAweDEwNzgsCisJMHg5MGJkLCAweDIwMDksIDB4MDAwMywgMHgwMDQwLCAweDJiZDcsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsCisJMHgzYTdhLCAweDAwN2MsIDB4NjgzMCwgMHhhMDg2LCAweDAxMDAsIDB4MjAwOSwgMHgwMDA0LCAweDAwNDAsCisJMHgyYmQ3LCAweDAwNzgsIDB4MmJhZCwgMHg4MWZmLCAweDIwMDksIDB4MDAwMSwgMHgwMGMwLCAweDJiZDcsCisJMHg2MDAwLCAweGEwODYsIDB4MDAwMywgMHgyMDA5LCAweDAwMDcsIDB4MDBjMCwgMHgyYmQ3LCAweDEwNzgsCisJMHgzNWU0LCAweDAwNDAsIDB4MmJkYiwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsCisJMHgyMDA5LCAweDAwMDksIDB4MDBjMCwgMHgyYmQ3LCAweDBjN2UsIDB4MTA3OCwgMHgzNWJhLCAweDBjN2YsCisJMHgyMDA5LCAweDAwMDIsIDB4MDA0MCwgMHgyYmQ3LCAweGFkODAsIDB4MDAwZiwgMHgyMDA5LCAweDAwMDgsCisJMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDEwNzgsIDB4MzYwNCwgMHg3MDFiLCAweDNhYjEsCisJMHgwMDdjLCAweDBkN2UsIDB4YWRlOCwgMHgwMDBmLCAweDY4MDAsIDB4YTA4NiwgMHgwNTAwLCAweDAwYzAsCisJMHgzYWM0LCAweDY4MDQsIDB4YTAwNSwgMHgwMGMwLCAweDNhYzQsIDB4NjgwOCwgMHhhMDg0LCAweGZmMDAsCisJMHgwMGMwLCAweDNhYzQsIDB4MDA3OCwgMHgzYWM3LCAweDBkN2YsIDB4MDBjMCwgMHgyYmRiLCAweDBkN2YsCisJMHg2ODM3LCAweDAwMDAsIDB4NjgzMywgMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDBjN2UsCisJMHgxMDc4LCAweDM1ZTQsIDB4MDBjMCwgMHgzYWQ3LCAweDBjN2YsIDB4MDA3OCwgMHgyYmRiLCAweDEwNzgsCisJMHg5MTE5LCAweDIwMDksIDB4MDAwMywgMHgwYzdmLCAweDAwNDAsIDB4MmJkNywgMHg3MDA3LCAweDAwMDMsCisJMHg3MDFiLCAweDNhZTMsIDB4MDA3YywgMHg2ODMwLCAweGEwODYsIDB4MDEwMCwgMHgyMDA5LCAweDAwMDQsCisJMHgwMDQwLCAweDJiZDcsIDB4MDA3OCwgMHgyYmFkLCAweDEyN2UsIDB4MGM3ZSwgMHgwZTdlLCAweDIwNjEsCisJMHgwMTAwLCAweDIwNzEsIDB4YTYwMCwgMHg2MDQ0LCAweGQwYTQsIDB4MDBjMCwgMHgzYjE1LCAweGQwODQsCisJMHgwMDQwLCAweDNhZmUsIDB4MTA3OCwgMHgzYzc1LCAweDAwNzgsIDB4M2IxMSwgMHhkMDhjLCAweDAwNDAsCisJMHgzYjA1LCAweDEwNzgsIDB4M2I4YywgMHgwMDc4LCAweDNiMTEsIDB4ZDA5NCwgMHgwMDQwLCAweDNiMGMsCisJMHgxMDc4LCAweDNiNjAsIDB4MDA3OCwgMHgzYjExLCAweGQwOWMsIDB4MDA0MCwgMHgzYjExLCAweDEwNzgsCisJMHgzYjFmLCAweDBlN2YsIDB4MGM3ZiwgMHgxMjdmLCAweDAwN2MsIDB4MDE3ZSwgMHg2MTI4LCAweGQxOWMsCisJMHgwMGMwLCAweDNiMWMsIDB4YzE5ZCwgMHg2MTJhLCAweDAxN2YsIDB4MDA3OCwgMHgzYjExLCAweDYyNGMsCisJMHhhMjg2LCAweGYwZjAsIDB4MDBjMCwgMHgzYjMwLCAweDYwNDgsIDB4YTA4NiwgMHhmMGYwLCAweDAwNDAsCisJMHgzYjMwLCAweDYyNGEsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHgwMDc4LCAweDNiNWYsCisJMHhhMjk0LCAweGZmMDAsIDB4YTI5NiwgMHhmNzAwLCAweDAwNDAsIDB4M2I0NSwgMHg3MTM0LCAweGQxYTQsCisJMHgwMGMwLCAweDNiNDUsIDB4NjI0MCwgMHhhMjk0LCAweDAwMTAsIDB4MDA0MCwgMHgzYjQ1LCAweDIwMDksCisJMHgwMGY3LCAweDEwNzgsIDB4NDJhMSwgMHgwMDc4LCAweDNiNWYsIDB4NjA0MywgMHgwMDQwLCAweDYwNDMsCisJMHgwMDAwLCAweDcwNzcsIDB4MDAwMCwgMHg3MDhmLCAweDAwMDEsIDB4NzBiMywgMHgwMDAwLCAweDcwY2YsCisJMHgwMDAwLCAweDIwMDksIDB4YWNjMCwgMHgyMDBiLCAweDAwMDAsIDB4NzA4NywgMHgwMDAwLCAweDcwN2IsCisJMHgwMDBmLCAweDIwMDksIDB4MDAwZiwgMHgyMDExLCAweDQxZDUsIDB4MTA3OCwgMHg1YWRkLCAweDAwN2MsCisJMHgxNTdlLCAweDcwNzgsIDB4YTAwNSwgMHgwMGMwLCAweDNiOGEsIDB4MjAxMSwgMHg0MWQ1LCAweDEwNzgsCisJMHg1YTQ1LCAweDYwNDAsIDB4YTA5NCwgMHgwMDEwLCAweGEyODUsIDB4MDAyMCwgMHg2MDQyLCAweDIwYTksCisJMHgwMGM4LCAweDYwNDQsIDB4ZDA4YywgMHgwMGMwLCAweDNiODMsIDB4MDBmMCwgMHgzYjcxLCAweDYyNDIsCisJMHg3MDhiLCAweDAwMDAsIDB4NjA0MCwgMHhhMDk0LCAweDAwMTAsIDB4YTI4NSwgMHgwMDgwLCAweDYwNDIsCisJMHg2MjQyLCAweDAwNzgsIDB4M2I4YSwgMHg2MjQyLCAweDcwOGIsIDB4MDAwMCwgMHg3MDdmLCAweDAwMDAsCisJMHgwMDc4LCAweDNiOGEsIDB4MTU3ZiwgMHgwMDdjLCAweDcwN2MsIDB4YTA4YSwgMHgwMDAzLCAweDAwYzgsCisJMHgzYjk1LCAweDEwNzksIDB4M2I5OCwgMHgwMDc4LCAweDNiOTcsIDB4MTA3OCwgMHgxMzMyLCAweDAwN2MsCisJMHgzYjliLCAweDNiZWEsIDB4M2M3NCwgMHgwZjdlLCAweDcwN2YsIDB4MDAwMSwgMHgyMGUxLCAweGEwMDAsCisJMHgyMGUxLCAweDg3MDAsIDB4MTA3OCwgMHgyMWY3LCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsCisJMHgyMDc5LCAweGFiMDAsIDB4MjA3YiwgMHgyMjAwLCAweDc4MDcsIDB4MDBlZiwgMHg3ODBiLCAweDAwMDAsCisJMHg3ODBmLCAweDAwZWYsIDB4NzgxMywgMHgwMTM4LCAweDc4MTcsIDB4MDAwMCwgMHg3ODFiLCAweDAwMDAsCisJMHg3ODFmLCAweDAwMDAsIDB4NzgyMywgMHhmZmZmLCAweDc4MjcsIDB4ZmZmZiwgMHg3ODJiLCAweDAwMDAsCisJMHg3ODJmLCAweDAwMDAsIDB4MjA3OSwgMHhhYjBjLCAweDIwN2IsIDB4MTEwMSwgMHg3ODA3LCAweDAwMDAsCisJMHgyMDk5LCAweGE2MDUsIDB4MjBhMSwgMHhhYjBlLCAweDIwYTksIDB4MDAwNCwgMHg1M2EzLCAweDIwNzksCisJMHhhYjEyLCAweDIwN2IsIDB4MDAwMCwgMHg3ODA3LCAweDAwMDAsIDB4MjA5OSwgMHhhYjAwLCAweDIwYTEsCisJMHgwMjBiLCAweDIwYTksIDB4MDAxNCwgMHg1M2E2LCAweDYwYzMsIDB4MDAwYywgMHg2MDBmLCAweDAwMDAsCisJMHgxMDc4LCAweDQyMGIsIDB4MGY3ZiwgMHg3MDgzLCAweDAwMDAsIDB4NjA0MywgMHgwMDA4LCAweDYwNDMsCisJMHgwMDAwLCAweDAwN2MsIDB4MGQ3ZSwgMHg3MDgwLCAweDcwODMsIDB4MDAwMCwgMHhhMDI1LCAweDAwNDAsCisJMHgzYzVlLCAweDYwMjAsIDB4ZDBiNCwgMHgwMGMwLCAweDNjNWMsIDB4NzE4YywgMHg4MWZmLCAweDAwNDAsCisJMHgzYzRiLCAweGE0ODYsIDB4MDAwYywgMHgwMGMwLCAweDNjNTYsIDB4YTQ4MCwgMHgwMDE4LCAweDgwMDQsCisJMHgyMGE4LCAweDIwMTEsIDB4YWI4MCwgMHgyMDE5LCAweGFiMDAsIDB4MjIwYywgMHgyMzA0LCAweGExMDYsCisJMHgwMGMwLCAweDNjMjIsIDB4ODIxMCwgMHg4MzE4LCAweDAwZjAsIDB4M2MwNSwgMHg2MDQzLCAweDAwMDQsCisJMHg2MDhiLCAweGJjOTQsIDB4NjA4ZiwgMHhmMGYwLCAweDYwNDMsIDB4MDAwNiwgMHg3MDdmLCAweDAwMDIsCisJMHg3MDhiLCAweDAwMDIsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsIDB4NDFkYywgMHgxMDc4LCAweDVhZGQsCisJMHgwMDc4LCAweDNjNWMsIDB4MjA2OSwgMHhhYjgwLCAweDY5MzAsIDB4YTE4ZSwgMHgxMTAxLCAweDAwYzAsCisJMHgzYzU2LCAweDY4MzQsIDB4YTAwNSwgMHgwMGMwLCAweDNjNTYsIDB4NjkwMCwgMHhhMThjLCAweDAwZmYsCisJMHgwMGMwLCAweDNjMzYsIDB4NjgwNCwgMHhhMDA1LCAweDAwNDAsIDB4M2M0YiwgMHgyMDExLCAweGFiOGUsCisJMHgyMDE5LCAweGE2MDUsIDB4MjBhOSwgMHgwMDA0LCAweDIyMGMsIDB4MjMwNCwgMHhhMTAyLCAweDAwNDgsCisJMHgzYzQ5LCAweDAwYzAsIDB4M2M1NiwgMHg4MjEwLCAweDgzMTgsIDB4MDBmMCwgMHgzYzNjLCAweDAwNzgsCisJMHgzYzU2LCAweDcwOGYsIDB4MDAwMCwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDIwOTksCisJMHhhYjgwLCAweDIwYTEsIDB4MDIwYiwgMHgyMGE5LCAweDAwMTQsIDB4NTNhNiwgMHg2MDQzLCAweDAwMDgsCisJMHg2MDQzLCAweDAwMDAsIDB4MDA3OCwgMHgzYzVlLCAweDBkN2YsIDB4MDA3YywgMHg2MDIwLCAweGQwYjQsCisJMHgwMGMwLCAweDNjNWMsIDB4NjBjMywgMHgwMDBjLCAweDIwMTEsIDB4YThiYiwgMHgyMDEzLCAweDAwMDAsCisJMHg3MDgzLCAweDAwMDAsIDB4MjBlMSwgMHg5MDgwLCAweDYwYTMsIDB4MDA1NiwgMHg2MGE3LCAweDk1NzUsCisJMHgxMDc4LCAweDZlMDYsIDB4MDA3OCwgMHgzYzVjLCAweDAwN2MsIDB4NzA4OCwgMHhhMDhhLCAweDAwMWQsCisJMHgwMGM4LCAweDNjN2UsIDB4MTA3OSwgMHgzYzgxLCAweDAwNzgsIDB4M2M4MCwgMHgxMDc4LCAweDEzMzIsCisJMHgwMDdjLCAweDNjYWIsIDB4M2NiYSwgMHgzY2U5LCAweDNkMDIsIDB4M2QyZSwgMHgzZDVhLCAweDNkODYsCisJMHgzZGJjLCAweDNkZTgsIDB4M2UxMCwgMHgzZTUzLCAweDNlN2QsIDB4M2U5ZiwgMHgzZWI1LCAweDNlZGIsCisJMHgzZWVlLCAweDNlZjcsIDB4M2YyYiwgMHgzZjU3LCAweDNmODMsIDB4M2ZhZiwgMHgzZmU1LCAweDQwMzAsCisJMHg0MDVmLCAweDQwODEsIDB4NDBjMywgMHg0MGU5LCAweDQxMDIsIDB4NDEwMywgMHgwYzdlLCAweDIwNjEsCisJMHhhNjAwLCAweDYwMDMsIDB4MDAwNywgMHgyMDYxLCAweDAxMDAsIDB4NjAwNCwgMHhhMDg0LCAweGZmZjksCisJMHg2MDA2LCAweDBjN2YsIDB4MDA3YywgMHg2MDhiLCAweGJjOTQsIDB4NjA4ZiwgMHhmMGYwLCAweDYwNDMsCisJMHgwMDAyLCAweDcwOGIsIDB4MDAwMSwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwgMHg0MWRjLCAweDEwNzgsCisJMHg1YWRkLCAweDAwN2MsIDB4MGY3ZSwgMHg3MDgwLCAweGEwODYsIDB4MDAxNCwgMHgwMGMwLCAweDNjZTcsCisJMHg2MDQzLCAweDAwMDAsIDB4NjAyMCwgMHhkMGI0LCAweDAwYzAsIDB4M2NlNywgMHgyMDc5LCAweGFiODAsCisJMHg3YTMwLCAweGEyOTYsIDB4MTEwMiwgMHgwMGMwLCAweDNjZTUsIDB4NzgzNCwgMHhhMDA1LCAweDAwYzAsCisJMHgzY2U1LCAweDdhMzgsIDB4ZDJmYywgMHgwMDQwLCAweDNjZGIsIDB4NzBiMCwgMHhhMDA1LCAweDAwYzAsCisJMHgzY2RiLCAweDcwYjMsIDB4MDAwMSwgMHgyMDExLCAweDQxZGMsIDB4MTA3OCwgMHg1YTQ1LCAweDcwOGIsCisJMHgwMDEwLCAweDEwNzgsIDB4M2VmNywgMHgwMDc4LCAweDNjZTcsIDB4MTA3OCwgMHg0MjI0LCAweDBmN2YsCisJMHgwMDdjLCAweDcwOGIsIDB4MDAwMywgMHg2MDQzLCAweDAwMDQsIDB4MjAxMSwgMHg0MWRjLCAweDEwNzgsCisJMHg1YTQ1LCAweDEwNzgsIDB4NDI4OSwgMHgyMGEzLCAweDExMDIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTksCisJMHgwMDBhLCAweDIwYTMsIDB4MDAwMCwgMHgwMGYwLCAweDNjZjksIDB4NjBjMywgMHgwMDE0LCAweDEwNzgsCisJMHg0MjBiLCAweDAwN2MsIDB4MGY3ZSwgMHg3MDgwLCAweGEwMDUsIDB4MDA0MCwgMHgzZDJjLCAweDIwMTEsCisJMHg0MWRjLCAweDEwNzgsIDB4NWE0NSwgMHhhMDg2LCAweDAwMTQsIDB4MDBjMCwgMHgzZDJhLCAweDIwNzksCisJMHhhYjgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTAyLCAweDAwYzAsIDB4M2QyYSwgMHg3ODM0LCAweGEwMDUsCisJMHgwMGMwLCAweDNkMmEsIDB4N2EzOCwgMHhkMmZjLCAweDAwNDAsIDB4M2QyNCwgMHg3MGIwLCAweGEwMDUsCisJMHgwMGMwLCAweDNkMjQsIDB4NzBiMywgMHgwMDAxLCAweDcwOGIsIDB4MDAwNCwgMHgxMDc4LCAweDNkMmUsCisJMHgwMDc4LCAweDNkMmMsIDB4MTA3OCwgMHg0MjI0LCAweDBmN2YsIDB4MDA3YywgMHg3MDhiLCAweDAwMDUsCisJMHgxMDc4LCAweDQyODksIDB4MjBhMywgMHgxMTAzLCAweDIwYTMsIDB4MDAwMCwgMHgzNDMwLCAweDIwMTEsCisJMHhhYjhlLCAweDEwNzgsIDB4NDJkNCwgMHgwMGMwLCAweDNkNGMsIDB4NzA3NCwgMHhhMDA1LCAweDAwYzAsCisJMHgzZDRjLCAweDcxNTAsIDB4YTE4NiwgMHhmZmZmLCAweDAwNDAsIDB4M2Q0YywgMHgxMDc4LCAweDQxOWQsCisJMHgwMDQwLCAweDNkNGMsIDB4MTA3OCwgMHg0MmI4LCAweDIwYTksIDB4MDAwOCwgMHgyMjk4LCAweDI2YTAsCisJMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LCAweDEwNzgsCisJMHg0MjBiLCAweDAwN2MsIDB4MGY3ZSwgMHg3MDgwLCAweGEwMDUsIDB4MDA0MCwgMHgzZDg0LCAweDIwMTEsCisJMHg0MWRjLCAweDEwNzgsIDB4NWE0NSwgMHhhMDg2LCAweDAwMTQsIDB4MDBjMCwgMHgzZDgyLCAweDIwNzksCisJMHhhYjgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTAzLCAweDAwYzAsIDB4M2Q4MiwgMHg3ODM0LCAweGEwMDUsCisJMHgwMGMwLCAweDNkODIsIDB4N2EzOCwgMHhkMmZjLCAweDAwNDAsIDB4M2Q3YywgMHg3MGIwLCAweGEwMDUsCisJMHgwMGMwLCAweDNkN2MsIDB4NzBiMywgMHgwMDAxLCAweDcwOGIsIDB4MDAwNiwgMHgxMDc4LCAweDNkODYsCisJMHgwMDc4LCAweDNkODQsIDB4MTA3OCwgMHg0MjI0LCAweDBmN2YsIDB4MDA3YywgMHg3MDhiLCAweDAwMDcsCisJMHgxMDc4LCAweDQyODksIDB4MjBhMywgMHgxMTA0LCAweDIwYTMsIDB4MDAwMCwgMHgzNDMwLCAweDIwMTEsCisJMHhhYjhlLCAweDEwNzgsIDB4NDJkNCwgMHgwMGMwLCAweDNkYWUsIDB4NzA3NCwgMHhhMDA1LCAweDAwYzAsCisJMHgzZGFlLCAweDcxNTQsIDB4YTE4NiwgMHhmZmZmLCAweDAwNDAsIDB4M2RhZSwgMHhhMTgwLCAweDI5YzAsCisJMHgyMDBjLCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDEwNzgsIDB4NDE5ZCwgMHgwMDQwLCAweDNkYWUsCisJMHgxMDc4LCAweDM4MjAsIDB4MDA0MCwgMHgzZGFlLCAweDEwNzgsIDB4MjU2YSwgMHgyMGE5LCAweDAwMDgsCisJMHgyMjk4LCAweDI2YTAsIDB4NTNhNiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsCisJMHgwMDE0LCAweDEwNzgsIDB4NDIwYiwgMHgwMDdjLCAweDBmN2UsIDB4NzA4MCwgMHhhMDA1LCAweDAwNDAsCisJMHgzZGU2LCAweDIwMTEsIDB4NDFkYywgMHgxMDc4LCAweDVhNDUsIDB4YTA4NiwgMHgwMDE0LCAweDAwYzAsCisJMHgzZGU0LCAweDIwNzksIDB4YWI4MCwgMHg3YTMwLCAweGEyOTYsIDB4MTEwNCwgMHgwMGMwLCAweDNkZTQsCisJMHg3ODM0LCAweGEwMDUsIDB4MDBjMCwgMHgzZGU0LCAweDdhMzgsIDB4ZDJmYywgMHgwMDQwLCAweDNkZGUsCisJMHg3MGIwLCAweGEwMDUsIDB4MDBjMCwgMHgzZGRlLCAweDcwYjMsIDB4MDAwMSwgMHg3MDhiLCAweDAwMDgsCisJMHgxMDc4LCAweDNkZTgsIDB4MDA3OCwgMHgzZGU2LCAweDEwNzgsIDB4NDIyNCwgMHgwZjdmLCAweDAwN2MsCisJMHg3MDhiLCAweDAwMDksIDB4MTA3OCwgMHg0Mjg5LCAweDIwYTMsIDB4MTEwNSwgMHgyMGEzLCAweDAxMDAsCisJMHgzNDMwLCAweDEwNzgsIDB4NDJkNCwgMHgwMGMwLCAweDNlMDEsIDB4NzA3NCwgMHhhMDA1LCAweDAwYzAsCisJMHgzZTAxLCAweDEwNzgsIDB4NDEwNCwgMHgwMGMwLCAweDNlMGIsIDB4YTA4NSwgMHgwMDAxLCAweDEwNzgsCisJMHgyNTZhLCAweDIwYTksIDB4MDAwOCwgMHgyMDk5LCAweGFiOGUsIDB4MjZhMCwgMHg1M2E2LCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTQsIDB4MTA3OCwgMHg0MjBiLCAweDAwN2MsCisJMHgwZjdlLCAweDcwODAsIDB4YTAwNSwgMHgwMDQwLCAweDNlNTEsIDB4MjAxMSwgMHg0MWRjLCAweDEwNzgsCisJMHg1YTQ1LCAweGEwODYsIDB4MDAxNCwgMHgwMGMwLCAweDNlNGYsIDB4MjA3OSwgMHhhYjgwLCAweDdhMzAsCisJMHhhMjk2LCAweDExMDUsIDB4MDBjMCwgMHgzZTRmLCAweDc4MzQsIDB4MjAxMSwgMHgwMTAwLCAweGEyMWUsCisJMHgwMGMwLCAweDNlM2EsIDB4N2EzOCwgMHhkMmZjLCAweDAwNDAsIDB4M2UzNCwgMHg3MGIwLCAweGEwMDUsCisJMHgwMGMwLCAweDNlMzQsIDB4NzBiMywgMHgwMDAxLCAweDcwOGIsIDB4MDAwYSwgMHgxMDc4LCAweDNlNTMsCisJMHgwMDc4LCAweDNlNTEsIDB4YTAwNSwgMHgwMGMwLCAweDNlNGYsIDB4N2EzOCwgMHhkMmZjLCAweDAwNDAsCisJMHgzZTQ3LCAweDcwYjAsIDB4YTAwNSwgMHgwMGMwLCAweDNlNDcsIDB4NzBiMywgMHgwMDAxLCAweDcwODcsCisJMHgwMDAwLCAweDcwOGIsIDB4MDAwZSwgMHgxMDc4LCAweDNlZGIsIDB4MDA3OCwgMHgzZTUxLCAweDEwNzgsCisJMHg0MjI0LCAweDBmN2YsIDB4MDA3YywgMHg3MDhiLCAweDAwMGIsIDB4MjAxMSwgMHhhYjBlLCAweDIyYTAsCisJMHgyMGE5LCAweDAwNDAsIDB4MjAxOSwgMHhmZmZmLCAweDQzYTQsIDB4MjBhOSwgMHgwMDAyLCAweDIwMDksCisJMHgwMDAwLCAweDQxYTQsIDB4MTA3OCwgMHg0Mjg5LCAweDIwYTMsIDB4MTEwNiwgMHgyMGEzLCAweDAwMDAsCisJMHgxMDc4LCAweDQyZDQsIDB4MDA0MCwgMHgzZTcwLCAweDIwMTMsIDB4MDAwMCwgMHgwMDc4LCAweDNlNzQsCisJMHg2MDMwLCAweGEwODUsIDB4MDEwMCwgMHgyMDEyLCAweDIyOTgsIDB4MjBhOSwgMHgwMDQyLCAweDUzYTYsCisJMHg2MGMzLCAweDAwODQsIDB4MTA3OCwgMHg0MjBiLCAweDAwN2MsIDB4MGY3ZSwgMHg3MDgwLCAweGEwMDUsCisJMHgwMDQwLCAweDNlOWQsIDB4MjAxMSwgMHg0MWRjLCAweDEwNzgsIDB4NWE0NSwgMHhhMDg2LCAweDAwODQsCisJMHgwMGMwLCAweDNlOWIsIDB4MjA3OSwgMHhhYjgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTA2LCAweDAwYzAsCisJMHgzZTliLCAweDc4MzQsIDB4YTAwNSwgMHgwMGMwLCAweDNlOWIsIDB4NzA4YiwgMHgwMDBjLCAweDEwNzgsCisJMHgzZTlmLCAweDAwNzgsIDB4M2U5ZCwgMHgxMDc4LCAweDQyMjQsIDB4MGY3ZiwgMHgwMDdjLCAweDcwOGIsCisJMHgwMDBkLCAweDEwNzgsIDB4NDI4OSwgMHgyMGEzLCAweDExMDcsIDB4MjBhMywgMHgwMDAwLCAweDIwOTksCisJMHhhYjhlLCAweDIwYTksIDB4MDA0MCwgMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHg2MGMzLCAweDAwODQsIDB4MTA3OCwgMHg0MjBiLCAweDAwN2MsIDB4MGY3ZSwgMHg3MDgwLCAweGEwMDUsCisJMHgwMDQwLCAweDNlZDksIDB4MjAxMSwgMHg0MWRjLCAweDEwNzgsIDB4NWE0NSwgMHhhMDg2LCAweDAwODQsCisJMHgwMGMwLCAweDNlZDcsIDB4MjA3OSwgMHhhYjgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTA3LCAweDAwYzAsCisJMHgzZWQ3LCAweDc4MzQsIDB4YTAwNSwgMHgwMGMwLCAweDNlZDcsIDB4NzA4NywgMHgwMDAxLCAweDEwNzgsCisJMHg0MjdiLCAweDcwOGIsIDB4MDAwZSwgMHgxMDc4LCAweDNlZGIsIDB4MDA3OCwgMHgzZWQ5LCAweDEwNzgsCisJMHg0MjI0LCAweDBmN2YsIDB4MDA3YywgMHg3MDhiLCAweDAwMGYsIDB4NzA4MywgMHgwMDAwLCAweDYwOGIsCisJMHhiYzg1LCAweDYwOGYsIDB4YjViNSwgMHg2MDQzLCAweDAwMDUsIDB4NjA0MywgMHgwMDA0LCAweDIwMDksCisJMHgwN2QwLCAweDIwMTEsIDB4NDFkYywgMHgxMDc4LCAweDVhMzgsIDB4MDA3YywgMHg3MDgwLCAweGEwMDUsCisJMHgwMDQwLCAweDNlZjYsIDB4MjAxMSwgMHg0MWRjLCAweDEwNzgsIDB4NWE0NSwgMHgwMDdjLCAweDcwOGIsCisJMHgwMDExLCAweDEwNzgsIDB4NDJkNCwgMHgwMGMwLCAweDNmMTQsIDB4NzE2YywgMHg4MWZmLCAweDAwNDAsCisJMHgzZjE0LCAweDIwMDksIDB4MDAwMCwgMHg3MDcwLCAweGEwODQsIDB4MDBmZiwgMHgxMDc4LCAweDI1NGQsCisJMHhhMTg2LCAweDAwN2UsIDB4MDA0MCwgMHgzZjE0LCAweGExODYsIDB4MDA4MCwgMHgwMDQwLCAweDNmMTQsCisJMHgyMDExLCAweGFiOGUsIDB4MTA3OCwgMHg0MTlkLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsCisJMHgyMDk5LCAweGFiODAsIDB4MjBhMSwgMHgwMjBiLCAweDc0ODAsIDB4YTQ4MCwgMHgwMDE4LCAweGEwODAsCisJMHgwMDA3LCAweGEwODQsIDB4MDNmOCwgMHg4MDA0LCAweDIwYTgsIDB4NTNhNiwgMHg2MGMzLCAweDAwMTQsCisJMHgxMDc4LCAweDQyMGIsIDB4MDA3YywgMHgwZjdlLCAweDcwODAsIDB4YTAwNSwgMHgwMDQwLCAweDNmNTUsCisJMHgyMDExLCAweDQxZGMsIDB4MTA3OCwgMHg1YTQ1LCAweGEwODYsIDB4MDAxNCwgMHgwMGMwLCAweDNmNTMsCisJMHgyMDc5LCAweGFiODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDMsIDB4MDBjMCwgMHgzZjUzLCAweDc4MzQsCisJMHhhMDA1LCAweDAwYzAsIDB4M2Y1MywgMHg3YTM4LCAweGQyZmMsIDB4MDA0MCwgMHgzZjRkLCAweDcwYjAsCisJMHhhMDA1LCAweDAwYzAsIDB4M2Y0ZCwgMHg3MGIzLCAweDAwMDEsIDB4NzA4YiwgMHgwMDEyLCAweDEwNzgsCisJMHgzZjU3LCAweDAwNzgsIDB4M2Y1NSwgMHgxMDc4LCAweDQyMjQsIDB4MGY3ZiwgMHgwMDdjLCAweDcwOGIsCisJMHgwMDEzLCAweDEwNzgsIDB4NDI5NSwgMHgyMGEzLCAweDExMDMsIDB4MjBhMywgMHgwMDAwLCAweDM0MzAsCisJMHgyMDExLCAweGFiOGUsIDB4MTA3OCwgMHg0MmQ0LCAweDAwYzAsIDB4M2Y3NSwgMHg3MDc0LCAweGEwMDUsCisJMHgwMGMwLCAweDNmNzUsIDB4NzE1MCwgMHhhMTg2LCAweGZmZmYsIDB4MDA0MCwgMHgzZjc1LCAweDEwNzgsCisJMHg0MTlkLCAweDAwNDAsIDB4M2Y3NSwgMHgxMDc4LCAweDQyYjgsIDB4MjBhOSwgMHgwMDA4LCAweDIyOTgsCisJMHgyNmEwLCAweDUzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTQsCisJMHgxMDc4LCAweDQyMGIsIDB4MDA3YywgMHgwZjdlLCAweDcwODAsIDB4YTAwNSwgMHgwMDQwLCAweDNmYWQsCisJMHgyMDExLCAweDQxZGMsIDB4MTA3OCwgMHg1YTQ1LCAweGEwODYsIDB4MDAxNCwgMHgwMGMwLCAweDNmYWIsCisJMHgyMDc5LCAweGFiODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDQsIDB4MDBjMCwgMHgzZmFiLCAweDc4MzQsCisJMHhhMDA1LCAweDAwYzAsIDB4M2ZhYiwgMHg3YTM4LCAweGQyZmMsIDB4MDA0MCwgMHgzZmE1LCAweDcwYjAsCisJMHhhMDA1LCAweDAwYzAsIDB4M2ZhNSwgMHg3MGIzLCAweDAwMDEsIDB4NzA4YiwgMHgwMDE0LCAweDEwNzgsCisJMHgzZmFmLCAweDAwNzgsIDB4M2ZhZCwgMHgxMDc4LCAweDQyMjQsIDB4MGY3ZiwgMHgwMDdjLCAweDcwOGIsCisJMHgwMDE1LCAweDEwNzgsIDB4NDI5NSwgMHgyMGEzLCAweDExMDQsIDB4MjBhMywgMHgwMDAwLCAweDM0MzAsCisJMHgyMDExLCAweGFiOGUsIDB4MTA3OCwgMHg0MmQ0LCAweDAwYzAsIDB4M2ZkNywgMHg3MDc0LCAweGEwMDUsCisJMHgwMGMwLCAweDNmZDcsIDB4NzE1NCwgMHhhMTg2LCAweGZmZmYsIDB4MDA0MCwgMHgzZmQ3LCAweGExODAsCisJMHgyOWMwLCAweDIwMGMsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MTA3OCwgMHg0MTlkLCAweDAwNDAsCisJMHgzZmQ3LCAweDEwNzgsIDB4MzgyMCwgMHgwMDQwLCAweDNmZDcsIDB4MTA3OCwgMHgyNTZhLCAweDIwYTksCisJMHgwMDA4LCAweDIyOTgsIDB4MjZhMCwgMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHg2MGMzLCAweDAwMTQsIDB4MTA3OCwgMHg0MjBiLCAweDAwN2MsIDB4MGY3ZSwgMHg3MDgwLCAweGEwMDUsCisJMHgwMDQwLCAweDQwMmUsIDB4MjAxMSwgMHg0MWRjLCAweDEwNzgsIDB4NWE0NSwgMHhhMDg2LCAweDAwMTQsCisJMHgwMGMwLCAweDQwMmMsIDB4MjA3OSwgMHhhYjgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTA1LCAweDAwYzAsCisJMHg0MDJjLCAweDc4MzQsIDB4MjAxMSwgMHgwMTAwLCAweGEyMWUsIDB4MDBjMCwgMHg0MDBiLCAweDdhMzgsCisJMHhkMmZjLCAweDAwNDAsIDB4NDAwOSwgMHg3MGIwLCAweGEwMDUsIDB4MDBjMCwgMHg0MDA5LCAweDcwYjMsCisJMHgwMDAxLCAweDAwNzgsIDB4NDAxYSwgMHhhMDA1LCAweDAwYzAsIDB4NDAyYywgMHg3YTM4LCAweGQyZmMsCisJMHgwMDQwLCAweDQwMTgsIDB4NzBiMCwgMHhhMDA1LCAweDAwYzAsIDB4NDAxOCwgMHg3MGIzLCAweDAwMDEsCisJMHg3MDg3LCAweDAwMDAsIDB4N2EzOCwgMHhkMmY0LCAweDAwNDAsIDB4NDAyNiwgMHgyMDAxLCAweGE2NzQsCisJMHgyMDA0LCAweGQwYTQsIDB4MDBjMCwgMHg0MDI2LCAweDcwY2YsIDB4MDAwOCwgMHg3MDhiLCAweDAwMTYsCisJMHgxMDc4LCAweDQwMzAsIDB4MDA3OCwgMHg0MDJlLCAweDEwNzgsIDB4NDIyNCwgMHgwZjdmLCAweDAwN2MsCisJMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDIwOTksIDB4YWI4MCwgMHgyMGExLCAweDAyMGIsCisJMHgyMGE5LCAweDAwMGUsIDB4NTNhNiwgMHgzNDMwLCAweDIwMTEsIDB4YWI4ZSwgMHg3MDhiLCAweDAwMTcsCisJMHgxMDc4LCAweDQyZDQsIDB4MDBjMCwgMHg0MDUwLCAweDcwNzQsIDB4YTAwNSwgMHgwMGMwLCAweDQwNTAsCisJMHgxMDc4LCAweDQxMDQsIDB4MDBjMCwgMHg0MDVhLCAweGEwODUsIDB4MDAwMSwgMHgxMDc4LCAweDI1NmEsCisJMHgyMGE5LCAweDAwMDgsIDB4MjA5OSwgMHhhYjhlLCAweDI2YTAsIDB4NTNhNiwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LCAweDEwNzgsIDB4NDIwYiwgMHgwMDdjLCAweDBmN2UsCisJMHg3MDgwLCAweGEwMDUsIDB4MDA0MCwgMHg0MDdmLCAweDIwMTEsIDB4NDFkYywgMHgxMDc4LCAweDVhNDUsCisJMHhhMDg2LCAweDAwODQsIDB4MDBjMCwgMHg0MDdkLCAweDIwNzksIDB4YWI4MCwgMHg3YTMwLCAweGEyOTYsCisJMHgxMTA2LCAweDAwYzAsIDB4NDA3ZCwgMHg3ODM0LCAweGEwMDUsIDB4MDBjMCwgMHg0MDdkLCAweDcwOGIsCisJMHgwMDE4LCAweDEwNzgsIDB4NDA4MSwgMHgwMDc4LCAweDQwN2YsIDB4MTA3OCwgMHg0MjI0LCAweDBmN2YsCisJMHgwMDdjLCAweDcwOGIsIDB4MDAxOSwgMHgxMDc4LCAweDQyOTUsIDB4MjBhMywgMHgxMTA2LCAweDIwYTMsCisJMHgwMDAwLCAweDM0MzAsIDB4MjA5OSwgMHhhYjhlLCAweDIwMzksIDB4YWIwZSwgMHgyN2EwLCAweDIwYTksCisJMHgwMDQwLCAweDUzYTMsIDB4MTA3OCwgMHg0MmQ0LCAweDAwYzAsIDB4NDBiNSwgMHgyNzI4LCAweDI1MTQsCisJMHg4MjA3LCAweGEwODQsIDB4MDBmZiwgMHg4MDAwLCAweDIwMTgsIDB4YTI5NCwgMHgwMGZmLCAweDgwMDcsCisJMHhhMjA1LCAweDIwMmEsIDB4NjAzMCwgMHgyMzEwLCAweDgyMTQsIDB4YTJhMCwgMHhhYjBlLCAweDI0MTQsCisJMHhhMzhjLCAweDAwMDEsIDB4MDA0MCwgMHg0MGIwLCAweGEyOTQsIDB4ZmYwMCwgMHgwMDc4LCAweDQwYjMsCisJMHhhMjk0LCAweDAwZmYsIDB4ODAwNywgMHhhMjE1LCAweDIyMjIsIDB4Mjc5OCwgMHgyNmEwLCAweDIwYTksCisJMHgwMDQwLCAweDUzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwODQsCisJMHgxMDc4LCAweDQyMGIsIDB4MDA3YywgMHgwZjdlLCAweDcwODAsIDB4YTAwNSwgMHgwMDQwLCAweDQwZTcsCisJMHgyMDExLCAweDQxZGMsIDB4MTA3OCwgMHg1YTQ1LCAweGEwODYsIDB4MDA4NCwgMHgwMGMwLCAweDQwZTUsCisJMHgyMDc5LCAweGFiODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDcsIDB4MDBjMCwgMHg0MGU1LCAweDc4MzQsCisJMHhhMDA1LCAweDAwYzAsIDB4NDBlNSwgMHg3MDg3LCAweDAwMDEsIDB4MTA3OCwgMHg0MjdiLCAweDcwOGIsCisJMHgwMDFhLCAweDEwNzgsIDB4NDBlOSwgMHgwMDc4LCAweDQwZTcsIDB4MTA3OCwgMHg0MjI0LCAweDBmN2YsCisJMHgwMDdjLCAweDcwOGIsIDB4MDAxYiwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDIwOTksCisJMHhhYjgwLCAweDIwYTEsIDB4MDIwYiwgMHg3NDgwLCAweGE0ODAsIDB4MDAxOCwgMHhhMDgwLCAweDAwMDcsCisJMHhhMDg0LCAweDAzZjgsIDB4ODAwNCwgMHgyMGE4LCAweDUzYTYsIDB4NjBjMywgMHgwMDg0LCAweDEwNzgsCisJMHg0MjBiLCAweDAwN2MsIDB4MDA3YywgMHgwMDdjLCAweDA4N2UsIDB4MDk3ZSwgMHgyMDI5LCAweGE2NTMsCisJMHgyNTJjLCAweDIwYTksIDB4MDAwOCwgMHgyMDQxLCAweGFiMGUsIDB4MjhhMCwgMHgyMDk5LCAweGFiOGUsCisJMHg1M2EzLCAweDIwYTksIDB4MDAwOCwgMHgyMDExLCAweDAwMDcsIDB4ZDVkNCwgMHgwMDQwLCAweDQxMWEsCisJMHgyMDExLCAweDAwMDAsIDB4MjgwMCwgMHhhMjAwLCAweDIwMGMsIDB4YTFhNiwgMHhmZmZmLCAweDAwYzAsCisJMHg0MTJjLCAweGQ1ZDQsIDB4MDA0MCwgMHg0MTI3LCAweDgyMTAsIDB4MDA3OCwgMHg0MTI4LCAweDgyMTEsCisJMHgwMGYwLCAweDQxMWEsIDB4MDA3OCwgMHg0MTk0LCAweDgyZmYsIDB4MDBjMCwgMHg0MTNlLCAweGQ1ZDQsCisJMHgwMDQwLCAweDQxMzgsIDB4YTFhNiwgMHgzZmZmLCAweDAwNDAsIDB4NDEyNCwgMHgwMDc4LCAweDQxM2MsCisJMHhhMWE2LCAweDNmZmYsIDB4MDA0MCwgMHg0MTk0LCAweGExOGQsIDB4YzAwMCwgMHgyMGE5LCAweDAwMTAsCisJMHgyMDE5LCAweDAwMDEsIDB4ZDVkNCwgMHgwMDQwLCAweDQxNDcsIDB4MjAxOSwgMHgwMDEwLCAweDIxMjAsCisJMHhkNWQ0LCAweDAwNDAsIDB4NDE0ZSwgMHg4NDIzLCAweDAwNzgsIDB4NDE0ZiwgMHg4NDI0LCAweDAwYzgsCisJMHg0MTVjLCAweGQ1ZDQsIDB4MDA0MCwgMHg0MTU3LCAweDgzMTksIDB4MDA3OCwgMHg0MTU4LCAweDgzMTgsCisJMHgwMGYwLCAweDQxNDgsIDB4MDA3OCwgMHg0MTk0LCAweDIzYTgsIDB4MjAyMSwgMHgwMDAxLCAweDg0MjYsCisJMHg4NDI1LCAweDAwZjAsIDB4NDE2MCwgMHgyMzI4LCAweDg1MjksIDB4YTJiZSwgMHgwMDA3LCAweDAwNDAsCisJMHg0MTc0LCAweDAwN2UsIDB4MjAzOSwgMHgwMDA3LCAweDIyMDAsIDB4YTczYSwgMHgwMDdmLCAweDI3YTgsCisJMHhhNWE4LCAweDAwMTAsIDB4MDBmMCwgMHg0MTcwLCAweDc1NTIsIDB4YTVjOCwgMHgyOWMwLCAweDI5MmMsCisJMHhhNWFjLCAweDAwZmYsIDB4NjUzMiwgMHg2MGU3LCAweDAwMDAsIDB4NjVlYSwgMHg3MDZmLCAweDAwMDAsCisJMHg3NTcyLCAweDIwMTgsIDB4MjMwNCwgMHhhNDA1LCAweDIwMWEsIDB4NzA3NywgMHgwMDAxLCAweDI2YTAsCisJMHgyODk4LCAweDIwYTksIDB4MDAwOCwgMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwgMHg0MTlhLCAweGEwMDYsIDB4MDA3OCwgMHg0MTlhLCAweGEwMDYsCisJMHgxMDc4LCAweDEzMzIsIDB4MDk3ZiwgMHgwODdmLCAweDAwN2MsIDB4MjExOCwgMHgyMDIxLCAweDAwMDAsCisJMHgyMDAxLCAweDAwMDcsIDB4YTM5YSwgMHgwMDEwLCAweDAwNDgsIDB4NDFhYSwgMHg4NDIwLCAweDgwMDEsCisJMHgwMDc4LCAweDQxYTIsIDB4MjExOCwgMHg4NGZmLCAweDAwNDAsIDB4NDFiMywgMHhhMzlhLCAweDAwMTAsCisJMHg4NDIxLCAweDAwYzAsIDB4NDFhZSwgMHgyMDIxLCAweDAwMDEsIDB4ODNmZiwgMHgwMDQwLCAweDQxYmMsCisJMHg4NDIzLCAweDgzMTksIDB4MDBjMCwgMHg0MWI4LCAweGEyMzgsIDB4MjcwNCwgMHhhNDJjLCAweDAwYzAsCisJMHg0MWQ0LCAweGE0MDUsIDB4MjAzYSwgMHg3MTUyLCAweGExYTAsIDB4MjljMCwgMHgyNDJjLCAweGE1YWMsCisJMHgwMGZmLCAweDY1MzIsIDB4NjBlNywgMHgwMDAwLCAweDY1ZWEsIDB4NzA2ZiwgMHgwMDAwLCAweDc1NzIsCisJMHg3MDc3LCAweDAwMDEsIDB4YTA4NCwgMHgwMDAwLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGE2MDAsCisJMHg3MDdiLCAweDAwMDAsIDB4MGU3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MGY3ZSwgMHgyMDAxLCAweDAwMDIsCisJMHgxMDc4LCAweDVhZTYsIDB4MjA3OSwgMHgwMTAwLCAweDIwNzEsIDB4MDE0MCwgMHgxMDc4LCAweDZlMGYsCisJMHg3MDA0LCAweGEwODQsIDB4NDAwMCwgMHgwMDQwLCAweDQxZjEsIDB4NzAwMywgMHgxMDAwLCAweDcwMDMsCisJMHgwMDAwLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YTYyMiwgMHgyMDczLCAweDAwMDAsCisJMHg3ODQwLCAweDAyN2UsIDB4MDE3ZSwgMHgyMDA5LCAweDAwZjcsIDB4MTA3OCwgMHg0MmExLCAweDAxN2YsCisJMHhhMDk0LCAweDAwMTAsIDB4YTI4NSwgMHgwMDgwLCAweDc4NDIsIDB4N2E0MiwgMHgwMjdmLCAweDEyN2YsCisJMHgwZjdmLCAweDBlN2YsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDExLCAweGE4YmIsCisJMHgyMDEzLCAweDAwMDAsIDB4NzA4MywgMHgwMDAwLCAweDEyN2YsIDB4MjBlMSwgMHg5MDgwLCAweDYwYTMsCisJMHgwMDU2LCAweDYwYTcsIDB4OTU3NSwgMHgxMDc4LCAweDZlMDYsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsCisJMHg0MWRjLCAweDEwNzgsIDB4NWFkZCwgMHgwMDdjLCAweDAxN2UsIDB4MDI3ZSwgMHgwYzdlLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MjAxMSwgMHgwMDAzLCAweDEwNzgsIDB4NzBlMCwgMHgyMDExLCAweDAwMDIsCisJMHgxMDc4LCAweDcwZWEsIDB4MTA3OCwgMHg2ZmM0LCAweDAzN2UsIDB4MjAxOSwgMHgwMDAwLCAweDEwNzgsCisJMHg3MDU4LCAweDAzN2YsIDB4MjAwOSwgMHgwMGY3LCAweDEwNzgsIDB4NDJhMSwgMHgyMDYxLCAweGE4YzQsCisJMHg2MDFiLCAweDAwMDAsIDB4NjAxZiwgMHgwMDAwLCAweDIwNjEsIDB4YTYwMCwgMHg2MDAzLCAweDAwMDEsCisJMHgyMDYxLCAweDAxMDAsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHgyMDA5LCAweDAwMmQsCisJMHgyMDExLCAweDQyNTksIDB4MTA3OCwgMHg1YTM4LCAweDEyN2YsIDB4MGM3ZiwgMHgwMjdmLCAweDAxN2YsCisJMHgwMDdjLCAweDBlN2UsIDB4MDA3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDAxLCAweDAwMDEsCisJMHgxMDc4LCAweDVhZTYsIDB4MjA3MSwgMHgwMTAwLCAweDEwNzgsIDB4NmUwZiwgMHgyMDcxLCAweDAxNDAsCisJMHg3MDA0LCAweGEwODQsIDB4NDAwMCwgMHgwMDQwLCAweDQyNzEsIDB4NzAwMywgMHgxMDAwLCAweDcwMDMsCisJMHgwMDAwLCAweDIwMDEsIDB4MDAwMSwgMHgxMDc4LCAweDI0ZTgsIDB4MTA3OCwgMHg0MjI0LCAweDEyN2YsCisJMHgwMDdmLCAweDBlN2YsIDB4MDA3YywgMHgyMGE5LCAweDAwNDAsIDB4MjBhMSwgMHhhY2MwLCAweDIwOTksCisJMHhhYjhlLCAweDMzMDQsIDB4ODAwNywgMHgyMGEyLCAweDkzOTgsIDB4OTRhMCwgMHgwMGYwLCAweDQyODEsCisJMHgwMDdjLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4MjA5OSwgMHhhYjAwLCAweDIwYTEsCisJMHgwMjBiLCAweDIwYTksIDB4MDAwYywgMHg1M2E2LCAweDAwN2MsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsCisJMHg0MDAwLCAweDIwOTksIDB4YWI4MCwgMHgyMGExLCAweDAyMGIsIDB4MjBhOSwgMHgwMDBjLCAweDUzYTYsCisJMHgwMDdjLCAweDBjN2UsIDB4MDA3ZSwgMHgyMDYxLCAweDAxMDAsIDB4ODEwZiwgMHgyMDAxLCAweGE2MmYsCisJMHgyMDA0LCAweGEwMDUsIDB4MDBjMCwgMHg0MmIyLCAweDYwMzAsIDB4YTA4NCwgMHgwMGZmLCAweGExMDUsCisJMHgwMDc4LCAweDQyYjQsIDB4YTE4NSwgMHgwMGY3LCAweDYwNGEsIDB4MDA3ZiwgMHgwYzdmLCAweDAwN2MsCisJMHgwMTdlLCAweDA0N2UsIDB4MjAwMSwgMHhhNjUzLCAweDIwMDQsIDB4ZDBhNCwgMHgwMDQwLCAweDQyY2IsCisJMHhhMDA2LCAweDIwMjAsIDB4MjAwOSwgMHgwMDJhLCAweDEwNzgsIDB4YTIxZCwgMHgyMDAxLCAweGE2MGMsCisJMHgyMDBjLCAweGMxOTUsIDB4MjEwMiwgMHgyMDE5LCAweDAwMmEsIDB4MjAwOSwgMHgwMDAwLCAweDEwNzgsCisJMHgyODRmLCAweDA0N2YsIDB4MDE3ZiwgMHgwMDdjLCAweDAwN2UsIDB4MjAwMSwgMHhhNjBjLCAweDIwMDQsCisJMHhkMDljLCAweDAwNDAsIDB4NDJkYiwgMHgwMDdmLCAweDAwN2MsIDB4MDA3ZSwgMHgwMTdlLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MjAwMSwgMHgwMTAxLCAweDIwMGMsIDB4YTE4ZCwgMHgwMDA2LCAweDIxMDIsCisJMHgxMjdmLCAweDAxN2YsIDB4MDA3ZiwgMHgwMDdjLCAweDE1N2UsIDB4MjBhOSwgMHgwMGZmLCAweDIwMDksCisJMHhhNzM1LCAweGEwMDYsIDB4MjAwYSwgMHg4MTA4LCAweDAwZjAsIDB4NDJmMiwgMHgxNTdmLCAweDAwN2MsCisJMHgwZDdlLCAweDAzN2UsIDB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4MjA2OSwgMHhhNjUyLCAweGEwMDYsCisJMHg2MDAyLCAweDYwMDcsIDB4MDcwNywgMHg2MDBhLCAweDYwMGUsIDB4NjAxMiwgMHhhMTk4LCAweDI5YzAsCisJMHgyMzFjLCAweGEzOWMsIDB4MDBmZiwgMHg2MzE2LCAweDIwYTksIDB4MDAwNCwgMHhhYzk4LCAweDAwMDYsCisJMHgyM2EwLCAweDQwYTQsIDB4MjBhOSwgMHgwMDA0LCAweGFjOTgsIDB4MDAwYSwgMHgyM2EwLCAweDQwYTQsCisJMHg2MDNlLCAweDYwNDIsIDB4NjA0ZSwgMHg2MDUyLCAweDYwNTYsIDB4NjA1YSwgMHg2MDVlLCAweDYwNjIsCisJMHg2MDY2LCAweDYwNmEsIDB4NjA2ZSwgMHg2MDcyLCAweDYwNzYsIDB4NjA3YSwgMHg2MDdlLCAweDYwODIsCisJMHg2MDg2LCAweDYwOGEsIDB4NjA4ZSwgMHg2MDkyLCAweDYwOTYsIDB4NjA5YSwgMHg2MDllLCAweDYwYWUsCisJMHg2MWEyLCAweDBkN2UsIDB4NjBhNCwgMHhhMDZkLCAweDAwNDAsIDB4NDMzOCwgMHgxMDc4LCAweDEzYTQsCisJMHg2MGE3LCAweDAwMDAsIDB4NjBhOCwgMHhhMDZkLCAweDAwNDAsIDB4NDM0MCwgMHgxMDc4LCAweDEzYTQsCisJMHg2MGFiLCAweDAwMDAsIDB4MGQ3ZiwgMHhhMDA2LCAweDYwNGEsIDB4NjgxMCwgMHg2MDNhLCAweDY4MGMsCisJMHg2MDQ2LCAweDY4MTQsIDB4YTA4NCwgMHgwMGZmLCAweDYwNDIsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsCisJMHgwMzdmLCAweDBkN2YsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2OTQ0LCAweDZlNDgsCisJMHhhNjg0LCAweDNmZmYsIDB4YTA4MiwgMHg0MDAwLCAweDAwYzgsIDB4NDQyNCwgMHhhMThjLCAweGZmMDAsCisJMHg4MTBmLCAweGExODIsIDB4MDBmZiwgMHgwMGM4LCAweDQ0MmEsIDB4MjAwMSwgMHhhNjBjLCAweDIwMDQsCisJMHhhMDg0LCAweDAwMDMsIDB4MDA0MCwgMHg0Mzg1LCAweDIwMDEsIDB4YTYwYywgMHgyMDA0LCAweGQwODQsCisJMHgwMGMwLCAweDQ0MDUsIDB4YTE4OCwgMHhhNzM1LCAweDIxMDQsIDB4YTA2NSwgMHgwMDQwLCAweDQ0MDUsCisJMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDhlLCAweDAwMDYsIDB4MDBjMCwgMHg0NDA1LCAweDYwMDAsCisJMHhkMGM0LCAweDAwNDAsIDB4NDQwNSwgMHgwMDc4LCAweDQzOTIsIDB4YTE4OCwgMHhhNzM1LCAweDIxMDQsCisJMHhhMDY1LCAweDAwNDAsIDB4NDNlOSwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDhlLCAweDAwMDYsCisJMHgwMGMwLCAweDQzZWYsIDB4NjBhNCwgMHhhMDBkLCAweDAwNDAsIDB4NDM5YSwgMHgxMDc4LCAweDQ4MTcsCisJMHgwMDQwLCAweDQzZTMsIDB4NjBhOCwgMHhhMDBkLCAweDAwNDAsIDB4NDNiNCwgMHgxMDc4LCAweDQ4NmEsCisJMHgwMGMwLCAweDQzYjQsIDB4Njk0YywgMHhkMWZjLCAweDAwYzAsIDB4NDNhYSwgMHgxMDc4LCAweDQ0ZGYsCisJMHgwMDc4LCAweDQzZGUsIDB4MTA3OCwgMHg0NDg0LCAweDY5NGMsIDB4ZDFlYywgMHgwMGMwLCAweDQzZGUsCisJMHgxMDc4LCAweDQ2ZDYsIDB4MDA3OCwgMHg0M2RlLCAweDY5NGMsIDB4YTE4NCwgMHhhMDAwLCAweDAwNDAsCisJMHg0M2NlLCAweGQxZWMsIDB4MDA0MCwgMHg0M2M3LCAweGQxZmMsIDB4MDA0MCwgMHg0M2MzLCAweDEwNzgsCisJMHg0NmU3LCAweDAwNzgsIDB4NDNjYSwgMHgxMDc4LCAweDQ2ZTcsIDB4MDA3OCwgMHg0M2NlLCAweGQxZmMsCisJMHgwMDQwLCAweDQzY2UsIDB4MTA3OCwgMHg0NDg0LCAweDAwNzgsIDB4NDNkZSwgMHg2MDUwLCAweGEwMGQsCisJMHgwMDQwLCAweDQzZDksIDB4MmQwMCwgMHgyMDBhLCAweDY4MDMsIDB4MDAwMCwgMHg2MDUyLCAweDAwNzgsCisJMHg0M2RlLCAweDJkMDAsIDB4NjA1MiwgMHg2MDRlLCAweDY4MDMsIDB4MDAwMCwgMHgxMDc4LCAweDVkYTksCisJMHhhMDA2LCAweDEyN2YsIDB4MDA3YywgMHgyMDAxLCAweDAwMDUsIDB4MjAwOSwgMHgwMDAwLCAweDAwNzgsCisJMHg0NDJlLCAweDIwMDEsIDB4MDAyOCwgMHgyMDA5LCAweDAwMDAsIDB4MDA3OCwgMHg0NDJlLCAweGEwODIsCisJMHgwMDA2LCAweDAwYzgsIDB4NDQwNSwgMHg2MGEwLCAweGQwYmMsIDB4MDBjMCwgMHg0NDAxLCAweDYxMDAsCisJMHhkMWZjLCAweDAwNDAsIDB4NDM5MiwgMHgyMDAxLCAweDAwMjksIDB4MjAwOSwgMHgxMDAwLCAweDAwNzgsCisJMHg0NDJlLCAweDIwMDEsIDB4MDAyOCwgMHgwMDc4LCAweDQ0MjAsIDB4MjAwOSwgMHhhNjBjLCAweDIxMGMsCisJMHhkMThjLCAweDAwNDAsIDB4NDQwZiwgMHgyMDAxLCAweDAwMDQsIDB4MDA3OCwgMHg0NDIwLCAweGQxODQsCisJMHgwMDQwLCAweDQ0MTYsIDB4MjAwMSwgMHgwMDA0LCAweDAwNzgsIDB4NDQyMCwgMHgyMDAxLCAweDAwMjksCisJMHg2MTAwLCAweGQxZmMsIDB4MDA0MCwgMHg0NDIwLCAweDIwMDksIDB4MTAwMCwgMHgwMDc4LCAweDQ0MmUsCisJMHgyMDA5LCAweDAwMDAsIDB4MDA3OCwgMHg0NDJlLCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LCAweDAwMDAsCisJMHgwMDc4LCAweDQ0MmUsIDB4MjAwMSwgMHgwMDI5LCAweDIwMDksIDB4MDAwMCwgMHhhMDA1LCAweDEyN2YsCisJMHgwMDdjLCAweDY5NDQsIDB4NmU0OCwgMHhhNjg0LCAweDNmZmYsIDB4YTA4MiwgMHg0MDAwLCAweDAwYzgsCisJMHg0NDdlLCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweGExODIsIDB4MDBmZiwgMHgwMGM4LCAweDQ0NjQsCisJMHhhMTg4LCAweGE3MzUsIDB4MjEwNCwgMHhhMDY1LCAweDAwNDAsIDB4NDQ2NCwgMHg2MDA0LCAweGEwODQsCisJMHgwMGZmLCAweGEwOGUsIDB4MDAwNiwgMHgwMGMwLCAweDQ0NmEsIDB4Njg0YywgMHhkMGVjLCAweDAwNDAsCisJMHg0NDU3LCAweDEwNzgsIDB4NDZlNywgMHgxMDc4LCAweDQ0ODQsIDB4MDA3OCwgMHg0NDVmLCAweDEwNzgsCisJMHg0NDg0LCAweDY4NGMsIDB4ZDBmYywgMHgwMDQwLCAweDQ0NWYsIDB4MTA3OCwgMHg0NmQ2LCAweDEwNzgsCisJMHg0NzJmLCAweGEwMDYsIDB4MDA3OCwgMHg0NDgyLCAweDIwMDEsIDB4MDAyOCwgMHgyMDA5LCAweDAwMDAsCisJMHgwMDc4LCAweDQ0ODIsIDB4YTA4MiwgMHgwMDA2LCAweDAwYzgsIDB4NDQ3OCwgMHg2MTAwLCAweGQxZmMsCisJMHgwMDQwLCAweDQ0NGQsIDB4MjAwMSwgMHgwMDI5LCAweDIwMDksIDB4MTAwMCwgMHgwMDc4LCAweDQ0ODIsCisJMHgyMDAxLCAweDAwMjksIDB4MjAwOSwgMHgwMDAwLCAweDAwNzgsIDB4NDQ4MiwgMHgyMDAxLCAweDAwMjksCisJMHgyMDA5LCAweDAwMDAsIDB4YTAwNSwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYwNTAsCisJMHhhMDBkLCAweDAwNDAsIDB4NDQ5MiwgMHgyZDAwLCAweDIwMGEsIDB4NjgwMywgMHgwMDAwLCAweDYwNTIsCisJMHgxMjdmLCAweDAwN2MsIDB4MmQwMCwgMHg2MDUyLCAweDYwNGUsIDB4NjgwMywgMHgwMDAwLCAweDAwNzgsCisJMHg0NDkwLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYwNGMsIDB4YTAwNSwgMHgwMDQwLCAweDQ0YWYsCisJMHgwZTdlLCAweDIwNzEsIDB4YThiMSwgMHg3MDA0LCAweGEwODYsIDB4MDAwMiwgMHgwMDQwLCAweDQ0YjYsCisJMHgwZTdmLCAweDYwNGMsIDB4NjgwMiwgMHgyZDAwLCAweDYwNGUsIDB4MTI3ZiwgMHgwMDdjLCAweDJkMDAsCisJMHg2MDUyLCAweDYwNGUsIDB4NjgwMywgMHgwMDAwLCAweDAwNzgsIDB4NDRhZCwgMHg3MDFjLCAweGFjMDYsCisJMHgwMGMwLCAweDQ0YTgsIDB4NjA0YywgMHgyMDcwLCAweDcwMDAsIDB4NjgwMiwgMHgyZDAwLCAweDcwMDIsCisJMHgwZTdmLCAweDEyN2YsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MDRjLCAweGEwNmQsCisJMHgwMDQwLCAweDQ0ZDEsIDB4NjgwMCwgMHhhMDA1LCAweDAwYzAsIDB4NDRjZiwgMHg2MDUyLCAweDYwNGUsCisJMHhhZDA1LCAweDEyN2YsIDB4MDA3YywgMHg2MDRjLCAweGEwNmQsIDB4MDA0MCwgMHg0NGRlLCAweDY4MDAsCisJMHhhMDA1LCAweDAwYzAsIDB4NDRkYywgMHg2MDUyLCAweDYwNGUsIDB4YWQwNSwgMHgwMDdjLCAweDY4MDMsCisJMHgwMDAwLCAweDYwODQsIDB4YTAwZCwgMHgwMDQwLCAweDQ0ZTksIDB4MmQwMCwgMHgyMDBhLCAweDYwODYsCisJMHgwMDdjLCAweDJkMDAsIDB4NjA4NiwgMHg2MDgyLCAweDAwNzgsIDB4NDRlOCwgMHgxMjdlLCAweDBjN2UsCisJMHgwMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MjE4LCAweDIyNjAsIDB4NjIwMCwgMHhhMDA1LCAweDAwNDAsCisJMHg0NGZjLCAweGMyODUsIDB4MDA3OCwgMHg0NGZkLCAweGMyODQsIDB4NjIwMiwgMHgwMjdmLCAweDBjN2YsCisJMHgxMjdmLCAweDAwN2MsIDB4MTI3ZSwgMHgwYzdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MjE4LCAweDIyNjAsCisJMHg2MjA0LCAweDAwN2UsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4NDUyMSwgMHg2MDljLCAweGQwYWMsCisJMHgwMDQwLCAweDQ1MjEsIDB4MjAwMSwgMHhhNjUzLCAweDIwMDQsIDB4ZDBhNCwgMHgwMDQwLCAweDQ1MjEsCisJMHhhMjg0LCAweGZmMDAsIDB4ODAwNywgMHhhMDg2LCAweDAwMDcsIDB4MDBjMCwgMHg0NTIxLCAweDIwMTEsCisJMHgwNjAwLCAweDAwN2YsIDB4YTI5NCwgMHhmZjAwLCAweGEyMTUsIDB4NjIwNiwgMHgwMDdlLCAweGEwODYsCisJMHgwMDA2LCAweDAwYzAsIDB4NDUzMSwgMHg2MjkwLCAweDgyZmYsIDB4MDBjMCwgMHg0NTMxLCAweDEwNzgsCisJMHgxMzMyLCAweDAwN2YsIDB4MGM3ZiwgMHgxMjdmLCAweDAwN2MsIDB4MTI3ZSwgMHgwYzdlLCAweDIwOTEsCisJMHg4MDAwLCAweDYyMTgsIDB4MjI2MCwgMHg2MjA0LCAweDAwN2UsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsCisJMHg0NTUzLCAweDYwOWMsIDB4ZDBhNCwgMHgwMDQwLCAweDQ1NTMsIDB4MjAwMSwgMHhhNjUzLCAweDIwMDQsCisJMHhkMGFjLCAweDAwYzAsIDB4NDU1MywgMHhhMjg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA3LCAweDAwYzAsCisJMHg0NTUzLCAweDIwMTEsIDB4MDAwNiwgMHgwMDdmLCAweGEyOTQsIDB4MDBmZiwgMHg4MDA3LCAweGEyMTUsCisJMHg2MjA2LCAweDBjN2YsIDB4MTI3ZiwgMHgwMDdjLCAweDAyN2UsIDB4YTE4MiwgMHgwMGZmLCAweDAwNDgsCisJMHg0NTY1LCAweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDQ1N2QsIDB4YTE5MCwgMHhhNzM1LCAweDIyMDQsCisJMHhhMDY1LCAweDAwYzAsIDB4NDU3YywgMHgwMTdlLCAweDBkN2UsIDB4MTA3OCwgMHgxMzcwLCAweDJkNjAsCisJMHgwZDdmLCAweDAxN2YsIDB4MDA0MCwgMHg0NTYxLCAweDJjMDAsIDB4MjAxMiwgMHg2MGE3LCAweDAwMDAsCisJMHg2MGFiLCAweDAwMDAsIDB4MTA3OCwgMHg0MmY4LCAweGEwMDYsIDB4MDI3ZiwgMHgwMDdjLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MDI3ZSwgMHhhMTgyLCAweDAwZmYsIDB4MDA0OCwgMHg0NThiLCAweGEwODUsCisJMHgwMDAxLCAweDAwNzgsIDB4NDVjMSwgMHgwZDdlLCAweGExOTAsIDB4YTczNSwgMHgyMjA0LCAweGEwNmQsCisJMHgwMDQwLCAweDQ1YmYsIDB4MjAxMywgMHgwMDAwLCAweDBkN2UsIDB4MGM3ZSwgMHgyZDYwLCAweDYwYTQsCisJMHhhMDZkLCAweDAwNDAsIDB4NDU5ZCwgMHgxMDc4LCAweDEzYTQsIDB4NjBhOCwgMHhhMDZkLCAweDAwNDAsCisJMHg0NWEzLCAweDEwNzgsIDB4MTNhNCwgMHgwYzdmLCAweDBkN2YsIDB4MGQ3ZSwgMHgwYzdlLCAweDY4YWMsCisJMHgyMDYwLCAweDhjZmYsIDB4MDA0MCwgMHg0NWJiLCAweDYwMGMsIDB4MDA3ZSwgMHg2MDEwLCAweDIwNjgsCisJMHgxMDc4LCAweDhkMDYsIDB4MDA0MCwgMHg0NWI2LCAweDEwNzgsIDB4MTNiNCwgMHgxMDc4LCAweDc3MmQsCisJMHgwYzdmLCAweDAwNzgsIDB4NDVhOSwgMHgwYzdmLCAweDBkN2YsIDB4MTA3OCwgMHgxM2E0LCAweDBkN2YsCisJMHhhMDA2LCAweDAyN2YsIDB4MTI3ZiwgMHgwMDdjLCAweDAxN2UsIDB4YTE4MiwgMHgwMGZmLCAweDAwNDgsCisJMHg0NWNkLCAweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDQ1ZDQsIDB4YTE4OCwgMHhhNzM1LCAweDIxMDQsCisJMHhhMDY1LCAweDAwNDAsIDB4NDVjOSwgMHhhMDA2LCAweDAxN2YsIDB4MDA3YywgMHgwZDdlLCAweDE1N2UsCisJMHgxMzdlLCAweDE0N2UsIDB4NjAwYiwgMHgwMDAwLCAweDYwMGYsIDB4MDAwMCwgMHg2MDAwLCAweGMwOGMsCisJMHg2MDAyLCAweDIwNjksIDB4YWI4ZSwgMHg2ODA4LCAweDYwNWUsIDB4NjgxMCwgMHg2MDYyLCAweDYxMzgsCisJMHhhMTBhLCAweDAwNDgsIDB4NDVlYywgMHg2MDNhLCAweDY4MTQsIDB4NjA2NiwgMHgyMDk5LCAweGFiOTYsCisJMHhhYzg4LCAweDAwMGEsIDB4MjFhMCwgMHgyMGE5LCAweDAwMDQsIDB4NTNhMywgMHgyMDk5LCAweGFiOWEsCisJMHhhYzg4LCAweDAwMDYsIDB4MjFhMCwgMHgyMGE5LCAweDAwMDQsIDB4NTNhMywgMHgyMDY5LCAweGFiYWUsCisJMHg2ODA4LCAweDYwNmEsIDB4NjkwYywgMHg2MTZlLCAweDY4MTAsIDB4NjA3MiwgMHg2ODE4LCAweDYwNzYsCisJMHg2MGEwLCAweGEwODYsIDB4MDA3ZSwgMHgwMGMwLCAweDQ2MTEsIDB4MjA2OSwgMHhhYjhlLCAweDY5MGMsCisJMHg2MTZlLCAweGExODIsIDB4MDIxMSwgMHgwMGM4LCAweDQ2MTksIDB4MjAwOSwgMHgwMDA4LCAweDAwNzgsCisJMHg0NjQzLCAweGExODIsIDB4MDI1OSwgMHgwMGM4LCAweDQ2MjEsIDB4MjAwOSwgMHgwMDA3LCAweDAwNzgsCisJMHg0NjQzLCAweGExODIsIDB4MDJjMSwgMHgwMGM4LCAweDQ2MjksIDB4MjAwOSwgMHgwMDA2LCAweDAwNzgsCisJMHg0NjQzLCAweGExODIsIDB4MDM0OSwgMHgwMGM4LCAweDQ2MzEsIDB4MjAwOSwgMHgwMDA1LCAweDAwNzgsCisJMHg0NjQzLCAweGExODIsIDB4MDQyMSwgMHgwMGM4LCAweDQ2MzksIDB4MjAwOSwgMHgwMDA0LCAweDAwNzgsCisJMHg0NjQzLCAweGExODIsIDB4MDU4MSwgMHgwMGM4LCAweDQ2NDEsIDB4MjAwOSwgMHgwMDAzLCAweDAwNzgsCisJMHg0NjQzLCAweDIwMDksIDB4MDAwMiwgMHg2MTkyLCAweDE0N2YsIDB4MTM3ZiwgMHgxNTdmLCAweDBkN2YsCisJMHgwMDdjLCAweDAxN2UsIDB4MDI3ZSwgMHgwZTdlLCAweDIwNzEsIDB4YWI4ZCwgMHgyZTA0LCAweDY4OTYsCisJMHgyMDcxLCAweGFiOGUsIDB4NzAwNCwgMHg2ODlhLCAweDcwMWMsIDB4Njg5ZSwgMHg2YTAwLCAweDIwMDksCisJMHhhNjcyLCAweDIxMGMsIDB4ZDBiYywgMHgwMDQwLCAweDQ2NjMsIDB4ZDFlYywgMHgwMDQwLCAweDQ2NjMsCisJMHhjMmFkLCAweDAwNzgsIDB4NDY2NCwgMHhjMmFjLCAweGQwYzQsIDB4MDA0MCwgMHg0NjZkLCAweGQxZTQsCisJMHgwMDQwLCAweDQ2NmQsIDB4YzJiZCwgMHgwMDc4LCAweDQ2NmUsIDB4YzJiYywgMHg2YTAyLCAweDBlN2YsCisJMHgwMjdmLCAweDAxN2YsIDB4MDA3YywgMHgwZDdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYwYTQsCisJMHhhMDZkLCAweDAwNDAsIDB4NDY5NywgMHg2OTAwLCAweDgxZmYsIDB4MDBjMCwgMHg0NmFiLCAweDZhMDQsCisJMHhhMjgyLCAweDAwMTAsIDB4MDBjOCwgMHg0NmIwLCAweGFkODgsIDB4MDAwNCwgMHgyMGE5LCAweDAwMTAsCisJMHgyMTA0LCAweGEwODYsIDB4ZmZmZiwgMHgwMDQwLCAweDQ2OTIsIDB4ODEwOCwgMHgwMGYwLCAweDQ2ODgsCisJMHgxMDc4LCAweDEzMzIsIDB4MjYwYSwgMHg4MjEwLCAweDZhMDYsIDB4MDA3OCwgMHg0NmFiLCAweDEwNzgsCisJMHgxMzhiLCAweDAwNDAsIDB4NDZiMCwgMHgyZDAwLCAweDYwYTYsIDB4NjgwMywgMHgwMDAwLCAweGFkODgsCisJMHgwMDA0LCAweDIwYTksIDB4MDAxMCwgMHgyMDBiLCAweGZmZmYsIDB4ODEwOCwgMHgwMGYwLCAweDQ2YTMsCisJMHg2ODA3LCAweDAwMDEsIDB4NmUxMiwgMHhhMDg1LCAweDAwMDEsIDB4MTI3ZiwgMHgwZDdmLCAweDAwN2MsCisJMHhhMDA2LCAweDAwNzgsIDB4NDZhZCwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwZDdlLCAweDYwYTQsCisJMHhhMDBkLCAweDAwNDAsIDB4NDZkMywgMHgyMTY4LCAweDY4MDAsIDB4YTAwNSwgMHgwMGMwLCAweDQ2Y2YsCisJMHgxMDc4LCAweDQ4MTcsIDB4MDBjMCwgMHg0NmQzLCAweDIwMGIsIDB4ZmZmZiwgMHg2ODA0LCAweGEwOGEsCisJMHgwMDAyLCAweDAwNDgsIDB4NDZjZiwgMHg4MDAxLCAweDY4MDYsIDB4MDA3OCwgMHg0NmQzLCAweDEwNzgsCisJMHgxM2E0LCAweDYwYTcsIDB4MDAwMCwgMHgwZDdmLCAweDEyN2YsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDEwNzgsIDB4NDg3ZiwgMHgwMDc4LCAweDQ2ZGYsIDB4MTA3OCwgMHg0NDg0LCAweDEwNzgsCisJMHg0Nzc1LCAweDAwYzAsIDB4NDZkZCwgMHgxMDc4LCAweDQ3MmYsIDB4MTI3ZiwgMHgwMDdjLCAweDBkN2UsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MGE4LCAweGEwNmQsIDB4MDA0MCwgMHg0NzBiLCAweDY5NTAsCisJMHg4MWZmLCAweDAwYzAsIDB4NDcxZiwgMHg2YTU0LCAweGEyODIsIDB4MDAxMCwgMHgwMGM4LCAweDQ3MmMsCisJMHhhZDg4LCAweDAwMTgsIDB4MjBhOSwgMHgwMDEwLCAweDIxMDQsIDB4YTA4NiwgMHhmZmZmLCAweDAwNDAsCisJMHg0NzA2LCAweDgxMDgsIDB4MDBmMCwgMHg0NmZjLCAweDEwNzgsIDB4MTMzMiwgMHgyNjBhLCAweDgyMTAsCisJMHg2YTU2LCAweDAwNzgsIDB4NDcxZiwgMHgxMDc4LCAweDEzOGIsIDB4MDA0MCwgMHg0NzJjLCAweDJkMDAsCisJMHg2MGFhLCAweDY4NTMsIDB4MDAwMCwgMHhhZDg4LCAweDAwMTgsIDB4MjBhOSwgMHgwMDEwLCAweDIwMGIsCisJMHhmZmZmLCAweDgxMDgsIDB4MDBmMCwgMHg0NzE3LCAweDY4NTcsIDB4MDAwMSwgMHg2ZTYyLCAweDAwNzgsCisJMHg0NzIzLCAweDEwNzgsIDB4NDRkZiwgMHgxMDc4LCAweDQ3MzksIDB4MDBjMCwgMHg0NzIxLCAweGEwODUsCisJMHgwMDAxLCAweDEyN2YsIDB4MGQ3ZiwgMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHg0NzI5LCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg1ZGE5LCAweDEyN2YsIDB4MDA3YywgMHhhMDFlLCAweDAwNzgsCisJMHg0NzNiLCAweDIwMTksIDB4MDAwMSwgMHhhMDBlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYwNGMsCisJMHgyMDY4LCAweDYwMDAsIDB4ZDBkYywgMHgwMGMwLCAweDQ3NTksIDB4OGRmZiwgMHgwMDQwLCAweDQ3NzAsCisJMHg4M2ZmLCAweDAwNDAsIDB4NDc1MSwgMHg2ODQ4LCAweGE2MDYsIDB4MDA0MCwgMHg0NzVlLCAweDAwNzgsCisJMHg0NzU5LCAweDY4M2MsIDB4YTQwNiwgMHgwMGMwLCAweDQ3NTksIDB4Njg0MCwgMHhhNTA2LCAweDAwNDAsCisJMHg0NzVlLCAweDJkMDgsIDB4NjgwMCwgMHgyMDY4LCAweDAwNzgsIDB4NDc0NSwgMHgxMDc4LCAweDcyMzMsCisJMHg2YTAwLCAweDYwNGMsIDB4YWQwNiwgMHgwMGMwLCAweDQ3NjgsIDB4NjI0ZSwgMHgwMDc4LCAweDQ3NmIsCisJMHhhMTgwLCAweDAwMDAsIDB4MjIwMiwgMHg4MmZmLCAweDAwYzAsIDB4NDc3MCwgMHg2MTUyLCAweDhkZmYsCisJMHgxMjdmLCAweDAwN2MsIDB4YTAxZSwgMHgwMDc4LCAweDQ3NzcsIDB4MjAxOSwgMHgwMDAxLCAweGEwMGUsCisJMHg2MDgwLCAweDIwNjgsIDB4OGRmZiwgMHgwMDQwLCAweDQ3YTMsIDB4ODNmZiwgMHgwMDQwLCAweDQ3ODYsCisJMHg2ODQ4LCAweGE2MDYsIDB4MDA0MCwgMHg0NzkzLCAweDAwNzgsIDB4NDc4ZSwgMHg2ODNjLCAweGE0MDYsCisJMHgwMGMwLCAweDQ3OGUsIDB4Njg0MCwgMHhhNTA2LCAweDAwNDAsIDB4NDc5MywgMHgyZDA4LCAweDY4MDAsCisJMHgyMDY4LCAweDAwNzgsIDB4NDc3YSwgMHg2YTAwLCAweDYwODAsIDB4YWQwNiwgMHgwMGMwLCAweDQ3OWIsCisJMHg2MjgyLCAweDAwNzgsIDB4NDc5ZSwgMHhhMTgwLCAweDAwMDAsIDB4MjIwMiwgMHg4MmZmLCAweDAwYzAsCisJMHg0N2EzLCAweDYxODYsIDB4OGRmZiwgMHgwMDdjLCAweGEwMTYsIDB4MTA3OCwgMHg0ODEwLCAweDAwYzAsCisJMHg0N2FiLCAweDIwMTEsIDB4MDAwMSwgMHgxMDc4LCAweDQ4NjMsIDB4MDBjMCwgMHg0N2IxLCAweGEyOTUsCisJMHgwMDAyLCAweDAwN2MsIDB4MTA3OCwgMHg0ODliLCAweDAwNDAsIDB4NDdiYSwgMHgxMDc4LCAweDhkY2EsCisJMHgwMDc4LCAweDQ3YmMsIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsIDB4MTA3OCwgMHg0ODliLCAweDAwNDAsCisJMHg0N2M1LCAweDEwNzgsIDB4OGQ2MiwgMHgwMDc4LCAweDQ3YzcsIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsCisJMHgxMDc4LCAweDQ4OWIsIDB4MDA0MCwgMHg0N2QwLCAweDEwNzgsIDB4OGRhYywgMHgwMDc4LCAweDQ3ZDIsCisJMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHgxMDc4LCAweDQ4OWIsIDB4MDA0MCwgMHg0N2RiLCAweDEwNzgsCisJMHg4ZDdlLCAweDAwNzgsIDB4NDdkZCwgMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHgxMDc4LCAweDQ4OWIsCisJMHgwMDQwLCAweDQ3ZTYsIDB4MTA3OCwgMHg4ZGU4LCAweDAwNzgsIDB4NDdlOCwgMHhhMDg1LCAweDAwMDEsCisJMHgwMDdjLCAweDEyN2UsIDB4MDA3ZSwgMHgwZDdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MDgwLCAweGEwNmQsCisJMHgwMDQwLCAweDQ4MDgsIDB4NjgwMCwgMHgwMDdlLCAweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsCisJMHgwMDAwLCAweDEwNzgsIDB4OGY3ZCwgMHgwMDdlLCAweDYwMDAsIDB4ZDBmYywgMHgwMDQwLCAweDQ4MDIsCisJMHgxMDc4LCAweGE0ZWQsIDB4MDA3ZiwgMHgxMDc4LCAweDRhNzMsIDB4MDA3ZiwgMHgwMDc4LCAweDQ3ZWYsCisJMHg2MDgzLCAweDAwMDAsIDB4NjA4NywgMHgwMDAwLCAweDBkN2YsIDB4MDA3ZiwgMHgxMjdmLCAweDAwN2MsCisJMHg2MGE0LCAweGEwMGQsIDB4MDBjMCwgMHg0ODE3LCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweDBlN2UsCisJMHgyMTcwLCAweDcwMDAsIDB4YTAwNSwgMHgwMGMwLCAweDQ4MmMsIDB4MjBhOSwgMHgwMDEwLCAweGFlODgsCisJMHgwMDA0LCAweDIxMDQsIDB4YTYwNiwgMHgwMDQwLCAweDQ4MmMsIDB4ODEwOCwgMHgwMGYwLCAweDQ4MjEsCisJMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwgMHg0ODJkLCAweGEwMDYsIDB4MGU3ZiwgMHgwMDdjLCAweDBkN2UsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MGE0LCAweGEwNmQsIDB4MDBjMCwgMHg0ODNkLCAweDEwNzgsCisJMHgxMzhiLCAweDAwNDAsIDB4NDg0ZiwgMHgyZDAwLCAweDYwYTYsIDB4NjgwMywgMHgwMDAxLCAweDY4MDcsCisJMHgwMDAwLCAweGFkODgsIDB4MDAwNCwgMHgyMGE5LCAweDAwMTAsIDB4MjAwYiwgMHhmZmZmLCAweDgxMDgsCisJMHgwMGYwLCAweDQ4NDUsIDB4YTA4NSwgMHgwMDAxLCAweDEyN2YsIDB4MGQ3ZiwgMHgwMDdjLCAweGEwMDYsCisJMHgwMDc4LCAweDQ4NGMsIDB4MGQ3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MGE0LCAweGEwNmQsCisJMHgwMDQwLCAweDQ4NjAsIDB4NjBhNywgMHgwMDAwLCAweDEwNzgsIDB4MTNhNCwgMHhhMDg1LCAweDAwMDEsCisJMHgxMjdmLCAweDBkN2YsIDB4MDA3YywgMHg2MGE4LCAweGEwMGQsIDB4MDBjMCwgMHg0ODZhLCAweGEwODUsCisJMHgwMDAxLCAweDAwN2MsIDB4MGU3ZSwgMHgyMTcwLCAweDcwNTAsIDB4YTAwNSwgMHgwMGMwLCAweDQ4N2QsCisJMHgyMGE5LCAweDAwMTAsIDB4YWU4OCwgMHgwMDE4LCAweDIxMDQsIDB4YTYwNiwgMHgwMDQwLCAweDQ4N2QsCisJMHg4MTA4LCAweDAwZjAsIDB4NDg3NCwgMHhhMDg1LCAweDAwMDEsIDB4MGU3ZiwgMHgwMDdjLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg0ODYzLCAweDAwYzAsIDB4NDg5OSwgMHgyMDBiLCAweGZmZmYsCisJMHgwZDdlLCAweDYwYTgsIDB4MjA2OCwgMHg2ODU0LCAweGEwOGEsIDB4MDAwMiwgMHgwMDQ4LCAweDQ4OTQsCisJMHg4MDAxLCAweDY4NTYsIDB4MDA3OCwgMHg0ODk4LCAweDEwNzgsIDB4MTNhNCwgMHg2MGFiLCAweDAwMDAsCisJMHgwZDdmLCAweDEyN2YsIDB4MDA3YywgMHg2MDljLCAweGQwYTQsIDB4MDA3YywgMHgwZjdlLCAweDcxYjAsCisJMHg4MWZmLCAweDAwYzAsIDB4NDhiOSwgMHg3MWNjLCAweGQxOWMsIDB4MDA0MCwgMHg0OGI5LCAweDIwMDEsCisJMHgwMDdlLCAweGEwODAsIDB4YTczNSwgMHgyMDA0LCAweGEwN2QsIDB4MDA0MCwgMHg0OGI5LCAweDc4MDQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4NDhiOSwgMHg3ODAwLCAweGMwZWQsCisJMHg3ODAyLCAweDIwNzksIDB4YTY1MiwgMHg3ODA0LCAweGQwYTQsIDB4MDA0MCwgMHg0OGRmLCAweDE1N2UsCisJMHgwYzdlLCAweDIwYTksIDB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsIDB4MDE3ZSwgMHgxMDc4LCAweDQ1YzQsCisJMHgwMGMwLCAweDQ4ZDksIDB4NjAwNCwgMHhhMDg0LCAweGZmMDAsIDB4ODAwNywgMHhhMDk2LCAweDAwMDQsCisJMHgwMDQwLCAweDQ4ZDYsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4NDhkOSwgMHg2MDAwLCAweGMwZWQsCisJMHg2MDAyLCAweDAxN2YsIDB4ODEwOCwgMHgwMGYwLCAweDQ4YzUsIDB4MGM3ZiwgMHgxNTdmLCAweDEwNzgsCisJMHg0OTY3LCAweDAwNDAsIDB4NDhlOCwgMHgyMDAxLCAweGE4YTEsIDB4MjAwYywgMHgwMDc4LCAweDQ4ZjAsCisJMHgyMDc5LCAweGE2NTIsIDB4NzgwNCwgMHhkMGE0LCAweDAwNDAsIDB4NDhmNCwgMHgyMDA5LCAweDA3ZDAsCisJMHgyMDExLCAweDQ4ZjYsIDB4MTA3OCwgMHg1YWRkLCAweDBmN2YsIDB4MDA3YywgMHgyMDExLCAweDQ4ZjYsCisJMHgxMDc4LCAweDVhNDUsIDB4MTA3OCwgMHg0OTY3LCAweDAwNDAsIDB4NDkxZSwgMHgyMDAxLCAweGE3YjMsCisJMHgyMDA0LCAweGEwODAsIDB4MDAwMCwgMHgyMDBjLCAweGMxZWMsIDB4MjEwMiwgMHgyMDAxLCAweGE2NTMsCisJMHgyMDA0LCAweGQwYTQsIDB4MDA0MCwgMHg0OTEyLCAweDIwMDksIDB4MDdkMCwgMHgyMDExLCAweDQ4ZjYsCisJMHgxMDc4LCAweDVhZGQsIDB4MGU3ZSwgMHgyMDcxLCAweGE2MDAsIDB4NzA2ZiwgMHgwMDAwLCAweDcwNzMsCisJMHgwMDAwLCAweDEwNzgsIDB4MjY3NywgMHgwZTdmLCAweDAwNzgsIDB4NDk1NiwgMHgxNTdlLCAweDBjN2UsCisJMHgyMGE5LCAweDAwN2YsIDB4MjAwOSwgMHgwMDAwLCAweDAxN2UsIDB4MTA3OCwgMHg0NWM0LCAweDAwYzAsCisJMHg0OTUwLCAweDYwMDAsIDB4ZDBlYywgMHgwMDQwLCAweDQ5NTAsIDB4MDQ3ZSwgMHg2MmEwLCAweGEyOTQsCisJMHgwMGZmLCAweDgyMjcsIDB4YTAwNiwgMHgyMDA5LCAweDAwMjksIDB4MTA3OCwgMHhhMjFkLCAweDYwMDAsCisJMHhjMGU1LCAweGMwZWMsIDB4NjAwMiwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg1LCAweDA3MDAsCisJMHg2MDA2LCAweDIwMTksIDB4MDAyOSwgMHgxMDc4LCAweDVmMDEsIDB4MDc3ZSwgMHgyMDM5LCAweDAwMDAsCisJMHgxMDc4LCAweDVlMGEsIDB4MjAwOSwgMHgwMDAwLCAweDEwNzgsIDB4OWY4YiwgMHgwNzdmLCAweDA0N2YsCisJMHgwMTdmLCAweDgxMDgsIDB4MDBmMCwgMHg0OTI0LCAweDBjN2YsIDB4MTU3ZiwgMHgwMDdjLCAweDBjN2UsCisJMHg2MDE4LCAweDIwNjAsIDB4NjAwMCwgMHhjMGVjLCAweDYwMDIsIDB4MGM3ZiwgMHgwMDdjLCAweDc4MTgsCisJMHgyMDA0LCAweGQwYWMsIDB4MDA3YywgMHg3ODE4LCAweDIwMDQsIDB4ZDBiYywgMHgwMDdjLCAweDBmN2UsCisJMHgyMDAxLCAweGE3YjMsIDB4MjAwNCwgMHhhMDdkLCAweDAwNDAsIDB4NDk3MCwgMHg3ODAwLCAweGQwZWMsCisJMHgwZjdmLCAweDAwN2MsIDB4MTI3ZSwgMHgwMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwMDdlLCAweDYyYTAsCisJMHhhMjkwLCAweGE3MzUsIDB4MjIwNCwgMHhhYzA2LCAweDEwYzAsIDB4MTMzMiwgMHgwMDdmLCAweDYyMDAsCisJMHhhMDA1LCAweDAwNDAsIDB4NDk4NiwgMHhjMmZkLCAweDAwNzgsIDB4NDk4NywgMHhjMmZjLCAweDYyMDIsCisJMHgwMjdmLCAweDEyN2YsIDB4MDA3YywgMHgyMDExLCAweGE2MzMsIDB4MjIwNCwgMHhkMGNjLCAweDAwNDAsCisJMHg0OTk4LCAweDIwMDEsIDB4YTg5ZiwgMHgyMDBjLCAweDIwMTEsIDB4NDk5OSwgMHgxMDc4LCAweDVhZGQsCisJMHgwMDdjLCAweDIwMTEsIDB4NDk5OSwgMHgxMDc4LCAweDVhNDUsIDB4MjAxMSwgMHhhNjMzLCAweDIyMDQsCisJMHhjMGNjLCAweDIwMTIsIDB4MDA3YywgMHgyMDcxLCAweGE3MTQsIDB4NzAwMywgMHgwMDAxLCAweDcwMDcsCisJMHgwMDAwLCAweDcwMTMsIDB4MDAwMCwgMHg3MDE3LCAweDAwMDAsIDB4NzAxYiwgMHgwMDAwLCAweDcwMWYsCisJMHgwMDAwLCAweDcwMGIsIDB4MDAwMCwgMHg3MDRiLCAweDAwMDEsIDB4NzA0ZiwgMHgwMDAwLCAweDcwNWIsCisJMHgwMDIwLCAweDcwNWYsIDB4MDA0MCwgMHg3MDdmLCAweDAwMDAsIDB4MjA3MSwgMHhhODdkLCAweDcwMDMsCisJMHhhNzE0LCAweDcwMDcsIDB4MDAwMCwgMHg3MDBiLCAweDAwMDAsIDB4NzAwZiwgMHhhODVkLCAweDcwMTMsCisJMHgwMDIwLCAweDcwMTcsIDB4MDA0MCwgMHg3MDM3LCAweDAwMDAsIDB4MDA3YywgMHgwMTdlLCAweDBlN2UsCisJMHgyMDcxLCAweGE4MzUsIDB4YTAwZSwgMHg3MTg2LCAweDcxOGEsIDB4NzA5NywgMHgwMDAxLCAweDIwMDEsCisJMHhhNjUzLCAweDIwMDQsIDB4ZDBmYywgMHgwMGMwLCAweDQ5ZTgsIDB4MjAwMSwgMHhhNjUzLCAweDIwMDQsCisJMHhhMDBlLCAweGQwOWMsIDB4MDA0MCwgMHg0OWU1LCAweDgxMDgsIDB4NzEwMiwgMHgwMDc4LCAweDRhM2IsCisJMHgyMDAxLCAweGE2NzIsIDB4MjAwYywgMHhhMTg0LCAweDAwMGYsIDB4MjAwOSwgMHhhNjczLCAweDIxMGMsCisJMHgwMDc5LCAweDQ5ZjIsIDB4NDlkZCwgMHg0YTEzLCAweDRhMWIsIDB4NGEyNiwgMHg0YTJjLCAweDQ5ZGQsCisJMHg0OWRkLCAweDQ5ZGQsIDB4NGEwMiwgMHg0OWRkLCAweDQ5ZGQsIDB4NDlkZCwgMHg0OWRkLCAweDQ5ZGQsCisJMHg0OWRkLCAweDQ5ZGQsIDB4NzAwMywgMHgwMDA0LCAweDEzN2UsIDB4MTQ3ZSwgMHgxNTdlLCAweDIwOTksCisJMHhhNjc2LCAweDIwYTEsIDB4YTg4NiwgMHgyMGE5LCAweDAwMDQsIDB4NTNhMywgMHgxNTdmLCAweDE0N2YsCisJMHgxMzdmLCAweDAwNzgsIDB4NGEzYiwgMHg3MDhmLCAweDAwMDUsIDB4NzAwNywgMHgwMTIyLCAweDIwMDEsCisJMHgwMDAyLCAweDAwNzgsIDB4NGEyMSwgMHg3MDhmLCAweDAwMDIsIDB4NzAwNywgMHgwMTIxLCAweDIwMDEsCisJMHgwMDAzLCAweDcwMDIsIDB4NzA5NywgMHgwMDAxLCAweDAwNzgsIDB4NGEzOCwgMHg3MDA3LCAweDAxMjIsCisJMHgyMDAxLCAweDAwMDIsIDB4MDA3OCwgMHg0YTMwLCAweDcwMDcsIDB4MDEyMSwgMHgyMDAxLCAweDAwMDMsCisJMHg3MDAyLCAweGEwMDYsIDB4NzA5NiwgMHg3MDhlLCAweGExODQsIDB4ZmYwMCwgMHg4MDA3LCAweDcwOWEsCisJMHhhMTg0LCAweDAwZmYsIDB4NzA5MiwgMHgwZTdmLCAweDAxN2YsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsCisJMHhhNzE0LCAweDY4NGMsIDB4YTAwNSwgMHgwMGMwLCAweDRhNGMsIDB4NzAyOCwgMHhjMDg1LCAweDcwMmEsCisJMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwgMHg0YTcxLCAweDZhNjAsIDB4NzIzNiwgMHg2YjY0LCAweDczM2EsCisJMHg2ODY4LCAweDcwM2UsIDB4NzA3NiwgMHg2ODZjLCAweDcwNDIsIDB4NzA3YSwgMHg2ODRjLCAweDcwMmUsCisJMHg2ODQ0LCAweDcwMzIsIDB4MjAwOSwgMHgwMDBkLCAweDIwMGEsIDB4NzAwYiwgMHgwMDAwLCAweDgwMDcsCisJMHg4MDA2LCAweDgwMDYsIDB4YTA4YywgMHgwMDNmLCAweGEwODQsIDB4ZmZjMCwgMHhhMjEwLCAweDIxMDAsCisJMHhhMzE5LCAweDcyNmUsIDB4NzM3MiwgMHg3MDI4LCAweGMwODQsIDB4NzAyYSwgMHg3MDA3LCAweDAwMDEsCisJMHhhMDA2LCAweDBlN2YsIDB4MDA3YywgMHgwZTdlLCAweDAyN2UsIDB4NjgzOCwgMHhkMGZjLCAweDAwYzAsCisJMHg0YWM5LCAweDY4MDQsIDB4YTAwZCwgMHgwMDQwLCAweDRhOGYsIDB4MGQ3ZSwgMHgyMDcxLCAweGE2MDAsCisJMHhhMDE2LCAweDcwMmMsIDB4MjE2OCwgMHg2OTA0LCAweDIwNmEsIDB4ODIxMCwgMHgyZDAwLCAweDgxZmYsCisJMHgwMGMwLCAweDRhODIsIDB4NzAyZSwgMHg3MGFjLCAweGEyMDAsIDB4NzBhZSwgMHgwZDdmLCAweDIwNzEsCisJMHhhNzE0LCAweDcwMWMsIDB4YTAwNSwgMHgwMGMwLCAweDRhZGIsIDB4MDA2OCwgMHg0YWQ5LCAweDIwNzEsCisJMHhhODM1LCAweDcyMDAsIDB4ODJmZiwgMHgwMDQwLCAweDRhZDksIDB4NjkzNCwgMHhhMTg2LCAweDAxMDMsCisJMHgwMGMwLCAweDRhZWMsIDB4Njk0OCwgMHg2ODQ0LCAweGExMDUsIDB4MDBjMCwgMHg0YWNjLCAweDIwMDksCisJMHg4MDIwLCAweDIyMDAsIDB4MDA3OSwgMHg0YWFjLCAweDRhZDksIDB4NGFiMSwgMHg0YjA5LCAweDRiMTcsCisJMHg0YWQ5LCAweDIwNzEsIDB4MDAwMCwgMHg3MDE4LCAweGQwODQsIDB4MDBjMCwgMHg0YWQ5LCAweDcxMjIsCisJMHg2ODNjLCAweDcwMjYsIDB4Njg0MCwgMHg3MDJhLCAweDcwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsCisJMHgyMDcxLCAweGE2MDAsIDB4NzAyYywgMHgyMDZhLCAweDJkMDAsIDB4NzAyZSwgMHg3MGFjLCAweDgwMDAsCisJMHg3MGFlLCAweDAyN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDY4NDQsIDB4YTA4NiwgMHgwMTAwLCAweDAwYzAsCisJMHg0YWQ5LCAweDY4NjgsIDB4YTAwNSwgMHgwMGMwLCAweDRhZDksIDB4MjAwOSwgMHg4MDIwLCAweDAwNzgsCisJMHg0YWE5LCAweDIwNzEsIDB4YTcxNCwgMHgyZDA4LCAweDIwNmIsIDB4MDAwMCwgMHg3MDEwLCAweDgwMDAsCisJMHg3MDEyLCAweDcwMTgsIDB4YTA2ZCwgMHg3MTFhLCAweDAwNDAsIDB4NGFlOSwgMHg2OTAyLCAweDAwNzgsCisJMHg0YWVhLCAweDcxMWUsIDB4MDA3OCwgMHg0YWM5LCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMTcsCisJMHgwMDQwLCAweDRhZmEsIDB4YTE4NiwgMHgwMDFlLCAweDAwNDAsIDB4NGFmYSwgMHhhMThlLCAweDAwMWYsCisJMHgwMGMwLCAweDRhZDksIDB4Njg0YywgMHhkMGNjLCAweDAwNDAsIDB4NGFkOSwgMHg2ODUwLCAweGEwODQsCisJMHgwMGZmLCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDRhZDksIDB4MjAwOSwgMHg4MDIxLCAweDAwNzgsCisJMHg0YWE5LCAweDcwODQsIDB4ODAwOCwgMHhhMDkyLCAweDAwMWUsIDB4MDBjOCwgMHg0YWQ5LCAweDcxODYsCisJMHhhZTkwLCAweDAwMDMsIDB4YTIxMCwgMHg2ODNjLCAweDIwMTIsIDB4MDA3OCwgMHg0YjI3LCAweDcwODQsCisJMHg4MDA4LCAweGEwOTIsIDB4MDAwZiwgMHgwMGM4LCAweDRhZDksIDB4NzE4NiwgMHhhZTkwLCAweDAwMDMsCisJMHg4MDAzLCAweGEyMTAsIDB4NjgzYywgMHgyMDEyLCAweDgyMTAsIDB4Njg0MCwgMHgyMDEyLCAweDcwODgsCisJMHhhMTBhLCAweDAwNDgsIDB4NGFjMCwgMHg3MThjLCAweDcwODQsIDB4YTEwYSwgMHgwMDQ4LCAweDRhYzAsCisJMHgyMDcxLCAweDAwMDAsIDB4NzAxOCwgMHhkMDg0LCAweDAwYzAsIDB4NGFjMCwgMHgyMDcxLCAweGE4MzUsCisJMHg3MDAwLCAweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDRiNDcsIDB4MTA3OCwgMHg0ZGMzLCAweDIwNzEsCisJMHgwMDAwLCAweDcwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MDA3OCwgMHg0YWMwLCAweDEwNzgsCisJMHg0ZGVlLCAweDIwNzEsIDB4MDAwMCwgMHg3MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDAwNzgsCisJMHg0YWMwLCAweDAwN2UsIDB4Njg0YywgMHgwMDdlLCAweDY4MzcsIDB4MDEwMywgMHgyMGE5LCAweDAwMWMsCisJMHhhZDgwLCAweDAwMTEsIDB4MjBhMCwgMHgyMDAxLCAweDAwMDAsIDB4NDBhNCwgMHgwMDdmLCAweGEwODQsCisJMHgwMGZmLCAweDY4NGUsIDB4MDA3ZiwgMHg2ODRhLCAweDY5NTIsIDB4MDA3YywgMHgyMDcxLCAweGE3MTQsCisJMHg3MDA0LCAweDAwNzksIDB4NGI2YiwgMHg0Yjc1LCAweDRiODYsIDB4NGQ5NCwgMHg0ZDk1LCAweDRkYmMsCisJMHg0ZGMyLCAweDRiNzYsIDB4NGQ4MiwgMHg0ZDIzLCAweDRkYTUsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDAwNjgsIDB4NGI4NSwgMHgyMDA5LCAweDAwMGQsIDB4NzAzMCwgMHgyMDBhLCAweDIwOTEsCisJMHg0MDgwLCAweDcwMDcsIDB4MDAwMSwgMHg3MDBiLCAweDAwMDAsIDB4MTI3ZiwgMHgyMDY5LCAweGE4YzQsCisJMHg2ODQ0LCAweGEwMDUsIDB4MDA1MCwgMHg0YmFlLCAweDAwYzAsIDB4NGJhZSwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDIwNjksIDB4MDAwMCwgMHg2OTM0LCAweDIwMDEsIDB4YTcyMCwgMHgyMDA0LCAweGExMGEsCisJMHgwMDQwLCAweDRiYTksIDB4MDA2OCwgMHg0YmFkLCAweDIwNjksIDB4MDAwMCwgMHg2ODE4LCAweGQwODQsCisJMHgwMGMwLCAweDRiYWQsIDB4MjAwOSwgMHg4MDQwLCAweDY5MjIsIDB4NjgxYiwgMHgwMDAxLCAweDIwOTEsCisJMHg0MDgwLCAweDIwNjksIDB4YThjNCwgMHg2ODQ3LCAweGZmZmYsIDB4MTI3ZiwgMHgyMDY5LCAweGE2MDAsCisJMHg2ODQ4LCAweDY5NjQsIDB4YTEwMiwgMHgyMDY5LCAweGE4MzUsIDB4Njg4YSwgMHg2OTg0LCAweDcwMWMsCisJMHhhMDZkLCAweDAwNDAsIDB4NGJjMCwgMHg4MWZmLCAweDAwNDAsIDB4NGMwOCwgMHgwMDc4LCAweDRiZDYsCisJMHg4MWZmLCAweDAwNDAsIDB4NGNkYSwgMHgyMDcxLCAweGE4MzUsIDB4NzE4NCwgMHg3MDg4LCAweGExMGEsCisJMHgwMGM4LCAweDRiZDYsIDB4NzE5MCwgMHgyMDcxLCAweGE4YzQsIDB4NzA0MCwgMHhhMDA1LCAweDAwNDAsCisJMHg0YmQ2LCAweDAwZDAsIDB4NGNkYSwgMHg3MTQyLCAweDAwNzgsIDB4NGNkYSwgMHgyMDcxLCAweGE4MzUsCisJMHg3MThjLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDcwODQsIDB4YTEwYSwgMHgwMDQ4LCAweDRjZjcsCisJMHgwMDY4LCAweDRjOGMsIDB4MjA3MSwgMHgwMDAwLCAweDcwMTgsIDB4ZDA4NCwgMHgwMGMwLCAweDRjOGMsCisJMHgyMDAxLCAweGZmZmYsIDB4MjA3MSwgMHhhOGM0LCAweDcwNDIsIDB4MjA3MSwgMHhhODM1LCAweDcwMDAsCisJMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHg0YmZlLCAweDEwNzgsIDB4NGRjMywgMHgyMDcxLCAweDAwMDAsCisJMHg3MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDAwNzgsIDB4NGM4YywgMHgxMDc4LCAweDRkZWUsCisJMHgyMDcxLCAweDAwMDAsIDB4NzAxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgwMDc4LCAweDRjOGMsCisJMHgyMDcxLCAweGE4MzUsIDB4NzAwMCwgMHhhMDA1LCAweDAwNDAsIDB4NGNiOSwgMHg2OTM0LCAweGExODYsCisJMHgwMTAzLCAweDAwYzAsIDB4NGM4ZiwgMHg2ODRjLCAweGQwYmMsIDB4MDBjMCwgMHg0Y2I5LCAweDY5NDgsCisJMHg2ODQ0LCAweGExMDUsIDB4MDBjMCwgMHg0Y2FjLCAweDIwMDksIDB4ODAyMCwgMHgyMDcxLCAweGE4MzUsCisJMHg3MDAwLCAweDAwNzksIDB4NGMyMywgMHg0Y2I5LCAweDRjNzEsIDB4NGM0OSwgMHg0YzViLCAweDRjMjgsCisJMHgxMzdlLCAweDE0N2UsIDB4MTU3ZSwgMHgyMDk5LCAweGE2NzYsIDB4MjBhMSwgMHhhODg2LCAweDIwYTksCisJMHgwMDA0LCAweDUzYTMsIDB4MTU3ZiwgMHgxNDdmLCAweDEzN2YsIDB4MjA3MSwgMHhhODdkLCAweGFkODAsCisJMHgwMDBmLCAweDcwMGUsIDB4NzAxMywgMHgwMDAyLCAweDcwMDcsIDB4MDAwMiwgMHg3MDBiLCAweDAwMDAsCisJMHgyZTEwLCAweDEwNzgsIDB4MTNkYiwgMHgyMDcxLCAweGE3MTQsIDB4NzAwNywgMHgwMDA5LCAweDAwNzgsCisJMHg0Y2RhLCAweDcwODQsIDB4ODAwOCwgMHhhMDkyLCAweDAwMWUsIDB4MDBjOCwgMHg0Y2RhLCAweGFlOTAsCisJMHgwMDAzLCAweGEyMTAsIDB4NjgzYywgMHgyMDEyLCAweDcxODYsIDB4MjA3MSwgMHhhNzE0LCAweDEwNzgsCisJMHg0ZTRjLCAweDAwNzgsIDB4NGNkYSwgMHg3MDg0LCAweDgwMDgsIDB4YTA5MiwgMHgwMDBmLCAweDAwYzgsCisJMHg0Y2RhLCAweGFlOTAsIDB4MDAwMywgMHg4MDAzLCAweGEyMTAsIDB4NjgzYywgMHgyMDEyLCAweDgyMTAsCisJMHg2ODQwLCAweDIwMTIsIDB4NzE4NiwgMHgyMDcxLCAweGE3MTQsIDB4MTA3OCwgMHg0ZTRjLCAweDAwNzgsCisJMHg0Y2RhLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDAwNjgsIDB4NGM4YywgMHgyMDcxLCAweDAwMDAsCisJMHg3MDE4LCAweGQwODQsIDB4MDBjMCwgMHg0YzhjLCAweDcxMjIsIDB4NjgzYywgMHg3MDI2LCAweDY4NDAsCisJMHg3MDJhLCAweDcwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MTI3ZiwgMHgyMDcxLCAweGE3MTQsCisJMHgxMDc4LCAweDRlNGMsIDB4MDA3OCwgMHg0Y2RhLCAweDEyN2YsIDB4MDA3OCwgMHg0Y2RhLCAweGExOGMsCisJMHgwMGZmLCAweGExODYsIDB4MDAxNywgMHgwMDQwLCAweDRjOWQsIDB4YTE4NiwgMHgwMDFlLCAweDAwNDAsCisJMHg0YzlkLCAweGExOGUsIDB4MDAxZiwgMHgwMGMwLCAweDRjYjksIDB4Njg0YywgMHhkMGNjLCAweDAwNDAsCisJMHg0Y2I5LCAweDY4NTAsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDRjYjksCisJMHgyMDA5LCAweDgwMjEsIDB4MDA3OCwgMHg0YzFlLCAweDY4NDQsIDB4YTA4NiwgMHgwMTAwLCAweDAwYzAsCisJMHg0Y2I5LCAweDY4NjgsIDB4YTAwNSwgMHgwMGMwLCAweDRjYjksIDB4MjAwOSwgMHg4MDIwLCAweDAwNzgsCisJMHg0YzFlLCAweDIwNzEsIDB4YTcxNCwgMHgxMDc4LCAweDRlNjAsIDB4MDA0MCwgMHg0Y2RhLCAweDIwNzEsCisJMHhhNzE0LCAweDcwMGYsIDB4MDAwMSwgMHg2OTM0LCAweGExODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDMsCisJMHgwMGMwLCAweDRjZDEsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4ODEwMSwgMHgwMDQwLCAweDRjZDEsCisJMHg3MTBlLCAweDcwMDcsIDB4MDAwMywgMHgxMDc4LCAweDRlODAsIDB4NzA1MCwgMHhhMDg2LCAweDAxMDAsCisJMHgwMDQwLCAweDRkOTUsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhNzE0LCAweDcwMDgsCisJMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHg0Y2Y1LCAweDAwNjgsIDB4NGNmNSwgMHgyMDA5LCAweDAwMGQsCisJMHg3MDMwLCAweDIwMGEsIDB4MjA5MSwgMHg0MDgwLCAweDcwMGIsIDB4MDAwMCwgMHg3MDA0LCAweGEwODYsCisJMHgwMDA2LCAweDAwYzAsIDB4NGNmNSwgMHg3MDA3LCAweDAwMDEsIDB4MTI3ZiwgMHgwMDdjLCAweDIwNzEsCisJMHhhNzE0LCAweDEwNzgsIDB4NGU2MCwgMHgwMDQwLCAweDRkMjAsIDB4MjA3MSwgMHhhODM1LCAweDcwODQsCisJMHg3MDBhLCAweDIwYTksIDB4MDAyMCwgMHgyMDk5LCAweGE4MzYsIDB4MjBhMSwgMHhhODVkLCAweDUzYTMsCisJMHg3MDg3LCAweDAwMDAsIDB4MjA3MSwgMHhhNzE0LCAweDIwNjksIDB4YTg3ZCwgMHg3MDZjLCAweDY4MjYsCisJMHg3MDcwLCAweDY4MmEsIDB4NzA3NCwgMHg2ODJlLCAweDcwNzgsIDB4NjgzMiwgMHgyZDEwLCAweDEwNzgsCisJMHgxM2RiLCAweDcwMDcsIDB4MDAwOCwgMHgyMDAxLCAweGZmZmYsIDB4MjA3MSwgMHhhOGM0LCAweDcwNDIsCisJMHgxMjdmLCAweDAwNzgsIDB4NGNkYSwgMHgyMDY5LCAweGE4N2QsIDB4NjgwOCwgMHhhMDhlLCAweDAwMDAsCisJMHgwMDQwLCAweDRkODEsIDB4YTA4ZSwgMHgwMjAwLCAweDAwNDAsIDB4NGQ3ZiwgMHhhMDhlLCAweDAxMDAsCisJMHgwMGMwLCAweDRkODEsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MDA2OCwgMHg0ZDdjLCAweDIwNjksCisJMHgwMDAwLCAweDY4MTgsIDB4ZDA4NCwgMHgwMGMwLCAweDRkN2MsIDB4NzAyYywgMHg3MTMwLCAweDgxMDgsCisJMHhhMTAyLCAweDAwNDgsIDB4NGQ0YSwgMHhhMDBlLCAweDcwMzQsIDB4NzA2ZSwgMHg3MDM4LCAweDcwNzIsCisJMHgwMDc4LCAweDRkNTQsIDB4NzA2YywgMHhhMDgwLCAweDAwNDAsIDB4NzA2ZSwgMHgwMGM4LCAweDRkNTQsCisJMHg3MDcwLCAweGEwODEsIDB4MDAwMCwgMHg3MDcyLCAweDcxMzIsIDB4NjkzNiwgMHg3MDBiLCAweDAwMDAsCisJMHgyMDAxLCAweGE4NWEsIDB4MjAwNCwgMHhhMDA1LCAweDAwYzAsIDB4NGQ3MywgMHg2OTM0LCAweDIwNjksCisJMHhhODM1LCAweDY4OWMsIDB4Njk5ZSwgMHgyMDY5LCAweGE4YzQsIDB4YTEwMiwgMHgwMGMwLCAweDRkNmMsCisJMHg2ODQ0LCAweGEwMDUsIDB4MDBkMCwgMHg0ZDdhLCAweDIwMDEsIDB4YTg1YiwgMHgyMDBjLCAweDgxMGQsCisJMHg2OTQ2LCAweDAwNzgsIDB4NGQ3YSwgMHgyMDA5LCAweDgwNDAsIDB4NjkyMiwgMHg2ODFiLCAweDAwMDEsCisJMHgyMDkxLCAweDQwODAsIDB4NzAwNywgMHgwMDAxLCAweDEyN2YsIDB4MDA3OCwgMHg0ZDgxLCAweDcwMDcsCisJMHgwMDA1LCAweDAwN2MsIDB4NzAxYywgMHhhMDZkLCAweDAwNDAsIDB4NGQ5MywgMHgxMDc4LCAweDRlNjAsCisJMHgwMDQwLCAweDRkOTMsIDB4NzAwNywgMHgwMDAzLCAweDEwNzgsIDB4NGU4MCwgMHg3MDUwLCAweGEwODYsCisJMHgwMTAwLCAweDAwNDAsIDB4NGQ5NSwgMHgwMDdjLCAweDAwN2MsIDB4NzA1MCwgMHhhMDllLCAweDAxMDAsCisJMHgwMGMwLCAweDRkOWUsIDB4NzAwNywgMHgwMDA0LCAweDAwNzgsIDB4NGRiYywgMHhhMDg2LCAweDAyMDAsCisJMHgwMGMwLCAweDRkYTQsIDB4NzAwNywgMHgwMDA1LCAweDAwN2MsIDB4MjAwMSwgMHhhODdmLCAweDIwMDQsCisJMHhhMDhlLCAweDAxMDAsIDB4MDBjMCwgMHg0ZGIxLCAweDcwMDcsIDB4MDAwMSwgMHgxMDc4LCAweDRlNGMsCisJMHgwMDdjLCAweGEwOGUsIDB4MDAwMCwgMHgwMDQwLCAweDRkYjAsIDB4YTA4ZSwgMHgwMjAwLCAweDAwYzAsCisJMHg0ZGIwLCAweDcwMDcsIDB4MDAwNSwgMHgwMDdjLCAweDEwNzgsIDB4NGUxNiwgMHg3MDA2LCAweDEwNzgsCisJMHg0ZTRjLCAweDAwN2MsIDB4MDA3YywgMHgwZTdlLCAweDE1N2UsIDB4MjA3MSwgMHhhODM1LCAweDcxODQsCisJMHg4MWZmLCAweDAwNDAsIDB4NGRlYiwgMHhhMDA2LCAweDcwODYsIDB4YWU4MCwgMHgwMDAzLCAweDIwNzEsCisJMHgwMDAwLCAweDIxYTgsIDB4MjAxNCwgMHg3MjI2LCAweDgwMDAsIDB4MDA3MCwgMHg0ZGU4LCAweDIwMTQsCisJMHg3MjJhLCAweDgwMDAsIDB4MDA3MCwgMHg0ZGU4LCAweDIwMTQsIDB4NzIyZSwgMHg4MDAwLCAweDAwNzAsCisJMHg0ZGU4LCAweDIwMTQsIDB4NzIzYSwgMHg4MDAwLCAweDAwNzAsIDB4NGRlOCwgMHgyMDE0LCAweDcyM2UsCisJMHhhMTgwLCAweDgwMzAsIDB4NzAyMiwgMHgxNTdmLCAweDBlN2YsIDB4MDA3YywgMHgwZTdlLCAweDE1N2UsCisJMHgyMDcxLCAweGE4MzUsIDB4NzE4NCwgMHg4MWZmLCAweDAwNDAsIDB4NGUxMywgMHhhMDA2LCAweDcwODYsCisJMHhhZTgwLCAweDAwMDMsIDB4MjA3MSwgMHgwMDAwLCAweDIxYTgsIDB4MjAxNCwgMHg3MjI2LCAweDgwMDAsCisJMHgyMDE0LCAweDcyMmEsIDB4ODAwMCwgMHgwMDcwLCAweDRlMGMsIDB4MjAxNCwgMHg3MjNhLCAweDgwMDAsCisJMHgyMDE0LCAweDcyM2UsIDB4MDA3OCwgMHg0ZTEwLCAweDIwMDEsIDB4ODAyMCwgMHgwMDc4LCAweDRlMTIsCisJMHgyMDAxLCAweDgwNDIsIDB4NzAyMiwgMHgxNTdmLCAweDBlN2YsIDB4MDA3YywgMHg3MDJjLCAweDcxMzAsCisJMHg4MTA4LCAweGExMDIsIDB4MDA0OCwgMHg0ZTIzLCAweGEwMGUsIDB4NzAzNCwgMHg3MDZlLCAweDcwMzgsCisJMHg3MDcyLCAweDAwNzgsIDB4NGUyZCwgMHg3MDZjLCAweGEwODAsIDB4MDA0MCwgMHg3MDZlLCAweDAwYzgsCisJMHg0ZTJkLCAweDcwNzAsIDB4YTA4MSwgMHgwMDAwLCAweDcwNzIsIDB4NzEzMiwgMHg3MDBjLCAweDgwMDEsCisJMHg3MDBlLCAweDAwYzAsIDB4NGU0MywgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwMDY4LCAweDRlNDYsCisJMHgyMDAxLCAweDAwMGQsIDB4MjEwMiwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDAxLCAweDcwMGIsCisJMHgwMDAwLCAweDEyN2YsIDB4MDA3YywgMHgyMDAxLCAweDAwMDcsIDB4MDA3YywgMHgyMDAxLCAweDAwMDYsCisJMHg3MDBiLCAweDAwMDEsIDB4MTI3ZiwgMHgwMDdjLCAweDcwMWMsIDB4YTA2ZCwgMHgwMDQwLCAweDRlNWYsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg3MDEwLCAweDgwMDEsIDB4NzAxMiwgMHgyZDA0LCAweDcwMWUsCisJMHhhMDA1LCAweDAwYzAsIDB4NGU1YywgMHg3MDFhLCAweDEyN2YsIDB4MTA3OCwgMHgxM2E0LCAweDAwN2MsCisJMHgyMDE5LCAweDAwMGQsIDB4MjMwNCwgMHgyMzBjLCAweGExMGUsIDB4MDA0MCwgMHg0ZTZmLCAweDIzMDQsCisJMHgyMzBjLCAweGExMGUsIDB4MDA0MCwgMHg0ZTZmLCAweGEwMDYsIDB4MDA3OCwgMHg0ZTdmLCAweDczMmMsCisJMHg4MzE5LCAweDcxMzAsIDB4YTEwMiwgMHgwMGMwLCAweDRlNzksIDB4MjMwMCwgMHhhMDA1LCAweDAwNzgsCisJMHg0ZTdmLCAweDAwNDgsIDB4NGU3ZSwgMHhhMzAyLCAweDAwNzgsIDB4NGU3ZiwgMHg4MDAyLCAweDAwN2MsCisJMHgyZDAwLCAweDcwMjYsIDB4YTA4MCwgMHgwMDBkLCAweDcwNTYsIDB4NzA1MywgMHgwMDAwLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MjAwOSwgMHhhOGQ2LCAweDIxMDQsIDB4YzA4ZCwgMHgyMDBhLCAweDEyN2YsCisJMHgxMDc4LCAweDEzZjksIDB4MDA3YywgMHgyMDcxLCAweGE2ZTIsIDB4NzAwMywgMHgwMDAwLCAweDcwMDcsCisJMHgwMDAwLCAweDcwMGYsIDB4MDAwMCwgMHg3MDJiLCAweDAwMDEsIDB4NzA0ZiwgMHgwMDAwLCAweDcwNTMsCisJMHgwMDAxLCAweDcwNWYsIDB4MDAyMCwgMHg3MDYzLCAweDAwNDAsIDB4NzA4MywgMHgwMDAwLCAweDcwOGIsCisJMHgwMDAwLCAweDcwOGYsIDB4MDAwMSwgMHg3MGJmLCAweDAwMDAsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsCisJMHhhNmUyLCAweDY4NDgsIDB4YTAwNSwgMHgwMGMwLCAweDRlYmMsIDB4NzAyOCwgMHhjMDg1LCAweDcwMmEsCisJMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwgMHg0ZWUxLCAweDZhNTAsIDB4NzIzNiwgMHg2YjU0LCAweDczM2EsCisJMHg2ODU4LCAweDcwM2UsIDB4NzA3YSwgMHg2ODVjLCAweDcwNDIsIDB4NzA3ZSwgMHg2ODQ4LCAweDcwMmUsCisJMHg2ODQwLCAweDcwMzIsIDB4MjAwOSwgMHgwMDBjLCAweDIwMGEsIDB4ODAwNywgMHg4MDA2LCAweDgwMDYsCisJMHhhMDhjLCAweDAwM2YsIDB4YTA4NCwgMHhmZmMwLCAweGEyMTAsIDB4MjEwMCwgMHhhMzE5LCAweDcyNzIsCisJMHg3Mzc2LCAweDcwMjgsIDB4YzA4NCwgMHg3MDJhLCAweDcwMDcsIDB4MDAwMSwgMHg3MDBmLCAweDAwMDAsCisJMHhhMDA2LCAweDBlN2YsIDB4MDA3YywgMHgyYjc4LCAweDIwNzEsIDB4YTZlMiwgMHg3MDA0LCAweDEwNzksCisJMHg0ZjQxLCAweDcwMGMsIDB4MDA3OSwgMHg0ZWVjLCAweDRlZjEsIDB4NGVlNiwgMHg0ZWU2LCAweDRlZTYsCisJMHg0ZWU2LCAweDAwN2MsIDB4NzAwYywgMHgwMDc5LCAweDRlZjUsIDB4NGVmYSwgMHg0ZjNmLCAweDRmM2YsCisJMHg0ZjQwLCAweDRmNDAsIDB4NzgzMCwgMHg3OTMwLCAweGExMDYsIDB4MDA0MCwgMHg0ZjA0LCAweDc4MzAsCisJMHg3OTMwLCAweGExMDYsIDB4MDBjMCwgMHg0ZjJhLCAweDcwMzAsIDB4YTEwYSwgMHgwMDQwLCAweDRmMmEsCisJMHgwMGM4LCAweDRmMGMsIDB4NzEyYywgMHhhMTBhLCAweGExOGEsIDB4MDAwMiwgMHgwMGM4LCAweDRmMmIsCisJMHgxMDc4LCAweDEzNzAsIDB4MDA0MCwgMHg0ZjJhLCAweDJkMDAsIDB4NzA1YSwgMHg3MDYzLCAweDAwNDAsCisJMHgyMDAxLCAweDAwMDMsIDB4NzA1NywgMHgwMDAwLCAweDEyN2UsIDB4MDA3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDA5LCAweGE4ZDYsIDB4MjEwNCwgMHhjMDg1LCAweDIwMGEsIDB4MDA3ZiwgMHg3MDBlLCAweDEyN2YsCisJMHgxMDc4LCAweDEzZjksIDB4MDA3YywgMHgxMDc4LCAweDEzNzAsIDB4MDA0MCwgMHg0ZjJhLCAweDJkMDAsCisJMHg3MDVhLCAweDEwNzgsIDB4MTM3MCwgMHgwMGMwLCAweDRmMzcsIDB4MDA3OCwgMHg0ZjE2LCAweDJkMDAsCisJMHg3MDg2LCAweDcwNjMsIDB4MDA4MCwgMHgyMDAxLCAweDAwMDQsIDB4MDA3OCwgMHg0ZjFhLCAweDAwN2MsCisJMHgwMDdjLCAweDRmNTIsIDB4NGY1MywgMHg0ZjhhLCAweDRmOGIsIDB4NGYzZiwgMHg0ZmMxLCAweDRmYzYsCisJMHg0ZmZkLCAweDRmZmUsIDB4NTAxOSwgMHg1MDFhLCAweDUwMWIsIDB4NTAxYywgMHg1MDFkLCAweDUwMWUsCisJMHg1MDllLCAweDUwYzgsIDB4MDA3YywgMHg3MDBjLCAweDAwNzksIDB4NGY1NiwgMHg0ZjViLCAweDRmNWUsCisJMHg0ZjZlLCAweDRmODksIDB4NGY4OSwgMHgxMDc4LCAweDRlZjIsIDB4MDA3YywgMHgxMjdlLCAweDgwMDEsCisJMHg3MDBlLCAweDcwNTgsIDB4MDA3ZSwgMHgxMDc4LCAweDU0NjQsIDB4MDA0MCwgMHg0ZjZiLCAweDIwOTEsCisJMHg4MDAwLCAweDEwNzgsIDB4NGVmMiwgMHgwZDdmLCAweDAwNzgsIDB4NGY3NywgMHgxMjdlLCAweDgwMDEsCisJMHg3MDBlLCAweDEwNzgsIDB4NTQ2NCwgMHg3MDU4LCAweDIwNjgsIDB4NzA4NCwgMHg3MDVhLCAweDY4MDMsCisJMHgwMDAwLCAweDY4MDcsIDB4MDAwMCwgMHg2ODM0LCAweGEwODQsIDB4MDBmZiwgMHhhMDhhLCAweDAwMjAsCisJMHgwMGM4LCAweDRmODYsIDB4MTA3OSwgMHg0ZmExLCAweDEyN2YsIDB4MDA3YywgMHgxMjdmLCAweDEwNzgsCisJMHg1MDFmLCAweDAwN2MsIDB4MDA3YywgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhNmUyLCAweDcwMGMsCisJMHgwMDc5LCAweDRmOTIsIDB4NGY5NywgMHg0Zjk3LCAweDRmOTcsIDB4NGY5OSwgMHg0ZjlkLCAweDBlN2YsCisJMHgwMDdjLCAweDcwMGYsIDB4MDAwMSwgMHgwMDc4LCAweDRmOWYsIDB4NzAwZiwgMHgwMDAyLCAweDBlN2YsCisJMHgwMDdjLCAweDUwMWYsIDB4NTAxZiwgMHg1MDNiLCAweDUwMWYsIDB4NTE3MSwgMHg1MDFmLCAweDUwMWYsCisJMHg1MDFmLCAweDUwMWYsIDB4NTAxZiwgMHg1MDNiLCAweDUxYmIsIDB4NTIwOCwgMHg1MjYxLCAweDUyNzcsCisJMHg1MDFmLCAweDUwMWYsIDB4NTA1NywgMHg1MDNiLCAweDUwMWYsIDB4NTAxZiwgMHg1MDc4LCAweDUzMzgsCisJMHg1MzU2LCAweDUwMWYsIDB4NTA1NywgMHg1MDFmLCAweDUwMWYsIDB4NTAxZiwgMHg1MDFmLCAweDUwNmQsCisJMHg1MzU2LCAweDcwMjAsIDB4MjA2OCwgMHgxMDc4LCAweDEzYTQsIDB4MDA3YywgMHg3MDBjLCAweDAwNzksCisJMHg0ZmM5LCAweDRmY2UsIDB4NGZkMSwgMHg0ZmUxLCAweDRmZmMsIDB4NGZmYywgMHgxMDc4LCAweDRlZjIsCisJMHgwMDdjLCAweDEyN2UsIDB4ODAwMSwgMHg3MDBlLCAweDcwNTgsIDB4MDA3ZSwgMHgxMDc4LCAweDU0NjQsCisJMHgwMDQwLCAweDRmZGUsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4NGVmMiwgMHgwZDdmLCAweDAwNzgsCisJMHg0ZmVhLCAweDEyN2UsIDB4ODAwMSwgMHg3MDBlLCAweDEwNzgsIDB4NTQ2NCwgMHg3MDU4LCAweDIwNjgsCisJMHg3MDg0LCAweDcwNWEsIDB4NjgwMywgMHgwMDAwLCAweDY4MDcsIDB4MDAwMCwgMHg2ODM0LCAweGEwODQsCisJMHgwMGZmLCAweGEwOGEsIDB4MDAxYSwgMHgwMGM4LCAweDRmZjksIDB4MTA3OSwgMHg0ZmZmLCAweDEyN2YsCisJMHgwMDdjLCAweDEyN2YsIDB4MTA3OCwgMHg1MDFmLCAweDAwN2MsIDB4MDA3YywgMHgwMDdjLCAweDUwMWYsCisJMHg1MDNiLCAweDUxNWIsIDB4NTAxZiwgMHg1MDNiLCAweDUwMWYsIDB4NTAzYiwgMHg1MDNiLCAweDUwMWYsCisJMHg1MDNiLCAweDUxNWIsIDB4NTAzYiwgMHg1MDNiLCAweDUwM2IsIDB4NTAzYiwgMHg1MDNiLCAweDUwMWYsCisJMHg1MDNiLCAweDUxNWIsIDB4NTAxZiwgMHg1MDFmLCAweDUwM2IsIDB4NTAxZiwgMHg1MDFmLCAweDUwMWYsCisJMHg1MDNiLCAweDAwN2MsIDB4MDA3YywgMHgwMDdjLCAweDAwN2MsIDB4MDA3YywgMHgwMDdjLCAweDcwMDcsCisJMHgwMDAxLCAweDY4MzgsIDB4YTA4NCwgMHgwMGZmLCAweGMwZDUsIDB4NjgzYSwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDEwNzgsIDB4NGE3MywgMHgxMjdmLCAweDAwN2MsIDB4NzAwNywgMHgwMDAxLCAweDY4MzgsCisJMHhhMDg0LCAweDAwZmYsIDB4YzBlNSwgMHg2ODNhLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsCisJMHg0YTczLCAweDEyN2YsIDB4MDA3YywgMHg3MDA3LCAweDAwMDEsIDB4NjgzOCwgMHhhMDg0LCAweDAwZmYsCisJMHhjMGVkLCAweDY4M2EsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg0YTczLCAweDEyN2YsCisJMHgwMDdjLCAweDcwMDcsIDB4MDAwMSwgMHg2ODM4LCAweGEwODQsIDB4MDBmZiwgMHhjMGRkLCAweDY4M2EsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDRhNzMsIDB4MTI3ZiwgMHgwMDdjLCAweDY4MzQsCisJMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHgwMDQwLCAweDUwMmQsIDB4ODAwMSwgMHgwMGMwLCAweDUwNjQsCisJMHg3MDA3LCAweDAwMDEsIDB4MDA3OCwgMHg1MTNhLCAweDcwMDcsIDB4MDAwNiwgMHg3MDEyLCAweDJkMDAsCisJMHg3MDE2LCAweDcwMWEsIDB4NzA0YiwgMHg1MTNhLCAweDAwN2MsIDB4Njg0YywgMHhhMDg0LCAweDAwYzAsCisJMHhhMDg2LCAweDAwYzAsIDB4MDBjMCwgMHg1MDc4LCAweDcwMDcsIDB4MDAwMSwgMHgwMDc4LCAweDUzNzMsCisJMHgyZDAwLCAweDcwMTYsIDB4NzAxYSwgMHgyMGE5LCAweDAwMDQsIDB4YTA4MCwgMHgwMDI0LCAweDIwOTgsCisJMHgyMGExLCAweGE3MGQsIDB4NTNhMywgMHg2ODU4LCAweDcwMTIsIDB4YTA4MiwgMHgwNDAxLCAweDAwYzgsCisJMHg1MDQ5LCAweDY4ODQsIDB4YTA4YSwgMHgwMDAyLCAweDAwYzgsIDB4NTA0OSwgMHg4MmZmLCAweDAwYzAsCisJMHg1MDlhLCAweDY4ODgsIDB4Njk4YywgMHhhMTA1LCAweDAwNDAsIDB4NTA5YSwgMHgyMDAxLCAweDUxMGEsCisJMHgwMDc4LCAweDUwOWQsIDB4YTI4MCwgMHg1MTAwLCAweDIwMDQsIDB4NzBjNiwgMHg3MDEwLCAweGEwMTUsCisJMHgwMDQwLCAweDUwZTgsIDB4MTA3OCwgMHgxMzcwLCAweDAwYzAsIDB4NTBhOSwgMHg3MDA3LCAweDAwMGYsCisJMHgwMDdjLCAweDJkMDAsIDB4NzAyMiwgMHg3MGM0LCAweDIwNjAsIDB4NjAwMCwgMHg2ODM2LCAweDYwMDQsCisJMHhhZDAwLCAweDcwOTYsIDB4NjAwOCwgMHhhMjBhLCAweDAwYzgsIDB4NTBiOCwgMHhhMDBlLCAweDIyMDAsCisJMHg3MTEyLCAweDYyMGMsIDB4ODAwMywgMHg4MDBiLCAweGEyOTYsIDB4MDAwNCwgMHgwMDQwLCAweDUwYzEsCisJMHhhMTA4LCAweDcxOWEsIDB4ODEwYiwgMHg3MTllLCAweGFlOTAsIDB4MDAyMiwgMHgxMDc4LCAweDEzZGIsCisJMHg3MDkwLCAweGEwOGUsIDB4MDEwMCwgMHgwMDQwLCAweDUwZGMsIDB4YTA4NiwgMHgwMjAwLCAweDAwNDAsCisJMHg1MGQ0LCAweDcwMDcsIDB4MDAxMCwgMHgwMDdjLCAweDcwMjAsIDB4MjA2OCwgMHgxMDc4LCAweDEzYTQsCisJMHg3MDE0LCAweDIwNjgsIDB4MDA3OCwgMHg1MDQ5LCAweDcwMjAsIDB4MjA2OCwgMHg3MDE4LCAweDY4MDIsCisJMHg2ODA3LCAweDAwMDAsIDB4MmQwOCwgMHgyMDY4LCAweDY5MDYsIDB4NzExYSwgMHgwMDc4LCAweDUwOWUsCisJMHg3MDE0LCAweDIwNjgsIDB4NzAwNywgMHgwMDAxLCAweDY4ODQsIDB4YTAwNSwgMHgwMGMwLCAweDUwZjcsCisJMHg2ODg4LCAweDY5OGMsIDB4YTEwNSwgMHgwMDQwLCAweDUwZjcsIDB4MTA3OCwgMHg1MTBlLCAweDY4MzQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDFlLCAweDAwNDAsIDB4NTM3MywgMHgwMDc4LCAweDUxM2EsCisJMHg1MTAyLCAweDUxMDYsIDB4MDAwMiwgMHgwMDExLCAweDAwMDcsIDB4MDAwNCwgMHgwMDBhLCAweDAwMGYsCisJMHgwMDA1LCAweDAwMDYsIDB4MDAwYSwgMHgwMDExLCAweDAwMDUsIDB4MDAwNCwgMHgwZjdlLCAweDBlN2UsCisJMHgwYzdlLCAweDA3N2UsIDB4MDY3ZSwgMHg2Zjg4LCAweDZlOGMsIDB4NjgwNCwgMHgyMDYwLCAweGFjZjAsCisJMHgwMDIxLCAweGFjZjgsIDB4MDAyNywgMHgyMDA5LCAweDAwMDUsIDB4NzAwYywgMHg3ODE2LCAweDcwMDgsCisJMHg3ODEyLCAweDcwMDQsIDB4NzgwNiwgMHg3MDAwLCAweDc4MDIsIDB4N2UwZSwgMHg3ZjBhLCAweDgxMDksCisJMHgwMDQwLCAweDUxMzAsIDB4YWVmMiwgMHgwMDA0LCAweGFmZmEsIDB4MDAwNiwgMHgwMDc4LCAweDUxMWQsCisJMHg2MDA0LCAweGEwNjUsIDB4MDBjMCwgMHg1MTE3LCAweDA2N2YsIDB4MDc3ZiwgMHgwYzdmLCAweDBlN2YsCisJMHgwZjdmLCAweDAwN2MsIDB4MjAwOSwgMHhhNjJmLCAweDIxMGMsIDB4ODFmZiwgMHgwMGMwLCAweDUxNTUsCisJMHg2ODM4LCAweGEwODQsIDB4MDBmZiwgMHg2ODNhLCAweDEwNzgsIDB4NDM1MywgMHgwMGMwLCAweDUxNDksCisJMHgwMDdjLCAweDEwNzgsIDB4NGI1MSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDhmN2QsCisJMHgxMDc4LCAweDRhNzMsIDB4MTI3ZiwgMHgwMDc4LCAweDUxNDgsIDB4MjAwMSwgMHgwMDI4LCAweDIwMDksCisJMHgwMDAwLCAweDAwNzgsIDB4NTE0OSwgMHg3MDE4LCAweDY4MDIsIDB4MmQwOCwgMHgyMDY4LCAweDY5MDYsCisJMHg3MTFhLCAweDcwMTAsIDB4ODAwMSwgMHg3MDEyLCAweDAwNDAsIDB4NTE2YSwgMHg3MDA3LCAweDAwMDYsCisJMHgwMDc4LCAweDUxNzAsIDB4NzAxNCwgMHgyMDY4LCAweDcwMDcsIDB4MDAwMSwgMHg3MDQ4LCAweDEwN2EsCisJMHgwMDdjLCAweDcwMDcsIDB4MDAwMSwgMHg2OTQ0LCAweDgxMGYsIDB4YTE4YywgMHgwMGZmLCAweDY4NDgsCisJMHhhMDg0LCAweDAwZmYsIDB4MjBhOSwgMHgwMDAxLCAweGEwOTYsIDB4MDAwMSwgMHgwMDQwLCAweDUxOWEsCisJMHgyMDA5LCAweDAwMDAsIDB4MjBhOSwgMHgwMGZmLCAweGEwOTYsIDB4MDAwMiwgMHgwMDQwLCAweDUxOWEsCisJMHhhMDA1LCAweDAwYzAsIDB4NTFhZCwgMHg2OTQ0LCAweDgxMGYsIDB4YTE4YywgMHgwMGZmLCAweDEwNzgsCisJMHg0NWM0LCAweDAwYzAsIDB4NTFhZCwgMHgwNjdlLCAweDZlNTAsIDB4MTA3OCwgMHg0NmIzLCAweDA2N2YsCisJMHgwMDc4LCAweDUxYWQsIDB4MDQ3ZSwgMHgyMDExLCAweGE2MGMsIDB4MjIyNCwgMHhjNDg0LCAweGM0OGMsCisJMHgyNDEyLCAweDA0N2YsIDB4MGM3ZSwgMHgxMDc4LCAweDQ1YzQsIDB4MDBjMCwgMHg1MWE5LCAweDEwNzgsCisJMHg0ODUyLCAweDgxMDgsIDB4MDBmMCwgMHg1MWEzLCAweDBjN2YsIDB4Njg0YywgMHhkMDg0LCAweDAwYzAsCisJMHg1MWI0LCAweDEwNzgsIDB4MTNhNCwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsCisJMHg0YTczLCAweDEyN2YsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg3MDA3LCAweDAwMDEsCisJMHgyMDAxLCAweGE2NTMsIDB4MjAwNCwgMHhkMGE0LCAweDAwNDAsIDB4NTFmZiwgMHgyMDYxLCAweGE5MzMsCisJMHg2MTAwLCAweGQxODQsIDB4MDA0MCwgMHg1MWRmLCAweDY4NTgsIDB4YTA4NCwgMHgwMGZmLCAweDAwYzAsCisJMHg1MjAyLCAweDYwMDAsIDB4ZDA4NCwgMHgwMDQwLCAweDUxZmYsIDB4NjAwNCwgMHhhMDA1LCAweDAwYzAsCisJMHg1MjA1LCAweDYwMDMsIDB4MDAwMCwgMHg2MDBiLCAweDAwMDAsIDB4MDA3OCwgMHg1MWZjLCAweDIwMTEsCisJMHgwMDAxLCAweDY4NjAsIDB4YTAwNSwgMHgwMGMwLCAweDUxZTcsIDB4MjAwMSwgMHgwMDFlLCAweDgwMDAsCisJMHg2MDE2LCAweDY4NTgsIDB4YTA4NCwgMHgwMGZmLCAweDAwNDAsIDB4NTFmZiwgMHg2MDA2LCAweDY4NTgsCisJMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHgwMDQwLCAweDUxZmYsIDB4NjAwYSwgMHg2ODU4LCAweDgwMDAsCisJMHgwMGMwLCAweDUxZmIsIDB4YzI4ZCwgMHg2MjAyLCAweDEyN2YsIDB4MDA3OCwgMHg1NDUzLCAweDEyN2YsCisJMHgwMDc4LCAweDU0NGIsIDB4MTI3ZiwgMHgwMDc4LCAweDU0NDMsIDB4MTI3ZiwgMHgwMDc4LCAweDU0NDcsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg3MDA3LCAweDAwMDEsIDB4MjAwMSwgMHhhNjUzLCAweDIwMDQsCisJMHhkMGE0LCAweDAwNDAsIDB4NTI1ZSwgMHgyMDYxLCAweGE5MzMsIDB4NjAwMCwgMHhkMDg0LCAweDAwNDAsCisJMHg1MjVlLCAweDYyMDQsIDB4NjMwOCwgMHhkMDhjLCAweDAwYzAsIDB4NTI1MCwgMHg2YzQ4LCAweGE0ODQsCisJMHgwMDAzLCAweDAwNDAsIDB4NTIzNiwgMHg2OTU4LCAweGExOGMsIDB4MDBmZiwgMHg4MDAxLCAweDAwYzAsCisJMHg1MjJmLCAweDIxMDAsIDB4YTIxMCwgMHgwMDQ4LCAweDUyNWIsIDB4MDA3OCwgMHg1MjM2LCAweDgwMDEsCisJMHgwMGMwLCAweDUyNWIsIDB4MjEwMCwgMHhhMjEyLCAweDAwNDgsIDB4NTI1YiwgMHhhNDg0LCAweDAwMGMsCisJMHgwMDQwLCAweDUyNTAsIDB4Njk1OCwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHhhMDgyLCAweDAwMDQsCisJMHgwMGMwLCAweDUyNDgsIDB4MjEwMCwgMHhhMzE4LCAweDAwNDgsIDB4NTI1YiwgMHgwMDc4LCAweDUyNTAsCisJMHhhMDgyLCAweDAwMDQsIDB4MDBjMCwgMHg1MjViLCAweDIxMDAsIDB4YTMxYSwgMHgwMDQ4LCAweDUyNWIsCisJMHg2ODYwLCAweGEwMDUsIDB4MDA0MCwgMHg1MjU2LCAweDgwMDAsIDB4NjAxNiwgMHg2MjA2LCAweDYzMGEsCisJMHgxMjdmLCAweDAwNzgsIDB4NTQ1MywgMHgxMjdmLCAweDAwNzgsIDB4NTQ0ZiwgMHgxMjdmLCAweDAwNzgsCisJMHg1NDRiLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDcwMDcsIDB4MDAwMSwgMHgyMDYxLCAweGE5MzMsCisJMHg2MzAwLCAweGQzOGMsIDB4MDBjMCwgMHg1MjcxLCAweDYzMDgsIDB4ODMxOCwgMHgwMDQ4LCAweDUyNzQsCisJMHg2MzBhLCAweDEyN2YsIDB4MDA3OCwgMHg1NDYxLCAweDEyN2YsIDB4MDA3OCwgMHg1NDRmLCAweDEyN2UsCisJMHgwYzdlLCAweDIwOTEsIDB4ODAwMCwgMHg3MDA3LCAweDAwMDEsIDB4Njg0YywgMHhkMGFjLCAweDAwNDAsCisJMHg1MjhiLCAweDBjN2UsIDB4MjA2MSwgMHhhOTMzLCAweDYwMDAsIDB4YTA4NCwgMHhmY2ZmLCAweDYwMDIsCisJMHgwYzdmLCAweDAwNzgsIDB4NTJiYSwgMHg2ODU4LCAweGEwMDUsIDB4MDA0MCwgMHg1MmQxLCAweDY4NWMsCisJMHhhMDY1LCAweDAwNDAsIDB4NTJjZCwgMHgyMDAxLCAweGE2MmYsIDB4MjAwNCwgMHhhMDA1LCAweDAwNDAsCisJMHg1MjlkLCAweDEwNzgsIDB4OGVjNiwgMHgwMDc4LCAweDUyYWIsIDB4NjAxMywgMHgwNDAwLCAweDYwMzcsCisJMHgwMDAwLCAweDY5NGMsIDB4ZDFhNCwgMHgwMDQwLCAweDUyYTcsIDB4Njk1MCwgMHg2MTM2LCAweDIwMDksCisJMHgwMDQxLCAweDEwNzgsIDB4Nzc1YywgMHg2OTU4LCAweGExOGMsIDB4ZmYwMCwgMHhhMTg2LCAweDIwMDAsCisJMHgwMGMwLCAweDUyYmEsIDB4MDI3ZSwgMHgyMDA5LCAweDAwMDAsIDB4MjAxMSwgMHhmZGZmLCAweDEwNzgsCisJMHg1YmYxLCAweDAyN2YsIDB4Njg0YywgMHhkMGM0LCAweDAwNDAsIDB4NTJjOSwgMHgyMDYxLCAweGE5MzMsCisJMHg2MDAwLCAweGQwOGMsIDB4MDBjMCwgMHg1MmM5LCAweDYwMDgsIDB4ODAwMCwgMHgwMDQ4LCAweDUyY2QsCisJMHg2MDBhLCAweDBjN2YsIDB4MTI3ZiwgMHgwMDc4LCAweDU0NTMsIDB4MGM3ZiwgMHgxMjdmLCAweDAwNzgsCisJMHg1NDRiLCAweDY5NTQsIDB4YTE4NiwgMHgwMDQ1LCAweDAwNDAsIDB4NTMwNiwgMHhhMTg2LCAweDAwMmEsCisJMHgwMGMwLCAweDUyZTEsIDB4MjAwMSwgMHhhNjBjLCAweDIwMGMsIDB4YzE5NCwgMHgyMTAyLCAweDAwNzgsCisJMHg1MmJhLCAweGExODYsIDB4MDAyMCwgMHgwMDQwLCAweDUyZmEsIDB4YTE4NiwgMHgwMDI5LCAweDAwNDAsCisJMHg1MmVkLCAweGExODYsIDB4MDAyZCwgMHgwMGMwLCAweDUyY2QsIDB4Njk0NCwgMHhhMThjLCAweGZmMDAsCisJMHg4MTBmLCAweDEwNzgsIDB4NDVjNCwgMHgwMGMwLCAweDUyYmEsIDB4NjAwMCwgMHhjMGU0LCAweDYwMDIsCisJMHgwMDc4LCAweDUyYmEsIDB4Njg1YywgMHhhMDY1LCAweDAwNDAsIDB4NTJjZCwgMHg2MDA3LCAweDAwMjQsCisJMHgyMDAxLCAweGE4YTMsIDB4MjAwNCwgMHg2MDE2LCAweDAwNzgsIDB4NTJiYSwgMHg2ODVjLCAweGEwNjUsCisJMHgwMDQwLCAweDUyY2QsIDB4MGU3ZSwgMHg2ODYwLCAweGEwNzUsIDB4MjAwMSwgMHhhNjJmLCAweDIwMDQsCisJMHhhMDA1LCAweDAwNDAsIDB4NTMxZSwgMHgxMDc4LCAweDhlYzYsIDB4OGVmZiwgMHgwMDQwLCAweDUzMWIsCisJMHgyZTYwLCAweDEwNzgsIDB4OGVjNiwgMHgwZTdmLCAweDAwNzgsIDB4NTJiYSwgMHg2MDI0LCAweGMwZGMsCisJMHhjMGQ1LCAweDYwMjYsIDB4MmU2MCwgMHg2MDA3LCAweDAwM2EsIDB4Njg3MCwgMHhhMDA1LCAweDAwNDAsCisJMHg1MzJmLCAweDYwMDcsIDB4MDAzYiwgMHg2ODc0LCAweDYwMmEsIDB4Njg3OCwgMHg2MDEyLCAweDYwMDMsCisJMHgwMDAxLCAweDEwNzgsIDB4NWQ4YSwgMHgxMDc4LCAweDYyZDEsIDB4MGU3ZiwgMHgwMDc4LCAweDUyYmEsCisJMHgyMDYxLCAweGE5MzMsIDB4NjAwMCwgMHhkMDg0LCAweDAwNDAsIDB4NTM1MiwgMHhkMDhjLCAweDAwYzAsCisJMHg1NDYxLCAweDIwOTEsIDB4ODAwMCwgMHg2MjA0LCAweDgyMTAsIDB4MDA0OCwgMHg1MzRjLCAweDYyMDYsCisJMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwgMHg1NDYxLCAweDIwOTEsIDB4ODAwMSwgMHg2ODUzLCAweDAwMTYsCisJMHgwMDc4LCAweDU0NWEsIDB4Njg1MywgMHgwMDA3LCAweDAwNzgsIDB4NTQ1YSwgMHg2ODM0LCAweDgwMDcsCisJMHhhMDg0LCAweDAwZmYsIDB4MDBjMCwgMHg1MzYwLCAweDEwNzgsIDB4NTAyZCwgMHgwMDc4LCAweDUzNzIsCisJMHgyMDMwLCAweDgwMDEsIDB4MDBjMCwgMHg1MzZhLCAweDcwMDcsIDB4MDAwMSwgMHgxMDc4LCAweDUzNzMsCisJMHgwMDc4LCAweDUzNzIsIDB4NzAwNywgMHgwMDA2LCAweDcwMTIsIDB4MmQwMCwgMHg3MDE2LCAweDcwMWEsCisJMHg3MDRiLCAweDUzNzMsIDB4MDA3YywgMHgwZTdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweGEwM2UsCisJMHgyMDA5LCAweGE2MmYsIDB4MjEwYywgMHg4MWZmLCAweDAwYzAsIDB4NTNmZiwgMHgyMDA5LCAweGE2MGMsCisJMHgyMTBjLCAweGQxOTQsIDB4MDBjMCwgMHg1NDMxLCAweDY4NDgsIDB4MjA3MCwgMHhhZTgyLCAweGFkMDAsCisJMHgwMDQ4LCAweDUzZWYsIDB4MjAwMSwgMHhhNjE2LCAweDIwMDQsIDB4YWUwMiwgMHgwMGM4LCAweDUzZWYsCisJMHgyMDYxLCAweGE5MzMsIDB4NjEwMCwgMHhhMTg0LCAweDAzMDEsIDB4YTA4NiwgMHgwMDAxLCAweDAwYzAsCisJMHg1M2QyLCAweDcxMWMsIDB4YTE4NiwgMHgwMDA2LCAweDAwYzAsIDB4NTNkYSwgMHg3MDE4LCAweGEwMDUsCisJMHgwMDQwLCAweDUzZmYsIDB4MjAwNCwgMHhkMGU0LCAweDAwYzAsIDB4NTQyYiwgMHg3MDI0LCAweGQwZGMsCisJMHgwMGMwLCAweDU0MzUsIDB4Njg1MywgMHgwMDAwLCAweDY4MDMsIDB4MDAwMCwgMHgyZDA4LCAweDcwMTAsCisJMHhhMDA1LCAweDAwYzAsIDB4NTNiZSwgMHg3MTEyLCAweDY4NGMsIDB4ZDBmNCwgMHgwMGMwLCAweDU0MzksCisJMHgyZTYwLCAweDEwNzgsIDB4NWIyNywgMHgxMjdmLCAweDBlN2YsIDB4MDA3YywgMHgyMDY4LCAweDY4MDAsCisJMHhhMDA1LCAweDAwYzAsIDB4NTNiZSwgMHg2OTAyLCAweDIxNjgsIDB4Njg0YywgMHhkMGY0LCAweDAwYzAsCisJMHg1NDM5LCAweDEyN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDEyN2YsIDB4MGU3ZiwgMHg2ODUzLCAweDAwMDYsCisJMHgwMDc4LCAweDU0NWEsIDB4ZDE4NCwgMHgwMDQwLCAweDUzY2MsIDB4ZDFjNCwgMHgwMGMwLCAweDUzZjMsCisJMHgwMDc4LCAweDUzZjcsIDB4Njk0NCwgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHgxMDc4LCAweDQ1YzQsCisJMHgwMGMwLCAweDU0MmIsIDB4NjAwMCwgMHhkMGU0LCAweDAwYzAsIDB4NTQyYiwgMHg3MTFjLCAweGExODYsCisJMHgwMDA3LCAweDAwYzAsIDB4NTNlZiwgMHg2ODUzLCAweDAwMDIsIDB4MDA3OCwgMHg1NDJkLCAweDY4NTMsCisJMHgwMDA4LCAweDAwNzgsIDB4NTQyZCwgMHg2ODUzLCAweDAwMGUsIDB4MDA3OCwgMHg1NDJkLCAweDY4NTMsCisJMHgwMDE3LCAweDAwNzgsIDB4NTQyZCwgMHg2ODUzLCAweDAwMzUsIDB4MDA3OCwgMHg1NDJkLCAweDIwMDEsCisJMHhhNjcyLCAweDIwMDQsIDB4ZDBmYywgMHgwMDQwLCAweDU0MjcsIDB4Njg0OCwgMHgyMDcwLCAweGFlODIsCisJMHhhZDAwLCAweDAwNDgsIDB4NTQyNywgMHg2MDU4LCAweGFlMDIsIDB4MDBjOCwgMHg1NDI3LCAweDcxMWMsCisJMHhhMTg2LCAweDAwMDYsIDB4MDBjMCwgMHg1NDI3LCAweDcwMTgsIDB4YTAwNSwgMHgwMDQwLCAweDU0MjcsCisJMHgyMDA0LCAweGQwYmMsIDB4MDA0MCwgMHg1NDI3LCAweDIwMzksIDB4MDAwMSwgMHg3MDAwLCAweGEwODYsCisJMHgwMDA3LCAweDAwYzAsIDB4NTM3ZSwgMHg3MDAzLCAweDAwMDIsIDB4MDA3OCwgMHg1MzdlLCAweDY4NTMsCisJMHgwMDI4LCAweDAwNzgsIDB4NTQyZCwgMHg2ODUzLCAweDAwMjksIDB4MTI3ZiwgMHgwZTdmLCAweDAwNzgsCisJMHg1NDVhLCAweDY4NTMsIDB4MDAyYSwgMHgwMDc4LCAweDU0MmQsIDB4Njg1MywgMHgwMDQ1LCAweDAwNzgsCisJMHg1NDJkLCAweDJlNjAsIDB4MjAxOSwgMHgwMDAyLCAweDYwMTcsIDB4MDAxNCwgMHgxMDc4LCAweDlkYzcsCisJMHgxMjdmLCAweDBlN2YsIDB4MDA3YywgMHgyMDA5LCAweDAwM2UsIDB4MDA3OCwgMHg1NDU1LCAweDIwMDksCisJMHgwMDA0LCAweDAwNzgsIDB4NTQ1NSwgMHgyMDA5LCAweDAwMDYsIDB4MDA3OCwgMHg1NDU1LCAweDIwMDksCisJMHgwMDE2LCAweDAwNzgsIDB4NTQ1NSwgMHgyMDA5LCAweDAwMDEsIDB4Njg1NCwgMHhhMDg0LCAweGZmMDAsCisJMHhhMTA1LCAweDY4NTYsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4NGE3MywgMHgyMDkxLCAweDgwMDEsCisJMHgwMDdjLCAweDEwNzgsIDB4MTNhNCwgMHgwMDdjLCAweDcwMmMsIDB4NzEzMCwgMHg4MTA4LCAweGExMDIsCisJMHgwMDQ4LCAweDU0NzEsIDB4YTAwZSwgMHg3MDM0LCAweDcwNzIsIDB4NzAzOCwgMHg3MDc2LCAweDAwNzgsCisJMHg1NDdkLCAweDcwNzAsIDB4YTA4MCwgMHgwMDQwLCAweDcwNzIsIDB4MDBjOCwgMHg1NDdkLCAweDcwNzQsCisJMHhhMDgxLCAweDAwMDAsIDB4NzA3NiwgMHhhMDg1LCAweDAwMDEsIDB4NzkzMiwgMHg3MTMyLCAweDAwN2MsCisJMHgwZDdlLCAweDEwNzgsIDB4NWIxZSwgMHgwZDdmLCAweDAwN2MsIDB4MGQ3ZSwgMHgyMDExLCAweDAwMDQsCisJMHgyMjA0LCAweGEwODUsIDB4ODAwMiwgMHgyMDEyLCAweDBkN2YsIDB4MDA3YywgMHgyMGUxLCAweDAwMDIsCisJMHgzZDA4LCAweDIwZTEsIDB4MjAwMCwgMHgzZDAwLCAweGEwODQsIDB4NzAwMCwgMHgwMDQwLCAweDU0OWMsCisJMHhhMDg2LCAweDEwMDAsIDB4MDBjMCwgMHg1NGQzLCAweDIwZTEsIDB4MDAwMCwgMHgzZDAwLCAweGEwOTQsCisJMHhmZjAwLCAweDgyMTcsIDB4YTA4NCwgMHhmMDAwLCAweGEwODYsIDB4MzAwMCwgMHgwMGMwLCAweDU0YjcsCisJMHhhMTg0LCAweGZmMDAsIDB4ODAwNywgMHhhMDg2LCAweDAwMDgsIDB4MDBjMCwgMHg1NGQzLCAweDEwNzgsCisJMHgyOWJiLCAweDAwYzAsIDB4NTRkMywgMHgxMDc4LCAweDU2YjIsIDB4MDA3OCwgMHg1NGNlLCAweDIwZTEsCisJMHgwMDA0LCAweDNkNjAsIDB4ZDFiYywgMHgwMGMwLCAweDU0YmUsIDB4M2U2MCwgMHhhYzg0LCAweDAwMGYsCisJMHgwMGMwLCAweDU0ZDMsIDB4YWM4MiwgMHhhZDAwLCAweDAwNDgsIDB4NTRkMywgMHg2ODU4LCAweGFjMDIsCisJMHgwMGM4LCAweDU0ZDMsIDB4MjAwOSwgMHgwMDQ3LCAweDEwNzgsIDB4Nzc1YywgMHg3YTFjLCAweGQyODQsCisJMHgwMGMwLCAweDU0OGUsIDB4MDA3YywgMHhhMDE2LCAweDEwNzgsIDB4MTVmYSwgMHgwMDc4LCAweDU0Y2UsCisJMHgwMDc4LCAweDU0ZDMsIDB4NzgxYywgMHhkMDhjLCAweDAwNDAsIDB4NTUwMiwgMHgxNTdlLCAweDEzN2UsCisJMHgxNDdlLCAweDIwZTEsIDB4MzAwMCwgMHgzZDIwLCAweDNlMjgsIDB4YTU4NCwgMHgwMDc2LCAweDAwYzAsCisJMHg1NTE4LCAweGE0ODQsIDB4NzAwMCwgMHhhMDg2LCAweDEwMDAsIDB4MDBjMCwgMHg1NTA3LCAweDEwNzgsCisJMHg1NTRlLCAweDAwNDAsIDB4NTUxOCwgMHgyMGUxLCAweDMwMDAsIDB4NzgyOCwgMHg3ODI4LCAweDEwNzgsCisJMHg1NTZjLCAweDE0N2YsIDB4MTM3ZiwgMHgxNTdmLCAweDIwMDksIDB4YThiOSwgMHgyMTA0LCAweGEwMDUsCisJMHgwMGMwLCAweDU1MDMsIDB4MDA3YywgMHgxMDc4LCAweDYyZDEsIDB4MDA3OCwgMHg1NTAyLCAweGE0ODQsCisJMHg3MDAwLCAweDAwYzAsIDB4NTUxOCwgMHgxMDc4LCAweDU1NGUsIDB4MDA0MCwgMHg1NTJjLCAweDcwMDAsCisJMHhhMDg0LCAweGZmMDAsIDB4YTA4NiwgMHg4MTAwLCAweDAwNDAsIDB4NTRmMywgMHgwMDc4LCAweDU1MmMsCisJMHgxMDc4LCAweGE1NGYsIDB4ZDVhNCwgMHgwMDQwLCAweDU1MjgsIDB4MDQ3ZSwgMHgxMDc4LCAweDFiMjIsCisJMHgwNDdmLCAweDIwZTEsIDB4OTAxMCwgMHgyMDAxLCAweDAxMzgsIDB4MjIwMiwgMHgwMDc4LCAweDU1MzAsCisJMHgxMDc4LCAweDU1NGUsIDB4Njg4MywgMHgwMDAwLCAweDIwZTEsIDB4MzAwMCwgMHg3ODI4LCAweDc4MjgsCisJMHgxMDc4LCAweDU1MzcsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsIDB4MDA3OCwgMHg1NTAyLCAweDIwMDEsCisJMHhhNjBlLCAweDIwMDQsIDB4ZDA4YywgMHgwMDQwLCAweDU1NGQsIDB4MjAwMSwgMHhhNjAwLCAweDIwMDQsCisJMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHg1NTRkLCAweDAyN2UsIDB4MDM3ZSwgMHgyMDExLCAweDgwNDgsCisJMHgyNTE4LCAweDEwNzgsIDB4MzYxYiwgMHgwMzdmLCAweDAyN2YsIDB4MDA3YywgMHhhNDg0LCAweDAxZmYsCisJMHg2ODgyLCAweGEwMDUsIDB4MDA0MCwgMHg1NTYwLCAweGEwODAsIDB4MDAxZiwgMHhhMDg0LCAweDAzZjgsCisJMHg4MGFjLCAweDIwZTEsIDB4MTAwMCwgMHgyZWEwLCAweDIwOTksIDB4MDIwYSwgMHg1M2E1LCAweDAwN2MsCisJMHgyMGE5LCAweDAwMGMsIDB4MjBlMSwgMHgxMDAwLCAweDJlYTAsIDB4MjA5OSwgMHgwMjBhLCAweDUzYTUsCisJMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwgMHg1NTVmLCAweDcwMDAsIDB4YTA4NCwgMHhmZjAwLCAweGEwOGMsCisJMHhmMDAwLCAweDgwMDcsIDB4YTE5NiwgMHgwMDAwLCAweDAwYzAsIDB4NTU3OSwgMHgwMDc4LCAweDU3YmEsCisJMHgwMDdjLCAweGExOTYsIDB4MjAwMCwgMHgwMGMwLCAweDU1OGEsIDB4NjkwMCwgMHhhMThlLCAweDAwMDEsCisJMHgwMGMwLCAweDU1ODYsIDB4MTA3OCwgMHgzYWVjLCAweDAwNzgsIDB4NTU3OCwgMHgxMDc4LCAweDU1OTIsCisJMHgwMDc4LCAweDU1NzgsIDB4YTE5NiwgMHg4MDAwLCAweDAwYzAsIDB4NTU3OCwgMHgxMDc4LCAweDU4NzEsCisJMHgwMDc4LCAweDU1NzgsIDB4MGM3ZSwgMHg3MTEwLCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweGExOTYsCisJMHgwMDAxLCAweDAwNDAsIDB4NTU5ZiwgMHhhMTk2LCAweDAwMjMsIDB4MDBjMCwgMHg1NmFhLCAweGEwOGUsCisJMHgwMDIzLCAweDAwYzAsIDB4NTVkNCwgMHgxMDc4LCAweDU5MWQsIDB4MDA0MCwgMHg1NmFhLCAweDcxMjQsCisJMHg2MTBhLCAweDcwMzAsIDB4YTA4ZSwgMHgwMjAwLCAweDAwYzAsIDB4NTViOCwgMHg3MDM0LCAweGEwMDUsCisJMHgwMGMwLCAweDU2YWEsIDB4MjAwOSwgMHgwMDE1LCAweDEwNzgsIDB4Nzc1YywgMHgwMDc4LCAweDU2YWEsCisJMHhhMDhlLCAweDAyMTQsIDB4MDA0MCwgMHg1NWMwLCAweGEwOGUsIDB4MDIxMCwgMHgwMGMwLCAweDU1YzYsCisJMHgyMDA5LCAweDAwMTUsIDB4MTA3OCwgMHg3NzVjLCAweDAwNzgsIDB4NTZhYSwgMHhhMDhlLCAweDAxMDAsCisJMHgwMGMwLCAweDU2YWEsIDB4NzAzNCwgMHhhMDA1LCAweDAwYzAsIDB4NTZhYSwgMHgyMDA5LCAweDAwMTYsCisJMHgxMDc4LCAweDc3NWMsIDB4MDA3OCwgMHg1NmFhLCAweGEwOGUsIDB4MDAyMiwgMHgwMGMwLCAweDU2YWEsCisJMHg3MDMwLCAweGEwOGUsIDB4MDMwMCwgMHgwMGMwLCAweDU1ZTUsIDB4NzAzNCwgMHhhMDA1LCAweDAwYzAsCisJMHg1NmFhLCAweDIwMDksIDB4MDAxNywgMHgwMDc4LCAweDU2NzYsIDB4YTA4ZSwgMHgwNTAwLCAweDAwYzAsCisJMHg1NWYxLCAweDcwMzQsIDB4YTAwNSwgMHgwMGMwLCAweDU2YWEsIDB4MjAwOSwgMHgwMDE4LCAweDAwNzgsCisJMHg1Njc2LCAweGEwOGUsIDB4MjAxMCwgMHgwMGMwLCAweDU1ZjksIDB4MjAwOSwgMHgwMDE5LCAweDAwNzgsCisJMHg1Njc2LCAweGEwOGUsIDB4MjExMCwgMHgwMGMwLCAweDU2MDEsIDB4MjAwOSwgMHgwMDFhLCAweDAwNzgsCisJMHg1Njc2LCAweGEwOGUsIDB4NTIwMCwgMHgwMGMwLCAweDU2MGQsIDB4NzAzNCwgMHhhMDA1LCAweDAwYzAsCisJMHg1NmFhLCAweDIwMDksIDB4MDAxYiwgMHgwMDc4LCAweDU2NzYsIDB4YTA4ZSwgMHg1MDAwLCAweDAwYzAsCisJMHg1NjE5LCAweDcwMzQsIDB4YTAwNSwgMHgwMGMwLCAweDU2YWEsIDB4MjAwOSwgMHgwMDFjLCAweDAwNzgsCisJMHg1Njc2LCAweGEwOGUsIDB4MTMwMCwgMHgwMGMwLCAweDU2MjEsIDB4MjAwOSwgMHgwMDM0LCAweDAwNzgsCisJMHg1Njc2LCAweGEwOGUsIDB4MTIwMCwgMHgwMGMwLCAweDU2MmQsIDB4NzAzNCwgMHhhMDA1LCAweDAwYzAsCisJMHg1NmFhLCAweDIwMDksIDB4MDAyNCwgMHgwMDc4LCAweDU2NzYsIDB4YTA4YywgMHhmZjAwLCAweGExOGUsCisJMHgyNDAwLCAweDAwYzAsIDB4NTYzNywgMHgyMDA5LCAweDAwMmQsIDB4MDA3OCwgMHg1Njc2LCAweGEwOGMsCisJMHhmZjAwLCAweGExOGUsIDB4NTMwMCwgMHgwMGMwLCAweDU2NDEsIDB4MjAwOSwgMHgwMDJhLCAweDAwNzgsCisJMHg1Njc2LCAweGEwOGUsIDB4MGYwMCwgMHgwMGMwLCAweDU2NDksIDB4MjAwOSwgMHgwMDIwLCAweDAwNzgsCisJMHg1Njc2LCAweGEwOGUsIDB4NTMwMCwgMHgwMGMwLCAweDU2NGYsIDB4MDA3OCwgMHg1NjZjLCAweGEwOGUsCisJMHg2MTA0LCAweDAwYzAsIDB4NTY2YywgMHgyMDExLCAweGFiOGQsIDB4ODIwOCwgMHgyMjA0LCAweGEwODIsCisJMHgwMDA0LCAweDIwYTgsIDB4OTVhYywgMHg5NWFjLCAweDIwMTEsIDB4ODAxNSwgMHgyMTFjLCAweDgxMDgsCisJMHgwNDdlLCAweDIxMjQsIDB4MTA3OCwgMHgzNjFiLCAweDA0N2YsIDB4ODEwOCwgMHgwMGYwLCAweDU2NWMsCisJMHgyMDA5LCAweDAwMjMsIDB4MDA3OCwgMHg1Njc2LCAweGEwOGUsIDB4NjAwMCwgMHgwMGMwLCAweDU2NzQsCisJMHgyMDA5LCAweDAwM2YsIDB4MDA3OCwgMHg1Njc2LCAweDIwMDksIDB4MDAxZCwgMHgwMTdlLCAweDIwMTEsCisJMHhhYjgzLCAweDIyMDQsIDB4ODIxMSwgMHgyMjBjLCAweDEwNzgsIDB4MjU0ZCwgMHgwMGMwLCAweDU2YWMsCisJMHgxMDc4LCAweDQ1NWMsIDB4MDBjMCwgMHg1NmFjLCAweDY2MTIsIDB4NjUxNiwgMHg4NmZmLCAweDAwNDAsCisJMHg1NjljLCAweDAxN2YsIDB4MDE3ZSwgMHhhMTg2LCAweDAwMTcsIDB4MDBjMCwgMHg1NjljLCAweDY4NmMsCisJMHhhNjA2LCAweDAwYzAsIDB4NTY5YywgMHg2ODcwLCAweGE1MDYsIDB4YTA4NCwgMHhmZjAwLCAweDAwYzAsCisJMHg1NjljLCAweDYwMDAsIDB4YzBmNSwgMHg2MDAyLCAweDBjN2UsIDB4MTA3OCwgMHg3NmM3LCAweDAwNDAsCisJMHg1NmFmLCAweDAxN2YsIDB4NjExYSwgMHg2MDFmLCAweDAwMDQsIDB4NzEyMCwgMHg2MTBhLCAweDAxN2YsCisJMHgxMDc4LCAweDc3NWMsIDB4MGM3ZiwgMHgwMDdjLCAweDAxN2YsIDB4MDA3OCwgMHg1NmFhLCAweDBjN2YsCisJMHgwMDc4LCAweDU2YWMsIDB4MGM3ZSwgMHgxMDc4LCAweDU3MGYsIDB4MDBjMCwgMHg1NzBkLCAweGEyOGUsCisJMHgwMDMzLCAweDAwYzAsIDB4NTZkZSwgMHgxMDc4LCAweDU5MWQsIDB4MDA0MCwgMHg1NzBkLCAweDcxMjQsCisJMHg2MTBhLCAweDcwMzAsIDB4YTA4ZSwgMHgwMjAwLCAweDAwYzAsIDB4NTZkMCwgMHg3MDM0LCAweGEwMDUsCisJMHgwMGMwLCAweDU3MGQsIDB4MjAwOSwgMHgwMDE1LCAweDEwNzgsIDB4Nzc1YywgMHgwMDc4LCAweDU3MGQsCisJMHhhMDhlLCAweDAxMDAsIDB4MDBjMCwgMHg1NzBkLCAweDcwMzQsIDB4YTAwNSwgMHgwMGMwLCAweDU3MGQsCisJMHgyMDA5LCAweDAwMTYsIDB4MTA3OCwgMHg3NzVjLCAweDAwNzgsIDB4NTcwZCwgMHhhMjhlLCAweDAwMzIsCisJMHgwMGMwLCAweDU3MGQsIDB4NzAzMCwgMHhhMDhlLCAweDE0MDAsIDB4MDBjMCwgMHg1NzBkLCAweDIwMDksCisJMHgwMDM4LCAweDAxN2UsIDB4MjAxMSwgMHhhYjgzLCAweDIyMDQsIDB4ODIxMSwgMHgyMjBjLCAweDEwNzgsCisJMHgyNTRkLCAweDAwYzAsIDB4NTcwYywgMHgxMDc4LCAweDQ1NWMsIDB4MDBjMCwgMHg1NzBjLCAweDY2MTIsCisJMHg2NTE2LCAweDBjN2UsIDB4MTA3OCwgMHg3NmM3LCAweDAwNDAsIDB4NTcwYiwgMHgwMTdmLCAweDYxMWEsCisJMHg2MDFmLCAweDAwMDQsIDB4NzEyMCwgMHg2MTBhLCAweDAxN2YsIDB4MTA3OCwgMHg3NzVjLCAweDEwNzgsCisJMHg2MmQxLCAweDAwNzgsIDB4NTcwZCwgMHgwYzdmLCAweDAxN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDBmN2UsCisJMHgwZDdlLCAweDAyN2UsIDB4MDE3ZSwgMHgxMzdlLCAweDE0N2UsIDB4MTU3ZSwgMHgzYzAwLCAweDAwN2UsCisJMHgyMDc5LCAweDAwMzAsIDB4MjA2OSwgMHgwMjAwLCAweDEwNzgsIDB4MWM2YSwgMHgwMGMwLCAweDU3NTAsCisJMHgxMDc4LCAweDFiNDAsIDB4MDA0MCwgMHg1NzVkLCAweDc5MDgsIDB4YTE4YywgMHgxZmZmLCAweGExODIsCisJMHgwMDExLCAweDAwYzgsIDB4NTc1YSwgMHgyMGE5LCAweDAwMGMsIDB4MjBlMSwgMHgwMDAwLCAweDJlYTAsCisJMHgyMDk5LCAweDAyMGEsIDB4NTNhNSwgMHgyMGUxLCAweDIwMDAsIDB4MjAwMSwgMHgwMjBhLCAweDIwMDQsCisJMHg3YTBjLCAweDc4MDgsIDB4YTA4MCwgMHgwMDA3LCAweGEwODQsIDB4MWZmOCwgMHhhMDhhLCAweDAxNDAsCisJMHgxMGM4LCAweDEzMzIsIDB4ODBhYywgMHgyMGUxLCAweDYwMDAsIDB4MjA5OSwgMHgwMjBhLCAweDUzYTUsCisJMHgyMGUxLCAweDcwMDAsIDB4NjgyOCwgMHg2ODI4LCAweDc4MDMsIDB4MDAwNCwgMHhhMjk0LCAweDAwNzAsCisJMHgwMDdmLCAweDIwZTAsIDB4MTU3ZiwgMHgxNDdmLCAweDEzN2YsIDB4MDE3ZiwgMHgwMjdmLCAweDBkN2YsCisJMHgwZjdmLCAweDAwN2MsIDB4YTAxNiwgMHgxMDc4LCAweDE1ZmEsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsCisJMHg1NzUwLCAweDA0N2UsIDB4MGU3ZSwgMHgwZDdlLCAweDIwMjgsIDB4MjEzMCwgMHhhNjk2LCAweDAwZmYsCisJMHgwMGMwLCAweDU3ODIsIDB4YTU5NiwgMHhmZmZkLCAweDAwYzAsIDB4NTc3MiwgMHgyMDA5LCAweDAwN2YsCisJMHgwMDc4LCAweDU3YjUsIDB4YTU5NiwgMHhmZmZlLCAweDAwYzAsIDB4NTc3YSwgMHgyMDA5LCAweDAwN2UsCisJMHgwMDc4LCAweDU3YjUsIDB4YTU5NiwgMHhmZmZjLCAweDAwYzAsIDB4NTc4MiwgMHgyMDA5LCAweDAwODAsCisJMHgwMDc4LCAweDU3YjUsIDB4MjAxMSwgMHgwMDAwLCAweDIwMjEsIDB4MDA4MSwgMHgyMGE5LCAweDAwN2UsCisJMHgyMDcxLCAweGE3YjYsIDB4MmUxYywgMHg4M2ZmLCAweDAwYzAsIDB4NTc5NCwgMHg4MmZmLCAweDAwYzAsCisJMHg1N2E5LCAweDI0MTAsIDB4MDA3OCwgMHg1N2E5LCAweDIzNjgsIDB4NmYxMCwgMHgwMDdlLCAweDIxMDAsCisJMHhhNzA2LCAweDAwN2YsIDB4NmIxNCwgMHgwMGMwLCAweDU3YTMsIDB4YTM0NiwgMHgwMGMwLCAweDU3YTMsCisJMHgyNDA4LCAweDAwNzgsIDB4NTdiNSwgMHg4N2ZmLCAweDAwYzAsIDB4NTdhOSwgMHg4M2ZmLCAweDAwNDAsCisJMHg1NzhlLCAweDg0MjAsIDB4OGU3MCwgMHgwMGYwLCAweDU3OGEsIDB4ODJmZiwgMHgwMGMwLCAweDU3YjQsCisJMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwgMHg1N2I2LCAweDIyMDgsIDB4YTAwNiwgMHgwZDdmLCAweDBlN2YsCisJMHgwNDdmLCAweDAwN2MsIDB4YTA4NCwgMHgwMDA3LCAweDAwNzksIDB4NTdiZiwgMHgwMDdjLCAweDU3YzcsCisJMHg1N2M3LCAweDU3YzcsIDB4NTkzMywgMHg1N2M3LCAweDU3YzgsIDB4NTdlMSwgMHg1ODU4LCAweDAwN2MsCisJMHg3MTEwLCAweGQxYmMsIDB4MDA0MCwgMHg1N2UwLCAweDcxMjAsIDB4MjE2MCwgMHhhYzhjLCAweDAwMGYsCisJMHgwMGMwLCAweDU3ZTAsIDB4YWM4YSwgMHhhZDAwLCAweDAwNDgsIDB4NTdlMCwgMHg2ODU4LCAweGFjMDIsCisJMHgwMGM4LCAweDU3ZTAsIDB4NzEyNCwgMHg2MTBhLCAweDIwMDksIDB4MDA0NiwgMHgxMDc4LCAweDc3NWMsCisJMHgwMDdjLCAweDBjN2UsIDB4YTQ4NCwgMHgwMWZmLCAweDAwNDAsIDB4NTgzMywgMHg3MTEwLCAweGQxYmMsCisJMHgwMGMwLCAweDU4MzMsIDB4MjAxMSwgMHhhYjgzLCAweDIyMDQsIDB4ODIxMSwgMHgyMjBjLCAweDEwNzgsCisJMHgyNTRkLCAweDAwYzAsIDB4NTgzMywgMHgxMDc4LCAweDQ1NWMsIDB4MDBjMCwgMHg1ODMzLCAweDY2MTIsCisJMHg2NTE2LCAweDYwMDAsIDB4ZDBlYywgMHgwMGMwLCAweDU4MzMsIDB4NjIwNCwgMHhhMjk0LCAweGZmMDAsCisJMHg4MjE3LCAweGEyODYsIDB4MDAwNiwgMHgwMGMwLCAweDU4MTgsIDB4MGM3ZSwgMHgxMDc4LCAweDc2YzcsCisJMHgwMTdmLCAweDAwNDAsIDB4NTgzNSwgMHg2MTFhLCAweDYwMWYsIDB4MDAwNiwgMHg3MTIwLCAweDYxMGEsCisJMHg3MTMwLCAweDYxMjIsIDB4MjAwOSwgMHgwMDQ0LCAweDEwNzgsIDB4Nzc1YywgMHgwMDc4LCAweDU4MzMsCisJMHgwYzdlLCAweDEwNzgsIDB4NzZjNywgMHgwMTdmLCAweDAwNDAsIDB4NTgzMywgMHg2MTFhLCAweDYwMWYsCisJMHgwMDA0LCAweDcxMjAsIDB4NjEwYSwgMHhhMjg2LCAweDAwMDQsIDB4MDBjMCwgMHg1ODJiLCAweDYwMDcsCisJMHgwMDA1LCAweDAwNzgsIDB4NTgyZCwgMHg2MDA3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsCisJMHg1ZGQ3LCAweDEwNzgsIDB4NjJkMSwgMHgwYzdmLCAweDAwN2MsIDB4MjAwMSwgMHhhNjBkLCAweDIwMDQsCisJMHhkMGVjLCAweDAwNDAsIDB4NTgzZiwgMHgyMDExLCAweDgwNDksIDB4MTA3OCwgMHgzNjFiLCAweDBjN2UsCisJMHgxMDc4LCAweDkxODcsIDB4MDE3ZiwgMHgwMDQwLCAweDU4MzMsIDB4NjExYSwgMHg2MDFmLCAweDAwMDYsCisJMHg3MTIwLCAweDYxMGEsIDB4NzEzMCwgMHg2MTIyLCAweDYwMTMsIDB4MDMwMCwgMHg2MDAzLCAweDAwMDEsCisJMHg2MDA3LCAweDAwNDEsIDB4MTA3OCwgMHg1ZDhhLCAweDEwNzgsIDB4NjJkMSwgMHgwMDc4LCAweDU4MzMsCisJMHg3MTEwLCAweGQxYmMsIDB4MDA0MCwgMHg1ODcwLCAweDcwMjAsIDB4MjA2MCwgMHhhYzg0LCAweDAwMGYsCisJMHgwMGMwLCAweDU4NzAsIDB4YWM4MiwgMHhhZDAwLCAweDAwNDgsIDB4NTg3MCwgMHg2ODU4LCAweGFjMDIsCisJMHgwMGM4LCAweDU4NzAsIDB4NzEyNCwgMHg2MTBhLCAweDIwMDksIDB4MDA0NSwgMHgxMDc4LCAweDc3NWMsCisJMHgwMDdjLCAweDAwN2UsIDB4MTA3OCwgMHgyOWJiLCAweDAwN2YsIDB4MDBjMCwgMHg1ODg3LCAweDcxMTAsCisJMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHhhMThlLCAweDAwMDAsIDB4MDBjMCwgMHg1ODg3LCAweGEwODQsCisJMHgwMDBmLCAweGEwOGEsIDB4MDAwNiwgMHgwMGM4LCAweDU4ODcsIDB4MTA3OSwgMHg1ODg4LCAweDAwN2MsCisJMHg1ODhlLCAweDU4OGYsIDB4NTg4ZSwgMHg1ODhlLCAweDU4ZmYsIDB4NTkwZSwgMHgwMDdjLCAweDcxMTAsCisJMHhkMWJjLCAweDAwNDAsIDB4NTg5NywgMHg3MDJjLCAweGQwODQsIDB4MDA0MCwgMHg1OGZlLCAweDcwMGMsCisJMHg3MTA4LCAweDEwNzgsIDB4MjU0ZCwgMHgwMGMwLCAweDU4ZmUsIDB4MTA3OCwgMHg0NTVjLCAweDAwYzAsCisJMHg1OGZlLCAweDY2MTIsIDB4NjUxNiwgMHg2MjA0LCAweDcxMTAsIDB4ZDFiYywgMHgwMDQwLCAweDU4YzksCisJMHhhMjhjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDA0LCAweDAwNDAsIDB4NThiMiwgMHhhMTg2LCAweDAwMDYsCisJMHgwMGMwLCAweDU4ZWYsIDB4MGM3ZSwgMHgxMDc4LCAweDU5MWQsIDB4MGM3ZiwgMHgwMDQwLCAweDU4ZmUsCisJMHgwYzdlLCAweDEwNzgsIDB4NzZjNywgMHgwMTdmLCAweDAwNDAsIDB4NThmZSwgMHg2MTFhLCAweDYwMWYsCisJMHgwMDAyLCAweDcxMjAsIDB4NjEwYSwgMHgyMDA5LCAweDAwODgsIDB4MTA3OCwgMHg3NzVjLCAweDAwNzgsCisJMHg1OGZlLCAweGEyOGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMDYsIDB4MDA0MCwgMHg1OGRlLCAweGExODYsCisJMHgwMDA0LCAweDAwNDAsIDB4NThkZSwgMHhhMjk0LCAweGZmMDAsIDB4ODIxNywgMHhhMjg2LCAweDAwMDQsCisJMHgwMDQwLCAweDU4ZGUsIDB4YTI4NiwgMHgwMDA2LCAweDAwYzAsIDB4NThlZiwgMHgwYzdlLCAweDEwNzgsCisJMHg3NmM3LCAweDAxN2YsIDB4MDA0MCwgMHg1OGZlLCAweDYxMWEsIDB4NjAxZiwgMHgwMDA1LCAweDcxMjAsCisJMHg2MTBhLCAweDIwMDksIDB4MDA4OCwgMHgxMDc4LCAweDc3NWMsIDB4MDA3OCwgMHg1OGZlLCAweDBjN2UsCisJMHgxMDc4LCAweDc2YzcsIDB4MDE3ZiwgMHgwMDQwLCAweDU4ZmUsIDB4NjExYSwgMHg2MDFmLCAweDAwMDQsCisJMHg3MTIwLCAweDYxMGEsIDB4MjAwOSwgMHgwMDAxLCAweDEwNzgsIDB4Nzc1YywgMHgwMDdjLCAweDcxMTAsCisJMHhkMWJjLCAweDAwNDAsIDB4NTkwZCwgMHgxMDc4LCAweDU5MWQsIDB4MDA0MCwgMHg1OTBkLCAweDcxMjQsCisJMHg2MTBhLCAweDIwMDksIDB4MDA4OSwgMHgxMDc4LCAweDc3NWMsIDB4MDA3YywgMHg3MTEwLCAweGQxYmMsCisJMHgwMDQwLCAweDU5MWMsIDB4MTA3OCwgMHg1OTFkLCAweDAwNDAsIDB4NTkxYywgMHg3MTI0LCAweDYxMGEsCisJMHgyMDA5LCAweDAwOGEsIDB4MTA3OCwgMHg3NzVjLCAweDAwN2MsIDB4NzAyMCwgMHgyMDYwLCAweGFjODQsCisJMHgwMDBmLCAweDAwYzAsIDB4NTkzMCwgMHhhYzgyLCAweGFkMDAsIDB4MDA0OCwgMHg1OTMwLCAweDIwMDEsCisJMHhhNjE2LCAweDIwMDQsIDB4YWMwMiwgMHgwMGM4LCAweDU5MzAsIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsCisJMHhhMDA2LCAweDAwNzgsIDB4NTkyZiwgMHg3MTEwLCAweGQxYmMsIDB4MDBjMCwgMHg1OTQ5LCAweDcwMjQsCisJMHgyMDYwLCAweGFjODQsIDB4MDAwZiwgMHgwMGMwLCAweDU5NDksIDB4YWM4MiwgMHhhZDAwLCAweDAwNDgsCisJMHg1OTQ5LCAweDY4NTgsIDB4YWMwMiwgMHgwMGM4LCAweDU5NDksIDB4MjAwOSwgMHgwMDUxLCAweDEwNzgsCisJMHg3NzVjLCAweDAwN2MsIDB4MjA3MSwgMHhhOGM0LCAweDcwMDMsIDB4MDAwMywgMHg3MDBmLCAweDAzNjEsCisJMHhhMDA2LCAweDcwMWEsIDB4NzAxMiwgMHg3MDE3LCAweGFkMDAsIDB4NzAwNywgMHgwMDAwLCAweDcwMjYsCisJMHg3MDJiLCAweDZlMWMsIDB4NzAzMiwgMHg3MDM3LCAweDZlNzAsIDB4NzAzYiwgMHgwMDAyLCAweDcwM2YsCisJMHgwMDAwLCAweDcwNDMsIDB4ZmZmZiwgMHg3MDQ3LCAweGZmZmYsIDB4MDA3YywgMHgyMDcxLCAweGE4YzQsCisJMHgwMGUwLCAweDVhMzIsIDB4MjA5MSwgMHg2MDAwLCAweDcwMGMsIDB4ODAwMSwgMHg3MDBlLCAweDAwYzAsCisJMHg1OWRlLCAweDcwMGYsIDB4MDM2MSwgMHg3MDA3LCAweDAwMDEsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHg3MTM4LCAweDgxMDksIDB4NzEzYSwgMHgwMGMwLCAweDU5ZGMsIDB4NzAzYiwgMHgwMDAyLCAweDIwMDksCisJMHgwMTAwLCAweDIxMDQsIDB4YTA4MiwgMHgwMDAzLCAweDAwYzgsIDB4NTlkYywgMHg3MDNjLCAweGEwODYsCisJMHgwMDAxLCAweDAwYzAsIDB4NTliOSwgMHgwZDdlLCAweDIwNjksIDB4MDE0MCwgMHg2ODA0LCAweGEwODQsCisJMHg0MDAwLCAweDAwNDAsIDB4NTk5NywgMHg2ODAzLCAweDEwMDAsIDB4MDA3OCwgMHg1OTllLCAweDY4MDQsCisJMHhhMDg0LCAweDEwMDAsIDB4MDA0MCwgMHg1OTllLCAweDY4MDMsIDB4MDEwMCwgMHg2ODAzLCAweDAwMDAsCisJMHg3MDNmLCAweDAwMDAsIDB4MjA2OSwgMHhhOGIxLCAweDY4MDQsIDB4YTA4MiwgMHgwMDA2LCAweDAwYzAsCisJMHg1OWFiLCAweDY4MDcsIDB4MDAwMCwgMHg2ODMwLCAweGEwODIsIDB4MDAwMywgMHgwMGMwLCAweDU5YjIsCisJMHg2ODMzLCAweDAwMDAsIDB4MTA3OCwgMHg2MmQxLCAweDEwNzgsIDB4NjM5YiwgMHgwZDdmLCAweDAwNzgsCisJMHg1OWRjLCAweDBkN2UsIDB4MjA2OSwgMHhhNjAwLCAweDY5NDgsIDB4Njg2NCwgMHhhMTAyLCAweDAwYzgsCisJMHg1OWRiLCAweDIwNjksIDB4YThiMSwgMHg2ODA0LCAweGEwODYsIDB4MDAwMCwgMHgwMGMwLCAweDU5ZGIsCisJMHg2ODMwLCAweGEwODYsIDB4MDAwMCwgMHgwMGMwLCAweDU5ZGIsIDB4NzAzZiwgMHgwMDAxLCAweDY4MDcsCisJMHgwMDA2LCAweDY4MzMsIDB4MDAwMywgMHgyMDY5LCAweDAxMDAsIDB4NjgzMCwgMHg2ODllLCAweDIwNjksCisJMHgwMTQwLCAweDY4MDMsIDB4MDYwMCwgMHgwZDdmLCAweDAwNzgsIDB4NTllMSwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDcwMjQsIDB4YTAwZCwgMHgwMDQwLCAweDU5ZjksIDB4NzAyMCwgMHg4MDAxLCAweDcwMjIsCisJMHgwMGMwLCAweDU5ZjksIDB4NzAyMywgMHgwMDA5LCAweDgxMDksIDB4NzEyNiwgMHhhMTg2LCAweDAzZTgsCisJMHgwMGMwLCAweDU5ZjQsIDB4NzAyOCwgMHgxMDdhLCAweDgxZmYsIDB4MDBjMCwgMHg1OWY5LCAweDcwMjgsCisJMHgxMDdhLCAweDcwMzAsIDB4YTAwZCwgMHgwMDQwLCAweDVhMTAsIDB4NzAyYywgMHg4MDAxLCAweDcwMmUsCisJMHgwMGMwLCAweDVhMTAsIDB4NzAyZiwgMHgwMDA5LCAweDgxMDksIDB4NzEzMiwgMHgwMDQwLCAweDVhMGUsCisJMHhhMTg0LCAweDAwN2YsIDB4MTA0MCwgMHg2ZWEyLCAweDAwNzgsIDB4NWExMCwgMHg3MDM0LCAweDEwN2EsCisJMHg3MDQwLCAweGEwMDUsIDB4MDA0MCwgMHg1YTE4LCAweDAwNTAsIDB4NWExOCwgMHg4MDAxLCAweDcwNDIsCisJMHg3MDQ0LCAweGEwMDUsIDB4MDA0MCwgMHg1YTIwLCAweDAwNTAsIDB4NWEyMCwgMHg4MDAxLCAweDcwNDYsCisJMHg3MDE4LCAweGEwMGQsIDB4MDA0MCwgMHg1YTMxLCAweDcwMDgsIDB4ODAwMSwgMHg3MDBhLCAweDAwYzAsCisJMHg1YTMxLCAweDcwMGIsIDB4MDAwOSwgMHg4MTA5LCAweDcxMWEsIDB4MDBjMCwgMHg1YTMxLCAweDcwMWMsCisJMHgxMDdhLCAweDEyN2YsIDB4NzAwNCwgMHgwMDc5LCAweDVhMzUsIDB4NWE1YywgMHg1YTVkLCAweDVhNzksCisJMHgwZTdlLCAweDIwNzEsIDB4YThjNCwgMHg3MDE4LCAweGEwMDUsIDB4MDBjMCwgMHg1YTQzLCAweDcxMWEsCisJMHg3MjFlLCAweDcwMGIsIDB4MDAwOSwgMHgwZTdmLCAweDAwN2MsIDB4MGU3ZSwgMHgwMDdlLCAweDIwNzEsCisJMHhhOGM0LCAweDcwMWMsIDB4YTIwNiwgMHgwMGMwLCAweDVhNGYsIDB4NzAxYSwgMHg3MDFlLCAweDAwN2YsCisJMHgwZTdmLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGE4YzQsIDB4NjA4OCwgMHhhMTAyLCAweDAwNDgsCisJMHg1YTVhLCAweDYxOGEsIDB4MGU3ZiwgMHgwMDdjLCAweDAwN2MsIDB4NzExMCwgMHgxMDc4LCAweDQ1YzQsCisJMHgwMGMwLCAweDVhNmYsIDB4NjA4OCwgMHg4MDAxLCAweDAwNDgsIDB4NWE2ZiwgMHg2MDhhLCAweDAwYzAsCisJMHg1YTZmLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4NjJkMSwgMHgxMjdmLCAweDgxMDgsCisJMHhhMTgyLCAweDAwZmYsIDB4MDA0OCwgMHg1YTc3LCAweGEwMGUsIDB4NzAwNywgMHgwMDAyLCAweDcxMTIsCisJMHgwMDdjLCAweDcwMTQsIDB4MjA2MCwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MDNjLCAweGEwMDUsCisJMHgwMDQwLCAweDVhODgsIDB4ODAwMSwgMHg2MDNlLCAweDAwYzAsIDB4NWE4OCwgMHgxMDc4LCAweDhmOWMsCisJMHg2MDE0LCAweGEwMDUsIDB4MDA0MCwgMHg1YWIyLCAweDgwMDEsIDB4NjAxNiwgMHgwMGMwLCAweDVhYjIsCisJMHg2MTFjLCAweGExODYsIDB4MDAwMywgMHgwMDQwLCAweDVhOTksIDB4YTE4NiwgMHgwMDA2LCAweDAwYzAsCisJMHg1YWIwLCAweDYwMTAsIDB4MjA2OCwgMHg2ODU0LCAweGEwOGEsIDB4MTk5YSwgMHgwMDQ4LCAweDVhYjAsCisJMHhhMDgyLCAweDE5OTksIDB4Njg1NiwgMHhhMDhhLCAweDE5OWEsIDB4MDA0OCwgMHg1YWE5LCAweDIwMDEsCisJMHgxOTk5LCAweDgwMDMsIDB4ODAwYiwgMHg4MTBiLCAweGExMDgsIDB4NjExNiwgMHgwMDc4LCAweDVhYjIsCisJMHgxMDc4LCAweDhhYmUsIDB4MTI3ZiwgMHhhYzg4LCAweDAwMTAsIDB4NzExNiwgMHgyMDAxLCAweGNkMDAsCisJMHhhMTAyLCAweDAwNDgsIDB4NWFiZiwgMHg3MDE3LCAweGFkMDAsIDB4NzAwNywgMHgwMDAwLCAweDAwN2MsCisJMHgwZTdlLCAweDIwNzEsIDB4YThjNCwgMHg3MDI3LCAweDA3ZDAsIDB4NzAyMywgMHgwMDA5LCAweDcwM2IsCisJMHgwMDAyLCAweDBlN2YsIDB4MDA3YywgMHgyMDAxLCAweGE4Y2QsIDB4MjAwMywgMHgwMDAwLCAweDAwN2MsCisJMHgwZTdlLCAweDIwNzEsIDB4YThjNCwgMHg3MTMyLCAweDcwMmYsIDB4MDAwOSwgMHgwZTdmLCAweDAwN2MsCisJMHgyMDExLCAweGE4ZDAsIDB4MjAxMywgMHgwMDAwLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGE4YzQsCisJMHg3MTFhLCAweDcyMWUsIDB4NzAwYiwgMHgwMDA5LCAweDBlN2YsIDB4MDA3YywgMHgwMjdlLCAweDBlN2UsCisJMHgwZjdlLCAweDIwNzksIDB4YTYwMCwgMHg3YTM0LCAweGQyOTQsIDB4MDA0MCwgMHg1YjE1LCAweDIwNzEsCisJMHhhOGFjLCAweDJlMTQsIDB4YTBmZSwgMHgwMDAwLCAweDAwNDAsIDB4NWIwMiwgMHhhMGZlLCAweDAwMDEsCisJMHgwMDQwLCAweDViMDYsIDB4YTBmZSwgMHgwMDAyLCAweDAwYzAsIDB4NWIxMSwgMHhhMjkyLCAweDAwODUsCisJMHgwMDc4LCAweDViMDgsIDB4YTI5MiwgMHgwMDA1LCAweDAwNzgsIDB4NWIwOCwgMHhhMjkyLCAweDAwMDIsCisJMHgyMjcyLCAweDAwNDAsIDB4NWIwZCwgMHgwMGM4LCAweDViMTUsIDB4MjAxMSwgMHg4MDM3LCAweDEwNzgsCisJMHgzNjFiLCAweDIwMTEsIDB4YThhYiwgMHgyMjA0LCAweDIwNzIsIDB4MGY3ZiwgMHgwZTdmLCAweDAyN2YsCisJMHgwMDdjLCAweDBjN2UsIDB4MjA2MSwgMHhhOTMzLCAweDBjN2YsIDB4MDA3YywgMHhhMTg0LCAweDAwMGYsCisJMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMDgwLCAweGE5MzMsIDB4MjA2MCwgMHgwMDdjLCAweDY4NTQsCisJMHhhMDhhLCAweDE5OWEsIDB4MDA0OCwgMHg1YjJlLCAweDIwMDEsIDB4MTk5OSwgMHhhMDA1LCAweDAwYzAsCisJMHg1YjNkLCAweDBjN2UsIDB4MjA2MSwgMHhhOTMzLCAweDYwMTQsIDB4MGM3ZiwgMHhhMDA1LCAweDAwYzAsCisJMHg1YjQyLCAweDIwMDEsIDB4MDAxZSwgMHgwMDc4LCAweDViNDIsIDB4YTA4ZSwgMHhmZmZmLCAweDAwYzAsCisJMHg1YjQyLCAweGEwMDYsIDB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4YTEwOCwgMHg2MTE2LCAweDY4NGMsCisJMHhhMDhjLCAweDAwYzAsIDB4YTE4ZSwgMHgwMGMwLCAweDAwNDAsIDB4NWI5ZSwgMHhkMGI0LCAweDAwYzAsCisJMHg1YjU5LCAweGQwYmMsIDB4MDBjMCwgMHg1YjhiLCAweDIwMDksIDB4MDAwNiwgMHgxMDc4LCAweDViYzMsCisJMHgwMDdjLCAweGQwZmMsIDB4MDA0MCwgMHg1YjY0LCAweGEwODQsIDB4MDAwMywgMHgwMDQwLCAweDViNjQsCisJMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHg1YmJjLCAweDYwMjQsIDB4ZDBkNCwgMHgwMDQwLCAweDViNmUsCisJMHhjMGQ0LCAweDYwMjYsIDB4Njg2MCwgMHg2MDJhLCAweDY4NWMsIDB4NjAyZSwgMHgyMDA5LCAweGE2NzQsCisJMHgyMTA0LCAweGQwODQsIDB4MDA0MCwgMHg1YjgzLCAweDYxMTgsIDB4YTE4OCwgMHgwMDI3LCAweDIxMDQsCisJMHhkMDhjLCAweDAwYzAsIDB4NWI4MywgMHg4N2ZmLCAweDAwYzAsIDB4NWI4MiwgMHgyMDA5LCAweDAwNDIsCisJMHgxMDc4LCAweDc3NWMsIDB4MDA3YywgMHg4N2ZmLCAweDAwYzAsIDB4NWI4YSwgMHgyMDA5LCAweDAwNDMsCisJMHgxMDc4LCAweDc3NWMsIDB4MDA3YywgMHhkMGZjLCAweDAwNDAsIDB4NWI5NiwgMHhhMDg0LCAweDAwMDMsCisJMHgwMDQwLCAweDViOTYsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsIDB4NWJiYywgMHg4N2ZmLCAweDAwYzAsCisJMHg1YjlkLCAweDIwMDksIDB4MDA0MiwgMHgxMDc4LCAweDc3NWMsIDB4MDA3YywgMHhkMGZjLCAweDAwNDAsCisJMHg1YmFmLCAweGEwODQsIDB4MDAwMywgMHhhMDhlLCAweDAwMDIsIDB4MDA0MCwgMHg1YmIzLCAweDg3ZmYsCisJMHgwMGMwLCAweDViYWUsIDB4MjAwOSwgMHgwMDQxLCAweDEwNzgsIDB4Nzc1YywgMHgwMDdjLCAweDEwNzgsCisJMHg1YmMxLCAweDAwNzgsIDB4NWJhZSwgMHg4N2ZmLCAweDAwYzAsIDB4NWJhZSwgMHgyMDA5LCAweDAwNDMsCisJMHgxMDc4LCAweDc3NWMsIDB4MDA3OCwgMHg1YmFlLCAweDIwMDksIDB4MDAwNCwgMHgxMDc4LCAweDViYzMsCisJMHgwMDdjLCAweDIwMDksIDB4MDAwMSwgMHgwZDdlLCAweDYwMTAsIDB4YTBlYywgMHhmMDAwLCAweDAwNDAsCisJMHg1YmVmLCAweDIwNjgsIDB4Njk1MiwgMHg2ODAwLCAweDYwMTIsIDB4YTE4NiwgMHgwMDAxLCAweDAwYzAsCisJMHg1YmU1LCAweDY5NGMsIDB4YTE4YywgMHg4MTAwLCAweGExOGUsIDB4ODEwMCwgMHgwMGMwLCAweDViZTUsCisJMHgwYzdlLCAweDIwNjEsIDB4YTkzMywgMHg2MjAwLCAweGQyOGMsIDB4MDBjMCwgMHg1YmU0LCAweDYyMDQsCisJMHg4MjEwLCAweDAwNDgsIDB4NWJlNCwgMHg2MjA2LCAweDBjN2YsIDB4MTA3OCwgMHg0YTczLCAweDYwMTAsCisJMHhhMDZkLCAweDA3N2UsIDB4MjAzOSwgMHgwMDAwLCAweDEwYzAsIDB4NWIyNywgMHgwNzdmLCAweDBkN2YsCisJMHgwMDdjLCAweDE1N2UsIDB4MGM3ZSwgMHgyMDYxLCAweGE5MzMsIDB4NjAwMCwgMHg4MWZmLCAweDAwNDAsCisJMHg1YmZjLCAweGEyMDUsIDB4MDA3OCwgMHg1YmZkLCAweGEyMDQsIDB4NjAwMiwgMHgwYzdmLCAweDE1N2YsCisJMHgwMDdjLCAweDY4MDAsIDB4ZDA4YywgMHgwMGMwLCAweDVjMGQsIDB4NjgwOCwgMHhhMDA1LCAweDAwNDAsCisJMHg1YzBkLCAweDgwMDEsIDB4NjgwYSwgMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHgyMGE5LCAweDAwMTAsCisJMHhhMDA2LCAweDgwMDQsIDB4ODA4NiwgMHg4MThlLCAweDAwYzgsIDB4NWMxNywgMHhhMjAwLCAweDAwZjAsCisJMHg1YzEyLCAweDgwODYsIDB4ODE4ZSwgMHgwMDdjLCAweDE1N2UsIDB4MjBhOSwgMHgwMDEwLCAweGEwMDUsCisJMHgwMDQwLCAweDVjM2QsIDB4YTExYSwgMHgwMGM4LCAweDVjM2QsIDB4ODIxMywgMHg4MThkLCAweDAwNDgsCisJMHg1YzMwLCAweGExMWEsIDB4MDBjOCwgMHg1YzMxLCAweDAwZjAsIDB4NWMyNSwgMHgwMDc4LCAweDVjMzUsCisJMHhhMTFhLCAweDIzMDgsIDB4ODIxMCwgMHgwMGYwLCAweDVjMjUsIDB4MDA3ZSwgMHgzMjAwLCAweGEwODQsCisJMHhmN2ZmLCAweDIwODAsIDB4MDA3ZiwgMHgxNTdmLCAweDAwN2MsIDB4MDA3ZSwgMHgzMjAwLCAweGEwODUsCisJMHgwODAwLCAweDAwNzgsIDB4NWMzOSwgMHgxMjdlLCAweDIwOTEsIDB4MjIwMCwgMHgyMDc5LCAweGE4YjEsCisJMHgxMjdmLCAweDBkN2UsIDB4MjA2OSwgMHhhOGIxLCAweDY4MDMsIDB4MDAwNSwgMHgyMDY5LCAweDAwMDQsCisJMHgyZDA0LCAweGEwODUsIDB4ODAwMSwgMHgyMDZhLCAweDBkN2YsIDB4MDA3YywgMHgwYzdlLCAweDYwMjcsCisJMHgwMDAxLCAweDc4MDQsIDB4YTA4NCwgMHgwMDA3LCAweDAwNzksIDB4NWM1ZSwgMHg1YzY4LCAweDVjOGQsCisJMHg1Y2U4LCAweDVjNmUsIDB4NWM4ZCwgMHg1YzY4LCAweDVjNjYsIDB4NWM2NiwgMHgxMDc4LCAweDEzMzIsCisJMHgxMDc4LCAweDVhY2IsIDB4MTA3OCwgMHg2MmQxLCAweDBjN2YsIDB4MDA3YywgMHg2MmMwLCAweDgyZmYsCisJMHgwMGMwLCAweDVjNzQsIDB4MGM3ZiwgMHgwMDdjLCAweDIwMTEsIDB4NDFkYywgMHgxMDc4LCAweDVhNDUsCisJMHg3ODI4LCAweGEwOTIsIDB4MDBjOCwgMHgwMGM4LCAweDVjODMsIDB4ODAwMCwgMHg3ODJhLCAweDEwNzgsCisJMHg0MjFiLCAweDAwNzgsIDB4NWM3MiwgMHgxMDc4LCAweDQxZGMsIDB4NzgwNywgMHgwMDAzLCAweDc4MjcsCisJMHgwMDAwLCAweDc4MmIsIDB4MDAwMCwgMHgwMDc4LCAweDVjNzIsIDB4MTA3OCwgMHg1YWNiLCAweDNjMDAsCisJMHgwMDdlLCAweDIwMTEsIDB4MDIwOSwgMHgyMGUxLCAweDQwMDAsIDB4MjIxNCwgMHgwMDdmLCAweDIwZTAsCisJMHg4MmZmLCAweDAwNDAsIDB4NWNhYiwgMHg2MmMwLCAweDgyZmYsIDB4MDBjMCwgMHg1Y2FiLCAweDc4MmIsCisJMHgwMDAwLCAweDc4MjQsIDB4YTA2NSwgMHgxMDQwLCAweDEzMzIsIDB4MjAwOSwgMHgwMDEzLCAweDEwNzgsCisJMHg3NzVjLCAweDBjN2YsIDB4MDA3YywgMHgzOTAwLCAweGEwODIsIDB4YTllMywgMHgwMGM4LCAweDVjYjIsCisJMHgxMDc4LCAweDc0N2EsIDB4MGM3ZSwgMHg3ODI0LCAweGEwNjUsIDB4MTA0MCwgMHgxMzMyLCAweDc4MDQsCisJMHhhMDg2LCAweDAwMDQsIDB4MDA0MCwgMHg1ZDJkLCAweDc4MjgsIDB4YTA5MiwgMHgyNzEwLCAweDAwYzgsCisJMHg1Y2M4LCAweDgwMDAsIDB4NzgyYSwgMHgwYzdmLCAweDEwNzgsIDB4NmUwMSwgMHgwMDc4LCAweDVjYTksCisJMHg2MTA0LCAweGExODYsIDB4MDAwMywgMHgwMGMwLCAweDVjZGYsIDB4MGU3ZSwgMHgyMDcxLCAweGE2MDAsCisJMHg3MGQ4LCAweDBlN2YsIDB4ZDA4YywgMHgwMDQwLCAweDVjZGYsIDB4MGM3ZSwgMHgwZTdlLCAweDIwNjEsCisJMHgwMTAwLCAweDIwNzEsIDB4YTYwMCwgMHgxMDc4LCAweDQyMjQsIDB4MGU3ZiwgMHgwYzdmLCAweDEwNzgsCisJMHhhNWM0LCAweDIwMDksIDB4MDAxNCwgMHgxMDc4LCAweDc3NWMsIDB4MGM3ZiwgMHgwMDc4LCAweDVjYTksCisJMHgyMDAxLCAweGE4Y2QsIDB4MjAwMywgMHgwMDAwLCAweDYyYzAsIDB4ODJmZiwgMHgwMGMwLCAweDVjZmMsCisJMHg3ODJiLCAweDAwMDAsIDB4NzgyNCwgMHhhMDY1LCAweDEwNDAsIDB4MTMzMiwgMHgyMDA5LCAweDAwMTMsCisJMHgxMDc4LCAweDc3YjMsIDB4MGM3ZiwgMHgwMDdjLCAweDBjN2UsIDB4MGQ3ZSwgMHgzOTAwLCAweGEwODIsCisJMHhhOWUzLCAweDAwYzgsIDB4NWQwNSwgMHgxMDc4LCAweDc0N2EsIDB4NzgyNCwgMHhhMDA1LCAweDEwNDAsCisJMHgxMzMyLCAweDc4MWMsIDB4YTA2ZCwgMHgxMDQwLCAweDEzMzIsIDB4NjgwMCwgMHhjMGRjLCAweDY4MDIsCisJMHg3OTI0LCAweDIxNjAsIDB4MTA3OCwgMHg3NzJkLCAweDY5M2MsIDB4ODFmZiwgMHgxMDQwLCAweDEzMzIsCisJMHg4MTA5LCAweDY5M2UsIDB4Njg1NCwgMHhhMDE1LCAweDAwNDAsIDB4NWQyMSwgMHg3YTFlLCAweDAwNzgsCisJMHg1ZDIzLCAweDc5MTgsIDB4NzkxZSwgMHg3ODA3LCAweDAwMDAsIDB4NzgyNywgMHgwMDAwLCAweDBkN2YsCisJMHgwYzdmLCAweDEwNzgsIDB4NjJkMSwgMHgwMDc4LCAweDVjZmEsIDB4NjEwNCwgMHhhMTg2LCAweDAwMDIsCisJMHgwMDQwLCAweDVkMzgsIDB4YTE4NiwgMHgwMDA0LCAweDAwNDAsIDB4NWQzOCwgMHgwMDc4LCAweDVjYmMsCisJMHg3ODA4LCAweGFjMDYsIDB4MDA0MCwgMHg1Y2JjLCAweDEwNzgsIDB4NjFjZCwgMHgxMDc4LCAweDVkZDcsCisJMHgwYzdmLCAweDEwNzgsIDB4NjJkMSwgMHgwMDc4LCAweDVjYTksIDB4MGM3ZSwgMHg2MDI3LCAweDAwMDIsCisJMHg2MmM4LCAweDgyZmYsIDB4MDBjMCwgMHg1ZDYxLCAweDYyYzQsIDB4ODJmZiwgMHgwMGMwLCAweDVkNjEsCisJMHg3OTNjLCAweGExZTUsIDB4MDAwMCwgMHgwMDQwLCAweDVkNWIsIDB4MjAwOSwgMHgwMDQ5LCAweDEwNzgsCisJMHg3NzVjLCAweDBjN2YsIDB4MDA3YywgMHgyMDExLCAweGE4ZDAsIDB4MjAxMywgMHgwMDAwLCAweDAwNzgsCisJMHg1ZDU5LCAweDM5MDgsIDB4YTE5MiwgMHhhOWUzLCAweDAwYzgsIDB4NWQ2OCwgMHgxMDc4LCAweDc0N2EsCisJMHg2MDE3LCAweDAwMTAsIDB4NzkzYywgMHg4MWZmLCAweDAwNDAsIDB4NWQ1YiwgMHg3OTQ0LCAweGExOTIsCisJMHg3NTMwLCAweDAwYzgsIDB4NWQ4NSwgMHg4MTA4LCAweDc5NDYsIDB4NzkzYywgMHhhMTg4LCAweDAwMDcsCisJMHgyMTBjLCAweGExOGUsIDB4MDAwNiwgMHgwMGMwLCAweDVkODEsIDB4NjAxNywgMHgwMDEyLCAweDAwNzgsCisJMHg1ZDU5LCAweDYwMTcsIDB4MDAxNiwgMHgwMDc4LCAweDVkNTksIDB4Nzg0OCwgMHhjMDg1LCAweDc4NGEsCisJMHgwMDc4LCAweDVkNTksIDB4MDA3ZSwgMHgwMTdlLCAweDBjN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHg2MDBmLCAweDAwMDAsIDB4MmMwOCwgMHgyMDYxLCAweGE4YjEsIDB4NjAyMCwgMHg4MDAwLCAweDYwMjIsCisJMHg2MDEwLCAweGEwMDUsIDB4MDA0MCwgMHg1ZGE1LCAweGEwODAsIDB4MDAwMywgMHgyMTAyLCAweDYxMTIsCisJMHgxMjdmLCAweDBjN2YsIDB4MDE3ZiwgMHgwMDdmLCAweDAwN2MsIDB4NjExNiwgMHg2MTEyLCAweDAwNzgsCisJMHg1ZGEwLCAweDBkN2UsIDB4MjA2OSwgMHhhOGIxLCAweDYwMDAsIDB4ZDBkNCwgMHgwMDQwLCAweDVkYmUsCisJMHg2ODIwLCAweDgwMDAsIDB4NjgyMiwgMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHg1ZGI5LCAweDJjMDAsCisJMHg2ODFlLCAweDY4MDQsIDB4YTA4NCwgMHgwMDA3LCAweDAwNzksIDB4NjJkOSwgMHhjMGQ1LCAweDYwMDIsCisJMHg2ODE4LCAweGEwMDUsIDB4MDA0MCwgMHg1ZGQwLCAweDYwNTYsIDB4NjA1YiwgMHgwMDAwLCAweDAwN2UsCisJMHgyYzAwLCAweDY4MWEsIDB4MGQ3ZiwgMHg2ODVhLCAweDIwNjksIDB4YThiMSwgMHgwMDc4LCAweDVkYjAsCisJMHg2MDU2LCAweDYwNWEsIDB4MmMwMCwgMHg2ODFhLCAweDY4MWUsIDB4MDA3OCwgMHg1ZGIwLCAweDAwN2UsCisJMHgwMTdlLCAweDBjN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjAwZiwgMHgwMDAwLCAweDJjMDgsCisJMHgyMDYxLCAweGE4YjEsIDB4NjAyMCwgMHg4MDAwLCAweDYwMjIsIDB4NjAwOCwgMHhhMDA1LCAweDAwNDAsCisJMHg1ZGYyLCAweGEwODAsIDB4MDAwMywgMHgyMTAyLCAweDYxMGEsIDB4MTI3ZiwgMHgwYzdmLCAweDAxN2YsCisJMHgwMDdmLCAweDAwN2MsIDB4NjEwZSwgMHg2MTBhLCAweDAwNzgsIDB4NWRlZCwgMHgwYzdlLCAweDYwMGYsCisJMHgwMDAwLCAweDJjMDgsIDB4MjA2MSwgMHhhOGIxLCAweDYwMzQsIDB4YTAwNSwgMHgwMDQwLCAweDVlMDYsCisJMHhhMDgwLCAweDAwMDMsIDB4MjEwMiwgMHg2MTM2LCAweDBjN2YsIDB4MDA3YywgMHg2MTNhLCAweDYxMzYsCisJMHgwMDc4LCAweDVlMDQsIDB4MGY3ZSwgMHgwZTdlLCAweDBkN2UsIDB4MGM3ZSwgMHgwNjdlLCAweDA1N2UsCisJMHgwMzdlLCAweDAyN2UsIDB4MDE3ZSwgMHgwMDdlLCAweDEyN2UsIDB4YTAyZSwgMHgyMDcxLCAweGE4YjEsCisJMHg3NjM4LCAweDI2NjAsIDB4MjY3OCwgMHgyMDkxLCAweDgwMDAsIDB4OGNmZiwgMHgwMDQwLCAweDVlOGMsCisJMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEyMDYsIDB4MDBjMCwgMHg1ZTg3LCAweDg3ZmYsCisJMHgwMDQwLCAweDVlMmUsIDB4NjAyMCwgMHhhMTA2LCAweDAwYzAsIDB4NWU4NywgMHg3MDNjLCAweGFjMDYsCisJMHgwMGMwLCAweDVlNDQsIDB4MDM3ZSwgMHgyMDE5LCAweDAwMDEsIDB4MTA3OCwgMHg3MDU4LCAweDcwMzMsCisJMHgwMDAwLCAweDcwM2YsIDB4MDAwMCwgMHg3MDQzLCAweDAwMDAsIDB4NzA0NywgMHgwMDAwLCAweDcwNGIsCisJMHgwMDAwLCAweDAzN2YsIDB4MjAyOSwgMHgwMDAxLCAweDcwMzgsIDB4YWMzNiwgMHgwMGMwLCAweDVlNGEsCisJMHg2NjBjLCAweDc2M2EsIDB4NzAzNCwgMHhhYzM2LCAweDAwYzAsIDB4NWU1OCwgMHgyYzAwLCAweGFmMzYsCisJMHgwMDQwLCAweDVlNTYsIDB4MmYwMCwgMHg3MDM2LCAweDAwNzgsIDB4NWU1OCwgMHg3MDM3LCAweDAwMDAsCisJMHg2NjBjLCAweDA2N2UsIDB4MmMwMCwgMHhhZjA2LCAweDAwNDAsIDB4NWU2MSwgMHg3ZTBlLCAweDAwNzgsCisJMHg1ZTYyLCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLCAweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDVlODIsCisJMHg2MDEwLCAweDIwNjgsIDB4NjAxYywgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHg1ZTlkLCAweDY4MzcsCisJMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLCAweDAxN2UsIDB4MDM3ZSwgMHgwNzdlLCAweDEwNzgsCisJMHg4ZjdkLCAweDEwNzgsIDB4YTRlMiwgMHgxMDc4LCAweDRhNzMsIDB4MDc3ZiwgMHgwMzdmLCAweDAxN2YsCisJMHgxMDc4LCAweDhlYjksIDB4MTA3OCwgMHg4ZWM2LCAweDBjN2YsIDB4MDA3OCwgMHg1ZTFkLCAweDJjNzgsCisJMHg2MDBjLCAweDIwNjAsIDB4MDA3OCwgMHg1ZTFkLCAweDg1ZmYsIDB4MDA0MCwgMHg1ZTkxLCAweDEwNzgsCisJMHg2MzliLCAweDEyN2YsIDB4MDA3ZiwgMHgwMTdmLCAweDAyN2YsIDB4MDM3ZiwgMHgwNTdmLCAweDA2N2YsCisJMHgwYzdmLCAweDBkN2YsIDB4MGU3ZiwgMHgwZjdmLCAweDAwN2MsIDB4NjAxYywgMHhhMDg2LCAweDAwMDYsCisJMHgwMGMwLCAweDVlNmYsIDB4MDE3ZSwgMHgwMzdlLCAweDA3N2UsIDB4MTA3OCwgMHhhNGUyLCAweDEwNzgsCisJMHhhMWNhLCAweDA3N2YsIDB4MDM3ZiwgMHgwMTdmLCAweDAwNzgsIDB4NWU4MiwgMHgwMDdlLCAweDA2N2UsCisJMHgwYzdlLCAweDBkN2UsIDB4MGY3ZSwgMHgyMDMxLCAweDAwMDAsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDc5LCAweGE4YjEsIDB4NzgzOCwgMHhhMDY1LCAweDAwNDAsIDB4NWVlZiwgMHg2MDBjLCAweDAwN2UsCisJMHg2MDBmLCAweDAwMDAsIDB4NzgzYywgMHhhYzA2LCAweDAwYzAsIDB4NWVkNiwgMHgwMzdlLCAweDIwMTksCisJMHgwMDAxLCAweDEwNzgsIDB4NzA1OCwgMHg3ODMzLCAweDAwMDAsIDB4NzgzZiwgMHgwMDAwLCAweDc4NDMsCisJMHgwMDAwLCAweDc4NDcsIDB4MDAwMCwgMHg3ODRiLCAweDAwMDAsIDB4MDM3ZiwgMHgxMDc4LCAweDhkMDYsCisJMHgwMDQwLCAweDVlZWEsIDB4NjAxMCwgMHgyMDY4LCAweDYwMWMsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsCisJMHg1ZWY4LCAweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgxMDc4LCAweDRhNzMsCisJMHgxMDc4LCAweDhlYjksIDB4MTA3OCwgMHg4ZWM2LCAweDAwN2YsIDB4MDA3OCwgMHg1ZWJiLCAweDdlM2EsCisJMHg3ZTM2LCAweDEyN2YsIDB4MGY3ZiwgMHgwZDdmLCAweDBjN2YsIDB4MDY3ZiwgMHgwMDdmLCAweDAwN2MsCisJMHg2MDFjLCAweGEwODYsIDB4MDAwNiwgMHgwMGMwLCAweDVlZTEsIDB4MTA3OCwgMHhhMWNhLCAweDAwNzgsCisJMHg1ZWVhLCAweDAxN2UsIDB4MDI3ZSwgMHgwODdlLCAweDIwNDEsIDB4MDAwMCwgMHgxMDc4LCAweDVmMWIsCisJMHgxMDc4LCAweDVmZGIsIDB4MDg3ZiwgMHgwMjdmLCAweDAxN2YsIDB4MDA3YywgMHgwZjdlLCAweDEyN2UsCisJMHgyMDc5LCAweGE4YjEsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4NjA3NiwgMHgxMDc4LCAweDYwZWMsCisJMHgxMjdmLCAweDBmN2YsIDB4MDA3YywgMHgwZjdlLCAweDBlN2UsIDB4MGQ3ZSwgMHgwYzdlLCAweDA2N2UsCisJMHgwMTdlLCAweDAwN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhOGIxLCAweDc2MTQsCisJMHgyNjYwLCAweDI2NzgsIDB4OGNmZiwgMHgwMDQwLCAweDVmYjUsIDB4NjAxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweGEyMDYsIDB4MDBjMCwgMHg1ZmIwLCAweDg4ZmYsIDB4MDA0MCwgMHg1ZjNiLCAweDYwMjAsCisJMHhhMTA2LCAweDAwYzAsIDB4NWZiMCwgMHg3MDI0LCAweGFjMDYsIDB4MDBjMCwgMHg1ZjZiLCAweDIwNjksCisJMHgwMTAwLCAweDY4YzAsIDB4YTAwNSwgMHgwMDQwLCAweDVmNjYsIDB4MTA3OCwgMHg1YWNiLCAweDEwNzgsCisJMHg2ZTBmLCAweDY4YzMsIDB4MDAwMCwgMHgxMDc4LCAweDczNzgsIDB4NzAyNywgMHgwMDAwLCAweDAzN2UsCisJMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHhhMzg0LCAweDEwMDAsIDB4MDA0MCwgMHg1ZjViLCAweDY4MDMsCisJMHgwMTAwLCAweDY4MDMsIDB4MDAwMCwgMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwgMHhkMDg0LCAweDAwNDAsCisJMHg1ZjYzLCAweDY4MjcsIDB4MDAwMSwgMHgwMzdmLCAweDAwNzgsIDB4NWY2YiwgMHg2MDAzLCAweDAwMDksCisJMHg2MzBhLCAweDAwNzgsIDB4NWZiMCwgMHg3MDE0LCAweGFjMzYsIDB4MDBjMCwgMHg1ZjcxLCAweDY2MGMsCisJMHg3NjE2LCAweDcwMTAsIDB4YWMzNiwgMHgwMGMwLCAweDVmN2YsIDB4MmMwMCwgMHhhZjM2LCAweDAwNDAsCisJMHg1ZjdkLCAweDJmMDAsIDB4NzAxMiwgMHgwMDc4LCAweDVmN2YsIDB4NzAxMywgMHgwMDAwLCAweDY2MGMsCisJMHgwNjdlLCAweDJjMDAsIDB4YWYwNiwgMHgwMDQwLCAweDVmODgsIDB4N2UwZSwgMHgwMDc4LCAweDVmODksCisJMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4ZDA2LCAweDAwNDAsCisJMHg1ZmE5LCAweDYwMWMsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsIDB4NWZiZSwgMHg2ODM3LCAweDAxMDMsCisJMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgwMTdlLCAweDAzN2UsIDB4MDg3ZSwgMHgxMDc4LCAweDhmN2QsCisJMHgxMDc4LCAweGE0ZTIsIDB4MTA3OCwgMHg0YTczLCAweDA4N2YsIDB4MDM3ZiwgMHgwMTdmLCAweDEwNzgsCisJMHg4ZWI5LCAweDEwNzgsIDB4OGVjNiwgMHgxMDc4LCAweDcyMzMsIDB4MGM3ZiwgMHgwMDc4LCAweDVmMmEsCisJMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwMDc4LCAweDVmMmEsIDB4MTI3ZiwgMHgwMDdmLCAweDAxN2YsCisJMHgwNjdmLCAweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDBmN2YsIDB4MDA3YywgMHg2MDFjLCAweGEwODYsCisJMHgwMDA2LCAweDAwYzAsIDB4NWZjZiwgMHgwMTdlLCAweDAzN2UsIDB4MDg3ZSwgMHgxMDc4LCAweGE0ZTIsCisJMHgxMDc4LCAweGExY2EsIDB4MDg3ZiwgMHgwMzdmLCAweDAxN2YsIDB4MDA3OCwgMHg1ZmE5LCAweDYwMWMsCisJMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHg1ZmE5LCAweDYwMDQsIDB4YTA4NiwgMHgwMDg1LCAweDAwNDAsCisJMHg1Zjk2LCAweDAwNzgsIDB4NWZhOSwgMHgwYzdlLCAweDAwN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHhhMjgwLCAweGE3MzUsIDB4MjAwNCwgMHhhMDY1LCAweDAwNDAsIDB4NjA3MiwgMHgwZjdlLCAweDBlN2UsCisJMHgwZDdlLCAweDA2N2UsIDB4MjA3MSwgMHhhOGIxLCAweDY2NTQsIDB4NzAxOCwgMHhhYzA2LCAweDAwYzAsCisJMHg1ZmYyLCAweDc2MWEsIDB4NzAxYywgMHhhYzA2LCAweDAwYzAsIDB4NWZmZSwgMHg4NmZmLCAweDAwYzAsCisJMHg1ZmZkLCAweDcwMTgsIDB4NzAxZSwgMHgwMDc4LCAweDVmZmUsIDB4NzYxZSwgMHg2MDU4LCAweGEwN2QsCisJMHgwMDQwLCAweDYwMDMsIDB4N2U1NiwgMHhhNmVkLCAweDAwMDAsIDB4MDA0MCwgMHg2MDA5LCAweDJmMDAsCisJMHg2ODVhLCAweDYwNTcsIDB4MDAwMCwgMHg2MDViLCAweDAwMDAsIDB4NjAwMCwgMHhjMGQ0LCAweGMwZGMsCisJMHg2MDAyLCAweDEwNzgsIDB4NDRkMywgMHgwMDQwLCAweDYwNmUsIDB4NzYyNCwgMHg4NmZmLCAweDAwNDAsCisJMHg2MDVjLCAweGE2ODAsIDB4MDAwNCwgMHgyMDA0LCAweGFkMDYsIDB4MDBjMCwgMHg2MDVjLCAweDBkN2UsCisJMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwgMHhhMDA1LCAweDAwNDAsIDB4NjA1MywgMHgxMDc4LCAweDVhY2IsCisJMHgxMDc4LCAweDZlMGYsIDB4NjhjMywgMHgwMDAwLCAweDEwNzgsIDB4NzM3OCwgMHg3MDI3LCAweDAwMDAsCisJMHgwMzdlLCAweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweGEzODQsIDB4MTAwMCwgMHgwMDQwLCAweDYwM2MsCisJMHg2ODAzLCAweDAxMDAsIDB4NjgwMywgMHgwMDAwLCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsCisJMHgwMDQwLCAweDYwNDQsIDB4NjgyNywgMHgwMDAxLCAweDAzN2YsIDB4MGQ3ZiwgMHgwYzdlLCAweDYwM2MsCisJMHhhMDA1LCAweDAwNDAsIDB4NjA0ZCwgMHg4MDAxLCAweDYwM2UsIDB4MjY2MCwgMHgxMDc4LCAweDhlYzYsCisJMHgwYzdmLCAweDAwNzgsIDB4NjA1YywgMHgwZDdmLCAweDBjN2UsIDB4MjY2MCwgMHg2MDAzLCAweDAwMDksCisJMHg2MzBhLCAweDBjN2YsIDB4MDA3OCwgMHg2MDExLCAweDhkZmYsIDB4MDA0MCwgMHg2MDZhLCAweDY4MzcsCisJMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLCAweDEwNzgsIDB4OGY3ZCwgMHgxMDc4LCAweGE0ZTIsCisJMHgxMDc4LCAweDRhNzMsIDB4MTA3OCwgMHg3MjMzLCAweDAwNzgsIDB4NjAxMSwgMHgwNjdmLCAweDBkN2YsCisJMHgwZTdmLCAweDBmN2YsIDB4MTI3ZiwgMHgwMDdmLCAweDBjN2YsIDB4MDA3YywgMHgwMDdlLCAweDA2N2UsCisJMHgwYzdlLCAweDBkN2UsIDB4MjAzMSwgMHgwMDAwLCAweDc4MTQsIDB4YTA2NSwgMHgwMDQwLCAweDYwZDAsCisJMHg2MDBjLCAweDAwN2UsIDB4NjAwZiwgMHgwMDAwLCAweDc4MjQsIDB4YWMwNiwgMHgwMGMwLCAweDYwYjUsCisJMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwgMHhhMDA1LCAweDAwNDAsIDB4NjBhZiwgMHgxMDc4LCAweDVhY2IsCisJMHgxMDc4LCAweDZlMGYsIDB4NjhjMywgMHgwMDAwLCAweDEwNzgsIDB4NzM3OCwgMHg3ODI3LCAweDAwMDAsCisJMHgwMzdlLCAweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweGEzODQsIDB4MTAwMCwgMHgwMDQwLCAweDYwYTQsCisJMHg2ODAzLCAweDAxMDAsIDB4NjgwMywgMHgwMDAwLCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsCisJMHgwMDQwLCAweDYwYWMsIDB4NjgyNywgMHgwMDAxLCAweDAzN2YsIDB4MDA3OCwgMHg2MGI1LCAweDYwMDMsCisJMHgwMDA5LCAweDYzMGEsIDB4MmMzMCwgMHgwMDc4LCAweDYwY2QsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsCisJMHg4ZDA2LCAweDAwNDAsIDB4NjBjOSwgMHg2MDFjLCAweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweDYwZDcsCisJMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsIDB4MTA3OCwgMHg0YTczLCAweDEwNzgsCisJMHg4ZWI5LCAweDEwNzgsIDB4OGVjNiwgMHgxMDc4LCAweDcyMzMsIDB4MDA3ZiwgMHgwMDc4LCAweDYwN2QsCisJMHg3ZTE2LCAweDdlMTIsIDB4MGQ3ZiwgMHgwYzdmLCAweDA2N2YsIDB4MDA3ZiwgMHgwMDdjLCAweDYwMWMsCisJMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHg2MGUwLCAweDEwNzgsIDB4YTFjYSwgMHgwMDc4LCAweDYwYzksCisJMHg2MDFjLCAweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDYwYzksIDB4NjAwNCwgMHhhMDg2LCAweDAwODUsCisJMHgwMDQwLCAweDYwYzAsIDB4MDA3OCwgMHg2MGM5LCAweDAwN2UsIDB4MDY3ZSwgMHgwYzdlLCAweDBkN2UsCisJMHg3ODE4LCAweGEwNjUsIDB4MDA0MCwgMHg2MTVhLCAweDYwNTQsIDB4MDA3ZSwgMHg2MDU3LCAweDAwMDAsCisJMHg2MDViLCAweDAwMDAsIDB4NjAwMCwgMHhjMGQ0LCAweGMwZGMsIDB4NjAwMiwgMHgxMDc4LCAweDQ0ZDMsCisJMHgwMDQwLCAweDYxNTcsIDB4N2UyNCwgMHg4NmZmLCAweDAwNDAsIDB4NjE0OSwgMHhhNjgwLCAweDAwMDQsCisJMHgyMDA0LCAweGFkMDYsIDB4MDBjMCwgMHg2MTQ5LCAweDBkN2UsIDB4MjA2OSwgMHgwMTAwLCAweDY4YzAsCisJMHhhMDA1LCAweDAwNDAsIDB4NjE0MCwgMHgxMDc4LCAweDVhY2IsIDB4MTA3OCwgMHg2ZTBmLCAweDY4YzMsCisJMHgwMDAwLCAweDEwNzgsIDB4NzM3OCwgMHg3ODI3LCAweDAwMDAsIDB4MDM3ZSwgMHgyMDY5LCAweDAxNDAsCisJMHg2YjA0LCAweGEzODQsIDB4MTAwMCwgMHgwMDQwLCAweDYxMjksIDB4NjgwMywgMHgwMTAwLCAweDY4MDMsCisJMHgwMDAwLCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDA0MCwgMHg2MTMxLCAweDY4MjcsCisJMHgwMDAxLCAweDAzN2YsIDB4MGQ3ZiwgMHgwYzdlLCAweDYwM2MsIDB4YTAwNSwgMHgwMDQwLCAweDYxM2EsCisJMHg4MDAxLCAweDYwM2UsIDB4MjY2MCwgMHgxMDc4LCAweDhlYzYsIDB4MGM3ZiwgMHgwMDc4LCAweDYxNDksCisJMHgwZDdmLCAweDBjN2UsIDB4MjY2MCwgMHg2MDAzLCAweDAwMDksIDB4NjMwYSwgMHgwYzdmLCAweDAwNzgsCisJMHg2MGZlLCAweDhkZmYsIDB4MDA0MCwgMHg2MTUzLCAweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsCisJMHgwMDAwLCAweDEwNzgsIDB4NGE3MywgMHgxMDc4LCAweDcyMzMsIDB4MDA3OCwgMHg2MGZlLCAweDAwN2YsCisJMHgwMDc4LCAweDYwZjEsIDB4NzgxZSwgMHg3ODFhLCAweDBkN2YsIDB4MGM3ZiwgMHgwNjdmLCAweDAwN2YsCisJMHgwMDdjLCAweDBlN2UsIDB4MGQ3ZSwgMHgwNjdlLCAweDYwMDAsIDB4ZDBkYywgMHgwMDQwLCAweDYxODEsCisJMHg2MDRjLCAweGEwNmQsIDB4MDA0MCwgMHg2MTgxLCAweDY4NDgsIDB4YTYwNiwgMHgwMGMwLCAweDYxODEsCisJMHgyMDcxLCAweGE4YjEsIDB4NzAyNCwgMHhhMDM1LCAweDAwNDAsIDB4NjE4MSwgMHhhMDgwLCAweDAwMDQsCisJMHgyMDA0LCAweGFkMDYsIDB4MDBjMCwgMHg2MTgxLCAweDYwMDAsIDB4YzBkYywgMHg2MDAyLCAweDEwNzgsCisJMHg2MTg1LCAweDA2N2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDAwN2MsIDB4MGY3ZSwgMHgyMDc5LCAweDAxMDAsCisJMHg3OGMwLCAweGEwMDUsIDB4MDBjMCwgMHg2MTk0LCAweDBjN2UsIDB4MjY2MCwgMHg2MDAzLCAweDAwMDksCisJMHg2MzBhLCAweDBjN2YsIDB4MDA3OCwgMHg2MWNiLCAweDEwNzgsIDB4NmUwZiwgMHg3OGMzLCAweDAwMDAsCisJMHgxMDc4LCAweDczNzgsIDB4NzAyNywgMHgwMDAwLCAweDAzN2UsIDB4MjA3OSwgMHgwMTQwLCAweDdiMDQsCisJMHhhMzg0LCAweDEwMDAsIDB4MDA0MCwgMHg2MWE4LCAweDc4MDMsIDB4MDEwMCwgMHg3ODAzLCAweDAwMDAsCisJMHgyMDc5LCAweDAxMDAsIDB4NzgyNCwgMHhkMDg0LCAweDAwNDAsIDB4NjFiMCwgMHg3ODI3LCAweDAwMDEsCisJMHgxMDc4LCAweDczNzgsIDB4MDM3ZiwgMHgxMDc4LCAweDQ0ZDMsIDB4MGM3ZSwgMHg2MDNjLCAweGEwMDUsCisJMHgwMDQwLCAweDYxYmMsIDB4ODAwMSwgMHg2MDNlLCAweDI2NjAsIDB4MTA3OCwgMHg3NzJkLCAweDBjN2YsCisJMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsIDB4MTA3OCwgMHg4ZjdkLCAweDEwNzgsCisJMHg0YTczLCAweDEwNzgsIDB4NzIzMywgMHgwZjdmLCAweDAwN2MsIDB4MGU3ZSwgMHgwYzdlLCAweDIwNzEsCisJMHhhOGIxLCAweDcwMDQsIDB4YTA4NCwgMHgwMDA3LCAweDAwNzksIDB4NjFkNiwgMHg2MWUwLCAweDYxZTMsCisJMHg2MWZjLCAweDYyMTgsIDB4NjI2MiwgMHg2MWUwLCAweDYxZTAsIDB4NjFkZSwgMHgxMDc4LCAweDEzMzIsCisJMHgwYzdmLCAweDBlN2YsIDB4MDA3YywgMHg3MDI0LCAweGEwNjUsIDB4MDA0MCwgMHg2MWYxLCAweDcwMjAsCisJMHg4MDAxLCAweDcwMjIsIDB4NjAwYywgMHhhMDE1LCAweDAwNDAsIDB4NjFmOCwgMHg3MjE2LCAweDYwMGYsCisJMHgwMDAwLCAweDcwMDcsIDB4MDAwMCwgMHg3MDI3LCAweDAwMDAsIDB4MGM3ZiwgMHgwZTdmLCAweDAwN2MsCisJMHg3MjE2LCAweDcyMTIsIDB4MDA3OCwgMHg2MWYxLCAweDYwMTgsIDB4MjA2MCwgMHgxMDc4LCAweDQ0ZDMsCisJMHg2MDAwLCAweGMwZGMsIDB4NjAwMiwgMHg3MDIwLCAweDgwMDEsIDB4NzAyMiwgMHgwMDQwLCAweDYyMGQsCisJMHg2MDU0LCAweGEwMTUsIDB4MDA0MCwgMHg2MjE0LCAweDcyMWUsIDB4NzAwNywgMHgwMDAwLCAweDcwMjcsCisJMHgwMDAwLCAweDBjN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDcyMTgsIDB4NzIxZSwgMHgwMDc4LCAweDYyMGQsCisJMHg3MDI0LCAweGEwNjUsIDB4MDA0MCwgMHg2MjVmLCAweDcwMGMsIDB4YWMwNiwgMHgwMGMwLCAweDYyMmYsCisJMHgxMDc4LCAweDcyMzMsIDB4NjAwYywgMHhhMDE1LCAweDAwNDAsIDB4NjIyYiwgMHg3MjBlLCAweDYwMGYsCisJMHgwMDAwLCAweDAwNzgsIDB4NjI1ZCwgMHg3MjBlLCAweDcyMGEsIDB4MDA3OCwgMHg2MjVkLCAweDcwMTQsCisJMHhhYzA2LCAweDAwYzAsIDB4NjI0MiwgMHgxMDc4LCAweDcyMzMsIDB4NjAwYywgMHhhMDE1LCAweDAwNDAsCisJMHg2MjNlLCAweDcyMTYsIDB4NjAwZiwgMHgwMDAwLCAweDAwNzgsIDB4NjI1ZCwgMHg3MjE2LCAweDcyMTIsCisJMHgwMDc4LCAweDYyNWQsIDB4NjAxYywgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHg2MjVkLCAweDYwMTgsCisJMHgyMDYwLCAweDEwNzgsIDB4NDRkMywgMHg2MDAwLCAweGMwZGMsIDB4NjAwMiwgMHgxMDc4LCAweDcyMzMsCisJMHg3MDFjLCAweGEwNjUsIDB4MDA0MCwgMHg2MjVkLCAweDYwNTQsIDB4YTAxNSwgMHgwMDQwLCAweDYyNWIsCisJMHg3MjFlLCAweDAwNzgsIDB4NjI1ZCwgMHg3MjE4LCAweDcyMWUsIDB4NzAyNywgMHgwMDAwLCAweDBjN2YsCisJMHgwZTdmLCAweDAwN2MsIDB4NzAyNCwgMHhhMDY1LCAweDAwNDAsIDB4NjI2ZiwgMHgxMDc4LCAweDcyMzMsCisJMHg2MDBjLCAweGEwMTUsIDB4MDA0MCwgMHg2Mjc2LCAweDcyMGUsIDB4NjAwZiwgMHgwMDAwLCAweDEwNzgsCisJMHg3Mzc4LCAweDcwMjcsIDB4MDAwMCwgMHgwYzdmLCAweDBlN2YsIDB4MDA3YywgMHg3MjBlLCAweDcyMGEsCisJMHgwMDc4LCAweDYyNmYsIDB4MGQ3ZSwgMHgyMDY5LCAweGE4YjEsIDB4NjgzMCwgMHhhMDg0LCAweDAwMDMsCisJMHgwMDc5LCAweDYyODIsIDB4NjI4OCwgMHg2MjhhLCAweDYyYjQsIDB4NjI4OCwgMHgxMDc4LCAweDEzMzIsCisJMHgwZDdmLCAweDAwN2MsIDB4MGM3ZSwgMHg2ODQwLCAweGEwODYsIDB4MDAwMSwgMHgwMDQwLCAweDYyYWEsCisJMHg2ODNjLCAweGEwNjUsIDB4MDA0MCwgMHg2MjliLCAweDYwMGMsIDB4YTAxNSwgMHgwMDQwLCAweDYyYTYsCisJMHg2YTNhLCAweDYwMGYsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4NjgzZiwgMHgwMDAwLCAweDIwMTEsCisJMHhhOGQwLCAweDIwMTMsIDB4MDAwMCwgMHgwYzdmLCAweDBkN2YsIDB4MDA3YywgMHg2ODNhLCAweDY4MzYsCisJMHgwMDc4LCAweDYyOWIsIDB4Njg0MywgMHgwMDAwLCAweDY4MzgsIDB4YTA2NSwgMHgwMDQwLCAweDYyOWIsCisJMHg2MDAzLCAweDAwMDMsIDB4MDA3OCwgMHg2MjliLCAweDBjN2UsIDB4Njg0MywgMHgwMDAwLCAweDY4NDcsCisJMHgwMDAwLCAweDY4NGIsIDB4MDAwMCwgMHg2ODNjLCAweGEwNjUsIDB4MDA0MCwgMHg2MmNlLCAweDYwMGMsCisJMHhhMDE1LCAweDAwNDAsIDB4NjJjYSwgMHg2YTNhLCAweDYwMGYsIDB4MDAwMCwgMHg2ODNmLCAweDAwMDAsCisJMHgwMDc4LCAweDYyY2UsIDB4NjgzZiwgMHgwMDAwLCAweDY4M2EsIDB4NjgzNiwgMHgwYzdmLCAweDBkN2YsCisJMHgwMDdjLCAweDBkN2UsIDB4MjA2OSwgMHhhOGIxLCAweDY4MDQsIDB4YTA4NCwgMHgwMDA3LCAweDAwNzksCisJMHg2MmQ5LCAweDYyZTMsIDB4NjM4YSwgMHg2MzhhLCAweDYzOGEsIDB4NjM4YSwgMHg2MzhjLCAweDYzOGEsCisJMHg2MmUxLCAweDEwNzgsIDB4MTMzMiwgMHg2ODIwLCAweGEwMDUsIDB4MDBjMCwgMHg2MmU5LCAweDBkN2YsCisJMHgwMDdjLCAweDBjN2UsIDB4NjgwYywgMHhhMDY1LCAweDAwNDAsIDB4NjJmOCwgMHg2ODA3LCAweDAwMDQsCisJMHg2ODI2LCAweDY4MmIsIDB4MDAwMCwgMHgxMDc4LCAweDYzZDQsIDB4MGM3ZiwgMHgwZDdmLCAweDAwN2MsCisJMHg2ODE0LCAweGEwNjUsIDB4MDA0MCwgMHg2MzA2LCAweDY4MDcsIDB4MDAwMSwgMHg2ODI2LCAweDY4MmIsCisJMHgwMDAwLCAweDEwNzgsIDB4NjNkNCwgMHgwYzdmLCAweDBkN2YsIDB4MDA3YywgMHgwZTdlLCAweDAzN2UsCisJMHg2YTFjLCAweGEyZjUsIDB4MDAwMCwgMHgwMDQwLCAweDYzODUsIDB4NzA0YywgMHhhMDBkLCAweDAwNDAsCisJMHg2MzE1LCAweDcwODgsIDB4YTAwNSwgMHgwMDQwLCAweDYzMmQsIDB4NzA1NCwgMHhhMDc1LCAweDAwNDAsCisJMHg2MzFlLCAweGEyMGUsIDB4MDA0MCwgMHg2Mzg1LCAweDAwNzgsIDB4NjMyMywgMHg2ODE4LCAweGEyMGUsCisJMHgwMDQwLCAweDYzODUsIDB4MjA3MCwgMHg3MDRjLCAweGEwMGQsIDB4MDA0MCwgMHg2MzE1LCAweDcwODgsCisJMHhhMDA1LCAweDAwYzAsIDB4NjMxNSwgMHgyZTAwLCAweDY4MWUsIDB4NzMzYywgMHg3MDM4LCAweGEzMDIsCisJMHgwMGM4LCAweDYzMTUsIDB4MTA3OCwgMHg3NmZjLCAweDAwNDAsIDB4NjM4NSwgMHg4MzE4LCAweDczM2UsCisJMHg2MTEyLCAweDJlMTAsIDB4NjIxYSwgMHhhMTgwLCAweDAwMTQsIDB4MjAwNCwgMHhhMDg0LCAweDAwZmYsCisJMHg2MDMyLCAweGExODAsIDB4MDAxNCwgMHgyMDAzLCAweDAwMDAsIDB4YTE4MCwgMHgwMDE1LCAweDIwMDQsCisJMHhhMDhhLCAweDE5OWEsIDB4MDA0OCwgMHg2MzRlLCAweDIwMDEsIDB4MTk5OSwgMHg4MDAzLCAweDgwMWIsCisJMHg4MzFiLCAweGEzMTgsIDB4NjMxNiwgMHgwMzdmLCAweDBmN2UsIDB4MmM3OCwgMHg3MWEwLCAweGQxYmMsCisJMHgwMDQwLCAweDYzNjcsIDB4NzEwMCwgMHhkMWY0LCAweDAwNDAsIDB4NjM2MywgMHg3MTE0LCAweGExOGMsCisJMHgwMGZmLCAweDAwNzgsIDB4NjM2YywgMHgyMDA5LCAweDAwMDAsIDB4MDA3OCwgMHg2MzZjLCAweGExZTAsCisJMHgyOWMwLCAweDJjMGMsIDB4YTE4YywgMHgwMGZmLCAweDIwNjEsIDB4MDEwMCwgMHg2MTlhLCAweDEwNzgsCisJMHg2OTY1LCAweDczMDAsIDB4YzNkZCwgMHg3MzAyLCAweDY4MDcsIDB4MDAwMiwgMHgyZjE4LCAweDZiMjYsCisJMHg2ODJiLCAweDAwMDAsIDB4NzgxZiwgMHgwMDAzLCAweDc4MDMsIDB4MDAwMSwgMHg3ODA3LCAweDAwNDAsCisJMHgwZjdmLCAweDBlN2YsIDB4MGM3ZiwgMHgwZDdmLCAweDAwN2MsIDB4MDM3ZiwgMHgwZTdmLCAweDBjN2YsCisJMHgwMDc4LCAweDYzODMsIDB4MGQ3ZiwgMHgwMDdjLCAweDBjN2UsIDB4NjgwYywgMHhhMDY1LCAweDAwNDAsCisJMHg2Mzk4LCAweDY4MDcsIDB4MDAwNCwgMHg2ODI2LCAweDY4MmIsIDB4MDAwMCwgMHgxMDc4LCAweDYzZDQsCisJMHgwYzdmLCAweDBkN2YsIDB4MDA3YywgMHgwZjdlLCAweDBkN2UsIDB4MjA2OSwgMHhhOGIxLCAweDY4MzAsCisJMHhhMDg2LCAweDAwMDAsIDB4MDBjMCwgMHg2M2JiLCAweDY4MzgsIDB4YTA3ZCwgMHgwMDQwLCAweDYzYmIsCisJMHg2ODMzLCAweDAwMDEsIDB4NjgzZSwgMHg2ODQ3LCAweDAwMDAsIDB4Njg0YiwgMHgwMDAwLCAweDEyN2UsCisJMHgwZjdlLCAweDIwOTEsIDB4MjIwMCwgMHgwMjdmLCAweDEwNzgsIDB4MWQ2ZCwgMHgwMGMwLCAweDYzYmUsCisJMHgxMjdmLCAweDEwNzgsIDB4NmNiMywgMHgwZDdmLCAweDBmN2YsIDB4MDA3YywgMHgxMjdmLCAweDY4NDMsCisJMHgwMDAwLCAweDc4MDMsIDB4MDAwMiwgMHg3ODBjLCAweGEwMTUsIDB4MDA0MCwgMHg2M2QwLCAweDZhM2EsCisJMHg3ODBmLCAweDAwMDAsIDB4NjgzMywgMHgwMDAwLCAweDY4M2YsIDB4MDAwMCwgMHgwMDc4LCAweDYzYmIsCisJMHg2ODNhLCAweDY4MzYsIDB4MDA3OCwgMHg2M2NhLCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLCAweDEwNzksCisJMHg2M2RhLCAweDAwN2MsIDB4NjNlMywgMHg2M2U4LCAweDY4MDksIDB4NjkyMiwgMHg2M2U4LCAweDY4MDksCisJMHg2OTIyLCAweDYzZTMsIDB4NjNlOCwgMHgxMDc4LCAweDYxY2QsIDB4MTA3OCwgMHg2MmQxLCAweDAwN2MsCisJMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHgwYzdlLCAweDBmN2UsIDB4NjAwNCwgMHhhMDhhLCAweDAwNDQsCisJMHgxMGM4LCAweDEzMzIsIDB4NjExOCwgMHgyMTc4LCAweDc5YTAsIDB4ZDFiYywgMHgwMDQwLCAweDY0MDUsCisJMHg3OTAwLCAweGQxZjQsIDB4MDA0MCwgMHg2NDAxLCAweDc5MTQsIDB4YTE4YywgMHgwMGZmLCAweDAwNzgsCisJMHg2NDBhLCAweDIwMDksIDB4MDAwMCwgMHgwMDc4LCAweDY0MGEsIDB4YTFmOCwgMHgyOWMwLCAweDJmMGMsCisJMHhhMThjLCAweDAwZmYsIDB4MmM3OCwgMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwgMHhhMDhhLCAweDAwNDAsCisJMHgwMGM4LCAweDY0NWMsIDB4MTA3OSwgMHg2NDFhLCAweDBmN2YsIDB4MGM3ZiwgMHgxNDdmLCAweDEzN2YsCisJMHgxNTdmLCAweDAwN2MsIDB4NjRjMiwgMHg2NTBhLCAweDY1MzIsIDB4NjVjZCwgMHg2NWZkLCAweDY2MDUsCisJMHg2NjJjLCAweDY2M2QsIDB4NjY0ZSwgMHg2NjU2LCAweDY2NmUsIDB4NjY1NiwgMHg2NmQ5LCAweDY2M2QsCisJMHg2NmZhLCAweDY3MDIsIDB4NjY0ZSwgMHg2NzAyLCAweDY3MTMsIDB4NjQ1YSwgMHg2NDVhLCAweDY0NWEsCisJMHg2NDVhLCAweDY0NWEsIDB4NjQ1YSwgMHg2NDVhLCAweDY0NWEsIDB4NjQ1YSwgMHg2NDVhLCAweDY0NWEsCisJMHg2ZWVmLCAweDZmMTQsIDB4NmYyOSwgMHg2ZjRjLCAweDZmNmQsIDB4NjYyYywgMHg2NDVhLCAweDY2MmMsCisJMHg2NjU2LCAweDY0NWEsIDB4NjUzMiwgMHg2NWNkLCAweDY0NWEsIDB4NzQ5YywgMHg2NjU2LCAweDY0NWEsCisJMHg3NGJjLCAweDY2NTYsIDB4NjQ1YSwgMHg2NDVhLCAweDY0YmQsIDB4NjQ2YiwgMHg2NDVhLCAweDc0ZTEsCisJMHg3NTU4LCAweDc2NDAsIDB4NjQ1YSwgMHg3NjUxLCAweDY2MjYsIDB4NzY2ZCwgMHg2NDVhLCAweDZmODIsCisJMHg2NDVhLCAweDY0NWEsIDB4MTA3OCwgMHgxMzMyLCAweDIxMDAsIDB4MTA3OSwgMHg2NDY1LCAweDBmN2YsCisJMHgwYzdmLCAweDE0N2YsIDB4MTM3ZiwgMHgxNTdmLCAweDAwN2MsIDB4NjQ2OSwgMHg2NDY5LCAweDY0NjksCisJMHg2NDlmLCAweDEwNzgsIDB4MTMzMiwgMHgwZDdlLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY3MzEsCisJMHg3ODEwLCAweDIwNjgsIDB4MjBhMywgMHgyNDE0LCAweDIwYTMsIDB4MDAxOCwgMHgyMGEzLCAweDA4MDAsCisJMHg2ODNjLCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4Njg1MCwgMHgyMGEyLCAweDY4NTQsIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE4LCAweDEwNzgsIDB4NmRmYiwgMHgwZDdmLCAweDAwN2MsCisJMHgwZDdlLCAweDc4MTgsIDB4MjA2OCwgMHg2OGEwLCAweGEwODIsIDB4MDA3ZSwgMHgwMDQ4LCAweDY0OWMsCisJMHhhMDg1LCAweDAwMDEsIDB4MGQ3ZiwgMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHg2NDlhLCAweDBkN2UsCisJMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NzMxLCAweDIwYTMsIDB4MDUwMCwgMHgyMGEzLCAweDAwMDAsCisJMHg3ODEwLCAweGEwZTgsIDB4MDAwZiwgMHg2ODA4LCAweDIwYTIsIDB4NjgwYywgMHgyMGEyLCAweDY4MTAsCisJMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHg2ODE4LCAweDIwYTIsIDB4NjgxYywgMHgyMGEyLCAweDYwYzMsCisJMHgwMDEwLCAweDEwNzgsIDB4NmRmYiwgMHgwZDdmLCAweDAwN2MsIDB4NjAzMCwgMHg2MDlhLCAweDEwNzgsCisJMHg2ZGZiLCAweDAwN2MsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjczMSwgMHgyMGEzLCAweDUyMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4MGQ3ZSwgMHgyMDY5LCAweGE2NTIsIDB4NjgwNCwgMHhkMDg0LCAweDAwNDAsCisJMHg2NGRjLCAweDY4MjgsIDB4MjBhMywgMHgwMDAwLCAweDAxN2UsIDB4MTA3OCwgMHgyNTY0LCAweDIxYTIsCisJMHgwMTdmLCAweDBkN2YsIDB4MDA3OCwgMHg2NGUxLCAweDBkN2YsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LCAweGE2MDUsIDB4NTNhNiwgMHgyMGE5LCAweDAwMDQsCisJMHgyMDk5LCAweGE2MDEsIDB4NTNhNiwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEwODIsCisJMHgwMDdmLCAweDAwNDgsIDB4NjRmYiwgMHgyMDAxLCAweGE2MWIsIDB4MjBhNiwgMHgyMDAxLCAweGE2MWMsCisJMHgyMGE2LCAweDAwNzgsIDB4NjUwMSwgMHgyMGEzLCAweDAwMDAsIDB4NjAzMCwgMHhhMDg0LCAweDAwZmYsCisJMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDFjLCAweDEwNzgsCisJMHg2ZGZiLCAweDAwN2MsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjczMSwgMHgyMGEzLCAweDA1MDAsCisJMHgyMGEzLCAweDAwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMDgyLCAweDAwN2YsCisJMHgwMDQ4LCAweDY1MjIsIDB4MjAwMSwgMHhhNjFiLCAweDIwYTYsIDB4MjAwMSwgMHhhNjFjLCAweDIwYTYsCisJMHgwMDc4LCAweDY1MjgsIDB4MjBhMywgMHgwMDAwLCAweDYwMzAsIDB4YTA4NCwgMHgwMGZmLCAweDIwYTIsCisJMHgyMGE5LCAweDAwMDQsIDB4MjA5OSwgMHhhNjA1LCAweDUzYTYsIDB4NjBjMywgMHgwMDEwLCAweDEwNzgsCisJMHg2ZGZiLCAweDAwN2MsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjczMSwgMHgwYzdlLCAweDc4MTgsCisJMHgyMDYwLCAweDIwMDEsIDB4MDAwMCwgMHgxMDc4LCAweDQ5NzIsIDB4MGM3ZiwgMHg3ODE4LCAweGEwODAsCisJMHgwMDI4LCAweDIwMDQsIDB4YTA4NiwgMHgwMDdlLCAweDAwYzAsIDB4NjU0ZCwgMHgyMGEzLCAweDA0MDAsCisJMHg2MjBjLCAweGMyYjQsIDB4NjIwZSwgMHgwMDc4LCAweDY1NGYsIDB4MjBhMywgMHgwMzAwLCAweDIwYTMsCisJMHgwMDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4YTA4NiwgMHgwMDdlLCAweDAwYzAsCisJMHg2NTljLCAweDIwOTksIDB4YTg4ZCwgMHgzM2E2LCAweDkzOTgsIDB4MzNhNiwgMHg5Mzk4LCAweDMzMDQsCisJMHhhMDg0LCAweDNmZmYsIDB4MjBhMiwgMHg5Mzk4LCAweDMzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksCisJMHhhNjA1LCAweDUzYTYsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksIDB4YTYwMSwgMHg1M2E2LCAweDIwYTksCisJMHgwMDEwLCAweDIwYTMsIDB4MDAwMCwgMHgwMGYwLCAweDY1NzksIDB4MjA5OSwgMHhhODk1LCAweDMzMDQsCisJMHhjMGRkLCAweDIwYTIsIDB4MjAwMSwgMHhhNjcyLCAweDIwMDQsIDB4ZDBlNCwgMHgwMDQwLCAweDY1OTQsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDkzOTgsIDB4OTM5OCwgMHg5Mzk4LCAweDMzYTYsCisJMHgyMGE5LCAweDAwMDQsIDB4MDA3OCwgMHg2NTk2LCAweDIwYTksIDB4MDAwNywgMHgyMGEzLCAweDAwMDAsCisJMHgwMGYwLCAweDY1OTYsIDB4MDA3OCwgMHg2NWJjLCAweDIwOTksIDB4YTg4ZCwgMHgyMGE5LCAweDAwMDgsCisJMHg1M2E2LCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LCAweGE2MDUsIDB4NTNhNiwgMHgyMGE5LCAweDAwMDQsCisJMHgyMDk5LCAweGE2MDEsIDB4NTNhNiwgMHgyMGE5LCAweDAwMDgsIDB4MjBhMywgMHgwMDAwLCAweDAwZjAsCisJMHg2NWFkLCAweDIwYTksIDB4MDAwOCwgMHgyMGEzLCAweDAwMDAsIDB4MDBmMCwgMHg2NWIzLCAweDIwOTksCisJMHhhODk1LCAweDIwYTksIDB4MDAwOCwgMHg1M2E2LCAweDIwYTksIDB4MDAwOCwgMHgyMGEzLCAweDAwMDAsCisJMHgwMGYwLCAweDY1YmUsIDB4MjBhOSwgMHgwMDBhLCAweDIwYTMsIDB4MDAwMCwgMHgwMGYwLCAweDY1YzQsCisJMHg2MGMzLCAweDAwNzQsIDB4MTA3OCwgMHg2ZGZiLCAweDAwN2MsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsCisJMHg2NzMxLCAweDIwYTMsIDB4MjAxMCwgMHgyMGEzLCAweDAwMTQsIDB4MjBhMywgMHgwODAwLCAweDIwYTMsCisJMHgyMDAwLCAweGEwMDYsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDBmN2UsCisJMHgyMDc5LCAweGE2NTIsIDB4NzkwNCwgMHgwZjdmLCAweGQxYWMsIDB4MDBjMCwgMHg2NWU5LCAweGEwODUsCisJMHgwMDIwLCAweGQxYTQsIDB4MDA0MCwgMHg2NWVlLCAweGEwODUsIDB4MDAxMCwgMHhhMDg1LCAweDAwMDIsCisJMHgwZDdlLCAweDAwNzgsIDB4NjZiNywgMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHg2MGMzLCAweDAwMTQsIDB4MTA3OCwgMHg2ZGZiLCAweDAwN2MsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsCisJMHg2NzMxLCAweDIwYTMsIDB4NTAwMCwgMHgwMDc4LCAweDY1NGYsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsCisJMHg2NzMxLCAweDIwYTMsIDB4MjExMCwgMHgyMGEzLCAweDAwMTQsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDYwYzMsIDB4MDAxNCwgMHgxMDc4LCAweDZkZmIsIDB4MDA3YywgMHgyMGExLCAweDAyMGIsCisJMHgxMDc4LCAweDY3YjksIDB4MDA3OCwgMHg2NjMwLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY3YzIsCisJMHgyMGEzLCAweDAyMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHg2MGMzLCAweDAwMDQsIDB4MTA3OCwgMHg2ZGZiLCAweDAwN2MsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsCisJMHg2N2MyLCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAzLCAweDIwYTMsCisJMHgyYTAwLCAweDYwYzMsIDB4MDAwOCwgMHgxMDc4LCAweDZkZmIsIDB4MDA3YywgMHgyMGExLCAweDAyMGIsCisJMHgxMDc4LCAweDY3YzIsIDB4MjBhMywgMHgwMjAwLCAweDAwNzgsIDB4NjU0ZiwgMHgyMGExLCAweDAyMGIsCisJMHgxMDc4LCAweDY3YzIsIDB4MjBhMywgMHgwMTAwLCAweDIwYTMsIDB4MDAwMCwgMHg3ODI4LCAweGEwMDUsCisJMHgwMDQwLCAweDY2NjUsIDB4MjBhMiwgMHgwMDc4LCAweDY2NjcsIDB4MjBhMywgMHgwMDAzLCAweDc4MTAsCisJMHgyMGEyLCAweDYwYzMsIDB4MDAwOCwgMHgxMDc4LCAweDZkZmIsIDB4MDA3YywgMHgwZDdlLCAweDIwYTEsCisJMHgwMjBiLCAweDEwNzgsIDB4NjdjMiwgMHgyMGEzLCAweDAyMTAsIDB4MjBhMywgMHgwMDE0LCAweDIwYTMsCisJMHgwODAwLCAweDc4MTgsIDB4MjA2OCwgMHg2ODk0LCAweGEwODYsIDB4MDAxNCwgMHgwMGMwLCAweDY2OTQsCisJMHg2OTk4LCAweGExODQsIDB4YzAwMCwgMHgwMGMwLCAweDY2OTAsIDB4ZDFlYywgMHgwMDQwLCAweDY2OGMsCisJMHgyMGEzLCAweDIxMDAsIDB4MDA3OCwgMHg2Njk2LCAweDIwYTMsIDB4MDEwMCwgMHgwMDc4LCAweDY2OTYsCisJMHgyMGEzLCAweDA0MDAsIDB4MDA3OCwgMHg2Njk2LCAweDIwYTMsIDB4MDcwMCwgMHhhMDA2LCAweDIwYTIsCisJMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDBmN2UsIDB4MjA3OSwgMHhhNjUyLCAweDc5MDQsCisJMHgwZjdmLCAweGQxYWMsIDB4MDBjMCwgMHg2NmE2LCAweGEwODUsIDB4MDAyMCwgMHhkMWE0LCAweDAwNDAsCisJMHg2NmFiLCAweGEwODUsIDB4MDAxMCwgMHgyMDA5LCAweGE2NzQsIDB4MjEwYywgMHhkMTg0LCAweDAwNDAsCisJMHg2NmI1LCAweDY5OWMsIDB4ZDE4YywgMHgwMDQwLCAweDY2YjcsIDB4YTA4NSwgMHgwMDAyLCAweDAyN2UsCisJMHgyMDA5LCAweGE2NzIsIDB4MjEwYywgMHhkMWU0LCAweDAwNDAsIDB4NjZjNSwgMHhjMGM1LCAweGEwOTQsCisJMHgwMDMwLCAweGEyOTYsIDB4MDAxMCwgMHgwMDQwLCAweDY2Y2YsIDB4ZDFlYywgMHgwMDQwLCAweDY2Y2YsCisJMHhhMDk0LCAweDAwMzAsIDB4YTI5NiwgMHgwMDEwLCAweDAwNDAsIDB4NjZjZiwgMHhjMGJkLCAweDAyN2YsCisJMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHg2MGMzLCAweDAwMTQsIDB4MTA3OCwgMHg2ZGZiLCAweDBkN2YsCisJMHgwMDdjLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY3YzIsIDB4MjBhMywgMHgwMjEwLCAweDIwYTMsCisJMHgwMDE0LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LCAweDEwNzgsCisJMHg2ZGZiLCAweDAwN2MsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjdjMiwgMHgyMGEzLCAweDAyMDAsCisJMHgwMDc4LCAweDY0YzgsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjdjMiwgMHgyMGEzLCAweDAxMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAzLCAweDIwYTMsIDB4MmEwMCwgMHg2MGMzLCAweDAwMDgsCisJMHgxMDc4LCAweDZkZmIsIDB4MDA3YywgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDIwYTEsCisJMHgwMjBiLCAweDEwNzgsIDB4NjdjMiwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDBiLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMDgsIDB4MTA3OCwgMHg2ZGZiLCAweDAwN2MsCisJMHgwMjdlLCAweDAzN2UsIDB4MDQ3ZSwgMHgyMDE5LCAweDMyMDAsIDB4MjAyMSwgMHgwODAwLCAweDAwNzgsCisJMHg2NzM4LCAweDAyN2UsIDB4MDM3ZSwgMHgwNDdlLCAweDIwMTksIDB4MjIwMCwgMHgyMDIxLCAweDAxMDAsCisJMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMTQsCisJMHhhMjg2LCAweDAwN2UsIDB4MDBjMCwgMHg2NzRiLCAweGEzODUsIDB4MDBmZiwgMHgyMGEyLCAweDIwYTMsCisJMHhmZmZlLCAweDAwNzgsIDB4Njc4MCwgMHhhMjg2LCAweDAwN2YsIDB4MDBjMCwgMHg2NzU3LCAweDBkN2UsCisJMHhhMzg1LCAweDAwZmYsIDB4MjBhMiwgMHgyMGEzLCAweGZmZmQsIDB4MDA3OCwgMHg2NzZlLCAweGQyYmMsCisJMHgwMDQwLCAweDY3NzYsIDB4YTI4NiwgMHgwMDgwLCAweDBkN2UsIDB4MDBjMCwgMHg2NzY2LCAweGEzODUsCisJMHgwMGZmLCAweDIwYTIsIDB4MjBhMywgMHhmZmZjLCAweDAwNzgsIDB4Njc2ZSwgMHhhMmU4LCAweGE3MzUsCisJMHgyZDZjLCAweDY4MTAsIDB4YTMwNSwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGE2MWIsCisJMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwZDdmLCAweDAwNzgsIDB4Njc4NCwgMHgwZDdlLCAweGEyZTgsCisJMHhhNzM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMzA1LCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDBkN2YsCisJMHgyMGEzLCAweDAwMDAsIDB4NjIzMCwgMHgyMmEyLCAweGE0ODUsIDB4MDAyOSwgMHgyMGEyLCAweDA0N2YsCisJMHgwMzdmLCAweDIwYTMsIDB4MDAwMCwgMHgxMDc4LCAweDZkZWEsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsCisJMHgyZmEyLCAweDIwYTMsIDB4ZmZmZiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDAyN2YsCisJMHgwMDdjLCAweDAyN2UsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMGEzLCAweDAyZmYsCisJMHgyMDExLCAweGZmZmMsIDB4MjJhMiwgMHgwZDdlLCAweDIwNjksIDB4YTYxYiwgMHgyZGE2LCAweDhkNjgsCisJMHgyZGE2LCAweDBkN2YsIDB4MjBhMywgMHgyMDI5LCAweDIwYTMsIDB4MDAwMCwgMHgwMDc4LCAweDY3OGIsCisJMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4ZmMwMiwgMHgyMGEzLCAweDAwMDAsCisJMHgwMDdjLCAweDAyN2UsIDB4MDM3ZSwgMHgwNDdlLCAweDIwMTksIDB4MzMwMCwgMHgyMDIxLCAweDA4MDAsCisJMHgwMDc4LCAweDY3YzksIDB4MDI3ZSwgMHgwMzdlLCAweDA0N2UsIDB4MjAxOSwgMHgyMzAwLCAweDIwMjEsCisJMHgwMTAwLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweGEwOTIsIDB4MDA3ZSwgMHgwMDQ4LCAweDY3ZTYsIDB4MGQ3ZSwgMHhhMGU4LCAweGE3MzUsCisJMHgyZDZjLCAweDY4MTAsIDB4YTMwNSwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGE2MWIsCisJMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwZDdmLCAweDAwNzgsIDB4NjdmNCwgMHgwZDdlLCAweGEwZTgsCisJMHhhNzM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMzA1LCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDBkN2YsCisJMHgyMGEzLCAweDAwMDAsIDB4NjIzMCwgMHgyMmEyLCAweGE0ODUsIDB4MDA5OCwgMHgyMGEyLCAweDIwYTMsCisJMHgwMDAwLCAweDA0N2YsIDB4MDM3ZiwgMHgxMDc4LCAweDZkZWEsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsCisJMHg3YTA4LCAweDIyYTIsIDB4MmZhMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDAyN2YsCisJMHgwMDdjLCAweDBjN2UsIDB4MGY3ZSwgMHg2MDA0LCAweGEwOGEsIDB4MDA4NSwgMHgxMDQ4LCAweDEzMzIsCisJMHhhMDhhLCAweDAwOGMsIDB4MTBjOCwgMHgxMzMyLCAweDYxMTgsIDB4MjE3OCwgMHg3OWEwLCAweGQxYmMsCisJMHgwMDQwLCAweDY4MjcsIDB4NzkwMCwgMHhkMWY0LCAweDAwNDAsIDB4NjgyMywgMHg3OTE0LCAweGExOGMsCisJMHgwMGZmLCAweDAwNzgsIDB4NjgyYywgMHgyMDA5LCAweDAwMDAsIDB4MDA3OCwgMHg2ODJjLCAweGExZjgsCisJMHgyOWMwLCAweDJmMGMsIDB4YTE4YywgMHgwMGZmLCAweDJjNzgsIDB4MjA2MSwgMHgwMTAwLCAweDYxOWEsCisJMHhhMDgyLCAweDAwODUsIDB4MTA3OSwgMHg2ODM3LCAweDBmN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDY4NDAsCisJMHg2ODRiLCAweDY4NjYsIDB4NjgzZSwgMHg2ODNlLCAweDY4M2UsIDB4Njg0MCwgMHgxMDc4LCAweDEzMzIsCisJMHgxNDdlLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY4NzksIDB4NjBjMywgMHgwMDAwLCAweDEwNzgsCisJMHg2ZGZiLCAweDE0N2YsIDB4MDA3YywgMHgxNDdlLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY4YWQsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MDgsIDB4MjBhMiwgMHg3ODEwLCAweDIwYTIsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHhmZmZmLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHg2MGMzLCAweDAwMGMsIDB4MTA3OCwgMHg2ZGZiLCAweDE0N2YsIDB4MDA3YywgMHgxNDdlLCAweDIwYTEsCisJMHgwMjBiLCAweDEwNzgsIDB4NjhlZSwgMHgyMGEzLCAweDAwMDMsIDB4MjBhMywgMHgwMzAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMDQsIDB4MTA3OCwgMHg2ZGZiLCAweDE0N2YsCisJMHgwMDdjLCAweDAyN2UsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LCAweGEwODAsCisJMHgwMDI4LCAweDIwMDQsIDB4YTA5MiwgMHgwMDdlLCAweDAwNDgsIDB4Njg5OCwgMHgwZDdlLCAweGEwZTgsCisJMHhhNzM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDgxMDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsCisJMHgyMDY5LCAweGE2MWIsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MGQ3ZiwgMHgwMDc4LCAweDY4YTcsCisJMHgwZDdlLCAweGEwZTgsIDB4YTczNSwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHg4MTAwLCAweDIwYTIsCisJMHg2ODE0LCAweDIwYTIsIDB4MGQ3ZiwgMHgyMGEzLCAweDAwMDAsIDB4NjIzMCwgMHgyMmEyLCAweDIwYTMsCisJMHgwMDA5LCAweDIwYTMsIDB4MDAwMCwgMHgwMDc4LCAweDY3OGIsIDB4MDI3ZSwgMHgyMGUxLCAweDkwODAsCisJMHgyMGUxLCAweDQwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMDkyLCAweDAwN2UsCisJMHgwMDQ4LCAweDY4Y2MsIDB4MGQ3ZSwgMHhhMGU4LCAweGE3MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsCisJMHg4NDAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YTYxYiwgMHgyZGE2LCAweDhkNjgsCisJMHgyZGE2LCAweDBkN2YsIDB4MDA3OCwgMHg2OGRiLCAweDBkN2UsIDB4YTBlOCwgMHhhNzM1LCAweDJkNmMsCisJMHg2ODEwLCAweGEwODUsIDB4ODQwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgwZDdmLCAweDIwYTMsCisJMHgwMDAwLCAweDYyMzAsIDB4MjJhMiwgMHgyMGEzLCAweDAwOTksIDB4MjBhMywgMHgwMDAwLCAweDEwNzgsCisJMHg2ZGVhLCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLCAweDdhMDgsIDB4MjJhMiwgMHg3YTEwLCAweDIyYTIsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDAyN2YsIDB4MDA3YywgMHgwMjdlLCAweDIwZTEsCisJMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEwOTIsCisJMHgwMDdlLCAweDAwNDgsIDB4NjkwZCwgMHgwZDdlLCAweGEwZTgsIDB4YTczNSwgMHgyZDZjLCAweDY4MTAsCisJMHhhMDg1LCAweDg1MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MjA2OSwgMHhhNjFiLCAweDJkYTYsCisJMHg4ZDY4LCAweDJkYTYsIDB4MGQ3ZiwgMHgwMDc4LCAweDY5MWMsIDB4MGQ3ZSwgMHhhMGU4LCAweGE3MzUsCisJMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHg4NTAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDBkN2YsCisJMHgyMGEzLCAweDAwMDAsIDB4NjIzMCwgMHgyMmEyLCAweDIwYTMsIDB4MDA5OSwgMHgyMGEzLCAweDAwMDAsCisJMHgwMDc4LCAweDY4ZGYsIDB4MGM3ZSwgMHgwZjdlLCAweDJjNzgsIDB4NzgwNCwgMHhhMDhhLCAweDAwNDAsCisJMHgxMDQ4LCAweDEzMzIsIDB4YTA4YSwgMHgwMDUzLCAweDEwYzgsIDB4MTMzMiwgMHg3OTE4LCAweDIxNjAsCisJMHg2MWEwLCAweGQxYmMsIDB4MDA0MCwgMHg2OTQxLCAweDYxMDAsIDB4ZDFmNCwgMHgwMDQwLCAweDY5M2QsCisJMHg2MTE0LCAweGExOGMsIDB4MDBmZiwgMHgwMDc4LCAweDY5NDYsIDB4MjAwOSwgMHgwMDAwLCAweDAwNzgsCisJMHg2OTQ2LCAweGExZTAsIDB4MjljMCwgMHgyYzBjLCAweGExOGMsIDB4MDBmZiwgMHgyMDYxLCAweDAxMDAsCisJMHg2MTlhLCAweGEwODIsIDB4MDA0MCwgMHgxMDc5LCAweDY5NTAsIDB4MGY3ZiwgMHgwYzdmLCAweDAwN2MsCisJMHg2OTY1LCAweDZhNzMsIDB4NmExNCwgMHg2YzI3LCAweDY5NjMsIDB4Njk2MywgMHg2OTYzLCAweDY5NjMsCisJMHg2OTYzLCAweDY5NjMsIDB4Njk2MywgMHg3MTRjLCAweDcxNWQsIDB4NzE2ZSwgMHg3MTdmLCAweDY5NjMsCisJMHg3NjdlLCAweDY5NjMsIDB4NzEzYiwgMHgxMDc4LCAweDEzMzIsIDB4MGQ3ZSwgMHgxNTdlLCAweDE0N2UsCisJMHg3ODBiLCAweGZmZmYsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjlkMCwgMHg3OTEwLCAweDIxNjgsCisJMHg2OTQ4LCAweDc5MjIsIDB4MjFhMiwgMHhhMDE2LCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDY5NGMsCisJMHhhMTg0LCAweDAwMGYsIDB4MDBjMCwgMHg2OTgwLCAweDIwMDEsIDB4MDAwNSwgMHgwMDc4LCAweDY5OGEsCisJMHhkMTg0LCAweDAwNDAsIDB4Njk4NywgMHgyMDAxLCAweDAwMDQsIDB4MDA3OCwgMHg2OThhLCAweGEwODQsCisJMHgwMDA2LCAweDgwMDQsIDB4MDE3ZSwgMHgyMDA4LCAweDc4MzAsIDB4YTA4NCwgMHgwMGZmLCAweDgwMDcsCisJMHhhMTA1LCAweDAxN2YsIDB4MjBhMiwgMHhkMWFjLCAweDAwNDAsIDB4Njk5YSwgMHgyMGEzLCAweDAwMDIsCisJMHgwMDc4LCAweDY5YTYsIDB4ZDFiNCwgMHgwMDQwLCAweDY5YTEsIDB4MjBhMywgMHgwMDAxLCAweDAwNzgsCisJMHg2OWE2LCAweDIwYTMsIDB4MDAwMCwgMHgyMjMwLCAweDAwNzgsIDB4NjlhOCwgMHg2YTgwLCAweDZlN2MsCisJMHgyMGE5LCAweDAwMDgsIDB4YWQ4MCwgMHgwMDE3LCAweDIwMGMsIDB4ODEwZiwgMHgyMWEyLCAweDgwMDAsCisJMHgwMGYwLCAweDY5YWMsIDB4MjJhMiwgMHgyNmEyLCAweDYwYzMsIDB4MDAyMCwgMHgyMGUxLCAweDkwODAsCisJMHg2MDE0LCAweGEwODQsIDB4MDAwNCwgMHhhMDg1LCAweDAwMDksIDB4NjAxNiwgMHgyMDAxLCAweGE4Y2QsCisJMHgyMDAzLCAweDA3ZDAsIDB4MjAwMSwgMHhhOGNjLCAweDIwMDMsIDB4MDAwOSwgMHgyMDAxLCAweGE4ZDIsCisJMHgyMDAzLCAweDAwMDIsIDB4MTA3OCwgMHgxNThjLCAweDE0N2YsIDB4MTU3ZiwgMHgwZDdmLCAweDAwN2MsCisJMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDdhMTgsIDB4YTI4MCwgMHgwMDIzLCAweDIwMTQsCisJMHg4MjEwLCAweGEyOTQsIDB4MDBmZiwgMHgyMjAyLCAweDgyMTcsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweGQwYmMsIDB4MDA0MCwgMHg2OWY2LCAweDBkN2UsIDB4YTBlOCwgMHhhNzM1LCAweDJkNmMsCisJMHg2ODEwLCAweGEwODUsIDB4MDYwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGE2MWIsCisJMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwZDdmLCAweDAwNzgsIDB4NmEwNSwgMHgwZDdlLCAweGEwZTgsCisJMHhhNzM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDA2MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsCisJMHgwZDdmLCAweDIwYTMsIDB4MDAwMCwgMHg2MTMwLCAweDIxYTIsIDB4MjBhMywgMHgwODI5LCAweDIwYTMsCisJMHgwMDAwLCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLCAweDJmYTIsIDB4MjBhMywgMHhmZmZmLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgwMDdjLCAweDBkN2UsIDB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsCisJMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2YTM0LCAweDc4MTAsIDB4MjA2OCwgMHg2ODYwLCAweDIwYTIsCisJMHg2ODVjLCAweDIwYTIsIDB4Njg4MCwgMHgyMGEyLCAweDY4N2MsIDB4MjBhMiwgMHhhMDA2LCAweDIwYTIsCisJMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHg2MGMzLCAweDAwMGMsIDB4MTA3OCwgMHg2ZGZiLCAweDE0N2YsCisJMHgxMzdmLCAweDE1N2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDAyN2UsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsCisJMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4ZDBiYywgMHgwMDQwLCAweDZhNTIsCisJMHgwZDdlLCAweGEwZTgsIDB4YTczNSwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwNTAwLCAweDIwYTIsCisJMHg2ODE0LCAweDIwYTIsIDB4MjA2OSwgMHhhNjFiLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDBkN2YsCisJMHgwMDc4LCAweDZhNjEsIDB4MGQ3ZSwgMHhhMGU4LCAweGE3MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsCisJMHgwNTAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDBkN2YsIDB4MjBhMywgMHgwMDAwLCAweDYyMzAsCisJMHgyMmEyLCAweDIwYTMsIDB4MDg4OSwgMHgyMGEzLCAweDAwMDAsIDB4MTA3OCwgMHg2ZGVhLCAweDIyYTIsCisJMHgyMGEzLCAweDAwMDAsIDB4N2EwOCwgMHgyMmEyLCAweDJmYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDAyN2YsIDB4MDA3YywgMHgwZDdlLCAweDE1N2UsIDB4MTM3ZSwgMHgxNDdlLCAweDc4MTAsCisJMHhhMGVjLCAweGYwMDAsIDB4MDA0MCwgMHg2YThiLCAweGEwNmQsIDB4MTA3OCwgMHg0OTVmLCAweDAwNDAsCisJMHg2YThiLCAweDY4NGMsIDB4YTA4NCwgMHgyMDIwLCAweGEwODYsIDB4MjAyMCwgMHgwMGMwLCAweDZhOGIsCisJMHg3ODI0LCAweGMwY2QsIDB4NzgyNiwgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2YmUwLCAweGEwMTYsCisJMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4NzgxMCwgMHhhMDg0LCAweGYwMDAsCisJMHgwMGMwLCAweDZhYTIsIDB4NzgxMCwgMHhhMDg0LCAweDA3MDAsIDB4ODAwNywgMHgxMDc5LCAweDZhYWEsCisJMHgwMDc4LCAweDZhYTUsIDB4YTAwNiwgMHgxMDc5LCAweDZhYWEsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsCisJMHgwZDdmLCAweDAwN2MsIDB4NmFiNCwgMHg2YjRjLCAweDZiNTcsIDB4NmI4MSwgMHg2Yjk1LCAweDZiYjEsCisJMHg2YmJjLCAweDZhYjIsIDB4MTA3OCwgMHgxMzMyLCAweDAxN2UsIDB4MDM3ZSwgMHg2OTRjLCAweGExOGMsCisJMHgwMDAzLCAweDAwNDAsIDB4NmFiZiwgMHhhMTg2LCAweDAwMDMsIDB4MDBjMCwgMHg2YWNlLCAweDZiNzgsCisJMHg3ODI0LCAweGQwY2MsIDB4MDA0MCwgMHg2YWM1LCAweGMzZTUsIDB4MjNhMiwgMHg2ODY4LCAweDIwYTIsCisJMHg2ODY0LCAweDIwYTIsIDB4MDM3ZiwgMHgwMTdmLCAweDAwNzgsIDB4NmI4YywgMHhhMTg2LCAweDAwMDEsCisJMHgxMGMwLCAweDEzMzIsIDB4NmI3OCwgMHg3ODI0LCAweGQwY2MsIDB4MDA0MCwgMHg2YWQ4LCAweGMzZTUsCisJMHgyM2EyLCAweDY4NjgsIDB4MjBhMiwgMHg2ODY0LCAweDIwYTIsIDB4MjJhMiwgMHg2ODc0LCAweDIwYTIsCisJMHgyMmEyLCAweDY4N2MsIDB4MjBhMiwgMHgyMDA5LCAweDAwMTgsIDB4YTM4NCwgMHgwMzAwLCAweDAwNDAsCisJMHg2YjQ2LCAweGQzYzQsIDB4MDA0MCwgMHg2YWVlLCAweDY4N2MsIDB4YTEwOCwgMHhkM2NjLCAweDAwNDAsCisJMHg2YWYzLCAweDY4NzQsIDB4YTEwOCwgMHgxNTdlLCAweDIwYTksIDB4MDAwZCwgMHhhZDgwLCAweDAwMjAsCisJMHgyMDFjLCAweDgzMWYsIDB4MjNhMiwgMHg4MDAwLCAweDAwZjAsIDB4NmFmOCwgMHgxNTdmLCAweDIyYTIsCisJMHgyMmEyLCAweDIyYTIsIDB4YTE4NCwgMHgwMDAzLCAweDAwNDAsIDB4NmI0NiwgMHgyMGExLCAweDAyMGIsCisJMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDAwN2UsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweGQwYmMsIDB4MDA0MCwgMHg2YjI2LCAweDBkN2UsIDB4YTBlOCwgMHhhNzM1LCAweDJkNmMsCisJMHg2ODEwLCAweGEwODUsIDB4MDcwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGE2MWIsCisJMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwZDdmLCAweDAwNzgsIDB4NmIzNSwgMHgwZDdlLCAweGEwZTgsCisJMHhhNzM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDA3MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsCisJMHgwZDdmLCAweDIwYTMsIDB4MDAwMCwgMHg2MjMwLCAweDIyYTIsIDB4MDA3ZiwgMHg3YjI0LCAweGQzY2MsCisJMHgwMDQwLCAweDZiM2UsIDB4MjBhMywgMHgwODg5LCAweDAwNzgsIDB4NmI0MCwgMHgyMGEzLCAweDA4OTgsCisJMHgyMGEyLCAweDEwNzgsIDB4NmRlYSwgMHgyMmEyLCAweDIwYTMsIDB4MDAwMCwgMHg2MWMyLCAweDAzN2YsCisJMHgwMTdmLCAweDEwNzgsIDB4NmRmYiwgMHgwMDdjLCAweDIwMTEsIDB4MDAwOCwgMHg3ODI0LCAweGQwY2MsCisJMHgwMDQwLCAweDZiNTMsIDB4YzJlNSwgMHgyMmEyLCAweGEwMTYsIDB4MDA3OCwgMHg2YjhhLCAweDIwMTEsCisJMHgwMzAyLCAweDc4MjQsIDB4ZDBjYywgMHgwMDQwLCAweDZiNWUsIDB4YzJlNSwgMHgyMmEyLCAweGEwMTYsCisJMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMGEzLCAweDAwMTIsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDgsCisJMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIwYTMsIDB4NzAwMCwgMHgyMGEzLCAweDA1MDAsCisJMHgyMmEyLCAweDIwYTMsIDB4MDAwYSwgMHgyMmEyLCAweDIyYTIsIDB4MjBhMywgMHgyNTAwLCAweDIyYTIsCisJMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDYwYzMsIDB4MDAzMiwgMHgxMDc4LCAweDZkZmIsCisJMHgwMDdjLCAweDIwMTEsIDB4MDAyOCwgMHg3ODI0LCAweGQwY2MsIDB4MDA0MCwgMHg2Yjg4LCAweGMyZTUsCisJMHgyMmEyLCAweGEwMTYsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsCisJMHg2MGMzLCAweDAwMTgsIDB4MTA3OCwgMHg2ZGZiLCAweDAwN2MsIDB4MjAxMSwgMHgwMTAwLCAweDc4MjQsCisJMHhkMGNjLCAweDAwNDAsIDB4NmI5YywgMHhjMmU1LCAweDIyYTIsIDB4YTAxNiwgMHgyMmEyLCAweDIyYTIsCisJMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDgsIDB4MjJhMiwgMHg3ODM0LCAweGEwODQsCisJMHgwMGZmLCAweDIwYTIsIDB4MjJhMiwgMHgyMmEyLCAweDYwYzMsIDB4MDAyMCwgMHgxMDc4LCAweDZkZmIsCisJMHgwMDdjLCAweDIwMTEsIDB4MDAwOCwgMHg3ODI0LCAweGQwY2MsIDB4MDA0MCwgMHg2YmI4LCAweGMyZTUsCisJMHgyMmEyLCAweGEwMTYsIDB4MDA3OCwgMHg2YjhhLCAweDAzN2UsIDB4N2IxMCwgMHhhMzg0LCAweGZmMDAsCisJMHg3ODEyLCAweGEzODQsIDB4MDBmZiwgMHg4MDAxLCAweDAwYzAsIDB4NmJjZiwgMHg3ODI0LCAweGQwY2MsCisJMHgwMDQwLCAweDZiY2IsIDB4YzJlNSwgMHgyMmEyLCAweDAzN2YsIDB4MDA3OCwgMHg2YjhhLCAweDA0N2UsCisJMHgyMDIxLCAweDA4MDAsIDB4MDA3ZSwgMHg3ODI0LCAweGQwY2MsIDB4MDA3ZiwgMHgwMDQwLCAweDZiZDksCisJMHhjNGU1LCAweDI0YTIsIDB4MDQ3ZiwgMHgyMmEyLCAweDIwYTIsIDB4MDM3ZiwgMHgwMDc4LCAweDZiOGMsCisJMHgwMjdlLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweGQwYmMsIDB4MDA0MCwgMHg2YmZlLCAweDBkN2UsIDB4YTBlOCwgMHhhNzM1LCAweDJkNmMsCisJMHg2ODEwLCAweGEwODUsIDB4MDcwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGE2MWIsCisJMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwZDdmLCAweDAwNzgsIDB4NmMwZCwgMHgwZDdlLCAweGEwZTgsCisJMHhhNzM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDA3MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsCisJMHgwZDdmLCAweDIwYTMsIDB4MDAwMCwgMHg2MjMwLCAweDIyYTIsIDB4NzgyNCwgMHhkMGNjLCAweDAwNDAsCisJMHg2YzE1LCAweDIwYTMsIDB4MDg4OSwgMHgwMDc4LCAweDZjMTcsIDB4MjBhMywgMHgwODk4LCAweDIwYTMsCisJMHgwMDAwLCAweDEwNzgsIDB4NmRlYSwgMHgyMmEyLCAweDIwYTMsIDB4MDAwMCwgMHg3YTA4LCAweDIyYTIsCisJMHgyZmEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MDI3ZiwgMHgwMDdjLCAweDBkN2UsCisJMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHgwMTdlLCAweDAzN2UsIDB4NzgxMCwgMHhhMDg0LCAweDA3MDAsCisJMHg4MDA3LCAweDEwNzksIDB4NmMzYSwgMHgwMzdmLCAweDAxN2YsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsCisJMHgwZDdmLCAweDAwN2MsIDB4NmM0MiwgMHg2YzQyLCAweDZjNDQsIDB4NmM0MiwgMHg2YzQyLCAweDZjNDIsCisJMHg2YzY5LCAweDZjNDIsIDB4MTA3OCwgMHgxMzMyLCAweDc5MTAsIDB4YTE4YywgMHhmOGZmLCAweGExOGQsCisJMHgwNjAwLCAweDc5MTIsIDB4MjBhMSwgMHgwMjBiLCAweDIwMDksIDB4MDAwMywgMHgxMDc4LCAweDZjNzMsCisJMHgwZDdlLCAweDIwNjksIDB4YTY1MiwgMHg2ODA0LCAweGQwYmMsIDB4MDA0MCwgMHg2YzVlLCAweDY4MmMsCisJMHhhMDg0LCAweDAwZmYsIDB4ODAwNywgMHgyMGEyLCAweDAwNzgsIDB4NmM2MCwgMHgyMGEzLCAweDNmMDAsCisJMHgwZDdmLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDYwYzMsIDB4MDAwMSwgMHgxMDc4LCAweDZkZmIsCisJMHgwMDdjLCAweDIwYTEsIDB4MDIwYiwgMHgyMDA5LCAweDAwMDMsIDB4MTA3OCwgMHg2YzczLCAweDIwYTMsCisJMHg3ZjAwLCAweDAwNzgsIDB4NmM2MSwgMHgwMjdlLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsCisJMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGQwYmMsIDB4MDA0MCwgMHg2YzkxLCAweDBkN2UsCisJMHhhMGU4LCAweGE3MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDEwMCwgMHgyMGEyLCAweDY4MTQsCisJMHgyMGEyLCAweDIwNjksIDB4YTYxYiwgMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwZDdmLCAweDAwNzgsCisJMHg2Y2EwLCAweDBkN2UsIDB4YTBlOCwgMHhhNzM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDAxMDAsCisJMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgwZDdmLCAweDIwYTMsIDB4MDAwMCwgMHg2MjMwLCAweDIyYTIsCisJMHgyMGEzLCAweDA4ODgsIDB4YTE4ZCwgMHgwMDA4LCAweDIxYTIsIDB4MTA3OCwgMHg2ZGVhLCAweDIyYTIsCisJMHgyMGEzLCAweDAwMDAsIDB4N2EwOCwgMHgyMmEyLCAweDJmYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDAyN2YsIDB4MDA3YywgMHgwZTdlLCAweDBkN2UsIDB4MGM3ZSwgMHgwNTdlLCAweDA0N2UsCisJMHgwMzdlLCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweGE2MDAsIDB4NjEzMCwgMHg3ODE4LCAweDIwNjgsCisJMHg2OGEwLCAweDIwMjgsIDB4ZDBiYywgMHgwMGMwLCAweDZjY2EsIDB4NjkxMCwgMHg2YTE0LCAweDY0MzAsCisJMHgwMDc4LCAweDZjY2UsIDB4NjkxMCwgMHg2YTE0LCAweDczNmMsIDB4NzQ3MCwgMHg3ODFjLCAweGEwODYsCisJMHgwMDA2LCAweDAwNDAsIDB4NmQyZCwgMHhkNWJjLCAweDAwNDAsIDB4NmNkZSwgMHhhMTg1LCAweDAxMDAsCisJMHg2MDYyLCAweDYyNjYsIDB4NjM2YSwgMHg2NDZlLCAweDAwNzgsIDB4NmNlNSwgMHhhMTg1LCAweDAxMDAsCisJMHg2MDYyLCAweDYyNjYsIDB4NjA2YiwgMHgwMDAwLCAweDY0NmUsIDB4NjA3MywgMHgwODA5LCAweDYwNzcsCisJMHgwMDA4LCAweDY4OGMsIDB4ODAwMCwgMHhhMDg0LCAweDAwZmYsIDB4Njg4ZSwgMHg4MDA3LCAweDYwN2EsCisJMHg2MDdmLCAweDAwMDAsIDB4MmYwMCwgMHg2MDgyLCAweDc4MDgsIDB4NjA4NiwgMHg3ODEwLCAweDIwNzAsCisJMHg3MDE0LCAweDYwOGEsIDB4NzAxMCwgMHg2MDhlLCAweDcwMGMsIDB4NjBjNiwgMHg3MDA4LCAweDYwY2EsCisJMHg2ODZjLCAweDYwY2UsIDB4NjBhYiwgMHgwMDM2LCAweDYwYWYsIDB4OTVkNSwgMHg2MGQ3LCAweDAwMDAsCisJMHhhNTgyLCAweDAwODAsIDB4MDA0OCwgMHg2ZDE3LCAweDZhMDAsIDB4ZDJmNCwgMHgwMDQwLCAweDZkMTUsCisJMHg2YTE0LCAweGEyOTQsIDB4MDBmZiwgMHgwMDc4LCAweDZkMTcsIDB4MjAxMSwgMHgwMDAwLCAweDYyOWUsCisJMHg2MDE3LCAweDAwMTYsIDB4MjAwOSwgMHgwN2QwLCAweDYwYzQsIDB4YTA4NCwgMHhmZmYwLCAweGEwMDUsCisJMHgwMDQwLCAweDZkMjQsIDB4MjAwOSwgMHgxYjU4LCAweDEwNzgsIDB4NWFkMCwgMHgwMzdmLCAweDA0N2YsCisJMHgwNTdmLCAweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDAwN2MsIDB4NzgxMCwgMHgyMDcwLCAweDcwNGMsCisJMHhhMDg0LCAweDAwMDMsIDB4YTA4NiwgMHgwMDAyLCAweDAwNDAsIDB4NmQ4NSwgMHhkNWJjLCAweDAwNDAsCisJMHg2ZDQxLCAweGExODUsIDB4MDEwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjM2YSwgMHg2NDZlLCAweDAwNzgsCisJMHg2ZDQ4LCAweGExODUsIDB4MDEwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjA2YiwgMHgwMDAwLCAweDY0NmUsCisJMHg2MDczLCAweDA4ODAsIDB4NjA3NywgMHgwMDA4LCAweDY4OGMsIDB4ODAwMCwgMHhhMDg0LCAweDAwZmYsCisJMHg2ODhlLCAweDgwMDcsIDB4NjA3YSwgMHg2MDdmLCAweDAwMDAsIDB4MmYwMCwgMHg2MDg2LCAweDc4MDgsCisJMHg2MDgyLCAweDcwNjAsIDB4NjA4YSwgMHg3MDVjLCAweDYwOGUsIDB4NzA4MCwgMHg2MGM2LCAweDcwN2MsCisJMHg2MGNhLCAweDcwN2MsIDB4NzkyYywgMHhhMTA4LCAweDc5MmUsIDB4NzA4MCwgMHg3OTI4LCAweGExMDksCisJMHg3OTJhLCAweDY4NmMsIDB4NjBjZSwgMHg2MGFiLCAweDAwMzYsIDB4NjBhZiwgMHg5NWQ1LCAweDYwZDcsCisJMHgwMDAwLCAweGE1ODIsIDB4MDA4MCwgMHgwMDQ4LCAweDZkODAsIDB4NmEwMCwgMHhkMmY0LCAweDAwNDAsCisJMHg2ZDdlLCAweDZhMTQsIDB4YTI5NCwgMHgwMGZmLCAweDAwNzgsIDB4NmQ4MCwgMHgyMDExLCAweDAwMDAsCisJMHg2MjllLCAweDYwMTcsIDB4MDAxMiwgMHgwMDc4LCAweDZkMWEsIDB4ZDViYywgMHgwMDQwLCAweDZkOTAsCisJMHhhMTg1LCAweDA3MDAsIDB4NjA2MiwgMHg2MjY2LCAweDYzNmEsIDB4NjQ2ZSwgMHgwMDc4LCAweDZkOTcsCisJMHhhMTg1LCAweDA3MDAsIDB4NjA2MiwgMHg2MjY2LCAweDYwNmIsIDB4MDAwMCwgMHg2NDZlLCAweDEwNzgsCisJMHg0OTVmLCAweDAwNDAsIDB4NmRhZCwgMHgwZDdlLCAweDc4MTAsIDB4YTA2ZCwgMHg2ODRjLCAweDBkN2YsCisJMHhhMDg0LCAweDIwMjAsIDB4YTA4NiwgMHgyMDIwLCAweDAwYzAsIDB4NmRhZCwgMHg3ODI0LCAweGMwY2QsCisJMHg3ODI2LCAweDYwNzMsIDB4MDg4OSwgMHgwMDc4LCAweDZkYWYsIDB4NjA3MywgMHgwODk4LCAweDYwNzcsCisJMHgwMDAwLCAweDY4OGMsIDB4ODAwMCwgMHhhMDg0LCAweDAwZmYsIDB4Njg4ZSwgMHg4MDA3LCAweDYwN2EsCisJMHg2MDdmLCAweDAwMDAsIDB4MmYwMCwgMHg2MDg2LCAweDc4MDgsIDB4NjA4MiwgMHg3MDE0LCAweDYwOGEsCisJMHg3MDEwLCAweDYwOGUsIDB4NzAwYywgMHg2MGM2LCAweDcwMDgsIDB4NjBjYSwgMHg2ODZjLCAweDYwY2UsCisJMHg2MGFiLCAweDAwMzYsIDB4NjBhZiwgMHg5NWQ1LCAweDYwZDcsIDB4MDAwMCwgMHhhNTgyLCAweDAwODAsCisJMHgwMDQ4LCAweDZkZGQsIDB4NmEwMCwgMHhkMmY0LCAweDAwNDAsIDB4NmRkYiwgMHg2YTE0LCAweGEyOTQsCisJMHgwMGZmLCAweDAwNzgsIDB4NmRkZCwgMHgyMDExLCAweDAwMDAsIDB4NjI5ZSwgMHg3ODI0LCAweGQwY2MsCisJMHgwMDQwLCAweDZkZTYsIDB4NjAxNywgMHgwMDE2LCAweDAwNzgsIDB4NmQxYSwgMHg2MDE3LCAweDAwMTIsCisJMHgwMDc4LCAweDZkMWEsIDB4N2ExOCwgMHhhMjgwLCAweDAwMjMsIDB4MjAxNCwgMHg4MjEwLCAweGEyOTQsCisJMHgwMGZmLCAweDIyMDIsIDB4ODIxNywgMHgwMDdjLCAweDBkN2UsIDB4MjA2OSwgMHhhOGIxLCAweDY4NDMsCisJMHgwMDAxLCAweDBkN2YsIDB4MDA3YywgMHgyMGUxLCAweDkwODAsIDB4NjBhMywgMHgwMDU2LCAweDYwYTcsCisJMHg5NTc1LCAweDEwNzgsIDB4NmUwNiwgMHgxMDc4LCAweDVhYzAsIDB4MDA3YywgMHgwMDdlLCAweDYwMTQsCisJMHhhMDg0LCAweDAwMDQsIDB4YTA4NSwgMHgwMDA5LCAweDYwMTYsIDB4MDA3ZiwgMHgwMDdjLCAweDAwN2UsCisJMHgwYzdlLCAweDIwNjEsIDB4MDEwMCwgMHg2MDE0LCAweGEwODQsIDB4MDAwNCwgMHhhMDg1LCAweDAwMDgsCisJMHg2MDE2LCAweDBjN2YsIDB4MDA3ZiwgMHgwMDdjLCAweDBjN2UsIDB4MGQ3ZSwgMHgwMTdlLCAweDAyN2UsCisJMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLCAweDY5MDQsIDB4YTE5NCwgMHg0MDAwLCAweDAwNDAsCisJMHg2ZTU5LCAweDEwNzgsIDB4NmUwZiwgMHg2ODAzLCAweDEwMDAsIDB4NjgwMywgMHgwMDAwLCAweDBjN2UsCisJMHgyMDYxLCAweGE4YjEsIDB4NjEyOCwgMHhhMTkyLCAweDAwYzgsIDB4MDBjOCwgMHg2ZTQ0LCAweDgxMDgsCisJMHg2MTJhLCAweDYxMjQsIDB4MGM3ZiwgMHg4MWZmLCAweDAwNDAsIDB4NmU1NCwgMHgxMDc4LCAweDVhYzAsCisJMHgxMDc4LCAweDZlMDYsIDB4MDA3OCwgMHg2ZTU0LCAweDYxMjQsIDB4YTFlNSwgMHgwMDAwLCAweDAwNDAsCisJMHg2ZTUxLCAweDEwNzgsIDB4YTVjNCwgMHgxMDc4LCAweDVhY2IsIDB4MjAwOSwgMHgwMDE0LCAweDEwNzgsCisJMHg3NzVjLCAweDBjN2YsIDB4MDA3OCwgMHg2ZTU0LCAweDAyN2YsIDB4MDE3ZiwgMHgwZDdmLCAweDBjN2YsCisJMHgwMDdjLCAweDIwMDEsIDB4YThjZCwgMHgyMDA0LCAweGEwMDUsIDB4MDBjMCwgMHg2ZTU0LCAweDBjN2UsCisJMHgyMDYxLCAweGE4YjEsIDB4NjEyOCwgMHhhMTkyLCAweDAwMDMsIDB4MDBjOCwgMHg2ZTQ0LCAweDgxMDgsCisJMHg2MTJhLCAweDBjN2YsIDB4MTA3OCwgMHg1YWMwLCAweDEwNzgsIDB4NDIyNCwgMHgwMDc4LCAweDZlNTQsCisJMHgwYzdlLCAweDBkN2UsIDB4MGU3ZSwgMHgwMTdlLCAweDAyN2UsIDB4MTA3OCwgMHg1YWQ4LCAweDIwNzEsCisJMHhhOGIxLCAweDcxM2MsIDB4ODFmZiwgMHgwMDQwLCAweDZlOWEsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksCisJMHgwMTQwLCAweDY5MDQsIDB4YTE5NCwgMHg0MDAwLCAweDAwNDAsIDB4NmVhMCwgMHg2ODAzLCAweDEwMDAsCisJMHg2ODAzLCAweDAwMDAsIDB4MDM3ZSwgMHgyMDE5LCAweDAwMDEsIDB4MTA3OCwgMHg3MDU4LCAweDAzN2YsCisJMHg3MTNjLCAweDIxNjAsIDB4MTA3OCwgMHhhNWM0LCAweDIwMDksIDB4MDA0YSwgMHgxMDc4LCAweDc3NWMsCisJMHgwMDc4LCAweDZlOWEsIDB4MDI3ZiwgMHgwMTdmLCAweDBlN2YsIDB4MGQ3ZiwgMHgwYzdmLCAweDAwN2MsCisJMHgwMDc4LCAweDZlOGEsIDB4MGU3ZSwgMHgyMDcxLCAweGE4YjEsIDB4NzA0OCwgMHhkMDg0LCAweDAwNDAsCisJMHg2ZWJjLCAweDcxM2MsIDB4ODFmZiwgMHgwMDQwLCAweDZlYmMsIDB4MjA3MSwgMHgwMTAwLCAweGExODgsCisJMHgwMDA3LCAweDIxMGMsIDB4YTE4ZSwgMHgwMDA2LCAweDAwYzAsIDB4NmViYSwgMHg3MDE3LCAweDAwMTIsCisJMHgwMDc4LCAweDZlYmMsIDB4NzAxNywgMHgwMDE2LCAweDBlN2YsIDB4MDA3YywgMHgwZTdlLCAweDBkN2UsCisJMHgwYzdlLCAweDA2N2UsIDB4MDU3ZSwgMHgwNDdlLCAweDAwN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHg2MDE4LCAweDIwNjgsIDB4NmNhMCwgMHgyMDcxLCAweGE4YjEsIDB4NzAxOCwgMHgyMDY4LCAweDhkZmYsCisJMHgwMDQwLCAweDZlZTYsIDB4NjhhMCwgMHhhNDA2LCAweDAwNDAsIDB4NmVkYSwgMHg2ODU0LCAweDIwNjgsCisJMHgwMDc4LCAweDZlY2YsIDB4NjAxMCwgMHgyMDYwLCAweDY0M2MsIDB4NjU0MCwgMHg2NjQ4LCAweDJkNjAsCisJMHgxMDc4LCAweDQ3MzYsIDB4MDA0MCwgMHg2ZWU2LCAweGEwODUsIDB4MDAwMSwgMHgxMjdmLCAweDAwN2YsCisJMHgwNDdmLCAweDA1N2YsIDB4MDY3ZiwgMHgwYzdmLCAweDBkN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDIwYTEsCisJMHgwMjBiLCAweDEwNzgsIDB4NjczMSwgMHgyMGEzLCAweDEyMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDc4MWMsIDB4YTA4NiwgMHgwMDA0LCAweDAwYzAsIDB4NmYwMSwgMHg2MDk4LCAweDAwNzgsCisJMHg2ZjAyLCAweDYwMzAsIDB4MjBhMiwgMHg3ODM0LCAweDIwYTIsIDB4NzgzOCwgMHgyMGEyLCAweDIwYTksCisJMHgwMDEwLCAweGEwMDYsIDB4MjBhMiwgMHgwMGYwLCAweDZmMGEsIDB4MjBhMiwgMHgyMGEyLCAweDYwYzMsCisJMHgwMDJjLCAweDEwNzgsIDB4NmRmYiwgMHgwMDdjLCAweDE1N2UsIDB4MTQ3ZSwgMHgyMGExLCAweDAyMGIsCisJMHgxMDc4LCAweDY3MzEsIDB4MjBhMywgMHgwZjAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHg3ODA4LCAweDIwYTIsIDB4NjBjMywgMHgwMDA4LCAweDEwNzgsIDB4NmRmYiwgMHgxNDdmLCAweDE1N2YsCisJMHgwMDdjLCAweDE1N2UsIDB4MTQ3ZSwgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2N2MyLCAweDIwYTMsCisJMHgwMjAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGE5LCAweDAwMDYsIDB4MjAxMSwgMHhhNjQwLCAweDIwMTksCisJMHhhNjQxLCAweDIzYTYsIDB4MjJhNiwgMHhhMzk4LCAweDAwMDIsIDB4YTI5MCwgMHgwMDAyLCAweDAwZjAsCisJMHg2ZjM5LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDFjLCAweDEwNzgsCisJMHg2ZGZiLCAweDE0N2YsIDB4MTU3ZiwgMHgwMDdjLCAweDE1N2UsIDB4MTQ3ZSwgMHgwMTdlLCAweDAyN2UsCisJMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2Nzk5LCAweDEwNzgsIDB4NjdiMCwgMHg3ODEwLCAweGEwODAsCisJMHgwMDAwLCAweDIwMDQsIDB4YTA4MCwgMHgwMDE1LCAweDIwOTgsIDB4NzgwOCwgMHhhMDg4LCAweDAwMDIsCisJMHgyMWE4LCAweDUzYTYsIDB4YTA4MCwgMHgwMDA0LCAweDgwMDMsIDB4NjBjMiwgMHgxMDc4LCAweDZkZmIsCisJMHgwMjdmLCAweDAxN2YsIDB4MTQ3ZiwgMHgxNTdmLCAweDAwN2MsIDB4MTU3ZSwgMHgxNDdlLCAweDIwYTEsCisJMHgwMjBiLCAweDEwNzgsIDB4NjczMSwgMHgyMGEzLCAweDYyMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDc4MDgsIDB4MjBhMiwgMHg2MGMzLCAweDAwMDgsIDB4MTA3OCwgMHg2ZGZiLCAweDE0N2YsCisJMHgxNTdmLCAweDAwN2MsIDB4MTU3ZSwgMHgxNDdlLCAweDAxN2UsIDB4MDI3ZSwgMHgyMGExLCAweDAyMGIsCisJMHgxMDc4LCAweDY3MzEsIDB4NzgxMCwgMHhhMDgwLCAweDAwMDAsIDB4MjAwNCwgMHhhMDgwLCAweDAwMTcsCisJMHgyMDk4LCAweDc4MDgsIDB4YTA4OCwgMHgwMDAyLCAweDIxYTgsIDB4NTNhNiwgMHg4MDAzLCAweDYwYzIsCisJMHgxMDc4LCAweDZkZmIsIDB4MDI3ZiwgMHgwMTdmLCAweDE0N2YsIDB4MTU3ZiwgMHgwMDdjLCAweDBlN2UsCisJMHgwYzdlLCAweDAwN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhOGIxLCAweDcwMGMsCisJMHgyMDYwLCAweDhjZmYsIDB4MDA0MCwgMHg2ZmJiLCAweDEwNzgsIDB4OGYwMCwgMHgwMGMwLCAweDZmYjIsCisJMHgxMDc4LCAweDdjODMsIDB4NjAwYywgMHgwMDdlLCAweDEwNzgsIDB4NzcyZCwgMHgxMDc4LCAweDcyMzMsCisJMHgwYzdmLCAweDAwNzgsIDB4NmZhOSwgMHg3MDBmLCAweDAwMDAsIDB4NzAwYiwgMHgwMDAwLCAweDEyN2YsCisJMHgwMDdmLCAweDBjN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MTU3ZSwgMHgwZjdlLCAweDBlN2UsCisJMHgwZDdlLCAweDBjN2UsIDB4MDI3ZSwgMHgwMTdlLCAweDAwN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksCisJMHgwMTAwLCAweDIwNzksIDB4MDE0MCwgMHgyMDcxLCAweGE4YjEsIDB4NzAyNCwgMHgyMDYwLCAweDhjZmYsCisJMHgwMDQwLCAweDcwMTQsIDB4MTA3OCwgMHg2ZTBmLCAweDY4YzMsIDB4MDAwMCwgMHgxMDc4LCAweDVhY2IsCisJMHgyMDA5LCAweDAwMTMsIDB4MTA3OCwgMHg3NzVjLCAweDIwYTksIDB4MDFmNCwgMHg2ODI0LCAweGQwOTQsCisJMHgwMDQwLCAweDZmZjcsIDB4NjgyNywgMHgwMDA0LCAweDc4MDQsIDB4YTA4NCwgMHg0MDAwLCAweDAwNDAsCisJMHg3MDA5LCAweDc4MDMsIDB4MTAwMCwgMHg3ODAzLCAweDAwMDAsIDB4MDA3OCwgMHg3MDA5LCAweGQwODQsCisJMHgwMDQwLCAweDZmZmUsIDB4NjgyNywgMHgwMDAxLCAweDAwNzgsIDB4NzAwMCwgMHgwMGYwLCAweDZmZTYsCisJMHg3ODA0LCAweGEwODQsIDB4MTAwMCwgMHgwMDQwLCAweDcwMDksIDB4NzgwMywgMHgwMTAwLCAweDc4MDMsCisJMHgwMDAwLCAweDY4MjQsIDB4MDA3ZiwgMHgwMTdmLCAweDAyN2YsIDB4MGM3ZiwgMHgwZDdmLCAweDBlN2YsCisJMHgwZjdmLCAweDE1N2YsIDB4MTI3ZiwgMHgwMDdjLCAweDIwMDEsIDB4YTYwMCwgMHgyMDA0LCAweGEwOTYsCisJMHgwMDAxLCAweDAwNDAsIDB4NzA0ZSwgMHhhMDk2LCAweDAwMDQsIDB4MDA0MCwgMHg3MDRlLCAweDEwNzgsCisJMHg1YWNiLCAweDY4MTcsIDB4MDAwOCwgMHg2OGMzLCAweDAwMDAsIDB4MjAxMSwgMHg0MWRjLCAweDEwNzgsCisJMHg1YTQ1LCAweDIwYTksIDB4MDFmNCwgMHg2ODI0LCAweGQwOTQsIDB4MDA0MCwgMHg3MDNjLCAweDY4MjcsCisJMHgwMDA0LCAweDc4MDQsIDB4YTA4NCwgMHg0MDAwLCAweDAwNDAsIDB4NzA0ZSwgMHg3ODAzLCAweDEwMDAsCisJMHg3ODAzLCAweDAwMDAsIDB4MDA3OCwgMHg3MDRlLCAweGQwODQsIDB4MDA0MCwgMHg3MDQzLCAweDY4MjcsCisJMHgwMDAxLCAweDAwNzgsIDB4NzA0NSwgMHgwMGYwLCAweDcwMmIsIDB4NzgwNCwgMHhhMDg0LCAweDEwMDAsCisJMHgwMDQwLCAweDcwNGUsIDB4NzgwMywgMHgwMTAwLCAweDc4MDMsIDB4MDAwMCwgMHgwMDdmLCAweDAxN2YsCisJMHgwMjdmLCAweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDBmN2YsIDB4MTU3ZiwgMHgxMjdmLCAweDAwN2MsCisJMHgxMjdlLCAweDE1N2UsIDB4MGY3ZSwgMHgwZTdlLCAweDBkN2UsIDB4MGM3ZSwgMHgwMjdlLCAweDAxN2UsCisJMHgwMDdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDY5LCAweDAxMDAsIDB4MjA3OSwgMHgwMTQwLCAweDIwNzEsCisJMHhhOGIxLCAweDcwM2MsIDB4MjA2MCwgMHg4Y2ZmLCAweDAwNDAsIDB4NzBkNiwgMHg2OGFmLCAweDk1ZjUsCisJMHg2ODE3LCAweDAwMTAsIDB4MjAwOSwgMHgwMGZhLCAweDgxMDksIDB4MDBjMCwgMHg3MDc0LCAweDY4YzcsCisJMHgwMDAwLCAweDY4Y2IsIDB4MDAwOCwgMHgxMDc4LCAweDVhZDgsIDB4MTA3OCwgMHgxZjdlLCAweDA0N2UsCisJMHgwNTdlLCAweDIwMDksIDB4MDE3ZiwgMHgyMTJjLCAweDIwMGIsIDB4MDBhNSwgMHgyMDIxLCAweDAxNjksCisJMHgyNDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDg2LCAweDAwMDQsIDB4MDBjMCwgMHg3MGE1LCAweDY4YzcsCisJMHgwMDAwLCAweDY4Y2IsIDB4MDAwOCwgMHgwZTdlLCAweDBmN2UsIDB4MjA3OSwgMHgwMDIwLCAweDIwNzEsCisJMHhhOTA4LCAweDY4MTQsIDB4YTA4NCwgMHgwMDA0LCAweGEwODUsIDB4MDAxMiwgMHg2ODE2LCAweDc4MDMsCisJMHgwMDA4LCAweDcwMDMsIDB4MDAwMCwgMHgwZjdmLCAweDBlN2YsIDB4MjUwYSwgMHgwNTdmLCAweDA0N2YsCisJMHhhMzlkLCAweDAwMDAsIDB4MDBjMCwgMHg3MGIwLCAweDIwMDksIDB4MDA0OSwgMHgxMDc4LCAweDc3NWMsCisJMHgyMGE5LCAweDAzZTgsIDB4NjgyNCwgMHhkMDk0LCAweDAwNDAsIDB4NzBjMywgMHg2ODI3LCAweDAwMDQsCisJMHg3ODA0LCAweGEwODQsIDB4NDAwMCwgMHgwMDQwLCAweDcwZDUsIDB4NzgwMywgMHgxMDAwLCAweDc4MDMsCisJMHgwMDAwLCAweDAwNzgsIDB4NzBkNSwgMHhkMDhjLCAweDAwNDAsIDB4NzBjYSwgMHg2ODI3LCAweDAwMDIsCisJMHgwMDc4LCAweDcwY2MsIDB4MDBmMCwgMHg3MGIyLCAweDc4MDQsIDB4YTA4NCwgMHgxMDAwLCAweDAwNDAsCisJMHg3MGQ1LCAweDc4MDMsIDB4MDEwMCwgMHg3ODAzLCAweDAwMDAsIDB4NjgyNCwgMHgwMDdmLCAweDAxN2YsCisJMHgwMjdmLCAweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDBmN2YsIDB4MTU3ZiwgMHgxMjdmLCAweDAwN2MsCisJMHgwZDdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksIDB4YThiMSwgMHg2YTA2LCAweDEyN2YsCisJMHgwZDdmLCAweDAwN2MsIDB4MGQ3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDY5LCAweGE4YjEsCisJMHg2YTMyLCAweDEyN2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDBmN2UsIDB4MGU3ZSwgMHgwYzdlLCAweDA2N2UsCisJMHgwMDdlLCAweDEyN2UsIDB4MjA3MSwgMHhhOGIxLCAweDc2MTQsIDB4MjY2MCwgMHgyNjc4LCAweDIwOTEsCisJMHg4MDAwLCAweDhjZmYsIDB4MDA0MCwgMHg3MTM0LCAweDYwMWMsIDB4YTIwNiwgMHgwMGMwLCAweDcxMmYsCisJMHg3MDE0LCAweGFjMzYsIDB4MDBjMCwgMHg3MTBlLCAweDY2MGMsIDB4NzYxNiwgMHg3MDEwLCAweGFjMzYsCisJMHgwMGMwLCAweDcxMWMsIDB4MmMwMCwgMHhhZjM2LCAweDAwNDAsIDB4NzExYSwgMHgyZjAwLCAweDcwMTIsCisJMHgwMDc4LCAweDcxMWMsIDB4NzAxMywgMHgwMDAwLCAweDY2MGMsIDB4MDY3ZSwgMHgyYzAwLCAweGFmMDYsCisJMHgwMDQwLCAweDcxMjUsIDB4N2UwZSwgMHgwMDc4LCAweDcxMjYsIDB4MjY3OCwgMHg2MDBmLCAweDAwMDAsCisJMHgxMDc4LCAweDhlYzYsIDB4MTA3OCwgMHg3MjMzLCAweDBjN2YsIDB4MDA3OCwgMHg3MTAxLCAweDJjNzgsCisJMHg2MDBjLCAweDIwNjAsIDB4MDA3OCwgMHg3MTAxLCAweDEyN2YsIDB4MDA3ZiwgMHgwNjdmLCAweDBjN2YsCisJMHgwZTdmLCAweDBmN2YsIDB4MDA3YywgMHgxNTdlLCAweDE0N2UsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsCisJMHg2OWQwLCAweDc4MTAsIDB4MjBhMiwgMHhhMDA2LCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsCisJMHgyMGEzLCAweDEwMDAsIDB4MDA3OCwgMHg3MThlLCAweDE1N2UsIDB4MTQ3ZSwgMHgyMGExLCAweDAyMGIsCisJMHgxMDc4LCAweDY5ZDAsIDB4NzgxMCwgMHgyMGEyLCAweGEwMDYsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsCisJMHgyMGEyLCAweDIwYTMsIDB4NDAwMCwgMHgwMDc4LCAweDcxOGUsIDB4MTU3ZSwgMHgxNDdlLCAweDIwYTEsCisJMHgwMjBiLCAweDEwNzgsIDB4NjlkMCwgMHg3ODEwLCAweDIwYTIsIDB4YTAwNiwgMHgyMGEyLCAweDIwYTIsCisJMHgyMGEyLCAweDIwYTIsIDB4MjBhMywgMHgyMDAwLCAweDAwNzgsIDB4NzE4ZSwgMHgxNTdlLCAweDE0N2UsCisJMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2OWQwLCAweDc4MTAsIDB4MjBhMiwgMHhhMDA2LCAweDIwYTIsCisJMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEzLCAweDA0MDAsIDB4MDA3OCwgMHg3MThlLCAweDE1N2UsCisJMHgxNDdlLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY5ZDAsIDB4NzgxMCwgMHgyMGEyLCAweGEwMDYsCisJMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTMsIDB4MDIwMCwgMHgxMDc4LCAweDcyM2UsCisJMHg2MGMzLCAweDAwMjAsIDB4MTA3OCwgMHg2ZGZiLCAweDE0N2YsIDB4MTU3ZiwgMHgwMDdjLCAweDEyN2UsCisJMHgwYzdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDYxLCAweDAxMDAsIDB4NjEyMCwgMHhkMWI0LCAweDAwYzAsCisJMHg3MWE2LCAweGQxYmMsIDB4MDBjMCwgMHg3MWYwLCAweDAwNzgsIDB4NzIzMCwgMHgyMDA5LCAweDAxN2YsCisJMHgyMDBiLCAweDAwYTEsIDB4MTU3ZSwgMHgwMDdlLCAweDBkN2UsIDB4MjA2OSwgMHgwMTQwLCAweDIwYTksCisJMHgwMDFlLCAweDIwMDksIDB4MDE2OSwgMHg2ODA0LCAweGEwODQsIDB4NDAwMCwgMHgwMDQwLCAweDcxZTcsCisJMHg2MDIwLCAweGQwYjQsIDB4MDA0MCwgMHg3MWU3LCAweDYwMjQsIDB4ZDA5NCwgMHgwMGMwLCAweDcxZTcsCisJMHgyMTA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDg2LCAweDAwMDQsIDB4MDBjMCwgMHg3MWU3LCAweDAwZjAsCisJMHg3MWIzLCAweDAyN2UsIDB4NjE5OCwgMHhhMThjLCAweDAwZmYsIDB4ODEwNywgMHg2MTMwLCAweGExOGMsCisJMHgwMGZmLCAweGExMGQsIDB4NjA4OCwgMHg2MjhjLCAweDYxOGUsIDB4NjA4YiwgMHhiYzkxLCAweDYwNDMsCisJMHgwMDAxLCAweDYwNDMsIDB4MDAwMCwgMHg2MDhhLCAweDYyOGUsIDB4NjAyNCwgMHhkMDk0LCAweDAwYzAsCisJMHg3MWU2LCAweDZhMDQsIDB4YTI5NCwgMHg0MDAwLCAweDAwYzAsIDB4NzFkZCwgMHgwMjdmLCAweDBkN2YsCisJMHgwMDdmLCAweDE1N2YsIDB4MjAwOSwgMHgwMTdmLCAweDIwMGIsIDB4MDAwMCwgMHgwMDc4LCAweDcyMzAsCisJMHgyMDA5LCAweDAxN2YsIDB4MjAwYiwgMHgwMGExLCAweDE1N2UsIDB4MDA3ZSwgMHgwZDdlLCAweDIwNjksCisJMHgwMTQwLCAweDIwYTksIDB4MDAxZSwgMHgyMDA5LCAweDAxNjksIDB4NjgwNCwgMHhhMDg0LCAweDQwMDAsCisJMHgwMDQwLCAweDcyMjksIDB4NjAyMCwgMHhkMGJjLCAweDAwNDAsIDB4NzIyOSwgMHgyMTA0LCAweGEwODQsCisJMHgwMDBmLCAweGEwODYsIDB4MDAwNCwgMHgwMGMwLCAweDcyMjksIDB4MDBmMCwgMHg3MWZkLCAweDAyN2UsCisJMHg2MTY0LCAweGExOGMsIDB4MDBmZiwgMHg4MTA3LCAweDYxMzAsIDB4YTE4YywgMHgwMGZmLCAweGExMGQsCisJMHg2MDg4LCAweDYyOGMsIDB4NjA4YiwgMHhiYzkxLCAweDYxOGUsIDB4NjA0MywgMHgwMDAxLCAweDYwNDMsCisJMHgwMDAwLCAweDYwOGEsIDB4NjI4ZSwgMHg2YTA0LCAweGEyOTQsIDB4NDAwMCwgMHgwMGMwLCAweDcyMjMsCisJMHgwMjdmLCAweDBkN2YsIDB4MDA3ZiwgMHgxNTdmLCAweDIwMDksIDB4MDE3ZiwgMHgyMDBiLCAweDAwMDAsCisJMHgwYzdmLCAweDEyN2YsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YThiMSwgMHg3MDIwLCAweGEwMDUsCisJMHgwMDQwLCAweDcyM2MsIDB4ODAwMSwgMHg3MDIyLCAweDBlN2YsIDB4MDA3YywgMHgyMGE5LCAweDAwMDgsCisJMHgyMGEyLCAweDAwZjAsIDB4NzI0MCwgMHgyMGEyLCAweDIwYTIsIDB4MDA3YywgMHgwZjdlLCAweDBlN2UsCisJMHgwZDdlLCAweDBjN2UsIDB4MDc3ZSwgMHgwNjdlLCAweDAwN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDcxLCAweGE4YjEsIDB4NzYxNCwgMHgyNjYwLCAweDI2NzgsIDB4MjAzOSwgMHgwMDAxLCAweDg3ZmYsCisJMHgwMDQwLCAweDcyZTIsIDB4OGNmZiwgMHgwMDQwLCAweDcyZTIsIDB4NjAxYywgMHhhMDg2LCAweDAwMDYsCisJMHgwMGMwLCAweDcyZGQsIDB4ODhmZiwgMHgwMDQwLCAweDcyNmQsIDB4MjgwMCwgMHhhYzA2LCAweDAwYzAsCisJMHg3MmRkLCAweDIwMzksIDB4MDAwMCwgMHgwMDc4LCAweDcyNzgsIDB4NjAxOCwgMHhhMjA2LCAweDAwYzAsCisJMHg3MmRkLCAweDg1ZmYsIDB4MDA0MCwgMHg3Mjc4LCAweDYwMjAsIDB4YTEwNiwgMHgwMGMwLCAweDcyZGQsCisJMHg3MDI0LCAweGFjMDYsIDB4MDBjMCwgMHg3MmE4LCAweDIwNjksIDB4MDEwMCwgMHg2OGMwLCAweGEwMDUsCisJMHgwMDQwLCAweDcyYTMsIDB4MTA3OCwgMHg1YWNiLCAweDY4MTcsIDB4MDAwOCwgMHg2OGMzLCAweDAwMDAsCisJMHgxMDc4LCAweDczNzgsIDB4NzAyNywgMHgwMDAwLCAweDAzN2UsIDB4MjA2OSwgMHgwMTQwLCAweDZiMDQsCisJMHhhMzg0LCAweDEwMDAsIDB4MDA0MCwgMHg3Mjk4LCAweDY4MDMsIDB4MDEwMCwgMHg2ODAzLCAweDAwMDAsCisJMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwgMHhkMDg0LCAweDAwNDAsIDB4NzJhMCwgMHg2ODI3LCAweDAwMDEsCisJMHgwMzdmLCAweDAwNzgsIDB4NzJhOCwgMHg2MDAzLCAweDAwMDksIDB4NjMwYSwgMHgwMDc4LCAweDcyZGQsCisJMHg3MDE0LCAweGFjMzYsIDB4MDBjMCwgMHg3MmFlLCAweDY2MGMsIDB4NzYxNiwgMHg3MDEwLCAweGFjMzYsCisJMHgwMGMwLCAweDcyYmMsIDB4MmMwMCwgMHhhZjM2LCAweDAwNDAsIDB4NzJiYSwgMHgyZjAwLCAweDcwMTIsCisJMHgwMDc4LCAweDcyYmMsIDB4NzAxMywgMHgwMDAwLCAweDY2MGMsIDB4MDY3ZSwgMHgyYzAwLCAweGFmMDYsCisJMHgwMDQwLCAweDcyYzUsIDB4N2UwZSwgMHgwMDc4LCAweDcyYzYsIDB4MjY3OCwgMHg4OWZmLCAweDAwYzAsCisJMHg3MmQ1LCAweDYwMGYsIDB4MDAwMCwgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4ZDA2LCAweDAwNDAsCisJMHg3MmQzLCAweDEwNzgsIDB4YTFjYSwgMHgxMDc4LCAweDhlYzYsIDB4MTA3OCwgMHg3MjMzLCAweDg4ZmYsCisJMHgwMGMwLCAweDcyZWMsIDB4MGM3ZiwgMHgwMDc4LCAweDcyNTcsIDB4MmM3OCwgMHg2MDBjLCAweDIwNjAsCisJMHgwMDc4LCAweDcyNTcsIDB4YTAwNiwgMHgxMjdmLCAweDAwN2YsIDB4MDY3ZiwgMHgwNzdmLCAweDBjN2YsCisJMHgwZDdmLCAweDBlN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDYwMTcsIDB4MDAwMCwgMHgwYzdmLCAweGE4YzUsCisJMHgwMDAxLCAweDAwNzgsIDB4NzJlMywgMHgwZjdlLCAweDBlN2UsIDB4MGQ3ZSwgMHgwYzdlLCAweDA2N2UsCisJMHgwMjdlLCAweDAwN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhOGIxLCAweDc2MzgsCisJMHgyNjYwLCAweDI2NzgsIDB4OGNmZiwgMHgwMDQwLCAweDczNjcsIDB4NjAxYywgMHhhMDg2LCAweDAwMDYsCisJMHgwMGMwLCAweDczNjIsIDB4ODdmZiwgMHgwMDQwLCAweDczMTMsIDB4MjcwMCwgMHhhYzA2LCAweDAwYzAsCisJMHg3MzYyLCAweDAwNzgsIDB4NzMxZSwgMHg2MDE4LCAweGEyMDYsIDB4MDBjMCwgMHg3MzYyLCAweDg1ZmYsCisJMHgwMDQwLCAweDczMWUsIDB4NjAyMCwgMHhhMTA2LCAweDAwYzAsIDB4NzM2MiwgMHg3MDNjLCAweGFjMDYsCisJMHgwMGMwLCAweDczMzIsIDB4MDM3ZSwgMHgyMDE5LCAweDAwMDEsIDB4MTA3OCwgMHg3MDU4LCAweDcwMzMsCisJMHgwMDAwLCAweDcwM2YsIDB4MDAwMCwgMHg3MDQzLCAweDAwMDAsIDB4NzA0NywgMHgwMDAwLCAweDcwNGIsCisJMHgwMDAwLCAweDAzN2YsIDB4NzAzOCwgMHhhYzM2LCAweDAwYzAsIDB4NzMzOCwgMHg2NjBjLCAweDc2M2EsCisJMHg3MDM0LCAweGFjMzYsIDB4MDBjMCwgMHg3MzQ2LCAweDJjMDAsIDB4YWYzNiwgMHgwMDQwLCAweDczNDQsCisJMHgyZjAwLCAweDcwMzYsIDB4MDA3OCwgMHg3MzQ2LCAweDcwMzcsIDB4MDAwMCwgMHg2NjBjLCAweDA2N2UsCisJMHgyYzAwLCAweGFmMDYsIDB4MDA0MCwgMHg3MzRmLCAweDdlMGUsIDB4MDA3OCwgMHg3MzUwLCAweDI2NzgsCisJMHg2MDBmLCAweDAwMDAsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDczNWEsCisJMHgxMDc4LCAweGExY2EsIDB4MTA3OCwgMHg4ZWM2LCAweDg3ZmYsIDB4MDBjMCwgMHg3MzcxLCAweDBjN2YsCisJMHgwMDc4LCAweDczMDIsIDB4MmM3OCwgMHg2MDBjLCAweDIwNjAsIDB4MDA3OCwgMHg3MzAyLCAweGEwMDYsCisJMHgxMjdmLCAweDAwN2YsIDB4MDI3ZiwgMHgwNjdmLCAweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDBmN2YsCisJMHgwMDdjLCAweDYwMTcsIDB4MDAwMCwgMHgwYzdmLCAweGE3YmQsIDB4MDAwMSwgMHgwMDc4LCAweDczNjgsCisJMHgwZTdlLCAweDIwNzEsIDB4YThiMSwgMHgyMDAxLCAweGE2MDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDIsCisJMHgwMGMwLCAweDczODYsIDB4NzAwNywgMHgwMDA1LCAweDAwNzgsIDB4NzM4OCwgMHg3MDA3LCAweDAwMDAsCisJMHgwZTdmLCAweDAwN2MsIDB4MGY3ZSwgMHgwZTdlLCAweDBjN2UsIDB4MDY3ZSwgMHgwMjdlLCAweDAwN2UsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGE4YjEsIDB4MmMxMCwgMHg3NjM4LCAweDI2NjAsCisJMHgyNjc4LCAweDhjZmYsIDB4MDA0MCwgMHg3M2M4LCAweDIyMDAsIDB4YWMwNiwgMHgwMGMwLCAweDczYzMsCisJMHg3MDM4LCAweGFjMzYsIDB4MDBjMCwgMHg3M2E2LCAweDY2MGMsIDB4NzYzYSwgMHg3MDM0LCAweGFjMzYsCisJMHgwMGMwLCAweDczYjQsIDB4MmMwMCwgMHhhZjM2LCAweDAwNDAsIDB4NzNiMiwgMHgyZjAwLCAweDcwMzYsCisJMHgwMDc4LCAweDczYjQsIDB4NzAzNywgMHgwMDAwLCAweDY2MGMsIDB4MmMwMCwgMHhhZjA2LCAweDAwNDAsCisJMHg3M2JjLCAweDdlMGUsIDB4MDA3OCwgMHg3M2JkLCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLCAweGEwODUsCisJMHgwMDAxLCAweDAwNzgsIDB4NzNjOCwgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwMDc4LCAweDczOTksCisJMHgxMjdmLCAweDAwN2YsIDB4MDI3ZiwgMHgwNjdmLCAweDBjN2YsIDB4MGU3ZiwgMHgwZjdmLCAweDAwN2MsCisJMHgwZjdlLCAweDBlN2UsIDB4MGQ3ZSwgMHgwYzdlLCAweDA2N2UsIDB4MDA3ZSwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDIwNzEsIDB4YThiMSwgMHg3NjBjLCAweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLCAweDAwNDAsCisJMHg3NDY5LCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4YTIwNiwgMHgwMGMwLCAweDc0NjQsCisJMHg3MDI0LCAweGFjMDYsIDB4MDBjMCwgMHg3NDBmLCAweDIwNjksIDB4MDEwMCwgMHg2OGMwLCAweGEwMDUsCisJMHgwMDQwLCAweDc0M2QsIDB4MTA3OCwgMHg2ZTBmLCAweDY4YzMsIDB4MDAwMCwgMHgxMDc4LCAweDczNzgsCisJMHg3MDI3LCAweDAwMDAsIDB4MDM3ZSwgMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHhhMzg0LCAweDEwMDAsCisJMHgwMDQwLCAweDc0MDYsIDB4NjgwMywgMHgwMTAwLCAweDY4MDMsIDB4MDAwMCwgMHgyMDY5LCAweDAxMDAsCisJMHg2ODI0LCAweGQwODQsIDB4MDA0MCwgMHg3NDBlLCAweDY4MjcsIDB4MDAwMSwgMHgwMzdmLCAweDcwMGMsCisJMHhhYzM2LCAweDAwYzAsIDB4NzQxNSwgMHg2NjBjLCAweDc2MGUsIDB4NzAwOCwgMHhhYzM2LCAweDAwYzAsCisJMHg3NDIzLCAweDJjMDAsIDB4YWYzNiwgMHgwMDQwLCAweDc0MjEsIDB4MmYwMCwgMHg3MDBhLCAweDAwNzgsCisJMHg3NDIzLCAweDcwMGIsIDB4MDAwMCwgMHg2NjBjLCAweDA2N2UsIDB4MmMwMCwgMHhhZjA2LCAweDAwNDAsCisJMHg3NDJjLCAweDdlMGUsIDB4MDA3OCwgMHg3NDJkLCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLCAweDEwNzgsCisJMHg4ZWVjLCAweDAwYzAsIDB4NzQ0MSwgMHgxMDc4LCAweDI4YTYsIDB4MTA3OCwgMHg4ZjAwLCAweDAwYzAsCisJMHg3NDVkLCAweDEwNzgsIDB4N2M4MywgMHgwMDc4LCAweDc0NWQsIDB4MTA3OCwgMHg3Mzc4LCAweDAwNzgsCisJMHg3NDBmLCAweDEwNzgsIDB4OGYwMCwgMHgwMGMwLCAweDc0NDksIDB4MTA3OCwgMHg3YzgzLCAweDAwNzgsCisJMHg3NDVkLCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LCAweDhkMDYsIDB4MDA0MCwgMHg3NDVkLCAweDYwMWMsCisJMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHg3NDcxLCAweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsCisJMHgwMDAwLCAweDEwNzgsIDB4NGE3MywgMHgxMDc4LCAweDhlYjksIDB4MTA3OCwgMHg4ZWM2LCAweDEwNzgsCisJMHg3MjMzLCAweDBjN2YsIDB4MDA3OCwgMHg3M2RlLCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDAwNzgsCisJMHg3M2RlLCAweDEyN2YsIDB4MDA3ZiwgMHgwNjdmLCAweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDBmN2YsCisJMHgwMDdjLCAweDYwMWMsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4NzQ1ZCwgMHgxMDc4LCAweGExY2EsCisJMHgwMDc4LCAweDc0NWQsIDB4MDM3ZSwgMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHgzOTA4LCAweGEwMDYsCisJMHhhMTkwLCAweDAwMjAsIDB4MjIxYywgMHhhMzllLCAweDI2NzYsIDB4MDBjMCwgMHg3NDhiLCAweDgyMTAsCisJMHg4MDAwLCAweDAwNzgsIDB4NzQ4MiwgMHhhMDA1LCAweDAwNDAsIDB4NzQ5NywgMHgyMGE5LCAweDAwMjAsCisJMHgyMTk4LCAweDgyMTEsIDB4YTI4MiwgMHgwMDIwLCAweDIwYzgsIDB4MjBhMCwgMHg1M2EzLCAweDE0N2YsCisJMHgxMzdmLCAweDE1N2YsIDB4MDM3ZiwgMHgwMDdjLCAweDBkN2UsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsCisJMHg2N2MyLCAweDIwYTMsIDB4MDIwMCwgMHgyMGEzLCAweDAwMTQsIDB4NjBjMywgMHgwMDE0LCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMDk5LCAweGE4YTUsIDB4MjBhOSwgMHgwMDA0LCAweDUzYTYsCisJMHgyMGEzLCAweDAwMDQsIDB4MjBhMywgMHg3ODc4LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgxMDc4LCAweDZkZmIsIDB4MGQ3ZiwgMHgwMDdjLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY3YzIsCisJMHgyMGEzLCAweDAyMTQsIDB4MjBhMywgMHgwMDE4LCAweDIwYTMsIDB4MDgwMCwgMHg3ODEwLCAweGEwODQsCisJMHhmZjAwLCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4NzgxMCwgMHhhMDg0LCAweDAwZmYsIDB4MjBhMiwgMHg3ODI4LCAweDIwYTIsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAxOCwgMHgxMDc4LCAweDZkZmIsCisJMHgwMDdjLCAweDBkN2UsIDB4MDE3ZSwgMHgyZjY4LCAweDIwMDksIDB4MDAzNSwgMHgxMDc4LCAweDkxYmMsCisJMHgwMGMwLCAweDc1NTEsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjczMSwgMHgyMGEzLCAweDEzMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4NzgyOCwgMHgyMDY4LCAweDY4MWMsIDB4YTA4NiwgMHgwMDAzLCAweDAwNDAsCisJMHg3NTJkLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMTQsIDB4YTI4NiwgMHgwMDdlLCAweDAwYzAsCisJMHg3NTA3LCAweDIwYTMsIDB4MDBmZiwgMHgyMGEzLCAweGZmZmUsIDB4MDA3OCwgMHg3NTQyLCAweGEyODYsCisJMHgwMDdmLCAweDAwYzAsIDB4NzUxMSwgMHgyMGEzLCAweDAwZmYsIDB4MjBhMywgMHhmZmZkLCAweDAwNzgsCisJMHg3NTQyLCAweGQyYmMsIDB4MDA0MCwgMHg3NTI3LCAweGEyODYsIDB4MDA4MCwgMHgwMGMwLCAweDc1MWUsCisJMHgyMGEzLCAweDAwZmYsIDB4MjBhMywgMHhmZmZjLCAweDAwNzgsIDB4NzU0MiwgMHhhMmU4LCAweGE3MzUsCisJMHgyZDZjLCAweDY4MTAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MDA3OCwgMHg3NTQyLCAweDIwYTMsCisJMHgwMDAwLCAweDYwOTgsIDB4MjBhMiwgMHgwMDc4LCAweDc1NDIsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweGEwODIsIDB4MDA3ZSwgMHgwMDQ4LCAweDc1M2UsIDB4MGQ3ZSwgMHgyMDY5LCAweGE2MWIsCisJMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwZDdmLCAweDAwNzgsIDB4NzU0MiwgMHgyMGEzLCAweDAwMDAsCisJMHg2MDMwLCAweDIwYTIsIDB4NzgzNCwgMHgyMGEyLCAweDc4MzgsIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDBjLCAweDEwNzgsIDB4NmRmYiwgMHgwMTdmLCAweDBkN2YsCisJMHgwMDdjLCAweDc4MTcsIDB4MDAwMSwgMHg3ODAzLCAweDAwMDYsIDB4MDE3ZiwgMHgwZDdmLCAweDAwN2MsCisJMHgwZDdlLCAweDAyN2UsIDB4NzkyOCwgMHgyMTY4LCAweDY5MWMsIDB4YTE4NiwgMHgwMDA2LCAweDAwNDAsCisJMHg3NTdhLCAweGExODYsIDB4MDAwMywgMHgwMDQwLCAweDc1ZDUsIDB4YTE4NiwgMHgwMDA1LCAweDAwNDAsCisJMHg3NWI4LCAweGExODYsIDB4MDAwNCwgMHgwMDQwLCAweDc1YTgsIDB4YTE4NiwgMHgwMDA4LCAweDAwNDAsCisJMHg3NWMyLCAweDc4MDcsIDB4MDAzNywgMHg3ODEzLCAweDE3MDAsIDB4MTA3OCwgMHg3NjQwLCAweDAyN2YsCisJMHgwZDdmLCAweDAwN2MsIDB4MTA3OCwgMHg3NWZkLCAweDIwMDksIDB4NDAwMCwgMHg2ODAwLCAweDAwNzksCisJMHg3NTgxLCAweDc1OTQsIDB4NzVhMiwgMHg3NTk2LCAweDc1YTIsIDB4NzU5ZCwgMHg3NTk0LCAweDc1OTQsCisJMHg3NWEyLCAweDc1YTIsIDB4NzVhMiwgMHg3NWEyLCAweDc1OTQsIDB4NzU5NCwgMHg3NTk0LCAweDc1OTQsCisJMHg3NTk0LCAweDc1YTIsIDB4NzU5NCwgMHg3NWEyLCAweDEwNzgsIDB4MTMzMiwgMHg2ODI0LCAweGQwZTQsCisJMHgwMDQwLCAweDc1OWQsIDB4ZDBjYywgMHgwMDQwLCAweDc1YTAsIDB4YTAwZSwgMHgwMDc4LCAweDc1YTIsCisJMHgyMDA5LCAweDIwMDAsIDB4NjgyOCwgMHgyMGEyLCAweDY4MmMsIDB4MjBhMiwgMHgwMDc4LCAweDc1ZjMsCisJMHgxMDc4LCAweDc1ZmQsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMDA5LCAweDQwMDAsCisJMHg2YTAwLCAweGEyODYsIDB4MDAwMiwgMHgwMGMwLCAweDc1YjYsIDB4YTAwZSwgMHgwMDc4LCAweDc1ZjMsCisJMHgxMDc4LCAweDc1ZmQsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMDA5LCAweDQwMDAsCisJMHgwMDc4LCAweDc1ZjMsIDB4MTA3OCwgMHg3NWZkLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMDA5LCAweDQwMDAsIDB4YTI4NiwgMHgwMDA1LCAweDAwNDAsIDB4NzVkMiwgMHhhMjg2LCAweDAwMDIsCisJMHgwMGMwLCAweDc1ZDMsIDB4YTAwZSwgMHgwMDc4LCAweDc1ZjMsIDB4MTA3OCwgMHg3NWZkLCAweDY4MTAsCisJMHgyMDY4LCAweDY5N2MsIDB4NjgxMCwgMHhhMTEyLCAweDY5ODAsIDB4NjgxNCwgMHhhMTAzLCAweDIwYTIsCisJMHgyMmEyLCAweDc5MjgsIDB4YTE4MCwgMHgwMDAwLCAweDIwMDQsIDB4YTA4ZSwgMHgwMDAyLCAweDAwNDAsCisJMHg3NWYxLCAweGEwOGUsIDB4MDAwNCwgMHgwMDQwLCAweDc1ZjEsIDB4MjAwOSwgMHg0MDAwLCAweDAwNzgsCisJMHg3NWYzLCAweDIwMDksIDB4MDAwMCwgMHgyMWEyLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTgsCisJMHgxMDc4LCAweDZkZmIsIDB4MDI3ZiwgMHgwZDdmLCAweDAwN2MsIDB4MDM3ZSwgMHgwNDdlLCAweDA1N2UsCisJMHgwNjdlLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY3YzIsIDB4YTAwNiwgMHgyMGEzLCAweDAyMDAsCisJMHgyMGEyLCAweDc5MzQsIDB4MjFhMiwgMHg3OTM4LCAweDIxYTIsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweGEwOTIsIDB4MDA3ZSwgMHgwMDQ4LCAweDc2MjMsIDB4MGQ3ZSwgMHgyMDY5LCAweGE2MWIsCisJMHgyZDJjLCAweDhkNjgsIDB4MmQzNCwgMHhhMGU4LCAweGE3MzUsIDB4MmQ2YywgMHg2YjEwLCAweDZjMTQsCisJMHgwZDdmLCAweDAwNzgsIDB4NzYyOSwgMHgyMDE5LCAweDAwMDAsIDB4NjQ5OCwgMHgyMDI5LCAweDAwMDAsCisJMHg2NjMwLCAweDc4MjgsIDB4YTA4MCwgMHgwMDA3LCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsCisJMHg3NjM3LCAweDI1YTIsIDB4MjZhMiwgMHgyM2EyLCAweDI0YTIsIDB4MDA3OCwgMHg3NjNiLCAweDIzYTIsCisJMHgyNGEyLCAweDI1YTIsIDB4MjZhMiwgMHgwNjdmLCAweDA1N2YsIDB4MDQ3ZiwgMHgwMzdmLCAweDAwN2MsCisJMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2N2MyLCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDksIDB4NzgxMCwgMHgyMGEyLCAweDYwYzMsIDB4MDAwOCwgMHgxMDc4LCAweDZkZmIsCisJMHgwMDdjLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY3MjgsIDB4MjBhMywgMHgxNDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDc4MzQsIDB4MjBhMiwgMHg3ODM4LCAweDIwYTIsIDB4NzgyOCwgMHgyMGEyLCAweDc4MmMsCisJMHgyMGEyLCAweDc4MzAsIDB4YTA4NCwgMHgwMGZmLCAweDgwMDcsIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsCisJMHg2MGMzLCAweDAwMTAsIDB4MTA3OCwgMHg2ZGZiLCAweDAwN2MsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsCisJMHg2N2I5LCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsIDB4NzgyOCwgMHgyMGEyLCAweDc4MTAsCisJMHgyMGEyLCAweDYwYzMsIDB4MDAwOCwgMHgxMDc4LCAweDZkZmIsIDB4MDA3YywgMHgxNDdlLCAweDIwYTEsCisJMHgwMjBiLCAweDEwNzgsIDB4NzY4OSwgMHg2MGMzLCAweDAwMDAsIDB4MTA3OCwgMHg2ZGZiLCAweDE0N2YsCisJMHgwMDdjLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweGQwYmMsIDB4MDA0MCwgMHg3NmE2LCAweDBkN2UsIDB4YTBlOCwgMHhhNzM1LCAweDJkNmMsCisJMHg2ODEwLCAweGEwODUsIDB4MDMwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGE2MWIsCisJMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwZDdmLCAweDAwNzgsIDB4NzZhZSwgMHgyMGEzLCAweDAzMDAsCisJMHg2Mjk4LCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLCAweDYyMzAsIDB4MjJhMiwgMHgyMGEzLCAweDA4MTksCisJMHgyMGEzLCAweDAwMDAsIDB4MTA3OCwgMHg2ZGVhLCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLCAweDJmYTIsCisJMHg3YTA4LCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgwMDdjLCAweDIwNjEsCisJMHhhZDAwLCAweDJhNzAsIDB4NzA2NCwgMHg3MDRhLCAweDcwNGYsIDB4YWQwMCwgMHgwMDdjLCAweDBlN2UsCisJMHgxMjdlLCAweDIwNzEsIDB4YTYwMCwgMHgyMDkxLCAweDgwMDAsIDB4NzU0OCwgMHhhNTgyLCAweDAwMTAsCisJMHgwMDQ4LCAweDc2ZjksIDB4NzA0YywgMHgyMDYwLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAwLCAweDAwNDAsCisJMHg3NmU1LCAweGFjZTAsIDB4MDAxMCwgMHg3MDU4LCAweGFjMDIsIDB4MDBjOCwgMHg3NmUxLCAweDAwNzgsCisJMHg3NmQ0LCAweDIwNjEsIDB4YWQwMCwgMHgwMDc4LCAweDc2ZDQsIDB4NjAwMywgMHgwMDA4LCAweDg1MjksCisJMHg3NTRhLCAweGFjYTgsIDB4MDAxMCwgMHg3MDU4LCAweGE1MDIsIDB4MDBjOCwgMHg3NmY1LCAweDc1NGUsCisJMHhhMDg1LCAweDAwMDEsIDB4MTI3ZiwgMHgwZTdmLCAweDAwN2MsIDB4NzA0ZiwgMHhhZDAwLCAweDAwNzgsCisJMHg3NmYwLCAweGEwMDYsIDB4MDA3OCwgMHg3NmYyLCAweDBlN2UsIDB4MjA3MSwgMHhhNjAwLCAweDc1NDgsCisJMHhhNTgyLCAweDAwMTAsIDB4MDA0OCwgMHg3NzJhLCAweDcwNGMsIDB4MjA2MCwgMHg2MDAwLCAweGEwODYsCisJMHgwMDAwLCAweDAwNDAsIDB4NzcxNywgMHhhY2UwLCAweDAwMTAsIDB4NzA1OCwgMHhhYzAyLCAweDAwYzgsCisJMHg3NzEzLCAweDAwNzgsIDB4NzcwNiwgMHgyMDYxLCAweGFkMDAsIDB4MDA3OCwgMHg3NzA2LCAweDYwMDMsCisJMHgwMDA4LCAweDg1MjksIDB4NzU0YSwgMHhhY2E4LCAweDAwMTAsIDB4NzA1OCwgMHhhNTAyLCAweDAwYzgsCisJMHg3NzI2LCAweDc1NGUsIDB4YTA4NSwgMHgwMDAxLCAweDBlN2YsIDB4MDA3YywgMHg3MDRmLCAweGFkMDAsCisJMHgwMDc4LCAweDc3MjIsIDB4YTAwNiwgMHgwMDc4LCAweDc3MjQsIDB4YWM4MiwgMHhhZDAwLCAweDEwNDgsCisJMHgxMzMyLCAweDIwMDEsIDB4YTYxNiwgMHgyMDA0LCAweGFjMDIsIDB4MTBjOCwgMHgxMzMyLCAweGEwMDYsCisJMHg2MDA2LCAweDYwMGEsIDB4NjAwZSwgMHg2MDEyLCAweDYwMTYsIDB4NjAxYSwgMHg2MDFmLCAweDAwMDAsCisJMHg2MDAzLCAweDAwMDAsIDB4NjAyMiwgMHg2MDI2LCAweDYwMmEsIDB4NjAyZSwgMHg2MDMyLCAweDYwMzYsCisJMHg2MDNhLCAweDYwM2UsIDB4MjA2MSwgMHhhNjAwLCAweDYwNDgsIDB4ODAwMCwgMHg2MDRhLCAweGEwODYsCisJMHgwMDAxLCAweDAwNDAsIDB4Nzc1NCwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsCisJMHg2MmQxLCAweDEyN2YsIDB4MDA3OCwgMHg3NzUzLCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLCAweDAwNzksCisJMHg3NzYxLCAweDc3NmEsIDB4Nzc3YiwgMHg3Nzk3LCAweDc3YjMsIDB4OTIwZSwgMHg5MjJhLCAweDkyNDYsCisJMHg3NzZhLCAweDc3N2IsIDB4YTE4NiwgMHgwMDEzLCAweDAwYzAsIDB4Nzc3MywgMHgxMDc4LCAweDYxY2QsCisJMHgxMDc4LCAweDYyZDEsIDB4MDA3YywgMHhhMThlLCAweDAwNDcsIDB4MDBjMCwgMHg3NzdhLCAweGEwMTYsCisJMHgxMDc4LCAweDE1ZmEsIDB4MDA3YywgMHgwNjdlLCAweDYwMDAsIDB4YTBiMiwgMHgwMDEwLCAweDEwYzgsCisJMHgxMzMyLCAweDEwNzksIDB4Nzc4NSwgMHgwNjdmLCAweDAwN2MsIDB4Nzc5NSwgMHg3YjAwLCAweDdjYjIsCisJMHg3Nzk1LCAweDdkMzYsIDB4NzdjZiwgMHg3Nzk1LCAweDc3OTUsIDB4N2E5MiwgMHg4MGY2LCAweDc3OTUsCisJMHg3Nzk1LCAweDc3OTUsIDB4Nzc5NSwgMHg3Nzk1LCAweDc3OTUsIDB4MTA3OCwgMHgxMzMyLCAweDA2N2UsCisJMHg2MDAwLCAweGEwYjIsIDB4MDAxMCwgMHgxMGM4LCAweDEzMzIsIDB4MTA3OSwgMHg3N2ExLCAweDA2N2YsCisJMHgwMDdjLCAweDc3YjEsIDB4ODdjMywgMHg3N2IxLCAweDc3YjEsIDB4NzdiMSwgMHg3N2IxLCAweDc3YjEsCisJMHg3N2IxLCAweDg3NjYsIDB4ODk1MSwgMHg3N2IxLCAweDg3ZjMsIDB4ODg3OSwgMHg4N2YzLCAweDg4NzksCisJMHg3N2IxLCAweDEwNzgsIDB4MTMzMiwgMHgwNjdlLCAweDYwMDAsIDB4YTBiMiwgMHgwMDEwLCAweDEwYzgsCisJMHgxMzMyLCAweDEwNzksIDB4NzdiZCwgMHgwNjdmLCAweDAwN2MsIDB4NzdjZCwgMHg4MTNkLCAweDgyMGUsCisJMHg4MzY4LCAweDg0ZTQsIDB4NzdjZCwgMHg3N2NkLCAweDc3Y2QsIDB4ODExNiwgMHg4NzBlLCAweDg3MTIsCisJMHg3N2NkLCAweDc3Y2QsIDB4NzdjZCwgMHg3N2NkLCAweDg3NDIsIDB4MTA3OCwgMHgxMzMyLCAweGExYjYsCisJMHgwMDE1LCAweDAwYzAsIDB4NzdkNywgMHgxMDc4LCAweDc3MmQsIDB4MDA3OCwgMHg3N2RkLCAweGExYjYsCisJMHgwMDE2LCAweDEwYzAsIDB4MTMzMiwgMHgxMDc4LCAweDc3MmQsIDB4MDA3YywgMHgyMGE5LCAweDAwMGUsCisJMHgyZTk4LCAweDYwMTAsIDB4MjBhMCwgMHg1M2EzLCAweDIwYTksIDB4MDAwNiwgMHgzMzEwLCAweDM0MjAsCisJMHg5Mzk4LCAweDk0YTAsIDB4MzMxOCwgMHgzNDI4LCAweDIyMmUsIDB4MjMyNiwgMHhhMjkwLCAweDAwMDIsCisJMHhhNWE4LCAweDAwMDIsIDB4YTM5OCwgMHgwMDAyLCAweGE0YTAsIDB4MDAwMiwgMHgwMGYwLCAweDc3ZWMsCisJMHgwZTdlLCAweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDc4MDMsIDB4NjAxMCwgMHgyMDcwLCAweDcwMDcsCisJMHgwMDAwLCAweDcwMzcsIDB4MDEwMywgMHgwZTdmLCAweDEwNzgsIDB4NzcyZCwgMHgwMDdjLCAweDBkN2UsCisJMHgwMzdlLCAweDczMzAsIDB4YTM4NiwgMHgwMjAwLCAweDAwYzAsIDB4NzgxNCwgMHg2MDE4LCAweDIwNjgsCisJMHg2ODEzLCAweDAwZmYsIDB4NjgxNywgMHhmZmZkLCAweDYwMTAsIDB4YTAwNSwgMHgwMDQwLCAweDc4MWUsCisJMHgyMDY4LCAweDY4MDcsIDB4MDAwMCwgMHg2ODM3LCAweDAxMDMsIDB4NmIzMiwgMHgxMDc4LCAweDc3MmQsCisJMHgwMzdmLCAweDBkN2YsIDB4MDA3YywgMHgwMTdlLCAweDIwYTksIDB4MDAyYSwgMHhhZTgwLCAweDAwMGMsCisJMHgyMDk4LCAweDYwMTAsIDB4YTA4MCwgMHgwMDAyLCAweDIwYTAsIDB4NTNhMywgMHgyMGE5LCAweDAwMmEsCisJMHg2MDEwLCAweGEwODAsIDB4MDAwMSwgMHgyMDA0LCAweGEwODAsIDB4MDAwMiwgMHgyMGEwLCAweDUzYTMsCisJMHgwZTdlLCAweDYwMTAsIDB4MjAwNCwgMHgyMDcwLCAweDcwMzcsIDB4MDEwMywgMHgwZTdmLCAweDEwNzgsCisJMHg3NzJkLCAweDAxN2YsIDB4MDA3YywgMHgwZTdlLCAweDBkN2UsIDB4NjAzZiwgMHgwMDAwLCAweDJjNjgsCisJMHgwMTdlLCAweDIwMDksIDB4MDAzNSwgMHgxMDc4LCAweDkxYmMsIDB4MDE3ZiwgMHgwMGMwLCAweDc4NWYsCisJMHgwMjdlLCAweDYyMjgsIDB4MjI2OCwgMHgwMjdmLCAweDIwNzEsIDB4YWI4YywgMHg2YjFjLCAweGEzODYsCisJMHgwMDAzLCAweDAwNDAsIDB4Nzg2MywgMHhhMzg2LCAweDAwMDYsIDB4MDA0MCwgMHg3ODY3LCAweDEwNzgsCisJMHg3NzJkLCAweDAwNzgsIDB4Nzg2OSwgMHgxMDc4LCAweDc4NmMsIDB4MDA3OCwgMHg3ODY5LCAweDEwNzgsCisJMHg3OTM4LCAweDBkN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDBmN2UsIDB4NjgxMCwgMHgyMDc4LCAweGExODYsCisJMHgwMDE1LCAweDAwNDAsIDB4NzkxZCwgMHhhMThlLCAweDAwMTYsIDB4MDBjMCwgMHg3OTM2LCAweDcwMGMsCisJMHhhMDhjLCAweGZmMDAsIDB4YTE4NiwgMHgxNzAwLCAweDAwNDAsIDB4Nzg4MiwgMHhhMTg2LCAweDAzMDAsCisJMHgwMGMwLCAweDc4ZjgsIDB4OGZmZiwgMHgwMGMwLCAweDc4OGMsIDB4NjgwMCwgMHhhMDg2LCAweDAwMGYsCisJMHgwMDQwLCAweDc4ZGIsIDB4MDA3OCwgMHg3OTM0LCAweDY4MDgsIDB4YTA4NiwgMHhmZmZmLCAweDAwYzAsCisJMHg3OTIxLCAweDc4NGMsIDB4YTA4NCwgMHgwMDYwLCAweGEwODYsIDB4MDAyMCwgMHgwMGMwLCAweDc4YTIsCisJMHg3OTdjLCAweDc4MTAsIDB4YTEwNiwgMHgwMGMwLCAweDc5MjEsIDB4Nzk4MCwgMHg3ODE0LCAweGExMDYsCisJMHgwMGMwLCAweDc5MjEsIDB4MTA3OCwgMHg4ZWI5LCAweDY4MzAsIDB4Nzg1MiwgMHg3ODRjLCAweGMwZGMsCisJMHhjMGY0LCAweGMwZDQsIDB4Nzg0ZSwgMHgwMjdlLCAweGEwMGUsIDB4NmExNCwgMHgyMDAxLCAweDAwMGEsCisJMHgxMDc4LCAweDVjMWMsIDB4Nzg1NCwgMHhhMjBhLCAweDAwNDgsIDB4NzhiNywgMHg4MDExLCAweDdhNTYsCisJMHg4MmZmLCAweDAyN2YsIDB4MDBjMCwgMHg3OGMzLCAweDBjN2UsIDB4MmQ2MCwgMHgxMDc4LCAweDhhZTAsCisJMHgwYzdmLCAweDAwNzgsIDB4NzkzNCwgMHgwYzdlLCAweDBkN2UsIDB4MmY2OCwgMHg2ODM4LCAweGQwZmMsCisJMHgwMGMwLCAweDc4Y2UsIDB4MTA3OCwgMHg0MzUzLCAweDAwNzgsIDB4NzhkMCwgMHgxMDc4LCAweDQ0MzEsCisJMHgwZDdmLCAweDBjN2YsIDB4MDBjMCwgMHg3OTIxLCAweDBjN2UsIDB4MmQ2MCwgMHgxMDc4LCAweDc3MmQsCisJMHgwYzdmLCAweDAwNzgsIDB4NzkzNCwgMHgwYzdlLCAweDEwNzgsIDB4OTE4NywgMHgwMDQwLCAweDc4ZjEsCisJMHg2MDEzLCAweDAwMDAsIDB4NjgxOCwgMHg2MDFhLCAweDYwMWYsIDB4MDAwMywgMHg2OTA0LCAweDBjN2UsCisJMHgyZDYwLCAweDEwNzgsIDB4NzcyZCwgMHgwYzdmLCAweDEwNzgsIDB4Nzc1YywgMHgwYzdmLCAweDAwNzgsCisJMHg3OTM0LCAweDIwMDEsIDB4YThhNCwgMHgyMDA0LCAweDY4M2UsIDB4MGM3ZiwgMHgwMDc4LCAweDc5MzQsCisJMHg3MDA4LCAweGEwODYsIDB4MDAwYiwgMHgwMGMwLCAweDc5MTIsIDB4NjAxOCwgMHgyMDBjLCAweGMxYmMsCisJMHgyMTAyLCAweDBjN2UsIDB4MmQ2MCwgMHg3ODUzLCAweDAwMDMsIDB4NjAwNywgMHgwMDg1LCAweDYwMDMsCisJMHgwMDBiLCAweDYwMWYsIDB4MDAwMiwgMHgxMDc4LCAweDVkOGEsIDB4MTA3OCwgMHg2MmQxLCAweDBjN2YsCisJMHgwMDc4LCAweDc5MzQsIDB4NzAwYywgMHhhMDg2LCAweDJhMDAsIDB4MDBjMCwgMHg3OTIxLCAweDIwMDEsCisJMHhhOGE0LCAweDIwMDQsIDB4NjgzZSwgMHgwMDc4LCAweDc5MzQsIDB4MTA3OCwgMHg3OTUzLCAweDAwNzgsCisJMHg3OTM2LCAweDhmZmYsIDB4MTA0MCwgMHgxMzMyLCAweDBjN2UsIDB4MGQ3ZSwgMHgyZDYwLCAweDJmNjgsCisJMHg2ODM3LCAweDAxMDMsIDB4Njg0YiwgMHgwMDAzLCAweDEwNzgsIDB4ODljZiwgMHgxMDc4LCAweDhlYjksCisJMHgxMDc4LCAweDhlYzYsIDB4MGQ3ZiwgMHgwYzdmLCAweDEwNzgsIDB4NzcyZCwgMHgwZjdmLCAweDAwN2MsCisJMHhhMTg2LCAweDAwMTUsIDB4MDBjMCwgMHg3OTQyLCAweDIwMDEsIDB4YThhNCwgMHgyMDA0LCAweDY4M2UsCisJMHgwMDc4LCAweDc5NTAsIDB4YTE4ZSwgMHgwMDE2LCAweDAwYzAsIDB4Nzk1MiwgMHgwYzdlLCAweDJkMDAsCisJMHgyMDYwLCAweDEwNzgsIDB4YTQ5NSwgMHgxMDc4LCAweDViYzEsIDB4MTA3OCwgMHg3NzJkLCAweDBjN2YsCisJMHgxMDc4LCAweDc3MmQsIDB4MDA3YywgMHgwMjdlLCAweDAzN2UsIDB4MDQ3ZSwgMHg3MjI4LCAweDdjODAsCisJMHg3YjdjLCAweGQyZjQsIDB4MDA0MCwgMHg3OTYyLCAweDIwMDEsIDB4YThhNCwgMHgyMDA0LCAweDY4M2UsCisJMHgwMDc4LCAweDc5YzYsIDB4MGM3ZSwgMHgyZDYwLCAweDEwNzgsIDB4ODlmMywgMHgwYzdmLCAweDY4MDQsCisJMHhhMDg2LCAweDAwNTAsIDB4MDBjMCwgMHg3OTdhLCAweDBjN2UsIDB4MmQwMCwgMHgyMDYwLCAweDYwMDMsCisJMHgwMDAxLCAweDYwMDcsIDB4MDA1MCwgMHgxMDc4LCAweDVkOGEsIDB4MTA3OCwgMHg2MmQxLCAweDBjN2YsCisJMHgwMDc4LCAweDc5YzYsIDB4NjgwMCwgMHhhMDg2LCAweDAwMGYsIDB4MDA0MCwgMHg3OTljLCAweDhmZmYsCisJMHgxMDQwLCAweDEzMzIsIDB4NjgyNCwgMHhkMGRjLCAweDAwYzAsIDB4Nzk5YywgMHg2ODAwLCAweGEwODYsCisJMHgwMDA0LCAweDAwYzAsIDB4NzlhMSwgMHg3ODRjLCAweGQwYWMsIDB4MDA0MCwgMHg3OWExLCAweDc4NGMsCisJMHhjMGRjLCAweGMwZjQsIDB4Nzg0ZSwgMHg3ODUwLCAweGMwZjQsIDB4YzBmYywgMHg3ODUyLCAweDIwMDEsCisJMHgwMDAxLCAweDY4MmUsIDB4MDA3OCwgMHg3OWMwLCAweDIwMDEsIDB4MDAwNywgMHg2ODJlLCAweDAwNzgsCisJMHg3OWMwLCAweDc4NGMsIDB4ZDBiNCwgMHgwMGMwLCAweDc5YWUsIDB4ZDBhYywgMHgwMDQwLCAweDc5OWMsCisJMHg3ODRjLCAweGQwZjQsIDB4MDBjMCwgMHg3OTljLCAweDAwNzgsIDB4Nzk4ZiwgMHhkMmVjLCAweDAwYzAsCisJMHg3OTljLCAweDcwMjQsIDB4YTMwNiwgMHgwMGMwLCAweDc5YjksIDB4NzAyMCwgMHhhNDA2LCAweDAwNDAsCisJMHg3OTljLCAweDcwMjAsIDB4NjgzNiwgMHg3MDI0LCAweDY4M2EsIDB4MjAwMSwgMHgwMDA1LCAweDY4MmUsCisJMHgxMDc4LCAweDhmZjAsIDB4MTA3OCwgMHg2MmQxLCAweDAwNzgsIDB4NzljOCwgMHgxMDc4LCAweDc3MmQsCisJMHgwNDdmLCAweDAzN2YsIDB4MDI3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MGQ3ZSwgMHgwMjdlLCAweDYwMzQsCisJMHgyMDY4LCAweDZhMWMsIDB4YTI4NiwgMHgwMDA3LCAweDAwNDAsIDB4N2EzNSwgMHhhMjg2LCAweDAwMDIsCisJMHgwMDQwLCAweDdhMzUsIDB4YTI4NiwgMHgwMDAwLCAweDAwNDAsIDB4N2EzNSwgMHg2ODA4LCAweDYzMzgsCisJMHhhMzA2LCAweDAwYzAsIDB4N2EzNSwgMHgyMDcxLCAweGFiOGMsIDB4YTE4NiwgMHgwMDE1LCAweDAwNDAsCisJMHg3YTJmLCAweGExOGUsIDB4MDAxNiwgMHgwMGMwLCAweDdhMDIsIDB4NjAzMCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHg3YTAyLCAweDcwMGMsIDB4YTA4NiwgMHgyYTAwLCAweDAwYzAsCisJMHg3YTAyLCAweDYwMzQsIDB4YTA4MCwgMHgwMDA5LCAweDIwMGMsIDB4YzFkZCwgMHhjMWY1LCAweDIxMDIsCisJMHgwMDc4LCAweDdhMmYsIDB4MGM3ZSwgMHg2MDM0LCAweDIwNjAsIDB4NjEwNCwgMHhhMTg2LCAweDAwNGIsCisJMHgwMDQwLCAweDdhMjIsIDB4YTE4NiwgMHgwMDRjLCAweDAwNDAsIDB4N2EyMiwgMHhhMTg2LCAweDAwNGQsCisJMHgwMDQwLCAweDdhMjIsIDB4YTE4NiwgMHgwMDRlLCAweDAwNDAsIDB4N2EyMiwgMHhhMTg2LCAweDAwNTIsCisJMHgwMDQwLCAweDdhMjIsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsIDB4OGQwNiwgMHgxMDQwLCAweDEzMzIsCisJMHg2ODUzLCAweDAwMDMsIDB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDFmLCAweDAwMDIsCisJMHgxMDc4LCAweDVkOGEsIDB4MTA3OCwgMHg2MmQxLCAweDBjN2YsIDB4MDA3OCwgMHg3YTM1LCAweDYwMzQsCisJMHgyMDY4LCAweDIwMDEsIDB4YThhNCwgMHgyMDA0LCAweDY4M2UsIDB4MTA3OCwgMHg3NzJkLCAweDAyN2YsCisJMHgwZDdmLCAweDBlN2YsIDB4MDA3YywgMHgwZDdlLCAweDIwYTksIDB4MDAwZSwgMHgyZTk4LCAweDYwMTAsCisJMHgyMGEwLCAweDUzYTMsIDB4YTFiNiwgMHgwMDE1LCAweDAwYzAsIDB4N2E3MywgMHg2MDE4LCAweDIwNjgsCisJMHgxNTdlLCAweDAzN2UsIDB4MDI3ZSwgMHhhZTkwLCAweDAwMGMsIDB4YTI5MCwgMHgwMDA0LCAweDIwYTksCisJMHgwMDA0LCAweGFkOTgsIDB4MDAwYSwgMHgxMDc4LCAweDgwZGUsIDB4MDI3ZiwgMHgwMzdmLCAweDE1N2YsCisJMHgwMGMwLCAweDdhNzYsIDB4MTU3ZSwgMHgwMzdlLCAweDAyN2UsIDB4YWU5MCwgMHgwMDBjLCAweGEyOTAsCisJMHgwMDA4LCAweDIwYTksIDB4MDAwNCwgMHhhZDk4LCAweDAwMDYsIDB4MTA3OCwgMHg4MGRlLCAweDAyN2YsCisJMHgwMzdmLCAweDE1N2YsIDB4MDBjMCwgMHg3YTc2LCAweDcwMzgsIDB4NjgwYSwgMHg3MDNjLCAweDY4MGUsCisJMHg2ODAwLCAweGMwOGQsIDB4NjgwMiwgMHgwZDdmLCAweDAwNzgsIDB4NzdmOCwgMHgxMDc4LCAweDI4ODAsCisJMHgwYzdlLCAweDEwNzgsIDB4NzZjNywgMHgyZjAwLCAweDYwMWEsIDB4NjAxMywgMHgwMDAwLCAweDYwMWYsCisJMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4MjAwMSwgMHgwMDA3LCAweDEwNzgsCisJMHg0NTAyLCAweDEwNzgsIDB4NDUzNSwgMHgxMDc4LCAweDVkZDcsIDB4MTA3OCwgMHg2MmQxLCAweDBjN2YsCisJMHgwMDc4LCAweDdhNzMsIDB4MjEwMCwgMHhhMWIyLCAweDAwNDQsIDB4MTBjOCwgMHgxMzMyLCAweGExYjIsCisJMHgwMDQwLCAweDAwYzgsIDB4N2FmNywgMHgwMDc5LCAweDdhOWQsIDB4N2FlYiwgMHg3YWRmLCAweDdhZWIsCisJMHg3YWViLCAweDdhZWIsIDB4N2FlYiwgMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsCisJMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsCisJMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsCisJMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZWIsIDB4N2FkZCwgMHg3YWViLCAweDdhZWIsCisJMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsIDB4N2FlYiwgMHg3YWRkLCAweDdhZGQsCisJMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZWIsCisJMHg3YWViLCAweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsCisJMHg3YWRkLCAweDdhZGQsIDB4N2FlYiwgMHg3YWRkLCAweDdhZGQsIDB4MTA3OCwgMHgxMzMyLCAweDYwMDMsCisJMHgwMDAxLCAweDYxMDYsIDB4MTA3OCwgMHg1ZGQ3LCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsCisJMHg2MmQxLCAweDEyN2YsIDB4MDA3YywgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgxMDc4LCAweDVkZDcsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDYyZDEsIDB4MTI3ZiwgMHgwMDdjLCAweDI2MDAsCisJMHgwMDc5LCAweDdhZmEsIDB4N2FmZSwgMHg3YWZlLCAweDdhZmUsIDB4N2FlYiwgMHgxMDc4LCAweDEzMzIsCisJMHg2MDA0LCAweGEwYjIsIDB4MDA0NCwgMHgxMGM4LCAweDEzMzIsIDB4YTFiNiwgMHgwMDEzLCAweDAwYzAsCisJMHg3YjEwLCAweGEwYjIsIDB4MDA0MCwgMHgwMGM4LCAweDdjNzksIDB4MjAwOCwgMHgwMDc5LCAweDdiYmYsCisJMHhhMWI2LCAweDAwMjcsIDB4MDBjMCwgMHg3YjdjLCAweDEwNzgsIDB4NjFjZCwgMHg2MDA0LCAweDEwNzgsCisJMHg4ZWVjLCAweDAwNDAsIDB4N2IyZCwgMHgxMDc4LCAweDhmMDAsIDB4MDA0MCwgMHg3Yjc0LCAweGEwOGUsCisJMHgwMDIxLCAweDAwNDAsIDB4N2I3OCwgMHhhMDhlLCAweDAwMjIsIDB4MDA0MCwgMHg3Yjc0LCAweGEwOGUsCisJMHgwMDNkLCAweDAwNDAsIDB4N2I3OCwgMHgwMDc4LCAweDdiNmYsIDB4MTA3OCwgMHgyOGE2LCAweDIwMDEsCisJMHgwMDA3LCAweDEwNzgsIDB4NDUwMiwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDBjLCAweDEwNzgsCisJMHg3YzgzLCAweGExODYsIDB4MDA3ZSwgMHgwMGMwLCAweDdiNDIsIDB4MjAwMSwgMHhhNjMzLCAweDIwMTQsCisJMHhjMjg1LCAweDIyMDIsIDB4MDE3ZSwgMHgwMjdlLCAweDAzN2UsIDB4MjExMCwgMHgwMjdlLCAweDIwMTksCisJMHgwMDI4LCAweDEwNzgsIDB4NzNkMCwgMHgwMjdmLCAweDEwNzgsIDB4YTRmMSwgMHgwMzdmLCAweDAyN2YsCisJMHgwMTdmLCAweDAxN2UsIDB4MDI3ZSwgMHgwMzdlLCAweDIxMTAsIDB4MjAxOSwgMHgwMDI4LCAweDEwNzgsCisJMHg1ZjAxLCAweDA3N2UsIDB4MjAzOSwgMHgwMDAwLCAweDEwNzgsIDB4NWUwYSwgMHgwYzdlLCAweDYwMTgsCisJMHhhMDY1LCAweDAwNDAsIDB4N2I2NSwgMHgxMDc4LCAweDQ3ZTksIDB4MGM3ZiwgMHgyYzA4LCAweDEwNzgsCisJMHg5ZjhiLCAweDA3N2YsIDB4MDM3ZiwgMHgwMjdmLCAweDAxN2YsIDB4MTA3OCwgMHg0NTdmLCAweDEwNzgsCisJMHg3NzJkLCAweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweDEwNzgsIDB4N2M4MywgMHgwMDc4LCAweDdiNmYsCisJMHgxMDc4LCAweDdjYTYsIDB4MDA3OCwgMHg3YjZmLCAweGExODYsIDB4MDAxNCwgMHgwMGMwLCAweDdiNzMsCisJMHgxMDc4LCAweDYxY2QsIDB4MTA3OCwgMHgyODgwLCAweDEwNzgsIDB4OGVlYywgMHgwMGMwLCAweDdiOWIsCisJMHgxMDc4LCAweDI4YTYsIDB4NjAxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwYywgMHgxMDc4LCAweDdjODMsCisJMHhhMTg2LCAweDAwN2UsIDB4MDBjMCwgMHg3Yjk5LCAweDIwMDEsIDB4YTYzMywgMHgyMDBjLCAweGMxODUsCisJMHgyMTAyLCAweDAwNzgsIDB4N2I2ZiwgMHgxMDc4LCAweDhmMDAsIDB4MDBjMCwgMHg3YmEzLCAweDEwNzgsCisJMHg3YzgzLCAweDAwNzgsIDB4N2I2ZiwgMHg2MDA0LCAweGEwOGUsIDB4MDAzMiwgMHgwMGMwLCAweDdiYjQsCisJMHgwZTdlLCAweDBmN2UsIDB4MjA3MSwgMHhhNjgyLCAweDIwNzksIDB4MDAwMCwgMHgxMDc4LCAweDJiZDcsCisJMHgwZjdmLCAweDBlN2YsIDB4MDA3OCwgMHg3YjZmLCAweDYwMDQsIDB4YTA4ZSwgMHgwMDIxLCAweDAwNDAsCisJMHg3YjlmLCAweGEwOGUsIDB4MDAyMiwgMHgxMDQwLCAweDdjODMsIDB4MDA3OCwgMHg3YjZmLCAweDdjMDEsCisJMHg3YzAzLCAweDdjMDcsIDB4N2MwYiwgMHg3YzBmLCAweDdjMTMsIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsCisJMHg3YmZmLCAweDdiZmYsIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsCisJMHg3YmZmLCAweDdiZmYsIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsCisJMHg3YmZmLCAweDdiZmYsIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsIDB4N2MxNywgMHg3YzI5LCAweDdiZmYsCisJMHg3YzJiLCAweDdjMjksIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsIDB4N2JmZiwgMHg3YmZmLCAweDdjMjksCisJMHg3YzI5LCAweDdiZmYsIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsCisJMHg3YmZmLCAweDdjNWMsIDB4N2MyOSwgMHg3YmZmLCAweDdjMjMsIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsCisJMHg3YzI1LCAweDdiZmYsIDB4N2JmZiwgMHg3YmZmLCAweDdjMjksIDB4N2JmZiwgMHg3YmZmLCAweDEwNzgsCisJMHgxMzMyLCAweDAwNzgsIDB4N2MyOSwgMHgyMDAxLCAweDAwMGIsIDB4MDA3OCwgMHg3YzM2LCAweDIwMDEsCisJMHgwMDAzLCAweDAwNzgsIDB4N2MzNiwgMHgyMDAxLCAweDAwMDUsIDB4MDA3OCwgMHg3YzM2LCAweDIwMDEsCisJMHgwMDAxLCAweDAwNzgsIDB4N2MzNiwgMHgyMDAxLCAweDAwMDksIDB4MDA3OCwgMHg3YzM2LCAweDEwNzgsCisJMHg2MWNkLCAweDYwMDMsIDB4MDAwNSwgMHgyMDAxLCAweGE4YTQsIDB4MjAwNCwgMHg2MDNlLCAweDEwNzgsCisJMHg2MmQxLCAweDAwNzgsIDB4N2MzNSwgMHgwMDc4LCAweDdjMjksIDB4MDA3OCwgMHg3YzI5LCAweDEwNzgsCisJMHg0NTAyLCAweDAwNzgsIDB4N2M2ZSwgMHgxMDc4LCAweDYxY2QsIDB4NjAwMywgMHgwMDA0LCAweDIwMDEsCisJMHhhOGEyLCAweDIwMDQsIDB4NjAxNiwgMHgxMDc4LCAweDYyZDEsIDB4MDA3YywgMHgxMDc4LCAweDQ1MDIsCisJMHgxMDc4LCAweDYxY2QsIDB4MjAwMSwgMHhhOGE0LCAweDIwMDQsIDB4NjAzZSwgMHg2MDAzLCAweDAwMDIsCisJMHgwMzdlLCAweDIwMTksIDB4YTY1ZCwgMHgyMzA0LCAweGEwODQsIDB4ZmYwMCwgMHgwMGMwLCAweDdjNGQsCisJMHgyMDE5LCAweGE4YTIsIDB4MjMxYywgMHgwMDc4LCAweDdjNTYsIDB4ODAwNywgMHhhMDlhLCAweDAwMDQsCisJMHgwMDQ4LCAweDdjNDgsIDB4ODAwMywgMHg4MDFiLCAweDgzMWIsIDB4YTMxOCwgMHg2MzE2LCAweDAzN2YsCisJMHgxMDc4LCAweDYyZDEsIDB4MDA3OCwgMHg3YzM1LCAweDBlN2UsIDB4MGY3ZSwgMHgyMDcxLCAweGE2ODIsCisJMHgyMDc5LCAweDAwMDAsIDB4MTA3OCwgMHgyYmQ3LCAweDBmN2YsIDB4MGU3ZiwgMHgxMDc4LCAweDYxY2QsCisJMHgxMDc4LCAweDc3MmQsIDB4MTA3OCwgMHg2MmQxLCAweDAwNzgsIDB4N2MzNSwgMHgxMDc4LCAweDYxY2QsCisJMHg2MDAzLCAweDAwMDIsIDB4MjAwMSwgMHhhOGEyLCAweDIwMDQsIDB4NjAxNiwgMHgxMDc4LCAweDYyZDEsCisJMHgwMDdjLCAweDI2MDAsIDB4MjAwOCwgMHgwMDc5LCAweDdjN2QsIDB4N2M4MSwgMHg3YzgxLCAweDdjODEsCisJMHg3YzZlLCAweDEwNzgsIDB4MTMzMiwgMHgwZTdlLCAweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDdjOWYsCisJMHg2MDEwLCAweDIwNzAsIDB4NzAzOCwgMHhkMGZjLCAweDAwNDAsIDB4N2M5ZiwgMHg3MDA3LCAweDAwMDAsCisJMHgwMTdlLCAweDYwMDQsIDB4YTA4ZSwgMHgwMDIxLCAweDAwNDAsIDB4N2NhMSwgMHhhMDhlLCAweDAwM2QsCisJMHgwMDQwLCAweDdjYTEsIDB4MDE3ZiwgMHg3MDM3LCAweDAxMDMsIDB4NzAzMywgMHgwMTAwLCAweDBlN2YsCisJMHgwMDdjLCAweDAxN2YsIDB4MTA3OCwgMHg3Y2E2LCAweDAwNzgsIDB4N2M5ZiwgMHgwZTdlLCAweGFjZjAsCisJMHgwMDA0LCAweDJlNzQsIDB4NzAwMCwgMHgyMDcwLCAweDcwMzcsIDB4MDEwMywgMHg3MDIzLCAweDgwMDEsCisJMHgwZTdmLCAweDAwN2MsIDB4MGQ3ZSwgMHg2NjE4LCAweDI2NjgsIDB4NjgwNCwgMHhhMDg0LCAweDAwZmYsCisJMHgwZDdmLCAweGEwYjIsIDB4MDAwYywgMHgxMGM4LCAweDEzMzIsIDB4NjYwNCwgMHhhNmI2LCAweDAwNDMsCisJMHgwMGMwLCAweDdjYzYsIDB4MTA3OCwgMHg5MTM0LCAweDAwNzgsIDB4N2QyNSwgMHg2NjA0LCAweGE2YjYsCisJMHgwMDMzLCAweDAwYzAsIDB4N2NjZiwgMHgxMDc4LCAweDkwZDgsIDB4MDA3OCwgMHg3ZDI1LCAweDY2MDQsCisJMHhhNmI2LCAweDAwMjgsIDB4MDBjMCwgMHg3Y2Q4LCAweDEwNzgsIDB4OGYyZiwgMHgwMDc4LCAweDdkMjUsCisJMHg2NjA0LCAweGE2YjYsIDB4MDAyOSwgMHgwMGMwLCAweDdjZTEsIDB4MTA3OCwgMHg4ZjQ5LCAweDAwNzgsCisJMHg3ZDI1LCAweDY2MDQsIDB4YTZiNiwgMHgwMDFmLCAweDAwYzAsIDB4N2NlYSwgMHgxMDc4LCAweDc3ZGUsCisJMHgwMDc4LCAweDdkMjUsIDB4NjYwNCwgMHhhNmI2LCAweDAwMDAsIDB4MDBjMCwgMHg3Y2YzLCAweDEwNzgsCisJMHg3YTNiLCAweDAwNzgsIDB4N2QyNSwgMHg2NjA0LCAweGE2YjYsIDB4MDAyMiwgMHgwMGMwLCAweDdjZmMsCisJMHgxMDc4LCAweDc4MDcsIDB4MDA3OCwgMHg3ZDI1LCAweDY2MDQsIDB4YTZiNiwgMHgwMDM1LCAweDAwYzAsCisJMHg3ZDA1LCAweDEwNzgsIDB4Nzg0MywgMHgwMDc4LCAweDdkMjUsIDB4NjYwNCwgMHhhNmI2LCAweDAwMzksCisJMHgwMGMwLCAweDdkMGUsIDB4MTA3OCwgMHg3OWNjLCAweDAwNzgsIDB4N2QyNSwgMHg2NjA0LCAweGE2YjYsCisJMHgwMDNkLCAweDAwYzAsIDB4N2QxNywgMHgxMDc4LCAweDc4MjMsIDB4MDA3OCwgMHg3ZDI1LCAweGExYjYsCisJMHgwMDE1LCAweDAwYzAsIDB4N2QxZiwgMHgxMDc5LCAweDdkMmEsIDB4MDA3OCwgMHg3ZDI1LCAweGExYjYsCisJMHgwMDE2LCAweDAwYzAsIDB4N2QyNiwgMHgxMDc5LCAweDdlN2YsIDB4MDA3YywgMHgxMDc4LCAweDc3NzMsCisJMHgwMDc4LCAweDdkMjUsIDB4N2Q0ZSwgMHg3ZDUxLCAweDdkNGUsIDB4N2Q5YywgMHg3ZDRlLCAweDdlMTMsCisJMHg3ZThiLCAweDdkNGUsIDB4N2Q0ZSwgMHg3ZTU3LCAweDdkNGUsIDB4N2U2ZCwgMHhhMWI2LCAweDAwNDgsCisJMHgwMDQwLCAweDdkNDIsIDB4MjBlMSwgMHgwMDA1LCAweDNkMTgsIDB4M2UyMCwgMHgyYzEwLCAweDEwNzgsCisJMHgxNWZhLCAweDAwN2MsIDB4MGU3ZSwgMHhhY2YwLCAweDAwMDQsIDB4MmU3NCwgMHg3MDAwLCAweDIwNzAsCisJMHg3MDM3LCAweDAxMDMsIDB4MGU3ZiwgMHgxMDc4LCAweDc3MmQsIDB4MDA3YywgMHgwMDA1LCAweDAwMDUsCisJMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhNjAwLCAweDcwODAsIDB4YTA4NiwgMHgwMDc0LCAweDAwYzAsCisJMHg3ZDg1LCAweDEwNzgsIDB4OWY1ZiwgMHgwMGMwLCAweDdkNzcsIDB4MGQ3ZSwgMHg2MDE4LCAweDIwNjgsCisJMHg3MDMwLCAweGQwOGMsIDB4MDA0MCwgMHg3ZDZhLCAweDY4MDAsIDB4ZDBiYywgMHgwMDQwLCAweDdkNmEsCisJMHhjMGM1LCAweDY4MDIsIDB4MTA3OCwgMHg3ZDg5LCAweDBkN2YsIDB4MjAwMSwgMHgwMDA2LCAweDEwNzgsCisJMHg0NTAyLCAweDEwNzgsIDB4MjhhNiwgMHgxMDc4LCAweDc3MmQsIDB4MDA3OCwgMHg3ZDg3LCAweDIwMDEsCisJMHgwMDBhLCAweDEwNzgsIDB4NDUwMiwgMHgxMDc4LCAweDI4YTYsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDAxLCAweDEwNzgsIDB4NWRkNywgMHgwMDc4LCAweDdkODcsIDB4MTA3OCwgMHg3ZGZmLCAweDBlN2YsCisJMHgwMDdjLCAweDY4MDAsIDB4ZDA4NCwgMHgwMDQwLCAweDdkOWIsIDB4MjAwMSwgMHgwMDAwLCAweDEwNzgsCisJMHg0NGVlLCAweDIwNjksIDB4YTY1MiwgMHg2ODA0LCAweGQwYTQsIDB4MDA0MCwgMHg3ZDliLCAweDIwMDEsCisJMHgwMDA2LCAweDEwNzgsIDB4NDUzNSwgMHgwMDdjLCAweDBkN2UsIDB4MjAxMSwgMHhhNjIwLCAweDIyMDQsCisJMHhhMDg2LCAweDAwNzQsIDB4MDBjMCwgMHg3ZGZiLCAweDYwMTgsIDB4MjA2OCwgMHg2YWEwLCAweGEyODYsCisJMHgwMDdlLCAweDAwYzAsIDB4N2RhZiwgMHgxMDc4LCAweDdmOWIsIDB4MDA3OCwgMHg3ZGZkLCAweDEwNzgsCisJMHg3ZjkxLCAweDYwMTgsIDB4MjA2OCwgMHhhMDgwLCAweDAwMjgsIDB4MjAxNCwgMHhhMjg2LCAweDAwODAsCisJMHgwMGMwLCAweDdkZDMsIDB4NjgxMywgMHgwMGZmLCAweDY4MTcsIDB4ZmZmYywgMHg2MDEwLCAweGEwMDUsCisJMHgwMDQwLCAweDdkYzksIDB4MjA2OCwgMHg2ODA3LCAweDAwMDAsIDB4NjgzNywgMHgwMTAzLCAweDY4MzMsCisJMHgwMjAwLCAweDIwMDEsIDB4MDAwNiwgMHgxMDc4LCAweDQ1MDIsIDB4MTA3OCwgMHgyOGE2LCAweDEwNzgsCisJMHg3NzJkLCAweDAwNzgsIDB4N2RmZCwgMHgwZTdlLCAweDIwNzEsIDB4YTYzMywgMHgyZTA0LCAweGQwOWMsCisJMHgwMDQwLCAweDdkZWUsIDB4MjA3MSwgMHhhYjgwLCAweDcxMDgsIDB4NzIwYywgMHhhMThjLCAweDAwZmYsCisJMHgwMGMwLCAweDdkZTYsIDB4YTI4NCwgMHhmZjAwLCAweDAwNDAsIDB4N2RlZSwgMHg2MDE4LCAweDIwNzAsCisJMHg3MGEwLCAweGQwYmMsIDB4MDBjMCwgMHg3ZGVlLCAweDcxMTIsIDB4NzIxNiwgMHgwZTdmLCAweDIwMDEsCisJMHgwMDA0LCAweDEwNzgsIDB4NDUwMiwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAzLCAweDEwNzgsCisJMHg1ZGQ3LCAweDAwNzgsIDB4N2RmZCwgMHgxMDc4LCAweDdkZmYsIDB4MGQ3ZiwgMHgwMDdjLCAweDIwMDEsCisJMHgwMDA3LCAweDEwNzgsIDB4NDUwMiwgMHgyMDAxLCAweGE2MDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsCisJMHgwMGMwLCAweDdlMGUsIDB4MjAwMSwgMHgwMDA3LCAweDEwNzgsIDB4NDUzNSwgMHgxMDc4LCAweDI4YTYsCisJMHgxMDc4LCAweDc3MmQsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YTYwMCwgMHg3MDgwLCAweGEwODYsCisJMHgwMDE0LCAweDAwYzAsIDB4N2U1MSwgMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweDdlMjYsCisJMHg2MDEwLCAweGEwMDUsIDB4MDBjMCwgMHg3ZTI2LCAweDEwNzgsIDB4MzY5OSwgMHgwZDdlLCAweDYwMTgsCisJMHgyMDY4LCAweDEwNzgsIDB4NDY0OSwgMHgxMDc4LCAweDdkODksIDB4MGQ3ZiwgMHgxMDc4LCAweDgwNDMsCisJMHgwMGMwLCAweDdlNTEsIDB4MGQ3ZSwgMHg2MDE4LCAweDIwNjgsIDB4Njg5MCwgMHgwZDdmLCAweGEwMDUsCisJMHgwMDQwLCAweDdlNTEsIDB4MjAwMSwgMHgwMDA2LCAweDEwNzgsIDB4NDUwMiwgMHgwZTdlLCAweDYwMTAsCisJMHhhMDA1LCAweDAwNDAsIDB4N2U0YSwgMHgyMDcwLCAweDcwMDcsIDB4MDAwMCwgMHg3MDM3LCAweDAxMDMsCisJMHg3MDMzLCAweDAyMDAsIDB4MGU3ZiwgMHgxMDc4LCAweDI4YTYsIDB4MTA3OCwgMHg3NzJkLCAweDAwNzgsCisJMHg3ZTU1LCAweDEwNzgsIDB4N2M4MywgMHgxMDc4LCAweDdkZmYsIDB4MGU3ZiwgMHgwMDdjLCAweDIwMTEsCisJMHhhNjIwLCAweDIyMDQsIDB4YTA4NiwgMHgwMDE0LCAweDAwYzAsIDB4N2U2YSwgMHgyMDAxLCAweDAwMDIsCisJMHgxMDc4LCAweDQ1MDIsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHgxMDc4LCAweDVkZDcsCisJMHgwMDc4LCAweDdlNmMsIDB4MTA3OCwgMHg3ZGZmLCAweDAwN2MsIDB4MjAxMSwgMHhhNjIwLCAweDIyMDQsCisJMHhhMDg2LCAweDAwMDQsIDB4MDBjMCwgMHg3ZTdjLCAweDIwMDEsIDB4MDAwNywgMHgxMDc4LCAweDQ1MDIsCisJMHgxMDc4LCAweDc3MmQsIDB4MDA3OCwgMHg3ZTdlLCAweDEwNzgsIDB4N2RmZiwgMHgwMDdjLCAweDdkNGUsCisJMHg3ZTk3LCAweDdkNGUsIDB4N2VkMiwgMHg3ZDRlLCAweDdmNDQsIDB4N2U4YiwgMHg3ZDRlLCAweDdkNGUsCisJMHg3ZjU5LCAweDdkNGUsIDB4N2Y2YywgMHg2NjA0LCAweGE2ODYsIDB4MDAwMywgMHgwMDQwLCAweDdlMTMsCisJMHhhNmI2LCAweDAwMWUsIDB4MDBjMCwgMHg3ZTk2LCAweDEwNzgsIDB4NzcyZCwgMHgwMDdjLCAweDBkN2UsCisJMHgwYzdlLCAweDEwNzgsIDB4N2Y3ZiwgMHgwMGMwLCAweDdlYWQsIDB4MjAwMSwgMHgwMDAwLCAweDEwNzgsCisJMHg0NGVlLCAweDIwMDEsIDB4MDAwMiwgMHgxMDc4LCAweDQ1MDIsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDAyLCAweDEwNzgsIDB4NWRkNywgMHgwMDc4LCAweDdlY2YsIDB4MjAwOSwgMHhhYjhlLCAweDIxMDQsCisJMHhhMDg2LCAweDAwMDksIDB4MDBjMCwgMHg3ZWMyLCAweDYwMTgsIDB4MjA2OCwgMHg2ODQwLCAweGEwODQsCisJMHgwMGZmLCAweGEwMDUsIDB4MDA0MCwgMHg3ZWNkLCAweDgwMDEsIDB4Njg0MiwgMHg2MDE3LCAweDAwMGEsCisJMHgwMDc4LCAweDdlY2YsIDB4MjAwOSwgMHhhYjhmLCAweDIxMDQsIDB4YTA4NCwgMHhmZjAwLCAweGEwODYsCisJMHgxOTAwLCAweDAwYzAsIDB4N2VjZCwgMHgwMDc4LCAweDdlYTEsIDB4MTA3OCwgMHg3ZGZmLCAweDBjN2YsCisJMHgwZDdmLCAweDAwN2MsIDB4MTA3OCwgMHg3ZjhlLCAweDAwYzAsIDB4N2VlNiwgMHgyMDAxLCAweDAwMDAsCisJMHgxMDc4LCAweDQ0ZWUsIDB4MjAwMSwgMHgwMDAyLCAweDEwNzgsIDB4NDUwMiwgMHg2MDAzLCAweDAwMDEsCisJMHg2MDA3LCAweDAwMDIsIDB4MTA3OCwgMHg1ZGQ3LCAweDAwNzgsIDB4N2YxMiwgMHgxMDc4LCAweDdjODMsCisJMHgyMDA5LCAweGFiOGUsIDB4MjEzNCwgMHhhNmI0LCAweDAwZmYsIDB4YTY4NiwgMHgwMDA1LCAweDAwNDAsCisJMHg3ZjEzLCAweGE2ODYsIDB4MDAwYiwgMHgwMDQwLCAweDdmMTAsIDB4MjAwOSwgMHhhYjhmLCAweDIxMDQsCisJMHhhMDg0LCAweGZmMDAsIDB4MDBjMCwgMHg3ZjAwLCAweGE2ODYsIDB4MDAwOSwgMHgwMDQwLCAweDdmMTMsCisJMHhhMDg2LCAweDE5MDAsIDB4MDBjMCwgMHg3ZjEwLCAweGE2ODYsIDB4MDAwOSwgMHgwMDQwLCAweDdmMTMsCisJMHgyMDAxLCAweDAwMDQsIDB4MTA3OCwgMHg0NTAyLCAweDEwNzgsIDB4NzcyZCwgMHgwMDc4LCAweDdmMTIsCisJMHgxMDc4LCAweDdkZmYsIDB4MDA3YywgMHgwZDdlLCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LCAweDhkMDYsCisJMHgwMDQwLCAweDdmMjEsIDB4NjgzOCwgMHhkMGZjLCAweDAwNDAsIDB4N2YyMSwgMHgwZDdmLCAweDAwNzgsCisJMHg3ZjEwLCAweDYwMTgsIDB4MjA2OCwgMHg2ODQwLCAweGEwODQsIDB4MDBmZiwgMHhhMDA1LCAweDAwNDAsCisJMHg3ZjMyLCAweDgwMDEsIDB4Njg0MiwgMHg2MDE3LCAweDAwMGEsIDB4NjAwNywgMHgwMDE2LCAweDBkN2YsCisJMHgwMDc4LCAweDdmMTIsIDB4NjhhMCwgMHhhMDg2LCAweDAwN2UsIDB4MDBjMCwgMHg3ZjNmLCAweDBlN2UsCisJMHgyMDcxLCAweGE2MDAsIDB4MTA3OCwgMHg0MmI4LCAweDBlN2YsIDB4MDA3OCwgMHg3ZjQxLCAweDEwNzgsCisJMHgyODgwLCAweDBkN2YsIDB4MDA3OCwgMHg3ZjEwLCAweDEwNzgsIDB4N2Y4ZSwgMHgwMGMwLCAweDdmNTQsCisJMHgyMDAxLCAweDAwMDQsIDB4MTA3OCwgMHg0NTAyLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDMsCisJMHgxMDc4LCAweDVkZDcsIDB4MDA3OCwgMHg3ZjU4LCAweDEwNzgsIDB4N2M4MywgMHgxMDc4LCAweDdkZmYsCisJMHgwMDdjLCAweDEwNzgsIDB4N2Y4ZSwgMHgwMGMwLCAweDdmNjksIDB4MjAwMSwgMHgwMDA4LCAweDEwNzgsCisJMHg0NTAyLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDUsIDB4MTA3OCwgMHg1ZGQ3LCAweDAwNzgsCisJMHg3ZjZiLCAweDEwNzgsIDB4N2RmZiwgMHgwMDdjLCAweDEwNzgsIDB4N2Y4ZSwgMHgwMGMwLCAweDdmN2MsCisJMHgyMDAxLCAweDAwMGEsIDB4MTA3OCwgMHg0NTAyLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDEsCisJMHgxMDc4LCAweDVkZDcsIDB4MDA3OCwgMHg3ZjdlLCAweDEwNzgsIDB4N2RmZiwgMHgwMDdjLCAweDIwMDksCisJMHhhYjhlLCAweDIxMDQsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsIDB4N2Y4ZCwgMHgyMDA5LCAweGFiOGYsCisJMHgyMTA0LCAweGEwODQsIDB4ZmYwMCwgMHhhMDg2LCAweDJhMDAsIDB4MDA3YywgMHhhMDg1LCAweDAwMDEsCisJMHgwMDdjLCAweDBjN2UsIDB4MDE3ZSwgMHhhYzg4LCAweDAwMDYsIDB4MjE2NCwgMHgxMDc4LCAweDQ1ZDYsCisJMHgwMTdmLCAweDBjN2YsIDB4MDA3YywgMHgwZjdlLCAweDBlN2UsIDB4MGQ3ZSwgMHgwMzdlLCAweDAxN2UsCisJMHg2MDE4LCAweDIwNjgsIDB4MjA3MSwgMHhhNjMzLCAweDJlMDQsIDB4YTA4NSwgMHgwMDAzLCAweDIwNzIsCisJMHgxMDc4LCAweDgwMTQsIDB4MDA0MCwgMHg3ZmQ5LCAweDIwMDksIDB4YTYzMywgMHgyMTA0LCAweGMwY2QsCisJMHgyMDBhLCAweDIwMDEsIDB4YTY1MywgMHgyMDA0LCAweGQwYTQsIDB4MDA0MCwgMHg3ZmMyLCAweGEwMDYsCisJMHgyMDIwLCAweDIwMDksIDB4MDAyYSwgMHgxMDc4LCAweGEyMWQsIDB4MjAwMSwgMHhhNjBjLCAweDIwMGMsCisJMHhjMTk1LCAweDIxMDIsIDB4MjAxOSwgMHgwMDJhLCAweDIwMDksIDB4MDAwMSwgMHgxMDc4LCAweDI4NGYsCisJMHgyMDcxLCAweGE2MDAsIDB4MTA3OCwgMHgyNjc3LCAweDBjN2UsIDB4MTU3ZSwgMHgyMGE5LCAweDAwODEsCisJMHgyMDA5LCAweDAwN2YsIDB4MTA3OCwgMHgyOThlLCAweDgxMDgsIDB4MDBmMCwgMHg3ZmQyLCAweDE1N2YsCisJMHgwYzdmLCAweDEwNzgsIDB4N2Y5MSwgMHg2ODEzLCAweDAwZmYsIDB4NjgxNywgMHhmZmZlLCAweDIwNzEsCisJMHhhYjgwLCAweDIwNzksIDB4MDEwMCwgMHgyZTA0LCAweGEwODQsIDB4MDBmZiwgMHgyMDY5LCAweGE2MWIsCisJMHgyMDZhLCAweDc4ZTYsIDB4MDA3ZSwgMHg4ZTcwLCAweDJlMDQsIDB4MjA2OSwgMHhhNjFjLCAweDIwNmEsCisJMHg3OGVhLCAweGEwODQsIDB4ZmYwMCwgMHgwMTdmLCAweGExMDUsIDB4MjAwOSwgMHhhNjI2LCAweDIwMGEsCisJMHgyMDY5LCAweGFiOGUsIDB4MjA3MSwgMHhhODllLCAweDY4MTAsIDB4MjA3MiwgMHg2ODE0LCAweDcwMDYsCisJMHg2ODE4LCAweDcwMGEsIDB4NjgxYywgMHg3MDBlLCAweDEwNzgsIDB4OTA2ZSwgMHgyMDAxLCAweDAwMDYsCisJMHgxMDc4LCAweDQ1MDIsIDB4MTA3OCwgMHgyOGE2LCAweDEwNzgsIDB4NzcyZCwgMHgwMTdmLCAweDAzN2YsCisJMHgwZDdmLCAweDBlN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDAyN2UsIDB4MDM3ZSwgMHgwZTdlLCAweDE1N2UsCisJMHgyMDE5LCAweGE2MjYsIDB4MjMxYywgMHg4M2ZmLCAweDAwNDAsIDB4ODAzZSwgMHgyMDcxLCAweGFiODAsCisJMHgyZTE0LCAweGEyOTQsIDB4MDBmZiwgMHg3MDA0LCAweGEwODQsIDB4ZmYwMCwgMHhhMjA1LCAweGEzMDYsCisJMHgwMGMwLCAweDgwM2UsIDB4MjAxMSwgMHhhYjk2LCAweGFkOTgsIDB4MDAwYSwgMHgyMGE5LCAweDAwMDQsCisJMHgxMDc4LCAweDgwZGUsIDB4MDBjMCwgMHg4MDNlLCAweDIwMTEsIDB4YWI5YSwgMHhhZDk4LCAweDAwMDYsCisJMHgyMGE5LCAweDAwMDQsIDB4MTA3OCwgMHg4MGRlLCAweDAwYzAsIDB4ODAzZSwgMHgxNTdmLCAweDBlN2YsCisJMHgwMzdmLCAweDAyN2YsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YWI4YywgMHg3MDA0LCAweGEwODYsCisJMHgwMDE0LCAweDAwYzAsIDB4ODA2NiwgMHg3MDA4LCAweGEwODYsIDB4MDgwMCwgMHgwMGMwLCAweDgwNjYsCisJMHg3MDBjLCAweGQwZWMsIDB4MDA0MCwgMHg4MDY0LCAweGEwODQsIDB4MGYwMCwgMHhhMDg2LCAweDAxMDAsCisJMHgwMGMwLCAweDgwNjQsIDB4NzAyNCwgMHhkMGE0LCAweDAwYzAsIDB4ODA2MSwgMHhkMGFjLCAweDAwNDAsCisJMHg4MDY0LCAweGEwMDYsIDB4MDA3OCwgMHg4MDY2LCAweGEwODUsIDB4MDAwMSwgMHgwZTdmLCAweDAwN2MsCisJMHgwZTdlLCAweDBkN2UsIDB4MGM3ZSwgMHgwNzdlLCAweDA1N2UsIDB4MDQ3ZSwgMHgwMjdlLCAweDAwN2UsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDI5LCAweGE4YmEsIDB4MjUyYywgMHgyMDIxLCAweGE4YzAsCisJMHgyNDI0LCAweDIwNjEsIDB4YWQwMCwgMHgyMDcxLCAweGE2MDAsIDB4NzI0OCwgMHg3MDY0LCAweGEyMDIsCisJMHgwMGM4LCAweDgwY2MsIDB4MTA3OCwgMHhhMjQyLCAweDAwNDAsIDB4ODBjNCwgMHg2NzFjLCAweGE3ODYsCisJMHgwMDAxLCAweDAwNDAsIDB4ODBjNCwgMHhhNzg2LCAweDAwMDcsIDB4MDA0MCwgMHg4MGM0LCAweDI1MDAsCisJMHhhYzA2LCAweDAwNDAsIDB4ODBjNCwgMHgyNDAwLCAweGFjMDYsIDB4MDA0MCwgMHg4MGM0LCAweDBjN2UsCisJMHg2MDAwLCAweGEwODYsIDB4MDAwNCwgMHgwMGMwLCAweDgwOWYsIDB4MTA3OCwgMHgxNzU3LCAweGE3ODYsCisJMHgwMDA4LCAweDAwYzAsIDB4ODBhZSwgMHgxMDc4LCAweDhmMDAsIDB4MDBjMCwgMHg4MGFlLCAweDBjN2YsCisJMHgxMDc4LCAweDdjODMsIDB4MTA3OCwgMHg4ZWM2LCAweDAwNzgsIDB4ODBjNCwgMHg2MDEwLCAweDIwNjgsCisJMHgxMDc4LCAweDhkMDYsIDB4MDA0MCwgMHg4MGMxLCAweGE3ODYsIDB4MDAwMywgMHgwMGMwLCAweDgwZDYsCisJMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsIDB4MTA3OCwgMHg0YTczLCAweDEwNzgsCisJMHg4ZWI5LCAweDEwNzgsIDB4OGVjNiwgMHgwYzdmLCAweGFjZTAsIDB4MDAxMCwgMHg3MDU4LCAweGFjMDIsCisJMHgwMGM4LCAweDgwY2MsIDB4MDA3OCwgMHg4MDdkLCAweDEyN2YsIDB4MDA3ZiwgMHgwMjdmLCAweDA0N2YsCisJMHgwNTdmLCAweDA3N2YsIDB4MGM3ZiwgMHgwZDdmLCAweDBlN2YsIDB4MDA3YywgMHhhNzg2LCAweDAwMDYsCisJMHgwMGMwLCAweDgwYjgsIDB4MTA3OCwgMHhhMWNhLCAweDAwNzgsIDB4ODBjMSwgMHgyMjBjLCAweDIzMDQsCisJMHhhMTA2LCAweDAwYzAsIDB4ODBlOSwgMHg4MjEwLCAweDgzMTgsIDB4MDBmMCwgMHg4MGRlLCAweGEwMDYsCisJMHgwMDdjLCAweDIzMDQsIDB4YTEwMiwgMHgwMDQ4LCAweDgwZjEsIDB4MjAwMSwgMHgwMDAxLCAweDAwNzgsCisJMHg4MGYzLCAweDIwMDEsIDB4MDAwMCwgMHhhMThkLCAweDAwMDEsIDB4MDA3YywgMHg2MDA0LCAweGEwOGEsCisJMHgwMDQ0LCAweDEwYzgsIDB4MTMzMiwgMHgxMDc4LCAweDhlZWMsIDB4MDA0MCwgMHg4MTA1LCAweDEwNzgsCisJMHg4ZjAwLCAweDAwNDAsIDB4ODExMiwgMHgwMDc4LCAweDgxMGIsIDB4MTA3OCwgMHgyOGE2LCAweDEwNzgsCisJMHg4ZjAwLCAweDAwNDAsIDB4ODExMiwgMHgxMDc4LCAweDYxY2QsIDB4MTA3OCwgMHg3NzJkLCAweDEwNzgsCisJMHg2MmQxLCAweDAwN2MsIDB4MTA3OCwgMHg3YzgzLCAweDAwNzgsIDB4ODEwYiwgMHhhMTgyLCAweDAwNDAsCisJMHgwMDc5LCAweDgxMWEsIDB4ODEyZCwgMHg4MTJkLCAweDgxMmQsIDB4ODEyZCwgMHg4MTJkLCAweDgxMmQsCisJMHg4MTJkLCAweDgxMmQsIDB4ODEyZCwgMHg4MTJkLCAweDgxMmQsIDB4ODEyZiwgMHg4MTJmLCAweDgxMmYsCisJMHg4MTJmLCAweDgxMmQsIDB4ODEyZCwgMHg4MTJkLCAweDgxMmYsIDB4MTA3OCwgMHgxMzMyLCAweDYwMGIsCisJMHhmZmZmLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDEwNzgsIDB4NWQ4YSwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDEwNzgsIDB4NjJkMSwgMHgxMjdmLCAweDAwN2MsIDB4YTE4NiwgMHgwMDEzLCAweDAwYzAsCisJMHg4MTQ2LCAweDYwMDQsIDB4YTA4MiwgMHgwMDQwLCAweDAwNzksIDB4ODFkMSwgMHhhMTg2LCAweDAwMjcsCisJMHgwMGMwLCAweDgxNjgsIDB4MTA3OCwgMHg2MWNkLCAweDEwNzgsIDB4Mjg4MCwgMHgwZDdlLCAweDYxMTAsCisJMHgyMTY4LCAweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDgxNjIsIDB4NjgzNywgMHgwMTAzLCAweDY4NGIsCisJMHgwMDI5LCAweDY4NDcsIDB4MDAwMCwgMHg2OTRjLCAweGMxYzUsIDB4Njk0ZSwgMHgxMDc4LCAweDRhNzMsCisJMHgxMDc4LCAweDhlYjksIDB4MGQ3ZiwgMHgxMDc4LCAweDc3MmQsIDB4MTA3OCwgMHg2MmQxLCAweDAwN2MsCisJMHhhMTg2LCAweDAwMTQsIDB4MDBjMCwgMHg4MTcxLCAweDYwMDQsIDB4YTA4MiwgMHgwMDQwLCAweDAwNzksCisJMHg4MTk5LCAweGExODYsIDB4MDA0NiwgMHgwMDQwLCAweDgxN2QsIDB4YTE4NiwgMHgwMDQ1LCAweDAwNDAsCisJMHg4MTdkLCAweGExODYsIDB4MDA0NywgMHgxMGMwLCAweDEzMzIsIDB4MjAwMSwgMHgwMTA5LCAweDIwMDQsCisJMHhkMDg0LCAweDAwNDAsIDB4ODE5NiwgMHgxMjdlLCAweDIwOTEsIDB4MjIwMCwgMHgwMDdlLCAweDAxN2UsCisJMHgwMjdlLCAweDEwNzgsIDB4NWM1NiwgMHgwMjdmLCAweDAxN2YsIDB4MDA3ZiwgMHgxMjdmLCAweDYwMDAsCisJMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHg4MTk2LCAweDAwNzgsIDB4ODIwZSwgMHgxMDc4LCAweDc3NzMsCisJMHgwMDdjLCAweDgxYWUsIDB4ODFhYywgMHg4MWFjLCAweDgxYWMsIDB4ODFhYywgMHg4MWFjLCAweDgxYWMsCisJMHg4MWFjLCAweDgxYWMsIDB4ODFhYywgMHg4MWFjLCAweDgxY2EsIDB4ODFjYSwgMHg4MWNhLCAweDgxY2EsCisJMHg4MWFjLCAweDgxY2EsIDB4ODFhYywgMHg4MWNhLCAweDEwNzgsIDB4MTMzMiwgMHgxMDc4LCAweDYxY2QsCisJMHgwZDdlLCAweDYxMTAsIDB4MjE2OCwgMHgxMDc4LCAweDhkMDYsIDB4MDA0MCwgMHg4MWM0LCAweDY4MzcsCisJMHgwMTAzLCAweDY4NGIsIDB4MDAwNiwgMHg2ODQ3LCAweDAwMDAsIDB4Njg1MCwgMHhjMGVjLCAweDY4NTIsCisJMHgxMDc4LCAweDRhNzMsIDB4MTA3OCwgMHg4ZWI5LCAweDBkN2YsIDB4MTA3OCwgMHg3NzJkLCAweDEwNzgsCisJMHg2MmQxLCAweDAwN2MsIDB4MTA3OCwgMHg2MWNkLCAweDEwNzgsIDB4NzcyZCwgMHgxMDc4LCAweDYyZDEsCisJMHgwMDdjLCAweDgxZTYsIDB4ODFlNCwgMHg4MWU0LCAweDgxZTQsIDB4ODFlNCwgMHg4MWU0LCAweDgxZTQsCisJMHg4MWU0LCAweDgxZTQsIDB4ODFlNCwgMHg4MWU0LCAweDgxZjgsIDB4ODFmOCwgMHg4MWY4LCAweDgxZjgsCisJMHg4MWU0LCAweDgyMDcsIDB4ODFlNCwgMHg4MWY4LCAweDEwNzgsIDB4MTMzMiwgMHgxMDc4LCAweDYxY2QsCisJMHgyMDAxLCAweGE4YTQsIDB4MjAwNCwgMHg2MDNlLCAweDYwMDMsIDB4MDAwMiwgMHgxMDc4LCAweDYyZDEsCisJMHg2MDEwLCAweGEwODgsIDB4MDAxMywgMHgyMTA0LCAweGEwODUsIDB4MDQwMCwgMHgyMDBhLCAweDAwN2MsCisJMHgxMDc4LCAweDYxY2QsIDB4MjAwMSwgMHhhOGEyLCAweDIwMDQsIDB4NjAxNiwgMHgyMDAxLCAweGE4YTQsCisJMHgyMDA0LCAweDYwM2UsIDB4NjAwMywgMHgwMDBmLCAweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweDEwNzgsCisJMHg2MWNkLCAweDEwNzgsIDB4NzcyZCwgMHgxMDc4LCAweDYyZDEsIDB4MDA3YywgMHhhMTgyLCAweDAwNDAsCisJMHgwMDc5LCAweDgyMTIsIDB4ODIyNSwgMHg4MjI1LCAweDgyMjUsIDB4ODIyNSwgMHg4MjI1LCAweDgyMjcsCisJMHg4MzI3LCAweDgzNTksIDB4ODIyNSwgMHg4MjI1LCAweDgyMjUsIDB4ODIyNSwgMHg4MjI1LCAweDgyMjUsCisJMHg4MjI1LCAweDgyMjUsIDB4ODIyNSwgMHg4MjI1LCAweDgyMjUsIDB4MTA3OCwgMHgxMzMyLCAweDBlN2UsCisJMHgwZDdlLCAweDYwM2YsIDB4MDAwMCwgMHgyMDcxLCAweGFiODAsIDB4NzEyNCwgMHg2MTBhLCAweDIwNzEsCisJMHhhYjhjLCAweDYxMTAsIDB4MjE2OCwgMHg3NjE0LCAweGE2YjQsIDB4MGZmZiwgMHg4NmZmLCAweDAwNDAsCisJMHg4MmU5LCAweGE2OGMsIDB4MGMwMCwgMHgwMDQwLCAweDgyNWUsIDB4MGY3ZSwgMHgyYzc4LCAweDEwNzgsCisJMHg0OTYzLCAweDBmN2YsIDB4MDA0MCwgMHg4MjVhLCAweDY4NGMsIDB4ZDBhYywgMHgwMDQwLCAweDgyNWEsCisJMHg2MDI0LCAweGQwZGMsIDB4MDBjMCwgMHg4MjVhLCAweDY4NTAsIDB4ZDBiYywgMHgwMGMwLCAweDgyNWEsCisJMHg3MzE4LCAweDY4MTQsIDB4YTMwNiwgMHgwMGMwLCAweDgzMDEsIDB4NzMxYywgMHg2ODEwLCAweGEzMDYsCisJMHgwMGMwLCAweDgzMDEsIDB4NzMxOCwgMHg2YjYyLCAweDczMWMsIDB4NmI1ZSwgMHhhNjhjLCAweDAwZmYsCisJMHhhMTg2LCAweDAwMDIsIDB4MDA0MCwgMHg4MjkxLCAweGExODYsIDB4MDAyOCwgMHgwMGMwLCAweDgyNmUsCisJMHgxMDc4LCAweDhlZGEsIDB4Njg0YiwgMHgwMDFjLCAweDAwNzgsIDB4ODI5MywgMHhkNmRjLCAweDAwNDAsCisJMHg4MjhhLCAweDY4NGIsIDB4MDAxNSwgMHg2ODRjLCAweGQwYWMsIDB4MDA0MCwgMHg4Mjg4LCAweDY5MTQsCisJMHg2YTEwLCAweDIxMDAsIDB4YTIwNSwgMHgwMDQwLCAweDgyODgsIDB4NzAxOCwgMHhhMTA2LCAweDAwYzAsCisJMHg4Mjg1LCAweDcwMWMsIDB4YTIwNiwgMHgwMDQwLCAweDgyODgsIDB4Njk2MiwgMHg2YTVlLCAweGM2ZGMsCisJMHgwMDc4LCAweDgyOTMsIDB4ZDZkNCwgMHgwMDQwLCAweDgyOTEsIDB4Njg0YiwgMHgwMDA3LCAweDAwNzgsCisJMHg4MjkzLCAweDY4NGIsIDB4MDAwMCwgMHg2ODM3LCAweDAxMDMsIDB4NmU0NiwgMHhhMDFlLCAweGQ2YzQsCisJMHgwMDQwLCAweDgyYmMsIDB4YTY4NiwgMHgwMTAwLCAweDAwYzAsIDB4ODJhNywgMHgyMDAxLCAweGFiOTksCisJMHgyMDA0LCAweGEwMDUsIDB4MDBjMCwgMHg4MmE3LCAweGM2YzQsIDB4MDA3OCwgMHg4MjM2LCAweDczMjgsCisJMHg3MzJjLCAweDZiNTYsIDB4ODNmZiwgMHgwMDQwLCAweDgyYmMsIDB4YTM4YSwgMHgwMDA5LCAweDAwNDgsCisJMHg4MmIzLCAweDIwMTksIDB4MDAwOCwgMHgwMzdlLCAweDIzMDgsIDB4MjAxOSwgMHhhYjk4LCAweGFkOTAsCisJMHgwMDE5LCAweDEwNzgsIDB4ODllMiwgMHgwMzdmLCAweGQ2Y2MsIDB4MDA0MCwgMHg4MzE3LCAweDcxMjQsCisJMHg2OTVhLCAweDgxZmYsIDB4MDA0MCwgMHg4MzE3LCAweGExOTIsIDB4MDAyMSwgMHgwMGM4LCAweDgyZDUsCisJMHgyMDcxLCAweGFiOTgsIDB4ODMxYywgMHgyMzAwLCAweGFlMTgsIDB4YWQ5MCwgMHgwMDFkLCAweDEwNzgsCisJMHg4OWUyLCAweDEwNzgsIDB4OTFmNCwgMHgwMDc4LCAweDgzMTcsIDB4NjgzOCwgMHhkMGZjLCAweDAwNDAsCisJMHg4MmRlLCAweDIwMDksIDB4MDAyMCwgMHg2OTVhLCAweDAwNzgsIDB4ODJjOCwgMHgwZjdlLCAweDJkNzgsCisJMHgxMDc4LCAweDg5N2EsIDB4MGY3ZiwgMHgxMDc4LCAweDkxZjQsIDB4MTA3OCwgMHg4OWNmLCAweDAwNzgsCisJMHg4MzE5LCAweDBmN2UsIDB4MmM3OCwgMHgxMDc4LCAweDQ5NjMsIDB4MGY3ZiwgMHgwMDQwLCAweDgzMDcsCisJMHg2ODRjLCAweGQwYWMsIDB4MDA0MCwgMHg4MzA3LCAweDYwMjQsIDB4ZDBkYywgMHgwMGMwLCAweDgzMDcsCisJMHg2ODUwLCAweGQwYmMsIDB4MDBjMCwgMHg4MzA3LCAweDY4MTAsIDB4NjkxNCwgMHhhMTA1LCAweDAwNDAsCisJMHg4MzA3LCAweDEwNzgsIDB4OGZiZiwgMHgwZDdmLCAweDBlN2YsIDB4MDA3OCwgMHg4MzI2LCAweDY4NGIsCisJMHgwMDAwLCAweDY4MzcsIDB4MDEwMywgMHg2ZTQ2LCAweDY4NGMsIDB4ZDBhYywgMHgwMDQwLCAweDgzMTcsCisJMHg2ODEwLCAweDY5MTQsIDB4YTExNSwgMHgwMDQwLCAweDgzMTcsIDB4MTA3OCwgMHg4NGQ1LCAweDEwNzgsCisJMHg0YTczLCAweDYyMTgsIDB4MjI2OCwgMHg2YTNjLCAweDgyMTEsIDB4NmEzZSwgMHgxMDc4LCAweDhmODksCisJMHgwZDdmLCAweDBlN2YsIDB4MDBjMCwgMHg4MzI2LCAweDEwNzgsIDB4NzcyZCwgMHgwMDdjLCAweDBmN2UsCisJMHg2MDAzLCAweDAwMDMsIDB4MjA3OSwgMHhhYjhjLCAweDdjMDQsIDB4N2IwMCwgMHg3ZTBjLCAweDdkMDgsCisJMHg2MDEwLCAweDIwNzgsIDB4Nzg0YywgMHhkMGFjLCAweDAwNDAsIDB4ODMzZSwgMHg2MDAzLCAweDAwMDIsCisJMHgwZjdmLCAweDAwN2MsIDB4MjEzMCwgMHgyMjI4LCAweDAwNzgsIDB4ODM0YSwgMHgyNDAwLCAweDc5N2MsCisJMHhhMTBhLCAweDIzMDAsIDB4N2E4MCwgMHhhMjEzLCAweDI2MDAsIDB4YTEwMiwgMHgyNTAwLCAweGEyMDMsCisJMHgwMDQ4LCAweDgzM2EsIDB4N2MxMiwgMHg3YjE2LCAweDdlMGEsIDB4N2QwZSwgMHgwZjdmLCAweDYwM2YsCisJMHgwMDAwLCAweDJjMTAsIDB4MTA3OCwgMHgxY2YwLCAweDEwNzgsIDB4NWRmNiwgMHgxMDc4LCAweDYzOWIsCisJMHgwMDdjLCAweDIwMDEsIDB4YThhNCwgMHgyMDA0LCAweDYwM2UsIDB4NjAwMywgMHgwMDA0LCAweDYxMTAsCisJMHgyMGUxLCAweDAwMDUsIDB4M2QxOCwgMHgzZTIwLCAweDJjMTAsIDB4MTA3OCwgMHgxNWZhLCAweDAwN2MsCisJMHhhMTgyLCAweDAwNDAsIDB4MDA3OSwgMHg4MzZjLCAweDgzN2YsIDB4ODM3ZiwgMHg4MzdmLCAweDgzN2YsCisJMHg4MzdmLCAweDgzODEsIDB4ODQyNCwgMHg4MzdmLCAweDgzN2YsIDB4ODQzYSwgMHg4NGFiLCAweDgzN2YsCisJMHg4MzdmLCAweDgzN2YsIDB4ODM3ZiwgMHg4NGJhLCAweDgzN2YsIDB4ODM3ZiwgMHg4MzdmLCAweDEwNzgsCisJMHgxMzMyLCAweDA3N2UsIDB4MGY3ZSwgMHgwZTdlLCAweDBkN2UsIDB4MjA3MSwgMHhhYjhjLCAweDYxMTAsCisJMHgyMTc4LCAweDc2MTQsIDB4YTZiNCwgMHgwZmZmLCAweDdlNDYsIDB4N2Y0YywgMHhjN2U1LCAweDdmNGUsCisJMHg2MjE4LCAweDIyNjgsIDB4NmEzYywgMHg4MjExLCAweDZhM2UsIDB4ODZmZiwgMHgwMDQwLCAweDg0MWYsCisJMHhhNjk0LCAweGZmMDAsIDB4YTI4NCwgMHgwYzAwLCAweDAwNDAsIDB4ODNhMiwgMHg3MDE4LCAweDc4NjIsCisJMHg3MDFjLCAweDc4NWUsIDB4YTI4NCwgMHgwMzAwLCAweDAwNDAsIDB4ODQxZiwgMHgxMDc4LCAweDEzOGIsCisJMHgxMDQwLCAweDEzMzIsIDB4MmQwMCwgMHg3ODRhLCAweDdmNGMsIDB4YzdjZCwgMHg3ZjRlLCAweDY4MzcsCisJMHgwMTAzLCAweDc4MzgsIDB4NjgzYSwgMHg3ODNjLCAweDY4M2UsIDB4Nzg0MCwgMHg2ODQyLCAweDZlNDYsCisJMHhhNjhjLCAweDBjMDAsIDB4MDA0MCwgMHg4M2MwLCAweDczMTgsIDB4NmI2MiwgMHg3MzFjLCAweDZiNWUsCisJMHhhNjhjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDAyLCAweDAwNDAsIDB4ODNkYywgMHhhMTg2LCAweDAwMjgsCisJMHgwMGMwLCAweDgzY2UsIDB4Njg0YiwgMHgwMDFjLCAweDAwNzgsIDB4ODNkZSwgMHhkNmRjLCAweDAwNDAsCisJMHg4M2Q1LCAweDY4NGIsIDB4MDAxNSwgMHgwMDc4LCAweDgzZGUsIDB4ZDZkNCwgMHgwMDQwLCAweDgzZGMsCisJMHg2ODRiLCAweDAwMDcsIDB4MDA3OCwgMHg4M2RlLCAweDY4NGIsIDB4MDAwMCwgMHg2ZjRlLCAweDc4NTAsCisJMHg2ODUyLCAweDc4NTQsIDB4Njg1NiwgMHhhMDFlLCAweGQ2YzQsIDB4MDA0MCwgMHg4M2ZjLCAweDczMjgsCisJMHg3MzJjLCAweDZiNTYsIDB4ODNmZiwgMHgwMDQwLCAweDgzZmMsIDB4YTM4YSwgMHgwMDA5LCAweDAwNDgsCisJMHg4M2YzLCAweDIwMTksIDB4MDAwOCwgMHgwMzdlLCAweDIzMDgsIDB4MjAxOSwgMHhhYjk4LCAweGFkOTAsCisJMHgwMDE5LCAweDEwNzgsIDB4ODllMiwgMHgwMzdmLCAweGQ2Y2MsIDB4MDA0MCwgMHg4NDFmLCAweDcxMjQsCisJMHg2OTVhLCAweDgxZmYsIDB4MDA0MCwgMHg4NDFmLCAweGExOTIsIDB4MDAyMSwgMHgwMGM4LCAweDg0MTMsCisJMHgyMDcxLCAweGFiOTgsIDB4ODMxYywgMHgyMzAwLCAweGFlMTgsIDB4YWQ5MCwgMHgwMDFkLCAweDEwNzgsCisJMHg4OWUyLCAweDAwNzgsIDB4ODQxZiwgMHg3ODM4LCAweGQwZmMsIDB4MDA0MCwgMHg4NDFjLCAweDIwMDksCisJMHgwMDIwLCAweDY5NWEsIDB4MDA3OCwgMHg4NDA4LCAweDJkNzgsIDB4MTA3OCwgMHg4OTdhLCAweDBkN2YsCisJMHgwZTdmLCAweDBmN2YsIDB4MDc3ZiwgMHgwMDdjLCAweDBmN2UsIDB4NjAwMywgMHgwMDAzLCAweDIwNzksCisJMHhhYjhjLCAweDdjMDQsIDB4N2IwMCwgMHg3ZTBjLCAweDdkMDgsIDB4NjAxMCwgMHgyMDc4LCAweDdjMTIsCisJMHg3YjE2LCAweDdlMGEsIDB4N2QwZSwgMHgwZjdmLCAweDJjMTAsIDB4MTA3OCwgMHgxY2YwLCAweDEwNzgsCisJMHg2ZGY0LCAweDAwN2MsIDB4MGQ3ZSwgMHgwZjdlLCAweDJjNzgsIDB4MTA3OCwgMHg0OTYzLCAweDBmN2YsCisJMHgwMDQwLCAweDg0NDYsIDB4MjAwMSwgMHhhOGE0LCAweDIwMDQsIDB4NjAzZSwgMHg2MDAzLCAweDAwMDIsCisJMHgxMDc4LCAweDYyN2EsIDB4MTA3OCwgMHg2MzliLCAweDYxMTAsIDB4MjE2OCwgMHg2OTRjLCAweGQxZTQsCisJMHgwMDQwLCAweDg0YTksIDB4ZDFjYywgMHgwMDQwLCAweDg0ODAsIDB4Njk0OCwgMHg2ODM4LCAweGQwZmMsCisJMHgwMDQwLCAweDg0NzgsIDB4MDE3ZSwgMHg2ODRjLCAweDAwN2UsIDB4Njg1MCwgMHgwMDdlLCAweGFkOTAsCisJMHgwMDBkLCAweGExOTgsIDB4MDAwZCwgMHgyMDA5LCAweDAwMjAsIDB4MTU3ZSwgMHgyMWE4LCAweDIzMDQsCisJMHgyMDEyLCAweDgzMTgsIDB4ODIxMCwgMHgwMGYwLCAweDg0NjcsIDB4MTU3ZiwgMHgwMDdmLCAweDY4NTIsCisJMHgwMDdmLCAweDY4NGUsIDB4MDE3ZiwgMHgyMTY4LCAweDEwNzgsIDB4MTNiNCwgMHgwMDc4LCAweDg0YTMsCisJMHgwMTdlLCAweDEwNzgsIDB4MTNiNCwgMHgwZDdmLCAweDEwNzgsIDB4ODljZiwgMHgwMDc4LCAweDg0YTMsCisJMHg2ODM3LCAweDAxMDMsIDB4Njk0NCwgMHhhMTg0LCAweDAwZmYsIDB4YTBiNiwgMHgwMDAyLCAweDAwNDAsCisJMHg4NDlmLCAweGEwODYsIDB4MDAyOCwgMHgwMGMwLCAweDg0OTEsIDB4Njg0YiwgMHgwMDFjLCAweDAwNzgsCisJMHg4NGExLCAweGQxZGMsIDB4MDA0MCwgMHg4NDk4LCAweDY4NGIsIDB4MDAxNSwgMHgwMDc4LCAweDg0YTEsCisJMHhkMWQ0LCAweDAwNDAsIDB4ODQ5ZiwgMHg2ODRiLCAweDAwMDcsIDB4MDA3OCwgMHg4NGExLCAweDY4NGIsCisJMHgwMDAwLCAweDEwNzgsIDB4NGE3MywgMHgxMDc4LCAweDhmODksIDB4MDBjMCwgMHg4NGE5LCAweDEwNzgsCisJMHg3NzJkLCAweDBkN2YsIDB4MDA3YywgMHgyMDE5LCAweDAwMDEsIDB4MTA3OCwgMHg3MDU4LCAweDYwMDMsCisJMHgwMDAyLCAweDIwMDEsIDB4YThhNCwgMHgyMDA0LCAweDYwM2UsIDB4MTA3OCwgMHg2MjdhLCAweDEwNzgsCisJMHg2MzliLCAweDAwN2MsIDB4MTA3OCwgMHg2MjdhLCAweDEwNzgsIDB4Mjg4MCwgMHgwZDdlLCAweDYxMTAsCisJMHgyMTY4LCAweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDg0Y2YsIDB4NjgzNywgMHgwMTAzLCAweDY4NGIsCisJMHgwMDI5LCAweDY4NDcsIDB4MDAwMCwgMHgxMDc4LCAweDRhNzMsIDB4MTA3OCwgMHg4ZWI5LCAweDBkN2YsCisJMHgxMDc4LCAweDc3MmQsIDB4MTA3OCwgMHg2MzliLCAweDAwN2MsIDB4Njg0YiwgMHgwMDE1LCAweGQxZmMsCisJMHgwMDQwLCAweDg0ZTEsIDB4Njg0YiwgMHgwMDA3LCAweDgwMDIsIDB4ODAwMCwgMHg4MTBhLCAweGExODksCisJMHgwMDAwLCAweDY5NjIsIDB4Njg1ZSwgMHgwMDdjLCAweGExODIsIDB4MDA0MCwgMHgwMDc5LCAweDg0ZTgsCisJMHg4NGZiLCAweDg0ZmIsIDB4ODRmYiwgMHg4NGZiLCAweDg0ZmIsIDB4ODRmZCwgMHg4NGZiLCAweDg1ZDAsCisJMHg4NWRjLCAweDg0ZmIsIDB4ODRmYiwgMHg4NGZiLCAweDg0ZmIsIDB4ODRmYiwgMHg4NGZiLCAweDg0ZmIsCisJMHg4NGZiLCAweDg0ZmIsIDB4ODRmYiwgMHgxMDc4LCAweDEzMzIsIDB4MDc3ZSwgMHgwZjdlLCAweDBlN2UsCisJMHgwZDdlLCAweDIwNzEsIDB4YWI4YywgMHg2MTEwLCAweDIxNzgsIDB4NzYxNCwgMHhhNmI0LCAweDBmZmYsCisJMHgwZjdlLCAweDJjNzgsIDB4MTA3OCwgMHg0OTYzLCAweDBmN2YsIDB4MDA0MCwgMHg4NTFiLCAweGE2ODQsCisJMHgwMGZmLCAweDAwYzAsIDB4ODUxYiwgMHg2MDI0LCAweGQwZjQsIDB4MDA0MCwgMHg4NTFiLCAweDEwNzgsCisJMHg4ZmJmLCAweDAwNzgsIDB4ODVjYiwgMHg3ZTQ2LCAweDdmNGMsIDB4YzdlNSwgMHg3ZjRlLCAweDYyMTgsCisJMHgyMjY4LCAweDZhM2MsIDB4ODIxMSwgMHg2YTNlLCAweDg2ZmYsIDB4MDA0MCwgMHg4NWMwLCAweGE2OTQsCisJMHhmZjAwLCAweGEyODQsIDB4MGMwMCwgMHgwMDQwLCAweDg1MzEsIDB4NzAxOCwgMHg3ODYyLCAweDcwMWMsCisJMHg3ODVlLCAweGEyODQsIDB4MDMwMCwgMHgwMDQwLCAweDg1YmQsIDB4YTY4NiwgMHgwMTAwLCAweDAwYzAsCisJMHg4NTQzLCAweDIwMDEsIDB4YWI5OSwgMHgyMDA0LCAweGEwMDUsIDB4MDBjMCwgMHg4NTQzLCAweGM2YzQsCisJMHg3ZTQ2LCAweDAwNzgsIDB4ODUyNCwgMHgxMDc4LCAweDEzOGIsIDB4MTA0MCwgMHgxMzMyLCAweDJkMDAsCisJMHg3ODRhLCAweDdmNGMsIDB4YTdiZCwgMHgwMjAwLCAweDdmNGUsIDB4NjgzNywgMHgwMTAzLCAweDc4MzgsCisJMHg2ODNhLCAweDc4M2MsIDB4NjgzZSwgMHg3ODQwLCAweDY4NDIsIDB4NmU0NiwgMHhhNjhjLCAweDBjMDAsCisJMHgwMDQwLCAweDg1NWUsIDB4NzMxOCwgMHg2YjYyLCAweDczMWMsIDB4NmI1ZSwgMHhhNjhjLCAweDAwZmYsCisJMHhhMTg2LCAweDAwMDIsIDB4MDA0MCwgMHg4NTdhLCAweGExODYsIDB4MDAyOCwgMHgwMGMwLCAweDg1NmMsCisJMHg2ODRiLCAweDAwMWMsIDB4MDA3OCwgMHg4NTdjLCAweGQ2ZGMsIDB4MDA0MCwgMHg4NTczLCAweDY4NGIsCisJMHgwMDE1LCAweDAwNzgsIDB4ODU3YywgMHhkNmQ0LCAweDAwNDAsIDB4ODU3YSwgMHg2ODRiLCAweDAwMDcsCisJMHgwMDc4LCAweDg1N2MsIDB4Njg0YiwgMHgwMDAwLCAweDZmNGUsIDB4Nzg1MCwgMHg2ODUyLCAweDc4NTQsCisJMHg2ODU2LCAweGEwMWUsIDB4ZDZjNCwgMHgwMDQwLCAweDg1OWEsIDB4NzMyOCwgMHg3MzJjLCAweDZiNTYsCisJMHg4M2ZmLCAweDAwNDAsIDB4ODU5YSwgMHhhMzhhLCAweDAwMDksIDB4MDA0OCwgMHg4NTkxLCAweDIwMTksCisJMHgwMDA4LCAweDAzN2UsIDB4MjMwOCwgMHgyMDE5LCAweGFiOTgsIDB4YWQ5MCwgMHgwMDE5LCAweDEwNzgsCisJMHg4OWUyLCAweDAzN2YsIDB4ZDZjYywgMHgwMDQwLCAweDg1YmQsIDB4NzEyNCwgMHg2OTVhLCAweDgxZmYsCisJMHgwMDQwLCAweDg1YmQsIDB4YTE5MiwgMHgwMDIxLCAweDAwYzgsIDB4ODViMSwgMHgyMDcxLCAweGFiOTgsCisJMHg4MzFjLCAweDIzMDAsIDB4YWUxOCwgMHhhZDkwLCAweDAwMWQsIDB4MTA3OCwgMHg4OWUyLCAweDAwNzgsCisJMHg4NWJkLCAweDc4MzgsIDB4ZDBmYywgMHgwMDQwLCAweDg1YmEsIDB4MjAwOSwgMHgwMDIwLCAweDY5NWEsCisJMHgwMDc4LCAweDg1YTYsIDB4MmQ3OCwgMHgxMDc4LCAweDg5N2EsIDB4ZDZkYywgMHgwMGMwLCAweDg1YzMsCisJMHhhMDA2LCAweDAwNzgsIDB4ODVjOSwgMHgyMDAxLCAweDAwMDEsIDB4MjA3MSwgMHhhYjhjLCAweDcyMTgsCisJMHg3MzFjLCAweDEwNzgsIDB4MTY1MywgMHgwZDdmLCAweDBlN2YsIDB4MGY3ZiwgMHgwNzdmLCAweDAwN2MsCisJMHgyMDAxLCAweGE4YTQsIDB4MjAwNCwgMHg2MDNlLCAweDIwZTEsIDB4MDAwNSwgMHgzZDE4LCAweDNlMjAsCisJMHgyYzEwLCAweDEwNzgsIDB4MTVmYSwgMHgwMDdjLCAweDIwMDEsIDB4YThhNCwgMHgyMDA0LCAweDYwM2UsCisJMHgwZDdlLCAweDYwMDMsIDB4MDAwMiwgMHg2MTEwLCAweDIxNjgsIDB4Njk0YywgMHhkMWU0LCAweDAwNDAsCisJMHg4NzBjLCAweDYwM2YsIDB4MDAwMCwgMHgwZjdlLCAweDJjNzgsIDB4MTA3OCwgMHg0OTYzLCAweDBmN2YsCisJMHgwMDQwLCAweDg2MjIsIDB4NjgxNCwgMHg2OTEwLCAweGExMTUsIDB4MDA0MCwgMHg4NjIyLCAweDZhNjAsCisJMHhhMjA2LCAweDAwYzAsIDB4ODVmZiwgMHg2ODVjLCAweGExMDYsIDB4MDA0MCwgMHg4NjIyLCAweDY4NGMsCisJMHhjMGU0LCAweDY4NGUsIDB4Njg0NywgMHgwMDAwLCAweDY4NjMsIDB4MDAwMCwgMHg2ODVmLCAweDAwMDAsCisJMHg2MDI0LCAweGQwZjQsIDB4MDBjMCwgMHg4NjE3LCAweDY5N2MsIDB4NjgxMCwgMHhhMTAyLCAweDYwM2EsCisJMHg2OTgwLCAweDY4MTQsIDB4YTEwMywgMHg2MDM2LCAweDYwMjQsIDB4YzBmNSwgMHg2MDI2LCAweDBkN2UsCisJMHg2MDE4LCAweDIwNjgsIDB4NjgzYywgMHg4MDAwLCAweDY4M2UsIDB4MGQ3ZiwgMHgxMDc4LCAweDhmYmYsCisJMHgwMDc4LCAweDg3MGMsIDB4Njk0YywgMHhkMWNjLCAweDAwNDAsIDB4ODZkMSwgMHg2OTQ4LCAweDY4MzgsCisJMHhkMGZjLCAweDAwNDAsIDB4ODY4OSwgMHgwMTdlLCAweDY4NGMsIDB4MDA3ZSwgMHg2ODUwLCAweDAwN2UsCisJMHgwZjdlLCAweDIxNzgsIDB4Nzk0NCwgMHhhMTg0LCAweDAwZmYsIDB4YTBiNiwgMHgwMDAyLCAweDAwNDAsCisJMHg4NjVjLCAweGEwODYsIDB4MDAyOCwgMHgwMGMwLCAweDg2NDMsIDB4Njg0YiwgMHgwMDFjLCAweDc4NGIsCisJMHgwMDFjLCAweDAwNzgsIDB4ODY2NywgMHhkMWRjLCAweDAwNDAsIDB4ODY1MywgMHg2ODRiLCAweDAwMTUsCisJMHg3ODRiLCAweDAwMTUsIDB4MTA3OCwgMHg5MTZjLCAweDAwNDAsIDB4ODY1MSwgMHg3OTQ0LCAweGMxZGMsCisJMHg3OTQ2LCAweDAwNzgsIDB4ODY2NywgMHhkMWQ0LCAweDAwNDAsIDB4ODY1YywgMHg2ODRiLCAweDAwMDcsCisJMHg3ODRiLCAweDAwMDcsIDB4MDA3OCwgMHg4NjY3LCAweDY4NGMsIDB4ZDBhYywgMHgwMDQwLCAweDg2NjcsCisJMHg2ODEwLCAweDY5MTQsIDB4YTExNSwgMHgwMDQwLCAweDg2NjcsIDB4MTA3OCwgMHg4NGQ1LCAweDY4NDgsCisJMHg3ODRhLCAweDY4NjAsIDB4Nzg2MiwgMHg2ODVjLCAweDc4NWUsIDB4YWQ5MCwgMHgwMDBkLCAweGFmOTgsCisJMHgwMDBkLCAweDIwMDksIDB4MDAyMCwgMHgxNTdlLCAweDIxYTgsIDB4MjMwNCwgMHgyMDEyLCAweDgzMTgsCisJMHg4MjEwLCAweDAwZjAsIDB4ODY3NSwgMHgxNTdmLCAweDBmN2YsIDB4MDA3ZiwgMHg2ODUyLCAweDAwN2YsCisJMHg2ODRlLCAweDEwNzgsIDB4OTFmNCwgMHgwMTdmLCAweDIxNjgsIDB4MTA3OCwgMHgxM2I0LCAweDAwNzgsCisJMHg4NzA2LCAweDAxN2UsIDB4MGY3ZSwgMHgyMTc4LCAweDc5NDQsIDB4YTE4NCwgMHgwMGZmLCAweGEwYjYsCisJMHgwMDAyLCAweDAwNDAsIDB4ODZiNiwgMHhhMDg2LCAweDAwMjgsIDB4MDBjMCwgMHg4NjlkLCAweDY4NGIsCisJMHgwMDFjLCAweDc4NGIsIDB4MDAxYywgMHgwMDc4LCAweDg2YzEsIDB4ZDFkYywgMHgwMDQwLCAweDg2YWQsCisJMHg2ODRiLCAweDAwMTUsIDB4Nzg0YiwgMHgwMDE1LCAweDEwNzgsIDB4OTE2YywgMHgwMDQwLCAweDg2YWIsCisJMHg3OTQ0LCAweGMxZGMsIDB4Nzk0NiwgMHgwMDc4LCAweDg2YzEsIDB4ZDFkNCwgMHgwMDQwLCAweDg2YjYsCisJMHg2ODRiLCAweDAwMDcsIDB4Nzg0YiwgMHgwMDA3LCAweDAwNzgsIDB4ODZjMSwgMHg2ODRjLCAweGQwYWMsCisJMHgwMDQwLCAweDg2YzEsIDB4NjgxMCwgMHg2OTE0LCAweGExMTUsIDB4MDA0MCwgMHg4NmMxLCAweDEwNzgsCisJMHg4NGQ1LCAweDY4NjAsIDB4Nzg2MiwgMHg2ODVjLCAweDc4NWUsIDB4Njg0YywgMHg3ODRlLCAweDBmN2YsCisJMHgxMDc4LCAweDEzYjQsIDB4MGQ3ZiwgMHgxMDc4LCAweDkxZjQsIDB4MTA3OCwgMHg4OWNmLCAweDAwNzgsCisJMHg4NzA2LCAweDY4MzcsIDB4MDEwMywgMHg2OTQ0LCAweGExODQsIDB4MDBmZiwgMHhhMGI2LCAweDAwMDIsCisJMHgwMDQwLCAweDg2ZjcsIDB4YTA4NiwgMHgwMDI4LCAweDAwYzAsIDB4ODZlMiwgMHg2ODRiLCAweDAwMWMsCisJMHgwMDc4LCAweDg3MDQsIDB4ZDFkYywgMHgwMDQwLCAweDg2ZjAsIDB4Njg0YiwgMHgwMDE1LCAweDEwNzgsCisJMHg5MTZjLCAweDAwNDAsIDB4ODZlZSwgMHg2OTQ0LCAweGMxZGMsIDB4Njk0NiwgMHgwMDc4LCAweDg3MDQsCisJMHhkMWQ0LCAweDAwNDAsIDB4ODZmNywgMHg2ODRiLCAweDAwMDcsIDB4MDA3OCwgMHg4NzA0LCAweDY4NGIsCisJMHgwMDAwLCAweDY4NGMsIDB4ZDBhYywgMHgwMDQwLCAweDg3MDQsIDB4NjgxMCwgMHg2OTE0LCAweGExMTUsCisJMHgwMDQwLCAweDg3MDQsIDB4MTA3OCwgMHg4NGQ1LCAweDEwNzgsIDB4NGE3MywgMHgxMDc4LCAweDhmODksCisJMHgwMGMwLCAweDg3MGMsIDB4MTA3OCwgMHg3NzJkLCAweDBkN2YsIDB4MDA3YywgMHgxMDc4LCAweDYxY2QsCisJMHgwMDc4LCAweDg3MTQsIDB4MTA3OCwgMHg2MjdhLCAweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDg3MzMsCisJMHgwZDdlLCAweDYxMTAsIDB4MjE2OCwgMHg2ODM3LCAweDAxMDMsIDB4MjAwOSwgMHhhNjBjLCAweDIxMGMsCisJMHhkMThjLCAweDAwYzAsIDB4ODczZSwgMHhkMTg0LCAweDAwYzAsIDB4ODczYSwgMHg2MTA4LCAweDY5NGEsCisJMHhhMThlLCAweDAwMjksIDB4MDBjMCwgMHg4NzJlLCAweDEwNzgsIDB4YTRlMiwgMHg2ODQ3LCAweDAwMDAsCisJMHgxMDc4LCAweDRhNzMsIDB4MGQ3ZiwgMHgxMDc4LCAweDc3MmQsIDB4MTA3OCwgMHg2MmQxLCAweDEwNzgsCisJMHg2MzliLCAweDAwN2MsIDB4Njg0YiwgMHgwMDA0LCAweDAwNzgsIDB4ODcyZSwgMHg2ODRiLCAweDAwMDQsCisJMHgwMDc4LCAweDg3MmUsIDB4YTE4MiwgMHgwMDQwLCAweDAwNzksIDB4ODc0NiwgMHg4NzU5LCAweDg3NTksCisJMHg4NzU5LCAweDg3NTksIDB4ODc1OSwgMHg4NzViLCAweDg3NTksIDB4ODc1ZSwgMHg4NzU5LCAweDg3NTksCisJMHg4NzU5LCAweDg3NTksIDB4ODc1OSwgMHg4NzU5LCAweDg3NTksIDB4ODc1OSwgMHg4NzU5LCAweDg3NTksCisJMHg4NzU5LCAweDEwNzgsIDB4MTMzMiwgMHgxMDc4LCAweDc3MmQsIDB4MDA3YywgMHgwMDdlLCAweDAyN2UsCisJMHhhMDE2LCAweDEwNzgsIDB4MTVmYSwgMHgwMjdmLCAweDAwN2YsIDB4MDA3YywgMHhhMTgyLCAweDAwODUsCisJMHgwMDc5LCAweDg3NmEsIDB4ODc3MywgMHg4NzcxLCAweDg3NzEsIDB4ODc3ZiwgMHg4NzcxLCAweDg3NzEsCisJMHg4NzcxLCAweDEwNzgsIDB4MTMzMiwgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgxMDc4LCAweDVkOGEsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDYyZDEsIDB4MTI3ZiwgMHgwMDdjLCAweDAyN2UsCisJMHgwNTdlLCAweDBkN2UsIDB4MGU3ZSwgMHgyMDcxLCAweGFiODAsIDB4NzIyNCwgMHg2MjEyLCAweDcyMjAsCisJMHgxMDc4LCAweDhjZjIsIDB4MDA0MCwgMHg4N2E0LCAweDIyNjgsIDB4NjgwMCwgMHhhMDg2LCAweDAwMDAsCisJMHgwMDQwLCAweDg3YTQsIDB4NjAxOCwgMHg2ZDE4LCAweGE1MmUsIDB4MDBjMCwgMHg4N2E0LCAweDBjN2UsCisJMHgyZDYwLCAweDEwNzgsIDB4ODlmMywgMHgwYzdmLCAweDAwNDAsIDB4ODdhNCwgMHg2ODAzLCAweDAwMDIsCisJMHg2MDA3LCAweDAwODYsIDB4MDA3OCwgMHg4N2E2LCAweDYwMDcsIDB4MDA4NywgMHg2MDAzLCAweDAwMDEsCisJMHgxMDc4LCAweDVkOGEsIDB4MTA3OCwgMHg2MmQxLCAweDBmN2UsIDB4MjI3OCwgMHgxMDc4LCAweDQ5NjMsCisJMHgwZjdmLCAweDAwNDAsIDB4ODdiZSwgMHg2ODI0LCAweGQwZWMsIDB4MDA0MCwgMHg4N2JlLCAweDBjN2UsCisJMHgyMjYwLCAweDYwM2YsIDB4MDAwMCwgMHgxMDc4LCAweDhmYmYsIDB4MGM3ZiwgMHgwZTdmLCAweDBkN2YsCisJMHgwNTdmLCAweDAyN2YsIDB4MDA3YywgMHhhMTg2LCAweDAwMTMsIDB4MDBjMCwgMHg4N2Q0LCAweDYwMDQsCisJMHhhMDhhLCAweDAwODUsIDB4MTA0OCwgMHgxMzMyLCAweGEwOGEsIDB4MDA4YywgMHgxMGM4LCAweDEzMzIsCisJMHhhMDgyLCAweDAwODUsIDB4MDA3OSwgMHg4N2UzLCAweGExODYsIDB4MDAyNywgMHgwMDQwLCAweDg3ZGMsCisJMHhhMTg2LCAweDAwMTQsIDB4MTBjMCwgMHgxMzMyLCAweDEwNzgsIDB4NjFjZCwgMHgxMDc4LCAweDhlYzYsCisJMHgxMDc4LCAweDYyZDEsIDB4MDA3YywgMHg4N2VhLCAweDg3ZWMsIDB4ODdlYywgMHg4N2VhLCAweDg3ZWEsCisJMHg4N2VhLCAweDg3ZWEsIDB4MTA3OCwgMHgxMzMyLCAweDEwNzgsIDB4NjFjZCwgMHgxMDc4LCAweDhlYzYsCisJMHgxMDc4LCAweDYyZDEsIDB4MDA3YywgMHhhMTg2LCAweDAwMTMsIDB4MDBjMCwgMHg4N2ZkLCAweDYwMDQsCisJMHhhMDgyLCAweDAwODUsIDB4MjAwOCwgMHgwMDc4LCAweDg4MzgsIDB4YTE4NiwgMHgwMDI3LCAweDAwYzAsCisJMHg4ODIwLCAweDEwNzgsIDB4NjFjZCwgMHgxMDc4LCAweDI4ODAsIDB4MGQ3ZSwgMHg2MDEwLCAweDIwNjgsCisJMHgxMDc4LCAweDhkMDYsIDB4MDA0MCwgMHg4ODE2LCAweDY4MzcsIDB4MDEwMywgMHg2ODQ3LCAweDAwMDAsCisJMHg2ODRiLCAweDAwMjksIDB4MTA3OCwgMHg0YTczLCAweDEwNzgsIDB4OGViOSwgMHgwZDdmLCAweDEwNzgsCisJMHg3NzJkLCAweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweDEwNzgsIDB4Nzc3MywgMHgwMDc4LCAweDg4MWIsCisJMHhhMTg2LCAweDAwMTQsIDB4MDBjMCwgMHg4ODFjLCAweDEwNzgsIDB4NjFjZCwgMHgwZDdlLCAweDYwMTAsCisJMHgyMDY4LCAweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDg4MTYsIDB4NjgzNywgMHgwMTAzLCAweDY4NDcsCisJMHgwMDAwLCAweDY4NGIsIDB4MDAwNiwgMHg2ODUwLCAweGMwZWMsIDB4Njg1MiwgMHgwMDc4LCAweDg4MTIsCisJMHgwMDc5LCAweDg4M2EsIDB4ODg0MywgMHg4ODQxLCAweDg4NDEsIDB4ODg0MSwgMHg4ODQxLCAweDg4NDEsCisJMHg4ODVlLCAweDEwNzgsIDB4MTMzMiwgMHgxMDc4LCAweDYxY2QsIDB4NjAzMCwgMHhhMDhjLCAweGZmMDAsCisJMHg4MTBmLCAweGExODYsIDB4MDAzOSwgMHgwMDQwLCAweDg4NTEsIDB4YTE4NiwgMHgwMDM1LCAweDAwYzAsCisJMHg4ODU1LCAweDIwMDEsIDB4YThhMiwgMHgwMDc4LCAweDg4NTcsIDB4MjAwMSwgMHhhOGEzLCAweDIwMDQsCisJMHg2MDE2LCAweDYwMDMsIDB4MDAwYywgMHgxMDc4LCAweDYyZDEsIDB4MDA3YywgMHgxMDc4LCAweDYxY2QsCisJMHg2MDMwLCAweGEwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweGExODYsIDB4MDAzOSwgMHgwMDQwLCAweDg4NmMsCisJMHhhMTg2LCAweDAwMzUsIDB4MDBjMCwgMHg4ODcwLCAweDIwMDEsIDB4YThhMiwgMHgwMDc4LCAweDg4NzIsCisJMHgyMDAxLCAweGE4YTMsIDB4MjAwNCwgMHg2MDE2LCAweDYwMDMsIDB4MDAwZSwgMHgxMDc4LCAweDYyZDEsCisJMHgwMDdjLCAweGExODIsIDB4MDA4YywgMHgwMGM4LCAweDg4ODMsIDB4YTE4MiwgMHgwMDg1LCAweDAwNDgsCisJMHg4ODgzLCAweDAwNzksIDB4ODg4NiwgMHgxMDc4LCAweDc3NzMsIDB4MDA3YywgMHg4ODhkLCAweDg4OGQsCisJMHg4ODhkLCAweDg4OGQsIDB4ODg4ZiwgMHg4OGVjLCAweDg4OGQsIDB4MTA3OCwgMHgxMzMyLCAweDBmN2UsCisJMHgyYzc4LCAweDEwNzgsIDB4NDk2MywgMHgwZjdmLCAweDAwNDAsIDB4ODhhMiwgMHg2MDMwLCAweGEwOGMsCisJMHhmZjAwLCAweDgxMGYsIDB4YTE4NiwgMHgwMDM5LCAweDAwNDAsIDB4ODkwMywgMHhhMTg2LCAweDAwMzUsCisJMHgwMDQwLCAweDg5MDMsIDB4MGQ3ZSwgMHgxMDc4LCAweDhkMDYsIDB4MDBjMCwgMHg4OGFiLCAweDEwNzgsCisJMHg4ZWI5LCAweDAwNzgsIDB4ODhjZSwgMHg2MDEwLCAweDIwNjgsIDB4Njg0YywgMHhkMGU0LCAweDAwYzAsCisJMHg4OGIzLCAweDEwNzgsIDB4OGViOSwgMHg2ODM3LCAweDAxMDMsIDB4Njg1MCwgMHhkMGI0LCAweDAwNDAsCisJMHg4OGJmLCAweDY4NGIsIDB4MDAwNiwgMHhjMGVjLCAweDY4NTIsIDB4MDA3OCwgMHg4OGNhLCAweGQwYmMsCisJMHgwMDQwLCAweDg4YzYsIDB4Njg0YiwgMHgwMDAyLCAweDAwNzgsIDB4ODhjYSwgMHg2ODRiLCAweDAwMDUsCisJMHgxMDc4LCAweDhmODUsIDB4Njg0NywgMHgwMDAwLCAweDEwNzgsIDB4NGE3MywgMHgyYzY4LCAweDEwNzgsCisJMHg3NmM3LCAweDAwNDAsIDB4ODhlNywgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDFlLCAweDIwMDksCisJMHhhYjhlLCAweDIxMGMsIDB4NjEzNiwgMHgyMDA5LCAweGFiOGYsIDB4MjEwYywgMHg2MTNhLCAweDY5MTgsCisJMHg2MTFhLCAweDY5MjAsIDB4NjEyMiwgMHg2MDFmLCAweDAwMDEsIDB4MTA3OCwgMHg1ZDhhLCAweDJkNjAsCisJMHgxMDc4LCAweDc3MmQsIDB4MGQ3ZiwgMHgwMDdjLCAweDBmN2UsIDB4MmM3OCwgMHgxMDc4LCAweDQ5NjMsCisJMHgwZjdmLCAweDAwNDAsIDB4ODkyOSwgMHg2MDMwLCAweGEwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweGExODYsCisJMHgwMDM1LCAweDAwNDAsIDB4ODkwMywgMHhhMTg2LCAweDAwMWUsIDB4MDA0MCwgMHg4OTAzLCAweGExODYsCisJMHgwMDM5LCAweDAwYzAsIDB4ODkyOSwgMHgwZDdlLCAweDJjNjgsIDB4MTA3OCwgMHg5MWJjLCAweDAwYzAsCisJMHg4OTRkLCAweDEwNzgsIDB4NzZjNywgMHgwMDQwLCAweDg5MjYsIDB4NjEwNiwgMHg2MDAzLCAweDAwMDEsCisJMHg2MDFmLCAweDAwMDEsIDB4NjkxOCwgMHg2MTFhLCAweDY5MjgsIDB4NjEyYSwgMHg2OTJjLCAweDYxMmUsCisJMHg2OTMwLCAweGExOGMsIDB4MDBmZiwgMHg2MTMyLCAweDY5MzQsIDB4NjEzNiwgMHg2OTM4LCAweDYxM2EsCisJMHg2OTIwLCAweDYxMjIsIDB4MTA3OCwgMHg1ZDhhLCAweDEwNzgsIDB4NjJkMSwgMHgyZDYwLCAweDAwNzgsCisJMHg4OTRkLCAweDBkN2UsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDg5NGQsCisJMHg2ODM3LCAweDAxMDMsIDB4Njg1MCwgMHhkMGI0LCAweDAwNDAsIDB4ODkzYywgMHhjMGVjLCAweDY4NTIsCisJMHg2ODRiLCAweDAwMDYsIDB4MDA3OCwgMHg4OTQ3LCAweGQwYmMsIDB4MDA0MCwgMHg4OTQzLCAweDY4NGIsCisJMHgwMDAyLCAweDAwNzgsIDB4ODk0NywgMHg2ODRiLCAweDAwMDUsIDB4MTA3OCwgMHg4Zjg1LCAweDY4NDcsCisJMHgwMDAwLCAweDEwNzgsIDB4NGE3MywgMHgxMDc4LCAweDhlYjksIDB4MGQ3ZiwgMHgxMDc4LCAweDc3MmQsCisJMHgwMDdjLCAweDAxN2UsIDB4MGQ3ZSwgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4ZDA2LCAweDAwNDAsCisJMHg4OTYxLCAweDY4MzcsIDB4MDEwMywgMHg2ODRiLCAweDAwMjgsIDB4Njg0NywgMHgwMDAwLCAweDEwNzgsCisJMHg0YTczLCAweDBkN2YsIDB4MDE3ZiwgMHhhMTg2LCAweDAwMTMsIDB4MDA0MCwgMHg4OTczLCAweGExODYsCisJMHgwMDE0LCAweDAwNDAsIDB4ODk3MywgMHhhMTg2LCAweDAwMjcsIDB4MDA0MCwgMHg4OTczLCAweDEwNzgsCisJMHg3NzczLCAweDAwNzgsIDB4ODk3OSwgMHgxMDc4LCAweDYxY2QsIDB4MTA3OCwgMHg4ZWM2LCAweDEwNzgsCisJMHg2MmQxLCAweDAwN2MsIDB4MDU3ZSwgMHgwNjdlLCAweDBkN2UsIDB4MGY3ZSwgMHgyMDI5LCAweDAwMDEsCisJMHhhMTgyLCAweDAxMDEsIDB4MDBjOCwgMHg4OTg2LCAweDAwNzgsIDB4ODk4OCwgMHgyMDA5LCAweDAxMDAsCisJMHgyMTMwLCAweDIwNjksIDB4YWI5OCwgMHg4MzFjLCAweDIzMDAsIDB4YWQxOCwgMHgyMDA5LCAweDAwMjAsCisJMHhhZjkwLCAweDAwMWQsIDB4MTA3OCwgMHg4OWUyLCAweGE2YjIsIDB4MDAyMCwgMHg3ODA0LCAweGEwNmQsCisJMHgwMDQwLCAweDg5OWMsIDB4MTA3OCwgMHgxM2I0LCAweDEwNzgsIDB4MTM4YiwgMHgwMDQwLCAweDg5YzYsCisJMHg4NTI4LCAweDY4MzcsIDB4MDExMCwgMHg2ODNiLCAweDAwMDAsIDB4MmQyMCwgMHg3YzA2LCAweGE2OGEsCisJMHgwMDNkLCAweDAwYzgsIDB4ODliMiwgMHgyNjA4LCAweGFkOTAsIDB4MDAwZiwgMHgxMDc4LCAweDg5ZTIsCisJMHgwMDc4LCAweDg5YzYsIDB4YTZiMiwgMHgwMDNjLCAweDIwMDksIDB4MDAzYywgMHgyZDc4LCAweGFkOTAsCisJMHgwMDBmLCAweDEwNzgsIDB4ODllMiwgMHgwMDc4LCAweDg5OWMsIDB4MGY3ZiwgMHg4NTJmLCAweGE1YWQsCisJMHgwMDAzLCAweDdkMzYsIDB4YTVhYywgMHgwMDAwLCAweDAwNzgsIDB4ODljYiwgMHgwZjdmLCAweDg1MmYsCisJMHhhNWFkLCAweDAwMDMsIDB4N2QzNiwgMHgwZDdmLCAweDA2N2YsIDB4MDU3ZiwgMHgwMDdjLCAweDBmN2UsCisJMHg4ZGZmLCAweDAwNDAsIDB4ODllMCwgMHg2ODA0LCAweGEwN2QsIDB4MDA0MCwgMHg4OWRlLCAweDY4MDcsCisJMHgwMDAwLCAweDEwNzgsIDB4NGE3MywgMHgyZjY4LCAweDAwNzgsIDB4ODlkMywgMHgxMDc4LCAweDRhNzMsCisJMHgwZjdmLCAweDAwN2MsIDB4MTU3ZSwgMHhhMTg0LCAweDAwMDEsIDB4MDA0MCwgMHg4OWU4LCAweDgxMDgsCisJMHg4MTBjLCAweDIxYTgsIDB4MjMwNCwgMHg4MDA3LCAweDIwMTIsIDB4ODMxOCwgMHg4MjEwLCAweDAwZjAsCisJMHg4OWVhLCAweDE1N2YsIDB4MDA3YywgMHgwNjdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwMzEsCisJMHgwMDAxLCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLCAweDEwNzksIDB4OGEwZiwgMHgxMjdmLCAweDA2N2YsCisJMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDA2N2UsIDB4MjAzMSwgMHgwMDAwLCAweDYwMWMsCisJMHhhMDg0LCAweDAwMGYsIDB4MTA3OSwgMHg4YTBmLCAweDA2N2YsIDB4MTI3ZiwgMHgwMDdjLCAweDhhMjksCisJMHg4YTE3LCAweDhhMjQsIDB4OGE0NSwgMHg4YTE3LCAweDhhMjQsIDB4OGE0NSwgMHg4YTI0LCAweDEwNzgsCisJMHgxMzMyLCAweDAzN2UsIDB4MjAxOSwgMHgwMDEwLCAweDEwNzgsIDB4OWRjNywgMHg2MDFmLCAweDAwMDYsCisJMHg2MDAzLCAweDAwMDcsIDB4MDM3ZiwgMHgwMDdjLCAweGEwMDYsIDB4MDA3YywgMHhhMDg1LCAweDAwMDEsCisJMHgwMDdjLCAweDBkN2UsIDB4ODZmZiwgMHgwMGMwLCAweDhhNDAsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsCisJMHg4ZDA2LCAweDAwNDAsIDB4OGE0MiwgMHhhMDBlLCAweDIwMDEsIDB4MDAwNSwgMHgxMDc4LCAweDRiNTEsCisJMHgxMDc4LCAweDhmODUsIDB4MTA3OCwgMHg0YTczLCAweDEwNzgsIDB4NzcyZCwgMHhhMDg1LCAweDAwMDEsCisJMHgwZDdmLCAweDAwN2MsIDB4YTAwNiwgMHgwMDc4LCAweDhhNDAsIDB4NjAwMCwgMHhhMDhhLCAweDAwMTAsCisJMHgxMGM4LCAweDEzMzIsIDB4MTA3OSwgMHg4YTRkLCAweDAwN2MsIDB4OGE1ZCwgMHg4YTgyLCAweDhhNWYsCisJMHg4YWE1LCAweDhhN2UsIDB4OGE1ZCwgMHg4YTI0LCAweDhhMjksIDB4OGEyOSwgMHg4YTI0LCAweDhhMjQsCisJMHg4YTI0LCAweDhhMjQsIDB4OGEyNCwgMHg4YTI0LCAweDhhMjQsIDB4MTA3OCwgMHgxMzMyLCAweDg2ZmYsCisJMHgwMGMwLCAweDhhN2IsIDB4NjAxYywgMHhhMDg2LCAweDAwMDYsIDB4MDA0MCwgMHg4YTdiLCAweDBkN2UsCisJMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4ZDA2LCAweDAwNDAsIDB4OGE3MCwgMHgxMDc4LCAweDhmODUsCisJMHgwZDdmLCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAxZiwgMHgwMDAyLCAweDEwNzgsCisJMHg1ZDhhLCAweDEwNzgsIDB4NjJkMSwgMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHgxMDc4LCAweDE3NTcsCisJMHgwMDc4LCAweDhhNWYsIDB4MGU3ZSwgMHgyMDcxLCAweGE4YjEsIDB4NzAyNCwgMHhhYzA2LCAweDAwYzAsCisJMHg4YThiLCAweDEwNzgsIDB4NmZjNCwgMHg2MDFjLCAweGEwODQsIDB4MDAwZiwgMHhhMDg2LCAweDAwMDYsCisJMHgwMGMwLCAweDhhOWQsIDB4MDg3ZSwgMHgwOTdlLCAweDIwNDksIDB4MDAwMSwgMHgyYzQwLCAweDEwNzgsCisJMHg3MjQ2LCAweDA5N2YsIDB4MDg3ZiwgMHgwMDc4LCAweDhhOWYsIDB4MTA3OCwgMHg2ZWJlLCAweDBlN2YsCisJMHgwMGMwLCAweDhhNWYsIDB4MTA3OCwgMHg4YTI0LCAweDAwN2MsIDB4MDM3ZSwgMHgwZTdlLCAweDIwNzEsCisJMHhhOGIxLCAweDcwM2MsIDB4YWMwNiwgMHgwMGMwLCAweDhhYjUsIDB4MjAxOSwgMHgwMDAwLCAweDEwNzgsCisJMHg3MDU4LCAweDBlN2YsIDB4MDM3ZiwgMHgwMDc4LCAweDhhNWYsIDB4MTA3OCwgMHg3MzhhLCAweDBlN2YsCisJMHgwMzdmLCAweDAwYzAsIDB4OGE1ZiwgMHgxMDc4LCAweDhhMjQsIDB4MDA3YywgMHgwYzdlLCAweDYwMWMsCisJMHhhMDg0LCAweDAwMGYsIDB4MTA3OSwgMHg4YWM2LCAweDBjN2YsIDB4MDA3YywgMHg4YWQ1LCAweDhiNDcsCisJMHg4YzdmLCAweDhhZTAsIDB4OGVjNiwgMHg4YWQ1LCAweDlkYjgsIDB4NzcyZCwgMHg4YjQ3LCAweDEwNzgsCisJMHg4ZjAwLCAweDAwYzAsIDB4OGFkNSwgMHgxMDc4LCAweDdjODMsIDB4MDA3YywgMHgxMDc4LCAweDYxY2QsCisJMHgxMDc4LCAweDYyZDEsIDB4MTA3OCwgMHg3NzJkLCAweDAwN2MsIDB4NjAxNywgMHgwMDAxLCAweDAwN2MsCisJMHgxMDc4LCAweDhkMDYsIDB4MDA0MCwgMHg4YWU4LCAweDYwMTAsIDB4YTA4MCwgMHgwMDE5LCAweDJjMDIsCisJMHg2MDAwLCAweGEwOGEsIDB4MDAxMCwgMHgxMGM4LCAweDEzMzIsIDB4MTA3OSwgMHg4YWYwLCAweDAwN2MsCisJMHg4YjAwLCAweDhiMDIsIDB4OGIyNCwgMHg4YjM2LCAweDhiNDMsIDB4OGIwMCwgMHg4YWQ1LCAweDhhZDUsCisJMHg4YWQ1LCAweDhiMzYsIDB4OGIzNiwgMHg4YjAwLCAweDhiMDAsIDB4OGIwMCwgMHg4YjAwLCAweDhiNDAsCisJMHgxMDc4LCAweDEzMzIsIDB4MGU3ZSwgMHg2MDEwLCAweDIwNzAsIDB4NzA1MCwgMHhjMGI1LCAweDcwNTIsCisJMHgyMDcxLCAweGE4YjEsIDB4NzAyNCwgMHhhYzA2LCAweDAwNDAsIDB4OGIyMCwgMHgxMDc4LCAweDZlYmUsCisJMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMWYsIDB4MDAwMiwgMHgyMDAxLCAweGE4YTMsCisJMHgyMDA0LCAweDYwMTYsIDB4MTA3OCwgMHg1ZDhhLCAweDEwNzgsIDB4NjJkMSwgMHgwZTdmLCAweDAwN2MsCisJMHg2MDE3LCAweDAwMDEsIDB4MDA3OCwgMHg4YjFlLCAweDBkN2UsIDB4NjAxMCwgMHgyMDY4LCAweDY4NTAsCisJMHhjMGI1LCAweDY4NTIsIDB4MGQ3ZiwgMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMWYsCisJMHgwMDAyLCAweDEwNzgsIDB4NWQ4YSwgMHgxMDc4LCAweDYyZDEsIDB4MDA3YywgMHgwZDdlLCAweDYwMTcsCisJMHgwMDAxLCAweDYwMTAsIDB4MjA2OCwgMHg2ODUwLCAweGMwYjUsIDB4Njg1MiwgMHgwZDdmLCAweDAwN2MsCisJMHgxMDc4LCAweDc3MmQsIDB4MDA3YywgMHgxMDc4LCAweDE3NTcsIDB4MDA3OCwgMHg4YjI0LCAweDYwMDAsCisJMHhhMDhhLCAweDAwMTAsIDB4MTBjOCwgMHgxMzMyLCAweDEwNzksIDB4OGI0ZiwgMHgwMDdjLCAweDhiNWYsCisJMHg4YWRkLCAweDhiNjEsIDB4OGI1ZiwgMHg4YjYxLCAweDhiNjEsIDB4OGFkNiwgMHg4YjVmLCAweDhhY2YsCisJMHg4YWNmLCAweDhiNWYsIDB4OGI1ZiwgMHg4YjVmLCAweDhiNWYsIDB4OGI1ZiwgMHg4YjVmLCAweDEwNzgsCisJMHgxMzMyLCAweDBkN2UsIDB4NjAxOCwgMHgyMDY4LCAweDY4MDQsIDB4YTA4NCwgMHgwMGZmLCAweDBkN2YsCisJMHhhMDhhLCAweDAwMGMsIDB4MTBjOCwgMHgxMzMyLCAweDEwNzksIDB4OGI2ZiwgMHgwMDdjLCAweDhiN2IsCisJMHg4YzIzLCAweDhiN2QsIDB4OGJiZCwgMHg4YjdkLCAweDhiYmQsIDB4OGI3ZCwgMHg4YjhhLCAweDhiN2IsCisJMHg4YmJkLCAweDhiN2IsIDB4OGJhNywgMHgxMDc4LCAweDEzMzIsIDB4NjAwNCwgMHhhMDhlLCAweDAwMTYsCisJMHgwMDQwLCAweDhiYjgsIDB4YTA4ZSwgMHgwMDA0LCAweDAwNDAsIDB4OGJiOCwgMHhhMDhlLCAweDAwMDIsCisJMHgwMDQwLCAweDhiYjgsIDB4NjAwNCwgMHgxMDc4LCAweDhmMDAsIDB4MDA0MCwgMHg4YzNlLCAweGEwOGUsCisJMHgwMDIxLCAweDAwNDAsIDB4OGM0MiwgMHhhMDhlLCAweDAwMjIsIDB4MDA0MCwgMHg4YzNlLCAweGEwOGUsCisJMHgwMDNkLCAweDAwNDAsIDB4OGM0MiwgMHhhMDhlLCAweDAwMzksIDB4MDA0MCwgMHg4YzQ2LCAweGEwOGUsCisJMHgwMDM1LCAweDAwNDAsIDB4OGM0NiwgMHhhMDhlLCAweDAwMWUsIDB4MDA0MCwgMHg4YmJhLCAweGEwOGUsCisJMHgwMDAxLCAweDAwYzAsIDB4OGJiNiwgMHgwZDdlLCAweDYwMTgsIDB4MjA2OCwgMHg2ODA0LCAweGEwODQsCisJMHgwMGZmLCAweDBkN2YsIDB4YTA4NiwgMHgwMDA2LCAweDAwNDAsIDB4OGJiOCwgMHgxMDc4LCAweDI4ODAsCisJMHgxMDc4LCAweDdjODMsIDB4MTA3OCwgMHg4ZWM2LCAweDAwN2MsIDB4MGM3ZSwgMHgwZDdlLCAweDYxMDQsCisJMHhhMTg2LCAweDAwMTYsIDB4MDA0MCwgMHg4YzEzLCAweGExODYsIDB4MDAwMiwgMHgwMGMwLCAweDhiZTYsCisJMHg2MDE4LCAweDIwNjgsIDB4NjhhMCwgMHhkMGJjLCAweDAwYzAsIDB4OGM2YSwgMHg2ODQwLCAweGEwODQsCisJMHgwMGZmLCAweGEwMDUsIDB4MDA0MCwgMHg4YmU2LCAweDgwMDEsIDB4Njg0MiwgMHg2MDEzLCAweDAwMDAsCisJMHg2MDFmLCAweDAwMDcsIDB4NjAxNywgMHgwMzk4LCAweDEwNzgsIDB4NzZjNywgMHgwMDQwLCAweDhiZTYsCisJMHgyZDAwLCAweDYwMWEsIDB4NjAxZiwgMHgwMDAxLCAweDAwNzgsIDB4OGMxMywgMHgwZDdmLCAweDBjN2YsCisJMHg2MDA0LCAweGEwOGUsIDB4MDAwMiwgMHgwMGMwLCAweDhjMDQsIDB4NjAxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweGEwODYsIDB4MDA3ZSwgMHgwMGMwLCAweDhjMDQsIDB4MjAwOSwgMHhhNjMzLCAweDIxMDQsCisJMHhjMDg1LCAweDIwMGEsIDB4MGU3ZSwgMHgyMDcxLCAweGE2MDAsIDB4MTA3OCwgMHg0MmI4LCAweDBlN2YsCisJMHgxMDc4LCAweDdjODMsIDB4MDA3OCwgMHg4YzA4LCAweDEwNzgsIDB4N2M4MywgMHgxMDc4LCAweDI4ODAsCisJMHgwZTdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4MjhhNiwgMHgxMjdmLCAweDBlN2YsCisJMHgxMDc4LCAweDhlYzYsIDB4MDA3YywgMHgyMDAxLCAweDAwMDIsIDB4MTA3OCwgMHg0NTAyLCAweDYwMDMsCisJMHgwMDAxLCAweDYwMDcsIDB4MDAwMiwgMHgxMDc4LCAweDVkZDcsIDB4MTA3OCwgMHg2MmQxLCAweDBkN2YsCisJMHgwYzdmLCAweDAwNzgsIDB4OGMxMiwgMHgwYzdlLCAweDBkN2UsIDB4NjEwNCwgMHhhMTg2LCAweDAwMTYsCisJMHgwMDQwLCAweDhjMTMsIDB4NjAxOCwgMHgyMDY4LCAweDY4NDAsIDB4YTA4NCwgMHgwMGZmLCAweGEwMDUsCisJMHgwMDQwLCAweDhiZTYsIDB4ODAwMSwgMHg2ODQyLCAweDYwMDMsIDB4MDAwMSwgMHgxMDc4LCAweDVkZDcsCisJMHgxMDc4LCAweDYyZDEsIDB4MGQ3ZiwgMHgwYzdmLCAweDAwNzgsIDB4OGMxMiwgMHgxMDc4LCAweDdjODMsCisJMHgwMDc4LCAweDhiYmEsIDB4MTA3OCwgMHg3Y2E2LCAweDAwNzgsIDB4OGJiYSwgMHgwZDdlLCAweDJjNjgsCisJMHg2MTA0LCAweDEwNzgsIDB4OTFiYywgMHgwZDdmLCAweDAwNDAsIDB4OGM1MiwgMHgxMDc4LCAweDc3MmQsCisJMHgwMDc4LCAweDhjNjksIDB4NjAwNCwgMHg4MDA3LCAweDYxMzAsIDB4YTE4YywgMHgwMGZmLCAweGExMDUsCisJMHg2MDMyLCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAxZiwgMHgwMDAyLCAweDYwMzgsCisJMHg2MDBhLCAweDIwMDEsIDB4YThhMywgMHgyMDA0LCAweDYwMTYsIDB4MTA3OCwgMHg1ZDhhLCAweDEwNzgsCisJMHg2MmQxLCAweDAwN2MsIDB4MGQ3ZiwgMHgwYzdmLCAweDEwNzgsIDB4N2M4MywgMHgxMDc4LCAweDI4ODAsCisJMHgwZTdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4MjhhNiwgMHg2MDEzLCAweDAwMDAsCisJMHg2MDFmLCAweDAwMDcsIDB4NjAxNywgMHgwMzk4LCAweDEyN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDYwMDAsCisJMHhhMDhhLCAweDAwMTAsIDB4MTBjOCwgMHgxMzMyLCAweDEwNzksIDB4OGM4NywgMHgwMDdjLCAweDhjOTcsCisJMHg4Yzk3LCAweDhjOTcsIDB4OGM5NywgMHg4Yzk3LCAweDhjOTcsIDB4OGM5NywgMHg4Yzk3LCAweDhjOTcsCisJMHg4YWQ1LCAweDhjOTcsIDB4OGFkZCwgMHg4Yzk5LCAweDhhZGQsIDB4OGNhNywgMHg4Yzk3LCAweDEwNzgsCisJMHgxMzMyLCAweDYwMDQsIDB4YTA4NiwgMHgwMDhiLCAweDAwNDAsIDB4OGNhNywgMHg2MDA3LCAweDAwOGIsCisJMHg2MDAzLCAweDAwMGQsIDB4MTA3OCwgMHg1ZDhhLCAweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweDEwNzgsCisJMHg4ZWI5LCAweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDhjZGYsIDB4MTA3OCwgMHgyODgwLCAweDBkN2UsCisJMHgxMDc4LCAweDhkMDYsIDB4MDA0MCwgMHg4Y2MxLCAweDYwMTAsIDB4MjA2OCwgMHg2ODM3LCAweDAxMDMsCisJMHg2ODRiLCAweDAwMDYsIDB4Njg0NywgMHgwMDAwLCAweDY4NTAsIDB4YzBlZCwgMHg2ODUyLCAweDEwNzgsCisJMHg0YTczLCAweDJjNjgsIDB4MTA3OCwgMHg3NmM3LCAweDAwNDAsIDB4OGNjZiwgMHg2ODE4LCAweDYwMWEsCisJMHgwYzdlLCAweDJkNjAsIDB4MTA3OCwgMHg4ZWM2LCAweDBjN2YsIDB4MDA3OCwgMHg4Y2QwLCAweDJkNjAsCisJMHgwZDdmLCAweDYwMTMsIDB4MDAwMCwgMHg2MDFmLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDYwMDMsCisJMHgwMDAxLCAweDEwNzgsIDB4NWRkNywgMHgxMDc4LCAweDYyZDEsIDB4MDA3OCwgMHg4Y2YxLCAweDYwMzAsCisJMHhhMDhjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTg2LCAweDAwMzksIDB4MDA0MCwgMHg4Y2ViLCAweGExODYsCisJMHgwMDM1LCAweDAwYzAsIDB4OGNlZiwgMHgxMDc4LCAweDI4ODAsIDB4MDA3OCwgMHg4Y2MxLCAweDEwNzgsCisJMHg4ZWM2LCAweDAwN2MsIDB4YTI4NCwgMHgwMDBmLCAweDAwYzAsIDB4OGQwMywgMHhhMjgyLCAweGFkMDAsCisJMHgwMDQ4LCAweDhkMDMsIDB4MjAwMSwgMHhhNjE2LCAweDIwMDQsIDB4YTIwMiwgMHgwMGM4LCAweDhkMDMsCisJMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHhhMDA2LCAweDAwNzgsIDB4OGQwMiwgMHgwMjdlLCAweDBlN2UsCisJMHgyMDcxLCAweGE2MDAsIDB4NjIxMCwgMHg3MDVjLCAweGEyMDIsIDB4MDA0OCwgMHg4ZDE4LCAweDcwNjAsCisJMHhhMjAyLCAweDAwYzgsIDB4OGQxOCwgMHhhMDg1LCAweDAwMDEsIDB4MGU3ZiwgMHgwMjdmLCAweDAwN2MsCisJMHhhMDA2LCAweDAwNzgsIDB4OGQxNSwgMHgwZTdlLCAweDBjN2UsIDB4MDM3ZSwgMHgwMDdlLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MjA2MSwgMHhhZDAwLCAweDIwNzEsIDB4YTYwMCwgMHg3MzQ4LCAweDcwNjQsCisJMHhhMzAyLCAweDAwYzgsIDB4OGQ0NSwgMHg2MDFjLCAweGEyMDYsIDB4MDBjMCwgMHg4ZDNkLCAweDEwNzgsCisJMHg5MDJiLCAweDAwNDAsIDB4OGQzZCwgMHgxMDc4LCAweDhmMDAsIDB4MDBjMCwgMHg4ZDM5LCAweDEwNzgsCisJMHg3YzgzLCAweDBjN2UsIDB4MTA3OCwgMHg3NzJkLCAweDBjN2YsIDB4YWNlMCwgMHgwMDEwLCAweDcwNTgsCisJMHhhYzAyLCAweDAwYzgsIDB4OGQ0NSwgMHgwMDc4LCAweDhkMjYsIDB4MTI3ZiwgMHgwMDdmLCAweDAzN2YsCisJMHgwYzdmLCAweDBlN2YsIDB4MDA3YywgMHgwZTdlLCAweDBjN2UsIDB4MDE3ZSwgMHhhMTg4LCAweGE3MzUsCisJMHgyMTBjLCAweDgxZmYsIDB4MDA0MCwgMHg4ZDU5LCAweDIwNjEsIDB4YTliMywgMHg2MTFhLCAweDEwNzgsCisJMHgyODgwLCAweGEwMDYsIDB4MDA3OCwgMHg4ZDVlLCAweGEwODUsIDB4MDAwMSwgMHgwMTdmLCAweDBjN2YsCisJMHgwZTdmLCAweDAwN2MsIDB4MGM3ZSwgMHgwNTdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDBjN2UsCisJMHgxMDc4LCAweDc2YzcsIDB4MDU3ZiwgMHgwMDQwLCAweDhkN2IsIDB4NjYxMiwgMHg2NTFhLCAweDYwMWYsCisJMHgwMDAzLCAweDIwMDksIDB4MDA0YiwgMHgxMDc4LCAweDc3NWMsIDB4YTA4NSwgMHgwMDAxLCAweDEyN2YsCisJMHgwNTdmLCAweDBjN2YsIDB4MDA3YywgMHhhMDA2LCAweDAwNzgsIDB4OGQ3NywgMHgwYzdlLCAweDA1N2UsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MmEwLCAweDBjN2UsIDB4MTA3OCwgMHg3NmM3LCAweDA1N2YsCisJMHgwMDQwLCAweDhkYTksIDB4NjAxMywgMHgwMDAwLCAweDY1MWEsIDB4NjAxZiwgMHgwMDAzLCAweDBjN2UsCisJMHgyNTYwLCAweDEwNzgsIDB4NDdlOSwgMHgwYzdmLCAweDEwNzgsIDB4NWYwMSwgMHgwNzdlLCAweDIwMzksCisJMHgwMDAwLCAweDEwNzgsIDB4NWUwYSwgMHgyYzA4LCAweDEwNzgsIDB4OWY4YiwgMHgwNzdmLCAweDIwMDksCisJMHgwMDRjLCAweDEwNzgsIDB4Nzc1YywgMHhhMDg1LCAweDAwMDEsIDB4MTI3ZiwgMHgwNTdmLCAweDBjN2YsCisJMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHg4ZGE1LCAweDBmN2UsIDB4MGM3ZSwgMHgwNDdlLCAweDBjN2UsCisJMHgxMDc4LCAweDc2YzcsIDB4MmM3OCwgMHgwYzdmLCAweDAwNDAsIDB4OGRjNiwgMHg3ZTEyLCAweDJjMDAsCisJMHg3ODFhLCAweDc4MWYsIDB4MDAwMywgMHgyMDIxLCAweDAwMDUsIDB4MTA3OCwgMHg4ZTExLCAweDJmNjAsCisJMHgyMDA5LCAweDAwNGQsIDB4MTA3OCwgMHg3NzVjLCAweGEwODUsIDB4MDAwMSwgMHgwNDdmLCAweDBjN2YsCisJMHgwZjdmLCAweDAwN2MsIDB4MGY3ZSwgMHgwYzdlLCAweDA0N2UsIDB4MGM3ZSwgMHgxMDc4LCAweDc2YzcsCisJMHgyYzc4LCAweDBjN2YsIDB4MDA0MCwgMHg4ZGU0LCAweDdlMTIsIDB4MmMwMCwgMHg3ODFhLCAweDc4MWYsCisJMHgwMDAzLCAweDIwMjEsIDB4MDAwNSwgMHgxMDc4LCAweDhlMTEsIDB4MmY2MCwgMHgyMDA5LCAweDAwNGUsCisJMHgxMDc4LCAweDc3NWMsIDB4YTA4NSwgMHgwMDAxLCAweDA0N2YsIDB4MGM3ZiwgMHgwZjdmLCAweDAwN2MsCisJMHgwZjdlLCAweDBjN2UsIDB4MDQ3ZSwgMHgwYzdlLCAweDEwNzgsIDB4NzZjNywgMHgyYzc4LCAweDBjN2YsCisJMHgwMDQwLCAweDhlMGQsIDB4N2UxMiwgMHgyYzAwLCAweDc4MWEsIDB4NzgxZiwgMHgwMDAzLCAweDIwMjEsCisJMHgwMDA0LCAweDEwNzgsIDB4OGUxMSwgMHgyMDAxLCAweGE4OWQsIDB4MjAwNCwgMHhkMGZjLCAweDAwNDAsCisJMHg4ZTA2LCAweDJmNjAsIDB4MTA3OCwgMHg3NzJkLCAweDAwNzgsIDB4OGUwYiwgMHgyZjYwLCAweDIwMDksCisJMHgwMDUyLCAweDEwNzgsIDB4Nzc1YywgMHhhMDg1LCAweDAwMDEsIDB4MDQ3ZiwgMHgwYzdmLCAweDBmN2YsCisJMHgwMDdjLCAweDA5N2UsIDB4MDc3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDQ3NzUsCisJMHgwMDQwLCAweDhlMWUsIDB4MjAwMSwgMHg4ZTE2LCAweDAwNzgsIDB4OGUyNCwgMHgxMDc4LCAweDQ3MzksCisJMHgwMDQwLCAweDhlMmQsIDB4MjAwMSwgMHg4ZTFlLCAweDAwN2UsIDB4YTAwZSwgMHgyNDAwLCAweDEwNzgsCisJMHg0YjUxLCAweDEwNzgsIDB4NGE3MywgMHgwMDdmLCAweDAwN2EsIDB4MjQxOCwgMHgxMDc4LCAweDYxNjEsCisJMHg2MmEwLCAweDA4N2UsIDB4MjA0MSwgMHgwMDAxLCAweDIwMzksIDB4MDAwMSwgMHgyNjA4LCAweDEwNzgsCisJMHg1ZjFiLCAweDA4N2YsIDB4MTA3OCwgMHg1ZTBhLCAweDJmMDgsIDB4MjY0OCwgMHgxMDc4LCAweDlmOGIsCisJMHg2MTNjLCAweDgxZmYsIDB4MTA0MCwgMHg1ZmRiLCAweDEwNzgsIDB4NjJkMSwgMHgxMjdmLCAweDA3N2YsCisJMHgwOTdmLCAweDAwN2MsIDB4MGM3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwYzdlLCAweDEwNzgsCisJMHg3NmM3LCAweDAxN2YsIDB4MDA0MCwgMHg4ZTYzLCAweDY2MGEsIDB4NjExYSwgMHg2MDFmLCAweDAwMDEsCisJMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDFmLCAweDEwNzgsIDB4Nzc1YywgMHhhMDg1LCAweDAwMDEsCisJMHgxMjdmLCAweDBjN2YsIDB4MDA3YywgMHhhMDA2LCAweDAwNzgsIDB4OGU2MCwgMHgwYzdlLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MGM3ZSwgMHgxMDc4LCAweDc2YzcsIDB4MDE3ZiwgMHgwMDQwLCAweDhlN2YsCisJMHg2NjBhLCAweDYxMWEsIDB4NjAxZiwgMHgwMDA4LCAweDJkMDAsIDB4NjAxMiwgMHgyMDA5LCAweDAwMjEsCisJMHgxMDc4LCAweDc3NWMsIDB4YTA4NSwgMHgwMDAxLCAweDEyN2YsIDB4MGM3ZiwgMHgwMDdjLCAweGEwMDYsCisJMHgwMDc4LCAweDhlN2MsIDB4MGM3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwYzdlLCAweDEwNzgsCisJMHg3NmM3LCAweDAxN2YsIDB4MDA0MCwgMHg4ZTliLCAweDY2MGEsIDB4NjExYSwgMHg2MDFmLCAweDAwMDEsCisJMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDNkLCAweDEwNzgsIDB4Nzc1YywgMHhhMDg1LCAweDAwMDEsCisJMHgxMjdmLCAweDBjN2YsIDB4MDA3YywgMHhhMDA2LCAweDAwNzgsIDB4OGU5OCwgMHgwYzdlLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MGM3ZSwgMHgxMDc4LCAweDc2YzcsIDB4MDE3ZiwgMHgwMDQwLCAweDhlYjYsCisJMHg2MTFhLCAweDYwMWYsIDB4MDAwMSwgMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDAwLCAweDEwNzgsCisJMHg3NzVjLCAweGEwODUsIDB4MDAwMSwgMHgxMjdmLCAweDBjN2YsIDB4MDA3YywgMHhhMDA2LCAweDAwNzgsCisJMHg4ZWIzLCAweDAyN2UsIDB4MGQ3ZSwgMHg2MjE4LCAweDIyNjgsIDB4NmEzYywgMHg4MmZmLCAweDAwNDAsCisJMHg4ZWMzLCAweDgyMTEsIDB4NmEzZSwgMHgwZDdmLCAweDAyN2YsIDB4MDA3YywgMHgwMDdlLCAweDYwMDAsCisJMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwgMHg4ZWQ4LCAweDYwMTMsIDB4MDAwMCwgMHg2MDFmLCAweDAwMDcsCisJMHgyMDAxLCAweGE4YTMsIDB4MjAwNCwgMHg2MDE2LCAweDEwNzgsIDB4YTQ5NSwgMHg2MDNmLCAweDAwMDAsCisJMHgwMDdmLCAweDAwN2MsIDB4MDY3ZSwgMHgwYzdlLCAweDBkN2UsIDB4MjAzMSwgMHhhNjUzLCAweDI2MzQsCisJMHhkNmU0LCAweDAwNDAsIDB4OGVlOCwgMHg2NjE4LCAweDI2NjAsIDB4NmU0OCwgMHgxMDc4LCAweDQ2ZTcsCisJMHgwZDdmLCAweDBjN2YsIDB4MDY3ZiwgMHgwMDdjLCAweDAwN2UsIDB4MDE3ZSwgMHg2MDA0LCAweGEwOGUsCisJMHgwMDAyLCAweDAwNDAsIDB4OGVmZCwgMHhhMDhlLCAweDAwMDMsIDB4MDA0MCwgMHg4ZWZkLCAweGEwOGUsCisJMHgwMDA0LCAweDAwNDAsIDB4OGVmZCwgMHhhMDg1LCAweDAwMDEsIDB4MDE3ZiwgMHgwMDdmLCAweDAwN2MsCisJMHgwMDdlLCAweDBkN2UsIDB4NjAxMCwgMHhhMDZkLCAweDAwNDAsIDB4OGYwZCwgMHg2ODM4LCAweGQwZmMsCisJMHgwMDQwLCAweDhmMGQsIDB4YTAwNiwgMHgwMDc4LCAweDhmMGYsIDB4YTA4NSwgMHgwMDAxLCAweDBkN2YsCisJMHgwMDdmLCAweDAwN2MsIDB4MGM3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwYzdlLCAweDEwNzgsCisJMHg3NmM3LCAweDAxN2YsIDB4MDA0MCwgMHg4ZjJjLCAweDYxMWEsIDB4NjAxZiwgMHgwMDAxLCAweDJkMDAsCisJMHg2MDEyLCAweDEwNzgsIDB4Mjg4MCwgMHgyMDA5LCAweDAwMjgsIDB4MTA3OCwgMHg3NzVjLCAweGEwODUsCisJMHgwMDAxLCAweDEyN2YsIDB4MGM3ZiwgMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHg4ZjI5LCAweGExODYsCisJMHgwMDE1LCAweDAwYzAsIDB4OGY0NCwgMHgyMDExLCAweGE2MjAsIDB4MjIwNCwgMHhhMDg2LCAweDAwNzQsCisJMHgwMGMwLCAweDhmNDQsIDB4MTA3OCwgMHg3ZjkxLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMjksCisJMHgxMDc4LCAweDVkZDcsIDB4MDA3OCwgMHg4ZjQ4LCAweDEwNzgsIDB4N2M4MywgMHgxMDc4LCAweDc3MmQsCisJMHgwMDdjLCAweGExODYsIDB4MDAxNiwgMHgwMGMwLCAweDhmNTMsIDB4MjAwMSwgMHgwMDA0LCAweDEwNzgsCisJMHg0NTAyLCAweDAwNzgsIDB4OGY3NCwgMHhhMTg2LCAweDAwMTUsIDB4MDBjMCwgMHg4Zjc4LCAweDIwMTEsCisJMHhhNjIwLCAweDIyMDQsIDB4YTA4NiwgMHgwMDE0LCAweDAwYzAsIDB4OGY3OCwgMHgwZDdlLCAweDYwMTgsCisJMHgyMDY4LCAweDEwNzgsIDB4NDY0OSwgMHgwZDdmLCAweDEwNzgsIDB4ODA0MywgMHgwMGMwLCAweDhmNzgsCisJMHgwZDdlLCAweDYwMTgsIDB4MjA2OCwgMHg2ODkwLCAweDBkN2YsIDB4YTAwNSwgMHgwMDQwLCAweDhmNzgsCisJMHgyMDAxLCAweDAwMDYsIDB4MTA3OCwgMHg0NTAyLCAweDEwNzgsIDB4NzdmOCwgMHgwMDc4LCAweDhmN2MsCisJMHgxMDc4LCAweDdjODMsIDB4MTA3OCwgMHg3NzJkLCAweDAwN2MsIDB4Njg0OCwgMHhhMDg2LCAweDAwMDUsCisJMHgwMGMwLCAweDhmODQsIDB4MTA3OCwgMHg4Zjg1LCAweDAwN2MsIDB4Njg1MCwgMHhjMGFkLCAweDY4NTIsCisJMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhYjhjLCAweDcwMTQsIDB4ZDBlNCwgMHgwMDQwLCAweDhmOWEsCisJMHg2MDEzLCAweDAwMDAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDA1MCwgMHgxMDc4LCAweDVkOGEsCisJMHgxMDc4LCAweDYyZDEsIDB4MGU3ZiwgMHgwMDdjLCAweDBjN2UsIDB4MGY3ZSwgMHgyYzc4LCAweDEwNzgsCisJMHg0OTYzLCAweDBmN2YsIDB4MDA0MCwgMHg4ZmE5LCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLCAweDEwNzksCisJMHg4ZmFiLCAweDBjN2YsIDB4MDA3YywgMHg4YWQ1LCAweDhmYjYsIDB4OGZiOSwgMHg4ZmJjLCAweGEyNWQsCisJMHhhMjc5LCAweGEyN2MsIDB4OGFkNSwgMHg4YWQ1LCAweDEwNzgsIDB4MTMzMiwgMHgwMDA1LCAweDAwMDUsCisJMHgwMDdjLCAweDAwMDUsIDB4MDAwNSwgMHgwMDdjLCAweDEwNzgsIDB4OGZiZiwgMHgwMDdjLCAweDBmN2UsCisJMHgyYzc4LCAweDEwNzgsIDB4NDk2MywgMHgwMDQwLCAweDhmZWUsIDB4MTA3OCwgMHg3NmM3LCAweDAwYzAsCisJMHg4ZmNmLCAweDIwMDEsIDB4YThhNCwgMHgyMDA0LCAweDc4M2UsIDB4MDA3OCwgMHg4ZmVlLCAweDc4MTgsCisJMHg2MDFhLCAweDc4MWMsIDB4YTA4NiwgMHgwMDAzLCAweDAwNDAsIDB4OGZkYywgMHg3ODA4LCAweDYwMzYsCisJMHgyZjAwLCAweDYwM2EsIDB4MDA3OCwgMHg4ZmUwLCAweDc4MDgsIDB4NjAzYSwgMHgyZjAwLCAweDYwMzYsCisJMHg2MDJhLCAweDYwMWYsIDB4MDAwMSwgMHg2MDA3LCAweDAwMzUsIDB4NjAwMywgMHgwMDAxLCAweDc5MjAsCisJMHg2MTIyLCAweDEwNzgsIDB4NWQ4YSwgMHgxMDc4LCAweDYyZDEsIDB4MmY2MCwgMHgwZjdmLCAweDAwN2MsCisJMHgwMTdlLCAweDBmN2UsIDB4NjgyYywgMHg2MDMyLCAweGEwOGUsIDB4MDAwMSwgMHgwMDQwLCAweDkwMDEsCisJMHhhMDg2LCAweDAwMDUsIDB4MDA0MCwgMHg5MDA1LCAweGEwMDYsIDB4NjAyYSwgMHg2MDJlLCAweDAwNzgsCisJMHg5MDE2LCAweDY4MjQsIDB4YzBmNCwgMHhjMGQ1LCAweDY4MjYsIDB4NjgxMCwgMHgyMDc4LCAweDc4N2MsCisJMHg2OTM4LCAweGExMDIsIDB4Nzg4MCwgMHg2OTM0LCAweGExMDMsIDB4MDBjOCwgMHg4ZmZjLCAweDY4MzQsCisJMHg2MDJhLCAweDY4MzgsIDB4YTA4NCwgMHhmZmZjLCAweDY4M2EsIDB4NjAyZSwgMHgyZDAwLCAweDYwMzYsCisJMHg2ODA4LCAweDYwM2EsIDB4NjkxOCwgMHg2MTFhLCAweDY5MjAsIDB4NjEyMiwgMHg2MDFmLCAweDAwMDEsCisJMHg2MDA3LCAweDAwMzksIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsIDB4NWQ4YSwgMHg2ODAzLCAweDAwMDIsCisJMHgwZjdmLCAweDAxN2YsIDB4MDA3YywgMHgwMDdlLCAweDAxN2UsIDB4NjAwNCwgMHhhMDhlLCAweDAwMzQsCisJMHgwMDQwLCAweDkwNTAsIDB4YTA4ZSwgMHgwMDM1LCAweDAwNDAsIDB4OTA1MCwgMHhhMDhlLCAweDAwMzYsCisJMHgwMDQwLCAweDkwNTAsIDB4YTA4ZSwgMHgwMDM3LCAweDAwNDAsIDB4OTA1MCwgMHhhMDhlLCAweDAwMzgsCisJMHgwMDQwLCAweDkwNTAsIDB4YTA4ZSwgMHgwMDM5LCAweDAwNDAsIDB4OTA1MCwgMHhhMDhlLCAweDAwM2EsCisJMHgwMDQwLCAweDkwNTAsIDB4YTA4ZSwgMHgwMDNiLCAweDAwNDAsIDB4OTA1MCwgMHhhMDg1LCAweDAwMDEsCisJMHgwMTdmLCAweDAwN2YsIDB4MDA3YywgMHgwZjdlLCAweDJjNzgsIDB4MTA3OCwgMHg0OTYzLCAweDAwYzAsCisJMHg5MDVkLCAweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDkwNmMsIDB4NjAyNCwgMHhkMGY0LCAweDAwYzAsCisJMHg5MDZiLCAweGMwZjUsIDB4NjAyNiwgMHg2MDEwLCAweDIwNzgsIDB4NzgyOCwgMHg2MDNhLCAweDc4MmMsCisJMHg2MDM2LCAweDEwNzgsIDB4MTc1NywgMHhhMDA2LCAweDBmN2YsIDB4MDA3YywgMHgwMDdlLCAweDAxN2UsCisJMHgwMjdlLCAweDAzN2UsIDB4MGU3ZSwgMHgyMDAxLCAweGE4OWUsIDB4MjAwYywgMHg4MDAwLCAweDIwMTQsCisJMHgyMDAxLCAweDAwMzIsIDB4MTA3OCwgMHg1YzFjLCAweDIwMDEsIDB4YThhMiwgMHg4MmZmLCAweDAwYzAsCisJMHg5MDgzLCAweDIwMTEsIDB4MDAxNCwgMHgyMjAyLCAweDIwMDEsIDB4YThhMCwgMHgyMDBjLCAweDgwMDAsCisJMHgyMDE0LCAweDIwNzEsIDB4YTg4ZCwgMHg3MTFhLCAweDcyMWUsIDB4MjAwMSwgMHgwMDY0LCAweDEwNzgsCisJMHg1YzFjLCAweDIwMDEsIDB4YThhMywgMHg4MmZmLCAweDAwYzAsIDB4OTA5OCwgMHgyMDExLCAweDAwMTQsCisJMHgyMjAyLCAweDIwMDksIDB4YThhNCwgMHhhMjgwLCAweDAwMGEsIDB4MjAwYSwgMHgxMDc4LCAweDQ5OGIsCisJMHgwZTdmLCAweDAzN2YsIDB4MDI3ZiwgMHgwMTdmLCAweDAwN2YsIDB4MDA3YywgMHgwMDdlLCAweDBlN2UsCisJMHgyMDAxLCAweGE4YTIsIDB4MjAwMywgMHgwMDI4LCAweDIwMDEsIDB4YThhMywgMHgyMDAzLCAweDAwMTQsCisJMHgyMDcxLCAweGE4OGQsIDB4NzAxYiwgMHgwMDAwLCAweDcwMWYsIDB4MDdkMCwgMHgyMDAxLCAweGE4YTQsCisJMHgyMDAzLCAweDAwMWUsIDB4MGU3ZiwgMHgwMDdmLCAweDAwN2MsIDB4MGM3ZSwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDBjN2UsIDB4MTA3OCwgMHg3NmM3LCAweDAxN2YsIDB4MDA0MCwgMHg5MGQ1LCAweDYxMWEsCisJMHg2MDFmLCAweDAwMDEsIDB4MmQwMCwgMHg2MDEyLCAweDIwMDksIDB4MDAzMywgMHgxMDc4LCAweDc3NWMsCisJMHhhMDg1LCAweDAwMDEsIDB4MTI3ZiwgMHgwYzdmLCAweDAwN2MsIDB4YTAwNiwgMHgwMDc4LCAweDkwZDIsCisJMHgwZDdlLCAweDBlN2UsIDB4MGY3ZSwgMHgyMDcxLCAweGE2MDAsIDB4YTE4NiwgMHgwMDE1LCAweDAwYzAsCisJMHg5MTA3LCAweDcwODAsIDB4YTA4NiwgMHgwMDE4LCAweDAwYzAsIDB4OTEwNywgMHg2MDEwLCAweDIwNjgsCisJMHg2YTNjLCAweGQyZTQsIDB4MDBjMCwgMHg5MGZiLCAweDJjNzgsIDB4MTA3OCwgMHg2NDkwLCAweDAwNDAsCisJMHg5MTBmLCAweDcwNmMsIDB4NmE1MCwgMHhhMjA2LCAweDAwYzAsIDB4OTEwMywgMHg3MDcwLCAweDZhNTQsCisJMHhhMjA2LCAweDAwYzAsIDB4OTEwMywgMHg2MjE4LCAweGEyOTAsIDB4MDAyOCwgMHgyMjE0LCAweDIwMDksCisJMHgwMDAwLCAweDEwNzgsIDB4MjhjOCwgMHgxMDc4LCAweDc3ZjgsIDB4MDA3OCwgMHg5MTBiLCAweDEwNzgsCisJMHg3YzgzLCAweDEwNzgsIDB4NzcyZCwgMHgwZjdmLCAweDBlN2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDcwNTAsCisJMHhhMDgwLCAweDI5YzAsIDB4MjAwNCwgMHg2YTU0LCAweGEyMDYsIDB4MDA0MCwgMHg5MGZiLCAweDAwNzgsCisJMHg5MTAzLCAweDBjN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MGM3ZSwgMHgxMDc4LCAweDc2YzcsCisJMHgwMTdmLCAweDAwNDAsIDB4OTEzMSwgMHg2MTFhLCAweDYwMWYsIDB4MDAwMSwgMHgyZDAwLCAweDYwMTIsCisJMHgyMDA5LCAweDAwNDMsIDB4MTA3OCwgMHg3NzVjLCAweGEwODUsIDB4MDAwMSwgMHgxMjdmLCAweDBjN2YsCisJMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHg5MTJlLCAweDBkN2UsIDB4MGU3ZSwgMHgwZjdlLCAweDIwNzEsCisJMHhhNjAwLCAweGExODYsIDB4MDAxNSwgMHgwMGMwLCAweDkxNWEsIDB4NzA4MCwgMHhhMDg2LCAweDAwMDQsCisJMHgwMGMwLCAweDkxNWEsIDB4NjAxMCwgMHhhMGU4LCAweDAwMGYsIDB4MmM3OCwgMHgxMDc4LCAweDY0OTAsCisJMHgwMDQwLCAweDkxNjIsIDB4NzA2YywgMHg2YTA4LCAweGEyMDYsIDB4MDBjMCwgMHg5MTU2LCAweDcwNzAsCisJMHg2YTBjLCAweGEyMDYsIDB4MDBjMCwgMHg5MTU2LCAweDEwNzgsIDB4Mjg4MCwgMHgxMDc4LCAweDc3ZjgsCisJMHgwMDc4LCAweDkxNWUsIDB4MTA3OCwgMHg3YzgzLCAweDEwNzgsIDB4NzcyZCwgMHgwZjdmLCAweDBlN2YsCisJMHgwZDdmLCAweDAwN2MsIDB4NzA1MCwgMHhhMDgwLCAweDI5YzAsIDB4MjAwNCwgMHg2YTBjLCAweGEyMDYsCisJMHgwMDQwLCAweDkxNTQsIDB4MDA3OCwgMHg5MTU2LCAweDAxN2UsIDB4MDI3ZSwgMHg2ODRjLCAweGQwYWMsCisJMHgwMDQwLCAweDkxODQsIDB4NjkxNCwgMHg2YTEwLCAweDIxMDAsIDB4YTIwNSwgMHgwMDQwLCAweDkxODQsCisJMHg2ODYwLCAweGExMDYsIDB4MDBjMCwgMHg5MTgwLCAweDY4NWMsIDB4YTIwNiwgMHgwMDQwLCAweDkxODQsCisJMHg2OTYyLCAweDZhNWUsIDB4YTA4NSwgMHgwMDAxLCAweDAyN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDBlN2UsCisJMHgxMjdlLCAweDIwNzEsIDB4YTYwMCwgMHgyMDkxLCAweDgwMDAsIDB4NzU0OCwgMHhhNTgyLCAweDAwMDEsCisJMHgwMDQ4LCAweDkxYjksIDB4NzA0YywgMHgyMDYwLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAwLCAweDAwNDAsCisJMHg5MWE1LCAweGFjZTAsIDB4MDAxMCwgMHg3MDU4LCAweGFjMDIsIDB4MDBjOCwgMHg5MWExLCAweDAwNzgsCisJMHg5MTk0LCAweDIwNjEsIDB4YWQwMCwgMHgwMDc4LCAweDkxOTQsIDB4NjAwMywgMHgwMDA4LCAweDg1MjksCisJMHg3NTRhLCAweGFjYTgsIDB4MDAxMCwgMHg3MDU4LCAweGE1MDIsIDB4MDBjOCwgMHg5MWI1LCAweDc1NGUsCisJMHhhMDg1LCAweDAwMDEsIDB4MTI3ZiwgMHgwZTdmLCAweDAwN2MsIDB4NzA0ZiwgMHhhZDAwLCAweDAwNzgsCisJMHg5MWIwLCAweGEwMDYsIDB4MDA3OCwgMHg5MWIyLCAweDBjN2UsIDB4MDI3ZSwgMHgwMTdlLCAweGExODYsCisJMHgwMDM1LCAweDAwNDAsIDB4OTFjNiwgMHg2YTM0LCAweDAwNzgsIDB4OTFjNywgMHg2YTI4LCAweDEwNzgsCisJMHg4Y2YyLCAweDAwNDAsIDB4OTFmMCwgMHgyMjYwLCAweDYxMWMsIDB4YTE4NiwgMHgwMDAzLCAweDAwNDAsCisJMHg5MWQ1LCAweGExODYsIDB4MDAwNiwgMHgwMGMwLCAweDkxZWMsIDB4NjgzNCwgMHhhMjA2LCAweDAwNDAsCisJMHg5MWU0LCAweDY4MzgsIDB4YTIwNiwgMHgwMGMwLCAweDkxZWMsIDB4NjEwOCwgMHg2ODM0LCAweGExMDYsCisJMHgwMGMwLCAweDkxZWMsIDB4MDA3OCwgMHg5MWU5LCAweDYwMDgsIDB4NjkzOCwgMHhhMTA2LCAweDAwYzAsCisJMHg5MWVjLCAweDYwMTgsIDB4NjkxOCwgMHhhMTA2LCAweDAxN2YsIDB4MDI3ZiwgMHgwYzdmLCAweDAwN2MsCisJMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwgMHg5MWVjLCAweDY5NDQsIDB4ZDFjYywgMHgwMDQwLCAweDkyMGQsCisJMHhhMThjLCAweDAwZmYsIDB4YTE4ZSwgMHgwMDAyLCAweDAwYzAsIDB4OTIwZCwgMHhhZDg4LCAweDAwMWUsCisJMHgyMTBjLCAweGExOGMsIDB4MGYwMCwgMHg4MTBmLCAweGExOGUsIDB4MDAwMSwgMHgwMGMwLCAweDkyMGQsCisJMHg2ODEwLCAweDY5MTQsIDB4YTExNSwgMHgxMGMwLCAweDg0ZDUsIDB4MDA3YywgMHgwNjdlLCAweDYwMDAsCisJMHhhMGIyLCAweDAwMTAsIDB4MTBjOCwgMHgxMzMyLCAweDEwNzksIDB4OTIxOCwgMHgwNjdmLCAweDAwN2MsCisJMHg5MjI4LCAweDk2ZGYsIDB4OTdmYiwgMHg5MjI4LCAweDkyMjgsIDB4OTIyOCwgMHg5MjI4LCAweDkyMjgsCisJMHg5MjYyLCAweDk4OGUsIDB4OTIyOCwgMHg5MjI4LCAweDkyMjgsIDB4OTIyOCwgMHg5MjI4LCAweDkyMjgsCisJMHgxMDc4LCAweDEzMzIsIDB4MDY3ZSwgMHg2MDAwLCAweGEwYjIsIDB4MDAxMCwgMHgxMGM4LCAweDEzMzIsCisJMHgxMDc5LCAweDkyMzQsIDB4MDY3ZiwgMHgwMDdjLCAweDkyNDQsIDB4OWQ1MywgMHg5MjQ0LCAweDkyNDQsCisJMHg5MjQ0LCAweDkyNDQsIDB4OTI0NCwgMHg5MjQ0LCAweDlkMTEsIDB4OWRhMSwgMHg5MjQ0LCAweGEzYjAsCisJMHhhM2U0LCAweGEzYjAsIDB4YTNlNCwgMHg5MjQ0LCAweDEwNzgsIDB4MTMzMiwgMHgwNjdlLCAweDYwMDAsCisJMHhhMGIyLCAweDAwMTAsIDB4MTBjOCwgMHgxMzMyLCAweDEwNzksIDB4OTI1MCwgMHgwNjdmLCAweDAwN2MsCisJMHg5MjYwLCAweDk5ZWIsIDB4OWFjNywgMHg5YWY1LCAweDliNzAsIDB4OTI2MCwgMHg5Yzc2LCAweDljMWUsCisJMHg5ODlhLCAweDljZTUsIDB4OWNmYiwgMHg5MjYwLCAweDkyNjAsIDB4OTI2MCwgMHg5MjYwLCAweDkyNjAsCisJMHgxMDc4LCAweDEzMzIsIDB4YTFiMiwgMHgwMDQ0LCAweDEwYzgsIDB4MTMzMiwgMHgyMTAwLCAweDAwNzksCisJMHg5MjY5LCAweDkyYTksIDB4OTQ5OCwgMHg5MmE5LCAweDkyYTksIDB4OTJhOSwgMHg5NGEwLCAweDkyYTksCisJMHg5MmE5LCAweDkyYTksIDB4OTJhOSwgMHg5MmE5LCAweDkyYTksIDB4OTJhOSwgMHg5MmE5LCAweDkyYTksCisJMHg5MmE5LCAweDkyYTksIDB4OTJhOSwgMHg5MmE5LCAweDkyYTksIDB4OTJhOSwgMHg5MmE5LCAweDkyYTksCisJMHg5MmFiLCAweDkzMTEsIDB4OTMyMCwgMHg5Mzc3LCAweDkzOTYsIDB4OTQxNSwgMHg5NDg1LCAweDkyYTksCisJMHg5MmE5LCAweDk0YTQsIDB4OTJhOSwgMHg5MmE5LCAweDk0YjcsIDB4OTRjMiwgMHg5MmE5LCAweDkyYTksCisJMHg5MmE5LCAweDkyYTksIDB4OTJhOSwgMHg5NGZhLCAweDkyYTksIDB4OTJhOSwgMHg5NTA5LCAweDkyYTksCisJMHg5MmE5LCAweDkyYTksIDB4OTJhOSwgMHg5MmE5LCAweDkyYTksIDB4OTUyMiwgMHg5MmE5LCAweDkyYTksCisJMHg5MmE5LCAweDk1YWYsIDB4OTJhOSwgMHg5MmE5LCAweDkyYTksIDB4OTJhOSwgMHg5MmE5LCAweDkyYTksCisJMHg5NjI5LCAweDEwNzgsIDB4MTMzMiwgMHgxMDc4LCAweDQ5NjcsIDB4MDBjMCwgMHg5MmJiLCAweDIwMDEsCisJMHhhNjMzLCAweDIwMDQsIDB4ZDBjYywgMHgwMGMwLCAweDkyYmIsIDB4YTA4NCwgMHgwMDA5LCAweGEwODYsCisJMHgwMDA4LCAweDAwYzAsIDB4OTJjMywgMHg2MDA3LCAweDAwMDksIDB4NjAyYiwgMHgwMDA5LCAweDYwMTMsCisJMHgwMDAwLCAweDAwNzgsIDB4OTQ5MywgMHgxMDc4LCAweDQ5NTcsIDB4MGU3ZSwgMHgwYzdlLCAweDAzN2UsCisJMHgwMjdlLCAweDAxN2UsIDB4NjIxOCwgMHgyMjcwLCAweDcyYTAsIDB4MDI3ZSwgMHgyMDE5LCAweDAwMjksCisJMHgxMDc4LCAweDVmMDEsIDB4MDc3ZSwgMHgyMDM5LCAweDAwMDAsIDB4MTA3OCwgMHg1ZTBhLCAweDJjMDgsCisJMHgxMDc4LCAweDlmOGIsIDB4MDc3ZiwgMHgwMTdmLCAweDJlNjAsIDB4MTA3OCwgMHg0N2U5LCAweDAxN2YsCisJMHgwMjdmLCAweDAzN2YsIDB4MGM3ZiwgMHgwZTdmLCAweDY2MTgsIDB4MGM3ZSwgMHgyNjYwLCAweDEwNzgsCisJMHg0NWQ2LCAweDBjN2YsIDB4YTZiMCwgMHgwMDAxLCAweDI2MzQsIDB4YTY4NCwgMHgwMGZmLCAweGEwODIsCisJMHgwMDA2LCAweDAwNDgsIDB4OTMwMywgMHgxMDc4LCAweDllYmYsIDB4MDBjMCwgMHg5MzcxLCAweDEwNzgsCisJMHg5ZTUwLCAweDAwYzAsIDB4OTJmZiwgMHg2MDA3LCAweDAwMDgsIDB4MDA3OCwgMHg5NDkzLCAweDYwMDcsCisJMHgwMDA5LCAweDAwNzgsIDB4OTQ5MywgMHgxMDc4LCAweGEwOWYsIDB4MDA0MCwgMHg5MzBkLCAweDEwNzgsCisJMHg5ZWJmLCAweDAwNDAsIDB4OTJmNywgMHgwMDc4LCAweDkzNzEsIDB4NjAxMywgMHgxOTAwLCAweDAwNzgsCisJMHg5MmZmLCAweDEwNzgsIDB4MjliYiwgMHgwMGMwLCAweDk2NjQsIDB4NjEwNiwgMHgxMDc4LCAweDllMDUsCisJMHg2MDA3LCAweDAwMDYsIDB4MDA3OCwgMHg5NDkzLCAweDYwMDcsIDB4MDAwNywgMHgwMDc4LCAweDk0OTMsCisJMHgxMDc4LCAweGE0MWMsIDB4MDBjMCwgMHg5NjY0LCAweDEwNzgsIDB4MjliYiwgMHgwMGMwLCAweDk2NjQsCisJMHgwZDdlLCAweDY2MTgsIDB4MjY2OCwgMHg2ZTA0LCAweGE2ODQsIDB4MDBmZiwgMHhhMDgyLCAweDAwMDYsCisJMHgwMGM4LCAweDkzMzYsIDB4MjAwMSwgMHgwMDAxLCAweDEwNzgsIDB4NDRlZSwgMHhhNmI0LCAweGZmMDAsCisJMHg4NjM3LCAweGE2ODYsIDB4MDAwNiwgMHgwMDQwLCAweDkzNTMsIDB4YTY4NiwgMHgwMDA0LCAweDAwNDAsCisJMHg5MzUzLCAweDZlMDQsIDB4YTZiNCwgMHgwMGZmLCAweGE2ODYsIDB4MDAwNiwgMHgwMDQwLCAweDkzNTMsCisJMHhhNjg2LCAweDAwMDQsIDB4MDA0MCwgMHg5MzUzLCAweGE2ODYsIDB4MDAwNSwgMHgwMDQwLCAweDkzNTMsCisJMHgwZDdmLCAweDAwNzgsIDB4OTM3MSwgMHgxMDc4LCAweDlmMjUsIDB4MDBjMCwgMHg5MzZjLCAweGE2ODYsCisJMHgwMDA2LCAweDAwYzAsIDB4OTM2NSwgMHgwMjdlLCAweDYyMTgsIDB4YTI5MCwgMHgwMDI4LCAweDIyMTQsCisJMHgyMDA5LCAweDAwMDAsIDB4MTA3OCwgMHgyOGM4LCAweDAyN2YsIDB4MTA3OCwgMHg0NjQ5LCAweDYwMDcsCisJMHgwMDBhLCAweDBkN2YsIDB4MDA3OCwgMHg5NDkzLCAweDYwMDcsIDB4MDAwYiwgMHgwZDdmLCAweDAwNzgsCisJMHg5NDkzLCAweDEwNzgsIDB4Mjg4MCwgMHg2MDA3LCAweDAwMDEsIDB4MDA3OCwgMHg5NDkzLCAweDEwNzgsCisJMHhhNDFjLCAweDAwYzAsIDB4OTY2NCwgMHgxMDc4LCAweDI5YmIsIDB4MDBjMCwgMHg5NjY0LCAweDY2MTgsCisJMHgwZDdlLCAweDI2NjgsIDB4NmUwNCwgMHgwZDdmLCAweGE2ODYsIDB4MDcwNywgMHgwMDQwLCAweDkzNzEsCisJMHgwMjdlLCAweDYyMTgsIDB4YTI5MCwgMHgwMDI4LCAweDIyMTQsIDB4MjAwOSwgMHgwMDAwLCAweDEwNzgsCisJMHgyOGM4LCAweDAyN2YsIDB4NjAwNywgMHgwMDBjLCAweDAwNzgsIDB4OTQ5MywgMHgxMDc4LCAweDQ5NjcsCisJMHgwMGMwLCAweDkzYTMsIDB4MjAwMSwgMHhhNjMzLCAweDIwMDQsIDB4YTA4NCwgMHgwMDA5LCAweGEwODYsCisJMHgwMDA4LCAweDAwYzAsIDB4OTNhYiwgMHg2MDA3LCAweDAwMDksIDB4NjAyYiwgMHgwMDA5LCAweDYwMTMsCisJMHgwMDAwLCAweDAwNzgsIDB4OTQ5MywgMHgxMDc4LCAweDQ5NTcsIDB4NjYxOCwgMHhhNmIwLCAweDAwMDEsCisJMHgyNjM0LCAweGE2ODQsIDB4MDBmZiwgMHhhMDgyLCAweDAwMDYsIDB4MDA0OCwgMHg5M2VmLCAweGE2YjQsCisJMHhmZjAwLCAweDg2MzcsIDB4YTY4NiwgMHgwMDA0LCAweDAwNDAsIDB4OTNjMiwgMHhhNjg2LCAweDAwMDYsCisJMHgwMGMwLCAweDkzNzEsIDB4MTA3OCwgMHg5ZjM0LCAweDAwYzAsIDB4OTNjYSwgMHg2MDA3LCAweDAwMGUsCisJMHgwMDc4LCAweDk0OTMsIDB4MDQ3ZSwgMHg2NDE4LCAweGE0YTAsIDB4MDAyOCwgMHgyNDI0LCAweGE0YTQsCisJMHgwMGZmLCAweDg0MjcsIDB4MDQ3ZSwgMHgxMDc4LCAweDI4ODAsIDB4MDQ3ZiwgMHgwMTdlLCAweGEwMDYsCisJMHgyMDA5LCAweGE2NTMsIDB4MjEwYywgMHhkMWE0LCAweDAwNDAsIDB4OTNlOSwgMHgyMDA5LCAweDAwMjksCisJMHgxMDc4LCAweGEyMWQsIDB4NjAxOCwgMHgwZDdlLCAweDIwNjgsIDB4NjgwMCwgMHhjMGU1LCAweDY4MDIsCisJMHgwZDdmLCAweDAxN2YsIDB4MDQ3ZiwgMHg2MDA3LCAweDAwMDEsIDB4MDA3OCwgMHg5NDkzLCAweDIwMDEsCisJMHgwMDAxLCAweDEwNzgsIDB4NDRlZSwgMHgxNTdlLCAweDAxN2UsIDB4MDI3ZSwgMHgwMzdlLCAweDIwYTksCisJMHgwMDA0LCAweDIwMTksIDB4YTYwNSwgMHgyMDExLCAweGFiOTAsIDB4MTA3OCwgMHg4MGRlLCAweDAzN2YsCisJMHgwMjdmLCAweDAxN2YsIDB4MTU3ZiwgMHhhMDA1LCAweDAwNDAsIDB4OTQwZiwgMHhhNmI0LCAweGZmMDAsCisJMHg4NjM3LCAweGE2ODYsIDB4MDAwNiwgMHgwMDQwLCAweDkzYzIsIDB4MDA3OCwgMHg5MzcxLCAweDYwMTMsCisJMHgxOTAwLCAweDYwMDcsIDB4MDAwOSwgMHgwMDc4LCAweDk0OTMsIDB4MTA3OCwgMHg0OTY3LCAweDAwYzAsCisJMHg5NDIyLCAweDIwMDEsIDB4YTYzMywgMHgyMDA0LCAweGEwODQsIDB4MDAwOSwgMHhhMDg2LCAweDAwMDgsCisJMHgwMGMwLCAweDk0MmEsIDB4NjAwNywgMHgwMDA5LCAweDYwMmIsIDB4MDAwOSwgMHg2MDEzLCAweDAwMDAsCisJMHgwMDc4LCAweDk0OTMsIDB4MTA3OCwgMHg0OTU3LCAweDY2MTgsIDB4YTZiMCwgMHgwMDAxLCAweDI2MzQsCisJMHhhNjg0LCAweDAwZmYsIDB4YTA4MiwgMHgwMDA2LCAweDAwNDgsIDB4OTQ3MiwgMHhhNmI0LCAweGZmMDAsCisJMHg4NjM3LCAweGE2ODYsIDB4MDAwNCwgMHgwMDQwLCAweDk0NDEsIDB4YTY4NiwgMHgwMDA2LCAweDAwYzAsCisJMHg5MzcxLCAweDEwNzgsIDB4OWY1ZiwgMHgwMGMwLCAweDk0NGQsIDB4MTA3OCwgMHg5ZTUwLCAweDAwYzAsCisJMHg5NDRkLCAweDYwMDcsIDB4MDAxMCwgMHgwMDc4LCAweDk0OTMsIDB4MDQ3ZSwgMHg2NDE4LCAweGE0YTAsCisJMHgwMDI4LCAweDI0MjQsIDB4YTRhNCwgMHgwMGZmLCAweDg0MjcsIDB4MDQ3ZSwgMHgxMDc4LCAweDI4ODAsCisJMHgwNDdmLCAweDAxN2UsIDB4YTAwNiwgMHgyMDA5LCAweGE2NTMsIDB4MjEwYywgMHhkMWE0LCAweDAwNDAsCisJMHg5NDZjLCAweDIwMDksIDB4MDAyOSwgMHgxMDc4LCAweGEyMWQsIDB4NjAxOCwgMHgwZDdlLCAweDIwNjgsCisJMHg2ODAwLCAweGMwZTUsIDB4NjgwMiwgMHgwZDdmLCAweDAxN2YsIDB4MDQ3ZiwgMHg2MDA3LCAweDAwMDEsCisJMHgwMDc4LCAweDk0OTMsIDB4MTA3OCwgMHhhMDlmLCAweDAwNDAsIDB4OTQ3ZiwgMHhhNmI0LCAweGZmMDAsCisJMHg4NjM3LCAweGE2ODYsIDB4MDAwNiwgMHgwMDQwLCAweDk0NDEsIDB4MDA3OCwgMHg5MzcxLCAweDYwMTMsCisJMHgxOTAwLCAweDYwMDcsIDB4MDAwOSwgMHgwMDc4LCAweDk0OTMsIDB4MTA3OCwgMHgyOWJiLCAweDAwYzAsCisJMHg5NjY0LCAweDEwNzgsIDB4YTQxYywgMHgwMGMwLCAweDk2NjQsIDB4MTA3OCwgMHg5NjY3LCAweDAwYzAsCisJMHg5MzcxLCAweDYwMDcsIDB4MDAxMiwgMHg2MDAzLCAweDAwMDEsIDB4MTA3OCwgMHg1ZGQ3LCAweDAwN2MsCisJMHg2MDA3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsIDB4NWRkNywgMHgwMDc4LCAweDk0OTcsCisJMHg2MDA3LCAweDAwMDUsIDB4MDA3OCwgMHg5NDlhLCAweDEwNzgsIDB4YTQxYywgMHgwMGMwLCAweDk2NjQsCisJMHgxMDc4LCAweDI5YmIsIDB4MDBjMCwgMHg5NjY0LCAweDEwNzgsIDB4OTY2NywgMHgwMGMwLCAweDkzNzEsCisJMHg2MDA3LCAweDAwMjAsIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsIDB4NWRkNywgMHgwMDdjLCAweDEwNzgsCisJMHgyOWJiLCAweDAwYzAsIDB4OTY2NCwgMHg2MDA3LCAweDAwMjMsIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsCisJMHg1ZGQ3LCAweDAwN2MsIDB4MTA3OCwgMHhhNDFjLCAweDAwYzAsIDB4OTY2NCwgMHgxMDc4LCAweDI5YmIsCisJMHgwMGMwLCAweDk2NjQsIDB4MTA3OCwgMHg5NjY3LCAweDAwYzAsIDB4OTM3MSwgMHgwMTdlLCAweDAyN2UsCisJMHgyMDExLCAweGFiOTAsIDB4MjIxNCwgMHgyYzA4LCAweGEwMDYsIDB4MTA3OCwgMHhhMWU2LCAweDAwYzAsCisJMHg5NGU5LCAweDIxNjAsIDB4NjAwNywgMHgwMDI2LCAweDYwMTMsIDB4MTcwMCwgMHgyMDExLCAweGFiODksCisJMHgyMjE0LCAweGEyOTYsIDB4ZmZmZiwgMHgwMGMwLCAweDk0ZjMsIDB4NjAwNywgMHgwMDI1LCAweDAwNzgsCisJMHg5NGYzLCAweDYwMDQsIDB4YTA4NiwgMHgwMDI0LCAweDAwYzAsIDB4OTRmMCwgMHgxMDc4LCAweDc3MmQsCisJMHgyMTYwLCAweDYwMDcsIDB4MDAyNSwgMHg2MDAzLCAweDAwMDEsIDB4MTA3OCwgMHg1ZGQ3LCAweDAyN2YsCisJMHgwMTdmLCAweDAwN2MsIDB4MTA3OCwgMHgyOWJiLCAweDAwYzAsIDB4OTY2NCwgMHg2MTA2LCAweDEwNzgsCisJMHg5Njg3LCAweDYwMDcsIDB4MDAyYiwgMHgwMDc4LCAweDk0OTMsIDB4NjAwNywgMHgwMDJjLCAweDAwNzgsCisJMHg5NDkzLCAweDEwNzgsIDB4YTQxYywgMHgwMGMwLCAweDk2NjQsIDB4MTA3OCwgMHgyOWJiLCAweDAwYzAsCisJMHg5NjY0LCAweDEwNzgsIDB4OTY2NywgMHgwMGMwLCAweDkzNzEsIDB4NjEwNiwgMHgxMDc4LCAweDk2OGMsCisJMHgwMGMwLCAweDk1MWUsIDB4NjAwNywgMHgwMDJlLCAweDAwNzgsIDB4OTQ5MywgMHg2MDA3LCAweDAwMmYsCisJMHgwMDc4LCAweDk0OTMsIDB4MTA3OCwgMHgyOWJiLCAweDAwYzAsIDB4OTY2NCwgMHgwZTdlLCAweDBkN2UsCisJMHgwYzdlLCAweDYwMTgsIDB4YTA4MCwgMHgwMDAxLCAweDIwMGMsIDB4YTE4NCwgMHgwMGZmLCAweGEwODYsCisJMHgwMDA2LCAweDAwNDAsIDB4OTUzZiwgMHhhMTg0LCAweGZmMDAsIDB4ODAwNywgMHhhMDg2LCAweDAwMDYsCisJMHgwMDQwLCAweDk1M2YsIDB4MGM3ZiwgMHgwZDdmLCAweDBlN2YsIDB4MDA3OCwgMHg5NDk4LCAweDIwMDEsCisJMHhhNjcyLCAweDIwMDQsIDB4ZDBlNCwgMHgwMDQwLCAweDk1YWIsIDB4MjA3MSwgMHhhYjhjLCAweDcwMTAsCisJMHg2MDM2LCAweDcwMTQsIDB4NjAzYSwgMHg3MTA4LCAweDcyMGMsIDB4MjAwMSwgMHhhNjUzLCAweDIwMDQsCisJMHhkMGE0LCAweDAwNDAsIDB4OTU1ZCwgMHg2MDE4LCAweDIwNjgsIDB4NjgxMCwgMHhhMTA2LCAweDAwYzAsCisJMHg5NTVkLCAweDY4MTQsIDB4YTIwNiwgMHgwMDQwLCAweDk1ODEsIDB4MjAwMSwgMHhhNjUzLCAweDIwMDQsCisJMHhkMGFjLCAweDAwYzAsIDB4OTU5ZiwgMHgyMDY5LCAweGE2MDAsIDB4Njg3MCwgMHhhMjA2LCAweDAwYzAsCisJMHg5NTlmLCAweDY4NmMsIDB4YTEwNiwgMHgwMGMwLCAweDk1OWYsIDB4NzIxMCwgMHgxMDc4LCAweDhjZjIsCisJMHgwMDQwLCAweDk1YTUsIDB4MTA3OCwgMHhhMjhlLCAweDAwNDAsIDB4OTVhNSwgMHg2MjJhLCAweDYwMDcsCisJMHgwMDM2LCAweDYwMDMsIDB4MDAwMSwgMHgxMDc4LCAweDVkOGEsIDB4MGM3ZiwgMHgwZDdmLCAweDBlN2YsCisJMHgwMDdjLCAweDcyMTQsIDB4YTI4NiwgMHhmZmZmLCAweDAwNDAsIDB4OTU5MywgMHgxMDc4LCAweDhjZjIsCisJMHgwMDQwLCAweDk1YTUsIDB4YTI4MCwgMHgwMDAyLCAweDIwMDQsIDB4NzExMCwgMHhhMTA2LCAweDAwYzAsCisJMHg5NWE1LCAweDAwNzgsIDB4OTU2ZSwgMHg3MjEwLCAweDJjMDgsIDB4YTA4NSwgMHgwMDAxLCAweDEwNzgsCisJMHhhMWU2LCAweDJjMTAsIDB4MjE2MCwgMHgwMDQwLCAweDk1YTUsIDB4MDA3OCwgMHg5NTZlLCAweDYwMDcsCisJMHgwMDM3LCAweDYwMTMsIDB4MTUwMCwgMHgwMDc4LCAweDk1NzksIDB4NjAwNywgMHgwMDM3LCAweDYwMTMsCisJMHgxNzAwLCAweDAwNzgsIDB4OTU3OSwgMHg2MDA3LCAweDAwMTIsIDB4MDA3OCwgMHg5NTc5LCAweDEwNzgsCisJMHgyOWJiLCAweDAwYzAsIDB4OTY2NCwgMHg2MDE4LCAweGEwODAsIDB4MDAwMSwgMHgyMDA0LCAweGEwODQsCisJMHhmZjAwLCAweDgwMDcsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4OTQ5OCwgMHgwZTdlLCAweDBkN2UsCisJMHgwYzdlLCAweDIwMDEsIDB4YTY3MiwgMHgyMDA0LCAweGQwZTQsIDB4MDA0MCwgMHg5NjIxLCAweDIwNjksCisJMHhhNjAwLCAweDIwNzEsIDB4YWI4YywgMHg3MDA4LCAweDYwMzYsIDB4NzIwYywgMHg2MjNhLCAweGEyODYsCisJMHhmZmZmLCAweDAwYzAsIDB4OTVkZSwgMHg3MjA4LCAweDBjN2UsIDB4MmMwOCwgMHhhMDg1LCAweDAwMDEsCisJMHgxMDc4LCAweGExZTYsIDB4MmMxMCwgMHgwYzdmLCAweDAwNDAsIDB4OTYxNSwgMHgxMDc4LCAweDhjZjIsCisJMHgwMDQwLCAweDk2MTUsIDB4MGM3ZSwgMHgwMjdlLCAweDIyNjAsIDB4MTA3OCwgMHg4OWYzLCAweDAyN2YsCisJMHgwYzdmLCAweDcxMTgsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE4NiwgMHgwMDAxLCAweDAwNDAsCisJMHg5NWZmLCAweGExODYsIDB4MDAwNSwgMHgwMDQwLCAweDk1ZjksIDB4YTE4NiwgMHgwMDA3LCAweDAwYzAsCisJMHg5NjA5LCAweGEyODAsIDB4MDAwNCwgMHgyMDA0LCAweGEwMDUsIDB4MDA0MCwgMHg5NjA5LCAweDA1N2UsCisJMHg3NTEwLCAweDc2MTQsIDB4MTA3OCwgMHhhMmEzLCAweDA1N2YsIDB4MGM3ZiwgMHgwZDdmLCAweDBlN2YsCisJMHgwMDdjLCAweDYwMDcsIDB4MDAzYiwgMHg2MDJiLCAweDAwMDksIDB4NjAxMywgMHgyYTAwLCAweDYwMDMsCisJMHgwMDAxLCAweDEwNzgsIDB4NWQ4YSwgMHgwMDc4LCAweDk2MDUsIDB4NjAwNywgMHgwMDNiLCAweDYwMmIsCisJMHgwMDA5LCAweDYwMTMsIDB4MTcwMCwgMHg2MDAzLCAweDAwMDEsIDB4MTA3OCwgMHg1ZDhhLCAweDAwNzgsCisJMHg5NjA1LCAweDYwMDcsIDB4MDAzYiwgMHg2MDJiLCAweDAwMGIsIDB4NjAxMywgMHgwMDAwLCAweDAwNzgsCisJMHg5NTc5LCAweDBlN2UsIDB4MDI3ZSwgMHgxMDc4LCAweDQ5NjcsIDB4MDA0MCwgMHg5NjVlLCAweDEwNzgsCisJMHg0OTU3LCAweDEwNzgsIDB4YTRhOSwgMHgwMGMwLCAweDk2NWMsIDB4MjA3MSwgMHhhNjAwLCAweDcwY2MsCisJMHhjMDg1LCAweDcwY2UsIDB4MGY3ZSwgMHgyMDc5LCAweDAxMDAsIDB4NzI5OCwgMHhhMjg0LCAweDAwZmYsCisJMHg3MDZlLCAweDc4ZTYsIDB4YTI4NCwgMHhmZjAwLCAweDcyNzAsIDB4YTIwNSwgMHg3MDcyLCAweDc4ZWEsCisJMHgwZjdmLCAweDcwZDcsIDB4MDAwMCwgMHgyMDAxLCAweGE2NTMsIDB4MjAwNCwgMHhkMGE0LCAweDAwNDAsCisJMHg5NjU1LCAweDIwMTEsIDB4YThjYSwgMHgyMDEzLCAweDA3ZDAsIDB4ZDBhYywgMHgwMGMwLCAweDk2NWUsCisJMHgxMDc4LCAweDI2NzcsIDB4MDA3OCwgMHg5NjVlLCAweDEwNzgsIDB4YTRkOSwgMHgwMjdmLCAweDBlN2YsCisJMHgxMDc4LCAweDc3MmQsIDB4MDA3OCwgMHg5NDk3LCAweDEwNzgsIDB4NzcyZCwgMHgwMDdjLCAweDBkN2UsCisJMHgwNjdlLCAweDY2MTgsIDB4MjY2OCwgMHg2ZTA0LCAweGE2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweGE2ODYsCisJMHgwMDA2LCAweDAwNDAsIDB4OTY4NCwgMHhhNjg2LCAweDAwMDQsIDB4MDA0MCwgMHg5Njg0LCAweDZlMDQsCisJMHhhNmI0LCAweDAwZmYsIDB4YTY4NiwgMHgwMDA2LCAweDAwNDAsIDB4OTY4NCwgMHhhNjg2LCAweDAwMDQsCisJMHgwMDQwLCAweDk2ODQsIDB4YTA4NSwgMHgwMDAxLCAweDA2N2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDBkN2UsCisJMHgxMDc4LCAweDk2YmIsIDB4MGQ3ZiwgMHgwMDdjLCAweDBkN2UsIDB4MTA3OCwgMHg5NmNhLCAweDAwYzAsCisJMHg5NmI0LCAweDY4MGMsIDB4YTA4YywgMHhmZjAwLCAweDY4MjAsIDB4YTA4NCwgMHgwMGZmLCAweGExMTUsCisJMHg2MjEyLCAweDY4MjQsIDB4NjAyYSwgMHhkMWU0LCAweDAwNDAsIDB4OTZhMiwgMHgyMDA5LCAweDAwMDEsCisJMHgwMDc4LCAweDk2YjAsIDB4ZDFlYywgMHgwMDQwLCAweDk2YjQsIDB4NjkyMCwgMHhhMThjLCAweDAwZmYsCisJMHg2ODI0LCAweDEwNzgsIDB4MjU0ZCwgMHgwMGMwLCAweDk2YjQsIDB4MjExMCwgMHgyMDA5LCAweDAwMDAsCisJMHgxMDc4LCAweDI4YzgsIDB4MDA3OCwgMHg5NmI4LCAweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDk2YjksCisJMHhhMDA2LCAweDBkN2YsIDB4MDA3YywgMHgyMDY5LCAweGFiOGQsIDB4NjgwMCwgMHhhMDgyLCAweDAwMTAsCisJMHgwMGM4LCAweDk2YzgsIDB4NjAxMywgMHgwMDAwLCAweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDk2YzksCisJMHhhMDA2LCAweDAwN2MsIDB4NjAxMywgMHgwMDAwLCAweDIwNjksIDB4YWI4YywgMHg2ODA4LCAweGEwODQsCisJMHhmZjAwLCAweGEwODYsIDB4MDgwMCwgMHgwMGMwLCAweDk2ZGUsIDB4NjgwMCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDhlLCAweDAwMTQsIDB4MDA0MCwgMHg5NmRlLCAweGEwOGUsIDB4MDAxMCwgMHgwMDdjLCAweDYwMDQsCisJMHhhMGIyLCAweDAwNDQsIDB4MTBjOCwgMHgxMzMyLCAweGExYjYsIDB4MDAxMywgMHgwMGMwLCAweDk2ZWIsCisJMHgyMDA4LCAweDAwNzksIDB4OTZmZSwgMHhhMWI2LCAweDAwMjcsIDB4MDA0MCwgMHg5NmYzLCAweGExYjYsCisJMHgwMDE0LCAweDEwYzAsIDB4MTMzMiwgMHgyMDAxLCAweDAwMDcsIDB4MTA3OCwgMHg0NTM1LCAweDEwNzgsCisJMHg2MWNkLCAweDEwNzgsIDB4OGVjNiwgMHgxMDc4LCAweDYyZDEsIDB4MDA3YywgMHg5NzNlLCAweDk3NDAsCisJMHg5NzNlLCAweDk3M2UsIDB4OTczZSwgMHg5NzQwLCAweDk3NGMsIDB4OTdkNiwgMHg5Nzk5LCAweDk3ZDYsCisJMHg5N2FkLCAweDk3ZDYsIDB4OTc0YywgMHg5N2Q2LCAweDk3Y2UsIDB4OTdkNiwgMHg5N2NlLCAweDk3ZDYsCisJMHg5N2Q2LCAweDk3M2UsIDB4OTczZSwgMHg5NzNlLCAweDk3M2UsIDB4OTczZSwgMHg5NzNlLCAweDk3M2UsCisJMHg5NzNlLCAweDk3M2UsIDB4OTczZSwgMHg5NzNlLCAweDk3NDAsIDB4OTczZSwgMHg5N2Q2LCAweDk3M2UsCisJMHg5NzNlLCAweDk3ZDYsIDB4OTczZSwgMHg5N2Q2LCAweDk3ZDYsIDB4OTczZSwgMHg5NzNlLCAweDk3M2UsCisJMHg5NzNlLCAweDk3ZDYsIDB4OTdkNiwgMHg5NzNlLCAweDk3ZDYsIDB4OTdkNiwgMHg5NzNlLCAweDk3M2UsCisJMHg5NzNlLCAweDk3M2UsIDB4OTczZSwgMHg5NzQwLCAweDk3ZDYsIDB4OTdkNiwgMHg5NzNlLCAweDk3M2UsCisJMHg5N2Q2LCAweDk3ZDYsIDB4OTczZSwgMHg5NzNlLCAweDk3M2UsIDB4OTczZSwgMHgxMDc4LCAweDEzMzIsCisJMHgxMDc4LCAweDYxY2QsIDB4MjAwMSwgMHhhOGEyLCAweDIwMDQsIDB4NjAxNiwgMHg2MDAzLCAweDAwMDIsCisJMHgxMDc4LCAweDYyZDEsIDB4MDA3OCwgMHg5N2RjLCAweDBmN2UsIDB4MjA3OSwgMHhhNjUyLCAweDc4MDQsCisJMHgwZjdmLCAweGQwYWMsIDB4MDBjMCwgMHg5N2Q2LCAweDIwMDEsIDB4MDAwMCwgMHgxMDc4LCAweDQ0ZWUsCisJMHg2MDE4LCAweGEwODAsIDB4MDAwNCwgMHgyMDA0LCAweGEwODYsIDB4MDBmZiwgMHgwMDQwLCAweDk3ZDYsCisJMHgwYzdlLCAweDYwMTgsIDB4MjA2MCwgMHg2MDAwLCAweGQwZjQsIDB4MDBjMCwgMHg5NzcwLCAweDYwMTAsCisJMHhhMDA1LCAweDAwNDAsIDB4OTc3MCwgMHgwYzdmLCAweDEwNzgsIDB4MzY5OSwgMHgwMDc4LCAweDk3ZDYsCisJMHgwYzdmLCAweDIwMDEsIDB4YTYwMCwgMHgyMDA0LCAweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDk3N2YsCisJMHgwZjdlLCAweDIwNzksIDB4YTYwMCwgMHg3ODkwLCAweDgwMDAsIDB4Nzg5MiwgMHgwZjdmLCAweDIwMDEsCisJMHgwMDAyLCAweDEwNzgsIDB4NDUwMiwgMHgxMDc4LCAweDYxY2QsIDB4NjAxZiwgMHgwMDAxLCAweDYwMDMsCisJMHgwMDAxLCAweDYwMDcsIDB4MDAwMiwgMHgxMDc4LCAweDVkZDcsIDB4MTA3OCwgMHg2MmQxLCAweDBjN2UsCisJMHg2MTE4LCAweDIxNjAsIDB4MjAwOSwgMHgwMDAxLCAweDEwNzgsIDB4NWE1MiwgMHgwYzdmLCAweDAwNzgsCisJMHg5N2RjLCAweDY2MTgsIDB4MGQ3ZSwgMHgyNjY4LCAweDZlMDQsIDB4MGQ3ZiwgMHhhNmI0LCAweGZmMDAsCisJMHg4NjM3LCAweGE2ODYsIDB4MDAwNiwgMHgwMDQwLCAweDk3ZDYsIDB4YTY4NiwgMHgwMDA0LCAweDAwNDAsCisJMHg5N2Q2LCAweDIwMDEsIDB4MDAwNCwgMHgwMDc4LCAweDk3ZDQsIDB4MjAwMSwgMHhhNjAwLCAweDIwMDQsCisJMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHg5N2I2LCAweDEwNzgsIDB4MzY5OSwgMHgyMDAxLCAweDAwMDYsCisJMHgxMDc4LCAweDk3ZGQsIDB4NjYxOCwgMHgwZDdlLCAweDI2NjgsIDB4NmUwNCwgMHgwZDdmLCAweGE2YjQsCisJMHhmZjAwLCAweDg2MzcsIDB4YTY4NiwgMHgwMDA2LCAweDAwNDAsIDB4OTdkNiwgMHgyMDAxLCAweDAwMDYsCisJMHgwMDc4LCAweDk3ZDQsIDB4MjAwMSwgMHgwMDA0LCAweDAwNzgsIDB4OTdkNCwgMHgyMDAxLCAweDAwMDYsCisJMHgxMDc4LCAweDk3ZGQsIDB4MDA3OCwgMHg5N2Q2LCAweDEwNzgsIDB4NDUzNSwgMHgxMDc4LCAweDYxY2QsCisJMHgxMDc4LCAweDc3MmQsIDB4MTA3OCwgMHg2MmQxLCAweDAwN2MsIDB4MDE3ZSwgMHgwZDdlLCAweDYxMTgsCisJMHgyMTY4LCAweDY5MDAsIDB4ZDE4NCwgMHgwMDQwLCAweDk3ZjgsIDB4NjEwNCwgMHhhMThlLCAweDAwMGEsCisJMHgwMGMwLCAweDk3ZjAsIDB4Njk5YywgMHhkMWE0LCAweDAwYzAsIDB4OTdmMCwgMHgyMDAxLCAweDAwMDcsCisJMHgxMDc4LCAweDQ1MDIsIDB4MjAwMSwgMHgwMDAwLCAweDEwNzgsIDB4NDRlZSwgMHgxMDc4LCAweDI4YTYsCisJMHgwZDdmLCAweDAxN2YsIDB4MDA3YywgMHgwZDdlLCAweDY2MTgsIDB4MjY2OCwgMHg2ODA0LCAweGEwODQsCisJMHhmZjAwLCAweDgwMDcsIDB4MGQ3ZiwgMHhhMGIyLCAweDAwMGMsIDB4MTBjOCwgMHgxMzMyLCAweGExYjYsCisJMHgwMDE1LCAweDAwYzAsIDB4OTgwZiwgMHgxMDc5LCAweDk4MTYsIDB4MDA3OCwgMHg5ODE1LCAweGExYjYsCisJMHgwMDE2LCAweDEwYzAsIDB4MTMzMiwgMHgxMDc5LCAweDk4MjIsIDB4MDA3YywgMHg3ZDRlLCAweDdkNGUsCisJMHg3ZDRlLCAweDdkNGUsIDB4N2Q0ZSwgMHg3ZDRlLCAweDk4NzcsIDB4OTgyZSwgMHg3ZDRlLCAweDdkNGUsCisJMHg3ZDRlLCAweDdkNGUsIDB4N2Q0ZSwgMHg3ZDRlLCAweDdkNGUsIDB4N2Q0ZSwgMHg3ZDRlLCAweDdkNGUsCisJMHg5ODc3LCAweDk4N2YsIDB4N2Q0ZSwgMHg3ZDRlLCAweDdkNGUsIDB4N2Q0ZSwgMHgwZjdlLCAweDIwNzksCisJMHhhNjUyLCAweDc4MDQsIDB4ZDBhYywgMHgwMGMwLCAweDk4NTUsIDB4NjAxOCwgMHhhMDdkLCAweDAwNDAsCisJMHg5ODU1LCAweDc4MDAsIDB4ZDBmNCwgMHgwMGMwLCAweDk4NDEsIDB4NzgxMCwgMHhhMDA1LCAweDAwYzAsCisJMHg5ODU1LCAweDIwMDEsIDB4MDAwMCwgMHgxMDc4LCAweDQ0ZWUsIDB4MjAwMSwgMHgwMDAyLCAweDEwNzgsCisJMHg0NTAyLCAweDYwMWYsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAyLCAweDEwNzgsCisJMHg1ZGQ3LCAweDEwNzgsIDB4NjJkMSwgMHgwMDc4LCAweDk4NzUsIDB4MjAxMSwgMHhhYjgzLCAweDIyMDQsCisJMHg4MjExLCAweDIyMGMsIDB4MTA3OCwgMHgyNTRkLCAweDAwYzAsIDB4OTg3NSwgMHgwYzdlLCAweDEwNzgsCisJMHg0NWM0LCAweDAwNDAsIDB4OTg2OCwgMHgwYzdmLCAweDEwNzgsIDB4NzcyZCwgMHgwMDc4LCAweDk4NzUsCisJMHg2MDEwLCAweDAwN2UsIDB4NjAxNCwgMHgwMDdlLCAweDEwNzgsIDB4NDJmOCwgMHgwMDdmLCAweDYwMTYsCisJMHgwMDdmLCAweDYwMTIsIDB4MGM3ZiwgMHgxMDc4LCAweDc3MmQsIDB4MGY3ZiwgMHgwMDdjLCAweDY2MDQsCisJMHhhNmI2LCAweDAwMWUsIDB4MDBjMCwgMHg5ODdlLCAweDEwNzgsIDB4NzcyZCwgMHgwMDdjLCAweDEwNzgsCisJMHg3ZjhlLCAweDAwYzAsIDB4OTg4YiwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDEwNzgsCisJMHg1ZGQ3LCAweDAwNzgsIDB4OTg4ZCwgMHgxMDc4LCAweDc3MmQsIDB4MDA3YywgMHg2MDA0LCAweGEwOGEsCisJMHgwMDQ0LCAweDEwYzgsIDB4MTMzMiwgMHgxMDc4LCAweDYxY2QsIDB4MTA3OCwgMHg4ZWM2LCAweDEwNzgsCisJMHg2MmQxLCAweDAwN2MsIDB4YTE4MiwgMHgwMDQwLCAweDAwNzksIDB4OTg5ZSwgMHg5OGIxLCAweDk4YjEsCisJMHg5OGIxLCAweDk4YjEsIDB4OThiMywgMHg5OGIxLCAweDk4YjEsIDB4OThiMSwgMHg5OGIxLCAweDk4YjEsCisJMHg5OGIxLCAweDk4YjEsIDB4OThiMSwgMHg5OGIxLCAweDk4YjEsIDB4OThiMSwgMHg5OGIxLCAweDk4YjEsCisJMHg5OGIxLCAweDEwNzgsIDB4MTMzMiwgMHgwZDdlLCAweDBlN2UsIDB4MGY3ZSwgMHgxNTdlLCAweDA0N2UsCisJMHgwMjdlLCAweDYyMTgsIDB4YTI4MCwgMHgwMDJiLCAweDIwMDQsIDB4YTAwNSwgMHgwMDQwLCAweDk4YzQsCisJMHgyMDIxLCAweDAwMDAsIDB4MTA3OCwgMHhhNDcyLCAweDYxMDYsIDB4MjA3MSwgMHhhYjgwLCAweDc0NDQsCisJMHhhNGE0LCAweGZmMDAsIDB4MDA0MCwgMHg5OTFiLCAweGE0ODYsIDB4MjAwMCwgMHgwMGMwLCAweDk4ZDYsCisJMHgyMDA5LCAweDAwMDEsIDB4MjAxMSwgMHgwMjAwLCAweDEwNzgsIDB4NWJmMSwgMHgxMDc4LCAweDEzOGIsCisJMHgxMDQwLCAweDEzMzIsIDB4NjAwMywgMHgwMDA3LCAweDJkMDAsIDB4NjgzNywgMHgwMTBkLCAweDY4MDMsCisJMHgwMDAwLCAweDY4M2IsIDB4MDAwMCwgMHg2YzVhLCAweDJjMDAsIDB4Njg1ZSwgMHg2MDA4LCAweDY4YjIsCisJMHg2MDE4LCAweDIwNzgsIDB4NzhhMCwgMHg4MDA3LCAweDcxMzAsIDB4Njk0YSwgMHgwMTdlLCAweGEwODQsCisJMHhmZjAwLCAweDY4NDYsIDB4Njg0ZiwgMHgwMDAwLCAweDY4NTcsIDB4MDAzNiwgMHgxMDc4LCAweDRhNzMsCisJMHgwMTdmLCAweGE0ODYsIDB4MjAwMCwgMHgwMGMwLCAweDk5MDMsIDB4MjAxOSwgMHgwMDE3LCAweDEwNzgsCisJMHhhMTk1LCAweDAwNzgsIDB4OTk3ZCwgMHhhNDg2LCAweDA0MDAsIDB4MDBjMCwgMHg5OTBkLCAweDIwMTksCisJMHgwMDAyLCAweDEwNzgsIDB4YTE0NiwgMHgwMDc4LCAweDk5N2QsIDB4YTQ4NiwgMHgwMjAwLCAweDAwYzAsCisJMHg5OTEzLCAweDEwNzgsIDB4YTEyYiwgMHhhNDg2LCAweDEwMDAsIDB4MDBjMCwgMHg5OTE5LCAweDEwNzgsCisJMHhhMTdhLCAweDAwNzgsIDB4OTk3ZCwgMHgyMDY5LCAweGE5MzMsIDB4NmEwMCwgMHhkMjg0LCAweDAwNDAsCisJMHg5OWU3LCAweGEyODQsIDB4MDMwMCwgMHgwMGMwLCAweDk5ZGYsIDB4NjgwNCwgMHhhMDA1LCAweDAwNDAsCisJMHg5OWM1LCAweDJkNzgsIDB4NjAwMywgMHgwMDA3LCAweDEwNzgsIDB4MTM3MCwgMHgwMDQwLCAweDk5ODQsCisJMHg3ODAwLCAweGQwOGMsIDB4MDBjMCwgMHg5OTM3LCAweDc4MDQsIDB4ODAwMSwgMHg3ODA2LCAweDYwMTMsCisJMHgwMDAwLCAweDY4MDMsIDB4MDAwMCwgMHg2ODM3LCAweDAxMTYsIDB4NjgzYiwgMHgwMDAwLCAweDYwMDgsCisJMHg2OGIyLCAweDJjMDAsIDB4Njg0YSwgMHg2MDE4LCAweDIwNzgsIDB4NzhhMCwgMHg4MDA3LCAweDcxMzAsCisJMHg2OTg2LCAweDY4NDYsIDB4NzkyOCwgMHg2OThhLCAweDc5MmMsIDB4Njk4ZSwgMHg3OTMwLCAweDY5OTIsCisJMHg3OTM0LCAweDY5OTYsIDB4Njg1MywgMHgwMDNkLCAweDcyNDQsIDB4YTI5NCwgMHgwMDAzLCAweGEyODYsCisJMHgwMDAyLCAweDAwYzAsIDB4OTk1ZiwgMHg2ODRmLCAweDAwNDAsIDB4MDA3OCwgMHg5OTY5LCAweGEyODYsCisJMHgwMDAxLCAweDAwYzAsIDB4OTk2NywgMHg2ODRmLCAweDAwODAsIDB4MDA3OCwgMHg5OTY5LCAweDY4NGYsCisJMHgwMDAwLCAweDIwYTksIDB4MDAwYSwgMHgyMDAxLCAweGFiOTAsIDB4YWQ5MCwgMHgwMDE1LCAweDIwMGMsCisJMHg4MTBmLCAweDIxMTIsIDB4ODAwMCwgMHg4MjEwLCAweDAwZjAsIDB4OTk2ZiwgMHgyMDBjLCAweDY5ODIsCisJMHg4MDAwLCAweDIwMGMsIDB4Njk3ZSwgMHgxMDc4LCAweDRhNzMsIDB4MDI3ZiwgMHgwNDdmLCAweDE1N2YsCisJMHgwZjdmLCAweDBlN2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDIwMDEsIDB4YTYwZSwgMHgyMDA0LCAweGQwODQsCisJMHgwMDQwLCAweDk5OGUsIDB4MTA3OCwgMHgxMzhiLCAweDAwYzAsIDB4OTkzMCwgMHg2MDEzLCAweDAxMDAsCisJMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDQxLCAweDEwNzgsIDB4NWQ4YSwgMHgxMDc4LCAweDYyZDEsCisJMHgwMDc4LCAweDk5N2QsIDB4MjA2OSwgMHhhYjkyLCAweDJkMDQsIDB4YTA4NCwgMHhmZjAwLCAweGEwODYsCisJMHgxMjAwLCAweDAwYzAsIDB4OTliOSwgMHgyMDY5LCAweGFiODAsIDB4Njg2YywgMHhhMDg0LCAweDAwZmYsCisJMHgwMTdlLCAweDYxMTAsIDB4YTE4YywgMHgwNzAwLCAweGExMGQsIDB4NjExMiwgMHgwMTdmLCAweDYwMDMsCisJMHgwMDAxLCAweDYwMDcsIDB4MDA0MywgMHgxMDc4LCAweDVkOGEsIDB4MTA3OCwgMHg2MmQxLCAweDAwNzgsCisJMHg5OTdkLCAweDYwMTMsIDB4MDIwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDQxLCAweDEwNzgsCisJMHg1ZDhhLCAweDEwNzgsIDB4NjJkMSwgMHgwMDc4LCAweDk5N2QsIDB4MjAwMSwgMHhhNjBkLCAweDIwMDQsCisJMHhkMGVjLCAweDAwNDAsIDB4OTljZiwgMHgyMDExLCAweDgwNDksIDB4MTA3OCwgMHgzNjFiLCAweDYwMTMsCisJMHgwMzAwLCAweDAwNzgsIDB4OTlkNSwgMHg2MDEzLCAweDAxMDAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDQxLCAweDEwNzgsIDB4NWQ4YSwgMHgxMDc4LCAweDYyZDEsIDB4MDA3OCwgMHg5OTdkLCAweDYwMTMsCisJMHgwNTAwLCAweDAwNzgsIDB4OTlkNSwgMHg2MDEzLCAweDA2MDAsIDB4MDA3OCwgMHg5OTlhLCAweDYwMTMsCisJMHgwMjAwLCAweDAwNzgsIDB4OTk5YSwgMHhhMTg2LCAweDAwMTMsIDB4MDBjMCwgMHg5OWZkLCAweDYwMDQsCisJMHhhMDhhLCAweDAwNDAsIDB4MTA0OCwgMHgxMzMyLCAweGEwOGEsIDB4MDA1MywgMHgxMGM4LCAweDEzMzIsCisJMHhhMDgyLCAweDAwNDAsIDB4MjAwOCwgMHgwMDc5LCAweDlhODIsIDB4YTE4NiwgMHgwMDUxLCAweDAwNDAsCisJMHg5YTBhLCAweGExODYsIDB4MDA0NywgMHgwMGMwLCAweDlhMjMsIDB4NjAwNCwgMHhhMDg2LCAweDAwNDEsCisJMHgwMDQwLCAweDlhMzEsIDB4MjAwMSwgMHgwMTA5LCAweDIwMDQsIDB4ZDA4NCwgMHgwMDQwLCAweDlhMzEsCisJMHgxMjdlLCAweDIwOTEsIDB4MjIwMCwgMHgwMDdlLCAweDAxN2UsIDB4MDI3ZSwgMHgxMDc4LCAweDVjNTYsCisJMHgwMjdmLCAweDAxN2YsIDB4MDA3ZiwgMHgxMjdmLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsCisJMHg5YTMxLCAweDAwNzgsIDB4OWFjNywgMHhhMTg2LCAweDAwMjcsIDB4MDA0MCwgMHg5YTJiLCAweGExODYsCisJMHgwMDE0LCAweDEwYzAsIDB4MTMzMiwgMHg2MDA0LCAweGEwODIsIDB4MDA0MCwgMHgyMDA4LCAweDAwNzksCisJMHg5YTM0LCAweDEwNzgsIDB4Nzc3MywgMHgwMDdjLCAweDlhNDcsIDB4OWE0OSwgMHg5YTQ5LCAweDlhNzEsCisJMHg5YTQ3LCAweDlhNDcsIDB4OWE0NywgMHg5YTQ3LCAweDlhNDcsIDB4OWE0NywgMHg5YTQ3LCAweDlhNDcsCisJMHg5YTQ3LCAweDlhNDcsIDB4OWE0NywgMHg5YTQ3LCAweDlhNDcsIDB4OWE0NywgMHg5YTQ3LCAweDEwNzgsCisJMHgxMzMyLCAweDEwNzgsIDB4NjFjZCwgMHgxMDc4LCAweDYyZDEsIDB4MDM3ZSwgMHgwZDdlLCAweDYwMTAsCisJMHhhMDZkLCAweDAwNDAsIDB4OWE2ZSwgMHhhZDg0LCAweGYwMDAsIDB4MDA0MCwgMHg5YTZlLCAweDYwMDMsCisJMHgwMDAyLCAweDYwMTgsIDB4MjAwNCwgMHhkMGJjLCAweDAwYzAsIDB4OWE2ZSwgMHgyMDE5LCAweDAwMDQsCisJMHgxMDc4LCAweGExY2EsIDB4NjAxMywgMHgwMDAwLCAweDYwMTQsIDB4YTAwNSwgMHgwMGMwLCAweDlhNmMsCisJMHgyMDAxLCAweGE4YTMsIDB4MjAwNCwgMHg2MDE2LCAweDYwMDMsIDB4MDAwNywgMHgwZDdmLCAweDAzN2YsCisJMHgwMDdjLCAweDBkN2UsIDB4MTA3OCwgMHg2MWNkLCAweDEwNzgsIDB4NjJkMSwgMHgxMDc4LCAweDhkMDYsCisJMHgwMDQwLCAweDlhN2UsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsIDB4MTNhNCwgMHgxMDc4LCAweDhlYzYsCisJMHgwZDdmLCAweDAwN2MsIDB4OWE5NSwgMHg5YWI0LCAweDlhOWUsIDB4OWFjMSwgMHg5YTk1LCAweDlhOTUsCisJMHg5YTk1LCAweDlhOTUsIDB4OWE5NSwgMHg5YTk1LCAweDlhOTUsIDB4OWE5NSwgMHg5YTk1LCAweDlhOTUsCisJMHg5YTk1LCAweDlhOTUsIDB4OWE5NSwgMHg5YTk1LCAweDlhOTUsIDB4MTA3OCwgMHgxMzMyLCAweDYwMTAsCisJMHhhMDg4LCAweDAwMTMsIDB4MjEwNCwgMHhhMDg1LCAweDA0MDAsIDB4MjAwYSwgMHgxMDc4LCAweDYxY2QsCisJMHg2MDEwLCAweGEwODAsIDB4MDAxMywgMHgyMDA0LCAweGQwYjQsIDB4MDA0MCwgMHg5YWFmLCAweDYwMDMsCisJMHgwMDA3LCAweDIwMDksIDB4MDA0MywgMHgxMDc4LCAweDc3NWMsIDB4MDA3OCwgMHg5YWIxLCAweDYwMDMsCisJMHgwMDAyLCAweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweDEwNzgsIDB4NjFjZCwgMHgxMDc4LCAweGE0MjMsCisJMHgwMGMwLCAweDlhYmUsIDB4MTA3OCwgMHg1YmMxLCAweDEwNzgsIDB4NzcyZCwgMHgxMDc4LCAweDYyZDEsCisJMHgwMDdjLCAweDEwNzgsIDB4NjFjZCwgMHgyMDA5LCAweDAwNDEsIDB4MDA3OCwgMHg5YzFlLCAweGExODIsCisJMHgwMDQwLCAweDAwNzksIDB4OWFjYiwgMHg5YWRlLCAweDlhZTAsIDB4OWFkZSwgMHg5YWRlLCAweDlhZGUsCisJMHg5YWRlLCAweDlhZGUsIDB4OWFlMSwgMHg5YWRlLCAweDlhZGUsIDB4OWFkZSwgMHg5YWRlLCAweDlhZGUsCisJMHg5YWRlLCAweDlhZGUsIDB4OWFkZSwgMHg5YWRlLCAweDlhZWMsIDB4OWFkZSwgMHgxMDc4LCAweDEzMzIsCisJMHgwMDdjLCAweDYwMDMsIDB4MDAwNCwgMHg2MTEwLCAweDIwZTEsIDB4MDAwNSwgMHgzZDE4LCAweDNlMjAsCisJMHgyYzEwLCAweDEwNzgsIDB4MTVmYSwgMHgwMDdjLCAweDBkN2UsIDB4MTA3OCwgMHg1YmMxLCAweDBkN2YsCisJMHgxMDc4LCAweGE0OTUsIDB4MTA3OCwgMHg3NzJkLCAweDAwN2MsIDB4YTE4MiwgMHgwMDQwLCAweDAwNzksCisJMHg5YWY5LCAweDliMGMsIDB4OWIwYywgMHg5YjBjLCAweDliMGMsIDB4OWIwYywgMHg5YjBjLCAweDliMGMsCisJMHg5YjBlLCAweDliMGMsIDB4OWIxMSwgMHg5YjNjLCAweDliMGMsIDB4OWIwYywgMHg5YjBjLCAweDliMGMsCisJMHg5YjNjLCAweDliMGMsIDB4OWIwYywgMHg5YjBjLCAweDEwNzgsIDB4MTMzMiwgMHgxMDc4LCAweDc3NzMsCisJMHgwMDdjLCAweDEwNzgsIDB4NjI3YSwgMHgxMDc4LCAweDYzOWIsIDB4NjAxMCwgMHgwZDdlLCAweDIwNjgsCisJMHg2ODRjLCAweGQwZmMsIDB4MDA0MCwgMHg5YjI3LCAweGEwOGMsIDB4MDAwMywgMHhhMThlLCAweDAwMDIsCisJMHgwMDQwLCAweDliMmYsIDB4MjAwOSwgMHgwMDQxLCAweDBkN2YsIDB4MDA3OCwgMHg5YzFlLCAweDYwMDMsCisJMHgwMDA3LCAweDYwMTcsIDB4MDAwMCwgMHgxMDc4LCAweDViYzEsIDB4MGQ3ZiwgMHgwMDdjLCAweDEwNzgsCisJMHhhNDIzLCAweDAwNDAsIDB4OWIzNSwgMHgwZDdmLCAweDAwN2MsIDB4MTA3OCwgMHg1YmMxLCAweDEwNzgsCisJMHg3NzJkLCAweDBkN2YsIDB4MDA3OCwgMHg5YjJlLCAweDAzN2UsIDB4MTA3OCwgMHg2MjdhLCAweDEwNzgsCisJMHg2MzliLCAweDYwMTAsIDB4MGQ3ZSwgMHgyMDY4LCAweDYwMTgsIDB4MjAwNCwgMHhkMGJjLCAweDAwNDAsCisJMHg5YjVjLCAweDY4NGMsIDB4YTA4NCwgMHgwMDAzLCAweGEwODYsIDB4MDAwMiwgMHgwMDQwLCAweDliNTgsCisJMHg2ODdjLCAweDYzMmMsIDB4YTMxYSwgMHg2MzJlLCAweDY4ODAsIDB4NjMyOCwgMHhhMzFiLCAweDYzMmEsCisJMHg2MDAzLCAweDAwMDIsIDB4MDA3OCwgMHg5YjZkLCAweDIwMTksIDB4MDAwNCwgMHgxMDc4LCAweGExY2EsCisJMHg2MDE0LCAweGEwMDUsIDB4MDBjMCwgMHg5YjY5LCAweDIwMDEsIDB4YThhMywgMHgyMDA0LCAweDgwMDMsCisJMHg2MDE2LCAweDYwMTMsIDB4MDAwMCwgMHg2MDAzLCAweDAwMDcsIDB4MGQ3ZiwgMHgwMzdmLCAweDAwN2MsCisJMHhhMTg2LCAweDAwMTMsIDB4MDBjMCwgMHg5YjdlLCAweDYwMDQsIDB4YTA4NiwgMHgwMDQyLCAweDEwYzAsCisJMHgxMzMyLCAweDEwNzgsIDB4NjFjZCwgMHgxMDc4LCAweDYyZDEsIDB4MDA3YywgMHhhMTg2LCAweDAwMjcsCisJMHgwMDQwLCAweDliODYsIDB4YTE4NiwgMHgwMDE0LCAweDAwYzAsIDB4OWI5NiwgMHg2MDA0LCAweGEwODYsCisJMHgwMDQyLCAweDEwYzAsIDB4MTMzMiwgMHgyMDAxLCAweDAwMDcsIDB4MTA3OCwgMHg0NTM1LCAweDEwNzgsCisJMHg2MWNkLCAweDEwNzgsIDB4OGVjNiwgMHgxMDc4LCAweDYyZDEsIDB4MDA3YywgMHhhMTgyLCAweDAwNDAsCisJMHgwMDc5LCAweDliOWEsIDB4OWJhZCwgMHg5YmFkLCAweDliYWQsIDB4OWJhZCwgMHg5YmFkLCAweDliYWQsCisJMHg5YmFkLCAweDliYWYsIDB4OWJiYiwgMHg5YmFkLCAweDliYWQsIDB4OWJhZCwgMHg5YmFkLCAweDliYWQsCisJMHg5YmFkLCAweDliYWQsIDB4OWJhZCwgMHg5YmFkLCAweDliYWQsIDB4MTA3OCwgMHgxMzMyLCAweDAzN2UsCisJMHgwNDdlLCAweDIwZTEsIDB4MDAwNSwgMHgzZDE4LCAweDNlMjAsIDB4MmMxMCwgMHgxMDc4LCAweDE1ZmEsCisJMHgwNDdmLCAweDAzN2YsIDB4MDA3YywgMHg2MDEwLCAweDBkN2UsIDB4MjA2OCwgMHg2ODEwLCAweDZhMTQsCisJMHg2MTE4LCAweDIxMGMsIDB4ZDFiYywgMHgwMDQwLCAweDliZGEsIDB4NjEyNCwgMHhkMWY0LCAweDAwYzAsCisJMHg5YmRhLCAweDAwN2UsIDB4MDQ3ZSwgMHgwNTdlLCAweDZjN2MsIDB4YTQyMiwgMHg2ZDgwLCAweDIyMDAsCisJMHhhNTJiLCAweDYwMmMsIDB4YTQyMCwgMHg2NDJlLCAweDYwMjgsIDB4YTUyOSwgMHg2NTJhLCAweDA1N2YsCisJMHgwNDdmLCAweDAwN2YsIDB4YTIwZCwgMHgwMGMwLCAweDliZWUsIDB4Njg0YywgMHhkMGZjLCAweDAwNDAsCisJMHg5YmU2LCAweDIwMDksIDB4MDA0MSwgMHgwZDdmLCAweDAwNzgsIDB4OWMxZSwgMHg2MDAzLCAweDAwMDcsCisJMHg2MDE3LCAweDAwMDAsIDB4MTA3OCwgMHg1YmMxLCAweDBkN2YsIDB4MDA3YywgMHgwMDdlLCAweDBmN2UsCisJMHgyYzc4LCAweDEwNzgsIDB4NDk2MywgMHgwZjdmLCAweDAwN2YsIDB4MDA0MCwgMHg5YmZiLCAweDYwMDMsCisJMHgwMDAyLCAweDBkN2YsIDB4MDA3YywgMHgyMDA5LCAweGE2MGQsIDB4MjEwYywgMHhkMTljLCAweDAwNDAsCisJMHg5YzA1LCAweDYwMDMsIDB4MDAwNywgMHgwMDc4LCAweDljMDcsIDB4NjAwMywgMHgwMDA2LCAweDEwNzgsCisJMHg5YzBkLCAweDEwNzgsIDB4NWJjMywgMHgwZDdmLCAweDAwN2MsIDB4ZDJmYywgMHgwMDQwLCAweDljMTksCisJMHg4MDAyLCAweDgwMDAsIDB4ODIxMiwgMHhhMjkxLCAweDAwMDAsIDB4MjAwOSwgMHgwMDA5LCAweDAwNzgsCisJMHg5YzFiLCAweDIwMDksIDB4MDAxNSwgMHg2YTZhLCAweDY4NjYsIDB4MDA3YywgMHhhMTgyLCAweDAwNDAsCisJMHgwMDQ4LCAweDljMjQsIDB4MDA3OSwgMHg5YzMxLCAweGExODYsIDB4MDAxMywgMHgwMDQwLCAweDljMmMsCisJMHhhMTg2LCAweDAwMTQsIDB4MTBjMCwgMHgxMzMyLCAweDYwMjQsIDB4ZDBkYywgMHgxMDQwLCAweDEzMzIsCisJMHgwMDdjLCAweDljNDQsIDB4OWM0YiwgMHg5YzU3LCAweDljNjMsIDB4OWM0NCwgMHg5YzQ0LCAweDljNDQsCisJMHg5YzcyLCAweDljNDQsIDB4OWM0NiwgMHg5YzQ2LCAweDljNDQsIDB4OWM0NCwgMHg5YzQ0LCAweDljNDQsCisJMHg5YzQ0LCAweDljNDQsIDB4OWM0NCwgMHg5YzQ0LCAweDEwNzgsIDB4MTMzMiwgMHg2MDI0LCAweGQwZGMsCisJMHgxMDQwLCAweDEzMzIsIDB4MDA3YywgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgxMDc4LCAweDVkOGEsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDYyZDEsIDB4MTI3ZiwgMHgwMDdjLCAweDYwMDMsCisJMHgwMDAxLCAweDYxMDYsIDB4MTA3OCwgMHg1ZDhhLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsCisJMHg2MmQxLCAweDEyN2YsIDB4MDA3YywgMHg2MDAzLCAweDAwMDMsIDB4NjEwNiwgMHgyYzEwLCAweDEwNzgsCisJMHgxY2YwLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4NWRmNiwgMHgxMDc4LCAweDYzOWIsCisJMHgxMjdmLCAweDAwN2MsIDB4YTAxNiwgMHgxMDc4LCAweDE1ZmEsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDAzN2UsIDB4MGQ3ZSwgMHhhMTgyLCAweDAwNDAsIDB4MTA3OSwgMHg5YzgzLCAweDBkN2YsCisJMHgwMzdmLCAweDEyN2YsIDB4MDA3YywgMHg5YzkzLCAweDljOTUsIDB4OWNhYSwgMHg5Y2M5LCAweDljOTMsCisJMHg5YzkzLCAweDljOTMsIDB4OWNlMSwgMHg5YzkzLCAweDljOTMsIDB4OWM5MywgMHg5YzkzLCAweDljOTMsCisJMHg5YzkzLCAweDljOTMsIDB4OWM5MywgMHgxMDc4LCAweDEzMzIsIDB4NjAxMCwgMHgyMDY4LCAweDY4NGMsCisJMHhkMGZjLCAweDAwNDAsIDB4OWNiZiwgMHhhMDljLCAweDAwMDMsIDB4YTM5ZSwgMHgwMDAzLCAweDAwNDAsCisJMHg5Y2JmLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDEwNzgsIDB4NWQ4YSwgMHgxMDc4LCAweDYyZDEsCisJMHgwMDc4LCAweDljZTQsIDB4NjAxMCwgMHgyMDY4LCAweDY4NGMsIDB4ZDBmYywgMHgwMDQwLCAweDljYmYsCisJMHhhMDljLCAweDAwMDMsIDB4YTM5ZSwgMHgwMDAzLCAweDAwNDAsIDB4OWNiZiwgMHg2MDAzLCAweDAwMDEsCisJMHg2MTA2LCAweDEwNzgsIDB4NWQ4YSwgMHgxMDc4LCAweDYyZDEsIDB4MDA3OCwgMHg5Y2U0LCAweDYwMTMsCisJMHgwMDAwLCAweDYwMTcsIDB4MDAwMCwgMHgyMDE5LCAweDAwMDQsIDB4MTA3OCwgMHhhMWNhLCAweDAwNzgsCisJMHg5Y2U0LCAweDYwMTAsIDB4MjA2OCwgMHg2ODRjLCAweGQwZmMsIDB4MDA0MCwgMHg5Y2JmLCAweGEwOWMsCisJMHgwMDAzLCAweGEzOWUsIDB4MDAwMywgMHgwMDQwLCAweDljYmYsIDB4NjAwMywgMHgwMDAzLCAweDYxMDYsCisJMHgyYzEwLCAweDEwNzgsIDB4MWNmMCwgMHgxMDc4LCAweDVkZjYsIDB4MTA3OCwgMHg2MzliLCAweDAwNzgsCisJMHg5Y2U0LCAweGEwMTYsIDB4MTA3OCwgMHgxNWZhLCAweDAwN2MsIDB4MTA3OCwgMHg2MWNkLCAweDYxMTAsCisJMHg4MWZmLCAweDAwNDAsIDB4OWNmNiwgMHgwZDdlLCAweDIxNjgsIDB4MTA3OCwgMHhhNGUyLCAweDAzN2UsCisJMHgyMDE5LCAweDAwMjksIDB4MTA3OCwgMHhhMWNhLCAweDAzN2YsIDB4MGQ3ZiwgMHgxMDc4LCAweDhlYzYsCisJMHgxMDc4LCAweDYyZDEsIDB4MDA3YywgMHgxMDc4LCAweDYyN2EsIDB4NjExMCwgMHg4MWZmLCAweDAwNDAsCisJMHg5ZDBjLCAweDBkN2UsIDB4MjE2OCwgMHgxMDc4LCAweGE0ZTIsIDB4MDM3ZSwgMHgyMDE5LCAweDAwMjksCisJMHgxMDc4LCAweGExY2EsIDB4MDM3ZiwgMHgwZDdmLCAweDEwNzgsIDB4OGVjNiwgMHgxMDc4LCAweDYzOWIsCisJMHgwMDdjLCAweGExODIsIDB4MDA4NSwgMHgwMDc5LCAweDlkMTUsIDB4OWQxZSwgMHg5ZDFjLCAweDlkMWMsCisJMHg5ZDJhLCAweDlkMWMsIDB4OWQxYywgMHg5ZDFjLCAweDEwNzgsIDB4MTMzMiwgMHg2MDAzLCAweDAwMGIsCisJMHg2MTA2LCAweDEwNzgsIDB4NWQ4YSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDYyZDEsCisJMHgxMjdmLCAweDAwN2MsIDB4MDI3ZSwgMHgwZTdlLCAweDEwNzgsIDB4YTQxYywgMHgwMDQwLCAweDlkMzQsCisJMHgxMDc4LCAweDc3MmQsIDB4MDA3OCwgMHg5ZDUwLCAweDIwNzEsIDB4YWI4MCwgMHg3MjI0LCAweDYyMTIsCisJMHg3MjIwLCAweDEwNzgsIDB4YTA2OSwgMHgwMDQwLCAweDlkNDEsIDB4NjAwNywgMHgwMDg2LCAweDAwNzgsCisJMHg5ZDRhLCAweDYwMDcsIDB4MDA4NywgMHg3MjI0LCAweGEyOTYsIDB4ZmZmZiwgMHgwMGMwLCAweDlkNGEsCisJMHg2MDA3LCAweDAwODYsIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsIDB4NWQ4YSwgMHgxMDc4LCAweDYyZDEsCisJMHgwZTdmLCAweDAyN2YsIDB4MDA3YywgMHhhMTg2LCAweDAwMTMsIDB4MDBjMCwgMHg5ZDY0LCAweDYwMDQsCisJMHhhMDhhLCAweDAwODUsIDB4MTA0OCwgMHgxMzMyLCAweGEwOGEsIDB4MDA4YywgMHgxMGM4LCAweDEzMzIsCisJMHhhMDgyLCAweDAwODUsIDB4MDA3OSwgMHg5ZDdiLCAweGExODYsIDB4MDAyNywgMHgwMDQwLCAweDlkNzAsCisJMHhhMTg2LCAweDAwMTQsIDB4MDA0MCwgMHg5ZDcwLCAweDEwNzgsIDB4Nzc3MywgMHgwMDc4LCAweDlkN2EsCisJMHgyMDAxLCAweDAwMDcsIDB4MTA3OCwgMHg0NTM1LCAweDEwNzgsIDB4NjFjZCwgMHgxMDc4LCAweDhlYzYsCisJMHgxMDc4LCAweDYyZDEsIDB4MDA3YywgMHg5ZDgyLCAweDlkODQsIDB4OWQ4NCwgMHg5ZDgyLCAweDlkODIsCisJMHg5ZDgyLCAweDlkODIsIDB4MTA3OCwgMHgxMzMyLCAweDEwNzgsIDB4NjFjZCwgMHgxMDc4LCAweDhlYzYsCisJMHgxMDc4LCAweDYyZDEsIDB4MDA3YywgMHhhMTgyLCAweDAwODUsIDB4MTA0OCwgMHgxMzMyLCAweGExODIsCisJMHgwMDhjLCAweDEwYzgsIDB4MTMzMiwgMHhhMTgyLCAweDAwODUsIDB4MDA3OSwgMHg5ZDk3LCAweDlkOWUsCisJMHg5ZDllLCAweDlkOWUsIDB4OWRhMCwgMHg5ZDllLCAweDlkOWUsIDB4OWQ5ZSwgMHgxMDc4LCAweDEzMzIsCisJMHgwMDdjLCAweGExODYsIDB4MDAxMywgMHgwMDQwLCAweDlkYjEsIDB4YTE4NiwgMHgwMDE0LCAweDAwNDAsCisJMHg5ZGIxLCAweGExODYsIDB4MDAyNywgMHgwMDQwLCAweDlkYjEsIDB4MTA3OCwgMHg3NzczLCAweDAwNzgsCisJMHg5ZGI3LCAweDEwNzgsIDB4NjFjZCwgMHgxMDc4LCAweDhlYzYsIDB4MTA3OCwgMHg2MmQxLCAweDAwN2MsCisJMHgwMzdlLCAweDEwNzgsIDB4YTQ5NSwgMHg2MDNmLCAweDAwMDAsIDB4MjAxOSwgMHgwMDBiLCAweDEwNzgsCisJMHg5ZGM3LCAweDYwMWYsIDB4MDAwNiwgMHg2MDAzLCAweDAwMDcsIDB4MDM3ZiwgMHgwMDdjLCAweDEyN2UsCisJMHgwMzdlLCAweDIwOTEsIDB4ODAwMCwgMHgwODdlLCAweDJjNDAsIDB4MDk3ZSwgMHgyMDQ5LCAweDAwMDAsCisJMHgxMDc4LCAweDcyNDYsIDB4MDk3ZiwgMHgwODdmLCAweDAwYzAsIDB4OWUwMiwgMHgwNzdlLCAweDJjMzgsCisJMHgxMDc4LCAweDcyZjMsIDB4MDc3ZiwgMHgwMGMwLCAweDllMDIsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsCisJMHgwMDQwLCAweDllMDIsIDB4NjAxYywgMHhhMDg2LCAweDAwMDcsIDB4MDA0MCwgMHg5ZTAyLCAweDBkN2UsCisJMHg2MDAwLCAweGEwODYsIDB4MDAwNCwgMHgwMGMwLCAweDlkZjMsIDB4MTA3OCwgMHhhNDk1LCAweDYwMWYsCisJMHgwMDA3LCAweDEwNzgsIDB4MTc1NywgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4ZDA2LCAweDAwNDAsCisJMHg5ZGZiLCAweDEwNzgsIDB4YTFjYSwgMHgwZDdmLCAweDYwMTMsIDB4MDAwMCwgMHgxMDc4LCAweGE0OTUsCisJMHg2MDFmLCAweDAwMDcsIDB4MDM3ZiwgMHgxMjdmLCAweDAwN2MsIDB4MGY3ZSwgMHgwYzdlLCAweDAzN2UsCisJMHgxNTdlLCAweDIwNzksIDB4YWI4MCwgMHg3OTM4LCAweDc4M2MsIDB4MTA3OCwgMHgyNTRkLCAweDAwYzAsCisJMHg5ZTQ5LCAweDAxN2UsIDB4MGM3ZSwgMHgxMDc4LCAweDQ1YzQsIDB4MDBjMCwgMHg5ZTQ5LCAweDAxN2YsCisJMHgwMjdmLCAweDAyN2UsIDB4MDE3ZSwgMHgyMDE5LCAweDAwMjksIDB4MTA3OCwgMHg3M2QwLCAweDEwNzgsCisJMHg1ZjAxLCAweDA3N2UsIDB4MjAzOSwgMHgwMDAwLCAweDEwNzgsIDB4NWUwYSwgMHgwNzdmLCAweDAxN2YsCisJMHgwNzdlLCAweDIwMzksIDB4MDAwMCwgMHgxMDc4LCAweDlmOGIsIDB4MDc3ZiwgMHgxMDc4LCAweDQ3ZTksCisJMHgwMjdlLCAweDYyMDQsIDB4YTI5NCwgMHhmZjAwLCAweDgyMTcsIDB4YTI4NiwgMHgwMDA2LCAweDAwNDAsCisJMHg5ZTNkLCAweGEyODYsIDB4MDAwNCwgMHgwMGMwLCAweDllNDAsIDB4NjJhMCwgMHgxMDc4LCAweDI5NDIsCisJMHgwMjdmLCAweDAxN2YsIDB4MTA3OCwgMHg0MmY4LCAweDY2MTIsIDB4NjUxNiwgMHhhMDA2LCAweDAwNzgsCisJMHg5ZTRiLCAweDBjN2YsIDB4MDE3ZiwgMHgxNTdmLCAweDAzN2YsIDB4MGM3ZiwgMHgwZjdmLCAweDAwN2MsCisJMHgwYzdlLCAweDBkN2UsIDB4MGU3ZSwgMHgwMTdlLCAweDIwMDksIDB4YTYyMCwgMHgyMTA0LCAweGEwODYsCisJMHgwMDc0LCAweDAwYzAsIDB4OWViMywgMHgyMDY5LCAweGFiOGUsIDB4NjkwYywgMHhhMTgyLCAweDAxMDAsCisJMHgwMDQ4LCAweDllYTMsIDB4NjkwOCwgMHhhMTg0LCAweDgwMDAsIDB4MDA0MCwgMHg5ZWFmLCAweDYwMTgsCisJMHgyMDcwLCAweDcwMTAsIDB4YTA4NCwgMHgwMGZmLCAweDAwNDAsIDB4OWU3MiwgMHg3MDAwLCAweGQwZjQsCisJMHgwMDQwLCAweDllNzYsIDB4YTE4NCwgMHgwODAwLCAweDAwNDAsIDB4OWVhZiwgMHg2OTEwLCAweGExOGEsCisJMHgwMDAxLCAweDAwNDgsIDB4OWVhNywgMHg2OTE0LCAweDIwNjksIDB4YWJhZSwgMHg2OTA0LCAweDgxZmYsCisJMHgwMGMwLCAweDllOWIsIDB4NjkwYywgMHhhMTgyLCAweDAxMDAsIDB4MDA0OCwgMHg5ZWEzLCAweDY5MDgsCisJMHg4MWZmLCAweDAwYzAsIDB4OWU5ZiwgMHg2OTEwLCAweGExOGEsIDB4MDAwMSwgMHgwMDQ4LCAweDllYTcsCisJMHg2OTE4LCAweGExOGEsIDB4MDAwMSwgMHgwMDQ4LCAweDllYWYsIDB4MDA3OCwgMHg5ZWI5LCAweDYwMTMsCisJMHgwMTAwLCAweDAwNzgsIDB4OWViNSwgMHg2MDEzLCAweDAzMDAsIDB4MDA3OCwgMHg5ZWI1LCAweDYwMTMsCisJMHgwNTAwLCAweDAwNzgsIDB4OWViNSwgMHg2MDEzLCAweDA3MDAsIDB4MDA3OCwgMHg5ZWI1LCAweDYwMTMsCisJMHgwOTAwLCAweDAwNzgsIDB4OWViNSwgMHg2MDEzLCAweDBiMDAsIDB4MDA3OCwgMHg5ZWI1LCAweDYwMTMsCisJMHgwZjAwLCAweDAwNzgsIDB4OWViNSwgMHg2MDEzLCAweDJkMDAsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsCisJMHg5ZWJhLCAweGEwMDYsIDB4MDE3ZiwgMHgwZTdmLCAweDBkN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDBjN2UsCisJMHgwZDdlLCAweDAyN2UsIDB4MDM3ZSwgMHgxNTdlLCAweDYyMTgsIDB4MjI2OCwgMHg2YjA0LCAweGEzOTQsCisJMHgwMGZmLCAweGEyODYsIDB4MDAwNiwgMHgwMDQwLCAweDllZTMsIDB4YTI4NiwgMHgwMDA0LCAweDAwNDAsCisJMHg5ZWUzLCAweGEzOTQsIDB4ZmYwMCwgMHg4MjE3LCAweGEyODYsIDB4MDAwNiwgMHgwMDQwLCAweDllZTMsCisJMHhhMjg2LCAweDAwMDQsIDB4MDA0MCwgMHg5ZWUzLCAweDBjN2UsIDB4MmQ2MCwgMHgxMDc4LCAweDQ1ZDYsCisJMHgwYzdmLCAweDAwNzgsIDB4OWYxZSwgMHgyMDExLCAweGFiOTYsIDB4YWQ5OCwgMHgwMDBhLCAweDIwYTksCisJMHgwMDA0LCAweDEwNzgsIDB4ODBkZSwgMHgwMGMwLCAweDlmMWYsIDB4MjAxMSwgMHhhYjlhLCAweGFkOTgsCisJMHgwMDA2LCAweDIwYTksIDB4MDAwNCwgMHgxMDc4LCAweDgwZGUsIDB4MDBjMCwgMHg5ZjFmLCAweDA0N2UsCisJMHgwMTdlLCAweDZhYTAsIDB4YTI5NCwgMHgwMGZmLCAweDgyMjcsIDB4YTAwNiwgMHgyMDA5LCAweGE2NTMsCisJMHgyMTBjLCAweGQxYTQsIDB4MDA0MCwgMHg5ZjBiLCAweDIwMDksIDB4MDAyOSwgMHgxMDc4LCAweGEyMWQsCisJMHg2ODAwLCAweGMwZTUsIDB4NjgwMiwgMHgyMDE5LCAweDAwMjksIDB4MTA3OCwgMHg1ZjAxLCAweDA3N2UsCisJMHgyMDM5LCAweDAwMDAsIDB4MTA3OCwgMHg1ZTBhLCAweDJjMDgsIDB4MTA3OCwgMHg5ZjhiLCAweDA3N2YsCisJMHgyMDAxLCAweDAwMDcsIDB4MTA3OCwgMHg0NTM1LCAweDAxN2YsIDB4MDQ3ZiwgMHhhMDA2LCAweDE1N2YsCisJMHgwMzdmLCAweDAyN2YsIDB4MGQ3ZiwgMHgwYzdmLCAweDAwN2MsIDB4MGQ3ZSwgMHgyMDY5LCAweGFiOGUsCisJMHg2ODAwLCAweGEwODYsIDB4MDgwMCwgMHgwMDQwLCAweDlmMzEsIDB4NjAxMywgMHgwMDAwLCAweDAwNzgsCisJMHg5ZjMyLCAweGEwMDYsIDB4MGQ3ZiwgMHgwMDdjLCAweDBjN2UsIDB4MGY3ZSwgMHgwMTdlLCAweDAyN2UsCisJMHgwMzdlLCAweDE1N2UsIDB4MjA3OSwgMHhhYjhjLCAweDc5MzAsIDB4NzgzNCwgMHgxMDc4LCAweDI1NGQsCisJMHgwMGMwLCAweDlmNTgsIDB4MTA3OCwgMHg0NWM0LCAweDAwYzAsIDB4OWY1OCwgMHgyMDExLCAweGFiOTAsCisJMHhhYzk4LCAweDAwMGEsIDB4MjBhOSwgMHgwMDA0LCAweDEwNzgsIDB4ODBkZSwgMHgwMGMwLCAweDlmNTgsCisJMHgyMDExLCAweGFiOTQsIDB4YWM5OCwgMHgwMDA2LCAweDIwYTksIDB4MDAwNCwgMHgxMDc4LCAweDgwZGUsCisJMHgxNTdmLCAweDAzN2YsIDB4MDI3ZiwgMHgwMTdmLCAweDBmN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDBjN2UsCisJMHgwMDdlLCAweDAxN2UsIDB4MDI3ZSwgMHgwMzdlLCAweDE1N2UsIDB4MjAxMSwgMHhhYjgzLCAweDIyMDQsCisJMHg4MjExLCAweDIyMGMsIDB4MTA3OCwgMHgyNTRkLCAweDAwYzAsIDB4OWY4NCwgMHgxMDc4LCAweDQ1YzQsCisJMHgwMGMwLCAweDlmODQsIDB4MjAxMSwgMHhhYjk2LCAweGFjOTgsIDB4MDAwYSwgMHgyMGE5LCAweDAwMDQsCisJMHgxMDc4LCAweDgwZGUsIDB4MDBjMCwgMHg5Zjg0LCAweDIwMTEsIDB4YWI5YSwgMHhhYzk4LCAweDAwMDYsCisJMHgyMGE5LCAweDAwMDQsIDB4MTA3OCwgMHg4MGRlLCAweDE1N2YsIDB4MDM3ZiwgMHgwMjdmLCAweDAxN2YsCisJMHgwMDdmLCAweDBjN2YsIDB4MDA3YywgMHgwZTdlLCAweDBjN2UsIDB4MDg3ZSwgMHgwNzdlLCAweDA2N2UsCisJMHgwNTdlLCAweDA0N2UsIDB4MDI3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyNzQwLCAweDIwMjksCisJMHhhOGJhLCAweDI1MmMsIDB4MjAyMSwgMHhhOGMwLCAweDI0MjQsIDB4MjA2MSwgMHhhZDAwLCAweDIwNzEsCisJMHhhNjAwLCAweDc2NDgsIDB4NzA2NCwgMHg4MWZmLCAweDAwNDAsIDB4OWZiMiwgMHgwMDdlLCAweGExODYsCisJMHhhOWIzLCAweDAwN2YsIDB4MDA0MCwgMHg5ZmIyLCAweDgwMDEsIDB4YTYwMiwgMHgwMGM4LCAweGEwMWMsCisJMHgwMDc4LCAweDlmYjUsIDB4YTYwNiwgMHgwMDQwLCAweGEwMWMsIDB4MjEwMCwgMHhhYzA2LCAweDAwNDAsCisJMHhhMDEyLCAweDEwNzgsIDB4YTI0MiwgMHgwMDQwLCAweGEwMTIsIDB4NjcxYywgMHhhNzg2LCAweDAwMDEsCisJMHgwMDQwLCAweGEwMzcsIDB4YTc4NiwgMHgwMDA0LCAweDAwNDAsIDB4YTAzNywgMHhhNzg2LCAweDAwMDcsCisJMHgwMDQwLCAweGEwMTIsIDB4MjUwMCwgMHhhYzA2LCAweDAwNDAsIDB4YTAxMiwgMHgyNDAwLCAweGFjMDYsCisJMHgwMDQwLCAweGEwMTIsIDB4MTA3OCwgMHhhMjU2LCAweDAwYzAsIDB4YTAxMiwgMHg4OGZmLCAweDAwNDAsCisJMHg5ZmRkLCAweDYwMjAsIDB4YTkwNiwgMHgwMGMwLCAweGEwMTIsIDB4MGQ3ZSwgMHg2MDAwLCAweGEwODYsCisJMHgwMDA0LCAweDAwYzAsIDB4OWZlNywgMHgwMTdlLCAweDEwNzgsIDB4MTc1NywgMHgwMTdmLCAweGE3ODYsCisJMHgwMDA4LCAweDAwYzAsIDB4OWZmNiwgMHgxMDc4LCAweDhmMDAsIDB4MDBjMCwgMHg5ZmY2LCAweDEwNzgsCisJMHg3YzgzLCAweDBkN2YsIDB4MTA3OCwgMHg4ZWM2LCAweDAwNzgsIDB4YTAxMiwgMHg2MDEwLCAweDIwNjgsCisJMHgxMDc4LCAweDhkMDYsIDB4MDA0MCwgMHhhMDBmLCAweGE3ODYsIDB4MDAwMywgMHgwMGMwLCAweGEwMjYsCisJMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsIDB4MTA3OCwgMHhhNGUyLCAweDAxN2UsCisJMHgxMDc4LCAweDhmN2QsIDB4MTA3OCwgMHg0YTczLCAweDAxN2YsIDB4MTA3OCwgMHg4ZWI5LCAweDBkN2YsCisJMHgxMDc4LCAweDhlYzYsIDB4YWNlMCwgMHgwMDEwLCAweDIwMDEsIDB4YTYxNiwgMHgyMDA0LCAweGFjMDIsCisJMHgwMGM4LCAweGEwMWMsIDB4MDA3OCwgMHg5ZjlmLCAweDEyN2YsIDB4MDI3ZiwgMHgwNDdmLCAweDA1N2YsCisJMHgwNjdmLCAweDA3N2YsIDB4MDg3ZiwgMHgwYzdmLCAweDBlN2YsIDB4MDA3YywgMHhhNzg2LCAweDAwMDYsCisJMHgwMGMwLCAweGEwMDAsIDB4YTM4NiwgMHgwMDA1LCAweDAwNDAsIDB4YTAzNCwgMHgxMDc4LCAweGE0ZTIsCisJMHgxMDc4LCAweGExY2EsIDB4MDA3OCwgMHhhMDBmLCAweDBkN2YsIDB4MDA3OCwgMHhhMDEyLCAweDEwNzgsCisJMHhhMjU2LCAweDAwYzAsIDB4YTAxMiwgMHg4MWZmLCAweDAwNDAsIDB4YTAxMiwgMHhhMTgwLCAweDAwMDEsCisJMHgyMDA0LCAweGEwODYsIDB4MDAxOCwgMHgwMDQwLCAweGEwNGMsIDB4YTE4MCwgMHgwMDAxLCAweDIwMDQsCisJMHhhMDg2LCAweDAwMmQsIDB4MDBjMCwgMHhhMDEyLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsCisJMHhhMDEyLCAweDEwNzgsIDB4OGVlYywgMHgwMDQwLCAweGEwNWQsIDB4MTA3OCwgMHg4ZjAwLCAweDAwYzAsCisJMHhhMDEyLCAweDEwNzgsIDB4N2M4MywgMHgwMDc4LCAweGEwNjUsIDB4MTA3OCwgMHgyOGE2LCAweDEwNzgsCisJMHg4ZjAwLCAweDAwYzAsIDB4YTA2NSwgMHgxMDc4LCAweDdjODMsIDB4MTA3OCwgMHg4ZWM2LCAweDAwNzgsCisJMHhhMDEyLCAweDBjN2UsIDB4MGU3ZSwgMHgwMTdlLCAweDJjMDgsIDB4MjE3MCwgMHhhMDA2LCAweDEwNzgsCisJMHhhMWU2LCAweDAxN2YsIDB4MDA0MCwgMHhhMDc5LCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLCAweDEwNzksCisJMHhhMDdjLCAweDBlN2YsIDB4MGM3ZiwgMHgwMDdjLCAweGEwODQsIDB4YTA4NCwgMHhhMDg0LCAweGEwODQsCisJMHhhMDg0LCAweGEwODQsIDB4YTA4NiwgMHhhMDg0LCAweGEwMDYsIDB4MDA3YywgMHgwNDdlLCAweDAxN2UsCisJMHg3MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDI0LCAweGE0YTQsIDB4MDBmZiwgMHg4NDI3LCAweDJjMDAsCisJMHgyMDA5LCAweDAwMjAsIDB4MTA3OCwgMHhhMjFkLCAweDAxN2YsIDB4MDQ3ZiwgMHgwMzdlLCAweDIwMTksCisJMHgwMDAyLCAweDEwNzgsIDB4OWRjNywgMHgwMzdmLCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweDIwMDEsCisJMHgwMDAxLCAweDEwNzgsIDB4NDRlZSwgMHgxNTdlLCAweDAxN2UsIDB4MDI3ZSwgMHgwMzdlLCAweDIwYTksCisJMHgwMDA0LCAweDIwMTksIDB4YTYwNSwgMHgyMDExLCAweGFiOTYsIDB4MTA3OCwgMHg4MGRlLCAweDAzN2YsCisJMHgwMjdmLCAweDAxN2YsIDB4MTU3ZiwgMHhhMDA1LCAweDAwN2MsIDB4MGY3ZSwgMHgwZTdlLCAweDBjN2UsCisJMHgwODdlLCAweDA3N2UsIDB4MDY3ZSwgMHgwMjdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDI3NDAsCisJMHgyMDYxLCAweGFkMDAsIDB4MjA3OSwgMHgwMDAxLCAweDhmZmYsIDB4MDA0MCwgMHhhMTFkLCAweDIwNzEsCisJMHhhNjAwLCAweDc2NDgsIDB4NzA2NCwgMHg4MDAxLCAweGE2MDIsIDB4MDBjOCwgMHhhMTFkLCAweDg4ZmYsCisJMHgwMDQwLCAweGEwZDgsIDB4MjgwMCwgMHhhYzA2LCAweDAwYzAsIDB4YTExMywgMHgyMDc5LCAweDAwMDAsCisJMHgxMDc4LCAweGEyNDIsIDB4MDA0MCwgMHhhMTEzLCAweDI0MDAsIDB4YWMwNiwgMHgwMDQwLCAweGExMTMsCisJMHg2NzFjLCAweGE3ODYsIDB4MDAwNiwgMHgwMGMwLCAweGExMTMsIDB4YTc4NiwgMHgwMDA3LCAweDAwNDAsCisJMHhhMTEzLCAweDg4ZmYsIDB4MDBjMCwgMHhhMGY3LCAweDYwMTgsIDB4YTIwNiwgMHgwMGMwLCAweGExMTMsCisJMHg4NWZmLCAweDAwNDAsIDB4YTBmNywgMHg2MDIwLCAweGExMDYsIDB4MDBjMCwgMHhhMTEzLCAweDBkN2UsCisJMHg2MDAwLCAweGEwODYsIDB4MDAwNCwgMHgwMGMwLCAweGExMDMsIDB4MTA3OCwgMHhhNDk1LCAweDYwMWYsCisJMHgwMDA3LCAweDEwNzgsIDB4MTc1NywgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4ZDA2LCAweDAwNDAsCisJMHhhMTBkLCAweDA0N2UsIDB4MTA3OCwgMHhhMWNhLCAweDA0N2YsIDB4MGQ3ZiwgMHgxMDc4LCAweDhlYzYsCisJMHg4OGZmLCAweDAwYzAsIDB4YTEyNywgMHhhY2UwLCAweDAwMTAsIDB4MjAwMSwgMHhhNjE2LCAweDIwMDQsCisJMHhhYzAyLCAweDAwYzgsIDB4YTExZCwgMHgwMDc4LCAweGEwYzQsIDB4YTAwNiwgMHgxMjdmLCAweDAyN2YsCisJMHgwNjdmLCAweDA3N2YsIDB4MDg3ZiwgMHgwYzdmLCAweDBlN2YsIDB4MGY3ZiwgMHgwMDdjLCAweGE4YzUsCisJMHgwMDAxLCAweDAwNzgsIDB4YTExZSwgMHgwNzdlLCAweDA1N2UsIDB4MDg3ZSwgMHgyMDQxLCAweDAwMDAsCisJMHgyMDI5LCAweDAwMDEsIDB4MmMyMCwgMHgyMDE5LCAweDAwMDIsIDB4NjIxOCwgMHgwOTdlLCAweDIwNDksCisJMHgwMDAwLCAweDEwNzgsIDB4NzI0NiwgMHgwOTdmLCAweDA4N2YsIDB4MjAzOSwgMHgwMDAwLCAweDEwNzgsCisJMHg3MmYzLCAweDEwNzgsIDB4YTBiNSwgMHgwNTdmLCAweDA3N2YsIDB4MDA3YywgMHgwMjdlLCAweDA0N2UsCisJMHgwNTdlLCAweDA3N2UsIDB4MGM3ZSwgMHgxNTdlLCAweDJjMjAsIDB4MjEyOCwgMHgyMGE5LCAweDAwN2YsCisJMHgyMDA5LCAweDAwMDAsIDB4MDE3ZSwgMHgwMzdlLCAweDEwNzgsIDB4NDVjNCwgMHgwMGMwLCAweGExNmUsCisJMHgyYzEwLCAweDA1N2UsIDB4MDg3ZSwgMHgyMDQxLCAweDAwMDAsIDB4MjUwOCwgMHgyMDI5LCAweDAwMDEsCisJMHgwOTdlLCAweDIwNDksIDB4MDAwMCwgMHgxMDc4LCAweDcyNDYsIDB4MDk3ZiwgMHgwODdmLCAweDIwMzksCisJMHgwMDAwLCAweDEwNzgsIDB4NzJmMywgMHgxMDc4LCAweGEwYjUsIDB4MDU3ZiwgMHgwMzdmLCAweDAxN2YsCisJMHg4MTA4LCAweDAwZjAsIDB4YTE1MiwgMHgxNTdmLCAweDBjN2YsIDB4MDc3ZiwgMHgwNTdmLCAweDA0N2YsCisJMHgwMjdmLCAweDAwN2MsIDB4MDc3ZSwgMHgwNTdlLCAweDYyMTgsIDB4MDg3ZSwgMHgyMDQxLCAweDAwMDAsCisJMHgyMDI5LCAweDAwMDEsIDB4MjAxOSwgMHgwMDQ4LCAweDA5N2UsIDB4MjA0OSwgMHgwMDAwLCAweDEwNzgsCisJMHg3MjQ2LCAweDA5N2YsIDB4MDg3ZiwgMHgyMDM5LCAweDAwMDAsIDB4MTA3OCwgMHg3MmYzLCAweDJjMjAsCisJMHgxMDc4LCAweGEwYjUsIDB4MDU3ZiwgMHgwNzdmLCAweDAwN2MsIDB4MDI3ZSwgMHgwNDdlLCAweDA1N2UsCisJMHgwNzdlLCAweDBjN2UsIDB4MTU3ZSwgMHgyYzIwLCAweDIwYTksIDB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsCisJMHgwMTdlLCAweDAzN2UsIDB4MTA3OCwgMHg0NWM0LCAweDAwYzAsIDB4YTFiZSwgMHgyYzEwLCAweDA4N2UsCisJMHgyMDQxLCAweDAwMDAsIDB4MjgyOCwgMHgwNDdlLCAweDIwMjEsIDB4MDAwMSwgMHgxMDc4LCAweGE0NzIsCisJMHgwNDdmLCAweDA5N2UsIDB4MjA0OSwgMHgwMDAwLCAweDEwNzgsIDB4NzI0NiwgMHgwOTdmLCAweDA4N2YsCisJMHgyMDM5LCAweDAwMDAsIDB4MTA3OCwgMHg3MmYzLCAweDEwNzgsIDB4YTBiNSwgMHgwMzdmLCAweDAxN2YsCisJMHg4MTA4LCAweDAwZjAsIDB4YTFhMCwgMHgxNTdmLCAweDBjN2YsIDB4MDc3ZiwgMHgwNTdmLCAweDA0N2YsCisJMHgwMjdmLCAweDAwN2MsIDB4MDE3ZSwgMHgwZjdlLCAweGFkODIsIDB4Y2QwMCwgMHgwMDQ4LCAweGExZTMsCisJMHhhZDgyLCAweGZmZmYsIDB4MDBjOCwgMHhhMWUzLCAweDY4MDAsIDB4YTA3ZCwgMHgwMDQwLCAweGExZTAsCisJMHg2ODAzLCAweDAwMDAsIDB4NmI1MiwgMHgxMDc4LCAweDRhNzMsIDB4MmY2OCwgMHgwMDc4LCAweGExZDQsCisJMHg2YjUyLCAweDEwNzgsIDB4NGE3MywgMHgwZjdmLCAweDAxN2YsIDB4MDA3YywgMHgwZTdlLCAweDA0N2UsCisJMHgwMzdlLCAweDIwNjEsIDB4YWQwMCwgMHhhMDA1LCAweDAwYzAsIDB4YTFmNiwgMHgyMDcxLCAweGE2MDAsCisJMHg3NDQ4LCAweDcwNjQsIDB4ODAwMSwgMHhhNDAyLCAweDAwYzgsIDB4YTIxOCwgMHgyMTAwLCAweGFjMDYsCisJMHgwMDQwLCAweGEyMGEsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwgMHhhMjBhLCAweDYwMDgsCisJMHhhMjA2LCAweDAwYzAsIDB4YTIwYSwgMHg2MDE4LCAweGExYTAsIDB4MDAwNiwgMHgyNDI0LCAweGE0MDYsCisJMHgwMDQwLCAweGEyMTQsIDB4YWNlMCwgMHgwMDEwLCAweDIwMDEsIDB4YTYxNiwgMHgyMDA0LCAweGFjMDIsCisJMHgwMGM4LCAweGEyMTgsIDB4MDA3OCwgMHhhMWY2LCAweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweGEyMTksCisJMHhhMDA2LCAweDAzN2YsIDB4MDQ3ZiwgMHgwZTdmLCAweDAwN2MsIDB4MGQ3ZSwgMHgwMDdlLCAweDEwNzgsCisJMHgxMzhiLCAweDAwN2YsIDB4MTA0MCwgMHgxMzMyLCAweDY4MzcsIDB4MDEwZCwgMHg2ODVlLCAweDAyN2UsCisJMHgyMDEwLCAweDEwNzgsIDB4OGNmMiwgMHgyMDAxLCAweDAwMDAsIDB4MDA0MCwgMHhhMjMzLCAweDIyMDAsCisJMHhhMDgwLCAweDAwMDgsIDB4MjAwNCwgMHgwMjdmLCAweDY4NGEsIDB4Njk1NiwgMHg2YzQ2LCAweDY4NGYsCisJMHgwMDAwLCAweGEwMDYsIDB4NjhiMiwgMHg2ODAyLCAweDY4M2EsIDB4Njg1YSwgMHgxMDc4LCAweDRhNzMsCisJMHgwZDdmLCAweDAwN2MsIDB4NjcwMCwgMHhhNzg2LCAweDAwMDAsIDB4MDA0MCwgMHhhMjU1LCAweGE3ODYsCisJMHgwMDAxLCAweDAwNDAsIDB4YTI1NSwgMHhhNzg2LCAweDAwMGEsIDB4MDA0MCwgMHhhMjU1LCAweGE3ODYsCisJMHgwMDA5LCAweDAwNDAsIDB4YTI1NSwgMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHgwZTdlLCAweDYwMTgsCisJMHgyMDcwLCAweDcwYTAsIDB4YTIwNiwgMHgwZTdmLCAweDAwN2MsIDB4MDE3ZSwgMHg2MDA0LCAweGEwOGUsCisJMHgwMDFlLCAweDAwYzAsIDB4YTI3NywgMHg4MDA3LCAweDYxMzAsIDB4YTE4YywgMHgwMGZmLCAweGExMDUsCisJMHg2MDMyLCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAxZiwgMHgwMDA1LCAweDIwMDEsCisJMHhhOGEzLCAweDIwMDQsIDB4NjAxNiwgMHgxMDc4LCAweDVkOGEsIDB4MTA3OCwgMHg2MmQxLCAweDAxN2YsCisJMHgwMDdjLCAweDAwMDUsIDB4MDAwNSwgMHgwMDdjLCAweDYwMjQsIDB4ZDBlNCwgMHgwMDQwLCAweGEyOGQsCisJMHhkMGNjLCAweDAwNDAsIDB4YTI4NywgMHgxMDc4LCAweDhmYmYsIDB4MDA3OCwgMHhhMjhkLCAweDEwNzgsCisJMHhhNDk1LCAweDEwNzgsIDB4NWJjMSwgMHgxMDc4LCAweDc3MmQsIDB4MDA3YywgMHhhMjgwLCAweDAwMDcsCisJMHgyMDA0LCAweGEwODQsIDB4MDAwZiwgMHgwMDc5LCAweGEyOTUsIDB4YTI5ZSwgMHhhMjllLCAweGEyOWUsCisJMHhhMmEwLCAweGEyOWUsIDB4YTJhMCwgMHhhMmEwLCAweGEyOWUsIDB4YTJhMCwgMHhhMDA2LCAweDAwN2MsCisJMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHhhMjgwLCAweDAwMDcsIDB4MjAwNCwgMHhhMDg0LCAweDAwMGYsCisJMHgwMDc5LCAweGEyYWEsIDB4YTJiMywgMHhhMmIzLCAweGEyYjMsIDB4YTJiMywgMHhhMmIzLCAweGEyYjMsCisJMHhhMmJlLCAweGEyYjMsIDB4YTJiMywgMHg2MDA3LCAweDAwM2IsIDB4NjAyYiwgMHgwMDA5LCAweDYwMTMsCisJMHgyYTAwLCAweDYwMDMsIDB4MDAwMSwgMHgxMDc4LCAweDVkOGEsIDB4MDA3YywgMHgwYzdlLCAweDIyNjAsCisJMHgxMDc4LCAweGE0OTUsIDB4NjAzZiwgMHgwMDAwLCAweDYwMjQsIDB4YzBmNCwgMHhjMGNjLCAweDYwMjYsCisJMHgwYzdmLCAweDBkN2UsIDB4MjI2OCwgMHhhMTg2LCAweDAwMDcsIDB4MDBjMCwgMHhhMzFmLCAweDY4MTAsCisJMHhhMDA1LCAweDAwNDAsIDB4YTJkYywgMHhhMDgwLCAweDAwMTMsIDB4MjAwNCwgMHhkMGZjLCAweDAwYzAsCisJMHhhMmRjLCAweDBkN2YsIDB4MDA3OCwgMHhhMmIzLCAweDYwMDcsIDB4MDAzYSwgMHg2MDAzLCAweDAwMDEsCisJMHgxMDc4LCAweDVkOGEsIDB4MTA3OCwgMHg2MmQxLCAweDBjN2UsIDB4MmQ2MCwgMHg2MTAwLCAweGExODYsCisJMHgwMDAyLCAweDAwYzAsIDB4YTNhZCwgMHg2MDEwLCAweGEwMDUsIDB4MDBjMCwgMHhhMmY2LCAweDYwMDAsCisJMHhhMDg2LCAweDAwMDcsIDB4MTBjMCwgMHgxMzMyLCAweDAwNzgsIDB4YTNhZCwgMHhhMDhjLCAweGYwMDAsCisJMHgwMGMwLCAweGEzMDIsIDB4MDA3OCwgMHhhMzAyLCAweDIwNjgsIDB4NjgwMCwgMHhhMDA1LCAweDAwYzAsCisJMHhhMmZjLCAweDJkMDAsIDB4YTA4MCwgMHgwMDEzLCAweDIwMDQsIDB4YTA4NCwgMHgwMDAzLCAweGEwODYsCisJMHgwMDAyLCAweDAwYzAsIDB4YTMxYiwgMHg2MDEwLCAweDIwNjgsIDB4Njg0YywgMHhjMGRjLCAweGMwZjQsCisJMHg2ODRlLCAweDY4NTAsIDB4YzBmNCwgMHhjMGZjLCAweDY4NTIsIDB4MjAwOSwgMHgwMDQzLCAweDEwNzgsCisJMHg5YzFlLCAweDAwNzgsIDB4YTNhZCwgMHgyMDA5LCAweDAwNDEsIDB4MDA3OCwgMHhhM2E3LCAweGExODYsCisJMHgwMDA1LCAweDAwYzAsIDB4YTM2NiwgMHg2ODEwLCAweGEwODAsIDB4MDAxMywgMHgyMDA0LCAweGQwYmMsCisJMHgwMGMwLCAweGEzMmQsIDB4MGQ3ZiwgMHgwMDc4LCAweGEyYjMsIDB4ZDBiNCwgMHgwMDQwLCAweGEzMzUsCisJMHhkMGZjLCAweDEwNDAsIDB4MTMzMiwgMHgwMDc4LCAweGEyY2YsIDB4NjAwNywgMHgwMDNhLCAweDYwMDMsCisJMHgwMDAxLCAweDEwNzgsIDB4NWQ4YSwgMHgxMDc4LCAweDYyZDEsIDB4MGM3ZSwgMHgyZDYwLCAweDYxMDAsCisJMHhhMTg2LCAweDAwMDIsIDB4MDA0MCwgMHhhMzQ4LCAweGExODYsIDB4MDAwNCwgMHgwMGMwLCAweGEzYWQsCisJMHgyMDcxLCAweGE4ZTcsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHhhMzU1LCAweDcwMDQsCisJMHhhYzA2LCAweDAwYzAsIDB4YTM1NSwgMHg3MDAzLCAweDAwMDAsIDB4NjgxMCwgMHhhMDgwLCAweDAwMTMsCisJMHgyMDBjLCAweGMxZjQsIDB4YzFkYywgMHgyMTAyLCAweDgwMDAsIDB4MjAwYywgMHhjMWY0LCAweGMxZmMsCisJMHhjMWJjLCAweDIxMDIsIDB4MjAwOSwgMHgwMDQyLCAweDAwNzgsIDB4YTNhNywgMHgwMzdlLCAweDBkN2UsCisJMHgwZDdlLCAweDEwNzgsIDB4MTM4YiwgMHgwMzdmLCAweDEwNDAsIDB4MTMzMiwgMHg2ODM3LCAweDAxMGQsCisJMHg2ODAzLCAweDAwMDAsIDB4NjgzYiwgMHgwMDAwLCAweDY4NWIsIDB4MDAwMCwgMHg2YjVlLCAweDY4NTcsCisJMHgwMDQ1LCAweDJjMDAsIDB4Njg2MiwgMHg2MDM0LCAweDY4NzIsIDB4MjM2MCwgMHg2MDI0LCAweGMwZGQsCisJMHg2MDI2LCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4YTA4NCwgMHgwMGZmLCAweDgwMDcsCisJMHg2MzIwLCAweDZiNGEsIDB4Njg0NiwgMHg2ODRmLCAweDAwMDAsIDB4NmQ2YSwgMHg2ZTY2LCAweDY4NmYsCisJMHgwMDAxLCAweDEwNzgsIDB4NGE3MywgMHgyMDE5LCAweDAwNDUsIDB4NjAwOCwgMHgyMDY4LCAweDEwNzgsCisJMHg5ZGM3LCAweDJkMDAsIDB4NjAwYSwgMHg2MDFmLCAweDAwMDYsIDB4NjAwMywgMHgwMDA3LCAweDYwMTcsCisJMHgwMDAwLCAweDYwM2YsIDB4MDAwMCwgMHgwZDdmLCAweDAzN2YsIDB4MDA3OCwgMHhhM2FlLCAweDYwM2YsCisJMHgwMDAwLCAweDYwMDMsIDB4MDAwNywgMHgxMDc4LCAweDljMWUsIDB4MGM3ZiwgMHgwZDdmLCAweDAwN2MsCisJMHhhMTg2LCAweDAwMTMsIDB4MDBjMCwgMHhhM2JhLCAweDYwMDQsIDB4YTA4MiwgMHgwMDg1LCAweDIwMDgsCisJMHgwMDc5LCAweGEzZDQsIDB4YTE4NiwgMHgwMDI3LCAweDAwYzAsIDB4YTNjZCwgMHgxMDc4LCAweDYxY2QsCisJMHgwMzdlLCAweDBkN2UsIDB4NjAxMCwgMHgyMDY4LCAweDIwMTksIDB4MDAwNCwgMHgxMDc4LCAweGExY2EsCisJMHgwZDdmLCAweDAzN2YsIDB4MTA3OCwgMHg2MmQxLCAweDAwN2MsIDB4YTE4NiwgMHgwMDE0LCAweDAwNDAsCisJMHhhM2JlLCAweDEwNzgsIDB4Nzc3MywgMHgwMDdjLCAweGEzZGQsIDB4YTNkYiwgMHhhM2RiLCAweGEzZGIsCisJMHhhM2RiLCAweGEzZGIsIDB4YTNkZCwgMHgxMDc4LCAweDEzMzIsIDB4MTA3OCwgMHg2MWNkLCAweDYwMDMsCisJMHgwMDBjLCAweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweGExODIsIDB4MDA4YywgMHgwMGM4LCAweGEzZWUsCisJMHhhMTgyLCAweDAwODUsIDB4MDA0OCwgMHhhM2VlLCAweDAwNzksIDB4YTNmMSwgMHgxMDc4LCAweDc3NzMsCisJMHgwMDdjLCAweGEzZjgsIDB4YTNmOCwgMHhhM2Y4LCAweGEzZjgsIDB4YTNmYSwgMHhhNDE5LCAweGEzZjgsCisJMHgxMDc4LCAweDEzMzIsIDB4MGQ3ZSwgMHgyYzY4LCAweDEwNzgsIDB4NzZjNywgMHgwMDQwLCAweGE0MTQsCisJMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDFlLCAweDIwMDksIDB4YWI4ZSwgMHgyMTBjLCAweDYxMzYsCisJMHgyMDA5LCAweGFiOGYsIDB4MjEwYywgMHg2MTNhLCAweDYwMGIsIDB4ZmZmZiwgMHg2OTE4LCAweDYxMWEsCisJMHg2MDFmLCAweDAwMDQsIDB4MTA3OCwgMHg1ZDhhLCAweDJkNjAsIDB4MTA3OCwgMHg3NzJkLCAweDBkN2YsCisJMHgwMDdjLCAweDEwNzgsIDB4NzcyZCwgMHgwMDdjLCAweDBlN2UsIDB4NjAxOCwgMHgyMDcwLCAweDcwMDAsCisJMHhkMGVjLCAweDBlN2YsIDB4MDA3YywgMHg2MDEwLCAweGEwOGMsIDB4ZjAwMCwgMHgwMDQwLCAweGE0NzEsCisJMHhhMDgwLCAweDAwMTMsIDB4MjAwYywgMHhkMWVjLCAweDAwNDAsIDB4YTQ3MSwgMHgyMDAxLCAweGE2NzIsCisJMHgyMDA0LCAweGQwZWMsIDB4MDA0MCwgMHhhNDcxLCAweDYwMDMsIDB4MDAwMiwgMHg2MDI0LCAweGMwZTUsCisJMHg2MDI2LCAweGQxYWMsIDB4MDA0MCwgMHhhNDRmLCAweDBmN2UsIDB4MmM3OCwgMHgxMDc4LCAweDQ5NWYsCisJMHgwZjdmLCAweDAwNDAsIDB4YTQ0ZiwgMHgyMDAxLCAweGE4YTQsIDB4MjAwNCwgMHg2MDNlLCAweDIwMDksCisJMHhhNjcyLCAweDIxMGMsIDB4ZDFmNCwgMHgwMGMwLCAweGE0NmYsIDB4MDA3OCwgMHhhNDYxLCAweDIwMDksCisJMHhhNjcyLCAweDIxMGMsIDB4ZDFmNCwgMHgwMDQwLCAweGE0NWIsIDB4NjAyNCwgMHhjMGU0LCAweDYwMjYsCisJMHhhMDA2LCAweDAwNzgsIDB4YTQ3MSwgMHgyMDAxLCAweGE4YTQsIDB4MjAwYywgMHg4MTAzLCAweGExMDAsCisJMHg2MDNlLCAweDYwMTgsIDB4YTA4OCwgMHgwMDJiLCAweDIxMDQsIDB4YTAwNSwgMHgwMDQwLCAweGE0NmMsCisJMHhhMDg4LCAweDAwMDMsIDB4MDA3OCwgMHhhNDY0LCAweDJjMGEsIDB4NjAwZiwgMHgwMDAwLCAweGEwODUsCisJMHgwMDAxLCAweDAwN2MsIDB4MDE3ZSwgMHgwYzdlLCAweDBlN2UsIDB4NjEyMCwgMHhhMmYwLCAweDAwMmIsCisJMHgyZTA0LCAweDIwNjAsIDB4OGNmZiwgMHgwMDQwLCAweGE0OTEsIDB4ODRmZiwgMHgwMGMwLCAweGE0ODQsCisJMHg2MDIwLCAweGExMDYsIDB4MDBjMCwgMHhhNDhjLCAweDYwMGMsIDB4MjA3MiwgMHgxMDc4LCAweDViYzEsCisJMHgxMDc4LCAweDc3MmQsIDB4MDA3OCwgMHhhNDhlLCAweGFjZjAsIDB4MDAwMywgMHgyZTY0LCAweDAwNzgsCisJMHhhNDdhLCAweDBlN2YsIDB4MGM3ZiwgMHgwMTdmLCAweDAwN2MsIDB4MGQ3ZSwgMHg2MDE4LCAweGEwZTgsCisJMHgwMDJiLCAweDJkMDQsIDB4YTAwNSwgMHgwMDQwLCAweGE0YTcsIDB4YWMwNiwgMHgwMDQwLCAweGE0YTUsCisJMHgyZDA0LCAweGEwZTgsIDB4MDAwMywgMHgwMDc4LCAweGE0OTksIDB4NjAwYywgMHgyMDZhLCAweDBkN2YsCisJMHgwMDdjLCAweDAyN2UsIDB4MDM3ZSwgMHgxNTdlLCAweDIwMTEsIDB4YTYyNiwgMHgyMjA0LCAweGEwODQsCisJMHgwMGZmLCAweDIwMTksIDB4YWI4ZSwgMHgyMzM0LCAweGE2MzYsIDB4MDBjMCwgMHhhNGQ1LCAweDgzMTgsCisJMHgyMzM0LCAweDIyMDQsIDB4YTA4NCwgMHhmZjAwLCAweGE2MzYsIDB4MDBjMCwgMHhhNGQ1LCAweDIwMTEsCisJMHhhYjkwLCAweDYwMTgsIDB4YTA5OCwgMHgwMDBhLCAweDIwYTksIDB4MDAwNCwgMHgxMDc4LCAweDgwZGUsCisJMHgwMGMwLCAweGE0ZDUsIDB4MjAxMSwgMHhhYjk0LCAweDYwMTgsIDB4YTA5OCwgMHgwMDA2LCAweDIwYTksCisJMHgwMDA0LCAweDEwNzgsIDB4ODBkZSwgMHgwMGMwLCAweGE0ZDUsIDB4MTU3ZiwgMHgwMzdmLCAweDAyN2YsCisJMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhNjAwLCAweDEwNzgsIDB4NDJiOCwgMHgxMDc4LCAweDI2NzcsCisJMHgwZTdmLCAweDAwN2MsIDB4MGU3ZSwgMHg2MDE4LCAweDIwNzAsIDB4NzAwMCwgMHhkMGZjLCAweDAwNDAsCisJMHhhNGViLCAweDEwNzgsIDB4YTRlZCwgMHgwZTdmLCAweDAwN2MsIDB4Njg1MCwgMHhjMGU1LCAweDY4NTIsCisJMHgwMDdjLCAweDBlN2UsIDB4MGM3ZSwgMHgwNzdlLCAweDA2N2UsIDB4MDU3ZSwgMHgwNDdlLCAweDAyN2UsCisJMHgwMTdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwMjksIDB4YThiYSwgMHgyNTJjLCAweDIwMjEsCisJMHhhOGMwLCAweDI0MjQsIDB4MjA2MSwgMHhhZDAwLCAweDIwNzEsIDB4YTYwMCwgMHg3NjQ4LCAweDcwNjQsCisJMHhhNjA2LCAweDAwNDAsIDB4YTU0NSwgMHg2NzFjLCAweGE3ODYsIDB4MDAwMSwgMHgwMDQwLCAweGE1MTQsCisJMHhhNzg2LCAweDAwMDgsIDB4MDBjMCwgMHhhNTNiLCAweDI1MDAsIDB4YWMwNiwgMHgwMDQwLCAweGE1M2IsCisJMHgyNDAwLCAweGFjMDYsIDB4MDA0MCwgMHhhNTNiLCAweDEwNzgsIDB4YTI0MiwgMHgwMDQwLCAweGE1M2IsCisJMHgxMDc4LCAweGEyNTYsIDB4MDBjMCwgMHhhNTNiLCAweDYwMDAsIDB4YTA4NiwgMHgwMDA0LCAweDAwYzAsCisJMHhhNTJkLCAweDAxN2UsIDB4MTA3OCwgMHgxNzU3LCAweDAxN2YsIDB4MTA3OCwgMHg4ZWVjLCAweDAwYzAsCisJMHhhNTMzLCAweDEwNzgsIDB4MjhhNiwgMHgxMDc4LCAweDhmMDAsIDB4MDBjMCwgMHhhNTM5LCAweDEwNzgsCisJMHg3YzgzLCAweDEwNzgsIDB4OGVjNiwgMHhhY2UwLCAweDAwMTAsIDB4MjAwMSwgMHhhNjE2LCAweDIwMDQsCisJMHhhYzAyLCAweDAwYzgsIDB4YTU0NSwgMHgwMDc4LCAweGE1MDQsIDB4MTI3ZiwgMHgwMTdmLCAweDAyN2YsCisJMHgwNDdmLCAweDA1N2YsIDB4MDY3ZiwgMHgwNzdmLCAweDBjN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDEyN2UsCisJMHgwMDdlLCAweDBlN2UsIDB4MDE3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhNjQwLCAweGQ1YTQsCisJMHgwMDQwLCAweGE1NWQsIDB4NzAzNCwgMHg4MDAwLCAweDcwMzYsIDB4ZDViNCwgMHgwMDQwLCAweGE1NjMsCisJMHg3MDMwLCAweDgwMDAsIDB4NzAzMiwgMHhkNWFjLCAweDAwNDAsIDB4YTU3OSwgMHgyNTAwLCAweGEwODQsCisJMHgwMDA3LCAweGEwOGUsIDB4MDAwMywgMHgwMDQwLCAweGE1NzksIDB4YTA4ZSwgMHgwMDA0LCAweDAwNDAsCisJMHhhNTc5LCAweGEwOGUsIDB4MDAwNSwgMHgwMDQwLCAweGE1NzksIDB4MjA3MSwgMHhhNjRhLCAweDEwNzgsCisJMHhhNWJhLCAweDAxN2YsIDB4MGU3ZiwgMHgwMDdmLCAweDEyN2YsIDB4MDA3YywgMHgxMjdlLCAweDAwN2UsCisJMHgwZTdlLCAweDAxN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YTY0MCwgMHhkNWE0LCAweDAwNDAsCisJMHhhNThjLCAweDcwMzQsIDB4ODAwMCwgMHg3MDM2LCAweGQ1YjQsIDB4MDA0MCwgMHhhNTkyLCAweDcwMzAsCisJMHg4MDAwLCAweDcwMzIsIDB4ZDVhYywgMHgwMDQwLCAweGE1YTgsIDB4MjUwMCwgMHhhMDg0LCAweDAwMDcsCisJMHhhMDhlLCAweDAwMDMsIDB4MDA0MCwgMHhhNWE4LCAweGEwOGUsIDB4MDAwNCwgMHgwMDQwLCAweGE1YTgsCisJMHhhMDhlLCAweDAwMDUsIDB4MDA0MCwgMHhhNWE4LCAweDIwNzEsIDB4YTY0YSwgMHgxMDc4LCAweGE1YmEsCisJMHgwMTdmLCAweDBlN2YsIDB4MDA3ZiwgMHgxMjdmLCAweDAwN2MsIDB4MTI3ZSwgMHgwMDdlLCAweDBlN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhNjQyLCAweDEwNzgsIDB4YTViYSwgMHgwZTdmLCAweDAwN2YsCisJMHgxMjdmLCAweDAwN2MsIDB4MmUwNCwgMHg4MDAwLCAweDIwNzIsIDB4MDBjOCwgMHhhNWMzLCAweDhlNzAsCisJMHgyZTA0LCAweDgwMDAsIDB4MjA3MiwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhNjQwLCAweDEwNzgsCisJMHhhNWJhLCAweDBlN2YsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YTY0NCwgMHgxMDc4LCAweGE1YmEsCisJMHgwZTdmLCAweDAwN2MsIDB4MTI3ZSwgMHgwMDdlLCAweDBlN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsCisJMHhhNjQwLCAweDcwNDQsIDB4ODAwMCwgMHg3MDQ2LCAweDBlN2YsIDB4MDA3ZiwgMHgxMjdmLCAweDAwN2MsCisJMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCisJMHgwMTAwLCAweDAyMDAsIDB4MDQwMCwgMHgwODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwLCAweDgwMDAsCisJMHhhNTBjCit9OworI2lmZGVmIFVOSVFVRV9GV19OQU1FCit1bnNpZ25lZCBzaG9ydCBmdzIxMDB0cF9sZW5ndGgwMSA9IDB4OTVmMTsKKyNlbHNlCit1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfbGVuZ3RoMDEgPSAweDk1ZjE7CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWwyMjAwLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDIyMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjU2OThkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWwyMjAwLmMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIFFMb2dpYyBJU1AyMjAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ2hyaXN0b3BoIEhlbGx3aWcuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBRTG9naWMgQ29ycG9yYXRpb24gKHd3dy5xbG9naWMuY29tKQorICoKKyAqIFJlbGVhc2VkIHVuZGVyIEdQTCB2Mi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSAicWxhX2RlZi5oIgorCitzdGF0aWMgY2hhciBxbGFfZHJpdmVyX25hbWVbXSA9ICJxbGEyMjAwIjsKKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgIGZ3MjIwMHRwX3ZlcnNpb25bXTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyICBmdzIyMDB0cF92ZXJzaW9uX3N0cltdOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGZ3MjIwMHRwX2FkZHIwMTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBmdzIyMDB0cF9jb2RlMDFbXTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBmdzIyMDB0cF9sZW5ndGgwMTsKKworc3RhdGljIHN0cnVjdCBxbGFfZndfaW5mbyBxbGFfZndfdGJsW10gPSB7CisJeworCQkuYWRkcmVzc2luZwk9IEZXX0lORk9fQUREUl9OT1JNQUwsCisJCS5md2NvZGUJCT0gJmZ3MjIwMHRwX2NvZGUwMVswXSwKKwkJLmZ3bGVuCQk9ICZmdzIyMDB0cF9sZW5ndGgwMSwKKwkJLmZ3c3RhcnQJPSAmZncyMjAwdHBfYWRkcjAxLAorCX0sCisKKwl7IEZXX0lORk9fQUREUl9OT01PUkUsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHFsYV9ib2FyZF9pbmZvIHFsYV9ib2FyZF90YmwgPSB7CisJLmRydl9uYW1lCT0gcWxhX2RyaXZlcl9uYW1lLAorCisJLmlzcF9uYW1lCT0gIklTUDIyMDAiLAorCS5md19pbmZvCT0gcWxhX2Z3X3RibCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBxbGEyMjAwX3BjaV90YmxbXSA9IHsKKwl7CisJCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9RTE9HSUMsCisJCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjIwMCwKKwkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEJPSAodW5zaWduZWQgbG9uZykmcWxhX2JvYXJkX3RibCwKKwl9LAorCisJezAsIDB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBxbGEyMjAwX3BjaV90YmwpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorcWxhMjIwMF9wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gcWxhMngwMF9wcm9iZV9vbmUocGRldiwKKwkgICAgKHN0cnVjdCBxbGFfYm9hcmRfaW5mbyAqKWlkLT5kcml2ZXJfZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAorcWxhMjIwMF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXFsYTJ4MDBfcmVtb3ZlX29uZShwZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHFsYTIyMDBfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAicWxhMjIwMCIsCisJLmlkX3RhYmxlCT0gcWxhMjIwMF9wY2lfdGJsLAorCS5wcm9iZQkJPSBxbGEyMjAwX3Byb2JlX29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHFsYTIyMDBfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdAorcWxhMjIwMF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcWxhMjIwMF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitxbGEyMjAwX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnFsYTIyMDBfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHFsYTIyMDBfaW5pdCk7Cittb2R1bGVfZXhpdChxbGEyMjAwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJRTG9naWMgQ29ycG9yYXRpb24iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUUxvZ2ljIElTUDIyeHggRkMtU0NTSSBIb3N0IEJ1cyBBZGFwdGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oUUxBMlhYWF9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsMjIwMF9mdy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWwyMjAwX2Z3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxMmRjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsMjIwMF9mdy5jCkBAIC0wLDAgKzEsNTMyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyAqCisgKiBRTG9naWMgSVNQMngwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAyLjYueAorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUUxvZ2ljIENvcnBvcmF0aW9uCisgKiAod3d3LnFsb2dpYy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRmlybXdhcmUgVmVyc2lvbiAyLjAyLjA2ICgwODo0NiBKdW4gMjYsIDIwMDMpCisgKi8KKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCit1bnNpZ25lZCBzaG9ydCBmdzIyMDB0cF92ZXJzaW9uID0gMioxMDI0KzI7CisjZWxzZQordW5zaWduZWQgc2hvcnQgcmlzY19jb2RlX3ZlcnNpb24gPSAyKjEwMjQrMjsKKyNlbmRpZgorCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3Vuc2lnbmVkIGNoYXIgZncyMjAwdHBfdmVyc2lvbl9zdHJbXSA9IHsyLDIsNn07CisjZWxzZQordW5zaWduZWQgY2hhciBmaXJtd2FyZV92ZXJzaW9uW10gPSB7MiwyLDZ9OworI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQorI2RlZmluZSBmdzIyMDB0cF9WRVJTSU9OX1NUUklORyAiMi4wMi4wNiIKKyNlbHNlCisjZGVmaW5lIEZXX1ZFUlNJT05fU1RSSU5HICIyLjAyLjA2IgorI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQordW5zaWduZWQgc2hvcnQgZncyMjAwdHBfYWRkcjAxID0gMHgxMDAwIDsKKyNlbHNlCit1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfYWRkcjAxID0gMHgxMDAwIDsKKyNlbmRpZgorCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3Vuc2lnbmVkIHNob3J0IGZ3MjIwMHRwX2NvZGUwMVtdID0geyAKKyNlbHNlCit1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGUwMVtdID0geyAKKyNlbmRpZgorCTB4MDQ3MCwgMHgwMDAwLCAweDAwMDAsIDB4YTQ2ZiwgMHgwMDAwLCAweDAwMDIsIDB4MDAwMiwgMHgwMDA2LAorCTB4MDAxNywgMHgyMDQzLCAweDRmNTAsIDB4NTk1MiwgMHg0OTQ3LCAweDQ4NTQsIDB4MjAzMiwgMHgzMDMwLAorCTB4MzEyMCwgMHg1MTRjLCAweDRmNDcsIDB4NDk0MywgMHgyMDQzLCAweDRmNTIsIDB4NTA0ZiwgMHg1MjQxLAorCTB4NTQ0OSwgMHg0ZjRlLCAweDIwNDksIDB4NTM1MCwgMHgzMjMyLCAweDMwMzAsIDB4MjA0NiwgMHg2OTcyLAorCTB4NmQ3NywgMHg2MTcyLCAweDY1MjAsIDB4MjA1NiwgMHg2NTcyLCAweDczNjksIDB4NmY2ZSwgMHgyMDMwLAorCTB4MzIyZSwgMHgzMDMyLCAweDJlMzAsIDB4MzYyMCwgMHgyMDIwLCAweDIwMjAsIDB4MjQwMCwgMHgyMGMxLAorCTB4MDAwNSwgMHgyMDAxLCAweDAxN2YsIDB4MjAwMywgMHgwMDAwLCAweDIwYzksIDB4YmFmZiwgMHgyMDkxLAorCTB4MjAwMCwgMHgyMDU5LCAweDAwMDAsIDB4MmI3OCwgMHg3ODIzLCAweDAwMDQsIDB4MjA4OSwgMHgyOTZhLAorCTB4MjA1MSwgMHhiNTAwLCAweDJhNzAsIDB4MjAyOSwgMHhlZDAwLCAweDIwMzEsIDB4ZmZmZiwgMHgyMDM5LAorCTB4ZWNlOSwgMHgyMDIxLCAweDAyMDAsIDB4MDgwNCwgMHgxNDY4LCAweDIwYTEsIDB4YjQ2ZiwgMHhhMDBlLAorCTB4MjBhOSwgMHgwODkxLCAweDQxYTQsIDB4MzQwMCwgMHg3NTYyLCAweDc2NjYsIDB4Nzc1ZSwgMHg3NDZhLAorCTB4NzQ2ZSwgMHgyMGExLCAweGJkMDAsIDB4NzE2NCwgMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwgMHg4MTBkLAorCTB4YTE4YywgMHgwMDBmLCAweDIwMDEsIDB4MDAwYiwgMHhhMTEyLCAweGEwMGUsIDB4MjFhOCwgMHg0MWE0LAorCTB4MzQwMCwgMHg4MjExLCAweDFkZDgsIDB4NzE2NCwgMHgzNDAwLCAweGExMDIsIDB4MDEyMCwgMHgwMjE4LAorCTB4MjBhOCwgMHhhMDBlLCAweDQxYTQsIDB4MzgwMCwgMHhkMDhjLCAweDAxZDgsIDB4MjAwOSwgMHhiNTAwLAorCTB4ODEwZCwgMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwgMHhhMThjLCAweDAwMGYsIDB4MjAwMSwgMHgwMDAxLAorCTB4YTExMiwgMHgyMGExLCAweDEwMDAsIDB4YTAwZSwgMHgyMWE4LCAweDQxYTQsIDB4ODIxMSwgMHgxZGUwLAorCTB4MjAwOSwgMHhiNTAwLCAweDM0MDAsIDB4YTEwMiwgMHgwMTIwLCAweDAyMTgsIDB4MjBhOCwgMHhhMDBlLAorCTB4NDFhNCwgMHgwODBjLCAweDE0MTEsIDB4MDgwYywgMHgxNjMyLCAweDA4MGMsIDB4MTdjZiwgMHgwODBjLAorCTB4MWZhMiwgMHgwODBjLCAweDRiZmYsIDB4MDgwYywgMHg4NWJmLCAweDA4MGMsIDB4MTViYiwgMHgwODBjLAorCTB4MmVjNCwgMHgwODBjLCAweDVkOGEsIDB4MDgwYywgMHg1MzQxLCAweDA4MGMsIDB4NjhjZSwgMHgwODBjLAorCTB4MjUxMCwgMHgwODBjLCAweDZiNjEsIDB4MDgwYywgMHg2M2JiLCAweDA4MGMsIDB4MjNjYSwgMHgwODBjLAorCTB4MjRkZSwgMHgyMDkxLCAweDMwMDksIDB4NzgyMywgMHgwMDAwLCAweDEwMDQsIDB4MTBjNSwgMHg3ODIwLAorCTB4YTA4NiwgMHgwMDAyLCAweDExNTAsIDB4NzgyMywgMHg0MDAwLCAweDBlMDQsIDB4MTBiZCwgMHg3ODFiLAorCTB4MDAwMSwgMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwgMHg0MDgwLCAweDJhNzAsIDB4NzAwMywgMHgwMDAwLAorCTB4MmE3MCwgMHg3MDAwLCAweGEwOGUsIDB4MDAwMywgMHgxMTU4LCAweDA4MGMsIDB4M2YwOCwgMHgwODBjLAorCTB4MmVlYiwgMHgwODBjLCAweDVkZDgsIDB4MDgwYywgMHg1NGYwLCAweDA4MGMsIDB4NjhmOSwgMHgwYzgwLAorCTB4MDAwYiwgMHgwYzk4LCAweDEwZTQsIDB4MTBlNSwgMHgxMjEwLCAweDEwZTIsIDB4MTJkZCwgMHgxNDBlLAorCTB4MTQwZiwgMHgxNDEwLCAweDA4MGMsIDB4MTUxNSwgMHgwMDA1LCAweDAxMjYsIDB4MDBmNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg3MDAwLCAweGEwODYsIDB4MDAwMSwgMHgxOTA0LCAweDExZWQsIDB4MDgwYywgMHgxNTg4LAorCTB4MDgwYywgMHg1YWNmLCAweDAxNTAsIDB4MDgwYywgMHg1YWY1LCAweDE1YzAsIDB4MjA3OSwgMHgwMTAwLAorCTB4NzgyOCwgMHhhMDg1LCAweDE4MDAsIDB4NzgyYSwgMHgwNDg4LCAweDA4MGMsIDB4NWEwNywgMHg3MDAwLAorCTB4YTA4NiwgMHgwMDAxLCAweDE5MDQsIDB4MTFlZCwgMHg3MDhjLCAweGEwODYsIDB4MDAyOCwgMHgxOTA0LAorCTB4MTFlZCwgMHgyMDAxLCAweDAxNjEsIDB4MjAwMywgMHgwMDAxLCAweDIwNzksIDB4MDEwMCwgMHg3ODI3LAorCTB4ZmZmZiwgMHg3YTI4LCAweGEyOTUsIDB4MWUyZiwgMHg3YTJhLCAweDIwMTEsIDB4NTlhMiwgMHgwODBjLAorCTB4Njk5YywgMHgyMDExLCAweDU5OTUsIDB4MDgwYywgMHg2YTVjLCAweDIwMTEsIDB4NTllNCwgMHgwODBjLAorCTB4Njk5YywgMHgyMDExLCAweDRhZGMsIDB4MDgwYywgMHg2OTljLCAweDIwMTEsIDB4ODAzMCwgMHgyMDE5LAorCTB4MDAwMCwgMHg3MDhiLCAweDAwMDAsIDB4MDgwYywgMHgxZGU5LCAweDAwZTgsIDB4MDgwYywgMHg0NDhmLAorCTB4MjA3OSwgMHgwMTAwLCAweDc4NDQsIDB4YTAwNSwgMHgxOTA0LCAweDExZWQsIDB4MjAxMSwgMHg0YWRjLAorCTB4MDgwYywgMHg2OTljLCAweDIwMTEsIDB4NTllNCwgMHgwODBjLCAweDY5OWMsIDB4MDgwYywgMHgxZGU5LAorCTB4MjAwMSwgMHhiNzhkLCAweDIwMDQsIDB4NzgwZSwgMHg3ODQwLCAweGEwODQsIDB4ZmZmYiwgMHg3ODQyLAorCTB4MjAxMSwgMHg4MDEwLCAweDczY2MsIDB4MDgwYywgMHgzZWNjLCAweDcyM2MsIDB4YzI4NCwgMHg3MjNlLAorCTB4MjAwMSwgMHhiNTBjLCAweDIwMGMsIDB4YzFhYywgMHgyMTAyLCAweDA4MGMsIDB4N2YzNSwgMHgyMDExLAorCTB4MDAwNCwgMHgwODBjLCAweDljNjAsIDB4MDgwYywgMHg1MjRkLCAweDA4MGMsIDB4NWFjZiwgMHgwMTU4LAorCTB4MDgwYywgMHg0YmU4LCAweDAxNDAsIDB4NzA4YiwgMHgwMDAxLCAweDcwYzcsIDB4MDAwMCwgMHgwODBjLAorCTB4NDYyYywgMHgwODA0LCAweDExZWQsIDB4MDgwYywgMHg1MzA5LCAweDAxMjAsIDB4N2EwYywgMHhjMmI0LAorCTB4N2EwZSwgMHgwMDYwLCAweDcwNzMsIDB4MDAwMCwgMHgwODBjLCAweGEwMDgsIDB4NzBkNCwgMHhkMDljLAorCTB4MTEyOCwgMHg3MGEwLCAweGEwMDUsIDB4MDExMCwgMHgwODBjLCAweDRiYzYsIDB4NzBkZiwgMHgwMDAwLAorCTB4NzBkYiwgMHgwMDAwLCAweDcyZDQsIDB4MDgwYywgMHg1YWNmLCAweDExNzgsIDB4MjAxMSwgMHgwMDAwLAorCTB4MDAxNiwgMHgwODBjLCAweDI4ZWIsIDB4MjAxOSwgMHhiNzhmLCAweDIxMWEsIDB4MDAxZSwgMHg3MDUzLAorCTB4ZmZmZiwgMHg3MDU3LCAweDAwZWYsIDB4NzA3NywgMHgwMDAwLCAweDIwNzksIDB4YjU1MiwgMHg3ODA0LAorCTB4ZDBhYywgMHgwMTA4LCAweGMyOTUsIDB4NzJkNiwgMHgwODBjLCAweDVhY2YsIDB4MDExOCwgMHhhMjk2LAorCTB4MDAwNCwgMHgwNTQ4LCAweDIwMTEsIDB4MDAwMSwgMHgwODBjLCAweDljNjAsIDB4NzA5YiwgMHgwMDAwLAorCTB4NzA5ZiwgMHhmZmZmLCAweDcwMDMsIDB4MDAwMiwgMHgyMDc5LCAweDAxMDAsIDB4NzgyNywgMHgwMDAzLAorCTB4NzgyOCwgMHhhMDg1LCAweDAwMDMsIDB4NzgyYSwgMHgwMGZlLCAweDA4MGMsIDB4MmFiOCwgMHgyMDExLAorCTB4MDAwNSwgMHgwODBjLCAweDgwNzUsIDB4MDgwYywgMHg3MTczLCAweDA4MGMsIDB4NWFjZiwgMHgwMTQ4LAorCTB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4MDAxNiwgMHgwODBjLCAweDI4ZWIsIDB4NjFlMiwgMHgwMDFlLAorCTB4MDBjZSwgMHgwMTJlLCAweDA0MjAsIDB4NzA5YiwgMHgwMDAwLCAweDcwOWYsIDB4ZmZmZiwgMHg3MDAzLAorCTB4MDAwMiwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHg3ODI3LCAweDAwMDMsIDB4NzgyOCwgMHhhMDg1LAorCTB4MDAwMywgMHg3ODJhLCAweDAwZmUsIDB4MjAxMSwgMHgwMDA1LCAweDA4MGMsIDB4ODA3NSwgMHgwODBjLAorCTB4NzE3MywgMHgwODBjLCAweDVhY2YsIDB4MDE0OCwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHgwMDE2LAorCTB4MDgwYywgMHgyOGViLCAweDYxZTIsIDB4MDAxZSwgMHgwMGNlLCAweDAwZmUsIDB4MDEyZSwgMHgwMDA1LAorCTB4MDBjNiwgMHgwODBjLCAweDVhY2YsIDB4MTExOCwgMHgyMGE5LCAweDAxMDAsIDB4MDAxMCwgMHgyMGE5LAorCTB4MDA4MiwgMHgwODBjLCAweDVhY2YsIDB4MTExOCwgMHgyMDA5LCAweDAwMDAsIDB4MDAxMCwgMHgyMDA5LAorCTB4MDA3ZSwgMHgwODBjLCAweDJkOTcsIDB4ODEwOCwgMHgxZjA0LCAweDEyMDEsIDB4MDBjZSwgMHg3MDczLAorCTB4MDAwMCwgMHg3MDc0LCAweGEwODQsIDB4MDBmZiwgMHg3MDc2LCAweDcwYTMsIDB4MDAwMCwgMHgwMDA1LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDIsIDB4MTkwNCwgMHgxMmRiLAorCTB4NzA5YywgMHhhMDg2LCAweGZmZmYsIDB4MDEzMCwgMHgwODBjLCAweDJhYjgsIDB4MDgwYywgMHg3MTczLAorCTB4MDgwNCwgMHgxMmRiLCAweDcwZDQsIDB4ZDBhYywgMHgxMTEwLCAweGQwOWMsIDB4MDU0MCwgMHhkMDg0LAorCTB4MDUzMCwgMHgwMDA2LCAweDAwMTYsIDB4MjAwMSwgMHgwMTAzLCAweDIwMDksIDB4Yjc4ZCwgMHgyMTBjLAorCTB4MjEwMiwgMHgwMDFlLCAweDAwMGUsIDB4ZDA4YywgMHgwMWQwLCAweDcwZDgsIDB4YTA4NiwgMHhmZmZmLAorCTB4MDE5MCwgMHgwODBjLCAweDJjMTcsIDB4MDgwYywgMHg3MTczLCAweDcwZDQsIDB4ZDA5NCwgMHgxOTA0LAorCTB4MTJkYiwgMHgyMDExLCAweDAwMDEsIDB4MjAxOSwgMHgwMDAwLCAweDA4MGMsIDB4MmM0ZiwgMHgwODBjLAorCTB4NzE3MywgMHgwODA0LCAweDEyZGIsIDB4NzBkYywgMHhhMDA1LCAweDE5MDQsIDB4MTJkYiwgMHg3MDk4LAorCTB4YTAwNSwgMHgxOTA0LCAweDEyZGIsIDB4NzBkNCwgMHhkMGE0LCAweDAxMTgsIDB4ZDBiNCwgMHgwOTA0LAorCTB4MTJkYiwgMHgwODBjLCAweDUzMDksIDB4MTkwNCwgMHgxMmRiLCAweDIwMDEsIDB4YjU1MywgMHgyMDA0LAorCTB4ZDBhYywgMHgwMWM4LCAweDAxNTYsIDB4MDBjNiwgMHgyMGE5LCAweDAwN2YsIDB4MjAwOSwgMHgwMDAwLAorCTB4MDAxNiwgMHgwODBjLCAweDRmYTksIDB4MTExOCwgMHg2MDAwLCAweGQwZWMsIDB4MTEzOCwgMHgwMDFlLAorCTB4ODEwOCwgMHgxZjA0LCAweDEyNjgsIDB4MDBjZSwgMHgwMTVlLCAweDAwMjgsIDB4MDAxZSwgMHgwMGNlLAorCTB4MDE1ZSwgMHgwODA0LCAweDEyZGIsIDB4MDAwNiwgMHgwMDE2LCAweDIwMDEsIDB4MDEwMywgMHgyMDA5LAorCTB4Yjc4ZCwgMHgyMTBjLCAweDIxMDIsIDB4MDAxZSwgMHgwMDBlLCAweDcxYTgsIDB4ODFmZiwgMHgxMWIwLAorCTB4YTAwNiwgMHgyMDA5LCAweDAyMDAsIDB4MjBhOSwgMHgwMDAyLCAweDIwYTEsIDB4YjdkZSwgMHg0MGExLAorCTB4MjAwOSwgMHgwNzAwLCAweDIwYTksIDB4MDAwMiwgMHgyMGExLCAweGI3Y2UsIDB4NDBhMSwgMHg3MDcwLAorCTB4ODAwNywgMHg3MTc0LCAweDgxMGYsIDB4MjBhOSwgMHgwMDAyLCAweDQwYTEsIDB4MjBhMSwgMHhiN2QyLAorCTB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4MTRmYiwgMHgyMDAxLCAweDAwMDAsIDB4ODEwZiwgMHgyMGE5LAorCTB4MDAwMiwgMHg0MGExLCAweDcwMzAsIDB4YzA4YywgMHg3MDMyLCAweDcwMDMsIDB4MDAwMywgMHg3MDlmLAorCTB4ZmZmZiwgMHgwODBjLCAweDE1ODEsIDB4YTAwNiwgMHgwODBjLCAweDI3YzMsIDB4MDgwYywgMHgzZjNlLAorCTB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4MDgwYywgMHg1YWY1LCAweDAxNTAsIDB4MDgwYywgMHg1YWNmLAorCTB4NzgyOCwgMHgwMTE4LCAweGEwODQsIDB4ZTFmZiwgMHgwMDEwLCAweGEwODQsIDB4ZmZkZiwgMHg3ODJhLAorCTB4MDBmZSwgMHgyMDAxLCAweGI3ZTEsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDUsIDB4MTEyMCwgMHgyMDExLAorCTB4MDAwMCwgMHgwODBjLCAweDgwNzUsIDB4MjAxMSwgMHgwMDAwLCAweDA4MGMsIDB4ODA3ZiwgMHgwODBjLAorCTB4NzE3MywgMHgwODBjLCAweDcyMzAsIDB4MDEyZSwgMHgwMDA1LCAweDAwMTYsIDB4MDA0NiwgMHgwMGY2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3OSwgMHgwMTAwLCAweDIwMDksIDB4YjUzNCwgMHgyMTA0LAorCTB4YTAwNSwgMHgxMTEwLCAweDA4MGMsIDB4MjkxNywgMHgyMDA5LCAweDAwZjcsIDB4MDgwYywgMHg0YmFmLAorCTB4Nzk0MCwgMHhhMThjLCAweDAwMTAsIDB4Nzk0MiwgMHg3OTI0LCAweGQxYjQsIDB4MDExMCwgMHg3ODI3LAorCTB4MDA0MCwgMHhkMTljLCAweDAxMTAsIDB4NzgyNywgMHgwMDA4LCAweDAwMDYsIDB4MDAzNiwgMHgwMTU2LAorCTB4Nzk1NCwgMHhkMWFjLCAweDE5MDQsIDB4MTM0YiwgMHgwODBjLCAweDVhZTEsIDB4MDE1OCwgMHgwODBjLAorCTB4NWFmNSwgMHgxMTI4LCAweDIwMDEsIDB4Yjc5ZSwgMHgyMDAzLCAweDAwMDAsIDB4MDA3MCwgMHgwODBjLAorCTB4NWFkNywgMHgwZGMwLCAweDIwMDEsIDB4Yjc5ZSwgMHgyMDAzLCAweGFhYWEsIDB4MjAwMSwgMHhiNzlmLAorCTB4MjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NWEwNywgMHgwMDU4LCAweDA4MGMsIDB4NWFjZiwgMHgwMTQwLAorCTB4MjAwOSwgMHgwMGY4LCAweDA4MGMsIDB4NGJhZiwgMHg3ODQzLCAweDAwOTAsIDB4Nzg0MywgMHgwMDEwLAorCTB4MjBhOSwgMHgwOWM0LCAweDc4MjAsIDB4ZDA5YywgMHgxMTM4LCAweDA4MGMsIDB4NWFjZiwgMHgwMTM4LAorCTB4NzgyNCwgMHhkMGFjLCAweDE5MDQsIDB4MTNmNSwgMHgxZjA0LCAweDEzMmEsIDB4MDA3MCwgMHg3ODI0LAorCTB4MDgwYywgMHg1YWViLCAweDAxMTgsIDB4ZDBhYywgMHgxOTA0LCAweDEzZjUsIDB4YTA4NCwgMHgxODAwLAorCTB4MGQ5OCwgMHg3MDAzLCAweDAwMDEsIDB4MDgwNCwgMHgxM2Y1LCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLAorCTB4MjdjMywgMHgwODA0LCAweDE0MDQsIDB4Nzg1MCwgMHhhMDg0LCAweDAxODAsIDB4Nzg1MiwgMHg3ODJmLAorCTB4MDAyMCwgMHgyMGE5LCAweDAwNDYsIDB4MWQwNCwgMHgxMzUzLCAweDA4MGMsIDB4NmE0NCwgMHgxZjA0LAorCTB4MTM1MywgMHg3ODUwLCAweGEwODQsIDB4MDE4MCwgMHhhMDg1LCAweDA0MDAsIDB4Nzg1MiwgMHg3ODJmLAorCTB4MDAwMCwgMHgwODBjLCAweDVhZTEsIDB4MDE1OCwgMHgwODBjLCAweDVhZjUsIDB4MTEyOCwgMHgyMDAxLAorCTB4Yjc5ZSwgMHgyMDAzLCAweDAwMDAsIDB4MDA3MCwgMHgwODBjLCAweDVhZDcsIDB4MGRjMCwgMHgyMDAxLAorCTB4Yjc5ZSwgMHgyMDAzLCAweGFhYWEsIDB4MjAwMSwgMHhiNzlmLCAweDIwMDMsIDB4MDAwMSwgMHgwODBjLAorCTB4NWEwNywgMHgwMDIwLCAweDIwMDksIDB4MDBmOCwgMHgwODBjLCAweDRiYWYsIDB4MjBhOSwgMHgwMDBlLAorCTB4ZTAwMCwgMHgxZjA0LCAweDEzODAsIDB4Nzg1MCwgMHhhMDg0LCAweDAxODAsIDB4YTA4NSwgMHgxNDAwLAorCTB4Nzg1MiwgMHgwODBjLCAweDVhY2YsIDB4MDEyMCwgMHg3ODQzLCAweDAwOTAsIDB4Nzg0MywgMHgwMDEwLAorCTB4MjAyMSwgMHhlNjc4LCAweDIwMTksIDB4ZWE2MCwgMHg3ODIwLCAweGQwOWMsIDB4MTU1OCwgMHgwODBjLAorCTB4NWFjZiwgMHgwNWQ4LCAweDc4MjQsIDB4ZDBhYywgMHgxOTA0LCAweDEzZjUsIDB4MDgwYywgMHg1YWY1LAorCTB4MTUwOCwgMHgwMDQ2LCAweDIwMjEsIDB4MDE5MCwgMHg4NDIxLCAweDFkZjAsIDB4MDA0ZSwgMHg4NDIxLAorCTB4MTFjOCwgMHg3ODI3LCAweDAwNDgsIDB4MjBhOSwgMHgwMWY0LCAweDFkMDQsIDB4MTNhZCwgMHgwODBjLAorCTB4NmE0NCwgMHgxZjA0LCAweDEzYWQsIDB4NzgyNCwgMHhhMDg0LCAweDAwNjgsIDB4MTVjOCwgMHgyMDAxLAorCTB4Yjc5ZSwgMHgyMDAzLCAweGFhYWEsIDB4MjAwMSwgMHhiNzlmLCAweDIwMDMsIDB4MDAwMSwgMHg3MDAzLAorCTB4MDAwMSwgMHgwNDk4LCAweDFkMDQsIDB4MTNjNiwgMHgwODBjLCAweDZhNDQsIDB4ODMxOSwgMHgxOTYwLAorCTB4MjAwOSwgMHhiNTM0LCAweDIxMDQsIDB4ODAwMCwgMHgyMDBhLCAweGEwODQsIDB4ZmZmMCwgMHgwMTIwLAorCTB4MjAwYiwgMHgwMDAwLCAweDA4MGMsIDB4MjkxNywgMHgwMGQ4LCAweDA4MGMsIDB4NWFlMSwgMHgxMTQwLAorCTB4YTRhMiwgMHgwMDY0LCAweDExMjgsIDB4MDgwYywgMHg1YWE2LCAweDcwMDMsIDB4MDAwMSwgMHgwMGE4LAorCTB4NzgyNywgMHgxODAwLCAweGUwMDAsIDB4ZTAwMCwgMHg3ODI0LCAweDA4MGMsIDB4NWFlYiwgMHgwMTEwLAorCTB4ZDBhYywgMHgxMTU4LCAweGEwODQsIDB4MTgwMCwgMHgwOWE4LCAweDcwMDMsIDB4MDAwMSwgMHgwMDI4LAorCTB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjdjMywgMHgwMDQ4LCAweDIwMDEsIDB4YjUzNCwgMHgyMDAzLAorCTB4MDAwMCwgMHg3ODI3LCAweDAwNDgsIDB4NzgyOCwgMHhjMDlkLCAweDc4MmEsIDB4Nzg1MCwgMHhhMDg0LAorCTB4MDE4MCwgMHhhMDg1LCAweDA0MDAsIDB4Nzg1MiwgMHgwMTVlLCAweDAwM2UsIDB4MDAwZSwgMHgwODBjLAorCTB4MTU1OCwgMHgwMTJlLCAweDAwZmUsIDB4MDA0ZSwgMHgwMDFlLCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LAorCTB4MDAwNSwgMHgyYTcwLCAweDIwNjEsIDB4YjdjMSwgMHgyMDYzLCAweDAwMDIsIDB4NjAwNywgMHgwMDAyLAorCTB4NjAwYiwgMHgwMDA2LCAweDYwMGYsIDB4MDAxNywgMHgyMDAxLCAweGI3OWUsIDB4MjAwMywgMHgwMDAwLAorCTB4NzA4YiwgMHgwMDAwLCAweDIwMDksIDB4MDEwMCwgMHgyMTA0LCAweGEwODIsIDB4MDAwMiwgMHgwMjE4LAorCTB4NzA1MywgMHhmZmZmLCAweDAwMTAsIDB4NzA1MywgMHgwMDAwLCAweDcwNWIsIDB4ZmZmZiwgMHg3MDczLAorCTB4MDAwMCwgMHg3MDc3LCAweDAwMDAsIDB4MDgwYywgMHhhMDA4LCAweDIwNjEsIDB4Yjc4ZSwgMHg2MDAzLAorCTB4MDkwOSwgMHg2MDA3LCAweDAwMDAsIDB4NjAwYiwgMHg4ODAwLCAweDYwMGYsIDB4MDIwMCwgMHg2MDEzLAorCTB4MDBmZiwgMHg2MDE3LCAweDAwMGYsIDB4NjAxYiwgMHgwMDAwLCAweDYwMWYsIDB4MDdkMCwgMHgyMDYxLAorCTB4Yjc5NiwgMHg2MDAzLCAweDgwMDAsIDB4NjAwNywgMHgwMDAwLCAweDYwMGIsIDB4MDAwMCwgMHg2MDBmLAorCTB4MDIwMCwgMHg2MDEzLCAweDAwZmYsIDB4NjAxNywgMHgwMDAwLCAweDYwMWIsIDB4MDAwMSwgMHg2MDFmLAorCTB4MDAwMCwgMHgyMDYxLCAweGI3YjksIDB4NjAwMywgMHg1MTRjLCAweDYwMDcsIDB4NGY0NywgMHg2MDBiLAorCTB4NDk0MywgMHg2MDBmLCAweDIwMjAsIDB4MjAwMSwgMHhiNTI4LCAweDIwMDMsIDB4MDAwMCwgMHgwMDA1LAorCTB4MDRhMCwgMHgyMDExLCAweDAwMDAsIDB4ODFmZiwgMHgwNTcwLCAweGExODYsIDB4MDAwMSwgMHgxMTQ4LAorCTB4MjAzMSwgMHg4ZmZmLCAweDIwMzksIDB4ZDUwMSwgMHgyMDIxLCAweDAxMDAsIDB4MjAyOSwgMHhkNTAwLAorCTB4MDBlOCwgMHhhMTg2LCAweDAwMDIsIDB4MTExOCwgMHgyMDExLCAweDAwMDAsIDB4MDBiOCwgMHhhMTg2LAorCTB4MDAwNSwgMHgxMTE4LCAweDIwMTEsIDB4MDAwMSwgMHgwMDg4LCAweGExODYsIDB4MDAwOSwgMHgxMTE4LAorCTB4MjAxMSwgMHgwMDAyLCAweDAwNTgsIDB4YTE4NiwgMHgwMDBhLCAweDExMTgsIDB4MjAxMSwgMHgwMDAyLAorCTB4MDAyOCwgMHhhMTg2LCAweDAwNTUsIDB4MTExMCwgMHgyMDExLCAweDAwMDMsIDB4MzgwMCwgMHhhMDg0LAorCTB4ZmZmYywgMHhhMjA1LCAweDIwYzAsIDB4MDgwNCwgMHgxMDRkLCAweGEwMGUsIDB4MjAxMSwgMHgwMDAzLAorCTB4MjAxOSwgMHgxNGE0LCAweDA4MDQsIDB4MTRmNSwgMHgyMDE5LCAweGFhYWEsIDB4MjA2MSwgMHhmZmZmLAorCTB4MmMxNCwgMHgyMzYyLCAweGUwMDAsIDB4ZTAwMCwgMHgyYzA0LCAweGEzMDYsIDB4MjI2MiwgMHgxMTEwLAorCTB4YzFiNSwgMHhjMWE1LCAweDIwMTEsIDB4MDAwMCwgMHgyMDE5LCAweDE0YjcsIDB4MDRmMCwgMHgyMDE5LAorCTB4YWFhYSwgMHgyMDYxLCAweGZmZmYsIDB4MmMxNCwgMHgyMzYyLCAweGUwMDAsIDB4ZTAwMCwgMHgyYzFjLAorCTB4MjA2MSwgMHg3ZmZmLCAweGUwMDAsIDB4ZTAwMCwgMHgyYzA0LCAweDIwNjEsIDB4ZmZmZiwgMHgyMjYyLAorCTB4YTMwNiwgMHgwMTEwLCAweGMxOGQsIDB4MDAwOCwgMHhjMTg1LCAweDIwMTEsIDB4MDAwMiwgMHgyMDE5LAorCTB4MTRkMiwgMHgwNDE4LCAweDIwNjEsIDB4ZmZmZiwgMHgyMDE5LCAweGFhYWEsIDB4MmMxNCwgMHgyMzYyLAorCTB4ZTAwMCwgMHhlMDAwLCAweDJjMDQsIDB4MjI2MiwgMHhhMzA2LCAweDExODAsIDB4MmMxNCwgMHgyMzYyLAorCTB4ZTAwMCwgMHhlMDAwLCAweDJjMWMsIDB4MjA2MSwgMHg3ZmZmLCAweDJjMDQsIDB4MjA2MSwgMHhmZmZmLAorCTB4MjI2MiwgMHhhMzA2LCAweDExMTAsIDB4YzE5NSwgMHgwMDA4LCAweGMxOWQsIDB4MjAxMSwgMHgwMDAxLAorCTB4MjAxOSwgMHgxNGYzLCAweDAwMTAsIDB4MDgwNCwgMHgxNDY5LCAweDM4MDAsIDB4YTA4NCwgMHhmZmZjLAorCTB4YTIwNSwgMHgyMGMwLCAweDA4MzcsIDB4MjAxMSwgMHgwMDAwLCAweDA4MGMsIDB4NGZhOSwgMHgxMTc4LAorCTB4NjAwNCwgMHhhMGM0LCAweDAwZmYsIDB4YThjNiwgMHgwMDA2LCAweDAxMjgsIDB4YTBjNCwgMHhmZjAwLAorCTB4YThjNiwgMHgwNjAwLCAweDExMjAsIDB4YTE4NiwgMHgwMDgwLCAweDAxMDgsIDB4ODIxMCwgMHg4MTA4LAorCTB4YTE4NiwgMHgwMTAwLCAweDFkNTAsIDB4MjIwOCwgMHgwMDA1LCAweDIwOTEsIDB4ODAwMCwgMHgwZTA0LAorCTB4MTUxNywgMHgwMDA2LCAweDAwMTYsIDB4MjA3OSwgMHgwMDAwLCAweDc4MTgsIDB4ZDA4NCwgMHgxZGU4LAorCTB4MDAxZSwgMHg3OTJlLCAweDAwMGUsIDB4NzgyYSwgMHgwMDBlLCAweDc4MjYsIDB4MzkwMCwgMHg3ODNhLAorCTB4NzgyMywgMHg4MDAyLCAweDc4MWIsIDB4MDAwMSwgMHgyMDkxLCAweDUwMDAsIDB4MDEyNiwgMHgwMTU2LAorCTB4MDE0NiwgMHgyMGE5LCAweDAwMTAsIDB4MjBhMSwgMHhiOTBjLCAweDIwOTEsIDB4MjAwMCwgMHg0MGExLAorCTB4MjBhOSwgMHgwMDEwLCAweDIwOTEsIDB4MjIwMCwgMHg0MGExLCAweDIwYTksIDB4MDAxMCwgMHgyMDkxLAorCTB4MjQwMCwgMHg0MGExLCAweDIwYTksIDB4MDAxMCwgMHgyMDkxLCAweDI2MDAsIDB4NDBhMSwgMHgyMGE5LAorCTB4MDAxMCwgMHgyMDkxLCAweDI4MDAsIDB4NDBhMSwgMHgwMTRlLCAweDAxNWUsIDB4MDEyZSwgMHgyMDc5LAorCTB4YjUwMCwgMHg3ODAzLCAweDAwMDUsIDB4MjA5MSwgMHg0MDgwLCAweDA0YzksIDB4MGNmOCwgMHgwMDA1LAorCTB4MDAwNiwgMHgwODBjLCAweDE1YTMsIDB4MTUxOCwgMHgwMGY2LCAweDIwNzksIDB4YjUyNCwgMHgyZjA0LAorCTB4ODAwMCwgMHgyMDdhLCAweGEwODIsIDB4MDAwZiwgMHgwMjU4LCAweGEwMDYsIDB4MjA3YSwgMHgyMDc5LAorCTB4YjUyNiwgMHgyZjA0LCAweGEwODQsIDB4MDAwMSwgMHhhMDg2LCAweDAwMDEsIDB4MjA3YSwgMHgwMDcwLAorCTB4MjA3OSwgMHhiNTI2LCAweDJmN2MsIDB4OGZmZiwgMHgxMTI4LCAweDIwMDEsIDB4MGMwMywgMHgyMDAzLAorCTB4MDA0MCwgMHgwMDIwLCAweDIwMDEsIDB4MGMwMywgMHgyMDAzLCAweDAwYzAsIDB4MDBmZSwgMHgwMDBlLAorCTB4MDAwNSwgMHgwNDA5LCAweDExMjAsIDB4MjAwMSwgMHgwYzAzLCAweDIwMDMsIDB4MDA4MCwgMHgwMDA1LAorCTB4MDBkMSwgMHgxMTIwLCAweDIwMDEsIDB4MGMwMywgMHgyMDAzLCAweDAwNDAsIDB4MDAwNSwgMHgwMDA2LAorCTB4MDA5MSwgMHgxMTc4LCAweDIwMDEsIDB4MGMwMywgMHgyMDAzLCAweDAwNDAsIDB4MjAwOSwgMHgwZmZmLAorCTB4MDBhMSwgMHgyMDAxLCAweDBjMDMsIDB4MjAwMywgMHgwMDgwLCAweDIwMDksIDB4MGZmZiwgMHgwMDY5LAorCTB4MGM4OCwgMHgwMDBlLCAweDAwMDUsIDB4MDBjNiwgMHgyMDYxLCAweDBjMDAsIDB4MmMwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg2LCAweDAwYWEsIDB4MDBjZSwgMHgwMDA1LCAweDAxNTYsIDB4MDEyNiwgMHhhMThjLAorCTB4MGZmZiwgMHgyMWE4LCAweDFkMDQsIDB4MTViMiwgMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwgMHgxNWIyLAorCTB4MDEyZSwgMHgwMTVlLCAweDAwMDUsIDB4MjA3MSwgMHhiNTAwLCAweDcxNjAsIDB4NzEyZSwgMHgyMDIxLAorCTB4MDAwMSwgMHhhMTkwLCAweDAwMzAsIDB4YTI5OCwgMHgwMDMwLCAweDAyNDAsIDB4NzA2NCwgMHhhMzAyLAorCTB4MTIyOCwgMHgyMjBhLCAweDIyMDgsIDB4MjMxMCwgMHg4NDIwLCAweDBjYTgsIDB4MzgwMCwgMHhkMDhjLAorCTB4MDE0OCwgMHg3MDY0LCAweGEwODYsIDB4YjUwMCwgMHgwMTI4LCAweDcwNjcsIDB4YjUwMCwgMHgyMDExLAorCTB4MTAwMCwgMHgwYzQ4LCAweDIwMGIsIDB4MDAwMCwgMHg3NGIyLCAweDc0YjYsIDB4MDAwNSwgMHgwMGU2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhiNTAwLCAweDcwYjQsIDB4YTBlYSwgMHgwMDEwLAorCTB4MDI2OCwgMHg4MDAxLCAweDcwYjYsIDB4NzAyYywgMHgyMDY4LCAweDJkMDQsIDB4NzAyZSwgMHgyMDZiLAorCTB4MDAwMCwgMHg2ODA3LCAweDAwMDAsIDB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4YTA2ZSwgMHgwY2Q4LAorCTB4MDBlNiwgMHgyMDcxLCAweGI1MDAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzBiNCwgMHg4MDAxLAorCTB4MDI2MCwgMHg3MGI2LCAweDcwMmMsIDB4MjA2OCwgMHgyZDA0LCAweDcwMmUsIDB4MjA2YiwgMHgwMDAwLAorCTB4NjgwNywgMHgwMDAwLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweGEwNmUsIDB4MGNkOCwgMHgwMGU2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhiNTAwLCAweDcwMmMsIDB4MjA2YSwgMHgyZDAwLAorCTB4NzAyZSwgMHg3MGI0LCAweDgwMDAsIDB4NzBiNiwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHg4ZGZmLAorCTB4MDEzOCwgMHg2ODA0LCAweDY4MDcsIDB4MDAwMCwgMHgwMDA2LCAweDBjNDksIDB4MDBkZSwgMHgwY2I4LAorCTB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4YjUwMCwgMHg3MGI0LCAweGEwOGEsIDB4MDAxMCwgMHhhMDBkLAorCTB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhiODEyLCAweDcwMDcsIDB4MDAwMCwgMHg3MDFiLAorCTB4MDAwMCwgMHg3MDFmLCAweDAwMDAsIDB4MjA3MSwgMHgwMDAwLCAweDcwMTAsIDB4YTA4NSwgMHg4MDA0LAorCTB4NzAxMiwgMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDBlNiwgMHgyMjcwLAorCTB4NzAwYiwgMHgwMDAwLCAweDIwNzEsIDB4YjgxMiwgMHg3MDE4LCAweGEwODgsIDB4YjgxYiwgMHgyMjBhLAorCTB4ODAwMCwgMHhhMDg0LCAweDAwMDcsIDB4NzAxYSwgMHg3MDA0LCAweGEwMDUsIDB4MTEyOCwgMHgwMGY2LAorCTB4MjA3OSwgMHgwMDEwLCAweDAwODksIDB4MDBmZSwgMHgwMGVlLCAweDAxMmUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MjA3MSwgMHhiODEyLCAweDcwMDQsIDB4YTAwNSwgMHgxMTI4LCAweDAwZjYsIDB4MjA3OSwgMHgwMDEwLAorCTB4MDAxOSwgMHgwMGZlLCAweDAwZWUsIDB4MDAwNSwgMHg3MDAwLCAweDAwMDIsIDB4MTY3MiwgMHgxNmQ2LAorCTB4MTZmMywgMHgxNmYzLCAweDcwMTgsIDB4NzExYywgMHhhMTA2LCAweDExMTgsIDB4NzAwNywgMHgwMDAwLAorCTB4MDAwNSwgMHgwMGQ2LCAweGExODAsIDB4YjgxYiwgMHgyMDA0LCAweDcwMGEsIDB4MjA2OCwgMHg4MTA4LAorCTB4YTE4YywgMHgwMDA3LCAweDcxMWUsIDB4NzgwMywgMHgwMDI2LCAweDY4MjQsIDB4NzgzMiwgMHg2ODI4LAorCTB4NzgzNiwgMHg2ODJjLCAweDc4M2EsIDB4NjgzMCwgMHg3ODNlLCAweDY4MTAsIDB4NzAwZSwgMHg2ODBjLAorCTB4NzAxNiwgMHg2ODA0LCAweDAwZGUsIDB4ZDA4NCwgMHgwMTIwLCAweDcwMDcsIDB4MDAwMSwgMHgwMDI5LAorCTB4MDAwNSwgMHg3MDA3LCAweDAwMDIsIDB4MDBiMSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHg3MTBjLAorCTB4MjAxMSwgMHgwMDQwLCAweGExODIsIDB4MDA0MCwgMHgxMjEwLCAweDIxMTAsIDB4YTAwNiwgMHg3MDBlLAorCTB4NzIxMiwgMHg4MjAzLCAweDc4MjIsIDB4NzgwMywgMHgwMDIwLCAweDc4MDMsIDB4MDA0MSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHg3MDE0LAorCTB4MjA5OCwgMHgyMGExLCAweDAwMTQsIDB4NzgwMywgMHgwMDI2LCAweDcxMGMsIDB4MjAxMSwgMHgwMDQwLAorCTB4YTE4MiwgMHgwMDQwLCAweDEyMTAsIDB4MjExMCwgMHhhMDA2LCAweDcwMGUsIDB4MjJhOCwgMHg1M2E2LAorCTB4ODIwMywgMHg3ODIyLCAweDc4MDMsIDB4MDAyMCwgMHgzMzAwLCAweDcwMTYsIDB4NzgwMywgMHgwMDAxLAorCTB4MDE1ZSwgMHgwMTRlLCAweDAxM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDEzNiwgMHgwMTQ2LAorCTB4MDE1NiwgMHgyMDk5LCAweGI1ZmEsIDB4MjBhMSwgMHgwMDE4LCAweDIwYTksIDB4MDAwOCwgMHg1M2EzLAorCTB4NzgwMywgMHgwMDIwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDc4MDMsIDB4MDA0MSwgMHg3MDA3LAorCTB4MDAwMywgMHg3MDAwLCAweGMwODQsIDB4NzAwMiwgMHg3MDBiLCAweGI1ZjUsIDB4MDEyZSwgMHgwMTVlLAorCTB4MDE0ZSwgMHgwMTNlLCAweDAwMDUsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MjAwMSwgMHhiNjI5LAorCTB4MjA5YywgMHgyMGExLCAweDAwMTQsIDB4NzgwMywgMHgwMDI2LCAweDIwMDEsIDB4YjYyYSwgMHgyMGFjLAorCTB4NTNhNiwgMHgyMDk5LCAweGI2MmIsIDB4MjBhMSwgMHgwMDE4LCAweDIwYTksIDB4MDAwOCwgMHg1M2EzLAorCTB4NzgwMywgMHgwMDIwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDc4MDMsIDB4MDAwMSwgMHg3MDA3LAorCTB4MDAwNCwgMHg3MDAwLCAweGMwOGMsIDB4NzAwMiwgMHg3MDBiLCAweGI2MjYsIDB4MDEyZSwgMHgwMTVlLAorCTB4MDE0ZSwgMHgwMTNlLCAweDAwMDUsIDB4MDAxNiwgMHgwMGU2LCAweDIwNzEsIDB4YjgxMiwgMHgwMGY2LAorCTB4MjA3OSwgMHgwMDEwLCAweDc5MDQsIDB4NzgwMywgMHgwMDAyLCAweGQxZmMsIDB4MDEyMCwgMHhhMThjLAorCTB4MDcwMCwgMHg3MDA0LCAweDAwMjMsIDB4MDBmZSwgMHgwMGVlLCAweDAwMWUsIDB4MDAwNSwgMHgxNjZjLAorCTB4MTczNiwgMHgxNzY0LCAweDE3OGUsIDB4MTdiZSwgMHgxNzM1LCAweDBjZjgsIDB4YTE4YywgMHgwNzAwLAorCTB4MTUyOCwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHg3MDE0LCAweDIwYTAsIDB4MjA5OSwgMHgwMDE0LAorCTB4NzgwMywgMHgwMDQwLCAweDcwMTAsIDB4MjBhOCwgMHg1M2E1LCAweDM0MDAsIDB4NzAxNiwgMHgwMTVlLAorCTB4MDE0ZSwgMHgwMTNlLCAweDcwMGMsIDB4YTAwNSwgMHgwNTcwLCAweDc4MzAsIDB4NzgzMiwgMHg3ODM0LAorCTB4NzgzNiwgMHgwODBjLCAweDE2OWQsIDB4MDAwNSwgMHg3MDA4LCAweGEwODAsIDB4MDAwMiwgMHgyMDAzLAorCTB4MDEwMCwgMHg3MDA3LCAweDAwMDAsIDB4MDgwYywgMHgxNjZjLCAweDAwMDUsIDB4NzAwOCwgMHhhMDgwLAorCTB4MDAwMiwgMHgyMDAzLCAweDAyMDAsIDB4MGNhOCwgMHhhMThjLCAweDA3MDAsIDB4MTE1MCwgMHg3MDBjLAorCTB4YTAwNSwgMHgwMTg4LCAweDc4MzAsIDB4NzgzMiwgMHg3ODM0LCAweDc4MzYsIDB4MDgwYywgMHgxNmIyLAorCTB4MDAwNSwgMHg3MDA4LCAweGEwODAsIDB4MDAwMiwgMHgyMDAzLCAweDAyMDAsIDB4NzAwNywgMHgwMDAwLAorCTB4MDgwYywgMHgxNjZjLCAweDAwMDUsIDB4MDBkNiwgMHg3MDA4LCAweDIwNjgsIDB4NzgzMCwgMHg2ODI2LAorCTB4NzgzNCwgMHg2ODJhLCAweDc4MzgsIDB4NjgyZSwgMHg3ODNjLCAweDY4MzIsIDB4NjgwYiwgMHgwMTAwLAorCTB4MDBkZSwgMHg3MDA3LCAweDAwMDAsIDB4MDgwYywgMHgxNjZjLCAweDAwMDUsIDB4YTE4YywgMHgwNzAwLAorCTB4MTU0MCwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgyMDAxLCAweGI1ZjgsIDB4MjAwNCwgMHhhMDgwLAorCTB4MDAwZCwgMHgyMGEwLCAweDIwOTksIDB4MDAxNCwgMHg3ODAzLCAweDAwNDAsIDB4MjBhOSwgMHgwMDIwLAorCTB4NTNhNSwgMHgyMDAxLCAweGI1ZmEsIDB4MjAwNCwgMHhkMGJjLCAweDAxNDgsIDB4MjAwMSwgMHhiNjAzLAorCTB4MjAwNCwgMHhhMDgwLCAweDAwMGQsIDB4MjBhMCwgMHgyMGE5LCAweDAwMjAsIDB4NTNhNSwgMHgwMTVlLAorCTB4MDE0ZSwgMHgwMTNlLCAweDcwMDcsIDB4MDAwMCwgMHgwODBjLCAweDVlNmYsIDB4MDgwYywgMHgxNjZjLAorCTB4MDAwNSwgMHgyMDExLCAweDgwMDMsIDB4MDgwYywgMHgzZWNjLCAweDBjZjgsIDB4YTE4YywgMHgwNzAwLAorCTB4MTE0OCwgMHgyMDAxLCAweGI2MjgsIDB4MjAwMywgMHgwMTAwLCAweDcwMDcsIDB4MDAwMCwgMHgwODBjLAorCTB4MTY2YywgMHgwMDA1LCAweDIwMTEsIDB4ODAwNCwgMHgwODBjLCAweDNlY2MsIDB4MGNmOCwgMHgwMTI2LAorCTB4MjA5MSwgMHgyMjAwLCAweDIwNzksIDB4MDAzMCwgMHgyMDcxLCAweGI4MjMsIDB4NzAwMywgMHgwMDAwLAorCTB4NzAwZiwgMHhiODJmLCAweDcwMTMsIDB4YjgyZiwgMHg3ODBmLCAweDAwZjYsIDB4NzgwMywgMHgwMDA0LAorCTB4MDEyZSwgMHgwMDA1LCAweDY5MzQsIDB4YTE4NCwgMHgwMDA3LCAweDAwMDIsIDB4MTdlZSwgMHgxODJjLAorCTB4MTdlZSwgMHgxN2VlLCAweDE3ZWUsIDB4MTgxNCwgMHgxN2ZiLCAweDE3ZjIsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDgwNCwgMHgxODQ2LCAweDY4NGMsIDB4ZDBiYywgMHgwZGM4LCAweDY4NjAsIDB4NjgyZSwgMHg2ODVjLAorCTB4NjgyYSwgMHg2ODU4LCAweDA0YzgsIDB4YTE4YywgMHgwMGZmLCAweGExODYsIDB4MDAxZSwgMHgxZDcwLAorCTB4Njg0YywgMHhkMGJjLCAweDBkNTgsIDB4Njg2MCwgMHg2ODJlLCAweDY4NWMsIDB4NjgyYSwgMHg2ODA0LAorCTB4NjgxYSwgMHhhMDgwLCAweDAwMGQsIDB4MjAwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHgyMmU1LAorCTB4MjAwNSwgMHg2ODMyLCAweDY4NTgsIDB4MDQ0MCwgMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDE1LAorCTB4MTlhOCwgMHg2ODRjLCAweGQwYWMsIDB4MDk5MCwgMHg2ODA0LCAweDY4MWEsIDB4YTA4MCwgMHgwMDBkLAorCTB4MjAwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHgyMmU1LCAweDIwMDUsIDB4NjgzMiwgMHhhMDA2LAorCTB4NjgyZSwgMHg2ODJhLCAweDY4NTgsIDB4MDA4MCwgMHg2ODRjLCAweGQwYWMsIDB4MDkwNCwgMHgxN2VlLAorCTB4YTAwNiwgMHg2ODJlLCAweDY4MmEsIDB4Njg1OCwgMHhhMThjLCAweDAwMGYsIDB4YTE4OCwgMHgyMmU1LAorCTB4MjEwZCwgMHg2OTMyLCAweDJkMDgsIDB4NjkxYSwgMHg2ODI2LCAweDY4NGMsIDB4YzBkZCwgMHg2ODRlLAorCTB4YTAwNiwgMHg2ODBhLCAweDY5N2MsIDB4NjkxMiwgMHg2OTgwLCAweDY5MTYsIDB4MDAwNSwgMHg2ODRjLAorCTB4ZDBhYywgMHgwOTBjLCAweDE1MTUsIDB4NjgzMywgMHgyMmUyLCAweDJkMDgsIDB4NjkxYSwgMHg2ODU4LAorCTB4ODAwMSwgMHg2ODI2LCAweDY4NGMsIDB4YzBkZCwgMHg2ODRlLCAweGEwMDYsIDB4NjgwYSwgMHg2ODJlLAorCTB4NjgyYSwgMHg2OTdjLCAweDY5MTIsIDB4Njk4MCwgMHg2OTE2LCAweDAwMDUsIDB4MjBlMSwgMHgwMDA3LAorCTB4MjBlMSwgMHgyMDAwLCAweDIwMDEsIDB4MDIwYSwgMHgyMDA0LCAweDgyZmYsIDB4MDFlOCwgMHhhMjgwLAorCTB4MDAwNCwgMHgwMGQ2LCAweDIwNmMsIDB4Njg0YywgMHhkMGRjLCAweDExOTAsIDB4YTI4MCwgMHgwMDA3LAorCTB4MjAwNCwgMHhhMDg2LCAweDAwMGEsIDB4MTExMCwgMHgwODkxLCAweDAwMTAsIDB4MDgwYywgMHgxN2UyLAorCTB4MDEzOCwgMHgwMGRlLCAweGEyODAsIDB4MDAwMCwgMHgyMDAzLCAweDAwMDIsIDB4YTAxNiwgMHgwMDIwLAorCTB4NjgwOCwgMHg4MDAwLCAweDY4MGEsIDB4MDBkZSwgMHgwMTI2LCAweDAwNDYsIDB4MDAzNiwgMHgwMDI2LAorCTB4MjA5MSwgMHgyMjAwLCAweDAwMmUsIDB4MDAzZSwgMHgwMDRlLCAweDcwMDAsIDB4YTAwNSwgMHgwMWQwLAorCTB4NzEwYywgMHgyMjBhLCAweDgxMDgsIDB4MjMwYSwgMHg4MTA4LCAweDI0MGEsIDB4ODEwOCwgMHhhMTgyLAorCTB4Yjg0YSwgMHgwMjEwLCAweDIwMDksIDB4YjgyZiwgMHg3MTBlLCAweDcwMTAsIDB4YTEwMiwgMHhhMDgyLAorCTB4MDAwOSwgMHgwMTE4LCAweGEwODAsIDB4MDAxYiwgMHgxMTE4LCAweDIwMDksIDB4MDEzOCwgMHgyMDBhLAorCTB4MDEyZSwgMHgwMDA1LCAweDcyMDYsIDB4MjAwMSwgMHgxOGE4LCAweDAwMDYsIDB4MjI2MCwgMHgwODA0LAorCTB4MTlkNSwgMHgwMTI2LCAweDAwMjYsIDB4MDAzNiwgMHgwMGM2LCAweDAwMDYsIDB4MjA5MSwgMHgyMjAwLAorCTB4MDAwZSwgMHgwMDRlLCAweDAwM2UsIDB4MDAyZSwgMHgwMGQ2LCAweDAwYzYsIDB4MjQ2MCwgMHg2MTEwLAorCTB4MjE2OCwgMHg2YTYyLCAweDZiNWUsIDB4YTAwNSwgMHgwOTA0LCAweDE5MGEsIDB4NjgwOCwgMHhhMDA1LAorCTB4MDkwNCwgMHgxOTQxLCAweDcwMDAsIDB4YTAwNSwgMHgxMTA4LCAweDA0ODgsIDB4NzAwYywgMHg3MTEwLAorCTB4YTEwNiwgMHgxOTA0LCAweDE5NDksIDB4NzAwNCwgMHhhNDA2LCAweDE1NDgsIDB4MjAwMSwgMHgwMDA1LAorCTB4MjAwNCwgMHhkMDhjLCAweDAxNjgsIDB4MDA0NiwgMHgwODBjLCAweDFiMDYsIDB4MDA0ZSwgMHgyNDYwLAorCTB4NjAxMCwgMHhhMDgwLCAweDAwMDIsIDB4MjAwNCwgMHhhMDA1LCAweDA5MDQsIDB4MTk0MSwgMHgwYzEwLAorCTB4MjAwMSwgMHgwMjA3LCAweDIwMDQsIDB4ZDA5YywgMHgxZDQ4LCAweDc4MDQsIDB4YTA4NCwgMHg2MDAwLAorCTB4MDEyMCwgMHhhMDg2LCAweDYwMDAsIDB4MDEwOCwgMHgwYzA4LCAweDc4MTgsIDB4NjgxMiwgMHg3ODFjLAorCTB4NjgxNiwgMHg3ODAzLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLCAweDcwMDQsIDB4MjA2MCwgMHg2MTAwLAorCTB4YTE4ZSwgMHgwMDA0LCAweDE5MDQsIDB4MTk0OSwgMHgyMDA5LCAweDAwNDgsIDB4MDgwYywgMHg4NjRjLAorCTB4MDgwNCwgMHgxOTQ5LCAweDY4MDgsIDB4YTAwNSwgMHgwNWEwLCAweDcwMDAsIDB4YTAwNSwgMHgwNTg4LAorCTB4NzAwYywgMHg3MTEwLCAweGExMDYsIDB4MTExOCwgMHg3MDA0LCAweGE0MDYsIDB4MTU1MCwgMHgyMDAxLAorCTB4MDAwNSwgMHgyMDA0LCAweGQwOGMsIDB4MDE2MCwgMHgwMDQ2LCAweDA4MGMsIDB4MWIwNiwgMHgwMDRlLAorCTB4MjQ2MCwgMHg2MDEwLCAweGEwODAsIDB4MDAwMiwgMHgyMDA0LCAweGEwMDUsIDB4MDFkMCwgMHgwYzI4LAorCTB4MjAwMSwgMHgwMjA3LCAweDIwMDQsIDB4ZDA5YywgMHgxZDUwLCAweDIwMDEsIDB4MDAwNSwgMHgyMDA0LAorCTB4ZDA4YywgMHgxZDUwLCAweDc4MDQsIDB4YTA4NCwgMHg2MDAwLCAweDAxMTgsIDB4YTA4NiwgMHg2MDAwLAorCTB4MTlmMCwgMHg3ODE4LCAweDY4MTIsIDB4NzgxYywgMHg2ODE2LCAweDc4MDMsIDB4MDAwNCwgMHg3MDAzLAorCTB4MDAwMCwgMHg2MTAwLCAweGExOGUsIDB4MDAwNCwgMHgxMTIwLCAweDIwMDksIDB4MDA0OCwgMHgwODBjLAorCTB4ODY0YywgMHgwMGNlLCAweDAwZGUsIDB4MDEyZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMDI2LAorCTB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MjA3MSwgMHhiODIzLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAwLAorCTB4MDkwNCwgMHgxOWIzLCAweDcwMDQsIDB4YWMwNiwgMHgxOTA0LCAweDE5YTUsIDB4MjA3OSwgMHgwMDMwLAorCTB4NzAwMCwgMHhhMDg2LCAweDAwMDMsIDB4MDkwNCwgMHgxOWE1LCAweDc4MDQsIDB4ZDBmYywgMHgxNWM4LAorCTB4MjBlMSwgMHg2MDAwLCAweDIwMTEsIDB4MDAzMiwgMHgyMDAxLCAweDAyMDgsIDB4MjAwYywgMHgyMDAxLAorCTB4MDIwOSwgMHgyMDA0LCAweGExMDYsIDB4MWQ4OCwgMHg4MjExLCAweDFkYjAsIDB4NzgwNCwgMHhkMGZjLAorCTB4MTU0MCwgMHgwODBjLCAweDFlNmUsIDB4MDAyNiwgMHgwMDU2LCAweDc4MDMsIDB4MDAwNCwgMHg3ODA0LAorCTB4ZDBhYywgMHgxZGU4LCAweDc4MDMsIDB4MDAwMiwgMHg3ODAzLCAweDAwMDksIDB4NzAwMywgMHgwMDAzLAorCTB4NzAwNywgMHgwMDAwLCAweDAwNWUsIDB4MDAyZSwgMHgyMDAxLCAweDAxNWQsIDB4MjAwMywgMHgwMDAwLAorCTB4MDgwYywgMHg1YWNmLCAweDExMzgsIDB4MDA2NiwgMHgyMDMxLCAweDAwMDEsIDB4MDgwYywgMHg1YjUxLAorCTB4MDA2ZSwgMHgwMDU4LCAweDIwMDEsIDB4MDE2MCwgMHgyNTAyLCAweDIwMDEsIDB4MDEzOCwgMHgyMjAyLAorCTB4MDAyMCwgMHgwODBjLCAweDFiMDYsIDB4MDgwNCwgMHgxOTU1LCAweDAxNTYsIDB4MjBhOSwgMHgwMDA5LAorCTB4MjAwOSwgMHhiODJmLCAweDIxMDQsIDB4YWMwNiwgMHgxMTA4LCAweDIwMGEsIDB4YTE4OCwgMHgwMDAzLAorCTB4MWYwNCwgMHgxOWFhLCAweDAxNWUsIDB4MDA1ZSwgMHgwMDRlLCAweDAwM2UsIDB4MDAyZSwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMDA1LCAweDcwMGMsIDB4NzExMCwgMHhhMTA2LCAweDA5MDQsIDB4MWE0OSwgMHgyMTA0LAorCTB4NzAwNiwgMHgyMDYwLCAweDgxMDgsIDB4MjExYywgMHg4MTA4LCAweDIxMjQsIDB4ODEwOCwgMHhhMTgyLAorCTB4Yjg0YSwgMHgwMjEwLCAweDIwMDksIDB4YjgyZiwgMHg3MTEyLCAweDcwMGMsIDB4YTEwNiwgMHgxMTI4LAorCTB4MDgwYywgMHgyOGViLCAweDIwMDEsIDB4MDEzOCwgMHgyMTAyLCAweDhjZmYsIDB4MDU5OCwgMHg2MDEwLAorCTB4MjA2OCwgMHgyZDU4LCAweDY4MjgsIDB4YTQwNiwgMHgxNTkwLCAweDY4MmMsIDB4YTMwNiwgMHgxNTc4LAorCTB4NzAwNCwgMHgyMDYwLCAweDYwMjAsIDB4YzBkNCwgMHg2MDIyLCAweDY4NGMsIDB4ZDBmNCwgMHgwMTI4LAorCTB4NjgxNywgMHhmZmZmLCAweDY4MTMsIDB4ZmZmZiwgMHgwMGU4LCAweDY4NTAsIDB4ZDBmNCwgMHgxMTMwLAorCTB4NzgwMywgMHgwMDA0LCAweDY4MTAsIDB4NzgxYSwgMHg2ODE0LCAweDc4MWUsIDB4NjgyNCwgMHgyMDUwLAorCTB4NjgxOCwgMHgyMDYwLCAweDY4MzAsIDB4MjA0MCwgMHg2MDM0LCAweGEwY2MsIDB4MDAwZiwgMHgyMDA5LAorCTB4MDAxMSwgMHgwODBjLCAweDFhNGMsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwYywgMHgxYTRjLAorCTB4MmQ1OCwgMHgwMDA1LCAweDA4MGMsIDB4MWRkZCwgMHgwOTA0LCAweDE5YmEsIDB4MGNkMCwgMHg2MDIwLAorCTB4ZDBmNCwgMHgxMWUwLCAweGQwZDQsIDB4MDFiOCwgMHg2MDM4LCAweGE0MDIsIDB4NjAzNCwgMHhhMzAzLAorCTB4MDEwOCwgMHgxMjg4LCAweDY0M2EsIDB4NjMzNiwgMHg2YzJhLCAweDZiMmUsIDB4MDA0NiwgMHgwMDM2LAorCTB4MjQwMCwgMHg2YzdjLCAweGE0MDIsIDB4NjgxMiwgMHgyMzAwLCAweDZiODAsIDB4YTMwMywgMHg2ODE2LAorCTB4MDAzZSwgMHgwMDRlLCAweDAwMTgsIDB4MDgwYywgMHg5ZjlhLCAweDA5ZTAsIDB4NjAxYywgMHhhMDhlLAorCTB4MDAwOCwgMHgwOTA0LCAweDE5ZTAsIDB4YTA4ZSwgMHgwMDBhLCAweDA5MDQsIDB4MTllMCwgMHgyMDAxLAorCTB4YjU3NCwgMHgyMDA0LCAweGQwYjQsIDB4MTE0MCwgMHg2MDE4LCAweDIwMDQsIDB4ZDBiYywgMHgxMTIwLAorCTB4NjgxNywgMHg3ZmZmLCAweDY4MTMsIDB4ZmZmZiwgMHgwODBjLCAweDIzMDUsIDB4MTkxOCwgMHgwODA0LAorCTB4MTllMCwgMHg3MDAzLCAweDAwMDAsIDB4MDAwNSwgMHg4YWZmLCAweDA5MDQsIDB4MWFlMCwgMHhhMDNlLAorCTB4MjczMCwgMHhjOWZjLCAweDY4NTAsIDB4ZDBmYywgMHgxMWI4LCAweGQwZjQsIDB4MTUyOCwgMHgwMGQ2LAorCTB4MjgwNSwgMHhhYzY4LCAweDI5MDAsIDB4MDAwMiwgMHgxYTllLCAweDFhODIsIDB4MWE4MiwgMHgxYTllLAorCTB4MWE5ZSwgMHgxYTk2LCAweDFhOWUsIDB4MWE4MiwgMHgxYTllLCAweDFhODcsIDB4MWE4NywgMHgxYTllLAorCTB4MWE5ZSwgMHgxYTllLCAweDFhOGUsIDB4MWE4NywgMHg3ODAzLCAweDAwMDQsIDB4YzBmYywgMHg2ODUyLAorCTB4NmI2YywgMHg2YTcwLCAweDZkMWMsIDB4NmMyMCwgMHgwMGQ2LCAweGQ5OWMsIDB4MDU1MCwgMHgyODA1LAorCTB4YWM2OCwgMHg2ZjA4LCAweDZlMGMsIDB4MDQzMCwgMHhjMGY0LCAweDY4NTIsIDB4NmI2YywgMHg2YTcwLAorCTB4MDBkNiwgMHgwNDY4LCAweDZiMDgsIDB4NmEwYywgMHg2ZDAwLCAweDZjMDQsIDB4MDBkMCwgMHg2YjEwLAorCTB4NmExNCwgMHg2ZDAwLCAweDZjMDQsIDB4NmYwOCwgMHg2ZTBjLCAweDAwYTAsIDB4MDBkZSwgMHgwMGQ2LAorCTB4NjgzNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDFlLCAweDExNDAsIDB4MDBkZSwgMHgwODBjLAorCTB4MjJhNywgMHgxOTA0LCAweDFhNGMsIDB4YTAwZSwgMHgwODA0LCAweDFhZTAsIDB4MDBkZSwgMHgwODBjLAorCTB4MTUxNSwgMHhjOWZkLCAweDdiMjIsIDB4N2EyNiwgMHg3ZDMyLCAweDdjMzYsIDB4N2YzYSwgMHg3ZTNlLAorCTB4NzMxNiwgMHg3MjFhLCAweDc1MWUsIDB4NzQyMiwgMHg3NzI2LCAweDc2MmEsIDB4NzkwMiwgMHg3MTAwLAorCTB4ODEwOCwgMHg3MTAyLCAweDAwZGUsIDB4NjgyOCwgMHhhMzAwLCAweDY4MmEsIDB4NjgyYywgMHhhMjAxLAorCTB4NjgyZSwgMHg4MTA5LCAweDJkMDgsIDB4MTUwMCwgMHhkOWZjLCAweDAxNjAsIDB4YzlmYywgMHgwODBjLAorCTB4MjJhNywgMHgwMWU4LCAweDI4MDUsIDB4YWM2OCwgMHg2ODAwLCAweGE1MDYsIDB4MTFjMCwgMHg2ODA0LAorCTB4YTQwNiwgMHgwMGE4LCAweGM5ZmMsIDB4MDgwYywgMHgyMmE3LCAweDAxODgsIDB4MjgwNSwgMHhhYzY4LAorCTB4NjgwMCwgMHhhNTA2LCAweDExNjAsIDB4NjgwNCwgMHhhNDA2LCAweDExNDgsIDB4NjgwOCwgMHhhNzA2LAorCTB4MTEzMCwgMHg2ODBjLCAweGE2MDYsIDB4MDAxOCwgMHhjOWZjLCAweDA4MGMsIDB4MjJhNywgMHgyMTY4LAorCTB4MDAwNSwgMHgwODBjLCAweDE1MTUsIDB4MDgwYywgMHgxZjU1LCAweDcwMDQsIDB4MjA2MCwgMHgwMGQ2LAorCTB4NjAxMCwgMHgyMDY4LCAweDcwMDMsIDB4MDAwMCwgMHgwODBjLCAweDFkZmUsIDB4MDgwYywgMHg5YzVhLAorCTB4MDE3MCwgMHg2ODA4LCAweDgwMDEsIDB4NjgwYSwgMHg2OTdjLCAweDY5MTIsIDB4Njk4MCwgMHg2OTE2LAorCTB4NjgyYiwgMHhmZmZmLCAweDY4MmYsIDB4ZmZmZiwgMHg2ODUwLCAweGMwYmQsIDB4Njg1MiwgMHgwMGRlLAorCTB4MDgwYywgMHg5OTJhLCAweDA4MDQsIDB4MWQyYiwgMHgwODBjLCAweDE1MTUsIDB4MDEyNiwgMHgyMDkxLAorCTB4MjIwMCwgMHgwMDA2LCAweDAwMTYsIDB4MmI2OCwgMHg2ODE4LCAweDIwNjAsIDB4NzkwNCwgMHg3ODAzLAorCTB4MDAwMiwgMHhhMTg0LCAweDA3MDAsIDB4MTk3OCwgMHhhMTg0LCAweDAwMDMsIDB4YTA4NiwgMHgwMDAzLAorCTB4MGQ1OCwgMHg3MDAwLCAweDAwMDIsIDB4MWIyMywgMHgxYjI5LCAweDFjM2EsIDB4MWQwNiwgMHgxZDFhLAorCTB4MWIyMywgMHgxYjIzLCAweDFiMjMsIDB4NzgwNCwgMHhkMDljLCAweDE5MDQsIDB4MWQyYiwgMHgwODBjLAorCTB4MTUxNSwgMHg4MDAxLCAweDcwMDIsIDB4ZDFiYywgMHgxMWEwLCAweGQxOWMsIDB4MTkwNCwgMHgxYmJlLAorCTB4ZDFkYywgMHgxMTc4LCAweDhhZmYsIDB4MDkwNCwgMHgxYmJlLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLAorCTB4MWE0YywgMHgwOTA0LCAweDFkMmIsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsIDB4MWE0YywgMHgwODA0LAorCTB4MWQyYiwgMHg3ODAzLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLCAweGQxYmMsIDB4MTkwNCwgMHgxYjllLAorCTB4MDAyNiwgMHgwMDM2LCAweDdjMjAsIDB4N2QyNCwgMHg3ZTMwLCAweDdmMzQsIDB4NzgxOCwgMHg2ODEyLAorCTB4NzgxYywgMHg2ODE2LCAweDIwMDEsIDB4MDIwMSwgMHgyMDA0LCAweGEwMDUsIDB4MDE0MCwgMHg3ODA4LAorCTB4ZDBlYywgMHgxMTI4LCAweDc4MDMsIDB4MDAwOSwgMHg3MDAzLCAweDAwMDQsIDB4MDAxMCwgMHgwODBjLAorCTB4MWQyZiwgMHg2YjI4LCAweDZhMmMsIDB4MjQwMCwgMHg2ODZlLCAweGEzMWEsIDB4MjUwMCwgMHg2ODcyLAorCTB4YTIxMywgMHg2YjJhLCAweDZhMmUsIDB4MDBjNiwgMHg3MDA0LCAweDIwNjAsIDB4NjAyMCwgMHhkMGY0LAorCTB4MTExMCwgMHg2MzNhLCAweDYyMzYsIDB4MDBjZSwgMHgwMDNlLCAweDAwMmUsIDB4NmUxZSwgMHg2ZjIyLAorCTB4MjUwMCwgMHhhNDA1LCAweDAxMjgsIDB4MDgwYywgMHgyMmJkLCAweDY4NTAsIDB4YzBmZCwgMHg2ODUyLAorCTB4MmEwMCwgMHg2ODI2LCAweDJjMDAsIDB4NjgxYSwgMHgyODAwLCAweDY4MzIsIDB4NjgwOCwgMHg4MDAxLAorCTB4NjgwYSwgMHgxMTQ4LCAweDY4NGMsIDB4ZDBlNCwgMHgwMTMwLCAweDcwMDQsIDB4MjA2MCwgMHgyMDA5LAorCTB4MDA0OCwgMHgwODBjLCAweDg2NGMsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDQsIDB4MDkwNCwgMHgxZDJiLAorCTB4NzAwMywgMHgwMDAwLCAweDA4MGMsIDB4MTliYSwgMHgwODA0LCAweDFkMmIsIDB4MDA1NiwgMHg3ZDBjLAorCTB4ZDViYywgMHgxMTEwLCAweDA4MGMsIDB4YjQwNywgMHgwMDVlLCAweDA4MGMsIDB4MWRmZSwgMHgwMGY2LAorCTB4NzAwNCwgMHgyMDc4LCAweDA4MGMsIDB4NTMwNSwgMHgwMTE4LCAweDc4MjAsIDB4YzBmNSwgMHg3ODIyLAorCTB4MDBmZSwgMHg2ODJiLCAweGZmZmYsIDB4NjgyZiwgMHhmZmZmLCAweDY4MDgsIDB4ODAwMSwgMHg2ODBhLAorCTB4Njk3YywgMHg3OTFhLCAweDY5ODAsIDB4NzkxZSwgMHgwODA0LCAweDFkMmIsIDB4NzAwNCwgMHgwMGM2LAorCTB4MjA2MCwgMHg2MDIwLCAweDAwY2UsIDB4ZDBmNCwgMHgwMTIwLCAweDY4MDgsIDB4ODAwMSwgMHg2ODBhLAorCTB4MDRjMCwgMHg3ODE4LCAweDY4MTIsIDB4N2ExYywgMHg2YTE2LCAweGQxOWMsIDB4MDE2MCwgMHhhMjA1LAorCTB4MDE1MCwgMHg3MDA0LCAweGEwODAsIDB4MDAwNywgMHgyMDA0LCAweGEwODQsIDB4ZmZmZCwgMHhhMDg2LAorCTB4MDAwOCwgMHgxOTA0LCAweDFiNDEsIDB4Njg0YywgMHhjMGY1LCAweDY4NGUsIDB4NzgxNCwgMHhhMDA1LAorCTB4MTUyMCwgMHg3MDAzLCAweDAwMDAsIDB4NjgwOCwgMHg4MDAxLCAweDY4MGEsIDB4MDFhMCwgMHg3MDA0LAorCTB4MjA2MCwgMHg2MDFjLCAweGEwODYsIDB4MDAwYSwgMHgxMWEwLCAweDAxNTYsIDB4MjBhOSwgMHgwMDA5LAorCTB4MjAwOSwgMHhiODJmLCAweDIxMDQsIDB4YWMwNiwgMHgxMTA4LCAweDIwMGEsIDB4YTE4OCwgMHgwMDAzLAorCTB4MWYwNCwgMHgxYmYyLCAweDAxNWUsIDB4NzAwNCwgMHgyMDYwLCAweDIwMDksIDB4MDA0OCwgMHgwODBjLAorCTB4ODY0YywgMHgwODBjLCAweDE5YmEsIDB4MDgwNCwgMHgxZDJiLCAweDc4MTgsIDB4NjgxMiwgMHg3ODFjLAorCTB4NjgxNiwgMHg3ODE0LCAweDc5MDgsIDB4YTE4YywgMHgwZmZmLCAweGExOTIsIDB4MDg0MSwgMHgxYTA0LAorCTB4MWFlMywgMHhhMTg4LCAweDAwMDcsIDB4ODExNCwgMHg4MjE0LCAweDgyMTQsIDB4YTEwYSwgMHg4MTA0LAorCTB4ODAwNCwgMHg4MDA0LCAweGEyMGEsIDB4ODEwYiwgMHg4MTBiLCAweDgxMGIsIDB4MDgwYywgMHgxZTk5LAorCTB4NzgwMywgMHgwMDA0LCAweDc4MGYsIDB4ZmZmZiwgMHg3ODAzLCAweDAwMDEsIDB4NzgwNCwgMHhkMGZjLAorCTB4MGRlOCwgMHg3ODAzLCAweDAwMDIsIDB4NzgwMywgMHgwMDA0LCAweDc4MGYsIDB4MDBmNiwgMHg3MDA0LAorCTB4NzAwNywgMHgwMDAwLCAweDIwNjAsIDB4MjAwOSwgMHgwMDQ4LCAweDA4MGMsIDB4ODY0YywgMHgwODBjLAorCTB4MWVlZiwgMHgwODM4LCAweDgwMDEsIDB4NzAwMiwgMHhkMTk0LCAweDAxYjAsIDB4NzgwNCwgMHhkMGZjLAorCTB4MTkwNCwgMHgxY2Q2LCAweGQwOWMsIDB4MDEzOCwgMHg3ODA0LCAweGQwZmMsIDB4MTkwNCwgMHgxY2Q2LAorCTB4ZDA5YywgMHgxOTA0LCAweDFjZGEsIDB4OGFmZiwgMHgwOTA0LCAweDFkMmIsIDB4MjAwOSwgMHgwMDAxLAorCTB4MDgwYywgMHgxYTRjLCAweDA4MDQsIDB4MWQyYiwgMHhhMTg0LCAweDA4ODgsIDB4MTE0OCwgMHg4YWZmLAorCTB4MDkwNCwgMHgxZDJiLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLCAweDFhNGMsIDB4MDgwNCwgMHgxZDJiLAorCTB4NzgxOCwgMHg2ODEyLCAweDdhMWMsIDB4NmExNiwgMHhhMjA1LCAweDA5MDQsIDB4MWJkYiwgMHg3ODAzLAorCTB4MDAwNCwgMHg3MDAzLCAweDAwMDAsIDB4ZDFiYywgMHgxOTA0LCAweDFjYjgsIDB4NjgzNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg2LCAweDAwMjksIDB4MTExOCwgMHhkMTljLCAweDE5MDQsIDB4MWJkYiwgMHgwMDI2LAorCTB4MDAzNiwgMHg3YzIwLCAweDdkMjQsIDB4N2UzMCwgMHg3ZjM0LCAweDc4MTgsIDB4NjgxMiwgMHg3ODFjLAorCTB4NjgxNiwgMHgyMDAxLCAweDAyMDEsIDB4MjAwNCwgMHhhMDA1LCAweDAxNDAsIDB4NzgwOCwgMHhkMGVjLAorCTB4MTEyOCwgMHg3ODAzLCAweDAwMDksIDB4NzAwMywgMHgwMDA0LCAweDAwMjAsIDB4MDAxNiwgMHgwODBjLAorCTB4MWQyZiwgMHgwMDFlLCAweDZiMjgsIDB4NmEyYywgMHgwODBjLCAweDIyYmQsIDB4MDBkNiwgMHgyODA1LAorCTB4YWM2OCwgMHg2MDM0LCAweGQwOWMsIDB4MTEyOCwgMHg2ODA4LCAweGEzMWEsIDB4NjgwYywgMHhhMjEzLAorCTB4MDAyMCwgMHg2ODEwLCAweGEzMWEsIDB4NjgxNCwgMHhhMjEzLCAweDAwZGUsIDB4ZDE5NCwgMHgwOTA0LAorCTB4MWI2MywgMHgyYTAwLCAweDY4MjYsIDB4MmMwMCwgMHg2ODFhLCAweDI4MDAsIDB4NjgzMiwgMHg2ODA4LAorCTB4ODAwMSwgMHg2ODBhLCAweDZiMmEsIDB4NmEyZSwgMHgwMDNlLCAweDAwMmUsIDB4MDgwNCwgMHgxYzAxLAorCTB4MDA1NiwgMHg3ZDBjLCAweDA4MGMsIDB4YjQwNywgMHgwMDVlLCAweDA4MGMsIDB4MWRmZSwgMHgwMGY2LAorCTB4NzAwNCwgMHgyMDc4LCAweDA4MGMsIDB4NTMwNSwgMHgwMTE4LCAweDc4MjAsIDB4YzBmNSwgMHg3ODIyLAorCTB4MDBmZSwgMHg2ODJiLCAweGZmZmYsIDB4NjgyZiwgMHhmZmZmLCAweDY4MDgsIDB4ODAwMSwgMHg2ODBhLAorCTB4Njk3YywgMHg3OTFhLCAweDY5ODAsIDB4NzkxZSwgMHgwODA0LCAweDFkMmIsIDB4NzgwNCwgMHhkMDljLAorCTB4MDkwNCwgMHgxYjBlLCAweDdjMjAsIDB4NzgyNCwgMHhhNDA1LCAweDE5MDQsIDB4MWIwZSwgMHg3ODE4LAorCTB4NjgxMiwgMHg3YzFjLCAweDZjMTYsIDB4YTQwNSwgMHgxMTIwLCAweDc4MDMsIDB4MDAwMiwgMHgwODA0LAorCTB4MWJkYiwgMHg3NTFjLCAweDc0MjAsIDB4NzcyNCwgMHg3NjI4LCAweDcwMTQsIDB4YTUyOCwgMHg3MDE4LAorCTB4YTQyMSwgMHhhN2I5LCAweDAwMDAsIDB4YTZiMSwgMHgwMDAwLCAweDc4MzAsIDB4YTUwNiwgMHgxMTUwLAorCTB4NzgzNCwgMHhhNDA2LCAweDExMzgsIDB4NzgzOCwgMHhhNzA2LCAweDExMjAsIDB4NzgzYywgMHhhNjA2LAorCTB4MDkwNCwgMHgxYjBlLCAweDc4MDMsIDB4MDAwMiwgMHgwODA0LCAweDFjNjcsIDB4NzgwMywgMHgwMDA0LAorCTB4NzAwMywgMHgwMDAwLCAweDcwMDQsIDB4YTAwZCwgMHgwMTUwLCAweDY4MDgsIDB4ODAwMSwgMHg2ODBhLAorCTB4MTEzMCwgMHg3MDA0LCAweDIwNjAsIDB4MjAwOSwgMHgwMDQ4LCAweDA4MGMsIDB4ODY0YywgMHgwODBjLAorCTB4MTliYSwgMHgwMDg4LCAweDc4MDMsIDB4MDAwNCwgMHg3MDAzLCAweDAwMDAsIDB4NzAwNCwgMHgyMDYwLAorCTB4NjAxMCwgMHhhMDA1LCAweDBkYTAsIDB4MjA2OCwgMHg2ODA4LCAweDgwMDAsIDB4NjgwYSwgMHg2YzI4LAorCTB4NmIyYywgMHgwODBjLCAweDE5ZDUsIDB4MDAxZSwgMHgwMDBlLCAweDAxMmUsIDB4MDAwNSwgMHg3MDBjLAorCTB4NzExMCwgMHhhMTA2LCAweDA5MDQsIDB4MWRkMSwgMHg3MDA0LCAweDAwMTYsIDB4MjEwYywgMHhhMTA2LAorCTB4MDAxZSwgMHgwOTA0LCAweDFkZDEsIDB4MDBkNiwgMHgwMGM2LCAweDIxNmMsIDB4MmQwMCwgMHhhMDA1LAorCTB4MDkwNCwgMHgxZGNmLCAweDY4MWMsIDB4YTA4NiwgMHgwMDA4LCAweDA5MDQsIDB4MWRjZiwgMHg2ODIwLAorCTB4ZDBkNCwgMHgxOTA0LCAweDFkY2YsIDB4NjgxMCwgMHgyMDY4LCAweDY4NTAsIDB4ZDBmYywgMHgwNWE4LAorCTB4ODEwOCwgMHgyMTA0LCAweDZiMmMsIDB4YTMwNiwgMHgxOTA0LCAweDFkY2YsIDB4ODEwOCwgMHgyMTA0LAorCTB4NmEyOCwgMHhhMjA2LCAweDE5MDQsIDB4MWRjZiwgMHg2ODUwLCAweGMwZmMsIDB4YzBmNSwgMHg2ODUyLAorCTB4Njg2YywgMHg3ODIyLCAweDcwMTYsIDB4Njg3MCwgMHg3ODI2LCAweDcwMWEsIDB4NjgxYywgMHg3ODMyLAorCTB4NzAxZSwgMHg2ODIwLCAweDc4MzYsIDB4NzAyMiwgMHg2ODE4LCAweDIwNjAsIDB4NjAzNCwgMHhkMDljLAorCTB4MDE2OCwgMHg2ODMwLCAweDIwMDUsIDB4MDBkNiwgMHhhYzY4LCAweDY4MDgsIDB4NzgzYSwgMHg3MDI2LAorCTB4NjgwYywgMHg3ODNlLCAweDcwMmEsIDB4MDBkZSwgMHgwODA0LCAweDFkYzksIDB4YTAwNiwgMHg3ODNhLAorCTB4NzgzZSwgMHg3MDI2LCAweDcwMmEsIDB4MDgwNCwgMHgxZGM5LCAweDgxMDgsIDB4MjEwNCwgMHhhMDA1LAorCTB4MTkwNCwgMHgxZGNmLCAweDZiMmMsIDB4YTMwNiwgMHgxOTA0LCAweDFkY2YsIDB4ODEwOCwgMHgyMTA0LAorCTB4YTAwNSwgMHgxNWU4LCAweDZhMjgsIDB4YTIwNiwgMHgxNWQwLCAweDY4NTAsIDB4YzBmNSwgMHg2ODUyLAorCTB4NjgzMCwgMHgyMDA1LCAweDY5MTgsIDB4YTE2MCwgMHhhMTgwLCAweDAwMGQsIDB4MjAwNCwgMHhkMDljLAorCTB4MTFhMCwgMHg2MDA4LCAweDc4MjIsIDB4NzAxNiwgMHg2ODZlLCAweDYwMGMsIDB4NzgyNiwgMHg3MDFhLAorCTB4Njg3MiwgMHg2MDAwLCAweDc4MzIsIDB4NzAxZSwgMHg2MDA0LCAweDc4MzYsIDB4NzAyMiwgMHhhMDA2LAorCTB4NzgzYSwgMHg3ODNlLCAweDcwMjYsIDB4NzAyYSwgMHgwMGEwLCAweDYwMTAsIDB4NzgyMiwgMHg3MDE2LAorCTB4Njg2ZSwgMHg2MDE0LCAweDc4MjYsIDB4NzAxYSwgMHg2ODcyLCAweDYwMDAsIDB4NzgzMiwgMHg3MDFlLAorCTB4NjAwNCwgMHg3ODM2LCAweDcwMjIsIDB4NjAwOCwgMHg3ODNhLCAweDcwMjYsIDB4NjAwYywgMHg3ODNlLAorCTB4NzAyYSwgMHg2ODEwLCAweDc4MWEsIDB4NjgxNCwgMHg3ODFlLCAweDc4MDMsIDB4MDAxMSwgMHgwMGNlLAorCTB4MDBkZSwgMHgwMDA1LCAweDIwMTEsIDB4MDIwMSwgMHgyMDA5LCAweDAwM2MsIDB4MjIwNCwgMHhhMDA1LAorCTB4MTExOCwgMHg4MTA5LCAweDFkZDgsIDB4MDAwNSwgMHgwMDA1LCAweDBjYTEsIDB4MDExOCwgMHg3ODBjLAorCTB4ZDBhNCwgMHgwMTIwLCAweDAwZDksIDB4YTA4NSwgMHgwMDAxLCAweDAwMTAsIDB4MDgwYywgMHgxZWVmLAorCTB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4MjIwMCwgMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgxMTYwLAorCTB4NzAwYywgMHg3MTEwLCAweGExMDYsIDB4MDE0MCwgMHgwODBjLCAweDI5NWMsIDB4MjBlMSwgMHg5MDI4LAorCTB4NzAwZiwgMHhiODJmLCAweDcwMTMsIDB4YjgyZiwgMHgwMTJlLCAweDAwMDUsIDB4MDBjNiwgMHgwODBjLAorCTB4NWFjZiwgMHgxMWI4LCAweDIwMDEsIDB4MDE2MCwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgwMTM4LAorCTB4MjAwMywgMHgwMDAwLCAweDIwMTEsIDB4MDBjOCwgMHhlMDAwLCAweGUwMDAsIDB4ODIxMSwgMHgxZGUwLAorCTB4MDRiMSwgMHgwMDY2LCAweDIwMzEsIDB4MDAwMCwgMHgwODBjLCAweDViNTEsIDB4MDA2ZSwgMHgwMGNlLAorCTB4MDAwNSwgMHgwODBjLCAweDFlNmUsIDB4MDgwYywgMHgyOTVjLCAweDIwZTEsIDB4OTAyOCwgMHg3MDBjLAorCTB4NzExMCwgMHhhMTA2LCAweDAxYzAsIDB4MjEwNCwgMHhhMDA1LCAweDAxMzAsIDB4MjA2MCwgMHg2MDEwLAorCTB4MjA2MCwgMHg2MDA4LCAweDgwMDEsIDB4NjAwYSwgMHhhMTg4LCAweDAwMDMsIDB4YTE4MiwgMHhiODRhLAorCTB4MDIxMCwgMHgyMDA5LCAweGI4MmYsIDB4NzExMiwgMHg3MDBjLCAweGExMDYsIDB4MWQ0MCwgMHgwODBjLAorCTB4MjhlYiwgMHgyMTEwLCAweDBjMjAsIDB4MjAwMSwgMHgwMTVkLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLAorCTB4MDE2MCwgMHgyNTAyLCAweDIwMDEsIDB4MDEzOCwgMHgyMjAyLCAweDAwY2UsIDB4MDAwNSwgMHgwODBjLAorCTB4Mjk1YywgMHgyMGUxLCAweDkwMjgsIDB4MjAwMSwgMHgwMTVkLCAweDIwMDMsIDB4MDAwMCwgMHgwMGU2LAorCTB4MDBjNiwgMHgwMDE2LCAweDIwNzEsIDB4YjgyMywgMHg3MDBjLCAweDcxMTAsIDB4YTEwNiwgMHgwMTkwLAorCTB4MjEwNCwgMHhhMDA1LCAweDAxMzAsIDB4MjA2MCwgMHg2MDEwLCAweDIwNjAsIDB4NjAwOCwgMHg4MDAxLAorCTB4NjAwYSwgMHhhMTg4LCAweDAwMDMsIDB4YTE4MiwgMHhiODRhLCAweDAyMTAsIDB4MjAwOSwgMHhiODJmLAorCTB4NzExMiwgMHgwYzUwLCAweDAwMWUsIDB4MDBjZSwgMHgwMGVlLCAweDAwMDUsIDB4MjAwMSwgMHgwMTM4LAorCTB4MjAxNCwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgwMTYwLCAweDIwMmMsIDB4MjAwMywgMHgwMDAwLAorCTB4MDgwYywgMHg1YWNmLCAweDExNDgsIDB4MjAyMSwgMHgwMDAyLCAweDFkMDQsIDB4MWU3ZCwgMHgyMDkxLAorCTB4NjAwMCwgMHg4NDIxLCAweDFkZDAsIDB4MDAwNSwgMHgyMDIxLCAweGIwMTUsIDB4MjAwMSwgMHgwMTQxLAorCTB4MjAxYywgMHhkM2RjLCAweDExNjgsIDB4MjAwMSwgMHgwMTA5LCAweDIwMWMsIDB4YTM5YywgMHgwMDQ4LAorCTB4MTEzOCwgMHgyMDAxLCAweDAxMTEsIDB4MjAxYywgMHg4M2ZmLCAweDExMTAsIDB4ODQyMSwgMHgxZDcwLAorCTB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MDIwMCwgMHg3ODA4LCAweGEwODQsIDB4ZjAwMCwgMHhhMTBkLAorCTB4MDg2OSwgMHgyMDAxLCAweDAxMDUsIDB4MjAwNCwgMHhhMDg0LCAweDAwMDMsIDB4MTEzMCwgMHgyMDAxLAorCTB4Yjg0YSwgMHgyMDA0LCAweGEwODYsIDB4MDAwMCwgMHgwNTQ4LCAweGEwMjYsIDB4MjAxOSwgMHhmMDAwLAorCTB4ODMxOSwgMHgxMTQ4LCAweDIwMDEsIDB4MDEyYiwgMHgyMDAzLCAweDk1ZjUsIDB4MjAwMSwgMHgwMTI5LAorCTB4MjAwMywgMHg5NWY1LCAweDAwZDgsIDB4MjAwMSwgMHgwMTA1LCAweDIwMDQsIDB4YTA4NCwgMHgwMDAzLAorCTB4MTEzMCwgMHgyMDAxLCAweGI4NGEsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDAsIDB4MDE3OCwgMHgyMDAxLAorCTB4MDEzMiwgMHgyMDA0LCAweGE0MzYsIDB4MDExMCwgMHgyMDIwLCAweDBjMDAsIDB4MjAwMSwgMHgwMDIxLAorCTB4MjAwNCwgMHhkMGZjLCAweDA5ZTgsIDB4MDgwYywgMHgyMTRhLCAweDA4YzAsIDB4MjBlMSwgMHg3MDAwLAorCTB4NzMyNCwgMHg3NDIwLCAweDcwMjgsIDB4NzAyOCwgMHg3NDI2LCAweDcwMzcsIDB4MDAwMSwgMHg4MTBmLAorCTB4NzEyZSwgMHg3MDJmLCAweDAxMDAsIDB4NzAzNywgMHgwMDA4LCAweDczMjYsIDB4NzQyMiwgMHgyMDAxLAorCTB4MDE2MCwgMHgyNTAyLCAweDIwMDEsIDB4MDEzOCwgMHgyMjAyLCAweDAwZWUsIDB4MDAwNSwgMHgwMDI2LAorCTB4MjAwMSwgMHgwMTVkLCAweDIwMDMsIDB4MDAwMCwgMHg3OTA4LCAweGExOGMsIDB4MGZmZiwgMHhhMTgyLAorCTB4MGZmZCwgMHgwMjEwLCAweDIwMDksIDB4MDAwMCwgMHhhMTkwLCAweDAwMDcsIDB4YTI5NCwgMHgxZmY4LAorCTB4ODIxNCwgMHg4MjE0LCAweDgyMTQsIDB4MjAwMSwgMHgwMjBhLCAweDgyZmYsIDB4MDE0MCwgMHgyMGUxLAorCTB4NjAwMCwgMHgyMDBjLCAweDIwMGMsIDB4MjAwYywgMHgyMDBjLCAweDgyMTEsIDB4MWRkMCwgMHgyMGUxLAorCTB4NzAwMCwgMHgyMDBjLCAweDIwMGMsIDB4NzAwMywgMHgwMDAwLCAweDIwZTEsIDB4NjAwMCwgMHgyMDAxLAorCTB4MDIwOCwgMHgyMDBjLCAweDIwMDEsIDB4MDIwOSwgMHgyMDA0LCAweGExMDYsIDB4MDE1OCwgMHgwODBjLAorCTB4MWRkMiwgMHgwMTMwLCAweDc5MDgsIDB4ZDFlYywgMHgxMTI4LCAweDc5MGMsIDB4ZDFhNCwgMHgwOTYwLAorCTB4MDgwYywgMHgxZGZlLCAweGEwMDYsIDB4MDAyZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMDE2LAorCTB4MDAyNiwgMHgyMDcxLCAweGI4MjMsIDB4MjA3OSwgMHgwMDMwLCAweDIwMTEsIDB4MDA1MCwgMHg3MDAwLAorCTB4YTA4NiwgMHgwMDAwLCAweDAxYTgsIDB4ODIxMSwgMHgwMTg4LCAweDIwMDEsIDB4MDAwNSwgMHgyMDA0LAorCTB4ZDA4YywgMHgwZGM4LCAweDc5MDQsIDB4YTE4YywgMHgwNzgwLCAweDAwMTYsIDB4MDgwYywgMHgxYjA2LAorCTB4MDAxZSwgMHg4MWZmLCAweDExMTgsIDB4MjAxMSwgMHgwMDUwLCAweDBjNDgsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDAyZSwgMHgwMDFlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDc4MDMsIDB4MDAwNCwgMHgyMDA5LAorCTB4MDA2NCwgMHg3ODA0LCAweGQwYWMsIDB4MDkwNCwgMHgxZmExLCAweDgxMDksIDB4MWRkMCwgMHgyMDA5LAorCTB4MDEwMCwgMHgyMTBjLCAweGExOGEsIDB4MDAwMywgMHgwYTBjLCAweDE1MTUsIDB4MDgwYywgMHgyMjUxLAorCTB4MDBlNiwgMHgwMGY2LCAweDIwNzEsIDB4YjgxMiwgMHgyMDc5LCAweDAwMTAsIDB4NzAwNCwgMHhhMDg2LAorCTB4MDAwMCwgMHgwNTM4LCAweDc4MDAsIDB4MDAwNiwgMHg3ODIwLCAweDAwMDYsIDB4NzgzMCwgMHgwMDA2LAorCTB4NzgzNCwgMHgwMDA2LCAweDc4MzgsIDB4MDAwNiwgMHg3ODNjLCAweDAwMDYsIDB4NzgwMywgMHgwMDA0LAorCTB4ZTAwMCwgMHhlMDAwLCAweDIwNzksIDB4MDAzMCwgMHg3ODA0LCAweGQwYWMsIDB4MTkwYywgMHgxNTE1LAorCTB4MjA3OSwgMHgwMDEwLCAweDAwMGUsIDB4NzgzZSwgMHgwMDBlLCAweDc4M2EsIDB4MDAwZSwgMHg3ODM2LAorCTB4MDAwZSwgMHg3ODMyLCAweDAwMGUsIDB4NzgyMiwgMHgwMDBlLCAweDc4MDIsIDB4MDBmZSwgMHgwMGVlLAorCTB4MDAzMCwgMHgwMGZlLCAweDAwZWUsIDB4NzgwNCwgMHhkMGFjLCAweDE5MGMsIDB4MTUxNSwgMHgwODBjLAorCTB4NzIzMCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhiODRhLCAweDcwMDMsIDB4MDAwMCwgMHgwMGVlLAorCTB4MDAwNSwgMHgwMGQ2LCAweGEyODAsIDB4MDAwNCwgMHgyMDZjLCAweDY5NGMsIDB4ZDFkYywgMHgxOTA0LAorCTB4MjAxZiwgMHg2OTM0LCAweGExODQsIDB4MDAwNywgMHgwMDAyLCAweDFmYmQsIDB4MjAwYSwgMHgxZmJkLAorCTB4MWZiZCwgMHgxZmJkLCAweDFmZjEsIDB4MWZkMCwgMHgxZmJmLCAweDA4MGMsIDB4MTUxNSwgMHg2ODRjLAorCTB4ZDBiNCwgMHgwOTA0LCAweDIxMDcsIDB4Njg2MCwgMHg2ODJlLCAweDY4MTYsIDB4Njg1YywgMHg2ODJhLAorCTB4NjgxMiwgMHg2ODdjLCAweDY4MGEsIDB4Njg4MCwgMHg2ODBlLCAweDY5NTgsIDB4MDgwNCwgMHgyMDEyLAorCTB4NjgzNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDFlLCAweDFkMzgsIDB4Njg0YywgMHhkMGI0LAorCTB4MDkwNCwgMHgyMTA3LCAweDY4NjAsIDB4NjgyZSwgMHg2ODE2LCAweDY4NWMsIDB4NjgyYSwgMHg2ODEyLAorCTB4Njg3YywgMHg2ODBhLCAweDY4ODAsIDB4NjgwZSwgMHg2ODA0LCAweDY4MWEsIDB4YTA4MCwgMHgwMDBkLAorCTB4MjAwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHgyMmU1LCAweDIwMDUsIDB4NjgzMiwgMHg2OTU4LAorCTB4MDQ1MCwgMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDE1LCAweDE1NDgsIDB4Njg0YywgMHhkMGI0LAorCTB4MDkwNCwgMHgyMTA3LCAweDY4MDQsIDB4NjgxYSwgMHhhMDgwLCAweDAwMGQsIDB4MjAwNCwgMHhhMDg0LAorCTB4MDAwZiwgMHhhMDgwLCAweDIyZTUsIDB4MjAwNSwgMHg2ODMyLCAweDY5NTgsIDB4YTAwNiwgMHg2ODJlLAorCTB4NjgyYSwgMHgwMDg4LCAweDY4NGMsIDB4ZDBiNCwgMHgwOTA0LCAweDFhZTEsIDB4Njk1OCwgMHhhMDA2LAorCTB4NjgyZSwgMHg2ODJhLCAweDJkMDAsIDB4NjgxYSwgMHg2ODM0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLAorCTB4MjJlNSwgMHgyMDA1LCAweDY4MzIsIDB4NjkyNiwgMHg2ODRjLCAweGMwZGQsIDB4Njg0ZSwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMGY2LCAweDIwNzksIDB4MDAyMCwgMHg3ODA0LCAweGQwZmMsIDB4MTkwYywgMHgyMTRhLAorCTB4MDBlNiwgMHgwMGQ2LCAweDIwNzEsIDB4Yjg0YSwgMHg3MDAwLCAweGEwMDUsIDB4MTkwNCwgMHgyMDg3LAorCTB4MDBjNiwgMHg3MjA2LCAweGEyODAsIDB4MDAwNCwgMHgyMDVjLCAweDcwMDQsIDB4MjA2OCwgMHg3ODAzLAorCTB4MDAwNCwgMHg2ODE4LCAweDAwZDYsIDB4MjA2OCwgMHg2ODZjLCAweDc4MTIsIDB4Njg5MCwgMHgwMGY2LAorCTB4MjBlMSwgMHg5MDQwLCAweDIwNzksIDB4MDIwMCwgMHg3ODFhLCAweDIwNzksIDB4MDEwMCwgMHg4MDA0LAorCTB4NzhkNiwgMHgwMGZlLCAweDAwZGUsIDB4MmI2OCwgMHg2ODI0LCAweDIwNTAsIDB4NjgxOCwgMHgyMDYwLAorCTB4NjgzMCwgMHgyMDQwLCAweDYwMzQsIDB4YTBjYywgMHgwMDBmLCAweDY5MDgsIDB4NzkxYSwgMHg3MTE2LAorCTB4NjgwYywgMHg3ODFlLCAweDcwMWEsIDB4YTAwNiwgMHg3MDBlLCAweDcwMTIsIDB4NzAwNCwgMHg2OTJjLAorCTB4NjgxNCwgMHhhMTA2LCAweDExMjAsIDB4NjkyOCwgMHg2ODEwLCAweGExMDYsIDB4MDE1OCwgMHgwMDM2LAorCTB4MDA0NiwgMHg2YjE0LCAweDZjMTAsIDB4MDgwYywgMHgyMzA1LCAweDAwNGUsIDB4MDAzZSwgMHgwMTEwLAorCTB4MDBjZSwgMHgwMGE4LCAweDhhZmYsIDB4MTEyMCwgMHgwMGNlLCAweGEwODUsIDB4MDAwMSwgMHgwMDc4LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3OSwgMHgwMDIwLCAweDIwMDksIDB4MDAwMSwgMHgwMDU5LAorCTB4MDExOCwgMHgyMDA5LCAweDAwMDEsIDB4MDAzOSwgMHgwMTJlLCAweDAwY2UsIDB4YTAwNiwgMHgwMGRlLAorCTB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDA3NiwgMHgwMDY2LCAweDAwNTYsIDB4MDA0NiwgMHgwMDM2LAorCTB4MDAyNiwgMHg4YWZmLCAweDA5MDQsIDB4MjEwMCwgMHg3MDBjLCAweDcyMTQsIDB4YTIzYSwgMHg3MDEwLAorCTB4NzIxOCwgMHhhMjAzLCAweDBhMDQsIDB4MjBmZiwgMHhhNzA1LCAweDA5MDQsIDB4MjBmZiwgMHhhMDNlLAorCTB4MjczMCwgMHg2ODUwLCAweGQwZmMsIDB4MTFhOCwgMHgwMGQ2LCAweDI4MDUsIDB4YWM2OCwgMHgyOTAwLAorCTB4MDAwMiwgMHgyMGUyLCAweDIwYzcsIDB4MjBjNywgMHgyMGUyLCAweDIwZTIsIDB4MjBkYiwgMHgyMGUyLAorCTB4MjBjNywgMHgyMGUyLCAweDIwY2MsIDB4MjBjYywgMHgyMGUyLCAweDIwZTIsIDB4MjBlMiwgMHgyMGQzLAorCTB4MjBjYywgMHhjMGZjLCAweDY4NTIsIDB4NmI2YywgMHg2YTcwLCAweDZkMWMsIDB4NmMyMCwgMHhkOTljLAorCTB4MDUyOCwgMHgwMGQ2LCAweDI4MDUsIDB4YWM2OCwgMHg2ZjA4LCAweDZlMGMsIDB4MDBmMCwgMHg2YjA4LAorCTB4NmEwYywgMHg2ZDAwLCAweDZjMDQsIDB4MDBjOCwgMHg2YjEwLCAweDZhMTQsIDB4NmQwMCwgMHg2YzA0LAorCTB4NmYwOCwgMHg2ZTBjLCAweDAwOTAsIDB4MDBkZSwgMHgwMGQ2LCAweDY4MzQsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4NiwgMHgwMDFlLCAweDExMzgsIDB4MDBkZSwgMHgwODBjLCAweDIyYTcsIDB4MTkwNCwgMHgyMDkxLAorCTB4YTAwZSwgMHgwMGYwLCAweDAwZGUsIDB4MDgwYywgMHgxNTE1LCAweDAwZGUsIDB4N2IyMiwgMHg3YTI2LAorCTB4N2QzMiwgMHg3YzM2LCAweDdmM2EsIDB4N2UzZSwgMHg3OTAyLCAweDcwMDAsIDB4ODAwMCwgMHg3MDAyLAorCTB4NjgyOCwgMHhhMzAwLCAweDY4MmEsIDB4NjgyYywgMHhhMjAxLCAweDY4MmUsIDB4NzAwYywgMHhhMzAwLAorCTB4NzAwZSwgMHg3MDEwLCAweGEyMDEsIDB4NzAxMiwgMHgwODBjLCAweDIyYTcsIDB4MDAwOCwgMHhhMDA2LAorCTB4MDAyZSwgMHgwMDNlLCAweDAwNGUsIDB4MDA1ZSwgMHgwMDZlLCAweDAwN2UsIDB4MDAwNSwgMHgwODBjLAorCTB4MTUxNSwgMHgwMDI2LCAweDIwMDEsIDB4MDEwNSwgMHgyMDAzLCAweDAwMTAsIDB4MjBlMSwgMHg5MDQwLAorCTB4NzgwMywgMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwgMHg3MDA0LCAweDIwNjAsIDB4MDBkNiwgMHg2MDEwLAorCTB4MjA2OCwgMHgwODBjLCAweDljNWEsIDB4MDExOCwgMHg2ODUwLCAweGMwYmQsIDB4Njg1MiwgMHg2MDFjLAorCTB4YTA4NiwgMHgwMDA2LCAweDExODAsIDB4MjA2MSwgMHgwMTAwLCAweDYyYzgsIDB4MjAwMSwgMHgwMGZhLAorCTB4ODAwMSwgMHgxZGYwLCAweDYwYzgsIDB4YTIwNiwgMHgxZGMwLCAweDYwYzQsIDB4Njg2YSwgMHg2MGM4LAorCTB4Njg2NiwgMHg3MDA0LCAweDIwNjAsIDB4MDBkZSwgMHgwMGM2LCAweDA4MGMsIDB4OTkyYSwgMHgwMGNlLAorCTB4MjAwMSwgMHhiN2VmLCAweDIwMDQsIDB4YWMwNiwgMHgxMTUwLCAweDIwZTEsIDB4OTA0MCwgMHgwODBjLAorCTB4ODI1ZCwgMHgyMDExLCAweDAwMDAsIDB4MDgwYywgMHg4MDdmLCAweDA4MGMsIDB4NzIzMCwgMHgwMDJlLAorCTB4MDgwNCwgMHgyMjA0LCAweDAxMjYsIDB4MjA5MSwgMHgyNDAwLCAweDAwMDYsIDB4MDAxNiwgMHgwMGY2LAorCTB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MjA3OSwgMHgwMDIwLCAweDIwNzEsIDB4Yjg0YSwgMHgyYjY4LAorCTB4NjgxOCwgMHgyMDYwLCAweDc5MDQsIDB4NzgwMywgMHgwMDAyLCAweGExODQsIDB4MDcwMCwgMHgxOTA0LAorCTB4MjEwOSwgMHg3MDAwLCAweDAwMDIsIDB4MjIwNCwgMHgyMTY3LCAweDIxZDcsIDB4MjIwMiwgMHg4MDAxLAorCTB4NzAwMiwgMHhkMTljLCAweDExNzAsIDB4OGFmZiwgMHgwNWQwLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLAorCTB4MjA4YiwgMHgwOTA0LCAweDIyMDQsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsIDB4MjA4YiwgMHgwODA0LAorCTB4MjIwNCwgMHg3ODAzLCAweDAwMDQsIDB4ZDE5NCwgMHgwMTQ4LCAweDY4NTAsIDB4YzBmYywgMHg2ODUyLAorCTB4OGFmZiwgMHgxMWQ4LCAweDY4NGMsIDB4YzBmNSwgMHg2ODRlLCAweDAwYjgsIDB4MDAyNiwgMHgwMDM2LAorCTB4NmIyOCwgMHg2YTJjLCAweDc4MjAsIDB4Njg2ZSwgMHhhMzFhLCAweDc4MjQsIDB4Njg3MiwgMHhhMjEzLAorCTB4NzgzMCwgMHg2ODFlLCAweDc4MzQsIDB4NjgyMiwgMHg2YjJhLCAweDZhMmUsIDB4MDAzZSwgMHgwMDJlLAorCTB4MDgwYywgMHgyMmJkLCAweDY4NTAsIDB4YzBmZCwgMHg2ODUyLCAweDJhMDAsIDB4NjgyNiwgMHgyYzAwLAorCTB4NjgxYSwgMHgyODAwLCAweDY4MzIsIDB4NzAwMywgMHgwMDAwLCAweDA4MDQsIDB4MjIwNCwgMHgwMGY2LAorCTB4MDAyNiwgMHg3ODFjLCAweDAwMDYsIDB4NzgxOCwgMHgwMDA2LCAweDIwNzksIDB4MDEwMCwgMHg3YTE0LAorCTB4YTI4NCwgMHgwMTg0LCAweGEwODUsIDB4MDAxMiwgMHg3ODE2LCAweDAwMzYsIDB4MjAxOSwgMHgxMDAwLAorCTB4ODMxOSwgMHgwOTBjLCAweDE1MTUsIDB4NzgyMCwgMHhkMGJjLCAweDFkZDAsIDB4MDAzZSwgMHg3OWM4LAorCTB4MDAwZSwgMHhhMTAyLCAweDAwMWUsIDB4MDAwNiwgMHgwMDE2LCAweDc5YzQsIDB4MDAwZSwgMHhhMTAzLAorCTB4NzhjNiwgMHgwMDBlLCAweDc4Y2EsIDB4YTI4NCwgMHgwMTg0LCAweGEwODUsIDB4MDAxMiwgMHg3ODE2LAorCTB4MDAyZSwgMHgwMGZlLCAweDc4MDMsIDB4MDAwOCwgMHg3MDAzLCAweDAwMDAsIDB4MDQ2OCwgMHg4MDAxLAorCTB4NzAwMiwgMHhkMTk0LCAweDAxNjgsIDB4NzgwNCwgMHhkMGZjLCAweDE5MDQsIDB4MjE1YSwgMHhkMTljLAorCTB4MTFmOCwgMHg4YWZmLCAweDA1MDgsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsIDB4MjA4YiwgMHgwMGUwLAorCTB4MDAyNiwgMHgwMDM2LCAweDZiMjgsIDB4NmEyYywgMHgwODBjLCAweDIyYmQsIDB4MDBkNiwgMHgyODA1LAorCTB4YWM2OCwgMHg2MDM0LCAweGQwOWMsIDB4MTEyOCwgMHg2ODA4LCAweGEzMWEsIDB4NjgwYywgMHhhMjEzLAorCTB4MDAyMCwgMHg2ODEwLCAweGEzMWEsIDB4NjgxNCwgMHhhMjEzLCAweDAwZGUsIDB4MDgwNCwgMHgyMThhLAorCTB4MDgwNCwgMHgyMTg2LCAweDA4MGMsIDB4MTUxNSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLAorCTB4MDAxZSwgMHgwMDBlLCAweDAxMmUsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MjA3MSwgMHhiODRhLAorCTB4NzAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDVkMCwgMHgyMDc5LCAweDAwMjAsIDB4MDAxNiwgMHgyMDA5LAorCTB4MDIwNywgMHgyMTBjLCAweGQxOTQsIDB4MDE5OCwgMHgyMDA5LCAweDAyMGMsIDB4MjEwYywgMHhhMTg0LAorCTB4MDAwMywgMHgwMTY4LCAweDA4MGMsIDB4YjQ1MCwgMHgyMDAxLCAweDAxMzMsIDB4MjAwNCwgMHhhMDA1LAorCTB4MDkwYywgMHgxNTE1LCAweDIwZTEsIDB4OTA0MCwgMHgyMDAxLCAweDAyMGMsIDB4MjEwMiwgMHgyMDA5LAorCTB4MDIwNiwgMHgyMTA0LCAweDIwMDksIDB4MDIwMywgMHgyMTBjLCAweGExMDYsIDB4MTExMCwgMHgyMGUxLAorCTB4OTA0MCwgMHg3ODA0LCAweGQwZmMsIDB4MDlkOCwgMHgwODBjLCAweDIxNGEsIDB4NzAwMCwgMHhhMDg2LAorCTB4MDAwMCwgMHgxOWE4LCAweDAwMWUsIDB4NzgwMywgMHgwMDA0LCAweDc4MDQsIDB4ZDBhYywgMHgxZGU4LAorCTB4MjBlMSwgMHg5MDQwLCAweDc4MDMsIDB4MDAwMiwgMHg3MDAzLCAweDAwMDAsIDB4MDBlZSwgMHgwMGZlLAorCTB4MDAwNSwgMHgwMDI2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwgMHhiODRhLAorCTB4MjA3OSwgMHgwMDIwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAwLCAweDA1NDAsIDB4NzAwNCwgMHgyMDYwLAorCTB4NjAxMCwgMHgyMDY4LCAweDA4MGMsIDB4OWM1YSwgMHgwMTU4LCAweDY4NTAsIDB4YzBiNSwgMHg2ODUyLAorCTB4NjgwYywgMHg3YTFjLCAweGEyMDYsIDB4MTEyMCwgMHg2ODA4LCAweDdhMTgsIDB4YTIwNiwgMHgwMWUwLAorCTB4MjAwMSwgMHgwMTA1LCAweDIwMDMsIDB4MDAxMCwgMHgyMGUxLCAweDkwNDAsIDB4NzgwMywgMHgwMDA0LAorCTB4NzAwMywgMHgwMDAwLCAweDcwMDQsIDB4MjA2MCwgMHgwODBjLCAweDk5MmEsIDB4MjBlMSwgMHg5MDQwLAorCTB4MDgwYywgMHg4MjVkLCAweDIwMTEsIDB4MDAwMCwgMHgwODBjLCAweDgwN2YsIDB4MDBmZSwgMHgwMGVlLAorCTB4MDBkZSwgMHgwMGNlLCAweDAwMmUsIDB4MDAwNSwgMHg2ODEwLCAweDZhMTQsIDB4YTIwNSwgMHgxZDAwLAorCTB4Njg0YywgMHhjMGRjLCAweDY4NGUsIDB4MmMxMCwgMHgwODBjLCAweDFmYTksIDB4MjAwMSwgMHgwMTA1LAorCTB4MjAwMywgMHgwMDEwLCAweDIwZTEsIDB4OTA0MCwgMHg3ODAzLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLAorCTB4MjA2OSwgMHhiN2UwLCAweDY4MzMsIDB4MDAwMCwgMHg2ODNmLCAweDAwMDAsIDB4MDhmOCwgMHg4ODQwLAorCTB4MjgwNSwgMHhhMDA1LCAweDExNzAsIDB4NjAwNCwgMHhhMDA1LCAweDAxNjgsIDB4NjgxYSwgMHgyMDYwLAorCTB4NjAzNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHgyMmU1LCAweDIwNDUsIDB4ODhmZiwgMHgwOTBjLAorCTB4MTUxNSwgMHg4YTUxLCAweDAwMDUsIDB4MjA1MCwgMHgwMDA1LCAweDhhNTAsIDB4ODg0MSwgMHgyODA1LAorCTB4YTAwNSwgMHgxMTkwLCAweDJjMDAsIDB4YWQwNiwgMHgwMTIwLCAweDYwMDAsIDB4YTAwNSwgMHgxMTA4LAorCTB4MmQwMCwgMHgyMDYwLCAweDY4MWEsIDB4NjAzNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHgyMmY1LAorCTB4MjA0NSwgMHg4OGZmLCAweDA5MGMsIDB4MTUxNSwgMHgwMDA1LCAweDAwMDAsIDB4MDAxMSwgMHgwMDE1LAorCTB4MDAxOSwgMHgwMDFkLCAweDAwMjEsIDB4MDAyNSwgMHgwMDI5LCAweDAwMDAsIDB4MDAwZiwgMHgwMDE1LAorCTB4MDAxYiwgMHgwMDIxLCAweDAwMjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjJkYSwgMHgyMmQ2LAorCTB4MDAwMCwgMHgwMDAwLCAweDIyZTQsIDB4MDAwMCwgMHgyMmRhLCAweDAwMDAsIDB4MjJlMSwgMHgyMmRlLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjJlNCwgMHgyMmUxLCAweDAwMDAsIDB4MjJkYywgMHgyMmRjLAorCTB4MDAwMCwgMHgwMDAwLCAweDIyZTQsIDB4MDAwMCwgMHgyMmRjLCAweDAwMDAsIDB4MjJlMiwgMHgyMmUyLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjJlNCwgMHgyMmUyLCAweDAwYTYsIDB4MDA5NiwgMHgwMDg2LAorCTB4NmIyZSwgMHg2YzJhLCAweDY4NTgsIDB4YTA1NSwgMHgwOTA0LCAweDIzOTYsIDB4MmQ2MCwgMHg2MDM0LAorCTB4YTBjYywgMHgwMDBmLCAweGE5YzAsIDB4MjJlNSwgMHhhOTg2LCAweDAwMDcsIDB4MDEzMCwgMHhhOTg2LAorCTB4MDAwZSwgMHgwMTE4LCAweGE5ODYsIDB4MDAwZiwgMHgxMTIwLCAweDYwNWMsIDB4YTQyMiwgMHg2MDYwLAorCTB4YTMxYiwgMHgyODA1LCAweGEwNDUsIDB4MTE0MCwgMHgwMzEwLCAweDA4MDQsIDB4MjM5NiwgMHg2MDA0LAorCTB4YTA2NSwgMHgwOTA0LCAweDIzOTYsIDB4MGMxOCwgMHgyODA1LCAweGEwMDUsIDB4MDFhOCwgMHhhYzY4LAorCTB4ZDk5YywgMHgxMTI4LCAweDY4MDgsIDB4YTQyMiwgMHg2ODBjLCAweGEzMWIsIDB4MDAyMCwgMHg2ODEwLAorCTB4YTQyMiwgMHg2ODE0LCAweGEzMWIsIDB4MDYyMCwgMHgyMzAwLCAweGE0MDUsIDB4MDE1MCwgMHg4YTUxLAorCTB4MDkwNCwgMHgyMzk2LCAweDg4NDAsIDB4MGM0MCwgMHg2MDA0LCAweGEwNjUsIDB4MDkwNCwgMHgyMzk2LAorCTB4MDgzMCwgMHg4YTUxLCAweDA5MDQsIDB4MjM5NiwgMHg4ODQwLCAweDI4MDUsIDB4YTAwNSwgMHgxMTU4LAorCTB4NjAwNCwgMHhhMDY1LCAweDA5MDQsIDB4MjM5NiwgMHg2MDM0LCAweGEwY2MsIDB4MDAwZiwgMHhhOWMwLAorCTB4MjJlNSwgMHgyODA1LCAweDIwNDAsIDB4MmI2OCwgMHg2ODUwLCAweGMwZmMsIDB4Njg1MiwgMHgwNDU4LAorCTB4ODQyMiwgMHg4NDIwLCAweDgzMWEsIDB4YTM5OSwgMHgwMDAwLCAweDAwZDYsIDB4MmI2OCwgMHg2YzZlLAorCTB4NmI3MiwgMHgwMGRlLCAweGQ5OWMsIDB4MTE2OCwgMHg2OTA4LCAweDI0MDAsIDB4YTEyMiwgMHg2OTBjLAorCTB4MjMwMCwgMHhhMTFiLCAweDBhMGMsIDB4MTUxNSwgMHg2ODAwLCAweGE0MjAsIDB4NjgwNCwgMHhhMzE5LAorCTB4MDA2MCwgMHg2OTEwLCAweDI0MDAsIDB4YTEyMiwgMHg2OTE0LCAweDIzMDAsIDB4YTExYiwgMHgwYTBjLAorCTB4MTUxNSwgMHg2ODAwLCAweGE0MjAsIDB4NjgwNCwgMHhhMzE5LCAweDJiNjgsIDB4NmMxZSwgMHg2YjIyLAorCTB4Njg1MCwgMHhjMGZkLCAweDY4NTIsIDB4MmMwMCwgMHg2ODFhLCAweDI4MDAsIDB4NjgzMiwgMHgyYTAwLAorCTB4NjgyNiwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHhhMDA2LCAweDAwMjgsIDB4MDA4ZSwgMHgwMDllLAorCTB4MDBhZSwgMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgyMDAxLCAweDAwMDUsIDB4MjAwNCwgMHhhMDg0LAorCTB4MDAwNywgMHgwMDAyLCAweDIzYWEsIDB4MjNhYiwgMHgyM2FlLCAweDIzYjEsIDB4MjNiNiwgMHgyM2I5LAorCTB4MjNiZSwgMHgyM2MzLCAweDAwMDUsIDB4MDgwYywgMHgyMTRhLCAweDAwMDUsIDB4MDgwYywgMHgxYjA2LAorCTB4MDAwNSwgMHgwODBjLCAweDFiMDYsIDB4MDgwYywgMHgyMTRhLCAweDAwMDUsIDB4MDgwYywgMHgxNzFiLAorCTB4MDAwNSwgMHgwODBjLCAweDIxNGEsIDB4MDgwYywgMHgxNzFiLCAweDAwMDUsIDB4MDgwYywgMHgxYjA2LAorCTB4MDgwYywgMHgxNzFiLCAweDAwMDUsIDB4MDgwYywgMHgxYjA2LCAweDA4MGMsIDB4MjE0YSwgMHgwODBjLAorCTB4MTcxYiwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHgyNjAwLCAweDIwNzksIDB4MDIwMCwgMHgyMDcxLAorCTB4YmI4MCwgMHgyMDY5LCAweGI1MDAsIDB4MDgwYywgMHgyNGMwLCAweDA4MGMsIDB4MjRiMCwgMHgyMDA5LAorCTB4MDAwNCwgMHg3OTEyLCAweDc4MTcsIDB4MDAwNCwgMHgwODBjLCAweDI3ZjgsIDB4NzgxYiwgMHgwMDAyLAorCTB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMGE5LCAweDAwODAsIDB4NzgyZiwgMHgwMDAwLAorCTB4MWYwNCwgMHgyM2U2LCAweDIwZTEsIDB4OTA4MCwgMHg3ODNiLCAweDAwMWYsIDB4MjBlMSwgMHg4NzAwLAorCTB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHgyNjAwLCAweDc4MWMsIDB4ZDBhNCwgMHgxOTBjLAorCTB4MjRhZCwgMHhhMDg0LCAweDAwMDcsIDB4MDAwMiwgMHgyNDE2LCAweDI0MDQsIDB4MjQwNywgMHgyNDBhLAorCTB4MjQwZiwgMHgyNDExLCAweDI0MTMsIDB4MjQxNSwgMHgwODBjLCAweDYzYzQsIDB4MDA3OCwgMHgwODBjLAorCTB4NjQwMywgMHgwMDYwLCAweDA4MGMsIDB4NjNjNCwgMHgwODBjLCAweDY0MDMsIDB4MDAzOCwgMHgwMDQxLAorCTB4MDAyOCwgMHgwMDMxLCAweDAwMTgsIDB4MDAyMSwgMHgwMDA4LCAweDAwMTEsIDB4MDEyZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDgwYywgMHhiNDUwLCAweDc5MzAsIDB4YTE4NCwgMHgwMDAzLAorCTB4MDFiMCwgMHgyMDAxLCAweGI3ZWYsIDB4MjAwNCwgMHhhMDA1LCAweDAxNzAsIDB4MjAwMSwgMHgwMTMzLAorCTB4MjAwNCwgMHhhMDA1LCAweDA5MGMsIDB4MTUxNSwgMHgwMGM2LCAweDIwMDEsIDB4YjdlZiwgMHgyMDY0LAorCTB4MDgwYywgMHg5OTJhLCAweDAwY2UsIDB4MDRiOCwgMHgyMGUxLCAweDkwNDAsIDB4MDRhMCwgMHhhMTg0LAorCTB4MDAzMCwgMHgwMWUwLCAweDZhMDAsIDB4YTI4NiwgMHgwMDAzLCAweDExMDgsIDB4MDBhMCwgMHgwODBjLAorCTB4NWFjZiwgMHgxMTc4LCAweDIwMDEsIDB4Yjc5ZiwgMHgyMDAzLCAweDAwMDEsIDB4MjAwMSwgMHhiNTAwLAorCTB4MjAwMywgMHgwMDAxLCAweGEwODUsIDB4MDAwMSwgMHgwODBjLCAweDViMTMsIDB4MDgwYywgMHg1YTA3LAorCTB4MDAxMCwgMHgwODBjLCAweDRiMWYsIDB4MDgwYywgMHgyNGIwLCAweDAwYTgsIDB4YTE4NCwgMHgwMGMwLAorCTB4MDE2OCwgMHgwMGU2LCAweDAwMzYsIDB4MDA0NiwgMHgwMDU2LCAweDIwNzEsIDB4YjgyMywgMHgwODBjLAorCTB4MWRmZSwgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwgMHgwMGVlLCAweDAwMjgsIDB4YTE4NCwgMHgwMzAwLAorCTB4MDExMCwgMHgyMGUxLCAweDkwMjAsIDB4NzkzMiwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDAxNiwgMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwgMHhiNTAwLCAweDcxMjgsIDB4MjAwMSwgMHhiNzkxLAorCTB4MjEwMiwgMHgyMDAxLCAweGI3OTksIDB4MjEwMiwgMHhhMTgyLCAweDAyMTEsIDB4MTIxOCwgMHgyMDA5LAorCTB4MDAwOCwgMHgwNDAwLCAweGExODIsIDB4MDI1OSwgMHgxMjE4LCAweDIwMDksIDB4MDAwNywgMHgwMGQwLAorCTB4YTE4MiwgMHgwMmMxLCAweDEyMTgsIDB4MjAwOSwgMHgwMDA2LCAweDAwYTAsIDB4YTE4MiwgMHgwMzQ5LAorCTB4MTIxOCwgMHgyMDA5LCAweDAwMDUsIDB4MDA3MCwgMHhhMTgyLCAweDA0MjEsIDB4MTIxOCwgMHgyMDA5LAorCTB4MDAwNCwgMHgwMDQwLCAweGExODIsIDB4MDU4MSwgMHgxMjE4LCAweDIwMDksIDB4MDAwMywgMHgwMDEwLAorCTB4MjAwOSwgMHgwMDAyLCAweDIwNzksIDB4MDIwMCwgMHg3OTEyLCAweDc4MTcsIDB4MDAwNCwgMHgwODBjLAorCTB4MjdmOCwgMHgwMGZlLCAweDAwZWUsIDB4MDAxZSwgMHgwMDA1LCAweDc5MzgsIDB4MDgwYywgMHgxNTE1LAorCTB4MDBlNiwgMHgwMDI2LCAweDIwNzEsIDB4MDIwMCwgMHgyMGUxLCAweDEwMDAsIDB4NzIyMCwgMHg3MDI4LAorCTB4NzAyMCwgMHhhMjA2LCAweDBkZTAsIDB4MjBlMSwgMHg5MDEwLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MjBlMSwgMHhhMDAwLCAweDc4MzcsIDB4MDAwMSwgMHg3ODJmLCAweDAwMDAsIDB4NzgyZiwgMHgwMDAwLAorCTB4NzgyZiwgMHgwMDAwLCAweDc4MmYsIDB4MDAwMCwgMHg3ODM3LCAweDAwMDUsIDB4MjBhOSwgMHgwMjEwLAorCTB4NzgzMCwgMHhkMGJjLCAweDExMTAsIDB4MWYwNCwgMHgyNGQwLCAweDc4MzcsIDB4MDAwMSwgMHg3ODM3LAorCTB4MDAwMCwgMHhlMDAwLCAweGUwMDAsIDB4MjBlMSwgMHhhMDAwLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLAorCTB4MjgwMCwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHhiNTAwLCAweDYwMjQsIDB4NjAyNiwgMHg2MDUzLAorCTB4MDAzMCwgMHgwODBjLCAweDI4MzcsIDB4NjA1MCwgMHhhMDg0LCAweGZlN2YsIDB4NjA1MiwgMHgyMDA5LAorCTB4MDBlZiwgMHg2MTMyLCAweDYxMzYsIDB4MDgwYywgMHgyODQ3LCAweDYwZTcsIDB4MDAwMCwgMHg2MWVhLAorCTB4NjBlMywgMHgwMDA4LCAweDYwNGIsIDB4ZjdmNywgMHg2MDQzLCAweDAwMDAsIDB4NjAyZiwgMHgwMDgwLAorCTB4NjAyZiwgMHgwMDAwLCAweDYwMDcsIDB4MGU5ZiwgMHg2MDFiLCAweDAwMWUsIDB4NjAwZiwgMHgwMGZmLAorCTB4MjAwMSwgMHhiNzhkLCAweDIwMDMsIDB4MDBmZiwgMHg2MDJiLCAweDAwMmYsIDB4MDEyZSwgMHgwMDA1LAorCTB4MjAwMSwgMHhiNTMyLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweGI1MzEsIDB4MjAwMywgMHgwMDAxLAorCTB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHg2MTI0LAorCTB4YTE4NCwgMHgxZTJjLCAweDExMTgsIDB4YTE4NCwgMHgwMDA3LCAweDAwMmEsIDB4YTE5NSwgMHgwMDA0LAorCTB4YTI4NCwgMHgwMDA3LCAweDAwMDIsIDB4MjU0ZCwgMHgyNTMzLCAweDI1MzYsIDB4MjUzOSwgMHgyNTNlLAorCTB4MjU0MCwgMHgyNTQ0LCAweDI1NDgsIDB4MDgwYywgMHg2Yjc0LCAweDAwYjgsIDB4MDgwYywgMHg2YzRmLAorCTB4MDBhMCwgMHgwODBjLCAweDZjNGYsIDB4MDgwYywgMHg2Yjc0LCAweDAwNzgsIDB4MDA5OSwgMHgwMDY4LAorCTB4MDgwYywgMHg2Yjc0LCAweDAwNzksIDB4MDA0OCwgMHgwODBjLCAweDZjNGYsIDB4MDA1OSwgMHgwMDI4LAorCTB4MDgwYywgMHg2YzRmLCAweDA4MGMsIDB4NmI3NCwgMHgwMDI5LCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLAorCTB4MDEyZSwgMHgwMDA1LCAweDYxMjQsIDB4NjAyOCwgMHhkMDljLCAweDAxMTgsIDB4ZDE5YywgMHgxOTA0LAorCTB4Mjc2NiwgMHgwODBjLCAweDVhY2YsIDB4MDU3OCwgMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMTk4LAorCTB4NjAyNCwgMHhhMDg0LCAweDE4MDAsIDB4MDE3OCwgMHgwODBjLCAweDVhZjUsIDB4MDExOCwgMHgwODBjLAorCTB4NWFlMSwgMHgxMTQ4LCAweDYwMjcsIDB4MDAyMCwgMHg2MDQzLCAweDAwMDAsIDB4MjAwMSwgMHhiNzllLAorCTB4MjAwMywgMHhhYWFhLCAweDA0NTgsIDB4MDgwYywgMHg1YWY1LCAweDE1ZDAsIDB4NjAyNCwgMHhhMDg0LAorCTB4MTgwMCwgMHgxMTA4LCAweDA0YTgsIDB4MjAwMSwgMHhiNzllLCAweDIwMDMsIDB4YWFhYSwgMHgyMDAxLAorCTB4Yjc5ZiwgMHgyMDAzLCAweDAwMDEsIDB4MjAwMSwgMHhiNTAwLCAweDIwMDMsIDB4MDAwMSwgMHgwODBjLAorCTB4NWEwNywgMHgwODA0LCAweDI3NjYsIDB4ZDFhYywgMHgxNTE4LCAweDYwMjQsIDB4ZDBkYywgMHgxMTcwLAorCTB4ZDBlNCwgMHgxMTg4LCAweGQwZDQsIDB4MTFhMCwgMHhkMGNjLCAweDAxMzAsIDB4NzA4YywgMHhhMDg2LAorCTB4MDAyOCwgMHgxMTEwLCAweDA4MGMsIDB4NWM1ZSwgMHgwODA0LCAweDI3NjYsIDB4MjAwMSwgMHhiNzlmLAorCTB4MjAwMywgMHgwMDAwLCAweDAwNDgsIDB4MjAwMSwgMHhiNzlmLCAweDIwMDMsIDB4MDAwMiwgMHgwMDIwLAorCTB4MDgwYywgMHg1YmQxLCAweDA4MDQsIDB4Mjc2NiwgMHgwODBjLCAweDVkMDMsIDB4MDgwNCwgMHgyNzY2LAorCTB4ZDFhYywgMHgwOTA0LCAweDI2YWUsIDB4MDgwYywgMHg1YWNmLCAweDExZDgsIDB4NjAyNywgMHgwMDIwLAorCTB4MDAwNiwgMHgwMDI2LCAweDAwMzYsIDB4MDgwYywgMHg1YWViLCAweDExNzAsIDB4MjAwMSwgMHhiNzlmLAorCTB4MjAwMywgMHgwMDAxLCAweDIwMDEsIDB4YjUwMCwgMHgyMDAzLCAweDAwMDEsIDB4MDgwYywgMHg1YTA3LAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMGUsIDB4MDAwNSwgMHgwMDNlLCAweDAwMmUsIDB4MDAwZSwgMHgwODBjLAorCTB4NWFhNiwgMHgwMDE2LCAweDAwNDYsIDB4MDBjNiwgMHg2NDRjLCAweGE0ODYsIDB4ZjBmMCwgMHgxMTM4LAorCTB4MjA2MSwgMHgwMTAwLCAweDY0NGEsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHg3NGNlLAorCTB4YTQ4YywgMHhmZjAwLCAweDcwMzQsIDB4ZDA4NCwgMHgwMTc4LCAweGExODYsIDB4ZjgwMCwgMHgxMTYwLAorCTB4NzAzYywgMHhkMDg0LCAweDExNDgsIDB4YzA4NSwgMHg3MDNlLCAweDAwMzYsIDB4MjQxOCwgMHgyMDExLAorCTB4ODAxNiwgMHgwODBjLCAweDNlY2MsIDB4MDAzZSwgMHhhMTk2LCAweGZmMDAsIDB4MDViOCwgMHg3MDU0LAorCTB4YTA4NCwgMHgwMGZmLCAweDgxMGYsIDB4YTExNiwgMHgwNTg4LCAweDcxMzAsIDB4ZDE4NCwgMHgxNTcwLAorCTB4MjAxMSwgMHhiNTUzLCAweDIyMTQsIDB4ZDJlYywgMHgwMTM4LCAweGMxOGQsIDB4NzEzMiwgMHgyMDExLAorCTB4YjU1MywgMHgyMjE0LCAweGQyYWMsIDB4MTUxMCwgMHg2MjQwLCAweGEyOTQsIDB4MDAxMCwgMHgwMTMwLAorCTB4NjI0OCwgMHhhMjk0LCAweGZmMDAsIDB4YTI5NiwgMHhmZjAwLCAweDAxYzAsIDB4NzAzMCwgMHhkMDhjLAorCTB4MDkwNCwgMHgyNjdiLCAweDcwMzQsIDB4ZDA4YywgMHgxMTQwLCAweDIwMDEsIDB4YjUwYywgMHgyMDBjLAorCTB4ZDFhYywgMHgxOTA0LCAweDI2N2IsIDB4YzFhZCwgMHgyMTAyLCAweDAwMzYsIDB4NzNjYywgMHgyMDExLAorCTB4ODAxMywgMHgwODBjLCAweDNlY2MsIDB4MDAzZSwgMHgwODA0LCAweDI2N2IsIDB4NzAzNCwgMHhkMDhjLAorCTB4MTE0MCwgMHgyMDAxLCAweGI1MGMsIDB4MjAwYywgMHhkMWFjLCAweDE5MDQsIDB4MjY3YiwgMHhjMWFkLAorCTB4MjEwMiwgMHgwMDM2LCAweDczY2MsIDB4MjAxMSwgMHg4MDEzLCAweDA4MGMsIDB4M2VjYywgMHgwMDNlLAorCTB4NzEzMCwgMHhjMTg1LCAweDcxMzIsIDB4MjAxMSwgMHhiNTUzLCAweDIyMGMsIDB4ZDFhNCwgMHgwMWQwLAorCTB4MDAxNiwgMHgyMDA5LCAweDAwMDEsIDB4MjAxMSwgMHgwMTAwLCAweDA4MGMsIDB4NmIxYSwgMHgyMDE5LAorCTB4MDAwZSwgMHgwODBjLCAweGIwNjUsIDB4YTQ4NCwgMHgwMGZmLCAweGEwODAsIDB4MmRjNCwgMHgyMDBkLAorCTB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4ODEyNywgMHhhMDA2LCAweDIwMDksIDB4MDAwZSwgMHgwODBjLAorCTB4YjBlOCwgMHgwMDFlLCAweGQxYWMsIDB4MTE0OCwgMHgwMDE2LCAweDIwMDksIDB4MDAwMCwgMHgyMDE5LAorCTB4MDAwNCwgMHgwODBjLCAweDJjNmYsIDB4MDAxZSwgMHgwMDcwLCAweDAxNTYsIDB4MjBhOSwgMHgwMDdmLAorCTB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4NGZhOSwgMHgxMTEwLCAweDA4MGMsIDB4NGMwYiwgMHg4MTA4LAorCTB4MWYwNCwgMHgyNjcyLCAweDAxNWUsIDB4MDBjZSwgMHgwMDRlLCAweDIwMTEsIDB4MDAwMywgMHgwODBjLAorCTB4ODA3NSwgMHgyMDExLCAweDAwMDIsIDB4MDgwYywgMHg4MDdmLCAweDA4MGMsIDB4N2Y1OSwgMHgwMDM2LAorCTB4MjAxOSwgMHgwMDAwLCAweDA4MGMsIDB4N2ZlNCwgMHgwMDNlLCAweDYwZTMsIDB4MDAwMCwgMHgwMDFlLAorCTB4MjAwMSwgMHhiNTAwLCAweDIwMTQsIDB4YTI5NiwgMHgwMDA0LCAweDExMjgsIDB4ZDE5YywgMHgxMWIwLAorCTB4NjIyOCwgMHhjMjlkLCAweDYyMmEsIDB4MjAwMywgMHgwMDAxLCAweDIwMDEsIDB4YjUyMywgMHgyMDAzLAorCTB4MDAwMCwgMHg2MDI3LCAweDAwMjAsIDB4MDgwYywgMHg1YWY1LCAweDExNDAsIDB4MDAxNiwgMHgyMDA5LAorCTB4MDdkMCwgMHgyMDExLCAweDU5ZTQsIDB4MDgwYywgMHg2YTIyLCAweDAwMWUsIDB4ZDE5NCwgMHgwOTA0LAorCTB4Mjc2NiwgMHgwMDE2LCAweDYyMjAsIDB4ZDJiNCwgMHgwOTA0LCAweDI3MTcsIDB4MDgwYywgMHg2YTEwLAorCTB4MDgwYywgMHg3ZDdhLCAweDYwMjcsIDB4MDAwNCwgMHgwMGY2LCAweDIwMTksIDB4YjdlOSwgMHgyMzA0LAorCTB4YTA3ZCwgMHgwNTcwLCAweDc4MDQsIDB4YTA4NiwgMHgwMDMyLCAweDE1NTAsIDB4MDBkNiwgMHgwMGM2LAorCTB4MDBlNiwgMHgyMDY5LCAweDAxNDAsIDB4NjE4YywgMHg2Mjg4LCAweDc4MTgsIDB4NjA4ZSwgMHg3ODA4LAorCTB4NjA4YSwgMHg2MDQzLCAweDAwMDIsIDB4MjAwMSwgMHgwMDAzLCAweDgwMDEsIDB4MWRmMCwgMHg2MDQzLAorCTB4MDAwMCwgMHg2ODAzLCAweDEwMDAsIDB4NjgwMywgMHgwMDAwLCAweDYxOGUsIDB4NjI4YSwgMHgwODBjLAorCTB4NzA5MCwgMHgwODBjLCAweDcxNzMsIDB4NzgxMCwgMHgyMDcwLCAweDcwMzcsIDB4MDEwMywgMHgyZjYwLAorCTB4MDgwYywgMHg4NjFkLCAweDAwZWUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZmUsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDBmZSwgMHgwMGQ2LCAweDIwNjksIDB4MDE0MCwgMHg2ODA0LCAweGEwODQsIDB4NDAwMCwgMHgwMTIwLAorCTB4NjgwMywgMHgxMDAwLCAweDY4MDMsIDB4MDAwMCwgMHgwMGRlLCAweDAwYzYsIDB4MjA2MSwgMHhiN2UwLAorCTB4NjAyOCwgMHhhMDlhLCAweDAwYzgsIDB4MTIzOCwgMHg4MDAwLCAweDYwMmEsIDB4MDBjZSwgMHgwODBjLAorCTB4N2Q2ZCwgMHgwODA0LCAweDI3NjUsIDB4MjAxOSwgMHhiN2U5LCAweDIzMDQsIDB4YTA2NSwgMHgwMTIwLAorCTB4MjAwOSwgMHgwMDI3LCAweDA4MGMsIDB4ODY0YywgMHgwMGNlLCAweDA4MDQsIDB4Mjc2NSwgMHhkMmJjLAorCTB4MDkwNCwgMHgyNzY1LCAweDA4MGMsIDB4NmExZCwgMHg2MDE0LCAweGEwODQsIDB4MDE4NCwgMHhhMDg1LAorCTB4MDAxMCwgMHg2MDE2LCAweDYwMjcsIDB4MDAwNCwgMHgwMGQ2LCAweDIwNjksIDB4MDE0MCwgMHg2ODA0LAorCTB4YTA4NCwgMHg0MDAwLCAweDAxMjAsIDB4NjgwMywgMHgxMDAwLCAweDY4MDMsIDB4MDAwMCwgMHgwMGRlLAorCTB4MDBjNiwgMHgyMDYxLCAweGI3ZTAsIDB4NjA0NCwgMHhhMDlhLCAweDAwYzgsIDB4MTJmMCwgMHg4MDAwLAorCTB4NjA0NiwgMHg2MDNjLCAweDAwY2UsIDB4YTAwNSwgMHgwNTQwLCAweDIwMDksIDB4MDdkMCwgMHgwODBjLAorCTB4NmExNSwgMHhhMDgwLCAweDAwMDcsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDYsIDB4MTEzOCwgMHg2MTE0LAorCTB4YTE4YywgMHgwMTg0LCAweGExOGQsIDB4MDAxMiwgMHg2MTE2LCAweDAwYjgsIDB4NjExNCwgMHhhMThjLAorCTB4MDE4NCwgMHhhMThkLCAweDAwMTYsIDB4NjExNiwgMHgwMDgwLCAweDAwMzYsIDB4MjAxOSwgMHgwMDAxLAorCTB4MDgwYywgMHg3ZmU0LCAweDAwM2UsIDB4MjAxOSwgMHhiN2VmLCAweDIzMDQsIDB4YTA2NSwgMHgwMTIwLAorCTB4MjAwOSwgMHgwMDRmLCAweDA4MGMsIDB4ODY0YywgMHgwMGNlLCAweDAwMWUsIDB4ZDE5YywgMHgwOTA0LAorCTB4MjdiZiwgMHg3MDM0LCAweGQwYWMsIDB4MTU2MCwgMHgwMDE2LCAweDAxNTYsIDB4NjAyNywgMHgwMDA4LAorCTB4NjAyZiwgMHgwMDIwLCAweDIwYTksIDB4MDAwNiwgMHgxZDA0LCAweDI3NzQsIDB4MjA5MSwgMHg2MDAwLAorCTB4MWYwNCwgMHgyNzc0LCAweDYwMmYsIDB4MDAwMCwgMHg2MTUwLCAweGExODUsIDB4MTQwMCwgMHg2MDUyLAorCTB4MjBhOSwgMHgwMzY2LCAweDFkMDQsIDB4Mjc4MiwgMHgyMDkxLCAweDYwMDAsIDB4NjAyMCwgMHhkMDljLAorCTB4MTEzMCwgMHgwMTVlLCAweDYxNTIsIDB4MDAxZSwgMHg2MDI3LCAweDAwMDgsIDB4MDQ4MCwgMHgwODBjLAorCTB4MjkwNywgMHgxZjA0LCAweDI3ODIsIDB4MDE1ZSwgMHg2MTUyLCAweDAwMWUsIDB4NjAyNywgMHgwMDA4LAorCTB4MDAxNiwgMHg2MDI4LCAweGMwOWMsIDB4NjAyYSwgMHgyMDExLCAweDAwMDMsIDB4MDgwYywgMHg4MDc1LAorCTB4MjAxMSwgMHgwMDAyLCAweDA4MGMsIDB4ODA3ZiwgMHgwODBjLCAweDdmNTksIDB4MDAzNiwgMHgyMDE5LAorCTB4MDAwMCwgMHgwODBjLCAweDdmZTQsIDB4MDAzZSwgMHg2MGUzLCAweDAwMDAsIDB4MDgwYywgMHhiNDJmLAorCTB4MDgwYywgMHhiNDRhLCAweGEwODUsIDB4MDAwMSwgMHgwODBjLCAweDViMTMsIDB4MjAwMSwgMHhiNTAwLAorCTB4MjAwMywgMHgwMDA0LCAweDYwMjcsIDB4MDAwOCwgMHgwODBjLCAweDEyZGQsIDB4MDAxZSwgMHhhMThjLAorCTB4ZmZkMCwgMHg2MTI2LCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDBlNiwgMHgwMGY2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhiNTAwLCAweDcxYzQsIDB4NzBjNiwgMHhhMTE2LAorCTB4MDUwMCwgMHg4MWZmLCAweDAxMjgsIDB4MjAxMSwgMHg4MDExLCAweDA4MGMsIDB4M2VjYywgMHgwMGM4LAorCTB4MjAxMSwgMHg4MDEyLCAweDA4MGMsIDB4M2VjYywgMHgyMDAxLCAweGI1NzIsIDB4MjAwNCwgMHhkMGZjLAorCTB4MTE4MCwgMHgwMDM2LCAweDAwYzYsIDB4MDgwYywgMHgyODkyLCAweDA4MGMsIDB4N2YzNSwgMHgyMDYxLAorCTB4MDEwMCwgMHgyMDE5LCAweDAwMjgsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4MmM2ZiwgMHgwMGNlLAorCTB4MDAzZSwgMHgwMTJlLCAweDAwZmUsIDB4MDBlZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDBjNiwgMHgwMGY2LCAweDAwMDYsIDB4MDAyNiwgMHgyMDYxLCAweDAxMDAsIDB4YTE5MCwgMHgyODBiLAorCTB4MjIwNSwgMHg2MGYyLCAweDIwMTEsIDB4MjgxOCwgMHgyMjA1LCAweDYwZWUsIDB4MDAyZSwgMHgwMDBlLAorCTB4MDBmZSwgMHgwMGNlLCAweDAwMDUsIDB4MDg0MCwgMHgwODQwLCAweDA4NDAsIDB4MDU4MCwgMHgwNDIwLAorCTB4MDM0OCwgMHgwMmMwLCAweDAyNTgsIDB4MDIxMCwgMHgwMWE4LCAweDAxYTgsIDB4MDFhOCwgMHgwMWE4LAorCTB4MDE0MCwgMHgwMGY4LCAweDAwZDAsIDB4MDBiMCwgMHgwMGEwLCAweDIwMjgsIDB4YTE4YywgMHgwMGZmLAorCTB4MjEzMCwgMHhhMDk0LCAweGZmMDAsIDB4MTExMCwgMHg4MWZmLCAweDAxMTgsIDB4MDgwYywgMHg2NmIxLAorCTB4MDAzOCwgMHhhMDgwLCAweDJkYzQsIDB4MjAwZCwgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHhhMDA2LAorCTB4MDAwNSwgMHhhMDgwLCAweDJkYzQsIDB4MjAwZCwgMHhhMThjLCAweDAwZmYsIDB4MDAwNSwgMHgwMGQ2LAorCTB4MjA2OSwgMHgwMTQwLCAweDIwMDEsIDB4YjUxNSwgMHgyMDAzLCAweDAwZWYsIDB4MjBhOSwgMHgwMDEwLAorCTB4YTAwNiwgMHg2ODUyLCAweDY4NTYsIDB4MWYwNCwgMHgyODQyLCAweDAwZGUsIDB4MDAwNSwgMHgwMDA2LAorCTB4MDBkNiwgMHgwMDI2LCAweDIwNjksIDB4MDE0MCwgMHgyMDAxLCAweGI1MTUsIDB4MjEwMiwgMHg4MTE0LAorCTB4ODIxNCwgMHg4MjE0LCAweDgyMTQsIDB4MjBhOSwgMHgwMDEwLCAweDY4NTMsIDB4MDAwMCwgMHhhMDA2LAorCTB4ODJmZiwgMHgxMTI4LCAweGExODQsIDB4MDAwZiwgMHhhMDgwLCAweGI0NWUsIDB4MjAwNSwgMHg2ODU2LAorCTB4ODIxMSwgMHgxZjA0LCAweDI4NTcsIDB4MDAyZSwgMHgwMGRlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGM2LAorCTB4MjA2MSwgMHhiNTAwLCAweDYwMzAsIDB4MDExMCwgMHhjMDlkLCAweDAwMDgsIDB4YzA5YywgMHg2MDMyLAorCTB4MDBjZSwgMHgwMDA1LCAweDAxNTYsIDB4MDBkNiwgMHgwMDI2LCAweDAwMTYsIDB4MDAwNiwgMHgyMDY5LAorCTB4MDE0MCwgMHg2OTgwLCAweGExMTYsIDB4MDE4MCwgMHhhMTEyLCAweDEyMzAsIDB4ODIxMiwgMHg4MjEwLAorCTB4MjJhOCwgMHgyMDAxLCAweDA0MDIsIDB4MDAxOCwgMHgyMmE4LCAweDIwMDEsIDB4MDQwNCwgMHg2ODBlLAorCTB4MWYwNCwgMHgyODg3LCAweDY4MGYsIDB4MDAwMCwgMHgwMDBlLCAweDAwMWUsIDB4MDAyZSwgMHgwMGRlLAorCTB4MDE1ZSwgMHgwMDA1LCAweDIwMDEsIDB4YjU1MywgMHgyMDA0LCAweGQwYzQsIDB4MDE1MCwgMHhkMGE0LAorCTB4MDE0MCwgMHhhMDA2LCAweDAwNDYsIDB4MjAyMCwgMHgyMDA5LCAweDAwMmUsIDB4MDgwYywgMHhiMGU4LAorCTB4MDA0ZSwgMHgwMDA1LCAweDAwZjYsIDB4MDAxNiwgMHgwMDI2LCAweDIwNzksIDB4MDE0MCwgMHg3OGM0LAorCTB4ZDBkYywgMHgwNTQ4LCAweGEwODQsIDB4MDcwMCwgMHhhMDhlLCAweDAzMDAsIDB4MTUyMCwgMHgyMDExLAorCTB4MDAwMCwgMHgyMDA5LCAweDAwMDIsIDB4MjMwMCwgMHhhMDgwLCAweDAwMjAsIDB4MjAxOCwgMHgyMzAwLAorCTB4MDgwYywgMHg2YjQwLCAweDIwMTEsIDB4MDAzMCwgMHgyMjAwLCAweDgwMDcsIDB4YTA4NSwgMHgwMDRjLAorCTB4NzhjMiwgMHgyMDA5LCAweDAyMDQsIDB4MjEwYywgMHgyMjAwLCAweGExMDAsIDB4MjAwOSwgMHgwMTM4LAorCTB4MjAwYSwgMHgwODBjLCAweDVhY2YsIDB4MTExOCwgMHgyMDA5LCAweGI3OGYsIDB4MjAwYSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwMGZlLCAweDAwMDUsIDB4NzhjMywgMHgwMDAwLCAweDBjYzgsIDB4MDEyNiwgMHgyMDkxLAorCTB4MjgwMCwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgyMDAxLCAweDAxNzAsIDB4MjAwYywgMHg4MDAwLAorCTB4MjAxNCwgMHhhMTg0LCAweDAwMDMsIDB4MDExMCwgMHgwODA0LCAweDFiMDQsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDAwZSwgMHgwMTJlLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweDAxMDAsIDB4MjAwNCwgMHhhMDgyLAorCTB4MDAwNSwgMHgwMDBlLCAweDAyNjgsIDB4MjAwMSwgMHgwMTcwLCAweDIwMGMsIDB4YTE4YywgMHgwMGZmLAorCTB4YTE4ZSwgMHgwMDRjLCAweDExMjgsIDB4MjAwYywgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHgwMDEwLAorCTB4MjAwOSwgMHgwMDAwLCAweDIwMDEsIDB4MDIwNCwgMHgyMDA0LCAweGExMDgsIDB4MDAwNSwgMHgwMDA2LAorCTB4MDE1NiwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHgyMGE5LCAweDAwMGEsIDB4Nzg1NCwgMHhkMDhjLAorCTB4MTExMCwgMHgxZjA0LCAweDI5MGUsIDB4MDBmZSwgMHgwMTVlLCAweDAwMGUsIDB4MDAwNSwgMHgwMDE2LAorCTB4MDBjNiwgMHgwMDA2LCAweDIwNjEsIDB4MDEwMCwgMHg2MDMwLCAweDAwMDYsIDB4NjA0OCwgMHgwMDA2LAorCTB4NjBlNCwgMHgwMDA2LCAweDYwZTgsIDB4MDAwNiwgMHg2MDUwLCAweDAwMDYsIDB4NjBmMCwgMHgwMDA2LAorCTB4NjBlYywgMHgwMDA2LCAweDYwMGMsIDB4MDAwNiwgMHg2MDA0LCAweDAwMDYsIDB4NjAyOCwgMHgwMDA2LAorCTB4NjBlMCwgMHgwMDA2LCAweDYwMmYsIDB4MDEwMCwgMHg2MDJmLCAweDAwMDAsIDB4ZTAwMCwgMHhlMDAwLAorCTB4ZTAwMCwgMHhlMDAwLCAweDYwMmYsIDB4MDA0MCwgMHg2MDJmLCAweDAwMDAsIDB4MDAwZSwgMHg2MGUyLAorCTB4MDAwZSwgMHg2MDJhLCAweDAwMGUsIDB4NjAwNiwgMHgwMDBlLCAweDYwMGUsIDB4MDAwZSwgMHg2MGVlLAorCTB4MDAwZSwgMHg2MGYyLCAweDAwMGUsIDB4NjA1MiwgMHgwMDBlLCAweDYwZWEsIDB4MDAwZSwgMHg2MGU2LAorCTB4MDAwZSwgMHg2MDRhLCAweDAwMGUsIDB4NjAzMiwgMHg2MDM2LCAweDIwMDgsIDB4MDgwYywgMHgyODQ3LAorCTB4MDAwZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwNSwgMHgyMDA5LCAweDAxNzEsIDB4MjEwNCwgMHhkMGRjLAorCTB4MDE0MCwgMHgyMDA5LCAweDAxNzAsIDB4MjEwNCwgMHgyMDBiLCAweDAwODAsIDB4ZTAwMCwgMHhlMDAwLAorCTB4MjAwYSwgMHgwMDA1LCAweDI5ZmEsIDB4MjlmZSwgMHgyYTAyLCAweDJhMDgsIDB4MmEwZSwgMHgyYTE0LAorCTB4MmExYSwgMHgyYTIyLCAweDJhMmEsIDB4MmEzMCwgMHgyYTM2LCAweDJhM2UsIDB4MmE0NiwgMHgyYTRlLAorCTB4MmE1NiwgMHgyYTYwLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLAorCTB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLAorCTB4MmFhZCwgMHgyYWFkLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLAorCTB4MmE2YSwgMHgyYTZhLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLAorCTB4MmE2YSwgMHgyYTZhLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLAorCTB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLAorCTB4MmFhZCwgMHgyYWFkLCAweDJhNmMsIDB4MmE2YywgMHgyYTcyLCAweDJhNzIsIDB4MmE3OSwgMHgyYTc5LAorCTB4MmE4MCwgMHgyYTgwLCAweDJhODksIDB4MmE4OSwgMHgyYTkwLCAweDJhOTAsIDB4MmE5OSwgMHgyYTk5LAorCTB4MmFhMiwgMHgyYWEyLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLAorCTB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLAorCTB4MmFhZCwgMHgyYWFkLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLAorCTB4MmE2YSwgMHgyYTZhLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLAorCTB4MmE2YSwgMHgyYTZhLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLAorCTB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLAorCTB4MmFhZCwgMHgyYWFkLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLAorCTB4MmE2YSwgMHgyYTZhLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLAorCTB4MmE2YSwgMHgyYTZhLCAweDAxMDYsIDB4MDAwNiwgMHgwODA0LCAweDJhYjUsIDB4MDEwNiwgMHgwMDA2LAorCTB4MDgwNCwgMHgyYWI1LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDI1MTksIDB4MDgwNCwgMHgyYWI1LAorCTB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjUxOSwgMHgwODA0LCAweDJhYjUsIDB4MDEwNiwgMHgwMDA2LAorCTB4MDgwYywgMHgyMzljLCAweDA4MDQsIDB4MmFiNSwgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyMzljLAorCTB4MDgwNCwgMHgyYWI1LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDI1MTksIDB4MDgwYywgMHgyMzljLAorCTB4MDgwNCwgMHgyYWI1LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDI1MTksIDB4MDgwYywgMHgyMzljLAorCTB4MDgwNCwgMHgyYWI1LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDIzZjIsIDB4MDgwNCwgMHgyYWI1LAorCTB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjNmMiwgMHgwODA0LCAweDJhYjUsIDB4MDEwNiwgMHgwMDA2LAorCTB4MDgwYywgMHgyNTE5LCAweDA4MGMsIDB4MjNmMiwgMHgwODA0LCAweDJhYjUsIDB4MDEwNiwgMHgwMDA2LAorCTB4MDgwYywgMHgyNTE5LCAweDA4MGMsIDB4MjNmMiwgMHgwODA0LCAweDJhYjUsIDB4MDEwNiwgMHgwMDA2LAorCTB4MDgwYywgMHgyMzljLCAweDA4MGMsIDB4MjNmMiwgMHgwODA0LCAweDJhYjUsIDB4MDEwNiwgMHgwMDA2LAorCTB4MDgwYywgMHgyMzljLCAweDA4MGMsIDB4MjNmMiwgMHgwODA0LCAweDJhYjUsIDB4MDEwNiwgMHgwMDA2LAorCTB4MDgwYywgMHgyNTE5LCAweDA4MGMsIDB4MjM5YywgMHgwODBjLCAweDIzZjIsIDB4MDgwNCwgMHgyYWI1LAorCTB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjUxOSwgMHgwODBjLCAweDIzOWMsIDB4MDgwYywgMHgyM2YyLAorCTB4MDgwNCwgMHgyYWI1LCAweGUwMDAsIDB4MGNmMCwgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyOGQ2LAorCTB4MDgwNCwgMHgyYWI1LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDI4ZDYsIDB4MDgwYywgMHgyNTE5LAorCTB4MDRlMCwgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyOGQ2LCAweDA4MGMsIDB4MjM5YywgMHgwNGE4LAorCTB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjhkNiwgMHgwODBjLCAweDI1MTksIDB4MDgwYywgMHgyMzljLAorCTB4MDQ2MCwgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyOGQ2LCAweDA4MGMsIDB4MjNmMiwgMHgwNDI4LAorCTB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjhkNiwgMHgwODBjLCAweDI1MTksIDB4MDgwYywgMHgyM2YyLAorCTB4MDBlMCwgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyOGQ2LCAweDA4MGMsIDB4MjM5YywgMHgwODBjLAorCTB4MjNmMiwgMHgwMDk4LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDI4ZDYsIDB4MDgwYywgMHgyNTE5LAorCTB4MDgwYywgMHgyMzljLCAweDA4MGMsIDB4MjNmMiwgMHgwMDQwLCAweDIwZDEsIDB4MDAwMCwgMHgyMGQxLAorCTB4MDAwMSwgMHgyMGQxLCAweDAwMDAsIDB4MDgwYywgMHgxNTE1LCAweDAwMGUsIDB4MDEwZSwgMHgwMDBkLAorCTB4MDBjNiwgMHgwMDI2LCAweDAwNDYsIDB4MjAyMSwgMHgwMDAwLCAweDA4MGMsIDB4NTMwOSwgMHgxOTA0LAorCTB4MmI5NSwgMHg3MmQ0LCAweDIwMDEsIDB4Yjc5ZSwgMHgyMDA0LCAweGEwMDUsIDB4MTExMCwgMHhkMjljLAorCTB4MDE0OCwgMHhkMjg0LCAweDExMzgsIDB4ZDJiYywgMHgxOTA0LCAweDJiOTUsIDB4MDgwYywgMHgyYjk5LAorCTB4MDgwNCwgMHgyYjk1LCAweGQyY2MsIDB4MTkwNCwgMHgyYjk1LCAweDA4MGMsIDB4NWFjZiwgMHgxMTIwLAorCTB4NzA5ZiwgMHhmZmZmLCAweDA4MDQsIDB4MmI5NSwgMHhkMjk0LCAweDAxMjAsIDB4NzA5ZiwgMHhmZmZmLAorCTB4MDgwNCwgMHgyYjk1LCAweDIwMDEsIDB4YjUxNSwgMHgyMDNjLCAweDcyODgsIDB4ZDI4NCwgMHgwOTA0LAorCTB4MmIzNywgMHhkMjhjLCAweDE5MDQsIDB4MmIzNywgMHgwMDM2LCAweDczOWMsIDB4YTM4ZSwgMHhmZmZmLAorCTB4MTExMCwgMHgyMDE5LCAweDAwMDEsIDB4ODMxNCwgMHhhMmUwLCAweGJjYzAsIDB4MmMwNCwgMHhhMzhjLAorCTB4MDAwMSwgMHgwMTIwLCAweGEwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDAwMTAsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTcwZSwgMHgwNTYwLCAweGEwOGUsIDB4MDAwMCwgMHgwNTQ4LCAweGEwOGUsIDB4MDBmZiwgMHgxMTUwLAorCTB4NzIzMCwgMHhkMjg0LCAweDE1MzgsIDB4NzI4OCwgMHhjMjhkLCAweDcyOGEsIDB4NzA5ZiwgMHhmZmZmLAorCTB4MDAzZSwgMHgwNDI4LCAweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweDI4MWQsIDB4MDgwYywgMHg0ZjRkLAorCTB4MTFiOCwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MTE1MCwgMHg3MDMwLAorCTB4ZDA4YywgMHgwMTE4LCAweDYwMDAsIDB4ZDBiYywgMHgwMTIwLCAweDA4MGMsIDB4MmJhYywgMHgwMTQwLAorCTB4MDAyOCwgMHgwODBjLCAweDJjZGQsIDB4MDgwYywgMHgyYmRhLCAweDAxMTAsIDB4ODMxOCwgMHgwODE4LAorCTB4NzM5ZSwgMHgwMDEwLCAweDcwOWYsIDB4ZmZmZiwgMHgwMDNlLCAweDA4MDQsIDB4MmI5NSwgMHhhNzgwLAorCTB4MmRjNCwgMHgyMDNkLCAweGE3YmMsIDB4ZmYwMCwgMHg4NzNmLCAweDIwNDEsIDB4MDA3ZSwgMHg3MDljLAorCTB4YTA5NiwgMHhmZmZmLCAweDExMjAsIDB4MjAwOSwgMHgwMDAwLCAweDI4YTgsIDB4MDA1MCwgMHhhODEyLAorCTB4MDIyMCwgMHgyMDA4LCAweGE4MDIsIDB4MjBhOCwgMHgwMDIwLCAweDcwOWYsIDB4ZmZmZiwgMHgwODA0LAorCTB4MmI5NSwgMHgyNzAwLCAweDAxNTYsIDB4MDAxNiwgMHhhMTA2LCAweDA1YTAsIDB4YzQ4NCwgMHgwODBjLAorCTB4NGZhOSwgMHgwMTIwLCAweDA4MGMsIDB4NGY0ZCwgMHgxNWE4LCAweDAwMDgsIDB4YzQ4NSwgMHg2MDA0LAorCTB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgxMTMwLCAweDcwMzAsIDB4ZDA4YywgMHgwMWU4LAorCTB4NjAwMCwgMHhkMGJjLCAweDExZDAsIDB4NzI4OCwgMHhkMjhjLCAweDAxODgsIDB4NjAwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDgyLCAweDAwMDYsIDB4MDJiMCwgMHhkNDg0LCAweDExMTgsIDB4MDgwYywgMHg0ZjZjLAorCTB4MDAyOCwgMHgwODBjLCAweDJkNmEsIDB4MDE3MCwgMHgwODBjLCAweDJkOTcsIDB4MDA1OCwgMHgwODBjLAorCTB4MmNkZCwgMHgwODBjLCAweDJiZGEsIDB4MDE3MCwgMHgwMDI4LCAweDA4MGMsIDB4MmQ2YSwgMHgwMTEwLAorCTB4MDQxOSwgMHgwMTQwLCAweDAwMWUsIDB4ODEwOCwgMHgwMTVlLCAweDFmMDQsIDB4MmI1MSwgMHg3MDlmLAorCTB4ZmZmZiwgMHgwMDE4LCAweDAwMWUsIDB4MDE1ZSwgMHg3MTllLCAweDAwNGUsIDB4MDAyZSwgMHgwMGNlLAorCTB4MDAwNSwgMHgwMGM2LCAweDAwMTYsIDB4NzA5ZiwgMHgwMDAxLCAweDIwMDksIDB4MDA3ZSwgMHgwODBjLAorCTB4NGY0ZCwgMHgxMTM4LCAweDA4MGMsIDB4MmNkZCwgMHgwNGE5LCAweDAxMTgsIDB4NzBkNCwgMHhjMGJkLAorCTB4NzBkNiwgMHgwMDFlLCAweDAwY2UsIDB4MDAwNSwgMHgwMDE2LCAweDAwNzYsIDB4MDBkNiwgMHgwMGM2LAorCTB4MmM2OCwgMHgyMDAxLCAweGI1NTcsIDB4MjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4Njg0MiwgMHgwODBjLAorCTB4OWVkNiwgMHgwMWQ4LCAweDJkMDAsIDB4NjAxYSwgMHgwODBjLCAweGEwMjcsIDB4NjAxZiwgMHgwMDAxLAorCTB4MjAwMSwgMHgwMDAwLCAweDA4MGMsIDB4NGVlYiwgMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHg0ZWZkLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzA5OCwgMHg4MDAwLCAweDcwOWEsIDB4MDEyZSwgMHgyMDA5LAorCTB4MDAwNCwgMHgwODBjLCAweDg2NGMsIDB4YTA4NSwgMHgwMDAxLCAweDAwY2UsIDB4MDBkZSwgMHgwMDdlLAorCTB4MDAxZSwgMHgwMDA1LCAweDAwMTYsIDB4MDA3NiwgMHgwMGQ2LCAweDAwYzYsIDB4MmM2OCwgMHgyMDAxLAorCTB4YjU1NywgMHgyMDA0LCAweGEwODQsIDB4MDBmZiwgMHg2ODQyLCAweDA4MGMsIDB4OWVkNiwgMHgwNTUwLAorCTB4MmQwMCwgMHg2MDFhLCAweDY4MDAsIDB4YzBjNCwgMHg2ODAyLCAweDY4YTAsIDB4YTA4NiwgMHgwMDdlLAorCTB4MDE0MCwgMHg2ODA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MTExMCwgMHgwODBjLAorCTB4MmM5YywgMHgwODBjLCAweGEwMjcsIDB4NjAxZiwgMHgwMDAxLCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLAorCTB4NGVlYiwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg0ZWZkLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NzA5OCwgMHg4MDAwLCAweDcwOWEsIDB4MDEyZSwgMHgyMDA5LCAweDAwMDIsIDB4MDgwYywgMHg4NjRjLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwY2UsIDB4MDBkZSwgMHgwMDdlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGM2LAorCTB4MDAyNiwgMHgyMDA5LCAweDAwODAsIDB4MDgwYywgMHg0ZjRkLCAweDExMjAsIDB4MDAzMSwgMHgwMTEwLAorCTB4NzBkYiwgMHhmZmZmLCAweDAwMmUsIDB4MDBjZSwgMHgwMDA1LCAweDAwMTYsIDB4MDA3NiwgMHgwMGQ2LAorCTB4MDBjNiwgMHgyYzY4LCAweDA4MGMsIDB4ODVjNywgMHgwMWU4LCAweDJkMDAsIDB4NjAxYSwgMHgwODBjLAorCTB4YTAyNywgMHg2MDFmLCAweDAwMDEsIDB4MjAwMSwgMHgwMDAwLCAweDA4MGMsIDB4NGVlYiwgMHgyMDAxLAorCTB4MDAwMiwgMHgwODBjLCAweDRlZmQsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHgyYzljLAorCTB4NzBkYywgMHg4MDAwLCAweDcwZGUsIDB4MDEyZSwgMHgyMDA5LCAweDAwMDIsIDB4MDgwYywgMHg4NjRjLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwY2UsIDB4MDBkZSwgMHgwMDdlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGM2LAorCTB4MDBkNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDA5LCAweDAwN2YsIDB4MDgwYywgMHg0ZjRkLAorCTB4MTE5MCwgMHgyYzY4LCAweDA4MGMsIDB4ODVjNywgMHgwMTcwLCAweDJkMDAsIDB4NjAxYSwgMHg2MzEyLAorCTB4NjAxZiwgMHgwMDAxLCAweDYyMGEsIDB4MDgwYywgMHhhMDI3LCAweDIwMDksIDB4MDAyMiwgMHgwODBjLAorCTB4ODY0YywgMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGU2LAorCTB4MDBjNiwgMHgwMDY2LCAweDAwMzYsIDB4MDAyNiwgMHgwODBjLCAweDZlMDEsIDB4MDgwYywgMHg2ZGE0LAorCTB4MDgwYywgMHg5MDZmLCAweDIxMzAsIDB4ODFmZiwgMHgwMTI4LCAweDIwYTksIDB4MDA3ZSwgMHgyMDA5LAorCTB4MDAwMCwgMHgwMDIwLCAweDIwYTksIDB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsIDB4MDAxNiwgMHgwODBjLAorCTB4NGZhOSwgMHgxMTIwLCAweDA4MGMsIDB4NTFhYSwgMHgwODBjLCAweDRjMGIsIDB4MDAxZSwgMHg4MTA4LAorCTB4MWYwNCwgMHgyYzg2LCAweDg2ZmYsIDB4MTExMCwgMHgwODBjLCAweDExZjAsIDB4MDAyZSwgMHgwMDNlLAorCTB4MDA2ZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwYzYsIDB4MDAzNiwgMHgwMDI2LAorCTB4MDAxNiwgMHg2MjE4LCAweDIyNzAsIDB4NzJhMCwgMHgwMDI2LCAweDIwMTksIDB4MDAyOSwgMHgwODBjLAorCTB4NmRmNSwgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweDZkMDIsIDB4MmMwOCwgMHgwODBjLAorCTB4YWU4MiwgMHgwMDdlLCAweDAwMWUsIDB4MmU2MCwgMHgwODBjLCAweDUxYWEsIDB4NjIxMCwgMHg2MzE0LAorCTB4MDgwYywgMHg0YzBiLCAweDYyMTIsIDB4NjMxNiwgMHgwMDFlLCAweDAwMmUsIDB4MDAzZSwgMHgwMGNlLAorCTB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MDAwNiwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LAorCTB4YTA4NiwgMHgwMDgwLCAweDAxNTAsIDB4MjA3MSwgMHhiNTAwLCAweDcwOTgsIDB4YTAwNSwgMHgwMTEwLAorCTB4ODAwMSwgMHg3MDlhLCAweDAwMGUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4YjUwMCwgMHg3MGRjLAorCTB4YTAwNSwgMHgwZGMwLCAweDgwMDEsIDB4NzBkZSwgMHgwY2E4LCAweDYwMDAsIDB4YzA4YywgMHg2MDAyLAorCTB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MDBjNiwgMHgwMDM2LCAweDAwMjYsIDB4MDAxNiwgMHgwMTU2LAorCTB4MjE3OCwgMHg4MWZmLCAweDExMTgsIDB4MjBhOSwgMHgwMDAxLCAweDAwOTgsIDB4MjAwMSwgMHhiNTUzLAorCTB4MjAwNCwgMHhkMGM0LCAweDAxNTAsIDB4ZDBhNCwgMHgwMTQwLCAweGEwMDYsIDB4MDA0NiwgMHgyMDIwLAorCTB4MjAwOSwgMHgwMDJkLCAweDA4MGMsIDB4YjBlOCwgMHgwMDRlLCAweDIwYTksIDB4MDBmZiwgMHgyMDExLAorCTB4MDAwMCwgMHgwMDI2LCAweGEyOGUsIDB4MDA3ZSwgMHgwOTA0LCAweDJkNDksIDB4YTI4ZSwgMHgwMDdmLAorCTB4MDkwNCwgMHgyZDQ5LCAweGEyOGUsIDB4MDA4MCwgMHgwNWUwLCAweGEyODgsIDB4YjYzNSwgMHgyMTBjLAorCTB4ODFmZiwgMHgwNWI4LCAweDhmZmYsIDB4MTE0OCwgMHgyMDAxLCAweGI3YmUsIDB4MDAwNiwgMHgyMDAzLAorCTB4MDAwMSwgMHgwNGQ5LCAweDAwMGUsIDB4MjAwMywgMHgwMDAwLCAweDAwYzYsIDB4MjE2MCwgMHgyMDAxLAorCTB4MDAwMSwgMHgwODBjLCAweDUzMTMsIDB4MDBjZSwgMHgyMDE5LCAweDAwMjksIDB4MDgwYywgMHg2ZGY1LAorCTB4MDA3NiwgMHgyMDM5LCAweDAwMDAsIDB4MDgwYywgMHg2ZDAyLCAweDAwYzYsIDB4MDAyNiwgMHgyMTYwLAorCTB4NjIwNCwgMHhhMjk0LCAweDAwZmYsIDB4YTI4NiwgMHgwMDA2LCAweDExMTgsIDB4NjAwNywgMHgwNDA0LAorCTB4MDAyOCwgMHgyMDAxLCAweDAwMDQsIDB4ODAwNywgMHhhMjE1LCAweDYyMDYsIDB4MDAyZSwgMHgwMGNlLAorCTB4MDAxNiwgMHgyYzA4LCAweDA4MGMsIDB4YWU4MiwgMHgwMDFlLCAweDAwN2UsIDB4MjE2MCwgMHgwODBjLAorCTB4NTFhYSwgMHgwMDJlLCAweDgyMTAsIDB4MWYwNCwgMHgyZDAxLCAweDAxNWUsIDB4MDAxZSwgMHgwMDJlLAorCTB4MDAzZSwgMHgwMGNlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDAwNDYsIDB4MDAyNiwgMHgwMDE2LAorCTB4MjAwMSwgMHhiNTUzLCAweDIwMDQsIDB4ZDBjNCwgMHgwMTQ4LCAweGQwYTQsIDB4MDEzOCwgMHhhMDA2LAorCTB4MjIyMCwgMHg4NDI3LCAweDIwMDksIDB4MDAyOSwgMHgwODBjLCAweGIwZTgsIDB4MDAxZSwgMHgwMDJlLAorCTB4MDA0ZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4NzI4OCwgMHg4MmZmLAorCTB4MDFmOCwgMHgyMDExLCAweGI1NTMsIDB4MjIxNCwgMHhkMmFjLCAweDExZDAsIDB4MjEwMCwgMHgwODBjLAorCTB4MjgzMSwgMHg4MWZmLCAweDAxYjgsIDB4MjAxOSwgMHgwMDAxLCAweDgzMTQsIDB4YTJlMCwgMHhiY2MwLAorCTB4MmMwNCwgMHhkMzg0LCAweDAxMjAsIDB4YTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4MDAxMCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMTE2LCAweDAxMzgsIDB4YTA5NiwgMHgwMGZmLCAweDAxMTAsIDB4ODMxOCwgMHgwYzY4LAorCTB4YTA4NSwgMHgwMDAxLCAweDAwY2UsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMDE2LAorCTB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgyMTEwLAorCTB4MDAyNiwgMHgyMDE5LCAweDAwMjksIDB4MDgwYywgMHg4Mjk5LCAweDAwMmUsIDB4MDgwYywgMHhiMzhkLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4YTE4MCwgMHhiNjM1LCAweDIwMDQsIDB4YTA2NSwgMHgwMTU4LAorCTB4MDAxNiwgMHgwMGM2LCAweDIwNjEsIDB4YjhmNCwgMHgwMDFlLCAweDYxMWEsIDB4MDgwYywgMHgyYzljLAorCTB4MDAxZSwgMHgwODBjLCAweDRmNmMsIDB4MDEyZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwNSwgMHgyMDAxLAorCTB4YjUzNSwgMHgyMDA0LCAweGQwY2MsIDB4MDAwNSwgMHg3ZWVmLCAweDdkZTgsIDB4N2NlNCwgMHg4MGUyLAorCTB4N2JlMSwgMHg4MGUwLCAweDgwZGMsIDB4ODBkYSwgMHg3YWQ5LCAweDgwZDYsIDB4ODBkNSwgMHg4MGQ0LAorCTB4ODBkMywgMHg4MGQyLCAweDgwZDEsIDB4NzljZSwgMHg3OGNkLCAweDgwY2MsIDB4ODBjYiwgMHg4MGNhLAorCTB4ODBjOSwgMHg4MGM3LCAweDgwYzYsIDB4NzdjNSwgMHg3NmMzLCAweDgwYmMsIDB4ODBiYSwgMHg3NWI5LAorCTB4ODBiNiwgMHg3NGI1LCAweDczYjQsIDB4NzJiMywgMHg4MGIyLCAweDgwYjEsIDB4ODBhZSwgMHg3MWFkLAorCTB4ODBhYywgMHg3MGFiLCAweDZmYWEsIDB4NmVhOSwgMHg4MGE3LCAweDZkYTYsIDB4NmNhNSwgMHg2YmEzLAorCTB4NmE5ZiwgMHg2OTllLCAweDY4OWQsIDB4ODA5YiwgMHg4MDk4LCAweDY3OTcsIDB4NjY5MCwgMHg2NThmLAorCTB4NjQ4OCwgMHg2Mzg0LCAweDYyODIsIDB4ODA4MSwgMHg4MDgwLCAweDYxN2MsIDB4NjA3YSwgMHg4MDc5LAorCTB4NWY3NiwgMHg4MDc1LCAweDgwNzQsIDB4ODA3MywgMHg4MDcyLCAweDgwNzEsIDB4ODA2ZSwgMHg1ZTZkLAorCTB4ODA2YywgMHg1ZDZiLCAweDVjNmEsIDB4NWI2OSwgMHg4MDY3LCAweDVhNjYsIDB4NTk2NSwgMHg1ODYzLAorCTB4NTc1YywgMHg1NjVhLCAweDU1NTksIDB4ODA1NiwgMHg4MDU1LCAweDU0NTQsIDB4NTM1MywgMHg1MjUyLAorCTB4NTE1MSwgMHg1MDRlLCAweDRmNGQsIDB4ODA0YywgMHg4MDRiLCAweDRlNGEsIDB4NGQ0OSwgMHg4MDQ3LAorCTB4NGM0NiwgMHg4MDQ1LCAweDgwNDMsIDB4ODAzYywgMHg4MDNhLCAweDgwMzksIDB4ODAzNiwgMHg0YjM1LAorCTB4ODAzNCwgMHg0YTMzLCAweDQ5MzIsIDB4NDgzMSwgMHg4MDJlLCAweDQ3MmQsIDB4NDYyYywgMHg0NTJiLAorCTB4NDQyYSwgMHg0MzI5LCAweDQyMjcsIDB4ODAyNiwgMHg4MDI1LCAweDQxMjMsIDB4NDAxZiwgMHgzZjFlLAorCTB4M2UxZCwgMHgzZDFiLCAweDNjMTgsIDB4ODAxNywgMHg4MDEwLCAweDNiMGYsIDB4M2EwOCwgMHg4MDA0LAorCTB4MzkwMiwgMHg4MDAxLCAweDgwMDAsIDB4ODAwMCwgMHgzODAwLCAweDM3MDAsIDB4MzYwMCwgMHg4MDAwLAorCTB4MzUwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgzNDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MzMwMCwgMHgzMjAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MzEwMCwgMHgzMDAwLCAweDgwMDAsIDB4ODAwMCwgMHgyZjAwLAorCTB4ODAwMCwgMHgyZTAwLCAweDJkMDAsIDB4MmMwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgyYjAwLAorCTB4ODAwMCwgMHgyYTAwLCAweDI5MDAsIDB4MjgwMCwgMHg4MDAwLCAweDI3MDAsIDB4MjYwMCwgMHgyNTAwLAorCTB4MjQwMCwgMHgyMzAwLCAweDIyMDAsIDB4ODAwMCwgMHg4MDAwLCAweDIxMDAsIDB4MjAwMCwgMHgxZjAwLAorCTB4MWUwMCwgMHgxZDAwLCAweDFjMDAsIDB4ODAwMCwgMHg4MDAwLCAweDFiMDAsIDB4MWEwMCwgMHg4MDAwLAorCTB4MTkwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgxODAwLAorCTB4ODAwMCwgMHgxNzAwLCAweDE2MDAsIDB4MTUwMCwgMHg4MDAwLCAweDE0MDAsIDB4MTMwMCwgMHgxMjAwLAorCTB4MTEwMCwgMHgxMDAwLCAweDBmMDAsIDB4ODAwMCwgMHg4MDAwLCAweDBlMDAsIDB4MGQwMCwgMHgwYzAwLAorCTB4MGIwMCwgMHgwYTAwLCAweDA5MDAsIDB4ODAwMCwgMHg4MDAwLCAweDA4MDAsIDB4MDcwMCwgMHg4MDAwLAorCTB4MDYwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgwNTAwLCAweDA0MDAsIDB4MDMwMCwgMHg4MDAwLAorCTB4MDIwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgwMTAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MDAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgyMDcxLCAweGI1ODIsIDB4NzAwMywgMHgwMDAyLAorCTB4YTAwNiwgMHg3MDEyLCAweDcwMTYsIDB4NzAzYSwgMHg3MDNlLCAweDcwMzMsIDB4YjU5MiwgMHg3MDM3LAorCTB4YjU5MiwgMHg3MDA3LCAweDAwMDEsIDB4MjA2MSwgMHhiNWQyLCAweDYwMDMsIDB4MDAwMiwgMHgwMDA1LAorCTB4MTAwNCwgMHgyZWVhLCAweDBlMDQsIDB4MmVlYSwgMHgyMDcxLCAweGI1ODIsIDB4MmI3OCwgMHg3ODE4LAorCTB4ZDA4NCwgMHgxMTQwLCAweDJhNjAsIDB4NzgyMCwgMHhhMDhlLCAweDAwNjksIDB4MTkwNCwgMHgyZmNmLAorCTB4MDgwNCwgMHgyZjY4LCAweDAwMDUsIDB4MjA3MSwgMHhiNTgyLCAweDcwMDQsIDB4MDAwMiwgMHgyZWYzLAorCTB4MmVmNCwgMHgyZWZkLCAweDJmMGUsIDB4MDAwNSwgMHgxMDA0LCAweDJlZmMsIDB4MGUwNCwgMHgyZWZjLAorCTB4MmI3OCwgMHg3ODE4LCAweGQwODQsIDB4MDFlOCwgMHgwMDA1LCAweDJiNzgsIDB4MjA2MSwgMHhiNWQyLAorCTB4NjAwOCwgMHhhMDhlLCAweDAxMDAsIDB4MDEyOCwgMHhhMDg2LCAweDAyMDAsIDB4MDkwNCwgMHgyZmM5LAorCTB4MDAwNSwgMHg3MDE0LCAweDIwNjgsIDB4MmE2MCwgMHg3MDE4LCAweDA4MDcsIDB4NzAxMCwgMHgyMDY4LAorCTB4NjgzNCwgMHhhMDg2LCAweDAxMDMsIDB4MDEwOCwgMHgwMDA1LCAweDJhNjAsIDB4MmI3OCwgMHg3MDE4LAorCTB4MDgwNywgMHgyYTYwLCAweDc4MjAsIDB4YTA4YSwgMHgwMDQwLCAweDEyMTAsIDB4NjFjNCwgMHgwMDQyLAorCTB4MjEwMCwgMHhhMDhhLCAweDAwM2YsIDB4MWEwNCwgMHgyZmM2LCAweDYxYzQsIDB4MDgwNCwgMHgyZjY4LAorCTB4MmZhYSwgMHgyZmQ1LCAweDJmZGQsIDB4MmZlMSwgMHgyZmU5LCAweDJmZWYsIDB4MmZmMywgMHgyZmZmLAorCTB4MzAwMiwgMHgzMDBjLCAweDMwMGYsIDB4MmZjNiwgMHgyZmM2LCAweDJmYzYsIDB4MzAxMiwgMHgyZmM2LAorCTB4MzAyMSwgMHgzMDM4LCAweDMwNGYsIDB4MzBjOSwgMHgzMGNlLCAweDMwZjcsIDB4MzE0OCwgMHgzMTU5LAorCTB4MzE3OCwgMHgzMWIwLCAweDMxYmEsIDB4MzFjNywgMHgzMWRhLCAweDMxZmIsIDB4MzIwNCwgMHgzMjNhLAorCTB4MzI0MCwgMHgyZmM2LCAweDMyNjksIDB4MmZjNiwgMHgyZmM2LCAweDJmYzYsIDB4MmZjNiwgMHgyZmM2LAorCTB4MzI3MCwgMHgzMjdhLCAweDJmYzYsIDB4MmZjNiwgMHgyZmM2LCAweDJmYzYsIDB4MmZjNiwgMHgyZmM2LAorCTB4MmZjNiwgMHgyZmM2LCAweDMyODIsIDB4MmZjNiwgMHgyZmM2LCAweDJmYzYsIDB4MmZjNiwgMHgyZmM2LAorCTB4MzI5NCwgMHgzMjllLCAweDJmYzYsIDB4MmZjNiwgMHgyZmM2LCAweDJmYzYsIDB4MmZjNiwgMHgyZmM2LAorCTB4MDAwMiwgMHgzMmM4LCAweDMzMWMsIDB4MzM3NywgMHgzMzkxLCAweDJmYzYsIDB4MzNjMiwgMHgzN2Y1LAorCTB4NDIzMywgMHgyZmM2LCAweDJmYzYsIDB4MmZjNiwgMHgyZmM2LCAweDJmYzYsIDB4MmZjNiwgMHgyZmM2LAorCTB4MmZjNiwgMHgzMDBjLCAweDMwMGYsIDB4MzdmNywgMHgyZmM2LCAweDM4MDQsIDB4NDJjYywgMHg0MzI3LAorCTB4NDM4YiwgMHgyZmM2LCAweDQzZWUsIDB4NDQxOCwgMHg0NDM3LCAweDQ0NjksIDB4MmZjNiwgMHgyZmM2LAorCTB4MmZjNiwgMHgzODA4LCAweDM5YWQsIDB4MzljNywgMHgzOWU1LCAweDNhNDYsIDB4M2FhNiwgMHgzYWIxLAorCTB4M2FlOSwgMHgzYWY4LCAweDNiMDcsIDB4M2IwYSwgMHgzYjJkLCAweDNiNzksIDB4M2JlZiwgMHgzYmZjLAorCTB4M2NmZCwgMHgzZTIzLCAweDNlNGMsIDB4M2Y0YSwgMHgzZjZjLCAweDNmNzgsIDB4M2ZiMSwgMHg0MDc1LAorCTB4MmZjNiwgMHgyZmM2LCAweDJmYzYsIDB4MmZjNiwgMHg0MGRkLCAweDQwZjgsIDB4NDE2YSwgMHg0MjFjLAorCTB4NzEzYywgMHgwMDAwLCAweDIwMjEsIDB4NDAwMCwgMHgwODBjLCAweDNlYTksIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwZTA0LCAweDJmYjYsIDB4NzgxOCwgMHhkMDg0LCAweDAxMTAsIDB4MDEyZSwgMHgwY2IwLAorCTB4N2MyMiwgMHg3OTI2LCAweDdhMmEsIDB4N2IyZSwgMHg3ODFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLAorCTB4NzAwNywgMHgwMDAxLCAweDIwOTEsIDB4NTAwMCwgMHgwMTJlLCAweDAwMDUsIDB4MjAyMSwgMHg0MDAxLAorCTB4MGMxOCwgMHgyMDIxLCAweDQwMDIsIDB4MGMwMCwgMHgyMDIxLCAweDQwMDMsIDB4MDhlOCwgMHgyMDIxLAorCTB4NDAwNSwgMHgwOGQwLCAweDIwMjEsIDB4NDAwNiwgMHgwOGI4LCAweGEwMmUsIDB4MjUyMCwgMHg3YjI4LAorCTB4N2EyYywgMHg3ODI0LCAweDc5MzAsIDB4MDgwNCwgMHgzZWI2LCAweDc4MjMsIDB4MDAwNCwgMHg3ODI0LAorCTB4MDgwNywgMHhhMDJlLCAweDI1MjAsIDB4N2IyOCwgMHg3YTJjLCAweDc4MjQsIDB4NzkzMCwgMHgwODA0LAorCTB4M2ViOSwgMHg3OTI0LCAweDc4MjgsIDB4MjExNCwgMHgyMDBhLCAweDA4MDQsIDB4MmZhYSwgMHg3OTI0LAorCTB4MjExNCwgMHgwODA0LCAweDJmYWEsIDB4MjA5OSwgMHgwMDA5LCAweDIwYTEsIDB4MDAwOSwgMHgyMGE5LAorCTB4MDAwNywgMHg1M2EzLCAweDc5MjQsIDB4N2EyOCwgMHg3YjJjLCAweDA4MDQsIDB4MmZhYSwgMHg3ODI0LAorCTB4MjA2MCwgMHgwMDkwLCAweDIwMDksIDB4MDAwMiwgMHgyMDExLCAweDAwMDIsIDB4MjAxOSwgMHgwMDA2LAorCTB4NzgzYiwgMHgwMDE3LCAweDA4MDQsIDB4MmZhYSwgMHg3ZDM4LCAweDdjM2MsIDB4MDg0MCwgMHg3ZDM4LAorCTB4N2MzYywgMHgwODg4LCAweDIwNjEsIDB4MTAwMCwgMHhlMTBjLCAweGEwMDYsIDB4MmMxNSwgMHhhMjAwLAorCTB4OGM2MCwgMHg4MTA5LCAweDFkZDgsIDB4MjAxMCwgMHhhMDA1LCAweDA5MDQsIDB4MmZhYSwgMHgwODA0LAorCTB4MmZjYywgMHgyMDY5LCAweGI1NTIsIDB4NzgyNCwgMHg3OTMwLCAweGExMWEsIDB4MWEwNCwgMHgyZmQyLAorCTB4ODAxOSwgMHgwOTA0LCAweDJmZDIsIDB4Njg0YSwgMHg2OTQyLCAweDc4MmMsIDB4Njg1MiwgMHg3ODI4LAorCTB4Njg1NiwgMHhhMDA2LCAweDY4NWEsIDB4Njg1ZSwgMHgwODBjLCAweDVkYTUsIDB4MDgwNCwgMHgyZmFhLAorCTB4MjA2OSwgMHhiNTUyLCAweDc4MjQsIDB4NzkzNCwgMHhhMTFhLCAweDFhMDQsIDB4MmZkMiwgMHg4MDE5LAorCTB4MDkwNCwgMHgyZmQyLCAweDY4NGUsIDB4Njk0NiwgMHg3ODJjLCAweDY4NjIsIDB4NzgyOCwgMHg2ODY2LAorCTB4YTAwNiwgMHg2ODZhLCAweDY4NmUsIDB4MDgwYywgMHg1M2Q1LCAweDA4MDQsIDB4MmZhYSwgMHhhMDJlLAorCTB4MjUyMCwgMHg4MWZmLCAweDE5MDQsIDB4MmZjZiwgMHg3OTI0LCAweDdiMjgsIDB4N2EyYywgMHgyMGE5LAorCTB4MDAwNSwgMHgyMGExLCAweGI1ODksIDB4NDFhMSwgMHgwODBjLCAweDNlNzUsIDB4MDkwNCwgMHgyZmNmLAorCTB4MjAwOSwgMHgwMDIwLCAweDA4MGMsIDB4M2ViNiwgMHg3MDFiLCAweDMwNjcsIDB4MDAwNSwgMHg2ODM0LAorCTB4MjAwOCwgMHhhMDg0LCAweDAwZmYsIDB4YTA5NiwgMHgwMDExLCAweDAxMzgsIDB4YTA5NiwgMHgwMDE5LAorCTB4MDEyMCwgMHhhMDk2LCAweDAwMTUsIDB4MTkwNCwgMHgyZmNmLCAweDgxMGYsIDB4YTE4YywgMHgwMGZmLAorCTB4MDkwNCwgMHgyZmNmLCAweDcxMGUsIDB4NzAwYywgMHg4MDAxLCAweDA1MjgsIDB4NzAwZSwgMHgwODBjLAorCTB4M2U3NSwgMHgwOTA0LCAweDJmY2YsIDB4MjAwOSwgMHgwMDIwLCAweDIwNjEsIDB4YjVkMiwgMHg2MjI0LAorCTB4NjMyOCwgMHg2NDJjLCAweDY1MzAsIDB4YTI5MCwgMHgwMDQwLCAweGEzOTksIDB4MDAwMCwgMHhhNGExLAorCTB4MDAwMCwgMHhhNWE5LCAweDAwMDAsIDB4MDgwYywgMHgzZWI2LCAweDcwMWIsIDB4MzA5OCwgMHgwMDA1LAorCTB4NjgzNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA5NiwgMHgwMDAyLCAweDAxMjAsIDB4YTA5NiwgMHgwMDBhLAorCTB4MTkwNCwgMHgyZmNmLCAweDA4YzAsIDB4NzAxMCwgMHgyMDY4LCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLAorCTB4MDgwYywgMHg0ZTQ5LCAweDExMjgsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsIDB4MzBiMiwgMHgwMDA1LAorCTB4MDgwYywgMHg1NGRiLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwYTksIDB4MDAwNSwgMHgyMDk5LAorCTB4YjU4OSwgMHg1MzBhLCAweDIxMDAsIDB4YTIxMCwgMHhhMzk5LCAweDAwMDAsIDB4YTRhMSwgMHgwMDAwLAorCTB4YTVhOSwgMHgwMDAwLCAweGFkODAsIDB4MDAwZCwgMHgyMDA5LCAweDAwMjAsIDB4MDEyZSwgMHgwODA0LAorCTB4M2ViOSwgMHg2MWFjLCAweDc4MjQsIDB4NjBhZSwgMHgwODA0LCAweDJmYWEsIDB4MjA5MSwgMHg4MDAwLAorCTB4NzgyMywgMHg0MDAwLCAweDc4MjcsIDB4NDk1MywgMHg3ODJiLCAweDUwMjAsIDB4NzgyZiwgMHgyMDIwLAorCTB4MjAwOSwgMHgwMTdmLCAweDIxMDQsIDB4NzgzMiwgMHgzZjAwLCAweDc4MzYsIDB4MjA2MSwgMHgwMTAwLAorCTB4NjIwMCwgMHgyMDYxLCAweDAyMDAsIDB4NjAzYywgMHg4MDA3LCAweGEyMDUsIDB4NzgzYSwgMHgyMDA5LAorCTB4MDRmZCwgMHgyMTA0LCAweDc4M2UsIDB4NzgxYiwgMHgwMDAxLCAweDIwOTEsIDB4NTAwMCwgMHgyMDkxLAorCTB4NDA4MCwgMHgyMDcxLCAweDAwMTAsIDB4MjBjMSwgMHgwMGYwLCAweDA4MDQsIDB4MDQyNywgMHg4MWZmLAorCTB4MTkwNCwgMHgyZmNmLCAweDc5MjQsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4MDgwYywgMHg0ZmE5LAorCTB4MTkwNCwgMHgyZmQyLCAweDdlMzgsIDB4YTY4NCwgMHgzZmZmLCAweGEwODIsIDB4NDAwMCwgMHgwMjEwLAorCTB4MDgwNCwgMHgyZmQyLCAweDdjMjgsIDB4N2QyYywgMHgwODBjLCAweDUxNzEsIDB4ZDI4YywgMHgxMTE4LAorCTB4MDgwYywgMHg1MTFhLCAweDAwMTAsIDB4MDgwYywgMHg1MTRhLCAweDE1MTgsIDB4MjA2MSwgMHhiZDAwLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDE0OCwgMHg2MDEwLAorCTB4YTA2ZCwgMHgwMTMwLCAweDY4M2MsIDB4YTQwNiwgMHgxMTE4LCAweDY4NDAsIDB4YTUwNiwgMHgwMTUwLAorCTB4MDEyZSwgMHhhY2UwLCAweDAwMTgsIDB4MjAwMSwgMHhiNTE3LCAweDIwMDQsIDB4YWMwMiwgMHgxYTA0LAorCTB4MmZjZiwgMHgwYzMwLCAweDA4MGMsIDB4OTkyYSwgMHgwMTJlLCAweDA5MDQsIDB4MmZjZiwgMHgwODA0LAorCTB4MmZhYSwgMHhhMDBlLCAweDIwMDEsIDB4MDAwNSwgMHgwODBjLCAweDU0ZGIsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDllZDIsIDB4MDgwYywgMHg1NDA4LCAweDAxMmUsIDB4MDgwNCwgMHgyZmFhLAorCTB4ODFmZiwgMHgxOTA0LCAweDJmY2YsIDB4MDgwYywgMHgzZThhLCAweDA5MDQsIDB4MmZkMiwgMHgwODBjLAorCTB4NTA2ZiwgMHgwOTA0LCAweDJmY2YsIDB4MDgwYywgMHg1MTdkLCAweDA5MDQsIDB4MmZjZiwgMHgwODA0LAorCTB4MmZhYSwgMHg4MWZmLCAweDE5MDQsIDB4MmZjZiwgMHgwODBjLCAweDNlOWEsIDB4MDkwNCwgMHgyZmQyLAorCTB4MDgwYywgMHg1MWU5LCAweDA5MDQsIDB4MmZjZiwgMHgyMDE5LCAweDAwMDUsIDB4NzkyNCwgMHgwODBjLAorCTB4NTE5OCwgMHgwOTA0LCAweDJmY2YsIDB4NzgyOCwgMHhhMDhhLCAweDEwMDAsIDB4MWEwNCwgMHgyZmQyLAorCTB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4YTEwOCwgMHgwODBjLCAweDY5YTgsIDB4MDgwNCwgMHgyZmFhLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4ODFmZiwgMHgwMTE4LCAweDIwMDksIDB4MDAwMSwgMHgwNDUwLAorCTB4MjAyOSwgMHgwMGZmLCAweDY0NTAsIDB4MjQwMCwgMHhhNTA2LCAweDAxZjgsIDB4MjUwOCwgMHgwODBjLAorCTB4NGZhOSwgMHgxMWQ4LCAweDA4MGMsIDB4NTFlOSwgMHgxMTI4LCAweDIwMDksIDB4MDAwMiwgMHg2MmI0LAorCTB4MjUxOCwgMHgwMGMwLCAweDIwMTksIDB4MDAwNCwgMHhhMDBlLCAweDA4MGMsIDB4NTE5OCwgMHgxMTE4LAorCTB4MjAwOSwgMHgwMDA2LCAweDAwNzgsIDB4NzgyNCwgMHhhMDhhLCAweDEwMDAsIDB4MTI3MCwgMHg4MDAzLAorCTB4ODAwYiwgMHg4MTBiLCAweGExMDgsIDB4MDgwYywgMHg2OWE4LCAweDg1MjksIDB4MWFlMCwgMHgwMTJlLAorCTB4MDgwNCwgMHgyZmFhLCAweDAxMmUsIDB4MDgwNCwgMHgyZmNmLCAweDAxMmUsIDB4MDgwNCwgMHgyZmQyLAorCTB4MDgwYywgMHgzZThhLCAweDA5MDQsIDB4MmZkMiwgMHgwODBjLCAweDUwZDUsIDB4MDgwYywgMHg1MTcxLAorCTB4MDgwNCwgMHgyZmFhLCAweDgxZmYsIDB4MTkwNCwgMHgyZmNmLCAweDA4MGMsIDB4M2U4YSwgMHgwOTA0LAorCTB4MmZkMiwgMHgwODBjLCAweDUwYzYsIDB4MDgwYywgMHg1MTcxLCAweDA4MDQsIDB4MmZhYSwgMHg4MWZmLAorCTB4MTkwNCwgMHgyZmNmLCAweDA4MGMsIDB4M2U4YSwgMHgwOTA0LCAweDJmZDIsIDB4MDgwYywgMHg1MTRjLAorCTB4MDkwNCwgMHgyZmNmLCAweDA4MGMsIDB4NGU4ZCwgMHgwODBjLCAweDUxMTMsIDB4MDgwYywgMHg1MTcxLAorCTB4MDgwNCwgMHgyZmFhLCAweDA4MGMsIDB4M2U4YSwgMHgwOTA0LCAweDJmZDIsIDB4MDgwYywgMHg1MDZmLAorCTB4MDkwNCwgMHgyZmNmLCAweDYyYTAsIDB4MjAxOSwgMHgwMDA1LCAweDAwYzYsIDB4MDgwYywgMHg1MWFhLAorCTB4MjA2MSwgMHgwMDAwLCAweDA4MGMsIDB4NmRmNSwgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgwODBjLAorCTB4NmQwMiwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHhhZTgyLCAweDAwN2UsIDB4MDBjZSwgMHgwODBjLAorCTB4NTE3MSwgMHgwODA0LCAweDJmYWEsIDB4MDgwYywgMHgzZThhLCAweDA5MDQsIDB4MmZkMiwgMHgwODBjLAorCTB4NTE3MSwgMHgyMjA4LCAweDA4MDQsIDB4MmZhYSwgMHgwMTU2LCAweDAwZDYsIDB4MDBlNiwgMHgyMDY5LAorCTB4YjYxNCwgMHg2ODEwLCAweDY5MTQsIDB4YTEwYSwgMHgxMjEwLCAweDIwMDksIDB4MDAwMCwgMHg2ODE2LAorCTB4MjAxMSwgMHgwMDAwLCAweDIwMTksIDB4MDAwMCwgMHgyMGE5LCAweDAwN2UsIDB4MjA2OSwgMHhiNjM1LAorCTB4MmQwNCwgMHhhMDc1LCAweDAxMzAsIDB4NzA0YywgMHgwMDcxLCAweGEyMTAsIDB4NzA4MCwgMHgwMDU5LAorCTB4YTMxOCwgMHg4ZDY4LCAweDFmMDQsIDB4MzIxOCwgMHgyMzAwLCAweGEyMTgsIDB4MDBlZSwgMHgwMGRlLAorCTB4MDE1ZSwgMHgwODA0LCAweDJmYWEsIDB4MDBmNiwgMHgwMDE2LCAweGEwN2QsIDB4MDE0MCwgMHgyMDAxLAorCTB4MDAwMCwgMHg4MDAwLCAweDJmMGMsIDB4ODFmZiwgMHgwMTEwLCAweDIxNzgsIDB4MGNkMCwgMHgwMDFlLAorCTB4MDBmZSwgMHgwMDA1LCAweDIwNjksIDB4YjYxNCwgMHg2OTEwLCAweDYyYjAsIDB4MDgwNCwgMHgyZmFhLAorCTB4ODFmZiwgMHgxOTA0LCAweDJmY2YsIDB4NjE1MCwgMHhhMTkwLCAweDJkYzQsIDB4MjIxNSwgMHhhMjk0LAorCTB4MDBmZiwgMHg2MzcwLCAweDgzZmYsIDB4MDEwOCwgMHg2Mjc0LCAweDY3ZDQsIDB4ZDc5YywgMHgwMTE4LAorCTB4MjAzMSwgMHgwMDAxLCAweDAwOTAsIDB4ZDdhYywgMHgwMTE4LCAweDIwMzEsIDB4MDAwMywgMHgwMDY4LAorCTB4ZDdhNCwgMHgwMTE4LCAweDIwMzEsIDB4MDAwMiwgMHgwMDQwLCAweDA4MGMsIDB4NWFjZiwgMHgxMTE4LAorCTB4MjAzMSwgMHgwMDA0LCAweDAwMTAsIDB4MjAzMSwgMHgwMDAwLCAweDdlM2EsIDB4N2YzZSwgMHgwODA0LAorCTB4MmZhYSwgMHg2MTQwLCAweDYyNDQsIDB4MjAxOSwgMHhiN2I2LCAweDIzMWMsIDB4MDgwNCwgMHgyZmFhLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjEzNCwgMHhhMDA2LCAweDIwMTAsIDB4NjMzOCwgMHgwMTJlLAorCTB4MDgwNCwgMHgyZmFhLCAweDA4MGMsIDB4M2U5YSwgMHgwOTA0LCAweDJmZDIsIDB4NjI0NCwgMHg2MzM4LAorCTB4MDgwNCwgMHgyZmFhLCAweDYxNDAsIDB4NjI0NCwgMHg3ODI0LCAweDYwNDIsIDB4N2IyOCwgMHg2MzQ2LAorCTB4MjA2OSwgMHhiNTUyLCAweDgzMWYsIDB4YTMwNSwgMHg2ODE2LCAweDc4MmMsIDB4MjA2OSwgMHhiN2I2LAorCTB4MmQxYywgMHgyMDZhLCAweDA4MDQsIDB4MmZhYSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3ODI0LAorCTB4NjAzNiwgMHg3ODJjLCAweDYwM2EsIDB4MDEyZSwgMHgwODA0LCAweDJmYWEsIDB4NzgzOCwgMHhhMDA1LAorCTB4MDFhOCwgMHg3ODI4LCAweGEwMjUsIDB4MDkwNCwgMHgyZmQyLCAweDc4MmMsIDB4YTAyZCwgMHgwOTA0LAorCTB4MmZkMiwgMHhhMDBlLCAweDA4MGMsIDB4NGZhOSwgMHgxMTIwLCAweDYyNDQsIDB4NjMzOCwgMHg2NDQ2LAorCTB4NjUzYSwgMHhhMTg2LCAweDAwZmYsIDB4MDE5MCwgMHg4MTA4LCAweDBjYTAsIDB4MDgwYywgMHgzZTlhLAorCTB4MDkwNCwgMHgyZmQyLCAweDc4MjgsIDB4YTAwZCwgMHgwOTA0LCAweDJmZDIsIDB4NzgyYywgMHhhMDA1LAorCTB4MDkwNCwgMHgyZmQyLCAweDYyNDQsIDB4NjE0NiwgMHg2MzM4LCAweDYwM2EsIDB4MDgwNCwgMHgyZmFhLAorCTB4MjAwMSwgMHhiNTAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLCAweDE5MDQsIDB4MmZjZiwgMHgwMGM2LAorCTB4MjA2MSwgMHgwMTAwLCAweDc5MjQsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4YTE5NiwgMHgwMGZmLAorCTB4MTEzMCwgMHgyMDAxLCAweGI1MTUsIDB4MjAwNCwgMHhhMDg1LCAweGZmMDAsIDB4MDA3OCwgMHhhMTgyLAorCTB4MDA3ZiwgMHgxNmEwLCAweGExODgsIDB4MmRjNCwgMHgyMTBkLCAweGExOGMsIDB4MDBmZiwgMHgyMDAxLAorCTB4YjUxNSwgMHgyMDA0LCAweGExMTYsIDB4MDU1MCwgMHg4MTBmLCAweGExMDUsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwMDA2LCAweDA4MGMsIDB4ODVjNywgMHgwMDBlLCAweDAxZTAsIDB4NjAxYSwgMHg2MDBiLAorCTB4YmMwOSwgMHg2MDFmLCAweDAwMDEsIDB4MDgwYywgMHgzZTc1LCAweDAxZDgsIDB4NjgzNywgMHgwMDAwLAorCTB4NzAwNywgMHgwMDAzLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHg3MDFiLAorCTB4MzM3MCwgMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDMyLCAweDA4MGMsIDB4ODY0YywgMHgwMTJlLAorCTB4MDBjZSwgMHgwMDA1LCAweDAxMmUsIDB4MDBjZSwgMHgwODA0LCAweDJmY2YsIDB4MDBjZSwgMHgwODA0LAorCTB4MmZkMiwgMHgwODBjLCAweDg2MWQsIDB4MGNiMCwgMHgyMDAxLCAweGI1MDAsIDB4MjAwNCwgMHhhMDg2LAorCTB4MDAwMywgMHgxOTA0LCAweDJmY2YsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4NzkyNCwgMHg4MTBmLAorCTB4YTE4YywgMHgwMGZmLCAweGExOTYsIDB4MDBmZiwgMHgxMTMwLCAweDIwMDEsIDB4YjUxNSwgMHgyMDA0LAorCTB4YTA4NSwgMHhmZjAwLCAweDAwNzgsIDB4YTE4MiwgMHgwMDdmLCAweDE2YTAsIDB4YTE4OCwgMHgyZGM0LAorCTB4MjEwZCwgMHhhMThjLCAweDAwZmYsIDB4MjAwMSwgMHhiNTE1LCAweDIwMDQsIDB4YTExNiwgMHgwNTUwLAorCTB4ODEwZiwgMHhhMTA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwMDYsIDB4MDgwYywgMHg4NWM3LAorCTB4MDAwZSwgMHgwMWUwLCAweDYwMWEsIDB4NjAwYiwgMHhiYzA1LCAweDYwMWYsIDB4MDAwMSwgMHgwODBjLAorCTB4M2U3NSwgMHgwMWQ4LCAweDY4MzcsIDB4MDAwMCwgMHg3MDA3LCAweDAwMDMsIDB4NjgzMywgMHgwMDAwLAorCTB4NjgzOCwgMHhjMGZkLCAweDY4M2EsIDB4NzAxYiwgMHgzMzcwLCAweDJkMDAsIDB4NjAxMiwgMHgyMDA5LAorCTB4MDAzMiwgMHgwODBjLCAweDg2NGMsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsIDB4MDEyZSwgMHgwMGNlLAorCTB4MDgwNCwgMHgyZmNmLCAweDAwY2UsIDB4MDgwNCwgMHgyZmQyLCAweDA4MGMsIDB4ODYxZCwgMHgwY2IwLAorCTB4NjgzMCwgMHhhMDg2LCAweDAxMDAsIDB4MDkwNCwgMHgyZmNmLCAweDA4MDQsIDB4MmZhYSwgMHgyMDYxLAorCTB4Yjg3NCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDAwLCAweGQwODQsIDB4MDE3OCwgMHg2MTA0LAorCTB4NjIwOCwgMHgyYTYwLCAweDYwNjgsIDB4NzgzYSwgMHg2MGI0LCAweDc4M2UsIDB4NjBiMCwgMHgyMDE5LAorCTB4MDA3MiwgMHgyMDFhLCAweDYzNDgsIDB4MDEyZSwgMHgwODA0LCAweDJmYWEsIDB4YTAwZSwgMHgyMTEwLAorCTB4MGM4MCwgMHg4MWZmLCAweDE5MDQsIDB4MmZjZiwgMHgwODBjLCAweDVhY2YsIDB4MDkwNCwgMHgyZmNmLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjI0OCwgMHg2MDY4LCAweGEyMDIsIDB4MDI0OCwgMHhhMDg1LAorCTB4MDAwMSwgMHgwODBjLCAweDI4NjcsIDB4MDgwYywgMHg0NjJjLCAweDAxMmUsIDB4MDgwNCwgMHgyZmFhLAorCTB4MDEyZSwgMHgwODA0LCAweDJmZDIsIDB4MDAwNiwgMHgwMDE2LCAweDAwYzYsIDB4MDBlNiwgMHgyMDAxLAorCTB4YjdiZiwgMHgyMDcwLCAweDIwNjEsIDB4YjU1MiwgMHg2MDA4LCAweDIwNzIsIDB4MjAwOSwgMHgwMDAwLAorCTB4MjAxMSwgMHgxMDAwLCAweDA4MGMsIDB4NmI0MCwgMHg3MjA2LCAweDAwZWUsIDB4MDBjZSwgMHgwMDFlLAorCTB4MDAwZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDc4MjQsIDB4YTA4NCwgMHgwMDA3LAorCTB4MDAwMiwgMHgzM2Q0LCAweDMzZGQsIDB4MzNlNCwgMHgzM2QxLCAweDMzZDEsIDB4MzNkMSwgMHgzM2QxLAorCTB4MzNkMSwgMHgwMTJlLCAweDA4MDQsIDB4MmZkMiwgMHgyMDA5LCAweDAxMTQsIDB4MjEwNCwgMHhhMDg1LAorCTB4MDgwMCwgMHgyMDBhLCAweDA4MGMsIDB4MzU0ZiwgMHgwMDcwLCAweDIwMDksIDB4MDEwYiwgMHgyMDBiLAorCTB4MDAxMCwgMHgwODBjLCAweDM1NGYsIDB4MDAzOCwgMHg4MWZmLCAweDAxMjgsIDB4MDEyZSwgMHgyMDIxLAorCTB4NDAwYiwgMHgwODA0LCAweDJmYWMsIDB4MDA4NiwgMHgwMDk2LCAweDAwYTYsIDB4MDBiNiwgMHgwMGM2LAorCTB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MDgwYywgMHgzM2FiLCAweDIwMDksIDB4MDEwMSwgMHgyMTBjLAorCTB4MDAxNiwgMHgyMDAxLCAweDAxMzgsIDB4MjAwYywgMHgyMDAzLCAweDAwMDEsIDB4MDAxNiwgMHgyMDAxLAorCTB4MDA3YSwgMHgyMDM0LCAweDIwMDEsIDB4MDA3YiwgMHgyMDJjLCAweGEwMDYsIDB4MjA0OCwgMHgyMDUwLAorCTB4MjA1OCwgMHgwODBjLCAweDM3OWEsIDB4MDgwYywgMHgzNmZlLCAweGEwM2UsIDB4MjcyMCwgMHgwMGY2LAorCTB4MDBlNiwgMHgwMGM2LCAweDJkNjAsIDB4MjA3MSwgMHhiODRhLCAweDIwNzksIDB4MDAyMCwgMHgwMGQ2LAorCTB4MjA2OSwgMHgwMDAwLCAweDY4MjQsIDB4ZDBiNCwgMHgwMTQwLCAweDIwMDEsIDB4MDA3ZCwgMHgyMDA0LAorCTB4NzgzZSwgMHgyMDAxLCAweDAwN2MsIDB4MjAwNCwgMHg3ODNhLCAweDAwZGUsIDB4MjAxMSwgMHgwMDAxLAorCTB4MDgwYywgMHgzNmFhLCAweDA4MGMsIDB4MzZhYSwgMHgwMGNlLCAweDAwZWUsIDB4MDBmZSwgMHgwODBjLAorCTB4MzVmNSwgMHgwODBjLCAweDM2ZDIsIDB4MDgwYywgMHgzNjRmLCAweDA4MGMsIDB4MzViNCwgMHgwODBjLAorCTB4MzVlNSwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHg3ODI0LCAweGQwOTQsIDB4MDUzMCwgMHg3ODE0LAorCTB4YTA4NCwgMHgwMTg0LCAweGEwODUsIDB4MDAxMCwgMHg3ODE2LCAweDIwNzksIDB4MDE0MCwgMHgwODBjLAorCTB4MzUyZCwgMHgxMTEwLCAweDAwZmUsIDB4MDQzMCwgMHg3ODA0LCAweGQwZGMsIDB4MGRjMCwgMHgyMDc5LAorCTB4MDEwMCwgMHg3ODI3LCAweDAwODYsIDB4NzgxNCwgMHhhMDg0LCAweDAxODQsIDB4YTA4NSwgMHgwMDMyLAorCTB4NzgxNiwgMHgwODBjLCAweDM1MmQsIDB4MTExMCwgMHgwMGZlLCAweDAwYTAsIDB4NzgyNCwgMHhkMGJjLAorCTB4MGRjMCwgMHg3ODI3LCAweDAwODAsIDB4YTAyNiwgMHg3YzE2LCAweDc4MjQsIDB4ZDBhYywgMHgwMTMwLAorCTB4OGI1OCwgMHgwODBjLCAweDM1MzcsIDB4MDBmZSwgMHgwODA0LCAweDM0ZjcsIDB4MDBmZSwgMHgwODBjLAorCTB4MzUyZCwgMHgxMTUwLCAweDg5NDgsIDB4MjAwMSwgMHgwMDdhLCAweDI2MDIsIDB4MjAwMSwgMHgwMDdiLAorCTB4MjUwMiwgMHgwODBjLCAweDM1MzcsIDB4MDA4OCwgMHg4N2ZmLCAweDAxNDAsIDB4MjAwMSwgMHgwMjAxLAorCTB4MjAwNCwgMHhhMDA1LCAweDE5MDQsIDB4MzQzMSwgMHg4NzM5LCAweDAwMzgsIDB4MjAwMSwgMHhiODIzLAorCTB4MjAwNCwgMHhhMDg2LCAweDAwMDAsIDB4MTkwNCwgMHgzNDMxLCAweDIwMDEsIDB4MDAzMywgMHgyMDAzLAorCTB4MDBmNiwgMHg4NjMxLCAweDEyMDgsIDB4ODUyOSwgMHgyNTAwLCAweGE2MDUsIDB4MDkwNCwgMHgzNGY3LAorCTB4NzgyNCwgMHhkMGJjLCAweDAxMjgsIDB4MjkwMCwgMHhhYTA1LCAweGFiMDUsIDB4MTkwNCwgMHgzNGY3LAorCTB4NjAzMywgMHgwMDBkLCAweDIwMDEsIDB4MDAzMCwgMHgyMDAzLCAweDAwMDQsIDB4NzgyNCwgMHhkMGFjLAorCTB4MTE0OCwgMHgyMDAxLCAweGI4MjMsIDB4MjAwMywgMHgwMDAzLCAweDIwMDEsIDB4MDAzMCwgMHgyMDAzLAorCTB4MDAwOSwgMHgwMDQwLCAweDYwMjcsIDB4MDAwMSwgMHgyMDAxLCAweDAwNzUsIDB4MjAwNCwgMHhhMDA1LAorCTB4MDEwOCwgMHg2MDI2LCAweDJjMDAsIDB4NjAxYSwgMHgyMGUxLCAweDkwNDAsIDB4MmQwMCwgMHg2ODFhLAorCTB4NjgzMywgMHgwMDBkLCAweDc4MjQsIDB4ZDBhNCwgMHgxMTgwLCAweDY4MjcsIDB4MDAwMCwgMHgwMGM2LAorCTB4MjBhOSwgMHgwMDA0LCAweDIwNjEsIDB4MDAyMCwgMHg2MDAzLCAweDAwMDgsIDB4MjAwMSwgMHgwMjAzLAorCTB4MjAwNCwgMHgxZjA0LCAweDM0Y2MsIDB4MDBjZSwgMHgwMDQwLCAweDY4MjcsIDB4MDAwMSwgMHgyMDAxLAorCTB4MDA3NCwgMHgyMDA0LCAweGEwMDUsIDB4MDEwOCwgMHg2ODI2LCAweDAwZjYsIDB4MDBjNiwgMHgyMDc5LAorCTB4MDEwMCwgMHgyMDYxLCAweDAwMjAsIDB4NzgyNywgMHgwMDAyLCAweDIwMDEsIDB4MDA3MiwgMHgyMDA0LAorCTB4YTA4NCwgMHhmZmY4LCAweDYwMWEsIDB4MDAwNiwgMHgyMDAxLCAweDAwNzMsIDB4MjAwNCwgMHg2MDFlLAorCTB4NzhjNiwgMHgwMDBlLCAweDc4Y2EsIDB4MDBjZSwgMHgwMGZlLCAweDA4MDQsIDB4MzQwZiwgMHgyMDYxLAorCTB4MDEwMCwgMHg2MDI3LCAweDAwMDIsIDB4MDAxZSwgMHg2MWUyLCAweDAwMWUsIDB4NjEwNiwgMHg3ODI0LAorCTB4YTA4NCwgMHgwMDAzLCAweGEwODYsIDB4MDAwMiwgMHgwMTg4LCAweDIwZTEsIDB4OTAyOCwgMHg2MDUwLAorCTB4YTA4NCwgMHhmN2VmLCAweDYwNTIsIDB4NjAyZiwgMHgwMDAwLCAweDYwMmMsIDB4YzBhYywgMHg2MDJlLAorCTB4NjA0YiwgMHhmN2Y3LCAweDYwNDMsIDB4MDA5MCwgMHg2MDQzLCAweDAwMTAsIDB4MjkwOCwgMHgyYTEwLAorCTB4MmIxOCwgMHgyYjAwLCAweGFhMDUsIDB4YTkwNSwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLAorCTB4MDBiZSwgMHgwMGFlLCAweDAwOWUsIDB4MDA4ZSwgMHgxMTE4LCAweDAxMmUsIDB4MDgwNCwgMHgyZmFhLAorCTB4MDEyZSwgMHgyMDIxLCAweDQwMGMsIDB4MDgwNCwgMHgyZmFjLCAweGEwODUsIDB4MDAwMSwgMHgxZDA0LAorCTB4MzUzNiwgMHgyMDkxLCAweDYwMDAsIDB4ODQyMCwgMHhhNDg2LCAweDAwNjQsIDB4MDAwNSwgMHgyMDAxLAorCTB4MDEwNSwgMHgyMDAzLCAweDAwMTAsIDB4MjAwMSwgMHgwMDMwLCAweDIwMDMsIDB4MDAwNCwgMHgyMDAxLAorCTB4MDAyMCwgMHgyMDAzLCAweDAwMDQsIDB4MjAwMSwgMHhiODIzLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLAorCTB4Yjg0YSwgMHgyMDAzLCAweDAwMDAsIDB4MjBlMSwgMHhmMDAwLCAweGEwMjYsIDB4MDAwNSwgMHgwMGY2LAorCTB4MjA3OSwgMHgwMTAwLCAweDIwMDEsIDB4YjUxNSwgMHgyMDBjLCAweDc5MzIsIDB4NzkzNiwgMHgwODBjLAorCTB4Mjg0NywgMHg3ODUwLCAweGEwODQsIDB4MDk4MCwgMHhhMDg1LCAweDAwMzAsIDB4Nzg1MiwgMHgyMDE5LAorCTB4MDFmNCwgMHg4MzE5LCAweDFkZjAsIDB4YTA4NCwgMHgwOTgwLCAweDc4NTIsIDB4NzgyYywgMHhjMGFkLAorCTB4NzgyZSwgMHgyMGE5LCAweDAwNDYsIDB4MWQwNCwgMHgzNTZiLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LAorCTB4MzU2YiwgMHg3ODUwLCAweGEwODUsIDB4MDQwMCwgMHg3ODUyLCAweDIwMDEsIDB4MDAwOSwgMHgyMDA0LAorCTB4YTA4NCwgMHgwMDAzLCAweGEwODYsIDB4MDAwMSwgMHgxMTE4LCAweDc4MmMsIDB4YzBhYywgMHg3ODJlLAorCTB4Nzg0YiwgMHhmN2Y3LCAweDc4NDMsIDB4MDA5MCwgMHg3ODQzLCAweDAwMTAsIDB4MjBhOSwgMHgwMDBlLAorCTB4ZTAwMCwgMHgxZjA0LCAweDM1ODgsIDB4Nzg1MCwgMHhhMDg1LCAweDE0MDAsIDB4Nzg1MiwgMHgyMDE5LAorCTB4NjFhOCwgMHg3ODU0LCAweGUwMDAsIDB4ZTAwMCwgMHhkMDhjLCAweDExMTAsIDB4ODMxOSwgMHgxZGM4LAorCTB4NzgyNywgMHgwMDQ4LCAweDc4NTAsIDB4YTA4NSwgMHgwNDAwLCAweDc4NTIsIDB4Nzg0MywgMHgwMDQwLAorCTB4MjAxOSwgMHgwMWY0LCAweGUwMDAsIDB4ZTAwMCwgMHg4MzE5LCAweDFkZTAsIDB4MjAwMSwgMHgwMTQwLAorCTB4MjAwMywgMHgwMTAwLCAweDc4MjcsIDB4MDAyMCwgMHg3ODQzLCAweDAwMDAsIDB4MjAwMywgMHgwMDAwLAorCTB4NzgyNywgMHgwMDQ4LCAweDAwZmUsIDB4MDAwNSwgMHg3ODI0LCAweGQwYWMsIDB4MTFjOCwgMHgwMGY2LAorCTB4MDBlNiwgMHgyMDcxLCAweGI4MjMsIDB4MjA3OSwgMHgwMDMwLCAweDIwMDEsIDB4MDIwMSwgMHgyMDA0LAorCTB4YTAwNSwgMHgwMTYwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAwLCAweDExNDAsIDB4MDA1MSwgMHhkMGJjLAorCTB4MDEwOCwgMHg4NzM4LCAweDcwMDMsIDB4MDAwMywgMHg3ODAzLCAweDAwMTksIDB4MDBlZSwgMHgwMGZlLAorCTB4MDAwNSwgMHg3ODBjLCAweGEwOGMsIDB4MDA3MCwgMHgwMTc4LCAweDIwMDksIDB4MDA3YSwgMHgyNjBhLAorCTB4MjAwOSwgMHgwMDdiLCAweDI1MGEsIDB4ZDBiNCwgMHgwMTA4LCAweDhhNTAsIDB4ZDBhYywgMHgwMTA4LAorCTB4ODk0OCwgMHhkMGE0LCAweDAxMDgsIDB4OGI1OCwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMjAwLAorCTB4NzgxYywgMHhkMDg0LCAweDAxNDAsIDB4MjBlMSwgMHgwMDA3LCAweDIwZTEsIDB4MjAwMCwgMHgyMDAxLAorCTB4MDIwYSwgMHgyMDA0LCAweDBjYTgsIDB4MDBmZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgwMTAwLAorCTB4MjAwMSwgMHhiN2MwLCAweDIwMDQsIDB4NzBlMiwgMHgyMDA5LCAweGI1MTUsIDB4MjEwYywgMHg3MTZlLAorCTB4NzA2MywgMHgwMTAwLCAweDcxNjYsIDB4NzE5ZSwgMHg3MDZiLCAweDAwMDAsIDB4NzA3MywgMHgwODA5LAorCTB4NzA3NywgMHgwMDA4LCAweDcwNzgsIDB4YTA4MCwgMHgwMTAwLCAweDcwN2EsIDB4NzA4MCwgMHg4MDAwLAorCTB4NzA4MiwgMHg3MDg3LCAweGFhYWEsIDB4YTAwNiwgMHg3MDhhLCAweDcwOGUsIDB4NzA3ZSwgMHg3MGQ2LAorCTB4NzBhYiwgMHgwMDM2LCAweDcwYWYsIDB4OTVkNSwgMHg3MDI3LCAweDAwODAsIDB4NzAxNCwgMHhhMDg0LAorCTB4MDE4NCwgMHhhMDg1LCAweDAwMzIsIDB4NzAxNiwgMHgwODBjLCAweDM2ZDIsIDB4MDgwYywgMHgzNTJkLAorCTB4MTExMCwgMHg4NDIxLCAweDAwMjgsIDB4NzAyNCwgMHhkMGJjLCAweDBkYjAsIDB4NzAyNywgMHgwMDgwLAorCTB4MDBmNiwgMHgwMGU2LCAweDIwNzEsIDB4YjgyMywgMHgyMDc5LCAweDAwMzAsIDB4MDBkNiwgMHgyMDY5LAorCTB4MDAwMCwgMHg2ODI0LCAweGQwYjQsIDB4MDEyMCwgMHg2ODNjLCAweDc4M2UsIDB4NjgzOCwgMHg3ODNhLAorCTB4MDBkZSwgMHgyMDExLCAweDAwMTEsIDB4MDgwYywgMHgzNmFhLCAweDIwMTEsIDB4MDAwMSwgMHgwODBjLAorCTB4MzZhYSwgMHgwMGVlLCAweDAwZmUsIDB4NzAxNywgMHgwMDAwLCAweDAwZWUsIDB4MDAwNSwgMHgwMGY2LAorCTB4MDBlNiwgMHgyMDcxLCAweGI4MjMsIDB4MjA3OSwgMHgwMDMwLCAweDc5MDQsIDB4ZDFmYywgMHgwOTA0LAorCTB4MzZhNywgMHg3ODAzLCAweDAwMDIsIDB4YTAyNiwgMHhkMTljLCAweDE5MDQsIDB4MzZhMywgMHg3MDAwLAorCTB4MDAwMiwgMHgzNmE3LCAweDM2NjUsIDB4MzY4OSwgMHgzNmEzLCAweGQxYmMsIDB4MTE1MCwgMHhkMWRjLAorCTB4MTE1MCwgMHg4MDAxLCAweDcwMDIsIDB4MjAxMSwgMHgwMDAxLCAweDA0ZTEsIDB4MDVjMCwgMHgwNGQxLAorCTB4MDRiMCwgMHg3ODBmLCAweDAwMDAsIDB4NzgyMCwgMHg3OTI0LCAweDc4MDMsIDB4MDAwNCwgMHg3ODIyLAorCTB4NzkyNiwgMHgyMDAxLCAweDAyMDEsIDB4MjAwYywgMHg4MWZmLCAweDBkZTgsIDB4MDgwYywgMHgzNWQxLAorCTB4MjAwOSwgMHgwMDAxLCAweDc4MDgsIDB4ZDBlYywgMHgwMTEwLCAweDIwMDksIDB4MDAxMSwgMHg3OTAyLAorCTB4MDBmMCwgMHg4MDAxLCAweDcwMDIsIDB4YTE4NCwgMHgwODgwLCAweDExMzgsIDB4NzgwNCwgMHhkMGZjLAorCTB4MTk0MCwgMHgyMDExLCAweDAwMDEsIDB4MDBiMSwgMHgwMDkwLCAweDYwMzAsIDB4YTA5MiwgMHgwMDA0LAorCTB4YTA4NiwgMHgwMDA5LCAweDExMjAsIDB4NjAwMCwgMHg2MDFhLCAweDIwMTEsIDB4MDAyNSwgMHg2MjMyLAorCTB4ZDFkYywgMHgxOTg4LCAweDA4NzAsIDB4NzgwMywgMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMDA1LCAweDYwMjQsIDB4YTAwNSwgMHgwNTIwLCAweDgwMDEsIDB4NjAyNiwgMHg2MDE4LAorCTB4NjEzMCwgMHhhMTQwLCAweDI4MDQsIDB4NzgzMiwgMHg4ODQwLCAweDI4MDQsIDB4NzgzNiwgMHg4ODQwLAorCTB4MjgwNCwgMHg3ODIyLCAweDg4NDAsIDB4MjgwNCwgMHg3ODI2LCAweDg4NDAsIDB4N2EwMiwgMHg3MDAwLAorCTB4ODAwMCwgMHg3MDAyLCAweDYwMTgsIDB4YTgwMiwgMHhhMDhhLCAweDAwMjksIDB4MTEzOCwgMHg2MDE4LAorCTB4YTA4MCwgMHgwMDAxLCAweDIwMDQsIDB4NjAxYSwgMHgyMDAxLCAweDAwMGQsIDB4NjAzMiwgMHhhMDg1LAorCTB4MDAwMSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMGM2LCAweDIwNzEsIDB4Yjg0YSwgMHgyMDc5LAorCTB4MDAyMCwgMHg3OTA0LCAweGQxZmMsIDB4MDFmMCwgMHg3ODAzLCAweDAwMDIsIDB4MmQ2MCwgMHhhMDI2LAorCTB4NzAwMCwgMHgwMDAyLCAweDM2ZmEsIDB4MzZlNSwgMHgzNmYxLCAweDgwMDEsIDB4NzAwMiwgMHhkMTljLAorCTB4MTE4OCwgMHgyMDExLCAweDAwMDEsIDB4MDgwYywgMHgzNmFhLCAweDAxNjAsIDB4MDgwYywgMHgzNmFhLAorCTB4MDA0OCwgMHg4MDAxLCAweDcwMDIsIDB4NzgwNCwgMHhkMGZjLCAweDFkMzAsIDB4MjAxMSwgMHgwMDAxLAorCTB4MDgwYywgMHgzNmFhLCAweDAwY2UsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDBjNiwgMHgyMDYxLCAweDAyMDAsIDB4MjAwMSwgMHhiN2MwLCAweDIwMDQsIDB4NjAxYSwgMHgyMDYxLAorCTB4MDEwMCwgMHgyMDAxLCAweGI3YmYsIDB4MjAwNCwgMHg2MGNlLCAweDYwMDQsIDB4YzBhYywgMHhhMDg1LAorCTB4MDIwMCwgMHg2MDA2LCAweDIwMDEsIDB4MDA3NCwgMHgyMDA0LCAweGEwMDUsIDB4MDFmOCwgMHgyMDM4LAorCTB4MjAwMSwgMHgwMDc2LCAweDIwMjQsIDB4MjAwMSwgMHgwMDc3LCAweDIwMWMsIDB4MDgwYywgMHgzZTc1LAorCTB4NjgzMywgMHgwMDBkLCAweDZmMjYsIDB4MmQwMCwgMHg2ODFhLCAweGE3OGEsIDB4MDAwNywgMHgwMjIwLAorCTB4MjEzOCwgMHgyMDA5LCAweDAwMDcsIDB4MDAxMCwgMHgyNzA4LCAweGEwM2UsIDB4NjgxOCwgMHhhMDgwLAorCTB4MDAwZCwgMHgwNGIxLCAweDFkOTAsIDB4MmQwMCwgMHg2ODFhLCAweDAwODgsIDB4MDgwYywgMHgzZTc1LAorCTB4NjgzMywgMHgwMDBkLCAweDIwNzAsIDB4NjgyNywgMHgwMDAxLCAweDJkMDAsIDB4NjgxYSwgMHgyMDAxLAorCTB4MDA3NiwgMHgyMDA0LCAweDIwNzIsIDB4MjAwMSwgMHgwMDc3LCAweDIwMDQsIDB4NzAwNiwgMHgyMDYxLAorCTB4MDAyMCwgMHgyMDc5LCAweDAxMDAsIDB4MjAwMSwgMHhiN2JmLCAweDIwMDQsIDB4NjAxMiwgMHgyMGUxLAorCTB4OTA0MCwgMHgyMDAxLCAweDAwNzIsIDB4MjAwNCwgMHhhMDg0LCAweGZmZjgsIDB4NzAwYSwgMHg2MDFhLAorCTB4MDAwNiwgMHgyMDAxLCAweDAwNzMsIDB4MjAwNCwgMHg3MDBlLCAweDYwMWUsIDB4NzhjNiwgMHgwMDBlLAorCTB4NzhjYSwgMHhhMDA2LCAweDYwM2EsIDB4NjAzZSwgMHgwMGNlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgyMDcxLCAweDAwMTAsIDB4MjBhMCwgMHgyMDk5LCAweDAwMTQsIDB4NzAwMywgMHgwMDI2LAorCTB4NzQzMiwgMHg3MzM2LCAweGEwMDYsIDB4NzAzYSwgMHg3MDNlLCAweDgxMGIsIDB4ODEwYiwgMHgyMWE4LAorCTB4ODEwYiwgMHg3MTIyLCAweDcwMDMsIDB4MDA0MSwgMHg3MDA0LCAweGQwZmMsIDB4MGRlOCwgMHg3MDAzLAorCTB4MDAwMiwgMHg3MDAzLCAweDAwNDAsIDB4NTNhNSwgMHg3NDMwLCAweDczMzQsIDB4ODdmZiwgMHgwMTgwLAorCTB4MDBjNiwgMHgwMGQ2LCAweDJkNjAsIDB4MDBjNiwgMHgwODBjLCAweDNlNzUsIDB4MDBjZSwgMHg2MDE4LAorCTB4MjA3MCwgMHgyZDAwLCAweDcwMDYsIDB4NjAxYSwgMHgwMGRlLCAweDAwY2UsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MjAwMSwgMHgwMDc1LCAweDIwMDQsIDB4YTAwNSwgMHgwNTA4LAorCTB4MjAzOCwgMHgyMDAxLCAweDAwNzgsIDB4MjAyNCwgMHgyMDAxLCAweDAwNzksIDB4MjAxYywgMHgwODBjLAorCTB4M2U3NSwgMHgyZDYwLCAweDY4MzMsIDB4MDAwZCwgMHg2ZjI2LCAweDJkMDAsIDB4NjgxYSwgMHhhNzhhLAorCTB4MDAwNywgMHgwMjIwLCAweDIxMzgsIDB4MjAwOSwgMHgwMDA3LCAweDAwMTAsIDB4MjcwOCwgMHhhMDNlLAorCTB4NjgxOCwgMHhhMDgwLCAweDAwMGQsIDB4MDgwYywgMHgzNzY4LCAweDFkODgsIDB4MmQwMCwgMHg2ODFhLAorCTB4MDBlMCwgMHgwODBjLCAweDNlNzUsIDB4MmQ2MCwgMHg2MDMzLCAweDAwMGQsIDB4MjA3MCwgMHg2MDI3LAorCTB4MDAwMSwgMHgyYzAwLCAweDYwMWEsIDB4MjAwMSwgMHgwMDc4LCAweDIwMDQsIDB4MjA3MiwgMHgyMDAxLAorCTB4MDA3OSwgMHgyMDA0LCAweDcwMDYsIDB4MjAwMSwgMHgwMDcyLCAweDIwMDQsIDB4YTA4NCwgMHhmZmY4LAorCTB4NzAwYSwgMHgyMDAxLCAweDAwNzMsIDB4MjAwNCwgMHg3MDBlLCAweDIwMDEsIDB4MDAzMCwgMHgyMDAzLAorCTB4MDAwNCwgMHg3ODI0LCAweGQwYWMsIDB4MTE3OCwgMHgyMDAxLCAweDAxMDEsIDB4MjAwYywgMHhjMWVkLAorCTB4MjEwMiwgMHg2MDI3LCAweDAwMDAsIDB4MjAwMSwgMHhiODIzLCAweDIwMDMsIDB4MDAwMywgMHgyMDAxLAorCTB4MDAzMCwgMHgyMDAzLCAweDAwMDksIDB4MDBlZSwgMHgwMDA1LCAweDA4MDQsIDB4MmZhYSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwYTksIDB4MDAxMiwgMHgyMDAxLCAweGI1NDAsIDB4MjBhMCwgMHhhMDA2LAorCTB4NDBhNCwgMHgwMTJlLCAweDA4MDQsIDB4MmZhYSwgMHg3ZDM4LCAweDdjM2MsIDB4MDgwNCwgMHgzMDUxLAorCTB4MDgwYywgMHgzZTc1LCAweDA5MDQsIDB4MmZjZiwgMHgwODBjLCAweDVhY2YsIDB4MDExMCwgMHgwODBjLAorCTB4NGJmMCwgMHgyMDA5LCAweDAwMWMsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgwODBjLAorCTB4M2ViNiwgMHg3MDFiLCAweDM4MWMsIDB4MDAwNSwgMHhhZGU4LCAweDAwMGQsIDB4NjgwMCwgMHhhMDA1LAorCTB4MDkwNCwgMHgyZmQyLCAweDY4MDQsIDB4ZDBhYywgMHgwMTE4LCAweGQwYTQsIDB4MDkwNCwgMHgyZmQyLAorCTB4ZDA5NCwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHg2MTA0LCAweDAxMzgsIDB4NjIwMCwgMHhhMjkyLAorCTB4MDAwNSwgMHgwMjE4LCAweGExOGMsIDB4ZmZkZiwgMHgwMDEwLCAweGExOGQsIDB4MDAyMCwgMHg2MTA2LAorCTB4MDBjZSwgMHhkMDhjLCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDYxMDQsIDB4MDExOCwgMHhhMThkLAorCTB4MDAxMCwgMHgwMDEwLCAweGExOGMsIDB4ZmZlZiwgMHg2MTA2LCAweDAwY2UsIDB4MjAwOSwgMHgwMTAwLAorCTB4MjEwYywgMHhhMThhLCAweDAwMDIsIDB4MDI2OCwgMHhkMDg0LCAweDAxNTgsIDB4NmEyOCwgMHhhMjhhLAorCTB4MDA3ZiwgMHgxYTA0LCAweDJmZDIsIDB4YTI4OCwgMHgyZGM0LCAweDIxMGQsIDB4YTE4YywgMHgwMGZmLAorCTB4NjE1YSwgMHhkMGRjLCAweDAxMzAsIDB4NjgyOCwgMHhhMDhhLCAweDAwN2YsIDB4MWEwNCwgMHgyZmQyLAorCTB4NjA1MiwgMHg2ODA4LCAweGEwOGEsIDB4MDEwMCwgMHgwYTA0LCAweDJmZDIsIDB4YTA4YSwgMHgwODQxLAorCTB4MWEwNCwgMHgyZmQyLCAweGEwODQsIDB4MDAwNywgMHgxOTA0LCAweDJmZDIsIDB4NjgwYywgMHhhMDA1LAorCTB4MDkwNCwgMHgyZmQyLCAweDY4MTAsIDB4YTAwNSwgMHgwOTA0LCAweDJmZDIsIDB4Njg0OCwgMHg2OTQwLAorCTB4YTEwYSwgMHgxYTA0LCAweDJmZDIsIDB4ODAwMSwgMHgwOTA0LCAweDJmZDIsIDB4Njg0YywgMHg2OTQ0LAorCTB4YTEwYSwgMHgxYTA0LCAweDJmZDIsIDB4ODAwMSwgMHgwOTA0LCAweDJmZDIsIDB4NjgwNCwgMHhkMGZjLAorCTB4MDU2MCwgMHgwODBjLCAweDNlNzUsIDB4MDkwNCwgMHgyZmNmLCAweDIwMDksIDB4MDAxNCwgMHg3YTJjLAorCTB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4YTI5MCwgMHgwMDM4LCAweGEzOTksIDB4MDAwMCwgMHgwODBjLAorCTB4M2ViNiwgMHg3MDFiLCAweDM4OWMsIDB4MDAwNSwgMHhhZGU4LCAweDAwMGQsIDB4MjBhOSwgMHgwMDE0LAorCTB4MmQ5OCwgMHgyMDY5LCAweGI1NmUsIDB4MmRhMCwgMHg1M2EzLCAweDcwMTAsIDB4YTBlOCwgMHgwMDBkLAorCTB4MjAwMSwgMHhiNTcyLCAweDIwMGMsIDB4ZDFlNCwgMHgwMTQwLCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLAorCTB4NjAwNCwgMHhhMDg1LCAweDBiMDAsIDB4NjAwNiwgMHgwMGNlLCAweDIwMDksIDB4YjdiMSwgMHgyMDBiLAorCTB4MDAwMCwgMHgyMDAxLCAweGI1NzQsIDB4MjAwNCwgMHhkMGFjLCAweDAxNTgsIDB4NzgyNCwgMHgyMDBhLAorCTB4MjAwOSwgMHgwMTdmLCAweDIwMGEsIDB4MzIwMCwgMHhhMDg0LCAweDAwM2YsIDB4YTA4NSwgMHgzMDIwLAorCTB4MjA5MCwgMHgyMGE5LCAweDAwMWMsIDB4MmQ5OCwgMHgyMDY5LCAweGI1NTIsIDB4MmRhMCwgMHg1M2EzLAorCTB4NjgxNCwgMHhhMDhjLCAweDAwZmYsIDB4NjE0MiwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHg2MDQ2LAorCTB4MDgwYywgMHg1ZGE1LCAweDA4MGMsIDB4NTM2YywgMHgwODBjLCAweDUzZDUsIDB4NjAwMCwgMHhhMDg2LAorCTB4MDAwMCwgMHgxOTA0LCAweDM5OTcsIDB4NjgwOCwgMHg2MDJhLCAweDA4MGMsIDB4MjQ3MCwgMHgwMDA2LAorCTB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4YTA4MiwgMHgwMDA1LCAweDAwMGUsIDB4MDI2OCwgMHgyMDA5LAorCTB4MDE3MCwgMHgyMDBiLCAweDAwODAsIDB4ZTAwMCwgMHhlMDAwLCAweDIwMGIsIDB4MDAwMCwgMHgwMDM2LAorCTB4NmIwOCwgMHgwODBjLCAweDI4YTIsIDB4MDAzZSwgMHg2ODE4LCAweDY5MWMsIDB4NmEyMCwgMHg2YjI0LAorCTB4ODAwNywgMHg4MTBmLCAweDgyMTcsIDB4ODMxZiwgMHg2MDE2LCAweDYxMWEsIDB4NjIxZSwgMHg2MzIyLAorCTB4NmMwNCwgMHhkNGY0LCAweDAxNDgsIDB4NjgzMCwgMHg2OTM0LCAweDZhMzgsIDB4NmIzYywgMHg4MDA3LAorCTB4ODEwZiwgMHg4MjE3LCAweDgzMWYsIDB4MDAxMCwgMHhhMDg0LCAweGYwZmYsIDB4NjAwNiwgMHg2MTBhLAorCTB4NjIwZSwgMHg2MzEyLCAweDgwMDcsIDB4ODEwZiwgMHg4MjE3LCAweDgzMWYsIDB4MjBhOSwgMHgwMDA0LAorCTB4MjBhMSwgMHhiN2M2LCAweDQwYTEsIDB4MDgwYywgMHg2YTY4LCAweDY5MDQsIDB4ZDFmYywgMHgwNTIwLAorCTB4MDBjNiwgMHgyMDA5LCAweDAwMDAsIDB4MjBhOSwgMHgwMDAxLCAweDZiNzAsIDB4ZDM4NCwgMHgwMWM4LAorCTB4MDAyMCwgMHg4MzlkLCAweDEyYjAsIDB4MzUwOCwgMHg4MTA5LCAweDA4MGMsIDB4NjM1YywgMHg2ODc4LAorCTB4NjAxNiwgMHg2ODc0LCAweDIwMDgsIDB4YTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4NjAwYSwgMHhhMTg0LAorCTB4MDBmZiwgMHg2MDA2LCAweDgxMDgsIDB4MTExOCwgMHg2MDAzLCAweDAwMDMsIDB4MDAxMCwgMHg2MDAzLAorCTB4MDAwMSwgMHgxZjA0LCAweDM5MzEsIDB4MDBjZSwgMHgyMDY5LCAweGI1NTIsIDB4MjAwMSwgMHhiNzllLAorCTB4NmE4MCwgMHhhMjk0LCAweDAwMzAsIDB4YTI4ZSwgMHgwMDAwLCAweDAxNzAsIDB4YTI4ZSwgMHgwMDEwLAorCTB4MDExOCwgMHhhMjhlLCAweDAwMjAsIDB4MDE0MCwgMHgyMDAzLCAweGFhYWEsIDB4MDgwYywgMHgyOGViLAorCTB4MjAwMSwgMHhiNzhmLCAweDIxMDIsIDB4MDAwOCwgMHgyMTAyLCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLAorCTB4NjAyZiwgMHgwMDQwLCAweDYwMmYsIDB4MDAwMCwgMHgwMGNlLCAweDA4MGMsIDB4NWFjZiwgMHgwMTI4LAorCTB4MDgwYywgMHg0MGNmLCAweDAxMTAsIDB4MDgwYywgMHgyODY3LCAweDYwYzgsIDB4YTAwNSwgMHgwMWQwLAorCTB4NjAwMywgMHgwMDAxLCAweDIwMDksIDB4Mzk3ZCwgMHgwMGUwLCAweDA4MGMsIDB4NWFjZiwgMHgxMTc4LAorCTB4MjAxMSwgMHg1OWEyLCAweDA4MGMsIDB4Njk5YywgMHgyMDExLCAweDU5OTUsIDB4MDgwYywgMHg2YTVjLAorCTB4MjAwMSwgMHhiNzlmLCAweDIwMDMsIDB4MDAwMCwgMHgwODBjLCAweDVhMDcsIDB4MDA0MCwgMHgwODBjLAorCTB4NGIxZiwgMHgwMDI4LCAweDYwMDMsIDB4MDAwNCwgMHgyMDA5LCAweDM5OTcsIDB4MDAxMCwgMHgwODA0LAorCTB4MmZhYSwgMHgyMDAxLCAweDAxMDAsIDB4MjAwNCwgMHhhMDgyLCAweDAwMDUsIDB4MDI1OCwgMHgyMDAxLAorCTB4MDE3MCwgMHgyMDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwNGMsIDB4MTExOCwgMHgyMDkxLAorCTB4MzA5ZCwgMHgwODE3LCAweDIwOTEsIDB4MzAxZCwgMHgwODE3LCAweDYwMDAsIDB4YTA4NiwgMHgwMDAwLAorCTB4MDkwNCwgMHgyZmNmLCAweDIwNjksIDB4YjU1MiwgMHg3ODMwLCAweDY4NDIsIDB4NzgzNCwgMHg2ODQ2LAorCTB4NjgwNCwgMHhkMGZjLCAweDAxMTgsIDB4MjAwOSwgMHgwMDMwLCAweDAwMTAsIDB4MjAwOSwgMHgwMDFjLAorCTB4MmQwMCwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDA4MDQsIDB4M2ViOSwgMHhhMDA2LAorCTB4MDgwYywgMHgyODY3LCAweDgxZmYsIDB4MTkwNCwgMHgyZmNmLCAweDA4MGMsIDB4NWFjZiwgMHgxMTc4LAorCTB4MjAwMSwgMHhiNzlmLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLCAweGI1MDAsIDB4MjAwMywgMHgwMDAxLAorCTB4YTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4NWIxMywgMHgwODBjLCAweDVhMDcsIDB4MDAyMCwgMHgwODBjLAorCTB4NGJmMCwgMHgwODBjLCAweDRiMWYsIDB4MDgwNCwgMHgyZmFhLCAweDgxZmYsIDB4MTkwNCwgMHgyZmNmLAorCTB4MDgwYywgMHg1YWNmLCAweDExMTAsIDB4MDgwNCwgMHgyZmNmLCAweDYxODgsIDB4ODFmZiwgMHgwMTk4LAorCTB4NzAzZiwgMHgwMDAwLCAweDIwMDEsIDB4YmNjMCwgMHgyMDA5LCAweDAwNDAsIDB4N2EyYywgMHg3YjI4LAorCTB4N2MzYywgMHg3ZDM4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4M2ViOSwgMHg3MDFiLAorCTB4MmZhOCwgMHgwMTJlLCAweDAwMDUsIDB4NzAzZiwgMHgwMDAxLCAweDAwZDYsIDB4MjA2OSwgMHhiY2MwLAorCTB4MjBhOSwgMHgwMDQwLCAweDIwYTEsIDB4YmNjMCwgMHgyMDE5LCAweGZmZmYsIDB4NDNhNCwgMHg2NTUwLAorCTB4YTU4OCwgMHgyZGM0LCAweDIxMGQsIDB4YTE4YywgMHgwMGZmLCAweDIxNmEsIDB4YTAwZSwgMHgyMDExLAorCTB4MDAwMiwgMHgyMTAwLCAweGE1MDYsIDB4MDFhOCwgMHgwODBjLCAweDRmYTksIDB4MTE5MCwgMHg2MDE0LAorCTB4ODIxYywgMHgwMjM4LCAweGEzOTgsIDB4YmNjMCwgMHhhMDg1LCAweGZmMDAsIDB4ODAwNywgMHgyMDFhLAorCTB4MDAzOCwgMHhhMzk4LCAweGJjYzAsIDB4MjMyNCwgMHhhNGE0LCAweGZmMDAsIDB4YTQwNSwgMHgyMDFhLAorCTB4ODIxMCwgMHg4MTA4LCAweGExODIsIDB4MDA4MCwgMHgxMjA4LCAweDBjMTgsIDB4ODIwMSwgMHg4MDA3LAorCTB4MmQwYywgMHhhMTA1LCAweDIwNmEsIDB4MDBkZSwgMHgyMGE5LCAweDAwNDAsIDB4MjBhMSwgMHhiY2MwLAorCTB4MjA5OSwgMHhiY2MwLCAweDA4MGMsIDB4NGI4ZiwgMHgwODA0LCAweDM5ZjIsIDB4MDgwYywgMHgzZTlhLAorCTB4MDkwNCwgMHgyZmQyLCAweDAwYzYsIDB4MDgwYywgMHgzZTc1LCAweDAwY2UsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDAwMiwgMHgwODA0LCAweDJmY2YsIDB4MjAwMSwgMHhiNTUzLCAweDIwMDQsIDB4ZDBiNCwgMHgwNTUwLAorCTB4NzgyNCwgMHhhMDg0LCAweGZmMDAsIDB4YTA4ZSwgMHg3ZTAwLCAweDA1MjAsIDB4YTA4ZSwgMHg3ZjAwLAorCTB4MDUwOCwgMHhhMDhlLCAweDgwMDAsIDB4MDFmMCwgMHg2MDAwLCAweGQwOGMsIDB4MTFkOCwgMHg2MDA0LAorCTB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgxMWE4LCAweDY4MzcsIDB4MDAwMCwgMHg2ODM4LAorCTB4YzBmZCwgMHg2ODNhLCAweDA4MGMsIDB4OWRkYSwgMHgxMTIwLCAweDIwMDksIDB4MDAwMywgMHgwODA0LAorCTB4MmZjZiwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgzYTdlLCAweDAwMDUsIDB4MDgwYywgMHgzZTlhLAorCTB4MDkwNCwgMHgyZmQyLCAweDIwYTksIDB4MDAyYiwgMHgyYzk4LCAweGFkZTgsIDB4MDAwMiwgMHgyZGEwLAorCTB4NTNhMywgMHgyMGE5LCAweDAwMDQsIDB4YWM4MCwgMHgwMDA2LCAweDIwOTgsIDB4YWQ4MCwgMHgwMDA2LAorCTB4MjBhMCwgMHgwODBjLCAweDRiOGYsIDB4MjBhOSwgMHgwMDA0LCAweGFjODAsIDB4MDAwYSwgMHgyMDk4LAorCTB4YWQ4MCwgMHgwMDBhLCAweDIwYTAsIDB4MDgwYywgMHg0YjhmLCAweDJkMDAsIDB4MjAwOSwgMHgwMDJiLAorCTB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgwODA0LCAweDNlYjksIDB4ODFmZiwgMHgxOTA0LAorCTB4MmZjZiwgMHgwODBjLCAweDNlOGEsIDB4MDkwNCwgMHgyZmQyLCAweDA4MGMsIDB4NTE4NiwgMHgwODA0LAorCTB4MmZhYSwgMHg4MWZmLCAweDE5MDQsIDB4MmZjZiwgMHg3ODI4LCAweGEwOGEsIDB4MTAwMCwgMHgxYTA0LAorCTB4MmZkMiwgMHgwODBjLCAweDNlOWEsIDB4MDkwNCwgMHgyZmQyLCAweDA4MGMsIDB4NTFlOSwgMHgwOTA0LAorCTB4MmZjZiwgMHgyMDE5LCAweDAwMDQsIDB4YTAwZSwgMHgwODBjLCAweDUxOTgsIDB4NzkyNCwgMHg4MTBmLAorCTB4N2EyOCwgMHgwMDExLCAweDA4MDQsIDB4MmZhYSwgMHhhMTg2LCAweDAwZmYsIDB4MDExMCwgMHgwMDcxLAorCTB4MDA2MCwgMHgyMDI5LCAweDAwN2UsIDB4MjA2MSwgMHhiNTAwLCAweDY0NTAsIDB4MjQwMCwgMHhhNTA2LAorCTB4MDExMCwgMHgyNTA4LCAweDAwMTksIDB4ODUyOSwgMHgxZWM4LCAweDAwMDUsIDB4MDgwYywgMHg0ZmE5LAorCTB4MTEzOCwgMHgyMjAwLCAweDgwMDMsIDB4ODAwYiwgMHg4MTBiLCAweGExMDgsIDB4MDgwYywgMHg2OWE4LAorCTB4MDAwNSwgMHg4MWZmLCAweDE5MDQsIDB4MmZjZiwgMHgwODBjLCAweDNlOGEsIDB4MDkwNCwgMHgyZmQyLAorCTB4MDgwYywgMHg1MDZmLCAweDA5MDQsIDB4MmZjZiwgMHgwODBjLCAweDUxOGYsIDB4MDgwNCwgMHgyZmFhLAorCTB4ODFmZiwgMHgxOTA0LCAweDJmY2YsIDB4MDgwYywgMHgzZThhLCAweDA5MDQsIDB4MmZkMiwgMHgwODBjLAorCTB4NTA2ZiwgMHgwOTA0LCAweDJmY2YsIDB4MDgwYywgMHg1MTdkLCAweDA4MDQsIDB4MmZhYSwgMHg2MTAwLAorCTB4MDgwNCwgMHgyZmFhLCAweDA4MGMsIDB4M2U5YSwgMHgwOTA0LCAweDJmZDIsIDB4MjAwMSwgMHhiNTAwLAorCTB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MTkwNCwgMHgyZmNmLCAweDAwZDYsIDB4YWNlOCwgMHgwMDBhLAorCTB4NzkyNCwgMHhkMTg0LCAweDAxMTAsIDB4YWNlOCwgMHgwMDA2LCAweDY4MGMsIDB4ODAwNywgMHg3ODNlLAorCTB4NjgwOCwgMHg4MDA3LCAweDc4M2EsIDB4NmIwNCwgMHg4MzFmLCAweDZhMDAsIDB4ODIxNywgMHgwMGRlLAorCTB4NjEwMCwgMHhhMThjLCAweDAyMDAsIDB4MDgwNCwgMHgyZmFhLCAweDc4MjQsIDB4YTA5YywgMHgwMDAzLAorCTB4ZDBiNCwgMHgxMTYwLCAweGEzOWEsIDB4MDAwMywgMHgxYTA0LCAweDJmY2YsIDB4NjI1MCwgMHhhMjk0LAorCTB4MDBmZiwgMHhhMDg0LCAweGZmMDAsIDB4ODAwNywgMHhhMjA2LCAweDExNTAsIDB4MjAwMSwgMHhiNTQwLAorCTB4MjAwOSwgMHgwMDBjLCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MDgwNCwgMHgzZWI5LAorCTB4ODFmZiwgMHgxOTA0LCAweDJmY2YsIDB4MDgwYywgMHgzZTlhLCAweDA5MDQsIDB4MmZkMiwgMHg2MDA0LAorCTB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgxOTA0LCAweDJmY2YsIDB4MDBjNiwgMHgwODBjLAorCTB4M2U3NSwgMHgwMGNlLCAweDA5MDQsIDB4MmZjZiwgMHg2ODM3LCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLAorCTB4NjgzYSwgMHgwODBjLCAweDlkODYsIDB4MDkwNCwgMHgyZmNmLCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLAorCTB4M2I2YSwgMHgwMDA1LCAweDY4MzAsIDB4YTA4NiwgMHgwMTAwLCAweDA5MDQsIDB4MmZjZiwgMHhhZDgwLAorCTB4MDAwZSwgMHgyMDA5LCAweDAwMGMsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgwODA0LAorCTB4M2ViOSwgMHhhMDA2LCAweDA4MGMsIDB4Mjg2NywgMHg3ODI0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LAorCTB4MDBmZiwgMHgwMTE4LCAweDgxZmYsIDB4MTkwNCwgMHgyZmNmLCAweDA4MGMsIDB4NWFjZiwgMHgwMTEwLAorCTB4MDgwYywgMHg0YmYwLCAweDc4MjgsIDB4YTA4YSwgMHgxMDAwLCAweDFhMDQsIDB4MmZkMiwgMHg3OTI0LAorCTB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE4NiwgMHgwMGZmLCAweDAxMzgsIDB4YTE4MiwgMHgwMDdmLAorCTB4MWEwNCwgMHgyZmQyLCAweDIxMDAsIDB4MDgwYywgMHgyODMxLCAweDAwMjYsIDB4MDBjNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNjEsIDB4YjdmMywgMHg2MDFiLCAweDAwMDAsIDB4NjAxZiwgMHgwMDAwLAorCTB4MDgwYywgMHg1YWNmLCAweDExNzgsIDB4MjAwMSwgMHhiNzlmLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLAorCTB4YjUwMCwgMHgyMDAzLCAweDAwMDEsIDB4YTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4NWIxMywgMHgwODBjLAorCTB4NWEwNywgMHgwNDIwLCAweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweDgwNzUsIDB4MjAxMSwgMHgwMDAyLAorCTB4MDgwYywgMHg4MDdmLCAweDA4MGMsIDB4N2Y1OSwgMHgwMDM2LCAweDIwMTksIDB4MDAwMCwgMHgwODBjLAorCTB4N2ZlNCwgMHgwMDNlLCAweDIwNjEsIDB4MDEwMCwgMHgyMDAxLCAweGI1MTUsIDB4MjAwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHg4MTBmLCAweGExMDUsIDB4NjA0YSwgMHg2MDQzLCAweDAwOTAsIDB4NjA0MywgMHgwMDEwLAorCTB4MjAwOSwgMHgwMDJkLCAweDIwMTEsIDB4NGI1NCwgMHgwODBjLCAweDZhMjIsIDB4NzkyNCwgMHhhMThjLAorCTB4ZmYwMCwgMHg4MTBmLCAweDA4MGMsIDB4NWFjZiwgMHgxMTEwLCAweDIwMDksIDB4MDBmZiwgMHg3YTI4LAorCTB4MDgwYywgMHgzYWNjLCAweDAxMmUsIDB4MDBjZSwgMHgwMDJlLCAweDA4MDQsIDB4MmZhYSwgMHg3OTI0LAorCTB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MDBjNiwgMHgwODBjLCAweDRmNGQsIDB4MmMwOCwgMHgwMGNlLAorCTB4MTkwNCwgMHgyZmQyLCAweDA4MDQsIDB4MmZhYSwgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLAorCTB4MDgwNCwgMHgyZmNmLCAweDYwZDQsIDB4ZDBhYywgMHgxMTMwLCAweGQwOWMsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDAwNSwgMHgwODA0LCAweDJmY2YsIDB4MDgwYywgMHgzZTc1LCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLAorCTB4MDgwNCwgMHgyZmNmLCAweDc5MjQsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgwODBjLAorCTB4M2ViNiwgMHg3MDFiLCAweDNjMWMsIDB4MDAwNSwgMHgyMDA5LCAweDAwODAsIDB4MDgwYywgMHg0ZmE5LAorCTB4MTEzMCwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDEyMCwgMHgyMDIxLAorCTB4NDAwYSwgMHgwODA0LCAweDJmYWMsIDB4MDBkNiwgMHhhZGU4LCAweDAwMGQsIDB4NjkwMCwgMHg2YTA4LAorCTB4NmIwYywgMHg2YzEwLCAweDZkMTQsIDB4NmUxOCwgMHg2ODIwLCAweGEwYmUsIDB4MDEwMCwgMHgwOTA0LAorCTB4M2M5MywgMHhhMGJlLCAweDAxMTIsIDB4MDkwNCwgMHgzYzkzLCAweGEwYmUsIDB4MDExMywgMHgwOTA0LAorCTB4M2M5MywgMHhhMGJlLCAweDAxMTQsIDB4MDkwNCwgMHgzYzkzLCAweGEwYmUsIDB4MDExNywgMHgwOTA0LAorCTB4M2M5MywgMHhhMGJlLCAweDAxMWEsIDB4MDkwNCwgMHgzYzkzLCAweGEwYmUsIDB4MDExYywgMHgwOTA0LAorCTB4M2M5MywgMHhhMGJlLCAweDAxMjEsIDB4MDViMCwgMHhhMGJlLCAweDAxMzEsIDB4MDU5OCwgMHhhMGJlLAorCTB4MDE3MSwgMHgwNWM4LCAweGEwYmUsIDB4MDE3MywgMHgwNWIwLCAweGEwYmUsIDB4MDFhMSwgMHgxMTIwLAorCTB4NjgzMCwgMHg4MDA3LCAweDY4MzIsIDB4MDRhOCwgMHhhMGJlLCAweDAyMTIsIDB4MDU0MCwgMHhhMGJlLAorCTB4MDIxMywgMHgwNTI4LCAweGEwYmUsIDB4MDIxNCwgMHgwMWIwLCAweGEwYmUsIDB4MDIxNywgMHgwMTY4LAorCTB4YTBiZSwgMHgwMjFhLCAweDExMjAsIDB4NjgzOCwgMHg4MDA3LCAweDY4M2EsIDB4MDBlMCwgMHhhMGJlLAorCTB4MDMwMCwgMHgwMWM4LCAweDAwZGUsIDB4MDgwNCwgMHgyZmQyLCAweGFkODAsIDB4MDAxMCwgMHgyMGE5LAorCTB4MDAwNywgMHgwODBjLCAweDNjZDksIDB4YWQ4MCwgMHgwMDBlLCAweDIwYTksIDB4MDAwMSwgMHgwODBjLAorCTB4M2NkOSwgMHgwMDQ4LCAweGFkODAsIDB4MDAwYywgMHgwODBjLCAweDNjZTcsIDB4MDA1MCwgMHhhZDgwLAorCTB4MDAwZSwgMHgwODBjLCAweDNjZTcsIDB4YWQ4MCwgMHgwMDBjLCAweDIwYTksIDB4MDAwMSwgMHgwODBjLAorCTB4M2NkOSwgMHgwMGM2LCAweDA4MGMsIDB4M2U3NSwgMHgwNTY4LCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLAorCTB4NjgzNywgMHgwMTE5LCAweDY4NTMsIDB4MDAwMCwgMHg2ODRmLCAweDAwMjAsIDB4Njg1YiwgMHgwMDAxLAorCTB4ODEwYiwgMHg2OTdlLCAweDY4ODMsIDB4MDAwMCwgMHg2YTg2LCAweDZiOGEsIDB4NmM4ZSwgMHg2ZDkyLAorCTB4Njk5NiwgMHg2ODliLCAweDAwMDAsIDB4MDBjZSwgMHgwMGRlLCAweDY4MzcsIDB4MDAwMCwgMHg2ODM4LAorCTB4YzBmZCwgMHg2ODNhLCAweDY4MjMsIDB4MDAwMCwgMHg2ODA0LCAweDIwNjgsIDB4MDgwYywgMHg5ZGEyLAorCTB4MTEyMCwgMHgyMDA5LCAweDAwMDMsIDB4MDgwNCwgMHgyZmNmLCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLAorCTB4M2NkMCwgMHgwMDA1LCAweDAwY2UsIDB4MDBkZSwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgyZmNmLAorCTB4NjgyMCwgMHhhMDg2LCAweDgwMDEsIDB4MTkwNCwgMHgyZmFhLCAweDIwMDksIDB4MDAwNCwgMHgwODA0LAorCTB4MmZjZiwgMHgwMDE2LCAweDIwMDgsIDB4MjA0NCwgMHg4MDAwLCAweDIwNGMsIDB4ODAwMCwgMHgyOTBhLAorCTB4ODEwOCwgMHgyODBhLCAweDgxMDgsIDB4MWYwNCwgMHgzY2RiLCAweDAwMWUsIDB4MDAwNSwgMHgwMDE2LAorCTB4MDBhNiwgMHgwMGI2LCAweDIwMDgsIDB4MjA0NCwgMHg4MDAwLCAweDIwNGMsIDB4ODAwMCwgMHgyMDU0LAorCTB4ODAwMCwgMHgyMDVjLCAweDJiMGEsIDB4ODEwOCwgMHgyYTBhLCAweDgxMDgsIDB4MjkwYSwgMHg4MTA4LAorCTB4MjgwYSwgMHgwMGJlLCAweDAwYWUsIDB4MDAxZSwgMHgwMDA1LCAweDgxZmYsIDB4MDEyMCwgMHgyMDA5LAorCTB4MDAwMSwgMHgwODA0LCAweDJmY2YsIDB4NjBkNCwgMHhkMGFjLCAweDExMzAsIDB4ZDA5YywgMHgxMTIwLAorCTB4MjAwOSwgMHgwMDA1LCAweDA4MDQsIDB4MmZjZiwgMHg3OTI0LCAweDIxNDAsIDB4YTE4YywgMHhmZjAwLAorCTB4ODEwZiwgMHg2MGQ0LCAweGQwYWMsIDB4MTEyMCwgMHhhMTgyLCAweDAwODAsIDB4MGEwNCwgMHgyZmQyLAorCTB4YTE4MiwgMHgwMGZmLCAweDFhMDQsIDB4MmZkMiwgMHg3YTJjLCAweDdiMjgsIDB4NjA3MCwgMHhhMzA2LAorCTB4MTE0MCwgMHg2MDc0LCAweGEyNGUsIDB4MDkwNCwgMHgyZmQyLCAweGE5Y2MsIDB4ZmYwMCwgMHgwOTA0LAorCTB4MmZkMiwgMHgwMGM2LCAweDA4MGMsIDB4M2RjNSwgMHgyYzY4LCAweDAwY2UsIDB4MDUzMCwgMHhhMGM2LAorCTB4NDAwMCwgMHgxMTc4LCAweDAwYzYsIDB4MDAwNiwgMHgyZDYwLCAweGEwMGUsIDB4MDgwYywgMHg1MjRhLAorCTB4MTEwOCwgMHhjMTg1LCAweDYwMDAsIDB4ZDBiYywgMHgwMTA4LCAweGMxOGQsIDB4MDAwZSwgMHgwMGNlLAorCTB4MDA4OCwgMHhhMGM2LCAweDQwMDcsIDB4MTExMCwgMHgyNDA4LCAweDAwNjAsIDB4YTBjNiwgMHg0MDA4LAorCTB4MTExOCwgMHgyNzA4LCAweDI2MTAsIDB4MDAzMCwgMHhhMGM2LCAweDQwMDksIDB4MTEwOCwgMHgwMDEwLAorCTB4MjAwMSwgMHg0MDA2LCAweDIwMjAsIDB4MDgwNCwgMHgyZmFjLCAweDJkMDAsIDB4NzAyMiwgMHgwMDE2LAorCTB4MDBiNiwgMHgwMGM2LCAweDAwZTYsIDB4MmM3MCwgMHgwODBjLCAweDg1YzcsIDB4MDVkOCwgMHgyZDAwLAorCTB4NjAxYSwgMHgwODBjLCAweGEwMjcsIDB4MmU1OCwgMHgwMGVlLCAweDAwZTYsIDB4MDBjNiwgMHgwODBjLAorCTB4M2U3NSwgMHgwMGNlLCAweDJiNzAsIDB4MTE1MCwgMHgwODBjLCAweDg2MWQsIDB4MDBlZSwgMHgwMGNlLAorCTB4MDBiZSwgMHgwMDFlLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDJmY2YsIDB4NjgzNywgMHgwMDAwLAorCTB4NjgzYiwgMHgwMDAwLCAweDJkMDAsIDB4NjAxMiwgMHg2ODMzLCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLAorCTB4ZDg4YywgMHgwMTA4LCAweGMwZjUsIDB4NjgzYSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLAorCTB4MmM5YywgMHgwMTJlLCAweDYwMWYsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHg0ZWViLAorCTB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NGVmZCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwYywgMHg4NjRjLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwZWUsIDB4MDBjZSwgMHgwMGJlLCAweDAwMWUsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDAwMywgMHgwODA0LCAweDJmY2YsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsIDB4M2RhOCwgMHgwMDA1LAorCTB4NjgzMCwgMHhhMDg2LCAweDAxMDAsIDB4NzAyMCwgMHgyMDYwLCAweDExMzgsIDB4MjAwOSwgMHgwMDA0LAorCTB4NjIwNCwgMHhhMjk0LCAweDAwZmYsIDB4MDgwNCwgMHgyZmNmLCAweDIwMDksIDB4MDAwMCwgMHg2ODM4LAorCTB4ZDBmNCwgMHgxOTA0LCAweDJmYWEsIDB4MDgwYywgMHg1MjRhLCAweDExMDgsIDB4YzE4NSwgMHg2MDAwLAorCTB4ZDBiYywgMHgwMTA4LCAweGMxOGQsIDB4MDgwNCwgMHgyZmFhLCAweDAwZTYsIDB4MDBkNiwgMHhhMDJlLAorCTB4MjAwMSwgMHhiNTM1LCAweDIwMDQsIDB4ZDBhYywgMHgwMTMwLCAweGEwMjYsIDB4MjBhOSwgMHgwMGZmLAorCTB4MjA3MSwgMHhiNjM1LCAweDAwMzAsIDB4MjAyMSwgMHgwMDgwLCAweDIwYTksIDB4MDA3ZiwgMHgyMDcxLAorCTB4YjZiNSwgMHgyZTA0LCAweGEwMDUsIDB4MTEzMCwgMHgyMTAwLCAweGE0MDYsIDB4MTU3MCwgMHgyNDI4LAorCTB4YzVmZCwgMHgwNDU4LCAweDIwNjgsIDB4NmYxMCwgMHgyNzAwLCAweGEzMDYsIDB4MTFiMCwgMHg2ZTE0LAorCTB4MjYwMCwgMHhhMjA2LCAweDExOTAsIDB4MjQwMCwgMHhhMTA2LCAweDExNjAsIDB4MmQ2MCwgMHhkODg0LAorCTB4MDU2OCwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MTUzOCwgMHgyMDAxLAorCTB4NDAwMCwgMHgwNDI4LCAweDIwMDEsIDB4NDAwNywgMHgwNDEwLCAweDI0MDAsIDB4YTEwNiwgMHgxMTY4LAorCTB4NmUxNCwgMHg4N2ZmLCAweDExMzgsIDB4ODZmZiwgMHgwOWQwLCAweDIwMDEsIDB4YjUzNSwgMHgyMDA0LAorCTB4ZDBhYywgMHgxOWE4LCAweDIwMDEsIDB4NDAwOCwgMHgwMDkwLCAweDg0MjAsIDB4OGU3MCwgMHgxZjA0LAorCTB4M2RkOSwgMHg4NWZmLCAweDExMzAsIDB4MjAwMSwgMHg0MDA5LCAweDAwNDgsIDB4MjAwMSwgMHgwMDAxLAorCTB4MDAzMCwgMHgwODBjLCAweDRmNGQsIDB4MWRkMCwgMHg2MzEyLCAweDYyMTYsIDB4YTAwNiwgMHhhMDA1LAorCTB4MDBkZSwgMHgwMGVlLCAweDAwMDUsIDB4ODFmZiwgMHgxOTA0LCAweDJmY2YsIDB4MDgwYywgMHgzZTc1LAorCTB4MDkwNCwgMHgyZmNmLCAweDY4MzcsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHg3ODI0LAorCTB4YTAwNSwgMHgwOTA0LCAweDJmZDIsIDB4YTA5NiwgMHgwMGZmLCAweDAxMjAsIDB4YTA5MiwgMHgwMDA0LAorCTB4MWEwNCwgMHgyZmQyLCAweDIwMTAsIDB4MmQxOCwgMHgwODBjLCAweDJjNGYsIDB4MDkwNCwgMHgyZmNmLAorCTB4NzAwNywgMHgwMDAzLCAweDcwMWIsIDB4M2U0NSwgMHgwMDA1LCAweDY4MzAsIDB4YTA4NiwgMHgwMTAwLAorCTB4MDkwNCwgMHgyZmNmLCAweDA4MDQsIDB4MmZhYSwgMHg3OTI0LCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLAorCTB4NjBkNCwgMHhkMGFjLCAweDExMjAsIDB4YTE4MiwgMHgwMDgwLCAweDBhMDQsIDB4MmZkMiwgMHhhMTgyLAorCTB4MDBmZiwgMHgxYTA0LCAweDJmZDIsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg5YzhhLAorCTB4MTE4OCwgMHhhMTkwLCAweGI2MzUsIDB4MjIwNCwgMHhhMDY1LCAweDAxNjAsIDB4MDgwYywgMHg0YzBiLAorCTB4MjAwMSwgMHhiNTM1LCAweDIwMDQsIDB4ZDBhYywgMHgwMTEwLCAweDYwMTcsIDB4MDAwMCwgMHgwMTJlLAorCTB4MDgwNCwgMHgyZmFhLCAweDAxMmUsIDB4MDgwNCwgMHgyZmNmLCAweDA4MGMsIDB4MTVmOCwgMHgwMTg4LAorCTB4YTAwNiwgMHg2ODAyLCAweDcwMTAsIDB4YTAwNSwgMHgxMTIwLCAweDJkMDAsIDB4NzAxMiwgMHg3MDE2LAorCTB4MDAzMCwgMHg3MDE0LCAweDY4MDIsIDB4MjA2MCwgMHgyZDAwLCAweDYwMDYsIDB4NzAxNiwgMHhhZDgwLAorCTB4MDAwZCwgMHgwMDA1LCAweDc5MjQsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4MDgwYywgMHg0ZmE5LAorCTB4MTEzMCwgMHg3ZTI4LCAweGE2ODQsIDB4M2ZmZiwgMHhhMDgyLCAweDQwMDAsIDB4MDIwOCwgMHhhMDY2LAorCTB4OGNmZiwgMHgwMDA1LCAweDdlMjQsIDB4ODYwZiwgMHhhMThjLCAweDAwZmYsIDB4MDgwYywgMHg0ZmE5LAorCTB4MTEyOCwgMHhhNmI0LCAweDAwZmYsIDB4YTY4MiwgMHg0MDAwLCAweDAyMDgsIDB4YTA2NiwgMHg4Y2ZmLAorCTB4MDAwNSwgMHgwMDE2LCAweDcxMTAsIDB4ODFmZiwgMHgwMTI4LCAweDIxNjgsIDB4NjkwNCwgMHgwODBjLAorCTB4MTYwZiwgMHgwY2M4LCAweDcxMTIsIDB4NzExNiwgMHgwMDFlLCAweDAwMDUsIDB4MjAzMSwgMHgwMDAxLAorCTB4MDAxMCwgMHgyMDMxLCAweDAwMDAsIDB4MjA2MSwgMHhiNWQyLCAweDY2MDYsIDB4NjExMiwgMHg2MDBlLAorCTB4NjIyNiwgMHg2MzJhLCAweDY0MmUsIDB4NjUzMiwgMHgyYzEwLCAweDA4MGMsIDB4MTY0MywgMHg3MDA3LAorCTB4MDAwMiwgMHg3MDFiLCAweDJmYWEsIDB4MDAwNSwgMHgwMGY2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA3OSwgMHgwMDAwLCAweDIwMDEsIDB4YjU5MCwgMHgyMDA0LCAweGEwMDUsIDB4MTE2OCwgMHgwZTA0LAorCTB4M2VlNCwgMHg3ODE4LCAweGQwODQsIDB4MTE0MCwgMHg3YTIyLCAweDdiMjYsIDB4N2MyYSwgMHg3ODFiLAorCTB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MDQwOCwgMHgwMDE2LCAweDAwYzYsIDB4MDBlNiwgMHgyMDcxLAorCTB4YjU4MiwgMHg3MTM4LCAweGExODIsIDB4MDAxMCwgMHgwMjE4LCAweDcwMzAsIDB4MjA2MCwgMHgwMDc4LAorCTB4NzAzMCwgMHhhMGUwLCAweDAwMDQsIDB4YWM4MiwgMHhiNWQyLCAweDAyMTAsIDB4MjA2MSwgMHhiNTkyLAorCTB4MmMwMCwgMHg3MDMyLCAweDgxZmYsIDB4MTEwOCwgMHg3MDM2LCAweDgxMDgsIDB4NzEzYSwgMHgyMjYyLAorCTB4NjMwNiwgMHg2NDBhLCAweDAwZWUsIDB4MDBjZSwgMHgwMDFlLCAweDAxMmUsIDB4MDBmZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgyMDcxLCAweGI1ODIsIDB4NzAzOCwgMHhhMDA1LCAweDA1NzAsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwZTA0LCAweDNmM2IsIDB4MDBmNiwgMHgyMDc5LCAweDAwMDAsIDB4NzgxOCwgMHhkMDg0LAorCTB4MTUwOCwgMHgwMGM2LCAweDcwMzQsIDB4MjA2MCwgMHgyYzA0LCAweDc4MjIsIDB4NjAwNCwgMHg3ODI2LAorCTB4NjAwOCwgMHg3ODJhLCAweDc4MWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4NzAzOCwgMHg4MDAxLAorCTB4NzAzYSwgMHhhMDA1LCAweDExMzAsIDB4NzAzMywgMHhiNTkyLCAweDcwMzcsIDB4YjU5MiwgMHgwMGNlLAorCTB4MDA0OCwgMHhhYzgwLCAweDAwMDQsIDB4YTBmYSwgMHhiNWQyLCAweDAyMTAsIDB4MjAwMSwgMHhiNTkyLAorCTB4NzAzNiwgMHgwMGNlLCAweDAwZmUsIDB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4MDAyNiwgMHgyMDAxLAorCTB4YjU1MywgMHgyMDA0LCAweGQwYzQsIDB4MDEyMCwgMHgyMDExLCAweDgwMTQsIDB4MDgwYywgMHgzZWNjLAorCTB4MDAyZSwgMHgwMDA1LCAweDgxZmYsIDB4MTkwNCwgMHgyZmNmLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjAzMCwgMHhjMDhkLCAweGMwODUsIDB4YzBhYywgMHg2MDMyLCAweDA4MGMsIDB4NWFjZiwgMHgxMTc4LAorCTB4MjAwMSwgMHhiNzlmLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLCAweGI1MDAsIDB4MjAwMywgMHgwMDAxLAorCTB4YTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4NWIxMywgMHgwODBjLCAweDVhMDcsIDB4MDAxMCwgMHgwODBjLAorCTB4NGIxZiwgMHgwMTJlLCAweDA4MDQsIDB4MmZhYSwgMHg3ODI0LCAweDIwMDgsIDB4YTE4YywgMHhmZmZkLAorCTB4MTEyOCwgMHg2MWUwLCAweGExMGQsIDB4NjFlMiwgMHgwODA0LCAweDJmYWEsIDB4MDgwNCwgMHgyZmQyLAorCTB4ODFmZiwgMHgxOTA0LCAweDJmY2YsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDMsIDB4MTkwNCwgMHgyZmNmLAorCTB4MjAwMSwgMHhiNTUzLCAweDIwMDQsIDB4ZDBhYywgMHgxOTA0LCAweDJmY2YsIDB4MDgwYywgMHgzZTlhLAorCTB4MDkwNCwgMHgyZmQyLCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgxMTIwLAorCTB4NzgyOCwgMHhhMDA1LCAweDA5MDQsIDB4MmZhYSwgMHgwMGM2LCAweDA4MGMsIDB4M2U3NSwgMHgwMGNlLAorCTB4MDkwNCwgMHgyZmNmLCAweDY4MzcsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLAorCTB4NjgzYSwgMHgwODBjLCAweDllNmIsIDB4MDkwNCwgMHgyZmNmLCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLAorCTB4M2ZhYSwgMHgwMDA1LCAweDY4MzAsIDB4YTA4NiwgMHgwMTAwLCAweDA5MDQsIDB4MmZjZiwgMHgwODA0LAorCTB4MmZhYSwgMHgyMDAxLCAweGI1MDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MTkwNCwgMHgyZmNmLAorCTB4N2YyNCwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDA4MGMsIDB4M2U3NSwgMHgwOTA0LAorCTB4MmZjZiwgMHgyMDA5LCAweDAwMDAsIDB4MjAzMSwgMHgwMDAwLCAweDcwMjMsIDB4MDAwMCwgMHg3MDJmLAorCTB4MDAwMCwgMHhhZDgwLCAweDAwMDUsIDB4NzAyNiwgMHgyMGEwLCAweDA4MGMsIDB4NGZhOSwgMHgxOTA0LAorCTB4NDAyNCwgMHg2MDA0LCAweGEwYzQsIDB4MDBmZiwgMHhhOGM2LCAweDAwMDYsIDB4MDEzMCwgMHhhMGM0LAorCTB4ZmYwMCwgMHhhOGM2LCAweDA2MDAsIDB4MTkwNCwgMHg0MDI0LCAweDIwMDEsIDB4YjU1MywgMHgyMDA0LAorCTB4ZDBhYywgMHgxMTI4LCAweDA4MGMsIDB4NTI0YSwgMHgxMTEwLCAweGQ3OWMsIDB4MDVlOCwgMHhkNzk0LAorCTB4MTExMCwgMHhkNzg0LCAweDAxNTgsIDB4YWM4MCwgMHgwMDA2LCAweDIwOTgsIDB4MzQwMCwgMHgyMGE5LAorCTB4MDAwNCwgMHg1M2EzLCAweDA4MGMsIDB4M2NlNywgMHhkNzk0LCAweDAxNDgsIDB4YWM4MCwgMHgwMDBhLAorCTB4MjA5OCwgMHgzNDAwLCAweDIwYTksIDB4MDAwNCwgMHg1M2EzLCAweDA4MGMsIDB4M2NlNywgMHgyMWEyLAorCTB4ZDc5NCwgMHgwMWQ4LCAweGFjODAsIDB4MDAwMCwgMHgyMDk4LCAweDk0YTAsIDB4MjBhOSwgMHgwMDAyLAorCTB4NTNhMywgMHhhYzgwLCAweDAwMDMsIDB4MjBhNiwgMHg5NGEwLCAweGFjODAsIDB4MDAwNCwgMHgyMDk4LAorCTB4MzQwMCwgMHgyMGE5LCAweDAwMDIsIDB4NTNhMywgMHgwODBjLCAweDNjZDksIDB4YWM4MCwgMHgwMDI2LAorCTB4MjA5OCwgMHgyMGE5LCAweDAwMDIsIDB4NTNhMywgMHgwMDA4LCAweDk0YTAsIDB4ZDc5NCwgMHgwMTEwLAorCTB4YTZiMCwgMHgwMDBiLCAweGE2YjAsIDB4MDAwNSwgMHg4MTA4LCAweDIwMDEsIDB4YjUzNSwgMHgyMDA0LAorCTB4ZDBhYywgMHgwMTE4LCAweGExODYsIDB4MDEwMCwgMHgwMDQwLCAweGQ3OGMsIDB4MDEyMCwgMHhhMTg2LAorCTB4MDEwMCwgMHgwMTcwLCAweDAwMTgsIDB4YTE4NiwgMHgwMDdlLCAweDAxNTAsIDB4ZDc5NCwgMHgwMTE4LAorCTB4YTY4NiwgMHgwMDIwLCAweDAwMTAsIDB4YTY4NiwgMHgwMDI4LCAweDAxNTAsIDB4MDgwNCwgMHgzZmNkLAorCTB4ODZmZiwgMHgxMTIwLCAweDcxMjAsIDB4ODEwYiwgMHgwODA0LCAweDJmYWEsIDB4NzAyZiwgMHgwMDAxLAorCTB4NzExZSwgMHg3MDIwLCAweGE2MDAsIDB4NzAyMiwgMHg3NzJhLCAweDIwNjEsIDB4YjVkMiwgMHg2MDA3LAorCTB4MDAwMCwgMHg2NjEyLCAweDcwMjQsIDB4NjAwZSwgMHg2MjI2LCAweDYzMmEsIDB4NjQyZSwgMHg2NTMyLAorCTB4MmMxMCwgMHgwODBjLCAweDE2NDMsIDB4NzAwNywgMHgwMDAyLCAweDcwMWIsIDB4NDA2MCwgMHgwMDA1LAorCTB4NzAyYywgMHhhMDA1LCAweDExNzAsIDB4NzExYywgMHg3MDI0LCAweDIwYTAsIDB4NzcyOCwgMHgyMDMxLAorCTB4MDAwMCwgMHgyMDYxLCAweGI1ZDIsIDB4NjIyNCwgMHg2MzI4LCAweDY0MmMsIDB4NjUzMCwgMHgwODA0LAorCTB4M2ZjZCwgMHg3MTIwLCAweDgxMGIsIDB4MDgwNCwgMHgyZmFhLCAweDIwMjksIDB4MDA3ZSwgMHg3OTI0LAorCTB4N2EyOCwgMHg3YjJjLCAweDdjMzgsIDB4YTE4NCwgMHhmZjAwLCAweDgwMDcsIDB4YTBlMiwgMHgwMDIwLAorCTB4MGEwNCwgMHgyZmQyLCAweGE1MDIsIDB4MGEwNCwgMHgyZmQyLCAweGExODQsIDB4MDBmZiwgMHhhMGUyLAorCTB4MDAyMCwgMHgwYTA0LCAweDJmZDIsIDB4YTUwMiwgMHgwYTA0LCAweDJmZDIsIDB4YTI4NCwgMHhmZjAwLAorCTB4ODAwNywgMHhhMGUyLCAweDAwMjAsIDB4MGEwNCwgMHgyZmQyLCAweGE1MDIsIDB4MGEwNCwgMHgyZmQyLAorCTB4YTI4NCwgMHgwMGZmLCAweGEwZTIsIDB4MDAyMCwgMHgwYTA0LCAweDJmZDIsIDB4YTUwMiwgMHgwYTA0LAorCTB4MmZkMiwgMHhhMzg0LCAweGZmMDAsIDB4ODAwNywgMHhhMGUyLCAweDAwMjAsIDB4MGEwNCwgMHgyZmQyLAorCTB4YTUwMiwgMHgwYTA0LCAweDJmZDIsIDB4YTM4NCwgMHgwMGZmLCAweGEwZTIsIDB4MDAyMCwgMHgwYTA0LAorCTB4MmZkMiwgMHhhNTAyLCAweDBhMDQsIDB4MmZkMiwgMHhhNDg0LCAweGZmMDAsIDB4ODAwNywgMHhhMGUyLAorCTB4MDAyMCwgMHgwYTA0LCAweDJmZDIsIDB4YTUwMiwgMHgwYTA0LCAweDJmZDIsIDB4YTQ4NCwgMHgwMGZmLAorCTB4YTBlMiwgMHgwMDIwLCAweDBhMDQsIDB4MmZkMiwgMHhhNTAyLCAweDBhMDQsIDB4MmZkMiwgMHgyMDYxLAorCTB4YjdiOSwgMHg2MTAyLCAweDYyMDYsIDB4NjMwYSwgMHg2NDBlLCAweDA4MDQsIDB4MmZhYSwgMHgwMDA2LAorCTB4MjAwMSwgMHhiNTUzLCAweDIwMDQsIDB4ZDBjYywgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLAorCTB4YjU3MiwgMHgyMDA0LCAweGQwYmMsIDB4MDAwZSwgMHgwMDA1LCAweDYxNjgsIDB4N2EyNCwgMHg2MzAwLAorCTB4ODJmZiwgMHgxMTE4LCAweDc5MjYsIDB4MDgwNCwgMHgyZmFhLCAweDgzZmYsIDB4MTkwNCwgMHgyZmQyLAorCTB4MjAwMSwgMHhmZmYwLCAweGEyMDAsIDB4MWEwNCwgMHgyZmQyLCAweDIwMTksIDB4ZmZmZiwgMHg2MDZjLAorCTB4YTMwMiwgMHhhMjAwLCAweDBhMDQsIDB4MmZkMiwgMHg3OTI2LCAweDYyNmEsIDB4MDgwNCwgMHgyZmFhLAorCTB4MjAwMSwgMHhiNTAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLCAweDE5MDQsIDB4MmZjZiwgMHg3YzI4LAorCTB4N2QyNCwgMHg3ZTM4LCAweDdmMmMsIDB4MDgwYywgMHgzZTc1LCAweDA5MDQsIDB4MmZjZiwgMHgyMDA5LAorCTB4MDAwMCwgMHgyMDE5LCAweDAwMDAsIDB4NzAyMywgMHgwMDAwLCAweDcwMmYsIDB4MDAwMCwgMHhhZDgwLAorCTB4MDAwMywgMHg3MDI2LCAweDIwYTAsIDB4YTFlMCwgMHhiNjM1LCAweDJjNjQsIDB4OGNmZiwgMHgwMWI4LAorCTB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDAxMzAsIDB4NjAwNCwgMHhhMDg0LAorCTB4ZmYwMCwgMHhhMDg2LCAweDA2MDAsIDB4MTE1OCwgMHg2MDE0LCAweDIwYTIsIDB4OTRhMCwgMHg2MDEwLAorCTB4ODAwNywgMHhhMTA1LCAweDgwMDcsIDB4MjBhMiwgMHg5NGEwLCAweGEzOTgsIDB4MDAwMiwgMHg4MTA4LAorCTB4YTE4MiwgMHgwMGZmLCAweDAxMjAsIDB4YTM4NiwgMHgwMDJhLCAweDAxNDgsIDB4MDhlMCwgMHg4M2ZmLAorCTB4MTEyMCwgMHg3MTIwLCAweDgxMGMsIDB4MDgwNCwgMHgyZmFhLCAweDcwMmYsIDB4MDAwMSwgMHg3MTFlLAorCTB4NzAyMCwgMHhhMzAwLCAweDcwMjIsIDB4MjA2MSwgMHhiNWQyLCAweDYwMDcsIDB4MDAwMCwgMHg2MzEyLAorCTB4NzAyNCwgMHg2MDBlLCAweDY0MjYsIDB4NjUyYSwgMHg2NjJlLCAweDY3MzIsIDB4MmMxMCwgMHgwODBjLAorCTB4MTY0MywgMHg3MDA3LCAweDAwMDIsIDB4NzAxYiwgMHg0MTU2LCAweDAwMDUsIDB4NzAyYywgMHhhMDA1LAorCTB4MTE2OCwgMHg3MTFjLCAweDcwMjQsIDB4MjBhMCwgMHgyMDE5LCAweDAwMDAsIDB4MjA2MSwgMHhiNWQyLAorCTB4NjQyNCwgMHg2NTI4LCAweDY2MmMsIDB4NjczMCwgMHgwODA0LCAweDQxMTMsIDB4NzEyMCwgMHg4MTBjLAorCTB4MDgwNCwgMHgyZmFhLCAweDgxZmYsIDB4MTkwNCwgMHgyZmNmLCAweDYwZDQsIDB4ZDBhYywgMHgxMTE4LAorCTB4ZDA5YywgMHgwOTA0LCAweDJmY2YsIDB4MDgwYywgMHgzZTc1LCAweDA5MDQsIDB4MmZjZiwgMHg3OTI0LAorCTB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgwODBjLCAweDNlYjYsIDB4NzAxYiwgMHg0MTgxLAorCTB4MDAwNSwgMHgwMGQ2LCAweGFkZTgsIDB4MDAwZCwgMHg2ODI4LCAweGEwYmUsIDB4NzAwMCwgMHgwMTQ4LAorCTB4YTBiZSwgMHg3MTAwLCAweDAxMzAsIDB4YTBiZSwgMHg3MjAwLCAweDAxMTgsIDB4MDBkZSwgMHgwODA0LAorCTB4MmZkMiwgMHg2ODIwLCAweDY5MjQsIDB4MDgwYywgMHgyODFkLCAweDE1MTAsIDB4MDgwYywgMHg0ZjRkLAorCTB4MTFmOCwgMHg3MTIyLCAweDY2MTIsIDB4NjUxNiwgMHg2ZTE4LCAweDAwYzYsIDB4MDgwYywgMHgzZTc1LAorCTB4MDFiOCwgMHgwODBjLCAweDNlNzUsIDB4MDFhMCwgMHgwMGNlLCAweDAwZGUsIDB4NjgzNywgMHgwMDAwLAorCTB4NjgzOCwgMHhjMGZkLCAweDY4M2EsIDB4NjgyMywgMHgwMDAwLCAweDY4MDQsIDB4MjA2OCwgMHgwODBjLAorCTB4OWRiZSwgMHgwOTA0LCAweDJmY2YsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsIDB4NDFiYiwgMHgwMDA1LAorCTB4MDBkZSwgMHgwODA0LCAweDJmY2YsIDB4NzEyMCwgMHgwODBjLCAweDJkOTcsIDB4NjgyMCwgMHhhMDg2LAorCTB4ODAwMSwgMHgwOTA0LCAweDJmY2YsIDB4MmQwMCwgMHg3MDFlLCAweDY4MDQsIDB4YTA4MCwgMHgwMDAyLAorCTB4MDAwNiwgMHgyMGE5LCAweDAwMmEsIDB4MjA5OCwgMHgyMGEwLCAweDA4MGMsIDB4NGI4ZiwgMHgwMDBlLAorCTB4YWRlOCwgMHgwMDBkLCAweDZhMDgsIDB4NmIwYywgMHg2YzEwLCAweDZkMTQsIDB4MjA2MSwgMHhiNWQyLAorCTB4NjAwNywgMHgwMDAwLCAweDZlMDAsIDB4NmYyOCwgMHhhN2M2LCAweDcwMDAsIDB4MTEwOCwgMHgwMDE4LAorCTB4YTdjNiwgMHg3MTAwLCAweDExNDAsIDB4YTZjMiwgMHgwMDA0LCAweDBhMDQsIDB4MmZkMiwgMHgyMDA5LAorCTB4MDAwNCwgMHgwODA0LCAweDNlYjksIDB4YTdjNiwgMHg3MjAwLCAweDE5MDQsIDB4MmZkMiwgMHhhNmMyLAorCTB4MDA1NCwgMHgwYTA0LCAweDJmZDIsIDB4NjAwZSwgMHg2MDEzLCAweDAwMmEsIDB4NjIyNiwgMHg2MzJhLAorCTB4NjQyZSwgMHg2NTMyLCAweDJjMTAsIDB4MDgwYywgMHgxNjQzLCAweDcwMDcsIDB4MDAwMiwgMHg3MDFiLAorCTB4NDIwMiwgMHgwMDA1LCAweDcwMWMsIDB4MjA2OCwgMHg2ODA0LCAweGEwODAsIDB4MDAwMSwgMHgyMDA0LAorCTB4YTA4MCwgMHgwMDAyLCAweDAwMDYsIDB4MjBhOSwgMHgwMDJhLCAweDIwOTgsIDB4MjBhMCwgMHgwODBjLAorCTB4NGI4ZiwgMHgwMDBlLCAweDIwMDksIDB4MDAyYSwgMHgyMDYxLCAweGI1ZDIsIDB4NjIyNCwgMHg2MzI4LAorCTB4NjQyYywgMHg2NTMwLCAweDA4MDQsIDB4M2ViOSwgMHg4MWZmLCAweDE5MDQsIDB4MmZjZiwgMHg3OTJjLAorCTB4MjAwMSwgMHhiN2EwLCAweDIxMDIsIDB4MDgwYywgMHgzZThhLCAweDA5MDQsIDB4MmZkMiwgMHgwODBjLAorCTB4NTA2ZiwgMHgwOTA0LCAweDJmY2YsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg1MWExLAorCTB4MDEyZSwgMHgwODA0LCAweDJmYWEsIDB4NzgyNCwgMHhkMDhjLCAweDExMTgsIDB4ZDA4NCwgMHgwOTA0LAorCTB4M2E0NiwgMHgwODBjLCAweDNlOWEsIDB4MDkwNCwgMHgyZmQyLCAweDAwYzYsIDB4MDgwYywgMHgzZTc1LAorCTB4MDBjZSwgMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDJmY2YsIDB4NjAwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDEyOCwgMHhhMDhlLCAweDAwMDQsIDB4MDExMCwgMHhhMDhlLAorCTB4MDAwNSwgMHgxNWI4LCAweDc4MjQsIDB4ZDA4YywgMHgwMTIwLCAweDYwMDAsIDB4YzA4YywgMHg2MDAyLAorCTB4MDAzMCwgMHgyMDAxLCAweGI1NTMsIDB4MjAwNCwgMHhkMGI0LCAweDA5MDQsIDB4M2E4MiwgMHg3ODI0LAorCTB4YTA4NCwgMHhmZjAwLCAweGEwOGUsIDB4N2UwMCwgMHgwOTA0LCAweDNhODIsIDB4YTA4ZSwgMHg3ZjAwLAorCTB4MDkwNCwgMHgzYTgyLCAweGEwOGUsIDB4ODAwMCwgMHgwOTA0LCAweDNhODIsIDB4NjAwMCwgMHhkMDhjLAorCTB4MTkwNCwgMHgzYTgyLCAweDY4MzcsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHgwODBjLAorCTB4OWRkYSwgMHgxMTIwLCAweDIwMDksIDB4MDAwMywgMHgwODA0LCAweDJmY2YsIDB4NzAwNywgMHgwMDAzLAorCTB4NzAxYiwgMHg0MjgzLCAweDAwMDUsIDB4MDgwYywgMHgzZTlhLCAweDA5MDQsIDB4MmZkMiwgMHgwODA0LAorCTB4M2E4MiwgMHgyMDA5LCAweGI1MzEsIDB4MjEwYywgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLAorCTB4MDgwNCwgMHgyZmNmLCAweDIwMDEsIDB4YjUwMCwgMHgyMDA0LCAweGEwODYsIDB4MDAwMywgMHgwMTIwLAorCTB4MjAwOSwgMHgwMDA3LCAweDA4MDQsIDB4MmZjZiwgMHgyMDAxLCAweGI1NTMsIDB4MjAwNCwgMHhkMGFjLAorCTB4MDEyMCwgMHgyMDA5LCAweDAwMDgsIDB4MDgwNCwgMHgyZmNmLCAweDYwOWMsIDB4ZDBhNCwgMHgxMTE4LAorCTB4ZDBhYywgMHgxOTA0LCAweDNhODIsIDB4NjgzNywgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LAorCTB4YzBmZCwgMHg2ODNhLCAweDA4MGMsIDB4OWU2YiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMywgMHgwODA0LAorCTB4MmZjZiwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHg0MmJlLCAweDAwMDUsIDB4NjgzMCwgMHhhMDg2LAorCTB4MDEwMCwgMHgxMTIwLCAweDIwMDksIDB4MDAwNCwgMHgwODA0LCAweDJmY2YsIDB4MDgwYywgMHgzZTlhLAorCTB4MDkwNCwgMHgyZmQyLCAweDA4MDQsIDB4NDI1MiwgMHg4MWZmLCAweDIwMDksIDB4MDAwMSwgMHgxOTA0LAorCTB4MmZjZiwgMHg2MDAwLCAweGEwODYsIDB4MDAwMywgMHgyMDA5LCAweDAwMDcsIDB4MTkwNCwgMHgyZmNmLAorCTB4MjAwMSwgMHhiNTUzLCAweDIwMDQsIDB4ZDBhYywgMHgyMDA5LCAweDAwMDgsIDB4MTkwNCwgMHgyZmNmLAorCTB4MDgwYywgMHgzZTlhLCAweDA5MDQsIDB4MmZkMiwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LAorCTB4MDAwNiwgMHgyMDA5LCAweDAwMDksIDB4MTkwNCwgMHgyZmNmLCAweDAwYzYsIDB4MDgwYywgMHgzZTc1LAorCTB4MDBjZSwgMHgyMDA5LCAweDAwMDIsIDB4MDkwNCwgMHgyZmNmLCAweDY4MzcsIDB4MDAwMCwgMHg2ODMzLAorCTB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHg3OTI4LCAweGExOTQsIDB4ZmYwMCwgMHhhMThjLAorCTB4MDBmZiwgMHhhMDA2LCAweDgyZmYsIDB4MTEyOCwgMHhjMGVkLCAweDY5NTIsIDB4NzkyYywgMHg2OTU2LAorCTB4MDA0OCwgMHhhMjhlLCAweDAxMDAsIDB4MTkwNCwgMHgyZmQyLCAweGMwZTUsIDB4Njg1MywgMHgwMDAwLAorCTB4Njg1NywgMHgwMDAwLCAweDY4M2UsIDB4MDgwYywgMHhhMDI4LCAweDIwMDksIDB4MDAwMywgMHgwOTA0LAorCTB4MmZjZiwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHg0MzFlLCAweDAwMDUsIDB4NjgzMCwgMHhhMDg2LAorCTB4MDEwMCwgMHgyMDA5LCAweDAwMDQsIDB4MDkwNCwgMHgyZmNmLCAweDA4MDQsIDB4MmZhYSwgMHg4MWZmLAorCTB4MjAwOSwgMHgwMDAxLCAweDE5MDQsIDB4MmZjZiwgMHg2MDAwLCAweGEwODYsIDB4MDAwMywgMHgyMDA5LAorCTB4MDAwNywgMHgxOTA0LCAweDJmY2YsIDB4MDgwYywgMHgzZTlhLCAweDA5MDQsIDB4MmZkMiwgMHg2MDA0LAorCTB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgyMDA5LCAweDAwMDksIDB4MTkwNCwgMHgyZmNmLAorCTB4MDBjNiwgMHgwODBjLCAweDNlNzUsIDB4MDBjZSwgMHgyMDA5LCAweDAwMDIsIDB4MDkwNCwgMHgyZmNmLAorCTB4YWQ4MCwgMHgwMDBmLCAweDIwMDksIDB4MDAwOCwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LAorCTB4MDgwYywgMHgzZWI2LCAweDcwMWIsIDB4NDM1NSwgMHgwMDA1LCAweDAwZDYsIDB4YWRlOCwgMHgwMDBmLAorCTB4NjgwMCwgMHhhMDg2LCAweDA1MDAsIDB4MTE0MCwgMHg2ODA0LCAweGEwMDUsIDB4MTEyOCwgMHg2ODA4LAorCTB4YTA4NCwgMHhmZjAwLCAweDExMDgsIDB4MDAxOCwgMHgwMGRlLCAweDE5MDQsIDB4MmZkMiwgMHgwMGRlLAorCTB4NjgzNywgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHgwMGM2LAorCTB4MDgwYywgMHgzZTlhLCAweDExMTgsIDB4MDBjZSwgMHgwODA0LCAweDJmZDIsIDB4MDgwYywgMHhhMDc3LAorCTB4MjAwOSwgMHgwMDAzLCAweDAwY2UsIDB4MDkwNCwgMHgyZmNmLCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLAorCTB4NDM4MiwgMHgwMDA1LCAweDY4MzAsIDB4YTA4NiwgMHgwMTAwLCAweDIwMDksIDB4MDAwNCwgMHgwOTA0LAorCTB4MmZjZiwgMHgwODA0LCAweDJmYWEsIDB4ODFmZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwMSwgMHgwODA0LAorCTB4MmZjZiwgMHg2MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMTIwLCAweDIwMDksIDB4MDAwNywgMHgwODA0LAorCTB4MmZjZiwgMHg3ZTI0LCAweDg2MGYsIDB4YTE4YywgMHgwMGZmLCAweGE2YjQsIDB4MDBmZiwgMHgwODBjLAorCTB4NGZhOSwgMHgxOTA0LCAweDJmZDIsIDB4YTE4NiwgMHgwMDdmLCAweDAxNTAsIDB4NjAwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDksIDB4MDgwNCwgMHgyZmNmLAorCTB4MDBjNiwgMHgwODBjLCAweDNlNzUsIDB4MDBjZSwgMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LAorCTB4MmZjZiwgMHg2ODM3LCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLCAweDY4M2EsIDB4MjAwMSwgMHgwMTAwLAorCTB4ODAwNywgMHg2ODBhLCAweDA4MGMsIDB4OWRmNSwgMHgxMTIwLCAweDIwMDksIDB4MDAwMywgMHgwODA0LAorCTB4MmZjZiwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHg0M2NlLCAweDAwMDUsIDB4NjgwOCwgMHg4MDA3LAorCTB4YTA4NiwgMHgwMTAwLCAweDExMjAsIDB4MjAwOSwgMHgwMDA0LCAweDA4MDQsIDB4MmZjZiwgMHg2OGIwLAorCTB4NjgzNiwgMHg2ODEwLCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLCAweDgwMGMsIDB4NjgxNCwgMHg4MDA3LAorCTB4YTA4NCwgMHgwMGZmLCAweDgwMDQsIDB4YTA4MCwgMHgwMDAyLCAweGExMDgsIDB4YWQ4MCwgMHgwMDA0LAorCTB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgwODA0LCAweDNlYjksIDB4MDgwYywgMHgzZTc1LAorCTB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgyZmNmLCAweDc5MjQsIDB4YTE5NCwgMHhmZjAwLAorCTB4YTE4YywgMHgwMGZmLCAweDgyMTcsIDB4ODJmZiwgMHgwMTEwLCAweDA4MDQsIDB4MmZkMiwgMHgyMDA5LAorCTB4MDAxYSwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDA4MGMsIDB4M2ViNiwgMHg3MDFiLAorCTB4NDQwYSwgMHgwMDA1LCAweDIwMDEsIDB4YjUyYSwgMHgyMDAzLCAweDAwMDEsIDB4YWQ4MCwgMHgwMDBkLAorCTB4MjA5OCwgMHgyMGE5LCAweDAwMWEsIDB4MjBhMSwgMHhiN2M2LCAweDUzYTMsIDB4MDgwNCwgMHgyZmFhLAorCTB4MDgwYywgMHgzZTc1LCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MmZjZiwgMHg3OTI0LAorCTB4YTE5NCwgMHhmZjAwLCAweGExOGMsIDB4MDBmZiwgMHg4MjE3LCAweDgyZmYsIDB4MDExMCwgMHgwODA0LAorCTB4MmZkMiwgMHgyMDk5LCAweGI3YzYsIDB4MjBhMCwgMHgyMGE5LCAweDAwMWEsIDB4NTNhMywgMHgyMDA5LAorCTB4MDAxYSwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDA4MDQsIDB4M2ViOSwgMHg3ODI0LAorCTB4YTA4YSwgMHgxMDAwLCAweDFhMDQsIDB4MmZkMiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg4MDAzLAorCTB4ODAwYiwgMHg4MTBiLCAweGExMDgsIDB4MDBjNiwgMHgyMDYxLCAweGI3ZjMsIDB4NjE0MiwgMHgwMGNlLAorCTB4MDEyZSwgMHgwODA0LCAweDJmYWEsIDB4MDBjNiwgMHgwODBjLCAweDVhY2YsIDB4MTE4OCwgMHgyMDAxLAorCTB4Yjc5ZiwgMHgyMDAzLCAweDAwMDEsIDB4MjAwMSwgMHhiNTAwLCAweDIwMDMsIDB4MDAwMSwgMHhhMDg1LAorCTB4MDAwMSwgMHgwODBjLCAweDViMTMsIDB4MDgwYywgMHg1YTA3LCAweDA4MGMsIDB4MTUxNSwgMHgwMDM4LAorCTB4MjA2MSwgMHhiNTAwLCAweDYwMzAsIDB4YzA5ZCwgMHg2MDMyLCAweDA4MGMsIDB4NGIxZiwgMHgwMGNlLAorCTB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGM2LCAweDIwNjEsIDB4YjdmMywgMHg3OTI0LAorCTB4NjE1MiwgMHg2MTRlLCAweDYwNTcsIDB4MDAwMCwgMHg2MDRiLCAweDAwMDksIDB4NzgzOCwgMHg2MDZhLAorCTB4NzgzYywgMHg2MDY2LCAweDc4MjgsIDB4NjA2MiwgMHg3ODJjLCAweDYwNWUsIDB4MjA2MSwgMHhiN2ExLAorCTB4MjAwMSwgMHhiODA4LCAweDYwMGUsIDB4NjAxMywgMHgwMDAxLCAweDYwMTcsIDB4MDAwMiwgMHg2MDA3LAorCTB4MDAwMCwgMHg2MDM3LCAweDAwMDAsIDB4MDBjZSwgMHgwMTJlLCAweDA4MDQsIDB4MmZhYSwgMHgwMTI2LAorCTB4MDBjNiwgMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweGI1MDAsIDB4NjA0NCwgMHhkMGE0LAorCTB4MTFiMCwgMHhkMDg0LCAweDAxMTgsIDB4MDgwYywgMHg0NjA2LCAweDAwNjgsIDB4ZDA4YywgMHgwMTE4LAorCTB4MDgwYywgMHg0NTI3LCAweDAwNDAsIDB4ZDA5NCwgMHgwMTE4LCAweDA4MGMsIDB4NDRmOCwgMHgwMDE4LAorCTB4ZDA5YywgMHgwMTA4LCAweDAwNjEsIDB4MDBlZSwgMHgwMGNlLCAweDAxMmUsIDB4MDAwNSwgMHgwMDE2LAorCTB4NjEyOCwgMHhkMTljLCAweDExMTAsIDB4YzE5ZCwgMHg2MTJhLCAweDAwMWUsIDB4MGNhMCwgMHg2MjRjLAorCTB4YTI4NiwgMHhmMGYwLCAweDExNTAsIDB4NjA0OCwgMHhhMDg2LCAweGYwZjAsIDB4MDEzMCwgMHg2MjRhLAorCTB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHgwNDkwLCAweGEyOTQsIDB4ZmYwMCwgMHhhMjk2LAorCTB4ZjcwMCwgMHgwMTc4LCAweDcxMzQsIDB4ZDFhNCwgMHgxMTYwLCAweDYyNDAsIDB4YTI5NSwgMHgwMTAwLAorCTB4NjI0MiwgMHhhMjk0LCAweDAwMTAsIDB4MDEyOCwgMHgyMDA5LCAweDAwZjcsIDB4MDgwYywgMHg0YmFmLAorCTB4MDBmMCwgMHg2MDQwLCAweGEwODQsIDB4MDAxMCwgMHhhMDg1LCAweDAxNDAsIDB4NjA0MiwgMHg2MDQzLAorCTB4MDAwMCwgMHg3MDdiLCAweDAwMDAsIDB4NzA5NywgMHgwMDAxLCAweDcwYmIsIDB4MDAwMCwgMHg3MGQ3LAorCTB4MDAwMCwgMHgyMDA5LCAweGJjYzAsIDB4MjAwYiwgMHgwMDAwLCAweDcwOGIsIDB4MDAwMCwgMHg3MDdmLAorCTB4MDAwYSwgMHgyMDA5LCAweDAwMGEsIDB4MjAxMSwgMHg0YWQ1LCAweDA4MGMsIDB4NmEyMiwgMHgwMDA1LAorCTB4MDE1NiwgMHgyMDAxLCAweGI1NzQsIDB4MjAwNCwgMHhkMDhjLCAweDAxMTAsIDB4NzA1MywgMHhmZmZmLAorCTB4NzA3YywgMHhhMDA1LCAweDE1MTAsIDB4MjAxMSwgMHg0YWQ1LCAweDA4MGMsIDB4Njk5YywgMHg2MDQwLAorCTB4YTA5NCwgMHgwMDEwLCAweGEyODUsIDB4MDAyMCwgMHg2MDQyLCAweDIwYTksIDB4MDBjOCwgMHg2MDQ0LAorCTB4ZDA4YywgMHgxMTY4LCAweDFmMDQsIDB4NDUwZiwgMHg2MjQyLCAweDcwOGYsIDB4MDAwMCwgMHg2MDQwLAorCTB4YTA5NCwgMHgwMDEwLCAweGEyODUsIDB4MDA4MCwgMHg2MDQyLCAweDYyNDIsIDB4MDAzMCwgMHg2MjQyLAorCTB4NzA4ZiwgMHgwMDAwLCAweDcwODMsIDB4MDAwMCwgMHgwMDAwLCAweDAxNWUsIDB4MDAwNSwgMHg3MDgwLAorCTB4YTA4YSwgMHgwMDAzLCAweDEyMTAsIDB4MDAyMywgMHgwMDEwLCAweDA4MGMsIDB4MTUxNSwgMHgwMDA1LAorCTB4NDUzMywgMHg0NTgzLCAweDQ2MDUsIDB4MDBmNiwgMHg3MDgzLCAweDAwMDEsIDB4MjBlMSwgMHhhMDAwLAorCTB4ZTAwMCwgMHgyMGUxLCAweDg3MDAsIDB4MDgwYywgMHgyNDcwLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLAorCTB4NDAwMCwgMHgyMDc5LCAweGJiMDAsIDB4MjA3YiwgMHgyMjAwLCAweDc4MDcsIDB4MDBlZiwgMHg3ODBiLAorCTB4MDAwMCwgMHg3ODBmLCAweDAwZWYsIDB4NzgxMywgMHgwMTM4LCAweDc4MTcsIDB4MDAwMCwgMHg3ODFiLAorCTB4MDAwMCwgMHg3ODFmLCAweDAwMDAsIDB4NzgyMywgMHhmZmZmLCAweDc4MjcsIDB4ZmZmZiwgMHg3ODJiLAorCTB4MDAwMCwgMHg3ODJmLCAweDAwMDAsIDB4MjA3OSwgMHhiYjBjLCAweDIwN2IsIDB4MTEwMSwgMHg3ODA3LAorCTB4MDAwMCwgMHgyMDk5LCAweGI1MDUsIDB4MjBhMSwgMHhiYjBlLCAweDIwYTksIDB4MDAwNCwgMHg1M2EzLAorCTB4MjA3OSwgMHhiYjEyLCAweDIwN2IsIDB4MDAwMCwgMHg3ODA3LCAweDAwMDAsIDB4MjA5OSwgMHhiYjAwLAorCTB4MjBhMSwgMHgwMjBiLCAweDIwYTksIDB4MDAxNCwgMHg1M2E2LCAweDYwYzMsIDB4MDAwYywgMHg2MDBmLAorCTB4MDAwMCwgMHgwODBjLCAweDRiMDYsIDB4MDBmZSwgMHg3MDg3LCAweDAwMDAsIDB4NjA0MywgMHgwMDA4LAorCTB4NjA0MywgMHgwMDAwLCAweDAwMDUsIDB4MDBkNiwgMHg3MDg0LCAweDcwODcsIDB4MDAwMCwgMHhhMDI1LAorCTB4MDkwNCwgMHg0NWVkLCAweDYwMjAsIDB4ZDBiNCwgMHgxOTA0LCAweDQ1ZWIsIDB4NzE5NCwgMHg4MWZmLAorCTB4MDkwNCwgMHg0NWRiLCAweGE0ODYsIDB4MDAwYywgMHgxOTA0LCAweDQ1ZTYsIDB4YTQ4MCwgMHgwMDE4LAorCTB4ODAwNCwgMHgyMGE4LCAweDIwMTEsIDB4YmI4MCwgMHgyMDE5LCAweGJiMDAsIDB4MjIwYywgMHgyMzA0LAorCTB4YTEwNiwgMHgxMWI4LCAweDgyMTAsIDB4ODMxOCwgMHgxZjA0LCAweDQ1OWUsIDB4NjA0MywgMHgwMDA0LAorCTB4NjA4YiwgMHhiYzk0LCAweDYwOGYsIDB4ZjBmMCwgMHg2MDQzLCAweDAwMDYsIDB4NzA4MywgMHgwMDAyLAorCTB4NzA4ZiwgMHgwMDAyLCAweDIwMDksIDB4MDdkMCwgMHgyMDExLCAweDRhZGMsIDB4MDgwYywgMHg2YTIyLAorCTB4MDQ5MCwgMHgyMDY5LCAweGJiODAsIDB4NjkzMCwgMHhhMThlLCAweDExMDEsIDB4MTUzOCwgMHg2ODM0LAorCTB4YTAwNSwgMHgxNTIwLCAweDY5MDAsIDB4YTE4YywgMHgwMGZmLCAweDExMTgsIDB4NjgwNCwgMHhhMDA1LAorCTB4MDE5MCwgMHgyMDExLCAweGJiOGUsIDB4MjAxOSwgMHhiNTA1LCAweDIwYTksIDB4MDAwNCwgMHgyMjBjLAorCTB4MjMwNCwgMHhhMTAyLCAweDAyMzAsIDB4MTE5MCwgMHg4MjEwLCAweDgzMTgsIDB4MWYwNCwgMHg0NWNmLAorCTB4MDA2OCwgMHg3MDk3LCAweDAwMDAsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMDk5LAorCTB4YmI4MCwgMHgyMGExLCAweDAyMGIsIDB4MjBhOSwgMHgwMDE0LCAweDUzYTYsIDB4NjA0MywgMHgwMDA4LAorCTB4NjA0MywgMHgwMDAwLCAweDAwMTAsIDB4MDBkZSwgMHgwMDA1LCAweDYwNDAsIDB4YTA4NSwgMHgwMTAwLAorCTB4NjA0MiwgMHg2MDIwLCAweGQwYjQsIDB4MWRiOCwgMHg2MGMzLCAweDAwMGMsIDB4MjAxMSwgMHhiN2VhLAorCTB4MjAxMywgMHgwMDAwLCAweDcwODcsIDB4MDAwMCwgMHgyMGUxLCAweDkwODAsIDB4NjBhMywgMHgwMDU2LAorCTB4NjBhNywgMHg5NTc1LCAweDA4MGMsIDB4N2Q3MSwgMHgwYzMwLCAweDAwMDUsIDB4NzA4YywgMHhhMDhhLAorCTB4MDAxZCwgMHgxMjEwLCAweDAwMjMsIDB4MDAxMCwgMHgwODBjLCAweDE1MTUsIDB4MDAwNSwgMHg0NjM5LAorCTB4NDY0OCwgMHg0NjcwLCAweDQ2ODksIDB4NDZhZCwgMHg0NmQ1LCAweDQ2ZjksIDB4NDcyYSwgMHg0NzRlLAorCTB4NDc3NiwgMHg0N2FkLCAweDQ3ZDUsIDB4NDdmMSwgMHg0ODA3LCAweDQ4MjcsIDB4NDgzYSwgMHg0ODQyLAorCTB4NDg3MiwgMHg0ODk2LCAweDQ4YmUsIDB4NDhlMiwgMHg0OTEzLCAweDQ5NTAsIDB4NDk3ZiwgMHg0OTliLAorCTB4NDlkYSwgMHg0OWZhLCAweDRhMTMsIDB4NGExNCwgMHgwMGM2LCAweDIwNjEsIDB4YjUwMCwgMHg2MDAzLAorCTB4MDAwNywgMHgyMDYxLCAweDAxMDAsIDB4NjAwNCwgMHhhMDg0LCAweGZmZjksIDB4NjAwNiwgMHgwMGNlLAorCTB4MDAwNSwgMHg2MDhiLCAweGJjOTQsIDB4NjA4ZiwgMHhmMGYwLCAweDYwNDMsIDB4MDAwMiwgMHg3MDhmLAorCTB4MDAwMSwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwgMHg0YWRjLCAweDA4MGMsIDB4NmEyMiwgMHgwMDA1LAorCTB4MDBmNiwgMHg3MDg0LCAweGEwODYsIDB4MDAxNCwgMHgxNTA4LCAweDYwNDMsIDB4MDAwMCwgMHg2MDIwLAorCTB4ZDBiNCwgMHgxMWUwLCAweDIwNzksIDB4YmI4MCwgMHg3YTMwLCAweGEyOTYsIDB4MTEwMiwgMHgxMWEwLAorCTB4NzgzNCwgMHhhMDA1LCAweDExODgsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBiOCwgMHhhMDA1LAorCTB4MTExMCwgMHg3MGJiLCAweDAwMDEsIDB4MjAxMSwgMHg0YWRjLCAweDA4MGMsIDB4Njk5YywgMHg3MDhmLAorCTB4MDAxMCwgMHgwODBjLCAweDQ4NDIsIDB4MDAxMCwgMHgwODBjLCAweDRiMWYsIDB4MDBmZSwgMHgwMDA1LAorCTB4NzA4ZiwgMHgwMDAzLCAweDYwNDMsIDB4MDAwNCwgMHgyMDExLCAweDRhZGMsIDB4MDgwYywgMHg2OTljLAorCTB4MDgwYywgMHg0Yjk3LCAweDIwYTMsIDB4MTEwMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhOSwgMHgwMDBhLAorCTB4MjBhMywgMHgwMDAwLCAweDFmMDQsIDB4NDY4MCwgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg0YjA2LAorCTB4MDAwNSwgMHgwMGY2LCAweDcwODQsIDB4YTAwNSwgMHgwMWYwLCAweDIwMTEsIDB4NGFkYywgMHgwODBjLAorCTB4Njk5YywgMHhhMDg2LCAweDAwMTQsIDB4MTFhOCwgMHgyMDc5LCAweGJiODAsIDB4N2EzMCwgMHhhMjk2LAorCTB4MTEwMiwgMHgxMTc4LCAweDc4MzQsIDB4YTAwNSwgMHgxMTYwLCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LAorCTB4NzBiOCwgMHhhMDA1LCAweDExMTAsIDB4NzBiYiwgMHgwMDAxLCAweDcwOGYsIDB4MDAwNCwgMHgwMDI5LAorCTB4MDAxMCwgMHgwODBjLCAweDRiMWYsIDB4MDBmZSwgMHgwMDA1LCAweDcwOGYsIDB4MDAwNSwgMHgwODBjLAorCTB4NGI5NywgMHgyMGEzLCAweDExMDMsIDB4MjBhMywgMHgwMDAwLCAweDM0MzAsIDB4MjAxMSwgMHhiYjhlLAorCTB4MDgwYywgMHg0YmU4LCAweDExNjAsIDB4NzA3OCwgMHhhMDA1LCAweDExNDgsIDB4NzE1MCwgMHhhMTg2LAorCTB4ZmZmZiwgMHgwMTI4LCAweDA4MGMsIDB4NGFhMCwgMHgwMTEwLCAweDA4MGMsIDB4NGJjNiwgMHgyMGE5LAorCTB4MDAwOCwgMHgyMjk4LCAweDI2YTAsIDB4NTNhNiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NGIwNiwgMHgwMDA1LCAweDAwZjYsIDB4NzA4NCwgMHhhMDA1LAorCTB4MDFmMCwgMHgyMDExLCAweDRhZGMsIDB4MDgwYywgMHg2OTljLCAweGEwODYsIDB4MDAxNCwgMHgxMWE4LAorCTB4MjA3OSwgMHhiYjgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTAzLCAweDExNzgsIDB4NzgzNCwgMHhhMDA1LAorCTB4MTE2MCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGI4LCAweGEwMDUsIDB4MTExMCwgMHg3MGJiLAorCTB4MDAwMSwgMHg3MDhmLCAweDAwMDYsIDB4MDAyOSwgMHgwMDEwLCAweDA4MGMsIDB4NGIxZiwgMHgwMGZlLAorCTB4MDAwNSwgMHg3MDhmLCAweDAwMDcsIDB4MDgwYywgMHg0Yjk3LCAweDIwYTMsIDB4MTEwNCwgMHgyMGEzLAorCTB4MDAwMCwgMHgzNDMwLCAweDIwMTEsIDB4YmI4ZSwgMHgwODBjLCAweDRiZTgsIDB4MTFhOCwgMHg3MDc4LAorCTB4YTAwNSwgMHgxMTkwLCAweDcxNTgsIDB4YTE4NiwgMHhmZmZmLCAweDAxNzAsIDB4YTE4MCwgMHgyZGM0LAorCTB4MjAwZCwgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHgwODBjLCAweDRhYTAsIDB4MDEyOCwgMHgwODBjLAorCTB4NDBkNiwgMHgwMTEwLCAweDA4MGMsIDB4Mjg2NywgMHgyMGE5LCAweDAwMDgsIDB4MjI5OCwgMHgyNmEwLAorCTB4NTNhNiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAxNCwgMHgwODBjLAorCTB4NGIwNiwgMHgwMDA1LCAweDAwZjYsIDB4NzA4NCwgMHhhMDA1LCAweDAxZjAsIDB4MjAxMSwgMHg0YWRjLAorCTB4MDgwYywgMHg2OTljLCAweGEwODYsIDB4MDAxNCwgMHgxMWE4LCAweDIwNzksIDB4YmI4MCwgMHg3YTMwLAorCTB4YTI5NiwgMHgxMTA0LCAweDExNzgsIDB4NzgzNCwgMHhhMDA1LCAweDExNjAsIDB4N2EzOCwgMHhkMmZjLAorCTB4MDEyOCwgMHg3MGI4LCAweGEwMDUsIDB4MTExMCwgMHg3MGJiLCAweDAwMDEsIDB4NzA4ZiwgMHgwMDA4LAorCTB4MDAyOSwgMHgwMDEwLCAweDA4MGMsIDB4NGIxZiwgMHgwMGZlLCAweDAwMDUsIDB4NzA4ZiwgMHgwMDA5LAorCTB4MDgwYywgMHg0Yjk3LCAweDIwYTMsIDB4MTEwNSwgMHgyMGEzLCAweDAxMDAsIDB4MzQzMCwgMHgwODBjLAorCTB4NGJlOCwgMHgxMTUwLCAweDcwNzgsIDB4YTAwNSwgMHgxMTM4LCAweDA4MGMsIDB4NGExNSwgMHgxMTcwLAorCTB4YTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4Mjg2NywgMHgyMGE5LCAweDAwMDgsIDB4MjA5OSwgMHhiYjhlLAorCTB4MjZhMCwgMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LAorCTB4MDgwYywgMHg0YjA2LCAweDAwMTAsIDB4MDgwYywgMHg0NjJjLCAweDAwMDUsIDB4MDBmNiwgMHg3MDg0LAorCTB4YTAwNSwgMHgwNTg4LCAweDIwMTEsIDB4NGFkYywgMHgwODBjLCAweDY5OWMsIDB4YTA4NiwgMHgwMDE0LAorCTB4MTU0MCwgMHgyMDc5LCAweGJiODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDUsIDB4MTUxMCwgMHg3ODM0LAorCTB4MjAxMSwgMHgwMTAwLCAweGEyMWUsIDB4MTE2MCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGI4LAorCTB4YTAwNSwgMHgxMTEwLCAweDcwYmIsIDB4MDAwMSwgMHg3MDhmLCAweDAwMGEsIDB4MDBiMSwgMHgwMDk4LAorCTB4YTAwNSwgMHgxMTc4LCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYjgsIDB4YTAwNSwgMHgxMTEwLAorCTB4NzBiYiwgMHgwMDAxLCAweDcwOGIsIDB4MDAwMCwgMHg3MDhmLCAweDAwMGUsIDB4MDgwYywgMHg0ODI3LAorCTB4MDAxMCwgMHgwODBjLCAweDRiMWYsIDB4MDBmZSwgMHgwMDA1LCAweDcwOGYsIDB4MDAwYiwgMHgyMDExLAorCTB4YmIwZSwgMHgyMmEwLCAweDIwYTksIDB4MDA0MCwgMHgyMDE5LCAweGZmZmYsIDB4NDNhNCwgMHgyMGE5LAorCTB4MDAwMiwgMHgyMDA5LCAweDAwMDAsIDB4NDFhNCwgMHgwODBjLCAweDRiOTcsIDB4MjBhMywgMHgxMTA2LAorCTB4MjBhMywgMHgwMDAwLCAweDA4MGMsIDB4NGJlOCwgMHgwMTE4LCAweDIwMTMsIDB4MDAwMCwgMHgwMDIwLAorCTB4NzA1NCwgMHhhMDg1LCAweDAxMDAsIDB4MjAxMiwgMHgyMjk4LCAweDIwYTksIDB4MDA0MiwgMHg1M2E2LAorCTB4NjBjMywgMHgwMDg0LCAweDA4MGMsIDB4NGIwNiwgMHgwMDA1LCAweDAwZjYsIDB4NzA4NCwgMHhhMDA1LAorCTB4MDFiMCwgMHgyMDExLCAweDRhZGMsIDB4MDgwYywgMHg2OTljLCAweGEwODYsIDB4MDA4NCwgMHgxMTY4LAorCTB4MjA3OSwgMHhiYjgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTA2LCAweDExMzgsIDB4NzgzNCwgMHhhMDA1LAorCTB4MTEyMCwgMHg3MDhmLCAweDAwMGMsIDB4MDAyOSwgMHgwMDEwLCAweDA4MGMsIDB4NGIxZiwgMHgwMGZlLAorCTB4MDAwNSwgMHg3MDhmLCAweDAwMGQsIDB4MDgwYywgMHg0Yjk3LCAweDIwYTMsIDB4MTEwNywgMHgyMGEzLAorCTB4MDAwMCwgMHgyMDk5LCAweGJiOGUsIDB4MjBhOSwgMHgwMDQwLCAweDUzYTYsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDA4NCwgMHgwODBjLCAweDRiMDYsIDB4MDAwNSwgMHgwMGY2LAorCTB4NzA4NCwgMHhhMDA1LCAweDAxZDAsIDB4MjAxMSwgMHg0YWRjLCAweDA4MGMsIDB4Njk5YywgMHhhMDg2LAorCTB4MDA4NCwgMHgxMTg4LCAweDIwNzksIDB4YmI4MCwgMHg3YTMwLCAweGEyOTYsIDB4MTEwNywgMHgxMTU4LAorCTB4NzgzNCwgMHhhMDA1LCAweDExNDAsIDB4NzA4YiwgMHgwMDAxLCAweDA4MGMsIDB4NGI4OSwgMHg3MDhmLAorCTB4MDAwZSwgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg0YjFmLCAweDAwZmUsIDB4MDAwNSwgMHg3MDhmLAorCTB4MDAwZiwgMHg3MDg3LCAweDAwMDAsIDB4NjA4YiwgMHhiYzg1LCAweDYwOGYsIDB4YjViNSwgMHg2MDQzLAorCTB4MDAwNSwgMHg2MDQzLCAweDAwMDQsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsIDB4NGFkYywgMHgwODBjLAorCTB4Njk5MCwgMHgwMDA1LCAweDcwODQsIDB4YTAwNSwgMHgwMTIwLCAweDIwMTEsIDB4NGFkYywgMHgwODBjLAorCTB4Njk5YywgMHgwMDA1LCAweDcwOGYsIDB4MDAxMSwgMHgwODBjLCAweDRiZTgsIDB4MTFhMCwgMHg3MTcwLAorCTB4ODFmZiwgMHgwMTg4LCAweDIwMDksIDB4MDAwMCwgMHg3MDc0LCAweGEwODQsIDB4MDBmZiwgMHgwODBjLAorCTB4MjgxZCwgMHhhMTg2LCAweDAwN2UsIDB4MDEzOCwgMHhhMTg2LCAweDAwODAsIDB4MDEyMCwgMHgyMDExLAorCTB4YmI4ZSwgMHgwODBjLCAweDRhYTAsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMDk5LAorCTB4YmI4MCwgMHgyMGExLCAweDAyMGIsIDB4NzQ4NCwgMHhhNDgwLCAweDAwMTgsIDB4YTA4MCwgMHgwMDA3LAorCTB4YTA4NCwgMHgwM2Y4LCAweDgwMDQsIDB4MjBhOCwgMHg1M2E2LCAweDYwYzMsIDB4MDAxNCwgMHgwODBjLAorCTB4NGIwNiwgMHgwMDA1LCAweDAwZjYsIDB4NzA4NCwgMHhhMDA1LCAweDAxZjAsIDB4MjAxMSwgMHg0YWRjLAorCTB4MDgwYywgMHg2OTljLCAweGEwODYsIDB4MDAxNCwgMHgxMWE4LCAweDIwNzksIDB4YmI4MCwgMHg3YTMwLAorCTB4YTI5NiwgMHgxMTAzLCAweDExNzgsIDB4NzgzNCwgMHhhMDA1LCAweDExNjAsIDB4N2EzOCwgMHhkMmZjLAorCTB4MDEyOCwgMHg3MGI4LCAweGEwMDUsIDB4MTExMCwgMHg3MGJiLCAweDAwMDEsIDB4NzA4ZiwgMHgwMDEyLAorCTB4MDAyOSwgMHgwMDEwLCAweDA4MGMsIDB4NGIxZiwgMHgwMGZlLCAweDAwMDUsIDB4NzA4ZiwgMHgwMDEzLAorCTB4MDgwYywgMHg0YmEzLCAweDIwYTMsIDB4MTEwMywgMHgyMGEzLCAweDAwMDAsIDB4MzQzMCwgMHgyMDExLAorCTB4YmI4ZSwgMHgwODBjLCAweDRiZTgsIDB4MTE2MCwgMHg3MDc4LCAweGEwMDUsIDB4MTE0OCwgMHg3MTUwLAorCTB4YTE4NiwgMHhmZmZmLCAweDAxMjgsIDB4MDgwYywgMHg0YWEwLCAweDAxMTAsIDB4MDgwYywgMHg0YmM2LAorCTB4MjBhOSwgMHgwMDA4LCAweDIyOTgsIDB4MjZhMCwgMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg0YjA2LCAweDAwMDUsIDB4MDBmNiwgMHg3MDg0LAorCTB4YTAwNSwgMHgwMWYwLCAweDIwMTEsIDB4NGFkYywgMHgwODBjLCAweDY5OWMsIDB4YTA4NiwgMHgwMDE0LAorCTB4MTFhOCwgMHgyMDc5LCAweGJiODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDQsIDB4MTE3OCwgMHg3ODM0LAorCTB4YTAwNSwgMHgxMTYwLCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYjgsIDB4YTAwNSwgMHgxMTEwLAorCTB4NzBiYiwgMHgwMDAxLCAweDcwOGYsIDB4MDAxNCwgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg0YjFmLAorCTB4MDBmZSwgMHgwMDA1LCAweDcwOGYsIDB4MDAxNSwgMHgwODBjLCAweDRiYTMsIDB4MjBhMywgMHgxMTA0LAorCTB4MjBhMywgMHgwMDAwLCAweDM0MzAsIDB4MjAxMSwgMHhiYjhlLCAweDA4MGMsIDB4NGJlOCwgMHgxMWE4LAorCTB4NzA3OCwgMHhhMDA1LCAweDExOTAsIDB4NzE1OCwgMHhhMTg2LCAweGZmZmYsIDB4MDE3MCwgMHhhMTgwLAorCTB4MmRjNCwgMHgyMDBkLCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDA4MGMsIDB4NGFhMCwgMHgwMTI4LAorCTB4MDgwYywgMHg0MGQ2LCAweDAxMTAsIDB4MDgwYywgMHgyODY3LCAweDIwYTksIDB4MDAwOCwgMHgyMjk4LAorCTB4MjZhMCwgMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LAorCTB4MDgwYywgMHg0YjA2LCAweDAwMDUsIDB4MDBmNiwgMHg3MDg0LCAweGEwMDUsIDB4MDViOCwgMHgyMDExLAorCTB4NGFkYywgMHgwODBjLCAweDY5OWMsIDB4YTA4NiwgMHgwMDE0LCAweDE1NzAsIDB4MjA3OSwgMHhiYjgwLAorCTB4N2EzMCwgMHhhMjk2LCAweDExMDUsIDB4MTU0MCwgMHg3ODM0LCAweDIwMTEsIDB4MDEwMCwgMHhhMjFlLAorCTB4MTE0OCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGI4LCAweGEwMDUsIDB4MTExMCwgMHg3MGJiLAorCTB4MDAwMSwgMHgwMDYwLCAweGEwMDUsIDB4MTFjMCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGI4LAorCTB4YTAwNSwgMHgxMTEwLCAweDcwYmIsIDB4MDAwMSwgMHg3MDhiLCAweDAwMDAsIDB4N2EzOCwgMHhkMmY0LAorCTB4MDEzOCwgMHgyMDAxLCAweGI1NzQsIDB4MjAwNCwgMHhkMGE0LCAweDExMTAsIDB4NzBkNywgMHgwMDA4LAorCTB4NzA4ZiwgMHgwMDE2LCAweDAwMjksIDB4MDAxMCwgMHgwODBjLCAweDRiMWYsIDB4MDBmZSwgMHgwMDA1LAorCTB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMDk5LCAweGJiODAsIDB4MjBhMSwgMHgwMjBiLAorCTB4MjBhOSwgMHgwMDBlLCAweDUzYTYsIDB4MzQzMCwgMHgyMDExLCAweGJiOGUsIDB4NzA4ZiwgMHgwMDE3LAorCTB4MDgwYywgMHg0YmU4LCAweDExNTAsIDB4NzA3OCwgMHhhMDA1LCAweDExMzgsIDB4MDgwYywgMHg0YTE1LAorCTB4MTE3MCwgMHhhMDg1LCAweDAwMDEsIDB4MDgwYywgMHgyODY3LCAweDIwYTksIDB4MDAwOCwgMHgyMDk5LAorCTB4YmI4ZSwgMHgyNmEwLCAweDUzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLAorCTB4MDAxNCwgMHgwODBjLCAweDRiMDYsIDB4MDAxMCwgMHgwODBjLCAweDQ2MmMsIDB4MDAwNSwgMHgwMGY2LAorCTB4NzA4NCwgMHhhMDA1LCAweDAxYjAsIDB4MjAxMSwgMHg0YWRjLCAweDA4MGMsIDB4Njk5YywgMHhhMDg2LAorCTB4MDA4NCwgMHgxMTY4LCAweDIwNzksIDB4YmI4MCwgMHg3YTMwLCAweGEyOTYsIDB4MTEwNiwgMHgxMTM4LAorCTB4NzgzNCwgMHhhMDA1LCAweDExMjAsIDB4NzA4ZiwgMHgwMDE4LCAweDAwMjksIDB4MDAxMCwgMHgwODBjLAorCTB4NGIxZiwgMHgwMGZlLCAweDAwMDUsIDB4NzA4ZiwgMHgwMDE5LCAweDA4MGMsIDB4NGJhMywgMHgyMGEzLAorCTB4MTEwNiwgMHgyMGEzLCAweDAwMDAsIDB4MzQzMCwgMHgyMDk5LCAweGJiOGUsIDB4MjAzOSwgMHhiYjBlLAorCTB4MjdhMCwgMHgyMGE5LCAweDAwNDAsIDB4NTNhMywgMHgwODBjLCAweDRiZTgsIDB4MTFlOCwgMHgyNzI4LAorCTB4MjUxNCwgMHg4MjA3LCAweGEwODQsIDB4MDBmZiwgMHg4MDAwLCAweDIwMTgsIDB4YTI5NCwgMHgwMGZmLAorCTB4ODAwNywgMHhhMjA1LCAweDIwMmEsIDB4NzA1NCwgMHgyMzEwLCAweDgyMTQsIDB4YTJhMCwgMHhiYjBlLAorCTB4MjQxNCwgMHhhMzhjLCAweDAwMDEsIDB4MDExOCwgMHhhMjk0LCAweGZmMDAsIDB4MDAxOCwgMHhhMjk0LAorCTB4MDBmZiwgMHg4MDA3LCAweGEyMTUsIDB4MjIyMiwgMHgyNzk4LCAweDI2YTAsIDB4MjBhOSwgMHgwMDQwLAorCTB4NTNhNiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDA4NCwgMHgwODBjLAorCTB4NGIwNiwgMHgwMDA1LCAweDAwZjYsIDB4NzA4NCwgMHhhMDA1LCAweDAxZDAsIDB4MjAxMSwgMHg0YWRjLAorCTB4MDgwYywgMHg2OTljLCAweGEwODYsIDB4MDA4NCwgMHgxMTg4LCAweDIwNzksIDB4YmI4MCwgMHg3YTMwLAorCTB4YTI5NiwgMHgxMTA3LCAweDExNTgsIDB4NzgzNCwgMHhhMDA1LCAweDExNDAsIDB4NzA4YiwgMHgwMDAxLAorCTB4MDgwYywgMHg0Yjg5LCAweDcwOGYsIDB4MDAxYSwgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg0YjFmLAorCTB4MDBmZSwgMHgwMDA1LCAweDcwOGYsIDB4MDAxYiwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLAorCTB4MjA5OSwgMHhiYjgwLCAweDIwYTEsIDB4MDIwYiwgMHg3NDg0LCAweGE0ODAsIDB4MDAxOCwgMHhhMDgwLAorCTB4MDAwNywgMHhhMDg0LCAweDAzZjgsIDB4ODAwNCwgMHgyMGE4LCAweDUzYTYsIDB4NjBjMywgMHgwMDg0LAorCTB4MDgwYywgMHg0YjA2LCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LCAweDAwODYsIDB4MDA5NiwgMHgyMDI5LAorCTB4YjU1MywgMHgyNTJjLCAweDIwYTksIDB4MDAwOCwgMHgyMDQxLCAweGJiMGUsIDB4MjhhMCwgMHgyMDk5LAorCTB4YmI4ZSwgMHg1M2EzLCAweDIwYTksIDB4MDAwOCwgMHgyMDExLCAweDAwMDcsIDB4ZDVkNCwgMHgwMTEwLAorCTB4MjAxMSwgMHgwMDAwLCAweDI4MDAsIDB4YTIwMCwgMHgyMDBjLCAweGExYTYsIDB4ZmZmZiwgMHgxMTQ4LAorCTB4ZDVkNCwgMHgwMTEwLCAweDgyMTAsIDB4MDAwOCwgMHg4MjExLCAweDFmMDQsIDB4NGEyYSwgMHgwODA0LAorCTB4NGE5OCwgMHg4MmZmLCAweDExNjAsIDB4ZDVkNCwgMHgwMTIwLCAweGExYTYsIDB4M2ZmZiwgMHgwZDkwLAorCTB4MDAyMCwgMHhhMWE2LCAweDNmZmYsIDB4MDkwNCwgMHg0YTk4LCAweGExOGQsIDB4YzAwMCwgMHgyMGE5LAorCTB4MDAxMCwgMHgyMDE5LCAweDAwMDEsIDB4ZDVkNCwgMHgwMTEwLCAweDIwMTksIDB4MDAxMCwgMHgyMTIwLAorCTB4ZDVkNCwgMHgwMTEwLCAweDg0MjMsIDB4MDAwOCwgMHg4NDI0LCAweDEyNDAsIDB4ZDVkNCwgMHgwMTEwLAorCTB4ODMxOSwgMHgwMDA4LCAweDgzMTgsIDB4MWYwNCwgMHg0YTUwLCAweDA0ZDAsIDB4MjNhOCwgMHgyMDIxLAorCTB4MDAwMSwgMHg4NDI2LCAweDg0MjUsIDB4MWYwNCwgMHg0YTYyLCAweDIzMjgsIDB4ODUyOSwgMHhhMmJlLAorCTB4MDAwNywgMHgwMTU4LCAweDAwMDYsIDB4MjAzOSwgMHgwMDA3LCAweDIyMDAsIDB4YTczYSwgMHgwMDBlLAorCTB4MjdhOCwgMHhhNWE4LCAweDAwMTAsIDB4MWYwNCwgMHg0YTcxLCAweDc1NTIsIDB4YTVjOCwgMHgyZGM0LAorCTB4MjkyZCwgMHhhNWFjLCAweDAwZmYsIDB4NzU3NiwgMHg2NTMyLCAweDY1MzYsIDB4MDAxNiwgMHgyNTA4LAorCTB4MDgwYywgMHgyODQ3LCAweDAwMWUsIDB4NjBlNywgMHgwMDAwLCAweDY1ZWEsIDB4MjAxOCwgMHgyMzA0LAorCTB4YTQwNSwgMHgyMDFhLCAweDcwN2IsIDB4MDAwMSwgMHgyNmEwLCAweDI4OTgsIDB4MjBhOSwgMHgwMDA4LAorCTB4NTNhNiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweGEwODUsIDB4MDAwMSwgMHgwMDI4LAorCTB4YTAwNiwgMHgwMDE4LCAweGEwMDYsIDB4MDgwYywgMHgxNTE1LCAweDAwOWUsIDB4MDA4ZSwgMHgwMDA1LAorCTB4MjExOCwgMHgyMDIxLCAweDAwMDAsIDB4MjAwMSwgMHgwMDA3LCAweGEzOWEsIDB4MDAxMCwgMHgwMjE4LAorCTB4ODQyMCwgMHg4MDAxLCAweDBjZDAsIDB4MjExOCwgMHg4NGZmLCAweDAxMjAsIDB4YTM5YSwgMHgwMDEwLAorCTB4ODQyMSwgMHgxZGUwLCAweDIwMjEsIDB4MDAwMSwgMHg4M2ZmLCAweDAxMTgsIDB4ODQyMywgMHg4MzE5LAorCTB4MWRlOCwgMHhhMjM4LCAweDI3MDQsIDB4YTQyYywgMHgxMWI4LCAweGE0MDUsIDB4MjAzYSwgMHg3MTUyLAorCTB4YTFhMCwgMHgyZGM0LCAweDI0MmQsIDB4YTVhYywgMHgwMGZmLCAweDc1NzYsIDB4NjUzMiwgMHg2NTM2LAorCTB4MDAxNiwgMHgyNTA4LCAweDA4MGMsIDB4Mjg0NywgMHgwMDFlLCAweDYwZTcsIDB4MDAwMCwgMHg2NWVhLAorCTB4NzA3YiwgMHgwMDAxLCAweGEwODQsIDB4MDAwMCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhiNTAwLAorCTB4NzA3ZiwgMHgwMDAwLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLAorCTB4MjA3MSwgMHgwMTQwLCAweDA4MGMsIDB4N2Q3YSwgMHg3MDA0LCAweGEwODQsIDB4NDAwMCwgMHgwMTIwLAorCTB4NzAwMywgMHgxMDAwLCAweDcwMDMsIDB4MDAwMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLAorCTB4YjUyMywgMHgyMDczLCAweDAwMDAsIDB4Nzg0MCwgMHgwMDI2LCAweDAwMTYsIDB4MjAwOSwgMHgwMGY3LAorCTB4MDgwYywgMHg0YmFmLCAweDAwMWUsIDB4YTA5NCwgMHgwMDEwLCAweGEyODUsIDB4MDA4MCwgMHg3ODQyLAorCTB4N2E0MiwgMHgwMDJlLCAweDAxMmUsIDB4MDBmZSwgMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDExLCAweGI3ZWEsIDB4MjAxMywgMHgwMDAwLCAweDcwODcsIDB4MDAwMCwgMHgwMTJlLAorCTB4MjBlMSwgMHg5MDgwLCAweDYwYTMsIDB4MDA1NiwgMHg2MGE3LCAweDk1NzUsIDB4MDgwYywgMHg3ZDcxLAorCTB4MjAwOSwgMHgwN2QwLCAweDIwMTEsIDB4NGFkYywgMHgwODBjLCAweDZhMjIsIDB4MDAwNSwgMHgwMDE2LAorCTB4MDAyNiwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMTEsIDB4MDAwMywgMHgwODBjLAorCTB4ODA3NSwgMHgyMDExLCAweDAwMDIsIDB4MDgwYywgMHg4MDdmLCAweDA4MGMsIDB4N2Y1OSwgMHgwMDM2LAorCTB4MjAxOSwgMHgwMDAwLCAweDA4MGMsIDB4N2ZlNCwgMHgwMDNlLCAweDIwMDksIDB4MDBmNywgMHgwODBjLAorCTB4NGJhZiwgMHgyMDYxLCAweGI3ZjMsIDB4NjAxYiwgMHgwMDAwLCAweDYwMWYsIDB4MDAwMCwgMHgyMDYxLAorCTB4YjUwMCwgMHg2MDAzLCAweDAwMDEsIDB4MjA2MSwgMHgwMTAwLCAweDYwNDMsIDB4MDA5MCwgMHg2MDQzLAorCTB4MDAxMCwgMHgyMDA5LCAweDAwMmQsIDB4MjAxMSwgMHg0YjU0LCAweDA4MGMsIDB4Njk5MCwgMHgwMTJlLAorCTB4MDBjZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDcxLCAweDAxMDAsIDB4MDgwYywgMHg3ZDdhLCAweDIwNzEsIDB4MDE0MCwgMHg3MDA0LAorCTB4YTA4NCwgMHg0MDAwLCAweDAxMjAsIDB4NzAwMywgMHgxMDAwLCAweDcwMDMsIDB4MDAwMCwgMHgwODBjLAorCTB4NWFkNywgMHgwMWE4LCAweDA4MGMsIDB4NWFmNSwgMHgxMTkwLCAweDIwMDEsIDB4Yjc5ZSwgMHgyMDAzLAorCTB4YWFhYSwgMHgwMDE2LCAweDA4MGMsIDB4MjhlYiwgMHgyMDAxLCAweGI3OGYsIDB4MjEwMiwgMHgwMDFlLAorCTB4MjAwMSwgMHhiNzlmLCAweDIwMDMsIDB4MDAwMCwgMHgwODBjLCAweDVhMDcsIDB4MDAzMCwgMHgyMDAxLAorCTB4MDAwMSwgMHgwODBjLCAweDI3YzMsIDB4MDgwYywgMHg0YjFmLCAweDAxMmUsIDB4MDAwZSwgMHgwMGVlLAorCTB4MDAwNSwgMHgyMGE5LCAweDAwNDAsIDB4MjBhMSwgMHhiY2MwLCAweDIwOTksIDB4YmI4ZSwgMHgzMzA0LAorCTB4ODAwNywgMHgyMGEyLCAweDkzOTgsIDB4OTRhMCwgMHgxZjA0LCAweDRiOGYsIDB4MDAwNSwgMHgyMGUxLAorCTB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4MjA5OSwgMHhiYjAwLCAweDIwYTEsIDB4MDIwYiwgMHgyMGE5LAorCTB4MDAwYywgMHg1M2E2LCAweDAwMDUsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMDk5LAorCTB4YmI4MCwgMHgyMGExLCAweDAyMGIsIDB4MjBhOSwgMHgwMDBjLCAweDUzYTYsIDB4MDAwNSwgMHgwMGM2LAorCTB4MDAwNiwgMHgyMDYxLCAweDAxMDAsIDB4ODEwZiwgMHgyMDAxLCAweGI1MzEsIDB4MjAwNCwgMHhhMDA1LAorCTB4MTEzOCwgMHgyMDAxLCAweGI1MTUsIDB4MjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTEwNSwgMHgwMDEwLAorCTB4YTE4NSwgMHgwMGY3LCAweDYwNGEsIDB4MDAwZSwgMHgwMGNlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDQ2LAorCTB4MjAwMSwgMHhiNTUzLCAweDIwMDQsIDB4ZDBhNCwgMHgwMTU4LCAweGEwMDYsIDB4MjAyMCwgMHgyMDA5LAorCTB4MDAyYSwgMHgwODBjLCAweGIwZTgsIDB4MjAwMSwgMHhiNTBjLCAweDIwMGMsIDB4YzE5NSwgMHgyMTAyLAorCTB4MjAxOSwgMHgwMDJhLCAweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweDJjNmYsIDB4MDA0ZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwODBjLCAweDRiMWYsIDB4NzA4ZiwgMHgwMDAwLCAweDcwODcsIDB4MDAwMCwgMHgwMDA1LAorCTB4MDAwNiwgMHgyMDAxLCAweGI1MGMsIDB4MjAwNCwgMHhkMDljLCAweDAxMDAsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgwMDE2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDEsIDB4MDEwMSwgMHgyMDBjLAorCTB4YTE4ZCwgMHgwMDA2LCAweDIxMDIsIDB4MDEyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgwMTU2LAorCTB4MjBhOSwgMHgwMGZmLCAweDIwMDksIDB4YjYzNSwgMHhhMDA2LCAweDIwMGEsIDB4ODEwOCwgMHgxZjA0LAorCTB4NGMwNSwgMHgwMTVlLCAweDAwMDUsIDB4MDBkNiwgMHgwMDM2LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LAorCTB4MjA2OSwgMHhiNTUyLCAweGEwMDYsIDB4NjAwMiwgMHg2MDA3LCAweDA3MDcsIDB4NjAwYSwgMHg2MDBlLAorCTB4NjAxMiwgMHhhMTk4LCAweDJkYzQsIDB4MjMxZCwgMHhhMzljLCAweDAwZmYsIDB4NjMxNiwgMHgyMGE5LAorCTB4MDAwNCwgMHhhYzk4LCAweDAwMDYsIDB4MjNhMCwgMHg0MGE0LCAweDIwYTksIDB4MDAwNCwgMHhhYzk4LAorCTB4MDAwYSwgMHgyM2EwLCAweDQwYTQsIDB4NjAzZSwgMHg2MDQyLCAweDYwNGUsIDB4NjA1MiwgMHg2MDU2LAorCTB4NjA1YSwgMHg2MDVlLCAweDYwNjIsIDB4NjA2NiwgMHg2MDZhLCAweDYwNmUsIDB4NjA3MiwgMHg2MDc2LAorCTB4NjA3YSwgMHg2MDdlLCAweDYwODIsIDB4NjA4NiwgMHg2MDhhLCAweDYwOGUsIDB4NjA5MiwgMHg2MDk2LAorCTB4NjA5YSwgMHg2MDllLCAweDYwYWUsIDB4NjFhMiwgMHgwMGQ2LCAweDYwYTQsIDB4YTA2ZCwgMHgwMTEwLAorCTB4MDgwYywgMHgxNjBmLCAweDYwYTcsIDB4MDAwMCwgMHg2MGE4LCAweGEwNmQsIDB4MDExMCwgMHgwODBjLAorCTB4MTYwZiwgMHg2MGFiLCAweDAwMDAsIDB4MDBkZSwgMHhhMDA2LCAweDYwNGEsIDB4NjgxMCwgMHg2MDNhLAorCTB4NjgwYywgMHg2MDQ2LCAweDY4MTQsIDB4YTA4NCwgMHgwMGZmLCAweDYwNDIsIDB4MDE0ZSwgMHgwMTNlLAorCTB4MDE1ZSwgMHgwMDNlLCAweDAwZGUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2OTQ0LAorCTB4NmU0OCwgMHhhNjg0LCAweDNmZmYsIDB4YTA4MiwgMHg0MDAwLCAweDFhMDQsIDB4NGQxYSwgMHhhMThjLAorCTB4ZmYwMCwgMHg4MTBmLCAweGExODIsIDB4MDBmZiwgMHgxYTA0LCAweDRkMWYsIDB4MjAwMSwgMHhiNTBjLAorCTB4MjAwNCwgMHhhMDg0LCAweDAwMDMsIDB4MDFjMCwgMHgyMDAxLCAweGI1MGMsIDB4MjAwNCwgMHhkMDg0LAorCTB4MTkwNCwgMHg0ZDAyLCAweGExODgsIDB4YjYzNSwgMHgyMTA0LCAweGEwNjUsIDB4MDkwNCwgMHg0ZDAyLAorCTB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4ZSwgMHgwMDA2LCAweDE5MDQsIDB4NGQwMiwgMHg2MDAwLAorCTB4ZDBjNCwgMHgwOTA0LCAweDRkMDIsIDB4MDA2OCwgMHhhMTg4LCAweGI2MzUsIDB4MjEwNCwgMHhhMDY1LAorCTB4MDkwNCwgMHg0Y2U2LCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwOGUsIDB4MDAwNiwgMHgxOTA0LAorCTB4NGNlYiwgMHg2MGE0LCAweGEwMGQsIDB4MDExOCwgMHgwODBjLCAweDUxZDQsIDB4MDVkMCwgMHg2MGE4LAorCTB4YTAwZCwgMHgwMTg4LCAweDA4MGMsIDB4NTIxZiwgMHgxMTcwLCAweDY5NGMsIDB4ZDFmYywgMHgxMTE4LAorCTB4MDgwYywgMHg0ZWRlLCAweDA0NDgsIDB4MDgwYywgMHg0ZThkLCAweDY5NGMsIDB4ZDFlYywgMHgxNTIwLAorCTB4MDgwYywgMHg1MGM2LCAweDA0MDgsIDB4Njk0YywgMHhhMTg0LCAweGEwMDAsIDB4MDE3OCwgMHhkMWVjLAorCTB4MDE0MCwgMHhkMWZjLCAweDAxMTgsIDB4MDgwYywgMHg1MGQ1LCAweDAwMjgsIDB4MDgwYywgMHg1MGQ1LAorCTB4MDAyOCwgMHhkMWZjLCAweDAxMTgsIDB4MDgwYywgMHg0ZThkLCAweDAwNzAsIDB4NjA1MCwgMHhhMDBkLAorCTB4MDEzMCwgMHgyZDAwLCAweDIwMGEsIDB4NjgwMywgMHgwMDAwLCAweDYwNTIsIDB4MDAyOCwgMHgyZDAwLAorCTB4NjA1MiwgMHg2MDRlLCAweDY4MDMsIDB4MDAwMCwgMHgwODBjLCAweDZjYWEsIDB4YTAwNiwgMHgwMTJlLAorCTB4MDAwNSwgMHgyMDAxLCAweDAwMDUsIDB4MjAwOSwgMHgwMDAwLCAweDA0ZTgsIDB4MjAwMSwgMHgwMDI4LAorCTB4MjAwOSwgMHgwMDAwLCAweDA0YzAsIDB4YTA4MiwgMHgwMDA2LCAweDEyYTAsIDB4MjAwMSwgMHhiNTM1LAorCTB4MjAwNCwgMHhkMGFjLCAweDExNjAsIDB4NjBhMCwgMHhkMGJjLCAweDExNDgsIDB4NjEwMCwgMHhkMWZjLAorCTB4MDkwNCwgMHg0Y2ExLCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LCAweDEwMDAsIDB4MDQyMCwgMHgyMDAxLAorCTB4MDAyOCwgMHgwMGE4LCAweDIwMDksIDB4YjUwYywgMHgyMTBjLCAweGQxOGMsIDB4MDExOCwgMHgyMDAxLAorCTB4MDAwNCwgMHgwMDY4LCAweGQxODQsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsIDB4MDA0MCwgMHgyMDAxLAorCTB4MDAyOSwgMHg2MTAwLCAweGQxZmMsIDB4MDExOCwgMHgyMDA5LCAweDEwMDAsIDB4MDA2MCwgMHgyMDA5LAorCTB4MDAwMCwgMHgwMDQ4LCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LCAweDAwMDAsIDB4MDAyMCwgMHgyMDAxLAorCTB4MDAyOSwgMHgyMDA5LCAweDAwMDAsIDB4YTAwNSwgMHgwMTJlLCAweDAwMDUsIDB4MDBlNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDY4NDQsIDB4ODAwNywgMHhhMDg0LCAweDAwZmYsIDB4MjAwOCwgMHhhMTgyLAorCTB4MDBmZiwgMHgxYTA0LCAweDRkNzksIDB4YTE4OCwgMHhiNjM1LCAweDIxMDQsIDB4YTA2NSwgMHgwMWMwLAorCTB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4ZSwgMHgwMDA2LCAweDExYTgsIDB4MmM3MCwgMHgwODBjLAorCTB4ODVjNywgMHgwNWU4LCAweDJlMDAsIDB4NjAxYSwgMHgyZDAwLCAweDYwMTIsIDB4NjAwYiwgMHhmZmZmLAorCTB4NjAxZiwgMHgwMDBhLCAweDIwMDksIDB4MDAwMywgMHgwODBjLCAweDg2NGMsIDB4YTAwNiwgMHgwNDYwLAorCTB4MjAwMSwgMHgwMDI4LCAweDA0NDAsIDB4YTA4MiwgMHgwMDA2LCAweDEyOTgsIDB4MjAwMSwgMHhiNTM1LAorCTB4MjAwNCwgMHhkMGFjLCAweDExNTgsIDB4NjBhMCwgMHhkMGJjLCAweDExNDAsIDB4NjEwMCwgMHhkMWZjLAorCTB4MDllOCwgMHgyMDAxLCAweDAwMjksIDB4MjAwOSwgMHgxMDAwLCAweDAwYTgsIDB4MjAwMSwgMHgwMDI4LAorCTB4MDA5MCwgMHgyMDA5LCAweGI1MGMsIDB4MjEwYywgMHhkMThjLCAweDAxMTgsIDB4MjAwMSwgMHgwMDA0LAorCTB4MDA1MCwgMHhkMTg0LCAweDAxMTgsIDB4MjAwMSwgMHgwMDA0LCAweDAwMjgsIDB4MjAwMSwgMHgwMDI5LAorCTB4MDAxMCwgMHgyMDAxLCAweDAwMjksIDB4YTAwNSwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDAxLAorCTB4MDAyYywgMHgwY2M4LCAweDAwZjYsIDB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDExLAorCTB4MDAwMCwgMHgyMDc5LCAweGI1MDAsIDB4Njk0NCwgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTgyLAorCTB4MDBmZiwgMHgxYTA0LCAweDRlNDQsIDB4MDgwYywgMHg0ZmE5LCAweDExYTAsIDB4NjAwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDgyLCAweDAwMDYsIDB4MTI3MCwgMHg2ODY0LCAweGEwYzYsIDB4MDA2ZiwgMHgwMTUwLAorCTB4MjAwMSwgMHhiNTM1LCAweDIwMDQsIDB4ZDBhYywgMHgxOTA0LCAweDRlMmQsIDB4NjBhMCwgMHhkMGJjLAorCTB4MTkwNCwgMHg0ZTJkLCAweDY4NjQsIDB4YTBjNiwgMHgwMDZmLCAweDAxMTgsIDB4MjAwOCwgMHgwODA0LAorCTB4NGRmNiwgMHg2OTY4LCAweDIxNDAsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4NzhkNCwgMHhkMGFjLAorCTB4MTExOCwgMHhhMTgyLCAweDAwODAsIDB4MDZkMCwgMHhhMTgyLCAweDAwZmYsIDB4MTZiOCwgMHg2YTcwLAorCTB4NmI2YywgMHg3ODcwLCAweGEzMDYsIDB4MTE2MCwgMHg3ODc0LCAweGEyNGUsIDB4MTExOCwgMHgyMjA4LAorCTB4MjMxMCwgMHgwNDYwLCAweGE5Y2MsIDB4ZmYwMCwgMHgxMTE4LCAweDIyMDgsIDB4MjMxMCwgMHgwNDMwLAorCTB4MDgwYywgMHgzZGM1LCAweDJjNzAsIDB4MDU1MCwgMHgyMDA5LCAweDAwMDAsIDB4MjAxMSwgMHgwMDAwLAorCTB4YTBjNiwgMHg0MDAwLCAweDExNjAsIDB4MDAwNiwgMHgyZTYwLCAweDA4MGMsIDB4NTI0YSwgMHgxMTA4LAorCTB4YzE4NSwgMHg3MDAwLCAweGQwYmMsIDB4MDEwOCwgMHhjMThkLCAweDAwMGUsIDB4MDA4OCwgMHhhMGM2LAorCTB4NDAwNywgMHgxMTEwLCAweDI0MDgsIDB4MDA2MCwgMHhhMGM2LCAweDQwMDgsIDB4MTExOCwgMHgyNzA4LAorCTB4MjYxMCwgMHgwMDMwLCAweGEwYzYsIDB4NDAwOSwgMHgxMTA4LCAweDAwMTAsIDB4MjAwMSwgMHg0MDA2LAorCTB4Njg2NiwgMHg2OTZhLCAweDZhNmUsIDB4MjAwMSwgMHgwMDMwLCAweDA0NTAsIDB4MDgwYywgMHg4NWM3LAorCTB4MTEzOCwgMHgyMDAxLCAweDQwMDUsIDB4MjAwOSwgMHgwMDAzLCAweDIwMTEsIDB4MDAwMCwgMHgwYzgwLAorCTB4MmUwMCwgMHg2MDFhLCAweDA4MGMsIDB4YTAyNywgMHgyZDAwLCAweDYwMTIsIDB4NjAxZiwgMHgwMDAxLAorCTB4NjgzOCwgMHhkODhjLCAweDAxMDgsIDB4YzBmNSwgMHg2ODNhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHgyYzljLCAweDAxMmUsIDB4MjAwMSwgMHgwMDAwLCAweDA4MGMsIDB4NGVlYiwgMHgyMDAxLAorCTB4MDAwMiwgMHgwODBjLCAweDRlZmQsIDB4MjAwOSwgMHgwMDAyLCAweDA4MGMsIDB4ODY0YywgMHhhMDA2LAorCTB4YTAwNSwgMHgwMTJlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDIwMDEsIDB4MDAyOCwgMHgyMDA5LAorCTB4MDAwMCwgMHgwY2IwLCAweDIwMDksIDB4YjUwYywgMHgyMTBjLCAweGQxOGMsIDB4MDExOCwgMHgyMDAxLAorCTB4MDAwNCwgMHgwMDM4LCAweGQxODQsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsIDB4MDAxMCwgMHgyMDAxLAorCTB4MDAyOSwgMHgyMDA5LCAweDAwMDAsIDB4MGMyMCwgMHgyMDAxLCAweDAwMjksIDB4MjAwOSwgMHgwMDAwLAorCTB4MDhmOCwgMHg2OTQ0LCAweDZlNDgsIDB4YTY4NCwgMHgzZmZmLCAweGEwODIsIDB4NDAwMCwgMHgxNmI4LAorCTB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE4MiwgMHgwMGZmLCAweDEyZTAsIDB4YTE4OCwgMHhiNjM1LAorCTB4MjEwNCwgMHhhMDY1LCAweDAxYjgsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4ZSwgMHgwMDA2LAorCTB4MTFiMCwgMHg2ODRjLCAweGQwZWMsIDB4MDEyMCwgMHgwODBjLCAweDUwZDUsIDB4MDQzMSwgMHgwMDMwLAorCTB4MDQyMSwgMHg2ODRjLCAweGQwZmMsIDB4MDExMCwgMHgwODBjLCAweDUwYzYsIDB4MDgwYywgMHg1MTEzLAorCTB4YTAwNiwgMHgwMGM4LCAweDIwMDEsIDB4MDAyOCwgMHgyMDA5LCAweDAwMDAsIDB4MDBhMCwgMHhhMDgyLAorCTB4MDAwNiwgMHgxMjQwLCAweDYxMDAsIDB4ZDFmYywgMHgwZDIwLCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LAorCTB4MTAwMCwgMHgwMDQ4LCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LCAweDAwMDAsIDB4MDAyMCwgMHgyMDAxLAorCTB4MDAyOSwgMHgyMDA5LCAweDAwMDAsIDB4YTAwNSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjA1MCwgMHhhMDBkLCAweDAxMzgsIDB4MmQwMCwgMHgyMDBhLCAweDY4MDMsIDB4MDAwMCwgMHg2MDUyLAorCTB4MDEyZSwgMHgwMDA1LCAweDJkMDAsIDB4NjA1MiwgMHg2MDRlLCAweDY4MDMsIDB4MDAwMCwgMHgwY2MwLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjA0YywgMHhhMDA1LCAweDAxNzAsIDB4MDBlNiwgMHgyMDcxLAorCTB4YjdlMCwgMHg3MDA0LCAweGEwODYsIDB4MDAwMiwgMHgwMTY4LCAweDAwZWUsIDB4NjA0YywgMHg2ODAyLAorCTB4MmQwMCwgMHg2MDRlLCAweDAxMmUsIDB4MDAwNSwgMHgyZDAwLCAweDYwNTIsIDB4NjA0ZSwgMHg2ODAzLAorCTB4MDAwMCwgMHgwY2MwLCAweDcwMWMsIDB4YWMwNiwgMHgxZDgwLCAweDYwNGMsIDB4MjA3MCwgMHg3MDAwLAorCTB4NjgwMiwgMHgyZDAwLCAweDcwMDIsIDB4MDBlZSwgMHgwMTJlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg2MDRjLCAweGEwNmQsIDB4MDEzMCwgMHg2ODAwLCAweGEwMDUsIDB4MTEwOCwgMHg2MDUyLAorCTB4NjA0ZSwgMHhhZDA1LCAweDAxMmUsIDB4MDAwNSwgMHg2MDRjLCAweGEwNmQsIDB4MDEzMCwgMHg2ODAwLAorCTB4YTAwNSwgMHgxMTA4LCAweDYwNTIsIDB4NjA0ZSwgMHhhZDA1LCAweDAwMDUsIDB4NjgwMywgMHgwMDAwLAorCTB4NjA4NCwgMHhhMDBkLCAweDAxMjAsIDB4MmQwMCwgMHgyMDBhLCAweDYwODYsIDB4MDAwNSwgMHgyZDAwLAorCTB4NjA4NiwgMHg2MDgyLCAweDBjZDgsIDB4MDEyNiwgMHgwMGM2LCAweDAwMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjIxOCwgMHgyMjYwLCAweDYyMDAsIDB4YTAwNSwgMHgwMTEwLCAweGMyODUsIDB4MDAwOCwgMHhjMjg0LAorCTB4NjIwMiwgMHgwMDJlLCAweDAwY2UsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MDBjNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg2MjE4LCAweDIyNjAsIDB4NjIwNCwgMHgwMDA2LCAweGEwODYsIDB4MDAwNiwgMHgxMTgwLAorCTB4NjA5YywgMHhkMGFjLCAweDAxNjgsIDB4MjAwMSwgMHhiNTUzLCAweDIwMDQsIDB4ZDBhNCwgMHgwMTQwLAorCTB4YTI4NCwgMHhmZjAwLCAweDgwMDcsIDB4YTA4NiwgMHgwMDA3LCAweDExMTAsIDB4MjAxMSwgMHgwNjAwLAorCTB4MDAwZSwgMHhhMjk0LCAweGZmMDAsIDB4YTIxNSwgMHg2MjA2LCAweDAwMDYsIDB4YTA4NiwgMHgwMDA2LAorCTB4MTEyOCwgMHg2MjkwLCAweDgyZmYsIDB4MTExMCwgMHgwODBjLCAweDE1MTUsIDB4MDAwZSwgMHgwMGNlLAorCTB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MDBjNiwgMHgyMDkxLCAweDgwMDAsIDB4NjIxOCwgMHgyMjYwLAorCTB4NjIwNCwgMHgwMDA2LCAweGEwODYsIDB4MDAwNiwgMHgxMTc4LCAweDYwOWMsIDB4ZDBhNCwgMHgwMTYwLAorCTB4MjAwMSwgMHhiNTUzLCAweDIwMDQsIDB4ZDBhYywgMHgxMTM4LCAweGEyODQsIDB4MDBmZiwgMHhhMDg2LAorCTB4MDAwNywgMHgxMTEwLCAweDIwMTEsIDB4MDAwNiwgMHgwMDBlLCAweGEyOTQsIDB4MDBmZiwgMHg4MDA3LAorCTB4YTIxNSwgMHg2MjA2LCAweDAwY2UsIDB4MDEyZSwgMHgwMDA1LCAweDAwMjYsIDB4YTE4MiwgMHgwMGZmLAorCTB4MDIxOCwgMHhhMDg1LCAweDAwMDEsIDB4MDBiMCwgMHhhMTkwLCAweGI2MzUsIDB4MjIwNCwgMHhhMDY1LAorCTB4MTE4MCwgMHgwMDE2LCAweDAwZDYsIDB4MDgwYywgMHgxNWRmLCAweDJkNjAsIDB4MDBkZSwgMHgwMDFlLAorCTB4MGQ4MCwgMHgyYzAwLCAweDIwMTIsIDB4NjBhNywgMHgwMDAwLCAweDYwYWIsIDB4MDAwMCwgMHgwODBjLAorCTB4NGMwYiwgMHhhMDA2LCAweDAwMmUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDI2LAorCTB4YTE4MiwgMHgwMGZmLCAweDAyMTgsIDB4YTA4NSwgMHgwMDAxLCAweDA0ODAsIDB4MDBkNiwgMHhhMTkwLAorCTB4YjYzNSwgMHgyMjA0LCAweGEwNmQsIDB4MDU0MCwgMHgyMDEzLCAweDAwMDAsIDB4MDBkNiwgMHgwMGM2LAorCTB4MmQ2MCwgMHg2MGE0LCAweGEwNmQsIDB4MDExMCwgMHgwODBjLCAweDE2MGYsIDB4NjBhOCwgMHhhMDZkLAorCTB4MDExMCwgMHgwODBjLCAweDE2MGYsIDB4MDBjZSwgMHgwMGRlLCAweDAwZDYsIDB4MDBjNiwgMHg2OGFjLAorCTB4MjA2MCwgMHg4Y2ZmLCAweDAxNjgsIDB4NjAwYywgMHgwMDA2LCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLAorCTB4OWM1YSwgMHgwMTEwLCAweDA4MGMsIDB4MTYxZiwgMHgwODBjLCAweDg2MWQsIDB4MDBjZSwgMHgwYzg4LAorCTB4MDBjZSwgMHgwMGRlLCAweDA4MGMsIDB4MTYwZiwgMHgwMGRlLCAweGEwMDYsIDB4MDAyZSwgMHgwMTJlLAorCTB4MDAwNSwgMHgwMDE2LCAweGExODIsIDB4MDBmZiwgMHgwMjE4LCAweGEwODUsIDB4MDAwMSwgMHgwMDMwLAorCTB4YTE4OCwgMHhiNjM1LCAweDIxMDQsIDB4YTA2NSwgMHgwZGMwLCAweGEwMDYsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDBkNiwgMHgwMTU2LCAweDAxMzYsIDB4MDE0NiwgMHg2MDBiLCAweDAwMDAsIDB4NjAwZiwgMHgwMDAwLAorCTB4NjAwMCwgMHhjMDhjLCAweDYwMDIsIDB4MDgwYywgMHg1YWNmLCAweDE1NTgsIDB4NjBhMCwgMHhhMDg2LAorCTB4MDA3ZSwgMHgyMDY5LCAweGJiOTAsIDB4MDEzMCwgMHgyMDAxLCAweGI1MzUsIDB4MjAwNCwgMHhkMGFjLAorCTB4MTUwMCwgMHgwMDk4LCAweDJkMDQsIDB4ZDBlNCwgMHgwMWUwLCAweDAwZDYsIDB4MjA2OSwgMHhiYjhlLAorCTB4MDBjNiwgMHgyMDYxLCAweGI3YjIsIDB4NjgxMCwgMHgyMDYyLCAweDY4MTQsIDB4NjAwNiwgMHg2ODE4LAorCTB4NjAwYSwgMHg2ODFjLCAweDYwMGUsIDB4MDBjZSwgMHgwMGRlLCAweDhkNjksIDB4MmQwNCwgMHgyMDY5LAorCTB4MDE0MCwgMHhhMDA1LCAweDExMTAsIDB4MjAwMSwgMHgwMDAxLCAweDY4ODYsIDB4MjA2OSwgMHhiNTAwLAorCTB4NjhhNiwgMHgyMDY5LCAweGJiOGUsIDB4NjgwOCwgMHg2MDVlLCAweDY4MTAsIDB4NjA2MiwgMHg2MTM4LAorCTB4YTEwYSwgMHgwMjA4LCAweDYwM2EsIDB4NjgxNCwgMHg2MDY2LCAweDIwOTksIDB4YmI5NiwgMHhhYzg4LAorCTB4MDAwYSwgMHgyMWEwLCAweDIwYTksIDB4MDAwNCwgMHg1M2EzLCAweDIwOTksIDB4YmI5YSwgMHhhYzg4LAorCTB4MDAwNiwgMHgyMWEwLCAweDIwYTksIDB4MDAwNCwgMHg1M2EzLCAweDIwNjksIDB4YmJhZSwgMHg2ODA4LAorCTB4NjA2YSwgMHg2OTBjLCAweDYxNmUsIDB4NjgxMCwgMHg2MDcyLCAweDY4MTgsIDB4NjA3NiwgMHg2MGEwLAorCTB4YTA4NiwgMHgwMDdlLCAweDExMjAsIDB4MjA2OSwgMHhiYjhlLCAweDY5MGMsIDB4NjE2ZSwgMHhhMTgyLAorCTB4MDIxMSwgMHgxMjE4LCAweDIwMDksIDB4MDAwOCwgMHgwNDAwLCAweGExODIsIDB4MDI1OSwgMHgxMjE4LAorCTB4MjAwOSwgMHgwMDA3LCAweDAwZDAsIDB4YTE4MiwgMHgwMmMxLCAweDEyMTgsIDB4MjAwOSwgMHgwMDA2LAorCTB4MDBhMCwgMHhhMTgyLCAweDAzNDksIDB4MTIxOCwgMHgyMDA5LCAweDAwMDUsIDB4MDA3MCwgMHhhMTgyLAorCTB4MDQyMSwgMHgxMjE4LCAweDIwMDksIDB4MDAwNCwgMHgwMDQwLCAweGExODIsIDB4MDU4MSwgMHgxMjE4LAorCTB4MjAwOSwgMHgwMDAzLCAweDAwMTAsIDB4MjAwOSwgMHgwMDAyLCAweDYxOTIsIDB4MDE0ZSwgMHgwMTNlLAorCTB4MDE1ZSwgMHgwMGRlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDAwZTYsIDB4MjA3MSwgMHhiYjhkLAorCTB4MmUwNCwgMHg2ODk2LCAweDIwNzEsIDB4YmI4ZSwgMHg3MDA0LCAweDY4OWEsIDB4NzAxYywgMHg2ODllLAorCTB4NmEwMCwgMHgyMDA5LCAweGI1NzIsIDB4MjEwYywgMHhkMGJjLCAweDAxMjAsIDB4ZDFlYywgMHgwMTEwLAorCTB4YzJhZCwgMHgwMDA4LCAweGMyYWMsIDB4ZDBjNCwgMHgwMTIwLCAweGQxZTQsIDB4MDExMCwgMHhjMmJkLAorCTB4MDAwOCwgMHhjMmJjLCAweDZhMDIsIDB4MDBlZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGQ2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjBhNCwgMHhhMDZkLCAweDAxYzAsIDB4NjkwMCwgMHg4MWZmLAorCTB4MTU0MCwgMHg2YTA0LCAweGEyODIsIDB4MDAxMCwgMHgxNjQ4LCAweGFkODgsIDB4MDAwNCwgMHgyMGE5LAorCTB4MDAxMCwgMHgyMTA0LCAweGEwODYsIDB4ZmZmZiwgMHgwMTI4LCAweDgxMDgsIDB4MWYwNCwgMHg1MDgxLAorCTB4MDgwYywgMHgxNTE1LCAweDI2MGEsIDB4ODIxMCwgMHg2YTA2LCAweDAwOTgsIDB4MDgwYywgMHgxNWY4LAorCTB4MDFhOCwgMHgyZDAwLCAweDYwYTYsIDB4NjgwMywgMHgwMDAwLCAweGFkODgsIDB4MDAwNCwgMHgyMGE5LAorCTB4MDAxMCwgMHgyMDBiLCAweGZmZmYsIDB4ODEwOCwgMHgxZjA0LCAweDUwOTksIDB4NjgwNywgMHgwMDAxLAorCTB4NmUxMiwgMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGRlLCAweDAwMDUsIDB4YTAwNiwgMHgwY2Q4LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDBkNiwgMHg2MGE0LCAweGEwMGQsIDB4MDFhMCwgMHgyMTY4LAorCTB4NjgwMCwgMHhhMDA1LCAweDExNjAsIDB4MDgwYywgMHg1MWQ0LCAweDExNjgsIDB4MjAwYiwgMHhmZmZmLAorCTB4NjgwNCwgMHhhMDhhLCAweDAwMDIsIDB4MDIxOCwgMHg4MDAxLCAweDY4MDYsIDB4MDAyMCwgMHgwODBjLAorCTB4MTYwZiwgMHg2MGE3LCAweDAwMDAsIDB4MDBkZSwgMHgwMTJlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDUyMzIsIDB4MDAxMCwgMHgwODBjLCAweDRlOGQsIDB4MDgwYywgMHg1MTRjLAorCTB4MWRkOCwgMHgwODBjLCAweDUxMTMsIDB4MDEyZSwgMHgwMDA1LCAweDAwZDYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg2MGE4LCAweGEwNmQsIDB4MDFjMCwgMHg2OTUwLCAweDgxZmYsIDB4MTU0MCwgMHg2YTU0LAorCTB4YTI4MiwgMHgwMDEwLCAweDE2NzAsIDB4YWQ4OCwgMHgwMDE4LCAweDIwYTksIDB4MDAxMCwgMHgyMTA0LAorCTB4YTA4NiwgMHhmZmZmLCAweDAxMjgsIDB4ODEwOCwgMHgxZjA0LCAweDUwZTcsIDB4MDgwYywgMHgxNTE1LAorCTB4MjYwYSwgMHg4MjEwLCAweDZhNTYsIDB4MDA5OCwgMHgwODBjLCAweDE1ZjgsIDB4MDFkMCwgMHgyZDAwLAorCTB4NjBhYSwgMHg2ODUzLCAweDAwMDAsIDB4YWQ4OCwgMHgwMDE4LCAweDIwYTksIDB4MDAxMCwgMHgyMDBiLAorCTB4ZmZmZiwgMHg4MTA4LCAweDFmMDQsIDB4NTBmZiwgMHg2ODU3LCAweDAwMDEsIDB4NmU2MiwgMHgwMDEwLAorCTB4MDgwYywgMHg0ZWRlLCAweDAwODksIDB4MWRlMCwgMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGRlLAorCTB4MDAwNSwgMHhhMDA2LCAweDBjZDgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2Y2FhLAorCTB4MDEyZSwgMHgwMDA1LCAweGEwMWUsIDB4MDAxMCwgMHgyMDE5LCAweDAwMDEsIDB4YTAwZSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDYwNGMsIDB4MjA2OCwgMHg2MDAwLCAweGQwZGMsIDB4MTE3MCwgMHg4ZGZmLAorCTB4MDFmOCwgMHg4M2ZmLCAweDAxMjAsIDB4Njg0OCwgMHhhNjA2LCAweDAxNTgsIDB4MDAzMCwgMHg2ODNjLAorCTB4YTQwNiwgMHgxMTE4LCAweDY4NDAsIDB4YTUwNiwgMHgwMTIwLCAweDJkMDgsIDB4NjgwMCwgMHgyMDY4LAorCTB4MGM3MCwgMHgwODBjLCAweDgxMWUsIDB4NmEwMCwgMHg2MDRjLCAweGFkMDYsIDB4MTExMCwgMHg2MjRlLAorCTB4MDAxOCwgMHhhMTgwLCAweDAwMDAsIDB4MjIwMiwgMHg4MmZmLCAweDExMTAsIDB4NjE1MiwgMHg4ZGZmLAorCTB4MDEyZSwgMHgwMDA1LCAweGEwMWUsIDB4MDAxMCwgMHgyMDE5LCAweDAwMDEsIDB4YTAwZSwgMHg2MDgwLAorCTB4MjA2OCwgMHg4ZGZmLCAweDAxZTgsIDB4ODNmZiwgMHgwMTIwLCAweDY4NDgsIDB4YTYwNiwgMHgwMTU4LAorCTB4MDAzMCwgMHg2ODNjLCAweGE0MDYsIDB4MTExOCwgMHg2ODQwLCAweGE1MDYsIDB4MDEyMCwgMHgyZDA4LAorCTB4NjgwMCwgMHgyMDY4LCAweDBjNzAsIDB4NmEwMCwgMHg2MDgwLCAweGFkMDYsIDB4MTExMCwgMHg2MjgyLAorCTB4MDAxOCwgMHhhMTgwLCAweDAwMDAsIDB4MjIwMiwgMHg4MmZmLCAweDExMTAsIDB4NjE4NiwgMHg4ZGZmLAorCTB4MDAwNSwgMHhhMDE2LCAweDA4MGMsIDB4NTFjZSwgMHgxMTEwLCAweDIwMTEsIDB4MDAwMSwgMHgwODBjLAorCTB4NTIxOSwgMHgxMTEwLCAweGEyOTUsIDB4MDAwMiwgMHgwMDA1LCAweDA4MGMsIDB4NTI0YSwgMHgwMTE4LAorCTB4MDgwYywgMHg5ZDBmLCAweDAwMTAsIDB4YTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDgwYywgMHg1MjRhLAorCTB4MDExOCwgMHgwODBjLCAweDljOWYsIDB4MDAxMCwgMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwODBjLAorCTB4NTI0YSwgMHgwMTE4LCAweDA4MGMsIDB4OWNmMiwgMHgwMDEwLCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LAorCTB4MDgwYywgMHg1MjRhLCAweDAxMTgsIDB4MDgwYywgMHg5Y2JiLCAweDAwMTAsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDAwNSwgMHgwODBjLCAweDUyNGEsIDB4MDExOCwgMHgwODBjLCAweDlkMmIsIDB4MDAxMCwgMHhhMDg1LAorCTB4MDAwMSwgMHgwMDA1LCAweDAxMjYsIDB4MDAwNiwgMHgwMGQ2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDgwLAorCTB4YTA2ZCwgMHgwMWEwLCAweDY4MDAsIDB4MDAwNiwgMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LAorCTB4MDAwMCwgMHgwODBjLCAweDllY2MsIDB4MDAwNiwgMHg2MDAwLCAweGQwZmMsIDB4MDExMCwgMHgwODBjLAorCTB4YjM4OSwgMHgwMDBlLCAweDA4MGMsIDB4NTQwOCwgMHgwMDBlLCAweDBjNTAsIDB4NjA4MywgMHgwMDAwLAorCTB4NjA4NywgMHgwMDAwLCAweDAwZGUsIDB4MDAwZSwgMHgwMTJlLCAweDAwMDUsIDB4NjBhNCwgMHhhMDBkLAorCTB4MTExOCwgMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMGU2LCAweDIxNzAsIDB4NzAwMCwgMHhhMDA1LAorCTB4MTE2OCwgMHgyMGE5LCAweDAwMTAsIDB4YWU4OCwgMHgwMDA0LCAweDIxMDQsIDB4YTYwNiwgMHgwMTMwLAorCTB4ODEwOCwgMHgxZjA0LCAweDUxZGQsIDB4YTA4NSwgMHgwMDAxLCAweDAwMDgsIDB4YTAwNiwgMHgwMGVlLAorCTB4MDAwNSwgMHgwMGQ2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYwYTQsIDB4YTA2ZCwgMHgxMTI4LAorCTB4MDgwYywgMHgxNWY4LCAweDAxYTAsIDB4MmQwMCwgMHg2MGE2LCAweDY4MDMsIDB4MDAwMSwgMHg2ODA3LAorCTB4MDAwMCwgMHhhZDg4LCAweDAwMDQsIDB4MjBhOSwgMHgwMDEwLCAweDIwMGIsIDB4ZmZmZiwgMHg4MTA4LAorCTB4MWYwNCwgMHg1MWZkLCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwZGUsIDB4MDAwNSwgMHhhMDA2LAorCTB4MGNkOCwgMHgwMGQ2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYwYTQsIDB4YTA2ZCwgMHgwMTMwLAorCTB4NjBhNywgMHgwMDAwLCAweDA4MGMsIDB4MTYwZiwgMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGRlLAorCTB4MDAwNSwgMHg2MGE4LCAweGEwMGQsIDB4MTExOCwgMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMGU2LAorCTB4MjE3MCwgMHg3MDUwLCAweGEwMDUsIDB4MTE2MCwgMHgyMGE5LCAweDAwMTAsIDB4YWU4OCwgMHgwMDE4LAorCTB4MjEwNCwgMHhhNjA2LCAweDAxMjgsIDB4ODEwOCwgMHgxZjA0LCAweDUyMjgsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDBlZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDBjMTksIDB4MTE4OCwgMHgyMDBiLAorCTB4ZmZmZiwgMHgwMGQ2LCAweDYwYTgsIDB4MjA2OCwgMHg2ODU0LCAweGEwOGEsIDB4MDAwMiwgMHgwMjE4LAorCTB4ODAwMSwgMHg2ODU2LCAweDAwMjAsIDB4MDgwYywgMHgxNjBmLCAweDYwYWIsIDB4MDAwMCwgMHgwMGRlLAorCTB4MDEyZSwgMHgwMDA1LCAweDYwOWMsIDB4ZDBhNCwgMHgwMDA1LCAweDAwZjYsIDB4MDgwYywgMHg1YWNmLAorCTB4MDFiMCwgMHg3MWI4LCAweDgxZmYsIDB4MTE5OCwgMHg3MWQ0LCAweGQxOWMsIDB4MDE4MCwgMHgyMDAxLAorCTB4MDA3ZSwgMHhhMDgwLCAweGI2MzUsIDB4MjAwNCwgMHhhMDdkLCAweDAxNDgsIDB4NzgwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MTExOCwgMHg3ODAwLCAweGMwZWQsIDB4NzgwMiwgMHgyMDc5LAorCTB4YjU1MiwgMHg3ODA0LCAweGQwYTQsIDB4MDFlOCwgMHgwMTU2LCAweDAwYzYsIDB4MjBhOSwgMHgwMDdmLAorCTB4MjAwOSwgMHgwMDAwLCAweDAwMTYsIDB4MDgwYywgMHg0ZmE5LCAweDExNjgsIDB4NjAwNCwgMHhhMDg0LAorCTB4ZmYwMCwgMHg4MDA3LCAweGEwOTYsIDB4MDAwNCwgMHgwMTE4LCAweGEwODYsIDB4MDAwNiwgMHgxMTE4LAorCTB4NjAwMCwgMHhjMGVkLCAweDYwMDIsIDB4MDAxZSwgMHg4MTA4LCAweDFmMDQsIDB4NTI3MiwgMHgwMGNlLAorCTB4MDE1ZSwgMHgwODBjLCAweDUzMDksIDB4MDEyMCwgMHgyMDAxLCAweGI3YjUsIDB4MjAwYywgMHgwMDM4LAorCTB4MjA3OSwgMHhiNTUyLCAweDc4MDQsIDB4ZDBhNCwgMHgwMTMwLCAweDIwMDksIDB4MDdkMCwgMHgyMDExLAorCTB4NTI5ZCwgMHgwODBjLCAweDZhMjIsIDB4MDBmZSwgMHgwMDA1LCAweDIwMTEsIDB4NTI5ZCwgMHgwODBjLAorCTB4Njk5YywgMHgwODBjLCAweDUzMDksIDB4MDFmMCwgMHgyMDAxLCAweGI2YjMsIDB4MjAwNCwgMHhhMDgwLAorCTB4MDAwMCwgMHgyMDBjLCAweGMxZWMsIDB4MjEwMiwgMHgyMDAxLCAweGI1NTMsIDB4MjAwNCwgMHhkMGE0LAorCTB4MDEzMCwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwgMHg1MjlkLCAweDA4MGMsIDB4NmEyMiwgMHgwMGU2LAorCTB4MjA3MSwgMHhiNTAwLCAweDcwNzMsIDB4MDAwMCwgMHg3MDc3LCAweDAwMDAsIDB4MDgwYywgMHgyYWI4LAorCTB4MDBlZSwgMHgwNGIwLCAweDAxNTYsIDB4MDBjNiwgMHgyMGE5LCAweDAwN2YsIDB4MjAwOSwgMHgwMDAwLAorCTB4MDAxNiwgMHgwODBjLCAweDRmYTksIDB4MTUzMCwgMHg2MDAwLCAweGQwZWMsIDB4MDUxOCwgMHgwMDQ2LAorCTB4NjJhMCwgMHhhMjk0LCAweDAwZmYsIDB4ODIyNywgMHhhMDA2LCAweDIwMDksIDB4MDAyOSwgMHgwODBjLAorCTB4YjBlOCwgMHg2MDAwLCAweGMwZTUsIDB4YzBlYywgMHg2MDAyLCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4NSwgMHgwNzAwLCAweDYwMDYsIDB4MjAxOSwgMHgwMDI5LCAweDA4MGMsIDB4NmRmNSwgMHgwMDc2LAorCTB4MjAzOSwgMHgwMDAwLCAweDA4MGMsIDB4NmQwMiwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHhhZTgyLAorCTB4MDA3ZSwgMHgwMDRlLCAweDAwMWUsIDB4ODEwOCwgMHgxZjA0LCAweDUyYzgsIDB4MDBjZSwgMHgwMTVlLAorCTB4MDAwNSwgMHgwMGM2LCAweDYwMTgsIDB4MjA2MCwgMHg2MDAwLCAweGMwZWMsIDB4NjAwMiwgMHgwMGNlLAorCTB4MDAwNSwgMHg3ODE4LCAweDIwMDQsIDB4ZDBhYywgMHgwMDA1LCAweDc4MTgsIDB4MjAwNCwgMHhkMGJjLAorCTB4MDAwNSwgMHgwMGY2LCAweDIwMDEsIDB4YjZiMywgMHgyMDA0LCAweGEwN2QsIDB4MDExMCwgMHg3ODAwLAorCTB4ZDBlYywgMHgwMGZlLCAweDAwMDUsIDB4MDEyNiwgMHgwMDI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDA2LAorCTB4NjJhMCwgMHhhMjkwLCAweGI2MzUsIDB4MjIwNCwgMHhhYzA2LCAweDE5MGMsIDB4MTUxNSwgMHgwMDBlLAorCTB4NjIwMCwgMHhhMDA1LCAweDAxMTAsIDB4YzJmZCwgMHgwMDA4LCAweGMyZmMsIDB4NjIwMiwgMHgwMDJlLAorCTB4MDEyZSwgMHgwMDA1LCAweDIwMTEsIDB4YjUzNSwgMHgyMjA0LCAweGQwY2MsIDB4MDEzOCwgMHgyMDAxLAorCTB4YjdiMywgMHgyMDBjLCAweDIwMTEsIDB4NTMzNywgMHgwODBjLCAweDZhMjIsIDB4MDAwNSwgMHgyMDExLAorCTB4NTMzNywgMHgwODBjLCAweDY5OWMsIDB4MjAxMSwgMHhiNTM1LCAweDIyMDQsIDB4YzBjYywgMHgyMDEyLAorCTB4MDAwNSwgMHgyMDcxLCAweGI2MTQsIDB4NzAwMywgMHgwMDAxLCAweDcwMDcsIDB4MDAwMCwgMHg3MDEzLAorCTB4MDAwMCwgMHg3MDE3LCAweDAwMDAsIDB4NzAxYiwgMHgwMDAwLCAweDcwMWYsIDB4MDAwMCwgMHg3MDBiLAorCTB4MDAwMCwgMHg3MDRiLCAweDAwMDEsIDB4NzA0ZiwgMHgwMDAwLCAweDcwNWIsIDB4MDAyMCwgMHg3MDVmLAorCTB4MDA0MCwgMHg3MDdmLCAweDAwMDAsIDB4MjA3MSwgMHhiNzdkLCAweDcwMDMsIDB4YjYxNCwgMHg3MDA3LAorCTB4MDAwMCwgMHg3MDBiLCAweDAwMDAsIDB4NzAwZiwgMHhiNzVkLCAweDcwMTMsIDB4MDAyMCwgMHg3MDE3LAorCTB4MDA0MCwgMHg3MDM3LCAweDAwMDAsIDB4MDAwNSwgMHgwMDE2LCAweDAwZTYsIDB4MjA3MSwgMHhiNzM1LAorCTB4YTAwZSwgMHg3MTg2LCAweDcxOGEsIDB4NzA5NywgMHgwMDAxLCAweDIwMDEsIDB4YjU1MywgMHgyMDA0LAorCTB4ZDBmYywgMHgxMTUwLCAweDIwMDEsIDB4YjU1MywgMHgyMDA0LCAweGEwMGUsIDB4ZDA5YywgMHgwMTA4LAorCTB4ODEwOCwgMHg3MTAyLCAweDA4MDQsIDB4NTNkMiwgMHgyMDAxLCAweGI1NzIsIDB4MjAwYywgMHhhMTg0LAorCTB4MDAwZiwgMHgyMDA5LCAweGI1NzMsIDB4MjEwYywgMHgwMDAyLCAweDUzN2EsIDB4NTNhZCwgMHg1M2I0LAorCTB4NTNiZSwgMHg1M2MzLCAweDUzN2EsIDB4NTM3YSwgMHg1MzdhLCAweDUzOWQsIDB4NTM3YSwgMHg1MzdhLAorCTB4NTM3YSwgMHg1MzdhLCAweDUzN2EsIDB4NTM3YSwgMHg1MzdhLCAweDcwMDMsIDB4MDAwNCwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDIwOTksIDB4YjU3NiwgMHgyMGExLCAweGI3ODYsIDB4MjBhOSwgMHgwMDA0LAorCTB4NTNhMywgMHgwMTVlLCAweDAxNGUsIDB4MDEzZSwgMHgwNDI4LCAweDcwOGYsIDB4MDAwNSwgMHg3MDA3LAorCTB4MDEyMiwgMHgyMDAxLCAweDAwMDIsIDB4MDAzMCwgMHg3MDhmLCAweDAwMDIsIDB4NzAwNywgMHgwMTIxLAorCTB4MjAwMSwgMHgwMDAzLCAweDcwMDIsIDB4NzA5NywgMHgwMDAxLCAweDAwODgsIDB4NzAwNywgMHgwMTIyLAorCTB4MjAwMSwgMHgwMDAyLCAweDAwMjAsIDB4NzAwNywgMHgwMTIxLCAweDIwMDEsIDB4MDAwMywgMHg3MDAyLAorCTB4YTAwNiwgMHg3MDk2LCAweDcwOGUsIDB4YTE4NCwgMHhmZjAwLCAweDgwMDcsIDB4NzA5YSwgMHhhMTg0LAorCTB4MDBmZiwgMHg3MDkyLCAweDAwZWUsIDB4MDAxZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhiNjE0LAorCTB4Njg0YywgMHhhMDA1LCAweDExMzAsIDB4NzAyOCwgMHhjMDg1LCAweDcwMmEsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDQyOCwgMHg2YTYwLCAweDcyMzYsIDB4NmI2NCwgMHg3MzNhLCAweDY4NjgsIDB4NzAzZSwgMHg3MDc2LAorCTB4Njg2YywgMHg3MDQyLCAweDcwN2EsIDB4Njg0YywgMHg3MDJlLCAweDY4NDQsIDB4NzAzMiwgMHgyMDA5LAorCTB4MDAwZCwgMHgyMDBhLCAweDcwMGIsIDB4MDAwMCwgMHg4MDA3LCAweDgwMDYsIDB4ODAwNiwgMHhhMDhjLAorCTB4MDAzZiwgMHhhMDg0LCAweGZmYzAsIDB4YTIxMCwgMHgyMTAwLCAweGEzMTksIDB4NzI2ZSwgMHg3MzcyLAorCTB4NzAyOCwgMHhjMDg0LCAweDcwMmEsIDB4NzAwNywgMHgwMDAxLCAweGEwMDYsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDE1NiwgMHgwMGU2LCAweDAwMjYsIDB4NjgzOCwgMHhkMGZjLCAweDE5MDQsIDB4NTQ2MSwgMHg2ODA0LAorCTB4YTAwZCwgMHgwMTg4LCAweDAwZDYsIDB4MjA3MSwgMHhiNTAwLCAweGEwMTYsIDB4NzAyYywgMHgyMTY4LAorCTB4NjkwNCwgMHgyMDZhLCAweDgyMTAsIDB4MmQwMCwgMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwgMHg3MGI0LAorCTB4YTIwMCwgMHg3MGI2LCAweDAwZGUsIDB4MjA3MSwgMHhiNjE0LCAweDcwMWMsIDB4YTAwNSwgMHgxOTA0LAorCTB4NTQ3MSwgMHgyMGE5LCAweDAwMzIsIDB4MGYwNCwgMHg1NDZmLCAweDBlMDQsIDB4NTQyYiwgMHgyMDcxLAorCTB4YjczNSwgMHg3MjAwLCAweDgyZmYsIDB4MDVkOCwgMHg2OTM0LCAweGExODYsIDB4MDEwMywgMHgxOTA0LAorCTB4NTQ3ZiwgMHg2OTQ4LCAweDY4NDQsIDB4YTEwNSwgMHgxNTQwLCAweDIwMDksIDB4ODAyMCwgMHgyMjAwLAorCTB4MDAwMiwgMHg1NDZmLCAweDU0NDYsIDB4NTQ5NywgMHg1NGEzLCAweDU0NmYsIDB4MjA3MSwgMHgwMDAwLAorCTB4MjBhOSwgMHgwMDMyLCAweDBmMDQsIDB4NTQ2ZiwgMHg3MDE4LCAweGQwODQsIDB4MWRkOCwgMHg3MTIyLAorCTB4NjgzYywgMHg3MDI2LCAweDY4NDAsIDB4NzAyYSwgMHg3MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLAorCTB4MjA3MSwgMHhiNTAwLCAweDcwMmMsIDB4MjA2YSwgMHgyZDAwLCAweDcwMmUsIDB4NzBiNCwgMHg4MDAwLAorCTB4NzBiNiwgMHgwMDJlLCAweDAwZWUsIDB4MDE1ZSwgMHgwMDA1LCAweDY4NDQsIDB4YTA4NiwgMHgwMTAwLAorCTB4MTEzMCwgMHg2ODY4LCAweGEwMDUsIDB4MTExOCwgMHgyMDA5LCAweDgwMjAsIDB4MDg4MCwgMHgyMDcxLAorCTB4YjYxNCwgMHgyZDA4LCAweDIwNmIsIDB4MDAwMCwgMHg3MDEwLCAweDgwMDAsIDB4NzAxMiwgMHg3MDE4LAorCTB4YTA2ZCwgMHg3MTFhLCAweDAxMTAsIDB4NjkwMiwgMHgwMDA4LCAweDcxMWUsIDB4MGMxMCwgMHhhMThjLAorCTB4MDBmZiwgMHhhMTg2LCAweDAwMTcsIDB4MDEzMCwgMHhhMTg2LCAweDAwMWUsIDB4MDExOCwgMHhhMThlLAorCTB4MDAxZiwgMHgxZDI4LCAweDY4NGMsIDB4ZDBjYywgMHgwZDEwLCAweDY4NTAsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4NiwgMHgwMDAxLCAweDE5ZTAsIDB4MjAwOSwgMHg4MDIxLCAweDA4MDQsIDB4NTQzZiwgMHg3MDg0LAorCTB4ODAwOCwgMHhhMDkyLCAweDAwMWUsIDB4MWE5OCwgMHg3MTg2LCAweGFlOTAsIDB4MDAwMywgMHhhMjEwLAorCTB4NjgzYywgMHgyMDEyLCAweDAwNzgsIDB4NzA4NCwgMHg4MDA4LCAweGEwOTIsIDB4MDAwZiwgMHgxYTM4LAorCTB4NzE4NiwgMHhhZTkwLCAweDAwMDMsIDB4ODAwMywgMHhhMjEwLCAweDY4M2MsIDB4MjAxMiwgMHg4MjEwLAorCTB4Njg0MCwgMHgyMDEyLCAweDcwODgsIDB4YTEwYSwgMHgwYTA0LCAweDU0NTgsIDB4NzE4YywgMHg3MDg0LAorCTB4YTEwYSwgMHgwYTA0LCAweDU0NTgsIDB4MjA3MSwgMHgwMDAwLCAweDcwMTgsIDB4ZDA4NCwgMHgxOTA0LAorCTB4NTQ1OCwgMHgyMDcxLCAweGI3MzUsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDIsIDB4MTE1MCwgMHgwODBjLAorCTB4NTcyMiwgMHgyMDcxLCAweDAwMDAsIDB4NzAxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgwODA0LAorCTB4NTQ1OCwgMHgwODBjLCAweDU3NGMsIDB4MjA3MSwgMHgwMDAwLCAweDcwMWIsIDB4MDAwMSwgMHgyMDkxLAorCTB4NDA4MCwgMHgwODA0LCAweDU0NTgsIDB4MDAwNiwgMHg2ODRjLCAweDAwMDYsIDB4NjgzNywgMHgwMTAzLAorCTB4MjBhOSwgMHgwMDFjLCAweGFkODAsIDB4MDAxMSwgMHgyMGEwLCAweDIwMDEsIDB4MDAwMCwgMHg0MGE0LAorCTB4MDAwZSwgMHhhMDg0LCAweDAwZmYsIDB4Njg0ZSwgMHgwMDBlLCAweDY4NGEsIDB4Njk1MiwgMHgwMDA1LAorCTB4MjA3MSwgMHhiNjE0LCAweDcwMDQsIDB4MDAwMiwgMHg1NGZlLCAweDU1MGYsIDB4NTcwZCwgMHg1NzBlLAorCTB4NTcxYiwgMHg1NzIxLCAweDU0ZmYsIDB4NTZmZSwgMHg1Njk0LCAweDU2ZWEsIDB4MDAwNSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDBlMDQsIDB4NTUwZSwgMHgyMDA5LCAweDAwMGQsIDB4NzAzMCwgMHgyMDBhLAorCTB4MjA5MSwgMHg0MDgwLCAweDcwMDcsIDB4MDAwMSwgMHg3MDBiLCAweDAwMDAsIDB4MDEyZSwgMHgyMDY5LAorCTB4YjdmMywgMHg2ODNjLCAweGEwMDUsIDB4MDNmOCwgMHgxMWYwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA2OSwgMHgwMDAwLCAweDY5MzQsIDB4MjAwMSwgMHhiNjIwLCAweDIwMDQsIDB4YTEwYSwgMHgwMTcwLAorCTB4MGUwNCwgMHg1NTMyLCAweDIwNjksIDB4MDAwMCwgMHg2ODE4LCAweGQwODQsIDB4MTE1OCwgMHgyMDA5LAorCTB4ODA0MCwgMHg2OTIyLCAweDY4MWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MjA2OSwgMHhiN2YzLAorCTB4NjgzZiwgMHhmZmZmLCAweDAxMmUsIDB4MjA2OSwgMHhiNTAwLCAweDY4NDgsIDB4Njk2OCwgMHhhMTAyLAorCTB4MjA2OSwgMHhiNzM1LCAweDY4OGEsIDB4Njk4NCwgMHg3MDFjLCAweGEwNmQsIDB4MDEyMCwgMHg4MWZmLAorCTB4MDkwNCwgMHg1NTg4LCAweDAwYTAsIDB4ODFmZiwgMHgwOTA0LCAweDU2NGUsIDB4MjA3MSwgMHhiNzM1LAorCTB4NzE4NCwgMHg3MDg4LCAweGExMGEsIDB4MTI1OCwgMHg3MTkwLCAweDIwNzEsIDB4YjdmMywgMHg3MDM4LAorCTB4YTAwNSwgMHgwMTI4LCAweDFiMDQsIDB4NTY0ZSwgMHg3MTNhLCAweDA4MDQsIDB4NTY0ZSwgMHgyMDcxLAorCTB4YjczNSwgMHg3MThjLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwODQsIDB4YTEwYSwgMHgwYTA0LAorCTB4NTY2OSwgMHgwZTA0LCAweDU2MGEsIDB4MjA3MSwgMHgwMDAwLCAweDcwMTgsIDB4ZDA4NCwgMHgxOTA0LAorCTB4NTYwYSwgMHgyMDAxLCAweGZmZmYsIDB4MjA3MSwgMHhiN2YzLCAweDcwM2EsIDB4MjA3MSwgMHhiNzM1LAorCTB4NzAwMCwgMHhhMDg2LCAweDAwMDIsIDB4MTE1MCwgMHgwODBjLCAweDU3MjIsIDB4MjA3MSwgMHgwMDAwLAorCTB4NzAxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgwODA0LCAweDU2MGEsIDB4MDgwYywgMHg1NzRjLAorCTB4MjA3MSwgMHgwMDAwLCAweDcwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MDgwNCwgMHg1NjBhLAorCTB4MjA3MSwgMHhiNzM1LCAweDcwMDAsIDB4YTAwNSwgMHgwOTA0LCAweDU2MzAsIDB4NjkzNCwgMHhhMTg2LAorCTB4MDEwMywgMHgxOTA0LCAweDU2MGQsIDB4Njg0YywgMHhkMGJjLCAweDE5MDQsIDB4NTYzMCwgMHg2OTQ4LAorCTB4Njg0NCwgMHhhMTA1LCAweDE5MDQsIDB4NTYyNSwgMHgyMDA5LCAweDgwMjAsIDB4MjA3MSwgMHhiNzM1LAorCTB4NzAwMCwgMHgwMDAyLCAweDU2MzAsIDB4NTVmMCwgMHg1NWM4LCAweDU1ZGEsIDB4NTVhNywgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDIwOTksIDB4YjU3NiwgMHgyMGExLCAweGI3ODYsIDB4MjBhOSwgMHgwMDA0LAorCTB4NTNhMywgMHgwMTVlLCAweDAxNGUsIDB4MDEzZSwgMHgyMDcxLCAweGI3N2QsIDB4YWQ4MCwgMHgwMDBmLAorCTB4NzAwZSwgMHg3MDEzLCAweDAwMDIsIDB4NzAwNywgMHgwMDAyLCAweDcwMGIsIDB4MDAwMCwgMHgyZTEwLAorCTB4MDgwYywgMHgxNjQzLCAweDIwNzEsIDB4YjYxNCwgMHg3MDA3LCAweDAwMDksIDB4MDgwNCwgMHg1NjRlLAorCTB4NzA4NCwgMHg4MDA4LCAweGEwOTIsIDB4MDAxZSwgMHgxYTA0LCAweDU2NGUsIDB4YWU5MCwgMHgwMDAzLAorCTB4YTIxMCwgMHg2ODNjLCAweDIwMTIsIDB4NzE4NiwgMHgyMDcxLCAweGI2MTQsIDB4MDgwYywgMHg1N2EzLAorCTB4MDgwNCwgMHg1NjRlLCAweDcwODQsIDB4ODAwOCwgMHhhMDkyLCAweDAwMGYsIDB4MWEwNCwgMHg1NjRlLAorCTB4YWU5MCwgMHgwMDAzLCAweDgwMDMsIDB4YTIxMCwgMHg2ODNjLCAweDIwMTIsIDB4ODIxMCwgMHg2ODQwLAorCTB4MjAxMiwgMHg3MTg2LCAweDIwNzEsIDB4YjYxNCwgMHgwODBjLCAweDU3YTMsIDB4MDgwNCwgMHg1NjRlLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MGUwNCwgMHg1NjBhLCAweDIwNzEsIDB4MDAwMCwgMHg3MDE4LAorCTB4ZDA4NCwgMHgxMTgwLCAweDcxMjIsIDB4NjgzYywgMHg3MDI2LCAweDY4NDAsIDB4NzAyYSwgMHg3MDFiLAorCTB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MDEyZSwgMHgyMDcxLCAweGI2MTQsIDB4MDgwYywgMHg1N2EzLAorCTB4MDgwNCwgMHg1NjRlLCAweDAxMmUsIDB4MDgwNCwgMHg1NjRlLCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LAorCTB4MDAxNywgMHgwMTMwLCAweGExODYsIDB4MDAxZSwgMHgwMTE4LCAweGExOGUsIDB4MDAxZiwgMHgxMWMwLAorCTB4Njg0YywgMHhkMGNjLCAweDAxYTgsIDB4Njg1MCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDAxLAorCTB4MTE3OCwgMHgyMDA5LCAweDgwMjEsIDB4MDgwNCwgMHg1NTllLCAweDY4NDQsIDB4YTA4NiwgMHgwMTAwLAorCTB4MTEzOCwgMHg2ODY4LCAweGEwMDUsIDB4MTEyMCwgMHgyMDA5LCAweDgwMjAsIDB4MDgwNCwgMHg1NTllLAorCTB4MjA3MSwgMHhiNjE0LCAweDA4MGMsIDB4NTdiNSwgMHgwMWM4LCAweDIwNzEsIDB4YjYxNCwgMHg3MDBmLAorCTB4MDAwMSwgMHg2OTM0LCAweGExODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDMsIDB4MTEzMCwgMHg4MTBmLAorCTB4YTE4YywgMHgwMGZmLCAweDgxMDEsIDB4MDEwOCwgMHg3MTBlLCAweDcwMDcsIDB4MDAwMywgMHgwODBjLAorCTB4NTdjZSwgMHg3MDUwLCAweGEwODYsIDB4MDEwMCwgMHgwOTA0LCAweDU3MGUsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDcxLCAweGI2MTQsIDB4NzAwOCwgMHhhMDg2LCAweDAwMDEsIDB4MTE4MCwgMHgwZTA0LAorCTB4NTY2NywgMHgyMDA5LCAweDAwMGQsIDB4NzAzMCwgMHgyMDBhLCAweDIwOTEsIDB4NDA4MCwgMHg3MDBiLAorCTB4MDAwMCwgMHg3MDA0LCAweGEwODYsIDB4MDAwNiwgMHgxMTEwLCAweDcwMDcsIDB4MDAwMSwgMHgwMTJlLAorCTB4MDAwNSwgMHgyMDcxLCAweGI2MTQsIDB4MDgwYywgMHg1N2I1LCAweDA1MTgsIDB4MjA3MSwgMHhiNzM1LAorCTB4NzA4NCwgMHg3MDBhLCAweDIwYTksIDB4MDAyMCwgMHgyMDk5LCAweGI3MzYsIDB4MjBhMSwgMHhiNzVkLAorCTB4NTNhMywgMHg3MDg3LCAweDAwMDAsIDB4MjA3MSwgMHhiNjE0LCAweDIwNjksIDB4Yjc3ZCwgMHg3MDZjLAorCTB4NjgyNiwgMHg3MDcwLCAweDY4MmEsIDB4NzA3NCwgMHg2ODJlLCAweDcwNzgsIDB4NjgzMiwgMHgyZDEwLAorCTB4MDgwYywgMHgxNjQzLCAweDcwMDcsIDB4MDAwOCwgMHgyMDAxLCAweGZmZmYsIDB4MjA3MSwgMHhiN2YzLAorCTB4NzAzYSwgMHgwMTJlLCAweDA4MDQsIDB4NTY0ZSwgMHgyMDY5LCAweGI3N2QsIDB4NjgwOCwgMHhhMDhlLAorCTB4MDAwMCwgMHgwOTA0LCAweDU2ZTksIDB4YTA4ZSwgMHgwMjAwLCAweDA5MDQsIDB4NTZlNywgMHhhMDhlLAorCTB4MDEwMCwgMHgxOTA0LCAweDU2ZTksIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MGUwNCwgMHg1NmU1LAorCTB4MjA2OSwgMHgwMDAwLCAweDY4MTgsIDB4ZDA4NCwgMHgxNWMwLCAweDcwMmMsIDB4NzEzMCwgMHg4MTA4LAorCTB4YTEwMiwgMHgwMjMwLCAweGEwMGUsIDB4NzAzNCwgMHg3MDZlLCAweDcwMzgsIDB4NzA3MiwgMHgwMDQ4LAorCTB4NzA2YywgMHhhMDgwLCAweDAwNDAsIDB4NzA2ZSwgMHgxMjIwLCAweDcwNzAsIDB4YTA4MSwgMHgwMDAwLAorCTB4NzA3MiwgMHg3MTMyLCAweDY5MzYsIDB4NzAwYiwgMHgwMDAwLCAweDIwMDEsIDB4Yjc1YSwgMHgyMDA0LAorCTB4YTAwNSwgMHgxMTkwLCAweDY5MzQsIDB4MjA2OSwgMHhiNzM1LCAweDY4OWMsIDB4Njk5ZSwgMHgyMDY5LAorCTB4YjdmMywgMHhhMTAyLCAweDExMTgsIDB4NjgzYywgMHhhMDA1LCAweDEzNjgsIDB4MjAwMSwgMHhiNzViLAorCTB4MjAwYywgMHg4MTBkLCAweDY5M2UsIDB4MDAzOCwgMHgyMDA5LCAweDgwNDAsIDB4NjkyMiwgMHg2ODFiLAorCTB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4NzAwNywgMHgwMDAxLCAweDAxMmUsIDB4MDAxMCwgMHg3MDA3LAorCTB4MDAwNSwgMHgwMDA1LCAweDIwMDEsIDB4Yjc3ZiwgMHgyMDA0LCAweGEwOGUsIDB4MDEwMCwgMHgxMTI4LAorCTB4NzAwNywgMHgwMDAxLCAweDA4MGMsIDB4NTdhMywgMHgwMDA1LCAweGEwOGUsIDB4MDAwMCwgMHgwZGUwLAorCTB4YTA4ZSwgMHgwMjAwLCAweDFkYzgsIDB4NzAwNywgMHgwMDA1LCAweDAwMDUsIDB4NzAxYywgMHhhMDZkLAorCTB4MDE1OCwgMHgwODBjLCAweDU3YjUsIDB4MDE0MCwgMHg3MDA3LCAweDAwMDMsIDB4MDgwYywgMHg1N2NlLAorCTB4NzA1MCwgMHhhMDg2LCAweDAxMDAsIDB4MDExMCwgMHgwMDA1LCAweDAwMDUsIDB4NzA1MCwgMHhhMDllLAorCTB4MDEwMCwgMHgxMTE4LCAweDcwMDcsIDB4MDAwNCwgMHgwMDMwLCAweGEwODYsIDB4MDIwMCwgMHgxMTEwLAorCTB4NzAwNywgMHgwMDA1LCAweDAwMDUsIDB4MDgwYywgMHg1NzcxLCAweDcwMDYsIDB4MDgwYywgMHg1N2EzLAorCTB4MDAwNSwgMHgwMDA1LCAweDAwZTYsIDB4MDE1NiwgMHgyMDcxLCAweGI3MzUsIDB4NzE4NCwgMHg4MWZmLAorCTB4MDUwMCwgMHhhMDA2LCAweDcwODYsIDB4YWU4MCwgMHgwMDAzLCAweDIwNzEsIDB4MDAwMCwgMHgyMWE4LAorCTB4MjAxNCwgMHg3MjI2LCAweDgwMDAsIDB4MGYwNCwgMHg1NzQ2LCAweDIwMTQsIDB4NzIyYSwgMHg4MDAwLAorCTB4MGYwNCwgMHg1NzQ2LCAweDIwMTQsIDB4NzIyZSwgMHg4MDAwLCAweDBmMDQsIDB4NTc0NiwgMHgyMDE0LAorCTB4NzIzYSwgMHg4MDAwLCAweDBmMDQsIDB4NTc0NiwgMHgyMDE0LCAweDcyM2UsIDB4YTE4MCwgMHg4MDMwLAorCTB4NzAyMiwgMHgwMTVlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAxNTYsIDB4MjA3MSwgMHhiNzM1LAorCTB4NzE4NCwgMHg4MWZmLCAweDAxZDgsIDB4YTAwNiwgMHg3MDg2LCAweGFlODAsIDB4MDAwMywgMHgyMDcxLAorCTB4MDAwMCwgMHgyMWE4LCAweDIwMTQsIDB4NzIyNiwgMHg4MDAwLCAweDIwMTQsIDB4NzIyYSwgMHg4MDAwLAorCTB4MGYwNCwgMHg1NzY4LCAweDIwMTQsIDB4NzIzYSwgMHg4MDAwLCAweDIwMTQsIDB4NzIzZSwgMHgwMDE4LAorCTB4MjAwMSwgMHg4MDIwLCAweDAwMTAsIDB4MjAwMSwgMHg4MDQyLCAweDcwMjIsIDB4MDE1ZSwgMHgwMGVlLAorCTB4MDAwNSwgMHg3MDJjLCAweDcxMzAsIDB4ODEwOCwgMHhhMTAyLCAweDAyMzAsIDB4YTAwZSwgMHg3MDM0LAorCTB4NzA2ZSwgMHg3MDM4LCAweDcwNzIsIDB4MDA0OCwgMHg3MDZjLCAweGEwODAsIDB4MDA0MCwgMHg3MDZlLAorCTB4MTIyMCwgMHg3MDcwLCAweGEwODEsIDB4MDAwMCwgMHg3MDcyLCAweDcxMzIsIDB4NzAwYywgMHg4MDAxLAorCTB4NzAwZSwgMHgxMTgwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDBlMDQsIDB4NTc5ZCwgMHgyMDAxLAorCTB4MDAwZCwgMHgyMTAyLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwMDEsIDB4NzAwYiwgMHgwMDAwLAorCTB4MDEyZSwgMHgwMDA1LCAweDIwMDEsIDB4MDAwNywgMHgwMDA1LCAweDIwMDEsIDB4MDAwNiwgMHg3MDBiLAorCTB4MDAwMSwgMHgwMTJlLCAweDAwMDUsIDB4NzAxYywgMHhhMDZkLCAweDAxNzAsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg3MDEwLCAweDgwMDEsIDB4NzAxMiwgMHgyZDA0LCAweDcwMWUsIDB4YTAwNSwgMHgxMTA4LAorCTB4NzAxYSwgMHgwMTJlLCAweDA4MGMsIDB4MTYwZiwgMHgwMDA1LCAweDIwMTksIDB4MDAwZCwgMHgyMzA0LAorCTB4MjMwYywgMHhhMTBlLCAweDAxMzAsIDB4MjMwNCwgMHgyMzBjLCAweGExMGUsIDB4MDExMCwgMHhhMDA2LAorCTB4MDA2MCwgMHg3MzJjLCAweDgzMTksIDB4NzEzMCwgMHhhMTAyLCAweDExMTgsIDB4MjMwMCwgMHhhMDA1LAorCTB4MDAyMCwgMHgwMjEwLCAweGEzMDIsIDB4MDAwOCwgMHg4MDAyLCAweDAwMDUsIDB4MmQwMCwgMHg3MDI2LAorCTB4YTA4MCwgMHgwMDBkLCAweDcwNTYsIDB4NzA1MywgMHgwMDAwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjAwOSwgMHhiODEyLCAweDIxMDQsIDB4YzA4ZCwgMHgyMDBhLCAweDAxMmUsIDB4MDgwYywgMHgxNjVmLAorCTB4MDAwNSwgMHg3MDhjLCAweGEwOGEsIDB4MDAyOSwgMHgxMjIwLCAweGEwODIsIDB4MDAxZCwgMHgwMDMzLAorCTB4MDAxMCwgMHgwODBjLCAweDE1MTUsIDB4NjAyNywgMHgxZTAwLCAweDAwMDUsIDB4NThkYywgMHg1ODU3LAorCTB4NTg2ZiwgMHg1OGFjLCAweDU4Y2QsIDB4NTkwNywgMHg1OTE5LCAweDU4NmYsIDB4NThmMywgMHg1N2ZiLAorCTB4NTgyOSwgMHg1N2ZhLCAweDAwMDUsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsIDB4NjgwNCwgMHhhMDA1LAorCTB4MTE4MCwgMHg2ODA4LCAweGEwMDUsIDB4MTUxOCwgMHg3MDhmLCAweDAwMjgsIDB4MjA2OSwgMHhiN2M1LAorCTB4MmQwNCwgMHg3MDAyLCAweDA4MGMsIDB4NWJkMSwgMHg2MDI4LCAweGEwODUsIDB4MDYwMCwgMHg2MDJhLAorCTB4MDBiMCwgMHg3MDhmLCAweDAwMjgsIDB4MjA2OSwgMHhiN2M1LCAweDJkMDQsIDB4NzAwMiwgMHg2MDI4LAorCTB4YTA4NSwgMHgwNjAwLCAweDYwMmEsIDB4MDBlNiwgMHgwMDM2LCAweDAwNDYsIDB4MDA1NiwgMHgyMDcxLAorCTB4YjgyMywgMHgwODBjLCAweDFkZmUsIDB4MDA1ZSwgMHgwMDRlLCAweDAwM2UsIDB4MDBlZSwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMGQ2LCAweDIwNjksIDB4MDIwMCwgMHg2ODA0LCAweGEwMDUsIDB4MTE4MCwgMHg2ODA4LAorCTB4YTAwNSwgMHgxNTE4LCAweDcwOGYsIDB4MDAyOCwgMHgyMDY5LCAweGI3YzUsIDB4MmQwNCwgMHg3MDAyLAorCTB4MDgwYywgMHg1YzVlLCAweDYwMjgsIDB4YTA4NSwgMHgwNjAwLCAweDYwMmEsIDB4MDBiMCwgMHg3MDhmLAorCTB4MDAyOCwgMHgyMDY5LCAweGI3YzUsIDB4MmQwNCwgMHg3MDAyLCAweDYwMjgsIDB4YTA4NSwgMHgwNjAwLAorCTB4NjAyYSwgMHgwMGU2LCAweDAwMzYsIDB4MDA0NiwgMHgwMDU2LCAweDIwNzEsIDB4YjgyMywgMHgwODBjLAorCTB4MWRmZSwgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwgMHgwMGVlLCAweDAwZGUsIDB4MDAwNSwgMHg2ODAzLAorCTB4MDA5MCwgMHg2MTI0LCAweGQxZTQsIDB4MTE5MCwgMHgwODBjLCAweDU5ODQsIDB4ZDFkNCwgMHgxMTYwLAorCTB4ZDFkYywgMHgxMTM4LCAweGQxY2MsIDB4MDE1MCwgMHg3MDhmLCAweDAwMjAsIDB4MDgwYywgMHg1OTg0LAorCTB4MDAyOCwgMHg3MDhmLCAweDAwMWQsIDB4MDAxMCwgMHg3MDhmLCAweDAwMWYsIDB4MDAwNSwgMHg2ODAzLAorCTB4MDA4OCwgMHg2MTI0LCAweGQxY2MsIDB4MTU5MCwgMHhkMWRjLCAweDE1NjgsIDB4ZDFlNCwgMHgxNTQwLAorCTB4YTE4NCwgMHgxZTAwLCAweDE1ODAsIDB4NjBlMywgMHgwMDAxLCAweDYwMGMsIDB4YzBiNCwgMHg2MDBlLAorCTB4MDgwYywgMHg1YWZmLCAweDA4MGMsIDB4MjRiMCwgMHgwMTU2LCAweDY4MDMsIDB4MDEwMCwgMHgyMGE5LAorCTB4MDAxNCwgMHg2ODA0LCAweGQwZGMsIDB4MTExOCwgMHgxZjA0LCAweDU4ODksIDB4MDA0OCwgMHgyMGE5LAorCTB4MDAxNCwgMHg2ODAzLCAweDAwODAsIDB4NjgwNCwgMHhkMGQ0LCAweDExMzAsIDB4MWYwNCwgMHg1ODkzLAorCTB4MDgwYywgMHg1YjIwLCAweDAxNWUsIDB4MDA3OCwgMHgwMTVlLCAweDcwOGYsIDB4MDAyOCwgMHgwMDU4LAorCTB4NzA4ZiwgMHgwMDFlLCAweDAwNDAsIDB4NzA4ZiwgMHgwMDFkLCAweDAwMjgsIDB4NzA4ZiwgMHgwMDIwLAorCTB4MDAxMCwgMHg3MDhmLCAweDAwMWYsIDB4MDAwNSwgMHg2MGUzLCAweDAwMDEsIDB4NjAwYywgMHhjMGI0LAorCTB4NjAwZSwgMHgwODBjLCAweDVhZmYsIDB4MDgwYywgMHgyNGIwLCAweDY4MDMsIDB4MDA4MCwgMHg2MTI0LAorCTB4ZDFkNCwgMHgxMTgwLCAweGQxZGMsIDB4MTE1OCwgMHhkMWU0LCAweDExMzAsIDB4YTE4NCwgMHgxZTAwLAorCTB4MTE1OCwgMHg3MDhmLCAweDAwMjgsIDB4MDA0MCwgMHg3MDhmLCAweDAwMWUsIDB4MDAyOCwgMHg3MDhmLAorCTB4MDAxZCwgMHgwMDEwLCAweDcwOGYsIDB4MDAxZiwgMHgwMDA1LCAweDY4MDMsIDB4MDBhMCwgMHg2MTI0LAorCTB4ZDFkYywgMHgxMTM4LCAweGQxZTQsIDB4MDEzOCwgMHgwODBjLCAweDFlNDcsIDB4NzA4ZiwgMHgwMDFlLAorCTB4MDAxMCwgMHg3MDhmLCAweDAwMWQsIDB4MDAwNSwgMHgwODBjLCAweDU5ZjYsIDB4NjEyNCwgMHhkMWRjLAorCTB4MTE4OCwgMHgwODBjLCAweDU5ODQsIDB4MDAxNiwgMHgwODBjLCAweDFlNDcsIDB4MDAxZSwgMHhkMWQ0LAorCTB4MTEyOCwgMHhkMWU0LCAweDAxMzgsIDB4NzA4ZiwgMHgwMDFlLCAweDAwMjAsIDB4NzA4ZiwgMHgwMDFmLAorCTB4MDgwYywgMHg1OTg0LCAweDAwMDUsIDB4NjgwMywgMHgwMGEwLCAweDYxMjQsIDB4ZDFkNCwgMHgxMTYwLAorCTB4ZDFjYywgMHgxMTUwLCAweGQxZGMsIDB4MTEyOCwgMHhkMWU0LCAweDAxNDAsIDB4NzA4ZiwgMHgwMDFlLAorCTB4MDAyOCwgMHg3MDhmLCAweDAwMWQsIDB4MDAxMCwgMHg3MDhmLCAweDAwMjEsIDB4MDAwNSwgMHgwODBjLAorCTB4NTlmNiwgMHg2MTI0LCAweGQxZDQsIDB4MTE1MCwgMHhkMWRjLCAweDExMjgsIDB4ZDFlNCwgMHgwMTQwLAorCTB4NzA4ZiwgMHgwMDFlLCAweDAwMjgsIDB4NzA4ZiwgMHgwMDFkLCAweDAwMTAsIDB4NzA4ZiwgMHgwMDFmLAorCTB4MDAwNSwgMHg2ODAzLCAweDAwOTAsIDB4NjEyNCwgMHhkMWQ0LCAweDExNzgsIDB4ZDFjYywgMHgxMTUwLAorCTB4ZDFkYywgMHgxMTI4LCAweGQxZTQsIDB4MDE1OCwgMHg3MDhmLCAweDAwMWUsIDB4MDA0MCwgMHg3MDhmLAorCTB4MDAxZCwgMHgwMDI4LCAweDcwOGYsIDB4MDAyMCwgMHgwMDEwLCAweDcwOGYsIDB4MDAxZiwgMHgwMDA1LAorCTB4MDAxNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwMTI2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LAorCTB4MDE0MCwgMHgyMDcxLCAweGI1MDAsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NWFjZiwgMHgxMWU4LAorCTB4MjAwMSwgMHhiNTBjLCAweDIwMGMsIDB4ZDFiNCwgMHgwMWMwLCAweGMxYjQsIDB4MjEwMiwgMHg2MDI3LAorCTB4MDIwMCwgMHhlMDAwLCAweGUwMDAsIDB4NjAyNCwgMHhkMGNjLCAweDAxNTgsIDB4NjgwMywgMHgwMGEwLAorCTB4MjAwMSwgMHhiNzlmLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLCAweGI1MDAsIDB4MjAwMywgMHgwMDAxLAorCTB4MDQyOCwgMHg2MDI4LCAweGMwY2QsIDB4NjAyYSwgMHgwNDA4LCAweDA4MGMsIDB4NWFlYiwgMHgwMTUwLAorCTB4MDgwYywgMHg1YWUxLCAweDExMzgsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjdjMywgMHgwODBjLAorCTB4NWFhNiwgMHgwMGEwLCAweDA4MGMsIDB4NTlmMywgMHgwMTc4LCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLAorCTB4MjdjMywgMHg3MDhjLCAweGEwODYsIDB4MDAxZSwgMHgwMTIwLCAweDcwOGMsIDB4YTA4NiwgMHgwMDIyLAorCTB4MTExOCwgMHg3MDhmLCAweDAwMjUsIDB4MDAxMCwgMHg3MDhmLCAweDAwMjEsIDB4MDEyZSwgMHgwMGVlLAorCTB4MDBkZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwNSwgMHgwMDI2LCAweDIwMTEsIDB4NTk5NSwgMHgwODBjLAorCTB4NmE1YywgMHgwMDJlLCAweDAwMTYsIDB4MDAyNiwgMHgyMDA5LCAweDAwNjQsIDB4MjAxMSwgMHg1OTk1LAorCTB4MDgwYywgMHg2YTUzLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBmNiwgMHgwMDE2LAorCTB4MDgwYywgMHg3ZDdhLCAweDIwNzEsIDB4YjUwMCwgMHgwODBjLCAweDU5MzAsIDB4MDAxZSwgMHgwMGZlLAorCTB4MDBlZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LAorCTB4MDBmNiwgMHgwMTI2LCAweDA4MGMsIDB4N2Q3YSwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLAorCTB4MjA3MSwgMHhiNTAwLCAweDIwOTEsIDB4ODAwMCwgMHg2MDI4LCAweGMwOWMsIDB4NjAyYSwgMHgyMDExLAorCTB4MDAwMywgMHgwODBjLCAweDgwNzUsIDB4MjAxMSwgMHgwMDAyLCAweDA4MGMsIDB4ODA3ZiwgMHgwODBjLAorCTB4N2Y1OSwgMHgwODBjLCAweDZhMTAsIDB4MDAzNiwgMHgyMDE5LCAweDAwMDAsIDB4MDgwYywgMHg3ZmU0LAorCTB4MDAzZSwgMHg2MGUzLCAweDAwMDAsIDB4MDgwYywgMHhiNDJmLCAweDA4MGMsIDB4YjQ0YSwgMHgyMDAxLAorCTB4YjUwMCwgMHgyMDAzLCAweDAwMDQsIDB4NjAyNywgMHgwMDA4LCAweDA4MGMsIDB4MTJkZCwgMHgyMDAxLAorCTB4MDAwMSwgMHgwODBjLCAweDI3YzMsIDB4MDEyZSwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgyMDAxLCAweGI1MDAsIDB4MjAwNCwgMHhhMDg2LAorCTB4MDAwNCwgMHgwMTQwLCAweDIwMDEsIDB4Yjc5ZSwgMHgyMDAzLCAweGFhYWEsIDB4MjAwMSwgMHhiNzlmLAorCTB4MjAwMywgMHgwMDAwLCAweDAwMDUsIDB4NjAyMCwgMHhkMDljLCAweDAwMDUsIDB4NjgwMCwgMHhhMDg2LAorCTB4MDBjMCwgMHgwMTYwLCAweDY4MDMsIDB4MDBjMCwgMHgwMTU2LCAweDIwYTksIDB4MDAyZCwgMHgxZDA0LAorCTB4NTlmZiwgMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwgMHg1OWZmLCAweDAxNWUsIDB4MDAwNSwgMHgwMGM2LAorCTB4MDBkNiwgMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4MjA3MSwgMHhiNTAwLAorCTB4MjAwMSwgMHhiNzlmLCAweDIwMGMsIDB4YTE4NiwgMHgwMDAwLCAweDAxNTgsIDB4YTE4NiwgMHgwMDAxLAorCTB4MDE1OCwgMHhhMTg2LCAweDAwMDIsIDB4MDE1OCwgMHhhMTg2LCAweDAwMDMsIDB4MDE1OCwgMHgwODA0LAorCTB4NWE5NCwgMHg3MDhmLCAweDAwMjIsIDB4MDA0MCwgMHg3MDhmLCAweDAwMjEsIDB4MDAyOCwgMHg3MDhmLAorCTB4MDAyMywgMHgwMDIwLCAweDcwOGYsIDB4MDAyNCwgMHg2MDQzLCAweDAwMDAsIDB4NjBlMywgMHgwMDAwLAorCTB4Njg4NywgMHgwMDAxLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI4NzIsIDB4MDAyNiwgMHgyMDExLAorCTB4MDAwMywgMHgwODBjLCAweDgwNzUsIDB4MjAxMSwgMHgwMDAyLCAweDA4MGMsIDB4ODA3ZiwgMHgwODBjLAorCTB4N2Y1OSwgMHgwMDM2LCAweDIwMTksIDB4MDAwMCwgMHgwODBjLCAweDdmZTQsIDB4MDAzZSwgMHgwMDJlLAorCTB4NzAwMCwgMHhhMDhlLCAweDAwMDQsIDB4MDExOCwgMHg2MDJiLCAweDAwMjgsIDB4MDAxMCwgMHg2MDJiLAorCTB4MDAyMCwgMHgwMTU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwYTksIDB4MDAwNSwgMHg2MDI0LAorCTB4ZDBhYywgMHgwMTIwLCAweDAxMmUsIDB4MDE1ZSwgMHgwODA0LCAweDVhYTIsIDB4NjgwMCwgMHhhMDg0LAorCTB4MDBhMCwgMHhjMGJkLCAweDY4MDIsIDB4NjkwNCwgMHhkMWQ0LCAweDExMzAsIDB4NjgwMywgMHgwMTAwLAorCTB4MWYwNCwgMHg1YTU3LCAweDA4MGMsIDB4NWIyMCwgMHgwMTJlLCAweDAxNWUsIDB4MDgwYywgMHg1YWUxLAorCTB4MDFhOCwgMHg2MDQ0LCAweGEwMDUsIDB4MDE2OCwgMHg2MDUwLCAweDAwMDYsIDB4YTA4NSwgMHgwMDIwLAorCTB4NjA1MiwgMHgwODBjLCAweDViMjAsIDB4YTAwNiwgMHg4MDAxLCAweDFkZjAsIDB4MDAwZSwgMHg2MDUyLAorCTB4MDAyOCwgMHg2ODA0LCAweGQwZDQsIDB4MTExMCwgMHgwODBjLCAweDViMjAsIDB4MDAxNiwgMHgwMDI2LAorCTB4MjAwOSwgMHgwMGM4LCAweDIwMTEsIDB4NTlhMiwgMHgwODBjLCAweDZhMjIsIDB4MDAyZSwgMHgwMDFlLAorCTB4MjAwMSwgMHhiNzlmLCAweDIwMDMsIDB4MDAwNCwgMHgwODBjLCAweDU3ZTEsIDB4MDgwYywgMHg1YWUxLAorCTB4MDE0OCwgMHg2ODA0LCAweGQwZDQsIDB4MTEzMCwgMHhkMGRjLCAweDExMDAsIDB4MjAwMSwgMHhiNzlmLAorCTB4MjAwMywgMHgwMDAwLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LAorCTB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLCAweDIwNzEsIDB4YjUwMCwgMHgyMDAxLAorCTB4Yjc5ZSwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHhiNzhmLCAweDIwMDMsIDB4MDAwMCwgMHg3MDhmLAorCTB4MDAwMCwgMHg2MGUzLCAweDAwMDAsIDB4Njg4NywgMHgwMDAwLCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLAorCTB4Mjg3MiwgMHg2ODAzLCAweDAwMDAsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHg2MDI3LAorCTB4ZmZmZiwgMHg2MDJiLCAweDE4MmYsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMDA2LAorCTB4MjAwMSwgMHhiNzllLCAweDIwMDQsIDB4YTA4NiwgMHhhYWFhLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LAorCTB4MjAwMSwgMHhiNTcyLCAweDIwMDQsIDB4YTA4NCwgMHgwMDMwLCAweGEwODYsIDB4MDAwMCwgMHgwMDBlLAorCTB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4YjU3MiwgMHgyMDA0LCAweGEwODQsIDB4MDAzMCwgMHhhMDg2LAorCTB4MDAzMCwgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweGI1NzIsIDB4MjAwNCwgMHhhMDg0LAorCTB4MDAzMCwgMHhhMDg2LCAweDAwMTAsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHhiNTcyLAorCTB4MjAwNCwgMHhhMDg0LCAweDAwMzAsIDB4YTA4NiwgMHgwMDIwLCAweDAwMGUsIDB4MDAwNSwgMHgyMDAxLAorCTB4YjUwYywgMHgyMDA0LCAweGQwYTQsIDB4MDE3MCwgMHgwODBjLCAweDI4OTIsIDB4MDAzNiwgMHgwMDE2LAorCTB4MjAwOSwgMHgwMDAwLCAweDIwMTksIDB4MDAyOCwgMHgwODBjLCAweDJjNmYsIDB4MDAxZSwgMHgwMDNlLAorCTB4YTAwNiwgMHgwMDA5LCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweGI1MGMsIDB4MmUwNCwgMHgwMTE4LAorCTB4YTA4NSwgMHgwMDEwLCAweDAwMTAsIDB4YTA4NCwgMHhmZmVmLCAweDIwNzIsIDB4MDBlZSwgMHgwMDA1LAorCTB4NjA1MCwgMHgwMDA2LCAweDYwZjAsIDB4MDAwNiwgMHg2MGVjLCAweDAwMDYsIDB4NjAwYywgMHgwMDA2LAorCTB4NjAwNCwgMHgwMDA2LCAweDYwMjgsIDB4MDAwNiwgMHg2MDJmLCAweDAxMDAsIDB4NjAyZiwgMHgwMDAwLAorCTB4NjAyZiwgMHgwMDQwLCAweDYwMmYsIDB4MDAwMCwgMHgwMDBlLCAweDYwMmEsIDB4MDAwZSwgMHg2MDA2LAorCTB4MDAwZSwgMHg2MDBlLCAweDAwMGUsIDB4NjBlZSwgMHgwMDBlLCAweDYwZjIsIDB4NjBlMywgMHgwMDAwLAorCTB4Njg4NywgMHgwMDAxLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI4NzIsIDB4NjgwMCwgMHhhMDg0LAorCTB4MDBhMCwgMHhjMGJkLCAweDY4MDIsIDB4NjgwMywgMHgwMGEwLCAweDAwMGUsIDB4NjA1MiwgMHg2MDUwLAorCTB4MDAwNSwgMHgwMTU2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LAorCTB4MjA2MSwgMHgwMTAwLCAweDIwNjksIDB4MDE0MCwgMHgyMDcxLCAweGI1MDAsIDB4NjAyMCwgMHhhMDg0LAorCTB4MDA4MCwgMHgwMTM4LCAweDIwMDEsIDB4YjUwYywgMHgyMDBjLCAweGMxYmQsIDB4MjEwMiwgMHgwODA0LAorCTB4NWJjOSwgMHgyMDAxLCAweGI1MGMsIDB4MjAwYywgMHhjMWJjLCAweDIxMDIsIDB4NjAyOCwgMHhhMDg0LAorCTB4ZTFmZiwgMHg2MDJhLCAweDYwMjcsIDB4MDIwMCwgMHg2ODAzLCAweDAwOTAsIDB4MjBhOSwgMHgwMzg0LAorCTB4NjAyNCwgMHhkMGNjLCAweDE1MDgsIDB4MWQwNCwgMHg1Yjc4LCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LAorCTB4NWI3OCwgMHgyMDExLCAweDAwMDMsIDB4MDgwYywgMHg4MDc1LCAweDIwMTEsIDB4MDAwMiwgMHgwODBjLAorCTB4ODA3ZiwgMHgwODBjLCAweDdmNTksIDB4MjAxOSwgMHgwMDAwLCAweDA4MGMsIDB4N2ZlNCwgMHg2ODAzLAorCTB4MDBhMCwgMHgyMDAxLCAweGI3OWYsIDB4MjAwMywgMHgwMDAxLCAweDIwMDEsIDB4YjUwMCwgMHgyMDAzLAorCTB4MDAwMSwgMHhhMDg1LCAweDAwMDEsIDB4MDQ2OCwgMHg4NmZmLCAweDExMjAsIDB4MDgwYywgMHgxZTQ3LAorCTB4MDgwYywgMHgyNGIwLCAweDYwZTMsIDB4MDAwMCwgMHgyMDAxLCAweGI3OGYsIDB4MjAwNCwgMHgwODBjLAorCTB4Mjg3MiwgMHg2MGUyLCAweDY4MDMsIDB4MDA4MCwgMHgyMGE5LCAweDAzODQsIDB4NjAyNywgMHgxZTAwLAorCTB4MjAwOSwgMHgxZTAwLCAweGUwMDAsIDB4NjAyNCwgMHhhMTBjLCAweDAxMzgsIDB4MWQwNCwgMHg1YmFlLAorCTB4MjA5MSwgMHg2MDAwLCAweDFmMDQsIDB4NWJhZSwgMHgwODIwLCAweDYwMjgsIDB4YTA4NSwgMHgxZTAwLAorCTB4NjAyYSwgMHg3MGE0LCAweGEwMDUsIDB4MTExOCwgMHg2ODg3LCAweDAwMDEsIDB4MDAwOCwgMHg2ODg2LAorCTB4YTAwNiwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMTVlLAorCTB4MDAwNSwgMHgwMTU2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LAorCTB4MjA2MSwgMHgwMTAwLCAweDIwNzEsIDB4YjUwMCwgMHgyMDY5LCAweDAxNDAsIDB4NjAyMCwgMHhhMDg0LAorCTB4MDBjMCwgMHgwMTIwLCAweDY4ODQsIDB4YTAwNSwgMHgxOTA0LCAweDVjMjUsIDB4NjgwMywgMHgwMDg4LAorCTB4NjBlMywgMHgwMDAwLCAweDY4ODcsIDB4MDAwMCwgMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHgyODcyLAorCTB4MjA2OSwgMHgwMjAwLCAweDY4MDQsIDB4YTAwNSwgMHgxMTE4LCAweDY4MDgsIDB4YTAwNSwgMHgwMWMwLAorCTB4NjAyOCwgMHhhMDg0LCAweGZiZmYsIDB4NjAyYSwgMHg2MDI3LCAweDA0MDAsIDB4MjA2OSwgMHhiN2M1LAorCTB4NzAwMCwgMHgyMDZhLCAweDcwOGYsIDB4MDAyNiwgMHg3MDAzLCAweDAwMDEsIDB4MjBhOSwgMHgwMDAyLAorCTB4MWQwNCwgMHg1YzA4LCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDVjMDgsIDB4MDgwNCwgMHg1YzU2LAorCTB4MjA2OSwgMHgwMTQwLCAweDIwYTksIDB4MDM4NCwgMHg2MDI3LCAweDFlMDAsIDB4MjAwOSwgMHgxZTAwLAorCTB4ZTAwMCwgMHg2MDI0LCAweGExMGMsIDB4MDUyMCwgMHhhMDg0LCAweDFhMDAsIDB4MTUwOCwgMHgxZDA0LAorCTB4NWMxNCwgMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwgMHg1YzE0LCAweDIwMTEsIDB4MDAwMywgMHgwODBjLAorCTB4ODA3NSwgMHgyMDExLCAweDAwMDIsIDB4MDgwYywgMHg4MDdmLCAweDA4MGMsIDB4N2Y1OSwgMHgyMDE5LAorCTB4MDAwMCwgMHgwODBjLCAweDdmZTQsIDB4NjgwMywgMHgwMGEwLCAweDIwMDEsIDB4Yjc5ZiwgMHgyMDAzLAorCTB4MDAwMSwgMHgyMDAxLCAweGI1MDAsIDB4MjAwMywgMHgwMDAxLCAweGEwODUsIDB4MDAwMSwgMHgwMGIwLAorCTB4MDgwYywgMHgyNGIwLCAweDY4MDMsIDB4MDA4MCwgMHgyMDY5LCAweDAxNDAsIDB4NjBlMywgMHgwMDAwLAorCTB4NzBhNCwgMHhhMDA1LCAweDExMTgsIDB4Njg4NywgMHgwMDAxLCAweDAwMDgsIDB4Njg4NiwgMHgyMDAxLAorCTB4Yjc4ZiwgMHgyMDA0LCAweDA4MGMsIDB4Mjg3MiwgMHg2MGUyLCAweGEwMDYsIDB4MDBlZSwgMHgwMGRlLAorCTB4MDBjZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMTVlLCAweDAwMDUsIDB4MDE1NiwgMHgwMDE2LAorCTB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLAorCTB4YjUwMCwgMHg2MDIwLCAweGEwODQsIDB4MDBjMCwgMHgwMWUwLCAweDIwMTEsIDB4MDAwMywgMHgwODBjLAorCTB4ODA3NSwgMHgyMDExLCAweDAwMDIsIDB4MDgwYywgMHg4MDdmLCAweDA4MGMsIDB4N2Y1OSwgMHgyMDE5LAorCTB4MDAwMCwgMHgwODBjLCAweDdmZTQsIDB4MjA2OSwgMHgwMTQwLCAweDY4MDMsIDB4MDBhMCwgMHgyMDAxLAorCTB4Yjc5ZiwgMHgyMDAzLCAweDAwMDEsIDB4MjAwMSwgMHhiNTAwLCAweDIwMDMsIDB4MDAwMSwgMHgwODA0LAorCTB4NWNmYiwgMHgyMDAxLCAweGI1MGMsIDB4MjAwYywgMHhkMWI0LCAweDExNjAsIDB4YzFiNSwgMHgyMTAyLAorCTB4MDgwYywgMHg1OThhLCAweDIwNjksIDB4MDE0MCwgMHgwODBjLCAweDI0YjAsIDB4NjgwMywgMHgwMDgwLAorCTB4NjBlMywgMHgwMDAwLCAweDIwNjksIDB4MDIwMCwgMHg2ODA0LCAweGEwMDUsIDB4MTExOCwgMHg2ODA4LAorCTB4YTAwNSwgMHgwMWMwLCAweDYwMjgsIDB4YTA4NCwgMHhmZGZmLCAweDYwMmEsIDB4NjAyNywgMHgwMjAwLAorCTB4MjA2OSwgMHhiN2M1LCAweDcwMDAsIDB4MjA2YSwgMHg3MDhmLCAweDAwMjcsIDB4NzAwMywgMHgwMDAxLAorCTB4MjBhOSwgMHgwMDAyLCAweDFkMDQsIDB4NWNiMiwgMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwgMHg1Y2IyLAorCTB4MDgwNCwgMHg1Y2ZiLCAweDYwMjcsIDB4MWUwMCwgMHgyMDA5LCAweDFlMDAsIDB4ZTAwMCwgMHg2MDI0LAorCTB4YTEwYywgMHgwMWM4LCAweGEwODQsIDB4MWMwMCwgMHgxMWIwLCAweDFkMDQsIDB4NWNiYSwgMHgwMDA2LAorCTB4MDAxNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwODBjLCAweDY4ZjksIDB4MDBlZSwgMHgwMGRlLAorCTB4MDBjZSwgMHgwMDFlLCAweDAwMGUsIDB4MDBlNiwgMHgyMDcxLCAweGI3ZjMsIDB4NzAxOCwgMHgwMGVlLAorCTB4YTAwNSwgMHgxZDAwLCAweDA1MDAsIDB4MDAyNiwgMHgyMDExLCAweDU5YTIsIDB4MDgwYywgMHg2OTljLAorCTB4MjAxMSwgMHg1OTk1LCAweDA4MGMsIDB4NmE1YywgMHgwMDJlLCAweDIwNjksIDB4MDE0MCwgMHg2MGUzLAorCTB4MDAwMCwgMHg3MGE0LCAweGEwMDUsIDB4MTExOCwgMHg2ODg3LCAweDAwMDEsIDB4MDAwOCwgMHg2ODg2LAorCTB4MjAwMSwgMHhiNzhmLCAweDIwMDQsIDB4MDgwYywgMHgyODcyLCAweDYwZTIsIDB4MjAwMSwgMHhiNTBjLAorCTB4MjAwYywgMHhjMWI0LCAweDIxMDIsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAzZSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwMTVlLCAweDAwMDUsIDB4MDE1NiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LAorCTB4MDBjNiwgMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweGI1MDAsIDB4NzEzMCwgMHhkMTg0LAorCTB4MTE4MCwgMHgyMDExLCAweGI1NTMsIDB4MjIxNCwgMHhkMmVjLCAweDAxMzgsIDB4YzE4ZCwgMHg3MTMyLAorCTB4MjAxMSwgMHhiNTUzLCAweDIyMTQsIDB4ZDJhYywgMHgxMTIwLCAweDcwMzAsIDB4ZDA4YywgMHgwOTA0LAorCTB4NWQ2OCwgMHg3MTMwLCAweGMxODUsIDB4NzEzMiwgMHgyMDExLCAweGI1NTMsIDB4MjIwYywgMHhkMWE0LAorCTB4MDUzMCwgMHgwMDE2LCAweDIwMTksIDB4MDAwZSwgMHgwODBjLCAweGIwNjUsIDB4MDE1NiwgMHgyMGE5LAorCTB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsIDB4YTE4NiwgMHgwMDdlLCAweDAxYTAsIDB4YTE4NiwgMHgwMDgwLAorCTB4MDE4OCwgMHgwODBjLCAweDRmYTksIDB4MTE3MCwgMHg4MTI3LCAweGEwMDYsIDB4MDAxNiwgMHgyMDA5LAorCTB4MDAwZSwgMHgwODBjLCAweGIwZTgsIDB4MjAwOSwgMHgwMDAxLCAweDIwMTEsIDB4MDEwMCwgMHgwODBjLAorCTB4NmIxYSwgMHgwMDFlLCAweDgxMDgsIDB4MWYwNCwgMHg1ZDMzLCAweDAxNWUsIDB4MDAxZSwgMHhkMWFjLAorCTB4MTE0OCwgMHgwMDE2LCAweDIwMDksIDB4MDAwMCwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywgMHgyYzZmLAorCTB4MDAxZSwgMHgwMDcwLCAweDAxNTYsIDB4MjBhOSwgMHgwMDdmLCAweDIwMDksIDB4MDAwMCwgMHgwODBjLAorCTB4NGZhOSwgMHgxMTEwLCAweDA4MGMsIDB4NGMwYiwgMHg4MTA4LCAweDFmMDQsIDB4NWQ1ZiwgMHgwMTVlLAorCTB4MDgwYywgMHgxZTQ3LCAweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweDgwNzUsIDB4MjAxMSwgMHgwMDAyLAorCTB4MDgwYywgMHg4MDdmLCAweDA4MGMsIDB4N2Y1OSwgMHgwMDM2LCAweDIwMTksIDB4MDAwMCwgMHgwODBjLAorCTB4N2ZlNCwgMHgwMDNlLCAweDYwZTMsIDB4MDAwMCwgMHgyMDAxLCAweGI1MDAsIDB4MjAwMywgMHgwMDAxLAorCTB4MDgwYywgMHg1YTA3LCAweDAwZWUsIDB4MDBjZSwgMHgwMDRlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDE1ZSwgMHgwMDA1LCAweDIwNzEsIDB4YjVlMiwgMHg3MDAzLCAweDAwMDAsIDB4NzAwNywgMHgwMDAwLAorCTB4NzAwZiwgMHgwMDAwLCAweDcwMmIsIDB4MDAwMSwgMHg3MDRmLCAweDAwMDAsIDB4NzA1MywgMHgwMDAxLAorCTB4NzA1ZiwgMHgwMDIwLCAweDcwNjMsIDB4MDA0MCwgMHg3MDgzLCAweDAwMDAsIDB4NzA4YiwgMHgwMDAwLAorCTB4NzA4ZiwgMHgwMDAxLCAweDcwYmYsIDB4MDAwMCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhiNWUyLAorCTB4Njg0OCwgMHhhMDA1LCAweDExMzAsIDB4NzAyOCwgMHhjMDg1LCAweDcwMmEsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDQyOCwgMHg2YTUwLCAweDcyMzYsIDB4NmI1NCwgMHg3MzNhLCAweDY4NTgsIDB4NzAzZSwgMHg3MDdhLAorCTB4Njg1YywgMHg3MDQyLCAweDcwN2UsIDB4Njg0OCwgMHg3MDJlLCAweDY4NDAsIDB4NzAzMiwgMHgyMDA5LAorCTB4MDAwYywgMHgyMDBhLCAweDgwMDcsIDB4ODAwNiwgMHg4MDA2LCAweGEwOGMsIDB4MDAzZiwgMHhhMDg0LAorCTB4ZmZjMCwgMHhhMjEwLCAweDIxMDAsIDB4YTMxOSwgMHg3MjcyLCAweDczNzYsIDB4NzAyOCwgMHhjMDg0LAorCTB4NzAyYSwgMHg3MDA3LCAweDAwMDEsIDB4NzAwZiwgMHgwMDAwLCAweGEwMDYsIDB4MDBlZSwgMHgwMDA1LAorCTB4MmI3OCwgMHgyMDcxLCAweGI1ZTIsIDB4NzAwNCwgMHgwMDQzLCAweDcwMGMsIDB4MDAwMiwgMHg1ZGU0LAorCTB4NWRkYiwgMHg1ZGRiLCAweDVkZGIsIDB4NWRkYiwgMHgwMDA1LCAweDVlM2EsIDB4NWUzYiwgMHg1ZTZkLAorCTB4NWU2ZSwgMHg1ZTM4LCAweDVlYmMsIDB4NWVjMSwgMHg1ZWYyLCAweDVlZjMsIDB4NWYwZSwgMHg1ZjBmLAorCTB4NWYxMCwgMHg1ZjExLCAweDVmMTIsIDB4NWYxMywgMHg1ZmM5LCAweDVmZjAsIDB4NzAwYywgMHgwMDAyLAorCTB4NWRmZCwgMHg1ZTM4LCAweDVlMzgsIDB4NWUzOSwgMHg1ZTM5LCAweDc4MzAsIDB4NzkzMCwgMHhhMTA2LAorCTB4MDEyMCwgMHg3ODMwLCAweDc5MzAsIDB4YTEwNiwgMHgxNTEwLCAweDcwMzAsIDB4YTEwYSwgMHgwMWY4LAorCTB4MTIxMCwgMHg3MTJjLCAweGExMGEsIDB4YTE4YSwgMHgwMDAyLCAweDEyZDAsIDB4MDgwYywgMHgxNWRmLAorCTB4MDFiMCwgMHgyZDAwLCAweDcwNWEsIDB4NzA2MywgMHgwMDQwLCAweDIwMDEsIDB4MDAwMywgMHg3MDU3LAorCTB4MDAwMCwgMHgwMTI2LCAweDAwMDYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDksIDB4YjgxMiwgMHgyMTA0LAorCTB4YzA4NSwgMHgyMDBhLCAweDAwMGUsIDB4NzAwZSwgMHgwMTJlLCAweDA4MGMsIDB4MTY1ZiwgMHgwMDA1LAorCTB4MDgwYywgMHgxNWRmLCAweDBkZTAsIDB4MmQwMCwgMHg3MDVhLCAweDA4MGMsIDB4MTVkZiwgMHgxMTA4LAorCTB4MGMxMCwgMHgyZDAwLCAweDcwODYsIDB4NzA2MywgMHgwMDgwLCAweDIwMDEsIDB4MDAwNCwgMHgwOGY4LAorCTB4MDAwNSwgMHgwMDA1LCAweDAwMDUsIDB4NzAwYywgMHgwMDAyLCAweDVlNDIsIDB4NWU0NSwgMHg1ZTUzLAorCTB4NWU2YywgMHg1ZTZjLCAweDA4MGMsIDB4NWRmNiwgMHgwMDA1LCAweDAxMjYsIDB4ODAwMSwgMHg3MDBlLAorCTB4NzA1OCwgMHgwMDA2LCAweDA4MGMsIDB4NjM0MywgMHgwMTIwLCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLAorCTB4NWRmNiwgMHgwMGRlLCAweDAwNDgsIDB4MDEyNiwgMHg4MDAxLCAweDcwMGUsIDB4MDgwYywgMHg2MzQzLAorCTB4NzA1OCwgMHgyMDY4LCAweDcwODQsIDB4NzA1YSwgMHg2ODAzLCAweDAwMDAsIDB4NjgwNywgMHgwMDAwLAorCTB4NjgzNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4YSwgMHgwMDNhLCAweDEyMTgsIDB4MDBkYiwgMHgwMTJlLAorCTB4MDAwNSwgMHgwMTJlLCAweDA4MGMsIDB4NWYxNCwgMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MjA3MSwgMHhiNWUyLCAweDcwMGMsIDB4MDAwMiwgMHg1ZTc5LCAweDVlNzksIDB4NWU3OSwgMHg1ZTdiLAorCTB4NWU3ZSwgMHgwMGVlLCAweDAwMDUsIDB4NzAwZiwgMHgwMDAxLCAweDAwMTAsIDB4NzAwZiwgMHgwMDAyLAorCTB4MDBlZSwgMHgwMDA1LCAweDVmMTQsIDB4NWYxNCwgMHg1ZjMwLCAweDVmMTQsIDB4NjBhZCwgMHg1ZjE0LAorCTB4NWYxNCwgMHg1ZjE0LCAweDVmMTQsIDB4NWYxNCwgMHg1ZjMwLCAweDYwZWYsIDB4NjEzMiwgMHg2MTdiLAorCTB4NjE4ZiwgMHg1ZjE0LCAweDVmMTQsIDB4NWY0YywgMHg1ZjMwLCAweDVmMTQsIDB4NWYxNCwgMHg1ZmE2LAorCTB4NjIzYiwgMHg2MjU2LCAweDVmMTQsIDB4NWY0YywgMHg1ZjE0LCAweDVmMTQsIDB4NWYxNCwgMHg1ZjE0LAorCTB4NWY5YywgMHg2MjU2LCAweDVmMTQsIDB4NWYxNCwgMHg1ZjE0LCAweDVmMTQsIDB4NWYxNCwgMHg1ZjE0LAorCTB4NWYxNCwgMHg1ZjE0LCAweDVmMTQsIDB4NWY2MCwgMHg1ZjE0LCAweDVmMTQsIDB4NWYxNCwgMHg1ZjE0LAorCTB4NWYxNCwgMHg1ZjE0LCAweDVmMTQsIDB4NWYxNCwgMHg1ZjE0LCAweDYzNjEsIDB4NWYxNCwgMHg1ZjE0LAorCTB4NWYxNCwgMHg1ZjE0LCAweDVmMTQsIDB4NWY3NSwgMHg3MDIwLCAweDIwNjgsIDB4MDgwYywgMHgxNjBmLAorCTB4MDAwNSwgMHg3MDBjLCAweDAwMDIsIDB4NWVjOCwgMHg1ZWNiLCAweDVlZDksIDB4NWVmMSwgMHg1ZWYxLAorCTB4MDgwYywgMHg1ZGY2LCAweDAwMDUsIDB4MDEyNiwgMHg4MDAxLCAweDcwMGUsIDB4NzA1OCwgMHgwMDA2LAorCTB4MDgwYywgMHg2MzQzLCAweDAxMjAsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NWRmNiwgMHgwMGRlLAorCTB4MDA0OCwgMHgwMTI2LCAweDgwMDEsIDB4NzAwZSwgMHgwODBjLCAweDYzNDMsIDB4NzA1OCwgMHgyMDY4LAorCTB4NzA4NCwgMHg3MDVhLCAweDY4MDMsIDB4MDAwMCwgMHg2ODA3LCAweDAwMDAsIDB4NjgzNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDhhLCAweDAwMWEsIDB4MTIxOCwgMHgwMDNiLCAweDAxMmUsIDB4MDAwNSwgMHgwMTJlLAorCTB4MDQxOSwgMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHg1ZjE0LCAweDVmMzAsIDB4NjA5OSwgMHg1ZjE0LAorCTB4NWYzMCwgMHg1ZjE0LCAweDVmMzAsIDB4NWYzMCwgMHg1ZjE0LCAweDVmMzAsIDB4NjA5OSwgMHg1ZjMwLAorCTB4NWYzMCwgMHg1ZjMwLCAweDVmMzAsIDB4NWYzMCwgMHg1ZjE0LCAweDVmMzAsIDB4NjA5OSwgMHg1ZjE0LAorCTB4NWYxNCwgMHg1ZjMwLCAweDVmMTQsIDB4NWYxNCwgMHg1ZjE0LCAweDVmMzAsIDB4MDAwNSwgMHgwMDA1LAorCTB4MDAwNSwgMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHg3MDA3LCAweDAwMDEsIDB4NjgzOCwgMHhhMDg0LAorCTB4MDBmZiwgMHhjMGQ1LCAweDY4M2EsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg1NDA4LAorCTB4MDEyZSwgMHgwMDA1LCAweDcwMDcsIDB4MDAwMSwgMHg2ODM4LCAweGEwODQsIDB4MDBmZiwgMHhjMGU1LAorCTB4NjgzYSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDU0MDgsIDB4MDEyZSwgMHgwMDA1LAorCTB4NzAwNywgMHgwMDAxLCAweDY4MzgsIDB4YTA4NCwgMHgwMGZmLCAweGMwZWQsIDB4NjgzYSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NTQwOCwgMHgwMTJlLCAweDAwMDUsIDB4NzAwNywgMHgwMDAxLAorCTB4NjgzOCwgMHhhMDg0LCAweDAwZmYsIDB4YzBkZCwgMHg2ODNhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg1NDA4LCAweDAxMmUsIDB4MDAwNSwgMHg2ODM0LCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLAorCTB4MDk4OCwgMHg4MDAxLCAweDExMjAsIDB4NzAwNywgMHgwMDAxLCAweDA4MDQsIDB4NjA1OSwgMHg3MDA3LAorCTB4MDAwNiwgMHg3MDEyLCAweDJkMDAsIDB4NzAxNiwgMHg3MDFhLCAweDcwNGIsIDB4NjA1OSwgMHgwMDA1LAorCTB4NjgzNCwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHgwOTA0LCAweDVmMjIsIDB4ODAwMSwgMHgxMTIwLAorCTB4NzAwNywgMHgwMDAxLCAweDA4MDQsIDB4NjA3NiwgMHg3MDA3LCAweDAwMDYsIDB4NzAxMiwgMHgyZDAwLAorCTB4NzAxNiwgMHg3MDFhLCAweDcwNGIsIDB4NjA3NiwgMHgwMDA1LCAweDY4MzQsIDB4ODAwNywgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg2LCAweDAwMDEsIDB4MTkwNCwgMHg1ZjIyLCAweDcwMDcsIDB4MDAwMSwgMHgyMDA5LAorCTB4YjUzMSwgMHgyMTBjLCAweDgxZmYsIDB4MTFhOCwgMHg2ODM4LCAweGEwODQsIDB4MDBmZiwgMHg2ODNhLAorCTB4Njg1MywgMHgwMDAwLCAweDA4MGMsIDB4NGQ4MiwgMHgxMTA4LCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg2ODM3LCAweDAxMzksIDB4Njg0YSwgMHg2OTUyLCAweDA4MGMsIDB4NTQwOCwgMHgwMTJlLAorCTB4MGNhMCwgMHgyMDAxLCAweDAwMjgsIDB4MGM5MCwgMHg2ODRjLCAweGEwODQsIDB4MDBjMCwgMHhhMDg2LAorCTB4MDBjMCwgMHgxMTIwLCAweDcwMDcsIDB4MDAwMSwgMHgwODA0LCAweDYyNmUsIDB4MmQwMCwgMHg3MDE2LAorCTB4NzAxYSwgMHgyMGE5LCAweDAwMDQsIDB4YTA4MCwgMHgwMDI0LCAweDIwOTgsIDB4MjBhMSwgMHhiNjBkLAorCTB4NTNhMywgMHg2ODU4LCAweDcwMTIsIDB4YTA4MiwgMHgwNDAxLCAweDFhMDQsIDB4NWYzZSwgMHg2YTg0LAorCTB4YTI4YSwgMHgwMDAyLCAweDFhMDQsIDB4NWYzZSwgMHg4MmZmLCAweDExMzgsIDB4Njg4OCwgMHg2OThjLAorCTB4YTEwNSwgMHgwMTE4LCAweDIwMDEsIDB4NjAyYywgMHgwMDE4LCAweGEyODAsIDB4NjAyMiwgMHgyMDA1LAorCTB4NzBjNiwgMHg3MDEwLCAweGEwMTUsIDB4MDkwNCwgMHg2MDBlLCAweDA4MGMsIDB4MTVkZiwgMHgxMTE4LAorCTB4NzAwNywgMHgwMDBmLCAweDAwMDUsIDB4MmQwMCwgMHg3MDIyLCAweDcwYzQsIDB4MjA2MCwgMHgyYzA1LAorCTB4NjgzNiwgMHhlMDA0LCAweGFkMDAsIDB4NzA5NiwgMHhlMDA4LCAweGEyMGEsIDB4MTIxMCwgMHhhMDBlLAorCTB4MjIwMCwgMHg3MTEyLCAweGUyMGMsIDB4ODAwMywgMHg4MDBiLCAweGEyOTYsIDB4MDAwNCwgMHgwMTA4LAorCTB4YTEwOCwgMHg3MTlhLCAweDgxMGIsIDB4NzE5ZSwgMHhhZTkwLCAweDAwMjIsIDB4MDgwYywgMHgxNjQzLAorCTB4NzA5MCwgMHhhMDhlLCAweDAxMDAsIDB4MDE3MCwgMHhhMDg2LCAweDAyMDAsIDB4MDExOCwgMHg3MDA3LAorCTB4MDAxMCwgMHgwMDA1LCAweDcwMjAsIDB4MjA2OCwgMHgwODBjLCAweDE2MGYsIDB4NzAxNCwgMHgyMDY4LAorCTB4MDgwNCwgMHg1ZjNlLCAweDcwMjAsIDB4MjA2OCwgMHg3MDE4LCAweDY4MDIsIDB4NjgwNywgMHgwMDAwLAorCTB4MmQwOCwgMHgyMDY4LCAweDY5MDYsIDB4NzExYSwgMHgwODA0LCAweDVmYzksIDB4NzAxNCwgMHgyMDY4LAorCTB4NzAwNywgMHgwMDAxLCAweDY4ODQsIDB4YTAwNSwgMHgxMTI4LCAweDY4ODgsIDB4Njk4YywgMHhhMTA1LAorCTB4MDEwOCwgMHgwMGIxLCAweDY4MzQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAxZSwgMHgwOTA0LAorCTB4NjI2ZSwgMHgwNGI4LCAweDYwMjQsIDB4NjAyOCwgMHgwMDAyLCAweDAwMTEsIDB4MDAwNywgMHgwMDA0LAorCTB4MDAwYSwgMHgwMDBmLCAweDAwMDUsIDB4MDAwNiwgMHgwMDBhLCAweDAwMTEsIDB4MDAwNSwgMHgwMDA0LAorCTB4MDBmNiwgMHgwMGU2LCAweDAwYzYsIDB4MDA3NiwgMHgwMDY2LCAweDZmODgsIDB4NmU4YywgMHg2ODA0LAorCTB4MjA2MCwgMHhhY2YwLCAweDAwMjEsIDB4YWNmOCwgMHgwMDI3LCAweDIwMDksIDB4MDAwNSwgMHg3MDBjLAorCTB4NzgxNiwgMHg3MDA4LCAweDc4MTIsIDB4NzAwNCwgMHg3ODA2LCAweDcwMDAsIDB4NzgwMiwgMHg3ZTBlLAorCTB4N2YwYSwgMHg4MTA5LCAweDAxMjgsIDB4YWVmMiwgMHgwMDA0LCAweGFmZmEsIDB4MDAwNiwgMHgwYzc4LAorCTB4NjAwNCwgMHhhMDY1LCAweDFkMzAsIDB4MDA2ZSwgMHgwMDdlLCAweDAwY2UsIDB4MDBlZSwgMHgwMGZlLAorCTB4MDAwNSwgMHgyMDA5LCAweGI1MzEsIDB4MjEwYywgMHg4MWZmLCAweDExOTgsIDB4NjgzOCwgMHhhMDg0LAorCTB4MDBmZiwgMHg2ODNhLCAweDA4MGMsIDB4NGM2NCwgMHgxMTA4LCAweDAwMDUsIDB4MDgwYywgMHg1NGRiLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg5ZWNjLCAweDA4MGMsIDB4NTQwOCwgMHgwMTJlLAorCTB4MGNhMCwgMHgyMDAxLCAweDAwMjgsIDB4MjAwOSwgMHgwMDAwLCAweDBjODAsIDB4MjAwOSwgMHhiNTMxLAorCTB4MjEwYywgMHg4MWZmLCAweDExYjAsIDB4Njg1OCwgMHhhMDA1LCAweDAxYzAsIDB4NjgzOCwgMHhhMDg0LAorCTB4MDBmZiwgMHg2ODNhLCAweDY4NTMsIDB4MDAwMCwgMHgwODBjLCAweDRkMjYsIDB4MTEwOCwgMHgwMDA1LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4Njg0YSwgMHg2OTUyLCAweDA4MGMsIDB4NTQwOCwgMHgwMTJlLAorCTB4MGNiMCwgMHgyMDAxLCAweDAwMjgsIDB4MjAwOSwgMHgwMDAwLCAweDBjOTAsIDB4MjAwMSwgMHgwMDAwLAorCTB4MGM3OCwgMHg3MDE4LCAweDY4MDIsIDB4MmQwOCwgMHgyMDY4LCAweDY5MDYsIDB4NzExYSwgMHg3MDEwLAorCTB4ODAwMSwgMHg3MDEyLCAweDAxMTgsIDB4NzAwNywgMHgwMDA2LCAweDAwMzAsIDB4NzAxNCwgMHgyMDY4LAorCTB4NzAwNywgMHgwMDAxLCAweDcwNDgsIDB4MDgwZiwgMHgwMDA1LCAweDcwMDcsIDB4MDAwMSwgMHg2OTQ0LAorCTB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4Njg0OCwgMHhhMDg0LCAweDAwZmYsIDB4MjBhOSwgMHgwMDAxLAorCTB4YTA5NiwgMHgwMDAxLCAweDAxYjAsIDB4MjAwOSwgMHgwMDAwLCAweDIwYTksIDB4MDBmZiwgMHhhMDk2LAorCTB4MDAwMiwgMHgwMTc4LCAweGEwMDUsIDB4MTFmMCwgMHg2OTQ0LCAweDgxMGYsIDB4YTE4YywgMHgwMGZmLAorCTB4MDgwYywgMHg0ZmE5LCAweDExYjgsIDB4MDA2NiwgMHg2ZTUwLCAweDA4MGMsIDB4NTBhOCwgMHgwMDZlLAorCTB4MDA4OCwgMHgwMDQ2LCAweDIwMTEsIDB4YjUwYywgMHgyMjI0LCAweGM0ODQsIDB4MjQxMiwgMHgwMDRlLAorCTB4MDBjNiwgMHgwODBjLCAweDRmYTksIDB4MTExMCwgMHgwODBjLCAweDUyMDksIDB4ODEwOCwgMHgxZjA0LAorCTB4NjBkOSwgMHgwMGNlLCAweDY4NGMsIDB4ZDA4NCwgMHgxMTE4LCAweDA4MGMsIDB4MTYwZiwgMHgwMDA1LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg1NDA4LCAweDAxMmUsIDB4MDAwNSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDcwMDcsIDB4MDAwMSwgMHgyMDAxLCAweGI1NTMsIDB4MjAwNCwgMHhkMGE0LAorCTB4MDU4MCwgMHgyMDYxLCAweGI4NzQsIDB4NjEwMCwgMHhkMTg0LCAweDAxNzgsIDB4Njg1OCwgMHhhMDg0LAorCTB4MDBmZiwgMHgxNTUwLCAweDYwMDAsIDB4ZDA4NCwgMHgwNTIwLCAweDYwMDQsIDB4YTAwNSwgMHgxNTM4LAorCTB4NjAwMywgMHgwMDAwLCAweDYwMGIsIDB4MDAwMCwgMHgwMGM4LCAweDIwMTEsIDB4MDAwMSwgMHg2ODYwLAorCTB4YTAwNSwgMHgxMTEwLCAweDIwMDEsIDB4MDAxZSwgMHg4MDAwLCAweDYwMTYsIDB4Njg1OCwgMHhhMDg0LAorCTB4MDBmZiwgMHgwMTc4LCAweDYwMDYsIDB4Njg1OCwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHgwMTQ4LAorCTB4NjAwYSwgMHg2ODU4LCAweDgwMDAsIDB4MTEwOCwgMHhjMjhkLCAweDYyMDIsIDB4MDEyZSwgMHgwODA0LAorCTB4NjMzMiwgMHgwMTJlLCAweDA4MDQsIDB4NjMyYywgMHgwMTJlLCAweDA4MDQsIDB4NjMyNiwgMHgwMTJlLAorCTB4MDgwNCwgMHg2MzI5LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwMDcsIDB4MDAwMSwgMHgyMDAxLAorCTB4YjU1MywgMHgyMDA0LCAweGQwYTQsIDB4MDVlMCwgMHgyMDYxLCAweGI4NzQsIDB4NjAwMCwgMHhkMDg0LAorCTB4MDViOCwgMHg2MjA0LCAweDYzMDgsIDB4ZDA4YywgMHgxNTMwLCAweDZjNDgsIDB4YTQ4NCwgMHgwMDAzLAorCTB4MDE3MCwgMHg2OTU4LCAweGExOGMsIDB4MDBmZiwgMHg4MDAxLCAweDExMjAsIDB4MjEwMCwgMHhhMjEwLAorCTB4MDYyMCwgMHgwMDI4LCAweDgwMDEsIDB4MTUwOCwgMHgyMTAwLCAweGEyMTIsIDB4MDJmMCwgMHhhNDg0LAorCTB4MDAwYywgMHgwMTg4LCAweDY5NTgsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4YTA4MiwgMHgwMDA0LAorCTB4MTEyMCwgMHgyMTAwLCAweGEzMTgsIDB4MDI4OCwgMHgwMDMwLCAweGEwODIsIDB4MDAwNCwgMHgxMTY4LAorCTB4MjEwMCwgMHhhMzFhLCAweDAyNTAsIDB4Njg2MCwgMHhhMDA1LCAweDAxMTAsIDB4ODAwMCwgMHg2MDE2LAorCTB4NjIwNiwgMHg2MzBhLCAweDAxMmUsIDB4MDgwNCwgMHg2MzMyLCAweDAxMmUsIDB4MDgwNCwgMHg2MzJmLAorCTB4MDEyZSwgMHgwODA0LCAweDYzMmMsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLAorCTB4MjA2MSwgMHhiODc0LCAweDYzMDAsIDB4ZDM4YywgMHgxMTIwLCAweDYzMDgsIDB4ODMxOCwgMHgwMjIwLAorCTB4NjMwYSwgMHgwMTJlLCAweDA4MDQsIDB4NjM0MCwgMHgwMTJlLCAweDA4MDQsIDB4NjMyZiwgMHgwMTI2LAorCTB4MDBjNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweDY4NGMsIDB4ZDBhYywgMHgwMTQ4LAorCTB4MDBjNiwgMHgyMDYxLCAweGI4NzQsIDB4NjAwMCwgMHhhMDg0LCAweGZjZmYsIDB4NjAwMiwgMHgwMGNlLAorCTB4MDQ0OCwgMHg2ODU4LCAweGEwMDUsIDB4MDVkMCwgMHg2ODVjLCAweGEwNjUsIDB4MDU5OCwgMHgyMDAxLAorCTB4YjUzMSwgMHgyMDA0LCAweGEwMDUsIDB4MDExOCwgMHgwODBjLCAweDllMWQsIDB4MDA2OCwgMHg2MDEzLAorCTB4MDQwMCwgMHg2MDU3LCAweDAwMDAsIDB4Njk0YywgMHhkMWE0LCAweDAxMTAsIDB4Njk1MCwgMHg2MTU2LAorCTB4MjAwOSwgMHgwMDQxLCAweDA4MGMsIDB4ODY0YywgMHg2OTU4LCAweGExOGMsIDB4ZmYwMCwgMHhhMTg2LAorCTB4MjAwMCwgMHgxMTQwLCAweDAwMjYsIDB4MjAwOSwgMHgwMDAwLCAweDIwMTEsIDB4ZmRmZiwgMHgwODBjLAorCTB4NmIxYSwgMHgwMDJlLCAweDY4NGMsIDB4ZDBjNCwgMHgwMTQ4LCAweDIwNjEsIDB4Yjg3NCwgMHg2MDAwLAorCTB4ZDA4YywgMHgxMTIwLCAweDYwMDgsIDB4ODAwMCwgMHgwMjA4LCAweDYwMGEsIDB4MDBjZSwgMHgwMTJlLAorCTB4MDgwNCwgMHg2MzMyLCAweDAwY2UsIDB4MDEyZSwgMHgwODA0LCAweDYzMmMsIDB4Njk1NCwgMHhhMTg2LAorCTB4MDAyZSwgMHgwZDQwLCAweGExODYsIDB4MDAyZCwgMHgwZDI4LCAweGExODYsIDB4MDA0NSwgMHgwNTI4LAorCTB4YTE4NiwgMHgwMDJhLCAweDExMzAsIDB4MjAwMSwgMHhiNTBjLCAweDIwMGMsIDB4YzE5NCwgMHgyMTAyLAorCTB4MDhjOCwgMHhhMTg2LCAweDAwMjAsIDB4MDE3MCwgMHhhMTg2LCAweDAwMjksIDB4MWQxOCwgMHg2OTQ0LAorCTB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MDgwYywgMHg0ZmE5LCAweDE5NjAsIDB4NjAwMCwgMHhjMGU0LAorCTB4NjAwMiwgMHgwODQwLCAweDY4NWMsIDB4YTA2NSwgMHgwOWE4LCAweDYwMDcsIDB4MDAyNCwgMHgyMDAxLAorCTB4YjdiNiwgMHgyMDA0LCAweDYwMTYsIDB4MDgwNCwgMHg2MWNhLCAweDY4NWMsIDB4YTA2NSwgMHgwOTUwLAorCTB4MDBlNiwgMHg2ODYwLCAweGEwNzUsIDB4MjAwMSwgMHhiNTMxLCAweDIwMDQsIDB4YTAwNSwgMHgwMTUwLAorCTB4MDgwYywgMHg5ZTFkLCAweDhlZmYsIDB4MDExOCwgMHgyZTYwLCAweDA4MGMsIDB4OWUxZCwgMHgwMGVlLAorCTB4MDgwNCwgMHg2MWNhLCAweDYwMjAsIDB4YzBkYywgMHhjMGQ1LCAweDYwMjIsIDB4MmU2MCwgMHg2MDA3LAorCTB4MDAzYSwgMHg2ODcwLCAweGEwMDUsIDB4MDEzMCwgMHg2MDA3LCAweDAwM2IsIDB4Njg3NCwgMHg2MDJhLAorCTB4Njg3OCwgMHg2MDEyLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDZjOGQsIDB4MDgwYywgMHg3MTczLAorCTB4MDBlZSwgMHgwODA0LCAweDYxY2EsIDB4MjA2MSwgMHhiODc0LCAweDYwMDAsIDB4ZDA4NCwgMHgwMTkwLAorCTB4ZDA4YywgMHgxOTA0LCAweDYzNDAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjIwNCwgMHg4MjEwLAorCTB4MDIyMCwgMHg2MjA2LCAweDAxMmUsIDB4MDgwNCwgMHg2MzQwLCAweDAxMmUsIDB4Njg1MywgMHgwMDE2LAorCTB4MDgwNCwgMHg2MzM5LCAweDY4NTMsIDB4MDAwNywgMHgwODA0LCAweDYzMzksIDB4NjgzNCwgMHg4MDA3LAorCTB4YTA4NCwgMHgwMGZmLCAweDExMTgsIDB4MDgwYywgMHg1ZjIyLCAweDAwNzgsIDB4MjAzMCwgMHg4MDAxLAorCTB4MTEyMCwgMHg3MDA3LCAweDAwMDEsIDB4MDA1MSwgMHgwMDQwLCAweDcwMDcsIDB4MDAwNiwgMHg3MDEyLAorCTB4MmQwMCwgMHg3MDE2LCAweDcwMWEsIDB4NzA0YiwgMHg2MjZlLCAweDAwMDUsIDB4MDBlNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweGEwM2UsIDB4MjAwOSwgMHhiNTMxLCAweDIxMGMsIDB4ODFmZiwgMHgxOTA0LAorCTB4NjJlYywgMHgyMDA5LCAweGI1MGMsIDB4MjEwYywgMHhkMTk0LCAweDE5MDQsIDB4NjMxNiwgMHg2ODQ4LAorCTB4MjA3MCwgMHhhZTgyLCAweGJkMDAsIDB4MGEwNCwgMHg2MmUwLCAweDIwMDEsIDB4YjUxNywgMHgyMDA0LAorCTB4YWUwMiwgMHgxYTA0LCAweDYyZTAsIDB4NzExYywgMHhhMTg2LCAweDAwMDYsIDB4MTkwNCwgMHg2MmNmLAorCTB4NzAxOCwgMHhhMDA1LCAweDA5MDQsIDB4NjJlYywgMHgyMDA0LCAweGQwZTQsIDB4MTkwNCwgMHg2MzExLAorCTB4MjA2MSwgMHhiODc0LCAweDYxMDAsIDB4YTE4NCwgMHgwMzAxLCAweGEwODYsIDB4MDAwMSwgMHgxNTUwLAorCTB4NzAyMCwgMHhkMGRjLCAweDE5MDQsIDB4NjMxOSwgMHg2ODUzLCAweDAwMDAsIDB4NjgwMywgMHgwMDAwLAorCTB4MmQwOCwgMHg3MDEwLCAweGEwMDUsIDB4MTE1OCwgMHg3MTEyLCAweDY4NGMsIDB4ZDBmNCwgMHgxOTA0LAorCTB4NjMxYywgMHgyZTYwLCAweDA4MGMsIDB4NmE3NiwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDY4LAorCTB4NjgwMCwgMHhhMDA1LCAweDFkZTAsIDB4NjkwMiwgMHgyMTY4LCAweDY4NGMsIDB4ZDBmNCwgMHgxOTA0LAorCTB4NjMxYywgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHgwMTJlLCAweDAwZWUsIDB4Njg1MywgMHgwMDA2LAorCTB4MDgwNCwgMHg2MzM5LCAweGQxODQsIDB4MGRjMCwgMHhkMWM0LCAweDExYTgsIDB4MDBiOCwgMHg2OTQ0LAorCTB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MDgwYywgMHg0ZmE5LCAweDE1ZDgsIDB4NjAwMCwgMHhkMGU0LAorCTB4MTVjMCwgMHg3MTFjLCAweGExODYsIDB4MDAwNywgMHgxMTE4LCAweDY4NTMsIDB4MDAwMiwgMHgwNDk4LAorCTB4Njg1MywgMHgwMDA4LCAweDA0ODAsIDB4Njg1MywgMHgwMDBlLCAweDA0NjgsIDB4Njg1MywgMHgwMDE3LAorCTB4MDQ1MCwgMHg2ODUzLCAweDAwMzUsIDB4MDQzOCwgMHgyMDAxLCAweGI1NzIsIDB4MjAwNCwgMHhkMGZjLAorCTB4MDFlOCwgMHg2ODQ4LCAweDIwNzAsIDB4YWU4MiwgMHhiZDAwLCAweDAyYzAsIDB4NjA1YywgMHhhZTAyLAorCTB4MTJhOCwgMHg3MTFjLCAweGExODYsIDB4MDAwNiwgMHgxMTg4LCAweDcwMTgsIDB4YTAwNSwgMHgwMTcwLAorCTB4MjAwNCwgMHhkMGJjLCAweDAxNTgsIDB4MjAzOSwgMHgwMDAxLCAweDcwMDAsIDB4YTA4NiwgMHgwMDA3LAorCTB4MTkwNCwgMHg2Mjc5LCAweDcwMDMsIDB4MDAwMiwgMHgwODA0LCAweDYyNzksIDB4Njg1MywgMHgwMDI4LAorCTB4MDAxMCwgMHg2ODUzLCAweDAwMjksIDB4MDEyZSwgMHgwMGVlLCAweDA0MTgsIDB4Njg1MywgMHgwMDJhLAorCTB4MGNkMCwgMHg2ODUzLCAweDAwNDUsIDB4MGNiOCwgMHgyZTYwLCAweDIwMTksIDB4MDAwMiwgMHg2MDE3LAorCTB4MDAxNCwgMHgwODBjLCAweGFjZTAsIDB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4MjAwOSwgMHgwMDNlLAorCTB4MDA1OCwgMHgyMDA5LCAweDAwMDQsIDB4MDA0MCwgMHgyMDA5LCAweDAwMDYsIDB4MDAyOCwgMHgyMDA5LAorCTB4MDAxNiwgMHgwMDEwLCAweDIwMDksIDB4MDAwMSwgMHg2ODU0LCAweGEwODQsIDB4ZmYwMCwgMHhhMTA1LAorCTB4Njg1NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDU0MDgsIDB4MDEyZSwgMHgwMDA1LAorCTB4MDgwYywgMHgxNjBmLCAweDAwMDUsIDB4NzAyYywgMHg3MTMwLCAweDgxMDgsIDB4YTEwMiwgMHgwMjMwLAorCTB4YTAwZSwgMHg3MDM0LCAweDcwNzIsIDB4NzAzOCwgMHg3MDc2LCAweDAwNTgsIDB4NzA3MCwgMHhhMDgwLAorCTB4MDA0MCwgMHg3MDcyLCAweDEyMzAsIDB4NzA3NCwgMHhhMDgxLCAweDAwMDAsIDB4NzA3NiwgMHhhMDg1LAorCTB4MDAwMSwgMHg3OTMyLCAweDcxMzIsIDB4MDAwNSwgMHgwMGQ2LCAweDA4MGMsIDB4NmE2ZCwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMGQ2LCAweDAwYzYsIDB4MDAzNiwgMHgwMDI2LCAweDAwMTYsIDB4NzAwNywgMHgwMDAxLAorCTB4NmE0NCwgMHhhMjgyLCAweDAwMDQsIDB4MWEwNCwgMHg2M2FjLCAweGQyODQsIDB4MDE3MCwgMHg2YTRjLAorCTB4YTI5MCwgMHhiNjM1LCAweDIyMDQsIDB4YTA2NSwgMHg2MDA0LCAweDA1ZTAsIDB4ODAwNywgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg0LCAweDAwMDYsIDB4MTEwOCwgMHgwNGE4LCAweDJjMTAsIDB4MDgwYywgMHg4NWM3LAorCTB4MTExOCwgMHgwODBjLCAweDllZDYsIDB4MDVhMCwgMHg2MjFhLCAweDY4NDQsIDB4MDAwMiwgMHg2MzhiLAorCTB4NjM5MCwgMHg2MzkzLCAweDYzOTksIDB4MjAxOSwgMHgwMDAyLCAweDA4MGMsIDB4YjA2NSwgMHgwMDYwLAorCTB4MDgwYywgMHhhZmZjLCAweDAwNDgsIDB4MjAxOSwgMHgwMDAyLCAweDY5NTAsIDB4MDgwYywgMHhiMDE3LAorCTB4MDAxOCwgMHg2OTUwLCAweDA4MGMsIDB4YWZmYywgMHgwODBjLCAweDg2MWQsIDB4Njg1NywgMHgwMDAwLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg1NDA4LCAweDAxMmUsIDB4MDAxZSwgMHgwMDJlLAorCTB4MDAzZSwgMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwgMHg2ODU3LCAweDAwMDYsIDB4MGM4OCwgMHg2ODU3LAorCTB4MDAwMiwgMHgwYzcwLCAweDY4NTcsIDB4MDAwNSwgMHgwYzU4LCAweDY4NTcsIDB4MDAwNCwgMHgwYzQwLAorCTB4Njg1NywgMHgwMDA3LCAweDBjMjgsIDB4MDBkNiwgMHgyMDExLCAweDAwMDQsIDB4MjIwNCwgMHhhMDg1LAorCTB4ODAwMiwgMHgyMDEyLCAweDAwZGUsIDB4MDAwNSwgMHgyMGUxLCAweDAwMDIsIDB4M2QwOCwgMHgyMGUxLAorCTB4MjAwMCwgMHgzZDAwLCAweGEwODQsIDB4NzAwMCwgMHgwMTE4LCAweGEwODYsIDB4MTAwMCwgMHgxNTcwLAorCTB4MjBlMSwgMHgwMDAwLCAweDNkMDAsIDB4YTA5NCwgMHhmZjAwLCAweDgyMTcsIDB4YTA4NCwgMHhmMDAwLAorCTB4YTA4NiwgMHgzMDAwLCAweDExNjAsIDB4YTE4NCwgMHhmZjAwLCAweDgwMDcsIDB4YTA4NiwgMHgwMDA4LAorCTB4MTFlOCwgMHgwODBjLCAweDJkYmYsIDB4MTFkMCwgMHgwODBjLCAweDY2MDMsIDB4MDA5OCwgMHgyMGUxLAorCTB4MDAwNCwgMHgzZDYwLCAweGQxYmMsIDB4MTEwOCwgMHgzZTYwLCAweGFjODQsIDB4MDAwNywgMHgxMTcwLAorCTB4YWM4MiwgMHhiZDAwLCAweDAyNTgsIDB4Njg1YywgMHhhYzAyLCAweDEyNDAsIDB4MjAwOSwgMHgwMDQ3LAorCTB4MDgwYywgMHg4NjRjLCAweDdhMWMsIDB4ZDI4NCwgMHgxOTM4LCAweDAwMDUsIDB4YTAxNiwgMHgwODBjLAorCTB4MTg1ZSwgMHgwY2MwLCAweDBjZDgsIDB4NzgxYywgMHhkMDhjLCAweDA1MDAsIDB4MDE1NiwgMHgwMTM2LAorCTB4MDE0NiwgMHgyMGUxLCAweDMwMDAsIDB4M2QyMCwgMHgzZTI4LCAweGE1ODQsIDB4MDA3NiwgMHgxNTM4LAorCTB4YTQ4NCwgMHg3MDAwLCAweGEwODYsIDB4MTAwMCwgMHgxMWE4LCAweDA4MGMsIDB4NjQ3ZSwgMHgwMWY4LAorCTB4MjBlMSwgMHgzMDAwLCAweDc4MjgsIDB4NzgyOCwgMHgwODBjLCAweDY0OWEsIDB4MDE0ZSwgMHgwMTNlLAorCTB4MDE1ZSwgMHgyMDA5LCAweGI3ZTgsIDB4MjEwNCwgMHhhMDA1LCAweDExMDgsIDB4MDAwNSwgMHgwODBjLAorCTB4NzE3MywgMHgwY2UwLCAweGE0ODQsIDB4NzAwMCwgMHgxNTQ4LCAweDA4MGMsIDB4NjQ3ZSwgMHgwMWQ4LAorCTB4NzAwMCwgMHhhMDg0LCAweGZmMDAsIDB4YTA4NiwgMHg4MTAwLCAweDBkMTAsIDB4MDBhMCwgMHhkNWE0LAorCTB4MDE3OCwgMHgwMDU2LCAweDAwNDYsIDB4MDgwYywgMHgxZTZlLCAweDA4MGMsIDB4MjRiMCwgMHgyMDAxLAorCTB4MDE2MCwgMHgyNTAyLCAweDIwMDEsIDB4MDEzOCwgMHgyMjAyLCAweDAwNGUsIDB4MDA1ZSwgMHgwMDQ4LAorCTB4MDRhOSwgMHg2ODg3LCAweDAwMDAsIDB4MDgwYywgMHhiM2RmLCAweDIwZTEsIDB4MzAwMCwgMHg3ODI4LAorCTB4NzgyOCwgMHgwMGI5LCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLCAweDA4ODAsIDB4MDQzOSwgMHgxMTMwLAorCTB4NzAwMCwgMHhhMDg0LCAweGZmMDAsIDB4YTA4NiwgMHg4MTAwLCAweDFkNjgsIDB4MDgwYywgMHhiM2RmLAorCTB4MjBlMSwgMHgzMDAwLCAweDc4MjgsIDB4NzgyOCwgMHgwMDU2LCAweDA4MGMsIDB4Njg3NCwgMHgwMDVlLAorCTB4MGM0MCwgMHgyMDAxLCAweGI1MGUsIDB4MjAwNCwgMHhkMDhjLCAweDAxNzgsIDB4MjAwMSwgMHhiNTAwLAorCTB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MTE0OCwgMHgwMDI2LCAweDAwMzYsIDB4MjAxMSwgMHg4MDQ4LAorCTB4MjUxOCwgMHgwODBjLCAweDNlY2MsIDB4MDAzZSwgMHgwMDJlLCAweDAwMDUsIDB4YTQ4NCwgMHgwMWZmLAorCTB4Njg4NiwgMHhhMDA1LCAweDAxNjAsIDB4YTA4MCwgMHgwMDFmLCAweGEwODQsIDB4MDNmOCwgMHg4MGFjLAorCTB4MjBlMSwgMHgxMDAwLCAweDJlYTAsIDB4MjA5OSwgMHgwMjBhLCAweDUzYTUsIDB4MDAwNSwgMHgyMGE5LAorCTB4MDAwYywgMHgyMGUxLCAweDEwMDAsIDB4MmVhMCwgMHgyMDk5LCAweDAyMGEsIDB4NTNhNSwgMHhhMDg1LAorCTB4MDAwMSwgMHgwY2EwLCAweDcwMDAsIDB4YTA4NCwgMHhmZjAwLCAweGEwOGMsIDB4ZjAwMCwgMHg4MDA3LAorCTB4YTE5NiwgMHgwMDAwLCAweDExMTgsIDB4MDgwNCwgMHg2NzA4LCAweDAwMDUsIDB4YTE5NiwgMHgyMDAwLAorCTB4MTE0OCwgMHg2OTAwLCAweGExOGUsIDB4MDAwMSwgMHgxMTE4LCAweDA4MGMsIDB4NDQ4ZiwgMHgwY2E4LAorCTB4MDAzOSwgMHgwYzk4LCAweGExOTYsIDB4ODAwMCwgMHgxZDgwLCAweDA4MGMsIDB4NjdiNCwgMHgwYzY4LAorCTB4MDBjNiwgMHg2YTg0LCAweDgyZmYsIDB4MDkwNCwgMHg2NWZkLCAweDcxMTAsIDB4YTE4YywgMHhmZjAwLAorCTB4ODEwZiwgMHhhMTk2LCAweDAwMDEsIDB4MDEyMCwgMHhhMTk2LCAweDAwMjMsIDB4MTkwNCwgMHg2NWZkLAorCTB4YTA4ZSwgMHgwMDIzLCAweDE1NzAsIDB4MDgwYywgMHg2ODRmLCAweDA5MDQsIDB4NjVmZCwgMHg3MTI0LAorCTB4NjEwYSwgMHg3MDMwLCAweGEwOGUsIDB4MDIwMCwgMHgxMTUwLCAweDcwMzQsIDB4YTAwNSwgMHgxOTA0LAorCTB4NjVmZCwgMHgyMDA5LCAweDAwMTUsIDB4MDgwYywgMHg4NjRjLCAweDA4MDQsIDB4NjVmZCwgMHhhMDhlLAorCTB4MDIxNCwgMHgwMTE4LCAweGEwOGUsIDB4MDIxMCwgMHgxMTMwLCAweDIwMDksIDB4MDAxNSwgMHgwODBjLAorCTB4ODY0YywgMHgwODA0LCAweDY1ZmQsIDB4YTA4ZSwgMHgwMTAwLCAweDE5MDQsIDB4NjVmZCwgMHg3MDM0LAorCTB4YTAwNSwgMHgxOTA0LCAweDY1ZmQsIDB4MjAwOSwgMHgwMDE2LCAweDA4MGMsIDB4ODY0YywgMHgwODA0LAorCTB4NjVmZCwgMHhhMDhlLCAweDAwMjIsIDB4MTkwNCwgMHg2NWZkLCAweDcwMzAsIDB4YTA4ZSwgMHgwMzAwLAorCTB4MTU4MCwgMHg2OGQ0LCAweGQwYTQsIDB4MDUyOCwgMHhjMGI1LCAweDY4ZDYsIDB4NzEwMCwgMHhhMThjLAorCTB4MDBmZiwgMHg2OTcyLCAweDcwMDQsIDB4Njg3NiwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHg3OWU2LAorCTB4NzhlYSwgMHgwMDA2LCAweGEwODQsIDB4MDBmZiwgMHgwMDE2LCAweDIwMDgsIDB4MDgwYywgMHgyODQ3LAorCTB4NzkzMiwgMHg3OTM2LCAweDAwMWUsIDB4MDAwZSwgMHgwMGZlLCAweDA4MGMsIDB4MjgxZCwgMHg2OTUyLAorCTB4NzAzYywgMHgwMGU2LCAweDIwNzEsIDB4MDE0MCwgMHg3MDg2LCAweDIwNzEsIDB4YjUwMCwgMHg3MGE2LAorCTB4MDBlZSwgMHg3MDM0LCAweGEwMDUsIDB4MTkwNCwgMHg2NWZkLCAweDIwMDksIDB4MDAxNywgMHgwODA0LAorCTB4NjVjMywgMHhhMDhlLCAweDA0MDAsIDB4MTE1OCwgMHg3MDM0LCAweGEwMDUsIDB4MTkwNCwgMHg2NWZkLAorCTB4NjhkNCwgMHhjMGE1LCAweDY4ZDYsIDB4MjAwOSwgMHgwMDMwLCAweDA4MDQsIDB4NjVjMywgMHhhMDhlLAorCTB4MDUwMCwgMHgxMTQwLCAweDcwMzQsIDB4YTAwNSwgMHgxOTA0LCAweDY1ZmQsIDB4MjAwOSwgMHgwMDE4LAorCTB4MDgwNCwgMHg2NWMzLCAweGEwOGUsIDB4MjAxMCwgMHgxMTIwLCAweDIwMDksIDB4MDAxOSwgMHgwODA0LAorCTB4NjVjMywgMHhhMDhlLCAweDIxMTAsIDB4MTEyMCwgMHgyMDA5LCAweDAwMWEsIDB4MDgwNCwgMHg2NWMzLAorCTB4YTA4ZSwgMHg1MjAwLCAweDExNDAsIDB4NzAzNCwgMHhhMDA1LCAweDE5MDQsIDB4NjVmZCwgMHgyMDA5LAorCTB4MDAxYiwgMHgwODA0LCAweDY1YzMsIDB4YTA4ZSwgMHg1MDAwLCAweDExNDAsIDB4NzAzNCwgMHhhMDA1LAorCTB4MTkwNCwgMHg2NWZkLCAweDIwMDksIDB4MDAxYywgMHgwODA0LCAweDY1YzMsIDB4YTA4ZSwgMHgxMzAwLAorCTB4MTEyMCwgMHgyMDA5LCAweDAwMzQsIDB4MDgwNCwgMHg2NWMzLCAweGEwOGUsIDB4MTIwMCwgMHgxMTQwLAorCTB4NzAzNCwgMHhhMDA1LCAweDE5MDQsIDB4NjVmZCwgMHgyMDA5LCAweDAwMjQsIDB4MDgwNCwgMHg2NWMzLAorCTB4YTA4YywgMHhmZjAwLCAweGExOGUsIDB4MjQwMCwgMHgxMTE4LCAweDIwMDksIDB4MDAyZCwgMHgwNGQ4LAorCTB4YTA4YywgMHhmZjAwLCAweGExOGUsIDB4NTMwMCwgMHgxMTE4LCAweDIwMDksIDB4MDAyYSwgMHgwNDk4LAorCTB4YTA4ZSwgMHgwZjAwLCAweDExMTgsIDB4MjAwOSwgMHgwMDIwLCAweDA0NjgsIDB4YTA4ZSwgMHg1MzAwLAorCTB4MTEwOCwgMHgwMGQ4LCAweGEwOGUsIDB4NjEwNCwgMHgxMWMwLCAweDIwMTEsIDB4YmI4ZCwgMHg4MjA4LAorCTB4MjIwNCwgMHhhMDgyLCAweDAwMDQsIDB4MjBhOCwgMHg5NWFjLCAweDk1YWMsIDB4MjAxMSwgMHg4MDE1LAorCTB4MjExYywgMHg4MTA4LCAweDAwNDYsIDB4MjEyNCwgMHgwODBjLCAweDNlY2MsIDB4MDA0ZSwgMHg4MTA4LAorCTB4MWYwNCwgMHg2NWE2LCAweDIwMDksIDB4MDAyMywgMHgwMDcwLCAweGEwOGUsIDB4NjAwMCwgMHgxMTE4LAorCTB4MjAwOSwgMHgwMDNmLCAweDAwNDAsIDB4YTA4ZSwgMHg3ODAwLCAweDExMTgsIDB4MjAwOSwgMHgwMDQ1LAorCTB4MDAxMCwgMHgyMDA5LCAweDAwMWQsIDB4MDAxNiwgMHgyMDExLCAweGJiODMsIDB4MjIwNCwgMHg4MjExLAorCTB4MjIwYywgMHgwODBjLCAweDI4MWQsIDB4MTU5OCwgMHgwODBjLCAweDRmNGQsIDB4MTU4MCwgMHg2NjEyLAorCTB4NjUxNiwgMHg4NmZmLCAweDAxZTgsIDB4MDAxZSwgMHgwMDE2LCAweGExODYsIDB4MDAxNywgMHgxMTU4LAorCTB4Njg3MCwgMHhhNjA2LCAweDExYTgsIDB4Njg3NCwgMHhhNTA2LCAweGEwODQsIDB4ZmYwMCwgMHgxMTgwLAorCTB4NjAwMCwgMHhjMGY1LCAweDYwMDIsIDB4YTE4NiwgMHgwMDQ2LCAweDExNTAsIDB4Njg3MCwgMHhhNjA2LAorCTB4MTEzOCwgMHg2ODc0LCAweGE1MDYsIDB4YTA4NCwgMHhmZjAwLCAweDExMTAsIDB4MDAxZSwgMHgwMDY4LAorCTB4MDBjNiwgMHgwODBjLCAweDg1YzcsIDB4MDE2OCwgMHgwMDFlLCAweDYxMWEsIDB4NjAxZiwgMHgwMDA0LAorCTB4NzEyMCwgMHg2MTBhLCAweDAwMWUsIDB4MDgwYywgMHg4NjRjLCAweDAwY2UsIDB4MDAwNSwgMHgwMDFlLAorCTB4MGNlMCwgMHgwMGNlLCAweDBjZTAsIDB4MDBjNiwgMHgwMDQ2LCAweDA4MGMsIDB4NjY1NywgMHgxOTA0LAorCTB4NjY1NCwgMHhhMjhlLCAweDAwMzMsIDB4MTFlOCwgMHgwODBjLCAweDY4NGYsIDB4MDkwNCwgMHg2NjU0LAorCTB4NzEyNCwgMHg2MTBhLCAweDcwMzAsIDB4YTA4ZSwgMHgwMjAwLCAweDExNDAsIDB4NzAzNCwgMHhhMDA1LAorCTB4MTVkOCwgMHgyMDA5LCAweDAwMTUsIDB4MDgwYywgMHg4NjRjLCAweDA0YjAsIDB4YTA4ZSwgMHgwMTAwLAorCTB4MTU5OCwgMHg3MDM0LCAweGEwMDUsIDB4MTU4MCwgMHgyMDA5LCAweDAwMTYsIDB4MDgwYywgMHg4NjRjLAorCTB4MDQ1OCwgMHhhMjhlLCAweDAwMzIsIDB4MTU0MCwgMHg3MDMwLCAweGEwOGUsIDB4MTQwMCwgMHgxNTIwLAorCTB4MjAwOSwgMHgwMDM4LCAweDAwMTYsIDB4MjAxMSwgMHhiYjgzLCAweDIyMDQsIDB4ODIxMSwgMHgyMjBjLAorCTB4MDgwYywgMHgyODFkLCAweDExYzAsIDB4MDgwYywgMHg0ZjRkLCAweDExYTgsIDB4NjYxMiwgMHg2NTE2LAorCTB4MDBjNiwgMHgwODBjLCAweDg1YzcsIDB4MDE3MCwgMHgwMDFlLCAweDYxMWEsIDB4MDgwYywgMHhhMDI3LAorCTB4NjAxZiwgMHgwMDA0LCAweDcxMjAsIDB4NjEwYSwgMHgwMDFlLCAweDA4MGMsIDB4ODY0YywgMHgwODBjLAorCTB4NzE3MywgMHgwMDEwLCAweDAwY2UsIDB4MDAxZSwgMHgwMDRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGY2LAorCTB4MDBkNiwgMHgwMDI2LCAweDAwMTYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4M2MwMCwgMHgwMDA2LAorCTB4MjA3OSwgMHgwMDMwLCAweDIwNjksIDB4MDIwMCwgMHgwODBjLCAweDFmMmQsIDB4MTU5MCwgMHgwODBjLAorCTB4MWRkMiwgMHgwNWUwLCAweDA0ZjEsIDB4MTEzMCwgMHg3OTA4LCAweGExOGMsIDB4MWZmZiwgMHhhMTgyLAorCTB4MDAxMSwgMHgxNjg4LCAweDIwYTksIDB4MDAwYywgMHgyMGUxLCAweDAwMDAsIDB4MmVhMCwgMHgyMDk5LAorCTB4MDIwYSwgMHg1M2E1LCAweDIwZTEsIDB4MjAwMCwgMHgyMDAxLCAweDAyMGEsIDB4MjAwNCwgMHg3YTBjLAorCTB4NzgwOCwgMHhhMDgwLCAweDAwMDcsIDB4YTA4NCwgMHgxZmY4LCAweDA0MTksIDB4MTEyMCwgMHhhMDhhLAorCTB4MDE0MCwgMHgxYTBjLCAweDE1MTUsIDB4ODBhYywgMHgyMGUxLCAweDYwMDAsIDB4MjA5OSwgMHgwMjBhLAorCTB4NTNhNSwgMHgyMGUxLCAweDcwMDAsIDB4NjgyOCwgMHg2ODI4LCAweDc4MDMsIDB4MDAwNCwgMHhhMjk0LAorCTB4MDA3MCwgMHgwMDBlLCAweDIwZTAsIDB4MDE1ZSwgMHgwMTRlLCAweDAxM2UsIDB4MDAxZSwgMHgwMDJlLAorCTB4MDBkZSwgMHgwMGZlLCAweDAwMDUsIDB4YTAxNiwgMHgwODBjLCAweDE4NWUsIDB4YTA4NSwgMHgwMDAxLAorCTB4MGM4MCwgMHgwMDA2LCAweDIwMDEsIDB4MDExMSwgMHgyMDA0LCAweGEwODQsIDB4MDAwMywgMHgwMDBlLAorCTB4MDAwNSwgMHgwMDQ2LCAweDAwZTYsIDB4MDBkNiwgMHgyMDI4LCAweDIxMzAsIDB4YTY5NiwgMHgwMGZmLAorCTB4MTE5OCwgMHhhNTk2LCAweGZmZmQsIDB4MTEyMCwgMHgyMDA5LCAweDAwN2YsIDB4MDgwNCwgMHg2NzAzLAorCTB4YTU5NiwgMHhmZmZlLCAweDExMTgsIDB4MjAwOSwgMHgwMDdlLCAweDA0ZTgsIDB4YTU5NiwgMHhmZmZjLAorCTB4MTExOCwgMHgyMDA5LCAweDAwODAsIDB4MDRiOCwgMHgyMDExLCAweDAwMDAsIDB4MjAxOSwgMHhiNTM1LAorCTB4MjMxYywgMHhkM2FjLCAweDAxMzgsIDB4MjAyMSwgMHgwMDAwLCAweDIwYTksIDB4MDBmZiwgMHgyMDcxLAorCTB4YjYzNSwgMHgwMDMwLCAweDIwMjEsIDB4MDA4MSwgMHgyMGE5LCAweDAwN2UsIDB4MjA3MSwgMHhiNmI2LAorCTB4MmUxYywgMHg4M2ZmLCAweDExMjgsIDB4ODJmZiwgMHgxMTk4LCAweDI0MTAsIDB4YzJmZCwgMHgwMDgwLAorCTB4MjM2OCwgMHg2ZjEwLCAweDAwMDYsIDB4MjEwMCwgMHhhNzA2LCAweDAwMGUsIDB4NmIxNCwgMHgxMTIwLAorCTB4YTM0NiwgMHgxMTEwLCAweDI0MDgsIDB4MDA3OCwgMHg4N2ZmLCAweDExMTAsIDB4ODNmZiwgMHgwZDU4LAorCTB4ODQyMCwgMHg4ZTcwLCAweDFmMDQsIDB4NjZlMCwgMHg4MmZmLCAweDExMTgsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDAxOCwgMHhjMmZjLCAweDIyMDgsIDB4YTAwNiwgMHgwMGRlLCAweDAwZWUsIDB4MDA0ZSwgMHgwMDA1LAorCTB4YTA4NCwgMHgwMDA3LCAweDAwMGEsIDB4MDAwNSwgMHg2NzE0LCAweDY3MTQsIDB4NjcxNCwgMHg2ODYxLAorCTB4NjcxNCwgMHg2NzE1LCAweDY3MmEsIDB4Njc5ZiwgMHgwMDA1LCAweDcxMTAsIDB4ZDFiYywgMHgwMTg4LAorCTB4NzEyMCwgMHgyMTYwLCAweGFjOGMsIDB4MDAwNywgMHgxMTYwLCAweGFjOGEsIDB4YmQwMCwgMHgwMjQ4LAorCTB4Njg1YywgMHhhYzAyLCAweDEyMzAsIDB4NzEyNCwgMHg2MTBhLCAweDIwMDksIDB4MDA0NiwgMHgwODBjLAorCTB4ODY0YywgMHgwMDA1LCAweDAwYzYsIDB4YTQ4NCwgMHgwMWZmLCAweDA5MDQsIDB4Njc3ZCwgMHg3MTEwLAorCTB4ZDFiYywgMHgxOTA0LCAweDY3N2QsIDB4MjAxMSwgMHhiYjgzLCAweDIyMDQsIDB4ODIxMSwgMHgyMjBjLAorCTB4MDgwYywgMHgyODFkLCAweDE5MDQsIDB4Njc3ZCwgMHgwODBjLCAweDRmNGQsIDB4MTVmMCwgMHg2NjEyLAorCTB4NjUxNiwgMHg2MDAwLCAweGQwZWMsIDB4MTVjOCwgMHg2MjA0LCAweGEyOTQsIDB4ZmYwMCwgMHg4MjE3LAorCTB4YTI4NiwgMHgwMDA2LCAweDAxNDgsIDB4NjIwNCwgMHhhMjk0LCAweDAwZmYsIDB4YTI4NiwgMHgwMDA2LAorCTB4MTFhMCwgMHhhMjk1LCAweDA2MDAsIDB4NjIwNiwgMHgwMGM2LCAweDA4MGMsIDB4ODVjNywgMHgwMDFlLAorCTB4MDUzMCwgMHg2MTFhLCAweDYwMWYsIDB4MDAwNiwgMHg3MTIwLCAweDYxMGEsIDB4NzEzMCwgMHg2MTUyLAorCTB4MjAwOSwgMHgwMDQ0LCAweDA4MGMsIDB4ODY0YywgMHgwMGMwLCAweDAwYzYsIDB4MDgwYywgMHg4NWM3LAorCTB4MDAxZSwgMHgwMTk4LCAweDYxMWEsIDB4NjAxZiwgMHgwMDA0LCAweDcxMjAsIDB4NjEwYSwgMHhhMjg2LAorCTB4MDAwNCwgMHgxMTE4LCAweDYwMDcsIDB4MDAwNSwgMHgwMDEwLCAweDYwMDcsIDB4MDAwMSwgMHg2MDAzLAorCTB4MDAwMSwgMHgwODBjLCAweDZjZDMsIDB4MDgwYywgMHg3MTczLCAweDAwY2UsIDB4MDAwNSwgMHgyMDAxLAorCTB4YjUwZCwgMHgyMDA0LCAweGQwZWMsIDB4MDEyMCwgMHgyMDExLCAweDgwNDksIDB4MDgwYywgMHgzZWNjLAorCTB4MDBjNiwgMHgwODBjLCAweDllZDYsIDB4MDAxZSwgMHgwZDgwLCAweDYxMWEsIDB4NjAxZiwgMHgwMDA2LAorCTB4NzEyMCwgMHg2MTBhLCAweDcxMzAsIDB4NjE1MiwgMHg2MDEzLCAweDAzMDAsIDB4NjAwMywgMHgwMDAxLAorCTB4NjAwNywgMHgwMDQxLCAweDA4MGMsIDB4NmM4ZCwgMHgwODBjLCAweDcxNzMsIDB4MDhmMCwgMHg3MTEwLAorCTB4ZDFiYywgMHgwMTg4LCAweDcwMjAsIDB4MjA2MCwgMHhhYzg0LCAweDAwMDcsIDB4MTE2MCwgMHhhYzgyLAorCTB4YmQwMCwgMHgwMjQ4LCAweDY4NWMsIDB4YWMwMiwgMHgxMjMwLCAweDcxMjQsIDB4NjEwYSwgMHgyMDA5LAorCTB4MDA0NSwgMHgwODBjLCAweDg2NGMsIDB4MDAwNSwgMHgwMDA2LCAweDA4MGMsIDB4MmRiZiwgMHgwMDBlLAorCTB4MTE2OCwgMHg3MTEwLCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweGExOGUsIDB4MDAwMCwgMHgxMTMwLAorCTB4YTA4NCwgMHgwMDBmLCAweGEwOGEsIDB4MDAwNiwgMHgxMjA4LCAweDAwMGIsIDB4MDAwNSwgMHg2N2NkLAorCTB4NjdjZSwgMHg2N2NkLCAweDY3Y2QsIDB4NjgzNywgMHg2ODQzLCAweDAwMDUsIDB4NzExMCwgMHhkMWJjLAorCTB4MDEyMCwgMHg3MDJjLCAweGQwODQsIDB4MDkwNCwgMHg2ODM2LCAweDcwMGMsIDB4NzEwOCwgMHgwODBjLAorCTB4MjgxZCwgMHgxOTA0LCAweDY4MzYsIDB4MDgwYywgMHg0ZjRkLCAweDE5MDQsIDB4NjgzNiwgMHg2NjEyLAorCTB4NjUxNiwgMHg2MjA0LCAweDcxMTAsIDB4ZDFiYywgMHgwMWY4LCAweGEyOGMsIDB4MDBmZiwgMHhhMTg2LAorCTB4MDAwNCwgMHgwMTE4LCAweGExODYsIDB4MDAwNiwgMHgxNWM4LCAweDAwYzYsIDB4MDgwYywgMHg2ODRmLAorCTB4MDBjZSwgMHgwOTA0LCAweDY4MzYsIDB4MDBjNiwgMHgwODBjLCAweDg1YzcsIDB4MDAxZSwgMHgwNWYwLAorCTB4NjExYSwgMHgwODBjLCAweGEwMjcsIDB4NjAxZiwgMHgwMDAyLCAweDcxMjAsIDB4NjEwYSwgMHgyMDA5LAorCTB4MDA4OCwgMHgwODBjLCAweDg2NGMsIDB4MDQ5MCwgMHhhMjhjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDA2LAorCTB4MDE2MCwgMHhhMTg2LCAweDAwMDQsIDB4MDE0OCwgMHhhMjk0LCAweGZmMDAsIDB4ODIxNywgMHhhMjg2LAorCTB4MDAwNCwgMHgwMTE4LCAweGEyODYsIDB4MDAwNiwgMHgxMTg4LCAweDAwYzYsIDB4MDgwYywgMHg4NWM3LAorCTB4MDAxZSwgMHgwMWUwLCAweDYxMWEsIDB4MDgwYywgMHhhMDI3LCAweDYwMWYsIDB4MDAwNSwgMHg3MTIwLAorCTB4NjEwYSwgMHgyMDA5LCAweDAwODgsIDB4MDgwYywgMHg4NjRjLCAweDAwODAsIDB4MDBjNiwgMHgwODBjLAorCTB4ODVjNywgMHgwMDFlLCAweDAxNTgsIDB4NjExYSwgMHgwODBjLCAweGEwMjcsIDB4NjAxZiwgMHgwMDA0LAorCTB4NzEyMCwgMHg2MTBhLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLCAweDg2NGMsIDB4MDAwNSwgMHg3MTEwLAorCTB4ZDFiYywgMHgwMTQwLCAweDAwYTEsIDB4MDEzMCwgMHg3MTI0LCAweDYxMGEsIDB4MjAwOSwgMHgwMDg5LAorCTB4MDgwYywgMHg4NjRjLCAweDAwMDUsIDB4NzExMCwgMHhkMWJjLCAweDAxNDAsIDB4MDA0MSwgMHgwMTMwLAorCTB4NzEyNCwgMHg2MTBhLCAweDIwMDksIDB4MDA4YSwgMHgwODBjLCAweDg2NGMsIDB4MDAwNSwgMHg3MDIwLAorCTB4MjA2MCwgMHhhYzg0LCAweDAwMDcsIDB4MTE1OCwgMHhhYzgyLCAweGJkMDAsIDB4MDI0MCwgMHgyMDAxLAorCTB4YjUxNywgMHgyMDA0LCAweGFjMDIsIDB4MTIxOCwgMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHhhMDA2LAorCTB4MGNlOCwgMHg3MTEwLCAweGQxYmMsIDB4MTE3OCwgMHg3MDI0LCAweDIwNjAsIDB4YWM4NCwgMHgwMDA3LAorCTB4MTE1MCwgMHhhYzgyLCAweGJkMDAsIDB4MDIzOCwgMHg2ODVjLCAweGFjMDIsIDB4MTIyMCwgMHgyMDA5LAorCTB4MDA1MSwgMHgwODBjLCAweDg2NGMsIDB4MDAwNSwgMHgyMDMxLCAweDAxMDUsIDB4MDA2OSwgMHgwMDA1LAorCTB4MjAzMSwgMHgwMjA2LCAweDAwNDksIDB4MDAwNSwgMHgyMDMxLCAweDAyMDcsIDB4MDAyOSwgMHgwMDA1LAorCTB4MjAzMSwgMHgwMjEzLCAweDAwMDksIDB4MDAwNSwgMHgwMGM2LCAweDAwZDYsIDB4MDBmNiwgMHg3MDAwLAorCTB4YTA4NCwgMHhmMDAwLCAweGEwODYsIDB4YzAwMCwgMHgwNWIwLCAweDA4MGMsIDB4ODVjNywgMHgwNTk4LAorCTB4MDA2NiwgMHgwMGM2LCAweDAwNDYsIDB4MjAxMSwgMHhiYjgzLCAweDIyMDQsIDB4ODIxMSwgMHgyMjBjLAorCTB4MDgwYywgMHgyODFkLCAweDE1ODAsIDB4MDgwYywgMHg0ZjRkLCAweDE1NjgsIDB4NjYxMiwgMHg2NTE2LAorCTB4MmMwMCwgMHgwMDRlLCAweDAwY2UsIDB4NjAxYSwgMHgwODBjLCAweGEwMjcsIDB4MDgwYywgMHgxNWY4LAorCTB4MDFmMCwgMHgyZDAwLCAweDYwNTYsIDB4NjgwMywgMHgwMDAwLCAweDY4MzcsIDB4MDAwMCwgMHg2YzNhLAorCTB4YWRmOCwgMHgwMDBmLCAweDIwYTksIDB4MDAwZSwgMHgyZmEwLCAweDJlOTgsIDB4NTNhMywgMHgwMDZlLAorCTB4NjYxMiwgMHg2MDA3LCAweDAwM2UsIDB4NjAxZiwgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLAorCTB4NmNkMywgMHgwODBjLCAweDcxNzMsIDB4MDBmZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwODBjLAorCTB4ODYxZCwgMHgwMDZlLCAweDBjYzAsIDB4MDA0ZSwgMHgwMGNlLCAweDBjYzgsIDB4MjA3MSwgMHhiN2YzLAorCTB4NzAwMywgMHgwMDAzLCAweDcwMGYsIDB4MDM2MSwgMHhhMDA2LCAweDcwMWEsIDB4NzA3NiwgMHg3MDEyLAorCTB4NzAxNywgMHhiZDAwLCAweDcwMDcsIDB4MDAwMCwgMHg3MDI2LCAweDcwMmIsIDB4N2Q5MSwgMHg3MDMyLAorCTB4NzAzNywgMHg3ZGYxLCAweDcwM2IsIDB4ZmZmZiwgMHg3MDNmLCAweGZmZmYsIDB4NzA0MiwgMHg3MDQ3LAorCTB4NDQ0YiwgMHg3MDRhLCAweDcwNWIsIDB4NmEyYiwgMHgyMDAxLCAweGI3YTEsIDB4MjAwMywgMHgwMDAzLAorCTB4MjAwMSwgMHhiN2EzLCAweDIwMDMsIDB4MDEwMCwgMHgzYTAwLCAweGEwODQsIDB4MDAwNSwgMHg3MDZlLAorCTB4MDAwNSwgMHgyMDcxLCAweGI3ZjMsIDB4MWQwNCwgMHg2OThiLCAweDIwOTEsIDB4NjAwMCwgMHg3MDBjLAorCTB4ODAwMSwgMHg3MDBlLCAweDE1MTgsIDB4NzAwZiwgMHgwMzYxLCAweDcwMDcsIDB4MDAwMSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDcwNDAsIDB4YTAwZCwgMHgwMTI4LCAweDgxMDksIDB4NzE0MiwgMHgxMTEwLAorCTB4NzA0NCwgMHgwODBmLCAweDAwYzYsIDB4MjA2MSwgMHhiNTAwLCAweDYwMzQsIDB4MDBjZSwgMHhkMGNjLAorCTB4MDE4MCwgMHgzYTAwLCAweGEwODQsIDB4MDAwNSwgMHg3MjZjLCAweGEyMTYsIDB4MDE1MCwgMHg3MDZlLAorCTB4MjAxMSwgMHg4MDQzLCAweDIwMTgsIDB4MDgwYywgMHgzZWNjLCAweDAwMTgsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg3MDI0LCAweGEwMGQsIDB4MDE4OCwgMHg3MDIwLCAweDgwMDEsIDB4NzAyMiwgMHgxMTY4LAorCTB4NzAyMywgMHgwMDA5LCAweDgxMDksIDB4NzEyNiwgMHhhMTg2LCAweDAzZTgsIDB4MTExMCwgMHg3MDI4LAorCTB4MDgwZiwgMHg4MWZmLCAweDExMTAsIDB4NzAyOCwgMHgwODBmLCAweDcwMzAsIDB4YTAwZCwgMHgwMTgwLAorCTB4NzAyYywgMHg4MDAxLCAweDcwMmUsIDB4MTE2MCwgMHg3MDJmLCAweDAwMDksIDB4ODEwOSwgMHg3MTMyLAorCTB4MDEyOCwgMHhhMTg0LCAweDAwN2YsIDB4MDkwYywgMHg3ZTM2LCAweDAwMTAsIDB4NzAzNCwgMHgwODBmLAorCTB4NzAzOCwgMHhhMDA1LCAweDAxMTgsIDB4MDMxMCwgMHg4MDAxLCAweDcwM2EsIDB4NzAzYywgMHhhMDA1LAorCTB4MDExOCwgMHgwMzEwLCAweDgwMDEsIDB4NzAzZSwgMHg3MDRjLCAweGEwMGQsIDB4MDE2OCwgMHg3MDQ4LAorCTB4ODAwMSwgMHg3MDRhLCAweDExNDgsIDB4NzA0YiwgMHgwMDA5LCAweDgxMDksIDB4NzE0ZSwgMHgxMTIwLAorCTB4NzE1MCwgMHg3MTRlLCAweDcwNTgsIDB4MDgwZiwgMHg3MDE4LCAweGEwMGQsIDB4MDFkOCwgMHgwMDE2LAorCTB4NzA3NCwgMHhhMDBkLCAweDAxNTgsIDB4NzA3MCwgMHg4MDAxLCAweDcwNzIsIDB4MTEzOCwgMHg3MDczLAorCTB4MDAwOSwgMHg4MTA5LCAweDcxNzYsIDB4MTExMCwgMHg3MDc4LCAweDA4MGYsIDB4MDAxZSwgMHg3MDA4LAorCTB4ODAwMSwgMHg3MDBhLCAweDExMzgsIDB4NzAwYiwgMHgwMDA5LCAweDgxMDksIDB4NzExYSwgMHgxMTEwLAorCTB4NzAxYywgMHgwODBmLCAweDAxMmUsIDB4NzAwNCwgMHgwMDAyLCAweDY5YjEsIDB4NjliMiwgMHg2OWNhLAorCTB4MDBlNiwgMHgyMDcxLCAweGI3ZjMsIDB4NzAxOCwgMHhhMDA1LCAweDExMjAsIDB4NzExYSwgMHg3MjFlLAorCTB4NzAwYiwgMHgwMDA5LCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwMDYsIDB4MjA3MSwgMHhiN2YzLAorCTB4NzAxYywgMHhhMjA2LCAweDExMTAsIDB4NzAxYSwgMHg3MDFlLCAweDAwMGUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgyMDcxLCAweGI3ZjMsIDB4NjA4OCwgMHhhMTAyLCAweDAyMDgsIDB4NjE4YSwgMHgwMGVlLAorCTB4MDAwNSwgMHgwMDA1LCAweDcxMTAsIDB4MDgwYywgMHg0ZmE5LCAweDExNTgsIDB4NjA4OCwgMHg4MDAxLAorCTB4MDI0MCwgMHg2MDhhLCAweDExMzAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg3MTczLAorCTB4MDEyZSwgMHg4MTA4LCAweGExODIsIDB4MDBmZiwgMHgwMjE4LCAweGEwMGUsIDB4NzAwNywgMHgwMDAyLAorCTB4NzExMiwgMHgwMDA1LCAweDcwMTQsIDB4MjA2MCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDNjLAorCTB4YTAwNSwgMHgwMTI4LCAweDgwMDEsIDB4NjAzZSwgMHgxMTEwLCAweDA4MGMsIDB4OWYxNSwgMHg2MDE0LAorCTB4YTAwNSwgMHgwNTAwLCAweDgwMDEsIDB4NjAxNiwgMHgxMWU4LCAweDYxMWMsIDB4YTE4NiwgMHgwMDAzLAorCTB4MDExOCwgMHhhMTg2LCAweDAwMDYsIDB4MTFhMCwgMHg2MDEwLCAweDIwNjgsIDB4Njg1NCwgMHhhMDhhLAorCTB4MTk5YSwgMHgwMjcwLCAweGEwODIsIDB4MTk5OSwgMHg2ODU2LCAweGEwOGEsIDB4MTk5YSwgMHgwMjEwLAorCTB4MjAwMSwgMHgxOTk5LCAweDgwMDMsIDB4ODAwYiwgMHg4MTBiLCAweGExMDgsIDB4NjExNiwgMHgwMDEwLAorCTB4MDgwYywgMHg5OWU1LCAweDAxMmUsIDB4YWM4OCwgMHgwMDE4LCAweDcxMTYsIDB4MjAwMSwgMHhlZDAwLAorCTB4YTEwMiwgMHgwMjIwLCAweDcwMTcsIDB4YmQwMCwgMHg3MDA3LCAweDAwMDAsIDB4MDAwNSwgMHgwMGU2LAorCTB4MjA3MSwgMHhiN2YzLCAweDcwMjcsIDB4MDdkMCwgMHg3MDIzLCAweDAwMDksIDB4MDBlZSwgMHgwMDA1LAorCTB4MjAwMSwgMHhiN2ZjLCAweDIwMDMsIDB4MDAwMCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhiN2YzLAorCTB4NzEzMiwgMHg3MDJmLCAweDAwMDksIDB4MDBlZSwgMHgwMDA1LCAweDIwMTEsIDB4YjdmZiwgMHgyMDEzLAorCTB4MDAwMCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhiN2YzLCAweDcxMWEsIDB4NzIxZSwgMHg3MDBiLAorCTB4MDAwOSwgMHgwMGVlLCAweDAwMDUsIDB4MDBjNiwgMHgwMDI2LCAweDcwNTQsIDB4ODAwMCwgMHg3MDU2LAorCTB4MjA2MSwgMHhiN2ExLCAweDYwMDgsIDB4YTA4NiwgMHgwMDAwLCAweDAxNTgsIDB4NzA2OCwgMHg2MDMyLAorCTB4NzA2NCwgMHg2MDJlLCAweDcwNjAsIDB4NjAyYSwgMHg3MDVjLCAweDYwMjYsIDB4MmMxMCwgMHgwODBjLAorCTB4MTY0MywgMHgwMDJlLCAweDAwY2UsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4MDBjNiwgMHgwMGQ2LAorCTB4MDBlNiwgMHgwMGY2LCAweDA4MGMsIDB4NjhmOSwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLAorCTB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweGI3ZjMsIDB4NzE3NiwgMHg3MjdhLAorCTB4NzA3MywgMHgwMDA5LCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwMDYsIDB4MjA3MSwgMHhiN2YzLAorCTB4NzA3OCwgMHhhMjA2LCAweDExMTAsIDB4NzA3NiwgMHg3MDdhLCAweDAwMGUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDBjNiwgMHgyMDYxLCAweGI4NzQsIDB4MDBjZSwgMHgwMDA1LCAweGExODQsIDB4MDAwZiwgMHg4MDAzLAorCTB4ODAwMywgMHg4MDAzLCAweGEwODAsIDB4Yjg3NCwgMHgyMDYwLCAweDAwMDUsIDB4Njg1NCwgMHhhMDhhLAorCTB4MTk5YSwgMHgwMjEwLCAweDIwMDEsIDB4MTk5OSwgMHhhMDA1LCAweDExNTAsIDB4MDBjNiwgMHgyMDYxLAorCTB4Yjg3NCwgMHg2MDE0LCAweDAwY2UsIDB4YTAwNSwgMHgxMTM4LCAweDIwMDEsIDB4MDAxZSwgMHgwMDIwLAorCTB4YTA4ZSwgMHhmZmZmLCAweDExMDgsIDB4YTAwNiwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHhhMTA4LAorCTB4NjExNiwgMHg2ODRjLCAweGEwOGMsIDB4MDBjMCwgMHhhMThlLCAweDAwYzAsIDB4MDVlOCwgMHhkMGI0LAorCTB4MTEzOCwgMHhkMGJjLCAweDE1NTAsIDB4MjAwOSwgMHgwMDA2LCAweDA4MGMsIDB4NmFmMSwgMHgwMDA1LAorCTB4ZDBmYywgMHgwMTM4LCAweGEwODQsIDB4MDAwMywgMHgwMTIwLCAweGEwODYsIDB4MDAwMywgMHgxOTA0LAorCTB4NmFlYiwgMHg2MDIwLCAweGQwZDQsIDB4MDEzMCwgMHhjMGQ0LCAweDYwMjIsIDB4Njg2MCwgMHg2MDJhLAorCTB4Njg1YywgMHg2MDJlLCAweDIwMDksIDB4YjU3NCwgMHgyMTA0LCAweGQwODQsIDB4MDEzOCwgMHg4N2ZmLAorCTB4MTEyMCwgMHgyMDA5LCAweDAwNDIsIDB4MDgwYywgMHg4NjRjLCAweDAwMDUsIDB4ODdmZiwgMHgxMTIwLAorCTB4MjAwOSwgMHgwMDQzLCAweDA4MGMsIDB4ODY0YywgMHgwMDA1LCAweGQwZmMsIDB4MDEzMCwgMHhhMDg0LAorCTB4MDAwMywgMHgwMTE4LCAweGEwODYsIDB4MDAwMywgMHgxMWYwLCAweDg3ZmYsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDA0MiwgMHgwODBjLCAweDg2NGMsIDB4MDAwNSwgMHhkMGZjLCAweDAxNjAsIDB4YTA4NCwgMHgwMDAzLAorCTB4YTA4ZSwgMHgwMDAyLCAweDAxNDgsIDB4ODdmZiwgMHgxMTIwLCAweDIwMDksIDB4MDA0MSwgMHgwODBjLAorCTB4ODY0YywgMHgwMDA1LCAweDAwNjEsIDB4MGNlOCwgMHg4N2ZmLCAweDFkZDgsIDB4MjAwOSwgMHgwMDQzLAorCTB4MDgwYywgMHg4NjRjLCAweDBjYjAsIDB4MjAwOSwgMHgwMDA0LCAweDAwMTksIDB4MDAwNSwgMHgyMDA5LAorCTB4MDAwMSwgMHgwMGQ2LCAweDYwMTAsIDB4YTBlYywgMHhmMDAwLCAweDA1MTAsIDB4MjA2OCwgMHg2OTUyLAorCTB4NjgwMCwgMHg2MDEyLCAweGExODYsIDB4MDAwMSwgMHgxMTg4LCAweDY5NGMsIDB4YTE4YywgMHg4MTAwLAorCTB4YTE4ZSwgMHg4MTAwLCAweDExNTgsIDB4MDBjNiwgMHgyMDYxLCAweGI4NzQsIDB4NjIwMCwgMHhkMjhjLAorCTB4MTEyMCwgMHg2MjA0LCAweDgyMTAsIDB4MDIwOCwgMHg2MjA2LCAweDAwY2UsIDB4MDgwYywgMHg1NDA4LAorCTB4NjAxMCwgMHhhMDZkLCAweDAwNzYsIDB4MjAzOSwgMHgwMDAwLCAweDE5MGMsIDB4NmE3NiwgMHgwMDdlLAorCTB4MDBkZSwgMHgwMDA1LCAweDAxNTYsIDB4MDBjNiwgMHgyMDYxLCAweGI4NzQsIDB4NjAwMCwgMHg4MWZmLAorCTB4MDExMCwgMHhhMjA1LCAweDAwMDgsIDB4YTIwNCwgMHg2MDAyLCAweDAwY2UsIDB4MDE1ZSwgMHgwMDA1LAorCTB4NjgwMCwgMHhkMDhjLCAweDExMzgsIDB4NjgwOCwgMHhhMDA1LCAweDAxMjAsIDB4ODAwMSwgMHg2ODBhLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MjBhOSwgMHgwMDEwLCAweGEwMDYsIDB4ODAwNCwgMHg4MDg2LAorCTB4ODE4ZSwgMHgxMjA4LCAweGEyMDAsIDB4MWYwNCwgMHg2YjM3LCAweDgwODYsIDB4ODE4ZSwgMHgwMDA1LAorCTB4MDE1NiwgMHgyMGE5LCAweDAwMTAsIDB4YTAwNSwgMHgwMWI4LCAweGExMWEsIDB4MTJhOCwgMHg4MjEzLAorCTB4ODE4ZCwgMHgwMjI4LCAweGExMWEsIDB4MTIyMCwgMHgxZjA0LCAweDZiNDcsIDB4MDAyOCwgMHhhMTFhLAorCTB4MjMwOCwgMHg4MjEwLCAweDFmMDQsIDB4NmI0NywgMHgwMDA2LCAweDMyMDAsIDB4YTA4NCwgMHhlZmZmLAorCTB4MjA4MCwgMHgwMDBlLCAweDAxNWUsIDB4MDAwNSwgMHgwMDA2LCAweDMyMDAsIDB4YTA4NSwgMHgxMDAwLAorCTB4MGNiOCwgMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwgMHgyMDc5LCAweGI3ZTAsIDB4MDEyZSwgMHgwMGQ2LAorCTB4MjA2OSwgMHhiN2UwLCAweDY4MDMsIDB4MDAwNSwgMHgyMDY5LCAweDAwMDQsIDB4MmQwNCwgMHhhMDg1LAorCTB4ODAwMSwgMHgyMDZhLCAweDAwZGUsIDB4MDAwNSwgMHgwMGM2LCAweDYwMjcsIDB4MDAwMSwgMHg3ODA0LAorCTB4YTA4NCwgMHgwMDA3LCAweDAwMDIsIDB4NmI4NSwgMHg2YmE2LCAweDZiZjksIDB4NmI4YiwgMHg2YmE2LAorCTB4NmI4NSwgMHg2YjgzLCAweDZiODMsIDB4MDgwYywgMHgxNTE1LCAweDA4MGMsIDB4NmExMCwgMHgwODBjLAorCTB4NzE3MywgMHgwMGNlLCAweDAwMDUsIDB4NjJjMCwgMHg4MmZmLCAweDExMTAsIDB4MDBjZSwgMHgwMDA1LAorCTB4MjAxMSwgMHg0YWRjLCAweDA4MGMsIDB4Njk5YywgMHg3ODI4LCAweGEwOTIsIDB4MDBjOCwgMHgxMjI4LAorCTB4ODAwMCwgMHg3ODJhLCAweDA4MGMsIDB4NGIxNiwgMHgwYzg4LCAweDA4MGMsIDB4NGFkYywgMHg3ODA3LAorCTB4MDAwMywgMHg3ODI3LCAweDAwMDAsIDB4NzgyYiwgMHgwMDAwLCAweDBjNDAsIDB4MDgwYywgMHg2YTEwLAorCTB4M2MwMCwgMHgwMDA2LCAweDIwMTEsIDB4MDIwOSwgMHgyMGUxLCAweDQwMDAsIDB4MjIxNCwgMHgwMDBlLAorCTB4MjBlMCwgMHg4MmZmLCAweDAxNzgsIDB4NjJjMCwgMHg4MmZmLCAweDExNjAsIDB4NzgyYiwgMHgwMDAwLAorCTB4NzgyNCwgMHhhMDY1LCAweDA5MGMsIDB4MTUxNSwgMHgyMDA5LCAweDAwMTMsIDB4MDgwYywgMHg4NjRjLAorCTB4MDBjZSwgMHgwMDA1LCAweDM5MDAsIDB4YTA4MiwgMHhiOTJjLCAweDEyMTAsIDB4MDgwYywgMHg4MzMyLAorCTB4MDBjNiwgMHg3ODI0LCAweGEwNjUsIDB4MDkwYywgMHgxNTE1LCAweDc4MDQsIDB4YTA4NiwgMHgwMDA0LAorCTB4MDkwNCwgMHg2YzM5LCAweDc4MjgsIDB4YTA5MiwgMHgyNzEwLCAweDEyMzAsIDB4ODAwMCwgMHg3ODJhLAorCTB4MDBjZSwgMHgwODBjLCAweDdkNmQsIDB4MGMyMCwgMHg2MTA0LCAweGExODYsIDB4MDAwMywgMHgxMTg4LAorCTB4MDBlNiwgMHgyMDcxLCAweGI1MDAsIDB4NzBlMCwgMHgwMGVlLCAweGQwOGMsIDB4MDE1MCwgMHgwMGM2LAorCTB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHhiNTAwLCAweDA4MGMsIDB4NGIxZiwgMHgwMGVlLAorCTB4MDBjZSwgMHgwODBjLCAweGI0NDQsIDB4MjAwOSwgMHgwMDE0LCAweDA4MGMsIDB4ODY0YywgMHgwMGNlLAorCTB4MDgzOCwgMHgyMDAxLCAweGI3ZmMsIDB4MjAwMywgMHgwMDAwLCAweDYyYzAsIDB4ODJmZiwgMHgxMTYwLAorCTB4NzgyYiwgMHgwMDAwLCAweDc4MjQsIDB4YTA2NSwgMHgwOTBjLCAweDE1MTUsIDB4MjAwOSwgMHgwMDEzLAorCTB4MDgwYywgMHg4NmEwLCAweDAwY2UsIDB4MDAwNSwgMHgwMGM2LCAweDAwZDYsIDB4MzkwMCwgMHhhMDgyLAorCTB4YjkyYywgMHgxMjEwLCAweDA4MGMsIDB4ODMzMiwgMHg3ODI0LCAweGEwMDUsIDB4MDkwYywgMHgxNTE1LAorCTB4NzgxYywgMHhhMDZkLCAweDA5MGMsIDB4MTUxNSwgMHg2ODAwLCAweGMwZGMsIDB4NjgwMiwgMHg3OTI0LAorCTB4MjE2MCwgMHgwODBjLCAweDg2MWQsIDB4NjkzYywgMHg4MWZmLCAweDA5MGMsIDB4MTUxNSwgMHg4MTA5LAorCTB4NjkzZSwgMHg2ODU0LCAweGEwMTUsIDB4MDExMCwgMHg3YTFlLCAweDAwMTAsIDB4NzkxOCwgMHg3OTFlLAorCTB4NzgwNywgMHgwMDAwLCAweDc4MjcsIDB4MDAwMCwgMHgwMGRlLCAweDAwY2UsIDB4MDgwYywgMHg3MTczLAorCTB4MDg4OCwgMHg2MTA0LCAweGExODYsIDB4MDAwMiwgMHgwMTI4LCAweGExODYsIDB4MDAwNCwgMHgwMTEwLAorCTB4MDgwNCwgMHg2YmQyLCAweDc4MDgsIDB4YWMwNiwgMHgwOTA0LCAweDZiZDIsIDB4MDgwYywgMHg3MDkwLAorCTB4MDgwYywgMHg2Y2QzLCAweDAwY2UsIDB4MDgwYywgMHg3MTczLCAweDA4MDQsIDB4NmJjMCwgMHgwMGM2LAorCTB4NjAyNywgMHgwMDAyLCAweDYyYzgsIDB4NjBjNCwgMHhhMjA1LCAweDExNzgsIDB4NzkzYywgMHhhMWU1LAorCTB4MDAwMCwgMHgwMTMwLCAweDIwMDksIDB4MDA0OSwgMHgwODBjLCAweDg2NGMsIDB4MDBjZSwgMHgwMDA1LAorCTB4MjAxMSwgMHhiN2ZmLCAweDIwMTMsIDB4MDAwMCwgMHgwY2M4LCAweDM5MDgsIDB4YTE5MiwgMHhiOTJjLAorCTB4MTIxMCwgMHgwODBjLCAweDgzMzIsIDB4NzkzYywgMHg4MWZmLCAweDBkOTAsIDB4Nzk0NCwgMHhhMTkyLAorCTB4NzUzMCwgMHgxMmI4LCAweDgxMDgsIDB4Nzk0NiwgMHg3OTNjLCAweGExODgsIDB4MDAwNywgMHgyMTBjLAorCTB4YTE4ZSwgMHgwMDA2LCAweDExMzgsIDB4NjAxNCwgMHhhMDg0LCAweDAxODQsIDB4YTA4NSwgMHgwMDEyLAorCTB4NjAxNiwgMHgwOGUwLCAweDYwMTQsIDB4YTA4NCwgMHgwMTg0LCAweGEwODUsIDB4MDAxNiwgMHg2MDE2LAorCTB4MDhhOCwgMHg3ODQ4LCAweGMwODUsIDB4Nzg0YSwgMHgwODg4LCAweDAwMDYsIDB4MDAxNiwgMHgwMGM2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjAwZiwgMHgwMDAwLCAweDJjMDgsIDB4MjA2MSwgMHhiN2UwLAorCTB4NjAyMCwgMHg4MDAwLCAweDYwMjIsIDB4NjAxMCwgMHhhMDA1LCAweDAxNDgsIDB4YTA4MCwgMHgwMDAzLAorCTB4MjEwMiwgMHg2MTEyLCAweDAxMmUsIDB4MDBjZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHg2MTE2LAorCTB4NjExMiwgMHgwY2MwLCAweDAwZDYsIDB4MjA2OSwgMHhiN2UwLCAweDYwMDAsIDB4ZDBkNCwgMHgwMTY4LAorCTB4NjgyMCwgMHg4MDAwLCAweDY4MjIsIDB4YTA4NiwgMHgwMDAxLCAweDExMTAsIDB4MmMwMCwgMHg2ODFlLAorCTB4NjgwNCwgMHhhMDg0LCAweDAwMDcsIDB4MDgwNCwgMHg3MTc5LCAweGMwZDUsIDB4NjAwMiwgMHg2ODE4LAorCTB4YTAwNSwgMHgwMTU4LCAweDYwNTYsIDB4NjA1YiwgMHgwMDAwLCAweDAwMDYsIDB4MmMwMCwgMHg2ODFhLAorCTB4MDBkZSwgMHg2ODVhLCAweDIwNjksIDB4YjdlMCwgMHgwYzE4LCAweDYwNTYsIDB4NjA1YSwgMHgyYzAwLAorCTB4NjgxYSwgMHg2ODFlLCAweDA4ZTgsIDB4MDAwNiwgMHgwMDE2LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg2MDBmLCAweDAwMDAsIDB4MmMwOCwgMHgyMDYxLCAweGI3ZTAsIDB4NjAyMCwgMHg4MDAwLAorCTB4NjAyMiwgMHg2MDA4LCAweGEwMDUsIDB4MDE0OCwgMHhhMDgwLCAweDAwMDMsIDB4MjEwMiwgMHg2MTBhLAorCTB4MDEyZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDYxMGUsIDB4NjEwYSwgMHgwY2MwLAorCTB4MDBjNiwgMHg2MDBmLCAweDAwMDAsIDB4MmMwOCwgMHgyMDYxLCAweGI3ZTAsIDB4NjAzNCwgMHhhMDA1LAorCTB4MDEzMCwgMHhhMDgwLCAweDAwMDMsIDB4MjEwMiwgMHg2MTM2LCAweDAwY2UsIDB4MDAwNSwgMHg2MTNhLAorCTB4NjEzNiwgMHgwY2Q4LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDA3NiwgMHgwMDY2LAorCTB4MDA1NiwgMHgwMDM2LCAweDAwMjYsIDB4MDAxNiwgMHgwMDA2LCAweDAxMjYsIDB4YTAyZSwgMHgyMDcxLAorCTB4YjdlMCwgMHg3NjM4LCAweDI2NjAsIDB4MjY3OCwgMHgyMDkxLCAweDgwMDAsIDB4OGNmZiwgMHgwOTA0LAorCTB4NmQ3YiwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEyMDYsIDB4MTkwNCwgMHg2ZDc2LAorCTB4ODdmZiwgMHgwMTIwLCAweDYwNTAsIDB4YTEwNiwgMHgxOTA0LCAweDZkNzYsIDB4NzAzYywgMHhhYzA2LAorCTB4MTE5MCwgMHgwMDM2LCAweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweDdmZTQsIDB4NzAzMywgMHgwMDAwLAorCTB4NzAzZiwgMHgwMDAwLCAweDcwNDMsIDB4MDAwMCwgMHg3MDQ3LCAweDAwMDAsIDB4NzA0YiwgMHgwMDAwLAorCTB4MDAzZSwgMHgyMDI5LCAweDAwMDEsIDB4NzAzOCwgMHhhYzM2LCAweDExMTAsIDB4NjYwYywgMHg3NjNhLAorCTB4NzAzNCwgMHhhYzM2LCAweDExNDAsIDB4MmMwMCwgMHhhZjM2LCAweDAxMTgsIDB4MmYwMCwgMHg3MDM2LAorCTB4MDAxMCwgMHg3MDM3LCAweDAwMDAsIDB4NjYwYywgMHgwMDY2LCAweDJjMDAsIDB4YWYwNiwgMHgwMTEwLAorCTB4N2UwZSwgMHgwMDA4LCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLCAweDA4MGMsIDB4OWM1YSwgMHgwMWM4LAorCTB4NjAxMCwgMHgyMDY4LCAweDYwMWMsIDB4YTA4NiwgMHgwMDAzLCAweDE1ODAsIDB4NjgzNywgMHgwMTAzLAorCTB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsIDB4MDAxNiwgMHgwMDM2LCAweDAwNzYsIDB4MDgwYywgMHg5ZWNjLAorCTB4MDgwYywgMHhiMzgwLCAweDA4MGMsIDB4NTQwOCwgMHgwMDdlLCAweDAwM2UsIDB4MDAxZSwgMHgwODBjLAorCTB4OWUxMSwgMHgwODBjLCAweDllMWQsIDB4MDBjZSwgMHgwODA0LCAweDZkMTYsIDB4MmM3OCwgMHg2MDBjLAorCTB4MjA2MCwgMHgwODA0LCAweDZkMTYsIDB4ODVmZiwgMHgwMTIwLCAweDAwMzYsIDB4MDgwYywgMHg3MjMwLAorCTB4MDAzZSwgMHgwMTJlLCAweDAwMGUsIDB4MDAxZSwgMHgwMDJlLCAweDAwM2UsIDB4MDA1ZSwgMHgwMDZlLAorCTB4MDA3ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4NjAxYywgMHhhMDg2LAorCTB4MDAwNiwgMHgxMTU4LCAweDAwMTYsIDB4MDAzNiwgMHgwMDc2LCAweDA4MGMsIDB4YjM4MCwgMHgwODBjLAorCTB4YjA5OSwgMHgwMDdlLCAweDAwM2UsIDB4MDAxZSwgMHgwOGEwLCAweDYwMWMsIDB4YTA4NiwgMHgwMDBhLAorCTB4MDkwNCwgMHg2ZDYwLCAweDA4MDQsIDB4NmQ1ZSwgMHgwMDA2LCAweDAwNjYsIDB4MDBjNiwgMHgwMGQ2LAorCTB4MDBmNiwgMHgyMDMxLCAweDAwMDAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3OSwgMHhiN2UwLAorCTB4NzgzOCwgMHhhMDY1LCAweDA1NjgsIDB4NjAwYywgMHgwMDA2LCAweDYwMGYsIDB4MDAwMCwgMHg3ODNjLAorCTB4YWMwNiwgMHgxMTgwLCAweDAwMzYsIDB4MjAxOSwgMHgwMDAxLCAweDA4MGMsIDB4N2ZlNCwgMHg3ODMzLAorCTB4MDAwMCwgMHg3ODNmLCAweDAwMDAsIDB4Nzg0MywgMHgwMDAwLCAweDc4NDcsIDB4MDAwMCwgMHg3ODRiLAorCTB4MDAwMCwgMHgwMDNlLCAweDA4MGMsIDB4OWM1YSwgMHgwMTc4LCAweDYwMTAsIDB4MjA2OCwgMHg2MDFjLAorCTB4YTA4NiwgMHgwMDAzLCAweDExYjAsIDB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLAorCTB4MDgwYywgMHg1NDA4LCAweDA4MGMsIDB4OWUxMSwgMHgwODBjLCAweDllMWQsIDB4MDAwZSwgMHgwODg4LAorCTB4N2UzYSwgMHg3ZTM2LCAweDAxMmUsIDB4MDBmZSwgMHgwMGRlLCAweDAwY2UsIDB4MDA2ZSwgMHgwMDBlLAorCTB4MDAwNSwgMHg2MDFjLCAweGEwODYsIDB4MDAwNiwgMHgxMTE4LCAweDA4MGMsIDB4YjA5OSwgMHgwYzYwLAorCTB4NjAxYywgMHhhMDg2LCAweDAwMGEsIDB4MGQwOCwgMHgwOGYwLCAweDAwMTYsIDB4MDAyNiwgMHgwMDg2LAorCTB4MjA0MSwgMHgwMDAwLCAweDAwOTksIDB4MDgwYywgMHg2ZWMzLCAweDAwOGUsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwMGY2LCAweDAxMjYsIDB4MjA3OSwgMHhiN2UwLCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLAorCTB4NmY1MCwgMHgwODBjLCAweDZmYzIsIDB4MDEyZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDBkNiwgMHgwMGM2LCAweDAwNjYsIDB4MDAxNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA3MSwgMHhiN2UwLCAweDc2MTQsIDB4MjY2MCwgMHgyNjc4LCAweDhjZmYsIDB4MDkwNCwgMHg2ZTk5LAorCTB4NjAxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMjA2LCAweDE5MDQsIDB4NmU5NCwgMHg4OGZmLAorCTB4MDEyMCwgMHg2MDUwLCAweGExMDYsIDB4MTkwNCwgMHg2ZTk0LCAweDcwMjQsIDB4YWMwNiwgMHgxNTM4LAorCTB4MjA2OSwgMHgwMTAwLCAweDY4YzAsIDB4YTAwNSwgMHgwMWYwLCAweDA4MGMsIDB4NmExMCwgMHgwODBjLAorCTB4N2Q3YSwgMHg2OGMzLCAweDAwMDAsIDB4MDgwYywgMHg4MjRkLCAweDcwMjcsIDB4MDAwMCwgMHgwMDM2LAorCTB4MjA2OSwgMHgwMTQwLCAweDZiMDQsIDB4YTM4NCwgMHgxMDAwLCAweDAxMjAsIDB4NjgwMywgMHgwMTAwLAorCTB4NjgwMywgMHgwMDAwLCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDExMCwgMHg2ODI3LAorCTB4MDAwMSwgMHgwMDNlLCAweDAwMjAsIDB4NjAwMywgMHgwMDA5LCAweDYzMGEsIDB4MDRlOCwgMHg3MDE0LAorCTB4YWMzNiwgMHgxMTEwLCAweDY2MGMsIDB4NzYxNiwgMHg3MDEwLCAweGFjMzYsIDB4MTE0MCwgMHgyYzAwLAorCTB4YWYzNiwgMHgwMTE4LCAweDJmMDAsIDB4NzAxMiwgMHgwMDEwLCAweDcwMTMsIDB4MDAwMCwgMHg2NjBjLAorCTB4MDA2NiwgMHgyYzAwLCAweGFmMDYsIDB4MDExMCwgMHg3ZTBlLCAweDAwMDgsIDB4MjY3OCwgMHg2MDBmLAorCTB4MDAwMCwgMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5YzVhLCAweDAxYjgsIDB4NjAxYywgMHhhMDg2LAorCTB4MDAwMywgMHgxNTQwLCAweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgwMDE2LAorCTB4MDAzNiwgMHgwMDg2LCAweDA4MGMsIDB4OWVjYywgMHgwODBjLCAweGIzODAsIDB4MDgwYywgMHg1NDA4LAorCTB4MDA4ZSwgMHgwMDNlLCAweDAwMWUsIDB4MDgwYywgMHg5ZTExLCAweDA4MGMsIDB4OWUxZCwgMHgwODBjLAorCTB4ODExZSwgMHgwMGNlLCAweDA4MDQsIDB4NmUxZCwgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwODA0LAorCTB4NmUxZCwgMHgwMTJlLCAweDAwMGUsIDB4MDAxZSwgMHgwMDZlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMDA1LCAweDYwMWMsIDB4YTA4NiwgMHgwMDA2LCAweDExNTgsIDB4MDAxNiwgMHgwMDM2LAorCTB4MDA4NiwgMHgwODBjLCAweGIzODAsIDB4MDgwYywgMHhiMDk5LCAweDAwOGUsIDB4MDAzZSwgMHgwMDFlLAorCTB4MDhlMCwgMHg2MDFjLCAweGEwODYsIDB4MDAwMiwgMHgxMTI4LCAweDYwMDQsIDB4YTA4NiwgMHgwMDg1LAorCTB4MDkwOCwgMHgwODk4LCAweDYwMWMsIDB4YTA4NiwgMHgwMDA1LCAweDE5NzgsIDB4NjAwNCwgMHhhMDg2LAorCTB4MDA4NSwgMHgwZDIwLCAweDA4NTAsIDB4MDBjNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4YTI4MCwgMHhiNjM1LCAweDIwMDQsIDB4YTA2NSwgMHgwOTA0LCAweDZmNGMsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDBkNiwgMHgwMDY2LCAweDIwNzEsIDB4YjdlMCwgMHg2NjU0LCAweDcwMTgsIDB4YWMwNiwgMHgxMTA4LAorCTB4NzYxYSwgMHg3MDFjLCAweGFjMDYsIDB4MTEzMCwgMHg4NmZmLCAweDExMTgsIDB4NzAxOCwgMHg3MDFlLAorCTB4MDAwOCwgMHg3NjFlLCAweDYwNTgsIDB4YTA3ZCwgMHgwMTA4LCAweDdlNTYsIDB4YTZlZCwgMHgwMDAwLAorCTB4MDExMCwgMHgyZjAwLCAweDY4NWEsIDB4NjA1NywgMHgwMDAwLCAweDYwNWIsIDB4MDAwMCwgMHg2MDAwLAorCTB4YzBkNCwgMHhjMGRjLCAweDYwMDIsIDB4MDgwYywgMHg0ZWQ0LCAweDA5MDQsIDB4NmY0OCwgMHg3NjI0LAorCTB4ODZmZiwgMHgwNWU4LCAweGE2ODAsIDB4MDAwNCwgMHgyMDA0LCAweGFkMDYsIDB4MTVjMCwgMHgwMGQ2LAorCTB4MjA2OSwgMHgwMTAwLCAweDY4YzAsIDB4YTAwNSwgMHgwNTQ4LCAweDA4MGMsIDB4NmExMCwgMHgwODBjLAorCTB4N2Q3YSwgMHg2OGMzLCAweDAwMDAsIDB4MDgwYywgMHg4MjRkLCAweDcwMjcsIDB4MDAwMCwgMHgwMDM2LAorCTB4MjA2OSwgMHgwMTQwLCAweDZiMDQsIDB4YTM4NCwgMHgxMDAwLCAweDAxMjAsIDB4NjgwMywgMHgwMTAwLAorCTB4NjgwMywgMHgwMDAwLCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDExMCwgMHg2ODI3LAorCTB4MDAwMSwgMHgwMDNlLCAweDAwZGUsIDB4MDBjNiwgMHg2MDNjLCAweGEwMDUsIDB4MDExMCwgMHg4MDAxLAorCTB4NjAzZSwgMHgyNjYwLCAweDA4MGMsIDB4OWUxZCwgMHgwMGNlLCAweDAwNDgsIDB4MDBkZSwgMHgwMGM2LAorCTB4MjY2MCwgMHg2MDAzLCAweDAwMDksIDB4NjMwYSwgMHgwMGNlLCAweDA4MDQsIDB4NmVmMywgMHg4ZGZmLAorCTB4MDE1OCwgMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsIDB4MDgwYywgMHg5ZWNjLAorCTB4MDgwYywgMHhiMzgwLCAweDA4MGMsIDB4NTQwOCwgMHgwODBjLCAweDgxMWUsIDB4MDgwNCwgMHg2ZWYzLAorCTB4MDA2ZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMTJlLCAweDAwMGUsIDB4MDBjZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgwMDY2LCAweDAwYzYsIDB4MDBkNiwgMHgyMDMxLCAweDAwMDAsIDB4NzgxNCwgMHhhMDY1LAorCTB4MDkwNCwgMHg2ZmEyLCAweDYwMGMsIDB4MDAwNiwgMHg2MDBmLCAweDAwMDAsIDB4NzgyNCwgMHhhYzA2LAorCTB4MTU0MCwgMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwgMHhhMDA1LCAweDAxZjAsIDB4MDgwYywgMHg2YTEwLAorCTB4MDgwYywgMHg3ZDdhLCAweDY4YzMsIDB4MDAwMCwgMHgwODBjLCAweDgyNGQsIDB4NzgyNywgMHgwMDAwLAorCTB4MDAzNiwgMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHhhMzg0LCAweDEwMDAsIDB4MDEyMCwgMHg2ODAzLAorCTB4MDEwMCwgMHg2ODAzLCAweDAwMDAsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwgMHgwMTEwLAorCTB4NjgyNywgMHgwMDAxLCAweDAwM2UsIDB4MDAyOCwgMHg2MDAzLCAweDAwMDksIDB4NjMwYSwgMHgyYzMwLAorCTB4MDBiMCwgMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5YzVhLCAweDAxNjgsIDB4NjAxYywgMHhhMDg2LAorCTB4MDAwMywgMHgxMWI4LCAweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgwODBjLAorCTB4NTQwOCwgMHgwODBjLCAweDllMTEsIDB4MDgwYywgMHg5ZTFkLCAweDA4MGMsIDB4ODExZSwgMHgwMDBlLAorCTB4MDgwNCwgMHg2ZjU3LCAweDdlMTYsIDB4N2UxMiwgMHgwMGRlLCAweDAwY2UsIDB4MDA2ZSwgMHgwMDBlLAorCTB4MDAwNSwgMHg2MDFjLCAweGEwODYsIDB4MDAwNiwgMHgxMTE4LCAweDA4MGMsIDB4YjA5OSwgMHgwYzU4LAorCTB4NjAxYywgMHhhMDg2LCAweDAwMDIsIDB4MTEyOCwgMHg2MDA0LCAweGEwODYsIDB4MDA4NSwgMHgwOWQwLAorCTB4MGMxMCwgMHg2MDFjLCAweGEwODYsIDB4MDAwNSwgMHgxOWYwLCAweDYwMDQsIDB4YTA4NiwgMHgwMDg1LAorCTB4MGQ2MCwgMHgwOGM4LCAweDAwMDYsIDB4MDA2NiwgMHgwMGM2LCAweDAwZDYsIDB4NzgxOCwgMHhhMDY1LAorCTB4MDkwNCwgMHg3MDI4LCAweDYwNTQsIDB4MDAwNiwgMHg2MDU3LCAweDAwMDAsIDB4NjA1YiwgMHgwMDAwLAorCTB4NjAwMCwgMHhjMGQ0LCAweGMwZGMsIDB4NjAwMiwgMHgwODBjLCAweDRlZDQsIDB4MDkwNCwgMHg3MDI1LAorCTB4N2UyNCwgMHg4NmZmLCAweDA1ZTgsIDB4YTY4MCwgMHgwMDA0LCAweDIwMDQsIDB4YWQwNiwgMHgxNWMwLAorCTB4MDBkNiwgMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwgMHhhMDA1LCAweDA1NDgsIDB4MDgwYywgMHg2YTEwLAorCTB4MDgwYywgMHg3ZDdhLCAweDY4YzMsIDB4MDAwMCwgMHgwODBjLCAweDgyNGQsIDB4NzgyNywgMHgwMDAwLAorCTB4MDAzNiwgMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHhhMzg0LCAweDEwMDAsIDB4MDEyMCwgMHg2ODAzLAorCTB4MDEwMCwgMHg2ODAzLCAweDAwMDAsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwgMHgwMTEwLAorCTB4NjgyNywgMHgwMDAxLCAweDAwM2UsIDB4MDBkZSwgMHgwMGM2LCAweDYwM2MsIDB4YTAwNSwgMHgwMTEwLAorCTB4ODAwMSwgMHg2MDNlLCAweDI2NjAsIDB4MDgwYywgMHg5ZTFkLCAweDAwY2UsIDB4MDA0OCwgMHgwMGRlLAorCTB4MDBjNiwgMHgyNjYwLCAweDYwMDMsIDB4MDAwOSwgMHg2MzBhLCAweDAwY2UsIDB4MDgwNCwgMHg2ZmQ0LAorCTB4OGRmZiwgMHgwMTM4LCAweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgwODBjLAorCTB4NTQwOCwgMHgwODBjLCAweDgxMWUsIDB4MDgwNCwgMHg2ZmQ0LCAweDAwMGUsIDB4MDgwNCwgMHg2ZmM3LAorCTB4NzgxZSwgMHg3ODFhLCAweDAwZGUsIDB4MDBjZSwgMHgwMDZlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MDBkNiwgMHgwMDY2LCAweDYwMDAsIDB4ZDBkYywgMHgwMWEwLCAweDYwNGMsIDB4YTA2ZCwgMHgwMTg4LAorCTB4Njg0OCwgMHhhNjA2LCAweDExNzAsIDB4MjA3MSwgMHhiN2UwLCAweDcwMjQsIDB4YTAzNSwgMHgwMTQ4LAorCTB4YTA4MCwgMHgwMDA0LCAweDIwMDQsIDB4YWQwNiwgMHgxMTIwLCAweDYwMDAsIDB4YzBkYywgMHg2MDAyLAorCTB4MDAyMSwgMHgwMDZlLCAweDAwZGUsIDB4MDBlZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLAorCTB4NzhjMCwgMHhhMDA1LCAweDExMzgsIDB4MDBjNiwgMHgyNjYwLCAweDYwMDMsIDB4MDAwOSwgMHg2MzBhLAorCTB4MDBjZSwgMHgwNGEwLCAweDA4MGMsIDB4N2Q3YSwgMHg3OGMzLCAweDAwMDAsIDB4MDgwYywgMHg4MjRkLAorCTB4NzAyNywgMHgwMDAwLCAweDAwMzYsIDB4MjA3OSwgMHgwMTQwLCAweDdiMDQsIDB4YTM4NCwgMHgxMDAwLAorCTB4MDEyMCwgMHg3ODAzLCAweDAxMDAsIDB4NzgwMywgMHgwMDAwLCAweDIwNzksIDB4MDEwMCwgMHg3ODI0LAorCTB4ZDA4NCwgMHgwMTEwLCAweDc4MjcsIDB4MDAwMSwgMHgwODBjLCAweDgyNGQsIDB4MDAzZSwgMHgwODBjLAorCTB4NGVkNCwgMHgwMGM2LCAweDYwM2MsIDB4YTAwNSwgMHgwMTEwLCAweDgwMDEsIDB4NjAzZSwgMHgyNjYwLAorCTB4MDgwYywgMHg4NjFkLCAweDAwY2UsIDB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLAorCTB4MDgwYywgMHg5ZWNjLCAweDA4MGMsIDB4NTQwOCwgMHgwODBjLCAweDgxMWUsIDB4MDBmZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgwMGM2LCAweDIwNzEsIDB4YjdlMCwgMHg3MDA0LCAweGEwODQsIDB4MDAwNywgMHgwMDAyLAorCTB4NzBhMiwgMHg3MGE1LCAweDcwYmIsIDB4NzBkNCwgMHg3MTExLCAweDcwYTIsIDB4NzBhMCwgMHg3MGEwLAorCTB4MDgwYywgMHgxNTE1LCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LCAweDcwMjQsIDB4YTA2NSwgMHgwMTQ4LAorCTB4NzAyMCwgMHg4MDAxLCAweDcwMjIsIDB4NjAwYywgMHhhMDE1LCAweDAxNTAsIDB4NzIxNiwgMHg2MDBmLAorCTB4MDAwMCwgMHg3MDA3LCAweDAwMDAsIDB4NzAyNywgMHgwMDAwLCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LAorCTB4NzIxNiwgMHg3MjEyLCAweDBjYjAsIDB4NjAxOCwgMHgyMDYwLCAweDA4MGMsIDB4NGVkNCwgMHg2MDAwLAorCTB4YzBkYywgMHg2MDAyLCAweDcwMjAsIDB4ODAwMSwgMHg3MDIyLCAweDAxMjAsIDB4NjA1NCwgMHhhMDE1LAorCTB4MDE0MCwgMHg3MjFlLCAweDcwMDcsIDB4MDAwMCwgMHg3MDI3LCAweDAwMDAsIDB4MDBjZSwgMHgwMGVlLAorCTB4MDAwNSwgMHg3MjE4LCAweDcyMWUsIDB4MGNiMCwgMHg3MDI0LCAweGEwNjUsIDB4MDViOCwgMHg3MDBjLAorCTB4YWMwNiwgMHgxMTYwLCAweDA4MGMsIDB4ODExZSwgMHg2MDBjLCAweGEwMTUsIDB4MDEyMCwgMHg3MjBlLAorCTB4NjAwZiwgMHgwMDAwLCAweDA0NDgsIDB4NzIwZSwgMHg3MjBhLCAweDA0MzAsIDB4NzAxNCwgMHhhYzA2LAorCTB4MTE2MCwgMHgwODBjLCAweDgxMWUsIDB4NjAwYywgMHhhMDE1LCAweDAxMjAsIDB4NzIxNiwgMHg2MDBmLAorCTB4MDAwMCwgMHgwMGQwLCAweDcyMTYsIDB4NzIxMiwgMHgwMGI4LCAweDYwMWMsIDB4YTA4NiwgMHgwMDAzLAorCTB4MTE5OCwgMHg2MDE4LCAweDIwNjAsIDB4MDgwYywgMHg0ZWQ0LCAweDYwMDAsIDB4YzBkYywgMHg2MDAyLAorCTB4MDgwYywgMHg4MTFlLCAweDcwMWMsIDB4YTA2NSwgMHgwMTM4LCAweDYwNTQsIDB4YTAxNSwgMHgwMTEwLAorCTB4NzIxZSwgMHgwMDEwLCAweDcyMTgsIDB4NzIxZSwgMHg3MDI3LCAweDAwMDAsIDB4MDBjZSwgMHgwMGVlLAorCTB4MDAwNSwgMHg3MDI0LCAweGEwNjUsIDB4MDE0MCwgMHgwODBjLCAweDgxMWUsIDB4NjAwYywgMHhhMDE1LAorCTB4MDE1MCwgMHg3MjBlLCAweDYwMGYsIDB4MDAwMCwgMHgwODBjLCAweDgyNGQsIDB4NzAyNywgMHgwMDAwLAorCTB4MDBjZSwgMHgwMGVlLCAweDAwMDUsIDB4NzIwZSwgMHg3MjBhLCAweDBjYjAsIDB4MDBkNiwgMHgyMDY5LAorCTB4YjdlMCwgMHg2ODMwLCAweGEwODQsIDB4MDAwMywgMHgwMDAyLCAweDcxMzMsIDB4NzEzNSwgMHg3MTU5LAorCTB4NzEzMSwgMHgwODBjLCAweDE1MTUsIDB4MDBkZSwgMHgwMDA1LCAweDAwYzYsIDB4Njg0MCwgMHhhMDg2LAorCTB4MDAwMSwgMHgwMWI4LCAweDY4M2MsIDB4YTA2NSwgMHgwMTMwLCAweDYwMGMsIDB4YTAxNSwgMHgwMTcwLAorCTB4NmEzYSwgMHg2MDBmLCAweDAwMDAsIDB4NjgzMywgMHgwMDAwLCAweDY4M2YsIDB4MDAwMCwgMHgyMDExLAorCTB4YjdmZiwgMHgyMDEzLCAweDAwMDAsIDB4MDBjZSwgMHgwMGRlLCAweDAwMDUsIDB4NjgzYSwgMHg2ODM2LAorCTB4MGM5MCwgMHg2ODQzLCAweDAwMDAsIDB4NjgzOCwgMHhhMDY1LCAweDBkNjgsIDB4NjAwMywgMHgwMDAzLAorCTB4MGM1MCwgMHgwMGM2LCAweDY4NDMsIDB4MDAwMCwgMHg2ODQ3LCAweDAwMDAsIDB4Njg0YiwgMHgwMDAwLAorCTB4NjgzYywgMHhhMDY1LCAweDAxNjgsIDB4NjAwYywgMHhhMDE1LCAweDAxMzAsIDB4NmEzYSwgMHg2MDBmLAorCTB4MDAwMCwgMHg2ODNmLCAweDAwMDAsIDB4MDAyMCwgMHg2ODNmLCAweDAwMDAsIDB4NjgzYSwgMHg2ODM2LAorCTB4MDBjZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBkNiwgMHgyMDY5LCAweGI3ZTAsIDB4NjgwNCwgMHhhMDg0LAorCTB4MDAwNywgMHgwMDAyLCAweDcxODQsIDB4NzIyMCwgMHg3MjIwLCAweDcyMjAsIDB4NzIyMCwgMHg3MjIyLAorCTB4NzE4MiwgMHg3MTgyLCAweDA4MGMsIDB4MTUxNSwgMHg2ODIwLCAweGEwMDUsIDB4MTExMCwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMGM2LCAweDY4MGMsIDB4YTA2NSwgMHgwMTUwLCAweDY4MDcsIDB4MDAwNCwgMHg2ODI2LAorCTB4NjgyYiwgMHgwMDAwLCAweDA4MGMsIDB4NzI3MiwgMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwgMHg2ODE0LAorCTB4YTA2NSwgMHgwMTUwLCAweDY4MDcsIDB4MDAwMSwgMHg2ODI2LCAweDY4MmIsIDB4MDAwMCwgMHgwODBjLAorCTB4NzI3MiwgMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwgMHgwMGU2LCAweDAwMzYsIDB4NmExYywgMHhhMmY1LAorCTB4MDAwMCwgMHgwOTA0LCAweDcyMWMsIDB4NzA0YywgMHhhMDBkLCAweDAxMTgsIDB4NzA4OCwgMHhhMDA1LAorCTB4MDFhMCwgMHg3MDU0LCAweGEwNzUsIDB4MDEyMCwgMHhhMjBlLCAweDA5MDQsIDB4NzIxYywgMHgwMDI4LAorCTB4NjgxOCwgMHhhMjBlLCAweDA5MDQsIDB4NzIxYywgMHgyMDcwLCAweDcwNGMsIDB4YTAwZCwgMHgwZDg4LAorCTB4NzA4OCwgMHhhMDA1LCAweDFkNzAsIDB4MmUwMCwgMHg2ODFlLCAweDczM2MsIDB4NzAzOCwgMHhhMzAyLAorCTB4MWU0MCwgMHgwODBjLCAweDg1ZjQsIDB4MDkwNCwgMHg3MjFjLCAweDgzMTgsIDB4NzMzZSwgMHg2MTEyLAorCTB4MmUxMCwgMHg2MjFhLCAweGExODAsIDB4MDAxNCwgMHgyMDA0LCAweGEwODQsIDB4MDBmZiwgMHg2MDVhLAorCTB4YTE4MCwgMHgwMDE0LCAweDIwMDMsIDB4MDAwMCwgMHhhMTgwLCAweDAwMTUsIDB4MjAwNCwgMHhhMDhhLAorCTB4MTk5YSwgMHgwMjEwLCAweDIwMDEsIDB4MTk5OSwgMHg4MDAzLCAweDgwMWIsIDB4ODMxYiwgMHhhMzE4LAorCTB4NjMxNiwgMHgwMDNlLCAweDAwZjYsIDB4MmM3OCwgMHg3MWEwLCAweDIwMDEsIDB4YjUzNSwgMHgyMDA0LAorCTB4ZDBhYywgMHgxMTEwLCAweGQxYmMsIDB4MDE1MCwgMHg3MTAwLCAweGQxZjQsIDB4MDEyMCwgMHg3MTE0LAorCTB4YTE4YywgMHgwMGZmLCAweDAwNDAsIDB4MjAwOSwgMHgwMDAwLCAweDAwMjgsIDB4YTFlMCwgMHgyZGM0LAorCTB4MmMwZCwgMHhhMThjLCAweDAwZmYsIDB4MjA2MSwgMHgwMTAwLCAweDYxOWEsIDB4MDgwYywgMHg3OGEyLAorCTB4NzMwMCwgMHhjM2RkLCAweDczMDIsIDB4NjgwNywgMHgwMDAyLCAweDJmMTgsIDB4NmIyNiwgMHg2ODJiLAorCTB4MDAwMCwgMHg3ODFmLCAweDAwMDMsIDB4NzgwMywgMHgwMDAxLCAweDc4MDcsIDB4MDA0MCwgMHgwMGZlLAorCTB4MDBlZSwgMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwgMHgwMDNlLCAweDAwZWUsIDB4MDBjZSwgMHgwY2QwLAorCTB4MDBkZSwgMHgwMDA1LCAweDAwYzYsIDB4NjgwYywgMHhhMDY1LCAweDAxMzgsIDB4NjgwNywgMHgwMDA0LAorCTB4NjgyNiwgMHg2ODJiLCAweDAwMDAsIDB4MDgwYywgMHg3MjcyLCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LAorCTB4MDBmNiwgMHgwMGQ2LCAweDIwNjksIDB4YjdlMCwgMHg2ODMwLCAweGEwODYsIDB4MDAwMCwgMHgxMWQwLAorCTB4MjAwMSwgMHhiNTBjLCAweDIwMGMsIDB4ZDFiYywgMHgxNTYwLCAweDY4MzgsIDB4YTA3ZCwgMHgwMTkwLAorCTB4NjgzMywgMHgwMDAxLCAweDY4M2UsIDB4Njg0NywgMHgwMDAwLCAweDY4NGIsIDB4MDAwMCwgMHgwMTI2LAorCTB4MDBmNiwgMHgyMDkxLCAweDI0MDAsIDB4MDAyZSwgMHgwODBjLCAweDIwMjEsIDB4MTEzMCwgMHgwMTJlLAorCTB4MDgwYywgMHg3YmViLCAweDAwZGUsIDB4MDBmZSwgMHgwMDA1LCAweDAxMmUsIDB4ZTAwMCwgMHg2ODQzLAorCTB4MDAwMCwgMHg3ODAzLCAweDAwMDIsIDB4NzgwYywgMHhhMDE1LCAweDAxNDAsIDB4NmEzYSwgMHg3ODBmLAorCTB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4NjgzZiwgMHgwMDAwLCAweDBjNjAsIDB4NjgzYSwgMHg2ODM2LAorCTB4MGNjMCwgMHhjMWJjLCAweDIxMDIsIDB4MDA2NiwgMHgyMDMxLCAweDAwMDEsIDB4MDgwYywgMHg1YjUxLAorCTB4MDA2ZSwgMHgwODU4LCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLCAweDAwMGIsIDB4MDAwNSwgMHg3MjgwLAorCTB4NzI4NSwgMHg3NzQzLCAweDc4NWYsIDB4NzI4NSwgMHg3NzQzLCAweDc4NWYsIDB4NzI4MCwgMHg3Mjg1LAorCTB4MDgwYywgMHg3MDkwLCAweDA4MGMsIDB4NzE3MywgMHgwMDA1LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LAorCTB4MDBjNiwgMHgwMGY2LCAweDYwMDQsIDB4YTA4YSwgMHgwMDgwLCAweDFhMGMsIDB4MTUxNSwgMHg2MTE4LAorCTB4MjE3OCwgMHg3OWEwLCAweDIwMTEsIDB4YjUzNSwgMHgyMjE0LCAweGQyYWMsIDB4MTExMCwgMHhkMWJjLAorCTB4MDE1MCwgMHg3OTAwLCAweGQxZjQsIDB4MDEyMCwgMHg3OTE0LCAweGExOGMsIDB4MDBmZiwgMHgwMDQwLAorCTB4MjAwOSwgMHgwMDAwLCAweDAwMjgsIDB4YTFmOCwgMHgyZGM0LCAweDJmMGQsIDB4YTE4YywgMHgwMGZmLAorCTB4MmM3OCwgMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwgMHhhMDhhLCAweDAwNDAsIDB4MWEwNCwgMHg3MmY5LAorCTB4MDAzMywgMHgwMGZlLCAweDAwY2UsIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsIDB4MDAwNSwgMHg3M2E4LAorCTB4NzNmMywgMHg3NDIwLCAweDc0ZWQsIDB4NzUxYiwgMHg3NTIzLCAweDc1NDksIDB4NzU1YSwgMHg3NTZiLAorCTB4NzU3MywgMHg3NTg5LCAweDc1NzMsIDB4NzVlYSwgMHg3NTVhLCAweDc2MGIsIDB4NzYxMywgMHg3NTZiLAorCTB4NzYxMywgMHg3NjI0LCAweDcyZjcsIDB4NzJmNywgMHg3MmY3LCAweDcyZjcsIDB4NzJmNywgMHg3MmY3LAorCTB4NzJmNywgMHg3MmY3LCAweDcyZjcsIDB4NzJmNywgMHg3MmY3LCAweDdlODUsIDB4N2VhYSwgMHg3ZWJmLAorCTB4N2VlMiwgMHg3ZjAzLCAweDc1NDksIDB4NzJmNywgMHg3NTQ5LCAweDc1NzMsIDB4NzJmNywgMHg3NDIwLAorCTB4NzRlZCwgMHg3MmY3LCAweDgzNGYsIDB4NzU3MywgMHg3MmY3LCAweDgzNmYsIDB4NzU3MywgMHg3MmY3LAorCTB4NzU2YiwgMHg3M2ExLCAweDczMGMsIDB4NzJmNywgMHg4Mzk0LCAweDg0MDksIDB4ODRlMCwgMHg3MmY3LAorCTB4ODRmMSwgMHg3NTQ0LCAweDg1MGQsIDB4NzJmNywgMHg3ZjE4LCAweDg1NjgsIDB4NzJmNywgMHgwODBjLAorCTB4MTUxNSwgMHgyMTAwLCAweDAwMzMsIDB4MDBmZSwgMHgwMGNlLCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLAorCTB4MDAwNSwgMHg3MzBhLCAweDczMGEsIDB4NzMwYSwgMHg3MzQwLCAweDczNWUsIDB4NzM3NCwgMHg3MzBhLAorCTB4NzMwYSwgMHg3MzBhLCAweDA4MGMsIDB4MTUxNSwgMHgwMGQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLAorCTB4NzY0MSwgMHg3ODEwLCAweDIwNjgsIDB4MjBhMywgMHgyNDE0LCAweDIwYTMsIDB4MDAxOCwgMHgyMGEzLAorCTB4MDgwMCwgMHg2ODNjLCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4Njg1MCwgMHgyMGEyLCAweDY4NTQsIDB4MjBhMiwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE4LCAweDA4MGMsIDB4N2Q2NywgMHgwMGRlLAorCTB4MDAwNSwgMHgwMGQ2LCAweDc4MTgsIDB4MjA2OCwgMHg2OGEwLCAweDIwNjksIDB4YjUwMCwgMHg2YWQ0LAorCTB4ZDJhYywgMHgxMTEwLCAweGQwYmMsIDB4MDExMCwgMHhhMDg1LCAweDAwMDEsIDB4MDBkZSwgMHgwMDA1LAorCTB4MDBkNiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NjQxLCAweDIwYTMsIDB4MDUwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHg3ODEwLCAweGEwZTgsIDB4MDAwZiwgMHg2ODA4LCAweDIwYTIsIDB4NjgwYywgMHgyMGEyLAorCTB4NjgxMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHg2ODE4LCAweDIwYTIsIDB4NjgxYywgMHgyMGEyLAorCTB4NjBjMywgMHgwMDEwLCAweDA4MGMsIDB4N2Q2NywgMHgwMGRlLCAweDAwMDUsIDB4MDE1NiwgMHgwMTQ2LAorCTB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzY0MSwgMHgyMGEzLCAweDc4MDAsIDB4MjBhMywgMHgwMDAwLAorCTB4NzgwOCwgMHg4MDA3LCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAwOCwgMHgwODBjLAorCTB4N2Q2NywgMHgwMTRlLCAweDAxNWUsIDB4MDAwNSwgMHgwMTU2LCAweDAxNDYsIDB4MjBhMSwgMHgwMjBiLAorCTB4MDgwYywgMHg3NmRkLCAweDIwYTMsIDB4MDIwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHhkZjEwLAorCTB4MjBhMywgMHgwMDM0LCAweDIwOTksIDB4YjUwNSwgMHgyMGE5LCAweDAwMDQsIDB4NTNhNiwgMHgyMDk5LAorCTB4YjUwMSwgMHgyMGE5LCAweDAwMDQsIDB4NTNhNiwgMHgyMDk5LCAweGI3YzYsIDB4MjBhOSwgMHgwMDFhLAorCTB4MzMwNCwgMHg4MDA3LCAweDIwYTIsIDB4OTM5OCwgMHgxZjA0LCAweDczOTAsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDA0YywgMHgwODBjLCAweDdkNjcsIDB4MDE0ZSwgMHgwMTVlLAorCTB4MDAwNSwgMHgyMDAxLCAweGI1MTUsIDB4MjAwNCwgMHg2MDlhLCAweDA4MGMsIDB4N2Q2NywgMHgwMDA1LAorCTB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzY0MSwgMHgyMGEzLCAweDUyMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4MDBkNiwgMHgyMDY5LCAweGI1NTIsIDB4NjgwNCwgMHhkMDg0LCAweDAxNTAsIDB4NjgyOCwgMHgyMGEzLAorCTB4MDAwMCwgMHgwMDE2LCAweDA4MGMsIDB4MjgzMSwgMHgyMWEyLCAweDAwMWUsIDB4MDBkZSwgMHgwMDI4LAorCTB4MDBkZSwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LAorCTB4YjUwNSwgMHg1M2E2LCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LCAweGI1MDEsIDB4NTNhNiwgMHgyMDAxLAorCTB4YjUzNSwgMHgyMDA0LCAweGQwYWMsIDB4MTEzOCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LAorCTB4YTA4MiwgMHgwMDdmLCAweDAyMzgsIDB4MjAwMSwgMHhiNTFjLCAweDIwYTYsIDB4MjAwMSwgMHhiNTFkLAorCTB4MjBhNiwgMHgwMDQwLCAweDIwYTMsIDB4MDAwMCwgMHgyMDAxLCAweGI1MTUsIDB4MjAwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDFjLAorCTB4MDgwYywgMHg3ZDY3LCAweDAwMDUsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzY0MSwgMHgyMGEzLAorCTB4MDUwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjAwMSwgMHhiNTM1LCAweDIwMDQsIDB4ZDBhYywgMHgxMTM4LAorCTB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMDgyLCAweDAwN2YsIDB4MDIzOCwgMHgyMDAxLAorCTB4YjUxYywgMHgyMGE2LCAweDIwMDEsIDB4YjUxZCwgMHgyMGE2LCAweDAwNDAsIDB4MjBhMywgMHgwMDAwLAorCTB4MjAwMSwgMHhiNTE1LCAweDIwMDQsIDB4YTA4NCwgMHgwMGZmLCAweDIwYTIsIDB4MjBhOSwgMHgwMDA0LAorCTB4MjA5OSwgMHhiNTA1LCAweDUzYTYsIDB4NjBjMywgMHgwMDEwLCAweDA4MGMsIDB4N2Q2NywgMHgwMDA1LAorCTB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzY0MSwgMHgwMGM2LCAweDc4MTgsIDB4MjA2MCwgMHgyMDAxLAorCTB4MDAwMCwgMHgwODBjLCAweDUzMTMsIDB4MDBjZSwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LAorCTB4YTA4NiwgMHgwMDdlLCAweDExMzAsIDB4MjBhMywgMHgwNDAwLCAweDYyMGMsIDB4YzJiNCwgMHg2MjBlLAorCTB4MDAxMCwgMHgyMGEzLCAweDAzMDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LAorCTB4MjAwNCwgMHhhMDg2LCAweDAwN2UsIDB4MTkwNCwgMHg3NGFmLCAweDIwMDEsIDB4YjUzNSwgMHgyMDA0LAorCTB4ZDBhNCwgMHgwMWM4LCAweDIwOTksIDB4Yjc4ZSwgMHgzM2E2LCAweDkzOTgsIDB4MjBhMywgMHgwMDAwLAorCTB4OTM5OCwgMHgzMzA0LCAweGEwODQsIDB4MjAwMCwgMHgyMGEyLCAweDkzOTgsIDB4MzNhNiwgMHg5Mzk4LAorCTB4MjBhMywgMHgwMDAwLCAweDkzOTgsIDB4MjAwMSwgMHgyNzEwLCAweDIwYTIsIDB4OTM5OCwgMHgzM2E2LAorCTB4OTM5OCwgMHgzM2E2LCAweDAwZDAsIDB4MjA5OSwgMHhiNzhlLCAweDMzYTYsIDB4OTM5OCwgMHgzM2E2LAorCTB4OTM5OCwgMHgzMzA0LCAweDA4MGMsIDB4NWFjZiwgMHgxMTE4LCAweGEwODQsIDB4MzdmZiwgMHgwMDEwLAorCTB4YTA4NCwgMHgzZmZmLCAweDIwYTIsIDB4OTM5OCwgMHgzM2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LAorCTB4YjUwNSwgMHg1M2E2LCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LCAweGI1MDEsIDB4NTNhNiwgMHgyMGE5LAorCTB4MDAwOCwgMHgyMGEzLCAweDAwMDAsIDB4MWYwNCwgMHg3NDg5LCAweDIwYTksIDB4MDAwOCwgMHgyMGEzLAorCTB4MDAwMCwgMHgxZjA0LCAweDc0OGYsIDB4MjA5OSwgMHhiNzk2LCAweDMzMDQsIDB4YzBkZCwgMHgyMGEyLAorCTB4MjAwMSwgMHhiNTcyLCAweDIwMDQsIDB4ZDBlNCwgMHgwMTU4LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHg5Mzk4LCAweDkzOTgsIDB4OTM5OCwgMHgzM2E2LCAweDIwYTksIDB4MDAwNCwgMHgwMDEwLAorCTB4MjBhOSwgMHgwMDA3LCAweDIwYTMsIDB4MDAwMCwgMHgxZjA0LCAweDc0YWEsIDB4MDQ2OCwgMHgyMDAxLAorCTB4YjUzNSwgMHgyMDA0LCAweGQwYTQsIDB4MDE0MCwgMHgyMDAxLCAweGI3OGYsIDB4MjAwNCwgMHg2MGUzLAorCTB4MDAwMCwgMHgwODBjLCAweDI4NzIsIDB4NjBlMiwgMHgyMDk5LCAweGI3OGUsIDB4MjBhOSwgMHgwMDA4LAorCTB4NTNhNiwgMHgyMGE5LCAweDAwMDQsIDB4MjA5OSwgMHhiNTA1LCAweDUzYTYsIDB4MjBhOSwgMHgwMDA0LAorCTB4MjA5OSwgMHhiNTAxLCAweDUzYTYsIDB4MjBhOSwgMHgwMDA4LCAweDIwYTMsIDB4MDAwMCwgMHgxZjA0LAorCTB4NzRjZCwgMHgyMGE5LCAweDAwMDgsIDB4MjBhMywgMHgwMDAwLCAweDFmMDQsIDB4NzRkMywgMHgyMDk5LAorCTB4Yjc5NiwgMHgyMGE5LCAweDAwMDgsIDB4NTNhNiwgMHgyMGE5LCAweDAwMDgsIDB4MjBhMywgMHgwMDAwLAorCTB4MWYwNCwgMHg3NGRlLCAweDIwYTksIDB4MDAwYSwgMHgyMGEzLCAweDAwMDAsIDB4MWYwNCwgMHg3NGU0LAorCTB4NjBjMywgMHgwMDc0LCAweDA4MGMsIDB4N2Q2NywgMHgwMDA1LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLAorCTB4NzY0MSwgMHgyMGEzLCAweDIwMTAsIDB4MjBhMywgMHgwMDE0LCAweDIwYTMsIDB4MDgwMCwgMHgyMGEzLAorCTB4MjAwMCwgMHhhMDA2LCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgwMGY2LAorCTB4MjA3OSwgMHhiNTUyLCAweDc5MDQsIDB4MDBmZSwgMHhkMWFjLCAweDExMTAsIDB4YTA4NSwgMHgwMDIwLAorCTB4ZDFhNCwgMHgwMTEwLCAweGEwODUsIDB4MDAxMCwgMHhhMDg1LCAweDAwMDIsIDB4MDBkNiwgMHgwODA0LAorCTB4NzVjYywgMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LAorCTB4MDgwYywgMHg3ZDY3LCAweDAwMDUsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzY0MSwgMHgyMGEzLAorCTB4NTAwMCwgMHgwODA0LCAweDc0M2IsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzY0MSwgMHgyMGEzLAorCTB4MjExMCwgMHgyMGEzLCAweDAwMTQsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLAorCTB4MDAxNCwgMHgwODBjLCAweDdkNjcsIDB4MDAwNSwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NmQ1LAorCTB4MDAyMCwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NmRkLCAweDIwYTMsIDB4MDIwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAwNCwgMHgwODBjLAorCTB4N2Q2NywgMHgwMDA1LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDc2ZGQsIDB4MjBhMywgMHgwMTAwLAorCTB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMywgMHgyMGEzLCAweDJhMDAsIDB4NjBjMywgMHgwMDA4LAorCTB4MDgwYywgMHg3ZDY3LCAweDAwMDUsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzZkZCwgMHgyMGEzLAorCTB4MDIwMCwgMHgwODA0LCAweDc0M2IsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzZkZCwgMHgyMGEzLAorCTB4MDEwMCwgMHgyMGEzLCAweDAwMDAsIDB4NzgyOCwgMHhhMDA1LCAweDAxMTAsIDB4MjBhMiwgMHgwMDEwLAorCTB4MjBhMywgMHgwMDAzLCAweDc4MTAsIDB4MjBhMiwgMHg2MGMzLCAweDAwMDgsIDB4MDgwYywgMHg3ZDY3LAorCTB4MDAwNSwgMHgwMGQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDc2ZGQsIDB4MjBhMywgMHgwMjEwLAorCTB4MjBhMywgMHgwMDE0LCAweDIwYTMsIDB4MDgwMCwgMHg3ODE4LCAweDIwNjgsIDB4Njg5NCwgMHhhMDg2LAorCTB4MDAxNCwgMHgxMTk4LCAweDY5OWMsIDB4YTE4NCwgMHgwMDMwLCAweDAxOTAsIDB4Njk5OCwgMHhhMTg0LAorCTB4YzAwMCwgMHgxMTQwLCAweGQxZWMsIDB4MDExOCwgMHgyMGEzLCAweDIxMDAsIDB4MDA1OCwgMHgyMGEzLAorCTB4MDEwMCwgMHgwMDQwLCAweDIwYTMsIDB4MDQwMCwgMHgwMDI4LCAweDIwYTMsIDB4MDcwMCwgMHgwMDEwLAorCTB4NzAwZiwgMHgwODAwLCAweGEwMDYsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLAorCTB4MDBmNiwgMHgyMDc5LCAweGI1NTIsIDB4NzkwNCwgMHgwMGZlLCAweGQxYWMsIDB4MTExMCwgMHhhMDg1LAorCTB4MDAyMCwgMHhkMWE0LCAweDAxMTAsIDB4YTA4NSwgMHgwMDEwLCAweDIwMDksIDB4YjU3NCwgMHgyMTBjLAorCTB4ZDE4NCwgMHgxMTEwLCAweGEwODUsIDB4MDAwMiwgMHgwMDI2LCAweDIwMDksIDB4YjU3MiwgMHgyMTBjLAorCTB4ZDFlNCwgMHgwMTMwLCAweGMwYzUsIDB4YTA5NCwgMHgwMDMwLCAweGEyOTYsIDB4MDAxMCwgMHgwMTQwLAorCTB4ZDFlYywgMHgwMTMwLCAweGEwOTQsIDB4MDAzMCwgMHhhMjk2LCAweDAwMTAsIDB4MDEwOCwgMHhjMGJkLAorCTB4MDAyZSwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg3ZDY3LAorCTB4MDBkZSwgMHgwMDA1LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDc2ZGQsIDB4MjBhMywgMHgwMjEwLAorCTB4MjBhMywgMHgwMDE0LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LAorCTB4MDgwYywgMHg3ZDY3LCAweDAwMDUsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzZkZCwgMHgyMGEzLAorCTB4MDIwMCwgMHgwODA0LCAweDczYWUsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzZkZCwgMHgyMGEzLAorCTB4MDEwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAzLCAweDIwYTMsIDB4MmEwMCwgMHg2MGMzLAorCTB4MDAwOCwgMHgwODBjLCAweDdkNjcsIDB4MDAwNSwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLAorCTB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzZkZCwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDBiLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMDgsIDB4MDgwYywgMHg3ZDY3LAorCTB4MDAwNSwgMHgwMDI2LCAweDAwMzYsIDB4MDA0NiwgMHgyMDE5LCAweDMyMDAsIDB4MjAyMSwgMHgwODAwLAorCTB4MDAzOCwgMHgwMDI2LCAweDAwMzYsIDB4MDA0NiwgMHgyMDE5LCAweDIyMDAsIDB4MjAyMSwgMHgwMTAwLAorCTB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDE0LAorCTB4YTI4NiwgMHgwMDdlLCAweDExYTAsIDB4YTM4NSwgMHgwMGZmLCAweDIwYTIsIDB4MjBhMywgMHhmZmZlLAorCTB4MjBhMywgMHgwMDAwLCAweDIwMTEsIDB4YjUxNSwgMHgyMjE0LCAweDIwMDEsIDB4Yjc5ZSwgMHgyMDA0LAorCTB4YTAwNSwgMHgwMTE4LCAweDIwMTEsIDB4YjUxZCwgMHgyMjE0LCAweDIyYTIsIDB4MDRkMCwgMHhhMjg2LAorCTB4MDA3ZiwgMHgxMTM4LCAweDAwZDYsIDB4YTM4NSwgMHgwMGZmLCAweDIwYTIsIDB4MjBhMywgMHhmZmZkLAorCTB4MDBjOCwgMHgyMDAxLCAweGI1MzUsIDB4MjAwNCwgMHhkMGFjLCAweDExMTAsIDB4ZDJiYywgMHgwMWM4LAorCTB4YTI4NiwgMHgwMDgwLCAweDAwZDYsIDB4MTEzMCwgMHhhMzg1LCAweDAwZmYsIDB4MjBhMiwgMHgyMGEzLAorCTB4ZmZmYywgMHgwMDQwLCAweGEyZTgsIDB4YjYzNSwgMHgyZDZjLCAweDY4MTAsIDB4YTMwNSwgMHgyMGEyLAorCTB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YjUxYywgMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwMGRlLAorCTB4MDA4MCwgMHgwMGQ2LCAweGEyZTgsIDB4YjYzNSwgMHgyZDZjLCAweDY4MTAsIDB4YTMwNSwgMHgyMGEyLAorCTB4NjgxNCwgMHgyMGEyLCAweDAwZGUsIDB4MjBhMywgMHgwMDAwLCAweDIwMTEsIDB4YjUxNSwgMHgyMjE0LAorCTB4MjJhMiwgMHhhNDg1LCAweDAwMjksIDB4MjBhMiwgMHgwMDRlLCAweDAwM2UsIDB4MjBhMywgMHgwMDAwLAorCTB4MDgwYywgMHg3ZDU2LCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLCAweDJmYTIsIDB4MjBhMywgMHhmZmZmLAorCTB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgwMDJlLCAweDAwMDUsIDB4MDAyNiwgMHgyMGUxLAorCTB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4MjBhMywgMHgwMmZmLCAweDIwMTEsIDB4ZmZmYywgMHgyMmEyLAorCTB4MDBkNiwgMHgyMDY5LCAweGI1MWMsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MDBkZSwgMHgyMGEzLAorCTB4MjAyOSwgMHgyMGEzLCAweDAwMDAsIDB4MDhlMCwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHhmYzAyLCAweDIwYTMsIDB4MDAwMCwgMHgwMDA1LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LAorCTB4MjAxOSwgMHgzMzAwLCAweDIwMjEsIDB4MDgwMCwgMHgwMDM4LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LAorCTB4MjAxOSwgMHgyMzAwLCAweDIwMjEsIDB4MDEwMCwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLAorCTB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHgyMDExLCAweGI1MzUsIDB4MjIxNCwgMHhkMmFjLAorCTB4MTExOCwgMHhhMDkyLCAweDAwN2UsIDB4MDJkOCwgMHgwMGQ2LCAweGEwZTgsIDB4YjYzNSwgMHgyZDZjLAorCTB4NjgxMCwgMHhhMzA1LCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDY4MTAsIDB4YTAwNSwgMHgxMTQwLAorCTB4NjgxNCwgMHhhMDA1LCAweDExMjgsIDB4MjBhMywgMHgwMGZmLCAweDIwYTMsIDB4ZmZmZSwgMHgwMDI4LAorCTB4MjA2OSwgMHhiNTFjLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDAwZGUsIDB4MDA4MCwgMHgwMGQ2LAorCTB4YTBlOCwgMHhiNjM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMzA1LCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLAorCTB4MDBkZSwgMHgyMGEzLCAweDAwMDAsIDB4MjAxMSwgMHhiNTE1LCAweDIyMTQsIDB4MjJhMiwgMHhhNDg1LAorCTB4MDA5OCwgMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwgMHgwMDRlLCAweDAwM2UsIDB4MDgwYywgMHg3ZDU2LAorCTB4MjJhMiwgMHgyMGEzLCAweDAwMDAsIDB4N2EwOCwgMHgyMmEyLCAweDJmYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAwLCAweDAwMmUsIDB4MDAwNSwgMHgwODBjLCAweDdkNTYsIDB4MjJhMiwgMHgyMGEzLAorCTB4MDAwMCwgMHg3YTA4LCAweDIyYTIsIDB4NzgxMCwgMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgwMDJlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGY2LCAweDYwMDQsIDB4YTA4YSwgMHgwMDg1LAorCTB4MGEwYywgMHgxNTE1LCAweGEwOGEsIDB4MDA4YywgMHgxYTBjLCAweDE1MTUsIDB4NjExOCwgMHgyMTc4LAorCTB4NzlhMCwgMHgyMDExLCAweGI1MzUsIDB4MjIxNCwgMHhkMmFjLCAweDExMTAsIDB4ZDFiYywgMHgwMTUwLAorCTB4NzkwMCwgMHhkMWY0LCAweDAxMjAsIDB4NzkxNCwgMHhhMThjLCAweDAwZmYsIDB4MDA0MCwgMHgyMDA5LAorCTB4MDAwMCwgMHgwMDI4LCAweGExZjgsIDB4MmRjNCwgMHgyZjBkLCAweGExOGMsIDB4MDBmZiwgMHgyYzc4LAorCTB4MjA2MSwgMHgwMTAwLCAweDYxOWEsIDB4YTA4MiwgMHgwMDg1LCAweDAwMWIsIDB4MDBmZSwgMHgwMGNlLAorCTB4MDAwNSwgMHg3NzdhLCAweDc3ODQsIDB4Nzc5ZiwgMHg3Nzc4LCAweDc3NzgsIDB4Nzc3OCwgMHg3NzdhLAorCTB4MDgwYywgMHgxNTE1LCAweDAxNDYsIDB4MjBhMSwgMHgwMjBiLCAweDA0YTEsIDB4NjBjMywgMHgwMDAwLAorCTB4MDgwYywgMHg3ZDY3LCAweDAxNGUsIDB4MDAwNSwgMHgwMTQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLAorCTB4NzdlYiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MDgsIDB4MjBhMiwgMHg3ODEwLAorCTB4MjBhMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHhmZmZmLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHg2MGMzLCAweDAwMGMsIDB4MDgwYywgMHg3ZDY3LCAweDAxNGUsIDB4MDAwNSwgMHgwMTQ2LAorCTB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzgyNSwgMHgyMGEzLCAweDAwMDMsIDB4MjBhMywgMHgwMzAwLAorCTB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMDQsIDB4MDgwYywgMHg3ZDY3LAorCTB4MDE0ZSwgMHgwMDA1LCAweDAwMjYsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LAorCTB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4MjAxMSwgMHhiNTM1LCAweDIyMTQsIDB4ZDJhYywgMHgxMTE4LAorCTB4YTA5MiwgMHgwMDdlLCAweDAyODgsIDB4MDBkNiwgMHhhMGU4LCAweGI2MzUsIDB4MmQ2YywgMHg2ODEwLAorCTB4YTA4NSwgMHg4MTAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YjUxYywgMHgyZGE2LAorCTB4OGQ2OCwgMHgyZGE2LCAweDAwZGUsIDB4MDA4OCwgMHgwMGQ2LCAweGEwZTgsIDB4YjYzNSwgMHgyZDZjLAorCTB4NjgxMCwgMHhhMDg1LCAweDgxMDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MDBkZSwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMDExLCAweGI1MTUsIDB4MjIxNCwgMHgyMmEyLCAweDIwYTMsIDB4MDAwOSwgMHgyMGEzLAorCTB4MDAwMCwgMHgwODA0LCAweDc2YTgsIDB4MDAyNiwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLAorCTB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHgyMDExLCAweGI1MzUsIDB4MjIxNCwgMHhkMmFjLAorCTB4MTExOCwgMHhhMDkyLCAweDAwN2UsIDB4MDI4OCwgMHgwMGQ2LCAweGEwZTgsIDB4YjYzNSwgMHgyZDZjLAorCTB4NjgxMCwgMHhhMDg1LCAweDg0MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MjA2OSwgMHhiNTFjLAorCTB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MDBkZSwgMHgwMDg4LCAweDAwZDYsIDB4YTBlOCwgMHhiNjM1LAorCTB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4ODQwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgwMGRlLAorCTB4MjBhMywgMHgwMDAwLCAweDIwMTEsIDB4YjUxNSwgMHgyMjE0LCAweDIyYTIsIDB4MjAwMSwgMHgwMDk5LAorCTB4MjBhMiwgMHgyMGEzLCAweDAwMDAsIDB4MDgwNCwgMHg3NzM0LCAweDAwMjYsIDB4MjBlMSwgMHg5MDgwLAorCTB4MjBlMSwgMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4MjAxMSwgMHhiNTM1LAorCTB4MjIxNCwgMHhkMmFjLCAweDExMTgsIDB4YTA5MiwgMHgwMDdlLCAweDAyODgsIDB4MDBkNiwgMHhhMGU4LAorCTB4YjYzNSwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHg4NTAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLAorCTB4MjA2OSwgMHhiNTFjLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDAwZGUsIDB4MDA4OCwgMHgwMGQ2LAorCTB4YTBlOCwgMHhiNjM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDg1MDAsIDB4MjBhMiwgMHg2ODE0LAorCTB4MjBhMiwgMHgwMGRlLCAweDIwYTMsIDB4MDAwMCwgMHgyMDExLCAweGI1MTUsIDB4MjIxNCwgMHgyMmEyLAorCTB4MjAwMSwgMHgwMDk5LCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDA4MDQsIDB4NzczNCwgMHgwMGM2LAorCTB4MDBmNiwgMHgyYzc4LCAweDc4MDQsIDB4YTA4YSwgMHgwMDQwLCAweDBhMGMsIDB4MTUxNSwgMHhhMDhhLAorCTB4MDA1MywgMHgxYTBjLCAweDE1MTUsIDB4NzkxOCwgMHgyMTYwLCAweDYxYTAsIDB4MjAxMSwgMHhiNTM1LAorCTB4MjIxNCwgMHhkMmFjLCAweDExMTAsIDB4ZDFiYywgMHgwMTUwLCAweDYxMDAsIDB4ZDFmNCwgMHgwMTIwLAorCTB4NjExNCwgMHhhMThjLCAweDAwZmYsIDB4MDA0MCwgMHgyMDA5LCAweDAwMDAsIDB4MDAyOCwgMHhhMWUwLAorCTB4MmRjNCwgMHgyYzBkLCAweGExOGMsIDB4MDBmZiwgMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwgMHhhMDgyLAorCTB4MDA0MCwgMHgwMDFiLCAweDAwZmUsIDB4MDBjZSwgMHgwMDA1LCAweDc4YTIsIDB4NzlhZSwgMHg3OTRiLAorCTB4N2I2MCwgMHg3OGEwLCAweDc4YTAsIDB4NzhhMCwgMHg3OGEwLCAweDc4YTAsIDB4NzhhMCwgMHg3OGEwLAorCTB4ODBkNywgMHg4MGU3LCAweDgwZjcsIDB4ODEwNywgMHg3OGEwLCAweDg1MWUsIDB4NzhhMCwgMHg4MGM2LAorCTB4MDgwYywgMHgxNTE1LCAweDAwZDYsIDB4MDE1NiwgMHgwMTQ2LCAweDc4MGIsIDB4ZmZmZiwgMHgyMGExLAorCTB4MDIwYiwgMHgwODBjLCAweDc5MDIsIDB4NzkxMCwgMHgyMTY4LCAweDY5NDgsIDB4Nzk1MiwgMHgyMWEyLAorCTB4YTAxNiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHg2OTRjLCAweGExODQsIDB4MDAwZiwgMHgxMTE4LAorCTB4MjAwMSwgMHgwMDA1LCAweDAwNDAsIDB4ZDE4NCwgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDE4LAorCTB4YTA4NCwgMHgwMDA2LCAweDgwMDQsIDB4MDAxNiwgMHgyMDA4LCAweDc4NTgsIDB4YTA4NCwgMHgwMGZmLAorCTB4ODAwNywgMHhhMTA1LCAweDAwMWUsIDB4MjBhMiwgMHhkMWFjLCAweDAxMTgsIDB4MjBhMywgMHgwMDAyLAorCTB4MDA0OCwgMHhkMWI0LCAweDAxMTgsIDB4MjBhMywgMHgwMDAxLCAweDAwMjAsIDB4MjBhMywgMHgwMDAwLAorCTB4MjIzMCwgMHgwMDEwLCAweDZhODAsIDB4NmU3YywgMHgyMGE5LCAweDAwMDgsIDB4MDEzNiwgMHhhZDg4LAorCTB4MDAxNywgMHgyMTk4LCAweDIwYTEsIDB4MDIxYiwgMHg1M2E2LCAweDAxM2UsIDB4MjBhMSwgMHgwMjBiLAorCTB4MjJhMiwgMHgyNmEyLCAweDYwYzMsIDB4MDAyMCwgMHgyMGUxLCAweDkwODAsIDB4NjAxNCwgMHhhMDg0LAorCTB4MDAwNCwgMHhhMDg1LCAweDAwMDksIDB4NjAxNiwgMHgyMDAxLCAweGI3ZmMsIDB4MjAwMywgMHgwN2QwLAorCTB4MjAwMSwgMHhiN2ZiLCAweDIwMDMsIDB4MDAwOSwgMHgwODBjLCAweDE3ZTIsIDB4MDE0ZSwgMHgwMTVlLAorCTB4MDBkZSwgMHgwMDA1LCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4N2ExOCwgMHhhMjgwLAorCTB4MDAyMywgMHgyMDE0LCAweDgyMTAsIDB4YTI5NCwgMHgwMGZmLCAweDIyMDIsIDB4ODIxNywgMHg3ODE4LAorCTB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4MjAxOSwgMHhiNTM1LCAweDIzMWMsIDB4ZDNhYywgMHgxMTEwLAorCTB4ZDBiYywgMHgwMTg4LCAweDAwZDYsIDB4YTBlOCwgMHhiNjM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LAorCTB4MDYwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGI1MWMsIDB4MmRhNiwgMHg4ZDY4LAorCTB4MmRhNiwgMHgwMGRlLCAweDAwODgsIDB4MDBkNiwgMHhhMGU4LCAweGI2MzUsIDB4MmQ2YywgMHg2ODEwLAorCTB4YTA4NSwgMHgwNjAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDAwZGUsIDB4MjBhMywgMHgwMDAwLAorCTB4MjAwOSwgMHhiNTE1LCAweDIxMGMsIDB4MjFhMiwgMHgyMGEzLCAweDA4MjksIDB4MjBhMywgMHgwMDAwLAorCTB4MjJhMiwgMHgyMGEzLCAweDAwMDAsIDB4MmZhMiwgMHgyMGEzLCAweGZmZmYsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAwLCAweDAwMDUsIDB4MDBkNiwgMHgwMTU2LCAweDAxMzYsIDB4MDE0NiwgMHgyMGExLAorCTB4MDIwYiwgMHgwMGMxLCAweDc4MTAsIDB4MjA2OCwgMHg2ODYwLCAweDIwYTIsIDB4Njg1YywgMHgyMGEyLAorCTB4Njg4MCwgMHgyMGEyLCAweDY4N2MsIDB4MjBhMiwgMHhhMDA2LCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLAorCTB4MjBhMiwgMHg2MGMzLCAweDAwMGMsIDB4MDgwYywgMHg3ZDY3LCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLAorCTB4MDBkZSwgMHgwMDA1LCAweDAwMjYsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LAorCTB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4MjAxMSwgMHhiNTM1LCAweDIyMTQsIDB4ZDJhYywgMHgxMTEwLAorCTB4ZDBiYywgMHgwMTg4LCAweDAwZDYsIDB4YTBlOCwgMHhiNjM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LAorCTB4MDUwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGI1MWMsIDB4MmRhNiwgMHg4ZDY4LAorCTB4MmRhNiwgMHgwMGRlLCAweDAwODgsIDB4MDBkNiwgMHhhMGU4LCAweGI2MzUsIDB4MmQ2YywgMHg2ODEwLAorCTB4YTA4NSwgMHgwNTAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDAwZGUsIDB4MjBhMywgMHgwMDAwLAorCTB4MjAxMSwgMHhiNTE1LCAweDIyMTQsIDB4MjJhMiwgMHgyMGEzLCAweDA4ODksIDB4MjBhMywgMHgwMDAwLAorCTB4MDgwYywgMHg3ZDU2LCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLCAweDdhMDgsIDB4MjJhMiwgMHgyZmEyLAorCTB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgwMDJlLCAweDAwMDUsIDB4MDBkNiwgMHgwMTU2LAorCTB4MDEzNiwgMHgwMTQ2LCAweDc4MTAsIDB4YTBlYywgMHhmMDAwLCAweDAxNjgsIDB4YTA2ZCwgMHgwODBjLAorCTB4NTMwMSwgMHgwMTQ4LCAweDY4NGMsIDB4YTA4NCwgMHgyMDIwLCAweGEwODYsIDB4MjAyMCwgMHgxMTE4LAorCTB4NzgyMCwgMHhjMGNkLCAweDc4MjIsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4N2IxNiwgMHhhMDE2LAorCTB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDc4MTAsIDB4YTA4NCwgMHhmMDAwLAorCTB4MTEzMCwgMHg3ODEwLCAweGEwODQsIDB4MDcwMCwgMHg4MDA3LCAweDAwNDMsIDB4MDAxMCwgMHhhMDA2LAorCTB4MDAyYiwgMHgwMTRlLCAweDAxM2UsIDB4MDE1ZSwgMHgwMGRlLCAweDAwMDUsIDB4NzllOCwgMHg3YTdkLAorCTB4N2E4ZCwgMHg3YWJmLCAweDdhZDIsIDB4N2FlZCwgMHg3YWY2LCAweDc5ZTYsIDB4MDgwYywgMHgxNTE1LAorCTB4MDAxNiwgMHgwMDM2LCAweDY5NGMsIDB4YTE4YywgMHgwMDAzLCAweDAxMTgsIDB4YTE4NiwgMHgwMDAzLAorCTB4MTE3MCwgMHg2Yjc4LCAweDc4MjAsIDB4ZDBjYywgMHgwMTA4LCAweGMzZTUsIDB4MjNhMiwgMHg2ODY4LAorCTB4MjBhMiwgMHg2ODY0LCAweDIwYTIsIDB4MDAzZSwgMHgwMDFlLCAweDA4MDQsIDB4N2FjOSwgMHhhMTg2LAorCTB4MDAwMSwgMHgxOTBjLCAweDE1MTUsIDB4NmI3OCwgMHg3ODIwLCAweGQwY2MsIDB4MDEwOCwgMHhjM2U1LAorCTB4MjNhMiwgMHg2ODY4LCAweDIwYTIsIDB4Njg2NCwgMHgyMGEyLCAweDIyYTIsIDB4Njg3NCwgMHgyMGEyLAorCTB4MjJhMiwgMHg2ODdjLCAweDIwYTIsIDB4MjAwOSwgMHgwMDE4LCAweGEzODQsIDB4MDMwMCwgMHgwOTA0LAorCTB4N2E3NywgMHhkM2M0LCAweDAxMTAsIDB4Njg3YywgMHhhMTA4LCAweGQzY2MsIDB4MDExMCwgMHg2ODc0LAorCTB4YTEwOCwgMHgwMTU2LCAweDIwYTksIDB4MDAwZCwgMHhhZDgwLCAweDAwMjAsIDB4MjAxYywgMHg4MzFmLAorCTB4MjNhMiwgMHg4MDAwLCAweDFmMDQsIDB4N2EyNiwgMHgwMTVlLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLAorCTB4YTE4NCwgMHgwMDAzLCAweDA5MDQsIDB4N2E3NywgMHgyMGExLCAweDAyMGIsIDB4MjBlMSwgMHg5MDgwLAorCTB4MjBlMSwgMHg0MDAwLCAweDAwMDYsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHgyMDExLAorCTB4YjUzNSwgMHgyMjE0LCAweGQyYWMsIDB4MTExMCwgMHhkMGJjLCAweDAxODgsIDB4MDBkNiwgMHhhMGU4LAorCTB4YjYzNSwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwNzAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLAorCTB4MjA2OSwgMHhiNTFjLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDAwZGUsIDB4MDA4OCwgMHgwMGQ2LAorCTB4YTBlOCwgMHhiNjM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDA3MDAsIDB4MjBhMiwgMHg2ODE0LAorCTB4MjBhMiwgMHgwMGRlLCAweDIwYTMsIDB4MDAwMCwgMHgyMDExLCAweGI1MTUsIDB4MjIxNCwgMHgyMmEyLAorCTB4MDAwZSwgMHg3YjIwLCAweGQzY2MsIDB4MDExOCwgMHgyMGEzLCAweDA4ODksIDB4MDAxMCwgMHgyMGEzLAorCTB4MDg5OCwgMHgyMGEyLCAweDA4MGMsIDB4N2Q1NiwgMHgyMmEyLCAweDIwYTMsIDB4MDAwMCwgMHg2MWMyLAorCTB4MDAzZSwgMHgwMDFlLCAweDA4MGMsIDB4N2Q2NywgMHgwMDA1LCAweDIwMTEsIDB4MDAwOCwgMHgyMDAxLAorCTB4YjUwZCwgMHgyMDA0LCAweGQwZjQsIDB4MDExMCwgMHgyMDExLCAweDAwMjgsIDB4NzgyMCwgMHhkMGNjLAorCTB4MDEwOCwgMHhjMmU1LCAweDIyYTIsIDB4YTAxNiwgMHgwNGQwLCAweDIwMTEsIDB4MDMwMiwgMHgwMDE2LAorCTB4MDAzNiwgMHg3ODI4LCAweDc5MmMsIDB4YTExZCwgMHgwMTA4LCAweGMyZGQsIDB4N2IyMCwgMHhkM2NjLAorCTB4MDEwOCwgMHhjMmU1LCAweDIyYTIsIDB4MjBhMiwgMHgyMWEyLCAweDAwM2UsIDB4MDAxZSwgMHhhMDE2LAorCTB4MjJhMiwgMHgyMGEzLCAweDAwMTIsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDgsIDB4MjJhMiwgMHgyMmEyLAorCTB4MjJhMiwgMHgyMmEyLCAweDIwYTMsIDB4NzAwMCwgMHgyMGEzLCAweDA1MDAsIDB4MjJhMiwgMHgyMGEzLAorCTB4MDAwYSwgMHgyMmEyLCAweDIyYTIsIDB4MjBhMywgMHgyNTAwLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLAorCTB4MjJhMiwgMHgyMmEyLCAweDYwYzMsIDB4MDAzMiwgMHgwODBjLCAweDdkNjcsIDB4MDAwNSwgMHgyMDExLAorCTB4MDAyOCwgMHg3ODIwLCAweGQwY2MsIDB4MDEwOCwgMHhjMmU1LCAweDIyYTIsIDB4YTAxNiwgMHgyMmEyLAorCTB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDYwYzMsIDB4MDAxOCwgMHgwODBjLAorCTB4N2Q2NywgMHgwMDA1LCAweDIwMTEsIDB4MDEwMCwgMHg3ODIwLCAweGQwY2MsIDB4MDEwOCwgMHhjMmU1LAorCTB4MjJhMiwgMHhhMDE2LCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMGEzLAorCTB4MDAwOCwgMHgyMmEyLCAweDc4NTQsIDB4YTA4NCwgMHgwMGZmLCAweDIwYTIsIDB4MjJhMiwgMHgyMmEyLAorCTB4NjBjMywgMHgwMDIwLCAweDA4MGMsIDB4N2Q2NywgMHgwMDA1LCAweDIwMTEsIDB4MDAwOCwgMHg3ODIwLAorCTB4ZDBjYywgMHgwMTA4LCAweGMyZTUsIDB4MjJhMiwgMHhhMDE2LCAweDA4ODgsIDB4MDAzNiwgMHg3YjEwLAorCTB4YTM4NCwgMHhmZjAwLCAweDc4MTIsIDB4YTM4NCwgMHgwMGZmLCAweDgwMDEsIDB4MTEzOCwgMHg3ODIwLAorCTB4ZDBjYywgMHgwMTA4LCAweGMyZTUsIDB4MjJhMiwgMHgwMDNlLCAweDA4MDgsIDB4MDA0NiwgMHgyMDIxLAorCTB4MDgwMCwgMHgwMDA2LCAweDc4MjAsIDB4ZDBjYywgMHgwMDBlLCAweDAxMDgsIDB4YzRlNSwgMHgyNGEyLAorCTB4MDA0ZSwgMHgyMmEyLCAweDIwYTIsIDB4MDAzZSwgMHgwODA0LCAweDdhYzksIDB4MDAyNiwgMHgyMGUxLAorCTB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHgyMDExLAorCTB4YjUzNSwgMHgyMjE0LCAweGQyYWMsIDB4MTExMCwgMHhkMGJjLCAweDAxODgsIDB4MDBkNiwgMHhhMGU4LAorCTB4YjYzNSwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwNzAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLAorCTB4MjA2OSwgMHhiNTFjLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDAwZGUsIDB4MDA4OCwgMHgwMGQ2LAorCTB4YTBlOCwgMHhiNjM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDA3MDAsIDB4MjBhMiwgMHg2ODE0LAorCTB4MjBhMiwgMHgwMGRlLCAweDIwYTMsIDB4MDAwMCwgMHgyMDExLCAweGI1MTUsIDB4MjIxNCwgMHgyMmEyLAorCTB4NzgyMCwgMHhkMGNjLCAweDAxMTgsIDB4MjBhMywgMHgwODg5LCAweDAwMTAsIDB4MjBhMywgMHgwODk4LAorCTB4MjBhMywgMHgwMDAwLCAweDA4MGMsIDB4N2Q1NiwgMHgyMmEyLCAweDIwYTMsIDB4MDAwMCwgMHg3YTA4LAorCTB4MjJhMiwgMHgyZmEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MDAyZSwgMHgwMDA1LAorCTB4MDBkNiwgMHgwMTU2LCAweDAxMzYsIDB4MDE0NiwgMHgwMDE2LCAweDAwMzYsIDB4NzgxMCwgMHhhMDg0LAorCTB4MDcwMCwgMHg4MDA3LCAweDAwM2IsIDB4MDAzZSwgMHgwMDFlLCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLAorCTB4MDBkZSwgMHgwMDA1LCAweDdiN2EsIDB4N2I3YSwgMHg3YjdjLCAweDdiN2EsIDB4N2I3YSwgMHg3YjdhLAorCTB4N2I5ZSwgMHg3YjdhLCAweDA4MGMsIDB4MTUxNSwgMHg3OTEwLCAweGExOGMsIDB4ZjhmZiwgMHhhMThkLAorCTB4MDYwMCwgMHg3OTEyLCAweDIwYTEsIDB4MDIwYiwgMHgyMDA5LCAweDAwMDMsIDB4MDBmOSwgMHgwMGQ2LAorCTB4MjA2OSwgMHhiNTUyLCAweDY4MDQsIDB4ZDBiYywgMHgwMTMwLCAweDY4MmMsIDB4YTA4NCwgMHgwMGZmLAorCTB4ODAwNywgMHgyMGEyLCAweDAwMTAsIDB4MjBhMywgMHgzZjAwLCAweDAwZGUsIDB4MjJhMiwgMHgyMmEyLAorCTB4MjJhMiwgMHg2MGMzLCAweDAwMDEsIDB4MDgwYywgMHg3ZDY3LCAweDAwMDUsIDB4MjBhMSwgMHgwMjBiLAorCTB4MjAwOSwgMHgwMDAzLCAweDAwMTksIDB4MjBhMywgMHg3ZjAwLCAweDBjODAsIDB4MDAyNiwgMHgyMGUxLAorCTB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHgyMDExLAorCTB4YjUzNSwgMHgyMjE0LCAweGQyYWMsIDB4MTExMCwgMHhkMGJjLCAweDAxODgsIDB4MDBkNiwgMHhhMGU4LAorCTB4YjYzNSwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwMTAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLAorCTB4MjA2OSwgMHhiNTFjLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDAwZGUsIDB4MDA4OCwgMHgwMGQ2LAorCTB4YTBlOCwgMHhiNjM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDAxMDAsIDB4MjBhMiwgMHg2ODE0LAorCTB4MjBhMiwgMHgwMGRlLCAweDIwYTMsIDB4MDAwMCwgMHgyMDExLCAweGI1MTUsIDB4MjIxNCwgMHgyMmEyLAorCTB4MjBhMywgMHgwODg4LCAweGExOGQsIDB4MDAwOCwgMHgyMWEyLCAweDA4MGMsIDB4N2Q1NiwgMHgyMmEyLAorCTB4MjBhMywgMHgwMDAwLCAweDdhMDgsIDB4MjJhMiwgMHgyZmEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgwMDJlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDA1NiwgMHgwMDQ2LAorCTB4MDAzNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHhiNTAwLCAweDcxNTQsIDB4NzgxOCwgMHgyMDY4LAorCTB4NjhhMCwgMHgyMDI4LCAweDc2ZDQsIDB4ZDZhYywgMHgxMTMwLCAweGQwYmMsIDB4MTEyMCwgMHg2OTEwLAorCTB4NmExNCwgMHg3NDU0LCAweDAwMjAsIDB4NjkxMCwgMHg2YTE0LCAweDczNzAsIDB4NzQ3NCwgMHg3ODFjLAorCTB4YTBiZSwgMHgwMDA2LCAweDA5MDQsIDB4N2NhMSwgMHhhMGJlLCAweDAwMGEsIDB4MTVlOCwgMHhhMTg1LAorCTB4MDIwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjM2YSwgMHg2NDZlLCAweDYwNzMsIDB4MjAyOSwgMHg2MDc3LAorCTB4MDAwMCwgMHg2ODhjLCAweDgwMDAsIDB4YTA4NCwgMHgwMGZmLCAweDY4OGUsIDB4ODAwNywgMHg2MDdhLAorCTB4NjA3ZiwgMHgwMDAwLCAweDJmMDAsIDB4NjA4MiwgMHg3ODA4LCAweDYwODYsIDB4NzgxMCwgMHgyMDcwLAorCTB4NzAxNCwgMHg2MDhhLCAweDcwMTAsIDB4NjA4ZSwgMHg3MDBjLCAweDYwYzYsIDB4NzAwOCwgMHg2MGNhLAorCTB4Njg2YywgMHg2MGNlLCAweDYwYWYsIDB4OTVkNSwgMHg2MGQ3LCAweDAwMDAsIDB4NjA5ZiwgMHgwMDAwLAorCTB4MDgwYywgMHg4NWI5LCAweDIwMDksIDB4MDdkMCwgMHg2MGM0LCAweGEwODQsIDB4ZmZmMCwgMHhhMDA1LAorCTB4MDExMCwgMHgyMDA5LCAweDFiNTgsIDB4MDgwYywgMHg2YTE1LCAweDAwM2UsIDB4MDA0ZSwgMHgwMDVlLAorCTB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDAwNSwgMHg3MGQ0LCAweGQwYWMsIDB4MTExMCwgMHhkNWJjLAorCTB4MDEzOCwgMHhhMTg1LCAweDAxMDAsIDB4NjA2MiwgMHg2MjY2LCAweDYzNmEsIDB4NjQ2ZSwgMHgwMDM4LAorCTB4YTE4NSwgMHgwMTAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MDZiLCAweDAwMDAsIDB4NjQ2ZSwgMHg2MDczLAorCTB4MDgwOSwgMHg2MDc3LCAweDAwMDgsIDB4Njg4YywgMHg4MDAwLCAweGEwODQsIDB4MDBmZiwgMHg2ODhlLAorCTB4ODAwNywgMHg2MDdhLCAweDYwN2YsIDB4MDAwMCwgMHgyZjAwLCAweDYwODIsIDB4NzgwOCwgMHg2MDg2LAorCTB4NzgxMCwgMHgyMDcwLCAweDcwMTQsIDB4NjA4YSwgMHg3MDEwLCAweDYwOGUsIDB4NzAwYywgMHg2MGM2LAorCTB4NzAwOCwgMHg2MGNhLCAweDY4NmMsIDB4NjBjZSwgMHg2MGFmLCAweDk1ZDUsIDB4NjBkNywgMHgwMDAwLAorCTB4YTU4MiwgMHgwMDgwLCAweDAyNDgsIDB4NmEwMCwgMHhkMmY0LCAweDAxMjAsIDB4NmExNCwgMHhhMjk0LAorCTB4MDBmZiwgMHgwMDEwLCAweDIwMTEsIDB4MDAwMCwgMHg2MjllLCAweDA4MGMsIDB4ODViOSwgMHgyMDA5LAorCTB4MDdkMCwgMHg2MGM0LCAweGEwODQsIDB4ZmZmMCwgMHhhMDA1LCAweDAxMTAsIDB4MjAwOSwgMHgxYjU4LAorCTB4MDgwYywgMHg2YTE1LCAweDAwM2UsIDB4MDA0ZSwgMHgwMDVlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLAorCTB4MDAwNSwgMHg3ODEwLCAweDIwNzAsIDB4NzA0YywgMHhhMDg0LCAweDAwMDMsIDB4YTA4NiwgMHgwMDAyLAorCTB4MDkwNCwgMHg3Y2Y3LCAweDIwMDEsIDB4YjUzNSwgMHgyMDA0LCAweGQwYWMsIDB4MTExMCwgMHhkNWJjLAorCTB4MDEzOCwgMHhhMTg1LCAweDAxMDAsIDB4NjA2MiwgMHg2MjY2LCAweDYzNmEsIDB4NjQ2ZSwgMHgwMDM4LAorCTB4YTE4NSwgMHgwMTAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MDZiLCAweDAwMDAsIDB4NjQ2ZSwgMHg2MDczLAorCTB4MDg4MCwgMHg2MDc3LCAweDAwMDgsIDB4Njg4YywgMHg4MDAwLCAweGEwODQsIDB4MDBmZiwgMHg2ODhlLAorCTB4ODAwNywgMHg2MDdhLCAweDc4MzQsIDB4NjA3ZSwgMHgyZjAwLCAweDYwODYsIDB4NzgwOCwgMHg2MDgyLAorCTB4NzA2MCwgMHg2MDhhLCAweDcwNWMsIDB4NjA4ZSwgMHg3MDgwLCAweDYwYzYsIDB4NzA3YywgMHg2MGNhLAorCTB4NzA3YywgMHg3OTJjLCAweGExMDgsIDB4NzkyZSwgMHg3MDgwLCAweDc5MjgsIDB4YTEwOSwgMHg3OTJhLAorCTB4Njg2YywgMHg2MGNlLCAweDYwYWYsIDB4OTVkNSwgMHg2MGQ3LCAweDAwMDAsIDB4YTU4MiwgMHgwMDgwLAorCTB4MDI0OCwgMHg2YTAwLCAweGQyZjQsIDB4MDEyMCwgMHg2YTE0LCAweGEyOTQsIDB4MDBmZiwgMHgwMDEwLAorCTB4MjAxMSwgMHgwMDAwLCAweDYyOWUsIDB4MDgwYywgMHg4NWI2LCAweDA4MDQsIDB4N2M4ZiwgMHgyMDAxLAorCTB4YjUzNSwgMHgyMDA0LCAweGQwYWMsIDB4MTExMCwgMHhkNWJjLCAweDAxMzgsIDB4YTE4NSwgMHgwNzAwLAorCTB4NjA2MiwgMHg2MjY2LCAweDYzNmEsIDB4NjQ2ZSwgMHgwMDM4LCAweGExODUsIDB4MDcwMCwgMHg2MDYyLAorCTB4NjI2NiwgMHg2MDZiLCAweDAwMDAsIDB4NjQ2ZSwgMHgwODBjLCAweDUzMDEsIDB4MDE4MCwgMHgwMGQ2LAorCTB4NzgxMCwgMHhhMDZkLCAweDY4NGMsIDB4MDBkZSwgMHhhMDg0LCAweDIwMjAsIDB4YTA4NiwgMHgyMDIwLAorCTB4MTEzMCwgMHg3ODIwLCAweGMwY2QsIDB4NzgyMiwgMHg2MDczLCAweDA4ODksIDB4MDAxMCwgMHg2MDczLAorCTB4MDg5OCwgMHg2MDc3LCAweDAwMDAsIDB4Njg4YywgMHg4MDAwLCAweGEwODQsIDB4MDBmZiwgMHg2ODhlLAorCTB4ODAwNywgMHg2MDdhLCAweDYwN2YsIDB4MDAwMCwgMHgyZjAwLCAweDYwODYsIDB4NzgwOCwgMHg2MDgyLAorCTB4NzAxNCwgMHg2MDhhLCAweDcwMTAsIDB4NjA4ZSwgMHg3MDBjLCAweDYwYzYsIDB4NzAwOCwgMHg2MGNhLAorCTB4Njg2YywgMHg2MGNlLCAweDYwYWYsIDB4OTVkNSwgMHg2MGQ3LCAweDAwMDAsIDB4YTU4MiwgMHgwMDgwLAorCTB4MDI0OCwgMHg2YTAwLCAweGQyZjQsIDB4MDEyMCwgMHg2YTE0LCAweGEyOTQsIDB4MDBmZiwgMHgwMDEwLAorCTB4MjAxMSwgMHgwMDAwLCAweDYyOWUsIDB4NzgyMCwgMHhkMGNjLCAweDAxMjAsIDB4MDgwYywgMHg4NWI5LAorCTB4MDgwNCwgMHg3YzhmLCAweDA4MGMsIDB4ODViNiwgMHgwODA0LCAweDdjOGYsIDB4N2ExOCwgMHhhMjgwLAorCTB4MDAyMywgMHgyMDE0LCAweDgyMTAsIDB4YTI5NCwgMHgwMGZmLCAweDIyMDIsIDB4ODIxNywgMHgwMDA1LAorCTB4MDBkNiwgMHgyMDY5LCAweGI3ZTAsIDB4Njg0MywgMHgwMDAxLCAweDAwZGUsIDB4MDAwNSwgMHgyMGUxLAorCTB4OTA4MCwgMHg2MGEzLCAweDAwNTYsIDB4NjBhNywgMHg5NTc1LCAweDAwMTksIDB4MDgwYywgMHg2YTA3LAorCTB4MDAwNSwgMHgwMDA2LCAweDYwMTQsIDB4YTA4NCwgMHgwMDA0LCAweGEwODUsIDB4MDAwOSwgMHg2MDE2LAorCTB4MDAwZSwgMHgwMDA1LCAweDAwMTYsIDB4MDBjNiwgMHgwMDA2LCAweDIwNjEsIDB4MDEwMCwgMHg2MWE0LAorCTB4NjBhNywgMHg5NWY1LCAweDYwMTQsIDB4YTA4NCwgMHgwMDA0LCAweGEwODUsIDB4MDAwOCwgMHg2MDE2LAorCTB4MDAwZSwgMHhlMDAwLCAweGUwMDAsIDB4ZTAwMCwgMHhlMDAwLCAweDYxYTYsIDB4MDBjZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwMGM2LCAweDAwZDYsIDB4MDAxNiwgMHgwMDI2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LAorCTB4MDE0MCwgMHgwODBjLCAweDVhY2YsIDB4MTE5OCwgMHgyMDAxLCAweGI3ZmMsIDB4MjAwNCwgMHhhMDA1LAorCTB4MTViOCwgMHgwMDY2LCAweDIwMzEsIDB4MDAwMSwgMHgwODBjLCAweDViNTEsIDB4MDA2ZSwgMHgxMTE4LAorCTB4MDgwYywgMHg2YTA3LCAweDA0NjgsIDB4MDBjNiwgMHgyMDYxLCAweGI3ZTAsIDB4MDBkOCwgMHg2OTA0LAorCTB4YTE5NCwgMHg0MDAwLCAweDA1NTAsIDB4MDgzMSwgMHg2ODAzLCAweDEwMDAsIDB4NjgwMywgMHgwMDAwLAorCTB4MDBjNiwgMHgyMDYxLCAweGI3ZTAsIDB4NjEyOCwgMHhhMTkyLCAweDAwYzgsIDB4MTI1OCwgMHg4MTA4LAorCTB4NjEyYSwgMHg2MTI0LCAweDAwY2UsIDB4ODFmZiwgMHgwMTk4LCAweDA4MGMsIDB4NmEwNywgMHgwODBjLAorCTB4N2Q3MSwgMHgwMDcwLCAweDYxMjQsIDB4YTFlNSwgMHgwMDAwLCAweDAxNDAsIDB4MDgwYywgMHhiNDQ0LAorCTB4MDgwYywgMHg2YTEwLCAweDIwMDksIDB4MDAxNCwgMHgwODBjLCAweDg2NGMsIDB4MDBjZSwgMHgwMDAwLAorCTB4MDAyZSwgMHgwMDFlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDIwMDEsIDB4YjdmYywgMHgyMDA0LAorCTB4YTAwNSwgMHgxZGIwLCAweDAwYzYsIDB4MjA2MSwgMHhiN2UwLCAweDYxMjgsIDB4YTE5MiwgMHgwMDAzLAorCTB4MWUwOCwgMHg4MTA4LCAweDYxMmEsIDB4MDBjZSwgMHgwODBjLCAweDZhMDcsIDB4MDgwYywgMHg0YjFmLAorCTB4MGMzOCwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwMDE2LCAweDAwMjYsIDB4MDgwYywgMHg2YTFkLAorCTB4MjA3MSwgMHhiN2UwLCAweDcxM2MsIDB4ODFmZiwgMHgwNTkwLCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LAorCTB4MDE0MCwgMHgwODBjLCAweDVhY2YsIDB4MTFhOCwgMHgwMDM2LCAweDIwMTksIDB4MDAwMiwgMHgwODBjLAorCTB4N2ZlNCwgMHgwMDNlLCAweDcxM2MsIDB4MjE2MCwgMHgwODBjLCAweGI0NDQsIDB4MjAwOSwgMHgwMDRhLAorCTB4MDgwYywgMHg4NjRjLCAweDAwNjYsIDB4MjAzMSwgMHgwMDAxLCAweDA4MGMsIDB4NWI1MSwgMHgwMDZlLAorCTB4MDBiMCwgMHg2OTA0LCAweGExOTQsIDB4NDAwMCwgMHgwMWMwLCAweDY4MDMsIDB4MTAwMCwgMHg2ODAzLAorCTB4MDAwMCwgMHgwMDM2LCAweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweDdmZTQsIDB4MDAzZSwgMHg3MTNjLAorCTB4MjE2MCwgMHgwODBjLCAweGI0NDQsIDB4MjAwOSwgMHgwMDRhLCAweDA4MGMsIDB4ODY0YywgMHgwMDJlLAorCTB4MDAxZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDBjNTgsIDB4MDAyNiwgMHgwMGU2LAorCTB4MjA3MSwgMHhiN2UwLCAweDcwNDgsIDB4ZDA4NCwgMHgwMWMwLCAweDcxM2MsIDB4ODFmZiwgMHgwMWE4LAorCTB4MjA3MSwgMHgwMTAwLCAweGExODgsIDB4MDAwNywgMHgyMTE0LCAweGEyOGUsIDB4MDAwNiwgMHgxMTM4LAorCTB4NzAxNCwgMHhhMDg0LCAweDAxODQsIDB4YTA4NSwgMHgwMDEyLCAweDcwMTYsIDB4MDAzMCwgMHg3MDE0LAorCTB4YTA4NCwgMHgwMTg0LCAweGEwODUsIDB4MDAxNiwgMHg3MDE2LCAweDAwZWUsIDB4MDAyZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDU2LCAweDAwNDYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDYwMTgsIDB4MjA2OCwgMHg2Y2EwLCAweDIwNzEsIDB4YjdlMCwgMHg3MDE4LAorCTB4MjA2OCwgMHg4ZGZmLCAweDAxODgsIDB4NjhhMCwgMHhhNDA2LCAweDAxMTgsIDB4Njg1NCwgMHgyMDY4LAorCTB4MGNjMCwgMHg2MDEwLCAweDIwNjAsIDB4NjQzYywgMHg2NTQwLCAweDY2NDgsIDB4MmQ2MCwgMHgwODBjLAorCTB4NTExYSwgMHgwMTEwLCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwMGUsIDB4MDA0ZSwgMHgwMDVlLAorCTB4MDA2ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMDA1LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLAorCTB4NzY0MSwgMHgyMGEzLCAweDEyMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg3ODFjLAorCTB4YTA4NiwgMHgwMDA0LCAweDExMTAsIDB4NjA5OCwgMHgwMDE4LCAweDIwMDEsIDB4YjUxNSwgMHgyMDA0LAorCTB4MjBhMiwgMHg3ODM0LCAweDIwYTIsIDB4NzgzOCwgMHgyMGEyLCAweDIwYTksIDB4MDAxMCwgMHhhMDA2LAorCTB4MjBhMiwgMHgxZjA0LCAweDdlYTAsIDB4MjBhMiwgMHgyMGEyLCAweDYwYzMsIDB4MDAyYywgMHgwODBjLAorCTB4N2Q2NywgMHgwMDA1LCAweDAxNTYsIDB4MDE0NiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NjQxLAorCTB4MjBhMywgMHgwZjAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NzgwOCwgMHgyMGEyLAorCTB4NjBjMywgMHgwMDA4LCAweDA4MGMsIDB4N2Q2NywgMHgwMTRlLCAweDAxNWUsIDB4MDAwNSwgMHgwMTU2LAorCTB4MDE0NiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NmRkLCAweDIwYTMsIDB4MDIwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGE5LCAweDAwMDYsIDB4MjAxMSwgMHhiNTQwLCAweDIwMTksIDB4YjU0MSwgMHgyM2E2LAorCTB4MjJhNiwgMHhhMzk4LCAweDAwMDIsIDB4YTI5MCwgMHgwMDAyLCAweDFmMDQsIDB4N2VjZiwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDFjLCAweDA4MGMsIDB4N2Q2NywgMHgwMTRlLAorCTB4MDE1ZSwgMHgwMDA1LCAweDAxNTYsIDB4MDE0NiwgMHgwMDE2LCAweDAwMjYsIDB4MjBhMSwgMHgwMjBiLAorCTB4MDgwYywgMHg3NmI2LCAweDA4MGMsIDB4NzZjYywgMHg3ODEwLCAweGEwODAsIDB4MDAwMCwgMHgyMDA0LAorCTB4YTA4MCwgMHgwMDE1LCAweDIwOTgsIDB4NzgwOCwgMHhhMDg4LCAweDAwMDIsIDB4MjFhOCwgMHg1M2E2LAorCTB4YTA4MCwgMHgwMDA0LCAweDgwMDMsIDB4NjBjMiwgMHgwODBjLCAweDdkNjcsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDE0ZSwgMHgwMTVlLCAweDAwMDUsIDB4MDE1NiwgMHgwMTQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLAorCTB4NzY0MSwgMHgyMGEzLCAweDYyMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg3ODA4LAorCTB4MjBhMiwgMHg2MGMzLCAweDAwMDgsIDB4MDgwYywgMHg3ZDY3LCAweDAxNGUsIDB4MDE1ZSwgMHgwMDA1LAorCTB4MDE1NiwgMHgwMTQ2LCAweDAwMTYsIDB4MDAyNiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NjQxLAorCTB4NzgxMCwgMHhhMDgwLCAweDAwMDAsIDB4MjAwNCwgMHhhMDgwLCAweDAwMTcsIDB4MjA5OCwgMHg3ODA4LAorCTB4YTA4OCwgMHgwMDAyLCAweDIxYTgsIDB4NTNhNiwgMHg4MDAzLCAweDYwYzIsIDB4MDgwYywgMHg3ZDY3LAorCTB4MDAyZSwgMHgwMDFlLCAweDAxNGUsIDB4MDE1ZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMDA2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhiN2UwLCAweDcwMGMsIDB4MjA2MCwgMHg4Y2ZmLAorCTB4MDE3OCwgMHgwODBjLCAweDllNTgsIDB4MTExMCwgMHgwODBjLCAweDhjMTksIDB4NjAwYywgMHgwMDA2LAorCTB4MDgwYywgMHhhMDFmLCAweDA4MGMsIDB4ODYxZCwgMHgwODBjLCAweDgxMWUsIDB4MDBjZSwgMHgwYzc4LAorCTB4NzAwZiwgMHgwMDAwLCAweDcwMGIsIDB4MDAwMCwgMHgwMTJlLCAweDAwMGUsIDB4MDBjZSwgMHgwMGVlLAorCTB4MDAwNSwgMHgwMTI2LCAweDAxNTYsIDB4MDBmNiwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgwMDI2LAorCTB4MDAxNiwgMHgwMDA2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDY5LCAweDAxMDAsIDB4MjA3OSwgMHgwMTQwLAorCTB4MjA3MSwgMHhiN2UwLCAweDcwMjQsIDB4MjA2MCwgMHg4Y2ZmLCAweDA1YTAsIDB4MDgwYywgMHg3ZDdhLAorCTB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4NmExMCwgMHgyMDA5LCAweDAwMTMsIDB4MDgwYywgMHg4NjRjLAorCTB4MjBhOSwgMHgwMWY0LCAweDY4MjQsIDB4ZDA5NCwgMHgwMTU4LCAweDY4MjcsIDB4MDAwNCwgMHg3ODA0LAorCTB4YTA4NCwgMHg0MDAwLCAweDAxYTAsIDB4NzgwMywgMHgxMDAwLCAweDc4MDMsIDB4MDAwMCwgMHgwMDc4LAorCTB4ZDA4NCwgMHgwMTE4LCAweDY4MjcsIDB4MDAwMSwgMHgwMDEwLCAweDFmMDQsIDB4N2Y3YSwgMHg3ODA0LAorCTB4YTA4NCwgMHgxMDAwLCAweDAxMjAsIDB4NzgwMywgMHgwMTAwLCAweDc4MDMsIDB4MDAwMCwgMHg2ODI0LAorCTB4MDAwZSwgMHgwMDFlLCAweDAwMmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMTVlLAorCTB4MDEyZSwgMHgwMDA1LCAweDIwMDEsIDB4YjUwMCwgMHgyMDA0LCAweGEwOTYsIDB4MDAwMSwgMHgwNTkwLAorCTB4YTA5NiwgMHgwMDA0LCAweDA1NzgsIDB4MDgwYywgMHg2YTEwLCAweDY4MTQsIDB4YTA4NCwgMHgwMDAxLAorCTB4MDExMCwgMHg2OGE3LCAweDk1ZjUsIDB4NjgxNywgMHgwMDA4LCAweDY4YzMsIDB4MDAwMCwgMHgyMDExLAorCTB4NGFkYywgMHgwODBjLCAweDY5OWMsIDB4MjBhOSwgMHgwMWY0LCAweDY4MjQsIDB4ZDA5NCwgMHgwMTU4LAorCTB4NjgyNywgMHgwMDA0LCAweDc4MDQsIDB4YTA4NCwgMHg0MDAwLCAweDAxYTAsIDB4NzgwMywgMHgxMDAwLAorCTB4NzgwMywgMHgwMDAwLCAweDAwNzgsIDB4ZDA4NCwgMHgwMTE4LCAweDY4MjcsIDB4MDAwMSwgMHgwMDEwLAorCTB4MWYwNCwgMHg3ZmJkLCAweDc4MDQsIDB4YTA4NCwgMHgxMDAwLCAweDAxMjAsIDB4NzgwMywgMHgwMTAwLAorCTB4NzgwMywgMHgwMDAwLCAweDAwMGUsIDB4MDAxZSwgMHgwMDJlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMTVlLCAweDAxMmUsIDB4MDAwNSwgMHgwMTI2LCAweDAxNTYsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDBkNiwgMHgwMGM2LCAweDAwMjYsIDB4MDAxNiwgMHgwMDA2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDY5LAorCTB4MDEwMCwgMHgyMDc5LCAweDAxNDAsIDB4MjA3MSwgMHhiN2UwLCAweDcwM2MsIDB4MjA2MCwgMHg4Y2ZmLAorCTB4MDkwNCwgMHg4MDZiLCAweGEzODYsIDB4MDAwMiwgMHgxMTI4LCAweDY4MTQsIDB4YTA4NCwgMHgwMDAyLAorCTB4MDkwNCwgMHg4MDZiLCAweDY4YWYsIDB4OTVmNSwgMHg2ODE3LCAweDAwMTAsIDB4MjAwOSwgMHgwMGZhLAorCTB4ODEwOSwgMHgxZGYwLCAweDY4YzcsIDB4MDAwMCwgMHg2OGNiLCAweDAwMDgsIDB4MDgwYywgMHg2YTFkLAorCTB4MDgwYywgMHgyMjBjLCAweDAwNDYsIDB4MjAwOSwgMHgwMTdmLCAweDIwMGIsIDB4MDBhNSwgMHgyMDIxLAorCTB4MDE2OSwgMHgyNDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDg2LCAweDAwMDQsIDB4MTUwMCwgMHg2OGFmLAorCTB4OTVmNSwgMHg2OGM3LCAweDAwMDAsIDB4NjhjYiwgMHgwMDA4LCAweDAwZTYsIDB4MDBmNiwgMHgyMDc5LAorCTB4MDAyMCwgMHgyMDcxLCAweGI4NGEsIDB4NjgxNCwgMHhhMDg0LCAweDAxODQsIDB4YTA4NSwgMHgwMDEyLAorCTB4NjgxNiwgMHg3ODAzLCAweDAwMDgsIDB4NzAwMywgMHgwMDAwLCAweDAwZmUsIDB4MDBlZSwgMHhhMzg2LAorCTB4MDAwMiwgMHgxMTI4LCAweDc4ODQsIDB4YTAwNSwgMHgxMTEwLCAweDc4ODcsIDB4MDAwMSwgMHgyMDAxLAorCTB4YjdiMSwgMHgyMDA0LCAweDIwMGEsIDB4MDA0ZSwgMHhhMzlkLCAweDAwMDAsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDA0OSwgMHgwODBjLCAweDg2NGMsIDB4MjBhOSwgMHgwM2U4LCAweDY4MjQsIDB4ZDA5NCwgMHgwMTU4LAorCTB4NjgyNywgMHgwMDA0LCAweDc4MDQsIDB4YTA4NCwgMHg0MDAwLCAweDAxYTAsIDB4NzgwMywgMHgxMDAwLAorCTB4NzgwMywgMHgwMDAwLCAweDAwNzgsIDB4ZDA4YywgMHgwMTE4LCAweDY4MjcsIDB4MDAwMiwgMHgwMDEwLAorCTB4MWYwNCwgMHg4MDRkLCAweDc4MDQsIDB4YTA4NCwgMHgxMDAwLCAweDAxMjAsIDB4NzgwMywgMHgwMTAwLAorCTB4NzgwMywgMHgwMDAwLCAweDY4MjQsIDB4MDAwZSwgMHgwMDFlLCAweDAwMmUsIDB4MDBjZSwgMHgwMGRlLAorCTB4MDBlZSwgMHgwMGZlLCAweDAxNWUsIDB4MDEyZSwgMHgwMDA1LCAweDAwZDYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDY5LCAweGI3ZTAsIDB4NmEwNiwgMHgwMTJlLCAweDAwZGUsIDB4MDAwNSwgMHgwMGQ2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA2OSwgMHhiN2UwLCAweDZhMzIsIDB4MDEyZSwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MDBjNiwgMHgwMDY2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDcxLAorCTB4YjdlMCwgMHg3NjE0LCAweDI2NjAsIDB4MjY3OCwgMHgyMDkxLCAweDgwMDAsIDB4OGNmZiwgMHgwNTM4LAorCTB4NjAxYywgMHhhMjA2LCAweDE1MDAsIDB4NzAxNCwgMHhhYzM2LCAweDExMTAsIDB4NjYwYywgMHg3NjE2LAorCTB4NzAxMCwgMHhhYzM2LCAweDExNDAsIDB4MmMwMCwgMHhhZjM2LCAweDAxMTgsIDB4MmYwMCwgMHg3MDEyLAorCTB4MDAxMCwgMHg3MDEzLCAweDAwMDAsIDB4NjYwYywgMHgwMDY2LCAweDJjMDAsIDB4YWYwNiwgMHgwMTEwLAorCTB4N2UwZSwgMHgwMDA4LCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLCAweDA4MGMsIDB4OWUxZCwgMHgwODBjLAorCTB4ODExZSwgMHgwMGNlLCAweDA4ZDgsIDB4MmM3OCwgMHg2MDBjLCAweDIwNjAsIDB4MDhiOCwgMHgwMTJlLAorCTB4MDAwZSwgMHgwMDZlLCAweDAwY2UsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDE1NiwgMHgwMTQ2LAorCTB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzkwMiwgMHg3ODEwLCAweDIwYTIsIDB4YTAwNiwgMHgyMGEyLAorCTB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMywgMHgxMDAwLCAweDA4MDQsIDB4ODExNiwgMHgwMTU2LAorCTB4MDE0NiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3OTAyLCAweDc4MTAsIDB4MjBhMiwgMHhhMDA2LAorCTB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEzLCAweDQwMDAsIDB4MDQ3OCwgMHgwMTU2LAorCTB4MDE0NiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3OTAyLCAweDc4MTAsIDB4MjBhMiwgMHhhMDA2LAorCTB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEzLCAweDIwMDAsIDB4MDBmOCwgMHgwMTU2LAorCTB4MDE0NiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3OTAyLCAweDc4MTAsIDB4MjBhMiwgMHhhMDA2LAorCTB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEzLCAweDA0MDAsIDB4MDA3OCwgMHgwMTU2LAorCTB4MDE0NiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3OTAyLCAweDc4MTAsIDB4MjBhMiwgMHhhMDA2LAorCTB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEzLCAweDAyMDAsIDB4MDA4OSwgMHg2MGMzLAorCTB4MDAyMCwgMHgwODBjLCAweDdkNjcsIDB4MDE0ZSwgMHgwMTVlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLAorCTB4YjdlMCwgMHg3MDIwLCAweGEwMDUsIDB4MDExMCwgMHg4MDAxLCAweDcwMjIsIDB4MDBlZSwgMHgwMDA1LAorCTB4MjBhOSwgMHgwMDA4LCAweDIwYTIsIDB4MWYwNCwgMHg4MTJhLCAweDIwYTIsIDB4MjBhMiwgMHgwMDA1LAorCTB4MDBmNiwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgwMDc2LCAweDAwNjYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YjdlMCwgMHg3NjE0LCAweDI2NjAsIDB4MjY3OCwgMHgyMDM5LAorCTB4MDAwMSwgMHg4N2ZmLCAweDA5MDQsIDB4ODFjNiwgMHg4Y2ZmLCAweDA5MDQsIDB4ODFjNiwgMHg2MDFjLAorCTB4YTA4NiwgMHgwMDA2LCAweDE5MDQsIDB4ODFjMSwgMHg4OGZmLCAweDAxMzgsIDB4MjgwMCwgMHhhYzA2LAorCTB4MTkwNCwgMHg4MWMxLCAweDIwMzksIDB4MDAwMCwgMHgwMDUwLCAweDYwMTgsIDB4YTIwNiwgMHgxOTA0LAorCTB4ODFjMSwgMHg4NWZmLCAweDAxMjAsIDB4NjA1MCwgMHhhMTA2LCAweDE5MDQsIDB4ODFjMSwgMHg3MDI0LAorCTB4YWMwNiwgMHgxNTk4LCAweDIwNjksIDB4MDEwMCwgMHg2OGMwLCAweGEwMDUsIDB4MTE2MCwgMHg2ODI0LAorCTB4ZDA4NCwgMHgwMTQ4LCAweDY4MjcsIDB4MDAwMSwgMHgwODBjLCAweDZhMTAsIDB4MDgwYywgMHg4MjRkLAorCTB4NzAyNywgMHgwMDAwLCAweDA0MTAsIDB4MDgwYywgMHg2YTEwLCAweDY4MjAsIDB4ZDBiNCwgMHgwMTEwLAorCTB4NjhhNywgMHg5NWY1LCAweDY4MTcsIDB4MDAwOCwgMHg2OGMzLCAweDAwMDAsIDB4MDgwYywgMHg4MjRkLAorCTB4NzAyNywgMHgwMDAwLCAweDAwMzYsIDB4MjA2OSwgMHgwMTQwLCAweDZiMDQsIDB4YTM4NCwgMHgxMDAwLAorCTB4MDEyMCwgMHg2ODAzLCAweDAxMDAsIDB4NjgwMywgMHgwMDAwLCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LAorCTB4ZDA4NCwgMHgwMTEwLCAweDY4MjcsIDB4MDAwMSwgMHgwMDNlLCAweDcwMTQsIDB4YWMzNiwgMHgxMTEwLAorCTB4NjYwYywgMHg3NjE2LCAweDcwMTAsIDB4YWMzNiwgMHgxMTQwLCAweDJjMDAsIDB4YWYzNiwgMHgwMTE4LAorCTB4MmYwMCwgMHg3MDEyLCAweDAwMTAsIDB4NzAxMywgMHgwMDAwLCAweDY2MGMsIDB4MDA2NiwgMHgyYzAwLAorCTB4YWYwNiwgMHgwMTEwLCAweDdlMGUsIDB4MDAwOCwgMHgyNjc4LCAweDg5ZmYsIDB4MTE1OCwgMHg2MDBmLAorCTB4MDAwMCwgMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5YzVhLCAweDAxMTAsIDB4MDgwYywgMHhiMDk5LAorCTB4MDgwYywgMHg5ZTFkLCAweDA4MGMsIDB4ODExZSwgMHg4OGZmLCAweDExOTAsIDB4MDBjZSwgMHgwODA0LAorCTB4ODE0MSwgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwODA0LCAweDgxNDEsIDB4YTAwNiwgMHgwMTJlLAorCTB4MDAwZSwgMHgwMDZlLCAweDAwN2UsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LAorCTB4NjAxNywgMHgwMDAwLCAweDAwY2UsIDB4YThjNSwgMHgwMDAxLCAweDBjODgsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDBkNiwgMHgwMGM2LCAweDAwNjYsIDB4MDAyNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA3MSwgMHhiN2UwLCAweDc2MzgsIDB4MjY2MCwgMHgyNjc4LCAweDhjZmYsIDB4MDkwNCwgMHg4MjNkLAorCTB4NjAxYywgMHhhMDg2LCAweDAwMDYsIDB4MTkwNCwgMHg4MjM4LCAweDg3ZmYsIDB4MDEyOCwgMHgyNzAwLAorCTB4YWMwNiwgMHgxOTA0LCAweDgyMzgsIDB4MDA0OCwgMHg2MDE4LCAweGEyMDYsIDB4MTkwNCwgMHg4MjM4LAorCTB4ODVmZiwgMHgwMTE4LCAweDYwNTAsIDB4YTEwNiwgMHgxNWQ4LCAweDcwM2MsIDB4YWMwNiwgMHgxMTgwLAorCTB4MDAzNiwgMHgyMDE5LCAweDAwMDEsIDB4MDgwYywgMHg3ZmU0LCAweDcwMzMsIDB4MDAwMCwgMHg3MDNmLAorCTB4MDAwMCwgMHg3MDQzLCAweDAwMDAsIDB4NzA0NywgMHgwMDAwLCAweDcwNGIsIDB4MDAwMCwgMHgwMDNlLAorCTB4NzAzOCwgMHhhYzM2LCAweDExMTAsIDB4NjYwYywgMHg3NjNhLCAweDcwMzQsIDB4YWMzNiwgMHgxMTQwLAorCTB4MmMwMCwgMHhhZjM2LCAweDAxMTgsIDB4MmYwMCwgMHg3MDM2LCAweDAwMTAsIDB4NzAzNywgMHgwMDAwLAorCTB4NjYwYywgMHgwMDY2LCAweDJjMDAsIDB4YWYwNiwgMHgwMTEwLCAweDdlMGUsIDB4MDAwOCwgMHgyNjc4LAorCTB4NjAwZiwgMHgwMDAwLCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLCAweDljNWEsIDB4MDExMCwgMHgwODBjLAorCTB4YjA5OSwgMHgwODBjLCAweDllMWQsIDB4ODdmZiwgMHgxMTkwLCAweDAwY2UsIDB4MDgwNCwgMHg4MWU1LAorCTB4MmM3OCwgMHg2MDBjLCAweDIwNjAsIDB4MDgwNCwgMHg4MWU1LCAweGEwMDYsIDB4MDEyZSwgMHgwMDBlLAorCTB4MDAyZSwgMHgwMDZlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHg2MDE3LAorCTB4MDAwMCwgMHgwMGNlLCAweGE3YmQsIDB4MDAwMSwgMHgwYzg4LCAweDAwZTYsIDB4MjA3MSwgMHhiN2UwLAorCTB4MjAwMSwgMHhiNTAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAyLCAweDExMTgsIDB4NzAwNywgMHgwMDA1LAorCTB4MDAxMCwgMHg3MDA3LCAweDAwMDAsIDB4MDBlZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMGM2LAorCTB4MDA2NiwgMHgwMDI2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhiN2UwLAorCTB4MmMxMCwgMHg3NjM4LCAweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLCAweDA1MTgsIDB4MjIwMCwgMHhhYzA2LAorCTB4MTFlMCwgMHg3MDM4LCAweGFjMzYsIDB4MTExMCwgMHg2NjBjLCAweDc2M2EsIDB4NzAzNCwgMHhhYzM2LAorCTB4MTE0MCwgMHgyYzAwLCAweGFmMzYsIDB4MDExOCwgMHgyZjAwLCAweDcwMzYsIDB4MDAxMCwgMHg3MDM3LAorCTB4MDAwMCwgMHg2NjBjLCAweDJjMDAsIDB4YWYwNiwgMHgwMTEwLCAweDdlMGUsIDB4MDAwOCwgMHgyNjc4LAorCTB4NjAwZiwgMHgwMDAwLCAweGEwODUsIDB4MDAwMSwgMHgwMDIwLCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLAorCTB4MDhkOCwgMHgwMTJlLCAweDAwMGUsIDB4MDAyZSwgMHgwMDZlLCAweDAwY2UsIDB4MDBlZSwgMHgwMGZlLAorCTB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwNjYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YjdlMCwgMHg3NjBjLCAweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLAorCTB4MDkwNCwgMHg4MzIzLCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4YTIwNiwgMHgxOTA0LAorCTB4ODMxZSwgMHg3MDI0LCAweGFjMDYsIDB4MTUwOCwgMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwgMHhhMDA1LAorCTB4MDkwNCwgMHg4MmZhLCAweDA4MGMsIDB4N2Q3YSwgMHg2OGMzLCAweDAwMDAsIDB4MDgwYywgMHg4MjRkLAorCTB4NzAyNywgMHgwMDAwLCAweDAwMzYsIDB4MjA2OSwgMHgwMTQwLCAweDZiMDQsIDB4YTM4NCwgMHgxMDAwLAorCTB4MDEyMCwgMHg2ODAzLCAweDAxMDAsIDB4NjgwMywgMHgwMDAwLCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LAorCTB4ZDA4NCwgMHgwMTEwLCAweDY4MjcsIDB4MDAwMSwgMHgwMDNlLCAweDcwMGMsIDB4YWMzNiwgMHgxMTEwLAorCTB4NjYwYywgMHg3NjBlLCAweDcwMDgsIDB4YWMzNiwgMHgxMTQwLCAweDJjMDAsIDB4YWYzNiwgMHgwMTE4LAorCTB4MmYwMCwgMHg3MDBhLCAweDAwMTAsIDB4NzAwYiwgMHgwMDAwLCAweDY2MGMsIDB4MDA2NiwgMHgyYzAwLAorCTB4YWYwNiwgMHgwMTEwLCAweDdlMGUsIDB4MDAwOCwgMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwgMHgwODBjLAorCTB4OWU0NywgMHgxMTU4LCAweDA4MGMsIDB4MmNjMiwgMHgwODBjLCAweDllNTgsIDB4MTFmMCwgMHgwODBjLAorCTB4OGMxOSwgMHgwMGQ4LCAweDA4MGMsIDB4ODI0ZCwgMHgwOGMwLCAweDA4MGMsIDB4OWU1OCwgMHgxMTE4LAorCTB4MDgwYywgMHg4YzE5LCAweDAwOTAsIDB4NjAxMCwgMHgyMDY4LCAweDA4MGMsIDB4OWM1YSwgMHgwMTY4LAorCTB4NjAxYywgMHhhMDg2LCAweDAwMDMsIDB4MTFmOCwgMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LAorCTB4MDAwMCwgMHgwODBjLCAweDU0MDgsIDB4MDgwYywgMHg5ZTExLCAweDA4MGMsIDB4YTAxZiwgMHgwODBjLAorCTB4OWUxZCwgMHgwODBjLCAweDgxMWUsIDB4MDBjZSwgMHgwODA0LCAweDgyYTcsIDB4MmM3OCwgMHg2MDBjLAorCTB4MjA2MCwgMHgwODA0LCAweDgyYTcsIDB4MDEyZSwgMHgwMDBlLCAweDAwNmUsIDB4MDBjZSwgMHgwMGRlLAorCTB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4NjAxYywgMHhhMDg2LCAweDAwMDYsIDB4MWQzMCwgMHgwODBjLAorCTB4YjA5OSwgMHgwYzE4LCAweDAwMzYsIDB4MDE1NiwgMHgwMTM2LCAweDAxNDYsIDB4MzkwOCwgMHhhMDA2LAorCTB4YTE5MCwgMHgwMDIwLCAweDIyMWMsIDB4YTM5ZSwgMHgyYWI3LCAweDExMTgsIDB4ODIxMCwgMHg4MDAwLAorCTB4MGNjOCwgMHhhMDA1LCAweDAxMzgsIDB4MjBhOSwgMHgwMDIwLCAweDIxOTgsIDB4YTExMCwgMHgyMmEwLAorCTB4MjJjOCwgMHg1M2EzLCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLCAweDAwM2UsIDB4MDAwNSwgMHgwMGQ2LAorCTB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzZkZCwgMHgyMGEzLCAweDAyMDAsIDB4MjBhMywgMHgwMDE0LAorCTB4NjBjMywgMHgwMDE0LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjA5OSwgMHhiN2I5LAorCTB4MjBhOSwgMHgwMDA0LCAweDUzYTYsIDB4MjBhMywgMHgwMDA0LCAweDIwYTMsIDB4Nzg3OCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MDgwYywgMHg3ZDY3LCAweDAwZGUsIDB4MDAwNSwgMHgyMGExLAorCTB4MDIwYiwgMHgwODBjLCAweDc2ZGQsIDB4MjBhMywgMHgwMjE0LCAweDIwYTMsIDB4MDAxOCwgMHgyMGEzLAorCTB4MDgwMCwgMHg3ODEwLCAweGEwODQsIDB4ZmYwMCwgMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MTAsIDB4YTA4NCwgMHgwMGZmLAorCTB4MjBhMiwgMHg3ODI4LCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLAorCTB4MDAxOCwgMHgwODBjLCAweDdkNjcsIDB4MDAwNSwgMHgwMGQ2LCAweDAwMTYsIDB4MmY2OCwgMHgyMDA5LAorCTB4MDAzNSwgMHgwODBjLCAweGExMGEsIDB4MTkwNCwgMHg4NDAyLCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLAorCTB4NzY0MSwgMHgyMGEzLCAweDEzMDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MjgsIDB4MjA2OCwgMHg2ODFjLAorCTB4YTA4NiwgMHgwMDAzLCAweDA1ODAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAxNCwgMHgyMDAxLAorCTB4YjUzNSwgMHgyMDA0LCAweGQwYWMsIDB4MTFkMCwgMHhhMjg2LCAweDAwN2UsIDB4MTEyOCwgMHgyMGEzLAorCTB4MDBmZiwgMHgyMGEzLCAweGZmZmUsIDB4MDRiOCwgMHhhMjg2LCAweDAwN2YsIDB4MTEyOCwgMHgyMGEzLAorCTB4MDBmZiwgMHgyMGEzLCAweGZmZmQsIDB4MDQ3OCwgMHhkMmJjLCAweDAxODAsIDB4YTI4NiwgMHgwMDgwLAorCTB4MTEyOCwgMHgyMGEzLCAweDAwZmYsIDB4MjBhMywgMHhmZmZjLCAweDA0MjgsIDB4YTJlOCwgMHhiNjM1LAorCTB4MmQ2YywgMHg2ODEwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDAwZTgsIDB4MjBhMywgMHgwMDAwLAorCTB4NjA5OCwgMHgyMGEyLCAweDAwYzAsIDB4MjAwMSwgMHhiNTM1LCAweDIwMDQsIDB4ZDBhYywgMHgxMTM4LAorCTB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMDgyLCAweDAwN2UsIDB4MDI0MCwgMHgwMGQ2LAorCTB4MjA2OSwgMHhiNTFjLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDAwZGUsIDB4MDAyMCwgMHgyMGEzLAorCTB4MDAwMCwgMHg2MDM0LCAweDIwYTIsIDB4NzgzNCwgMHgyMGEyLCAweDc4MzgsIDB4MjBhMiwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDBjLCAweDA4MGMsIDB4N2Q2NywgMHgwMDFlLAorCTB4MDBkZSwgMHgwMDA1LCAweDc4MTcsIDB4MDAwMSwgMHg3ODAzLCAweDAwMDYsIDB4MDAxZSwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMGQ2LCAweDAwMjYsIDB4NzkyOCwgMHgyMTY4LCAweDY5MWMsIDB4YTE4NiwgMHgwMDA2LAorCTB4MDFjMCwgMHhhMTg2LCAweDAwMDMsIDB4MDkwNCwgMHg4NDc4LCAweGExODYsIDB4MDAwNSwgMHgwOTA0LAorCTB4ODQ2MSwgMHhhMTg2LCAweDAwMDQsIDB4MDViOCwgMHhhMTg2LCAweDAwMDgsIDB4MDkwNCwgMHg4NDY5LAorCTB4NzgwNywgMHgwMDM3LCAweDc4MTMsIDB4MTcwMCwgMHgwODBjLCAweDg0ZTAsIDB4MDAyZSwgMHgwMGRlLAorCTB4MDAwNSwgMHgwODBjLCAweDg0OWMsIDB4MjAwOSwgMHg0MDAwLCAweDY4MDAsIDB4MDAwMiwgMHg4NDQyLAorCTB4ODQ0ZCwgMHg4NDQ0LCAweDg0NGQsIDB4ODQ0OSwgMHg4NDQyLCAweDg0NDIsIDB4ODQ0ZCwgMHg4NDRkLAorCTB4ODQ0ZCwgMHg4NDRkLCAweDg0NDIsIDB4ODQ0MiwgMHg4NDQyLCAweDg0NDIsIDB4ODQ0MiwgMHg4NDRkLAorCTB4ODQ0MiwgMHg4NDRkLCAweDA4MGMsIDB4MTUxNSwgMHg2ODIwLCAweGQwZTQsIDB4MDExMCwgMHhkMGNjLAorCTB4MDExMCwgMHhhMDBlLCAweDAwMTAsIDB4MjAwOSwgMHgyMDAwLCAweDY4MjgsIDB4MjBhMiwgMHg2ODJjLAorCTB4MjBhMiwgMHgwODA0LCAweDg0OTIsIDB4MDgwYywgMHg4NDljLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMDA5LCAweDQwMDAsIDB4NmEwMCwgMHhhMjg2LCAweDAwMDIsIDB4MTEwOCwgMHhhMDBlLAorCTB4MDQ4OCwgMHgwNGQxLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjAwOSwgMHg0MDAwLAorCTB4MDQ0OCwgMHgwNDkxLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjAwOSwgMHg0MDAwLAorCTB4YTI4NiwgMHgwMDA1LCAweDAxMTgsIDB4YTI4NiwgMHgwMDAyLCAweDExMDgsIDB4YTAwZSwgMHgwMGQwLAorCTB4MDQxOSwgMHg2ODEwLCAweDIwNjgsIDB4Njk3YywgMHg2ODEwLCAweGExMTIsIDB4Njk4MCwgMHg2ODE0LAorCTB4YTEwMywgMHgyMGEyLCAweDIyYTIsIDB4NzkyOCwgMHhhMTgwLCAweDAwMDAsIDB4MjAwNCwgMHhhMDhlLAorCTB4MDAwMiwgMHgwMTMwLCAweGEwOGUsIDB4MDAwNCwgMHgwMTE4LCAweDIwMDksIDB4NDAwMCwgMHgwMDEwLAorCTB4MjAwOSwgMHgwMDAwLCAweDIxYTIsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAxOCwgMHgwODBjLAorCTB4N2Q2NywgMHgwMDJlLCAweDAwZGUsIDB4MDAwNSwgMHgwMDM2LCAweDAwNDYsIDB4MDA1NiwgMHgwMDY2LAorCTB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzZkZCwgMHhhMDA2LCAweDIwYTMsIDB4MDIwMCwgMHgyMGEyLAorCTB4NzkzNCwgMHgyMWEyLCAweDc5MzgsIDB4MjFhMiwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LAorCTB4MjAxMSwgMHhiNTM1LCAweDIyMTQsIDB4ZDJhYywgMHgxMTE4LCAweGEwOTIsIDB4MDA3ZSwgMHgwMjY4LAorCTB4MDBkNiwgMHgyMDY5LCAweGI1MWMsIDB4MmQyYywgMHg4ZDY4LCAweDJkMzQsIDB4YTBlOCwgMHhiNjM1LAorCTB4MmQ2YywgMHg2YjEwLCAweDZjMTQsIDB4MDBkZSwgMHgwMDMwLCAweDIwMTksIDB4MDAwMCwgMHg2NDk4LAorCTB4MjAyOSwgMHgwMDAwLCAweDY2MzQsIDB4NzgyOCwgMHhhMDgwLCAweDAwMDcsIDB4MjAwNCwgMHhhMDg2LAorCTB4MDAwMywgMHgxMTI4LCAweDI1YTIsIDB4MjZhMiwgMHgyM2EyLCAweDI0YTIsIDB4MDAyMCwgMHgyM2EyLAorCTB4MjRhMiwgMHgyNWEyLCAweDI2YTIsIDB4MDA2ZSwgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDA1LAorCTB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzZkZCwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDA5LCAweDc4MTAsIDB4MjBhMiwgMHg2MGMzLCAweDAwMDgsIDB4MDgwYywgMHg3ZDY3LAorCTB4MDAwNSwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NjM5LCAweDIwYTMsIDB4MTQwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHg3ODM0LCAweDIwYTIsIDB4NzgzOCwgMHgyMGEyLCAweDc4MjgsIDB4MjBhMiwgMHg3ODJjLAorCTB4MjBhMiwgMHg3ODMwLCAweGEwODQsIDB4MDBmZiwgMHg4MDA3LCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4NjBjMywgMHgwMDEwLCAweDA4MGMsIDB4N2Q2NywgMHgwMDA1LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLAorCTB4NzZkNSwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MjgsIDB4MjBhMiwgMHg3ODEwLAorCTB4MjBhMiwgMHg2MGMzLCAweDAwMDgsIDB4MDgwYywgMHg3ZDY3LCAweDAwMDUsIDB4MDE0NiwgMHgyMGExLAorCTB4MDIwYiwgMHgwMDMxLCAweDYwYzMsIDB4MDAwMCwgMHgwODBjLCAweDdkNjcsIDB4MDE0ZSwgMHgwMDA1LAorCTB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LAorCTB4MjAxMSwgMHhiNTM1LCAweDIyMTQsIDB4ZDJhYywgMHgxMTEwLCAweGQwYmMsIDB4MDE4OCwgMHgwMGQ2LAorCTB4YTBlOCwgMHhiNjM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDAzMDAsIDB4MjBhMiwgMHg2ODE0LAorCTB4MjBhMiwgMHgyMDY5LCAweGI1MWMsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MDBkZSwgMHgwMDc4LAorCTB4MDBkNiwgMHhhMGU4LCAweGI2MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDMwMCwgMHgyMGEyLAorCTB4NjgxNCwgMHgyMGEyLCAweDAwZGUsIDB4MjBhMywgMHgwMDAwLCAweDYyMzQsIDB4MjJhMiwgMHgyMGEzLAorCTB4MDgxOSwgMHgyMGEzLCAweDAwMDAsIDB4MDgwYywgMHg3ZDU2LCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4MmZhMiwgMHg3YTA4LCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgwMDA1LAorCTB4MjBhMSwgMHgwMjBiLCAweDAwNzksIDB4NzkxMCwgMHgyMWEyLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLAorCTB4MDAwMCwgMHgyMGUxLCAweDkwODAsIDB4NjBhNywgMHg5NTc1LCAweDA4MGMsIDB4N2Q3MSwgMHgwODBjLAorCTB4NmEwNywgMHgwMDA1LCAweDAxNTYsIDB4MDEzNiwgMHgwMDM2LCAweDAwZDYsIDB4MDBlNiwgMHgyMGUxLAorCTB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4Nzg1NCwgMHgyMDY4LCAweGFkZjAsIDB4MDAwZiwgMHg3MjEwLAorCTB4YTI5NiwgMHgwMGMwLCAweGEyOTQsIDB4ZmZmZCwgMHg3MjEyLCAweDcyMTQsIDB4YTI5NCwgMHgwMzAwLAorCTB4NzIxNiwgMHg3MTAwLCAweGExOTQsIDB4MDBmZiwgMHg3MzA4LCAweGEzODQsIDB4MDBmZiwgMHhhMDhkLAorCTB4YzIwMCwgMHg3MTAyLCAweGEzODQsIDB4ZmYwMCwgMHhhMjE1LCAweDcyMGEsIDB4NzAwNCwgMHg3MjBjLAorCTB4NzAwZSwgMHg3MjA2LCAweDIwYTksIDB4MDAwYSwgMHgyZTk4LCAweDUzYTYsIDB4NjBhMywgMHgwMDM1LAorCTB4NmEzOCwgMHhhMjk0LCAweDcwMDAsIDB4YTI4NiwgMHgzMDAwLCAweDAxMTAsIDB4NjBhMywgMHgwMDM3LAorCTB4MDBlZSwgMHgwMGRlLCAweDAwM2UsIDB4MDEzZSwgMHgwMTVlLCAweDAwMDUsIDB4MjAwOSwgMHgwMDkyLAorCTB4MDAxMCwgMHgyMDA5LCAweDAwOTYsIDB4NjBhYiwgMHgwMDM2LCAweDYxMTYsIDB4MDAwNSwgMHgyMDYxLAorCTB4YmQwMCwgMHgyYTcwLCAweDcwNjgsIDB4NzA0YSwgMHg3MDRmLCAweGJkMDAsIDB4MDAwNSwgMHgwMGU2LAorCTB4MDEyNiwgMHgyMDcxLCAweGI1MDAsIDB4MjA5MSwgMHg4MDAwLCAweDc1NDgsIDB4YTU4MiwgMHgwMDEwLAorCTB4MDYwOCwgMHg3MDRjLCAweDIwNjAsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDE0OCwgMHhhY2UwLAorCTB4MDAxOCwgMHg3MDVjLCAweGFjMDIsIDB4MTIwOCwgMHgwY2IwLCAweDIwNjEsIDB4YmQwMCwgMHgwYzk4LAorCTB4NjAwMywgMHgwMDA4LCAweDg1MjksIDB4NzU0YSwgMHhhY2E4LCAweDAwMTgsIDB4NzA1YywgMHhhNTAyLAorCTB4MTIzMCwgMHg3NTRlLCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHg3MDRmLAorCTB4YmQwMCwgMHgwY2MwLCAweGEwMDYsIDB4MGNjMCwgMHgwMGU2LCAweDIwNzEsIDB4YjUwMCwgMHg3NTQ4LAorCTB4YTU4MiwgMHgwMDEwLCAweDA2MDAsIDB4NzA0YywgMHgyMDYwLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAwLAorCTB4MDE0OCwgMHhhY2UwLCAweDAwMTgsIDB4NzA1YywgMHhhYzAyLCAweDEyMDgsIDB4MGNiMCwgMHgyMDYxLAorCTB4YmQwMCwgMHgwYzk4LCAweDYwMDMsIDB4MDAwOCwgMHg4NTI5LCAweDc1NGEsIDB4YWNhOCwgMHgwMDE4LAorCTB4NzA1YywgMHhhNTAyLCAweDEyMjgsIDB4NzU0ZSwgMHhhMDg1LCAweDAwMDEsIDB4MDBlZSwgMHgwMDA1LAorCTB4NzA0ZiwgMHhiZDAwLCAweDBjYzgsIDB4YTAwNiwgMHgwY2M4LCAweGFjODIsIDB4YmQwMCwgMHgwYTBjLAorCTB4MTUxNSwgMHgyMDAxLCAweGI1MTcsIDB4MjAwNCwgMHhhYzAyLCAweDFhMGMsIDB4MTUxNSwgMHhhMDA2LAorCTB4NjAwNiwgMHg2MDBhLCAweDYwMGUsIDB4NjAxMiwgMHg2MDE2LCAweDYwMWEsIDB4NjAxZiwgMHgwMDAwLAorCTB4NjAwMywgMHgwMDAwLCAweDYwNTIsIDB4NjA1NiwgMHg2MDIyLCAweDYwMjYsIDB4NjAyYSwgMHg2MDJlLAorCTB4NjAzMiwgMHg2MDM2LCAweDYwM2EsIDB4NjAzZSwgMHgyMDYxLCAweGI1MDAsIDB4NjA0OCwgMHg4MDAwLAorCTB4NjA0YSwgMHhhMDg2LCAweDAwMDEsIDB4MDEwOCwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg3MTczLCAweDAxMmUsIDB4MGNjMCwgMHg2MDFjLCAweGEwODQsIDB4MDAwZiwgMHgwMDAyLAorCTB4ODY1YiwgMHg4NjZhLCAweDg2ODUsIDB4ODZhMCwgMHhhMTUyLCAweGExNmQsIDB4YTE4OCwgMHg4NjViLAorCTB4ODY2YSwgMHg4NjViLCAweDg2YmIsIDB4YTE4NiwgMHgwMDEzLCAweDExMjgsIDB4MDgwYywgMHg3MDkwLAorCTB4MDgwYywgMHg3MTczLCAweDAwMDUsIDB4YTE4ZSwgMHgwMDQ3LCAweDExMTgsIDB4YTAxNiwgMHgwODBjLAorCTB4MTg1ZSwgMHgwMDA1LCAweDAwNjYsIDB4NjAwMCwgMHhhMGIyLCAweDAwMTAsIDB4MWEwYywgMHgxNTE1LAorCTB4MDAxMywgMHgwMDZlLCAweDAwMDUsIDB4ODY4MywgMHg4YTliLCAweDhjNTMsIDB4ODY4MywgMHg4Y2M4LAorCTB4ODc3OSwgMHg4NjgzLCAweDg2ODMsIDB4OGEyZCwgMHg5MGVmLCAweDg2ODMsIDB4ODY4MywgMHg4NjgzLAorCTB4ODY4MywgMHg4NjgzLCAweDg2ODMsIDB4MDgwYywgMHgxNTE1LCAweDAwNjYsIDB4NjAwMCwgMHhhMGIyLAorCTB4MDAxMCwgMHgxYTBjLCAweDE1MTUsIDB4MDAxMywgMHgwMDZlLCAweDAwMDUsIDB4ODY5ZSwgMHg5NzIyLAorCTB4ODY5ZSwgMHg4NjllLCAweDg2OWUsIDB4ODY5ZSwgMHg4NjllLCAweDg2OWUsIDB4OTZjZCwgMHg5ODhlLAorCTB4ODY5ZSwgMHg5NzRmLCAweDk3YzYsIDB4OTc0ZiwgMHg5N2M2LCAweDg2OWUsIDB4MDgwYywgMHgxNTE1LAorCTB4MDA2NiwgMHg2MDAwLCAweGEwYjIsIDB4MDAxMCwgMHgxYTBjLCAweDE1MTUsIDB4MDAxMywgMHgwMDZlLAorCTB4MDAwNSwgMHg4NmI5LCAweDkxMzAsIDB4OTFmYSwgMHg5MzM1LCAweDk0OTEsIDB4ODZiOSwgMHg4NmI5LAorCTB4ODZiOSwgMHg5MTBhLCAweDk2N2QsIDB4OTY4MCwgMHg4NmI5LCAweDg2YjksIDB4ODZiOSwgMHg4NmI5LAorCTB4OTZhYSwgMHgwODBjLCAweDE1MTUsIDB4MDA2NiwgMHg2MDAwLCAweGEwYjIsIDB4MDAxMCwgMHgxYTBjLAorCTB4MTUxNSwgMHgwMDEzLCAweDAwNmUsIDB4MDAwNSwgMHg4NmQ0LCAweDg2ZDQsIDB4ODZkNCwgMHg4NzAyLAorCTB4ODc0ZiwgMHg4NmQ0LCAweDg2ZDQsIDB4ODZkNCwgMHg4NmQ2LCAweDg2ZDQsIDB4ODZkNCwgMHg4NmQ0LAorCTB4ODZkNCwgMHg4NmQ0LCAweDg2ZDQsIDB4ODZkNCwgMHgwODBjLCAweDE1MTUsIDB4YTE4NiwgMHgwMDAzLAorCTB4MTkwYywgMHgxNTE1LCAweDAwZDYsIDB4NjAwMywgMHgwMDAzLCAweDYxMDYsIDB4NjAxMCwgMHgyMDY4LAorCTB4Njg0ZiwgMHgwMDQwLCAweDY4N2MsIDB4NjgwYSwgMHg2ODgwLCAweDY4MGUsIDB4NjgxMywgMHgwMDAwLAorCTB4NjgxNywgMHgwMDAwLCAweDY4NTQsIDB4YTA5MiwgMHgxOTlhLCAweDAyMTAsIDB4MjAwMSwgMHgxOTk5LAorCTB4ODAwMywgMHg4MDEzLCAweDgyMTMsIDB4YTIxMCwgMHg2MjE2LCAweDAwZGUsIDB4MmMxMCwgMHgwODBjLAorCTB4MWZhOSwgMHgwODBjLCAweDZjZjAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg3MjMwLAorCTB4MDEyZSwgMHgwMDA1LCAweGExODIsIDB4MDA0NywgMHgwMDAyLCAweDg3MGUsIDB4ODcwZSwgMHg4NzEwLAorCTB4ODcyOSwgMHg4NzBlLCAweDg3MGUsIDB4ODcwZSwgMHg4NzBlLCAweDg3M2IsIDB4MDgwYywgMHgxNTE1LAorCTB4MDBkNiwgMHgwMDE2LCAweDA4MGMsIDB4NzEyNiwgMHgwODBjLCAweDcyMzAsIDB4NjAwMywgMHgwMDA0LAorCTB4NjExMCwgMHgyMTY4LCAweDY4NGYsIDB4MDAyMCwgMHg2ODVjLCAweDY4NWEsIDB4Njg3NCwgMHg2ODdlLAorCTB4Njg3OCwgMHg2ODgyLCAweDY4OTcsIDB4MDAwMCwgMHg2ODliLCAweDAwMDAsIDB4MDAxZSwgMHgwMGRlLAorCTB4MDAwNSwgMHgwODBjLCAweDcxMjYsIDB4MDBkNiwgMHg2MTEwLCAweDIxNjgsIDB4MDgwYywgMHg5YzVhLAorCTB4MDEyMCwgMHg2ODRiLCAweDAwMDYsIDB4MDgwYywgMHg1NDA4LCAweDAwZGUsIDB4MDgwYywgMHg4NjFkLAorCTB4MDgwYywgMHg3MjMwLCAweDAwMDUsIDB4MDgwYywgMHg3MTI2LCAweDA4MGMsIDB4MmM5YywgMHgwMGQ2LAorCTB4NjExMCwgMHgyMTY4LCAweDA4MGMsIDB4OWM1YSwgMHgwMTIwLCAweDY4NGIsIDB4MDAyOSwgMHgwODBjLAorCTB4NTQwOCwgMHgwMGRlLCAweDA4MGMsIDB4ODYxZCwgMHgwODBjLCAweDcyMzAsIDB4MDAwNSwgMHhhMTgyLAorCTB4MDA0NywgMHgwMDAyLCAweDg3NWQsIDB4ODc2YywgMHg4NzViLCAweDg3NWIsIDB4ODc1YiwgMHg4NzViLAorCTB4ODc1YiwgMHg4NzViLCAweDg3NWIsIDB4MDgwYywgMHgxNTE1LCAweDAwZDYsIDB4NjAxMCwgMHgyMDY4LAorCTB4Njg0YywgMHhjMGY0LCAweDY4NGUsIDB4MDBkZSwgMHgyMGUxLCAweDAwMDUsIDB4M2QxOCwgMHgzZTIwLAorCTB4MmMxMCwgMHgwODBjLCAweDE4NWUsIDB4MDAwNSwgMHgwMGQ2LCAweDYxMTAsIDB4MjE2OCwgMHg2ODRiLAorCTB4MDAwMCwgMHg2ODUzLCAweDAwMDAsIDB4MDgwYywgMHg1NDA4LCAweDAwZGUsIDB4MDgwYywgMHg4NjFkLAorCTB4MDAwNSwgMHhhMWI2LCAweDAwMTUsIDB4MTExOCwgMHgwODBjLCAweDg2MWQsIDB4MDAzMCwgMHhhMWI2LAorCTB4MDAxNiwgMHgxOTBjLCAweDE1MTUsIDB4MDgwYywgMHg4NjFkLCAweDAwMDUsIDB4MjBhOSwgMHgwMDBlLAorCTB4MmU5OCwgMHg2MDEwLCAweDIwYTAsIDB4NTNhMywgMHgyMGE5LCAweDAwMDYsIDB4MzMxMCwgMHgzNDIwLAorCTB4OTM5OCwgMHg5NGEwLCAweDMzMTgsIDB4MzQyOCwgMHgyMjJlLCAweDIzMjYsIDB4YTI5MCwgMHgwMDAyLAorCTB4YTVhOCwgMHgwMDAyLCAweGEzOTgsIDB4MDAwMiwgMHhhNGEwLCAweDAwMDIsIDB4MWYwNCwgMHg4Nzk0LAorCTB4MDBlNiwgMHgwODBjLCAweDljNWEsIDB4MDEzMCwgMHg2MDEwLCAweDIwNzAsIDB4NzAwNywgMHgwMDAwLAorCTB4NzAzNywgMHgwMTAzLCAweDAwZWUsIDB4MDgwYywgMHg4NjFkLCAweDAwMDUsIDB4MDBkNiwgMHgwMDM2LAorCTB4NzMzMCwgMHhhMzg2LCAweDAyMDAsIDB4MTEzMCwgMHg2MDE4LCAweDIwNjgsIDB4NjgxMywgMHgwMGZmLAorCTB4NjgxNywgMHhmZmZkLCAweDYwMTAsIDB4YTAwNSwgMHgwMTMwLCAweDIwNjgsIDB4NjgwNywgMHgwMDAwLAorCTB4NjgzNywgMHgwMTAzLCAweDZiMzIsIDB4MDgwYywgMHg4NjFkLCAweDAwM2UsIDB4MDBkZSwgMHgwMDA1LAorCTB4MDAxNiwgMHgyMGE5LCAweDAwMmEsIDB4YWU4MCwgMHgwMDBjLCAweDIwOTgsIDB4NjAxMCwgMHhhMDgwLAorCTB4MDAwMiwgMHgyMGEwLCAweDUzYTMsIDB4MjBhOSwgMHgwMDJhLCAweDYwMTAsIDB4YTA4MCwgMHgwMDAxLAorCTB4MjAwNCwgMHhhMDgwLCAweDAwMDIsIDB4MjBhMCwgMHg1M2EzLCAweDAwZTYsIDB4NjAxMCwgMHgyMDA0LAorCTB4MjA3MCwgMHg3MDM3LCAweDAxMDMsIDB4MDBlZSwgMHgwODBjLCAweDg2MWQsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDAxNiwgMHgyMDA5LCAweDAwMDAsIDB4NzAzMCwgMHhhMDg2LCAweDAxMDAsIDB4MDE0MCwgMHg3MDM4LAorCTB4YTA4NCwgMHgwMGZmLCAweDgwMGMsIDB4NzAzYywgMHhhMDg0LCAweDAwZmYsIDB4ODAwNCwgMHhhMDgwLAorCTB4MDAwNCwgMHhhMTA4LCAweDIxYTgsIDB4YWU4MCwgMHgwMDBjLCAweDIwOTgsIDB4NjAxMCwgMHhhMDgwLAorCTB4MDAwMiwgMHgyMGEwLCAweDA4MGMsIDB4NGI4ZiwgMHgwMGU2LCAweDA4MGMsIDB4OWM1YSwgMHgwMTQwLAorCTB4NjAxMCwgMHgyMDcwLCAweDcwMDcsIDB4MDAwMCwgMHg3MDM0LCAweDcwYjIsIDB4NzAzNywgMHgwMTAzLAorCTB4MDBlZSwgMHgwODBjLCAweDg2MWQsIDB4MDAxZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBkNiwgMHg2MDNmLAorCTB4MDAwMCwgMHgyYzY4LCAweDAwMTYsIDB4MjAwOSwgMHgwMDM1LCAweDA4MGMsIDB4YTEwYSwgMHgwMDFlLAorCTB4MTE2OCwgMHgwMDI2LCAweDYyMjgsIDB4MjI2OCwgMHgwMDJlLCAweDIwNzEsIDB4YmI4YywgMHg2YjFjLAorCTB4YTM4NiwgMHgwMDAzLCAweDAxMzAsIDB4YTM4NiwgMHgwMDA2LCAweDAxMjgsIDB4MDgwYywgMHg4NjFkLAorCTB4MDAyMCwgMHgwMDMxLCAweDAwMTAsIDB4MDgwYywgMHg4OGY2LCAweDAwZGUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDBmNiwgMHg2ODEwLCAweDIwNzgsIDB4YTE4NiwgMHgwMDE1LCAweDA5MDQsIDB4ODhkZCwgMHhhMThlLAorCTB4MDAxNiwgMHgxOTA0LCAweDg4ZjQsIDB4NzAwYywgMHhhMDhjLCAweGZmMDAsIDB4YTE4NiwgMHgxNzAwLAorCTB4MDEyMCwgMHhhMTg2LCAweDAzMDAsIDB4MTkwNCwgMHg4OGJjLCAweDhmZmYsIDB4MTEzOCwgMHg2ODAwLAorCTB4YTA4NiwgMHgwMDBmLCAweDA5MDQsIDB4ODhhMCwgMHgwODA0LCAweDg4ZjIsIDB4NjgwOCwgMHhhMDg2LAorCTB4ZmZmZiwgMHgxOTA0LCAweDg4ZGYsIDB4Nzg0YywgMHhhMDg0LCAweDAwNjAsIDB4YTA4NiwgMHgwMDIwLAorCTB4MTE1MCwgMHg3OTdjLCAweDc4MTAsIDB4YTEwNiwgMHgxOTA0LCAweDg4ZGYsIDB4Nzk4MCwgMHg3ODE0LAorCTB4YTEwNiwgMHgxOTA0LCAweDg4ZGYsIDB4MDgwYywgMHg5ZTExLCAweDY4NTgsIDB4Nzg1MiwgMHg3ODRjLAorCTB4YzBkYywgMHhjMGY0LCAweGMwZDQsIDB4Nzg0ZSwgMHgwMDI2LCAweGEwMGUsIDB4NmExNCwgMHgyMDAxLAorCTB4MDAwYSwgMHgwODBjLCAweDZiNDAsIDB4Nzg1NCwgMHhhMjBhLCAweDAyMDgsIDB4ODAxMSwgMHg3YTU2LAorCTB4ODJmZiwgMHgwMDJlLCAweDExMzgsIDB4MDBjNiwgMHgyZDYwLCAweDA4MGMsIDB4OWEwOSwgMHgwMGNlLAorCTB4MDgwNCwgMHg4OGYyLCAweDAwYzYsIDB4MDBkNiwgMHgyZjY4LCAweDY4MzgsIDB4ZDBmYywgMHgxMTE4LAorCTB4MDgwYywgMHg0YzY0LCAweDAwMTAsIDB4MDgwYywgMHg0ZTQ5LCAweDAwZGUsIDB4MDBjZSwgMHgxOTA0LAorCTB4ODhkZiwgMHgwMGM2LCAweDJkNjAsIDB4MDgwYywgMHg4NjFkLCAweDAwY2UsIDB4MDgwNCwgMHg4OGYyLAorCTB4MDBjNiwgMHgwODBjLCAweDllZDYsIDB4MDE5MCwgMHg2MDEzLCAweDAwMDAsIDB4NjgxOCwgMHg2MDFhLAorCTB4MDgwYywgMHhhMDI3LCAweDYwMWYsIDB4MDAwMywgMHg2OTA0LCAweDAwYzYsIDB4MmQ2MCwgMHgwODBjLAorCTB4ODYxZCwgMHgwMGNlLCAweDA4MGMsIDB4ODY0YywgMHgwMGNlLCAweDA0ZTAsIDB4MjAwMSwgMHhiN2I4LAorCTB4MjAwNCwgMHg2ODNlLCAweDAwY2UsIDB4MDRiMCwgMHg3MDA4LCAweGEwODYsIDB4MDAwYiwgMHgxMWEwLAorCTB4NjAxOCwgMHgyMDBjLCAweGMxYmMsIDB4MjEwMiwgMHgwMGM2LCAweDJkNjAsIDB4Nzg1MywgMHgwMDAzLAorCTB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDFmLCAweDAwMDIsIDB4MDgwYywgMHg2YzhkLAorCTB4MDgwYywgMHg3MTczLCAweDAwY2UsIDB4MDBmMCwgMHg3MDBjLCAweGEwODYsIDB4MmEwMCwgMHgxMTM4LAorCTB4MjAwMSwgMHhiN2I4LCAweDIwMDQsIDB4NjgzZSwgMHgwMGE4LCAweDA0ODEsIDB4MDBhOCwgMHg4ZmZmLAorCTB4MDkwYywgMHgxNTE1LCAweDAwYzYsIDB4MDBkNiwgMHgyZDYwLCAweDJmNjgsIDB4NjgzNywgMHgwMTAzLAorCTB4Njg0YiwgMHgwMDAzLCAweDA4MGMsIDB4OThmZCwgMHgwODBjLCAweDllMTEsIDB4MDgwYywgMHg5ZTFkLAorCTB4MDBkZSwgMHgwMGNlLCAweDA4MGMsIDB4ODYxZCwgMHgwMGZlLCAweDAwMDUsIDB4YTE4NiwgMHgwMDE1LAorCTB4MTEyOCwgMHgyMDAxLCAweGI3YjgsIDB4MjAwNCwgMHg2ODNlLCAweDAwNjgsIDB4YTE4ZSwgMHgwMDE2LAorCTB4MTE2MCwgMHgwMGM2LCAweDJkMDAsIDB4MjA2MCwgMHgwODBjLCAweGIzM2EsIDB4MDgwYywgMHg2YWVmLAorCTB4MDgwYywgMHg4NjFkLCAweDAwY2UsIDB4MDgwYywgMHg4NjFkLCAweDAwMDUsIDB4MDAyNiwgMHgwMDM2LAorCTB4MDA0NiwgMHg3MjI4LCAweDdjODAsIDB4N2I3YywgMHhkMmY0LCAweDAxMzAsIDB4MjAwMSwgMHhiN2I4LAorCTB4MjAwNCwgMHg2ODNlLCAweDA4MDQsIDB4ODk3MCwgMHgwMGM2LCAweDJkNjAsIDB4MDgwYywgMHg5OTFkLAorCTB4MDBjZSwgMHg2ODA0LCAweGEwODYsIDB4MDA1MCwgMHgxMTY4LCAweDAwYzYsIDB4MmQwMCwgMHgyMDYwLAorCTB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDA1MCwgMHgwODBjLCAweDZjOGQsIDB4MDgwYywgMHg3MTczLAorCTB4MDBjZSwgMHgwNGYwLCAweDY4MDAsIDB4YTA4NiwgMHgwMDBmLCAweDAxYzgsIDB4OGZmZiwgMHgwOTBjLAorCTB4MTUxNSwgMHg2ODIwLCAweGQwZGMsIDB4MTE5OCwgMHg2ODAwLCAweGEwODYsIDB4MDAwNCwgMHgxMTk4LAorCTB4Nzg0YywgMHhkMGFjLCAweDAxODAsIDB4Nzg0YywgMHhjMGRjLCAweGMwZjQsIDB4Nzg0ZSwgMHg3ODUwLAorCTB4YzBmNCwgMHhjMGZjLCAweDc4NTIsIDB4MjAwMSwgMHgwMDAxLCAweDY4MmUsIDB4MDBlMCwgMHgyMDAxLAorCTB4MDAwNywgMHg2ODJlLCAweDAwYzAsIDB4Nzg0YywgMHhkMGI0LCAweDExMzAsIDB4ZDBhYywgMHgwZGI4LAorCTB4Nzg0YywgMHhkMGY0LCAweDFkYTAsIDB4MGMzOCwgMHhkMmVjLCAweDFkODgsIDB4NzAyNCwgMHhhMzA2LAorCTB4MTExOCwgMHg3MDIwLCAweGE0MDYsIDB4MGQ1OCwgMHg3MDIwLCAweDY4MzYsIDB4NzAyNCwgMHg2ODNhLAorCTB4MjAwMSwgMHgwMDA1LCAweDY4MmUsIDB4MDgwYywgMHg5ZjYzLCAweDA4MGMsIDB4NzE3MywgMHgwMDEwLAorCTB4MDgwYywgMHg4NjFkLCAweDAwNGUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGQ2LAorCTB4MDAyNiwgMHg2MDM0LCAweDIwNjgsIDB4NmExYywgMHhhMjg2LCAweDAwMDcsIDB4MDkwNCwgMHg4OWQ0LAorCTB4YTI4NiwgMHgwMDAyLCAweDA5MDQsIDB4ODlkNCwgMHhhMjg2LCAweDAwMDAsIDB4MDkwNCwgMHg4OWQ0LAorCTB4NjgwOCwgMHg2MzM4LCAweGEzMDYsIDB4MTkwNCwgMHg4OWQ0LCAweDIwNzEsIDB4YmI4YywgMHhhMTg2LAorCTB4MDAxNSwgMHgwNWUwLCAweGExOGUsIDB4MDAxNiwgMHgxMTkwLCAweDYwMzAsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4NiwgMHgwMDAxLCAweDExNjAsIDB4NzAwYywgMHhhMDg2LCAweDJhMDAsIDB4MTE0MCwgMHg2MDM0LAorCTB4YTA4MCwgMHgwMDA4LCAweDIwMGMsIDB4YzFkZCwgMHhjMWY1LCAweDIxMDIsIDB4MDQzOCwgMHgwMGM2LAorCTB4NjAzNCwgMHgyMDYwLCAweDYxMDQsIDB4YTE4NiwgMHgwMDRiLCAweDAxYTAsIDB4YTE4NiwgMHgwMDRjLAorCTB4MDE4OCwgMHhhMTg2LCAweDAwNGQsIDB4MDE3MCwgMHhhMTg2LCAweDAwNGUsIDB4MDE1OCwgMHhhMTg2LAorCTB4MDA1MiwgMHgwMTQwLCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLCAweDljNWEsIDB4MDkwYywgMHgxNTE1LAorCTB4Njg1MywgMHgwMDAzLCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAxZiwgMHgwMDAyLAorCTB4MDgwYywgMHg2YzhkLCAweDA4MGMsIDB4NzE3MywgMHgwMGNlLCAweDAwMzAsIDB4NjAzNCwgMHgyMDcwLAorCTB4MjAwMSwgMHhiN2I4LCAweDIwMDQsIDB4NzAzZSwgMHgwODBjLCAweDg2MWQsIDB4MDAyZSwgMHgwMGRlLAorCTB4MDBlZSwgMHgwMDA1LCAweDAwZDYsIDB4MjBhOSwgMHgwMDBlLCAweDJlOTgsIDB4NjAxMCwgMHgyMGEwLAorCTB4NTNhMywgMHhhMWI2LCAweDAwMTUsIDB4MTU1OCwgMHg2MDE4LCAweDIwNjgsIDB4MDE1NiwgMHgwMDM2LAorCTB4MDAyNiwgMHhhZTkwLCAweDAwMGMsIDB4YTI5MCwgMHgwMDA0LCAweDIwYTksIDB4MDAwNCwgMHhhZDk4LAorCTB4MDAwYSwgMHgwODBjLCAweDkwZGEsIDB4MDAyZSwgMHgwMDNlLCAweDAxNWUsIDB4MTFkOCwgMHgwMTU2LAorCTB4MDAzNiwgMHgwMDI2LCAweGFlOTAsIDB4MDAwYywgMHhhMjkwLCAweDAwMDgsIDB4MjBhOSwgMHgwMDA0LAorCTB4YWQ5OCwgMHgwMDA2LCAweDA4MGMsIDB4OTBkYSwgMHgwMDJlLCAweDAwM2UsIDB4MDE1ZSwgMHgxMTUwLAorCTB4NzAzOCwgMHg2ODBhLCAweDcwM2MsIDB4NjgwZSwgMHg2ODAwLCAweGMwOGQsIDB4NjgwMiwgMHgwMGRlLAorCTB4MDgwNCwgMHg4N2EwLCAweDA4MGMsIDB4MmM5YywgMHgwMGM2LCAweDA4MGMsIDB4ODVjNywgMHgyZjAwLAorCTB4NjAxYSwgMHg2MDEzLCAweDAwMDAsIDB4NjAxZiwgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHg2MDAzLAorCTB4MDAwMSwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg0ZWZkLCAweDA4MGMsIDB4NGYyYSwgMHgwODBjLAorCTB4NmNkMywgMHgwODBjLCAweDcxNzMsIDB4MDBjZSwgMHgwYzEwLCAweDIxMDAsIDB4YTFiMiwgMHgwMDgwLAorCTB4MWEwYywgMHgxNTE1LCAweGExYjIsIDB4MDA0MCwgMHgxYTA0LCAweDhhOTEsIDB4MDAwMiwgMHg4YTg1LAorCTB4OGE3OSwgMHg4YTg1LCAweDhhODUsIDB4OGE4NSwgMHg4YTg1LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LAorCTB4OGE3NywgMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LAorCTB4OGE3NywgMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LAorCTB4OGE3NywgMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LCAweDhhNzcsIDB4OGE4NSwgMHg4YTc3LAorCTB4OGE4NSwgMHg4YTg1LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTg1LAorCTB4OGE3NywgMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LAorCTB4OGE3NywgMHg4YTg1LCAweDhhODUsIDB4OGE3NywgMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LAorCTB4OGE3NywgMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTg1LCAweDhhNzcsIDB4OGE3NywgMHgwODBjLAorCTB4MTUxNSwgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgwODBjLCAweDZjZDMsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDcxNzMsIDB4MDEyZSwgMHgwMDA1LCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LAorCTB4MDgwYywgMHg2Y2QzLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NzE3MywgMHgwMTJlLAorCTB4MDAwNSwgMHgyNjAwLCAweDAwMDIsIDB4OGE4NSwgMHg4YTg1LCAweDhhOTksIDB4OGE4NSwgMHg4YTg1LAorCTB4OGE5OSwgMHgwODBjLCAweDE1MTUsIDB4NjAwNCwgMHhhMGIyLCAweDAwODAsIDB4MWEwYywgMHgxNTE1LAorCTB4YTFiNiwgMHgwMDEzLCAweDA5MDQsIDB4OGI0YiwgMHhhMWI2LCAweDAwMjcsIDB4MTkwNCwgMHg4YjExLAorCTB4MDgwYywgMHg3MDkwLCAweDYwMDQsIDB4MDgwYywgMHg5ZTQ3LCAweDAxOTAsIDB4MDgwYywgMHg5ZTU4LAorCTB4MDkwNCwgMHg4YjBiLCAweGEwOGUsIDB4MDAyMSwgMHgwOTA0LCAweDhiMGUsIDB4YTA4ZSwgMHgwMDIyLAorCTB4MDkwNCwgMHg4YjBiLCAweGEwOGUsIDB4MDAzZCwgMHgwOTA0LCAweDhiMGUsIDB4MDgwNCwgMHg4YjA0LAorCTB4MDgwYywgMHgyY2MyLCAweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDRlZmQsIDB4NjAxOCwgMHhhMDgwLAorCTB4MDAyOCwgMHgyMDBjLCAweDA4MGMsIDB4OGMxOSwgMHhhMTg2LCAweDAwN2UsIDB4MTE0OCwgMHgyMDAxLAorCTB4YjUzNSwgMHgyMDE0LCAweGMyODUsIDB4MDgwYywgMHg1YWNmLCAweDExMDgsIDB4YzJhZCwgMHgyMjAyLAorCTB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MjExMCwgMHgwMDI2LCAweDIwMTksIDB4MDAyOCwgMHgwODBjLAorCTB4ODI5OSwgMHgwMDJlLCAweDA4MGMsIDB4YjM4ZCwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDE2LAorCTB4MDAyNiwgMHgwMDM2LCAweDIxMTAsIDB4MjAxOSwgMHgwMDI4LCAweDA4MGMsIDB4NmRmNSwgMHgwMDc2LAorCTB4MjAzOSwgMHgwMDAwLCAweDA4MGMsIDB4NmQwMiwgMHgwMGM2LCAweDYwMTgsIDB4YTA2NSwgMHgwMTEwLAorCTB4MDgwYywgMHg1MWFhLCAweDAwY2UsIDB4MmMwOCwgMHgwODBjLCAweGFlODIsIDB4MDA3ZSwgMHgwMDNlLAorCTB4MDAyZSwgMHgwMDFlLCAweDA4MGMsIDB4NGY2YywgMHgwODBjLCAweGEwMWYsIDB4MDgwYywgMHg4NjFkLAorCTB4MDgwYywgMHg3MTczLCAweDAwMDUsIDB4MDgwYywgMHg4YzE5LCAweDBjYjAsIDB4MDgwYywgMHg4YzQ3LAorCTB4MGM5OCwgMHhhMTg2LCAweDAwMTQsIDB4MWRiMCwgMHgwODBjLCAweDcwOTAsIDB4MDgwYywgMHgyYzljLAorCTB4MDgwYywgMHg5ZTQ3LCAweDExODgsIDB4MDgwYywgMHgyY2MyLCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LAorCTB4MjAwYywgMHgwODBjLCAweDhjMTksIDB4YTE4NiwgMHgwMDdlLCAweDExMjgsIDB4MjAwMSwgMHhiNTM1LAorCTB4MjAwYywgMHhjMTg1LCAweDIxMDIsIDB4MDhjMCwgMHgwODBjLCAweDllNTgsIDB4MTExOCwgMHgwODBjLAorCTB4OGMxOSwgMHgwODkwLCAweDYwMDQsIDB4YTA4ZSwgMHgwMDMyLCAweDExNTgsIDB4MDBlNiwgMHgwMGY2LAorCTB4MjA3MSwgMHhiNTgyLCAweDIwNzksIDB4MDAwMCwgMHgwODBjLCAweDJmY2YsIDB4MDBmZSwgMHgwMGVlLAorCTB4MDgxOCwgMHg2MDA0LCAweGEwOGUsIDB4MDAyMSwgMHgwZDUwLCAweGEwOGUsIDB4MDAyMiwgMHgwOTBjLAorCTB4OGMxOSwgMHgwODA0LCAweDhiMDQsIDB4YTBiMiwgMHgwMDQwLCAweDFhMDQsIDB4OGMwZSwgMHgyMDA4LAorCTB4MDAwMiwgMHg4YjkzLCAweDhiOTQsIDB4OGI5NywgMHg4YjlhLCAweDhiOWQsIDB4OGJhMCwgMHg4YjkxLAorCTB4OGI5MSwgMHg4YjkxLCAweDhiOTEsIDB4OGI5MSwgMHg4YjkxLCAweDhiOTEsIDB4OGI5MSwgMHg4YjkxLAorCTB4OGI5MSwgMHg4YjkxLCAweDhiOTEsIDB4OGI5MSwgMHg4YjkxLCAweDhiOTEsIDB4OGI5MSwgMHg4YjkxLAorCTB4OGI5MSwgMHg4YjkxLCAweDhiOTEsIDB4OGI5MSwgMHg4YjkxLCAweDhiOTEsIDB4OGI5MSwgMHg4YmEzLAorCTB4OGJiMiwgMHg4YjkxLCAweDhiYjQsIDB4OGJiMiwgMHg4YjkxLCAweDhiOTEsIDB4OGI5MSwgMHg4YjkxLAorCTB4OGI5MSwgMHg4YmIyLCAweDhiYjIsIDB4OGI5MSwgMHg4YjkxLCAweDhiOTEsIDB4OGI5MSwgMHg4YjkxLAorCTB4OGI5MSwgMHg4YjkxLCAweDhiOTEsIDB4OGJlZSwgMHg4YmIyLCAweDhiOTEsIDB4OGJhZSwgMHg4YjkxLAorCTB4OGI5MSwgMHg4YjkxLCAweDhiYWYsIDB4OGI5MSwgMHg4YjkxLCAweDhiOTEsIDB4OGJiMiwgMHg4YmU1LAorCTB4OGI5MSwgMHgwODBjLCAweDE1MTUsIDB4MDBmMCwgMHgyMDAxLCAweDAwMGIsIDB4MDQ2MCwgMHgyMDAxLAorCTB4MDAwMywgMHgwNDQ4LCAweDIwMDEsIDB4MDAwNSwgMHgwNDMwLCAweDIwMDEsIDB4MDAwMSwgMHgwNDE4LAorCTB4MjAwMSwgMHgwMDA5LCAweDA0MDAsIDB4MDgwYywgMHg3MDkwLCAweDYwMDMsIDB4MDAwNSwgMHgyMDAxLAorCTB4YjdiOCwgMHgyMDA0LCAweDYwM2UsIDB4MDgwYywgMHg3MTczLCAweDAwYTAsIDB4MDAxOCwgMHgwMDEwLAorCTB4MDgwYywgMHg0ZWZkLCAweDA4MDQsIDB4OGJmZiwgMHgwODBjLCAweDcwOTAsIDB4MjAwMSwgMHhiN2I2LAorCTB4MjAwNCwgMHg2MDE2LCAweDIwMDEsIDB4YjdiOCwgMHgyMDA0LCAweDYwM2UsIDB4NjAwMywgMHgwMDA0LAorCTB4MDgwYywgMHg3MTczLCAweDAwMDUsIDB4MDgwYywgMHg0ZWZkLCAweDA4MGMsIDB4NzA5MCwgMHg2MDAzLAorCTB4MDAwMiwgMHgyMDAxLCAweGI3YjgsIDB4MjAwNCwgMHg2MDNlLCAweDAwMzYsIDB4MjAxOSwgMHhiNTVkLAorCTB4MjMwNCwgMHhhMDg0LCAweGZmMDAsIDB4MTEyMCwgMHgyMDAxLCAweGI3YjYsIDB4MjAxYywgMHgwMDQwLAorCTB4ODAwNywgMHhhMDlhLCAweDAwMDQsIDB4MGVjMCwgMHg4MDAzLCAweDgwMWIsIDB4ODMxYiwgMHhhMzE4LAorCTB4NjMxNiwgMHgwMDNlLCAweDA4MGMsIDB4NzE3MywgMHgwOGU4LCAweDA4MGMsIDB4NzA5MCwgMHgwODBjLAorCTB4YTAxZiwgMHgwODBjLCAweDg2MWQsIDB4MDgwYywgMHg3MTczLCAweDA4YTAsIDB4MDBlNiwgMHgwMGY2LAorCTB4MjA3MSwgMHhiNTgyLCAweDIwNzksIDB4MDAwMCwgMHgwODBjLCAweDJmY2YsIDB4MDBmZSwgMHgwMGVlLAorCTB4MDgwYywgMHg3MDkwLCAweDA4MGMsIDB4ODYxZCwgMHgwODBjLCAweDcxNzMsIDB4MDgxOCwgMHgwODBjLAorCTB4NzA5MCwgMHgyMDAxLCAweGI3YjgsIDB4MjAwNCwgMHg2MDNlLCAweDYwMDMsIDB4MDAwMiwgMHgyMDAxLAorCTB4YjdiNiwgMHgyMDA0LCAweDYwMTYsIDB4MDgwYywgMHg3MTczLCAweDAwMDUsIDB4MjYwMCwgMHgyMDA4LAorCTB4MDAwMiwgMHg4YzE3LCAweDhjMTcsIDB4OGMxNywgMHg4YmZmLCAweDhiZmYsIDB4OGMxNywgMHgwODBjLAorCTB4MTUxNSwgMHgwMGU2LCAweDAwMjYsIDB4MDAxNiwgMHgwODBjLCAweDljNWEsIDB4MDUwOCwgMHg2MDEwLAorCTB4MjA3MCwgMHg3MDM0LCAweGEwODYsIDB4MDEzOSwgMHgxMTQ4LCAweDIwMDEsIDB4MDAzMCwgMHgyMDA5LAorCTB4MDAwMCwgMHgyMDExLCAweDQwMDUsIDB4MDgwYywgMHhhMGQ2LCAweDAwOTAsIDB4NzAzOCwgMHhkMGZjLAorCTB4MDE3OCwgMHg3MDA3LCAweDAwMDAsIDB4MDAxNiwgMHg2MDA0LCAweGEwOGUsIDB4MDAyMSwgMHgwMTYwLAorCTB4YTA4ZSwgMHgwMDNkLCAweDAxNDgsIDB4MDAxZSwgMHg3MDM3LCAweDAxMDMsIDB4NzAzMywgMHgwMTAwLAorCTB4MDAxZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHgwMDFlLCAweDAwMDksIDB4MGNjOCwgMHgwMGU2LAorCTB4YWNmMCwgMHgwMDA0LCAweDJlNzQsIDB4NzAwMCwgMHgyMDcwLCAweDcwMzcsIDB4MDEwMywgMHg3MDIzLAorCTB4ODAwMSwgMHgwMGVlLCAweDAwMDUsIDB4MDBkNiwgMHg2NjE4LCAweDI2NjgsIDB4NjgwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHgwMGRlLCAweGEwYjIsIDB4MDAwYywgMHgxYTBjLCAweDE1MTUsIDB4NjYwNCwgMHhhNmI2LAorCTB4MDA0MywgMHgxMTIwLCAweDA4MGMsIDB4YTA5MiwgMHgwODA0LCAweDhjYjgsIDB4NjYwNCwgMHhhNmI2LAorCTB4MDAzMywgMHgxMTIwLCAweDA4MGMsIDB4YTA0MiwgMHgwODA0LCAweDhjYjgsIDB4NjYwNCwgMHhhNmI2LAorCTB4MDAyOCwgMHgxMTIwLCAweDA4MGMsIDB4OWU4OCwgMHgwODA0LCAweDhjYjgsIDB4NjYwNCwgMHhhNmI2LAorCTB4MDAyOSwgMHgxMTE4LCAweDA4MGMsIDB4OWU5ZiwgMHgwNGQ4LCAweDY2MDQsIDB4YTZiNiwgMHgwMDFmLAorCTB4MTExOCwgMHgwODBjLCAweDg3ODYsIDB4MDRhMCwgMHg2NjA0LCAweGE2YjYsIDB4MDAwMCwgMHgxMTE4LAorCTB4MDgwYywgMHg4OWRhLCAweDA0NjgsIDB4NjYwNCwgMHhhNmI2LCAweDAwMjIsIDB4MTExOCwgMHgwODBjLAorCTB4ODdhZSwgMHgwNDMwLCAweDY2MDQsIDB4YTZiNiwgMHgwMDM1LCAweDExMTgsIDB4MDgwYywgMHg4ODE1LAorCTB4MDBmOCwgMHg2NjA0LCAweGE2YjYsIDB4MDAzOSwgMHgxMTE4LCAweDA4MGMsIDB4ODk3NiwgMHgwMGMwLAorCTB4NjYwNCwgMHhhNmI2LCAweDAwM2QsIDB4MTExOCwgMHgwODBjLCAweDg3YzgsIDB4MDA4OCwgMHg2NjA0LAorCTB4YTZiNiwgMHgwMDQ0LCAweDExMTgsIDB4MDgwYywgMHg4N2U4LCAweDAwNTAsIDB4YTFiNiwgMHgwMDE1LAorCTB4MTExMCwgMHgwMDUzLCAweDAwMjgsIDB4YTFiNiwgMHgwMDE2LCAweDExMTgsIDB4MDgwNCwgMHg4ZTdjLAorCTB4MDAwNSwgMHgwODBjLCAweDg2NjMsIDB4MGNlMCwgMHg4Y2RmLCAweDhjZTIsIDB4OGNkZiwgMHg4ZDI0LAorCTB4OGNkZiwgMHg4ZTA5LCAweDhlOGEsIDB4OGNkZiwgMHg4Y2RmLCAweDhlNTgsIDB4OGNkZiwgMHg4ZTZjLAorCTB4YTFiNiwgMHgwMDQ4LCAweDAxNDAsIDB4MjBlMSwgMHgwMDA1LCAweDNkMTgsIDB4M2UyMCwgMHgyYzEwLAorCTB4MDgwYywgMHgxODVlLCAweDAwMDUsIDB4MDBlNiwgMHhhY2YwLCAweDAwMDQsIDB4MmU3NCwgMHg3MDAwLAorCTB4MjA3MCwgMHg3MDM3LCAweDAxMDMsIDB4MDBlZSwgMHgwODBjLCAweDg2MWQsIDB4MDAwNSwgMHhlMDAwLAorCTB4ZTAwMCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhiNTAwLCAweDcwODQsIDB4YTA4NiwgMHgwMDc0LAorCTB4MTUzMCwgMHgwODBjLCAweGFlNTksIDB4MTFiMCwgMHgwMGQ2LCAweDYwMTgsIDB4MjA2OCwgMHg3MDMwLAorCTB4ZDA4YywgMHgwMTI4LCAweDY4MDAsIDB4ZDBiYywgMHgwMTEwLCAweGMwYzUsIDB4NjgwMiwgMHgwMGQ5LAorCTB4MDBkZSwgMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg0ZWZkLCAweDA4MGMsIDB4MmNjMiwgMHgwODBjLAorCTB4ODYxZCwgMHgwMDc4LCAweDIwMDEsIDB4MDAwYSwgMHgwODBjLCAweDRlZmQsIDB4MDgwYywgMHgyY2MyLAorCTB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHgwODBjLCAweDZjZDMsIDB4MDAxMCwgMHgwODBjLAorCTB4OGRmNiwgMHgwMGVlLCAweDAwMDUsIDB4NjgwMCwgMHhkMDg0LCAweDAxNjgsIDB4MjAwMSwgMHgwMDAwLAorCTB4MDgwYywgMHg0ZWViLCAweDIwNjksIDB4YjU1MiwgMHg2ODA0LCAweGQwYTQsIDB4MDEyMCwgMHgyMDAxLAorCTB4MDAwNiwgMHgwODBjLCAweDRmMmEsIDB4MDAwNSwgMHgwMGQ2LCAweDIwMTEsIDB4YjUyMSwgMHgyMjA0LAorCTB4YTA4NiwgMHgwMDc0LCAweDE5MDQsIDB4OGRmMywgMHg2MDE4LCAweDIwNjgsIDB4NmFhMCwgMHhhMjg2LAorCTB4MDA3ZSwgMHgxMTIwLCAweDA4MGMsIDB4OGZhMiwgMHgwODA0LCAweDhkOTIsIDB4MDgwYywgMHg4Zjk4LAorCTB4NjAxOCwgMHgyMDY4LCAweGEwODAsIDB4MDAyOCwgMHgyMDE0LCAweGEyODYsIDB4MDA4MCwgMHgxMWMwLAorCTB4NjgxMywgMHgwMGZmLCAweDY4MTcsIDB4ZmZmYywgMHg2MDEwLCAweGEwMDUsIDB4MDEzOCwgMHgyMDY4LAorCTB4NjgwNywgMHgwMDAwLCAweDY4MzcsIDB4MDEwMywgMHg2ODMzLCAweDAyMDAsIDB4MjAwMSwgMHgwMDA2LAorCTB4MDgwYywgMHg0ZWZkLCAweDA4MGMsIDB4MmNjMiwgMHgwODBjLCAweDg2MWQsIDB4MDgwNCwgMHg4ZGY0LAorCTB4MDBlNiwgMHgyMDcxLCAweGI1MzUsIDB4MmUwNCwgMHhkMDljLCAweDAxODgsIDB4MjA3MSwgMHhiYjgwLAorCTB4NzEwOCwgMHg3MjBjLCAweGExOGMsIDB4MDBmZiwgMHgxMTE4LCAweGEyODQsIDB4ZmYwMCwgMHgwMTM4LAorCTB4NjAxOCwgMHgyMDcwLCAweDcwYTAsIDB4ZDBiYywgMHgxMTEwLCAweDcxMTIsIDB4NzIxNiwgMHgwMGVlLAorCTB4NjAxMCwgMHhhMDA1LCAweDAxOTgsIDB4MjA2OCwgMHg2ODM4LCAweGQwZjQsIDB4MDE3OCwgMHg2ODM0LAorCTB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAzOSwgMHgxOTU4LCAweDIwMDEsIDB4MDAwMCwgMHgyMDA5LAorCTB4MDAwMCwgMHgyMDExLCAweDQwMDAsIDB4MDgwYywgMHhhMGQ2LCAweDA4NDAsIDB4MjAwMSwgMHgwMDA0LAorCTB4MDgwYywgMHg0ZWZkLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDMsIDB4MDgwYywgMHg2Y2QzLAorCTB4MDgwNCwgMHg4ZGY0LCAweDY4NWMsIDB4ZDBlNCwgMHgwMWQ4LCAweDA4MGMsIDB4OWZkMiwgMHgwODBjLAorCTB4NWFjZiwgMHgwMTE4LCAweGQwZGMsIDB4MTkwNCwgMHg4ZDRlLCAweDIwMTEsIDB4YjUzNSwgMHgyMjA0LAorCTB4YzBhZCwgMHgyMDEyLCAweDIwMDEsIDB4Yjc4ZiwgMHgyMDA0LCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLAorCTB4NzhlMywgMHgwMDAwLCAweDA4MGMsIDB4Mjg3MiwgMHg3OGUyLCAweDAwZmUsIDB4MDgwNCwgMHg4ZDRlLAorCTB4MDgwYywgMHhhMDA4LCAweDIwMTEsIDB4YjUzNSwgMHgyMjA0LCAweGMwYTUsIDB4MjAxMiwgMHgwMDA2LAorCTB4MDgwYywgMHhhZjdiLCAweDAwMGUsIDB4MTkwNCwgMHg4ZDRlLCAweGMwYjUsIDB4MjAxMiwgMHgyMDAxLAorCTB4MDAwNiwgMHgwODBjLCAweDRlZmQsIDB4MjAwMSwgMHgwMDAwLCAweDA4MGMsIDB4NGVlYiwgMHgwMGM2LAorCTB4MjAwOSwgMHgwMGVmLCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDc5ZWEsIDB4NzkzMiwgMHg3OTM2LAorCTB4MDBmZSwgMHgwODBjLCAweDI4NDcsIDB4MDBmNiwgMHgyMDc5LCAweGI1MDAsIDB4Nzk3NiwgMHgyMTAwLAorCTB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4MjgxZCwgMHg3OTUyLCAweDAwZmUsIDB4ODEwOCwgMHgwODBjLAorCTB4NGY0ZCwgMHgyYzAwLCAweDAwY2UsIDB4MTkwNCwgMHg4ZDRlLCAweDYwMWEsIDB4MjAwMSwgMHgwMDAyLAorCTB4MDgwYywgMHg0ZWZkLCAweDYwMWYsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAyLAorCTB4MDgwYywgMHg2Y2QzLCAweDAwMDgsIDB4MDAxMSwgMHgwMGRlLCAweDAwMDUsIDB4MjAwMSwgMHgwMDA3LAorCTB4MDgwYywgMHg0ZWZkLCAweDIwMDEsIDB4YjUwMCwgMHgyMDA0LCAweGEwODYsIDB4MDAwMywgMHgxMTIwLAorCTB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NGYyYSwgMHgwODBjLCAweDJjYzIsIDB4MDgwYywgMHg4NjFkLAorCTB4MDAwNSwgMHgwMGU2LCAweDAwMjYsIDB4MDAxNiwgMHgyMDcxLCAweGI1MDAsIDB4NzA4NCwgMHhhMDg2LAorCTB4MDAxNCwgMHgxNWYwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDExMjgsIDB4NjAxMCwgMHhhMDA1LAorCTB4MTExMCwgMHgwODBjLCAweDNmM2UsIDB4MDBkNiwgMHg2MDE4LCAweDIwNjgsIDB4MDgwYywgMHg1MDRiLAorCTB4MDgwYywgMHg4ZDEzLCAweDAwZGUsIDB4MDgwYywgMHg5MDUxLCAweDE1NTAsIDB4MDBkNiwgMHg2MDE4LAorCTB4MjA2OCwgMHg2ODkwLCAweDAwZGUsIDB4YTAwNSwgMHgwNTE4LCAweDIwMDEsIDB4MDAwNiwgMHgwODBjLAorCTB4NGVmZCwgMHgwMGU2LCAweDYwMTAsIDB4YTA3NSwgMHgwMWE4LCAweDcwMzQsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4NiwgMHgwMDM5LCAweDExNDgsIDB4MjAwMSwgMHgwMDAwLCAweDIwMDksIDB4MDAwMCwgMHgyMDExLAorCTB4NDAwMCwgMHgwODBjLCAweGEwZDYsIDB4MDAzMCwgMHg3MDA3LCAweDAwMDAsIDB4NzAzNywgMHgwMTAzLAorCTB4NzAzMywgMHgwMjAwLCAweDAwZWUsIDB4MDgwYywgMHgyY2MyLCAweDA4MGMsIDB4ODYxZCwgMHgwMDIwLAorCTB4MDgwYywgMHg4YzE5LCAweDA4MGMsIDB4OGRmNiwgMHgwMDFlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MjAxMSwgMHhiNTIxLCAweDIyMDQsIDB4YTA4NiwgMHgwMDE0LCAweDExNTgsIDB4MjAwMSwgMHgwMDAyLAorCTB4MDgwYywgMHg0ZWZkLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDEsIDB4MDgwYywgMHg2Y2QzLAorCTB4MDAxMCwgMHgwODBjLCAweDhkZjYsIDB4MDAwNSwgMHgyMDExLCAweGI1MjEsIDB4MjIwNCwgMHhhMDg2LAorCTB4MDAwNCwgMHgxMTM4LCAweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDRlZmQsIDB4MDgwYywgMHg4NjFkLAorCTB4MDAxMCwgMHgwODBjLCAweDhkZjYsIDB4MDAwNSwgMHgwMDBiLCAweDAwMDUsIDB4OGNkZiwgMHg4ZTk1LAorCTB4OGNkZiwgMHg4ZWM5LCAweDhjZGYsIDB4OGY1NCwgMHg4ZThhLCAweDhjZGYsIDB4OGNkZiwgMHg4ZjY3LAorCTB4OGNkZiwgMHg4Zjc3LCAweDY2MDQsIDB4YTY4NiwgMHgwMDAzLCAweDA5MDQsIDB4OGUwOSwgMHhhNmI2LAorCTB4MDAxZSwgMHgxMTEwLCAweDA4MGMsIDB4ODYxZCwgMHgwMDA1LCAweDAwZDYsIDB4MDBjNiwgMHgwODBjLAorCTB4OGY4NywgMHgxMTc4LCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLCAweDRlZWIsIDB4MjAwMSwgMHgwMDAyLAorCTB4MDgwYywgMHg0ZWZkLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDIsIDB4MDgwYywgMHg2Y2QzLAorCTB4MDBlOCwgMHgyMDA5LCAweGJiOGUsIDB4MjEwNCwgMHhhMDg2LCAweDAwMDksIDB4MTE2MCwgMHg2MDE4LAorCTB4MjA2OCwgMHg2ODQwLCAweGEwODQsIDB4MDBmZiwgMHhhMDA1LCAweDAxNzAsIDB4ODAwMSwgMHg2ODQyLAorCTB4NjAxNywgMHgwMDBhLCAweDAwNTgsIDB4MjAwOSwgMHhiYjhmLCAweDIxMDQsIDB4YTA4NCwgMHhmZjAwLAorCTB4YTA4NiwgMHgxOTAwLCAweDExMDgsIDB4MDhkMCwgMHgwODBjLCAweDhkZjYsIDB4MDBjZSwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMDI2LCAweDIwMTEsIDB4MDAwMCwgMHgwODBjLCAweDhmOTUsIDB4MDBkNiwgMHgyMDY5LAorCTB4Yjc5ZSwgMHgyZDA0LCAweGEwMDUsIDB4MDE2OCwgMHg2MDE4LCAweDIwNjgsIDB4NjhhMCwgMHhhMDg2LAorCTB4MDA3ZSwgMHgxMTM4LCAweDIwNjksIDB4YjUxZCwgMHgyZDA0LCAweDgwMDAsIDB4MjA2YSwgMHgwMGRlLAorCTB4MDAxMCwgMHgwMGRlLCAweDAwNzgsIDB4MjAwMSwgMHgwMDAwLCAweDA4MGMsIDB4NGVlYiwgMHgyMDAxLAorCTB4MDAwMiwgMHgwODBjLCAweDRlZmQsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMiwgMHgwODBjLAorCTB4NmNkMywgMHgwNDgwLCAweDAwZDYsIDB4NjAxMCwgMHgyMDY4LCAweDA4MGMsIDB4OWM1YSwgMHgwMGRlLAorCTB4MDEwOCwgMHg2YTM0LCAweDA4MGMsIDB4OGMxOSwgMHgyMDA5LCAweGJiOGUsIDB4MjEzNCwgMHhhNmI0LAorCTB4MDBmZiwgMHhhNjg2LCAweDAwMDUsIDB4MDUwMCwgMHhhNjg2LCAweDAwMGIsIDB4MDFjOCwgMHgyMDA5LAorCTB4YmI4ZiwgMHgyMTA0LCAweGEwODQsIDB4ZmYwMCwgMHgxMTE4LCAweGE2ODYsIDB4MDAwOSwgMHgwMWEwLAorCTB4YTA4NiwgMHgxOTAwLCAweDExNjgsIDB4YTY4NiwgMHgwMDA5LCAweDAxNzAsIDB4MjAwMSwgMHgwMDA0LAorCTB4MDgwYywgMHg0ZWZkLCAweDIwMDEsIDB4MDAyOCwgMHg2MDE2LCAweDYwMDcsIDB4MDA0YiwgMHgwMDEwLAorCTB4MDgwYywgMHg4ZGY2LCAweDAwMmUsIDB4MDAwNSwgMHgwMGQ2LCAweGEyODYsIDB4MDEzOSwgMHgwMTYwLAorCTB4NjAxMCwgMHgyMDY4LCAweDA4MGMsIDB4OWM1YSwgMHgwMTQ4LCAweDY4MzQsIDB4YTA4NiwgMHgwMTM5LAorCTB4MDExOCwgMHg2ODM4LCAweGQwZmMsIDB4MDExMCwgMHgwMGRlLCAweDBjNTAsIDB4NjAxOCwgMHgyMDY4LAorCTB4Njg0MCwgMHhhMDg0LCAweDAwZmYsIDB4YTAwNSwgMHgwMTQwLCAweDgwMDEsIDB4Njg0MiwgMHg2MDE3LAorCTB4MDAwYSwgMHg2MDA3LCAweDAwMTYsIDB4MDBkZSwgMHgwOGU4LCAweDY4YTAsIDB4YTA4NiwgMHgwMDdlLAorCTB4MTEzOCwgMHgwMGU2LCAweDIwNzEsIDB4YjUwMCwgMHgwODBjLCAweDRiYzYsIDB4MDBlZSwgMHgwMDEwLAorCTB4MDgwYywgMHgyYzljLCAweDAwZGUsIDB4MDg2MCwgMHgwODBjLCAweDhmOTUsIDB4MTE1OCwgMHgyMDAxLAorCTB4MDAwNCwgMHgwODBjLCAweDRlZmQsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMywgMHgwODBjLAorCTB4NmNkMywgMHgwMDIwLCAweDA4MGMsIDB4OGMxOSwgMHgwODBjLCAweDhkZjYsIDB4MDAwNSwgMHgwNDY5LAorCTB4MTE1OCwgMHgyMDAxLCAweDAwMDgsIDB4MDgwYywgMHg0ZWZkLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDAwNSwgMHgwODBjLCAweDZjZDMsIDB4MDAxMCwgMHgwODBjLCAweDhkZjYsIDB4MDAwNSwgMHgwMGU5LAorCTB4MTE1OCwgMHgyMDAxLCAweDAwMGEsIDB4MDgwYywgMHg0ZWZkLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDAwMSwgMHgwODBjLCAweDZjZDMsIDB4MDAxMCwgMHgwODBjLCAweDhkZjYsIDB4MDAwNSwgMHgyMDA5LAorCTB4YmI4ZSwgMHgyMTA0LCAweGEwODYsIDB4MDAwMywgMHgxMTM4LCAweDIwMDksIDB4YmI4ZiwgMHgyMTA0LAorCTB4YTA4NCwgMHhmZjAwLCAweGEwODYsIDB4MmEwMCwgMHgwMDA1LCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LAorCTB4MDBjNiwgMHgwMDE2LCAweGFjODgsIDB4MDAwNiwgMHgyMTY0LCAweDA4MGMsIDB4NGZiOCwgMHgwMDFlLAorCTB4MDBjZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwMzYsIDB4MDAxNiwgMHg2MDE4LAorCTB4MjA2OCwgMHgyMDcxLCAweGI1MzUsIDB4MmUwNCwgMHhhMDg1LCAweDAwMDMsIDB4MjA3MiwgMHgwODBjLAorCTB4OTAyNiwgMHgwNTYwLCAweDIwMDksIDB4YjUzNSwgMHgyMTA0LCAweGMwY2QsIDB4MjAwYSwgMHgyMDAxLAorCTB4YjU1MywgMHgyMDA0LCAweGQwYTQsIDB4MDE1OCwgMHhhMDA2LCAweDIwMjAsIDB4MjAwOSwgMHgwMDJhLAorCTB4MDgwYywgMHhiMGU4LCAweDIwMDEsIDB4YjUwYywgMHgyMDBjLCAweGMxOTUsIDB4MjEwMiwgMHgyMDE5LAorCTB4MDAyYSwgMHgyMDA5LCAweDAwMDEsIDB4MDgwYywgMHgyYzZmLCAweDIwNzEsIDB4YjUwMCwgMHgwODBjLAorCTB4MmFiOCwgMHgwMGM2LCAweDAxNTYsIDB4MjBhOSwgMHgwMDgxLCAweDIwMDksIDB4MDA3ZiwgMHgwODBjLAorCTB4MmQ5NywgMHg4MTA4LCAweDFmMDQsIDB4OGZkNywgMHgwMTVlLCAweDAwY2UsIDB4MDgwYywgMHg4Zjk4LAorCTB4NjgxMywgMHgwMGZmLCAweDY4MTcsIDB4ZmZmZSwgMHgyMDcxLCAweGJiODAsIDB4MjA3OSwgMHgwMTAwLAorCTB4MmUwNCwgMHhhMDg0LCAweDAwZmYsIDB4MjA2OSwgMHhiNTFjLCAweDIwNmEsIDB4NzhlNiwgMHgwMDA2LAorCTB4OGU3MCwgMHgyZTA0LCAweDIwNjksIDB4YjUxZCwgMHgyMDZhLCAweDc4ZWEsIDB4NzgzMiwgMHg3ODM2LAorCTB4MjAxMCwgMHhhMDg0LCAweGZmMDAsIDB4MDAxZSwgMHhhMTA1LCAweDIwMDksIDB4YjUyOCwgMHgyMDBhLAorCTB4MjIwMCwgMHhhMDg0LCAweDAwZmYsIDB4MjAwOCwgMHgwODBjLCAweDI4NDcsIDB4MDgwYywgMHg1YWNmLAorCTB4MDE3MCwgMHgyMDY5LCAweGJiOGUsIDB4MjA3MSwgMHhiN2IyLCAweDY4MTAsIDB4MjA3MiwgMHg2ODE0LAorCTB4NzAwNiwgMHg2ODE4LCAweDcwMGEsIDB4NjgxYywgMHg3MDBlLCAweDA4MGMsIDB4OWZkMiwgMHgwMDQwLAorCTB4MjAwMSwgMHgwMDA2LCAweDA4MGMsIDB4NGVmZCwgMHgwODBjLCAweDJjYzIsIDB4MDgwYywgMHg4NjFkLAorCTB4MDAxZSwgMHgwMDNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDAyNiwgMHgwMDM2LAorCTB4MDBlNiwgMHgwMTU2LCAweDIwMTksIDB4YjUyOCwgMHgyMzFjLCAweDgzZmYsIDB4MDFlOCwgMHgyMDcxLAorCTB4YmI4MCwgMHgyZTE0LCAweGEyOTQsIDB4MDBmZiwgMHg3MDA0LCAweGEwODQsIDB4ZmYwMCwgMHhhMjA1LAorCTB4YTMwNiwgMHgxMTkwLCAweDIwMTEsIDB4YmI5NiwgMHhhZDk4LCAweDAwMGEsIDB4MjBhOSwgMHgwMDA0LAorCTB4MDgwYywgMHg5MGRhLCAweDExNDgsIDB4MjAxMSwgMHhiYjlhLCAweGFkOTgsIDB4MDAwNiwgMHgyMGE5LAorCTB4MDAwNCwgMHgwODBjLCAweDkwZGEsIDB4MTEwMCwgMHgwMTVlLCAweDAwZWUsIDB4MDAzZSwgMHgwMDJlLAorCTB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4YmI4YywgMHg3MDA0LCAweGEwODYsIDB4MDAxNCwgMHgxMWE4LAorCTB4NzAwOCwgMHhhMDg2LCAweDA4MDAsIDB4MTE4OCwgMHg3MDBjLCAweGQwZWMsIDB4MDE2MCwgMHhhMDg0LAorCTB4MGYwMCwgMHhhMDg2LCAweDAxMDAsIDB4MTEzOCwgMHg3MDI0LCAweGQwYTQsIDB4MTExMCwgMHhkMGFjLAorCTB4MDExMCwgMHhhMDA2LCAweDAwMTAsIDB4YTA4NSwgMHgwMDAxLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MDBkNiwgMHgwMGM2LCAweDAwNzYsIDB4MDA1NiwgMHgwMDQ2LCAweDAwMjYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwMjksIDB4YjdlOSwgMHgyNTJjLCAweDIwMjEsIDB4YjdlZiwgMHgyNDI0LAorCTB4MjA2MSwgMHhiZDAwLCAweDIwNzEsIDB4YjUwMCwgMHg3MjQ4LCAweDcwNjgsIDB4YTIwMiwgMHgxNmYwLAorCTB4MDgwYywgMHhiMTEwLCAweDA1YTAsIDB4NjcxYywgMHhhNzg2LCAweDAwMDEsIDB4MDU4MCwgMHhhNzg2LAorCTB4MDAwNywgMHgwNTY4LCAweDI1MDAsIDB4YWMwNiwgMHgwNTUwLCAweDI0MDAsIDB4YWMwNiwgMHgwNTM4LAorCTB4MDBjNiwgMHg2MDAwLCAweGEwODYsIDB4MDAwNCwgMHgxMTEwLCAweDA4MGMsIDB4MTk0ZCwgMHhhNzg2LAorCTB4MDAwOCwgMHgxMTQ4LCAweDA4MGMsIDB4OWU1OCwgMHgxMTMwLCAweDAwY2UsIDB4MDgwYywgMHg4YzE5LAorCTB4MDgwYywgMHg5ZTFkLCAweDAwYTAsIDB4NjAxMCwgMHgyMDY4LCAweDA4MGMsIDB4OWM1YSwgMHgwMTYwLAorCTB4YTc4NiwgMHgwMDAzLCAweDExZTgsIDB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLAorCTB4MDgwYywgMHg1NDA4LCAweDA4MGMsIDB4OWUxMSwgMHgwODBjLCAweDllMWQsIDB4MDBjZSwgMHhhY2UwLAorCTB4MDAxOCwgMHg3MDVjLCAweGFjMDIsIDB4MTIxMCwgMHgwODA0LCAweDkwODQsIDB4MDEyZSwgMHgwMDBlLAorCTB4MDAyZSwgMHgwMDRlLCAweDAwNWUsIDB4MDA3ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMDA1LAorCTB4YTc4NiwgMHgwMDA2LCAweDExMTgsIDB4MDgwYywgMHhiMDk5LCAweDBjMzAsIDB4YTc4NiwgMHgwMDBhLAorCTB4MDllMCwgMHgwOGM4LCAweDIyMGMsIDB4MjMwNCwgMHhhMTA2LCAweDExMzAsIDB4ODIxMCwgMHg4MzE4LAorCTB4MWYwNCwgMHg5MGRhLCAweGEwMDYsIDB4MDAwNSwgMHgyMzA0LCAweGExMDIsIDB4MDIxOCwgMHgyMDAxLAorCTB4MDAwMSwgMHgwMDEwLCAweDIwMDEsIDB4MDAwMCwgMHhhMThkLCAweDAwMDEsIDB4MDAwNSwgMHg2MDA0LAorCTB4YTA4YSwgMHgwMDgwLCAweDFhMGMsIDB4MTUxNSwgMHgwODBjLCAweDllNDcsIDB4MDEyMCwgMHgwODBjLAorCTB4OWU1OCwgMHgwMTY4LCAweDAwMjgsIDB4MDgwYywgMHgyY2MyLCAweDA4MGMsIDB4OWU1OCwgMHgwMTM4LAorCTB4MDgwYywgMHg3MDkwLCAweDA4MGMsIDB4ODYxZCwgMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHgwODBjLAorCTB4OGMxOSwgMHgwY2IwLCAweGExODIsIDB4MDA0MCwgMHgwMDAyLCAweDkxMjAsIDB4OTEyMCwgMHg5MTIwLAorCTB4OTEyMCwgMHg5MTIwLCAweDkxMjAsIDB4OTEyMCwgMHg5MTIwLCAweDkxMjAsIDB4OTEyMCwgMHg5MTIwLAorCTB4OTEyMiwgMHg5MTIyLCAweDkxMjIsIDB4OTEyMiwgMHg5MTIwLCAweDkxMjAsIDB4OTEyMCwgMHg5MTIyLAorCTB4MDgwYywgMHgxNTE1LCAweDYwMGIsIDB4ZmZmZiwgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgwODBjLAorCTB4NmM4ZCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDcxNzMsIDB4MDEyZSwgMHgwMDA1LAorCTB4YTE4NiwgMHgwMDEzLCAweDExMjgsIDB4NjAwNCwgMHhhMDgyLCAweDAwNDAsIDB4MDgwNCwgMHg5MWJjLAorCTB4YTE4NiwgMHgwMDI3LCAweDExZTgsIDB4MDgwYywgMHg3MDkwLCAweDA4MGMsIDB4MmM5YywgMHgwMGQ2LAorCTB4NjExMCwgMHgyMTY4LCAweDA4MGMsIDB4OWM1YSwgMHgwMTY4LCAweDY4MzcsIDB4MDEwMywgMHg2ODRiLAorCTB4MDAyOSwgMHg2ODQ3LCAweDAwMDAsIDB4Njk0YywgMHhjMWM1LCAweDY5NGUsIDB4MDgwYywgMHg1NDA4LAorCTB4MDgwYywgMHg5ZTExLCAweDAwZGUsIDB4MDgwYywgMHg4NjFkLCAweDA4MGMsIDB4NzE3MywgMHgwMDA1LAorCTB4YTE4NiwgMHgwMDE0LCAweDExMjAsIDB4NjAwNCwgMHhhMDgyLCAweDAwNDAsIDB4MDQyOCwgMHhhMTg2LAorCTB4MDA0NiwgMHgwMTM4LCAweGExODYsIDB4MDA0NSwgMHgwMTIwLCAweGExODYsIDB4MDA0NywgMHgxOTBjLAorCTB4MTUxNSwgMHgyMDAxLCAweDAxMDksIDB4MjAwNCwgMHhkMDg0LCAweDAxOTgsIDB4MDEyNiwgMHgyMDkxLAorCTB4MjgwMCwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwODBjLCAweDZiNzQsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDAwZSwgMHgwMTJlLCAweGUwMDAsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDIsIDB4MTExMCwgMHgwODA0LAorCTB4OTFmYSwgMHgwODBjLCAweDg2NjMsIDB4MDAwNSwgMHgwMDAyLCAweDkxOWEsIDB4OTE5OCwgMHg5MTk4LAorCTB4OTE5OCwgMHg5MTk4LCAweDkxOTgsIDB4OTE5OCwgMHg5MTk4LCAweDkxOTgsIDB4OTE5OCwgMHg5MTk4LAorCTB4OTFiNSwgMHg5MWI1LCAweDkxYjUsIDB4OTFiNSwgMHg5MTk4LCAweDkxYjUsIDB4OTE5OCwgMHg5MWI1LAorCTB4MDgwYywgMHgxNTE1LCAweDA4MGMsIDB4NzA5MCwgMHgwMGQ2LCAweDYxMTAsIDB4MjE2OCwgMHgwODBjLAorCTB4OWM1YSwgMHgwMTY4LCAweDY4MzcsIDB4MDEwMywgMHg2ODRiLCAweDAwMDYsIDB4Njg0NywgMHgwMDAwLAorCTB4Njg1MCwgMHhjMGVjLCAweDY4NTIsIDB4MDgwYywgMHg1NDA4LCAweDA4MGMsIDB4OWUxMSwgMHgwMGRlLAorCTB4MDgwYywgMHg4NjFkLCAweDA4MGMsIDB4NzE3MywgMHgwMDA1LCAweDA4MGMsIDB4NzA5MCwgMHgwODBjLAorCTB4ODYxZCwgMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHgwMDAyLCAweDkxZDIsIDB4OTFkMCwgMHg5MWQwLAorCTB4OTFkMCwgMHg5MWQwLCAweDkxZDAsIDB4OTFkMCwgMHg5MWQwLCAweDkxZDAsIDB4OTFkMCwgMHg5MWQwLAorCTB4OTFlNCwgMHg5MWU0LCAweDkxZTQsIDB4OTFlNCwgMHg5MWQwLCAweDkxZjMsIDB4OTFkMCwgMHg5MWU0LAorCTB4MDgwYywgMHgxNTE1LCAweDA4MGMsIDB4NzA5MCwgMHgyMDAxLCAweGI3YjgsIDB4MjAwNCwgMHg2MDNlLAorCTB4NjAwMywgMHgwMDAyLCAweDA4MGMsIDB4NzE3MywgMHg2MDEwLCAweGEwODgsIDB4MDAxMywgMHgyMTA0LAorCTB4YTA4NSwgMHgwNDAwLCAweDIwMGEsIDB4MDAwNSwgMHgwODBjLCAweDcwOTAsIDB4MjAwMSwgMHhiN2I2LAorCTB4MjAwNCwgMHg2MDE2LCAweDIwMDEsIDB4YjdiOCwgMHgyMDA0LCAweDYwM2UsIDB4NjAwMywgMHgwMDBmLAorCTB4MDgwYywgMHg3MTczLCAweDAwMDUsIDB4MDgwYywgMHg3MDkwLCAweDA4MGMsIDB4ODYxZCwgMHgwODBjLAorCTB4NzE3MywgMHgwMDA1LCAweGExODIsIDB4MDA0MCwgMHgwMDAyLCAweDkyMTAsIDB4OTIxMCwgMHg5MjEwLAorCTB4OTIxMCwgMHg5MjEwLCAweDkyMTIsIDB4OTJmNywgMHg5MzI2LCAweDkyMTAsIDB4OTIxMCwgMHg5MjEwLAorCTB4OTIxMCwgMHg5MjEwLCAweDkyMTAsIDB4OTIxMCwgMHg5MjEwLCAweDkyMTAsIDB4OTIxMCwgMHg5MjEwLAorCTB4MDgwYywgMHgxNTE1LCAweDAwZTYsIDB4MDBkNiwgMHg2MDNmLCAweDAwMDAsIDB4MjA3MSwgMHhiYjgwLAorCTB4NzEyNCwgMHg2MTBhLCAweDIwNzEsIDB4YmI4YywgMHg2MTEwLCAweDIxNjgsIDB4NzYxNCwgMHhhNmI0LAorCTB4MGZmZiwgMHg4NmZmLCAweDA5MDQsIDB4OTJjMCwgMHhhNjhjLCAweDBjMDAsIDB4MDUxOCwgMHgwMGY2LAorCTB4MmM3OCwgMHgwODBjLCAweDUzMDUsIDB4MDBmZSwgMHgwMWM4LCAweDY4NGMsIDB4ZDBhYywgMHgwMWIwLAorCTB4NjAyMCwgMHhkMGRjLCAweDExOTgsIDB4Njg1MCwgMHhkMGJjLCAweDExODAsIDB4NzMxOCwgMHg2ODE0LAorCTB4YTMwNiwgMHgxOTA0LCAweDkyZDMsIDB4NzMxYywgMHg2ODEwLCAweGEzMWUsIDB4MDEzOCwgMHhkNmQ0LAorCTB4MDkwNCwgMHg5MmQzLCAweDZiMTQsIDB4YTMwNSwgMHgxOTA0LCAweDkyZDMsIDB4NzMxOCwgMHg2YjYyLAorCTB4NzMxYywgMHg2YjVlLCAweGE2OGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMDIsIDB4MDUxOCwgMHhhMTg2LAorCTB4MDAyOCwgMHgxMTI4LCAweDA4MGMsIDB4OWUzNiwgMHg2ODRiLCAweDAwMWMsIDB4MDBlOCwgMHhkNmRjLAorCTB4MDFhMCwgMHg2ODRiLCAweDAwMTUsIDB4Njg0YywgMHhkMGFjLCAweDAxNzAsIDB4NjkxNCwgMHg2YTEwLAorCTB4MjEwMCwgMHhhMjA1LCAweDAxNDgsIDB4NzAxOCwgMHhhMTA2LCAweDExMTgsIDB4NzAxYywgMHhhMjA2LAorCTB4MDExOCwgMHg2OTYyLCAweDZhNWUsIDB4YzZkYywgMHgwMDM4LCAweGQ2ZDQsIDB4MDExOCwgMHg2ODRiLAorCTB4MDAwNywgMHgwMDEwLCAweDY4NGIsIDB4MDAwMCwgMHg2ODM3LCAweDAxMDMsIDB4NmU0NiwgMHhhMDFlLAorCTB4ZDZjNCwgMHgwMWYwLCAweGE2ODYsIDB4MDEwMCwgMHgxMTQwLCAweDIwMDEsIDB4YmI5OSwgMHgyMDA0LAorCTB4YTAwNSwgMHgxMTE4LCAweGM2YzQsIDB4MDgwNCwgMHg5MjIxLCAweDczMjgsIDB4NzMyYywgMHg2YjU2LAorCTB4ODNmZiwgMHgwMTcwLCAweGEzOGEsIDB4MDAwOSwgMHgwMjEwLCAweDIwMTksIDB4MDAwOCwgMHgwMDM2LAorCTB4MjMwOCwgMHgyMDE5LCAweGJiOTgsIDB4YWQ5MCwgMHgwMDE5LCAweDA4MGMsIDB4OTkwZCwgMHgwMDNlLAorCTB4ZDZjYywgMHgwOTA0LCAweDkyZTYsIDB4NzEyNCwgMHg2OTVhLCAweDgxZmYsIDB4MDkwNCwgMHg5MmU2LAorCTB4YTE5MiwgMHgwMDIxLCAweDEyNjAsIDB4MjA3MSwgMHhiYjk4LCAweDgzMWMsIDB4MjMwMCwgMHhhZTE4LAorCTB4YWQ5MCwgMHgwMDFkLCAweDA4MGMsIDB4OTkwZCwgMHgwODBjLCAweGExMzcsIDB4MDRiOCwgMHg2ODM4LAorCTB4ZDBmYywgMHgwMTIwLCAweDIwMDksIDB4MDAyMCwgMHg2OTVhLCAweDBjNjgsIDB4MDBmNiwgMHgyZDc4LAorCTB4MDgwYywgMHg5OGIyLCAweDAwZmUsIDB4MDgwYywgMHhhMTM3LCAweDA4MGMsIDB4OThmZCwgMHgwNDQwLAorCTB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4NTMwNSwgMHgwMGZlLCAweDAxOTAsIDB4Njg0YywgMHhkMGFjLAorCTB4MDE3OCwgMHg2MDIwLCAweGQwZGMsIDB4MTE2MCwgMHg2ODUwLCAweGQwYmMsIDB4MTE0OCwgMHg2ODEwLAorCTB4NjkxNCwgMHhhMTA1LCAweDAxMjgsIDB4MDgwYywgMHg5ZjM1LCAweDAwZGUsIDB4MDBlZSwgMHgwMGYwLAorCTB4Njg0YiwgMHgwMDAwLCAweDY4MzcsIDB4MDEwMywgMHg2ZTQ2LCAweDY4NGMsIDB4ZDBhYywgMHgwMTMwLAorCTB4NjgxMCwgMHg2OTE0LCAweGExMTUsIDB4MDExMCwgMHgwODBjLCAweDk0ODMsIDB4MDgwYywgMHg1NDA4LAorCTB4NjIxOCwgMHgyMjY4LCAweDZhM2MsIDB4ODJmZiwgMHgwMTEwLCAweDgyMTEsIDB4NmEzZSwgMHgwODBjLAorCTB4OWYwMywgMHgwMGRlLCAweDAwZWUsIDB4MTExMCwgMHgwODBjLCAweDg2MWQsIDB4MDAwNSwgMHgwMGY2LAorCTB4NjAwMywgMHgwMDAzLCAweDIwNzksIDB4YmI4YywgMHg3YzA0LCAweDdiMDAsIDB4N2UwYywgMHg3ZDA4LAorCTB4NjAxMCwgMHgyMDc4LCAweDc4NGMsIDB4ZDBhYywgMHgwMTM4LCAweDYwMDMsIDB4MDAwMiwgMHgwMGZlLAorCTB4MDAwNSwgMHgyMTMwLCAweDIyMjgsIDB4MDA1OCwgMHgyNDAwLCAweDc5N2MsIDB4YTEwYSwgMHgyMzAwLAorCTB4N2E4MCwgMHhhMjEzLCAweDI2MDAsIDB4YTEwMiwgMHgyNTAwLCAweGEyMDMsIDB4MGU5MCwgMHg3YzEyLAorCTB4N2IxNiwgMHg3ZTBhLCAweDdkMGUsIDB4MDBmZSwgMHg2MDNmLCAweDAwMDAsIDB4MmMxMCwgMHgwODBjLAorCTB4MWZhOSwgMHgwODBjLCAweDZjZjAsIDB4MDgwYywgMHg3MjMwLCAweDAwMDUsIDB4MjAwMSwgMHhiN2I4LAorCTB4MjAwNCwgMHg2MDNlLCAweDYwMDMsIDB4MDAwNCwgMHg2MTEwLCAweDIwZTEsIDB4MDAwNSwgMHgzZDE4LAorCTB4M2UyMCwgMHgyYzEwLCAweDA4MGMsIDB4MTg1ZSwgMHgwMDA1LCAweGExODIsIDB4MDA0MCwgMHgwMDAyLAorCTB4OTM0YiwgMHg5MzRiLCAweDkzNGIsIDB4OTM0YiwgMHg5MzRiLCAweDkzNGQsIDB4OTNlMCwgMHg5MzRiLAorCTB4OTM0YiwgMHg5M2Y2LCAweDk0NWEsIDB4OTM0YiwgMHg5MzRiLCAweDkzNGIsIDB4OTM0YiwgMHg5NDY5LAorCTB4OTM0YiwgMHg5MzRiLCAweDkzNGIsIDB4MDgwYywgMHgxNTE1LCAweDAwNzYsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDBkNiwgMHgyMDcxLCAweGJiOGMsIDB4NjExMCwgMHgyMTc4LCAweDc2MTQsIDB4YTZiNCwgMHgwZmZmLAorCTB4N2U0NiwgMHg3ZjRjLCAweGM3ZTUsIDB4N2Y0ZSwgMHg2MjE4LCAweDIyNjgsIDB4NmEzYywgMHg4MmZmLAorCTB4MDExMCwgMHg4MjExLCAweDZhM2UsIDB4ODZmZiwgMHgwOTA0LCAweDkzZGIsIDB4YTY5NCwgMHhmZjAwLAorCTB4YTI4NCwgMHgwYzAwLCAweDAxMjAsIDB4NzAxOCwgMHg3ODYyLCAweDcwMWMsIDB4Nzg1ZSwgMHhhMjg0LAorCTB4MDMwMCwgMHgwOTA0LCAweDkzZGIsIDB4MDgwYywgMHgxNWY4LCAweDA5MGMsIDB4MTUxNSwgMHgyZDAwLAorCTB4Nzg0YSwgMHg3ZjRjLCAweGM3Y2QsIDB4N2Y0ZSwgMHg2ODM3LCAweDAxMDMsIDB4NzgzOCwgMHg2ODNhLAorCTB4NzgzYywgMHg2ODNlLCAweDc4NDAsIDB4Njg0MiwgMHg2ZTQ2LCAweGE2OGMsIDB4MGMwMCwgMHgwMTIwLAorCTB4NzMxOCwgMHg2YjYyLCAweDczMWMsIDB4NmI1ZSwgMHhhNjhjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDAyLAorCTB4MDE4MCwgMHhhMTg2LCAweDAwMjgsIDB4MTExOCwgMHg2ODRiLCAweDAwMWMsIDB4MDA2MCwgMHhkNmRjLAorCTB4MDExOCwgMHg2ODRiLCAweDAwMTUsIDB4MDAzOCwgMHhkNmQ0LCAweDAxMTgsIDB4Njg0YiwgMHgwMDA3LAorCTB4MDAxMCwgMHg2ODRiLCAweDAwMDAsIDB4NmY0ZSwgMHg3ODUwLCAweDY4NTIsIDB4Nzg1NCwgMHg2ODU2LAorCTB4YTAxZSwgMHhkNmM0LCAweDAxOTgsIDB4NzMyOCwgMHg3MzJjLCAweDZiNTYsIDB4ODNmZiwgMHgwMTcwLAorCTB4YTM4YSwgMHgwMDA5LCAweDAyMTAsIDB4MjAxOSwgMHgwMDA4LCAweDAwMzYsIDB4MjMwOCwgMHgyMDE5LAorCTB4YmI5OCwgMHhhZDkwLCAweDAwMTksIDB4MDgwYywgMHg5OTBkLCAweDAwM2UsIDB4ZDZjYywgMHgwMWQ4LAorCTB4NzEyNCwgMHg2OTVhLCAweDgxZmYsIDB4MDFiOCwgMHhhMTkyLCAweDAwMjEsIDB4MTI1MCwgMHgyMDcxLAorCTB4YmI5OCwgMHg4MzFjLCAweDIzMDAsIDB4YWUxOCwgMHhhZDkwLCAweDAwMWQsIDB4MDgwYywgMHg5OTBkLAorCTB4MDA1MCwgMHg3ODM4LCAweGQwZmMsIDB4MDEyMCwgMHgyMDA5LCAweDAwMjAsIDB4Njk1YSwgMHgwYzc4LAorCTB4MmQ3OCwgMHgwODBjLCAweDk4YjIsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDA3ZSwgMHgwMDA1LAorCTB4MDBmNiwgMHg2MDAzLCAweDAwMDMsIDB4MjA3OSwgMHhiYjhjLCAweDdjMDQsIDB4N2IwMCwgMHg3ZTBjLAorCTB4N2QwOCwgMHg2MDEwLCAweDIwNzgsIDB4N2MxMiwgMHg3YjE2LCAweDdlMGEsIDB4N2QwZSwgMHgwMGZlLAorCTB4MmMxMCwgMHgwODBjLCAweDFmYTksIDB4MDgwYywgMHg3ZDYwLCAweDAwMDUsIDB4MDBkNiwgMHgwMGY2LAorCTB4MmM3OCwgMHgwODBjLCAweDUzMDUsIDB4MDBmZSwgMHgwMTIwLCAweDIwMDEsIDB4YjdiOCwgMHgyMDA0LAorCTB4NjAzZSwgMHg2MDAzLCAweDAwMDIsIDB4MDgwYywgMHg3MTI2LCAweDA4MGMsIDB4NzIzMCwgMHg2MTEwLAorCTB4MjE2OCwgMHg2OTRjLCAweGQxZTQsIDB4MDkwNCwgMHg5NDU4LCAweGQxY2MsIDB4MDU0MCwgMHg2OTQ4LAorCTB4NjgzOCwgMHhkMGZjLCAweDAxZTgsIDB4MDAxNiwgMHg2ODRjLCAweDAwMDYsIDB4Njg1MCwgMHgwMDA2LAorCTB4YWQ5MCwgMHgwMDBkLCAweGExOTgsIDB4MDAwZCwgMHgyMDA5LCAweDAwMjAsIDB4MDE1NiwgMHgyMWE4LAorCTB4MjMwNCwgMHgyMDEyLCAweDgzMTgsIDB4ODIxMCwgMHgxZjA0LCAweDk0MjAsIDB4MDE1ZSwgMHgwMDBlLAorCTB4Njg1MiwgMHgwMDBlLCAweDY4NGUsIDB4MDAxZSwgMHgyMTY4LCAweDA4MGMsIDB4MTYxZiwgMHgwNDE4LAorCTB4MDAxNiwgMHgwODBjLCAweDE2MWYsIDB4MDBkZSwgMHgwODBjLCAweDk4ZmQsIDB4MDBlMCwgMHg2ODM3LAorCTB4MDEwMywgMHg2OTQ0LCAweGExODQsIDB4MDBmZiwgMHhhMGI2LCAweDAwMDIsIDB4MDE4MCwgMHhhMDg2LAorCTB4MDAyOCwgMHgxMTE4LCAweDY4NGIsIDB4MDAxYywgMHgwMDYwLCAweGQxZGMsIDB4MDExOCwgMHg2ODRiLAorCTB4MDAxNSwgMHgwMDM4LCAweGQxZDQsIDB4MDExOCwgMHg2ODRiLCAweDAwMDcsIDB4MDAxMCwgMHg2ODRiLAorCTB4MDAwMCwgMHgwODBjLCAweDU0MDgsIDB4MDgwYywgMHg5ZjAzLCAweDExMTAsIDB4MDgwYywgMHg4NjFkLAorCTB4MDBkZSwgMHgwMDA1LCAweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweDdmZTQsIDB4NjAwMywgMHgwMDAyLAorCTB4MjAwMSwgMHhiN2I4LCAweDIwMDQsIDB4NjAzZSwgMHgwODBjLCAweDcxMjYsIDB4MDgwYywgMHg3MjMwLAorCTB4MDAwNSwgMHgwODBjLCAweDcxMjYsIDB4MDgwYywgMHgyYzljLCAweDAwZDYsIDB4NjExMCwgMHgyMTY4LAorCTB4MDgwYywgMHg5YzVhLCAweDAxNTAsIDB4NjgzNywgMHgwMTAzLCAweDY4NGIsIDB4MDAyOSwgMHg2ODQ3LAorCTB4MDAwMCwgMHgwODBjLCAweDU0MDgsIDB4MDgwYywgMHg5ZTExLCAweDAwZGUsIDB4MDgwYywgMHg4NjFkLAorCTB4MDgwYywgMHg3MjMwLCAweDAwMDUsIDB4Njg0YiwgMHgwMDE1LCAweGQxZmMsIDB4MDEzOCwgMHg2ODRiLAorCTB4MDAwNywgMHg4MDAyLCAweDgwMDAsIDB4ODEwYSwgMHhhMTg5LCAweDAwMDAsIDB4Njk2MiwgMHg2ODVlLAorCTB4MDAwNSwgMHhhMTgyLCAweDAwNDAsIDB4MDAwMiwgMHg5NGE3LCAweDk0YTcsIDB4OTRhNywgMHg5NGE3LAorCTB4OTRhNywgMHg5NGE5LCAweDk0YTcsIDB4OTU2NCwgMHg5NTcwLCAweDk0YTcsIDB4OTRhNywgMHg5NGE3LAorCTB4OTRhNywgMHg5NGE3LCAweDk0YTcsIDB4OTRhNywgMHg5NGE3LCAweDk0YTcsIDB4OTRhNywgMHgwODBjLAorCTB4MTUxNSwgMHgwMDc2LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDIwNzEsIDB4YmI4YywgMHg2MTEwLAorCTB4MjE3OCwgMHg3NjE0LCAweGE2YjQsIDB4MGZmZiwgMHgwMGY2LCAweDJjNzgsIDB4MDgwYywgMHg1MzA1LAorCTB4MDBmZSwgMHgwMTUwLCAweGE2ODQsIDB4MDBmZiwgMHgxMTM4LCAweDYwMjAsIDB4ZDBmNCwgMHgwMTIwLAorCTB4MDgwYywgMHg5ZjM1LCAweDA4MDQsIDB4OTU1ZiwgMHg3ZTQ2LCAweDdmNGMsIDB4YzdlNSwgMHg3ZjRlLAorCTB4NjIxOCwgMHgyMjY4LCAweDZhM2MsIDB4ODJmZiwgMHgwMTEwLCAweDgyMTEsIDB4NmEzZSwgMHg4NmZmLAorCTB4MDkwNCwgMHg5NTU1LCAweGE2OTQsIDB4ZmYwMCwgMHhhMjg0LCAweDBjMDAsIDB4MDEyMCwgMHg3MDE4LAorCTB4Nzg2MiwgMHg3MDFjLCAweDc4NWUsIDB4YTI4NCwgMHgwMzAwLCAweDA5MDQsIDB4OTU1MywgMHhhNjg2LAorCTB4MDEwMCwgMHgxMTQwLCAweDIwMDEsIDB4YmI5OSwgMHgyMDA0LCAweGEwMDUsIDB4MTExOCwgMHhjNmM0LAorCTB4N2U0NiwgMHgwYzI4LCAweDA4MGMsIDB4MTVmOCwgMHgwOTBjLCAweDE1MTUsIDB4MmQwMCwgMHg3ODRhLAorCTB4N2Y0YywgMHhhN2JkLCAweDAyMDAsIDB4N2Y0ZSwgMHg2ODM3LCAweDAxMDMsIDB4NzgzOCwgMHg2ODNhLAorCTB4NzgzYywgMHg2ODNlLCAweDc4NDAsIDB4Njg0MiwgMHg2ZTQ2LCAweGE2OGMsIDB4MGMwMCwgMHgwMTIwLAorCTB4NzMxOCwgMHg2YjYyLCAweDczMWMsIDB4NmI1ZSwgMHhhNjhjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDAyLAorCTB4MDE4MCwgMHhhMTg2LCAweDAwMjgsIDB4MTExOCwgMHg2ODRiLCAweDAwMWMsIDB4MDA2MCwgMHhkNmRjLAorCTB4MDExOCwgMHg2ODRiLCAweDAwMTUsIDB4MDAzOCwgMHhkNmQ0LCAweDAxMTgsIDB4Njg0YiwgMHgwMDA3LAorCTB4MDAxMCwgMHg2ODRiLCAweDAwMDAsIDB4NmY0ZSwgMHg3ODUwLCAweDY4NTIsIDB4Nzg1NCwgMHg2ODU2LAorCTB4YTAxZSwgMHhkNmM0LCAweDAxOTgsIDB4NzMyOCwgMHg3MzJjLCAweDZiNTYsIDB4ODNmZiwgMHgwMTcwLAorCTB4YTM4YSwgMHgwMDA5LCAweDAyMTAsIDB4MjAxOSwgMHgwMDA4LCAweDAwMzYsIDB4MjMwOCwgMHgyMDE5LAorCTB4YmI5OCwgMHhhZDkwLCAweDAwMTksIDB4MDgwYywgMHg5OTBkLCAweDAwM2UsIDB4ZDZjYywgMHgwMWQ4LAorCTB4NzEyNCwgMHg2OTVhLCAweDgxZmYsIDB4MDFiOCwgMHhhMTkyLCAweDAwMjEsIDB4MTI1MCwgMHgyMDcxLAorCTB4YmI5OCwgMHg4MzFjLCAweDIzMDAsIDB4YWUxOCwgMHhhZDkwLCAweDAwMWQsIDB4MDgwYywgMHg5OTBkLAorCTB4MDA1MCwgMHg3ODM4LCAweGQwZmMsIDB4MDEyMCwgMHgyMDA5LCAweDAwMjAsIDB4Njk1YSwgMHgwYzc4LAorCTB4MmQ3OCwgMHgwODBjLCAweDk4YjIsIDB4ZDZkYywgMHgxMTEwLCAweGEwMDYsIDB4MDAzMCwgMHgyMDAxLAorCTB4MDAwMSwgMHgyMDcxLCAweGJiOGMsIDB4NzIxOCwgMHg3MzFjLCAweDA4MGMsIDB4MThiMSwgMHgwMGRlLAorCTB4MDBlZSwgMHgwMGZlLCAweDAwN2UsIDB4MDAwNSwgMHgyMDAxLCAweGI3YjgsIDB4MjAwNCwgMHg2MDNlLAorCTB4MjBlMSwgMHgwMDA1LCAweDNkMTgsIDB4M2UyMCwgMHgyYzEwLCAweDA4MGMsIDB4MTg1ZSwgMHgwMDA1LAorCTB4MjAwMSwgMHhiN2I4LCAweDIwMDQsIDB4NjAzZSwgMHgwMGQ2LCAweDYwMDMsIDB4MDAwMiwgMHg2MTEwLAorCTB4MjE2OCwgMHg2OTRjLCAweGQxZTQsIDB4MDkwNCwgMHg5NjdiLCAweDYwM2YsIDB4MDAwMCwgMHgwMGY2LAorCTB4MmM3OCwgMHgwODBjLCAweDUzMDUsIDB4MDBmZSwgMHgwNTYwLCAweDY4MTQsIDB4NjkxMCwgMHhhMTE1LAorCTB4MDU0MCwgMHg2YTYwLCAweGEyMDYsIDB4MTExOCwgMHg2ODVjLCAweGExMDYsIDB4MDUxMCwgMHg2ODRjLAorCTB4YzBlNCwgMHg2ODRlLCAweDY4NDcsIDB4MDAwMCwgMHg2ODYzLCAweDAwMDAsIDB4Njg1ZiwgMHgwMDAwLAorCTB4NjAyMCwgMHhkMGY0LCAweDExNTgsIDB4Njk3YywgMHg2ODEwLCAweGExMDIsIDB4NjAzYSwgMHg2OTgwLAorCTB4NjgxNCwgMHhhMTAzLCAweDYwMzYsIDB4NjAyMCwgMHhjMGY1LCAweDYwMjIsIDB4MDBkNiwgMHg2MDE4LAorCTB4MjA2OCwgMHg2ODNjLCAweDgwMDAsIDB4NjgzZSwgMHgwMGRlLCAweDA4MGMsIDB4OWYzNSwgMHgwODA0LAorCTB4OTY3YiwgMHg2OTRjLCAweGQxY2MsIDB4MDkwNCwgMHg5NjRiLCAweDY5NDgsIDB4NjgzOCwgMHhkMGZjLAorCTB4MDkwNCwgMHg5NjBlLCAweDAwMTYsIDB4Njg0YywgMHgwMDA2LCAweDY4NTAsIDB4MDAwNiwgMHgwMGY2LAorCTB4MjE3OCwgMHg3OTQ0LCAweGExODQsIDB4MDBmZiwgMHhhMGI2LCAweDAwMDIsIDB4MDFlMCwgMHhhMDg2LAorCTB4MDAyOCwgMHgxMTI4LCAweDY4NGIsIDB4MDAxYywgMHg3ODRiLCAweDAwMWMsIDB4MDBlOCwgMHhkMWRjLAorCTB4MDE1OCwgMHg2ODRiLCAweDAwMTUsIDB4Nzg0YiwgMHgwMDE1LCAweDA4MGMsIDB4YTBiZiwgMHgwMTE4LAorCTB4Nzk0NCwgMHhjMWRjLCAweDc5NDYsIDB4MDA4MCwgMHhkMWQ0LCAweDAxMjgsIDB4Njg0YiwgMHgwMDA3LAorCTB4Nzg0YiwgMHgwMDA3LCAweDAwNDgsIDB4Njg0YywgMHhkMGFjLCAweDAxMzAsIDB4NjgxMCwgMHg2OTE0LAorCTB4YTExNSwgMHgwMTEwLCAweDA4MGMsIDB4OTQ4MywgMHg2ODQ4LCAweDc4NGEsIDB4Njg2MCwgMHg3ODYyLAorCTB4Njg1YywgMHg3ODVlLCAweGFkOTAsIDB4MDAwZCwgMHhhZjk4LCAweDAwMGQsIDB4MjAwOSwgMHgwMDIwLAorCTB4MDE1NiwgMHgyMWE4LCAweDIzMDQsIDB4MjAxMiwgMHg4MzE4LCAweDgyMTAsIDB4MWYwNCwgMHg5NWZhLAorCTB4MDE1ZSwgMHgwMGZlLCAweDAwMGUsIDB4Njg1MiwgMHgwMDBlLCAweDY4NGUsIDB4MDgwYywgMHhhMTM3LAorCTB4MDAxZSwgMHgyMTY4LCAweDA4MGMsIDB4MTYxZiwgMHgwODA0LCAweDk2NzYsIDB4MDAxNiwgMHgwMGY2LAorCTB4MjE3OCwgMHg3OTQ0LCAweGExODQsIDB4MDBmZiwgMHhhMGI2LCAweDAwMDIsIDB4MDFlMCwgMHhhMDg2LAorCTB4MDAyOCwgMHgxMTI4LCAweDY4NGIsIDB4MDAxYywgMHg3ODRiLCAweDAwMWMsIDB4MDBlOCwgMHhkMWRjLAorCTB4MDE1OCwgMHg2ODRiLCAweDAwMTUsIDB4Nzg0YiwgMHgwMDE1LCAweDA4MGMsIDB4YTBiZiwgMHgwMTE4LAorCTB4Nzk0NCwgMHhjMWRjLCAweDc5NDYsIDB4MDA4MCwgMHhkMWQ0LCAweDAxMjgsIDB4Njg0YiwgMHgwMDA3LAorCTB4Nzg0YiwgMHgwMDA3LCAweDAwNDgsIDB4Njg0YywgMHhkMGFjLCAweDAxMzAsIDB4NjgxMCwgMHg2OTE0LAorCTB4YTExNSwgMHgwMTEwLCAweDA4MGMsIDB4OTQ4MywgMHg2ODYwLCAweDc4NjIsIDB4Njg1YywgMHg3ODVlLAorCTB4Njg0YywgMHg3ODRlLCAweDAwZmUsIDB4MDgwYywgMHgxNjFmLCAweDAwZGUsIDB4MDgwYywgMHhhMTM3LAorCTB4MDgwYywgMHg5OGZkLCAweDA0NTgsIDB4NjgzNywgMHgwMTAzLCAweDY5NDQsIDB4YTE4NCwgMHgwMGZmLAorCTB4YTBiNiwgMHgwMDAyLCAweDAxYjAsIDB4YTA4NiwgMHgwMDI4LCAweDExMTgsIDB4Njg0YiwgMHgwMDFjLAorCTB4MDBkOCwgMHhkMWRjLCAweDAxNDgsIDB4Njg0YiwgMHgwMDE1LCAweDA4MGMsIDB4YTBiZiwgMHgwMTE4LAorCTB4Njk0NCwgMHhjMWRjLCAweDY5NDYsIDB4MDA4MCwgMHhkMWQ0LCAweDAxMTgsIDB4Njg0YiwgMHgwMDA3LAorCTB4MDA1OCwgMHg2ODRiLCAweDAwMDAsIDB4Njg0YywgMHhkMGFjLCAweDAxMzAsIDB4NjgxMCwgMHg2OTE0LAorCTB4YTExNSwgMHgwMTEwLCAweDA4MGMsIDB4OTQ4MywgMHgwODBjLCAweDU0MDgsIDB4MDgwYywgMHg5ZjAzLAorCTB4MTExMCwgMHgwODBjLCAweDg2MWQsIDB4MDBkZSwgMHgwMDA1LCAweDA4MGMsIDB4NzA5MCwgMHgwMDEwLAorCTB4MDgwYywgMHg3MTI2LCAweDA4MGMsIDB4OWM1YSwgMHgwMWMwLCAweDAwZDYsIDB4NjExMCwgMHgyMTY4LAorCTB4NjgzNywgMHgwMTAzLCAweDIwMDksIDB4YjUwYywgMHgyMTBjLCAweGQxOGMsIDB4MTFjMCwgMHhkMTg0LAorCTB4MTE5OCwgMHg2MTA4LCAweDY5NGEsIDB4YTE4ZSwgMHgwMDI5LCAweDExMTAsIDB4MDgwYywgMHhiMzgwLAorCTB4Njg0NywgMHgwMDAwLCAweDA4MGMsIDB4NTQwOCwgMHgwMGRlLCAweDA4MGMsIDB4ODYxZCwgMHgwODBjLAorCTB4NzE3MywgMHgwODBjLCAweDcyMzAsIDB4MDAwNSwgMHg2ODRiLCAweDAwMDQsIDB4MGM4OCwgMHg2ODRiLAorCTB4MDAwNCwgMHgwYzcwLCAweGExODIsIDB4MDA0MCwgMHgwMDAyLCAweDk2YzAsIDB4OTZjMCwgMHg5NmMwLAorCTB4OTZjMCwgMHg5NmMwLCAweDk2YzIsIDB4OTZjMCwgMHg5NmM1LCAweDk2YzAsIDB4OTZjMCwgMHg5NmMwLAorCTB4OTZjMCwgMHg5NmMwLCAweDk2YzAsIDB4OTZjMCwgMHg5NmMwLCAweDk2YzAsIDB4OTZjMCwgMHg5NmMwLAorCTB4MDgwYywgMHgxNTE1LCAweDA4MGMsIDB4ODYxZCwgMHgwMDA1LCAweDAwMDYsIDB4MDAyNiwgMHhhMDE2LAorCTB4MDgwYywgMHgxODVlLCAweDAwMmUsIDB4MDAwZSwgMHgwMDA1LCAweGExODIsIDB4MDA4NSwgMHgwMDAyLAorCTB4OTZkOSwgMHg5NmQ3LCAweDk2ZDcsIDB4OTZlNSwgMHg5NmQ3LCAweDk2ZDcsIDB4OTZkNywgMHgwODBjLAorCTB4MTUxNSwgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgwODBjLCAweDZjOGQsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDcxNzMsIDB4MDEyZSwgMHgwMDA1LCAweDAwMjYsIDB4MDA1NiwgMHgwMGQ2LAorCTB4MDBlNiwgMHgyMDcxLCAweGJiODAsIDB4NzIyNCwgMHg2MjEyLCAweDcyMjAsIDB4MDgwYywgMHg5YzRhLAorCTB4MDFhMCwgMHgyMjY4LCAweDY4MDAsIDB4YTA4NiwgMHgwMDAwLCAweDAxNzgsIDB4NjAxOCwgMHg2ZDE4LAorCTB4YTUyZSwgMHgxMTU4LCAweDAwYzYsIDB4MmQ2MCwgMHgwODBjLCAweDk5MWQsIDB4MDBjZSwgMHgwMTI4LAorCTB4NjgwMywgMHgwMDAyLCAweDYwMDcsIDB4MDA4NiwgMHgwMDEwLCAweDYwMDcsIDB4MDA4NywgMHg2MDAzLAorCTB4MDAwMSwgMHgwODBjLCAweDZjOGQsIDB4MDgwYywgMHg3MTczLCAweDAwZjYsIDB4MjI3OCwgMHgwODBjLAorCTB4NTMwNSwgMHgwMGZlLCAweDAxNTAsIDB4NjgyMCwgMHhkMGVjLCAweDAxMzgsIDB4MDBjNiwgMHgyMjYwLAorCTB4NjAzZiwgMHgwMDAwLCAweDA4MGMsIDB4OWYzNSwgMHgwMGNlLCAweDAwZWUsIDB4MDBkZSwgMHgwMDVlLAorCTB4MDAyZSwgMHgwMDA1LCAweGExODYsIDB4MDAxMywgMHgxMTYwLCAweDYwMDQsIDB4YTA4YSwgMHgwMDg1LAorCTB4MGEwYywgMHgxNTE1LCAweGEwOGEsIDB4MDA4YywgMHgxYTBjLCAweDE1MTUsIDB4YTA4MiwgMHgwMDg1LAorCTB4MDA3MiwgMHhhMTg2LCAweDAwMjcsIDB4MDEyMCwgMHhhMTg2LCAweDAwMTQsIDB4MTkwYywgMHgxNTE1LAorCTB4MDgwYywgMHg3MDkwLCAweDA4MGMsIDB4OWUxZCwgMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHg5NzQ2LAorCTB4OTc0OCwgMHg5NzQ4LCAweDk3NDYsIDB4OTc0NiwgMHg5NzQ2LCAweDk3NDYsIDB4MDgwYywgMHgxNTE1LAorCTB4MDgwYywgMHg3MDkwLCAweDA4MGMsIDB4OWUxZCwgMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHhhMTg2LAorCTB4MDAxMywgMHgxMTI4LCAweDYwMDQsIDB4YTA4MiwgMHgwMDg1LCAweDIwMDgsIDB4MDRhOCwgMHhhMTg2LAorCTB4MDAyNywgMHgxMWU4LCAweDA4MGMsIDB4NzA5MCwgMHgwODBjLCAweDJjOWMsIDB4MDBkNiwgMHg2MDEwLAorCTB4MjA2OCwgMHgwODBjLCAweDljNWEsIDB4MDE1MCwgMHg2ODM3LCAweDAxMDMsIDB4Njg0NywgMHgwMDAwLAorCTB4Njg0YiwgMHgwMDI5LCAweDA4MGMsIDB4NTQwOCwgMHgwODBjLCAweDllMTEsIDB4MDBkZSwgMHgwODBjLAorCTB4ODYxZCwgMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHgwODBjLCAweDg2NjMsIDB4MGNlMCwgMHhhMTg2LAorCTB4MDAxNCwgMHgxZGQwLCAweDA4MGMsIDB4NzA5MCwgMHgwMGQ2LCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLAorCTB4OWM1YSwgMHgwZDYwLCAweDY4MzcsIDB4MDEwMywgMHg2ODQ3LCAweDAwMDAsIDB4Njg0YiwgMHgwMDA2LAorCTB4Njg1MCwgMHhjMGVjLCAweDY4NTIsIDB4MDhmMCwgMHgwMDAyLCAweDk3OTYsIDB4OTc5NCwgMHg5Nzk0LAorCTB4OTc5NCwgMHg5Nzk0LCAweDk3OTQsIDB4OTdhZSwgMHgwODBjLCAweDE1MTUsIDB4MDgwYywgMHg3MDkwLAorCTB4NjAzMCwgMHhhMDhjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTg2LCAweDAwMzksIDB4MDExOCwgMHhhMTg2LAorCTB4MDAzNSwgMHgxMTE4LCAweDIwMDEsIDB4YjdiNiwgMHgwMDEwLCAweDIwMDEsIDB4YjdiNywgMHgyMDA0LAorCTB4NjAxNiwgMHg2MDAzLCAweDAwMGMsIDB4MDgwYywgMHg3MTczLCAweDAwMDUsIDB4MDgwYywgMHg3MDkwLAorCTB4NjAzMCwgMHhhMDhjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTg2LCAweDAwMzksIDB4MDExOCwgMHhhMTg2LAorCTB4MDAzNSwgMHgxMTE4LCAweDIwMDEsIDB4YjdiNiwgMHgwMDEwLCAweDIwMDEsIDB4YjdiNywgMHgyMDA0LAorCTB4NjAxNiwgMHg2MDAzLCAweDAwMGUsIDB4MDgwYywgMHg3MTczLCAweDAwMDUsIDB4YTE4MiwgMHgwMDhjLAorCTB4MTIyMCwgMHhhMTgyLCAweDAwODUsIDB4MDIwOCwgMHgwMDFhLCAweDA4MGMsIDB4ODY2MywgMHgwMDA1LAorCTB4OTdkNywgMHg5N2Q3LCAweDk3ZDcsIDB4OTdkNywgMHg5N2Q5LCAweDk4MzIsIDB4OTdkNywgMHgwODBjLAorCTB4MTUxNSwgMHgwMGQ2LCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweDUzMDUsIDB4MDBmZSwgMHgwMTY4LAorCTB4NjAzMCwgMHhhMDhjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTg2LCAweDAwMzksIDB4MDExOCwgMHhhMTg2LAorCTB4MDAzNSwgMHgxMTE4LCAweDAwZGUsIDB4MDgwNCwgMHg5ODQ1LCAweDA4MGMsIDB4OWM1YSwgMHgxMTE4LAorCTB4MDgwYywgMHg5ZTExLCAweDAwZjAsIDB4NjAxMCwgMHgyMDY4LCAweDY4NGMsIDB4ZDBlNCwgMHgxMTEwLAorCTB4MDgwYywgMHg5ZTExLCAweDY4MzcsIDB4MDEwMywgMHg2ODUwLCAweGQwYjQsIDB4MDEyOCwgMHg2ODRiLAorCTB4MDAwNiwgMHhjMGVjLCAweDY4NTIsIDB4MDA0OCwgMHhkMGJjLCAweDAxMTgsIDB4Njg0YiwgMHgwMDAyLAorCTB4MDAyMCwgMHg2ODRiLCAweDAwMDUsIDB4MDgwYywgMHg5ZWQyLCAweDY4NDcsIDB4MDAwMCwgMHgwODBjLAorCTB4NTQwOCwgMHgyYzY4LCAweDA4MGMsIDB4ODVjNywgMHgwMWMwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDAxZSwgMHg2MDBiLCAweGZmZmYsIDB4MjAwOSwgMHhiYjhlLCAweDIxMGMsIDB4NjEzNiwgMHgyMDA5LAorCTB4YmI4ZiwgMHgyMTBjLCAweDYxM2EsIDB4NjkxOCwgMHg2MTFhLCAweDA4MGMsIDB4YTAyNywgMHg2OTUwLAorCTB4NjE1MiwgMHg2MDFmLCAweDAwMDEsIDB4MDgwYywgMHg2YzhkLCAweDJkNjAsIDB4MDgwYywgMHg4NjFkLAorCTB4MDBkZSwgMHgwMDA1LCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweDUzMDUsIDB4MDBmZSwgMHgwNTk4LAorCTB4NjAzMCwgMHhhMDhjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTg2LCAweDAwMzUsIDB4MDEzMCwgMHhhMTg2LAorCTB4MDAxZSwgMHgwMTE4LCAweGExODYsIDB4MDAzOSwgMHgxNTMwLCAweDAwZDYsIDB4MmM2OCwgMHgwODBjLAorCTB4YTEwYSwgMHgxOTA0LCAweDk4OGEsIDB4MDgwYywgMHg4NWM3LCAweDAxZDgsIDB4NjEwNiwgMHg2MDAzLAorCTB4MDAwMSwgMHg2MDFmLCAweDAwMDEsIDB4NjkxOCwgMHg2MTFhLCAweDY5MjgsIDB4NjEyYSwgMHg2OTJjLAorCTB4NjEyZSwgMHg2OTMwLCAweGExOGMsIDB4MDBmZiwgMHg2MTMyLCAweDY5MzQsIDB4NjEzNiwgMHg2OTM4LAorCTB4NjEzYSwgMHg2OTUwLCAweDYxNTIsIDB4MDgwYywgMHhhMDI3LCAweDA4MGMsIDB4NmM4ZCwgMHgwODBjLAorCTB4NzE3MywgMHgyZDYwLCAweDAwZjgsIDB4MDBkNiwgMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5YzVhLAorCTB4MDFjOCwgMHg2ODM3LCAweDAxMDMsIDB4Njg1MCwgMHhkMGI0LCAweDAxMjgsIDB4YzBlYywgMHg2ODUyLAorCTB4Njg0YiwgMHgwMDA2LCAweDAwNDgsIDB4ZDBiYywgMHgwMTE4LCAweDY4NGIsIDB4MDAwMiwgMHgwMDIwLAorCTB4Njg0YiwgMHgwMDA1LCAweDA4MGMsIDB4OWVkMiwgMHg2ODQ3LCAweDAwMDAsIDB4MDgwYywgMHg1NDA4LAorCTB4MDgwYywgMHg5ZTExLCAweDAwZGUsIDB4MDgwYywgMHg4NjFkLCAweDAwMDUsIDB4MDAxNiwgMHgwMGQ2LAorCTB4NjAxMCwgMHgyMDY4LCAweDA4MGMsIDB4OWM1YSwgMHgwMTQwLCAweDY4MzcsIDB4MDEwMywgMHg2ODRiLAorCTB4MDAyOCwgMHg2ODQ3LCAweDAwMDAsIDB4MDgwYywgMHg1NDA4LCAweDAwZGUsIDB4MDAxZSwgMHhhMTg2LAorCTB4MDAxMywgMHgwMTQ4LCAweGExODYsIDB4MDAxNCwgMHgwMTMwLCAweGExODYsIDB4MDAyNywgMHgwMTE4LAorCTB4MDgwYywgMHg4NjYzLCAweDAwMzAsIDB4MDgwYywgMHg3MDkwLCAweDA4MGMsIDB4OWUxZCwgMHgwODBjLAorCTB4NzE3MywgMHgwMDA1LCAweDAwNTYsIDB4MDA2NiwgMHgwMGQ2LCAweDAwZjYsIDB4MjAyOSwgMHgwMDAxLAorCTB4YTE4MiwgMHgwMTAxLCAweDEyMDgsIDB4MDAxMCwgMHgyMDA5LCAweDAxMDAsIDB4MjEzMCwgMHgyMDY5LAorCTB4YmI5OCwgMHg4MzFjLCAweDIzMDAsIDB4YWQxOCwgMHgyMDA5LCAweDAwMjAsIDB4YWY5MCwgMHgwMDFkLAorCTB4MDgwYywgMHg5OTBkLCAweGE2YjIsIDB4MDAyMCwgMHg3ODA0LCAweGEwNmQsIDB4MDExMCwgMHgwODBjLAorCTB4MTYxZiwgMHgwODBjLCAweDE1ZjgsIDB4MDUwMCwgMHg4NTI4LCAweDY4MzcsIDB4MDExMCwgMHg2ODNiLAorCTB4MDAwMCwgMHgyZDIwLCAweDdjMDYsIDB4YTY4YSwgMHgwMDNkLCAweDEyMjgsIDB4MjYwOCwgMHhhZDkwLAorCTB4MDAwZiwgMHgwNDU5LCAweDAwODgsIDB4YTZiMiwgMHgwMDNjLCAweDIwMDksIDB4MDAzYywgMHgyZDc4LAorCTB4YWQ5MCwgMHgwMDBmLCAweDA0MTEsIDB4MGMyOCwgMHgwMGZlLCAweDg1MmYsIDB4YTVhZCwgMHgwMDAzLAorCTB4N2QzNiwgMHhhNWFjLCAweDAwMDAsIDB4MDAyOCwgMHgwMGZlLCAweDg1MmYsIDB4YTVhZCwgMHgwMDAzLAorCTB4N2QzNiwgMHgwMGRlLCAweDAwNmUsIDB4MDA1ZSwgMHgwMDA1LCAweDAwZjYsIDB4OGRmZiwgMHgwMTU4LAorCTB4NjgwNCwgMHhhMDdkLCAweDAxMzAsIDB4NjgwNywgMHgwMDAwLCAweDA4MGMsIDB4NTQwOCwgMHgyZjY4LAorCTB4MGNiOCwgMHgwODBjLCAweDU0MDgsIDB4MDBmZSwgMHgwMDA1LCAweDAxNTYsIDB4YTE4NCwgMHgwMDAxLAorCTB4MDEwOCwgMHg4MTA4LCAweDgxMGMsIDB4MjFhOCwgMHgyMzA0LCAweDgwMDcsIDB4MjAxMiwgMHg4MzE4LAorCTB4ODIxMCwgMHgxZjA0LCAweDk5MTQsIDB4MDE1ZSwgMHgwMDA1LCAweDAwNjYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDMxLCAweDAwMDEsIDB4NjAxYywgMHhhMDg0LCAweDAwMGYsIDB4MDA4MywgMHgwMTJlLAorCTB4MDA2ZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwNjYsIDB4MjAzMSwgMHgwMDAwLAorCTB4NjAxYywgMHhhMDg0LCAweDAwMGYsIDB4MDAxYiwgMHgwMDZlLCAweDAxMmUsIDB4MDAwNSwgMHg5OTU0LAorCTB4OTk1NCwgMHg5OTRmLCAweDk5NzYsIDB4OTk0MiwgMHg5OTRmLCAweDk5NzYsIDB4OTk0ZiwgMHg5OTRmLAorCTB4OTk0MiwgMHg5OTRmLCAweDA4MGMsIDB4MTUxNSwgMHgwMDM2LCAweDIwMTksIDB4MDAxMCwgMHgwODBjLAorCTB4YWNlMCwgMHg2MDFmLCAweDAwMDYsIDB4NjAwMywgMHgwMDA3LCAweDAwM2UsIDB4MDAwNSwgMHhhMDA2LAorCTB4MDAwNSwgMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMGQ2LCAweDg2ZmYsIDB4MTFkOCwgMHg2MDEwLAorCTB4MjA2OCwgMHgwODBjLCAweDljNWEsIDB4MDFjMCwgMHg2ODM0LCAweGEwODYsIDB4MDEzOSwgMHgxMTI4LAorCTB4Njg0YiwgMHgwMDA1LCAweDY4NTMsIDB4MDAwMCwgMHgwMDI4LCAweGEwMGUsIDB4MjAwMSwgMHgwMDA1LAorCTB4MDgwYywgMHg1NGRiLCAweDA4MGMsIDB4OWVkMiwgMHgwODBjLCAweDU0MDgsIDB4MDgwYywgMHg4NjFkLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwZGUsIDB4MDAwNSwgMHhhMDA2LCAweDBjZTAsIDB4NjAwMCwgMHhhMDhhLAorCTB4MDAxMCwgMHgxYTBjLCAweDE1MTUsIDB4MDAwYiwgMHgwMDA1LCAweDk5OGQsIDB4OTlhZSwgMHg5OThmLAorCTB4OTljZCwgMHg5OWFiLCAweDk5OGQsIDB4OTk0ZiwgMHg5OTU0LCAweDk5NTQsIDB4OTk0ZiwgMHg5OTRmLAorCTB4OTk0ZiwgMHg5OTRmLCAweDk5NGYsIDB4OTk0ZiwgMHg5OTRmLCAweDA4MGMsIDB4MTUxNSwgMHg4NmZmLAorCTB4MTFiOCwgMHg2MDFjLCAweGEwODYsIDB4MDAwNiwgMHgwMTk4LCAweDAwZDYsIDB4NjAxMCwgMHgyMDY4LAorCTB4MDgwYywgMHg5YzVhLCAweDAxMTAsIDB4MDgwYywgMHg5ZWQyLCAweDAwZGUsIDB4NjAwNywgMHgwMDg1LAorCTB4NjAwMywgMHgwMDBiLCAweDYwMWYsIDB4MDAwMiwgMHgwODBjLCAweDZjOGQsIDB4MDgwYywgMHg3MTczLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDgwYywgMHgxOTRkLCAweDBjMDgsIDB4MDBlNiwgMHgyMDcxLAorCTB4YjdlMCwgMHg3MDI0LCAweGFjMDYsIDB4MTExMCwgMHgwODBjLCAweDdmNTksIDB4NjAxYywgMHhhMDg0LAorCTB4MDAwZiwgMHhhMDg2LCAweDAwMDYsIDB4MTE1MCwgMHgwMDg2LCAweDAwOTYsIDB4MjA0OSwgMHgwMDAxLAorCTB4MmM0MCwgMHgwODBjLCAweDgxMzAsIDB4MDA5ZSwgMHgwMDhlLCAweDAwMTAsIDB4MDgwYywgMHg3ZTU4LAorCTB4MDBlZSwgMHgxOTI4LCAweDA4MGMsIDB4OTk0ZiwgMHgwMDA1LCAweDAwMzYsIDB4MDBlNiwgMHgyMDcxLAorCTB4YjdlMCwgMHg3MDNjLCAweGFjMDYsIDB4MTE0MCwgMHgyMDE5LCAweDAwMDAsIDB4MDgwYywgMHg3ZmU0LAorCTB4MDBlZSwgMHgwMDNlLCAweDA4MDQsIDB4OTk4ZiwgMHgwODBjLCAweDgyNWQsIDB4MDBlZSwgMHgwMDNlLAorCTB4MTkwNCwgMHg5OThmLCAweDA4MGMsIDB4OTk0ZiwgMHgwMDA1LCAweDAwYzYsIDB4NjAxYywgMHhhMDg0LAorCTB4MDAwZiwgMHgwMDEzLCAweDAwY2UsIDB4MDAwNSwgMHg5OWZlLCAweDlhNmIsIDB4OWJiOSwgMHg5YTA5LAorCTB4OWUxZCwgMHg5OWZlLCAweGFjZDIsIDB4YTE0ZSwgMHg5YTZiLCAweDk5ZjcsIDB4OWMyNCwgMHgwODBjLAorCTB4MTUxNSwgMHgwODBjLCAweDllNTgsIDB4MTExMCwgMHgwODBjLCAweDhjMTksIDB4MDAwNSwgMHgwODBjLAorCTB4NzA5MCwgMHgwODBjLCAweDcxNzMsIDB4MDgwYywgMHg4NjFkLCAweDAwMDUsIDB4NjAxNywgMHgwMDAxLAorCTB4MDAwNSwgMHgwODBjLCAweDljNWEsIDB4MDEyMCwgMHg2MDEwLCAweGEwODAsIDB4MDAxOSwgMHgyYzAyLAorCTB4NjAwMCwgMHhhMDhhLCAweDAwMTAsIDB4MWEwYywgMHgxNTE1LCAweDAwMGIsIDB4MDAwNSwgMHg5YTI3LAorCTB4OWEyOSwgMHg5YTQ5LCAweDlhNWIsIDB4OWE2OCwgMHg5YTI3LCAweDk5ZmUsIDB4OTlmZSwgMHg5OWZlLAorCTB4OWE1YiwgMHg5YTViLCAweDlhMjcsIDB4OWEyNywgMHg5YTI3LCAweDlhMjcsIDB4OWE2NSwgMHgwODBjLAorCTB4MTUxNSwgMHgwMGU2LCAweDYwMTAsIDB4MjA3MCwgMHg3MDUwLCAweGMwYjUsIDB4NzA1MiwgMHgyMDcxLAorCTB4YjdlMCwgMHg3MDI0LCAweGFjMDYsIDB4MDE5MCwgMHgwODBjLCAweDdlNTgsIDB4NjAwNywgMHgwMDg1LAorCTB4NjAwMywgMHgwMDBiLCAweDYwMWYsIDB4MDAwMiwgMHgyMDAxLCAweGI3YjcsIDB4MjAwNCwgMHg2MDE2LAorCTB4MDgwYywgMHg2YzhkLCAweDA4MGMsIDB4NzE3MywgMHgwMGVlLCAweDAwMDUsIDB4NjAxNywgMHgwMDAxLAorCTB4MGNkOCwgMHgwMGQ2LCAweDYwMTAsIDB4MjA2OCwgMHg2ODUwLCAweGMwYjUsIDB4Njg1MiwgMHgwMGRlLAorCTB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDFmLCAweDAwMDIsIDB4MDgwYywgMHg2YzhkLAorCTB4MDgwYywgMHg3MTczLCAweDAwMDUsIDB4MDBkNiwgMHg2MDE3LCAweDAwMDEsIDB4NjAxMCwgMHgyMDY4LAorCTB4Njg1MCwgMHhjMGI1LCAweDY4NTIsIDB4MDBkZSwgMHgwMDA1LCAweDA4MGMsIDB4ODYxZCwgMHgwMDA1LAorCTB4MDgwYywgMHgxOTRkLCAweDA4ZjAsIDB4NjAwMCwgMHhhMDhhLCAweDAwMTAsIDB4MWEwYywgMHgxNTE1LAorCTB4MDAwYiwgMHgwMDA1LCAweDlhODIsIDB4OWEwNiwgMHg5YTg0LCAweDlhODIsIDB4OWE4NCwgMHg5YTg0LAorCTB4OTlmZiwgMHg5YTgyLCAweDk5ZjksIDB4OTlmOSwgMHg5YTgyLCAweDlhODIsIDB4OWE4MiwgMHg5YTgyLAorCTB4OWE4MiwgMHg5YTgyLCAweDA4MGMsIDB4MTUxNSwgMHgwMGQ2LCAweDYwMTgsIDB4MjA2OCwgMHg2ODA0LAorCTB4YTA4NCwgMHgwMGZmLCAweDAwZGUsIDB4YTA4YSwgMHgwMDBjLCAweDFhMGMsIDB4MTUxNSwgMHgwMDBiLAorCTB4MDAwNSwgMHg5YTlkLCAweDliNWYsIDB4OWE5ZiwgMHg5YWRkLCAweDlhOWYsIDB4OWFkZCwgMHg5YTlmLAorCTB4OWFhZCwgMHg5YTlkLCAweDlhZGQsIDB4OWE5ZCwgMHg5YWM5LCAweDA4MGMsIDB4MTUxNSwgMHg2MDA0LAorCTB4YTA4ZSwgMHgwMDE2LCAweDA1YTgsIDB4YTA4ZSwgMHgwMDA0LCAweDA1OTAsIDB4YTA4ZSwgMHgwMDAyLAorCTB4MDU3OCwgMHhhMDhlLCAweDAwNGIsIDB4MDkwNCwgMHg5YjViLCAweDYwMDQsIDB4MDgwYywgMHg5ZTU4LAorCTB4MDkwNCwgMHg5Yjc4LCAweGEwOGUsIDB4MDAyMSwgMHgwOTA0LCAweDliN2MsIDB4YTA4ZSwgMHgwMDIyLAorCTB4MDkwNCwgMHg5Yjc4LCAweGEwOGUsIDB4MDAzZCwgMHgwOTA0LCAweDliN2MsIDB4YTA4ZSwgMHgwMDM5LAorCTB4MDkwNCwgMHg5YjgwLCAweGEwOGUsIDB4MDAzNSwgMHgwOTA0LCAweDliODAsIDB4YTA4ZSwgMHgwMDFlLAorCTB4MDE4OCwgMHhhMDhlLCAweDAwMDEsIDB4MTE1MCwgMHgwMGQ2LCAweDYwMTgsIDB4MjA2OCwgMHg2ODA0LAorCTB4YTA4NCwgMHgwMGZmLCAweDAwZGUsIDB4YTA4NiwgMHgwMDA2LCAweDAxMTAsIDB4MDgwYywgMHgyYzljLAorCTB4MDgwYywgMHg4YzE5LCAweDA4MGMsIDB4OWUxZCwgMHgwMDA1LCAweDAwYzYsIDB4MDBkNiwgMHg2MTA0LAorCTB4YTE4NiwgMHgwMDE2LCAweDA5MDQsIDB4OWI0YywgMHhhMTg2LCAweDAwMDIsIDB4MTVkOCwgMHgyMDAxLAorCTB4YjUzNSwgMHgyMDA0LCAweGQwOGMsIDB4MTE5OCwgMHgwODBjLCAweDVhY2YsIDB4MTE4MCwgMHgyMDAxLAorCTB4Yjc5ZiwgMHgyMDAzLCAweDAwMDEsIDB4MjAwMSwgMHhiNTAwLCAweDIwMDMsIDB4MDAwMSwgMHhhMDg1LAorCTB4MDAwMSwgMHgwODBjLCAweDViMTMsIDB4MDgwYywgMHg1YTA3LCAweDA4MDQsIDB4OWJhMiwgMHg2MDE4LAorCTB4MjA2OCwgMHgyMDAxLCAweGI1MzUsIDB4MjAwNCwgMHhkMGFjLCAweDE5MDQsIDB4OWJhMiwgMHg2OGEwLAorCTB4ZDBiYywgMHgxOTA0LCAweDliYTIsIDB4Njg0MCwgMHhhMDg0LCAweDAwZmYsIDB4YTAwNSwgMHgwMTkwLAorCTB4ODAwMSwgMHg2ODQyLCAweDYwMTMsIDB4MDAwMCwgMHg2MDFmLCAweDAwMDcsIDB4NjAxNywgMHgwMzk4LAorCTB4NjAzZiwgMHgwMDAwLCAweDA4MGMsIDB4ODVjNywgMHgwMTI4LCAweDJkMDAsIDB4NjAxYSwgMHg2MDFmLAorCTB4MDAwMSwgMHgwNDUwLCAweDAwZGUsIDB4MDBjZSwgMHg2MDA0LCAweGEwOGUsIDB4MDAwMiwgMHgxMWE4LAorCTB4NjAxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMDg2LCAweDAwN2UsIDB4MTE3MCwgMHgyMDA5LAorCTB4YjUzNSwgMHgyMTA0LCAweGMwODUsIDB4MjAwYSwgMHgwMGU2LCAweDIwNzEsIDB4YjUwMCwgMHgwODBjLAorCTB4NGJjNiwgMHgwMGVlLCAweDA4MGMsIDB4OGMxOSwgMHgwMDIwLCAweDA4MGMsIDB4OGMxOSwgMHgwODBjLAorCTB4MmM5YywgMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4MmNjMiwgMHgwMTJlLAorCTB4MDBlZSwgMHgwODBjLCAweDllMWQsIDB4MDAwNSwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg0ZWZkLAorCTB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMiwgMHgwODBjLCAweDZjZDMsIDB4MDgwYywgMHg3MTczLAorCTB4MDBkZSwgMHgwMGNlLCAweDBjODAsIDB4MDgwYywgMHgyY2MyLCAweDA4MDQsIDB4OWFkOCwgMHgwMGM2LAorCTB4MDBkNiwgMHg2MTA0LCAweGExODYsIDB4MDAxNiwgMHgwZDM4LCAweDYwMTgsIDB4MjA2OCwgMHg2ODQwLAorCTB4YTA4NCwgMHgwMGZmLCAweGEwMDUsIDB4MDkwNCwgMHg5YjIyLCAweDgwMDEsIDB4Njg0MiwgMHg2MDAzLAorCTB4MDAwMSwgMHgwODBjLCAweDZjZDMsIDB4MDgwYywgMHg3MTczLCAweDAwZGUsIDB4MDBjZSwgMHgwODk4LAorCTB4MDgwYywgMHg4YzE5LCAweDA4MDQsIDB4OWFkYSwgMHgwODBjLCAweDhjNDcsIDB4MDgwNCwgMHg5YWRhLAorCTB4MDBkNiwgMHgyYzY4LCAweDYxMDQsIDB4MDgwYywgMHhhMTBhLCAweDAwZGUsIDB4MDExOCwgMHgwODBjLAorCTB4ODYxZCwgMHgwMGI4LCAweDYwMDQsIDB4ODAwNywgMHg2MTMwLCAweGExOGMsIDB4MDBmZiwgMHhhMTA1LAorCTB4NjAzMiwgMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMWYsIDB4MDAwMiwgMHg2MDM4LAorCTB4NjAwYSwgMHgyMDAxLCAweGI3YjcsIDB4MjAwNCwgMHg2MDE2LCAweDA4MGMsIDB4NmM4ZCwgMHgwODBjLAorCTB4NzE3MywgMHgwMDA1LCAweDAwZGUsIDB4MDBjZSwgMHgwODBjLCAweDhjMTksIDB4MDgwYywgMHgyYzljLAorCTB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDJjYzIsIDB4NjAxMywgMHgwMDAwLAorCTB4NjAxZiwgMHgwMDA3LCAweDYwMTcsIDB4MDM5OCwgMHg2MDNmLCAweDAwMDAsIDB4MDEyZSwgMHgwMGVlLAorCTB4MDAwNSwgMHg2MDAwLCAweGEwOGEsIDB4MDAxMCwgMHgxYTBjLCAweDE1MTUsIDB4MDAwYiwgMHgwMDA1LAorCTB4OWJkMCwgMHg5YmQwLCAweDliZDAsIDB4OWJkMCwgMHg5YmQwLCAweDliZDAsIDB4OWJkMCwgMHg5YmQwLAorCTB4OWJkMCwgMHg5OWZlLCAweDliZDAsIDB4OWEwNiwgMHg5YmQyLCAweDlhMDYsIDB4OWJkZiwgMHg5YmQwLAorCTB4MDgwYywgMHgxNTE1LCAweDYwMDQsIDB4YTA4NiwgMHgwMDhiLCAweDAxNDgsIDB4NjAwNywgMHgwMDhiLAorCTB4NjAwMywgMHgwMDBkLCAweDA4MGMsIDB4NmM4ZCwgMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHgwODBjLAorCTB4OWUxMSwgMHgwODBjLCAweDljNWEsIDB4MDU4MCwgMHgwODBjLCAweDJjOWMsIDB4MDBkNiwgMHgwODBjLAorCTB4OWM1YSwgMHgwMTY4LCAweDYwMTAsIDB4MjA2OCwgMHg2ODM3LCAweDAxMDMsIDB4Njg0YiwgMHgwMDA2LAorCTB4Njg0NywgMHgwMDAwLCAweDY4NTAsIDB4YzBlZCwgMHg2ODUyLCAweDA4MGMsIDB4NTQwOCwgMHgyYzY4LAorCTB4MDgwYywgMHg4NWM3LCAweDAxNTAsIDB4NjgxOCwgMHg2MDFhLCAweDA4MGMsIDB4YTAyNywgMHgwMGM2LAorCTB4MmQ2MCwgMHgwODBjLCAweDllMWQsIDB4MDBjZSwgMHgwMDA4LCAweDJkNjAsIDB4MDBkZSwgMHg2MDEzLAorCTB4MDAwMCwgMHg2MDFmLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLAorCTB4NmNkMywgMHgwODBjLCAweDcxNzMsIDB4MDA3OCwgMHg2MDMwLCAweGEwOGMsIDB4ZmYwMCwgMHg4MTBmLAorCTB4YTE4NiwgMHgwMDM5LCAweDAxMTgsIDB4YTE4NiwgMHgwMDM1LCAweDExMTgsIDB4MDgwYywgMHgyYzljLAorCTB4MDhiMCwgMHgwODBjLCAweDllMWQsIDB4MDAwNSwgMHg2MDAwLCAweGEwOGEsIDB4MDAxMCwgMHgxYTBjLAorCTB4MTUxNSwgMHgwMDBiLCAweDAwMDUsIDB4OWMzYiwgMHg5YzNiLCAweDljM2IsIDB4OWMzZCwgMHg5YzNkLAorCTB4OWMzYiwgMHg5YzNiLCAweDljM2IsIDB4OWMzYiwgMHg5YzNiLCAweDljM2IsIDB4OWMzYiwgMHg5YzNiLAorCTB4OWMzYiwgMHg5YzNiLCAweDljM2IsIDB4MDgwYywgMHgxNTE1LCAweDA4MGMsIDB4ODI1ZCwgMHgxOTBjLAorCTB4MTUxNSwgMHg2MTEwLCAweDIxNjgsIDB4Njg0YiwgMHgwMDA2LCAweDA4MGMsIDB4NTQwOCwgMHgwODBjLAorCTB4ODYxZCwgMHgwMDA1LCAweGEyODQsIDB4MDAwNywgMHgxMTU4LCAweGEyODIsIDB4YmQwMCwgMHgwMjQwLAorCTB4MjAwMSwgMHhiNTE3LCAweDIwMDQsIDB4YTIwMiwgMHgxMjE4LCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LAorCTB4YTAwNiwgMHgwY2U4LCAweDAwMjYsIDB4NjIxMCwgMHhhMjk0LCAweGYwMDAsIDB4MDAyZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgwMGM2LCAweDAwMzYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDYxLAorCTB4YmQwMCwgMHgyMDcxLCAweGI1MDAsIDB4NzM0OCwgMHg3MDY4LCAweGEzMDIsIDB4MTJhOCwgMHg2MDFjLAorCTB4YTIwNiwgMHgxMTYwLCAweDA4MGMsIDB4OWZiMiwgMHgwMTQ4LCAweDA4MGMsIDB4OWU1OCwgMHgxMTEwLAorCTB4MDgwYywgMHg4YzE5LCAweDAwYzYsIDB4MDgwYywgMHg4NjFkLCAweDAwY2UsIDB4YWNlMCwgMHgwMDE4LAorCTB4NzA1YywgMHhhYzAyLCAweDEyMDgsIDB4MGMzOCwgMHgwMTJlLCAweDAwMGUsIDB4MDAzZSwgMHgwMGNlLAorCTB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMDE2LCAweGExODgsIDB4YjYzNSwgMHgyMTBjLAorCTB4ODFmZiwgMHgwMTI4LCAweDIwNjEsIDB4YjhmNCwgMHg2MTFhLCAweDA4MGMsIDB4MmM5YywgMHhhMDA2LAorCTB4MDAxMCwgMHhhMDg1LCAweDAwMDEsIDB4MDAxZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGM2LAorCTB4MDA1NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGM2LCAweDA4MGMsIDB4ODVjNywgMHgwMDVlLAorCTB4MDE4MCwgMHg2NjEyLCAweDY1MWEsIDB4MDgwYywgMHhhMDI3LCAweDYwMWYsIDB4MDAwMywgMHgyMDA5LAorCTB4MDA0YiwgMHgwODBjLCAweDg2NGMsIDB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDA1ZSwgMHgwMGNlLAorCTB4MDAwNSwgMHhhMDA2LCAweDBjZDAsIDB4MDBjNiwgMHgwMDU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjJhMCwgMHgwMGM2LCAweDA4MGMsIDB4OWVkNiwgMHgwMDVlLCAweDA1NTAsIDB4NjAxMywgMHgwMDAwLAorCTB4NjUxYSwgMHgwODBjLCAweGEwMjcsIDB4NjAxZiwgMHgwMDAzLCAweDAwMTYsIDB4MDBjNiwgMHgyNTYwLAorCTB4MDgwYywgMHg1MWFhLCAweDAwY2UsIDB4MDgwYywgMHg2ZGY1LCAweDAwNzYsIDB4MjAzOSwgMHgwMDAwLAorCTB4MDgwYywgMHg2ZDAyLCAweDJjMDgsIDB4MDgwYywgMHhhZTgyLCAweDAwN2UsIDB4MDAxZSwgMHhkMTg0LAorCTB4MDEyOCwgMHgwODBjLCAweDg2MWQsIDB4YTA4NSwgMHgwMDAxLCAweDAwMzAsIDB4MjAwOSwgMHgwMDRjLAorCTB4MDgwYywgMHg4NjRjLCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwNWUsIDB4MDBjZSwgMHgwMDA1LAorCTB4YTAwNiwgMHgwY2QwLCAweDAwZjYsIDB4MDBjNiwgMHgwMDQ2LCAweDAwYzYsIDB4MDgwYywgMHg4NWM3LAorCTB4MmM3OCwgMHgwMGNlLCAweDAxODAsIDB4N2UxMiwgMHgyYzAwLCAweDc4MWEsIDB4NzgxZiwgMHgwMDAzLAorCTB4MjAyMSwgMHgwMDA1LCAweDA4MGMsIDB4OWQ1MCwgMHgyZjYwLCAweDIwMDksIDB4MDA0ZCwgMHgwODBjLAorCTB4ODY0YywgMHhhMDg1LCAweDAwMDEsIDB4MDA0ZSwgMHgwMGNlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LAorCTB4MDBjNiwgMHgwMDQ2LCAweDAwYzYsIDB4MDgwYywgMHg4NWM3LCAweDJjNzgsIDB4MDBjZSwgMHgwMTc4LAorCTB4N2UxMiwgMHgyYzAwLCAweDc4MWEsIDB4NzgxZiwgMHgwMDAzLCAweDIwMjEsIDB4MDAwNSwgMHgwNDgxLAorCTB4MmY2MCwgMHgyMDA5LCAweDAwNGUsIDB4MDgwYywgMHg4NjRjLCAweGEwODUsIDB4MDAwMSwgMHgwMDRlLAorCTB4MDBjZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGM2LCAweDAwNDYsIDB4MDBjNiwgMHgwODBjLAorCTB4ODVjNywgMHgyYzc4LCAweDAwY2UsIDB4MDFjMCwgMHg3ZTEyLCAweDJjMDAsIDB4NzgxYSwgMHg3ODFmLAorCTB4MDAwMywgMHgyMDIxLCAweDAwMDQsIDB4MDBhMSwgMHgyMDAxLCAweGI3YTAsIDB4MjAwNCwgMHhkMGZjLAorCTB4MDEyMCwgMHgyZjYwLCAweDA4MGMsIDB4ODYxZCwgMHgwMDI4LCAweDJmNjAsIDB4MjAwOSwgMHgwMDUyLAorCTB4MDgwYywgMHg4NjRjLCAweGEwODUsIDB4MDAwMSwgMHgwMDRlLCAweDAwY2UsIDB4MDBmZSwgMHgwMDA1LAorCTB4MDA5NiwgMHgwMDc2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NTE0YywgMHgwMTE4LAorCTB4MjAwMSwgMHg5ZDU1LCAweDAwMjgsIDB4MDgwYywgMHg1MTFjLCAweDAxNTgsIDB4MjAwMSwgMHg5ZDViLAorCTB4MDAwNiwgMHhhMDBlLCAweDI0MDAsIDB4MDgwYywgMHg1NGRiLCAweDA4MGMsIDB4NTQwOCwgMHgwMDBlLAorCTB4MDgwNywgMHgyNDE4LCAweDA4MGMsIDB4NzAyZiwgMHg2MmEwLCAweDAwODYsIDB4MjA0MSwgMHgwMDAxLAorCTB4MjAzOSwgMHgwMDAxLCAweDI2MDgsIDB4MDgwYywgMHg2ZTBlLCAweDAwOGUsIDB4MDgwYywgMHg2ZDAyLAorCTB4MmYwOCwgMHgyNjQ4LCAweDA4MGMsIDB4YWU4MiwgMHg2MTNjLCAweDgxZmYsIDB4MDkwYywgMHg2ZWMzLAorCTB4MDgwYywgMHg3MTczLCAweDAxMmUsIDB4MDA3ZSwgMHgwMDllLCAweDAwMDUsIDB4MDBjNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDAwYzYsIDB4MDgwYywgMHg4NWM3LCAweDAwMWUsIDB4MDE4OCwgMHg2NjBhLAorCTB4NjExYSwgMHgwODBjLCAweGEwMjcsIDB4NjAxZiwgMHgwMDAxLCAweDJkMDAsIDB4NjAxMiwgMHgyMDA5LAorCTB4MDAxZiwgMHgwODBjLCAweDg2NGMsIDB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LAorCTB4YTAwNiwgMHgwY2Q4LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDBjNiwgMHgwODBjLAorCTB4ODVjNywgMHgwMDFlLCAweDAxODgsIDB4NjYwYSwgMHg2MTFhLCAweDA4MGMsIDB4YTAyNywgMHg2MDFmLAorCTB4MDAwOCwgMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDIxLCAweDA4MGMsIDB4ODY0YywgMHhhMDg1LAorCTB4MDAwMSwgMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwgMHhhMDA2LCAweDBjZDgsIDB4MDBjNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDAwYzYsIDB4MDgwYywgMHg4NWM3LCAweDAwMWUsIDB4MDE4OCwgMHg2NjBhLAorCTB4NjExYSwgMHgwODBjLCAweGEwMjcsIDB4NjAxZiwgMHgwMDAxLCAweDJkMDAsIDB4NjAxMiwgMHgyMDA5LAorCTB4MDAzZCwgMHgwODBjLCAweDg2NGMsIDB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LAorCTB4YTAwNiwgMHgwY2Q4LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDBjNiwgMHgwODBjLAorCTB4OWVkNiwgMHgwMDFlLCAweDAxODAsIDB4NjExYSwgMHgwODBjLCAweGEwMjcsIDB4NjAxZiwgMHgwMDAxLAorCTB4MmQwMCwgMHg2MDEyLCAweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweDg2NGMsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDEyZSwgMHgwMGNlLCAweDAwMDUsIDB4YTAwNiwgMHgwY2Q4LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwMGM2LCAweDA4MGMsIDB4ODVjNywgMHgwMDFlLCAweDAxODgsIDB4NjYwYSwgMHg2MTFhLAorCTB4MDgwYywgMHhhMDI3LCAweDYwMWYsIDB4MDAwMSwgMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDQ0LAorCTB4MDgwYywgMHg4NjRjLCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwgMHhhMDA2LAorCTB4MGNkOCwgMHgwMDI2LCAweDAwZDYsIDB4NjIxOCwgMHgyMjY4LCAweDZhM2MsIDB4ODJmZiwgMHgwMTEwLAorCTB4ODIxMSwgMHg2YTNlLCAweDAwZGUsIDB4MDAyZSwgMHgwMDA1LCAweDAwMDYsIDB4NjAwMCwgMHhhMDg2LAorCTB4MDAwMCwgMHgwMTkwLCAweDYwMTMsIDB4MDAwMCwgMHg2MDFmLCAweDAwMDcsIDB4MjAwMSwgMHhiN2I2LAorCTB4MjAwNCwgMHgwMDA2LCAweGEwODIsIDB4MDA1MSwgMHgwMDBlLCAweDAyMDgsIDB4ODAwNCwgMHg2MDE2LAorCTB4MDgwYywgMHhiMzNhLCAweDYwM2YsIDB4MDAwMCwgMHgwMDBlLCAweDAwMDUsIDB4MDA2NiwgMHgwMGM2LAorCTB4MDBkNiwgMHgyMDMxLCAweGI1NTMsIDB4MjYzNCwgMHhkNmU0LCAweDAxMjgsIDB4NjYxOCwgMHgyNjYwLAorCTB4NmU0OCwgMHgwODBjLCAweDUwZDUsIDB4MDBkZSwgMHgwMGNlLCAweDAwNmUsIDB4MDAwNSwgMHgwMDA2LAorCTB4MDAxNiwgMHg2MDA0LCAweGEwOGUsIDB4MDAwMiwgMHgwMTQwLCAweGEwOGUsIDB4MDAwMywgMHgwMTI4LAorCTB4YTA4ZSwgMHgwMDA0LCAweDAxMTAsIDB4YTA4NSwgMHgwMDAxLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgwMGQ2LCAweDYwMTAsIDB4YTA2ZCwgMHgwMTQ4LCAweDY4MzQsIDB4YTA4NiwgMHgwMTM5LAorCTB4MDEzOCwgMHg2ODM4LCAweGQwZmMsIDB4MDExMCwgMHhhMDA2LCAweDAwMTAsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDBkZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGM2LAorCTB4MDgwYywgMHg4NWM3LCAweDAwMWUsIDB4MDE5MCwgMHg2MTFhLCAweDA4MGMsIDB4YTAyNywgMHg2MDFmLAorCTB4MDAwMSwgMHgyZDAwLCAweDYwMTIsIDB4MDgwYywgMHgyYzljLCAweDIwMDksIDB4MDAyOCwgMHgwODBjLAorCTB4ODY0YywgMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsIDB4YTAwNiwgMHgwY2Q4LAorCTB4YTE4NiwgMHgwMDE1LCAweDExNzgsIDB4MjAxMSwgMHhiNTIxLCAweDIyMDQsIDB4YTA4NiwgMHgwMDc0LAorCTB4MTE0OCwgMHgwODBjLCAweDhmOTgsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAyOSwgMHgwODBjLAorCTB4NmNkMywgMHgwMDIwLCAweDA4MGMsIDB4OGMxOSwgMHgwODBjLCAweDg2MWQsIDB4MDAwNSwgMHhhMTg2LAorCTB4MDAxNiwgMHgxMTI4LCAweDIwMDEsIDB4MDAwNCwgMHgwODBjLCAweDRlZmQsIDB4MDBlOCwgMHhhMTg2LAorCTB4MDAxNSwgMHgxMWU4LCAweDIwMTEsIDB4YjUyMSwgMHgyMjA0LCAweGEwODYsIDB4MDAxNCwgMHgxMWI4LAorCTB4MDBkNiwgMHg2MDE4LCAweDIwNjgsIDB4MDgwYywgMHg1MDRiLCAweDAwZGUsIDB4MDgwYywgMHg5MDUxLAorCTB4MTE3MCwgMHgwMGQ2LCAweDYwMTgsIDB4MjA2OCwgMHg2ODkwLCAweDAwZGUsIDB4YTAwNSwgMHgwMTM4LAorCTB4MjAwMSwgMHgwMDA2LCAweDA4MGMsIDB4NGVmZCwgMHgwODBjLCAweDg3YTAsIDB4MDAyMCwgMHgwODBjLAorCTB4OGMxOSwgMHgwODBjLCAweDg2MWQsIDB4MDAwNSwgMHg2ODQ4LCAweGEwODYsIDB4MDAwNSwgMHgxMTA4LAorCTB4MDAwOSwgMHgwMDA1LCAweDY4NTAsIDB4YzBhZCwgMHg2ODUyLCAweDAwMDUsIDB4MDBlNiwgMHgwMTI2LAorCTB4MjA3MSwgMHhiNTAwLCAweDIwOTEsIDB4ODAwMCwgMHg3NTQ4LCAweGE1ODIsIDB4MDAwMSwgMHgwNjA4LAorCTB4NzA0YywgMHgyMDYwLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAwLCAweDAxNDgsIDB4YWNlMCwgMHgwMDE4LAorCTB4NzA1YywgMHhhYzAyLCAweDEyMDgsIDB4MGNiMCwgMHgyMDYxLCAweGJkMDAsIDB4MGM5OCwgMHg2MDAzLAorCTB4MDAwOCwgMHg4NTI5LCAweDc1NGEsIDB4YWNhOCwgMHgwMDE4LCAweDcwNWMsIDB4YTUwMiwgMHgxMjMwLAorCTB4NzU0ZSwgMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4NzA0ZiwgMHhiZDAwLAorCTB4MGNjMCwgMHhhMDA2LCAweDBjYzAsIDB4MDBlNiwgMHgyMDcxLCAweGJiOGMsIDB4NzAxNCwgMHhkMGU0LAorCTB4MDE1MCwgMHg2MDEzLCAweDAwMDAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDA1MCwgMHgwODBjLAorCTB4NmM4ZCwgMHgwODBjLCAweDcxNzMsIDB4MDBlZSwgMHgwMDA1LCAweDAwYzYsIDB4MDBmNiwgMHgyYzc4LAorCTB4MDgwYywgMHg1MzA1LCAweDAwZmUsIDB4MDEyMCwgMHg2MDFjLCAweGEwODQsIDB4MDAwZiwgMHgwMDEzLAorCTB4MDBjZSwgMHgwMDA1LCAweDk5ZmUsIDB4OWYyZCwgMHg5ZjMwLCAweDlmMzMsIDB4YjEyNywgMHhiMTQyLAorCTB4YjE0NSwgMHg5OWZlLCAweDk5ZmUsIDB4MDgwYywgMHgxNTE1LCAweGUwMDAsIDB4ZTAwMCwgMHgwMDA1LAorCTB4ZTAwMCwgMHhlMDAwLCAweDAwMDUsIDB4MDAwOSwgMHgwMDA1LCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLAorCTB4NTMwNSwgMHgwNTM4LCAweDA4MGMsIDB4ODVjNywgMHgxMTI4LCAweDIwMDEsIDB4YjdiOCwgMHgyMDA0LAorCTB4NzgzZSwgMHgwMGY4LCAweDc4MTgsIDB4NjAxYSwgMHgwODBjLCAweGEwMjcsIDB4NzgxYywgMHhhMDg2LAorCTB4MDAwMywgMHgwMTI4LCAweDc4MDgsIDB4NjAzNiwgMHgyZjAwLCAweDYwM2EsIDB4MDAyMCwgMHg3ODA4LAorCTB4NjAzYSwgMHgyZjAwLCAweDYwMzYsIDB4NjAyYSwgMHg2MDFmLCAweDAwMDEsIDB4NjAwNywgMHgwMDM1LAorCTB4NjAwMywgMHgwMDAxLCAweDc5NTAsIDB4NjE1MiwgMHgwODBjLCAweDZjOGQsIDB4MDgwYywgMHg3MTczLAorCTB4MmY2MCwgMHgwMGZlLCAweDAwMDUsIDB4MDAxNiwgMHgwMGY2LCAweDY4MmMsIDB4NjAzMiwgMHhhMDhlLAorCTB4MDAwMSwgMHgwMTM4LCAweGEwODYsIDB4MDAwNSwgMHgwMTQwLCAweGEwMDYsIDB4NjAyYSwgMHg2MDJlLAorCTB4MDBhMCwgMHg2ODIwLCAweGMwZjQsIDB4YzBkNSwgMHg2ODIyLCAweDY4MTAsIDB4MjA3OCwgMHg3ODdjLAorCTB4NjkzOCwgMHhhMTAyLCAweDc4ODAsIDB4NjkzNCwgMHhhMTAzLCAweDFlNzgsIDB4NjgzNCwgMHg2MDJhLAorCTB4NjgzOCwgMHhhMDg0LCAweGZmZmMsIDB4NjgzYSwgMHg2MDJlLCAweDJkMDAsIDB4NjAzNiwgMHg2ODA4LAorCTB4NjAzYSwgMHg2OTE4LCAweDYxMWEsIDB4Njk1MCwgMHg2MTUyLCAweDYwMWYsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDAzOSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2YzhkLCAweDY4MDMsIDB4MDAwMiwgMHgwMGZlLAorCTB4MDAxZSwgMHgwMDA1LCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweDUzMDUsIDB4MTExOCwgMHhhMDg1LAorCTB4MDAwMSwgMHgwMDcwLCAweDYwMjAsIDB4ZDBmNCwgMHgxMTUwLCAweGMwZjUsIDB4NjAyMiwgMHg2MDEwLAorCTB4MjA3OCwgMHg3ODI4LCAweDYwM2EsIDB4NzgyYywgMHg2MDM2LCAweDA4MGMsIDB4MTk0ZCwgMHhhMDA2LAorCTB4MDBmZSwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwgMHg2MDA0LCAweGEwOGUsIDB4MDAzNCwgMHgwMWI4LAorCTB4YTA4ZSwgMHgwMDM1LCAweDAxYTAsIDB4YTA4ZSwgMHgwMDM2LCAweDAxODgsIDB4YTA4ZSwgMHgwMDM3LAorCTB4MDE3MCwgMHhhMDhlLCAweDAwMzgsIDB4MDE1OCwgMHhhMDhlLCAweDAwMzksIDB4MDE0MCwgMHhhMDhlLAorCTB4MDAzYSwgMHgwMTI4LCAweGEwOGUsIDB4MDAzYiwgMHgwMTEwLCAweGEwODUsIDB4MDAwMSwgMHgwMDFlLAorCTB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBlNiwgMHgyMDAxLAorCTB4YjdiMiwgMHgyMDBjLCAweDgwMDAsIDB4MjAxNCwgMHgyMDAxLCAweDAwMzIsIDB4MDgwYywgMHg2YjQwLAorCTB4MjAwMSwgMHhiN2I2LCAweDgyZmYsIDB4MTExMCwgMHgyMDExLCAweDAwMTQsIDB4MjIwMiwgMHgyMDAxLAorCTB4YjdiNCwgMHgyMDBjLCAweDgwMDAsIDB4MjAxNCwgMHgyMDcxLCAweGI3OGUsIDB4NzExYSwgMHg3MjFlLAorCTB4MjAwMSwgMHgwMDY0LCAweDA4MGMsIDB4NmI0MCwgMHgyMDAxLCAweGI3YjcsIDB4ODJmZiwgMHgxMTEwLAorCTB4MjAxMSwgMHgwMDE0LCAweDIyMDIsIDB4MjAwOSwgMHhiN2I4LCAweGEyODAsIDB4MDAwYSwgMHgyMDBhLAorCTB4MDgwYywgMHg1MzJhLCAweDAwZWUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgwMGU2LCAweDIwMDEsIDB4YjdiNiwgMHgyMDAzLCAweDAwMjgsIDB4MjAwMSwgMHhiN2I3LAorCTB4MjAwMywgMHgwMDE0LCAweDIwNzEsIDB4Yjc4ZSwgMHg3MDFiLCAweDAwMDAsIDB4NzAxZiwgMHgwN2QwLAorCTB4MjAwMSwgMHhiN2I4LCAweDIwMDMsIDB4MDAxZSwgMHgwMGVlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGQ2LAorCTB4NjA1NCwgMHhhMDZkLCAweDAxMTAsIDB4MDgwYywgMHgxNjBmLCAweDAwZGUsIDB4MDAwNSwgMHgwMDA1LAorCTB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGM2LCAweDA4MGMsIDB4ODVjNywgMHgwMDFlLAorCTB4MDE3OCwgMHg2MTFhLCAweDBjYTEsIDB4NjAxZiwgMHgwMDAxLCAweDJkMDAsIDB4NjAxMiwgMHgyMDA5LAorCTB4MDAzMywgMHgwODBjLCAweDg2NGMsIDB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LAorCTB4YTAwNiwgMHgwY2Q4LCAweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzEsIDB4YjUwMCwgMHhhMTg2LAorCTB4MDAxNSwgMHgxNTAwLCAweDcwODQsIDB4YTA4NiwgMHgwMDE4LCAweDExZTAsIDB4NjAxMCwgMHgyMDY4LAorCTB4NmEzYywgMHhkMmU0LCAweDExNjAsIDB4MmM3OCwgMHgwODBjLCAweDczMzEsIDB4MDFkOCwgMHg3MDcwLAorCTB4NmE1MCwgMHhhMjA2LCAweDExNjAsIDB4NzA3NCwgMHg2YTU0LCAweGEyMDYsIDB4MTE0MCwgMHg2MjE4LAorCTB4YTI5MCwgMHgwMDI4LCAweDIyMTQsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4MmNlMSwgMHgwODBjLAorCTB4ODdhMCwgMHgwMDIwLCAweDA4MGMsIDB4OGMxOSwgMHgwODBjLCAweDg2MWQsIDB4MDBmZSwgMHgwMGVlLAorCTB4MDBkZSwgMHgwMDA1LCAweDcwNTQsIDB4NmE1NCwgMHhhMjA2LCAweDBkNDgsIDB4MGM4MCwgMHgwMGM2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDBjNiwgMHgwODBjLCAweDg1YzcsIDB4MDAxZSwgMHgwMTgwLAorCTB4NjExYSwgMHgwODBjLCAweGEwMjcsIDB4NjAxZiwgMHgwMDAxLCAweDJkMDAsIDB4NjAxMiwgMHgyMDA5LAorCTB4MDA0MywgMHgwODBjLCAweDg2NGMsIDB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LAorCTB4YTAwNiwgMHgwY2Q4LCAweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzEsIDB4YjUwMCwgMHhhMTg2LAorCTB4MDAxNSwgMHgxMWMwLCAweDcwODQsIDB4YTA4NiwgMHgwMDA0LCAweDExYTAsIDB4NjAxMCwgMHhhMGU4LAorCTB4MDAwZiwgMHgyYzc4LCAweDA4MGMsIDB4NzMzMSwgMHgwMWE4LCAweDcwNzAsIDB4NmEwOCwgMHhhMjA2LAorCTB4MTEzMCwgMHg3MDc0LCAweDZhMGMsIDB4YTIwNiwgMHgxMTEwLCAweDA4MGMsIDB4MmM5YywgMHgwODBjLAorCTB4ODdhMCwgMHgwMDIwLCAweDA4MGMsIDB4OGMxOSwgMHgwODBjLCAweDg2MWQsIDB4MDBmZSwgMHgwMGVlLAorCTB4MDBkZSwgMHgwMDA1LCAweDcwNTQsIDB4NmEwYywgMHhhMjA2LCAweDBkNzgsIDB4MGM4MCwgMHgwMDE2LAorCTB4MDAyNiwgMHg2ODRjLCAweGQwYWMsIDB4MDE3OCwgMHg2OTE0LCAweDZhMTAsIDB4MjEwMCwgMHhhMjA1LAorCTB4MDE1MCwgMHg2ODYwLCAweGExMDYsIDB4MTExOCwgMHg2ODVjLCAweGEyMDYsIDB4MDEyMCwgMHg2OTYyLAorCTB4NmE1ZSwgMHhhMDg1LCAweDAwMDEsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBkNiwgMHgwMDM2LAorCTB4NjMxMCwgMHgyMzY4LCAweDY4NGEsIDB4Njk1MiwgMHhhMjllLCAweDQwMDAsIDB4MTFhMCwgMHgwMGM2LAorCTB4NjMxOCwgMHgyMzYwLCAweDIwMDksIDB4MDAwMCwgMHg2ODM4LCAweGQwZjQsIDB4MTE0MCwgMHgwODBjLAorCTB4NTI0YSwgMHgxMTA4LCAweGMxODUsIDB4NjAwMCwgMHhkMGJjLCAweDAxMDgsIDB4YzE4ZCwgMHg2YTY2LAorCTB4Njk2YSwgMHgwMGNlLCAweDAwODAsIDB4NmE2NiwgMHgzOTE4LCAweGEzOTgsIDB4MDAwNiwgMHgyMzFjLAorCTB4Njg2YiwgMHgwMDA0LCAweDZiNzIsIDB4MDBjNiwgMHg2MzE4LCAweDIzNjAsIDB4NjAwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHg2ODZlLCAweDAwY2UsIDB4MDgwYywgMHg1NDA4LCAweDYwMTMsIDB4MDAwMCwgMHgwMDNlLAorCTB4MDBkZSwgMHgwMDA1LCAweDAwYzYsIDB4MDAyNiwgMHgwMDE2LCAweGExODYsIDB4MDAzNSwgMHgwMTEwLAorCTB4NmEzNCwgMHgwMDA4LCAweDZhMjgsIDB4MDgwYywgMHg5YzRhLCAweDAxZjAsIDB4MjI2MCwgMHg2MTFjLAorCTB4YTE4NiwgMHgwMDAzLCAweDAxMTgsIDB4YTE4NiwgMHgwMDA2LCAweDExOTAsIDB4NjgzNCwgMHhhMjA2LAorCTB4MDE0MCwgMHg2ODM4LCAweGEyMDYsIDB4MTE2MCwgMHg2MTA4LCAweDY4MzQsIDB4YTEwNiwgMHgxMTQwLAorCTB4MDAyMCwgMHg2MDA4LCAweDY5MzgsIDB4YTEwNiwgMHgxMTE4LCAweDYwMTgsIDB4NjkxOCwgMHhhMTA2LAorCTB4MDAxZSwgMHgwMDJlLCAweDAwY2UsIDB4MDAwNSwgMHhhMDg1LCAweDAwMDEsIDB4MGNjOCwgMHg2OTQ0LAorCTB4ZDFjYywgMHgwMTk4LCAweGExOGMsIDB4MDBmZiwgMHhhMThlLCAweDAwMDIsIDB4MTE3MCwgMHhhZDg4LAorCTB4MDAxZSwgMHgyMTBjLCAweGExOGMsIDB4MGYwMCwgMHg4MTBmLCAweGExOGUsIDB4MDAwMSwgMHgxMTI4LAorCTB4NjgxMCwgMHg2OTE0LCAweGExMTUsIDB4MTkwYywgMHg5NDgzLCAweDAwMDUsIDB4MDgwYywgMHg4NjFkLAorCTB4MDgwNCwgMHg3MTczLCAweDAwNjYsIDB4NjAwMCwgMHhhMGIyLCAweDAwMTAsIDB4MWEwYywgMHgxNTE1LAorCTB4MDAxMywgMHgwMDZlLCAweDAwMDUsIDB4YTE2YiwgMHhhNjQ2LCAweGE3NmMsIDB4YTE2YiwgMHhhMTZiLAorCTB4YTE2YiwgMHhhMTZiLCAweGExNmIsIDB4YTFhMywgMHhhN2YwLCAweGExNmIsIDB4YTE2YiwgMHhhMTZiLAorCTB4YTE2YiwgMHhhMTZiLCAweGExNmIsIDB4MDgwYywgMHgxNTE1LCAweDAwNjYsIDB4NjAwMCwgMHhhMGIyLAorCTB4MDAxMCwgMHgxYTBjLCAweDE1MTUsIDB4MDAxMywgMHgwMDZlLCAweDAwMDUsIDB4YTE4NiwgMHhhYzc3LAorCTB4YTE4NiwgMHhhMTg2LCAweGExODYsIDB4YTE4NiwgMHhhMTg2LCAweGExODYsIDB4YWMzOSwgMHhhY2JmLAorCTB4YTE4NiwgMHhiMjZjLCAweGIyOWMsIDB4YjI2YywgMHhiMjljLCAweGExODYsIDB4MDgwYywgMHgxNTE1LAorCTB4MDA2NiwgMHg2MDAwLCAweGEwYjIsIDB4MDAxMCwgMHgxYTBjLCAweDE1MTUsIDB4MDAxMywgMHgwMDZlLAorCTB4MDAwNSwgMHhhMWExLCAweGE5NDAsIDB4YWEwZCwgMHhhYTNhLCAweGFhYmUsIDB4YTFhMSwgMHhhYmFiLAorCTB4YWI1NiwgMHhhN2ZjLCAweGFjMGYsIDB4YWMyNCwgMHhhMWExLCAweGExYTEsIDB4YTFhMSwgMHhhMWExLAorCTB4YTFhMSwgMHgwODBjLCAweDE1MTUsIDB4YTFiMiwgMHgwMDgwLCAweDFhMGMsIDB4MTUxNSwgMHgyMTAwLAorCTB4YTFiMiwgMHgwMDQwLCAweDFhMDQsIDB4YTViYSwgMHgwMDAyLCAweGExZWQsIDB4YTNiOCwgMHhhMWVkLAorCTB4YTFlZCwgMHhhMWVkLCAweGEzYmYsIDB4YTFlZCwgMHhhMWVkLCAweGExZWQsIDB4YTFlZCwgMHhhMWVkLAorCTB4YTFlZCwgMHhhMWVkLCAweGExZWQsIDB4YTFlZCwgMHhhMWVkLCAweGExZWQsIDB4YTFlZCwgMHhhMWVkLAorCTB4YTFlZCwgMHhhMWVkLCAweGExZWQsIDB4YTFlZCwgMHhhMWVmLCAweGEyNGQsIDB4YTI1YywgMHhhMmFhLAorCTB4YTJjOCwgMHhhMzQ2LCAweGEzYTUsIDB4YTFlZCwgMHhhMWVkLCAweGEzYzIsIDB4YTFlZCwgMHhhMWVkLAorCTB4YTNkNSwgMHhhM2UwLCAweGExZWQsIDB4YTFlZCwgMHhhMWVkLCAweGExZWQsIDB4YTFlZCwgMHhhNDZiLAorCTB4YTFlZCwgMHhhMWVkLCAweGE0N2UsIDB4YTFlZCwgMHhhMWVkLCAweGE0MzYsIDB4YTFlZCwgMHhhMWVkLAorCTB4YTFlZCwgMHhhNDk2LCAweGExZWQsIDB4YTFlZCwgMHhhMWVkLCAweGE1MTAsIDB4YTFlZCwgMHhhMWVkLAorCTB4YTFlZCwgMHhhMWVkLCAweGExZWQsIDB4YTFlZCwgMHhhNTgxLCAweDA4MGMsIDB4MTUxNSwgMHgwODBjLAorCTB4NTMwOSwgMHgxMTUwLCAweDIwMDEsIDB4YjUzNSwgMHgyMDA0LCAweGQwY2MsIDB4MTEyOCwgMHhhMDg0LAorCTB4MDAwOSwgMHhhMDg2LCAweDAwMDgsIDB4MTE0MCwgMHg2MDA3LCAweDAwMDksIDB4NjAyYiwgMHgwMDA5LAorCTB4NjAxMywgMHgwMDAwLCAweDA4MDQsIDB4YTNiMywgMHgwODBjLCAweDUyZjksIDB4MDBlNiwgMHgwMGM2LAorCTB4MDAzNiwgMHgwMDI2LCAweDAwMTYsIDB4NjIxOCwgMHgyMjcwLCAweDcyYTAsIDB4MDAyNiwgMHgyMDE5LAorCTB4MDAyOSwgMHgwODBjLCAweDZkZjUsIDB4MDA3NiwgMHgyMDM5LCAweDAwMDAsIDB4MDgwYywgMHg2ZDAyLAorCTB4MmMwOCwgMHgwODBjLCAweGFlODIsIDB4MDA3ZSwgMHgwMDFlLCAweDJlNjAsIDB4MDgwYywgMHg1MWFhLAorCTB4MDAxZSwgMHgwMDJlLCAweDAwM2UsIDB4MDBjZSwgMHgwMGVlLCAweDY2MTgsIDB4MDBjNiwgMHgyNjYwLAorCTB4MDgwYywgMHg0ZmI4LCAweDAwY2UsIDB4YTZiMCwgMHgwMDAxLCAweDI2MzQsIDB4YTY4NCwgMHgwMGZmLAorCTB4YTA4MiwgMHgwMDA2LCAweDAyNzgsIDB4MDgwYywgMHhhZGM2LCAweDE5MDQsIDB4YTJhNCwgMHgwODBjLAorCTB4YWQ2NiwgMHgxMTIwLCAweDYwMDcsIDB4MDAwOCwgMHgwODA0LCAweGEzYjMsIDB4NjAwNywgMHgwMDA5LAorCTB4MDgwNCwgMHhhM2IzLCAweDA4MGMsIDB4YWY3YiwgMHgwMTI4LCAweDA4MGMsIDB4YWRjNiwgMHgwZDc4LAorCTB4MDgwNCwgMHhhMmE0LCAweDYwMTMsIDB4MTkwMCwgMHgwYzg4LCAweDA4MGMsIDB4MmRiZiwgMHgxOTA0LAorCTB4YTViNywgMHg2MTA2LCAweDA4MGMsIDB4YWQyMCwgMHg2MDA3LCAweDAwMDYsIDB4MDgwNCwgMHhhM2IzLAorCTB4NjAwNywgMHgwMDA3LCAweDA4MDQsIDB4YTNiMywgMHgwODBjLCAweGIyZDAsIDB4MTkwNCwgMHhhNWI3LAorCTB4MDgwYywgMHgyZGJmLCAweDE5MDQsIDB4YTViNywgMHgwMGQ2LCAweDY2MTgsIDB4MjY2OCwgMHg2ZTA0LAorCTB4YTY4NCwgMHgwMGZmLCAweGEwODIsIDB4MDAwNiwgMHgxMjIwLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLAorCTB4NGVlYiwgMHhhNmI0LCAweGZmMDAsIDB4ODYzNywgMHhhNjg2LCAweDAwMDYsIDB4MDE4OCwgMHhhNjg2LAorCTB4MDAwNCwgMHgwMTcwLCAweDZlMDQsIDB4YTZiNCwgMHgwMGZmLCAweGE2ODYsIDB4MDAwNiwgMHgwMTQwLAorCTB4YTY4NiwgMHgwMDA0LCAweDAxMjgsIDB4YTY4NiwgMHgwMDA1LCAweDAxMTAsIDB4MDBkZSwgMHgwMGUwLAorCTB4MDgwYywgMHhhZTI0LCAweDExYTAsIDB4YTY4NiwgMHgwMDA2LCAweDExNTAsIDB4MDAyNiwgMHg2MjE4LAorCTB4YTI5MCwgMHgwMDI4LCAweDIyMTQsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4MmNlMSwgMHgwMDJlLAorCTB4MDgwYywgMHg1MDRiLCAweDYwMDcsIDB4MDAwYSwgMHgwMGRlLCAweDA4MDQsIDB4YTNiMywgMHg2MDA3LAorCTB4MDAwYiwgMHgwMGRlLCAweDA4MDQsIDB4YTNiMywgMHgwODBjLCAweDJjOWMsIDB4NjAwNywgMHgwMDAxLAorCTB4MDgwNCwgMHhhM2IzLCAweDA4MGMsIDB4YjJkMCwgMHgxOTA0LCAweGE1YjcsIDB4MDgwYywgMHgyZGJmLAorCTB4MTkwNCwgMHhhNWI3LCAweDY2MTgsIDB4MDBkNiwgMHgyNjY4LCAweDZlMDQsIDB4MDBkZSwgMHhhNjg2LAorCTB4MDcwNywgMHgwZDUwLCAweDAwMjYsIDB4NjIxOCwgMHhhMjkwLCAweDAwMjgsIDB4MjIxNCwgMHgyMDA5LAorCTB4MDAwMCwgMHgwODBjLCAweDJjZTEsIDB4MDAyZSwgMHg2MDA3LCAweDAwMGMsIDB4MDgwNCwgMHhhM2IzLAorCTB4MDgwYywgMHg1MzA5LCAweDExNDAsIDB4MjAwMSwgMHhiNTM1LCAweDIwMDQsIDB4YTA4NCwgMHgwMDA5LAorCTB4YTA4NiwgMHgwMDA4LCAweDExMTAsIDB4MDgwNCwgMHhhMWZjLCAweDA4MGMsIDB4NTJmOSwgMHg2NjE4LAorCTB4YTZiMCwgMHgwMDAxLCAweDI2MzQsIDB4YTY4NCwgMHgwMGZmLCAweGEwODIsIDB4MDAwNiwgMHgwNmU4LAorCTB4MTEzOCwgMHgwMDI2LCAweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDRmMmEsIDB4MDAyZSwgMHgwMDUwLAorCTB4YTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4YTY4NiwgMHgwMDA0LCAweDAxMjAsIDB4YTY4NiwgMHgwMDA2LAorCTB4MTkwNCwgMHhhMmE0LCAweDA4MGMsIDB4YWUzMSwgMHgxMTIwLCAweDYwMDcsIDB4MDAwZSwgMHgwODA0LAorCTB4YTNiMywgMHgwMDQ2LCAweDY0MTgsIDB4YTRhMCwgMHgwMDI4LCAweDI0MjQsIDB4YTRhNCwgMHgwMGZmLAorCTB4ODQyNywgMHgwMDQ2LCAweDA4MGMsIDB4MmM5YywgMHgwMDRlLCAweDAwMTYsIDB4YTAwNiwgMHgyMDA5LAorCTB4YjU1MywgMHgyMTBjLCAweGQxYTQsIDB4MDE1OCwgMHgyMDA5LCAweDAwMjksIDB4MDgwYywgMHhiMGU4LAorCTB4NjAxOCwgMHgwMGQ2LCAweDIwNjgsIDB4NjgwMCwgMHhjMGU1LCAweDY4MDIsIDB4MDBkZSwgMHgwMDFlLAorCTB4MDA0ZSwgMHg2MDA3LCAweDAwMDEsIDB4MDgwNCwgMHhhM2IzLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLAorCTB4NGVlYiwgMHgwMTU2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDIwYTksIDB4MDAwNCwgMHgyMDE5LAorCTB4YjUwNSwgMHgyMDExLCAweGJiOTAsIDB4MDgwYywgMHg5MGRhLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDE1ZSwgMHhhMDA1LCAweDAxNjgsIDB4YTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4YTY4MiwgMHgwMDA0LAorCTB4MGEwNCwgMHhhMmE0LCAweGE2ODIsIDB4MDAwNywgMHgwYTA0LCAweGEyZjIsIDB4MDgwNCwgMHhhMmE0LAorCTB4NjAxMywgMHgxOTAwLCAweDYwMDcsIDB4MDAwOSwgMHgwODA0LCAweGEzYjMsIDB4MDgwYywgMHg1MzA5LAorCTB4MTE0MCwgMHgyMDAxLCAweGI1MzUsIDB4MjAwNCwgMHhhMDg0LCAweDAwMDksIDB4YTA4NiwgMHgwMDA4LAorCTB4MTExMCwgMHgwODA0LCAweGExZmMsIDB4MDgwYywgMHg1MmY5LCAweDY2MTgsIDB4YTZiMCwgMHgwMDAxLAorCTB4MjYzNCwgMHhhNjg0LCAweDAwZmYsIDB4YTA4MiwgMHgwMDA2LCAweDA2YjgsIDB4YTZiNCwgMHhmZjAwLAorCTB4ODYzNywgMHhhNjg2LCAweDAwMDQsIDB4MDEyMCwgMHhhNjg2LCAweDAwMDYsIDB4MTkwNCwgMHhhMmE0LAorCTB4MDgwYywgMHhhZTU5LCAweDExMzgsIDB4MDgwYywgMHhhZDY2LCAweDExMjAsIDB4NjAwNywgMHgwMDEwLAorCTB4MDgwNCwgMHhhM2IzLCAweDAwNDYsIDB4NjQxOCwgMHhhNGEwLCAweDAwMjgsIDB4MjQyNCwgMHhhNGE0LAorCTB4MDBmZiwgMHg4NDI3LCAweDAwNDYsIDB4MDgwYywgMHgyYzljLCAweDAwNGUsIDB4MDAxNiwgMHhhMDA2LAorCTB4MjAwOSwgMHhiNTUzLCAweDIxMGMsIDB4ZDFhNCwgMHgwMTU4LCAweDIwMDksIDB4MDAyOSwgMHgwODBjLAorCTB4YjBlOCwgMHg2MDE4LCAweDAwZDYsIDB4MjA2OCwgMHg2ODAwLCAweGMwZTUsIDB4NjgwMiwgMHgwMGRlLAorCTB4MDAxZSwgMHgwMDRlLCAweDYwMDcsIDB4MDAwMSwgMHgwMGYwLCAweDA4MGMsIDB4YWY3YiwgMHgwMTQwLAorCTB4YTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4YTY4NiwgMHgwMDA2LCAweDA5NTAsIDB4MDgwNCwgMHhhMmE0LAorCTB4NjAxMywgMHgxOTAwLCAweDYwMDcsIDB4MDAwOSwgMHgwMDcwLCAweDA4MGMsIDB4MmRiZiwgMHgxOTA0LAorCTB4YTViNywgMHgwODBjLCAweGIyZDAsIDB4MTkwNCwgMHhhNWI3LCAweDA4MGMsIDB4YTVkZiwgMHgxOTA0LAorCTB4YTJhNCwgMHg2MDA3LCAweDAwMTIsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NmNkMywgMHgwMDA1LAorCTB4NjAwNywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDZjZDMsIDB4MGNjMCwgMHg2MDA3LAorCTB4MDAwNSwgMHgwY2MwLCAweDA4MGMsIDB4YjJkMCwgMHgxOTA0LCAweGE1YjcsIDB4MDgwYywgMHgyZGJmLAorCTB4MTkwNCwgMHhhNWI3LCAweDA4MGMsIDB4YTVkZiwgMHgxOTA0LCAweGEyYTQsIDB4NjAwNywgMHgwMDIwLAorCTB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NmNkMywgMHgwMDA1LCAweDA4MGMsIDB4MmRiZiwgMHgxOTA0LAorCTB4YTViNywgMHg2MDA3LCAweDAwMjMsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NmNkMywgMHgwMDA1LAorCTB4MDgwYywgMHhiMmQwLCAweDE5MDQsIDB4YTViNywgMHgwODBjLCAweDJkYmYsIDB4MTkwNCwgMHhhNWI3LAorCTB4MDgwYywgMHhhNWRmLCAweDE5MDQsIDB4YTJhNCwgMHgwMDE2LCAweDAwMjYsIDB4MjAxMSwgMHhiYjkxLAorCTB4MjIxNCwgMHhhMjg2LCAweGZmZmYsIDB4MDE5MCwgMHgyYzA4LCAweDA4MGMsIDB4OWM0YSwgMHgwMWUwLAorCTB4MjI2MCwgMHgyMDExLCAweGJiOTAsIDB4MjIxNCwgMHg2MDA4LCAweGEyMDYsIDB4MTFhOCwgMHg2MDE4LAorCTB4YTE5MCwgMHgwMDA2LCAweDIyMTQsIDB4YTIwNiwgMHgwMWU4LCAweDAwNzAsIDB4MjAxMSwgMHhiYjkwLAorCTB4MjIxNCwgMHgyYzA4LCAweGEwMDYsIDB4MDgwYywgMHhiMGJhLCAweDExYTAsIDB4MjAxMSwgMHhiYjkxLAorCTB4MjIxNCwgMHhhMjg2LCAweGZmZmYsIDB4MDFjMCwgMHgyMTYwLCAweDYwMDcsIDB4MDAyNiwgMHg2MDEzLAorCTB4MTcwMCwgMHgyMDExLCAweGJiODksIDB4MjIxNCwgMHhhMjk2LCAweGZmZmYsIDB4MTE4MCwgMHg2MDA3LAorCTB4MDAyNSwgMHgwMDY4LCAweDYwMWMsIDB4YTA4NiwgMHgwMDA3LCAweDFkNzAsIDB4NjAwNCwgMHhhMDg2LAorCTB4MDAyNCwgMHgxMTEwLCAweDA4MGMsIDB4ODYxZCwgMHgyMTYwLCAweDYwMDcsIDB4MDAyNSwgMHg2MDAzLAorCTB4MDAwMSwgMHgwODBjLCAweDZjZDMsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MjAwMSwgMHgwMDAxLAorCTB4MDgwYywgMHg0ZWViLCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MjBhOSwgMHgwMDA0LAorCTB4MjAxOSwgMHhiNTA1LCAweDIwMTEsIDB4YmI5NiwgMHgwODBjLCAweDkwZGEsIDB4MDAzZSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwMTVlLCAweDAxMjAsIDB4NjAwNywgMHgwMDMxLCAweDA4MDQsIDB4YTNiMywgMHgwODBjLAorCTB4OGRmNiwgMHgwODBjLCAweDVhY2YsIDB4MTFiMCwgMHgwMDA2LCAweDAwMjYsIDB4MDAzNiwgMHgwODBjLAorCTB4NWFlYiwgMHgxMTU4LCAweDIwMDEsIDB4Yjc5ZiwgMHgyMDAzLCAweDAwMDEsIDB4MjAwMSwgMHhiNTAwLAorCTB4MjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NWEwNywgMHgwMDEwLCAweDA4MGMsIDB4NWFhNiwgMHgwMDNlLAorCTB4MDAyZSwgMHgwMDBlLCAweDAwMDUsIDB4MDgwYywgMHgyZGJmLCAweDE5MDQsIDB4YTViNywgMHgwODBjLAorCTB4YTVkZiwgMHgxOTA0LCAweGEyYTQsIDB4NjEwNiwgMHgwODBjLCAweGE1ZmIsIDB4NjAwNywgMHgwMDJiLAorCTB4MDgwNCwgMHhhM2IzLCAweDYwMDcsIDB4MDAyYywgMHgwODA0LCAweGEzYjMsIDB4MDgwYywgMHhiMmQwLAorCTB4MTkwNCwgMHhhNWI3LCAweDA4MGMsIDB4MmRiZiwgMHgxOTA0LCAweGE1YjcsIDB4MDgwYywgMHhhNWRmLAorCTB4MTkwNCwgMHhhMmE0LCAweDYxMDYsIDB4MDgwYywgMHhhNWZmLCAweDExMjAsIDB4NjAwNywgMHgwMDJlLAorCTB4MDgwNCwgMHhhM2IzLCAweDYwMDcsIDB4MDAyZiwgMHgwODA0LCAweGEzYjMsIDB4MDgwYywgMHgyZGJmLAorCTB4MTkwNCwgMHhhNWI3LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDYwMTgsIDB4YTA4MCwgMHgwMDAxLAorCTB4MjAwYywgMHhhMTg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDAxNTgsIDB4YTE4NCwgMHhmZjAwLAorCTB4ODAwNywgMHhhMDg2LCAweDAwMDYsIDB4MDEyOCwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwODA0LAorCTB4YTNiOCwgMHgyMDAxLCAweGI1NzIsIDB4MjAwNCwgMHhkMGU0LCAweDA5MDQsIDB4YTUwZCwgMHgyMDcxLAorCTB4YmI4YywgMHg3MDEwLCAweDYwMzYsIDB4NzAxNCwgMHg2MDNhLCAweDcxMDgsIDB4NzIwYywgMHgyMDAxLAorCTB4YjU1MywgMHgyMDA0LCAweGQwYTQsIDB4MDE0MCwgMHg2MDE4LCAweDIwNjgsIDB4NjgxMCwgMHhhMTA2LAorCTB4MTExOCwgMHg2ODE0LCAweGEyMDYsIDB4MDFmOCwgMHgyMDAxLCAweGI1NTMsIDB4MjAwNCwgMHhkMGFjLAorCTB4MTU5MCwgMHgyMDY5LCAweGI1MDAsIDB4Njg3NCwgMHhhMjA2LCAweDE1NjgsIDB4Njg3MCwgMHhhMTA2LAorCTB4MTU1MCwgMHg3MjEwLCAweDA4MGMsIDB4OWM0YSwgMHgwNTU4LCAweDA4MGMsIDB4YjE1NCwgMHgwNTQwLAorCTB4NjIyYSwgMHg2MDA3LCAweDAwMzYsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NmM4ZCwgMHgwMGNlLAorCTB4MDBkZSwgMHgwMGVlLCAweDAwMDUsIDB4NzIxNCwgMHhhMjg2LCAweGZmZmYsIDB4MDE1MCwgMHgwODBjLAorCTB4OWM0YSwgMHgwMWIwLCAweGEyODAsIDB4MDAwMiwgMHgyMDA0LCAweDcxMTAsIDB4YTEwNiwgMHgxMTgwLAorCTB4MGMwOCwgMHg3MjEwLCAweDJjMDgsIDB4YTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4YjBiYSwgMHgyYzEwLAorCTB4MjE2MCwgMHgwMTMwLCAweDA4YjgsIDB4NjAwNywgMHgwMDM3LCAweDYwMTMsIDB4MTUwMCwgMHgwOGQ4LAorCTB4NjAwNywgMHgwMDM3LCAweDYwMTMsIDB4MTcwMCwgMHgwOGIwLCAweDYwMDcsIDB4MDAxMiwgMHgwODk4LAorCTB4MDgwYywgMHgyZGJmLCAweDE5MDQsIDB4YTViNywgMHg2MDE4LCAweGEwODAsIDB4MDAwMSwgMHgyMDA0LAorCTB4YTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4YTA4NiwgMHgwMDA2LCAweDE5MDQsIDB4YTNiOCwgMHgwMGU2LAorCTB4MDBkNiwgMHgwMGM2LCAweDIwMDEsIDB4YjU3MiwgMHgyMDA0LCAweGQwZTQsIDB4MDkwNCwgMHhhNTc5LAorCTB4MjA2OSwgMHhiNTAwLCAweDIwNzEsIDB4YmI4YywgMHg3MDA4LCAweDYwMzYsIDB4NzIwYywgMHg2MjNhLAorCTB4YTI4NiwgMHhmZmZmLCAweDExNTAsIDB4NzIwOCwgMHgwMGM2LCAweDJjMDgsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDgwYywgMHhiMGJhLCAweDJjMTAsIDB4MDBjZSwgMHgwNTg4LCAweDA4MGMsIDB4OWM0YSwgMHgwNTcwLAorCTB4MDBjNiwgMHgwMDI2LCAweDIyNjAsIDB4MDgwYywgMHg5OTFkLCAweDAwMmUsIDB4MDBjZSwgMHg3MTE4LAorCTB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE4NiwgMHgwMDAxLCAweDAxNTgsIDB4YTE4NiwgMHgwMDA1LAorCTB4MDExOCwgMHhhMTg2LCAweDAwMDcsIDB4MTE3OCwgMHhhMjgwLCAweDAwMDQsIDB4MjAwNCwgMHhhMDA1LAorCTB4MDE1MCwgMHgwMDU2LCAweDc1MTAsIDB4NzYxNCwgMHgwODBjLCAweGIxNmIsIDB4MDA1ZSwgMHgwMGNlLAorCTB4MDBkZSwgMHgwMGVlLCAweDAwMDUsIDB4NjAwNywgMHgwMDNiLCAweDYwMmIsIDB4MDAwOSwgMHg2MDEzLAorCTB4MmEwMCwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2YzhkLCAweDBjODgsIDB4NjAwNywgMHgwMDNiLAorCTB4NjAyYiwgMHgwMDA5LCAweDYwMTMsIDB4MTcwMCwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2YzhkLAorCTB4MGMzMCwgMHg2MDA3LCAweDAwM2IsIDB4NjAyYiwgMHgwMDBiLCAweDYwMTMsIDB4MDAwMCwgMHgwODA0LAorCTB4YTRlMywgMHgwMGU2LCAweDAwMjYsIDB4MDgwYywgMHg1MzA5LCAweDA1NTgsIDB4MDgwYywgMHg1MmY5LAorCTB4MDgwYywgMHhiMzRiLCAweDE1MjAsIDB4MjA3MSwgMHhiNTAwLCAweDcwZDQsIDB4YzA4NSwgMHg3MGQ2LAorCTB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4NzJhMCwgMHhhMjg0LCAweDAwZmYsIDB4NzA3MiwgMHg3OGU2LAorCTB4YTI4NCwgMHhmZjAwLCAweDcyNzQsIDB4YTIwNSwgMHg3MDc2LCAweDc4ZWEsIDB4MDBmZSwgMHg3MGRmLAorCTB4MDAwMCwgMHgyMDAxLCAweGI1NTMsIDB4MjAwNCwgMHhkMGE0LCAweDAxMjAsIDB4MjAxMSwgMHhiN2Y5LAorCTB4MjAxMywgMHgwN2QwLCAweGQwYWMsIDB4MTEyOCwgMHgwODBjLCAweDJhYjgsIDB4MDAxMCwgMHgwODBjLAorCTB4YjM3NywgMHgwMDJlLCAweDAwZWUsIDB4MDgwYywgMHg4NjFkLCAweDA4MDQsIDB4YTNiNywgMHgwODBjLAorCTB4ODYxZCwgMHgwMDA1LCAweDI2MDAsIDB4MDAwMiwgMHhhNWM1LCAweGE1YzUsIDB4YTVjNSwgMHhhNWM1LAorCTB4YTVjNSwgMHhhNWM3LCAweGE1YzUsIDB4YTVjNSwgMHhhNWM1LCAweDA4MGMsIDB4MTUxNSwgMHgwODBjLAorCTB4YjJkMCwgMHgxZDY4LCAweDA4MGMsIDB4MmRiZiwgMHgxZDUwLCAweDAwODksIDB4MTEzOCwgMHg2MDA3LAorCTB4MDA0NSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2Y2QzLCAweDAwMDUsIDB4MDgwYywgMHgyYzljLAorCTB4NjAwNywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDZjZDMsIDB4MDAwNSwgMHgwMGQ2LAorCTB4MDA2NiwgMHg2NjE4LCAweDI2NjgsIDB4NmUwNCwgMHhhNmI0LCAweGZmMDAsIDB4ODYzNywgMHhhNjg2LAorCTB4MDAwNiwgMHgwMTcwLCAweGE2ODYsIDB4MDAwNCwgMHgwMTU4LCAweDZlMDQsIDB4YTZiNCwgMHgwMGZmLAorCTB4YTY4NiwgMHgwMDA2LCAweDAxMjgsIDB4YTY4NiwgMHgwMDA0LCAweDAxMTAsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDA2ZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBkNiwgMHgwNDQ5LCAweDAwZGUsIDB4MDAwNSwgMHgwMGQ2LAorCTB4MDQ5MSwgMHgxMWYwLCAweDY4MGMsIDB4YTA4YywgMHhmZjAwLCAweDY4MjAsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTExNSwgMHg2MjEyLCAweDY4MjQsIDB4NjAyYSwgMHhkMWU0LCAweDAxMTgsIDB4MjAwOSwgMHgwMDAxLAorCTB4MDA2MCwgMHhkMWVjLCAweDAxNjgsIDB4NjkyMCwgMHhhMThjLCAweDAwZmYsIDB4NjgyNCwgMHgwODBjLAorCTB4MjgxZCwgMHgxMTMwLCAweDIxMTAsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4MmNlMSwgMHgwMDE4LAorCTB4YTA4NSwgMHgwMDAxLCAweDAwMDgsIDB4YTAwNiwgMHgwMGRlLCAweDAwMDUsIDB4MjA2OSwgMHhiYjhkLAorCTB4NjgwMCwgMHhhMDgyLCAweDAwMTAsIDB4MTIyOCwgMHg2MDEzLCAweDAwMDAsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDAwOCwgMHhhMDA2LCAweDAwMDUsIDB4NjAxMywgMHgwMDAwLCAweDIwNjksIDB4YmI4YywgMHg2ODA4LAorCTB4YTA4NCwgMHhmZjAwLCAweGEwODYsIDB4MDgwMCwgMHgxMTQwLCAweDY4MDAsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4ZSwgMHgwMDE0LCAweDAxMTAsIDB4YTA4ZSwgMHgwMDEwLCAweDAwMDUsIDB4NjAwNCwgMHhhMGIyLAorCTB4MDA4MCwgMHgxYTBjLCAweDE1MTUsIDB4YTFiNiwgMHgwMDEzLCAweDExMzAsIDB4MjAwOCwgMHhhMWIyLAorCTB4MDA0MCwgMHgxYTA0LCAweGE3NDYsIDB4MDA5MiwgMHhhMWI2LCAweDAwMjcsIDB4MDEyMCwgMHhhMWI2LAorCTB4MDAxNCwgMHgxOTBjLCAweDE1MTUsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NGYyYSwgMHgwODBjLAorCTB4NzA5MCwgMHgwODBjLCAweDllMWQsIDB4MDgwYywgMHg3MTczLCAweDAwMDUsIDB4YTZhNiwgMHhhNmE4LAorCTB4YTZhNiwgMHhhNmE2LCAweGE2YTYsIDB4YTZhOCwgMHhhNmJhLCAweGE3M2YsIDB4YTcwYSwgMHhhNzNmLAorCTB4YTcxYiwgMHhhNzNmLCAweGE2YmEsIDB4YTczZiwgMHhhNzM3LCAweGE3M2YsIDB4YTczNywgMHhhNzNmLAorCTB4YTczZiwgMHhhNmE2LCAweGE2YTYsIDB4YTZhNiwgMHhhNmE2LCAweGE2YTYsIDB4YTZhNiwgMHhhNmE2LAorCTB4YTZhNiwgMHhhNmE2LCAweGE2YTYsIDB4YTZhNiwgMHhhNmE4LCAweGE2YTYsIDB4YTczZiwgMHhhNmE2LAorCTB4YTZhNiwgMHhhNzNmLCAweGE2YTYsIDB4YTczYywgMHhhNzNmLCAweGE2YTYsIDB4YTZhNiwgMHhhNmE2LAorCTB4YTZhNiwgMHhhNzNmLCAweGE3M2YsIDB4YTZhNiwgMHhhNzNmLCAweGE3M2YsIDB4YTZhNiwgMHhhNmI0LAorCTB4YTZhNiwgMHhhNmE2LCAweGE2YTYsIDB4YTZhNiwgMHhhNzNiLCAweGE3M2YsIDB4YTZhNiwgMHhhNmE2LAorCTB4YTczZiwgMHhhNzNmLCAweGE2YTYsIDB4YTZhNiwgMHhhNmE2LCAweGE2YTYsIDB4MDgwYywgMHgxNTE1LAorCTB4MDgwYywgMHg3MDkwLCAweDIwMDEsIDB4YjdiNiwgMHgyMDA0LCAweDYwMTYsIDB4NjAwMywgMHgwMDAyLAorCTB4MDgwYywgMHg3MTczLCAweDA4MDQsIDB4YTc0NSwgMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHg0ZWViLAorCTB4MDgwNCwgMHhhNzNmLCAweDAwZjYsIDB4MjA3OSwgMHhiNTUyLCAweDc4MDQsIDB4MDBmZSwgMHhkMGFjLAorCTB4MTkwNCwgMHhhNzNmLCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLCAweDRlZWIsIDB4NjAxOCwgMHhhMDgwLAorCTB4MDAwNCwgMHgyMDA0LCAweGEwODYsIDB4MDBmZiwgMHgxMTQwLCAweDAwZjYsIDB4MjA3OSwgMHhiNTAwLAorCTB4Nzg5OCwgMHg4MDAwLCAweDc4OWEsIDB4MDBmZSwgMHgwMGUwLCAweDAwYzYsIDB4NjAxOCwgMHgyMDYwLAorCTB4NjAwMCwgMHhkMGY0LCAweDExNDAsIDB4NjAxMCwgMHhhMDA1LCAweDAxMjgsIDB4MDBjZSwgMHgwODBjLAorCTB4M2YzZSwgMHgwODA0LCAweGE3M2YsIDB4MDBjZSwgMHgyMDAxLCAweGI1MDAsIDB4MjAwNCwgMHhhMDg2LAorCTB4MDAwMiwgMHgxMTM4LCAweDAwZjYsIDB4MjA3OSwgMHhiNTAwLCAweDc4OTgsIDB4ODAwMCwgMHg3ODlhLAorCTB4MDBmZSwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg0ZWZkLCAweDA4MGMsIDB4NzA5MCwgMHg2MDFmLAorCTB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAyLCAweDA4MGMsIDB4NmNkMywgMHgwODBjLAorCTB4NzE3MywgMHgwMGM2LCAweDYxMTgsIDB4MjE2MCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwYywgMHg2OWE4LAorCTB4MDBjZSwgMHgwNGQ4LCAweDY2MTgsIDB4MDBkNiwgMHgyNjY4LCAweDZlMDQsIDB4MDBkZSwgMHhhNmI0LAorCTB4ZmYwMCwgMHg4NjM3LCAweGE2ODYsIDB4MDAwNiwgMHgwNTUwLCAweGE2ODYsIDB4MDAwNCwgMHgwNTM4LAorCTB4MjAwMSwgMHgwMDA0LCAweDA0MTAsIDB4MjAwMSwgMHhiNTAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLAorCTB4MTExMCwgMHgwODBjLCAweDNmM2UsIDB4MjAwMSwgMHgwMDA2LCAweDA0YTEsIDB4NjYxOCwgMHgwMGQ2LAorCTB4MjY2OCwgMHg2ZTA0LCAweDAwZGUsIDB4YTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4YTY4NiwgMHgwMDA2LAorCTB4MDE3MCwgMHgyMDAxLCAweDAwMDYsIDB4MDA0OCwgMHgyMDAxLCAweDAwMDQsIDB4MDAzMCwgMHgyMDAxLAorCTB4MDAwNiwgMHgwNDAxLCAweDAwMjAsIDB4MDAxOCwgMHgwMDEwLCAweDA4MGMsIDB4NGYyYSwgMHgwODBjLAorCTB4NzA5MCwgMHgwODBjLCAweDg2MWQsIDB4MDgwYywgMHg3MTczLCAweDAwMDUsIDB4MjYwMCwgMHgwMDAyLAorCTB4YTc1MSwgMHhhNzUxLCAweGE3NTEsIDB4YTc1MSwgMHhhNzUxLCAweGE3NTMsIDB4YTc1MSwgMHhhNzUxLAorCTB4YTc1MSwgMHgwODBjLCAweDE1MTUsIDB4MDgwYywgMHg3MDkwLCAweDA4MGMsIDB4ODYxZCwgMHgwODBjLAorCTB4NzE3MywgMHgwMDA1LCAweDAwMTYsIDB4MDBkNiwgMHg2MTE4LCAweDIxNjgsIDB4NjkwMCwgMHhkMTg0LAorCTB4MDE0MCwgMHgwODBjLCAweDRlZmQsIDB4MjAwMSwgMHgwMDAwLCAweDA4MGMsIDB4NGVlYiwgMHgwODBjLAorCTB4MmNjMiwgMHgwMGRlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGQ2LCAweDY2MTgsIDB4MjY2OCwgMHg2ODA0LAorCTB4YTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4MDBkZSwgMHhhMGIyLCAweDAwMGMsIDB4MWEwYywgMHgxNTE1LAorCTB4YTFiNiwgMHgwMDE1LCAweDExMTAsIDB4MDAzYiwgMHgwMDI4LCAweGExYjYsIDB4MDAxNiwgMHgxOTBjLAorCTB4MTUxNSwgMHgwMDZiLCAweDAwMDUsIDB4OGNkZiwgMHg4Y2RmLCAweDhjZGYsIDB4OGNkZiwgMHg4Y2RmLAorCTB4OGNkZiwgMHhhN2RjLCAweGE3OWIsIDB4OGNkZiwgMHg4Y2RmLCAweDhjZGYsIDB4OGNkZiwgMHg4Y2RmLAorCTB4OGNkZiwgMHg4Y2RmLCAweDhjZGYsIDB4OGNkZiwgMHg4Y2RmLCAweGE3ZGMsIDB4YTdlMywgMHg4Y2RmLAorCTB4OGNkZiwgMHg4Y2RmLCAweDhjZGYsIDB4MDBmNiwgMHgyMDc5LCAweGI1NTIsIDB4NzgwNCwgMHhkMGFjLAorCTB4MTFlMCwgMHg2MDE4LCAweGEwN2QsIDB4MDFjOCwgMHg3ODAwLCAweGQwZjQsIDB4MTExOCwgMHg3ODEwLAorCTB4YTAwNSwgMHgxMTk4LCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLCAweDRlZWIsIDB4MjAwMSwgMHgwMDAyLAorCTB4MDgwYywgMHg0ZWZkLCAweDYwMWYsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAyLAorCTB4MDgwYywgMHg2Y2QzLCAweDA4MGMsIDB4NzE3MywgMHgwMGU4LCAweDIwMTEsIDB4YmI4MywgMHgyMjA0LAorCTB4ODIxMSwgMHgyMjBjLCAweDA4MGMsIDB4MjgxZCwgMHgxMWE4LCAweDAwYzYsIDB4MDgwYywgMHg0ZmE5LAorCTB4MDEyMCwgMHgwMGNlLCAweDA4MGMsIDB4ODYxZCwgMHgwMDY4LCAweDYwMTAsIDB4MDAwNiwgMHg2MDE0LAorCTB4MDAwNiwgMHgwODBjLCAweDRjMGIsIDB4MDAwZSwgMHg2MDE2LCAweDAwMGUsIDB4NjAxMiwgMHgwMGNlLAorCTB4MDgwYywgMHg4NjFkLCAweDAwZmUsIDB4MDAwNSwgMHg2NjA0LCAweGE2YjYsIDB4MDAxZSwgMHgxMTEwLAorCTB4MDgwYywgMHg4NjFkLCAweDAwMDUsIDB4MDgwYywgMHg4Zjk1LCAweDExMzgsIDB4NjAwMywgMHgwMDAxLAorCTB4NjAwNywgMHgwMDAxLCAweDA4MGMsIDB4NmNkMywgMHgwMDEwLCAweDA4MGMsIDB4ODYxZCwgMHgwMDA1LAorCTB4NjAwNCwgMHhhMDhhLCAweDAwODAsIDB4MWEwYywgMHgxNTE1LCAweDA4MGMsIDB4NzA5MCwgMHgwODBjLAorCTB4OWUxZCwgMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHhhMTgyLCAweDAwNDAsIDB4MDAwMiwgMHhhODEyLAorCTB4YTgxMiwgMHhhODEyLCAweGE4MTIsIDB4YTgxNCwgMHhhODEyLCAweGE4MTIsIDB4YTgxMiwgMHhhODEyLAorCTB4YTgxMiwgMHhhODEyLCAweGE4MTIsIDB4YTgxMiwgMHhhODEyLCAweGE4MTIsIDB4YTgxMiwgMHhhODEyLAorCTB4YTgxMiwgMHhhODEyLCAweDA4MGMsIDB4MTUxNSwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgwMTU2LAorCTB4MDA0NiwgMHgwMDI2LCAweDYyMTgsIDB4YTI4MCwgMHgwMDJiLCAweDIwMDQsIDB4YTAwNSwgMHgwMTIwLAorCTB4MjAyMSwgMHgwMDAwLCAweDA4MGMsIDB4YjMxYywgMHg2MTA2LCAweDIwNzEsIDB4YmI4MCwgMHg3NDQ0LAorCTB4YTRhNCwgMHhmZjAwLCAweDA5MDQsIDB4YTg3OCwgMHhhNDg2LCAweDIwMDAsIDB4MTEzMCwgMHgyMDA5LAorCTB4MDAwMSwgMHgyMDExLCAweDAyMDAsIDB4MDgwYywgMHg2YjFhLCAweDA4MGMsIDB4MTVmOCwgMHgwOTBjLAorCTB4MTUxNSwgMHg2MDAzLCAweDAwMDcsIDB4MmQwMCwgMHg2ODM3LCAweDAxMGQsIDB4NjgwMywgMHgwMDAwLAorCTB4NjgzYiwgMHgwMDAwLCAweDZjNWEsIDB4MmMwMCwgMHg2ODVlLCAweDYwMDgsIDB4NjhiMiwgMHg2MDE4LAorCTB4MjA3OCwgMHg3OGEwLCAweDgwMDcsIDB4NzEzMCwgMHg2OTRhLCAweDAwMTYsIDB4YTA4NCwgMHhmZjAwLAorCTB4Njg0NiwgMHg2ODRmLCAweDAwMDAsIDB4Njg1MywgMHgwMDAwLCAweDY4NTcsIDB4MDAzNiwgMHgwODBjLAorCTB4NTQwOCwgMHgwMDFlLCAweGE0ODYsIDB4MjAwMCwgMHgxMTMwLCAweDIwMTksIDB4MDAxNywgMHgwODBjLAorCTB4YjA2NSwgMHgwODA0LCAweGE4ZDUsIDB4YTQ4NiwgMHgwNDAwLCAweDExMzAsIDB4MjAxOSwgMHgwMDAyLAorCTB4MDgwYywgMHhiMDE3LCAweDA4MDQsIDB4YThkNSwgMHhhNDg2LCAweDAyMDAsIDB4MTExMCwgMHgwODBjLAorCTB4YWZmYywgMHhhNDg2LCAweDEwMDAsIDB4MTExMCwgMHgwODBjLCAweGIwNGEsIDB4MDgwNCwgMHhhOGQ1LAorCTB4MjA2OSwgMHhiODc0LCAweDZhMDAsIDB4ZDI4NCwgMHgwOTA0LCAweGE5M2MsIDB4YTI4NCwgMHgwMzAwLAorCTB4MTkwNCwgMHhhOTM1LCAweDY4MDQsIDB4YTAwNSwgMHgwOTA0LCAweGE5MWQsIDB4MmQ3OCwgMHg2MDAzLAorCTB4MDAwNywgMHgwODBjLCAweDE1ZGYsIDB4MDkwNCwgMHhhOGRjLCAweDc4MDAsIDB4ZDA4YywgMHgxMTE4LAorCTB4NzgwNCwgMHg4MDAxLCAweDc4MDYsIDB4NjAxMywgMHgwMDAwLCAweDY4MDMsIDB4MDAwMCwgMHg2ODM3LAorCTB4MDExNiwgMHg2ODNiLCAweDAwMDAsIDB4NjAwOCwgMHg2OGIyLCAweDJjMDAsIDB4Njg0YSwgMHg2MDE4LAorCTB4MjA3OCwgMHg3OGEwLCAweDgwMDcsIDB4NzEzMCwgMHg2OTg2LCAweDY4NDYsIDB4NzkyOCwgMHg2OThhLAorCTB4NzkyYywgMHg2OThlLCAweDc5MzAsIDB4Njk5MiwgMHg3OTM0LCAweDY5OTYsIDB4Njg1MywgMHgwMDNkLAorCTB4NzI0NCwgMHhhMjk0LCAweDAwMDMsIDB4YTI4NiwgMHgwMDAyLCAweDExMTgsIDB4Njg0ZiwgMHgwMDQwLAorCTB4MDA0MCwgMHhhMjg2LCAweDAwMDEsIDB4MTExOCwgMHg2ODRmLCAweDAwODAsIDB4MDAxMCwgMHg2ODRmLAorCTB4MDAwMCwgMHgyMGE5LCAweDAwMGEsIDB4MjAwMSwgMHhiYjkwLCAweGFkOTAsIDB4MDAxNSwgMHgyMDBjLAorCTB4ODEwZiwgMHgyMTEyLCAweDgwMDAsIDB4ODIxMCwgMHgxZjA0LCAweGE4YzcsIDB4MjAwYywgMHg2OTgyLAorCTB4ODAwMCwgMHgyMDBjLCAweDY5N2UsIDB4MDgwYywgMHg1NDA4LCAweDAwMmUsIDB4MDA0ZSwgMHgwMTVlLAorCTB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDAwNSwgMHgyMDAxLCAweGI1MGUsIDB4MjAwNCwgMHhkMDg0LAorCTB4MDEyMCwgMHgwODBjLCAweDE1ZjgsIDB4MTkwNCwgMHhhODhkLCAweDYwMTMsIDB4MDEwMCwgMHg2MDAzLAorCTB4MDAwMSwgMHg2MDA3LCAweDAwNDEsIDB4MDgwYywgMHg2YzhkLCAweDA4MGMsIDB4NzE3MywgMHgwYzI4LAorCTB4MjA2OSwgMHhiYjkyLCAweDJkMDQsIDB4YTA4NCwgMHhmZjAwLCAweGEwODYsIDB4MTIwMCwgMHgxMWE4LAorCTB4MjA2OSwgMHhiYjgwLCAweDY4NmMsIDB4YTA4NCwgMHgwMGZmLCAweDAwMTYsIDB4NjExMCwgMHhhMThjLAorCTB4MDcwMCwgMHhhMTBkLCAweDYxMTIsIDB4MDAxZSwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDQzLAorCTB4MDgwYywgMHg2YzhkLCAweDA4MGMsIDB4NzE3MywgMHgwODQwLCAweDY4NjgsIDB4NjAyYSwgMHg2ODZjLAorCTB4NjAyZSwgMHg2MDEzLCAweDAyMDAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDA0MSwgMHgwODBjLAorCTB4NmM4ZCwgMHgwODBjLCAweDcxNzMsIDB4MDgwNCwgMHhhOGQ1LCAweDIwMDEsIDB4YjUwZCwgMHgyMDA0LAorCTB4ZDBlYywgMHgwMTIwLCAweDIwMTEsIDB4ODA0OSwgMHgwODBjLCAweDNlY2MsIDB4NjAxMywgMHgwMzAwLAorCTB4MDAxMCwgMHg2MDEzLCAweDAxMDAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDA0MSwgMHgwODBjLAorCTB4NmM4ZCwgMHgwODBjLCAweDcxNzMsIDB4MDgwNCwgMHhhOGQ1LCAweDYwMTMsIDB4MDUwMCwgMHgwYzk4LAorCTB4NjAxMywgMHgwNjAwLCAweDA4MDQsIDB4YThmMCwgMHg2MDEzLCAweDAyMDAsIDB4MDgwNCwgMHhhOGYwLAorCTB4YTE4NiwgMHgwMDEzLCAweDExNzAsIDB4NjAwNCwgMHhhMDhhLCAweDAwNDAsIDB4MGEwYywgMHgxNTE1LAorCTB4YTA4YSwgMHgwMDUzLCAweDFhMGMsIDB4MTUxNSwgMHhhMDgyLCAweDAwNDAsIDB4MjAwOCwgMHgwODA0LAorCTB4YTljYSwgMHhhMTg2LCAweDAwNTEsIDB4MDEzOCwgMHhhMTg2LCAweDAwNDcsIDB4MTFkOCwgMHg2MDA0LAorCTB4YTA4NiwgMHgwMDQxLCAweDA1MTgsIDB4MjAwMSwgMHgwMTA5LCAweDIwMDQsIDB4ZDA4NCwgMHgwMWYwLAorCTB4MDEyNiwgMHgyMDkxLCAweDI4MDAsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDgwYywgMHg2Yjc0LAorCTB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDEyZSwgMHg2MDAwLCAweGEwODYsIDB4MDAwMiwgMHgxMTcwLAorCTB4MDgwNCwgMHhhYTBkLCAweGExODYsIDB4MDAyNywgMHgwMTIwLCAweGExODYsIDB4MDAxNCwgMHgxOTBjLAorCTB4MTUxNSwgMHg2MDA0LCAweGEwODIsIDB4MDA0MCwgMHgyMDA4LCAweDAwMWEsIDB4MDgwYywgMHg4NjYzLAorCTB4MDAwNSwgMHhhOTk0LCAweGE5OTYsIDB4YTk5NiwgMHhhOWJhLCAweGE5OTQsIDB4YTk5NCwgMHhhOTk0LAorCTB4YTk5NCwgMHhhOTk0LCAweGE5OTQsIDB4YTk5NCwgMHhhOTk0LCAweGE5OTQsIDB4YTk5NCwgMHhhOTk0LAorCTB4YTk5NCwgMHhhOTk0LCAweGE5OTQsIDB4YTk5NCwgMHgwODBjLCAweDE1MTUsIDB4MDgwYywgMHg3MDkwLAorCTB4MDgwYywgMHg3MTczLCAweDAwMzYsIDB4MDBkNiwgMHg2MDEwLCAweGEwNmQsIDB4MDFjMCwgMHhhZDg0LAorCTB4ZjAwMCwgMHgwMWE4LCAweDYwMDMsIDB4MDAwMiwgMHg2MDE4LCAweDIwMDQsIDB4ZDBiYywgMHgxMTc4LAorCTB4MjAxOSwgMHgwMDA0LCAweDA4MGMsIDB4YjA5OSwgMHg2MDEzLCAweDAwMDAsIDB4NjAxNCwgMHhhMDA1LAorCTB4MTEyMCwgMHgyMDAxLCAweGI3YjcsIDB4MjAwNCwgMHg2MDE2LCAweDYwMDMsIDB4MDAwNywgMHgwMGRlLAorCTB4MDAzZSwgMHgwMDA1LCAweDAwZDYsIDB4MDgwYywgMHg3MDkwLCAweDA4MGMsIDB4NzE3MywgMHgwODBjLAorCTB4OWM1YSwgMHgwMTIwLCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLCAweDE2MGYsIDB4MDgwYywgMHg5ZTFkLAorCTB4MDBkZSwgMHgwMDA1LCAweDAwMDIsIDB4YTlkZSwgMHhhOWZiLCAweGE5ZTcsIDB4YWEwNywgMHhhOWRlLAorCTB4YTlkZSwgMHhhOWRlLCAweGE5ZGUsIDB4YTlkZSwgMHhhOWRlLCAweGE5ZGUsIDB4YTlkZSwgMHhhOWRlLAorCTB4YTlkZSwgMHhhOWRlLCAweGE5ZGUsIDB4YTlkZSwgMHhhOWRlLCAweGE5ZGUsIDB4MDgwYywgMHgxNTE1LAorCTB4NjAxMCwgMHhhMDg4LCAweDAwMTMsIDB4MjEwNCwgMHhhMDg1LCAweDA0MDAsIDB4MjAwYSwgMHgwODBjLAorCTB4NzA5MCwgMHg2MDEwLCAweGEwODAsIDB4MDAxMywgMHgyMDA0LCAweGQwYjQsIDB4MDEzOCwgMHg2MDAzLAorCTB4MDAwNywgMHgyMDA5LCAweDAwNDMsIDB4MDgwYywgMHg4NjRjLCAweDAwMTAsIDB4NjAwMywgMHgwMDAyLAorCTB4MDgwYywgMHg3MTczLCAweDAwMDUsIDB4MDgwYywgMHg3MDkwLCAweDA4MGMsIDB4YjJkNywgMHgxMTIwLAorCTB4MDgwYywgMHg2YWVmLCAweDA4MGMsIDB4ODYxZCwgMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHgwODBjLAorCTB4NzA5MCwgMHgyMDA5LCAweDAwNDEsIDB4MDgwNCwgMHhhYjU2LCAweGExODIsIDB4MDA0MCwgMHgwMDAyLAorCTB4YWEyMywgMHhhYTI1LCAweGFhMjMsIDB4YWEyMywgMHhhYTIzLCAweGFhMjMsIDB4YWEyMywgMHhhYTI2LAorCTB4YWEyMywgMHhhYTIzLCAweGFhMjMsIDB4YWEyMywgMHhhYTIzLCAweGFhMjMsIDB4YWEyMywgMHhhYTIzLAorCTB4YWEyMywgMHhhYTMxLCAweGFhMjMsIDB4MDgwYywgMHgxNTE1LCAweDAwMDUsIDB4NjAwMywgMHgwMDA0LAorCTB4NjExMCwgMHgyMGUxLCAweDAwMDUsIDB4M2QxOCwgMHgzZTIwLCAweDJjMTAsIDB4MDgwYywgMHgxODVlLAorCTB4MDAwNSwgMHgwMGQ2LCAweDA4MGMsIDB4NmFlZiwgMHgwMGRlLCAweDA4MGMsIDB4YjMzYSwgMHgwODBjLAorCTB4ODYxZCwgMHgwMDA1LCAweGExODIsIDB4MDA0MCwgMHgwMDAyLCAweGFhNTAsIDB4YWE1MCwgMHhhYTUwLAorCTB4YWE1MCwgMHhhYTUwLCAweGFhNTAsIDB4YWE1MCwgMHhhYTUyLCAweGFhNTAsIDB4YWE1NSwgMHhhYThlLAorCTB4YWE1MCwgMHhhYTUwLCAweGFhNTAsIDB4YWE1MCwgMHhhYThlLCAweGFhNTAsIDB4YWE1MCwgMHhhYTUwLAorCTB4MDgwYywgMHgxNTE1LCAweDA4MGMsIDB4ODY2MywgMHgwMDA1LCAweDIwMDEsIDB4YjU3MiwgMHgyMDA0LAorCTB4ZDBlNCwgMHgwMTU4LCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweGEwODIsIDB4MDAwNSwgMHgwMjI4LAorCTB4MjAwMSwgMHgwMTFmLCAweDIwMDQsIDB4NjAzNiwgMHgwMDEwLCAweDYwMzcsIDB4MDAwMCwgMHgwODBjLAorCTB4NzEyNiwgMHgwODBjLCAweDcyMzAsIDB4NjAxMCwgMHgwMGQ2LCAweDIwNjgsIDB4Njg0YywgMHhkMGZjLAorCTB4MDE1MCwgMHhhMDhjLCAweDAwMDMsIDB4YTE4ZSwgMHgwMDAyLCAweDAxNjgsIDB4MjAwOSwgMHgwMDQxLAorCTB4MDBkZSwgMHgwODA0LCAweGFiNTYsIDB4NjAwMywgMHgwMDA3LCAweDYwMTcsIDB4MDAwMCwgMHgwODBjLAorCTB4NmFlZiwgMHgwMGRlLCAweDAwMDUsIDB4MDgwYywgMHhiMmQ3LCAweDAxMTAsIDB4MDBkZSwgMHgwMDA1LAorCTB4MDgwYywgMHg2YWVmLCAweDA4MGMsIDB4ODYxZCwgMHgwMGRlLCAweDBjYTAsIDB4MDAzNiwgMHgwODBjLAorCTB4NzEyNiwgMHgwODBjLCAweDcyMzAsIDB4NjAxMCwgMHgwMGQ2LCAweDIwNjgsIDB4NjAxOCwgMHgyMDA0LAorCTB4ZDBiYywgMHgwMTg4LCAweDY4NGMsIDB4YTA4NCwgMHgwMDAzLCAweGEwODYsIDB4MDAwMiwgMHgwMTQwLAorCTB4Njg3YywgMHg2MzJjLCAweGEzMWEsIDB4NjMyZSwgMHg2ODgwLCAweDYzMjgsIDB4YTMxYiwgMHg2MzJhLAorCTB4NjAwMywgMHgwMDAyLCAweDAwODAsIDB4MjAxOSwgMHgwMDA0LCAweDA4MGMsIDB4YjA5OSwgMHg2MDE0LAorCTB4YTAwNSwgMHgxMTI4LCAweDIwMDEsIDB4YjdiNywgMHgyMDA0LCAweDgwMDMsIDB4NjAxNiwgMHg2MDEzLAorCTB4MDAwMCwgMHg2MDAzLCAweDAwMDcsIDB4MDBkZSwgMHgwMDNlLCAweDAwMDUsIDB4YTE4NiwgMHgwMDEzLAorCTB4MTE1MCwgMHg2MDA0LCAweGEwODYsIDB4MDA0MiwgMHgxOTBjLCAweDE1MTUsIDB4MDgwYywgMHg3MDkwLAorCTB4MDgwYywgMHg3MTczLCAweDAwMDUsIDB4YTE4NiwgMHgwMDI3LCAweDAxMTgsIDB4YTE4NiwgMHgwMDE0LAorCTB4MTE4MCwgMHg2MDA0LCAweGEwODYsIDB4MDA0MiwgMHgxOTBjLCAweDE1MTUsIDB4MjAwMSwgMHgwMDA3LAorCTB4MDgwYywgMHg0ZjJhLCAweDA4MGMsIDB4NzA5MCwgMHgwODBjLCAweDllMWQsIDB4MDgwYywgMHg3MTczLAorCTB4MDAwNSwgMHhhMTgyLCAweDAwNDAsIDB4MDAwMiwgMHhhYWY3LCAweGFhZjcsIDB4YWFmNywgMHhhYWY3LAorCTB4YWFmNywgMHhhYWY3LCAweGFhZjcsIDB4YWFmOSwgMHhhYjA1LCAweGFhZjcsIDB4YWFmNywgMHhhYWY3LAorCTB4YWFmNywgMHhhYWY3LCAweGFhZjcsIDB4YWFmNywgMHhhYWY3LCAweGFhZjcsIDB4YWFmNywgMHgwODBjLAorCTB4MTUxNSwgMHgwMDM2LCAweDAwNDYsIDB4MjBlMSwgMHgwMDA1LCAweDNkMTgsIDB4M2UyMCwgMHgyYzEwLAorCTB4MDgwYywgMHgxODVlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDA1LCAweDYwMTAsIDB4MDBkNiwgMHgyMDY4LAorCTB4NjgxMCwgMHg2YTE0LCAweDAwMDYsIDB4MDA0NiwgMHgwMDU2LCAweDZjN2MsIDB4YTQyMiwgMHg2ZDgwLAorCTB4MjIwMCwgMHhhNTJiLCAweDYwMmMsIDB4YTQyMCwgMHg2NDJlLCAweDYwMjgsIDB4YTUyOSwgMHg2NTJhLAorCTB4MDA1ZSwgMHgwMDRlLCAweDAwMGUsIDB4YTIwZCwgMHgxMTc4LCAweDY4NGMsIDB4ZDBmYywgMHgwMTIwLAorCTB4MjAwOSwgMHgwMDQxLCAweDAwZGUsIDB4MDQ5MCwgMHg2MDAzLCAweDAwMDcsIDB4NjAxNywgMHgwMDAwLAorCTB4MDgwYywgMHg2YWVmLCAweDAwZGUsIDB4MDAwNSwgMHgwMDA2LCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLAorCTB4NTMwNSwgMHgwMGZlLCAweDAwMGUsIDB4MDEyMCwgMHg2MDAzLCAweDAwMDIsIDB4MDBkZSwgMHgwMDA1LAorCTB4MjAwOSwgMHhiNTBkLCAweDIxMGMsIDB4ZDE5YywgMHgwMTE4LCAweDYwMDMsIDB4MDAwNywgMHgwMDEwLAorCTB4NjAwMywgMHgwMDA2LCAweDAwMjEsIDB4MDgwYywgMHg2YWYxLCAweDAwZGUsIDB4MDAwNSwgMHhkMmZjLAorCTB4MDE0MCwgMHg4MDAyLCAweDgwMDAsIDB4ODIxMiwgMHhhMjkxLCAweDAwMDAsIDB4MjAwOSwgMHgwMDA5LAorCTB4MDAxMCwgMHgyMDA5LCAweDAwMTUsIDB4NmE2YSwgMHg2ODY2LCAweDAwMDUsIDB4YTE4MiwgMHgwMDQwLAorCTB4MDIwOCwgMHgwMDYyLCAweGExODYsIDB4MDAxMywgMHgwMTIwLCAweGExODYsIDB4MDAxNCwgMHgxOTBjLAorCTB4MTUxNSwgMHg2MDIwLCAweGQwZGMsIDB4MDkwYywgMHgxNTE1LCAweDAwMDUsIDB4YWI3OSwgMHhhYjgwLAorCTB4YWI4YywgMHhhYjk4LCAweGFiNzksIDB4YWI3OSwgMHhhYjc5LCAweGFiYTcsIDB4YWI3OSwgMHhhYjdiLAorCTB4YWI3YiwgMHhhYjc5LCAweGFiNzksIDB4YWI3OSwgMHhhYjc5LCAweGFiN2IsIDB4YWI3OSwgMHhhYjdiLAorCTB4YWI3OSwgMHgwODBjLCAweDE1MTUsIDB4NjAyMCwgMHhkMGRjLCAweDA5MGMsIDB4MTUxNSwgMHgwMDA1LAorCTB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MDgwYywgMHg2YzhkLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg3MTczLCAweDAxMmUsIDB4MDAwNSwgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgwODBjLAorCTB4NmM4ZCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDcxNzMsIDB4MDEyZSwgMHgwMDA1LAorCTB4NjAwMywgMHgwMDAzLCAweDYxMDYsIDB4MmMxMCwgMHgwODBjLCAweDFmYTksIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDZjZjAsIDB4MDgwYywgMHg3MjMwLCAweDAxMmUsIDB4MDAwNSwgMHhhMDE2LAorCTB4MDgwYywgMHgxODVlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDAzNiwgMHgwMGQ2LAorCTB4YTE4MiwgMHgwMDQwLCAweDAwMjMsIDB4MDBkZSwgMHgwMDNlLCAweDAxMmUsIDB4MDAwNSwgMHhhYmM3LAorCTB4YWJjOSwgMHhhYmRiLCAweGFiZjYsIDB4YWJjNywgMHhhYmM3LCAweGFiYzcsIDB4YWMwYiwgMHhhYmM3LAorCTB4YWJjNywgMHhhYmM3LCAweGFiYzcsIDB4YWJjNywgMHhhYmM3LCAweGFiYzcsIDB4YWJjNywgMHgwODBjLAorCTB4MTUxNSwgMHg2MDEwLCAweDIwNjgsIDB4Njg0YywgMHhkMGZjLCAweDAxZjgsIDB4YTA5YywgMHgwMDAzLAorCTB4YTM5ZSwgMHgwMDAzLCAweDAxZDAsIDB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MDgwYywgMHg2YzhkLAorCTB4MDgwYywgMHg3MTczLCAweDA0OTgsIDB4NjAxMCwgMHgyMDY4LCAweDY4NGMsIDB4ZDBmYywgMHgwMTY4LAorCTB4YTA5YywgMHgwMDAzLCAweGEzOWUsIDB4MDAwMywgMHgwMTQwLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LAorCTB4MDgwYywgMHg2YzhkLCAweDA4MGMsIDB4NzE3MywgMHgwNDA4LCAweDYwMTMsIDB4MDAwMCwgMHg2MDE3LAorCTB4MDAwMCwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywgMHhiMDk5LCAweDAwYzAsIDB4NjAxMCwgMHgyMDY4LAorCTB4Njg0YywgMHhkMGZjLCAweDBkOTAsIDB4YTA5YywgMHgwMDAzLCAweGEzOWUsIDB4MDAwMywgMHgwZDY4LAorCTB4NjAwMywgMHgwMDAzLCAweDYxMDYsIDB4MmMxMCwgMHgwODBjLCAweDFmYTksIDB4MDgwYywgMHg2Y2YwLAorCTB4MDgwYywgMHg3MjMwLCAweDAwMTgsIDB4YTAxNiwgMHgwODBjLCAweDE4NWUsIDB4MDAwNSwgMHgwODBjLAorCTB4NzA5MCwgMHg2MTEwLCAweDgxZmYsIDB4MDE1OCwgMHgwMGQ2LCAweDIxNjgsIDB4MDgwYywgMHhiMzgwLAorCTB4MDAzNiwgMHgyMDE5LCAweDAwMjksIDB4MDgwYywgMHhiMDk5LCAweDAwM2UsIDB4MDBkZSwgMHgwODBjLAorCTB4OWUxZCwgMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHgwODBjLCAweDcxMjYsIDB4NjExMCwgMHg4MWZmLAorCTB4MDE1OCwgMHgwMGQ2LCAweDIxNjgsIDB4MDgwYywgMHhiMzgwLCAweDAwMzYsIDB4MjAxOSwgMHgwMDI5LAorCTB4MDgwYywgMHhiMDk5LCAweDAwM2UsIDB4MDBkZSwgMHgwODBjLCAweDllMWQsIDB4MDgwYywgMHg3MjMwLAorCTB4MDAwNSwgMHhhMTgyLCAweDAwODUsIDB4MDAwMiwgMHhhYzQ1LCAweGFjNDMsIDB4YWM0MywgMHhhYzUxLAorCTB4YWM0MywgMHhhYzQzLCAweGFjNDMsIDB4MDgwYywgMHgxNTE1LCAweDYwMDMsIDB4MDAwYiwgMHg2MTA2LAorCTB4MDgwYywgMHg2YzhkLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NzE3MywgMHgwMTJlLAorCTB4MDAwNSwgMHgwMDI2LCAweDAwZTYsIDB4MDgwYywgMHhiMmQwLCAweDAxMTgsIDB4MDgwYywgMHg4NjFkLAorCTB4MDBkOCwgMHgyMDcxLCAweGJiODAsIDB4NzIyNCwgMHg2MjEyLCAweDcyMjAsIDB4MDgwYywgMHhhZjQ3LAorCTB4MDExOCwgMHg2MDA3LCAweDAwODYsIDB4MDA0MCwgMHg2MDA3LCAweDAwODcsIDB4NzIyNCwgMHhhMjk2LAorCTB4ZmZmZiwgMHgxMTEwLCAweDYwMDcsIDB4MDA4NiwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2YzhkLAorCTB4MDgwYywgMHg3MTczLCAweDA4MGMsIDB4NzIzMCwgMHgwMGVlLCAweDAwMmUsIDB4MDAwNSwgMHhhMTg2LAorCTB4MDAxMywgMHgxMTYwLCAweDYwMDQsIDB4YTA4YSwgMHgwMDg1LCAweDBhMGMsIDB4MTUxNSwgMHhhMDhhLAorCTB4MDA4YywgMHgxYTBjLCAweDE1MTUsIDB4YTA4MiwgMHgwMDg1LCAweDAwYTIsIDB4YTE4NiwgMHgwMDI3LAorCTB4MDEzMCwgMHhhMTg2LCAweDAwMTQsIDB4MDExOCwgMHgwODBjLCAweDg2NjMsIDB4MDA1MCwgMHgyMDAxLAorCTB4MDAwNywgMHgwODBjLCAweDRmMmEsIDB4MDgwYywgMHg3MDkwLCAweDA4MGMsIDB4OWUxZCwgMHgwODBjLAorCTB4NzE3MywgMHgwMDA1LCAweGFjYTEsIDB4YWNhMywgMHhhY2EzLCAweGFjYTEsIDB4YWNhMSwgMHhhY2ExLAorCTB4YWNhMSwgMHgwODBjLCAweDE1MTUsIDB4MDgwYywgMHg3MDkwLCAweDA4MGMsIDB4OWUxZCwgMHgwODBjLAorCTB4NzE3MywgMHgwMDA1LCAweGExODIsIDB4MDA4NSwgMHgwYTBjLCAweDE1MTUsIDB4YTE4MiwgMHgwMDhjLAorCTB4MWEwYywgMHgxNTE1LCAweGExODIsIDB4MDA4NSwgMHgwMDAyLCAweGFjYmMsIDB4YWNiYywgMHhhY2JjLAorCTB4YWNiZSwgMHhhY2JjLCAweGFjYmMsIDB4YWNiYywgMHgwODBjLCAweDE1MTUsIDB4MDAwNSwgMHhhMTg2LAorCTB4MDAxMywgMHgwMTQ4LCAweGExODYsIDB4MDAxNCwgMHgwMTMwLCAweGExODYsIDB4MDAyNywgMHgwMTE4LAorCTB4MDgwYywgMHg4NjYzLCAweDAwMzAsIDB4MDgwYywgMHg3MDkwLCAweDA4MGMsIDB4OWUxZCwgMHgwODBjLAorCTB4NzE3MywgMHgwMDA1LCAweDAwMzYsIDB4MDgwYywgMHhiMzNhLCAweDYwM2YsIDB4MDAwMCwgMHgyMDE5LAorCTB4MDAwYiwgMHgwMDMxLCAweDYwMWYsIDB4MDAwNiwgMHg2MDAzLCAweDAwMDcsIDB4MDAzZSwgMHgwMDA1LAorCTB4MDEyNiwgMHgwMDM2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDg2LCAweDJjNDAsIDB4MDA5NiwgMHgyMDQ5LAorCTB4MDAwMCwgMHgwODBjLCAweDgxMzAsIDB4MDA5ZSwgMHgwMDhlLCAweDE1NzgsIDB4MDA3NiwgMHgyYzM4LAorCTB4MDgwYywgMHg4MWQ2LCAweDAwN2UsIDB4MTU0OCwgMHg2MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwNTI4LAorCTB4NjAxYywgMHhhMDg2LCAweDAwMDcsIDB4MDUwOCwgMHgwMGQ2LCAweDYwMDAsIDB4YTA4NiwgMHgwMDA0LAorCTB4MTE1MCwgMHgwODBjLCAweGIzM2EsIDB4NjAxZiwgMHgwMDA3LCAweDIwMDEsIDB4YjdiNiwgMHgyMDA0LAorCTB4NjAxNiwgMHgwODBjLCAweDE5NGQsIDB4NjAxMCwgMHgyMDY4LCAweDA4MGMsIDB4OWM1YSwgMHgwMTEwLAorCTB4MDgwYywgMHhiMDk5LCAweDAwZGUsIDB4NjAxMywgMHgwMDAwLCAweDA4MGMsIDB4YjMzYSwgMHg2MDFmLAorCTB4MDAwNywgMHgyMDAxLCAweGI3YjYsIDB4MjAwNCwgMHg2MDE2LCAweDAwM2UsIDB4MDEyZSwgMHgwMDA1LAorCTB4MDBmNiwgMHgwMGM2LCAweDAwMzYsIDB4MDE1NiwgMHgyMDc5LCAweGJiODAsIDB4NzkzOCwgMHg3ODNjLAorCTB4MDgwYywgMHgyODFkLCAweDE1YjAsIDB4MDAxNiwgMHgwMGM2LCAweDA4MGMsIDB4NGZhOSwgMHgxNTc4LAorCTB4MDAxZSwgMHgwMDJlLCAweDAwMjYsIDB4MDAxNiwgMHgyMDE5LCAweDAwMjksIDB4MDgwYywgMHg4Mjk5LAorCTB4MDgwYywgMHg2ZGY1LCAweDAwNzYsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsIDB4NmQwMiwgMHgwMDdlLAorCTB4MDAxZSwgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweGFlODIsIDB4MDA3ZSwgMHgwODBjLAorCTB4NTFhYSwgMHgwMDI2LCAweDYyMDQsIDB4YTI5NCwgMHhmZjAwLCAweDgyMTcsIDB4YTI4NiwgMHgwMDA2LAorCTB4MDExOCwgMHhhMjg2LCAweDAwMDQsIDB4MTExOCwgMHg2MmEwLCAweDA4MGMsIDB4MmQ1NSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwODBjLCAweDRjMGIsIDB4NjYxMiwgMHg2NTE2LCAweGEwMDYsIDB4MDAxMCwgMHgwMGNlLAorCTB4MDAxZSwgMHgwMTVlLCAweDAwM2UsIDB4MDBjZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LAorCTB4MDBlNiwgMHgwMDE2LCAweDIwMDksIDB4YjUyMSwgMHgyMTA0LCAweGEwODYsIDB4MDA3NCwgMHgxOTA0LAorCTB4YWRiYiwgMHgyMDY5LCAweGJiOGUsIDB4NjkwYywgMHhhMTgyLCAweDAxMDAsIDB4MDZjMCwgMHg2OTA4LAorCTB4YTE4NCwgMHg4MDAwLCAweDA1ZTgsIDB4MjAwMSwgMHhiNzllLCAweDIwMDQsIDB4YTAwNSwgMHgxMTYwLAorCTB4NjAxOCwgMHgyMDcwLCAweDcwMTAsIDB4YTA4NCwgMHgwMGZmLCAweDAxMTgsIDB4NzAwMCwgMHhkMGY0LAorCTB4MDExOCwgMHhhMTg0LCAweDA4MDAsIDB4MDU2MCwgMHg2OTEwLCAweGExOGEsIDB4MDAwMSwgMHgwNjEwLAorCTB4NjkxNCwgMHgyMDY5LCAweGJiYWUsIDB4NjkwNCwgMHg4MWZmLCAweDExOTgsIDB4NjkwYywgMHhhMTgyLAorCTB4MDEwMCwgMHgwMmE4LCAweDY5MDgsIDB4ODFmZiwgMHgxMTc4LCAweDY5MTAsIDB4YTE4YSwgMHgwMDAxLAorCTB4MDI4OCwgMHg2OTE4LCAweGExOGEsIDB4MDAwMSwgMHgwMjk4LCAweDAwZDAsIDB4NjAxMywgMHgwMTAwLAorCTB4MDBhMCwgMHg2MDEzLCAweDAzMDAsIDB4MDA4OCwgMHg2MDEzLCAweDA1MDAsIDB4MDA3MCwgMHg2MDEzLAorCTB4MDcwMCwgMHgwMDU4LCAweDYwMTMsIDB4MDkwMCwgMHgwMDQwLCAweDYwMTMsIDB4MGIwMCwgMHgwMDI4LAorCTB4NjAxMywgMHgwZjAwLCAweDAwMTAsIDB4NjAxMywgMHgyZDAwLCAweGEwODUsIDB4MDAwMSwgMHgwMDA4LAorCTB4YTAwNiwgMHgwMDFlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LAorCTB4MDAyNiwgMHgwMDM2LCAweDAxNTYsIDB4NjIxOCwgMHgyMjY4LCAweDZiMDQsIDB4YTM5NCwgMHgwMGZmLAorCTB4YTI4NiwgMHgwMDA2LCAweDAxOTAsIDB4YTI4NiwgMHgwMDA0LCAweDAxNzgsIDB4YTM5NCwgMHhmZjAwLAorCTB4ODIxNywgMHhhMjg2LCAweDAwMDYsIDB4MDE0OCwgMHhhMjg2LCAweDAwMDQsIDB4MDEzMCwgMHgwMGM2LAorCTB4MmQ2MCwgMHgwODBjLCAweDRmYjgsIDB4MDBjZSwgMHgwNGMwLCAweDIwMTEsIDB4YmI5NiwgMHhhZDk4LAorCTB4MDAwYSwgMHgyMGE5LCAweDAwMDQsIDB4MDgwYywgMHg5MGRhLCAweDE1ODAsIDB4MjAxMSwgMHhiYjlhLAorCTB4YWQ5OCwgMHgwMDA2LCAweDIwYTksIDB4MDAwNCwgMHgwODBjLCAweDkwZGEsIDB4MTUzOCwgMHgwMDQ2LAorCTB4MDAxNiwgMHg2YWEwLCAweGEyOTQsIDB4MDBmZiwgMHg4MjI3LCAweGEwMDYsIDB4MjAwOSwgMHhiNTUzLAorCTB4MjEwYywgMHhkMWE0LCAweDAxMzgsIDB4MjAwOSwgMHgwMDI5LCAweDA4MGMsIDB4YjBlOCwgMHg2ODAwLAorCTB4YzBlNSwgMHg2ODAyLCAweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweDZkZjUsIDB4MDA3NiwgMHgyMDM5LAorCTB4MDAwMCwgMHgwODBjLCAweDZkMDIsIDB4MmMwOCwgMHgwODBjLCAweGFlODIsIDB4MDA3ZSwgMHgyMDAxLAorCTB4MDAwNywgMHgwODBjLCAweDRmMmEsIDB4MDAxZSwgMHgwMDRlLCAweGEwMDYsIDB4MDE1ZSwgMHgwMDNlLAorCTB4MDAyZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGQ2LCAweDIwNjksIDB4YmI4ZSwgMHg2ODAwLAorCTB4YTA4NiwgMHgwODAwLCAweDAxMTgsIDB4NjAxMywgMHgwMDAwLCAweDAwMDgsIDB4YTAwNiwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMGM2LCAweDAwZjYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDE1NiwgMHgyMDc5LAorCTB4YmI4YywgMHg3OTMwLCAweDc4MzQsIDB4MDgwYywgMHgyODFkLCAweDExYTAsIDB4MDgwYywgMHg0ZmE5LAorCTB4MTE4OCwgMHgyMDExLCAweGJiOTAsIDB4YWM5OCwgMHgwMDBhLCAweDIwYTksIDB4MDAwNCwgMHgwODBjLAorCTB4OTBkYSwgMHgxMTQwLCAweDIwMTEsIDB4YmI5NCwgMHhhYzk4LCAweDAwMDYsIDB4MjBhOSwgMHgwMDA0LAorCTB4MDgwYywgMHg5MGRhLCAweDAxNWUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDBmZSwgMHgwMGNlLAorCTB4MDAwNSwgMHgwMGM2LCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDE1NiwgMHgyMDExLAorCTB4YmI4MywgMHgyMjA0LCAweDgyMTEsIDB4MjIwYywgMHgwODBjLCAweDI4MWQsIDB4MTFhMCwgMHgwODBjLAorCTB4NGZhOSwgMHgxMTg4LCAweDIwMTEsIDB4YmI5NiwgMHhhYzk4LCAweDAwMGEsIDB4MjBhOSwgMHgwMDA0LAorCTB4MDgwYywgMHg5MGRhLCAweDExNDAsIDB4MjAxMSwgMHhiYjlhLCAweGFjOTgsIDB4MDAwNiwgMHgyMGE5LAorCTB4MDAwNCwgMHgwODBjLCAweDkwZGEsIDB4MDE1ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLAorCTB4MDBjZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMDg2LCAweDAwNzYsIDB4MDA2NiwgMHgwMDU2LAorCTB4MDA0NiwgMHgwMDI2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDI3NDAsIDB4MjAyOSwgMHhiN2U5LAorCTB4MjUyYywgMHgyMDIxLCAweGI3ZWYsIDB4MjQyNCwgMHgyMDYxLCAweGJkMDAsIDB4MjA3MSwgMHhiNTAwLAorCTB4NzY0OCwgMHg3MDY4LCAweDgxZmYsIDB4MDE1MCwgMHgwMDA2LCAweGExODYsIDB4YjhmNCwgMHgwMDBlLAorCTB4MDEyOCwgMHg4MDAxLCAweGE2MDIsIDB4MWEwNCwgMHhhZjAzLCAweDAwMTgsIDB4YTYwNiwgMHgwOTA0LAorCTB4YWYwMywgMHgyMTAwLCAweGFjMDYsIDB4MDkwNCwgMHhhZWZhLCAweDA4MGMsIDB4YjExMCwgMHgwOTA0LAorCTB4YWVmYSwgMHg2NzFjLCAweGE3ODYsIDB4MDAwMSwgMHgwOTA0LCAweGFmMWUsIDB4YTc4NiwgMHgwMDA0LAorCTB4MDkwNCwgMHhhZjFlLCAweGE3ODYsIDB4MDAwNywgMHgwNWU4LCAweDI1MDAsIDB4YWMwNiwgMHgwNWQwLAorCTB4MjQwMCwgMHhhYzA2LCAweDA1YjgsIDB4MDgwYywgMHhiMTIwLCAweDE1YTAsIDB4ODhmZiwgMHgwMTE4LAorCTB4NjA1MCwgMHhhOTA2LCAweDE1NzgsIDB4MDBkNiwgMHg2MDAwLCAweGEwODYsIDB4MDAwNCwgMHgxMTIwLAorCTB4MDAxNiwgMHgwODBjLCAweDE5NGQsIDB4MDAxZSwgMHhhNzg2LCAweDAwMDgsIDB4MTE0OCwgMHgwODBjLAorCTB4OWU1OCwgMHgxMTMwLCAweDA4MGMsIDB4OGMxOSwgMHgwMGRlLCAweDA4MGMsIDB4OWUxZCwgMHgwMGQwLAorCTB4NjAxMCwgMHgyMDY4LCAweDA4MGMsIDB4OWM1YSwgMHgwMTkwLCAweGE3ODYsIDB4MDAwMywgMHgxNTI4LAorCTB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLCAweDA4MGMsIDB4YjM4MCwgMHgwMDE2LAorCTB4MDgwYywgMHg5ZWNjLCAweDA4MGMsIDB4NTQwOCwgMHgwMDFlLCAweDA4MGMsIDB4OWUxMSwgMHgwMGRlLAorCTB4MDgwYywgMHg5ZTFkLCAweGFjZTAsIDB4MDAxOCwgMHgyMDAxLCAweGI1MTcsIDB4MjAwNCwgMHhhYzAyLAorCTB4MTIxMCwgMHgwODA0LCAweGFlOTYsIDB4MDEyZSwgMHgwMDJlLCAweDAwNGUsIDB4MDA1ZSwgMHgwMDZlLAorCTB4MDA3ZSwgMHgwMDhlLCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LCAweGE3ODYsIDB4MDAwNiwgMHgxMTUwLAorCTB4YTM4NiwgMHgwMDA1LCAweDAxMjgsIDB4MDgwYywgMHhiMzgwLCAweDA4MGMsIDB4YjA5OSwgMHgwOGY4LAorCTB4MDBkZSwgMHgwYzAwLCAweGE3ODYsIDB4MDAwYSwgMHgwOTY4LCAweDA4NTAsIDB4MDgwYywgMHhiMTIwLAorCTB4MTljOCwgMHg4MWZmLCAweDA5YjgsIDB4YTE4MCwgMHgwMDAxLCAweDIwMDQsIDB4YTA4NiwgMHgwMDE4LAorCTB4MDEzMCwgMHhhMTgwLCAweDAwMDEsIDB4MjAwNCwgMHhhMDg2LCAweDAwMmQsIDB4MTk1OCwgMHg2MDAwLAorCTB4YTA4NiwgMHgwMDAyLCAweDE5MzgsIDB4MDgwYywgMHg5ZTQ3LCAweDAxMzAsIDB4MDgwYywgMHg5ZTU4LAorCTB4MTkwOCwgMHgwODBjLCAweDhjMTksIDB4MDAzOCwgMHgwODBjLCAweDJjYzIsIDB4MDgwYywgMHg5ZTU4LAorCTB4MTExMCwgMHgwODBjLCAweDhjMTksIDB4MDgwYywgMHg5ZTFkLCAweDA4MDQsIDB4YWVmYSwgMHgwMGM2LAorCTB4MDBlNiwgMHgwMDE2LCAweDJjMDgsIDB4MjE3MCwgMHhhMDA2LCAweDA4MGMsIDB4YjBiYSwgMHgwMDFlLAorCTB4MDEyMCwgMHg2MDFjLCAweGEwODQsIDB4MDAwZiwgMHgwMDFiLCAweDAwZWUsIDB4MDBjZSwgMHgwMDA1LAorCTB4YWY2MCwgMHhhZjYwLCAweGFmNjAsIDB4YWY2MCwgMHhhZjYwLCAweGFmNjAsIDB4YWY2MiwgMHhhZjYwLAorCTB4YTAwNiwgMHgwMDA1LCAweDAwNDYsIDB4MDAxNiwgMHg3MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDI0LAorCTB4YTRhNCwgMHgwMGZmLCAweDg0MjcsIDB4MmMwMCwgMHgyMDA5LCAweDAwMjAsIDB4MDgwYywgMHhiMGU4LAorCTB4MDAxZSwgMHgwMDRlLCAweDAwMzYsIDB4MjAxOSwgMHgwMDAyLCAweDA4MGMsIDB4YWNlMCwgMHgwMDNlLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4NGVlYiwgMHgwMTU2LAorCTB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MjBhOSwgMHgwMDA0LCAweDIwMTksIDB4YjUwNSwgMHgyMDExLAorCTB4YmI5NiwgMHgwODBjLCAweDkwZGEsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDE1ZSwgMHhhMDA1LAorCTB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MDBjNiwgMHgwMDg2LCAweDAwNzYsIDB4MDA2NiwgMHgwMDI2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4Mjc0MCwgMHgyMDYxLCAweGJkMDAsIDB4MjA3OSwgMHgwMDAxLAorCTB4OGZmZiwgMHgwOTA0LCAweGFmZWYsIDB4MjA3MSwgMHhiNTAwLCAweDc2NDgsIDB4NzA2OCwgMHg4MDAxLAorCTB4YTYwMiwgMHgxYTA0LCAweGFmZWYsIDB4ODhmZiwgMHgwMTI4LCAweDI4MDAsIDB4YWMwNiwgMHgxNWIwLAorCTB4MjA3OSwgMHgwMDAwLCAweDA4MGMsIDB4YjExMCwgMHgwNTg4LCAweDI0MDAsIDB4YWMwNiwgMHgwNTcwLAorCTB4NjcxYywgMHhhNzg2LCAweDAwMDYsIDB4MTU1MCwgMHhhNzg2LCAweDAwMDcsIDB4MDUzOCwgMHg4OGZmLAorCTB4MTE0MCwgMHg2MDE4LCAweGEyMDYsIDB4MTUxMCwgMHg4NWZmLCAweDAxMTgsIDB4NjA1MCwgMHhhMTA2LAorCTB4MTFlOCwgMHgwMGQ2LCAweDYwMDAsIDB4YTA4NiwgMHgwMDA0LCAweDExNTAsIDB4MDgwYywgMHhiMzNhLAorCTB4NjAxZiwgMHgwMDA3LCAweDIwMDEsIDB4YjdiNiwgMHgyMDA0LCAweDYwMTYsIDB4MDgwYywgMHgxOTRkLAorCTB4NjAxMCwgMHgyMDY4LCAweDA4MGMsIDB4OWM1YSwgMHgwMTIwLCAweDAwNDYsIDB4MDgwYywgMHhiMDk5LAorCTB4MDA0ZSwgMHgwMGRlLCAweDA4MGMsIDB4OWUxZCwgMHg4OGZmLCAweDExOTgsIDB4YWNlMCwgMHgwMDE4LAorCTB4MjAwMSwgMHhiNTE3LCAweDIwMDQsIDB4YWMwMiwgMHgxMjEwLCAweDA4MDQsIDB4YWZhMCwgMHhhMDA2LAorCTB4MDEyZSwgMHgwMDJlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMDhlLCAweDAwY2UsIDB4MDBlZSwgMHgwMGZlLAorCTB4MDAwNSwgMHhhOGM1LCAweDAwMDEsIDB4MGNhMCwgMHgwMDc2LCAweDAwNTYsIDB4MDA4NiwgMHgyMDQxLAorCTB4MDAwMCwgMHgyMDI5LCAweDAwMDEsIDB4MmMyMCwgMHgyMDE5LCAweDAwMDIsIDB4NjIxOCwgMHgwMDk2LAorCTB4MjA0OSwgMHgwMDAwLCAweDA4MGMsIDB4ODEzMCwgMHgwMDllLCAweDAwOGUsIDB4MjAzOSwgMHgwMDAwLAorCTB4MDgwYywgMHg4MWQ2LCAweDA4MGMsIDB4YWY5MSwgMHgwMDVlLCAweDAwN2UsIDB4MDAwNSwgMHgwMDI2LAorCTB4MDA0NiwgMHgwMDU2LCAweDAwNzYsIDB4MDBjNiwgMHgwMTU2LCAweDJjMjAsIDB4MjEyOCwgMHgyMGE5LAorCTB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsIDB4MDAxNiwgMHgwMDM2LCAweDA4MGMsIDB4NGZhOSwgMHgxMWIwLAorCTB4MmMxMCwgMHgwMDU2LCAweDAwODYsIDB4MjA0MSwgMHgwMDAwLCAweDI1MDgsIDB4MjAyOSwgMHgwMDAxLAorCTB4MDA5NiwgMHgyMDQ5LCAweDAwMDAsIDB4MDgwYywgMHg4MTMwLCAweDAwOWUsIDB4MDA4ZSwgMHgyMDM5LAorCTB4MDAwMCwgMHgwODBjLCAweDgxZDYsIDB4MDgwYywgMHhhZjkxLCAweDAwNWUsIDB4MDAzZSwgMHgwMDFlLAorCTB4ODEwOCwgMHgxZjA0LCAweGIwMjMsIDB4MDE1ZSwgMHgwMGNlLCAweDAwN2UsIDB4MDA1ZSwgMHgwMDRlLAorCTB4MDAyZSwgMHgwMDA1LCAweDAwNzYsIDB4MDA1NiwgMHg2MjE4LCAweDAwODYsIDB4MjA0MSwgMHgwMDAwLAorCTB4MjAyOSwgMHgwMDAxLCAweDIwMTksIDB4MDA0OCwgMHgwMDk2LCAweDIwNDksIDB4MDAwMCwgMHgwODBjLAorCTB4ODEzMCwgMHgwMDllLCAweDAwOGUsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsIDB4ODFkNiwgMHgyYzIwLAorCTB4MDgwYywgMHhhZjkxLCAweDAwNWUsIDB4MDA3ZSwgMHgwMDA1LCAweDAwMjYsIDB4MDA0NiwgMHgwMDU2LAorCTB4MDA3NiwgMHgwMGM2LCAweDAxNTYsIDB4MmMyMCwgMHgyMGE5LCAweDAwN2YsIDB4MjAwOSwgMHgwMDAwLAorCTB4MDAxNiwgMHgwMDM2LCAweDA4MGMsIDB4NGZhOSwgMHgxMWMwLCAweDJjMTAsIDB4MDA4NiwgMHgyMDQxLAorCTB4MDAwMCwgMHgyODI4LCAweDAwNDYsIDB4MjAyMSwgMHgwMDAxLCAweDA4MGMsIDB4YjMxYywgMHgwMDRlLAorCTB4MDA5NiwgMHgyMDQ5LCAweDAwMDAsIDB4MDgwYywgMHg4MTMwLCAweDAwOWUsIDB4MDA4ZSwgMHgyMDM5LAorCTB4MDAwMCwgMHgwODBjLCAweDgxZDYsIDB4MDgwYywgMHhhZjkxLCAweDAwM2UsIDB4MDAxZSwgMHg4MTA4LAorCTB4MWYwNCwgMHhiMDcwLCAweDAxNWUsIDB4MDBjZSwgMHgwMDdlLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDJlLAorCTB4MDAwNSwgMHgwMDE2LCAweDAwZjYsIDB4MzgwMCwgMHhkMDhjLCAweDAxMzAsIDB4YWQ4MiwgMHgxMDAwLAorCTB4MDJiMCwgMHhhZDgyLCAweGI1MDAsIDB4MDIzMCwgMHhhZDgyLCAweGVkMDAsIDB4MDI4MCwgMHhhZDgyLAorCTB4ZmZmZiwgMHgxMjY4LCAweDY4MDAsIDB4YTA3ZCwgMHgwMTM4LCAweDY4MDMsIDB4MDAwMCwgMHg2YjUyLAorCTB4MDgwYywgMHg1NDA4LCAweDJmNjgsIDB4MGNiMCwgMHg2YjUyLCAweDA4MGMsIDB4NTQwOCwgMHgwMGZlLAorCTB4MDAxZSwgMHgwMDA1LCAweDAwZTYsIDB4MDA0NiwgMHgwMDM2LCAweDIwNjEsIDB4YmQwMCwgMHhhMDA1LAorCTB4MTEzOCwgMHgyMDcxLCAweGI1MDAsIDB4NzQ0OCwgMHg3MDY4LCAweDgwMDEsIDB4YTQwMiwgMHgxMmQ4LAorCTB4MjEwMCwgMHhhYzA2LCAweDAxNjgsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDE0OCwgMHg2MDA4LAorCTB4YTIwNiwgMHgxMTMwLCAweDYwMTgsIDB4YTFhMCwgMHgwMDA2LCAweDI0MjQsIDB4YTQwNiwgMHgwMTQwLAorCTB4YWNlMCwgMHgwMDE4LCAweDIwMDEsIDB4YjUxNywgMHgyMDA0LCAweGFjMDIsIDB4MTIyMCwgMHgwYzQwLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwMDgsIDB4YTAwNiwgMHgwMDNlLCAweDAwNGUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDBkNiwgMHgwMDA2LCAweDA4MGMsIDB4MTVmOCwgMHgwMDBlLCAweDA5MGMsIDB4MTUxNSwgMHg2ODM3LAorCTB4MDEwZCwgMHg2ODVlLCAweDAwMjYsIDB4MjAxMCwgMHgwODBjLCAweDljNGEsIDB4MjAwMSwgMHgwMDAwLAorCTB4MDEyMCwgMHgyMjAwLCAweGEwODAsIDB4MDAxNCwgMHgyMDA0LCAweDAwMmUsIDB4Njg0YSwgMHg2OTU2LAorCTB4NmM0NiwgMHg2ODRmLCAweDAwMDAsIDB4MjAwMSwgMHhiN2JlLCAweDIwMDQsIDB4Njg1MiwgMHhhMDA2LAorCTB4NjhiMiwgMHg2ODAyLCAweDY4M2EsIDB4Njg1YSwgMHgwODBjLCAweDU0MDgsIDB4MDBkZSwgMHgwMDA1LAorCTB4NjcwMCwgMHhhNzg2LCAweDAwMDAsIDB4MDE1OCwgMHhhNzg2LCAweDAwMDEsIDB4MDE0MCwgMHhhNzg2LAorCTB4MDAwYSwgMHgwMTI4LCAweGE3ODYsIDB4MDAwOSwgMHgwMTEwLCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LAorCTB4MDBlNiwgMHg2MDE4LCAweDIwNzAsIDB4NzBhMCwgMHhhMjA2LCAweDAwZWUsIDB4MDAwNSwgMHgwMDE2LAorCTB4NjAwNCwgMHhhMDhlLCAweDAwMWUsIDB4MTFhMCwgMHg4MDA3LCAweDYxMzAsIDB4YTE4YywgMHgwMGZmLAorCTB4YTEwNSwgMHg2MDMyLCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAxZiwgMHgwMDA1LAorCTB4MjAwMSwgMHhiN2I3LCAweDIwMDQsIDB4NjAxNiwgMHgwODBjLCAweDZjOGQsIDB4MDgwYywgMHg3MTczLAorCTB4MDAxZSwgMHgwMDA1LCAweGUwMDAsIDB4ZTAwMCwgMHgwMDA1LCAweDYwMjAsIDB4ZDBlNCwgMHgwMTU4LAorCTB4ZDBjYywgMHgwMTE4LCAweDA4MGMsIDB4OWYzNSwgMHgwMDMwLCAweDA4MGMsIDB4YjMzYSwgMHgwODBjLAorCTB4NmFlZiwgMHgwODBjLCAweDg2MWQsIDB4MDAwNSwgMHhhMjgwLCAweDAwMDcsIDB4MjAwNCwgMHhhMDg0LAorCTB4MDAwZiwgMHgwMDAyLCAweGIxNjMsIDB4YjE2MywgMHhiMTYzLCAweGIxNjgsIDB4YjE2MywgMHhiMTY1LAorCTB4YjE2NSwgMHhiMTYzLCAweGIxNjUsIDB4YTAwNiwgMHgwMDA1LCAweDAwYzYsIDB4MjI2MCwgMHgwMGNlLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4YTI4MCwgMHgwMDA3LCAweDIwMDQsIDB4YTA4NCwgMHgwMDBmLAorCTB4MDAwMiwgMHhiMTdhLCAweGIxN2EsIDB4YjE3YSwgMHhiMTdhLCAweGIxN2EsIDB4YjE3YSwgMHhiMTg1LAorCTB4YjE3YSwgMHhiMTdhLCAweDYwMDcsIDB4MDAzYiwgMHg2MDJiLCAweDAwMDksIDB4NjAxMywgMHgyYTAwLAorCTB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NmM4ZCwgMHgwMDA1LCAweDAwYzYsIDB4MjI2MCwgMHgwODBjLAorCTB4YjMzYSwgMHg2MDNmLCAweDAwMDAsIDB4NjAyMCwgMHhjMGY0LCAweGMwY2MsIDB4NjAyMiwgMHg2MDM3LAorCTB4MDAwMCwgMHgwMGNlLCAweDAwZDYsIDB4MjI2OCwgMHhhMTg2LCAweDAwMDcsIDB4MTkwNCwgMHhiMWUwLAorCTB4NjgxMCwgMHhhMDA1LCAweDAxMzgsIDB4YTA4MCwgMHgwMDEzLCAweDIwMDQsIDB4ZDBmYywgMHgxMTEwLAorCTB4MDBkZSwgMHgwOGMwLCAweDYwMDcsIDB4MDAzYSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2YzhkLAorCTB4MDgwYywgMHg3MTczLCAweDAwYzYsIDB4MmQ2MCwgMHg2MTAwLCAweGExODYsIDB4MDAwMiwgMHgxOTA0LAorCTB4YjI2OSwgMHg2MDEwLCAweGEwMDUsIDB4MTEzOCwgMHg2MDAwLCAweGEwODYsIDB4MDAwNywgMHgxOTBjLAorCTB4MTUxNSwgMHgwODA0LCAweGIyNjksIDB4YTA4YywgMHhmMDAwLCAweDExMzAsIDB4MDAyOCwgMHgyMDY4LAorCTB4NjgwMCwgMHhhMDA1LCAweDFkZTAsIDB4MmQwMCwgMHhhMDgwLCAweDAwMTMsIDB4MjAwNCwgMHhhMDg0LAorCTB4MDAwMywgMHhhMDg2LCAweDAwMDIsIDB4MTE4MCwgMHg2MDEwLCAweDIwNjgsIDB4Njg0YywgMHhjMGRjLAorCTB4YzBmNCwgMHg2ODRlLCAweDY4NTAsIDB4YzBmNCwgMHhjMGZjLCAweDY4NTIsIDB4MjAwOSwgMHgwMDQzLAorCTB4MDgwYywgMHhhYjU2LCAweDA4MDQsIDB4YjI2OSwgMHgyMDA5LCAweDAwNDEsIDB4MDgwNCwgMHhiMjYzLAorCTB4YTE4NiwgMHgwMDA1LCAweDE1ZjAsIDB4NjgxMCwgMHhhMDgwLCAweDAwMTMsIDB4MjAwNCwgMHhkMGJjLAorCTB4MTExOCwgMHgwMGRlLCAweDA4MDQsIDB4YjE3YSwgMHhkMGI0LCAweDAxMjgsIDB4ZDBmYywgMHgwOTBjLAorCTB4MTUxNSwgMHgwODA0LCAweGIxOTgsIDB4NjAwNywgMHgwMDNhLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLAorCTB4NmM4ZCwgMHgwODBjLCAweDcxNzMsIDB4MDBjNiwgMHgyZDYwLCAweDYxMDAsIDB4YTE4NiwgMHgwMDAyLAorCTB4MDEyMCwgMHhhMTg2LCAweDAwMDQsIDB4MTkwNCwgMHhiMjY5LCAweDIwNzEsIDB4YjgyMywgMHg3MDAwLAorCTB4YTA4NiwgMHgwMDAzLCAweDExMjgsIDB4NzAwNCwgMHhhYzA2LCAweDExMTAsIDB4NzAwMywgMHgwMDAwLAorCTB4NjgxMCwgMHhhMDgwLCAweDAwMTMsIDB4MjAwYywgMHhjMWY0LCAweGMxZGMsIDB4MjEwMiwgMHg4MDAwLAorCTB4MjAwYywgMHhjMWY0LCAweGMxZmMsIDB4YzFiYywgMHgyMTAyLCAweDIwMDksIDB4MDA0MiwgMHgwODA0LAorCTB4YjI2MywgMHgwMDM2LCAweDAwZDYsIDB4MDBkNiwgMHgwODBjLCAweDE1ZjgsIDB4MDAzZSwgMHgwOTBjLAorCTB4MTUxNSwgMHg2ODM3LCAweDAxMGQsIDB4NjgwMywgMHgwMDAwLCAweDY4M2IsIDB4MDAwMCwgMHg2ODViLAorCTB4MDAwMCwgMHg2YjVlLCAweDY4NTcsIDB4MDA0NSwgMHgyYzAwLCAweDY4NjIsIDB4NjAzNCwgMHg2ODcyLAorCTB4MjM2MCwgMHg2MDIwLCAweGMwZGQsIDB4NjAyMiwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LAorCTB4YTA4NCwgMHgwMGZmLCAweDgwMDcsIDB4NjM1MCwgMHg2YjRhLCAweDY4NDYsIDB4Njg0ZiwgMHgwMDAwLAorCTB4Njg1MywgMHgwMDAwLCAweDZkNmEsIDB4NmU2NiwgMHg2ODZmLCAweDAwMDEsIDB4MDgwYywgMHg1NDA4LAorCTB4MjAxOSwgMHgwMDQ1LCAweDYwMDgsIDB4MjA2OCwgMHgwODBjLCAweGFjZTAsIDB4MmQwMCwgMHg2MDBhLAorCTB4NjAxZiwgMHgwMDA2LCAweDYwMDMsIDB4MDAwNywgMHg2MDE3LCAweDAwMDAsIDB4NjAzZiwgMHgwMDAwLAorCTB4MDBkZSwgMHgwMDNlLCAweDAwMzgsIDB4NjAzZiwgMHgwMDAwLCAweDYwMDMsIDB4MDAwNywgMHgwODBjLAorCTB4YWI1NiwgMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwgMHhhMTg2LCAweDAwMTMsIDB4MTEyOCwgMHg2MDA0LAorCTB4YTA4MiwgMHgwMDg1LCAweDIwMDgsIDB4MDBjMiwgMHhhMTg2LCAweDAwMjcsIDB4MTE3OCwgMHgwODBjLAorCTB4NzA5MCwgMHgwMDM2LCAweDAwZDYsIDB4NjAxMCwgMHgyMDY4LCAweDIwMTksIDB4MDAwNCwgMHgwODBjLAorCTB4YjA5OSwgMHgwMGRlLCAweDAwM2UsIDB4MDgwYywgMHg3MTczLCAweDAwMDUsIDB4YTE4NiwgMHgwMDE0LAorCTB4MGQ3MCwgMHgwODBjLCAweDg2NjMsIDB4MDAwNSwgMHhiMjk1LCAweGIyOTMsIDB4YjI5MywgMHhiMjkzLAorCTB4YjI5MywgMHhiMjkzLCAweGIyOTUsIDB4MDgwYywgMHgxNTE1LCAweDA4MGMsIDB4NzA5MCwgMHg2MDAzLAorCTB4MDAwYywgMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHhhMTgyLCAweDAwOGMsIDB4MTIyMCwgMHhhMTgyLAorCTB4MDA4NSwgMHgwMjA4LCAweDAwMWEsIDB4MDgwYywgMHg4NjYzLCAweDAwMDUsIDB4YjJhZCwgMHhiMmFkLAorCTB4YjJhZCwgMHhiMmFkLCAweGIyYWYsIDB4YjJjZCwgMHhiMmFkLCAweDA4MGMsIDB4MTUxNSwgMHgwMGQ2LAorCTB4MmM2OCwgMHgwODBjLCAweDg1YzcsIDB4MDFhMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDFlLAorCTB4MjAwOSwgMHhiYjhlLCAweDIxMGMsIDB4NjEzNiwgMHgyMDA5LCAweGJiOGYsIDB4MjEwYywgMHg2MTNhLAorCTB4NjAwYiwgMHhmZmZmLCAweDY5MTgsIDB4NjExYSwgMHg2MDFmLCAweDAwMDQsIDB4MDgwYywgMHg2YzhkLAorCTB4MmQ2MCwgMHgwODBjLCAweDg2MWQsIDB4MDBkZSwgMHgwMDA1LCAweDA4MGMsIDB4ODYxZCwgMHgwMDA1LAorCTB4MDBlNiwgMHg2MDE4LCAweDIwNzAsIDB4NzAwMCwgMHhkMGVjLCAweDAwZWUsIDB4MDAwNSwgMHg2MDEwLAorCTB4YTA4YywgMHhmMDAwLCAweDA5MDQsIDB4YjMxYiwgMHhhMDgwLCAweDAwMTMsIDB4MjAwYywgMHhkMWVjLAorCTB4MDVkMCwgMHgyMDAxLCAweGI1NzIsIDB4MjAwNCwgMHhkMGVjLCAweDA1YTgsIDB4NjAwMywgMHgwMDAyLAorCTB4NjAyMCwgMHhjMGU1LCAweDYwMjIsIDB4ZDFhYywgMHgwMTgwLCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLAorCTB4NTMwMSwgMHgwMGZlLCAweDAxNTAsIDB4MjAwMSwgMHhiN2I4LCAweDIwMDQsIDB4NjAzZSwgMHgyMDA5LAorCTB4YjU3MiwgMHgyMTBjLCAweGQxZjQsIDB4MTFlOCwgMHgwMDgwLCAweDIwMDksIDB4YjU3MiwgMHgyMTBjLAorCTB4ZDFmNCwgMHgwMTI4LCAweDYwMjAsIDB4YzBlNCwgMHg2MDIyLCAweGEwMDYsIDB4MDBhMCwgMHgyMDAxLAorCTB4YjdiOCwgMHgyMDBjLCAweDgxMDMsIDB4YTEwMCwgMHg2MDNlLCAweDYwMTgsIDB4YTA4OCwgMHgwMDJiLAorCTB4MjEwNCwgMHhhMDA1LCAweDAxMTgsIDB4YTA4OCwgMHgwMDAzLCAweDBjZDAsIDB4MmMwYSwgMHg2MDBmLAorCTB4MDAwMCwgMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMDE2LCAweDAwYzYsIDB4MDBlNiwgMHg2MTUwLAorCTB4YTJmMCwgMHgwMDJiLCAweDJlMDQsIDB4MjA2MCwgMHg4Y2ZmLCAweDAxODAsIDB4ODRmZiwgMHgxMTE4LAorCTB4NjA1MCwgMHhhMTA2LCAweDExMzgsIDB4NjAwYywgMHgyMDcyLCAweDA4MGMsIDB4NmFlZiwgMHgwODBjLAorCTB4ODYxZCwgMHgwMDEwLCAweGFjZjAsIDB4MDAwMywgMHgyZTY0LCAweDBjNzAsIDB4MDBlZSwgMHgwMGNlLAorCTB4MDAxZSwgMHgwMDA1LCAweDAwZDYsIDB4NjAxOCwgMHhhMGU4LCAweDAwMmIsIDB4MmQwNCwgMHhhMDA1LAorCTB4MDE0MCwgMHhhYzA2LCAweDAxMjAsIDB4MmQwNCwgMHhhMGU4LCAweDAwMDMsIDB4MGNiOCwgMHg2MDBjLAorCTB4MjA2YSwgMHgwMGRlLCAweDAwMDUsIDB4MDAyNiwgMHgwMDM2LCAweDAxNTYsIDB4MjAxMSwgMHhiNTI4LAorCTB4MjIwNCwgMHhhMDg0LCAweDAwZmYsIDB4MjAxOSwgMHhiYjhlLCAweDIzMzQsIDB4YTYzNiwgMHgxMWQ4LAorCTB4ODMxOCwgMHgyMzM0LCAweDIyMDQsIDB4YTA4NCwgMHhmZjAwLCAweGE2MzYsIDB4MTFhMCwgMHgyMDExLAorCTB4YmI5MCwgMHg2MDE4LCAweGEwOTgsIDB4MDAwYSwgMHgyMGE5LCAweDAwMDQsIDB4MDgwYywgMHg5MGRhLAorCTB4MTE1MCwgMHgyMDExLCAweGJiOTQsIDB4NjAxOCwgMHhhMDk4LCAweDAwMDYsIDB4MjBhOSwgMHgwMDA0LAorCTB4MDgwYywgMHg5MGRhLCAweDExMDAsIDB4MDE1ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MjA3MSwgMHhiNTAwLCAweDA4MGMsIDB4NGJjNiwgMHgwODBjLCAweDJhYjgsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDBlNiwgMHg2MDE4LCAweDIwNzAsIDB4NzAwMCwgMHhkMGZjLCAweDAxMDgsIDB4MDAxMSwgMHgwMGVlLAorCTB4MDAwNSwgMHg2ODUwLCAweGMwZTUsIDB4Njg1MiwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMDc2LAorCTB4MDA2NiwgMHgwMDU2LCAweDAwNDYsIDB4MDAyNiwgMHgwMDE2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjAyOSwgMHhiN2U5LCAweDI1MmMsIDB4MjAyMSwgMHhiN2VmLCAweDI0MjQsIDB4MjA2MSwgMHhiZDAwLAorCTB4MjA3MSwgMHhiNTAwLCAweDc2NDgsIDB4NzA2OCwgMHhhNjA2LCAweDA1NzgsIDB4NjcxYywgMHhhNzg2LAorCTB4MDAwMSwgMHgwMTE4LCAweGE3ODYsIDB4MDAwOCwgMHgxNTAwLCAweDI1MDAsIDB4YWMwNiwgMHgwMWU4LAorCTB4MjQwMCwgMHhhYzA2LCAweDAxZDAsIDB4MDgwYywgMHhiMTEwLCAweDAxYjgsIDB4MDgwYywgMHhiMTIwLAorCTB4MTFhMCwgMHg2MDAwLCAweGEwODYsIDB4MDAwNCwgMHgxMTIwLCAweDAwMTYsIDB4MDgwYywgMHgxOTRkLAorCTB4MDAxZSwgMHgwODBjLCAweDllNDcsIDB4MTExMCwgMHgwODBjLCAweDJjYzIsIDB4MDgwYywgMHg5ZTU4LAorCTB4MTExMCwgMHgwODBjLCAweDhjMTksIDB4MDgwYywgMHg5ZTFkLCAweGFjZTAsIDB4MDAxOCwgMHgyMDAxLAorCTB4YjUxNywgMHgyMDA0LCAweGFjMDIsIDB4MTIwOCwgMHgwODU4LCAweDAxMmUsIDB4MDAxZSwgMHgwMDJlLAorCTB4MDA0ZSwgMHgwMDVlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHgwMTI2LAorCTB4MDAwNiwgMHgwMGU2LCAweDAwMTYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YjU0MCwgMHhkNWE0LAorCTB4MDExOCwgMHg3MDM0LCAweDgwMDAsIDB4NzAzNiwgMHhkNWI0LCAweDAxMTgsIDB4NzAzMCwgMHg4MDAwLAorCTB4NzAzMiwgMHhkNWFjLCAweDAxNzgsIDB4MjUwMCwgMHhhMDg0LCAweDAwMDcsIDB4YTA4ZSwgMHgwMDAzLAorCTB4MDE0OCwgMHhhMDhlLCAweDAwMDQsIDB4MDEzMCwgMHhhMDhlLCAweDAwMDUsIDB4MDExOCwgMHgyMDcxLAorCTB4YjU0YSwgMHgwNGM5LCAweDAwMWUsIDB4MDBlZSwgMHgwMDBlLCAweDAxMmUsIDB4MDAwNSwgMHgwMTI2LAorCTB4MDAwNiwgMHgwMGU2LCAweDAwMTYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YjU0MCwgMHhkNWE0LAorCTB4MDExOCwgMHg3MDM0LCAweDgwMDAsIDB4NzAzNiwgMHhkNWI0LCAweDAxMTgsIDB4NzAzMCwgMHg4MDAwLAorCTB4NzAzMiwgMHhkNWFjLCAweDAxNzgsIDB4MjUwMCwgMHhhMDg0LCAweDAwMDcsIDB4YTA4ZSwgMHgwMDAzLAorCTB4MDE0OCwgMHhhMDhlLCAweDAwMDQsIDB4MDEzMCwgMHhhMDhlLCAweDAwMDUsIDB4MDExOCwgMHgyMDcxLAorCTB4YjU0YSwgMHgwMDg5LCAweDAwMWUsIDB4MDBlZSwgMHgwMDBlLCAweDAxMmUsIDB4MDAwNSwgMHgwMTI2LAorCTB4MDAwNiwgMHgwMGU2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGI1NDIsIDB4MDAyMSwgMHgwMGVlLAorCTB4MDAwZSwgMHgwMTJlLCAweDAwMDUsIDB4MmUwNCwgMHg4MDAwLCAweDIwNzIsIDB4MTIyMCwgMHg4ZTcwLAorCTB4MmUwNCwgMHg4MDAwLCAweDIwNzIsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4YjU0MCwgMHgwYzk5LAorCTB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhiNTQ0LCAweDBjNjksIDB4MDBlZSwgMHgwMDA1LAorCTB4MDEyNiwgMHgwMDA2LCAweDAwZTYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YjU0MCwgMHg3MDQ0LAorCTB4ODAwMCwgMHg3MDQ2LCAweDAwZWUsIDB4MDAwZSwgMHgwMTJlLCAweDAwMDUsIDB4MDAwMSwgMHgwMDAyLAorCTB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsIDB4MDEwMCwgMHgwMjAwLAorCTB4MDQwMCwgMHgwODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwLCAweDgwMDAsIDB4MjQ0MAorfTsKKyNpZmRlZiBVTklRVUVfRldfTkFNRQordW5zaWduZWQgc2hvcnQgZncyMjAwdHBfbGVuZ3RoMDEgPSAweGE0NmY7CisjZWxzZQordW5zaWduZWQgc2hvcnQgcmlzY19jb2RlX2xlbmd0aDAxID0gMHhhNDZmOworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsMjMwMC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWwyMzAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5ODhjZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsMjMwMC5jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogUUxvZ2ljIElTUDIzMDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi42LngKKyAqIENvcHlyaWdodCAoQykgMjAwMyBDaHJpc3RvcGggSGVsbHdpZy4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFFMb2dpYyBDb3Jwb3JhdGlvbiAod3d3LnFsb2dpYy5jb20pCisgKgorICogUmVsZWFzZWQgdW5kZXIgR1BMIHYyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlICJxbGFfZGVmLmgiCisKK3N0YXRpYyBjaGFyIHFsYV9kcml2ZXJfbmFtZVtdID0gInFsYTIzMDAiOworCitleHRlcm4gdW5zaWduZWQgY2hhciAgZncyMzAwaXB4X3ZlcnNpb25bXTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyICBmdzIzMDBpcHhfdmVyc2lvbl9zdHJbXTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBmdzIzMDBpcHhfYWRkcjAxOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGZ3MjMwMGlweF9jb2RlMDFbXTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBmdzIzMDBpcHhfbGVuZ3RoMDE7CisKK3N0YXRpYyBzdHJ1Y3QgcWxhX2Z3X2luZm8gcWxhX2Z3X3RibFtdID0geworCXsKKwkJLmFkZHJlc3NpbmcJPSBGV19JTkZPX0FERFJfTk9STUFMLAorCQkuZndjb2RlCQk9ICZmdzIzMDBpcHhfY29kZTAxWzBdLAorCQkuZndsZW4JCT0gJmZ3MjMwMGlweF9sZW5ndGgwMSwKKwkJLmZ3c3RhcnQJPSAmZncyMzAwaXB4X2FkZHIwMSwKKwl9LAorCXsgRldfSU5GT19BRERSX05PTU9SRSwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcWxhX2JvYXJkX2luZm8gcWxhX2JvYXJkX3RibFtdID0geworCXsKKwkJLmRydl9uYW1lCT0gcWxhX2RyaXZlcl9uYW1lLAorCQkuaXNwX25hbWUJPSAiSVNQMjMwMCIsCisJCS5md19pbmZvCT0gcWxhX2Z3X3RibCwKKwl9LAorCXsKKwkJLmRydl9uYW1lCT0gcWxhX2RyaXZlcl9uYW1lLAorCQkuaXNwX25hbWUJPSAiSVNQMjMxMiIsCisJCS5md19pbmZvCT0gcWxhX2Z3X3RibCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHFsYTIzMDBfcGNpX3RibFtdID0geworCXsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX1FMT0dJQywKKwkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMzAwLAorCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YQk9ICh1bnNpZ25lZCBsb25nKSZxbGFfYm9hcmRfdGJsWzBdLAorCX0sCisJeworCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfUUxPR0lDLAorCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIzMTIsCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhCT0gKHVuc2lnbmVkIGxvbmcpJnFsYV9ib2FyZF90YmxbMV0sCisJfSwKKwl7MCwgMH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHFsYTIzMDBfcGNpX3RibCk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitxbGEyMzAwX3Byb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBxbGEyeDAwX3Byb2JlX29uZShwZGV2LAorCSAgICAoc3RydWN0IHFsYV9ib2FyZF9pbmZvICopaWQtPmRyaXZlcl9kYXRhKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0CitxbGEyMzAwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcWxhMngwMF9yZW1vdmVfb25lKHBkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcWxhMjMwMF9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJxbGEyMzAwIiwKKwkuaWRfdGFibGUJPSBxbGEyMzAwX3BjaV90YmwsCisJLnByb2JlCQk9IHFsYTIzMDBfcHJvYmVfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocWxhMjMwMF9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitxbGEyMzAwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZxbGEyMzAwX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3FsYTIzMDBfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcWxhMjMwMF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocWxhMjMwMF9pbml0KTsKK21vZHVsZV9leGl0KHFsYTIzMDBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlFMb2dpYyBDb3Jwb3JhdGlvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJRTG9naWMgSVNQMjN4eCBGQy1TQ1NJIEhvc3QgQnVzIEFkYXB0ZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihRTEEyWFhYX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWwyMzAwX2Z3LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDIzMDBfZncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWYwNmJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWwyMzAwX2Z3LmMKQEAgLTAsMCArMSw3NTkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIFFMT0dJQyBMSU5VWCBTT0ZUV0FSRQorICoKKyAqIFFMb2dpYyBJU1AyeDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUUxvZ2ljIENvcnBvcmF0aW9uCisgKiAod3d3LnFsb2dpYy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglGaXJtd2FyZSBWZXJzaW9uIDMuMDMuMDggKDEwOjAyIE5vdiAxMiwgMjAwNCkKKyAqLworCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3Vuc2lnbmVkIHNob3J0IGZ3MjMwMGlweF92ZXJzaW9uID0gMyoxMDI0KzM7CisjZWxzZQordW5zaWduZWQgc2hvcnQgcmlzY19jb2RlX3ZlcnNpb24gPSAzKjEwMjQrMzsKKyNlbmRpZgorCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3Vuc2lnbmVkIGNoYXIgZncyMzAwaXB4X3ZlcnNpb25fc3RyW10gPSB7MywgMywgOH07CisjZWxzZQordW5zaWduZWQgY2hhciBmaXJtd2FyZV92ZXJzaW9uW10gPSB7MywgMywgOH07CisjZW5kaWYKKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCisjZGVmaW5lIGZ3MjMwMGlweF9WRVJTSU9OX1NUUklORyAiMy4wMy4wOCIKKyNlbHNlCisjZGVmaW5lIEZXX1ZFUlNJT05fU1RSSU5HICIzLjAzLjA4IgorI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQordW5zaWduZWQgc2hvcnQgZncyMzAwaXB4X2FkZHIwMSA9IDB4MDgwMCA7CisjZWxzZQordW5zaWduZWQgc2hvcnQgcmlzY19jb2RlX2FkZHIwMSA9IDB4MDgwMCA7CisjZW5kaWYKKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCit1bnNpZ25lZCBzaG9ydCBmdzIzMDBpcHhfY29kZTAxW10gPSB7IAorI2Vsc2UKK3Vuc2lnbmVkIHNob3J0IHJpc2NfY29kZTAxW10gPSB7IAorI2VuZGlmCisJMHgwNDcwLCAweDAwMDAsIDB4MDAwMCwgMHhlYjU3LCAweDAwMDAsIDB4MDAwMywgMHgwMDAzLCAweDAwMDgsCisJMHgwMTM3LCAweDIwNDMsIDB4NGY1MCwgMHg1OTUyLCAweDQ5NDcsIDB4NDg1NCwgMHgyMDMyLCAweDMwMzAsCisJMHgzMTIwLCAweDUxNGMsIDB4NGY0NywgMHg0OTQzLCAweDIwNDMsIDB4NGY1MiwgMHg1MDRmLCAweDUyNDEsCisJMHg1NDQ5LCAweDRmNGUsIDB4MjA0OSwgMHg1MzUwLCAweDMyMzMsIDB4MzAzMCwgMHgyMDQ2LCAweDY5NzIsCisJMHg2ZDc3LCAweDYxNzIsIDB4NjUyMCwgMHgyMDU2LCAweDY1NzIsIDB4NzM2OSwgMHg2ZjZlLCAweDIwMzAsCisJMHgzMzJlLCAweDMwMzMsIDB4MmUzMCwgMHgzODIwLCAweDIwMjAsIDB4MjAyMCwgMHgyNDAwLCAweDIwYTksCisJMHgwMDBmLCAweDIwMDEsIDB4MDAwMCwgMHg0MDBmLCAweDIwOTEsIDB4MjIwMCwgMHgyMGE5LCAweDAwMGYsCisJMHgyMDAxLCAweDAwMDAsIDB4NDAwZiwgMHgyMDkxLCAweDI0MDAsIDB4MjBhOSwgMHgwMDBmLCAweDIwMDEsCisJMHgwMDAwLCAweDQwMGYsIDB4MjA5MSwgMHgyNjAwLCAweDIwYTksIDB4MDAwZiwgMHgyMDAxLCAweDAwMDAsCisJMHg0MDBmLCAweDIwOTEsIDB4MjgwMCwgMHgyMGE5LCAweDAwMGYsIDB4MjAwMSwgMHgwMDAwLCAweDQwMGYsCisJMHgyMDkxLCAweDJhMDAsIDB4MjBhOSwgMHgwMDBmLCAweDIwMDEsIDB4MDAwMCwgMHg0MDBmLCAweDIwOTEsCisJMHgyYzAwLCAweDIwYTksIDB4MDAwZiwgMHgyMDAxLCAweDAwMDAsIDB4NDAwZiwgMHgyMDkxLCAweDJlMDAsCisJMHgyMGE5LCAweDAwMGYsIDB4MjAwMSwgMHgwMDAwLCAweDQwMGYsIDB4MjA5MSwgMHgyMDAwLCAweDIwMDEsCisJMHgwMDAwLCAweDIwYzEsIDB4MDAwNCwgMHgyMGM5LCAweDFiZmYsIDB4MjA1OSwgMHgwMDAwLCAweDJiNzgsCisJMHg3ODgzLCAweDAwMDQsIDB4MjA4OSwgMHgyZDg4LCAweDIwNTEsIDB4MTgwMCwgMHgyYTcwLCAweDIwZTEsCisJMHgwMDAxLCAweDIwZTksIDB4MDAwMSwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHgwZTUxLCAweDIwMjksCisJMHg0ZDAwLCAweDIwMzEsIDB4ZmZmZiwgMHgyMDM5LCAweDRjZDAsIDB4MjAyMSwgMHgwMjAwLCAweDIwZTksCisJMHgwMDAxLCAweDIwYTEsIDB4MDAwMCwgMHgyMGE5LCAweDA4MDAsIDB4OTAwZSwgMHg0MTA0LCAweDIwZTksCisJMHgwMDAxLCAweDIwYTEsIDB4MTAwMCwgMHg5MDBlLCAweDIwMDEsIDB4MGNjMCwgMHg5MDg0LCAweDBmZmYsCisJMHgyMGE4LCAweDQxMDQsIDB4MjAwMSwgMHgwMDAwLCAweDkwODYsIDB4MDAwMCwgMHgwMTIwLCAweDIxYTgsCisJMHg0MTA0LCAweDgwMDEsIDB4MWRlMCwgMHg3NTZlLCAweDc2NzIsIDB4Nzc2YSwgMHg3NDc2LCAweDc0N2EsCisJMHgwMGU2LCAweDIwNzEsIDB4MWFjYSwgMHgyNDcyLCAweDAwZWUsIDB4MjBhMSwgMHgxY2QwLCAweDcxNzAsCisJMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwgMHg4MTBkLCAweDkxOGMsIDB4MDAwZiwgMHgyMDAxLCAweDAwMDEsCisJMHg5MTEyLCAweDkwMGUsIDB4MjFhOCwgMHg0MTA0LCAweDgyMTEsIDB4MWRlMCwgMHg3MTcwLCAweDM0MDAsCisJMHg4MDAxLCAweDkxMDIsIDB4MDEyMCwgMHgwMjE4LCAweDIwYTgsIDB4OTAwZSwgMHg0MTA0LCAweDIwMDksCisJMHgxODAwLCAweDgxMGQsIDB4ODEwZCwgMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwgMHg5MThjLCAweDAwMWYsCisJMHgyMDAxLCAweDAwMDEsIDB4OTExMiwgMHgyMGU5LCAweDAwMDEsIDB4MjBhMSwgMHgwODAwLCAweDkwMGUsCisJMHgyMGE5LCAweDA4MDAsIDB4NDEwNCwgMHg4MjExLCAweDFkZDgsIDB4MDgwYywgMHgwZjE3LCAweDA4MGMsCisJMHg2MGJiLCAweDA4MGMsIDB4YWVkOSwgMHgwODBjLCAweDEwY2UsIDB4MDgwYywgMHgxMmVkLCAweDA4MGMsCisJMHgxYmUyLCAweDA4MGMsIDB4MGQ2OSwgMHgwODBjLCAweDEwNTMsIDB4MDgwYywgMHgzNDg0LCAweDA4MGMsCisJMHg3NzM4LCAweDA4MGMsIDB4NmEzMCwgMHgwODBjLCAweDg3YjMsIDB4MDgwYywgMHg4NGU3LCAweDA4MGMsCisJMHgyNGI2LCAweDA4MGMsIDB4OTA1NywgMHgwODBjLCAweDdlMDMsIDB4MDgwYywgMHgyMmVmLCAweDA4MGMsCisJMHgyNDIzLCAweDA4MGMsIDB4MjRhYiwgMHgyMDkxLCAweDMwMDksIDB4Nzg4MywgMHgwMDAwLCAweDEwMDQsCisJMHgwOTFmLCAweDc4ODAsIDB4OTA4NiwgMHgwMDAyLCAweDExOTAsIDB4Nzg4MywgMHg0MDAwLCAweDc4MzcsCisJMHg0MDAwLCAweDc4MzMsIDB4MDAxMCwgMHgwZTA0LCAweDA5MTMsIDB4MjA5MSwgMHg1MDAwLCAweDIwOTEsCisJMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMTliLCAweDIwNzEsCisJMHgxODAwLCAweDcwMDMsIDB4MDAwMCwgMHgyMDcxLCAweDE4MDAsIDB4NzAwMCwgMHg5MDhlLCAweDAwMDMsCisJMHgxMTc4LCAweDA4MGMsIDB4NGM0NCwgMHgwODBjLCAweDM0YWIsIDB4MDgwYywgMHg3N2E5LCAweDA4MGMsCisJMHg2ZjYxLCAweDA4MGMsIDB4ODg5NiwgMHgwODBjLCAweDg1MTAsIDB4MDgwYywgMHgyY2YyLCAweDBjNTgsCisJMHgwMDBiLCAweDBjNzgsIDB4MDk0NCwgMHgwOTQ1LCAweDBhZTcsIDB4MDk0MiwgMHgwYmFlLCAweDBkNjgsCisJMHgwZDY4LCAweDBkNjgsIDB4MDgwYywgMHgwZGQ1LCAweDAwMDUsIDB4MDEyNiwgMHgwMGY2LCAweDIwOTEsCisJMHg4MDAwLCAweDcwMDAsIDB4OTA4NiwgMHgwMDAxLCAweDE5MDQsIDB4MGFiYSwgMHgwODBjLCAweDU3NmMsCisJMHgxMTMwLCAweDAwMjYsIDB4MjAxMSwgMHgwMDgwLCAweDA4MGMsIDB4MGVkZiwgMHgwMDJlLCAweDA4MGMsCisJMHg3NDNlLCAweDAxNTAsIDB4MDgwYywgMHg3NDYxLCAweDE1YTAsIDB4MjA3OSwgMHgwMTAwLCAweDc4MjgsCisJMHg5MDg1LCAweDE4MDAsIDB4NzgyYSwgMHgwNDY4LCAweDA4MGMsIDB4NzM2YSwgMHg3MDAwLCAweDkwODYsCisJMHgwMDAxLCAweDE5MDQsIDB4MGFiYSwgMHg3MDk4LCAweDkwODYsIDB4MDAyOCwgMHgxOTA0LCAweDBhYmEsCisJMHgwODBjLCAweDg0ZDAsIDB4MDgwYywgMHg4NGMyLCAweDIwMDEsIDB4MDE2MSwgMHgyMDAzLCAweDAwMDEsCisJMHgyMDc5LCAweDAxMDAsIDB4NzgyNywgMHhmZmZmLCAweDdhMjgsIDB4OTI5NSwgMHg1ZTJmLCAweDdhMmEsCisJMHgyMDExLCAweDcyY2UsIDB4MDgwYywgMHg4NWIwLCAweDIwMTEsIDB4NzJjMSwgMHgwODBjLCAweDg2OGEsCisJMHgyMDExLCAweDVmMTYsIDB4MDgwYywgMHg4NWIwLCAweDIwMTEsIDB4ODAzMCwgMHg5MDFlLCAweDczOTYsCisJMHgwNGQwLCAweDA4MGMsIDB4NTdjMywgMHgyMDc5LCAweDAxMDAsIDB4Nzg0NCwgMHg5MDA1LCAweDE5MDQsCisJMHgwYWJhLCAweDIwMTEsIDB4NWYxNiwgMHgwODBjLCAweDg1YjAsIDB4MjAxMSwgMHg3MmNlLCAweDA4MGMsCisJMHg4NWIwLCAweDIwMTEsIDB4NzJjMSwgMHgwODBjLCAweDg2OGEsIDB4MjAwMSwgMHgwMjY1LCAweDIwMDEsCisJMHgwMjA1LCAweDIwMDMsIDB4MDAwMCwgMHg3ODQwLCAweDkwODQsIDB4ZmZmYiwgMHg3ODQyLCAweDIwMDEsCisJMHgxOWE1LCAweDIwMDQsIDB4OTAwNSwgMHgxMTQwLCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDA4MGMsCisJMHg2MDYzLCAweDAwY2UsIDB4MDgwNCwgMHgwYWJhLCAweDc4MGYsIDB4MDA2YiwgMHg3YTI4LCAweDA4MGMsCisJMHg3NDQ2LCAweDAxMTgsIDB4OTI5NSwgMHg1ZTJmLCAweDAwMTAsIDB4OTI5NSwgMHg0MDJmLCAweDdhMmEsCisJMHgyMDExLCAweDgwMTAsIDB4NzNkOCwgMHgyMDAxLCAweDE5YTYsIDB4MjAwMywgMHgwMDAxLCAweDA4MGMsCisJMHgyYjk3LCAweDA4MGMsIDB4NGI3ZiwgMHg3MjQ4LCAweGMyODQsIDB4NzI0YSwgMHgyMDAxLCAweDE4MGMsCisJMHgyMDBjLCAweGMxYWMsIDB4YzFjYywgMHgyMTAyLCAweDA4MGMsIDB4YTYxMywgMHgyMDExLCAweDAwMDQsCisJMHgwODBjLCAweGNjOTYsIDB4MDgwYywgMHg2OGJjLCAweDA4MGMsIDB4NzQzZSwgMHgxMTIwLCAweDA4MGMsCisJMHgyYmRiLCAweDAyZTAsIDB4MDQwMCwgMHgwODBjLCAweDYwNmEsIDB4MDE0MCwgMHg3MDk3LCAweDAwMDEsCisJMHg3MGQzLCAweDAwMDAsIDB4MDgwYywgMHg1OTkwLCAweDA4MDQsIDB4MGFiYSwgMHgwODBjLCAweDU3NWQsCisJMHhkMDk0LCAweDAxODgsIDB4MjAxMSwgMHgxODBjLCAweDIyMDQsIDB4YzBjZCwgMHgyMDEyLCAweDA4MGMsCisJMHg1NzYxLCAweGQwZDQsIDB4MTExOCwgMHgwODBjLCAweDJiZGIsIDB4MTI3MCwgMHgyMDExLCAweDE4MGMsCisJMHgyMjA0LCAweGMwYmMsIDB4MDBhOCwgMHgwODBjLCAweDU3NjEsIDB4ZDBkNCwgMHgxZGI4LCAweDIwMTEsCisJMHgxODBjLCAweDIyMDQsIDB4YzBiZCwgMHgwMDYwLCAweDIwMTEsIDB4MTgwYywgMHgyMjA0LCAweGMwYmQsCisJMHgyMDEyLCAweDA4MGMsIDB4NmEwNCwgMHgxMTI4LCAweGQwYTQsIDB4MDExOCwgMHgyMjA0LCAweGMwZmQsCisJMHgyMDEyLCAweDA4MGMsIDB4NjljYSwgMHgwMTIwLCAweDdhMGMsIDB4YzJiNCwgMHg3YTBlLCAweDAwYTgsCisJMHg3MDdmLCAweDAwMDAsIDB4MDgwYywgMHg3NDNlLCAweDExMzAsIDB4NzBiMCwgMHg5MDA1LCAweDExNjgsCisJMHgwODBjLCAweGQwZDksIDB4MDA1MCwgMHgwODBjLCAweGQwZDksIDB4NzBkYywgMHhkMDljLCAweDExMjgsCisJMHg3MGIwLCAweDkwMDUsIDB4MDExMCwgMHgwODBjLCAweDYwNDAsIDB4NzBlNywgMHgwMDAwLCAweDcwZTMsCisJMHgwMDAwLCAweDcwYTcsIDB4MDAwMCwgMHgwODBjLCAweDJiZTMsIDB4MDIyOCwgMHgyMDExLCAweDAxMDEsCisJMHgyMjA0LCAweGMwYzQsIDB4MjAxMiwgMHg3MmRjLCAweDA4MGMsIDB4NzQzZSwgMHgxMTc4LCAweDkwMTYsCisJMHgwMDE2LCAweDA4MGMsIDB4Mjk5NCwgMHgyMDE5LCAweDE5NmMsIDB4MjExYSwgMHgwMDFlLCAweDcwNWYsCisJMHhmZmZmLCAweDcwNjMsIDB4MDBlZiwgMHg3MDgzLCAweDAwMDAsIDB4MDAyMCwgMHgyMDE5LCAweDE5NmMsCisJMHgyMDFiLCAweDAwMDAsIDB4MjA3OSwgMHgxODQ3LCAweDc4MDQsIDB4ZDBhYywgMHgwMTA4LCAweGMyOTUsCisJMHg3MmRlLCAweDA4MGMsIDB4NzQzZSwgMHgwMTE4LCAweDkyOTYsIDB4MDAwNCwgMHgwNTQ4LCAweDIwMTEsCisJMHgwMDAxLCAweDA4MGMsIDB4Y2M5NiwgMHg3MGFiLCAweDAwMDAsIDB4NzBhZiwgMHhmZmZmLCAweDcwMDMsCisJMHgwMDAyLCAweDIwNzksIDB4MDEwMCwgMHg3ODI3LCAweDAwMDMsIDB4NzgyOCwgMHg5MDg1LCAweDAwMDMsCisJMHg3ODJhLCAweDAwZmUsIDB4MDgwYywgMHgyZmY1LCAweDIwMTEsIDB4MDAwNSwgMHgwODBjLCAweGE3MjIsCisJMHgwODBjLCAweDk3NjMsIDB4MDgwYywgMHg3NDNlLCAweDAxNDgsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsCisJMHgwMDE2LCAweDA4MGMsIDB4Mjk5NCwgMHg2MWUyLCAweDAwMWUsIDB4MDBjZSwgMHgwMTJlLCAweDA0MjAsCisJMHg3MGFiLCAweDAwMDAsIDB4NzBhZiwgMHhmZmZmLCAweDcwMDMsIDB4MDAwMiwgMHgwMGY2LCAweDIwNzksCisJMHgwMTAwLCAweDc4MjcsIDB4MDAwMywgMHg3ODI4LCAweDkwODUsIDB4MDAwMywgMHg3ODJhLCAweDAwZmUsCisJMHgyMDExLCAweDAwMDUsIDB4MDgwYywgMHhhNzIyLCAweDA4MGMsIDB4OTc2MywgMHgwODBjLCAweDc0M2UsCisJMHgwMTQ4LCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDAwMTYsIDB4MDgwYywgMHgyOTk0LCAweDYxZTIsCisJMHgwMDFlLCAweDAwY2UsIDB4MDBmZSwgMHgwMTJlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGI2LCAweDA4MGMsCisJMHg3NDNlLCAweDExMTgsIDB4MjBhOSwgMHgwODAwLCAweDAwMTAsIDB4MjBhOSwgMHgwNzgyLCAweDA4MGMsCisJMHg3NDNlLCAweDExMTAsIDB4OTAwZSwgMHgwMDEwLCAweDIwMDksIDB4MDA3ZSwgMHg4NmZmLCAweDAxMzgsCisJMHg5MTgwLCAweDEwMDAsIDB4MjAwNCwgMHg5MDVkLCAweDAxMTAsIDB4YjgwMCwgMHhkMGJjLCAweDA5MGMsCisJMHgzMzFhLCAweDgxMDgsIDB4MWYwNCwgMHgwYWNlLCAweDcwN2YsIDB4MDAwMCwgMHg3MDgwLCAweDkwODQsCisJMHgwMGZmLCAweDcwODIsIDB4NzBiMywgMHgwMDAwLCAweDAwYmUsIDB4MDBjZSwgMHgwMDA1LCAweDAwYjYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDAwLCAweDkwODYsIDB4MDAwMiwgMHgxOTA0LCAweDBiYWIsCisJMHg3MGFjLCAweDkwODYsIDB4ZmZmZiwgMHgwMTMwLCAweDA4MGMsIDB4MmZmNSwgMHgwODBjLCAweDk3NjMsCisJMHgwODA0LCAweDBiYWIsIDB4NzBkYywgMHhkMGFjLCAweDExMTAsIDB4ZDA5YywgMHgwNTU4LCAweGQwODQsCisJMHgwNTQ4LCAweDAwMDYsIDB4MjAwMSwgMHgwMTAzLCAweDIwMDMsIDB4MDAyYiwgMHgwMDBlLCAweGQwOGMsCisJMHgwNTA4LCAweDA4MGMsIDB4MzM3ZCwgMHgxMWQwLCAweDcwZTAsIDB4OTA4NiwgMHhmZmZmLCAweDAxYjAsCisJMHgwODBjLCAweDMxOGEsIDB4MDgwYywgMHg5NzYzLCAweDcwZGMsIDB4ZDA5NCwgMHgxOTA0LCAweDBiYWIsCisJMHgyMDExLCAweDAwMDEsIDB4MDgwYywgMHhkMzg4LCAweDAxMTAsIDB4MjAxMSwgMHgwMDAzLCAweDkwMWUsCisJMHgwODBjLCAweDMxYzQsIDB4MDgwYywgMHg5NzYzLCAweDA4MDQsIDB4MGJhYiwgMHg3MGU0LCAweDkwMDUsCisJMHgxOTA0LCAweDBiYWIsIDB4NzBhOCwgMHg5MDA1LCAweDE5MDQsIDB4MGJhYiwgMHg3MGRjLCAweGQwYTQsCisJMHgwMTE4LCAweGQwYjQsIDB4MDkwNCwgMHgwYmFiLCAweDA4MGMsIDB4NjljYSwgMHgxOTA0LCAweDBiYWIsCisJMHgwODBjLCAweDZhMWQsIDB4MTkwNCwgMHgwYmFiLCAweDA4MGMsIDB4NmEwNCwgMHgwMWMwLCAweDAxNTYsCisJMHgwMGM2LCAweDIwYTksIDB4MDA3ZiwgMHg5MDBlLCAweDAwMTYsIDB4MDgwYywgMHg2Njk5LCAweDExMTgsCisJMHhiODAwLCAweGQwZWMsIDB4MTEzOCwgMHgwMDFlLCAweDgxMDgsIDB4MWYwNCwgMHgwYjQ0LCAweDAwY2UsCisJMHgwMTVlLCAweDAwMjgsIDB4MDAxZSwgMHgwMGNlLCAweDAxNWUsIDB4MDgwNCwgMHgwYmFiLCAweDAwMDYsCisJMHgyMDAxLCAweDAxMDMsIDB4MjAwMywgMHgwMDJiLCAweDAwMGUsIDB4MjAxMSwgMHgxOWIyLCAweDA4MGMsCisJMHgwZjg3LCAweDIwMTEsIDB4MTljYywgMHgwODBjLCAweDBmODcsIDB4NzAzMCwgMHhjMDhjLCAweDcwMzIsCisJMHg3MDAzLCAweDAwMDMsIDB4NzBhZiwgMHhmZmZmLCAweDA4MGMsIDB4NTc2YywgMHgxMTMwLCAweDAwMjYsCisJMHgyMDExLCAweDAwNDAsIDB4MDgwYywgMHgwZWRmLCAweDAwMmUsIDB4OTAwNiwgMHgwODBjLCAweDI4MjgsCisJMHgwODBjLCAweDMzN2QsIDB4MDExOCwgMHgwODBjLCAweDRkMWMsIDB4MDA1MCwgMHgwMDM2LCAweDAwNDYsCisJMHgyMDE5LCAweGZmZmYsIDB4MjAyMSwgMHgwMDA2LCAweDA4MGMsIDB4NGQzNiwgMHgwMDRlLCAweDAwM2UsCisJMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHgwODBjLCAweDc0NjEsIDB4MDE1MCwgMHgwODBjLCAweDc0M2UsCisJMHg3ODI4LCAweDAxMTgsIDB4OTA4NCwgMHhlMWZmLCAweDAwMTAsIDB4OTA4NCwgMHhmZmRmLCAweDc4MmEsCisJMHgwMGZlLCAweDIwMDEsIDB4MTllNywgMHgyMDA0LCAweDkwODYsIDB4MDAwNSwgMHgxMTIwLCAweDIwMTEsCisJMHgwMDAwLCAweDA4MGMsIDB4YTcyMiwgMHgyMDExLCAweDAwMDAsIDB4MDgwYywgMHhhNzJjLCAweDA4MGMsCisJMHg5NzYzLCAweDA4MGMsIDB4OTg5MSwgMHgwMTJlLCAweDAwYmUsIDB4MDAwNSwgMHgwMDE2LCAweDAwNDYsCisJMHgwMGY2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzksIDB4MDEwMCwgMHg3OTA0LCAweDkxOGMsCisJMHhmZmZkLCAweDc5MDYsIDB4MjAwOSwgMHgwMGY3LCAweDA4MGMsIDB4NjAyOSwgMHg3OTQwLCAweDkxOGMsCisJMHgwMDEwLCAweDc5NDIsIDB4NzkyNCwgMHhkMWI0LCAweDAxMTAsIDB4NzgyNywgMHgwMDQwLCAweGQxOWMsCisJMHgwMTEwLCAweDc4MjcsIDB4MDAwOCwgMHgwMDA2LCAweDAwMzYsIDB4MDE1NiwgMHg3OTU0LCAweGQxYWMsCisJMHgxOTA0LCAweDBjM2IsIDB4MjAwMSwgMHgxOWE2LCAweDIwMDQsIDB4OTAwNSwgMHgxNTE4LCAweDA4MGMsCisJMHgyYzVlLCAweDExNDgsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MmJjNiwgMHgyMDAxLCAweDAwMDEsCisJMHgwODBjLCAweDJiYTksIDB4MDBiOCwgMHgwODBjLCAweDJjNjYsIDB4MTEzOCwgMHg5MDA2LCAweDA4MGMsCisJMHgyYmM2LCAweDkwMDYsIDB4MDgwYywgMHgyYmE5LCAweDAwNjgsIDB4MDgwYywgMHgyYzZlLCAweDFkNTAsCisJMHgyMDAxLCAweDE5OTcsIDB4MjAwNCwgMHhkMGZjLCAweDAxMDgsIDB4MDAyMCwgMHgwODBjLCAweDI5YzAsCisJMHgwODA0LCAweDBkMWEsIDB4MDgwYywgMHg3NDRmLCAweDAxNDgsIDB4MDgwYywgMHg3NDYxLCAweDExMTgsCisJMHgwODBjLCAweDc3MzMsIDB4MDA1MCwgMHgwODBjLCAweDc0NDYsIDB4MGRkMCwgMHgwODBjLCAweDc3MmUsCisJMHgwODBjLCAweDc3MjQsIDB4MDgwYywgMHg3MzZhLCAweDAwNTgsIDB4MDgwYywgMHg3NDNlLCAweDAxNDAsCisJMHgyMDA5LCAweDAwZjgsIDB4MDgwYywgMHg2MDI5LCAweDc4NDMsIDB4MDA5MCwgMHg3ODQzLCAweDAwMTAsCisJMHgyMGE5LCAweDA5YzQsIDB4NzgyMCwgMHhkMDljLCAweDExMzgsIDB4MDgwYywgMHg3NDNlLCAweDAxMzgsCisJMHg3ODI0LCAweGQwYWMsIDB4MTkwNCwgMHgwZDFmLCAweDFmMDQsIDB4MGMxYSwgMHgwMDcwLCAweDc4MjQsCisJMHgwODBjLCAweDc0NTgsIDB4MDExOCwgMHhkMGFjLCAweDE5MDQsIDB4MGQxZiwgMHg5MDg0LCAweDE4MDAsCisJMHgwZDk4LCAweDcwMDMsIDB4MDAwMSwgMHgwODA0LCAweDBkMWYsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsCisJMHgyODI4LCAweDA4MDQsIDB4MGQzMiwgMHgyMDAxLCAweDE5YTYsIDB4MjAwNCwgMHg5MDA1LCAweDE1MTgsCisJMHgwODBjLCAweDJjNWUsIDB4MTE0OCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyYmM2LCAweDIwMDEsCisJMHgwMDAxLCAweDA4MGMsIDB4MmJhOSwgMHgwMGI4LCAweDA4MGMsIDB4MmM2NiwgMHgxMTM4LCAweDkwMDYsCisJMHgwODBjLCAweDJiYzYsIDB4OTAwNiwgMHgwODBjLCAweDJiYTksIDB4MDA2OCwgMHgwODBjLCAweDJjNmUsCisJMHgxZDUwLCAweDIwMDEsIDB4MTk5NywgMHgyMDA0LCAweGQwZmMsIDB4MDEwOCwgMHgwMDIwLCAweDA4MGMsCisJMHgyOWMwLCAweDA4MDQsIDB4MGQxYSwgMHg3ODUwLCAweDkwODUsIDB4MDA0MCwgMHg3ODUyLCAweDc5MzgsCisJMHg3ODUwLCAweDkwODQsIDB4ZmJjZiwgMHg3ODUyLCAweDA4MGMsIDB4MmM3NiwgMHg5MDg1LCAweDIwMDAsCisJMHg3ODUyLCAweDc5M2EsIDB4MjBhOSwgMHgwMDQ2LCAweDFkMDQsIDB4MGM3NCwgMHgwODBjLCAweDg2NmEsCisJMHgxZjA0LCAweDBjNzQsIDB4Nzg1MCwgMHg5MDg1LCAweDA0MDAsIDB4OTA4NCwgMHhkZmJmLCAweDc4NTIsCisJMHg3OTNhLCAweDA4MGMsIDB4NzQ0ZiwgMHgwMTQ4LCAweDA4MGMsIDB4NzQ2MSwgMHgxMTE4LCAweDA4MGMsCisJMHg3NzMzLCAweDAwNTAsIDB4MDgwYywgMHg3NDQ2LCAweDBkZDAsIDB4MDgwYywgMHg3NzJlLCAweDA4MGMsCisJMHg3NzI0LCAweDA4MGMsIDB4NzM2YSwgMHgwMDIwLCAweDIwMDksIDB4MDBmOCwgMHgwODBjLCAweDYwMjksCisJMHgyMGE5LCAweDAwMjgsIDB4YTAwMSwgMHgxZjA0LCAweDBjOWEsIDB4Nzg1MCwgMHg5MDg1LCAweDE0MDAsCisJMHg3ODUyLCAweDA4MGMsIDB4NzQzZSwgMHgwMTIwLCAweDc4NDMsIDB4MDA5MCwgMHg3ODQzLCAweDAwMTAsCisJMHgyMDIxLCAweGU2NzgsIDB4MjAxOSwgMHhlYTYwLCAweDBkMGMsIDB4ODY2YSwgMHg3ODIwLCAweGQwOWMsCisJMHgxNTgwLCAweDA4MGMsIDB4NzQzZSwgMHgwOTA0LCAweDBjZmYsIDB4NzgyNCwgMHhkMGFjLCAweDE5MDQsCisJMHgwZDFmLCAweDA4MGMsIDB4NzQ2MSwgMHgxNTI4LCAweDAwNDYsIDB4MjAyMSwgMHgwMzIwLCAweDg0MjEsCisJMHgxZGYwLCAweDAwNGUsIDB4NzgyNywgMHgxODAwLCAweDA4MGMsIDB4MmM3NiwgMHg3ODI0LCAweDkwODQsCisJMHgxODAwLCAweDExNjAsIDB4OTQ4NCwgMHgwZmZmLCAweDExMzgsIDB4MjAwMSwgMHgxODEwLCAweDIwMDQsCisJMHhkMGZjLCAweDAxMTAsIDB4MDgwYywgMHgwZDQ1LCAweDg0MjEsIDB4MTE1OCwgMHgxZDA0LCAweDBjZGEsCisJMHgwODBjLCAweDg2NmEsIDB4MDgwYywgMHg3NzJlLCAweDA4MGMsIDB4NzcyNCwgMHg3MDAzLCAweDAwMDEsCisJMHgwNGYwLCAweDgzMTksIDB4MTk0OCwgMHgxZDA0LCAweDBjZTcsIDB4MDgwYywgMHg4NjZhLCAweDIwMDksCisJMHgxOTlhLCAweDIxMDQsIDB4OTAwNSwgMHgwMTE4LCAweDgwMDEsIDB4MjAwYSwgMHgxMTc4LCAweDIwMGIsCisJMHgwMDBhLCAweDc4MjcsIDB4MDA0OCwgMHgyMGE5LCAweDAwMDIsIDB4MDgwYywgMHgyYzU3LCAweDc5MjQsCisJMHgwODBjLCAweDJjNzYsIDB4ZDE5YywgMHgwMTEwLCAweDA4MGMsIDB4MmI5NywgMHgwMGQ4LCAweDA4MGMsCisJMHg3NDRmLCAweDExNDAsIDB4OTRhMiwgMHgwM2U4LCAweDExMjgsIDB4MDgwYywgMHg3NDE2LCAweDcwMDMsCisJMHgwMDAxLCAweDAwYTgsIDB4NzgyNywgMHgxODAwLCAweDA4MGMsIDB4MmM3NiwgMHg3ODI0LCAweDA4MGMsCisJMHg3NDU4LCAweDAxMTAsIDB4ZDBhYywgMHgxMTU4LCAweDkwODQsIDB4MTgwMCwgMHgwOTUwLCAweDcwMDMsCisJMHgwMDAxLCAweDAwMjgsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjgyOCwgMHgwMDc4LCAweDIwMDksCisJMHgxODBjLCAweDIxMGMsIDB4ZDE5YywgMHgxMTIwLCAweDc5MDQsIDB4OTE4ZCwgMHgwMDAyLCAweDc5MDYsCisJMHg3ODI3LCAweDAwNDgsIDB4NzgyOCwgMHg5MDg1LCAweDAwMjgsIDB4NzgyYSwgMHg3ODUwLCAweDkwODUsCisJMHgwNDAwLCAweDc4NTIsIDB4MjAwMSwgMHgxOWE2LCAweDIwMDMsIDB4MDAwMCwgMHg5MDA2LCAweDc4ZjIsCisJMHgwMTVlLCAweDAwM2UsIDB4MDAwZSwgMHgwODBjLCAweDU3NmMsIDB4MTExMCwgMHgwODBjLCAweDBlNjIsCisJMHgwMTJlLCAweDAwZmUsIDB4MDA0ZSwgMHgwMDFlLCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDAwMzYsCisJMHgwMDQ2LCAweDAwYjYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgwMTU2LCAweDAwNjksCisJMHgwZDBjLCAweDg2NmEsIDB4MDE1ZSwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwYmUsCisJMHgwMDRlLCAweDAwM2UsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE4OWUsCisJMHg3MDA0LCAweDkwODYsIDB4MDAwMSwgMHgxMTEwLCAweDA4MGMsIDB4MzRhYiwgMHgwMGVlLCAweDAwMDUsCisJMHgwMDA1LCAweDJhNzAsIDB4MjA2MSwgMHgxOWFhLCAweDIwNjMsIDB4MDAwMywgMHg2MDA3LCAweDAwMDMsCisJMHg2MDBiLCAweDAwMDgsIDB4NjAwZiwgMHgwMTM3LCAweDIwMDEsIDB4MTk3YiwgMHg5MDBlLCAweDIxMDIsCisJMHg3MTk2LCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweDkwODIsIDB4MDAwMiwgMHgwMjE4LCAweDcwNWYsCisJMHhmZmZmLCAweDAwMDgsIDB4NzE1ZSwgMHg3MDY3LCAweGZmZmYsIDB4NzE3ZSwgMHg3MTgyLCAweDA4MGMsCisJMHhkMGQ5LCAweDIwNjEsIDB4MTk2YiwgMHg2MDAzLCAweDA5MDksIDB4NjEwNiwgMHg2MDBiLCAweDg4MDAsCisJMHg2MDBmLCAweDAyMDAsIDB4NjAxMywgMHgwMGZmLCAweDYwMTcsIDB4MDAxZiwgMHg2MTFhLCAweDYwMWYsCisJMHgwN2QwLCAweDIwNjEsIDB4MTk3MywgMHg2MDAzLCAweDgwMDAsIDB4NjEwNiwgMHg2MTBhLCAweDYwMGYsCisJMHgwMjAwLCAweDYwMTMsIDB4MDBmZiwgMHg2MTE2LCAweDYwMWIsIDB4MDAwMSwgMHg2MTFlLCAweDIwNjEsCisJMHgxOTg4LCAweDYwMDMsIDB4NTE0YywgMHg2MDA3LCAweDRmNDcsIDB4NjAwYiwgMHg0OTQzLCAweDYwMGYsCisJMHgyMDIwLCAweDIwMDEsIDB4MTgyYywgMHgyMTAyLCAweDAwMDUsIDB4OTAxNiwgMHgwODBjLCAweDY2OTksCisJMHgxMTc4LCAweGI4MDQsIDB4OTBjNCwgMHgwMGZmLCAweDk4YzYsIDB4MDAwNiwgMHgwMTI4LCAweDkwYzQsCisJMHhmZjAwLCAweDk4YzYsIDB4MDYwMCwgMHgxMTIwLCAweDkxODYsIDB4MDA4MCwgMHgwMTA4LCAweDgyMTAsCisJMHg4MTA4LCAweDkxODYsIDB4MDgwMCwgMHgxZDUwLCAweDIyMDgsIDB4MDAwNSwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDc5LCAweDAwMDAsIDB4MDAwZSwgMHgwMGY2LCAweDAwMTAsIDB4MjA5MSwgMHg4MDAwLCAweDBlMDQsCisJMHgwZGQ3LCAweDAwMDYsIDB4MDAxNiwgMHgyMDAxLCAweDgwMDIsIDB4MDAwNiwgMHgyMDc5LCAweDAwMDAsCisJMHgwMDBlLCAweDc4ODIsIDB4NzgzNiwgMHgwMDFlLCAweDc5OGUsIDB4MDAwZSwgMHg3ODhhLCAweDAwMGUsCisJMHg3ODg2LCAweDM5MDAsIDB4Nzg5YSwgMHg3ODMzLCAweDAwMTIsIDB4MjA5MSwgMHg1MDAwLCAweDAxNTYsCisJMHgwMGQ2LCAweDAwMzYsIDB4MDAyNiwgMHgyMDc5LCAweDAzMDAsIDB4MjA2OSwgMHgxYWE0LCAweDdhMDgsCisJMHgyMjZhLCAweDIwNjksIDB4MWFhNSwgMHg3YTE4LCAweDIyNmEsIDB4OGQ2OCwgMHg3YTFjLCAweDIyNmEsCisJMHg3ODJjLCAweDIwMTksIDB4MWFiMiwgMHgyMDFhLCAweDIwMTksIDB4MWFiNSwgMHg5MDE2LCAweDc4MDgsCisJMHhkMDljLCAweDAxNjgsIDB4NzgyMCwgMHgyMDFhLCAweDgyMTAsIDB4ODMxOCwgMHg5Mzg2LCAweDFhY2EsCisJMHgwMTA4LCAweDBjYTgsIDB4NzgwOCwgMHhkMDljLCAweDAxMTAsIDB4MjAxMSwgMHhkZWFkLCAweDIwMTksCisJMHgxYWIzLCAweDc4MmMsIDB4MjAxYSwgMHg4MzE4LCAweDIyMWEsIDB4NzgwMywgMHgwMDAwLCAweDIwNjksCisJMHgxYTg0LCAweDkwMWUsIDB4MjBhOSwgMHgwMDIwLCAweDdiMjYsIDB4N2EyOCwgMHgyMjZhLCAweDhkNjgsCisJMHg4MzE4LCAweDFmMDQsIDB4MGUyNCwgMHgwMDJlLCAweDAwM2UsIDB4MDBkZSwgMHgwMTVlLCAweDIwNzksCisJMHgxODAwLCAweDc4MDMsIDB4MDAwNSwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsCisJMHhkMDg0LCAweDAxODAsIDB4MjAwMSwgMHgxYTE4LCAweDIwMDQsIDB4OTAwNSwgMHgwMTI4LCAweDIwMDEsCisJMHgwMDhiLCAweDIwMDQsIDB4ZDBmYywgMHgwZGQ4LCAweDIwMDEsIDB4MDA4YSwgMHgyMDAzLCAweDAwMDIsCisJMHgyMDAzLCAweDEwMDEsIDB4MDgwYywgMHg1NzZjLCAweDExMTAsIDB4MDgwYywgMHgwZTk5LCAweDBjZDAsCisJMHgwMDA1LCAweDkxOGMsIDB4MDNmZiwgMHgyMDAxLCAweDAwMDMsIDB4MjAwNCwgMHg5MDg0LCAweDA2MDAsCisJMHgxMTE4LCAweDkxOGQsIDB4MjgwMCwgMHgwMDEwLCAweDkxOGQsIDB4MjAwMCwgMHgyMDAxLCAweDAxN2YsCisJMHgyMTAyLCAweDAwMDUsIDB4MDBmNiwgMHgwMDA2LCAweDIwNzksIDB4MTgyNywgMHgyZjA0LCAweDgwMDAsCisJMHgyMDdhLCAweDA4MGMsIDB4MmM2ZSwgMHgxMTUwLCAweDAwMDYsIDB4MjAwMSwgMHgxOTk3LCAweDIwMDQsCisJMHhkMGZjLCAweDAwMGUsIDB4MTExOCwgMHg5MDgyLCAweDc1MzAsIDB4MDAxMCwgMHg5MDgyLCAweDAwMGYsCisJMHgwMjU4LCAweDkwMDYsIDB4MjA3YSwgMHgyMDc5LCAweDE4MmEsIDB4MmYwNCwgMHg5MDg0LCAweDAwMDEsCisJMHg5MDg2LCAweDAwMDEsIDB4MjA3YSwgMHgwMDkwLCAweDIwNzksIDB4MTgyYSwgMHgyZjdjLCAweDhmZmYsCisJMHgxMTM4LCAweDAwMjYsIDB4MjAxMSwgMHgwMDgwLCAweDA4MGMsIDB4MGVkZiwgMHgwMDJlLCAweDAwMzAsCisJMHgwMDI2LCAweDIwMTEsIDB4MDAwMCwgMHgwODBjLCAweDBlZGYsIDB4MDAyZSwgMHgwMDBlLCAweDAwZmUsCisJMHgwMDA1LCAweDAwMjYsIDB4MDEyNiwgMHgyMDExLCAweDAwODAsIDB4MDgwYywgMHgwZWRmLCAweDIwYTksCisJMHgwZmZmLCAweDA4MGMsIDB4MGYwMCwgMHgyMDExLCAweDAwNDAsIDB4MDRjOSwgMHgyMGE5LCAweDBmZmYsCisJMHgwODBjLCAweDBmMDAsIDB4MGM4MCwgMHg3MDM4LCAweGQwYjQsIDB4MTEyOCwgMHgwMDI2LCAweDIwMTEsCisJMHgwMDQwLCAweDA0NjksIDB4MDAyZSwgMHgwMDA1LCAweDcwMzgsIDB4ZDBiNCwgMHgxMTI4LCAweDAwMjYsCisJMHgyMDExLCAweDAwODAsIDB4MDQyMSwgMHgwMDJlLCAweDAwMDUsIDB4MDAyNiwgMHg3MGVmLCAweDAwMDAsCisJMHgwNDU5LCAweDExNDgsIDB4MDgwYywgMHgyYzZlLCAweDExMTgsIDB4MjAxMSwgMHg4NDg0LCAweDAwNTgsCisJMHgyMDExLCAweDgyODIsIDB4MDA0MCwgMHgwODBjLCAweDJjNmUsIDB4MTExOCwgMHgyMDExLCAweGNkYzUsCisJMHgwMDEwLCAweDIwMTEsIDB4Y2FjMiwgMHgwMGU5LCAweDAwMmUsIDB4MDAwNSwgMHhkMGI0LCAweDAxMzAsCisJMHgwMDA2LCAweDNiMDAsIDB4OTA4NCwgMHhmZjNmLCAweDIwZDgsIDB4MDAwZSwgMHgwMDA1LCAweDAwMTYsCisJMHgzYjA4LCAweDNhMDAsIDB4OTEwNCwgMHg5MThkLCAweDAwYzAsIDB4MjFkOCwgMHg5MDg0LCAweGZmM2YsCisJMHg5MjA1LCAweDIwZDAsIDB4MDAxZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgzYSwgMHgyMDA0LCAweGQwZGMsCisJMHgwMDA1LCAweDllODYsIDB4MTgwMCwgMHgxOTBjLCAweDBkZDUsIDB4NzBlOCwgMHhkMGU0LCAweDAxMDgsCisJMHhjMmU1LCAweDcyZWEsIDB4ZDBlNCwgMHgxMTE4LCAweDkyOTQsIDB4MDBjMCwgMHgwYzAxLCAweDAwMDUsCisJMHgxZDA0LCAweDBmMDAsIDB4MjA5MSwgMHg2MDAwLCAweDFmMDQsIDB4MGYwMCwgMHgwMDA1LCAweDg5MGUsCisJMHg4MTBlLCAweDgxMGYsIDB4OTE5NCwgMHgwMDNmLCAweDkxOGMsIDB4ZmZjMCwgMHgwMDA1LCAweDAwMDYsCisJMHgyMjAwLCAweDkxNGQsIDB4ODk0ZiwgMHg4OTRkLCAweDg5NGQsIDB4MDAwZSwgMHgwMDA1LCAweDAxZDYsCisJMHgwMTQ2LCAweDAwMzYsIDB4MDA5NiwgMHgyMDYxLCAweDE4OGQsIDB4NjAwYiwgMHgwMDAwLCAweDYwMGYsCisJMHgwMDAwLCAweDYwMDMsIDB4MDAwMCwgMHg2MDA3LCAweDAwMDAsIDB4MjAwOSwgMHhmZmMwLCAweDIxMDUsCisJMHgwMDA2LCAweDIwMDEsIDB4YWFhYSwgMHgyMDBmLCAweDIwMTksIDB4NTU1NSwgMHg5MDE2LCAweDIwNDksCisJMHgwYmZmLCAweGFiMDIsIDB4YTAwMSwgMHhhMDAxLCAweGE4MDAsIDB4OTMwNiwgMHgxMTM4LCAweDIxMDUsCisJMHg5MzA2LCAweDAxMjAsIDB4ODIxMCwgMHg5OWM4LCAweDA0MDAsIDB4MGM5OCwgMHgwMDBlLCAweDIwMGYsCisJMHgyMDAxLCAweDE4OWQsIDB4OTI4YSwgMHgwMDBlLCAweDE2MzgsIDB4OTI4YSwgMHgwMDA2LCAweDIwMTEsCisJMHgwMDA2LCAweDEyMTAsIDB4MjAxMSwgMHgwMDAwLCAweDIyMDIsIDB4OTAwNiwgMHgyMDA4LCAweDgyZmYsCisJMHgwMWIwLCAweDgyMDAsIDB4NjAwYSwgMHg2MDBmLCAweGZmZmYsIDB4NjAwMywgMHgwMDAyLCAweDYwMDcsCisJMHgwMDAwLCAweDAwMjYsIDB4MjAxOSwgMHgwMDEwLCAweDkyODAsIDB4MDAwMSwgMHgyMGU4LCAweDIxYTAsCisJMHgyMWE4LCAweDQxMDQsIDB4ODMxOSwgMHgxZGUwLCAweDgyMTEsIDB4MWRhMCwgMHgwMDJlLCAweDAwOWUsCisJMHgwMDNlLCAweDAxNGUsIDB4MDFkZSwgMHgwMDA1LCAweDIwMTEsIDB4MDAwZSwgMHgwOGU4LCAweDAwMTYsCisJMHgwMDI2LCAweDAwOTYsIDB4MzM0OCwgMHgwODBjLCAweDBmMDcsIDB4MjEwMCwgMHg5MzAwLCAweDIwOTgsCisJMHgyMmUwLCAweDAwOWUsIDB4MDAyZSwgMHgwMDFlLCAweDAwMzYsIDB4MzUxOCwgMHgyMGE5LCAweDAwMDEsCisJMHg0MDAyLCAweDgwMDcsIDB4NDAwNCwgMHg4MzE5LCAweDFkZDgsIDB4MDAzZSwgMHgwMDA1LCAweDIwZTksCisJMHgwMDAxLCAweDcxYjgsIDB4ODFmZiwgMHgxMWMwLCAweDkwMDYsIDB4MjAwOSwgMHgwMjAwLCAweDIwYTksCisJMHgwMDAyLCAweDkyOTgsIDB4MDAxOCwgMHgyM2EwLCAweDQwMDEsIDB4MjAwOSwgMHgwNzAwLCAweDIwYTksCisJMHgwMDAyLCAweDkyOTgsIDB4MDAwOCwgMHgyM2EwLCAweDQwMDEsIDB4NzA3YywgMHg4MDA3LCAweDcxODAsCisJMHg4MTBmLCAweDIwYTksIDB4MDAwMiwgMHg0MDAxLCAweDkyOTgsIDB4MDAwYywgMHgyM2EwLCAweDkwMGUsCisJMHgwODBjLCAweDBkYjUsIDB4MjAwMSwgMHgwMDAwLCAweDgxMGYsIDB4MjBhOSwgMHgwMDAyLCAweDQwMDEsCisJMHgwMDA1LCAweDg5ZmYsIDB4MDE0MCwgMHhhODA0LCAweGE4MDcsIDB4MDAwMCwgMHgwMDA2LCAweDA4MGMsCisJMHgxMDMxLCAweDAwOWUsIDB4MGNiMCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLCAweDA4MGMsCisJMHgxMGFhLCAweDA5MGMsIDB4MGRkNSwgMHgwMGVlLCAweDAwMDUsIDB4MDA4NiwgMHgwMGU2LCAweDAwMDYsCisJMHgwMDI2LCAweDAwMzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDBjOSwgMHgyMDcxLCAweDE4MDAsCisJMHg3M2MwLCAweDcwMmMsIDB4OTAxNiwgMHg5MDQ1LCAweDAxNTgsIDB4ODIxMCwgMHg5OTA2LCAweDA5MGMsCisJMHgwZGQ1LCAweDIzMDAsIDB4OTIwMiwgMHgwMTIwLCAweDFhMGMsIDB4MGRkNSwgMHhhMDAwLCAweDBjOTgsCisJMHgwMTJlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDBlLCAweDAwZWUsIDB4MDA4ZSwgMHgwMDA1LCAweDAwODYsCisJMHgwMGU2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgxOTEwLCAweDcwMTAsCisJMHg5MDA1LCAweDAxNDAsIDB4NzAxOCwgMHg5MDQ1LCAweDAxMjgsIDB4OTkwNiwgMHgwOTBjLCAweDBkZDUsCisJMHhhMDAwLCAweDBjYzgsIDB4MDEyZSwgMHgwMDBlLCAweDAwZWUsIDB4MDA4ZSwgMHgwMDA1LCAweDAwZTYsCisJMHgyMDcxLCAweDE4MDAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzBjMCwgMHg4MDAxLCAweDAyNzAsCisJMHg3MGMyLCAweDcwMmMsIDB4MjA0OCwgMHg5MDg1LCAweDAwMDEsIDB4YTgwMCwgMHg3MDJlLCAweGE4MDMsCisJMHgwMDAwLCAweGE4MDcsIDB4MDAwMCwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHg5MDRlLCAweDBjZDgsCisJMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MTgwMCwgMHg3MGMwLCAweDkwY2EsCisJMHgwMDIwLCAweDAyNjgsIDB4ODAwMSwgMHg3MGMyLCAweDcwMmMsIDB4MjA0OCwgMHhhODAwLCAweDcwMmUsCisJMHhhODAzLCAweDAwMDAsIDB4YTgwNywgMHgwMDAwLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweDkwNGUsCisJMHgwY2Q4LCAweDAwZTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDAxNiwgMHg4OTBlLCAweDgxMGUsCisJMHg4MTBmLCAweDkxODQsIDB4MDAzZiwgMHhhODYyLCAweDkxODQsIDB4ZmZjMCwgMHhhODVlLCAweDAwMWUsCisJMHgwMDIwLCAweDAwZTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgxODAwLCAweDcwMmMsCisJMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGMwLCAweDgwMDAsIDB4NzBjMiwgMHgwODBjLCAweDg0YzIsCisJMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDcxLCAweDE4MDAsIDB4OTAyNiwgMHgyMDA5LCAweDAwMDAsCisJMHgyMDQ5LCAweDA0MDAsIDB4MjkwMCwgMHg3MDJlLCAweDg5NDAsIDB4MjgwMCwgMHhhODAyLCAweGE5NWUsCisJMHhhODYzLCAweDAwMDEsIDB4ODQyMCwgMHg5ODg2LCAweDA0NDAsIDB4MDEyMCwgMHgyODQ4LCAweDkxODgsCisJMHgwMDQwLCAweDBjOTAsIDB4MjA3MSwgMHgxODhkLCAweDcwMDAsIDB4OTAwNSwgMHgxMWEwLCAweDIwMDEsCisJMHgwNTM0LCAweGE4MDIsIDB4MjA0OCwgMHgyMDA5LCAweDRkMDAsIDB4ODk0MCwgMHgyODAwLCAweGE4MDIsCisJMHhhOTVlLCAweGE4NjMsIDB4MDAwMSwgMHg4NDIwLCAweDk4ODYsIDB4MDgwMCwgMHgwMTIwLCAweDI4NDgsCisJMHg5MTg4LCAweDAwNDAsIDB4MGM5MCwgMHgyMDcxLCAweDE4OGQsIDB4NzEwNCwgMHg3MjAwLCAweDgyZmYsCisJMHgwMWQwLCAweDczMDgsIDB4ODMxOCwgMHg4MzFmLCAweDgzMWIsIDB4ODMxYiwgMHg3MzEyLCAweDgzMTksCisJMHgyMDAxLCAweDA4MDAsIDB4YTgwMiwgMHgyMDQ4LCAweDg5MDAsIDB4YTgwMiwgMHgyMDQwLCAweGE5NWUsCisJMHhhYTYyLCAweDg0MjAsIDB4MjMwMCwgMHg5OTA2LCAweDAxMzAsIDB4Mjg0OCwgMHg5MTg4LCAweDAwNDAsCisJMHg5MjkxLCAweDAwMDAsIDB4MGM4OCwgMHhhODAzLCAweDAwMDAsIDB4MjA3MSwgMHgxODAwLCAweDc0YmUsCisJMHg3NGMyLCAweDAwMDUsIDB4MDBlNiwgMHgwMDE2LCAweDk5ODQsIDB4ZmMwMCwgMHgwMWU4LCAweDkwOGMsCisJMHhmODAwLCAweDExNjgsIDB4OTk4MiwgMHgwNDAwLCAweDAyYjgsIDB4OTk4MiwgMHgwNDQwLCAweDAyNzgsCisJMHg5OTgyLCAweDA1MzQsIDB4MDI4OCwgMHg5OTgyLCAweDA4MDAsIDB4MTI3MCwgMHgwMDQwLCAweDk5ODIsCisJMHgwODAwLCAweDAyNTAsIDB4MjA3MSwgMHgxODhkLCAweDcwMTAsIDB4OTkwMiwgMHgxMjI4LCAweDkwODUsCisJMHgwMDAxLCAweDAwMWUsIDB4MDBlZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNkOCwgMHgwMGU2LCAweDIwNzEsCisJMHgxYTE3LCAweDcwMDcsIDB4MDAwMCwgMHg5MDA2LCAweDcwMWUsIDB4NzAyMiwgMHg3MDAyLCAweDIwNzEsCisJMHgwMDAwLCAweDcwMTAsIDB4OTA4NSwgMHg4MDQ0LCAweDcwMTIsIDB4MjA3MSwgMHgwMDgwLCAweDkwMDYsCisJMHgyMGE5LCAweDAwNDAsIDB4NzAyMiwgMHgxZjA0LCAweDEwZTIsIDB4NzAyYiwgMHgwMDIwLCAweDAwZWUsCisJMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwZTYsIDB4YTA2ZiwgMHgwMDAwLCAweDIwNzEsCisJMHgxYTE3LCAweDcwMWMsIDB4OTA4OCwgMHgxYTIxLCAweDI4MGEsIDB4ODAwMCwgMHg5MDg0LCAweDAwM2YsCisJMHg3MDFlLCAweDcxMjAsIDB4OTEwNiwgMHgwOTBjLCAweDBkZDUsIDB4NzAwNCwgMHg5MDA1LCAweDExMjgsCisJMHgwMGY2LCAweDIwNzksIDB4MDA4MCwgMHgwMGE5LCAweDAwZmUsIDB4MDBlZSwgMHgwMTJlLCAweDAwMDUsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGU2LCAweDIwNzEsIDB4MWExNywgMHg3MDA0LCAweDkwMDUsCisJMHgxMTI4LCAweDAwZjYsIDB4MjA3OSwgMHgwMDgwLCAweDAwMjEsIDB4MDBmZSwgMHgwMGVlLCAweDAxMmUsCisJMHgwMDA1LCAweDcwMDQsIDB4OTA4NiwgMHgwMDAwLCAweDExMTAsIDB4NzAwNywgMHgwMDA2LCAweDcwMDAsCisJMHgwMDAyLCAweDExMmIsIDB4MTJhZSwgMHgxMTI5LCAweDExMjksIDB4MTJhMiwgMHgxMmEyLCAweDEyYTIsCisJMHgxMmEyLCAweDA4MGMsIDB4MGRkNSwgMHg3MDFjLCAweDcxMjAsIDB4OTEwNiwgMHgxMTQ4LCAweDc5MmMsCisJMHg5MTg0LCAweDAwMDEsIDB4MTEyMCwgMHhkMWZjLCAweDExMTAsIDB4NzAwNywgMHgwMDAwLCAweDAwMDUsCisJMHgwMDk2LCAweDkxODAsIDB4MWEyMSwgMHgyMDA0LCAweDcwMGEsIDB4MjA0OCwgMHg4MTA4LCAweDkxOGMsCisJMHgwMDNmLCAweDcxMjIsIDB4NzgyYiwgMHgwMDI2LCAweGE4OGMsIDB4NzgwMiwgMHhhODkwLCAweDc4MDYsCisJMHhhODk0LCAweDc4MGEsIDB4YTg5OCwgMHg3ODBlLCAweGE4NzgsIDB4NzAwZSwgMHhhODcwLCAweDcwMTYsCisJMHhhODc0LCAweDcwMWEsIDB4YTg2OCwgMHgwMDllLCAweGQwODQsIDB4MDEyMCwgMHg3MDA3LCAweDAwMDEsCisJMHgwMDI5LCAweDAwMDUsIDB4NzAwNywgMHgwMDAyLCAweDAwYjEsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsCisJMHg3MTBjLCAweDIwMTEsIDB4MDA0MCwgMHg5MTgyLCAweDAwNDAsIDB4MTIxMCwgMHgyMTEwLCAweDkwMDYsCisJMHg3MDBlLCAweDcyMTIsIDB4ODIwMywgMHg3ODEyLCAweDc4MmIsIDB4MDAyMCwgMHg3ODJiLCAweDAwNDEsCisJMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsCisJMHg3MDE0LCAweDIwZTAsIDB4NzAxOCwgMHgyMDk4LCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAwODgsCisJMHg3ODJiLCAweDAwMjYsIDB4NzEwYywgMHgyMDExLCAweDAwNDAsIDB4OTE4MiwgMHgwMDQwLCAweDEyMTAsCisJMHgyMTEwLCAweDkwMDYsIDB4NzAwZSwgMHgyMmE4LCAweDQwMDYsIDB4ODIwMywgMHg3ODEyLCAweDc4MmIsCisJMHgwMDIwLCAweDMzMDAsIDB4NzAxYSwgMHg3ODJiLCAweDAwMDEsIDB4MDE1ZSwgMHgwMTRlLCAweDAxM2UsCisJMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgyMDA5LCAweDFhMTcsIDB4MjEwNCwgMHhjMDk1LCAweDIwMGEsCisJMHgwODBjLCAweDExMDgsIDB4MDAwNSwgMHgwMDE2LCAweDAwZTYsIDB4MjA3MSwgMHgxYTE3LCAweDAwZjYsCisJMHgyMDc5LCAweDAwODAsIDB4NzkyYywgMHhkMWJjLCAweDE5MGMsIDB4MGRjZSwgMHg3ODJiLCAweDAwMDIsCisJMHhkMWZjLCAweDAxMjAsIDB4OTE4YywgMHgwNzAwLCAweDcwMDQsIDB4MDAyMywgMHgwMGZlLCAweDAwZWUsCisJMHgwMDFlLCAweDAwMDUsIDB4MTExOSwgMHgxMWMxLCAweDExZjUsIDB4MTJjZCwgMHgwZGQ1LCAweDEyZTgsCisJMHgwZGQ1LCAweDkxOGMsIDB4MDcwMCwgMHgxNTUwLCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDcwMTQsCisJMHgyMGU4LCAweDcwMTgsIDB4MjBhMCwgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwgMHgwMDg4LCAweDc4MmIsCisJMHgwMDQwLCAweDcwMTAsIDB4MjBhOCwgMHg0MDA1LCAweDM0MDAsIDB4NzAxYSwgMHgwMTVlLCAweDAxNGUsCisJMHgwMTNlLCAweDcwMGMsIDB4OTAwNSwgMHgwNTc4LCAweDc4MDAsIDB4NzgwMiwgMHg3ODA0LCAweDc4MDYsCisJMHgwODBjLCAweDExNWUsIDB4MDAwNSwgMHg3MDA4LCAweDAwOTYsIDB4MjA0OCwgMHhhODZmLCAweDAxMDAsCisJMHgwMDllLCAweDcwMDcsIDB4MDAwMCwgMHgwODBjLCAweDExMTksIDB4MDAwNSwgMHg3MDA4LCAweDAwOTYsCisJMHgyMDQ4LCAweGE4NmYsIDB4MDIwMCwgMHgwMDllLCAweDBjYTAsIDB4OTE4YywgMHgwNzAwLCAweDExNTAsCisJMHg3MDBjLCAweDkwMDUsIDB4MDE4MCwgMHg3ODAwLCAweDc4MDIsIDB4NzgwNCwgMHg3ODA2LCAweDA4MGMsCisJMHgxMTczLCAweDAwMDUsIDB4NzAwOCwgMHgwMDk2LCAweDIwNDgsIDB4YTg2ZiwgMHgwMjAwLCAweDAwOWUsCisJMHg3MDA3LCAweDAwMDAsIDB4MDA4MCwgMHgwMDk2LCAweDcwMDgsIDB4MjA0OCwgMHg3ODAwLCAweGE4OGUsCisJMHg3ODA0LCAweGE4OTIsIDB4NzgwOCwgMHhhODk2LCAweDc4MGMsIDB4YTg5YSwgMHhhODZmLCAweDAxMDAsCisJMHgwMDllLCAweDcwMDcsIDB4MDAwMCwgMHgwMDk2LCAweDAwZDYsIDB4NzAwOCwgMHgyMDQ4LCAweDIwMDEsCisJMHgxOGI5LCAweDIwMDQsIDB4OTkwNiwgMHgxMTI4LCAweGE4OWMsIDB4MDgwZiwgMHgwMGRlLCAweDAwOWUsCisJMHgwMGEwLCAweDAwZGUsIDB4MDA5ZSwgMHgwMDk2LCAweDAwZDYsIDB4NzAwOCwgMHgyMDQ4LCAweDAwODEsCisJMHgwMTUwLCAweGE4OWMsIDB4MDA4NiwgMHgyOTQwLCAweDA4MGYsIDB4MDA4ZSwgMHgwMGRlLCAweDAwOWUsCisJMHgwODBjLCAweDExMDgsIDB4MDAwNSwgMHgwMGRlLCAweDAwOWUsIDB4MDgwYywgMHgxMTA4LCAweDAwMDUsCisJMHhhOGE4LCAweGQwOGMsIDB4MDAwNSwgMHgwMDk2LCAweGEwYTAsIDB4OTA0ZCwgMHgwOTBjLCAweDBkZDUsCisJMHhhMDZjLCAweDkwOGUsIDB4MDEwMCwgMHgwMTMwLCAweGE4N2IsIDB4MDAzMCwgMHhhODgzLCAweDAwMDAsCisJMHhhODk3LCAweDQwMDIsIDB4MDgwYywgMHg2ZDBiLCAweGEwOWYsIDB4MDAwMCwgMHhhMGEzLCAweDAwMDAsCisJMHgyODQ4LCAweDA4MGMsIDB4MTAzMSwgMHgwMDllLCAweDAwMDUsIDB4MDBhNiwgMHhhMGEwLCAweDkwNGQsCisJMHgwOTBjLCAweDBkZDUsIDB4YTA2YywgMHg5MDhlLCAweDAxMDAsIDB4MDEyOCwgMHhhODdiLCAweDAwMDEsCisJMHhhODgzLCAweDAwMDAsIDB4MDBjMCwgMHhhODBjLCAweDIwNTAsIDB4YjAwNCwgMHg5MDA1LCAweDAxOTgsCisJMHhhODBlLCAweDIwNTAsIDB4ODAwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTA4YywgMHgwMDNmLCAweDkwODQsCisJMHhmZmMwLCAweDkwODAsIDB4MDAwMiwgMHhhMDc2LCAweGExNzIsIDB4YjAwMCwgMHhhMDdhLCAweDI4MTAsCisJMHgwODBjLCAweDEwZTksIDB4MDBlOCwgMHhhOTdjLCAweGE4OTQsIDB4MDAxNiwgMHgwMDA2LCAweDA4MGMsCisJMHg2ZDBiLCAweDAwMGUsIDB4MDAxZSwgMHhkMWZjLCAweDExMzgsIDB4ZDFmNCwgMHgwMTI4LCAweDAwYzYsCisJMHgyMDYwLCAweDA4MGMsIDB4YWY0MywgMHgwMGNlLCAweDcwMDgsIDB4MjA0OCwgMHhhODlmLCAweDAwMDAsCisJMHhhOGEzLCAweDAwMDAsIDB4MDgwYywgMHgxMDMxLCAweDcwMDcsIDB4MDAwMCwgMHgwODBjLCAweDExMDgsCisJMHgwMGFlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzgyYiwgMHgxMDAxLCAweDcwMDcsCisJMHgwMDA1LCAweDcwMDAsIDB4YzA5NCwgMHg3MDAyLCAweDAxMmUsIDB4MDAwNSwgMHgwMDk2LCAweDIwMDEsCisJMHgxOTJlLCAweDIwNGMsIDB4YTg3YywgMHg3ODEyLCAweGE4OGMsIDB4NzgwMiwgMHhhODkwLCAweDc4MDYsCisJMHhhODk0LCAweDc4MGEsIDB4YTg5OCwgMHg3ODBlLCAweDc4MmIsIDB4MDAyMCwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDc4MmIsIDB4MDA0MSwgMHg3MDA3LCAweDAwMDMsIDB4NzAwMCwgMHhjMDg0LCAweDcwMDIsCisJMHgyOTAwLCAweDcwMGEsIDB4MDEyZSwgMHgwMDllLCAweDAwMDUsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksCisJMHgwMDg4LCAweDc4MmIsIDB4MDA0MCwgMHgwMDk2LCAweDIwMDEsIDB4MTkyZSwgMHgyMDRjLCAweGFhN2MsCisJMHgwMDllLCAweDA4MGMsIDB4OGFkMCwgMHgyMDA5LCAweDE4OGMsIDB4MjEwNCwgMHg5MDg0LCAweGZmZmMsCisJMHgyMDBhLCAweDA4MGMsIDB4ODkzOSwgMHg3MDA3LCAweDAwMDAsIDB4MDgwYywgMHgxMTE5LCAweDAwMDUsCisJMHg3MDA3LCAweDAwMDAsIDB4MDgwYywgMHgxMTE5LCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDIyMDAsCisJMHgyMDc5LCAweDAzMDAsIDB4MjA3MSwgMHgxYTYxLCAweDcwMDMsIDB4MDAwMCwgMHg3OGJmLCAweDAwZjYsCisJMHg3ODFiLCAweDQ4MDAsIDB4MDBjMSwgMHg3ODAzLCAweDAwMDMsIDB4NzgwZiwgMHgwMDAwLCAweDIwYTksCisJMHgwM2QwLCAweDIwNjEsIDB4ZWJhOCwgMHgyYzBkLCAweDc5MTIsIDB4ZTEwNCwgMHg5Y2UwLCAweDAwMDIsCisJMHg3OTE2LCAweDFmMDQsIDB4MTMwMywgMHg3ODA3LCAweDAwMDcsIDB4NzgwMywgMHgwMDAwLCAweDc4MDMsCisJMHgwMDAxLCAweDAxMmUsIDB4MDAwNSwgMHgwMGM2LCAweDc4MDMsIDB4MDAwMCwgMHg3ODA4LCAweGQwOWMsCisJMHgwMTIwLCAweDc4MjAsIDB4MDgwYywgMHgxMzYyLCAweDBjYzgsIDB4MjAwMSwgMHgxYTYyLCAweDIwMDMsCisJMHgwMDAwLCAweDc4YWIsIDB4MDAwNCwgMHg3OGFjLCAweGQwYWMsIDB4MWRlOCwgMHg3OGFiLCAweDAwMDIsCisJMHg3ODA3LCAweDAwMDcsIDB4NzgyNywgMHgwMDMwLCAweDc4MmIsIDB4MDQwMCwgMHg3ODI3LCAweDAwMzEsCisJMHg3ODJiLCAweDFhODQsIDB4NzgxZiwgMHhmZjAwLCAweDc4MWIsIDB4YjcwMCwgMHgyMDAxLCAweDAyMDAsCisJMHgyMDA0LCAweGQwZGMsIDB4MDExMCwgMHg3ODFmLCAweDAzMDMsIDB4MjA2MSwgMHgxYTg0LCAweDYwMmYsCisJMHgxY2QwLCAweDIwMDEsIDB4MTgxYSwgMHgyMDA0LCAweDkwODIsIDB4MWNkMCwgMHg2MDMyLCAweDYwM2IsCisJMHgyMGNlLCAweDIwMDEsIDB4MzM4NCwgMHhkMGZjLCAweDE5MGMsIDB4MGRkNSwgMHgyMDAxLCAweDAwMDMsCisJMHgyMDA0LCAweGQwZDQsIDB4MTExOCwgMHg3ODNmLCAweDMzODQsIDB4MDAyMCwgMHg5MDg0LCAweGMwMDAsCisJMHg3ODNmLCAweGIzODQsIDB4NjA0ZiwgMHgxOTNjLCAweDIwMDEsIDB4MTkyNywgMHgyMDA0LCAweDYwNDIsCisJMHgwMGNlLCAweDAwMDUsIDB4OTA4NiwgMHgwMDBkLCAweDExZDAsIDB4NzgwOCwgMHhkMDljLCAweDAxYjgsCisJMHg3ODIwLCAweDAwMjYsIDB4MjAxMCwgMHgwODBjLCAweGNjNzQsIDB4MDE4MCwgMHgyMjYwLCAweDYwMDAsCisJMHg5MDg2LCAweDAwMDQsIDB4MTE1OCwgMHgwMDE2LCAweDYxMjAsIDB4OTE4NiwgMHgwMDA5LCAweDAxMDgsCisJMHgwMDIwLCAweDIwMDksIDB4MDA0YywgMHgwODBjLCAweGFmYmUsIDB4MDAxZSwgMHgwMDJlLCAweDAwMDUsCisJMHgwMTI2LCAweDIwOTEsIDB4MjIwMCwgMHg3OTA4LCAweDkxODQsIDB4MDA3MCwgMHgxOTBjLCAweDBkY2UsCisJMHhkMTljLCAweDAxNTgsIDB4NzgyMCwgMHg5MDhjLCAweGYwMDAsIDB4MTVlOCwgMHg5MDhhLCAweDAwMjQsCisJMHgxYTBjLCAweDBkZDUsIDB4MDAyMywgMHgwMTJlLCAweDAwMDUsIDB4MDEyZSwgMHgwMDA1LCAweDEzYmIsCisJMHgxM2JiLCAweDEzZDIsIDB4MTNkNywgMHgxM2RiLCAweDEzZTAsIDB4MTQwOCwgMHgxNDBjLCAweDE0MWEsCisJMHgxNDFlLCAweDEzYmIsIDB4MTRlYiwgMHgxNGVmLCAweDE1NjEsIDB4MTU2OCwgMHgxM2JiLCAweDE1NjksCisJMHgxNTZhLCAweDE1NzUsIDB4MTU3YywgMHgxM2JiLCAweDEzYmIsIDB4MTNiYiwgMHgxM2JiLCAweDEzYmIsCisJMHgxM2JiLCAweDEzYmIsIDB4MTNlMiwgMHgxM2JiLCAweDEzYmIsIDB4MTNiYiwgMHgxM2JiLCAweDEzYmIsCisJMHgxM2JiLCAweDEzYmYsIDB4MTNiZCwgMHgwODBjLCAweDBkZDUsIDB4MDgwYywgMHgwZGNlLCAweDA4MGMsCisJMHgxNTg3LCAweDIwMDksIDB4MWE3YSwgMHgyMTA0LCAweDgwMDAsIDB4MjAwYSwgMHgwODBjLCAweDdlZDcsCisJMHgwODBjLCAweDFhZWMsIDB4MDAwNSwgMHgyMDA5LCAweDAwNDgsIDB4MjA2MCwgMHgwODBjLCAweGFmYmUsCisJMHgwMTJlLCAweDAwMDUsIDB4NzAwNCwgMHhjMDg1LCAweGMwYjUsIDB4NzAwNiwgMHgwMDA1LCAweDcwMDQsCisJMHhjMDg1LCAweDcwMDYsIDB4MDAwNSwgMHgwODBjLCAweDE1ODcsIDB4MDgwYywgMHgxNmU3LCAweDAwMDUsCisJMHgwODBjLCAweDBkZDUsIDB4MDgwYywgMHgxNTg3LCAweDIwNjAsIDB4NjAxNCwgMHgwMDk2LCAweDIwNDgsCisJMHhhODNiLCAweGZmZmYsIDB4MDA5ZSwgMHgyMDA5LCAweDAwNDgsIDB4MDgwYywgMHhhZmJlLCAweDIwMDEsCisJMHgwMTVkLCAweDIwMDMsIDB4MDAwMCwgMHgyMDA5LCAweDAzZTgsIDB4ODEwOSwgMHgwMTYwLCAweDIwMDEsCisJMHgwMjAxLCAweDIwMDQsIDB4OTAwNSwgMHgwZGM4LCAweDIwMDEsIDB4MDIxOCwgMHgyMDA0LCAweGQwZWMsCisJMHgxMTEwLCAweDA4MGMsIDB4MTU4YywgMHgyMDAxLCAweDAzMDcsIDB4MjAwMywgMHg4MDAwLCAweDAwMDUsCisJMHg3MDA0LCAweGMwOTUsIDB4NzAwNiwgMHgwMDA1LCAweDA4MGMsIDB4MTU4NywgMHgyMDYwLCAweDYwMTQsCisJMHgwMDk2LCAweDIwNDgsIDB4YTgzYiwgMHhmZmZmLCAweDAwOWUsIDB4MjAwOSwgMHgwMDQ4LCAweDA4MGMsCisJMHhhZmJlLCAweDAwMDUsIDB4MDgwYywgMHgxNTg3LCAweDA4MGMsIDB4MGRkNSwgMHgwODBjLCAweDE1ODcsCisJMHgwODBjLCAweDE0ZDYsIDB4NzgyNywgMHgwMDE4LCAweDc5YWMsIDB4ZDFkYywgMHgwOTA0LCAweDE0ODcsCisJMHg3ODI3LCAweDAwMTUsIDB4NzgyOCwgMHg3ODJiLCAweDAwMDAsIDB4OTA2NSwgMHgwMTQwLCAweDIwMDEsCisJMHgwMjBkLCAweDIwMDMsIDB4MDA1MCwgMHgyMDAzLCAweDAwMjAsIDB4MDgwNCwgMHgxNDhkLCAweDcwMDQsCisJMHg5MDA1LCAweDAxYzgsIDB4MTE4OCwgMHg3OGFiLCAweDAwMDQsIDB4NzgyNywgMHgwMDE4LCAweDc4MmIsCisJMHgwMDAwLCAweGQxYmMsIDB4MDkwYywgMHgwZGQ1LCAweDIwMDEsIDB4MDIwZCwgMHgyMDAzLCAweDAwNTAsCisJMHgyMDAzLCAweDAwMjAsIDB4MDgwNCwgMHgxNGJiLCAweDc4YWIsIDB4MDAwNCwgMHg3ODAzLCAweDAwMDEsCisJMHgwODBjLCAweDE0ZWYsIDB4MDAwNSwgMHg3ODI3LCAweDAwMTgsIDB4YTAwMSwgMHg3ODI4LCAweDc4MjcsCisJMHgwMDExLCAweGEwMDEsIDB4NzkyOCwgMHg5MTA2LCAweDAxMTAsIDB4NzlhYywgMHgwOGUwLCAweDAwZTYsCisJMHgyMDcxLCAweDAyMDAsIDB4NzAyYywgMHhkMGM0LCAweDAxNDAsIDB4MDBlZSwgMHgwODBjLCAweDFhZWMsCisJMHgwODBjLCAweDEzMTMsIDB4NzgwMywgMHgwMDAxLCAweDAwMDUsIDB4NzAzNywgMHgwMDAxLCAweGEwMDEsCisJMHg3MTUwLCAweDAwZWUsIDB4OTE4YywgMHhmZjAwLCAweDkxODYsIDB4MDUwMCwgMHgwMTEwLCAweDc5YWMsCisJMHgwODEwLCAweDcwMDQsIDB4YzA5ZCwgMHg3MDA2LCAweDc4YWIsIDB4MDAwNCwgMHg3ODAzLCAweDAwMDEsCisJMHgwODBjLCAweDE0ZWYsIDB4MjAwMSwgMHgwMjBkLCAweDIwMDMsIDB4MDAyMCwgMHgwMDA1LCAweDc4MjgsCisJMHg3ODJiLCAweDAwMDAsIDB4OTA2NSwgMHgwOTBjLCAweDBkZDUsIDB4NjAxNCwgMHgyMDQ4LCAweDc4YWIsCisJMHgwMDA0LCAweDkxOGMsIDB4MDcwMCwgMHgwMWE4LCAweDA4MGMsIDB4N2VkNywgMHgwODBjLCAweDFhZWMsCisJMHgwODBjLCAweGNjODYsIDB4MDE1OCwgMHhhOWFjLCAweGE5MzYsIDB4YTliMCwgMHhhOTNhLCAweGE4M2YsCisJMHhmZmZmLCAweGE4NDMsIDB4ZmZmZiwgMHhhODgwLCAweGMwYmQsIDB4YTg4MiwgMHgwODBjLCAweGM4YTUsCisJMHgwMDA1LCAweDYwMjAsIDB4OTA4NiwgMHgwMDA5LCAweDExMjgsIDB4MjAwOSwgMHgwMDRjLCAweDA4MGMsCisJMHhhZmJlLCAweDAwNDgsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsCisJMHg2MDI0LCAweDE5MGMsIDB4ZDA3MiwgMHgyMDI5LCAweDAwYzgsIDB4ODUyOSwgMHgwMTI4LCAweDIwMDEsCisJMHgwMjAxLCAweDIwMDQsIDB4OTAwNSwgMHgwZGM4LCAweDdkYmMsIDB4MDgwYywgMHhlYjUxLCAweGQ1YTQsCisJMHgxMTE4LCAweDA4MGMsIDB4MTU4YywgMHgwMDA1LCAweDA4MGMsIDB4N2VkNywgMHgwODBjLCAweDFhZWMsCisJMHgwMDA1LCAweDc4MWYsIDB4MDMwMCwgMHg3ODAzLCAweDAwMDEsIDB4MDAwNSwgMHgwMDE2LCAweDAwNjYsCisJMHgwMDc2LCAweDAwZjYsIDB4MjA3OSwgMHgwMzAwLCAweDc5MDgsIDB4OTE4YywgMHgwMDA3LCAweDkxODYsCisJMHgwMDAzLCAweDAxMjAsIDB4MjAwMSwgMHgwMDE2LCAweDA4MGMsIDB4MTVmZCwgMHgwMGZlLCAweDAwN2UsCisJMHgwMDZlLCAweDAwMWUsIDB4MDAwNSwgMHg3MDA0LCAweGMwOWQsIDB4NzAwNiwgMHgwMDA1LCAweDcxMDQsCisJMHg5MTg0LCAweDAwMDQsIDB4MTkwYywgMHgwZGQ1LCAweGQxODQsIDB4MTFiMSwgMHhkMTljLCAweDAxODAsCisJMHhjMTljLCAweDcxMDYsIDB4MDAxNiwgMHgwODBjLCAweDE2Y2EsIDB4MDAxZSwgMHgwMTQ4LCAweDIwMDEsCisJMHgwMjBkLCAweDIwMDMsIDB4MDA1MCwgMHgyMDAzLCAweDAwMjAsIDB4MDgwYywgMHgxNThjLCAweDAwMDUsCisJMHg4MWZmLCAweDE5MGMsIDB4MGRkNSwgMHgwMDA1LCAweDIxMDAsIDB4YzE4NCwgMHhjMWI0LCAweDcxMDYsCisJMHhkMGI0LCAweDAwMTYsIDB4MDBlNiwgMHgxOTA0LCAweDE1NTYsIDB4MjA3MSwgMHgwMjAwLCAweDA4MGMsCisJMHgxNmI3LCAweDA1ZTAsIDB4MDgwYywgMHgxNmNhLCAweDA1YjAsIDB4NjAxNCwgMHg5MDA1LCAweDA1YjAsCisJMHgwMDk2LCAweDIwNDgsIDB4YTg2NCwgMHgwMDllLCAweDkwODQsIDB4MDBmZiwgMHg5MDhlLCAweDAwMjksCisJMHgwMTYwLCAweDkwOGUsIDB4MDA0OCwgMHgxNTUwLCAweDYwMWMsIDB4ZDA4NCwgMHgxMWUwLCAweDAwZjYsCisJMHgyYzc4LCAweDA4MGMsIDB4MTc1NCwgMHgwMGZlLCAweDAwYjAsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsCisJMHgxOGRkLCAweDAwZmUsIDB4MjAwOSwgMHgwMWY0LCAweDgxMDksIDB4MDE2OCwgMHgyMDAxLCAweDAyMDEsCisJMHgyMDA0LCAweDkwMDUsIDB4MGRjOCwgMHgyMDAxLCAweDAyMTgsIDB4MjAwNCwgMHhkMGVjLCAweDExMTgsCisJMHgwODBjLCAweDE1OGMsIDB4MDA0MCwgMHgyMDAxLCAweDAyMGQsIDB4MjAwMywgMHgwMDIwLCAweDA4MGMsCisJMHgxMzEzLCAweDc4MDMsIDB4MDAwMSwgMHgwMGVlLCAweDAwMWUsIDB4MDAwNSwgMHgwODBjLCAweDE2Y2EsCisJMHgwZGQwLCAweDIwMDEsIDB4MDIwZCwgMHgyMDAzLCAweDAwNTAsIDB4MjAwMywgMHgwMDIwLCAweDA0NjEsCisJMHgwYzkwLCAweDA0MjksIDB4MjA2MCwgMHgyMDA5LCAweDAwNTMsIDB4MDgwYywgMHhhZmJlLCAweDAwMDUsCisJMHgwMDA1LCAweDAwMDUsIDB4MDBlMSwgMHgyMDA4LCAweDAwZDEsIDB4MDAwNiwgMHg3MDA0LCAweGMwOWQsCisJMHg3MDA2LCAweDAwMGUsIDB4MDgwYywgMHg4ZTIxLCAweDAwMDUsIDB4MDA4OSwgMHg5MDA1LCAweDAxMTgsCisJMHgwODBjLCAweDhhMjgsIDB4MGNkMCwgMHgwMDA1LCAweDIwMDEsIDB4MDAzNiwgMHgyMDA5LCAweDE4MjAsCisJMHgyMTBjLCAweDIwMTEsIDB4MTgxZiwgMHgyMjE0LCAweDA4MGMsIDB4MTVmZCwgMHgwMDA1LCAweDc4MDgsCisJMHhkMDljLCAweDBkZTgsIDB4NzgyMCwgMHgwMDA1LCAweDA4MGMsIDB4MTRkNiwgMHgwMGQ2LCAweDIwNjksCisJMHgwMjAwLCAweDIwMDksIDB4MDFmNCwgMHg4MTA5LCAweDA1MTAsIDB4NjgwNCwgMHg5MDA1LCAweDBkZDgsCisJMHgyMDAxLCAweDAxNWQsIDB4MjAwMywgMHgwMDAwLCAweDc5YmMsIDB4ZDFhNCwgMHgxNTI4LCAweDc5YjgsCisJMHg5MThjLCAweDBmZmYsIDB4MDE4MCwgMHg5MTgyLCAweDA4NDEsIDB4MTI2OCwgMHg5MTg4LCAweDAwMDcsCisJMHg5MThjLCAweDBmZjgsIDB4ODEwYywgMHg4MTBjLCAweDgxMGMsIDB4MDgwYywgMHgxNWVmLCAweDY4MjcsCisJMHgwMDAxLCAweDgxMDksIDB4MWRkMCwgMHgwNGQ5LCAweDY4MjcsIDB4MDAwMiwgMHgwNGMxLCAweDY4MDQsCisJMHg5MDA1LCAweDExMzAsIDB4NjgyYywgMHhkMGU0LCAweDE1MDAsIDB4NjgwNCwgMHg5MDA1LCAweDBkZTgsCisJMHg3OWI4LCAweGQxZWMsIDB4MTEzMCwgMHgwOGMwLCAweDA4MGMsIDB4N2VkNywgMHgwODBjLCAweDFhZWMsCisJMHgwMDkwLCAweDc4MjcsIDB4MDAxNSwgMHg3ODJiLCAweDAwMDAsIDB4NzgyNywgMHgwMDE4LCAweDc4MmIsCisJMHgwMDAwLCAweDIwMDEsIDB4MDIwZCwgMHgyMDAzLCAweDAwMjAsIDB4MjAwMSwgMHgwMzA3LCAweDIwMDMsCisJMHgwMzAwLCAweDc4MDMsIDB4MDAwMSwgMHgwMGRlLCAweDAwMDUsIDB4NjgyYywgMHg5MDg0LCAweDU0MDAsCisJMHg5MDg2LCAweDU0MDAsIDB4MGQzMCwgMHg3ODI3LCAweDAwMTUsIDB4NzgyYiwgMHgwMDAwLCAweDc4MDMsCisJMHgwMDAxLCAweDY4MDAsIDB4OTA4NSwgMHgxODAwLCAweDY4MDIsIDB4MDBkZSwgMHgwMDA1LCAweDY4MjQsCisJMHg5MDg0LCAweDAwMDMsIDB4MWRlMCwgMHgwMDA1LCAweDIwMDEsIDB4MDAzMCwgMHgyYzA4LCAweDYyMWMsCisJMHgwMDIxLCAweDc4MzAsIDB4OTA4NiwgMHgwMDQxLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAzMDAsCisJMHgwMDA2LCAweDc4MDgsIDB4ZDA5YywgMHgwMTQwLCAweDAwMTYsIDB4MDAyNiwgMHgwMGM2LCAweDA4MGMsCisJMHgxMzgwLCAweDAwY2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNiwgMHg3ODMyLCAweDc5MzYsCisJMHg3YTNhLCAweDc4MWIsIDB4ODA4MCwgMHgwMDU5LCAweDExMTgsIDB4MDAwZSwgMHgwMGZlLCAweDAwMDUsCisJMHgwMDBlLCAweDc5MmMsIDB4MzkwMCwgMHg4MDAwLCAweDIwMDQsIDB4MDgwYywgMHgwZGQ1LCAweDIwMDksCisJMHgxODBjLCAweDIxMDQsIDB4YzBmNCwgMHgyMDBhLCAweDIwMDksIDB4ZmYwMCwgMHg4MTA5LCAweDA5MDQsCisJMHgxNjdiLCAweDdhMTgsIDB4OTI4NCwgMHgwMDMwLCAweDA5MDQsIDB4MTY3NiwgMHg5Mjg0LCAweDAwNDgsCisJMHg5MDg2LCAweDAwMDgsIDB4MTkwNCwgMHgxNjc2LCAweDIwMDEsIDB4MDEwOSwgMHgyMDA0LCAweGQwOGMsCisJMHgwMWYwLCAweDAwMDYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDAxMjYsCisJMHgyMDkxLCAweDI4MDAsIDB4MDBmNiwgMHgwMDI2LCAweDAwMTYsIDB4MjAwOSwgMHgxYTdkLCAweDIxMDQsCisJMHg4MDAwLCAweDAyMDgsIDB4MjAwYSwgMHgwODBjLCAweDkxNjMsIDB4MDAxZSwgMHgwMDJlLCAweDAwZmUsCisJMHgwMTJlLCAweDAxNWUsIDB4MDE0ZSwgMHgwMTNlLCAweDAxZGUsIDB4MDFjZSwgMHgwMDBlLCAweDIwMDEsCisJMHgwMDliLCAweDIwMDQsIDB4ZDBmYywgMHgwMWQwLCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsCisJMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwMGY2LCAweDAwMTYsIDB4MjAwOSwgMHgxYTdlLCAweDIxMDQsCisJMHg4MDAwLCAweDAyMDgsIDB4MjAwYSwgMHgwODBjLCAweDFlZjIsIDB4MDAxZSwgMHgwMGZlLCAweDAxNWUsCisJMHgwMTRlLCAweDAxM2UsIDB4MDFkZSwgMHgwMWNlLCAweDAxMmUsIDB4MDAwZSwgMHg3ODE4LCAweGQwYmMsCisJMHgxOTA0LCAweDE2MjYsIDB4MDAwNSwgMHgyMDAxLCAweDE4MGMsIDB4MjAwNCwgMHhkMGY0LCAweDE1MjgsCisJMHg3YTE4LCAweDkyODQsIDB4MDAzMCwgMHgwNTA4LCAweDkyODQsIDB4MDA0OCwgMHg5MDg2LCAweDAwMDgsCisJMHgxMWUwLCAweDIwMDEsIDB4MTlmNSwgMHgyMDA0LCAweDkwMDUsIDB4MDFiOCwgMHgyMDAxLCAweDFhNjUsCisJMHgyMDA0LCAweDkwODYsIDB4MDAwMCwgMHgwMTg4LCAweDIwMDksIDB4MWE3YywgMHgyMTA0LCAweDgwMDAsCisJMHgwMjA4LCAweDIwMGEsIDB4MDgwYywgMHhhM2Q0LCAweDIwMDksIDB4MTgwYywgMHgyMTA0LCAweGMwZjUsCisJMHgyMDBhLCAweDIwMDksIDB4ZmYwMCwgMHgwODA0LCAweDE2MjYsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsCisJMHg3ODMyLCAweDc5MzYsIDB4N2EzYSwgMHg3ODFiLCAweDgwODAsIDB4MDgwYywgMHgxNjFmLCAweDExMDgsCisJMHgwMDA1LCAweDc5MmMsIDB4MzkwMCwgMHg4MDAwLCAweDIwMDQsIDB4MDgwYywgMHgwZGQ1LCAweDcwMzcsCisJMHgwMDAxLCAweDcxNTAsIDB4NzAzNywgMHgwMDAyLCAweDcwNTAsIDB4MjA2MCwgMHhkMWJjLCAweDExMTAsCisJMHg3MDU0LCAweDIwNjAsIDB4OTE4YywgMHhmZjAwLCAweDkxODYsIDB4MDUwMCwgMHgwMTEwLCAweDkwODUsCisJMHgwMDAxLCAweDAwMDUsIDB4MDAwNiwgMHgwMDQ2LCAweDAwZTYsIDB4MjA3MSwgMHgwMjAwLCAweDcwMzcsCisJMHgwMDAyLCAweDcwNTgsIDB4OTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4OTA4NiwgMHgwMGJjLCAweDExNTgsCisJMHgyMDIxLCAweDFhN2IsIDB4MjQwNCwgMHg4MDAwLCAweDAyMDgsIDB4MjAyMiwgMHgwODBjLCAweDdlZDcsCisJMHgwODBjLCAweDFhZWMsIDB4OTAwNiwgMHgwMGVlLCAweDAwNGUsIDB4MDAwZSwgMHgwMDA1LCAweDBjMTEsCisJMHgxMTA4LCAweDAwMDUsIDB4MDBlNiwgMHgwMDE2LCAweDIwNzEsIDB4MDIwMCwgMHgwODQxLCAweDYxMjQsCisJMHhkMWRjLCAweDAxZjgsIDB4NzAxYywgMHhkMDhjLCAweDA5MDQsIDB4MTc0OSwgMHg3MDE3LCAweDAwMDAsCisJMHgyMDAxLCAweDAyNjQsIDB4MjAwNCwgMHhkMGJjLCAweDA5MDQsIDB4MTc0OSwgMHgyMDAxLCAweDAyNjgsCisJMHgwMGM2LCAweDIwNjQsIDB4NjEwNCwgMHg2MDM4LCAweDAwY2UsIDB4OTE4ZSwgMHgwMDM5LCAweDE5MDQsCisJMHgxNzQ5LCAweDljMDYsIDB4MTVmMCwgMHgwMTI2LCAweDIwOTEsIDB4MjYwMCwgMHgwODBjLCAweDdlMWUsCisJMHgwMTJlLCAweDczNTgsIDB4NzQ1YywgMHg2MDE0LCAweDkwNWQsIDB4MDU5OCwgMHgyYjQ4LCAweDYwMTAsCisJMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MTkwYywgMHhkMDRkLCAweGFiNDIsCisJMHhhYzNlLCAweDIwMDEsIDB4MTg2OSwgMHgyMDA0LCAweGQwYjQsIDB4MTE3MCwgMHg2MDFjLCAweGQwZTQsCisJMHgxMTU4LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwgMHhkMGJjLCAweDExMjAsCisJMHhhODNiLCAweDdmZmYsIDB4YTgzNywgMHhmZmZmLCAweDA4MGMsIDB4MjBlZSwgMHgxMTkwLCAweDA4MGMsCisJMHgxOTNhLCAweDJhMDAsIDB4YTgxNiwgMHgwMTMwLCAweDI4MDAsIDB4YTgwZSwgMHgyYzA1LCAweGE4MGEsCisJMHgyYzAwLCAweGE4MTIsIDB4NzAzNywgMHgwMDIwLCAweDc4MWYsIDB4MDMwMCwgMHgwMDFlLCAweDAwZWUsCisJMHgwMDA1LCAweDcwMzcsIDB4MDA1MCwgMHg3MDM3LCAweDAwMjAsIDB4MDAxZSwgMHgwMGVlLCAweDA4MGMsCisJMHgxNThjLCAweDAwMDUsIDB4MDgwYywgMHgwZGQ1LCAweDJmZjAsIDB4MDEyNiwgMHgyMDkxLCAweDIyMDAsCisJMHgwMDE2LCAweDAwYzYsIDB4M2U2MCwgMHg2MDE0LCAweDIwNDgsIDB4Mjk0MCwgMHg5MDNlLCAweDI3MzAsCisJMHhhODY0LCAweDIwNjgsIDB4YTgxYSwgMHg5ZDg0LCAweDAwMGYsIDB4OTA4OCwgMHgyMGNlLCAweDIxNjUsCisJMHgwMDAyLCAweDE3ODAsIDB4MTdlZSwgMHgxNzgwLCAweDE3ODAsIDB4MTc4NCwgMHgxN2NmLCAweDE3ODAsCisJMHgxN2E0LCAweDE3NzksIDB4MTdlNSwgMHgxNzgwLCAweDE3ODAsIDB4MTc4OSwgMHgxOGRiLCAweDE3YjgsCisJMHgxN2FlLCAweGE5NjQsIDB4OTE4YywgMHgwMGZmLCAweDkxOGUsIDB4MDA0OCwgMHgwOTA0LCAweDE3ZTUsCisJMHg5MDg1LCAweDAwMDEsIDB4MDgwNCwgMHgxOGQxLCAweGE4N2MsIDB4ZDBhYywgMHgwZGM4LCAweDA4MDQsCisJMHgxN2Y1LCAweGE4N2MsIDB4ZDBhYywgMHgwZGEwLCAweDA4MDQsIDB4MTg2MCwgMHhhODk4LCAweDkwMWQsCisJMHgxMTA4LCAweGFiOWMsIDB4OTAxNiwgMHhhYWIyLCAweGFhM2UsIDB4YWE0MiwgMHgzZTAwLCAweDkwODAsCisJMHgwMDA4LCAweDIwMDQsIDB4OTA4MCwgMHg4ZmVmLCAweDIwMDUsIDB4OTAwNSwgMHgwOTBjLCAweDBkZDUsCisJMHgyMDA0LCAweGE4YWUsIDB4MDgwNCwgMHgxOGI5LCAweGE4N2MsIDB4ZDBiYywgMHgwOWM4LCAweGE4OTAsCisJMHhhODQyLCAweGE4OGMsIDB4YTgzZSwgMHhhODg4LCAweDA4MDQsIDB4MTdmNSwgMHhhODdjLCAweGQwYmMsCisJMHgwOTc4LCAweGE4OTAsIDB4YTg0MiwgMHhhODhjLCAweGE4M2UsIDB4YTg4OCwgMHgwODA0LCAweDE4NjAsCisJMHhhODdjLCAweGQwYmMsIDB4MDkyOCwgMHhhODkwLCAweGE4NDIsIDB4YTg4YywgMHhhODNlLCAweGE4MDQsCisJMHg5MDQ1LCAweDA5MGMsIDB4MGRkNSwgMHhhMTY0LCAweGE5MWEsIDB4OTFlYywgMHgwMDBmLCAweDlkODAsCisJMHgyMGNlLCAweDIwNjUsIDB4YTg4OCwgMHhkMTljLCAweDE5MDQsIDB4MTg2MCwgMHgwNDMwLCAweGE4N2MsCisJMHhkMGFjLCAweDA5MDQsIDB4MTc4MCwgMHhhODA0LCAweDkwNDUsIDB4MDkwYywgMHgwZGQ1LCAweGExNjQsCisJMHhhOTFhLCAweDkxZWMsIDB4MDAwZiwgMHg5ZDgwLCAweDIwY2UsIDB4MjA2NSwgMHg5MDA2LCAweGE4NDIsCisJMHhhODNlLCAweGQxOWMsIDB4MTkwNCwgMHgxODYwLCAweDAwODAsIDB4YTg3YywgMHhkMGFjLCAweDA5MDQsCisJMHgxNzgwLCAweDkwMDYsIDB4YTg0MiwgMHhhODNlLCAweDA4MDQsIDB4MTg2MCwgMHhhODdjLCAweGQwYWMsCisJMHgwOTA0LCAweDE3ODAsIDB4OTAwNiwgMHhhODQyLCAweGE4M2UsIDB4MmMwNSwgMHg5MDhhLCAweDAwMzYsCisJMHgxYTBjLCAweDBkZDUsIDB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4MTgxOCwgMHgxODE4LCAweDE4MWEsCisJMHgxODE4LCAweDE4MTgsIDB4MTgxOCwgMHgxODI0LCAweDE4MTgsIDB4MTgxOCwgMHgxODE4LCAweDE4MmUsCisJMHgxODE4LCAweDE4MTgsIDB4MTgxOCwgMHgxODM4LCAweDE4MTgsIDB4MTgxOCwgMHgxODE4LCAweDE4NDIsCisJMHgxODE4LCAweDE4MTgsIDB4MTgxOCwgMHgxODRjLCAweDE4MTgsIDB4MTgxOCwgMHgxODE4LCAweDE4NTYsCisJMHgwODBjLCAweDBkZDUsIDB4YTU3NCwgMHhhNDc4LCAweDlkODYsIDB4MDAyNCwgMHgwOTA0LCAweDE3OGUsCisJMHhhMzdjLCAweGEyODAsIDB4MDgwNCwgMHgxOGI5LCAweGE1ODQsIDB4YTQ4OCwgMHg5ZDg2LCAweDAwMjQsCisJMHgwOTA0LCAweDE3OGUsIDB4YTM4YywgMHhhMjkwLCAweDA4MDQsIDB4MThiOSwgMHhhNTk0LCAweGE0OTgsCisJMHg5ZDg2LCAweDAwMjQsIDB4MDkwNCwgMHgxNzhlLCAweGEzOWMsIDB4YTJhMCwgMHgwODA0LCAweDE4YjksCisJMHhhNWE0LCAweGE0YTgsIDB4OWQ4NiwgMHgwMDI0LCAweDA5MDQsIDB4MTc4ZSwgMHhhM2FjLCAweGEyYjAsCisJMHgwODA0LCAweDE4YjksIDB4YTViNCwgMHhhNGI4LCAweDlkODYsIDB4MDAyNCwgMHgwOTA0LCAweDE3OGUsCisJMHhhM2JjLCAweGEyYzAsIDB4MDgwNCwgMHgxOGI5LCAweGE1YzQsIDB4YTRjOCwgMHg5ZDg2LCAweDAwMjQsCisJMHgwOTA0LCAweDE3OGUsIDB4YTNjYywgMHhhMmQwLCAweDA4MDQsIDB4MThiOSwgMHhhNWQ0LCAweGE0ZDgsCisJMHg5ZDg2LCAweDAwMjQsIDB4MDkwNCwgMHgxNzhlLCAweGEzZGMsIDB4YTJlMCwgMHgwODA0LCAweDE4YjksCisJMHgyYzA1LCAweDkwOGEsIDB4MDAzNCwgMHgxYTBjLCAweDBkZDUsIDB4OTA4MiwgMHgwMDFiLCAweDAwMDIsCisJMHgxODgzLCAweDE4ODEsIDB4MTg4MSwgMHgxODgxLCAweDE4ODEsIDB4MTg4MSwgMHgxODhlLCAweDE4ODEsCisJMHgxODgxLCAweDE4ODEsIDB4MTg4MSwgMHgxODgxLCAweDE4OTksIDB4MTg4MSwgMHgxODgxLCAweDE4ODEsCisJMHgxODgxLCAweDE4ODEsIDB4MThhNCwgMHgxODgxLCAweDE4ODEsIDB4MTg4MSwgMHgxODgxLCAweDE4ODEsCisJMHgxOGFmLCAweDA4MGMsIDB4MGRkNSwgMHhhNTZjLCAweGE0NzAsIDB4YTc3NCwgMHhhNjc4LCAweDlkODYsCisJMHgwMDJjLCAweDA5MDQsIDB4MTc4ZSwgMHhhMzdjLCAweGEyODAsIDB4MDQ1OCwgMHhhNTg0LCAweGE0ODgsCisJMHhhNzhjLCAweGE2OTAsIDB4OWQ4NiwgMHgwMDJjLCAweDA5MDQsIDB4MTc4ZSwgMHhhMzk0LCAweGEyOTgsCisJMHgwNDAwLCAweGE1OWMsIDB4YTRhMCwgMHhhN2E0LCAweGE2YTgsIDB4OWQ4NiwgMHgwMDJjLCAweDA5MDQsCisJMHgxNzhlLCAweGEzYWMsIDB4YTJiMCwgMHgwMGE4LCAweGE1YjQsIDB4YTRiOCwgMHhhN2JjLCAweGE2YzAsCisJMHg5ZDg2LCAweDAwMmMsIDB4MDkwNCwgMHgxNzhlLCAweGEzYzQsIDB4YTJjOCwgMHgwMDUwLCAweGE1Y2MsCisJMHhhNGQwLCAweGE3ZDQsIDB4YTZkOCwgMHg5ZDg2LCAweDAwMmMsIDB4MDkwNCwgMHgxNzhlLCAweGEzZGMsCisJMHhhMmUwLCAweGFiMmUsIDB4YWEzMiwgMHhhZDFlLCAweGFjMjIsIDB4YWYyNiwgMHhhZTJhLCAweGE5ODgsCisJMHg4YzYwLCAweDJjMWQsIDB4YThhYywgMHhhYWIwLCAweGE4MzYsIDB4YWEzYSwgMHg4MTA5LCAweGE5MTYsCisJMHgxMTYwLCAweDNlNjAsIDB4NjAxYywgMHhjMDg1LCAweDYwMWUsIDB4YTg3YywgMHhjMGRkLCAweGE4N2UsCisJMHg5MDA2LCAweDAwY2UsIDB4MDAxZSwgMHgwMTJlLCAweDAwMDUsIDB4MjgwMCwgMHhhODBlLCAweGFiMGEsCisJMHgyYzAwLCAweGE4MTIsIDB4MGM3MCwgMHgwODA0LCAweDE3ODAsIDB4MmZmMCwgMHgwMTI2LCAweDIwOTEsCisJMHgyMjAwLCAweDAwMTYsIDB4MDBjNiwgMHgzZTYwLCAweDYwMTQsIDB4MjA0OCwgMHgyOTQwLCAweGE4MGUsCisJMHgyMDYxLCAweDIwYzksIDB4YTgxMywgMHgyMGM5LCAweDJjMDUsIDB4YTgwYSwgMHhhOTY0LCAweGE5MWEsCisJMHhhODdjLCAweGQwYWMsIDB4MDkwYywgMHgwZGQ1LCAweDkwMDYsIDB4YTg0MiwgMHhhODNlLCAweDJjMDUsCisJMHg5MDhhLCAweDAwMzQsIDB4MWEwYywgMHgwZGQ1LCAweGFkY2MsIDB4YWNkMCwgMHhhZmQ0LCAweGFlZDgsCisJMHhhYmRjLCAweGFhZTAsIDB4YWIyZSwgMHhhYTMyLCAweGFkMWUsIDB4YWMyMiwgMHhhZjI2LCAweGFlMmEsCisJMHhhOGFjLCAweGFhYjAsIDB4YTgzNiwgMHhhYTNhLCAweGE5ODgsIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsCisJMHg5MDg2LCAweDAwMDgsIDB4MTEyMCwgMHg4MTA5LCAweGE5MTYsIDB4MDEyOCwgMHgwMDgwLCAweDkxOGEsCisJMHgwMDAyLCAweGE5MTYsIDB4MTE2MCwgMHgzZTYwLCAweDYwMWMsIDB4YzA4NSwgMHg2MDFlLCAweGE4N2MsCisJMHhjMGRkLCAweGE4N2UsIDB4OTAwNiwgMHgwMGNlLCAweDAwMWUsIDB4MDEyZSwgMHgwMDA1LCAweGE4MDQsCisJMHg5MDQ1LCAweDA5MGMsIDB4MGRkNSwgMHhhODBlLCAweGEwNjQsIDB4YTgxYSwgMHg5MDg0LCAweDAwMGYsCisJMHg5MDgwLCAweDIwY2UsIDB4MjAxNSwgMHg4MmZmLCAweDA5MGMsIDB4MGRkNSwgMHhhYTEyLCAweDIyMDUsCisJMHhhODBhLCAweDBjMDgsIDB4OTAzZSwgMHgyNzMwLCAweGE4ODAsIDB4ZDBmYywgMHgxMTkwLCAweDJkMDAsCisJMHgwMDAyLCAweDFhNjQsIDB4MTk5MSwgMHgxOTkxLCAweDFhNjQsIDB4MTk5MSwgMHgxYTVlLCAweDFhNjQsCisJMHgxOTkxLCAweDFhMDEsIDB4MWEwMSwgMHgxYTAxLCAweDFhNjQsIDB4MWEwMSwgMHgxYTY0LCAweDFhNWIsCisJMHgxYTAxLCAweGMwZmMsIDB4YTg4MiwgMHhhYjJjLCAweGFhMzAsIDB4YWQxYywgMHhhYzIwLCAweGRkOWMsCisJMHgwOTA0LCAweDFhNjYsIDB4MmMwNSwgMHg5MDhhLCAweDAwMzQsIDB4MWEwYywgMHgwZGQ1LCAweDkwODIsCisJMHgwMDFiLCAweDAwMDIsIDB4MTk3ZCwgMHgxOTdiLCAweDE5N2IsIDB4MTk3YiwgMHgxOTdiLCAweDE5N2IsCisJMHgxOTgxLCAweDE5N2IsIDB4MTk3YiwgMHgxOTdiLCAweDE5N2IsIDB4MTk3YiwgMHgxOTg1LCAweDE5N2IsCisJMHgxOTdiLCAweDE5N2IsIDB4MTk3YiwgMHgxOTdiLCAweDE5ODksIDB4MTk3YiwgMHgxOTdiLCAweDE5N2IsCisJMHgxOTdiLCAweDE5N2IsIDB4MTk4ZCwgMHgwODBjLCAweDBkZDUsIDB4YTc3NCwgMHhhNjc4LCAweDA4MDQsCisJMHgxYTY2LCAweGE3OGMsIDB4YTY5MCwgMHgwODA0LCAweDFhNjYsIDB4YTdhNCwgMHhhNmE4LCAweDA4MDQsCisJMHgxYTY2LCAweGE3YmMsIDB4YTZjMCwgMHgwODA0LCAweDFhNjYsIDB4YTdkNCwgMHhhNmQ4LCAweDA4MDQsCisJMHgxYTY2LCAweGE4OTgsIDB4OTAxZCwgMHgxMTA4LCAweGFiOWMsIDB4OTAxNiwgMHgyYzA1LCAweDkwOGEsCisJMHgwMDM2LCAweDFhMGMsIDB4MGRkNSwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHgxOWI5LCAweDE5YjksCisJMHgxOWJiLCAweDE5YjksIDB4MTliOSwgMHgxOWI5LCAweDE5YzUsIDB4MTliOSwgMHgxOWI5LCAweDE5YjksCisJMHgxOWNmLCAweDE5YjksIDB4MTliOSwgMHgxOWI5LCAweDE5ZDksIDB4MTliOSwgMHgxOWI5LCAweDE5YjksCisJMHgxOWUzLCAweDE5YjksIDB4MTliOSwgMHgxOWI5LCAweDE5ZWQsIDB4MTliOSwgMHgxOWI5LCAweDE5YjksCisJMHgxOWY3LCAweDA4MGMsIDB4MGRkNSwgMHhhNTc0LCAweGE0NzgsIDB4OWQ4NiwgMHgwMDA0LCAweDA5MDQsCisJMHgxYTY2LCAweGEzN2MsIDB4YTI4MCwgMHgwODA0LCAweDFhNjYsIDB4YTU4NCwgMHhhNDg4LCAweDlkODYsCisJMHgwMDA0LCAweDA5MDQsIDB4MWE2NiwgMHhhMzhjLCAweGEyOTAsIDB4MDgwNCwgMHgxYTY2LCAweGE1OTQsCisJMHhhNDk4LCAweDlkODYsIDB4MDAwNCwgMHgwOTA0LCAweDFhNjYsIDB4YTM5YywgMHhhMmEwLCAweDA4MDQsCisJMHgxYTY2LCAweGE1YTQsIDB4YTRhOCwgMHg5ZDg2LCAweDAwMDQsIDB4MDkwNCwgMHgxYTY2LCAweGEzYWMsCisJMHhhMmIwLCAweDA4MDQsIDB4MWE2NiwgMHhhNWI0LCAweGE0YjgsIDB4OWQ4NiwgMHgwMDA0LCAweDA5MDQsCisJMHgxYTY2LCAweGEzYmMsIDB4YTJjMCwgMHgwODA0LCAweDFhNjYsIDB4YTVjNCwgMHhhNGM4LCAweDlkODYsCisJMHgwMDA0LCAweDA5MDQsIDB4MWE2NiwgMHhhM2NjLCAweGEyZDAsIDB4MDgwNCwgMHgxYTY2LCAweGE1ZDQsCisJMHhhNGQ4LCAweDlkODYsIDB4MDAwNCwgMHgwOTA0LCAweDFhNjYsIDB4YTNkYywgMHhhMmUwLCAweDA4MDQsCisJMHgxYTY2LCAweGE4OTgsIDB4OTAxZCwgMHgxMTA4LCAweGFiOWMsIDB4OTAxNiwgMHgyYzA1LCAweDkwOGEsCisJMHgwMDM0LCAweDFhMGMsIDB4MGRkNSwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHgxYTI5LCAweDFhMjcsCisJMHgxYTI3LCAweDFhMjcsIDB4MWEyNywgMHgxYTI3LCAweDFhMzMsIDB4MWEyNywgMHgxYTI3LCAweDFhMjcsCisJMHgxYTI3LCAweDFhMjcsIDB4MWEzZCwgMHgxYTI3LCAweDFhMjcsIDB4MWEyNywgMHgxYTI3LCAweDFhMjcsCisJMHgxYTQ3LCAweDFhMjcsIDB4MWEyNywgMHgxYTI3LCAweDFhMjcsIDB4MWEyNywgMHgxYTUxLCAweDA4MGMsCisJMHgwZGQ1LCAweGE1NmMsIDB4YTQ3MCwgMHhhNzc0LCAweGE2NzgsIDB4OWQ4NiwgMHgwMDBjLCAweDA1YjAsCisJMHhhMzdjLCAweGEyODAsIDB4MDQ5OCwgMHhhNTg0LCAweGE0ODgsIDB4YTc4YywgMHhhNjkwLCAweDlkODYsCisJMHgwMDBjLCAweDA1NjAsIDB4YTM5NCwgMHhhMjk4LCAweDA0NDgsIDB4YTU5YywgMHhhNGEwLCAweGE3YTQsCisJMHhhNmE4LCAweDlkODYsIDB4MDAwYywgMHgwNTEwLCAweGEzYWMsIDB4YTJiMCwgMHgwMGY4LCAweGE1YjQsCisJMHhhNGI4LCAweGE3YmMsIDB4YTZjMCwgMHg5ZDg2LCAweDAwMGMsIDB4MDFjMCwgMHhhM2M0LCAweGEyYzgsCisJMHgwMGE4LCAweGE1Y2MsIDB4YTRkMCwgMHhhN2Q0LCAweGE2ZDgsIDB4OWQ4NiwgMHgwMDBjLCAweDAxNzAsCisJMHhhM2RjLCAweGEyZTAsIDB4MDA1OCwgMHg5ZDg2LCAweDAwMGUsIDB4MTEzMCwgMHgwODBjLCAweDIwODYsCisJMHgxOTA0LCAweDE5M2EsIDB4OTAwZSwgMHgwMDUwLCAweDA4MGMsIDB4MGRkNSwgMHhhYjJlLCAweGFhMzIsCisJMHhhZDFlLCAweGFjMjIsIDB4YWYyNiwgMHhhZTJhLCAweDA4MGMsIDB4MjA4NiwgMHgwMDA1LCAweDYwMTQsCisJMHgyMDQ4LCAweDYxMTgsIDB4ODEwYywgMHg4MTBjLCAweDgxMGMsIDB4ODFmZiwgMHgxMTE4LCAweGE4ODcsCisJMHgwMDAxLCAweDAwMDgsIDB4YTk4NiwgMHg2MDFiLCAweDAwMDIsIDB4YTg3NCwgMHg5MDg0LCAweDAwZmYsCisJMHg5MDg0LCAweDAwMDgsIDB4MDE1MCwgMHgwMGU5LCAweDYwMDAsIDB4OTA4NiwgMHgwMDA0LCAweDExMjAsCisJMHgyMDA5LCAweDAwNDgsIDB4MDgwYywgMHhhZmJlLCAweDAwMDUsIDB4YTk3NCwgMHhkMWRjLCAweDExMDgsCisJMHgwMDA1LCAweGE5MzQsIDB4YTg4YywgMHg5MTA2LCAweDExNTgsIDB4YTkzOCwgMHhhODkwLCAweDkxMDYsCisJMHgxMTM4LCAweDYwMWMsIDB4YzA4NCwgMHg2MDFlLCAweDIwMDksIDB4MDA0OCwgMHgwODA0LCAweGFmYmUsCisJMHgwMDA1LCAweDAxMjYsIDB4MDBjNiwgMHgyMDkxLCAweDIyMDAsIDB4MDBjZSwgMHg3OTA4LCAweDkxOGMsCisJMHgwMDA3LCAweDkxODYsIDB4MDAwMCwgMHgwNWIwLCAweDkxODYsIDB4MDAwMywgMHgwNTk4LCAweDYwMjAsCisJMHg2MDIzLCAweDAwMDAsIDB4MDAwNiwgMHgyMDMxLCAweDAwMDgsIDB4MDBjNiwgMHg3ODFmLCAweDA4MDgsCisJMHg3ODA4LCAweGQwOWMsIDB4MDEyMCwgMHgwODBjLCAweDEzODAsIDB4ODYzMSwgMHgxZGI4LCAweDAwY2UsCisJMHg3ODFmLCAweDA4MDAsIDB4MjAzMSwgMHgwMTY4LCAweDAwYzYsIDB4NzgwOCwgMHhkMDljLCAweDE5MGMsCisJMHgxMzgwLCAweDAwY2UsIDB4MjAwMSwgMHgwMDM4LCAweDA4MGMsIDB4MWI3NCwgMHg3OTMwLCAweDkxODYsCisJMHgwMDQwLCAweDAxNjAsIDB4OTE4NiwgMHgwMDQyLCAweDE5MGMsIDB4MGRkNSwgMHgyMDAxLCAweDAwMWUsCisJMHg4MDAxLCAweDFkZjAsIDB4ODYzMSwgMHgxZDQwLCAweDA4MGMsIDB4MWI4MywgMHgwMDBlLCAweDYwMjIsCisJMHgwMTJlLCAweDAwMDUsIDB4MDgwYywgMHgxYjcwLCAweDc4MjcsIDB4MDAxNSwgMHg3ODI4LCAweDljMDYsCisJMHgxZGI4LCAweDc4MmIsIDB4MDAwMCwgMHgwY2EwLCAweDAwZjYsIDB4MjA3OSwgMHgwMzAwLCAweDc4MDMsCisJMHgwMDAwLCAweDc4YWIsIDB4MDAwNCwgMHgwMGZlLCAweDA4MGMsIDB4NzQzZSwgMHgxMTg4LCAweDIwMDEsCisJMHgwMTM4LCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDAxNjAsIDB4MjAwMywgMHgwMDAwLCAweDIwMTEsCisJMHgwMTJjLCAweGEwMDEsIDB4YTAwMSwgMHg4MjExLCAweDFkZTAsIDB4MDA1OSwgMHgwODA0LCAweDc0ZWUsCisJMHgwNDc5LCAweDAwMzksIDB4MjAwMSwgMHgwMTYwLCAweDI1MDIsIDB4MjAwMSwgMHgwMTM4LCAweDIyMDIsCisJMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgwMjAwLCAweDA4MGMsIDB4MmM4MiwgMHgyMDA5LCAweDAwM2MsCisJMHgwODBjLCAweDI0MTAsIDB4MjAwMSwgMHgwMTVkLCAweDIwMDMsIDB4MDAwMCwgMHg3MDAwLCAweDkwODQsCisJMHgwMDNjLCAweDFkZTAsIDB4MDgwYywgMHg4NGMyLCAweDcwYTAsIDB4NzBhMiwgMHg3MDk4LCAweDcwOWEsCisJMHg3MDljLCAweDcwOWUsIDB4MjAwMSwgMHgwMjBkLCAweDIwMDMsIDB4MDAyMCwgMHgwMGY2LCAweDIwNzksCisJMHgwMzAwLCAweDA4MGMsIDB4MTMxMywgMHg3ODAzLCAweDAwMDEsIDB4MDBmZSwgMHgwMGVlLCAweDAwMDUsCisJMHgyMDAxLCAweDAxMzgsIDB4MjAxNCwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgwMTYwLCAweDIwMmMsCisJMHgyMDAzLCAweDAwMDAsIDB4MDgwYywgMHg3NDNlLCAweDExMDgsIDB4MDAwNSwgMHgyMDIxLCAweDAyNjAsCisJMHgyMDAxLCAweDAxNDEsIDB4MjAxYywgMHhkM2RjLCAweDExNjgsIDB4MjAwMSwgMHgwMTA5LCAweDIwMWMsCisJMHg5MzljLCAweDAwNDgsIDB4MTE2MCwgMHgyMDAxLCAweDAxMTEsIDB4MjAxYywgMHg4M2ZmLCAweDExMTAsCisJMHg4NDIxLCAweDFkNzAsIDB4MjAwMSwgMHgwMTVkLCAweDIwMDMsIDB4MDAwMCwgMHgwMDA1LCAweDAwNDYsCisJMHgyMDIxLCAweDAwMTksIDB4MjAwMywgMHgwMDQ4LCAweGEwMDEsIDB4YTAwMSwgMHgyMDFjLCAweDkzOWMsCisJMHgwMDQ4LCAweDAxMjAsIDB4ODQyMSwgMHgxZGIwLCAweDAwNGUsIDB4MGM2MCwgMHgwMDRlLCAweDBjNDAsCisJMHg2MDFjLCAweGMwODQsIDB4NjAxZSwgMHgwMDA1LCAweDJjMDgsIDB4NjIxYywgMHgwODBjLCAweDE1ZmQsCisJMHg3OTMwLCAweDAwMDUsIDB4MmMwOCwgMHg2MjFjLCAweDA4MGMsIDB4MTZhOCwgMHg3OTMwLCAweDAwMDUsCisJMHg4MDAxLCAweDFkZjAsIDB4MDAwNSwgMHgyMDMxLCAweDAwNjQsIDB4NzgxYywgMHg5MDg0LCAweDAwMDcsCisJMHgwMTcwLCAweDIwMDEsIDB4MDAzOCwgMHgwYzQxLCAweDkxODYsIDB4MDA0MCwgMHgwOTA0LCAweDFiZTEsCisJMHgyMDAxLCAweDAwMWUsIDB4MGM2OSwgMHg4NjMxLCAweDFkODAsIDB4MDgwYywgMHgwZGQ1LCAweDc4MWYsCisJMHgwMjAyLCAweDIwMDEsIDB4MDE1ZCwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgwZGFjLCAweDBjMDEsCisJMHg3ODFjLCAweGQwODQsIDB4MDExMCwgMHgwODYxLCAweDA0ZTAsIDB4MjAwMSwgMHgwMDMwLCAweDA4OTEsCisJMHg5MTg2LCAweDAwNDAsIDB4MDU2OCwgMHg3ODFjLCAweGQwODQsIDB4MWRhOCwgMHg3ODFmLCAweDAxMDEsCisJMHgyMDAxLCAweDAwMTQsIDB4MDg2OSwgMHgyMDAxLCAweDAwMzcsIDB4MDgyMSwgMHg5MTg2LCAweDAwNDAsCisJMHgwMTQwLCAweDIwMDEsIDB4MDAzMCwgMHgwODBjLCAweDFiN2EsIDB4OTE4NiwgMHgwMDQwLCAweDE5MGMsCisJMHgwZGQ1LCAweDAwZDYsIDB4MjA2OSwgMHgwMjAwLCAweDY5MmMsIDB4ZDFmNCwgMHgxMTcwLCAweGQxYzQsCisJMHgwMTYwLCAweGQxOWMsIDB4MDEzMCwgMHg2ODAwLCAweDkwODUsIDB4MTgwMCwgMHg2ODAyLCAweDAwZGUsCisJMHgwMDgwLCAweDY5MDgsIDB4OTE4NCwgMHgwMDA3LCAweDFkYjAsIDB4MDBkZSwgMHg3ODFmLCAweDAxMDAsCisJMHg3OTFjLCAweDkxODQsIDB4MDAwNywgMHgwOTBjLCAweDBkZDUsIDB4YTAwMSwgMHhhMDAxLCAweDc4MWYsCisJMHgwMjAwLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDI0MDAsIDB4MjA3MSwgMHgxYTY1LCAweDIwNzksCisJMHgwMDkwLCAweDAxMmUsIDB4MDAwNSwgMHg5MjgwLCAweDAwMDUsIDB4MjAwNCwgMHgyMDQ4LCAweGE5N2MsCisJMHhkMWRjLCAweDE5MDQsIDB4MWM4MywgMHhhOTY0LCAweDkxODQsIDB4MDAwNywgMHgwMDAyLCAweDFiZmYsCisJMHgxYzZlLCAweDFjMTYsIDB4MWMxOCwgMHgxYzE2LCAweDFjNTYsIDB4MWMzNiwgMHgxYzI1LCAweDkxOGMsCisJMHgwMGZmLCAweDkxODYsIDB4MDAwOCwgMHgxMTcwLCAweGE4N2MsIDB4ZDBiNCwgMHgwOTA0LCAweDFlYWQsCisJMHg5MDA2LCAweGE4NDIsIDB4YTgzZSwgMHhhOTg4LCAweDI5MDAsIDB4YTg1YSwgMHhhODEzLCAweDIwYzksCisJMHgwODA0LCAweDFjN2YsIDB4OTE4NiwgMHgwMDQ4LCAweDA5MDQsIDB4MWM2ZSwgMHgwODBjLCAweDBkZDUsCisJMHg5MTg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDEzLCAweDA5MDQsIDB4MWM2ZSwgMHg5MTg0LCAweDAwZmYsCisJMHg5MDg2LCAweDAwMWIsIDB4MDkwNCwgMHgxYzZlLCAweDBjODgsIDB4YTg3YywgMHhkMGI0LCAweDA5MDQsCisJMHgxZWFkLCAweGE4OTAsIDB4YTg0MiwgMHhhODNhLCAweGE4OGMsIDB4YTgzZSwgMHhhODM2LCAweGE4YWMsCisJMHhhODQ2LCAweGE4YjAsIDB4YTg0YSwgMHhhOTg4LCAweDA4MDQsIDB4MWM3NiwgMHhhODY0LCAweDkwODQsCisJMHgwMGZmLCAweDkwODYsIDB4MDAxZSwgMHgxOWQwLCAweGE4N2MsIDB4ZDBiNCwgMHgwOTA0LCAweDFlYWQsCisJMHhhODkwLCAweGE4NDIsIDB4YTgzYSwgMHhhODhjLCAweGE4M2UsIDB4YTgzNiwgMHhhOGFjLCAweGE4NDYsCisJMHhhOGIwLCAweGE4NGEsIDB4YTgwNCwgMHhhODVhLCAweDIwNDAsIDB4YTA2NCwgMHg5MDg0LCAweDAwMGYsCisJMHg5MDgwLCAweDIwY2UsIDB4MjAwNSwgMHhhODEyLCAweGE5ODgsIDB4MDQ0OCwgMHg5MThjLCAweDAwZmYsCisJMHg5MTg2LCAweDAwMTUsIDB4MTU0MCwgMHhhODdjLCAweGQwYjQsIDB4MDkwNCwgMHgxZWFkLCAweGE4MDQsCisJMHhhODVhLCAweDIwNDAsIDB4YTA2NCwgMHg5MDg0LCAweDAwMGYsIDB4OTA4MCwgMHgyMGNlLCAweDIwMDUsCisJMHhhODEyLCAweGE5ODgsIDB4OTAwNiwgMHhhODQyLCAweGE4M2UsIDB4MDA4OCwgMHhhODdjLCAweGQwYjQsCisJMHgwOTA0LCAweDFlYWQsIDB4YTk4OCwgMHg5MDA2LCAweGE4NDIsIDB4YTgzZSwgMHgyOTAwLCAweGE4NWEsCisJMHhhODY0LCAweDkwODQsIDB4MDAwZiwgMHg5MDgwLCAweDIwY2UsIDB4MjAwNSwgMHhhODEyLCAweGE5MTYsCisJMHhhODdjLCAweGMwZGQsIDB4YTg3ZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMDkwLCAweDc4MmMsCisJMHhkMGZjLCAweDE5MGMsIDB4MWVmMiwgMHgwMGU2LCAweDIwNzEsIDB4MWE2NSwgMHg3MDAwLCAweDkwMDUsCisJMHgxOTA0LCAweDFjZWMsIDB4NzIwNiwgMHg5MjgwLCAweDAwMDUsIDB4MjA0YywgMHg5MjgwLCAweDAwMDQsCisJMHgyMDA0LCAweDc4MmIsIDB4MDAwNCwgMHgwMGY2LCAweDIwNzksIDB4MDIwMCwgMHg3ODAzLCAweDAwNDAsCisJMHgwMGZlLCAweDAwYjYsIDB4MjA1OCwgMHhiODZjLCAweDc4MzYsIDB4Yjg5MCwgMHgwMGJlLCAweDAwZjYsCisJMHgyMDc5LCAweDAyMDAsIDB4NzgwMywgMHgwMDQwLCAweGEwMDEsIDB4YTAwMSwgMHhhMDAxLCAweGEwMDEsCisJMHhhMDAxLCAweGEwMDEsIDB4NzgxYSwgMHgyMDc5LCAweDAxMDAsIDB4ODAwNCwgMHg3OGQ2LCAweDAwZmUsCisJMHhhODE0LCAweDIwNTAsIDB4YTg1OCwgMHgyMDQwLCAweGE4MTAsIDB4MjA2MCwgMHhhMDY0LCAweDkwZWMsCisJMHgwMDBmLCAweGE5NDQsIDB4NzkxYSwgMHg3MTE2LCAweGE4NDgsIDB4NzgxZSwgMHg3MDFhLCAweDkwMDYsCisJMHg3MDBlLCAweDcwMTIsIDB4NzAwNCwgMHhhOTQwLCAweGE4MzgsIDB4OTEwNiwgMHgxNTAwLCAweGE5M2MsCisJMHhhODM0LCAweDkxMDYsIDB4MTFlMCwgMHgwMDA2LCAweDAwMTYsIDB4YTkzOCwgMHhhODM0LCAweDkxMDUsCisJMHgwMTE4LCAweDAwMWUsIDB4MDAwZSwgMHgwMDk4LCAweDAwMWUsIDB4MDAwZSwgMHg4YWZmLCAweDAxYzgsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDA5LCAweDAzMDYsIDB4MjAwYiwgMHgwODA4LCAweDAwZDksCisJMHgwMTA4LCAweDAwYzksIDB4MDEyZSwgMHg5MDA2LCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDAwMzYsCisJMHgwMDQ2LCAweGFiMzgsIDB4YWMzNCwgMHgwODBjLCAweDIwZWUsIDB4MDA0ZSwgMHgwMDNlLCAweDBkMzAsCisJMHgwYzk4LCAweDkwODUsIDB4MDAwMSwgMHgwYzgwLCAweDIwMDksIDB4MDMwNiwgMHgyMDBiLCAweDQ4MDAsCisJMHg3MDI3LCAweDAwMDAsIDB4MDAwNSwgMHgwMDc2LCAweDAwNjYsIDB4MDA1NiwgMHgwMDQ2LCAweDAwMzYsCisJMHgwMDI2LCAweDhhZmYsIDB4MDkwNCwgMHgxZWE2LCAweDcwMGMsIDB4NzIxNCwgMHg5MjNhLCAweDcwMTAsCisJMHg3MjE4LCAweDkyMDMsIDB4MGEwNCwgMHgxZWE1LCAweDk3MDUsIDB4MDkwNCwgMHgxZWE1LCAweDkwM2UsCisJMHgyNzMwLCAweGE4ODAsIDB4ZDBmYywgMHgxMTkwLCAweDJkMDAsIDB4MDAwMiwgMHgxZTJmLCAweDFkNmUsCisJMHgxZDZlLCAweDFlMmYsIDB4MWUyZiwgMHgxZTBjLCAweDFlMmYsIDB4MWQ2ZSwgMHgxZTEzLCAweDFkYmQsCisJMHgxZGJkLCAweDFlMmYsIDB4MWUyZiwgMHgxZTJmLCAweDFlMDYsIDB4MWRiZCwgMHhjMGZjLCAweGE4ODIsCisJMHhhYjJjLCAweGFhMzAsIDB4YWQxYywgMHhhYzIwLCAweGRkOWMsIDB4MDkwNCwgMHgxZTNjLCAweDJjMDUsCisJMHg5MDhhLCAweDAwMzQsIDB4MWEwYywgMHgwZGQ1LCAweDkwODIsIDB4MDAxYiwgMHgwMDAyLCAweDFkNWEsCisJMHgxZDU4LCAweDFkNTgsIDB4MWQ1OCwgMHgxZDU4LCAweDFkNTgsIDB4MWQ1ZSwgMHgxZDU4LCAweDFkNTgsCisJMHgxZDU4LCAweDFkNTgsIDB4MWQ1OCwgMHgxZDYyLCAweDFkNTgsIDB4MWQ1OCwgMHgxZDU4LCAweDFkNTgsCisJMHgxZDU4LCAweDFkNjYsIDB4MWQ1OCwgMHgxZDU4LCAweDFkNTgsIDB4MWQ1OCwgMHgxZDU4LCAweDFkNmEsCisJMHgwODBjLCAweDBkZDUsIDB4YTc3NCwgMHhhNjc4LCAweDA4MDQsIDB4MWUzYywgMHhhNzhjLCAweGE2OTAsCisJMHgwODA0LCAweDFlM2MsIDB4YTdhNCwgMHhhNmE4LCAweDA4MDQsIDB4MWUzYywgMHhhN2JjLCAweGE2YzAsCisJMHgwODA0LCAweDFlM2MsIDB4YTdkNCwgMHhhNmQ4LCAweDA4MDQsIDB4MWUzYywgMHgyYzA1LCAweDkwOGEsCisJMHgwMDM2LCAweDFhMGMsIDB4MGRkNSwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHgxZDkxLCAweDFkOTEsCisJMHgxZDkzLCAweDFkOTEsIDB4MWQ5MSwgMHgxZDkxLCAweDFkOTksIDB4MWQ5MSwgMHgxZDkxLCAweDFkOTEsCisJMHgxZDlmLCAweDFkOTEsIDB4MWQ5MSwgMHgxZDkxLCAweDFkYTUsIDB4MWQ5MSwgMHgxZDkxLCAweDFkOTEsCisJMHgxZGFiLCAweDFkOTEsIDB4MWQ5MSwgMHgxZDkxLCAweDFkYjEsIDB4MWQ5MSwgMHgxZDkxLCAweDFkOTEsCisJMHgxZGI3LCAweDA4MGMsIDB4MGRkNSwgMHhhNTc0LCAweGE0NzgsIDB4YTM3YywgMHhhMjgwLCAweDA4MDQsCisJMHgxZTNjLCAweGE1ODQsIDB4YTQ4OCwgMHhhMzhjLCAweGEyOTAsIDB4MDgwNCwgMHgxZTNjLCAweGE1OTQsCisJMHhhNDk4LCAweGEzOWMsIDB4YTJhMCwgMHgwODA0LCAweDFlM2MsIDB4YTVhNCwgMHhhNGE4LCAweGEzYWMsCisJMHhhMmIwLCAweDA4MDQsIDB4MWUzYywgMHhhNWI0LCAweGE0YjgsIDB4YTNiYywgMHhhMmMwLCAweDA4MDQsCisJMHgxZTNjLCAweGE1YzQsIDB4YTRjOCwgMHhhM2NjLCAweGEyZDAsIDB4MDgwNCwgMHgxZTNjLCAweGE1ZDQsCisJMHhhNGQ4LCAweGEzZGMsIDB4YTJlMCwgMHgwODA0LCAweDFlM2MsIDB4MmMwNSwgMHg5MDhhLCAweDAwMzQsCisJMHgxYTBjLCAweDBkZDUsIDB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4MWRlMCwgMHgxZGRlLCAweDFkZGUsCisJMHgxZGRlLCAweDFkZGUsIDB4MWRkZSwgMHgxZGU4LCAweDFkZGUsIDB4MWRkZSwgMHgxZGRlLCAweDFkZGUsCisJMHgxZGRlLCAweDFkZjAsIDB4MWRkZSwgMHgxZGRlLCAweDFkZGUsIDB4MWRkZSwgMHgxZGRlLCAweDFkZjgsCisJMHgxZGRlLCAweDFkZGUsIDB4MWRkZSwgMHgxZGRlLCAweDFkZGUsIDB4MWRmZiwgMHgwODBjLCAweDBkZDUsCisJMHhhNTZjLCAweGE0NzAsIDB4YTc3NCwgMHhhNjc4LCAweGEzN2MsIDB4YTI4MCwgMHgwODA0LCAweDFlM2MsCisJMHhhNTg0LCAweGE0ODgsIDB4YTc4YywgMHhhNjkwLCAweGEzOTQsIDB4YTI5OCwgMHgwODA0LCAweDFlM2MsCisJMHhhNTljLCAweGE0YTAsIDB4YTdhNCwgMHhhNmE4LCAweGEzYWMsIDB4YTJiMCwgMHgwODA0LCAweDFlM2MsCisJMHhhNWI0LCAweGE0YjgsIDB4YTdiYywgMHhhNmMwLCAweGEzYzQsIDB4YTJjOCwgMHgwNGU4LCAweGE1Y2MsCisJMHhhNGQwLCAweGE3ZDQsIDB4YTZkOCwgMHhhM2RjLCAweGEyZTAsIDB4MDRiMCwgMHhhODY0LCAweDkwODQsCisJMHgwMGZmLCAweDkwODYsIDB4MDAxZSwgMHgxNTE4LCAweDA4MGMsIDB4MjA4NiwgMHgxOTA0LCAweDFkMDksCisJMHg5MDBlLCAweDA4MDQsIDB4MWVhNiwgMHhhYjY0LCAweDkzOWMsIDB4MDBmZiwgMHg5Mzg2LCAweDAwNDgsCisJMHgxMTgwLCAweDAwYzYsIDB4NzAwNCwgMHgyMDYwLCAweDYwMDQsIDB4OTA4NiwgMHgwMDQzLCAweDAwY2UsCisJMHgwOTA0LCAweDFkYmQsIDB4YWI5YywgMHg5MDE2LCAweGFkOGMsIDB4YWM5MCwgMHhhZjk0LCAweGFlOTgsCisJMHgwMDk4LCAweDkzODYsIDB4MDAwOCwgMHgwOTA0LCAweDFkYmQsIDB4MDgwYywgMHgwZGQ1LCAweGE5NjQsCisJMHg5MThjLCAweDAwZmYsIDB4OTE4NiwgMHgwMDEzLCAweDA5MDQsIDB4MWQ2ZSwgMHg5MTg2LCAweDAwMWIsCisJMHgwOTA0LCAweDFkYmQsIDB4MDgwYywgMHgwZGQ1LCAweDIwMDksIDB4MDMwZiwgMHgyMTA0LCAweGQwZmMsCisJMHgwNTMwLCAweDAwNjYsIDB4MjAwOSwgMHgwMzA2LCAweDIxMDQsIDB4OTA4NCwgMHgwMDMwLCAweDE1YzgsCisJMHgyMDMxLCAweDEwMDAsIDB4MjAwYiwgMHg0MDAwLCAweDI2MDAsIDB4OTMwMiwgMHg5MjhiLCAweDAwMDAsCisJMHhhODJlLCAweGE5MzIsIDB4MDI3OCwgMHg5MTA1LCAweDAxNjgsIDB4MjAxMSwgMHgwMDAwLCAweDI2MTgsCisJMHgyNjAwLCAweDk1MDAsIDB4YTgxZSwgMHg5NDgxLCAweDAwMDAsIDB4YTgyMiwgMHhhODgwLCAweGMwZmQsCisJMHhhODgyLCAweDAwMjAsIDB4YTgyZiwgMHgwMDAwLCAweGE4MzMsIDB4MDAwMCwgMHgwMDZlLCAweDdiMTIsCisJMHg3YTE2LCAweDdkMDIsIDB4N2MwNiwgMHg3ZjBhLCAweDdlMGUsIDB4NzgyYiwgMHgwMDAxLCAweDcwMDAsCisJMHg4MDAwLCAweDcwMDIsIDB4YTgzYywgMHg5MzAwLCAweGE4M2UsIDB4YTg0MCwgMHg5MjAxLCAweGE4NDIsCisJMHg3MDBjLCAweDkzMDAsIDB4NzAwZSwgMHg3MDEwLCAweDkyMDEsIDB4NzAxMiwgMHgwODBjLCAweDIwODYsCisJMHgwNDI4LCAweDIwMzEsIDB4MDA4MCwgMHg5NTg0LCAweDAwN2YsIDB4MDEwOCwgMHg5NjMyLCAweDcxMjQsCisJMHg3MDAwLCAweDkwODYsIDB4MDAwMCwgMHgxMTk4LCAweGMxODUsIDB4NzEyNiwgMHgyMDA5LCAweDAzMDYsCisJMHgyMTA0LCAweGQwYjQsIDB4MTkwNCwgMHgxZTRjLCAweDIwMGIsIDB4NDA0MCwgMHgyMDA5LCAweDFhN2YsCisJMHgyMTA0LCAweDgwMDAsIDB4MGEwNCwgMHgxZTRjLCAweDIwMGEsIDB4MDgwNCwgMHgxZTRjLCAweGMxOGQsCisJMHg3MTI2LCAweGQxODQsIDB4MWQ1OCwgMHgwODA0LCAweDFlNGMsIDB4OTAwNiwgMHgwMDJlLCAweDAwM2UsCisJMHgwMDRlLCAweDAwNWUsIDB4MDA2ZSwgMHgwMDdlLCAweDAwMDUsIDB4MDgwYywgMHgwZGQ1LCAweDAwMjYsCisJMHgyMDAxLCAweDAxMDUsIDB4MjAwMywgMHgwMDEwLCAweDc4MmIsIDB4MDAwNCwgMHg3MDAzLCAweDAwMDAsCisJMHg3MDA0LCAweDAwMTYsIDB4MDgwYywgMHgxY2ZjLCAweDAwMWUsIDB4MjA2MCwgMHg2MDE0LCAweDIwNDgsCisJMHgwODBjLCAweGNjODYsIDB4MDExOCwgMHhhODgwLCAweGMwYmQsIDB4YTg4MiwgMHg2MDIwLCAweDkwODYsCisJMHgwMDA2LCAweDExODAsIDB4MjA2MSwgMHgwMTAwLCAweDYyYzgsIDB4MjAwMSwgMHgwMGZhLCAweDgwMDEsCisJMHgxZGYwLCAweDYwYzgsIDB4OTIwNiwgMHgxZGMwLCAweDYwYzQsIDB4YTg5YSwgMHg2MGM4LCAweGE4OTYsCisJMHg3MDA0LCAweDIwNjAsIDB4MDBjNiwgMHgwODBjLCAweGM4YTUsIDB4MDBjZSwgMHgyMDAxLCAweDE5ZjUsCisJMHgyMDA0LCAweDljMDYsIDB4MTE2MCwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywgMHgyNDEwLCAweDA4MGMsCisJMHhhODliLCAweDIwMTEsIDB4MDAwMCwgMHgwODBjLCAweGE3MmMsIDB4MDgwYywgMHg5ODkxLCAweDAwMmUsCisJMHgwODA0LCAweDIwMzYsIDB4MDEyNiwgMHgyMDkxLCAweDI0MDAsIDB4YTg1OCwgMHgyMDQwLCAweDc5MmMsCisJMHg3ODJiLCAweDAwMDIsIDB4OTE4NCwgMHgwNzAwLCAweDE5MDQsIDB4MWVhZiwgMHg3MDAwLCAweDAwMDIsCisJMHgyMDM2LCAweDFmMDQsIDB4MWY4NCwgMHgyMDM0LCAweDgwMDEsIDB4NzAwMiwgMHg3MDI3LCAweDAwMDAsCisJMHhkMTljLCAweDExNTgsIDB4OGFmZiwgMHgwOTA0LCAweDFmNTEsIDB4MDgwYywgMHgxZDAzLCAweDA5MDQsCisJMHgyMDM2LCAweDA4MGMsIDB4MWQwMywgMHgwODA0LCAweDIwMzYsIDB4NzgyYiwgMHgwMDA0LCAweGQxOTQsCisJMHgwMTQ4LCAweGE4ODAsIDB4YzBmYywgMHhhODgyLCAweDhhZmYsIDB4MTUxOCwgMHhhODdjLCAweGMwZjUsCisJMHhhODdlLCAweDAwZjgsIDB4MDAyNiwgMHgwMDM2LCAweGFiM2MsIDB4YWE0MCwgMHgwMDE2LCAweDc5MTAsCisJMHhhODJjLCAweDkxMDAsIDB4YTgyZSwgMHg3OTE0LCAweGE4MzAsIDB4OTEwMSwgMHhhODMyLCAweDAwMWUsCisJMHg3ODEwLCAweDkzMWEsIDB4NzgxNCwgMHg5MjEzLCAweDc4MDAsIDB4YTgxZSwgMHg3ODA0LCAweGE4MjIsCisJMHhhYjNlLCAweGFhNDIsIDB4MDAzZSwgMHgwMDJlLCAweDA4MGMsIDB4MjBhMSwgMHhhODgwLCAweGMwZmQsCisJMHhhODgyLCAweDJhMDAsIDB4YTgxNiwgMHgyODAwLCAweGE4NWEsIDB4MmMwMCwgMHhhODEyLCAweDcwMDMsCisJMHgwMDAwLCAweDIwMDksIDB4MDMwNiwgMHgyMDBiLCAweDQ4MDAsIDB4NzAyNywgMHgwMDAwLCAweDA4MDQsCisJMHgyMDM2LCAweDAwZjYsIDB4MDAyNiwgMHg3ODFjLCAweDAwMDYsIDB4NzgxOCwgMHgwMDA2LCAweDIwNzksCisJMHgwMTAwLCAweDdhMTQsIDB4OTI4NCwgMHgxOTg0LCAweDkwODUsIDB4MDAxMiwgMHg3ODE2LCAweDAwMzYsCisJMHgyMDE5LCAweDEwMDAsIDB4ODMxOSwgMHgwOTBjLCAweDBkZDUsIDB4NzgyMCwgMHhkMGJjLCAweDFkZDAsCisJMHgwMDNlLCAweDc5YzgsIDB4MDAwZSwgMHg5MTAyLCAweDAwMWUsIDB4MDAwNiwgMHgwMDE2LCAweDc5YzQsCisJMHgwMDBlLCAweDkxMDMsIDB4NzhjNiwgMHgwMDBlLCAweDc4Y2EsIDB4OTI4NCwgMHgxOTg0LCAweDkwODUsCisJMHgwMDEyLCAweDc4MTYsIDB4MDAyZSwgMHgwMGZlLCAweDc4MmIsIDB4MDAwOCwgMHg3MDAzLCAweDAwMDAsCisJMHgwODBjLCAweDFjZmMsIDB4MDgwNCwgMHgyMDM2LCAweDgwMDEsIDB4NzAwMiwgMHg3MDI0LCAweDgwMDQsCisJMHg3MDI2LCAweGQxOTQsIDB4MDE3MCwgMHg3ODJjLCAweGQwZmMsIDB4MTkwNCwgMHgxZWY3LCAweGQxOWMsCisJMHgxOTA0LCAweDIwMzIsIDB4OGFmZiwgMHgwOTA0LCAweDIwMzYsIDB4MDgwYywgMHgxZDAzLCAweDA4MDQsCisJMHgyMDM2LCAweDAwMjYsIDB4MDAzNiwgMHhhYjNjLCAweGFhNDAsIDB4MDgwYywgMHgyMGExLCAweGRkOWMsCisJMHgxOTA0LCAweDFmZjEsIDB4MmMwNSwgMHg5MDhhLCAweDAwMzYsIDB4MWEwYywgMHgwZGQ1LCAweDkwODIsCisJMHgwMDFiLCAweDAwMDIsIDB4MWZjNSwgMHgxZmM1LCAweDFmYzcsIDB4MWZjNSwgMHgxZmM1LCAweDFmYzUsCisJMHgxZmNkLCAweDFmYzUsIDB4MWZjNSwgMHgxZmM1LCAweDFmZDMsIDB4MWZjNSwgMHgxZmM1LCAweDFmYzUsCisJMHgxZmQ5LCAweDFmYzUsIDB4MWZjNSwgMHgxZmM1LCAweDFmZGYsIDB4MWZjNSwgMHgxZmM1LCAweDFmYzUsCisJMHgxZmU1LCAweDFmYzUsIDB4MWZjNSwgMHgxZmM1LCAweDFmZWIsIDB4MDgwYywgMHgwZGQ1LCAweGEwN2MsCisJMHg5MzFhLCAweGEwODAsIDB4OTIxMywgMHgwODA0LCAweDFmMjYsIDB4YTA4YywgMHg5MzFhLCAweGEwOTAsCisJMHg5MjEzLCAweDA4MDQsIDB4MWYyNiwgMHhhMDljLCAweDkzMWEsIDB4YTBhMCwgMHg5MjEzLCAweDA4MDQsCisJMHgxZjI2LCAweGEwYWMsIDB4OTMxYSwgMHhhMGIwLCAweDkyMTMsIDB4MDgwNCwgMHgxZjI2LCAweGEwYmMsCisJMHg5MzFhLCAweGEwYzAsIDB4OTIxMywgMHgwODA0LCAweDFmMjYsIDB4YTBjYywgMHg5MzFhLCAweGEwZDAsCisJMHg5MjEzLCAweDA4MDQsIDB4MWYyNiwgMHhhMGRjLCAweDkzMWEsIDB4YTBlMCwgMHg5MjEzLCAweDA4MDQsCisJMHgxZjI2LCAweDJjMDUsIDB4OTA4YSwgMHgwMDM0LCAweDFhMGMsIDB4MGRkNSwgMHg5MDgyLCAweDAwMWIsCisJMHgwMDAyLCAweDIwMTQsIDB4MjAxMiwgMHgyMDEyLCAweDIwMTIsIDB4MjAxMiwgMHgyMDEyLCAweDIwMWEsCisJMHgyMDEyLCAweDIwMTIsIDB4MjAxMiwgMHgyMDEyLCAweDIwMTIsIDB4MjAyMCwgMHgyMDEyLCAweDIwMTIsCisJMHgyMDEyLCAweDIwMTIsIDB4MjAxMiwgMHgyMDI2LCAweDIwMTIsIDB4MjAxMiwgMHgyMDEyLCAweDIwMTIsCisJMHgyMDEyLCAweDIwMmMsIDB4MDgwYywgMHgwZGQ1LCAweGEwN2MsIDB4OTMxYSwgMHhhMDgwLCAweDkyMTMsCisJMHgwODA0LCAweDFmMjYsIDB4YTA5NCwgMHg5MzFhLCAweGEwOTgsIDB4OTIxMywgMHgwODA0LCAweDFmMjYsCisJMHhhMGFjLCAweDkzMWEsIDB4YTBiMCwgMHg5MjEzLCAweDA4MDQsIDB4MWYyNiwgMHhhMGM0LCAweDkzMWEsCisJMHhhMGM4LCAweDkyMTMsIDB4MDgwNCwgMHgxZjI2LCAweGEwZGMsIDB4OTMxYSwgMHhhMGUwLCAweDkyMTMsCisJMHgwODA0LCAweDFmMjYsIDB4MDgwNCwgMHgxZjIyLCAweDA4MGMsIDB4MGRkNSwgMHgwMTJlLCAweDAwMDUsCisJMHgwMGY2LCAweDAwZTYsIDB4MjA3MSwgMHgxYTY1LCAweDcwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDA5MDQsCisJMHgyMDgxLCAweDIwNzksIDB4MDA5MCwgMHgyMDA5LCAweDAyMDcsIDB4MjEwYywgMHhkMTk0LCAweDAxYjgsCisJMHgyMDA5LCAweDAyMGMsIDB4MjEwYywgMHg5MTg0LCAweDAwMDMsIDB4MDE4OCwgMHgwODBjLCAweGViOWEsCisJMHgyMDAxLCAweDAxMzMsIDB4MjAwNCwgMHg5MDA1LCAweDA5MGMsIDB4MGRkNSwgMHgwMDE2LCAweDIwMDksCisJMHgwMDQwLCAweDA4MGMsIDB4MjQxMCwgMHgwMDFlLCAweDIwMDEsIDB4MDIwYywgMHgyMTAyLCAweDIwMDksCisJMHgwMjA2LCAweDIxMDQsIDB4MjAwOSwgMHgwMjAzLCAweDIxMGMsIDB4OTEwNiwgMHgxMTIwLCAweDIwMDksCisJMHgwMDQwLCAweDA4MGMsIDB4MjQxMCwgMHg3ODJjLCAweGQwZmMsIDB4MDlhOCwgMHgwODBjLCAweDFlZjIsCisJMHg3MDAwLCAweDkwODYsIDB4MDAwMCwgMHgxOTc4LCAweDc4MmIsIDB4MDAwNCwgMHg3ODJjLCAweGQwYWMsCisJMHgxZGU4LCAweDIwMDksIDB4MDA0MCwgMHgwODBjLCAweDI0MTAsIDB4NzgyYiwgMHgwMDAyLCAweDcwMDMsCisJMHgwMDAwLCAweDA4MGMsIDB4MWNmYywgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHhhODgwLCAweGQwZmMsCisJMHgxMWE4LCAweDhjNjAsIDB4MmMwNSwgMHg5MDA1LCAweDAxMTAsIDB4OGE1MSwgMHgwMDA1LCAweGEwMDQsCisJMHg5MDA1LCAweDAxNjgsIDB4YTg1YSwgMHgyMDQwLCAweGEwNjQsIDB4OTA4NCwgMHgwMDBmLCAweDkwODAsCisJMHgyMGNlLCAweDIwNjUsIDB4OGNmZiwgMHgwOTBjLCAweDBkZDUsIDB4OGE1MSwgMHgwMDA1LCAweDIwNTAsCisJMHgwMDA1LCAweGE4ODAsIDB4ZDBmYywgMHgxMWI4LCAweDhhNTAsIDB4OGM2MSwgMHgyYzA1LCAweDkwMDUsCisJMHgxMTkwLCAweDI4MDAsIDB4OTkwNiwgMHgwMTIwLCAweGEwMDAsIDB4OTAwNSwgMHgxMTA4LCAweDI5MDAsCisJMHgyMDQwLCAweGE4NWEsIDB4YTA2NCwgMHg5MDg0LCAweDAwMGYsIDB4OTA4MCwgMHgyMGRlLCAweDIwNjUsCisJMHg4Y2ZmLCAweDA5MGMsIDB4MGRkNSwgMHgwMDA1LCAweDAwMDAsIDB4MDAxZCwgMHgwMDIxLCAweDAwMjUsCisJMHgwMDI5LCAweDAwMmQsIDB4MDAzMSwgMHgwMDM1LCAweDAwMDAsIDB4MDAxYiwgMHgwMDIxLCAweDAwMjcsCisJMHgwMDJkLCAweDAwMzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMjMsIDB4MDAwMCwgMHgwMDAwLCAweDIwYzEsCisJMHgyMGJkLCAweDIwYzEsIDB4MjBjMSwgMHgyMGNiLCAweDAwMDAsIDB4MjBjMSwgMHgyMGM4LCAweDIwYzgsCisJMHgyMGM1LCAweDIwYzgsIDB4MjBjOCwgMHgwMDAwLCAweDIwY2IsIDB4MjBjOCwgMHgwMDAwLCAweDIwYzMsCisJMHgyMGMzLCAweDAwMDAsIDB4MjBjMywgMHgyMGNiLCAweDAwMDAsIDB4MjBjMywgMHgyMGM5LCAweDIwYzksCisJMHgyMGM5LCAweDAwMDAsIDB4MjBjOSwgMHgwMDAwLCAweDIwY2IsIDB4MjBjOSwgMHgwMGM2LCAweDAwZDYsCisJMHgwMDg2LCAweGFiNDIsIDB4YWMzZSwgMHhhODg4LCAweDkwNTUsIDB4MDkwNCwgMHgyMmNkLCAweDI5NDAsCisJMHhhMDY0LCAweDkwZWMsIDB4MDAwZiwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDA4LCAweDExMTgsCisJMHgyMDYxLCAweDIwYzksIDB4MDBkMCwgMHg5ZGUwLCAweDIwY2UsIDB4OWQ4NiwgMHgwMDA3LCAweDAxMzAsCisJMHg5ZDg2LCAweDAwMGUsIDB4MDExOCwgMHg5ZDg2LCAweDAwMGYsIDB4MTEyMCwgMHhhMDhjLCAweDk0MjIsCisJMHhhMDkwLCAweDkzMWIsIDB4MmMwNSwgMHg5MDY1LCAweDExNDAsIDB4MDMxMCwgMHgwODA0LCAweDIyY2QsCisJMHhhMDA0LCAweDkwNDUsIDB4MDkwNCwgMHgyMmNkLCAweDA4ZDgsIDB4MmMwNSwgMHg5MDA1LCAweDA5MDQsCisJMHgyMWI1LCAweGRkOWMsIDB4MTkwNCwgMHgyMTcxLCAweDkwOGEsIDB4MDAzNiwgMHgxYTBjLCAweDBkZDUsCisJMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHgyMTQ2LCAweDIxNDYsIDB4MjE0OCwgMHgyMTQ2LCAweDIxNDYsCisJMHgyMTQ2LCAweDIxNGUsIDB4MjE0NiwgMHgyMTQ2LCAweDIxNDYsIDB4MjE1NCwgMHgyMTQ2LCAweDIxNDYsCisJMHgyMTQ2LCAweDIxNWEsIDB4MjE0NiwgMHgyMTQ2LCAweDIxNDYsIDB4MjE2MCwgMHgyMTQ2LCAweDIxNDYsCisJMHgyMTQ2LCAweDIxNjYsIDB4MjE0NiwgMHgyMTQ2LCAweDIxNDYsIDB4MjE2YywgMHgwODBjLCAweDBkZDUsCisJMHhhMDdjLCAweDk0MjIsIDB4YTA4MCwgMHg5MzFiLCAweDA4MDQsIDB4MjFhYiwgMHhhMDhjLCAweDk0MjIsCisJMHhhMDkwLCAweDkzMWIsIDB4MDgwNCwgMHgyMWFiLCAweGEwOWMsIDB4OTQyMiwgMHhhMGEwLCAweDkzMWIsCisJMHgwODA0LCAweDIxYWIsIDB4YTBhYywgMHg5NDIyLCAweGEwYjAsIDB4OTMxYiwgMHgwODA0LCAweDIxYWIsCisJMHhhMGJjLCAweDk0MjIsIDB4YTBjMCwgMHg5MzFiLCAweDA4MDQsIDB4MjFhYiwgMHhhMGNjLCAweDk0MjIsCisJMHhhMGQwLCAweDkzMWIsIDB4MDgwNCwgMHgyMWFiLCAweGEwZGMsIDB4OTQyMiwgMHhhMGUwLCAweDkzMWIsCisJMHgwNGQwLCAweDkwOGEsIDB4MDAzNCwgMHgxYTBjLCAweDBkZDUsIDB4OTA4MiwgMHgwMDFiLCAweDAwMDIsCisJMHgyMTkzLCAweDIxOTEsIDB4MjE5MSwgMHgyMTkxLCAweDIxOTEsIDB4MjE5MSwgMHgyMTk4LCAweDIxOTEsCisJMHgyMTkxLCAweDIxOTEsIDB4MjE5MSwgMHgyMTkxLCAweDIxOWQsIDB4MjE5MSwgMHgyMTkxLCAweDIxOTEsCisJMHgyMTkxLCAweDIxOTEsIDB4MjFhMiwgMHgyMTkxLCAweDIxOTEsIDB4MjE5MSwgMHgyMTkxLCAweDIxOTEsCisJMHgyMWE3LCAweDA4MGMsIDB4MGRkNSwgMHhhMDdjLCAweDk0MjIsIDB4YTA4MCwgMHg5MzFiLCAweDAwOTgsCisJMHhhMDk0LCAweDk0MjIsIDB4YTA5OCwgMHg5MzFiLCAweDAwNzAsIDB4YTBhYywgMHg5NDIyLCAweGEwYjAsCisJMHg5MzFiLCAweDAwNDgsIDB4YTBjNCwgMHg5NDIyLCAweGEwYzgsIDB4OTMxYiwgMHgwMDIwLCAweGEwZGMsCisJMHg5NDIyLCAweGEwZTAsIDB4OTMxYiwgMHgwNjMwLCAweDIzMDAsIDB4OTQwNSwgMHgwMTYwLCAweDhhNTEsCisJMHgwOTA0LCAweDIyY2QsIDB4OGM2MCwgMHgwODA0LCAweDIxMWQsIDB4YTAwNCwgMHg5MDQ1LCAweDA5MDQsCisJMHgyMmNkLCAweDA4MDQsIDB4MjBmOCwgMHg4YTUxLCAweDA5MDQsIDB4MjJjZCwgMHg4YzYwLCAweDJjMDUsCisJMHg5MDA1LCAweDExNTgsIDB4YTAwNCwgMHg5MDQ1LCAweDA5MDQsIDB4MjJjZCwgMHhhMDY0LCAweDkwZWMsCisJMHgwMDBmLCAweDlkZTAsIDB4MjBjZSwgMHgyYzA1LCAweDIwNjAsIDB4YTg4MCwgMHhjMGZjLCAweGE4ODIsCisJMHgwODA0LCAweDIyYzIsIDB4MmMwNSwgMHg4NDIyLCAweDg0MjAsIDB4ODMxYSwgMHg5Mzk5LCAweDAwMDAsCisJMHhhYzJlLCAweGFiMzIsIDB4ZGQ5YywgMHgxOTA0LCAweDIyNWYsIDB4OTA4MiwgMHgwMDFiLCAweDAwMDIsCisJMHgyMWZiLCAweDIxZmIsIDB4MjFmZCwgMHgyMWZiLCAweDIxZmIsIDB4MjFmYiwgMHgyMjBiLCAweDIxZmIsCisJMHgyMWZiLCAweDIxZmIsIDB4MjIxOSwgMHgyMWZiLCAweDIxZmIsIDB4MjFmYiwgMHgyMjI3LCAweDIxZmIsCisJMHgyMWZiLCAweDIxZmIsIDB4MjIzNSwgMHgyMWZiLCAweDIxZmIsIDB4MjFmYiwgMHgyMjQzLCAweDIxZmIsCisJMHgyMWZiLCAweDIxZmIsIDB4MjI1MSwgMHgwODBjLCAweDBkZDUsIDB4YTE3YywgMHgyNDAwLCAweDkxMjIsCisJMHhhMTgwLCAweDIzMDAsIDB4OTExYiwgMHgwYTBjLCAweDBkZDUsIDB4YTA3NCwgMHg5NDIwLCAweGEwNzgsCisJMHg5MzE5LCAweDA4MDQsIDB4MjJiZCwgMHhhMThjLCAweDI0MDAsIDB4OTEyMiwgMHhhMTkwLCAweDIzMDAsCisJMHg5MTFiLCAweDBhMGMsIDB4MGRkNSwgMHhhMDg0LCAweDk0MjAsIDB4YTA4OCwgMHg5MzE5LCAweDA4MDQsCisJMHgyMmJkLCAweGExOWMsIDB4MjQwMCwgMHg5MTIyLCAweGExYTAsIDB4MjMwMCwgMHg5MTFiLCAweDBhMGMsCisJMHgwZGQ1LCAweGEwOTQsIDB4OTQyMCwgMHhhMDk4LCAweDkzMTksIDB4MDgwNCwgMHgyMmJkLCAweGExYWMsCisJMHgyNDAwLCAweDkxMjIsIDB4YTFiMCwgMHgyMzAwLCAweDkxMWIsIDB4MGEwYywgMHgwZGQ1LCAweGEwYTQsCisJMHg5NDIwLCAweGEwYTgsIDB4OTMxOSwgMHgwODA0LCAweDIyYmQsIDB4YTFiYywgMHgyNDAwLCAweDkxMjIsCisJMHhhMWMwLCAweDIzMDAsIDB4OTExYiwgMHgwYTBjLCAweDBkZDUsIDB4YTBiNCwgMHg5NDIwLCAweGEwYjgsCisJMHg5MzE5LCAweDA4MDQsIDB4MjJiZCwgMHhhMWNjLCAweDI0MDAsIDB4OTEyMiwgMHhhMWQwLCAweDIzMDAsCisJMHg5MTFiLCAweDBhMGMsIDB4MGRkNSwgMHhhMGM0LCAweDk0MjAsIDB4YTBjOCwgMHg5MzE5LCAweDA4MDQsCisJMHgyMmJkLCAweGExZGMsIDB4MjQwMCwgMHg5MTIyLCAweGExZTAsIDB4MjMwMCwgMHg5MTFiLCAweDBhMGMsCisJMHgwZGQ1LCAweGEwZDQsIDB4OTQyMCwgMHhhMGQ4LCAweDkzMTksIDB4MDgwNCwgMHgyMmJkLCAweDkwODIsCisJMHgwMDFiLCAweDAwMDIsIDB4MjI3ZCwgMHgyMjdiLCAweDIyN2IsIDB4MjI3YiwgMHgyMjdiLCAweDIyN2IsCisJMHgyMjhhLCAweDIyN2IsIDB4MjI3YiwgMHgyMjdiLCAweDIyN2IsIDB4MjI3YiwgMHgyMjk3LCAweDIyN2IsCisJMHgyMjdiLCAweDIyN2IsIDB4MjI3YiwgMHgyMjdiLCAweDIyYTQsIDB4MjI3YiwgMHgyMjdiLCAweDIyN2IsCisJMHgyMjdiLCAweDIyN2IsIDB4MjJiMSwgMHgwODBjLCAweDBkZDUsIDB4YTE3YywgMHgyNDAwLCAweDkxMjIsCisJMHhhMTgwLCAweDIzMDAsIDB4OTExYiwgMHgwYTBjLCAweDBkZDUsIDB4YTA2YywgMHg5NDIwLCAweGEwNzAsCisJMHg5MzE5LCAweDA0OTgsIDB4YTE5NCwgMHgyNDAwLCAweDkxMjIsIDB4YTE5OCwgMHgyMzAwLCAweDkxMWIsCisJMHgwYTBjLCAweDBkZDUsIDB4YTA4NCwgMHg5NDIwLCAweGEwODgsIDB4OTMxOSwgMHgwNDMwLCAweGExYWMsCisJMHgyNDAwLCAweDkxMjIsIDB4YTFiMCwgMHgyMzAwLCAweDkxMWIsIDB4MGEwYywgMHgwZGQ1LCAweGEwOWMsCisJMHg5NDIwLCAweGEwYTAsIDB4OTMxOSwgMHgwMGM4LCAweGExYzQsIDB4MjQwMCwgMHg5MTIyLCAweGExYzgsCisJMHgyMzAwLCAweDkxMWIsIDB4MGEwYywgMHgwZGQ1LCAweGEwYjQsIDB4OTQyMCwgMHhhMGI4LCAweDkzMTksCisJMHgwMDYwLCAweGExZGMsIDB4MjQwMCwgMHg5MTIyLCAweGExZTAsIDB4MjMwMCwgMHg5MTFiLCAweDBhMGMsCisJMHgwZGQ1LCAweGEwY2MsIDB4OTQyMCwgMHhhMGQwLCAweDkzMTksIDB4YWMxZSwgMHhhYjIyLCAweGE4ODAsCisJMHhjMGZkLCAweGE4ODIsIDB4MjgwMCwgMHhhODVhLCAweDJjMDAsIDB4YTgxMiwgMHgyYTAwLCAweGE4MTYsCisJMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHg5MDA2LCAweDAwMjgsIDB4MDA4ZSwgMHgwMGRlLCAweDAwY2UsCisJMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgyMDAxLCAweDAwMDUsIDB4MjAwNCwgMHhkMGJjLCAweDE5MGMsCisJMHgwZGNlLCAweDkwODQsIDB4MDAwNywgMHgwMDAyLCAweDIyZWUsIDB4MWVmMiwgMHgyMmVlLCAweDIyZTQsCisJMHgyMmU3LCAweDIyZWEsIDB4MjJlNywgMHgyMmVhLCAweDA4MGMsIDB4MWVmMiwgMHgwMDA1LCAweDA4MGMsCisJMHgxMWEzLCAweDAwMDUsIDB4MDgwYywgMHgxZWYyLCAweDA4MGMsIDB4MTFhMywgMHgwMDA1LCAweDAxMjYsCisJMHgyMDkxLCAweDI2MDAsIDB4MjA3OSwgMHgwMjAwLCAweDIwNzEsIDB4MDI2MCwgMHgyMDY5LCAweDE4MDAsCisJMHg3ODE3LCAweDAwMDAsIDB4Nzg5YiwgMHgwODE0LCAweDc4YTMsIDB4MDQwNiwgMHg3ODlmLCAweDA0MTAsCisJMHgyMDA5LCAweDAxM2IsIDB4MjAwYiwgMHgwNDAwLCAweDc4MWIsIDB4MDAwMiwgMHg3ODNiLCAweDAwMWYsCisJMHg3ODM3LCAweDAwMjAsIDB4NzgwMywgMHgxNjAwLCAweDAxMmUsIDB4MDAwNSwgMHgyMDkxLCAweDI2MDAsCisJMHg3ODFjLCAweGQwYTQsIDB4MTkwYywgMHgyNDBkLCAweDc5MDAsIDB4ZDFkYywgMHgxMTE4LCAweDkwODQsCisJMHgwMDA2LCAweDAwMWEsIDB4OTA4NCwgMHgwMDBlLCAweDAwMDIsIDB4MjMzNSwgMHgyMzJkLCAweDdlMWUsCisJMHgyMzJkLCAweDIzMmYsIDB4MjMyZiwgMHgyMzJmLCAweDIzMmYsIDB4N2UwNCwgMHgyMzJkLCAweDIzMzEsCisJMHgyMzJkLCAweDIzMmYsIDB4MjMyZCwgMHgyMzJmLCAweDIzMmQsIDB4MDgwYywgMHgwZGQ1LCAweDAwMzEsCisJMHgwMDIwLCAweDA4MGMsIDB4N2UwNCwgMHgwODBjLCAweDdlMWUsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsCisJMHgwMDI2LCAweDA4MGMsIDB4ZWI5YSwgMHg3OTMwLCAweDkxODQsIDB4MDAwMywgMHgwMWMwLCAweDIwMDEsCisJMHgxOWY1LCAweDIwMDQsIDB4OTAwNSwgMHgwMTcwLCAweDIwMDEsIDB4MDEzMywgMHgyMDA0LCAweDkwMDUsCisJMHgwOTBjLCAweDBkZDUsIDB4MDBjNiwgMHgyMDAxLCAweDE5ZjUsIDB4MjA2NCwgMHgwODBjLCAweGM4YTUsCisJMHgwMGNlLCAweDAwZjgsIDB4MjAwOSwgMHgwMDQwLCAweDA4MGMsIDB4MjQxMCwgMHgwMGQwLCAweDkxODQsCisJMHgwMDE0LCAweDAxYTAsIDB4NmEwMCwgMHg5Mjg2LCAweDAwMDMsIDB4MDE2MCwgMHgwODBjLCAweDc0M2UsCisJMHgxMTM4LCAweDA4MGMsIDB4NzcyNCwgMHgwODBjLCAweDYwYWQsIDB4MDgwYywgMHg3MzZhLCAweDAwMTAsCisJMHgwODBjLCAweDVmNmMsIDB4MDgwYywgMHg3ZWNkLCAweDAwNDEsIDB4MDAxOCwgMHg5MTg0LCAweDk1NDAsCisJMHgxZGM4LCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBlNiwgMHgwMDM2LCAweDAwNDYsCisJMHgwMDU2LCAweDIwNzEsIDB4MWE2MSwgMHgwODBjLCAweDFhZWMsIDB4MDA1ZSwgMHgwMDRlLCAweDAwM2UsCisJMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDJlMDAsIDB4MjA3MSwgMHgxODAwLCAweDcxMjgsCisJMHgyMDAxLCAweDE5NmUsIDB4MjEwMiwgMHgyMDAxLCAweDE5NzYsIDB4MjEwMiwgMHgyMDAxLCAweDAxM2IsCisJMHgyMTAyLCAweDIwNzksIDB4MDIwMCwgMHgyMDAxLCAweDAyMDEsIDB4Nzg5ZSwgMHg3OGEzLCAweDAyMDAsCisJMHg5MTk4LCAweDAwMDcsIDB4ODMxYywgMHg4MzFjLCAweDgzMWMsIDB4OTM5OCwgMHgwMDA1LCAweDIzMjAsCisJMHg5MTgyLCAweDAyMDQsIDB4MTIzMCwgMHgyMDExLCAweDAwMDgsIDB4ODQyMywgMHg4NDIzLCAweDg0MjMsCisJMHgwNDg4LCAweDkxODIsIDB4MDI0YywgMHgxMjQwLCAweDIwMTEsIDB4MDAwNywgMHg4NDAzLCAweDgwMDMsCisJMHg5NDAwLCAweDk0MDAsIDB4OTQyMCwgMHgwNDMwLCAweDkxODIsIDB4MDJiYywgMHgxMjM4LCAweDIwMTEsCisJMHgwMDA2LCAweDg0MDMsIDB4ODAwMywgMHg5NDAwLCAweDk0MjAsIDB4MDBlMCwgMHg5MTgyLCAweDAzNGMsCisJMHgxMjMwLCAweDIwMTEsIDB4MDAwNSwgMHg4NDAzLCAweDgwMDMsIDB4OTQyMCwgMHgwMDk4LCAweDkxODIsCisJMHgwNDJjLCAweDEyMjgsIDB4MjAxMSwgMHgwMDA0LCAweDg0MjMsIDB4ODQyMywgMHgwMDU4LCAweDkxODIsCisJMHgwNTljLCAweDEyMjgsIDB4MjAxMSwgMHgwMDAzLCAweDg0MDMsIDB4OTQyMCwgMHgwMDE4LCAweDIwMTEsCisJMHgwMDAyLCAweDg0MjMsIDB4OTQ4MiwgMHgwMjI4LCAweDgwMDIsIDB4ODAyMCwgMHg4MzAxLCAweDk0MDIsCisJMHgwMTEwLCAweDAyMDgsIDB4ODMyMSwgMHg4MjE3LCAweDgyMDMsIDB4OTQwNSwgMHg3ODlhLCAweDAxMmUsCisJMHgwMDA1LCAweDAwMDYsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsIDB4NjgxNCwgMHg5MDg0LCAweGZmYzAsCisJMHg5MTBkLCAweDY5MTYsIDB4MDBkZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsCisJMHg5MDA1LCAweDY4MTAsIDB4MDExMCwgMHhjMGE1LCAweDAwMDgsIDB4YzBhNCwgMHg2ODEyLCAweDAwZGUsCisJMHgwMDA1LCAweDAwMDYsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsIDB4NjgxMCwgMHg5MDg0LCAweGZmZjgsCisJMHg5MTBkLCAweDY5MTIsIDB4MDBkZSwgMHgwMDBlLCAweDAwMDUsIDB4NzkzOCwgMHgwODBjLCAweDBkY2UsCisJMHgwMGY2LCAweDIwNzksIDB4MDIwMCwgMHg3OTAyLCAweGEwMDEsIDB4YTAwMSwgMHhhMDAxLCAweGEwMDEsCisJMHhhMDAxLCAweGEwMDEsIDB4NzkwMiwgMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwgMHhhMDAxLCAweGEwMDEsCisJMHhhMDAxLCAweDAwZmUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwgMHgyMDYxLCAweDAxMDAsCisJMHgyMDcxLCAweDE4MDAsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4MmM3YywgMHgwODBjLCAweDJiOTcsCisJMHg2MDU0LCAweDgwMDQsIDB4ODAwNCwgMHg4MDA0LCAweDgwMDQsIDB4OTA4NCwgMHgwMDBjLCAweDYxNTAsCisJMHg5MThjLCAweGZmZjMsIDB4OTEwNSwgMHg2MDUyLCAweDYwNTAsIDB4OTA4NCwgMHhiMTdmLCAweDkwODUsCisJMHgyMDAwLCAweDYwNTIsIDB4MjAwOSwgMHgxOTljLCAweDIwMTEsIDB4MTk5ZCwgMHg2MzU4LCAweDkzOWMsCisJMHgzOGYwLCAweDIzMjAsIDB4MDgwYywgMHgyYmRiLCAweDEyMzgsIDB4OTM5ZCwgMHg0MDAzLCAweDk0YTUsCisJMHg4NjAzLCAweDIzMGEsIDB4MjQxMiwgMHgwMDMwLCAweDkzOWQsIDB4MDIwMywgMHg5NGE1LCAweDg2MDMsCisJMHgyMzBhLCAweDI0MTIsIDB4OTAwNiwgMHgwODBjLCAweDJiYzYsIDB4OTAwNiwgMHgwODBjLCAweDJiYTksCisJMHgyMGE5LCAweDAwMTIsIDB4MWQwNCwgMHgyNDYyLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDI0NjIsCisJMHg2MDJmLCAweDAxMDAsIDB4NjAyZiwgMHgwMDAwLCAweDYwNTAsIDB4OTA4NSwgMHgwNDAwLCAweDkwODQsCisJMHhkZmZmLCAweDYwNTIsIDB4NjAyNCwgMHg2MDI2LCAweDA4MGMsIDB4MjhiNSwgMHgyMDA5LCAweDAwZWYsCisJMHg2MTMyLCAweDYxMzYsIDB4MDgwYywgMHgyOGM1LCAweDYwZTcsIDB4MDAwMCwgMHg2MWVhLCAweDYwZTMsCisJMHgwMDA4LCAweDYwNGIsIDB4ZjdmNywgMHg2MDQzLCAweDAwMDAsIDB4NjAyZiwgMHgwMDgwLCAweDYwMmYsCisJMHgwMDAwLCAweDYwMDcsIDB4MzQ5ZiwgMHg2MGJiLCAweDAwMDAsIDB4MjBhOSwgMHgwMDE4LCAweDYwYmYsCisJMHgwMDAwLCAweDFmMDQsIDB4MjQ4ZiwgMHg2MGJiLCAweDAwMDAsIDB4NjBiZiwgMHgwMTA4LCAweDYwYmYsCisJMHgwMDEyLCAweDYwYmYsIDB4MDQwNSwgMHg2MGJmLCAweDAwMTQsIDB4NjBiZiwgMHgwMzIwLCAweDYwYmYsCisJMHgwMDE4LCAweDYwMWIsIDB4MDBmMCwgMHg2MDFmLCAweDAwMWUsIDB4NjAwZiwgMHgwMDZiLCAweDYwMmIsCisJMHg0MDJmLCAweDAxMmUsIDB4MDAwNSwgMHgwMGY2LCAweDIwNzksIDB4MDE0MCwgMHg3OGMzLCAweDAwODAsCisJMHg3OGMzLCAweDAwODMsIDB4NzhjMywgMHgwMDAwLCAweDAwZmUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MzUsCisJMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgxODM0LCAweDIwMDMsIDB4MDAwMSwgMHgwMDA1LCAweDAxMjYsCisJMHgyMDkxLCAweDI4MDAsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4NjEyNCwgMHgwMDY2LCAweDIwMzEsCisJMHgxODM3LCAweDI2MzQsIDB4OTZiNCwgMHgwMDI4LCAweDAwNmUsIDB4MTEzOCwgMHg2MDIwLCAweGQxYmMsCisJMHgwMTIwLCAweGQwYmMsIDB4MTE2OCwgMHhkMGI0LCAweDExOTgsIDB4OTE4NCwgMHg1ZTJjLCAweDExMTgsCisJMHg5MTg0LCAweDAwMDcsIDB4MDBhYSwgMHg5MTk1LCAweDAwMDQsIDB4OTI4NCwgMHgwMDA3LCAweDAwODIsCisJMHgwMDE2LCAweDIwMDEsIDB4MTg4YiwgMHgyMDBjLCAweGQxODQsIDB4MDAxZSwgMHgwZDcwLCAweDBjOTgsCisJMHgwMDE2LCAweDIwMDEsIDB4MTg4YiwgMHgyMDBjLCAweGQxOTQsIDB4MDAxZSwgMHgwZDMwLCAweDBjNTgsCisJMHgyNTEyLCAweDI0ZjgsIDB4MjRmYiwgMHgyNGZlLCAweDI1MDMsIDB4MjUwNSwgMHgyNTA5LCAweDI1MGQsCisJMHgwODBjLCAweDkwOTQsIDB4MDBiOCwgMHgwODBjLCAweDkxNjMsIDB4MDBhMCwgMHgwODBjLCAweDkxNjMsCisJMHgwODBjLCAweDkwOTQsIDB4MDA3OCwgMHgwMDk5LCAweDAwNjgsIDB4MDgwYywgMHg5MDk0LCAweDAwNzksCisJMHgwMDQ4LCAweDA4MGMsIDB4OTE2MywgMHgwMDU5LCAweDAwMjgsIDB4MDgwYywgMHg5MTYzLCAweDA4MGMsCisJMHg5MDk0LCAweDAwMjksIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDEyZSwgMHgwMDA1LCAweDAwYTYsCisJMHg2MTI0LCAweDYwMjgsIDB4ZDA5YywgMHgwMTE4LCAweGQxOWMsIDB4MTkwNCwgMHgyNzdhLCAweGQxZjQsCisJMHgxOTBjLCAweDBkY2UsIDB4MDgwYywgMHg3NDNlLCAweDA5MDQsIDB4MjU2ZCwgMHgwODBjLCAweGQzODgsCisJMHgxMTIwLCAweDcwMDAsIDB4OTA4NiwgMHgwMDAzLCAweDA1NzAsIDB4NjAyNCwgMHg5MDg0LCAweDE4MDAsCisJMHgwNTUwLCAweDA4MGMsIDB4NzQ2MSwgMHgwMTE4LCAweDA4MGMsIDB4NzQ0ZiwgMHgxNTIwLCAweDYwMjcsCisJMHgwMDIwLCAweDYwNDMsIDB4MDAwMCwgMHgwODBjLCAweGQzODgsIDB4MDE2OCwgMHgwODBjLCAweDc0NjEsCisJMHgxMTUwLCAweDIwMDEsIDB4MTlhNiwgMHgyMDAzLCAweDAwMDEsIDB4NjAyNywgMHgxODAwLCAweDA4MGMsCisJMHg3MmNlLCAweDA4MDQsIDB4Mjc3ZCwgMHg3MGE0LCAweDkwMDUsIDB4MTE1MCwgMHg3MGE3LCAweDAwMDEsCisJMHgwMGQ2LCAweDIwNjksIDB4MDE0MCwgMHgwODBjLCAweDc0OTUsIDB4MDBkZSwgMHgxOTA0LCAweDI3N2QsCisJMHgwODBjLCAweDc3MmUsIDB4MDQyOCwgMHgwODBjLCAweDc0NjEsIDB4MTU5MCwgMHg2MDI0LCAweDkwODQsCisJMHgxODAwLCAweDExMDgsIDB4MDQ2OCwgMHgwODBjLCAweDc3MmUsIDB4MDgwYywgMHg3NzI0LCAweDA4MGMsCisJMHg2MGFkLCAweDA4MGMsIDB4NzM2YSwgMHgwODA0LCAweDI3N2EsIDB4ZDFhYywgMHgxNTA4LCAweDYwMjQsCisJMHhkMGRjLCAweDExNzAsIDB4ZDBlNCwgMHgxMTc4LCAweGQwZDQsIDB4MTE5MCwgMHhkMGNjLCAweDAxMzAsCisJMHg3MDk4LCAweDkwODYsIDB4MDAyOCwgMHgxMTEwLCAweDA4MGMsIDB4NzYxMSwgMHgwODA0LCAweDI3N2EsCisJMHgwODBjLCAweDc3MjksIDB4MDA0OCwgMHgyMDAxLCAweDE5N2MsIDB4MjAwMywgMHgwMDAyLCAweDAwMjAsCisJMHgwODBjLCAweDc1NzYsIDB4MDgwNCwgMHgyNzdhLCAweDA4MGMsIDB4NzZhYywgMHgwODA0LCAweDI3N2EsCisJMHg2MjIwLCAweGQxYmMsIDB4MDEzOCwgMHhkMmJjLCAweDE5MDQsIDB4MjdlZCwgMHhkMmI0LCAweDE5MDQsCisJMHgyODAwLCAweDAwMDAsIDB4ZDFhYywgMHgwOTA0LCAweDI2OGYsIDB4MDAzNiwgMHg2MzI4LCAweGMzYmMsCisJMHg2MzJhLCAweDAwM2UsIDB4MDgwYywgMHg3NDNlLCAweDExYzAsIDB4NjAyNywgMHgwMDIwLCAweDAwMDYsCisJMHgwMDI2LCAweDAwMzYsIDB4MDgwYywgMHg3NDU4LCAweDExNTgsIDB4MDgwYywgMHg3NzI0LCAweDA4MGMsCisJMHg2MGFkLCAweDA4MGMsIDB4NzM2YSwgMHgwMDNlLCAweDAwMmUsIDB4MDAwZSwgMHgwMGFlLCAweDAwMDUsCisJMHgwMDNlLCAweDAwMmUsIDB4MDAwZSwgMHgwODBjLCAweDc0MTYsIDB4MDAxNiwgMHgwMDQ2LCAweDAwYzYsCisJMHg2NDRjLCAweDk0ODYsIDB4ZjBmMCwgMHgxMTM4LCAweDIwNjEsIDB4MDEwMCwgMHg2NDRhLCAweDYwNDMsCisJMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHg3NGRhLCAweDk0OGMsIDB4ZmYwMCwgMHg3MDM4LCAweGQwODQsCisJMHgwMTc4LCAweDkxODYsIDB4ZjgwMCwgMHgxMTYwLCAweDcwNDgsIDB4ZDA4NCwgMHgxMTQ4LCAweGMwODUsCisJMHg3MDRhLCAweDAwMzYsIDB4MjQxOCwgMHgyMDExLCAweDgwMTYsIDB4MDgwYywgMHg0YjdmLCAweDAwM2UsCisJMHgwODBjLCAweGQzODEsIDB4MTkwNCwgMHgyNjZjLCAweDkxOTYsIDB4ZmYwMCwgMHgwNWE4LCAweDcwNjAsCisJMHg5MDg0LCAweDAwZmYsIDB4ODEwZiwgMHg4MWZmLCAweDAxMTAsIDB4OTExNiwgMHgwNTY4LCAweDcxMzAsCisJMHhkMTg0LCAweDE1NTAsIDB4MDgwYywgMHgzMzc4LCAweDAxMjgsIDB4YzE4ZCwgMHg3MTMyLCAweDA4MGMsCisJMHg2YTA0LCAweDE1MTAsIDB4NjI0MCwgMHg5Mjk0LCAweDAwMTAsIDB4MDEzMCwgMHg2MjQ4LCAweDkyOTQsCisJMHhmZjAwLCAweDkyOTYsIDB4ZmYwMCwgMHgwMWMwLCAweDcwMzAsIDB4ZDA4YywgMHgwOTA0LCAweDI2NmMsCisJMHg3MDM4LCAweGQwOGMsIDB4MTE0MCwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHhkMWFjLCAweDE5MDQsCisJMHgyNjZjLCAweGMxYWQsIDB4MjEwMiwgMHgwMDM2LCAweDczZDgsIDB4MjAxMSwgMHg4MDEzLCAweDA4MGMsCisJMHg0YjdmLCAweDAwM2UsIDB4MDgwNCwgMHgyNjZjLCAweDcwMzgsIDB4ZDA4YywgMHgxMTQwLCAweDIwMDEsCisJMHgxODBjLCAweDIwMGMsIDB4ZDFhYywgMHgxOTA0LCAweDI2NmMsIDB4YzFhZCwgMHgyMTAyLCAweDAwMzYsCisJMHg3M2Q4LCAweDIwMTEsIDB4ODAxMywgMHgwODBjLCAweDRiN2YsIDB4MDAzZSwgMHg3MTMwLCAweGMxODUsCisJMHg3MTMyLCAweDIwMTEsIDB4MTg0OCwgMHgyMjBjLCAweGQxYTQsIDB4MDFmMCwgMHgwMDE2LCAweDIwMDksCisJMHgwMDAxLCAweDIwMTEsIDB4MDEwMCwgMHgwODBjLCAweDg3OWEsIDB4MjAxOSwgMHgwMDBlLCAweDAwYzYsCisJMHgyMDYxLCAweDAwMDAsIDB4MDgwYywgMHhlNmFlLCAweDAwY2UsIDB4OTQ4NCwgMHgwMGZmLCAweDkwODAsCisJMHgzMzg0LCAweDIwMGQsIDB4OTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MjEyMCwgMHg5MDA2LCAweDIwMDksCisJMHgwMDBlLCAweDA4MGMsIDB4ZTczYSwgMHgwMDFlLCAweDAwMTYsIDB4MjAwOSwgMHgwMDAyLCAweDIwMTksCisJMHgwMDA0LCAweDA4MGMsIDB4MzFlOSwgMHgwMDFlLCAweDAwNzgsIDB4MDE1NiwgMHgwMGI2LCAweDIwYTksCisJMHgwMDdmLCAweDkwMGUsIDB4MDgwYywgMHg2Njk5LCAweDExMTAsIDB4MDgwYywgMHg2MGM3LCAweDgxMDgsCisJMHgxZjA0LCAweDI2NjIsIDB4MDBiZSwgMHgwMTVlLCAweDAwY2UsIDB4MDA0ZSwgMHgwODBjLCAweGFlYjQsCisJMHg2MGUzLCAweDAwMDAsIDB4MDAxZSwgMHgyMDAxLCAweDE4MDAsIDB4MjAxNCwgMHg5Mjk2LCAweDAwMDQsCisJMHgxMTcwLCAweGQxOWMsIDB4MTFhMCwgMHgyMDExLCAweDE4MGMsIDB4MjIxNCwgMHhkMjljLCAweDExMjAsCisJMHg2MjA0LCAweDkyOTUsIDB4MDAwMiwgMHg2MjA2LCAweDYyMjgsIDB4YzI5ZCwgMHg2MjJhLCAweDIwMDMsCisJMHgwMDAxLCAweDIwMDEsIDB4MTgyNiwgMHgyMDAzLCAweDAwMDAsIDB4NjAyNywgMHgwMDIwLCAweGQxOTQsCisJMHgwOTA0LCAweDI3N2EsIDB4MDAxNiwgMHg2MjIwLCAweGQyYjQsIDB4MDkwNCwgMHgyNzE3LCAweDA4MGMsCisJMHg4NjM2LCAweDA4MGMsIDB4YTM1NiwgMHg2MDI3LCAweDAwMDQsIDB4MDBmNiwgMHgyMDE5LCAweDE5ZWYsCisJMHgyMzA0LCAweDkwN2QsIDB4MDkwNCwgMHgyNmU2LCAweDc4MDQsIDB4OTA4NiwgMHgwMDMyLCAweDE1ZjAsCisJMHgwMGQ2LCAweDAwYzYsIDB4MDBlNiwgMHgwMDk2LCAweDIwNjksIDB4MDE0MCwgMHg3ODJjLCAweDY4NWUsCisJMHg3ODA4LCAweDY4NWEsIDB4NjA0MywgMHgwMDAyLCAweDIwMDEsIDB4MDAwMywgMHg4MDAxLCAweDFkZjAsCisJMHg2MDQzLCAweDAwMDAsIDB4MjAwMSwgMHgwMDNjLCAweDgwMDEsIDB4MWRmMCwgMHgwODBjLCAweDJkNWUsCisJMHgyMDAxLCAweDAwMWUsIDB4ODAwMSwgMHgwMjQwLCAweDIwYTksIDB4MDAwOSwgMHgwODBjLCAweDJjNTcsCisJMHg2OTA0LCAweGQxZGMsIDB4MTE0MCwgMHgwY2IwLCAweDIwMDEsIDB4MDEwMCwgMHgwODBjLCAweDJkNGUsCisJMHg5MDA2LCAweDA4MGMsIDB4MmQ0ZSwgMHgwODBjLCAweDk2NTcsIDB4MDgwYywgMHg5NzYzLCAweDc4MTQsCisJMHgyMDQ4LCAweGE4NjcsIDB4MDEwMywgMHgyZjYwLCAweDA4MGMsIDB4YWY0MywgMHgwMDllLCAweDAwZWUsCisJMHgwMGNlLCAweDAwZGUsIDB4MDBmZSwgMHgwMDFlLCAweDAwYWUsIDB4MDAwNSwgMHgwMGZlLCAweDAwZDYsCisJMHgyMDY5LCAweDAxNDAsIDB4NjgwNCwgMHg5MDg0LCAweDQwMDAsIDB4MDExMCwgMHgwODBjLCAweDJkNWUsCisJMHgwMGRlLCAweDAwYzYsIDB4MjA2MSwgMHgxOWU2LCAweDYwMjgsIDB4MDgwYywgMHhkMzg4LCAweDAxMjAsCisJMHg5MDlhLCAweDAwMDMsIDB4MTI1OCwgMHgwMDE4LCAweDkwOWEsIDB4MDBjOCwgMHgxMjM4LCAweDgwMDAsCisJMHg2MDJhLCAweDAwY2UsIDB4MDgwYywgMHhhMzMyLCAweDA4MDQsIDB4Mjc3OSwgMHgyMDYxLCAweDAxMDAsCisJMHg2MmMwLCAweDA4MGMsIDB4YWQzYSwgMHgyMDE5LCAweDE5ZWYsIDB4MjMwNCwgMHg5MDY1LCAweDAxMjAsCisJMHgyMDA5LCAweDAwMjcsIDB4MDgwYywgMHhhZmJlLCAweDAwY2UsIDB4MDgwNCwgMHgyNzc5LCAweGQyYmMsCisJMHgwOTA0LCAweDI3NjAsIDB4MDgwYywgMHg4NjQzLCAweDYwMTQsIDB4OTA4NCwgMHgxOTg0LCAweDkwODUsCisJMHgwMDEwLCAweDYwMTYsIDB4NjAyNywgMHgwMDA0LCAweDAwZDYsIDB4MjA2OSwgMHgwMTQwLCAweDY4MDQsCisJMHg5MDg0LCAweDQwMDAsIDB4MDExMCwgMHgwODBjLCAweDJkNWUsIDB4MDBkZSwgMHgwMGM2LCAweDIwNjEsCisJMHgxOWU2LCAweDYwNDQsIDB4MDgwYywgMHhkMzg4LCAweDAxMjAsIDB4OTA5YSwgMHgwMDAzLCAweDE2NTgsCisJMHgwMDE4LCAweDkwOWEsIDB4MDBjOCwgMHgxNjM4LCAweDgwMDAsIDB4NjA0NiwgMHg2MDNjLCAweDAwY2UsCisJMHg5MDA1LCAweDA1YjgsIDB4MjAwOSwgMHgwN2QwLCAweDA4MGMsIDB4ODYzYiwgMHg5MDgwLCAweDAwMDgsCisJMHgyMDA0LCAweDkwODYsIDB4MDAwNiwgMHgxMTM4LCAweDYxMTQsIDB4OTE4YywgMHgxOTg0LCAweDkxOGQsCisJMHgwMDEyLCAweDYxMTYsIDB4MDQzMCwgMHg5MDgwLCAweDAwMDgsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDksCisJMHgwZDk4LCAweDYxMTQsIDB4OTE4YywgMHgxOTg0LCAweDkxOGQsIDB4MDAxNiwgMHg2MTE2LCAweDAwYzgsCisJMHg2MDI3LCAweDAwMDQsIDB4MDBiMCwgMHgwMDM2LCAweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweGE2YWMsCisJMHgwMDNlLCAweDIwMTksIDB4MTlmNSwgMHgyMzA0LCAweDkwNjUsIDB4MDE1MCwgMHgyMDA5LCAweDAwNGYsCisJMHg2MDIwLCAweDkwODYsIDB4MDAwOSwgMHgxMTEwLCAweDIwMDksIDB4MDA0ZiwgMHgwODBjLCAweGFmYmUsCisJMHgwMGNlLCAweDAwMWUsIDB4ZDE5YywgMHgwOTA0LCAweDI3ZTgsIDB4NzAzOCwgMHhkMGFjLCAweDE5MDQsCisJMHgyN2MxLCAweDAwMTYsIDB4MDE1NiwgMHg2MDI3LCAweDAwMDgsIDB4NjA1MCwgMHg5MDg1LCAweDAwNDAsCisJMHg2MDUyLCAweDYwNTAsIDB4OTA4NCwgMHhmYmNmLCAweDYwNTIsIDB4MDgwYywgMHgyYzc2LCAweDkwODUsCisJMHgyMDAwLCAweDYwNTIsIDB4MjBhOSwgMHgwMDEyLCAweDFkMDQsIDB4Mjc5NCwgMHgwODBjLCAweDg2NmEsCisJMHgxZjA0LCAweDI3OTQsIDB4NjA1MCwgMHg5MDg1LCAweDA0MDAsIDB4OTA4NCwgMHhkZmJmLCAweDYwNTIsCisJMHgyMGE5LCAweDAwMjgsIDB4YTAwMSwgMHgxZjA0LCAweDI3YTIsIDB4NjE1MCwgMHg5MTg1LCAweDE0MDAsCisJMHg2MDUyLCAweDIwYTksIDB4MDM2NiwgMHgxZDA0LCAweDI3YWIsIDB4MDgwYywgMHg4NjZhLCAweDYwMjAsCisJMHhkMDljLCAweDExMzAsIDB4MDE1ZSwgMHg2MTUyLCAweDAwMWUsIDB4NjAyNywgMHgwMDA4LCAweDA0ODAsCisJMHgwODBjLCAweDJjM2UsIDB4MWYwNCwgMHgyN2FiLCAweDAxNWUsIDB4NjE1MiwgMHgwMDFlLCAweDYwMjcsCisJMHgwMDA4LCAweDAwMTYsIDB4NjAyOCwgMHhjMDljLCAweDYwMmEsIDB4MDgwYywgMHhhZWI0LCAweDYwZTMsCisJMHgwMDAwLCAweDA4MGMsIDB4ZWI3OSwgMHgwODBjLCAweGViOTQsIDB4MDgwYywgMHg1NzYxLCAweGQwZmMsCisJMHgxMTM4LCAweDA4MGMsIDB4ZDM4MSwgMHgxMTIwLCAweDkwODUsIDB4MDAwMSwgMHgwODBjLCAweDc0ODUsCisJMHg5MDA2LCAweDA4MGMsIDB4MmQ0ZSwgMHgyMDA5LCAweDAwMDIsIDB4MDgwYywgMHgyYzdjLCAweDIwMDEsCisJMHgxODAwLCAweDIwMDMsIDB4MDAwNCwgMHg2MDI3LCAweDAwMDgsIDB4MDgwYywgMHgwYmFlLCAweDAwMWUsCisJMHg5MThjLCAweGZmZDAsIDB4NjEyNiwgMHgwMGFlLCAweDAwMDUsIDB4MDAxNiwgMHgyMDAxLCAweDE4OGIsCisJMHgyMDBjLCAweGQxODQsIDB4MDAxZSwgMHgwOTA0LCAweDI1OWEsIDB4MDAxNiwgMHgyMDA5LCAweDI3ZjksCisJMHgwMGQwLCAweDIwMDEsIDB4MTg4YiwgMHgyMDBjLCAweGMxODQsIDB4MjEwMiwgMHgwMDFlLCAweDBjNDAsCisJMHgwMDE2LCAweDIwMDEsIDB4MTg4YiwgMHgyMDBjLCAweGQxOTQsIDB4MDAxZSwgMHgwOTA0LCAweDI1OWEsCisJMHgwMDE2LCAweDIwMDksIDB4MjgwYywgMHgwMDM4LCAweDIwMDEsIDB4MTg4YiwgMHgyMDBjLCAweGMxOTQsCisJMHgyMTAyLCAweDAwMWUsIDB4MDhhOCwgMHg2MDI4LCAweGMwYmMsIDB4NjAyYSwgMHgyMDAxLCAweDAxNTYsCisJMHgyMDAzLCAweGJjOTEsIDB4ODAwMCwgMHgyMDAzLCAweGZmZmYsIDB4NjA0MywgMHgwMDAxLCAweDA4MGMsCisJMHgyYzc2LCAweDYwMjcsIDB4MDA4MCwgMHg2MDE3LCAweDAwMDAsIDB4NjA0MywgMHgwMDAwLCAweDA4MTcsCisJMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwZTYsIDB4MDBmNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDIwNzEsIDB4MTgwMCwgMHg3MWQwLCAweDcwZDIsIDB4OTExNiwgMHgwNWU4LCAweDgxZmYsCisJMHgwMWEwLCAweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweDJjN2MsIDB4MjAxMSwgMHg4MDExLCAweDIwMTksCisJMHgwMTBlLCAweDIzMWMsIDB4OTM5ZSwgMHgwMDA3LCAweDExMTgsIDB4MjAxOSwgMHgwMDAxLCAweDAwMTAsCisJMHgyMDE5LCAweDAwMDAsIDB4MDgwYywgMHg0YjdmLCAweDA0MzgsIDB4MjAwMSwgMHgxOWE3LCAweDIwMGMsCisJMHg4MWZmLCAweDExNDAsIDB4MjAwMSwgMHgwMTA5LCAweDIwMDQsIDB4ZDBiNCwgMHgwMTE4LCAweDIwMTksCisJMHgwMDAzLCAweDAwMDgsIDB4MjExOCwgMHgyMDExLCAweDgwMTIsIDB4MDgwYywgMHg0YjdmLCAweDA4MGMsCisJMHg1NzYxLCAweGQwZmMsIDB4MTE4OCwgMHgwODBjLCAweGQzODEsIDB4MTE3MCwgMHgwMGM2LCAweDA4MGMsCisJMHgyOTEwLCAweDA4MGMsIDB4YTYxMywgMHgyMDYxLCAweDAxMDAsIDB4MjAxOSwgMHgwMDI4LCAweDIwMDksCisJMHgwMDAyLCAweDA4MGMsIDB4MzFlOSwgMHgwMGNlLCAweDAxMmUsIDB4MDBmZSwgMHgwMGVlLCAweDAwM2UsCisJMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDIwMjgsIDB4OTE4YywgMHgwMGZmLCAweDIxMzAsCisJMHg5MDk0LCAweGZmMDAsIDB4MTFmMCwgMHgyMDExLCAweDE4MzcsIDB4MjIxNCwgMHhkMmFjLCAweDExYzgsCisJMHg4MWZmLCAweDAxZTgsIDB4MjAxMSwgMHgxODFmLCAweDIyMDQsIDB4OTEwNiwgMHgxMTkwLCAweDIwMTEsCisJMHgxODIwLCAweDIyMTQsIDB4OTI5NCwgMHhmZjAwLCAweDk1ODQsIDB4ZmYwMCwgMHg5MjA2LCAweDExNDgsCisJMHgyMDExLCAweDE4MjAsIDB4MjIxNCwgMHg5Mjk0LCAweDAwZmYsIDB4OTU4NCwgMHgwMGZmLCAweDkyMDYsCisJMHgxMTIwLCAweDI1MDAsIDB4MDgwYywgMHg4MTQyLCAweDAwNDgsIDB4OTU4NCwgMHgwMGZmLCAweDkwODAsCisJMHgzMzg0LCAweDIwMGQsIDB4OTE4YywgMHhmZjAwLCAweDgxMGYsIDB4OTAwNiwgMHgwMDA1LCAweDkwODAsCisJMHgzMzg0LCAweDIwMGQsIDB4OTE4YywgMHgwMGZmLCAweDAwMDUsIDB4MDBkNiwgMHgyMDY5LCAweDAxNDAsCisJMHgyMDAxLCAweDE4MTgsIDB4MjAwMywgMHgwMGVmLCAweDIwYTksIDB4MDAxMCwgMHg5MDA2LCAweDY4NTIsCisJMHg2ODU2LCAweDFmMDQsIDB4MjhjMCwgMHgwMGRlLCAweDAwMDUsIDB4MDAwNiwgMHgwMGQ2LCAweDAwMjYsCisJMHgyMDY5LCAweDAxNDAsIDB4MjAwMSwgMHgxODE4LCAweDIxMDIsIDB4ODExNCwgMHg4MjE0LCAweDgyMTQsCisJMHg4MjE0LCAweDIwYTksIDB4MDAxMCwgMHg2ODUzLCAweDAwMDAsIDB4OTAwNiwgMHg4MmZmLCAweDExMjgsCisJMHg5MTg0LCAweDAwMGYsIDB4OTA4MCwgMHhmMzQ2LCAweDIwMDUsIDB4Njg1NiwgMHg4MjExLCAweDFmMDQsCisJMHgyOGQ1LCAweDAwMmUsIDB4MDBkZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBjNiwgMHgyMDYxLCAweDE4MDAsCisJMHg2MDMwLCAweDAxMTAsIDB4YzA5ZCwgMHgwMDA4LCAweGMwOWMsIDB4NjAzMiwgMHgwMGNlLCAweDAwMDUsCisJMHgwMTU2LCAweDAwZDYsIDB4MDAyNiwgMHgwMDE2LCAweDAwMDYsIDB4MjA2OSwgMHgwMTQwLCAweDY5ODAsCisJMHg5MTE2LCAweDAxODAsIDB4OTExMiwgMHgxMjMwLCAweDgyMTIsIDB4ODIxMCwgMHgyMmE4LCAweDIwMDEsCisJMHgwNDAyLCAweDAwMTgsIDB4MjJhOCwgMHgyMDAxLCAweDA0MDQsIDB4NjgwZSwgMHgxZjA0LCAweDI5MDUsCisJMHg2ODBmLCAweDAwMDAsIDB4MDAwZSwgMHgwMDFlLCAweDAwMmUsIDB4MDBkZSwgMHgwMTVlLCAweDAwMDUsCisJMHgwODBjLCAweDU3NWQsIDB4ZDBjNCwgMHgwMTUwLCAweGQwYTQsIDB4MDE0MCwgMHg5MDA2LCAweDAwNDYsCisJMHgyMDIwLCAweDIwMDksIDB4MDAyZSwgMHgwODBjLCAweGU3M2EsIDB4MDA0ZSwgMHgwMDA1LCAweDAwZjYsCisJMHgwMDE2LCAweDAwMjYsIDB4MjA3OSwgMHgwMTQwLCAweDc4YzQsIDB4ZDBkYywgMHgwOTA0LCAweDI5N2MsCisJMHgwODBjLCAweDJiZGIsIDB4MDY2MCwgMHg5MDg0LCAweDA3MDAsIDB4OTA4ZSwgMHgwNjAwLCAweDExMjAsCisJMHgyMDExLCAweDQwMDAsIDB4OTAwZSwgMHgwNDU4LCAweDkwOGUsIDB4MDUwMCwgMHgxMTIwLCAweDIwMTEsCisJMHg4MDAwLCAweDkwMGUsIDB4MDQyMCwgMHg5MDhlLCAweDA0MDAsIDB4MTEyMCwgMHg5MDE2LCAweDIwMDksCisJMHgwMDAxLCAweDAwZTgsIDB4OTA4ZSwgMHgwMzAwLCAweDExMjAsIDB4OTAxNiwgMHgyMDA5LCAweDAwMDIsCisJMHgwMGIwLCAweDkwOGUsIDB4MDIwMCwgMHgxMTIwLCAweDkwMTYsIDB4MjAwOSwgMHgwMDA0LCAweDAwNzgsCisJMHg5MDhlLCAweDAxMDAsIDB4MTU0OCwgMHg5MDE2LCAweDIwMDksIDB4MDAwOCwgMHgwMDQwLCAweDkwODQsCisJMHgwNzAwLCAweDkwOGUsIDB4MDMwMCwgMHgxNTAwLCAweDIwMTEsIDB4MDAzMCwgMHgwMDU4LCAweDIzMDAsCisJMHg5MDgwLCAweDAwMjAsIDB4MjAxOCwgMHgwODBjLCAweDkwMjcsIDB4OTI4YywgMHhmZjAwLCAweDAxMTAsCisJMHgyMDExLCAweDAwZmYsIDB4MjIwMCwgMHg4MDA3LCAweDkwODUsIDB4MDA0YywgMHg3OGMyLCAweDIwMDksCisJMHgwMTM4LCAweDIyMGEsIDB4MDgwYywgMHg3NDNlLCAweDExMTgsIDB4MjAwOSwgMHgxOTZjLCAweDIyMGEsCisJMHgwMDJlLCAweDAwMWUsIDB4MDBmZSwgMHgwMDA1LCAweDc4YzMsIDB4MDAwMCwgMHgwY2M4LCAweDAxMjYsCisJMHgyMDkxLCAweDI4MDAsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MjAwMSwgMHgwMTcwLCAweDIwMGMsCisJMHg4MDAwLCAweDIwMTQsIDB4OTE4NCwgMHgwMDAzLCAweDAxMTAsIDB4MDgwYywgMHgwZGNlLCAweDAwMmUsCisJMHgwMDFlLCAweDAwMGUsIDB4MDEyZSwgMHgwMDA1LCAweDIwMDEsIDB4MDE3MSwgMHgyMDA0LCAweGQwZGMsCisJMHgwMTY4LCAweDIwMDEsIDB4MDE3MCwgMHgyMDBjLCAweDkxOGMsIDB4MDBmZiwgMHg5MThlLCAweDAwNGMsCisJMHgxMTI4LCAweDIwMGMsIDB4OTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MDAwNSwgMHg5MDBlLCAweDIwMDEsCisJMHgwMjI3LCAweDIwMDQsIDB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4ODAwNCwgMHg5MTA4LCAweDIwMDEsCisJMHgwMjI2LCAweDIwMDQsIDB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4ODAwNCwgMHg5MTA4LCAweDAwMDUsCisJMHgwMDE4LCAweDAwMGMsIDB4MDAxOCwgMHgwMDIwLCAweDEwMDAsIDB4MDgwMCwgMHgxMDAwLCAweDE4MDAsCisJMHgwMTU2LCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDAwZTYsIDB4MjAwMSwgMHgxOThmLCAweDIwMDQsCisJMHg5MDhhLCAweDAwMDcsIDB4MWEwYywgMHgwZGQ1LCAweDAwMzMsIDB4MDBlZSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMDBlLCAweDAxNWUsIDB4MDAwNSwgMHgyOWRhLCAweDI5ZjgsIDB4MmExYywgMHgyYTFlLCAweDJhNDcsCisJMHgyYTQ5LCAweDJhNGIsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjgyOCwgMHgwODBjLCAweDJjMzksCisJMHgyMDAxLCAweDE5OTEsIDB4MjAwMywgMHgwMDAwLCAweDc4MjgsIDB4OTA4NCwgMHhlMWQ3LCAweDc4MmEsCisJMHg5MDA2LCAweDIwYTksIDB4MDAwOSwgMHgwODBjLCAweDJiZjcsIDB4MjAwMSwgMHgxOThmLCAweDIwMDMsCisJMHgwMDA2LCAweDIwMDksIDB4MDAxZSwgMHgyMDExLCAweDJhNGMsIDB4MDgwYywgMHg4NjQ4LCAweDAwMDUsCisJMHgyMDA5LCAweDE5OTQsIDB4MjAwYiwgMHgwMDAwLCAweDIwMDEsIDB4MTk5OSwgMHgyMDAzLCAweDAwMzYsCisJMHgyMDAxLCAweDE5OTgsIDB4MjAwMywgMHgwMDJhLCAweDIwMDEsIDB4MTk5MSwgMHgyMDAzLCAweDAwMDEsCisJMHg5MDA2LCAweDA4MGMsIDB4MmJhOSwgMHgyMDAxLCAweGZmZmYsIDB4MjBhOSwgMHgwMDA5LCAweDA4MGMsCisJMHgyYmY3LCAweDIwMDEsIDB4MTk4ZiwgMHgyMDAzLCAweDAwMDYsIDB4MjAwOSwgMHgwMDFlLCAweDIwMTEsCisJMHgyYTRjLCAweDA4MGMsIDB4ODY0OCwgMHgwMDA1LCAweDA4MGMsIDB4MGRkNSwgMHgyMDAxLCAweDE5OTksCisJMHgyMDAzLCAweDAwMzYsIDB4MjAwMSwgMHgxOTkxLCAweDIwMDMsIDB4MDAwMywgMHg3YTM4LCAweDkyOTQsCisJMHgwMDA1LCAweDkyOTYsIDB4MDAwNCwgMHgwMTEwLCAweDkwMDYsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDEsCisJMHgwODBjLCAweDJiYTksIDB4MjAwMSwgMHgxOTk1LCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweGZmZmYsCisJMHgyMGE5LCAweDAwMDksIDB4MDgwYywgMHgyYmY3LCAweDIwMDEsIDB4MTk4ZiwgMHgyMDAzLCAweDAwMDYsCisJMHgyMDA5LCAweDAwMWUsIDB4MjAxMSwgMHgyYTRjLCAweDA4MGMsIDB4ODY0OCwgMHgwMDA1LCAweDA4MGMsCisJMHgwZGQ1LCAweDA4MGMsIDB4MGRkNSwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDAwZTYsCisJMHgwMGY2LCAweDAxNTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3OSwgMHgwMTAwLCAweDIwMDEsCisJMHgxOTkxLCAweDIwMDQsIDB4OTA4YSwgMHgwMDA3LCAweDFhMGMsIDB4MGRkNSwgMHgwMDQzLCAweDAxMmUsCisJMHgwMTVlLCAweDAwZmUsIDB4MDBlZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDJhNmUsCisJMHgyYThlLCAweDJhY2UsIDB4MmFmZSwgMHgyYjIyLCAweDJiMzIsIDB4MmIzNCwgMHgwODBjLCAweDJiZWIsCisJMHgxMWIwLCAweDc4NTAsIDB4OTA4NCwgMHhlZmZmLCAweDc4NTIsIDB4MjAwOSwgMHgxOTk3LCAweDIxMDQsCisJMHg3YTM4LCAweDkyOTQsIDB4MDAwNSwgMHg5Mjk2LCAweDAwMDQsIDB4MDExMCwgMHhjMDhkLCAweDAwMDgsCisJMHhjMDg1LCAweDIwMGEsIDB4MjAwMSwgMHgxOThmLCAweDIwMDMsIDB4MDAwMSwgMHgwMDMwLCAweDA4MGMsCisJMHgyYjU4LCAweDIwMDEsIDB4ZmZmZiwgMHgwODBjLCAweDI5ZTksIDB4MDAwNSwgMHgwODBjLCAweDJiMzYsCisJMHgwNWUwLCAweDIwMDksIDB4MTk5OCwgMHgyMTA0LCAweDgwMDEsIDB4MjAwYSwgMHgwODBjLCAweDJiZWIsCisJMHgxMTc4LCAweDc4NTAsIDB4OTA4NCwgMHhlZmZmLCAweDc4NTIsIDB4N2EzOCwgMHg5Mjk0LCAweDAwMDUsCisJMHg5Mjk2LCAweDAwMDUsIDB4MDUxOCwgMHgyMDA5LCAweDE5OTcsIDB4MjEwNCwgMHhjMDg1LCAweDIwMGEsCisJMHgyMDA5LCAweDE5OTQsIDB4MjEwNCwgMHg4MDAwLCAweDIwMGEsIDB4OTA4NiwgMHgwMDA1LCAweDAxMTgsCisJMHgwODBjLCAweDJiM2UsIDB4MDBjMCwgMHgyMDBiLCAweDAwMDAsIDB4N2EzOCwgMHg5Mjk0LCAweDAwMDYsCisJMHg5Mjk2LCAweDAwMDQsIDB4MDExMCwgMHg5MDA2LCAweDAwMTAsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsCisJMHgyYmM2LCAweDIwMDEsIDB4MTk5MSwgMHgyMDAzLCAweDAwMDIsIDB4MDAyOCwgMHgyMDAxLCAweDE5OGYsCisJMHgyMDAzLCAweDAwMDMsIDB4MDAxMCwgMHgwODBjLCAweDJhMGIsIDB4MDAwNSwgMHgwODBjLCAweDJiMzYsCisJMHgwNTYwLCAweDIwMDksIDB4MTk5OCwgMHgyMTA0LCAweDgwMDEsIDB4MjAwYSwgMHgwODBjLCAweDJiZWIsCisJMHgxMTY4LCAweDc4NTAsIDB4OTA4NCwgMHhlZmZmLCAweDc4NTIsIDB4MjAwMSwgMHgxOThmLCAweDIwMDMsCisJMHgwMDAzLCAweDIwMDEsIDB4MTk5MCwgMHgyMDAzLCAweDAwMDAsIDB4MDBiOCwgMHgyMDA5LCAweDE5OTgsCisJMHgyMTA0LCAweDkwMDUsIDB4MTExOCwgMHgwODBjLCAweDJiN2IsIDB4MDAxMCwgMHgwODBjLCAweDJiNGIsCisJMHgwODBjLCAweDJiM2UsIDB4MjAwOSwgMHgxOTk0LCAweDIwMGIsIDB4MDAwMCwgMHgyMDAxLCAweDE5OTEsCisJMHgyMDAzLCAweDAwMDEsIDB4MDgwYywgMHgyYTBiLCAweDAwMDAsIDB4MDAwNSwgMHgwNGI5LCAweDA1MDgsCisJMHgwODBjLCAweDJiZWIsIDB4MTFiOCwgMHg3ODUwLCAweDkwODQsIDB4ZWZmZiwgMHg3ODUyLCAweDIwMDksCisJMHgxOTk1LCAweDIxMDQsIDB4ODAwMCwgMHgyMDBhLCAweDkwODYsIDB4MDAwNywgMHgwMTA4LCAweDAwNzgsCisJMHgyMDAxLCAweDE5OWEsIDB4MjAwMywgMHgwMDBhLCAweDIwMDksIDB4MTk5NywgMHgyMTA0LCAweGMwZmQsCisJMHgyMDBhLCAweDAwMzgsIDB4MDQxOSwgMHgyMDAxLCAweDE5OTEsIDB4MjAwMywgMHgwMDA0LCAweDA4MGMsCisJMHgyYTM2LCAweDAwMDUsIDB4MDA5OSwgMHgwMTY4LCAweDA4MGMsIDB4MmJlYiwgMHgxMTM4LCAweDc4NTAsCisJMHg5MDg0LCAweGVmZmYsIDB4Nzg1MiwgMHgwODBjLCAweDJhMjIsIDB4MDAxOCwgMHgwMDc5LCAweDA4MGMsCisJMHgyYTM2LCAweDAwMDUsIDB4MDgwYywgMHgwZGQ1LCAweDA4MGMsIDB4MGRkNSwgMHgyMDA5LCAweDE5OTksCisJMHgyMTA0LCAweDgwMDEsIDB4MjAwYSwgMHgwOTBjLCAweDJiOTcsIDB4MDAwNSwgMHg3YTM4LCAweDkyOTQsCisJMHgwMDA1LCAweDkyOTYsIDB4MDAwNSwgMHgwMTEwLCAweDkwMDYsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDEsCisJMHgwODBjLCAweDJiYzYsIDB4MDAwNSwgMHg3YTM4LCAweDkyOTQsIDB4MDAwNiwgMHg5Mjk2LCAweDAwMDYsCisJMHgwMTEwLCAweDkwMDYsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyYmE5LCAweDAwMDUsCisJMHgyMDA5LCAweDE5OTQsIDB4MjEwNCwgMHg4MDAwLCAweDIwMGEsIDB4OTA4NiwgMHgwMDA1LCAweDAxMDgsCisJMHgwMDY4LCAweDIwMGIsIDB4MDAwMCwgMHg3YTM4LCAweDkyOTQsIDB4MDAwNiwgMHg5Mjk2LCAweDAwMDYsCisJMHgwMTEwLCAweDkwMDYsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDEsIDB4MDRkOSwgMHg3YTM4LCAweDkyOTQsCisJMHgwMDA1LCAweDkyOTYsIDB4MDAwNSwgMHgwMTEwLCAweDkwMDYsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDEsCisJMHgwODBjLCAweDJiYzYsIDB4MDAwNSwgMHgwMDg2LCAweDIwMDEsIDB4MTk5NywgMHgyMDA0LCAweDkwODQsCisJMHg3ZmZmLCAweDA5MGMsIDB4MGRkNSwgMHgyMDA5LCAweDE5OTYsIDB4MjE0NCwgMHg4ODQ2LCAweDI4MGEsCisJMHg5ODQ0LCAweDBkZDgsIDB4ZDA4YywgMHgxMTIwLCAweGQwODQsIDB4MTEyMCwgMHgwODBjLCAweDBkZDUsCisJMHg5MDA2LCAweDAwMTAsIDB4MjAwMSwgMHgwMDAxLCAweDAwYTEsIDB4MDA4ZSwgMHgwMDA1LCAweDAwMDYsCisJMHgwMTU2LCAweDIwMDEsIDB4MTk4ZiwgMHgyMGE5LCAweDAwMDksIDB4MjAwMywgMHgwMDAwLCAweDgwMDAsCisJMHgxZjA0LCAweDJiOWQsIDB4MjAwMSwgMHgxOTk2LCAweDIwMDMsIDB4ODAwMCwgMHgwMTVlLCAweDAwMGUsCisJMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDkwODUsIDB4MDAwMCwgMHgwMTU4LCAweDc4MzgsCisJMHg5MDg0LCAweGZmZjksIDB4OTA4NSwgMHgwMDA0LCAweDc4M2EsIDB4MjAwOSwgMHgxOTljLCAweDIxMGMsCisJMHg3OTVhLCAweDAwNTAsIDB4NzgzOCwgMHg5MDg0LCAweGZmZmIsIDB4OTA4NSwgMHgwMDA2LCAweDc4M2EsCisJMHgyMDA5LCAweDE5OWQsIDB4MjEwYywgMHg3OTVhLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDIwNzksCisJMHgwMTAwLCAweDkwODUsIDB4MDAwMCwgMHgwMTM4LCAweDc4MzgsIDB4OTA4NCwgMHhmZmZhLCAweDkwODUsCisJMHgwMDA0LCAweDc4M2EsIDB4MDAzMCwgMHg3ODM4LCAweDkwODQsIDB4ZmZmYiwgMHg5MDg1LCAweDAwMDUsCisJMHg3ODNhLCAweDAwZmUsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweDkwODIsCisJMHgwMDA3LCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweDkwODIsCisJMHgwMDA5LCAweDAwMGUsIDB4MDAwNSwgMHgwMTU2LCAweDIwYTksIDB4MDA2NCwgMHg3ODIwLCAweDA4MGMsCisJMHgyYzc2LCAweGQwOWMsIDB4MTExMCwgMHgxZjA0LCAweDJiZWUsIDB4MDE1ZSwgMHgwMDA1LCAweDAxMjYsCisJMHgwMDE2LCAweDAwMDYsIDB4MjA5MSwgMHg4MDAwLCAweDc4NTAsIDB4OTA4NSwgMHgwMDQwLCAweDc4NTIsCisJMHg3ODUwLCAweDkwODQsIDB4ZmJjZiwgMHg3ODUyLCAweDA4MGMsIDB4MmM3NiwgMHg5MDg1LCAweDIwMDAsCisJMHg3ODUyLCAweDAwMGUsIDB4MjAwOCwgMHg5MTg2LCAweDAwMDAsIDB4MTExOCwgMHg3ODNiLCAweDAwMDcsCisJMHgwMDkwLCAweDkxODYsIDB4MDAwMSwgMHgxMTE4LCAweDc4M2IsIDB4MDAwNiwgMHgwMDYwLCAweDkxODYsCisJMHgwMDAyLCAweDExMTgsIDB4NzgzYiwgMHgwMDA1LCAweDAwMzAsIDB4OTE4NiwgMHgwMDAzLCAweDExMTgsCisJMHg3ODNiLCAweDAwMDQsIDB4MDAwMCwgMHgwMDA2LCAweDFkMDQsIDB4MmMyNCwgMHgwODBjLCAweDg2NmEsCisJMHgxZjA0LCAweDJjMjQsIDB4Nzg1MCwgMHg5MDg1LCAweDA0MDAsIDB4OTA4NCwgMHhkZmJmLCAweDc4NTIsCisJMHgwODBjLCAweDJjNzYsIDB4OTA4NSwgMHgxMDAwLCAweDc4NTIsIDB4MDAwZSwgMHgwMDFlLCAweDAxMmUsCisJMHgwMDA1LCAweDc4NTAsIDB4OTA4NCwgMHhmZmNmLCAweDc4NTIsIDB4MDAwNSwgMHgwMDA2LCAweDAxNTYsCisJMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHgyMGE5LCAweDAwMGEsIDB4Nzg1NCwgMHhkMGFjLCAweDExMzAsCisJMHg3ODIwLCAweGQwZTQsIDB4MTE0MCwgMHgxZjA0LCAweDJjNDgsIDB4MDAyOCwgMHg3ODU0LCAweGQwOGMsCisJMHgxMTEwLCAweDFmMDQsIDB4MmM0ZSwgMHgwMGZlLCAweDAxNWUsIDB4MDAwZSwgMHgwMDA1LCAweDFkMDQsCisJMHgyYzU3LCAweDA4MGMsIDB4ODY2YSwgMHgxZjA0LCAweDJjNTcsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsCisJMHgxOTliLCAweDIwMDQsIDB4OTA4NiwgMHgwMDAwLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsCisJMHgxOTliLCAweDIwMDQsIDB4OTA4NiwgMHgwMDAxLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsCisJMHgxOTliLCAweDIwMDQsIDB4OTA4NiwgMHgwMDAyLCAweDAwMGUsIDB4MDAwNSwgMHhhMDAxLCAweGEwMDEsCisJMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHgxOWE3LCAweDIxMDIsCisJMHgwMDBlLCAweDAwMDUsIDB4MjAwOSwgMHgwMTcxLCAweDIxMDQsIDB4ZDBkYywgMHgwMTQwLCAweDIwMDksCisJMHgwMTcwLCAweDIxMDQsIDB4MjAwYiwgMHgwMDgwLCAweGEwMDEsIDB4YTAwMSwgMHgyMDBhLCAweDAwMDUsCisJMHgwMDM2LCAweDAwNDYsIDB4MjAwMSwgMHgwMTQxLCAweDIwMGMsIDB4OTE4YywgMHhmZjAwLCAweDkxODYsCisJMHgyMTAwLCAweDAxNDAsIDB4OTE4NiwgMHgyMDAwLCAweDAxNzAsIDB4OTE4NiwgMHgwMTAwLCAweDE5MDQsCisJMHgyY2VmLCAweDAwNDgsIDB4MDAxNiwgMHgyMDA5LCAweDFhODIsIDB4MjEwNCwgMHg4MDAwLCAweDAyMDgsCisJMHgyMDBhLCAweDAwMWUsIDB4MDRmMCwgMHgyMDA5LCAweDAwYTIsIDB4MDgwYywgMHgwZTUxLCAweDIwMTksCisJMHgwMTYwLCAweDIzMjQsIDB4MjAxMSwgMHgwMDAzLCAweDIwMDksIDB4MDE2OSwgMHgyMTA0LCAweDkwODQsCisJMHgwMDA3LCAweDIxMGMsIDB4OTE4YywgMHgwMDA3LCAweDkxMGUsIDB4MWRiMCwgMHg5MDg2LCAweDAwMDMsCisJMHgxNTQ4LCAweDIzMDQsIDB4MDA2NiwgMHgwMDc2LCAweDIwMzEsIDB4MDAwMiwgMHgyMzNjLCAweDk3M2UsCisJMHgwMTQ4LCAweDg2MzEsIDB4MWRkOCwgMHgyMDMxLCAweDFhODMsIDB4MjYzYywgMHg4NzM4LCAweDAyMDgsCisJMHgyNzMyLCAweDIzMDQsIDB4MDA3ZSwgMHgwMDZlLCAweDk0MDIsIDB4MDJhMCwgMHgxOWQwLCAweDgyMTEsCisJMHgxOWQ4LCAweDg0ZmYsIDB4MDE3MCwgMHgyMDAxLCAweDAxNDEsIDB4MjAwYywgMHg5MThjLCAweGZmMDAsCisJMHg5MTg2LCAweDAxMDAsIDB4MDEzMCwgMHgyMDA5LCAweDE4MGMsIDB4MjEwNCwgMHhjMGRkLCAweDIwMGEsCisJMHgwMDA4LCAweDA0MjEsIDB4MjAwMSwgMHgxOTgwLCAweDIwMGMsIDB4MDgwYywgMHgwZTUxLCAweDAwNGUsCisJMHgwMDNlLCAweDAwMDUsIDB4MjAwMSwgMHgxODBjLCAweDIwMDQsIDB4ZDBkYywgMHgwMWIwLCAweDIwMDEsCisJMHgwMTYwLCAweDIwMDQsIDB4OTAwNSwgMHgwMTQwLCAweDIwMDEsIDB4MDE0MSwgMHgyMDA0LCAweDkwODQsCisJMHhmZjAwLCAweDkwODYsIDB4MDEwMCwgMHgxMTQ4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwMTYsCisJMHgwMDI2LCAweDAwMjEsIDB4MDAyZSwgMHgwMDFlLCAweDAxMmUsIDB4MDAwNSwgMHgwMGM2LCAweDIwNjEsCisJMHgwMTAwLCAweDYwMTQsIDB4MDAwNiwgMHgyMDAxLCAweDAxNjEsIDB4MjAwMywgMHgwMDAwLCAweDYwMTcsCisJMHgwMDE4LCAweGEwMDEsIDB4YTAwMSwgMHg2MDJmLCAweDAwMDgsIDB4NjEwNCwgMHg5MThlLCAweDAwMTAsCisJMHg2MTA2LCAweDkxOGUsIDB4MDAxMCwgMHg2MTA2LCAweDYwMTcsIDB4MDA0MCwgMHgwNGI5LCAweDAwMWUsCisJMHg5MTg0LCAweDAwMDMsIDB4MDFlMCwgMHgwMDM2LCAweDAwMTYsIDB4MjAxOSwgMHgwMTQxLCAweDYxMjQsCisJMHg5MThjLCAweDAwMjgsIDB4MTEyMCwgMHgyMzA0LCAweDkwODQsIDB4MjgwMCwgMHgwZGMwLCAweDAwMWUsCisJMHg5MTljLCAweGZmZTQsIDB4OTE4NCwgMHgwMDAxLCAweDAxMTgsIDB4OTM4NSwgMHgwMDA5LCAweDYwMTYsCisJMHg5MTg0LCAweDAwMDIsIDB4MDExOCwgMHg5Mzg1LCAweDAwMTIsIDB4NjAxNiwgMHgwMDNlLCAweDIwMDEsCisJMHgxODBjLCAweDIwMGMsIDB4YzFkYywgMHgyMTAyLCAweDAwY2UsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsCisJMHgwODBjLCAweDc0NTgsIDB4MDEwOCwgMHhjMGJjLCAweDIwMDksIDB4MDE0MCwgMHgyMTE0LCAweDkyOTQsCisJMHgwMDAxLCAweDkyMTUsIDB4MjIwYSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsCisJMHgyMDA5LCAweDAxNDAsIDB4MjExNCwgMHg5Mjk0LCAweDAwMDEsIDB4OTI4NSwgMHgxMDAwLCAweDIwMGEsCisJMHgyMjBhLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgyMDA5LCAweDAxNDAsCisJMHgyMTE0LCAweDkyOTQsIDB4MDAwMSwgMHg5MjE1LCAweDIyMGEsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsCisJMHgwMDA2LCAweDAwMTYsIDB4MjAwOSwgMHgwMTQwLCAweDIxMDQsIDB4MTEyOCwgMHgwODBjLCAweDc0NTgsCisJMHgwMTEwLCAweGMwYmMsIDB4MDAwOCwgMHhjMGJkLCAweDIwMGEsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsCisJMHgyZmY0LCAweDJmZjQsIDB4MmUxOCwgMHgyZTE4LCAweDJlMjQsIDB4MmUyNCwgMHgyZTMwLCAweDJlMzAsCisJMHgyZTNlLCAweDJlM2UsIDB4MmU0YSwgMHgyZTRhLCAweDJlNTgsIDB4MmU1OCwgMHgyZTY2LCAweDJlNjYsCisJMHgyZTc4LCAweDJlNzgsIDB4MmU4NCwgMHgyZTg0LCAweDJlOTIsIDB4MmU5MiwgMHgyZWIwLCAweDJlYjAsCisJMHgyZWQwLCAweDJlZDAsIDB4MmVhMCwgMHgyZWEwLCAweDJlYzAsIDB4MmVjMCwgMHgyZWRlLCAweDJlZGUsCisJMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsCisJMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsCisJMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsCisJMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsCisJMHgyZWYwLCAweDJlZjAsIDB4MmVmYywgMHgyZWZjLCAweDJmMGEsIDB4MmYwYSwgMHgyZjE4LCAweDJmMTgsCisJMHgyZjI4LCAweDJmMjgsIDB4MmYzNiwgMHgyZjM2LCAweDJmNDYsIDB4MmY0NiwgMHgyZjU2LCAweDJmNTYsCisJMHgyZjY4LCAweDJmNjgsIDB4MmY3NiwgMHgyZjc2LCAweDJmODYsIDB4MmY4NiwgMHgyZmE4LCAweDJmYTgsCisJMHgyZmNhLCAweDJmY2EsIDB4MmY5NiwgMHgyZjk2LCAweDJmYjksIDB4MmZiOSwgMHgyZmQ5LCAweDJmZDksCisJMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsCisJMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsCisJMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsCisJMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsCisJMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsCisJMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsCisJMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsCisJMHgwODBjLCAweDI0YmYsIDB4MDgwNCwgMHgyZmVjLCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsCisJMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjJkMywgMHgwODA0LCAweDJmZWMsCisJMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsCisJMHgwODBjLCAweDIyZDMsIDB4MDgwYywgMHgyNGJmLCAweDA4MDQsIDB4MmZlYywgMHgwMTA2LCAweDAwMDYsCisJMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIzMGUsCisJMHgwODA0LCAweDJmZWMsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsCisJMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyNGJmLCAweDA4MGMsIDB4MjMwZSwgMHgwODA0LCAweDJmZWMsCisJMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsCisJMHgwODBjLCAweDIyZDMsIDB4MDgwYywgMHgyMzBlLCAweDA4MDQsIDB4MmZlYywgMHgwMTA2LCAweDAwMDYsCisJMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIyZDMsCisJMHgwODBjLCAweDI0YmYsIDB4MDgwYywgMHgyMzBlLCAweDA4MDQsIDB4MmZlYywgMHhhMDAxLCAweDBjZjAsCisJMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsCisJMHgwODBjLCAweDEzODAsIDB4MDgwNCwgMHgyZmVjLCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsCisJMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjRiZiwgMHgwODBjLCAweDEzODAsCisJMHgwODA0LCAweDJmZWMsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsCisJMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyMmQzLCAweDA4MGMsIDB4MTM4MCwgMHgwODA0LCAweDJmZWMsCisJMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsCisJMHgwODBjLCAweDI0YmYsIDB4MDgwYywgMHgxMzgwLCAweDA4MGMsIDB4MjMwZSwgMHgwODA0LCAweDJmZWMsCisJMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsCisJMHgwODBjLCAweDIyZDMsIDB4MDgwYywgMHgyNGJmLCAweDA4MGMsIDB4MTM4MCwgMHgwODA0LCAweDJmZWMsCisJMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsCisJMHgwODBjLCAweDIyZDMsIDB4MDgwYywgMHgxMzgwLCAweDA4MGMsIDB4MjMwZSwgMHgwODA0LCAweDJmZWMsCisJMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsCisJMHgwODBjLCAweDEzODAsIDB4MDgwYywgMHgyMzBlLCAweDA4MDQsIDB4MmZlYywgMHgwMTA2LCAweDAwMDYsCisJMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIyZDMsCisJMHgwODBjLCAweDI0YmYsIDB4MDgwYywgMHgxMzgwLCAweDA4MGMsIDB4MjMwZSwgMHgwODA0LCAweDJmZWMsCisJMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsCisJMHgwODBjLCAweDI5N2YsIDB4MDgwNCwgMHgyZmVjLCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsCisJMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjk3ZiwgMHgwODBjLCAweDI0YmYsCisJMHgwODA0LCAweDJmZWMsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsCisJMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyOTdmLCAweDA4MGMsIDB4MjJkMywgMHgwODA0LCAweDJmZWMsCisJMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsCisJMHgwODBjLCAweDI5N2YsIDB4MDgwYywgMHgyMmQzLCAweDA4MGMsIDB4MjRiZiwgMHgwODA0LCAweDJmZWMsCisJMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsCisJMHgwODBjLCAweDI5N2YsIDB4MDgwYywgMHgyMzBlLCAweDA4MDQsIDB4MmZlYywgMHgwMTA2LCAweDAwMDYsCisJMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI5N2YsCisJMHgwODBjLCAweDI0YmYsIDB4MDgwYywgMHgyMzBlLCAweDA4MDQsIDB4MmZlYywgMHgwMTA2LCAweDAwMDYsCisJMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI5N2YsCisJMHgwODBjLCAweDIyZDMsIDB4MDgwYywgMHgyMzBlLCAweDA4MDQsIDB4MmZlYywgMHgwMTA2LCAweDAwMDYsCisJMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI5N2YsCisJMHgwODBjLCAweDIyZDMsIDB4MDgwYywgMHgyNGJmLCAweDA4MGMsIDB4MjMwZSwgMHgwODA0LCAweDJmZWMsCisJMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsCisJMHgwODBjLCAweDI5N2YsIDB4MDgwYywgMHgxMzgwLCAweDA4MDQsIDB4MmZlYywgMHgwMTA2LCAweDAwMDYsCisJMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI5N2YsCisJMHgwODBjLCAweDI0YmYsIDB4MDgwYywgMHgxMzgwLCAweDA4MDQsIDB4MmZlYywgMHgwMTA2LCAweDAwMDYsCisJMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI5N2YsCisJMHgwODBjLCAweDIyZDMsIDB4MDgwYywgMHgxMzgwLCAweDA4MDQsIDB4MmZlYywgMHgwMTA2LCAweDAwMDYsCisJMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI5N2YsCisJMHgwODBjLCAweDI0YmYsIDB4MDgwYywgMHgxMzgwLCAweDA4MGMsIDB4MjMwZSwgMHgwODA0LCAweDJmZWMsCisJMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsCisJMHgwODBjLCAweDI5N2YsIDB4MDgwYywgMHgyMmQzLCAweDA4MGMsIDB4MjRiZiwgMHgwODBjLCAweDEzODAsCisJMHgwNDk4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsCisJMHgwMTU2LCAweDA4MGMsIDB4Mjk3ZiwgMHgwODBjLCAweDIyZDMsIDB4MDgwYywgMHgxMzgwLCAweDA4MGMsCisJMHgyMzBlLCAweDA0MTAsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsCisJMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyOTdmLCAweDA4MGMsIDB4MTM4MCwgMHgwODBjLCAweDIzMGUsCisJMHgwMDk4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsCisJMHgwMTU2LCAweDA4MGMsIDB4Mjk3ZiwgMHgwODBjLCAweDIyZDMsIDB4MDgwYywgMHgyNGJmLCAweDA4MGMsCisJMHgxMzgwLCAweDA4MGMsIDB4MjMwZSwgMHgwMDAwLCAweDAxNWUsIDB4MDE0ZSwgMHgwMTNlLCAweDAxZGUsCisJMHgwMWNlLCAweDAxMmUsIDB4MDAwZSwgMHgwMTBlLCAweDAwMGQsIDB4MDBiNiwgMHgwMGM2LCAweDAwMjYsCisJMHgwMDQ2LCAweDkwMjYsIDB4MDgwYywgMHg2OWNhLCAweDE5MDQsIDB4MzEwNSwgMHg3MmRjLCAweDIwMDEsCisJMHgxOTdiLCAweDIwMDQsIDB4OTAwNSwgMHgxMTEwLCAweGQyOWMsIDB4MDE0OCwgMHhkMjg0LCAweDExMzgsCisJMHhkMmJjLCAweDE5MDQsIDB4MzEwNSwgMHgwODBjLCAweDMxMGEsIDB4MDgwNCwgMHgzMTA1LCAweGQyY2MsCisJMHgxOTA0LCAweDMxMDUsIDB4MDgwYywgMHg3NDNlLCAweDExMjAsIDB4NzBhZiwgMHhmZmZmLCAweDA4MDQsCisJMHgzMTA1LCAweGQyOTQsIDB4MDEyMCwgMHg3MGFmLCAweGZmZmYsIDB4MDgwNCwgMHgzMTA1LCAweDA4MGMsCisJMHgzMzczLCAweDAxNjAsIDB4MDgwYywgMHhkMzg4LCAweDAxMjgsIDB4MjAwMSwgMHgxODE4LCAweDIwM2MsCisJMHgwODA0LCAweDMwOTIsIDB4NzBhZiwgMHhmZmZmLCAweDA4MDQsIDB4MzEwNSwgMHgyMDAxLCAweDE4MTgsCisJMHgyMDNjLCAweDcyOTQsIDB4ZDI4NCwgMHgwOTA0LCAweDMwOTIsIDB4ZDI4YywgMHgxOTA0LCAweDMwOTIsCisJMHgwMDM2LCAweDczYWMsIDB4OTM4ZSwgMHhmZmZmLCAweDExMTAsIDB4MjAxOSwgMHgwMDAxLCAweDgzMTQsCisJMHg5MmUwLCAweDFjODAsIDB4MmMwNCwgMHg5MzhjLCAweDAwMDEsIDB4MDEyMCwgMHg5MDg0LCAweGZmMDAsCisJMHg4MDA3LCAweDAwMTAsIDB4OTA4NCwgMHgwMGZmLCAweDk3MGUsIDB4MDVkMCwgMHg5MDhlLCAweDAwMDAsCisJMHgwNWI4LCAweDkwOGUsIDB4MDBmZiwgMHgxMTUwLCAweDcyMzAsIDB4ZDI4NCwgMHgxNWIwLCAweDcyOTQsCisJMHhjMjhkLCAweDcyOTYsIDB4NzBhZiwgMHhmZmZmLCAweDAwM2UsIDB4MDRhMCwgMHg5MDBlLCAweDA4MGMsCisJMHgyODdjLCAweDA4MGMsIDB4NjYzOCwgMHgxNTM4LCAweDkwMDYsIDB4YjhiYiwgMHgwNTIwLCAweGI4YWMsCisJMHg5MDA1LCAweDAxNDgsIDB4MDBjNiwgMHgyMDYwLCAweDA4MGMsIDB4OGEzZCwgMHgwMGNlLCAweDA5MGMsCisJMHg4ZGRhLCAweGI4YWYsIDB4MDAwMCwgMHgwODBjLCAweDZhMGMsIDB4MTE2OCwgMHg3MDMwLCAweGQwOGMsCisJMHgwMTMwLCAweGI4MDAsIDB4ZDBiYywgMHgwMTM4LCAweDA4MGMsIDB4NjhiOSwgMHgwMTIwLCAweDA4MGMsCisJMHgzMTIzLCAweDAxNDgsIDB4MDAyOCwgMHgwODBjLCAweDMyNjMsIDB4MDgwYywgMHgzMTRmLCAweDAxMTgsCisJMHg4MzE4LCAweDA4MDQsIDB4MzAzZiwgMHg3M2FlLCAweDAwMTAsIDB4NzBhZiwgMHhmZmZmLCAweDAwM2UsCisJMHgwODA0LCAweDMxMDUsIDB4OTc4MCwgMHgzMzg0LCAweDIwM2QsIDB4OTdiYywgMHhmZjAwLCAweDg3M2YsCisJMHgyMDQxLCAweDAwN2UsIDB4NzBhYywgMHg5MDk2LCAweGZmZmYsIDB4MTExOCwgMHg5MDBlLCAweDI4YTgsCisJMHgwMDUwLCAweDk4MTIsIDB4MDIyMCwgMHgyMDA4LCAweDk4MDIsIDB4MjBhOCwgMHgwMDIwLCAweDcwYWYsCisJMHhmZmZmLCAweDA4MDQsIDB4MzEwNSwgMHgyNzAwLCAweDAxNTYsIDB4MDAxNiwgMHg5MTA2LCAweDA5MDQsCisJMHgzMGZhLCAweGM0ODQsIDB4MDgwYywgMHg2Njk5LCAweDAxNDgsIDB4MDgwYywgMHhkMzg4LCAweDE5MDQsCisJMHgzMGZhLCAweDA4MGMsIDB4NjYzOCwgMHgxOTA0LCAweDMxMDIsIDB4MDAwOCwgMHhjNDg1LCAweGI4YmIsCisJMHgwNTIwLCAweGI4YWMsIDB4OTAwNSwgMHgwMTQ4LCAweDAwYzYsIDB4MjA2MCwgMHgwODBjLCAweDhhM2QsCisJMHgwMGNlLCAweDA5MGMsIDB4OGRkYSwgMHhiOGFmLCAweDAwMDAsIDB4MDgwYywgMHg2YTBjLCAweDExMzAsCisJMHg3MDMwLCAweGQwOGMsIDB4MDFmOCwgMHhiODAwLCAweGQwYmMsIDB4MTFlMCwgMHg3Mjk0LCAweGQyOGMsCisJMHgwMTgwLCAweDA4MGMsIDB4NmEwYywgMHg5MDgyLCAweDAwMDYsIDB4MDJlMCwgMHhkNDg0LCAweDExMTgsCisJMHgwODBjLCAweDY2NWQsIDB4MDAyOCwgMHgwODBjLCAweDMyZWYsIDB4MDFhMCwgMHgwODBjLCAweDMzMWEsCisJMHgwMDg4LCAweDA4MGMsIDB4MzI2MywgMHgwODBjLCAweGQzODgsIDB4MTE2MCwgMHgwODBjLCAweDMxNGYsCisJMHgwMTg4LCAweDAwNDAsIDB4MDgwYywgMHhkMzg4LCAweDExMTgsIDB4MDgwYywgMHgzMmVmLCAweDAxMTAsCisJMHgwNDUxLCAweDAxNDAsIDB4MDAxZSwgMHg4MTA4LCAweDAxNWUsIDB4MWYwNCwgMHgzMGFiLCAweDcwYWYsCisJMHhmZmZmLCAweDAwMTgsIDB4MDAxZSwgMHgwMTVlLCAweDcxYWUsIDB4MDA0ZSwgMHgwMDJlLCAweDAwY2UsCisJMHgwMGJlLCAweDAwMDUsIDB4MDBjNiwgMHgwMDE2LCAweDcwYWYsIDB4MDAwMSwgMHgyMDA5LCAweDAwN2UsCisJMHgwODBjLCAweDY2MzgsIDB4MTE2OCwgMHhiODEzLCAweDAwZmYsIDB4YjgxNywgMHhmZmZlLCAweDA4MGMsCisJMHgzMjYzLCAweDA0YTksIDB4MDEyOCwgMHg3MGRjLCAweGMwYmQsIDB4NzBkZSwgMHgwODBjLCAweGQwZDksCisJMHgwMDFlLCAweDAwY2UsIDB4MDAwNSwgMHgwMDE2LCAweDAwNzYsIDB4MDBkNiwgMHgwMGM2LCAweDIwMDEsCisJMHgxODRjLCAweDIwMDQsIDB4OTA4NCwgMHgwMGZmLCAweGI4NDIsIDB4MDgwYywgMHhhZjkxLCAweDAxZDAsCisJMHgyYjAwLCAweDYwMTIsIDB4MDgwYywgMHhkMTAyLCAweDYwMjMsIDB4MDAwMSwgMHg5MDA2LCAweDA4MGMsCisJMHg2NWQ1LCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLCAweDY1ZTksIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHg3MGE4LCAweDgwMDAsIDB4NzBhYSwgMHgwMTJlLCAweDIwMDksIDB4MDAwNCwgMHgwODBjLCAweGFmYmUsCisJMHg5MDg1LCAweDAwMDEsIDB4MDBjZSwgMHgwMGRlLCAweDAwN2UsIDB4MDAxZSwgMHgwMDA1LCAweDAwMTYsCisJMHgwMDc2LCAweDAwZDYsIDB4MDBjNiwgMHgyMDAxLCAweDE4NGMsIDB4MjAwNCwgMHg5MDg0LCAweDAwZmYsCisJMHhiODQyLCAweDA4MGMsIDB4YWY5MSwgMHgwNTQ4LCAweDJiMDAsIDB4NjAxMiwgMHhiODAwLCAweGMwYzQsCisJMHhiODAyLCAweGI4YTAsIDB4OTA4NiwgMHgwMDdlLCAweDAxNDAsIDB4YjgwNCwgMHg5MDg0LCAweDAwZmYsCisJMHg5MDg2LCAweDAwMDYsIDB4MTExMCwgMHgwODBjLCAweDMyMWUsIDB4MDgwYywgMHhkMTAyLCAweDYwMjMsCisJMHgwMDAxLCAweDkwMDYsIDB4MDgwYywgMHg2NWQ1LCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDY1ZTksCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MGE4LCAweDgwMDAsIDB4NzBhYSwgMHgwMTJlLCAweDIwMDksCisJMHgwMDAyLCAweDA4MGMsIDB4YWZiZSwgMHg5MDg1LCAweDAwMDEsIDB4MDBjZSwgMHgwMGRlLCAweDAwN2UsCisJMHgwMDFlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGM2LCAweDAwMjYsIDB4MjAwOSwgMHgwMDgwLCAweDA4MGMsCisJMHg2NjM4LCAweDExNDAsIDB4YjgxMywgMHgwMGZmLCAweGI4MTcsIDB4ZmZmYywgMHgwMDM5LCAweDAxMTAsCisJMHg3MGUzLCAweGZmZmYsIDB4MDAyZSwgMHgwMGNlLCAweDAwYmUsIDB4MDAwNSwgMHgwMDE2LCAweDAwNzYsCisJMHgwMGQ2LCAweDAwYzYsIDB4MDgwYywgMHhhZWVkLCAweDAxZDAsIDB4MmIwMCwgMHg2MDEyLCAweDA4MGMsCisJMHhkMTAyLCAweDYwMjMsIDB4MDAwMSwgMHg5MDA2LCAweDA4MGMsIDB4NjVkNSwgMHgyMDAxLCAweDAwMDIsCisJMHgwODBjLCAweDY1ZTksIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzBlNCwgMHg4MDAwLCAweDcwZTYsCisJMHgwMTJlLCAweDIwMDksIDB4MDAwMiwgMHgwODBjLCAweGFmYmUsIDB4OTA4NSwgMHgwMDAxLCAweDAwY2UsCisJMHgwMGRlLCAweDAwN2UsIDB4MDAxZSwgMHgwMDA1LCAweDAwYzYsIDB4MDBkNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDIwMDksIDB4MDA3ZiwgMHgwODBjLCAweDY2MzgsIDB4MTFiOCwgMHhiODEzLCAweDAwZmYsCisJMHhiODE3LCAweGZmZmQsIDB4YjhjZiwgMHgwMDA0LCAweDA4MGMsIDB4YWVlZCwgMHgwMTcwLCAweDJiMDAsCisJMHg2MDEyLCAweDYzMTYsIDB4NjAyMywgMHgwMDAxLCAweDYyMGEsIDB4MDgwYywgMHhkMTAyLCAweDIwMDksCisJMHgwMDIyLCAweDA4MGMsIDB4YWZiZSwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGRlLCAweDAwY2UsCisJMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMDY2LCAweDAwMzYsIDB4MDAyNiwgMHgwMGI2LCAweDIxZjAsCisJMHgwODBjLCAweDkzNjEsIDB4MDgwYywgMHg5MmUxLCAweDA4MGMsIDB4YWQ4MSwgMHgwODBjLCAweGJlNmIsCisJMHgzZTA4LCAweDIxMzAsIDB4ODFmZiwgMHgwMTIwLCAweDIwYTksIDB4MDA3ZSwgMHg5MDBlLCAweDAwMTgsCisJMHgyMGE5LCAweDAwN2YsIDB4OTAwZSwgMHgwMDE2LCAweDA4MGMsIDB4NjY5OSwgMHgxMTQwLCAweDk2ODYsCisJMHgwMDAyLCAweDExMTgsIDB4YjgwMCwgMHhkMGJjLCAweDExMTAsIDB4MDgwYywgMHg2MGM3LCAweDAwMWUsCisJMHg4MTA4LCAweDFmMDQsIDB4MzIwMywgMHg5Njg2LCAweDAwMDEsIDB4MTkwYywgMHgzMzQ3LCAweDAwYmUsCisJMHgwMDJlLCAweDAwM2UsIDB4MDA2ZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwYzYsCisJMHgwMDQ2LCAweDAwMzYsIDB4MDAyNiwgMHgwMDE2LCAweDAwYjYsIDB4NjIxMCwgMHgyMjU4LCAweGJhYTAsCisJMHgwMDI2LCAweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweDkzNTYsIDB4MDA3NiwgMHgyMDM5LCAweDAwMDAsCisJMHgwODBjLCAweDkyMjksIDB4MmMwOCwgMHgwODBjLCAweGU0NzcsIDB4MDA3ZSwgMHgwMDFlLCAweGJhMTAsCisJMHhiYjE0LCAweGJjYzAsIDB4MDgwYywgMHg2MGM3LCAweGJhMTIsIDB4YmIxNiwgMHhiY2MyLCAweDAwYmUsCisJMHgwMDFlLCAweDAwMmUsIDB4MDAzZSwgMHgwMDRlLCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsCisJMHgwMDA2LCAweDAwYjYsIDB4NjAxMCwgMHgyMDU4LCAweGI4YTAsIDB4MDBiZSwgMHg5MDg2LCAweDAwODAsCisJMHgwMTUwLCAweDIwNzEsIDB4MTgwMCwgMHg3MGE4LCAweDkwMDUsIDB4MDExMCwgMHg4MDAxLCAweDcwYWEsCisJMHgwMDBlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDcxLCAweDE4MDAsIDB4NzBlNCwgMHg5MDA1LCAweDBkYzAsCisJMHg4MDAxLCAweDcwZTYsIDB4MGNhOCwgMHhiODAwLCAweGMwOGMsIDB4YjgwMiwgMHgwMDA1LCAweDAwZjYsCisJMHgwMGU2LCAweDAwYzYsIDB4MDBiNiwgMHgwMDQ2LCAweDAwMzYsIDB4MDAyNiwgMHgwMDE2LCAweDAxNTYsCisJMHgyMTc4LCAweDgxZmYsIDB4MTExOCwgMHgyMGE5LCAweDAwMDEsIDB4MDA3OCwgMHgwODBjLCAweDU3NWQsCisJMHhkMGM0LCAweDAxNDAsIDB4ZDBhNCwgMHgwMTMwLCAweDkwMDYsIDB4MjAyMCwgMHgyMDA5LCAweDAwMmQsCisJMHgwODBjLCAweGU3M2EsIDB4MjBhOSwgMHgwODAwLCAweDkwMTYsIDB4MDAyNiwgMHg5MjhlLCAweDAwN2UsCisJMHgwOTA0LCAweDMyY2UsIDB4OTI4ZSwgMHgwMDdmLCAweDA5MDQsIDB4MzJjZSwgMHg5MjhlLCAweDAwODAsCisJMHgwNWU4LCAweDkyODgsIDB4MTAwMCwgMHgyMTBjLCAweDgxZmYsIDB4MDVjMCwgMHg4ZmZmLCAweDExNDgsCisJMHgyMDAxLCAweDE5OGQsIDB4MDAwNiwgMHgyMDAzLCAweDAwMDEsIDB4MDRmMSwgMHgwMDBlLCAweDIwMDMsCisJMHgwMDAwLCAweDAwYjYsIDB4MDBjNiwgMHgyMTU4LCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDY5ZDYsCisJMHgwMGNlLCAweDAwYmUsIDB4MjAxOSwgMHgwMDI5LCAweDA4MGMsIDB4OTM1NiwgMHgwMDc2LCAweDIwMzksCisJMHgwMDAwLCAweDA4MGMsIDB4OTIyOSwgMHgwMGI2LCAweDAwYzYsIDB4MDAyNiwgMHgyMTU4LCAweGJhMDQsCisJMHg5Mjk0LCAweDAwZmYsIDB4OTI4NiwgMHgwMDA2LCAweDExMTgsIDB4YjgwNywgMHgwNDA0LCAweDAwMjgsCisJMHgyMDAxLCAweDAwMDQsIDB4ODAwNywgMHg5MjE1LCAweGJhMDYsIDB4MDAyZSwgMHgwMGNlLCAweDAwYmUsCisJMHgwMDE2LCAweDJjMDgsIDB4MDgwYywgMHhlNDc3LCAweDAwMWUsIDB4MDA3ZSwgMHgwMDJlLCAweDgyMTAsCisJMHgxZjA0LCAweDMyODUsIDB4MDE1ZSwgMHgwMDFlLCAweDAwMmUsIDB4MDAzZSwgMHgwMDRlLCAweDAwYmUsCisJMHgwMGNlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDAwNDYsIDB4MDAyNiwgMHgwMDE2LCAweDA4MGMsCisJMHg1NzVkLCAweGQwYzQsIDB4MDE0MCwgMHhkMGE0LCAweDAxMzAsIDB4OTAwNiwgMHgyMjIwLCAweDIwMDksCisJMHgwMDI5LCAweDA4MGMsIDB4ZTczYSwgMHgwMDFlLCAweDAwMmUsIDB4MDA0ZSwgMHgwMDA1LCAweDAwMTYsCisJMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwgMHg3Mjk0LCAweDgyZmYsIDB4MDFlOCwgMHgwODBjLCAweDZhMDQsCisJMHgxMWQwLCAweDIxMDAsIDB4MDgwYywgMHgyOGFmLCAweDgxZmYsIDB4MDFiOCwgMHgyMDE5LCAweDAwMDEsCisJMHg4MzE0LCAweDkyZTAsIDB4MWM4MCwgMHgyYzA0LCAweGQzODQsIDB4MDEyMCwgMHg5MDg0LCAweGZmMDAsCisJMHg4MDA3LCAweDAwMTAsIDB4OTA4NCwgMHgwMGZmLCAweDkxMTYsIDB4MDEzOCwgMHg5MDk2LCAweDAwZmYsCisJMHgwMTEwLCAweDgzMTgsIDB4MGM2OCwgMHg5MDg1LCAweDAwMDEsIDB4MDBjZSwgMHgwMDNlLCAweDAwMmUsCisJMHgwMDFlLCAweDAwMDUsIDB4MDAxNiwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwMzYsCisJMHgyMDE5LCAweDAwMjksIDB4MDBhOSwgMHgwMDNlLCAweDkxODAsIDB4MTAwMCwgMHgyMDA0LCAweDkwNjUsCisJMHgwMTU4LCAweDAwMTYsIDB4MDBjNiwgMHgyMDYxLCAweDFhYjIsIDB4MDAxZSwgMHg2MTEyLCAweDA4MGMsCisJMHgzMjFlLCAweDAwMWUsIDB4MDgwYywgMHg2NjVkLCAweDAxMmUsIDB4MDBjZSwgMHgwMDFlLCAweDAwMDUsCisJMHgwMDE2LCAweDAwMjYsIDB4MjExMCwgMHgwODBjLCAweGE4ZGMsIDB4MDgwYywgMHhlYWEzLCAweDAwMmUsCisJMHgwMDFlLCAweDAwMDUsIDB4MjAwMSwgMHgxODM3LCAweDIwMDQsIDB4ZDBjYywgMHgwMDA1LCAweDAwYzYsCisJMHgwMGI2LCAweDA4MGMsIDB4NzQzZSwgMHgxMTE4LCAweDIwYTksIDB4MDgwMCwgMHgwMDEwLCAweDIwYTksCisJMHgwNzgyLCAweDA4MGMsIDB4NzQzZSwgMHgxMTEwLCAweDkwMGUsIDB4MDAxMCwgMHgyMDA5LCAweDAwN2UsCisJMHg5MTgwLCAweDEwMDAsIDB4MjAwNCwgMHg5MDVkLCAweDAxMzAsIDB4ODZmZiwgMHgwMTEwLCAweGI4MDAsCisJMHhkMGJjLCAweDA5MGMsIDB4NjY1ZCwgMHg4MTA4LCAweDFmMDQsIDB4MzM1OCwgMHgyMDYxLCAweDE4MDAsCisJMHg2MDdmLCAweDAwMDAsIDB4NjA4MCwgMHg5MDg0LCAweDAwZmYsIDB4NjA4MiwgMHg2MGIzLCAweDAwMDAsCisJMHgwMGJlLCAweDAwY2UsIDB4MDAwNSwgMHgyMDAxLCAweDE4NjksIDB4MjAwNCwgMHhkMGJjLCAweDAwMDUsCisJMHgyMDExLCAweDE4NDgsIDB4MjIxNCwgMHhkMmVjLCAweDAwMDUsIDB4MDAyNiwgMHgyMDExLCAweDE4NjcsCisJMHgyMjE0LCAweGQyZGMsIDB4MDAyZSwgMHgwMDA1LCAweDdlZWYsIDB4N2RlOCwgMHg3Y2U0LCAweDgwZTIsCisJMHg3YmUxLCAweDgwZTAsIDB4ODBkYywgMHg4MGRhLCAweDdhZDksIDB4ODBkNiwgMHg4MGQ1LCAweDgwZDQsCisJMHg4MGQzLCAweDgwZDIsIDB4ODBkMSwgMHg3OWNlLCAweDc4Y2QsIDB4ODBjYywgMHg4MGNiLCAweDgwY2EsCisJMHg4MGM5LCAweDgwYzcsIDB4ODBjNiwgMHg3N2M1LCAweDc2YzMsIDB4ODBiYywgMHg4MGJhLCAweDc1YjksCisJMHg4MGI2LCAweDc0YjUsIDB4NzNiNCwgMHg3MmIzLCAweDgwYjIsIDB4ODBiMSwgMHg4MGFlLCAweDcxYWQsCisJMHg4MGFjLCAweDcwYWIsIDB4NmZhYSwgMHg2ZWE5LCAweDgwYTcsIDB4NmRhNiwgMHg2Y2E1LCAweDZiYTMsCisJMHg2YTlmLCAweDY5OWUsIDB4Njg5ZCwgMHg4MDliLCAweDgwOTgsIDB4Njc5NywgMHg2NjkwLCAweDY1OGYsCisJMHg2NDg4LCAweDYzODQsIDB4NjI4MiwgMHg4MDgxLCAweDgwODAsIDB4NjE3YywgMHg2MDdhLCAweDgwNzksCisJMHg1Zjc2LCAweDgwNzUsIDB4ODA3NCwgMHg4MDczLCAweDgwNzIsIDB4ODA3MSwgMHg4MDZlLCAweDVlNmQsCisJMHg4MDZjLCAweDVkNmIsIDB4NWM2YSwgMHg1YjY5LCAweDgwNjcsIDB4NWE2NiwgMHg1OTY1LCAweDU4NjMsCisJMHg1NzVjLCAweDU2NWEsIDB4NTU1OSwgMHg4MDU2LCAweDgwNTUsIDB4NTQ1NCwgMHg1MzUzLCAweDUyNTIsCisJMHg1MTUxLCAweDUwNGUsIDB4NGY0ZCwgMHg4MDRjLCAweDgwNGIsIDB4NGU0YSwgMHg0ZDQ5LCAweDgwNDcsCisJMHg0YzQ2LCAweDgwNDUsIDB4ODA0MywgMHg4MDNjLCAweDgwM2EsIDB4ODAzOSwgMHg4MDM2LCAweDRiMzUsCisJMHg4MDM0LCAweDRhMzMsIDB4NDkzMiwgMHg0ODMxLCAweDgwMmUsIDB4NDcyZCwgMHg0NjJjLCAweDQ1MmIsCisJMHg0NDJhLCAweDQzMjksIDB4NDIyNywgMHg4MDI2LCAweDgwMjUsIDB4NDEyMywgMHg0MDFmLCAweDNmMWUsCisJMHgzZTFkLCAweDNkMWIsIDB4M2MxOCwgMHg4MDE3LCAweDgwMTAsIDB4M2IwZiwgMHgzYTA4LCAweDgwMDQsCisJMHgzOTAyLCAweDgwMDEsIDB4ODAwMCwgMHg4MDAwLCAweDM4MDAsIDB4MzcwMCwgMHgzNjAwLCAweDgwMDAsCisJMHgzNTAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDM0MDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgzMzAwLCAweDMyMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgzMTAwLCAweDMwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDJmMDAsCisJMHg4MDAwLCAweDJlMDAsIDB4MmQwMCwgMHgyYzAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDJiMDAsCisJMHg4MDAwLCAweDJhMDAsIDB4MjkwMCwgMHgyODAwLCAweDgwMDAsIDB4MjcwMCwgMHgyNjAwLCAweDI1MDAsCisJMHgyNDAwLCAweDIzMDAsIDB4MjIwMCwgMHg4MDAwLCAweDgwMDAsIDB4MjEwMCwgMHgyMDAwLCAweDFmMDAsCisJMHgxZTAwLCAweDFkMDAsIDB4MWMwMCwgMHg4MDAwLCAweDgwMDAsIDB4MWIwMCwgMHgxYTAwLCAweDgwMDAsCisJMHgxOTAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDE4MDAsCisJMHg4MDAwLCAweDE3MDAsIDB4MTYwMCwgMHgxNTAwLCAweDgwMDAsIDB4MTQwMCwgMHgxMzAwLCAweDEyMDAsCisJMHgxMTAwLCAweDEwMDAsIDB4MGYwMCwgMHg4MDAwLCAweDgwMDAsIDB4MGUwMCwgMHgwZDAwLCAweDBjMDAsCisJMHgwYjAwLCAweDBhMDAsIDB4MDkwMCwgMHg4MDAwLCAweDgwMDAsIDB4MDgwMCwgMHgwNzAwLCAweDgwMDAsCisJMHgwNjAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDA1MDAsIDB4MDQwMCwgMHgwMzAwLCAweDgwMDAsCisJMHgwMjAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDAxMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgwMDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDIwNzEsIDB4MTg5ZSwgMHg3MDAzLCAweDAwMDIsCisJMHg5MDA2LCAweDcwMTYsIDB4NzAxYSwgMHg3MDRhLCAweDcwNGUsIDB4NzAwZSwgMHg3MDQyLCAweDcwNDYsCisJMHg3MDNiLCAweDE4YmEsIDB4NzAzZiwgMHgxOGJhLCAweDcwMDcsIDB4MDAwMSwgMHgwODBjLCAweDEwMTgsCisJMHgwOTBjLCAweDBkZDUsIDB4MjkwMCwgMHg3MDZhLCAweGE4NjcsIDB4MDAwMiwgMHhhOGFiLCAweGRjYjAsCisJMHgwODBjLCAweDEwMTgsIDB4MDkwYywgMHgwZGQ1LCAweDI5MDAsIDB4NzA2ZSwgMHhhODY3LCAweDAwMDIsCisJMHhhOGFiLCAweGRjYjAsIDB4MDAwNSwgMHgyMDcxLCAweDE4OWUsIDB4NzAwNCwgMHgwMDAyLCAweDM0YjMsCisJMHgzNGI0LCAweDM0YzcsIDB4MzRkYiwgMHgwMDA1LCAweDEwMDQsIDB4MzRjNCwgMHgwZTA0LCAweDM0YzQsCisJMHgyMDc5LCAweDAwMDAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAwYywgMHg5MDA1LCAweDExMjgsCisJMHg3MDBmLCAweDAwMDEsIDB4MDEyZSwgMHgwNDY4LCAweDAwMDUsIDB4MDEyZSwgMHgwY2U4LCAweDIwNzksCisJMHgwMDAwLCAweDIwNjEsIDB4MThiOCwgMHgyYzRjLCAweGE4NmMsIDB4OTA4ZSwgMHgwMTAwLCAweDAxMjgsCisJMHg5MDg2LCAweDAyMDAsIDB4MDkwNCwgMHgzNWFmLCAweDAwMDUsIDB4NzAxOCwgMHgyMDQ4LCAweDIwNjEsCisJMHgxODAwLCAweDcwMWMsIDB4MDgwNywgMHg3MDE0LCAweDIwNDgsIDB4YTg2NCwgMHg5MDk0LCAweDAwZmYsCisJMHg5Mjk2LCAweDAwMjksIDB4MTEyMCwgMHhhYTc4LCAweGQyZmMsIDB4MDEyOCwgMHgwMDA1LCAweDkwODYsCisJMHgwMTAzLCAweDAxMDgsIDB4MDAwNSwgMHgyMDc5LCAweDAwMDAsIDB4MjA2MSwgMHgxODAwLCAweDcwMWMsCisJMHgwODA3LCAweDIwNjEsIDB4MTgwMCwgMHg3ODgwLCAweDkwOGEsIDB4MDA0MCwgMHgxMjEwLCAweDYxZDAsCisJMHgwMDQyLCAweDIxMDAsIDB4OTA4YSwgMHgwMDNmLCAweDFhMDQsIDB4MzVhYywgMHg2MWQwLCAweDA4MDQsCisJMHgzNTQxLCAweDM1ODMsIDB4MzViYiwgMHgzNWFjLCAweDM1YzUsIDB4MzVjZiwgMHgzNWQ1LCAweDM1ZDksCisJMHgzNWU5LCAweDM1ZWQsIDB4MzYwMywgMHgzNjA5LCAweDM2MGYsIDB4MzYxYSwgMHgzNjI1LCAweDM2MzQsCisJMHgzNjQzLCAweDM2NTEsIDB4MzY2OCwgMHgzNjgzLCAweDM1YWMsIDB4MzcyYywgMHgzNzZhLCAweDM4MTAsCisJMHgzODIxLCAweDM4NDQsIDB4MzVhYywgMHgzNWFjLCAweDM1YWMsIDB4Mzg3YywgMHgzODk4LCAweDM4YTEsCisJMHgzOGQwLCAweDM4ZDYsIDB4MzVhYywgMHgzOTFjLCAweDM1YWMsIDB4MzVhYywgMHgzNWFjLCAweDM1YWMsCisJMHgzNWFjLCAweDM5MjcsIDB4MzkzMCwgMHgzOTM4LCAweDM5M2EsIDB4MzVhYywgMHgzNWFjLCAweDM1YWMsCisJMHgzNWFjLCAweDM1YWMsIDB4MzVhYywgMHgzOTY2LCAweDM1YWMsIDB4MzVhYywgMHgzNWFjLCAweDM1YWMsCisJMHgzNWFjLCAweDM5ODMsIDB4MzllNCwgMHgzNWFjLCAweDM1YWMsIDB4MzVhYywgMHgzNWFjLCAweDM1YWMsCisJMHgzNWFjLCAweDAwMDIsIDB4M2EwZSwgMHgzYTExLCAweDNhNzAsIDB4M2E4OSwgMHgzYWI5LCAweDNkNTcsCisJMHgzNWFjLCAweDUzMjEsIDB4MzVhYywgMHgzNWFjLCAweDM1YWMsIDB4MzVhYywgMHgzNWFjLCAweDM1YWMsCisJMHgzNWFjLCAweDM1YWMsIDB4MzYwMywgMHgzNjA5LCAweDQyNzgsIDB4NTc4MSwgMHg0Mjk2LCAweDUzYjAsCisJMHg1NDAxLCAweDU1MGMsIDB4MzVhYywgMHg1NTZlLCAweDU1YWEsIDB4NTVkYiwgMHg1NmUzLCAweDU2MDgsCisJMHg1NjYzLCAweDM1YWMsIDB4NDI5YSwgMHg0NDViLCAweDQ0NzEsIDB4NDQ5NiwgMHg0NGZiLCAweDQ1NmYsCisJMHg0NThmLCAweDQ2MDYsIDB4NDY2MiwgMHg0NmJlLCAweDQ2YzEsIDB4NDZlNiwgMHg0NzkxLCAweDQ3ZjcsCisJMHg0N2ZmLCAweDQ5MzEsIDB4NGFhOSwgMHg0YWRkLCAweDRkNDEsIDB4MzVhYywgMHg0ZDVmLCAweDRlMDUsCisJMHg0ZWU3LCAweDRmNDEsIDB4MzVhYywgMHg0ZmY4LCAweDM1YWMsIDB4NTA2MCwgMHg1MDdiLCAweDQ3ZmYsCisJMHg1MmMxLCAweDcxNGMsIDB4MDAwMCwgMHgyMDIxLCAweDQwMDAsIDB4MDgwYywgMHg0YjViLCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MGUwNCwgMHgzNThkLCAweDAwMTAsIDB4MDEyZSwgMHgwY2MwLCAweDdjMzYsCisJMHg5NDg2LCAweDQwMDAsIDB4MDExOCwgMHg3ODMzLCAweDAwMTEsIDB4MDAxMCwgMHg3ODMzLCAweDAwMTAsCisJMHg3YzgyLCAweDc5ODYsIDB4N2E4YSwgMHg3YjhlLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwODksCisJMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMTliLCAweDcwMDcsIDB4MDAwMSwgMHgyMDkxLCAweDUwMDAsCisJMHg3MDBmLCAweDAwMDAsIDB4MDEyZSwgMHgwMDA1LCAweDIwMjEsIDB4NDAwMSwgMHgwOGIwLCAweDIwMjEsCisJMHg0MDAyLCAweDA4OTgsIDB4MjAyMSwgMHg0MDAzLCAweDA4ODAsIDB4MjAyMSwgMHg0MDA1LCAweDA4NjgsCisJMHgyMDIxLCAweDQwMDYsIDB4MDg1MCwgMHgyMDM5LCAweDAwMDEsIDB4OTAyZSwgMHgyNTIwLCAweDdiODgsCisJMHg3YThjLCAweDc4ODQsIDB4Nzk5MCwgMHgwODA0LCAweDRiNjgsIDB4MjAzOSwgMHgwMDAxLCAweDkwMmUsCisJMHgyNTIwLCAweDdiODgsIDB4N2E4YywgMHg3ODg0LCAweDc5OTAsIDB4MDgwNCwgMHg0YjZiLCAweDc5ODQsCisJMHg3ODg4LCAweDIxMTQsIDB4MjAwYSwgMHgwODA0LCAweDM1ODMsIDB4Nzk4NCwgMHgyMTE0LCAweDA4MDQsCisJMHgzNTgzLCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAwMjEsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsCisJMHgwMDIxLCAweDIwYTksIDB4MDAxZiwgMHg0MDAzLCAweDc5ODQsIDB4N2E4OCwgMHg3YjhjLCAweDA4MDQsCisJMHgzNTgzLCAweDc4ODQsIDB4MjA2MCwgMHgwODA0LCAweDM2MzYsIDB4MjAwOSwgMHgwMDAzLCAweDIwMTEsCisJMHgwMDAzLCAweDIwMTksIDB4MDAwOCwgMHg3ODliLCAweDAxMzcsIDB4Nzg5MywgMHhmZmZmLCAweDIwMDEsCisJMHgxODhmLCAweDIwMDQsIDB4OTAwNSwgMHgwMTE4LCAweDc4OTYsIDB4MDgwNCwgMHgzNTgzLCAweDc4OTcsCisJMHgwMDAxLCAweDA4MDQsIDB4MzU4MywgMHgyMDM5LCAweDAwMDEsIDB4N2Q5OCwgMHg3YzljLCAweDA4MDQsCisJMHgzNWJmLCAweDIwMzksIDB4MDAwMSwgMHg3ZDk4LCAweDdjOWMsIDB4MDgwNCwgMHgzNWM5LCAweDc5YTAsCisJMHg5MTgyLCAweDAwNDAsIDB4MDIxMCwgMHgwODA0LCAweDM1YjgsIDB4MjEzOCwgMHg3ZDk4LCAweDdjOWMsCisJMHgwODA0LCAweDM1YmYsIDB4NzlhMCwgMHg5MTgyLCAweDAwNDAsIDB4MDIxMCwgMHgwODA0LCAweDM1YjgsCisJMHgyMTM4LCAweDdkOTgsIDB4N2M5YywgMHgwODA0LCAweDM1YzksIDB4NzlhMCwgMHg5MTgyLCAweDAwNDAsCisJMHgwMjEwLCAweDA4MDQsIDB4MzViOCwgMHgyMWU4LCAweDc5ODQsIDB4Nzg4OCwgMHgyMGE5LCAweDAwMDEsCisJMHgyMWEwLCAweDQwMDQsIDB4MDgwNCwgMHgzNTgzLCAweDIwNjEsIDB4MDgwMCwgMHhlMTBjLCAweDkwMDYsCisJMHgyYzE1LCAweDkyMDAsIDB4OGM2MCwgMHg4MTA5LCAweDFkZDgsIDB4MjAxMCwgMHg5MDA1LCAweDA5MDQsCisJMHgzNTgzLCAweDA4MDQsIDB4MzViMiwgMHg3OWEwLCAweDkxODIsIDB4MDA0MCwgMHgwMjEwLCAweDA4MDQsCisJMHgzNWI4LCAweDIxZTAsIDB4MjBhOSwgMHgwMDAxLCAweDc5ODQsIDB4MjE5OCwgMHg0MDEyLCAweDA4MDQsCisJMHgzNTgzLCAweDIwNjksIDB4MTg0NywgMHg3ODg0LCAweDc5OTAsIDB4OTExYSwgMHgxYTA0LCAweDM1YjgsCisJMHg4MDE5LCAweDA5MDQsIDB4MzViOCwgMHg2ODRhLCAweDY5NDIsIDB4Nzg4YywgMHg2ODUyLCAweDc4ODgsCisJMHg2ODU2LCAweDkwMDYsIDB4Njg1YSwgMHg2ODVlLCAweDA4MGMsIDB4Nzc1NSwgMHgwODA0LCAweDM1ODMsCisJMHgyMDY5LCAweDE4NDcsIDB4Nzg4NCwgMHg3OTk0LCAweDkxMWEsIDB4MWEwNCwgMHgzNWI4LCAweDgwMTksCisJMHgwOTA0LCAweDM1YjgsIDB4Njg0ZSwgMHg2OTQ2LCAweDc4OGMsIDB4Njg2MiwgMHg3ODg4LCAweDY4NjYsCisJMHg5MDA2LCAweDY4NmEsIDB4Njg2ZSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDZhNzIsCisJMHgwMTJlLCAweDA4MDQsIDB4MzU4MywgMHg5MDJlLCAweDI1MjAsIDB4ODFmZiwgMHgwMTIwLCAweDIwMDksCisJMHgwMDAxLCAweDA4MDQsIDB4MzViNSwgMHg3OTg0LCAweDdiODgsIDB4N2E4YywgMHgyMGE5LCAweDAwMDUsCisJMHgyMGU5LCAweDAwMDEsIDB4MjBhMSwgMHgxOGE2LCAweDQxMDEsIDB4MDgwYywgMHg0YjFmLCAweDExMjAsCisJMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgzNWI1LCAweDIwMDksIDB4MDAyMCwgMHhhODVjLCAweDkwODAsCisJMHgwMDE5LCAweGFmNjAsIDB4MDgwYywgMHg0YjY4LCAweDcwMWYsIDB4MzZhNywgMHgwMDA1LCAweGE4NjQsCisJMHgyMDA4LCAweDkwODQsIDB4MDBmZiwgMHg5MDk2LCAweDAwMTEsIDB4MDE2OCwgMHg5MDk2LCAweDAwMTksCisJMHgwMTUwLCAweDkwOTYsIDB4MDAxNSwgMHgwMTM4LCAweDkwOTYsIDB4MDA0OCwgMHgwMTIwLCAweDkwOTYsCisJMHgwMDI5LCAweDE5MDQsIDB4MzViNSwgMHg4MTBmLCAweDkxOGMsIDB4MDBmZiwgMHgwOTA0LCAweDM1YjUsCisJMHg3MTEyLCAweDcwMTAsIDB4ODAwMSwgMHgwNTYwLCAweDcwMTIsIDB4MDgwYywgMHg0YjFmLCAweDExMjAsCisJMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgzNWI1LCAweDIwMDksIDB4MDAyMCwgMHg3MDY4LCAweDIwNDAsCisJMHhhMjhjLCAweGEzOTAsIDB4YTQ5NCwgMHhhNTk4LCAweDkyOTAsIDB4MDA0MCwgMHg5Mzk5LCAweDAwMDAsCisJMHg5NGExLCAweDAwMDAsIDB4OTVhOSwgMHgwMDAwLCAweGE4NWMsIDB4OTA4MCwgMHgwMDE5LCAweGFmNjAsCisJMHgwODBjLCAweDRiNjgsIDB4NzAxZiwgMHgzNmU1LCAweDAwMDUsIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsCisJMHg5MDk2LCAweDAwMDIsIDB4MDEyMCwgMHg5MDk2LCAweDAwMGEsIDB4MTkwNCwgMHgzNWI1LCAweDA4ODgsCisJMHg3MDE0LCAweDIwNDgsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsCisJMHg5MDk2LCAweDAwMjksIDB4MTE2MCwgMHhjMmZkLCAweGFhN2EsIDB4MDgwYywgMHg2MjFlLCAweDAxNTAsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhhODdhLCAweGE5ODIsIDB4MDEyZSwgMHgwMDUwLCAweDA4MGMsCisJMHg2NTRlLCAweDExMjgsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4MzcxMSwgMHgwMDA1LCAweDA4MGMsCisJMHg2ZjRhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwYTksIDB4MDAwNSwgMHgyMGUxLCAweDAwMDEsCisJMHgyMDk5LCAweDE4YTYsIDB4NDAwYSwgMHgyMTAwLCAweDkyMTAsIDB4OTM5OSwgMHgwMDAwLCAweDk0YTEsCisJMHgwMDAwLCAweDk1YTksIDB4MDAwMCwgMHhhODVjLCAweDkwODAsIDB4MDAxOSwgMHgyMDA5LCAweDAwMjAsCisJMHgwMTJlLCAweGFmNjAsIDB4MDgwNCwgMHg0YjZiLCAweDIwOTEsIDB4ODAwMCwgMHg3ODM3LCAweDQwMDAsCisJMHg3ODMzLCAweDAwMTAsIDB4Nzg4MywgMHg0MDAwLCAweDc4ODcsIDB4NDk1MywgMHg3ODhiLCAweDUwMjAsCisJMHg3ODhmLCAweDIwMjAsIDB4MjAwOSwgMHgwMTdmLCAweDIxMDQsIDB4Nzg5MiwgMHgzZjAwLCAweDc4OTYsCisJMHgyMDYxLCAweDAxMDAsIDB4NjIwMCwgMHgyMDYxLCAweDAyMDAsIDB4NjAzYywgMHg4MDA3LCAweDkyMDUsCisJMHg3ODlhLCAweDIwMDksIDB4MDRmZCwgMHgyMTA0LCAweDc4OWUsIDB4MjA5MSwgMHg1MDAwLCAweDIwOTEsCisJMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MDE4MCwgMHgyMDAxLCAweDFhMTgsCisJMHgyMDA0LCAweDkwMDUsIDB4MDEyOCwgMHgyMDAxLCAweDAwOGIsIDB4MjAwNCwgMHhkMGZjLCAweDBkZDgsCisJMHgyMDAxLCAweDAwOGEsIDB4MjAwMywgMHgwMDAyLCAweDIwMDMsIDB4MTAwMSwgMHgyMDcxLCAweDAwODAsCisJMHgwODA0LCAweDA0MjcsIDB4ODFmZiwgMHgxOTA0LCAweDM1YjUsIDB4Nzk4NCwgMHgwODBjLCAweDY2OTksCisJMHgxOTA0LCAweDM1YjgsIDB4N2U5OCwgMHg5Njg0LCAweDNmZmYsIDB4OTA4MiwgMHg0MDAwLCAweDFhMDQsCisJMHgzNWI4LCAweDdjODgsIDB4N2Q4YywgMHgwODBjLCAweDY3ZmMsIDB4MDgwYywgMHg2N2NiLCAweDAwMDAsCisJMHgxNTE4LCAweDIwNjEsIDB4MWNkMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDAwLCAweDkwODYsCisJMHgwMDAwLCAweDAxNDgsIDB4NjAxNCwgMHg5MDRkLCAweDAxMzAsIDB4YTg2YywgMHg5NDA2LCAweDExMTgsCisJMHhhODcwLCAweDk1MDYsIDB4MDE1MCwgMHgwMTJlLCAweDljZTAsIDB4MDAxOCwgMHgyMDAxLCAweDE4MWEsCisJMHgyMDA0LCAweDljMDIsIDB4MWEwNCwgMHgzNWI1LCAweDBjMzAsIDB4MDgwYywgMHhjOGE1LCAweDAxMmUsCisJMHgwOTA0LCAweDM1YjUsIDB4MDgwNCwgMHgzNTgzLCAweDkwMGUsIDB4MjAwMSwgMHgwMDA1LCAweDA4MGMsCisJMHg2ZjRhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4Y2Y4MiwgMHgwODBjLCAweDZkMTcsCisJMHgwMTJlLCAweDA4MDQsIDB4MzU4MywgMHgwMGE2LCAweDI5NTAsIDB4YjE5OCwgMHgwODBjLCAweDY2OTksCisJMHgxOTA0LCAweDM3ZmQsIDB4YjZhNCwgMHg5Njg0LCAweDNmZmYsIDB4OTA4MiwgMHg0MDAwLCAweDE2ZTgsCisJMHhiNDljLCAweGI1YTAsIDB4MDgwYywgMHg2N2ZjLCAweDA4MGMsIDB4NjdjYiwgMHgxNTIwLCAweDIwNjEsCisJMHgxY2QwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDAxNDgsCisJMHg2MDE0LCAweDkwNGQsIDB4MDEzMCwgMHhhODZjLCAweDk0MDYsIDB4MTExOCwgMHhhODcwLCAweDk1MDYsCisJMHgwMTU4LCAweDAxMmUsIDB4OWNlMCwgMHgwMDE4LCAweDIwMDEsIDB4MTgxYSwgMHgyMDA0LCAweDljMDIsCisJMHgyMDA5LCAweDAwMGQsIDB4MTJiMCwgMHgwYzI4LCAweDA4MGMsIDB4YzhhNSwgMHgwMTJlLCAweDIwMDksCisJMHgwMDAzLCAweDAxNzgsIDB4MDBlMCwgMHg5MDBlLCAweDIwMDEsIDB4MDAwNSwgMHgwODBjLCAweDZmNGEsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweGNmODIsIDB4MDgwYywgMHg2ZDBiLCAweDAxMmUsCisJMHgwMDcwLCAweGIwOTcsIDB4NDAwNSwgMHhiMTlhLCAweDAwMTAsIDB4YjA5NywgMHg0MDA2LCAweDkwMGUsCisJMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwgMHgwMDMwLCAweDJhNDgsIDB4MDBhZSwgMHgwMDA1LCAweGIwOTcsCisJMHg0MDAwLCAweDkwMDYsIDB4OTE4ZCwgMHgwMDAxLCAweDIwMDgsIDB4MmE0OCwgMHgwMGFlLCAweDAwMDUsCisJMHg4MWZmLCAweDE5MDQsIDB4MzViNSwgMHgwODBjLCAweDRiMzYsIDB4MDkwNCwgMHgzNWI4LCAweDA4MGMsCisJMHg2NzYwLCAweDA5MDQsIDB4MzViNSwgMHgwODBjLCAweDY4MDIsIDB4MDkwNCwgMHgzNWI1LCAweDA4MDQsCisJMHg0NTg2LCAweDgxZmYsIDB4MTkwNCwgMHgzNWI1LCAweDA4MGMsIDB4NGI1MiwgMHgwOTA0LCAweDM1YjgsCisJMHgwODBjLCAweDY4OTAsIDB4MDkwNCwgMHgzNWI1LCAweDIwMTksIDB4MDAwNSwgMHg3OWE4LCAweDA4MGMsCisJMHg2ODFkLCAweDA5MDQsIDB4MzViNSwgMHg3ODg4LCAweDkwOGEsIDB4MTAwMCwgMHgxYTA0LCAweDM1YjgsCisJMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHg5MTA4LCAweDA4MGMsIDB4ODViZSwgMHg3OTg0LCAweGQxODQsCisJMHgxOTA0LCAweDM1ODMsIDB4MDgwNCwgMHg0NTg2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDgxZmYsCisJMHgwMTE4LCAweDIwMDksIDB4MDAwMSwgMHgwNDUwLCAweDIwMjksIDB4MDdmZiwgMHg2NDVjLCAweDI0MDAsCisJMHg5NTA2LCAweDAxZjgsIDB4MjUwOCwgMHgwODBjLCAweDY2OTksIDB4MTFkOCwgMHgwODBjLCAweDY4OTAsCisJMHgxMTI4LCAweDIwMDksIDB4MDAwMiwgMHg2MmMwLCAweDI1MTgsIDB4MDBjMCwgMHgyMDE5LCAweDAwMDQsCisJMHg5MDBlLCAweDA4MGMsIDB4NjgxZCwgMHgxMTE4LCAweDIwMDksIDB4MDAwNiwgMHgwMDc4LCAweDc4ODQsCisJMHg5MDhhLCAweDEwMDAsIDB4MTI3MCwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHg5MTA4LCAweDA4MGMsCisJMHg4NWJlLCAweDg1MjksIDB4MWFlMCwgMHgwMTJlLCAweDA4MDQsIDB4MzU4MywgMHgwMTJlLCAweDA4MDQsCisJMHgzNWI1LCAweDAxMmUsIDB4MDgwNCwgMHgzNWI4LCAweDA4MGMsIDB4NGIzNiwgMHgwOTA0LCAweDM1YjgsCisJMHgwODBjLCAweDY3NjAsIDB4MDkwNCwgMHgzNWI1LCAweGJhYTAsIDB4MjAxOSwgMHgwMDA1LCAweDAwYzYsCisJMHg5MDY2LCAweDA4MGMsIDB4OTM1NiwgMHgwMDc2LCAweDkwM2UsIDB4MDgwYywgMHg5MjI5LCAweDkwMGUsCisJMHgwODBjLCAweGU0NzcsIDB4MDA3ZSwgMHgwMGNlLCAweDA4MGMsIDB4NjdmYywgMHgwODA0LCAweDM1ODMsCisJMHgwODBjLCAweDRiMzYsIDB4MDkwNCwgMHgzNWI4LCAweDA4MGMsIDB4NjdmYywgMHgyMjA4LCAweDA4MDQsCisJMHgzNTgzLCAweDAxNTYsIDB4MDBkNiwgMHgwMGU2LCAweDIwNjksIDB4MTkxMCwgMHg2ODEwLCAweDY5MTQsCisJMHg5MTBhLCAweDEyMDgsIDB4OTAwZSwgMHg2ODE2LCAweDkwMTYsIDB4OTAxZSwgMHgyMGE5LCAweDAwN2UsCisJMHgyMDY5LCAweDEwMDAsIDB4MmQwNCwgMHg5MDVkLCAweDAxMTgsIDB4Yjg0YywgMHgwMDU5LCAweDkyMTAsCisJMHg4ZDY4LCAweDFmMDQsIDB4MzhiMiwgMHgyMzAwLCAweDkyMTgsIDB4MDBlZSwgMHgwMGRlLCAweDAxNWUsCisJMHgwODA0LCAweDM1ODMsIDB4MDBmNiwgMHgwMDE2LCAweDkwN2QsIDB4MDEzOCwgMHg5MDA2LCAweDgwMDAsCisJMHgyZjBjLCAweDgxZmYsIDB4MDExMCwgMHgyMTc4LCAweDBjZDAsIDB4MDAxZSwgMHgwMGZlLCAweDAwMDUsCisJMHgyMDY5LCAweDE5MTAsIDB4NjkxMCwgMHg2MmJjLCAweDA4MDQsIDB4MzU4MywgMHg4MWZmLCAweDAxMjAsCisJMHgyMDA5LCAweDAwMDEsIDB4MDgwNCwgMHgzNWI1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsCisJMHg1NzcxLCAweDAxMjgsIDB4MjAwOSwgMHgwMDA3LCAweDAxMmUsIDB4MDgwNCwgMHgzNWI1LCAweDAxMmUsCisJMHg2MTVjLCAweDkxOTAsIDB4MzM4NCwgMHgyMjE1LCAweDkyOTQsIDB4MDBmZiwgMHg2MzdjLCAweDgzZmYsCisJMHgwMTA4LCAweDYyODAsIDB4NjdkYywgMHg5N2M0LCAweDAwMGEsIDB4OThjNiwgMHgwMDBhLCAweDExMTgsCisJMHgyMDMxLCAweDAwMDEsIDB4MDBlOCwgMHg5N2M0LCAweDAwMjIsIDB4OThjNiwgMHgwMDIyLCAweDExMTgsCisJMHgyMDMxLCAweDAwMDMsIDB4MDBhOCwgMHg5N2M0LCAweDAwMTIsIDB4OThjNiwgMHgwMDEyLCAweDExMTgsCisJMHgyMDMxLCAweDAwMDIsIDB4MDA2OCwgMHgwODBjLCAweDc0M2UsIDB4MTExOCwgMHgyMDMxLCAweDAwMDQsCisJMHgwMDM4LCAweGQ3OWMsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDUsIDB4MDgwNCwgMHgzNWI1LCAweDkwMzYsCisJMHg3ZTlhLCAweDdmOWUsIDB4MDgwNCwgMHgzNTgzLCAweDYxNGMsIDB4NjI1MCwgMHgyMDE5LCAweDE5ODUsCisJMHgyMzFjLCAweDIwMDEsIDB4MTk4NiwgMHgyMDA0LCAweDc4OWEsIDB4MDgwNCwgMHgzNTgzLCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4NjEzOCwgMHg2MjNjLCAweDYzNDAsIDB4MDEyZSwgMHgwODA0LCAweDM1ODMsCisJMHgwODBjLCAweDRiNTIsIDB4MDkwNCwgMHgzNWI4LCAweGJhNDQsIDB4YmIzOCwgMHgwODA0LCAweDM1ODMsCisJMHgwODBjLCAweDBkZDUsIDB4MDgwYywgMHg0YjUyLCAweDIxMTAsIDB4MDkwNCwgMHgzNWI4LCAweGI4MDQsCisJMHg5MDhjLCAweDAwZmYsIDB4OTE4ZSwgMHgwMDA2LCAweDAxNDAsIDB4OTA4NCwgMHhmZjAwLCAweDkwODYsCisJMHgwNjAwLCAweDIwMDksIDB4MDAwOSwgMHgxOTA0LCAweDM1YjUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDE5LCAweDAwMDUsIDB4MDBjNiwgMHg5MDY2LCAweDA4MGMsIDB4YThkYywgMHgwODBjLCAweDkzNTYsCisJMHgwMDc2LCAweDkwM2UsIDB4MDgwYywgMHg5MjI5LCAweDkwMGUsIDB4MDgwYywgMHhlNDc3LCAweDAwN2UsCisJMHgwMGNlLCAweGI4MDcsIDB4MDQwNywgMHgwMTJlLCAweDA4MDQsIDB4MzU4MywgMHg2MTRjLCAweDYyNTAsCisJMHg3ODg0LCAweDYwNGUsIDB4N2I4OCwgMHg2MzUyLCAweDIwNjksIDB4MTg0NywgMHg4MzFmLCAweDkzMDUsCisJMHg2ODE2LCAweDc4OGMsIDB4MjA2OSwgMHgxOTg1LCAweDJkMWMsIDB4MjA2YSwgMHg3ZTk4LCAweDk2ODIsCisJMHgwMDE0LCAweDEyMTAsIDB4MjAzMSwgMHgwN2QwLCAweDIwNjksIDB4MTk4NiwgMHgyZDA0LCAweDI2NmEsCisJMHg3ODlhLCAweDA4MDQsIDB4MzU4MywgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3ODg0LCAweDYwM2EsCisJMHhkMGM0LCAweDAxYTgsIDB4MDBkNiwgMHg3OGE4LCAweDIwMDksIDB4MTk5YywgMHgyMDBhLCAweDc4YWMsCisJMHgyMDExLCAweDE5OWQsIDB4MjAxMiwgMHgyMDY5LCAweDAxMDAsIDB4NjgzOCwgMHg5MDg2LCAweDAwMDcsCisJMHgxMTE4LCAweDIyMTQsIDB4NmE1YSwgMHgwMDEwLCAweDIxMGMsIDB4Njk1YSwgMHgwMGRlLCAweDc4ODQsCisJMHhkMGI0LCAweDAxMjAsIDB4M2IwMCwgMHg5MDg0LCAweGZmM2YsIDB4MjBkOCwgMHg3ODg4LCAweDYwM2UsCisJMHgyMDExLCAweDAxMTQsIDB4MjIwYywgMHg3ODg4LCAweGQwOGMsIDB4MDExOCwgMHg5MThkLCAweDAwODAsCisJMHgwMDEwLCAweDkxOGMsIDB4ZmY3ZiwgMHgyMTEyLCAweDc4OGMsIDB4NjA0MiwgMHg5MDg0LCAweDAwMjAsCisJMHgwMTMwLCAweDc4YjQsIDB4NjA0NiwgMHg5MDg0LCAweDAwMDEsIDB4MDkwYywgMHg0Mjc4LCAweDYwNDAsCisJMHhkMGNjLCAweDAxMjAsIDB4NzhiMCwgMHgyMDExLCAweDAxMTQsIDB4MjAxMiwgMHgwMTJlLCAweDA4MDQsCisJMHgzNTgzLCAweDAwZjYsIDB4MjA3OSwgMHgxODAwLCAweDdhMzgsIDB4YTg5OCwgMHg5MDg0LCAweGZlYmYsCisJMHg5MjE1LCAweGE4OWMsIDB4OTA4NCwgMHhmZWJmLCAweDgwMDIsIDB4OTIxNCwgMHg3ODM4LCAweDkwODQsCisJMHgwMTQwLCAweDkyMTUsIDB4N2EzYSwgMHhhODk3LCAweDQwMDAsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsCisJMHgyMDAxLCAweDAwMDAsIDB4MDBmZSwgMHgwMDA1LCAweDc4OTgsIDB4OTAwNSwgMHgwMWE4LCAweDc4ODgsCisJMHg5MDI1LCAweDA5MDQsIDB4MzViOCwgMHg3ODhjLCAweDkwMmQsIDB4MDkwNCwgMHgzNWI4LCAweDkwMGUsCisJMHgwODBjLCAweDY2OTksIDB4MTEyMCwgMHhiYTQ0LCAweGJiMzgsIDB4YmM0NiwgMHhiZDNhLCAweDkxODYsCisJMHgwN2ZmLCAweDAxOTAsIDB4ODEwOCwgMHgwY2EwLCAweDA4MGMsIDB4NGI1MiwgMHgwOTA0LCAweDM1YjgsCisJMHg3ODg4LCAweDkwMGQsIDB4MDkwNCwgMHgzNWI4LCAweDc4OGMsIDB4OTAwNSwgMHgwOTA0LCAweDM1YjgsCisJMHhiYTQ0LCAweGI5NDYsIDB4YmIzOCwgMHhiODNhLCAweDA4MDQsIDB4MzU4MywgMHgyMDExLCAweGJjMDksCisJMHgwMDEwLCAweDIwMTEsIDB4YmMwNSwgMHgwODBjLCAweDU3NzEsIDB4MTkwNCwgMHgzNWI1LCAweDAwYzYsCisJMHgyMDYxLCAweDAxMDAsIDB4Nzk4NCwgMHg5MTg2LCAweDAwZmYsIDB4MTEzMCwgMHgyMDAxLCAweDE4MTgsCisJMHgyMDA0LCAweDkwODUsIDB4ZmYwMCwgMHgwMDg4LCAweDkxODIsIDB4MDA3ZiwgMHgxNmUwLCAweDkxODgsCisJMHgzMzg0LCAweDIxMGQsIDB4OTE4YywgMHgwMGZmLCAweDIwMDEsIDB4MTgxOCwgMHgyMDA0LCAweDAwMjYsCisJMHg5MTE2LCAweDAwMmUsIDB4MDU4MCwgMHg4MTBmLCAweDkxMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgwMDA2LCAweDA4MGMsIDB4YWVlZCwgMHgwMDBlLCAweDA1MTAsIDB4NjAyZSwgMHg2MjBhLCAweDc5ODQsCisJMHgwMGI2LCAweDA4MGMsIDB4NjYzZSwgMHgyYjA4LCAweDAwYmUsIDB4MTUwMCwgMHg2MTEyLCAweDYwMjMsCisJMHgwMDAxLCAweDA4MGMsIDB4NGIxZiwgMHgwMWQwLCAweDkwMDYsIDB4YTg2NiwgMHg3MDA3LCAweDAwMDMsCisJMHhhODMyLCAweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweDcwMWYsIDB4M2E2OSwgMHgyOTAwLCAweDYwMTYsCisJMHgyMDA5LCAweDAwMzIsIDB4MDgwYywgMHhhZmJlLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweDAxMmUsCisJMHgwMGNlLCAweDA4MDQsIDB4MzViNSwgMHgwMGNlLCAweDA4MDQsIDB4MzViOCwgMHgwODBjLCAweGFmNDMsCisJMHgwY2IwLCAweGE4MzAsIDB4OTA4NiwgMHgwMTAwLCAweDA5MDQsIDB4MzViNSwgMHgwODA0LCAweDM1ODMsCisJMHgyMDYxLCAweDFhNzAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjAwMCwgMHhkMDg0LCAweDAxNzAsCisJMHg2MTA0LCAweDYyMDgsIDB4MjA2MSwgMHgxODAwLCAweDYzNTQsIDB4NjA3NCwgMHg3ODlhLCAweDYwYzAsCisJMHg3ODllLCAweDYwYmMsIDB4NzhhYSwgMHgwMTJlLCAweDA4MDQsIDB4MzU4MywgMHg5MDBlLCAweDIxMTAsCisJMHgwYzg4LCAweDgxZmYsIDB4MTkwNCwgMHgzNWI1LCAweDA4MGMsIDB4NzQzZSwgMHgwOTA0LCAweDM1YjUsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MjU0LCAweDYwNzQsIDB4OTIwMiwgMHgwMjQ4LCAweDkwODUsCisJMHgwMDAxLCAweDA4MGMsIDB4MjhlNSwgMHgwODBjLCAweDU5OTAsIDB4MDEyZSwgMHgwODA0LCAweDM1ODMsCisJMHgwMTJlLCAweDA4MDQsIDB4MzViOCwgMHgwMDA2LCAweDAwMTYsIDB4MDBjNiwgMHgwMGU2LCAweDIwMDEsCisJMHgxOWE4LCAweDIwNzAsIDB4MjA2MSwgMHgxODQ3LCAweDYwMDgsIDB4MjA3MiwgMHg5MDBlLCAweDIwMTEsCisJMHgxNDAwLCAweDA4MGMsIDB4OTAyNywgMHg3MjA2LCAweDAwZWUsIDB4MDBjZSwgMHgwMDFlLCAweDAwMGUsCisJMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDgxZmYsIDB4MDEyOCwgMHgwMTJlLCAweDIwMjEsCisJMHg0MDBiLCAweDA4MDQsIDB4MzU4NSwgMHg3ODg0LCAweGQwZmMsIDB4MDE0OCwgMHgyMDAxLCAweDAwMmEsCisJMHgyMDA0LCAweDkwODIsIDB4MDBlMSwgMHgwMjg4LCAweDAxMmUsIDB4MDgwNCwgMHgzNWI4LCAweDIwMDEsCisJMHgwMDJhLCAweDIwMDQsIDB4MjA2OSwgMHgxODQ3LCAweDY5MDgsIDB4OTEwMiwgMHgxMjMwLCAweDAxMmUsCisJMHgwODA0LCAweDM1YjgsIDB4MDEyZSwgMHgwODA0LCAweDM1YjUsIDB4MDgwYywgMHhhZWFkLCAweDBkZDAsCisJMHg3ODg0LCAweGQwZmMsIDB4MDkwNCwgMHgzYjM0LCAweDAwYzYsIDB4MDgwYywgMHg0YjFmLCAweDAwY2UsCisJMHgwZDg4LCAweGE4NjcsIDB4MDAwMCwgMHg3ODg0LCAweGE4MGEsIDB4Nzg5OCwgMHhhODBlLCAweDc4OWMsCisJMHhhODEyLCAweDIwMDEsIDB4MDAyZSwgMHgyMDA0LCAweGE4MWEsIDB4MjAwMSwgMHgwMDJmLCAweDIwMDQsCisJMHhhODFlLCAweDIwMDEsIDB4MDAzMCwgMHgyMDA0LCAweGE4MjIsIDB4MjAwMSwgMHgwMDMxLCAweDIwMDQsCisJMHhhODI2LCAweDIwMDEsIDB4MDAzNCwgMHgyMDA0LCAweGE4MmEsIDB4MjAwMSwgMHgwMDM1LCAweDIwMDQsCisJMHhhODJlLCAweDIwMDEsIDB4MDAyYSwgMHgyMDA0LCAweDkwODAsIDB4MDAwMywgMHg5MDg0LCAweDAwZmMsCisJMHg4MDA0LCAweGE4MTYsIDB4MDgwYywgMHgzY2JhLCAweDA5MjgsIDB4NzAxNCwgMHgyMDQ4LCAweGFkMmMsCisJMHhhYzI4LCAweGFiMWMsIDB4YWExOCwgMHhhOTMwLCAweGE4MDgsIDB4ZDBiNCwgMHgxMTIwLCAweDIwMjksCisJMHgwMDAwLCAweDIwMjEsIDB4MDAwMCwgMHg4OTA2LCAweDgwMDYsIDB4ODAwNywgMHg5MGJjLCAweDAwM2YsCisJMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDFiLCAweDA4MGMsIDB4NGI2OCwgMHg3MDFmLCAweDNiZjcsCisJMHg3MDIzLCAweDAwMDEsIDB4MDEyZSwgMHgwMDA1LCAweDAwNDYsIDB4MDA4NiwgMHgwMDk2LCAweDAwYTYsCisJMHgwMGI2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MDgwYywgMHgzYWEzLCAweDIwMDEsCisJMHgxOTllLCAweDIwMDMsIDB4MDAwMCwgMHgyMDIxLCAweDAwMGEsIDB4MjA2MSwgMHgwMTAwLCAweDYxMDQsCisJMHgwMDE2LCAweDYwYmIsIDB4MDAwMCwgMHg2MGJmLCAweDMyZTEsIDB4NjBiZiwgMHgwMDEyLCAweDA4MGMsCisJMHgzZDI5LCAweDA4MGMsIDB4M2NlOCwgMHgwMGY2LCAweDAwZTYsIDB4MDA4NiwgMHgyOTQwLCAweDIwNzEsCisJMHgxYTY1LCAweDIwNzksIDB4MDA5MCwgMHgwMGQ2LCAweDIwNjksIDB4MDAwMCwgMHg2ODg0LCAweGQwYjQsCisJMHgwMTQwLCAweDIwMDEsIDB4MDAzNSwgMHgyMDA0LCAweDc4MGUsIDB4MjAwMSwgMHgwMDM0LCAweDIwMDQsCisJMHg3ODBhLCAweDAwZGUsIDB4MjAxMSwgMHgwMDAxLCAweDA4MGMsIDB4NDBiYywgMHgwMDhlLCAweDAwZWUsCisJMHgwMGZlLCAweDA4MGMsIDB4M2ZlOSwgMHgwODBjLCAweDNlZWUsIDB4MDViOCwgMHgyMDAxLCAweDAyMGIsCisJMHgyMDA0LCAweDkwODQsIDB4MDE0MCwgMHgxZGI4LCAweDA4MGMsIDB4NDEzMCwgMHgwMGY2LCAweDIwNzksCisJMHgwMzAwLCAweDc4YmMsIDB4MDBmZSwgMHg5MDhjLCAweDAwNzAsIDB4MTU2MCwgMHgyMDcxLCAweDAyMDAsCisJMHg3MDM3LCAweDAwMDAsIDB4NzA1MCwgMHg5MDg0LCAweGZmMDAsIDB4OTA4NiwgMHgzMjAwLCAweDE1MTAsCisJMHg3MDM3LCAweDAwMDEsIDB4NzA1MCwgMHg5MDg0LCAweGZmMDAsIDB4OTA4NiwgMHhlMTAwLCAweDExZDAsCisJMHg3MDM3LCAweDAwMDAsIDB4NzA1NCwgMHg3MDM3LCAweDAwMDAsIDB4NzE1YywgMHg5MTA2LCAweDExOTAsCisJMHgyMDAxLCAweDE4MjAsIDB4MjAwNCwgMHg5MTA2LCAweDExNjgsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsCisJMHg2MDI0LCAweDkwODQsIDB4MWUwMCwgMHgwMGNlLCAweDAxMzgsIDB4MDgwYywgMHgzZWY4LCAweDA4MGMsCisJMHgzY2UzLCAweDAwNTgsIDB4MDgwYywgMHgzY2UzLCAweDA4MGMsIDB4NDA1NCwgMHgwODBjLCAweDNmZGYsCisJMHgyMDAxLCAweDAyMGIsIDB4MjAwNCwgMHhkMGU0LCAweDBkZDgsIDB4MjAwMSwgMHgwMzJhLCAweDIwMDMsCisJMHgwMDA0LCAweDIwNjEsIDB4MDEwMCwgMHg2MDI3LCAweDAwMDIsIDB4MDAxZSwgMHg2MTA2LCAweDIwMTEsCisJMHgwMjBkLCAweDIwMTMsIDB4MDAyMCwgMHg2MGJiLCAweDAwMDAsIDB4NjBiZiwgMHgwMTA4LCAweDYwYmYsCisJMHgwMDEyLCAweDIwMDEsIDB4MDAwNCwgMHgyMDBjLCAweDkxOGMsIDB4ZmZmZCwgMHgyMTAyLCAweDA4MGMsCisJMHgxMmVkLCAweDIwMDksIDB4MDAyOCwgMHgwODBjLCAweDI0MTAsIDB4MjAwMSwgMHgwMjI3LCAweDIwMGMsCisJMHgyMTAyLCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDBiZSwgMHgwMGFlLCAweDAwOWUsCisJMHgwMDhlLCAweDAwNGUsIDB4MjAwMSwgMHgxOTllLCAweDIwMDQsIDB4OTAwNSwgMHgxMTE4LCAweDAxMmUsCisJMHgwODA0LCAweDM1ODMsIDB4MDEyZSwgMHgyMDIxLCAweDQwMGMsIDB4MDgwNCwgMHgzNTg1LCAweDAwMTYsCisJMHgwMDI2LCAweDAwMzYsIDB4MDA0NiwgMHgwMDU2LCAweDAwNzYsIDB4MDA4NiwgMHgwMDk2LCAweDAwZDYsCisJMHgwMTU2LCAweDcwMTQsIDB4MjA0OCwgMHg3MDIwLCAweDIwYTgsIDB4ODAwMCwgMHg3MDIyLCAweGE4MDQsCisJMHg5MDA1LCAweDA5MDQsIDB4M2M1MywgMHgyMDQ4LCAweDFmMDQsIDB4M2MwNywgMHg3MDY4LCAweDIwNDAsCisJMHhhMjhjLCAweGEzOTAsIDB4YTQ5NCwgMHhhNTk4LCAweGE5MzAsIDB4YTgwOCwgMHhkMGI0LCAweDExMjAsCisJMHgyMDI5LCAweDAwMDAsIDB4MjAyMSwgMHgwMDAwLCAweDAwOTYsIDB4NzAxNCwgMHgyMDQ4LCAweGE4NjQsCisJMHgwMDllLCAweDkwODYsIDB4MDEwMywgMHgwMTcwLCAweDg5MDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwYmMsCisJMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMWIsIDB4MDgwYywgMHg0YjY4LCAweDcwMWYsCisJMHgzYmY3LCAweDAwYjAsIDB4ODkwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTBiYywgMHgwMDNmLCAweDkwODQsCisJMHhmZmMwLCAweDkwODAsIDB4MDAxYiwgMHgyMWE4LCAweDI3ZTAsIDB4MjA5OCwgMHgyN2U4LCAweDIwYTAsCisJMHgwMDA2LCAweDA4MGMsIDB4MGY3YywgMHgwMDBlLCAweDA4MGMsIDB4NGI2YiwgMHg3MDFmLCAweDNiZjcsCisJMHgwMTVlLCAweDAwZGUsIDB4MDA5ZSwgMHgwMDhlLCAweDAwN2UsIDB4MDA1ZSwgMHgwMDRlLCAweDAwM2UsCisJMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHg3MDE0LCAweDIwNDgsIDB4YTg2NCwgMHg5MDg2LCAweDAxMDMsCisJMHgxMTE4LCAweDcwMWYsIDB4M2NiOCwgMHgwNDUwLCAweDcwMTQsIDB4MjA0OCwgMHhhODY4LCAweGMwZmQsCisJMHhhODZhLCAweDIwMDksIDB4MDA3ZiwgMHgwODBjLCAweDY2MzgsIDB4MDExMCwgMHg5MDA2LCAweDAwMzAsCisJMHhiODEzLCAweDAwZmYsIDB4YjgxNywgMHhmZmZkLCAweDA4MGMsIDB4ZDE1MSwgMHgwMTVlLCAweDAwZGUsCisJMHgwMDllLCAweDAwOGUsIDB4MDA3ZSwgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsCisJMHgwOTA0LCAweDM1YjUsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDA0NiwgMHgwMDU2LCAweDAwNzYsCisJMHgwMDg2LCAweDAwOTYsIDB4MDBkNiwgMHgwMTU2LCAweDcwMWYsIDB4M2M4YSwgMHg3MDA3LCAweDAwMDMsCisJMHgwODA0LCAweDNjNDgsIDB4YTgzMCwgMHg5MDg2LCAweDAxMDAsIDB4MjAyMSwgMHg0MDBjLCAweDA5MDQsCisJMHgzNTg1LCAweDAwNzYsIDB4YWQxMCwgMHhhYzBjLCAweGFiMjQsIDB4YWEyMCwgMHhhOTMwLCAweGE4MDgsCisJMHhkMGI0LCAweDExMjAsIDB4MjAyOSwgMHgwMDAwLCAweDIwMjEsIDB4MDAwMCwgMHg4OTA2LCAweDgwMDYsCisJMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDFiLCAweDIxYTgsCisJMHgyN2UwLCAweDIwOTgsIDB4MjdlOCwgMHgyMGEwLCAweDAwMDYsIDB4MDgwYywgMHgwZjdjLCAweDAwMGUsCisJMHgwODBjLCAweDRiNmIsIDB4MDA3ZSwgMHg3MDFmLCAweDNiZjcsIDB4NzAyMywgMHgwMDAxLCAweDAwMDUsCisJMHgwODA0LCAweDM1ODMsIDB4MDE1NiwgMHgwMGM2LCAweGE4MTQsIDB4OTA4YSwgMHgwMDFlLCAweDAyMTgsCisJMHhhODMzLCAweDAwMWUsIDB4MDAxMCwgMHhhODMyLCAweDAwNzgsIDB4ODFmZiwgMHgwMTY4LCAweDAwMTYsCisJMHgwODBjLCAweDRiMWYsIDB4MDAxZSwgMHgwMTMwLCAweGE4MDAsIDB4MjA0MCwgMHhhMDA4LCAweGE4MGEsCisJMHgyMTAwLCAweDBjNTgsIDB4OTAwNiwgMHgwMDEwLCAweDkwODUsIDB4MDAwMSwgMHgwMGNlLCAweDAxNWUsCisJMHgwMDA1LCAweDAwMDYsIDB4MDBmNiwgMHgyMDc5LCAweDAwMDAsIDB4Nzg4MCwgMHg5MDg2LCAweDAwNDQsCisJMHgwMGZlLCAweDAwMGUsIDB4MDAwNSwgMHgyMDAxLCAweDE5OWUsIDB4MjAwMywgMHgwMDAxLCAweDAwMDUsCisJMHgwMGY2LCAweDAwZTYsIDB4MDBjNiwgMHgyMDYxLCAweDAyMDAsIDB4MjAwMSwgMHgxOWE5LCAweDIwMDQsCisJMHg2MDFhLCAweDIwNjEsIDB4MDEwMCwgMHgyMDAxLCAweDE5YTgsIDB4MjAwNCwgMHg2MGNlLCAweDYxMDQsCisJMHhjMWFjLCAweDYxMDYsIDB4MDgwYywgMHg0YjFmLCAweGE4MTMsIDB4MDAxOSwgMHhhODE3LCAweDAwMDEsCisJMHgyOTAwLCAweGE4NWEsIDB4MjAwMSwgMHgwMDJlLCAweDIwMDQsIDB4YTg2NiwgMHgyMDAxLCAweDAwMmYsCisJMHgyMDA0LCAweGE4NmEsIDB4MjA2MSwgMHgwMDkwLCAweDIwNzksIDB4MDEwMCwgMHgyMDAxLCAweDE5YTgsCisJMHgyMDA0LCAweDYwMzYsIDB4MjAwOSwgMHgwMDQwLCAweDA4MGMsIDB4MjQxMCwgMHgyMDAxLCAweDAwMmEsCisJMHgyMDA0LCAweDkwODQsIDB4ZmZmOCwgMHhhODZlLCAweDYwMWEsIDB4YTg3MywgMHgwMDAwLCAweDYwMWYsCisJMHgwMDAwLCAweDc4Y2EsIDB4OTAwNiwgMHg2MDBhLCAweDYwMGUsIDB4MDBjZSwgMHgwMGVlLCAweDAwZmUsCisJMHgwMDA1LCAweDAwZTYsIDB4MDgwYywgMHg0YjFmLCAweDI5NDAsIDB4YTAxMywgMHgwMDE5LCAweGEwMTcsCisJMHgwMDAxLCAweDI4MDAsIDB4YTA1YSwgMHgyMDAxLCAweDAwMzAsIDB4MjAwNCwgMHhhODY2LCAweDIwMDEsCisJMHgwMDMxLCAweDIwMDQsIDB4YTg2YSwgMHgyMDAxLCAweDAwMmEsIDB4MjAwNCwgMHg5MDg0LCAweGZmZjgsCisJMHhhODZlLCAweGE4NzMsIDB4MDAwMCwgMHgyMDAxLCAweDAzMmEsIDB4MjAwMywgMHgwMDA0LCAweDIwMDEsCisJMHgwMzAwLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDAyMGQsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsCisJMHgwMDA0LCAweDIwMGMsIDB4OTE4ZCwgMHgwMDAyLCAweDIxMDIsIDB4MDBlZSwgMHgwMDA1LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4ODFmZiwgMHgwMTQ4LCAweDA4MGMsIDB4MmM2ZSwgMHgxMTMwLCAweDkwMDYsCisJMHgwODBjLCAweDJiYzYsIDB4OTAwNiwgMHgwODBjLCAweDJiYTksIDB4Nzg4NCwgMHg5MDg0LCAweDAwMDcsCisJMHgwMDAyLCAweDNkNzQsIDB4M2Q3ZCwgMHgzZDg2LCAweDNkNzEsIDB4M2Q3MSwgMHgzZDcxLCAweDNkNzEsCisJMHgzZDcxLCAweDAxMmUsIDB4MDgwNCwgMHgzNWI4LCAweDIwMDksIDB4MDExNCwgMHgyMTA0LCAweDkwODUsCisJMHgwODAwLCAweDIwMGEsIDB4MDgwYywgMHgzZjQyLCAweDAwYzAsIDB4MjAwOSwgMHgwMTE0LCAweDIxMDQsCisJMHg5MDg1LCAweDQwMDAsIDB4MjAwYSwgMHgwODBjLCAweDNmNDIsIDB4MDA3OCwgMHgwODBjLCAweDc0M2UsCisJMHgxMTI4LCAweDAxMmUsIDB4MjAwOSwgMHgwMDE2LCAweDA4MDQsIDB4MzViNSwgMHg4MWZmLCAweDAxMjgsCisJMHgwMTJlLCAweDIwMjEsIDB4NDAwYiwgMHgwODA0LCAweDM1ODUsIDB4MDA4NiwgMHgwMDk2LCAweDAwYTYsCisJMHgwMGI2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MDgwYywgMHgzYWEzLCAweDIwMDksCisJMHgwMTAxLCAweDIxMGMsIDB4MDAxNiwgMHg3ZWM4LCAweDdkY2MsIDB4OTAwNiwgMHgyMDY4LCAweDIwNjAsCisJMHgyMDU4LCAweDA4MGMsIDB4NDIwYiwgMHgwODBjLCAweDQxNWIsIDB4OTAzZSwgMHgyNzIwLCAweDAwZjYsCisJMHgwMGU2LCAweDAwODYsIDB4Mjk0MCwgMHgyMDcxLCAweDFhNjUsIDB4MjA3OSwgMHgwMDkwLCAweDAwZDYsCisJMHgyMDY5LCAweDAwMDAsIDB4Njg4NCwgMHhkMGI0LCAweDAxMjAsIDB4NjhkNCwgMHg3ODBlLCAweDY4ZDAsCisJMHg3ODBhLCAweDAwZGUsIDB4MjAxMSwgMHgwMDAxLCAweDA4MGMsIDB4NDBiYywgMHgwODBjLCAweDJjNzYsCisJMHgwODBjLCAweDJjNzYsIDB4MDgwYywgMHgyYzc2LCAweDA4MGMsIDB4MmM3NiwgMHgwODBjLCAweDQwYmMsCisJMHgwMDhlLCAweDAwZWUsIDB4MDBmZSwgMHgwODBjLCAweDNmZTksIDB4MjAwOSwgMHg5YzQwLCAweDgxMDksCisJMHgxMWIwLCAweDA4MGMsIDB4M2VmOCwgMHgyMDAxLCAweDAwMDQsIDB4MjAwYywgMHg5MThjLCAweGZmZmQsCisJMHgyMTAyLCAweDAwMWUsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMGJlLCAweDAwYWUsCisJMHgwMDllLCAweDAwOGUsIDB4MjAwOSwgMHgwMDE3LCAweDA4MGMsIDB4MzViNSwgMHgwY2Y4LCAweDIwMDEsCisJMHgwMjBiLCAweDIwMDQsIDB4OTA4NCwgMHgwMTQwLCAweDFkMTAsIDB4MDBmNiwgMHgyMDc5LCAweDAwMDAsCisJMHg3ODg0LCAweDAwZmUsIDB4ZDBiYywgMHgwMTc4LCAweDIwMDEsIDB4MDIwMSwgMHgyMDBjLCAweDgxZmYsCisJMHgwMTUwLCAweDA4MGMsIDB4M2ZjNywgMHgyZDAwLCAweDljMDUsIDB4OWIwNSwgMHgwMTIwLCAweDA4MGMsCisJMHgzZWY4LCAweDA4MDQsIDB4M2VhNSwgMHgwODBjLCAweDQxMzAsIDB4MDgwYywgMHg0MDU0LCAweDA4MGMsCisJMHgzZmFhLCAweDA4MGMsIDB4M2ZkZiwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHg3ODI0LCAweGQwYWMsCisJMHgwMTMwLCAweDhiNTgsIDB4MDgwYywgMHgzZWY4LCAweDAwZmUsIDB4MDgwNCwgMHgzZWE1LCAweDAwZmUsCisJMHgwODBjLCAweDNlZWUsIDB4MTE1MCwgMHg4ZDY4LCAweDIwMDEsIDB4MDAzMiwgMHgyNjAyLCAweDIwMDEsCisJMHgwMDMzLCAweDI1MDIsIDB4MDgwYywgMHgzZWY4LCAweDAwODAsIDB4ODdmZiwgMHgwMTM4LCAweDIwMDEsCisJMHgwMjAxLCAweDIwMDQsIDB4OTAwNSwgMHgxOTA4LCAweDg3MzksIDB4MDAzOCwgMHgyMDAxLCAweDFhNjEsCisJMHgyMDA0LCAweDkwODYsIDB4MDAwMCwgMHgxOTA0LCAweDNkZjUsIDB4MjAwMSwgMHgwMzJmLCAweDIwMDMsCisJMHgwMGY2LCAweDg2MzEsIDB4MTIwOCwgMHg4NTI5LCAweDI1MDAsIDB4OTYwNSwgMHgwOTA0LCAweDNlYTUsCisJMHg3ODg0LCAweGQwYmMsIDB4MDEyOCwgMHgyZDAwLCAweDljMDUsIDB4OWIwNSwgMHgxOTA0LCAweDNlYTUsCisJMHhhMDEzLCAweDAwMTksIDB4MjAwMSwgMHgwMzJhLCAweDIwMDMsIDB4MDAwNCwgMHg3ODg0LCAweGQwYWMsCisJMHgxMTQ4LCAweDIwMDEsIDB4MWE2MSwgMHgyMDAzLCAweDAwMDMsIDB4MjAwMSwgMHgwMzJhLCAweDIwMDMsCisJMHgwMDA5LCAweDAwMzAsIDB4YTAxNywgMHgwMDAxLCAweDc4YjQsIDB4OTAwNSwgMHgwMTA4LCAweGEwMTYsCisJMHgyODAwLCAweGEwNWEsIDB4MjAwOSwgMHgwMDQwLCAweDA4MGMsIDB4MjQxMCwgMHgyOTAwLCAweGE4NWEsCisJMHhhODEzLCAweDAwMTksIDB4Nzg4NCwgMHhkMGE0LCAweDExODAsIDB4YTgxNywgMHgwMDAwLCAweDAwYzYsCisJMHgyMGE5LCAweDAwMDQsIDB4MjA2MSwgMHgwMDkwLCAweDYwMmIsIDB4MDAwOCwgMHgyMDAxLCAweDAyMDMsCisJMHgyMDA0LCAweDFmMDQsIDB4M2U3YywgMHgwMGNlLCAweDAwMzAsIDB4YTgxNywgMHgwMDAxLCAweDc4YjAsCisJMHg5MDA1LCAweDAxMDgsIDB4YTgxNiwgMHgwMGY2LCAweDAwYzYsIDB4MjA3OSwgMHgwMTAwLCAweDIwNjEsCisJMHgwMDkwLCAweDc4MjcsIDB4MDAwMiwgMHgyMDAxLCAweDAwMmEsIDB4MjAwNCwgMHg5MDg0LCAweGZmZjgsCisJMHg2MDFhLCAweDAwMDYsIDB4MjAwMSwgMHgwMDJiLCAweDIwMDQsIDB4NjAxZSwgMHg3OGM2LCAweDAwMGUsCisJMHg3OGNhLCAweDAwY2UsIDB4MDBmZSwgMHgwODA0LCAweDNkYWYsIDB4MDAxZSwgMHgwMGM2LCAweDIwMDEsCisJMHgwMzJhLCAweDIwMDMsIDB4MDAwNCwgMHgyMDYxLCAweDAxMDAsIDB4NjAyNywgMHgwMDAyLCAweDYxMDYsCisJMHgyMDExLCAweDAyMGQsIDB4MjAxMywgMHgwMDIwLCAweDIwMDEsIDB4MDAwNCwgMHgyMDBjLCAweDkxOGMsCisJMHhmZmZkLCAweDIxMDIsIDB4MDgwYywgMHgxMmVkLCAweDc4ODQsIDB4OTA4NCwgMHgwMDAzLCAweDkwODYsCisJMHgwMDAyLCAweDAxYTAsIDB4MjAwOSwgMHgwMDI4LCAweDA4MGMsIDB4MjQxMCwgMHgyMDAxLCAweDAyMjcsCisJMHgyMDBjLCAweDIxMDIsIDB4NjA1MCwgMHg5MDg0LCAweGI3ZWYsIDB4NjA1MiwgMHg2MDJmLCAweDAwMDAsCisJMHg2MDRiLCAweGY3ZjcsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHgwMGNlLCAweDJkMDgsCisJMHgyYzEwLCAweDJiMTgsIDB4MmIwMCwgMHg5YzA1LCAweDlkMDUsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsCisJMHgwMGNlLCAweDAwYmUsIDB4MDBhZSwgMHgwMDllLCAweDAwOGUsIDB4MTExOCwgMHgwMTJlLCAweDA4MDQsCisJMHgzNTgzLCAweDAxMmUsIDB4MjAyMSwgMHg0MDBjLCAweDA4MDQsIDB4MzU4NSwgMHg5MDg1LCAweDAwMDEsCisJMHgxZDA0LCAweDNlZjcsIDB4MjA5MSwgMHg2MDAwLCAweDg0MjAsIDB4OTQ4NiwgMHgwMDY0LCAweDAwMDUsCisJMHgyMDAxLCAweDAxMDUsIDB4MjAwMywgMHgwMDEwLCAweDIwMDEsIDB4MDMyYSwgMHgyMDAzLCAweDAwMDQsCisJMHgyMDAxLCAweDFhNjEsIDB4MjAwMywgMHgwMDAwLCAweDAwNzEsIDB4MjAwOSwgMHgwMDQ4LCAweDA4MGMsCisJMHgyNDEwLCAweDIwMDEsIDB4MDIyNywgMHgyMDI0LCAweDI0MDIsIDB4MjAwMSwgMHgwMTA5LCAweDIwMDMsCisJMHg0MDAwLCAweDkwMjYsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MjA3MSwgMHgxYTY1LCAweDcwMDAsCisJMHg5MDg2LCAweDAwMDAsIDB4MDUyMCwgMHgyMDc5LCAweDAwOTAsIDB4MjAwOSwgMHgwMjA2LCAweDIxMDQsCisJMHgyMDA5LCAweDAyMDMsIDB4MjEwYywgMHg5MTA2LCAweDExMjAsIDB4MjAwOSwgMHgwMDQwLCAweDA4MGMsCisJMHgyNDEwLCAweDc4MmMsIDB4ZDBmYywgMHgwZDg4LCAweDA4MGMsIDB4NDEzMCwgMHg3MDAwLCAweDkwODYsCisJMHgwMDAwLCAweDFkNTgsIDB4NzgyYiwgMHgwMDA0LCAweDc4MmMsIDB4ZDBhYywgMHgxZGU4LCAweDIwMDksCisJMHgwMDQwLCAweDA4MGMsIDB4MjQxMCwgMHg3ODJiLCAweDAwMDIsIDB4NzAwMywgMHgwMDAwLCAweDAwZWUsCisJMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4MjAwMSwgMHgxODE4LCAweDIwMGMsCisJMHg3OTMyLCAweDc5MzYsIDB4MDgwYywgMHgyOGM1LCAweDc4NTAsIDB4OTA4NCwgMHhmYmZmLCAweDkwODUsCisJMHgwMDMwLCAweDc4NTIsIDB4MjAxOSwgMHgwMWY0LCAweDgzMTksIDB4MWRmMCwgMHg5MDg0LCAweGZmY2YsCisJMHg5MDg1LCAweDIwMDAsIDB4Nzg1MiwgMHgyMGE5LCAweDAwNDYsIDB4MWQwNCwgMHgzZjVkLCAweDIwOTEsCisJMHg2MDAwLCAweDFmMDQsIDB4M2Y1ZCwgMHg3ODUwLCAweDkwODUsIDB4MDQwMCwgMHg5MDg0LCAweGRmZmYsCisJMHg3ODUyLCAweDIwMDEsIDB4MDAyMSwgMHgyMDA0LCAweDkwODQsIDB4MDAwMywgMHg5MDg2LCAweDAwMDEsCisJMHgxMTIwLCAweDc4NTAsIDB4OTA4NCwgMHhkZmZmLCAweDc4NTIsIDB4Nzg0YiwgMHhmN2Y3LCAweDc4NDMsCisJMHgwMDkwLCAweDc4NDMsIDB4MDAxMCwgMHgyMGE5LCAweDAwMjgsIDB4YTAwMSwgMHgxZjA0LCAweDNmN2QsCisJMHg3ODUwLCAweDkwODUsIDB4MTQwMCwgMHg3ODUyLCAweDIwMTksIDB4NjFhOCwgMHg3ODU0LCAweGEwMDEsCisJMHhhMDAxLCAweGQwOGMsIDB4MTExMCwgMHg4MzE5LCAweDFkYzgsIDB4NzgyNywgMHgwMDQ4LCAweDc4NTAsCisJMHg5MDg1LCAweDA0MDAsIDB4Nzg1MiwgMHg3ODQzLCAweDAwNDAsIDB4MjAxOSwgMHgwMWY0LCAweGEwMDEsCisJMHhhMDAxLCAweDgzMTksIDB4MWRlMCwgMHgyMDAxLCAweDAxMDAsIDB4MDgwYywgMHgyZDRlLCAweDc4MjcsCisJMHgwMDIwLCAweDc4NDMsIDB4MDAwMCwgMHg5MDA2LCAweDA4MGMsIDB4MmQ0ZSwgMHg3ODI3LCAweDAwNDgsCisJMHgwMGZlLCAweDAwMDUsIDB4Nzg4NCwgMHhkMGFjLCAweDExYzgsIDB4MDBmNiwgMHgwMGU2LCAweDIwNzEsCisJMHgxYTYxLCAweDIwNzksIDB4MDMyMCwgMHgyMDAxLCAweDAyMDEsIDB4MjAwNCwgMHg5MDA1LCAweDAxNjAsCisJMHg3MDAwLCAweDkwODYsIDB4MDAwMCwgMHgxMTQwLCAweDAwNTEsIDB4ZDBiYywgMHgwMTA4LCAweDg3MzgsCisJMHg3MDAzLCAweDAwMDMsIDB4NzgyYiwgMHgwMDE5LCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsCisJMHgyMDc5LCAweDAzMDAsIDB4NzhiYywgMHgwMGZlLCAweDkwOGMsIDB4MDA3MCwgMHgwMTc4LCAweDIwMDksCisJMHgwMDMyLCAweDI2MGEsIDB4MjAwOSwgMHgwMDMzLCAweDI1MGEsIDB4ZDBiNCwgMHgwMTA4LCAweDhjNjAsCisJMHhkMGFjLCAweDAxMDgsIDB4OGQ2OCwgMHhkMGE0LCAweDAxMDgsIDB4OGI1OCwgMHgwMDA1LCAweDAwZjYsCisJMHgyMDc5LCAweDAyMDAsIDB4NzgxYywgMHhkMDg0LCAweDAxMTAsIDB4NzgzNywgMHgwMDUwLCAweDAwZmUsCisJMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgwMTAwLCAweDIwMDEsIDB4MTlhOSwgMHgyMDA0LCAweDcwZTIsCisJMHgwODBjLCAweDNjZDksIDB4MTE4OCwgMHgyMDAxLCAweDE4MjAsIDB4MjAwNCwgMHgyMDA5LCAweDE4MWYsCisJMHgyMTBjLCAweDkxOGMsIDB4MDBmZiwgMHg3MDZlLCAweDcxNmEsIDB4NzA2NiwgMHg5MThkLCAweDMyMDAsCisJMHg3MTYyLCAweDcwNzMsIDB4ZTEwOSwgMHgwMDgwLCAweDcwMmMsIDB4OTA4NSwgMHgwMDAyLCAweDcwMmUsCisJMHgyMDA5LCAweDE4MTgsIDB4MjEwYywgMHg3MTZlLCAweDcwNjMsIDB4MDEwMCwgMHg3MTY2LCAweDcxOWUsCisJMHg3MDZiLCAweDAwMDAsIDB4NzA3MywgMHgwODA5LCAweDcwNzcsIDB4MDAwOCwgMHg3MDc4LCAweDkwODAsCisJMHgwMTAwLCAweDcwN2EsIDB4NzA4MCwgMHg4MDAwLCAweDcwODIsIDB4NzA4NywgMHhhYWFhLCAweDkwMDYsCisJMHg3MDhhLCAweDcwOGUsIDB4NzA3ZSwgMHg3MGQ2LCAweDcwYWIsIDB4MDAzNiwgMHg3MGFmLCAweDk1ZDUsCisJMHg3MDE0LCAweDkwODQsIDB4MTk4NCwgMHg5MDg1LCAweDAwOTIsIDB4NzAxNiwgMHgwODBjLCAweDQxMzAsCisJMHgwMGY2LCAweDIwNzEsIDB4MWE2MSwgMHgyMDc5LCAweDAzMjAsIDB4MDBkNiwgMHgyMDY5LCAweDAwMDAsCisJMHg2ODg0LCAweGQwYjQsIDB4MDEyMCwgMHg2ODljLCAweDc4MGUsIDB4Njg5OCwgMHg3ODBhLCAweDAwZGUsCisJMHgyMDA5LCAweDAzZTgsIDB4ODEwOSwgMHgxZGYwLCAweDc5MmMsIDB4ZDFmYywgMHgwMTEwLCAweDc4MmIsCisJMHgwMDA0LCAweDIwMTEsIDB4MDAxMSwgMHgwODBjLCAweDQwYmMsIDB4MjAxMSwgMHgwMDAxLCAweDA4MGMsCisJMHg0MGJjLCAweDAwZmUsIDB4MDBlZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgyMDcxLCAweDFhNjEsCisJMHgyMDc5LCAweDAzMjAsIDB4NzkyYywgMHhkMWZjLCAweDA5MDQsIDB4NDBiOSwgMHg3ODJiLCAweDAwMDIsCisJMHg5MDI2LCAweGQxOWMsIDB4MTkwNCwgMHg0MGI1LCAweDcwMDAsIDB4MDAwMiwgMHg0MGI5LCAweDQwNmEsCisJMHg0MDlhLCAweDQwYjUsIDB4ZDFiYywgMHgxMTcwLCAweGQxZGMsIDB4MTE5MCwgMHg4MDAxLCAweDcwMDIsCisJMHgyMDExLCAweDAwMDEsIDB4MDgwYywgMHg0MGJjLCAweDA5MDQsIDB4NDBiOSwgMHgwODBjLCAweDQwYmMsCisJMHgwODA0LCAweDQwYjksIDB4MDBmNiwgMHgyMDc5LCAweDAzMDAsIDB4NzhiZiwgMHgwMDAwLCAweDAwZmUsCisJMHg3ODEwLCAweDc5MTQsIDB4NzgyYiwgMHgwMDA0LCAweDc4MTIsIDB4NzkxNiwgMHgyMDAxLCAweDAyMDEsCisJMHgyMDBjLCAweDgxZmYsIDB4MGRlOCwgMHgwODBjLCAweDNmYzcsIDB4MjAwOSwgMHgwMDAxLCAweDAwZjYsCisJMHgyMDc5LCAweDAzMDAsIDB4NzhiOCwgMHgwMGZlLCAweGQwZWMsIDB4MDExMCwgMHgyMDA5LCAweDAwMTEsCisJMHg3OTJhLCAweDAwZjgsIDB4ODAwMSwgMHg3MDAyLCAweDkxODQsIDB4MDg4MCwgMHgxMTQwLCAweDc4MmMsCisJMHhkMGZjLCAweDE5MDQsIDB4NDA1ZSwgMHgyMDExLCAweDAwMDEsIDB4MDBiMSwgMHgwMDkwLCAweGEwMTAsCisJMHg5MDkyLCAweDAwMDQsIDB4OTA4NiwgMHgwMDE1LCAweDExMjAsIDB4YTAwMCwgMHhhMDVhLCAweDIwMTEsCisJMHgwMDMxLCAweGEyMTIsIDB4ZDFkYywgMHgxOTYwLCAweDA4MjgsIDB4NzgyYiwgMHgwMDA0LCAweDcwMDMsCisJMHgwMDAwLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweGEwMTQsIDB4OTAwNSwgMHgwNTUwLCAweDgwMDEsCisJMHgwMDM2LCAweDAwOTYsIDB4YTAxNiwgMHhhMDU4LCAweDIwNDgsIDB4YTAxMCwgMHgyMDA5LCAweDAwMzEsCisJMHg5MTFhLCAweDgzMWMsIDB4ODMxYywgMHg5MzhhLCAweDAwMDcsIDB4MWEwYywgMHgwZGQ1LCAweDkzOTgsCisJMHg0MGVhLCAweDIzMWQsIDB4MDgzZiwgMHg5MDgwLCAweDAwMDQsIDB4N2EyYSwgMHg3MTAwLCAweDgxMDgsCisJMHg3MTAyLCAweDAwOWUsIDB4MDAzZSwgMHg5MDhhLCAweDAwMzUsIDB4MTE0MCwgMHgwMDk2LCAweGEwNTgsCisJMHgyMDQ4LCAweGE4MDQsIDB4YTA1YSwgMHgyMDAxLCAweDAwMTksIDB4MDA5ZSwgMHhhMDEyLCAweDkwODUsCisJMHgwMDAxLCAweDAwMDUsIDB4NDEyNywgMHg0MTFlLCAweDQxMTUsIDB4NDEwYywgMHg0MTAzLCAweDQwZmEsCisJMHg0MGYxLCAweGE5NjQsIDB4NzkwMiwgMHhhOTY4LCAweDc5MDYsIDB4YTk2YywgMHg3OTEyLCAweGE5NzAsCisJMHg3OTE2LCAweDAwMDUsIDB4YTk3NCwgMHg3OTAyLCAweGE5NzgsIDB4NzkwNiwgMHhhOTdjLCAweDc5MTIsCisJMHhhOTgwLCAweDc5MTYsIDB4MDAwNSwgMHhhOTg0LCAweDc5MDIsIDB4YTk4OCwgMHg3OTA2LCAweGE5OGMsCisJMHg3OTEyLCAweGE5OTAsIDB4NzkxNiwgMHgwMDA1LCAweGE5OTQsIDB4NzkwMiwgMHhhOTk4LCAweDc5MDYsCisJMHhhOTljLCAweDc5MTIsIDB4YTlhMCwgMHg3OTE2LCAweDAwMDUsIDB4YTlhNCwgMHg3OTAyLCAweGE5YTgsCisJMHg3OTA2LCAweGE5YWMsIDB4NzkxMiwgMHhhOWIwLCAweDc5MTYsIDB4MDAwNSwgMHhhOWI0LCAweDc5MDIsCisJMHhhOWI4LCAweDc5MDYsIDB4YTliYywgMHg3OTEyLCAweGE5YzAsIDB4NzkxNiwgMHgwMDA1LCAweGE5YzQsCisJMHg3OTAyLCAweGE5YzgsIDB4NzkwNiwgMHhhOWNjLCAweDc5MTIsIDB4YTlkMCwgMHg3OTE2LCAweDAwMDUsCisJMHgwMGY2LCAweDAwZTYsIDB4MDA4NiwgMHgyMDcxLCAweDFhNjUsIDB4MjA3OSwgMHgwMDkwLCAweDc5MmMsCisJMHhkMWZjLCAweDAxZTgsIDB4NzgyYiwgMHgwMDAyLCAweDI5NDAsIDB4OTAyNiwgMHg3MDAwLCAweDAwMDIsCisJMHg0MTU3LCAweDQxNDMsIDB4NDE0ZSwgMHg4MDAxLCAweDcwMDIsIDB4ZDE5YywgMHgxMTgwLCAweDIwMTEsCisJMHgwMDAxLCAweDA4MGMsIDB4NDBiYywgMHgxOTBjLCAweDQwYmMsIDB4MDA0OCwgMHg4MDAxLCAweDcwMDIsCisJMHg3ODJjLCAweGQwZmMsIDB4MWQzOCwgMHgyMDExLCAweDAwMDEsIDB4MDgwYywgMHg0MGJjLCAweDAwOGUsCisJMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MDBjNiwgMHgwMDg2LCAweDIwNjEsCisJMHgwMjAwLCAweDIwMDEsIDB4MTlhOSwgMHgyMDA0LCAweDYwMWEsIDB4MjA2MSwgMHgwMTAwLCAweDIwMDEsCisJMHgxOWE4LCAweDIwMDQsIDB4NjBjZSwgMHg2MTA0LCAweGMxYWMsIDB4NjEwNiwgMHgyMDAxLCAweDAwMmMsCisJMHgyMDA0LCAweDkwMDUsIDB4MDUyMCwgMHgyMDM4LCAweDIwMDEsIDB4MDAyZSwgMHgyMDI0LCAweDIwMDEsCisJMHgwMDJmLCAweDIwMWMsIDB4MDgwYywgMHg0YjFmLCAweGE4MTMsIDB4MDAxOSwgMHhhZjE2LCAweDI5MDAsCisJMHhhODVhLCAweDk3OGEsIDB4MDAwNywgMHgwMjIwLCAweDIxMzgsIDB4MjAwOSwgMHgwMDA3LCAweDAwMTAsCisJMHgyNzA4LCAweDkwM2UsIDB4MDA5NiwgMHhhODU4LCAweDIwNDgsIDB4YTg1YywgMHg5MDgwLCAweDAwMTksCisJMHgwMDllLCAweDA4MGMsIDB4NDFkMywgMHgxZDY4LCAweDI5MDAsIDB4YTg1YSwgMHgwMGQwLCAweDA4MGMsCisJMHg0YjFmLCAweGE4MTMsIDB4MDAxOSwgMHhhODE3LCAweDAwMDEsIDB4MjkwMCwgMHhhODVhLCAweDIwMDEsCisJMHgwMDJlLCAweDIwMDQsIDB4YTg2NiwgMHgyMDAxLCAweDAwMmYsIDB4MjAwNCwgMHhhODZhLCAweDIwMDEsCisJMHgwMDJhLCAweDIwMDQsIDB4OTA4NCwgMHhmZmY4LCAweGE4NmUsIDB4MjAwMSwgMHgwMDJiLCAweDIwMDQsCisJMHhhODcyLCAweDIwNjEsIDB4MDA5MCwgMHgyMDc5LCAweDAxMDAsIDB4MjAwMSwgMHgxOWE4LCAweDIwMDQsCisJMHg2MDM2LCAweDIwMDksIDB4MDA0MCwgMHgwODBjLCAweDI0MTAsIDB4MjAwMSwgMHgwMDJhLCAweDIwMDQsCisJMHg5MDg0LCAweGZmZjgsIDB4NjAxYSwgMHgwMDA2LCAweDIwMDEsIDB4MDAyYiwgMHgyMDA0LCAweDYwMWUsCisJMHg3OGM2LCAweDAwMGUsIDB4NzhjYSwgMHg5MDA2LCAweDYwMGEsIDB4NjAwZSwgMHgwMDhlLCAweDAwY2UsCisJMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MDA4MCwgMHhhYTYwLCAweDIyZTgsCisJMHgyMGEwLCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAwODgsIDB4NzAyYiwgMHgwMDI2LCAweDc0MDIsCisJMHg3MzA2LCAweDkwMDYsIDB4NzAwYSwgMHg3MDBlLCAweDgxMGIsIDB4ODEwYiwgMHgyMWE4LCAweDgxMGIsCisJMHg3MTEyLCAweDcwMmIsIDB4MDA0MSwgMHg3MDJjLCAweGQwZmMsIDB4MGRlOCwgMHg3MDJiLCAweDAwMDIsCisJMHg3MDJiLCAweDAwNDAsIDB4NDAwNSwgMHg3NDAwLCAweDczMDQsIDB4ODdmZiwgMHgwMTkwLCAweDAwODYsCisJMHgwMDk2LCAweDI5NDAsIDB4MDA4NiwgMHgwODBjLCAweDRiMWYsIDB4MDA4ZSwgMHhhMDU4LCAweDAwYTYsCisJMHgyMDUwLCAweDI5MDAsIDB4YjAwNiwgMHhhMDVhLCAweDAwYWUsIDB4MDA5ZSwgMHgwMDhlLCAweDkwODUsCisJMHgwMDAxLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDIwMDEsIDB4MDAyZCwgMHgyMDA0LCAweDkwMDUsCisJMHgwNTI4LCAweDIwMzgsIDB4MjAwMSwgMHgwMDMwLCAweDIwMjQsIDB4MjAwMSwgMHgwMDMxLCAweDIwMWMsCisJMHgwODBjLCAweDRiMWYsIDB4Mjk0MCwgMHhhODEzLCAweDAwMTksIDB4YWYxNiwgMHgyOTAwLCAweGE4NWEsCisJMHg5NzhhLCAweDAwMDcsIDB4MDIyMCwgMHgyMTM4LCAweDIwMDksIDB4MDAwNywgMHgwMDEwLCAweDI3MDgsCisJMHg5MDNlLCAweDAwOTYsIDB4YTg1OCwgMHgyMDQ4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDE5LCAweDAwOWUsCisJMHgwODBjLCAweDQxZDMsIDB4MWQ2OCwgMHgyOTAwLCAweGE4NWEsIDB4MDBkOCwgMHgwODBjLCAweDRiMWYsCisJMHgyOTQwLCAweGEwMTMsIDB4MDAxOSwgMHhhMDE3LCAweDAwMDEsIDB4MjgwMCwgMHhhMDVhLCAweDIwMDEsCisJMHgwMDMwLCAweDIwMDQsIDB4YTA2NiwgMHgyMDAxLCAweDAwMzEsIDB4MjAwNCwgMHhhMDZhLCAweDIwMDEsCisJMHgwMDJhLCAweDIwMDQsIDB4OTA4NCwgMHhmZmY4LCAweGEwNmUsIDB4MjAwMSwgMHgwMDJiLCAweDIwMDQsCisJMHhhMDcyLCAweDIwMDEsIDB4MDMyYSwgMHgyMDAzLCAweDAwMDQsIDB4Nzg4NCwgMHhkMGFjLCAweDExODAsCisJMHgyMDAxLCAweDAxMDEsIDB4MjAwYywgMHg5MThkLCAweDAyMDAsIDB4MjEwMiwgMHhhMDE3LCAweDAwMDAsCisJMHgyMDAxLCAweDFhNjEsIDB4MjAwMywgMHgwMDAzLCAweDIwMDEsIDB4MDMyYSwgMHgyMDAzLCAweDAwMDksCisJMHgyMDAxLCAweDAzMDAsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MDIwZCwgMHgyMDAzLCAweDAwMDAsCisJMHgyMDAxLCAweDAwMDQsIDB4MjAwYywgMHg5MThkLCAweDAwMDIsIDB4MjEwMiwgMHgwMGVlLCAweDAwMDUsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMGE5LCAweDAwMDcsIDB4MjBhMSwgMHgxODQwLCAweDIwZTksCisJMHgwMDAxLCAweDkwMDYsIDB4NDAwNCwgMHgyMGE5LCAweDAwMTQsIDB4MjBhMSwgMHhmZmVjLCAweDIwZTksCisJMHgwMDAwLCAweDkwMDYsIDB4NDAwNCwgMHgyMDA5LCAweDAxM2MsIDB4MjAwYSwgMHgwMTJlLCAweDc4ODAsCisJMHg5MDg2LCAweDAwNTIsIDB4MDEwOCwgMHgwMDA1LCAweDA4MDQsIDB4MzU4MywgMHg3ZDk4LCAweDdjOWMsCisJMHgwODA0LCAweDM2ODUsIDB4MDgwYywgMHg3NDNlLCAweDE5MGMsIDB4NjA3MiwgMHg2MDQwLCAweDkwODQsCisJMHgwMDIwLCAweDA5YjEsIDB4MjA2OSwgMHgxODQ3LCAweDJkMDAsIDB4MjAwOSwgMHgwMDMwLCAweDdhOGMsCisJMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHgyMDM5LCAweDAwMDEsIDB4MDgwYywgMHg0YjY4LCAweDcwMWYsCisJMHg0MmIyLCAweDAwMDUsIDB4MDgwYywgMHg1NzZjLCAweDExMzAsIDB4M2IwMCwgMHgzYTA4LCAweGMxOTQsCisJMHhjMDk1LCAweDIwZDgsIDB4MjFkMCwgMHgyMDY5LCAweDE4NDcsIDB4NjgwMCwgMHg5MDA1LCAweDA5MDQsCisJMHgzNWI4LCAweDY4MDQsIDB4ZDBhYywgMHgwMTE4LCAweGQwYTQsIDB4MDkwNCwgMHgzNWI4LCAweGQwOTQsCisJMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHg2MTA0LCAweDAxMzgsIDB4NjIwMCwgMHg5MjkyLCAweDAwMDUsCisJMHgwMjE4LCAweDkxOGMsIDB4ZmZkZiwgMHgwMDEwLCAweDkxOGQsIDB4MDAyMCwgMHg2MTA2LCAweDAwY2UsCisJMHhkMDhjLCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDYxMDQsIDB4MDExOCwgMHg5MThkLCAweDAwMTAsCisJMHgwMDEwLCAweDkxOGMsIDB4ZmZlZiwgMHg2MTA2LCAweDAwY2UsIDB4ZDA4NCwgMHgwMTU4LCAweDZhMjgsCisJMHg5MjhhLCAweDAwN2YsIDB4MWEwNCwgMHgzNWI4LCAweDkyODgsIDB4MzM4NCwgMHgyMTBkLCAweDkxOGMsCisJMHgwMGZmLCAweDYxNjYsIDB4ZDBkYywgMHgwMTMwLCAweDY4MjgsIDB4OTA4YSwgMHgwMDdmLCAweDFhMDQsCisJMHgzNWI4LCAweDYwNWUsIDB4Njg4OCwgMHg5MDg0LCAweDAwMzAsIDB4ODAwNCwgMHg4MDA0LCAweDgwMDQsCisJMHg4MDA0LCAweDAwMDYsIDB4MjAwOSwgMHgxOWIwLCAweDkwODAsIDB4MjliOCwgMHgyMDA1LCAweDIwMGEsCisJMHgwMDBlLCAweDIwMDksIDB4MTliMSwgMHg5MDgwLCAweDI5YmMsIDB4MjAwNSwgMHgyMDBhLCAweDY4MDgsCisJMHg5MDhhLCAweDAxMDAsIDB4MGEwNCwgMHgzNWI4LCAweDkwOGEsIDB4MDg0MSwgMHgxYTA0LCAweDM1YjgsCisJMHg5MDg0LCAweDAwMDcsIDB4MTkwNCwgMHgzNWI4LCAweDY4MGMsIDB4OTAwNSwgMHgwOTA0LCAweDM1YjgsCisJMHg2ODEwLCAweDkwMDUsIDB4MDkwNCwgMHgzNWI4LCAweDY4NDgsIDB4Njk0MCwgMHg5MTBhLCAweDFhMDQsCisJMHgzNWI4LCAweDgwMDEsIDB4MDkwNCwgMHgzNWI4LCAweDY4NGMsIDB4Njk0NCwgMHg5MTBhLCAweDFhMDQsCisJMHgzNWI4LCAweDgwMDEsIDB4MDkwNCwgMHgzNWI4LCAweDIwMDksIDB4MTk4MCwgMHgyMDBiLCAweDAwMDAsCisJMHgyMDAxLCAweDE4NjksIDB4MjAwNCwgMHhkMGM0LCAweDAxNDAsIDB4Nzg4NCwgMHgyMDBhLCAweDIwMDksCisJMHgwMTdmLCAweDIwMGEsIDB4M2IwMCwgMHhjMDg1LCAweDIwZDgsIDB4NjgxNCwgMHg5MDhjLCAweDAwZmYsCisJMHg2MTRlLCAweDgwMDcsIDB4OTA4NCwgMHgwMGZmLCAweDYwNTIsIDB4MDgwYywgMHg3NzU1LCAweDA4MGMsCisJMHg2YTNlLCAweDA4MGMsIDB4NmE3MiwgMHg2ODA4LCAweDYwMmEsIDB4MDgwYywgMHgyMzgyLCAweDIwMDksCisJMHgwMTcwLCAweDIwMGIsIDB4MDA4MCwgMHhhMDAxLCAweGEwMDEsIDB4MjAwYiwgMHgwMDAwLCAweDAwMzYsCisJMHg2YjA4LCAweDA4MGMsIDB4MjkxZiwgMHgwMDNlLCAweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDE5MDQsCisJMHg0NDQ5LCAweDY4MTgsIDB4NjkxYywgMHg2YTIwLCAweDZiMjQsIDB4ODAwNywgMHg4MTBmLCAweDgyMTcsCisJMHg4MzFmLCAweDYwMTYsIDB4NjExYSwgMHg2MjFlLCAweDYzMjIsIDB4NmMwNCwgMHhkNGY0LCAweDAxNDgsCisJMHg2ODMwLCAweDY5MzQsIDB4NmEzOCwgMHg2YjNjLCAweDgwMDcsIDB4ODEwZiwgMHg4MjE3LCAweDgzMWYsCisJMHgwMDEwLCAweDkwODQsIDB4ZjBmZiwgMHg2MDA2LCAweDYxMGEsIDB4NjIwZSwgMHg2MzEyLCAweDgwMDcsCisJMHg4MTBmLCAweDgyMTcsIDB4ODMxZiwgMHgyMGE5LCAweDAwMDQsIDB4MjBhMSwgMHgxOWIyLCAweDIwZTksCisJMHgwMDAxLCAweDQwMDEsIDB4MjBhOSwgMHgwMDA0LCAweDIwYTEsIDB4MTljYywgMHgyMGU5LCAweDAwMDEsCisJMHg0MDAxLCAweDA4MGMsIDB4ODZhYywgMHgwMGM2LCAweDkwMGUsIDB4MjBhOSwgMHgwMDAxLCAweDZiNzAsCisJMHhkMzg0LCAweDA1MTAsIDB4MDA2OCwgMHgyMDA5LCAweDAxMDAsIDB4MjEwYywgMHg5MThlLCAweDAwMDgsCisJMHgxMTEwLCAweDgzOWQsIDB4MDAxMCwgMHg4M2Y1LCAweDNlMTgsIDB4MTJiMCwgMHgzNTA4LCAweDgxMDksCisJMHgwODBjLCAweDdkMGMsIDB4Njg3OCwgMHg2MDE2LCAweDY4NzQsIDB4MjAwOCwgMHg5MDg0LCAweGZmMDAsCisJMHg4MDA3LCAweDYwMGEsIDB4OTE4NCwgMHgwMGZmLCAweDYwMDYsIDB4ODEwOCwgMHgxMTE4LCAweDYwMDMsCisJMHgwMDAzLCAweDAwMTAsIDB4NjAwMywgMHgwMDAxLCAweDFmMDQsIDB4NDNhMywgMHgwMGNlLCAweDAwYzYsCisJMHgyMDYxLCAweDE5OWIsIDB4NmE4OCwgMHg5Mjg0LCAweGMwMDAsIDB4MjAxMCwgMHg5Mjg2LCAweDAwMDAsCisJMHgxMTU4LCAweDIwNjMsIDB4MDAwMCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyYmM2LCAweDIwMDEsCisJMHgwMDAxLCAweDA4MGMsIDB4MmJhOSwgMHgwMDg4LCAweDkyODYsIDB4NDAwMCwgMHgxMTQ4LCAweDIwNjMsCisJMHgwMDAxLCAweDkwMDYsIDB4MDgwYywgMHgyYmM2LCAweDkwMDYsIDB4MDgwYywgMHgyYmE5LCAweDAwMjgsCisJMHg5Mjg2LCAweDgwMDAsIDB4MWQzMCwgMHgyMDYzLCAweDAwMDIsIDB4MDBjZSwgMHg2ODg4LCAweGQwZWMsCisJMHgwMTMwLCAweDIwMTEsIDB4MDExNCwgMHgyMjA0LCAweDkwODUsIDB4MDEwMCwgMHgyMDEyLCAweDZhODAsCisJMHg5Mjg0LCAweDAwMzAsIDB4OTA4NiwgMHgwMDMwLCAweDExMjgsIDB4OTI5NCwgMHhmZmNmLCAweDkyOTUsCisJMHgwMDIwLCAweDZhODIsIDB4MjAwMSwgMHgxOTdiLCAweDZhODAsIDB4OTI5NCwgMHgwMDMwLCAweDkyOGUsCisJMHgwMDAwLCAweDAxNzAsIDB4OTI4ZSwgMHgwMDEwLCAweDAxMTgsIDB4OTI4ZSwgMHgwMDIwLCAweDAxNDAsCisJMHgyMDAzLCAweGFhYWEsIDB4MDgwYywgMHgyOTk0LCAweDIwMDEsIDB4MTk2YywgMHgyMTAyLCAweDAwMDgsCisJMHgyMTAyLCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDYwMmYsIDB4MDA0MCwgMHg2MDJmLCAweDAwMDAsCisJMHgwMGNlLCAweDA4MGMsIDB4NzQzZSwgMHgwMTI4LCAweDA4MGMsIDB4NTA1NCwgMHgwMTEwLCAweDA4MGMsCisJMHgyOGU1LCAweDYwZDQsIDB4OTAwNSwgMHgwMWMwLCAweDYwMDMsIDB4MDAwMSwgMHgyMDA5LCAweDQ0MzEsCisJMHgwMGUwLCAweDA4MGMsIDB4NzQzZSwgMHgxMTY4LCAweDIwMTEsIDB4NzJjZSwgMHgwODBjLCAweDg1YjAsCisJMHgyMDExLCAweDcyYzEsIDB4MDgwYywgMHg4NjhhLCAweDA4MGMsIDB4NzcyOSwgMHgwODBjLCAweDczNmEsCisJMHgwMDQwLCAweDA4MGMsIDB4NWY2YywgMHgwMDI4LCAweDYwMDMsIDB4MDAwNCwgMHgyMDA5LCAweDQ0NDksCisJMHgwMDIwLCAweDA4MGMsIDB4Njk2ZSwgMHgwODA0LCAweDM1ODMsIDB4MjAwMSwgMHgwMTcwLCAweDIwMDQsCisJMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDRjLCAweDExMTgsIDB4MjA5MSwgMHgzMGJkLCAweDA4MTcsCisJMHgyMDkxLCAweDMwM2QsIDB4MDgxNywgMHg2MDAwLCAweDkwODYsIDB4MDAwMCwgMHgwOTA0LCAweDM1YjUsCisJMHgyMDY5LCAweDE4NDcsIDB4Nzg5MCwgMHg2ODQyLCAweDc4OTQsIDB4Njg0NiwgMHgyZDAwLCAweDIwMDksCisJMHgwMDMwLCAweDdhOGMsIDB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4MjAzOSwgMHgwMDAxLCAweDA4MDQsCisJMHg0YjZiLCAweDkwMDYsIDB4MDgwYywgMHgyOGU1LCAweDgxZmYsIDB4MTkwNCwgMHgzNWI1LCAweDA4MGMsCisJMHg3NDNlLCAweDExYjAsIDB4MDgwYywgMHg3NzI0LCAweDA4MGMsIDB4NjBhZCwgMHgwODBjLCAweDMzNzgsCisJMHgwMTE4LCAweDYxMzAsIDB4YzE4ZCwgMHg2MTMyLCAweDA4MGMsIDB4ZDM4OCwgMHgwMTMwLCAweDA4MGMsCisJMHg3NDYxLCAweDExMTgsIDB4MDgwYywgMHg3NDE2LCAweDAwMzgsIDB4MDgwYywgMHg3MzZhLCAweDAwMjAsCisJMHgwODBjLCAweDYwNzIsIDB4MDgwYywgMHg1ZjZjLCAweDA4MDQsIDB4MzU4MywgMHg4MWZmLCAweDE5MDQsCisJMHgzNWI1LCAweDA4MGMsIDB4NzQzZSwgMHgxMTEwLCAweDA4MDQsIDB4MzViNSwgMHg2MTk0LCAweDgxZmYsCisJMHgwMWE4LCAweDcwNGYsIDB4MDAwMCwgMHgyMDAxLCAweDFjODAsIDB4MjAwOSwgMHgwMDQwLCAweDdhOGMsCisJMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDM5LCAweDAwMDEsCisJMHgwODBjLCAweDRiNmIsIDB4NzAxZiwgMHgzNTgxLCAweDAxMmUsIDB4MDAwNSwgMHg3MDRmLCAweDAwMDEsCisJMHgwMGQ2LCAweDIwNjksIDB4MWM4MCwgMHgyMGE5LCAweDAwNDAsIDB4MjBlOSwgMHgwMDAxLCAweDIwYTEsCisJMHgxYzgwLCAweDIwMTksIDB4ZmZmZiwgMHg0MzA0LCAweDY1NWMsIDB4OTU4OCwgMHgzMzg0LCAweDIxMGQsCisJMHg5MThjLCAweDAwZmYsIDB4MjE2YSwgMHg5MDBlLCAweDIwMTEsIDB4MDAwMiwgMHgyMTAwLCAweDk1MDYsCisJMHgwMWE4LCAweDA4MGMsIDB4NjY5OSwgMHgxMTkwLCAweGI4MTQsIDB4ODIxYywgMHgwMjM4LCAweDkzOTgsCisJMHgxYzgwLCAweDkwODUsIDB4ZmYwMCwgMHg4MDA3LCAweDIwMWEsIDB4MDAzOCwgMHg5Mzk4LCAweDFjODAsCisJMHgyMzI0LCAweDk0YTQsIDB4ZmYwMCwgMHg5NDA1LCAweDIwMWEsIDB4ODIxMCwgMHg4MTA4LCAweDkxODIsCisJMHgwMDgwLCAweDEyMDgsIDB4MGMxOCwgMHg4MjAxLCAweDgwMDcsIDB4MmQwYywgMHg5MTA1LCAweDIwNmEsCisJMHgwMGRlLCAweDIwYTksIDB4MDA0MCwgMHgyMGExLCAweDFjODAsIDB4MjA5OSwgMHgxYzgwLCAweDA4MGMsCisJMHg1ZmZkLCAweDA4MDQsIDB4NDRhMywgMHgwODBjLCAweDRiNTIsIDB4MDkwNCwgMHgzNWI4LCAweDA4MGMsCisJMHg0YjFmLCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzViNSwgMHgwODBjLCAweDU3NWQsCisJMHhkMGI0LCAweDA1NTgsIDB4Nzg4NCwgMHg5MDhlLCAweDAwN2UsIDB4MDUzOCwgMHg5MDhlLCAweDAwN2YsCisJMHgwNTIwLCAweDkwOGUsIDB4MDA4MCwgMHgwNTA4LCAweDA4MGMsIDB4MzM3MywgMHgxMTQ4LCAweGI4MDAsCisJMHhkMDhjLCAweDExZDgsIDB4YjgwNCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDA2LCAweDExYTgsCisJMHhhODY3LCAweDAwMDAsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4MDgwYywgMHhjZTUxLCAweDExMjAsCisJMHgyMDA5LCAweDAwMDMsIDB4MDgwNCwgMHgzNWI1LCAweDcwMDcsIDB4MDAwMywgMHg3MDFmLCAweDQ1MzEsCisJMHgwMDA1LCAweDA4MGMsIDB4NGI1MiwgMHgwOTA0LCAweDM1YjgsIDB4MjBhOSwgMHgwMDJiLCAweGI4YzQsCisJMHgyMGUwLCAweGI4YzgsIDB4MjA5OCwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMDIsCisJMHgyMGEwLCAweDQwMDMsIDB4MjBhOSwgMHgwMDA4LCAweDkwODAsIDB4MDAwNiwgMHgyMGEwLCAweGI4YzQsCisJMHgyMGUwLCAweGI4YzgsIDB4OTA4MCwgMHgwMDA2LCAweDIwOTgsIDB4MDgwYywgMHgwZjdjLCAweDAwNzAsCisJMHgyMGE5LCAweDAwMDQsIDB4YTg1YywgMHg5MDgwLCAweDAwMGEsIDB4MjBhMCwgMHhiOGM0LCAweDIwZTAsCisJMHhiOGM4LCAweDkwODAsIDB4MDAwYSwgMHgyMDk4LCAweDA4MGMsIDB4MGY3YywgMHg4OTA2LCAweDgwMDYsCisJMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDAyLCAweDIwMDksCisJMHgwMDJiLCAweDdhOGMsIDB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4MDgwNCwgMHg0YjZiLCAweDgxZmYsCisJMHgxOTA0LCAweDM1YjUsIDB4MDgwYywgMHg0YjM2LCAweDA5MDQsIDB4MzViOCwgMHgwODBjLCAweDY4MGIsCisJMHgwOTA0LCAweDM1YjUsIDB4MDA1OCwgMHhhODc4LCAweDkwMDUsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDQsCisJMHgwODA0LCAweDM1YjUsIDB4YTk3NCwgMHhhYTk0LCAweDA4MDQsIDB4MzU4MywgMHgwODBjLCAweDU3NjUsCisJMHgwOTA0LCAweDM1ODMsIDB4NzAxZiwgMHg0NTdiLCAweDcwMDcsIDB4MDAwMywgMHgwMDA1LCAweDgxZmYsCisJMHgxOTA0LCAweDM1YjUsIDB4Nzg4OCwgMHg5MDhhLCAweDEwMDAsIDB4MWEwNCwgMHgzNWI4LCAweDA4MGMsCisJMHg0YjUyLCAweDA5MDQsIDB4MzViOCwgMHgwODBjLCAweDZhMGMsIDB4MDEyMCwgMHgwODBjLCAweDZhMTQsCisJMHgxOTA0LCAweDM1YjgsIDB4MDgwYywgMHg2ODkwLCAweDA5MDQsIDB4MzViNSwgMHgyMDE5LCAweDAwMDQsCisJMHg5MDBlLCAweDA4MGMsIDB4NjgxZCwgMHgwOTA0LCAweDM1YjUsIDB4Nzk4NCwgMHg3YTg4LCAweDA0YzksCisJMHgwOGE4LCAweGE4OWMsIDB4OTA4YSwgMHgxMDAwLCAweDEyZjgsIDB4MDgwYywgMHg0YjUwLCAweDAxZTAsCisJMHgwODBjLCAweDZhMGMsIDB4MDExOCwgMHgwODBjLCAweDZhMTQsIDB4MTFiMCwgMHgwODBjLCAweDY4OTAsCisJMHgyMDA5LCAweDAwMDIsIDB4MDE2OCwgMHgyMDA5LCAweDAwMDIsIDB4MjAxOSwgMHgwMDA0LCAweDA4MGMsCisJMHg2ODFkLCAweDIwMDksIDB4MDAwMywgMHgwMTIwLCAweGE5OTgsIDB4YWE5YywgMHgwMGQxLCAweDAwNjAsCisJMHhhODk3LCAweDQwMDUsIDB4YTk5YSwgMHgwMDEwLCAweGE4OTcsIDB4NDAwNiwgMHg5MDBlLCAweDkwODUsCisJMHgwMDAxLCAweDIwMDEsIDB4MDAzMCwgMHgwMDA1LCAweGE4OTcsIDB4NDAwMCwgMHgwODBjLCAweDU3NjUsCisJMHgwMTEwLCAweDkwMDYsIDB4MDAxOCwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDAsCisJMHgwMDA1LCAweDkxODYsIDB4MDBmZiwgMHgwMTEwLCAweDAwNzEsIDB4MDA2MCwgMHgyMDI5LCAweDAwN2UsCisJMHgyMDYxLCAweDE4MDAsIDB4NjQ1YywgMHgyNDAwLCAweDk1MDYsIDB4MDExMCwgMHgyNTA4LCAweDAwMTksCisJMHg4NTI5LCAweDFlYzgsIDB4MDAwNSwgMHgwODBjLCAweDY2OTksIDB4MTEzOCwgMHgyMjAwLCAweDgwMDMsCisJMHg4MDBiLCAweDgxMGIsIDB4OTEwOCwgMHgwODBjLCAweDg1YmUsIDB4MDAwNSwgMHg4MWZmLCAweDE5MDQsCisJMHgzNWI1LCAweDc5OGMsIDB4MjAwMSwgMHgxOTdmLCAweDkxOGMsIDB4ODAwMCwgMHgyMTAyLCAweDA4MGMsCisJMHg0YjM2LCAweDA5MDQsIDB4MzViOCwgMHgwODBjLCAweDZhMGMsIDB4MDEyMCwgMHgwODBjLCAweDZhMTQsCisJMHgxOTA0LCAweDM1YjgsIDB4MDgwYywgMHg2NzYwLCAweDA5MDQsIDB4MzViNSwgMHgwODBjLCAweDY4MTQsCisJMHgwOTA0LCAweDM1YjUsIDB4MjAwMSwgMHgxOTdmLCAweDIwMDQsIDB4ZDBmYywgMHgxOTA0LCAweDM1ODMsCisJMHgwODA0LCAweDQ1ODYsIDB4YTlhMCwgMHgyMDAxLCAweDE5N2YsIDB4OTE4YywgMHg4MDAwLCAweGMxOGQsCisJMHgyMTAyLCAweDA4MGMsIDB4NGI0MywgMHgwMWEwLCAweDA4MGMsIDB4NmEwYywgMHgwMTE4LCAweDA4MGMsCisJMHg2YTE0LCAweDExNzAsIDB4MDgwYywgMHg2NzYwLCAweDIwMDksIDB4MDAwMiwgMHgwMTI4LCAweDA4MGMsCisJMHg2ODE0LCAweDExNzAsIDB4MjAwOSwgMHgwMDAzLCAweGE4OTcsIDB4NDAwNSwgMHhhOTlhLCAweDAwMTAsCisJMHhhODk3LCAweDQwMDYsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwgMHgwMDMwLCAweDAwMDUsCisJMHhhODk3LCAweDQwMDAsIDB4MjAwMSwgMHgxOTdmLCAweDIwMDQsIDB4ZDBmYywgMHgxMTI4LCAweDA4MGMsCisJMHg1NzY1LCAweDAxMTAsIDB4OTAwNiwgMHgwMDE4LCAweDkwMGUsIDB4OTA4NSwgMHgwMDAxLCAweDIwMDEsCisJMHgwMDAwLCAweDAwMDUsIDB4ODFmZiwgMHgxOTA0LCAweDM1YjUsIDB4Nzk4YywgMHgyMDAxLCAweDE5N2UsCisJMHg5MThjLCAweDgwMDAsIDB4MjEwMiwgMHgwODBjLCAweDRiMzYsIDB4MDkwNCwgMHgzNWI4LCAweDA4MGMsCisJMHg2YTBjLCAweDAxMjAsIDB4MDgwYywgMHg2YTE0LCAweDE5MDQsIDB4MzViOCwgMHgwODBjLCAweDY3NjAsCisJMHgwOTA0LCAweDM1YjUsIDB4MDgwYywgMHg2ODAyLCAweDA5MDQsIDB4MzViNSwgMHgyMDAxLCAweDE5N2UsCisJMHgyMDA0LCAweGQwZmMsIDB4MTkwNCwgMHgzNTgzLCAweDA4MDQsIDB4NDU4NiwgMHhhOWEwLCAweDIwMDEsCisJMHgxOTdlLCAweDkxOGMsIDB4ODAwMCwgMHhjMThkLCAweDIxMDIsIDB4MDgwYywgMHg0YjQzLCAweDAxYTAsCisJMHgwODBjLCAweDZhMGMsIDB4MDExOCwgMHgwODBjLCAweDZhMTQsIDB4MTE3MCwgMHgwODBjLCAweDY3NjAsCisJMHgyMDA5LCAweDAwMDIsIDB4MDEyOCwgMHgwODBjLCAweDY4MDIsIDB4MTE3MCwgMHgyMDA5LCAweDAwMDMsCisJMHhhODk3LCAweDQwMDUsIDB4YTk5YSwgMHgwMDEwLCAweGE4OTcsIDB4NDAwNiwgMHg5MDBlLCAweDkwODUsCisJMHgwMDAxLCAweDIwMDEsIDB4MDAzMCwgMHgwMDA1LCAweGE4OTcsIDB4NDAwMCwgMHgyMDAxLCAweDE5N2UsCisJMHgyMDA0LCAweGQwZmMsIDB4MTEyOCwgMHgwODBjLCAweDU3NjUsIDB4MDExMCwgMHg5MDA2LCAweDAwMTgsCisJMHg5MDBlLCAweDkwODUsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDAsIDB4MDAwNSwgMHg2MTAwLCAweDA4MDQsCisJMHgzNTgzLCAweDA4MGMsIDB4NGI1MiwgMHgwOTA0LCAweDM1YjgsIDB4MDgwYywgMHg1NzcxLCAweDE5MDQsCisJMHgzNWI1LCAweDc5YTgsIDB4ZDE4NCwgMHgxMTU4LCAweGI4MzQsIDB4ODAwNywgMHg3ODllLCAweGI4MzAsCisJMHg4MDA3LCAweDc4OWEsIDB4YmIyYywgMHg4MzFmLCAweGJhMjgsIDB4ODIxNywgMHgwMDUwLCAweGI4MjQsCisJMHg4MDA3LCAweDc4OWUsIDB4YjgyMCwgMHg4MDA3LCAweDc4OWEsIDB4YmIxYywgMHg4MzFmLCAweGJhMTgsCisJMHg4MjE3LCAweGI5MDAsIDB4OTE4YywgMHgwMjAyLCAweDA4MDQsIDB4MzU4MywgMHg3OGE4LCAweDkwOWMsCisJMHgwMDAzLCAweGQwYWMsIDB4MTE1OCwgMHhkMGI0LCAweDExNDgsIDB4OTM5YSwgMHgwMDAzLCAweDFhMDQsCisJMHgzNWI1LCAweDYyNWMsIDB4Nzg4NCwgMHg5MjA2LCAweDE5MDQsIDB4NDczYiwgMHgwODBjLCAweDg2OTYsCisJMHgyMDAxLCAweGZmZWMsIDB4MjAwOSwgMHgwMDBjLCAweDdhOGMsIDB4N2I4OCwgMHg3YzljLCAweDdkOTgsCisJMHgyMDM5LCAweDAwMDAsIDB4MDAwNiwgMHg3OGE4LCAweDkwODQsIDB4MDA4MCwgMHgxMWY4LCAweDAwMDYsCisJMHgwMDM2LCAweDIwMDEsIDB4MWE3ZiwgMHgyMDFjLCAweDdiOWEsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsCisJMHgxYTgwLCAweDIwMWMsIDB4N2I5ZSwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgxYTgxLCAweDIwMWMsCisJMHg3YmEyLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDFhN2IsIDB4MjAxYywgMHg3YmFhLCAweDIwMDMsCisJMHgwMDAwLCAweDAwM2UsIDB4MDAwZSwgMHgwMDBlLCAweDA4MDQsIDB4NGI2YiwgMHgwMDBlLCAweDIwMzEsCisJMHgwMDAwLCAweDIwNjEsIDB4MThiOCwgMHgyYzQ0LCAweGE2NmEsIDB4YTE3YSwgMHhhNzcyLCAweGEwNzYsCisJMHhhMjhlLCAweGEzOTIsIDB4YTQ5NiwgMHhhNTlhLCAweDA4MGMsIDB4MTBlOSwgMHg3MDA3LCAweDAwMDIsCisJMHg3MDFmLCAweDQ3NWIsIDB4MDAwNSwgMHg4MWZmLCAweDE5MDQsIDB4MzViNSwgMHgwODBjLCAweDRiNTIsCisJMHgwOTA0LCAweDM1YjgsIDB4MDgwYywgMHg2YTBjLCAweDE5MDQsIDB4MzViNSwgMHgwMGM2LCAweDA4MGMsCisJMHg0YjFmLCAweDAwY2UsIDB4MDkwNCwgMHgzNWI1LCAweGE4NjcsIDB4MDAwMCwgMHhhODY4LCAweGMwZmQsCisJMHhhODZhLCAweDdlYTgsIDB4MDgwYywgMHhjZGY3LCAweDA5MDQsIDB4MzViNSwgMHg3MDA3LCAweDAwMDMsCisJMHg3MDFmLCAweDQ3N2IsIDB4MDAwNSwgMHgwODBjLCAweDQyNzgsIDB4MDAwNiwgMHgwMDM2LCAweDIwMDEsCisJMHgxYTdmLCAweDIwMWMsIDB4N2I5YSwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgxYTgwLCAweDIwMWMsCisJMHg3YjllLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDFhODEsIDB4MjAxYywgMHg3YmEyLCAweDIwMDMsCisJMHgwMDAwLCAweDIwMDEsIDB4MWE3YiwgMHgyMDFjLCAweDdiYWEsIDB4MjAwMywgMHgwMDAwLCAweDAwM2UsCisJMHgwMDBlLCAweDA4MDQsIDB4MzU4MywgMHhhODMwLCAweDkwODYsIDB4MDEwMCwgMHgwOTA0LCAweDM1YjUsCisJMHg4OTA2LCAweDgwMDYsIDB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwgMHhmZmMwLCAweDkwODAsCisJMHgwMDFiLCAweDIwMDksIDB4MDAwYywgMHg3YThjLCAweDdiODgsIDB4N2M5YywgMHg3ZDk4LCAweDA4MDQsCisJMHg0YjZiLCAweDkwMDYsIDB4MDgwYywgMHgyOGU1LCAweDc4YTgsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsCisJMHgwMGZmLCAweDAxMTgsIDB4ODFmZiwgMHgxOTA0LCAweDM1YjUsIDB4MDgwYywgMHg3NDNlLCAweDAxMTAsCisJMHgwODBjLCAweDYwNzIsIDB4Nzg4OCwgMHg5MDhhLCAweDEwMDAsIDB4MWEwNCwgMHgzNWI4LCAweDc5ODQsCisJMHg5MTg2LCAweDAwZmYsIDB4MDEzOCwgMHg5MTgyLCAweDAwN2YsIDB4MWEwNCwgMHgzNWI4LCAweDIxMDAsCisJMHgwODBjLCAweDI4YWYsIDB4MDAyNiwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjEsCisJMHgxOWY5LCAweDYwMWIsIDB4MDAwMCwgMHg2MDFmLCAweDAwMDAsIDB4NjA3MywgMHgwMDAwLCAweDYwNzcsCisJMHgwMDAwLCAweDA4MGMsIDB4NzQzZSwgMHgxMTU4LCAweDA4MGMsIDB4NzcyNCwgMHgwODBjLCAweDYwYWQsCisJMHg5MDg1LCAweDAwMDEsIDB4MDgwYywgMHg3NDg1LCAweDA4MGMsIDB4NzM2YSwgMHgwMGQwLCAweDA4MGMsCisJMHhhZWI0LCAweDIwNjEsIDB4MDEwMCwgMHgyMDAxLCAweDE4MTgsIDB4MjAwNCwgMHg5MDg0LCAweDAwZmYsCisJMHg4MTBmLCAweDkxMDUsIDB4NjA0YSwgMHg2MDQzLCAweDAwOTAsIDB4NjA0MywgMHgwMDEwLCAweDIwMDksCisJMHgxOTk4LCAweDIwMGIsIDB4MDAwMCwgMHgyMDA5LCAweDAwMmQsIDB4MjAxMSwgMHg1Zjk4LCAweDA4MGMsCisJMHg4NjQ4LCAweDc5ODQsIDB4MDgwYywgMHg3NDNlLCAweDExMTAsIDB4MjAwOSwgMHgwMGZmLCAweDdhODgsCisJMHgwODBjLCAweDQ1ZTksIDB4MDEyZSwgMHgwMGNlLCAweDAwMmUsIDB4MDgwNCwgMHgzNTgzLCAweDc5ODQsCisJMHgwODBjLCAweDY2MzgsIDB4MmIwOCwgMHgxOTA0LCAweDM1YjgsIDB4MDgwNCwgMHgzNTgzLCAweDgxZmYsCisJMHgwMTIwLCAweDIwMDksIDB4MDAwMSwgMHgwODA0LCAweDM1YjUsIDB4NjBkYywgMHhkMGFjLCAweDExMzAsCisJMHhkMDljLCAweDExMjAsIDB4MjAwOSwgMHgwMDA1LCAweDA4MDQsIDB4MzViNSwgMHgwODBjLCAweDRiMWYsCisJMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDM1YjUsIDB4Nzk4NCwgMHg5MTkyLCAweDAwMjEsCisJMHgxYTA0LCAweDM1YjgsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHhhODVjLCAweDkwODAsCisJMHgwMDE5LCAweDcwMmEsIDB4YWY2MCwgMHg3NzM2LCAweDA4MGMsIDB4NGI2OCwgMHg3MDFmLCAweDQ4MmYsCisJMHg3ODgwLCAweDkwODYsIDB4MDA2ZSwgMHgwMTEwLCAweDcwMWYsIDB4NTIwNiwgMHgwMDA1LCAweDIwMDksCisJMHgwMDgwLCAweDA4MGMsIDB4NjY5OSwgMHgxMTE4LCAweDA4MGMsIDB4NmEwYywgMHgwMTIwLCAweDIwMjEsCisJMHg0MDBhLCAweDA4MDQsIDB4MzU4NSwgMHgwMGQ2LCAweDAwOTYsIDB4YTk2NCwgMHhhYTZjLCAweGFiNzAsCisJMHhhYzc0LCAweGFkNzgsIDB4YWU3YywgMHhhODg0LCAweDkwYmUsIDB4MDEwMCwgMHgwOTA0LCAweDQ4YzgsCisJMHg5MGJlLCAweDAxMTIsIDB4MDkwNCwgMHg0OGM4LCAweDkwYmUsIDB4MDExMywgMHgwOTA0LCAweDQ4YzgsCisJMHg5MGJlLCAweDAxMTQsIDB4MDkwNCwgMHg0OGM4LCAweDkwYmUsIDB4MDExNywgMHgwOTA0LCAweDQ4YzgsCisJMHg5MGJlLCAweDAxMWEsIDB4MDkwNCwgMHg0OGM4LCAweDkwYmUsIDB4MDExYywgMHgwOTA0LCAweDQ4YzgsCisJMHg5MGJlLCAweDAxMjEsIDB4MDkwNCwgMHg0OGFmLCAweDkwYmUsIDB4MDEzMSwgMHgwOTA0LCAweDQ4YWYsCisJMHg5MGJlLCAweDAxNzEsIDB4MDkwNCwgMHg0OGM4LCAweDkwYmUsIDB4MDE3MywgMHgwOTA0LCAweDQ4YzgsCisJMHg5MGJlLCAweDAxYTEsIDB4MTEyOCwgMHhhODk0LCAweDgwMDcsIDB4YTg5NiwgMHgwODA0LCAweDQ4ZDMsCisJMHg5MGJlLCAweDAyMTIsIDB4MDkwNCwgMHg0OGJjLCAweDkwYmUsIDB4MDIxMywgMHgwNWU4LCAweDkwYmUsCisJMHgwMjE0LCAweDA1MDAsIDB4OTBiZSwgMHgwMjE3LCAweDAxODgsIDB4OTBiZSwgMHgwMjFhLCAweDExMjAsCisJMHhhODljLCAweDgwMDcsIDB4YTg5ZSwgMHgwNGUwLCAweDkwYmUsIDB4MDIxZiwgMHgwNWM4LCAweDkwYmUsCisJMHgwMzAwLCAweDA1YjAsIDB4MDA5ZSwgMHgwMGRlLCAweDA4MDQsIDB4MzViOCwgMHg3MDI4LCAweDkwODAsCisJMHgwMDEwLCAweDIwOTgsIDB4MjBhMCwgMHg3MDM0LCAweDIwZTAsIDB4MjBlOCwgMHgyMGE5LCAweDAwMDcsCisJMHgwODBjLCAweDQ5MTEsIDB4NzAyOCwgMHg5MDgwLCAweDAwMGUsIDB4MjA5OCwgMHgyMGEwLCAweDcwMzQsCisJMHgyMGUwLCAweDIwZTgsIDB4MjBhOSwgMHgwMDAxLCAweDA4MGMsIDB4NDkxMSwgMHgwMGM4LCAweDcwMjgsCisJMHg5MDgwLCAweDAwMGMsIDB4MjA5OCwgMHgyMGEwLCAweDcwMzQsIDB4MjBlMCwgMHgyMGU4LCAweDIwYTksCisJMHgwMDAxLCAweDA4MGMsIDB4NDkxZSwgMHgwMGI4LCAweDcwMjgsIDB4OTA4MCwgMHgwMDBlLCAweDIwOTgsCisJMHgyMGEwLCAweDcwMzQsIDB4MjBlMCwgMHgyMGU4LCAweDIwYTksIDB4MDAwMSwgMHgwODBjLCAweDQ5MWUsCisJMHg3MDI4LCAweDkwODAsIDB4MDAwYywgMHgyMDk4LCAweDIwYTAsIDB4NzAzNCwgMHgyMGUwLCAweDIwZTgsCisJMHgyMGE5LCAweDAwMDEsIDB4MDRmMSwgMHgwMGM2LCAweDA4MGMsIDB4NGIxZiwgMHgwNTUwLCAweGE4NjgsCisJMHhjMGZkLCAweGE4NmEsIDB4YTg2NywgMHgwMTE5LCAweDkwMDYsIDB4YTg4MiwgMHhhODdmLCAweDAwMjAsCisJMHhhODhiLCAweDAwMDEsIDB4ODEwYiwgMHhhOWFlLCAweGE4YjIsIDB4YWFiNiwgMHhhYmJhLCAweGFjYmUsCisJMHhhZGMyLCAweGE5YzYsIDB4YThjYSwgMHgwMGNlLCAweDAwOWUsIDB4MDBkZSwgMHhhODY2LCAweGE4MjIsCisJMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHhhODA0LCAweDIwNDgsIDB4MDgwYywgMHhjZTEyLCAweDExMjAsCisJMHgyMDA5LCAweDAwMDMsIDB4MDgwNCwgMHgzNWI1LCAweDcwMDcsIDB4MDAwMywgMHg3MDFmLCAweDQ5MDgsCisJMHgwMDA1LCAweDAwY2UsIDB4MDA5ZSwgMHgwMGRlLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDM1YjUsCisJMHhhODIwLCAweDkwODYsIDB4ODAwMSwgMHgxOTA0LCAweDM1ODMsIDB4MjAwOSwgMHgwMDA0LCAweDA4MDQsCisJMHgzNWI1LCAweDAwMTYsIDB4MDAyNiwgMHgzNTEwLCAweDIwYTksIDB4MDAwMiwgMHg0MDAyLCAweDQxMDQsCisJMHg0MDA0LCAweDgyMTEsIDB4MWRjOCwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsCisJMHgwMDM2LCAweDAwNDYsIDB4MzUyMCwgMHgyMGE5LCAweDAwMDQsIDB4NDAwMiwgMHg0MzA0LCAweDQyMDQsCisJMHg0MTA0LCAweDQwMDQsIDB4ODQyMSwgMHgxZGI4LCAweDAwNGUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMDA1LCAweDgxZmYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwNCwgMHgzNWI1LCAweDYwZGMsCisJMHhkMGFjLCAweDExMzAsIDB4ZDA5YywgMHgxMTIwLCAweDIwMDksIDB4MDAwNSwgMHgwODA0LCAweDM1YjUsCisJMHg3OTg0LCAweDc4YTgsIDB4MjA0MCwgMHgwODBjLCAweGFlYWQsIDB4MTEyMCwgMHg5MTgyLCAweDAwN2YsCisJMHgwYTA0LCAweDM1YjgsIDB4OTE4NiwgMHgwMGZmLCAweDA5MDQsIDB4MzViOCwgMHg5MTgyLCAweDA4MDAsCisJMHgxYTA0LCAweDM1YjgsIDB4N2E4YywgMHg3Yjg4LCAweDYwN2MsIDB4OTMwNiwgMHgxMTU4LCAweDYwODAsCisJMHg5MjRlLCAweDA5MDQsIDB4MzViOCwgMHgwODBjLCAweGFlYWQsIDB4MTEyMCwgMHg5OWNjLCAweGZmMDAsCisJMHgwOTA0LCAweDM1YjgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg0YTMyLCAweDA5MDQsCisJMHg0OWIyLCAweDAwODYsIDB4OTBjNiwgMHg0MDAwLCAweDAwOGUsIDB4MTUzOCwgMHgwMGM2LCAweDAwMDYsCisJMHgwMDM2LCAweGI4MTgsIDB4YmIxYywgMHg5MzA1LCAweGJiMjAsIDB4OTMwNSwgMHhiYjI0LCAweDkzMDUsCisJMHhiYjI4LCAweDkzMDUsIDB4YmIyYywgMHg5MzA1LCAweGJiMzAsIDB4OTMwNSwgMHhiYjM0LCAweDkzMDUsCisJMHgwMDNlLCAweDA1NzAsIDB4ZDg4YywgMHgxMTI4LCAweDA4MGMsIDB4NmEwYywgMHgwMTEwLCAweGM4OWQsCisJMHgwNDM4LCAweDkwMGUsIDB4MDgwYywgMHg2OGI5LCAweDExMDgsIDB4YzE4NSwgMHhiODAwLCAweGQwYmMsCisJMHgwMTA4LCAweGMxOGQsIDB4MDAwZSwgMHgwMGNlLCAweDAwYjgsIDB4OTBjNiwgMHg0MDA3LCAweDExMTAsCisJMHgyNDA4LCAweDAwOTAsIDB4OTBjNiwgMHg0MDA4LCAweDExMTgsIDB4MjcwOCwgMHgyNjEwLCAweDAwNjAsCisJMHg5MGM2LCAweDQwMDksIDB4MTEwOCwgMHgwMDQwLCAweDkwYzYsIDB4NDAwNiwgMHgxMTA4LCAweDAwMjAsCisJMHgyMDAxLCAweDQwMDUsIDB4MjAwOSwgMHgwMDBhLCAweDIwMjAsIDB4MDEyZSwgMHgwODA0LCAweDM1ODUsCisJMHgwMDBlLCAweDAwY2UsIDB4MmIwMCwgMHg3MDI2LCAweDAwMTYsIDB4MDBiNiwgMHgwMGM2LCAweDAwZTYsCisJMHgyYzcwLCAweDA4MGMsIDB4YWY5MSwgMHgwOTA0LCAweDRhMDcsIDB4MmIwMCwgMHg2MDEyLCAweDA4MGMsCisJMHhkMTAyLCAweDJlNTgsIDB4MDBlZSwgMHgwMGU2LCAweDAwYzYsIDB4MDgwYywgMHg0YjFmLCAweDAwY2UsCisJMHgyYjcwLCAweDExNTgsIDB4MDgwYywgMHhhZjQzLCAweDAwZWUsIDB4MDBjZSwgMHgwMGJlLCAweDAwMWUsCisJMHgwMTJlLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDM1YjUsIDB4OTAwZSwgMHhhOTY2LCAweGE5NmEsCisJMHgyOTAwLCAweDYwMTYsIDB4YTkzMiwgMHhhODY4LCAweGMwZmQsIDB4ZDg4YywgMHgwMTA4LCAweGMwZjUsCisJMHhhODZhLCAweGQ4OWMsIDB4MTExMCwgMHgwODBjLCAweDMyMWUsIDB4NjAyMywgMHgwMDAxLCAweDkwMDYsCisJMHgwODBjLCAweDY1ZDUsIDB4ZDg5YywgMHgwMTM4LCAweDIwMDEsIDB4MDAwNCwgMHgwODBjLCAweDY1ZTksCisJMHgyMDA5LCAweDAwMDMsIDB4MDAzMCwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg2NWU5LCAweDIwMDksCisJMHgwMDAyLCAweDA4MGMsIDB4YWZiZSwgMHg3OGE4LCAweGQwOTQsIDB4MDEzOCwgMHgwMGVlLCAweDcwMjQsCisJMHgwMGU2LCAweDIwNTgsIDB4YjhjYywgMHhjMDhkLCAweGI4Y2UsIDB4OTA4NSwgMHgwMDAxLCAweDAwZWUsCisJMHgwMGNlLCAweDAwYmUsIDB4MDAxZSwgMHgwMTJlLCAweDExMjAsIDB4MjAwOSwgMHgwMDAzLCAweDA4MDQsCisJMHgzNWI1LCAweDcwMDcsIDB4MDAwMywgMHg3MDFmLCAweDRhMTYsIDB4MDAwNSwgMHhhODMwLCAweDkwODYsCisJMHgwMTAwLCAweDcwMjQsIDB4MjA1OCwgMHgxMTM4LCAweDIwMDksIDB4MDAwNCwgMHhiYTA0LCAweDkyOTQsCisJMHgwMGZmLCAweDA4MDQsIDB4NTZiMSwgMHg5MDBlLCAweGE4NjgsIDB4ZDBmNCwgMHgxOTA0LCAweDM1ODMsCisJMHgwODBjLCAweDY4YjksIDB4MTEwOCwgMHhjMTg1LCAweGI4MDAsIDB4ZDBiYywgMHgwMTA4LCAweGMxOGQsCisJMHgwODA0LCAweDM1ODMsIDB4MDBlNiwgMHgwMGQ2LCAweDAwOTYsIDB4ODNmZiwgMHgwOTA0LCAweDRhODEsCisJMHg5MDJlLCAweDA4MGMsIDB4YWVhZCwgMHgwMTMwLCAweDkwMjYsIDB4MjBhOSwgMHgwODAwLCAweDIwNzEsCisJMHgxMDAwLCAweDAwMzAsIDB4MjAyMSwgMHgwMDdmLCAweDIwYTksIDB4MDc4MSwgMHgyMDcxLCAweDEwN2YsCisJMHgyZTA0LCAweDkwMDUsIDB4MTFiOCwgMHgyMTAwLCAweDk0MDYsIDB4MTkwNCwgMHg0YTkyLCAweDI0MjgsCisJMHg5NGNlLCAweDAwN2YsIDB4MTEyMCwgMHg5MmNlLCAweGZmZmQsIDB4MTU1OCwgMHgwMDMwLCAweDk0Y2UsCisJMHgwMDgwLCAweDExMzAsIDB4OTJjZSwgMHhmZmZjLCAweDE1MjAsIDB4OTNjZSwgMHgwMGZmLCAweDE1MDgsCisJMHhjNWZkLCAweDA0ODAsIDB4MjA1OCwgMHhiZjEwLCAweDI3MDAsIDB4OTMwNiwgMHgxMWU4LCAweGJlMTQsCisJMHgyNjAwLCAweDkyMDYsIDB4MTFjOCwgMHgyNDAwLCAweDkxMDYsIDB4MTE4MCwgMHhkODg0LCAweDA1OTgsCisJMHhkODk0LCAweDE1ODgsIDB4MDgwYywgMHg2OWFjLCAweDE1NzAsIDB4MjAwMSwgMHg0MDAwLCAweDA0NjAsCisJMHgwODBjLCAweDZhMGMsIDB4MTU0MCwgMHgyMDAxLCAweDQwMDAsIDB4MDQzMCwgMHgyMDAxLCAweDQwMDcsCisJMHgwNDE4LCAweDIwMDEsIDB4NDAwNiwgMHgwNDAwLCAweDI0MDAsIDB4OTEwNiwgMHgxMTU4LCAweGJlMTQsCisJMHg4N2ZmLCAweDExMjgsIDB4ODZmZiwgMHgwOTE4LCAweDA4MGMsIDB4YWVhZCwgMHgxOTAwLCAweDIwMDEsCisJMHg0MDA4LCAweDAwOTAsIDB4ODQyMCwgMHg4ZTcwLCAweDFmMDQsIDB4NGE0OCwgMHg4NWZmLCAweDExMzAsCisJMHgyMDAxLCAweDQwMDksIDB4MDA0OCwgMHgyMDAxLCAweDAwMDEsIDB4MDAzMCwgMHgwODBjLCAweDY2MzgsCisJMHgxZGQwLCAweGJiMTIsIDB4YmExNiwgMHg5MDA2LCAweDkwMDUsIDB4MDA5ZSwgMHgwMGRlLCAweDAwZWUsCisJMHgwMDA1LCAweDgxZmYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwNCwgMHgzNWI1LCAweDA4MGMsCisJMHg0YjFmLCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzViNSwgMHhhODY3LCAweDAwMDAsCisJMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHg3ODg0LCAweDkwMDUsIDB4MDkwNCwgMHgzNWI4LCAweDkwOTYsCisJMHgwMGZmLCAweDAxMjAsIDB4OTA5MiwgMHgwMDA0LCAweDFhMDQsIDB4MzViOCwgMHgyMDEwLCAweDI5MTgsCisJMHgwODBjLCAweDMxYzQsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDMsIDB4MDgwNCwgMHgzNWI1LCAweDcwMDcsCisJMHgwMDAzLCAweDcwMWYsIDB4NGFkNCwgMHgwMDA1LCAweGE4MzAsIDB4OTA4NiwgMHgwMTAwLCAweDE5MDQsCisJMHgzNTgzLCAweDIwMDksIDB4MDAwNCwgMHgwODA0LCAweDM1YjUsIDB4Nzk4NCwgMHgwODBjLCAweGFlYWQsCisJMHgxMTIwLCAweDkxODIsIDB4MDA3ZiwgMHgwYTA0LCAweDM1YjgsIDB4OTE4NiwgMHgwMGZmLCAweDA5MDQsCisJMHgzNWI4LCAweDkxODIsIDB4MDgwMCwgMHgxYTA0LCAweDM1YjgsIDB4MjAwMSwgMHg5NDAwLCAweDA4MGMsCisJMHg1NzBjLCAweDE5MDQsIDB4MzViNSwgMHgwODA0LCAweDM1ODMsIDB4YTk5OCwgMHgwODBjLCAweGFlYWQsCisJMHgxMTE4LCAweDkxODIsIDB4MDA3ZiwgMHgwMjgwLCAweDkxODYsIDB4MDBmZiwgMHgwMTY4LCAweDkxODIsCisJMHgwODAwLCAweDEyNTAsIDB4MjAwMSwgMHg5NDAwLCAweDA4MGMsIDB4NTcwYywgMHgxMWE4LCAweDAwNjAsCisJMHhhODk3LCAweDQwMDUsIDB4YTk5YSwgMHgwMDEwLCAweGE4OTcsIDB4NDAwNiwgMHg5MDBlLCAweDkwODUsCisJMHgwMDAxLCAweDIwMDEsIDB4MDAzMCwgMHgwMDA1LCAweGE4OTcsIDB4NDAwMCwgMHg5MDBlLCAweDkwODUsCisJMHgwMDAxLCAweDIwMDEsIDB4MDAwMCwgMHgwMDA1LCAweDIwMDksIDB4MDAwYSwgMHgwYzQ4LCAweDA4MGMsCisJMHgwZmZmLCAweDAxOTgsIDB4OTAwNiwgMHhhODAyLCAweDcwMTQsIDB4OTAwNSwgMHgxMTIwLCAweDI5MDAsCisJMHg3MDE2LCAweDcwMWEsIDB4MDA0MCwgMHg3MDE4LCAweGE4MDIsIDB4MDA4NiwgMHgyMDQwLCAweDI5MDAsCisJMHhhMDA2LCAweDcwMWEsIDB4MDA4ZSwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHg3OTg0LCAweDA4MGMsCisJMHg2Njk5LCAweDExMzAsIDB4N2U4OCwgMHg5Njg0LCAweDNmZmYsIDB4OTA4MiwgMHg0MDAwLCAweDAyMDgsCisJMHg5MDVlLCAweDhiZmYsIDB4MDAwNSwgMHhhOTk4LCAweDA4MGMsIDB4NjY5OSwgMHgxMTMwLCAweGFlOWMsCisJMHg5Njg0LCAweDNmZmYsIDB4OTA4MiwgMHg0MDAwLCAweDAyMDgsIDB4OTA1ZSwgMHg4YmZmLCAweDAwMDUsCisJMHhhZTk4LCAweDAwMDgsIDB4N2U4NCwgMHgyNjA4LCAweDA4MGMsIDB4NjY5OSwgMHgxMTA4LCAweDAwMDgsCisJMHg5MDVlLCAweDhiZmYsIDB4MDAwNSwgMHgwMDE2LCAweDcxMTQsIDB4ODFmZiwgMHgwMTI4LCAweDIxNDgsCisJMHhhOTA0LCAweDA4MGMsIDB4MTAzMSwgMHgwY2M4LCAweDcxMTYsIDB4NzExYSwgMHgwMDFlLCAweDAwMDUsCisJMHgyMDMxLCAweDAwMDEsIDB4MDAxMCwgMHgyMDMxLCAweDAwMDAsIDB4MjA2MSwgMHgxOGI4LCAweDJjNDQsCisJMHhhNjZhLCAweGExN2EsIDB4YTc3MiwgMHhhMDc2LCAweGEyOGUsIDB4YTM5MiwgMHhhNDk2LCAweGE1OWEsCisJMHgwODBjLCAweDEwZTksIDB4NzAwNywgMHgwMDAyLCAweDcwMWYsIDB4MzU4MywgMHgwMDA1LCAweDAwZjYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDc5LCAweDAwMDAsIDB4MjAwMSwgMHgxOGIwLCAweDIwMDQsCisJMHg5MDA1LCAweDExOTAsIDB4MGUwNCwgMHg0YjljLCAweDdhMzYsIDB4NzgzMywgMHgwMDEyLCAweDdhODIsCisJMHg3Yjg2LCAweDdjOGEsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsCisJMHgxOTBjLCAweDExOWIsIDB4MDgwNCwgMHg0YzAyLCAweDAwMTYsIDB4MDA4NiwgMHgwMDk2LCAweDAwYzYsCisJMHgwMGU2LCAweDIwNzEsIDB4MTg5ZSwgMHg3MDQ0LCAweDkwMDUsIDB4MTU0MCwgMHg3MTQ4LCAweDkxODIsCisJMHgwMDEwLCAweDAyODgsIDB4NzAzOCwgMHgyMDYwLCAweDA4MGMsIDB4MGZmZiwgMHgwOTA0LCAweDRiZmEsCisJMHhhODRiLCAweDAwMDAsIDB4MjkwMCwgMHg3MDQ2LCAweDIwMDEsIDB4MDAwMiwgMHg5MDgwLCAweDIwY2UsCisJMHgyMDA1LCAweGE4NDYsIDB4MDA5OCwgMHg3MDM4LCAweDkwZTAsIDB4MDAwNCwgMHgyMDAxLCAweDE4YmEsCisJMHg5YzgyLCAweDE4ZmEsIDB4MDIxMCwgMHgyMDYxLCAweDE4YmEsIDB4MmMwMCwgMHg3MDNhLCAweDcxNDgsCisJMHg4MWZmLCAweDExMDgsIDB4NzAzZSwgMHg4MTA4LCAweDcxNGEsIDB4MDQ2MCwgMHg3MTQ4LCAweDgxMDgsCisJMHg3MTRhLCAweDcwNDQsIDB4MjA0MCwgMHhhMTQ0LCAweDIxMDUsIDB4MDAxNiwgMHg5MDhhLCAweDAwMzYsCisJMHgxYTBjLCAweDBkZDUsIDB4MjA2MCwgMHgwMDFlLCAweDgxMDgsIDB4MjEwNSwgMHg5MDA1LCAweGExNDYsCisJMHgxNTIwLCAweDA4MGMsIDB4MGZmZiwgMHgxMTMwLCAweDgxMDksIDB4YTk0NiwgMHg3MTQ4LCAweDgxMDksCisJMHg3MTRhLCAweDAwZDgsIDB4OTAwNiwgMHhhODA2LCAweGE4NGEsIDB4YTA0NiwgMHgyODAwLCAweGE4MDIsCisJMHgyOTAwLCAweGEwMDYsIDB4NzA0NiwgMHgyMDAxLCAweDAwMDIsIDB4OTA4MCwgMHgyMGNlLCAweDIwMDUsCisJMHhhODQ2LCAweDAwNTgsIDB4MjI2MiwgMHg2MzA2LCAweDY0MGEsIDB4MDBlZSwgMHgwMGNlLCAweDAwOWUsCisJMHgwMDhlLCAweDAwMWUsIDB4MDEyZSwgMHgwMGZlLCAweDAwMDUsIDB4MmMwMCwgMHg5MDgyLCAweDAwMWIsCisJMHgwMDAyLCAweDRjMjQsIDB4NGMyNCwgMHg0YzI2LCAweDRjMjQsIDB4NGMyNCwgMHg0YzI0LCAweDRjMmEsCisJMHg0YzI0LCAweDRjMjQsIDB4NGMyNCwgMHg0YzJlLCAweDRjMjQsIDB4NGMyNCwgMHg0YzI0LCAweDRjMzIsCisJMHg0YzI0LCAweDRjMjQsIDB4NGMyNCwgMHg0YzM2LCAweDRjMjQsIDB4NGMyNCwgMHg0YzI0LCAweDRjM2EsCisJMHg0YzI0LCAweDRjMjQsIDB4NGMyNCwgMHg0YzNmLCAweDA4MGMsIDB4MGRkNSwgMHhhMjc2LCAweGEzN2EsCisJMHhhNDdlLCAweDA4OTgsIDB4YTI4NiwgMHhhMzhhLCAweGE0OGUsIDB4MDg3OCwgMHhhMjk2LCAweGEzOWEsCisJMHhhNDllLCAweDA4NTgsIDB4YTJhNiwgMHhhM2FhLCAweGE0YWUsIDB4MDgzOCwgMHhhMmI2LCAweGEzYmEsCisJMHhhNGJlLCAweDA4MTgsIDB4YTJjNiwgMHhhM2NhLCAweGE0Y2UsIDB4MDgwNCwgMHg0YmZkLCAweGEyZDYsCisJMHhhM2RhLCAweGE0ZGUsIDB4MDgwNCwgMHg0YmZkLCAweDAwZTYsIDB4MjA3MSwgMHgxODllLCAweDcwNDgsCisJMHg5MDA1LCAweDA5MDQsIDB4NGNkNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwZTA0LCAweDRjZDUsCisJMHgwMGY2LCAweDIwNzksIDB4MDAwMCwgMHgwMGM2LCAweDAwOTYsIDB4MDA4NiwgMHgwMDc2LCAweDkwMDYsCisJMHgyMDM4LCAweDcwNDAsIDB4MjA0OCwgMHg5MDA1LCAweDA1MDAsIDB4YTk0OCwgMHgyMTA1LCAweDAwMTYsCisJMHg5MDhhLCAweDAwMzYsIDB4MWEwYywgMHgwZGQ1LCAweDIwNjAsIDB4MDAxZSwgMHg4MTA4LCAweDIxMDUsCisJMHg5MDA1LCAweGE5NGEsIDB4MTkwNCwgMHg0Y2Q4LCAweGE4MDQsIDB4OTAwNSwgMHgwOTBjLCAweDBkZDUsCisJMHg3MDQyLCAweDI5MzgsIDB4MjA0MCwgMHhhMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgwMDAyLCAweDkwODAsCisJMHgyMGNlLCAweDIwMDUsIDB4YTA0YSwgMHgwODA0LCAweDRjZDgsIDB4NzAzYywgMHgyMDYwLCAweDJjMTQsCisJMHg2MzA0LCAweDY0MDgsIDB4NjUwYywgMHgyMjAwLCAweDc4MzYsIDB4NzgzMywgMHgwMDEyLCAweDc4ODIsCisJMHgyMzAwLCAweDc4ODYsIDB4MjQwMCwgMHg3ODhhLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwODksCisJMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMTliLCAweDg3ZmYsIDB4MDExOCwgMHgyNzQ4LCAweDA4MGMsCisJMHgxMDMxLCAweDcwNDgsIDB4ODAwMSwgMHg3MDRhLCAweDkwMDUsIDB4MTE3MCwgMHg3MDQwLCAweDIwNDgsCisJMHg5MDA1LCAweDAxMjgsIDB4MDgwYywgMHgxMDMxLCAweDkwMDYsIDB4NzA0MiwgMHg3MDQ2LCAweDcwM2IsCisJMHgxOGJhLCAweDcwM2YsIDB4MThiYSwgMHgwNDIwLCAweDcwNDAsIDB4OTAwNSwgMHgxNTA4LCAweDcyMzgsCisJMHgyYzAwLCAweDkyMDYsIDB4MDE0OCwgMHg5YzgwLCAweDAwMDQsIDB4OTBmYSwgMHgxOGZhLCAweDAyMTAsCisJMHgyMDAxLCAweDE4YmEsIDB4NzAzZSwgMHgwMGEwLCAweDkwMDYsIDB4NzAzZSwgMHg3MDNhLCAweDcwNDQsCisJMHg5MDA1LCAweDA5MGMsIDB4MGRkNSwgMHgyMDQ4LCAweGE4MDAsIDB4OTAwNSwgMHgxZGUwLCAweDI5MDAsCisJMHg3MDQyLCAweDIwMDEsIDB4MDAwMiwgMHg5MDgwLCAweDIwY2UsIDB4MjAwNSwgMHhhODRhLCAweDAwMDAsCisJMHgwMDdlLCAweDAwOGUsIDB4MDA5ZSwgMHgwMGNlLCAweDAwZmUsIDB4MDEyZSwgMHgwMGVlLCAweDAwMDUsCisJMHgyYzAwLCAweDkwODIsIDB4MDAxYiwgMHgwMDAyLCAweDRjZjcsIDB4NGNmNywgMHg0Y2Y5LCAweDRjZjcsCisJMHg0Y2Y3LCAweDRjZjcsIDB4NGNmZSwgMHg0Y2Y3LCAweDRjZjcsIDB4NGNmNywgMHg0ZDAzLCAweDRjZjcsCisJMHg0Y2Y3LCAweDRjZjcsIDB4NGQwOCwgMHg0Y2Y3LCAweDRjZjcsIDB4NGNmNywgMHg0ZDBkLCAweDRjZjcsCisJMHg0Y2Y3LCAweDRjZjcsIDB4NGQxMiwgMHg0Y2Y3LCAweDRjZjcsIDB4NGNmNywgMHg0ZDE3LCAweDA4MGMsCisJMHgwZGQ1LCAweGFhNzQsIDB4YWI3OCwgMHhhYzdjLCAweDA4MDQsIDB4NGM4MywgMHhhYTg0LCAweGFiODgsCisJMHhhYzhjLCAweDA4MDQsIDB4NGM4MywgMHhhYTk0LCAweGFiOTgsIDB4YWM5YywgMHgwODA0LCAweDRjODMsCisJMHhhYWE0LCAweGFiYTgsIDB4YWNhYywgMHgwODA0LCAweDRjODMsIDB4YWFiNCwgMHhhYmI4LCAweGFjYmMsCisJMHgwODA0LCAweDRjODMsIDB4YWFjNCwgMHhhYmM4LCAweGFjY2MsIDB4MDgwNCwgMHg0YzgzLCAweGFhZDQsCisJMHhhYmQ4LCAweGFjZGMsIDB4MDgwNCwgMHg0YzgzLCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYjYsCisJMHgwMGM2LCAweDIwMDksIDB4MDA3ZSwgMHgwODBjLCAweDY2OTksIDB4MjAxOSwgMHgwMDAxLCAweGI4NWMsCisJMHhkMGFjLCAweDAxMTAsIDB4MjAxOSwgMHgwMDAwLCAweDIwMTEsIDB4ODAxYiwgMHgwODBjLCAweDRiN2YsCisJMHgwMGNlLCAweDAwYmUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMDI2LCAweDA4MGMsCisJMHg1NzVkLCAweGQwYzQsIDB4MDEyMCwgMHgyMDExLCAweDgwMTQsIDB4MDgwYywgMHg0YjdmLCAweDAwMmUsCisJMHgwMDA1LCAweDgxZmYsIDB4MTkwNCwgMHgzNWI1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYwMzAsCisJMHhjMDhkLCAweGMwODUsIDB4YzBhYywgMHg2MDMyLCAweDA4MGMsIDB4NzQzZSwgMHgxMTU4LCAweDA4MGMsCisJMHg3NzI0LCAweDA4MGMsIDB4NjBhZCwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywgMHg3NDg1LCAweDA4MGMsCisJMHg3MzZhLCAweDAwMTAsIDB4MDgwYywgMHg1ZjZjLCAweDAxMmUsIDB4MDgwNCwgMHgzNTgzLCAweDgxZmYsCisJMHgwMTIwLCAweDIwMDksIDB4MDAwMSwgMHgwODA0LCAweDM1YjUsIDB4MDgwYywgMHg1NzcxLCAweDAxMjAsCisJMHgyMDA5LCAweDAwMDcsIDB4MDgwNCwgMHgzNWI1LCAweDA4MGMsIDB4NmEwNCwgMHgwMTIwLCAweDIwMDksCisJMHgwMDA4LCAweDA4MDQsIDB4MzViNSwgMHg3OTg0LCAweDA4MGMsIDB4NjYzOCwgMHgxOTA0LCAweDM1YjgsCisJMHgwODBjLCAweDRiNTIsIDB4MDkwNCwgMHgzNWI4LCAweDJiMDAsIDB4NzAyNiwgMHgwODBjLCAweDZhMGMsCisJMHg3ODg4LCAweDExNzAsIDB4OTA4NCwgMHgwMDA1LCAweDExNTgsIDB4OTAwZSwgMHgwODBjLCAweDY4YjksCisJMHgxMTA4LCAweGMxODUsIDB4YjgwMCwgMHhkMGJjLCAweDAxMDgsIDB4YzE4ZCwgMHgwODA0LCAweDM1ODMsCisJMHgwODBjLCAweDRiMWYsIDB4MDkwNCwgMHgzNWI1LCAweDkwMDYsIDB4YTg2NiwgMHhhODMyLCAweGE4NjgsCisJMHhjMGZkLCAweGE4NmEsIDB4MDgwYywgMHhjZWIwLCAweDA5MDQsIDB4MzViNSwgMHg3ODg4LCAweGQwOTQsCisJMHgwMTE4LCAweGI4Y2MsIDB4YzA4ZCwgMHhiOGNlLCAweDcwMDcsIDB4MDAwMywgMHg3MDFmLCAweDRkZjIsCisJMHgwMDA1LCAweDIwNjEsIDB4MTgwMCwgMHgwODBjLCAweDU3NzEsIDB4MjAwOSwgMHgwMDA3LCAweDE1NjAsCisJMHgwODBjLCAweDZhMDQsIDB4MDExOCwgMHgyMDA5LCAweDAwMDgsIDB4MDQzMCwgMHhhOTk4LCAweDA4MGMsCisJMHg2NjM4LCAweDE1MzAsIDB4MDgwYywgMHg0YjUwLCAweDA1MTgsIDB4MDgwYywgMHg2YTBjLCAweGE4OWMsCisJMHgxMTY4LCAweDkwODQsIDB4MDAwNSwgMHgxMTUwLCAweDkwMGUsIDB4MDgwYywgMHg2OGI5LCAweDExMDgsCisJMHhjMTg1LCAweGI4MDAsIDB4ZDBiYywgMHgwMTA4LCAweGMxOGQsIDB4MDBkMCwgMHhhODY4LCAweGMwZmMsCisJMHhhODZhLCAweDA4MGMsIDB4Y2ViMCwgMHgxMWUwLCAweGE4OWMsIDB4ZDA5NCwgMHgwMTE4LCAweGI4Y2MsCisJMHhjMDhkLCAweGI4Y2UsIDB4MjAwOSwgMHgwMDAzLCAweGE4OTcsIDB4NDAwNSwgMHhhOTlhLCAweDAwMTAsCisJMHhhODk3LCAweDQwMDYsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwgMHgwMDMwLCAweDAwMDUsCisJMHhhODk3LCAweDQwMDAsIDB4YTk5YSwgMHg5MDA2LCAweDkxOGQsIDB4MDAwMSwgMHgyMDA4LCAweDAwMDUsCisJMHg5MDA2LCAweDAwMDUsIDB4YTgzMCwgMHg5MDg2LCAweDAxMDAsIDB4NzAyNCwgMHgyMDU4LCAweDExMTAsCisJMHgwODA0LCAweDU2YjEsIDB4OTAwZSwgMHgwODBjLCAweDY4YjksIDB4MTEwOCwgMHhjMTg1LCAweGI4MDAsCisJMHhkMGJjLCAweDAxMDgsIDB4YzE4ZCwgMHgwODA0LCAweDM1ODMsIDB4MDgwYywgMHg1NzcxLCAweDAxMjAsCisJMHgyMDA5LCAweDAwMDcsIDB4MDgwNCwgMHgzNWI1LCAweDdmODQsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsCisJMHg3ZDk4LCAweDA4MGMsIDB4NGIxZiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDM1YjUsCisJMHg5MDBlLCAweDIxMzAsIDB4NzEyNiwgMHg3MTMyLCAweGE4NjAsIDB4MjBlOCwgMHg3MDM2LCAweGE4NWMsCisJMHg5MDgwLCAweDAwMDUsIDB4NzAyYSwgMHgyMGEwLCAweDA4MGMsIDB4NjY5OSwgMHgxOTA0LCAweDRlOTQsCisJMHgwODBjLCAweDZhMGMsIDB4MDEzOCwgMHgwODBjLCAweDZhMTQsIDB4MDEyMCwgMHgwODBjLCAweDY5YWMsCisJMHgxOTA0LCAweDRlOTQsIDB4ZDc5NCwgMHgxMTEwLCAweGQ3ODQsIDB4MDFhOCwgMHhiOGM0LCAweDIwZTAsCisJMHhiOGM4LCAweDkwODAsIDB4MDAwNiwgMHgyMDk4LCAweDM0MDAsIDB4ZDc5NCwgMHgwMTYwLCAweDIwYTksCisJMHgwMDA4LCAweDQwMDMsIDB4MjA5OCwgMHgyMGEwLCAweDNkMDAsIDB4MjBlMCwgMHgyMGE5LCAweDAwMDIsCisJMHgwODBjLCAweDQ5MWUsIDB4MDA0OCwgMHgyMGE5LCAweDAwMDQsIDB4NDAwMywgMHgyMDk4LCAweDIwYTAsCisJMHgzZDAwLCAweDIwZTAsIDB4MDgwYywgMHg0OTFlLCAweDkxODYsIDB4MDA3ZSwgMHgwMTcwLCAweDkxODYsCisJMHgwMDgwLCAweDAxNTgsIDB4MDgwYywgMHg2YTBjLCAweDkwYzIsIDB4MDAwNiwgMHgxMjEwLCAweGMxZmQsCisJMHgwMDIwLCAweDA4MGMsIDB4NjhiOSwgMHgxMTA4LCAweGMxZmQsIDB4NDEwNCwgMHhjMWZjLCAweGQ3OTQsCisJMHgwNTI4LCAweGI4YzQsIDB4MjBlMCwgMHhiOGM4LCAweDIwNjAsIDB4OWM4MCwgMHgwMDAwLCAweDIwOTgsCisJMHgyMGE5LCAweDAwMDIsIDB4NDAwMywgMHg5YzgwLCAweDAwMDMsIDB4MjA5OCwgMHgyMGE5LCAweDAwMDEsCisJMHg0MDA1LCAweDljODAsIDB4MDAwNCwgMHgyMDk4LCAweDM0MDAsIDB4MjBhOSwgMHgwMDAyLCAweDQwMDMsCisJMHgyMDk4LCAweDIwYTAsIDB4M2QwMCwgMHgyMGUwLCAweDA4MGMsIDB4NDkxMSwgMHg5YzgwLCAweDAwMjYsCisJMHgyMDk4LCAweGI4YzQsIDB4MjBlMCwgMHgyMGE5LCAweDAwMDIsIDB4NDAwMywgMHhkNzk0LCAweDAxMTAsCisJMHg5NmIwLCAweDAwMGIsIDB4OTZiMCwgMHgwMDA1LCAweDgxMDgsIDB4MDgwYywgMHhhZWFkLCAweDAxMTgsCisJMHg5MTg2LCAweDA4MDAsIDB4MDA0MCwgMHhkNzhjLCAweDAxMjAsIDB4OTE4NiwgMHgwODAwLCAweDAxNzAsCisJMHgwMDE4LCAweDkxODYsIDB4MDA3ZSwgMHgwMTUwLCAweGQ3OTQsIDB4MDExOCwgMHg5Njg2LCAweDAwMjAsCisJMHgwMDEwLCAweDk2ODYsIDB4MDAyOCwgMHgwMTUwLCAweDA4MDQsIDB4NGUyNCwgMHg4NmZmLCAweDExMjAsCisJMHg3MTI0LCAweDgxMGIsIDB4MDgwNCwgMHgzNTgzLCAweDcwMzMsIDB4MDAwMSwgMHg3MTIyLCAweDcwMjQsCisJMHg5NjAwLCAweDcwMjYsIDB4NzcyZSwgMHgyMDYxLCAweDE4YjgsIDB4MmM0NCwgMHhhMDZiLCAweDAwMDAsCisJMHhhNjdhLCAweDcwMzQsIDB4YTA3MiwgMHg3MDI4LCAweGEwNzYsIDB4YTI4ZSwgMHhhMzkyLCAweGE0OTYsCisJMHhhNTlhLCAweDA4MGMsIDB4MTBlOSwgMHg3MDA3LCAweDAwMDIsIDB4NzAxZiwgMHg0ZWQwLCAweDAwMDUsCisJMHg3MDMwLCAweDkwMDUsIDB4MTE4MCwgMHg3MTIwLCAweDcwMjgsIDB4MjBhMCwgMHg3NzJjLCAweDkwMzYsCisJMHg3MDM0LCAweDIwZTgsIDB4MjA2MSwgMHgxOGI4LCAweDJjNDQsIDB4YTI4YywgMHhhMzkwLCAweGE0OTQsCisJMHhhNTk4LCAweDA4MDQsIDB4NGUyNCwgMHg3MTI0LCAweDgxMGIsIDB4MDgwNCwgMHgzNTgzLCAweDIwMjksCisJMHgwMDdlLCAweDc5ODQsIDB4N2E4OCwgMHg3YjhjLCAweDdjOTgsIDB4OTE4NCwgMHhmZjAwLCAweDgwMDcsCisJMHg5MGUyLCAweDAwMjAsIDB4MGEwNCwgMHgzNWI4LCAweDk1MDIsIDB4MGEwNCwgMHgzNWI4LCAweDkxODQsCisJMHgwMGZmLCAweDkwZTIsIDB4MDAyMCwgMHgwYTA0LCAweDM1YjgsIDB4OTUwMiwgMHgwYTA0LCAweDM1YjgsCisJMHg5Mjg0LCAweGZmMDAsIDB4ODAwNywgMHg5MGUyLCAweDAwMjAsIDB4MGEwNCwgMHgzNWI4LCAweDk1MDIsCisJMHgwYTA0LCAweDM1YjgsIDB4OTI4NCwgMHgwMGZmLCAweDkwZTIsIDB4MDAyMCwgMHgwYTA0LCAweDM1YjgsCisJMHg5NTAyLCAweDBhMDQsIDB4MzViOCwgMHg5Mzg0LCAweGZmMDAsIDB4ODAwNywgMHg5MGUyLCAweDAwMjAsCisJMHgwYTA0LCAweDM1YjgsIDB4OTUwMiwgMHgwYTA0LCAweDM1YjgsIDB4OTM4NCwgMHgwMGZmLCAweDkwZTIsCisJMHgwMDIwLCAweDBhMDQsIDB4MzViOCwgMHg5NTAyLCAweDBhMDQsIDB4MzViOCwgMHg5NDg0LCAweGZmMDAsCisJMHg4MDA3LCAweDkwZTIsIDB4MDAyMCwgMHgwYTA0LCAweDM1YjgsIDB4OTUwMiwgMHgwYTA0LCAweDM1YjgsCisJMHg5NDg0LCAweDAwZmYsIDB4OTBlMiwgMHgwMDIwLCAweDBhMDQsIDB4MzViOCwgMHg5NTAyLCAweDBhMDQsCisJMHgzNWI4LCAweDIwNjEsIDB4MTk4OCwgMHg2MTAyLCAweDYyMDYsIDB4NjMwYSwgMHg2NDBlLCAweDA4MDQsCisJMHgzNTgzLCAweDA4MGMsIDB4NGIxZiwgMHgwOTA0LCAweDM1YjUsIDB4MjAwOSwgMHgwMDE2LCAweDdhOGMsCisJMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHhhODVjLCAweDkwODAsIDB4MDAxOSwgMHhhZjYwLCAweDA4MGMsCisJMHg0YjY4LCAweDcwMWYsIDB4NGY1NCwgMHgwMDA1LCAweDIwMDEsIDB4MDEzOCwgMHgyMDAzLCAweDAwMDAsCisJMHgwMGU2LCAweDIwNzEsIDB4MDMwMCwgMHg3MDFjLCAweGQwYTQsIDB4MWRlOCwgMHgwMGVlLCAweDIwYTksCisJMHgwMDE2LCAweDg5NmUsIDB4OGQ2ZSwgMHg4ZDZmLCAweDlkODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMTksCisJMHgyMDk4LCAweDlkODQsIDB4MDAzZiwgMHgyMGUwLCAweDIwNjksIDB4MTg3NywgMHgyMGU5LCAweDAwMDEsCisJMHgyZGEwLCAweDQwMDMsIDB4NjgwMCwgMHg5MDA1LCAweDA5MDQsIDB4NGZkNSwgMHg2ODA0LCAweDIwMDgsCisJMHg5MThjLCAweGZmZjgsIDB4MTkwNCwgMHg0ZmQ1LCAweDY4MGMsIDB4OTAwNSwgMHgwOTA0LCAweDRmZDUsCisJMHg5MDgyLCAweGZmMDEsIDB4MWEwNCwgMHg0ZmQ1LCAweDY4MTAsIDB4OTA4MiwgMHgwMDVjLCAweDBhMDQsCisJMHg0ZmQ1LCAweDY4MjQsIDB4MjAwOCwgMHg5MDgyLCAweDAwMDgsIDB4MGEwNCwgMHg0ZmQ1LCAweDkxODIsCisJMHgwNDAwLCAweDFhMDQsIDB4NGZkNSwgMHgwMDU2LCAweDIwMjksIDB4MDAwMCwgMHgwODBjLCAweDhiYmYsCisJMHgwMDVlLCAweDY5NDQsIDB4NjgyMCwgMHg5MTAyLCAweDA2YzAsIDB4NjgyMCwgMHg5MDgyLCAweDAwMTksCisJMHgxNmEwLCAweDY4MjgsIDB4Njk0NCwgMHg4MTBjLCAweDkxMDIsIDB4MDY3OCwgMHg2ODQwLCAweDkwODIsCisJMHgwMDBmLCAweDE2NTgsIDB4MDgwYywgMHgxMDE4LCAweDI5MDAsIDB4MDkwNCwgMHg0ZmYxLCAweDY4NGUsCisJMHgwMGU2LCAweDIwNzEsIDB4MTkzMCwgMHgwMGI2LCAweDIwNTksIDB4MDAwMCwgMHgwODBjLCAweDhhN2IsCisJMHgwMGJlLCAweDAwZWUsIDB4MDU2OCwgMHgwODBjLCAweDg3Y2UsIDB4MDgwYywgMHg4ODE5LCAweDExZTAsCisJMHg2ODU3LCAweDAwMDAsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4NjEwNCwgMHg5MThkLCAweDIwMDAsCisJMHg2MTA2LCAweDZiMTAsIDB4MjA2MSwgMHgxYTYxLCAweDYzMGEsIDB4MDBjZSwgMHgwODBjLCAweDI5OTQsCisJMHgyMDAxLCAweDAxMzgsIDB4MjEwMiwgMHgwODA0LCAweDM1ODMsIDB4MDgwYywgMHgyOTk0LCAweDIwMDEsCisJMHgwMTM4LCAweDIxMDIsIDB4MDgwNCwgMHgzNWI4LCAweDA4MGMsIDB4ODgxMiwgMHgwMGU2LCAweDIwNzEsCisJMHgxOTMwLCAweDA4MGMsIDB4OGMzZiwgMHgwODBjLCAweDhjNGUsIDB4MDgwYywgMHg4YTYyLCAweDAwZWUsCisJMHgyMDAxLCAweDE4OGEsIDB4MjA0YywgMHgwODBjLCAweDEwMzEsIDB4MjAwMSwgMHgxODhhLCAweDIwMDMsCisJMHgwMDAwLCAweDA4MGMsIDB4Mjk5NCwgMHgyMDAxLCAweDAxMzgsIDB4MjEwMiwgMHgwODA0LCAweDM1YjUsCisJMHgyMDAxLCAweDE5MjQsIDB4MjAwYywgMHg5MThlLCAweDAwMDAsIDB4MDkwNCwgMHg1MDUyLCAweDA4MGMsCisJMHg4YTVkLCAweDA5MDQsIDB4NTA1MiwgMHgyMDAxLCAweDAxMDEsIDB4MjAwYywgMHg5MThjLCAweGRmZmYsCisJMHgyMTAyLCAweDIwMDEsIDB4MDEzOCwgMHgyMDAzLCAweDAwMDAsIDB4MDBlNiwgMHgyMDcxLCAweDAzMDAsCisJMHg3MDFjLCAweGQwYTQsIDB4MWRlOCwgMHgwMGVlLCAweDA4MGMsIDB4OGE2MiwgMHgyMDAxLCAweDAwMzUsCisJMHgwODBjLCAweDE1ZmQsIDB4MDBjNiwgMHgyMDYxLCAweDE5M2MsIDB4NjAwNCwgMHg2MTAwLCAweDkxMDYsCisJMHgxZGUwLCAweDAwY2UsIDB4MDgwYywgMHgyOTk0LCAweDIwMDEsIDB4MDEzOCwgMHgyMTAyLCAweDAwZTYsCisJMHgwMGY2LCAweDIwNzEsIDB4MTkyMywgMHgwODBjLCAweDg5OWMsIDB4MDEyMCwgMHgyZjAwLCAweDA4MGMsCisJMHg4YTI4LCAweDBjYzgsIDB4MDBmZSwgMHgwMGVlLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDEsCisJMHgxODhhLCAweDIwMGMsIDB4ODFmZiwgMHgwMTM4LCAweDIxNDgsIDB4MDgwYywgMHgxMDMxLCAweDIwMDEsCisJMHgxODhhLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDE4M2MsIDB4MjAwMywgMHgwMDIwLCAweDA4MGMsCisJMHg4ODEyLCAweDAwZTYsIDB4MjA3MSwgMHgxOTMwLCAweDA4MGMsIDB4OGMzZiwgMHgwODBjLCAweDhjNGUsCisJMHgwMGVlLCAweDAxMmUsIDB4MDgwNCwgMHgzNTgzLCAweDAwMDYsIDB4MDgwYywgMHg1NzVkLCAweGQwY2MsCisJMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwgMHgwODBjLCAweDU3NjEsIDB4ZDBiYywgMHgwMDBlLCAweDAwMDUsCisJMHg2MTc0LCAweDdhODQsIDB4NjMwMCwgMHg4MmZmLCAweDExMTgsIDB4Nzk4NiwgMHgwODA0LCAweDM1ODMsCisJMHg4M2ZmLCAweDE5MDQsIDB4MzViOCwgMHgyMDAxLCAweGZmZjAsIDB4OTIwMCwgMHgxYTA0LCAweDM1YjgsCisJMHgyMDE5LCAweGZmZmYsIDB4NjA3OCwgMHg5MzAyLCAweDkyMDAsIDB4MGEwNCwgMHgzNWI4LCAweDc5ODYsCisJMHg2Mjc2LCAweDA4MDQsIDB4MzU4MywgMHgwODBjLCAweDU3NzEsIDB4MTkwNCwgMHgzNWI1LCAweDdjODgsCisJMHg3ZDg0LCAweDdlOTgsIDB4N2Y4YywgMHgwODBjLCAweDRiMWYsIDB4MDkwNCwgMHgzNWI1LCAweDkwMGUsCisJMHg5MDFlLCAweDczMjYsIDB4NzMzMiwgMHhhODYwLCAweDIwZTgsIDB4NzAzNiwgMHhhODVjLCAweDkwODAsCisJMHgwMDAzLCAweDcwMmEsIDB4MjBhMCwgMHg5MWQ4LCAweDEwMDAsIDB4MmI1YywgMHg4YmZmLCAweDAxNzgsCisJMHgwODBjLCAweDZhMGMsIDB4MDExOCwgMHgwODBjLCAweDZhMTQsIDB4MTE0OCwgMHgyMGE5LCAweDAwMDEsCisJMHhiODE0LCAweDQwMDQsIDB4YjgxMCwgMHg0MDA0LCAweDQxMDQsIDB4OTM5OCwgMHgwMDAzLCAweDgxMDgsCisJMHg5MTgyLCAweDA4MDAsIDB4MDEyMCwgMHg5Mzg2LCAweDAwM2MsIDB4MDE3MCwgMHgwYzIwLCAweDgzZmYsCisJMHgxMTQ4LCAweDcyMjQsIDB4OTAwZSwgMHgyMDAxLCAweDAwMDMsIDB4MDgwYywgMHg5MDI3LCAweDIyMDgsCisJMHgwODA0LCAweDM1ODMsIDB4NzAzMywgMHgwMDAxLCAweDcxMjIsIDB4NzAyNCwgMHg5MzAwLCAweDcwMjYsCisJMHgyMDYxLCAweDE4YjgsIDB4MmM0NCwgMHhhMDZiLCAweDAwMDAsIDB4YTM3YSwgMHg3MDI4LCAweGEwNzYsCisJMHg3MDM0LCAweGEwNzIsIDB4YTQ4ZSwgMHhhNTkyLCAweGE2OTYsIDB4YTc5YSwgMHgwODBjLCAweDEwZTksCisJMHg3MDA3LCAweDAwMDIsIDB4NzAxZiwgMHg1MGQ1LCAweDAwMDUsIDB4NzAzMCwgMHg5MDA1LCAweDExNzgsCisJMHg3MTIwLCAweDcwMjgsIDB4MjBhMCwgMHg5MDFlLCAweDcwMzQsIDB4MjBlOCwgMHgyMDYxLCAweDE4YjgsCisJMHgyYzQ0LCAweGE0OGMsIDB4YTU5MCwgMHhhNjk0LCAweGE3OTgsIDB4MDgwNCwgMHg1MDkzLCAweDcyMjQsCisJMHg5MDBlLCAweDIwMDEsIDB4MDAwMywgMHgwODBjLCAweDkwMjcsIDB4MjIwOCwgMHgwODA0LCAweDM1ODMsCisJMHgwMGY2LCAweDAwZTYsIDB4MDgwYywgMHg1NzcxLCAweDIwMDksIDB4MDAwNywgMHgxOTA0LCAweDUxNjgsCisJMHgyMDcxLCAweDE4OWUsIDB4NzQ1YywgMHg4NGZmLCAweDIwMDksIDB4MDAwZSwgMHgxOTA0LCAweDUxNjgsCisJMHhhYzljLCAweGFkOTgsIDB4YWVhNCwgMHhhZmEwLCAweDAwOTYsIDB4MDgwYywgMHgxMDE4LCAweDIwMDksCisJMHgwMDAyLCAweDA5MDQsIDB4NTE2OCwgMHgyOTAwLCAweDcwNWUsIDB4OTAwZSwgMHg5MDFlLCAweDczNTYsCisJMHg3MzYyLCAweGE4NjAsIDB4NzA2NiwgMHhhODVjLCAweDkwODAsIDB4MDAwMywgMHg3MDVhLCAweDIwYTAsCisJMHg5MWQ4LCAweDEwMDAsIDB4MmI1YywgMHg4YmZmLCAweDAxNzgsIDB4MDgwYywgMHg2YTBjLCAweDAxMTgsCisJMHgwODBjLCAweDZhMTQsIDB4MTE0OCwgMHhiODE0LCAweDIwYTksIDB4MDAwMSwgMHg0MDA0LCAweGI4MTAsCisJMHg0MDA0LCAweDQxMDQsIDB4OTM5OCwgMHgwMDAzLCAweDgxMDgsIDB4OTE4MiwgMHgwODAwLCAweDAxMjAsCisJMHg5Mzg2LCAweDAwM2MsIDB4MDFlOCwgMHgwYzIwLCAweDgzZmYsIDB4MTFjMCwgMHg3MjU0LCAweDkwMGUsCisJMHgyMDAxLCAweDAwMDMsIDB4MDgwYywgMHg5MDI3LCAweDIyMDgsIDB4MDA5ZSwgMHhhODk3LCAweDQwMDAsCisJMHhhOTlhLCAweDcxNWMsIDB4ODFmZiwgMHgwOTBjLCAweDBkZDUsIDB4MjE0OCwgMHgwODBjLCAweDEwMzEsCisJMHg5MDA2LCAweDcwNWUsIDB4OTE4ZCwgMHgwMDAxLCAweDIwMDgsIDB4MDQxOCwgMHg3MDYzLCAweDAwMDEsCisJMHg3MTUyLCAweDcwNTQsIDB4OTMwMCwgMHg3MDU2LCAweDIwNjEsIDB4MThiOSwgMHgyYzQ0LCAweGEzN2EsCisJMHg3MDU4LCAweGEwNzYsIDB4NzA2NCwgMHhhMDcyLCAweGE0OGUsIDB4YTU5MiwgMHhhNjk2LCAweGE3OWEsCisJMHhhMDlmLCAweDUxNzQsIDB4MDAwZSwgMHhhMGEyLCAweDA4MGMsIDB4MTBlOSwgMHg5MDA2LCAweDAwNDgsCisJMHgwMDllLCAweGE4OTcsIDB4NDAwNSwgMHhhOTlhLCAweDkwMGUsIDB4OTA4NSwgMHgwMDAxLCAweDIwMDEsCisJMHgwMDMwLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4YTBhMCwgMHg5MDRkLCAweDA5MGMsCisJMHgwZGQ1LCAweDAwZTYsIDB4MjA3MSwgMHgxODllLCAweGEwNmMsIDB4OTA4ZSwgMHgwMTAwLCAweDAxMzgsCisJMHhhODdiLCAweDAwMzAsIDB4YTg4MywgMHgwMDAwLCAweGE4OTcsIDB4NDAwMiwgMHgwMGQ4LCAweDcwNjAsCisJMHg5MDA1LCAweDExNTgsIDB4NzE1MCwgMHg3MDU4LCAweDIwYTAsIDB4OTAxZSwgMHg3MDY0LCAweDIwZTgsCisJMHhhNDhjLCAweGE1OTAsIDB4YTY5NCwgMHhhNzk4LCAweDA0MjgsIDB4YTg3YiwgMHgwMDAwLCAweGE4ODMsCisJMHgwMDAwLCAweGE4OTcsIDB4NDAwMCwgMHg3MjU0LCAweDkwMGUsIDB4MjAwMSwgMHgwMDAzLCAweDA4MGMsCisJMHg5MDI3LCAweGFhOWEsIDB4NzE1YywgMHg4MWZmLCAweDA5MGMsIDB4MGRkNSwgMHgyMTQ4LCAweDA4MGMsCisJMHgxMDMxLCAweDcwNWYsIDB4MDAwMCwgMHhhMGEwLCAweDIwNDgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgwODBjLCAweDZkMTcsIDB4MDEyZSwgMHhhMDlmLCAweDAwMDAsIDB4YTBhMywgMHgwMDAwLCAweDAwZWUsCisJMHgwMGZlLCAweDAwMDUsIDB4OTFkOCwgMHgxMDAwLCAweDJiNWMsIDB4OGJmZiwgMHgwMTc4LCAweDA4MGMsCisJMHg2YTBjLCAweDAxMTgsIDB4MDgwYywgMHg2YTE0LCAweDExNDgsIDB4YjgxNCwgMHgyMGE5LCAweDAwMDEsCisJMHg0MDA0LCAweGI4MTAsIDB4NDAwNCwgMHg0MTA0LCAweDkzOTgsIDB4MDAwMywgMHg4MTA4LCAweDkxODIsCisJMHgwODAwLCAweDAxMjAsIDB4OTM4NiwgMHgwMDNjLCAweDA1MTgsIDB4MGMyMCwgMHg4M2ZmLCAweDExZjAsCisJMHg3MTU0LCAweDgxMGMsIDB4YTk5YSwgMHhhODk3LCAweDQwMDAsIDB4NzE1YywgMHg4MWZmLCAweDA5MGMsCisJMHgwZGQ1LCAweDIxNDgsIDB4MDgwYywgMHgxMDMxLCAweDkwMDYsIDB4NzA1ZSwgMHg5MThkLCAweDAwMDEsCisJMHgyMDA4LCAweGEwYTAsIDB4MjA0OCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDZkMTcsCisJMHgwMTJlLCAweGEwOWYsIDB4MDAwMCwgMHhhMGEzLCAweDAwMDAsIDB4MDA3MCwgMHg3MDYzLCAweDAwMDEsCisJMHg3MTUyLCAweDcwNTQsIDB4OTMwMCwgMHg3MDU2LCAweGEzN2EsIDB4YTQ4ZSwgMHhhNTkyLCAweGE2OTYsCisJMHhhNzlhLCAweDA4MGMsIDB4MTBlOSwgMHg5MDA2LCAweDAwZWUsIDB4MDAwNSwgMHgwMDk2LCAweGE4OGMsCisJMHg5MGJlLCAweDcwMDAsIDB4MDE0OCwgMHg5MGJlLCAweDcxMDAsIDB4MDEzMCwgMHg5MGJlLCAweDcyMDAsCisJMHgwMTE4LCAweDAwOWUsIDB4MDgwNCwgMHgzNWI4LCAweGE4ODQsIDB4YTk4OCwgMHgwODBjLCAweDI4N2MsCisJMHgxNTE4LCAweDA4MGMsIDB4NjYzOCwgMHgxNTAwLCAweDcxMjYsIDB4YmUxMiwgMHhiZDE2LCAweGFlN2MsCisJMHgwODBjLCAweDRiMWYsIDB4MDFjOCwgMHgwODBjLCAweDRiMWYsIDB4MDFiMCwgMHgwMDllLCAweGE4NjcsCisJMHgwMDAwLCAweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweGE4MjMsIDB4MDAwMCwgMHhhODA0LCAweDIwNDgsCisJMHgwODBjLCAweGNlMzIsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDMsIDB4MDgwNCwgMHgzNWI1LCAweDcwMDcsCisJMHgwMDAzLCAweDcwMWYsIDB4NTI0MSwgMHgwMDA1LCAweDAwOWUsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsCisJMHgzNWI1LCAweDcxMjQsIDB4MDgwYywgMHgzMzFhLCAweGE4MjAsIDB4OTA4NiwgMHg4MDAxLCAweDExMjAsCisJMHgyMDA5LCAweDAwMDQsIDB4MDgwNCwgMHgzNWI1LCAweDI5MDAsIDB4NzAyMiwgMHhhODA0LCAweDAwOTYsCisJMHgyMDQ4LCAweDg5MDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsCisJMHgwMDllLCAweDkwODAsIDB4MDAwMiwgMHgwMDc2LCAweDAwMDYsIDB4MjA5OCwgMHgyMGEwLCAweDI3ZTAsCisJMHgyN2U4LCAweDIwYTksIDB4MDAyYSwgMHgwODBjLCAweDBmN2MsIDB4YWE2YywgMHhhYjcwLCAweGFjNzQsCisJMHhhZDc4LCAweDIwNjEsIDB4MThiOCwgMHgyYzQ0LCAweGEwNmIsIDB4MDAwMCwgMHhhZTY0LCAweGFmOGMsCisJMHg5N2M2LCAweDcwMDAsIDB4MDExOCwgMHg5N2M2LCAweDcxMDAsIDB4MTE0OCwgMHg5NmMyLCAweDAwMDQsCisJMHgwNjAwLCAweDIwMDksIDB4MDAwNCwgMHgwMDBlLCAweDAwN2UsIDB4MDgwNCwgMHg0YjZiLCAweDk3YzYsCisJMHg3MjAwLCAweDExYjgsIDB4OTZjMiwgMHgwMDU0LCAweDAyYTAsIDB4MDAwZSwgMHgwMDdlLCAweDIwNjEsCisJMHgxOGI4LCAweDJjNDQsIDB4YTA3NiwgMHhhNzcyLCAweGEwN2IsIDB4MDAyYSwgMHhhMjhlLCAweGEzOTIsCisJMHhhNDk2LCAweGE1OWEsIDB4MDgwYywgMHgxMGU5LCAweDcwMDcsIDB4MDAwMiwgMHg3MDFmLCAweDUyOWQsCisJMHgwMDA1LCAweDAwMGUsIDB4MDA3ZSwgMHgwODA0LCAweDM1YjgsIDB4NzAyMCwgMHgyMDQ4LCAweGE4MDQsCisJMHgyMDQ4LCAweGE4MDQsIDB4MjA0OCwgMHg4OTA2LCAweDgwMDYsIDB4ODAwNywgMHg5MGJjLCAweDAwM2YsCisJMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDAyLCAweDIwOTgsIDB4MjBhMCwgMHgyN2UwLCAweDI3ZTgsCisJMHgyMGE5LCAweDAwMmEsIDB4MDgwYywgMHgwZjdjLCAweDIxMDAsIDB4MjIzOCwgMHgyMDYxLCAweDE4YjgsCisJMHgyYzQ0LCAweGEyOGMsIDB4YTM5MCwgMHhhNDk0LCAweGE1OTgsIDB4MjAwOSwgMHgwMDJhLCAweDA4MDQsCisJMHg0YjZiLCAweDgxZmYsIDB4MTkwNCwgMHgzNWI1LCAweDc5OGMsIDB4MjAwMSwgMHgxOTdkLCAweDkxOGMsCisJMHg4MDAwLCAweDIxMDIsIDB4MDgwYywgMHg0YjM2LCAweDA5MDQsIDB4MzViOCwgMHgwODBjLCAweDZhMGMsCisJMHgwMTIwLCAweDA4MGMsIDB4NmExNCwgMHgxOTA0LCAweDM1YjgsIDB4MDgwYywgMHg2NzYwLCAweDA5MDQsCisJMHgzNWI1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NjgyNiwgMHgwMTJlLCAweDA5MDQsCisJMHgzNWI1LCAweDIwMDEsIDB4MTk3ZCwgMHgyMDA0LCAweGQwZmMsIDB4MTkwNCwgMHgzNTgzLCAweDA4MDQsCisJMHg0NTg2LCAweGE5YTAsIDB4MjAwMSwgMHgxOTdkLCAweDkxOGMsIDB4ODAwMCwgMHhjMThkLCAweDIxMDIsCisJMHgwODBjLCAweDRiNDMsIDB4MDFhMCwgMHgwODBjLCAweDZhMGMsIDB4MDExOCwgMHgwODBjLCAweDZhMTQsCisJMHgxMTcwLCAweDA4MGMsIDB4Njc2MCwgMHgyMDA5LCAweDAwMDIsIDB4MDEyOCwgMHgwODBjLCAweDY4MjYsCisJMHgxMTcwLCAweDIwMDksIDB4MDAwMywgMHhhODk3LCAweDQwMDUsIDB4YTk5YSwgMHgwMDEwLCAweGE4OTcsCisJMHg0MDA2LCAweDkwMGUsIDB4OTA4NSwgMHgwMDAxLCAweDIwMDEsIDB4MDAzMCwgMHgwMDA1LCAweGE4OTcsCisJMHg0MDAwLCAweDIwMDEsIDB4MTk3ZCwgMHgyMDA0LCAweGQwZmMsIDB4MTEyOCwgMHgwODBjLCAweDU3NjUsCisJMHgwMTEwLCAweDkwMDYsIDB4MDAxOCwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDAsCisJMHgwMDA1LCAweDc4YTgsIDB4ZDA4YywgMHgxMTE4LCAweGQwODQsIDB4MDkwNCwgMHg0NGZiLCAweDA4MGMsCisJMHg0YjUyLCAweDA5MDQsIDB4MzViOCwgMHgwODBjLCAweDRiMWYsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsCisJMHgwODA0LCAweDM1YjUsIDB4MDgwYywgMHg2YTBjLCAweDAxMzAsIDB4OTA4ZSwgMHgwMDA0LCAweDAxMTgsCisJMHg5MDhlLCAweDAwMDUsIDB4MTVhMCwgMHg3OGE4LCAweGQwOGMsIDB4MDEyMCwgMHhiODAwLCAweGMwOGMsCisJMHhiODAyLCAweDAwMjgsIDB4MDgwYywgMHg1NzVkLCAweGQwYjQsIDB4MDkwNCwgMHg0NTM1LCAweDc4ODQsCisJMHg5MDhlLCAweDAwN2UsIDB4MDkwNCwgMHg0NTM1LCAweDkwOGUsIDB4MDA3ZiwgMHgwOTA0LCAweDQ1MzUsCisJMHg5MDhlLCAweDAwODAsIDB4MDkwNCwgMHg0NTM1LCAweGI4MDAsIDB4ZDA4YywgMHgxOTA0LCAweDQ1MzUsCisJMHhhODY3LCAweDAwMDAsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4MDgwYywgMHhjZTUxLCAweDExMjAsCisJMHgyMDA5LCAweDAwMDMsIDB4MDgwNCwgMHgzNWI1LCAweDcwMDcsIDB4MDAwMywgMHg3MDFmLCAweDUzNjksCisJMHgwMDA1LCAweDA4MGMsIDB4NGI1MiwgMHgwOTA0LCAweDM1YjgsIDB4MDgwNCwgMHg0NTM1LCAweDA4MGMsCisJMHgzMzczLCAweDAxMDgsIDB4MDAwNSwgMHgyMDA5LCAweDE4MzQsIDB4MjEwYywgMHg4MWZmLCAweDAxMjAsCisJMHgyMDA5LCAweDAwMDEsIDB4MDgwNCwgMHgzNWI1LCAweDA4MGMsIDB4NTc3MSwgMHgwMTIwLCAweDIwMDksCisJMHgwMDA3LCAweDA4MDQsIDB4MzViNSwgMHgwODBjLCAweDZhMDQsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDgsCisJMHgwODA0LCAweDM1YjUsIDB4Yjg5YywgMHhkMGE0LCAweDExMTgsIDB4ZDBhYywgMHgxOTA0LCAweDQ1MzUsCisJMHg5MDA2LCAweGE4NjYsIDB4YTgzMiwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHgwODBjLCAweGNlYjAsCisJMHgxMTIwLCAweDIwMDksIDB4MDAwMywgMHgwODA0LCAweDM1YjUsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsCisJMHg1M2EyLCAweDAwMDUsIDB4YTgzMCwgMHg5MDg2LCAweDAxMDAsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDQsCisJMHgwODA0LCAweDU2YjEsIDB4MDgwYywgMHg0YjUyLCAweDA5MDQsIDB4MzViOCwgMHgwODA0LCAweDUzM2IsCisJMHg4MWZmLCAweDIwMDksIDB4MDAwMSwgMHgxOTA0LCAweDM1YjUsIDB4MDgwYywgMHg1NzcxLCAweDIwMDksCisJMHgwMDA3LCAweDE5MDQsIDB4MzViNSwgMHgwODBjLCAweDZhMDQsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDgsCisJMHgwODA0LCAweDM1YjUsIDB4MDgwYywgMHg0YjUyLCAweDA5MDQsIDB4MzViOCwgMHgwODBjLCAweDZhMGMsCisJMHgyMDA5LCAweDAwMDksIDB4MTkwNCwgMHgzNWI1LCAweDA4MGMsIDB4NGIxZiwgMHgyMDA5LCAweDAwMDIsCisJMHgwOTA0LCAweDM1YjUsIDB4OTAwNiwgMHhhODY2LCAweGE4MzIsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsCisJMHg3OTg4LCAweDkxOTQsIDB4ZmYwMCwgMHg5MThjLCAweDAwZmYsIDB4OTAwNiwgMHg4MmZmLCAweDExMjgsCisJMHhjMGVkLCAweGE5NTIsIDB4Nzk4YywgMHhhOTU2LCAweDAwMzgsIDB4OTI4ZSwgMHgwMTAwLCAweDE5MDQsCisJMHgzNWI4LCAweGMwZTUsIDB4YTk1MiwgMHhhOTU2LCAweGE4M2UsIDB4MDgwYywgMHhkMTAzLCAweDIwMDksCisJMHgwMDAzLCAweDA5MDQsIDB4MzViNSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwgMHg1M2Y4LCAweDAwMDUsCisJMHhhODMwLCAweDkwODYsIDB4MDEwMCwgMHgyMDA5LCAweDAwMDQsIDB4MDkwNCwgMHgzNWI1LCAweDA4MDQsCisJMHgzNTgzLCAweDdhYTgsIDB4OTI4NCwgMHhjMDAwLCAweDAxNDgsIDB4ZDJlYywgMHgwMWEwLCAweDA4MGMsCisJMHg1NzcxLCAweDExODgsIDB4MjAwOSwgMHgwMDE0LCAweDA4MDQsIDB4MzViNSwgMHhkMmRjLCAweDE1NzgsCisJMHg4MWZmLCAweDIwMDksIDB4MDAwMSwgMHgxOTA0LCAweDM1YjUsIDB4MDgwYywgMHg1NzcxLCAweDIwMDksCisJMHgwMDA3LCAweDE5MDQsIDB4MzViNSwgMHhkMmY0LCAweDAxMzgsIDB4OTI4NCwgMHg1MDAwLCAweGMwZDUsCisJMHgwODBjLCAweDU3MzcsIDB4MDgwNCwgMHgzNTgzLCAweGQyZmMsIDB4MDE2MCwgMHgwODBjLCAweDRiNTIsCisJMHgwOTA0LCAweDM1YjgsIDB4Nzk4NCwgMHg5Mjg0LCAweDkwMDAsIDB4YzBkNSwgMHgwODBjLCAweDU3MGMsCisJMHgwODA0LCAweDM1ODMsIDB4MDgwYywgMHg0YjUyLCAweDA5MDQsIDB4MzViOCwgMHhiODA0LCAweDkwODQsCisJMHgwMGZmLCAweDkwODYsIDB4MDAwNiwgMHgyMDA5LCAweDAwMDksIDB4MTkwNCwgMHg1NGU3LCAweDA4MGMsCisJMHg0YjFmLCAweDIwMDksIDB4MDAwMiwgMHgwOTA0LCAweDU0ZTcsIDB4YTg1YywgMHg5MDgwLCAweDAwMWIsCisJMHhhZjYwLCAweDIwMDksIDB4MDAwOCwgMHg3YThjLCAweDdiODgsIDB4N2M5YywgMHg3ZDk4LCAweDA4MGMsCisJMHg0YjY4LCAweDcwMWYsIDB4NTQ1NCwgMHgwMDA1LCAweGE4NmMsIDB4OTA4NiwgMHgwNTAwLCAweDExMzgsCisJMHhhODcwLCAweDkwMDUsIDB4MTEyMCwgMHhhODc0LCAweDkwODQsIDB4ZmYwMCwgMHgwMTEwLCAweDE5MDQsCisJMHgzNWI4LCAweGE4NjYsIDB4YTgzMiwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHgwODBjLCAweDRiNTIsCisJMHgxMTEwLCAweDA4MDQsIDB4MzViOCwgMHgyMDA5LCAweDAwNDMsIDB4MDgwYywgMHhkMTZiLCAweDIwMDksCisJMHgwMDAzLCAweDA5MDQsIDB4NTRlNywgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwgMHg1NDc4LCAweDAwMDUsCisJMHhhODMwLCAweDkwODYsIDB4MDEwMCwgMHgyMDA5LCAweDAwMDQsIDB4MDkwNCwgMHg1NGU3LCAweDc5ODQsCisJMHg3YWE4LCAweDkyODQsIDB4MTAwMCwgMHhlMDg1LCAweDA4MGMsIDB4NTcwYywgMHgwODA0LCAweDM1ODMsCisJMHgwMGM2LCAweGFhYjAsIDB4OTI4NCwgMHhjMDAwLCAweDAxNDgsIDB4ZDJlYywgMHgwMTcwLCAweDA4MGMsCisJMHg1NzcxLCAweDExNTgsIDB4MjAwOSwgMHgwMDE0LCAweDA4MDQsIDB4NTRkNiwgMHgyMDYxLCAweDE4MDAsCisJMHgwODBjLCAweDU3NzEsIDB4MjAwOSwgMHgwMDA3LCAweDE1YzgsIDB4ZDJmNCwgMHgwMTMwLCAweDkyODQsCisJMHg1MDAwLCAweGMwZDUsIDB4MDgwYywgMHg1NzM3LCAweDAwNTgsIDB4ZDJmYywgMHgwMTgwLCAweDA4MGMsCisJMHg0YjUwLCAweDA1OTAsIDB4YTk5OCwgMHg5Mjg0LCAweDkwMDAsIDB4YzBkNSwgMHgwODBjLCAweDU3MGMsCisJMHhhODdiLCAweDAwMDAsIDB4YTg4MywgMHgwMDAwLCAweGE4OTcsIDB4NDAwMCwgMHgwNDM4LCAweDA4MGMsCisJMHg0YjUwLCAweDA1MTAsIDB4MDgwYywgMHg2YTBjLCAweDIwMDksIDB4MDAwOSwgMHgxMWI4LCAweGE4YzQsCisJMHg5MDg2LCAweDA1MDAsIDB4MTFjOCwgMHhhOGM4LCAweDkwMDUsIDB4MTFiMCwgMHhhOGNjLCAweDkwODQsCisJMHhmZjAwLCAweDExOTAsIDB4MDgwYywgMHg0YjUwLCAweDExMDgsIDB4MDA3MCwgMHgyMDA5LCAweDAwNGIsCisJMHgwODBjLCAweGQxNmIsIDB4MjAwOSwgMHgwMDAzLCAweDAxMDgsIDB4MDA3OCwgMHgwNDMxLCAweDE5YzAsCisJMHhhODk3LCAweDQwMDUsIDB4YTk5YSwgMHgwMDEwLCAweGE4OTcsIDB4NDAwNiwgMHg5MDBlLCAweDkwODUsCisJMHgwMDAxLCAweDIwMDEsIDB4MDAzMCwgMHgwMGNlLCAweDAwMDUsIDB4OTAwNiwgMHgwY2UwLCAweDdhYTgsCisJMHhkMmRjLCAweDA5MDQsIDB4MzViNSwgMHgwMDE2LCAweDc5ODQsIDB4OTI4NCwgMHgxMDAwLCAweGMwZmQsCisJMHgwODBjLCAweDU3MGMsIDB4MDAxZSwgMHgxOTA0LCAweDM1YjUsIDB4MDgwNCwgMHgzNTgzLCAweDAwZjYsCisJMHgyZDc4LCAweGFhYjAsIDB4MDAyMSwgMHgwMGZlLCAweDAwMDUsIDB4YWFiMCwgMHhjMmQ1LCAweGQyZGMsCisJMHgwMTUwLCAweDAwMTYsIDB4YTk5OCwgMHg5Mjg0LCAweDE0MDAsIDB4YzBmZCwgMHgwODBjLCAweDU3MGMsCisJMHgwMDFlLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDgxZmYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDEsCisJMHgwODA0LCAweDM1YjUsIDB4MDgwYywgMHg1NzcxLCAweDAxMjAsIDB4MjAwOSwgMHgwMDA3LCAweDA4MDQsCisJMHgzNWI1LCAweDc5ODQsIDB4N2VhOCwgMHg5NmI0LCAweDAwZmYsIDB4MDgwYywgMHg2Njk5LCAweDE5MDQsCisJMHgzNWI4LCAweDkxODYsIDB4MDA3ZiwgMHgwMTM4LCAweDA4MGMsIDB4NmEwYywgMHgwMTIwLCAweDIwMDksCisJMHgwMDA5LCAweDA4MDQsIDB4MzViNSwgMHgwODBjLCAweDRiMWYsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsCisJMHgwODA0LCAweDM1YjUsIDB4YTg2NywgMHgwMDAwLCAweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweDIwMDEsCisJMHgwMTAwLCAweDgwMDcsIDB4YTgwYSwgMHgwODBjLCAweGNlNmIsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDMsCisJMHgwODA0LCAweDM1YjUsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NTU0NywgMHgwMDA1LCAweGE4MDgsCisJMHg4MDA3LCAweDkwODYsIDB4MDEwMCwgMHgxMTIwLCAweDIwMDksIDB4MDAwNCwgMHgwODA0LCAweDM1YjUsCisJMHhhOGUwLCAweGE4NjYsIDB4YTgxMCwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwgMHg4MDBjLCAweGE4MTQsCisJMHg4MDA3LCAweDkwODQsIDB4MDBmZiwgMHg4MDA0LCAweDkwODAsIDB4MDAwMiwgMHg5MTA4LCAweDg5MDYsCisJMHg4MDA2LCAweDgwMDcsIDB4OTBiYywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMDQsCisJMHg3YThjLCAweDdiODgsIDB4N2M5YywgMHg3ZDk4LCAweDA4MDQsIDB4NGI2YiwgMHgwODBjLCAweDRiMWYsCisJMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDM1YjUsIDB4Nzk4NCwgMHg5MTk0LCAweGZmMDAsCisJMHg5MThjLCAweDAwZmYsIDB4ODIxNywgMHg4MmZmLCAweDExMTgsIDB4NzAyMywgMHgxOWIyLCAweDAwNDAsCisJMHg5MmM2LCAweDAwMDEsIDB4MTExOCwgMHg3MDIzLCAweDE5Y2MsIDB4MDAxMCwgMHgwODA0LCAweDM1YjgsCisJMHgyMDA5LCAweDAwMWEsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHhhODVjLCAweDkwODAsCisJMHgwMDE5LCAweGFmNjAsIDB4MDgwYywgMHg0YjY4LCAweDcwMWYsIDB4NTU5NywgMHgwMDA1LCAweDIwMDEsCisJMHgxODJlLCAweDIwMDMsIDB4MDAwMSwgMHhhODVjLCAweDkwODAsIDB4MDAxOSwgMHgyMDk4LCAweGE4NjAsCisJMHgyMGUwLCAweDIwYTksIDB4MDAxYSwgMHg3MDIwLCAweDIwYTAsIDB4MjBlOSwgMHgwMDAxLCAweDQwMDMsCisJMHgwODA0LCAweDM1ODMsIDB4MDgwYywgMHg0YjFmLCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsCisJMHgzNWI1LCAweDc5ODQsIDB4OTE5NCwgMHhmZjAwLCAweDkxOGMsIDB4MDBmZiwgMHg4MjE3LCAweDgyZmYsCisJMHgxMTE4LCAweDIwOTksIDB4MTliMiwgMHgwMDQwLCAweDkyYzYsIDB4MDAwMSwgMHgxMTE4LCAweDIwOTksCisJMHgxOWNjLCAweDAwMTAsIDB4MDgwNCwgMHgzNWI4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDE5LCAweDIwYTAsCisJMHhhODYwLCAweDIwZTgsIDB4MjBhOSwgMHgwMDFhLCAweDIwZTEsIDB4MDAwMSwgMHg0MDAzLCAweDIwMDksCisJMHgwMDFhLCAweDdhOGMsIDB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMTksCisJMHhhZjYwLCAweDA4MDQsIDB4NGI2YiwgMHg3ODg0LCAweDkwOGEsIDB4MTAwMCwgMHgxYTA0LCAweDM1YjgsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHg5MTA4LCAweDAwYzYsCisJMHgyMDYxLCAweDE5ZjksIDB4NjE0MiwgMHgwMGNlLCAweDAxMmUsIDB4MDgwNCwgMHgzNTgzLCAweDAwYzYsCisJMHgwODBjLCAweDc0M2UsIDB4MTE2MCwgMHgwODBjLCAweDc3MjQsIDB4MDgwYywgMHg2MGFkLCAweDkwODUsCisJMHgwMDAxLCAweDA4MGMsIDB4NzQ4NSwgMHgwODBjLCAweDczNmEsIDB4MDgwYywgMHgwZGQ1LCAweDIwNjEsCisJMHgxODAwLCAweDYwMzAsIDB4YzA5ZCwgMHg2MDMyLCAweDA4MGMsIDB4NWY2YywgMHgwMGNlLCAweDAwMDUsCisJMHgwMGM2LCAweDIwMDEsIDB4MTgwMCwgMHgyMDA0LCAweDkwOGUsIDB4MDAwMCwgMHgwOTA0LCAweDM1YjUsCisJMHg3ODg0LCAweDkwMDUsIDB4MDE4OCwgMHg3ODg4LCAweDIwNjEsIDB4MTk5YiwgMHgyYzBjLCAweDIwNjIsCisJMHgwODBjLCAweDJjNWUsIDB4MDFhMCwgMHgwODBjLCAweDJjNjYsIDB4MDE4OCwgMHgwODBjLCAweDJjNmUsCisJMHgwMTcwLCAweDIxNjIsIDB4MDgwNCwgMHgzNWI4LCAweDIwNjEsIDB4MDEwMCwgMHg2MDM4LCAweDkwODYsCisJMHgwMDA3LCAweDExMTgsIDB4MjAwOSwgMHgwMDAxLCAweDAwMTAsIDB4MjAwOSwgMHgwMDAwLCAweDc4ODQsCisJMHg5MDg2LCAweDAwMDIsIDB4MTU2OCwgMHgyMDYxLCAweDAxMDAsIDB4NjAyOCwgMHhjMDljLCAweDYwMmEsCisJMHgwMDI2LCAweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweGE3MjIsIDB4MjAxMSwgMHgwMDAyLCAweDA4MGMsCisJMHhhNzJjLCAweDAwMmUsIDB4MDgwYywgMHhhNjM2LCAweDAwMzYsIDB4OTAxZSwgMHgwODBjLCAweGE2YWMsCisJMHgwMDNlLCAweDYwZTMsIDB4MDAwMCwgMHgwODBjLCAweGViNzksIDB4MDgwYywgMHhlYjk0LCAweDkwODUsCisJMHgwMDAxLCAweDA4MGMsIDB4NzQ4NSwgMHg5MDA2LCAweDA4MGMsIDB4MmQ0ZSwgMHgyMDAxLCAweDE4MDAsCisJMHgyMDAzLCAweDAwMDQsIDB4MjAwMSwgMHgxOWE2LCAweDIwMDMsIDB4MDAwMCwgMHg2MDI3LCAweDAwMDgsCisJMHgwMGNlLCAweDA4MDQsIDB4MzU4MywgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MDQsCisJMHgzNWI1LCAweDA4MGMsIDB4NTc3MSwgMHgwMTIwLCAweDIwMDksIDB4MDAwNywgMHgwODA0LCAweDM1YjUsCisJMHg3OTg0LCAweDdlYTgsIDB4OTZiNCwgMHgwMGZmLCAweDA4MGMsIDB4NjY5OSwgMHgxOTA0LCAweDM1YjgsCisJMHg5MTg2LCAweDAwN2YsIDB4MDEzOCwgMHgwODBjLCAweDZhMGMsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDksCisJMHgwODA0LCAweDM1YjUsIDB4MDgwYywgMHg0YjFmLCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsCisJMHgzNWI1LCAweGE4NjcsIDB4MDAwMCwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHgwODBjLCAweGNlNmUsCisJMHgxMTIwLCAweDIwMDksIDB4MDAwMywgMHgwODA0LCAweDM1YjUsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsCisJMHg1NjlhLCAweDAwMDUsIDB4YTgzMCwgMHg5MDg2LCAweDAxMDAsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDQsCisJMHgwODA0LCAweDM1YjUsIDB4YThlMCwgMHhhODY2LCAweGE4MzQsIDB4ODAwNywgMHg4MDBjLCAweGE4NWMsCisJMHg5MDgwLCAweDAwMGMsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHhhZjYwLCAweDA4MDQsCisJMHg0YjZiLCAweGE4OTgsIDB4OTA4NiwgMHgwMDBkLCAweDE5MDQsIDB4MzViNSwgMHgyMDIxLCAweDQwMDUsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwZTA0LCAweDU2YmUsIDB4MDAxMCwgMHgwMTJlLCAweDBjYzAsCisJMHg3YzM2LCAweDk0ODYsIDB4NDAwMCwgMHgwMTE4LCAweDc4MzMsIDB4MDAxMSwgMHgwMDEwLCAweDc4MzMsCisJMHgwMDEwLCAweDc4ODMsIDB4NDAwNSwgMHhhOTk4LCAweDc5ODYsIDB4YTlhNCwgMHg3OTlhLCAweGE5YTgsCisJMHg3OTllLCAweDA4MGMsIDB4NGI1YiwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsCisJMHhkMDg0LCAweDE5MGMsIDB4MTE5YiwgMHg3MDA3LCAweDAwMDEsIDB4MjA5MSwgMHg1MDAwLCAweDcwMGYsCisJMHgwMDAwLCAweDAxMmUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGM2LCAweDIwNjEsCisJMHgxOWY5LCAweDc5ODQsIDB4NjE1MiwgMHg2MTRlLCAweDYwNTcsIDB4MDAwMCwgMHg2MDRiLCAweDAwMDksCisJMHg3ODk4LCAweDYwNmEsIDB4Nzg5YywgMHg2MDY2LCAweDc4ODgsIDB4NjA2MiwgMHg3ODhjLCAweDYwNWUsCisJMHgyMDAxLCAweDFhMDcsIDB4MjA0NCwgMHgyMDAxLCAweDFhMGUsIDB4YTA3NiwgMHhhMDYwLCAweGEwNzIsCisJMHhhMDdiLCAweDAwMDEsIDB4YTA3ZiwgMHgwMDAyLCAweGEwNmIsIDB4MDAwMCwgMHhhMDlmLCAweDAwMDAsCisJMHgwMGNlLCAweDAxMmUsIDB4MDgwNCwgMHgzNTgzLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwYjYsCisJMHgwMGM2LCAweDkwZTQsIDB4YzAwMCwgMHgwMTY4LCAweDAwMDYsIDB4ZDBkNCwgMHgwMTMwLCAweDAwMzYsCisJMHgyMDE5LCAweDAwMjksIDB4MDgwYywgMHgzMzM4LCAweDAwM2UsIDB4MDgwYywgMHhjY2QzLCAweDAwMGUsCisJMHgxMTk4LCAweGQwZTQsIDB4MDE2MCwgMHg5MTgwLCAweDEwMDAsIDB4MjAwNCwgMHg5MDVkLCAweDAxNjAsCisJMHgwODBjLCAweDYwYzcsIDB4MDgwYywgMHhhZWFkLCAweDAxMTAsIDB4YjgxNywgMHgwMDAwLCAweDkwMDYsCisJMHgwMGNlLCAweDAwYmUsIDB4MDEyZSwgMHgwMDA1LCAweDkwODUsIDB4MDAwMSwgMHgwY2M4LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDE1NiwgMHgyMDEwLCAweDkwMGUsIDB4MjBhOSwgMHgwODAwLCAweDAwMTYsCisJMHg5MTgwLCAweDEwMDAsIDB4MjAwNCwgMHg5MDA1LCAweDAxODgsIDB4OTE4NiwgMHgwMDdlLCAweDAxNzAsCisJMHg5MTg2LCAweDAwN2YsIDB4MDE1OCwgMHg5MTg2LCAweDAwODAsIDB4MDE0MCwgMHg5MTg2LCAweDAwZmYsCisJMHgwMTI4LCAweDAwMjYsIDB4MjIwMCwgMHgwODBjLCAweDU3MGMsIDB4MDAyZSwgMHgwMDFlLCAweDgxMDgsCisJMHgxZjA0LCAweDU3M2YsIDB4MDE1ZSwgMHgwMTJlLCAweDAwMDUsIDB4MjAwMSwgMHgxODQ4LCAweDIwMDQsCisJMHgwMDA1LCAweDIwMDEsIDB4MTg2NywgMHgyMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweDE4MTAsCisJMHgyMDA0LCAweGQwZDQsIDB4MDAwZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgwZSwgMHgyMDA0LCAweGQwYjQsCisJMHgwMDA1LCAweDIwMDEsIDB4MTgwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwMywgMHgwMDA1LCAweDAwMTYsCisJMHgwMGU2LCAweDIwNzEsIDB4MTg5ZSwgMHg3MTA4LCAweDkxMGQsIDB4NzEwYSwgMHgwMGVlLCAweDAwMWUsCisJMHgwMDA1LCAweDc5YTQsIDB4OTE4MiwgMHgwMDgxLCAweDFhMDQsIDB4MzViOCwgMHg4MTBjLCAweDAwMTYsCisJMHgwODBjLCAweDRiMWYsIDB4MDE3MCwgMHgwODBjLCAweDBmMDcsIDB4MjEwMCwgMHgyMjM4LCAweDdkODQsCisJMHg3Yzg4LCAweDdiOGMsIDB4N2E5MCwgMHgwMDFlLCAweDA4MGMsIDB4NGI2OCwgMHg3MDFmLCAweDU3OWQsCisJMHgwMDA1LCAweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDM1YjUsIDB4MjA3OSwgMHgwMDAwLCAweDdkOTQsCisJMHg3Yzk4LCAweDdiYTgsIDB4N2FhYywgMHg3OWE0LCAweDgxMGMsIDB4MjA2MSwgMHgxOGI4LCAweDJjNDQsCisJMHhhNzcwLCAweGEwNzQsIDB4MjA3MSwgMHgxODllLCAweDA4MGMsIDB4NGI2YiwgMHg3MDFmLCAweDU3YjEsCisJMHgwMDA1LCAweDIwNjEsIDB4MThiOCwgMHgyYzQ0LCAweDAwMTYsIDB4MDAyNiwgMHhhMjcwLCAweGExNzQsCisJMHgwODBjLCAweDBmMGYsIDB4MDAyZSwgMHgwMDFlLCAweDA4MGMsIDB4MGZiYywgMHg5MDA2LCAweGE4MDIsCisJMHhhODA2LCAweDA4MDQsIDB4MzU4MywgMHgwMTI2LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxYzYsCisJMHgwMWQ2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksCisJMHgwMjAwLCAweDIwNzEsIDB4MTgwMCwgMHg2MDQ0LCAweGQwYTQsIDB4MTFlOCwgMHhkMDg0LCAweDAxMTgsCisJMHgwODBjLCAweDU5NmMsIDB4MDA2OCwgMHhkMDhjLCAweDAxMTgsIDB4MDgwYywgMHg1ODc1LCAweDAwNDAsCisJMHhkMDk0LCAweDAxMTgsIDB4MDgwYywgMHg1ODQ1LCAweDAwMTgsIDB4ZDA5YywgMHgwMTA4LCAweDAwOTksCisJMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAxZGUsIDB4MDFjZSwgMHgwMTRlLCAweDAxM2UsCisJMHgwMTVlLCAweDAxMmUsIDB4MDAwNSwgMHgwMDE2LCAweDYxMjgsIDB4ZDE5YywgMHgxMTEwLCAweGMxOWQsCisJMHg2MTJhLCAweDAwMWUsIDB4MGM2OCwgMHgwMDA2LCAweDcwOTgsIDB4OTAwNSwgMHgwMDBlLCAweDAxMjAsCisJMHg3MDliLCAweDAwMDAsIDB4NzA5MywgMHgwMDAwLCAweDYyNGMsIDB4OTI4NiwgMHhmMGYwLCAweDExNTAsCisJMHg2MDQ4LCAweDkwODYsIDB4ZjBmMCwgMHgwMTMwLCAweDYyNGEsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsCisJMHgwMDEwLCAweDA0OTAsIDB4OTI5NCwgMHhmZjAwLCAweDkyOTYsIDB4ZjcwMCwgMHgwMTc4LCAweDcxMzgsCisJMHhkMWE0LCAweDExNjAsIDB4NjI0MCwgMHg5Mjk1LCAweDAxMDAsIDB4NjI0MiwgMHg5Mjk0LCAweDAwMTAsCisJMHgwMTI4LCAweDIwMDksIDB4MDBmNywgMHgwODBjLCAweDYwMjksIDB4MDBmMCwgMHg2MDQwLCAweDkwODQsCisJMHgwMDEwLCAweDkwODUsIDB4MDE0MCwgMHg2MDQyLCAweDYwNDMsIDB4MDAwMCwgMHg3MDg3LCAweDAwMDAsCisJMHg3MGEzLCAweDAwMDEsIDB4NzBjNywgMHgwMDAwLCAweDcwZGYsIDB4MDAwMCwgMHgyMDA5LCAweDFjODAsCisJMHgyMDBiLCAweDAwMDAsIDB4NzA5NywgMHgwMDAwLCAweDcwOGIsIDB4MDAwZiwgMHgyMDA5LCAweDAwMGYsCisJMHgyMDExLCAweDVmMGYsIDB4MDgwYywgMHg4NjQ4LCAweDAwMDUsIDB4MjAwMSwgMHgxODY5LCAweDIwMDQsCisJMHhkMDhjLCAweDAxMTAsIDB4NzA1ZiwgMHhmZmZmLCAweDcwODgsIDB4OTAwNSwgMHgxNTI4LCAweDIwMTEsCisJMHg1ZjBmLCAweDA4MGMsIDB4ODViMCwgMHg2MDQwLCAweDkwOTQsIDB4MDAxMCwgMHg5Mjg1LCAweDAwMjAsCisJMHg2MDQyLCAweDIwYTksIDB4MDBjOCwgMHg2MDQ0LCAweGQwOGMsIDB4MTE2OCwgMHgxZjA0LCAweDU4NWIsCisJMHg2MjQyLCAweDcwOWIsIDB4MDAwMCwgMHg2MDQwLCAweDkwOTQsIDB4MDAxMCwgMHg5Mjg1LCAweDAwODAsCisJMHg2MDQyLCAweDYyNDIsIDB4MDA0OCwgMHg2MjQyLCAweDcwOWIsIDB4MDAwMCwgMHg3MDhmLCAweDAwMDAsCisJMHg5MDA2LCAweDA4MGMsIDB4NjBiMiwgMHgwMDAwLCAweDAwMDUsIDB4NzA4YywgMHg5MDhhLCAweDAwMDMsCisJMHgxYTBjLCAweDBkZDUsIDB4MDAwYiwgMHgwMDA1LCAweDU4N2YsIDB4NThkMCwgMHg1OTZiLCAweDAwZjYsCisJMHgwMDE2LCAweDY5MDAsIDB4OTE4YywgMHgwODAwLCAweDcwOGYsIDB4MDAwMSwgMHgyMDAxLCAweDAxNWQsCisJMHgyMDAzLCAweDAwMDAsIDB4NjgwMywgMHgwMGZjLCAweDIwYTksIDB4MDAwNCwgMHg2ODAwLCAweDkwODQsCisJMHgwMGZjLCAweDAxMjAsIDB4MWYwNCwgMHg1ODhlLCAweDA4MGMsIDB4MGRkNSwgMHg2OGEwLCAweDY4YTIsCisJMHg2ODljLCAweDY4OWUsIDB4Njg5OCwgMHg2ODlhLCAweGEwMDEsIDB4OTE4ZCwgMHgxNjAwLCAweDY5MDIsCisJMHgwMDFlLCAweDY4MzcsIDB4MDAyMCwgMHgwODBjLCAweDYwOGUsIDB4MjA3OSwgMHgxYzAwLCAweDc4MzMsCisJMHgxMTAxLCAweDc4MzcsIDB4MDAwMCwgMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwgMHgxODA1LCAweDIwZTksCisJMHgwMDAxLCAweDIwYTEsIDB4MWMwZSwgMHgyMGE5LCAweDAwMDQsIDB4NDAwMywgMHgwODBjLCAweGFiZmUsCisJMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwgMHgxYzAwLCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNDAsCisJMHgyMGE5LCAweDAwMTQsIDB4NDAwMywgMHg2MGMzLCAweDAwMGMsIDB4NjAwZiwgMHgwMDAwLCAweDA4MGMsCisJMHg1ZjQwLCAweDAwZmUsIDB4OTAwNiwgMHg3MDkyLCAweDYwNDMsIDB4MDAwOCwgMHg2MDQyLCAweDAwMDUsCisJMHgwMGY2LCAweDcwOTAsIDB4NzA5MywgMHgwMDAwLCAweDkwMjUsIDB4MDkwNCwgMHg1OTQ4LCAweDYwMjAsCisJMHhkMGI0LCAweDE5MDQsIDB4NTk0NiwgMHg3MWEwLCAweDgxZmYsIDB4MDkwNCwgMHg1OTM0LCAweDk0ODYsCisJMHgwMDBjLCAweDE5MDQsIDB4NTk0MSwgMHg5NDgwLCAweDAwMTgsIDB4ODAwNCwgMHgyMGE4LCAweDA4MGMsCisJMHg2MDg3LCAweDIwMTEsIDB4MDI2MCwgMHgyMDE5LCAweDFjMDAsIDB4MjIwYywgMHgyMzA0LCAweDkxMDYsCisJMHgxMWU4LCAweDgyMTAsIDB4ODMxOCwgMHgxZjA0LCAweDU4ZWQsIDB4NjA0MywgMHgwMDA0LCAweDIwNjEsCisJMHgwMTQwLCAweDYwNWIsIDB4YmM5NCwgMHg2MDVmLCAweGYwZjAsIDB4MjA2MSwgMHgwMTAwLCAweDYwNDMsCisJMHgwMDA2LCAweDcwOGYsIDB4MDAwMiwgMHg3MDliLCAweDAwMDIsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsCisJMHg1ZjE2LCAweDA4MGMsIDB4ODY0OCwgMHgwODBjLCAweDYwOGUsIDB4MDRjMCwgMHgwODBjLCAweDYwODcsCisJMHgyMDc5LCAweDAyNjAsIDB4NzkzMCwgMHg5MThlLCAweDExMDEsIDB4MTU1OCwgMHg3ODM0LCAweDkwMDUsCisJMHgxNTQwLCAweDc5MDAsIDB4OTE4YywgMHgwMGZmLCAweDExMTgsIDB4NzgwNCwgMHg5MDA1LCAweDAxOTAsCisJMHgwODBjLCAweDYwODcsIDB4MjAxMSwgMHgwMjZlLCAweDIwMTksIDB4MTgwNSwgMHgyMGE5LCAweDAwMDQsCisJMHgyMjBjLCAweDIzMDQsIDB4OTEwMiwgMHgwMjMwLCAweDExYTAsIDB4ODIxMCwgMHg4MzE4LCAweDFmMDQsCisJMHg1OTI4LCAweDAwNzgsIDB4NzBhMywgMHgwMDAwLCAweDA4MGMsIDB4NjA4NywgMHgyMGUxLCAweDAwMDAsCisJMHgyMDk5LCAweDAyNjAsIDB4MjBlOSwgMHgwMDAxLCAweDIwYTEsIDB4MWMwMCwgMHgyMGE5LCAweDAwMTQsCisJMHg0MDAzLCAweDYwNDMsIDB4MDAwOCwgMHg2MDQzLCAweDAwMDAsIDB4MDAxMCwgMHgwMGZlLCAweDAwMDUsCisJMHg2MDQwLCAweDkwODUsIDB4MDEwMCwgMHg2MDQyLCAweDYwMjAsIDB4ZDBiNCwgMHgxZGI4LCAweDA4MGMsCisJMHhhYmZlLCAweDIwZTEsIDB4MDAwMSwgMHgyMDk5LCAweDFjMDAsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsCisJMHgwMjQwLCAweDIwYTksIDB4MDAxNCwgMHg0MDAzLCAweDYwYzMsIDB4MDAwYywgMHgyMDExLCAweDE5ZjAsCisJMHgyMDEzLCAweDAwMDAsIDB4NzA5MywgMHgwMDAwLCAweDYwYTMsIDB4MDA1NiwgMHg2MGE3LCAweDk1NzUsCisJMHgwODBjLCAweGEzNGQsIDB4MDhkOCwgMHgwMDA1LCAweDcwOTgsIDB4OTA4YSwgMHgwMDFkLCAweDFhMGMsCisJMHgwZGQ1LCAweDAwMGIsIDB4MDAwNSwgMHg1OTlkLCAweDU5YjAsIDB4NTlkOSwgMHg1OWY5LCAweDVhMWYsCisJMHg1YTRlLCAweDVhNzQsIDB4NWFhYywgMHg1YWQyLCAweDViMDAsIDB4NWIzYiwgMHg1YjczLCAweDViOTEsCisJMHg1YmJjLCAweDViZGUsIDB4NWJmOSwgMHg1YzAzLCAweDVjMzcsIDB4NWM1ZCwgMHg1YzhjLCAweDVjYjIsCisJMHg1Y2VhLCAweDVkMmUsIDB4NWQ2YiwgMHg1ZDhjLCAweDVkZTUsIDB4NWUwNywgMHg1ZTM1LCAweDVlMzUsCisJMHgwMGM2LCAweDIwNjEsIDB4MTgwMCwgMHg2MDAzLCAweDAwMDcsIDB4MjA2MSwgMHgwMTAwLCAweDYwMDQsCisJMHg5MDg0LCAweGZmZjksIDB4NjAwNiwgMHgwMGNlLCAweDAwMDUsIDB4MjA2MSwgMHgwMTQwLCAweDYwNWIsCisJMHhiYzk0LCAweDYwNWYsIDB4ZjBmMCwgMHgyMDYxLCAweDAxMDAsIDB4NjA0MywgMHgwMDAyLCAweDcwOWIsCisJMHgwMDAxLCAweDIwMDksIDB4MDdkMCwgMHgyMDExLCAweDVmMTYsIDB4MDgwYywgMHg4NjQ4LCAweDAwMDUsCisJMHgwMGY2LCAweDcwOTAsIDB4OTA4NiwgMHgwMDE0LCAweDE1MTAsIDB4NjA0MiwgMHg2MDIwLCAweGQwYjQsCisJMHgxMWYwLCAweDA4MGMsIDB4NjA4NywgMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LCAweDExMDIsCisJMHgxMWEwLCAweDc4MzQsIDB4OTAwNSwgMHgxMTg4LCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYzQsCisJMHg5MDA1LCAweDExMTAsIDB4NzBjNywgMHgwMDAxLCAweDIwMTEsIDB4NWYxNiwgMHgwODBjLCAweDg1YjAsCisJMHg3MDliLCAweDAwMTAsIDB4MDgwYywgMHg1YzAzLCAweDAwMTAsIDB4NzA5MywgMHgwMDAwLCAweDAwZmUsCisJMHgwMDA1LCAweDAwZjYsIDB4NzA5YiwgMHgwMDAzLCAweDYwNDMsIDB4MDAwNCwgMHgyMDExLCAweDVmMTYsCisJMHgwODBjLCAweDg1YjAsIDB4MDgwYywgMHg2MDBiLCAweDIwNzksIDB4MDI0MCwgMHg3ODMzLCAweDExMDIsCisJMHg3ODM3LCAweDAwMDAsIDB4MjBhOSwgMHgwMDA4LCAweDlmODgsIDB4MDAwZSwgMHgyMDBiLCAweDAwMDAsCisJMHg4MTA4LCAweDFmMDQsIDB4NTllZSwgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg1ZjQwLCAweDAwZmUsCisJMHgwMDA1LCAweDAwZjYsIDB4NzA5MCwgMHg5MDA1LCAweDA1MDAsIDB4MjAxMSwgMHg1ZjE2LCAweDA4MGMsCisJMHg4NWIwLCAweDkwODYsIDB4MDAxNCwgMHgxMWI4LCAweDA4MGMsIDB4NjA4NywgMHgyMDc5LCAweDAyNjAsCisJMHg3YTMwLCAweDkyOTYsIDB4MTEwMiwgMHgxMTc4LCAweDc4MzQsIDB4OTAwNSwgMHgxMTYwLCAweDdhMzgsCisJMHhkMmZjLCAweDAxMjgsIDB4NzBjNCwgMHg5MDA1LCAweDExMTAsIDB4NzBjNywgMHgwMDAxLCAweDcwOWIsCisJMHgwMDA0LCAweDAwMjksIDB4MDAxMCwgMHgwODBjLCAweDYwNjMsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsCisJMHg3MDliLCAweDAwMDUsIDB4MDgwYywgMHg2MDBiLCAweDIwNzksIDB4MDI0MCwgMHg3ODMzLCAweDExMDMsCisJMHg3ODM3LCAweDAwMDAsIDB4MDgwYywgMHg2MDg3LCAweDA4MGMsIDB4NjA2YSwgMHgxMTcwLCAweDcwODQsCisJMHg5MDA1LCAweDExNTgsIDB4NzE1YywgMHg5MTg2LCAweGZmZmYsIDB4MDEzOCwgMHgyMDExLCAweDAwMDgsCisJMHgwODBjLCAweDVlYzMsIDB4MDE2OCwgMHgwODBjLCAweDYwNDAsIDB4MjBhOSwgMHgwMDA4LCAweDIwZTEsCisJMHgwMDAwLCAweDIwOTksIDB4MDI2ZSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMjRlLCAweDQwMDMsCisJMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg1ZjQwLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOTAsCisJMHg5MDA1LCAweDA1MDAsIDB4MjAxMSwgMHg1ZjE2LCAweDA4MGMsIDB4ODViMCwgMHg5MDg2LCAweDAwMTQsCisJMHgxMWI4LCAweDA4MGMsIDB4NjA4NywgMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LCAweDExMDMsCisJMHgxMTc4LCAweDc4MzQsIDB4OTAwNSwgMHgxMTYwLCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYzQsCisJMHg5MDA1LCAweDExMTAsIDB4NzBjNywgMHgwMDAxLCAweDcwOWIsIDB4MDAwNiwgMHgwMDI5LCAweDAwMTAsCisJMHgwODBjLCAweDYwNjMsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5YiwgMHgwMDA3LCAweDA4MGMsCisJMHg2MDBiLCAweDIwNzksIDB4MDI0MCwgMHg3ODMzLCAweDExMDQsIDB4NzgzNywgMHgwMDAwLCAweDA4MGMsCisJMHg2MDg3LCAweDA4MGMsIDB4NjA2YSwgMHgxMWI4LCAweDcwODQsIDB4OTAwNSwgMHgxMWEwLCAweDcxNjQsCisJMHg5MTg2LCAweGZmZmYsIDB4MDE4MCwgMHg5MTgwLCAweDMzODQsIDB4MjAwZCwgMHg5MThjLCAweGZmMDAsCisJMHg4MTBmLCAweDIwMTEsIDB4MDAwOCwgMHgwODBjLCAweDVlYzMsIDB4MDE4MCwgMHgwODBjLCAweDUwNWEsCisJMHgwMTEwLCAweDA4MGMsIDB4MjhlNSwgMHgyMGE5LCAweDAwMDgsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksCisJMHgwMjZlLCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNGUsIDB4NDAwMywgMHg2MGMzLCAweDAwMTQsCisJMHgwODBjLCAweDVmNDAsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5MCwgMHg5MDA1LCAweDA1MDAsCisJMHgyMDExLCAweDVmMTYsIDB4MDgwYywgMHg4NWIwLCAweDkwODYsIDB4MDAxNCwgMHgxMWI4LCAweDA4MGMsCisJMHg2MDg3LCAweDIwNzksIDB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwNCwgMHgxMTc4LCAweDc4MzQsCisJMHg5MDA1LCAweDExNjAsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBjNCwgMHg5MDA1LCAweDExMTAsCisJMHg3MGM3LCAweDAwMDEsIDB4NzA5YiwgMHgwMDA4LCAweDAwMjksIDB4MDAxMCwgMHgwODBjLCAweDYwNjMsCisJMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDliLCAweDAwMDksIDB4MDgwYywgMHg2MDBiLCAweDIwNzksCisJMHgwMjQwLCAweDc4MzMsIDB4MTEwNSwgMHg3ODM3LCAweDAxMDAsIDB4MDgwYywgMHg2MDZhLCAweDExNTAsCisJMHg3MDg0LCAweDkwMDUsIDB4MTEzOCwgMHgwODBjLCAweDVlMzYsIDB4MTE4OCwgMHg5MDg1LCAweDAwMDEsCisJMHgwODBjLCAweDI4ZTUsIDB4MjBhOSwgMHgwMDA4LCAweDA4MGMsIDB4NjA4NywgMHgyMGUxLCAweDAwMDAsCisJMHgyMDk5LCAweDAyNmUsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0ZSwgMHg0MDAzLCAweDYwYzMsCisJMHgwMDE0LCAweDA4MGMsIDB4NWY0MCwgMHgwMDEwLCAweDA4MGMsIDB4NTk5MCwgMHgwMGZlLCAweDAwMDUsCisJMHgwMGY2LCAweDcwOTAsIDB4OTAwNSwgMHgwNWE4LCAweDIwMTEsIDB4NWYxNiwgMHgwODBjLCAweDg1YjAsCisJMHg5MDg2LCAweDAwMTQsIDB4MTU2MCwgMHgwODBjLCAweDYwODcsIDB4MjA3OSwgMHgwMjYwLCAweDdhMzAsCisJMHg5Mjk2LCAweDExMDUsIDB4MTUyMCwgMHg3ODM0LCAweDkwODQsIDB4MDEwMCwgMHgyMDExLCAweDAxMDAsCisJMHg5MjFlLCAweDExNjAsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBjNCwgMHg5MDA1LCAweDExMTAsCisJMHg3MGM3LCAweDAwMDEsIDB4NzA5YiwgMHgwMDBhLCAweDAwYjEsIDB4MDA5OCwgMHg5MDA1LCAweDExNzgsCisJMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGM0LCAweDkwMDUsIDB4MTExMCwgMHg3MGM3LCAweDAwMDEsCisJMHg3MDk3LCAweDAwMDAsIDB4NzA5YiwgMHgwMDBlLCAweDA4MGMsIDB4NWJkZSwgMHgwMDEwLCAweDA4MGMsCisJMHg2MDYzLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOWIsIDB4MDAwYiwgMHgyMDExLCAweDFjMGUsCisJMHgyMGU5LCAweDAwMDEsIDB4MjJhMCwgMHgyMGE5LCAweDAwNDAsIDB4MjAxOSwgMHhmZmZmLCAweDQzMDQsCisJMHgwODBjLCAweDYwMGIsIDB4MjA3OSwgMHgwMjQwLCAweDc4MzMsIDB4MTEwNiwgMHg3ODM3LCAweDAwMDAsCisJMHgwODBjLCAweDYwNmEsIDB4MDExOCwgMHgyMDEzLCAweDAwMDAsIDB4MDAyMCwgMHg3MDYwLCAweDkwODUsCisJMHgwMTAwLCAweDIwMTIsIDB4MjBhOSwgMHgwMDQwLCAweDIwMDksIDB4MDI0ZSwgMHgyMDExLCAweDFjMGUsCisJMHgyMjBlLCAweDgyMTAsIDB4ODEwOCwgMHg5MTg2LCAweDAyNjAsIDB4MTEyOCwgMHg2ODEwLCAweDgwMDAsCisJMHg2ODEyLCAweDIwMDksIDB4MDI0MCwgMHgxZjA0LCAweDViNjAsIDB4NjBjMywgMHgwMDg0LCAweDA4MGMsCisJMHg1ZjQwLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOTAsIDB4OTAwNSwgMHgwMWMwLCAweDIwMTEsCisJMHg1ZjE2LCAweDA4MGMsIDB4ODViMCwgMHg5MDg2LCAweDAwODQsIDB4MTE3OCwgMHgwODBjLCAweDYwODcsCisJMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LCAweDExMDYsIDB4MTEzOCwgMHg3ODM0LCAweDkwMDUsCisJMHgxMTIwLCAweDcwOWIsIDB4MDAwYywgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg2MDYzLCAweDAwZmUsCisJMHgwMDA1LCAweDAwZjYsIDB4NzA5YiwgMHgwMDBkLCAweDA4MGMsIDB4NjAwYiwgMHgyMDc5LCAweDAyNDAsCisJMHg3ODMzLCAweDExMDcsIDB4NzgzNywgMHgwMDAwLCAweDA4MGMsIDB4NjA4NywgMHgyMGE5LCAweDAwNDAsCisJMHgyMDExLCAweDAyNmUsIDB4MjAwOSwgMHgwMjRlLCAweDIyMGUsIDB4ODIxMCwgMHg4MTA4LCAweDkxODYsCisJMHgwMjYwLCAweDExNTAsIDB4NjgxMCwgMHg4MDAwLCAweDY4MTIsIDB4MjAwOSwgMHgwMjQwLCAweDY4MTQsCisJMHg4MDAwLCAweDY4MTYsIDB4MjAxMSwgMHgwMjYwLCAweDFmMDQsIDB4NWJhNCwgMHg2MGMzLCAweDAwODQsCisJMHgwODBjLCAweDVmNDAsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5MCwgMHg5MDA1LCAweDAxZTAsCisJMHgyMDExLCAweDVmMTYsIDB4MDgwYywgMHg4NWIwLCAweDkwODYsIDB4MDA4NCwgMHgxMTk4LCAweDA4MGMsCisJMHg2MDg3LCAweDIwNzksIDB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwNywgMHgxMTU4LCAweDc4MzQsCisJMHg5MDA1LCAweDExNDAsIDB4NzA5NywgMHgwMDAxLCAweDA4MGMsIDB4NWZkZCwgMHg3MDliLCAweDAwMGUsCisJMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg2MDYzLCAweDAwZmUsIDB4MDAwNSwgMHg5MThkLCAweDAwMDEsCisJMHgwODBjLCAweDYwYjIsIDB4NzA5YiwgMHgwMDBmLCAweDcwOTMsIDB4MDAwMCwgMHgyMDYxLCAweDAxNDAsCisJMHg2MDViLCAweGJjODUsIDB4NjA1ZiwgMHhiNWI1LCAweDIwNjEsIDB4MDEwMCwgMHg2MDQzLCAweDAwMDUsCisJMHg2MDQzLCAweDAwMDQsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsIDB4NWYxNiwgMHgwODBjLCAweDg1YTQsCisJMHgwMDA1LCAweDcwOTAsIDB4OTAwNSwgMHgwMTMwLCAweDIwMTEsIDB4NWYxNiwgMHgwODBjLCAweDg1YjAsCisJMHg3MDliLCAweDAwMDAsIDB4MDAwNSwgMHg3MDliLCAweDAwMTEsIDB4MDgwYywgMHhhYmZlLCAweDA4MGMsCisJMHg2MDg3LCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAyNjAsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsCisJMHgwMjQwLCAweDc0OTAsIDB4OTQ4MCwgMHgwMDE4LCAweDkwODAsIDB4MDAwNywgMHg5MDg0LCAweDAzZjgsCisJMHg4MDA0LCAweDIwYTgsIDB4NDAwMywgMHgwODBjLCAweDYwNmEsIDB4MTFhMCwgMHg3MTdjLCAweDgxZmYsCisJMHgwMTg4LCAweDkwMGUsIDB4NzA4MCwgMHg5MDg0LCAweDAwZmYsIDB4MDE2MCwgMHgwODBjLCAweDI4N2MsCisJMHg5MTg2LCAweDAwN2UsIDB4MDEzOCwgMHg5MTg2LCAweDAwODAsIDB4MDEyMCwgMHgyMDExLCAweDAwMDgsCisJMHgwODBjLCAweDVlYzMsIDB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NWY0MCwgMHgwMDA1LCAweDAwZjYsCisJMHg3MDkwLCAweDkwMDUsIDB4MDUwMCwgMHgyMDExLCAweDVmMTYsIDB4MDgwYywgMHg4NWIwLCAweDkwODYsCisJMHgwMDE0LCAweDExYjgsIDB4MDgwYywgMHg2MDg3LCAweDIwNzksIDB4MDI2MCwgMHg3YTMwLCAweDkyOTYsCisJMHgxMTAzLCAweDExNzgsIDB4NzgzNCwgMHg5MDA1LCAweDExNjAsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsCisJMHg3MGM0LCAweDkwMDUsIDB4MTExMCwgMHg3MGM3LCAweDAwMDEsIDB4NzA5YiwgMHgwMDEyLCAweDAwMjksCisJMHgwMDEwLCAweDcwOTMsIDB4MDAwMCwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDliLCAweDAwMTMsCisJMHgwODBjLCAweDYwMTksIDB4MjA3OSwgMHgwMjQwLCAweDc4MzMsIDB4MTEwMywgMHg3ODM3LCAweDAwMDAsCisJMHgwODBjLCAweDYwODcsIDB4MDgwYywgMHg2MDZhLCAweDExNzAsIDB4NzA4NCwgMHg5MDA1LCAweDExNTgsCisJMHg3MTVjLCAweDkxODYsIDB4ZmZmZiwgMHgwMTM4LCAweDIwMTEsIDB4MDAwOCwgMHgwODBjLCAweDVlYzMsCisJMHgwMTY4LCAweDA4MGMsIDB4NjA0MCwgMHgyMGE5LCAweDAwMDgsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksCisJMHgwMjZlLCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNGUsIDB4NDAwMywgMHg2MGMzLCAweDAwMTQsCisJMHgwODBjLCAweDVmNDAsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5MCwgMHg5MDA1LCAweDA1MDAsCisJMHgyMDExLCAweDVmMTYsIDB4MDgwYywgMHg4NWIwLCAweDkwODYsIDB4MDAxNCwgMHgxMWI4LCAweDA4MGMsCisJMHg2MDg3LCAweDIwNzksIDB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwNCwgMHgxMTc4LCAweDc4MzQsCisJMHg5MDA1LCAweDExNjAsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBjNCwgMHg5MDA1LCAweDExMTAsCisJMHg3MGM3LCAweDAwMDEsIDB4NzA5YiwgMHgwMDE0LCAweDAwMjksIDB4MDAxMCwgMHg3MDkzLCAweDAwMDAsCisJMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDliLCAweDAwMTUsIDB4MDgwYywgMHg2MDE5LCAweDIwNzksCisJMHgwMjQwLCAweDc4MzMsIDB4MTEwNCwgMHg3ODM3LCAweDAwMDAsIDB4MDgwYywgMHg2MDg3LCAweDA4MGMsCisJMHg2MDZhLCAweDExYjgsIDB4NzA4NCwgMHg5MDA1LCAweDExYTAsIDB4NzE2NCwgMHg5MTg2LCAweGZmZmYsCisJMHgwMTgwLCAweDkxODAsIDB4MzM4NCwgMHgyMDBkLCAweDkxOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDIwMTEsCisJMHgwMDA4LCAweDA4MGMsIDB4NWVjMywgMHgwMTgwLCAweDA4MGMsIDB4NTA1YSwgMHgwMTEwLCAweDA4MGMsCisJMHgyOGU1LCAweDIwYTksIDB4MDAwOCwgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwgMHgwMjZlLCAweDIwZTksCisJMHgwMDAwLCAweDIwYTEsIDB4MDI0ZSwgMHg0MDAzLCAweDYwYzMsIDB4MDAxNCwgMHgwODBjLCAweDVmNDAsCisJMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDkwLCAweDkwMDUsIDB4MDVmMCwgMHgyMDExLCAweDVmMTYsCisJMHgwODBjLCAweDg1YjAsIDB4OTA4NiwgMHgwMDE0LCAweDE1YTgsIDB4MDgwYywgMHg2MDg3LCAweDIwNzksCisJMHgwMjYwLCAweDdhMzAsIDB4OTI5NiwgMHgxMTA1LCAweDE1NjgsIDB4NzgzNCwgMHg5MDg0LCAweDAxMDAsCisJMHgyMDExLCAweDAxMDAsIDB4OTIxZSwgMHgxMTY4LCAweDkwODUsIDB4MDAwMSwgMHgwODBjLCAweDYwYjIsCisJMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGM0LCAweDkwMDUsIDB4MTExMCwgMHg3MGM3LCAweDAwMDEsCisJMHgwMDgwLCAweDkwMDUsIDB4MTFiOCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGM0LCAweDkwMDUsCisJMHgxMTEwLCAweDcwYzcsIDB4MDAwMSwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywgMHg2MGIyLCAweDcwOTcsCisJMHgwMDAwLCAweDdhMzgsIDB4ZDJmNCwgMHgwMTEwLCAweDcwZGYsIDB4MDAwOCwgMHg3MDliLCAweDAwMTYsCisJMHgwMDI5LCAweDAwMTAsIDB4NzA5MywgMHgwMDAwLCAweDAwZmUsIDB4MDAwNSwgMHgwODBjLCAweGFiZmUsCisJMHgwODBjLCAweDYwODcsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDI2MCwgMHgyMGU5LCAweDAwMDAsCisJMHgyMGExLCAweDAyNDAsIDB4MjBhOSwgMHgwMDBlLCAweDQwMDMsIDB4MjAxMSwgMHgwMjZkLCAweDIyMDQsCisJMHg5MDg0LCAweDAxMDAsIDB4MjAxMSwgMHgwMjRkLCAweDIwMTIsIDB4MjAxMSwgMHgwMjZlLCAweDcwOWIsCisJMHgwMDE3LCAweDA4MGMsIDB4NjA2YSwgMHgxMTUwLCAweDcwODQsIDB4OTAwNSwgMHgxMTM4LCAweDA4MGMsCisJMHg1ZTM2LCAweDExODgsIDB4OTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4MjhlNSwgMHgyMGE5LCAweDAwMDgsCisJMHgwODBjLCAweDYwODcsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDI2ZSwgMHgyMGU5LCAweDAwMDAsCisJMHgyMGExLCAweDAyNGUsIDB4NDAwMywgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg1ZjQwLCAweDAwMTAsCisJMHgwODBjLCAweDU5OTAsIDB4MDAwNSwgMHgwMGY2LCAweDcwOTAsIDB4OTAwNSwgMHgwMWQ4LCAweDIwMTEsCisJMHg1ZjE2LCAweDA4MGMsIDB4ODViMCwgMHg5MDg2LCAweDAwODQsIDB4MTE5MCwgMHgwODBjLCAweDYwODcsCisJMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LCAweDExMDYsIDB4MTE1MCwgMHg3ODM0LCAweDkwMDUsCisJMHgxMTM4LCAweDkwMDYsIDB4MDgwYywgMHg2MGIyLCAweDcwOWIsIDB4MDAxOCwgMHgwMDI5LCAweDAwMTAsCisJMHg3MDkzLCAweDAwMDAsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5YiwgMHgwMDE5LCAweDA4MGMsCisJMHg2MDE5LCAweDIwNzksIDB4MDI0MCwgMHg3ODMzLCAweDExMDYsIDB4NzgzNywgMHgwMDAwLCAweDA4MGMsCisJMHg2MDg3LCAweDIwMDksIDB4MDI2ZSwgMHgyMDM5LCAweDFjMGUsIDB4MjBhOSwgMHgwMDQwLCAweDIxM2UsCisJMHg4NzM4LCAweDgxMDgsIDB4OTE4NiwgMHgwMjgwLCAweDExMjgsIDB4NjgxNCwgMHg4MDAwLCAweDY4MTYsCisJMHgyMDA5LCAweDAyNjAsIDB4MWYwNCwgMHg1ZDlmLCAweDIwMzksIDB4MWMwZSwgMHgwODBjLCAweDYwNmEsCisJMHgxMWU4LCAweDI3MjgsIDB4MjUxNCwgMHg4MjA3LCAweDkwODQsIDB4MDBmZiwgMHg4MDAwLCAweDIwMTgsCisJMHg5Mjk0LCAweDAwZmYsIDB4ODAwNywgMHg5MjA1LCAweDIwMmEsIDB4NzA2MCwgMHgyMzEwLCAweDgyMTQsCisJMHg5MmEwLCAweDFjMGUsIDB4MjQxNCwgMHg5MzhjLCAweDAwMDEsIDB4MDExOCwgMHg5Mjk0LCAweGZmMDAsCisJMHgwMDE4LCAweDkyOTQsIDB4MDBmZiwgMHg4MDA3LCAweDkyMTUsIDB4MjIyMiwgMHgyMGE5LCAweDAwNDAsCisJMHgyMDA5LCAweDAyNGUsIDB4MjcwZSwgMHg4NzM4LCAweDgxMDgsIDB4OTE4NiwgMHgwMjYwLCAweDExMjgsCisJMHg2ODEwLCAweDgwMDAsIDB4NjgxMiwgMHgyMDA5LCAweDAyNDAsIDB4MWYwNCwgMHg1ZGQyLCAweDYwYzMsCisJMHgwMDg0LCAweDA4MGMsIDB4NWY0MCwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDkwLCAweDkwMDUsCisJMHgwMWUwLCAweDIwMTEsIDB4NWYxNiwgMHgwODBjLCAweDg1YjAsIDB4OTA4NiwgMHgwMDg0LCAweDExOTgsCisJMHgwODBjLCAweDYwODcsIDB4MjA3OSwgMHgwMjYwLCAweDdhMzAsIDB4OTI5NiwgMHgxMTA3LCAweDExNTgsCisJMHg3ODM0LCAweDkwMDUsIDB4MTE0MCwgMHg3MDk3LCAweDAwMDEsIDB4MDgwYywgMHg1ZmRkLCAweDcwOWIsCisJMHgwMDFhLCAweDAwMjksIDB4MDAxMCwgMHg3MDkzLCAweDAwMDAsIDB4MDBmZSwgMHgwMDA1LCAweDkwODUsCisJMHgwMDAxLCAweDA4MGMsIDB4NjBiMiwgMHg3MDliLCAweDAwMWIsIDB4MDgwYywgMHhhYmZlLCAweDA4MGMsCisJMHg2MDg3LCAweDIwMTEsIDB4MDI2MCwgMHgyMDA5LCAweDAyNDAsIDB4NzQ5MCwgMHg5NDgwLCAweDAwMTgsCisJMHg5MDgwLCAweDAwMDcsIDB4OTA4NCwgMHgwM2Y4LCAweDgwMDQsIDB4MjBhOCwgMHgyMjBlLCAweDgyMTAsCisJMHg4MTA4LCAweDkxODYsIDB4MDI2MCwgMHgxMTUwLCAweDY4MTAsIDB4ODAwMCwgMHg2ODEyLCAweDIwMDksCisJMHgwMjQwLCAweDY4MTQsIDB4ODAwMCwgMHg2ODE2LCAweDIwMTEsIDB4MDI2MCwgMHgxZjA0LCAweDVlMWUsCisJMHg2MGMzLCAweDAwODQsIDB4MDgwYywgMHg1ZjQwLCAweDAwMDUsIDB4MDAwNSwgMHgwMDg2LCAweDAwOTYsCisJMHgyMDI5LCAweDE4NDgsIDB4MjUyYywgMHgyMGE5LCAweDAwMDgsIDB4MjA0MSwgMHgxYzBlLCAweDIwZTksCisJMHgwMDAxLCAweDI4YTAsIDB4MDgwYywgMHg2MDg3LCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAyNmUsCisJMHg0MDAzLCAweDIwYTksIDB4MDAwOCwgMHgyMDExLCAweDAwMDcsIDB4ZDVkNCwgMHgwMTA4LCAweDkwMTYsCisJMHgyODAwLCAweDkyMDAsIDB4MjAwYywgMHg5MWE2LCAweGZmZmYsIDB4MTE0OCwgMHhkNWQ0LCAweDAxMTAsCisJMHg4MjEwLCAweDAwMDgsIDB4ODIxMSwgMHgxZjA0LCAweDVlNTAsIDB4MDgwNCwgMHg1ZWJmLCAweDgyZmYsCisJMHgxMTYwLCAweGQ1ZDQsIDB4MDEyMCwgMHg5MWE2LCAweDNmZmYsIDB4MGQ5MCwgMHgwMDIwLCAweDkxYTYsCisJMHgzZmZmLCAweDA5MDQsIDB4NWViZiwgMHg5MThkLCAweGMwMDAsIDB4MjBhOSwgMHgwMDEwLCAweDIwMTksCisJMHgwMDAxLCAweGQ1ZDQsIDB4MDExMCwgMHgyMDE5LCAweDAwMTAsIDB4MjEyMCwgMHhkNWQ0LCAweDAxMTAsCisJMHg4NDIzLCAweDAwMDgsIDB4ODQyNCwgMHgxMjQwLCAweGQ1ZDQsIDB4MDExMCwgMHg4MzE5LCAweDAwMDgsCisJMHg4MzE4LCAweDFmMDQsIDB4NWU3NiwgMHgwNGQ4LCAweDIzYTgsIDB4MjAyMSwgMHgwMDAxLCAweDg0MjYsCisJMHg4NDI1LCAweDFmMDQsIDB4NWU4OCwgMHgyMzI4LCAweDg1MjksIDB4OTJiZSwgMHgwMDA3LCAweDAxNTgsCisJMHgwMDA2LCAweDIwMzksIDB4MDAwNywgMHgyMjAwLCAweDk3M2EsIDB4MDAwZSwgMHgyN2E4LCAweDk1YTgsCisJMHgwMDEwLCAweDFmMDQsIDB4NWU5NywgMHg3NTVlLCAweDk1YzgsIDB4MzM4NCwgMHgyOTJkLCAweDk1YWMsCisJMHgwMGZmLCAweDc1ODIsIDB4NjUzMiwgMHg2NTM2LCAweDAwMTYsIDB4MjUwOCwgMHgwODBjLCAweDI4YzUsCisJMHgwMDFlLCAweDYwZTcsIDB4MDAwMCwgMHg2NWVhLCAweDIwMTgsIDB4MjMwNCwgMHg5NDA1LCAweDIwMWEsCisJMHg3MDg3LCAweDAwMDEsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0ZSwgMHgyMGUxLCAweDAwMDEsCisJMHgyODk4LCAweDIwYTksIDB4MDAwOCwgMHg0MDAzLCAweDkwODUsIDB4MDAwMSwgMHgwMDA4LCAweDkwMDYsCisJMHgwMDllLCAweDAwOGUsIDB4MDAwNSwgMHgwMTU2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsCisJMHgyMmE4LCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAyNmUsIDB4MjBlOSwgMHgwMDAwLCAweDIwMTEsCisJMHgwMjRlLCAweDIyYTAsIDB4NDAwMywgMHgwMTRlLCAweDAxM2UsIDB4MDFkZSwgMHgwMWNlLCAweDAxNWUsCisJMHgyMTE4LCAweDkwMjYsIDB4MjAwMSwgMHgwMDA3LCAweDkzOWEsIDB4MDAxMCwgMHgwMjE4LCAweDg0MjAsCisJMHg4MDAxLCAweDBjZDAsIDB4MjExOCwgMHg4NGZmLCAweDAxMjAsIDB4OTM5YSwgMHgwMDEwLCAweDg0MjEsCisJMHgxZGUwLCAweDIwMjEsIDB4MDAwMSwgMHg4M2ZmLCAweDAxMTgsIDB4ODQyMywgMHg4MzE5LCAweDFkZTgsCisJMHg5MjM4LCAweDIwMjksIDB4MDI2ZSwgMHg5NTI4LCAweDI1MDQsIDB4OTQyYywgMHgxMWI4LCAweDk0MDUsCisJMHgyMDNhLCAweDcxNWUsIDB4OTFhMCwgMHgzMzg0LCAweDI0MmQsIDB4OTVhYywgMHgwMGZmLCAweDc1ODIsCisJMHg2NTMyLCAweDY1MzYsIDB4MDAxNiwgMHgyNTA4LCAweDA4MGMsIDB4MjhjNSwgMHgwMDFlLCAweDYwZTcsCisJMHgwMDAwLCAweDY1ZWEsIDB4NzA4NywgMHgwMDAxLCAweDkwODQsIDB4MDAwMCwgMHgwMDA1LCAweDAwZTYsCisJMHgyMDcxLCAweDE4MDAsIDB4NzA4YiwgMHgwMDAwLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwZjYsCisJMHgyMDc5LCAweDAxMDAsIDB4MjA3MSwgMHgwMTQwLCAweDA4MGMsIDB4NWZjYywgMHgwODBjLCAweGEzNTYsCisJMHg3MDA0LCAweDkwODQsIDB4NDAwMCwgMHgwMTEwLCAweDA4MGMsIDB4MmQ1ZSwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDIwNzEsIDB4MTgyNiwgMHgyMDczLCAweDAwMDAsIDB4Nzg0MCwgMHgwMDI2LCAweDAwMTYsCisJMHgyMDA5LCAweDAwZjcsIDB4MDgwYywgMHg2MDI5LCAweDAwMWUsIDB4OTA5NCwgMHgwMDEwLCAweDkyODUsCisJMHgwMDgwLCAweDc4NDIsIDB4N2E0MiwgMHgwMDJlLCAweDAxMmUsIDB4MDBmZSwgMHgwMGVlLCAweDAwMDUsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDJiZTMsIDB4MDIyOCwgMHgyMDExLCAweDAxMDEsCisJMHgyMjA0LCAweGMwYzUsIDB4MjAxMiwgMHgyMDExLCAweDE5ZjAsIDB4MjAxMywgMHgwMDAwLCAweDcwOTMsCisJMHgwMDAwLCAweDAxMmUsIDB4NjBhMywgMHgwMDU2LCAweDYwYTcsIDB4OTU3NSwgMHgwODBjLCAweGEzNGQsCisJMHg2MTQ0LCAweGQxODQsIDB4MDEyMCwgMHg3MTk4LCAweDkxOGQsIDB4MjAwMCwgMHgwMDE4LCAweDcxOGMsCisJMHg5MThkLCAweDEwMDAsIDB4MjAxMSwgMHgxOTk4LCAweDIxMTIsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsCisJMHg1ZjE2LCAweDA4MGMsIDB4ODY0OCwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwMGM2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHhhZWI0LCAweDIwMDksIDB4MDBmNywgMHgwODBjLCAweDYwMjksCisJMHgyMDYxLCAweDE5ZjksIDB4OTAwZSwgMHg2MTFhLCAweDYxMWUsIDB4NjE3MiwgMHg2MTc2LCAweDIwNjEsCisJMHgxODAwLCAweDYwMDMsIDB4MDAwMSwgMHgyMDYxLCAweDAxMDAsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsCisJMHgwMDEwLCAweDIwMDksIDB4MTk5OCwgMHgyMDBiLCAweDAwMDAsIDB4MjAwOSwgMHgwMDJkLCAweDIwMTEsCisJMHg1Zjk4LCAweDA4MGMsIDB4ODVhNCwgMHgwMTJlLCAweDAwY2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsCisJMHgwMGU2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDQ3MSwgMHgyMDcxLCAweDAxMDAsCisJMHgwODBjLCAweGEzNTYsIDB4MjA3MSwgMHgwMTQwLCAweDcwMDQsIDB4OTA4NCwgMHg0MDAwLCAweDAxMTAsCisJMHgwODBjLCAweDJkNWUsIDB4MDgwYywgMHg3NDQ2LCAweDAxODgsIDB4MDgwYywgMHg3NDYxLCAweDExNzAsCisJMHgwODBjLCAweDc3MmUsIDB4MDAxNiwgMHgwODBjLCAweDI5OTQsIDB4MjAwMSwgMHgxOTZjLCAweDIxMDIsCisJMHgwMDFlLCAweDA4MGMsIDB4NzcyOSwgMHgwODBjLCAweDczNmEsIDB4MDA1MCwgMHgyMDA5LCAweDAwMDEsCisJMHgwODBjLCAweDJjN2MsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjgyOCwgMHgwODBjLCAweDVmNmMsCisJMHgwMTJlLCAweDAwMGUsIDB4MDBlZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgwZSwgMHgyMDA0LCAweGQwYmMsCisJMHgwMTU4LCAweDAwMjYsIDB4MDAzNiwgMHgyMDExLCAweDgwMTcsIDB4MjAwMSwgMHgxOTk4LCAweDIwMWMsCisJMHgwODBjLCAweDRiN2YsIDB4MDAzZSwgMHgwMDJlLCAweDAwMDUsIDB4MjBhOSwgMHgwMDEyLCAweDIwZTksCisJMHgwMDAxLCAweDIwYTEsIDB4MWM4MCwgMHgwODBjLCAweDYwODcsIDB4MjBlOSwgMHgwMDAwLCAweDIwOTksCisJMHgwMjZlLCAweDAwOTksIDB4MjBhOSwgMHgwMDIwLCAweDA4MGMsIDB4NjA4MSwgMHgyMDk5LCAweDAyNjAsCisJMHgyMGExLCAweDFjOTIsIDB4MDA1MSwgMHgyMGE5LCAweDAwMGUsIDB4MDgwYywgMHg2MDg0LCAweDIwOTksCisJMHgwMjYwLCAweDIwYTEsIDB4MWNiMiwgMHgwMDA5LCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDM0MTAsCisJMHgzMzA4LCAweDIxMDQsIDB4ODAwNywgMHgyMDEyLCAweDgxMDgsIDB4ODIxMCwgMHgxZjA0LCAweDYwMDEsCisJMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwODBjLCAweGFiZmUsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksCisJMHgxYzAwLCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNDAsIDB4MjBhOSwgMHgwMDBjLCAweDQwMDMsCisJMHgwMDA1LCAweDA4MGMsIDB4YWJmZSwgMHgwODBjLCAweDYwODcsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksCisJMHgwMjYwLCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNDAsIDB4MjBhOSwgMHgwMDBjLCAweDQwMDMsCisJMHgwMDA1LCAweDAwYzYsIDB4MDAwNiwgMHgyMDYxLCAweDAxMDAsIDB4ODEwZiwgMHgyMDAxLCAweDE4MzQsCisJMHgyMDA0LCAweDkwMDUsIDB4MTEzOCwgMHgyMDAxLCAweDE4MTgsIDB4MjAwNCwgMHg5MDg0LCAweDAwZmYsCisJMHg5MTA1LCAweDAwMTAsIDB4OTE4NSwgMHgwMGY3LCAweDYwNGEsIDB4MDAwZSwgMHgwMGNlLCAweDAwMDUsCisJMHgwMDE2LCAweDAwNDYsIDB4MDgwYywgMHg2YTA4LCAweDAxNTgsIDB4OTAwNiwgMHgyMDIwLCAweDIwMDksCisJMHgwMDJhLCAweDA4MGMsIDB4ZTczYSwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHhjMTk1LCAweDIxMDIsCisJMHgyMDE5LCAweDAwMmEsIDB4OTAwZSwgMHgwODBjLCAweDMxZTksIDB4MDgwYywgMHhkMzg4LCAweDAxNDAsCisJMHgwMDM2LCAweDIwMTksIDB4ZmZmZiwgMHgyMDIxLCAweDAwMDcsIDB4MDgwYywgMHg0ZDM2LCAweDAwM2UsCisJMHgwMDRlLCAweDAwMWUsIDB4MDAwNSwgMHgwODBjLCAweDVmNmMsIDB4NzA5YiwgMHgwMDAwLCAweDcwOTMsCisJMHgwMDAwLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweDE4MGMsIDB4MjAwNCwgMHhkMDljLCAweDAxMDAsCisJMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDEsCisJMHgwMTAxLCAweDIwMGMsIDB4OTE4ZCwgMHgwMDA2LCAweDIxMDIsIDB4MDEyZSwgMHgwMDFlLCAweDAwMGUsCisJMHgwMDA1LCAweDIwMDksIDB4MDAwMSwgMHgwMDIwLCAweDIwMDksIDB4MDAwMiwgMHgwMDA4LCAweDkwMGUsCisJMHg2ODE0LCAweDkwODQsIDB4ZmZjMCwgMHg5MTBkLCAweDY5MTYsIDB4MDAwNSwgMHgwMGY2LCAweDAxNTYsCisJMHgwMTQ2LCAweDAxZDYsIDB4OTAwNiwgMHgyMGE5LCAweDAwODAsIDB4MjBlOSwgMHgwMDAxLCAweDIwYTEsCisJMHgxYzAwLCAweDQwMDQsIDB4MjA3OSwgMHgxYzAwLCAweDc4MDMsIDB4MjIwMCwgMHg3ODA3LCAweDAwZWYsCisJMHg3ODBmLCAweDAwZWYsIDB4NzgxMywgMHgwMTM4LCAweDc4MjMsIDB4ZmZmZiwgMHg3ODI3LCAweGZmZmYsCisJMHgwMWRlLCAweDAxNGUsIDB4MDE1ZSwgMHgwMGZlLCAweDAwMDUsIDB4MjAwMSwgMHgxODAwLCAweDIwMDMsCisJMHgwMDAxLCAweDAwMDUsIDB4MjAwMSwgMHgxOWE1LCAweDAxMTgsIDB4MjAwMywgMHgwMDAxLCAweDAwMTAsCisJMHgyMDAzLCAweDAwMDAsIDB4MDAwNSwgMHgwMTU2LCAweDIwYTksIDB4MDgwMCwgMHgyMDA5LCAweDEwMDAsCisJMHg5MDA2LCAweDIwMGEsIDB4ODEwOCwgMHgxZjA0LCAweDYwYzEsIDB4MDE1ZSwgMHgwMDA1LCAweDAwZDYsCisJMHgwMDM2LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LCAweDIwNjksIDB4MTg0NywgMHg5MDA2LCAweGI4MDIsCisJMHhiOGNlLCAweGI4MDcsIDB4MDcwNywgMHhiODBhLCAweGI4MGUsIDB4YjgxMiwgMHg5MTk4LCAweDMzODQsCisJMHgyMzFkLCAweDkzOWMsIDB4MDBmZiwgMHhiYjE2LCAweDAwMTYsIDB4MDAyNiwgMHhiOGMyLCAweDA4MGMsCisJMHhhZWFkLCAweDExMjAsIDB4OTE5MiwgMHgwMDdlLCAweDEyMDgsIDB4YmJjMiwgMHgyMGE5LCAweDAwMDQsCisJMHhiOGM0LCAweDIwZTgsIDB4YjljOCwgMHg5MTk4LCAweDAwMDYsIDB4OTAwNiwgMHgyM2EwLCAweDQwMDQsCisJMHgyMGE5LCAweDAwMDQsIDB4OTE5OCwgMHgwMDBhLCAweDIzYTAsIDB4NDAwNCwgMHgwMDJlLCAweDAwMWUsCisJMHhiODNlLCAweGI4NDIsIDB4Yjg0ZSwgMHhiODUyLCAweGI4NTYsIDB4Yjg1YSwgMHhiODVlLCAweGI4NjIsCisJMHhiODY2LCAweGI4NmEsIDB4Yjg2ZiwgMHgwMTAwLCAweGI4NzIsIDB4Yjg3NiwgMHhiODdhLCAweGI4OGEsCisJMHhiODhlLCAweGI4OTMsIDB4MDAwOCwgMHhiODk2LCAweGI4OWEsIDB4Yjg5ZSwgMHhiOGJlLCAweGI5YTIsCisJMHgwMDk2LCAweGI4YTQsIDB4OTA0ZCwgMHgwMTEwLCAweDA4MGMsIDB4MTAzMSwgMHhiOGE3LCAweDAwMDAsCisJMHgwMDllLCAweDkwMDYsIDB4Yjg0YSwgMHg2ODEwLCAweGI4M2EsIDB4NjgwYywgMHhiODQ2LCAweGI4YmIsCisJMHgwNTIwLCAweGI4YWMsIDB4OTAwNSwgMHgwMTk4LCAweDAwYzYsIDB4MjA2MCwgMHg5YzgyLCAweDFjZDAsCisJMHgwYTBjLCAweDBkZDUsIDB4MjAwMSwgMHgxODFhLCAweDIwMDQsIDB4OWMwMiwgMHgxYTBjLCAweDBkZDUsCisJMHgwODBjLCAweDhhM2QsIDB4MDBjZSwgMHgwOTBjLCAweDhkZGEsIDB4YjhhZiwgMHgwMDAwLCAweDY4MTQsCisJMHg5MDg0LCAweDAwZmYsIDB4Yjg0MiwgMHgwMTRlLCAweDAxM2UsIDB4MDE1ZSwgMHgwMDNlLCAweDAwZGUsCisJMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGE5NzQsIDB4YWU3OCwgMHg5Njg0LCAweDNmZmYsCisJMHg5MDgyLCAweDQwMDAsIDB4MWEwNCwgMHg2MWFmLCAweDkxODIsIDB4MDgwMCwgMHgxYTA0LCAweDYxYjMsCisJMHgyMDAxLCAweDE4MGMsIDB4MjAwNCwgMHg5MDg0LCAweDAwMDMsIDB4MTkwNCwgMHg2MWI5LCAweDkxODgsCisJMHgxMDAwLCAweDIxMDQsIDB4OTA1ZCwgMHgwNTE4LCAweGI4MDQsIDB4OTA4NCwgMHgwMGZmLCAweDkwOGUsCisJMHgwMDA2LCAweDE1MDgsIDB4YjhhNCwgMHg5MDBkLCAweDE5MDQsIDB4NjFjYiwgMHhiODUwLCAweDkwMGQsCisJMHgxMTQ4LCAweGE4MDIsIDB4MjkwMCwgMHhiODUyLCAweGI4NGUsIDB4MDgwYywgMHg5MWNlLCAweDkwMDYsCisJMHgwMTJlLCAweDAwMDUsIDB4MDBhNiwgMHgyMTUwLCAweDI5MDAsIDB4YjAwMiwgMHhhODAzLCAweDAwMDAsCisJMHgwMGFlLCAweGI4NTIsIDB4MGM5MCwgMHgyMDAxLCAweDAwMDUsIDB4OTAwZSwgMHgwNGI4LCAweDIwMDEsCisJMHgwMDI4LCAweDkwMGUsIDB4MDQ5OCwgMHg5MDgyLCAweDAwMDYsIDB4MTI5MCwgMHgwODBjLCAweGFlYWQsCisJMHgxMTYwLCAweGI4YTAsIDB4OTA4NCwgMHhmZjgwLCAweDExNDAsIDB4YjkwMCwgMHhkMWZjLCAweDA5OTAsCisJMHgyMDAxLCAweDAwMjksIDB4MjAwOSwgMHgxMDAwLCAweDA0MDgsIDB4MjAwMSwgMHgwMDI4LCAweDAwYTgsCisJMHgyMDA5LCAweDE4MGMsIDB4MjEwYywgMHhkMThjLCAweDAxMTgsIDB4MjAwMSwgMHgwMDA0LCAweDAwNjgsCisJMHhkMTg0LCAweDAxMTgsIDB4MjAwMSwgMHgwMDA0LCAweDAwNDAsIDB4MjAwMSwgMHgwMDI5LCAweGI5MDAsCisJMHhkMWZjLCAweDAxMTgsIDB4MjAwOSwgMHgxMDAwLCAweDAwNDgsIDB4OTAwZSwgMHgwMDM4LCAweDIwMDEsCisJMHgwMDI5LCAweDkwMGUsIDB4MDAxOCwgMHgyMDAxLCAweDAwMjksIDB4OTAwZSwgMHg5MDA1LCAweDAxMmUsCisJMHgwMDA1LCAweDIwMDEsIDB4MTgwYywgMHgyMDA0LCAweGQwODQsIDB4MTlkMCwgMHg5MTg4LCAweDEwMDAsCisJMHgyMTA0LCAweDkwNWQsIDB4MDlhOCwgMHgwODBjLCAweDZhMGMsIDB4MTk5MCwgMHhiODAwLCAweGQwYmMsCisJMHgwOTc4LCAweDA4MDQsIDB4NjE2MiwgMHgwODBjLCAweDY4MzUsIDB4MDkwNCwgMHg2MTdiLCAweDA4MDQsCisJMHg2MTY2LCAweDAwYjYsIDB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhhODc0LCAweDkwOGUsCisJMHgwMGZmLCAweDExMjAsIDB4MjAwMSwgMHgxOTZhLCAweDIwNWMsIDB4MDA2MCwgMHhhOTc0LCAweDkxODIsCisJMHgwODAwLCAweDE2OTAsIDB4OTE4OCwgMHgxMDAwLCAweDIxMDQsIDB4OTA1ZCwgMHgwMWQwLCAweDA4MGMsCisJMHg2OWFjLCAweDExZDAsIDB4MDgwYywgMHhhZWVkLCAweDA1NzAsIDB4MmIwMCwgMHg2MDEyLCAweDI5MDAsCisJMHg2MDE2LCAweDYwMjMsIDB4MDAwOSwgMHg2MDBiLCAweDAwMDAsIDB4YTg3NCwgMHg5MDhlLCAweDAwZmYsCisJMHgxMTEwLCAweDYwMGIsIDB4ODAwMCwgMHgyMDA5LCAweDAwNDMsIDB4MDgwYywgMHhhZmJlLCAweDkwMDYsCisJMHgwMGIwLCAweDIwMDEsIDB4MDAyOCwgMHgwMDkwLCAweDIwMDksIDB4MTgwYywgMHgyMTBjLCAweGQxOGMsCisJMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDM4LCAweGQxODQsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsCisJMHgwMDEwLCAweDIwMDEsIDB4MDAyOSwgMHgwMDEwLCAweDIwMDEsIDB4MDAyOSwgMHg5MDA1LCAweDAxMmUsCisJMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHgyMDAxLCAweDAwMmMsIDB4MGNjMCwgMHgwMGI2LCAweDAwZTYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhhOTc0LCAweDkxODIsIDB4MDgwMCwgMHgxYTA0LCAweDYyOWMsCisJMHg5MTg4LCAweDEwMDAsIDB4MjEwNCwgMHg5MDVkLCAweDA5MDQsIDB4NjI3NCwgMHhiOGEwLCAweDkwODYsCisJMHgwMDdmLCAweDAxOTAsIDB4YTg3YywgMHhkMGZjLCAweDExNzgsIDB4MDgwYywgMHg2YTE0LCAweDAxNjAsCisJMHhhOTk0LCAweDgxZmYsIDB4MDEzMCwgMHg5MDhlLCAweDAwMDQsIDB4MDEzMCwgMHg5MDhlLCAweDAwMDUsCisJMHgwMTE4LCAweDA4MGMsIDB4NmEwYywgMHgxNTk4LCAweGE4N2MsIDB4ZDBmYywgMHgwMWUwLCAweGE4OTQsCisJMHg5MDA1LCAweDAxYzgsIDB4MjA2MCwgMHgwMDI2LCAweDIwMTAsIDB4MDgwYywgMHhjYzc0LCAweDAwMmUsCisJMHgxMTIwLCAweDIwMDEsIDB4MDAwOCwgMHgwODA0LCAweDYyOWUsIDB4NjAyMCwgMHg5MDg2LCAweDAwMGEsCisJMHgwMTIwLCAweDIwMDEsIDB4MDAwOCwgMHgwODA0LCAweDYyOWUsIDB4NjAxYSwgMHg2MDAzLCAweDAwMDgsCisJMHgyOTAwLCAweDYwMTYsIDB4MDA1OCwgMHgwODBjLCAweGFlZWQsIDB4MDVlOCwgMHgyYjAwLCAweDYwMTIsCisJMHgyOTAwLCAweDYwMTYsIDB4NjAwYiwgMHhmZmZmLCAweDYwMjMsIDB4MDAwYSwgMHgyMDA5LCAweDAwMDMsCisJMHgwODBjLCAweGFmYmUsIDB4OTAwNiwgMHgwNDU4LCAweDIwMDEsIDB4MDAyOCwgMHgwNDM4LCAweDkwODIsCisJMHgwMDA2LCAweDEyOTAsIDB4MDgwYywgMHhhZWFkLCAweDExNjAsIDB4YjhhMCwgMHg5MDg0LCAweGZmODAsCisJMHgxMTQwLCAweGI5MDAsIDB4ZDFmYywgMHgwOTAwLCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LCAweDEwMDAsCisJMHgwMGE4LCAweDIwMDEsIDB4MDAyOCwgMHgwMDkwLCAweDIwMDksIDB4MTgwYywgMHgyMTBjLCAweGQxOGMsCisJMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDUwLCAweGQxODQsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsCisJMHgwMDI4LCAweDIwMDEsIDB4MDAyOSwgMHgwMDEwLCAweDIwMDEsIDB4MDAyOSwgMHg5MDA1LCAweDAxMmUsCisJMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHgyMDAxLCAweDAwMmMsIDB4MGNjMCwgMHgwMGY2LCAweDAwYjYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhhOGUwLCAweDkwMDUsIDB4MTU1MCwgMHhhOGRjLCAweDkwODIsCisJMHgwMTAxLCAweDE2MzAsIDB4YThjOCwgMHg5MDA1LCAweDE1MTgsIDB4YThjNCwgMHg5MDgyLCAweDAxMDEsCisJMHgxMmY4LCAweGE5NzQsIDB4MjA3OSwgMHgxODAwLCAweDkxODIsIDB4MDgwMCwgMHgxMmU4LCAweDc4MzAsCisJMHg5MDg0LCAweDAwMDMsIDB4MTEzMCwgMHhhYTk4LCAweGFiOTQsIDB4YTg3OCwgMHg5MDg0LCAweDAwMDcsCisJMHgwMGVhLCAweDc5MzAsIDB4ZDE4YywgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDM4LCAweGQxODQsCisJMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDEwLCAweDIwMDEsIDB4MDAyOSwgMHg5MDBlLCAweDAwMzgsCisJMHgyMDAxLCAweDAwMmMsIDB4OTAwZSwgMHgwMDE4LCAweDIwMDEsIDB4MDAyOSwgMHg5MDBlLCAweDkwMDYsCisJMHgwMDA4LCAweDkwMDUsIDB4MDEyZSwgMHgwMGJlLCAweDAwZmUsIDB4MDAwNSwgMHg2MzMzLCAweDYyZWUsCisJMHg2MzA1LCAweDYzMzMsIDB4NjMzMywgMHg2MzMzLCAweDYzMzMsIDB4NjMzMywgMHgyMTAwLCAweDkwODIsCisJMHgwMDdlLCAweDEyNzgsIDB4MDgwYywgMHg2NjM4LCAweDAxNDgsIDB4OTA0NiwgMHhiODEwLCAweDkzMDYsCisJMHgxOTA0LCAweDYzM2IsIDB4YjgxNCwgMHg5MjA2LCAweDE1ZjAsIDB4MDAyOCwgMHhiYjEyLCAweGJhMTYsCisJMHgwMDEwLCAweDA4MGMsIDB4NGEzMiwgMHgwMTUwLCAweDA0YjAsIDB4MDgwYywgMHg2Njk5LCAweDE1OTgsCisJMHhiODEwLCAweDkzMDYsIDB4MTU4MCwgMHhiODE0LCAweDkyMDYsIDB4MTU2OCwgMHgwODBjLCAweGFlZWQsCisJMHgwNTMwLCAweDJiMDAsIDB4NjAxMiwgMHgwODBjLCAweGQxMDIsIDB4MjkwMCwgMHg2MDE2LCAweDYwMGIsCisJMHhmZmZmLCAweDYwMjMsIDB4MDAwYSwgMHhhODc4LCAweDkwODYsIDB4MDAwMSwgMHgxMTcwLCAweDA4MGMsCisJMHgzMjFlLCAweDkwMDYsIDB4MDgwYywgMHg2NWQ1LCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDY1ZTksCisJMHgyMDAxLCAweDAyMDAsIDB4Yjg2ZSwgMHhiODkzLCAweDAwMDIsIDB4MjAwOSwgMHgwMDAzLCAweDA4MGMsCisJMHhhZmJlLCAweDkwMDYsIDB4MDA2OCwgMHgyMDAxLCAweDAwMDEsIDB4OTAwZSwgMHgwMDM4LCAweDIwMDEsCisJMHgwMDJjLCAweDkwMGUsIDB4MDAxOCwgMHgyMDAxLCAweDAwMjgsIDB4OTAwZSwgMHg5MDA1LCAweDAwMDAsCisJMHgwMTJlLCAweDAwYmUsIDB4MDBmZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBmNiwgMHgwMGU2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4YTg5NCwgMHg5MGM2LCAweDAwMTUsIDB4MDkwNCwgMHg2NTI2LCAweDkwYzYsCisJMHgwMDU2LCAweDA5MDQsIDB4NjUyYSwgMHg5MGM2LCAweDAwNjYsIDB4MDkwNCwgMHg2NTJlLCAweDkwYzYsCisJMHgwMDY3LCAweDA5MDQsIDB4NjUzMiwgMHg5MGM2LCAweDAwNjgsIDB4MDkwNCwgMHg2NTM2LCAweDkwYzYsCisJMHgwMDcxLCAweDA5MDQsIDB4NjUzYSwgMHg5MGM2LCAweDAwNzQsIDB4MDkwNCwgMHg2NTNlLCAweDkwYzYsCisJMHgwMDdjLCAweDA5MDQsIDB4NjU0MiwgMHg5MGM2LCAweDAwN2UsIDB4MDkwNCwgMHg2NTQ2LCAweDkwYzYsCisJMHgwMDM3LCAweDA5MDQsIDB4NjU0YSwgMHg5MDE2LCAweDIwNzksIDB4MTgwMCwgMHhhOTc0LCAweDkxODYsCisJMHgwMGZmLCAweDA5MDQsIDB4NjUyMSwgMHg5MTgyLCAweDA4MDAsIDB4MWEwNCwgMHg2NTIxLCAweDA4MGMsCisJMHg2Njk5LCAweDExOTgsIDB4YjgwNCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4MiwgMHgwMDA2LCAweDEyNjgsCisJMHhhODk0LCAweDkwYzYsIDB4MDA2ZiwgMHgwMTQ4LCAweDA4MGMsIDB4YWVhZCwgMHgxOTA0LCAweDY1MGEsCisJMHhiOGEwLCAweDkwODQsIDB4ZmY4MCwgMHgxOTA0LCAweDY1MGEsIDB4YTg5NCwgMHg5MGM2LCAweDAwNmYsCisJMHgwMTU4LCAweDkwYzYsIDB4MDA1ZSwgMHgwOTA0LCAweDY0NmEsIDB4OTBjNiwgMHgwMDY0LCAweDA5MDQsCisJMHg2NDkzLCAweDIwMDgsIDB4MDgwNCwgMHg2NDJjLCAweGE5OTgsIDB4YThiMCwgMHgyMDQwLCAweDA4MGMsCisJMHhhZWFkLCAweDExMjAsIDB4OTE4MiwgMHgwMDdmLCAweDBhMDQsIDB4NjQyYywgMHg5MTg2LCAweDAwZmYsCisJMHgwOTA0LCAweDY0MmMsIDB4OTE4MiwgMHgwODAwLCAweDFhMDQsIDB4NjQyYywgMHhhYWEwLCAweGFiOWMsCisJMHg3ODdjLCAweDkzMDYsIDB4MTFhOCwgMHg3ODgwLCAweDAwOTYsIDB4OTI0ZSwgMHgxMTI4LCAweDIyMDgsCisJMHgyMzEwLCAweDAwOWUsIDB4MDgwNCwgMHg2NDJjLCAweDA4MGMsIDB4YWVhZCwgMHgxMTQwLCAweDk5Y2MsCisJMHhmZjAwLCAweDAwOWUsIDB4MTEyOCwgMHgyMjA4LCAweDIzMTAsIDB4MDgwNCwgMHg2NDJjLCAweDAwOWUsCisJMHgwODBjLCAweDRhMzIsIDB4MDkwNCwgMHg2NDM2LCAweDkwMGUsIDB4OTAxNiwgMHg5MGM2LCAweDQwMDAsCisJMHgxNWUwLCAweDAwMDYsIDB4MDgwYywgMHg2OGI5LCAweDExMDgsIDB4YzE4NSwgMHhiODAwLCAweGQwYmMsCisJMHgwMTA4LCAweGMxOGQsIDB4MjBhOSwgMHgwMDA0LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDkwODAsCisJMHgwMDMxLCAweDIwYTAsIDB4YjhjNCwgMHgyMGUwLCAweGI4YzgsIDB4OTA4MCwgMHgwMDA2LCAweDIwOTgsCisJMHgwODBjLCAweDBmN2MsIDB4MjBhOSwgMHgwMDA0LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDkwODAsCisJMHgwMDM1LCAweDIwYTAsIDB4YjhjNCwgMHgyMGUwLCAweGI4YzgsIDB4OTA4MCwgMHgwMDBhLCAweDIwOTgsCisJMHgwODBjLCAweDBmN2MsIDB4YThjNCwgMHhhYmM4LCAweDkzMDUsIDB4YWJjYywgMHg5MzA1LCAweGFiZDAsCisJMHg5MzA1LCAweGFiZDQsIDB4OTMwNSwgMHhhYmQ4LCAweDkzMDUsIDB4YWJkYywgMHg5MzA1LCAweGFiZTAsCisJMHg5MzA1LCAweDkwMDUsIDB4MDUxMCwgMHgwMDBlLCAweDAwYzgsIDB4OTBjNiwgMHg0MDA3LCAweDExMTAsCisJMHgyNDA4LCAweDAwYTAsIDB4OTBjNiwgMHg0MDA4LCAweDExMTgsIDB4MjcwOCwgMHgyNjEwLCAweDAwNzAsCisJMHg5MGM2LCAweDQwMDksIDB4MTEwOCwgMHgwMDUwLCAweDkwYzYsIDB4NDAwNiwgMHgwMTM4LCAweDIwMDEsCisJMHg0MDA1LCAweDIwMDksIDB4MDAwYSwgMHgwMDEwLCAweDIwMDEsIDB4NDAwNiwgMHhhODk2LCAweGE5OWEsCisJMHhhYTllLCAweDIwMDEsIDB4MDAzMCwgMHg5MDBlLCAweDA0NzgsIDB4MDAwZSwgMHgwODBjLCAweGFlZWQsCisJMHgxMTMwLCAweDIwMDEsIDB4NDAwNSwgMHgyMDA5LCAweDAwMDMsIDB4OTAxNiwgMHgwYzc4LCAweDJiMDAsCisJMHg2MDEyLCAweDA4MGMsIDB4ZDEwMiwgMHgyOTAwLCAweDYwMTYsIDB4NjAyMywgMHgwMDAxLCAweGE4NjgsCisJMHhkODhjLCAweDAxMDgsIDB4YzBmNSwgMHhhODZhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsCisJMHgzMjFlLCAweDAxMmUsIDB4OTAwNiwgMHgwODBjLCAweDY1ZDUsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsCisJMHg2NWU5LCAweDIwMDksIDB4MDAwMiwgMHgwODBjLCAweGFmYmUsIDB4YThiMCwgMHhkMDk0LCAweDAxMTgsCisJMHhiOGNjLCAweGMwOGQsIDB4YjhjZSwgMHg5MDA2LCAweDkwMDUsIDB4MDEyZSwgMHgwMGVlLCAweDAwZmUsCisJMHgwMGJlLCAweDAwMDUsIDB4MDgwYywgMHg1NzcxLCAweDAxMTgsIDB4MjAwOSwgMHgwMDA3LCAweDAwZjgsCisJMHhhOTk4LCAweGFlYjAsIDB4MDgwYywgMHg2Njk5LCAweDE5MDQsIDB4NjQyNywgMHg5MTg2LCAweDAwN2YsCisJMHgwMTMwLCAweDA4MGMsIDB4NmEwYywgMHgwMTE4LCAweDIwMDksIDB4MDAwOSwgMHgwMDgwLCAweDAwOTYsCisJMHgwODBjLCAweDBmZmYsIDB4MTEyMCwgMHgwMDllLCAweDIwMDksIDB4MDAwMiwgMHgwMDQwLCAweDI5MDAsCisJMHgwMDllLCAweGE4MDYsIDB4MDgwYywgMHhjZTZlLCAweDE5YjAsIDB4MjAwOSwgMHgwMDAzLCAweDIwMDEsCisJMHg0MDA1LCAweDA4MDQsIDB4NjQyZSwgMHhhOTk4LCAweGFlYjAsIDB4MDgwYywgMHg2Njk5LCAweDE5MDQsCisJMHg2NDI3LCAweDAwOTYsIDB4MDgwYywgMHgwZmZmLCAweDExMjgsIDB4MDA5ZSwgMHgyMDA5LCAweDAwMDIsCisJMHgwODA0LCAweDY0ZTcsIDB4MjkwMCwgMHgwMDllLCAweGE4MDYsIDB4MDA5NiwgMHgyMDQ4LCAweDIwYTksCisJMHgwMDJiLCAweGI4YzQsIDB4MjBlMCwgMHhiOGM4LCAweDIwOTgsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsCisJMHg5MDgwLCAweDAwMDIsIDB4MjBhMCwgMHg0MDAzLCAweDIwYTksIDB4MDAwOCwgMHg5MDgwLCAweDAwMDYsCisJMHgyMGEwLCAweGJiYzgsIDB4OTM5OCwgMHgwMDA2LCAweDIzOTgsIDB4MDgwYywgMHgwZjdjLCAweDAwOWUsCisJMHhhODdiLCAweDAwMDAsIDB4YTg4MywgMHgwMDAwLCAweGE4OTcsIDB4NDAwMCwgMHhkNjg0LCAweDExNjgsCisJMHgwODBjLCAweDU3NWQsIDB4ZDBiNCwgMHgxMTE4LCAweGE4OWIsIDB4MDAwYiwgMHgwMGUwLCAweGI4MDAsCisJMHhkMDhjLCAweDAxMTgsIDB4YTg5YiwgMHgwMDBjLCAweDAwYjAsIDB4MDgwYywgMHg2YTBjLCAweDAxMTgsCisJMHhhODliLCAweDAwMDksIDB4MDA4MCwgMHgwODBjLCAweDU3NzEsIDB4MDExOCwgMHhhODliLCAweDAwMDcsCisJMHgwMDUwLCAweDA4MGMsIDB4Y2U1MSwgMHgxOTA0LCAweDY0NjMsIDB4MjAwOSwgMHgwMDAzLCAweDIwMDEsCisJMHg0MDA1LCAweDA4MDQsIDB4NjQyZSwgMHhhODdiLCAweDAwMzAsIDB4YTg5NywgMHg0MDA1LCAweGE4MDQsCisJMHg4MDA2LCAweDgwMDYsIDB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwgMHhmZmMwLCAweDkwODAsCisJMHgwMDAyLCAweDIwMDksIDB4MDAyYiwgMHhhYWEwLCAweGFiOWMsIDB4YWNhOCwgMHhhZGE0LCAweDIwMzEsCisJMHgwMDAwLCAweDIwNDEsIDB4MTI0MywgMHgwODBjLCAweGI0NWQsIDB4MTkwNCwgMHg2NDYzLCAweDIwMDksCisJMHgwMDAyLCAweDA4ZTgsIDB4MjAwMSwgMHgwMDI4LCAweDkwMGUsIDB4MDgwNCwgMHg2NDY0LCAweDIwMDksCisJMHgxODBjLCAweDIxMGMsIDB4ZDE4YywgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDM4LCAweGQxODQsCisJMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDEwLCAweDIwMDEsIDB4MDAyOSwgMHg5MDBlLCAweDA4MDQsCisJMHg2NDY0LCAweDIwMDEsIDB4MDAyOSwgMHg5MDBlLCAweDA4MDQsIDB4NjQ2NCwgMHgwODBjLCAweDM3YjMsCisJMHgwODA0LCAweDY0NjUsIDB4MDgwYywgMHg1NDg4LCAweDA4MDQsIDB4NjQ2NSwgMHgwODBjLCAweDQ1YjEsCisJMHgwODA0LCAweDY0NjUsIDB4MDgwYywgMHg0NjJhLCAweDA4MDQsIDB4NjQ2NSwgMHgwODBjLCAweDQ2ODYsCisJMHgwODA0LCAweDY0NjUsIDB4MDgwYywgMHg0YWY1LCAweDA4MDQsIDB4NjQ2NSwgMHgwODBjLCAweDRkYTksCisJMHgwODA0LCAweDY0NjUsIDB4MDgwYywgMHg1MGYwLCAweDA4MDQsIDB4NjQ2NSwgMHgwODBjLCAweDUyZTksCisJMHgwODA0LCAweDY0NjUsIDB4MDgwYywgMHgzOWM5LCAweDA4MDQsIDB4NjQ2NSwgMHgwMGI2LCAweGE5NzQsCisJMHhhZTc4LCAweDk2ODQsIDB4M2ZmZiwgMHg5MDgyLCAweDQwMDAsIDB4MTYxOCwgMHg5MTgyLCAweDA4MDAsCisJMHgxMjY4LCAweDkxODgsIDB4MTAwMCwgMHgyMTA0LCAweDkwNWQsIDB4MDE0MCwgMHgwODBjLCAweDZhMGMsCisJMHgxMTQ4LCAweDAwZTksIDB4MDgwYywgMHg2N2M0LCAweDkwMDYsIDB4MDBiMCwgMHgyMDAxLCAweDAwMjgsCisJMHg5MDBlLCAweDAwOTAsIDB4OTA4MiwgMHgwMDA2LCAweDEyNDAsIDB4YjkwMCwgMHhkMWZjLCAweDBkODgsCisJMHgyMDAxLCAweDAwMjksIDB4MjAwOSwgMHgxMDAwLCAweDAwMzgsIDB4MjAwMSwgMHgwMDI5LCAweDkwMGUsCisJMHgwMDE4LCAweDIwMDEsIDB4MDAyOSwgMHg5MDBlLCAweDkwMDUsIDB4MDBiZSwgMHgwMDA1LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4Yjg1MCwgMHg5MDBkLCAweDAxNTAsIDB4MjkwMCwgMHgwMDk2LCAweDIxNDgsCisJMHhhODAyLCAweDAwOWUsIDB4YTgwMywgMHgwMDAwLCAweGI4NTIsIDB4MDEyZSwgMHgwMDA1LCAweDI5MDAsCisJMHhiODUyLCAweGI4NGUsIDB4YTgwMywgMHgwMDAwLCAweDBjYzAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHhiODRjLCAweDkwMDUsIDB4MDE3MCwgMHgwMGU2LCAweDIwNzEsIDB4MTllNiwgMHg3MDA0LCAweDkwODYsCisJMHgwMDAyLCAweDAxNjgsIDB4MDBlZSwgMHhiODRjLCAweGE4MDIsIDB4MjkwMCwgMHhiODRlLCAweDAxMmUsCisJMHgwMDA1LCAweDI5MDAsIDB4Yjg1MiwgMHhiODRlLCAweGE4MDMsIDB4MDAwMCwgMHgwY2MwLCAweDcwMWMsCisJMHg5YjA2LCAweDFkODAsIDB4Yjg0YywgMHgwMGE2LCAweDIwNTAsIDB4YjAwMCwgMHhhODAyLCAweDI5MDAsCisJMHhiMDAyLCAweDAwYWUsIDB4MDBlZSwgMHgwMTJlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHhiODRjLCAweDkwNGQsIDB4MDEzMCwgMHhhODAwLCAweDkwMDUsIDB4MTEwOCwgMHhiODUyLCAweGI4NGUsCisJMHg5OTA1LCAweDAxMmUsIDB4MDAwNSwgMHhiODRjLCAweDkwNGQsIDB4MDEzMCwgMHhhODAwLCAweDkwMDUsCisJMHgxMTA4LCAweGI4NTIsIDB4Yjg0ZSwgMHg5OTA1LCAweDAwMDUsIDB4MDBiNiwgMHgwMTI2LCAweDAwYzYsCisJMHgwMDI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MjEwLCAweDIyNTgsIDB4YmEwMCwgMHg5MDA1LCAweDAxMTAsCisJMHhjMjg1LCAweDAwMDgsIDB4YzI4NCwgMHhiYTAyLCAweDAwMmUsIDB4MDBjZSwgMHgwMTJlLCAweDAwYmUsCisJMHgwMDA1LCAweDAwYjYsIDB4MDEyNiwgMHgwMGM2LCAweDIwOTEsIDB4ODAwMCwgMHg2MjEwLCAweDIyNTgsCisJMHhiYTA0LCAweDAwMDYsIDB4OTA4NiwgMHgwMDA2LCAweDExNzAsIDB4Yjg5YywgMHhkMGFjLCAweDAxNTgsCisJMHgwODBjLCAweDZhMDgsIDB4MDE0MCwgMHg5Mjg0LCAweGZmMDAsIDB4ODAwNywgMHg5MDg2LCAweDAwMDcsCisJMHgxMTEwLCAweDIwMTEsIDB4MDYwMCwgMHgwMDBlLCAweDkyOTQsIDB4ZmYwMCwgMHg5MjE1LCAweGJhMDYsCisJMHgwMDA2LCAweDkwODYsIDB4MDAwNiwgMHgxMTIwLCAweGJhOTAsIDB4ODJmZiwgMHgwOTBjLCAweDBkZDUsCisJMHgwMDBlLCAweDAwY2UsIDB4MDEyZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBiNiwgMHgwMTI2LCAweDAwYzYsCisJMHgyMDkxLCAweDgwMDAsIDB4NjIxMCwgMHgyMjU4LCAweGJhMDQsIDB4MDAwNiwgMHg5MDg2LCAweDAwMDYsCisJMHgxMTY4LCAweGI4OWMsIDB4ZDBhNCwgMHgwMTUwLCAweDA4MGMsIDB4NmEwNCwgMHgxMTM4LCAweDkyODQsCisJMHgwMGZmLCAweDkwODYsIDB4MDAwNywgMHgxMTEwLCAweDIwMTEsIDB4MDAwNiwgMHgwMDBlLCAweDkyOTQsCisJMHgwMGZmLCAweDgwMDcsIDB4OTIxNSwgMHhiYTA2LCAweDAwY2UsIDB4MDEyZSwgMHgwMGJlLCAweDAwMDUsCisJMHg5MTgyLCAweDA4MDAsIDB4MDIxOCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMGQ2LCAweDAwMjYsCisJMHg5MTkwLCAweDEwMDAsIDB4MjIwNCwgMHg5MDVkLCAweDExODgsIDB4MDA5NiwgMHgwODBjLCAweDBmZmYsCisJMHgyOTU4LCAweDAwOWUsIDB4MDE2OCwgMHgyYjAwLCAweDIwMTIsIDB4Yjg1YywgMHhiOGNhLCAweGI4NjAsCisJMHhiOGM2LCAweDkwMDYsIDB4YjhhNiwgMHhiOGFlLCAweDA4MGMsIDB4NjBjNywgMHg5MDA2LCAweDAwMTAsCisJMHg5MDg1LCAweDAwMDEsIDB4MDAyZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBiNiwgMHgwMDk2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDAyNiwgMHg5MTgyLCAweDA4MDAsIDB4MDIxOCwgMHg5MDg1LCAweDAwMDEsCisJMHgwNDU4LCAweDAwZDYsIDB4OTE5MCwgMHgxMDAwLCAweDIyMDQsIDB4OTA1ZCwgMHgwNTE4LCAweDIwMTMsCisJMHgwMDAwLCAweGI4YTQsIDB4OTA0ZCwgMHgwMTEwLCAweDA4MGMsIDB4MTAzMSwgMHgwMGQ2LCAweDAwYzYsCisJMHhiOGJjLCAweDIwNjAsIDB4OGNmZiwgMHgwMTY4LCAweDYwMGMsIDB4MDAwNiwgMHg2MDE0LCAweDIwNDgsCisJMHgwODBjLCAweGNjODYsIDB4MDExMCwgMHgwODBjLCAweDBmYjEsIDB4MDgwYywgMHhhZjQzLCAweDAwY2UsCisJMHgwYzg4LCAweDAwY2UsIDB4MDBkZSwgMHgyYjQ4LCAweGI4YzgsIDB4Yjg1ZSwgMHhiOGM0LCAweGI4NjIsCisJMHgwODBjLCAweDEwNDEsIDB4MDBkZSwgMHg5MDA2LCAweDAwMmUsIDB4MDEyZSwgMHgwMDllLCAweDAwYmUsCisJMHgwMDA1LCAweDAwMTYsIDB4OTE4MiwgMHgwODAwLCAweDAyMTgsIDB4OTA4NSwgMHgwMDAxLCAweDAwMzAsCisJMHg5MTg4LCAweDEwMDAsIDB4MjEwNCwgMHg5MDVkLCAweDBkYzAsIDB4OTAwNiwgMHgwMDFlLCAweDAwMDUsCisJMHgwMGQ2LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LCAweDkwMDYsIDB4YjgwYSwgMHhiODBlLCAweGI4MDAsCisJMHhjMDhjLCAweGI4MDIsIDB4MDgwYywgMHg3NDNlLCAweDE1MTAsIDB4YjhhMCwgMHg5MDg2LCAweDAwN2UsCisJMHgwMTIwLCAweDA4MGMsIDB4YWVhZCwgMHgxMWQ4LCAweDAwNzgsIDB4NzA0MCwgMHhkMGU0LCAweDAxYjgsCisJMHgwMGM2LCAweDIwNjEsIDB4MTk4MSwgMHg3MDQ4LCAweDIwNjIsIDB4NzA0YywgMHg2MDA2LCAweDcwNTAsCisJMHg2MDBhLCAweDcwNTQsIDB4NjAwZSwgMHgwMGNlLCAweDcwM2MsIDB4MjA2OSwgMHgwMTQwLCAweDkwMDUsCisJMHgxMTEwLCAweDIwMDEsIDB4MDAwMSwgMHg2ODg2LCAweDIwNjksIDB4MTgwMCwgMHg2OGI2LCAweDcwNDAsCisJMHhiODVlLCAweDcwNDgsIDB4Yjg2MiwgMHg3MDRjLCAweGI4NjYsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksCisJMHgwMjc2LCAweGI4YzQsIDB4MjBlOCwgMHhiOGM4LCAweDkwODgsIDB4MDAwYSwgMHgyMWEwLCAweDIwYTksCisJMHgwMDA0LCAweDQwMDMsIDB4MjA5OSwgMHgwMjdhLCAweDkwODgsIDB4MDAwNiwgMHgyMWEwLCAweDIwYTksCisJMHgwMDA0LCAweDQwMDMsIDB4MjA2OSwgMHgwMjAwLCAweDY4MTcsIDB4MDAwMSwgMHg3MDQwLCAweGI4NmEsCisJMHg3MTQ0LCAweGI5NmUsIDB4NzA0OCwgMHhiODcyLCAweDcwNTAsIDB4Yjg3NiwgMHgyMDY5LCAweDAyMDAsCisJMHg2ODE3LCAweDAwMDAsIDB4YjhhMCwgMHg5MDg2LCAweDAwN2UsIDB4MTExMCwgMHg3MTQ0LCAweGI5NmUsCisJMHg5MTgyLCAweDAyMTEsIDB4MTIxOCwgMHgyMDA5LCAweDAwMDgsIDB4MDQwMCwgMHg5MTgyLCAweDAyNTksCisJMHgxMjE4LCAweDIwMDksIDB4MDAwNywgMHgwMGQwLCAweDkxODIsIDB4MDJjMSwgMHgxMjE4LCAweDIwMDksCisJMHgwMDA2LCAweDAwYTAsIDB4OTE4MiwgMHgwMzQ5LCAweDEyMTgsIDB4MjAwOSwgMHgwMDA1LCAweDAwNzAsCisJMHg5MTgyLCAweDA0MjEsIDB4MTIxOCwgMHgyMDA5LCAweDAwMDQsIDB4MDA0MCwgMHg5MTgyLCAweDA1ODEsCisJMHgxMjE4LCAweDIwMDksIDB4MDAwMywgMHgwMDEwLCAweDIwMDksIDB4MDAwMiwgMHhiOTkyLCAweDAxNGUsCisJMHgwMTNlLCAweDAxNWUsIDB4MDBkZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwMGU2LCAweDIwNzEsCisJMHgwMjYwLCAweDcwMzQsIDB4Yjg5NiwgMHg3MDNjLCAweGI4OWEsIDB4NzA1NCwgMHhiODllLCAweDAwMzYsCisJMHhiYmNjLCAweGMzODQsIDB4YmEwMCwgMHgyMDA5LCAweDE4NjcsIDB4MjEwYywgMHhkMGJjLCAweDAxMjAsCisJMHhkMWVjLCAweDAxMTAsIDB4YzJhZCwgMHgwMDA4LCAweGMyYWMsIDB4ZDBjNCwgMHgwMTQ4LCAweGQxZTQsCisJMHgwMTM4LCAweGMyYmQsIDB4ZDBjYywgMHgwMTI4LCAweGQzOGMsIDB4MTEwOCwgMHhjMzg1LCAweDAwMDgsCisJMHhjMmJjLCAweGJhMDIsIDB4YmJjZSwgMHgwMDNlLCAweDAwZWUsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsCisJMHgwMDk2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGI4YTQsIDB4OTA0ZCwgMHgwNTc4LCAweGE5MDAsCisJMHg4MWZmLCAweDE1YzAsIDB4YWEwNCwgMHg5MjgyLCAweDAwMTAsIDB4MTZjOCwgMHgwMTM2LCAweDAxNDYsCisJMHgwMWM2LCAweDAxZDYsIDB4ODkwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTA4YywgMHgwMDNmLCAweDIxZTAsCisJMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDA0LCAweDIwOTgsIDB4MjAwOSwgMHgwMDEwLCAweDIwYTksCisJMHgwMDAxLCAweDQwMDIsIDB4OTA4NiwgMHhmZmZmLCAweDAxMjAsIDB4ODEwOSwgMHgxZGQwLCAweDA4MGMsCisJMHgwZGQ1LCAweDNjMDAsIDB4MjBlOCwgMHgzMzAwLCAweDgwMDEsIDB4MjBhMCwgMHg0NjA0LCAweDgyMTAsCisJMHhhYTA2LCAweDAxZGUsIDB4MDFjZSwgMHgwMTRlLCAweDAxM2UsIDB4MDA2MCwgMHgwODBjLCAweDBmZmYsCisJMHgwMTcwLCAweDI5MDAsIDB4YjhhNiwgMHhhODAzLCAweDAwMDAsIDB4MDgwYywgMHg2ODU1LCAweGE4MDcsCisJMHgwMDAxLCAweGFlMTIsIDB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDA5ZSwgMHgwMDA1LCAweDkwMDYsCisJMHgwY2Q4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwOTYsIDB4YjhhNCwgMHg5MDRkLCAweDAxODgsCisJMHhhODAwLCAweDkwMDUsIDB4MTE1MCwgMHgwODBjLCAweDY4NjQsIDB4MTE1OCwgMHhhODA0LCAweDkwOGEsCisJMHgwMDAyLCAweDAyMTgsIDB4ODAwMSwgMHhhODA2LCAweDAwMjAsIDB4MDgwYywgMHgxMDMxLCAweGI4YTcsCisJMHgwMDAwLCAweDAwOWUsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsCisJMHg5MWNlLCAweDAxMmUsIDB4MDAwNSwgMHg5MDFlLCAweDAwMTAsIDB4MjAxOSwgMHgwMDAxLCAweDkwMGUsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhiODRjLCAweDIwNDgsIDB4YjgwMCwgMHhkMGRjLCAweDExNzAsCisJMHg4OWZmLCAweDA1MDAsIDB4ODNmZiwgMHgwMTIwLCAweGE4NzgsIDB4OTYwNiwgMHgwMTU4LCAweDAwMzAsCisJMHhhODZjLCAweDk0MDYsIDB4MTExOCwgMHhhODcwLCAweDk1MDYsIDB4MDEyMCwgMHgyOTA4LCAweGE4MDAsCisJMHgyMDQ4LCAweDBjNzAsIDB4MDgwYywgMHhhNzYxLCAweGFhMDAsIDB4Yjg0YywgMHg5OTA2LCAweDExMTAsCisJMHhiYTRlLCAweDAwMjAsIDB4MDBhNiwgMHgyMTUwLCAweGIyMDIsIDB4MDBhZSwgMHg4MmZmLCAweDExMTAsCisJMHhiOTUyLCAweDg5ZmYsIDB4MDEyZSwgMHgwMDA1LCAweDkwMTYsIDB4MDQ4OSwgMHgxMTEwLCAweDIwMTEsCisJMHgwMDAxLCAweDAwMDUsIDB4MDgwYywgMHg2OGI5LCAweDAxMjgsIDB4MDgwYywgMHhjZDQzLCAweDAwMTAsCisJMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwODBjLCAweDY4YjksIDB4MDEyOCwgMHgwODBjLCAweGNjZTgsCisJMHgwMDEwLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDA4MGMsIDB4NjhiOSwgMHgwMTI4LCAweDA4MGMsCisJMHhjZDQwLCAweDAwMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDgwYywgMHg2OGI5LCAweDAxMjgsCisJMHgwODBjLCAweGNkMDcsIDB4MDAxMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwODBjLCAweDY4YjksCisJMHgwMTI4LCAweDA4MGMsIDB4Y2Q4NiwgMHgwMDEwLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweGI4YTQsCisJMHg5MDBkLCAweDExMTgsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDEzNiwgMHgwMWM2LCAweGE4MDAsCisJMHg5MDA1LCAweDExYjgsIDB4ODkwZSwgMHg4MTBlLCAweDgxMGYsIDB4OTE4NCwgMHgwMDNmLCAweDIwZTAsCisJMHg5MTg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDA0LCAweDIwOTgsIDB4MjBhOSwgMHgwMDAxLCAweDIwMDksCisJMHgwMDEwLCAweDQwMDIsIDB4OTYwNiwgMHgwMTI4LCAweDgxMDksIDB4MWRkOCwgMHg5MDg1LCAweDAwMDEsCisJMHgwMDA4LCAweDkwMDYsIDB4MDFjZSwgMHgwMTNlLCAweDAwMDUsIDB4MDE0NiwgMHgwMWQ2LCAweGE4NjAsCisJMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDA0LCAweDIwYTAsIDB4MjBhOSwgMHgwMDEwLCAweDIwMDksCisJMHhmZmZmLCAweDQxMDQsIDB4MDFkZSwgMHgwMTRlLCAweDAxMzYsIDB4MDFjNiwgMHhhODAwLCAweDkwMDUsCisJMHgxMWI4LCAweDg5MGUsIDB4ODEwZSwgMHg4MTBmLCAweDkxODQsIDB4MDAzZiwgMHgyMGUwLCAweDkxODQsCisJMHhmZmMwLCAweDkwODAsIDB4MDAwNCwgMHgyMDk4LCAweDIwYTksIDB4MDAwMSwgMHgyMDA5LCAweDAwMTAsCisJMHg0MDAyLCAweDk2MDYsIDB4MDEyOCwgMHg4MTA5LCAweDFkZDgsIDB4OTA4NSwgMHgwMDAxLCAweDAwNjgsCisJMHgwMTQ2LCAweDAxZDYsIDB4MzMwMCwgMHg4MDAxLCAweDIwYTAsIDB4M2MwMCwgMHgyMGU4LCAweDIwMDEsCisJMHhmZmZmLCAweDQwMDQsIDB4MDFkZSwgMHgwMTRlLCAweDkwMDYsIDB4MDFjZSwgMHgwMTNlLCAweDAwMDUsCisJMHgwMDk2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGI4YTQsIDB4OTA0ZCwgMHgxMTI4LCAweDA4MGMsCisJMHgwZmZmLCAweDAxNjgsIDB4MjkwMCwgMHhiOGE2LCAweDA4MGMsIDB4Njg1NSwgMHhhODAzLCAweDAwMDEsCisJMHhhODA3LCAweDAwMDAsIDB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDA5ZSwgMHgwMDA1LCAweDkwMDYsCisJMHgwY2Q4LCAweDAwOTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YjhhNCwgMHg5MDRkLCAweDAxMzAsCisJMHhiOGE3LCAweDAwMDAsIDB4MDgwYywgMHgxMDMxLCAweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwOWUsCisJMHgwMDA1LCAweGI4OWMsIDB4ZDBhNCwgMHgwMDA1LCAweDAwYjYsIDB4MDBmNiwgMHgwODBjLCAweDc0M2UsCisJMHgwMWIwLCAweDcxYzQsIDB4ODFmZiwgMHgxMTk4LCAweDcxZGMsIDB4ZDE5YywgMHgwMTgwLCAweDIwMDEsCisJMHgwMDdlLCAweDkwODAsIDB4MTAwMCwgMHgyMDA0LCAweDkwNWQsIDB4MDE0OCwgMHhiODA0LCAweDkwODQsCisJMHgwMGZmLCAweDkwODYsIDB4MDAwNiwgMHgxMTE4LCAweGI4MDAsIDB4YzBlZCwgMHhiODAyLCAweDIwNzksCisJMHgxODQ3LCAweDc4MDQsIDB4ZDBhNCwgMHgwMWQwLCAweDAxNTYsIDB4MjBhOSwgMHgwMDdmLCAweDkwMGUsCisJMHgwMDE2LCAweDA4MGMsIDB4NjY5OSwgMHgxMTY4LCAweGI4MDQsIDB4OTA4NCwgMHhmZjAwLCAweDgwMDcsCisJMHg5MDk2LCAweDAwMDQsIDB4MDExOCwgMHg5MDg2LCAweDAwMDYsIDB4MTExOCwgMHhiODAwLCAweGMwZWQsCisJMHhiODAyLCAweDAwMWUsIDB4ODEwOCwgMHgxZjA0LCAweDY4ZTAsIDB4MDE1ZSwgMHgwODBjLCAweDY5Y2EsCisJMHgwMTIwLCAweDIwMDEsIDB4MTk4NCwgMHgyMDBjLCAweDAwMzgsIDB4MjA3OSwgMHgxODQ3LCAweDc4MDQsCisJMHhkMGE0LCAweDAxMzAsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsIDB4NjkwYiwgMHgwODBjLCAweDg2NDgsCisJMHgwMGZlLCAweDAwYmUsIDB4MDAwNSwgMHgwMGI2LCAweDIwMTEsIDB4NjkwYiwgMHgwODBjLCAweDg1YjAsCisJMHgwODBjLCAweDY5Y2EsIDB4MDFkOCwgMHgyMDAxLCAweDEwN2UsIDB4MjAwNCwgMHgyMDU4LCAweGI5MDAsCisJMHhjMWVjLCAweGI5MDIsIDB4MDgwYywgMHg2YTA4LCAweDAxMzAsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsCisJMHg2OTBiLCAweDA4MGMsIDB4ODY0OCwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwgMHg5MDA2LCAweDcwN2UsCisJMHg3MDYwLCAweDcwODIsIDB4MDgwYywgMHgyZmY1LCAweDAwZWUsIDB4MDRiMCwgMHgwMTU2LCAweDAwYzYsCisJMHgyMGE5LCAweDAwN2YsIDB4OTAwZSwgMHgwMDE2LCAweDA4MGMsIDB4NjY5OSwgMHgxNTM4LCAweGI4MDAsCisJMHhkMGVjLCAweDA1MjAsIDB4MDA0NiwgMHhiYWEwLCAweDIyMjAsIDB4OTAwNiwgMHgyMDA5LCAweDAwMjksCisJMHgwODBjLCAweGU3M2EsIDB4YjgwMCwgMHhjMGU1LCAweGMwZWMsIDB4YjgwMiwgMHgwODBjLCAweDZhMDQsCisJMHgyMDAxLCAweDA3MDcsIDB4MTEyOCwgMHhiODA0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg1LCAweDA3MDAsCisJMHhiODA2LCAweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweDkzNTYsIDB4MDA3NiwgMHg5MDNlLCAweDA4MGMsCisJMHg5MjI5LCAweDkwMGUsIDB4MDgwYywgMHhlNDc3LCAweDAwN2UsIDB4MDA0ZSwgMHgwMDFlLCAweDgxMDgsCisJMHgxZjA0LCAweDY5MzMsIDB4MDBjZSwgMHgwMTVlLCAweDAwYmUsIDB4MDAwNSwgMHgwMGI2LCAweDYwMTAsCisJMHgyMDU4LCAweGI4MDAsIDB4YzBlYywgMHhiODAyLCAweDAwYmUsIDB4MDAwNSwgMHgwMGI2LCAweDAwYzYsCisJMHgwMDk2LCAweDA4MGMsIDB4MTAxOCwgMHgwOTBjLCAweDBkZDUsIDB4Mjk1OCwgMHgwMDllLCAweDIwMDEsCisJMHgxOTZhLCAweDJiMDIsIDB4OGIwNywgMHg4MDA2LCAweDgwMDYsIDB4OTA4YywgMHgwMDNmLCAweGI5YzYsCisJMHg5MDhjLCAweGZmYzAsIDB4YjljYSwgMHhiOGFmLCAweDAwMDAsIDB4MjAwOSwgMHgwMGZmLCAweDA4MGMsCisJMHg2MGM3LCAweGI4MDcsIDB4MDAwNiwgMHhiODEzLCAweDAwZmYsIDB4YjgxNywgMHhmZmZmLCAweGI4NmYsCisJMHgwMjAwLCAweGI4NmMsIDB4Yjg5MywgMHgwMDAyLCAweGI4YmIsIDB4MDUyMCwgMHhiOGEzLCAweDAwZmYsCisJMHhiOGFmLCAweDAwMDAsIDB4MDBjZSwgMHgwMGJlLCAweDAwMDUsIDB4NzgxMCwgMHgwMGI2LCAweDIwNTgsCisJMHhiODAwLCAweDAwYmUsIDB4ZDBhYywgMHgwMDA1LCAweDYwMTAsIDB4MDBiNiwgMHg5MDVkLCAweDAxMDgsCisJMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweGI4MDQsCisJMHg5MDhjLCAweDAwZmYsIDB4OTE5NiwgMHgwMDA2LCAweDAxODgsIDB4OTE5NiwgMHgwMDA0LCAweDAxNzAsCisJMHg5MTk2LCAweDAwMDUsIDB4MDE1OCwgMHg5MDhjLCAweGZmMDAsIDB4ODEwZiwgMHg5MTk2LCAweDAwMDYsCisJMHgwMTI4LCAweDkxOTYsIDB4MDAwNCwgMHgwMTEwLCAweDkxOTYsIDB4MDAwNSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMDBlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGY2LCAweDIwMDEsIDB4MTA3ZSwgMHgyMDA0LCAweDkwNWQsCisJMHgwMTEwLCAweGI4MDAsIDB4ZDBlYywgMHgwMGZlLCAweDAwYmUsIDB4MDAwNSwgMHgwMTI2LCAweDAwMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDAwNiwgMHhiYWEwLCAweDkyOTAsIDB4MTAwMCwgMHgyMjA0LCAweDliMDYsCisJMHgxOTBjLCAweDBkZDUsIDB4MDAwZSwgMHhiYTAwLCAweDkwMDUsIDB4MDExMCwgMHhjMmZkLCAweDAwMDgsCisJMHhjMmZjLCAweGJhMDIsIDB4MDAyZSwgMHgwMTJlLCAweDAwMDUsIDB4MjAxMSwgMHgxODM3LCAweDIyMDQsCisJMHhkMGNjLCAweDAxMzgsIDB4MjAwMSwgMHgxOTgyLCAweDIwMGMsIDB4MjAxMSwgMHg2OWZhLCAweDA4MGMsCisJMHg4NjQ4LCAweDAwMDUsIDB4MjAxMSwgMHg2OWZhLCAweDA4MGMsIDB4ODViMCwgMHgyMDExLCAweDE4MzcsCisJMHgyMjA0LCAweGMwY2MsIDB4MjAxMiwgMHgwMDA1LCAweDA4MGMsIDB4NTc1ZCwgMHhkMGFjLCAweDAwMDUsCisJMHgwODBjLCAweDU3NWQsIDB4ZDBhNCwgMHgwMDA1LCAweDAwMTYsIDB4YjkwNCwgMHg5MTg0LCAweDAwZmYsCisJMHg5MDhlLCAweDAwMDYsIDB4MDAxZSwgMHgwMDA1LCAweDAwMTYsIDB4YjkwNCwgMHg5MTg0LCAweGZmMDAsCisJMHg4MDA3LCAweDkwOGUsIDB4MDAwNiwgMHgwMDFlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGY2LCAweDA4MGMsCisJMHhkMzg4LCAweDAxNTgsIDB4NzBkYywgMHg5MDg0LCAweDAwMjgsIDB4MDEzOCwgMHgyMDAxLCAweDEwN2YsCisJMHgyMDA0LCAweDkwNWQsIDB4MDExMCwgMHhiOGNjLCAweGQwOTQsIDB4MDBmZSwgMHgwMGJlLCAweDAwMDUsCisJMHgyMDcxLCAweDE5MTAsIDB4NzAwMywgMHgwMDAxLCAweDcwMDcsIDB4MDAwMCwgMHg5MDA2LCAweDcwMTIsCisJMHg3MDE2LCAweDcwMWEsIDB4NzAxZSwgMHg3MDBhLCAweDcwNDYsIDB4MDAwNSwgMHgwMDE2LCAweDAwZTYsCisJMHgyMDcxLCAweDE5NDcsIDB4OTAwZSwgMHg3MTBhLCAweDA4MGMsIDB4NTc1ZCwgMHhkMGZjLCAweDExNDAsCisJMHgwODBjLCAweDU3NWQsIDB4OTAwZSwgMHhkMDljLCAweDAxMDgsIDB4ODEwOCwgMHg3MTAyLCAweDAwZjgsCisJMHgyMDAxLCAweDE4NjcsIDB4MjAwYywgMHg5MTg0LCAweDAwMDcsIDB4MDAwMiwgMHg2YTQ4LCAweDZhNDgsCisJMHg2YTQ4LCAweDZhNDgsIDB4NmE0OCwgMHg2YTVlLCAweDZhNmMsIDB4NmE0OCwgMHg3MDAzLCAweDAwMDMsCisJMHgyMDA5LCAweDE4NjgsIDB4MjEwYywgMHg5MTg0LCAweGZmMDAsIDB4ODAwNywgMHg5MDA1LCAweDExMTAsCisJMHgyMDAxLCAweDAwMDIsIDB4NzAwNiwgMHgwMDE4LCAweDcwMDMsIDB4MDAwNSwgMHgwYzg4LCAweDAwZWUsCisJMHgwMDFlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDAwNTAsIDB4Njg0YywgMHg5MDA1LCAweDExNTAsCisJMHgwMGU2LCAweDIwNzEsIDB4MTkxMCwgMHg3MDI4LCAweGMwODUsIDB4NzAyYSwgMHgwMGVlLCAweDkwODUsCisJMHgwMDAxLCAweDA0ODgsIDB4Njg0NCwgMHg5MDA1LCAweDAxNTgsIDB4MDgwYywgMHg3Nzk2LCAweDZhNjAsCisJMHg5MjAwLCAweDcwMDIsIDB4Njg2NCwgMHg5MTAxLCAweDcwMDYsIDB4OTAwNiwgMHg3MDEyLCAweDcwMTYsCisJMHg2ODYwLCAweDcwMDIsIDB4Njg2NCwgMHg3MDA2LCAweDY4NjgsIDB4NzAwYSwgMHg2ODZjLCAweDcwMGUsCisJMHg2ODQ0LCAweDkwMDUsIDB4MTExMCwgMHg3MDEyLCAweDcwMTYsIDB4Njg0YywgMHg3MDFhLCAweDcwMWMsCisJMHg5MDg1LCAweDAwNDAsIDB4NzAxZSwgMHg3MDM3LCAweDAwMTksIDB4NzAyYiwgMHgwMDAxLCAweDAwZTYsCisJMHgyMDcxLCAweDE5MTAsIDB4NzAyOCwgMHhjMDg0LCAweDcwMmEsIDB4NzAwNywgMHgwMDAxLCAweDcwMGIsCisJMHgwMDAwLCAweDAwZWUsIDB4OTAwNiwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgwMDI2LCAweDIwNzEsCisJMHgxOTQ3LCAweDcwMDAsIDB4OTAxNSwgMHgwOTA0LCAweDZkMWMsIDB4OTI4NiwgMHgwMDAzLCAweDA5MDQsCisJMHg2YmIyLCAweDkyODYsIDB4MDAwNSwgMHgwOTA0LCAweDZiYjIsIDB4MjA3MSwgMHgxODc3LCAweGE4N2MsCisJMHg5MDA1LCAweDA5MDQsIDB4NmIxMywgMHg3MTQwLCAweGE4NjgsIDB4OTEwMiwgMHgwYTA0LCAweDZkMWMsCisJMHhhODc4LCAweGQwODQsIDB4MTVkOCwgMHhhODUzLCAweDAwMTksIDB4MjAwMSwgMHg4MDIzLCAweGE4NGUsCisJMHgyMDcxLCAweDE5MTAsIDB4NzAxYywgMHg5MDA1LCAweDE5MDQsIDB4NmViMiwgMHgwZTA0LCAweDZmMjAsCisJMHgyMDcxLCAweDAwMDAsIDB4YTg1MCwgMHg3MDMyLCAweGE4NGMsIDB4NzA4MiwgMHhhODcwLCAweDcwODYsCisJMHhhODZjLCAweDcwOGEsIDB4YTg4MCwgMHg3MDhlLCAweDcwMzYsIDB4MDE0NiwgMHgwMWQ2LCAweDAxMzYsCisJMHgwMWM2LCAweDAxNTYsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDAyYSwgMHhhODY4LCAweDIwYTgsCisJMHhhODYwLCAweDIwZTAsIDB4YTg1YywgMHg5MDgwLCAweDAwMjEsIDB4MjA5OCwgMHg0MDAzLCAweDAxNWUsCisJMHgwMWNlLCAweDAxM2UsIDB4MDFkZSwgMHgwMTRlLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwODksCisJMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMTliLCAweDA4MDQsIDB4NmI5NSwgMHhhODUzLCAweDAwMWIsCisJMHgyMDAxLCAweDgwMjcsIDB4MDgyMCwgMHg3MDA0LCAweGQwOGMsIDB4MTkwNCwgMHg2ZDFjLCAweGE4NTMsCisJMHgwMDFhLCAweDIwMDEsIDB4ODAyNCwgMHgwODA0LCAweDZhZDcsIDB4MDBlNiwgMHgwMDI2LCAweDIwNzEsCisJMHgxOTQ3LCAweDcwMDAsIDB4OTAxNSwgMHgwOTA0LCAweDZkMWMsIDB4OTI4NiwgMHgwMDAzLCAweDA5MDQsCisJMHg2YmIyLCAweDkyODYsIDB4MDAwNSwgMHgwOTA0LCAweDZiYjIsIDB4YTg0ZiwgMHg4MDIyLCAweGE4NTMsCisJMHgwMDE4LCAweDA4MDQsIDB4NmI3YSwgMHhhODY4LCAweGQwZmMsIDB4MTFkOCwgMHgwMGU2LCAweDAwMjYsCisJMHgyMDAxLCAweDE5NDcsIDB4MjAwNCwgMHg5MDA1LCAweDA5MDQsIDB4NmQxYywgMHhhODdjLCAweGQwYmMsCisJMHgxOTA0LCAweDZkMWMsIDB4YTk3OCwgMHhhODc0LCAweDkxMDUsIDB4MTkwNCwgMHg2ZDFjLCAweDIwMDEsCisJMHgxOTQ3LCAweDIwMDQsIDB4MDAwMiwgMHg2ZDFjLCAweDZiNzYsIDB4NmJiMiwgMHg2YmIyLCAweDZkMWMsCisJMHg2YmIyLCAweDAwMDUsIDB4YTg2OCwgMHhkMGZjLCAweDE1MDAsIDB4MDBlNiwgMHgwMDI2LCAweDIwMDksCisJMHgxOTQ3LCAweDIxMGMsIDB4ODFmZiwgMHgwOTA0LCAweDZkMWMsIDB4YTg3YywgMHhkMGNjLCAweDA5MDQsCisJMHg2ZDFjLCAweGE4ODAsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwMSwgMHgxOTA0LCAweDZkMWMsCisJMHg5MTg2LCAweDAwMDMsIDB4MDkwNCwgMHg2YmIyLCAweDkxODYsIDB4MDAwNSwgMHgwOTA0LCAweDZiYjIsCisJMHhhODRmLCAweDgwMjEsIDB4YTg1MywgMHgwMDE3LCAweDAwMjgsIDB4MDAwNSwgMHhhODRmLCAweDgwMjAsCisJMHhhODUzLCAweDAwMTYsIDB4MjA3MSwgMHgxOTEwLCAweDcwMWMsIDB4OTAwNSwgMHgxOTA0LCAweDZlYjIsCisJMHgwZTA0LCAweDZmMjAsIDB4MjA3MSwgMHgwMDAwLCAweGE4NGMsIDB4NzA4MiwgMHhhODUwLCAweDcwMzIsCisJMHhhODZjLCAweDcwODYsIDB4NzAzNiwgMHhhODcwLCAweDcwOGEsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsCisJMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLCAweDExOWIsIDB4MjA3MSwgMHgxODAwLCAweDIwMTEsCisJMHgwMDAxLCAweGE4MDQsIDB4OTAwZCwgMHg3MDJjLCAweDExNTgsIDB4YTgwMiwgMHgyOTAwLCAweDcwMmUsCisJMHg3MGMwLCAweDkyMDAsIDB4NzBjMiwgMHgwODBjLCAweDg0YzIsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsCisJMHgwMDk2LCAweDIxNDgsIDB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLCAweDFkYzgsCisJMHgwMDllLCAweDBjNTgsIDB4YTg0ZiwgMHgwMDAwLCAweDAwZjYsIDB4MjA3OSwgMHgwMDUwLCAweDIwNzEsCisJMHgxOTEwLCAweGE4MDMsIDB4MDAwMCwgMHg3MDEwLCAweDkwMDUsIDB4MTkwNCwgMHg2Y2ExLCAweDc4MmMsCisJMHg5MDhjLCAweDA3ODAsIDB4MTkwYywgMHg3MDZlLCAweDgwMDQsIDB4ODAwNCwgMHg4MDA0LCAweDkwODQsCisJMHgwMDAzLCAweDAwMDIsIDB4NmJkMCwgMHg2Y2ExLCAweDZiZjUsIDB4NmMzYywgMHgwODBjLCAweDBkZDUsCisJMHgyMDcxLCAweDE4MDAsIDB4MjkwMCwgMHg3ODIyLCAweGE4MDQsIDB4OTAwZCwgMHgxMTcwLCAweDIwNzEsCisJMHgxOWY5LCAweDcwM2MsIDB4OTAwNSwgMHgxMzI4LCAweDIwMDEsIDB4MTk0OCwgMHgyMDA0LCAweDgwMDUsCisJMHg3MDNlLCAweDAwZmUsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4OTAxNiwgMHg3MDJjLCAweDIxNDgsCisJMHhhOTA0LCAweGE4MDIsIDB4ODIxMCwgMHgyOTAwLCAweDgxZmYsIDB4MWRjOCwgMHg3MDJlLCAweDcwYzAsCisJMHg5MjAwLCAweDcwYzIsIDB4MDgwYywgMHg4NGMyLCAweDBjMTAsIDB4MjA3MSwgMHgxODAwLCAweDI5MDAsCisJMHg3ODIyLCAweGE4MDQsIDB4OTAwZCwgMHgxNTgwLCAweDc4MjQsIDB4MDBlNiwgMHgyMDcxLCAweDAwNDAsCisJMHg3MTJjLCAweGQxOWMsIDB4MTE0OCwgMHgyMDA5LCAweDE4MzAsIDB4MjEwYywgMHg5MThhLCAweDAwMjAsCisJMHgwMjE4LCAweDcwMjIsIDB4MDBlZSwgMHgwMDU4LCAweDAwZWUsIDB4MjA0OCwgMHg3MDJjLCAweGE4MDIsCisJMHgyOTAwLCAweDcwMmUsIDB4NzBjMCwgMHg4MDAwLCAweDcwYzIsIDB4MDgwYywgMHg4NGMyLCAweDc4MmMsCisJMHg5MDk0LCAweDA3ODAsIDB4MTkwYywgMHg3MDZlLCAweGQwYTQsIDB4MTlmMCwgMHgyMDcxLCAweDE5ZjksCisJMHg3MDNjLCAweDkwMDUsIDB4MTMyOCwgMHgyMDAxLCAweDE5NDgsIDB4MjAwNCwgMHg4MDA1LCAweDcwM2UsCisJMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDkwMTYsIDB4NzAyYywgMHgyMTQ4LCAweGE5MDQsCisJMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwgMHg3MGMwLCAweDkyMDAsCisJMHg3MGMyLCAweDA4MGMsIDB4ODRjMiwgMHgwODAwLCAweDAwOTYsIDB4MDBlNiwgMHg3ODI0LCAweDIwNDgsCisJMHgyMDcxLCAweDE4MDAsIDB4NzAyYywgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGMwLCAweDgwMDAsCisJMHg3MGMyLCAweDA4MGMsIDB4ODRjMiwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcwNmUsCisJMHhkMGE0LCAweDFkNjAsIDB4MDBlZSwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcwNmUsCisJMHhkMDljLCAweDExYTAsIDB4MDA5ZSwgMHgyOTAwLCAweDc4MjIsIDB4YTgwNCwgMHg5MDBkLCAweDE1NjAsCisJMHgyMDcxLCAweDE5ZjksIDB4NzAzYywgMHg5MDA1LCAweDEzMjgsIDB4MjAwMSwgMHgxOTQ4LCAweDIwMDQsCisJMHg4MDA1LCAweDcwM2UsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHgwMDllLCAweDI5MDgsCisJMHg3MDEwLCAweDgwMDAsIDB4NzAxMiwgMHg3MDE4LCAweDkwNGQsIDB4NzExYSwgMHgwMTEwLCAweGE5MDIsCisJMHgwMDA4LCAweDcxMWUsIDB4MjE0OCwgMHhhODA0LCAweDkwMGQsIDB4MTE3MCwgMHgyMDcxLCAweDE5ZjksCisJMHg3MDNjLCAweDkwMDUsIDB4MTMyOCwgMHgyMDAxLCAweDE5NDgsIDB4MjAwNCwgMHg4MDA1LCAweDcwM2UsCisJMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwgMHg5MDE2LCAweDcwMmMsCisJMHgyMTQ4LCAweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwgMHgxZGM4LCAweDcwMmUsCisJMHg3MGMwLCAweDkyMDAsIDB4NzBjMiwgMHgwODBjLCAweDg0YzIsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsCisJMHgwMDA1LCAweDI5MDgsIDB4NzAxMCwgMHg4MDAwLCAweDcwMTIsIDB4NzAxOCwgMHg5MDRkLCAweDcxMWEsCisJMHgwMTEwLCAweGE5MDIsIDB4MDAwOCwgMHg3MTFlLCAweDIxNDgsIDB4YTgwNCwgMHg5MDBkLCAweDE5MDQsCisJMHg2Y2Y2LCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NzA2ZSwgMHhkMDljLCAweDExOTgsCisJMHg3MDFjLCAweDkwNGQsIDB4MDE4MCwgMHg3MDEwLCAweDgwMDEsIDB4NzAxMiwgMHgxMTA4LCAweDcwMWEsCisJMHhhODAwLCAweDcwMWUsIDB4MjkwMCwgMHg3ODIyLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsCisJMHg3MDZlLCAweGQwOWMsIDB4MGQ2OCwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcwNmUsCisJMHhkMGE0LCAweDAxYjAsIDB4MDBlNiwgMHg3ODI0LCAweDIwNDgsIDB4MjA3MSwgMHgxODAwLCAweDcwMmMsCisJMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGMwLCAweDgwMDAsIDB4NzBjMiwgMHgwODBjLCAweDg0YzIsCisJMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcwNmUsIDB4ZDBhNCwgMHgxZDYwLCAweDAwZWUsCisJMHgyMDcxLCAweDE5ZjksIDB4NzAzYywgMHg5MDA1LCAweDEzMjgsIDB4MjAwMSwgMHgxOTQ4LCAweDIwMDQsCisJMHg4MDA1LCAweDcwM2UsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsCisJMHgxODAwLCAweDkwMTYsIDB4NzAyYywgMHgyMTQ4LCAweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsCisJMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwgMHg3MGMwLCAweDkyMDAsIDB4NzBjMiwgMHgwODBjLCAweDg0YzIsCisJMHgwMGVlLCAweDA4MDQsIDB4NmNiMSwgMHhhODY4LCAweGQwZmMsIDB4MTU2MCwgMHgwMDk2LCAweGE4MDQsCisJMHhhODA3LCAweDAwMDAsIDB4OTA0ZCwgMHgxOTBjLCAweDBmYjEsIDB4MDA5ZSwgMHgwMDE4LCAweGE4NjgsCisJMHhkMGZjLCAweDE1MDAsIDB4MDBlNiwgMHgwMDI2LCAweGE4NGYsIDB4MDAwMCwgMHgwMGY2LCAweDIwNzksCisJMHgwMDUwLCAweDIwNzEsIDB4MTkxMCwgMHhhODAzLCAweDAwMDAsIDB4NzAxMCwgMHg5MDA1LCAweDE5MDQsCisJMHg2ZTMwLCAweDc4MmMsIDB4OTA4YywgMHgwNzgwLCAweDE5MGMsIDB4NzA2ZSwgMHg4MDA0LCAweDgwMDQsCisJMHg4MDA0LCAweDkwODQsIDB4MDAwMywgMHgwMDAyLCAweDZkM2IsIDB4NmUzMCwgMHg2ZDU2LCAweDZkYzMsCisJMHgwODBjLCAweDBkZDUsIDB4MDAwNSwgMHgyMDcxLCAweDE4MDAsIDB4MjkwMCwgMHg3ODIyLCAweGE4MDQsCisJMHg5MDBkLCAweDExMjAsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHg5MDE2LCAweDcwMmMsCisJMHgyMTQ4LCAweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwgMHgxZGM4LCAweDcwMmUsCisJMHg3MGMwLCAweDkyMDAsIDB4NzBjMiwgMHgwODBjLCAweDg0YzIsIDB4MGM2MCwgMHgyMDcxLCAweDE4MDAsCisJMHgyOTAwLCAweDc4MjIsIDB4YTgwNCwgMHg5MDBkLCAweDE5MDQsIDB4NmRiMiwgMHg3ODMwLCAweDgwMDcsCisJMHg5MDg0LCAweDAwMWYsIDB4OTA4MiwgMHgwMDAxLCAweDEyMjAsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsCisJMHgwMDA1LCAweDc4MjQsIDB4MDBlNiwgMHgyMDcxLCAweDAwNDAsIDB4NzEyYywgMHhkMTljLCAweDExNDgsCisJMHgyMDA5LCAweDE4MzAsIDB4MjEwYywgMHg5MThhLCAweDAwMjAsIDB4MDIxOCwgMHg3MDIyLCAweDAwZWUsCisJMHgwMDU4LCAweDAwZWUsIDB4MjA0OCwgMHg3MDJjLCAweGE4MDIsIDB4MjkwMCwgMHg3MDJlLCAweDcwYzAsCisJMHg4MDAwLCAweDcwYzIsIDB4MDgwYywgMHg4NGMyLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsCisJMHg3MDZlLCAweGQwYTQsIDB4MTlmMCwgMHgwZTA0LCAweDZkYTksIDB4NzgzOCwgMHg3OTM4LCAweDkxMGUsCisJMHgxZGUwLCAweDAwZDYsIDB4MjA2OSwgMHgwMDAwLCAweDY4MzYsIDB4NjgzMywgMHgwMDEzLCAweDAwZGUsCisJMHgyMDAxLCAweDE5MjEsIDB4MjAwYywgMHhjMTg0LCAweDIxMDIsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsCisJMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLCAweDExOWIsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsCisJMHgwMDA1LCAweDIwMDEsIDB4MTkyMSwgMHgyMDBjLCAweGMxODUsIDB4MjEwMiwgMHgwMGZlLCAweDAwMmUsCisJMHgwMGVlLCAweDAwMDUsIDB4OTAxNiwgMHg3MDJjLCAweDIxNDgsIDB4YTkwNCwgMHhhODAyLCAweDgyMTAsCisJMHgyOTAwLCAweDgxZmYsIDB4MWRjOCwgMHg3MDJlLCAweDcwYzAsIDB4OTIwMCwgMHg3MGMyLCAweDA4MGMsCisJMHg4NGMyLCAweDA4MDQsIDB4NmQ2OSwgMHgwMDk2LCAweDAwZTYsIDB4NzgyNCwgMHgyMDQ4LCAweDIwNzEsCisJMHgxODAwLCAweDcwMmMsIDB4YTgwMiwgMHgyOTAwLCAweDcwMmUsIDB4NzBjMCwgMHg4MDAwLCAweDcwYzIsCisJMHgwODBjLCAweDg0YzIsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywgMHg3MDZlLCAweGQwYTQsCisJMHgxZDYwLCAweDAwZWUsIDB4MGUwNCwgMHg2ZTAzLCAweDc4MzgsIDB4NzkzOCwgMHg5MTBlLCAweDFkZTAsCisJMHgwMGQ2LCAweDIwNjksIDB4MDAwMCwgMHg2ODM2LCAweDY4MzMsIDB4MDAxMywgMHgwMGRlLCAweDcwNDQsCisJMHhjMDg0LCAweDcwNDYsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsCisJMHgxOTBjLCAweDExOWIsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywgMHg3MDZlLCAweGQwOWMsCisJMHgxMTcwLCAweDAwOWUsIDB4MjkwMCwgMHg3ODIyLCAweGE4MDQsIDB4OTAwZCwgMHgxMWUwLCAweDAwZmUsCisJMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHg3MDQ0LCAweGMwODUsIDB4NzA0NiwgMHgwYzU4LCAweDAwOWUsCisJMHgyOTA4LCAweDcwMTAsIDB4ODAwMCwgMHg3MDEyLCAweDcwMTgsIDB4OTA0ZCwgMHg3MTFhLCAweDAxMTAsCisJMHhhOTAyLCAweDAwMDgsIDB4NzExZSwgMHgyMTQ4LCAweGE4MDQsIDB4OTAwZCwgMHgxMTIwLCAweDAwZmUsCisJMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDcxLCAweDE4MDAsIDB4OTAxNiwgMHg3MDJjLCAweDIxNDgsCisJMHhhOTA0LCAweGE4MDIsIDB4ODIxMCwgMHgyOTAwLCAweDgxZmYsIDB4MWRjOCwgMHg3MDJlLCAweDcwYzAsCisJMHg5MjAwLCAweDcwYzIsIDB4MDgwYywgMHg4NGMyLCAweDAwZmUsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsCisJMHgyOTA4LCAweDcwMTAsIDB4ODAwMCwgMHg3MDEyLCAweDcwMTgsIDB4OTA0ZCwgMHg3MTFhLCAweDAxMTAsCisJMHhhOTAyLCAweDAwMDgsIDB4NzExZSwgMHgyMTQ4LCAweGE4MDQsIDB4OTAwZCwgMHgxOTA0LCAweDZlOWQsCisJMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcwNmUsIDB4ZDA5YywgMHgxMWIwLCAweDcwMWMsCisJMHg5MDRkLCAweDAxOTgsIDB4YTg0YywgMHg5MDA1LCAweDExODAsIDB4NzAxMCwgMHg4MDAxLCAweDcwMTIsCisJMHgxMTA4LCAweDcwMWEsIDB4YTgwMCwgMHg3MDFlLCAweDI5MDAsIDB4NzgyMiwgMHg3ODJjLCAweDkwOTQsCisJMHgwNzgwLCAweDE5MGMsIDB4NzA2ZSwgMHhkMDljLCAweDBkNTAsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsCisJMHgxOTBjLCAweDcwNmUsIDB4ZDBhNCwgMHgwNWE4LCAweDAwZTYsIDB4NzgyNCwgMHgyMDQ4LCAweDIwNzEsCisJMHgxODAwLCAweDcwMmMsIDB4YTgwMiwgMHgyOTAwLCAweDcwMmUsIDB4NzBjMCwgMHg4MDAwLCAweDcwYzIsCisJMHgwODBjLCAweDg0YzIsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywgMHg3MDZlLCAweGQwYTQsCisJMHgxZDYwLCAweDAwZWUsIDB4MGUwNCwgMHg2ZTk2LCAweDc4MzgsIDB4NzkzOCwgMHg5MTBlLCAweDFkZTAsCisJMHgwMGQ2LCAweDIwNjksIDB4MDAwMCwgMHg2ODM2LCAweDY4MzMsIDB4MDAxMywgMHgwMGRlLCAweDcwNDQsCisJMHhjMDg0LCAweDcwNDYsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsCisJMHgxOTBjLCAweDExOWIsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHg3MDQ0LCAweGMwODUsCisJMHg3MDQ2LCAweDAwZmUsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE4MDAsCisJMHg5MDE2LCAweDcwMmMsIDB4MjE0OCwgMHhhOTA0LCAweGE4MDIsIDB4ODIxMCwgMHgyOTAwLCAweDgxZmYsCisJMHgxZGM4LCAweDcwMmUsIDB4NzBjMCwgMHg5MjAwLCAweDcwYzIsIDB4MDgwYywgMHg4NGMyLCAweDAwZWUsCisJMHgwODA0LCAweDZlNDAsIDB4MjA3MSwgMHgxOTEwLCAweGE4MDMsIDB4MDAwMCwgMHgyOTA4LCAweDcwMTAsCisJMHg4MDAwLCAweDcwMTIsIDB4NzAxOCwgMHg5MDRkLCAweDcxMWEsIDB4MDExMCwgMHhhOTAyLCAweDAwMDgsCisJMHg3MTFlLCAweDIxNDgsIDB4YTgwNCwgMHg5MDBkLCAweDExMjgsIDB4MWUwNCwgMHg2ZWRkLCAweDAwMmUsCisJMHgwMGVlLCAweDAwMDUsIDB4MjA3MSwgMHgxODAwLCAweDkwMTYsIDB4NzAyYywgMHgyMTQ4LCAweGE5MDQsCisJMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwgMHg3MGMwLCAweDkyMDAsCisJMHg3MGMyLCAweDA4MGMsIDB4ODRjMiwgMHgwZTA0LCAweDZlYzcsIDB4MjA3MSwgMHgxOTEwLCAweDcwMWMsCisJMHgyMDQ4LCAweGE4NGMsIDB4OTAwZCwgMHgwZDE4LCAweDIwNzEsIDB4MDAwMCwgMHg3MTgyLCAweGE4NTAsCisJMHg3MDMyLCAweGE4NmMsIDB4NzA4NiwgMHg3MDM2LCAweGE4NzAsIDB4NzA4YSwgMHhhODUwLCAweDkwODIsCisJMHgwMDE5LCAweDEyNzgsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsCisJMHgxOTBjLCAweDExOWIsIDB4MjA3MSwgMHgxOTEwLCAweDA4MGMsIDB4NzA1YSwgMHgwMDJlLCAweDAwZWUsCisJMHgwMDA1LCAweGE4NTAsIDB4OTA4MiwgMHgwMDFjLCAweDFlNjgsIDB4YTg4MCwgMHg3MDhlLCAweDcwMzYsCisJMHgwMTQ2LCAweDAxZDYsIDB4MDEzNiwgMHgwMWM2LCAweDAxNTYsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsCisJMHgwMDJhLCAweGE4NjgsIDB4MjBhOCwgMHhhODYwLCAweDIwZTAsIDB4YTg1YywgMHg5MDgwLCAweDAwMjEsCisJMHgyMDk4LCAweDQwMDMsIDB4MDE1ZSwgMHgwMWNlLCAweDAxM2UsIDB4MDFkZSwgMHgwMTRlLCAweDA4OTAsCisJMHgyMDcxLCAweDE5MTAsIDB4YTgwMywgMHgwMDAwLCAweDI5MDgsIDB4NzAxMCwgMHg4MDAwLCAweDcwMTIsCisJMHg3MDE4LCAweDkwNGQsIDB4NzExYSwgMHgwMTEwLCAweGE5MDIsIDB4MDAwOCwgMHg3MTFlLCAweDIxNDgsCisJMHhhODA0LCAweDkwMGQsIDB4MTExOCwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDcxLCAweDE4MDAsCisJMHg5MDE2LCAweDcwMmMsIDB4MjE0OCwgMHhhOTA0LCAweGE4MDIsIDB4ODIxMCwgMHgyOTAwLCAweDgxZmYsCisJMHgxZGM4LCAweDcwMmUsIDB4NzBjMCwgMHg5MjAwLCAweDcwYzIsIDB4MDgwYywgMHg4NGMyLCAweDAwMmUsCisJMHgwMGVlLCAweDAwMDUsIDB4MDAwNiwgMHhhODdjLCAweDAwMDYsIDB4YTg2NywgMHgwMTAzLCAweDIwYTksCisJMHgwMDFjLCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDkwODAsIDB4MDAxZCwgMHgyMGEwLCAweDkwMDYsCisJMHg0MDA0LCAweDAwMGUsIDB4OTA4NCwgMHgwMGZmLCAweGE4N2UsIDB4MDAwZSwgMHhhODdhLCAweGE5ODIsCisJMHgwMDA1LCAweDIwNzEsIDB4MTkxMCwgMHg3MDA0LCAweDAwMDIsIDB4NmY2ZCwgMHg2ZjZlLCAweDcwNTksCisJMHg2ZjZlLCAweDZmNmIsIDB4NzA1OSwgMHgwODBjLCAweDBkZDUsIDB4MDAwNSwgMHgyMDAxLCAweDE5NDcsCisJMHgyMDA0LCAweDAwMDIsIDB4NmY3OCwgMHg2Zjc4LCAweDZmZjIsIDB4NmZmMywgMHg2Zjc4LCAweDZmZjMsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgxZTBjLCAweDcwNzksIDB4NzAxYywgMHg5MDRkLCAweDA1MDgsCisJMHhhODRjLCAweDkwMDUsIDB4MDkwNCwgMHg2ZmMzLCAweDBlMDQsIDB4NmZhMSwgMHhhOTRjLCAweDIwNzEsCisJMHgwMDAwLCAweDcxODIsIDB4YTg1MCwgMHg3MDMyLCAweGE4NmMsIDB4NzA4NiwgMHg3MDM2LCAweGE4NzAsCisJMHg3MDhhLCAweGE4NTAsIDB4OTA4MiwgMHgwMDE5LCAweDEyNzgsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsCisJMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLCAweDExOWIsIDB4MjA3MSwgMHgxOTEwLCAweDA4MGMsCisJMHg3MDVhLCAweDAxMmUsIDB4MDgwNCwgMHg2ZmYxLCAweGE4NTAsIDB4OTA4MiwgMHgwMDFjLCAweDFlNjgsCisJMHhhODgwLCAweDcwOGUsIDB4NzAzNiwgMHgwMTQ2LCAweDAxZDYsIDB4MDEzNiwgMHgwMWM2LCAweDAxNTYsCisJMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMDJhLCAweGE4NjgsIDB4MjBhOCwgMHhhODYwLCAweDIwZTAsCisJMHhhODVjLCAweDkwODAsIDB4MDAyMSwgMHgyMDk4LCAweDQwMDMsIDB4MDE1ZSwgMHgwMWNlLCAweDAxM2UsCisJMHgwMWRlLCAweDAxNGUsIDB4MDg5MCwgMHgyMDAxLCAweDAwNWIsIDB4MjAwNCwgMHg5MDk0LCAweDA3ODAsCisJMHgxOTBjLCAweDcwNmUsIDB4ZDA5YywgMHgyMDcxLCAweDE5MTAsIDB4MTUxMCwgMHgyMDcxLCAweDE5MTAsCisJMHg3MDBmLCAweDAwMDEsIDB4YTk2NCwgMHg5MTg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDAzLCAweDExMzAsCisJMHg4MTBmLCAweDkxOGMsIDB4MDBmZiwgMHg4MTAxLCAweDAxMDgsIDB4NzEwZSwgMHgyOTAwLCAweDAwZDYsCisJMHgyMDY5LCAweDAwNTAsIDB4NjgyMiwgMHgwMGRlLCAweDIwNzEsIDB4MTkxMCwgMHg3MDFjLCAweDIwNDgsCisJMHg3MDEwLCAweDgwMDEsIDB4NzAxMiwgMHhhODAwLCAweDcwMWUsIDB4OTAwNSwgMHgxMTA4LCAweDcwMWEsCisJMHgwMTJlLCAweDAwMDUsIDB4MDAwNSwgMHgwMGQ2LCAweDIwMDgsIDB4MjA2OSwgMHgxOWY5LCAweDY4M2MsCisJMHg5MDA1LCAweDA3NjAsIDB4MDE1OCwgMHg5MTg2LCAweDAwMDMsIDB4MDU0MCwgMHgyMDAxLCAweDE4MTUsCisJMHgyMDA0LCAweDIwMDksIDB4MWFjYSwgMHgyMTBjLCAweDkxMDIsIDB4MTUwMCwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDIwNjksIDB4MDA1MCwgMHg2OTNjLCAweDY4MzgsIDB4OTEwNiwgMHgwMTkwLCAweDBlMDQsCisJMHg3MDI1LCAweDIwNjksIDB4MDAwMCwgMHg2ODM3LCAweDgwNDAsIDB4NjgzMywgMHgwMDEyLCAweDY4ODMsCisJMHg4MDQwLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDE5MGMsCisJMHgxMTliLCAweDIwNjksIDB4MTlmOSwgMHg2ODNmLCAweGZmZmYsIDB4MDEyZSwgMHgwMGRlLCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MWUwYywgMHg3MGRhLCAweDcwMWMsIDB4OTA0ZCwgMHgwNTQwLCAweDIwMDEsCisJMHgwMDViLCAweDIwMDQsIDB4OTA5NCwgMHgwNzgwLCAweDE1YzksIDB4ZDA5YywgMHgxNTAwLCAweDIwNzEsCisJMHgxOTEwLCAweDcwMGYsIDB4MDAwMSwgMHhhOTY0LCAweDkxODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDMsCisJMHgxMTMwLCAweDgxMGYsIDB4OTE4YywgMHgwMGZmLCAweDgxMDEsIDB4MDEwOCwgMHg3MTBlLCAweDI5MDAsCisJMHgwMGQ2LCAweDIwNjksIDB4MDA1MCwgMHg2ODIyLCAweDAwZGUsIDB4NzAxYywgMHgyMDQ4LCAweDcwMTAsCisJMHg4MDAxLCAweDcwMTIsIDB4YTgwMCwgMHg3MDFlLCAweDkwMDUsIDB4MTEwOCwgMHg3MDFhLCAweDAxMmUsCisJMHgwMDA1LCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAxYywgMHg5MDRkLCAweDAxNjAsCisJMHg3MDEwLCAweDgwMDEsIDB4NzAxMiwgMHhhODAwLCAweDcwMWUsIDB4OTAwNSwgMHgxMTA4LCAweDcwMWEsCisJMHgwMTJlLCAweDA4MGMsIDB4MTAzMSwgMHgwMDA1LCAweDAxMmUsIDB4MDAwNSwgMHgyMDkxLCAweDgwMDAsCisJMHgwZTA0LCAweDcwNzAsIDB4MDAwNiwgMHgwMDE2LCAweDIwMDEsIDB4ODAwNCwgMHgwMDA2LCAweDA4MDQsCisJMHgwZGRlLCAweDAwOTYsIDB4MDBmNiwgMHgyMDc5LCAweDAwNTAsIDB4NzA0NCwgMHhkMDg0LCAweDAxYzAsCisJMHhjMDg0LCAweDcwNDYsIDB4NzgzOCwgMHg3OTM4LCAweDkxMGUsIDB4MWRlMCwgMHgwMGQ2LCAweDIwNjksCisJMHgwMDAwLCAweDY4MzYsIDB4NjgzMywgMHgwMDEzLCAweDAwZGUsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsCisJMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLCAweDExOWIsIDB4MDBmZSwgMHgwMDllLCAweDAwMDUsCisJMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTkxLCAweGQwYTQsIDB4MGRiOCwgMHgwMGU2LCAweDIwNzEsCisJMHgxODAwLCAweDc4MjQsIDB4MDBlNiwgMHgyMDcxLCAweDAwNDAsIDB4NzEyYywgMHhkMTljLCAweDExNDgsCisJMHgyMDA5LCAweDE4MzAsIDB4MjEwYywgMHg5MThhLCAweDAwMjAsIDB4MDIxOCwgMHg3MDIyLCAweDAwZWUsCisJMHgwMDU4LCAweDAwZWUsIDB4MjA0OCwgMHg3MDJjLCAweGE4MDIsIDB4MjkwMCwgMHg3MDJlLCAweDcwYzAsCisJMHg4MDAwLCAweDcwYzIsIDB4MDgwYywgMHg4NGMyLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsCisJMHg3MDZlLCAweGQwYTQsIDB4MTlmMCwgMHg3ODM4LCAweDc5MzgsIDB4OTEwZSwgMHgxZGUwLCAweDAwZDYsCisJMHgyMDY5LCAweDAwMDAsIDB4NjgzNiwgMHg2ODMzLCAweDAwMTMsIDB4MDBkZSwgMHgyMDkxLCAweDQwODAsCisJMHgyMDAxLCAweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDE5MGMsIDB4MTE5YiwgMHgwMGVlLCAweDAwZmUsCisJMHgwMDllLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAwNTAsIDB4NzA0NCwgMHhkMDg0LCAweDAxYjgsCisJMHhjMDg0LCAweDcwNDYsIDB4NzgzOCwgMHg3OTM4LCAweDkxMGUsIDB4MWRlMCwgMHgwMGQ2LCAweDIwNjksCisJMHgwMDAwLCAweDY4MzYsIDB4NjgzMywgMHgwMDEzLCAweDAwZGUsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsCisJMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLCAweDExOWIsIDB4MDBmZSwgMHgwMDA1LCAweDc4MmMsCisJMHg5MDk0LCAweDA3ODAsIDB4MTkwYywgMHg3MDZlLCAweGQwYTQsIDB4MGRiOCwgMHgwMGU2LCAweDIwNzEsCisJMHgxODAwLCAweDc4MjQsIDB4MjA0OCwgMHg3MDJjLCAweGE4MDIsIDB4MjkwMCwgMHg3MDJlLCAweDcwYzAsCisJMHg4MDAwLCAweDcwYzIsIDB4MDgwYywgMHg4NGMyLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsCisJMHg3MDZlLCAweGQwYTQsIDB4MWQ3MCwgMHgwMGQ2LCAweDIwNjksIDB4MDA1MCwgMHg2OTNjLCAweDIwNjksCisJMHgxOTQ3LCAweDY4MDgsIDB4NjkwYSwgMHgyMDY5LCAweDE5ZjksIDB4OTEwMiwgMHgxMTE4LCAweDY4M2MsCisJMHg5MDA1LCAweDEzMjgsIDB4MjAwMSwgMHgxOTQ4LCAweDIwMGMsIDB4ODEwZCwgMHg2OTNlLCAweDAwZGUsCisJMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHg3MDk4LCAweDkwOGEsIDB4MDAyOSwgMHgxYTBjLCAweDBkZDUsCisJMHg5MDgyLCAweDAwMWQsIDB4MDAxYiwgMHg2MDI3LCAweDFlMDAsIDB4MDAwNSwgMHg3MjAyLCAweDcxODgsCisJMHg3MWE0LCAweDcxY2UsIDB4NzFmMSwgMHg3MjMxLCAweDcyNDMsIDB4NzFhNCwgMHg3MjE5LCAweDcxNDMsCisJMHg3MTcxLCAweDcxNDIsIDB4MDAwNSwgMHgwMGQ2LCAweDIwNjksIDB4MDIwMCwgMHg2ODA0LCAweDkwMDUsCisJMHgxMTgwLCAweDY4MDgsIDB4OTAwNSwgMHgxNTE4LCAweDcwOWIsIDB4MDAyOCwgMHgyMDY5LCAweDE5OGUsCisJMHgyZDA0LCAweDcwMDIsIDB4MDgwYywgMHg3NTc2LCAweDYwMjgsIDB4OTA4NSwgMHgwNjAwLCAweDYwMmEsCisJMHgwMGIwLCAweDcwOWIsIDB4MDAyOCwgMHgyMDY5LCAweDE5OGUsIDB4MmQwNCwgMHg3MDAyLCAweDYwMjgsCisJMHg5MDg1LCAweDA2MDAsIDB4NjAyYSwgMHgwMGU2LCAweDAwMzYsIDB4MDA0NiwgMHgwMDU2LCAweDIwNzEsCisJMHgxYTYxLCAweDA4MGMsIDB4MWFlYywgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwgMHgwMGVlLCAweDAwZGUsCisJMHgwMDA1LCAweDAwZDYsIDB4MjA2OSwgMHgwMjAwLCAweDY4MDQsIDB4OTAwNSwgMHgxMTc4LCAweDY4MDgsCisJMHg5MDA1LCAweDExNjAsIDB4NzA5YiwgMHgwMDI4LCAweDIwNjksIDB4MTk4ZSwgMHgyZDA0LCAweDcwMDIsCisJMHgwODBjLCAweDc2MTEsIDB4NjAyOCwgMHg5MDg1LCAweDA2MDAsIDB4NjAyYSwgMHgwMGRlLCAweDAwMDUsCisJMHgwMDA2LCAweDIwMDEsIDB4MDA5MCwgMHgwODBjLCAweDJkNGUsIDB4MDAwZSwgMHg2MTI0LCAweGQxZTQsCisJMHgxMTkwLCAweDA4MGMsIDB4NzJiMCwgMHhkMWQ0LCAweDExNjAsIDB4ZDFkYywgMHgxMTM4LCAweGQxY2MsCisJMHgwMTUwLCAweDcwOWIsIDB4MDAyMCwgMHgwODBjLCAweDcyYjAsIDB4MDAyOCwgMHg3MDliLCAweDAwMWQsCisJMHgwMDEwLCAweDcwOWIsIDB4MDAxZiwgMHgwMDA1LCAweDIwMDEsIDB4MDA4OCwgMHgwODBjLCAweDJkNGUsCisJMHg2MTI0LCAweGQxY2MsIDB4MTFlOCwgMHhkMWRjLCAweDExYzAsIDB4ZDFlNCwgMHgxMTk4LCAweDkxODQsCisJMHgxZTAwLCAweDExZDgsIDB4MDgwYywgMHgxYjExLCAweDYwZTMsIDB4MDAwMSwgMHg2MDBjLCAweGMwYjQsCisJMHg2MDBlLCAweDA4MGMsIDB4NzQ2YSwgMHgyMDAxLCAweDAwODAsIDB4MDgwYywgMHgyZDRlLCAweDcwOWIsCisJMHgwMDI4LCAweDAwNTgsIDB4NzA5YiwgMHgwMDFlLCAweDAwNDAsIDB4NzA5YiwgMHgwMDFkLCAweDAwMjgsCisJMHg3MDliLCAweDAwMjAsIDB4MDAxMCwgMHg3MDliLCAweDAwMWYsIDB4MDAwNSwgMHgwODBjLCAweDFiMTEsCisJMHg2MGUzLCAweDAwMDEsIDB4NjAwYywgMHhjMGI0LCAweDYwMGUsIDB4MDgwYywgMHg3NDZhLCAweDIwMDEsCisJMHgwMDgwLCAweDA4MGMsIDB4MmQ0ZSwgMHg2MTI0LCAweGQxZDQsIDB4MTE4MCwgMHhkMWRjLCAweDExNTgsCisJMHhkMWU0LCAweDExMzAsIDB4OTE4NCwgMHgxZTAwLCAweDExNTgsIDB4NzA5YiwgMHgwMDI4LCAweDAwNDAsCisJMHg3MDliLCAweDAwMWUsIDB4MDAyOCwgMHg3MDliLCAweDAwMWQsIDB4MDAxMCwgMHg3MDliLCAweDAwMWYsCisJMHgwMDA1LCAweDIwMDEsIDB4MDBhMCwgMHgwODBjLCAweDJkNGUsIDB4NjEyNCwgMHhkMWRjLCAweDExMzgsCisJMHhkMWU0LCAweDAxMzgsIDB4MDgwYywgMHgxYjExLCAweDcwOWIsIDB4MDAxZSwgMHgwMDEwLCAweDcwOWIsCisJMHgwMDFkLCAweDAwMDUsIDB4MDgwYywgMHg3MzMzLCAweDYxMjQsIDB4ZDFkYywgMHgxMTg4LCAweDA4MGMsCisJMHg3MmIwLCAweDAwMTYsIDB4MDgwYywgMHgxYjExLCAweDAwMWUsIDB4ZDFkNCwgMHgxMTI4LCAweGQxZTQsCisJMHgwMTM4LCAweDcwOWIsIDB4MDAxZSwgMHgwMDIwLCAweDcwOWIsIDB4MDAxZiwgMHgwODBjLCAweDcyYjAsCisJMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHgwMGEwLCAweDA4MGMsIDB4MmQ0ZSwgMHgwMDBlLCAweDYxMjQsCisJMHhkMWQ0LCAweDExNjAsIDB4ZDFjYywgMHgxMTUwLCAweGQxZGMsIDB4MTEyOCwgMHhkMWU0LCAweDAxNDAsCisJMHg3MDliLCAweDAwMWUsIDB4MDAyOCwgMHg3MDliLCAweDAwMWQsIDB4MDAxMCwgMHg3MDliLCAweDAwMjEsCisJMHgwMDA1LCAweDA4MGMsIDB4NzMzMywgMHg2MTI0LCAweGQxZDQsIDB4MTE1MCwgMHhkMWRjLCAweDExMjgsCisJMHhkMWU0LCAweDAxNDAsIDB4NzA5YiwgMHgwMDFlLCAweDAwMjgsIDB4NzA5YiwgMHgwMDFkLCAweDAwMTAsCisJMHg3MDliLCAweDAwMWYsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4MDA5MCwgMHgwODBjLCAweDJkNGUsCisJMHgwMDBlLCAweDYxMjQsIDB4ZDFkNCwgMHgxMTc4LCAweGQxY2MsIDB4MTE1MCwgMHhkMWRjLCAweDExMjgsCisJMHhkMWU0LCAweDAxNTgsIDB4NzA5YiwgMHgwMDFlLCAweDAwNDAsIDB4NzA5YiwgMHgwMDFkLCAweDAwMjgsCisJMHg3MDliLCAweDAwMjAsIDB4MDAxMCwgMHg3MDliLCAweDAwMWYsIDB4MDAwNSwgMHgwMDE2LCAweDAwYzYsCisJMHgwMGQ2LCAweDAwZTYsIDB4MDEyNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLCAweDIwNzEsCisJMHgxODAwLCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDc0M2UsIDB4MTFkOCwgMHgyMDAxLCAweDE4MGMsCisJMHgyMDBjLCAweGQxYjQsIDB4MDFiMCwgMHhjMWI0LCAweDIxMDIsIDB4NjAyNywgMHgwMjAwLCAweDA4MGMsCisJMHgyYzc2LCAweDYwMjQsIDB4ZDBjYywgMHgwMTQ4LCAweDIwMDEsIDB4MDBhMCwgMHgwODBjLCAweDJkNGUsCisJMHgwODBjLCAweDc3MjQsIDB4MDgwYywgMHg2MGFkLCAweDA0MjgsIDB4NjAyOCwgMHhjMGNkLCAweDYwMmEsCisJMHgwNDA4LCAweDA4MGMsIDB4NzQ1OCwgMHgwMTUwLCAweDA4MGMsIDB4NzQ0ZiwgMHgxMTM4LCAweDIwMDEsCisJMHgwMDAxLCAweDA4MGMsIDB4MjgyOCwgMHgwODBjLCAweDc0MTYsIDB4MDBhMCwgMHgwODBjLCAweDczMzAsCisJMHgwMTc4LCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI4MjgsIDB4NzA5OCwgMHg5MDg2LCAweDAwMWUsCisJMHgwMTIwLCAweDcwOTgsIDB4OTA4NiwgMHgwMDIyLCAweDExMTgsIDB4NzA5YiwgMHgwMDI1LCAweDAwMTAsCisJMHg3MDliLCAweDAwMjEsIDB4MDEyZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDFlLCAweDAwMDUsCisJMHgwMDI2LCAweDIwMTEsIDB4NzJjMSwgMHgwODBjLCAweDg2OGEsIDB4MDAyZSwgMHgwMDE2LCAweDAwMjYsCisJMHgyMDA5LCAweDAwNjQsIDB4MjAxMSwgMHg3MmMxLCAweDA4MGMsIDB4ODY4MSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMDA1LCAweDAwZTYsIDB4MDBmNiwgMHgwMDE2LCAweDA4MGMsIDB4YTM1NiwgMHgyMDcxLCAweDE4MDAsCisJMHgwODBjLCAweDcyNWUsIDB4MDAxZSwgMHgwMGZlLCAweDAwZWUsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsCisJMHgwMDM2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MDEyNiwgMHgwODBjLCAweGEzNTYsCisJMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLCAweDIwNzEsIDB4MTgwMCwgMHgyMDkxLCAweDgwMDAsCisJMHg2MDI4LCAweGMwOWMsIDB4NjAyYSwgMHgyMDExLCAweDAwMDMsIDB4MDgwYywgMHhhNzIyLCAweDIwMTEsCisJMHgwMDAyLCAweDA4MGMsIDB4YTcyYywgMHgwODBjLCAweGE2MzYsIDB4MDgwYywgMHg4NjM2LCAweDAwMzYsCisJMHg5MDFlLCAweDA4MGMsIDB4YTZhYywgMHgwMDNlLCAweDYwZTMsIDB4MDAwMCwgMHgwODBjLCAweGViNzksCisJMHgwODBjLCAweGViOTQsIDB4MjAwOSwgMHgwMDA0LCAweDA4MGMsIDB4MmM3YywgMHgwODBjLCAweDJiOTcsCisJMHgyMDAxLCAweDE4MDAsIDB4MjAwMywgMHgwMDA0LCAweDYwMjcsIDB4MDAwOCwgMHgyMDExLCAweDcyYzEsCisJMHgwODBjLCAweDg2OGEsIDB4MDgwYywgMHg3NDU4LCAweDAxMTgsIDB4OTAwNiwgMHgwODBjLCAweDJkNGUsCisJMHgwODBjLCAweDBiYWUsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjgyOCwgMHgwMTJlLCAweDAwZmUsCisJMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwMjYsCisJMHgwMGU2LCAweDIwMTEsIDB4NzJjZSwgMHgyMDcxLCAweDE5ZjksIDB4NzAxYywgMHg5MjA2LCAweDExMTgsCisJMHg3MDE4LCAweDkwMDUsIDB4MDExMCwgMHg5MDg1LCAweDAwMDEsIDB4MDBlZSwgMHgwMDJlLCAweDAwMDUsCisJMHg2MDIwLCAweGQwOWMsIDB4MDAwNSwgMHg2ODAwLCAweDkwODQsIDB4ZmZmZSwgMHg5MDg2LCAweDAwYzAsCisJMHgwMTcwLCAweDIwMDEsIDB4MDBjMCwgMHgwODBjLCAweDJkNGUsIDB4MDE1NiwgMHgyMGE5LCAweDAwMmQsCisJMHgxZDA0LCAweDczNDAsIDB4MjA5MSwgMHg2MDAwLCAweDFmMDQsIDB4NzM0MCwgMHgwMTVlLCAweDAwMDUsCisJMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLCAweDIwNzEsCisJMHgxODAwLCAweDA4MGMsIDB4NzczMywgMHgyMDAxLCAweDE5NmMsIDB4MjAwMywgMHgwMDAwLCAweDkwMDYsCisJMHg3MDlhLCAweDYwZTIsIDB4Njg4NiwgMHgwODBjLCAweDI4ZjAsIDB4OTAwNiwgMHgwODBjLCAweDJkNGUsCisJMHgwODBjLCAweDVmNmMsIDB4NjAyNywgMHhmZmZmLCAweDYwMmIsIDB4MTgyZiwgMHgwMGVlLCAweDAwZGUsCisJMHgwMGNlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksCisJMHgwMTQwLCAweDIwNzEsIDB4MTgwMCwgMHgyMDAxLCAweDE5N2MsIDB4MjAwYywgMHg5MTg2LCAweDAwMDAsCisJMHgwMTU4LCAweDkxODYsIDB4MDAwMSwgMHgwMTU4LCAweDkxODYsIDB4MDAwMiwgMHgwMTU4LCAweDkxODYsCisJMHgwMDAzLCAweDAxNTgsIDB4MDgwNCwgMHg3NDA2LCAweDcwOWIsIDB4MDAyMiwgMHgwMDQwLCAweDcwOWIsCisJMHgwMDIxLCAweDAwMjgsIDB4NzA5YiwgMHgwMDIzLCAweDAwMTAsIDB4NzA5YiwgMHgwMDI0LCAweDYwZTMsCisJMHgwMDAwLCAweDY4ODcsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyOGYwLCAweDAwMjYsCisJMHgwODBjLCAweGFlYjQsIDB4MDAyZSwgMHg3MDAwLCAweDkwOGUsIDB4MDAwNCwgMHgwMTE4LCAweDYwMmIsCisJMHgwMDI4LCAweDAwMTAsIDB4NjAyYiwgMHgwMDIwLCAweDAxNTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMGE5LCAweDAwMDUsIDB4NjAyNCwgMHhkMGFjLCAweDAxNTAsIDB4MDEyZSwgMHgwMTVlLCAweDA4MGMsCisJMHhkMzg4LCAweDAxMTgsIDB4OTAwNiwgMHgwODBjLCAweDJkNzgsIDB4MDgwNCwgMHg3NDEyLCAweDY4MDAsCisJMHg5MDg0LCAweDAwYTEsIDB4YzBiZCwgMHg2ODAyLCAweDA4MGMsIDB4MmM3NiwgMHg2OTA0LCAweGQxZDQsCisJMHgxMTQwLCAweDIwMDEsIDB4MDEwMCwgMHgwODBjLCAweDJkNGUsIDB4MWYwNCwgMHg3M2FhLCAweDA4MGMsCisJMHg3NDk1LCAweDAxMmUsIDB4MDE1ZSwgMHgwODBjLCAweDc0NGYsIDB4MDFkOCwgMHg2MDQ0LCAweDkwMDUsCisJMHgwMTk4LCAweDIwMTEsIDB4MDExNCwgMHgyMjA0LCAweDkwODUsIDB4MDEwMCwgMHgyMDEyLCAweDYwNTAsCisJMHgwMDA2LCAweDkwODUsIDB4MDAyMCwgMHg2MDUyLCAweDA4MGMsIDB4NzQ5NSwgMHg5MDA2LCAweDgwMDEsCisJMHgxZGYwLCAweDAwMGUsIDB4NjA1MiwgMHgwMDI4LCAweDY4MDQsIDB4ZDBkNCwgMHgxMTEwLCAweDA4MGMsCisJMHg3NDk1LCAweDA4MGMsIDB4ZDM4OCwgMHgwMTE4LCAweDkwMDYsIDB4MDgwYywgMHgyZDc4LCAweDAwMTYsCisJMHgwMDI2LCAweDcwMDAsIDB4OTA4ZSwgMHgwMDA0LCAweDAxMzAsIDB4MjAwOSwgMHgwMGM4LCAweDIwMTEsCisJMHg3MmNlLCAweDA4MGMsIDB4ODY0OCwgMHgwMDJlLCAweDAwMWUsIDB4MDgwYywgMHg4NGI5LCAweDcwMzQsCisJMHhjMDg1LCAweDcwMzYsIDB4MjAwMSwgMHgxOTdjLCAweDIwMDMsIDB4MDAwNCwgMHgwODBjLCAweDcxMmIsCisJMHgwODBjLCAweDc0NGYsIDB4MDEzOCwgMHg2ODA0LCAweGQwZDQsIDB4MTEyMCwgMHhkMGRjLCAweDExMDAsCisJMHgwODBjLCAweDc3MjksIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGM2LCAweDAwZDYsCisJMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4MjA3MSwgMHgxODAwLCAweDA4MGMsCisJMHg4NGQwLCAweDA4MGMsIDB4ODRjMiwgMHgwODBjLCAweDc3MzMsIDB4MjAwMSwgMHgxOTZjLCAweDIwMDMsCisJMHgwMDAwLCAweDkwMDYsIDB4NzA5YSwgMHg2MGUyLCAweDY4ODYsIDB4MDgwYywgMHgyOGYwLCAweDkwMDYsCisJMHgwODBjLCAweDJkNGUsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHg2MDI3LCAweGZmZmYsCisJMHg2MDJiLCAweDE4MmYsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsCisJMHgxOTdiLCAweDIwMDQsIDB4OTA4NiwgMHhhYWFhLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDA4MGMsCisJMHg1NzYxLCAweDkwODQsIDB4MDAzMCwgMHg5MDg2LCAweDAwMDAsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsCisJMHgwODBjLCAweDU3NjEsIDB4OTA4NCwgMHgwMDMwLCAweDkwODYsIDB4MDAzMCwgMHgwMDBlLCAweDAwMDUsCisJMHgwMDA2LCAweDA4MGMsIDB4NTc2MSwgMHg5MDg0LCAweDAwMzAsIDB4OTA4NiwgMHgwMDEwLCAweDAwMGUsCisJMHgwMDA1LCAweDAwMDYsIDB4MDgwYywgMHg1NzYxLCAweDkwODQsIDB4MDAzMCwgMHg5MDg2LCAweDAwMjAsCisJMHgwMDBlLCAweDAwMDUsIDB4MDAzNiwgMHgwMDE2LCAweDIwMDEsIDB4MTgwYywgMHgyMDA0LCAweDkwOGMsCisJMHgwMDEzLCAweDAxODAsIDB4MDAyMCwgMHgwODBjLCAweDI5MTAsIDB4OTAwZSwgMHgwMDI4LCAweDA4MGMsCisJMHg2YTA0LCAweDFkYzgsIDB4MjAwOSwgMHgwMDAyLCAweDIwMTksIDB4MDAyOCwgMHgwODBjLCAweDMxZTksCisJMHg5MDA2LCAweDAwMTksIDB4MDAxZSwgMHgwMDNlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE4MGMsCisJMHgyZTA0LCAweDAxMzAsIDB4MDgwYywgMHhkMzgxLCAweDExMjgsIDB4OTA4NSwgMHgwMDEwLCAweDAwMTAsCisJMHg5MDg0LCAweGZmZWYsIDB4MjA3MiwgMHgwMGVlLCAweDAwMDUsIDB4NjA1MCwgMHgwMDA2LCAweDYwZWMsCisJMHgwMDA2LCAweDYwMGMsIDB4MDAwNiwgMHg2MDA0LCAweDAwMDYsIDB4NjAyOCwgMHgwMDA2LCAweDAwMTYsCisJMHg2MTM4LCAweDYwNTAsIDB4OTA4NCwgMHhmYmZmLCAweDkwODUsIDB4MjAwMCwgMHg2MDUyLCAweDYxM2EsCisJMHgyMGE5LCAweDAwMTIsIDB4MWQwNCwgMHg3NGFhLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDc0YWEsCisJMHg2MDJmLCAweDAxMDAsIDB4NjAyZiwgMHgwMDAwLCAweDYwNTAsIDB4OTA4NSwgMHgwNDAwLCAweDkwODQsCisJMHhkZmZmLCAweDYwNTIsIDB4NjEzYSwgMHgwMDFlLCAweDYwMmYsIDB4MDA0MCwgMHg2MDJmLCAweDAwMDAsCisJMHgwMDBlLCAweDYwMmEsIDB4MDAwZSwgMHg2MDA2LCAweDAwMGUsIDB4NjAwZSwgMHgwMDBlLCAweDYwZWUsCisJMHg2MGUzLCAweDAwMDAsIDB4Njg4NywgMHgwMDAxLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI4ZjAsCisJMHgyMDAxLCAweDAwYTAsIDB4MDAwNiwgMHgwODBjLCAweGQzODgsIDB4MDAwZSwgMHgwMTMwLCAweDA4MGMsCisJMHgyZDZjLCAweDkwMDYsIDB4MDgwYywgMHgyZDc4LCAweDAwMTAsIDB4MDgwYywgMHgyZDRlLCAweDAwMGUsCisJMHg2MDUyLCAweDYwNTAsIDB4MDAwNiwgMHhjMGU1LCAweDYwNTIsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsCisJMHgwODBjLCAweDJiZWIsIDB4MDBmZSwgMHgwMDBlLCAweDYwNTIsIDB4MDAwNSwgMHgwMTU2LCAweDAwMTYsCisJMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksCisJMHgwMTQwLCAweDIwNzEsIDB4MTgwMCwgMHg2MDIwLCAweDkwODQsIDB4MDA4MCwgMHgwMTM4LCAweDIwMDEsCisJMHgxODBjLCAweDIwMGMsIDB4YzFjNSwgMHgyMTAyLCAweDA4MDQsIDB4NzU2OCwgMHgyMDAxLCAweDE4MGMsCisJMHgyMDBjLCAweGMxYzQsIDB4MjEwMiwgMHg2MDI4LCAweDkwODQsIDB4ZTFmZiwgMHg2MDJhLCAweDYwMjcsCisJMHgwMjAwLCAweDIwMDEsIDB4MDA5MCwgMHgwODBjLCAweDJkNGUsIDB4MjBhOSwgMHgwMzY2LCAweDYwMjQsCisJMHhkMGNjLCAweDE1MTgsIDB4MWQwNCwgMHg3NTE3LCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDc1MTcsCisJMHgyMDExLCAweDAwMDMsIDB4MDgwYywgMHhhNzIyLCAweDIwMTEsIDB4MDAwMiwgMHgwODBjLCAweGE3MmMsCisJMHgwODBjLCAweGE2MzYsIDB4OTAxZSwgMHgwODBjLCAweGE2YWMsIDB4MjAwMSwgMHgwMGEwLCAweDA4MGMsCisJMHgyZDRlLCAweDA4MGMsIDB4NzcyNCwgMHgwODBjLCAweDYwYWQsIDB4MDgwYywgMHhkMzg4LCAweDAxMTAsCisJMHgwODBjLCAweDBkNDUsIDB4OTA4NSwgMHgwMDAxLCAweDA0ODgsIDB4MDgwYywgMHgxYjExLCAweDYwZTMsCisJMHgwMDAwLCAweDIwMDEsIDB4MTk2YywgMHgyMDA0LCAweDA4MGMsIDB4MjhmMCwgMHg2MGUyLCAweDIwMDEsCisJMHgwMDgwLCAweDA4MGMsIDB4MmQ0ZSwgMHgyMGE5LCAweDAzNjYsIDB4NjAyNywgMHgxZTAwLCAweDIwMDksCisJMHgxZTAwLCAweDA4MGMsIDB4MmM3NiwgMHg2MDI0LCAweDkxMGMsIDB4MDEzOCwgMHgxZDA0LCAweDc1NGQsCisJMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwgMHg3NTRkLCAweDA4MTgsIDB4NjAyOCwgMHg5MDg1LCAweDFlMDAsCisJMHg2MDJhLCAweDcwYjQsIDB4OTAwNSwgMHgxMTE4LCAweDY4ODcsIDB4MDAwMSwgMHgwMDA4LCAweDY4ODYsCisJMHgwODBjLCAweGQzODgsIDB4MDExMCwgMHgwODBjLCAweDBkNDUsIDB4OTAwNiwgMHgwMGVlLCAweDAwZGUsCisJMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAxNWUsIDB4MDAwNSwgMHgwMTU2LCAweDAwMTYsCisJMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNzEsCisJMHgxODAwLCAweDcwMDAsIDB4OTA4NiwgMHgwMDAzLCAweDExNjgsIDB4MjAwMSwgMHgwMjBiLCAweDIwMDQsCisJMHg5MDg0LCAweDU1NDAsIDB4OTA4NiwgMHg1NTQwLCAweDExMjgsIDB4MjA2OSwgMHgxYTc4LCAweDJkMDQsCisJMHg4MDAwLCAweDIwNmEsIDB4MjA2OSwgMHgwMTQwLCAweDYwMjAsIDB4OTA4NCwgMHgwMGMwLCAweDAxMjAsCisJMHg2ODg0LCAweDkwMDUsIDB4MTkwNCwgMHg3NWRiLCAweDIwMDEsIDB4MDA4OCwgMHgwODBjLCAweDJkNGUsCisJMHg5MDA2LCAweDYwZTIsIDB4Njg4NiwgMHgwODBjLCAweDI4ZjAsIDB4MjA2OSwgMHgwMjAwLCAweDY4MDQsCisJMHg5MDA1LCAweDExMTgsIDB4NjgwOCwgMHg5MDA1LCAweDAxYzAsIDB4NjAyOCwgMHg5MDg0LCAweGZiZmYsCisJMHg2MDJhLCAweDYwMjcsIDB4MDQwMCwgMHgyMDY5LCAweDE5OGUsIDB4NzAwMCwgMHgyMDZhLCAweDcwOWIsCisJMHgwMDI2LCAweDcwMDMsIDB4MDAwMSwgMHgyMGE5LCAweDAwMDIsIDB4MWQwNCwgMHg3NWJkLCAweDIwOTEsCisJMHg2MDAwLCAweDFmMDQsIDB4NzViZCwgMHgwODA0LCAweDc2MDksIDB4MjA2OSwgMHgwMTQwLCAweDIwYTksCisJMHgwMzg0LCAweDYwMjcsIDB4MWUwMCwgMHgyMDA5LCAweDFlMDAsIDB4MDgwYywgMHgyYzc2LCAweDYwMjQsCisJMHg5MTBjLCAweDA1MDgsIDB4OTA4NCwgMHgxYTAwLCAweDExZjAsIDB4MWQwNCwgMHg3NWM5LCAweDIwOTEsCisJMHg2MDAwLCAweDFmMDQsIDB4NzVjOSwgMHgyMDExLCAweDAwMDMsIDB4MDgwYywgMHhhNzIyLCAweDIwMTEsCisJMHgwMDAyLCAweDA4MGMsIDB4YTcyYywgMHgwODBjLCAweGE2MzYsIDB4OTAxZSwgMHgwODBjLCAweGE2YWMsCisJMHgyMDAxLCAweDAwYTAsIDB4MDgwYywgMHgyZDRlLCAweDA4MGMsIDB4NzcyNCwgMHgwODBjLCAweDYwYWQsCisJMHg5MDg1LCAweDAwMDEsIDB4MDBiMCwgMHgyMDAxLCAweDAwODAsIDB4MDgwYywgMHgyZDRlLCAweDIwNjksCisJMHgwMTQwLCAweDYwZTMsIDB4MDAwMCwgMHg3MGI0LCAweDkwMDUsIDB4MTExOCwgMHg2ODg3LCAweDAwMDEsCisJMHgwMDA4LCAweDY4ODYsIDB4MjAwMSwgMHgxOTZjLCAweDIwMDQsIDB4MDgwYywgMHgyOGYwLCAweDYwZTIsCisJMHg5MDA2LCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAxNWUsCisJMHgwMDA1LCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsCisJMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHgxODAwLCAweDYwMjAsIDB4OTA4NCwgMHgwMGMwLCAweDAxYzgsCisJMHgyMDExLCAweDAwMDMsIDB4MDgwYywgMHhhNzIyLCAweDIwMTEsIDB4MDAwMiwgMHgwODBjLCAweGE3MmMsCisJMHgwODBjLCAweGE2MzYsIDB4OTAxZSwgMHgwODBjLCAweGE2YWMsIDB4MjA2OSwgMHgwMTQwLCAweDIwMDEsCisJMHgwMGEwLCAweDA4MGMsIDB4MmQ0ZSwgMHgwODBjLCAweDc3MjQsIDB4MDgwYywgMHg2MGFkLCAweDA4MDQsCisJMHg3NmE0LCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGQxYjQsIDB4MTE2MCwgMHhjMWI1LCAweDIxMDIsCisJMHgwODBjLCAweDcyYjYsIDB4MjA2OSwgMHgwMTQwLCAweDIwMDEsIDB4MDA4MCwgMHgwODBjLCAweDJkNGUsCisJMHg2MGUzLCAweDAwMDAsIDB4MjA2OSwgMHgwMjAwLCAweDY4MDQsIDB4OTAwNSwgMHgxMTE4LCAweDY4MDgsCisJMHg5MDA1LCAweDAxODAsIDB4NjAyOCwgMHg5MDg0LCAweGZkZmYsIDB4NjAyYSwgMHg2MDI3LCAweDAyMDAsCisJMHgyMDY5LCAweDE5OGUsIDB4NzAwMCwgMHgyMDZhLCAweDcwOWIsIDB4MDAyNywgMHg3MDAzLCAweDAwMDEsCisJMHgwODA0LCAweDc2YTQsIDB4NjAyNywgMHgxZTAwLCAweDIwMDksIDB4MWUwMCwgMHgwODBjLCAweDJjNzYsCisJMHg2MDI0LCAweDkxMGMsIDB4MDFjOCwgMHg5MDg0LCAweDFjMDAsIDB4MTFiMCwgMHgxZDA0LCAweDc2NjIsCisJMHgwMDA2LCAweDAwMTYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDgwYywgMHg4NTEwLCAweDAwZWUsCisJMHgwMGRlLCAweDAwY2UsIDB4MDAxZSwgMHgwMDBlLCAweDAwZTYsIDB4MjA3MSwgMHgxOWY5LCAweDcwNzAsCisJMHgwMGVlLCAweDkwMDUsIDB4MTlmOCwgMHgwNDAwLCAweDAwMjYsIDB4MjAxMSwgMHg3MmNlLCAweDA4MGMsCisJMHg4NWIwLCAweDIwMTEsIDB4NzJjMSwgMHgwODBjLCAweDg2OGEsIDB4MDAyZSwgMHgyMDY5LCAweDAxNDAsCisJMHg2MGUzLCAweDAwMDAsIDB4NzBiNCwgMHg5MDA1LCAweDExMTgsIDB4Njg4NywgMHgwMDAxLCAweDAwMDgsCisJMHg2ODg2LCAweDIwMDEsIDB4MTk2YywgMHgyMDA0LCAweDA4MGMsIDB4MjhmMCwgMHg2MGUyLCAweDIwMDEsCisJMHgxODBjLCAweDIwMGMsIDB4YzFiNCwgMHgyMTAyLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwM2UsCisJMHgwMDJlLCAweDAwMWUsIDB4MDE1ZSwgMHgwMDA1LCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsCisJMHgwMDQ2LCAweDAwYzYsIDB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHgxODAwLCAweDA4MGMsCisJMHhkMzgxLCAweDE5MDQsIDB4NzcxMiwgMHg3MTMwLCAweGQxODQsIDB4MTE3MCwgMHgwODBjLCAweDMzNzgsCisJMHgwMTM4LCAweGMxOGQsIDB4NzEzMiwgMHgyMDExLCAweDE4NDgsIDB4MjIxNCwgMHhkMmFjLCAweDExMjAsCisJMHg3MDMwLCAweGQwOGMsIDB4MDkwNCwgMHg3NzEyLCAweDIwMTEsIDB4MTg0OCwgMHgyMjBjLCAweGQxYTQsCisJMHgwNTM4LCAweDAwMTYsIDB4MjAxOSwgMHgwMDBlLCAweDA4MGMsIDB4ZTZhZSwgMHgwMTU2LCAweDAwYjYsCisJMHgyMGE5LCAweDAwN2YsIDB4OTAwZSwgMHg5MTg2LCAweDAwN2UsIDB4MDFhMCwgMHg5MTg2LCAweDAwODAsCisJMHgwMTg4LCAweDA4MGMsIDB4NjY5OSwgMHgxMTcwLCAweDIxMjAsIDB4OTAwNiwgMHgwMDE2LCAweDIwMDksCisJMHgwMDBlLCAweDA4MGMsIDB4ZTczYSwgMHgyMDA5LCAweDAwMDEsIDB4MjAxMSwgMHgwMTAwLCAweDA4MGMsCisJMHg4NzlhLCAweDAwMWUsIDB4ODEwOCwgMHgxZjA0LCAweDc2ZGIsIDB4MDBiZSwgMHgwMTVlLCAweDAwMWUsCisJMHhkMWFjLCAweDExNDgsIDB4MDAxNiwgMHgyMDA5LCAweDAwMDIsIDB4MjAxOSwgMHgwMDA0LCAweDA4MGMsCisJMHgzMWU5LCAweDAwMWUsIDB4MDA3OCwgMHgwMTU2LCAweDAwYjYsIDB4MjBhOSwgMHgwMDdmLCAweDkwMGUsCisJMHgwODBjLCAweDY2OTksIDB4MTExMCwgMHgwODBjLCAweDYwYzcsIDB4ODEwOCwgMHgxZjA0LCAweDc3MDgsCisJMHgwMGJlLCAweDAxNWUsIDB4MDgwYywgMHgxYjExLCAweDA4MGMsIDB4YWViNCwgMHg2MGUzLCAweDAwMDAsCisJMHgwODBjLCAweDYwYWQsIDB4MDgwYywgMHg3MzZhLCAweDAwZWUsIDB4MDBjZSwgMHgwMDRlLCAweDAwM2UsCisJMHgwMDJlLCAweDAwMWUsIDB4MDE1ZSwgMHgwMDA1LCAweDIwMDEsIDB4MTk3YywgMHgyMDAzLCAweDAwMDEsCisJMHgwMDA1LCAweDIwMDEsIDB4MTk3YywgMHgyMDAzLCAweDAwMDAsIDB4MDAwNSwgMHgyMDAxLCAweDE5N2IsCisJMHgyMDAzLCAweGFhYWEsIDB4MDAwNSwgMHgyMDAxLCAweDE5N2IsIDB4MjAwMywgMHgwMDAwLCAweDAwMDUsCisJMHgyMDcxLCAweDE4ZmEsIDB4NzAwMywgMHgwMDAwLCAweDcwMDcsIDB4MDAwMCwgMHgwODBjLCAweDEwMTgsCisJMHgwOTBjLCAweDBkZDUsIDB4YThhYiwgMHhkY2IwLCAweDI5MDAsIDB4NzA0ZSwgMHgwODBjLCAweDEwMTgsCisJMHgwOTBjLCAweDBkZDUsIDB4YThhYiwgMHhkY2IwLCAweDI5MDAsIDB4NzA1MiwgMHhhODY3LCAweDAwMDAsCisJMHhhODZiLCAweDAwMDEsIDB4YTg5ZiwgMHgwMDAwLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDAwNDAsCisJMHg2ODQ4LCAweDkwMDUsIDB4MTExOCwgMHg5MDg1LCAweDAwMDEsIDB4MDRiMCwgMHg2ODQwLCAweDkwMDUsCisJMHgwMTUwLCAweDA0YTEsIDB4NmE1MCwgMHg5MjAwLCAweDcwMDIsIDB4Njg1NCwgMHg5MTAxLCAweDcwMDYsCisJMHg5MDA2LCAweDcwMTIsIDB4NzAxNiwgMHg2ODUwLCAweDcwMDIsIDB4Njg1NCwgMHg3MDA2LCAweDY4NTgsCisJMHg3MDBhLCAweDY4NWMsIDB4NzAwZSwgMHg2ODQwLCAweDkwMDUsIDB4MTExMCwgMHg3MDEyLCAweDcwMTYsCisJMHg2ODQ4LCAweDcwMWEsIDB4NzAxYywgMHg5MDg1LCAweDAwNDAsIDB4NzAxZSwgMHgyMDAxLCAweDAwMTksCisJMHg3MDM2LCAweDcwMmIsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDQsIDB4MjAwYywgMHg5MThjLCAweGZmZjcsCisJMHg5MThkLCAweDgwMDAsIDB4MjEwMiwgMHgwMGQ2LCAweDIwNjksIDB4MThmYSwgMHg2ODA3LCAweDAwMDEsCisJMHgwMGRlLCAweDA4MGMsIDB4N2QxMSwgMHg5MDA2LCAweDAwZWUsIDB4MDAwNSwgMHg5MDBlLCAweDAxNTYsCisJMHgyMGE5LCAweDAwMDYsIDB4ODAwMywgMHgyMDExLCAweDAxMDAsIDB4MjIxNCwgMHg5Mjk2LCAweDAwMDgsCisJMHgxMTEwLCAweDgxOGQsIDB4MDAxMCwgMHg4MWY1LCAweDNlMDgsIDB4MWYwNCwgMHg3NzlhLCAweDAxNWUsCisJMHgwMDA1LCAweDIwNzksIDB4MDA0MCwgMHgyMDcxLCAweDE4ZmEsIDB4NzAwNCwgMHgwMDAyLCAweDc3YjksCisJMHg3N2JhLCAweDc3ZjIsIDB4Nzg0ZCwgMHg3OTVkLCAweDc3YjcsIDB4NzdiNywgMHg3OTg3LCAweDA4MGMsCisJMHgwZGQ1LCAweDAwMDUsIDB4MjA3OSwgMHgwMDQwLCAweDc4MmMsIDB4OTA4YywgMHgwNzgwLCAweDE5MGMsCisJMHg3ZGYzLCAweGQwYTQsIDB4MDFmOCwgMHg3ODI0LCAweDIwNDgsIDB4OTAwNiwgMHhhODAyLCAweGE4MDYsCisJMHhhODY0LCAweDkwODQsIDB4MDBmZiwgMHg5MDhhLCAweDAwNDAsIDB4MDYxMCwgMHgwMGMwLCAweDIwMDEsCisJMHgxODAwLCAweDIwMGMsIDB4OTE4NiwgMHgwMDAzLCAweDExNjgsIDB4NzAwNCwgMHgwMDAyLCAweDc3ZTIsCisJMHg3N2JjLCAweDc3ZTIsIDB4NzdlMCwgMHg3N2UyLCAweDc3ZTIsIDB4NzdlMiwgMHg3N2UyLCAweDc3ZTIsCisJMHgwODBjLCAweDc4NGQsIDB4NzgyYywgMHhkMDljLCAweDA5MGMsIDB4N2QxMSwgMHgwMDA1LCAweDkwODIsCisJMHgwMDVhLCAweDEyMTgsIDB4MjEwMCwgMHgwMDNiLCAweDBjMTAsIDB4MDgwYywgMHg3ODgzLCAweDBjOTAsCisJMHgwMGUzLCAweDA4ZTgsIDB4MDAwNSwgMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsCisJMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywgMHg3OGE1LCAweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsCisJMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsCisJMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4OGYsCisJMHg3ODgzLCAweDdhNzgsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsIDB4NzhhNSwgMHg3ODgzLCAweDc4OGYsCisJMHg3YWI5LCAweDdhZmEsIDB4N2I0MSwgMHg3YjU1LCAweDc4ODMsIDB4Nzg4MywgMHg3OGE1LCAweDc4OGYsCisJMHg3OGI5LCAweDc4ODMsIDB4NzkzMSwgMHg3YzAwLCAweDdjMWIsIDB4Nzg4MywgMHg3OGE1LCAweDc4ODMsCisJMHg3OGI5LCAweDc4ODMsIDB4Nzg4MywgMHg3OTI3LCAweDdjMWIsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsCisJMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywgMHg3OGNkLCAweDc4ODMsCisJMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsCisJMHg3ZDk3LCAweDc4ODMsIDB4N2Q0MSwgMHg3ODgzLCAweDdkNDEsIDB4Nzg4MywgMHg3OGUyLCAweDc4ODMsCisJMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsIDB4MjA3OSwgMHgwMDQwLCAweDcwMDQsCisJMHg5MDg2LCAweDAwMDMsIDB4MTE5OCwgMHg3ODJjLCAweDA4MGMsIDB4N2QzYSwgMHhkMGE0LCAweDAxNzAsCisJMHg3ODI0LCAweDIwNDgsIDB4OTAwNiwgMHhhODAyLCAweGE4MDYsIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsCisJMHg5MDhhLCAweDAwMWEsIDB4MTIxMCwgMHgwMDJiLCAweDBjNTAsIDB4MDBlOSwgMHgwODBjLCAweDdkMTEsCisJMHgwMDA1LCAweDc4ODMsIDB4Nzg4ZiwgMHg3YTY0LCAweDc4ODMsIDB4Nzg4ZiwgMHg3ODgzLCAweDc4OGYsCisJMHg3ODhmLCAweDc4ODMsIDB4Nzg4ZiwgMHg3YTY0LCAweDc4OGYsIDB4Nzg4ZiwgMHg3ODhmLCAweDc4OGYsCisJMHg3ODhmLCAweDc4ODMsIDB4Nzg4ZiwgMHg3YTY0LCAweDc4ODMsIDB4Nzg4MywgMHg3ODhmLCAweDc4ODMsCisJMHg3ODgzLCAweDc4ODMsIDB4Nzg4ZiwgMHgwMGU2LCAweDIwNzEsIDB4MThmYSwgMHgyMDA5LCAweDA0MDAsCisJMHgwMDcxLCAweDAwZWUsIDB4MDAwNSwgMHgyMDA5LCAweDEwMDAsIDB4MDA0OSwgMHgwMDA1LCAweDIwMDksCisJMHgyMDAwLCAweDAwMjksIDB4MDAwNSwgMHgyMDA5LCAweDA4MDAsIDB4MDAwOSwgMHgwMDA1LCAweDcwMDcsCisJMHgwMDAxLCAweGE4NjgsIDB4OTA4NCwgMHgwMGZmLCAweDkxMDUsIDB4YTg2YSwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDA4MGMsIDB4NmQxNywgMHgwMTJlLCAweDAwMDUsIDB4YTg2NCwgMHg4MDA3LCAweDkwODQsCisJMHgwMGZmLCAweDBkMDgsIDB4ODAwMSwgMHgxMTIwLCAweDcwMDcsIDB4MDAwMSwgMHgwODA0LCAweDdhMDYsCisJMHg3MDA3LCAweDAwMDMsIDB4NzAxMiwgMHgyOTAwLCAweDcwMTYsIDB4NzAxYSwgMHg3MDRiLCAweDdhMDYsCisJMHgwMDA1LCAweGE4NjQsIDB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4MDk2OCwgMHg4MDAxLCAweDExMjAsCisJMHg3MDA3LCAweDAwMDEsIDB4MDgwNCwgMHg3YTIxLCAweDcwMDcsIDB4MDAwMywgMHg3MDEyLCAweDI5MDAsCisJMHg3MDE2LCAweDcwMWEsIDB4NzA0YiwgMHg3YTIxLCAweDAwMDUsIDB4YTg2NCwgMHg4MDA3LCAweDkwODQsCisJMHgwMGZmLCAweDA5MDQsIDB4Nzg4YiwgMHg4MDAxLCAweDExMjAsIDB4NzAwNywgMHgwMDAxLCAweDA4MDQsCisJMHg3YTNkLCAweDcwMDcsIDB4MDAwMywgMHg3MDEyLCAweDI5MDAsIDB4NzAxNiwgMHg3MDFhLCAweDcwNGIsCisJMHg3YTNkLCAweDAwMDUsIDB4YTg2NCwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDEsCisJMHgxOTA0LCAweDc4OGIsIDB4NzAwNywgMHgwMDAxLCAweDIwMDksIDB4MTgzNCwgMHgyMTBjLCAweDgxZmYsCisJMHgxMWE4LCAweGE4NjgsIDB4OTA4NCwgMHgwMGZmLCAweGE4NmEsIDB4YTg4MywgMHgwMDAwLCAweDA4MGMsCisJMHg2MzQ0LCAweDExMDgsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhhODY3LCAweDAxMzksCisJMHhhODdhLCAweGE5ODIsIDB4MDgwYywgMHg2ZDE3LCAweDAxMmUsIDB4MGNhMCwgMHhhOTk0LCAweDkxODYsCisJMHgwMDcxLCAweDBkMzgsIDB4OTE4NiwgMHgwMDY0LCAweDBkMjAsIDB4OTE4NiwgMHgwMDdjLCAweDBkMDgsCisJMHg5MTg2LCAweDAwMjgsIDB4MDlmMCwgMHg5MTg2LCAweDAwMzgsIDB4MDlkOCwgMHg5MTg2LCAweDAwNzgsCisJMHgwOWMwLCAweDkxODYsIDB4MDA1ZiwgMHgwOWE4LCAweDkxODYsIDB4MDA1NiwgMHgwOTkwLCAweGE4OTcsCisJMHg0MDA1LCAweGE4OWIsIDB4MDAwMSwgMHgyMDAxLCAweDAwMzAsIDB4OTAwZSwgMHgwOGEwLCAweGE4N2MsCisJMHg5MDg0LCAweDAwYzAsIDB4OTA4NiwgMHgwMGMwLCAweDExMjAsIDB4NzAwNywgMHgwMDAxLCAweDA4MDQsCisJMHg3YzMyLCAweDI5MDAsIDB4NzAxNiwgMHg3MDFhLCAweDIwYTksIDB4MDAwNCwgMHhhODYwLCAweDIwZTAsCisJMHhhODVjLCAweDkwODAsIDB4MDAzMCwgMHgyMDk4LCAweDcwNTAsIDB4MjA0MCwgMHhhMDYwLCAweDIwZTgsCisJMHhhMDVjLCAweDkwODAsIDB4MDAyMywgMHgyMGEwLCAweDQwMDMsIDB4YTg4OCwgMHg3MDEyLCAweDkwODIsCisJMHgwNDAxLCAweDFhMDQsIDB4Nzg5MywgMHhhYWI0LCAweDkyOGEsIDB4MDAwMiwgMHgxYTA0LCAweDc4OTMsCisJMHg4MmZmLCAweDExMzgsIDB4YThiOCwgMHhhOWJjLCAweDkxMDUsIDB4MDExOCwgMHgyMDAxLCAweDc5YzQsCisJMHgwMDE4LCAweDkyODAsIDB4NzliYSwgMHgyMDA1LCAweDcwNTYsIDB4NzAxMCwgMHg5MDE1LCAweDA5MDQsCisJMHg3OWE1LCAweDA4MGMsIDB4MTAxOCwgMHgxMTE4LCAweDcwMDcsIDB4MDAwNCwgMHgwMDA1LCAweDI5MDAsCisJMHg3MDIyLCAweDcwNTQsIDB4MjA2MCwgMHhlMDAwLCAweGE4NjYsIDB4NzA1MCwgMHgyMDQwLCAweGE5NWMsCisJMHhlMDA0LCAweDkxMDAsIDB4YTA3NiwgMHhhODYwLCAweGEwNzIsIDB4ZTAwOCwgMHg5MjBhLCAweDEyMTAsCisJMHg5MDBlLCAweDIyMDAsIDB4NzExMiwgMHhlMjBjLCAweDgwMDMsIDB4ODAwYiwgMHg5Mjk2LCAweDAwMDQsCisJMHgwMTA4LCAweDkxMDgsIDB4YTE3YSwgMHg4MTBiLCAweGExN2UsIDB4MDgwYywgMHgxMGU5LCAweGEwNmMsCisJMHg5MDhlLCAweDAxMDAsIDB4MDE3MCwgMHg5MDg2LCAweDAyMDAsIDB4MDExOCwgMHg3MDA3LCAweDAwMDcsCisJMHgwMDA1LCAweDcwMjAsIDB4MjA0OCwgMHgwODBjLCAweDEwMzEsIDB4NzAxNCwgMHgyMDQ4LCAweDA4MDQsCisJMHg3ODkzLCAweDcwMjAsIDB4MjA0OCwgMHg3MDE4LCAweGE4MDIsIDB4YTgwNywgMHgwMDAwLCAweDI5MDgsCisJMHgyMDQ4LCAweGE5MDYsIDB4NzExYSwgMHgwODA0LCAweDc5NWQsIDB4NzAxNCwgMHgyMDQ4LCAweDcwMDcsCisJMHgwMDAxLCAweGE4YjQsIDB4OTAwNSwgMHgxMTI4LCAweGE4YjgsIDB4YTliYywgMHg5MTA1LCAweDAxMDgsCisJMHgwMGI5LCAweGE4NjQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAxZSwgMHgwOTA0LCAweDdjMzIsCisJMHgwODA0LCAweDdhMDYsIDB4NzliYywgMHg3OWMwLCAweDAwMDIsIDB4MDAxZCwgMHgwMDA3LCAweDAwMDQsCisJMHgwMDBhLCAweDAwMWIsIDB4MDAwNSwgMHgwMDA2LCAweDAwMGEsIDB4MDAxZCwgMHgwMDA1LCAweDAwMDQsCisJMHgwMDc2LCAweDAwNjYsIDB4YWZiOCwgMHhhZWJjLCAweGE4MDQsIDB4MjA1MCwgMHhiMGMwLCAweGIwZTIsCisJMHhiMGJjLCAweGIwZGUsIDB4YjBiOCwgMHhiMGQyLCAweGIwYjQsIDB4YjBjZSwgMHhiNmRhLCAweGI3ZDYsCisJMHhiMGIwLCAweGIwY2EsIDB4YjBhYywgMHhiMGM2LCAweGIwYTgsIDB4YjBiYSwgMHhiMGE0LCAweGIwYjYsCisJMHhiNmMyLCAweGI3YmUsIDB4YjBhMCwgMHhiMGIyLCAweGIwOWMsIDB4YjBhZSwgMHhiMDk4LCAweGIwYTIsCisJMHhiMDk0LCAweGIwOWUsIDB4YjZhYSwgMHhiN2E2LCAweGIwOTAsIDB4YjA5YSwgMHhiMDhjLCAweGIwOTYsCisJMHhiMDg4LCAweGIwOGEsIDB4YjA4NCwgMHhiMDg2LCAweGI2OTIsIDB4Yjc4ZSwgMHhiMDgwLCAweGIwODIsCisJMHhiMDdjLCAweGIwN2UsIDB4YjA3OCwgMHhiMDcyLCAweGIwNzQsIDB4YjA2ZSwgMHhiNjdhLCAweGI3NzYsCisJMHhiMDA0LCAweDkwNTUsIDB4MTk1OCwgMHgwMDZlLCAweDAwN2UsIDB4MDAwNSwgMHgyMDA5LCAweDE4MzQsCisJMHgyMTBjLCAweDgxZmYsIDB4MTE3OCwgMHgwODBjLCAweDYxNDEsIDB4MTEwOCwgMHgwMDA1LCAweDA4MGMsCisJMHg2ZjRhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4Y2Y3YywgMHgwODBjLCAweDZkMTcsCisJMHgwMTJlLCAweDBjYTAsIDB4MDgwYywgMHhkMzgxLCAweDFkNzAsIDB4MjAwMSwgMHgwMDI4LCAweDkwMGUsCisJMHgwYzcwLCAweDIwMDksIDB4MTgzNCwgMHgyMTBjLCAweDgxZmYsIDB4MTE4OCwgMHhhODg4LCAweDkwMDUsCisJMHgwMTg4LCAweGE4ODMsIDB4MDAwMCwgMHgwODBjLCAweDYxZDEsIDB4MTEwOCwgMHgwMDA1LCAweGE4N2EsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDZkMTcsIDB4MDEyZSwgMHgwY2I4LCAweDIwMDEsCisJMHgwMDI4LCAweDBjYTgsIDB4MjAwMSwgMHgwMDAwLCAweDBjOTAsIDB4MjAwOSwgMHgxODM0LCAweDIxMGMsCisJMHg4MWZmLCAweDExZDgsIDB4YTg4OCwgMHg5MDA1LCAweDAxZTAsIDB4YTg4MywgMHgwMDAwLCAweGE4N2MsCisJMHhkMGY0LCAweDAxMjAsIDB4MDgwYywgMHg2MmE2LCAweDExMzgsIDB4MDAwNSwgMHg5MDA2LCAweGE4N2EsCisJMHgwODBjLCAweDYyMWUsIDB4MTEwOCwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGE4N2EsCisJMHhhOTgyLCAweDA4MGMsIDB4NmQxNywgMHgwMTJlLCAweDBjYjAsIDB4MjAwMSwgMHgwMDI4LCAweDkwMGUsCisJMHgwYzk4LCAweDIwMDEsIDB4MDAwMCwgMHgwYzgwLCAweDcwMTgsIDB4YTgwMiwgMHgyOTA4LCAweDIwNDgsCisJMHhhOTA2LCAweDcxMWEsIDB4NzAxMCwgMHg4MDAxLCAweDcwMTIsIDB4MDExOCwgMHg3MDA3LCAweDAwMDMsCisJMHgwMDMwLCAweDcwMTQsIDB4MjA0OCwgMHg3MDA3LCAweDAwMDEsIDB4NzA0OCwgMHgwODBmLCAweDAwMDUsCisJMHgwMGI2LCAweDcwMDcsIDB4MDAwMSwgMHhhOTc0LCAweGE4NzgsIDB4OTA4NCwgMHgwMGZmLCAweDkwOTYsCisJMHgwMDA0LCAweDA1NDAsIDB4MjBhOSwgMHgwMDAxLCAweDkwOTYsIDB4MDAwMSwgMHgwMTkwLCAweDkwMGUsCisJMHgyMGE5LCAweDA4MDAsIDB4OTA5NiwgMHgwMDAyLCAweDAxNjAsIDB4OTAwNSwgMHgxMWQ4LCAweGE5NzQsCisJMHgwODBjLCAweDY2OTksIDB4MTFiOCwgMHgwMDY2LCAweGFlODAsIDB4MDgwYywgMHg2N2E5LCAweDAwNmUsCisJMHgwMDg4LCAweDAwNDYsIDB4MjAxMSwgMHgxODBjLCAweDIyMjQsIDB4YzQ4NCwgMHgyNDEyLCAweDAwNGUsCisJMHgwMGM2LCAweDA4MGMsIDB4NjY5OSwgMHgxMTEwLCAweDA4MGMsIDB4NjhhOSwgMHg4MTA4LCAweDFmMDQsCisJMHg3YWExLCAweDAwY2UsIDB4YTg3YywgMHhkMDg0LCAweDExMjAsIDB4MDgwYywgMHgxMDMxLCAweDAwYmUsCisJMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NmQxNywgMHgwMTJlLCAweDAwYmUsCisJMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwMDcsIDB4MDAwMSwgMHgwODBjLCAweDZhMDgsCisJMHgwNTgwLCAweDIwNjEsIDB4MWE3MCwgMHg2MTAwLCAweGQxODQsIDB4MDE3OCwgMHhhODg4LCAweDkwODQsCisJMHgwMGZmLCAweDE1NTAsIDB4NjAwMCwgMHhkMDg0LCAweDA1MjAsIDB4NjAwNCwgMHg5MDA1LCAweDE1MzgsCisJMHg2MDAzLCAweDAwMDAsIDB4NjAwYiwgMHgwMDAwLCAweDAwYzgsIDB4MjAxMSwgMHgwMDAxLCAweGE4OTAsCisJMHg5MDA1LCAweDExMTAsIDB4MjAwMSwgMHgwMDFlLCAweDgwMDAsIDB4NjAxNiwgMHhhODg4LCAweDkwODQsCisJMHgwMGZmLCAweDAxNzgsIDB4NjAwNiwgMHhhODg4LCAweDgwMDcsIDB4OTA4NCwgMHgwMGZmLCAweDAxNDgsCisJMHg2MDBhLCAweGE4ODgsIDB4ODAwMCwgMHgxMTA4LCAweGMyOGQsIDB4NjIwMiwgMHgwMTJlLCAweDA4MDQsCisJMHg3Y2ZiLCAweDAxMmUsIDB4MDgwNCwgMHg3Y2Y1LCAweDAxMmUsIDB4MDgwNCwgMHg3Y2VmLCAweDAxMmUsCisJMHgwODA0LCAweDdjZjIsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweDA4MGMsCisJMHg2YTA4LCAweDA1ZTAsIDB4MjA2MSwgMHgxYTcwLCAweDYwMDAsIDB4ZDA4NCwgMHgwNWI4LCAweDYyMDQsCisJMHg2MzA4LCAweGQwOGMsIDB4MTUzMCwgMHhhYzc4LCAweDk0ODQsIDB4MDAwMywgMHgwMTcwLCAweGE5ODgsCisJMHg5MThjLCAweDAwZmYsIDB4ODAwMSwgMHgxMTIwLCAweDIxMDAsIDB4OTIxMCwgMHgwNjIwLCAweDAwMjgsCisJMHg4MDAxLCAweDE1MDgsIDB4MjEwMCwgMHg5MjEyLCAweDAyZjAsIDB4OTQ4NCwgMHgwMDBjLCAweDAxODgsCisJMHhhOTg4LCAweDgxMGYsIDB4OTE4YywgMHgwMGZmLCAweDkwODIsIDB4MDAwNCwgMHgxMTIwLCAweDIxMDAsCisJMHg5MzE4LCAweDAyODgsIDB4MDAzMCwgMHg5MDgyLCAweDAwMDQsIDB4MTE2OCwgMHgyMTAwLCAweDkzMWEsCisJMHgwMjUwLCAweGE4OTAsIDB4OTAwNSwgMHgwMTEwLCAweDgwMDAsIDB4NjAxNiwgMHg2MjA2LCAweDYzMGEsCisJMHgwMTJlLCAweDA4MDQsIDB4N2NmYiwgMHgwMTJlLCAweDA4MDQsIDB4N2NmOCwgMHgwMTJlLCAweDA4MDQsCisJMHg3Y2Y1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwMDcsIDB4MDAwMSwgMHgyMDYxLCAweDFhNzAsCisJMHg2MzAwLCAweGQzOGMsIDB4MTEyMCwgMHg2MzA4LCAweDgzMTgsIDB4MDIyMCwgMHg2MzBhLCAweDAxMmUsCisJMHgwODA0LCAweDdkMDksIDB4MDEyZSwgMHgwODA0LCAweDdjZjgsIDB4MDBiNiwgMHgwMTI2LCAweDAwYzYsCisJMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweGE4N2MsIDB4ZDBhYywgMHgwMTQ4LCAweDAwYzYsCisJMHgyMDYxLCAweDFhNzAsIDB4NjAwMCwgMHg5MDg0LCAweGZjZmYsIDB4NjAwMiwgMHgwMGNlLCAweDA0NDAsCisJMHhhODg4LCAweDkwMDUsIDB4MDVkOCwgMHhhODhjLCAweDkwNjUsIDB4MDU5OCwgMHgyMDAxLCAweDE4MzQsCisJMHgyMDA0LCAweDkwMDUsIDB4MDExOCwgMHgwODBjLCAweGFmNzQsIDB4MDA2OCwgMHg2MDE3LCAweGY0MDAsCisJMHg2MDViLCAweDAwMDAsIDB4YTk3YywgMHhkMWE0LCAweDAxMTAsIDB4YTk4MCwgMHg2MTVhLCAweDIwMDksCisJMHgwMDQxLCAweDA4MGMsIDB4YWZiZSwgMHhhOTg4LCAweDkxOGMsIDB4ZmYwMCwgMHg5MTg2LCAweDIwMDAsCisJMHgxMTM4LCAweDAwMjYsIDB4OTAwZSwgMHgyMDExLCAweGZkZmYsIDB4MDgwYywgMHg4NzlhLCAweDAwMmUsCisJMHhhODdjLCAweGQwYzQsIDB4MDE0OCwgMHgyMDYxLCAweDFhNzAsIDB4NjAwMCwgMHhkMDhjLCAweDExMjAsCisJMHg2MDA4LCAweDgwMDAsIDB4MDIwOCwgMHg2MDBhLCAweDAwY2UsIDB4MDEyZSwgMHgwMGJlLCAweDA4MDQsCisJMHg3Y2ZiLCAweDAwY2UsIDB4MDEyZSwgMHgwMGJlLCAweDA4MDQsIDB4N2NmNSwgMHhhOTg0LCAweDkxODYsCisJMHgwMDJlLCAweDBkMzAsIDB4OTE4NiwgMHgwMDJkLCAweDBkMTgsIDB4OTE4NiwgMHgwMDQ1LCAweDA1MTAsCisJMHg5MTg2LCAweDAwMmEsIDB4MTEzMCwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHhjMTk0LCAweDIxMDIsCisJMHgwOGI4LCAweDkxODYsIDB4MDAyMCwgMHgwMTU4LCAweDkxODYsIDB4MDAyOSwgMHgxZDEwLCAweGE5NzQsCisJMHgwODBjLCAweDY2OTksIDB4MTk2OCwgMHhiODAwLCAweGMwZTQsIDB4YjgwMiwgMHgwODQ4LCAweGE4OGMsCisJMHg5MDY1LCAweDA5YjgsIDB4NjAwNywgMHgwMDI0LCAweDIwMDEsIDB4MTk4NSwgMHgyMDA0LCAweDYwMWEsCisJMHgwODA0LCAweDdiOTAsIDB4YTg4YywgMHg5MDY1LCAweDA5NjAsIDB4MDBlNiwgMHhhODkwLCAweDkwNzUsCisJMHgyMDAxLCAweDE4MzQsIDB4MjAwNCwgMHg5MDA1LCAweDAxNTAsIDB4MDgwYywgMHhhZjc0LCAweDhlZmYsCisJMHgwMTE4LCAweDJlNjAsIDB4MDgwYywgMHhhZjc0LCAweDAwZWUsIDB4MDgwNCwgMHg3YjkwLCAweDYwMjQsCisJMHhjMGRjLCAweGMwZDUsIDB4NjAyNiwgMHgyZTYwLCAweDYwMDcsIDB4MDAzYSwgMHhhOGEwLCAweDkwMDUsCisJMHgwMTMwLCAweDYwMDcsIDB4MDAzYiwgMHhhOGE0LCAweDYwMmUsIDB4YThhOCwgMHg2MDE2LCAweDYwMDMsCisJMHgwMDAxLCAweDA4MGMsIDB4OTFiMSwgMHgwODBjLCAweDk3NjMsIDB4MDBlZSwgMHgwODA0LCAweDdiOTAsCisJMHgyMDYxLCAweDFhNzAsIDB4NjAwMCwgMHhkMDg0LCAweDAxOTAsIDB4ZDA4YywgMHgxOTA0LCAweDdkMDksCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MjA0LCAweDgyMTAsIDB4MDIyMCwgMHg2MjA2LCAweDAxMmUsCisJMHgwODA0LCAweDdkMDksIDB4MDEyZSwgMHhhODgzLCAweDAwMTYsIDB4MDgwNCwgMHg3ZDAyLCAweGE4ODMsCisJMHgwMDA3LCAweDA4MDQsIDB4N2QwMiwgMHhhODY0LCAweDgwMDcsIDB4OTA4NCwgMHgwMGZmLCAweDAxMzAsCisJMHg4MDAxLCAweDExMzgsIDB4NzAwNywgMHgwMDAxLCAweDAwNjksIDB4MDAwNSwgMHgwODBjLCAweDc4OGIsCisJMHgwMDQwLCAweDcwMDcsIDB4MDAwMywgMHg3MDEyLCAweDI5MDAsIDB4NzAxNiwgMHg3MDFhLCAweDcwNGIsCisJMHg3YzMyLCAweDAwMDUsIDB4MDBiNiwgMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDkwM2UsCisJMHgyMDYxLCAweDE4MDAsIDB4NjFkMCwgMHg4MWZmLCAweDE5MDQsIDB4N2NiNCwgMHg2MTMwLCAweGQxOTQsCisJMHgxOTA0LCAweDdjZGUsIDB4YTg3OCwgMHgyMDcwLCAweDllODIsIDB4MWNkMCwgMHgwYTA0LCAweDdjYTgsCisJMHg2MDY4LCAweDllMDIsIDB4MWEwNCwgMHg3Y2E4LCAweDcxMjAsIDB4OTE4NiwgMHgwMDA2LCAweDE5MDQsCisJMHg3YzlhLCAweDcwMTAsIDB4OTA1ZCwgMHgwOTA0LCAweDdjYjQsIDB4YjgwMCwgMHhkMGU0LCAweDE5MDQsCisJMHg3Y2Q4LCAweDIwNjEsIDB4MWE3MCwgMHg2MTAwLCAweDkxODQsIDB4MDMwMSwgMHg5MDg2LCAweDAwMDEsCisJMHgxNWEwLCAweDcwMjQsIDB4ZDBkYywgMHgxOTA0LCAweDdjZTEsIDB4YTg4MywgMHgwMDAwLCAweGE4MDMsCisJMHgwMDAwLCAweDI5MDgsIDB4NzAxNCwgMHg5MDA1LCAweDExOTgsIDB4NzExNiwgMHhhODdjLCAweGQwZjQsCisJMHgxOTA0LCAweDdjZTQsIDB4MDgwYywgMHg1NzVkLCAweGQwOWMsIDB4MTExOCwgMHhhODdjLCAweGMwY2MsCisJMHhhODdlLCAweDJlNjAsIDB4MDgwYywgMHg4NmJhLCAweDAxMmUsIDB4MDBlZSwgMHgwMGJlLCAweDAwMDUsCisJMHgyMDQ4LCAweGE4MDAsIDB4OTAwNSwgMHgxZGUwLCAweGE5MDIsIDB4MjE0OCwgMHhhODdjLCAweGQwZjQsCisJMHgxOTA0LCAweDdjZTQsIDB4MDEyZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHgwMTJlLCAweDAwZWUsCisJMHhhODgzLCAweDAwMDYsIDB4MDBiZSwgMHgwODA0LCAweDdkMDIsIDB4ZDE4NCwgMHgwZGI4LCAweGQxYzQsCisJMHgxMTkwLCAweDAwYTAsIDB4YTk3NCwgMHgwODBjLCAweDY2OTksIDB4MTVkMCwgMHhiODAwLCAweGQwZTQsCisJMHgxNWI4LCAweDcxMjAsIDB4OTE4NiwgMHgwMDA3LCAweDExMTgsIDB4YTg4MywgMHgwMDAyLCAweDA0OTAsCisJMHhhODgzLCAweDAwMDgsIDB4MDQ3OCwgMHhhODgzLCAweDAwMGUsIDB4MDQ2MCwgMHhhODgzLCAweDAwMTcsCisJMHgwNDQ4LCAweGE4ODMsIDB4MDAzNSwgMHgwNDMwLCAweDA4MGMsIDB4NTc2MSwgMHhkMGZjLCAweDAxZTgsCisJMHhhODc4LCAweDIwNzAsIDB4OWU4MiwgMHgxY2QwLCAweDAyYzAsIDB4NjA2OCwgMHg5ZTAyLCAweDEyYTgsCisJMHg3MTIwLCAweDkxODYsIDB4MDAwNiwgMHgxMTg4LCAweDcwMTAsIDB4OTA1ZCwgMHgwMTcwLCAweGI4MDAsCisJMHhkMGJjLCAweDAxNTgsIDB4MjAzOSwgMHgwMDAxLCAweDcwMDAsIDB4OTA4NiwgMHgwMDA3LCAweDE5MDQsCisJMHg3YzNlLCAweDcwMDMsIDB4MDAwMiwgMHgwODA0LCAweDdjM2UsIDB4YTg4MywgMHgwMDI4LCAweDAwMTAsCisJMHhhODgzLCAweDAwMjksIDB4MDEyZSwgMHgwMGVlLCAweDAwYmUsIDB4MDQyMCwgMHhhODgzLCAweDAwMmEsCisJMHgwY2M4LCAweGE4ODMsIDB4MDA0NSwgMHgwY2IwLCAweDJlNjAsIDB4MjAxOSwgMHgwMDAyLCAweDYwMWIsCisJMHgwMDE0LCAweDA4MGMsIDB4ZTJjMCwgMHgwMTJlLCAweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweDIwMDksCisJMHgwMDNlLCAweDAwNTgsIDB4MjAwOSwgMHgwMDA0LCAweDAwNDAsIDB4MjAwOSwgMHgwMDA2LCAweDAwMjgsCisJMHgyMDA5LCAweDAwMTYsIDB4MDAxMCwgMHgyMDA5LCAweDAwMDEsIDB4YTg4NCwgMHg5MDg0LCAweGZmMDAsCisJMHg5MTA1LCAweGE4ODYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2ZDE3LCAweDAxMmUsCisJMHgwMDA1LCAweDA4MGMsIDB4MTAzMSwgMHgwMDA1LCAweDAwZDYsIDB4MDgwYywgMHg4NmIxLCAweDAwZGUsCisJMHgwMDA1LCAweDAwZDYsIDB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDAwNDAsCisJMHg3MDJjLCAweGQwODQsIDB4MDFkOCwgMHg5MDhjLCAweDA3ODAsIDB4MTkwYywgMHg3ZGYzLCAweGQwOWMsCisJMHgxMWE4LCAweDIwNzEsIDB4MTgwMCwgMHg3MGMwLCAweDkwZWEsIDB4MDAyMCwgMHgwMjc4LCAweDgwMDEsCisJMHg3MGMyLCAweDcwMmMsIDB4MjA0OCwgMHhhODAwLCAweDcwMmUsIDB4OTAwNiwgMHhhODAyLCAweGE4MDYsCisJMHgyMDcxLCAweDAwNDAsIDB4MjkwMCwgMHg3MDIyLCAweDcwMmMsIDB4MGMyOCwgMHgwMTJlLCAweDAwZWUsCisJMHgwMGRlLCAweDAwMDUsIDB4MDAwNiwgMHg5MDg0LCAweDA3ODAsIDB4MTkwYywgMHg3ZGYzLCAweDAwMGUsCisJMHgwMDA1LCAweGE4OTgsIDB4OTA4NCwgMHgwMDAzLCAweDA1YTgsIDB4MDgwYywgMHhhZWVkLCAweDA1ZDgsCisJMHgyOTAwLCAweDYwMTYsIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDM1LCAweDExMzgsCisJMHg2MDA4LCAweGMwZmQsIDB4NjAwYSwgMHgyMDAxLCAweDE5NmEsIDB4MjAwNCwgMHgwMDk4LCAweGE4YTAsCisJMHg5MDg0LCAweDAwZmYsIDB4YTk5YywgMHg5MThjLCAweGZmMDAsIDB4OTEwNSwgMHhhOTljLCAweDkxOGMsCisJMHgwMGZmLCAweDA4MGMsIDB4Mjg3YywgMHgxNTQwLCAweDAwYjYsIDB4MDgwYywgMHg2Njk5LCAweDJiMDAsCisJMHgwMGJlLCAweDE1MTAsIDB4NjAxMiwgMHg2MDIzLCAweDAwMDEsIDB4MjAwOSwgMHgwMDQwLCAweGE4NjQsCisJMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDM1LCAweDAxMTAsIDB4MjAwOSwgMHgwMDQxLCAweDA4MGMsCisJMHhhZmJlLCAweDAwMDUsIDB4YTg3YiwgMHgwMTAxLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsCisJMHg2ZDE3LCAweDAxMmUsIDB4MDAwNSwgMHhhODdiLCAweDAwMmMsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgwODBjLCAweDZkMTcsIDB4MDEyZSwgMHgwMDA1LCAweGE4N2IsIDB4MDAyOCwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDA4MGMsIDB4NmQxNywgMHgwMTJlLCAweDA4MGMsIDB4YWY0MywgMHgwMDA1LCAweDAwZDYsCisJMHgwMGM2LCAweDAwMzYsIDB4MDAyNiwgMHgwMDE2LCAweDAwYjYsIDB4NzAwNywgMHgwMDAxLCAweGFhNzQsCisJMHg5MjgyLCAweDAwMDQsIDB4MWEwNCwgMHg3ZGU0LCAweGE5N2MsIDB4OTE4OCwgMHgxMDAwLCAweDIxMDQsCisJMHg5MDVkLCAweGI4MDQsIDB4ZDI4NCwgMHgwMTQwLCAweDA1ZTgsIDB4ODAwNywgMHg5MDg0LCAweDAwZmYsCisJMHg5MDg0LCAweDAwMDYsIDB4MTEwOCwgMHgwNGIwLCAweDJiMTAsIDB4MDgwYywgMHhhZWVkLCAweDExMTgsCisJMHgwODBjLCAweGFmOTEsIDB4MDVhOCwgMHg2MjEyLCAweGE4NzQsIDB4MDAwMiwgMHg3ZGMyLCAweDdkYzcsCisJMHg3ZGNhLCAweDdkZDAsIDB4MjAxOSwgMHgwMDAyLCAweDA4MGMsIDB4ZTZhZSwgMHgwMDYwLCAweDA4MGMsCisJMHhlNjRhLCAweDAwNDgsIDB4MjAxOSwgMHgwMDAyLCAweGE5ODAsIDB4MDgwYywgMHhlNjY1LCAweDAwMTgsCisJMHhhOTgwLCAweDA4MGMsIDB4ZTY0YSwgMHgwODBjLCAweGFmNDMsIDB4YTg4NywgMHgwMDAwLCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2ZDE3LCAweDAxMmUsIDB4MDBiZSwgMHgwMDFlLCAweDAwMmUsCisJMHgwMDNlLCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweGE4ODcsIDB4MDAwNiwgMHgwYzgwLCAweGE4ODcsCisJMHgwMDAyLCAweDBjNjgsIDB4YTg4NywgMHgwMDA1LCAweDBjNTAsIDB4YTg4NywgMHgwMDA0LCAweDBjMzgsCisJMHhhODg3LCAweDAwMDcsIDB4MGMyMCwgMHgyMDkxLCAweDgwMDAsIDB4MGUwNCwgMHg3ZGY1LCAweDAwMDYsCisJMHgwMDE2LCAweDIwMDEsIDB4ODAwMywgMHgwMDA2LCAweDA4MDQsIDB4MGRkZSwgMHgyMDAxLCAweDE4MzQsCisJMHgyMDA0LCAweDkwMDUsIDB4MDAwNSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMzAwLCAweDIwMDEsCisJMHgwMjAwLCAweDIwMGMsIDB4YzFlNSwgMHhjMWRjLCAweDIxMDIsIDB4MjAwOSwgMHgwMjE4LCAweDIxMGMsCisJMHhkMWVjLCAweDExMjAsIDB4MDgwYywgMHgxNThjLCAweDAwZmUsIDB4MDAwNSwgMHgyMDAxLCAweDAyMGQsCisJMHgyMDAzLCAweDAwMjAsIDB4NzgxZiwgMHgwMzAwLCAweDAwZmUsIDB4MDAwNSwgMHg3ODFjLCAweGQwOGMsCisJMHgwOTA0LCAweDdlNzUsIDB4NjhjMCwgMHg5MGFhLCAweDAwMDUsIDB4MGEwNCwgMHg4NGI5LCAweDdkNDQsCisJMHg3YzQwLCAweDk1ODQsIDB4MDBmNiwgMHgxNTEwLCAweDk0ODQsIDB4NzAwMCwgMHgwMTQwLCAweDkwOGEsCisJMHgyMDAwLCAweDEyNjAsIDB4OTU4NCwgMHgwNzAwLCAweDgwMDcsIDB4MDgwNCwgMHg3ZTdjLCAweDcwMDAsCisJMHg5MDg0LCAweGZmMDAsIDB4OTA4NiwgMHg4MTAwLCAweDBkYTgsIDB4MDBiMCwgMHg5NDg0LCAweDBmZmYsCisJMHgxMTMwLCAweDcwMDAsIDB4OTA4NCwgMHhmZjAwLCAweDkwODYsIDB4ODEwMCwgMHgxMWMwLCAweDA4MGMsCisJMHhlYjUxLCAweDA4MGMsIDB4ODM5ZSwgMHg3ODE3LCAweDAxNDAsIDB4MDBhOCwgMHg5NTg0LCAweDAwNzYsCisJMHgxMTE4LCAweDA4MGMsIDB4ODNmYywgMHgxOWMwLCAweGQ1YTQsIDB4MDE0OCwgMHgwMDQ2LCAweDAwNTYsCisJMHgwODBjLCAweDdlZDcsIDB4MDgwYywgMHgyMzc1LCAweDAwNWUsIDB4MDA0ZSwgMHgwMDIwLCAweDA4MGMsCisJMHhlYjUxLCAweDc4MTcsIDB4MDE0MCwgMHgwODBjLCAweDc0M2UsIDB4MDE2OCwgMHgyMDAxLCAweDAxMTEsCisJMHgyMDA0LCAweGQwOGMsIDB4MDE0MCwgMHg2ODkzLCAweDAwMDAsIDB4MjAwMSwgMHgwMTEwLCAweDIwMDMsCisJMHgwMDA4LCAweDIwMDMsIDB4MDAwMCwgMHgwODBjLCAweDdlYjgsIDB4MjAwMSwgMHgxOWVmLCAweDIwMDQsCisJMHg5MDA1LCAweDA5MGMsIDB4OTc2MywgMHgwMDA1LCAweDAwMDIsIDB4N2U4ZSwgMHg4MWE2LCAweDdlODUsCisJMHg3ZTg1LCAweDdlODUsIDB4N2U4NSwgMHg3ZTg1LCAweDdlODUsIDB4NzgxNywgMHgwMTQwLCAweDIwMDEsCisJMHgxOWVmLCAweDIwMDQsIDB4OTAwNSwgMHgwOTBjLCAweDk3NjMsIDB4MDAwNSwgMHg3MDAwLCAweDkwOGMsCisJMHhmZjAwLCAweDkxOTQsIDB4ZjAwMCwgMHg4MTBmLCAweDk0ODQsIDB4MGZmZiwgMHg2ODkyLCAweDkyODYsCisJMHgyMDAwLCAweDExNTAsIDB4NjgwMCwgMHg5MDg2LCAweDAwMDEsIDB4MTExOCwgMHgwODBjLCAweDU3YzMsCisJMHgwMDcwLCAweDA4MGMsIDB4N2VmNywgMHgwMDU4LCAweDkyODYsIDB4MzAwMCwgMHgxMTE4LCAweDA4MGMsCisJMHg4MGRlLCAweDAwMjgsIDB4OTI4NiwgMHg4MDAwLCAweDExMTAsIDB4MDgwYywgMHg4MmM1LCAweDc4MTcsCisJMHgwMTQwLCAweDIwMDEsIDB4MTllZiwgMHgyMDA0LCAweDkwMDUsIDB4MDkwYywgMHg5NzYzLCAweDAwMDUsCisJMHgyMDAxLCAweDE4MTAsIDB4MjAwNCwgMHhkMDhjLCAweDAxNzgsIDB4MjAwMSwgMHgxODAwLCAweDIwMDQsCisJMHg5MDg2LCAweDAwMDMsIDB4MTE0OCwgMHgwMDI2LCAweDAwMzYsIDB4MjAxMSwgMHg4MDQ4LCAweDI1MTgsCisJMHgwODBjLCAweDRiN2YsIDB4MDAzZSwgMHgwMDJlLCAweDAwMDUsIDB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsCisJMHgwMGY2LCAweDIwNzksIDB4MDIwMCwgMHgyMDE5LCAweGZmZmUsIDB4N2MzMCwgMHgwMDUwLCAweDAwMzYsCisJMHgwMDQ2LCAweDAwNTYsIDB4MDBmNiwgMHgyMDc5LCAweDAyMDAsIDB4N2Q0NCwgMHg3YzQwLCAweDIwMTksCisJMHhmZmZmLCAweDIwMDEsIDB4MTgxMCwgMHgyMDA0LCAweGQwOGMsIDB4MDE2MCwgMHgyMDAxLCAweDE4MDAsCisJMHgyMDA0LCAweDkwODYsIDB4MDAwMywgMHgxMTMwLCAweDAwMjYsIDB4MjAxMSwgMHg4MDQ4LCAweDA4MGMsCisJMHg0YjdmLCAweDAwMmUsIDB4MDBmZSwgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDA1LCAweDAwYjYsCisJMHgwMGM2LCAweDcwMTAsIDB4OTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4OTA5NiwgMHgwMDAxLCAweDAxMjAsCisJMHg5MDk2LCAweDAwMjMsIDB4MTkwNCwgMHg4MGFmLCAweDkxODYsIDB4MDAyMywgMHgxNWMwLCAweDA4MGMsCisJMHg4MzYzLCAweDA5MDQsIDB4ODBhZiwgMHg2MTIwLCAweDkxODYsIDB4MDAwMSwgMHgwMTUwLCAweDkxODYsCisJMHgwMDA0LCAweDAxMzgsIDB4OTE4NiwgMHgwMDA4LCAweDAxMjAsIDB4OTE4NiwgMHgwMDBhLCAweDE5MDQsCisJMHg4MGFmLCAweDcxMjQsIDB4NjEwYSwgMHg3MDMwLCAweDkwOGUsIDB4MDIwMCwgMHgxMTMwLCAweDIwMDksCisJMHgwMDE1LCAweDA4MGMsIDB4YWZiZSwgMHgwODA0LCAweDgwYWYsIDB4OTA4ZSwgMHgwMjE0LCAweDAxMTgsCisJMHg5MDhlLCAweDAyMTAsIDB4MTEzMCwgMHgyMDA5LCAweDAwMTUsIDB4MDgwYywgMHhhZmJlLCAweDA4MDQsCisJMHg4MGFmLCAweDkwOGUsIDB4MDEwMCwgMHgxOTA0LCAweDgwYWYsIDB4NzAzNCwgMHg5MDA1LCAweDE5MDQsCisJMHg4MGFmLCAweDIwMDksIDB4MDAxNiwgMHgwODBjLCAweGFmYmUsIDB4MDgwNCwgMHg4MGFmLCAweDkxODYsCisJMHgwMDIyLCAweDE5MDQsIDB4ODBhZiwgMHg3MDMwLCAweDkwOGUsIDB4MDMwMCwgMHgxNTgwLCAweDY4ZGMsCisJMHhkMGE0LCAweDA1MjgsIDB4YzBiNSwgMHg2OGRlLCAweDcxMDAsIDB4OTE4YywgMHgwMGZmLCAweDY5N2UsCisJMHg3MDA0LCAweDY4ODIsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4NzllNiwgMHg3OGVhLCAweDAwMDYsCisJMHg5MDg0LCAweDAwZmYsIDB4MDAxNiwgMHgyMDA4LCAweDA4MGMsIDB4MjhjNSwgMHg3OTMyLCAweDc5MzYsCisJMHgwMDFlLCAweDAwMGUsIDB4MDBmZSwgMHgwODBjLCAweDI4N2MsIDB4Njk1ZSwgMHg3MDNjLCAweDAwZTYsCisJMHgyMDcxLCAweDAxNDAsIDB4NzA4NiwgMHgyMDcxLCAweDE4MDAsIDB4NzBiNiwgMHgwMGVlLCAweDcwMzQsCisJMHg5MDA1LCAweDE5MDQsIDB4ODBhZiwgMHgyMDA5LCAweDAwMTcsIDB4MDgwNCwgMHg4MDVmLCAweDkwOGUsCisJMHgwNDAwLCAweDExOTAsIDB4NzAzNCwgMHg5MDA1LCAweDE5MDQsIDB4ODBhZiwgMHgwODBjLCAweDc0M2UsCisJMHgwMTIwLCAweDIwMDksIDB4MDAxZCwgMHgwODA0LCAweDgwNWYsIDB4NjhkYywgMHhjMGE1LCAweDY4ZGUsCisJMHgyMDA5LCAweDAwMzAsIDB4MDgwNCwgMHg4MDVmLCAweDkwOGUsIDB4MDUwMCwgMHgxMTQwLCAweDcwMzQsCisJMHg5MDA1LCAweDE5MDQsIDB4ODBhZiwgMHgyMDA5LCAweDAwMTgsIDB4MDgwNCwgMHg4MDVmLCAweDkwOGUsCisJMHgyMDEwLCAweDExMjAsIDB4MjAwOSwgMHgwMDE5LCAweDA4MDQsIDB4ODA1ZiwgMHg5MDhlLCAweDIxMTAsCisJMHgxMTIwLCAweDIwMDksIDB4MDAxYSwgMHgwODA0LCAweDgwNWYsIDB4OTA4ZSwgMHg1MjAwLCAweDExNDAsCisJMHg3MDM0LCAweDkwMDUsIDB4MTkwNCwgMHg4MGFmLCAweDIwMDksIDB4MDAxYiwgMHgwODA0LCAweDgwNWYsCisJMHg5MDhlLCAweDUwMDAsIDB4MTE0MCwgMHg3MDM0LCAweDkwMDUsIDB4MTkwNCwgMHg4MGFmLCAweDIwMDksCisJMHgwMDFjLCAweDA4MDQsIDB4ODA1ZiwgMHg5MDhlLCAweDEzMDAsIDB4MTEyMCwgMHgyMDA5LCAweDAwMzQsCisJMHgwODA0LCAweDgwNWYsIDB4OTA4ZSwgMHgxMjAwLCAweDExNDAsIDB4NzAzNCwgMHg5MDA1LCAweDE5MDQsCisJMHg4MGFmLCAweDIwMDksIDB4MDAyNCwgMHgwODA0LCAweDgwNWYsIDB4OTA4YywgMHhmZjAwLCAweDkxOGUsCisJMHgyNDAwLCAweDExNzAsIDB4MjAwOSwgMHgwMDJkLCAweDIwMDEsIDB4MTgxMCwgMHgyMDA0LCAweGQwOWMsCisJMHgwOTA0LCAweDgwNWYsIDB4MDgwYywgMHhkYTg1LCAweDE5MDQsIDB4ODBhZiwgMHgwODA0LCAweDgwNWQsCisJMHg5MDhjLCAweGZmMDAsIDB4OTE4ZSwgMHg1MzAwLCAweDExMjAsIDB4MjAwOSwgMHgwMDJhLCAweDA4MDQsCisJMHg4MDVmLCAweDkwOGUsIDB4MGYwMCwgMHgxMTIwLCAweDIwMDksIDB4MDAyMCwgMHgwODA0LCAweDgwNWYsCisJMHg5MDhlLCAweDYxMDQsIDB4MTUzMCwgMHgyMDI5LCAweDAyMDUsIDB4MjAxMSwgMHgwMjZkLCAweDgyMDgsCisJMHgyMjA0LCAweDkwODIsIDB4MDAwNCwgMHg4MDA0LCAweDgwMDQsIDB4MjBhOCwgMHgyMDExLCAweDgwMTUsCisJMHgyMTFjLCAweDgxMDgsIDB4MDA0NiwgMHgyMTI0LCAweDA4MGMsIDB4NGI3ZiwgMHgwMDRlLCAweDgxMDgsCisJMHgwZjA0LCAweDgwMTMsIDB4OTE4NiwgMHgwMjgwLCAweDFkODgsIDB4MjUwNCwgMHg4MDAwLCAweDIwMmEsCisJMHgyMDA5LCAweDAyNjAsIDB4MGM1OCwgMHgyMDJiLCAweDAwMDAsIDB4MjAwOSwgMHgwMDIzLCAweDA4MDQsCisJMHg4MDVmLCAweDkwOGUsIDB4NjAwMCwgMHgxMTIwLCAweDIwMDksIDB4MDAzZiwgMHgwODA0LCAweDgwNWYsCisJMHg5MDhlLCAweDU0MDAsIDB4MTEzOCwgMHgwODBjLCAweDg0NjksIDB4MTkwNCwgMHg4MGFmLCAweDIwMDksCisJMHgwMDQ2LCAweDA0YTgsIDB4OTA4ZSwgMHg1NTAwLCAweDExNDgsIDB4MDgwYywgMHg4NDkxLCAweDExMTgsCisJMHgyMDA5LCAweDAwNDEsIDB4MDQ2MCwgMHgyMDA5LCAweDAwNDIsIDB4MDQ0OCwgMHg5MDhlLCAweDc4MDAsCisJMHgxMTE4LCAweDIwMDksIDB4MDA0NSwgMHgwNDE4LCAweDkwOGUsIDB4MTAwMCwgMHgxMTE4LCAweDIwMDksCisJMHgwMDRlLCAweDAwZTgsIDB4OTA4ZSwgMHg2MzAwLCAweDExMTgsIDB4MjAwOSwgMHgwMDRhLCAweDAwYjgsCisJMHg5MDhjLCAweGZmMDAsIDB4OTE4ZSwgMHg1NjAwLCAweDExMTgsIDB4MjAwOSwgMHgwMDRmLCAweDAwNzgsCisJMHg5MDhjLCAweGZmMDAsIDB4OTE4ZSwgMHg1NzAwLCAweDExMTgsIDB4MjAwOSwgMHgwMDUwLCAweDAwMzgsCisJMHgyMDA5LCAweDAwMWQsIDB4NjgzOCwgMHhkMGQ0LCAweDAxMTAsIDB4MjAwOSwgMHgwMDRjLCAweDAwMTYsCisJMHgyMDExLCAweDAyNjMsIDB4MjIwNCwgMHg4MjExLCAweDIyMGMsIDB4MDgwYywgMHgyODdjLCAweDE5MDQsCisJMHg4MGIyLCAweDA4MGMsIDB4NjYzOCwgMHgxOTA0LCAweDgwYjIsIDB4YmUxMiwgMHhiZDE2LCAweDAwMWUsCisJMHgwMDE2LCAweDA4MGMsIDB4NzQzZSwgMHgwMWMwLCAweDY4ZGMsIDB4ZDA4YywgMHgxMTQ4LCAweDcwMDAsCisJMHg5MDg0LCAweDAwZmYsIDB4MTE4OCwgMHg3MDA0LCAweDkwODQsIDB4ZmYwMCwgMHgxMTY4LCAweDAwNDAsCisJMHg2ODdjLCAweDk2MDYsIDB4MTE0OCwgMHg2ODgwLCAweDk1MDYsIDB4OTA4NCwgMHhmZjAwLCAweDExMjAsCisJMHg5NTg0LCAweDAwZmYsIDB4YjhjMiwgMHgwMDgwLCAweGI4YzAsIDB4OTAwNSwgMHgxMTY4LCAweDkxODYsCisJMHgwMDQ2LCAweDExNTAsIDB4Njg3YywgMHg5NjA2LCAweDExMzgsIDB4Njg4MCwgMHg5NTA2LCAweDkwODQsCisJMHhmZjAwLCAweDExMTAsIDB4MDAxZSwgMHgwMDk4LCAweDA4MGMsIDB4YWVlZCwgMHgwMWE4LCAweDJiMDgsCisJMHg2MTEyLCAweDYwMjMsIDB4MDAwNCwgMHg3MTIwLCAweDYxMGEsIDB4MDAxZSwgMHg5MTg2LCAweDAwNGMsCisJMHgxMTEwLCAweDYwMjMsIDB4MDAwYSwgMHgwMDE2LCAweDAwMWUsIDB4MDgwYywgMHhhZmJlLCAweDAwY2UsCisJMHgwMGJlLCAweDAwMDUsIDB4MDAxZSwgMHgwY2Q4LCAweDIwMDEsIDB4MTgwZSwgMHgyMDA0LCAweGQwZWMsCisJMHgwMTIwLCAweDIwMTEsIDB4ODA0OSwgMHgwODBjLCAweDRiN2YsIDB4MDgwYywgMHhhZjkxLCAweDBkOTAsCisJMHgyYjA4LCAweDYxMTIsIDB4NjAyMywgMHgwMDA0LCAweDcxMjAsIDB4NjEwYSwgMHgwMDFlLCAweDAwMTYsCisJMHg5MTg2LCAweDAwMTcsIDB4MDExOCwgMHg5MTg2LCAweDAwMzAsIDB4MTEyOCwgMHg2MDA3LCAweDAwMDksCisJMHg2MDE3LCAweDI5MDAsIDB4MDAyMCwgMHg2MDA3LCAweDAwNTEsIDB4NjAxNywgMHgwMDAwLCAweDYwMmYsCisJMHgwMDA5LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxZjksIDB4MDhhMCwgMHgwODBjLCAweDg0ZDgsCisJMHgxMTU4LCAweDA4MGMsIDB4MzM0MiwgMHgxMTQwLCAweDcwMTAsIDB4OTA4NCwgMHhmZjAwLCAweDgwMDcsCisJMHg5MDhlLCAweDAwMDgsIDB4MTEwOCwgMHgwMDA5LCAweDAwMDUsIDB4MDBiNiwgMHgwMGM2LCAweDAwNDYsCisJMHg3MDAwLCAweDkwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDkxODYsIDB4MDAzMywgMHgxMWU4LCAweDA4MGMsCisJMHg4MzYzLCAweDA5MDQsIDB4ODEzZSwgMHg3MTI0LCAweDYxMGEsIDB4NzAzMCwgMHg5MDhlLCAweDAyMDAsCisJMHgxMTQwLCAweDcwMzQsIDB4OTAwNSwgMHgxNWQwLCAweDIwMDksIDB4MDAxNSwgMHgwODBjLCAweGFmYmUsCisJMHgwNGE4LCAweDkwOGUsIDB4MDEwMCwgMHgxNTkwLCAweDcwMzQsIDB4OTAwNSwgMHgxNTc4LCAweDIwMDksCisJMHgwMDE2LCAweDA4MGMsIDB4YWZiZSwgMHgwNDUwLCAweDkxODYsIDB4MDAzMiwgMHgxNTM4LCAweDcwMzAsCisJMHg5MDhlLCAweDE0MDAsIDB4MTUxOCwgMHgyMDA5LCAweDAwMzgsIDB4MDAxNiwgMHgyMDExLCAweDAyNjMsCisJMHgyMjA0LCAweDgyMTEsIDB4MjIwYywgMHgwODBjLCAweDI4N2MsIDB4MTFiOCwgMHgwODBjLCAweDY2MzgsCisJMHgxMWEwLCAweGJlMTIsIDB4YmQxNiwgMHgwODBjLCAweGFlZWQsIDB4MDE3OCwgMHgyYjA4LCAweDYxMTIsCisJMHgwODBjLCAweGQxMDIsIDB4NjAyMywgMHgwMDA0LCAweDcxMjAsIDB4NjEwYSwgMHgwMDFlLCAweDA4MGMsCisJMHhhZmJlLCAweDA4MGMsIDB4OTc2MywgMHgwMDEwLCAweDAwY2UsIDB4MDAxZSwgMHgwMDRlLCAweDAwY2UsCisJMHgwMGJlLCAweDAwMDUsIDB4MDBiNiwgMHgwMDQ2LCAweDAwZTYsIDB4MDBkNiwgMHgyMDI4LCAweDIxMzAsCisJMHg5Njk2LCAweDAwZmYsIDB4MTFiOCwgMHg5NTkyLCAweGZmZmMsIDB4MDJhMCwgMHg5NTk2LCAweGZmZmQsCisJMHgxMTIwLCAweDIwMDksIDB4MDA3ZiwgMHgwODA0LCAweDgxYTAsIDB4OTU5NiwgMHhmZmZlLCAweDExMjAsCisJMHgyMDA5LCAweDAwN2UsIDB4MDgwNCwgMHg4MWEwLCAweDk1OTYsIDB4ZmZmYywgMHgxMTE4LCAweDIwMDksCisJMHgwMDgwLCAweDA0ZjAsIDB4MjAxMSwgMHgwMDAwLCAweDIwMTksIDB4MTgzNywgMHgyMzFjLCAweGQzYWMsCisJMHgwMTMwLCAweDkwMjYsIDB4MjBhOSwgMHgwODAwLCAweDIwNzEsIDB4MTAwMCwgMHgwMDMwLCAweDIwMjEsCisJMHgwMDgxLCAweDIwYTksIDB4MDc3ZiwgMHgyMDcxLCAweDEwODEsIDB4MmUxYywgMHg5M2RkLCAweDAwMDAsCisJMHgxMTQwLCAweDgyZmYsIDB4MTFkMCwgMHg5NDk2LCAweDAwZmYsIDB4MDFiOCwgMHgyNDEwLCAweGMyZmQsCisJMHgwMGEwLCAweGJmMTAsIDB4MjYwMCwgMHg5NzA2LCAweGI4MTQsIDB4MTEyMCwgMHg5NTQ2LCAweDExMTAsCisJMHgyNDA4LCAweDAwYjAsIDB4OTc0NSwgMHgxMTQ4LCAweDk0YzYsIDB4MDA3ZSwgMHgwMTMwLCAweDk0YzYsCisJMHgwMDdmLCAweDAxMTgsIDB4OTRjNiwgMHgwMDgwLCAweDFkMjAsIDB4ODQyMCwgMHg4ZTcwLCAweDFmMDQsCisJMHg4MTc1LCAweDgyZmYsIDB4MTExOCwgMHg5MDg1LCAweDAwMDEsIDB4MDAxOCwgMHhjMmZjLCAweDIyMDgsCisJMHg5MDA2LCAweDAwZGUsIDB4MDBlZSwgMHgwMDRlLCAweDAwYmUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MzcsCisJMHgyMDBjLCAweDkxODQsIDB4MDA4MCwgMHgwMTEwLCAweGQxOGMsIDB4MDEzOCwgMHg3MDAwLCAweDkwOGMsCisJMHhmZjAwLCAweDgxMGYsIDB4OTE4NCwgMHgwMDBmLCAweDAwNGEsIDB4NzgxNywgMHgwMTQwLCAweDIwMDEsCisJMHgxOWVmLCAweDIwMDQsIDB4OTAwNSwgMHgwOTBjLCAweDk3NjMsIDB4MDAwNSwgMHg4MWNlLCAweDgxY2UsCisJMHg4MWNlLCAweDgzNzUsIDB4ODFjZSwgMHg4MWQ3LCAweDgyMDIsIDB4ODI5MCwgMHg4MWNlLCAweDgxY2UsCisJMHg4MWNlLCAweDgxY2UsIDB4ODFjZSwgMHg4MWNlLCAweDgxY2UsIDB4ODFjZSwgMHg3ODE3LCAweDAxNDAsCisJMHgyMDAxLCAweDE5ZWYsIDB4MjAwNCwgMHg5MDA1LCAweDA5MGMsIDB4OTc2MywgMHgwMDA1LCAweDAwYjYsCisJMHg3MTEwLCAweGQxYmMsIDB4MDFlOCwgMHg3MTIwLCAweDIxNjAsIDB4OWM4YywgMHgwMDA3LCAweDExYzAsCisJMHg5YzhhLCAweDFjZDAsIDB4MDJhOCwgMHg2ODY4LCAweDljMDIsIDB4MTI5MCwgMHg3MDA4LCAweDkwODQsCisJMHgwMGZmLCAweDYxMTAsIDB4MjE1OCwgMHhiOTEwLCAweDkxMDYsIDB4MTE1MCwgMHg3MDBjLCAweGI5MTQsCisJMHg5MTA2LCAweDExMzAsIDB4NzEyNCwgMHg2MTBhLCAweDIwMDksIDB4MDA0NiwgMHgwODBjLCAweGFmYmUsCisJMHg3ODE3LCAweDAxNDAsIDB4MjAwMSwgMHgxOWVmLCAweDIwMDQsIDB4OTAwNSwgMHgwOTBjLCAweDk3NjMsCisJMHgwMGJlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGM2LCAweDk0ODQsIDB4MGZmZiwgMHgwOTA0LCAweDgyNjYsCisJMHg3MTEwLCAweGQxYmMsIDB4MTkwNCwgMHg4MjY2LCAweDcxMDgsIDB4NzAwYywgMHgyMDI4LCAweDkxOGMsCisJMHgwMGZmLCAweDIxMzAsIDB4OTA5NCwgMHhmZjAwLCAweDE1YjAsIDB4ODFmZiwgMHgxNWEwLCAweDkwODAsCisJMHgzMzg0LCAweDIwMGQsIDB4OTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MjAwMSwgMHgwMDgwLCAweDkxMDYsCisJMHgwOTA0LCAweDgyNjYsIDB4MDgwYywgMHg2NjM4LCAweDE5MDQsIDB4ODI2NiwgMHhiZTEyLCAweGJkMTYsCisJMHhiODAwLCAweGQwZWMsIDB4MTVkOCwgMHhiYTA0LCAweDkyOTQsIDB4ZmYwMCwgMHg5Mjg2LCAweDA2MDAsCisJMHgxMWEwLCAweDA4MGMsIDB4YWVlZCwgMHgwNWU4LCAweDJiMDgsIDB4NzAyOCwgMHg2MDQ2LCAweDcwMmMsCisJMHg2MDRhLCAweDYxMTIsIDB4NjAyMywgMHgwMDA2LCAweDcxMjAsIDB4NjEwYSwgMHg3MTMwLCAweDYxNTYsCisJMHgyMDA5LCAweDAwNDQsIDB4MDgwYywgMHhkY2U1LCAweDA0MDgsIDB4MDgwYywgMHg2YTBjLCAweDExMzgsCisJMHhiODA3LCAweDA2MDYsIDB4MGMzMCwgMHgxOTBjLCAweDgxNDIsIDB4MTFjMCwgMHgwODk4LCAweDA4MGMsCisJMHhhZWVkLCAweDJiMDgsIDB4MDE5OCwgMHg2MTEyLCAweDYwMjMsIDB4MDAwNCwgMHg3MTIwLCAweDYxMGEsCisJMHg5Mjg2LCAweDA0MDAsIDB4MTExOCwgMHg2MDA3LCAweDAwMDUsIDB4MDAxMCwgMHg2MDA3LCAweDAwMDEsCisJMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg5MWY5LCAweDA4MGMsIDB4OTc2MywgMHg3ODE3LCAweDAxNDAsCisJMHgyMDAxLCAweDE5ZWYsIDB4MjAwNCwgMHg5MDA1LCAweDA5MGMsIDB4OTc2MywgMHgwMGNlLCAweDAwYmUsCisJMHgwMDA1LCAweDIwMDEsIDB4MTgwZSwgMHgyMDA0LCAweGQwZWMsIDB4MDEyMCwgMHgyMDExLCAweDgwNDksCisJMHgwODBjLCAweDRiN2YsIDB4MDgwYywgMHhhZjkxLCAweDBkNDgsIDB4MmIwOCwgMHg2MTEyLCAweDYwMjMsCisJMHgwMDA2LCAweDcxMjAsIDB4NjEwYSwgMHg3MTMwLCAweDYxNTYsIDB4NjAxNywgMHhmMzAwLCAweDYwMDMsCisJMHgwMDAxLCAweDYwMDcsIDB4MDA0MSwgMHgwODBjLCAweDkxYjEsIDB4MDgwYywgMHg5NzYzLCAweDA4YjAsCisJMHgwMGI2LCAweDcxMTAsIDB4ZDFiYywgMHgwMWU4LCAweDcwMjAsIDB4MjA2MCwgMHg5Yzg0LCAweDAwMDcsCisJMHgxMWMwLCAweDljODIsIDB4MWNkMCwgMHgwMmE4LCAweDY4NjgsIDB4OWMwMiwgMHgxMjkwLCAweDcwMDgsCisJMHg5MDg0LCAweDAwZmYsIDB4NjExMCwgMHgyMTU4LCAweGI5MTAsIDB4OTEwNiwgMHgxMTUwLCAweDcwMGMsCisJMHhiOTE0LCAweDkxMDYsIDB4MTEzMCwgMHg3MTI0LCAweDYxMGEsIDB4MjAwOSwgMHgwMDQ1LCAweDA4MGMsCisJMHhhZmJlLCAweDc4MTcsIDB4MDE0MCwgMHgyMDAxLCAweDE5ZWYsIDB4MjAwNCwgMHg5MDA1LCAweDA5MGMsCisJMHg5NzYzLCAweDAwYmUsIDB4MDAwNSwgMHg2MTIwLCAweDkxODYsIDB4MDAwMiwgMHgwMTI4LCAweDkxODYsCisJMHgwMDA1LCAweDAxMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDgwYywgMHg4NGQ4LCAweDExODAsCisJMHgwODBjLCAweDMzNDIsIDB4MTE2OCwgMHg3MDEwLCAweDkwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwODYsCisJMHgwMDAwLCAweDExMzAsIDB4OTE4NCwgMHgwMDBmLCAweDkwOGEsIDB4MDAwNiwgMHgxMjA4LCAweDAwMGIsCisJMHgwMDA1LCAweDgyZGYsIDB4ODJlMCwgMHg4MmRmLCAweDgyZGYsIDB4ODM0NSwgMHg4MzU0LCAweDAwMDUsCisJMHgwMGI2LCAweDcwMGMsIDB4NzEwOCwgMHgwODBjLCAweDI4N2MsIDB4MTkwNCwgMHg4MzQzLCAweDA4MGMsCisJMHg2NjM4LCAweDE5MDQsIDB4ODM0MywgMHhiZTEyLCAweGJkMTYsIDB4NzExMCwgMHhkMWJjLCAweDA1NDAsCisJMHg3MDJjLCAweGQwODQsIDB4MTEyMCwgMHhiODAwLCAweGQwYmMsIDB4MTkwNCwgMHg4MzQzLCAweDA4MGMsCisJMHg2YTBjLCAweDAxNDgsIDB4OTA4NiwgMHgwMDA0LCAweDAxMzAsIDB4MDgwYywgMHg2YTE0LCAweDAxMTgsCisJMHg5MDg2LCAweDAwMDQsIDB4MTU4OCwgMHgwMGM2LCAweDA4MGMsIDB4ODM2MywgMHgwMGNlLCAweDA1ZDgsCisJMHgwODBjLCAweGFlZWQsIDB4MmIwOCwgMHgwNWI4LCAweDYxMTIsIDB4MDgwYywgMHhkMTAyLCAweDYwMjMsCisJMHgwMDAyLCAweDcxMjAsIDB4NjEwYSwgMHgyMDA5LCAweDAwODgsIDB4MDgwYywgMHhhZmJlLCAweDA0NTgsCisJMHgwODBjLCAweDZhMGMsIDB4MDE0OCwgMHg5MDg2LCAweDAwMDQsIDB4MDEzMCwgMHgwODBjLCAweDZhMTQsCisJMHgwMTE4LCAweDkwODYsIDB4MDAwNCwgMHgxMTgwLCAweDA4MGMsIDB4YWVlZCwgMHgyYjA4LCAweDAxZDgsCisJMHg2MTEyLCAweDA4MGMsIDB4ZDEwMiwgMHg2MDIzLCAweDAwMDUsIDB4NzEyMCwgMHg2MTBhLCAweDIwMDksCisJMHgwMDg4LCAweDA4MGMsIDB4YWZiZSwgMHgwMDc4LCAweDA4MGMsIDB4YWVlZCwgMHgyYjA4LCAweDAxNTgsCisJMHg2MTEyLCAweDA4MGMsIDB4ZDEwMiwgMHg2MDIzLCAweDAwMDQsIDB4NzEyMCwgMHg2MTBhLCAweDIwMDksCisJMHgwMDAxLCAweDA4MGMsIDB4YWZiZSwgMHgwMGJlLCAweDAwMDUsIDB4NzExMCwgMHhkMWJjLCAweDAxNTgsCisJMHgwMGQxLCAweDAxNDgsIDB4MDgwYywgMHg4MmJiLCAweDExMzAsIDB4NzEyNCwgMHg2MTBhLCAweDIwMDksCisJMHgwMDg5LCAweDA4MGMsIDB4YWZiZSwgMHgwMDA1LCAweDcxMTAsIDB4ZDFiYywgMHgwMTU4LCAweDAwNTksCisJMHgwMTQ4LCAweDA4MGMsIDB4ODJiYiwgMHgxMTMwLCAweDcxMjQsIDB4NjEwYSwgMHgyMDA5LCAweDAwOGEsCisJMHgwODBjLCAweGFmYmUsIDB4MDAwNSwgMHg3MDIwLCAweDIwNjAsIDB4OWM4NCwgMHgwMDA3LCAweDExNTgsCisJMHg5YzgyLCAweDFjZDAsIDB4MDI0MCwgMHgyMDAxLCAweDE4MWEsIDB4MjAwNCwgMHg5YzAyLCAweDEyMTgsCisJMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHg5MDA2LCAweDBjZTgsIDB4MDBiNiwgMHg3MTEwLCAweGQxYmMsCisJMHgxMWQ4LCAweDcwMjQsIDB4MjA2MCwgMHg5Yzg0LCAweDAwMDcsIDB4MTFiMCwgMHg5YzgyLCAweDFjZDAsCisJMHgwMjk4LCAweDY4NjgsIDB4OWMwMiwgMHgxMjgwLCAweDcwMDgsIDB4OTA4NCwgMHgwMGZmLCAweDYxMTAsCisJMHgyMTU4LCAweGI5MTAsIDB4OTEwNiwgMHgxMTQwLCAweDcwMGMsIDB4YjkxNCwgMHg5MTA2LCAweDExMjAsCisJMHgyMDA5LCAweDAwNTEsIDB4MDgwYywgMHhhZmJlLCAweDc4MTcsIDB4MDE0MCwgMHgyMDAxLCAweDE5ZWYsCisJMHgyMDA0LCAweDkwMDUsIDB4MDkwYywgMHg5NzYzLCAweDAwYmUsIDB4MDAwNSwgMHgyMDMxLCAweDAxMDUsCisJMHgwMDY5LCAweDAwMDUsIDB4MjAzMSwgMHgwMjA2LCAweDAwNDksIDB4MDAwNSwgMHgyMDMxLCAweDAyMDcsCisJMHgwMDI5LCAweDAwMDUsIDB4MjAzMSwgMHgwMjEzLCAweDAwMDksIDB4MDAwNSwgMHgwMGM2LCAweDAwOTYsCisJMHgwMGY2LCAweDcwMDAsIDB4OTA4NCwgMHhmMDAwLCAweDkwODYsIDB4YzAwMCwgMHgwNWQwLCAweDA4MGMsCisJMHhhZWVkLCAweDA1YjgsIDB4MDA2NiwgMHgwMGM2LCAweDAwNDYsIDB4MjAxMSwgMHgwMjYzLCAweDIyMDQsCisJMHg4MjExLCAweDIyMGMsIDB4MDgwYywgMHgyODdjLCAweDE1YTAsIDB4MDgwYywgMHg2NjM4LCAweDE1ODgsCisJMHhiZTEyLCAweGJkMTYsIDB4MmIwMCwgMHgwMDRlLCAweDAwY2UsIDB4NjAxMiwgMHgwODBjLCAweGQxMDIsCisJMHgwODBjLCAweDBmZmYsIDB4MDUxMCwgMHgyOTAwLCAweDYwNWEsIDB4OTAwNiwgMHhhODAyLCAweGE4NjYsCisJMHhhYzZhLCAweGE4NWMsIDB4OTBmOCwgMHgwMDFiLCAweDIwYTksIDB4MDAwZSwgMHhhODYwLCAweDIwZTgsCisJMHgyMGUxLCAweDAwMDAsIDB4MmZhMCwgMHgyZTk4LCAweDQwMDMsIDB4MDA2ZSwgMHg2NjE2LCAweDYwMDcsCisJMHgwMDNlLCAweDYwMjMsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg5MWY5LCAweDA4MGMsCisJMHg5NzYzLCAweDAwZmUsIDB4MDA5ZSwgMHgwMGNlLCAweDAwMDUsIDB4MDgwYywgMHhhZjQzLCAweDAwNmUsCisJMHgwY2MwLCAweDAwNGUsIDB4MDBjZSwgMHgwY2M4LCAweDAwYzYsIDB4NzAwMCwgMHg5MDhjLCAweGZmMDAsCisJMHg5MTg0LCAweGYwMDAsIDB4ODEwZiwgMHg5MDg2LCAweDIwMDAsIDB4MTkwNCwgMHg4NDUzLCAweDkxODYsCisJMHgwMDIyLCAweDE1ZjAsIDB4MjAwMSwgMHgwMTExLCAweDIwMDQsIDB4OTAwNSwgMHgxOTA0LCAweDg0NTUsCisJMHg3MDMwLCAweDkwOGUsIDB4MDQwMCwgMHgwOTA0LCAweDg0NTUsIDB4OTA4ZSwgMHg2MDAwLCAweDA1ZTgsCisJMHg5MDhlLCAweDU0MDAsIDB4MDVkMCwgMHg5MDhlLCAweDAzMDAsIDB4MTFkOCwgMHgyMDA5LCAweDE4MzcsCisJMHgyMTBjLCAweGQxOGMsIDB4MTU5MCwgMHhkMWE0LCAweDE1ODAsIDB4MDgwYywgMHg2OWNhLCAweDA1ODgsCisJMHg2OGIwLCAweDkwODQsIDB4MDBmZiwgMHg3MTAwLCAweDkxOGMsIDB4MDBmZiwgMHg5MTA2LCAweDE1MTgsCisJMHg2ODgwLCAweDY5YjAsIDB4OTE4YywgMHhmZjAwLCAweDkxMDUsIDB4NzEwNCwgMHg5MTA2LCAweDExZDgsCisJMHgwMGUwLCAweDIwMDksIDB4MDEwMywgMHgyMTBjLCAweGQxYjQsIDB4MTFhOCwgMHg5MDhlLCAweDUyMDAsCisJMHgwOWU4LCAweDkwOGUsIDB4MDUwMCwgMHgwOWQwLCAweDkwOGUsIDB4NTAwMCwgMHgwOWI4LCAweDAwNTgsCisJMHg5MTg2LCAweDAwMjMsIDB4MTE0MCwgMHgwODBjLCAweDgzNjMsIDB4MDEyOCwgMHg2MDA0LCAweDkwODYsCisJMHgwMDAyLCAweDAxMTgsIDB4MDAwMCwgMHg5MDA2LCAweDAwMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwY2UsCisJMHgwMDA1LCAweDcwMzAsIDB4OTA4ZSwgMHgwMzAwLCAweDAxMTgsIDB4OTA4ZSwgMHg1MjAwLCAweDFkOTgsCisJMHgyMDAxLCAweDE4MzcsIDB4MjAwNCwgMHg5MDg0LCAweDAwMDksIDB4OTA4NiwgMHgwMDA4LCAweDBkNjgsCisJMHgwYzUwLCAweDAxNTYsIDB4MDA0NiwgMHgwMDE2LCAweDAwMzYsIDB4NzAzOCwgMHgyMDIwLCAweDg0MjcsCisJMHg5NGE0LCAweDAwMDcsIDB4ZDQ4NCwgMHgwMTQ4LCAweDIwYTksIDB4MDAwNCwgMHgyMDE5LCAweDE4MDUsCisJMHgyMDExLCAweDAyN2EsIDB4MDgwYywgMHhiZWZkLCAweDExNzgsIDB4ZDQ4YywgMHgwMTQ4LCAweDIwYTksCisJMHgwMDA0LCAweDIwMTksIDB4MTgwMSwgMHgyMDExLCAweDAyN2UsIDB4MDgwYywgMHhiZWZkLCAweDExMjAsCisJMHhkNDk0LCAweDAxMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwM2UsIDB4MDAxZSwgMHgwMDRlLCAweDAxNWUsCisJMHgwMDA1LCAweDAxNTYsIDB4MDA0NiwgMHgwMDE2LCAweDAwMzYsIDB4NzAzOCwgMHgyMDIwLCAweDg0MjcsCisJMHg5NGE0LCAweDAwMDcsIDB4ZDQ4NCwgMHgwMTQ4LCAweDIwYTksIDB4MDAwNCwgMHgyMDE5LCAweDE4MDUsCisJMHgyMDExLCAweDAyNzIsIDB4MDgwYywgMHhiZWZkLCAweDExNzgsIDB4ZDQ4YywgMHgwMTQ4LCAweDIwYTksCisJMHgwMDA0LCAweDIwMTksIDB4MTgwMSwgMHgyMDExLCAweDAyNzYsIDB4MDgwYywgMHhiZWZkLCAweDExMjAsCisJMHhkNDk0LCAweDAxMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwM2UsIDB4MDAxZSwgMHgwMDRlLCAweDAxNWUsCisJMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMjAwLCAweDc4MDAsIDB4YzBlNSwgMHhjMGNjLCAweDc4MDIsCisJMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDE4MDAsIDB4NzgzNCwgMHhkMDg0LCAweDExMzAsCisJMHgyMDc5LCAweDAyMDAsIDB4NzgwMCwgMHg5MDg1LCAweDEyMDAsIDB4NzgwMiwgMHgwMGZlLCAweDAwMDUsCisJMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwgMHg3MDM0LCAweGMwODQsIDB4NzAzNiwgMHgwMGVlLCAweDAwMDUsCisJMHgwMDE2LCAweDIwMDEsIDB4MTgzNywgMHgyMDBjLCAweDkxODQsIDB4MDA4MCwgMHgwMTE4LCAweGQxOGMsCisJMHgwMTE4LCAweDkwMDYsIDB4MDAxZSwgMHgwMDA1LCAweDkwODUsIDB4MDAwMSwgMHgwY2Q4LCAweDIwNzEsCisJMHgxOWY5LCAweDcwMDMsIDB4MDAwMywgMHg3MDBmLCAweDAzNjEsIDB4OTAwNiwgMHg3MDFhLCAweDcwNzIsCisJMHg3MDEyLCAweDcwMTcsIDB4MWNkMCwgMHg3MDA3LCAweDAwMDAsIDB4NzAyNiwgMHg3MDJiLCAweGEzNmMsCisJMHg3MDMyLCAweDcwMzcsIDB4YTNkNCwgMHg3MDNmLCAweGZmZmYsIDB4NzA0MiwgMHg3MDQ3LCAweDU1ZWYsCisJMHg3MDRhLCAweDcwNWIsIDB4ODY1MSwgMHgwODBjLCAweDEwMTgsIDB4MDkwYywgMHgwZGQ1LCAweDI5MDAsCisJMHg3MDNhLCAweGE4NjcsIDB4MDAwMywgMHhhODZmLCAweDAxMDAsIDB4YThhYiwgMHhkY2IwLCAweDAwMDUsCisJMHgyMDcxLCAweDE5ZjksIDB4MWQwNCwgMHg4NTlmLCAweDIwOTEsIDB4NjAwMCwgMHg3MDBjLCAweDgwMDEsCisJMHg3MDBlLCAweDE1MzAsIDB4MjAwMSwgMHgwMTNjLCAweDIwMDQsIDB4OTAwNSwgMHgxOTBjLCAweDg2OTYsCisJMHgyMDAxLCAweDE4NjksIDB4MjAwNCwgMHhkMGM0LCAweDAxNTgsIDB4M2EwMCwgMHhkMDhjLCAweDExNDAsCisJMHgyMGQxLCAweDAwMDAsIDB4MjBkMSwgMHgwMDAxLCAweDIwZDEsIDB4MDAwMCwgMHgwODBjLCAweDBkZDUsCisJMHg3MDBmLCAweDAzNjEsIDB4NzAwNywgMHgwMDAxLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwNDAsCisJMHg5MDBkLCAweDAxNDgsIDB4ODEwOSwgMHg3MTQyLCAweDExMzAsIDB4NzA0NCwgMHgwODBmLCAweDAwMTgsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDI0LCAweDkwMGQsIDB4MDE4OCwgMHg3MDIwLCAweDgwMDEsCisJMHg3MDIyLCAweDExNjgsIDB4NzAyMywgMHgwMDA5LCAweDgxMDksIDB4NzEyNiwgMHg5MTg2LCAweDAzZTgsCisJMHgxMTEwLCAweDcwMjgsIDB4MDgwZiwgMHg4MWZmLCAweDExMTAsIDB4NzAyOCwgMHgwODBmLCAweDcwMzAsCisJMHg5MDBkLCAweDAxODAsIDB4NzAyYywgMHg4MDAxLCAweDcwMmUsIDB4MTE2MCwgMHg3MDJmLCAweDAwMDksCisJMHg4MTA5LCAweDcxMzIsIDB4MDEyOCwgMHg5MTg0LCAweDAwN2YsIDB4MDkwYywgMHhhNTBlLCAweDAwMTAsCisJMHg3MDM0LCAweDA4MGYsIDB4NzAzYywgMHg5MDA1LCAweDAxMTgsIDB4MDMxMCwgMHg4MDAxLCAweDcwM2UsCisJMHg3MDRjLCAweDkwMGQsIDB4MDE2OCwgMHg3MDQ4LCAweDgwMDEsIDB4NzA0YSwgMHgxMTQ4LCAweDcwNGIsCisJMHgwMDA5LCAweDgxMDksIDB4NzE0ZSwgMHgxMTIwLCAweDcxNTAsIDB4NzE0ZSwgMHg3MDU4LCAweDA4MGYsCisJMHg3MDE4LCAweDkwMGQsIDB4MDFkOCwgMHgwMDE2LCAweDcwNzAsIDB4OTAwZCwgMHgwMTU4LCAweDcwNmMsCisJMHg4MDAxLCAweDcwNmUsIDB4MTEzOCwgMHg3MDZmLCAweDAwMDksIDB4ODEwOSwgMHg3MTcyLCAweDExMTAsCisJMHg3MDc0LCAweDA4MGYsIDB4MDAxZSwgMHg3MDA4LCAweDgwMDEsIDB4NzAwYSwgMHgxMTM4LCAweDcwMGIsCisJMHgwMDA5LCAweDgxMDksIDB4NzExYSwgMHgxMTEwLCAweDcwMWMsIDB4MDgwZiwgMHgwMTJlLCAweDcwMDQsCisJMHgwMDAyLCAweDg1YzcsIDB4ODVjOCwgMHg4NWU0LCAweDAwZTYsIDB4MjA3MSwgMHgxOWY5LCAweDcwMTgsCisJMHg5MDA1LCAweDExMjAsIDB4NzExYSwgMHg3MjFlLCAweDcwMGIsIDB4MDAwOSwgMHgwMGVlLCAweDAwMDUsCisJMHgwMGU2LCAweDAwMDYsIDB4MjA3MSwgMHgxOWY5LCAweDcwMWMsIDB4OTIwNiwgMHgxMTIwLCAweDcwMWEsCisJMHg3MDFlLCAweDcwNzIsIDB4NzA3NiwgMHgwMDBlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsCisJMHgxOWY5LCAweGI4ODgsIDB4OTEwMiwgMHgwMjA4LCAweGI5OGEsIDB4MDBlZSwgMHgwMDA1LCAweDAwMDUsCisJMHgwMGI2LCAweDcxMTAsIDB4MDgwYywgMHg2Njk5LCAweDExNjgsIDB4Yjg4OCwgMHg4MDAxLCAweDAyNTAsCisJMHhiODhhLCAweDExNDAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDAxNiwgMHgwODBjLCAweDk3NjMsCisJMHgwMDFlLCAweDAxMmUsIDB4ODEwOCwgMHg5MTgyLCAweDA4MDAsIDB4MDIxOCwgMHg5MDBlLCAweDcwMDcsCisJMHgwMDAyLCAweDcxMTIsIDB4MDBiZSwgMHgwMDA1LCAweDcwMTQsIDB4MjA2MCwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDYwNDAsIDB4OTAwNSwgMHgwMTI4LCAweDgwMDEsIDB4NjA0MiwgMHgxMTEwLCAweDA4MGMsCisJMHhjZjkzLCAweDYwMTgsIDB4OTAwNSwgMHgwNTU4LCAweDgwMDEsIDB4NjAxYSwgMHgxNTQwLCAweDYxMjAsCisJMHg5MTg2LCAweDAwMDMsIDB4MDE0OCwgMHg5MTg2LCAweDAwMDYsIDB4MDEzMCwgMHg5MTg2LCAweDAwMDksCisJMHgxMWUwLCAweDYxMWMsIDB4ZDFjNCwgMHgxMTAwLCAweDA4MGMsIDB4Y2M4NiwgMHgwMWIwLCAweDYwMTQsCisJMHgyMDQ4LCAweGE4ODQsIDB4OTA4YSwgMHgxOTlhLCAweDAyODAsIDB4OTA4MiwgMHgxOTk5LCAweGE4ODYsCisJMHg5MDhhLCAweDE5OWEsIDB4MDIxMCwgMHgyMDAxLCAweDE5OTksIDB4ODAwMywgMHg4MDBiLCAweDgxMGIsCisJMHg5MTA4LCAweDYxMWEsIDB4YTg3YywgMHhkMGU0LCAweDAxMTAsIDB4MDgwYywgMHhjOTcyLCAweDAxMmUsCisJMHg5Yzg4LCAweDAwMTgsIDB4NzExNiwgMHgyMDAxLCAweDE4MWEsIDB4MjAwNCwgMHg5MTAyLCAweDAyMjAsCisJMHg3MDE3LCAweDFjZDAsIDB4NzAwNywgMHgwMDAwLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE5ZjksCisJMHg3MDI3LCAweDA3ZDAsIDB4NzAyMywgMHgwMDA5LCAweDAwZWUsIDB4MDAwNSwgMHgyMDAxLCAweDFhMDIsCisJMHgyMDAzLCAweDAwMDAsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTlmOSwgMHg3MTMyLCAweDcwMmYsCisJMHgwMDA5LCAweDAwZWUsIDB4MDAwNSwgMHgyMDExLCAweDFhMDUsIDB4MjAxMywgMHgwMDAwLCAweDAwMDUsCisJMHgwMGU2LCAweDIwNzEsIDB4MTlmOSwgMHg3MTFhLCAweDcyMWUsIDB4NzAwYiwgMHgwMDA5LCAweDAwZWUsCisJMHgwMDA1LCAweDAwODYsIDB4MDAyNiwgMHg3MDU0LCAweDgwMDAsIDB4NzA1NiwgMHgyMDAxLCAweDFhMDcsCisJMHgyMDQ0LCAweGEwNmMsIDB4OTA4NiwgMHgwMDAwLCAweDAxNTAsIDB4NzA2OCwgMHhhMDlhLCAweDcwNjQsCisJMHhhMDk2LCAweDcwNjAsIDB4YTA5MiwgMHg3MDVjLCAweGEwOGUsIDB4MDgwYywgMHgxMGU5LCAweDAwMmUsCisJMHgwMDhlLCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDAwOTYsIDB4MDBhNiwgMHgwMGI2LCAweDAwYzYsCisJMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgwMTU2LCAweDA4MGMsIDB4ODUxMCwgMHgwMTVlLCAweDAwZmUsCisJMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMGJlLCAweDAwYWUsIDB4MDA5ZSwgMHgwMDFlLCAweDAwMGUsCisJMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgxOWY5LCAweDcxNzIsIDB4NzI3NiwgMHg3MDZmLCAweDAwMDksCisJMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgwMDA2LCAweDIwNzEsIDB4MTlmOSwgMHg3MDc0LCAweDkyMDYsCisJMHgxMTEwLCAweDcwNzIsIDB4NzA3NiwgMHgwMDBlLCAweDAwZWUsIDB4MDAwNSwgMHgwMDE2LCAweDAwYzYsCisJMHgyMDA5LCAweGZmZjQsIDB4MjEwZCwgMHgyMDYxLCAweDAxMDAsIDB4NjBmMCwgMHg5MTAwLCAweDYwZjMsCisJMHgwMDAwLCAweDIwMDksIDB4ZmZmNCwgMHgyMDBmLCAweDEyMjAsIDB4ODEwOCwgMHgyMTA1LCAweDgwMDAsCisJMHgyMDBmLCAweDAwY2UsIDB4MDAxZSwgMHgwMDA1LCAweDAwYzYsIDB4MjA2MSwgMHgxYTcwLCAweDAwY2UsCisJMHgwMDA1LCAweDkxODQsIDB4MDAwZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHg5MDgwLCAweDFhNzAsCisJMHgyMDYwLCAweDAwMDUsIDB4YTg4NCwgMHg5MDhhLCAweDE5OWEsIDB4MTYzOCwgMHg5MDA1LCAweDExNTAsCisJMHgwMGM2LCAweDIwNjEsIDB4MWE3MCwgMHg2MDE0LCAweDAwY2UsIDB4OTAwNSwgMHgxMTMwLCAweDIwMDEsCisJMHgwMDFlLCAweDAwMTgsIDB4OTA4ZSwgMHhmZmZmLCAweDAxYjAsIDB4ODAwMywgMHg4MDBiLCAweDgxMGIsCisJMHg5MTA4LCAweDYxMWEsIDB4YTg3YywgMHg5MDhjLCAweDAwYzAsIDB4OTE4ZSwgMHgwMGMwLCAweDA5MDQsCisJMHg4NzQ0LCAweGQwYjQsIDB4MTE2OCwgMHhkMGJjLCAweDE5MDQsIDB4ODcxZCwgMHgyMDA5LCAweDAwMDYsCisJMHgwODBjLCAweDg3NzEsIDB4MDAwNSwgMHg5MDBlLCAweDBjNjAsIDB4MjAwMSwgMHgxOTk5LCAweDA4YjAsCisJMHhkMGZjLCAweDAxNjAsIDB4OTA4YywgMHgwMDAzLCAweDAxMjAsIDB4OTE4ZSwgMHgwMDAzLCAweDE5MDQsCisJMHg4NzZiLCAweDkwOGMsIDB4MjAyMCwgMHg5MThlLCAweDIwMjAsIDB4MDFhOCwgMHg2MDI0LCAweGQwZDQsCisJMHgxMWU4LCAweDIwMDksIDB4MTg2OSwgMHgyMTA0LCAweGQwODQsIDB4MTEzOCwgMHg4N2ZmLCAweDExMjAsCisJMHgyMDA5LCAweDAwNDMsIDB4MDgwNCwgMHhhZmJlLCAweDAwMDUsIDB4ODdmZiwgMHgxZGU4LCAweDIwMDksCisJMHgwMDQyLCAweDA4MDQsIDB4YWZiZSwgMHg2MTEwLCAweDAwYjYsIDB4MjE1OCwgMHhiOTAwLCAweDAwYmUsCisJMHhkMWFjLCAweDBkMjAsIDB4NjAyNCwgMHhjMGNkLCAweDYwMjYsIDB4MGMwMCwgMHhjMGQ0LCAweDYwMjYsCisJMHhhODkwLCAweDYwMmUsIDB4YTg4YywgMHg2MDMyLCAweDA4ZTAsIDB4ZDBmYywgMHgwMTYwLCAweDkwOGMsCisJMHgwMDAzLCAweDAxMjAsIDB4OTE4ZSwgMHgwMDAzLCAweDE5MDQsIDB4ODc2YiwgMHg5MDhjLCAweDIwMjAsCisJMHg5MThlLCAweDIwMjAsIDB4MDE3MCwgMHgwMDc2LCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweDE3NTQsCisJMHgwMGZlLCAweDAwN2UsIDB4ODdmZiwgMHgxMTIwLCAweDIwMDksIDB4MDA0MiwgMHgwODBjLCAweGFmYmUsCisJMHgwMDA1LCAweDYxMTAsIDB4MDBiNiwgMHgyMTU4LCAweGI5MDAsIDB4MDBiZSwgMHhkMWFjLCAweDBkNTgsCisJMHg2MTI0LCAweGMxY2QsIDB4NjEyNiwgMHgwYzM4LCAweGQwZmMsIDB4MDE4OCwgMHg5MDhjLCAweDIwMjAsCisJMHg5MThlLCAweDIwMjAsIDB4MDFhOCwgMHg5MDg0LCAweDAwMDMsIDB4OTA4ZSwgMHgwMDAyLCAweDAxNDgsCisJMHg4N2ZmLCAweDExMjAsIDB4MjAwOSwgMHgwMDQxLCAweDA4MGMsIDB4YWZiZSwgMHgwMDA1LCAweDAwYjksCisJMHgwY2U4LCAweDg3ZmYsIDB4MWRkOCwgMHgyMDA5LCAweDAwNDMsIDB4MDgwYywgMHhhZmJlLCAweDBjYjAsCisJMHg2MTEwLCAweDAwYjYsIDB4MjE1OCwgMHhiOTAwLCAweDAwYmUsIDB4ZDFhYywgMHgwZDIwLCAweDYxMjQsCisJMHhjMWNkLCAweDYxMjYsIDB4MGMwMCwgMHgyMDA5LCAweDAwMDQsIDB4MDAxOSwgMHgwMDA1LCAweDIwMDksCisJMHgwMDAxLCAweDAwOTYsIDB4MDgwYywgMHhjYzg2LCAweDA1MTgsIDB4NjAxNCwgMHgyMDQ4LCAweGE5ODIsCisJMHhhODAwLCAweDYwMTYsIDB4OTE4NiwgMHgwMDAxLCAweDExODgsIDB4YTk3YywgMHg5MThjLCAweDgxMDAsCisJMHg5MThlLCAweDgxMDAsIDB4MTE1OCwgMHgwMGM2LCAweDIwNjEsIDB4MWE3MCwgMHg2MjAwLCAweGQyOGMsCisJMHgxMTIwLCAweDYyMDQsIDB4ODIxMCwgMHgwMjA4LCAweDYyMDYsIDB4MDBjZSwgMHgwODBjLCAweDZiNTIsCisJMHg2MDE0LCAweDkwNGQsIDB4MDA3NiwgMHgyMDM5LCAweDAwMDAsIDB4MTkwYywgMHg4NmJhLCAweDAwN2UsCisJMHgwMDllLCAweDAwMDUsIDB4MDE1NiwgMHgwMGM2LCAweDIwNjEsIDB4MWE3MCwgMHg2MDAwLCAweDgxZmYsCisJMHgwMTEwLCAweDkyMDUsIDB4MDAwOCwgMHg5MjA0LCAweDYwMDIsIDB4MDBjZSwgMHgwMTVlLCAweDAwMDUsCisJMHg2ODAwLCAweGQwOGMsIDB4MTEzOCwgMHg2ODA4LCAweDkwMDUsIDB4MDEyMCwgMHg4MDAxLCAweDY4MGEsCisJMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgyMDcxLCAweDE5MjMsIDB4NzAwMywgMHgwMDA2LCAweDcwMDcsCisJMHgwMDAwLCAweDcwMGYsIDB4MDAwMCwgMHg3MDEzLCAweDAwMDEsIDB4MDgwYywgMHgxMDE4LCAweDA5MGMsCisJMHgwZGQ1LCAweGE4NjcsIDB4MDAwNiwgMHhhODZiLCAweDAwMDEsIDB4YThhYiwgMHhkY2IwLCAweGE4OWYsCisJMHgwMDAwLCAweDI5MDAsIDB4NzAyZSwgMHg3MDMzLCAweDAwMDAsIDB4MDAwNSwgMHgwMDk2LCAweDAwZTYsCisJMHgyMDcxLCAweDE5MjMsIDB4NzAyYywgMHgyMDQ4LCAweDZhMmMsIDB4NzIxZSwgMHg2YjMwLCAweDczMjIsCisJMHg2ODM0LCAweDcwMjYsIDB4YTg5NiwgMHg2ODM4LCAweDcwMmEsIDB4YTg5YSwgMHg2ODI0LCAweDcwMTYsCisJMHg2ODNjLCAweDcwMWEsIDB4MjAwOSwgMHgwMDI4LCAweDIwMGEsIDB4OTAwNSwgMHgwMTQ4LCAweDkwMGUsCisJMHg5MTg4LCAweDAwMGMsIDB4ODAwMSwgMHgxZGUwLCAweDIxMDAsIDB4OTIxMCwgMHgxMjA4LCAweDgzMTgsCisJMHhhYThlLCAweGFiOTIsIDB4NzAxMCwgMHhkMDg0LCAweDAxNjgsIDB4YzA4NCwgMHg3MDA3LCAweDAwMDEsCisJMHg3MDBmLCAweDAwMDAsIDB4MDAwNiwgMHgyMDA5LCAweDFhY2EsIDB4MjEwNCwgMHg5MDgyLCAweDAwMDcsCisJMHgyMDBhLCAweDAwMGUsIDB4YzA5NSwgMHg3MDEyLCAweDIwMDgsIDB4MjAwMSwgMHgwMDNiLCAweDA4MGMsCisJMHgxNWZkLCAweDkwMDYsIDB4MjA3MSwgMHgxOTNjLCAweDcwMDIsIDB4NzAwNiwgMHg3MDJhLCAweDAwZWUsCisJMHgwMDllLCAweDAwMDUsIDB4MjAwOSwgMHgxYWNhLCAweDIxMDQsIDB4OTA4MCwgMHgwMDA3LCAweDIwMGEsCisJMHgwMDA1LCAweDAwZTYsIDB4MDEyNiwgMHgwMTU2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDE4MDAsCisJMHg3MTU0LCAweDIwMDEsIDB4MDAwOCwgMHg5MTBhLCAweDA2MzgsIDB4MjAwMSwgMHgxODdkLCAweDIwYWMsCisJMHg5MDA2LCAweDkwODAsIDB4MDAwOCwgMHgxZjA0LCAweDg4MjksIDB4NzFjMCwgMHg5MTAyLCAweDAyZTAsCisJMHgyMDcxLCAweDE4NzcsIDB4MjBhOSwgMHgwMDA3LCAweDAwYzYsIDB4MDgwYywgMHhhZWVkLCAweDYwMjMsCisJMHgwMDA5LCAweDYwMDMsIDB4MDAwNCwgMHg2MDFmLCAweDAxMDEsIDB4MDA4OSwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDA4MGMsIDB4ODlhNywgMHgwMTJlLCAweDFmMDQsIDB4ODgzNSwgMHg5MDA2LCAweDAwY2UsCisJMHgwMTVlLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweDkwODUsIDB4MDAwMSwgMHgwY2M4LCAweDAwZTYsCisJMHgwMGI2LCAweDAwOTYsIDB4MDA4NiwgMHgwMDU2LCAweDAwNDYsIDB4MDAyNiwgMHg3MTE4LCAweDcyMGMsCisJMHg3NjIwLCAweDcwMDQsIDB4ZDA4NCwgMHgxMTI4LCAweDIwMjEsIDB4MDAyNCwgMHgyMDI5LCAweDAwMDIsCisJMHgwMDIwLCAweDIwMjEsIDB4MDAyYywgMHgyMDI5LCAweDAwMGEsIDB4MDgwYywgMHgwZmZmLCAweDA5MGMsCisJMHgwZGQ1LCAweDI5MDAsIDB4NjAxNiwgMHgyMDU4LCAweGFjNjYsIDB4OTAwNiwgMHhhODAyLCAweGE4MDYsCisJMHhhODZhLCAweGE4N2EsIDB4YThhYSwgMHhhODg3LCAweDAwMDUsIDB4YTg3ZiwgMHgwMDIwLCAweDcwMDgsCisJMHhhODlhLCAweDcwMTAsIDB4YTg5ZSwgMHhhZThhLCAweGE4YWYsIDB4ZmZmZiwgMHhhOGIzLCAweDAwMDAsCisJMHg4MTA5LCAweDAxNjAsIDB4MDgwYywgMHgwZmZmLCAweDA5MGMsIDB4MGRkNSwgMHhhZDY2LCAweDJiMDAsCisJMHhhODAyLCAweDI5MDAsIDB4YjgwNiwgMHgyMDU4LCAweDgxMDksIDB4MWRhMCwgMHgwMDJlLCAweDAwNGUsCisJMHgwMDVlLCAweDAwOGUsIDB4MDA5ZSwgMHgwMGJlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDc5LCAweDAwMDAsCisJMHgyMDcxLCAweDE5MjMsIDB4NzAwNCwgMHgwMDRiLCAweDcwMGMsIDB4MDAwMiwgMHg4OGExLCAweDg4OWEsCisJMHg4ODlhLCAweDAwMDUsIDB4ODhhYiwgMHg4OTAxLCAweDg5MDEsIDB4ODkwMSwgMHg4OTAyLCAweDg5MTMsCisJMHg4OTEzLCAweDcwMGMsIDB4MGNiYSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3OGEwLCAweDc5YTAsCisJMHg5MTA2LCAweDE5MDQsIDB4ODhmMywgMHg3ODE0LCAweGQwYmMsIDB4MTkwNCwgMHg4OGZjLCAweDAxMmUsCisJMHg3MDE4LCAweDkxMGEsIDB4MTEyOCwgMHg3MDMwLCAweDkwMDUsIDB4MTkwNCwgMHg4OTQ1LCAweDAwMDUsCisJMHgxMjEwLCAweDcxMTQsIDB4OTEwYSwgMHg5MTkyLCAweDAwMGEsIDB4MDIxMCwgMHgyMDA5LCAweDAwMGEsCisJMHgyMDAxLCAweDE4ODgsIDB4MjAxNCwgMHgyMDAxLCAweDE5MzUsIDB4MjAwNCwgMHg5MTAwLCAweDkyMDIsCisJMHgwZTUwLCAweDA4MGMsIDB4OGE5YiwgMHgyMjAwLCAweDkxMDIsIDB4MDIwOCwgMHgyMjA4LCAweDAwOTYsCisJMHg3MDJjLCAweDIwNDgsIDB4YTg3MywgMHgwMDAxLCAweGE5NzYsIDB4MDgwYywgMHg4YmE0LCAweDIxMDAsCisJMHhhODdlLCAweGE4NmYsIDB4MDAwMCwgMHgwMDllLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDksCisJMHgxYTE3LCAweDIxMDQsIDB4YzA4NSwgMHgyMDBhLCAweDcwMGYsIDB4MDAwMiwgMHgwMTJlLCAweDA4MGMsCisJMHgxMTA4LCAweDFkZTgsIDB4MDAwNSwgMHg3OGEwLCAweDc5YTAsIDB4OTEwNiwgMHgwOTA0LCAweDg4YjMsCisJMHgwODBjLCAweDhhNzMsIDB4MDEyZSwgMHgwMDA1LCAweDc4MTAsIDB4YzBjNSwgMHg3ODEyLCAweDA4MDQsCisJMHg4OGIzLCAweDAwMDUsIDB4NzAwYywgMHgwMDAyLCAweDg5MDcsIDB4ODkwYSwgMHg4OTA5LCAweDA4MGMsCisJMHg4OGE5LCAweDAwMDUsIDB4ODAwMSwgMHg3MDBlLCAweDAwOTYsIDB4NzAyYywgMHgyMDQ4LCAweGE5NzQsCisJMHgwMDllLCAweDAwMTEsIDB4MGNhMCwgMHgwMDA1LCAweDAwOTYsIDB4NzAyYywgMHgyMDQ4LCAweDcwMTgsCisJMHg5MTAwLCAweDcyMTQsIDB4OTIxYSwgMHgxMTMwLCAweDcwMWMsIDB4YTg4ZSwgMHg3MDIwLCAweGE4OTIsCisJMHg5MDA2LCAweDAwNjgsIDB4MDAwNiwgMHgwODBjLCAweDhiYTQsIDB4MjEwMCwgMHhhYThjLCAweDkyMTAsCisJMHhhYThlLCAweDEyMjAsIDB4YTg5MCwgMHg5MDgxLCAweDAwMDAsIDB4YTg5MiwgMHgwMDBlLCAweDAwOWUsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3OGEyLCAweDcwMWEsIDB4MDgwYywgMHg4YTczLCAweDAxMmUsCisJMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgxOTIzLCAweDcwMGMsIDB4MDAwMiwgMHg4OTQzLCAweDg5NDMsCisJMHg4OTQxLCAweDcwMGYsIDB4MDAwMSwgMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHg3MDMwLCAweDkwMDUsIDB4MDUwOCwgMHgyMDc4LCAweDc4MTQsIDB4MjA0OCwgMHhhZTg4LCAweDAwYjYsCisJMHgyMDU5LCAweDAwMDAsIDB4MDgwYywgMHg4OWIwLCAweDAwYmUsIDB4MDFiMCwgMHgwMGU2LCAweDIwNzEsCisJMHgxOTNjLCAweDA4MGMsIDB4ODlmNywgMHgwMGVlLCAweDAxNzgsIDB4MDA5NiwgMHgwODBjLCAweDEwMTgsCisJMHgyOTAwLCAweDAwOWUsIDB4MDE0OCwgMHhhOGFhLCAweDA0YjksIDB4MDA0MSwgMHgyMDAxLCAweDE5NDYsCisJMHgyMDAzLCAweDAwMDAsIDB4MDEyZSwgMHgwOGM4LCAweDAxMmUsIDB4MDAwNSwgMHgwMGQ2LCAweDAwYzYsCisJMHgwMDg2LCAweDAwYTYsIDB4Mjk0MCwgMHgyNjUwLCAweDI2MDAsIDB4OTAwNSwgMHgwMTgwLCAweGE4NjQsCisJMHg5MDg0LCAweDAwMGYsIDB4MjA2OCwgMHg5ZDg4LCAweDIwY2UsIDB4MjE2NSwgMHgwMDU2LCAweDIwMjksCisJMHgwMDAwLCAweDA4MGMsIDB4OGIyOSwgMHgwODBjLCAweDIwODYsIDB4MWRkOCwgMHgwMDVlLCAweDAwYWUsCisJMHgyMDAxLCAweDE4N2YsIDB4MjAwNCwgMHhhODhhLCAweDA4MGMsIDB4MTc1NCwgMHg3ODFmLCAweDAxMDEsCisJMHg3ODEzLCAweDAwMDAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg4YTA2LCAweDAxMmUsCisJMHgwMDhlLCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweDcwMzAsIDB4OTAwNSwgMHgwMTM4LCAweDIwNzgsCisJMHg3ODBjLCAweDcwMzIsIDB4MjAwMSwgMHgxOTQ2LCAweDIwMDMsIDB4MDAwMSwgMHgwMDA1LCAweDAwZTYsCisJMHgyMDcxLCAweDE5MjMsIDB4NzAzMCwgMHg2MDBlLCAweDJjMDAsIDB4NzAzMiwgMHgwMGVlLCAweDAwMDUsCisJMHgwMGQ2LCAweDAwYzYsIDB4MDAyNiwgMHg5YjgwLCAweDhjNzIsIDB4MjAwNSwgMHg5MDZkLCAweDA5MGMsCisJMHgwZGQ1LCAweDliODAsIDB4OGM2YSwgMHgyMDA1LCAweDkwNjUsIDB4MDkwYywgMHgwZGQ1LCAweDYxMTQsCisJMHgyNjAwLCAweDkxMDIsIDB4MDI0OCwgMHg2ODI4LCAweDkxMDIsIDB4MDJmMCwgMHg5MDg1LCAweDAwMDEsCisJMHgwMDJlLCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweDY4MDQsIDB4ZDA5NCwgMHgwMTQ4LCAweDY4NTQsCisJMHhkMDg0LCAweDExNzgsIDB4YzA4NSwgMHg2ODU2LCAweDIwMTEsIDB4ODAyNiwgMHgwODBjLCAweDRiN2YsCisJMHg2ODRjLCAweDAwOTYsIDB4OTA0ZCwgMHgwOTBjLCAweDBkZDUsIDB4YTgwNCwgMHg4MDAwLCAweGE4MDYsCisJMHgwMDllLCAweDkwMDYsIDB4MjAzMCwgMHgwYzIwLCAweDY4NTQsIDB4ZDA4YywgMHgxZDA4LCAweGMwOGQsCisJMHg2ODU2LCAweDIwMTEsIDB4ODAyNSwgMHgwODBjLCAweDRiN2YsIDB4Njg0YywgMHgwMDk2LCAweDkwNGQsCisJMHgwOTBjLCAweDBkZDUsIDB4YTgwMCwgMHg4MDAwLCAweGE4MDIsIDB4MDA5ZSwgMHgwODg4LCAweDcwMDAsCisJMHgyMDE5LCAweDAwMDgsIDB4ODMxOSwgMHg3MTA0LCAweDkxMDIsIDB4MTExOCwgMHgyMzAwLCAweDkwMDUsCisJMHgwMDIwLCAweDAyMTAsIDB4OTMwMiwgMHgwMDA4LCAweDgwMDIsIDB4MDAwNSwgMHgwMGQ2LCAweDc4MTQsCisJMHg5MDA1LCAweDA5MGMsIDB4MGRkNSwgMHg3ODFjLCAweDkwODQsIDB4MDEwMSwgMHg5MDg2LCAweDAxMDEsCisJMHgxOTBjLCAweDBkZDUsIDB4NzgyNywgMHgwMDAwLCAweDIwNjksIDB4MTkzYywgMHg2ODA0LCAweDkwODAsCisJMHgxOTNlLCAweDJmMDgsIDB4MjEwMiwgMHg2OTA0LCAweDgxMDgsIDB4OTE4MiwgMHgwMDA4LCAweDAyMDgsCisJMHg5MDBlLCAweDY5MDYsIDB4OTE4MCwgMHgxOTNlLCAweDIwMDMsIDB4MDAwMCwgMHgwMGRlLCAweDAwMDUsCisJMHgwMDk2LCAweDAwYzYsIDB4MjA2MCwgMHg2MDE0LCAweDIwNDgsIDB4YThhOCwgMHgwMDk2LCAweDIwNDgsCisJMHg5MDA1LCAweDE5MGMsIDB4MTAzMSwgMHgwMDllLCAweGE4YWIsIDB4MDAwMCwgMHgwODBjLCAweDBmYjEsCisJMHgwODBjLCAweGFmNDMsIDB4MDBjZSwgMHgwMDllLCAweDAwMDUsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDksCisJMHgxMTI4LCAweDYwMWMsIDB4ZDBjNCwgMHgwMTEwLCAweDkwMDYsIDB4MDAwNSwgMHg5MDg1LCAweDAwMDEsCisJMHgwMDA1LCAweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDAxNzgsIDB4NjAxMCwgMHg5MDA1LCAweDAxNTAsCisJMHgwMGI2LCAweDIwNTgsIDB4MDgwYywgMHg4ZGE3LCAweDAwYmUsIDB4NjAxMywgMHgwMDAwLCAweDYwMWIsCisJMHgwMDAwLCAweDAwMTAsIDB4MmMwMCwgMHgwODYxLCAweDAwMDUsIDB4MjAwOSwgMHgxOTI3LCAweDIxMGMsCisJMHhkMTk0LCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE5MjMsIDB4NzExMCwgMHhjMTk0LCAweGQxOWMsCisJMHgxMTE4LCAweGMxODUsIDB4NzAwNywgMHgwMDAwLCAweDcxMTIsIDB4MjAwMSwgMHgwMDNiLCAweDA4MGMsCisJMHgxNWZkLCAweDAwZWUsIDB4MDAwNSwgMHg3ODE0LCAweGQwYmMsIDB4MTEwOCwgMHgwMDA1LCAweDc4MTAsCisJMHhjMGM1LCAweDc4MTIsIDB4MGNjMCwgMHgwMDk2LCAweDAwZDYsIDB4OTAwNiwgMHg3MDA2LCAweDcwMGUsCisJMHg3MDFhLCAweDcwMWUsIDB4NzAyMiwgMHg3MDE2LCAweDcwMmEsIDB4NzAyNiwgMHg3MDJmLCAweDAwMDAsCisJMHgwODBjLCAweDhiZjIsIDB4MDE3MCwgMHgwODBjLCAweDhjMjcsIDB4MDE1OCwgMHgyOTAwLCAweDcwMDIsCisJMHg3MDBhLCAweDcwMWEsIDB4NzAxMywgMHgwMDAxLCAweDcwMWYsIDB4MDAwYSwgMHgwMGRlLCAweDAwOWUsCisJMHgwMDA1LCAweDkwMGUsIDB4MGNkOCwgMHgwMGU2LCAweDAwOTYsIDB4MDA4NiwgMHgwMGQ2LCAweDAwYzYsCisJMHgyMDcxLCAweDE5MzAsIDB4NzIxYywgMHgyMTAwLCAweDkyMDIsIDB4MTYxOCwgMHgwODBjLCAweDhjMjcsCisJMHgwOTBjLCAweDBkZDUsIDB4NzAxOCwgMHg5MDA1LCAweDExNjAsIDB4MjkwMCwgMHg3MDAyLCAweDcwMGEsCisJMHg3MDFhLCAweDkwMDYsIDB4NzAwNiwgMHg3MDBlLCAweGE4MDYsIDB4YTgwMiwgMHg3MDEyLCAweDcwMWUsCisJMHgwMDM4LCAweDIwNDAsIDB4YTgwNiwgMHgyOTAwLCAweGEwMDIsIDB4NzAxYSwgMHhhODAzLCAweDAwMDAsCisJMHg3MDEwLCAweDgwMDAsIDB4NzAxMiwgMHg3MDFjLCAweDkwODAsIDB4MDAwYSwgMHg3MDFlLCAweDcyMWMsCisJMHgwOGQwLCAweDcyMWMsIDB4MDBjZSwgMHgwMGRlLCAweDAwOGUsIDB4MDA5ZSwgMHgwMGVlLCAweDAwMDUsCisJMHgwMDk2LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LCAweDAwZTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDcxLCAweDE5MzAsIDB4NzMwMCwgMHg4MzFmLCAweDgzMWUsIDB4ODMxZSwgMHg5Mzg0LCAweDAwM2YsCisJMHgyMGU4LCAweDkzOWMsIDB4ZmZjMCwgMHg5Mzk4LCAweDAwMDMsIDB4NzEwNCwgMHgwODBjLCAweDhiYTQsCisJMHg4MTBjLCAweDIxMDAsIDB4OTMxOCwgMHg4MDAzLCAweDIyMjgsIDB4MjAyMSwgMHgwMDc4LCAweDk0MDIsCisJMHg5NTMyLCAweDAyMDgsIDB4MjAyOCwgMHgyNTAwLCAweDgwMDQsIDB4MjBhOCwgMHgyM2EwLCAweGEwMDEsCisJMHhhMDAxLCAweDQwMDUsIDB4MjUwOCwgMHgwODBjLCAweDhiYWQsIDB4MjEzMCwgMHg3MDE0LCAweDk2MDAsCisJMHg3MDE2LCAweDI2MDAsIDB4NzExYywgMHg5MTAyLCAweDcwMWUsIDB4NzAwNCwgMHg5NjAwLCAweDIwMDgsCisJMHg5MDgyLCAweDAwMGEsIDB4MTE5MCwgMHg3MDAwLCAweDIwNDgsIDB4YTgwMCwgMHg5MDA1LCAweDExNDgsCisJMHgyMDA5LCAweDAwMDEsIDB4MDAyNiwgMHgwODBjLCAweDhhOWIsIDB4MDAyZSwgMHg3MDAwLCAweDIwNDgsCisJMHhhODAwLCAweDcwMDIsIDB4NzAwNywgMHgwMDAwLCAweDAwMDgsIDB4NzEwNiwgMHgyNTAwLCAweDkyMTIsCisJMHgxOTA0LCAweDhhZGEsIDB4MDEyZSwgMHgwMGVlLCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLCAweDAwOWUsCisJMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDk1ODAsCisJMHg4YzZhLCAweDIwMDUsIDB4OTA3NSwgMHgwOTBjLCAweDBkZDUsIDB4MDgwYywgMHg4YjdmLCAweDAxMmUsCisJMHg5NTgwLCAweDhjNjYsIDB4MjAwNSwgMHg5MDc1LCAweDA5MGMsIDB4MGRkNSwgMHgwMTU2LCAweDAxMzYsCisJMHgwMWM2LCAweDAxNDYsIDB4MDFkNiwgMHg4MzFmLCAweDgzMWUsIDB4ODMxZSwgMHg5Mzg0LCAweDAwM2YsCisJMHgyMGUwLCAweDkzODQsIDB4ZmZjMCwgMHg5MTAwLCAweDIwOTgsIDB4YTg2MCwgMHgyMGU4LCAweGE5NWMsCisJMHgyYzA1LCAweDkxMDAsIDB4MjBhMCwgMHgyMGE5LCAweDAwMDIsIDB4NDAwMywgMHgyZTBjLCAweDJkMDAsCisJMHgwMDAyLCAweDhiNjksIDB4OGI2OSwgMHg4YjZiLCAweDhiNjksIDB4OGI2YiwgMHg4YjY5LCAweDhiNjksCisJMHg4YjY5LCAweDhiNjksIDB4OGI2OSwgMHg4YjcxLCAweDhiNjksIDB4OGI3MSwgMHg4YjY5LCAweDhiNjksCisJMHg4YjY5LCAweDA4MGMsIDB4MGRkNSwgMHg0MTA0LCAweDIwYTksIDB4MDAwMiwgMHg0MDAyLCAweDQwMDMsCisJMHgwMDI4LCAweDIwYTksIDB4MDAwMiwgMHg0MDAzLCAweDQxMDQsIDB4NDAwMywgMHgwMWRlLCAweDAxNGUsCisJMHgwMWNlLCAweDAxM2UsIDB4MDE1ZSwgMHgwMGVlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwOTYsCisJMHg3MDE0LCAweDgwMDEsIDB4NzAxNiwgMHg3MTBjLCAweDIxMTAsIDB4MDBmMSwgMHg4MTBjLCAweDkxODgsCisJMHgwMDAzLCAweDczMDgsIDB4ODIxMCwgMHg5MjgyLCAweDAwMGEsIDB4MTE5OCwgMHg3MDA4LCAweDIwNDgsCisJMHhhODAwLCAweDkwMDUsIDB4MDE1OCwgMHgwMDA2LCAweDA4MGMsIDB4OGMzNiwgMHgwMDllLCAweGE4MDcsCisJMHgwMDAwLCAweDI5MDAsIDB4NzAwYSwgMHg3MDEwLCAweDgwMDEsIDB4NzAxMiwgMHg3MDBmLCAweDAwMDAsCisJMHgwMDA4LCAweDcyMGUsIDB4MDA5ZSwgMHgwMDA1LCAweDAwMDYsIDB4ODEwYiwgMHg4MTBiLCAweDIxMDAsCisJMHg4MTBiLCAweDkxMDAsIDB4MjAwOCwgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwgMHgwMDI2LCAweDIxMDAsCisJMHg5MDA1LCAweDAxNTgsIDB4OTA5MiwgMHgwMDBjLCAweDAyNDAsIDB4OTAwZSwgMHg4MTA4LCAweDkwODIsCisJMHgwMDBjLCAweDFkZTAsIDB4MDAyZSwgMHgwMDBlLCAweDAwMDUsIDB4OTAwZSwgMHgwY2Q4LCAweDJkMDAsCisJMHg5MGI4LCAweDAwMDgsIDB4MjAzMSwgMHg4YmYwLCAweDkwMWUsIDB4NjgwOCwgMHg5MDA1LCAweDAxMDgsCisJMHg4MzE4LCAweDY5MGMsIDB4OTEwYSwgMHgwMjQ4LCAweDAxNDAsIDB4ODMxOCwgMHg2ODEwLCAweDkxMTIsCisJMHgwMjIwLCAweDAxMTgsIDB4ODMxOCwgMHgyMjA4LCAweDBjZDAsIDB4MjMzYSwgMHg2ODA0LCAweGQwODQsCisJMHgyMzAwLCAweDIwMjEsIDB4MDAwMSwgMHgxMTUwLCAweDkwODIsIDB4MDAwMywgMHgwOTY3LCAweDBhNjcsCisJMHg4NDIwLCAweDkwODIsIDB4MDAwNywgMHgwOTY3LCAweDBhNjcsIDB4MGNkMCwgMHg5MDgyLCAweDAwMDIsCisJMHgwOTY3LCAweDBhNjcsIDB4ODQyMCwgMHg5MDgyLCAweDAwMDUsIDB4MDk2NywgMHgwYTY3LCAweDBjZDAsCisJMHg2YzFhLCAweDAwMDUsIDB4MDA5NiwgMHgwMDQ2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDJiMDAsCisJMHg5MDgwLCAweDhjNmUsIDB4MjAwNSwgMHg5MDA1LCAweDA5MGMsIDB4MGRkNSwgMHgyMDA0LCAweDkwYTAsCisJMHgwMDBhLCAweDA4MGMsIDB4MTAxOCwgMHgwMWQwLCAweDI5MDAsIDB4NzAyNiwgMHhhODAzLCAweDAwMDAsCisJMHhhODA3LCAweDAwMDAsIDB4MDgwYywgMHgxMDE4LCAweDAxODgsIDB4NzAyNCwgMHhhODAyLCAweGE4MDcsCisJMHgwMDAwLCAweDI5MDAsIDB4NzAyNiwgMHg5NGEyLCAweDAwMGEsIDB4MDExMCwgMHgwMjA4LCAweDBjOTAsCisJMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMDRlLCAweDAwOWUsIDB4MDAwNSwgMHg3MDI0LCAweDkwMDUsCisJMHgwZGM4LCAweDIwNDgsIDB4YWMwMCwgMHgwODBjLCAweDEwMzEsIDB4MjQwMCwgMHgwY2MwLCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4NzAyNCwgMHgyMDQ4LCAweDkwMDUsIDB4MDEzMCwgMHhhODAwLCAweDcwMjYsCisJMHhhODAzLCAweDAwMDAsIDB4YTgwNywgMHgwMDAwLCAweDAxMmUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDcwMjQsIDB4YTgwMiwgMHgyOTAwLCAweDcwMjYsIDB4MDEyZSwgMHgwMDA1LCAweDAwOTYsCisJMHg5ZTgwLCAweDAwMDksIDB4MjAwNCwgMHg5MDA1LCAweDAxMzgsIDB4MjA0OCwgMHhhODAwLCAweDAwMDYsCisJMHgwODBjLCAweDEwMzEsIDB4MDAwZSwgMHgwY2I4LCAweDAwOWUsIDB4MDAwNSwgMHgwMDk2LCAweDcwMDgsCisJMHg5MDA1LCAweDAxMzgsIDB4MjA0OCwgMHhhODAwLCAweDAwMDYsIDB4MDgwYywgMHgxMDMxLCAweDAwMGUsCisJMHgwY2I4LCAweDkwMDYsIDB4NzAwMiwgMHg3MDBhLCAweDcwMDYsIDB4NzAwZSwgMHg3MDFhLCAweDcwMWUsCisJMHg3MDIyLCAweDcwMmEsIDB4NzAyNiwgMHg3MDJlLCAweDAwOWUsIDB4MDAwNSwgMHgxYTYzLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MTkzMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgxODg4LCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MTg3NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMGU2LCAweDAwYzYsCisJMHgwMGI2LCAweDAwYTYsIDB4YThhOCwgMHgyMDQwLCAweDIwNzEsIDB4MTg3NywgMHgwODBjLCAweDhkOTIsCisJMHhhMDY3LCAweDAwMjMsIDB4NjAxMCwgMHg5MDVkLCAweDA5MDQsIDB4OGQ2NywgMHhiODE0LCAweGEwNmUsCisJMHhiOTEwLCAweGExNzIsIDB4YjlhMCwgMHhhMTc2LCAweDIwMDEsIDB4MDAwMywgMHhhMDdlLCAweGE4MzQsCisJMHhhMDgyLCAweGEwN2IsIDB4MDAwMCwgMHhhODk4LCAweDkwMDUsIDB4MDExOCwgMHhhMDc4LCAweGMwODUsCisJMHhhMDdhLCAweDI4NTgsIDB4MjAzMSwgMHgwMDE4LCAweGEwNjgsIDB4OTA4YSwgMHgwMDE5LCAweDFhMGMsCisJMHgwZGQ1LCAweDIwMjAsIDB4MjA1MCwgMHgyOTQwLCAweGE4NjQsIDB4OTBiYywgMHgwMGZmLCAweDkwOGMsCisJMHgwMDBmLCAweDkxZTAsIDB4MjBjZSwgMHgyYzY1LCAweDk3ODYsIDB4MDAyNCwgMHgyYzA1LCAweDE1OTAsCisJMHg5MDhhLCAweDAwMzYsIDB4MWEwYywgMHgwZGQ1LCAweDkwODIsIDB4MDAxYiwgMHgwMDAyLCAweDhjZDIsCisJMHg4Y2QyLCAweDhjZDQsIDB4OGNkMiwgMHg4Y2QyLCAweDhjZDIsIDB4OGNkNiwgMHg4Y2QyLCAweDhjZDIsCisJMHg4Y2QyLCAweDhjZDgsIDB4OGNkMiwgMHg4Y2QyLCAweDhjZDIsIDB4OGNkYSwgMHg4Y2QyLCAweDhjZDIsCisJMHg4Y2QyLCAweDhjZGMsIDB4OGNkMiwgMHg4Y2QyLCAweDhjZDIsIDB4OGNkZSwgMHg4Y2QyLCAweDhjZDIsCisJMHg4Y2QyLCAweDhjZTAsIDB4MDgwYywgMHgwZGQ1LCAweGExODAsIDB4MDRiOCwgMHhhMTkwLCAweDA0YTgsCisJMHhhMWEwLCAweDA0OTgsIDB4YTFiMCwgMHgwNDg4LCAweGExYzAsIDB4MDQ3OCwgMHhhMWQwLCAweDA0NjgsCisJMHhhMWUwLCAweDA0NTgsIDB4OTA4YSwgMHgwMDM0LCAweDFhMGMsIDB4MGRkNSwgMHg5MDgyLCAweDAwMWIsCisJMHgwMDAyLCAweDhkMDQsIDB4OGQwMiwgMHg4ZDAyLCAweDhkMDIsIDB4OGQwMiwgMHg4ZDAyLCAweDhkMDYsCisJMHg4ZDAyLCAweDhkMDIsIDB4OGQwMiwgMHg4ZDAyLCAweDhkMDIsIDB4OGQwOCwgMHg4ZDAyLCAweDhkMDIsCisJMHg4ZDAyLCAweDhkMDIsIDB4OGQwMiwgMHg4ZDBhLCAweDhkMDIsIDB4OGQwMiwgMHg4ZDAyLCAweDhkMDIsCisJMHg4ZDAyLCAweDhkMGMsIDB4MDgwYywgMHgwZGQ1LCAweGExODAsIDB4MDAzOCwgMHhhMTk4LCAweDAwMjgsCisJMHhhMWIwLCAweDAwMTgsIDB4YTFjOCwgMHgwMDA4LCAweGExZTAsIDB4MjYwMCwgMHgwMDAyLCAweDhkMjgsCisJMHg4ZDJhLCAweDhkMmMsIDB4OGQyZSwgMHg4ZDMwLCAweDhkMzIsIDB4OGQzNCwgMHg4ZDM2LCAweDhkMzgsCisJMHg4ZDNhLCAweDhkM2MsIDB4OGQzZSwgMHg4ZDQwLCAweDhkNDIsIDB4OGQ0NCwgMHg4ZDQ2LCAweDhkNDgsCisJMHg4ZDRhLCAweDhkNGMsIDB4OGQ0ZSwgMHg4ZDUwLCAweDhkNTIsIDB4OGQ1NCwgMHg4ZDU2LCAweDhkNTgsCisJMHgwODBjLCAweDBkZDUsIDB4YjllMiwgMHgwNDY4LCAweGI5ZGUsIDB4MDQ1OCwgMHhiOWRhLCAweDA0NDgsCisJMHhiOWQ2LCAweDA0MzgsIDB4YjlkMiwgMHgwNDI4LCAweGI5Y2UsIDB4MDQxOCwgMHhiOWNhLCAweDA0MDgsCisJMHhiOWM2LCAweDAwZjgsIDB4YjljMiwgMHgwMGU4LCAweGI5YmUsIDB4MDBkOCwgMHhiOWJhLCAweDAwYzgsCisJMHhiOWI2LCAweDAwYjgsIDB4YjliMiwgMHgwMGE4LCAweGI5YWUsIDB4MDA5OCwgMHhiOWFhLCAweDAwODgsCisJMHhiOWE2LCAweDAwNzgsIDB4YjlhMiwgMHgwMDY4LCAweGI5OWUsIDB4MDA1OCwgMHhiOTlhLCAweDAwNDgsCisJMHhiOTk2LCAweDAwMzgsIDB4Yjk5MiwgMHgwMDI4LCAweGI5OGUsIDB4MDAxOCwgMHhiOThhLCAweDAwMDgsCisJMHhiOTg2LCAweDg2MzEsIDB4ODQyMSwgMHgwMTMwLCAweDA4MGMsIDB4MjA4NiwgMHgwOTBjLCAweDBkZDUsCisJMHgwODA0LCAweDhjYWMsIDB4MDBhZSwgMHgwMGJlLCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LCAweGE4NmMsCisJMHhhMDZlLCAweGE4NzAsIDB4YTA3MiwgMHhhMDc3LCAweDAwZmYsIDB4OTAwNiwgMHgwODA0LCAweDhjOGUsCisJMHgwMDA2LCAweDAwMTYsIDB4MDBiNiwgMHg2MDEwLCAweDIwNTgsIDB4YjgxMCwgMHg5MDA1LCAweDAxYjAsCisJMHgyMDAxLCAweDE5MjQsIDB4MjAwNCwgMHg5MDA1LCAweDAxODgsIDB4MjAwMSwgMHgxODAwLCAweDIwMDQsCisJMHg5MDg2LCAweDAwMDMsIDB4MTE1OCwgMHgwMDM2LCAweDAwNDYsIDB4YmJhMCwgMHgyMDIxLCAweDAwMDQsCisJMHgyMDExLCAweDgwMTQsIDB4MDgwYywgMHg0YjdmLCAweDAwNGUsIDB4MDAzZSwgMHgwMGJlLCAweDAwMWUsCisJMHgwMDBlLCAweDAwMDUsIDB4OTAxNiwgMHg3MTBjLCAweGE4MzQsIDB4OTEwYSwgMHhhOTM2LCAweDcwMDgsCisJMHg5MDA1LCAweDAxMjAsIDB4ODIxMCwgMHg5MTBhLCAweDAyMzgsIDB4MDEzMCwgMHg3MDEwLCAweDgyMTAsCisJMHg5MTBhLCAweDAyMTAsIDB4MDEwOCwgMHgwY2Q4LCAweGFhOGEsIDB4YTI2YSwgMHgwMDA1LCAweDAwZjYsCisJMHgwMGQ2LCAweDAwMzYsIDB4MjA3OSwgMHgwMzAwLCAweDc4MWIsIDB4MDIwMCwgMHg3ODE4LCAweGQwOTQsCisJMHgxZGQ4LCAweDc4MWIsIDB4MDIwMiwgMHhhMDAxLCAweGEwMDEsIDB4NzgxOCwgMHhkMDk0LCAweDFkYTAsCisJMHhiOGFjLCAweDkwMDUsIDB4MDFiOCwgMHgyMDY4LCAweDIwNzksIDB4MDAwMCwgMHgyYzA4LCAweDkxMWUsCisJMHgxMTE4LCAweDY4MGMsIDB4YjhhZSwgMHgwMDYwLCAweDkxMDYsIDB4MDE0MCwgMHgyZDAwLCAweDIwNzgsCisJMHg2ODBjLCAweDkwMDUsIDB4MDkwYywgMHgwZGQ1LCAweDIwNjgsIDB4MGNiMCwgMHg2YjBjLCAweDdiMGUsCisJMHg2MDBmLCAweDAwMDAsIDB4MjA3OSwgMHgwMzAwLCAweDc4MWIsIDB4MDIwMCwgMHgwMDNlLCAweDAwZGUsCisJMHgwMGZlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGQ2LCAweDAwOTYsIDB4MDBjNiwgMHgwMDM2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDE1NiwgMHgyMGE5LCAweDAxZmYsIDB4MjA3MSwgMHgwMzAwLCAweDcwMWIsCisJMHgwMjAwLCAweDcwMTgsIDB4ZDA5NCwgMHgwMTEwLCAweDFmMDQsIDB4OGRlNywgMHg3MDFiLCAweDAyMDIsCisJMHhhMDAxLCAweGEwMDEsIDB4NzAxOCwgMHhkMDk0LCAweDFkOTAsIDB4YjhhYywgMHg5MDA1LCAweDAxZTgsCisJMHgyMDYwLCAweDYwMGMsIDB4YjhhZSwgMHg2MDI0LCAweGMwOGQsIDB4NjAyNiwgMHg2MDAzLCAweDAwMDQsCisJMHg2MDFiLCAweDAwMDAsIDB4NjAxMywgMHgwMDAwLCAweDYwMWYsIDB4MDEwMSwgMHg2MDE0LCAweDIwNDgsCisJMHhhODhiLCAweDAwMDAsIDB4YThhOCwgMHhhOGFiLCAweDAwMDAsIDB4OTA0ZCwgMHgwOTBjLCAweDBkZDUsCisJMHgwODBjLCAweDEwMzEsIDB4MDgwYywgMHg4OWE3LCAweDBjMDAsIDB4MjA3MSwgMHgwMzAwLCAweDcwMWIsCisJMHgwMjAwLCAweDAxNWUsIDB4MDEyZSwgMHgwMDNlLCAweDAwY2UsIDB4MDA5ZSwgMHgwMGRlLCAweDAwZWUsCisJMHgwMDA1LCAweDAwYzYsIDB4MDBiNiwgMHgwMDE2LCAweDAwMDYsIDB4MDE1NiwgMHgwODBjLCAweDI4N2MsCisJMHgwMTVlLCAweDExYjAsIDB4MDgwYywgMHg2NjM4LCAweDE5MGMsIDB4MGRkNSwgMHgwMDBlLCAweDAwMWUsCisJMHhiOTEyLCAweGI4MTYsIDB4MDgwYywgMHhhZWVkLCAweDAxNDAsIDB4MmIwMCwgMHg2MDEyLCAweDYwMjMsCisJMHgwMDAxLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLCAweGFmYmUsIDB4MDBiZSwgMHgwMGNlLCAweDAwMDUsCisJMHgwMDBlLCAweDAwMWUsIDB4MGNkMCwgMHgwMDY2LCAweDYwMDAsIDB4OTBiMiwgMHgwMDE2LCAweDFhMGMsCisJMHgwZGQ1LCAweDAwMTMsIDB4MDA2ZSwgMHgwMDA1LCAweDhlNWMsIDB4OGU1YywgMHg4ZTVjLCAweDhlNWUsCisJMHg4ZWFmLCAweDhlNWMsIDB4OGU1YywgMHg4ZTVjLCAweDhmMTYsIDB4OGU1YywgMHg4ZjUzLCAweDhlNWMsCisJMHg4ZTVjLCAweDhlNWMsIDB4OGU1YywgMHg4ZTVjLCAweDA4MGMsIDB4MGRkNSwgMHg5MTgyLCAweDAwNDAsCisJMHgwMDAyLCAweDhlNzEsIDB4OGU3MSwgMHg4ZTcxLCAweDhlNzEsIDB4OGU3MSwgMHg4ZTcxLCAweDhlNzEsCisJMHg4ZTcxLCAweDhlNzEsIDB4OGU3MywgMHg4ZTg4LCAweDhlNzEsIDB4OGU3MSwgMHg4ZTcxLCAweDhlNzEsCisJMHg4ZTliLCAweDA4MGMsIDB4MGRkNSwgMHgwMDk2LCAweDA4MGMsIDB4OTcxMywgMHgwODBjLCAweDk4OTEsCisJMHg2MTE0LCAweDIxNDgsIDB4YTg3YiwgMHgwMDAwLCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4YmIsCisJMHgwNTAwLCAweDAwYmUsIDB4MDgwYywgMHg2YjFkLCAweDA4MGMsIDB4YWY0MywgMHgwMDllLCAweDAwMDUsCisJMHgwODBjLCAweDk3MTMsIDB4MDBkNiwgMHg2MTE0LCAweDA4MGMsIDB4Y2M4NiwgMHgwMTMwLCAweDAwOTYsCisJMHg2MTE0LCAweDIxNDgsIDB4MDgwYywgMHg2ZDE3LCAweDAwOWUsIDB4MDBkZSwgMHgwODBjLCAweGFmNDMsCisJMHgwODBjLCAweDk4OTEsIDB4MDAwNSwgMHgwODBjLCAweDk3MTMsIDB4MDgwYywgMHgzMjFlLCAweDYxMTQsCisJMHgwMDk2LCAweDIxNDgsIDB4MDgwYywgMHhjYzg2LCAweDAxMjAsIDB4YTg3YiwgMHgwMDI5LCAweDA4MGMsCisJMHg2ZDE3LCAweDAwOWUsIDB4MDgwYywgMHhhZjQzLCAweDA4MGMsIDB4OTg5MSwgMHgwMDA1LCAweDYwMWIsCisJMHgwMDAwLCAweDkxODIsIDB4MDA0MCwgMHgwMDk2LCAweDAwMDIsIDB4OGVjYSwgMHg4ZWNhLCAweDhlY2EsCisJMHg4ZWNhLCAweDhlY2EsIDB4OGVjYSwgMHg4ZWNhLCAweDhlY2EsIDB4OGVjYywgMHg4ZWNhLCAweDhlY2EsCisJMHg4ZWNhLCAweDhmMTIsIDB4OGVjYSwgMHg4ZWNhLCAweDhlY2EsIDB4OGVjYSwgMHg4ZWNhLCAweDhlY2EsCisJMHg4ZWQzLCAweDhlY2EsIDB4MDgwYywgMHgwZGQ1LCAweDYxMTQsIDB4MjE0OCwgMHhhOTM4LCAweDkxOGUsCisJMHhmZmZmLCAweDA5MDQsIDB4OGYxMiwgMHg2MDI0LCAweGQwOGMsIDB4MTVjMCwgMHgwMGU2LCAweDYxMTQsCisJMHgyMTQ4LCAweDA4MGMsIDB4OGM3NiwgMHgwMDk2LCAweGE4YTgsIDB4MjA0OCwgMHgwODBjLCAweDZhYjUsCisJMHgwMDllLCAweGE4YWIsIDB4MDAwMCwgMHg2MDEwLCAweDkwMDUsIDB4MDEyOCwgMHgwMGI2LCAweDIwNTgsCisJMHgwODBjLCAweDhkYTcsIDB4MDBiZSwgMHhhZTg4LCAweDAwYjYsIDB4MjA1OSwgMHgwMDAwLCAweDA4MGMsCisJMHg4OWIwLCAweDAwYmUsIDB4MDFlMCwgMHgyMDcxLCAweDE5M2MsIDB4MDgwYywgMHg4OWY3LCAweDAxYjgsCisJMHg5MDg2LCAweDAwMDEsIDB4MTEyOCwgMHgyMDAxLCAweDE5NDYsIDB4MjAwNCwgMHg5MDA1LCAweDExNzgsCisJMHgwMDk2LCAweDA4MGMsIDB4MGZmZiwgMHgyOTAwLCAweDAwOWUsIDB4MDE0OCwgMHhhOGFhLCAweDAwZjYsCisJMHgyYzc4LCAweDA4MGMsIDB4ODk2ZSwgMHgwMGZlLCAweDAwZWUsIDB4MDA5ZSwgMHgwMDA1LCAweDA4MGMsCisJMHg4OWE3LCAweDBjZDAsIDB4MDgwYywgMHg4ZmMwLCAweDAwOWUsIDB4MDAwNSwgMHg5MTgyLCAweDAwNDAsCisJMHgwMDk2LCAweDAwMDIsIDB4OGYyYSwgMHg4ZjJhLCAweDhmMmEsIDB4OGYyYywgMHg4ZjJhLCAweDhmMmEsCisJMHg4ZjJhLCAweDhmNTEsIDB4OGYyYSwgMHg4ZjJhLCAweDhmMmEsIDB4OGYyYSwgMHg4ZjJhLCAweDhmMmEsCisJMHg4ZjJhLCAweDhmMmEsIDB4MDgwYywgMHgwZGQ1LCAweDYwMDMsIDB4MDAwMywgMHg2MTA2LCAweDYwMTQsCisJMHgyMDQ4LCAweGE4YWMsIDB4YTg0NiwgMHhhOGIwLCAweGE4NGEsIDB4YTgzNywgMHgwMDAwLCAweGE4M2IsCisJMHgwMDAwLCAweGE4ODQsIDB4OTA5MiwgMHgxOTlhLCAweDAyMTAsIDB4MjAwMSwgMHgxOTk5LCAweDgwMDMsCisJMHg4MDEzLCAweDgyMTMsIDB4OTIxMCwgMHg2MjFhLCAweDJjMTAsIDB4MDgwYywgMHgxYmViLCAweDA4MGMsCisJMHg5MjE2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4OTg5MSwgMHgwMTJlLCAweDAwOWUsCisJMHgwMDA1LCAweDA4MGMsIDB4MGRkNSwgMHgwODBjLCAweDk3MTMsIDB4MDgwYywgMHg5ODkxLCAweDYxMTQsCisJMHgyMTQ4LCAweGE4N2IsIDB4MDAwMCwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiOGJiLCAweDA1MDAsCisJMHgwMGJlLCAweDA4MGMsIDB4NmQxNywgMHgwODBjLCAweGFmNDMsIDB4MDA5ZSwgMHgwMDA1LCAweDYwMDAsCisJMHg5MDhhLCAweDAwMTYsIDB4MWEwYywgMHgwZGQ1LCAweDAwOTYsIDB4MDAxMywgMHgwMDllLCAweDAwMDUsCisJMHg4ZjgwLCAweDhmODAsIDB4OGY4MCwgMHg4ZjgyLCAweDhmOTMsIDB4OGY4MCwgMHg4ZjgwLCAweDhmODAsCisJMHg4ZjgwLCAweDhmODAsIDB4OGY4MCwgMHg4ZjgwLCAweDhmODAsIDB4OGY4MCwgMHg4ZjgwLCAweDhmODAsCisJMHgwODBjLCAweDBkZDUsIDB4MDgwYywgMHhhODliLCAweDYxMTQsIDB4MjE0OCwgMHhhODdiLCAweDAwMDYsCisJMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiOGJiLCAweDA1MDAsIDB4MDBiZSwgMHgwODBjLCAweDZkMTcsCisJMHgwODBjLCAweGFmNDMsIDB4MDAwNSwgMHgwNDYxLCAweDAwMDUsIDB4NjAwMCwgMHg5MDhhLCAweDAwMTYsCisJMHgxYTBjLCAweDBkZDUsIDB4MDA5NiwgMHgwMDEzLCAweDAwOWUsIDB4MDAwNSwgMHg4ZmFlLCAweDhmYWUsCisJMHg4ZmFlLCAweDhmYjAsIDB4OGZjMCwgMHg4ZmFlLCAweDhmYWUsIDB4OGZhZSwgMHg4ZmFlLCAweDhmYWUsCisJMHg4ZmFlLCAweDhmYWUsIDB4OGZhZSwgMHg4ZmFlLCAweDhmYWUsIDB4OGZhZSwgMHgwODBjLCAweDBkZDUsCisJMHgwMDM2LCAweDAwZTYsIDB4MjA3MSwgMHgxOWU2LCAweDcwM2MsIDB4OWMwNiwgMHgxMTIwLCAweDIwMTksCisJMHgwMDAwLCAweDA4MGMsIDB4YTZhYywgMHgwODBjLCAweGE4OWIsIDB4MDBlZSwgMHgwMDNlLCAweDAwMDUsCisJMHg2MDI0LCAweGQwOGMsIDB4MTFmMCwgMHgwMGY2LCAweDAwZTYsIDB4NjAxYiwgMHgwMDAwLCAweDYwMTQsCisJMHgyMDQ4LCAweDYwMTAsIDB4OTAwNSwgMHgwMTI4LCAweDAwYjYsIDB4MjA1OCwgMHgwODBjLCAweDhkYTcsCisJMHgwMGJlLCAweDIwNzEsIDB4MTkzYywgMHgwODBjLCAweDg5ZjcsIDB4MDE2MCwgMHgyMDAxLCAweDE4N2YsCisJMHgyMDA0LCAweGE4OGEsIDB4MjAzMSwgMHgwMDAwLCAweDJjNzgsIDB4MDgwYywgMHg4OTZlLCAweDAwZWUsCisJMHgwMGZlLCAweDAwMDUsIDB4MDA5NiwgMHhhODhiLCAweDAwMDAsIDB4YThhOCwgMHgyMDQ4LCAweDA4MGMsCisJMHgxMDMxLCAweDAwOWUsIDB4YThhYiwgMHgwMDAwLCAweDA4MGMsIDB4ODlhNywgMHgwYzgwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgxODdhLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDAzNiwgMHgwMDQ2LCAweDIwYTksIDB4MDAxMCwgMHg5MDA2LCAweDgwMDQsCisJMHgyMDE5LCAweDAxMDAsIDB4MjMxYywgMHg5M2E2LCAweDAwMDgsIDB4MTExOCwgMHg4MDg2LCAweDgxOGUsCisJMHgwMDIwLCAweDgwZjYsIDB4M2UwMCwgMHg4MWY2LCAweDNlMDgsIDB4MTIwOCwgMHg5MjAwLCAweDFmMDQsCisJMHg5MDA4LCAweDkzYTYsIDB4MDAwOCwgMHgxMTE4LCAweDgwODYsIDB4ODE4ZSwgMHgwMDIwLCAweDgwZjYsCisJMHgzZTAwLCAweDgxZjYsIDB4M2UwOCwgMHgwMDRlLCAweDAwM2UsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDA3NiwgMHgwMTU2LCAweDIwYTksIDB4MDAxMCwgMHg5MDA1LCAweDA1MTAsCisJMHg5MTFhLCAweDE2MDAsIDB4ODIxMywgMHgyMDM5LCAweDAxMDAsIDB4MjczYywgMHg5N2JlLCAweDAwMDgsCisJMHgxMTEwLCAweDgxOGQsIDB4MDAxMCwgMHg4MWY1LCAweDNlMDgsIDB4MDIyOCwgMHg5MTFhLCAweDEyMjAsCisJMHgxZjA0LCAweDkwMzIsIDB4MDAyOCwgMHg5MTFhLCAweDIzMDgsIDB4ODIxMCwgMHgxZjA0LCAweDkwMzIsCisJMHgwMDA2LCAweDMyMDAsIDB4OTA4NCwgMHhlZmZmLCAweDIwODAsIDB4MDAwZSwgMHgwMTVlLCAweDAwN2UsCisJMHgwMTJlLCAweDAwMDUsIDB4MDAwNiwgMHgzMjAwLCAweDkwODUsIDB4MTAwMCwgMHgwY2E4LCAweDAxMjYsCisJMHgyMDkxLCAweDI4MDAsIDB4MjA3OSwgMHgxOWU2LCAweDAxMmUsIDB4MDBkNiwgMHgyMDY5LCAweDE5ZTYsCisJMHg2ODAzLCAweDAwMDUsIDB4MDE1NiwgMHgwMTQ2LCAweDAxZDYsIDB4MjBlOSwgMHgwMDAwLCAweDIwNjksCisJMHgwMjAwLCAweDA4MGMsIDB4YWJmZSwgMHgwNDAxLCAweDA4MGMsIDB4YWJlOSwgMHgwMGU5LCAweDA4MGMsCisJMHhhYmVjLCAweDAwZDEsIDB4MDgwYywgMHhhYmVmLCAweDAwYjksIDB4MDgwYywgMHhhYmYyLCAweDAwYTEsCisJMHgwODBjLCAweGFiZjUsIDB4MDA4OSwgMHgwODBjLCAweGFiZjgsIDB4MDA3MSwgMHgwODBjLCAweGFiZmIsCisJMHgwMDU5LCAweDAxZGUsIDB4MDE0ZSwgMHgwMTVlLCAweDIwNjksIDB4MDAwNCwgMHgyZDA0LCAweDkwODUsCisJMHg4MDAxLCAweDIwNmEsIDB4MDBkZSwgMHgwMDA1LCAweDIwYTksIDB4MDAyMCwgMHgyMGExLCAweDAyNDAsCisJMHgyMDAxLCAweDAwMDAsIDB4NDAwNCwgMHgwMDA1LCAweDAwYzYsIDB4NjAyNywgMHgwMDAxLCAweDc4MDQsCisJMHg5MDg0LCAweDAwMDcsIDB4MDAwMiwgMHg5MGE1LCAweDkwYzksIDB4OTEwYSwgMHg5MGFiLCAweDkwYzksCisJMHg5MGE1LCAweDkwYTMsIDB4OTBhMywgMHgwODBjLCAweDBkZDUsIDB4MDgwYywgMHg4NjM2LCAweDA4MGMsCisJMHg5NzYzLCAweDAwY2UsIDB4MDAwNSwgMHg2MmMwLCAweDgyZmYsIDB4MTExMCwgMHgwMGNlLCAweDAwMDUsCisJMHgyMDExLCAweDVmMTYsIDB4MDgwYywgMHg4NWIwLCAweDc4MjgsIDB4OTA5MiwgMHgwMGM4LCAweDEyMjgsCisJMHg4MDAwLCAweDc4MmEsIDB4MDgwYywgMHg1ZjU2LCAweDBjODgsIDB4NjJjMCwgMHgwODBjLCAweGFkM2EsCisJMHgwODBjLCAweDVmMTYsIDB4NzgwNywgMHgwMDAzLCAweDc4MjcsIDB4MDAwMCwgMHg3ODJiLCAweDAwMDAsCisJMHgwYzI4LCAweDA4MGMsIDB4ODYzNiwgMHg2MjIwLCAweGQyYTQsIDB4MDE3MCwgMHhkMmNjLCAweDAxNjAsCisJMHg3ODJiLCAweDAwMDAsIDB4NzgyNCwgMHg5MDY1LCAweDA5MGMsIDB4MGRkNSwgMHgyMDA5LCAweDAwMTMsCisJMHgwODBjLCAweGFmYmUsIDB4MDBjZSwgMHgwMDA1LCAweDAwYzYsIDB4NzgyNCwgMHg5MDY1LCAweDA5MGMsCisJMHgwZGQ1LCAweDc4MjgsIDB4OTA5MiwgMHhjMzUwLCAweDEyYzAsIDB4ODAwMCwgMHg3ODJhLCAweDAwY2UsCisJMHgwODBjLCAweDJiZTMsIDB4MDI3OCwgMHgwMGM2LCAweDc5MjQsIDB4MjE2MCwgMHg2MDEwLCAweDkwNmQsCisJMHgwOTBjLCAweDBkZDUsIDB4NzgwNywgMHgwMDAwLCAweDc4MjcsIDB4MDAwMCwgMHgwMGNlLCAweDA4MGMsCisJMHg5NzYzLCAweDBjMDAsIDB4MDgwYywgMHhhMzMyLCAweDA4ZTgsIDB4MjAxMSwgMHgwMTMwLCAweDIyMTQsCisJMHgwODBjLCAweGFkM2EsIDB4MDgwYywgMHhlYjhlLCAweDIwMDksIDB4MDAxNCwgMHgwODBjLCAweGFmYmUsCisJMHgwMGNlLCAweDA4ODAsIDB4MjAwMSwgMHgxYTAyLCAweDIwMDMsIDB4MDAwMCwgMHg2MmMwLCAweDgyZmYsCisJMHgxMTYwLCAweDc4MmIsIDB4MDAwMCwgMHg3ODI0LCAweDkwNjUsIDB4MDkwYywgMHgwZGQ1LCAweDIwMDksCisJMHgwMDEzLCAweDA4MGMsIDB4YjAxMCwgMHgwMGNlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGM2LCAweDAwZDYsCisJMHg3ODI0LCAweDkwMDUsIDB4MDkwYywgMHgwZGQ1LCAweDc4MjgsIDB4OTA5MiwgMHhjMzUwLCAweDE2NDgsCisJMHg4MDAwLCAweDc4MmEsIDB4MDBkZSwgMHgwMGNlLCAweDAwYmUsIDB4MDgwYywgMHgyYmUzLCAweDAyZjAsCisJMHgwMGI2LCAweDAwYzYsIDB4MDBkNiwgMHg3ODFjLCAweDkwNWQsIDB4MDkwYywgMHgwZGQ1LCAweGI4MDAsCisJMHhjMGRjLCAweGI4MDIsIDB4NzkyNCwgMHgyMTYwLCAweDA4MGMsIDB4YWY0MywgMHhiOTNjLCAweDgxZmYsCisJMHgwOTBjLCAweDBkZDUsIDB4ODEwOSwgMHhiOTNlLCAweDc4MDcsIDB4MDAwMCwgMHg3ODI3LCAweDAwMDAsCisJMHgwMGRlLCAweDAwY2UsIDB4MDBiZSwgMHgwODBjLCAweDk3NjMsIDB4MDg2OCwgMHgwODBjLCAweGEzMzIsCisJMHgwODUwLCAweDIwMTEsIDB4MDEzMCwgMHgyMjE0LCAweDA4MGMsIDB4YWQzYSwgMHgwODBjLCAweGViOGUsCisJMHg3ODI0LCAweDkwNjUsIDB4MjAwOSwgMHgwMDE0LCAweDA4MGMsIDB4YWZiZSwgMHgwMGRlLCAweDAwY2UsCisJMHgwMGJlLCAweDA4MDQsIDB4OTExYiwgMHgwMGM2LCAweDIwMDEsIDB4MDA5YiwgMHgyMDA0LCAweGQwZmMsCisJMHgxOTBjLCAweDFlZjIsIDB4NjAyNCwgMHg2MDI3LCAweDAwMDIsIDB4ZDBmNCwgMHgxNWI4LCAweDYyYzgsCisJMHg2MGM0LCAweDkyMDUsIDB4MTE3MCwgMHg3ODNjLCAweDkwNjUsIDB4MDEzMCwgMHgyMDA5LCAweDAwNDksCisJMHgwODBjLCAweGFmYmUsIDB4MDBjZSwgMHgwMDA1LCAweDIwMTEsIDB4MWEwNSwgMHgyMDEzLCAweDAwMDAsCisJMHgwY2M4LCAweDc5M2MsIDB4ODFmZiwgMHgwZGMwLCAweDc5NDQsIDB4OTE5MiwgMHg3NTMwLCAweDE2MjgsCisJMHg4MTA4LCAweDc5NDYsIDB4NzkzYywgMHg5MTg4LCAweDAwMDgsIDB4MjEwYywgMHg5MThlLCAweDAwMDYsCisJMHgxMTM4LCAweDYwMTQsIDB4OTA4NCwgMHgxOTg0LCAweDkwODUsIDB4MDAxMiwgMHg2MDE2LCAweDBjMTAsCisJMHg3OTNjLCAweDkxODgsIDB4MDAwOCwgMHgyMTBjLCAweDkxOGUsIDB4MDAwOSwgMHgwZDkwLCAweDYwMTQsCisJMHg5MDg0LCAweDE5ODQsIDB4OTA4NSwgMHgwMDE2LCAweDYwMTYsIDB4MDhhMCwgMHg3OTNjLCAweDIxNjAsCisJMHgyMDA5LCAweDAwNGEsIDB4MDgwYywgMHhhZmJlLCAweDA4NjgsIDB4Nzg0OCwgMHhjMDg1LCAweDc4NGEsCisJMHgwODQ4LCAweDAwMDYsIDB4MDAxNiwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYwMGYsCisJMHgwMDAwLCAweDJjMDgsIDB4MjA2MSwgMHgxOWU2LCAweDYwMjAsIDB4ODAwMCwgMHg2MDIyLCAweDYwMTAsCisJMHg5MDA1LCAweDAxNDgsIDB4OTA4MCwgMHgwMDAzLCAweDIxMDIsIDB4NjExMiwgMHgwMTJlLCAweDAwY2UsCisJMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHg2MTE2LCAweDYxMTIsIDB4MGNjMCwgMHgwMGQ2LCAweDIwNjksCisJMHgxOWU2LCAweGI4MDAsIDB4ZDBkNCwgMHgwMTY4LCAweDY4MjAsIDB4ODAwMCwgMHg2ODIyLCAweDkwODYsCisJMHgwMDAxLCAweDExMTAsIDB4MmIwMCwgMHg2ODFlLCAweDAwZGUsIDB4MDgwNCwgMHg5NzYzLCAweDAwZGUsCisJMHgwMDA1LCAweGMwZDUsIDB4YjgwMiwgMHg2ODE4LCAweDkwMDUsIDB4MDE2OCwgMHhiODU2LCAweGI4NWIsCisJMHgwMDAwLCAweDAwODYsIDB4MDAwNiwgMHgyYjAwLCAweDY4MWEsIDB4MDA4ZSwgMHhhMDVhLCAweDAwOGUsCisJMHgyMDY5LCAweDE5ZTYsIDB4MGMwOCwgMHhiODU2LCAweGI4NWEsIDB4MmIwMCwgMHg2ODFhLCAweDY4MWUsCisJMHgwOGQ4LCAweDAwMDYsIDB4MDAxNiwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYwMGYsCisJMHgwMDAwLCAweDJjMDgsIDB4MjA2MSwgMHgxOWU2LCAweDYwMjAsIDB4ODAwMCwgMHg2MDIyLCAweDYwMDgsCisJMHg5MDA1LCAweDAxNDgsIDB4OTA4MCwgMHgwMDAzLCAweDIxMDIsIDB4NjEwYSwgMHgwMTJlLCAweDAwY2UsCisJMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHg2MTBlLCAweDYxMGEsIDB4MGNjMCwgMHgwMGM2LCAweDYwMGYsCisJMHgwMDAwLCAweDJjMDgsIDB4MjA2MSwgMHgxOWU2LCAweDYwMzQsIDB4OTAwNSwgMHgwMTMwLCAweDkwODAsCisJMHgwMDAzLCAweDIxMDIsIDB4NjEzNiwgMHgwMGNlLCAweDAwMDUsIDB4NjEzYSwgMHg2MTM2LCAweDAwY2UsCisJMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDBiNiwgMHgwMDk2LCAweDAwNzYsCisJMHgwMDY2LCAweDAwNTYsIDB4MDAzNiwgMHgwMDI2LCAweDAwMTYsIDB4MDAwNiwgMHgwMTI2LCAweDkwMmUsCisJMHgyMDcxLCAweDE5ZTYsIDB4NzYzOCwgMHgyNjYwLCAweDI2NzgsIDB4MjA5MSwgMHg4MDAwLCAweDhjZmYsCisJMHgwOTA0LCAweDkyYTUsIDB4NjAxMCwgMHgyMDU4LCAweGI4YTAsIDB4OTIwNiwgMHgxOTA0LCAweDkyYTAsCisJMHg4N2ZmLCAweDAxMjAsIDB4NjA1NCwgMHg5MTA2LCAweDE5MDQsIDB4OTJhMCwgMHg3MDNjLCAweDljMDYsCisJMHgxMTc4LCAweDAwMzYsIDB4MjAxOSwgMHgwMDAxLCAweDA4MGMsIDB4YTZhYywgMHg3MDMzLCAweDAwMDAsCisJMHg5MDA2LCAweDcwM2UsIDB4NzA0MiwgMHg3MDQ2LCAweDcwNGEsIDB4MDAzZSwgMHgyMDI5LCAweDAwMDEsCisJMHg3MDM4LCAweDljMzYsIDB4MTExMCwgMHg2NjBjLCAweDc2M2EsIDB4NzAzNCwgMHg5YzM2LCAweDExNDAsCisJMHgyYzAwLCAweDlmMzYsIDB4MDExOCwgMHgyZjAwLCAweDcwMzYsIDB4MDAxMCwgMHg3MDM3LCAweDAwMDAsCisJMHg2NjBjLCAweDAwNjYsIDB4MmMwMCwgMHg5ZjA2LCAweDAxMTAsIDB4N2UwZSwgMHgwMDA4LCAweDI2NzgsCisJMHg2MDBmLCAweDAwMDAsIDB4MDgwYywgMHhjYzg2LCAweDAxZjAsIDB4NjAxNCwgMHgyMDQ4LCAweDYwMjAsCisJMHg5MDg2LCAweDAwMDMsIDB4MTViOCwgMHg2MDA0LCAweDkwODYsIDB4MDA0MCwgMHgwOTBjLCAweGE4OGIsCisJMHhhODY3LCAweDAxMDMsIDB4YWI3YSwgMHhhODc3LCAweDAwMDAsIDB4MDAxNiwgMHgwMDM2LCAweDAwNzYsCisJMHgwODBjLCAweGNmN2MsIDB4MDgwYywgMHhlYTk0LCAweDA4MGMsIDB4NmQxNywgMHgwMDdlLCAweDAwM2UsCisJMHgwMDFlLCAweDA4MGMsIDB4Y2U3MSwgMHgwODBjLCAweGFmNzQsIDB4MDBjZSwgMHgwODA0LCAweDkyM2YsCisJMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwODA0LCAweDkyM2YsIDB4ODVmZiwgMHgwMTIwLCAweDAwMzYsCisJMHgwODBjLCAweDk4OTEsIDB4MDAzZSwgMHgwMTJlLCAweDAwMGUsIDB4MDAxZSwgMHgwMDJlLCAweDAwM2UsCisJMHgwMDVlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMDllLCAweDAwYmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsCisJMHgwMGZlLCAweDAwMDUsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDYsIDB4MTE1OCwgMHgwMDE2LCAweDAwMzYsCisJMHgwMDc2LCAweDA4MGMsIDB4ZWE5NCwgMHgwODBjLCAweGU2ZGQsIDB4MDA3ZSwgMHgwMDNlLCAweDAwMWUsCisJMHgwODkwLCAweDYwMjAsIDB4OTA4NiwgMHgwMDA5LCAweDExNjgsIDB4YTg3YiwgMHgwMDA2LCAweDAwMTYsCisJMHgwMDM2LCAweDAwNzYsIDB4MDgwYywgMHg2ZDE3LCAweDA4MGMsIDB4YWY0MywgMHgwMDdlLCAweDAwM2UsCisJMHgwMDFlLCAweDA4MTgsIDB4NjAyMCwgMHg5MDg2LCAweDAwMGEsIDB4MDkwNCwgMHg5MjhhLCAweDA4MDQsCisJMHg5MjgzLCAweDAwMDYsIDB4MDA2NiwgMHgwMDk2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGY2LCAweDkwMzYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDc5LCAweDE5ZTYsIDB4NzgzOCwgMHg5MDY1LCAweDA5MDQsCisJMHg5MzM2LCAweDYwMGMsIDB4MDAwNiwgMHg2MDBmLCAweDAwMDAsIDB4NzgzYywgMHg5YzA2LCAweDExNjgsCisJMHgwMDM2LCAweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweGE2YWMsIDB4NzgzMywgMHgwMDAwLCAweDkwMWUsCisJMHg3YjNlLCAweDdiNDIsIDB4N2I0NiwgMHg3YjRhLCAweDAwM2UsIDB4MDgwYywgMHhjYzg2LCAweDA1NDgsCisJMHg2MDE0LCAweDIwNDgsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDMsIDB4MTU5MCwgMHgzZTA4LCAweDkxOGUsCisJMHgwMDAyLCAweDExODgsIDB4NjAxMCwgMHg5MDA1LCAweDAxNzAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDAsCisJMHgwMGJlLCAweGQwYmMsIDB4MDE0MCwgMHg2MDQwLCAweDkwMDUsIDB4MTFhOCwgMHgyMDAxLCAweDE5ODcsCisJMHgyMDA0LCAweDYwNDIsIDB4MDA4MCwgMHg2MDA0LCAweDkwODYsIDB4MDA0MCwgMHgwOTBjLCAweGE4OGIsCisJMHhhODY3LCAweDAxMDMsIDB4YWI3YSwgMHhhODc3LCAweDAwMDAsIDB4MDgwYywgMHg2ZDBiLCAweDA4MGMsCisJMHhjZTcxLCAweDA4MGMsIDB4YWY3NCwgMHgwMDBlLCAweDA4MDQsIDB4OTJlZSwgMHg3ZTNhLCAweDdlMzYsCisJMHgwMTJlLCAweDAwZmUsIDB4MDBkZSwgMHgwMGNlLCAweDAwOWUsIDB4MDA2ZSwgMHgwMDBlLCAweDAwMDUsCisJMHg2MDIwLCAweDkwODYsIDB4MDAwNiwgMHgxMTE4LCAweDA4MGMsIDB4ZTZkZCwgMHgwYzUwLCAweDYwMjAsCisJMHg5MDg2LCAweDAwMDksIDB4MTEzMCwgMHhhYjdhLCAweDA4MGMsIDB4NmQxNywgMHgwODBjLCAweGFmNDMsCisJMHgwYzEwLCAweDYwMjAsIDB4OTA4NiwgMHgwMDBhLCAweDA5YTgsIDB4MDg2OCwgMHgwMDE2LCAweDAwMjYsCisJMHgwMDg2LCAweDkwNDYsIDB4MDA5OSwgMHgwODBjLCAweDk0NDEsIDB4MDA4ZSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMDA1LCAweDAwZjYsIDB4MDEyNiwgMHgyMDc5LCAweDE5ZTYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsCisJMHg5NGQ4LCAweDA4MGMsIDB4OTU2OCwgMHgwMTJlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGI2LCAweDAwOTYsCisJMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwNjYsIDB4MDAxNiwgMHgwMDA2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgxOWU2LCAweDc2MTQsIDB4MjY2MCwgMHgyNjc4LCAweDhjZmYsCisJMHgwOTA0LCAweDk0MDYsIDB4NjAxMCwgMHgyMDU4LCAweGI4YTAsIDB4OTIwNiwgMHgxOTA0LCAweDk0MDEsCisJMHg4OGZmLCAweDAxMjAsIDB4NjA1NCwgMHg5MTA2LCAweDE5MDQsIDB4OTQwMSwgMHg3MDI0LCAweDljMDYsCisJMHgxNTY4LCAweDIwNjksIDB4MDEwMCwgMHg2ODIwLCAweGQwYTQsIDB4MDExMCwgMHhkMGNjLCAweDE1MDgsCisJMHgwODBjLCAweDg2MzYsIDB4MDgwYywgMHhhMzU2LCAweDY4YzMsIDB4MDAwMCwgMHgwODBjLCAweGE4OGIsCisJMHg3MDI3LCAweDAwMDAsIDB4MDAzNiwgMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHg5Mzg0LCAweDEwMDAsCisJMHgwMTM4LCAweDIwMDEsIDB4MDEwMCwgMHgwODBjLCAweDJkNGUsIDB4OTAwNiwgMHgwODBjLCAweDJkNGUsCisJMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwgMHhkMDg0LCAweDAxMTAsIDB4NjgyNywgMHgwMDAxLCAweDAwM2UsCisJMHgwMDI4LCAweDYwMDMsIDB4MDAwOSwgMHg2MzBhLCAweDA4MDQsIDB4OTQwMSwgMHg3MDE0LCAweDljMzYsCisJMHgxMTEwLCAweDY2MGMsIDB4NzYxNiwgMHg3MDEwLCAweDljMzYsIDB4MTE0MCwgMHgyYzAwLCAweDlmMzYsCisJMHgwMTE4LCAweDJmMDAsIDB4NzAxMiwgMHgwMDEwLCAweDcwMTMsIDB4MDAwMCwgMHg2NjBjLCAweDAwNjYsCisJMHgyYzAwLCAweDlmMDYsIDB4MDExMCwgMHg3ZTBlLCAweDAwMDgsIDB4MjY3OCwgMHg2MDBmLCAweDAwMDAsCisJMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhjYzg2LCAweDAxZTgsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDMsCisJMHgxNTgwLCAweDA4MGMsIDB4Y2U4ZSwgMHgxMTE4LCAweDA4MGMsIDB4YjkwNSwgMHgwMDk4LCAweGE4NjcsCisJMHgwMTAzLCAweGFiN2EsIDB4YTg3NywgMHgwMDAwLCAweDAwMTYsIDB4MDAzNiwgMHgwMDg2LCAweDA4MGMsCisJMHhjZjdjLCAweDA4MGMsIDB4ZWE5NCwgMHgwODBjLCAweDZkMTcsIDB4MDA4ZSwgMHgwMDNlLCAweDAwMWUsCisJMHgwODBjLCAweGNlNzEsIDB4MDgwYywgMHhhZjc0LCAweDA4MGMsIDB4YTc2MSwgMHgwMGNlLCAweDA4MDQsCisJMHg5MzdmLCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDA4MDQsIDB4OTM3ZiwgMHgwMTJlLCAweDAwMGUsCisJMHgwMDFlLCAweDAwNmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDllLCAweDAwYmUsCisJMHgwMDA1LCAweDYwMjAsIDB4OTA4NiwgMHgwMDA2LCAweDExNTgsIDB4MDAxNiwgMHgwMDM2LCAweDAwODYsCisJMHgwODBjLCAweGVhOTQsIDB4MDgwYywgMHhlNmRkLCAweDAwOGUsIDB4MDAzZSwgMHgwMDFlLCAweDA4ZDAsCisJMHgwODBjLCAweGI5MDUsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDIsIDB4MTE2MCwgMHg2MDA0LCAweDAwMDYsCisJMHg5MDg2LCAweDAwODUsIDB4MDAwZSwgMHgwOTA0LCAweDkzZTcsIDB4OTA4NiwgMHgwMDhiLCAweDA5MDQsCisJMHg5M2U3LCAweDA4NDAsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDUsIDB4MTkyMCwgMHg2MDA0LCAweDAwMDYsCisJMHg5MDg2LCAweDAwODUsIDB4MDAwZSwgMHgwOWM4LCAweDkwODYsIDB4MDA4YiwgMHgwOWIwLCAweDA4MDQsCisJMHg5M2ZhLCAweDAwYjYsIDB4MDBhNiwgMHgwMDk2LCAweDAwYzYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDkyODAsIDB4MTAwMCwgMHgyMDA0LCAweDkwNWQsIDB4MDkwNCwgMHg5NGQxLCAweDAwZjYsCisJMHgwMGU2LCAweDAwZDYsIDB4MDA2NiwgMHgyMDcxLCAweDE5ZTYsIDB4YmU1NCwgMHg3MDE4LCAweDliMDYsCisJMHgxMTA4LCAweDc2MWEsIDB4NzAxYywgMHg5YjA2LCAweDExMzAsIDB4ODZmZiwgMHgxMTE4LCAweDcwMTgsCisJMHg3MDFlLCAweDAwMDgsIDB4NzYxZSwgMHhiODU4LCAweDkwNGQsIDB4MDEwOCwgMHhhZTU2LCAweDk2ZDUsCisJMHgwMDAwLCAweDAxMTAsIDB4MjkwMCwgMHhiMDVhLCAweGI4NTcsIDB4MDAwMCwgMHhiODViLCAweDAwMDAsCisJMHhiODAwLCAweGMwZDQsIDB4YzBkYywgMHhiODAyLCAweDA4MGMsIDB4NjVjYiwgMHgwOTA0LCAweDk0Y2QsCisJMHg3NjI0LCAweDg2ZmYsIDB4MDkwNCwgMHg5NGJjLCAweDk2ODAsIDB4MDAwNSwgMHgyMDA0LCAweDk5MDYsCisJMHgxNWQ4LCAweDAwZDYsIDB4MjA2OSwgMHgwMTAwLCAweDY4YzAsIDB4OTAwNSwgMHgwNTYwLCAweDA4MGMsCisJMHg4NjM2LCAweDA4MGMsIDB4YTM1NiwgMHg2OGMzLCAweDAwMDAsIDB4MDgwYywgMHhhODhiLCAweDcwMjcsCisJMHgwMDAwLCAweDAwMzYsIDB4MjA2OSwgMHgwMTQwLCAweDZiMDQsIDB4OTM4NCwgMHgxMDAwLCAweDAxMzgsCisJMHgyMDAxLCAweDAxMDAsIDB4MDgwYywgMHgyZDRlLCAweDkwMDYsIDB4MDgwYywgMHgyZDRlLCAweDIwNjksCisJMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwgMHgwMTEwLCAweDY4MjcsIDB4MDAwMSwgMHgwMDNlLCAweDAwZGUsCisJMHgwMGM2LCAweGI4M2MsIDB4OTAwNSwgMHgwMTEwLCAweDgwMDEsIDB4YjgzZSwgMHgyNjYwLCAweDA4MGMsCisJMHhhZjc0LCAweDAwY2UsIDB4MDA0OCwgMHgwMGRlLCAweDAwYzYsIDB4MjY2MCwgMHg2MDAzLCAweDAwMDksCisJMHg2MzBhLCAweDAwY2UsIDB4MDgwNCwgMHg5NDc0LCAweDg5ZmYsIDB4MDE1OCwgMHhhODY3LCAweDAxMDMsCisJMHhhYjdhLCAweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweGNmN2MsIDB4MDgwYywgMHhlYTk0LCAweDA4MGMsCisJMHg2ZDE3LCAweDA4MGMsIDB4YTc2MSwgMHgwODA0LCAweDk0NzQsIDB4MDA2ZSwgMHgwMGRlLCAweDAwZWUsCisJMHgwMGZlLCAweDAxMmUsIDB4MDAwZSwgMHgwMGNlLCAweDAwOWUsIDB4MDBhZSwgMHgwMGJlLCAweDAwMDUsCisJMHgwMDk2LCAweDAwMDYsIDB4MDA2NiwgMHgwMGM2LCAweDAwZDYsIDB4OTAzNiwgMHg3ODE0LCAweDkwNjUsCisJMHgwOTA0LCAweDk1M2IsIDB4NjAwYywgMHgwMDA2LCAweDYwMGYsIDB4MDAwMCwgMHg3ODI0LCAweDljMDYsCisJMHgxNTgwLCAweDIwNjksIDB4MDEwMCwgMHg2ODIwLCAweGQwYTQsIDB4MDExMCwgMHhkMGNjLCAweDE1MDgsCisJMHgwODBjLCAweDg2MzYsIDB4MDgwYywgMHhhMzU2LCAweDY4YzMsIDB4MDAwMCwgMHgwODBjLCAweGE4OGIsCisJMHg3ODI3LCAweDAwMDAsIDB4MDAzNiwgMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHg5Mzg0LCAweDEwMDAsCisJMHgwMTM4LCAweDIwMDEsIDB4MDEwMCwgMHgwODBjLCAweDJkNGUsIDB4OTAwNiwgMHgwODBjLCAweDJkNGUsCisJMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwgMHhkMDg0LCAweDAxMTAsIDB4NjgyNywgMHgwMDAxLCAweDAwM2UsCisJMHgwMDQwLCAweDA4MGMsIDB4NjlhNCwgMHgxNTIwLCAweDYwMDMsIDB4MDAwOSwgMHg2MzBhLCAweDJjMzAsCisJMHgwMGY4LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGNjODQsIDB4MDFiMCwgMHg2MDIwLCAweDkwODYsCisJMHgwMDAzLCAweDE1MDgsIDB4MDgwYywgMHhjZThlLCAweDExMTgsIDB4MDgwYywgMHhiOTA1LCAweDAwNjAsCisJMHgwODBjLCAweDY5YTQsIDB4MTE2OCwgMHhhODY3LCAweDAxMDMsIDB4YWI3YSwgMHhhODc3LCAweDAwMDAsCisJMHgwODBjLCAweDZkMTcsIDB4MDgwYywgMHhjZTcxLCAweDA4MGMsIDB4YWY3NCwgMHgwODBjLCAweGE3NjEsCisJMHgwMDBlLCAweDA4MDQsIDB4OTRkZiwgMHg3ZTE2LCAweDdlMTIsIDB4MDBkZSwgMHgwMGNlLCAweDAwNmUsCisJMHgwMDBlLCAweDAwOWUsIDB4MDAwNSwgMHg2MDIwLCAweDkwODYsIDB4MDAwNiwgMHgxMTE4LCAweDA4MGMsCisJMHhlNmRkLCAweDBjNTAsIDB4MDgwYywgMHhiOTA1LCAweDYwMjAsIDB4OTA4NiwgMHgwMDAyLCAweDExNTAsCisJMHg2MDA0LCAweDAwMDYsIDB4OTA4NiwgMHgwMDg1LCAweDAwMGUsIDB4MDk5MCwgMHg5MDg2LCAweDAwOGIsCisJMHgwOTc4LCAweDA4ZDAsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDUsIDB4MTliMCwgMHg2MDA0LCAweDAwMDYsCisJMHg5MDg2LCAweDAwODUsIDB4MDAwZSwgMHgwZDE4LCAweDkwODYsIDB4MDA4YiwgMHgwZDAwLCAweDA4NjAsCisJMHgwMDA2LCAweDAwNjYsIDB4MDA5NiwgMHgwMGI2LCAweDAwYzYsIDB4MDBkNiwgMHg3ODE4LCAweDkwNWQsCisJMHgwOTA0LCAweDk1ZTgsIDB4Yjg1NCwgMHgwMDA2LCAweDkwMDYsIDB4Yjg1NiwgMHhiODVhLCAweGI4MDAsCisJMHhjMGQ0LCAweGMwZGMsIDB4YjgwMiwgMHgwODBjLCAweDY1Y2IsIDB4MDkwNCwgMHg5NWU1LCAweDdlMjQsCisJMHg4NmZmLCAweDA5MDQsIDB4OTVkOCwgMHg5NjgwLCAweDAwMDUsIDB4MjAwNCwgMHg5OTA2LCAweDE5MDQsCisJMHg5NWQ4LCAweDAwZDYsIDB4MjA2OSwgMHgwMTAwLCAweDY4YzAsIDB4OTAwNSwgMHgwOTA0LCAweDk1Y2YsCisJMHgwODBjLCAweDg2MzYsIDB4MDgwYywgMHhhMzU2LCAweDY4YzMsIDB4MDAwMCwgMHgwODBjLCAweGE4OGIsCisJMHg3ODI3LCAweDAwMDAsIDB4MDAzNiwgMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHg5Mzg0LCAweDEwMDAsCisJMHgwMTM4LCAweDIwMDEsIDB4MDEwMCwgMHgwODBjLCAweDJkNGUsIDB4OTAwNiwgMHgwODBjLCAweDJkNGUsCisJMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwgMHhkMDg0LCAweDAxMTAsIDB4NjgyNywgMHgwMDAxLCAweDAwM2UsCisJMHgwMGRlLCAweDAwYzYsIDB4M2UwOCwgMHg5MThlLCAweDAwMDIsIDB4MTE2OCwgMHhiODAwLCAweGQwYmMsCisJMHgwMTUwLCAweDk2ODAsIDB4MDAxMCwgMHgyMDBjLCAweDgxZmYsIDB4MTUxOCwgMHgyMDA5LCAweDE5ODcsCisJMHgyMTBjLCAweDIxMDIsIDB4MDBmMCwgMHhiODNjLCAweDkwMDUsIDB4MDExMCwgMHg4MDAxLCAweGI4M2UsCisJMHgyNjYwLCAweDYwMGYsIDB4MDAwMCwgMHgwODBjLCAweGFmNzQsIDB4MDBjZSwgMHgwMDQ4LCAweDAwZGUsCisJMHgwMGM2LCAweDI2NjAsIDB4NjAwMywgMHgwMDA5LCAweDYzMGEsIDB4MDBjZSwgMHgwODA0LCAweDk1N2IsCisJMHg4OWZmLCAweDAxMzgsIDB4YTg2NywgMHgwMTAzLCAweGFiN2EsIDB4YTg3NywgMHgwMDAwLCAweDA4MGMsCisJMHg2ZDE3LCAweDA4MGMsIDB4YTc2MSwgMHgwODA0LCAweDk1N2IsIDB4MDAwZSwgMHgwODA0LCAweDk1NmYsCisJMHg3ODFlLCAweDc4MWEsIDB4MDBkZSwgMHgwMGNlLCAweDAwYmUsIDB4MDA5ZSwgMHgwMDZlLCAweDAwMGUsCisJMHgwMDA1LCAweDAwZTYsIDB4MDBkNiwgMHgwMDk2LCAweDAwNjYsIDB4YjgwMCwgMHhkMGRjLCAweDAxYTAsCisJMHhiODRjLCAweDkwNGQsIDB4MDE4OCwgMHhhODc4LCAweDk2MDYsIDB4MTE3MCwgMHgyMDcxLCAweDE5ZTYsCisJMHg3MDI0LCAweDkwMzUsIDB4MDE0OCwgMHg5MDgwLCAweDAwMDUsIDB4MjAwNCwgMHg5OTA2LCAweDExMjAsCisJMHhiODAwLCAweGMwZGMsIDB4YjgwMiwgMHgwMDI5LCAweDAwNmUsIDB4MDA5ZSwgMHgwMGRlLCAweDAwZWUsCisJMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDc4YzAsIDB4OTAwNSwgMHgxMTM4LCAweDAwYzYsCisJMHgyNjYwLCAweDYwMDMsIDB4MDAwOSwgMHg2MzBhLCAweDAwY2UsIDB4MDRiOCwgMHgwODBjLCAweGEzNTYsCisJMHg3OGMzLCAweDAwMDAsIDB4MDgwYywgMHhhODhiLCAweDcwMjcsIDB4MDAwMCwgMHgwMDM2LCAweDIwNzksCisJMHgwMTQwLCAweDdiMDQsIDB4OTM4NCwgMHgxMDAwLCAweDAxMzgsIDB4MjAwMSwgMHgwMTAwLCAweDA4MGMsCisJMHgyZDRlLCAweDkwMDYsIDB4MDgwYywgMHgyZDRlLCAweDIwNzksIDB4MDEwMCwgMHg3ODI0LCAweGQwODQsCisJMHgwMTEwLCAweDc4MjcsIDB4MDAwMSwgMHgwODBjLCAweGE4OGIsIDB4MDAzZSwgMHgwODBjLCAweDY1Y2IsCisJMHgwMGM2LCAweGI4M2MsIDB4OTAwNSwgMHgwMTEwLCAweDgwMDEsIDB4YjgzZSwgMHgyNjYwLCAweDA4MGMsCisJMHhhZjQzLCAweDAwY2UsIDB4YTg2NywgMHgwMTAzLCAweGFiN2EsIDB4YTg3NywgMHgwMDAwLCAweDA4MGMsCisJMHhjZjdjLCAweDA4MGMsIDB4NmQxNywgMHgwODBjLCAweGE3NjEsIDB4MDBmZSwgMHgwMDA1LCAweDAwYjYsCisJMHgwMGU2LCAweDAwYzYsIDB4MjAxMSwgMHgwMTAxLCAweDIyMDQsIDB4YzBjNCwgMHgyMDEyLCAweDIwMDEsCisJMHgxODBjLCAweDIwMTQsIDB4YzJlNCwgMHgyMjAyLCAweDIwNzEsIDB4MTllNiwgMHg3MDA0LCAweDkwODQsCisJMHgwMDA3LCAweDAwMDIsIDB4OTY3NCwgMHg5Njc4LCAweDk2OTYsIDB4OTZiZiwgMHg5NmZkLCAweDk2NzQsCisJMHg5NjhmLCAweDk2NzIsIDB4MDgwYywgMHgwZGQ1LCAweDAwY2UsIDB4MDBlZSwgMHgwMGJlLCAweDAwMDUsCisJMHg3MDI0LCAweDkwNjUsIDB4MDE0OCwgMHg3MDIwLCAweDgwMDEsIDB4NzAyMiwgMHg2MDBjLCAweDkwMTUsCisJMHgwMTU4LCAweDcyMTYsIDB4NjAwZiwgMHgwMDAwLCAweDcwMDcsIDB4MDAwMCwgMHg3MDI3LCAweDAwMDAsCisJMHgwMGNlLCAweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweDcyMTYsIDB4NzIxMiwgMHgwY2E4LCAweDcwMDcsCisJMHgwMDAwLCAweDcwMjcsIDB4MDAwMCwgMHg3MDIwLCAweDkwMDUsIDB4MDA3MCwgMHg2MDEwLCAweDIwNTgsCisJMHgwODBjLCAweDY1Y2IsIDB4YjgwMCwgMHhjMGRjLCAweGI4MDIsIDB4NzAwNywgMHgwMDAwLCAweDcwMjcsCisJMHgwMDAwLCAweDcwMjAsIDB4ODAwMSwgMHg3MDIyLCAweDExNDgsIDB4MjAwMSwgMHgxODBjLCAweDIwMTQsCisJMHhkMmVjLCAweDExODAsIDB4MDBjZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHhiODU0LCAweDkwMTUsCisJMHgwMTIwLCAweDcyMWUsIDB4MDgwYywgMHg5NzYzLCAweDBjYTgsIDB4NzIxOCwgMHg3MjFlLCAweDA4MGMsCisJMHg5NzYzLCAweDBjODAsIDB4YzJlYywgMHgyMjAyLCAweDA4MGMsIDB4OTg5MSwgMHgwYzU4LCAweDcwMjQsCisJMHg5MDY1LCAweDA1YjgsIDB4NzAwYywgMHg5YzA2LCAweDExNjAsIDB4MDgwYywgMHhhNzYxLCAweDYwMGMsCisJMHg5MDE1LCAweDAxMjAsIDB4NzIwZSwgMHg2MDBmLCAweDAwMDAsIDB4MDQ0OCwgMHg3MjBlLCAweDcyMGEsCisJMHgwNDMwLCAweDcwMTQsIDB4OWMwNiwgMHgxMTYwLCAweDA4MGMsIDB4YTc2MSwgMHg2MDBjLCAweDkwMTUsCisJMHgwMTIwLCAweDcyMTYsIDB4NjAwZiwgMHgwMDAwLCAweDAwZDAsIDB4NzIxNiwgMHg3MjEyLCAweDAwYjgsCisJMHg2MDIwLCAweDkwODYsIDB4MDAwMywgMHgxMTk4LCAweDYwMTAsIDB4MjA1OCwgMHgwODBjLCAweDY1Y2IsCisJMHhiODAwLCAweGMwZGMsIDB4YjgwMiwgMHgwODBjLCAweGE3NjEsIDB4NzAxYywgMHg5MDY1LCAweDAxMzgsCisJMHhiODU0LCAweDkwMTUsIDB4MDExMCwgMHg3MjFlLCAweDAwMTAsIDB4NzIxOCwgMHg3MjFlLCAweDcwMjcsCisJMHgwMDAwLCAweDAwY2UsIDB4MDBlZSwgMHgwMGJlLCAweDAwMDUsIDB4NzAyNCwgMHg5MDY1LCAweDAxNDAsCisJMHgwODBjLCAweGE3NjEsIDB4NjAwYywgMHg5MDE1LCAweDAxNTgsIDB4NzIwZSwgMHg2MDBmLCAweDAwMDAsCisJMHgwODBjLCAweGE4OGIsIDB4NzAyNywgMHgwMDAwLCAweDAwY2UsIDB4MDBlZSwgMHgwMGJlLCAweDAwMDUsCisJMHg3MjBlLCAweDcyMGEsIDB4MGNhOCwgMHgwMGQ2LCAweDIwNjksIDB4MTllNiwgMHg2ODMwLCAweDkwODQsCisJMHgwMDAzLCAweDAwMDIsIDB4OTcyMCwgMHg5NzIyLCAweDk3NDYsIDB4OTcxZSwgMHgwODBjLCAweDBkZDUsCisJMHgwMGRlLCAweDAwMDUsIDB4MDBjNiwgMHg2ODQwLCAweDkwODYsIDB4MDAwMSwgMHgwMWI4LCAweDY4M2MsCisJMHg5MDY1LCAweDAxMzAsIDB4NjAwYywgMHg5MDE1LCAweDAxNzAsIDB4NmEzYSwgMHg2MDBmLCAweDAwMDAsCisJMHg2ODMzLCAweDAwMDAsIDB4NjgzZiwgMHgwMDAwLCAweDIwMTEsIDB4MWEwNSwgMHgyMDEzLCAweDAwMDAsCisJMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwgMHg2ODNhLCAweDY4MzYsIDB4MGM5MCwgMHg2ODQzLCAweDAwMDAsCisJMHg2ODM4LCAweDkwNjUsIDB4MGQ2OCwgMHg2MDAzLCAweDAwMDMsIDB4MGM1MCwgMHgwMGM2LCAweDkwMDYsCisJMHg2ODQyLCAweDY4NDYsIDB4Njg0YSwgMHg2ODNjLCAweDkwNjUsIDB4MDE2MCwgMHg2MDBjLCAweDkwMTUsCisJMHgwMTMwLCAweDZhM2EsIDB4NjAwZiwgMHgwMDAwLCAweDY4M2YsIDB4MDAwMCwgMHgwMDE4LCAweDY4M2UsCisJMHg2ODNhLCAweDY4MzYsIDB4MDBjZSwgMHgwMGRlLCAweDAwMDUsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsCisJMHhjMWU1LCAweDIxMDIsIDB4MDAwNSwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHhkMWVjLCAweDAxMjAsCisJMHhjMWVjLCAweDIxMDIsIDB4MDgwYywgMHg5ODkxLCAweDIwMDEsIDB4MTlmMiwgMHgyMDA0LCAweDkwODYsCisJMHgwMDAxLCAweDBkNTgsIDB4MDBkNiwgMHgyMDY5LCAweDE5ZTYsIDB4NjgwNCwgMHg5MDg0LCAweDAwMDcsCisJMHgwMDA2LCAweDkwMDUsIDB4MTFjOCwgMHgyMDAxLCAweDE4MzcsIDB4MjAwNCwgMHg5MDg0LCAweDAwMjgsCisJMHgxMTk4LCAweDIwMDEsIDB4MTk3YiwgMHgyMDA0LCAweDkwODYsIDB4YWFhYSwgMHgwMTY4LCAweDIwMDEsCisJMHgxODhiLCAweDIwMDQsIDB4ZDA4YywgMHgxMTE4LCAweGQwODQsIDB4MTExOCwgMHgwMDI4LCAweDA4MGMsCisJMHg5ODkxLCAweDAwMGUsIDB4MDBkZSwgMHgwMDA1LCAweDAwMGUsIDB4MDAwMiwgMHg5N2EwLCAweDk4NWYsCisJMHg5ODVmLCAweDk4NWYsIDB4OTg1ZiwgMHg5ODYxLCAweDk4NWYsIDB4OTc5ZSwgMHgwODBjLCAweDBkZDUsCisJMHg2ODIwLCAweDkwMDUsIDB4MTExMCwgMHgwMGRlLCAweDAwMDUsIDB4MDBjNiwgMHg2ODBjLCAweDkwNjUsCisJMHgwNTIwLCAweDYxMTQsIDB4MDA5NiwgMHgyMTQ4LCAweGE5NjQsIDB4MDA5ZSwgMHg5MThjLCAweDAwZmYsCisJMHg5MThlLCAweDAwMzUsIDB4MTE4MCwgMHgyMDA5LCAweDE4MzcsIDB4MjEwYywgMHg5MThjLCAweDAwMjgsCisJMHgxMTUwLCAweDA4MGMsIDB4NzQzZSwgMHgwMTM4LCAweDAwMDYsIDB4MjAwOSwgMHgxODhiLCAweDIxMDQsCisJMHhjMDk1LCAweDIwMGEsIDB4MDAwZSwgMHg2ODA3LCAweDAwMDQsIDB4NjgyNiwgMHg2ODJiLCAweDAwMDAsCisJMHgwODBjLCAweDk5M2EsIDB4MDBjZSwgMHgwMGRlLCAweDAwMDUsIDB4NjgxNCwgMHg5MDY1LCAweDAxNTAsCisJMHg2ODA3LCAweDAwMDEsIDB4NjgyNiwgMHg2ODJiLCAweDAwMDAsIDB4MDgwYywgMHg5OTNhLCAweDAwY2UsCisJMHgwMGRlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGU2LCAweDZhMWMsIDB4OTJkZCwgMHgwMDAwLCAweDA5MDQsCisJMHg5ODQ5LCAweGI4NGMsIDB4OTAwZCwgMHgwMTE4LCAweGI4ODgsIDB4OTAwNSwgMHgwMWEwLCAweGI4NTQsCisJMHg5MDVkLCAweDAxMjAsIDB4OTIwZSwgMHgwOTA0LCAweDk4NDksIDB4MDAyOCwgMHg2ODE4LCAweDkyMGUsCisJMHgwOTA0LCAweDk4NDksIDB4MjA1OCwgMHhiODRjLCAweDkwMGQsIDB4MGQ4OCwgMHhiODg4LCAweDkwMDUsCisJMHgxZDcwLCAweDJiMDAsIDB4NjgxZSwgMHhiYjNjLCAweGI4MzgsIDB4OTMwMiwgMHgxZTQwLCAweDA4MGMsCisJMHhhZjFhLCAweDA5MDQsIDB4OTg0OSwgMHg4MzE4LCAweGJiM2UsIDB4NjExNiwgMHgyYjEwLCAweDYyMTIsCisJMHgwMDk2LCAweDIxNDgsIDB4YTg4MCwgMHg5MDg0LCAweDAwZmYsIDB4NjA1ZSwgMHhhODgzLCAweDAwMDAsCisJMHhhODg0LCAweDAwOWUsIDB4OTA4YSwgMHgxOTlhLCAweDAyMTAsIDB4MjAwMSwgMHgxOTk5LCAweDgwMDMsCisJMHg4MDFiLCAweDgzMWIsIDB4OTMxOCwgMHg2MzFhLCAweDYxMTQsIDB4MDA5NiwgMHgyMTQ4LCAweGE5NjQsCisJMHgwMDllLCAweDkxOGMsIDB4MDBmZiwgMHg5MThlLCAweDAwNDgsIDB4MDUzOCwgMHgwMGY2LCAweDJjNzgsCisJMHgyMDYxLCAweDAxMDAsIDB4YmFjMCwgMHg2MjlhLCAweDIwNjksIDB4MDIwMCwgMHgyMDcxLCAweDAyNDAsCisJMHgwODBjLCAweDllOTEsIDB4MjA2OSwgMHgxOWU2LCAweGJiMDAsIDB4YzNkZCwgMHhiYjAyLCAweDY4MDcsCisJMHgwMDAyLCAweDJmMTgsIDB4NmIyNiwgMHg2ODJiLCAweDAwMDAsIDB4NzgyMywgMHgwMDAzLCAweDc4MDMsCisJMHgwMDAxLCAweDc4MDcsIDB4MDA0MCwgMHgwMGZlLCAweDAwZWUsIDB4MDBiZSwgMHgwMGNlLCAweDAwZGUsCisJMHgwMDA1LCAweDAwZWUsIDB4MDBiZSwgMHgwMGNlLCAweDBjZDAsIDB4NjgwNywgMHgwMDA2LCAweDJjMTgsCisJMHg2YjI2LCAweDY4MjAsIDB4ODAwMSwgMHg2ODIyLCAweDY4MmIsIDB4MDAwMCwgMHgwODBjLCAweDY1Y2IsCisJMHgwODBjLCAweGFkNWEsIDB4MDBlZSwgMHgwMGJlLCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweDAwZGUsCisJMHgwMDA1LCAweDAwYzYsIDB4NjgwYywgMHg5MDY1LCAweDA1MDgsIDB4NjExNCwgMHgwMDk2LCAweDIxNDgsCisJMHhhOTY0LCAweDAwOWUsIDB4OTE4YywgMHgwMGZmLCAweDkxOGUsIDB4MDAzNSwgMHgxMTgwLCAweDIwMDksCisJMHgxODM3LCAweDIxMGMsIDB4OTE4YywgMHgwMDI4LCAweDExNTAsIDB4MDgwYywgMHg3NDNlLCAweDAxMzgsCisJMHgwMDA2LCAweDIwMDksIDB4MTg4YiwgMHgyMTA0LCAweGMwOTUsIDB4MjAwYSwgMHgwMDBlLCAweDY4MDcsCisJMHgwMDA0LCAweDY4MjYsIDB4NjgyYiwgMHgwMDAwLCAweDA4MGMsIDB4OTkzYSwgMHgwMGNlLCAweDAwZGUsCisJMHgwMDA1LCAweDIwMDEsIDB4MTgwYywgMHgyMDE0LCAweGMyZWQsIDB4MjIwMiwgMHgwMGRlLCAweDAwZmUsCisJMHgwMDA1LCAweDAwZjYsIDB4MDBkNiwgMHgyMDY5LCAweDE5ZTYsIDB4NjgzMCwgMHg5MDg2LCAweDAwMDAsCisJMHgxNTcwLCAweDIwMDEsIDB4MTgwYywgMHgyMDE0LCAweGQyZTQsIDB4MDEzMCwgMHhjMmU0LCAweDIyMDIsCisJMHgwODBjLCAweDk3NzIsIDB4MjA2OSwgMHgxOWU2LCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGQxYzQsCisJMHgxNTA4LCAweDY4MzgsIDB4OTA3ZCwgMHgwMWQ4LCAweDZhMDQsIDB4OTI5NiwgMHgwMDAwLCAweDE5MDQsCisJMHg5OTJlLCAweDc5MjAsIDB4OTE4ZSwgMHgwMDA5LCAweDA1NjgsIDB4NjgzMywgMHgwMDAxLCAweDY4M2UsCisJMHg2ODQ3LCAweDAwMDAsIDB4Njg0YiwgMHgwMDAwLCAweDAxMjYsIDB4MDBmNiwgMHgyMDkxLCAweDI0MDAsCisJMHgwMDJlLCAweDA4MGMsIDB4MWM4NCwgMHgxMTU4LCAweDAxMmUsIDB4MDgwYywgMHhhMWIzLCAweDAwZGUsCisJMHgwMGZlLCAweDAwMDUsIDB4YzFjNCwgMHgyMTAyLCAweDA4MGMsIDB4NzRlZSwgMHgwOGQwLCAweDAxMmUsCisJMHg2ODQzLCAweDAwMDAsIDB4NzgwMywgMHgwMDAyLCAweDc4MGMsIDB4OTAxNSwgMHgwMTQwLCAweDZhM2EsCisJMHg3ODBmLCAweDAwMDAsIDB4NjgzMywgMHgwMDAwLCAweDY4M2YsIDB4MDAwMCwgMHgwYzQwLCAweDY4M2EsCisJMHg2ODM2LCAweDBjYzAsIDB4NzkwOCwgMHhkMWZjLCAweDExOTgsIDB4NjgzMywgMHgwMDAxLCAweDY4M2UsCisJMHg2ODQ3LCAweDAwMDAsIDB4Njg0YiwgMHgwMDAwLCAweDAxMjYsIDB4MDBmNiwgMHgyMDkxLCAweDI0MDAsCisJMHgwMDJlLCAweDA4MGMsIDB4MWM4NCwgMHgxOWQ4LCAweDAxMmUsIDB4MDgwYywgMHhhMTM0LCAweDA4NzgsCisJMHgyMDAxLCAweDE4MzcsIDB4MjAwNCwgMHg5MDg0LCAweDAwMjgsIDB4MTE4OCwgMHgyMDAxLCAweDE5N2IsCisJMHgyMDA0LCAweDkwODYsIDB4YWFhYSwgMHgwMTU4LCAweDIwMDEsIDB4MTllNywgMHgyMDA0LCAweDkwMDUsCisJMHgxMWYwLCAweDIwMDEsIDB4MTg4YiwgMHgyMDBjLCAweGMxODUsIDB4YzE4YywgMHgyMTAyLCAweDJmMDAsCisJMHg2ODMzLCAweDAwMDEsIDB4NjgzZSwgMHg2ODQ3LCAweDAwMDAsIDB4Njg0YiwgMHgwMDAwLCAweDAxMjYsCisJMHgwMGY2LCAweDIwOTEsIDB4MjQwMCwgMHgwMDJlLCAweDA4MGMsIDB4MWM4NCwgMHgxOTA0LCAweDk4Y2YsCisJMHgwMTJlLCAweDZhM2MsIDB4MjI3OCwgMHgwODBjLCAweGEwYmUsIDB4MDgwNCwgMHg5OGM3LCAweDIwMTEsCisJMHgxODhiLCAweDIyMDQsIDB4YzA4ZCwgMHgyMDEyLCAweDA4MDQsIDB4OThjNywgMHg2YTA0LCAweDkyOTYsCisJMHgwMDA2LCAweDE5MDQsIDB4OTg4OSwgMHg2YTMwLCAweDkyOTYsIDB4MDAwMCwgMHgwOTA0LCAweDk4YjEsCisJMHgwODA0LCAweDk4ODksIDB4NjAyMCwgMHg5MDg0LCAweDAwMGYsIDB4MDAwYiwgMHgwMDA1LCAweDk5NGUsCisJMHg5OTUzLCAweDlkYzEsIDB4OWU1YSwgMHg5OTUzLCAweDlkYzEsIDB4OWU1YSwgMHg5OTRlLCAweDk5NTMsCisJMHg5OTRlLCAweDk5NGUsIDB4OTk0ZSwgMHg5OTRlLCAweDk5NGUsIDB4OTk0ZSwgMHgwODBjLCAweDk2NTcsCisJMHgwODBjLCAweDk3NjMsIDB4MDAwNSwgMHgwMGI2LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxYzYsCisJMHgwMWQ2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MjA2OSwgMHgwMjAwLCAweDIwNzEsCisJMHgwMjQwLCAweDYwMDQsIDB4OTA4YSwgMHgwMDUzLCAweDFhMGMsIDB4MGRkNSwgMHg2MTEwLCAweDIxNTgsCisJMHhiOWMwLCAweDJjNzgsIDB4MjA2MSwgMHgwMTAwLCAweDYxOWEsIDB4OTA4YSwgMHgwMDQwLCAweDFhMDQsCisJMHg5OWJmLCAweDAwNWIsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMWRlLCAweDAxY2UsCisJMHgwMTRlLCAweDAxM2UsIDB4MDE1ZSwgMHgwMGJlLCAweDAwMDUsIDB4OWI0NCwgMHg5YjdmLCAweDliYTgsCisJMHg5YzUwLCAweDljNzIsIDB4OWM3OCwgMHg5Yzg1LCAweDljOGQsIDB4OWM5OSwgMHg5YzlmLCAweDljYjAsCisJMHg5YzlmLCAweDlkMDgsIDB4OWM4ZCwgMHg5ZDE0LCAweDlkMWEsIDB4OWM5OSwgMHg5ZDFhLCAweDlkMjYsCisJMHg5OWJkLCAweDk5YmQsIDB4OTliZCwgMHg5OWJkLCAweDk5YmQsIDB4OTliZCwgMHg5OWJkLCAweDk5YmQsCisJMHg5OWJkLCAweDk5YmQsIDB4OTliZCwgMHhhNTYzLCAweGE1ODYsIDB4YTU5NywgMHhhNWI3LCAweGE1ZTksCisJMHg5Yzg1LCAweDk5YmQsIDB4OWM4NSwgMHg5YzlmLCAweDk5YmQsIDB4OWJhOCwgMHg5YzUwLCAweDk5YmQsCisJMHhhOTgyLCAweDljOWYsIDB4OTliZCwgMHhhOTllLCAweDljOWYsIDB4OTliZCwgMHg5Yzk5LCAweDliM2UsCisJMHg5OWUwLCAweDk5YmQsIDB4YTliYSwgMHhhYTI3LCAweGFiMDIsIDB4OTliZCwgMHhhYjBmLCAweDljODIsCisJMHhhYjNhLCAweDk5YmQsIDB4YTVmMywgMHhhYjY3LCAweDk5YmQsIDB4MDgwYywgMHgwZGQ1LCAweDIxMDAsCisJMHgwMDViLCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDFkZSwgMHgwMWNlLCAweDAxNGUsCisJMHgwMTNlLCAweDAxNWUsIDB4MDBiZSwgMHgwMDA1LCAweGFjMDIsIDB4YWNiNCwgMHg5OWRlLCAweDlhMDcsCisJMHg5YWIzLCAweDlhYmUsIDB4OTlkZSwgMHg5Yzg1LCAweDk5ZGUsIDB4OWIwNSwgMHg5YjExLCAweDlhMjIsCisJMHg5OWRlLCAweDlhM2QsIDB4OWE3MSwgMHhhZTIxLCAweGFlNjYsIDB4OWM5ZiwgMHgwODBjLCAweDBkZDUsCisJMHgwMGQ2LCAweDAwOTYsIDB4MDgwYywgMHg5ZDM5LCAweDcwMDMsIDB4MjQxNCwgMHg3MDA3LCAweDAwMTgsCisJMHg3MDBiLCAweDA4MDAsIDB4NzgxNCwgMHgyMDQ4LCAweGE4M2MsIDB4NzAwZSwgMHhhODUwLCAweDcwMjIsCisJMHhhODU0LCAweDcwMjYsIDB4NjBjMywgMHgwMDE4LCAweDA4MGMsIDB4YTMyYSwgMHgwMDllLCAweDAwZGUsCisJMHgwMDA1LCAweDc4MTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4YTAsIDB4MDBiZSwgMHgwODBjLCAweGFlYWQsCisJMHgxMTE4LCAweDkwODQsIDB4ZmY4MCwgMHgwMTEwLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwZDYsCisJMHgwMDk2LCAweDA4MGMsIDB4OWQzOSwgMHg3MDAzLCAweDA1MDAsIDB4NzgxNCwgMHgyMDQ4LCAweGE4NzQsCisJMHg3MDBhLCAweGE4NzgsIDB4NzAwZSwgMHhhODdjLCAweDcwMTIsIDB4YTg4MCwgMHg3MDE2LCAweGE4ODQsCisJMHg3MDFhLCAweGE4ODgsIDB4NzAxZSwgMHg2MGMzLCAweDAwMTAsIDB4MDgwYywgMHhhMzJhLCAweDAwOWUsCisJMHgwMGRlLCAweDAwMDUsIDB4MDBkNiwgMHgwMDk2LCAweDA4MGMsIDB4OWQzOSwgMHg3MDAzLCAweDA1MDAsCisJMHg3ODE0LCAweDIwNDgsIDB4YThjYywgMHg3MDBhLCAweGE4ZDAsIDB4NzAwZSwgMHhhOGQ0LCAweDcwMTIsCisJMHhhOGQ4LCAweDcwMTYsIDB4YThkYywgMHg3MDFhLCAweGE4ZTAsIDB4NzAxZSwgMHg2MGMzLCAweDAwMTAsCisJMHgwODBjLCAweGEzMmEsIDB4MDA5ZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBkNiwgMHgwMDk2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg5ZDM5LCAweDIwZTksIDB4MDAwMCwgMHgyMDAxLCAweDE5YTIsCisJMHgyMDAzLCAweDAwMDAsIDB4NzgxNCwgMHgyMDQ4LCAweGE4MTQsIDB4ODAwMywgMHg2MGMyLCAweGE4MzAsCisJMHgyMGE4LCAweGE4NjAsIDB4MjBlMCwgMHhhODVjLCAweDkwODAsIDB4MDAxYiwgMHgyMDk4LCAweDIwMDEsCisJMHgxOWEyLCAweDAwMTYsIDB4MjAwYywgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyM2Y1LCAweDA4MGMsCisJMHhkOWU3LCAweDkwMDYsIDB4MDgwYywgMHgyM2Y1LCAweDAwMWUsIDB4YTgwNCwgMHg5MDA1LCAweDAxMTAsCisJMHgyMDQ4LCAweDBjMjgsIDB4MDRkOSwgMHgwODBjLCAweGEzMmEsIDB4MDEyZSwgMHgwMDllLCAweDAwZGUsCisJMHgwMDA1LCAweDAwZDYsIDB4MDA5NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDlkODQsCisJMHgyMGU5LCAweDAwMDAsIDB4MjAwMSwgMHgxOWEyLCAweDIwMDMsIDB4MDAwMCwgMHg3ODE0LCAweDIwNDgsCisJMHhhODZmLCAweDAyMDAsIDB4YTg3MywgMHgwMDAwLCAweGE4MTQsIDB4ODAwMywgMHg2MGMyLCAweGE4MzAsCisJMHgyMGE4LCAweGE4NjAsIDB4MjBlMCwgMHhhODVjLCAweDkwODAsIDB4MDAxYiwgMHgyMDk4LCAweDIwMDEsCisJMHgxOWEyLCAweDAwMTYsIDB4MjAwYywgMHgwODBjLCAweGQ5ZTcsIDB4MDAxZSwgMHhhODA0LCAweDkwMDUsCisJMHgwMTEwLCAweDIwNDgsIDB4MGM2MCwgMHgwMDUxLCAweDc4MTQsIDB4MjA0OCwgMHgwODBjLCAweDBmYjEsCisJMHgwODBjLCAweGEzMmEsIDB4MDEyZSwgMHgwMDllLCAweDAwZGUsIDB4MDAwNSwgMHg2MGMwLCAweDgwMDQsCisJMHg5MDg0LCAweDAwMDMsIDB4OTAwNSwgMHgwMTMwLCAweDkwODIsIDB4MDAwNCwgMHgyMGEzLCAweDAwMDAsCisJMHg4MDAwLCAweDFkZTAsIDB4MDAwNSwgMHgwODBjLCAweDlkMzksIDB4NzAwMywgMHg3ODAwLCAweDc4MDgsCisJMHg4MDA3LCAweDcwMGEsIDB4NjBjMywgMHgwMDA4LCAweDA4MDQsIDB4YTMyYSwgMHgwMGQ2LCAweDAwZTYsCisJMHgwODBjLCAweDlkODQsIDB4NzgxNCwgMHg5MDg0LCAweGZmMDAsIDB4MjA3MywgMHgwMjAwLCAweDhlNzAsCisJMHg4ZTcwLCAweDkwOTUsIDB4MDAxMCwgMHgyMjcyLCAweDhlNzAsIDB4MjA3MywgMHgwMDM0LCAweDhlNzAsCisJMHgyMDY5LCAweDE4MDUsIDB4MjBhOSwgMHgwMDA0LCAweDJkNzYsIDB4OGQ2OCwgMHg4ZTcwLCAweDFmMDQsCisJMHg5YWQ0LCAweDIwNjksIDB4MTgwMSwgMHgyMGE5LCAweDAwMDQsIDB4MmQ3NiwgMHg4ZDY4LCAweDhlNzAsCisJMHgxZjA0LCAweDlhZGQsIDB4MjA2OSwgMHgxOWIyLCAweDkwODYsIDB4ZGYwMCwgMHgwMTEwLCAweDIwNjksCisJMHgxOWNjLCAweDIwYTksIDB4MDAxYSwgMHg5ZTg2LCAweDAyNjAsIDB4MTE0OCwgMHgwMGM2LCAweDIwNjEsCisJMHgwMjAwLCAweDYwMTAsIDB4ODAwMCwgMHg2MDEyLCAweDAwY2UsIDB4MjA3MSwgMHgwMjQwLCAweDJkMDQsCisJMHg4MDA3LCAweDIwNzIsIDB4OGQ2OCwgMHg4ZTcwLCAweDFmMDQsIDB4OWFlYiwgMHg2MGMzLCAweDAwNGMsCisJMHgwODBjLCAweGEzMmEsIDB4MDBlZSwgMHgwMGRlLCAweDAwMDUsIDB4MDgwYywgMHg5ZDM5LCAweDcwMDMsCisJMHg2MzAwLCAweDcwMDcsIDB4MDAyOCwgMHg3ODA4LCAweDcwMGUsIDB4NjBjMywgMHgwMDA4LCAweDA4MDQsCisJMHhhMzJhLCAweDAwZDYsIDB4MDAyNiwgMHgwMDE2LCAweDA4MGMsIDB4OWQ4NCwgMHg3MDAzLCAweDAyMDAsCisJMHg3ODE0LCAweDcwMGUsIDB4MDBlNiwgMHg5ZWYwLCAweDAwMDQsIDB4MjAwOSwgMHgwMDAxLCAweDIwMTEsCisJMHgwMDBjLCAweDIwNjksIDB4MTkyMywgMHg2ODEwLCAweGQwODQsIDB4MTE0OCwgMHgyMDczLCAweDA1MDAsCisJMHg4ZTcwLCAweDIwNzMsIDB4MDAwMCwgMHg4ZTcwLCAweDgxMDgsIDB4OTI5MCwgMHgwMDA0LCAweDIwNzMsCisJMHgwODAwLCAweDhlNzAsIDB4MjA3MywgMHgwMDAwLCAweDAwZWUsIDB4NzIwNiwgMHg3MTBhLCAweDYyYzIsCisJMHgwODBjLCAweGEzMmEsIDB4MDAxZSwgMHgwMDJlLCAweDAwZGUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MTgsCisJMHgyMDA0LCAweDYwOWEsIDB4MDgwNCwgMHhhMzJhLCAweDA4MGMsIDB4OWQzOSwgMHg3MDAzLCAweDUyMDAsCisJMHgyMDY5LCAweDE4NDcsIDB4NjgwNCwgMHhkMDg0LCAweDAxMzAsIDB4NjgyOCwgMHgwMDE2LCAweDA4MGMsCisJMHgyOGFmLCAweDcxMGUsIDB4MDAxZSwgMHgyMGE5LCAweDAwMDQsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksCisJMHgxODA1LCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNTAsIDB4NDAwMywgMHgyMGE5LCAweDAwMDQsCisJMHgyMDk5LCAweDE4MDEsIDB4MjBhMSwgMHgwMjU0LCAweDQwMDMsIDB4MDgwYywgMHhhZWFkLCAweDExMjAsCisJMHhiOGEwLCAweDkwODIsIDB4MDA3ZiwgMHgwMjQ4LCAweDIwMDEsIDB4MTgxZiwgMHgyMDA0LCAweDcwMzIsCisJMHgyMDAxLCAweDE4MjAsIDB4MjAwNCwgMHg3MDM2LCAweDAwMzAsIDB4MjAwMSwgMHgxODE4LCAweDIwMDQsCisJMHg5MDg0LCAweDAwZmYsIDB4NzAzNiwgMHg2MGMzLCAweDAwMWMsIDB4MDgwNCwgMHhhMzJhLCAweDA4MGMsCisJMHg5ZDM5LCAweDcwMDMsIDB4MDUwMCwgMHgwODBjLCAweGFlYWQsIDB4MTEyMCwgMHhiOGEwLCAweDkwODIsCisJMHgwMDdmLCAweDAyNDgsIDB4MjAwMSwgMHgxODFmLCAweDIwMDQsIDB4NzAwYSwgMHgyMDAxLCAweDE4MjAsCisJMHgyMDA0LCAweDcwMGUsIDB4MDAzMCwgMHgyMDAxLCAweDE4MTgsIDB4MjAwNCwgMHg5MDg0LCAweDAwZmYsCisJMHg3MDBlLCAweDIwYTksIDB4MDAwNCwgMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwgMHgxODA1LCAweDIwZTksCisJMHgwMDAwLCAweDIwYTEsIDB4MDI1MCwgMHg0MDAzLCAweDYwYzMsIDB4MDAxMCwgMHgwODA0LCAweGEzMmEsCisJMHgwODBjLCAweDlkMzksIDB4OTAwNiwgMHgwODBjLCAweDY5ZDYsIDB4YjhhMCwgMHg5MDg2LCAweDAwN2UsCisJMHgxMTMwLCAweDcwMDMsIDB4MDQwMCwgMHg2MjBjLCAweGMyYjQsIDB4NjIwZSwgMHgwMDU4LCAweDc4MTQsCisJMHgwMDk2LCAweDkwNGQsIDB4MDEyMCwgMHg5MDA2LCAweGE4OWEsIDB4YThhNiwgMHhhOGFhLCAweDAwOWUsCisJMHg3MDAzLCAweDAzMDAsIDB4YjhhMCwgMHg5MDg2LCAweDAwN2UsIDB4MTkwNCwgMHg5YzE3LCAweDAwZDYsCisJMHgyMDY5LCAweDE5NmIsIDB4MjAwMSwgMHgxODM3LCAweDIwMDQsIDB4ZDBhNCwgMHgwMTg4LCAweDY4MDAsCisJMHg3MDBhLCAweDY4MDgsIDB4OTA4NCwgMHgyMDAwLCAweDcwMTIsIDB4MDgwYywgMHhhZWM0LCAweDY4MGMsCisJMHg3MDE2LCAweDcwMWYsIDB4MjcxMCwgMHg2ODE4LCAweDcwMjIsIDB4NjgxYywgMHg3MDI2LCAweDAwOTAsCisJMHg2ODAwLCAweDcwMGEsIDB4NjgwNCwgMHg3MDBlLCAweDY4MDgsIDB4MDgwYywgMHg3NDNlLCAweDExMTgsCisJMHg5MDg0LCAweDM3ZmYsIDB4MDAxMCwgMHg5MDg0LCAweDNmZmYsIDB4NzAxMiwgMHgwODBjLCAweGFlYzQsCisJMHg2ODBjLCAweDcwMTYsIDB4MDBkZSwgMHgyMGE5LCAweDAwMDQsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksCisJMHgxODA1LCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNTYsIDB4NDAwMywgMHgyMGE5LCAweDAwMDQsCisJMHgyMDk5LCAweDE4MDEsIDB4MjBhMSwgMHgwMjVhLCAweDQwMDMsIDB4MDBkNiwgMHgwODBjLCAweGFiZTksCisJMHgyMDY5LCAweDE5NzMsIDB4MjA3MSwgMHgwMjRlLCAweDY4MDAsIDB4YzBkZCwgMHg3MDAyLCAweDA4MGMsCisJMHg1NzYxLCAweGQwZTQsIDB4MDExMCwgMHg2ODBjLCAweDcwMGUsIDB4MDBkZSwgMHgwNGE4LCAweDIwMDEsCisJMHgxODM3LCAweDIwMDQsIDB4ZDBhNCwgMHgwMTcwLCAweDAwMTYsIDB4MjAwMSwgMHgxOTZjLCAweDIwMGMsCisJMHg2MGUwLCAweDkxMDYsIDB4MDEzMCwgMHgyMTAwLCAweDYwZTMsIDB4MDAwMCwgMHgwODBjLCAweDI4ZjAsCisJMHg2MWUyLCAweDAwMWUsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksIDB4MTk2YiwgMHgyMGU5LCAweDAwMDAsCisJMHgyMGExLCAweDAyNGUsIDB4MjBhOSwgMHgwMDA4LCAweDQwMDMsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksCisJMHgxODA1LCAweDIwYTEsIDB4MDI1NiwgMHg0MDAzLCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LCAweDE4MDEsCisJMHgyMGExLCAweDAyNWEsIDB4NDAwMywgMHgwODBjLCAweGFiZTksIDB4MjBhMSwgMHgwMjRlLCAweDIwYTksCisJMHgwMDA4LCAweDIwOTksIDB4MTk3MywgMHg0MDAzLCAweDYwYzMsIDB4MDA3NCwgMHgwODA0LCAweGEzMmEsCisJMHgwODBjLCAweDlkMzksIDB4NzAwMywgMHgyMDEwLCAweDcwMDcsIDB4MDAxNCwgMHg3MDBiLCAweDA4MDAsCisJMHg3MDBmLCAweDIwMDAsIDB4OTAwNiwgMHgwMGY2LCAweDIwNzksIDB4MTg0NywgMHg3OTA0LCAweDAwZmUsCisJMHhkMWFjLCAweDExMTAsIDB4OTA4NSwgMHgwMDIwLCAweGQxYTQsIDB4MDExMCwgMHg5MDg1LCAweDAwMTAsCisJMHg5MDg1LCAweDAwMDIsIDB4MDBkNiwgMHgwODA0LCAweDljZTksIDB4NzAyNiwgMHg2MGMzLCAweDAwMTQsCisJMHgwODA0LCAweGEzMmEsIDB4MDgwYywgMHg5ZDM5LCAweDcwMDMsIDB4NTAwMCwgMHgwODA0LCAweDliYzIsCisJMHgwODBjLCAweDlkMzksIDB4NzAwMywgMHgyMTEwLCAweDcwMDcsIDB4MDAxNCwgMHg2MGMzLCAweDAwMTQsCisJMHgwODA0LCAweGEzMmEsIDB4MDgwYywgMHg5ZDdiLCAweDAwMTAsIDB4MDgwYywgMHg5ZDg0LCAweDcwMDMsCisJMHgwMjAwLCAweDYwYzMsIDB4MDAwNCwgMHgwODA0LCAweGEzMmEsIDB4MDgwYywgMHg5ZDg0LCAweDcwMDMsCisJMHgwMTAwLCAweDcwMGIsIDB4MDAwMywgMHg3MDBmLCAweDJhMDAsIDB4NjBjMywgMHgwMDA4LCAweDA4MDQsCisJMHhhMzJhLCAweDA4MGMsIDB4OWQ4NCwgMHg3MDAzLCAweDAyMDAsIDB4MDgwNCwgMHg5YmMyLCAweDA4MGMsCisJMHg5ZDg0LCAweDcwMDMsIDB4MDEwMCwgMHg3ODJjLCAweDkwMDUsIDB4MDExMCwgMHg3MDBhLCAweDAwMTAsCisJMHg3MDBiLCAweDAwMDMsIDB4NzgxNCwgMHg3MDBlLCAweDYwYzMsIDB4MDAwOCwgMHgwODA0LCAweGEzMmEsCisJMHgwMGQ2LCAweDA4MGMsIDB4OWQ4NCwgMHg3MDAzLCAweDAyMTAsIDB4NzAwNywgMHgwMDE0LCAweDcwMGIsCisJMHgwODAwLCAweGI4OTQsIDB4OTA4NiwgMHgwMDE0LCAweDExOTgsIDB4Yjk5YywgMHg5MTg0LCAweDAwMzAsCisJMHgwMTkwLCAweGI5OTgsIDB4OTE4NCwgMHhjMDAwLCAweDExNDAsIDB4ZDFlYywgMHgwMTE4LCAweDcwMGYsCisJMHgyMTAwLCAweDAwNTgsIDB4NzAwZiwgMHgwMTAwLCAweDAwNDAsIDB4NzAwZiwgMHgwNDAwLCAweDAwMjgsCisJMHg3MDBmLCAweDA3MDAsIDB4MDAxMCwgMHg3MDBmLCAweDA4MDAsIDB4MDBmNiwgMHgyMDc5LCAweDE4NDcsCisJMHg3OTA0LCAweDAwZmUsIDB4ZDFhYywgMHgxMTEwLCAweDkwODUsIDB4MDAyMCwgMHhkMWE0LCAweDAxMTAsCisJMHg5MDg1LCAweDAwMTAsIDB4MjAwOSwgMHgxODY5LCAweDIxMGMsIDB4ZDE4NCwgMHgxMTEwLCAweDkwODUsCisJMHgwMDAyLCAweDAwMjYsIDB4MjAwOSwgMHgxODY3LCAweDIxMGMsIDB4ZDFlNCwgMHgwMTUwLCAweGMwYzUsCisJMHhiYWNjLCAweGQyOGMsIDB4MTEwOCwgMHhjMGNkLCAweDkwOTQsIDB4MDAzMCwgMHg5Mjk2LCAweDAwMTAsCisJMHgwMTQwLCAweGQxZWMsIDB4MDEzMCwgMHg5MDk0LCAweDAwMzAsIDB4OTI5NiwgMHgwMDEwLCAweDAxMDgsCisJMHhjMGJkLCAweDAwMmUsIDB4NzAyNiwgMHg2MGMzLCAweDAwMTQsIDB4MDBkZSwgMHgwODA0LCAweGEzMmEsCisJMHgwODBjLCAweDlkODQsIDB4NzAwMywgMHgwMjEwLCAweDcwMDcsIDB4MDAxNCwgMHg3MDBmLCAweDAxMDAsCisJMHg2MGMzLCAweDAwMTQsIDB4MDgwNCwgMHhhMzJhLCAweDA4MGMsIDB4OWQ4NCwgMHg3MDAzLCAweDAyMDAsCisJMHgwODA0LCAweDliNDgsIDB4MDgwYywgMHg5ZDg0LCAweDcwMDMsIDB4MDEwMCwgMHg3MDBiLCAweDAwMDMsCisJMHg3MDBmLCAweDJhMDAsIDB4NjBjMywgMHgwMDA4LCAweDA4MDQsIDB4YTMyYSwgMHgwODBjLCAweDlkODQsCisJMHg3MDAzLCAweDAxMDAsIDB4NzAwYiwgMHgwMDBiLCAweDYwYzMsIDB4MDAwOCwgMHgwODA0LCAweGEzMmEsCisJMHgwMDI2LCAweDAwZDYsIDB4MDAzNiwgMHgwMDQ2LCAweDIwMTksIDB4MzIwMCwgMHgyMDIxLCAweDA4MDAsCisJMHgwMDQwLCAweDAwMjYsIDB4MDBkNiwgMHgwMDM2LCAweDAwNDYsIDB4MjAxOSwgMHgyMjAwLCAweDIwMjEsCisJMHgwMTAwLCAweDA4MGMsIDB4YWJmZSwgMHhiODEwLCAweDkzMDUsIDB4NzAwMiwgMHhiODE0LCAweDcwMDYsCisJMHgyMDY5LCAweDE4MDAsIDB4Njg3YywgMHg3MDBhLCAweDY4ODAsIDB4NzAwZSwgMHg5NDg1LCAweDAwMjksCisJMHg3MDEyLCAweDAwNGUsIDB4MDAzZSwgMHgwMGRlLCAweDA4MGMsIDB4YTMxOCwgMHg3MjFhLCAweDlmOTUsCisJMHgwMDAwLCAweDcyMjIsIDB4NzAyNywgMHhmZmZmLCAweDIwNzEsIDB4MDI0YywgMHgwMDJlLCAweDAwMDUsCisJMHgwMDI2LCAweDA4MGMsIDB4YWJmZSwgMHg3MDAzLCAweDAyZmYsIDB4NzAwNywgMHhmZmZjLCAweDAwZDYsCisJMHgyMDY5LCAweDE4MDAsIDB4Njg3YywgMHg3MDBhLCAweDY4ODAsIDB4NzAwZSwgMHgwMGRlLCAweDcwMTMsCisJMHgyMDI5LCAweDBjMTAsIDB4NzAwMywgMHgwMTAwLCAweDcwMDcsIDB4MDAwMCwgMHg3MDBiLCAweGZjMDIsCisJMHg3MDBmLCAweDAwMDAsIDB4MDAwNSwgMHgwMDI2LCAweDAwZDYsIDB4MDAzNiwgMHgwMDQ2LCAweDIwMTksCisJMHgzMzAwLCAweDIwMjEsIDB4MDgwMCwgMHgwMDQwLCAweDAwMjYsIDB4MDBkNiwgMHgwMDM2LCAweDAwNDYsCisJMHgyMDE5LCAweDIzMDAsIDB4MjAyMSwgMHgwMTAwLCAweDA4MGMsIDB4YWJmZSwgMHhiODEwLCAweDkzMDUsCisJMHg3MDAyLCAweGI4MTQsIDB4NzAwNiwgMHgyMDY5LCAweDE4MDAsIDB4YjgxMCwgMHg5MDA1LCAweDExNDAsCisJMHhiODE0LCAweDkwMDUsIDB4MTEyOCwgMHg3MDBiLCAweDAwZmYsIDB4NzAwZiwgMHhmZmZlLCAweDAwMjAsCisJMHg2ODdjLCAweDcwMGEsIDB4Njg4MCwgMHg3MDBlLCAweDAwMDAsIDB4OTQ4NSwgMHgwMDk4LCAweDcwMTIsCisJMHgwMDRlLCAweDAwM2UsIDB4MDBkZSwgMHgwODBjLCAweGEzMTgsIDB4NzIxYSwgMHg3YTA4LCAweDcyMjIsCisJMHgyZjEwLCAweDcyMjYsIDB4MjA3MSwgMHgwMjRjLCAweDAwMmUsIDB4MDAwNSwgMHgwODBjLCAweGEzMTgsCisJMHg3MjFhLCAweDdhMDgsIDB4NzIyMiwgMHg3ODE0LCAweDcwMjYsIDB4MjA3MSwgMHgwMjRjLCAweDAwMmUsCisJMHgwMDA1LCAweDAwYjYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgyMDY5LCAweDAyMDAsCisJMHgyMDcxLCAweDAyNDAsIDB4NjAwNCwgMHg5MDhhLCAweDAwODUsIDB4MGEwYywgMHgwZGQ1LCAweDkwOGEsCisJMHgwMDkyLCAweDFhMGMsIDB4MGRkNSwgMHg2MTEwLCAweDIxNTgsIDB4YjljMCwgMHgyYzc4LCAweDIwNjEsCisJMHgwMTAwLCAweDYxOWEsIDB4OTA4MiwgMHgwMDg1LCAweDAwMzMsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsCisJMHgwMGNlLCAweDAwYmUsIDB4MDAwNSwgMHg5ZGYyLCAweDllMDEsIDB4OWUwYywgMHg5ZGYwLCAweDlkZjAsCisJMHg5ZGYwLCAweDlkZjIsIDB4OWRmMCwgMHg5ZGYwLCAweDlkZjAsIDB4OWRmMCwgMHg5ZGYwLCAweDlkZjAsCisJMHgwODBjLCAweDBkZDUsIDB4MDQxMSwgMHg2MGMzLCAweDAwMDAsIDB4MDAyNiwgMHgwODBjLCAweDJiZTMsCisJMHgwMjI4LCAweDIwMTEsIDB4MDEwMSwgMHgyMjA0LCAweGMwYzUsIDB4MjAxMiwgMHgwMDJlLCAweDA4MDQsCisJMHhhMzJhLCAweDA0MzEsIDB4NzgwOCwgMHg3MDBhLCAweDc4MTQsIDB4NzAwZSwgMHg3MDE3LCAweGZmZmYsCisJMHg2MGMzLCAweDAwMGMsIDB4MDgwNCwgMHhhMzJhLCAweDA0YTEsIDB4NzAwMywgMHgwMDAzLCAweDcwMDcsCisJMHgwMzAwLCAweDYwYzMsIDB4MDAwNCwgMHgwODA0LCAweGEzMmEsIDB4MDAyNiwgMHgwODBjLCAweGFiZmUsCisJMHhiODEwLCAweDkwODUsIDB4ODEwMCwgMHg3MDAyLCAweGI4MTQsIDB4NzAwNiwgMHgyMDY5LCAweDE4MDAsCisJMHg2ODdjLCAweDcwMGEsIDB4Njg4MCwgMHg3MDBlLCAweDcwMTMsIDB4MDAwOSwgMHgwODA0LCAweDlkNTQsCisJMHgwMDI2LCAweDA4MGMsIDB4YWJmZSwgMHhiODEwLCAweDkwODUsIDB4ODQwMCwgMHg3MDAyLCAweGI4MTQsCisJMHg3MDA2LCAweDIwNjksIDB4MTgwMCwgMHg2ODdjLCAweDcwMGEsIDB4Njg4MCwgMHg3MDBlLCAweDIwMDEsCisJMHgwMDk5LCAweDdhMjAsIDB4OTI5NiwgMHgwMDA1LCAweDAxMDgsIDB4YzBiYywgMHg3MDEyLCAweDA4MDQsCisJMHg5ZGI2LCAweDAwMjYsIDB4MDgwYywgMHhhYmZlLCAweGI4MTAsIDB4OTA4NSwgMHg4NTAwLCAweDcwMDIsCisJMHhiODE0LCAweDcwMDYsIDB4MjA2OSwgMHgxODAwLCAweDY4N2MsIDB4NzAwYSwgMHg2ODgwLCAweDcwMGUsCisJMHgyMDAxLCAweDAwOTksIDB4N2EyMCwgMHg5Mjk2LCAweDAwMDUsIDB4MDEwOCwgMHhjMGJjLCAweDcwMTIsCisJMHgwODA0LCAweDlkYjYsIDB4MDBiNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDJjNzgsCisJMHgyMDY5LCAweDAyMDAsIDB4MjA3MSwgMHgwMjQwLCAweDc4MDQsIDB4OTA4YSwgMHgwMDQwLCAweDBhMGMsCisJMHgwZGQ1LCAweDkwOGEsIDB4MDA1NCwgMHgxYTBjLCAweDBkZDUsIDB4NzkxMCwgMHgyMTU4LCAweGI5YzAsCisJMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwgMHg5MDgyLCAweDAwNDAsIDB4MDAzMywgMHgwMGZlLCAweDAwZWUsCisJMHgwMGRlLCAweDAwY2UsIDB4MDBiZSwgMHgwMDA1LCAweDllOTEsIDB4OWY0ZCwgMHg5ZjIwLCAweGEwNmYsCisJMHg5ZThmLCAweDllOGYsIDB4OWU4ZiwgMHg5ZThmLCAweDllOGYsIDB4OWU4ZiwgMHg5ZThmLCAweGE3M2UsCisJMHhhNzQ2LCAweGE3NGUsIDB4YTc1NiwgMHg5ZThmLCAweGFiNDYsIDB4OWU4ZiwgMHhhNzM2LCAweDA4MGMsCisJMHgwZGQ1LCAweDAwOTYsIDB4NzgwYiwgMHhmZmZmLCAweDA4MGMsIDB4OWVmYywgMHg3OTE0LCAweDIxNDgsCisJMHhhOTc4LCAweDc5NTYsIDB4YWU2NCwgMHg5NmI0LCAweDAwZmYsIDB4OTY4NiwgMHgwMDA4LCAweDExNDgsCisJMHhhOGI0LCAweDcwMzIsIDB4YThiOCwgMHg3MDM2LCAweGE4YmMsIDB4NzAzYSwgMHhhOGMwLCAweDcwM2UsCisJMHgwMDA4LCAweDcxMzIsIDB4YTk3YywgMHg5MTg0LCAweDAwMGYsIDB4MTExOCwgMHgyMDAxLCAweDAwMDUsCisJMHgwMDQwLCAweGQxODQsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsIDB4MDAxOCwgMHg5MDg0LCAweDAwMDYsCisJMHg4MDA0LCAweDIwMTAsIDB4Nzg1YywgMHg5MDg0LCAweDAwZmYsIDB4ODAwNywgMHg5MjA1LCAweDcwNDIsCisJMHhkMWFjLCAweDAxNTgsIDB4NzA0NywgMHgwMDAyLCAweDk2ODYsIDB4MDAwOCwgMHgxMTE4LCAweDA4MGMsCisJMHgxOGRkLCAweDAwMTAsIDB4MDgwYywgMHgxNzU0LCAweDAwNTAsIDB4ZDFiNCwgMHgwMTE4LCAweDcwNDcsCisJMHgwMDAxLCAweDAwMjgsIDB4NzA0NywgMHgwMDAwLCAweDkwMTYsIDB4MjIzMCwgMHgwMDEwLCAweGFhYjAsCisJMHhhZWFjLCAweDcyNmEsIDB4NzY2ZSwgMHgyMGE5LCAweDAwMDgsIDB4MjBlOSwgMHgwMDAwLCAweGE4NjAsCisJMHgyMGUwLCAweGE4NWMsIDB4OTA4MCwgMHgwMDIzLCAweDIwOTgsIDB4MjBhMSwgMHgwMjUyLCAweDIwNjksCisJMHgwMjAwLCAweDY4MTMsIDB4MDAxOCwgMHg0MDAzLCAweDY4MTMsIDB4MDAwOCwgMHg2MGMzLCAweDAwMjAsCisJMHg2MDE3LCAweDAwMDksIDB4MjAwMSwgMHgxYTAyLCAweDIwMDMsIDB4MDdkMCwgMHgyMDAxLCAweDFhMDEsCisJMHgyMDAzLCAweDAwMDksIDB4MDA5ZSwgMHgwMDA1LCAweDY4MTMsIDB4MDAwOCwgMHhiYThjLCAweDgyMTAsCisJMHhiOGNjLCAweGQwODQsIDB4MDEyOCwgMHg3YTRhLCAweDdiMTQsIDB4N2I0NiwgMHg3MjJlLCAweDczMmEsCisJMHg5Mjk0LCAweDAwZmYsIDB4YmE4ZSwgMHg4MjE3LCAweDcyMWEsIDB4YmExMCwgMHg5Mjk1LCAweDA2MDAsCisJMHg3MjAyLCAweGJhMTQsIDB4NzIwNiwgMHgyMDY5LCAweDE4MDAsIDB4NmE3YywgMHg3MjBhLCAweDZhODAsCisJMHg3MjBlLCAweDcwMTMsIDB4MDgyOSwgMHgyZjEwLCAweDcyMjIsIDB4NzAyNywgMHhmZmZmLCAweDAwMDUsCisJMHgwMGQ2LCAweDAwOTYsIDB4MDA4MSwgMHg3ODE0LCAweDIwNDgsIDB4YTg5MCwgMHg3MDAyLCAweGE4OGMsCisJMHg3MDA2LCAweGE4YjAsIDB4NzAwYSwgMHhhOGFjLCAweDcwMGUsIDB4NjBjMywgMHgwMDBjLCAweDAwOWUsCisJMHgwMGRlLCAweDA4MDQsIDB4YTMyYSwgMHg2ODEzLCAweDAwMDgsIDB4YjgxMCwgMHg5MDg1LCAweDA1MDAsCisJMHg3MDAyLCAweGI4MTQsIDB4NzAwNiwgMHgyMDY5LCAweDE4MDAsIDB4Njg3YywgMHg3MDBhLCAweDY4ODAsCisJMHg3MDBlLCAweDcwMTMsIDB4MDg4OSwgMHgwODBjLCAweGEzMTgsIDB4NzIxYSwgMHg3YTA4LCAweDcyMjIsCisJMHgyZjEwLCAweDcyMjYsIDB4MjA3MSwgMHgwMjRjLCAweDAwMDUsIDB4MDBkNiwgMHgwMDk2LCAweDA4MGMsCisJMHhhMDRkLCAweDc4MTQsIDB4MjA0OCwgMHgwODBjLCAweGNjODQsIDB4MTEzMCwgMHg3ODE0LCAweDkwODQsCisJMHgwNzAwLCAweDgwMDcsIDB4MDAzMywgMHgwMDEwLCAweDkwMDYsIDB4MDAxYiwgMHgwMDllLCAweDAwZGUsCisJMHgwMDA1LCAweDlmNmIsIDB4OWZkNCwgMHg5ZmU0LCAweGEwMGEsIDB4YTAxNiwgMHhhMDI3LCAweGEwMmYsCisJMHg5ZjY5LCAweDA4MGMsIDB4MGRkNSwgMHgwMDE2LCAweDAwMzYsIDB4YTk3YywgMHg5MThjLCAweDAwMDMsCisJMHgwMTE4LCAweDkxODYsIDB4MDAwMywgMHgxMTk4LCAweGFiYTgsIDB4NzgyNCwgMHhkMGNjLCAweDExNjgsCisJMHg3MzE2LCAweGE4OTgsIDB4NzAxYSwgMHhhODk0LCAweDcwMWUsIDB4MDAzZSwgMHgwMDFlLCAweDIwMDEsCisJMHgxOWIwLCAweDIwMDQsIDB4NjBjMiwgMHgwODA0LCAweGEzMmEsIDB4YzNlNSwgMHgwYzg4LCAweDkxODYsCisJMHgwMDAxLCAweDE5MGMsIDB4MGRkNSwgMHhhYmE4LCAweDc4MjQsIDB4ZDBjYywgMHgxOTA0LCAweDlmZDEsCisJMHg3MzE2LCAweGE4OTgsIDB4NzAxYSwgMHhhODk0LCAweDcwMWUsIDB4YThhNCwgMHg3MDI2LCAweGE4YWMsCisJMHg3MDJlLCAweDIwMDksIDB4MDAxOCwgMHg5Mzg0LCAweDAzMDAsIDB4MDU3MCwgMHhkM2M0LCAweDAxMTAsCisJMHhhOGFjLCAweDkxMDgsIDB4ZDNjYywgMHgwMTEwLCAweGE4YTQsIDB4OTEwOCwgMHg2ODEwLCAweDkwODUsCisJMHgwMDEwLCAweDY4MTIsIDB4MjAxMSwgMHgwMjU4LCAweDIwZTksIDB4MDAwMCwgMHgyMmEwLCAweDAxNTYsCisJMHgyMGE5LCAweDAwMDgsIDB4YTg2MCwgMHgyMGUwLCAweGE4NWMsIDB4OTA4MCwgMHgwMDJjLCAweDIwOTgsCisJMHg0MDAzLCAweDY4MTAsIDB4ODAwMCwgMHg2ODEyLCAweDIwMTEsIDB4MDI0MCwgMHgyMmEwLCAweDIwYTksCisJMHgwMDA1LCAweDQwMDMsIDB4NjgxMCwgMHhjMDg0LCAweDY4MTIsIDB4MDE1ZSwgMHg5MTg0LCAweDAwMDMsCisJMHgwMTE4LCAweDIwMTksIDB4MDI0NSwgMHgyMDFhLCAweDYxYzIsIDB4MDAzZSwgMHgwMDFlLCAweDA4MDQsCisJMHhhMzJhLCAweGMzZTUsIDB4MDgwNCwgMHg5ZjkwLCAweDIwMTEsIDB4MDAwOCwgMHgyMDAxLCAweDE4MGYsCisJMHgyMDA0LCAweGQwYTQsIDB4MDExMCwgMHgyMDExLCAweDAwMjgsIDB4NzgyNCwgMHhkMGNjLCAweDExMTAsCisJMHg3MjE2LCAweDA0NzAsIDB4MGNlOCwgMHhjMmU1LCAweDIwMTEsIDB4MDMwMiwgMHgwMDE2LCAweDc4MmMsCisJMHg3MDFhLCAweDc5MzAsIDB4NzExZSwgMHg5MTA1LCAweDAxMDgsIDB4YzJkZCwgMHgwMDFlLCAweDc4MjQsCisJMHhkMGNjLCAweDAxMDgsIDB4YzJlNSwgMHg3MjE2LCAweDcwMjcsIDB4MDAxMiwgMHg3MDJmLCAweDAwMDgsCisJMHg3MDQzLCAweDcwMDAsIDB4NzA0NywgMHgwNTAwLCAweDcwNGYsIDB4MDAwYSwgMHgyMDY5LCAweDAyMDAsCisJMHg2ODEzLCAweDAwMDksIDB4MjA3MSwgMHgwMjQwLCAweDcwMGIsIDB4MjUwMCwgMHg2MGMzLCAweDAwMzIsCisJMHgwODA0LCAweGEzMmEsIDB4MjAxMSwgMHgwMDI4LCAweDc4MjQsIDB4ZDBjYywgMHgxMTI4LCAweDcyMTYsCisJMHg2MGMzLCAweDAwMTgsIDB4MDgwNCwgMHhhMzJhLCAweDBjZDAsIDB4YzJlNSwgMHgyMDExLCAweDAxMDAsCisJMHg3ODI0LCAweGQwY2MsIDB4MDEwOCwgMHhjMmU1LCAweDcyMTYsIDB4NzAyZiwgMHgwMDA4LCAweDc4NTgsCisJMHg5MDg0LCAweDAwZmYsIDB4NzAzNiwgMHg2MGMzLCAweDAwMjAsIDB4MDgwNCwgMHhhMzJhLCAweDIwMTEsCisJMHgwMDA4LCAweDc4MjQsIDB4ZDBjYywgMHgwMTA4LCAweGMyZTUsIDB4NzIxNiwgMHgwYzA4LCAweDAwMzYsCisJMHg3YjE0LCAweDkzODQsIDB4ZmYwMCwgMHg3ODE2LCAweDkzODQsIDB4MDBmZiwgMHg4MDAxLCAweDExMzgsCisJMHg3ODI0LCAweGQwY2MsIDB4MDEwOCwgMHhjMmU1LCAweDcyMTYsIDB4MDAzZSwgMHgwODg4LCAweDAwNDYsCisJMHgyMDIxLCAweDA4MDAsIDB4MDAwNiwgMHg3ODI0LCAweGQwY2MsIDB4MDAwZSwgMHgwMTA4LCAweGM0ZTUsCisJMHg3NDE2LCAweDAwNGUsIDB4NzAxZSwgMHgwMDNlLCAweDA4MTgsIDB4MDBkNiwgMHg2ODEzLCAweDAwMDgsCisJMHhiODEwLCAweDkwODUsIDB4MDcwMCwgMHg3MDAyLCAweGI4MTQsIDB4NzAwNiwgMHgyMDY5LCAweDE4MDAsCisJMHg2ODdjLCAweDcwMGEsIDB4Njg4MCwgMHg3MDBlLCAweDc4MjQsIDB4ZDBjYywgMHgxMTY4LCAweDcwMTMsCisJMHgwODk4LCAweDA4MGMsIDB4YTMxOCwgMHg3MjFhLCAweDdhMDgsIDB4NzIyMiwgMHgyZjEwLCAweDcyMjYsCisJMHgyMDcxLCAweDAyNGMsIDB4MDBkZSwgMHgwMDA1LCAweDcwMTMsIDB4MDg4OSwgMHgwYzkwLCAweDAwMTYsCisJMHg3ODE0LCAweDkwODQsIDB4MDcwMCwgMHg4MDA3LCAweDAwMTMsIDB4MDAxZSwgMHgwMDA1LCAweGEwN2YsCisJMHhhMDdmLCAweGEwODEsIDB4YTA3ZiwgMHhhMDdmLCAweGEwN2YsIDB4YTA5YiwgMHhhMDdmLCAweDA4MGMsCisJMHgwZGQ1LCAweDc5MTQsIDB4OTE4YywgMHgwOGZmLCAweDkxOGQsIDB4ZjYwMCwgMHg3OTE2LCAweDIwMDksCisJMHgwMDAzLCAweDAwYjksIDB4MjA2OSwgMHgxODQ3LCAweDY4MDQsIDB4ZDBiYywgMHgwMTMwLCAweDY4MmMsCisJMHg5MDg0LCAweDAwZmYsIDB4ODAwNywgMHg3MDMyLCAweDAwMTAsIDB4NzAzMywgMHgzZjAwLCAweDYwYzMsCisJMHgwMDAxLCAweDA4MDQsIDB4YTMyYSwgMHgyMDA5LCAweDAwMDMsIDB4MDAxOSwgMHg3MDMzLCAweDdmMDAsCisJMHgwY2IwLCAweDAwMTYsIDB4MDgwYywgMHhhYmZlLCAweDAwMWUsIDB4YjgxMCwgMHg5MDg1LCAweDAxMDAsCisJMHg3MDAyLCAweGI4MTQsIDB4NzAwNiwgMHgyMDY5LCAweDE4MDAsIDB4NmE3YywgMHg3MjBhLCAweDZhODAsCisJMHg3MjBlLCAweDcwMTMsIDB4MDg4OCwgMHg5MThkLCAweDAwMDgsIDB4NzExNiwgMHgwODBjLCAweGEzMTgsCisJMHg3MjFhLCAweDdhMDgsIDB4NzIyMiwgMHgyZjEwLCAweDcyMjYsIDB4MDAwNSwgMHgwMGI2LCAweDAwZTYsCisJMHgwMGQ2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDU2LCAweDAwNDYsIDB4MDAzNiwgMHgyMDYxLCAweDAxMDAsCisJMHgyMDcxLCAweDE4MDAsIDB4NzE2MCwgMHg3ODEwLCAweDIwNTgsIDB4NzZkYywgMHg5NmI0LCAweDAwMjgsCisJMHgwMTEwLCAweDczN2MsIDB4NzQ4MCwgMHgyNTAwLCAweDc2ZGMsIDB4OTZiNCwgMHgwMDI4LCAweDAxNDAsCisJMHgyMDAxLCAweDA0ZmYsIDB4NjA2MiwgMHg2MDY3LCAweGZmZmYsIDB4NjM2YSwgMHg2NDZlLCAweDAwNTAsCisJMHgyMDAxLCAweDAwZmYsIDB4OTA4NSwgMHgwNDAwLCAweDYwNjIsIDB4NjA2NywgMHhmZmZmLCAweDYwNmIsCisJMHgwMDAwLCAweDYxNmUsIDB4YjhiOCwgMHg2MDczLCAweDA1MzAsIDB4NjA3NywgMHgwMDA4LCAweGI4OGMsCisJMHg4MDAwLCAweDkwODQsIDB4MDBmZiwgMHhiODhlLCAweDgwMDcsIDB4OTA4NSwgMHgwMDIwLCAweDYwN2EsCisJMHg2MDdmLCAweDAwMDAsIDB4MmIwMCwgMHg2MDgyLCAweDYwODcsIDB4ZmZmZiwgMHg3ODE0LCAweDAwOTYsCisJMHgyMDQ4LCAweGE4MzgsIDB4NjA4YSwgMHhhODM0LCAweDYwOGUsIDB4YTg0OCwgMHg2MGM2LCAweGE4NDQsCisJMHg2MGNhLCAweDAwOWUsIDB4Yjg2YywgMHg2MGNlLCAweDYwYWIsIDB4MDAzNiwgMHg2MGFmLCAweDk1ZDUsCisJMHg2MGQ3LCAweDAwMDAsIDB4MjAwMSwgMHgxODM3LCAweDIwMDQsIDB4OTA4NCwgMHgwMDI4LCAweDAxMjgsCisJMHg2MDlmLCAweDAwMDAsIDB4MjAwMSwgMHgwMDkyLCAweDAwNDgsIDB4NjAyOCwgMHhjMGJkLCAweDYwMmEsCisJMHg2MDlmLCAweDAwZmYsIDB4NjAyNywgMHhmZmZmLCAweDIwMDEsIDB4MDBiMiwgMHg2MDE2LCAweDIwMDksCisJMHgwN2QwLCAweDA4MGMsIDB4ODYzYiwgMHgwMDNlLCAweDAwNGUsIDB4MDA1ZSwgMHgwMDZlLCAweDAwY2UsCisJMHgwMGRlLCAweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsCisJMHgwMDY2LCAweDAwNTYsIDB4MDA0NiwgMHgwMDM2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweDE4MDAsCisJMHg3MTYwLCAweDc4MTAsIDB4MjA1OCwgMHhiOGEwLCAweDIwMjgsIDB4NzZkYywgMHhkNmFjLCAweDExNjgsCisJMHg5NTgyLCAweDAwN2UsIDB4MTI1MCwgMHgyNTAwLCAweDkwOTQsIDB4ZmY4MCwgMHgxMTMwLCAweDkwODAsCisJMHgzMzg0LCAweDIwMTUsIDB4OTI5NCwgMHgwMGZmLCAweDAwMjAsIDB4YjkxMCwgMHhiYTE0LCAweDczN2MsCisJMHg3NDgwLCAweDcwZGMsIDB4ZDBhYywgMHgxMTMwLCAweDk1ODIsIDB4MDA3ZSwgMHgxMjE4LCAweDk1ODQsCisJMHhmZjgwLCAweDAxMzgsIDB4OTE4NSwgMHgwNDAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MzZhLCAweDY0NmUsCisJMHgwMDMwLCAweDYwNjMsIDB4MDQwMCwgMHg2MjY2LCAweDYwNmIsIDB4MDAwMCwgMHg2MTZlLCAweGI4YjgsCisJMHg2MDcyLCAweDYwNzcsIDB4MDAwMCwgMHhiODY0LCAweGQwYTQsIDB4MDExMCwgMHg2MDc3LCAweDAwMDgsCisJMHhiODhjLCAweDgwMDAsIDB4OTA4NCwgMHgwMGZmLCAweGI4OGUsIDB4ODAwNywgMHg5MDg1LCAweDAwMjAsCisJMHg2MDdhLCAweDYwN2YsIDB4MDAwMCwgMHgyYjAwLCAweDYwODIsIDB4NjA4NywgMHhmZmZmLCAweDc4MTQsCisJMHgwMDk2LCAweDIwNDgsIDB4YTgzOCwgMHg2MDhhLCAweGE4MzQsIDB4NjA4ZSwgMHhhODQ4LCAweDYwYzYsCisJMHhhODQ0LCAweDYwY2EsIDB4MDA5ZSwgMHhiODZjLCAweDYwY2UsIDB4NjBhYiwgMHgwMDM2LCAweDYwYWYsCisJMHg5NWQ1LCAweDYwZDcsIDB4MDAwMCwgMHhiYWMwLCAweDYyOWUsIDB4MDBmNiwgMHgyMDc5LCAweDAxNDAsCisJMHg3ODAzLCAweDAwMDAsIDB4MDBmZSwgMHgyMDA5LCAweDAwOTIsIDB4NjExNiwgMHgyMDA5LCAweDA3ZDAsCisJMHgwODBjLCAweDg2M2IsIDB4MDAzZSwgMHgwMDRlLCAweDAwNWUsIDB4MDA2ZSwgMHgwMGNlLCAweDAwZGUsCisJMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHgwMGI2LCAweDAwOTYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsCisJMHgwMDU2LCAweDAwNDYsIDB4MDAzNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHgxODAwLCAweDc4MTAsCisJMHgyMDU4LCAweGI4YTAsIDB4MjAyOCwgMHhiOTEwLCAweGJhMTQsIDB4NzM3YywgMHg3NDgwLCAweDc4MjAsCisJMHg5MGJlLCAweDAwMDYsIDB4MDkwNCwgMHhhMjg3LCAweDkwYmUsIDB4MDAwYSwgMHgxOTA0LCAweGEyNDMsCisJMHhiOGMwLCAweDYwOWUsIDB4NzgxNCwgMHgyMDQ4LCAweGE4N2MsIDB4ZDBmYywgMHgwNTU4LCAweGFmOTAsCisJMHg5Nzg0LCAweGZmMDAsIDB4OTEwNSwgMHg2MDYyLCAweDg3M2YsIDB4OTc4NCwgMHhmZjAwLCAweDAwMDYsCisJMHg3ODE0LCAweDIwNDgsIDB4YTg3OCwgMHhjMGZjLCAweDkwMDUsIDB4MDAwZSwgMHgxMTYwLCAweGFmOTQsCisJMHg4N2ZmLCAweDAxOTgsIDB4MjAzOSwgMHgwMDk4LCAweDk3MDUsIDB4NjA3MiwgMHg3ODA4LCAweDYwODIsCisJMHgyZjAwLCAweDYwODYsIDB4MDAzOCwgMHg5MTg1LCAweDIyMDAsIDB4NjA2MiwgMHg2MDczLCAweDAxMjksCisJMHg2MDc3LCAweDAwMDAsIDB4YjhjMCwgMHg2MDllLCAweDAwNTAsIDB4MjAzOSwgMHgwMDI5LCAweDk3MDUsCisJMHg2MDcyLCAweDBjYzAsIDB4OTE4NSwgMHgwMjAwLCAweDYwNjIsIDB4NjA3MywgMHgyMDI5LCAweGE4N2MsCisJMHhkMGZjLCAweDAxMTgsIDB4YWY5NCwgMHg4N2ZmLCAweDExMjAsIDB4MmYwMCwgMHg2MDgyLCAweDc4MDgsCisJMHg2MDg2LCAweDYyNjYsIDB4NjM2YSwgMHg2NDZlLCAweDYwNzcsIDB4MDAwMCwgMHhiODhjLCAweDgwMDAsCisJMHg5MDg0LCAweDAwZmYsIDB4Yjg4ZSwgMHg4MDA3LCAweDYwN2EsIDB4NjA3ZiwgMHgwMDAwLCAweGE4MzgsCisJMHg2MDhhLCAweGE4MzQsIDB4NjA4ZSwgMHhhODQ4LCAweDYwYzYsIDB4YTg0NCwgMHg2MGNhLCAweGI4NmMsCisJMHg2MGNlLCAweDYwYWYsIDB4OTVkNSwgMHg2MGQ3LCAweDAwMDAsIDB4MDgwYywgMHhhYmUzLCAweDIwMDksCisJMHgwN2QwLCAweDYwYzQsIDB4OTA4NCwgMHhmZmYwLCAweDkwMDUsIDB4MDExMCwgMHgyMDA5LCAweDFiNTgsCisJMHgwODBjLCAweDg2M2IsIDB4MDAzZSwgMHgwMDRlLCAweDAwNWUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsCisJMHgwMDllLCAweDAwYmUsIDB4MDAwNSwgMHg3ODA0LCAweDkwODYsIDB4MDA0MCwgMHgwOTA0LCAweGEyYzMsCisJMHg5MTg1LCAweDAxMDAsIDB4NjA2MiwgMHg2MjY2LCAweDYzNmEsIDB4NjQ2ZSwgMHg2MDczLCAweDA4MDksCisJMHg2MDc3LCAweDAwMDgsIDB4NjBhZiwgMHg5NWQ1LCAweDYwZDcsIDB4MDAwMCwgMHhiODhjLCAweDgwMDAsCisJMHg5MDg0LCAweDAwZmYsIDB4Yjg4ZSwgMHg4MDA3LCAweDYwN2EsIDB4NjA3ZiwgMHgwMDAwLCAweDJmMDAsCisJMHg2MDgyLCAweDc4MDgsIDB4NjA4NiwgMHg3ODE0LCAweDIwNDgsIDB4YTgzOCwgMHg2MDhhLCAweGE4MzQsCisJMHg2MDhlLCAweGE4NDgsIDB4NjBjNiwgMHhhODQ0LCAweDYwY2EsIDB4Yjg2YywgMHg2MGNlLCAweGJhYzAsCisJMHg2MjllLCAweDA4MGMsIDB4YWJlMywgMHgyMDA5LCAweDA3ZDAsIDB4NjBjNCwgMHg5MDg0LCAweGZmZjAsCisJMHg5MDA1LCAweDAxMTAsIDB4MjAwOSwgMHgxYjU4LCAweDA4MGMsIDB4ODYzYiwgMHgwMDNlLCAweDAwNGUsCisJMHgwMDVlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwOWUsIDB4MDBiZSwgMHgwMDA1LCAweDc4MTQsCisJMHgyMDQ4LCAweGE4N2MsIDB4OTA4NCwgMHgwMDAzLCAweDkwODYsIDB4MDAwMiwgMHgwOTA0LCAweGEyZGYsCisJMHg5MTg1LCAweDAxMDAsIDB4NjA2MiwgMHg2MjY2LCAweDYzNmEsIDB4NjQ2ZSwgMHg2MDczLCAweDA4ODAsCisJMHg2MDc3LCAweDAwMDgsIDB4Yjg4YywgMHg4MDAwLCAweDkwODQsIDB4MDBmZiwgMHhiODhlLCAweDgwMDcsCisJMHg2MDdhLCAweDc4MzgsIDB4NjA3ZSwgMHgyZjAwLCAweDYwODYsIDB4NzgwOCwgMHg2MDgyLCAweGE4OTAsCisJMHg2MDhhLCAweGE4OGMsIDB4NjA4ZSwgMHhhOGIwLCAweDYwYzYsIDB4YThhYywgMHg2MGNhLCAweGE4YWMsCisJMHg3OTMwLCAweDkxMDgsIDB4NzkzMiwgMHhhOGIwLCAweDc5MmMsIDB4OTEwOSwgMHg3OTJlLCAweGI4NmMsCisJMHg2MGNlLCAweDYwYWYsIDB4OTVkNSwgMHg2MGQ3LCAweDAwMDAsIDB4YmFjMCwgMHg2MjllLCAweDA4MGMsCisJMHhhYmMwLCAweDA4MDQsIDB4YTI3MywgMHhiOGNjLCAweGQwODQsIDB4MDE0OCwgMHhiODhjLCAweDc4MTQsCisJMHgyMDQ4LCAweGI4OGMsIDB4Nzg0YSwgMHhhODM2LCAweDI5MDAsIDB4YTgzYSwgMHhiMDQ2LCAweDkxODUsCisJMHgwNjAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MzZhLCAweDY0NmUsIDB4NjA3MywgMHgwODI5LCAweDYwNzcsCisJMHgwMDAwLCAweDYwYWYsIDB4OTU3NSwgMHg2MGQ3LCAweDAwMDAsIDB4MDgwNCwgMHhhMjU2LCAweDkxODUsCisJMHgwNzAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MzZhLCAweDY0NmUsIDB4NzgyNCwgMHhkMGNjLCAweDc4MjYsCisJMHgwMTE4LCAweDYwNzMsIDB4MDg4OSwgMHgwMDEwLCAweDYwNzMsIDB4MDg5OCwgMHg2MDc3LCAweDAwMDAsCisJMHhiODhjLCAweDgwMDAsIDB4OTA4NCwgMHgwMGZmLCAweGI4OGUsIDB4ODAwNywgMHg2MDdhLCAweDYwN2YsCisJMHgwMDAwLCAweDJmMDAsIDB4NjA4NiwgMHg3ODA4LCAweDYwODIsIDB4YTgzOCwgMHg2MDhhLCAweGE4MzQsCisJMHg2MDhlLCAweGE4NDgsIDB4NjBjNiwgMHhhODQ0LCAweDYwY2EsIDB4Yjg2YywgMHg2MGNlLCAweDYwYWYsCisJMHg5NWQ1LCAweDYwZDcsIDB4MDAwMCwgMHhiYWMwLCAweDYyOWUsIDB4NzgyNCwgMHhkMGNjLCAweDAxMjAsCisJMHgwODBjLCAweGFiZTMsIDB4MDgwNCwgMHhhMjczLCAweDA4MGMsIDB4YWJjMCwgMHgwODA0LCAweGEyNzMsCisJMHg3YTEwLCAweDAwYjYsIDB4MjI1OCwgMHhiYThjLCAweDgyMTAsIDB4OTI5NCwgMHgwMGZmLCAweGJhOGUsCisJMHgwMGJlLCAweDgyMTcsIDB4MDAwNSwgMHgwMGQ2LCAweDIwNjksIDB4MTllNiwgMHg2ODQzLCAweDAwMDEsCisJMHgwMGRlLCAweDAwMDUsIDB4NjBhMywgMHgwMDU2LCAweDYwYTcsIDB4OTU3NSwgMHgwMGYxLCAweDA4MGMsCisJMHg4NjJkLCAweDAwMDUsIDB4MDAxNiwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHg5MTg0LCAweDA2MDAsCisJMHg5MDg2LCAweDA2MDAsIDB4MDEyOCwgMHgwMDg5LCAweDA4MGMsIDB4ODYyZCwgMHgwMDFlLCAweDAwMDUsCisJMHhjMWU1LCAweDIwMDEsIDB4MTgwYywgMHgyMTAyLCAweDIwMDEsIDB4MTllNywgMHgyMDAzLCAweDAwMDAsCisJMHgyMDAxLCAweDE5ZWYsIDB4MjAwMywgMHgwMDAwLCAweDBjODgsIDB4MDAwNiwgMHg2MDE0LCAweDkwODQsCisJMHgxODA0LCAweDkwODUsIDB4MDAwOSwgMHg2MDE2LCAweDAwMGUsIDB4MDAwNSwgMHgwMDE2LCAweDAwYzYsCisJMHgwMDA2LCAweDIwNjEsIDB4MDEwMCwgMHg2MWE0LCAweDYwYTcsIDB4OTVmNSwgMHg2MDE0LCAweDkwODQsCisJMHgxODA0LCAweDkwODUsIDB4MDAwOCwgMHg2MDE2LCAweDAwMGUsIDB4YTAwMSwgMHhhMDAxLCAweGEwMDEsCisJMHg2MWE2LCAweDAwY2UsIDB4MDAxZSwgMHgwMDA1LCAweDAwYzYsIDB4MDBkNiwgMHgwMDE2LCAweDAwMjYsCisJMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLCAweDA4MGMsIDB4NzQzZSwgMHgxMWMwLCAweDIwMDEsCisJMHgxYTAyLCAweDIwMDQsIDB4OTAwNSwgMHgxNWQwLCAweDA4MGMsIDB4NzRlZSwgMHgxMTYwLCAweDIwNjEsCisJMHgwMTAwLCAweDYwMjAsIDB4ZDBiNCwgMHgxMTIwLCAweDYwMjQsIDB4ZDA4NCwgMHgwOTBjLCAweDBkZDUsCisJMHgwODBjLCAweDg2MmQsIDB4MDQ1OCwgMHgwMGM2LCAweDIwNjEsIDB4MTllNiwgMHgwMGM4LCAweDY5MDQsCisJMHg5MTk0LCAweDQwMDAsIDB4MDU0MCwgMHgwODExLCAweDA4MGMsIDB4MmQ1ZSwgMHgwMGM2LCAweDIwNjEsCisJMHgxOWU2LCAweDYxMjgsIDB4OTE5MiwgMHgwMDA4LCAweDEyNTgsIDB4ODEwOCwgMHg2MTJhLCAweDYxMjQsCisJMHgwMGNlLCAweDgxZmYsIDB4MDE5OCwgMHgwODBjLCAweDg2MmQsIDB4MDgwYywgMHhhMzRkLCAweDAwNzAsCisJMHg2MTI0LCAweDkxZTUsIDB4MDAwMCwgMHgwMTQwLCAweDA4MGMsIDB4ZWI4ZSwgMHgwODBjLCAweDg2MzYsCisJMHgyMDA5LCAweDAwMTQsIDB4MDgwYywgMHhhZmJlLCAweDAwY2UsIDB4MDAwMCwgMHgwMDJlLCAweDAwMWUsCisJMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgyMDAxLCAweDFhMDIsIDB4MjAwNCwgMHg5MDA1LCAweDFkYjAsCisJMHgwMGM2LCAweDIwNjEsIDB4MTllNiwgMHg2MTI4LCAweDkxOTIsIDB4MDAwMywgMHgxZTA4LCAweDgxMDgsCisJMHg2MTJhLCAweDAwY2UsIDB4MDgwYywgMHg4NjJkLCAweDA4MGMsIDB4NWY2YywgMHgyMDA5LCAweDE4NDYsCisJMHgyMTE0LCAweDgyMTAsIDB4MjIwYSwgMHgwYzEwLCAweDAwOTYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsCisJMHgwMDE2LCAweDAwMjYsIDB4MDgwYywgMHg4NjQzLCAweDIwNzEsIDB4MTllNiwgMHg3MTNjLCAweDgxZmYsCisJMHgwOTA0LCAweGE0NTYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksIDB4MDE0MCwgMHgwODBjLCAweDc0M2UsCisJMHgxMWUwLCAweDAwMzYsIDB4MjAxOSwgMHgwMDAyLCAweDA4MGMsIDB4YTZhYywgMHgwMDNlLCAweDcxM2MsCisJMHgyMTYwLCAweDA4MGMsIDB4ZWI4ZSwgMHgyMDA5LCAweDAwNGEsIDB4NjIyMCwgMHg5Mjk2LCAweDAwMDksCisJMHgxMTMwLCAweDYxMTQsIDB4MjE0OCwgMHhhODdiLCAweDAwMDYsIDB4MjAwOSwgMHgwMDRhLCAweDA4MGMsCisJMHhhZmJlLCAweDA4MGMsIDB4NzRlZSwgMHgwODA0LCAweGE0NTYsIDB4MDgwYywgMHhhNDYyLCAweDA5MDQsCisJMHhhNDU2LCAweDY5MDQsIDB4ZDFmNCwgMHgwOTA0LCAweGE0NWQsIDB4MDgwYywgMHgyZDVlLCAweDAwYzYsCisJMHg3MDNjLCAweDkwNjUsIDB4MDkwYywgMHgwZGQ1LCAweDYwMjAsIDB4MDBjZSwgMHg5MDg2LCAweDAwMDYsCisJMHgxNTI4LCAweDYxYzgsIDB4NjBjNCwgMHg5MTA1LCAweDE1MDgsIDB4MjAwOSwgMHgxODBjLCAweDIxMDQsCisJMHhkMGQ0LCAweDAxZTAsIDB4NjIxNCwgMHg5Mjk0LCAweDE4MDAsIDB4MTEyOCwgMHg2MjI0LCAweDkyOTQsCisJMHgwMDAyLCAweDE1NjAsIDB4MDAzMCwgMHhjMGQ0LCAweDIwMGEsIDB4ZDBjYywgMHgwMTEwLCAweDA4MGMsCisJMHgyYzkwLCAweDYwMTQsIDB4OTA4NCwgMHhlN2ZkLCAweDkwODUsIDB4MDAxMCwgMHg2MDE2LCAweDcwM2MsCisJMHgyMDYwLCAweDIwMDksIDB4MDA0OSwgMHgwODBjLCAweGFmYmUsIDB4MDBjMCwgMHgwMDM2LCAweDIwMTksCisJMHgwMDAxLCAweDA4MGMsIDB4YTZhYywgMHgwMDNlLCAweDcxM2MsIDB4MjE2MCwgMHgwODBjLCAweGViOGUsCisJMHgyMDA5LCAweDAwNGEsIDB4NjIyMCwgMHg5Mjk2LCAweDAwMDksIDB4MTEzMCwgMHg2MTE0LCAweDIxNDgsCisJMHhhODdiLCAweDAwMDYsIDB4MjAwOSwgMHgwMDRhLCAweDA4MGMsIDB4YWZiZSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDllLCAweDAwMDUsIDB4ZDFlYywgMHgxOTA0LCAweGE0MGQsCisJMHgwODA0LCAweGE0MGYsIDB4MDBkNiwgMHgwMGM2LCAweDAwOTYsIDB4NzAzYywgMHg5MDY1LCAweDA5MGMsCisJMHgwZGQ1LCAweDIwMDEsIDB4MDMwNiwgMHgyMDBjLCAweDkxODQsIDB4MDAzMCwgMHgwOTA0LCAweGE1MGIsCisJMHg5MTg0LCAweDAwNDgsIDB4OTA4NiwgMHgwMDA4LCAweDE5MDQsIDB4YTUwYiwgMHgyMDA5LCAweDAyMDYsCisJMHgyMTA0LCAweDIwMDksIDB4MDIwMywgMHgyMTBjLCAweDkxMDYsIDB4MTkwNCwgMHhhNTBiLCAweDIwMDksCisJMHgwMjJhLCAweDIxMDQsIDB4MjAwOSwgMHgwMjJmLCAweDIxMGMsIDB4OTExNiwgMHg5MDg0LCAweDAzZmYsCisJMHg5MThjLCAweDAzZmYsIDB4OTI5NCwgMHgwNDAwLCAweDAxMTAsIDB4OTEwMiwgMHgwMDMwLCAweDIwMTAsCisJMHgyMTAwLCAweDkyMDIsIDB4MjAwOSwgMHgwMjI4LCAweDkxMDIsIDB4OTA4MiwgMHgwMDA1LCAweDAyNTAsCisJMHgyMDA4LCAweDIwMDEsIDB4MDEzYiwgMHgyMDA0LCAweDgwMDQsIDB4ODAwNCwgMHg4MDA0LCAweDkxMDIsCisJMHgxYTA0LCAweGE1MGIsIDB4MjAwOSwgMHgxYTgwLCAweDIxMDQsIDB4ODAwMCwgMHgwMjA4LCAweDIwMGEsCisJMHgyMDY5LCAweDAxMDAsIDB4NjkxNCwgMHg5MThjLCAweDAxODQsIDB4OTE4ZCwgMHgwMDEwLCAweDY5MTYsCisJMHg2OWM4LCAweDIwMTEsIDB4MDAyMCwgMHg2OGM4LCAweDkxMDYsIDB4MTU3MCwgMHg4MjExLCAweDFkZDgsCisJMHgyMDAxLCAweDAzMDYsIDB4MjAwMywgMHg0ODAwLCAweDIwMDEsIDB4MDA5YSwgMHgyMDAzLCAweDAwMDQsCisJMHgyMDAxLCAweDFhNjUsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MWE2ZSwgMHgyMDAzLCAweDAwMDAsCisJMHg2YTg4LCAweDY5OGMsIDB4MjIwMCwgMHg5MTA1LCAweDExMjAsIDB4MmMxMCwgMHgwODBjLCAweDFiZWIsCisJMHgwMDQwLCAweDYwMTQsIDB4MjA0OCwgMHhhYTNhLCAweGE5MzYsIDB4NmFjNCwgMHg2OWM4LCAweGE5NDYsCisJMHhhYTRhLCAweDAxMjYsIDB4MDBjNiwgMHgyMDkxLCAweDI0MDAsIDB4MDAyZSwgMHgwODBjLCAweDFjODQsCisJMHgxOTBjLCAweDBkZDUsIDB4MDEyZSwgMHgwMDkwLCAweDIwMDksIDB4MWE4MSwgMHgyMTA0LCAweDgwMDAsCisJMHgwMjA4LCAweDIwMGEsIDB4NjljOCwgMHgyMDExLCAweDAwMjAsIDB4ODIxMSwgMHgxZGYwLCAweDY4YzgsCisJMHg5MTA2LCAweDFkYzAsIDB4NjljNCwgMHg2OGM4LCAweDkxMDUsIDB4MDE2MCwgMHg2ODI0LCAweGQwOGMsCisJMHgwMTEwLCAweDY4MjcsIDB4MDAwMiwgMHg3MDQ4LCAweGMwODUsIDB4NzA0YSwgMHgwMDc5LCAweDcwNDgsCisJMHhjMDg0LCAweDcwNGEsIDB4MjAwOSwgMHgwN2QwLCAweDA4MGMsIDB4ODYzYiwgMHg5MDA2LCAweDAwOWUsCisJMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwgMHg5MDg1LCAweDAwMDEsIDB4MGNjOCwgMHgwMDI2LCAweDAwZTYsCisJMHgyMDcxLCAweDE5ZTYsIDB4NzA0OCwgMHhkMDg0LCAweDAxZDgsIDB4NzEzYywgMHg4MWZmLCAweDAxYzAsCisJMHgyMDcxLCAweDAxMDAsIDB4OTE4OCwgMHgwMDA4LCAweDIxMTQsIDB4OTI4ZSwgMHgwMDA2LCAweDExMzgsCisJMHg3MDE0LCAweDkwODQsIDB4MTk4NCwgMHg5MDg1LCAweDAwMTIsIDB4NzAxNiwgMHgwMDQ4LCAweDkyOGUsCisJMHgwMDA5LCAweDBkYjAsIDB4NzAxNCwgMHg5MDg0LCAweDE5ODQsIDB4OTA4NSwgMHgwMDE2LCAweDcwMTYsCisJMHgwMGVlLCAweDAwMmUsIDB4MDAwNSwgMHgwMGI2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwNjYsCisJMHgwMDU2LCAweDAwNDYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDEwLCAweDIwNTgsCisJMHhiY2EwLCAweDIwNzEsIDB4MTllNiwgMHg3MDE4LCAweDIwNTgsIDB4OGJmZiwgMHgwMTkwLCAweGI4YTAsCisJMHg5NDA2LCAweDAxMTgsIDB4Yjg1NCwgMHgyMDU4LCAweDBjYzAsIDB4NjAxNCwgMHgwMDk2LCAweDIwNDgsCisJMHhhYzZjLCAweGFkNzAsIDB4YWU3OCwgMHgwMDllLCAweDA4MGMsIDB4NjdjYiwgMHgwMTEwLCAweDkwODUsCisJMHgwMDAxLCAweDAxMmUsIDB4MDAwZSwgMHgwMDRlLCAweDAwNWUsIDB4MDA2ZSwgMHgwMGNlLCAweDAwZGUsCisJMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHgwODBjLCAweDlkMzksIDB4NzAwMywgMHgxMjAwLCAweDc4MzgsCisJMHg3MDEyLCAweDc4M2MsIDB4NzAxNiwgMHgwMGM2LCAweDc4MjAsIDB4OTA4NiwgMHgwMDA0LCAweDExNDgsCisJMHg3ODEwLCAweDkwMDUsIDB4MDEzMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgxMCwgMHhiOTE0LCAweDAwYmUsCisJMHgwMDIwLCAweDIwNjEsIDB4MTgwMCwgMHg2MDdjLCAweDYxODAsIDB4OTA4NCwgMHgwMGZmLCAweDcwMGEsCisJMHg3MTBlLCAweDAwY2UsIDB4NjBjMywgMHgwMDJjLCAweDA4MDQsIDB4YTMyYSwgMHgwODBjLCAweDlkMzksCisJMHg3MDAzLCAweDBmMDAsIDB4NzgwOCwgMHhkMDljLCAweDAxMjgsIDB4YjgxMCwgMHg5MDg0LCAweDAwZmYsCisJMHg3MDBhLCAweGI4MTQsIDB4NzAwZSwgMHg2MGMzLCAweDAwMDgsIDB4MDgwNCwgMHhhMzJhLCAweDAxNTYsCisJMHgwODBjLCAweDlkODQsIDB4NzAwMywgMHgwMjAwLCAweDA4MGMsIDB4ODY5NiwgMHgyMGE5LCAweDAwMDYsCisJMHgyMDExLCAweGZmZWMsIDB4MjAxOSwgMHhmZmVkLCAweDllZjAsIDB4MDAwMiwgMHgyMzA1LCAweDIwNzIsCisJMHg4ZTcwLCAweDIyMDUsIDB4MjA3MiwgMHg4ZTcwLCAweDkzOTgsIDB4MDAwMiwgMHg5MjkwLCAweDAwMDIsCisJMHgxZjA0LCAweGE1YTYsIDB4NjBjMywgMHgwMDFjLCAweDAxNWUsIDB4MDgwNCwgMHhhMzJhLCAweDAwMTYsCisJMHgwMDI2LCAweDA4MGMsIDB4OWQ2MCwgMHgwODBjLCAweDlkNzIsIDB4OWU4MCwgMHgwMDA0LCAweDIwZTksCisJMHgwMDAwLCAweDIwYTAsIDB4NzgxNCwgMHgwMDk2LCAweDIwNDgsIDB4YTgwMCwgMHgyMDQ4LCAweGE4NjAsCisJMHgyMGUwLCAweGE4NWMsIDB4OTA4MCwgMHgwMDIxLCAweDIwOTgsIDB4MDA5ZSwgMHg3ODA4LCAweDkwODgsCisJMHgwMDAyLCAweDIxYTgsIDB4OTE5MiwgMHgwMDEwLCAweDEyNTAsIDB4NDAwMywgMHg5MDgwLCAweDAwMDQsCisJMHg4MDAzLCAweDYwYzIsIDB4MDgwYywgMHhhMzJhLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDIwYTksCisJMHgwMDEwLCAweDQwMDMsIDB4MDgwYywgMHhhYmU5LCAweDIwYTEsIDB4MDI0MCwgMHgyMmE4LCAweDQwMDMsCisJMHgwYzY4LCAweDA4MGMsIDB4OWQzOSwgMHg3MDAzLCAweDYyMDAsIDB4NzgwOCwgMHg3MDBlLCAweDYwYzMsCisJMHgwMDA4LCAweDA4MDQsIDB4YTMyYSwgMHgwMDE2LCAweDAwMjYsIDB4MDgwYywgMHg5ZDM5LCAweDIwZTksCisJMHgwMDAwLCAweDIwYTEsIDB4MDI0YywgMHg3ODE0LCAweDAwOTYsIDB4MjA0OCwgMHhhODAwLCAweDIwNDgsCisJMHhhODYwLCAweDIwZTAsIDB4YTg1YywgMHg5MDgwLCAweDAwMjMsIDB4MjA5OCwgMHgwMDllLCAweDc4MDgsCisJMHg5MDg4LCAweDAwMDIsIDB4MjFhOCwgMHg0MDAzLCAweDgwMDMsIDB4NjBjMiwgMHgwODBjLCAweGEzMmEsCisJMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwYzYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDIwNzEsIDB4MTllNiwgMHg3MDBjLCAweDIwNjAsIDB4OGNmZiwgMHgwMTc4LCAweDA4MGMsCisJMHhjZThlLCAweDExMTAsIDB4MDgwYywgMHhiOTA1LCAweDYwMGMsIDB4MDAwNiwgMHgwODBjLCAweGQwZmEsCisJMHgwODBjLCAweGFmNDMsIDB4MDgwYywgMHhhNzYxLCAweDAwY2UsIDB4MGM3OCwgMHgyYzAwLCAweDcwMGUsCisJMHg3MDBhLCAweDAxMmUsIDB4MDAwZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHgwMTI2LCAweDAxNTYsCisJMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwNjYsIDB4MDAyNiwgMHgwMDE2LCAweDAwMDYsCisJMHgyMDkxLCAweDgwMDAsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4OTE4YywgMHhlN2ZmLCAweDIxMDIsCisJMHgyMDY5LCAweDAxMDAsIDB4MjA3OSwgMHgwMTQwLCAweDIwNzEsIDB4MTllNiwgMHg3MDI0LCAweDIwNjAsCisJMHg4Y2ZmLCAweDAxZjgsIDB4MDgwYywgMHhhMzU2LCAweDZhYzAsIDB4NjhjMywgMHgwMDAwLCAweDA4MGMsCisJMHg4NjM2LCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDA4MGMsIDB4YWQzYSwgMHgwMGNlLCAweDIwYTksCisJMHgwMWY0LCAweDA0NjEsIDB4MjAwOSwgMHgwMDEzLCAweDA4MGMsIDB4YWZiZSwgMHgwMDBlLCAweDAwMWUsCisJMHgwMDJlLCAweDAwNmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMTVlLCAweDAxMmUsCisJMHgwMDA1LCAweDIwMDEsIDB4MTgwMCwgMHgyMDA0LCAweDkwOTYsIDB4MDAwMSwgMHgwZDc4LCAweDkwOTYsCisJMHgwMDA0LCAweDBkNjAsIDB4MDgwYywgMHg4NjM2LCAweDY4MTQsIDB4OTA4NCwgMHgwMDAxLCAweDAxMTAsCisJMHg2OGE3LCAweDk1ZjUsIDB4NjgxNywgMHgwMDA4LCAweDY4YzMsIDB4MDAwMCwgMHgyMDExLCAweDVmMTYsCisJMHgwODBjLCAweDg1YjAsIDB4MjBhOSwgMHgwMWY0LCAweDAwMDksIDB4MDhjMCwgMHg2ODI0LCAweGQwOTQsCisJMHgwMTQwLCAweDY4MjcsIDB4MDAwNCwgMHg3ODA0LCAweDkwODQsIDB4NDAwMCwgMHgxOTBjLCAweDJkNWUsCisJMHgwMDkwLCAweGQwODQsIDB4MDExOCwgMHg2ODI3LCAweDAwMDEsIDB4MDAxMCwgMHgxZjA0LCAweGE2OGUsCisJMHg3ODA0LCAweDkwODQsIDB4MTAwMCwgMHgwMTM4LCAweDIwMDEsIDB4MDEwMCwgMHgwODBjLCAweDJkNGUsCisJMHg5MDA2LCAweDA4MGMsIDB4MmQ0ZSwgMHgwMDA1LCAweDAxMjYsIDB4MDE1NiwgMHgwMGY2LCAweDAwZTYsCisJMHgwMGQ2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDI2LCAweDAwMTYsIDB4MDAwNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHg5MThjLCAweGRiZmYsIDB4MjEwMiwgMHgyMDY5LCAweDAxMDAsCisJMHgyMDc5LCAweDAxNDAsIDB4MjA3MSwgMHgxOWU2LCAweDcwM2MsIDB4MjA2MCwgMHg4Y2ZmLCAweDA5MDQsCisJMHhhNzE3LCAweDkzODYsIDB4MDAwMiwgMHgxMTI4LCAweDY4MTQsIDB4OTA4NCwgMHgwMDAyLCAweDA5MDQsCisJMHhhNzE3LCAweDY4YWYsIDB4OTVmNSwgMHg2ODE3LCAweDAwMTAsIDB4MjAwOSwgMHgwMGZhLCAweDgxMDksCisJMHgxZGYwLCAweDY5YzYsIDB4NjhjYiwgMHgwMDA4LCAweDA4MGMsIDB4ODY0MywgMHgwODBjLCAweDIwMzgsCisJMHgyMDAxLCAweDAwMzIsIDB4NjkyMCwgMHhkMWJjLCAweDAxMzAsIDB4ODAwMSwgMHgxZGQ4LCAweDY5MmMsCisJMHg5MThkLCAweDAwMDgsIDB4NjkyZSwgMHgyMGE5LCAweDAzZTgsIDB4NjgyNCwgMHhkMDk0LCAweDAxNDAsCisJMHg2ODI3LCAweDAwMDQsIDB4NzgwNCwgMHg5MDg0LCAweDQwMDAsIDB4MTkwYywgMHgyZDVlLCAweDAwOTAsCisJMHhkMDhjLCAweDAxMTgsIDB4NjgyNywgMHgwMDAyLCAweDAwMTAsIDB4MWYwNCwgMHhhNmVkLCAweDc4MDQsCisJMHg5MDg0LCAweDEwMDAsIDB4MDEzOCwgMHgyMDAxLCAweDAxMDAsIDB4MDgwYywgMHgyZDRlLCAweDkwMDYsCisJMHgwODBjLCAweDJkNGUsIDB4NjgyNywgMHg0MDAwLCAweDY4MjQsIDB4ODNmZiwgMHgxMTQwLCAweDIwMDksCisJMHgwMDQ5LCAweDYwMjAsIDB4OTA4NiwgMHgwMDA5LCAweDAxMTAsIDB4MDgwYywgMHhhZmJlLCAweDAwMGUsCisJMHgwMDFlLCAweDAwMmUsIDB4MDA2ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAxNWUsCisJMHgwMTJlLCAweDAwMDUsIDB4MDBkNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDY5LCAweDE5ZTYsCisJMHg2YTA2LCAweDAxMmUsIDB4MDBkZSwgMHgwMDA1LCAweDAwZDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDY5LCAweDE5ZTYsIDB4NmEzMiwgMHgwMTJlLCAweDAwZGUsIDB4MDAwNSwgMHgwODBjLCAweDllZmMsCisJMHg3ODU0LCAweDcwMzIsIDB4NzA0MiwgMHg3MDQ3LCAweDEwMDAsIDB4MDBmOCwgMHgwODBjLCAweDllZmMsCisJMHg3ODU0LCAweDcwMzIsIDB4NzA0MiwgMHg3MDQ3LCAweDQwMDAsIDB4MDBiOCwgMHgwODBjLCAweDllZmMsCisJMHg3ODU0LCAweDcwMzIsIDB4NzA0MiwgMHg3MDQ3LCAweDIwMDAsIDB4MDA3OCwgMHgwODBjLCAweDllZmMsCisJMHg3ODU0LCAweDcwMzIsIDB4NzA0MiwgMHg3MDQ3LCAweDA0MDAsIDB4MDAzOCwgMHgwODBjLCAweDllZmMsCisJMHg3ODU0LCAweDcwMzIsIDB4NzA0MiwgMHg3MDQ3LCAweDAyMDAsIDB4NjBjMywgMHgwMDIwLCAweDA4MDQsCisJMHhhMzJhLCAweDAwZTYsIDB4MjA3MSwgMHgxOWU2LCAweDcwMjAsIDB4OTAwNSwgMHgwMTEwLCAweDgwMDEsCisJMHg3MDIyLCAweDAwZWUsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwNzYsCisJMHgwMDY2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgxOWU2LCAweDc2MTQsCisJMHgyNjYwLCAweDI2NzgsIDB4MjAzOSwgMHgwMDAxLCAweDg3ZmYsIDB4MDkwNCwgMHhhODA2LCAweDhjZmYsCisJMHgwOTA0LCAweGE4MDYsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDYsIDB4MTkwNCwgMHhhODAxLCAweDg4ZmYsCisJMHgwMTM4LCAweDI4MDAsIDB4OWMwNiwgMHgxOTA0LCAweGE4MDEsIDB4MjAzOSwgMHgwMDAwLCAweDAwNTAsCisJMHg2MDEwLCAweDliMDYsIDB4MTkwNCwgMHhhODAxLCAweDg1ZmYsIDB4MDEyMCwgMHg2MDU0LCAweDkxMDYsCisJMHgxOTA0LCAweGE4MDEsIDB4NzAyNCwgMHg5YzA2LCAweDE1YjAsIDB4MjA2OSwgMHgwMTAwLCAweDY4YzAsCisJMHg5MDA1LCAweDExNjAsIDB4NjgyNCwgMHhkMDg0LCAweDAxNDgsIDB4NjgyNywgMHgwMDAxLCAweDA4MGMsCisJMHg4NjM2LCAweDA4MGMsIDB4YTg4YiwgMHg3MDI3LCAweDAwMDAsIDB4MDQyOCwgMHgwODBjLCAweDg2MzYsCisJMHg2ODIwLCAweGQwYjQsIDB4MDExMCwgMHg2OGE3LCAweDk1ZjUsIDB4NjgxNywgMHgwMDA4LCAweDY4YzMsCisJMHgwMDAwLCAweDA4MGMsIDB4YTg4YiwgMHg3MDI3LCAweDAwMDAsIDB4MDAzNiwgMHgyMDY5LCAweDAxNDAsCisJMHg2YjA0LCAweDkzODQsIDB4MTAwMCwgMHgwMTM4LCAweDIwMDEsIDB4MDEwMCwgMHgwODBjLCAweDJkNGUsCisJMHg5MDA2LCAweDA4MGMsIDB4MmQ0ZSwgMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwgMHhkMDg0LCAweDAxMTAsCisJMHg2ODI3LCAweDAwMDEsIDB4MDAzZSwgMHg3MDE0LCAweDljMzYsIDB4MTExMCwgMHg2NjBjLCAweDc2MTYsCisJMHg3MDEwLCAweDljMzYsIDB4MTE0MCwgMHgyYzAwLCAweDlmMzYsIDB4MDExOCwgMHgyZjAwLCAweDcwMTIsCisJMHgwMDEwLCAweDcwMTMsIDB4MDAwMCwgMHg2NjBjLCAweDAwNjYsIDB4MmMwMCwgMHg5ZjA2LCAweDAxMTAsCisJMHg3ZTBlLCAweDAwMDgsIDB4MjY3OCwgMHg4OWZmLCAweDExNjgsIDB4NjAwZiwgMHgwMDAwLCAweDYwMTQsCisJMHgwMDk2LCAweDIwNDgsIDB4MDgwYywgMHhjYzg0LCAweDAxMTAsIDB4MDgwYywgMHhlNmRkLCAweDAwOWUsCisJMHgwODBjLCAweGFmNzQsIDB4MDgwYywgMHhhNzYxLCAweDg4ZmYsIDB4MTE5MCwgMHgwMGNlLCAweDA4MDQsCisJMHhhNzdjLCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDA4MDQsIDB4YTc3YywgMHg5MDA2LCAweDAxMmUsCisJMHgwMDBlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsCisJMHg2MDFiLCAweDAwMDAsIDB4MDBjZSwgMHg5OGM1LCAweDAwMDEsIDB4MGM4OCwgMHgwMGY2LCAweDAwZTYsCisJMHgwMGQ2LCAweDAwOTYsIDB4MDBjNiwgMHgwMDY2LCAweDAwMjYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDIwNzEsIDB4MTllNiwgMHg3NjM4LCAweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLCAweDA5MDQsCisJMHhhODdhLCAweDYwMjAsIDB4OTA4NiwgMHgwMDA2LCAweDE5MDQsIDB4YTg3NSwgMHg4N2ZmLCAweDAxMjgsCisJMHgyNzAwLCAweDljMDYsIDB4MTkwNCwgMHhhODc1LCAweDAwNDAsIDB4NjAxMCwgMHg5YjA2LCAweDE1ZTgsCisJMHg4NWZmLCAweDAxMTgsIDB4NjA1NCwgMHg5MTA2LCAweDE1YzAsIDB4NzAzYywgMHg5YzA2LCAweDExNjgsCisJMHgwMDM2LCAweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweGE2YWMsIDB4NzAzMywgMHgwMDAwLCAweDkwMDYsCisJMHg3MDNlLCAweDcwNDIsIDB4NzA0NiwgMHg3MDRhLCAweDAwM2UsIDB4NzAzOCwgMHg5YzM2LCAweDExMTAsCisJMHg2NjBjLCAweDc2M2EsIDB4NzAzNCwgMHg5YzM2LCAweDExNDAsIDB4MmMwMCwgMHg5ZjM2LCAweDAxMTgsCisJMHgyZjAwLCAweDcwMzYsIDB4MDAxMCwgMHg3MDM3LCAweDAwMDAsIDB4NjYwYywgMHgwMDY2LCAweDJjMDAsCisJMHg5ZjA2LCAweDAxMTAsIDB4N2UwZSwgMHgwMDA4LCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLCAweDYwMTQsCisJMHgyMDQ4LCAweDA4MGMsIDB4Y2M4NCwgMHgwMTEwLCAweDA4MGMsIDB4ZTZkZCwgMHgwODBjLCAweGFmNzQsCisJMHg4N2ZmLCAweDExOTgsIDB4MDBjZSwgMHgwODA0LCAweGE4MjYsIDB4MmM3OCwgMHg2MDBjLCAweDIwNjAsCisJMHgwODA0LCAweGE4MjYsIDB4OTAwNiwgMHgwMTJlLCAweDAwMGUsIDB4MDAyZSwgMHgwMDZlLCAweDAwY2UsCisJMHgwMDllLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4NjAxYiwgMHgwMDAwLCAweDAwY2UsCisJMHg5N2JkLCAweDAwMDEsIDB4MGM4MCwgMHgwMGU2LCAweDIwNzEsIDB4MTllNiwgMHgyMDAxLCAweDE4MDAsCisJMHgyMDA0LCAweDkwODYsIDB4MDAwMiwgMHgxMTE4LCAweDcwMDcsIDB4MDAwNSwgMHgwMDEwLCAweDcwMDcsCisJMHgwMDAwLCAweDAwZWUsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MDBjNiwgMHgwMDY2LCAweDAwMjYsCisJMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MTllNiwgMHgyYzEwLCAweDc2MzgsCisJMHgyNjYwLCAweDI2NzgsIDB4OGNmZiwgMHgwNTQwLCAweDIyMDAsIDB4OWMwNiwgMHgxNTA4LCAweDcwMzgsCisJMHg5YzM2LCAweDExMTAsIDB4NjYwYywgMHg3NjNhLCAweDcwMzQsIDB4OWMzNiwgMHgxMTQwLCAweDJjMDAsCisJMHg5ZjM2LCAweDAxMTgsIDB4MmYwMCwgMHg3MDM2LCAweDAwMTAsIDB4NzAzNywgMHgwMDAwLCAweDY2MGMsCisJMHgyYzAwLCAweDlmMDYsIDB4MDExMCwgMHg3ZTBlLCAweDAwMDgsIDB4MjY3OCwgMHg2MDBmLCAweDAwMDAsCisJMHg2MDA0LCAweDkwODYsIDB4MDA0MCwgMHgwOTBjLCAweDk2NTcsIDB4OTA4NSwgMHgwMDAxLCAweDAwMjAsCisJMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwOGIwLCAweDAxMmUsIDB4MDAwZSwgMHgwMDJlLCAweDAwNmUsCisJMHgwMGNlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDAwOTYsIDB4MDBmNiwgMHgwMGU2LCAweDAwZDYsCisJMHgwMGM2LCAweDAwNjYsIDB4MDAyNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsCisJMHgxOWU2LCAweDc2MGMsIDB4MjY2MCwgMHgyNjc4LCAweDhjZmYsIDB4MDkwNCwgMHhhOTcxLCAweDYwMTAsCisJMHgwMGI2LCAweDIwNTgsIDB4YjhhMCwgMHgwMGJlLCAweDkyMDYsIDB4MTkwNCwgMHhhOTZjLCAweDcwMjQsCisJMHg5YzA2LCAweDE1MjAsIDB4MjA2OSwgMHgwMTAwLCAweDY4YzAsIDB4OTAwNSwgMHgwOTA0LCAweGE5NDMsCisJMHgwODBjLCAweGEzNTYsIDB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4YTg4YiwgMHg3MDI3LCAweDAwMDAsCisJMHgwMDM2LCAweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweDkzODQsIDB4MTAwMCwgMHgwMTM4LCAweDIwMDEsCisJMHgwMTAwLCAweDA4MGMsIDB4MmQ0ZSwgMHg5MDA2LCAweDA4MGMsIDB4MmQ0ZSwgMHgyMDY5LCAweDAxMDAsCisJMHg2ODI0LCAweGQwODQsIDB4MDExMCwgMHg2ODI3LCAweDAwMDEsIDB4MDAzZSwgMHg3MDBjLCAweDljMzYsCisJMHgxMTEwLCAweDY2MGMsIDB4NzYwZSwgMHg3MDA4LCAweDljMzYsIDB4MTE0MCwgMHgyYzAwLCAweDlmMzYsCisJMHgwMTE4LCAweDJmMDAsIDB4NzAwYSwgMHgwMDEwLCAweDcwMGIsIDB4MDAwMCwgMHg2NjBjLCAweDAwNjYsCisJMHgyYzAwLCAweDlmMDYsIDB4MDExMCwgMHg3ZTBlLCAweDAwMDgsIDB4MjY3OCwgMHg2MDBmLCAweDAwMDAsCisJMHgwODBjLCAweGNlN2QsIDB4MTE4MCwgMHgwODBjLCAweDMyNDcsIDB4MDgwYywgMHhjZThlLCAweDE1MTgsCisJMHgwODBjLCAweGI5MDUsIDB4MDQwMCwgMHgwODBjLCAweGE4OGIsIDB4NjgyNCwgMHhkMDg0LCAweDA5YjAsCisJMHg2ODI3LCAweDAwMDEsIDB4MDg5OCwgMHgwODBjLCAweGNlOGUsIDB4MTExOCwgMHgwODBjLCAweGI5MDUsCisJMHgwMDkwLCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGNjODQsIDB4MDE2OCwgMHg2MDIwLCAweDkwODYsCisJMHgwMDAzLCAweDE1MDgsIDB4YTg2NywgMHgwMTAzLCAweGFiN2EsIDB4YTg3NywgMHgwMDAwLCAweDA4MGMsCisJMHg2ZDBiLCAweDA4MGMsIDB4Y2U3MSwgMHgwODBjLCAweGQwZmEsIDB4MDgwYywgMHhhZjc0LCAweDA4MGMsCisJMHhhNzYxLCAweDAwY2UsIDB4MDgwNCwgMHhhOGVjLCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDA4MDQsCisJMHhhOGVjLCAweDAxMmUsIDB4MDAwZSwgMHgwMDJlLCAweDAwNmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsCisJMHgwMGZlLCAweDAwOWUsIDB4MDAwNSwgMHg2MDIwLCAweDkwODYsIDB4MDAwNiwgMHgxZDIwLCAweDA4MGMsCisJMHhlNmRkLCAweDBjMDgsIDB4MDBkNiwgMHgwODBjLCAweDlkODQsIDB4NzAwMywgMHgwMjAwLCAweDcwMDcsCisJMHgwMDE0LCAweDYwYzMsIDB4MDAxNCwgMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwgMHgxOTg4LCAweDIwZTksCisJMHgwMDAwLCAweDIwYTEsIDB4MDI1MCwgMHgyMGE5LCAweDAwMDQsIDB4NDAwMywgMHg3MDIzLCAweDAwMDQsCisJMHg3MDI3LCAweDc4NzgsIDB4MDgwYywgMHhhMzJhLCAweDAwZGUsIDB4MDAwNSwgMHgwODBjLCAweDlkODQsCisJMHg3MDBiLCAweDA4MDAsIDB4NzgxNCwgMHg5MDg0LCAweGZmMDAsIDB4NzAwZSwgMHg3ODE0LCAweDkwODQsCisJMHgwMGZmLCAweDcwMjIsIDB4NzgyYywgMHg3MDI2LCAweDc4NTgsIDB4OTA4NCwgMHgwMGZmLCAweDkwODUsCisJMHgwMjAwLCAweDcwMDIsIDB4Nzg1OCwgMHg5MDg0LCAweGZmMDAsIDB4ODAwNywgMHg3MDA2LCAweDYwYzIsCisJMHgwODA0LCAweGEzMmEsIDB4MDBiNiwgMHgwMGQ2LCAweDAwMTYsIDB4MDBkNiwgMHgyZjY4LCAweDIwMDksCisJMHgwMDM1LCAweDA4MGMsIDB4ZDMwMCwgMHgwMGRlLCAweDE5MDQsIDB4YWExZiwgMHgwODBjLCAweDlkMzksCisJMHg3MDAzLCAweDEzMDAsIDB4NzgyYywgMHgwODBjLCAweGFiMjUsIDB4MjA2OCwgMHg2ODIwLCAweDkwODYsCisJMHgwMDAzLCAweDA1NjAsIDB4NzgxMCwgMHgyMDU4LCAweGJhYTAsIDB4MDgwYywgMHhhZWFkLCAweDExZDgsCisJMHg5Mjg2LCAweDAwN2UsIDB4MTEyOCwgMHg3MDBiLCAweDAwZmYsIDB4NzAwZiwgMHhmZmZlLCAweDA0OTgsCisJMHg5Mjg2LCAweDAwN2YsIDB4MTEyOCwgMHg3MDBiLCAweDAwZmYsIDB4NzAwZiwgMHhmZmZkLCAweDA0NTgsCisJMHg5Mjg0LCAweGZmODAsIDB4MDE4MCwgMHg5Mjg2LCAweDAwODAsIDB4MTEyOCwgMHg3MDBiLCAweDAwZmYsCisJMHg3MDBmLCAweGZmZmMsIDB4MDQwMCwgMHg5MmQ4LCAweDEwMDAsIDB4MmI1YywgMHhiODEwLCAweDcwMGEsCisJMHhiODE0LCAweDcwMGUsIDB4MDBjMCwgMHg2MDk4LCAweDcwMGUsIDB4MDBhOCwgMHgwODBjLCAweGFlYWQsCisJMHgxMTMwLCAweDc4MTAsIDB4MjA1OCwgMHhiOGEwLCAweDkwODIsIDB4MDA3ZSwgMHgwMjUwLCAweDAwZDYsCisJMHgyMDY5LCAweDE4MWYsIDB4MmQwNCwgMHg3MDBhLCAweDhkNjgsIDB4MmQwNCwgMHg3MDBlLCAweDAwZGUsCisJMHgwMDEwLCAweDYwMzQsIDB4NzAwZSwgMHg3ODM4LCAweDcwMTIsIDB4NzgzYywgMHg3MDE2LCAweDYwYzMsCisJMHgwMDBjLCAweDAwMWUsIDB4MDBkZSwgMHgwODBjLCAweGEzMmEsIDB4MDBiZSwgMHgwMDA1LCAweDc4MWIsCisJMHgwMDAxLCAweDc4MDMsIDB4MDAwNiwgMHgwMDFlLCAweDAwZGUsIDB4MDBiZSwgMHgwMDA1LCAweDc5MmMsCisJMHg5MTgwLCAweDAwMDgsIDB4MjAwYywgMHg5MTg2LCAweDAwMDYsIDB4MDFjMCwgMHg5MTg2LCAweDAwMDMsCisJMHgwOTA0LCAweGFhOWEsIDB4OTE4NiwgMHgwMDA1LCAweDA5MDQsIDB4YWE4MiwgMHg5MTg2LCAweDAwMDQsCisJMHgwNWQ4LCAweDkxODYsIDB4MDAwOCwgMHgwOTA0LCAweGFhOGIsIDB4NzgwNywgMHgwMDM3LCAweDc4MmYsCisJMHgwMDAzLCAweDc4MTcsIDB4MTcwMCwgMHgwODBjLCAweGFiMDIsIDB4MDAwNSwgMHgwODBjLCAweGFhYzMsCisJMHgwMGQ2LCAweDAwMjYsIDB4NzkyYywgMHgyMTY4LCAweDIwMDksIDB4NDAwMCwgMHg2ODAwLCAweDAwMDIsCisJMHhhYTYzLCAweGFhNmUsIDB4YWE2NSwgMHhhYTZlLCAweGFhNmEsIDB4YWE2MywgMHhhYTYzLCAweGFhNmUsCisJMHhhYTZlLCAweGFhNmUsIDB4YWE2ZSwgMHhhYTYzLCAweGFhNjMsIDB4YWE2MywgMHhhYTYzLCAweGFhNjMsCisJMHhhYTZlLCAweGFhNjMsIDB4YWE2ZSwgMHgwODBjLCAweDBkZDUsIDB4NjgyNCwgMHhkMGU0LCAweDAxMTAsCisJMHhkMGNjLCAweDAxMTAsIDB4OTAwZSwgMHgwMDEwLCAweDIwMDksIDB4MjAwMCwgMHg2ODJjLCAweDcwMjIsCisJMHg2ODMwLCAweDcwMjYsIDB4MDgwNCwgMHhhYWJjLCAweDA4MGMsIDB4YWFjMywgMHgwMGQ2LCAweDAwMjYsCisJMHg3OTJjLCAweDIxNjgsIDB4MjAwOSwgMHg0MDAwLCAweDZhMDAsIDB4OTI4NiwgMHgwMDAyLCAweDExMDgsCisJMHg5MDBlLCAweDA0ZDAsIDB4MDgwYywgMHhhYWMzLCAweDAwZDYsIDB4MDAyNiwgMHg3OTJjLCAweDIxNjgsCisJMHgyMDA5LCAweDQwMDAsIDB4MDQ4OCwgMHgwNGI5LCAweDAwZDYsIDB4MDAyNiwgMHg3OTJjLCAweDIxNjgsCisJMHgyMDA5LCAweDQwMDAsIDB4OTI4NiwgMHgwMDA1LCAweDAxMTgsIDB4OTI4NiwgMHgwMDAyLCAweDExMDgsCisJMHg5MDBlLCAweDA0MTAsIDB4MDQ0MSwgMHgwMGQ2LCAweDAwMjYsIDB4NzkyYywgMHgyMTY4LCAweDY4MTQsCisJMHg2OTI0LCAweGMxODUsIDB4NjkyNiwgMHgwMDk2LCAweDIwNDgsIDB4YTlhYywgMHhhODM0LCAweDkxMTIsCisJMHhhOWIwLCAweGE4MzgsIDB4MDA5ZSwgMHg5MTAzLCAweDcwMjIsIDB4NzIyNiwgMHg3OTJjLCAweDkxODAsCisJMHgwMDAwLCAweDIwMDQsIDB4OTA4ZSwgMHgwMDAyLCAweDAxMzAsIDB4OTA4ZSwgMHgwMDA0LCAweDAxMTgsCisJMHgyMDA5LCAweDQwMDAsIDB4MDAwOCwgMHg5MDBlLCAweDcxMmEsIDB4NjBjMywgMHgwMDE4LCAweDAwMmUsCisJMHgwMGRlLCAweDA4MDQsIDB4YTMyYSwgMHgwMGI2LCAweDAwMzYsIDB4MDA0NiwgMHgwMDU2LCAweDAwNjYsCisJMHgwODBjLCAweDlkODQsIDB4OTAwNiwgMHg3MDAzLCAweDAyMDAsIDB4NzkzOCwgMHg3MTBhLCAweDc5M2MsCisJMHg3MTBlLCAweDc4MTAsIDB4MjA1OCwgMHhiOGEwLCAweDA4MGMsIDB4YWVhZCwgMHgxMTE4LCAweDkwOTIsCisJMHgwMDdlLCAweDAyNjgsIDB4MDBkNiwgMHgyMDY5LCAweDE4MWYsIDB4MmQyYywgMHg4ZDY4LCAweDJkMzQsCisJMHg5MGQ4LCAweDEwMDAsIDB4MmI1YywgMHhiYjEwLCAweGJjMTQsIDB4MDBkZSwgMHgwMDI4LCAweDkwMWUsCisJMHg2NDk4LCAweDIwMjksIDB4MDAwMCwgMHg2NjM0LCAweDc4MmMsIDB4OTA4MCwgMHgwMDA4LCAweDIwMDQsCisJMHg5MDg2LCAweDAwMDMsIDB4MTEyOCwgMHg3NTEyLCAweDc2MTYsIDB4NzMxYSwgMHg3NDFlLCAweDAwMjAsCisJMHg3MzEyLCAweDc0MTYsIDB4NzUxYSwgMHg3NjFlLCAweDAwNmUsIDB4MDA1ZSwgMHgwMDRlLCAweDAwM2UsCisJMHgwMGJlLCAweDAwMDUsIDB4MDgwYywgMHg5ZDg0LCAweDcwMDMsIDB4MDEwMCwgMHg3ODJjLCAweDcwMGEsCisJMHg3ODE0LCAweDcwMGUsIDB4NzAwZSwgMHg2MGMzLCAweDAwMDgsIDB4MDgwNCwgMHhhMzJhLCAweDA4MGMsCisJMHg5ZDMwLCAweDcwMDMsIDB4MTQwMCwgMHg3ODM4LCAweDcwMGEsIDB4MDA3OSwgMHg3ODNjLCAweDcwMGUsCisJMHg3ODJjLCAweDcwMTIsIDB4NzgzMCwgMHg3MDE2LCAweDc4MzQsIDB4OTA4NCwgMHgwMGZmLCAweDgwMDcsCisJMHg3MDFhLCAweDYwYzMsIDB4MDAxMCwgMHgwODA0LCAweGEzMmEsIDB4MDBlNiwgMHgyMDcxLCAweDAyNDAsCisJMHgwMDA2LCAweDAwZjYsIDB4MjA3OCwgMHg3ODEwLCAweDAwYjYsIDB4MjA1OCwgMHhiOGNjLCAweGQwODQsCisJMHgwMTIwLCAweDc4NDQsIDB4NzAyYSwgMHg3ODQ4LCAweDcwMmUsIDB4MDBiZSwgMHgwMGZlLCAweDAwMGUsCisJMHgwMGVlLCAweDAwMDUsIDB4MDgwYywgMHg5ZDdiLCAweDcwMDMsIDB4MDEwMCwgMHg3ODJjLCAweDcwMGEsCisJMHg3ODE0LCAweDcwMGUsIDB4NjBjMywgMHgwMDA4LCAweDA4MDQsIDB4YTMyYSwgMHgwMDIxLCAweDYwYzMsCisJMHgwMDAwLCAweDA4MDQsIDB4YTMyYSwgMHgwMGQ2LCAweDA4MGMsIDB4YWJmZSwgMHhiODEwLCAweDkwODUsCisJMHgwMzAwLCAweDcwMDIsIDB4YjgxNCwgMHg3MDA2LCAweDIwNjksIDB4MTgwMCwgMHg2ODdjLCAweDcwMGEsCisJMHg2ODgwLCAweDcwMGUsIDB4NzAxMywgMHgwODE5LCAweDA4MGMsIDB4YTMxOCwgMHg3MjFhLCAweDJmMTAsCisJMHg3MjIyLCAweDdhMDgsIDB4NzIyNiwgMHgyMDcxLCAweDAyNGMsIDB4MDBkZSwgMHgwMDA1LCAweDAwYTksCisJMHg3OTE0LCAweDcxMmEsIDB4NjBjMywgMHgwMDAwLCAweDYwYTcsIDB4OTU3NSwgMHgwMDI2LCAweDA4MGMsCisJMHgyYmUzLCAweDAyMjgsIDB4MjAxMSwgMHgwMTAxLCAweDIyMDQsIDB4YzBjNSwgMHgyMDEyLCAweDAwMmUsCisJMHgwODBjLCAweGEzNGQsIDB4MDgwYywgMHg4NjJkLCAweDAwMDUsIDB4MDAzNiwgMHgwMDk2LCAweDAwZDYsCisJMHgwMGU2LCAweDc4NTgsIDB4MjA0OCwgMHhhYTdjLCAweDkyOTYsIDB4MDBjMCwgMHg5Mjk0LCAweGZmZmQsCisJMHhhYTdlLCAweGFhODAsIDB4OTI5NCwgMHgwMzAwLCAweGFhODIsIDB4YTk2YywgMHg5MTk0LCAweDAwZmYsCisJMHhhYjc0LCAweDkzODQsIDB4MDBmZiwgMHg5MDhkLCAweGMyMDAsIDB4YTk2ZSwgMHg5Mzg0LCAweGZmMDAsCisJMHg5MjE1LCAweGFhNzYsIDB4YTg3MCwgMHhhYTc4LCAweGE4N2EsIDB4YWE3MiwgMHgwMGQ2LCAweDIwNjksCisJMHgwMjAwLCAweDA4MGMsIDB4YWJmZSwgMHgwMGRlLCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNDAsCisJMHgyMGE5LCAweDAwMGEsIDB4YTg2MCwgMHgyMGUwLCAweGE4NWMsIDB4OTA4MCwgMHgwMDFiLCAweDIwOTgsCisJMHg0MDAzLCAweDYwYTMsIDB4MDAzNSwgMHhhYTY4LCAweDkyOTQsIDB4NzAwMCwgMHg5Mjg2LCAweDMwMDAsCisJMHgwMTEwLCAweDYwYTMsIDB4MDAzNywgMHgwMGVlLCAweDAwZGUsIDB4MDA5ZSwgMHgwMDNlLCAweDAwMDUsCisJMHg5MDBlLCAweDc4MTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4N2MsIDB4ZDBmYywgMHgwMWMwLCAweDkwODQsCisJMHgwMDAzLCAweDExYTgsIDB4MjAwMSwgMHgxODBjLCAweDIwMDQsIDB4ZDBiYywgMHgwMTgwLCAweDc4MjQsCisJMHhkMGNjLCAweDExNjgsIDB4ZDBjNCwgMHgxMTU4LCAweGE4YTgsIDB4OTAwNSwgMHgxMTQwLCAweDIwMDEsCisJMHgxODBjLCAweDIwMGMsIDB4YzFkNSwgMHgyMTAyLCAweDIwMDksIDB4MTliMSwgMHgyMTBjLCAweDAwOWUsCisJMHg5MThkLCAweDAwOTIsIDB4MDAxMCwgMHgyMDA5LCAweDAwOTYsIDB4NjBhYiwgMHgwMDM2LCAweDYxMTYsCisJMHgwMDA1LCAweDIwMDksIDB4MDAwOSwgMHgwMGEwLCAweDIwMDksIDB4MDAwYSwgMHgwMDg4LCAweDIwMDksCisJMHgwMDBiLCAweDAwNzAsIDB4MjAwOSwgMHgwMDBjLCAweDAwNTgsIDB4MjAwOSwgMHgwMDBkLCAweDAwNDAsCisJMHgyMDA5LCAweDAwMGUsIDB4MDAyOCwgMHgyMDA5LCAweDAwMGYsIDB4MDAxMCwgMHgyMDA5LCAweDAwMDgsCisJMHg2OTEyLCAweDAwMDUsIDB4MDgwYywgMHg5ZDM5LCAweDAwMTYsIDB4MDAyNiwgMHgwMDk2LCAweDAwZDYsCisJMHg3ODE0LCAweDIwNDgsIDB4NzAxMywgMHgwMTM4LCAweDIwMDEsIDB4MTgzNywgMHgyMDA0LCAweDkwODQsCisJMHgwMDI4LCAweDExMzgsIDB4MjAwMSwgMHgxOTdiLCAweDIwMDQsIDB4OTA4NiwgMHhhYWFhLCAweDE5MDQsCisJMHhhY2EzLCAweDcwMDMsIDB4NTQwMCwgMHgwMGM2LCAweDIwNjEsIDB4MTgwMCwgMHg2MDdjLCAweDkwODQsCisJMHgwMGZmLCAweGE5OTgsIDB4ODEwZiwgMHg5MThjLCAweGZmMDAsIDB4OTEwNSwgMHg3MDBhLCAweDYwODAsCisJMHg3MDBlLCAweGE5OTgsIDB4OTE4YywgMHhmZjAwLCAweDcxMTIsIDB4MjBhOSwgMHgwMDA0LCAweDIwMDksCisJMHgxODA1LCAweDJlMTAsIDB4OTI5MCwgMHgwMDA2LCAweDIxMDQsIDB4MjAxMiwgMHg4MTA4LCAweDgyMTAsCisJMHgxZjA0LCAweGFjMzQsIDB4MjBhOSwgMHgwMDA0LCAweDIwMDksIDB4MTgwMSwgMHgyMTA0LCAweDIwMTIsCisJMHg4MTA4LCAweDgyMTAsIDB4MWYwNCwgMHhhYzNlLCAweGE4NjAsIDB4MjBlMCwgMHhhODVjLCAweDkwODAsCisJMHgwMDI5LCAweDIwOTgsIDB4MjAwOSwgMHgwMDA2LCAweDIwYTksIDB4MDAwMSwgMHg0MDAyLCAweDgwMDcsCisJMHgyMDEyLCAweDgyMTAsIDB4ODEwOSwgMHgxZGMwLCAweDAwZDYsIDB4MjA2OSwgMHgwMjAwLCAweDA4MGMsCisJMHhhYmU5LCAweDAwZGUsIDB4MjA3MSwgMHgwMjQwLCAweDIwMTEsIDB4MDI0MCwgMHgyMDA5LCAweDAwMDIsCisJMHgyMGE5LCAweDAwMDEsIDB4NDAwMiwgMHg4MDA3LCAweDIwMTIsIDB4ODIxMCwgMHg4MTA5LCAweDFkYzAsCisJMHgyMDA5LCAweDAwMDgsIDB4MjBhOSwgMHgwMDAxLCAweDQwMDIsIDB4ODAwNywgMHgyMDEyLCAweDgyMTAsCisJMHg4MTA5LCAweDFkYzAsIDB4YTg1YywgMHg5MDgwLCAweDAwMzEsIDB4MjA5OCwgMHgyMDA5LCAweDAwMDgsCisJMHgyMGE5LCAweDAwMDEsIDB4NDAwMiwgMHg4MDA3LCAweDIwMTIsIDB4ODIxMCwgMHg4MTA5LCAweDFkYzAsCisJMHgwMGNlLCAweDYwYzMsIDB4MDA0YywgMHg2MGEzLCAweDAwNTYsIDB4NjBhNywgMHg5NTc1LCAweDIwMDEsCisJMHgxODM3LCAweDIwMDQsIDB4OTA4NCwgMHgwMDI4LCAweDExNjgsIDB4MDgwYywgMHg3NDNlLCAweDAxNTAsCisJMHg2MDI4LCAweGMwYmQsIDB4NjAyYSwgMHg2MDE0LCAweDkwODQsIDB4MTgwNCwgMHg5MDg1LCAweDAwMjksCisJMHg2MDE2LCAweDAwMTAsIDB4MDgwYywgMHhhMzJhLCAweDA4MGMsIDB4ODYyZCwgMHgwMGRlLCAweDAwOWUsCisJMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MDI0MCwgMHgyMDAxLCAweDIyMDAsCisJMHg5MDg1LCAweDAwZmYsIDB4NzAwMiwgMHg3MDA3LCAweGZmZmYsIDB4MjA3MSwgMHgwMTAwLCAweDcwOWIsCisJMHgwMGZmLCAweDAwZWUsIDB4MDgwNCwgMHhhYzE5LCAweDA4MGMsIDB4OWQzOSwgMHgwMDE2LCAweDAwMjYsCisJMHgwMDk2LCAweDAwZDYsIDB4NzgxNCwgMHgyMDQ4LCAweDcwMTMsIDB4MDEzOCwgMHg3MDAzLCAweDU1MDAsCisJMHgwMGM2LCAweGE4OWMsIDB4OTA4NCwgMHgwMGZmLCAweGE5OTgsIDB4ODEwZiwgMHg5MThjLCAweGZmMDAsCisJMHg5MTA1LCAweDcwMGEsIDB4YTk5YywgMHg5MThjLCAweGZmMDAsIDB4YThhMCwgMHg5MDg0LCAweDAwZmYsCisJMHg5MTA1LCAweDcwMGUsIDB4YTk5OCwgMHg5MThjLCAweGZmMDAsIDB4MjA2MSwgMHgxODAwLCAweDYwN2MsCisJMHg5MDg0LCAweDAwZmYsIDB4OTEwZCwgMHg3MTEyLCAweDYxODAsIDB4NzExNiwgMHgyMDA5LCAweDAwMDgsCisJMHhhODYwLCAweDIwZTAsIDB4YTg1YywgMHg5MDgwLCAweDAwMjksIDB4MjA5OCwgMHgyZTEwLCAweDkyOTAsCisJMHgwMDA2LCAweDIwYTksIDB4MDAwMSwgMHg0MDAyLCAweDgwMDcsIDB4MjAxMiwgMHg4MjEwLCAweDgxMDksCisJMHgxZGMwLCAweDIwYTksIDB4MDAwNCwgMHgyMDA5LCAweDE4MDUsIDB4MjEwNCwgMHgyMDEyLCAweDgxMDgsCisJMHg4MjEwLCAweDFmMDQsIDB4YWNmNSwgMHgyMGE5LCAweDAwMDIsIDB4MjAwOSwgMHgxODAxLCAweDIxMDQsCisJMHgyMDEyLCAweDgxMDgsIDB4ODIxMCwgMHgxZjA0LCAweGFjZmYsIDB4MDBkNiwgMHgwMDE2LCAweDIwNjksCisJMHgwMjAwLCAweDA4MGMsIDB4YWJlOSwgMHgwMDFlLCAweDAwZGUsIDB4MjA3MSwgMHgwMjQwLCAweDIwYTksCisJMHgwMDAyLCAweDIwMDksIDB4MTgwMywgMHgyMDExLCAweDAyNDAsIDB4MjEwNCwgMHgyMDEyLCAweDgxMDgsCisJMHg4MjEwLCAweDFmMDQsIDB4YWQxNSwgMHgyMDA5LCAweDAwMDgsIDB4NDAwMiwgMHg4MDA3LCAweDIwMTIsCisJMHg4MjEwLCAweDgxMDksIDB4MWRkMCwgMHg5MDA2LCAweDIwYTksIDB4MDAwOCwgMHgyMDEyLCAweDgyMTAsCisJMHgxZjA0LCAweGFkMjYsIDB4MDBjZSwgMHg2MGMzLCAweDAwNGMsIDB4NjBhMywgMHgwMDU2LCAweDYwYTcsCisJMHg5NTc1LCAweDA4MGMsIDB4YTMyYSwgMHgwODBjLCAweDg2MmQsIDB4MDBkZSwgMHgwMDllLCAweDAwMmUsCisJMHgwMDFlLCAweDAwMDUsIDB4MDBkNiwgMHg5MjkwLCAweDAwMTgsIDB4ODIxNCwgMHgyMGU5LCAweDAwMDAsCisJMHgyMDY5LCAweDAyMDAsIDB4NjgxMywgMHgwMDAwLCAweDIyYTgsIDB4OTI4NCwgMHgwMGUwLCAweDAxMjgsCisJMHgyMGE5LCAweDAwMjAsIDB4OTI5MiwgMHgwMDIwLCAweDAwMDgsIDB4OTAxNiwgMHgyMGExLCAweDAyNDAsCisJMHg5MDA2LCAweDQwMDQsIDB4ODJmZiwgMHgwMTIwLCAweDY4MTAsIDB4ODAwMCwgMHg2ODEyLCAweDBjNjAsCisJMHgwMGRlLCAweDAwMDUsIDB4MDBkNiwgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwgMHhhODc4LCAweDYwNTYsCisJMHg5MDA2LCAweGE4MzYsIDB4YTgzYSwgMHhhOTljLCAweGE5NDYsIDB4YTg0YSwgMHg2MDIzLCAweDAwMDMsCisJMHg2MDA3LCAweDAwNDAsIDB4NjAwMywgMHgwMDAzLCAweDYwMGIsIDB4ZmZmZiwgMHhhODE3LCAweDAwMDEsCisJMHhhODQyLCAweGE4M2UsIDB4MjkwMCwgMHhhODVhLCAweGE4MTMsIDB4MjBjYywgMHgwODBjLCAweDkyMTYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDk4OTEsIDB4MDEyZSwgMHgwMDllLCAweDAwZGUsCisJMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDBhNiwgMHgwMDk2LCAweDAwNjYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDE5ZTYsIDB4NzYwYywgMHgyNjYwLCAweDI2NzgsCisJMHg4Y2ZmLCAweDA5MDQsIDB4YWUwZCwgMHg3MDI0LCAweDljMDYsIDB4MTUyMCwgMHgyMDY5LCAweDAxMDAsCisJMHg2OGMwLCAweDkwMDUsIDB4MDkwNCwgMHhhZGRmLCAweDA4MGMsIDB4YTM1NiwgMHg2OGMzLCAweDAwMDAsCisJMHgwODBjLCAweGE4OGIsIDB4NzAyNywgMHgwMDAwLCAweDAwMzYsIDB4MjA2OSwgMHgwMTQwLCAweDZiMDQsCisJMHg5Mzg0LCAweDEwMDAsIDB4MDEzOCwgMHgyMDAxLCAweDAxMDAsIDB4MDgwYywgMHgyZDRlLCAweDkwMDYsCisJMHgwODBjLCAweDJkNGUsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwgMHgwMTEwLCAweDY4MjcsCisJMHgwMDAxLCAweDAwM2UsIDB4NzAwYywgMHg5YzM2LCAweDExMTAsIDB4NjYwYywgMHg3NjBlLCAweDcwMDgsCisJMHg5YzM2LCAweDExNDAsIDB4MmMwMCwgMHg5ZjM2LCAweDAxMTgsIDB4MmYwMCwgMHg3MDBhLCAweDAwMTAsCisJMHg3MDBiLCAweDAwMDAsIDB4NjYwYywgMHgwMDY2LCAweDJjMDAsIDB4OWYwNiwgMHgwMTEwLCAweDdlMGUsCisJMHgwMDA4LCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLCAweDA4MGMsIDB4Y2U3ZCwgMHgxMTgwLCAweDA4MGMsCisJMHgzMjQ3LCAweDA4MGMsIDB4Y2U4ZSwgMHgxNTE4LCAweDA4MGMsIDB4YjkwNSwgMHgwNDAwLCAweDA4MGMsCisJMHhhODhiLCAweDY4MjQsIDB4ZDA4NCwgMHgwOWIwLCAweDY4MjcsIDB4MDAwMSwgMHgwODk4LCAweDA4MGMsCisJMHhjZThlLCAweDExMTgsIDB4MDgwYywgMHhiOTA1LCAweDAwOTAsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsCisJMHhjYzg0LCAweDAxNjgsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDMsIDB4MTUyMCwgMHhhODY3LCAweDAxMDMsCisJMHhhYjdhLCAweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweDZkMTcsIDB4MDgwYywgMHhjZTcxLCAweDA4MGMsCisJMHhkMGZhLCAweDA4MGMsIDB4YWY3NCwgMHgwODBjLCAweGE3NjEsIDB4MDBjZSwgMHgwODA0LCAweGFkOTAsCisJMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwODA0LCAweGFkOTAsIDB4NzAwZiwgMHgwMDAwLCAweDcwMGIsCisJMHgwMDAwLCAweDAxMmUsIDB4MDA2ZSwgMHgwMDllLCAweDAwYWUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsCisJMHgwMGZlLCAweDAwMDUsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDYsIDB4MWQwOCwgMHgwODBjLCAweGU2ZGQsCisJMHgwOGYwLCAweDAwZDYsIDB4MDE1NiwgMHgwODBjLCAweDlkODQsIDB4N2ExNCwgMHg4MmZmLCAweDAxMzgsCisJMHg3MDAzLCAweDAxMDAsIDB4NzAwYiwgMHgwMDAzLCAweDYwYzMsIDB4MDAwOCwgMHgwNDkwLCAweDcwMDMsCisJMHgwMjAwLCAweDcwMDcsIDB4MDAwMCwgMHgyMDY5LCAweDE4MDAsIDB4OTAxZSwgMHg2ODAwLCAweDkwODYsCisJMHgwMDA0LCAweDExMTAsIDB4YzM4ZCwgMHgwMDYwLCAweDA4MGMsIDB4NzQzZSwgMHgxMTEwLCAweGMzYWQsCisJMHgwMDA4LCAweGMzYTUsIDB4NmFkYywgMHhkMjljLCAweDExMTAsIDB4ZDJhYywgMHgwMTA4LCAweGMzOWQsCisJMHg3MzBlLCAweDA4MGMsIDB4ODY5NiwgMHgyMGE5LCAweDAwMDYsIDB4MjAxMSwgMHhmZmVjLCAweDIwMTksCisJMHhmZmVkLCAweDIwNzEsIDB4MDI1MCwgMHgyMzA1LCAweDIwNzIsIDB4OGU3MCwgMHgyMjA1LCAweDIwNzIsCisJMHg4ZTcwLCAweDkzOTgsIDB4MDAwMiwgMHg5MjkwLCAweDAwMDIsIDB4MWYwNCwgMHhhZTUzLCAweDYwYzMsCisJMHgwMDIwLCAweDA4MGMsIDB4YTMyYSwgMHgwMTVlLCAweDAwZGUsIDB4MDAwNSwgMHgwMTU2LCAweDA4MGMsCisJMHg5ZDg0LCAweDdhMTQsIDB4ODJmZiwgMHgwMTY4LCAweDkyODYsIDB4ZmZmZiwgMHgwMTE4LCAweDkyODIsCisJMHgwMDBlLCAweDEyMzgsIDB4NzAwMywgMHgwMTAwLCAweDcwMGIsIDB4MDAwMywgMHg2MGMzLCAweDAwMDgsCisJMHgwNDg4LCAweDcwMDMsIDB4MDIwMCwgMHg3MDA3LCAweDAwMWMsIDB4NzAwZiwgMHgwMDAxLCAweDIwMTEsCisJMHgxOWJjLCAweDIyMDQsIDB4ODAwNywgMHg3MDFhLCAweDgyMTAsIDB4MjIwNCwgMHg4MDA3LCAweDcwMWUsCisJMHgwNDIxLCAweDExMjAsIDB4YjhhMCwgMHg5MDgyLCAweDAwN2YsIDB4MDI0OCwgMHgyMDAxLCAweDE4MWYsCisJMHgyMDA0LCAweDcwMjIsIDB4MjAwMSwgMHgxODIwLCAweDIwMDQsIDB4NzAyNiwgMHgwMDMwLCAweDIwMDEsCisJMHgxODE4LCAweDIwMDQsIDB4OTA4NCwgMHgwMGZmLCAweDcwMjYsIDB4MjBhOSwgMHgwMDA0LCAweDIwZTEsCisJMHgwMDAxLCAweDIwOTksIDB4MTgwNSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMjU2LCAweDQwMDMsCisJMHg2MGMzLCAweDAwMWMsIDB4MDE1ZSwgMHgwODA0LCAweGEzMmEsIDB4MDAwNiwgMHgyMDAxLCAweDE4MzcsCisJMHgyMDA0LCAweGQwYWMsIDB4MDAwZSwgMHgwMDA1LCAweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweGE3MjIsCisJMHgyMDExLCAweDAwMDIsIDB4MDgwYywgMHhhNzJjLCAweDA4MGMsIDB4YTYzNiwgMHgwMDM2LCAweDkwMWUsCisJMHgwODBjLCAweGE2YWMsIDB4MDAzZSwgMHgwMDA1LCAweDA4MGMsIDB4MzM3ZCwgMHgwMTg4LCAweDAwMTYsCisJMHgwMGI2LCAweDAwYzYsIDB4NzAxMCwgMHg5MDg1LCAweDAwMjAsIDB4NzAxMiwgMHgyMDA5LCAweDAwN2UsCisJMHgwODBjLCAweDY2OTksIDB4Yjg1YywgMHhjMGFjLCAweGI4NWUsIDB4MDBjZSwgMHgwMGJlLCAweDAwMWUsCisJMHgwMDA1LCAweDIwNzEsIDB4MTg4ZCwgMHg3MDAwLCAweDkwMDUsIDB4MDE0MCwgMHgyMDAxLCAweDA5NzYsCisJMHgyMDcxLCAweDE4MDAsIDB4NzA3NiwgMHg3MDdhLCAweDcwNmIsIDB4ZmZlMCwgMHgyMDcxLCAweDE4MDAsCisJMHg3MDc0LCAweDcwNTYsIDB4NzA1YiwgMHgxY2QwLCAweDAwMDUsIDB4MDBlNiwgMHgwMTI2LCAweDIwNzEsCisJMHgxODAwLCAweDIwOTEsIDB4ODAwMCwgMHg3NTU0LCAweDk1ODIsIDB4MDAxMCwgMHgwNjA4LCAweDcwNTgsCisJMHgyMDYwLCAweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDAxNDgsIDB4OWNlMCwgMHgwMDE4LCAweDcwNjgsCisJMHg5YzAyLCAweDEyMDgsIDB4MGNiMCwgMHgyMDYxLCAweDFjZDAsIDB4MGM5OCwgMHg2MDAzLCAweDAwMDgsCisJMHg4NTI5LCAweDc1NTYsIDB4OWNhOCwgMHgwMDE4LCAweDcwNjgsIDB4OTUwMiwgMHgxMjMwLCAweDc1NWEsCisJMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4NzA1YiwgMHgxY2QwLCAweDBjYzAsCisJMHg5MDA2LCAweDBjYzAsIDB4MDBlNiwgMHgyMDcxLCAweDE4MDAsIDB4NzU1NCwgMHg5NTgyLCAweDAwMTAsCisJMHgwNjAwLCAweDcwNTgsIDB4MjA2MCwgMHg2MDAwLCAweDkwODYsIDB4MDAwMCwgMHgwMTQ4LCAweDljZTAsCisJMHgwMDE4LCAweDcwNjgsIDB4OWMwMiwgMHgxMjA4LCAweDBjYjAsIDB4MjA2MSwgMHgxY2QwLCAweDBjOTgsCisJMHg2MDAzLCAweDAwMDgsIDB4ODUyOSwgMHg3NTU2LCAweDljYTgsIDB4MDAxOCwgMHg3MDY4LCAweDk1MDIsCisJMHgxMjI4LCAweDc1NWEsIDB4OTA4NSwgMHgwMDAxLCAweDAwZWUsIDB4MDAwNSwgMHg3MDViLCAweDFjZDAsCisJMHgwY2M4LCAweDkwMDYsIDB4MGNjOCwgMHg5YzgyLCAweDFjZDAsIDB4MGEwYywgMHgwZGQ1LCAweDIwMDEsCisJMHgxODFhLCAweDIwMDQsIDB4OWMwMiwgMHgxYTBjLCAweDBkZDUsIDB4OTAwNiwgMHg2MDA2LCAweDYwMGEsCisJMHg2MDBlLCAweDYwMTYsIDB4NjAxYSwgMHg2MDEyLCAweDYwMjMsIDB4MDAwMCwgMHg2MDAzLCAweDAwMDAsCisJMHg2MDFlLCAweDYwNTYsIDB4NjA1YSwgMHg2MDI2LCAweDYwMmEsIDB4NjAyZSwgMHg2MDMyLCAweDYwMzYsCisJMHg2MDNhLCAweDYwM2UsIDB4NjA0MiwgMHg2MDJhLCAweDIwNjEsIDB4MTgwMCwgMHg2MDU0LCAweDgwMDAsCisJMHg2MDU2LCAweDkwODYsIDB4MDAwMSwgMHgwMTA4LCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgwODBjLCAweDk3NjMsIDB4MDEyZSwgMHgwY2MwLCAweDAwMDYsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsCisJMHgwMWIwLCAweDYwMWMsIDB4ZDA4NCwgMHgxOTBjLCAweDFhYTEsIDB4NjAxNywgMHgwMDAwLCAweDYwMjMsCisJMHgwMDA3LCAweDIwMDEsIDB4MTk4NSwgMHgyMDA0LCAweDAwMDYsIDB4OTA4MiwgMHgwMDUxLCAweDAwMGUsCisJMHgwMjA4LCAweDgwMDQsIDB4NjAxYSwgMHgwODBjLCAweGU5OTcsIDB4NjA0MywgMHgwMDAwLCAweDAwMGUsCisJMHgwMDA1LCAweDAwZTYsIDB4MDEyNiwgMHgyMDcxLCAweDE4MDAsIDB4MjA5MSwgMHg4MDAwLCAweDc1NTQsCisJMHg5NTgyLCAweDAwMDEsIDB4MDYwOCwgMHg3MDU4LCAweDIwNjAsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsCisJMHgwMTQ4LCAweDljZTAsIDB4MDAxOCwgMHg3MDY4LCAweDljMDIsIDB4MTIwOCwgMHgwY2IwLCAweDIwNjEsCisJMHgxY2QwLCAweDBjOTgsIDB4NjAwMywgMHgwMDA4LCAweDg1MjksIDB4NzU1NiwgMHg5Y2E4LCAweDAwMTgsCisJMHg3MDY4LCAweDk1MDIsIDB4MTIzMCwgMHg3NTVhLCAweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwZWUsCisJMHgwMDA1LCAweDcwNWIsIDB4MWNkMCwgMHgwY2MwLCAweDkwMDYsIDB4MGNjMCwgMHg2MDIwLCAweDkwODQsCisJMHgwMDBmLCAweDAwMDIsIDB4YWZkMSwgMHhhZmRhLCAweGFmZjUsIDB4YjAxMCwgMHhkM2FlLCAweGQzY2IsCisJMHhkM2U2LCAweGFmZDEsIDB4YWZkYSwgMHg4ZTQzLCAweGIwMmMsIDB4YWZkMSwgMHhhZmQxLCAweGFmZDEsCisJMHhhZmQxLCAweDkxODYsIDB4MDAxMywgMHgxMTI4LCAweDA4MGMsIDB4OTY1NywgMHgwODBjLCAweDk3NjMsCisJMHgwMDA1LCAweDAwMDUsIDB4MDA2NiwgMHg2MDAwLCAweDkwYjIsIDB4MDAxNiwgMHgxYTBjLCAweDBkZDUsCisJMHgwMDEzLCAweDAwNmUsIDB4MDAwNSwgMHhhZmYzLCAweGI3NmYsIDB4Yjk0YywgMHhhZmYzLCAweGI5ZTIsCisJMHhiMzBmLCAweGFmZjMsIDB4YWZmMywgMHhiNmYxLCAweGJmNDksIDB4YWZmMywgMHhhZmYzLCAweGFmZjMsCisJMHhhZmYzLCAweGFmZjMsIDB4YWZmMywgMHgwODBjLCAweDBkZDUsIDB4MDA2NiwgMHg2MDAwLCAweDkwYjIsCisJMHgwMDE2LCAweDFhMGMsIDB4MGRkNSwgMHgwMDEzLCAweDAwNmUsIDB4MDAwNSwgMHhiMDBlLCAweGM2MzAsCisJMHhiMDBlLCAweGIwMGUsIDB4YjAwZSwgMHhiMDBlLCAweGIwMGUsIDB4YjAwZSwgMHhjNWM3LCAweGM3YjIsCisJMHhiMDBlLCAweGM2NzEsIDB4YzZmMCwgMHhjNjcxLCAweGM2ZjAsIDB4YjAwZSwgMHgwODBjLCAweDBkZDUsCisJMHg2MDAwLCAweDkwODIsIDB4MDAxNiwgMHgxYTBjLCAweDBkZDUsIDB4NjAwMCwgMHgwMDAyLCAweGIwMmEsCisJMHhiZjkwLCAweGMwNzUsIDB4YzFhNSwgMHhjMzU0LCAweGIwMmEsIDB4YjAyYSwgMHhiMDJhLCAweGJmNjQsCisJMHhjNTUzLCAweGM1NTYsIDB4YjAyYSwgMHhiMDJhLCAweGIwMmEsIDB4YjAyYSwgMHhjNTg1LCAweGIwMmEsCisJMHhiMDJhLCAweGIwMmEsIDB4MDgwYywgMHgwZGQ1LCAweDAwNjYsIDB4NjAwMCwgMHg5MGIyLCAweDAwMTYsCisJMHgxYTBjLCAweDBkZDUsIDB4MDAxMywgMHgwMDZlLCAweDAwMDUsIDB4YjA0NSwgMHhiMDQ1LCAweGIwODgsCisJMHhiMTI3LCAweGIxYmMsIDB4YjA0NSwgMHhiMDQ1LCAweGIwNDUsIDB4YjA0NywgMHhiMDQ1LCAweGIwNDUsCisJMHhiMDQ1LCAweGIwNDUsIDB4YjA0NSwgMHhiMDQ1LCAweGIwNDUsIDB4MDgwYywgMHgwZGQ1LCAweDkxODYsCisJMHgwMDRjLCAweDA1ODgsIDB4OTE4NiwgMHgwMDAzLCAweDE5MGMsIDB4MGRkNSwgMHgwMDk2LCAweDYwMWMsCisJMHhjMGVkLCAweDYwMWUsIDB4NjAwMywgMHgwMDAzLCAweDYxMDYsIDB4NjAxNCwgMHgyMDQ4LCAweGE4N2MsCisJMHg5MDg0LCAweGEwMDAsIDB4YzBiNSwgMHhhODdlLCAweGE4YWMsIDB4YTg0NiwgMHhhOGIwLCAweGE4NGEsCisJMHg5MDA2LCAweGE4MzYsIDB4YTgzYSwgMHhhODg0LCAweDkwOTIsIDB4MTk5YSwgMHgwMjEwLCAweDIwMDEsCisJMHgxOTk5LCAweDgwMDMsIDB4ODAxMywgMHg4MjEzLCAweDkyMTAsIDB4NjIxYSwgMHgwMDllLCAweDJjMTAsCisJMHgwODBjLCAweDFiZWIsIDB4MDgwYywgMHg5MjE2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsCisJMHg5ODkxLCAweDAxMmUsIDB4MDAwNSwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiY2EwLCAweDAwYmUsCisJMHgyYzAwLCAweDA4MGMsIDB4YjFkZSwgMHgwODBjLCAweGQzYTAsIDB4NjAwMywgMHgwMDA3LCAweDAwMDUsCisJMHgwMGQ2LCAweDAwOTYsIDB4MDBmNiwgMHgyMDc5LCAweDE4MDAsIDB4N2E5MCwgMHg2MDE0LCAweDIwNDgsCisJMHhhODdjLCAweGQwZWMsIDB4MTExMCwgMHg5MjkwLCAweDAwMTgsIDB4YWM3OCwgMHhjNGZjLCAweDAwNDYsCisJMHhhOGUwLCAweDkwMDUsIDB4MTE0MCwgMHhhOGRjLCAweDkyMWEsIDB4MDE0MCwgMHgwMjIwLCAweGE4N2IsCisJMHgwMDA3LCAweDIwMTAsIDB4MDAyOCwgMHhhODdiLCAweDAwMTUsIDB4MDAxMCwgMHhhODdiLCAweDAwMDAsCisJMHg4MjE0LCAweGE4ODMsIDB4MDAwMCwgMHhhYTAyLCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDAwYzYsCisJMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgyNDAwLCAweDkwMDUsIDB4MTEwOCwgMHgwMDlhLCAweDIxMDAsCisJMHg5MDg2LCAweDAwMTUsIDB4MTExOCwgMHgyMDAxLCAweDAwMDEsIDB4MDAzOCwgMHgyMTAwLCAweDkwODYsCisJMHgwMDE2LCAweDAxMTgsIDB4MjAwMSwgMHgwMDAxLCAweDAwMmEsIDB4OTRhNCwgMHgwMDA3LCAweDg0MjMsCisJMHg5NDA1LCAweDAwMDIsIDB4YjBlZiwgMHhiMGVmLCAweGIwZWEsIDB4YjBlZCwgMHhiMGVmLCAweGIwZTcsCisJMHhiMGRhLCAweGIwZGEsIDB4YjBkYSwgMHhiMGRhLCAweGIwZGEsIDB4YjBkYSwgMHhiMGRhLCAweGIwZGEsCisJMHhiMGRhLCAweGIwZGEsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMDBlLCAweDAwNGUsIDB4MDBmZSwgMHgwMDllLCAweDAwZGUsIDB4MDgwYywgMHgwZGQ1LCAweDA4MGMsCisJMHhiYmExLCAweDAwMjgsIDB4MDgwYywgMHhiYzg2LCAweDAwMTAsIDB4MDgwYywgMHhiZDdjLCAweDAwZmUsCisJMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDJlLCAweDAwMWUsIDB4MmMwMCwgMHhhODk2LCAweDAwMGUsCisJMHgwODBjLCAweGIyOWMsIDB4MDUzMCwgMHhhODA0LCAweGE4MGUsIDB4MDBhNiwgMHgyMDUwLCAweGIxMDAsCisJMHgwMGFlLCAweDgwMDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsCisJMHg5MDgwLCAweDAwMDIsIDB4YWFjYywgMHhhYmQwLCAweGFjZDQsIDB4YWRkOCwgMHgyMDMxLCAweDAwMDAsCisJMHgyMDQxLCAweDEyNWQsIDB4MDgwYywgMHhiNDVkLCAweDAxNjAsIDB4MDAwZSwgMHg5MDA1LCAweDAxMjAsCisJMHgwMGZlLCAweDAwOWUsIDB4MDBkZSwgMHgwMDA1LCAweDAwZmUsIDB4MDA5ZSwgMHgwMGRlLCAweDA4MDQsCisJMHhhZjQzLCAweDIwMDEsIDB4MDAyYywgMHg5MDBlLCAweDA4MGMsIDB4YjMwMiwgMHgwYzcwLCAweDkxYjYsCisJMHgwMDE1LCAweDAxNzAsIDB4OTFiNiwgMHgwMDE2LCAweDAxNTgsIDB4OTFiMiwgMHgwMDQ3LCAweDBhMGMsCisJMHgwZGQ1LCAweDkxYjIsIDB4MDA1MCwgMHgxYTBjLCAweDBkZDUsIDB4OTE4MiwgMHgwMDQ3LCAweDAwY2EsCisJMHgyMDAxLCAweDAxMDksIDB4MjAwNCwgMHhkMDhjLCAweDAxOTgsIDB4MDEyNiwgMHgyMDkxLCAweDI4MDAsCisJMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwODBjLCAweDkxNjMsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsCisJMHgwMTJlLCAweGEwMDEsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDIsIDB4MTExMCwgMHgwODA0LCAweGIwODgsCisJMHgwMDA1LCAweGIxNWEsIDB4YjE1YSwgMHhiMTVjLCAweGIxOTIsIDB4YjE1YSwgMHhiMTVhLCAweGIxNWEsCisJMHhiMTVhLCAweGIxYTUsIDB4MDgwYywgMHgwZGQ1LCAweDAwZDYsIDB4MDAxNiwgMHgwMDk2LCAweDA4MGMsCisJMHg5NzEzLCAweDA4MGMsIDB4OTg5MSwgMHg2MDAzLCAweDAwMDQsIDB4NjExNCwgMHgyMTQ4LCAweGE4N2MsCisJMHhkMGZjLCAweDAxYzAsIDB4YTg3OCwgMHhjMGZjLCAweDkwMDUsIDB4MTE1OCwgMHhhODk0LCAweDkwMDUsCisJMHgwMTQwLCAweDIwMDEsIDB4MDAwMCwgMHg5MDBlLCAweDA4MGMsIDB4YjMwMiwgMHgwODBjLCAweGFmNDMsCisJMHgwMGE4LCAweDYwMDMsIDB4MDAwMiwgMHhhOGE0LCAweGE5YTgsIDB4OTEwNSwgMHgxMTc4LCAweGE4YWUsCisJMHhhOGIyLCAweDBjNzgsIDB4YTg3ZiwgMHgwMDIwLCAweGE4OGMsIDB4YTg4YSwgMHhhOGE0LCAweGE4YWUsCisJMHhhOGE4LCAweGE4YjIsIDB4YThjNywgMHgwMDAwLCAweGE4Y2IsIDB4MDAwMCwgMHgwMDllLCAweDAwMWUsCisJMHgwMGRlLCAweDAwMDUsIDB4MDgwYywgMHg5NzEzLCAweDAwZDYsIDB4MDA5NiwgMHg2MTE0LCAweDIxNDgsCisJMHgwODBjLCAweGNjODYsIDB4MDEyMCwgMHhhODdiLCAweDAwMDYsIDB4MDgwYywgMHg2ZDE3LCAweDAwOWUsCisJMHgwMGRlLCAweDA4MGMsIDB4YWY0MywgMHgwODA0LCAweDk4OTEsIDB4MDgwYywgMHg5NzEzLCAweDA4MGMsCisJMHgzMjFlLCAweDA4MGMsIDB4ZDM5ZCwgMHgwMGQ2LCAweDAwOTYsIDB4NjExNCwgMHgyMTQ4LCAweDA4MGMsCisJMHhjYzg2LCAweDAxMjAsIDB4YTg3YiwgMHgwMDI5LCAweDA4MGMsIDB4NmQxNywgMHgwMDllLCAweDAwZGUsCisJMHgwODBjLCAweGFmNDMsIDB4MDgwNCwgMHg5ODkxLCAweDkxODIsIDB4MDA0NywgMHgwMDAyLCAweGIxY2MsCisJMHhiMWNlLCAweGIxY2MsIDB4YjFjYywgMHhiMWNjLCAweGIxY2MsIDB4YjFjYywgMHhiMWNjLCAweGIxY2MsCisJMHhiMWNjLCAweGIxY2MsIDB4YjFjYywgMHhiMWNlLCAweDA4MGMsIDB4MGRkNSwgMHgwMGQ2LCAweDAwOTYsCisJMHg2MDFmLCAweDAwMDAsIDB4NjExNCwgMHgyMTQ4LCAweGE4N2IsIDB4MDAwMCwgMHhhODgzLCAweDAwMDAsCisJMHgwODBjLCAweDZkMTcsIDB4MDA5ZSwgMHgwMGRlLCAweDA4MDQsIDB4YWY0MywgMHgwMDI2LCAweDAwMzYsCisJMHgwMDU2LCAweDAwNjYsIDB4MDA5NiwgMHgwMGE2LCAweDAwZjYsIDB4MDAwNiwgMHgwODBjLCAweDBmZmYsCisJMHgwMDBlLCAweDA5MGMsIDB4MGRkNSwgMHhhOTYwLCAweDIxZTgsIDB4YTk1YywgMHg5MTg4LCAweDAwMTksCisJMHgyMWEwLCAweDkwMGUsIDB4MjBhOSwgMHgwMDIwLCAweDQxMDQsIDB4YTg3YSwgMHgyMDc5LCAweDE4MDAsCisJMHg3OTkwLCAweDkxODgsIDB4MDAxOCwgMHg5MThjLCAweDBmZmYsIDB4YTk3MiwgMHhhYzc2LCAweDI5NTAsCisJMHgwMGE2LCAweDIwMDEsIDB4MDIwNSwgMHgyMDAzLCAweDAwMDAsIDB4OTAxZSwgMHgyMDI5LCAweDAwMDEsCisJMHg5MTgyLCAweDAwMzQsIDB4MTIyOCwgMHgyMDExLCAweDAwMWYsIDB4MDgwYywgMHhjODM3LCAweDA0YzAsCisJMHgyMTMwLCAweDIwMDksIDB4MDAzNCwgMHgyMDExLCAweDAwMWYsIDB4MDgwYywgMHhjODM3LCAweDk2YjIsCisJMHgwMDM0LCAweGIwMDQsIDB4OTA0ZCwgMHgwMTEwLCAweDA4MGMsIDB4MGZiMSwgMHgwODBjLCAweDBmZmYsCisJMHgwMWQwLCAweDg1MjgsIDB4YTg2NywgMHgwMTEwLCAweGE4NmIsIDB4MDAwMCwgMHgyOTIwLCAweGI0MDYsCisJMHg5NjhhLCAweDAwM2QsIDB4MTIzMCwgMHgyNjA4LCAweDIwMTEsIDB4MDAxYiwgMHgwODBjLCAweGM4MzcsCisJMHgwMGI4LCAweDk2YjIsIDB4MDAzYywgMHgyMDA5LCAweDAwM2MsIDB4Mjk1MCwgMHgyMDExLCAweDAwMWIsCisJMHgwODBjLCAweGM4MzcsIDB4MGMxOCwgMHgyMDAxLCAweDAyMDUsIDB4MjAwMywgMHgwMDAwLCAweDAwYWUsCisJMHg4NTJmLCAweDk1YWQsIDB4MDA1MCwgMHhiNTY2LCAweGIwNzAsIDB4YzBmZCwgMHhiMDcyLCAweDAwNDgsCisJMHgyMDAxLCAweDAyMDUsIDB4MjAwMywgMHgwMDAwLCAweDAwYWUsIDB4ODUyZiwgMHg5NWFkLCAweDAwNTAsCisJMHhiNTY2LCAweDJhNDgsIDB4YTgwNCwgMHhhODA3LCAweDAwMDAsIDB4MDAwNiwgMHgwODBjLCAweDZkMTcsCisJMHgwMDBlLCAweDIwNDgsIDB4OTAwNSwgMHgxZGIwLCAweDAwZmUsIDB4MDBhZSwgMHgwMDllLCAweDAwNmUsCisJMHgwMDVlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDA1LCAweDAwZDYsIDB4MDBmNiwgMHgwMDk2LCAweDAwMDYsCisJMHgwODBjLCAweDBmZmYsIDB4MDAwZSwgMHgwOTBjLCAweDBkZDUsIDB4YTk2MCwgMHgyMWU4LCAweGE5NWMsCisJMHg5MTg4LCAweDAwMTksIDB4MjFhMCwgMHg5MDBlLCAweDIwYTksIDB4MDAyMCwgMHg0MTA0LCAweGFhNjYsCisJMHhhODdhLCAweDIwNzksIDB4MTgwMCwgMHg3OTkwLCAweDgxMGMsIDB4OTE4OCwgMHgwMDBjLCAweDkxODIsCisJMHgwMDFhLCAweDAyMTAsIDB4MjAwOSwgMHgwMDFhLCAweDIxYTgsIDB4ODEwYiwgMHhhOTcyLCAweGFjNzYsCisJMHgyZTk4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDFmLCAweDIwYTAsIDB4MjAwMSwgMHgwMjA1LCAweDIwMGMsCisJMHg5MThkLCAweDAwODAsIDB4MjEwMiwgMHg0MDAzLCAweDIwMDMsIDB4MDAwMCwgMHgwODBjLCAweDZkMTcsCisJMHgwMDllLCAweDAwZmUsIDB4MDBkZSwgMHgwMDA1LCAweDAwMTYsIDB4MDBkNiwgMHgwMGY2LCAweDAwOTYsCisJMHgwMDE2LCAweDIwMDEsIDB4MDIwNSwgMHgyMDBjLCAweDkxOGQsIDB4MDA4MCwgMHgyMTAyLCAweDAwMWUsCisJMHgyMDc5LCAweDAyMDAsIDB4MmU5OCwgMHhhODdjLCAweGQwZWMsIDB4MDExOCwgMHg5ZTgwLCAweDAwMGMsCisJMHgyMDk4LCAweDIwMjEsIDB4MDAzZSwgMHg5MDFlLCAweDkyODIsIDB4MDAyMCwgMHgwMjE4LCAweDIwMTEsCisJMHgwMDIwLCAweDIwMTgsIDB4OTQ4NiwgMHgwMDNlLCAweDExNzAsIDB4MDA5NiwgMHgwODBjLCAweDBmZmYsCisJMHgyOTAwLCAweDAwOWUsIDB4MDVjMCwgMHhhODA2LCAweDIwNDgsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsCisJMHg5MDgwLCAweDAwMDIsIDB4MjBhMCwgMHgzMzAwLCAweDkwOGUsIDB4MDI2MCwgMHgwMTQwLCAweDIwMDksCisJMHgwMjgwLCAweDkxMDIsIDB4OTIwYSwgMHgwMjE4LCAweDIwMTAsIDB4MjEwMCwgMHg5MzE4LCAweDIyMDAsCisJMHg5NDAyLCAweDEyMjgsIDB4MjQwMCwgMHg5MjAyLCAweDI0MTAsIDB4OTMxOCwgMHg5MDA2LCAweDIwMjAsCisJMHgyMmE4LCAweGE4MDAsIDB4OTIwMCwgMHhhODAyLCAweDIwZTEsIDB4MDAwMCwgMHg0MDAzLCAweDgzZmYsCisJMHgwMTgwLCAweDMzMDAsIDB4OTA4NiwgMHgwMjgwLCAweDExMzAsIDB4NzgxNCwgMHg4MDAwLCAweDkwODUsCisJMHgwMDgwLCAweDc4MTYsIDB4MmU5OCwgMHgyMzEwLCAweDg0ZmYsIDB4MDkwNCwgMHhiMmIxLCAweDA4MDQsCisJMHhiMmIzLCAweDkwODUsIDB4MDAwMSwgMHg3ODE3LCAweDAwMDAsIDB4MDA5ZSwgMHgwMGZlLCAweDAwZGUsCisJMHgwMDFlLCAweDAwMDUsIDB4MDBkNiwgMHgwMDM2LCAweDAwOTYsIDB4NjMxNCwgMHgyMzQ4LCAweGE4N2EsCisJMHhhOTgyLCAweDA4MGMsIDB4NmQwYiwgMHgwMDllLCAweDAwM2UsIDB4MDBkZSwgMHgwMDA1LCAweDkxYjYsCisJMHgwMDE1LCAweDExMTgsIDB4MDgwYywgMHhhZjQzLCAweDAwMzAsIDB4OTFiNiwgMHgwMDE2LCAweDE5MGMsCisJMHgwZGQ1LCAweDA4MGMsIDB4YWY0MywgMHgwMDA1LCAweDIwYTksIDB4MDAwZSwgMHgyMGUxLCAweDAwMDAsCisJMHgyZTk4LCAweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDIwYTAsCisJMHgwMDllLCAweDQwMDMsIDB4MDEzNiwgMHg5MDgwLCAweDAwMWIsIDB4MjBhMCwgMHgyMDExLCAweDAwMDYsCisJMHgyMGE5LCAweDAwMDEsIDB4MzQxOCwgMHg4MzE4LCAweDIzYTAsIDB4NDAwMywgMHgzMzE4LCAweDgzMTgsCisJMHgyMzk4LCAweDgyMTEsIDB4MWRiOCwgMHgyMDExLCAweDAwMDYsIDB4MDEzZSwgMHgyMGEwLCAweDMzMTgsCisJMHg4MzE4LCAweDIzOTgsIDB4NDAwMywgMHgzNDE4LCAweDgzMTgsIDB4MjNhMCwgMHg4MjExLCAweDFkYjgsCisJMHgwMDk2LCAweDA4MGMsIDB4Y2M4NiwgMHgwMTMwLCAweDYwMTQsIDB4MjA0OCwgMHhhODA3LCAweDAwMDAsCisJMHhhODY3LCAweDAxMDMsIDB4MDA5ZSwgMHgwODA0LCAweGFmNDMsIDB4MDA5NiwgMHgwMGQ2LCAweDAwMzYsCisJMHg3MzMwLCAweDkzODYsIDB4MDIwMCwgMHgxMWE4LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4Y2YsCisJMHgwMDAwLCAweDAwYmUsIDB4NjAxNCwgMHg5MDA1LCAweDAxMzAsIDB4MjA0OCwgMHhhODA3LCAweDAwMDAsCisJMHhhODY3LCAweDAxMDMsIDB4YWIzMiwgMHgwODBjLCAweGFmNDMsIDB4MDAzZSwgMHgwMGRlLCAweDAwOWUsCisJMHgwMDA1LCAweDAwMTEsIDB4MWQ0OCwgMHgwY2M4LCAweDAwMDYsIDB4MDAxNiwgMHgwODBjLCAweGQzODgsCisJMHgwMTg4LCAweDYwMTQsIDB4OTAwNSwgMHgxMTcwLCAweDYwMGIsIDB4MDAwMywgMHg2MDFiLCAweDAwMDAsCisJMHg2MDQzLCAweDAwMDAsIDB4MjAwOSwgMHgwMDIyLCAweDA4MGMsIDB4Yjc0NywgMHg5MDA2LCAweDAwMWUsCisJMHgwMDBlLCAweDAwMDUsIDB4OTA4NSwgMHgwMDAxLCAweDBjZDAsIDB4MDA5NiwgMHgwMDE2LCAweDIwYTksCisJMHgwMDE0LCAweDllODAsIDB4MDAwYywgMHgyMGUxLCAweDAwMDAsIDB4MjA5OCwgMHg2MDE0LCAweDIwNDgsCisJMHhhODYwLCAweDIwZTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMDIsIDB4MjBhMCwgMHg0MDAzLCAweDIwMDEsCisJMHgwMjA1LCAweDIwMDMsIDB4MDAwMSwgMHgyMDk5LCAweDAyNjAsIDB4MjBhOSwgMHgwMDE2LCAweDQwMDMsCisJMHgyMGE5LCAweDAwMGEsIDB4YTgwNCwgMHgyMDQ4LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDkwODAsCisJMHgwMDAyLCAweDIwYTAsIDB4NDAwMywgMHgyMDAxLCAweDAyMDUsIDB4MjAwMywgMHgwMDAyLCAweDIwOTksCisJMHgwMjYwLCAweDIwYTksIDB4MDAyMCwgMHg0MDAzLCAweDIwMDMsIDB4MDAwMCwgMHg2MDE0LCAweDIwNDgsCisJMHhhODAwLCAweDIwNDgsIDB4YTg2NywgMHgwMTAzLCAweDA4MGMsIDB4YWY0MywgMHgwMDFlLCAweDAwOWUsCisJMHgwMDA1LCAweDAwOTYsIDB4MDAxNiwgMHg5MDBlLCAweDcwMzAsIDB4OTA4NiwgMHgwMTAwLCAweDAxNDAsCisJMHg3MDM4LCAweDkwODQsIDB4MDBmZiwgMHg4MDBjLCAweDcwM2MsIDB4OTA4NCwgMHgwMGZmLCAweDgwMDQsCisJMHg5MDgwLCAweDAwMDQsIDB4OTEwOCwgMHg4MTBiLCAweDIwMTEsIDB4MDAwMiwgMHgyMDE5LCAweDAwMGMsCisJMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhjODM3LCAweDA4MGMsIDB4Y2M4NiwgMHgwMTQwLCAweDYwMTQsCisJMHgyMDQ4LCAweGE4MDcsIDB4MDAwMCwgMHhhODY0LCAweGE4ZTIsIDB4YTg2NywgMHgwMTAzLCAweDA4MGMsCisJMHhhZjQzLCAweDAwMWUsIDB4MDA5ZSwgMHgwMDA1LCAweDAwMTYsIDB4MjAwOSwgMHgwMDAwLCAweDcwMzAsCisJMHg5MDg2LCAweDAyMDAsIDB4MDExMCwgMHgyMDA5LCAweDAwMDEsIDB4MDA5NiwgMHg2MDE0LCAweDkwNGQsCisJMHgwOTBjLCAweDBkZDUsIDB4YTk3YSwgMHgwODBjLCAweDZkMTcsIDB4MDA5ZSwgMHgwODBjLCAweGFmNDMsCisJMHgwMDFlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDk2LCAweDcwMzAsIDB4OTA4NiwgMHgwMTAwLCAweDExMTgsCisJMHgyMDA5LCAweDAwMDQsIDB4MDAxMCwgMHg3MDM0LCAweDgwMGMsIDB4ODEwYiwgMHgyMDExLCAweDAwMGMsCisJMHgyMDE5LCAweDAwMGMsIDB4NjAxNCwgMHgyMDQ4LCAweGE4MDQsIDB4MDA5NiwgMHg5MDA1LCAweDAxMDgsCisJMHgyMDQ4LCAweDA4MGMsIDB4YzgzNywgMHgwMDllLCAweDA4MGMsIDB4Y2M4NiwgMHgwMTQ4LCAweGE4MDQsCisJMHg5MDA1LCAweDExNTgsIDB4YTgwNywgMHgwMDAwLCAweGE4NjQsIDB4YThlMiwgMHhhODY3LCAweDAxMDMsCisJMHgwODBjLCAweGFmNDMsIDB4MDA5ZSwgMHgwMDFlLCAweDAwMDUsIDB4MDA4NiwgMHgyMDQwLCAweGEwMzAsCisJMHg4MDA3LCAweDkwODYsIDB4MDEwMCwgMHgxMTE4LCAweDA4MGMsIDB4YjkwNSwgMHgwMGUwLCAweGEwMzQsCisJMHg4MDA3LCAweDgwMGMsIDB4ODgwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTBiYywgMHgwMDNmLCAweDkwODQsCisJMHhmZmMwLCAweDkwODAsIDB4MDAwYywgMHhhODdiLCAweDAwMDAsIDB4YTg4MywgMHgwMDAwLCAweGE4OTcsCisJMHg0MDAwLCAweGFhYTAsIDB4YWI5YywgMHhhY2E4LCAweGFkYTQsIDB4MjAzMSwgMHgwMDAwLCAweDIwNDEsCisJMHgxMjQzLCAweDAwMTksIDB4MGQwOCwgMHgwMDhlLCAweDA4OTgsIDB4MDA5NiwgMHgwMDA2LCAweDA4MGMsCisJMHgwZmZmLCAweDAwMGUsIDB4MDFiMCwgMHhhOGFiLCAweDBkY2IsIDB4YTg3NiwgMHgwMDBlLCAweGE4YTIsCisJMHgwMDA2LCAweGFlNmEsIDB4MjgwMCwgMHhhODllLCAweGE5N2EsIDB4YWY3MiwgMHhhYThlLCAweGFiOTIsCisJMHhhYzk2LCAweGFkOWEsIDB4MDA4NiwgMHgyOTQwLCAweDA4MGMsIDB4MTBlOSwgMHgwMDhlLCAweDkwODUsCisJMHgwMDAxLCAweDAwOWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwZDYsIDB4MDAyNiwgMHg3MDA4LCAweDkwODQsCisJMHgwMGZmLCAweDYyMTAsIDB4MDBiNiwgMHgyMjU4LCAweGJhMTAsIDB4MDBiZSwgMHg5MjA2LCAweDE1MjAsCisJMHg3MDBjLCAweDYyMTAsIDB4MDBiNiwgMHgyMjU4LCAweGJhMTQsIDB4MDBiZSwgMHg5MjA2LCAweDExZTAsCisJMHg2MDQzLCAweDAwMDAsIDB4MmM2OCwgMHgwMDE2LCAweDIwMDksIDB4MDAzNSwgMHgwODBjLCAweGQzMDAsCisJMHgwMDFlLCAweDExNTgsIDB4NjIyYywgMHgyMjY4LCAweDIwNzEsIDB4MDI2YywgMHg2YjIwLCAweDkzODYsCisJMHgwMDAzLCAweDAxMzAsIDB4OTM4NiwgMHgwMDA2LCAweDAxMjgsIDB4MDgwYywgMHhhZjQzLCAweDAwMjAsCisJMHgwMDM5LCAweDAwMTAsIDB4MDgwYywgMHhiNTdjLCAweDAwMmUsIDB4MDBkZSwgMHgwMGVlLCAweDAwMDUsCisJMHgwMDk2LCAweDY4MTQsIDB4MjA0OCwgMHg5MTg2LCAweDAwMTUsIDB4MDkwNCwgMHhiNTY0LCAweDkxOGUsCisJMHgwMDE2LCAweDE5MDQsIDB4YjU3YSwgMHg3MDBjLCAweDkwOGMsIDB4ZmYwMCwgMHg5MTg2LCAweDE3MDAsCisJMHgwMTIwLCAweDkxODYsIDB4MDMwMCwgMHgxOTA0LCAweGI1M2UsIDB4ODlmZiwgMHgxMTM4LCAweDY4MDAsCisJMHg5MDg2LCAweDAwMGYsIDB4MDkwNCwgMHhiNTIxLCAweDA4MDQsIDB4YjU3OCwgMHg2ODA4LCAweDkwODYsCisJMHhmZmZmLCAweDE5MDQsIDB4YjU2NiwgMHhhODdjLCAweDkwODQsIDB4MDA2MCwgMHg5MDg2LCAweDAwMjAsCisJMHgxMTI4LCAweGE4M2MsIDB4YTk0MCwgMHg5MTA1LCAweDE5MDQsIDB4YjU2NiwgMHg2ODI0LCAweGQwODQsCisJMHgxOTA0LCAweGI1NjYsIDB4ZDBiNCwgMHgwMTU4LCAweDAwMTYsIDB4MjAwMSwgMHgxOTg1LCAweDIwMGMsCisJMHg2MDE4LCAweDkxMDIsIDB4OTA4MiwgMHgwMDA1LCAweDAwMWUsIDB4MWEwNCwgMHhiNTY2LCAweDA4MGMsCisJMHhjZTcxLCAweDY4NWMsIDB4YTg4MiwgMHhhODdjLCAweGMwZGMsIDB4YzBmNCwgMHhjMGQ0LCAweGE4N2UsCisJMHgwMDI2LCAweDkwMGUsIDB4NmExOCwgMHgyMDAxLCAweDAwMGEsIDB4MDgwYywgMHg5MDI3LCAweGE4ODQsCisJMHg5MjBhLCAweDAyMDgsIDB4ODAxMSwgMHhhYTg2LCAweDgyZmYsIDB4MDAyZSwgMHgxMTM4LCAweDAwYzYsCisJMHgyZDYwLCAweDA4MGMsIDB4Yzk5OSwgMHgwMGNlLCAweDA4MDQsIDB4YjU3OCwgMHgwMGM2LCAweGE4NjgsCisJMHhkMGZjLCAweDExMTgsIDB4MDgwYywgMHg2MTQxLCAweDAwMTAsIDB4MDgwYywgMHg2NTRlLCAweDAwY2UsCisJMHgxOTA0LCAweGI1NjYsIDB4MDBjNiwgMHgyZDYwLCAweDA4MGMsIDB4YWY0MywgMHgwMGNlLCAweDA4MDQsCisJMHhiNTc4LCAweDAwYzYsIDB4MDgwYywgMHhhZjkxLCAweDAxOTgsIDB4NjAxNywgMHgwMDAwLCAweDY4MTAsCisJMHg2MDEyLCAweDA4MGMsIDB4ZDEwMiwgMHg2MDIzLCAweDAwMDMsIDB4NjkwNCwgMHgwMGM2LCAweDJkNjAsCisJMHgwODBjLCAweGFmNDMsIDB4MDBjZSwgMHgwODBjLCAweGFmYmUsIDB4MDBjZSwgMHgwODA0LCAweGI1NzgsCisJMHgyMDAxLCAweDE5ODcsIDB4MjAwNCwgMHg2ODQyLCAweDAwY2UsIDB4MDRkMCwgMHg3MDA4LCAweDkwODYsCisJMHgwMDBiLCAweDExYzgsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjkwMCwgMHhjMWJjLCAweGI5MDIsCisJMHgwMGJlLCAweDAwYzYsIDB4MmQ2MCwgMHhhODdiLCAweDAwMDMsIDB4MDgwYywgMHhkMzQyLCAweDYwMDcsCisJMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDIzLCAweDAwMDIsIDB4MDgwYywgMHg5MWIxLCAweDA4MGMsCisJMHg5NzYzLCAweDAwY2UsIDB4MDBlOCwgMHg3MDBjLCAweDkwODYsIDB4MmEwMCwgMHgxMTM4LCAweDIwMDEsCisJMHgxOTg3LCAweDIwMDQsIDB4Njg0MiwgMHgwMGEwLCAweDA0NzksIDB4MDBhMCwgMHg4OWZmLCAweDA5MGMsCisJMHgwZGQ1LCAweDAwYzYsIDB4MDBkNiwgMHgyZDYwLCAweGE4NjcsIDB4MDEwMywgMHhhODdiLCAweDAwMDMsCisJMHgwODBjLCAweDZiMzMsIDB4MDgwYywgMHhjZTcxLCAweDA4MGMsIDB4YWY3NCwgMHgwMGRlLCAweDAwY2UsCisJMHgwODBjLCAweGFmNDMsIDB4MDA5ZSwgMHgwMDA1LCAweDkxODYsIDB4MDAxNSwgMHgxMTI4LCAweDIwMDEsCisJMHgxOTg3LCAweDIwMDQsIDB4Njg0MiwgMHgwMDY4LCAweDkxOGUsIDB4MDAxNiwgMHgxMTYwLCAweDAwYzYsCisJMHgyZDAwLCAweDIwNjAsIDB4MDgwYywgMHhlOTk3LCAweDA4MGMsIDB4ODc2ZiwgMHgwODBjLCAweGFmNDMsCisJMHgwMGNlLCAweDA4MGMsIDB4YWY0MywgMHgwMDA1LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LCAweDcyMjgsCisJMHhhY2IwLCAweGFiYWMsIDB4ZDJmNCwgMHgwMTMwLCAweDIwMDEsIDB4MTk4NywgMHgyMDA0LCAweDY4NDIsCisJMHgwODA0LCAweGI1ZjYsIDB4MDBjNiwgMHgyZDYwLCAweDA4MGMsIDB4Yzg5OCwgMHgwMGNlLCAweDY4MDQsCisJMHg5MDg2LCAweDAwNTAsIDB4MTE2OCwgMHgwMGM2LCAweDJkMDAsIDB4MjA2MCwgMHg2MDAzLCAweDAwMDEsCisJMHg2MDA3LCAweDAwNTAsIDB4MDgwYywgMHg5MWIxLCAweDA4MGMsIDB4OTc2MywgMHgwMGNlLCAweDA0ZjAsCisJMHg2ODAwLCAweDkwODYsIDB4MDAwZiwgMHgwMWE4LCAweDg5ZmYsIDB4MDkwYywgMHgwZGQ1LCAweDY4MDAsCisJMHg5MDg2LCAweDAwMDQsIDB4MTE5MCwgMHhhODdjLCAweGQwYWMsIDB4MDE3OCwgMHhhODQzLCAweDBmZmYsCisJMHhhODNmLCAweDBmZmYsIDB4YTg4MCwgMHhjMGZjLCAweGE4ODIsIDB4MjAwMSwgMHgwMDAxLCAweDY4MzIsCisJMHgwNDAwLCAweDIwMDEsIDB4MDAwNywgMHg2ODMyLCAweDAwZTAsIDB4YTg3YywgMHhkMGI0LCAweDExNTAsCisJMHhkMGFjLCAweDBkYjgsIDB4NjgyNCwgMHhkMGY0LCAweDFkNDgsIDB4YTgzOCwgMHhhOTM0LCAweDkxMDUsCisJMHgwZDgwLCAweDBjMjAsIDB4ZDJlYywgMHgxZDY4LCAweDcwMjQsIDB4OTMwNiwgMHgxMTE4LCAweDcwMjAsCisJMHg5NDA2LCAweDBkMzgsIDB4NzAyMCwgMHg2ODNlLCAweDcwMjQsIDB4NjgzYSwgMHgyMDAxLCAweDAwMDUsCisJMHg2ODMyLCAweDA4MGMsIDB4Y2ZmOSwgMHgwODBjLCAweDk3NjMsIDB4MDAxMCwgMHgwODBjLCAweGFmNDMsCisJMHgwMDRlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBkNiwgMHgwMDI2LCAweDcwMDgsCisJMHg5MDg0LCAweDAwZmYsIDB4NjIxMCwgMHgwMGI2LCAweDIyNTgsIDB4YmExMCwgMHgwMGJlLCAweDkyMDYsCisJMHgxOTA0LCAweGI2NjEsIDB4NzAwYywgMHg2MjEwLCAweDAwYjYsIDB4MjI1OCwgMHhiYTE0LCAweDAwYmUsCisJMHg5MjA2LCAweDE5MDQsIDB4YjY2MSwgMHg2MDM4LCAweDIwNjgsIDB4NjgyNCwgMHhjMGRjLCAweDY4MjYsCisJMHg2YTIwLCAweDkyODYsIDB4MDAwNywgMHgwOTA0LCAweGI2NjEsIDB4OTI4NiwgMHgwMDAyLCAweDA5MDQsCisJMHhiNjYxLCAweDkyODYsIDB4MDAwMCwgMHgwNWU4LCAweDY4MDgsIDB4NjMzYywgMHg5MzA2LCAweDE1YzgsCisJMHgyMDcxLCAweDAyNmMsIDB4OTE4NiwgMHgwMDE1LCAweDA1NzAsIDB4OTE4ZSwgMHgwMDE2LCAweDExMDAsCisJMHgwMGM2LCAweDYwMzgsIDB4MjA2MCwgMHg2MTA0LCAweDkxODYsIDB4MDA0YiwgMHgwMWMwLCAweDkxODYsCisJMHgwMDRjLCAweDAxYTgsIDB4OTE4NiwgMHgwMDRkLCAweDAxOTAsIDB4OTE4NiwgMHgwMDRlLCAweDAxNzgsCisJMHg5MTg2LCAweDAwNTIsIDB4MDE2MCwgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwgMHgwODBjLCAweGNjODYsCisJMHgwOTBjLCAweDBkZDUsIDB4YTg3YiwgMHgwMDAzLCAweDAwOWUsIDB4MDgwYywgMHhkMzQyLCAweDYwMDcsCisJMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDIzLCAweDAwMDIsIDB4MDgwYywgMHg5MWIxLCAweDA4MGMsCisJMHg5NzYzLCAweDAwY2UsIDB4MDAzMCwgMHg2MDM4LCAweDIwNzAsIDB4MjAwMSwgMHgxOTg3LCAweDIwMDQsCisJMHg3MDQyLCAweDA4MGMsIDB4YWY0MywgMHgwMDJlLCAweDAwZGUsIDB4MDBlZSwgMHgwMDA1LCAweDAwYjYsCisJMHgwMDk2LCAweDAwZjYsIDB4NjAxNCwgMHgyMDQ4LCAweDYwMTAsIDB4MjA1OCwgMHg5MWI2LCAweDAwMTUsCisJMHgwMTMwLCAweGJhMDgsIDB4YmIwYywgMHhiYzAwLCAweGM0OGMsIDB4YmMwMiwgMHgwNDYwLCAweDAwOTYsCisJMHgwMTU2LCAweDAwMzYsIDB4MDAyNiwgMHgyYjQ4LCAweDllOTAsIDB4MDAxMCwgMHgyMDE5LCAweDAwMGEsCisJMHgyMGE5LCAweDAwMDQsIDB4MDgwYywgMHhiZjExLCAweDAwMmUsIDB4MDAzZSwgMHgwMTVlLCAweDAwOWUsCisJMHgxOTA0LCAweGI2ZDAsIDB4MDA5NiwgMHgwMTU2LCAweDAwMzYsIDB4MDAyNiwgMHgyYjQ4LCAweDllOTAsCisJMHgwMDE0LCAweDIwMTksIDB4MDAwNiwgMHgyMGE5LCAweDAwMDQsIDB4MDgwYywgMHhiZjExLCAweDAwMmUsCisJMHgwMDNlLCAweDAxNWUsIDB4MDA5ZSwgMHgxNWEwLCAweDcyMzgsIDB4YmEwYSwgMHg3MzNjLCAweGJiMGUsCisJMHhiYzAwLCAweGM0OGQsIDB4YmMwMiwgMHhhODA0LCAweDkwMDUsIDB4MTEyOCwgMHgwMGZlLCAweDAwOWUsCisJMHgwMGJlLCAweDA4MDQsIDB4YjM0OCwgMHgwMDk2LCAweDIwNDgsIDB4YWExMiwgMHhhYjE2LCAweGFjMGEsCisJMHgwMDllLCAweDgwMDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsCisJMHg5MDgwLCAweDAwMDIsIDB4MjAwOSwgMHgwMDJiLCAweGFhYTAsIDB4YWI5YywgMHhhY2E4LCAweGFkYTQsCisJMHgyMDMxLCAweDAwMDAsIDB4MjA0MSwgMHgxMjQzLCAweDA4MGMsIDB4YjQ1ZCwgMHgwMTMwLCAweDAwZmUsCisJMHgwMDllLCAweDA4MGMsIDB4YWY0MywgMHgwMGJlLCAweDAwMDUsIDB4MDgwYywgMHhiOTA1LCAweDBjYjgsCisJMHgyYjc4LCAweDAwZjYsIDB4MDgwYywgMHgzMjFlLCAweDA4MGMsIDB4ZDM5ZCwgMHgwMGZlLCAweDAwYzYsCisJMHgwODBjLCAweGFlZWQsIDB4MmYwMCwgMHg2MDEyLCAweDYwMTcsIDB4MDAwMCwgMHg2MDIzLCAweDAwMDEsCisJMHg2MDA3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDY1ZTksCisJMHgwODBjLCAweDY2MTUsIDB4MDgwYywgMHg5MWY5LCAweDA4MGMsIDB4OTc2MywgMHgwMGNlLCAweDA4MDQsCisJMHhiNmEzLCAweDIxMDAsIDB4OTFiMiwgMHgwMDUzLCAweDFhMGMsIDB4MGRkNSwgMHg5MWIyLCAweDAwNDAsCisJMHgxYTA0LCAweGI3NTksIDB4MDAwMiwgMHhiNzQ3LCAweGI3NDcsIDB4YjczZCwgMHhiNzQ3LCAweGI3NDcsCisJMHhiNzQ3LCAweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsCisJMHhiNzNiLCAweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsCisJMHhiNzNiLCAweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsCisJMHhiNzNiLCAweGI3M2IsIDB4Yjc0NywgMHhiNzNiLCAweGI3NDcsIDB4Yjc0NywgMHhiNzNiLCAweGI3M2IsCisJMHhiNzNiLCAweGI3M2IsIDB4YjczYiwgMHhiNzNkLCAweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsCisJMHhiNzNiLCAweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsIDB4Yjc0NywgMHhiNzQ3LCAweGI3M2IsCisJMHhiNzNiLCAweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsCisJMHhiNzQ3LCAweGI3M2IsIDB4YjczYiwgMHgwODBjLCAweDBkZDUsIDB4MDA2NiwgMHgwMGI2LCAweDY2MTAsCisJMHgyNjU4LCAweGI4Y2MsIDB4YzA4YywgMHhiOGNlLCAweDAwYmUsIDB4MDA2ZSwgMHgwMDAwLCAweDYwMDMsCisJMHgwMDAxLCAweDYxMDYsIDB4OTE4NiwgMHgwMDMyLCAweDAxMTgsIDB4MDgwYywgMHg5MWY5LCAweDAwMTAsCisJMHgwODBjLCAweDkxYjEsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg5NzYzLCAweDAxMmUsCisJMHgwMDA1LCAweDI2MDAsIDB4MDAwMiwgMHhiNzQ3LCAweGI3NDcsIDB4Yjc2ZCwgMHhiNzQ3LCAweGI3NDcsCisJMHhiNzZkLCAweGI3NmQsIDB4Yjc2ZCwgMHhiNzZkLCAweGI3NDcsIDB4Yjc2ZCwgMHhiNzQ3LCAweGI3NmQsCisJMHhiNzQ3LCAweGI3NmQsIDB4Yjc2ZCwgMHhiNzZkLCAweGI3NmQsIDB4MDgwYywgMHgwZGQ1LCAweDYwMDQsCisJMHg5MGIyLCAweDAwNTMsIDB4MWEwYywgMHgwZGQ1LCAweDkxYjYsIDB4MDAxMywgMHgwOTA0LCAweGI4MzEsCisJMHg5MWI2LCAweDAwMjcsIDB4MTkwNCwgMHhiN2VjLCAweDA4MGMsIDB4OTY1NywgMHg2MDA0LCAweDA4MGMsCisJMHhjZTdkLCAweDAxYjAsIDB4MDgwYywgMHhjZThlLCAweDAxYTgsIDB4OTA4ZSwgMHgwMDIxLCAweDA5MDQsCisJMHhiN2U5LCAweDkwOGUsIDB4MDAyMiwgMHgxMTMwLCAweDA4MGMsIDB4YjM3NCwgMHgwOTA0LCAweGI3ZTUsCisJMHgwODA0LCAweGI3ZTYsIDB4OTA4ZSwgMHgwMDNkLCAweDA5MDQsIDB4YjdlOSwgMHgwODA0LCAweGI3ZGYsCisJMHgwODBjLCAweDMyNDcsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NjVlOSwgMHg2MDEwLCAweDAwYjYsCisJMHgyMDU4LCAweGI5YTAsIDB4MDBiZSwgMHgwODBjLCAweGI5MDUsIDB4OTE4NiwgMHgwMDdlLCAweDExNDgsCisJMHgyMDAxLCAweDE4MzcsIDB4MjAxNCwgMHhjMjg1LCAweDA4MGMsIDB4NzQzZSwgMHgxMTA4LCAweGMyYWQsCisJMHgyMjAyLCAweDAwMzYsIDB4MDAyNiwgMHgyMDE5LCAweDAwMjgsIDB4MjExMCwgMHgwODBjLCAweGVhYTMsCisJMHgwMDJlLCAweDAwM2UsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MjExMCwgMHgyMDE5LCAweDAwMjgsCisJMHgwODBjLCAweDkzNTYsIDB4MDA3NiwgMHg5MDNlLCAweDA4MGMsIDB4OTIyOSwgMHg2MDEwLCAweDAwYjYsCisJMHg5MDVkLCAweDAxMDAsIDB4MDBiZSwgMHgyYzA4LCAweDA4MGMsIDB4ZTQ3NywgMHgwMDdlLCAweDAwM2UsCisJMHgwMDJlLCAweDAwMWUsIDB4MDgwYywgMHhkMzlkLCAweDAwMTYsIDB4MDgwYywgMHhkMGZhLCAweDA4MGMsCisJMHhhZjQzLCAweDAwMWUsIDB4MDgwYywgMHgzMzFhLCAweDA4MGMsIDB4OTc2MywgMHgwMDMwLCAweDA4MGMsCisJMHhkMGZhLCAweDA4MGMsIDB4YWY0MywgMHgwODBjLCAweDk3NjMsIDB4MDAwNSwgMHgwODBjLCAweGI5MDUsCisJMHgwY2IwLCAweDA4MGMsIDB4Yjk0MSwgMHgwYzk4LCAweDkxODYsIDB4MDAxNCwgMHgxZGIwLCAweDA4MGMsCisJMHg5NjU3LCAweDYwMDQsIDB4OTA4ZSwgMHgwMDIyLCAweDExMTgsIDB4MDgwYywgMHhiMzc0LCAweDBkNjgsCisJMHgwODBjLCAweDMyMWUsIDB4MDgwYywgMHhkMzlkLCAweDA4MGMsIDB4Y2U3ZCwgMHgxMTkwLCAweDA4MGMsCisJMHgzMjQ3LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI5YTAsIDB4MDBiZSwgMHgwODBjLCAweGI5MDUsCisJMHg5MTg2LCAweDAwN2UsIDB4MTEyOCwgMHgyMDAxLCAweDE4MzcsIDB4MjAwYywgMHhjMTg1LCAweDIxMDIsCisJMHgwODcwLCAweDA4MGMsIDB4Y2U4ZSwgMHgxMTE4LCAweDA4MGMsIDB4YjkwNSwgMHgwODQwLCAweDYwMDQsCisJMHg5MDhlLCAweDAwMzIsIDB4MTE2MCwgMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwgMHgxODllLCAweDIwNzksCisJMHgwMDAwLCAweDA4MGMsIDB4MzViNSwgMHgwMGZlLCAweDAwZWUsIDB4MDgwNCwgMHhiN2RmLCAweDYwMDQsCisJMHg5MDhlLCAweDAwMjEsIDB4MGQ0OCwgMHg5MDhlLCAweDAwMjIsIDB4MDkwYywgMHhiOTA1LCAweDA4MDQsCisJMHhiN2RmLCAweDkwYjIsIDB4MDA0MCwgMHgxYTA0LCAweGI4ZTEsIDB4MjAwOCwgMHgwMDAyLCAweGI4NzksCisJMHhiODdhLCAweGI4N2QsIDB4Yjg4MCwgMHhiODgzLCAweGI4ODYsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsCisJMHhiODc3LCAweGI4NzcsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsCisJMHhiODc3LCAweGI4NzcsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsCisJMHhiODc3LCAweGI4NzcsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsIDB4Yjg4OSwgMHhiODk2LCAweGI4NzcsCisJMHhiODk4LCAweGI4OTYsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsIDB4Yjg3NywgMHhiODc3LCAweGI4OTYsCisJMHhiODk2LCAweGI4NzcsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsCisJMHhiODc3LCAweGI4YzgsIDB4Yjg5NiwgMHhiODc3LCAweGI4OTIsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsCisJMHhiODkzLCAweGI4NzcsIDB4Yjg3NywgMHhiODc3LCAweGI4OTYsIDB4YjhiZiwgMHhiODc3LCAweDA4MGMsCisJMHgwZGQ1LCAweDAwZTAsIDB4MjAwMSwgMHgwMDBiLCAweDA0MjAsIDB4MjAwMSwgMHgwMDAzLCAweDA0MDgsCisJMHgyMDAxLCAweDAwMDUsIDB4MDBmMCwgMHgyMDAxLCAweDAwMDEsIDB4MDBkOCwgMHgyMDAxLCAweDAwMDksCisJMHgwMGMwLCAweDA4MGMsIDB4OTY1NywgMHg2MDAzLCAweDAwMDUsIDB4MDgwYywgMHhkM2EwLCAweDA4MGMsCisJMHg5NzYzLCAweDAwNzAsIDB4MDAxOCwgMHgwMDEwLCAweDA4MGMsIDB4NjVlOSwgMHgwODA0LCAweGI4ZDksCisJMHgwODBjLCAweDk2NTcsIDB4MDgwYywgMHhkM2EwLCAweDYwMDMsIDB4MDAwNCwgMHgwODBjLCAweDk3NjMsCisJMHgwMDA1LCAweDA4MGMsIDB4NjVlOSwgMHgwODBjLCAweDk2NTcsIDB4NjAwMywgMHgwMDAyLCAweDAwMzYsCisJMHgyMDE5LCAweDE4NTIsIDB4MjMwNCwgMHg5MDg0LCAweGZmMDAsIDB4MTEyMCwgMHgyMDAxLCAweDE5ODUsCisJMHgyMDFjLCAweDAwNDAsIDB4ODAwNywgMHg5MDlhLCAweDAwMDQsIDB4MGVjMCwgMHg4MDAzLCAweDgwMWIsCisJMHg4MzFiLCAweDkzMTgsIDB4NjMxYSwgMHgwMDNlLCAweDA4MGMsIDB4OTc2MywgMHgwYzA4LCAweDA4MGMsCisJMHg5NjU3LCAweDA4MGMsIDB4ZDBmYSwgMHgwODBjLCAweGFmNDMsIDB4MDgwYywgMHg5NzYzLCAweDA4YzAsCisJMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwgMHgxODllLCAweDIwNzksIDB4MDAwMCwgMHgwODBjLCAweDM1YjUsCisJMHgwMGZlLCAweDAwZWUsIDB4MDgwYywgMHg5NjU3LCAweDA4MGMsIDB4YWY0MywgMHgwODBjLCAweDk3NjMsCisJMHgwODM4LCAweDA4MGMsIDB4OTY1NywgMHg2MDAzLCAweDAwMDIsIDB4MDgwYywgMHhkM2EwLCAweDA4MDQsCisJMHg5NzYzLCAweDI2MDAsIDB4MjAwOCwgMHgwMDAyLCAweGI4ZjgsIDB4YjhkOSwgMHhiOGY2LCAweGI4ZDksCisJMHhiOGQ5LCAweGI4ZjYsIDB4YjhmNiwgMHhiOGY2LCAweGI4ZjYsIDB4YjhkOSwgMHhiOGY2LCAweGI4ZDksCisJMHhiOGY2LCAweGI4ZDksIDB4YjhmNiwgMHhiOGY2LCAweGI4ZjYsIDB4YjhmNiwgMHgwODBjLCAweDBkZDUsCisJMHgwODBjLCAweDk2NTcsIDB4MDA5NiwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHg2ZDE3LCAweDAwOWUsCisJMHgwODBjLCAweGFmNDMsIDB4MDgwYywgMHg5NzYzLCAweDAwMDUsIDB4MDBlNiwgMHgwMDk2LCAweDAwMjYsCisJMHgwMDE2LCAweDA4MGMsIDB4Y2M4NiwgMHgwNTY4LCAweDYwMTQsIDB4MjA0OCwgMHhhODY0LCAweDkwODYsCisJMHgwMTM5LCAweDExYTgsIDB4YTg5NCwgMHg5MDg2LCAweDAwNTYsIDB4MTE0OCwgMHgwODBjLCAweDU0ZjcsCisJMHgwMTMwLCAweDIwMDEsIDB4MDAwMCwgMHg5MDBlLCAweDIwMTEsIDB4NDAwMCwgMHgwMDI4LCAweDIwMDEsCisJMHgwMDMwLCAweDkwMGUsIDB4MjAxMSwgMHg0MDA1LCAweDA4MGMsIDB4ZDI2NywgMHgwMDkwLCAweGE4NjgsCisJMHhkMGZjLCAweDAxNzgsIDB4YTgwNywgMHgwMDAwLCAweDAwMTYsIDB4NjAwNCwgMHg5MDhlLCAweDAwMjEsCisJMHgwMTY4LCAweDkwOGUsIDB4MDAzZCwgMHgwMTUwLCAweDAwMWUsIDB4YTg2NywgMHgwMTAzLCAweGE4MzMsCisJMHgwMTAwLCAweDAwMWUsIDB4MDAyZSwgMHgwMDllLCAweDAwZWUsIDB4MDAwNSwgMHgwMDFlLCAweDAwMDksCisJMHgwY2MwLCAweDAwOTYsIDB4NjAxNCwgMHgyMDQ4LCAweGE4MDAsIDB4MjA0OCwgMHhhODY3LCAweDAxMDMsCisJMHhhODIzLCAweDgwMDEsIDB4MDA5ZSwgMHgwMDA1LCAweDAwYjYsIDB4NjYxMCwgMHgyNjU4LCAweGI4MDQsCisJMHg5MDg0LCAweDAwZmYsIDB4OTBiMiwgMHgwMDBjLCAweDFhMGMsIDB4MGRkNSwgMHg2NjA0LCAweDk2YjYsCisJMHgwMDRkLCAweDExMjAsIDB4MDgwYywgMHhkMTg2LCAweDA4MDQsIDB4YjlkMSwgMHg2NjA0LCAweDk2YjYsCisJMHgwMDQzLCAweDExMjAsIDB4MDgwYywgMHhkMWNmLCAweDA4MDQsIDB4YjlkMSwgMHg2NjA0LCAweDk2YjYsCisJMHgwMDRiLCAweDExMjAsIDB4MDgwYywgMHhkMWZiLCAweDA4MDQsIDB4YjlkMSwgMHg2NjA0LCAweDk2YjYsCisJMHgwMDMzLCAweDExMjAsIDB4MDgwYywgMHhkMTFjLCAweDA4MDQsIDB4YjlkMSwgMHg2NjA0LCAweDk2YjYsCisJMHgwMDI4LCAweDExMjAsIDB4MDgwYywgMHhjZWNjLCAweDA4MDQsIDB4YjlkMSwgMHg2NjA0LCAweDk2YjYsCisJMHgwMDI5LCAweDExMjAsIDB4MDgwYywgMHhjZjBkLCAweDA4MDQsIDB4YjlkMSwgMHg2NjA0LCAweDk2YjYsCisJMHgwMDFmLCAweDExMjAsIDB4MDgwYywgMHhiMzFjLCAweDA4MDQsIDB4YjlkMSwgMHg2NjA0LCAweDk2YjYsCisJMHgwMDAwLCAweDExMTgsIDB4MDgwYywgMHhiNjY3LCAweDA0ZTAsIDB4NjYwNCwgMHg5NmI2LCAweDAwMjIsCisJMHgxMTE4LCAweDA4MGMsIDB4YjM1NSwgMHgwNGE4LCAweDY2MDQsIDB4OTZiNiwgMHgwMDM1LCAweDExMTgsCisJMHgwODBjLCAweGI0N2IsIDB4MDQ3MCwgMHg2NjA0LCAweDk2YjYsIDB4MDAzOSwgMHgxMTE4LCAweDA4MGMsCisJMHhiNWZjLCAweDA0MzgsIDB4NjYwNCwgMHg5NmI2LCAweDAwM2QsIDB4MTExOCwgMHgwODBjLCAweGIzOGQsCisJMHgwNDAwLCAweDY2MDQsIDB4OTZiNiwgMHgwMDQ0LCAweDExMTgsIDB4MDgwYywgMHhiM2M5LCAweDAwYzgsCisJMHg2NjA0LCAweDk2YjYsIDB4MDA0OSwgMHgxMTE4LCAweDA4MGMsIDB4YjQwYSwgMHgwMDkwLCAweDY2MDQsCisJMHg5NmI2LCAweDAwNDEsIDB4MTExOCwgMHgwODBjLCAweGIzZjQsIDB4MDA1OCwgMHg5MWI2LCAweDAwMTUsCisJMHgxMTEwLCAweDAwNjMsIDB4MDAzMCwgMHg5MWI2LCAweDAwMTYsIDB4MTEyOCwgMHgwMGJlLCAweDA4MDQsCisJMHhiYzJkLCAweDAwYmUsIDB4MDAwNSwgMHgwODBjLCAweGFmZDksIDB4MGNkOCwgMHhiOWVlLCAweGI5ZjEsCisJMHhiOWVlLCAweGJhMzgsIDB4YjllZSwgMHhiYmExLCAweGJjM2EsIDB4YjllZSwgMHhiOWVlLCAweGJjMDMsCisJMHhiOWVlLCAweGJjMTksIDB4MDA5NiwgMHg2MDFmLCAweDAwMDAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4MDAsCisJMHgyMDQ4LCAweGE4NjcsIDB4MDEwMywgMHgwMDllLCAweDA4MDQsIDB4YWY0MywgMHhhMDAxLCAweGEwMDEsCisJMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLCAweDcwOTAsIDB4OTA4NiwgMHgwMDc0LCAweDE1NDAsCisJMHgwODBjLCAweGU0NDgsIDB4MTFiMCwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHg3MDMwLCAweGQwOGMsCisJMHgwMTI4LCAweGI4MDAsIDB4ZDBiYywgMHgwMTEwLCAweGMwYzUsIDB4YjgwMiwgMHgwMGY5LCAweDAwYmUsCisJMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg2NWU5LCAweDA4MGMsIDB4MzI0NywgMHgwODBjLCAweGFmNDMsCisJMHgwMDk4LCAweDIwMDEsIDB4MDAwYSwgMHgwODBjLCAweDY1ZTksIDB4MDgwYywgMHgzMjQ3LCAweDYwMDMsCisJMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHgwODBjLCAweDkxZjksIDB4MDgwYywgMHg5NzYzLCAweDAwMjAsCisJMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHhiYjcxLCAweDAwZWUsIDB4MDAwNSwgMHgwMGQ2LCAweGI4MDAsCisJMHhkMDg0LCAweDAxNjAsIDB4OTAwNiwgMHgwODBjLCAweDY1ZDUsIDB4MjA2OSwgMHgxODQ3LCAweDY4MDQsCisJMHhkMGE0LCAweDAxMjAsIDB4MjAwMSwgMHgwMDA2LCAweDA4MGMsIDB4NjYxNSwgMHgwMGRlLCAweDAwMDUsCisJMHgwMGI2LCAweDAwOTYsIDB4MDBkNiwgMHgyMDExLCAweDE4MjQsIDB4MjIwNCwgMHg5MDg2LCAweDAwNzQsCisJMHgxOTA0LCAweGJiNDYsIDB4NjAxMCwgMHgyMDU4LCAweGJhYTAsIDB4OTI4NiwgMHgwMDdlLCAweDExMjAsCisJMHgwODBjLCAweGJkODcsIDB4MDgwNCwgMHhiYWFhLCAweDA4MGMsIDB4YmQ3YywgMHg2MDEwLCAweDIwNTgsCisJMHhiYWEwLCAweDkyODYsIDB4MDA4MCwgMHgxNTEwLCAweDYwMTQsIDB4OTAwNSwgMHgwMWE4LCAweDIwNDgsCisJMHhhODY0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMzksIDB4MTE0MCwgMHgyMDAxLCAweDAwMDAsCisJMHg5MDBlLCAweDIwMTEsIDB4NDAwMCwgMHgwODBjLCAweGQyNjcsIDB4MDAzMCwgMHhhODA3LCAweDAwMDAsCisJMHhhODY3LCAweDAxMDMsIDB4YTgzMywgMHgwMjAwLCAweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDY1ZTksCisJMHgwODBjLCAweDMyNDcsIDB4MDgwYywgMHhhZjQzLCAweDA4MDQsIDB4YmI0YiwgMHgwODBjLCAweGJiNTksCisJMHg2MDE0LCAweDkwMDUsIDB4MDE5MCwgMHgyMDQ4LCAweGE4NjgsIDB4ZDBmNCwgMHgwMWU4LCAweGE4NjQsCisJMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDM5LCAweDFkMDgsIDB4MjAwMSwgMHgwMDAwLCAweDkwMGUsCisJMHgyMDExLCAweDQwMDAsIDB4MDgwYywgMHhkMjY3LCAweDA4ZjgsIDB4MDgwYywgMHhiYjRmLCAweDAxNjAsCisJMHg5MDA2LCAweDA4MGMsIDB4NjVkNSwgMHgyMDAxLCAweDAwMDQsIDB4MDgwYywgMHg2NjE1LCAweDIwMDEsCisJMHgwMDA3LCAweDA4MGMsIDB4NjVlOSwgMHgwOGEwLCAweDIwMDEsIDB4MDAwNCwgMHgwODBjLCAweDY1ZTksCisJMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAzLCAweDA4MGMsIDB4OTFmOSwgMHgwODBjLCAweDk3NjMsCisJMHgwODA0LCAweGJiNGIsIDB4Yjg1YywgMHhkMGU0LCAweDAxZDgsIDB4MDgwYywgMHhkMDljLCAweDA4MGMsCisJMHg3NDNlLCAweDAxMTgsIDB4ZDBkYywgMHgxOTA0LCAweGJhNmMsIDB4MjAxMSwgMHgxODM3LCAweDIyMDQsCisJMHhjMGFkLCAweDIwMTIsIDB4MjAwMSwgMHgxOTZjLCAweDIwMDQsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsCisJMHg3OGUzLCAweDAwMDAsIDB4MDgwYywgMHgyOGYwLCAweDc4ZTIsIDB4MDBmZSwgMHgwODA0LCAweGJhNmMsCisJMHgwODBjLCAweGQwZDksIDB4MjAxMSwgMHgxODM3LCAweDIyMDQsIDB4YzBhNSwgMHgyMDEyLCAweDAwMDYsCisJMHgwODBjLCAweGU1Y2QsIDB4MDAwZSwgMHgxOTA0LCAweGJhNmMsIDB4YzBiNSwgMHgyMDEyLCAweDIwMDEsCisJMHgwMDA2LCAweDA4MGMsIDB4NjVlOSwgMHg5MDA2LCAweDA4MGMsIDB4NjVkNSwgMHgwMGM2LCAweDIwMDEsCisJMHgxODBmLCAweDIwMDQsIDB4ZDA5YywgMHgwNTIwLCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDAwZTYsCisJMHgyMDcxLCAweDE4MDAsIDB4NzAwYywgMHg5MDg0LCAweDAwZmYsIDB4NzhlNiwgMHg3MDdlLCAweDcwMTAsCisJMHg3OGVhLCAweDcwODIsIDB4OTA4YywgMHgwMGZmLCAweDAwZWUsIDB4NzgwYywgMHhjMGI1LCAweDc4MGUsCisJMHgwMGZlLCAweDA4MGMsIDB4MjhjNSwgMHgwMGY2LCAweDIxMDAsIDB4OTAwZSwgMHgwODBjLCAweDI4N2MsCisJMHg3OTVlLCAweDAwZmUsIDB4OTE4NiwgMHgwMDgxLCAweDAxZDgsIDB4MjAwOSwgMHgwMDgxLCAweDAwYzgsCisJMHgyMDA5LCAweDAwZWYsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4NzllYSwgMHg3OTMyLCAweDc5MzYsCisJMHg3ODBjLCAweGMwYjUsIDB4NzgwZSwgMHgwMGZlLCAweDA4MGMsIDB4MjhjNSwgMHgwMGY2LCAweDIwNzksCisJMHgxODAwLCAweDc5ODIsIDB4MjEwMCwgMHg5MDBlLCAweDA4MGMsIDB4Mjg3YywgMHg3OTVlLCAweDAwZmUsCisJMHg4MTA4LCAweDA4MGMsIDB4NjYzOCwgMHgyYjAwLCAweDAwY2UsIDB4MTkwNCwgMHhiYTZjLCAweDYwMTIsCisJMHgyMDA5LCAweDE4MGYsIDB4MjEwYywgMHhkMTljLCAweDAxNTAsIDB4MjAwOSwgMHgwMjdjLCAweDIxMGMsCisJMHg5MThjLCAweDAwZmYsIDB4YjkxMiwgMHgyMDA5LCAweDAyN2QsIDB4MjEwYywgMHhiOTE2LCAweDIwMDEsCisJMHgwMDAyLCAweDA4MGMsIDB4NjVlOSwgMHg2MDIzLCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDAyLCAweDA4MGMsIDB4OTFmOSwgMHgwODBjLCAweDk3NjMsIDB4MDAyOCwgMHgwODBjLCAweGI5MDUsCisJMHgyMDAxLCAweDAwMDEsIDB4MDQzMSwgMHgwMGRlLCAweDAwOWUsIDB4MDBiZSwgMHgwMDA1LCAweDIwMDEsCisJMHgxODEwLCAweDIwMDQsIDB4ZDBhNCwgMHgwMTIwLCAweDIwMDEsIDB4MTg0OCwgMHgyMDA0LCAweGQwYWMsCisJMHgwMDA1LCAweDAwZTYsIDB4MDgwYywgMHhlYWZjLCAweDAxOTAsIDB4MjA3MSwgMHgwMjYwLCAweDcxMDgsCisJMHg3MjBjLCAweDkxOGMsIDB4MDBmZiwgMHgxMTE4LCAweDkyODQsIDB4ZmYwMCwgMHgwMTQwLCAweDYwMTAsCisJMHgyMDU4LCAweGI4YTAsIDB4OTA4NCwgMHhmZjgwLCAweDExMTAsIDB4YjkxMiwgMHhiYTE2LCAweDAwZWUsCisJMHgwMDA1LCAweDIwMzAsIDB4OTAwNSwgMHgwMTU4LCAweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDY1ZTksCisJMHgwODBjLCAweDU3NzEsIDB4MTEyMCwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg2NjE1LCAweDI2MDAsCisJMHg5MDA1LCAweDExYjAsIDB4NjAxNCwgMHgwMDk2LCAweDIwNDgsIDB4YTg2OCwgMHgwMDllLCAweGQwZmMsCisJMHgxMTc4LCAweDAwMzYsIDB4MDA0NiwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiYmEwLCAweDAwYmUsCisJMHgyMDIxLCAweDAwMDQsIDB4MjAxMSwgMHg4MDE0LCAweDA4MGMsIDB4NGI3ZiwgMHgwMDRlLCAweDAwM2UsCisJMHgwODBjLCAweDMyNDcsIDB4NjAyMCwgMHg5MDg2LCAweDAwMGEsIDB4MTEwOCwgMHgwMDA1LCAweDA4MDQsCisJMHhhZjQzLCAweDAwYjYsIDB4MDBlNiwgMHgwMDI2LCAweDAwMTYsIDB4MjA3MSwgMHgxODAwLCAweDcwOTAsCisJMHg5MDg2LCAweDAwMTQsIDB4MTkwNCwgMHhiYmY5LCAweDA4MGMsIDB4NTc3MSwgMHgxMTcwLCAweDYwMTQsCisJMHg5MDA1LCAweDExNTgsIDB4MDAzNiwgMHgwMDQ2LCAweDYwMTAsIDB4MjA1OCwgMHhiYmEwLCAweDIwMjEsCisJMHgwMDA2LCAweDA4MGMsIDB4NGQzNiwgMHgwMDRlLCAweDAwM2UsIDB4MDBkNiwgMHg2MDEwLCAweDIwNTgsCisJMHgwODBjLCAweDY3MzQsIDB4MDgwYywgMHhiYTI2LCAweDAwZGUsIDB4MDgwYywgMHhiZTRkLCAweDE1ODgsCisJMHg2MDEwLCAweDIwNTgsIDB4Yjg5MCwgMHg5MDA1LCAweDA1NjAsIDB4MjAwMSwgMHgwMDA2LCAweDA4MGMsCisJMHg2NWU5LCAweDAwOTYsIDB4NjAxNCwgMHg5MDRkLCAweDAxZDAsIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsCisJMHg5MDg2LCAweDAwMzksIDB4MTE0MCwgMHgyMDAxLCAweDAwMDAsIDB4OTAwZSwgMHgyMDExLCAweDQwMDAsCisJMHgwODBjLCAweGQyNjcsIDB4MDA2MCwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMjksCisJMHgwMTMwLCAweGE4MDcsIDB4MDAwMCwgMHhhODY3LCAweDAxMDMsIDB4YTgzMywgMHgwMjAwLCAweDAwOWUsCisJMHgwODBjLCAweDMyNDcsIDB4NjAyMCwgMHg5MDg2LCAweDAwMGEsIDB4MDE0MCwgMHgwODBjLCAweGFmNDMsCisJMHgwMDI4LCAweDA4MGMsIDB4YjkwNSwgMHg5MDA2LCAweDA4MGMsIDB4YmI3MSwgMHgwMDFlLCAweDAwMmUsCisJMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHgyMDExLCAweDE4MjQsIDB4MjIwNCwgMHg5MDg2LCAweDAwMTQsCisJMHgxMTYwLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDY1ZTksIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDAxLCAweDA4MGMsIDB4OTFmOSwgMHgwODA0LCAweDk3NjMsIDB4MjAwMSwgMHgwMDAxLCAweDA4MDQsCisJMHhiYjcxLCAweDIwMzAsIDB4MjAxMSwgMHgxODI0LCAweDIyMDQsIDB4OTA4NiwgMHgwMDA0LCAweDExNDgsCisJMHg5NmI2LCAweDAwMGIsIDB4MTEyMCwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg2NWU5LCAweDA4MDQsCisJMHhhZjQzLCAweDIwMDEsIDB4MDAwMSwgMHgwODA0LCAweGJiNzEsIDB4MDAwMiwgMHhiOWVlLCAweGJjNDUsCisJMHhiOWVlLCAweGJjODYsIDB4YjllZSwgMHhiZDMzLCAweGJjM2EsIDB4YjllZSwgMHhiOWVlLCAweGJkNDcsCisJMHhiOWVlLCAweGJkNTksIDB4NjYwNCwgMHg5Njg2LCAweDAwMDMsIDB4MDkwNCwgMHhiYmExLCAweDk2YjYsCisJMHgwMDFlLCAweDExMTAsIDB4MDgwYywgMHhhZjQzLCAweDAwMDUsIDB4MDBiNiwgMHgwMGQ2LCAweDAwYzYsCisJMHgwODBjLCAweGJkNmIsIDB4MTFhMCwgMHg5MDA2LCAweDA4MGMsIDB4NjVkNSwgMHgwODBjLCAweDMyMWUsCisJMHgwODBjLCAweGQzOWQsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NjVlOSwgMHg2MDAzLCAweDAwMDEsCisJMHg2MDA3LCAweDAwMDIsIDB4MDgwYywgMHg5MWY5LCAweDA4MGMsIDB4OTc2MywgMHgwNDE4LCAweDIwMDksCisJMHgwMjZlLCAweDIxMDQsIDB4OTA4NiwgMHgwMDA5LCAweDExNjAsIDB4NjAxMCwgMHgyMDU4LCAweGI4NDAsCisJMHg5MDg0LCAweDAwZmYsIDB4OTAwNSwgMHgwMTcwLCAweDgwMDEsIDB4Yjg0MiwgMHg2MDFiLCAweDAwMGEsCisJMHgwMDg4LCAweDIwMDksIDB4MDI2ZiwgMHgyMTA0LCAweDkwODQsIDB4ZmYwMCwgMHg5MDg2LCAweDE5MDAsCisJMHgxMTA4LCAweDA4YTAsIDB4MDgwYywgMHgzMjFlLCAweDA4MGMsIDB4ZDM5ZCwgMHgyMDAxLCAweDAwMDEsCisJMHgwODBjLCAweGJiNzEsIDB4MDBjZSwgMHgwMGRlLCAweDAwYmUsIDB4MDAwNSwgMHgwMDk2LCAweDAwYjYsCisJMHgwMDI2LCAweDkwMTYsIDB4MDgwYywgMHhiZDc5LCAweDAwZDYsIDB4MjA2OSwgMHgxOTdiLCAweDJkMDQsCisJMHg5MDA1LCAweDAxNjgsIDB4NjAxMCwgMHgyMDU4LCAweGI4YTAsIDB4OTA4NiwgMHgwMDdlLCAweDExMzgsCisJMHgyMDY5LCAweDE4MjAsIDB4MmQwNCwgMHg4MDAwLCAweDIwNmEsIDB4MDBkZSwgMHgwMDEwLCAweDAwZGUsCisJMHgwMDg4LCAweDkwMDYsIDB4MDgwYywgMHg2NWQ1LCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDY1ZTksCisJMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAyLCAweDA4MGMsIDB4OTFmOSwgMHgwODBjLCAweDk3NjMsCisJMHgwODA0LCAweGJkMDMsIDB4MDgwYywgMHhjYzg2LCAweDAxYjAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4NjQsCisJMHgyMDEwLCAweDkwODYsIDB4MDEzOSwgMHgxMTM4LCAweDYwMDcsIDB4MDAxNiwgMHgyMDAxLCAweDAwMDIsCisJMHgwODBjLCAweGQyYzEsIDB4MDBiMCwgMHg2MDE0LCAweDIwNDgsIDB4YTg2NCwgMHhkMGZjLCAweDAxMTgsCisJMHgyMDAxLCAweDAwMDEsIDB4MGNhOCwgMHgyMDAxLCAweDE4MGUsIDB4MjAwNCwgMHhkMGRjLCAweDAxNDgsCisJMHg2MDEwLCAweDIwNTgsIDB4Yjg0MCwgMHg5MDg0LCAweDAwZmYsIDB4OTAwNSwgMHgxMTEwLCAweDkwMDYsCisJMHgwYzM4LCAweDA4MGMsIDB4YjkwNSwgMHgyMDA5LCAweDAyNmUsIDB4MjEzNCwgMHg5NmI0LCAweDAwZmYsCisJMHg5Njg2LCAweDAwMDUsIDB4MDUyMCwgMHg5Njg2LCAweDAwMGIsIDB4MDFjOCwgMHgyMDA5LCAweDAyNmYsCisJMHgyMTA0LCAweDkwODQsIDB4ZmYwMCwgMHgxMTE4LCAweDk2ODYsIDB4MDAwOSwgMHgwMWMwLCAweDkwODYsCisJMHgxOTAwLCAweDExNjgsIDB4OTY4NiwgMHgwMDA5LCAweDAxOTAsIDB4MjAwMSwgMHgwMDA0LCAweDA4MGMsCisJMHg2NWU5LCAweDIwMDEsIDB4MDAyOCwgMHg2MDFhLCAweDYwMDcsIDB4MDA1MiwgMHgwMDIwLCAweDIwMDEsCisJMHgwMDAxLCAweDA4MGMsIDB4YmI3MSwgMHgwMDJlLCAweDAwYmUsIDB4MDA5ZSwgMHgwMDA1LCAweDkyODYsCisJMHgwMTM5LCAweDAxNjAsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Y2M4NiwgMHgwMTQwLCAweGE4NjQsCisJMHg5MDg2LCAweDAxMzksIDB4MDExOCwgMHhhODY4LCAweGQwZmMsIDB4MDEwOCwgMHgwYzQwLCAweDYwMTAsCisJMHgyMDU4LCAweGI4NDAsIDB4OTA4NCwgMHgwMGZmLCAweDkwMDUsIDB4MDEzOCwgMHg4MDAxLCAweGI4NDIsCisJMHg2MDFiLCAweDAwMGEsIDB4NjAwNywgMHgwMDE2LCAweDA4ZjAsIDB4YjhhMCwgMHg5MDg2LCAweDAwN2UsCisJMHgxMTM4LCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLCAweDA4MGMsIDB4NjA0MCwgMHgwMGVlLCAweDAwMTAsCisJMHgwODBjLCAweDMyMWUsIDB4MDg2MCwgMHgwODBjLCAweGJkNzksIDB4MTE2MCwgMHgyMDAxLCAweDAwMDQsCisJMHgwODBjLCAweDY1ZTksIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMywgMHgwODBjLCAweDkxZjksCisJMHgwODA0LCAweDk3NjMsIDB4MDgwYywgMHhiOTA1LCAweDkwMDYsIDB4MDgwNCwgMHhiYjcxLCAweDA0ODksCisJMHgxMTYwLCAweDIwMDEsIDB4MDAwOCwgMHgwODBjLCAweDY1ZTksIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDA1LCAweDA4MGMsIDB4OTFmOSwgMHgwODA0LCAweDk3NjMsIDB4MjAwMSwgMHgwMDAxLCAweDA4MDQsCisJMHhiYjcxLCAweDAwZjksIDB4MTE2MCwgMHgyMDAxLCAweDAwMGEsIDB4MDgwYywgMHg2NWU5LCAweDYwMDMsCisJMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHgwODBjLCAweDkxZjksIDB4MDgwNCwgMHg5NzYzLCAweDIwMDEsCisJMHgwMDAxLCAweDA4MDQsIDB4YmI3MSwgMHgyMDA5LCAweDAyNmUsIDB4MjEwNCwgMHg5MDg2LCAweDAwMDMsCisJMHgxMTM4LCAweDIwMDksIDB4MDI2ZiwgMHgyMTA0LCAweDkwODQsIDB4ZmYwMCwgMHg5MDg2LCAweDJhMDAsCisJMHgwMDA1LCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwYjYsIDB4MDBjNiwgMHgwMDE2LCAweDYxMTAsCisJMHgyMTU4LCAweDA4MGMsIDB4NjZhOCwgMHgwMDFlLCAweDAwY2UsIDB4MDBiZSwgMHgwMDA1LCAweDAwYjYsCisJMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMDM2LCAweDAwMTYsIDB4NjAxMCwgMHgyMDU4LCAweDIwMDksCisJMHgxODM3LCAweDIxMDQsIDB4OTA4NSwgMHgwMDAzLCAweDIwMGEsIDB4MDgwYywgMHhiZTFmLCAweDA1NjAsCisJMHgyMDA5LCAweDE4MzcsIDB4MjEwNCwgMHhjMGNkLCAweDIwMGEsIDB4MDgwYywgMHg2YTA4LCAweDAxNTgsCisJMHg5MDA2LCAweDIwMjAsIDB4MjAwOSwgMHgwMDJhLCAweDA4MGMsIDB4ZTczYSwgMHgyMDAxLCAweDE4MGMsCisJMHgyMDBjLCAweGMxOTUsIDB4MjEwMiwgMHgyMDE5LCAweDAwMmEsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsCisJMHgzMWU5LCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLCAweDA4MGMsIDB4MmZmNSwgMHgwMGVlLCAweDAwYzYsCisJMHgwMTU2LCAweDIwYTksIDB4MDc4MSwgMHgyMDA5LCAweDAwN2YsIDB4MDgwYywgMHgzMzFhLCAweDgxMDgsCisJMHgxZjA0LCAweGJkYmQsIDB4MDE1ZSwgMHgwMGNlLCAweDA4MGMsIDB4YmQ3YywgMHgyMDcxLCAweDAyNjAsCisJMHgyMDc5LCAweDAyMDAsIDB4NzgxNywgMHgwMDAxLCAweDIwMDEsIDB4MTgzNywgMHgyMDBjLCAweGMxYzUsCisJMHg3MDE4LCAweGQwZmMsIDB4MDExMCwgMHhkMGRjLCAweDAxMTgsIDB4NzAzOCwgMHhkMGRjLCAweDExMDgsCisJMHhjMWM0LCAweDc4MTcsIDB4MDAwMCwgMHgyMDAxLCAweDE4MzcsIDB4MjEwMiwgMHgyMDc5LCAweDAxMDAsCisJMHgyZTA0LCAweDkwODQsIDB4MDBmZiwgMHgyMDY5LCAweDE4MWYsIDB4MjA2YSwgMHg3OGU2LCAweDAwMDYsCisJMHg4ZTcwLCAweDJlMDQsIDB4MjA2OSwgMHgxODIwLCAweDIwNmEsIDB4NzhlYSwgMHg3ODMyLCAweDc4MzYsCisJMHgyMDEwLCAweDkwODQsIDB4ZmYwMCwgMHgwMDFlLCAweDkxMDUsIDB4MjAwOSwgMHgxODJjLCAweDIwMGEsCisJMHgyMjAwLCAweDkwODQsIDB4MDBmZiwgMHgyMDA4LCAweDA4MGMsIDB4MjhjNSwgMHgwODBjLCAweDc0M2UsCisJMHgwMTcwLCAweDIwNzEsIDB4MDI2MCwgMHgyMDY5LCAweDE5ODEsIDB4NzA0OCwgMHgyMDZhLCAweDcwNGMsCisJMHg2ODA2LCAweDcwNTAsIDB4NjgwYSwgMHg3MDU0LCAweDY4MGUsIDB4MDgwYywgMHhkMDljLCAweDAwNDAsCisJMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg2NWU5LCAweDA4MGMsIDB4MzI0NywgMHgwODBjLCAweGFmNDMsCisJMHgwMDFlLCAweDAwM2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDBiZSwgMHgwMDA1LCAweDAwOTYsCisJMHgwMDI2LCAweDAwMzYsIDB4MDBlNiwgMHgwMTU2LCAweDIwMTksIDB4MTgyYywgMHgyMzFjLCAweDgzZmYsCisJMHgwMWYwLCAweDIwNzEsIDB4MDI2MCwgMHg3MjAwLCAweDkyOTQsIDB4MDBmZiwgMHg3MDA0LCAweDkwODQsCisJMHhmZjAwLCAweDkyMDUsIDB4OTMwNiwgMHgxMTk4LCAweDIwMTEsIDB4MDI3NiwgMHgyMGE5LCAweDAwMDQsCisJMHgyYjQ4LCAweDIwMTksIDB4MDAwYSwgMHgwODBjLCAweGJmMTEsIDB4MTE0OCwgMHgyMDExLCAweDAyN2EsCisJMHgyMGE5LCAweDAwMDQsIDB4MjAxOSwgMHgwMDA2LCAweDA4MGMsIDB4YmYxMSwgMHgxMTAwLCAweDAxNWUsCisJMHgwMGVlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDllLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDAyNjAsCisJMHg3MDM0LCAweDkwODYsIDB4MDAxNCwgMHgxMWE4LCAweDcwMzgsIDB4OTA4NiwgMHgwODAwLCAweDExODgsCisJMHg3MDNjLCAweGQwZWMsIDB4MDE2MCwgMHg5MDg0LCAweDBmMDAsIDB4OTA4NiwgMHgwMTAwLCAweDExMzgsCisJMHg3MDU0LCAweGQwYTQsIDB4MTExMCwgMHhkMGFjLCAweDAxMTAsIDB4OTAwNiwgMHgwMDEwLCAweDkwODUsCisJMHgwMDAxLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwOTYsIDB4MDBjNiwgMHgwMDc2LCAweDAwNTYsCisJMHgwMDQ2LCAweDAwMjYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDI5LCAweDE5ZWYsCisJMHgyNTJjLCAweDIwMjEsIDB4MTlmNSwgMHgyNDI0LCAweDIwNjEsIDB4MWNkMCwgMHgyMDcxLCAweDE4MDAsCisJMHg3MjU0LCAweDcwNzQsIDB4OTIwMiwgMHgxYTA0LCAweGJlZGQsIDB4MDgwYywgMHg4YTNkLCAweDA5MDQsCisJMHhiZWQ2LCAweDA4MGMsIDB4ZTc2YiwgMHgwOTA0LCAweGJlZDYsIDB4NjcyMCwgMHg5Nzg2LCAweDAwMDcsCisJMHgwOTA0LCAweGJlZDYsIDB4MjUwMCwgMHg5YzA2LCAweDA5MDQsIDB4YmVkNiwgMHgyNDAwLCAweDljMDYsCisJMHgwNWU4LCAweDNlMDgsIDB4OTE4NiwgMHgwMDAyLCAweDExNDgsIDB4NjAxMCwgMHg5MDA1LCAweDAxMzAsCisJMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MTU4MCwgMHgwMGM2LCAweDYwMDAsCisJMHg5MDg2LCAweDAwMDQsIDB4MTExMCwgMHgwODBjLCAweDFhYTEsIDB4OTc4NiwgMHgwMDBhLCAweDAxNDgsCisJMHgwODBjLCAweGNlOGUsIDB4MTEzMCwgMHgwMGNlLCAweDA4MGMsIDB4YjkwNSwgMHgwODBjLCAweGFmNzQsCisJMHgwMGU4LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGNjODYsIDB4MDFhOCwgMHg5Nzg2LCAweDAwMDMsCisJMHgxNTMwLCAweGE4NjcsIDB4MDEwMywgMHhhODdjLCAweGQwY2MsIDB4MDEzMCwgMHgwMDk2LCAweGE4NzgsCisJMHgyMDQ4LCAweDA4MGMsIDB4MGZiMSwgMHgwMDllLCAweGFiN2EsIDB4YTg3NywgMHgwMDAwLCAweDA4MGMsCisJMHg2ZDBiLCAweDA4MGMsIDB4Y2U3MSwgMHgwODBjLCAweGFmNzQsIDB4MDBjZSwgMHg5Y2UwLCAweDAwMTgsCisJMHg3MDY4LCAweDljMDIsIDB4MTIxMCwgMHgwODA0LCAweGJlODAsIDB4MDEyZSwgMHgwMDBlLCAweDAwMmUsCisJMHgwMDRlLCAweDAwNWUsIDB4MDA3ZSwgMHgwMGNlLCAweDAwOWUsIDB4MDBlZSwgMHgwMDA1LCAweDk3ODYsCisJMHgwMDA2LCAweDExMTgsIDB4MDgwYywgMHhlNmRkLCAweDBjMzAsIDB4OTc4NiwgMHgwMDA5LCAweDExNDgsCisJMHg2MDAwLCAweDkwODYsIDB4MDAwNCwgMHgwZDA4LCAweDIwMDksIDB4MDA0YywgMHgwODBjLCAweGFmYmUsCisJMHgwOGUwLCAweDk3ODYsIDB4MDAwYSwgMHgwOTgwLCAweDA4MjAsIDB4MjIwYywgMHgyMzA0LCAweDkxMDYsCisJMHgxMTMwLCAweDgyMTAsIDB4ODMxOCwgMHgxZjA0LCAweGJlZmQsIDB4OTAwNiwgMHgwMDA1LCAweDIzMDQsCisJMHg5MTAyLCAweDAyMTgsIDB4MjAwMSwgMHgwMDAxLCAweDAwMDgsIDB4OTAwNiwgMHg5MThkLCAweDAwMDEsCisJMHgwMDA1LCAweDAxMzYsIDB4MDFjNiwgMHgwMDE2LCAweDg5MDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwOGMsCisJMHgwMDNmLCAweDIxZTAsIDB4OTA4NCwgMHhmZmMwLCAweDkzMDAsIDB4MjA5OCwgMHgzNTE4LCAweDIwYTksCisJMHgwMDAxLCAweDIyMGMsIDB4NDAwMiwgMHg5MTBlLCAweDExNDAsIDB4ODIxMCwgMHg4MzE5LCAweDFkYzgsCisJMHg5MDA2LCAweDAwMWUsIDB4MDFjZSwgMHgwMTNlLCAweDAwMDUsIDB4MjIwYywgMHg5MTAyLCAweDAyMTgsCisJMHgyMDAxLCAweDAwMDEsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDAsIDB4OTE4ZCwgMHgwMDAxLCAweDAwMWUsCisJMHgwMWNlLCAweDAxM2UsIDB4MDAwNSwgMHgyMjBjLCAweDgxMGYsIDB4MjMwNCwgMHg5MTA2LCAweDExMzAsCisJMHg4MjEwLCAweDgzMTgsIDB4MWYwNCwgMHhiZjNiLCAweDkwMDYsIDB4MDAwNSwgMHg5MThkLCAweDAwMDEsCisJMHgwMDA1LCAweDYwMDQsIDB4OTA4YSwgMHgwMDUzLCAweDFhMGMsIDB4MGRkNSwgMHgwODBjLCAweGNlN2QsCisJMHgwMTIwLCAweDA4MGMsIDB4Y2U4ZSwgMHgwMTY4LCAweDAwMjgsIDB4MDgwYywgMHgzMjQ3LCAweDA4MGMsCisJMHhjZThlLCAweDAxMzgsIDB4MDgwYywgMHg5NjU3LCAweDA4MGMsIDB4YWY0MywgMHgwODBjLCAweDk3NjMsCisJMHgwMDA1LCAweDA4MGMsIDB4YjkwNSwgMHgwY2IwLCAweDkxODIsIDB4MDA1NCwgMHgxMjIwLCAweDkxODIsCisJMHgwMDQwLCAweDAyMDgsIDB4MDAwYSwgMHgwMDA1LCAweGJmODAsIDB4YmY4MCwgMHhiZjgwLCAweGJmODAsCisJMHhiZjgwLCAweGJmODAsIDB4YmY4MCwgMHhiZjgwLCAweGJmODAsIDB4YmY4MCwgMHhiZjgwLCAweGJmODIsCisJMHhiZjgyLCAweGJmODIsIDB4YmY4MiwgMHhiZjgwLCAweGJmODAsIDB4YmY4MCwgMHhiZjgyLCAweGJmODAsCisJMHgwODBjLCAweDBkZDUsIDB4NjAwYiwgMHhmZmZmLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDA4MGMsCisJMHg5MWIxLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4OTc2MywgMHgwMTJlLCAweDAwMDUsCisJMHg5MTg2LCAweDAwMTMsIDB4MTEyOCwgMHg2MDA0LCAweDkwODIsIDB4MDA0MCwgMHgwODA0LCAweGMwMzcsCisJMHg5MTg2LCAweDAwMjcsIDB4MTUyMCwgMHgwODBjLCAweDk2NTcsIDB4MDgwYywgMHgzMjFlLCAweDA4MGMsCisJMHhkMzlkLCAweDAwOTYsIDB4NjExNCwgMHgyMTQ4LCAweDA4MGMsIDB4Y2M4NiwgMHgwMTk4LCAweDA4MGMsCisJMHhjZThlLCAweDExMTgsIDB4MDgwYywgMHhiOTA1LCAweDAwNjgsIDB4YTg2NywgMHgwMTAzLCAweGE4N2IsCisJMHgwMDI5LCAweGE4NzcsIDB4MDAwMCwgMHhhOTdjLCAweGMxYzUsIDB4YTk3ZSwgMHgwODBjLCAweDZkMTcsCisJMHgwODBjLCAweGNlNzEsIDB4MDA5ZSwgMHgwODBjLCAweGFmNDMsIDB4MDgwNCwgMHg5NzYzLCAweDkxODYsCisJMHgwMDE0LCAweDExMjAsIDB4NjAwNCwgMHg5MDgyLCAweDAwNDAsIDB4MDRhMCwgMHg5MTg2LCAweDAwNDYsCisJMHgwMTUwLCAweDkxODYsIDB4MDA0NSwgMHgwMTM4LCAweDkxODYsIDB4MDA1MywgMHgwMTIwLCAweDkxODYsCisJMHgwMDQ4LCAweDE5MGMsIDB4MGRkNSwgMHgyMDAxLCAweDAxMDksIDB4MjAwNCwgMHhkMDg0LCAweDA1MDgsCisJMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwZjYsCisJMHgwMGU2LCAweDAwYzYsIDB4MjA3OSwgMHgxOWU2LCAweDIwNzEsIDB4MTgwMCwgMHgyMDYxLCAweDAxMDAsCisJMHgwODBjLCAweDkwOTQsIDB4MDBjZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMDBlLCAweDAxMmUsIDB4YTAwMSwgMHg2MDAwLCAweDkwODYsIDB4MDAwMiwgMHgxMTEwLCAweDA4MDQsCisJMHhjMDc1LCAweDAwMDUsIDB4MDAwMiwgMHhjMDExLCAweGMwMGYsIDB4YzAwZiwgMHhjMDBmLCAweGMwMGYsCisJMHhjMDBmLCAweGMwMGYsIDB4YzAwZiwgMHhjMDBmLCAweGMwMGYsIDB4YzAwZiwgMHhjMDJjLCAweGMwMmMsCisJMHhjMDJjLCAweGMwMmMsIDB4YzAwZiwgMHhjMDJjLCAweGMwMGYsIDB4YzAyYywgMHhjMDBmLCAweDA4MGMsCisJMHgwZGQ1LCAweDA4MGMsIDB4OTY1NywgMHgwMDk2LCAweDYxMTQsIDB4MjE0OCwgMHgwODBjLCAweGNjODYsCisJMHgwMTY4LCAweGE4NjcsIDB4MDEwMywgMHhhODdiLCAweDAwMDYsIDB4YTg3NywgMHgwMDAwLCAweGE4ODAsCisJMHhjMGVjLCAweGE4ODIsIDB4MDgwYywgMHg2ZDE3LCAweDA4MGMsIDB4Y2U3MSwgMHgwMDllLCAweDA4MGMsCisJMHhhZjQzLCAweDA4MGMsIDB4OTc2MywgMHgwMDA1LCAweDA4MGMsIDB4OTY1NywgMHgwODBjLCAweGNlOGUsCisJMHgwOTBjLCAweGI5MDUsIDB4MDgwYywgMHhhZjQzLCAweDA4MGMsIDB4OTc2MywgMHgwMDA1LCAweDAwMDIsCisJMHhjMDRlLCAweGMwNGMsIDB4YzA0YywgMHhjMDRjLCAweGMwNGMsIDB4YzA0YywgMHhjMDRjLCAweGMwNGMsCisJMHhjMDRjLCAweGMwNGMsIDB4YzA0YywgMHhjMDY1LCAweGMwNjUsIDB4YzA2NSwgMHhjMDY1LCAweGMwNGMsCisJMHhjMDZmLCAweGMwNGMsIDB4YzA2NSwgMHhjMDRjLCAweDA4MGMsIDB4MGRkNSwgMHgwMDk2LCAweDA4MGMsCisJMHg5NjU3LCAweDYwMTQsIDB4MjA0OCwgMHgyMDAxLCAweDE5ODcsIDB4MjAwNCwgMHg2MDQyLCAweGE5N2MsCisJMHhkMWFjLCAweDAxNDAsIDB4NjAwMywgMHgwMDA0LCAweGE4N2MsIDB4OTA4NSwgMHgwNDAwLCAweGE4N2UsCisJMHgwMDllLCAweDAwMDUsIDB4NjAwMywgMHgwMDAyLCAweDBjYjgsIDB4MDgwYywgMHg5NjU3LCAweDA4MGMsCisJMHhkM2EwLCAweDA4MGMsIDB4ZDNhNSwgMHg2MDAzLCAweDAwMGYsIDB4MDgwNCwgMHg5NzYzLCAweDA4MGMsCisJMHg5NjU3LCAweDA4MGMsIDB4YWY0MywgMHgwODA0LCAweDk3NjMsIDB4OTE4MiwgMHgwMDU0LCAweDEyMjAsCisJMHg5MTgyLCAweDAwNDAsIDB4MDIwOCwgMHgwMDBhLCAweDAwMDUsIDB4YzA5MSwgMHhjMDkxLCAweGMwOTEsCisJMHhjMDkxLCAweGMwOTEsIDB4YzA5MywgMHhjMTcwLCAweGMwOTEsIDB4YzFhNCwgMHhjMDkxLCAweGMwOTEsCisJMHhjMDkxLCAweGMwOTEsIDB4YzA5MSwgMHhjMDkxLCAweGMwOTEsIDB4YzA5MSwgMHhjMDkxLCAweGMwOTEsCisJMHhjMWE0LCAweDA4MGMsIDB4MGRkNSwgMHgwMGI2LCAweDAwOTYsIDB4NjExNCwgMHgyMTQ4LCAweDc2NDQsCisJMHg5NmI0LCAweDBmZmYsIDB4ODZmZiwgMHgxNTI4LCAweDYwMTAsIDB4MjA1OCwgMHhiODAwLCAweGQwYmMsCisJMHgxOTA0LCAweGMxNWYsIDB4YTg3YiwgMHgwMDAwLCAweGE4NjcsIDB4MDEwMywgMHhhZTc2LCAweGE4N2MsCisJMHhkMGFjLCAweDAxMjgsIDB4YTgzNCwgMHhhOTM4LCAweDkxMTUsIDB4MTkwYywgMHhjMzNkLCAweDA4MGMsCisJMHg2YjMzLCAweDYyMTAsIDB4MjI1OCwgMHhiYTNjLCAweDgyZmYsIDB4MDExMCwgMHg4MjExLCAweGJhM2UsCisJMHg3MDQ0LCAweGQwZTQsIDB4MTkwNCwgMHhjMTQzLCAweDA4MGMsIDB4YWY0MywgMHgwMDllLCAweDAwYmUsCisJMHgwMDA1LCAweDk2OGMsIDB4MGMwMCwgMHgwMTUwLCAweDYwMTAsIDB4MjA1OCwgMHhiODAwLCAweGQwYmMsCisJMHgxOTA0LCAweGMxNDcsIDB4NzM0OCwgMHhhYjkyLCAweDczNGMsIDB4YWI4ZSwgMHg5NjhjLCAweDAwZmYsCisJMHg5MTg2LCAweDAwMDIsIDB4MDUwOCwgMHg5MTg2LCAweDAwMjgsIDB4MTExOCwgMHhhODdiLCAweDAwMWMsCisJMHgwMGU4LCAweGQ2ZGMsIDB4MDFhMCwgMHhhODdiLCAweDAwMTUsIDB4YTg3YywgMHhkMGFjLCAweDAxNzAsCisJMHhhOTM4LCAweGFhMzQsIDB4MjEwMCwgMHg5MjA1LCAweDAxNDgsIDB4NzA0OCwgMHg5MTA2LCAweDExMTgsCisJMHg3MDRjLCAweDkyMDYsIDB4MDExOCwgMHhhOTkyLCAweGFhOGUsIDB4YzZkYywgMHgwMDM4LCAweGQ2ZDQsCisJMHgwMTE4LCAweGE4N2IsIDB4MDAwNywgMHgwMDEwLCAweGE4N2IsIDB4MDAwMCwgMHhhODY3LCAweDAxMDMsCisJMHhhZTc2LCAweDkwMWUsIDB4ZDZjNCwgMHgwMWQ4LCAweDk2ODYsIDB4MDEwMCwgMHgxMTMwLCAweDcwNjQsCisJMHg5MDA1LCAweDExMTgsIDB4YzZjNCwgMHgwODA0LCAweGMwOWEsIDB4NzM1YywgMHhhYjg2LCAweDgzZmYsCisJMHgwMTcwLCAweDkzOGEsIDB4MDAwOSwgMHgwMjEwLCAweDIwMTksIDB4MDAwOCwgMHgwMDM2LCAweDIzMDgsCisJMHgyMDE5LCAweDAwMTgsIDB4MjAxMSwgMHgwMDI1LCAweDA4MGMsIDB4YzgzNywgMHgwMDNlLCAweGQ2Y2MsCisJMHgwOTA0LCAweGMwYWYsIDB4NzE1NCwgMHhhOThhLCAweDgxZmYsIDB4MDkwNCwgMHhjMGFmLCAweDkxOTIsCisJMHgwMDIxLCAweDEyNzgsIDB4ODMwNCwgMHg5MDk4LCAweDAwMTgsIDB4MjAxMSwgMHgwMDI5LCAweDA4MGMsCisJMHhjODM3LCAweDIwMTEsIDB4MDIwNSwgMHgyMDEzLCAweDAwMDAsIDB4MDgwYywgMHhkMzJkLCAweDA4MDQsCisJMHhjMGFmLCAweGE4NjgsIDB4ZDBmYywgMHgwMTIwLCAweDIwMDksIDB4MDAyMCwgMHhhOThhLCAweDBjNTAsCisJMHgwMGE2LCAweDI5NTAsIDB4MDgwYywgMHhjN2Q2LCAweDAwYWUsIDB4MDgwYywgMHhkMzJkLCAweDA4MGMsCisJMHhjODI3LCAweDA4MDQsIDB4YzBiMSwgMHgwODBjLCAweGNmODYsIDB4MDgwNCwgMHhjMGJlLCAweGE4N2MsCisJMHhkMGFjLCAweDA5MDQsIDB4YzBjYSwgMHhhODgwLCAweGQwYmMsIDB4MTkwNCwgMHhjMGNhLCAweDczNDgsCisJMHhhODM4LCAweDkzMDYsIDB4MTFjOCwgMHg3MzRjLCAweGE4MzQsIDB4OTMxZSwgMHgwOTA0LCAweGMwY2EsCisJMHhkNmQ0LCAweDAxOTAsIDB4YWIzOCwgMHg5MzA1LCAweDA5MDQsIDB4YzBjYSwgMHgwMDY4LCAweGE4N2MsCisJMHhkMGFjLCAweDA5MDQsIDB4YzBhMiwgMHhhODM4LCAweGE5MzQsIDB4OTEwNSwgMHgwOTA0LCAweGMwYTIsCisJMHhhODgwLCAweGQwYmMsIDB4MTkwNCwgMHhjMGEyLCAweDA4MGMsIDB4Y2ZjMCwgMHgwODA0LCAweGMwYmUsCisJMHgwMDk2LCAweDAwZjYsIDB4NjAwMywgMHgwMDAzLCAweDYwMDcsIDB4MDA0MywgMHgyMDc5LCAweDAyNmMsCisJMHg3YzA0LCAweDdiMDAsIDB4N2UwYywgMHg3ZDA4LCAweDYwMTQsIDB4MjA0OCwgMHhhODdjLCAweGQwYWMsCisJMHgwMTQwLCAweDYwMDMsIDB4MDAwMiwgMHgwMGZlLCAweDAwOWUsIDB4MDAwNSwgMHgyMTMwLCAweDIyMjgsCisJMHgwMDU4LCAweDI0MDAsIDB4YTlhYywgMHg5MTBhLCAweDIzMDAsIDB4YWFiMCwgMHg5MjEzLCAweDI2MDAsCisJMHg5MTAyLCAweDI1MDAsIDB4OTIwMywgMHgwZTkwLCAweGFjMzYsIDB4YWIzYSwgMHhhZTQ2LCAweGFkNGEsCisJMHgwMGZlLCAweDYwNDMsIDB4MDAwMCwgMHgyYzEwLCAweDA4MGMsIDB4MWJlYiwgMHgwODBjLCAweDkyMTYsCisJMHgwODBjLCAweDk4OTEsIDB4MDA5ZSwgMHgwMDA1LCAweDAwMDUsIDB4OTE4MiwgMHgwMDU0LCAweDEyMjAsCisJMHg5MTgyLCAweDAwNDAsIDB4MDIwOCwgMHgwMDBhLCAweDAwMDUsIDB4YzFjMSwgMHhjMWMxLCAweGMxYzEsCisJMHhjMWMxLCAweGMxYzEsIDB4YzFjMywgMHhjMjU5LCAweGMxYzEsIDB4YzFjMSwgMHhjMjcwLCAweGMzMDAsCisJMHhjMWMxLCAweGMxYzEsIDB4YzFjMSwgMHhjMWMxLCAweGMzMTUsIDB4YzFjMSwgMHhjMWMxLCAweGMxYzEsCisJMHhjMWMxLCAweDA4MGMsIDB4MGRkNSwgMHgwMDc2LCAweDAwYTYsIDB4MDBlNiwgMHgwMDk2LCAweDIwNzEsCisJMHgwMjYwLCAweDYxMTQsIDB4MjE1MCwgMHg3NjQ0LCAweGI2NzYsIDB4OTZiNCwgMHgwZmZmLCAweGI3N2MsCisJMHhjN2U1LCAweGI3N2UsIDB4NjIxMCwgMHgwMGI2LCAweDIyNTgsIDB4YmEzYywgMHg4MmZmLCAweDAxMTAsCisJMHg4MjExLCAweGJhM2UsIDB4MDBiZSwgMHg4NmZmLCAweDA5MDQsIDB4YzI1NCwgMHg5Njk0LCAweGZmMDAsCisJMHg5Mjg0LCAweDBjMDAsIDB4MDEyMCwgMHg3MDQ4LCAweGIwOTIsIDB4NzA0YywgMHhiMDhlLCAweDkyODQsCisJMHgwMzAwLCAweDA5MDQsIDB4YzI1NCwgMHgwODBjLCAweDBmZmYsIDB4MDkwYywgMHgwZGQ1LCAweDI5MDAsCisJMHhiMDdhLCAweGI3N2MsIDB4YzdjZCwgMHhiNzdlLCAweGE4NjcsIDB4MDEwMywgMHhiMDY4LCAweGE4NmEsCisJMHhiMDZjLCAweGE4NmUsIDB4YjA3MCwgMHhhODcyLCAweGFlNzYsIDB4OTY4YywgMHgwYzAwLCAweDAxMjAsCisJMHg3MzQ4LCAweGFiOTIsIDB4NzM0YywgMHhhYjhlLCAweDk2OGMsIDB4MDBmZiwgMHg5MTg2LCAweDAwMDIsCisJMHgwMTgwLCAweDkxODYsIDB4MDAyOCwgMHgxMTE4LCAweGE4N2IsIDB4MDAxYywgMHgwMDYwLCAweGQ2ZGMsCisJMHgwMTE4LCAweGE4N2IsIDB4MDAxNSwgMHgwMDM4LCAweGQ2ZDQsIDB4MDExOCwgMHhhODdiLCAweDAwMDcsCisJMHgwMDEwLCAweGE4N2IsIDB4MDAwMCwgMHhhZjdlLCAweGIwODAsIDB4YTg4MiwgMHhiMDg0LCAweGE4ODYsCisJMHg5MDFlLCAweGQ2YzQsIDB4MDE5MCwgMHg3MzVjLCAweGFiODYsIDB4ODNmZiwgMHgwMTcwLCAweDkzOGEsCisJMHgwMDA5LCAweDAyMTAsIDB4MjAxOSwgMHgwMDA4LCAweDAwMzYsIDB4MjMwOCwgMHgyMDE5LCAweDAwMTgsCisJMHgyMDExLCAweDAwMjUsIDB4MDgwYywgMHhjODM3LCAweDAwM2UsIDB4ZDZjYywgMHgwMWU4LCAweDcxNTQsCisJMHhhOThhLCAweDgxZmYsIDB4MDFjOCwgMHg5MTkyLCAweDAwMjEsIDB4MTI2MCwgMHg4MzA0LCAweDkwOTgsCisJMHgwMDE4LCAweDIwMTEsIDB4MDAyOSwgMHgwODBjLCAweGM4MzcsIDB4MjAxMSwgMHgwMjA1LCAweDIwMTMsCisJMHgwMDAwLCAweDAwNTAsIDB4YjA2OCwgMHhkMGZjLCAweDAxMjAsIDB4MjAwOSwgMHgwMDIwLCAweGE5OGEsCisJMHgwYzY4LCAweDI5NTAsIDB4MDgwYywgMHhjN2Q2LCAweDAwOWUsIDB4MDBlZSwgMHgwMGFlLCAweDAwN2UsCisJMHgwMDA1LCAweDAwZjYsIDB4MDBhNiwgMHg2MDAzLCAweDAwMDMsIDB4MjA3OSwgMHgwMjZjLCAweDdjMDQsCisJMHg3YjAwLCAweDdlMGMsIDB4N2QwOCwgMHg2MDE0LCAweDIwNTAsIDB4YjQzNiwgMHhiMzNhLCAweGI2NDYsCisJMHhiNTRhLCAweDAwYWUsIDB4MDBmZSwgMHgyYzEwLCAweDA4MGMsIDB4MWJlYiwgMHgwODA0LCAweGEzMjMsCisJMHg2MDAzLCAweDAwMDIsIDB4NjAwNCwgMHg5MDg2LCAweDAwNDAsIDB4MTFjOCwgMHgwMDk2LCAweDYwMTQsCisJMHgyMDQ4LCAweGE4N2MsIDB4ZDBhYywgMHgwMTYwLCAweDYwMWMsIDB4ZDA4NCwgMHgxMTMwLCAweDAwZjYsCisJMHgyYzAwLCAweDIwNzgsIDB4MDgwYywgMHgxNzU0LCAweDAwZmUsIDB4NjAwMywgMHgwMDA0LCAweDAwMTAsCisJMHg2MDAzLCAweDAwMDIsIDB4MDA5ZSwgMHgwODBjLCAweDk2NTcsIDB4MDgwYywgMHg5NzYzLCAweDAwOTYsCisJMHgyMDAxLCAweDE5ODcsIDB4MjAwNCwgMHg2MDQyLCAweDA4MGMsIDB4OTcxMywgMHgwODBjLCAweDk4OTEsCisJMHg2MTE0LCAweDIxNDgsIDB4YTk3YywgMHhkMWU0LCAweDA5MDQsIDB4YzJmYiwgMHhkMWNjLCAweDA1YzgsCisJMHhhOTc4LCAweGE4NjgsIDB4ZDBmYywgMHgwNTQwLCAweDAwMTYsIDB4YTg3YywgMHgwMDA2LCAweGE4ODAsCisJMHgwMDA2LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDkwODAsIDB4MDAxOSwgMHgyMGEwLCAweDgxMGUsCisJMHg4MTBlLCAweDgxMGYsIDB4OTE4NCwgMHgwMDNmLCAweDIwZTAsIDB4OTE4NCwgMHhmZmMwLCAweDkwODAsCisJMHgwMDE5LCAweDIwOTgsIDB4MDE1NiwgMHgyMGE5LCAweDAwMjAsIDB4NDAwMywgMHgwMTVlLCAweDAwMGUsCisJMHhhODgyLCAweDAwMGUsIDB4YzBjYywgMHhhODdlLCAweDAwMWUsIDB4YTg3NCwgMHgwMDA2LCAweDIxNDgsCisJMHgwODBjLCAweDBmYjEsIDB4MDAxZSwgMHgwNDU4LCAweDAwMTYsIDB4MDgwYywgMHgwZmIxLCAweDAwOWUsCisJMHhhODdjLCAweGMwY2MsIDB4YTg3ZSwgMHhhOTc0LCAweDAwMTYsIDB4MDgwYywgMHhjODI3LCAweDAwMWUsCisJMHgwMGYwLCAweGE4NjcsIDB4MDEwMywgMHhhOTc0LCAweDkxODQsIDB4MDBmZiwgMHg5MGI2LCAweDAwMDIsCisJMHgwMTgwLCAweDkwODYsIDB4MDAyOCwgMHgxMTE4LCAweGE4N2IsIDB4MDAxYywgMHgwMDYwLCAweGQxZGMsCisJMHgwMTE4LCAweGE4N2IsIDB4MDAxNSwgMHgwMDM4LCAweGQxZDQsIDB4MDExOCwgMHhhODdiLCAweDAwMDcsCisJMHgwMDEwLCAweGE4N2IsIDB4MDAwMCwgMHgwMDE2LCAweDA4MGMsIDB4NmIzMywgMHgwMDFlLCAweGQxZTQsCisJMHgxMTIwLCAweDA4MGMsIDB4YWY0MywgMHgwMDllLCAweDAwMDUsIDB4MDgwYywgMHhjZjg2LCAweDBjZDgsCisJMHg2MDA0LCAweDkwODYsIDB4MDA0MCwgMHgxMTIwLCAweDA4MGMsIDB4OTY1NywgMHgwODBjLCAweDk3NjMsCisJMHgyMDE5LCAweDAwMDEsIDB4MDgwYywgMHhhNmFjLCAweDYwMDMsIDB4MDAwMiwgMHgwODBjLCAweGQzYTUsCisJMHgwODBjLCAweDk3MTMsIDB4MDgwYywgMHg5ODkxLCAweDAwMDUsIDB4NjAwNCwgMHg5MDg2LCAweDAwNDAsCisJMHgxMTIwLCAweDA4MGMsIDB4OTY1NywgMHgwODBjLCAweDk3NjMsIDB4MjAxOSwgMHgwMDAxLCAweDA4MGMsCisJMHhhNmFjLCAweDA4MGMsIDB4OTcxMywgMHgwODBjLCAweDMyMWUsIDB4MDgwYywgMHhkMzlkLCAweDAwOTYsCisJMHg2MTE0LCAweDIxNDgsIDB4MDgwYywgMHhjYzg2LCAweDAxNTAsIDB4YTg2NywgMHgwMTAzLCAweGE4N2IsCisJMHgwMDI5LCAweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweDZkMTcsIDB4MDgwYywgMHhjZTcxLCAweDAwOWUsCisJMHgwODBjLCAweGFmNDMsIDB4MDgwYywgMHg5ODkxLCAweDAwMDUsIDB4YTg3YiwgMHgwMDE1LCAweGQxZmMsCisJMHgwMTgwLCAweGE4N2IsIDB4MDAwNywgMHg4MDAyLCAweDgwMDAsIDB4ODEwYSwgMHg5MTg5LCAweDAwMDAsCisJMHgwMDA2LCAweDAwMTYsIDB4MjAwOSwgMHgxYTc5LCAweDIxMDQsIDB4ODAwMCwgMHgyMDBhLCAweDAwMWUsCisJMHgwMDBlLCAweGE5OTIsIDB4YTg4ZSwgMHgwMDA1LCAweDkxODIsIDB4MDA1NCwgMHgxMjIwLCAweDkxODIsCisJMHgwMDQwLCAweDAyMDgsIDB4MDAwYSwgMHgwMDA1LCAweGMzNzAsIDB4YzM3MCwgMHhjMzcwLCAweGMzNzAsCisJMHhjMzcwLCAweGMzNzIsIDB4YzM3MCwgMHhjMzcwLCAweGM0MTgsIDB4YzM3MCwgMHhjMzcwLCAweGMzNzAsCisJMHhjMzcwLCAweGMzNzAsIDB4YzM3MCwgMHhjMzcwLCAweGMzNzAsIDB4YzM3MCwgMHhjMzcwLCAweGM1NGEsCisJMHgwODBjLCAweDBkZDUsIDB4MDA3NiwgMHgwMGE2LCAweDAwZTYsIDB4MDA5NiwgMHgyMDcxLCAweDAyNjAsCisJMHg2MTE0LCAweDIxNTAsIDB4NzY0NCwgMHhiNjc2LCAweDk2YjQsIDB4MGZmZiwgMHhiNzdjLCAweGM3ZTUsCisJMHhiNzdlLCAweDYyMTAsIDB4MDBiNiwgMHgyMjU4LCAweGJhM2MsIDB4ODJmZiwgMHgwMTEwLCAweDgyMTEsCisJMHhiYTNlLCAweDAwYmUsIDB4ODZmZiwgMHgwOTA0LCAweGM0MTEsIDB4OTY5NCwgMHhmZjAwLCAweDkyODQsCisJMHgwYzAwLCAweDAxMjAsIDB4NzA0OCwgMHhiMDkyLCAweDcwNGMsIDB4YjA4ZSwgMHg5Mjg0LCAweDAzMDAsCisJMHgwOTA0LCAweGM0MTEsIDB4OTY4NiwgMHgwMTAwLCAweDExMzAsIDB4NzA2NCwgMHg5MDA1LCAweDExMTgsCisJMHhjNmM0LCAweGI2NzYsIDB4MGMzOCwgMHgwODBjLCAweDBmZmYsIDB4MDkwYywgMHgwZGQ1LCAweDI5MDAsCisJMHhiMDdhLCAweGI3N2MsIDB4OTdiZCwgMHgwMjAwLCAweGI3N2UsIDB4YTg2NywgMHgwMTAzLCAweGIwNjgsCisJMHhhODZhLCAweGIwNmMsIDB4YTg2ZSwgMHhiMDcwLCAweGE4NzIsIDB4NzA0NCwgMHg5MDg0LCAweGYwMDAsCisJMHg5NjM1LCAweGFlNzYsIDB4OTY4YywgMHgwYzAwLCAweDAxMjAsIDB4NzM0OCwgMHhhYjkyLCAweDczNGMsCisJMHhhYjhlLCAweDk2OGMsIDB4MDBmZiwgMHg5MTg2LCAweDAwMDIsIDB4MDE4MCwgMHg5MTg2LCAweDAwMjgsCisJMHgxMTE4LCAweGE4N2IsIDB4MDAxYywgMHgwMDYwLCAweGQ2ZGMsIDB4MDExOCwgMHhhODdiLCAweDAwMTUsCisJMHgwMDM4LCAweGQ2ZDQsIDB4MDExOCwgMHhhODdiLCAweDAwMDcsIDB4MDAxMCwgMHhhODdiLCAweDAwMDAsCisJMHhhZjdlLCAweGIwODAsIDB4YTg4MiwgMHhiMDg0LCAweGE4ODYsIDB4OTAxZSwgMHhkNmM0LCAweDAxOTAsCisJMHg3MzVjLCAweGFiODYsIDB4ODNmZiwgMHgwMTcwLCAweDkzOGEsIDB4MDAwOSwgMHgwMjEwLCAweDIwMTksCisJMHgwMDA4LCAweDAwMzYsIDB4MjMwOCwgMHgyMDE5LCAweDAwMTgsIDB4MjAxMSwgMHgwMDI1LCAweDA4MGMsCisJMHhjODM3LCAweDAwM2UsIDB4ZDZjYywgMHgwMWU4LCAweDcxNTQsIDB4YTk4YSwgMHg4MWZmLCAweDAxYzgsCisJMHg5MTkyLCAweDAwMjEsIDB4MTI2MCwgMHg4MzA0LCAweDkwOTgsIDB4MDAxOCwgMHgyMDExLCAweDAwMjksCisJMHgwODBjLCAweGM4MzcsIDB4MjAxMSwgMHgwMjA1LCAweDIwMTMsIDB4MDAwMCwgMHgwMDUwLCAweGIwNjgsCisJMHhkMGZjLCAweDAxMjAsIDB4MjAwOSwgMHgwMDIwLCAweGE5OGEsIDB4MGM2OCwgMHgyOTUwLCAweDA4MGMsCisJMHhjN2Q2LCAweDA4MGMsIDB4MWE2ZiwgMHgwMDllLCAweDAwZWUsIDB4MDBhZSwgMHgwMDdlLCAweDAwMDUsCisJMHgyMDAxLCAweDE5ODcsIDB4MjAwNCwgMHg2MDQyLCAweDAwOTYsIDB4NjExNCwgMHgyMTQ4LCAweGE4M2MsCisJMHhhOTQwLCAweDkxMDUsIDB4MTExOCwgMHhhODdjLCAweGMwZGMsIDB4YTg3ZSwgMHg2MDAzLCAweDAwMDIsCisJMHhhOTdjLCAweGQxZTQsIDB4MDkwNCwgMHhjNTQ1LCAweDYwNDMsIDB4MDAwMCwgMHg2MDEwLCAweDAwYjYsCisJMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwgMHhkMGJjLCAweDE1MDAsIDB4ZDFjYywgMHgwOTA0LCAweGM1MTQsCisJMHhhOTc4LCAweGE4NjgsIDB4ZDBmYywgMHgwOTA0LCAweGM0ZDUsIDB4MDAxNiwgMHhhODdjLCAweDAwMDYsCisJMHhhODgwLCAweDAwMDYsIDB4MDBhNiwgMHgyMTUwLCAweGIxNzQsIDB4OTE4NCwgMHgwMGZmLCAweDkwYjYsCisJMHgwMDAyLCAweDA5MDQsIDB4YzRhMiwgMHg5MDg2LCAweDAwMjgsIDB4MTkwNCwgMHhjNDhlLCAweGE4N2IsCisJMHgwMDFjLCAweGIwN2IsIDB4MDAxYywgMHgwODA0LCAweGM0YWEsIDB4NjAyNCwgMHhkMGY0LCAweDExZDAsCisJMHhhODM4LCAweGFhMzQsIDB4OTIwNSwgMHgwOWM4LCAweGE4MzgsIDB4YWE5MCwgMHg5MjA2LCAweDExMjAsCisJMHhhODhjLCAweGFhMzQsIDB4OTIwNiwgMHgwOTg4LCAweDYwMjQsIDB4ZDBkNCwgMHgxMTQ4LCAweGE5YWMsCisJMHhhODM0LCAweDkxMDIsIDB4NjAzYSwgMHhhOWIwLCAweGE4MzgsIDB4OTEwMywgMHg2MDNlLCAweDYwMjQsCisJMHhjMGY1LCAweDYwMjYsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgzYywgMHg4MDAwLCAweGI4M2UsCisJMHgwMGJlLCAweDkwMDYsIDB4YTg3NiwgMHhhODkyLCAweGE4OGUsIDB4YTg3YywgMHhjMGU0LCAweGE4N2UsCisJMHhkMGNjLCAweDAxNDAsIDB4YzBjYywgMHhhODdlLCAweDAwOTYsIDB4YTg3OCwgMHgyMDQ4LCAweDA4MGMsCisJMHgwZmIxLCAweDAwOWUsIDB4MDgwYywgMHhjZmMwLCAweDA4MDQsIDB4YzU0NSwgMHhkMWRjLCAweDAxNTgsCisJMHhhODdiLCAweDAwMTUsIDB4YjA3YiwgMHgwMDE1LCAweDA4MGMsIDB4ZDI1MCwgMHgwMTE4LCAweGIxNzQsCisJMHhjMWRjLCAweGIxNzYsIDB4MDA3OCwgMHhkMWQ0LCAweDAxMjgsIDB4YTg3YiwgMHgwMDA3LCAweGIwN2IsCisJMHgwMDA3LCAweDAwNDAsIDB4YTg3YywgMHhkMGFjLCAweDAxMjgsIDB4YTgzNCwgMHhhOTM4LCAweDkxMTUsCisJMHgxOTBjLCAweGMzM2QsIDB4YTg3YywgMHhiMDdlLCAweGE4OTAsIDB4YjA5MiwgMHhhODhjLCAweGIwOGUsCisJMHhhODYwLCAweDIwZTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4MjBhMCwgMHgyMGE5LCAweDAwMjAsCisJMHg4YTA2LCAweDgwMDYsIDB4ODAwNywgMHg5MDk0LCAweDAwM2YsIDB4MjJlMCwgMHg5MDg0LCAweGZmYzAsCisJMHg5MDgwLCAweDAwMTksIDB4MjA5OCwgMHg0MDAzLCAweDAwYWUsIDB4MDAwZSwgMHhhODgyLCAweDAwMGUsCisJMHhjMGNjLCAweGE4N2UsIDB4MDgwYywgMHhkMzJkLCAweDAwMWUsIDB4YTg3NCwgMHgwMDA2LCAweDIxNDgsCisJMHgwODBjLCAweDBmYjEsIDB4MDAxZSwgMHgwODA0LCAweGM1NDEsIDB4MDAxNiwgMHgwMGE2LCAweDIxNTAsCisJMHhiMTc0LCAweDkxODQsIDB4MDBmZiwgMHg5MGI2LCAweDAwMDIsIDB4MDFlMCwgMHg5MDg2LCAweDAwMjgsCisJMHgxMTI4LCAweGE4N2IsIDB4MDAxYywgMHhiMDdiLCAweDAwMWMsIDB4MDBlMCwgMHhkMWRjLCAweDAxNTgsCisJMHhhODdiLCAweDAwMTUsIDB4YjA3YiwgMHgwMDE1LCAweDA4MGMsIDB4ZDI1MCwgMHgwMTE4LCAweGIxNzQsCisJMHhjMWRjLCAweGIxNzYsIDB4MDA3OCwgMHhkMWQ0LCAweDAxMjgsIDB4YTg3YiwgMHgwMDA3LCAweGIwN2IsCisJMHgwMDA3LCAweDAwNDAsIDB4YTg3YywgMHhkMGFjLCAweDAxMjgsIDB4YTgzNCwgMHhhOTM4LCAweDkxMTUsCisJMHgxOTBjLCAweGMzM2QsIDB4YTg5MCwgMHhiMDkyLCAweGE4OGMsIDB4YjA4ZSwgMHhhODdjLCAweGIwN2UsCisJMHgwMGFlLCAweDA4MGMsIDB4MGZiMSwgMHgwMDllLCAweDA4MGMsIDB4ZDMyZCwgMHhhOTc0LCAweDAwMTYsCisJMHgwODBjLCAweGM4MjcsIDB4MDAxZSwgMHgwNDY4LCAweGE4NjcsIDB4MDEwMywgMHhhOTc0LCAweDkxODQsCisJMHgwMGZmLCAweDkwYjYsIDB4MDAwMiwgMHgwMWIwLCAweDkwODYsIDB4MDAyOCwgMHgxMTE4LCAweGE4N2IsCisJMHgwMDFjLCAweDAwZDAsIDB4ZDFkYywgMHgwMTQ4LCAweGE4N2IsIDB4MDAxNSwgMHgwODBjLCAweGQyNTAsCisJMHgwMTE4LCAweGE5NzQsIDB4YzFkYywgMHhhOTc2LCAweDAwNzgsIDB4ZDFkNCwgMHgwMTE4LCAweGE4N2IsCisJMHgwMDA3LCAweDAwNTAsIDB4YTg3YiwgMHgwMDAwLCAweGE4N2MsIDB4ZDBhYywgMHgwMTI4LCAweGE4MzQsCisJMHhhOTM4LCAweDkxMTUsIDB4MTkwYywgMHhjMzNkLCAweGE5NzQsIDB4MDAxNiwgMHgwODBjLCAweDZiMzMsCisJMHgwMDFlLCAweGQxZTQsIDB4MTEyMCwgMHgwODBjLCAweGFmNDMsIDB4MDA5ZSwgMHgwMDA1LCAweDA4MGMsCisJMHhjZjg2LCAweDBjZDgsIDB4NjExNCwgMHgwMDk2LCAweDIxNDgsIDB4YTk3YywgMHhkMWU0LCAweDE5MGMsCisJMHgxYThkLCAweDAwOWUsIDB4MDAwNSwgMHgwODBjLCAweDk2NTcsIDB4MDAxMCwgMHgwODBjLCAweDk3MTMsCisJMHgwODBjLCAweGNjODYsIDB4MDFmMCwgMHgwMDk2LCAweDYxMTQsIDB4MjE0OCwgMHgwODBjLCAweGNlOGUsCisJMHgxMTE4LCAweDA4MGMsIDB4YjkwNSwgMHgwMGEwLCAweGE4NjcsIDB4MDEwMywgMHgyMDA5LCAweDE4MGMsCisJMHgyMTBjLCAweGQxOGMsIDB4MTFiOCwgMHhkMTg0LCAweDExOTAsIDB4NjEwOCwgMHhhOTdhLCAweDkxOGUsCisJMHgwMDI5LCAweDExMTAsIDB4MDgwYywgMHhlYTk0LCAweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweDZkMTcsCisJMHgwMDllLCAweDA4MGMsIDB4YWY0MywgMHgwODBjLCAweDk3NjMsIDB4MDgwNCwgMHg5ODkxLCAweGE4N2IsCisJMHgwMDA0LCAweDBjOTAsIDB4YTg3YiwgMHgwMDA0LCAweDBjNzgsIDB4OTE4MiwgMHgwMDU0LCAweDEyMjAsCisJMHg5MTgyLCAweDAwNDAsIDB4MDIwOCwgMHgwMDBhLCAweDAwMDUsIDB4YzVhMSwgMHhjNWExLCAweGM1YTEsCisJMHhjNWExLCAweGM1YTEsIDB4YzVhMywgMHhjNWExLCAweGM1YTEsIDB4YzVhMSwgMHhjNWExLCAweGM1YTEsCisJMHhjNWExLCAweGM1YTEsIDB4YzVhMSwgMHhjNWExLCAweGM1YTEsIDB4YzVhMSwgMHhjNWExLCAweGM1YTEsCisJMHhjNWExLCAweDA4MGMsIDB4MGRkNSwgMHgwODBjLCAweDU3NjUsIDB4MDFmOCwgMHg2MDE0LCAweDcxNDQsCisJMHg5MThjLCAweDBmZmYsIDB4OTAxNiwgMHhkMWM0LCAweDAxMTgsIDB4NzI2NCwgMHg5Mjk0LCAweDAwZmYsCisJMHgwMDk2LCAweDkwNGQsIDB4MDE4OCwgMHhhODdiLCAweDAwMDAsIDB4YTg2NCwgMHg5MDg2LCAweDAxMzksCisJMHgwMTI4LCAweGE4NjcsIDB4MDEwMywgMHhhOTc2LCAweGFhOTYsIDB4MDAzMCwgMHhhODk3LCAweDQwMDAsCisJMHhhOTlhLCAweGFhOWUsIDB4MDgwYywgMHg2ZDE3LCAweDAwOWUsIDB4MDgwNCwgMHhhZjQzLCAweDkxODIsCisJMHgwMDg1LCAweDAwMDIsIDB4YzVkOSwgMHhjNWQ3LCAweGM1ZDcsIDB4YzVlNSwgMHhjNWQ3LCAweGM1ZDcsCisJMHhjNWQ3LCAweGM1ZDcsIDB4YzVkNywgMHhjNWQ3LCAweGM1ZDcsIDB4YzVkNywgMHhjNWQ3LCAweDA4MGMsCisJMHgwZGQ1LCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDA4MGMsIDB4OTFiMSwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDA4MGMsIDB4OTc2MywgMHgwMTJlLCAweDAwMDUsIDB4MDAyNiwgMHgwMDU2LCAweDAwZDYsCisJMHgwMGU2LCAweDIwNzEsIDB4MDI2MCwgMHg3MjI0LCAweDYyMTYsIDB4NzIyMCwgMHgwODBjLCAweGNjNzQsCisJMHgwMWY4LCAweDIyNjgsIDB4NjgwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDFkMCwgMHg2MDEwLCAweDZkMTAsCisJMHg5NTJlLCAweDExYjAsIDB4MDBjNiwgMHgyZDYwLCAweDAwZDYsIDB4MDgwYywgMHhjODk4LCAweDAwZGUsCisJMHgwMGNlLCAweDAxNTgsIDB4NzAyYywgMHhkMDg0LCAweDExMTgsIDB4MDgwYywgMHhjODYyLCAweDAwMTAsCisJMHg2ODAzLCAweDAwMDIsIDB4NjAwNywgMHgwMDg2LCAweDAwMjgsIDB4MDgwYywgMHhjODg0LCAweDBkOTAsCisJMHg2MDA3LCAweDAwODcsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTFiMSwgMHgwODBjLCAweDk3NjMsCisJMHg3MjIwLCAweDA4MGMsIDB4Y2M3NCwgMHgwMTc4LCAweDY4MTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDAsCisJMHgwMGJlLCAweGQwYmMsIDB4MDE0MCwgMHg2ODI0LCAweGQwZWMsIDB4MDEyOCwgMHgwMGM2LCAweDJkNjAsCisJMHgwODBjLCAweGNmYzAsIDB4MDBjZSwgMHgwMGVlLCAweDAwZGUsIDB4MDA1ZSwgMHgwMDJlLCAweDAwMDUsCisJMHg5MTg2LCAweDAwMTMsIDB4MTE2MCwgMHg2MDA0LCAweDkwOGEsIDB4MDA4NSwgMHgwYTBjLCAweDBkZDUsCisJMHg5MDhhLCAweDAwOTIsIDB4MWEwYywgMHgwZGQ1LCAweDkwODIsIDB4MDA4NSwgMHgwMGUyLCAweDkxODYsCisJMHgwMDI3LCAweDAxMjAsIDB4OTE4NiwgMHgwMDE0LCAweDE5MGMsIDB4MGRkNSwgMHgwODBjLCAweDk2NTcsCisJMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGNjODYsIDB4MDE0MCwgMHhhODY3LCAweDAxMDMsCisJMHhhODc3LCAweDAwMDAsIDB4YTg3YiwgMHgwMDI5LCAweDA4MGMsIDB4NmQxNywgMHgwMDllLCAweDA4MGMsCisJMHhhZjc0LCAweDA4MDQsIDB4OTc2MywgMHhjNjY4LCAweGM2NmEsIDB4YzY2YSwgMHhjNjY4LCAweGM2NjgsCisJMHhjNjY4LCAweGM2NjgsIDB4YzY2OCwgMHhjNjY4LCAweGM2NjgsIDB4YzY2OCwgMHhjNjY4LCAweGM2NjgsCisJMHgwODBjLCAweDBkZDUsIDB4MDgwYywgMHg5NjU3LCAweDA4MGMsIDB4YWY3NCwgMHgwODBjLCAweDk3NjMsCisJMHgwMDA1LCAweDkxODYsIDB4MDAxMywgMHgxMTI4LCAweDYwMDQsIDB4OTA4MiwgMHgwMDg1LCAweDIwMDgsCisJMHgwNGI4LCAweDkxODYsIDB4MDAyNywgMHgxMWY4LCAweDA4MGMsIDB4OTY1NywgMHgwODBjLCAweDMyMWUsCisJMHgwODBjLCAweGQzOWQsIDB4MDA5NiwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhjYzg2LCAweDAxNTAsCisJMHhhODY3LCAweDAxMDMsIDB4YTg3NywgMHgwMDAwLCAweGE4N2IsIDB4MDAyOSwgMHgwODBjLCAweDZkMTcsCisJMHgwODBjLCAweGNlNzEsIDB4MDA5ZSwgMHgwODBjLCAweGFmNDMsIDB4MDgwYywgMHg5NzYzLCAweDAwMDUsCisJMHgwODBjLCAweGFmZDksIDB4MGNlMCwgMHg5MTg2LCAweDAwMTQsIDB4MWRkMCwgMHgwODBjLCAweDk2NTcsCisJMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGNjODYsIDB4MGQ2MCwgMHhhODY3LCAweDAxMDMsCisJMHhhODc3LCAweDAwMDAsIDB4YTg3YiwgMHgwMDA2LCAweGE4ODAsIDB4YzBlYywgMHhhODgyLCAweDA4ZjAsCisJMHgwMDAyLCAweGM2YzAsIDB4YzZiZSwgMHhjNmJlLCAweGM2YmUsIDB4YzZiZSwgMHhjNmJlLCAweGM2ZDgsCisJMHhjNmJlLCAweGM2YmUsIDB4YzZiZSwgMHhjNmJlLCAweGM2YmUsIDB4YzZiZSwgMHgwODBjLCAweDBkZDUsCisJMHgwODBjLCAweDk2NTcsIDB4NjAzNCwgMHg5MDhjLCAweGZmMDAsIDB4ODEwZiwgMHg5MTg2LCAweDAwMzksCisJMHgwMTE4LCAweDkxODYsIDB4MDAzNSwgMHgxMTE4LCAweDIwMDEsIDB4MTk4NSwgMHgwMDEwLCAweDIwMDEsCisJMHgxOTg2LCAweDIwMDQsIDB4NjAxYSwgMHg2MDAzLCAweDAwMGMsIDB4MDgwYywgMHg5NzYzLCAweDAwMDUsCisJMHgwODBjLCAweDk2NTcsIDB4NjAzNCwgMHg5MDhjLCAweGZmMDAsIDB4ODEwZiwgMHg5MTg2LCAweDAwMzksCisJMHgwMTE4LCAweDkxODYsIDB4MDAzNSwgMHgxMTE4LCAweDIwMDEsIDB4MTk4NSwgMHgwMDEwLCAweDIwMDEsCisJMHgxOTg2LCAweDIwMDQsIDB4NjAxYSwgMHg2MDAzLCAweDAwMGUsIDB4MDgwYywgMHg5NzYzLCAweDAwMDUsCisJMHg5MTgyLCAweDAwOTIsIDB4MTIyMCwgMHg5MTgyLCAweDAwODUsIDB4MDIwOCwgMHgwMDEyLCAweDA4MDQsCisJMHhhZmQ5LCAweGM3MDYsIDB4YzcwNiwgMHhjNzA2LCAweGM3MDYsIDB4YzcwOCwgMHhjNzU1LCAweGM3MDYsCisJMHhjNzA2LCAweGM3MDYsIDB4YzcwNiwgMHhjNzA2LCAweGM3MDYsIDB4YzcwNiwgMHgwODBjLCAweDBkZDUsCisJMHgwMDk2LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwgMHhkMGJjLCAweDAxNjgsCisJMHg2MDM0LCAweDkwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDkxODYsIDB4MDAzOSwgMHgwMTE4LCAweDkxODYsCisJMHgwMDM1LCAweDExMTgsIDB4MDA5ZSwgMHgwODA0LCAweGM3NjksIDB4MDgwYywgMHhjYzg2LCAweDExMTgsCisJMHgwODBjLCAweGNlNzEsIDB4MDA2OCwgMHg2MDE0LCAweDIwNDgsIDB4YTg3YywgMHhkMGU0LCAweDExMTAsCisJMHgwODBjLCAweGNlNzEsIDB4YTg2NywgMHgwMTAzLCAweDA4MGMsIDB4ZDM2OCwgMHgwODBjLCAweDZkMTcsCisJMHgwMGQ2LCAweDJjNjgsIDB4MDgwYywgMHhhZWVkLCAweDAxZDAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDFlLCAweDYwMGIsIDB4ZmZmZiwgMHgyMDA5LCAweDAyNmUsIDB4MjEwYywgMHg2MTNhLCAweDIwMDksCisJMHgwMjZmLCAweDIxMGMsIDB4NjEzZSwgMHg2OTEwLCAweDYxMTIsIDB4MDgwYywgMHhkMTAyLCAweDY5NTQsCisJMHg2MTU2LCAweDYwMjMsIDB4MDAwMSwgMHgwODBjLCAweDkxYjEsIDB4MDgwYywgMHg5NzYzLCAweDJkNjAsCisJMHgwMGRlLCAweDA4MGMsIDB4YWY0MywgMHgwMDllLCAweDAwMDUsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsCisJMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgwNWEwLCAweDYwMzQsIDB4OTA4YywgMHhmZjAwLCAweDgxMGYsCisJMHg5MTg2LCAweDAwMzUsIDB4MDEzMCwgMHg5MTg2LCAweDAwMWUsIDB4MDExOCwgMHg5MTg2LCAweDAwMzksCisJMHgxNTM4LCAweDAwZDYsIDB4MmM2OCwgMHgwODBjLCAweGQzMDAsIDB4MTFmMCwgMHgwODBjLCAweGFlZWQsCisJMHgwMWQ4LCAweDYxMDYsIDB4NjAwMywgMHgwMDAxLCAweDYwMjMsIDB4MDAwMSwgMHg2OTEwLCAweDYxMTIsCisJMHg2OTJjLCAweDYxMmUsIDB4NjkzMCwgMHg2MTMyLCAweDY5MzQsIDB4OTE4YywgMHgwMGZmLCAweDYxMzYsCisJMHg2OTM4LCAweDYxM2EsIDB4NjkzYywgMHg2MTNlLCAweDY5NTQsIDB4NjE1NiwgMHgwODBjLCAweGQxMDIsCisJMHgwODBjLCAweDkxYjEsIDB4MDgwYywgMHg5NzYzLCAweDJkNjAsIDB4MDBkZSwgMHgwODA0LCAweGFmNDMsCisJMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGNjODYsIDB4MDFjOCwgMHhhODY3LCAweDAxMDMsCisJMHhhODgwLCAweGQwYjQsIDB4MDEyOCwgMHhjMGVjLCAweGE4ODIsIDB4YTg3YiwgMHgwMDA2LCAweDAwNDgsCisJMHhkMGJjLCAweDAxMTgsIDB4YTg3YiwgMHgwMDAyLCAweDAwMjAsIDB4YTg3YiwgMHgwMDA1LCAweDA4MGMsCisJMHhjZjgyLCAweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweDZkMTcsIDB4MDgwYywgMHhjZTcxLCAweDAwOWUsCisJMHgwODA0LCAweGFmNDMsIDB4MDAxNiwgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGNjODYsCisJMHgwMTQwLCAweGE4NjcsIDB4MDEwMywgMHhhODdiLCAweDAwMjgsIDB4YTg3NywgMHgwMDAwLCAweDA4MGMsCisJMHg2ZDE3LCAweDAwOWUsIDB4MDAxZSwgMHg5MTg2LCAweDAwMTMsIDB4MDE0OCwgMHg5MTg2LCAweDAwMTQsCisJMHgwMTMwLCAweDkxODYsIDB4MDAyNywgMHgwMTE4LCAweDA4MGMsIDB4YWZkOSwgMHgwMDMwLCAweDA4MGMsCisJMHg5NjU3LCAweDA4MGMsIDB4YWY3NCwgMHgwODBjLCAweDk3NjMsIDB4MDAwNSwgMHgwMDU2LCAweDAwNjYsCisJMHgwMDk2LCAweDAwYTYsIDB4MjAyOSwgMHgwMDAxLCAweDkxODIsIDB4MDEwMSwgMHgxMjA4LCAweDAwMTAsCisJMHgyMDA5LCAweDAxMDAsIDB4MjEzMCwgMHg4MzA0LCAweDkwOTgsIDB4MDAxOCwgMHgyMDA5LCAweDAwMjAsCisJMHgyMDExLCAweDAwMjksIDB4MDgwYywgMHhjODM3LCAweDk2YjIsIDB4MDAyMCwgMHhiMDA0LCAweDkwNGQsCisJMHgwMTEwLCAweDA4MGMsIDB4MGZiMSwgMHgwODBjLCAweDBmZmYsIDB4MDUyMCwgMHg4NTI4LCAweGE4NjcsCisJMHgwMTEwLCAweGE4NmIsIDB4MDAwMCwgMHgyOTIwLCAweGI0MDYsIDB4OTY4YSwgMHgwMDNkLCAweDEyMjgsCisJMHgyNjA4LCAweDIwMTEsIDB4MDAxYiwgMHgwNDk5LCAweDAwYTgsIDB4OTZiMiwgMHgwMDNjLCAweDIwMDksCisJMHgwMDNjLCAweDI5NTAsIDB4MjAxMSwgMHgwMDFiLCAweDA0NTEsIDB4MGMyOCwgMHgyMDAxLCAweDAyMDUsCisJMHgyMDAzLCAweDAwMDAsIDB4MDBhZSwgMHg4NTJmLCAweDk1YWQsIDB4MDAwMywgMHhiNTY2LCAweDk1YWMsCisJMHgwMDAwLCAweDAwNDgsIDB4MjAwMSwgMHgwMjA1LCAweDIwMDMsIDB4MDAwMCwgMHgwMGFlLCAweDg1MmYsCisJMHg5NWFkLCAweDAwMDMsIDB4YjU2NiwgMHgwMDllLCAweDAwNmUsIDB4MDA1ZSwgMHgwMDA1LCAweDAwYTYsCisJMHg4OWZmLCAweDAxNTgsIDB4YTgwNCwgMHg5MDU1LCAweDAxMzAsIDB4YTgwNywgMHgwMDAwLCAweDA4MGMsCisJMHg2ZDE3LCAweDJhNDgsIDB4MGNiOCwgMHgwODBjLCAweDZkMTcsIDB4MDBhZSwgMHgwMDA1LCAweDAwZjYsCisJMHgyMDc5LCAweDAyMDAsIDB4NzgxNCwgMHg5MDg1LCAweDAwODAsIDB4NzgxNiwgMHhkMTg0LCAweDAxMDgsCisJMHg4MTA4LCAweDgxMGMsIDB4MjBhOSwgMHgwMDAxLCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDkyMDAsCisJMHgyMGEwLCAweDIwZTEsIDB4MDAwMCwgMHgyMzAwLCAweDllMDAsIDB4MjA5OCwgMHg0MDAzLCAweDgzMTgsCisJMHg5Mzg2LCAweDAwMjAsIDB4MTE0OCwgMHgyMDE4LCAweDIzMDAsIDB4OWUwMCwgMHgyMDk4LCAweDc4MTQsCisJMHg4MDAwLCAweDkwODUsIDB4MDA4MCwgMHg3ODE2LCAweDgxMDksIDB4MWQ4MCwgMHg3ODE3LCAweDAwMDAsCisJMHgwMGZlLCAweDAwMDUsIDB4NjkyMCwgMHg5MTg2LCAweDAwMDMsIDB4MDExOCwgMHg5MTg2LCAweDAwMDIsCisJMHgxMWQwLCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDJkNjAsIDB4MDA5NiwgMHg2MDE0LCAweDIwNDgsCisJMHgwODBjLCAweGNjODYsIDB4MDE1MCwgMHgyMDAxLCAweDAwMDYsIDB4YTk4MCwgMHhjMWQ1LCAweDA4MGMsCisJMHg2ZjRhLCAweDA4MGMsIDB4NmQwYiwgMHgwODBjLCAweGNlNzEsIDB4MDA5ZSwgMHgwODBjLCAweGFmNzQsCisJMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwYzYsIDB4NzAyYywgMHhkMDg0LCAweDExNzAsCisJMHg2MDA4LCAweDIwNjAsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDIsIDB4MTE0MCwgMHg2MTA0LCAweDkxODYsCisJMHgwMDg1LCAweDAxMTgsIDB4OTE4NiwgMHgwMDhiLCAweDExMDgsIDB4OTAwNiwgMHgwMGNlLCAweDAwMDUsCisJMHgwMDY2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMzEsIDB4MDAwMSwgMHg2MDIwLCAweDkwODQsCisJMHgwMDBmLCAweDAwODMsIDB4MDEyZSwgMHgwMDZlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgwMDY2LCAweDIwMzEsIDB4MDAwMCwgMHg2MDIwLCAweDkwODQsIDB4MDAwZiwgMHgwMDFiLCAweDAwNmUsCisJMHgwMTJlLCAweDAwMDUsIDB4YzhkMywgMHhjOGQzLCAweGM4Y2UsIDB4YzhmNSwgMHhjOGMxLCAweGM4Y2UsCisJMHhjOGY1LCAweGM4Y2UsIDB4YzhjMSwgMHg4Zjk1LCAweGM4Y2UsIDB4YzhjZSwgMHhjOGNlLCAweGM4YzEsCisJMHhjOGMxLCAweDA4MGMsIDB4MGRkNSwgMHgwMDM2LCAweDIwMTksIDB4MDAxMCwgMHgwODBjLCAweGUyYzAsCisJMHg2MDIzLCAweDAwMDYsIDB4NjAwMywgMHgwMDA3LCAweDAwM2UsIDB4MDAwNSwgMHg5MDA2LCAweDAwMDUsCisJMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMDk2LCAweDg2ZmYsIDB4MTFkOCwgMHg2MDE0LCAweDIwNDgsCisJMHgwODBjLCAweGNjODYsIDB4MDFjMCwgMHhhODY0LCAweDkwODYsIDB4MDEzOSwgMHgxMTI4LCAweGE4N2IsCisJMHgwMDA1LCAweGE4ODMsIDB4MDAwMCwgMHgwMDI4LCAweDkwMGUsIDB4MjAwMSwgMHgwMDA1LCAweDA4MGMsCisJMHg2ZjRhLCAweDA4MGMsIDB4Y2Y4MiwgMHgwODBjLCAweDZkMGIsIDB4MDgwYywgMHhhZjc0LCAweDkwODUsCisJMHgwMDAxLCAweDAwOWUsIDB4MDAwNSwgMHg5MDA2LCAweDBjZTAsIDB4NjAwMCwgMHg5MDhhLCAweDAwMTYsCisJMHgxYTBjLCAweDBkZDUsIDB4MDAwMiwgMHhjOTBiLCAweGM5M2IsIDB4YzkwZCwgMHhjOTVjLCAweGM5MzYsCisJMHhjOTBiLCAweGM4Y2UsIDB4YzhkMywgMHhjOGQzLCAweGM4Y2UsIDB4YzhjZSwgMHhjOGNlLCAweGM4Y2UsCisJMHhjOGNlLCAweGM4Y2UsIDB4YzhjZSwgMHgwODBjLCAweDBkZDUsIDB4ODZmZiwgMHgxNTIwLCAweDYwMjAsCisJMHg5MDg2LCAweDAwMDYsIDB4MDUwMCwgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGNjODYsCisJMHgwMTY4LCAweGE4N2MsIDB4ZDBjYywgMHgwMTQwLCAweDAwOTYsIDB4YzBjYywgMHhhODdlLCAweGE4NzgsCisJMHgyMDQ4LCAweDA4MGMsIDB4MGZiMSwgMHgwMDllLCAweDA4MGMsIDB4Y2Y4MiwgMHgwMDllLCAweDA4MGMsCisJMHhkMzQyLCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAyMywgMHgwMDAyLCAweDA4MGMsCisJMHg5MWIxLCAweDA4MGMsIDB4OTc2MywgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMDY2LCAweDA4MGMsCisJMHgxYWExLCAweDAwNmUsIDB4MDg5MCwgMHgwMGU2LCAweDIwNzEsIDB4MTllNiwgMHg3MDI0LCAweDljMDYsCisJMHgxMTIwLCAweDA4MGMsIDB4YTYzNiwgMHgwMGVlLCAweDA4NDAsIDB4NjAyMCwgMHg5MDg0LCAweDAwMGYsCisJMHg5MDg2LCAweDAwMDYsIDB4MTE1MCwgMHgwMDg2LCAweDAwOTYsIDB4MjA0OSwgMHgwMDAxLCAweDJjNDAsCisJMHgwODBjLCAweGE3NmIsIDB4MDA5ZSwgMHgwMDhlLCAweDAwMTAsIDB4MDgwYywgMHhhNTMzLCAweDAwZWUsCisJMHgxOTA0LCAweGM5MGQsIDB4MDgwNCwgMHhjOGNlLCAweDAwMzYsIDB4MDBlNiwgMHgyMDcxLCAweDE5ZTYsCisJMHg3MDNjLCAweDljMDYsIDB4MTEzOCwgMHg5MDFlLCAweDA4MGMsIDB4YTZhYywgMHgwMGVlLCAweDAwM2UsCisJMHgwODA0LCAweGM5MGQsIDB4MDgwYywgMHhhODliLCAweDAwZWUsIDB4MDAzZSwgMHgxOTA0LCAweGM5MGQsCisJMHgwODA0LCAweGM4Y2UsIDB4MDBjNiwgMHg2MDIwLCAweDkwODQsIDB4MDAwZiwgMHgwMDEzLCAweDAwY2UsCisJMHgwMDA1LCAweGM5OGYsIDB4Y2E1YSwgMHhjYmM0LCAweGM5OTksIDB4YWY3NCwgMHhjOThmLCAweGUyYjIsCisJMHhkM2FhLCAweGNhNWEsIDB4OGY2NywgMHhjYzUwLCAweGM5ODgsIDB4Yzk4OCwgMHhjOTg4LCAweGM5ODgsCisJMHgwODBjLCAweDBkZDUsIDB4MDgwYywgMHhjZThlLCAweDExMTAsIDB4MDgwYywgMHhiOTA1LCAweDAwMDUsCisJMHgwODBjLCAweDk2NTcsIDB4MDgwYywgMHg5NzYzLCAweDA4MDQsIDB4YWY0MywgMHg2MDFiLCAweDAwMDEsCisJMHgwMDA1LCAweDA4MGMsIDB4Y2M4NiwgMHgwMTMwLCAweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LCAweDJjMDAsCisJMHhhODk2LCAweDAwOWUsIDB4NjAwMCwgMHg5MDhhLCAweDAwMTYsIDB4MWEwYywgMHgwZGQ1LCAweDAwMDIsCisJMHhjOWI4LCAweGM5YmEsIDB4YzlkZSwgMHhjOWYyLCAweGNhMTgsIDB4YzliOCwgMHhjOThmLCAweGM5OGYsCisJMHhjOThmLCAweGM5ZjIsIDB4YzlmMiwgMHhjOWI4LCAweGM5YjgsIDB4YzliOCwgMHhjOWI4LCAweGM5ZmMsCisJMHgwODBjLCAweDBkZDUsIDB4MDBlNiwgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwgMHhhODgwLCAweGMwYjUsCisJMHhhODgyLCAweDAwOWUsIDB4MjA3MSwgMHgxOWU2LCAweDcwMjQsIDB4OWMwNiwgMHgwMWEwLCAweDA4MGMsCisJMHhhNTMzLCAweDA4MGMsIDB4ZDM0MiwgMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMjMsCisJMHgwMDAyLCAweDIwMDEsIDB4MTk4NiwgMHgyMDA0LCAweDYwMWEsIDB4MDgwYywgMHg5MWIxLCAweDA4MGMsCisJMHg5NzYzLCAweDAwZWUsIDB4MDAwNSwgMHg2MDFiLCAweDAwMDEsIDB4MGNkOCwgMHgwMDk2LCAweDYwMTQsCisJMHgyMDQ4LCAweGE4ODAsIDB4YzBiNSwgMHhhODgyLCAweDAwOWUsIDB4MDgwYywgMHhkMzQyLCAweDYwMDcsCisJMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDIzLCAweDAwMDIsIDB4MDgwYywgMHg5MWIxLCAweDA4MGMsCisJMHg5NzYzLCAweDAwMDUsIDB4MDA5NiwgMHg2MDFiLCAweDAwMDEsIDB4NjAxNCwgMHgyMDQ4LCAweGE4ODAsCisJMHhjMGI1LCAweGE4ODIsIDB4MDA5ZSwgMHgwMDA1LCAweDA4MGMsIDB4NTc2NSwgMHgwMWI4LCAweDYwMTQsCisJMHgwMDk2LCAweDkwNGQsIDB4MDE5MCwgMHhhODY0LCAweGE4NjcsIDB4MDEwMywgMHhhODdiLCAweDAwMDYsCisJMHg5MDg2LCAweDAxMzksIDB4MTE1MCwgMHhhODY3LCAweDAxMzksIDB4YTg3YiwgMHgwMDMwLCAweGE4OTcsCisJMHg0MDA1LCAweGE4OWIsIDB4MDAwNCwgMHgwODBjLCAweDZkMTcsIDB4MDA5ZSwgMHgwODA0LCAweGFmNDMsCisJMHg2MDE0LCAweDAwOTYsIDB4OTA0ZCwgMHgwNWM4LCAweGE5N2MsIDB4ZDFlNCwgMHgwNWIwLCAweDIwMDEsCisJMHgxODBmLCAweDIwMDQsIDB4ZDBjNCwgMHgwMTEwLCAweDAwOWUsIDB4MDAwNSwgMHhhODg0LCAweDAwOWUsCisJMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHg5MTA4LCAweDYxMWEsIDB4MjAwMSwgMHgwMDMwLCAweDJjMDgsCisJMHgwODBjLCAweDE1ZmQsIDB4MjAwMSwgMHgwMzBjLCAweDIwMDQsIDB4OTA4NiwgMHgwMDQxLCAweDExYTAsCisJMHg2MDE0LCAweDAwOTYsIDB4OTA0ZCwgMHgwOTBjLCAweDBkZDUsIDB4YTg4MCwgMHhkMGY0LCAweDExMzAsCisJMHhjMGY1LCAweGE4ODIsIDB4MDA5ZSwgMHg2MDFiLCAweDAwMDIsIDB4MDA3MCwgMHgwMDllLCAweDIwMDEsCisJMHgwMDM3LCAweDJjMDgsIDB4MDgwYywgMHgxNWZkLCAweDYwMDAsIDB4OTA4NiwgMHgwMDA0LCAweDExMjAsCisJMHgyMDA5LCAweDAwNDgsIDB4MDgwYywgMHhhZmJlLCAweDAwMDUsIDB4MDA5ZSwgMHgwODBjLCAweDFhYTEsCisJMHgwODA0LCAweGM5ZGUsIDB4NjAwMCwgMHg5MDhhLCAweDAwMTYsIDB4MWEwYywgMHgwZGQ1LCAweDAwMGIsCisJMHgwMDA1LCAweGNhNzEsIDB4Yzk5NiwgMHhjYTczLCAweGNhNzEsIDB4Y2E3MywgMHhjYTczLCAweGM5OTAsCisJMHhjYTcxLCAweGM5OGEsIDB4Yzk4YSwgMHhjYTcxLCAweGNhNzEsIDB4Y2E3MSwgMHhjYTcxLCAweGNhNzEsCisJMHhjYTcxLCAweDA4MGMsIDB4MGRkNSwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiODA0LCAweDkwODQsCisJMHgwMGZmLCAweDAwYmUsIDB4OTA4YSwgMHgwMDBjLCAweDFhMGMsIDB4MGRkNSwgMHgwMGI2LCAweDAwMTMsCisJMHgwMGJlLCAweDAwMDUsIDB4Y2E4ZSwgMHhjYjViLCAweGNhOTAsIDB4Y2FkMCwgMHhjYTkwLCAweGNhZDAsCisJMHhjYTkwLCAweGNhOWUsIDB4Y2E4ZSwgMHhjYWQwLCAweGNhOGUsIDB4Y2FiZiwgMHgwODBjLCAweDBkZDUsCisJMHg2MDA0LCAweDkwOGUsIDB4MDAxNiwgMHgwNWMwLCAweDkwOGUsIDB4MDAwNCwgMHgwNWE4LCAweDkwOGUsCisJMHgwMDAyLCAweDA1OTAsIDB4OTA4ZSwgMHgwMDUyLCAweDA5MDQsIDB4Y2I1NywgMHg2MDA0LCAweDA4MGMsCisJMHhjZThlLCAweDA5MDQsIDB4Y2I3NCwgMHg5MDhlLCAweDAwMDQsIDB4MTExMCwgMHgwODBjLCAweDMyNDcsCisJMHg5MDhlLCAweDAwMjEsIDB4MDkwNCwgMHhjYjc4LCAweDkwOGUsIDB4MDAyMiwgMHgwOTA0LCAweGNiYmYsCisJMHg5MDhlLCAweDAwM2QsIDB4MDkwNCwgMHhjYjc4LCAweDkwOGUsIDB4MDAzOSwgMHgwOTA0LCAweGNiN2MsCisJMHg5MDhlLCAweDAwMzUsIDB4MDkwNCwgMHhjYjdjLCAweDkwOGUsIDB4MDAxZSwgMHgwMTc4LCAweDkwOGUsCisJMHgwMDAxLCAweDExNDAsIDB4NjAxMCwgMHgyMDU4LCAweGI4MDQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsCisJMHgwMDA2LCAweDAxMTAsIDB4MDgwYywgMHgzMjFlLCAweDA4MGMsIDB4YjkwNSwgMHgwODA0LCAweGFmNzQsCisJMHgwMGM2LCAweDAwZDYsIDB4NjEwNCwgMHg5MTg2LCAweDAwMTYsIDB4MDkwNCwgMHhjYjQ4LCAweDkxODYsCisJMHgwMDAyLCAweDE5MDQsIDB4Y2IxZCwgMHgyMDAxLCAweDE4MzcsIDB4MjAwNCwgMHhkMDhjLCAweDExYzgsCisJMHgwODBjLCAweDc0M2UsIDB4MTFiMCwgMHgwODBjLCAweGQzODgsIDB4MDEzOCwgMHgwODBjLCAweDc0NjEsCisJMHgxMTIwLCAweDA4MGMsIDB4NzM0OCwgMHgwODA0LCAweGNiYTgsIDB4MjAwMSwgMHgxOTdjLCAweDIwMDMsCisJMHgwMDAxLCAweDIwMDEsIDB4MTgwMCwgMHgyMDAzLCAweDAwMDEsIDB4MDgwYywgMHg3MzZhLCAweDA4MDQsCisJMHhjYmE4LCAweDYwMTAsIDB4MjA1OCwgMHgyMDAxLCAweDE4MzcsIDB4MjAwNCwgMHhkMGFjLCAweDE5MDQsCisJMHhjYmE4LCAweGI4YTAsIDB4OTA4NCwgMHhmZjgwLCAweDE5MDQsIDB4Y2JhOCwgMHhiODQwLCAweDkwODQsCisJMHgwMGZmLCAweDkwMDUsIDB4MDE5MCwgMHg4MDAxLCAweGI4NDIsIDB4NjAxNywgMHgwMDAwLCAweDYwMjMsCisJMHgwMDA3LCAweDYwMWIsIDB4MDM5OCwgMHg2MDQzLCAweDAwMDAsIDB4MDgwYywgMHhhZWVkLCAweDAxMjgsCisJMHgyYjAwLCAweDYwMTIsIDB4NjAyMywgMHgwMDAxLCAweDA0NTgsIDB4MDBkZSwgMHgwMGNlLCAweDYwMDQsCisJMHg5MDhlLCAweDAwMDIsIDB4MTFhMCwgMHg2MDEwLCAweDIwNTgsIDB4YjhhMCwgMHg5MDg2LCAweDAwN2UsCisJMHgxMTcwLCAweDIwMDksIDB4MTgzNywgMHgyMTA0LCAweGMwODUsIDB4MjAwYSwgMHgwMGU2LCAweDIwNzEsCisJMHgxODAwLCAweDA4MGMsIDB4NjA0MCwgMHgwMGVlLCAweDA4MGMsIDB4YjkwNSwgMHgwMDMwLCAweDA4MGMsCisJMHhiOTA1LCAweDA4MGMsIDB4MzIxZSwgMHgwODBjLCAweGQzOWQsIDB4MDBlNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDA4MGMsIDB4MzI0NywgMHgwMTJlLCAweDAwZWUsIDB4MDgwYywgMHhhZjc0LCAweDAwMDUsCisJMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg2NWU5LCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDIsCisJMHgwODBjLCAweDkxZjksIDB4MDgwYywgMHg5NzYzLCAweDAwZGUsIDB4MDBjZSwgMHgwYzgwLCAweDA4MGMsCisJMHgzMjQ3LCAweDA4MDQsIDB4Y2FjYywgMHgwMGM2LCAweDAwZDYsIDB4NjEwNCwgMHg5MTg2LCAweDAwMTYsCisJMHgwZDM4LCAweDYwMTAsIDB4MjA1OCwgMHhiODQwLCAweDkwODQsIDB4MDBmZiwgMHg5MDA1LCAweDA5MDQsCisJMHhjYjFkLCAweDgwMDEsIDB4Yjg0MiwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg5MWY5LCAweDA4MGMsCisJMHg5NzYzLCAweDAwZGUsIDB4MDBjZSwgMHgwODk4LCAweDA4MGMsIDB4YjkwNSwgMHgwODA0LCAweGNhY2UsCisJMHgwODBjLCAweGI5NDEsIDB4MDgwNCwgMHhjYWNlLCAweDAwZDYsIDB4MmM2OCwgMHg2MTA0LCAweDA4MGMsCisJMHhkMzAwLCAweDAwZGUsIDB4MDExOCwgMHgwODBjLCAweGFmNDMsIDB4MDQwOCwgMHg2MDA0LCAweDgwMDcsCisJMHg2MTM0LCAweDkxOGMsIDB4MDBmZiwgMHg5MTA1LCAweDYwMzYsIDB4NjAwNywgMHgwMDg1LCAweDYwMDMsCisJMHgwMDBiLCAweDYwMjMsIDB4MDAwMiwgMHg2MDNjLCAweDYwMGEsIDB4MjAwMSwgMHgxOTg2LCAweDIwMDQsCisJMHg2MDFhLCAweDYwMmMsIDB4MmMwOCwgMHgyMDYwLCAweDYwMjQsIDB4ZDBiNCwgMHgwMTA4LCAweGMwODUsCisJMHhjMGI1LCAweDYwMjYsIDB4MjE2MCwgMHgwODBjLCAweDkxYjEsIDB4MDgwYywgMHg5NzYzLCAweDAwMDUsCisJMHgwMGRlLCAweDAwY2UsIDB4MDgwYywgMHhiOTA1LCAweDA4MGMsIDB4MzIxZSwgMHgwMGU2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHgzMjQ3LCAweDYwMTcsIDB4MDAwMCwgMHg2MDIzLCAweDAwMDcsCisJMHg2MDFiLCAweDAzOTgsIDB4NjA0MywgMHgwMDAwLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweDA4MGMsCisJMHhiMzc0LCAweDE5MDQsIDB4Y2I3NCwgMHgwMDA1LCAweDYwMDAsIDB4OTA4YSwgMHgwMDE2LCAweDFhMGMsCisJMHgwZGQ1LCAweDAwOTYsIDB4MDBkNiwgMHgwMDFiLCAweDAwZGUsIDB4MDA5ZSwgMHgwMDA1LCAweGNiZGYsCisJMHhjYmRmLCAweGNiZGYsIDB4Y2JkZiwgMHhjYmRmLCAweGNiZGYsIDB4Y2JkZiwgMHhjYmRmLCAweGNiZGYsCisJMHhjOThmLCAweGNiZGYsIDB4Yzk5NiwgMHhjYmUxLCAweGM5OTYsIDB4Y2JmYiwgMHhjYmRmLCAweDA4MGMsCisJMHgwZGQ1LCAweDYwMDQsIDB4OTA4NiwgMHgwMDhiLCAweDAxYjAsIDB4NjAzNCwgMHg5MDhjLCAweGZmMDAsCisJMHg4MTBmLCAweDkxODYsIDB4MDAzNSwgMHgxMTMwLCAweDYwMmMsIDB4OTA4MCwgMHgwMDA5LCAweDIwMGMsCisJMHhjMTg1LCAweDIxMDIsIDB4NjAwNywgMHgwMDhiLCAweDYwMDMsIDB4MDAwZCwgMHgwODBjLCAweDkxYjEsCisJMHgwODBjLCAweDk3NjMsIDB4MDAwNSwgMHgwODBjLCAweGQzN2MsIDB4MDExOCwgMHgwODBjLCAweGQzOGYsCisJMHgwMDEwLCAweDA4MGMsIDB4ZDM5ZCwgMHgwODBjLCAweGNlNzEsIDB4MDgwYywgMHhjYzg2LCAweDA1NzAsCisJMHgwODBjLCAweDMyMWUsIDB4MDgwYywgMHhjYzg2LCAweDAxNjgsIDB4NjAxNCwgMHgyMDQ4LCAweGE4NjcsCisJMHgwMTAzLCAweGE4N2IsIDB4MDAwNiwgMHhhODc3LCAweDAwMDAsIDB4YTg4MCwgMHhjMGVkLCAweGE4ODIsCisJMHgwODBjLCAweDZkMTcsIDB4MmM2OCwgMHgwODBjLCAweGFlZWQsIDB4MDE1MCwgMHg2ODEwLCAweDYwMTIsCisJMHgwODBjLCAweGQxMDIsIDB4MDBjNiwgMHgyZDYwLCAweDA4MGMsIDB4YWY3NCwgMHgwMGNlLCAweDAwMDgsCisJMHgyZDYwLCAweDYwMTcsIDB4MDAwMCwgMHg2MDIzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDYwMDMsCisJMHgwMDAxLCAweDA4MGMsIDB4OTFmOSwgMHgwODBjLCAweDk3NjMsIDB4MDBjOCwgMHgwODBjLCAweGQzN2MsCisJMHgwMTM4LCAweDYwMzQsIDB4OTA4NiwgMHg0MDAwLCAweDExMTgsIDB4MDgwYywgMHgzMjFlLCAweDA4ZDAsCisJMHg2MDM0LCAweDkwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDkxODYsIDB4MDAzOSwgMHgwMTE4LCAweDkxODYsCisJMHgwMDM1LCAweDExMTgsIDB4MDgwYywgMHgzMjFlLCAweDA4NjgsIDB4MDgwYywgMHhhZjc0LCAweDAwMDUsCisJMHg2MDAwLCAweDkwOGEsIDB4MDAxNiwgMHgxYTBjLCAweDBkZDUsIDB4MDAwMiwgMHhjYzY2LCAweGNjNjYsCisJMHhjYzY4LCAweGNjNjgsIDB4Y2M2OCwgMHhjYzY2LCAweGNjNjYsIDB4YWY3NCwgMHhjYzY2LCAweGNjNjYsCisJMHhjYzY2LCAweGNjNjYsIDB4Y2M2NiwgMHhjYzY2LCAweGNjNjYsIDB4Y2M2NiwgMHgwODBjLCAweDBkZDUsCisJMHgwODBjLCAweGE4OWIsIDB4NjExNCwgMHgwMDk2LCAweDIxNDgsIDB4YTg3YiwgMHgwMDA2LCAweDA4MGMsCisJMHg2ZDE3LCAweDAwOWUsIDB4MDgwNCwgMHhhZjQzLCAweDkyODQsIDB4MDAwNywgMHgxMTU4LCAweDkyODIsCisJMHgxY2QwLCAweDAyNDAsIDB4MjAwMSwgMHgxODFhLCAweDIwMDQsIDB4OTIwMiwgMHgxMjE4LCAweDkwODUsCisJMHgwMDAxLCAweDAwMDUsIDB4OTAwNiwgMHgwY2U4LCAweDAwOTYsIDB4MDAyOCwgMHgwMDk2LCAweDAwMDYsCisJMHg2MDE0LCAweDIwNDgsIDB4MDAwZSwgMHgwMDA2LCAweDk5ODQsIDB4ZjAwMCwgMHg5MDg2LCAweGYwMDAsCisJMHgwMTEwLCAweDA4MGMsIDB4MTBhYSwgMHgwMDBlLCAweDAwOWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwYzYsCisJMHgwMDM2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA2MSwgMHgxY2QwLCAweDIwNzEsCisJMHgxODAwLCAweDczNTQsIDB4NzA3NCwgMHg5MzAyLCAweDE2NDAsIDB4NjAyMCwgMHg5MjA2LCAweDExZjgsCisJMHgwODBjLCAweGQzODgsIDB4MDE4MCwgMHg5Mjg2LCAweDAwMDEsIDB4MTE2OCwgMHg2MDA0LCAweDkwODYsCisJMHgwMDA0LCAweDExNDgsIDB4MDgwYywgMHgzMjFlLCAweDA4MGMsIDB4ZDM5ZCwgMHgwMGM2LCAweDA4MGMsCisJMHhhZjc0LCAweDAwY2UsIDB4MDA2MCwgMHgwODBjLCAweGQwN2MsIDB4MDE0OCwgMHgwODBjLCAweGNlOGUsCisJMHgxMTEwLCAweDA4MGMsIDB4YjkwNSwgMHgwMGM2LCAweDA4MGMsIDB4YWY0MywgMHgwMGNlLCAweDljZTAsCisJMHgwMDE4LCAweDcwNjgsIDB4OWMwMiwgMHgxMjA4LCAweDA4YTAsIDB4MDEyZSwgMHgwMDBlLCAweDAwM2UsCisJMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwYzYsIDB4MDAxNiwgMHg5MTg4LCAweDEwMDAsCisJMHgyMTBjLCAweDgxZmYsIDB4MDEyOCwgMHgyMDYxLCAweDFhYjIsIDB4NjExMiwgMHgwODBjLCAweDMyMWUsCisJMHg5MDA2LCAweDAwMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMWUsIDB4MDBjZSwgMHgwMGVlLCAweDAwMDUsCisJMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4YWVlZCwgMHgwMWIwLCAweDY2NTYsCisJMHgyYjAwLCAweDYwMTIsIDB4MDgwYywgMHg1NzY1LCAweDAxMTgsIDB4MDgwYywgMHhjZGI1LCAweDAxNjgsCisJMHgwODBjLCAweGQxMDIsIDB4NjAyMywgMHgwMDAzLCAweDIwMDksIDB4MDA0YiwgMHgwODBjLCAweGFmYmUsCisJMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LCAweDAwYzYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhiYWEwLCAweDA4MGMsIDB4YWY5MSwgMHgwNTYwLCAweDYwNTcsCisJMHgwMDAwLCAweDJiMDAsIDB4NjAxMiwgMHgwODBjLCAweGQxMDIsIDB4NjAyMywgMHgwMDAzLCAweDAwMTYsCisJMHgwODBjLCAweDkzNTYsIDB4MDA3NiwgMHg5MDNlLCAweDA4MGMsIDB4OTIyOSwgMHgyYzA4LCAweDA4MGMsCisJMHhlNDc3LCAweDAwN2UsIDB4MDAxZSwgMHhkMTg0LCAweDAxMjgsIDB4MDgwYywgMHhhZjQzLCAweDkwODUsCisJMHgwMDAxLCAweDAwNzAsIDB4MDgwYywgMHg1NzY1LCAweDAxMjgsIDB4ZDE4YywgMHgxMTcwLCAweDA4MGMsCisJMHhjZGI1LCAweDAxNDgsIDB4MjAwOSwgMHgwMDRjLCAweDA4MGMsIDB4YWZiZSwgMHg5MDg1LCAweDAwMDEsCisJMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4MjkwMCwgMHg2MDE2LCAweDBjOTAsCisJMHgyMDA5LCAweDAwNGQsIDB4MDAxMCwgMHgyMDA5LCAweDAwNGUsIDB4MDBmNiwgMHgwMGM2LCAweDAwNDYsCisJMHgwMDE2LCAweDA4MGMsIDB4YWVlZCwgMHgyYzc4LCAweDA1YTAsIDB4N2U1NiwgMHgyYjAwLCAweDc4MTIsCisJMHg3ODIzLCAweDAwMDMsIDB4MDAxNiwgMHgyMDIxLCAweDAwMDUsIDB4MDgwYywgMHhjZGM3LCAweDAwMWUsCisJMHg5MTg2LCAweDAwNGQsIDB4MDExOCwgMHg5MTg2LCAweDAwNGUsIDB4MDE0OCwgMHgyMDAxLCAweDE5N2YsCisJMHgyMDBjLCAweGQxZmMsIDB4MDE2OCwgMHgyZjYwLCAweDA4MGMsIDB4YWY0MywgMHgwMGQwLCAweDIwMDEsCisJMHgxOTdlLCAweDIwMGMsIDB4ZDFmYywgMHgwMTIwLCAweDJmNjAsIDB4MDgwYywgMHhhZjQzLCAweDAwODgsCisJMHgyZjYwLCAweDA4MGMsIDB4NTc2NSwgMHgwMTM4LCAweGQxOGMsIDB4MTExOCwgMHgwNGYxLCAweDAxNDgsCisJMHgwMDEwLCAweDI5MDAsIDB4NzgxNiwgMHgwMDFlLCAweDAwMTYsIDB4MDgwYywgMHhhZmJlLCAweDkwODUsCisJMHgwMDAxLCAweDAwMWUsIDB4MDA0ZSwgMHgwMGNlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDAwYzYsCisJMHgwMDQ2LCAweDA4MGMsIDB4YWVlZCwgMHgyYzc4LCAweDA1MDgsIDB4N2U1NiwgMHgyYjAwLCAweDc4MTIsCisJMHg3ODIzLCAweDAwMDMsIDB4MDA5NiwgMHgyMDIxLCAweDAwMDQsIDB4MDQ4OSwgMHgwMDllLCAweDIwMDEsCisJMHgxOTdkLCAweDIwMGMsIDB4ZDFmYywgMHgwMTIwLCAweDJmNjAsIDB4MDgwYywgMHhhZjQzLCAweDAwNjAsCisJMHgyZjYwLCAweDA4MGMsIDB4NTc2NSwgMHgwMTIwLCAweGQxOGMsIDB4MTE2MCwgMHgwMDcxLCAweDAxMzAsCisJMHgyMDA5LCAweDAwNTIsIDB4MDgwYywgMHhhZmJlLCAweDkwODUsIDB4MDAwMSwgMHgwMDRlLCAweDAwY2UsCisJMHgwMGZlLCAweDAwMDUsIDB4MjkwMCwgMHg3ODE2LCAweDBjOTgsIDB4MDBjNiwgMHgwODBjLCAweDRiMWYsCisJMHgwMGNlLCAweDExMjAsIDB4MDgwYywgMHhhZjQzLCAweDkwMDYsIDB4MDAwNSwgMHhhODY3LCAweDAwMDAsCisJMHhhODZiLCAweDgwMDAsIDB4MjkwMCwgMHg2MDE2LCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwOTYsCisJMHgwMDc2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NjdjZCwgMHgwMTU4LCAweDIwMDEsCisJMHhjZGNjLCAweDAwMDYsIDB4OTAwZSwgMHgyNDAwLCAweDA4MGMsIDB4NmY0YSwgMHgwODBjLCAweDZkMTcsCisJMHgwMDBlLCAweDA4MDcsIDB4MjQxOCwgMHgwODBjLCAweDk1ZjEsIDB4YmFhMCwgMHgwMDg2LCAweDIwNDEsCisJMHgwMDAxLCAweDIwMzksIDB4MDAwMSwgMHgyNjA4LCAweDA4MGMsIDB4OTM2ZSwgMHgwMDhlLCAweDA4MGMsCisJMHg5MjI5LCAweDJmMDgsIDB4MjY0OCwgMHgwODBjLCAweGU0NzcsIDB4YjkzYywgMHg4MWZmLCAweDA5MGMsCisJMHg5NDQxLCAweDA4MGMsIDB4OTc2MywgMHgwMTJlLCAweDAwN2UsIDB4MDA5ZSwgMHgwMDA1LCAweDAwYzYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweGFlZWQsIDB4MDE5MCwgMHg2NjBhLCAweDJiMDgsCisJMHg2MTEyLCAweDA4MGMsIDB4ZDEwMiwgMHg2MDIzLCAweDAwMDEsIDB4MjkwMCwgMHg2MDE2LCAweDIwMDksCisJMHgwMDFmLCAweDA4MGMsIDB4YWZiZSwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsCisJMHg5MDA2LCAweDBjZDgsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweGFmOTEsCisJMHgwMWI4LCAweDY2MGEsIDB4MmIwOCwgMHg2MTEyLCAweDA4MGMsIDB4ZDEwMiwgMHg2MDIzLCAweDAwMDgsCisJMHgyOTAwLCAweDYwMTYsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4MTc1NCwgMHgwMGZlLCAweDIwMDksCisJMHgwMDIxLCAweDA4MGMsIDB4YWZiZSwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsCisJMHg5MDA2LCAweDBjZDgsIDB4MjAwOSwgMHgwMDNkLCAweDAwYzYsIDB4MDEyNiwgMHgwMDE2LCAweDIwOTEsCisJMHg4MDAwLCAweDA4MGMsIDB4YWVlZCwgMHgwMTk4LCAweDY2MGEsIDB4MmIwOCwgMHg2MTEyLCAweDA4MGMsCisJMHhkMTAyLCAweDYwMjMsIDB4MDAwMSwgMHgyOTAwLCAweDYwMTYsIDB4MDAxZSwgMHgwMDE2LCAweDA4MGMsCisJMHhhZmJlLCAweDkwODUsIDB4MDAwMSwgMHgwMDFlLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweDkwMDYsCisJMHgwY2QwLCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHhhZjkxLCAweDAxODgsCisJMHgyYjA4LCAweDYxMTIsIDB4MDgwYywgMHhkMTAyLCAweDYwMjMsIDB4MDAwMSwgMHgyOTAwLCAweDYwMTYsCisJMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHhhZmJlLCAweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwY2UsCisJMHgwMDA1LCAweDkwMDYsIDB4MGNkOCwgMHgyMDA5LCAweDAwNDQsIDB4MDgzMCwgMHgyMDA5LCAweDAwNDksCisJMHgwODE4LCAweDAwMjYsIDB4MDBiNiwgMHg2MjEwLCAweDIyNTgsIDB4YmEzYywgMHg4MmZmLCAweDAxMTAsCisJMHg4MjExLCAweGJhM2UsIDB4MDBiZSwgMHgwMDJlLCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDYwMDQsCisJMHg5MDhlLCAweDAwMDIsIDB4MDE0MCwgMHg5MDhlLCAweDAwMDMsIDB4MDEyOCwgMHg5MDhlLCAweDAwMDQsCisJMHgwMTEwLCAweDkwODUsIDB4MDAwMSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDAwODYsCisJMHgwMDk2LCAweDYwMjAsIDB4OTA4NiwgMHgwMDA0LCAweDAxYTgsIDB4NjAxNCwgMHg5MDRkLCAweDA4MGMsCisJMHhjYzg2LCAweDAxODAsIDB4YTg2NCwgMHg5MDg2LCAweDAxMzksIDB4MDE3MCwgMHg2MDIwLCAweDkwYzYsCisJMHgwMDAzLCAweDAxNDAsIDB4OTBjNiwgMHgwMDAyLCAweDAxMjgsIDB4YTg2OCwgMHhkMGZjLCAweDAxMTAsCisJMHg5MDA2LCAweDAwMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwOWUsIDB4MDA4ZSwgMHgwMDBlLCAweDAwMDUsCisJMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4YWY5MSwgMHgwMTk4LCAweDJiMDgsCisJMHg2MTEyLCAweDA4MGMsIDB4ZDEwMiwgMHg2MDIzLCAweDAwMDEsIDB4MjkwMCwgMHg2MDE2LCAweDA4MGMsCisJMHgzMjFlLCAweDIwMDksIDB4MDAyOCwgMHgwODBjLCAweGFmYmUsIDB4OTA4NSwgMHgwMDAxLCAweDAxMmUsCisJMHgwMGNlLCAweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LCAweDkxODYsIDB4MDAxNSwgMHgxMWE4LCAweDIwMTEsCisJMHgxODI0LCAweDIyMDQsIDB4OTA4NiwgMHgwMDc0LCAweDExNzgsIDB4MDBiNiwgMHgwODBjLCAweGJiNTksCisJMHgwMGJlLCAweDA4MGMsIDB4YmQ3YywgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDI5LCAweDA4MGMsCisJMHg5MWY5LCAweDA4MGMsIDB4OTc2MywgMHgwMDc4LCAweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4NjgsCisJMHgwMDllLCAweGQwZmMsIDB4MDE0OCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHhkMmMxLCAweDA4MGMsCisJMHhiOTA1LCAweDA4MGMsIDB4YWY0MywgMHgwMDA1LCAweDAwOTYsIDB4NjAxNCwgMHg5MDRkLCAweDA5MGMsCisJMHgwZGQ1LCAweGE4N2IsIDB4MDAzMCwgMHhhODgzLCAweDAwMDAsIDB4YTg5NywgMHg0MDA1LCAweGE4OWIsCisJMHgwMDA0LCAweGE4NjcsIDB4MDEzOSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDZkMTcsCisJMHgwMTJlLCAweDAwOWUsIDB4MDgwYywgMHhhZjQzLCAweDBjMzAsIDB4MDA5NiwgMHg5MTg2LCAweDAwMTYsCisJMHgxMTI4LCAweDIwMDEsIDB4MDAwNCwgMHgwODBjLCAweDY1ZTksIDB4MDBlOCwgMHg5MTg2LCAweDAwMTUsCisJMHgxNTEwLCAweDIwMTEsIDB4MTgyNCwgMHgyMjA0LCAweDkwODYsIDB4MDAxNCwgMHgxMWUwLCAweDYwMTAsCisJMHgwMGI2LCAweDIwNTgsIDB4MDgwYywgMHg2NzM0LCAweDAwYmUsIDB4MDgwYywgMHhiZTRkLCAweDExOTgsCisJMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiODkwLCAweDAwYmUsIDB4OTAwNSwgMHgwMTYwLCAweDIwMDEsCisJMHgwMDA2LCAweDA4MGMsIDB4NjVlOSwgMHg2MDE0LCAweDIwNDgsIDB4YTg2OCwgMHhkMGZjLCAweDAxNzAsCisJMHgwODBjLCAweGIzNDgsIDB4MDA0OCwgMHg2MDE0LCAweDIwNDgsIDB4YTg2OCwgMHhkMGZjLCAweDA1MjgsCisJMHgwODBjLCAweGI5MDUsIDB4MDgwYywgMHhhZjQzLCAweDAwOWUsIDB4MDAwNSwgMHg2MDE0LCAweDYzMTAsCisJMHgyMzU4LCAweDkwNGQsIDB4MDkwYywgMHgwZGQ1LCAweGE4N2IsIDB4MDAwMCwgMHhhODgzLCAweDAwMDAsCisJMHhhODk3LCAweDQwMDAsIDB4OTAwZSwgMHgwODBjLCAweDY4YjksIDB4MTEwOCwgMHhjMTg1LCAweGI4MDAsCisJMHhkMGJjLCAweDAxMDgsIDB4YzE4ZCwgMHhhOTlhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsCisJMHg2ZDE3LCAweDAxMmUsIDB4MDgwYywgMHhhZjQzLCAweDA4ZjgsIDB4NjAxNCwgMHg5MDRkLCAweDA5MGMsCisJMHgwZGQ1LCAweGE4N2IsIDB4MDAzMCwgMHhhODgzLCAweDAwMDAsIDB4YTg5NywgMHg0MDA1LCAweGE4OWIsCisJMHgwMDA0LCAweGE4NjcsIDB4MDEzOSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDZkMTcsCisJMHgwMTJlLCAweDA4MGMsIDB4YWY0MywgMHgwODQwLCAweGE4NzgsIDB4OTA4NiwgMHgwMDA1LCAweDExMDgsCisJMHgwMDA5LCAweDAwMDUsIDB4YTg4MCwgMHhjMGFkLCAweGE4ODIsIDB4MDAwNSwgMHg2MDQzLCAweDAwMDAsCisJMHg2MDE3LCAweDAwMDAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDA1MCwgMHgwODBjLCAweDkxYjEsCisJMHgwODBjLCAweDk3NjMsIDB4MDAwNSwgMHgwMGM2LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDAsCisJMHgwMGJlLCAweGQwYmMsIDB4MDEyMCwgMHg2MDIwLCAweDkwODQsIDB4MDAwZiwgMHgwMDEzLCAweDAwY2UsCisJMHgwMDA1LCAweGM5OGYsIDB4Y2ZiMiwgMHhjZmIyLCAweGNmYjUsIDB4ZTc4OSwgMHhlN2E0LCAweGU3YTcsCisJMHhjOThmLCAweGM5OGYsIDB4Yzk4ZiwgMHhjOThmLCAweGM5OGYsIDB4Yzk4ZiwgMHhjOThmLCAweGM5OGYsCisJMHgwODBjLCAweDBkZDUsIDB4YTAwMSwgMHhhMDAxLCAweDAwMDUsIDB4MDA5NiwgMHg2MDE0LCAweDkwNGQsCisJMHgwMTE4LCAweGE4N2MsIDB4ZDBlNCwgMHgxMTEwLCAweDAwOWUsIDB4MDAxMCwgMHgwMDllLCAweDAwMDUsCisJMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgwNTUwLCAweDIwMDEsCisJMHgxODM0LCAweDIwMDQsIDB4OTAwNSwgMHgxNTQwLCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweGFlZWQsCisJMHgwNTA4LCAweDc4MTAsIDB4NjAxMiwgMHgwODBjLCAweGQxMDIsIDB4NzgyMCwgMHg5MDg2LCAweDAwMDMsCisJMHgwMTI4LCAweDc4MDgsIDB4NjAzYSwgMHgyZjAwLCAweDYwM2UsIDB4MDAyMCwgMHg3ODA4LCAweDYwM2UsCisJMHgyZjAwLCAweDYwM2EsIDB4NjAyZSwgMHg2MDIzLCAweDAwMDEsIDB4NjAwNywgMHgwMDM1LCAweDYwMDMsCisJMHgwMDAxLCAweDc5NTQsIDB4NjE1NiwgMHgwODBjLCAweDkxYjEsIDB4MDgwYywgMHg5NzYzLCAweDJmNjAsCisJMHgwMGZlLCAweDAwMDUsIDB4MmY2MCwgMHgwMGZlLCAweDIwMDEsIDB4MTk4NywgMHgyMDA0LCAweDYwNDIsCisJMHgwMDA1LCAweDAwMTYsIDB4MDA5NiwgMHg2ODE0LCAweDIwNDgsIDB4YTg3YywgMHhkMGU0LCAweDAxODAsCisJMHhjMGU0LCAweGE4N2UsIDB4YTg3NywgMHgwMDAwLCAweGE4OTMsIDB4MDAwMCwgMHhhODhmLCAweDAwMDAsCisJMHhkMGNjLCAweDAxMzAsIDB4YzBjYywgMHhhODdlLCAweGE4NzgsIDB4MjA0OCwgMHgwODBjLCAweDBmYjEsCisJMHg2ODMwLCAweDYwMzYsIDB4OTA4ZSwgMHgwMDAxLCAweDAxNDgsIDB4NjgwMywgMHgwMDAyLCAweDkwODYsCisJMHgwMDA1LCAweDAxNzAsIDB4OTAwNiwgMHg2MDJlLCAweDYwMzIsIDB4MDBkMCwgMHg2ODFjLCAweGMwODUsCisJMHg2ODFlLCAweDY4MDMsIDB4MDAwNCwgMHg2ODI0LCAweGMwZjQsIDB4OTA4NSwgMHgwYzAwLCAweDY4MjYsCisJMHg2ODE0LCAweDIwNDgsIDB4YThhYywgMHg2OTM4LCAweDkxMDIsIDB4YThiMCwgMHg2OTNjLCAweDkxMDMsCisJMHgxZTQ4LCAweDY4M2MsIDB4NjAyZSwgMHg2ODM4LCAweDkwODQsIDB4ZmZmYywgMHg2ODNhLCAweDYwMzIsCisJMHgyZDAwLCAweDYwM2EsIDB4NjgwOCwgMHg2MDNlLCAweDY5MTAsIDB4NjExMiwgMHg2OTU0LCAweDYxNTYsCisJMHg2MDIzLCAweDAwMDEsIDB4NjAwNywgMHgwMDM5LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxYjEsCisJMHgwODBjLCAweDk3NjMsIDB4MDA5ZSwgMHgwMDFlLCAweDAwMDUsIDB4NjAyNCwgMHhkMGQ0LCAweDA1MTAsCisJMHhkMGY0LCAweDExZjgsIDB4NjAzOCwgMHg5NDBhLCAweDYwM2MsIDB4OTMwMywgMHgwMjMwLCAweDkxMDUsCisJMHgwMTIwLCAweDYwMjQsIDB4YzBkNCwgMHhjMGY1LCAweDAwOTgsIDB4NjQzYSwgMHg2MzNlLCAweGFjM2UsCisJMHhhYjQyLCAweDAwNDYsIDB4MDAzNiwgMHgyNDAwLCAweGFjYWMsIDB4OTQwMiwgMHhhODM2LCAweDIzMDAsCisJMHhhYmIwLCAweDkzMDMsIDB4YTgzYSwgMHgwMDNlLCAweDAwNGUsIDB4NjAyNCwgMHhjMGQ0LCAweDAwMDAsCisJMHg2MDI2LCAweDAwMDUsIDB4ZDBmNCwgMHgxMTM4LCAweGE4M2MsIDB4NjAzYSwgMHhhODQwLCAweDYwM2UsCisJMHg2MDI0LCAweGMwZjUsIDB4NjAyNiwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwgMHg2MDA0LCAweDkwOGUsCisJMHgwMDM0LCAweDAxYjgsIDB4OTA4ZSwgMHgwMDM1LCAweDAxYTAsIDB4OTA4ZSwgMHgwMDM2LCAweDAxODgsCisJMHg5MDhlLCAweDAwMzcsIDB4MDE3MCwgMHg5MDhlLCAweDAwMzgsIDB4MDE1OCwgMHg5MDhlLCAweDAwMzksCisJMHgwMTQwLCAweDkwOGUsIDB4MDAzYSwgMHgwMTI4LCAweDkwOGUsIDB4MDAzYiwgMHgwMTEwLCAweDkwODUsCisJMHgwMDAxLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsCisJMHgwMGU2LCAweDIwMDEsIDB4MTk4MSwgMHgyMDBjLCAweDgwMDAsIDB4MjAxNCwgMHgyMDAxLCAweDAwMzIsCisJMHgwODBjLCAweDkwMjcsIDB4MjAwMSwgMHgxOTg1LCAweDgyZmYsIDB4MTExMCwgMHgyMDExLCAweDAwMTQsCisJMHgyMjAyLCAweDIwMDEsIDB4MTk4MywgMHgyMDBjLCAweDgwMDAsIDB4MjAxNCwgMHgyMDcxLCAweDE5NmIsCisJMHg3MTFhLCAweDcyMWUsIDB4MjAwMSwgMHgwMDY0LCAweDA4MGMsIDB4OTAyNywgMHgyMDAxLCAweDE5ODYsCisJMHg4MmZmLCAweDExMTAsIDB4MjAxMSwgMHgwMDE0LCAweDIyMDIsIDB4MjAwMSwgMHgxOTg3LCAweDkyODgsCisJMHgwMDBhLCAweDIxMDIsIDB4MjAwMSwgMHgxYTkzLCAweDIxMDIsIDB4MjAwMSwgMHgwMDMyLCAweDA4MGMsCisJMHgxNWZkLCAweDA4MGMsIDB4NjllZCwgMHgwMGVlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsCisJMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwgMHgwMGU2LCAweDIwMDEsIDB4MTk4NSwgMHgyMDAzLCAweDAwMjgsCisJMHgyMDAxLCAweDE5ODYsIDB4MjAwMywgMHgwMDE0LCAweDIwNzEsIDB4MTk2YiwgMHg3MDFiLCAweDAwMDAsCisJMHg3MDFmLCAweDA3ZDAsIDB4MjAwMSwgMHgxOTg3LCAweDIwMDksIDB4MDAxZSwgMHgyMTAyLCAweDIwMDEsCisJMHgxYTkzLCAweDIxMDIsIDB4MjAwMSwgMHgwMDMyLCAweDA4MGMsIDB4MTVmZCwgMHgwMGVlLCAweDAwMWUsCisJMHgwMDBlLCAweDAwMDUsIDB4MDA5NiwgMHg2MDU4LCAweDkwNGQsIDB4MDExMCwgMHgwODBjLCAweDEwMzEsCisJMHgwMDllLCAweDAwMDUsIDB4MDAwNSwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsCisJMHhhZWVkLCAweDAxODAsIDB4MmIwOCwgMHg2MTEyLCAweDBjYTksIDB4NjAyMywgMHgwMDAxLCAweDI5MDAsCisJMHg2MDE2LCAweDIwMDksIDB4MDAzMywgMHgwODBjLCAweGFmYmUsIDB4OTA4NSwgMHgwMDAxLCAweDAxMmUsCisJMHgwMGNlLCAweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LCAweDAwOTYsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzEsCisJMHgxODAwLCAweDkxODYsIDB4MDAxNSwgMHgxNTAwLCAweDcwOTAsIDB4OTA4NiwgMHgwMDE4LCAweDExZTAsCisJMHg2MDE0LCAweDIwNDgsIDB4YWEzYywgMHhkMmU0LCAweDExNjAsIDB4MmM3OCwgMHgwODBjLCAweDk5ZjksCisJMHgwMWQ4LCAweDcwN2MsIDB4YWE1MCwgMHg5MjA2LCAweDExNjAsIDB4NzA4MCwgMHhhYTU0LCAweDkyMDYsCisJMHgxMTQwLCAweDYyMTAsIDB4MDBiNiwgMHgyMjU4LCAweGJhYTAsIDB4MDBiZSwgMHg5MDBlLCAweDA4MGMsCisJMHgzMjY3LCAweDA4MGMsIDB4YjM0OCwgMHgwMDIwLCAweDA4MGMsIDB4YjkwNSwgMHgwODBjLCAweGFmNDMsCisJMHgwMGZlLCAweDAwZWUsIDB4MDA5ZSwgMHgwMDA1LCAweDcwNjAsIDB4YWE1NCwgMHg5MjA2LCAweDBkNDgsCisJMHgwYzgwLCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHhhZWVkLCAweDAxODgsCisJMHgyYjA4LCAweDYxMTIsIDB4MDgwYywgMHhkMTAyLCAweDYwMjMsIDB4MDAwMSwgMHgyOTAwLCAweDYwMTYsCisJMHgyMDA5LCAweDAwNGQsIDB4MDgwYywgMHhhZmJlLCAweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwY2UsCisJMHgwMDA1LCAweDkwMDYsIDB4MGNkOCwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwMTYsCisJMHgwODBjLCAweGFlZWQsIDB4MDE4MCwgMHgyYjA4LCAweDYxMTIsIDB4MDgwYywgMHhkMTAyLCAweDYwMjMsCisJMHgwMDAxLCAweDI5MDAsIDB4NjAxNiwgMHgwMDFlLCAweDA4MGMsIDB4YWZiZSwgMHg5MDg1LCAweDAwMDEsCisJMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwgMHgwMDFlLCAweDkwMDYsIDB4MGNkMCwgMHgwMDE2LCAweDAwMjYsCisJMHgwMDM2LCAweDAwNDYsIDB4MDA1NiwgMHgwMDY2LCAweDAwOTYsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzEsCisJMHgxODAwLCAweDkxODYsIDB4MDAxNSwgMHgxNTY4LCAweDcxOTAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4MTQsCisJMHg4MDAzLCAweDkxMDYsIDB4MTUzMCwgMHgyMGUxLCAweDAwMDAsIDB4MjAwMSwgMHgxOTlmLCAweDIwMDMsCisJMHgwMDAwLCAweDYwMTQsIDB4MjA0OCwgMHhhODMwLCAweDIwYTgsIDB4ODkwNiwgMHg4MDA2LCAweDgwMDcsCisJMHg5MDk0LCAweDAwM2YsIDB4MjJlOCwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDFiLCAweDIwYTAsCisJMHgyMDAxLCAweDE5OWYsIDB4MDAxNiwgMHgyMDBjLCAweDA4MGMsIDB4ZDk5YiwgMHgwMDFlLCAweGE4MDQsCisJMHg5MDA1LCAweDAxMTAsIDB4MjA0OCwgMHgwYzM4LCAweDYwMTQsIDB4MjA0OCwgMHhhODY3LCAweDAxMDMsCisJMHgwMDEwLCAweDA4MGMsIDB4YjkwNSwgMHgwODBjLCAweGFmNDMsIDB4MDBmZSwgMHgwMGVlLCAweDAwOWUsCisJMHgwMDZlLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwOTYsCisJMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwgMHgxODAwLCAweDkxODYsIDB4MDAxNSwgMHgxMWI4LCAweDcwOTAsCisJMHg5MDg2LCAweDAwMDQsIDB4MTE5OCwgMHg2MDE0LCAweDIwNDgsIDB4MmM3OCwgMHgwODBjLCAweDk5ZjksCisJMHgwMWE4LCAweDcwN2MsIDB4YWE3NCwgMHg5MjA2LCAweDExMzAsIDB4NzA4MCwgMHhhYTc4LCAweDkyMDYsCisJMHgxMTEwLCAweDA4MGMsIDB4MzIxZSwgMHgwODBjLCAweGIzNDgsIDB4MDAyMCwgMHgwODBjLCAweGI5MDUsCisJMHgwODBjLCAweGFmNDMsIDB4MDBmZSwgMHgwMGVlLCAweDAwOWUsIDB4MDAwNSwgMHg3MDYwLCAweGFhNzgsCisJMHg5MjA2LCAweDBkNzgsIDB4MGM4MCwgMHgwMDk2LCAweDAwZTYsIDB4MDBmNiwgMHgyMDcxLCAweDE4MDAsCisJMHg5MTg2LCAweDAwMTUsIDB4MTU1MCwgMHg3MDkwLCAweDkwODYsIDB4MDAwNCwgMHgxNTMwLCAweDYwMTQsCisJMHgyMDQ4LCAweDJjNzgsIDB4MDgwYywgMHg5OWY5LCAweDA1ZjAsIDB4NzA3YywgMHhhYWNjLCAweDkyMDYsCisJMHgxMTgwLCAweDcwODAsIDB4YWFkMCwgMHg5MjA2LCAweDExNjAsIDB4MDgwYywgMHgzMjFlLCAweDAwMTYsCisJMHhhOTk4LCAweGFhYjAsIDB4OTI4NCwgMHgxMDAwLCAweGMwZmQsIDB4MDgwYywgMHg1NzBjLCAweDAwMWUsCisJMHgwMDEwLCAweDA4MGMsIDB4NTRmNywgMHgwODBjLCAweGNjODYsIDB4MDUwOCwgMHhhODdiLCAweDAwMDAsCisJMHhhODgzLCAweDAwMDAsIDB4YTg5NywgMHg0MDAwLCAweDAwODAsIDB4MDgwYywgMHhjYzg2LCAweDAxYjgsCisJMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHg1NGY3LCAweDFkNzAsIDB4YTg3YiwgMHgwMDMwLCAweGE4ODMsCisJMHgwMDAwLCAweGE4OTcsIDB4NDAwNSwgMHhhODliLCAweDAwMDQsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHhhODY3LCAweDAxMzksIDB4MDgwYywgMHg2ZDE3LCAweDAxMmUsIDB4MDgwYywgMHhhZjQzLCAweDAwZmUsCisJMHgwMGVlLCAweDAwOWUsIDB4MDAwNSwgMHg3MDYwLCAweGFhZDAsIDB4OTIwNiwgMHgwOTMwLCAweDA4ODgsCisJMHgwMDE2LCAweDAwMjYsIDB4YTg3YywgMHhkMGFjLCAweDAxNzgsIDB4YTkzOCwgMHhhYTM0LCAweDIxMDAsCisJMHg5MjA1LCAweDAxNTAsIDB4YTg5MCwgMHg5MTA2LCAweDExMTgsIDB4YTg4YywgMHg5MjA2LCAweDAxMjAsCisJMHhhOTkyLCAweGFhOGUsIDB4OTA4NSwgMHgwMDAxLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwYjYsCisJMHgwMGQ2LCAweDAwMzYsIDB4MDgwYywgMHhjYzg2LCAweDA5MDQsIDB4ZDJiZCwgMHgwMDk2LCAweDYzMTQsCisJMHgyMzQ4LCAweGE4N2EsIDB4YTk4MiwgMHg5MjllLCAweDQwMDAsIDB4MTU4MCwgMHg2MzEwLCAweDAwYzYsCisJMHgyMzU4LCAweDIwMDksIDB4MDAwMCwgMHhhODY4LCAweGQwZjQsIDB4MTE0MCwgMHgwODBjLCAweDY4YjksCisJMHgxMTA4LCAweGMxODUsIDB4YjgwMCwgMHhkMGJjLCAweDAxMDgsIDB4YzE4ZCwgMHhhYTk2LCAweGE5OWEsCisJMHgyMGE5LCAweDAwMDQsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDMxLCAweDIwYTAsCisJMHhiOGM0LCAweDIwZTAsIDB4YjhjOCwgMHg5MDgwLCAweDAwMDYsIDB4MjA5OCwgMHgwODBjLCAweDBmN2MsCisJMHgyMGE5LCAweDAwMDQsIDB4YTg1YywgMHg5MDgwLCAweDAwMzUsIDB4MjBhMCwgMHhiOGM4LCAweDkwODAsCisJMHgwMDBhLCAweDIwOTgsIDB4MDgwYywgMHgwZjdjLCAweDAwY2UsIDB4MDA5MCwgMHhhYTk2LCAweDM5MTgsCisJMHg5Mzk4LCAweDAwMDcsIDB4MjMxYywgMHg2MDA0LCAweDkwODYsIDB4MDAxNiwgMHgwMTEwLCAweGE4OWIsCisJMHgwMDA0LCAweGFiYTIsIDB4NjMxMCwgMHgyMzU4LCAweGI4MDQsIDB4OTA4NCwgMHgwMGZmLCAweGE4OWUsCisJMHgwODBjLCAweDZkMGIsIDB4NjAxNywgMHgwMDAwLCAweDAwOWUsIDB4MDAzZSwgMHgwMGRlLCAweDAwYmUsCisJMHgwMDA1LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LCAweDAwYjYsIDB4MDA5NiwgMHgwMGY2LCAweDYyMTQsCisJMHgyMjQ4LCAweDYyMTAsIDB4MjI1OCwgMHgyMDc5LCAweDAyNjAsIDB4OTA5NiwgMHgwMDAwLCAweDExYTAsCisJMHhiODE0LCAweDkwODQsIDB4MDBmZiwgMHg5MDBlLCAweDA4MGMsIDB4Mjg3YywgMHgyMTE4LCAweDgzMWYsCisJMHg5MzljLCAweGZmMDAsIDB4NzgzOCwgMHg5MDg0LCAweDAwZmYsIDB4OTMxZCwgMHg3YzNjLCAweDIwMTEsCisJMHg4MDE4LCAweDA4MGMsIDB4NGI3ZiwgMHgwMGE4LCAweDkwOTYsIDB4MDAwMSwgMHgxMTQ4LCAweDg5ZmYsCisJMHgwMTgwLCAweGE4OWIsIDB4MDAwZCwgMHg3ODM4LCAweGE4YTYsIDB4NzgzYywgMHhhOGFhLCAweDAwNDgsCisJMHg5MDk2LCAweDAwMDIsIDB4MTEzMCwgMHhhODliLCAweDAwMGQsIDB4NzgzOCwgMHhhOGE2LCAweDc4M2MsCisJMHhhOGFhLCAweDAwZmUsIDB4MDA5ZSwgMHgwMGJlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMDUsCisJMHgwMGM2LCAweDAwMjYsIDB4MDAxNiwgMHg5MTg2LCAweDAwMzUsIDB4MDExMCwgMHg2YTM4LCAweDAwMDgsCisJMHg2YTJjLCAweDA4MGMsIDB4Y2M3NCwgMHgwMWYwLCAweDIyNjAsIDB4NjEyMCwgMHg5MTg2LCAweDAwMDMsCisJMHgwMTE4LCAweDkxODYsIDB4MDAwNiwgMHgxMTkwLCAweDY4MzgsIDB4OTIwNiwgMHgwMTQwLCAweDY4M2MsCisJMHg5MjA2LCAweDExNjAsIDB4NjEwOCwgMHg2ODM4LCAweDkxMDYsIDB4MTE0MCwgMHgwMDIwLCAweDYwMDgsCisJMHg2OTNjLCAweDkxMDYsIDB4MTExOCwgMHg2MDEwLCAweDY5MTAsIDB4OTEwNiwgMHgwMDFlLCAweDAwMmUsCisJMHgwMGNlLCAweDAwMDUsIDB4OTA4NSwgMHgwMDAxLCAweDBjYzgsIDB4YTk3NCwgMHhkMWNjLCAweDAxODgsCisJMHg5MThjLCAweDAwZmYsIDB4OTE4ZSwgMHgwMDAyLCAweDExNjAsIDB4YTlhOCwgMHg5MThjLCAweDBmMDAsCisJMHg4MTBmLCAweDkxOGUsIDB4MDAwMSwgMHgxMTI4LCAweGE4MzQsIDB4YTkzOCwgMHg5MTE1LCAweDE5MGMsCisJMHhjMzNkLCAweDAwMDUsIDB4MDAzNiwgMHgyMDE5LCAweDAwMDEsIDB4MDAxMCwgMHgwMDM2LCAweDkwMWUsCisJMHgwNDk5LCAweDAxZTAsIDB4MDgwYywgMHhjYzg2LCAweDAxYzgsIDB4MDgwYywgMHhjZTcxLCAweDYwMzcsCisJMHg0MDAwLCAweDYwMTQsIDB4NjAxNywgMHgwMDAwLCAweDAwOTYsIDB4MjA0OCwgMHhhODdjLCAweDA4MGMsCisJMHhjZThlLCAweDExMTgsIDB4MDgwYywgMHhiOTA1LCAweDAwNDAsIDB4YTg2NywgMHgwMTAzLCAweGE4NzcsCisJMHgwMDAwLCAweDgzZmYsIDB4MTEyOSwgMHgwODBjLCAweDZkMTcsIDB4MDA5ZSwgMHgwMDNlLCAweDAwMDUsCisJMHhhODgwLCAweGQwYjQsIDB4MDEyOCwgMHhhODdiLCAweDAwMDYsIDB4YzBlYywgMHhhODgyLCAweDAwNDgsCisJMHhkMGJjLCAweDAxMTgsIDB4YTg3YiwgMHgwMDAyLCAweDAwMjAsIDB4YTg3YiwgMHgwMDA1LCAweDA4MGMsCisJMHhjZjgyLCAweGE4NzcsIDB4MDAwMCwgMHgwMDA1LCAweDIwMDEsIDB4MTgxMCwgMHgyMDA0LCAweGQwZWMsCisJMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHgxODEwLCAweDIwMDQsIDB4ZDBmNCwgMHgwMDBlLCAweDAwMDUsCisJMHgwMDA2LCAweDIwMDEsIDB4MTgxMCwgMHgyMDA0LCAweGQwZTQsIDB4MDAwZSwgMHgwMDA1LCAweDAwMzYsCisJMHgwMDQ2LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGJiYTAsIDB4MDBiZSwgMHgyMDIxLCAweDAwMDcsCisJMHgwODBjLCAweDRkMzYsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMDUsIDB4MGM1MSwgMHgxZDgxLCAweDAwMDUsCisJMHgyMDAxLCAweDE5ODUsIDB4MjAwNCwgMHg2MDFhLCAweDAwMDUsIDB4MjAwMSwgMHgxOTg3LCAweDIwMDQsCisJMHg2MDQyLCAweDAwMDUsIDB4MDgwYywgMHhhZjQzLCAweDA4MDQsIDB4OTc2MywgMHgwMGI2LCAweDAwNjYsCisJMHg2MDAwLCAweDkwYjIsIDB4MDAxNiwgMHgxYTBjLCAweDBkZDUsIDB4MDAxYiwgMHgwMDZlLCAweDAwYmUsCisJMHgwMDA1LCAweGQzYzksIDB4ZGFmOCwgMHhkYzU1LCAweGQzYzksIDB4ZDNjOSwgMHhkM2M5LCAweGQzYzksCisJMHhkM2M5LCAweGQ0MDAsIDB4ZGNkOSwgMHhkM2M5LCAweGQzYzksIDB4ZDNjOSwgMHhkM2M5LCAweGQzYzksCisJMHhkM2M5LCAweDA4MGMsIDB4MGRkNSwgMHgwMDY2LCAweDYwMDAsIDB4OTBiMiwgMHgwMDE2LCAweDFhMGMsCisJMHgwZGQ1LCAweDAwMTMsIDB4MDA2ZSwgMHgwMDA1LCAweGQzZTQsIDB4ZTI0YiwgMHhkM2U0LCAweGQzZTQsCisJMHhkM2U0LCAweGQzZTQsIDB4ZDNlNCwgMHhkM2U0LCAweGUxZjgsIDB4ZTI5ZiwgMHhkM2U0LCAweGU4YzQsCisJMHhlOGZhLCAweGU4YzQsIDB4ZThmYSwgMHhkM2U0LCAweDA4MGMsIDB4MGRkNSwgMHg2MDAwLCAweDkwODIsCisJMHgwMDE2LCAweDFhMGMsIDB4MGRkNSwgMHg2MDAwLCAweDAwMGEsIDB4MDAwNSwgMHhkM2ZlLCAweGRlYjcsCisJMHhkZmE5LCAweGRmY2MsIDB4ZTA4YywgMHhkM2ZlLCAweGUxNmIsIDB4ZTExNCwgMHhkY2U1LCAweGUxY2UsCisJMHhlMWUzLCAweGQzZmUsIDB4ZDNmZSwgMHhkM2ZlLCAweGQzZmUsIDB4ZDNmZSwgMHgwODBjLCAweDBkZDUsCisJMHg5MWIyLCAweDAwNTMsIDB4MWEwYywgMHgwZGQ1LCAweDIxMDAsIDB4OTFiMiwgMHgwMDQwLCAweDFhMDQsCisJMHhkODZjLCAweDAwMDIsIDB4ZDQ0YSwgMHhkNjNhLCAweGQ0NGEsIDB4ZDQ0YSwgMHhkNDRhLCAweGQ2NDMsCisJMHhkNDRhLCAweGQ0NGEsIDB4ZDQ0YSwgMHhkNDRhLCAweGQ0NGEsIDB4ZDQ0YSwgMHhkNDRhLCAweGQ0NGEsCisJMHhkNDRhLCAweGQ0NGEsIDB4ZDQ0YSwgMHhkNDRhLCAweGQ0NGEsIDB4ZDQ0YSwgMHhkNDRhLCAweGQ0NGEsCisJMHhkNDRhLCAweGQ0NGMsIDB4ZDRhZiwgMHhkNGJlLCAweGQ1MjIsIDB4ZDU0ZCwgMHhkNWM2LCAweGQ2MjUsCisJMHhkNDRhLCAweGQ0NGEsIDB4ZDY0NiwgMHhkNDRhLCAweGQ0NGEsIDB4ZDY1YiwgMHhkNjY4LCAweGQ0NGEsCisJMHhkNDRhLCAweGQ0NGEsIDB4ZDQ0YSwgMHhkNDRhLCAweGQ3MGUsIDB4ZDQ0YSwgMHhkNDRhLCAweGQ3MjIsCisJMHhkNDRhLCAweGQ0NGEsIDB4ZDZkZCwgMHhkNDRhLCAweGQ0NGEsIDB4ZDQ0YSwgMHhkNzNhLCAweGQ0NGEsCisJMHhkNDRhLCAweGQ0NGEsIDB4ZDdiNywgMHhkNDRhLCAweGQ0NGEsIDB4ZDQ0YSwgMHhkNDRhLCAweGQ0NGEsCisJMHhkNDRhLCAweGQ4MzQsIDB4MDgwYywgMHgwZGQ1LCAweDA4MGMsIDB4NjljYSwgMHgxMTUwLCAweDIwMDEsCisJMHgxODM3LCAweDIwMDQsIDB4ZDBjYywgMHgxMTI4LCAweDkwODQsIDB4MDAwOSwgMHg5MDg2LCAweDAwMDgsCisJMHgxMTQwLCAweDYwMDcsIDB4MDAwOSwgMHg2MDJmLCAweDAwMDksIDB4NjAxNywgMHgwMDAwLCAweDA4MDQsCisJMHhkNjMzLCAweDA4MGMsIDB4Njk2NiwgMHgwMGU2LCAweDAwYzYsIDB4MDAzNiwgMHgwMDI2LCAweDAwMTYsCisJMHg2MjEwLCAweDIyNTgsIDB4YmFhMCwgMHgwMDI2LCAweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweDkzNTYsCisJMHgwMDc2LCAweDkwM2UsIDB4MDgwYywgMHg5MjI5LCAweDJjMDgsIDB4MDgwYywgMHhlNDc3LCAweDAwN2UsCisJMHgwMDFlLCAweDAwMWUsIDB4MDAyZSwgMHgwMDNlLCAweDAwY2UsIDB4MDBlZSwgMHg2NjEwLCAweDI2NTgsCisJMHgwODBjLCAweDY2YTgsIDB4YmUwNCwgMHg5Njg0LCAweDAwZmYsIDB4OTA4MiwgMHgwMDA2LCAweDEyNjgsCisJMHgwMDE2LCAweDAwMjYsIDB4NjIxMCwgMHgwMGI2LCAweDIyNTgsIDB4YmFhMCwgMHgwMGJlLCAweDJjMDgsCisJMHgwODBjLCAweGViMjMsIDB4MDAyZSwgMHgwMDFlLCAweDExNzgsIDB4MDgwYywgMHhlM2E5LCAweDE5MDQsCisJMHhkNTFhLCAweDA4MGMsIDB4ZTM0NSwgMHgxMTIwLCAweDYwMDcsIDB4MDAwOCwgMHgwODA0LCAweGQ2MzMsCisJMHg2MDA3LCAweDAwMDksIDB4MDgwNCwgMHhkNjMzLCAweDA4MGMsIDB4ZTVjZCwgMHgwMTI4LCAweDA4MGMsCisJMHhlM2E5LCAweDBkNzgsIDB4MDgwNCwgMHhkNTFhLCAweDYwMTcsIDB4MTkwMCwgMHgwYzg4LCAweDA4MGMsCisJMHgzMzQyLCAweDE5MDQsIDB4ZDg2OSwgMHg2MTA2LCAweDA4MGMsIDB4ZTJmYSwgMHg2MDA3LCAweDAwMDYsCisJMHgwODA0LCAweGQ2MzMsIDB4NjAwNywgMHgwMDA3LCAweDA4MDQsIDB4ZDYzMywgMHgwODBjLCAweGU5MzYsCisJMHgxOTA0LCAweGQ4NjksIDB4MDgwYywgMHgzMzQyLCAweDE5MDQsIDB4ZDg2OSwgMHgwMGQ2LCAweDY2MTAsCisJMHgyNjU4LCAweGJlMDQsIDB4OTY4NCwgMHgwMGZmLCAweDkwODIsIDB4MDAwNiwgMHgxMjIwLCAweDIwMDEsCisJMHgwMDAxLCAweDA4MGMsIDB4NjVkNSwgMHg5NmI0LCAweGZmMDAsIDB4ODYzNywgMHg5Njg2LCAweDAwMDYsCisJMHgwMTg4LCAweDk2ODYsIDB4MDAwNCwgMHgwMTcwLCAweGJlMDQsIDB4OTZiNCwgMHgwMGZmLCAweDk2ODYsCisJMHgwMDA2LCAweDAxNDAsIDB4OTY4NiwgMHgwMDA0LCAweDAxMjgsIDB4OTY4NiwgMHgwMDA1LCAweDAxMTAsCisJMHgwMGRlLCAweDA0ODAsIDB4MDBlNiwgMHgyMDcxLCAweDAyNjAsIDB4NzAzNCwgMHg5MDg0LCAweDAwMDMsCisJMHgxMTQwLCAweDcwMzQsIDB4OTA4MiwgMHgwMDE0LCAweDAyMjAsIDB4NzAzMCwgMHg5MDg0LCAweDAwMDMsCisJMHgwMTMwLCAweDAwZWUsIDB4NjAxNywgMHgwMDAwLCAweDYwMmYsIDB4MDAwNywgMHgwMGIwLCAweDAwZWUsCisJMHgwODBjLCAweGU0MGQsIDB4MTE5MCwgMHg5Njg2LCAweDAwMDYsIDB4MTE0MCwgMHgwMDI2LCAweDYyMTAsCisJMHgyMjU4LCAweGJhYTAsIDB4OTAwZSwgMHgwODBjLCAweDMyNjcsIDB4MDAyZSwgMHgwODBjLCAweDY3MzQsCisJMHg2MDA3LCAweDAwMGEsIDB4MDBkZSwgMHgwODA0LCAweGQ2MzMsIDB4NjAwNywgMHgwMDBiLCAweDAwZGUsCisJMHgwODA0LCAweGQ2MzMsIDB4MDgwYywgMHgzMjFlLCAweDA4MGMsIDB4ZDM5ZCwgMHg2MDA3LCAweDAwMDEsCisJMHgwODA0LCAweGQ2MzMsIDB4MDgwYywgMHhlOTM2LCAweDE5MDQsIDB4ZDg2OSwgMHgwODBjLCAweDMzNDIsCisJMHgxOTA0LCAweGQ4NjksIDB4MjA3MSwgMHgwMjYwLCAweDcwMzQsIDB4OTBiNCwgMHgwMDAzLCAweDE5NDgsCisJMHg5MGIyLCAweDAwMTQsIDB4MGEzMCwgMHg3MDMwLCAweDkwODQsIDB4MDAwMywgMHgxOTEwLCAweDY2MTAsCisJMHgyNjU4LCAweGJlMDQsIDB4OTY4NiwgMHgwNzA3LCAweDA5ZTgsIDB4MDAyNiwgMHg2MjEwLCAweDIyNTgsCisJMHhiYWEwLCAweDkwMGUsIDB4MDgwYywgMHgzMjY3LCAweDAwMmUsIDB4NjAwNywgMHgwMDBjLCAweDIwMDEsCisJMHgwMDAxLCAweDA4MGMsIDB4ZWIwMywgMHgwODA0LCAweGQ2MzMsIDB4MDgwYywgMHg2OWNhLCAweDExNDAsCisJMHgyMDAxLCAweDE4MzcsIDB4MjAwNCwgMHg5MDg0LCAweDAwMDksIDB4OTA4NiwgMHgwMDA4LCAweDExMTAsCisJMHgwODA0LCAweGQ0NTksIDB4MDgwYywgMHg2OTY2LCAweDY2MTAsIDB4MjY1OCwgMHhiZTA0LCAweDk2ODQsCisJMHgwMGZmLCAweDkwODIsIDB4MDAwNiwgMHgwNmM4LCAweDExMzgsIDB4MDAyNiwgMHgyMDAxLCAweDAwMDYsCisJMHgwODBjLCAweDY2MTUsIDB4MDAyZSwgMHgwMDUwLCAweDk2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweDk2ODYsCisJMHgwMDA0LCAweDAxMjAsIDB4OTY4NiwgMHgwMDA2LCAweDE5MDQsIDB4ZDUxYSwgMHgwODBjLCAweGU0MWEsCisJMHgxMTIwLCAweDYwMDcsIDB4MDAwZSwgMHgwODA0LCAweGQ2MzMsIDB4MDA0NiwgMHg2NDEwLCAweDI0NTgsCisJMHhiY2EwLCAweDAwNDYsIDB4MDgwYywgMHgzMjFlLCAweDA4MGMsIDB4ZDM5ZCwgMHgwMDRlLCAweDAwMTYsCisJMHg5MDA2LCAweDIwMDksIDB4MTg0OCwgMHgyMTBjLCAweGQxYTQsIDB4MDE0OCwgMHgyMDA5LCAweDAwMjksCisJMHgwODBjLCAweGU3M2EsIDB4NjAxMCwgMHgyMDU4LCAweGI4MDAsIDB4YzBlNSwgMHhiODAyLCAweDAwMWUsCisJMHgwMDRlLCAweDYwMDcsIDB4MDAwMSwgMHgwODA0LCAweGQ2MzMsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsCisJMHg2NWQ1LCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MjBhOSwgMHgwMDA0LCAweDIwMTksCisJMHgxODA1LCAweDIwMTEsIDB4MDI3MCwgMHgwODBjLCAweGJlZmQsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMTVlLCAweDkwMDUsIDB4MDE2OCwgMHg5NmI0LCAweGZmMDAsIDB4ODYzNywgMHg5NjgyLCAweDAwMDQsCisJMHgwYTA0LCAweGQ1MWEsIDB4OTY4MiwgMHgwMDA3LCAweDBhMDQsIDB4ZDU3NiwgMHgwODA0LCAweGQ1MWEsCisJMHg2MDE3LCAweDE5MDAsIDB4NjAwNywgMHgwMDA5LCAweDA4MDQsIDB4ZDYzMywgMHgwODBjLCAweDY5Y2EsCisJMHgxMTQwLCAweDIwMDEsIDB4MTgzNywgMHgyMDA0LCAweDkwODQsIDB4MDAwOSwgMHg5MDg2LCAweDAwMDgsCisJMHgxMTEwLCAweDA4MDQsIDB4ZDQ1OSwgMHgwODBjLCAweDY5NjYsIDB4NjYxMCwgMHgyNjU4LCAweGJlMDQsCisJMHg5Njg0LCAweDAwZmYsIDB4MDAwNiwgMHg5MDg2LCAweDAwMDEsIDB4MDAwZSwgMHgwMTcwLCAweDkwODIsCisJMHgwMDA2LCAweDA2OTgsIDB4MDE1MCwgMHg5NmI0LCAweGZmMDAsIDB4ODYzNywgMHg5Njg2LCAweDAwMDQsCisJMHgwMTIwLCAweDk2ODYsIDB4MDAwNiwgMHgxOTA0LCAweGQ1MWEsIDB4MDgwYywgMHhlNDQ4LCAweDExMzAsCisJMHgwODBjLCAweGUzNDUsIDB4MTExOCwgMHg2MDA3LCAweDAwMTAsIDB4MDRlOCwgMHgwMDQ2LCAweDY0MTAsCisJMHgyNDU4LCAweGJjYTAsIDB4MDA0NiwgMHgwODBjLCAweDMyMWUsIDB4MDgwYywgMHhkMzlkLCAweDAwNGUsCisJMHgwMDE2LCAweDkwMDYsIDB4MjAwOSwgMHgxODQ4LCAweDIxMGMsIDB4ZDFhNCwgMHgwMTQ4LCAweDIwMDksCisJMHgwMDI5LCAweDA4MGMsIDB4ZTczYSwgMHg2MDEwLCAweDIwNTgsIDB4YjgwMCwgMHhjMGU1LCAweGI4MDIsCisJMHgwMDFlLCAweDAwNGUsIDB4NjAwNywgMHgwMDAxLCAweDAwZjAsIDB4MDgwYywgMHhlNWNkLCAweDAxNDAsCisJMHg5NmI0LCAweGZmMDAsIDB4ODYzNywgMHg5Njg2LCAweDAwMDYsIDB4MDk3OCwgMHgwODA0LCAweGQ1MWEsCisJMHg2MDE3LCAweDE5MDAsIDB4NjAwNywgMHgwMDA5LCAweDAwNzAsIDB4MDgwYywgMHgzMzQyLCAweDE5MDQsCisJMHhkODY5LCAweDA4MGMsIDB4ZTkzNiwgMHgxOTA0LCAweGQ4NjksIDB4MDgwYywgMHhkYTM2LCAweDE5MDQsCisJMHhkNTFhLCAweDYwMDcsIDB4MDAxMiwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg5MWY5LCAweDA4MGMsCisJMHg5NzYzLCAweDAwMDUsIDB4NjAwNywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxZjksCisJMHgwODBjLCAweDk3NjMsIDB4MGNiMCwgMHg2MDA3LCAweDAwMDUsIDB4MGM2OCwgMHgwODBjLCAweGU5MzYsCisJMHgxOTA0LCAweGQ4NjksIDB4MDgwYywgMHgzMzQyLCAweDE5MDQsIDB4ZDg2OSwgMHgwODBjLCAweGRhMzYsCisJMHgxOTA0LCAweGQ1MWEsIDB4NjAwNywgMHgwMDIwLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxZjksCisJMHgwODBjLCAweDk3NjMsIDB4MDAwNSwgMHgwODBjLCAweDMzNDIsIDB4MTkwNCwgMHhkODY5LCAweDYwMDcsCisJMHgwMDIzLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxZjksIDB4MDgwYywgMHg5NzYzLCAweDAwMDUsCisJMHgwODBjLCAweGU5MzYsIDB4MTkwNCwgMHhkODY5LCAweDA4MGMsIDB4MzM0MiwgMHgxOTA0LCAweGQ4NjksCisJMHgwODBjLCAweGRhMzYsIDB4MTkwNCwgMHhkNTFhLCAweDAwMTYsIDB4MDAyNiwgMHgwMGU2LCAweDIwNzEsCisJMHgwMjYwLCAweDJjMDgsIDB4MjAxMSwgMHgxODIwLCAweDIyMTQsIDB4NzAzYywgMHg5MjA2LCAweDExZTAsCisJMHgyMDExLCAweDE4MWYsIDB4MjIxNCwgMHg3MDM4LCAweDkwODQsIDB4MDBmZiwgMHg5MjA2LCAweDExYTAsCisJMHg3MjQwLCAweDA4MGMsIDB4Y2M3NCwgMHgwNTcwLCAweDIyNjAsIDB4NjAwOCwgMHg5MDg2LCAweGZmZmYsCisJMHgwMTIwLCAweDcyNDQsIDB4NjAwOCwgMHg5MjA2LCAweDE1MjgsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDcsCisJMHgxNTA4LCAweDA4MGMsIDB4YWY0MywgMHgwNGEwLCAweDcyNDQsIDB4OTI4NiwgMHhmZmZmLCAweDAxODAsCisJMHgyYzA4LCAweDA4MGMsIDB4Y2M3NCwgMHgwMWIwLCAweDIyNjAsIDB4NzI0MCwgMHg2MDA4LCAweDkyMDYsCisJMHgxMTg4LCAweDYwMTAsIDB4OTE5MCwgMHgwMDA0LCAweDIyMTQsIDB4OTIwNiwgMHgwMWI4LCAweDAwNTAsCisJMHg3MjQwLCAweDJjMDgsIDB4OTAwNiwgMHgwODBjLCAweGU3MDQsIDB4MTE4MCwgMHg3MjQ0LCAweDkyODYsCisJMHhmZmZmLCAweDAxYjAsIDB4MjE2MCwgMHg2MDA3LCAweDAwMjYsIDB4NjAxNywgMHgxNzAwLCAweDcyMTQsCisJMHg5Mjk2LCAweGZmZmYsIDB4MTE4MCwgMHg2MDA3LCAweDAwMjUsIDB4MDA2OCwgMHg2MDIwLCAweDkwODYsCisJMHgwMDA3LCAweDFkODAsIDB4NjAwNCwgMHg5MDg2LCAweDAwMjQsIDB4MTExMCwgMHgwODBjLCAweGFmNDMsCisJMHgyMTYwLCAweDYwMDcsIDB4MDAyNSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg5MWY5LCAweDA4MGMsCisJMHg5NzYzLCAweDAwZWUsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsCisJMHg2NWQ1LCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MjBhOSwgMHgwMDA0LCAweDIwMTksCisJMHgxODA1LCAweDIwMTEsIDB4MDI3NiwgMHgwODBjLCAweGJlZmQsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMTVlLCAweDAxMjAsIDB4NjAwNywgMHgwMDMxLCAweDA4MDQsIDB4ZDYzMywgMHgwODBjLCAweGJiNzEsCisJMHgwODBjLCAweDc0M2UsIDB4MTE5MCwgMHgwMDA2LCAweDAwMjYsIDB4MDAzNiwgMHgwODBjLCAweDc0NTgsCisJMHgxMTM4LCAweDA4MGMsIDB4NzcyNCwgMHgwODBjLCAweDYwYWQsIDB4MDgwYywgMHg3MzZhLCAweDAwMTAsCisJMHgwODBjLCAweDc0MTYsIDB4MDAzZSwgMHgwMDJlLCAweDAwMGUsIDB4MDAwNSwgMHgwODBjLCAweDMzNDIsCisJMHgxOTA0LCAweGQ4NjksIDB4MDgwYywgMHhkYTM2LCAweDE5MDQsIDB4ZDUxYSwgMHg2MTA2LCAweDA4MGMsCisJMHhkYTUyLCAweDExMjAsIDB4NjAwNywgMHgwMDJiLCAweDA4MDQsIDB4ZDYzMywgMHg2MDA3LCAweDAwMmMsCisJMHgwODA0LCAweGQ2MzMsIDB4MDgwYywgMHhlOTM2LCAweDE5MDQsIDB4ZDg2OSwgMHgwODBjLCAweDMzNDIsCisJMHgxOTA0LCAweGQ4NjksIDB4MDgwYywgMHhkYTM2LCAweDE5MDQsIDB4ZDUxYSwgMHg2MTA2LCAweDA4MGMsCisJMHhkYTU3LCAweDExMjAsIDB4NjAwNywgMHgwMDJlLCAweDA4MDQsIDB4ZDYzMywgMHg2MDA3LCAweDAwMmYsCisJMHgwODA0LCAweGQ2MzMsIDB4MDgwYywgMHgzMzQyLCAweDE5MDQsIDB4ZDg2OSwgMHgwMGU2LCAweDAwZDYsCisJMHgwMGM2LCAweDYwMTAsIDB4MjA1OCwgMHhiOTA0LCAweDkxODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDYsCisJMHgwMTU4LCAweDkxODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwODYsIDB4MDAwNiwgMHgwMTI4LCAweDAwY2UsCisJMHgwMGRlLCAweDAwZWUsIDB4MDgwNCwgMHhkNjNhLCAweDA4MGMsIDB4NTc2MSwgMHhkMGU0LCAweDA5MDQsCisJMHhkN2I0LCAweDIwNzEsIDB4MDI2YywgMHg3MDEwLCAweDYwM2EsIDB4NzAxNCwgMHg2MDNlLCAweDcxMDgsCisJMHg3MjBjLCAweDA4MGMsIDB4NmEwOCwgMHgwMTQwLCAweDYwMTAsIDB4MjA1OCwgMHhiODEwLCAweDkxMDYsCisJMHgxMTE4LCAweGI4MTQsIDB4OTIwNiwgMHgwNTEwLCAweDA4MGMsIDB4NmEwNCwgMHgxNWI4LCAweDIwNjksCisJMHgxODAwLCAweDY4ODAsIDB4OTIwNiwgMHgxNTkwLCAweDY4N2MsIDB4OTEwNiwgMHgxNTc4LCAweDcyMTAsCisJMHgwODBjLCAweGNjNzQsIDB4MDU5MCwgMHgwODBjLCAweGQ5MjEsIDB4MDU3OCwgMHgwODBjLCAweGU3YjYsCisJMHgwNTYwLCAweDYyMmUsIDB4NjAwNywgMHgwMDM2LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxYjEsCisJMHgwODBjLCAweDk3NjMsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDAwNSwgMHg3MjE0LCAweDkyODYsCisJMHhmZmZmLCAweDAxNTAsIDB4MDgwYywgMHhjYzc0LCAweDAxYzAsIDB4OTI4MCwgMHgwMDAyLCAweDIwMDQsCisJMHg3MTEwLCAweDkxMDYsIDB4MTE5MCwgMHgwOGUwLCAweDcyMTAsIDB4MmMwOCwgMHg5MDg1LCAweDAwMDEsCisJMHgwODBjLCAweGU3MDQsIDB4MmMxMCwgMHgyMTYwLCAweDAxNDAsIDB4MDg5MCwgMHg2MDA3LCAweDAwMzcsCisJMHg2MDJmLCAweDAwMDksIDB4NjAxNywgMHgxNTAwLCAweDA4YjgsIDB4NjAwNywgMHgwMDM3LCAweDYwMmYsCisJMHgwMDAzLCAweDYwMTcsIDB4MTcwMCwgMHgwODgwLCAweDYwMDcsIDB4MDAxMiwgMHgwODY4LCAweDA4MGMsCisJMHgzMzQyLCAweDE5MDQsIDB4ZDg2OSwgMHg2MDEwLCAweDIwNTgsIDB4YjgwNCwgMHg5MDg0LCAweGZmMDAsCisJMHg4MDA3LCAweDkwODYsIDB4MDAwNiwgMHgxOTA0LCAweGQ2M2EsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsCisJMHgwODBjLCAweDU3NjEsIDB4ZDBlNCwgMHgwOTA0LCAweGQ4MmMsIDB4MjA2OSwgMHgxODAwLCAweDIwNzEsCisJMHgwMjZjLCAweDcwMDgsIDB4NjAzYSwgMHg3MjBjLCAweDYyM2UsIDB4OTI4NiwgMHhmZmZmLCAweDExNTAsCisJMHg3MjA4LCAweDAwYzYsIDB4MmMwOCwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywgMHhlNzA0LCAweDJjMTAsCisJMHgwMGNlLCAweDA1ZTgsIDB4MDgwYywgMHhjYzc0LCAweDA1ZDAsIDB4NzEwOCwgMHg5MjgwLCAweDAwMDIsCisJMHgyMDA0LCAweDkxMDYsIDB4MTVhMCwgMHgwMGM2LCAweDAwMjYsIDB4MjI2MCwgMHgwODBjLCAweGM4OTgsCisJMHgwMDJlLCAweDAwY2UsIDB4NzExOCwgMHg5MThjLCAweGZmMDAsIDB4ODEwZiwgMHg5MTg2LCAweDAwMDEsCisJMHgwMTc4LCAweDkxODYsIDB4MDAwNSwgMHgwMTE4LCAweDkxODYsIDB4MDAwNywgMHgxMTk4LCAweDkyODAsCisJMHgwMDA1LCAweDIwMDQsIDB4OTAwNSwgMHgwMTcwLCAweDA4MGMsIDB4ZDkyMSwgMHgwOTA0LCAweGQ3YWQsCisJMHgwMDU2LCAweDc1MTAsIDB4NzYxNCwgMHgwODBjLCAweGU3Y2YsIDB4MDA1ZSwgMHgwMGNlLCAweDAwZGUsCisJMHgwMGVlLCAweDAwMDUsIDB4NjAwNywgMHgwMDNiLCAweDYwMmYsIDB4MDAwOSwgMHg2MDE3LCAweDJhMDAsCisJMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg5MWIxLCAweDA4MGMsIDB4OTc2MywgMHgwYzc4LCAweDYwMDcsCisJMHgwMDNiLCAweDYwMmYsIDB4MDAwMywgMHg2MDE3LCAweDAzMDAsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsCisJMHg5MWIxLCAweDA4MGMsIDB4OTc2MywgMHgwYzEwLCAweDYwMDcsIDB4MDAzYiwgMHg2MDJmLCAweDAwMGIsCisJMHg2MDE3LCAweDAwMDAsIDB4MDgwNCwgMHhkNzg0LCAweDAwZTYsIDB4MDAyNiwgMHgwODBjLCAweDY5Y2EsCisJMHgwNTUwLCAweDA4MGMsIDB4Njk2NiwgMHgwODBjLCAweGU5YTgsIDB4MTUxOCwgMHgyMDcxLCAweDE4MDAsCisJMHg3MGRjLCAweDkwODUsIDB4MDAwMywgMHg3MGRlLCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDcyYjAsCisJMHg5Mjg0LCAweDAwZmYsIDB4NzA3ZSwgMHg3OGU2LCAweDkyODQsIDB4ZmYwMCwgMHg3MjgwLCAweDkyMDUsCisJMHg3MDgyLCAweDc4ZWEsIDB4MDBmZSwgMHg3MGU3LCAweDAwMDAsIDB4MDgwYywgMHg2YTA4LCAweDAxMjAsCisJMHgyMDExLCAweDE5ZmYsIDB4MjAxMywgMHgwN2QwLCAweGQwYWMsIDB4MTEyOCwgMHgwODBjLCAweDJmZjUsCisJMHgwMDEwLCAweDA4MGMsIDB4ZTlkYSwgMHgwMDJlLCAweDAwZWUsIDB4MDgwYywgMHhhZjQzLCAweDA4MDQsCisJMHhkNjM5LCAweDA4MGMsIDB4YWY0MywgMHgwMDA1LCAweDI2MDAsIDB4MDAwMiwgMHhkODgwLCAweGQ4YjEsCisJMHhkOGMyLCAweGQ4ODAsIDB4ZDg4MCwgMHhkODgyLCAweGQ4ZDMsIDB4ZDg4MCwgMHhkODgwLCAweGQ4ODAsCisJMHhkODlmLCAweGQ4ODAsIDB4ZDg4MCwgMHhkODgwLCAweGQ4ZGUsIDB4ZDhlYiwgMHhkOTFjLCAweGQ4ODAsCisJMHgwODBjLCAweDBkZDUsIDB4MDgwYywgMHhlOTM2LCAweDFkMjAsIDB4MDgwYywgMHgzMzQyLCAweDFkMDgsCisJMHgwODBjLCAweGRhMzYsIDB4MTE0OCwgMHg3MDM4LCAweDYwMTYsIDB4NjAwNywgMHgwMDQ1LCAweDYwMDMsCisJMHgwMDAxLCAweDA4MGMsIDB4OTFmOSwgMHgwMDA1LCAweDA4MGMsIDB4MzIxZSwgMHgwODBjLCAweGQzOWQsCisJMHg2MDA3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTFmOSwgMHgwMDA1LCAweDA4MGMsCisJMHhlOTM2LCAweDE5MzgsIDB4MDgwYywgMHgzMzQyLCAweDE5MjAsIDB4MDgwYywgMHhkYTM2LCAweDFkNjAsCisJMHg3MDNjLCAweDYwMTYsIDB4NjAwNywgMHgwMDRhLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxZjksCisJMHgwMDA1LCAweDA4MGMsIDB4MzM0MiwgMHgxOTA0LCAweGQ4NjksIDB4MjAwOSwgMHgwMDQxLCAweDA4MGMsCisJMHhlOWUzLCAweDYwMDcsIDB4MDA0NywgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg5MWY5LCAweDA4MGMsCisJMHg5NzYzLCAweDAwMDUsIDB4MDgwYywgMHgzMzQyLCAweDE5MDQsIDB4ZDg2OSwgMHgyMDA5LCAweDAwNDIsCisJMHgwODBjLCAweGU5ZTMsIDB4NjAwNywgMHgwMDQ3LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxZjksCisJMHgwODBjLCAweDk3NjMsIDB4MDAwNSwgMHgwODBjLCAweDMzNDIsIDB4MTkwNCwgMHhkODY5LCAweDIwMDksCisJMHgwMDQ2LCAweDA4MGMsIDB4ZTllMywgMHgwODBjLCAweGFmNDMsIDB4MDAwNSwgMHgwODBjLCAweGQ5M2UsCisJMHgwOTA0LCAweGQ4NjksIDB4NjAwNywgMHgwMDRlLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxZjksCisJMHgwODBjLCAweDk3NjMsIDB4MDAwNSwgMHg2MDA3LCAweDAwNGYsIDB4NjAxNywgMHgwMDAwLCAweDcxMzQsCisJMHg5MThjLCAweDAwZmYsIDB4ODFmZiwgMHgwNTA4LCAweDkxODYsIDB4MDAwMSwgMHgxMTYwLCAweDcxNDAsCisJMHgyMDAxLCAweDE5YmMsIDB4MjAwNCwgMHg5MTA2LCAweDExYjAsIDB4NzE0NCwgMHgyMDAxLCAweDE5YmQsCisJMHgyMDA0LCAweDkxMDYsIDB4MDE5MCwgMHg5MTg2LCAweDAwMDIsIDB4MTE2OCwgMHgyMDExLCAweDAyNzYsCisJMHgyMGE5LCAweDAwMDQsIDB4NjAxMCwgMHgwMDk2LCAweDIwNDgsIDB4MjAxOSwgMHgwMDBhLCAweDA4MGMsCisJMHhiZjExLCAweDAwOWUsIDB4MDExMCwgMHg2MDE3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsCisJMHg5MWY5LCAweDA4MGMsIDB4OTc2MywgMHgwMDA1LCAweDYwMDcsIDB4MDA1MCwgMHg3MDNjLCAweDYwMTYsCisJMHgwY2EwLCAweDAwMTYsIDB4MDBlNiwgMHgyMDcxLCAweDAyNjAsIDB4MDBiNiwgMHgwMGM2LCAweDIyNjAsCisJMHg2MDEwLCAweDIwNTgsIDB4YjhjYywgMHhkMDg0LCAweDAxNTAsIDB4NzEyOCwgMHg2MDQ0LCAweDkxMDYsCisJMHgxMTIwLCAweDcxMmMsIDB4NjA0OCwgMHg5MTA2LCAweDAxMTAsIDB4OTAwNiwgMHgwMDEwLCAweDkwODUsCisJMHgwMDAxLCAweDAwY2UsIDB4MDBiZSwgMHgwMGVlLCAweDAwMWUsIDB4MDAwNSwgMHgwMDE2LCAweDAwOTYsCisJMHgwMDg2LCAweDAwZTYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsCisJMHgxODAwLCAweDcwOTAsIDB4OTA4YSwgMHgwMGY5LCAweDE2ZTgsIDB4MjBlMSwgMHgwMDAwLCAweDIwMDEsCisJMHgxOTlmLCAweDIwMDMsIDB4MDAwMCwgMHgwODBjLCAweDEwMTgsIDB4MDVhMCwgMHgyOTAwLCAweDYwMTYsCisJMHg3MDkwLCAweDgwMDQsIDB4YTgxNiwgMHg5MDhhLCAweDAwMWUsIDB4MDJkMCwgMHhhODMzLCAweDAwMWUsCisJMHgyMGE5LCAweDAwMWUsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDFiLCAweDIwYTAsCisJMHgyMDAxLCAweDE5OWYsIDB4MDAxNiwgMHgyMDBjLCAweDA0NzEsIDB4MDAxZSwgMHgyOTQwLCAweDA4MGMsCisJMHgxMDE4LCAweDAxYzAsIDB4MjkwMCwgMHhhMDA2LCAweDIxMDAsIDB4ODFmZiwgMHgwMTgwLCAweDBjMTgsCisJMHhhODMyLCAweDIwYTgsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDFiLCAweDIwYTAsCisJMHgyMDAxLCAweDE5OWYsIDB4MDAxNiwgMHgyMDBjLCAweDAwYjEsIDB4MDAxZSwgMHgwMDAwLCAweDkwODUsCisJMHgwMDAxLCAweDAwNDgsIDB4MjA3MSwgMHgxODAwLCAweDcwOTMsIDB4MDAwMCwgMHg2MDE0LCAweDIwNDgsCisJMHgwODBjLCAweDBmYjEsIDB4OTAwNiwgMHgwMTJlLCAweDAxZGUsIDB4MDFjZSwgMHgwMGVlLCAweDAwOGUsCisJMHgwMDllLCAweDAwMWUsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYzYsCisJMHg5MThjLCAweGZmZmYsIDB4MTFhOCwgMHgwODBjLCAweDIzZTksIDB4MjA5OSwgMHgwMjZjLCAweDIwMDEsCisJMHgwMDE0LCAweDM1MTgsIDB4OTMxMiwgMHgxMjE4LCAweDIzYTgsIDB4NDAwMywgMHgwMGY4LCAweDIwYTgsCisJMHg0MDAzLCAweDIyYTgsIDB4ODEwOCwgMHgwODBjLCAweDIzZTksIDB4MjA5OSwgMHgwMjYwLCAweDBjYTgsCisJMHgwODBjLCAweDIzZTksIDB4MjA2MSwgMHgxOTlmLCAweDYwMDQsIDB4MjA5OCwgMHg2MDA4LCAweDM1MTgsCisJMHg5MzEyLCAweDEyMTgsIDB4MjNhOCwgMHg0MDAzLCAweDAwNDgsIDB4MjBhOCwgMHg0MDAzLCAweDIyYTgsCisJMHg4MTA4LCAweDA4MGMsIDB4MjNlOSwgMHgyMDk5LCAweDAyNjAsIDB4MGNhOCwgMHgyMDYxLCAweDE5OWYsCisJMHgyMDE5LCAweDAyODAsIDB4MzMwMCwgMHg5MzFlLCAweDAxMTAsIDB4NjAwNiwgMHgwMDIwLCAweDIwMDEsCisJMHgwMjYwLCAweDYwMDYsIDB4ODEwOCwgMHgyMTYyLCAweDkyOTIsIDB4MDAyMSwgMHg5Mjk2LCAweGZmZmYsCisJMHg2MjBhLCAweDAwY2UsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsCisJMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMGM2LCAweDgxZmYsIDB4MTFiOCwgMHgwODBjLCAweDI0MDEsCisJMHgyMGExLCAweDAyNGMsIDB4MjAwMSwgMHgwMDE0LCAweDM1MTgsIDB4OTMxMiwgMHgxMjE4LCAweDIzYTgsCisJMHg0MDAzLCAweDA0MTgsIDB4MjBhOCwgMHg0MDAzLCAweDgyZmYsIDB4MDFmOCwgMHgyMmE4LCAweDgxMDgsCisJMHgwODBjLCAweDI0MDEsIDB4MjBhMSwgMHgwMjQwLCAweDBjOTgsIDB4MDgwYywgMHgyNDAxLCAweDIwNjEsCisJMHgxOWEyLCAweDYwMDQsIDB4MjBhMCwgMHg2MDA4LCAweDM1MTgsIDB4OTMxMiwgMHgxMjE4LCAweDIzYTgsCisJMHg0MDAzLCAweDAwNTgsIDB4MjBhOCwgMHg0MDAzLCAweDgyZmYsIDB4MDEzOCwgMHgyMmE4LCAweDgxMDgsCisJMHgwODBjLCAweDI0MDEsIDB4MjBhMSwgMHgwMjQwLCAweDBjOTgsIDB4MjA2MSwgMHgxOWEyLCAweDIwMTksCisJMHgwMjYwLCAweDM0MDAsIDB4OTMxZSwgMHgwMTEwLCAweDYwMDYsIDB4MDAyMCwgMHgyMDAxLCAweDAyNDAsCisJMHg2MDA2LCAweDgxMDgsIDB4MjE2MiwgMHg5MjkyLCAweDAwMjEsIDB4OTI5NiwgMHhmZmZmLCAweDYyMGEsCisJMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGI2LCAweDAwNjYsCisJMHg2NjEwLCAweDI2NTgsIDB4YmUwNCwgMHg5NmI0LCAweGZmMDAsIDB4ODYzNywgMHg5Njg2LCAweDAwMDYsCisJMHgwMTcwLCAweDk2ODYsIDB4MDAwNCwgMHgwMTU4LCAweGJlMDQsIDB4OTZiNCwgMHgwMGZmLCAweDk2ODYsCisJMHgwMDA2LCAweDAxMjgsIDB4OTY4NiwgMHgwMDA0LCAweDAxMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwNmUsCisJMHgwMGJlLCAweDAwMDUsIDB4MDBkNiwgMHgwODBjLCAweGRhY2UsIDB4MDBkZSwgMHgwMDA1LCAweDAwZDYsCisJMHgwODBjLCAweGRhZGIsIDB4MTUyMCwgMHg2ODBjLCAweDkwOGMsIDB4ZmYwMCwgMHg2ODIwLCAweDkwODQsCisJMHgwMGZmLCAweDkxMTUsIDB4NjIxNiwgMHg2ODI0LCAweDYwMmUsIDB4ZDFlNCwgMHgwMTMwLCAweDkwMDYsCisJMHgwODBjLCAweGViMDMsIDB4MjAwOSwgMHgwMDAxLCAweDAwNzgsIDB4ZDFlYywgMHgwMTgwLCAweDY5MjAsCisJMHg5MThjLCAweDAwZmYsIDB4NjgyNCwgMHgwODBjLCAweDI4N2MsIDB4MTE0OCwgMHgyMDAxLCAweDAwMDEsCisJMHgwODBjLCAweGViMDMsIDB4MjExMCwgMHg5MDBlLCAweDA4MGMsIDB4MzI2NywgMHgwMDE4LCAweDkwODUsCisJMHgwMDAxLCAweDAwMDgsIDB4OTAwNiwgMHgwMGRlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGM2LCAweDA4MGMsCisJMHhhZjkxLCAweDA1YTgsIDB4MDAxNiwgMHgwMDI2LCAweDAwYzYsIDB4MjAxMSwgMHgwMjYzLCAweDIyMDQsCisJMHg4MjExLCAweDIyMGMsIDB4MDgwYywgMHgyODdjLCAweDE1NzgsIDB4MDgwYywgMHg2NjM4LCAweDE1NjAsCisJMHhiZTEyLCAweGJkMTYsIDB4MDBjZSwgMHgwMDJlLCAweDAwMWUsIDB4MmIwMCwgMHg2MDEyLCAweDA4MGMsCisJMHhlOTM2LCAweDExZDgsIDB4MDgwYywgMHgzMzQyLCAweDExYzAsIDB4MDgwYywgMHhkYTM2LCAweDA1MTAsCisJMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg2NWU5LCAweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDY2MTUsCisJMHg2MDE3LCAweDAwMDAsIDB4NjAyMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsCisJMHgwODBjLCAweDkxZjksIDB4MDgwYywgMHg5NzYzLCAweDAwMTAsIDB4MDgwYywgMHhhZjQzLCAweDkwODUsCisJMHgwMDAxLCAweDAwY2UsIDB4MDBiZSwgMHgwMDA1LCAweDA4MGMsIDB4YWY0MywgMHgwMGNlLCAweDAwMmUsCisJMHgwMDFlLCAweDBjYTgsIDB4MDgwYywgMHhhZjQzLCAweDkwMDYsIDB4MGM5OCwgMHgyMDY5LCAweDAyNmQsCisJMHg2ODAwLCAweDkwODIsIDB4MDAxMCwgMHgxMjI4LCAweDYwMTcsIDB4MDAwMCwgMHg5MDg1LCAweDAwMDEsCisJMHgwMDA4LCAweDkwMDYsIDB4MDAwNSwgMHg2MDE3LCAweDAwMDAsIDB4MjA2OSwgMHgwMjZjLCAweDY4MDgsCisJMHg5MDg0LCAweGZmMDAsIDB4OTA4NiwgMHgwODAwLCAweDExOTAsIDB4NjkwNCwgMHg5MTg2LCAweDAwMTgsCisJMHgwMTE4LCAweDkxODYsIDB4MDAxNCwgMHgxMTU4LCAweDgxMGYsIDB4NjgwMCwgMHg5MDg0LCAweDAwZmYsCisJMHg5MTBkLCAweDYxNWEsIDB4OTA4ZSwgMHgwMDE0LCAweDAxMTAsIDB4OTA4ZSwgMHgwMDEwLCAweDAwMDUsCisJMHg2MDA0LCAweDkwYjIsIDB4MDA1MywgMHgxYTBjLCAweDBkZDUsIDB4OTFiNiwgMHgwMDEzLCAweDExMzAsCisJMHgyMDA4LCAweDkxYjIsIDB4MDA0MCwgMHgxYTA0LCAweGRjMjUsIDB4MDA5MiwgMHg5MWI2LCAweDAwMjcsCisJMHgwMTIwLCAweDkxYjYsIDB4MDAxNCwgMHgxOTBjLCAweDBkZDUsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsCisJMHg2NjE1LCAweDA4MGMsIDB4OTY1NywgMHgwODBjLCAweGFmNzQsIDB4MDgwYywgMHg5NzYzLCAweDAwMDUsCisJMHhkYjU4LCAweGRiNWEsIDB4ZGI1OCwgMHhkYjU4LCAweGRiNTgsIDB4ZGI1YSwgMHhkYjY5LCAweGRjMWUsCisJMHhkYmJiLCAweGRjMWUsIDB4ZGJjZiwgMHhkYzFlLCAweGRiNjksIDB4ZGMxZSwgMHhkYzE2LCAweGRjMWUsCisJMHhkYzE2LCAweGRjMWUsIDB4ZGMxZSwgMHhkYjU4LCAweGRiNTgsIDB4ZGI1OCwgMHhkYjU4LCAweGRiNTgsCisJMHhkYjU4LCAweGRiNTgsIDB4ZGI1OCwgMHhkYjU4LCAweGRiNTgsIDB4ZGI1OCwgMHhkYjVhLCAweGRiNTgsCisJMHhkYzFlLCAweGRiNTgsIDB4ZGI1OCwgMHhkYzFlLCAweGRiNTgsIDB4ZGMxYiwgMHhkYzFlLCAweGRiNTgsCisJMHhkYjU4LCAweGRiNTgsIDB4ZGI1OCwgMHhkYzFlLCAweGRjMWUsIDB4ZGI1OCwgMHhkYzFlLCAweGRjMWUsCisJMHhkYjU4LCAweGRiNjQsIDB4ZGI1OCwgMHhkYjU4LCAweGRiNTgsIDB4ZGI1OCwgMHhkYzFhLCAweGRjMWUsCisJMHhkYjU4LCAweGRiNTgsIDB4ZGMxZSwgMHhkYzFlLCAweGRiNTgsIDB4ZGI1OCwgMHhkYjU4LCAweGRiNTgsCisJMHgwODBjLCAweDBkZDUsIDB4MDgwYywgMHg5NjU3LCAweDA4MGMsIDB4ZDNhMCwgMHg2MDAzLCAweDAwMDIsCisJMHgwODBjLCAweDk3NjMsIDB4MDgwNCwgMHhkYzI0LCAweDkwMDYsIDB4MDgwYywgMHg2NWQ1LCAweDA4MDQsCisJMHhkYzFlLCAweDA4MGMsIDB4NmEwNCwgMHgxOTA0LCAweGRjMWUsIDB4OTAwNiwgMHgwODBjLCAweDY1ZDUsCisJMHg2MDEwLCAweDIwNTgsIDB4YjgxMCwgMHg5MDg2LCAweDAwZmYsIDB4MTE0MCwgMHgwMGY2LCAweDIwNzksCisJMHgxODAwLCAweDc4YTgsIDB4ODAwMCwgMHg3OGFhLCAweDAwZmUsIDB4MDQyOCwgMHg2MDEwLCAweDIwNTgsCisJMHhiOGMwLCAweDkwMDUsIDB4MTE3OCwgMHgwODBjLCAweGQzODgsIDB4MTkwNCwgMHhkYzFlLCAweDAwMzYsCisJMHgwMDQ2LCAweGJiYTAsIDB4MjAyMSwgMHgwMDA3LCAweDA4MGMsIDB4NGQzNiwgMHgwMDRlLCAweDAwM2UsCisJMHgwODA0LCAweGRjMWUsIDB4MDgwYywgMHgzMzczLCAweDE5MDQsIDB4ZGMxZSwgMHgyMDAxLCAweDE4MDAsCisJMHgyMDA0LCAweDkwODYsIDB4MDAwMiwgMHgxMTM4LCAweDAwZjYsIDB4MjA3OSwgMHgxODAwLCAweDc4YTgsCisJMHg4MDAwLCAweDc4YWEsIDB4MDBmZSwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg2NWU5LCAweDA4MGMsCisJMHg5NjU3LCAweDYwMjMsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAyLCAweDA4MGMsCisJMHg5MWY5LCAweDA4MGMsIDB4OTc2MywgMHg2MTEwLCAweDIxNTgsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsCisJMHg4NWJlLCAweDA4MDQsIDB4ZGMyNCwgMHg2NjEwLCAweDI2NTgsIDB4YmUwNCwgMHg5NmI0LCAweGZmMDAsCisJMHg4NjM3LCAweDk2ODYsIDB4MDAwNiwgMHgwOTA0LCAweGRjMWUsIDB4OTY4NiwgMHgwMDA0LCAweDA5MDQsCisJMHhkYzFlLCAweDA4MGMsIDB4OGQ3MCwgMHgyMDAxLCAweDAwMDQsIDB4MDgwNCwgMHhkYzFjLCAweDIwMDEsCisJMHgxODAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDAzLCAweDExNTgsIDB4MDAzNiwgMHgwMDQ2LCAweDYwMTAsCisJMHgyMDU4LCAweGJiYTAsIDB4MjAyMSwgMHgwMDA2LCAweDA4MGMsIDB4NGQzNiwgMHgwMDRlLCAweDAwM2UsCisJMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHhkYzQyLCAweDY2MTAsIDB4MjY1OCwgMHhiZTA0LCAweDAwNjYsCisJMHg5NmI0LCAweGZmMDAsIDB4ODYzNywgMHg5Njg2LCAweDAwMDYsIDB4MDA2ZSwgMHgwMTY4LCAweDIwMDEsCisJMHgwMDA2LCAweDA4MGMsIDB4NjYxNSwgMHg5Mjg0LCAweDAwZmYsIDB4OTA4ZSwgMHgwMDA3LCAweDExMjAsCisJMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg2NWU5LCAweDA4MGMsIDB4NmEwNCwgMHgxMWY4LCAweDIwMDEsCisJMHgxODM3LCAweDIwMDQsIDB4ZDBhNCwgMHgwMWQwLCAweGJlMDQsIDB4OTZiNCwgMHgwMGZmLCAweDk2ODYsCisJMHgwMDA2LCAweDAxYTAsIDB4MDBmNiwgMHgyMDc5LCAweDE4MDAsIDB4NzhhOCwgMHg4MDAwLCAweDc4YWEsCisJMHgwMGZlLCAweDA4MDQsIDB4ZGJhMywgMHgyMDAxLCAweDAwMDQsIDB4MDAzMCwgMHgyMDAxLCAweDAwMDYsCisJMHgwNDQ5LCAweDAwMjAsIDB4MDAxOCwgMHgwMDEwLCAweDA4MGMsIDB4NjYxNSwgMHgwODBjLCAweDk2NTcsCisJMHgwODBjLCAweGFmNDMsIDB4MDgwYywgMHg5NzYzLCAweDAwMDUsIDB4MjYwMCwgMHgwMDAyLCAweGRjMzksCisJMHhkYzM5LCAweGRjMzksIDB4ZGMzOSwgMHhkYzM5LCAweGRjM2IsIDB4ZGMzOSwgMHhkYzNiLCAweGRjMzksCisJMHhkYzM5LCAweGRjM2IsIDB4ZGMzOSwgMHhkYzM5LCAweGRjMzksIDB4ZGMzYiwgMHhkYzNiLCAweGRjM2IsCisJMHhkYzNiLCAweDA4MGMsIDB4MGRkNSwgMHgwODBjLCAweDk2NTcsIDB4MDgwYywgMHhhZjQzLCAweDA4MGMsCisJMHg5NzYzLCAweDAwMDUsIDB4MDAxNiwgMHgwMGI2LCAweDAwZDYsIDB4NjExMCwgMHgyMTU4LCAweGI5MDAsCisJMHhkMTg0LCAweDAxMzgsIDB4MDgwYywgMHg2NWU5LCAweDkwMDYsIDB4MDgwYywgMHg2NWQ1LCAweDA4MGMsCisJMHgzMjQ3LCAweDAwZGUsIDB4MDBiZSwgMHgwMDFlLCAweDAwMDUsIDB4NjYxMCwgMHgyNjU4LCAweGI4MDQsCisJMHg5MDg0LCAweGZmMDAsIDB4ODAwNywgMHg5MGIyLCAweDAwMGMsIDB4MWEwYywgMHgwZGQ1LCAweDkxYjYsCisJMHgwMDE1LCAweDExMTAsIDB4MDAzYiwgMHgwMDI4LCAweDkxYjYsIDB4MDAxNiwgMHgxOTBjLCAweDBkZDUsCisJMHgwMDZiLCAweDAwMDUsIDB4YjllZSwgMHhiOWVlLCAweGI5ZWUsIDB4YjllZSwgMHhkY2Q3LCAweGI5ZWUsCisJMHhkY2MxLCAweGRjODIsIDB4YjllZSwgMHhiOWVlLCAweGI5ZWUsIDB4YjllZSwgMHhiOWVlLCAweGI5ZWUsCisJMHhiOWVlLCAweGI5ZWUsIDB4ZGNkNywgMHhiOWVlLCAweGRjYzEsIDB4ZGNjOCwgMHhiOWVlLCAweGI5ZWUsCisJMHhiOWVlLCAweGI5ZWUsIDB4MDBmNiwgMHgwODBjLCAweDZhMDQsIDB4MTFkOCwgMHgwODBjLCAweGQzODgsCisJMHgxMWMwLCAweDYwMTAsIDB4OTA1ZCwgMHgwMWE4LCAweGI4YzAsIDB4OTAwNSwgMHgwMTkwLCAweDkwMDYsCisJMHgwODBjLCAweDY1ZDUsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NjVlOSwgMHg2MDIzLCAweDAwMDEsCisJMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAyLCAweDA4MGMsIDB4OTFmOSwgMHgwODBjLCAweDk3NjMsCisJMHgwMGYwLCAweDIwMTEsIDB4MDI2MywgMHgyMjA0LCAweDgyMTEsIDB4MjIwYywgMHgwODBjLCAweDI4N2MsCisJMHgxMWIwLCAweDA4MGMsIDB4NjY5OSwgMHgwMTE4LCAweDA4MGMsIDB4YWY0MywgMHgwMDgwLCAweGI4MTAsCisJMHgwMDA2LCAweGI4MTQsIDB4MDAwNiwgMHhiOGMwLCAweDAwMDYsIDB4MDgwYywgMHg2MGM3LCAweDAwMGUsCisJMHhiOGMyLCAweDAwMGUsIDB4YjgxNiwgMHgwMDBlLCAweGI4MTIsIDB4MDgwYywgMHhhZjQzLCAweDAwZmUsCisJMHgwMDA1LCAweDY2MDQsIDB4OTZiNiwgMHgwMDFlLCAweDExMTAsIDB4MDgwYywgMHhhZjQzLCAweDAwMDUsCisJMHgwODBjLCAweGJkNzksIDB4MTE0OCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDA4MGMsCisJMHg5MWY5LCAweDA4MGMsIDB4OTc2MywgMHgwMDEwLCAweDA4MGMsIDB4YWY0MywgMHgwMDA1LCAweDA4MDQsCisJMHhhZjQzLCAweDYwMDQsIDB4OTA4YSwgMHgwMDUzLCAweDFhMGMsIDB4MGRkNSwgMHgwODBjLCAweDk2NTcsCisJMHgwODBjLCAweGFmNzQsIDB4MDgwYywgMHg5NzYzLCAweDAwMDUsIDB4OTE4MiwgMHgwMDQwLCAweDAwMDIsCisJMHhkY2ZjLCAweGRjZmMsIDB4ZGNmYywgMHhkY2ZjLCAweGRjZmUsIDB4ZGNmYywgMHhkY2ZjLCAweGRjZmMsCisJMHhkY2ZjLCAweGRjZmMsIDB4ZGNmYywgMHhkY2ZjLCAweGRjZmMsIDB4ZGNmYywgMHhkY2ZjLCAweGRjZmMsCisJMHhkY2ZjLCAweGRjZmMsIDB4ZGNmYywgMHhkY2ZjLCAweDA4MGMsIDB4MGRkNSwgMHgwMDk2LCAweDAwYjYsCisJMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgwMDQ2LCAweDAwMjYsIDB4NjIxMCwgMHgyMjU4LCAweGI4YmMsCisJMHg5MDA1LCAweDExYTgsIDB4NjEwNiwgMHgyMDcxLCAweDAyNjAsIDB4NzQ0NCwgMHg5NGE0LCAweGZmMDAsCisJMHgwOTA0LCAweGRkNjQsIDB4MDgwYywgMHhlYWY3LCAweDExNzAsIDB4OTQ4NiwgMHgyMDAwLCAweDExNTgsCisJMHgyMDA5LCAweDAwMDEsIDB4MjAxMSwgMHgwMjAwLCAweDA4MGMsIDB4ODc5YSwgMHgwMDIwLCAweDkwMjYsCisJMHgwODBjLCAweGU5N2IsIDB4MGMzOCwgMHgwODBjLCAweDBmZmYsIDB4MDkwYywgMHgwZGQ1LCAweDYwMDMsCisJMHgwMDA3LCAweGE4NjcsIDB4MDEwZCwgMHg5MDA2LCAweGE4MDIsIDB4YTg2YSwgMHhhYzhhLCAweDJjMDAsCisJMHhhODhlLCAweDYwMDgsIDB4YThlMiwgMHg2MDEwLCAweDIwNTgsIDB4YjhhMCwgMHg3MTMwLCAweGE5N2EsCisJMHgwMDE2LCAweGE4NzYsIDB4YTg3ZiwgMHgwMDAwLCAweGE4ODMsIDB4MDAwMCwgMHhhODg3LCAweDAwMzYsCisJMHgwODBjLCAweDZkMTcsIDB4MDAxZSwgMHgwODBjLCAweGVhZjcsIDB4MTkwNCwgMHhkZGM0LCAweDk0ODYsCisJMHgyMDAwLCAweDExMzAsIDB4MjAxOSwgMHgwMDE3LCAweDA4MGMsIDB4ZTZhZSwgMHgwODA0LCAweGRkYzQsCisJMHg5NDg2LCAweDAyMDAsIDB4MTEyMCwgMHgwODBjLCAweGU2NGEsIDB4MDgwNCwgMHhkZGM0LCAweDk0ODYsCisJMHgwNDAwLCAweDAxMjAsIDB4OTQ4NiwgMHgxMDAwLCAweDE5MDQsIDB4ZGRjNCwgMHgyMDE5LCAweDAwMDIsCisJMHgwODBjLCAweGU2NjUsIDB4MDgwNCwgMHhkZGM0LCAweDIwNjksIDB4MWE3MCwgMHg2YTAwLCAweGQyODQsCisJMHgwOTA0LCAweGRlMmUsIDB4OTI4NCwgMHgwMzAwLCAweDE5MDQsIDB4ZGUyNywgMHg2ODA0LCAweDkwMDUsCisJMHgwOTA0LCAweGRlMGYsIDB4MmQ3OCwgMHg2MDAzLCAweDAwMDcsIDB4MDgwYywgMHgxMDE4LCAweDA5MDQsCisJMHhkZGQwLCAweDc4MDAsIDB4ZDA4YywgMHgxMTE4LCAweDc4MDQsIDB4ODAwMSwgMHg3ODA2LCAweDYwMTcsCisJMHgwMDAwLCAweDIwMDEsIDB4MTgwZiwgMHgyMDA0LCAweGQwODQsIDB4MTkwNCwgMHhkZTMyLCAweDkwMDYsCisJMHhhODAyLCAweGE4NjcsIDB4MDExNiwgMHhhODZhLCAweDYwMDgsIDB4YThlMiwgMHgyYzAwLCAweGE4N2EsCisJMHg2MDEwLCAweDIwNTgsIDB4YjhhMCwgMHg3MTMwLCAweGE5YjYsIDB4YTg3NiwgMHhiOTI4LCAweGE5YmEsCisJMHhiOTJjLCAweGE5YmUsIDB4YjkzMCwgMHhhOWMyLCAweGI5MzQsIDB4YTljNiwgMHhhODgzLCAweDAwM2QsCisJMHg3MDQ0LCAweDkwODQsIDB4MDAwMywgMHg5MDgwLCAweGRkY2MsIDB4MjAwNSwgMHhhODdlLCAweDIwYTksCisJMHgwMDBhLCAweDIwMDEsIDB4MDI3MCwgMHhhYTVjLCAweDkyOTAsIDB4MDAyMSwgMHgyMDA5LCAweDAyMDUsCisJMHgyMDBiLCAweDAwODAsIDB4MjBlMSwgMHgwMDAwLCAweGFiNjAsIDB4MjNlOCwgMHgyMDk4LCAweDIyYTAsCisJMHg0MDAzLCAweDIwMGIsIDB4MDAwMCwgMHgyMDAxLCAweDAyN2EsIDB4MjAwYywgMHhhOWIyLCAweDgwMDAsCisJMHgyMDBjLCAweGE5YWUsIDB4MDgwYywgMHg2ZDE3LCAweDAwMmUsIDB4MDA0ZSwgMHgwMGZlLCAweDAwZWUsCisJMHgwMGRlLCAweDAwYmUsIDB4MDA5ZSwgMHgwMDA1LCAweDAwMDAsIDB4MDA4MCwgMHgwMDQwLCAweDAwMDAsCisJMHgyMDAxLCAweDE4MTAsIDB4MjAwNCwgMHhkMDg0LCAweDAxMjAsIDB4MDgwYywgMHgwZmZmLCAweDE5MDQsCisJMHhkZDc5LCAweDYwMTcsIDB4ZjEwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDQxLCAweDA4MGMsCisJMHg5MWIxLCAweDA4MGMsIDB4OTc2MywgMHgwYzAwLCAweDIwNjksIDB4MDI2MCwgMHg2ODQ4LCAweDkwODQsCisJMHhmZjAwLCAweDkwODYsIDB4MTIwMCwgMHgxMTk4LCAweDY4NmMsIDB4OTA4NCwgMHgwMGZmLCAweDAwMTYsCisJMHg2MTE0LCAweDkxOGMsIDB4ZjcwMCwgMHg5MTBkLCAweDYxMTYsIDB4MDAxZSwgMHg2MDAzLCAweDAwMDEsCisJMHg2MDA3LCAweDAwNDMsIDB4MDgwYywgMHg5MWIxLCAweDA4MGMsIDB4OTc2MywgMHgwODI4LCAweDY4NjgsCisJMHg2MDJlLCAweDY4NmMsIDB4NjAzMiwgMHg2MDE3LCAweGYyMDAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDQxLCAweDA4MGMsIDB4OTFiMSwgMHgwODBjLCAweDk3NjMsIDB4MDgwNCwgMHhkZGM0LCAweDIwMDEsCisJMHgxODBlLCAweDIwMDQsIDB4ZDBlYywgMHgwMTIwLCAweDIwMTEsIDB4ODA0OSwgMHgwODBjLCAweDRiN2YsCisJMHg2MDE3LCAweGYzMDAsIDB4MDAxMCwgMHg2MDE3LCAweGYxMDAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDQxLCAweDA4MGMsIDB4OTFiMSwgMHgwODBjLCAweDk3NjMsIDB4MDgwNCwgMHhkZGM0LCAweDYwMTcsCisJMHhmNTAwLCAweDBjOTgsIDB4NjAxNywgMHhmNjAwLCAweDA4MDQsIDB4ZGRlNCwgMHg2MDE3LCAweGYyMDAsCisJMHgwODA0LCAweGRkZTQsIDB4YTg2NywgMHgwMTQ2LCAweGE4NmIsIDB4MDAwMCwgMHg2MDA4LCAweGE4ODYsCisJMHgyYzAwLCAweGE4N2EsIDB4NzA0NCwgMHg5MDg0LCAweDAwMDMsIDB4OTA4MCwgMHhkZGNjLCAweDIwMDUsCisJMHhhODdlLCAweDI5MjgsIDB4NjAxMCwgMHgyMDU4LCAweGI4YTAsIDB4YTg3NiwgMHhiODI4LCAweGE4OGEsCisJMHhiODJjLCAweGE4OGUsIDB4YjgzMCwgMHhhODkyLCAweGI4MzQsIDB4YTg5NiwgMHhhODgzLCAweDAwM2QsCisJMHgyMDA5LCAweDAyMDUsIDB4MjEwNCwgMHg5MDg1LCAweDAwODAsIDB4MjAwYSwgMHgyMGUxLCAweDAwMDAsCisJMHgyMDExLCAweDAyMTAsIDB4MjIxNCwgMHg5Mjk0LCAweDBmZmYsIDB4YWFhMiwgMHg5MjgyLCAweDAxMTEsCisJMHgxYTBjLCAweDBkZDUsIDB4ODIxMCwgMHg4MjFjLCAweDIwMDEsIDB4MDI2YywgMHgyMDk4LCAweGE4NjAsCisJMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDI5LCAweDIwYTAsIDB4MjAxMSwgMHhkZWFlLCAweDIwNDEsCisJMHgwMDAxLCAweDIyM2QsIDB4OTc4NCwgMHgwMGZmLCAweDkzMjIsIDB4MTIwOCwgMHgyMzAwLCAweDIwYTgsCisJMHg0MDAzLCAweDkzMWEsIDB4MDUzMCwgMHg4MjEwLCAweGQ3ZmMsIDB4MTEzMCwgMHg4ZDY4LCAweDJkMGEsCisJMHgyMDAxLCAweDAyNjAsIDB4MjA5OCwgMHgwYzY4LCAweDI5NTAsIDB4MDgwYywgMHgxMDE4LCAweDAxNzAsCisJMHgyOTAwLCAweGIwMDIsIDB4YTg2NywgMHgwMTQ3LCAweGE4NmIsIDB4MDAwMCwgMHhhODYwLCAweDIwZTgsCisJMHhhODVjLCAweDkwODAsIDB4MDAxYiwgMHgyMGEwLCAweDg4NDAsIDB4MDhkOCwgMHgyNTQ4LCAweGE4MDAsCisJMHg5MDJkLCAweDAxMTgsIDB4MDgwYywgMHgxMDMxLCAweDBjYzgsIDB4MDgwYywgMHgxMDMxLCAweDA4MDQsCisJMHhkZGQwLCAweDI1NDgsIDB4ODg0NywgMHg5ODg1LCAweDAwNDYsIDB4YTg2NiwgMHgyMDA5LCAweDAyMDUsCisJMHgyMDBiLCAweDAwMDAsIDB4MDgwYywgMHhlNmRkLCAweDA4MDQsIDB4ZGRjNCwgMHg4MDEwLCAweDAwMDQsCisJMHg4MDFhLCAweDAwMDYsIDB4ODAxOCwgMHgwMDA4LCAweDgwMTYsIDB4MDAwYSwgMHg4MDE0LCAweDkxODYsCisJMHgwMDEzLCAweDExNjAsIDB4NjAwNCwgMHg5MDhhLCAweDAwNTQsIDB4MWEwYywgMHgwZGQ1LCAweDkwODIsCisJMHgwMDQwLCAweDBhMGMsIDB4MGRkNSwgMHgyMDA4LCAweDA4MDQsIDB4ZGY2MCwgMHg5MTg2LCAweDAwNTEsCisJMHgwMTA4LCAweDAwYzAsIDB4MjAwMSwgMHgwMTA5LCAweDIwMDQsIDB4ZDA4NCwgMHgwOTA0LCAweGRmMTAsCisJMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwODBjLCAweDkwOTQsCisJMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMTJlLCAweDYwMDAsIDB4OTA4NiwgMHgwMDAyLCAweDE1ODAsCisJMHgwODA0LCAweGRmYTksIDB4OTE4NiwgMHgwMDI3LCAweDA1MzAsIDB4OTE4NiwgMHgwMDQ4LCAweDAxMjgsCisJMHg5MTg2LCAweDAwMTQsIDB4MDUwMCwgMHgxOTBjLCAweDBkZDUsIDB4MjAwMSwgMHgwMTA5LCAweDIwMDQsCisJMHhkMDg0LCAweDAxZjAsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwgMHgwMGM2LCAweDIwNjEsCisJMHgwMTAwLCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDA4MGMsIDB4OTA5NCwgMHgwMDJlLCAweDAwMWUsCisJMHgwMDBlLCAweDAwY2UsIDB4MDEyZSwgMHgwMGNlLCAweDYwMDAsIDB4OTA4NiwgMHgwMDA0LCAweDE5MGMsCisJMHgwZGQ1LCAweDA4MDQsIDB4ZTA4YywgMHg2MDA0LCAweDkwODIsIDB4MDA0MCwgMHgyMDA4LCAweDAwMWEsCisJMHgwODBjLCAweGFmZDksIDB4MDAwNSwgMHhkZjI3LCAweGRmMjksIDB4ZGYyOSwgMHhkZjUwLCAweGRmMjcsCisJMHhkZjI3LCAweGRmMjcsIDB4ZGYyNywgMHhkZjI3LCAweGRmMjcsIDB4ZGYyNywgMHhkZjI3LCAweGRmMjcsCisJMHhkZjI3LCAweGRmMjcsIDB4ZGYyNywgMHhkZjI3LCAweGRmMjcsIDB4ZGYyNywgMHhkZjI3LCAweDA4MGMsCisJMHgwZGQ1LCAweDA4MGMsIDB4OTY1NywgMHgwODBjLCAweDk3NjMsIDB4MDAzNiwgMHgwMDk2LCAweDYwMTQsCisJMHg5MDRkLCAweDAxZDgsIDB4MDgwYywgMHhjYzg2LCAweDAxYzAsIDB4NjAwMywgMHgwMDAyLCAweDYwMTAsCisJMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MTE3OCwgMHgyMDE5LCAweDAwMDQsCisJMHgwODBjLCAweGU2ZGQsIDB4NjAxNywgMHgwMDAwLCAweDYwMTgsIDB4OTAwNSwgMHgxMTIwLCAweDIwMDEsCisJMHgxOTg2LCAweDIwMDQsIDB4NjAxYSwgMHg2MDAzLCAweDAwMDcsIDB4MDA5ZSwgMHgwMDNlLCAweDAwMDUsCisJMHgwMDk2LCAweDA4MGMsIDB4OTY1NywgMHgwODBjLCAweDk3NjMsIDB4MDgwYywgMHhjYzg2LCAweDAxMjAsCisJMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHgxMDMxLCAweDA4MGMsIDB4YWY3NCwgMHgwMDllLCAweDAwMDUsCisJMHgwMDAyLCAweGRmNzUsIDB4ZGY4YywgMHhkZjc3LCAweGRmYTMsIDB4ZGY3NSwgMHhkZjc1LCAweGRmNzUsCisJMHhkZjc1LCAweGRmNzUsIDB4ZGY3NSwgMHhkZjc1LCAweGRmNzUsIDB4ZGY3NSwgMHhkZjc1LCAweGRmNzUsCisJMHhkZjc1LCAweGRmNzUsIDB4ZGY3NSwgMHhkZjc1LCAweGRmNzUsIDB4MDgwYywgMHgwZGQ1LCAweDAwOTYsCisJMHgwODBjLCAweDk2NTcsIDB4NjAxNCwgMHgyMDQ4LCAweGE4N2MsIDB4ZDBiNCwgMHgwMTM4LCAweDYwMDMsCisJMHgwMDA3LCAweDIwMDksIDB4MDA0MywgMHgwODBjLCAweGFmYmUsIDB4MDAxMCwgMHg2MDAzLCAweDAwMDQsCisJMHgwODBjLCAweDk3NjMsIDB4MDA5ZSwgMHgwMDA1LCAweDA4MGMsIDB4OTY1NywgMHgwODBjLCAweGNjODYsCisJMHgwMTM4LCAweDYxMTQsIDB4MDA5NiwgMHgyMTQ4LCAweGE5N2MsIDB4MDA5ZSwgMHhkMWVjLCAweDExMzgsCisJMHgwODBjLCAweDg3NmYsIDB4MDgwYywgMHhhZjQzLCAweDA4MGMsIDB4OTc2MywgMHgwMDA1LCAweDA4MGMsCisJMHhlOTNmLCAweDBkYjAsIDB4MGNjOCwgMHgwODBjLCAweDk2NTcsIDB4MjAwOSwgMHgwMDQxLCAweDA4MDQsCisJMHhlMTE0LCAweDkxODIsIDB4MDA0MCwgMHgwMDAyLCAweGRmYzAsIDB4ZGZjMiwgMHhkZmMwLCAweGRmYzAsCisJMHhkZmMwLCAweGRmYzAsIDB4ZGZjMCwgMHhkZmMwLCAweGRmYzAsIDB4ZGZjMCwgMHhkZmMwLCAweGRmYzAsCisJMHhkZmMwLCAweGRmYzAsIDB4ZGZjMCwgMHhkZmMwLCAweGRmYzAsIDB4ZGZjMywgMHhkZmMwLCAweGRmYzAsCisJMHgwODBjLCAweDBkZDUsIDB4MDAwNSwgMHgwMGQ2LCAweDA4MGMsIDB4ODc2ZiwgMHgwMGRlLCAweDA4MGMsCisJMHhlOTk3LCAweDA4MGMsIDB4YWY0MywgMHgwMDA1LCAweDkxODIsIDB4MDA0MCwgMHgwMDAyLCAweGRmZTMsCisJMHhkZmUzLCAweGRmZTMsIDB4ZGZlMywgMHhkZmUzLCAweGRmZTMsIDB4ZGZlMywgMHhkZmUzLCAweGRmZTMsCisJMHhkZmU1LCAweGUwNTQsIDB4ZGZlMywgMHhkZmUzLCAweGRmZTMsIDB4ZGZlMywgMHhlMDU0LCAweGRmZTMsCisJMHhkZmUzLCAweGRmZTMsIDB4ZGZlMywgMHgwODBjLCAweDBkZDUsIDB4MjAwMSwgMHgwMTA1LCAweDIwMDQsCisJMHg5MDg0LCAweDE4MDAsIDB4MDFjOCwgMHgyMDAxLCAweDAxMzIsIDB4MjAwYywgMHgyMDAxLCAweDAxMzEsCisJMHgyMDA0LCAweDkxMDUsIDB4MTkwNCwgMHhlMDU0LCAweDIwMDksIDB4MTgwYywgMHgyMTA0LCAweGQwZDQsCisJMHgwOTA0LCAweGUwNTQsIDB4YzBkNCwgMHgyMDBhLCAweDIwMDksIDB4MDEwNSwgMHgyMTA0LCAweDkwODQsCisJMHhlN2ZkLCAweDkwODUsIDB4MDAxMCwgMHgyMDBhLCAweDIwMDEsIDB4MTg2NywgMHgyMDA0LCAweGQwZTQsCisJMHgxNTI4LCAweDYwM2IsIDB4MDAwMCwgMHgwODBjLCAweDk3MTMsIDB4NjAxNCwgMHgwMDk2LCAweDIwNDgsCisJMHhhODdjLCAweGQwZmMsIDB4MDE4OCwgMHg5MDhjLCAweDAwMDMsIDB4OTE4ZSwgMHgwMDAyLCAweDA1MDgsCisJMHgyMDAxLCAweDE4MGMsIDB4MjAwNCwgMHhkMGQ0LCAweDExZTAsIDB4MDgwYywgMHg5ODkxLCAweDIwMDksCisJMHgwMDQxLCAweDAwOWUsIDB4MDgwNCwgMHhlMTE0LCAweDA4MGMsIDB4OTg5MSwgMHg2MDAzLCAweDAwMDcsCisJMHg2MDFiLCAweDAwMDAsIDB4MDgwYywgMHg4NzZmLCAweDAwOWUsIDB4MDAwNSwgMHgyMDAxLCAweDAxMDAsCisJMHgyMDA0LCAweDkwODIsIDB4MDAwNSwgMHgwYWE4LCAweDIwMDEsIDB4MDExZiwgMHgyMDA0LCAweDYwM2EsCisJMHgwODkwLCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGMxZDQsIDB4MjEwMiwgMHhkMWNjLCAweDAxMTAsCisJMHgwODBjLCAweDJjOTAsIDB4MDgwYywgMHg5ODkxLCAweDYwMTQsIDB4MjA0OCwgMHhhOTdjLCAweGQxZWMsCisJMHgxMTMwLCAweDA4MGMsIDB4ODc2ZiwgMHgwODBjLCAweGFmNDMsIDB4MDA5ZSwgMHgwMDA1LCAweDA4MGMsCisJMHhlOTNmLCAweDBkYjgsIDB4MDA5ZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGMxZDQsCisJMHgyMTAyLCAweDAwMzYsIDB4MDgwYywgMHg5NzEzLCAweDA4MGMsIDB4OTg5MSwgMHg2MDE0LCAweDAwOTYsCisJMHgyMDQ4LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwgMHhkMGJjLCAweDAxODgsCisJMHhhODdjLCAweDkwODQsIDB4MDAwMywgMHg5MDg2LCAweDAwMDIsIDB4MDE0MCwgMHhhOGFjLCAweDYzMzAsCisJMHg5MzFhLCAweDYzMzIsIDB4YThiMCwgMHg2MzJjLCAweDkzMWIsIDB4NjMyZSwgMHg2MDAzLCAweDAwMDIsCisJMHgwMDgwLCAweDIwMTksIDB4MDAwNCwgMHgwODBjLCAweGU2ZGQsIDB4NjAxOCwgMHg5MDA1LCAweDExMjgsCisJMHgyMDAxLCAweDE5ODYsIDB4MjAwNCwgMHg4MDAzLCAweDYwMWEsIDB4NjAxNywgMHgwMDAwLCAweDYwMDMsCisJMHgwMDA3LCAweDAwOWUsIDB4MDAzZSwgMHgwMDA1LCAweDkxODIsIDB4MDA0MCwgMHgwMDAyLCAweGUwYTMsCisJMHhlMGEzLCAweGUwYTMsIDB4ZTBhMywgMHhlMGEzLCAweGUwYTMsIDB4ZTBhMywgMHhlMGEzLCAweGUwYTUsCisJMHhlMGEzLCAweGUwYTMsIDB4ZTBhMywgMHhlMGEzLCAweGUwYTMsIDB4ZTBhMywgMHhlMGEzLCAweGUwYTMsCisJMHhlMGEzLCAweGUwYTMsIDB4ZTBmMCwgMHgwODBjLCAweDBkZDUsIDB4NjAxNCwgMHgwMDk2LCAweDIwNDgsCisJMHhhODM0LCAweGFhMzgsIDB4NjExMCwgMHgwMGI2LCAweDIxNTgsIDB4YjkwMCwgMHgwMGJlLCAweGQxYmMsCisJMHgxMTkwLCAweDkyMGQsIDB4MTUxOCwgMHhhODdjLCAweGQwZmMsIDB4MDEyOCwgMHgyMDA5LCAweDAwNDEsCisJMHgwMDllLCAweDA4MDQsIDB4ZTExNCwgMHg2MDAzLCAweDAwMDcsIDB4NjAxYiwgMHgwMDAwLCAweDA4MGMsCisJMHg4NzZmLCAweDAwOWUsIDB4MDAwNSwgMHg2MTI0LCAweGQxZjQsIDB4MWQ1OCwgMHgwMDA2LCAweDAwNDYsCisJMHhhY2FjLCAweDk0MjIsIDB4YTliMCwgMHgyMjAwLCAweDkxMGIsIDB4NjAzMCwgMHg5NDIwLCAweDY0MzIsCisJMHg2MDJjLCAweDkxMDksIDB4NjEyZSwgMHgwMDRlLCAweDAwMGUsIDB4MDhkOCwgMHg2MTEwLCAweDAwYjYsCisJMHgyMTU4LCAweGI5MDAsIDB4MDBiZSwgMHhkMWJjLCAweDExNzgsIDB4MjAwOSwgMHgxODBlLCAweDIxMGMsCisJMHhkMTljLCAweDAxMTgsIDB4NjAwMywgMHgwMDA3LCAweDAwMTAsIDB4NjAwMywgMHgwMDA2LCAweDAwZTksCisJMHgwODBjLCAweDg3NzEsIDB4MDA5ZSwgMHgwMDA1LCAweDYwMDMsIDB4MDAwMiwgMHgwMDllLCAweDAwMDUsCisJMHg2MDI0LCAweGQwZjQsIDB4MDEyOCwgMHgwODBjLCAweDE1ZjQsIDB4MTkwNCwgMHhlMGE1LCAweDAwMDUsCisJMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwgMHhhODM0LCAweGE5MzgsIDB4MDA5ZSwgMHg5MTA1LCAweDExMjAsCisJMHgwODBjLCAweDE1ZjQsIDB4MTkwNCwgMHhlMGE1LCAweDAwMDUsIDB4ZDJmYywgMHgwMTQwLCAweDgwMDIsCisJMHg4MDAwLCAweDgyMTIsIDB4OTI5MSwgMHgwMDAwLCAweDIwMDksIDB4MDAwOSwgMHgwMDEwLCAweDIwMDksCisJMHgwMDE1LCAweGFhOWEsIDB4YTg5NiwgMHgwMDA1LCAweDkxODIsIDB4MDA0MCwgMHgwMjA4LCAweDAwNjIsCisJMHg5MTg2LCAweDAwMTMsIDB4MDEyMCwgMHg5MTg2LCAweDAwMTQsIDB4MTkwYywgMHgwZGQ1LCAweDYwMjQsCisJMHhkMGRjLCAweDA5MGMsIDB4MGRkNSwgMHgwMDA1LCAweGUxMzgsIDB4ZTE0NCwgMHhlMTUwLCAweGUxNWMsCisJMHhlMTM4LCAweGUxMzgsIDB4ZTEzOCwgMHhlMTM4LCAweGUxM2YsIDB4ZTEzYSwgMHhlMTNhLCAweGUxMzgsCisJMHhlMTM4LCAweGUxMzgsIDB4ZTEzOCwgMHhlMTNhLCAweGUxMzgsIDB4ZTEzYSwgMHhlMTM4LCAweGUxM2YsCisJMHgwODBjLCAweDBkZDUsIDB4NjAyNCwgMHhkMGRjLCAweDA5MGMsIDB4MGRkNSwgMHgwMDA1LCAweDYwMTQsCisJMHg5MDA1LCAweDE5MGMsIDB4MGRkNSwgMHgwMDA1LCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDA4MGMsCisJMHg5MWIxLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4OTc2MywgMHgwMTJlLCAweDAwMDUsCisJMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgwODBjLCAweDkxYjEsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgwODBjLCAweDk3NjMsIDB4MDEyZSwgMHgwMDA1LCAweDYwMDMsIDB4MDAwMywgMHg2MTA2LCAweDJjMTAsCisJMHgwODBjLCAweDFiZWIsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg5MjE2LCAweDA4MGMsCisJMHg5ODkxLCAweDAxMmUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDM2LCAweDAwOTYsCisJMHg5MTgyLCAweDAwNDAsIDB4MDAyMywgMHgwMDllLCAweDAwM2UsIDB4MDEyZSwgMHgwMDA1LCAweGUxOGIsCisJMHhlMThkLCAweGUxOWYsIDB4ZTFiOSwgMHhlMThiLCAweGUxOGIsIDB4ZTE4YiwgMHhlMThiLCAweGUxOGIsCisJMHhlMThiLCAweGUxOGIsIDB4ZTE4YiwgMHhlMThiLCAweGUxOGIsIDB4ZTE4YiwgMHhlMThiLCAweGUxOGIsCisJMHhlMThiLCAweGUxOGIsIDB4ZTE4YiwgMHgwODBjLCAweDBkZDUsIDB4NjAxNCwgMHgyMDQ4LCAweGE4N2MsCisJMHhkMGZjLCAweDAxZjgsIDB4OTA5YywgMHgwMDAzLCAweDkzOWUsIDB4MDAwMywgMHgwMWQwLCAweDYwMDMsCisJMHgwMDAxLCAweDYxMDYsIDB4MDgwYywgMHg5MWIxLCAweDA4MGMsIDB4OTc2MywgMHgwNDcwLCAweDYwMTQsCisJMHgyMDQ4LCAweGE4N2MsIDB4ZDBmYywgMHgwMTY4LCAweDkwOWMsIDB4MDAwMywgMHg5MzllLCAweDAwMDMsCisJMHgwMTQwLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDA4MGMsIDB4OTFiMSwgMHgwODBjLCAweDk3NjMsCisJMHgwMGUwLCAweDkwMWUsIDB4NjMxNiwgMHg2MzFhLCAweDIwMTksIDB4MDAwNCwgMHgwODBjLCAweGU2ZGQsCisJMHgwMGEwLCAweDYwMTQsIDB4MjA0OCwgMHhhODdjLCAweGQwZmMsIDB4MGQ5OCwgMHg5MDljLCAweDAwMDMsCisJMHg5MzllLCAweDAwMDMsIDB4MGQ3MCwgMHg2MDAzLCAweDAwMDMsIDB4NjEwNiwgMHgyYzEwLCAweDA4MGMsCisJMHgxYmViLCAweDA4MGMsIDB4OTIxNiwgMHgwODBjLCAweDk4OTEsIDB4MDAwNSwgMHgwODBjLCAweDk2NTcsCisJMHg2MTE0LCAweDgxZmYsIDB4MDE1OCwgMHgwMDk2LCAweDIxNDgsIDB4MDgwYywgMHhlYTk0LCAweDAwMzYsCisJMHgyMDE5LCAweDAwMjksIDB4MDgwYywgMHhlNmRkLCAweDAwM2UsIDB4MDA5ZSwgMHgwODBjLCAweGFmNzQsCisJMHgwODBjLCAweDk3NjMsIDB4MDAwNSwgMHgwODBjLCAweDk3MTMsIDB4NjExNCwgMHg4MWZmLCAweDAxNTgsCisJMHgwMDk2LCAweDIxNDgsIDB4MDgwYywgMHhlYTk0LCAweDAwMzYsIDB4MjAxOSwgMHgwMDI5LCAweDA4MGMsCisJMHhlNmRkLCAweDAwM2UsIDB4MDA5ZSwgMHgwODBjLCAweGFmNzQsIDB4MDgwYywgMHg5ODkxLCAweDAwMDUsCisJMHg5MTgyLCAweDAwODUsIDB4MDAwMiwgMHhlMjBhLCAweGUyMDgsIDB4ZTIwOCwgMHhlMjE2LCAweGUyMDgsCisJMHhlMjA4LCAweGUyMDgsIDB4ZTIwOCwgMHhlMjA4LCAweGUyMDgsIDB4ZTIwOCwgMHhlMjA4LCAweGUyMDgsCisJMHgwODBjLCAweDBkZDUsIDB4NjAwMywgMHgwMDBiLCAweDYxMDYsIDB4MDgwYywgMHg5MWIxLCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg5NzYzLCAweDAxMmUsIDB4MDAwNSwgMHgwMDI2LCAweDAwZTYsCisJMHgwODBjLCAweGU5MzYsIDB4MDExOCwgMHgwODBjLCAweGFmNDMsIDB4MDQ1MCwgMHgyMDcxLCAweDAyNjAsCisJMHg3MjI0LCAweDYyMTYsIDB4MjAwMSwgMHgxODBlLCAweDIwMDQsIDB4ZDBlNCwgMHgwMTUwLCAweDYwMTAsCisJMHgwMGI2LCAweDIwNTgsIDB4YmNhMCwgMHgwMGJlLCAweDJjMDAsIDB4MjAxMSwgMHgwMTRlLCAweDA4MGMsCisJMHhiMjY0LCAweDcyMjAsIDB4MDgwYywgMHhlNTgzLCAweDAxMTgsIDB4NjAwNywgMHgwMDg2LCAweDAwNDAsCisJMHg2MDA3LCAweDAwODcsIDB4NzIyNCwgMHg5Mjk2LCAweGZmZmYsIDB4MTExMCwgMHg2MDA3LCAweDAwODYsCisJMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg5MWIxLCAweDA4MGMsIDB4OTc2MywgMHgwODBjLCAweDk4OTEsCisJMHgwMGVlLCAweDAwMmUsIDB4MDAwNSwgMHg5MTg2LCAweDAwMTMsIDB4MTE2MCwgMHg2MDA0LCAweDkwOGEsCisJMHgwMDg1LCAweDBhMGMsIDB4MGRkNSwgMHg5MDhhLCAweDAwOTIsIDB4MWEwYywgMHgwZGQ1LCAweDkwODIsCisJMHgwMDg1LCAweDAwYTIsIDB4OTE4NiwgMHgwMDI3LCAweDAxMzAsIDB4OTE4NiwgMHgwMDE0LCAweDAxMTgsCisJMHgwODBjLCAweGFmZDksIDB4MDA1MCwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg2NjE1LCAweDA4MGMsCisJMHg5NjU3LCAweDA4MGMsIDB4YWY3NCwgMHgwODBjLCAweDk3NjMsIDB4MDAwNSwgMHhlMjdiLCAweGUyN2QsCisJMHhlMjdkLCAweGUyN2IsIDB4ZTI3YiwgMHhlMjdiLCAweGUyN2IsIDB4ZTI3YiwgMHhlMjdiLCAweGUyN2IsCisJMHhlMjdiLCAweGUyN2IsIDB4ZTI3YiwgMHgwODBjLCAweDBkZDUsIDB4MDgwYywgMHg5NjU3LCAweDA4MGMsCisJMHhhZjc0LCAweDA4MGMsIDB4OTc2MywgMHgwMDA1LCAweDkxODIsIDB4MDA4NSwgMHgwYTBjLCAweDBkZDUsCisJMHg5MTgyLCAweDAwOTIsIDB4MWEwYywgMHgwZGQ1LCAweDkxODIsIDB4MDA4NSwgMHgwMDAyLCAweGUyOWMsCisJMHhlMjljLCAweGUyOWMsIDB4ZTI5ZSwgMHhlMjljLCAweGUyOWMsIDB4ZTI5YywgMHhlMjljLCAweGUyOWMsCisJMHhlMjljLCAweGUyOWMsIDB4ZTI5YywgMHhlMjljLCAweDA4MGMsIDB4MGRkNSwgMHgwMDA1LCAweDkxODYsCisJMHgwMDEzLCAweDAxNDgsIDB4OTE4NiwgMHgwMDE0LCAweDAxMzAsIDB4OTE4NiwgMHgwMDI3LCAweDAxMTgsCisJMHgwODBjLCAweGFmZDksIDB4MDAzMCwgMHgwODBjLCAweDk2NTcsIDB4MDgwYywgMHhhZjc0LCAweDA4MGMsCisJMHg5NzYzLCAweDAwMDUsIDB4MDAzNiwgMHgwODBjLCAweGU5OTcsIDB4NjA0MywgMHgwMDAwLCAweDIwMTksCisJMHgwMDBiLCAweDAwMzEsIDB4NjAyMywgMHgwMDA2LCAweDYwMDMsIDB4MDAwNywgMHgwMDNlLCAweDAwMDUsCisJMHgwMTI2LCAweDAwMzYsIDB4MjA5MSwgMHg4MDAwLCAweDAwODYsIDB4MmM0MCwgMHgwMDk2LCAweDkwNGUsCisJMHgwODBjLCAweGE3NmIsIDB4MDA5ZSwgMHgwMDhlLCAweDE1NTAsIDB4MDA3NiwgMHgyYzM4LCAweDA4MGMsCisJMHhhODE2LCAweDAwN2UsIDB4MTUyMCwgMHg2MDAwLCAweDkwODYsIDB4MDAwMCwgMHgwNTAwLCAweDYwMjAsCisJMHg5MDg2LCAweDAwMDcsIDB4MDFlMCwgMHgwMDk2LCAweDYwMWMsIDB4ZDA4NCwgMHgwMTQwLCAweDA4MGMsCisJMHhlOTk3LCAweDA4MGMsIDB4ZDNhMCwgMHgwODBjLCAweDFhYTEsIDB4NjAyMywgMHgwMDA3LCAweDYwMTQsCisJMHgyMDQ4LCAweDA4MGMsIDB4Y2M4NiwgMHgwMTEwLCAweDA4MGMsIDB4ZTZkZCwgMHgwMDllLCAweDYwMTcsCisJMHgwMDAwLCAweDA4MGMsIDB4ZTk5NywgMHg2MDIzLCAweDAwMDcsIDB4MDgwYywgMHhkM2EwLCAweDAwM2UsCisJMHgwMTJlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGM2LCAweDAwYjYsIDB4MDAzNiwgMHgwMTU2LCAweDIwNzksCisJMHgwMjYwLCAweDc5MzgsIDB4NzgzYywgMHgwODBjLCAweDI4N2MsIDB4MTVjOCwgMHgwMDE2LCAweDAwYzYsCisJMHgwODBjLCAweDY2OTksIDB4MTU5MCwgMHgwMDFlLCAweDAwYzYsIDB4MjE2MCwgMHgwODBjLCAweGQzOWQsCisJMHgwMGNlLCAweDAwMmUsIDB4MDAyNiwgMHgwMDE2LCAweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweGE4ZGMsCisJMHgwODBjLCAweDkzNTYsIDB4MDA3NiwgMHg5MDNlLCAweDA4MGMsIDB4OTIyOSwgMHgwMDdlLCAweDAwMWUsCisJMHgwMDc2LCAweDkwM2UsIDB4MDgwYywgMHhlNDc3LCAweDAwN2UsIDB4MDAyNiwgMHhiYTA0LCAweDkyOTQsCisJMHhmZjAwLCAweDgyMTcsIDB4OTI4NiwgMHgwMDA2LCAweDAxMTgsIDB4OTI4NiwgMHgwMDA0LCAweDExMTgsCisJMHhiYWEwLCAweDA4MGMsIDB4MzJkYywgMHgwMDJlLCAweGJjYzAsIDB4MDAxZSwgMHgwODBjLCAweDYwYzcsCisJMHhiZTEyLCAweGJkMTYsIDB4YmNjMiwgMHg5MDA2LCAweDAwMTAsIDB4MDBjZSwgMHgwMDFlLCAweDAxNWUsCisJMHgwMDNlLCAweDAwYmUsIDB4MDBjZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LCAweDAwYjYsCisJMHgwMDE2LCAweDIwMDksIDB4MTgyNCwgMHgyMTA0LCAweDkwODYsIDB4MDA3NCwgMHgxOTA0LCAweGUzOWUsCisJMHgyMDY5LCAweDAyNjAsIDB4Njk0NCwgMHg5MTgyLCAweDAxMDAsIDB4MDZlMCwgMHg2OTQwLCAweDkxODQsCisJMHg4MDAwLCAweDA5MDQsIDB4ZTM5YiwgMHgyMDAxLCAweDE5N2IsIDB4MjAwNCwgMHg5MDA1LCAweDExNDAsCisJMHg2MDEwLCAweDIwNTgsIDB4YjhjMCwgMHg5MDA1LCAweDAxMTgsIDB4OTE4NCwgMHgwODAwLCAweDA1OTgsCisJMHg2OTQ4LCAweDkxOGEsIDB4MDAwMSwgMHgwNjQ4LCAweDA4MGMsIDB4ZWFmYywgMHgwMTE4LCAweDY5NzgsCisJMHhkMWZjLCAweDExYjgsIDB4MjAwOSwgMHgwMjA1LCAweDIwMGIsIDB4MDAwMSwgMHg2OTNjLCAweDgxZmYsCisJMHgxMTk4LCAweDY5NDQsIDB4OTE4MiwgMHgwMTAwLCAweDAyYTgsIDB4Njk0MCwgMHg4MWZmLCAweDExNzgsCisJMHg2OTQ4LCAweDkxOGEsIDB4MDAwMSwgMHgwMjg4LCAweDY5NTAsIDB4OTE4YSwgMHgwMDAxLCAweDAyOTgsCisJMHgwMGQwLCAweDYwMTcsIDB4MDEwMCwgMHgwMGEwLCAweDYwMTcsIDB4MDMwMCwgMHgwMDg4LCAweDYwMTcsCisJMHgwNTAwLCAweDAwNzAsIDB4NjAxNywgMHgwNzAwLCAweDAwNTgsIDB4NjAxNywgMHgwOTAwLCAweDAwNDAsCisJMHg2MDE3LCAweDBiMDAsIDB4MDAyOCwgMHg2MDE3LCAweDBmMDAsIDB4MDAxMCwgMHg2MDE3LCAweDJkMDAsCisJMHg5MDg1LCAweDAwMDEsIDB4MDAwOCwgMHg5MDA2LCAweDAwMWUsIDB4MDBiZSwgMHgwMGRlLCAweDAwY2UsCisJMHgwMDA1LCAweDAwYzYsIDB4MDBiNiwgMHgwMDI2LCAweDAwMzYsIDB4MDE1NiwgMHg2MjEwLCAweDIyNTgsCisJMHhiYjA0LCAweDkzOTQsIDB4MDBmZiwgMHg5Mjg2LCAweDAwMDYsIDB4MDE4MCwgMHg5Mjg2LCAweDAwMDQsCisJMHgwMTY4LCAweDkzOTQsIDB4ZmYwMCwgMHg4MjE3LCAweDkyODYsIDB4MDAwNiwgMHgwMTM4LCAweDkyODYsCisJMHgwMDA0LCAweDAxMjAsIDB4MDgwYywgMHg2NmE4LCAweDA4MDQsIDB4ZTQwNiwgMHgyMDExLCAweDAyNzYsCisJMHgyMGE5LCAweDAwMDQsIDB4MDA5NiwgMHgyYjQ4LCAweDIwMTksIDB4MDAwYSwgMHgwODBjLCAweGJmMTEsCisJMHgwMDllLCAweDE1YTgsIDB4MjAxMSwgMHgwMjdhLCAweDIwYTksIDB4MDAwNCwgMHgwMDk2LCAweDJiNDgsCisJMHgyMDE5LCAweDAwMDYsIDB4MDgwYywgMHhiZjExLCAweDAwOWUsIDB4MTU0OCwgMHgwMDQ2LCAweDAwMTYsCisJMHhiYWEwLCAweDIyMjAsIDB4OTAwNiwgMHgyMDA5LCAweDE4NDgsIDB4MjEwYywgMHhkMWE0LCAweDAxMzgsCisJMHgyMDA5LCAweDAwMjksIDB4MDgwYywgMHhlNzNhLCAweGI4MDAsIDB4YzBlNSwgMHhiODAyLCAweDIwMTksCisJMHgwMDI5LCAweDA4MGMsIDB4OTM1NiwgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweDkyMjksCisJMHgyYzA4LCAweDA4MGMsIDB4ZTQ3NywgMHgwMDdlLCAweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDY2MTUsCisJMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg2NWU5LCAweDAwMWUsIDB4MDA0ZSwgMHg5MDA2LCAweDAxNWUsCisJMHgwMDNlLCAweDAwMmUsIDB4MDBiZSwgMHgwMGNlLCAweDAwMDUsIDB4MDBkNiwgMHgyMDY5LCAweDAyNmUsCisJMHg2ODAwLCAweDkwODYsIDB4MDgwMCwgMHgwMTE4LCAweDYwMTcsIDB4MDAwMCwgMHgwMDA4LCAweDkwMDYsCisJMHgwMGRlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGY2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAxNTYsCisJMHgyMDc5LCAweDAyNmMsIDB4NzkzMCwgMHg3ODM0LCAweDA4MGMsIDB4Mjg3YywgMHgxMWQwLCAweDA4MGMsCisJMHg2Njk5LCAweDExYjgsIDB4MjAxMSwgMHgwMjcwLCAweDIwYTksIDB4MDAwNCwgMHgwMDk2LCAweDJiNDgsCisJMHgyMDE5LCAweDAwMGEsIDB4MDgwYywgMHhiZjExLCAweDAwOWUsIDB4MTE1OCwgMHgyMDExLCAweDAyNzQsCisJMHgyMGE5LCAweDAwMDQsIDB4MDA5NiwgMHgyYjQ4LCAweDIwMTksIDB4MDAwNiwgMHgwODBjLCAweGJmMTEsCisJMHgwMDllLCAweDAxNWUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDBmZSwgMHgwMGJlLCAweDAwMDUsCisJMHgwMGI2LCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDE1NiwgMHgyMDExLCAweDAyNjMsCisJMHgyMjA0LCAweDgyMTEsIDB4MjIwYywgMHgwODBjLCAweDI4N2MsIDB4MTFkMCwgMHgwODBjLCAweDY2OTksCisJMHgxMWI4LCAweDIwMTEsIDB4MDI3NiwgMHgyMGE5LCAweDAwMDQsIDB4MDA5NiwgMHgyYjQ4LCAweDIwMTksCisJMHgwMDBhLCAweDA4MGMsIDB4YmYxMSwgMHgwMDllLCAweDExNTgsIDB4MjAxMSwgMHgwMjdhLCAweDIwYTksCisJMHgwMDA0LCAweDAwOTYsIDB4MmI0OCwgMHgyMDE5LCAweDAwMDYsIDB4MDgwYywgMHhiZjExLCAweDAwOWUsCisJMHgwMTVlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDBiZSwgMHgwMDA1LCAweDAwZTYsCisJMHgwMGM2LCAweDAwODYsIDB4MDA3NiwgMHgwMDY2LCAweDAwNTYsIDB4MDA0NiwgMHgwMDI2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4Mjc0MCwgMHgyMDI5LCAweDE5ZWYsIDB4MjUyYywgMHgyMDIxLCAweDE5ZjUsCisJMHgyNDI0LCAweDIwNjEsIDB4MWNkMCwgMHgyMDcxLCAweDE4MDAsIDB4NzY1NCwgMHg3MDc0LCAweDgxZmYsCisJMHgwMTUwLCAweDAwMDYsIDB4OTE4NiwgMHgxYWIyLCAweDAwMGUsIDB4MDEyOCwgMHg4MDAxLCAweDk2MDIsCisJMHgxYTA0LCAweGU1MTQsIDB4MDAxOCwgMHg5NjA2LCAweDA5MDQsIDB4ZTUxNCwgMHgwODBjLCAweDhhM2QsCisJMHgwOTA0LCAweGU1MGIsIDB4MjEwMCwgMHg5YzA2LCAweDA5MDQsIDB4ZTUwYiwgMHgwODBjLCAweGU3N2IsCisJMHgxOTA0LCAweGU1MGIsIDB4MDgwYywgMHhlYjE5LCAweDA5MDQsIDB4ZTUwYiwgMHgwODBjLCAweGU3NmIsCisJMHgwOTA0LCAweGU1MGIsIDB4NjcyMCwgMHg5Nzg2LCAweDAwMDEsIDB4MTE0OCwgMHgwODBjLCAweDMzNzMsCisJMHgwOTA0LCAweGU1NTMsIDB4NjAwNCwgMHg5MDg2LCAweDAwMDAsIDB4MTkwNCwgMHhlNTUzLCAweDk3ODYsCisJMHgwMDA0LCAweDA5MDQsIDB4ZTU1MywgMHg5Nzg2LCAweDAwMDcsIDB4MDkwNCwgMHhlNTBiLCAweDI1MDAsCisJMHg5YzA2LCAweDA5MDQsIDB4ZTUwYiwgMHgyNDAwLCAweDljMDYsIDB4MDVlOCwgMHg4OGZmLCAweDAxMTgsCisJMHg2MDU0LCAweDk5MDYsIDB4MTVjMCwgMHgwMDk2LCAweDYwMDAsIDB4OTA4NiwgMHgwMDA0LCAweDExMjAsCisJMHgwMDE2LCAweDA4MGMsIDB4MWFhMSwgMHgwMDFlLCAweDk3ODYsIDB4MDAwYSwgMHgwMTQ4LCAweDA4MGMsCisJMHhjZThlLCAweDExMzAsIDB4MDgwYywgMHhiOTA1LCAweDAwOWUsIDB4MDgwYywgMHhhZjc0LCAweDA0MTgsCisJMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhjYzg2LCAweDAxZDgsIDB4OTc4NiwgMHgwMDAzLCAweDE1NzAsCisJMHhhODY3LCAweDAxMDMsIDB4YTg3YywgMHhkMGNjLCAweDAxMzAsIDB4MDA5NiwgMHhhODc4LCAweDIwNDgsCisJMHgwODBjLCAweDBmYjEsIDB4MDA5ZSwgMHhhYjdhLCAweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweGVhOTQsCisJMHgwMDE2LCAweDA4MGMsIDB4Y2Y3YywgMHgwODBjLCAweDZkMGIsIDB4MDAxZSwgMHgwODBjLCAweGNlNzEsCisJMHgwMDllLCAweDA4MGMsIDB4YWY3NCwgMHg5Y2UwLCAweDAwMTgsIDB4MjAwMSwgMHgxODFhLCAweDIwMDQsCisJMHg5YzAyLCAweDEyMTAsIDB4MDgwNCwgMHhlNDhiLCAweDAxMmUsIDB4MDAyZSwgMHgwMDRlLCAweDAwNWUsCisJMHgwMDZlLCAweDAwN2UsIDB4MDA4ZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHg5Nzg2LCAweDAwMDYsCisJMHgxMTUwLCAweDkzODYsIDB4MDAwNSwgMHgwMTI4LCAweDA4MGMsIDB4ZWE5NCwgMHgwODBjLCAweGU2ZGQsCisJMHgwOGY4LCAweDAwOWUsIDB4MGMwMCwgMHg5Nzg2LCAweDAwMDksIDB4MTFmOCwgMHg2MDAwLCAweDkwODYsCisJMHgwMDA0LCAweDAxYzAsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDMsIDB4MTFhMCwgMHgwODBjLCAweDk3MTMsCisJMHgwMDk2LCAweDYxMTQsIDB4MjE0OCwgMHgwODBjLCAweGNjODYsIDB4MDExOCwgMHg2MDEwLCAweDA4MGMsCisJMHg2ZDE3LCAweDAwOWUsIDB4MDBjNiwgMHgwODBjLCAweGFmNDMsIDB4MDBjZSwgMHgwMDM2LCAweDA4MGMsCisJMHg5ODkxLCAweDAwM2UsIDB4MDA5ZSwgMHgwODA0LCAweGU1MGIsIDB4OTc4NiwgMHgwMDBhLCAweDA5MDQsCisJMHhlNGZiLCAweDA4MDQsIDB4ZTRmMCwgMHg4MWZmLCAweDA5MDQsIDB4ZTUwYiwgMHg5MTgwLCAweDAwMDEsCisJMHgyMDA0LCAweDkwODYsIDB4MDAxOCwgMHgwMTM4LCAweDkxODAsIDB4MDAwMSwgMHgyMDA0LCAweDkwODYsCisJMHgwMDJkLCAweDE5MDQsIDB4ZTUwYiwgMHg2MDAwLCAweDkwODYsIDB4MDAwMiwgMHgxOTA0LCAweGU1MGIsCisJMHgwODBjLCAweGNlN2QsIDB4MDEzOCwgMHgwODBjLCAweGNlOGUsIDB4MTkwNCwgMHhlNTBiLCAweDA4MGMsCisJMHhiOTA1LCAweDAwMzgsIDB4MDgwYywgMHgzMjQ3LCAweDA4MGMsIDB4Y2U4ZSwgMHgxMTEwLCAweDA4MGMsCisJMHhiOTA1LCAweDA4MGMsIDB4YWY3NCwgMHgwODA0LCAweGU1MGIsIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsCisJMHg5MDg2LCAweDAwMzksIDB4MDAwNSwgMHgwMGM2LCAweDAwZTYsIDB4MDAxNiwgMHgyYzA4LCAweDIxNzAsCisJMHg5MDA2LCAweDA4MGMsIDB4ZTcwNCwgMHgwMDFlLCAweDAxMjAsIDB4NjAyMCwgMHg5MDg0LCAweDAwMGYsCisJMHgwMDFiLCAweDAwZWUsIDB4MDBjZSwgMHgwMDA1LCAweGU1YTIsIDB4ZTVhMiwgMHhlNWEyLCAweGU1YTIsCisJMHhlNWEyLCAweGU1YTIsIDB4ZTVhNCwgMHhlNWEyLCAweGU1YTIsIDB4ZTVhMiwgMHhlNWEyLCAweGFmNzQsCisJMHhhZjc0LCAweGU1YTIsIDB4OTAwNiwgMHgwMDA1LCAweDAwMzYsIDB4MDA0NiwgMHgwMDE2LCAweDcwMTAsCisJMHgwMGI2LCAweDIwNTgsIDB4YmNhMCwgMHgwMGJlLCAweDJjMDAsIDB4MjAwOSwgMHgwMDIwLCAweDA4MGMsCisJMHhlNzNhLCAweDAwMWUsIDB4MDA0ZSwgMHgyMDE5LCAweDAwMDIsIDB4MDgwYywgMHhlMmMwLCAweDAwM2UsCisJMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMDk2LCAweDA4MGMsIDB4Y2M4NiwgMHgwMTQwLCAweDYwMTQsCisJMHg5MDRkLCAweDA4MGMsIDB4YzhhNSwgMHg2ODdiLCAweDAwMDUsIDB4MDgwYywgMHg2ZDE3LCAweDAwOWUsCisJMHgwODBjLCAweGFmNzQsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsCisJMHg2NWQ1LCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MjBhOSwgMHgwMDA0LCAweDIwMTksCisJMHgxODA1LCAweDIwMTEsIDB4MDI3NiwgMHgwODBjLCAweGJlZmQsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMTVlLCAweDkwMDUsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MDBjNiwgMHgwMDg2LCAweDAwNzYsCisJMHgwMDY2LCAweDAwYjYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4Mjc0MCwgMHgyMDYxLCAweDFjZDAsCisJMHgyMDc5LCAweDAwMDEsIDB4OGZmZiwgMHgwOTA0LCAweGU2M2QsIDB4MjA3MSwgMHgxODAwLCAweDc2NTQsCisJMHg3MDc0LCAweDgwMDEsIDB4OTYwMiwgMHgxYTA0LCAweGU2M2QsIDB4ODhmZiwgMHgwMTIwLCAweDI4MDAsCisJMHg5YzA2LCAweDE1OTAsIDB4MjA3OCwgMHgwODBjLCAweGU3NmIsIDB4MDU3MCwgMHgyNDAwLCAweDljMDYsCisJMHgwNTU4LCAweDY3MjAsIDB4OTc4NiwgMHgwMDA2LCAweDE1MzgsIDB4OTc4NiwgMHgwMDA3LCAweDA1MjAsCisJMHg4OGZmLCAweDExNDAsIDB4NjAxMCwgMHg5YjA2LCAweDExZjgsIDB4ODVmZiwgMHgwMTE4LCAweDYwNTQsCisJMHg5MTA2LCAweDExZDAsIDB4MDA5NiwgMHg2MDFjLCAweGQwODQsIDB4MDE0MCwgMHgwODBjLCAweGU5OTcsCisJMHgwODBjLCAweGQzYTAsIDB4MDgwYywgMHgxYWExLCAweDYwMjMsIDB4MDAwNywgMHg2MDE0LCAweDIwNDgsCisJMHgwODBjLCAweGNjODYsIDB4MDEyMCwgMHgwMDQ2LCAweDA4MGMsIDB4ZTZkZCwgMHgwMDRlLCAweDAwOWUsCisJMHgwODBjLCAweGFmNzQsIDB4ODhmZiwgMHgxMTk4LCAweDljZTAsIDB4MDAxOCwgMHgyMDAxLCAweDE4MWEsCisJMHgyMDA0LCAweDljMDIsIDB4MTIxMCwgMHgwODA0LCAweGU1ZjIsIDB4OTAwNiwgMHgwMTJlLCAweDAwYmUsCisJMHgwMDZlLCAweDAwN2UsIDB4MDA4ZSwgMHgwMGNlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDk4YzUsCisJMHgwMDAxLCAweDBjYTAsIDB4MDBiNiwgMHgwMDc2LCAweDAwNTYsIDB4MDA4NiwgMHg5MDQ2LCAweDIwMjksCisJMHgwMDAxLCAweDJjMjAsIDB4MjAxOSwgMHgwMDAyLCAweDYyMTAsIDB4MjI1OCwgMHgwMDk2LCAweDkwNGUsCisJMHgwODBjLCAweGE3NmIsIDB4MDA5ZSwgMHgwMDhlLCAweDkwM2UsIDB4MDgwYywgMHhhODE2LCAweDA4MGMsCisJMHhlNWUzLCAweDAwNWUsIDB4MDA3ZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBiNiwgMHgwMDQ2LCAweDAwNTYsCisJMHgwMDc2LCAweDAwYzYsIDB4MDE1NiwgMHgyYzIwLCAweDIxMjgsIDB4MjBhOSwgMHgwMDdmLCAweDkwMGUsCisJMHgwMDE2LCAweDAwMzYsIDB4MDgwYywgMHg2Njk5LCAweDExOTAsIDB4MDA1NiwgMHgwMDg2LCAweDkwNDYsCisJMHgyNTA4LCAweDIwMjksIDB4MDAwMSwgMHgwMDk2LCAweDkwNGUsIDB4MDgwYywgMHhhNzZiLCAweDAwOWUsCisJMHgwMDhlLCAweDkwM2UsIDB4MDgwYywgMHhhODE2LCAweDA4MGMsIDB4ZTVlMywgMHgwMDVlLCAweDAwM2UsCisJMHgwMDFlLCAweDgxMDgsIDB4MWYwNCwgMHhlNjcwLCAweDAxNWUsIDB4MDBjZSwgMHgwMDdlLCAweDAwNWUsCisJMHgwMDRlLCAweDAwYmUsIDB4MDAwNSwgMHgwMGI2LCAweDAwNzYsIDB4MDA1NiwgMHg2MjEwLCAweDIyNTgsCisJMHgwMDg2LCAweDkwNDYsIDB4MjAyOSwgMHgwMDAxLCAweDIwMTksIDB4MDA0OCwgMHgwMDk2LCAweDkwNGUsCisJMHgwODBjLCAweGE3NmIsIDB4MDA5ZSwgMHgwMDhlLCAweDkwM2UsIDB4MDgwYywgMHhhODE2LCAweDJjMjAsCisJMHgwODBjLCAweGU1ZTMsIDB4MDA1ZSwgMHgwMDdlLCAweDAwYmUsIDB4MDAwNSwgMHgwMGI2LCAweDAwNDYsCisJMHgwMDU2LCAweDAwNzYsIDB4MDBjNiwgMHgwMTU2LCAweDJjMjAsIDB4MjBhOSwgMHgwODAwLCAweDkwMGUsCisJMHgwMDE2LCAweDAwMzYsIDB4MDgwYywgMHg2Njk5LCAweDExYTAsIDB4MDA4NiwgMHg5MDQ2LCAweDI4MjgsCisJMHgwMDQ2LCAweDIwMjEsIDB4MDAwMSwgMHgwODBjLCAweGU5N2IsIDB4MDA0ZSwgMHgwMDk2LCAweDkwNGUsCisJMHgwODBjLCAweGE3NmIsIDB4MDA5ZSwgMHgwMDhlLCAweDkwM2UsIDB4MDgwYywgMHhhODE2LCAweDA4MGMsCisJMHhlNWUzLCAweDAwM2UsIDB4MDAxZSwgMHg4MTA4LCAweDFmMDQsIDB4ZTZiOCwgMHgwMTVlLCAweDAwY2UsCisJMHgwMDdlLCAweDAwNWUsIDB4MDA0ZSwgMHgwMGJlLCAweDAwMDUsIDB4MDAxNiwgMHgwMGY2LCAweDA4MGMsCisJMHhjYzg0LCAweDAxOTgsIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDQ2LCAweDAxODAsCisJMHhhODAwLCAweDkwN2QsIDB4MDEzOCwgMHhhODAzLCAweDAwMDAsIDB4YWI4MiwgMHgwODBjLCAweDZkMTcsCisJMHgyZjQ4LCAweDBjYjAsIDB4YWI4MiwgMHgwODBjLCAweDZkMTcsIDB4MDBmZSwgMHgwMDFlLCAweDAwMDUsCisJMHhhODAwLCAweDkwN2QsIDB4MDEzMCwgMHhhODAzLCAweDAwMDAsIDB4MDgwYywgMHg2ZDE3LCAweDJmNDgsCisJMHgwY2I4LCAweDA4MGMsIDB4NmQxNywgMHgwYzg4LCAweDAwZTYsIDB4MDA0NiwgMHgwMDM2LCAweDIwNjEsCisJMHgxY2QwLCAweDkwMDUsIDB4MTEzOCwgMHgyMDcxLCAweDE4MDAsIDB4NzQ1NCwgMHg3MDc0LCAweDgwMDEsCisJMHg5NDAyLCAweDEyZjgsIDB4MjEwMCwgMHg5YzA2LCAweDAxODgsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsCisJMHgwMTY4LCAweDYwMDgsIDB4OTIwNiwgMHgxMTUwLCAweDYzMjAsIDB4OTM4NiwgMHgwMDA5LCAweDAxYjAsCisJMHg2MDEwLCAweDkxYTAsIDB4MDAwNCwgMHgyNDI0LCAweDk0MDYsIDB4MDE0MCwgMHg5Y2UwLCAweDAwMTgsCisJMHgyMDAxLCAweDE4MWEsIDB4MjAwNCwgMHg5YzAyLCAweDEyMjAsIDB4MGMyMCwgMHg5MDg1LCAweDAwMDEsCisJMHgwMDA4LCAweDkwMDYsIDB4MDAzZSwgMHgwMDRlLCAweDAwZWUsIDB4MDAwNSwgMHg2MzFjLCAweGQzYzQsCisJMHgxZDY4LCAweDBjMzAsIDB4MDA5NiwgMHgwMDA2LCAweDA4MGMsIDB4MGZmZiwgMHgwMDBlLCAweDA5MGMsCisJMHgwZGQ1LCAweGFhZTIsIDB4YTg2NywgMHgwMTBkLCAweGE4OGUsIDB4MDAyNiwgMHgyMDEwLCAweDA4MGMsCisJMHhjYzc0LCAweDIwMDEsIDB4MDAwMCwgMHgwMTIwLCAweDIyMDAsIDB4OTA4MCwgMHgwMDE1LCAweDIwMDQsCisJMHgwMDJlLCAweGE4N2EsIDB4OTE4NiwgMHgwMDIwLCAweDAxMTAsIDB4YThlMywgMHhmZmZmLCAweGE5ODYsCisJMHhhYzc2LCAweGE4N2YsIDB4MDAwMCwgMHgyMDAxLCAweDE5OGQsIDB4MjAwNCwgMHhhODgyLCAweDkwMDYsCisJMHhhODAyLCAweGE4NmEsIDB4YTg4YSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDZkMTcsCisJMHgwMTJlLCAweDAwOWUsIDB4MDAwNSwgMHg2NzAwLCAweDk3ODYsIDB4MDAwMCwgMHgwMTU4LCAweDk3ODYsCisJMHgwMDAxLCAweDAxNDAsIDB4OTc4NiwgMHgwMDBhLCAweDAxMjgsIDB4OTc4NiwgMHgwMDA5LCAweDAxMTAsCisJMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMGU2LCAweDYwMTAsIDB4OTA3NSwgMHgwMTM4LCAweDAwYjYsCisJMHgyMDU4LCAweGI4YTAsIDB4MDBiZSwgMHg5MjA2LCAweDAwZWUsIDB4MDAwNSwgMHg5MDg1LCAweDAwMDEsCisJMHgwY2Q4LCAweDAwMTYsIDB4NjAwNCwgMHg5MDhlLCAweDAwMWUsIDB4MTFhMCwgMHg4MDA3LCAweDYxMzQsCisJMHg5MThjLCAweDAwZmYsIDB4OTEwNSwgMHg2MDM2LCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsCisJMHg2MDIzLCAweDAwMDUsIDB4MjAwMSwgMHgxOTg2LCAweDIwMDQsIDB4NjAxYSwgMHgwODBjLCAweDkxYjEsCisJMHgwODBjLCAweDk3NjMsIDB4MDAxZSwgMHgwMDA1LCAweGEwMDEsIDB4YTAwMSwgMHgwMDA1LCAweDYwMjQsCisJMHhkMGU0LCAweDAxNTgsIDB4ZDBjYywgMHgwMTE4LCAweDA4MGMsIDB4Y2ZjMCwgMHgwMDMwLCAweDA4MGMsCisJMHhlOTk3LCAweDA4MGMsIDB4ODc2ZiwgMHgwODBjLCAweGFmNDMsIDB4MDAwNSwgMHg5MjgwLCAweDAwMDgsCisJMHgyMDA0LCAweDkwODQsIDB4MDAwZiwgMHgwMDAyLCAweGU3Y2EsIDB4ZTdjYSwgMHhlN2NhLCAweGU3Y2MsCisJMHhlN2NhLCAweGU3Y2MsIDB4ZTdjYywgMHhlN2NhLCAweGU3Y2MsIDB4ZTdjYSwgMHhlN2NhLCAweGU3Y2EsCisJMHhlN2NhLCAweGU3Y2EsIDB4OTAwNiwgMHgwMDA1LCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDkyODAsCisJMHgwMDA4LCAweDIwMDQsIDB4OTA4NCwgMHgwMDBmLCAweDAwMDIsIDB4ZTdlMywgMHhlN2UzLCAweGU3ZTMsCisJMHhlN2UzLCAweGU3ZTMsIDB4ZTdlMywgMHhlN2YwLCAweGU3ZTMsIDB4ZTdlMywgMHhlN2UzLCAweGU3ZTMsCisJMHhlN2UzLCAweGU3ZTMsIDB4ZTdlMywgMHg2MDA3LCAweDAwM2IsIDB4NjAyZiwgMHgwMDA5LCAweDYwMTcsCisJMHgyYTAwLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxYjEsIDB4MDgwYywgMHg5NzYzLCAweDAwMDUsCisJMHgwMDk2LCAweDAwYzYsIDB4MjI2MCwgMHgwODBjLCAweGU5OTcsIDB4NjA0MywgMHgwMDAwLCAweDYwMjQsCisJMHhjMGY0LCAweGMwZTQsIDB4NjAyNiwgMHg2MDNiLCAweDAwMDAsIDB4MDBjZSwgMHgwMGQ2LCAweDIyNjgsCisJMHg5MTg2LCAweDAwMDcsIDB4MTkwNCwgMHhlODQ5LCAweDY4MTQsIDB4OTAwNSwgMHgwMTM4LCAweDIwNDgsCisJMHhhODdjLCAweGQwZmMsIDB4MTExOCwgMHgwMGRlLCAweDAwOWUsIDB4MDhhOCwgMHg2MDA3LCAweDAwM2EsCisJMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg5MWIxLCAweDA4MGMsIDB4OTc2MywgMHgwMGM2LCAweDJkNjAsCisJMHg2MTAwLCAweDkxODYsIDB4MDAwMiwgMHgxOTA0LCAweGU4YzAsIDB4NjAxNCwgMHg5MDA1LCAweDExMzgsCisJMHg2MDAwLCAweDkwODYsIDB4MDAwNywgMHgxOTBjLCAweDBkZDUsIDB4MDgwNCwgMHhlOGMwLCAweDIwNDgsCisJMHgwODBjLCAweGNjODYsIDB4MTEzMCwgMHgwMDI4LCAweDIwNDgsIDB4YTgwMCwgMHg5MDA1LCAweDFkZTAsCisJMHgyOTAwLCAweDIwNDgsIDB4YTg3YywgMHg5MDg0LCAweDAwMDMsIDB4OTA4NiwgMHgwMDAyLCAweDExNjgsCisJMHhhODdjLCAweGMwZGMsIDB4YzBmNCwgMHhhODdlLCAweGE4ODAsIDB4YzBmYywgMHhhODgyLCAweDIwMDksCisJMHgwMDQzLCAweDA4MGMsIDB4ZTExNCwgMHgwODA0LCAweGU4YzAsIDB4MjAwOSwgMHgwMDQxLCAweDA4MDQsCisJMHhlOGJhLCAweDkxODYsIDB4MDAwNSwgMHgxNWEwLCAweDY4MTQsIDB4MjA0OCwgMHhhODdjLCAweGQwYmMsCisJMHgxMTIwLCAweDAwZGUsIDB4MDA5ZSwgMHgwODA0LCAweGU3ZTMsIDB4ZDBiNCwgMHgwMTI4LCAweGQwZmMsCisJMHgwOTBjLCAweDBkZDUsIDB4MDgwNCwgMHhlODA0LCAweDYwMDcsIDB4MDAzYSwgMHg2MDAzLCAweDAwMDEsCisJMHgwODBjLCAweDkxYjEsIDB4MDgwYywgMHg5NzYzLCAweDAwYzYsIDB4MmQ2MCwgMHg2MTAwLCAweDkxODYsCisJMHgwMDAyLCAweDAxMjAsIDB4OTE4NiwgMHgwMDA0LCAweDE5MDQsIDB4ZThjMCwgMHg2ODE0LCAweDIwNDgsCisJMHhhOTdjLCAweGMxZjQsIDB4YzFkYywgMHhhOTdlLCAweGE5ODAsIDB4YzFmYywgMHhjMWJjLCAweGE5ODIsCisJMHgwMGY2LCAweDJjNzgsIDB4MDgwYywgMHgxNzU0LCAweDAwZmUsIDB4MjAwOSwgMHgwMDQyLCAweDA0ZDAsCisJMHgwMDM2LCAweDA4MGMsIDB4MGZmZiwgMHgwOTBjLCAweDBkZDUsIDB4YTg2NywgMHgwMTBkLCAweDkwMDYsCisJMHhhODAyLCAweGE4NmEsIDB4YTg4YSwgMHgyZDE4LCAweGFiOGUsIDB4YTg4NywgMHgwMDQ1LCAweDJjMDAsCisJMHhhODkyLCAweDYwMzgsIDB4YThhMiwgMHgyMzYwLCAweDYwMjQsIDB4YzBkZCwgMHg2MDI2LCAweDYwMTAsCisJMHgwMGI2LCAweDIwNTgsIDB4YjhhMCwgMHgwMGJlLCAweDIwMDQsIDB4NjM1NCwgMHhhYjdhLCAweGE4NzYsCisJMHg5MDA2LCAweGE4N2UsIDB4YTg4MiwgMHhhZDlhLCAweGFlOTYsIDB4YTg5ZiwgMHgwMDAxLCAweDA4MGMsCisJMHg2ZDE3LCAweDIwMTksIDB4MDA0NSwgMHg2MDA4LCAweDIwNjgsIDB4MDgwYywgMHhlMmMwLCAweDJkMDAsCisJMHg2MDBhLCAweDYwMjMsIDB4MDAwNiwgMHg2MDAzLCAweDAwMDcsIDB4OTAxZSwgMHg2MzFhLCAweDYzNDIsCisJMHgwMDNlLCAweDAwMzgsIDB4NjA0MywgMHgwMDAwLCAweDYwMDMsIDB4MDAwNywgMHgwODBjLCAweGUxMTQsCisJMHgwMGNlLCAweDAwZGUsIDB4MDA5ZSwgMHgwMDA1LCAweDkxODYsIDB4MDAxMywgMHgxMTI4LCAweDYwMDQsCisJMHg5MDgyLCAweDAwODUsIDB4MjAwOCwgMHgwMGMyLCAweDkxODYsIDB4MDAyNywgMHgxMTc4LCAweDA4MGMsCisJMHg5NjU3LCAweDAwMzYsIDB4MDA5NiwgMHg2MDE0LCAweDIwNDgsIDB4MjAxOSwgMHgwMDA0LCAweDA4MGMsCisJMHhlNmRkLCAweDAwOWUsIDB4MDAzZSwgMHgwODBjLCAweDk3NjMsIDB4MDAwNSwgMHg5MTg2LCAweDAwMTQsCisJMHgwZDcwLCAweDA4MGMsIDB4YWZkOSwgMHgwMDA1LCAweGU4ZjMsIDB4ZThmMSwgMHhlOGYxLCAweGU4ZjEsCisJMHhlOGYxLCAweGU4ZjEsIDB4ZThmMywgMHhlOGYxLCAweGU4ZjEsIDB4ZThmMSwgMHhlOGYxLCAweGU4ZjEsCisJMHhlOGYxLCAweDA4MGMsIDB4MGRkNSwgMHgwODBjLCAweDk2NTcsIDB4NjAwMywgMHgwMDBjLCAweDA4MGMsCisJMHg5NzYzLCAweDAwMDUsIDB4OTE4MiwgMHgwMDkyLCAweDEyMjAsIDB4OTE4MiwgMHgwMDg1LCAweDAyMDgsCisJMHgwMDFhLCAweDA4MGMsIDB4YWZkOSwgMHgwMDA1LCAweGU5MTEsIDB4ZTkxMSwgMHhlOTExLCAweGU5MTEsCisJMHhlOTEzLCAweGU5MzMsIDB4ZTkxMSwgMHhlOTExLCAweGU5MTEsIDB4ZTkxMSwgMHhlOTExLCAweGU5MTEsCisJMHhlOTExLCAweDA4MGMsIDB4MGRkNSwgMHgwMGQ2LCAweDJjNjgsIDB4MDgwYywgMHhhZWVkLCAweDAxYjAsCisJMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDFlLCAweDIwMDksIDB4MDI2ZSwgMHgyMTBjLCAweDYxM2EsCisJMHgyMDA5LCAweDAyNmYsIDB4MjEwYywgMHg2MTNlLCAweDYwMGIsIDB4ZmZmZiwgMHg2OTEwLCAweDYxMTIsCisJMHg2MDIzLCAweDAwMDQsIDB4MDgwYywgMHg5MWIxLCAweDA4MGMsIDB4OTc2MywgMHgyZDYwLCAweDA4MGMsCisJMHhhZjQzLCAweDAwZGUsIDB4MDAwNSwgMHgwODBjLCAweGFmNDMsIDB4MDAwNSwgMHgwMGU2LCAweDYwMTAsCisJMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwZWMsIDB4MDBlZSwgMHgwMDA1LCAweDIwMDksCisJMHgxODY3LCAweDIxMGMsIDB4ZDFlYywgMHgwNWIwLCAweDYwMDMsIDB4MDAwMiwgMHg2MDI0LCAweGMwZTUsCisJMHg2MDI2LCAweGQwY2MsIDB4MDE1MCwgMHgyMDAxLCAweDE5ODcsIDB4MjAwNCwgMHg2MDQyLCAweDIwMDksCisJMHgxODY3LCAweDIxMGMsIDB4ZDFmNCwgMHgxNTIwLCAweDAwYTAsIDB4MjAwOSwgMHgxODY3LCAweDIxMGMsCisJMHhkMWY0LCAweDAxMjgsIDB4NjAyNCwgMHhjMGU0LCAweDYwMjYsIDB4OTAwNiwgMHgwMGQ4LCAweDIwMDEsCisJMHgxOTg3LCAweDIwMGMsIDB4MjAwMSwgMHgxOTg1LCAweDIwMDQsIDB4OTEwMCwgMHg5MDgwLCAweDAwMGEsCisJMHg2MDQyLCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4YmMsIDB4MDBiZSwgMHgwMDA4LCAweDIxMDQsCisJMHg5MDA1LCAweDAxMTgsIDB4OTA4OCwgMHgwMDAzLCAweDBjZDAsIDB4MmMwYSwgMHg2MDBmLCAweDAwMDAsCisJMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMDE2LCAweDAwYzYsIDB4MDBlNiwgMHg2MTU0LCAweGI4YmMsCisJMHgyMDYwLCAweDhjZmYsIDB4MDE4MCwgMHg4NGZmLCAweDExMTgsIDB4NjA1NCwgMHg5MTA2LCAweDExMzgsCisJMHg2MDBjLCAweDIwNzIsIDB4MDgwYywgMHg4NzZmLCAweDA4MGMsIDB4YWY0MywgMHgwMDEwLCAweDljZjAsCisJMHgwMDAzLCAweDJlNjQsIDB4MGM3MCwgMHgwMGVlLCAweDAwY2UsIDB4MDAxZSwgMHgwMDA1LCAweDAwZDYsCisJMHgwMGI2LCAweDYwMTAsIDB4MjA1OCwgMHhiOGJjLCAweDIwNjgsIDB4OTAwNSwgMHgwMTMwLCAweDljMDYsCisJMHgwMTEwLCAweDY4MGMsIDB4MGNkMCwgMHg2MDBjLCAweDY4MGUsIDB4MDBiZSwgMHgwMGRlLCAweDAwMDUsCisJMHgwMDI2LCAweDAwMzYsIDB4MDE1NiwgMHgyMDExLCAweDE4MmMsIDB4MjIwNCwgMHg5MDg0LCAweDAwZmYsCisJMHgyMDE5LCAweDAyNmUsIDB4MjMzNCwgMHg5NjM2LCAweDE1MDgsIDB4ODMxOCwgMHgyMzM0LCAweDIyMDQsCisJMHg5MDg0LCAweGZmMDAsIDB4OTYzNiwgMHgxMWQwLCAweDIwMTEsIDB4MDI3MCwgMHgyMGE5LCAweDAwMDQsCisJMHg2MDEwLCAweDAwOTYsIDB4MjA0OCwgMHgyMDE5LCAweDAwMGEsIDB4MDgwYywgMHhiZjExLCAweDAwOWUsCisJMHgxMTY4LCAweDIwMTEsIDB4MDI3NCwgMHgyMGE5LCAweDAwMDQsIDB4NjAxMCwgMHgwMDk2LCAweDIwNDgsCisJMHgyMDE5LCAweDAwMDYsIDB4MDgwYywgMHhiZjExLCAweDAwOWUsIDB4MTEwMCwgMHgwMTVlLCAweDAwM2UsCisJMHgwMDJlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE4MDAsIDB4MDgwYywgMHg2MDQwLCAweDA4MGMsCisJMHgyZmY1LCAweDAwZWUsIDB4MDAwNSwgMHgwMDk2LCAweDAwMjYsIDB4MDgwYywgMHgwZmZmLCAweDA5MGMsCisJMHgwZGQ1LCAweGE4NWMsIDB4OTA4MCwgMHgwMDFhLCAweDIwYTAsIDB4MjBhOSwgMHgwMDBjLCAweGE4NjAsCisJMHgyMGU4LCAweDkwMDYsIDB4NDAwNCwgMHg5MTg2LCAweDAwNDYsIDB4MTExOCwgMHhhODY3LCAweDAxMzYsCisJMHgwMDM4LCAweGE4NjcsIDB4MDEzOCwgMHg5MTg2LCAweDAwNDEsIDB4MDExMCwgMHhhODdiLCAweDAwMDEsCisJMHg3MDM4LCAweDkwODQsIDB4ZmYwMCwgMHg3MjQwLCAweDkyOTQsIDB4ZmYwMCwgMHg4MDA3LCAweDkyMTUsCisJMHhhYTlhLCAweDkxODYsIDB4MDA0NiwgMHgxMTY4LCAweDcwMzgsIDB4OTA4NCwgMHgwMGZmLCAweDcyM2MsCisJMHg5Mjk0LCAweGZmMDAsIDB4OTIxNSwgMHhhYTllLCAweDcyM2MsIDB4OTI5NCwgMHgwMGZmLCAweGFhYTIsCisJMHgwMDYwLCAweDcwNDAsIDB4OTA4NCwgMHgwMGZmLCAweDcyNDQsIDB4OTI5NCwgMHhmZjAwLCAweDkyMTUsCisJMHhhYTllLCAweDcyNDQsIDB4OTI5NCwgMHgwMGZmLCAweGFhYTIsIDB4OTE4NiwgMHgwMDQ2LCAweDExMTgsCisJMHg5ZTkwLCAweDAwMTIsIDB4MDAxMCwgMHg5ZTkwLCAweDAwMWEsIDB4MjIwNCwgMHg4MDA3LCAweGE4YTYsCisJMHg4MjEwLCAweDIyMDQsIDB4ODAwNywgMHhhOGFhLCAweDgyMTAsIDB4MjIwNCwgMHg4MDA3LCAweGE4YWUsCisJMHg4MjEwLCAweDIyMDQsIDB4ODAwNywgMHhhOGIyLCAweDgyMTAsIDB4OTE4NiwgMHgwMDQ2LCAweDExYjgsCisJMHg5ZTkwLCAweDAwMTYsIDB4MjIwNCwgMHg4MDA3LCAweGE4YjYsIDB4ODIxMCwgMHgyMjA0LCAweDgwMDcsCisJMHhhOGJhLCAweDgyMTAsIDB4MjIwNCwgMHg4MDA3LCAweGE4YmUsIDB4ODIxMCwgMHgyMjA0LCAweDgwMDcsCisJMHhhOGMyLCAweDgyMTAsIDB4MjAxMSwgMHgwMjA1LCAweDIwMTMsIDB4MDAwMSwgMHgwMGIwLCAweDllOTAsCisJMHgwMDFlLCAweDIyMDQsIDB4ODAwNywgMHhhOGI2LCAweDgyMTAsIDB4MjIwNCwgMHg4MDA3LCAweGE4YmEsCisJMHgyMDExLCAweDAyMDUsIDB4MjAxMywgMHgwMDAxLCAweDIwMTEsIDB4MDI2MCwgMHgyMjA0LCAweDgwMDcsCisJMHhhOGJlLCAweDgyMTAsIDB4MjIwNCwgMHg4MDA3LCAweGE4YzIsIDB4OTE4NiwgMHgwMDQ2LCAweDExMTgsCisJMHgyMDExLCAweDAyNjIsIDB4MDAxMCwgMHgyMDExLCAweDAyNmEsIDB4MDE0NiwgMHgwMWQ2LCAweDAwMzYsCisJMHgyMGE5LCAweDAwMDEsIDB4MjAxOSwgMHgwMDA4LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDkwODAsCisJMHgwMDMxLCAweDIwYTAsIDB4MjIwNCwgMHg4MDA3LCAweDQwMDQsIDB4ODIxMCwgMHg4MzE5LCAweDFkZDAsCisJMHgwMDNlLCAweDAxY2UsIDB4MDEzZSwgMHgyMDExLCAweDAyMDUsIDB4MjAxMywgMHgwMDAwLCAweDAwMmUsCisJMHgwODBjLCAweDZkMTcsIDB4MDA5ZSwgMHgwMDA1LCAweDAwZTYsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsCisJMHhiODAwLCAweDAwYmUsIDB4ZDBmYywgMHgwMTA4LCAweDAwMTEsIDB4MDBlZSwgMHgwMDA1LCAweGE4ODAsCisJMHhjMGU1LCAweGE4ODIsIDB4MDAwNSwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgwMDc2LCAweDAwNjYsCisJMHgwMDU2LCAweDAwNDYsIDB4MDAyNiwgMHgwMDE2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMjksCisJMHgxOWVmLCAweDI1MmMsIDB4MjAyMSwgMHgxOWY1LCAweDI0MjQsIDB4MjA2MSwgMHgxY2QwLCAweDIwNzEsCisJMHgxODAwLCAweDc2NTQsIDB4NzA3NCwgMHg5NjA2LCAweDA1NzgsIDB4NjcyMCwgMHg5Nzg2LCAweDAwMDEsCisJMHgwMTE4LCAweDk3ODYsIDB4MDAwOCwgMHgxNTAwLCAweDI1MDAsIDB4OWMwNiwgMHgwMWU4LCAweDI0MDAsCisJMHg5YzA2LCAweDAxZDAsIDB4MDgwYywgMHhlNzZiLCAweDAxYjgsIDB4MDgwYywgMHhlNzdiLCAweDExYTAsCisJMHg2MDAwLCAweDkwODYsIDB4MDAwNCwgMHgxMTIwLCAweDAwMTYsIDB4MDgwYywgMHgxYWExLCAweDAwMWUsCisJMHgwODBjLCAweGNlN2QsIDB4MTExMCwgMHgwODBjLCAweDMyNDcsIDB4MDgwYywgMHhjZThlLCAweDExMTAsCisJMHgwODBjLCAweGI5MDUsIDB4MDgwYywgMHhhZjc0LCAweDljZTAsIDB4MDAxOCwgMHgyMDAxLCAweDE4MWEsCisJMHgyMDA0LCAweDljMDIsIDB4MTIwOCwgMHgwODU4LCAweDAxMmUsIDB4MDAxZSwgMHgwMDJlLCAweDAwNGUsCisJMHgwMDVlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMDA1LCAweDIwMDEsCisJMHgxODEwLCAweDIwMDQsIDB4ZDBkYywgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHgxODM3LCAweDIwMDQsCisJMHhkMDljLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDAwMzYsIDB4MDA0NiwgMHgwODBjLCAweGQzODgsCisJMHgwMTY4LCAweDIwMTksIDB4ZmZmZiwgMHg5MDA1LCAweDAxMjgsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsCisJMHhiYmEwLCAweDAwYmUsIDB4MjAyMSwgMHgwMDA0LCAweDA4MGMsIDB4NGQzNiwgMHgwMDRlLCAweDAwM2UsCisJMHgwMDBlLCAweDYwMDQsIDB4OTA4NiwgMHgwMDAxLCAweDExMjgsIDB4MDgwYywgMHhhOGRjLCAweDA4MGMsCisJMHhhZjc0LCAweDkwMDYsIDB4MDAwNSwgMHgwMGU2LCAweDAwYzYsIDB4MDBiNiwgMHgwMDQ2LCAweDIwNjEsCisJMHgxY2QwLCAweDIwNzEsIDB4MTgwMCwgMHg3NDU0LCAweDcwNzQsIDB4ODAwMSwgMHg5NDAyLCAweDEyZDgsCisJMHgyMTAwLCAweDljMDYsIDB4MDE2OCwgMHg2MDAwLCAweDkwODYsIDB4MDAwMCwgMHgwMTQ4LCAweDYwMTAsCisJMHgyMDU4LCAweGI4YTAsIDB4OTIwNiwgMHgxMTIwLCAweDYwMDQsIDB4OTA4NiwgMHgwMDAyLCAweDAxNDAsCisJMHg5Y2UwLCAweDAwMTgsIDB4MjAwMSwgMHgxODFhLCAweDIwMDQsIDB4OWMwMiwgMHgxMjIwLCAweDBjNDAsCisJMHg5MDg1LCAweDAwMDEsIDB4MDAwOCwgMHg5MDA2LCAweDAwNGUsIDB4MDBiZSwgMHgwMGNlLCAweDAwZWUsCisJMHgwMDA1LCAweDAxMjYsIDB4MDAwNiwgMHgwMGU2LCAweDAwMTYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsCisJMHgxODQwLCAweGQ1YTQsIDB4MDExOCwgMHg3MDA0LCAweDgwMDAsIDB4NzAwNiwgMHhkNWI0LCAweDAxMTgsCisJMHg3MDAwLCAweDgwMDAsIDB4NzAwMiwgMHhkNWFjLCAweDAxNzgsIDB4MjUwMCwgMHg5MDg0LCAweDAwMDcsCisJMHg5MDhlLCAweDAwMDMsIDB4MDE0OCwgMHg5MDhlLCAweDAwMDQsIDB4MDEzMCwgMHg5MDhlLCAweDAwMDUsCisJMHgwMTE4LCAweDIwNzEsIDB4ZmZmNiwgMHgwMDg5LCAweDAwMWUsIDB4MDBlZSwgMHgwMDBlLCAweDAxMmUsCisJMHgwMDA1LCAweDAxMjYsIDB4MDAwNiwgMHgwMGU2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGZmZWUsCisJMHgwMDIxLCAweDAwZWUsIDB4MDAwZSwgMHgwMTJlLCAweDAwMDUsIDB4MmUwNSwgMHg4MDAwLCAweDIwNzcsCisJMHgxMjIwLCAweDhlNzAsIDB4MmUwNSwgMHg4MDAwLCAweDIwNzcsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsCisJMHhmZmVjLCAweDBjOTksIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhmZmYwLCAweDBjNjksCisJMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwgMHgwMDA2LCAweDAwZTYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsCisJMHgxODQwLCAweDcwMTQsIDB4ODAwMCwgMHg3MDE2LCAweDAwZWUsIDB4MDAwZSwgMHgwMTJlLCAweDAwMDUsCisJMHgwMDAzLCAweDAwMGIsIDB4MDc5ZSwgMHgwMDAwLCAweGMwMDAsIDB4MDAwMSwgMHg4MDY0LCAweDAwMDgsCisJMHgwMDEwLCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDAxMDEsIDB4MDAwOCwgMHg0NDA3LCAweDAwMDMsCisJMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAwLCAweDU4MGQsIDB4MDAwYiwgMHg3OWE4LCAweDAwMGIsCisJMHg1MGVlLCAweDAwMGIsIDB4NGMwYSwgMHgwMDAzLCAweGJhYzAsIDB4MDAwOSwgMHgwMDhhLCAweDAwMDAsCisJMHgwYzBhLCAweDAwMGIsIDB4MTVmZSwgMHgwMDA4LCAweDM0MGEsIDB4MDAwMywgMHhjNGMwLCAweDAwMDksCisJMHg3MDAwLCAweDAwMDAsIDB4ZmZhMCwgMHgwMDAxLCAweDIwMDAsIDB4MDAwMCwgMHgxNjY4LCAweDAwMGIsCisJMHg4MDhjLCAweDAwMDgsIDB4MDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwNywgMHg0MDI4LCAweDAwMDAsCisJMHg0MDQ3LCAweDAwMGEsIDB4ODA4YywgMHgwMDA4LCAweDAwMDIsIDB4MDAwMCwgMHgwODIyLCAweDAwMDMsCisJMHg0MDIyLCAweDAwMDAsIDB4MDAyOCwgMHgwMDBiLCAweDQxMjIsIDB4MDAwOCwgMHg5NGMwLCAweDAwMDksCisJMHhmZjAwLCAweDAwMDgsIDB4ZmZlMCwgMHgwMDA5LCAweDA1MDAsIDB4MDAwOCwgMHgwYTkzLCAweDAwMGIsCisJMHg0NDQ3LCAweDAwMDIsIDB4MGU5MCwgMHgwMDAzLCAweDBiZmUsIDB4MDAwOCwgMHgxMWEwLCAweDAwMDEsCisJMHgxMjZlLCAweDAwMDMsIDB4MGNhMCwgMHgwMDAxLCAweDEyNmUsIDB4MDAwMywgMHg5MTgwLCAweDAwMDEsCisJMHgwMDA0LCAweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMCwgMHg3ZjYyLCAweDAwMDgsCisJMHg4MDY2LCAweDAwMDAsIDB4MDAwOSwgMHgwMDA4LCAweDQ0MzYsIDB4MDAwYiwgMHg4MDhjLCAweDAwMDgsCisJMHgwMDAwLCAweDAwMDgsIDB4MDA2MCwgMHgwMDA4LCAweDgwNjIsIDB4MDAwOCwgMHgwMDA0LCAweDAwMDAsCisJMHg4MDY2LCAweDAwMDAsIDB4MDQxMSwgMHgwMDAwLCAweDQ0M2UsIDB4MDAwMywgMHgwM2ZlLCAweDAwMDAsCisJMHg0M2UwLCAweDAwMDEsIDB4MGU2YiwgMHgwMDBiLCAweGMyYzAsIDB4MDAwOSwgMHgwMGZmLCAweDAwMDgsCisJMHgwMmUwLCAweDAwMDEsIDB4MGU2YiwgMHgwMDBiLCAweDkxODAsIDB4MDAwMSwgMHgwMDA1LCAweDAwMDgsCisJMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAwLCAweDdmNjIsIDB4MDAwOCwgMHg4MDY2LCAweDAwMDAsCisJMHgwMDE5LCAweDAwMDAsIDB4NDQ0ZCwgMHgwMDBiLCAweDAyNDAsIDB4MDAwMiwgMHgwYTY4LCAweDAwMDMsCisJMHgwMGZlLCAweDAwMDAsIDB4MzI2YiwgMHgwMDBiLCAweDAyNDgsIDB4MDAwYSwgMHgwODVjLCAweDAwMDMsCisJMHg5MTgwLCAweDAwMDEsIDB4MDAwNiwgMHgwMDA4LCAweDdmNjIsIDB4MDAwOCwgMHg4MDAyLCAweDAwMDgsCisJMHgwMDAzLCAweDAwMDgsIDB4ODA2NiwgMHgwMDAwLCAweDAyMGEsIDB4MDAwMCwgMHg0NDViLCAweDAwMDMsCisJMHgxMTJhLCAweDAwMDAsIDB4MDAyZSwgMHgwMDA4LCAweDAyMmMsIDB4MDAwOCwgMHgzYTQ0LCAweDAwMDIsCisJMHgwYzBhLCAweDAwMGIsIDB4ODA4YywgMHgwMDA4LCAweDAwMDIsIDB4MDAwMCwgMHgxNzYwLCAweDAwMDgsCisJMHg4MDYyLCAweDAwMDgsIDB4MDAwZiwgMHgwMDA4LCAweDgwNjYsIDB4MDAwMCwgMHgwMDExLCAweDAwMDgsCisJMHg0NDY4LCAweDAwMDMsIDB4MDFmZSwgMHgwMDA4LCAweDQyZTAsIDB4MDAwOSwgMHgwZTVjLCAweDAwMDMsCisJMHgwMGZlLCAweDAwMDAsIDB4NDNlMCwgMHgwMDAxLCAweDBlNWMsIDB4MDAwMywgMHgxNzM0LCAweDAwMDAsCisJMHgxNTMwLCAweDAwMDAsIDB4MTYzMiwgMHgwMDA4LCAweDBkMmEsIDB4MDAwOCwgMHg5ODgwLCAweDAwMDEsCisJMHgwMDEwLCAweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMCwgMHg3ZjYyLCAweDAwMDgsCisJMHg4MDY2LCAweDAwMDAsIDB4MWUwYSwgMHgwMDA4LCAweDQ0N2EsIDB4MDAwMywgMHg4MDhhLCAweDAwMDgsCisJMHgwMDAzLCAweDAwMDgsIDB4MWE2MCwgMHgwMDAwLCAweDgwNjIsIDB4MDAwOCwgMHgwMDAyLCAweDAwMDAsCisJMHg1ODgwLCAweDAwMGIsIDB4ODA2NiwgMHgwMDAwLCAweDM2NzksIDB4MDAwMCwgMHg0NDgzLCAweDAwMDMsCisJMHg1ODg0LCAweDAwMDMsIDB4M2VmZSwgMHgwMDA4LCAweDdmNGYsIDB4MDAwMiwgMHgwODhhLCAweDAwMGIsCisJMHgwZDAwLCAweDAwMDAsIDB4MDA5MiwgMHgwMDBjLCAweDgwNTQsIDB4MDAwOCwgMHgwMDExLCAweDAwMDgsCisJMHg4MDc0LCAweDAwMDAsIDB4MTAxMCwgMHgwMDA4LCAweDFlZmUsIDB4MDAwMCwgMHgzMDBhLCAweDAwMGIsCisJMHgwMGM4LCAweDAwMGMsIDB4MDAwYSwgMHgwMDBiLCAweDAwZmUsIDB4MDAwMCwgMHgzNDlhLCAweDAwMDMsCisJMHgxYTYwLCAweDAwMDAsIDB4ODA2MiwgMHgwMDA4LCAweDAwMDcsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsCisJMHgwMjMxLCAweDAwMDgsIDB4NDQ5OSwgMHgwMDBiLCAweDAzZmUsIDB4MDAwMCwgMHgwNGQwLCAweDAwMDEsCisJMHgwY2MwLCAweDAwMGIsIDB4ODJjMCwgMHgwMDAxLCAweDFmMDAsIDB4MDAwMCwgMHhmZmEwLCAweDAwMDEsCisJMHgwNDAwLCAweDAwMDAsIDB4MDhhZiwgMHgwMDAzLCAweDE0YzAsIDB4MDAwYiwgMHgwMWZlLCAweDAwMDgsCisJMHgwNTgwLCAweDAwMDksIDB4N2YwNiwgMHgwMDAwLCAweDAyZmUsIDB4MDAwOCwgMHhmZmMwLCAweDAwMDEsCisJMHgwMGZmLCAweDAwMDgsIDB4MDY5MCwgMHgwMDAxLCAweDEwYWYsIDB4MDAwMywgMHg3ZjA4LCAweDAwMDgsCisJMHg4NGMwLCAweDAwMDEsIDB4ZmYwMCwgMHgwMDA4LCAweDA4YzAsIDB4MDAwMywgMHgwMGZlLCAweDAwMDAsCisJMHgzNGI2LCAweDAwMGIsIDB4ODA3MiwgMHgwMDAwLCAweDEwMTAsIDB4MDAwOCwgMHgzOTQ0LCAweDAwMDIsCisJMHgwOGIxLCAweDAwMDMsIDB4MDBiYSwgMHgwMDAzLCAweDgwNzIsIDB4MDAwMCwgMHgyMDIwLCAweDAwMDgsCisJMHgzOTQ1LCAweDAwMGEsIDB4MDhiNiwgMHgwMDBiLCAweDM5NDYsIDB4MDAwYSwgMHgwY2M3LCAweDAwMDMsCisJMHgwMDAwLCAweDAwMDcsIDB4Mzk0MywgMHgwMDBhLCAweDA4YzcsIDB4MDAwYiwgMHgwMGJhLCAweDAwMDMsCisJMHgwMGZlLCAweDAwMDAsIDB4MzRjNSwgMHgwMDAzLCAweDgwNzIsIDB4MDAwMCwgMHgxMDAwLCAweDAwMDAsCisJMHgwMGM3LCAweDAwMDMsIDB4ODA3MiwgMHgwMDAwLCAweDIwMDAsIDB4MDAwMCwgMHg0MDAwLCAweDAwMGYsCisJMHgxYzYwLCAweDAwMDAsIDB4MWI2MiwgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwgMHgwMjMxLCAweDAwMDgsCisJMHg0NGNjLCAweDAwMGIsIDB4NThjZCwgMHgwMDBiLCAweDAxNDAsIDB4MDAwOCwgMHgwMjQyLCAweDAwMDAsCisJMHgxZjQzLCAweDAwMDIsIDB4MGNkYiwgMHgwMDBiLCAweDBkNDQsIDB4MDAwMCwgMHgwZDQ2LCAweDAwMDgsCisJMHgwMzQ4LCAweDAwMDgsIDB4MDQ0YSwgMHgwMDA4LCAweDAzMGEsIDB4MDAwOCwgMHgwNDBjLCAweDAwMDAsCisJMHgwZDA2LCAweDAwMDAsIDB4MGQwOCwgMHgwMDA4LCAweDAwZGYsIDB4MDAwMywgMHgwMzQ0LCAweDAwMDgsCisJMHgwNDQ2LCAweDAwMDgsIDB4MDU0OCwgMHgwMDA4LCAweDA2NGEsIDB4MDAwMCwgMHgxOTQ4LCAweDAwMGEsCisJMHgwOGUyLCAweDAwMDMsIDB4MGQ0YSwgMHgwMDA4LCAweDU4ZTIsIDB4MDAwMywgMHgzZWZlLCAweDAwMDgsCisJMHg3ZjRmLCAweDAwMDIsIDB4MDhlOSwgMHgwMDBiLCAweDgwMDAsIDB4MDAwMCwgMHgwMDAxLCAweDAwMDAsCisJMHgwMDkyLCAweDAwMGMsIDB4ODA1NCwgMHgwMDA4LCAweDAwMDEsIDB4MDAwMCwgMHg4MDc0LCAweDAwMDAsCisJMHgyMDIwLCAweDAwMDgsIDB4NDAwMCwgMHgwMDBmLCAweDNhNDAsIDB4MDAwYSwgMHgwYzBkLCAweDAwMDMsCisJMHgyYjI0LCAweDAwMDgsIDB4MmIyNCwgMHgwMDA4LCAweDU4ZjIsIDB4MDAwYiwgMHg4MDU0LCAweDAwMDgsCisJMHgwMDAyLCAweDAwMDAsIDB4MTI0MiwgMHgwMDAyLCAweDA5NDAsIDB4MDAwMywgMHgzYTQ1LCAweDAwMGEsCisJMHgwOTJmLCAweDAwMDMsIDB4ODA3MiwgMHgwMDAwLCAweDEwMDAsIDB4MDAwMCwgMHgzOTQ1LCAweDAwMGEsCisJMHgwOGZmLCAweDAwMDMsIDB4ODA3MiwgMHgwMDAwLCAweDMwMTAsIDB4MDAwMCwgMHgxZTEwLCAweDAwMGEsCisJMHg3ZjNjLCAweDAwMDAsIDB4MDkyYSwgMHgwMDAzLCAweDFkMDAsIDB4MDAwMiwgMHg3ZjNhLCAweDAwMDAsCisJMHgwZDYwLCAweDAwMDAsIDB4N2Y2MiwgMHgwMDA4LCAweDgwNjYsIDB4MDAwMCwgMHgwMDA5LCAweDAwMDgsCisJMHg0NTA4LCAweDAwMGIsIDB4MDBmZSwgMHgwMDAwLCAweDM1MjcsIDB4MDAwYiwgMHgxYzYwLCAweDAwMDAsCisJMHg4MDYyLCAweDAwMDgsIDB4MDAwMSwgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwgMHgwMDA5LCAweDAwMDgsCisJMHg0NTEwLCAweDAwMGIsIDB4MDBmZSwgMHgwMDAwLCAweDMyNDMsIDB4MDAwYiwgMHgwMDM4LCAweDAwMDAsCisJMHgwMDYwLCAweDAwMDgsIDB4ODA2MiwgMHgwMDA4LCAweDAwMTksIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsCisJMHgwMDA5LCAweDAwMDgsIDB4NDUxOSwgMHgwMDBiLCAweDgwYzAsIDB4MDAwOSwgMHgwMGZmLCAweDAwMDgsCisJMHg3ZjNlLCAweDAwMDgsIDB4MGQ2MCwgMHgwMDAwLCAweDBlZmUsIDB4MDAwOCwgMHgxZjgwLCAweDAwMDEsCisJMHg3ZjYyLCAweDAwMDgsIDB4ODA2NiwgMHgwMDAwLCAweDAwMDksIDB4MDAwOCwgMHg0NTIzLCAweDAwMGIsCisJMHgwMDNhLCAweDAwMDgsIDB4MWRmZSwgMHgwMDAwLCAweDAxMDQsIDB4MDAwYiwgMHgwMDM2LCAweDAwMDgsCisJMHgwMGM4LCAweDAwMGMsIDB4MDE0MCwgMHgwMDBiLCAweDgwNzQsIDB4MDAwMCwgMHgyMDAwLCAweDAwMDAsCisJMHg4MDcyLCAweDAwMDAsIDB4MjAwMCwgMHgwMDAwLCAweDAxNDAsIDB4MDAwYiwgMHgzYTQ0LCAweDAwMDIsCisJMHgwYTcxLCAweDAwMGIsIDB4ODA3NCwgMHgwMDAwLCAweDEwMDAsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsCisJMHgxMDAwLCAweDAwMDAsIDB4MmQwZSwgMHgwMDAwLCAweDJkMGUsIDB4MDAwMCwgMHgzNjQwLCAweDAwMDMsCisJMHgyNmZlLCAweDAwMDgsIDB4MjZmZSwgMHgwMDA4LCAweDI3MDAsIDB4MDAwOCwgMHgyNzAwLCAweDAwMDgsCisJMHgwMGQwLCAweDAwMDksIDB4MGQ1MiwgMHgwMDBiLCAweDgwNzQsIDB4MDAwMCwgMHg0MDQwLCAweDAwMDgsCisJMHg1OTQwLCAweDAwMDMsIDB4NTBlZSwgMHgwMDBiLCAweDNhNDYsIDB4MDAwYSwgMHgwZDUyLCAweDAwMGIsCisJMHgzYTQ3LCAweDAwMDIsIDB4MDk0ZCwgMHgwMDBiLCAweDgwNTQsIDB4MDAwOCwgMHgwMDA0LCAweDAwMDAsCisJMHg4MDc0LCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLCAweDgwNzIsIDB4MDAwMCwgMHgzMDAwLCAweDAwMDgsCisJMHgwMTljLCAweDAwMDMsIDB4OTJjMCwgMHgwMDA5LCAweDBmYzgsIDB4MDAwMCwgMHgwODBhLCAweDAwMDMsCisJMHgxMjQ2LCAweDAwMGEsIDB4MGUzYSwgMHgwMDAzLCAweDFhNjAsIDB4MDAwMCwgMHg4MDYyLCAweDAwMDgsCisJMHgwMDAyLCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDM2MmEsIDB4MDAwMCwgMHg0NTU3LCAweDAwMGIsCisJMHgyMDAwLCAweDAwMDAsIDB4MjAwMCwgMHgwMDAwLCAweDIxMDIsIDB4MDAwMCwgMHgyMTAyLCAweDAwMDAsCisJMHgyMjA0LCAweDAwMDAsIDB4MjIwNCwgMHgwMDAwLCAweDIzMDYsIDB4MDAwMCwgMHgyMzA2LCAweDAwMDAsCisJMHgyNDA4LCAweDAwMDAsIDB4MjQwOCwgMHgwMDAwLCAweDI1MGEsIDB4MDAwMCwgMHgyNTBhLCAweDAwMDAsCisJMHgyNjBjLCAweDAwMDAsIDB4MjYwYywgMHgwMDAwLCAweDI3MGUsIDB4MDAwMCwgMHgyNzBlLCAweDAwMDAsCisJMHgyODEwLCAweDAwMDAsIDB4MjgxMCwgMHgwMDAwLCAweDI5MTIsIDB4MDAwMCwgMHgyOTEyLCAweDAwMDAsCisJMHgxYTYwLCAweDAwMDAsIDB4ODA2MiwgMHgwMDA4LCAweDAwMDcsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsCisJMHgwMDUyLCAweDAwMDAsIDB4NDU3MSwgMHgwMDAzLCAweDkyYzAsIDB4MDAwOSwgMHgwNzgwLCAweDAwMDgsCisJMHgwZTU2LCAweDAwMDMsIDB4MTI0YiwgMHgwMDAyLCAweDA5N2EsIDB4MDAwMywgMHgyZTRkLCAweDAwMDIsCisJMHgyZTRkLCAweDAwMDIsIDB4MGE0MCwgMHgwMDAzLCAweDNhNDYsIDB4MDAwYSwgMHgwZDhhLCAweDAwMGIsCisJMHg1OTdjLCAweDAwMDMsIDB4ODA1NCwgMHgwMDA4LCAweDAwMDQsIDB4MDAwMCwgMHgxMjQzLCAweDAwMGEsCisJMHgwOTk4LCAweDAwMDMsIDB4ODAxMCwgMHgwMDA4LCAweDAwMGQsIDB4MDAwMCwgMHgwMjFiLCAweDAwMGMsCisJMHgxOTQ4LCAweDAwMGEsIDB4MDk4NywgMHgwMDBiLCAweDAyMTAsIDB4MDAwNCwgMHgxODEwLCAweDAwMDAsCisJMHgwMjFiLCAweDAwMGMsIDB4MDE5OCwgMHgwMDBiLCAweDE5NDgsIDB4MDAwYSwgMHgwOThlLCAweDAwMGIsCisJMHgxMjQzLCAweDAwMGEsIDB4MGE0MywgMHgwMDAzLCAweDE5NGQsIDB4MDAwYSwgMHgwOTkyLCAweDAwMDMsCisJMHgxMjQzLCAweDAwMGEsIDB4MGE0YSwgMHgwMDAzLCAweDU5OTIsIDB4MDAwMywgMHg4MDU0LCAweDAwMDgsCisJMHgwMDA0LCAweDAwMDAsIDB4MDIxMCwgMHgwMDA0LCAweDE4MTAsIDB4MDAwMCwgMHgwMjFiLCAweDAwMGMsCisJMHg4MDc0LCAweDAwMDAsIDB4ZjAwMCwgMHgwMDA4LCAweDgwNzIsIDB4MDAwMCwgMHgzMDAwLCAweDAwMDgsCisJMHgwZDMwLCAweDAwMDAsIDB4M2E0MiwgMHgwMDAyLCAweDBkYTIsIDB4MDAwYiwgMHgxNWZlLCAweDAwMDgsCisJMHgzNDYxLCAweDAwMGIsIDB4MDAwYSwgMHgwMDBiLCAweDgwNzQsIDB4MDAwMCwgMHgwNTAxLCAweDAwMDAsCisJMHg4MDEwLCAweDAwMDgsIDB4MDAwYywgMHgwMDA4LCAweDAyMWIsIDB4MDAwYywgMHgwMDBhLCAweDAwMGIsCisJMHhiYmUwLCAweDAwMDksIDB4MDAzMCwgMHgwMDA4LCAweDBkYjgsIDB4MDAwMywgMHgxOGZlLCAweDAwMDAsCisJMHgzY2UwLCAweDAwMDksIDB4MDliNSwgMHgwMDAzLCAweDE1ZmUsIDB4MDAwOCwgMHgzY2UwLCAweDAwMDksCisJMHgwOWI1LCAweDAwMDMsIDB4MDIwYiwgMHgwMDA0LCAweDgwNzYsIDB4MDAwOCwgMHgwMDQwLCAweDAwMDAsCisJMHgwMjA4LCAweDAwMGIsIDB4ODA3NiwgMHgwMDA4LCAweDAwNDEsIDB4MDAwOCwgMHgwMjA4LCAweDAwMGIsCisJMHhiYmUwLCAweDAwMDksIDB4MDAzMiwgMHgwMDAwLCAweDBkYmQsIDB4MDAwMywgMHgzYzFlLCAweDAwMDgsCisJMHgwMjA4LCAweDAwMGIsIDB4YmJlMCwgMHgwMDA5LCAweDAwM2IsIDB4MDAwMCwgMHgwZGMyLCAweDAwMGIsCisJMHgzYzIwLCAweDAwMDAsIDB4MDIwOCwgMHgwMDBiLCAweGJiZTAsIDB4MDAwOSwgMHgwMDM1LCAweDAwMDgsCisJMHgwZGM4LCAweDAwMGIsIDB4ODA3MiwgMHgwMDAwLCAweDgwMDAsIDB4MDAwMCwgMHgwMzg0LCAweDAwMGIsCisJMHhiYmUwLCAweDAwMDksIDB4MDAzNiwgMHgwMDA4LCAweDBhYTUsIDB4MDAwYiwgMHhiYmUwLCAweDAwMDksCisJMHgwMDM3LCAweDAwMDAsIDB4MGRlOSwgMHgwMDBiLCAweDE4ZmUsIDB4MDAwMCwgMHgzY2UwLCAweDAwMDksCisJMHgwZGI1LCAweDAwMGIsIDB4ODA3NiwgMHgwMDA4LCAweDAwNDAsIDB4MDAwMCwgMHgxYTYwLCAweDAwMDAsCisJMHg4MDYyLCAweDAwMDgsIDB4MDAwZCwgMHgwMDAwLCAweDI2MDQsIDB4MDAwOCwgMHgyNjA0LCAweDAwMDgsCisJMHgyNzA2LCAweDAwMDgsIDB4MjcwNiwgMHgwMDA4LCAweDI4MDgsIDB4MDAwMCwgMHgyODA4LCAweDAwMDAsCisJMHgyOTBhLCAweDAwMDAsIDB4MjkwYSwgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwgMHgwNDIyLCAweDAwMDAsCisJMHg0NWUwLCAweDAwMGIsIDB4MDIxMCwgMHgwMDA0LCAweDgwNTQsIDB4MDAwOCwgMHgwMDA0LCAweDAwMDAsCisJMHg4MDc0LCAweDAwMDAsIDB4ZjAwMCwgMHgwMDA4LCAweDgwNzIsIDB4MDAwMCwgMHhiMDAwLCAweDAwMDAsCisJMHgwMTljLCAweDAwMDMsIDB4YmJlMCwgMHgwMDA5LCAweDAwMzgsIDB4MDAwMCwgMHgwZGZiLCAweDAwMGIsCisJMHgxOGZlLCAweDAwMDAsIDB4M2NlMCwgMHgwMDA5LCAweDA5ZjgsIDB4MDAwMywgMHgxNWZlLCAweDAwMDgsCisJMHgzY2UwLCAweDAwMDksIDB4MGRiMSwgMHgwMDAzLCAweDAyMGIsIDB4MDAwNCwgMHg4MDc2LCAweDAwMDgsCisJMHgwMDQwLCAweDAwMDAsIDB4ODA3MiwgMHgwMDAwLCAweDgwMDAsIDB4MDAwMCwgMHgwMjY4LCAweDAwMGIsCisJMHg4MDc2LCAweDAwMDgsIDB4MDA0MiwgMHgwMDA4LCAweDAyMDgsIDB4MDAwYiwgMHhiYmUwLCAweDAwMDksCisJMHgwMDE2LCAweDAwMDAsIDB4MGUwOCwgMHgwMDBiLCAweDgwNzQsIDB4MDAwMCwgMHgwODA4LCAweDAwMDgsCisJMHgzYTQ0LCAweDAwMDIsIDB4MGMwYywgMHgwMDBiLCAweDgwNzQsIDB4MDAwMCwgMHgwODAwLCAweDAwMDAsCisJMHg4MDcyLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLCAweDgwMDAsIDB4MDAwZiwgMHgwMDBhLCAweDAwMGIsCisJMHg4MDcyLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLCAweDAwMGEsIDB4MDAwYiwgMHgzZDMwLCAweDAwMGEsCisJMHg3ZjAwLCAweDAwMDAsIDB4YmM4MCwgMHgwMDAxLCAweDAwMDcsIDB4MDAwMCwgMHgwMjE0LCAweDAwMDMsCisJMHgxOTMwLCAweDAwMGEsIDB4N2YwMCwgMHgwMDAwLCAweDk4ODAsIDB4MDAwMSwgMHgwMDA3LCAweDAwMDAsCisJMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAwLCAweDdmNjIsIDB4MDAwOCwgMHg4MDY2LCAweDAwMDAsCisJMHgwMDBhLCAweDAwMDgsIDB4NDYxOSwgMHgwMDBiLCAweDQwMDAsIDB4MDAwZiwgMHgyMjFlLCAweDAwMGIsCisJMHgwODcwLCAweDAwMDgsIDB4NDAwMCwgMHgwMDBmLCAweDdlMWIsIDB4MDAwYiwgMHhiYmUwLCAweDAwMDksCisJMHgwMDMwLCAweDAwMDgsIDB4MGUxYiwgMHgwMDAzLCAweDE4ZmUsIDB4MDAwMCwgMHgzY2UwLCAweDAwMDksCisJMHgwYTJjLCAweDAwMDMsIDB4MTVmZSwgMHgwMDA4LCAweDNjZTAsIDB4MDAwOSwgMHgwYTJjLCAweDAwMDMsCisJMHgwMjBiLCAweDAwMDQsIDB4ODA3NiwgMHgwMDA4LCAweDAwNDAsIDB4MDAwMCwgMHgwMjJlLCAweDAwMDMsCisJMHg4MDc2LCAweDAwMDgsIDB4MDA0MSwgMHgwMDA4LCAweDgwNzIsIDB4MDAwMCwgMHg4MDAwLCAweDAwMDAsCisJMHgwMjFiLCAweDAwMDMsIDB4YmFjMCwgMHgwMDA5LCAweDAwOTAsIDB4MDAwOCwgMHgwYTM3LCAweDAwMDMsCisJMHg4MDc0LCAweDAwMDAsIDB4MDcwNiwgMHgwMDAwLCAweDAyMzksIDB4MDAwMywgMHg4MDc0LCAweDAwMDAsCisJMHgwNzAzLCAweDAwMDAsIDB4NDAwMCwgMHgwMDBmLCAweDgwMTAsIDB4MDAwOCwgMHgwMDIzLCAweDAwMDAsCisJMHgwMjc2LCAweDAwMGIsIDB4ODAxMCwgMHgwMDA4LCAweDAwMDgsIDB4MDAwMCwgMHgwMjc2LCAweDAwMGIsCisJMHg4MDEwLCAweDAwMDgsIDB4MDAyMiwgMHgwMDA4LCAweDAyNzYsIDB4MDAwYiwgMHgwMjEwLCAweDAwMDQsCisJMHg4MDEwLCAweDAwMDgsIDB4MDAwNywgMHgwMDAwLCAweDAyMWIsIDB4MDAwYywgMHgxODEwLCAweDAwMDAsCisJMHgwMjFiLCAweDAwMGMsIDB4MDI4MiwgMHgwMDAzLCAweDAyMTAsIDB4MDAwNCwgMHg4MDEwLCAweDAwMDgsCisJMHgwMDFiLCAweDAwMDgsIDB4MDIxYiwgMHgwMDBjLCAweDE4MTAsIDB4MDAwMCwgMHgwMjFiLCAweDAwMGMsCisJMHg4MDc0LCAweDAwMDAsIDB4ZjA4MCwgMHgwMDAwLCAweDgwNzIsIDB4MDAwMCwgMHgzMDAwLCAweDAwMDgsCisJMHgwZDMwLCAweDAwMDAsIDB4MDAwYSwgMHgwMDBiLCAweDgwMTAsIDB4MDAwOCwgMHgwMDA5LCAweDAwMDgsCisJMHgwMjc2LCAweDAwMGIsIDB4ODAxMCwgMHgwMDA4LCAweDAwMDUsIDB4MDAwOCwgMHgwMjc2LCAweDAwMGIsCisJMHgxNjQ4LCAweDAwMGEsIDB4MGM2ZiwgMHgwMDBiLCAweDgwOGMsIDB4MDAwOCwgMHgwMDAxLCAweDAwMDAsCisJMHg4MDEwLCAweDAwMDgsIDB4MDAwNCwgMHgwMDAwLCAweDQxNDMsIDB4MDAwYSwgMHgwODZmLCAweDAwMDMsCisJMHgzYTQ0LCAweDAwMDIsIDB4MGMwYSwgMHgwMDBiLCAweDBkMmEsIDB4MDAwOCwgMHgwMjc2LCAweDAwMGIsCisJMHg4MDEwLCAweDAwMDgsIDB4MDAwMywgMHgwMDA4LCAweDAyN2EsIDB4MDAwYiwgMHg4MDEwLCAweDAwMDgsCisJMHgwMDBiLCAweDAwMDAsIDB4MDI3YSwgMHgwMDBiLCAweDgwMTAsIDB4MDAwOCwgMHgwMDAyLCAweDAwMDAsCisJMHgwMjdhLCAweDAwMGIsIDB4M2E0NywgMHgwMDAyLCAweDBkNDAsIDB4MDAwYiwgMHg4MDEwLCAweDAwMDgsCisJMHgwMDA2LCAweDAwMDgsIDB4MDI3YSwgMHgwMDBiLCAweDgwNzQsIDB4MDAwMCwgMHhmMDAwLCAweDAwMDgsCisJMHg4MDcyLCAweDAwMDAsIDB4MzAwMCwgMHgwMDA4LCAweDAyMWIsIDB4MDAwYywgMHgwMjMxLCAweDAwMDQsCisJMHgzYTQwLCAweDAwMGEsIDB4MDgwYSwgMHgwMDAzLCAweDgwMTAsIDB4MDAwOCwgMHgwMDBjLCAweDAwMDgsCisJMHgwMjFiLCAweDAwMGMsIDB4MDAwYSwgMHgwMDBiLCAweDgwNzQsIDB4MDAwMCwgMHhmMDgwLCAweDAwMDAsCisJMHg4MDcyLCAweDAwMDAsIDB4MzAwMCwgMHgwMDA4LCAweDBkMzAsIDB4MDAwMCwgMHgyZTRkLCAweDAwMDIsCisJMHgyZTRkLCAweDAwMDIsIDB4MGE4ZCwgMHgwMDBiLCAweDgwNTQsIDB4MDAwOCwgMHgwMDE5LCAweDAwMDAsCisJMHgwMDBhLCAweDAwMGIsIDB4ODA1NCwgMHgwMDA4LCAweDAwMDksIDB4MDAwOCwgMHgwMDBhLCAweDAwMGIsCisJMHgzYTQ0LCAweDAwMDIsIDB4MGMwYSwgMHgwMDBiLCAweDAyNmIsIDB4MDAwYiwgMHg4MDhjLCAweDAwMDgsCisJMHgwMDAwLCAweDAwMDgsIDB4NDQ0NywgMHgwMDAyLCAweDBhYjksIDB4MDAwMywgMHhjMGMwLCAweDAwMDEsCisJMHgwMGZmLCAweDAwMDgsIDB4ZmZlMCwgMHgwMDA5LCAweDAwZmYsIDB4MDAwOCwgMHgwZTkwLCAweDAwMDMsCisJMHhjMWUwLCAweDAwMDEsIDB4ZmZmZiwgMHgwMDA4LCAweDBlOTAsIDB4MDAwMywgMHg4MDEwLCAweDAwMDgsCisJMHgwMDEzLCAweDAwMDAsIDB4MDIxYiwgMHgwMDBjLCAweDgwNzQsIDB4MDAwMCwgMHgwMjAyLCAweDAwMDgsCisJMHgwMDBhLCAweDAwMGIsIDB4M2E0MCwgMHgwMDBhLCAweDBlYjYsIDB4MDAwYiwgMHg4MDc0LCAweDAwMDAsCisJMHgwMjAwLCAweDAwMDAsIDB4M2QwMCwgMHgwMDAwLCAweDNjZmUsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsCisJMHg4MDAwLCAweDAwMDAsIDB4NDNlMCwgMHgwMDAxLCAweDBlYjQsIDB4MDAwMywgMHg0MmZlLCAweDAwMDAsCisJMHhmZmMwLCAweDAwMDEsIDB4MDBmZiwgMHgwMDA4LCAweDAwZTAsIDB4MDAwOSwgMHgwYTkwLCAweDAwMGIsCisJMHgwZDA4LCAweDAwMDgsIDB4MDMwOSwgMHgwMDBiLCAweDgwNzIsIDB4MDAwMCwgMHg4MDAwLCAweDAwMDAsCisJMHgwMDBhLCAweDAwMGIsIDB4MDM4ZCwgMHgwMDA0LCAweDgwOGMsIDB4MDAwOCwgMHgwMDAxLCAweDAwMDAsCisJMHgwNGZlLCAweDAwMDgsIDB4MzM3MCwgMHgwMDAzLCAweDA0NjAsIDB4MDAwMCwgMHg4MDYyLCAweDAwMDgsCisJMHgwMDAxLCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDAwMDksIDB4MDAwOCwgMHg0NmMzLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDAsIDB4ODBjMCwgMHgwMDA5LCAweDAwZmYsIDB4MDAwOCwgMHg3ZjAwLCAweDAwMDAsCisJMHg4MGUwLCAweDAwMDEsIDB4MDAwNCwgMHgwMDAwLCAweDBhZGQsIDB4MDAwYiwgMHg4MGUwLCAweDAwMDEsCisJMHgwMDA1LCAweDAwMDgsIDB4MGFkZCwgMHgwMDBiLCAweDgwZTAsIDB4MDAwMSwgMHgwMDA2LCAweDAwMDgsCisJMHgwYWRkLCAweDAwMGIsIDB4ODJjMCwgMHgwMDAxLCAweGZmMDAsIDB4MDAwOCwgMHg3ZjA0LCAweDAwMDgsCisJMHg4MmUwLCAweDAwMDksIDB4MDYwMCwgMHgwMDA4LCAweDBhZGQsIDB4MDAwYiwgMHg4MmUwLCAweDAwMDksCisJMHgwNTAwLCAweDAwMDgsIDB4MGFkZCwgMHgwMDBiLCAweDgyZTAsIDB4MDAwOSwgMHgwNDAwLCAweDAwMDAsCisJMHgwZjcwLCAweDAwMDMsIDB4YzRjMCwgMHgwMDA5LCAweDcwMDAsIDB4MDAwMCwgMHhmZmUwLCAweDAwMDksCisJMHgxMDAwLCAweDAwMDAsIDB4MGIwOSwgMHgwMDAzLCAweDAzN2UsIDB4MDAwNCwgMHgzOTQxLCAweDAwMDIsCisJMHgwYWU4LCAweDAwMGIsIDB4ODA3MiwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMCwgMHgwMDBhLCAweDAwMGIsCisJMHgwNDYwLCAweDAwMDAsIDB4ODBmZSwgMHgwMDA4LCAweDAwMmIsIDB4MDAwOCwgMHg3ZjYyLCAweDAwMDgsCisJMHg4MDY2LCAweDAwMDAsIDB4MjIwOSwgMHgwMDA4LCAweDQ2ZWUsIDB4MDAwMywgMHgxMWZlLCAweDAwMDAsCisJMHgzMzA0LCAweDAwMDMsIDB4OTE4MCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsCisJMHgwNDAwLCAweDAwMDAsIDB4N2Y2MiwgMHgwMDA4LCAweDgwNjYsIDB4MDAwMCwgMHgwNjA5LCAweDAwMDgsCisJMHg0NmY4LCAweDAwMGIsIDB4NDJmZSwgMHgwMDAwLCAweGZmYzAsIDB4MDAwMSwgMHhmZjAwLCAweDAwMDgsCisJMHgwM2UwLCAweDAwMDksIDB4MGYwMSwgMHgwMDAzLCAweDgwNzIsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDAsCisJMHgwMDQ2LCAweDAwMDMsIDB4OTE4MCwgMHgwMDAxLCAweDAwMDMsIDB4MDAwOCwgMHgwMmViLCAweDAwMDMsCisJMHg4MDcyLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAwLCAweDgwMTAsIDB4MDAwOCwgMHgwMDEwLCAweDAwMDAsCisJMHgwMzYxLCAweDAwMDMsIDB4MDM3ZSwgMHgwMDA0LCAweDM5NDEsIDB4MDAwMiwgMHgwYjBmLCAweDAwMDMsCisJMHg4MDcyLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAwLCAweDAwMGEsIDB4MDAwYiwgMHgwMzQ2LCAweDAwMGMsCisJMHgxMWZlLCAweDAwMDAsIDB4MzcxNywgMHgwMDAzLCAweDgwNzIsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDAsCisJMHg4MDEwLCAweDAwMDgsIDB4MDAwZSwgMHgwMDAwLCAweDAzNjEsIDB4MDAwMywgMHg4MDYwLCAweDAwMDAsCisJMHgwNDAwLCAweDAwMDAsIDB4MDRmZSwgMHgwMDA4LCAweDM3MmMsIDB4MDAwYiwgMHg4MDhjLCAweDAwMDgsCisJMHgwMDAwLCAweDAwMDgsIDB4OTE4MCwgMHgwMDAxLCAweDAwMDUsIDB4MDAwOCwgMHg3ZjYyLCAweDAwMDgsCisJMHg4MDY2LCAweDAwMDAsIDB4MDAwOSwgMHgwMDA4LCAweDQ3MjIsIDB4MDAwYiwgMHgwMDYwLCAweDAwMDgsCisJMHg4MDYyLCAweDAwMDgsIDB4MDAxYiwgMHgwMDA4LCAweDQzMDQsIDB4MDAwOCwgMHg0MjA2LCAweDAwMDgsCisJMHg4MDY2LCAweDAwMDAsIDB4MDQxMiwgMHgwMDAwLCAweDQ3MmEsIDB4MDAwMywgMHgwMzQzLCAweDAwMDMsCisJMHg4MDhjLCAweDAwMDgsIDB4MDAwMSwgMHgwMDAwLCAweDA0NjAsIDB4MDAwMCwgMHg4MDYyLCAweDAwMDgsCisJMHgwMDJiLCAweDAwMDgsIDB4ODA2NiwgMHgwMDAwLCAweDA2MDksIDB4MDAwOCwgMHg0NzMzLCAweDAwMGIsCisJMHg4MDY2LCAweDAwMDAsIDB4MjIwYSwgMHgwMDA4LCAweDQ3MzYsIDB4MDAwYiwgMHg0MmZlLCAweDAwMDAsCisJMHhmZmMwLCAweDAwMDEsIDB4ZmYwMCwgMHgwMDA4LCAweDdmMDQsIDB4MDAwOCwgMHg4MDYwLCAweDAwMDAsCisJMHgwNDAwLCAweDAwMDAsIDB4OTE4MCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMCwgMHg3ZjYyLCAweDAwMDgsCisJMHg4MDY2LCAweDAwMDAsIDB4MDQxYSwgMHgwMDA4LCAweDQ3NDIsIDB4MDAwYiwgMHg4MDcyLCAweDAwMDAsCisJMHgwNDAwLCAweDAwMDAsIDB4MDA0NiwgMHgwMDAzLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDAsCisJMHgxMzYyLCAweDAwMDgsIDB4ODA2NiwgMHgwMDAwLCAweDA0MTEsIDB4MDAwMCwgMHg0NzRiLCAweDAwMGIsCisJMHgwMmZlLCAweDAwMDgsIDB4MDNlMCwgMHgwMDA5LCAweDBmNTEsIDB4MDAwMywgMHgwZDIyLCAweDAwMDAsCisJMHg0MDAwLCAweDAwMGYsIDB4ODI4MCwgMHgwMDA5LCAweDAwMDIsIDB4MDAwMCwgMHgxMzgwLCAweDAwMDEsCisJMHg3ZjYyLCAweDAwMDgsIDB4ODA2NiwgMHgwMDAwLCAweDIyMDksIDB4MDAwOCwgMHg0NzU3LCAweDAwMDMsCisJMHgwMjAwLCAweDAwMGEsIDB4ZmZjMCwgMHgwMDAxLCAweDAwMDcsIDB4MDAwMCwgMHg3ZjA2LCAweDAwMDAsCisJMHgxMzYyLCAweDAwMDgsIDB4ODA2NiwgMHgwMDAwLCAweDA2MGEsIDB4MDAwOCwgMHg0NzVmLCAweDAwMGIsCisJMHg0MDAwLCAweDAwMGYsIDB4M2E0NCwgMHgwMDAyLCAweDBjMGEsIDB4MDAwYiwgMHgyZjQ0LCAweDAwMGEsCisJMHgyZjQ0LCAweDAwMGEsIDB4MGU2YiwgMHgwMDBiLCAweDgwOGEsIDB4MDAwOCwgMHgwMDAzLCAweDAwMDgsCisJMHg4MDc0LCAweDAwMDAsIDB4ZjA4MCwgMHgwMDAwLCAweDgwNzIsIDB4MDAwMCwgMHgzMDAwLCAweDAwMDgsCisJMHg1YjZjLCAweDAwMDMsIDB4ODA1NCwgMHgwMDA4LCAweDAwMTksIDB4MDAwMCwgMHgwMDBhLCAweDAwMGIsCisJMHgzYTQ0LCAweDAwMDIsIDB4MGMwYSwgMHgwMDBiLCAweDgwOGMsIDB4MDAwOCwgMHgwMDAwLCAweDAwMDgsCisJMHg4MDEwLCAweDAwMDgsIDB4MDAxMSwgMHgwMDA4LCAweDAyMWIsIDB4MDAwYywgMHg0MmZlLCAweDAwMDAsCisJMHhmZmMwLCAweDAwMDEsIDB4MDBmZiwgMHgwMDA4LCAweDdmMTAsIDB4MDAwOCwgMHgwMjFiLCAweDAwMGMsCisJMHg0MzEwLCAweDAwMDgsIDB4MDI3YSwgMHgwMDBiLCAweDM5NDEsIDB4MDAwMiwgMHgwYjgxLCAweDAwMDMsCisJMHg0MDAwLCAweDAwMGYsIDB4ODA3MiwgMHgwMDAwLCAweDA0MDQsIDB4MDAwOCwgMHg0MDAwLCAweDAwMGYsCisJMHg4MDEwLCAweDAwMDgsIDB4MDAxMiwgMHgwMDA4LCAweDAyMWIsIDB4MDAwYywgMHgwMzQ2LCAweDAwMGMsCisJMHgxMTEwLCAweDAwMDAsIDB4MDIxYiwgMHgwMDBjLCAweDExZmUsIDB4MDAwMCwgMHgzNzg3LCAweDAwMDMsCisJMHgwMDBhLCAweDAwMGIsIDB4YzJjMCwgMHgwMDA5LCAweDAwZmYsIDB4MDAwOCwgMHg3ZjAwLCAweDAwMDAsCisJMHhjM2MwLCAweDAwMDEsIDB4ZmYwMCwgMHgwMDA4LCAweDAwZDAsIDB4MDAwOSwgMHgwYmIyLCAweDAwMDMsCisJMHgwZDBhLCAweDAwMDAsIDB4ODU4MCwgMHgwMDAxLCAweDEwMDAsIDB4MDAwMCwgMHg3ZjYyLCAweDAwMDgsCisJMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwgMHgwODA5LCAweDAwMDAsCisJMHg0NzljLCAweDAwMGIsIDB4MDRmZSwgMHgwMDA4LCAweDMzYWIsIDB4MDAwMywgMHgwNDYwLCAweDAwMDAsCisJMHg4MDYyLCAweDAwMDgsIDB4MDAwNCwgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwgMHgwMjExLCAweDAwMDAsCisJMHg0N2E0LCAweDAwMDMsIDB4MDFmZSwgMHgwMDA4LCAweDAwZTAsIDB4MDAwOSwgMHgwZmFiLCAweDAwMDMsCisJMHgwMmZlLCAweDAwMDgsIDB4NDNlMCwgMHgwMDAxLCAweDBiYjEsIDB4MDAwMywgMHgwNTAwLCAweDAwMDIsCisJMHg3ZjBhLCAweDAwMDAsIDB4ZmZlMCwgMHgwMDA5LCAweDA4MDAsIDB4MDAwMCwgMHgwZjk1LCAweDAwMGIsCisJMHgwZDA4LCAweDAwMDgsIDB4NDAwMCwgMHgwMDBmLCAweDQzZmUsIDB4MDAwOCwgMHgzZTgwLCAweDAwMDEsCisJMHhmZmMwLCAweDAwMDEsIDB4N2ZmZiwgMHgwMDAwLCAweDBkNjAsIDB4MDAwMCwgMHg3ZjYyLCAweDAwMDgsCisJMHg4MDY2LCAweDAwMDAsIDB4MDgwOSwgMHgwMDAwLCAweDQ3YmEsIDB4MDAwMywgMHg4MDYwLCAweDAwMDAsCisJMHgwNDAwLCAweDAwMDAsIDB4ODRjMCwgMHgwMDAxLCAweGZmMDAsIDB4MDAwOCwgMHg3ZjYwLCAweDAwMGEsCisJMHg3ZjYwLCAweDAwMGEsIDB4N2Y2MCwgMHgwMDBhLCAweDdmNjAsIDB4MDAwYSwgMHg3ZjYwLCAweDAwMGEsCisJMHg3ZjYwLCAweDAwMGEsIDB4N2Y2MCwgMHgwMDBhLCAweDdmNjAsIDB4MDAwYSwgMHhmZjgwLCAweDAwMDksCisJMHgxMDAwLCAweDAwMDAsIDB4N2Y2MiwgMHgwMDA4LCAweDgwNjYsIDB4MDAwMCwgMHgwODA5LCAweDAwMDAsCisJMHg0N2NjLCAweDAwMGIsIDB4NDAwMCwgMHgwMDBmLCAweDVmZjQsIDB4ZWJlZCwgMHgwMDAxLCAweDAwMDIsCisJMHgwMDA0LCAweDAwMDgsIDB4MDAxMCwgMHgwMDIwLCAweDAwNDAsIDB4MDA4MCwgMHgwMTAwLCAweDAyMDAsCisJMHgwNDAwLCAweDA4MDAsIDB4MTAwMCwgMHgyMDAwLCAweDQwMDAsIDB4ODAwMCwgMHhhMjU4Cit9OworI2lmZGVmIFVOSVFVRV9GV19OQU1FCit1bnNpZ25lZCBzaG9ydCBmdzIzMDBpcHhfbGVuZ3RoMDEgPSAweGViNTc7CisjZWxzZQordW5zaWduZWQgc2hvcnQgcmlzY19jb2RlX2xlbmd0aDAxID0gMHhlYjU3OworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsMjMyMi5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWwyMzIyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiNmQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsMjMyMi5jCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogUUxvZ2ljIElTUDIzMjIgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi42LngKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFFMb2dpYyBDb3Jwb3JhdGlvbiAod3d3LnFsb2dpYy5jb20pCisgKgorICogUmVsZWFzZWQgdW5kZXIgR1BMIHYyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlICJxbGFfZGVmLmgiCisKK3N0YXRpYyBjaGFyIHFsYV9kcml2ZXJfbmFtZVtdID0gInFsYTIzMjIiOworCitleHRlcm4gdW5zaWduZWQgY2hhciAgZncyMzIyaXB4X3ZlcnNpb25bXTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyICBmdzIzMjJpcHhfdmVyc2lvbl9zdHJbXTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBmdzIzMjJpcHhfYWRkcjAxOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGZ3MjMyMmlweF9jb2RlMDFbXTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBmdzIzMjJpcHhfbGVuZ3RoMDE7CitleHRlcm4gdW5zaWduZWQgbG9uZyByc2VxaXB4X2NvZGVfYWRkcjAxOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IHJzZXFpcHhfY29kZTAxW107CitleHRlcm4gdW5zaWduZWQgc2hvcnQgcnNlcWlweF9jb2RlX2xlbmd0aDAxOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgeHNlcWlweF9jb2RlX2FkZHIwMTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCB4c2VxaXB4X2NvZGUwMVtdOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IHhzZXFpcHhfY29kZV9sZW5ndGgwMTsKKworc3RhdGljIHN0cnVjdCBxbGFfZndfaW5mbyBxbGFfZndfdGJsW10gPSB7CisJeworCQkuYWRkcmVzc2luZwk9IEZXX0lORk9fQUREUl9OT1JNQUwsCisJCS5md2NvZGUJCT0gJmZ3MjMyMmlweF9jb2RlMDFbMF0sCisJCS5md2xlbgkJPSAmZncyMzIyaXB4X2xlbmd0aDAxLAorCQkuZndzdGFydAk9ICZmdzIzMjJpcHhfYWRkcjAxLAorCX0sCisJeworCQkuYWRkcmVzc2luZwk9IEZXX0lORk9fQUREUl9FWFRFTkRFRCwKKwkJLmZ3Y29kZQkJPSAmcnNlcWlweF9jb2RlMDFbMF0sCisJCS5md2xlbgkJPSAmcnNlcWlweF9jb2RlX2xlbmd0aDAxLAorCQkubGZ3c3RhcnQJPSAmcnNlcWlweF9jb2RlX2FkZHIwMSwKKwl9LAorCXsKKwkJLmFkZHJlc3NpbmcJPSBGV19JTkZPX0FERFJfRVhURU5ERUQsCisJCS5md2NvZGUJCT0gJnhzZXFpcHhfY29kZTAxWzBdLAorCQkuZndsZW4JCT0gJnhzZXFpcHhfY29kZV9sZW5ndGgwMSwKKwkJLmxmd3N0YXJ0CT0gJnhzZXFpcHhfY29kZV9hZGRyMDEsCisJfSwKKwl7IEZXX0lORk9fQUREUl9OT01PUkUsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHFsYV9ib2FyZF9pbmZvIHFsYV9ib2FyZF90YmxbXSA9IHsKKwl7CisJCS5kcnZfbmFtZQk9IHFsYV9kcml2ZXJfbmFtZSwKKwkJLmlzcF9uYW1lCT0gIklTUDIzMjIiLAorCQkuZndfaW5mbwk9IHFsYV9md190YmwsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBxbGEyMzIyX3BjaV90YmxbXSA9IHsKKwl7CisJCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9RTE9HSUMsCisJCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjMyMiwKKwkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEJPSAodW5zaWduZWQgbG9uZykmcWxhX2JvYXJkX3RibFswXSwKKwl9LAorCXswLCAwfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcWxhMjMyMl9wY2lfdGJsKTsKKworc3RhdGljIGludCBfX2RldmluaXQKK3FsYTIzMjJfcHJvYmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIHFsYTJ4MDBfcHJvYmVfb25lKHBkZXYsCisJICAgIChzdHJ1Y3QgcWxhX2JvYXJkX2luZm8gKilpZC0+ZHJpdmVyX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQKK3FsYTIzMjJfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlxbGEyeDAwX3JlbW92ZV9vbmUocGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBxbGEyMzIyX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInFsYTIzMjIiLAorCS5pZF90YWJsZQk9IHFsYTIzMjJfcGNpX3RibCwKKwkucHJvYmUJCT0gcWxhMjMyMl9wcm9iZV9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChxbGEyMzIyX3JlbW92ZV9vbmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK3FsYTIzMjJfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnFsYTIzMjJfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorcWxhMjMyMl9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZxbGEyMzIyX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChxbGEyMzIyX2luaXQpOworbW9kdWxlX2V4aXQocWxhMjMyMl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUUxvZ2ljIENvcnBvcmF0aW9uIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlFMb2dpYyBJU1AyMzIyIEZDLVNDU0kgSG9zdCBCdXMgQWRhcHRlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFFMQTJYWFhfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDIzMjJfZncuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsMjMyMl9mdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YzVhOGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDIzMjJfZncuYwpAQCAtMCwwICsxLDgxMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgUUxPR0lDIExJTlVYIFNPRlRXQVJFCisgKgorICogUUxvZ2ljIElTUDJ4MDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi42LngKKyAqIENvcHlyaWdodCAoQykgMjAwMyBRTG9naWMgQ29ycG9yYXRpb24KKyAqICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUZpcm13YXJlIFZlcnNpb24gMy4wMy4wOCAoMTA6MDMgTm92IDEyLCAyMDA0KQorICovCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQordW5zaWduZWQgc2hvcnQgZncyMzIyaXB4X3ZlcnNpb24gPSAzKjEwMjQrMzsKKyNlbHNlCit1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfdmVyc2lvbiA9IDMqMTAyNCszOworI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQordW5zaWduZWQgY2hhciBmdzIzMjJpcHhfdmVyc2lvbl9zdHJbXSA9IHszLCAzLCA4fTsKKyNlbHNlCit1bnNpZ25lZCBjaGFyIGZpcm13YXJlX3ZlcnNpb25bXSA9IHszLCAzLCA4fTsKKyNlbmRpZgorCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKKyNkZWZpbmUgZncyMzIyaXB4X1ZFUlNJT05fU1RSSU5HICIzLjAzLjA4IgorI2Vsc2UKKyNkZWZpbmUgRldfVkVSU0lPTl9TVFJJTkcgIjMuMDMuMDgiCisjZW5kaWYKKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCit1bnNpZ25lZCBzaG9ydCBmdzIzMjJpcHhfYWRkcjAxID0gMHgwODAwIDsKKyNlbHNlCit1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfYWRkcjAxID0gMHgwODAwIDsKKyNlbmRpZgorCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3Vuc2lnbmVkIHNob3J0IGZ3MjMyMmlweF9jb2RlMDFbXSA9IHsgCisjZWxzZQordW5zaWduZWQgc2hvcnQgcmlzY19jb2RlMDFbXSA9IHsgCisjZW5kaWYKKwkweDA0NzAsIDB4MDAwMCwgMHgwMDAwLCAweGUwYzIsIDB4MDAwMCwgMHgwMDAzLCAweDAwMDMsIDB4MDAwOCwKKwkweDAxMzcsIDB4MjA0MywgMHg0ZjUwLCAweDU5NTIsIDB4NDk0NywgMHg0ODU0LCAweDIwMzIsIDB4MzAzMCwKKwkweDMxMjAsIDB4NTE0YywgMHg0ZjQ3LCAweDQ5NDMsIDB4MjA0MywgMHg0ZjUyLCAweDUwNGYsIDB4NTI0MSwKKwkweDU0NDksIDB4NGY0ZSwgMHgyMDQ5LCAweDUzNTAsIDB4MzIzMywgMHgzMDMwLCAweDIwNDYsIDB4Njk3MiwKKwkweDZkNzcsIDB4NjE3MiwgMHg2NTIwLCAweDIwNTYsIDB4NjU3MiwgMHg3MzY5LCAweDZmNmUsIDB4MjAzMCwKKwkweDMzMmUsIDB4MzAzMywgMHgyZTMwLCAweDM4MjAsIDB4MjAyMCwgMHgyMDIwLCAweDI0MDAsIDB4MjBhOSwKKwkweDAwMGYsIDB4MjAwMSwgMHgwMDAwLCAweDQwMGYsIDB4MjA5MSwgMHgyMjAwLCAweDIwYTksIDB4MDAwZiwKKwkweDIwMDEsIDB4MDAwMCwgMHg0MDBmLCAweDIwOTEsIDB4MjQwMCwgMHgyMGE5LCAweDAwMGYsIDB4MjAwMSwKKwkweDAwMDAsIDB4NDAwZiwgMHgyMDkxLCAweDI2MDAsIDB4MjBhOSwgMHgwMDBmLCAweDIwMDEsIDB4MDAwMCwKKwkweDQwMGYsIDB4MjA5MSwgMHgyODAwLCAweDIwYTksIDB4MDAwZiwgMHgyMDAxLCAweDAwMDAsIDB4NDAwZiwKKwkweDIwOTEsIDB4MmEwMCwgMHgyMGE5LCAweDAwMGYsIDB4MjAwMSwgMHgwMDAwLCAweDQwMGYsIDB4MjA5MSwKKwkweDJjMDAsIDB4MjBhOSwgMHgwMDBmLCAweDIwMDEsIDB4MDAwMCwgMHg0MDBmLCAweDIwOTEsIDB4MmUwMCwKKwkweDIwYTksIDB4MDAwZiwgMHgyMDAxLCAweDAwMDAsIDB4NDAwZiwgMHgyMDkxLCAweDIwMDAsIDB4MjAwMSwKKwkweDAwMDAsIDB4MjBjMSwgMHgwMDA0LCAweDIwYzksIDB4MWNmZiwgMHgyMDU5LCAweDAwMDAsIDB4MmI3OCwKKwkweDc4ODMsIDB4MDAwNCwgMHgyMDg5LCAweDJiMTQsIDB4MjA1MSwgMHgxODAwLCAweDJhNzAsIDB4MjBlMSwKKwkweDAwMDEsIDB4MjBlOSwgMHgwMDAxLCAweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweDBlNjIsIDB4MDBmNiwKKwkweDc4ODgsIDB4OTAwNSwgMHgxMWY4LCAweDIwNjEsIDB4YzAwMCwgMHgwODBjLCAweDIwYjAsIDB4MTE3MCwKKwkweDIwNzksIDB4MDMwMCwgMHgwODBjLCAweDIwYzYsIDB4MjA2MSwgMHhlMDAwLCAweDA4MGMsIDB4MjBiMCwKKwkweDExMjgsIDB4MjA3OSwgMHgwMzgwLCAweDA4MGMsIDB4MjBjNiwgMHgwMDYwLCAweDAwZmUsIDB4Nzg4MywKKwkweDQwMTAsIDB4NzgzNywgMHg0MDEwLCAweDc4MzMsIDB4MDAxMCwgMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwKKwkweDQwODAsIDB4MGNmOCwgMHgwMGZlLCAweDIwMjksIDB4NTYwMCwgMHgyMDMxLCAweGZmZmYsIDB4MjAzOSwKKwkweDU1ZGMsIDB4MjAyMSwgMHgwMjAwLCAweDIwZTksIDB4MDAwMSwgMHgyMGExLCAweDAwMDAsIDB4MjBhOSwKKwkweDA4MDAsIDB4OTAwZSwgMHg0MTA0LCAweDIwZTksIDB4MDAwMSwgMHgyMGExLCAweDEwMDAsIDB4OTAwZSwKKwkweDIwMDEsIDB4MGRjMSwgMHg5MDg0LCAweDBmZmYsIDB4MjBhOCwgMHg0MTA0LCAweDIwMDEsIDB4MDAwMCwKKwkweDkwODYsIDB4MDAwMCwgMHgwMTIwLCAweDIxYTgsIDB4NDEwNCwgMHg4MDAxLCAweDFkZTAsIDB4NzU2ZSwKKwkweDc2NzIsIDB4Nzc2YSwgMHg3NDc2LCAweDc0N2EsIDB4MDBlNiwgMHgyMDcxLCAweDFiNTAsIDB4MjQ3MiwKKwkweDAwZWUsIDB4MjBhMSwgMHgxZGRjLCAweDcxNzAsIDB4ODEwZCwgMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwKKwkweDkxOGMsIDB4MDAwZiwgMHgyMDAxLCAweDAwMDEsIDB4OTExMiwgMHg5MDBlLCAweDIxYTgsIDB4NDEwNCwKKwkweDgyMTEsIDB4MWRlMCwgMHg3MTcwLCAweDM0MDAsIDB4ODAwMSwgMHg5MTAyLCAweDAxMjAsIDB4MDIxOCwKKwkweDIwYTgsIDB4OTAwZSwgMHg0MTA0LCAweDIwMDksIDB4MTgwMCwgMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwKKwkweDgxMGQsIDB4ODEwZCwgMHg5MThjLCAweDAwMWYsIDB4MjAwMSwgMHgwMDAxLCAweDkxMTIsIDB4MjBlOSwKKwkweDAwMDEsIDB4MjBhMSwgMHgwODAwLCAweDkwMGUsIDB4MjBhOSwgMHgwODAwLCAweDQxMDQsIDB4ODIxMSwKKwkweDFkZDgsIDB4MDgwYywgMHgwZjVmLCAweDA4MGMsIDB4NjBhMCwgMHgwODBjLCAweGFjNDYsIDB4MDgwYywKKwkweDExMTYsIDB4MDgwYywgMHgxMzQwLCAweDA4MGMsIDB4MWMwNiwgMHgwODBjLCAweDkyMWYsIDB4MDgwYywKKwkweDBkMGYsIDB4MDgwYywgMHgxMDliLCAweDA4MGMsIDB4MzRiOSwgMHgwODBjLCAweDc4NTQsIDB4MDgwYywKKwkweDZiMDEsIDB4MDgwYywgMHg4OTkyLCAweDA4MGMsIDB4ODVmMywgMHgwODBjLCAweDIyYTEsIDB4MDgwYywKKwkweDdmMmEsIDB4MDgwYywgMHgyMGRmLCAweDA4MGMsIDB4MjIxZCwgMHgwODBjLCAweDIyOTYsIDB4MjA5MSwKKwkweDMwMDksIDB4Nzg4MywgMHgwMDAwLCAweDEwMDQsIDB4MDk0MywgMHg3ODgwLCAweDkwODYsIDB4MDAwMiwKKwkweDExOTAsIDB4Nzg4MywgMHg0MDAwLCAweDc4MzcsIDB4NDAwMCwgMHg3ODMzLCAweDAwMTAsIDB4MGUwNCwKKwkweDA5MzcsIDB4MjA5MSwgMHg1MDAwLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwODksIDB4MjAwNCwKKwkweGQwODQsIDB4MTkwYywgMHgxMWVlLCAweDIwNzEsIDB4MTgwMCwgMHg3MDAzLCAweDAwMDAsIDB4NzgwYywKKwkweDkwODQsIDB4MDAzMCwgMHg5MDg2LCAweDAwMDAsIDB4MTkwYywgMHgwZDdkLCAweDIwNzEsIDB4MTgwMCwKKwkweDcwMDAsIDB4OTA4ZSwgMHgwMDAzLCAweDExNjgsIDB4MDgwYywgMHg0YzE3LCAweDA4MGMsIDB4MzRlMCwKKwkweDA4MGMsIDB4NzhiYywgMHgwODBjLCAweDcwMzksIDB4MDgwYywgMHg4YTc1LCAweDA4MGMsIDB4ODYxYywKKwkweDBjNjgsIDB4MDAwYiwgMHgwYzg4LCAweDA5NmQsIDB4MDk2ZSwgMHgwYjA5LCAweDA5NmIsIDB4MGJjMywKKwkweDBkMGUsIDB4MGQwZSwgMHgwZDBlLCAweDA4MGMsIDB4MGQ3ZCwgMHgwMDA1LCAweDAxMjYsIDB4MDBmNiwKKwkweDIwOTEsIDB4ODAwMCwgMHg3MDAwLCAweDkwODYsIDB4MDAwMSwgMHgxOTA0LCAweDBhZGMsIDB4MDgwYywKKwkweDBlYjIsIDB4MDgwYywgMHg3NTNkLCAweDAxNTAsIDB4MDgwYywgMHg3NTYwLCAweDE1YjAsIDB4MjA3OSwKKwkweDAxMDAsIDB4NzgyOCwgMHg5MDg1LCAweDE4MDAsIDB4NzgyYSwgMHgwNDc4LCAweDA4MGMsIDB4NzQ2ZSwKKwkweDcwMDAsIDB4OTA4NiwgMHgwMDAxLCAweDE5MDQsIDB4MGFkYywgMHg3MDk4LCAweDkwODYsIDB4MDAyOCwKKwkweDE5MDQsIDB4MGFkYywgMHgwODBjLCAweDg1ZGMsIDB4MDgwYywgMHg4NWNlLCAweDIwMDEsIDB4MDE2MSwKKwkweDIwMDMsIDB4MDAwMSwgMHgyMDc5LCAweDAxMDAsIDB4MjAxMSwgMHhmZmZmLCAweDA4MGMsIDB4MmFiNCwKKwkweDdhMjgsIDB4OTI5NSwgMHg1ZTJjLCAweDdhMmEsIDB4MjAxMSwgMHg3M2IzLCAweDA4MGMsIDB4ODZjOCwKKwkweDIwMTEsIDB4NzNhNiwgMHgwODBjLCAweDg3ZDQsIDB4MjAxMSwgMHg1ZWY3LCAweDA4MGMsIDB4ODZjOCwKKwkweDIwMTEsIDB4ODAzMCwgMHg5MDFlLCAweDczOTYsIDB4MDRkMCwgMHgwODBjLCAweDU3YTQsIDB4MjA3OSwKKwkweDAxMDAsIDB4Nzg0NCwgMHg5MDA1LCAweDE5MDQsIDB4MGFkYywgMHgyMDExLCAweDVlZjcsIDB4MDgwYywKKwkweDg2YzgsIDB4MjAxMSwgMHg3M2IzLCAweDA4MGMsIDB4ODZjOCwgMHgyMDExLCAweDczYTYsIDB4MDgwYywKKwkweDg3ZDQsIDB4MjAwMSwgMHgwMjY1LCAweDIwMDEsIDB4MDIwNSwgMHgyMDAzLCAweDAwMDAsIDB4Nzg0MCwKKwkweDkwODQsIDB4ZmZmYiwgMHg3ODQyLCAweDIwMDEsIDB4MTlhNSwgMHgyMDA0LCAweDkwMDUsIDB4MTE0MCwKKwkweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDA4MGMsIDB4NjA0OCwgMHgwMGNlLCAweDA4MDQsIDB4MGFkYywKKwkweDc4MGYsIDB4MDA2YiwgMHg3YTI4LCAweDA4MGMsIDB4NzU0NSwgMHgwMTE4LCAweDkyOTUsIDB4NWUyYywKKwkweDAwMTAsIDB4OTI5NSwgMHg0MDJjLCAweDdhMmEsIDB4MjAxMSwgMHg4MDEwLCAweDczZDgsIDB4MjAwMSwKKwkweDE5YTYsIDB4MjAwMywgMHgwMDAxLCAweDA4MGMsIDB4Mjk3YywgMHgwODBjLCAweDRiNTIsIDB4NzI0OCwKKwkweGMyODQsIDB4NzI0YSwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHhjMWFjLCAweGMxY2MsIDB4MjEwMiwKKwkweDIwMDEsIDB4MDM5MCwgMHgyMDAzLCAweDA0MDAsIDB4MDgwYywgMHhhOTFlLCAweDA4MGMsIDB4YTExMywKKwkweDIwMTEsIDB4MDAwNCwgMHgwODBjLCAweGM5OGEsIDB4MDgwYywgMHhhOTNhLCAweDA4MGMsIDB4Njk4OSwKKwkweDA4MGMsIDB4NzUzZCwgMHgxMTIwLCAweDA4MGMsIDB4MjlkZCwgMHgwNjAwLCAweDA0MjAsIDB4MDgwYywKKwkweDYwNGYsIDB4MDE0MCwgMHg3MDk3LCAweDAwMDEsIDB4NzBkMywgMHgwMDAwLCAweDA4MGMsIDB4NTk3MSwKKwkweDA4MDQsIDB4MGFkYywgMHgwODBjLCAweDU3M2UsIDB4ZDA5NCwgMHgwMWE4LCAweDIwMDEsIDB4MDM5MCwKKwkweDIwMDMsIDB4MDQwNCwgMHgyMDExLCAweDE4MGMsIDB4MjIwNCwgMHhjMGNkLCAweDIwMTIsIDB4MDgwYywKKwkweDU3NDIsIDB4ZDBkNCwgMHgxMTE4LCAweDA4MGMsIDB4MjlkZCwgMHgxMjcwLCAweDIwMTEsIDB4MTgwYywKKwkweDIyMDQsIDB4YzBiYywgMHgwMGE4LCAweDA4MGMsIDB4NTc0MiwgMHhkMGQ0LCAweDFkYjgsIDB4MjAxMSwKKwkweDE4MGMsIDB4MjIwNCwgMHhjMGJkLCAweDAwNjAsIDB4MjAxMSwgMHgxODBjLCAweDIyMDQsIDB4YzBiZCwKKwkweDIwMTIsIDB4MDgwYywgMHg2YWQ1LCAweDExMjgsIDB4ZDBhNCwgMHgwMTE4LCAweDIyMDQsIDB4YzBmZCwKKwkweDIwMTIsIDB4MDgwYywgMHg2YTliLCAweDAxMjAsIDB4N2EwYywgMHhjMmI0LCAweDdhMGUsIDB4MDBhOCwKKwkweDcwN2YsIDB4MDAwMCwgMHgwODBjLCAweDc1M2QsIDB4MTEzMCwgMHg3MGIwLCAweDkwMDUsIDB4MTE2OCwKKwkweDA4MGMsIDB4Y2RlOCwgMHgwMDUwLCAweDA4MGMsIDB4Y2RlOCwgMHg3MGRjLCAweGQwOWMsIDB4MTEyOCwKKwkweDcwYjAsIDB4OTAwNSwgMHgwMTEwLCAweDA4MGMsIDB4NjAyNSwgMHg3MGU3LCAweDAwMDAsIDB4NzBlMywKKwkweDAwMDAsIDB4NzBhNywgMHgwMDAwLCAweDA4MGMsIDB4MjllNSwgMHgwMjI4LCAweDIwMTEsIDB4MDEwMSwKKwkweDIyMDQsIDB4YzBjNCwgMHgyMDEyLCAweDcyZGMsIDB4MDgwYywgMHg3NTNkLCAweDExNzgsIDB4OTAxNiwKKwkweDAwMTYsIDB4MDgwYywgMHgyNzc5LCAweDIwMTksIDB4MTk2YywgMHgyMTFhLCAweDAwMWUsIDB4NzA1ZiwKKwkweGZmZmYsIDB4NzA2MywgMHgwMGVmLCAweDcwODMsIDB4MDAwMCwgMHgwMDIwLCAweDIwMTksIDB4MTk2YywKKwkweDIwMWIsIDB4MDAwMCwgMHgyMDc5LCAweDE4NDcsIDB4NzgwNCwgMHhkMGFjLCAweDAxMDgsIDB4YzI5NSwKKwkweDcyZGUsIDB4MDgwYywgMHg3NTNkLCAweDAxMTgsIDB4OTI5NiwgMHgwMDA0LCAweDA1MTgsIDB4MjAxMSwKKwkweDAwMDEsIDB4MDgwYywgMHhjOThhLCAweDcwYWIsIDB4MDAwMCwgMHg3MGFmLCAweGZmZmYsIDB4NzAwMywKKwkweDAwMDIsIDB4MDBmZSwgMHgwODBjLCAweDMwMTEsIDB4MDgwYywgMHhhOTFlLCAweDIwMTEsIDB4MDAwNSwKKwkweDA4MGMsIDB4YTI0MywgMHgwODBjLCAweGE5M2EsIDB4MDgwYywgMHg3NTNkLCAweDAxNDgsIDB4MDBjNiwKKwkweDIwNjEsIDB4MDEwMCwgMHgwMDE2LCAweDA4MGMsIDB4Mjc3OSwgMHg2MWUyLCAweDAwMWUsIDB4MDBjZSwKKwkweDAxMmUsIDB4MDBlMCwgMHg3MGFiLCAweDAwMDAsIDB4NzBhZiwgMHhmZmZmLCAweDcwMDMsIDB4MDAwMiwKKwkweDA4MGMsIDB4YTkxZSwgMHgyMDExLCAweDAwMDUsIDB4MDgwYywgMHhhMjQzLCAweDA4MGMsIDB4YTkzYSwKKwkweDA4MGMsIDB4NzUzZCwgMHgwMTQ4LCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDAwMTYsIDB4MDgwYywKKwkweDI3NzksIDB4NjFlMiwgMHgwMDFlLCAweDAwY2UsIDB4MDBmZSwgMHgwMTJlLCAweDAwMDUsIDB4MDBjNiwKKwkweDAwYjYsIDB4MDgwYywgMHg3NTNkLCAweDExMTgsIDB4MjBhOSwgMHgwODAwLCAweDAwMTAsIDB4MjBhOSwKKwkweDA3ODIsIDB4MDgwYywgMHg3NTNkLCAweDExMTAsIDB4OTAwZSwgMHgwMDEwLCAweDIwMDksIDB4MDA3ZSwKKwkweDg2ZmYsIDB4MDEzOCwgMHg5MTgwLCAweDEwMDAsIDB4MjAwNCwgMHg5MDVkLCAweDAxMTAsIDB4YjgwMCwKKwkweGQwYmMsIDB4MDkwYywgMHgzMzQ5LCAweDgxMDgsIDB4MWYwNCwgMHgwYWYwLCAweDcwN2YsIDB4MDAwMCwKKwkweDcwODAsIDB4OTA4NCwgMHgwMGZmLCAweDcwODIsIDB4NzBiMywgMHgwMDAwLCAweDAwYmUsIDB4MDBjZSwKKwkweDAwMDUsIDB4MDBiNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDAwLCAweDkwODYsIDB4MDAwMiwKKwkweDE5MDQsIDB4MGJjMCwgMHg3MGFjLCAweDkwODYsIDB4ZmZmZiwgMHgwMTIwLCAweDA4MGMsIDB4MzAxMSwKKwkweDA4MDQsIDB4MGJjMCwgMHg3MGRjLCAweGQwYWMsIDB4MTExMCwgMHhkMDljLCAweDA1MzgsIDB4ZDA4NCwKKwkweDA1MjgsIDB4MDAwNiwgMHgyMDAxLCAweDAxMDMsIDB4MjAwMywgMHgwMDJiLCAweDAwMGUsIDB4ZDA4YywKKwkweDAxZTgsIDB4MDgwYywgMHgzM2IyLCAweDExYjAsIDB4NzBlMCwgMHg5MDg2LCAweGZmZmYsIDB4MDE5MCwKKwkweDA4MGMsIDB4MzFhNiwgMHg3MGRjLCAweGQwOTQsIDB4MTkwNCwgMHgwYmMwLCAweDIwMTEsIDB4MDAwMSwKKwkweDA4MGMsIDB4ZDA5YiwgMHgwMTEwLCAweDIwMTEsIDB4MDAwMywgMHg5MDFlLCAweDA4MGMsIDB4MzFlMCwKKwkweDA4MDQsIDB4MGJjMCwgMHg3MGU0LCAweDkwMDUsIDB4MTkwNCwgMHgwYmMwLCAweDcwYTgsIDB4OTAwNSwKKwkweDE5MDQsIDB4MGJjMCwgMHg3MGRjLCAweGQwYTQsIDB4MDExOCwgMHhkMGI0LCAweDA5MDQsIDB4MGJjMCwKKwkweDA4MGMsIDB4NmE5YiwgMHgxOTA0LCAweDBiYzAsIDB4MDgwYywgMHg2YWVlLCAweDE5MDQsIDB4MGJjMCwKKwkweDA4MGMsIDB4NmFkNSwgMHgwMWMwLCAweDAxNTYsIDB4MDBjNiwgMHgyMGE5LCAweDAwN2YsIDB4OTAwZSwKKwkweDAwMTYsIDB4MDgwYywgMHg2NjkzLCAweDExMTgsIDB4YjgwMCwgMHhkMGVjLCAweDExMzgsIDB4MDAxZSwKKwkweDgxMDgsIDB4MWYwNCwgMHgwYjYwLCAweDAwY2UsIDB4MDE1ZSwgMHgwMDI4LCAweDAwMWUsIDB4MDBjZSwKKwkweDAxNWUsIDB4MDgwNCwgMHgwYmMwLCAweDAwMDYsIDB4MjAwMSwgMHgwMTAzLCAweDIwMDMsIDB4MDAyYiwKKwkweDAwMGUsIDB4MjAxMSwgMHgxOWIyLCAweDA4MGMsIDB4MGZjZiwgMHgyMDExLCAweDE5Y2MsIDB4MDgwYywKKwkweDBmY2YsIDB4NzAzMCwgMHhjMDhjLCAweDcwMzIsIDB4NzAwMywgMHgwMDAzLCAweDcwYWYsIDB4ZmZmZiwKKwkweDA4MGMsIDB4MGU4NiwgMHg5MDA2LCAweDA4MGMsIDB4MjYwNiwgMHgwODBjLCAweDMzYjIsIDB4MDExOCwKKwkweDA4MGMsIDB4NGNlZiwgMHgwMDUwLCAweDAwMzYsIDB4MDA0NiwgMHgyMDE5LCAweGZmZmYsIDB4MjAyMSwKKwkweDAwMDYsIDB4MDgwYywgMHg0ZDA5LCAweDAwNGUsIDB4MDAzZSwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwKKwkweDA4MGMsIDB4NzU2MCwgMHgwMTUwLCAweDA4MGMsIDB4NzUzZCwgMHg3ODI4LCAweDAxMTgsIDB4OTA4NCwKKwkweGUxZmYsIDB4MDAxMCwgMHg5MDg0LCAweGZmZGYsIDB4NzgyYSwgMHgwMGZlLCAweDA4MGMsIDB4YTkxZSwKKwkweDIwMDEsIDB4MTllNywgMHgyMDA0LCAweDkwODYsIDB4MDAwNSwgMHgxMTIwLCAweDIwMTEsIDB4MDAwMCwKKwkweDA4MGMsIDB4YTI0MywgMHgyMDExLCAweDAwMDAsIDB4MDgwYywgMHhhMjRkLCAweDA4MGMsIDB4YTkzYSwKKwkweDAxMmUsIDB4MDBiZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwMDQ2LCAweDAwZjYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDc5LCAweDAxMDAsIDB4NzkwNCwgMHg5MThjLCAweGZmZmQsIDB4NzkwNiwKKwkweDIwMDksIDB4MDBmNywgMHgwODBjLCAweDYwMGUsIDB4Nzk0MCwgMHg5MThjLCAweDAwMTAsIDB4Nzk0MiwKKwkweDc5MjQsIDB4ZDFiNCwgMHgwMTIwLCAweDIwMTEsIDB4MDA0MCwgMHgwODBjLCAweDJhYjQsIDB4ZDE5YywKKwkweDAxMjAsIDB4MjAxMSwgMHgwMDA4LCAweDA4MGMsIDB4MmFiNCwgMHgwMDA2LCAweDAwMzYsIDB4MDE1NiwKKwkweDAwMDAsIDB4MjAwMSwgMHgxOWE2LCAweDIwMDQsIDB4OTAwNSwgMHgxNTE4LCAweDA4MGMsIDB4MmE0OCwKKwkweDExNDgsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjlhYiwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywKKwkweDI5OGUsIDB4MDBiOCwgMHgwODBjLCAweDJhNTAsIDB4MTEzOCwgMHg5MDA2LCAweDA4MGMsIDB4MjlhYiwKKwkweDkwMDYsIDB4MDgwYywgMHgyOThlLCAweDAwNjgsIDB4MDgwYywgMHgyYTU4LCAweDFkNTAsIDB4MjAwMSwKKwkweDE5OTcsIDB4MjAwNCwgMHhkMGZjLCAweDAxMDgsIDB4MDAyMCwgMHgwODBjLCAweDI3YTUsIDB4MDgwNCwKKwkweDBjYzEsIDB4MDgwYywgMHgyYWQ3LCAweDA4MGMsIDB4MmIwYSwgMHgyMGE5LCAweDAwM2EsIDB4MWQwNCwKKwkweDBjMTcsIDB4MDgwYywgMHg4N2I0LCAweDFmMDQsIDB4MGMxNywgMHgwODBjLCAweDc1NGUsIDB4MDE0OCwKKwkweDA4MGMsIDB4NzU2MCwgMHgxMTE4LCAweDA4MGMsIDB4Nzg0ZiwgMHgwMDUwLCAweDA4MGMsIDB4NzU0NSwKKwkweDBkZDAsIDB4MDgwYywgMHg3ODRhLCAweDA4MGMsIDB4Nzg0MCwgMHgwODBjLCAweDc0NmUsIDB4MDAyMCwKKwkweDIwMDksIDB4MDBmOCwgMHgwODBjLCAweDYwMGUsIDB4Nzg1MCwgMHhjMGU1LCAweDc4NTIsIDB4MDgwYywKKwkweDc1M2QsIDB4MDEyMCwgMHg3ODQzLCAweDAwOTAsIDB4Nzg0MywgMHgwMDEwLCAweDIwMjEsIDB4ZTY3OCwKKwkweDIwMTksIDB4ZWE2MCwgMHgwZDBjLCAweDg3YjQsIDB4NzgyMCwgMHhkMDljLCAweDE1YTAsIDB4MDgwYywKKwkweDc1M2QsIDB4MDkwNCwgMHgwY2EzLCAweDc4MjQsIDB4ZDBhYywgMHgxOTA0LCAweDBjYzYsIDB4MDgwYywKKwkweDc1NjAsIDB4MTU0OCwgMHgwMDQ2LCAweDIwMjEsIDB4MDMyMCwgMHg4NDIxLCAweDFkZjAsIDB4MDA0ZSwKKwkweDIwMTEsIDB4MTgwMCwgMHgwODBjLCAweDJhYjQsIDB4MDgwYywgMHgyYTYwLCAweDc4MjQsIDB4OTA4NCwKKwkweDE4MDAsIDB4MTE2OCwgMHg5NDg0LCAweDBmZmYsIDB4MTE0MCwgMHgyMDAxLCAweDE4MTAsIDB4MjAwNCwKKwkweDkwODQsIDB4OTAwMCwgMHgwMTEwLCAweDA4MGMsIDB4MGNlOSwgMHg4NDIxLCAweDExNjAsIDB4MWQwNCwKKwkweDBjNzMsIDB4MDgwYywgMHg4N2I0LCAweDA4MGMsIDB4Nzg0YSwgMHgwODBjLCAweDc4NDAsIDB4NzAwMywKKwkweDAwMDEsIDB4MDgwNCwgMHgwY2M2LCAweDgzMTksIDB4MTkyOCwgMHgyMDAxLCAweDE4MTAsIDB4MjAwNCwKKwkweDkwODQsIDB4OTAwMCwgMHgwMTEwLCAweDA4MGMsIDB4MGNlOSwgMHgxZDA0LCAweDBjODksIDB4MDgwYywKKwkweDg3YjQsIDB4MjAwOSwgMHgxOTlhLCAweDIxMDQsIDB4OTAwNSwgMHgwMTE4LCAweDgwMDEsIDB4MjAwYSwKKwkweDExODgsIDB4MjAwYiwgMHgwMDBhLCAweDIwMTEsIDB4MDA0OCwgMHgwODBjLCAweDJhYjQsIDB4MjBhOSwKKwkweDAwMDIsIDB4MDgwYywgMHgyYTQxLCAweDc5MjQsIDB4MDgwYywgMHgyYTYwLCAweGQxOWMsIDB4MDExMCwKKwkweDA4MGMsIDB4Mjk3YywgMHgwMGYwLCAweDA4MGMsIDB4NzU0ZSwgMHgxMTQwLCAweDk0YTIsIDB4MDNlOCwKKwkweDExMjgsIDB4MDgwYywgMHg3NTExLCAweDcwMDMsIDB4MDAwMSwgMHgwMGMwLCAweDIwMTEsIDB4MTgwMCwKKwkweDA4MGMsIDB4MmFiNCwgMHgwODBjLCAweDJhNjAsIDB4NzgyNCwgMHgwODBjLCAweDc1NTcsIDB4MDExMCwKKwkweGQwYWMsIDB4MTE2MCwgMHg5MDg0LCAweDE4MDAsIDB4MDkwNCwgMHgwYzdiLCAweDcwMDMsIDB4MDAwMSwKKwkweDAwMjgsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjYwNiwgMHgwMGEwLCAweDc4NTAsIDB4YzBlNCwKKwkweDc4NTIsIDB4MjAwOSwgMHgxODBjLCAweDIxMGMsIDB4ZDE5YywgMHgxMTIwLCAweDc5MDQsIDB4OTE4ZCwKKwkweDAwMDIsIDB4NzkwNiwgMHgyMDExLCAweDAwNDgsIDB4MDgwYywgMHgyYWI0LCAweDc4MjgsIDB4OTA4NSwKKwkweDAwMjgsIDB4NzgyYSwgMHgyMDAxLCAweDE5YTYsIDB4MjAwMywgMHgwMDAwLCAweDkwMDYsIDB4NzhmMiwKKwkweDAxNWUsIDB4MDAzZSwgMHgwMDBlLCAweDAxMmUsIDB4MDBmZSwgMHgwMDRlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LCAweDAwYjYsIDB4MDBjNiwKKwkweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDAxNTYsIDB4MDA3MSwgMHgwZDBjLCAweDg3YjQsIDB4MDE1ZSwKKwkweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDBiZSwgMHgwMDRlLCAweDAwM2UsIDB4MDAyZSwKKwkweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgxODllLCAweDcwMDQsIDB4OTA4NiwKKwkweDAwMDEsIDB4MTExMCwgMHgwODBjLCAweDM0ZTAsIDB4MDBlZSwgMHgwMDA1LCAweDAwMDUsIDB4MmE3MCwKKwkweDIwNjEsIDB4MTlhYSwgMHgyMDYzLCAweDAwMDMsIDB4NjAwNywgMHgwMDAzLCAweDYwMGIsIDB4MDAwOCwKKwkweDYwMGYsIDB4MDEzNywgMHgyMDAxLCAweDE5N2IsIDB4OTAwZSwgMHgyMTAyLCAweDcxOTYsIDB4MjAwMSwKKwkweDAxMDAsIDB4MjAwNCwgMHg5MDgyLCAweDAwMDIsIDB4MDIxOCwgMHg3MDVmLCAweGZmZmYsIDB4MDAwOCwKKwkweDcxNWUsIDB4NzA2NywgMHhmZmZmLCAweDcxN2UsIDB4NzE4MiwgMHgwODBjLCAweGNkZTgsIDB4NzBlZiwKKwkweDAwYzAsIDB4MjA2MSwgMHgxOTZiLCAweDYwMDMsIDB4MDkwOSwgMHg2MTA2LCAweDYwMGIsIDB4ODgwMCwKKwkweDYwMGYsIDB4MDIwMCwgMHg2MDEzLCAweDAwZmYsIDB4NjAxNywgMHgwMDFmLCAweDYxMWEsIDB4NjAxZiwKKwkweDA3ZDAsIDB4MjA2MSwgMHgxOTczLCAweDYwMDMsIDB4ODAwMCwgMHg2MTA2LCAweDYxMGEsIDB4NjAwZiwKKwkweDAyMDAsIDB4NjAxMywgMHgwMGZmLCAweDYxMTYsIDB4NjAxYiwgMHgwMDAxLCAweDYxMWUsIDB4MjA2MSwKKwkweDE5ODgsIDB4NjAwMywgMHg1MTRjLCAweDYwMDcsIDB4NGY0NywgMHg2MDBiLCAweDQ5NDMsIDB4NjAwZiwKKwkweDIwMjAsIDB4MjAwMSwgMHgxODJjLCAweDIxMDIsIDB4MDAwNSwgMHg5MDE2LCAweDA4MGMsIDB4NjY5MywKKwkweDExNzgsIDB4YjgwNCwgMHg5MGM0LCAweDAwZmYsIDB4OThjNiwgMHgwMDA2LCAweDAxMjgsIDB4OTBjNCwKKwkweGZmMDAsIDB4OThjNiwgMHgwNjAwLCAweDExMjAsIDB4OTE4NiwgMHgwMDgwLCAweDAxMDgsIDB4ODIxMCwKKwkweDgxMDgsIDB4OTE4NiwgMHgwODAwLCAweDFkNTAsIDB4MjIwOCwgMHgwMDA1LCAweDIwOTEsIDB4ODAwMCwKKwkweDIwNzksIDB4MDAwMCwgMHgwMDBlLCAweDAwZjYsIDB4MDAxMCwgMHgyMDkxLCAweDgwMDAsIDB4MGUwNCwKKwkweDBkN2YsIDB4MDAwNiwgMHgwMDE2LCAweDIwMDEsIDB4ODAwMiwgMHgwMDA2LCAweDIwNzksIDB4MDAwMCwKKwkweDAwMGUsIDB4Nzg4MiwgMHg3ODM2LCAweDAwMWUsIDB4Nzk4ZSwgMHgwMDBlLCAweDc4OGEsIDB4MDAwZSwKKwkweDc4ODYsIDB4MzkwMCwgMHg3ODlhLCAweDc4MzMsIDB4MDAxMiwgMHgyMDkxLCAweDUwMDAsIDB4MDE1NiwKKwkweDAwZDYsIDB4MDAzNiwgMHgwMDI2LCAweDIwNzksIDB4MDMwMCwgMHgyMDY5LCAweDFiMjYsIDB4N2EwOCwKKwkweDIyNmEsIDB4MjA2OSwgMHgxYjI3LCAweDdhMTgsIDB4MjI2YSwgMHg4ZDY4LCAweDdhMWMsIDB4MjI2YSwKKwkweDc4MmMsIDB4MjAxOSwgMHgxYjM0LCAweDIwMWEsIDB4MjAxOSwgMHgxYjM3LCAweDkwMTYsIDB4NzgwOCwKKwkweGQwOWMsIDB4MDE2OCwgMHg3ODIwLCAweDIwMWEsIDB4ODIxMCwgMHg4MzE4LCAweDkzODYsIDB4MWI1MCwKKwkweDAxMDgsIDB4MGNhOCwgMHg3ODA4LCAweGQwOWMsIDB4MDExMCwgMHgyMDExLCAweGRlYWQsIDB4MjAxOSwKKwkweDFiMzUsIDB4NzgyYywgMHgyMDFhLCAweDgzMTgsIDB4MjIxYSwgMHg3ODAzLCAweDAwMDAsIDB4MjA2OSwKKwkweDFhN2MsIDB4OTAxZSwgMHgyMGE5LCAweDAwMjAsIDB4N2IyNiwgMHg3YTI4LCAweDIyNmEsIDB4OGQ2OCwKKwkweDgzMTgsIDB4MWYwNCwgMHgwZGNjLCAweDIwNjksIDB4MWE5YywgMHgyMDE5LCAweDAwNTAsIDB4MjBhOSwKKwkweDAwMjAsIDB4N2IyNiwgMHg3YTI4LCAweDIyNmEsIDB4OGQ2OCwgMHg4MzE4LCAweDFmMDQsIDB4MGRkOSwKKwkweDA0OTEsIDB4MDAyZSwgMHgwMDNlLCAweDAwZGUsIDB4MDE1ZSwgMHgyMDc5LCAweDE4MDAsIDB4NzgwMywKKwkweDAwMDUsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MDE4MCwKKwkweDIwMDEsIDB4MWEyMSwgMHgyMDA0LCAweDkwMDUsIDB4MDEyOCwgMHgyMDAxLCAweDAwOGIsIDB4MjAwNCwKKwkweGQwZmMsIDB4MGRkOCwgMHgyMDAxLCAweDAwOGEsIDB4MjAwMywgMHgwMDAyLCAweDIwMDMsIDB4MTAwMSwKKwkweDA4MGMsIDB4NTc0ZCwgMHgxMTcwLCAweDA4MGMsIDB4MGYyMCwgMHgwMTEwLCAweDA4MGMsIDB4MGU3MywKKwkweDA4MGMsIDB4NTc0ZCwgMHgxMTMwLCAweDIwNzEsIDB4MTgwMCwgMHgyMDExLCAweDgwMDAsIDB4MDgwYywKKwkweDBmMzQsIDB4MGM3MCwgMHgwMDA1LCAweDIwMDEsIDB4MDM4MiwgMHgyMDA0LCAweDkwODQsIDB4MDAwNywKKwkweDkwODYsIDB4MDAwMSwgMHgxMTIwLCAweDIwMDEsIDB4MDAxNSwgMHgwODBjLCAweGE5MGYsIDB4MjA3OSwKKwkweDAzODAsIDB4MjA2OSwgMHgxYjA2LCAweDc4MTgsIDB4NjgwMiwgMHg3ODFjLCAweDY4MDYsIDB4Nzg0MCwKKwkweDY4MGEsIDB4Nzg0NCwgMHg2ODBlLCAweDc4MmMsIDB4NjgxMiwgMHgyMDE5LCAweDFiMTEsIDB4OTAxNiwKKwkweDc4MDgsIDB4ZDA5YywgMHgwMTUwLCAweDc4MjAsIDB4MjAxYSwgMHg4MjEwLCAweDgzMTgsIDB4ODIxMCwKKwkweDkyODIsIDB4MDAxMSwgMHgwZWE4LCAweDIwMTEsIDB4ZGVhZCwgMHg2YTJhLCAweDc4MzAsIDB4NjgxYSwKKwkweDc4MzQsIDB4NjgxZSwgMHg3ODM4LCAweDY4MjIsIDB4NzgzYywgMHg2ODI2LCAweDc4MDMsIDB4MDAwMCwKKwkweDIwNjksIDB4MWFjNiwgMHg5MDFlLCAweDIwYTksIDB4MDAyMCwgMHg3YjI2LCAweDc4MjgsIDB4MjA2YSwKKwkweDhkNjgsIDB4ODMxOCwgMHgxZjA0LCAweDBlNGQsIDB4MjA2OSwgMHgxYWU2LCAweDIwMTksIDB4MDBiMCwKKwkweDIwYTksIDB4MDAyMCwgMHg3YjI2LCAweDc4MjgsIDB4MjA2YSwgMHg4ZDY4LCAweDgzMTgsIDB4MWYwNCwKKwkweDBlNWEsIDB4MDAwNSwgMHg5MThjLCAweDAzZmYsIDB4MjAwMSwgMHgwMDAzLCAweDIwMDQsIDB4OTA4NCwKKwkweDA2MDAsIDB4MTExOCwgMHg5MThkLCAweDZjMDAsIDB4MDAxMCwgMHg5MThkLCAweDY0MDAsIDB4MjAwMSwKKwkweDAxN2YsIDB4MjEwMiwgMHgwMDA1LCAweDAwMjYsIDB4MDEyNiwgMHgyMDExLCAweDAwODAsIDB4MDgwYywKKwkweDBmMTIsIDB4MjBhOSwgMHgwOTAwLCAweDA4MGMsIDB4MGY0OCwgMHgyMDExLCAweDAwNDAsIDB4MDgwYywKKwkweDBmMTIsIDB4MjBhOSwgMHgwOTAwLCAweDA4MGMsIDB4MGY0OCwgMHgwYzc4LCAweDAwMjYsIDB4MDgwYywKKwkweDBmMjAsIDB4MTE4OCwgMHgyMDExLCAweDAxMGUsIDB4MjIxNCwgMHg5Mjk0LCAweDAwMDcsIDB4OTI5NiwKKwkweDAwMDcsIDB4MDExOCwgMHgyMDExLCAweDA5NDcsIDB4MDAxMCwgMHgyMDExLCAweDFiNDcsIDB4MDgwYywKKwkweDBmMzQsIDB4MDAyZSwgMHgwMDA1LCAweDIwMTEsIDB4MDEwZSwgMHgyMjE0LCAweDkyOTQsIDB4MDAwNywKKwkweDkyOTYsIDB4MDAwNywgMHgwMTE4LCAweDIwMTEsIDB4YTg4MCwgMHgwMDEwLCAweDIwMTEsIDB4Njg0MCwKKwkweGQwZTQsIDB4NzBmMywgMHgwMDAwLCAweDExMjAsIDB4NzBmMywgMHgwZmEwLCAweDA4MGMsIDB4MGYyNSwKKwkweDAwMmUsIDB4MDAwNSwgMHgwMDI2LCAweDA4MGMsIDB4MGYyMCwgMHgwMTQ4LCAweGQwYTQsIDB4MTEzOCwKKwkweDIwMTEsIDB4Y2RkNSwgMHgwMDEwLCAweDIwMTEsIDB4MDA4MCwgMHgwODBjLCAweDBmMjUsIDB4MDAyZSwKKwkweDAwMDUsIDB4MDAyNiwgMHg3MGYzLCAweDAwMDAsIDB4MDgwYywgMHgwZjIwLCAweDExMzAsIDB4MjAxMSwKKwkweDgwNDAsIDB4MDgwYywgMHgwZjM0LCAweDAwMmUsIDB4MDAwNSwgMHgwODBjLCAweDJhNTgsIDB4MTExOCwKKwkweDIwMTEsIDB4Y2RjNSwgMHgwMDEwLCAweDIwMTEsIDB4Y2FjMiwgMHgwODBjLCAweDBmMjUsIDB4MDAyZSwKKwkweDAwMDUsIDB4MDBlNiwgMHgwMDE2LCAweDAwMDYsIDB4MjA3MSwgMHgxODAwLCAweGQwYjQsIDB4NzBlYywKKwkweDcxZTgsIDB4MTExOCwgMHhjMGU0LCAweGMxZjQsIDB4MDA1MCwgMHgwMDA2LCAweDNiMDAsIDB4OTA4NCwKKwkweGZmM2UsIDB4MjBkOCwgMHgwMDBlLCAweDcwZjMsIDB4MDAwMCwgMHhjMGU1LCAweGMxZjUsIDB4MDA5OSwKKwkweDAwMGUsIDB4MDAxZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE4MDAsIDB4ZDBlNCwKKwkweDcwZWMsIDB4MTExMCwgMHhjMGRjLCAweDAwMDgsIDB4YzBkZCwgMHgwMDE2LCAweDcxZTgsIDB4MDAxOSwKKwkweDAwMWUsIDB4MDBlZSwgMHgwMDA1LCAweDcwZWUsIDB4NzFlYSwgMHg3MDAwLCAweDkwODQsIDB4MDAwNywKKwkweDAwMGIsIDB4MDAwNSwgMHgwZWQ4LCAweDBlYjIsIDB4MGViMiwgMHgwZTg2LCAweDBlYzEsIDB4MGViMiwKKwkweDBlYjIsIDB4MGVjMSwgMHhjMjg0LCAweDAwMTYsIDB4M2IwOCwgMHgzYTAwLCAweDkxMDQsIDB4OTE4ZCwKKwkweDAwYzEsIDB4MjFkOCwgMHg5MDg0LCAweGZmM2UsIDB4OTIwNSwgMHgyMGQwLCAweDAwMWUsIDB4MDAwNSwKKwkweDIwMDEsIDB4MTgzYiwgMHgyMDA0LCAweGQwZGMsIDB4MDAwNSwgMHg5ZTg2LCAweDE4MDAsIDB4MTkwYywKKwkweDBkN2QsIDB4NzBlYywgMHhkMGU0LCAweDAxMDgsIDB4YzJlNSwgMHg3MmVlLCAweGQwZTQsIDB4MTExOCwKKwkweDkyOTQsIDB4MDBjMSwgMHgwOGY5LCAweDAwMDUsIDB4OWU4NiwgMHgxODAwLCAweDE5MGMsIDB4MGQ3ZCwKKwkweDcwZTgsIDB4ZDBmNCwgMHgwMTA4LCAweGMyZjUsIDB4NzJlYSwgMHhkMGY0LCAweDExNDAsIDB4OTI4NCwKKwkweDgwMDAsIDB4ODAwNSwgMHhjMjg0LCAweDkyMTUsIDB4OTI5NCwgMHgwMGMxLCAweDA4NjEsIDB4MDAwNSwKKwkweDFkMDQsIDB4MGY0OCwgMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwgMHgwZjQ4LCAweDAwMDUsIDB4ODkwZSwKKwkweDgxMGUsIDB4ODEwZiwgMHg5MTk0LCAweDAwM2YsIDB4OTE4YywgMHhmZmMwLCAweDAwMDUsIDB4MDAwNiwKKwkweDIyMDAsIDB4OTE0ZCwgMHg4OTRmLCAweDg5NGQsIDB4ODk0ZCwgMHgwMDBlLCAweDAwMDUsIDB4MDFkNiwKKwkweDAxNDYsIDB4MDAzNiwgMHgwMDk2LCAweDIwNjEsIDB4MTg4ZCwgMHg2MDBiLCAweDAwMDAsIDB4NjAwZiwKKwkweDAwMDAsIDB4NjAwMywgMHgwMDAwLCAweDYwMDcsIDB4MDAwMCwgMHgyMDA5LCAweGZmYzAsIDB4MjEwNSwKKwkweDAwMDYsIDB4MjAwMSwgMHhhYWFhLCAweDIwMGYsIDB4MjAxOSwgMHg1NTU1LCAweDkwMTYsIDB4MjA0OSwKKwkweDBiZmYsIDB4YWIwMiwgMHhhMDAxLCAweGEwMDEsIDB4YTgwMCwgMHg5MzA2LCAweDExMzgsIDB4MjEwNSwKKwkweDkzMDYsIDB4MDEyMCwgMHg4MjEwLCAweDk5YzgsIDB4MDQwMCwgMHgwYzk4LCAweDAwMGUsIDB4MjAwZiwKKwkweDIwMDEsIDB4MTg5ZCwgMHg5MjhhLCAweDAwMGUsIDB4MTYzOCwgMHg5MjhhLCAweDAwMDYsIDB4MjAxMSwKKwkweDAwMDYsIDB4MTIxMCwgMHgyMDExLCAweDAwMDAsIDB4MjIwMiwgMHg5MDA2LCAweDIwMDgsIDB4ODJmZiwKKwkweDAxYjAsIDB4ODIwMCwgMHg2MDBhLCAweDYwMGYsIDB4ZmZmZiwgMHg2MDAzLCAweDAwMDIsIDB4NjAwNywKKwkweDAwMDAsIDB4MDAyNiwgMHgyMDE5LCAweDAwMTAsIDB4OTI4MCwgMHgwMDAxLCAweDIwZTgsIDB4MjFhMCwKKwkweDIxYTgsIDB4NDEwNCwgMHg4MzE5LCAweDFkZTAsIDB4ODIxMSwgMHgxZGEwLCAweDAwMmUsIDB4MDA5ZSwKKwkweDAwM2UsIDB4MDE0ZSwgMHgwMWRlLCAweDAwMDUsIDB4MjAxMSwgMHgwMDBlLCAweDA4ZTgsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDA5NiwgMHgzMzQ4LCAweDA4MGMsIDB4MGY0ZiwgMHgyMTAwLCAweDkzMDAsIDB4MjA5OCwKKwkweDIyZTAsIDB4MDA5ZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAzNiwgMHgzNTE4LCAweDIwYTksIDB4MDAwMSwKKwkweDQwMDIsIDB4ODAwNywgMHg0MDA0LCAweDgzMTksIDB4MWRkOCwgMHgwMDNlLCAweDAwMDUsIDB4MjBlOSwKKwkweDAwMDEsIDB4NzFiOCwgMHg4MWZmLCAweDExYzAsIDB4OTAwNiwgMHgyMDA5LCAweDAyMDAsIDB4MjBhOSwKKwkweDAwMDIsIDB4OTI5OCwgMHgwMDE4LCAweDIzYTAsIDB4NDAwMSwgMHgyMDA5LCAweDA3MDAsIDB4MjBhOSwKKwkweDAwMDIsIDB4OTI5OCwgMHgwMDA4LCAweDIzYTAsIDB4NDAwMSwgMHg3MDdjLCAweDgwMDcsIDB4NzE4MCwKKwkweDgxMGYsIDB4MjBhOSwgMHgwMDAyLCAweDQwMDEsIDB4OTI5OCwgMHgwMDBjLCAweDIzYTAsIDB4OTAwZSwKKwkweDA4MGMsIDB4MGQ1ZCwgMHgyMDAxLCAweDAwMDAsIDB4ODEwZiwgMHgyMGE5LCAweDAwMDIsIDB4NDAwMSwKKwkweDAwMDUsIDB4ODlmZiwgMHgwMTQwLCAweGE4MDQsIDB4YTgwNywgMHgwMDAwLCAweDAwMDYsIDB4MDgwYywKKwkweDEwNzksIDB4MDA5ZSwgMHgwY2IwLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE4MDAsIDB4MDgwYywKKwkweDEwZjIsIDB4MDkwYywgMHgwZDdkLCAweDAwZWUsIDB4MDAwNSwgMHgwMDg2LCAweDAwZTYsIDB4MDAwNiwKKwkweDAwMjYsIDB4MDAzNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGM5LCAweDIwNzEsIDB4MTgwMCwKKwkweDczYzAsIDB4NzAyYywgMHg5MDE2LCAweDkwNDUsIDB4MDE1OCwgMHg4MjEwLCAweDk5MDYsIDB4MDkwYywKKwkweDBkN2QsIDB4MjMwMCwgMHg5MjAyLCAweDAxMjAsIDB4MWEwYywgMHgwZDdkLCAweGEwMDAsIDB4MGM5OCwKKwkweDAxMmUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMGUsIDB4MDBlZSwgMHgwMDhlLCAweDAwMDUsIDB4MDA4NiwKKwkweDAwZTYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDE5MTAsIDB4NzAxMCwKKwkweDkwMDUsIDB4MDE0MCwgMHg3MDE4LCAweDkwNDUsIDB4MDEyOCwgMHg5OTA2LCAweDA5MGMsIDB4MGQ3ZCwKKwkweGEwMDAsIDB4MGNjOCwgMHgwMTJlLCAweDAwMGUsIDB4MDBlZSwgMHgwMDhlLCAweDAwMDUsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTgwMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MGMwLCAweDgwMDEsIDB4MDI3MCwKKwkweDcwYzIsIDB4NzAyYywgMHgyMDQ4LCAweDkwODUsIDB4MDAwMSwgMHhhODAwLCAweDcwMmUsIDB4YTgwMywKKwkweDAwMDAsIDB4YTgwNywgMHgwMDAwLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweDkwNGUsIDB4MGNkOCwKKwkweDAwZTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgxODAwLCAweDcwYzAsIDB4OTBjYSwKKwkweDAwMjAsIDB4MDI2OCwgMHg4MDAxLCAweDcwYzIsIDB4NzAyYywgMHgyMDQ4LCAweGE4MDAsIDB4NzAyZSwKKwkweGE4MDMsIDB4MDAwMCwgMHhhODA3LCAweDAwMDAsIDB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4OTA0ZSwKKwkweDBjZDgsIDB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDE2LCAweDg5MGUsIDB4ODEwZSwKKwkweDgxMGYsIDB4OTE4NCwgMHgwMDNmLCAweGE4NjIsIDB4OTE4NCwgMHhmZmMwLCAweGE4NWUsIDB4MDAxZSwKKwkweDAwMjAsIDB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDE4MDAsIDB4NzAyYywKKwkweGE4MDIsIDB4MjkwMCwgMHg3MDJlLCAweDcwYzAsIDB4ODAwMCwgMHg3MGMyLCAweDA4MGMsIDB4ODVjZSwKKwkweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwgMHg5MDI2LCAweDIwMDksIDB4MDAwMCwKKwkweDIwNDksIDB4MDQwMCwgMHgyOTAwLCAweDcwMmUsIDB4ODk0MCwgMHgyODAwLCAweGE4MDIsIDB4YTk1ZSwKKwkweGE4NjMsIDB4MDAwMSwgMHg4NDIwLCAweDk4ODYsIDB4MDQ0MCwgMHgwMTIwLCAweDI4NDgsIDB4OTE4OCwKKwkweDAwNDAsIDB4MGM5MCwgMHgyMDcxLCAweDE4OGQsIDB4NzAwMCwgMHg5MDA1LCAweDExYTAsIDB4MjAwMSwKKwkweDA1NTgsIDB4YTgwMiwgMHgyMDQ4LCAweDIwMDksIDB4NTYwMCwgMHg4OTQwLCAweDI4MDAsIDB4YTgwMiwKKwkweGE5NWUsIDB4YTg2MywgMHgwMDAxLCAweDg0MjAsIDB4OTg4NiwgMHgwODAwLCAweDAxMjAsIDB4Mjg0OCwKKwkweDkxODgsIDB4MDA0MCwgMHgwYzkwLCAweDIwNzEsIDB4MTg4ZCwgMHg3MTA0LCAweDcyMDAsIDB4ODJmZiwKKwkweDAxZDAsIDB4NzMwOCwgMHg4MzE4LCAweDgzMWYsIDB4ODMxYiwgMHg4MzFiLCAweDczMTIsIDB4ODMxOSwKKwkweDIwMDEsIDB4MDgwMCwgMHhhODAyLCAweDIwNDgsIDB4ODkwMCwgMHhhODAyLCAweDIwNDAsIDB4YTk1ZSwKKwkweGFhNjIsIDB4ODQyMCwgMHgyMzAwLCAweDk5MDYsIDB4MDEzMCwgMHgyODQ4LCAweDkxODgsIDB4MDA0MCwKKwkweDkyOTEsIDB4MDAwMCwgMHgwYzg4LCAweGE4MDMsIDB4MDAwMCwgMHgyMDcxLCAweDE4MDAsIDB4NzRiZSwKKwkweDc0YzIsIDB4MDAwNSwgMHgwMGU2LCAweDAwMTYsIDB4OTk4NCwgMHhmYzAwLCAweDAxZTgsIDB4OTA4YywKKwkweGY4MDAsIDB4MTE2OCwgMHg5OTgyLCAweDA0MDAsIDB4MDJiOCwgMHg5OTgyLCAweDA0NDAsIDB4MDI3OCwKKwkweDk5ODIsIDB4MDU1OCwgMHgwMjg4LCAweDk5ODIsIDB4MDgwMCwgMHgxMjcwLCAweDAwNDAsIDB4OTk4MiwKKwkweDA4MDAsIDB4MDI1MCwgMHgyMDcxLCAweDE4OGQsIDB4NzAxMCwgMHg5OTAyLCAweDEyMjgsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAxZSwgMHgwMGVlLCAweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LCAweDAwZTYsIDB4MjA3MSwKKwkweDFhMjAsIDB4NzAwNywgMHgwMDAwLCAweDkwMDYsIDB4NzAxZSwgMHg3MDIyLCAweDcwMDIsIDB4MjA3MSwKKwkweDAwMDAsIDB4NzAxMCwgMHg5MDg1LCAweDgwNDQsIDB4NzAxMiwgMHgyMDcxLCAweDAwODAsIDB4OTAwNiwKKwkweDcwMmIsIDB4MDA2MCwgMHgyMGE5LCAweDAwNDAsIDB4NzAyMiwgMHgxZjA0LCAweDExMmMsIDB4NzAyYiwKKwkweDAwNjAsIDB4NzAyYiwgMHgwMDIwLCAweDIwYTksIDB4MDA0MCwgMHg3MDIyLCAweDFmMDQsIDB4MTEzNSwKKwkweDcwMmIsIDB4MDAyMCwgMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDBlNiwKKwkweGEwNmYsIDB4MDAwMCwgMHgyMDcxLCAweDFhMjAsIDB4NzAxYywgMHg5MDg4LCAweDFhMmEsIDB4MjgwYSwKKwkweDgwMDAsIDB4OTA4NCwgMHgwMDNmLCAweDcwMWUsIDB4NzEyMCwgMHg5MTA2LCAweDA5MGMsIDB4MGQ3ZCwKKwkweDcwMDQsIDB4OTAwNSwgMHgxMTI4LCAweDAwZjYsIDB4MjA3OSwgMHgwMDgwLCAweDAwYTksIDB4MDBmZSwKKwkweDAwZWUsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwZTYsIDB4MjA3MSwKKwkweDFhMjAsIDB4NzAwNCwgMHg5MDA1LCAweDExMjgsIDB4MDBmNiwgMHgyMDc5LCAweDAwODAsIDB4MDAyMSwKKwkweDAwZmUsIDB4MDBlZSwgMHgwMTJlLCAweDAwMDUsIDB4NzAwNCwgMHg5MDg2LCAweDAwMDAsIDB4MTExMCwKKwkweDcwMDcsIDB4MDAwNiwgMHg3MDAwLCAweDAwMDIsIDB4MTE3ZSwgMHgxMzAxLCAweDExN2MsIDB4MTE3YywKKwkweDEyZjUsIDB4MTJmNSwgMHgxMmY1LCAweDEyZjUsIDB4MDgwYywgMHgwZDdkLCAweDcwMWMsIDB4NzEyMCwKKwkweDkxMDYsIDB4MTE0OCwgMHg3OTJjLCAweDkxODQsIDB4MDAwMSwgMHgxMTIwLCAweGQxZmMsIDB4MTExMCwKKwkweDcwMDcsIDB4MDAwMCwgMHgwMDA1LCAweDAwOTYsIDB4OTE4MCwgMHgxYTJhLCAweDIwMDQsIDB4NzAwYSwKKwkweDIwNDgsIDB4ODEwOCwgMHg5MThjLCAweDAwM2YsIDB4NzEyMiwgMHg3ODJiLCAweDAwMjYsIDB4YTg4YywKKwkweDc4MDIsIDB4YTg5MCwgMHg3ODA2LCAweGE4OTQsIDB4NzgwYSwgMHhhODk4LCAweDc4MGUsIDB4YTg3OCwKKwkweDcwMGUsIDB4YTg3MCwgMHg3MDE2LCAweGE4NzQsIDB4NzAxYSwgMHhhODY4LCAweDAwOWUsIDB4ZDA4NCwKKwkweDAxMjAsIDB4NzAwNywgMHgwMDAxLCAweDAwMjksIDB4MDAwNSwgMHg3MDA3LCAweDAwMDIsIDB4MDBiMSwKKwkweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDcxMGMsIDB4MjAxMSwgMHgwMDQwLCAweDkxODIsIDB4MDA0MCwKKwkweDEyMTAsIDB4MjExMCwgMHg5MDA2LCAweDcwMGUsIDB4NzIxMiwgMHg4MjAzLCAweDc4MTIsIDB4NzgyYiwKKwkweDAwMjAsIDB4NzgyYiwgMHgwMDQxLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwKKwkweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDcwMTQsIDB4MjBlMCwgMHg3MDE4LCAweDIwOTgsIDB4MjBlOSwKKwkweDAwMDAsIDB4MjBhMSwgMHgwMDg4LCAweDc4MmIsIDB4MDAyNiwgMHg3MTBjLCAweDIwMTEsIDB4MDA0MCwKKwkweDkxODIsIDB4MDA0MCwgMHgxMjEwLCAweDIxMTAsIDB4OTAwNiwgMHg3MDBlLCAweDIyYTgsIDB4NDAwNiwKKwkweDgyMDMsIDB4NzgxMiwgMHg3ODJiLCAweDAwMjAsIDB4MzMwMCwgMHg3MDFhLCAweDc4MmIsIDB4MDAwMSwKKwkweDAxNWUsIDB4MDE0ZSwgMHgwMTNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDIwMDksIDB4MWEyMCwKKwkweDIxMDQsIDB4YzA5NSwgMHgyMDBhLCAweDA4MGMsIDB4MTE1YiwgMHgwMDA1LCAweDAwMTYsIDB4MDBlNiwKKwkweDIwNzEsIDB4MWEyMCwgMHgwMGY2LCAweDIwNzksIDB4MDA4MCwgMHg3OTJjLCAweGQxYmMsIDB4MTkwYywKKwkweDBkNzYsIDB4NzgyYiwgMHgwMDAyLCAweGQxZmMsIDB4MDEyMCwgMHg5MThjLCAweDA3MDAsIDB4NzAwNCwKKwkweDAwMjMsIDB4MDBmZSwgMHgwMGVlLCAweDAwMWUsIDB4MDAwNSwgMHgxMTZjLCAweDEyMTQsIDB4MTI0OCwKKwkweDEzMjAsIDB4MGQ3ZCwgMHgxMzNiLCAweDBkN2QsIDB4OTE4YywgMHgwNzAwLCAweDE1NTAsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHg3MDE0LCAweDIwZTgsIDB4NzAxOCwgMHgyMGEwLCAweDIwZTEsIDB4MDAwMCwKKwkweDIwOTksIDB4MDA4OCwgMHg3ODJiLCAweDAwNDAsIDB4NzAxMCwgMHgyMGE4LCAweDQwMDUsIDB4MzQwMCwKKwkweDcwMWEsIDB4MDE1ZSwgMHgwMTRlLCAweDAxM2UsIDB4NzAwYywgMHg5MDA1LCAweDA1NzgsIDB4NzgwMCwKKwkweDc4MDIsIDB4NzgwNCwgMHg3ODA2LCAweDA4MGMsIDB4MTFiMSwgMHgwMDA1LCAweDcwMDgsIDB4MDA5NiwKKwkweDIwNDgsIDB4YTg2ZiwgMHgwMTAwLCAweDAwOWUsIDB4NzAwNywgMHgwMDAwLCAweDA4MGMsIDB4MTE2YywKKwkweDAwMDUsIDB4NzAwOCwgMHgwMDk2LCAweDIwNDgsIDB4YTg2ZiwgMHgwMjAwLCAweDAwOWUsIDB4MGNhMCwKKwkweDkxOGMsIDB4MDcwMCwgMHgxMTUwLCAweDcwMGMsIDB4OTAwNSwgMHgwMTgwLCAweDc4MDAsIDB4NzgwMiwKKwkweDc4MDQsIDB4NzgwNiwgMHgwODBjLCAweDExYzYsIDB4MDAwNSwgMHg3MDA4LCAweDAwOTYsIDB4MjA0OCwKKwkweGE4NmYsIDB4MDIwMCwgMHgwMDllLCAweDcwMDcsIDB4MDAwMCwgMHgwMDgwLCAweDAwOTYsIDB4NzAwOCwKKwkweDIwNDgsIDB4NzgwMCwgMHhhODhlLCAweDc4MDQsIDB4YTg5MiwgMHg3ODA4LCAweGE4OTYsIDB4NzgwYywKKwkweGE4OWEsIDB4YTg2ZiwgMHgwMTAwLCAweDAwOWUsIDB4NzAwNywgMHgwMDAwLCAweDAwOTYsIDB4MDBkNiwKKwkweDcwMDgsIDB4MjA0OCwgMHgyMDAxLCAweDE4YjksIDB4MjAwNCwgMHg5OTA2LCAweDExMjgsIDB4YTg5YywKKwkweDA4MGYsIDB4MDBkZSwgMHgwMDllLCAweDAwYTAsIDB4MDBkZSwgMHgwMDllLCAweDAwOTYsIDB4MDBkNiwKKwkweDcwMDgsIDB4MjA0OCwgMHgwMDgxLCAweDAxNTAsIDB4YTg5YywgMHgwMDg2LCAweDI5NDAsIDB4MDgwZiwKKwkweDAwOGUsIDB4MDBkZSwgMHgwMDllLCAweDA4MGMsIDB4MTE1YiwgMHgwMDA1LCAweDAwZGUsIDB4MDA5ZSwKKwkweDA4MGMsIDB4MTE1YiwgMHgwMDA1LCAweGE4YTgsIDB4ZDA4YywgMHgwMDA1LCAweDAwOTYsIDB4YTBhMCwKKwkweDkwNGQsIDB4MDkwYywgMHgwZDdkLCAweGEwNmMsIDB4OTA4ZSwgMHgwMTAwLCAweDAxMzAsIDB4YTg3YiwKKwkweDAwMzAsIDB4YTg4MywgMHgwMDAwLCAweGE4OTcsIDB4NDAwMiwgMHgwODBjLCAweDZkZTIsIDB4YTA5ZiwKKwkweDAwMDAsIDB4YTBhMywgMHgwMDAwLCAweDI4NDgsIDB4MDgwYywgMHgxMDc5LCAweDAwOWUsIDB4MDAwNSwKKwkweDAwYTYsIDB4YTBhMCwgMHg5MDRkLCAweDA5MGMsIDB4MGQ3ZCwgMHhhMDZjLCAweDkwOGUsIDB4MDEwMCwKKwkweDAxMjgsIDB4YTg3YiwgMHgwMDAxLCAweGE4ODMsIDB4MDAwMCwgMHgwMGMwLCAweGE4MGMsIDB4MjA1MCwKKwkweGIwMDQsIDB4OTAwNSwgMHgwMTk4LCAweGE4MGUsIDB4MjA1MCwgMHg4MDA2LCAweDgwMDYsIDB4ODAwNywKKwkweDkwOGMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDAyLCAweGEwNzYsIDB4YTE3MiwKKwkweGIwMDAsIDB4YTA3YSwgMHgyODEwLCAweDA4MGMsIDB4MTEzYywgMHgwMGU4LCAweGE5N2MsIDB4YTg5NCwKKwkweDAwMTYsIDB4MDAwNiwgMHgwODBjLCAweDZkZTIsIDB4MDAwZSwgMHgwMDFlLCAweGQxZmMsIDB4MTEzOCwKKwkweGQxZjQsIDB4MDEyOCwgMHgwMGM2LCAweDIwNjAsIDB4MDgwYywgMHhhY2IwLCAweDAwY2UsIDB4NzAwOCwKKwkweDIwNDgsIDB4YTg5ZiwgMHgwMDAwLCAweGE4YTMsIDB4MDAwMCwgMHgwODBjLCAweDEwNzksIDB4NzAwNywKKwkweDAwMDAsIDB4MDgwYywgMHgxMTViLCAweDAwYWUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDc4MmIsIDB4MTAwMSwgMHg3MDA3LCAweDAwMDUsIDB4NzAwMCwgMHhjMDk0LCAweDcwMDIsIDB4MDEyZSwKKwkweDAwMDUsIDB4MDA5NiwgMHgyMDAxLCAweDE5MmUsIDB4MjA0YywgMHhhODdjLCAweDc4MTIsIDB4YTg4YywKKwkweDc4MDIsIDB4YTg5MCwgMHg3ODA2LCAweGE4OTQsIDB4NzgwYSwgMHhhODk4LCAweDc4MGUsIDB4NzgyYiwKKwkweDAwMjAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzgyYiwgMHgwMDQxLCAweDcwMDcsIDB4MDAwMywKKwkweDcwMDAsIDB4YzA4NCwgMHg3MDAyLCAweDI5MDAsIDB4NzAwYSwgMHgwMTJlLCAweDAwOWUsIDB4MDAwNSwKKwkweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAwODgsIDB4NzgyYiwgMHgwMDQwLCAweDAwOTYsIDB4MjAwMSwKKwkweDE5MmUsIDB4MjA0YywgMHhhYTdjLCAweDAwOWUsIDB4MDgwYywgMHg4Y2IyLCAweDIwMDksIDB4MTg4YywKKwkweDIxMDQsIDB4OTA4NCwgMHhmZmZjLCAweDIwMGEsIDB4MDgwYywgMHg4YjE4LCAweDcwMDcsIDB4MDAwMCwKKwkweDA4MGMsIDB4MTE2YywgMHgwMDA1LCAweDcwMDcsIDB4MDAwMCwgMHgwODBjLCAweDExNmMsIDB4MDAwNSwKKwkweDAxMjYsIDB4MjA5MSwgMHgyMjAwLCAweDIwNzksIDB4MDMwMCwgMHgyMDcxLCAweDFhNmEsIDB4NzAwMywKKwkweDAwMDAsIDB4NzhiZiwgMHgwMGY2LCAweDAwNDEsIDB4NzgwNywgMHgwMDA3LCAweDc4MDMsIDB4MDAwMCwKKwkweDc4MDMsIDB4MDAwMSwgMHgwMTJlLCAweDAwMDUsIDB4MDBjNiwgMHg3ODAzLCAweDAwMDAsIDB4MjAwMSwKKwkweDAxNjUsIDB4MjAwMywgMHg0MTk4LCAweDc4MDgsIDB4ZDA5YywgMHgwMTE4LCAweDc4MjAsIDB4MDRlOSwKKwkweDBjZDAsIDB4MjAwMSwgMHgxYTZiLCAweDIwMDMsIDB4MDAwMCwgMHg3OGFiLCAweDAwMDQsIDB4NzhhYywKKwkweGQwYWMsIDB4MWRlOCwgMHg3OGFiLCAweDAwMDIsIDB4NzgwNywgMHgwMDA3LCAweDc4MjcsIDB4MDAzMCwKKwkweDc4MmIsIDB4MDQwMCwgMHg3ODI3LCAweDAwMzEsIDB4NzgyYiwgMHgxYTdjLCAweDc4MWYsIDB4ZmYwMCwKKwkweDc4MWIsIDB4ZmYwMCwgMHgyMDAxLCAweDAyMDAsIDB4MjAwNCwgMHhkMGRjLCAweDAxMTAsIDB4NzgxZiwKKwkweDAzMDMsIDB4MjA2MSwgMHgxYTdjLCAweDYwMmYsIDB4MWRkYywgMHgyMDAxLCAweDE4MWEsIDB4MjAwNCwKKwkweDkwODIsIDB4MWRkYywgMHg2MDMyLCAweDYwM2IsIDB4MWVhYiwgMHg2MDJiLCAweDFhYmMsIDB4NjAwNywKKwkweDFhOWMsIDB4MjA2MSwgMHgxYTljLCAweDYwNmYsIDB4MTkzYywgMHgyMDAxLCAweDE5MjcsIDB4MjAwNCwKKwkweDYwN2EsIDB4NzgzZiwgMHgzM2I5LCAweDAwY2UsIDB4MDAwNSwgMHg5MDg2LCAweDAwMGQsIDB4MTFkMCwKKwkweDc4MDgsIDB4ZDA5YywgMHgwMWI4LCAweDc4MjAsIDB4MDAyNiwgMHgyMDEwLCAweDA4MGMsIDB4Yzk2OCwKKwkweDAxODAsIDB4MjI2MCwgMHg2MDAwLCAweDkwODYsIDB4MDAwNCwgMHgxMTU4LCAweDAwMTYsIDB4NjEyMCwKKwkweDkxODYsIDB4MDAwOSwgMHgwMTA4LCAweDAwMjAsIDB4MjAwOSwgMHgwMDRjLCAweDA4MGMsIDB4YWQ0ZCwKKwkweDAwMWUsIDB4MDAyZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHgyMjAwLCAweDc5MDgsIDB4OTE4NCwKKwkweDAwNzAsIDB4MTkwYywgMHgwZDc2LCAweGQxOWMsIDB4MDVhMCwgMHg3ODIwLCAweDkwOGMsIDB4ZjAwMCwKKwkweDA1NDAsIDB4MjA2MCwgMHg2MDIwLCAweDkwODYsIDB4MDAwMywgMHgxNTUwLCAweDYwMDAsIDB4OTA4NiwKKwkweDAwMDQsIDB4MTUzMCwgMHg2MTE0LCAweDIxNDgsIDB4YTg3NiwgMHhhODdhLCAweGE4NjcsIDB4MDEwMywKKwkweDA4MGMsIDB4NmMwNCwgMHgwMGI2LCAweDYwMTAsIDB4MjA1OCwgMHhiYTNjLCAweDgyMTEsIDB4MDIwOCwKKwkweGJhM2UsIDB4YjhkMCwgMHg5MDA1LCAweDE5MGMsIDB4NjdiZSwgMHgwMGJlLCAweDYwNDQsIDB4ZDBmYywKKwkweDE5MGMsIDB4YTk0NywgMHgwODBjLCAweGFjZDksIDB4NzgwOCwgMHhkMDljLCAweDE5YjAsIDB4MDEyZSwKKwkweDAwMDUsIDB4OTA4YSwgMHgwMDI0LCAweDFhMGMsIDB4MGQ3ZCwgMHgwMDJiLCAweDAxMmUsIDB4MDAwNSwKKwkweDA0YjAsIDB4MDEyZSwgMHgwMDA1LCAweDE0MWYsIDB4MTQ0NSwgMHgxNDc1LCAweDE0N2EsIDB4MTQ3ZSwKKwkweDE0ODMsIDB4MTRhYiwgMHgxNGFmLCAweDE0YmQsIDB4MTRjMSwgMHgxNDFmLCAweDE1OGUsIDB4MTU5MiwKKwkweDE2MDQsIDB4MTYwYiwgMHgxNDFmLCAweDE2MGMsIDB4MTYwZCwgMHgxNjE4LCAweDE2MWYsIDB4MTQxZiwKKwkweDE0MWYsIDB4MTQxZiwgMHgxNDFmLCAweDE0MWYsIDB4MTQxZiwgMHgxNDFmLCAweDE0ODUsIDB4MTQxZiwKKwkweDE0NGQsIDB4MTQ3MiwgMHgxNDM5LCAweDE0MWYsIDB4MTQ1OSwgMHgxNDIzLCAweDE0MjEsIDB4MDgwYywKKwkweDBkN2QsIDB4MDgwYywgMHgwZDc2LCAweDA4MGMsIDB4MTYyYSwgMHgyMDA5LCAweDFhNzgsIDB4MjEwNCwKKwkweDgwMDAsIDB4MjAwYSwgMHgwODBjLCAweDdmZWQsIDB4MDgwYywgMHgxYjEwLCAweDAwMDUsIDB4NjA0NCwKKwkweGQwZmMsIDB4MTkwYywgMHhhOTQ3LCAweDIwMDksIDB4MDA1NSwgMHgwODBjLCAweGFkNGQsIDB4MDEyZSwKKwkweDAwMDUsIDB4MDgwYywgMHgxNjJhLCAweDIwNjAsIDB4NjA0NCwgMHhkMGZjLCAweDE5MGMsIDB4YTk0NywKKwkweDIwMDksIDB4MDA1NSwgMHgwODBjLCAweGFkNGQsIDB4MDAwNSwgMHgyMDA5LCAweDAwNDgsIDB4MDgwYywKKwkweDE2MmEsIDB4MjA2MCwgMHgwODBjLCAweGFkNGQsIDB4MDAwNSwgMHgyMDA5LCAweDAwNTQsIDB4MDgwYywKKwkweDE2MmEsIDB4MjA2MCwgMHg2MDQ0LCAweGQwZmMsIDB4MTkwYywgMHhhOTQ3LCAweDA4MGMsIDB4YWQ0ZCwKKwkweDAwMDUsIDB4MDgwYywgMHgxNjJhLCAweDIwNjAsIDB4MDA1NiwgMHgwMDY2LCAweDA4MGMsIDB4MTYyYSwKKwkweDIwMjgsIDB4MDgwYywgMHgxNjJhLCAweDIwMzAsIDB4MDAzNiwgMHgwMDQ2LCAweDIwMjEsIDB4MDAwMCwKKwkweDI0MTgsIDB4MjAwOSwgMHgwMDU2LCAweDA4MGMsIDB4YWQ0ZCwgMHgwMDRlLCAweDAwM2UsIDB4MDA2ZSwKKwkweDAwNWUsIDB4MDAwNSwgMHgwODBjLCAweDE2MmEsIDB4MDAwNSwgMHg3MDA0LCAweGMwODUsIDB4YzBiNSwKKwkweDcwMDYsIDB4MDAwNSwgMHg3MDA0LCAweGMwODUsIDB4NzAwNiwgMHgwMDA1LCAweDA4MGMsIDB4MTYyYSwKKwkweDA4MGMsIDB4MTcwYiwgMHgwMDA1LCAweDA4MGMsIDB4MGQ3ZCwgMHgwODBjLCAweDE2MmEsIDB4MjA2MCwKKwkweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4M2IsIDB4ZmZmZiwgMHgwMDllLCAweDIwMDksIDB4MDA0OCwKKwkweDA4MGMsIDB4YWQ0ZCwgMHgyMDAxLCAweDAxNWQsIDB4MjAwMywgMHgwMDAwLCAweDIwMDksIDB4MDNlOCwKKwkweDgxMDksIDB4MDE2MCwgMHgyMDAxLCAweDAyMDEsIDB4MjAwNCwgMHg5MDA1LCAweDBkYzgsIDB4MjAwMSwKKwkweDAyMTgsIDB4MjAwNCwgMHhkMGVjLCAweDExMTAsIDB4MDgwYywgMHgxNjJmLCAweDIwMDEsIDB4MDMwNywKKwkweDIwMDMsIDB4ODAwMCwgMHgwMDA1LCAweDcwMDQsIDB4YzA5NSwgMHg3MDA2LCAweDAwMDUsIDB4MDgwYywKKwkweDE2MmEsIDB4MjA2MCwgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwgMHhhODNiLCAweGZmZmYsIDB4MDA5ZSwKKwkweDIwMDksIDB4MDA0OCwgMHgwODBjLCAweGFkNGQsIDB4MDAwNSwgMHgwODBjLCAweDE2MmEsIDB4MDgwYywKKwkweDBkN2QsIDB4MDgwYywgMHgxNjJhLCAweDA4MGMsIDB4MTU3OSwgMHg3ODI3LCAweDAwMTgsIDB4NzlhYywKKwkweGQxZGMsIDB4MDkwNCwgMHgxNTJhLCAweDc4MjcsIDB4MDAxNSwgMHg3ODI4LCAweDc4MmIsIDB4MDAwMCwKKwkweDkwNjUsIDB4MDE0MCwgMHgyMDAxLCAweDAyMGQsIDB4MjAwMywgMHgwMDUwLCAweDIwMDMsIDB4MDAyMCwKKwkweDA4MDQsIDB4MTUzMCwgMHg3MDA0LCAweDkwMDUsIDB4MDFjOCwgMHgxMTg4LCAweDc4YWIsIDB4MDAwNCwKKwkweDc4MjcsIDB4MDAxOCwgMHg3ODJiLCAweDAwMDAsIDB4ZDFiYywgMHgwOTBjLCAweDBkN2QsIDB4MjAwMSwKKwkweDAyMGQsIDB4MjAwMywgMHgwMDUwLCAweDIwMDMsIDB4MDAyMCwgMHgwODA0LCAweDE1NWUsIDB4NzhhYiwKKwkweDAwMDQsIDB4NzgwMywgMHgwMDAxLCAweDA4MGMsIDB4MTU5MiwgMHgwMDA1LCAweDc4MjcsIDB4MDAxOCwKKwkweGEwMDEsIDB4NzgyOCwgMHg3ODI3LCAweDAwMTEsIDB4YTAwMSwgMHg3OTI4LCAweDkxMDYsIDB4MDExMCwKKwkweDc5YWMsIDB4MDhlMCwgMHgwMGU2LCAweDIwNzEsIDB4MDIwMCwgMHg3MDJjLCAweGQwYzQsIDB4MDE0MCwKKwkweDAwZWUsIDB4MDgwYywgMHgxYjEwLCAweDA4MGMsIDB4MTM1NCwgMHg3ODAzLCAweDAwMDEsIDB4MDAwNSwKKwkweDcwMzcsIDB4MDAwMSwgMHhhMDAxLCAweDcxNTAsIDB4MDBlZSwgMHg5MThjLCAweGZmMDAsIDB4OTE4NiwKKwkweDA1MDAsIDB4MDExMCwgMHg3OWFjLCAweDA4MTAsIDB4NzAwNCwgMHhjMDlkLCAweDcwMDYsIDB4NzhhYiwKKwkweDAwMDQsIDB4NzgwMywgMHgwMDAxLCAweDA4MGMsIDB4MTU5MiwgMHgyMDAxLCAweDAyMGQsIDB4MjAwMywKKwkweDAwMjAsIDB4MDAwNSwgMHg3ODI4LCAweDc4MmIsIDB4MDAwMCwgMHg5MDY1LCAweDA5MGMsIDB4MGQ3ZCwKKwkweDYwMTQsIDB4MjA0OCwgMHg3OGFiLCAweDAwMDQsIDB4OTE4YywgMHgwNzAwLCAweDAxYTgsIDB4MDgwYywKKwkweDdmZWQsIDB4MDgwYywgMHgxYjEwLCAweDA4MGMsIDB4Yzk3YSwgMHgwMTU4LCAweGE5YWMsIDB4YTkzNiwKKwkweGE5YjAsIDB4YTkzYSwgMHhhODNmLCAweGZmZmYsIDB4YTg0MywgMHhmZmZmLCAweGE4ODAsIDB4YzBiZCwKKwkweGE4ODIsIDB4MDgwYywgMHhjNTY2LCAweDAwMDUsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDksIDB4MTEyOCwKKwkweDIwMDksIDB4MDA0YywgMHgwODBjLCAweGFkNGQsIDB4MDA0OCwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwKKwkweGI4MDAsIDB4MDBiZSwgMHhkMGJjLCAweDYwMjQsIDB4MTkwYywgMHhjZDdkLCAweDIwMjksIDB4MDBjOCwKKwkweDg1MjksIDB4MDEyOCwgMHgyMDAxLCAweDAyMDEsIDB4MjAwNCwgMHg5MDA1LCAweDBkYzgsIDB4N2RiYywKKwkweDA4MGMsIDB4ZTg1YSwgMHhkNWE0LCAweDExMTgsIDB4MDgwYywgMHgxNjJmLCAweDAwMDUsIDB4MDgwYywKKwkweDdmZWQsIDB4MDgwYywgMHgxYjEwLCAweDAwMDUsIDB4NzgxZiwgMHgwMzAwLCAweDc4MDMsIDB4MDAwMSwKKwkweDAwMDUsIDB4MDAxNiwgMHgwMDY2LCAweDAwNzYsIDB4MDBmNiwgMHgyMDc5LCAweDAzMDAsIDB4NzkwOCwKKwkweDkxOGMsIDB4MDAwNywgMHg5MTg2LCAweDAwMDMsIDB4MDEyMCwgMHgyMDAxLCAweDAwMTYsIDB4MDgwYywKKwkweDE2YTAsIDB4MDBmZSwgMHgwMDdlLCAweDAwNmUsIDB4MDAxZSwgMHgwMDA1LCAweDcwMDQsIDB4YzA5ZCwKKwkweDcwMDYsIDB4MDAwNSwgMHg3MTA0LCAweDkxODQsIDB4MDAwNCwgMHgxOTBjLCAweDBkN2QsIDB4ZDE4NCwKKwkweDExYjEsIDB4ZDE5YywgMHgwMTgwLCAweGMxOWMsIDB4NzEwNiwgMHgwMDE2LCAweDA4MGMsIDB4MTZlZSwKKwkweDAwMWUsIDB4MDE0OCwgMHgyMDAxLCAweDAyMGQsIDB4MjAwMywgMHgwMDUwLCAweDIwMDMsIDB4MDAyMCwKKwkweDA4MGMsIDB4MTYyZiwgMHgwMDA1LCAweDgxZmYsIDB4MTkwYywgMHgwZDdkLCAweDAwMDUsIDB4MjEwMCwKKwkweGMxODQsIDB4YzFiNCwgMHg3MTA2LCAweGQwYjQsIDB4MDAxNiwgMHgwMGU2LCAweDE5MDQsIDB4MTVmOSwKKwkweDIwNzEsIDB4MDIwMCwgMHgwODBjLCAweDE2ZGIsIDB4MDVlMCwgMHgwODBjLCAweDE2ZWUsIDB4MDViMCwKKwkweDYwMTQsIDB4OTAwNSwgMHgwNWIwLCAweDAwOTYsIDB4MjA0OCwgMHhhODY0LCAweDAwOWUsIDB4OTA4NCwKKwkweDAwZmYsIDB4OTA4ZSwgMHgwMDI5LCAweDAxNjAsIDB4OTA4ZSwgMHgwMDQ4LCAweDE1NTAsIDB4NjAxYywKKwkweGQwODQsIDB4MTFlMCwgMHgwMGY2LCAweDJjNzgsIDB4MDgwYywgMHgxNzc4LCAweDAwZmUsIDB4MDBiMCwKKwkweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweDE5MDEsIDB4MDBmZSwgMHgyMDA5LCAweDAxZjQsIDB4ODEwOSwKKwkweDAxNjgsIDB4MjAwMSwgMHgwMjAxLCAweDIwMDQsIDB4OTAwNSwgMHgwZGM4LCAweDIwMDEsIDB4MDIxOCwKKwkweDIwMDQsIDB4ZDBlYywgMHgxMTE4LCAweDA4MGMsIDB4MTYyZiwgMHgwMDQwLCAweDIwMDEsIDB4MDIwZCwKKwkweDIwMDMsIDB4MDAyMCwgMHgwODBjLCAweDEzNTQsIDB4NzgwMywgMHgwMDAxLCAweDAwZWUsIDB4MDAxZSwKKwkweDAwMDUsIDB4MDgwYywgMHgxNmVlLCAweDBkZDAsIDB4MjAwMSwgMHgwMjBkLCAweDIwMDMsIDB4MDA1MCwKKwkweDIwMDMsIDB4MDAyMCwgMHgwNDYxLCAweDBjOTAsIDB4MDQyOSwgMHgyMDYwLCAweDIwMDksIDB4MDA1MywKKwkweDA4MGMsIDB4YWQ0ZCwgMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHgwMGUxLCAweDIwMDgsIDB4MDBkMSwKKwkweDAwMDYsIDB4NzAwNCwgMHhjMDlkLCAweDcwMDYsIDB4MDAwZSwgMHgwODBjLCAweDkwMDMsIDB4MDAwNSwKKwkweDAwODksIDB4OTAwNSwgMHgwMTE4LCAweDA4MGMsIDB4OGMwYSwgMHgwY2QwLCAweDAwMDUsIDB4MjAwMSwKKwkweDAwMzYsIDB4MjAwOSwgMHgxODIwLCAweDIxMGMsIDB4MjAxMSwgMHgxODFmLCAweDIyMTQsIDB4MDgwYywKKwkweDE2YTAsIDB4MDAwNSwgMHg3ODA4LCAweGQwOWMsIDB4MGRlOCwgMHg3ODIwLCAweDAwMDUsIDB4MDgwYywKKwkweDE1NzksIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsIDB4MjAwOSwgMHgwMWY0LCAweDgxMDksIDB4MDUxMCwKKwkweDY4MDQsIDB4OTAwNSwgMHgwZGQ4LCAweDIwMDEsIDB4MDE1ZCwgMHgyMDAzLCAweDAwMDAsIDB4NzliYywKKwkweGQxYTQsIDB4MTUyOCwgMHg3OWI4LCAweDkxOGMsIDB4MGZmZiwgMHgwMTgwLCAweDkxODIsIDB4MDg0MSwKKwkweDEyNjgsIDB4OTE4OCwgMHgwMDA3LCAweDkxOGMsIDB4MGZmOCwgMHg4MTBjLCAweDgxMGMsIDB4ODEwYywKKwkweDA4MGMsIDB4MTY5MiwgMHg2ODI3LCAweDAwMDEsIDB4ODEwOSwgMHgxZGQwLCAweDA0ZDksIDB4NjgyNywKKwkweDAwMDIsIDB4MDRjMSwgMHg2ODA0LCAweDkwMDUsIDB4MTEzMCwgMHg2ODJjLCAweGQwZTQsIDB4MTUwMCwKKwkweDY4MDQsIDB4OTAwNSwgMHgwZGU4LCAweDc5YjgsIDB4ZDFlYywgMHgxMTMwLCAweDA4YzAsIDB4MDgwYywKKwkweDdmZWQsIDB4MDgwYywgMHgxYjEwLCAweDAwOTAsIDB4NzgyNywgMHgwMDE1LCAweDc4MmIsIDB4MDAwMCwKKwkweDc4MjcsIDB4MDAxOCwgMHg3ODJiLCAweDAwMDAsIDB4MjAwMSwgMHgwMjBkLCAweDIwMDMsIDB4MDAyMCwKKwkweDIwMDEsIDB4MDMwNywgMHgyMDAzLCAweDAzMDAsIDB4NzgwMywgMHgwMDAxLCAweDAwZGUsIDB4MDAwNSwKKwkweDY4MmMsIDB4OTA4NCwgMHg1NDAwLCAweDkwODYsIDB4NTQwMCwgMHgwZDMwLCAweDc4MjcsIDB4MDAxNSwKKwkweDc4MmIsIDB4MDAwMCwgMHg3ODAzLCAweDAwMDEsIDB4NjgwMCwgMHg5MDg1LCAweDE4MDAsIDB4NjgwMiwKKwkweDAwZGUsIDB4MDAwNSwgMHg2ODI0LCAweDkwODQsIDB4MDAwMywgMHgxZGUwLCAweDAwMDUsIDB4MjAwMSwKKwkweDAwMzAsIDB4MmMwOCwgMHg2MjFjLCAweDAwMjEsIDB4NzgzMCwgMHg5MDg2LCAweDAwNDEsIDB4MDAwNSwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMzAwLCAweDAwMDYsIDB4NzgwOCwgMHhkMDljLCAweDAxNDAsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDBjNiwgMHgwODBjLCAweDEzYmIsIDB4MDBjZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwKKwkweDAwMDYsIDB4NzgzMiwgMHg3OTM2LCAweDdhM2EsIDB4NzgxYiwgMHg4MDgwLCAweDAwNTksIDB4MTExOCwKKwkweDAwMGUsIDB4MDBmZSwgMHgwMDA1LCAweDAwMGUsIDB4NzkyYywgMHgzOTAwLCAweDgwMDAsIDB4MjAwNCwKKwkweDA4MGMsIDB4MGQ3ZCwgMHgyMDA5LCAweGZmMDAsIDB4ODEwOSwgMHgwMTIwLCAweDc4MTgsIDB4ZDBiYywKKwkweDFkZDgsIDB4MDAwNSwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHg3ODMyLCAweDc5MzYsIDB4N2EzYSwKKwkweDc4MWIsIDB4ODA4MCwgMHgwYzc5LCAweDExMDgsIDB4MDAwNSwgMHg3OTJjLCAweDM5MDAsIDB4ODAwMCwKKwkweDIwMDQsIDB4MDgwYywgMHgwZDdkLCAweDcwMzcsIDB4MDAwMSwgMHg3MTUwLCAweDcwMzcsIDB4MDAwMiwKKwkweDcwNTAsIDB4MjA2MCwgMHhkMWJjLCAweDExMTAsIDB4NzA1NCwgMHgyMDYwLCAweDkxOGMsIDB4ZmYwMCwKKwkweDkxODYsIDB4MDUwMCwgMHgwMTEwLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwMDYsIDB4MDA0NiwKKwkweDAwZTYsIDB4MjA3MSwgMHgwMjAwLCAweDcwMzcsIDB4MDAwMiwgMHg3MDU4LCAweDkwODQsIDB4ZmYwMCwKKwkweDgwMDcsIDB4OTA4NiwgMHgwMGJjLCAweDExNTgsIDB4MjAyMSwgMHgxYTc5LCAweDI0MDQsIDB4ODAwMCwKKwkweDAyMDgsIDB4MjAyMiwgMHgwODBjLCAweDdmZWQsIDB4MDgwYywgMHgxYjEwLCAweDkwMDYsIDB4MDBlZSwKKwkweDAwNGUsIDB4MDAwZSwgMHgwMDA1LCAweDBjMTEsIDB4MTEwOCwgMHgwMDA1LCAweDAwZTYsIDB4MDAxNiwKKwkweDIwNzEsIDB4MDIwMCwgMHgwODQxLCAweDYxMjQsIDB4ZDFkYywgMHgwMWY4LCAweDcwMWMsIDB4ZDA4YywKKwkweDA5MDQsIDB4MTc2ZCwgMHg3MDE3LCAweDAwMDAsIDB4MjAwMSwgMHgwMjY0LCAweDIwMDQsIDB4ZDBiYywKKwkweDA5MDQsIDB4MTc2ZCwgMHgyMDAxLCAweDAyNjgsIDB4MDBjNiwgMHgyMDY0LCAweDYxMDQsIDB4NjAzOCwKKwkweDAwY2UsIDB4OTE4ZSwgMHgwMDM5LCAweDE5MDQsIDB4MTc2ZCwgMHg5YzA2LCAweDE1ZjAsIDB4MDEyNiwKKwkweDIwOTEsIDB4MjYwMCwgMHgwODBjLCAweDdmNDUsIDB4MDEyZSwgMHg3MzU4LCAweDc0NWMsIDB4NjAxNCwKKwkweDkwNWQsIDB4MDU5OCwgMHgyYjQ4LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwKKwkweGQwYmMsIDB4MTkwYywgMHhjZDU4LCAweGFiNDIsIDB4YWMzZSwgMHgyMDAxLCAweDE4NjksIDB4MjAwNCwKKwkweGQwYjQsIDB4MTE3MCwgMHg2MDFjLCAweGQwZTQsIDB4MTE1OCwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwKKwkweGI4MDAsIDB4MDBiZSwgMHhkMGJjLCAweDExMjAsIDB4YTgzYiwgMHg3ZmZmLCAweGE4MzcsIDB4ZmZmZiwKKwkweDA4MGMsIDB4MWVjYiwgMHgxMTkwLCAweDA4MGMsIDB4MTk1ZSwgMHgyYTAwLCAweGE4MTYsIDB4MDEzMCwKKwkweDI4MDAsIDB4YTgwZSwgMHgyYzA1LCAweGE4MGEsIDB4MmMwMCwgMHhhODEyLCAweDcwMzcsIDB4MDAyMCwKKwkweDc4MWYsIDB4MDMwMCwgMHgwMDFlLCAweDAwZWUsIDB4MDAwNSwgMHg3MDM3LCAweDAwNTAsIDB4NzAzNywKKwkweDAwMjAsIDB4MDAxZSwgMHgwMGVlLCAweDA4MGMsIDB4MTYyZiwgMHgwMDA1LCAweDA4MGMsIDB4MGQ3ZCwKKwkweDJjZjAsIDB4MDEyNiwgMHgyMDkxLCAweDIyMDAsIDB4MDAxNiwgMHgwMGM2LCAweDNlNjAsIDB4NjAxNCwKKwkweDIwNDgsIDB4Mjk0MCwgMHg5MDNlLCAweDI3MzAsIDB4YTg2NCwgMHgyMDY4LCAweGE4MWEsIDB4OWQ4NCwKKwkweDAwMGYsIDB4OTA4OCwgMHgxZWFiLCAweDIxNjUsIDB4MDAwMiwgMHgxN2E0LCAweDE4MTIsIDB4MTdhNCwKKwkweDE3YTQsIDB4MTdhOCwgMHgxN2YzLCAweDE3YTQsIDB4MTdjOCwgMHgxNzlkLCAweDE4MDksIDB4MTdhNCwKKwkweDE3YTQsIDB4MTdhZCwgMHgxOGZmLCAweDE3ZGMsIDB4MTdkMiwgMHhhOTY0LCAweDkxOGMsIDB4MDBmZiwKKwkweDkxOGUsIDB4MDA0OCwgMHgwOTA0LCAweDE4MDksIDB4OTA4NSwgMHgwMDAxLCAweDA4MDQsIDB4MThmNSwKKwkweGE4N2MsIDB4ZDBhYywgMHgwZGM4LCAweDA4MDQsIDB4MTgxOSwgMHhhODdjLCAweGQwYWMsIDB4MGRhMCwKKwkweDA4MDQsIDB4MTg4NCwgMHhhODk4LCAweDkwMWQsIDB4MTEwOCwgMHhhYjljLCAweDkwMTYsIDB4YWFiMiwKKwkweGFhM2UsIDB4YWE0MiwgMHgzZTAwLCAweDkwODAsIDB4MDAwOCwgMHgyMDA0LCAweDkwODAsIDB4OTFkMywKKwkweDIwMDUsIDB4OTAwNSwgMHgwOTBjLCAweDBkN2QsIDB4MjAwNCwgMHhhOGFlLCAweDA4MDQsIDB4MThkZCwKKwkweGE4N2MsIDB4ZDBiYywgMHgwOWM4LCAweGE4OTAsIDB4YTg0MiwgMHhhODhjLCAweGE4M2UsIDB4YTg4OCwKKwkweDA4MDQsIDB4MTgxOSwgMHhhODdjLCAweGQwYmMsIDB4MDk3OCwgMHhhODkwLCAweGE4NDIsIDB4YTg4YywKKwkweGE4M2UsIDB4YTg4OCwgMHgwODA0LCAweDE4ODQsIDB4YTg3YywgMHhkMGJjLCAweDA5MjgsIDB4YTg5MCwKKwkweGE4NDIsIDB4YTg4YywgMHhhODNlLCAweGE4MDQsIDB4OTA0NSwgMHgwOTBjLCAweDBkN2QsIDB4YTE2NCwKKwkweGE5MWEsIDB4OTFlYywgMHgwMDBmLCAweDlkODAsIDB4MWVhYiwgMHgyMDY1LCAweGE4ODgsIDB4ZDE5YywKKwkweDE5MDQsIDB4MTg4NCwgMHgwNDMwLCAweGE4N2MsIDB4ZDBhYywgMHgwOTA0LCAweDE3YTQsIDB4YTgwNCwKKwkweDkwNDUsIDB4MDkwYywgMHgwZDdkLCAweGExNjQsIDB4YTkxYSwgMHg5MWVjLCAweDAwMGYsIDB4OWQ4MCwKKwkweDFlYWIsIDB4MjA2NSwgMHg5MDA2LCAweGE4NDIsIDB4YTgzZSwgMHhkMTljLCAweDE5MDQsIDB4MTg4NCwKKwkweDAwODAsIDB4YTg3YywgMHhkMGFjLCAweDA5MDQsIDB4MTdhNCwgMHg5MDA2LCAweGE4NDIsIDB4YTgzZSwKKwkweDA4MDQsIDB4MTg4NCwgMHhhODdjLCAweGQwYWMsIDB4MDkwNCwgMHgxN2E0LCAweDkwMDYsIDB4YTg0MiwKKwkweGE4M2UsIDB4MmMwNSwgMHg5MDhhLCAweDAwMzYsIDB4MWEwYywgMHgwZDdkLCAweDkwODIsIDB4MDAxYiwKKwkweDAwMDIsIDB4MTgzYywgMHgxODNjLCAweDE4M2UsIDB4MTgzYywgMHgxODNjLCAweDE4M2MsIDB4MTg0OCwKKwkweDE4M2MsIDB4MTgzYywgMHgxODNjLCAweDE4NTIsIDB4MTgzYywgMHgxODNjLCAweDE4M2MsIDB4MTg1YywKKwkweDE4M2MsIDB4MTgzYywgMHgxODNjLCAweDE4NjYsIDB4MTgzYywgMHgxODNjLCAweDE4M2MsIDB4MTg3MCwKKwkweDE4M2MsIDB4MTgzYywgMHgxODNjLCAweDE4N2EsIDB4MDgwYywgMHgwZDdkLCAweGE1NzQsIDB4YTQ3OCwKKwkweDlkODYsIDB4MDAyNCwgMHgwOTA0LCAweDE3YjIsIDB4YTM3YywgMHhhMjgwLCAweDA4MDQsIDB4MThkZCwKKwkweGE1ODQsIDB4YTQ4OCwgMHg5ZDg2LCAweDAwMjQsIDB4MDkwNCwgMHgxN2IyLCAweGEzOGMsIDB4YTI5MCwKKwkweDA4MDQsIDB4MThkZCwgMHhhNTk0LCAweGE0OTgsIDB4OWQ4NiwgMHgwMDI0LCAweDA5MDQsIDB4MTdiMiwKKwkweGEzOWMsIDB4YTJhMCwgMHgwODA0LCAweDE4ZGQsIDB4YTVhNCwgMHhhNGE4LCAweDlkODYsIDB4MDAyNCwKKwkweDA5MDQsIDB4MTdiMiwgMHhhM2FjLCAweGEyYjAsIDB4MDgwNCwgMHgxOGRkLCAweGE1YjQsIDB4YTRiOCwKKwkweDlkODYsIDB4MDAyNCwgMHgwOTA0LCAweDE3YjIsIDB4YTNiYywgMHhhMmMwLCAweDA4MDQsIDB4MThkZCwKKwkweGE1YzQsIDB4YTRjOCwgMHg5ZDg2LCAweDAwMjQsIDB4MDkwNCwgMHgxN2IyLCAweGEzY2MsIDB4YTJkMCwKKwkweDA4MDQsIDB4MThkZCwgMHhhNWQ0LCAweGE0ZDgsIDB4OWQ4NiwgMHgwMDI0LCAweDA5MDQsIDB4MTdiMiwKKwkweGEzZGMsIDB4YTJlMCwgMHgwODA0LCAweDE4ZGQsIDB4MmMwNSwgMHg5MDhhLCAweDAwMzQsIDB4MWEwYywKKwkweDBkN2QsIDB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4MThhNywgMHgxOGE1LCAweDE4YTUsIDB4MThhNSwKKwkweDE4YTUsIDB4MThhNSwgMHgxOGIyLCAweDE4YTUsIDB4MThhNSwgMHgxOGE1LCAweDE4YTUsIDB4MThhNSwKKwkweDE4YmQsIDB4MThhNSwgMHgxOGE1LCAweDE4YTUsIDB4MThhNSwgMHgxOGE1LCAweDE4YzgsIDB4MThhNSwKKwkweDE4YTUsIDB4MThhNSwgMHgxOGE1LCAweDE4YTUsIDB4MThkMywgMHgwODBjLCAweDBkN2QsIDB4YTU2YywKKwkweGE0NzAsIDB4YTc3NCwgMHhhNjc4LCAweDlkODYsIDB4MDAyYywgMHgwOTA0LCAweDE3YjIsIDB4YTM3YywKKwkweGEyODAsIDB4MDQ1OCwgMHhhNTg0LCAweGE0ODgsIDB4YTc4YywgMHhhNjkwLCAweDlkODYsIDB4MDAyYywKKwkweDA5MDQsIDB4MTdiMiwgMHhhMzk0LCAweGEyOTgsIDB4MDQwMCwgMHhhNTljLCAweGE0YTAsIDB4YTdhNCwKKwkweGE2YTgsIDB4OWQ4NiwgMHgwMDJjLCAweDA5MDQsIDB4MTdiMiwgMHhhM2FjLCAweGEyYjAsIDB4MDBhOCwKKwkweGE1YjQsIDB4YTRiOCwgMHhhN2JjLCAweGE2YzAsIDB4OWQ4NiwgMHgwMDJjLCAweDA5MDQsIDB4MTdiMiwKKwkweGEzYzQsIDB4YTJjOCwgMHgwMDUwLCAweGE1Y2MsIDB4YTRkMCwgMHhhN2Q0LCAweGE2ZDgsIDB4OWQ4NiwKKwkweDAwMmMsIDB4MDkwNCwgMHgxN2IyLCAweGEzZGMsIDB4YTJlMCwgMHhhYjJlLCAweGFhMzIsIDB4YWQxZSwKKwkweGFjMjIsIDB4YWYyNiwgMHhhZTJhLCAweGE5ODgsIDB4OGM2MCwgMHgyYzFkLCAweGE4YWMsIDB4YWFiMCwKKwkweGE4MzYsIDB4YWEzYSwgMHg4MTA5LCAweGE5MTYsIDB4MTE2MCwgMHgzZTYwLCAweDYwMWMsIDB4YzA4NSwKKwkweDYwMWUsIDB4YTg3YywgMHhjMGRkLCAweGE4N2UsIDB4OTAwNiwgMHgwMGNlLCAweDAwMWUsIDB4MDEyZSwKKwkweDAwMDUsIDB4MjgwMCwgMHhhODBlLCAweGFiMGEsIDB4MmMwMCwgMHhhODEyLCAweDBjNzAsIDB4MDgwNCwKKwkweDE3YTQsIDB4MmZmMCwgMHgwMTI2LCAweDIwOTEsIDB4MjIwMCwgMHgwMDE2LCAweDAwYzYsIDB4M2U2MCwKKwkweDYwMTQsIDB4MjA0OCwgMHgyOTQwLCAweGE4MGUsIDB4MjA2MSwgMHgxZWE2LCAweGE4MTMsIDB4MWVhNiwKKwkweDJjMDUsIDB4YTgwYSwgMHhhOTY0LCAweGE5MWEsIDB4YTg3YywgMHhkMGFjLCAweDA5MGMsIDB4MGQ3ZCwKKwkweDkwMDYsIDB4YTg0MiwgMHhhODNlLCAweDJjMDUsIDB4OTA4YSwgMHgwMDM0LCAweDFhMGMsIDB4MGQ3ZCwKKwkweGFkY2MsIDB4YWNkMCwgMHhhZmQ0LCAweGFlZDgsIDB4YWJkYywgMHhhYWUwLCAweGFiMmUsIDB4YWEzMiwKKwkweGFkMWUsIDB4YWMyMiwgMHhhZjI2LCAweGFlMmEsIDB4YThhYywgMHhhYWIwLCAweGE4MzYsIDB4YWEzYSwKKwkweGE5ODgsIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDA4LCAweDExMjAsIDB4ODEwOSwKKwkweGE5MTYsIDB4MDEyOCwgMHgwMDgwLCAweDkxOGEsIDB4MDAwMiwgMHhhOTE2LCAweDExNjAsIDB4M2U2MCwKKwkweDYwMWMsIDB4YzA4NSwgMHg2MDFlLCAweGE4N2MsIDB4YzBkZCwgMHhhODdlLCAweDkwMDYsIDB4MDBjZSwKKwkweDAwMWUsIDB4MDEyZSwgMHgwMDA1LCAweGE4MDQsIDB4OTA0NSwgMHgwOTBjLCAweDBkN2QsIDB4YTgwZSwKKwkweGEwNjQsIDB4YTgxYSwgMHg5MDg0LCAweDAwMGYsIDB4OTA4MCwgMHgxZWFiLCAweDIwMTUsIDB4ODJmZiwKKwkweDA5MGMsIDB4MGQ3ZCwgMHhhYTEyLCAweDIyMDUsIDB4YTgwYSwgMHgwYzA4LCAweDkwM2UsIDB4MjczMCwKKwkweGE4ODAsIDB4ZDBmYywgMHgxMTkwLCAweDJkMDAsIDB4MDAwMiwgMHgxYTg4LCAweDE5YjUsIDB4MTliNSwKKwkweDFhODgsIDB4MTliNSwgMHgxYTgyLCAweDFhODgsIDB4MTliNSwgMHgxYTI1LCAweDFhMjUsIDB4MWEyNSwKKwkweDFhODgsIDB4MWEyNSwgMHgxYTg4LCAweDFhN2YsIDB4MWEyNSwgMHhjMGZjLCAweGE4ODIsIDB4YWIyYywKKwkweGFhMzAsIDB4YWQxYywgMHhhYzIwLCAweGRkOWMsIDB4MDkwNCwgMHgxYThhLCAweDJjMDUsIDB4OTA4YSwKKwkweDAwMzQsIDB4MWEwYywgMHgwZDdkLCAweDkwODIsIDB4MDAxYiwgMHgwMDAyLCAweDE5YTEsIDB4MTk5ZiwKKwkweDE5OWYsIDB4MTk5ZiwgMHgxOTlmLCAweDE5OWYsIDB4MTlhNSwgMHgxOTlmLCAweDE5OWYsIDB4MTk5ZiwKKwkweDE5OWYsIDB4MTk5ZiwgMHgxOWE5LCAweDE5OWYsIDB4MTk5ZiwgMHgxOTlmLCAweDE5OWYsIDB4MTk5ZiwKKwkweDE5YWQsIDB4MTk5ZiwgMHgxOTlmLCAweDE5OWYsIDB4MTk5ZiwgMHgxOTlmLCAweDE5YjEsIDB4MDgwYywKKwkweDBkN2QsIDB4YTc3NCwgMHhhNjc4LCAweDA4MDQsIDB4MWE4YSwgMHhhNzhjLCAweGE2OTAsIDB4MDgwNCwKKwkweDFhOGEsIDB4YTdhNCwgMHhhNmE4LCAweDA4MDQsIDB4MWE4YSwgMHhhN2JjLCAweGE2YzAsIDB4MDgwNCwKKwkweDFhOGEsIDB4YTdkNCwgMHhhNmQ4LCAweDA4MDQsIDB4MWE4YSwgMHhhODk4LCAweDkwMWQsIDB4MTEwOCwKKwkweGFiOWMsIDB4OTAxNiwgMHgyYzA1LCAweDkwOGEsIDB4MDAzNiwgMHgxYTBjLCAweDBkN2QsIDB4OTA4MiwKKwkweDAwMWIsIDB4MDAwMiwgMHgxOWRkLCAweDE5ZGQsIDB4MTlkZiwgMHgxOWRkLCAweDE5ZGQsIDB4MTlkZCwKKwkweDE5ZTksIDB4MTlkZCwgMHgxOWRkLCAweDE5ZGQsIDB4MTlmMywgMHgxOWRkLCAweDE5ZGQsIDB4MTlkZCwKKwkweDE5ZmQsIDB4MTlkZCwgMHgxOWRkLCAweDE5ZGQsIDB4MWEwNywgMHgxOWRkLCAweDE5ZGQsIDB4MTlkZCwKKwkweDFhMTEsIDB4MTlkZCwgMHgxOWRkLCAweDE5ZGQsIDB4MWExYiwgMHgwODBjLCAweDBkN2QsIDB4YTU3NCwKKwkweGE0NzgsIDB4OWQ4NiwgMHgwMDA0LCAweDA5MDQsIDB4MWE4YSwgMHhhMzdjLCAweGEyODAsIDB4MDgwNCwKKwkweDFhOGEsIDB4YTU4NCwgMHhhNDg4LCAweDlkODYsIDB4MDAwNCwgMHgwOTA0LCAweDFhOGEsIDB4YTM4YywKKwkweGEyOTAsIDB4MDgwNCwgMHgxYThhLCAweGE1OTQsIDB4YTQ5OCwgMHg5ZDg2LCAweDAwMDQsIDB4MDkwNCwKKwkweDFhOGEsIDB4YTM5YywgMHhhMmEwLCAweDA4MDQsIDB4MWE4YSwgMHhhNWE0LCAweGE0YTgsIDB4OWQ4NiwKKwkweDAwMDQsIDB4MDkwNCwgMHgxYThhLCAweGEzYWMsIDB4YTJiMCwgMHgwODA0LCAweDFhOGEsIDB4YTViNCwKKwkweGE0YjgsIDB4OWQ4NiwgMHgwMDA0LCAweDA5MDQsIDB4MWE4YSwgMHhhM2JjLCAweGEyYzAsIDB4MDgwNCwKKwkweDFhOGEsIDB4YTVjNCwgMHhhNGM4LCAweDlkODYsIDB4MDAwNCwgMHgwOTA0LCAweDFhOGEsIDB4YTNjYywKKwkweGEyZDAsIDB4MDgwNCwgMHgxYThhLCAweGE1ZDQsIDB4YTRkOCwgMHg5ZDg2LCAweDAwMDQsIDB4MDkwNCwKKwkweDFhOGEsIDB4YTNkYywgMHhhMmUwLCAweDA4MDQsIDB4MWE4YSwgMHhhODk4LCAweDkwMWQsIDB4MTEwOCwKKwkweGFiOWMsIDB4OTAxNiwgMHgyYzA1LCAweDkwOGEsIDB4MDAzNCwgMHgxYTBjLCAweDBkN2QsIDB4OTA4MiwKKwkweDAwMWIsIDB4MDAwMiwgMHgxYTRkLCAweDFhNGIsIDB4MWE0YiwgMHgxYTRiLCAweDFhNGIsIDB4MWE0YiwKKwkweDFhNTcsIDB4MWE0YiwgMHgxYTRiLCAweDFhNGIsIDB4MWE0YiwgMHgxYTRiLCAweDFhNjEsIDB4MWE0YiwKKwkweDFhNGIsIDB4MWE0YiwgMHgxYTRiLCAweDFhNGIsIDB4MWE2YiwgMHgxYTRiLCAweDFhNGIsIDB4MWE0YiwKKwkweDFhNGIsIDB4MWE0YiwgMHgxYTc1LCAweDA4MGMsIDB4MGQ3ZCwgMHhhNTZjLCAweGE0NzAsIDB4YTc3NCwKKwkweGE2NzgsIDB4OWQ4NiwgMHgwMDBjLCAweDA1YjAsIDB4YTM3YywgMHhhMjgwLCAweDA0OTgsIDB4YTU4NCwKKwkweGE0ODgsIDB4YTc4YywgMHhhNjkwLCAweDlkODYsIDB4MDAwYywgMHgwNTYwLCAweGEzOTQsIDB4YTI5OCwKKwkweDA0NDgsIDB4YTU5YywgMHhhNGEwLCAweGE3YTQsIDB4YTZhOCwgMHg5ZDg2LCAweDAwMGMsIDB4MDUxMCwKKwkweGEzYWMsIDB4YTJiMCwgMHgwMGY4LCAweGE1YjQsIDB4YTRiOCwgMHhhN2JjLCAweGE2YzAsIDB4OWQ4NiwKKwkweDAwMGMsIDB4MDFjMCwgMHhhM2M0LCAweGEyYzgsIDB4MDBhOCwgMHhhNWNjLCAweGE0ZDAsIDB4YTdkNCwKKwkweGE2ZDgsIDB4OWQ4NiwgMHgwMDBjLCAweDAxNzAsIDB4YTNkYywgMHhhMmUwLCAweDAwNTgsIDB4OWQ4NiwKKwkweDAwMGUsIDB4MTEzMCwgMHgwODBjLCAweDFlODEsIDB4MTkwNCwgMHgxOTVlLCAweDkwMGUsIDB4MDA1MCwKKwkweDA4MGMsIDB4MGQ3ZCwgMHhhYjJlLCAweGFhMzIsIDB4YWQxZSwgMHhhYzIyLCAweGFmMjYsIDB4YWUyYSwKKwkweDA4MGMsIDB4MWU4MSwgMHgwMDA1LCAweDYwMTQsIDB4MjA0OCwgMHg2MTE4LCAweDgxMGMsIDB4ODEwYywKKwkweDgxMGMsIDB4ODFmZiwgMHgxMTE4LCAweGE4ODcsIDB4MDAwMSwgMHgwMDA4LCAweGE5ODYsIDB4NjAxYiwKKwkweDAwMDIsIDB4YTg3NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NCwgMHgwMDA4LCAweDAxNTAsIDB4MDBlOSwKKwkweDYwMDAsIDB4OTA4NiwgMHgwMDA0LCAweDExMjAsIDB4MjAwOSwgMHgwMDQ4LCAweDA4MGMsIDB4YWQ0ZCwKKwkweDAwMDUsIDB4YTk3NCwgMHhkMWRjLCAweDExMDgsIDB4MDAwNSwgMHhhOTM0LCAweGE4OGMsIDB4OTEwNiwKKwkweDExNTgsIDB4YTkzOCwgMHhhODkwLCAweDkxMDYsIDB4MTEzOCwgMHg2MDFjLCAweGMwODQsIDB4NjAxZSwKKwkweDIwMDksIDB4MDA0OCwgMHgwODA0LCAweGFkNGQsIDB4MDAwNSwgMHgwMTI2LCAweDAwYzYsIDB4MjA5MSwKKwkweDIyMDAsIDB4MDBjZSwgMHg3OTA4LCAweDkxOGMsIDB4MDAwNywgMHg5MTg2LCAweDAwMDAsIDB4MDViMCwKKwkweDkxODYsIDB4MDAwMywgMHgwNTk4LCAweDYwMjAsIDB4NjAyMywgMHgwMDAwLCAweDAwMDYsIDB4MjAzMSwKKwkweDAwMDgsIDB4MDBjNiwgMHg3ODFmLCAweDA4MDgsIDB4NzgwOCwgMHhkMDljLCAweDAxMjAsIDB4MDgwYywKKwkweDEzYmIsIDB4ODYzMSwgMHgxZGI4LCAweDAwY2UsIDB4NzgxZiwgMHgwODAwLCAweDIwMzEsIDB4MDE2OCwKKwkweDAwYzYsIDB4NzgwOCwgMHhkMDljLCAweDE5MGMsIDB4MTNiYiwgMHgwMGNlLCAweDIwMDEsIDB4MDAzOCwKKwkweDA4MGMsIDB4MWI5OCwgMHg3OTMwLCAweDkxODYsIDB4MDA0MCwgMHgwMTYwLCAweDkxODYsIDB4MDA0MiwKKwkweDE5MGMsIDB4MGQ3ZCwgMHgyMDAxLCAweDAwMWUsIDB4ODAwMSwgMHgxZGYwLCAweDg2MzEsIDB4MWQ0MCwKKwkweDA4MGMsIDB4MWJhNywgMHgwMDBlLCAweDYwMjIsIDB4MDEyZSwgMHgwMDA1LCAweDA4MGMsIDB4MWI5NCwKKwkweDc4MjcsIDB4MDAxNSwgMHg3ODI4LCAweDljMDYsIDB4MWRiOCwgMHg3ODJiLCAweDAwMDAsIDB4MGNhMCwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMzAwLCAweDc4MDMsIDB4MDAwMCwgMHg3OGFiLCAweDAwMDQsIDB4MDBmZSwKKwkweDA4MGMsIDB4NzUzZCwgMHgxMTg4LCAweDIwMDEsIDB4MDEzOCwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwKKwkweDAxNjAsIDB4MjAwMywgMHgwMDAwLCAweDIwMTEsIDB4MDEyYywgMHhhMDAxLCAweGEwMDEsIDB4ODIxMSwKKwkweDFkZTAsIDB4MDA1OSwgMHgwODA0LCAweDc1ZTIsIDB4MDQ3OSwgMHgwMDM5LCAweDIwMDEsIDB4MDE2MCwKKwkweDI1MDIsIDB4MjAwMSwgMHgwMTM4LCAweDIyMDIsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MDIwMCwKKwkweDA4MGMsIDB4MmE2YywgMHgyMDA5LCAweDAwM2MsIDB4MDgwYywgMHgyMjBhLCAweDIwMDEsIDB4MDE1ZCwKKwkweDIwMDMsIDB4MDAwMCwgMHg3MDAwLCAweDkwODQsIDB4MDAzYywgMHgxZGUwLCAweDA4MGMsIDB4ODVjZSwKKwkweDcwYTAsIDB4NzBhMiwgMHg3MDk4LCAweDcwOWEsIDB4NzA5YywgMHg3MDllLCAweDIwMDEsIDB4MDIwZCwKKwkweDIwMDMsIDB4MDAyMCwgMHgwMGY2LCAweDIwNzksIDB4MDMwMCwgMHgwODBjLCAweDEzNTQsIDB4NzgwMywKKwkweDAwMDEsIDB4MDBmZSwgMHgwMGVlLCAweDAwMDUsIDB4MjAwMSwgMHgwMTM4LCAweDIwMTQsIDB4MjAwMywKKwkweDAwMDAsIDB4MjAwMSwgMHgwMTYwLCAweDIwMmMsIDB4MjAwMywgMHgwMDAwLCAweDA4MGMsIDB4NzUzZCwKKwkweDExMDgsIDB4MDAwNSwgMHgyMDIxLCAweDAyNjAsIDB4MjAwMSwgMHgwMTQxLCAweDIwMWMsIDB4ZDNkYywKKwkweDExNjgsIDB4MjAwMSwgMHgwMTA5LCAweDIwMWMsIDB4OTM5YywgMHgwMDQ4LCAweDExNjAsIDB4MjAwMSwKKwkweDAxMTEsIDB4MjAxYywgMHg4M2ZmLCAweDExMTAsIDB4ODQyMSwgMHgxZDcwLCAweDIwMDEsIDB4MDE1ZCwKKwkweDIwMDMsIDB4MDAwMCwgMHgwMDA1LCAweDAwNDYsIDB4MjAyMSwgMHgwMDE5LCAweDIwMDMsIDB4MDA0OCwKKwkweGEwMDEsIDB4YTAwMSwgMHgyMDFjLCAweDkzOWMsIDB4MDA0OCwgMHgwMTIwLCAweDg0MjEsIDB4MWRiMCwKKwkweDAwNGUsIDB4MGM2MCwgMHgwMDRlLCAweDBjNDAsIDB4NjAxYywgMHhjMDg0LCAweDYwMWUsIDB4MDAwNSwKKwkweDJjMDgsIDB4NjIxYywgMHgwODBjLCAweDE2YTAsIDB4NzkzMCwgMHgwMDA1LCAweDJjMDgsIDB4NjIxYywKKwkweDA4MGMsIDB4MTZjZCwgMHg3OTMwLCAweDAwMDUsIDB4ODAwMSwgMHgxZGYwLCAweDAwMDUsIDB4MjAzMSwKKwkweDAwNjQsIDB4NzgxYywgMHg5MDg0LCAweDAwMDcsIDB4MDE3MCwgMHgyMDAxLCAweDAwMzgsIDB4MGM0MSwKKwkweDkxODYsIDB4MDA0MCwgMHgwOTA0LCAweDFjMDUsIDB4MjAwMSwgMHgwMDFlLCAweDBjNjksIDB4ODYzMSwKKwkweDFkODAsIDB4MDgwYywgMHgwZDdkLCAweDc4MWYsIDB4MDIwMiwgMHgyMDAxLCAweDAxNWQsIDB4MjAwMywKKwkweDAwMDAsIDB4MjAwMSwgMHgwZGFjLCAweDBjMDEsIDB4NzgxYywgMHhkMDg0LCAweDAxMTAsIDB4MDg2MSwKKwkweDA0ZTAsIDB4MjAwMSwgMHgwMDMwLCAweDA4OTEsIDB4OTE4NiwgMHgwMDQwLCAweDA1NjgsIDB4NzgxYywKKwkweGQwODQsIDB4MWRhOCwgMHg3ODFmLCAweDAxMDEsIDB4MjAwMSwgMHgwMDE0LCAweDA4NjksIDB4MjAwMSwKKwkweDAwMzcsIDB4MDgyMSwgMHg5MTg2LCAweDAwNDAsIDB4MDE0MCwgMHgyMDAxLCAweDAwMzAsIDB4MDgwYywKKwkweDFiOWUsIDB4OTE4NiwgMHgwMDQwLCAweDE5MGMsIDB4MGQ3ZCwgMHgwMGQ2LCAweDIwNjksIDB4MDIwMCwKKwkweDY5MmMsIDB4ZDFmNCwgMHgxMTcwLCAweGQxYzQsIDB4MDE2MCwgMHhkMTljLCAweDAxMzAsIDB4NjgwMCwKKwkweDkwODUsIDB4MTgwMCwgMHg2ODAyLCAweDAwZGUsIDB4MDA4MCwgMHg2OTA4LCAweDkxODQsIDB4MDAwNywKKwkweDFkYjAsIDB4MDBkZSwgMHg3ODFmLCAweDAxMDAsIDB4NzkxYywgMHg5MTg0LCAweDAwMDcsIDB4MDkwYywKKwkweDBkN2QsIDB4YTAwMSwgMHhhMDAxLCAweDc4MWYsIDB4MDIwMCwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwKKwkweDI0MDAsIDB4MjA3OSwgMHgwMzgwLCAweDIwMDEsIDB4MTllNiwgMHgyMDcwLCAweDAxMmUsIDB4MDAwNSwKKwkweDJjZjAsIDB4MDEyNiwgMHgyMDkxLCAweDI0MDAsIDB4M2U2MCwgMHg2MDE0LCAweDIwNDgsIDB4YTk2NCwKKwkweGE5MWEsIDB4OTE4YywgMHgwMGZmLCAweDkxODQsIDB4MDAwZiwgMHgwMDAyLCAweDFjM2EsIDB4MWMzYSwKKwkweDFjM2EsIDB4MWMzYywgMHgxYzNhLCAweDFjM2EsIDB4MWMzYSwgMHgxYzNhLCAweDFjMmUsIDB4MWM0NCwKKwkweDFjM2EsIDB4MWM0MCwgMHgxYzNhLCAweDFjM2EsIDB4MWMzYSwgMHgxYzNhLCAweDkwODYsIDB4MDAwOCwKKwkweDExNDgsIDB4YTg3YywgMHhkMGI0LCAweDA5MDQsIDB4MWRiNCwgMHgyMDExLCAweDFlYTYsIDB4MjIwNSwKKwkweGFiODgsIDB4MDBhOCwgMHgwODBjLCAweDBkN2QsIDB4OTE4NiwgMHgwMDEzLCAweDAxMjgsIDB4MGNkMCwKKwkweDkxODYsIDB4MDAxYiwgMHgwMTA4LCAweDBjYjAsIDB4YTg3YywgMHhkMGI0LCAweDA5MDQsIDB4MWRiNCwKKwkweDkxODQsIDB4MDAwZiwgMHg5MDgwLCAweDFlYWIsIDB4MjAxNSwgMHgyMjA1LCAweGFiODgsIDB4MjkwOCwKKwkweGE4MGEsIDB4YTkwZSwgMHhhYTEyLCAweGFiMTYsIDB4OTAwNiwgMHhhODQyLCAweGE4M2UsIDB4MDEyZSwKKwkweDAwMDUsIDB4MmNmMCwgMHgwMTI2LCAweDIwOTEsIDB4MjQwMCwgMHgzZTYwLCAweDYwMTQsIDB4MjA0OCwKKwkweGE4OGMsIDB4YTk5MCwgMHhhYWFjLCAweGFiYjAsIDB4YWEzNiwgMHhhYjNhLCAweGE4M2UsIDB4YTk0MiwKKwkweGE4NDYsIDB4YTk0YSwgMHhhOTY0LCAweDkxOGMsIDB4MDBmZiwgMHg5MTg2LCAweDAwMWUsIDB4MDE5OCwKKwkweDI5NDAsIDB4YTA2NCwgMHhhODFhLCAweDkwZWMsIDB4MDAwZiwgMHg5ZDgwLCAweDFlYWIsIDB4MjA2NSwKKwkweDJjMDUsIDB4MjgwOCwgMHgyYzEwLCAweGFiODgsIDB4YTgwYSwgMHhhOTBlLCAweGFhMTIsIDB4YWIxNiwKKwkweDAxMmUsIDB4M2U2MCwgMHgwMDA1LCAweGE4MDQsIDB4MjA0MCwgMHgwYzU4LCAweDJjZjAsIDB4MDEyNiwKKwkweDIwOTEsIDB4MjQwMCwgMHgzZTYwLCAweDYwMTQsIDB4MjA0OCwgMHhhOTdjLCAweDI5NTAsIDB4ZDFkYywKKwkweDE5MDQsIDB4MWQ3ZSwgMHhjMWRkLCAweGE5N2UsIDB4OTAwNiwgMHhhODQyLCAweGE4M2UsIDB4YTk4OCwKKwkweDgxMDksIDB4YTkxNiwgMHhhOTY0LCAweGE5MWEsIDB4OTE4NCwgMHgwMDBmLCAweDkwODgsIDB4MWVhYiwKKwkweDIxNDUsIDB4MDAwMiwgMHgxY2IyLCAweDFjYzAsIDB4MWNiMiwgMHgxY2IyLCAweDFjYjIsIDB4MWNiNCwKKwkweDFjYjIsIDB4MWNiMiwgMHgxZDE1LCAweDFkMTUsIDB4MWNiMiwgMHgxY2IyLCAweDFjYjIsIDB4MWQxMywKKwkweDFjYjIsIDB4MWNiMiwgMHgwODBjLCAweDBkN2QsIDB4YTgwNCwgMHgyMDUwLCAweGIxNjQsIDB4YTkxYSwKKwkweDkxODQsIDB4MDAwZiwgMHg5MDgwLCAweDFlYWIsIDB4MjA0NSwgMHhkMTljLCAweDE5MDQsIDB4MWQxNSwKKwkweDkwMzYsIDB4MjYzOCwgMHgyODA1LCAweDkwOGEsIDB4MDAzNiwgMHgxYTBjLCAweDBkN2QsIDB4OTA4MiwKKwkweDAwMWIsIDB4MDAwMiwgMHgxY2U1LCAweDFjZTUsIDB4MWNlNywgMHgxY2U1LCAweDFjZTUsIDB4MWNlNSwKKwkweDFjZWQsIDB4MWNlNSwgMHgxY2U1LCAweDFjZTUsIDB4MWNmMywgMHgxY2U1LCAweDFjZTUsIDB4MWNlNSwKKwkweDFjZjksIDB4MWNlNSwgMHgxY2U1LCAweDFjZTUsIDB4MWNmZiwgMHgxY2U1LCAweDFjZTUsIDB4MWNlNSwKKwkweDFkMDUsIDB4MWNlNSwgMHgxY2U1LCAweDFjZTUsIDB4MWQwYiwgMHgwODBjLCAweDBkN2QsIDB4YjU3NCwKKwkweGI0NzgsIDB4YjM3YywgMHhiMjgwLCAweDA4MDQsIDB4MWQ1YSwgMHhiNTg0LCAweGI0ODgsIDB4YjM4YywKKwkweGIyOTAsIDB4MDgwNCwgMHgxZDVhLCAweGI1OTQsIDB4YjQ5OCwgMHhiMzljLCAweGIyYTAsIDB4MDgwNCwKKwkweDFkNWEsIDB4YjVhNCwgMHhiNGE4LCAweGIzYWMsIDB4YjJiMCwgMHgwODA0LCAweDFkNWEsIDB4YjViNCwKKwkweGI0YjgsIDB4YjNiYywgMHhiMmMwLCAweDA4MDQsIDB4MWQ1YSwgMHhiNWM0LCAweGI0YzgsIDB4YjNjYywKKwkweGIyZDAsIDB4MDgwNCwgMHgxZDVhLCAweGI1ZDQsIDB4YjRkOCwgMHhiM2RjLCAweGIyZTAsIDB4MDgwNCwKKwkweDFkNWEsIDB4MDgwNCwgMHgxZDVhLCAweDA4MGMsIDB4MGQ3ZCwgMHgyODA1LCAweDkwOGEsIDB4MDAzNCwKKwkweDFhMGMsIDB4MGQ3ZCwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHgxZDM4LCAweDFkMzYsIDB4MWQzNiwKKwkweDFkMzYsIDB4MWQzNiwgMHgxZDM2LCAweDFkM2YsIDB4MWQzNiwgMHgxZDM2LCAweDFkMzYsIDB4MWQzNiwKKwkweDFkMzYsIDB4MWQ0NiwgMHgxZDM2LCAweDFkMzYsIDB4MWQzNiwgMHgxZDM2LCAweDFkMzYsIDB4MWQ0ZCwKKwkweDFkMzYsIDB4MWQzNiwgMHgxZDM2LCAweDFkMzYsIDB4MWQzNiwgMHgxZDU0LCAweDA4MGMsIDB4MGQ3ZCwKKwkweGI1NmMsIDB4YjQ3MCwgMHhiNzc0LCAweGI2NzgsIDB4YjM3YywgMHhiMjgwLCAweDAwZDgsIDB4YjU4NCwKKwkweGI0ODgsIDB4Yjc4YywgMHhiNjkwLCAweGIzOTQsIDB4YjI5OCwgMHgwMGEwLCAweGI1OWMsIDB4YjRhMCwKKwkweGI3YTQsIDB4YjZhOCwgMHhiM2FjLCAweGIyYjAsIDB4MDA2OCwgMHhiNWI0LCAweGI0YjgsIDB4YjdiYywKKwkweGI2YzAsIDB4YjNjNCwgMHhiMmM4LCAweDAwMzAsIDB4YjVjYywgMHhiNGQwLCAweGI3ZDQsIDB4YjZkOCwKKwkweGIzZGMsIDB4YjJlMCwgMHhhYjJlLCAweGFhMzIsIDB4YWQxZSwgMHhhYzIyLCAweGFmMjYsIDB4YWUyYSwKKwkweGE5ODgsIDB4ODEwOSwgMHhhOTE2LCAweDExMTgsIDB4OTAwNiwgMHgwMTJlLCAweDAwMDUsIDB4ODg0MCwKKwkweDI4MDUsIDB4OTAwNSwgMHgxMTY4LCAweGIwMDQsIDB4OTAwNSwgMHgwOTBjLCAweDBkN2QsIDB4MjA1MCwKKwkweGIxNjQsIDB4YTkxYSwgMHg5MTg0LCAweDAwMGYsIDB4OTA4MCwgMHgxZWFiLCAweDIwNDUsIDB4MjgwNSwKKwkweDI4MTAsIDB4MmEwOCwgMHhhODBhLCAweGE5MGUsIDB4YWExMiwgMHgwYzMwLCAweDNlNjAsIDB4NjM0NCwKKwkweGQzZmMsIDB4MTkwYywgMHgwZDdkLCAweGE5M2MsIDB4YWE0MCwgMHhhODQ0LCAweDkxMDYsIDB4MTExOCwKKwkweGE4NDgsIDB4OTIwNiwgMHgwNTA4LCAweDI5NTgsIDB4YWI0OCwgMHhhYzQ0LCAweDI5NDAsIDB4MDgwYywKKwkweDFlY2IsIDB4MTk5OCwgMHgyODUwLCAweDJjNDAsIDB4YWIxNCwgMHhhODgwLCAweGQwZmMsIDB4MTE0MCwKKwkweGE4MTAsIDB4MjAwNSwgMHhhODBhLCAweDJhMDAsIDB4YTgwZSwgMHgyMDA5LCAweDgwMTUsIDB4MDA3MCwKKwkweDAwYzYsIDB4M2U2MCwgMHg2MDQ0LCAweGMwYTQsIDB4OTA4NSwgMHg4MDA1LCAweDYwNDYsIDB4MDBjZSwKKwkweDgzMTksIDB4YWIxNiwgMHgxOTA0LCAweDFkNjcsIDB4MjAwOSwgMHg4MDA1LCAweDNlNjAsIDB4NjA0NCwKKwkweDkxMDUsIDB4NjA0NiwgMHgwODA0LCAweDFkNjQsIDB4MDgwYywgMHgwZDdkLCAweDAwZjYsIDB4MDBlNiwKKwkweDAwOTYsIDB4MDBjNiwgMHgwMDI2LCAweDcwNGMsIDB4OWMwNiwgMHgxOTBjLCAweDBkN2QsIDB4MjA3OSwKKwkweDAwOTAsIDB4MjAwMSwgMHgwMTA1LCAweDIwMDMsIDB4MDAxMCwgMHg3ODJiLCAweDAwMDQsIDB4NzA1NywKKwkweDAwMDAsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Yzk3YSwgMHgwMTE4LCAweGE4ODAsIDB4YzBiZCwKKwkweGE4ODIsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDYsIDB4MTE3MCwgMHgyMDYxLCAweDAxMDAsIDB4NjJjOCwKKwkweDIwMDEsIDB4MDBmYSwgMHg4MDAxLCAweDFkZjAsIDB4NjBjOCwgMHg5MjA2LCAweDFkYzAsIDB4NjBjNCwKKwkweGE4OWEsIDB4NjBjOCwgMHhhODk2LCAweDcwNGMsIDB4MjA2MCwgMHgwMGM2LCAweDA4MGMsIDB4YzU2NiwKKwkweDA4MGMsIDB4YTkxZSwgMHgwMGNlLCAweDcwNGMsIDB4OWMwNiwgMHgxMTUwLCAweDIwMDksIDB4MDA0MCwKKwkweDA4MGMsIDB4MjIwYSwgMHgwODBjLCAweGEzYzMsIDB4MjAxMSwgMHgwMDAwLCAweDA4MGMsIDB4YTI0ZCwKKwkweDAwMmUsIDB4MDBjZSwgMHgwMDllLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwKKwkweDAwOTAsIDB4NzgxYywgMHgwMDA2LCAweDc4MTgsIDB4MDAwNiwgMHgyMDc5LCAweDAxMDAsIDB4N2ExNCwKKwkweDkyODQsIDB4MTk4NCwgMHg5MDg1LCAweDAwMTIsIDB4NzgxNiwgMHgyMDE5LCAweDEwMDAsIDB4ODMxOSwKKwkweDA5MGMsIDB4MGQ3ZCwgMHg3ODIwLCAweGQwYmMsIDB4MWRkMCwgMHg3OWM4LCAweDAwMGUsIDB4OTEwMiwKKwkweDAwMWUsIDB4MDAwNiwgMHgwMDE2LCAweDc5YzQsIDB4MDAwZSwgMHg5MTAzLCAweDc4YzYsIDB4MDAwZSwKKwkweDc4Y2EsIDB4OTI4NCwgMHgxOTg0LCAweDkwODUsIDB4MDAxMiwgMHg3ODE2LCAweDIwNzksIDB4MDA5MCwKKwkweDc4MmIsIDB4MDAwOCwgMHg3MDU3LCAweDAwMDAsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTllNiwgMHg3MDU0LCAweDkwODYsIDB4MDAwMCwgMHgwOTA0LCAweDFlN2MsIDB4MjA3OSwKKwkweDAwOTAsIDB4MjAwOSwgMHgwMjA3LCAweDIxMGMsIDB4ZDE5NCwgMHgwMWI4LCAweDIwMDksIDB4MDIwYywKKwkweDIxMGMsIDB4OTE4NCwgMHgwMDAzLCAweDAxODgsIDB4MDgwYywgMHhlOGEzLCAweDIwMDEsIDB4MDEzMywKKwkweDIwMDQsIDB4OTAwNSwgMHgwOTBjLCAweDBkN2QsIDB4MDAxNiwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywKKwkweDIyMGEsIDB4MDAxZSwgMHgyMDAxLCAweDAyMGMsIDB4MjEwMiwgMHgyMDA5LCAweDAyMDYsIDB4MjEwNCwKKwkweDIwMDksIDB4MDIwMywgMHgyMTBjLCAweDkxMDYsIDB4MTEyMCwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywKKwkweDIyMGEsIDB4NzgyYywgMHhkMGZjLCAweDA5YTgsIDB4MDgwYywgMHhhOTNhLCAweDc4MmMsIDB4ZDBmYywKKwkweDFkZTgsIDB4MDgwYywgMHhhOTFlLCAweDcwNTQsIDB4OTA4NiwgMHgwMDAwLCAweDE5NTAsIDB4NzgyYiwKKwkweDAwMDQsIDB4NzgyYywgMHhkMGFjLCAweDFkZTgsIDB4MjAwOSwgMHgwMDQwLCAweDA4MGMsIDB4MjIwYSwKKwkweDc4MmIsIDB4MDAwMiwgMHg3MDU3LCAweDAwMDAsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDgwYywKKwkweDBkN2QsIDB4OGM2MCwgMHgyYzA1LCAweDkwMDUsIDB4MDExMCwgMHg4YTUxLCAweDAwMDUsIDB4YTAwNCwKKwkweDkwMDUsIDB4MDE2OCwgMHhhODVhLCAweDIwNDAsIDB4YTA2NCwgMHg5MDg0LCAweDAwMGYsIDB4OTA4MCwKKwkweDFlYWIsIDB4MjA2NSwgMHg4Y2ZmLCAweDA5MGMsIDB4MGQ3ZCwgMHg4YTUxLCAweDAwMDUsIDB4MjA1MCwKKwkweDAwMDUsIDB4MDAwMCwgMHgwMDFkLCAweDAwMjEsIDB4MDAyNSwgMHgwMDI5LCAweDAwMmQsIDB4MDAzMSwKKwkweDAwMzUsIDB4MDAwMCwgMHgwMDFiLCAweDAwMjEsIDB4MDAyNywgMHgwMDJkLCAweDAwMzMsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAyMywgMHgwMDAwLCAweDAwMDAsIDB4MWU5ZSwgMHgxZTlhLCAweDFlOWUsIDB4MWU5ZSwKKwkweDFlYTgsIDB4MDAwMCwgMHgxZTllLCAweDFlYTUsIDB4MWVhNSwgMHgxZWEyLCAweDFlYTUsIDB4MWVhNSwKKwkweDAwMDAsIDB4MWVhOCwgMHgxZWE1LCAweDAwMDAsIDB4MWVhMCwgMHgxZWEwLCAweDAwMDAsIDB4MWVhMCwKKwkweDFlYTgsIDB4MDAwMCwgMHgxZWEwLCAweDFlYTYsIDB4MWVhNiwgMHgxZWE2LCAweDAwMDAsIDB4MWVhNiwKKwkweDAwMDAsIDB4MWVhOCwgMHgxZWE2LCAweDAwYzYsIDB4MDBkNiwgMHgwMDg2LCAweGFiNDIsIDB4YWMzZSwKKwkweGE4ODgsIDB4OTA1NSwgMHgwOTA0LCAweDIwYWEsIDB4Mjk0MCwgMHhhMDY0LCAweDkwZWMsIDB4MDAwZiwKKwkweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDgsIDB4MTExOCwgMHgyMDYxLCAweDFlYTYsIDB4MDBkMCwKKwkweDlkZTAsIDB4MWVhYiwgMHg5ZDg2LCAweDAwMDcsIDB4MDEzMCwgMHg5ZDg2LCAweDAwMGUsIDB4MDExOCwKKwkweDlkODYsIDB4MDAwZiwgMHgxMTIwLCAweGEwOGMsIDB4OTQyMiwgMHhhMDkwLCAweDkzMWIsIDB4MmMwNSwKKwkweDkwNjUsIDB4MTE0MCwgMHgwMzEwLCAweDA4MDQsIDB4MjBhYSwgMHhhMDA0LCAweDkwNDUsIDB4MDkwNCwKKwkweDIwYWEsIDB4MDhkOCwgMHgyYzA1LCAweDkwMDUsIDB4MDkwNCwgMHgxZjkyLCAweGRkOWMsIDB4MTkwNCwKKwkweDFmNGUsIDB4OTA4YSwgMHgwMDM2LCAweDFhMGMsIDB4MGQ3ZCwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwKKwkweDFmMjMsIDB4MWYyMywgMHgxZjI1LCAweDFmMjMsIDB4MWYyMywgMHgxZjIzLCAweDFmMmIsIDB4MWYyMywKKwkweDFmMjMsIDB4MWYyMywgMHgxZjMxLCAweDFmMjMsIDB4MWYyMywgMHgxZjIzLCAweDFmMzcsIDB4MWYyMywKKwkweDFmMjMsIDB4MWYyMywgMHgxZjNkLCAweDFmMjMsIDB4MWYyMywgMHgxZjIzLCAweDFmNDMsIDB4MWYyMywKKwkweDFmMjMsIDB4MWYyMywgMHgxZjQ5LCAweDA4MGMsIDB4MGQ3ZCwgMHhhMDdjLCAweDk0MjIsIDB4YTA4MCwKKwkweDkzMWIsIDB4MDgwNCwgMHgxZjg4LCAweGEwOGMsIDB4OTQyMiwgMHhhMDkwLCAweDkzMWIsIDB4MDgwNCwKKwkweDFmODgsIDB4YTA5YywgMHg5NDIyLCAweGEwYTAsIDB4OTMxYiwgMHgwODA0LCAweDFmODgsIDB4YTBhYywKKwkweDk0MjIsIDB4YTBiMCwgMHg5MzFiLCAweDA4MDQsIDB4MWY4OCwgMHhhMGJjLCAweDk0MjIsIDB4YTBjMCwKKwkweDkzMWIsIDB4MDgwNCwgMHgxZjg4LCAweGEwY2MsIDB4OTQyMiwgMHhhMGQwLCAweDkzMWIsIDB4MDgwNCwKKwkweDFmODgsIDB4YTBkYywgMHg5NDIyLCAweGEwZTAsIDB4OTMxYiwgMHgwNGQwLCAweDkwOGEsIDB4MDAzNCwKKwkweDFhMGMsIDB4MGQ3ZCwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHgxZjcwLCAweDFmNmUsIDB4MWY2ZSwKKwkweDFmNmUsIDB4MWY2ZSwgMHgxZjZlLCAweDFmNzUsIDB4MWY2ZSwgMHgxZjZlLCAweDFmNmUsIDB4MWY2ZSwKKwkweDFmNmUsIDB4MWY3YSwgMHgxZjZlLCAweDFmNmUsIDB4MWY2ZSwgMHgxZjZlLCAweDFmNmUsIDB4MWY3ZiwKKwkweDFmNmUsIDB4MWY2ZSwgMHgxZjZlLCAweDFmNmUsIDB4MWY2ZSwgMHgxZjg0LCAweDA4MGMsIDB4MGQ3ZCwKKwkweGEwN2MsIDB4OTQyMiwgMHhhMDgwLCAweDkzMWIsIDB4MDA5OCwgMHhhMDk0LCAweDk0MjIsIDB4YTA5OCwKKwkweDkzMWIsIDB4MDA3MCwgMHhhMGFjLCAweDk0MjIsIDB4YTBiMCwgMHg5MzFiLCAweDAwNDgsIDB4YTBjNCwKKwkweDk0MjIsIDB4YTBjOCwgMHg5MzFiLCAweDAwMjAsIDB4YTBkYywgMHg5NDIyLCAweGEwZTAsIDB4OTMxYiwKKwkweDA2MzAsIDB4MjMwMCwgMHg5NDA1LCAweDAxNjAsIDB4OGE1MSwgMHgwOTA0LCAweDIwYWEsIDB4OGM2MCwKKwkweDA4MDQsIDB4MWVmYSwgMHhhMDA0LCAweDkwNDUsIDB4MDkwNCwgMHgyMGFhLCAweDA4MDQsIDB4MWVkNSwKKwkweDhhNTEsIDB4MDkwNCwgMHgyMGFhLCAweDhjNjAsIDB4MmMwNSwgMHg5MDA1LCAweDExNTgsIDB4YTAwNCwKKwkweDkwNDUsIDB4MDkwNCwgMHgyMGFhLCAweGEwNjQsIDB4OTBlYywgMHgwMDBmLCAweDlkZTAsIDB4MWVhYiwKKwkweDJjMDUsIDB4MjA2MCwgMHhhODgwLCAweGMwZmMsIDB4YTg4MiwgMHgwODA0LCAweDIwOWYsIDB4MmMwNSwKKwkweDg0MjIsIDB4ODQyMCwgMHg4MzFhLCAweDkzOTksIDB4MDAwMCwgMHhhYzJlLCAweGFiMzIsIDB4ZGQ5YywKKwkweDE5MDQsIDB4MjAzYywgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHgxZmQ4LCAweDFmZDgsIDB4MWZkYSwKKwkweDFmZDgsIDB4MWZkOCwgMHgxZmQ4LCAweDFmZTgsIDB4MWZkOCwgMHgxZmQ4LCAweDFmZDgsIDB4MWZmNiwKKwkweDFmZDgsIDB4MWZkOCwgMHgxZmQ4LCAweDIwMDQsIDB4MWZkOCwgMHgxZmQ4LCAweDFmZDgsIDB4MjAxMiwKKwkweDFmZDgsIDB4MWZkOCwgMHgxZmQ4LCAweDIwMjAsIDB4MWZkOCwgMHgxZmQ4LCAweDFmZDgsIDB4MjAyZSwKKwkweDA4MGMsIDB4MGQ3ZCwgMHhhMTdjLCAweDI0MDAsIDB4OTEyMiwgMHhhMTgwLCAweDIzMDAsIDB4OTExYiwKKwkweDBhMGMsIDB4MGQ3ZCwgMHhhMDc0LCAweDk0MjAsIDB4YTA3OCwgMHg5MzE5LCAweDA4MDQsIDB4MjA5YSwKKwkweGExOGMsIDB4MjQwMCwgMHg5MTIyLCAweGExOTAsIDB4MjMwMCwgMHg5MTFiLCAweDBhMGMsIDB4MGQ3ZCwKKwkweGEwODQsIDB4OTQyMCwgMHhhMDg4LCAweDkzMTksIDB4MDgwNCwgMHgyMDlhLCAweGExOWMsIDB4MjQwMCwKKwkweDkxMjIsIDB4YTFhMCwgMHgyMzAwLCAweDkxMWIsIDB4MGEwYywgMHgwZDdkLCAweGEwOTQsIDB4OTQyMCwKKwkweGEwOTgsIDB4OTMxOSwgMHgwODA0LCAweDIwOWEsIDB4YTFhYywgMHgyNDAwLCAweDkxMjIsIDB4YTFiMCwKKwkweDIzMDAsIDB4OTExYiwgMHgwYTBjLCAweDBkN2QsIDB4YTBhNCwgMHg5NDIwLCAweGEwYTgsIDB4OTMxOSwKKwkweDA4MDQsIDB4MjA5YSwgMHhhMWJjLCAweDI0MDAsIDB4OTEyMiwgMHhhMWMwLCAweDIzMDAsIDB4OTExYiwKKwkweDBhMGMsIDB4MGQ3ZCwgMHhhMGI0LCAweDk0MjAsIDB4YTBiOCwgMHg5MzE5LCAweDA4MDQsIDB4MjA5YSwKKwkweGExY2MsIDB4MjQwMCwgMHg5MTIyLCAweGExZDAsIDB4MjMwMCwgMHg5MTFiLCAweDBhMGMsIDB4MGQ3ZCwKKwkweGEwYzQsIDB4OTQyMCwgMHhhMGM4LCAweDkzMTksIDB4MDgwNCwgMHgyMDlhLCAweGExZGMsIDB4MjQwMCwKKwkweDkxMjIsIDB4YTFlMCwgMHgyMzAwLCAweDkxMWIsIDB4MGEwYywgMHgwZDdkLCAweGEwZDQsIDB4OTQyMCwKKwkweGEwZDgsIDB4OTMxOSwgMHgwODA0LCAweDIwOWEsIDB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4MjA1YSwKKwkweDIwNTgsIDB4MjA1OCwgMHgyMDU4LCAweDIwNTgsIDB4MjA1OCwgMHgyMDY3LCAweDIwNTgsIDB4MjA1OCwKKwkweDIwNTgsIDB4MjA1OCwgMHgyMDU4LCAweDIwNzQsIDB4MjA1OCwgMHgyMDU4LCAweDIwNTgsIDB4MjA1OCwKKwkweDIwNTgsIDB4MjA4MSwgMHgyMDU4LCAweDIwNTgsIDB4MjA1OCwgMHgyMDU4LCAweDIwNTgsIDB4MjA4ZSwKKwkweDA4MGMsIDB4MGQ3ZCwgMHhhMTdjLCAweDI0MDAsIDB4OTEyMiwgMHhhMTgwLCAweDIzMDAsIDB4OTExYiwKKwkweDBhMGMsIDB4MGQ3ZCwgMHhhMDZjLCAweDk0MjAsIDB4YTA3MCwgMHg5MzE5LCAweDA0OTgsIDB4YTE5NCwKKwkweDI0MDAsIDB4OTEyMiwgMHhhMTk4LCAweDIzMDAsIDB4OTExYiwgMHgwYTBjLCAweDBkN2QsIDB4YTA4NCwKKwkweDk0MjAsIDB4YTA4OCwgMHg5MzE5LCAweDA0MzAsIDB4YTFhYywgMHgyNDAwLCAweDkxMjIsIDB4YTFiMCwKKwkweDIzMDAsIDB4OTExYiwgMHgwYTBjLCAweDBkN2QsIDB4YTA5YywgMHg5NDIwLCAweGEwYTAsIDB4OTMxOSwKKwkweDAwYzgsIDB4YTFjNCwgMHgyNDAwLCAweDkxMjIsIDB4YTFjOCwgMHgyMzAwLCAweDkxMWIsIDB4MGEwYywKKwkweDBkN2QsIDB4YTBiNCwgMHg5NDIwLCAweGEwYjgsIDB4OTMxOSwgMHgwMDYwLCAweGExZGMsIDB4MjQwMCwKKwkweDkxMjIsIDB4YTFlMCwgMHgyMzAwLCAweDkxMWIsIDB4MGEwYywgMHgwZDdkLCAweGEwY2MsIDB4OTQyMCwKKwkweGEwZDAsIDB4OTMxOSwgMHhhYzFlLCAweGFiMjIsIDB4YTg4MCwgMHhjMGZkLCAweGE4ODIsIDB4MjgwMCwKKwkweGE4NWEsIDB4MmMwMCwgMHhhODEyLCAweDJhMDAsIDB4YTgxNiwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwKKwkweDkwMDYsIDB4MDAyOCwgMHgwMDhlLCAweDAwZGUsIDB4MDBjZSwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwKKwkweDAwYzYsIDB4NjEwYywgMHgwMDE2LCAweDkwMjYsIDB4MjQxMCwgMHg2MDA0LCAweDk0MjAsIDB4OTI5MSwKKwkweDAwMDAsIDB4MmMwNCwgMHg5MjEwLCAweDljZTAsIDB4MDAwMiwgMHg5MThhLCAweDAwMDIsIDB4MWRhOCwKKwkweDkyODQsIDB4MDAwZiwgMHg5NDA1LCAweDAwMWUsIDB4MDBjZSwgMHgwMDA1LCAweDc4MDMsIDB4MDAwMywKKwkweDc4MGYsIDB4MDAwMCwgMHg2MDA0LCAweDc4MTIsIDB4MmMwNCwgMHg3ODE2LCAweDljZTAsIDB4MDAwMiwKKwkweDkxOGEsIDB4MDAwMiwgMHgxZGI4LCAweDAwMDUsIDB4MjAwMSwgMHgwMDA1LCAweDIwMDQsIDB4ZDBiYywKKwkweDE5MGMsIDB4MGQ3NiwgMHhkMDk0LCAweDAxMTAsIDB4MDgwYywgMHgxMWY2LCAweDAwMDUsIDB4MDEyNiwKKwkweDIwOTEsIDB4MjYwMCwgMHgyMDc5LCAweDAyMDAsIDB4MjA3MSwgMHgwMjYwLCAweDIwNjksIDB4MTgwMCwKKwkweDc4MTcsIDB4MDAwMCwgMHg3ODliLCAweDA4MTQsIDB4NzhhMywgMHgwNDA2LCAweDc4OWYsIDB4MDQxMCwKKwkweDIwMDksIDB4MDEzYiwgMHgyMDBiLCAweDA0MDAsIDB4NzgxYiwgMHgwMDAyLCAweDc4M2IsIDB4MDAxZiwKKwkweDc4MzcsIDB4MDAyMCwgMHg3ODAzLCAweDE2MDAsIDB4MDEyZSwgMHgwMDA1LCAweDIwOTEsIDB4MjYwMCwKKwkweDc4MWMsIDB4ZDBhNCwgMHgxOTBjLCAweDIyMDcsIDB4NzkwMCwgMHhkMWRjLCAweDExMTgsIDB4OTA4NCwKKwkweDAwMDYsIDB4MDAxYSwgMHg5MDg0LCAweDAwMGUsIDB4MDAwMiwgMHgyMTI1LCAweDIxMWQsIDB4N2Y0NSwKKwkweDIxMWQsIDB4MjExZiwgMHgyMTFmLCAweDIxMWYsIDB4MjExZiwgMHg3ZjJiLCAweDIxMWQsIDB4MjEyMSwKKwkweDIxMWQsIDB4MjExZiwgMHgyMTFkLCAweDIxMWYsIDB4MjExZCwgMHgwODBjLCAweDBkN2QsIDB4MDAzMSwKKwkweDAwMjAsIDB4MDgwYywgMHg3ZjJiLCAweDA4MGMsIDB4N2Y0NSwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDgwYywgMHhlOGEzLCAweDc5MzAsIDB4OTE4NCwgMHgwMDAzLCAweDA1MTAsIDB4MDgwYywKKwkweGE5MWUsIDB4MjAwMSwgMHgxOWY5LCAweDIwMDQsIDB4OTAwNSwgMHgwMWEwLCAweDIwMDEsIDB4MDEzMywKKwkweDIwMDQsIDB4OTAwNSwgMHgwOTBjLCAweDBkN2QsIDB4MDBjNiwgMHgyMDAxLCAweDE5ZjksIDB4MjA2NCwKKwkweDA4MGMsIDB4YTkzYSwgMHgwODBjLCAweGM1NjYsIDB4MjAwOSwgMHgwMDQwLCAweDA4MGMsIDB4MjIwYSwKKwkweDAwY2UsIDB4MDQwOCwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywgMHgyMjBhLCAweDA4MGMsIDB4YTkzYSwKKwkweDAwZDAsIDB4OTE4NCwgMHgwMDE0LCAweDAxYTAsIDB4NmEwMCwgMHg5Mjg2LCAweDAwMDMsIDB4MDE2MCwKKwkweDA4MGMsIDB4NzUzZCwgMHgxMTM4LCAweDA4MGMsIDB4Nzg0MCwgMHgwODBjLCAweDYwOTIsIDB4MDgwYywKKwkweDc0NmUsIDB4MDAxMCwgMHgwODBjLCAweDVmNGQsIDB4MDgwYywgMHg3ZmUzLCAweDAwNDEsIDB4MDAxOCwKKwkweDkxODQsIDB4OTU0MCwgMHgxZGM4LCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBlNiwKKwkweDAwMzYsIDB4MDA0NiwgMHgwMDU2LCAweDIwNzEsIDB4MWE2YSwgMHgwODBjLCAweDFiMTAsIDB4MDA1ZSwKKwkweDAwNGUsIDB4MDAzZSwgMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDJlMDAsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzEyOCwgMHgyMDAxLCAweDE5NmUsIDB4MjEwMiwgMHgyMDAxLCAweDE5NzYsIDB4MjEwMiwKKwkweDIwMDEsIDB4MDEzYiwgMHgyMTAyLCAweDIwNzksIDB4MDIwMCwgMHgyMDAxLCAweDAyMDEsIDB4Nzg5ZSwKKwkweDc4YTMsIDB4MDIwMCwgMHg5MTk4LCAweDAwMDcsIDB4ODMxYywgMHg4MzFjLCAweDgzMWMsIDB4OTM5OCwKKwkweDAwMDUsIDB4MjMyMCwgMHg5MTgyLCAweDAyMDQsIDB4MTIzMCwgMHgyMDExLCAweDAwMDgsIDB4ODQyMywKKwkweDg0MjMsIDB4ODQyMywgMHgwNDg4LCAweDkxODIsIDB4MDI0YywgMHgxMjQwLCAweDIwMTEsIDB4MDAwNywKKwkweDg0MDMsIDB4ODAwMywgMHg5NDAwLCAweDk0MDAsIDB4OTQyMCwgMHgwNDMwLCAweDkxODIsIDB4MDJiYywKKwkweDEyMzgsIDB4MjAxMSwgMHgwMDA2LCAweDg0MDMsIDB4ODAwMywgMHg5NDAwLCAweDk0MjAsIDB4MDBlMCwKKwkweDkxODIsIDB4MDM0YywgMHgxMjMwLCAweDIwMTEsIDB4MDAwNSwgMHg4NDAzLCAweDgwMDMsIDB4OTQyMCwKKwkweDAwOTgsIDB4OTE4MiwgMHgwNDJjLCAweDEyMjgsIDB4MjAxMSwgMHgwMDA0LCAweDg0MjMsIDB4ODQyMywKKwkweDAwNTgsIDB4OTE4MiwgMHgwNTljLCAweDEyMjgsIDB4MjAxMSwgMHgwMDAzLCAweDg0MDMsIDB4OTQyMCwKKwkweDAwMTgsIDB4MjAxMSwgMHgwMDAyLCAweDg0MjMsIDB4OTQ4MiwgMHgwMjI4LCAweDgwMDIsIDB4ODAyMCwKKwkweDgzMDEsIDB4OTQwMiwgMHgwMTEwLCAweDAyMDgsIDB4ODMyMSwgMHg4MjE3LCAweDgyMDMsIDB4OTQwNSwKKwkweDc4OWEsIDB4MDEyZSwgMHgwMDA1LCAweDAwMDYsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsIDB4NjgxNCwKKwkweDkwODQsIDB4ZmZjMCwgMHg5MTBkLCAweDY5MTYsIDB4MDBkZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBkNiwKKwkweDIwNjksIDB4MDIwMCwgMHg5MDA1LCAweDY4MTAsIDB4MDExMCwgMHhjMGE1LCAweDAwMDgsIDB4YzBhNCwKKwkweDY4MTIsIDB4MDBkZSwgMHgwMDA1LCAweDAwMDYsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsIDB4NjgxMCwKKwkweDkwODQsIDB4ZmZmOCwgMHg5MTBkLCAweDY5MTIsIDB4MDBkZSwgMHgwMDBlLCAweDAwMDUsIDB4NzkzOCwKKwkweDA4MGMsIDB4MGQ3NiwgMHgwMGY2LCAweDIwNzksIDB4MDIwMCwgMHg3OTAyLCAweGEwMDEsIDB4YTAwMSwKKwkweGEwMDEsIDB4YTAwMSwgMHhhMDAxLCAweGEwMDEsIDB4NzkwMiwgMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwKKwkweGEwMDEsIDB4YTAwMSwgMHhhMDAxLCAweDAwZmUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwKKwkweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweDE4MDAsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4MmE2NiwKKwkweDA4MGMsIDB4Mjk3YywgMHgyMDAxLCAweDE5OWMsIDB4MjAwMywgMHgwNzAwLCAweDIwMDEsIDB4MTk5ZCwKKwkweDIwMDMsIDB4MDcwMCwgMHgwODBjLCAweDJhZDcsIDB4OTAwNiwgMHgwODBjLCAweDI5YWIsIDB4OTAwNiwKKwkweDA4MGMsIDB4Mjk4ZSwgMHgyMGE5LCAweDAwMTIsIDB4MWQwNCwgMHgyMjNjLCAweDIwOTEsIDB4NjAwMCwKKwkweDFmMDQsIDB4MjIzYywgMHg2MDJmLCAweDAxMDAsIDB4NjAyZiwgMHgwMDAwLCAweDYwNTAsIDB4OTA4NSwKKwkweDA0MDAsIDB4OTA4NCwgMHhkZmZmLCAweDYwNTIsIDB4NjIyNCwgMHgwODBjLCAweDJhYjQsIDB4MDgwYywKKwkweDI2OWEsIDB4MjAwOSwgMHgwMGVmLCAweDYxMzIsIDB4NjEzNiwgMHgwODBjLCAweDI2YWEsIDB4NjBlNywKKwkweDAwMDAsIDB4NjFlYSwgMHg2MGUzLCAweDAwMDgsIDB4NjA0YiwgMHhmN2Y3LCAweDYwNDMsIDB4MDAwMCwKKwkweDYwMmYsIDB4MDA4MCwgMHg2MDJmLCAweDAwMDAsIDB4NjAwNywgMHgzNDlmLCAweDAwYzYsIDB4MjA2MSwKKwkweDAxNDAsIDB4NjA4YiwgMHgwMDBiLCAweDYwOGYsIDB4MTBiOCwgMHg2MDkzLCAweDAwMDAsIDB4NjA5NywKKwkweDAxOTgsIDB4MDBjZSwgMHg2MDA0LCAweDkwODUsIDB4ODAwMCwgMHg2MDA2LCAweDYwYmIsIDB4MDAwMCwKKwkweDIwYTksIDB4MDAxOCwgMHg2MGJmLCAweDAwMDAsIDB4MWYwNCwgMHgyMjdhLCAweDYwYmIsIDB4MDAwMCwKKwkweDYwYmYsIDB4MDEwOCwgMHg2MGJmLCAweDAwMTIsIDB4NjBiZiwgMHgwNDA1LCAweDYwYmYsIDB4MDAxNCwKKwkweDYwYmYsIDB4MDMyMCwgMHg2MGJmLCAweDAwMTgsIDB4NjAxYiwgMHgwMGYwLCAweDYwMWYsIDB4MDAxZSwKKwkweDYwMGYsIDB4MDA2YiwgMHg2MDJiLCAweDQwMmMsIDB4MDEyZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwKKwkweDAxNDAsIDB4NzhjMywgMHgwMDgwLCAweDc4YzMsIDB4MDA4MywgMHg3OGMzLCAweDAwMDAsIDB4MDBmZSwKKwkweDAwMDUsIDB4MjAwMSwgMHgxODM1LCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDE4MzQsIDB4MjAwMywKKwkweDAwMDEsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwKKwkweDYxMjQsIDB4NjAyOCwgMHg5MTBjLCAweDAwNjYsIDB4MjAzMSwgMHgxODM3LCAweDI2MzQsIDB4OTZiNCwKKwkweDAwMjgsIDB4MDA2ZSwgMHgxMTM4LCAweDYwMjAsIDB4ZDFiYywgMHgwMTIwLCAweGQwYmMsIDB4MTE2OCwKKwkweGQwYjQsIDB4MTE5OCwgMHg5MTg0LCAweDVlMmMsIDB4MTExOCwgMHg5MTg0LCAweDAwMDcsIDB4MDBhYSwKKwkweDkxOTUsIDB4MDAwNCwgMHg5Mjg0LCAweDAwMDcsIDB4MDA4MiwgMHgwMDE2LCAweDIwMDEsIDB4MDM4NywKKwkweDIwMGMsIDB4ZDFhNCwgMHgwMDFlLCAweDBkNzAsIDB4MGM5OCwgMHgwMDE2LCAweDIwMDEsIDB4MDM4NywKKwkweDIwMGMsIDB4ZDFiNCwgMHgwMDFlLCAweDBkMzAsIDB4MGM1OCwgMHgyMmU4LCAweDIyZTUsIDB4MjJlNSwKKwkweDIyZTUsIDB4MjJlNywgMHgyMmU1LCAweDIyZTUsIDB4MjJlNSwgMHgwODBjLCAweDBkN2QsIDB4MDAyOSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAxMmUsIDB4MDAwNSwgMHgwMGE2LCAweDYxMjQsIDB4NjAyOCwKKwkweGQwOWMsIDB4MDExOCwgMHhkMTljLCAweDE5MDQsIDB4MjU2MiwgMHhkMWY0LCAweDE5MGMsIDB4MGQ3NiwKKwkweDA4MGMsIDB4NzUzZCwgMHgwOTA0LCAweDIzNDUsIDB4MDgwYywgMHhkMDliLCAweDExMjAsIDB4NzAwMCwKKwkweDkwODYsIDB4MDAwMywgMHgwNTgwLCAweDYwMjQsIDB4OTA4NCwgMHgxODAwLCAweDA1NjAsIDB4MDgwYywKKwkweDc1NjAsIDB4MDExOCwgMHgwODBjLCAweDc1NGUsIDB4MTUzMCwgMHgyMDExLCAweDAwMjAsIDB4MDgwYywKKwkweDJhYjQsIDB4NjA0MywgMHgwMDAwLCAweDA4MGMsIDB4ZDA5YiwgMHgwMTY4LCAweDA4MGMsIDB4NzU2MCwKKwkweDExNTAsIDB4MjAwMSwgMHgxOWE2LCAweDIwMDMsIDB4MDAwMSwgMHg2MDI3LCAweDE4MDAsIDB4MDgwYywKKwkweDczYjMsIDB4MDgwNCwgMHgyNTY1LCAweDcwYTQsIDB4OTAwNSwgMHgxMTUwLCAweDcwYTcsIDB4MDAwMSwKKwkweDAwZDYsIDB4MjA2OSwgMHgwMTQwLCAweDA4MGMsIDB4NzU5NCwgMHgwMGRlLCAweDE5MDQsIDB4MjU2NSwKKwkweDA4MGMsIDB4Nzg0YSwgMHgwNDI4LCAweDA4MGMsIDB4NzU2MCwgMHgxNTkwLCAweDYwMjQsIDB4OTA4NCwKKwkweDE4MDAsIDB4MTEwOCwgMHgwNDY4LCAweDA4MGMsIDB4Nzg0YSwgMHgwODBjLCAweDc4NDAsIDB4MDgwYywKKwkweDYwOTIsIDB4MDgwYywgMHg3NDZlLCAweDA4MDQsIDB4MjU2MiwgMHhkMWFjLCAweDE1MDgsIDB4NjAyNCwKKwkweGQwZGMsIDB4MTE3MCwgMHhkMGU0LCAweDExNzgsIDB4ZDBkNCwgMHgxMTkwLCAweGQwY2MsIDB4MDEzMCwKKwkweDcwOTgsIDB4OTA4NiwgMHgwMDI4LCAweDExMTAsIDB4MDgwYywgMHg3NzIxLCAweDA4MDQsIDB4MjU2MiwKKwkweDA4MGMsIDB4Nzg0NSwgMHgwMDQ4LCAweDIwMDEsIDB4MTk3YywgMHgyMDAzLCAweDAwMDIsIDB4MDAyMCwKKwkweDA4MGMsIDB4NzY3ZSwgMHgwODA0LCAweDI1NjIsIDB4MDgwYywgMHg3N2M0LCAweDA4MDQsIDB4MjU2MiwKKwkweDYyMjAsIDB4ZDFiYywgMHgwMTM4LCAweGQyYmMsIDB4MTkwNCwgMHgyNWNiLCAweGQyYjQsIDB4MTkwNCwKKwkweDI1ZGQsIDB4MDAwMCwgMHhkMWFjLCAweDA5MDQsIDB4MjQ2ZiwgMHgwMDM2LCAweDYzMjgsIDB4YzNiYywKKwkweDYzMmEsIDB4MDAzZSwgMHgwODBjLCAweDc1M2QsIDB4MTFkMCwgMHgyMDExLCAweDAwMjAsIDB4MDgwYywKKwkweDJhYjQsIDB4MDAwNiwgMHgwMDI2LCAweDAwMzYsIDB4MDgwYywgMHg3NTU3LCAweDExNTgsIDB4MDgwYywKKwkweDc4NDAsIDB4MDgwYywgMHg2MDkyLCAweDA4MGMsIDB4NzQ2ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAwZSwKKwkweDAwYWUsIDB4MDAwNSwgMHgwMDNlLCAweDAwMmUsIDB4MDAwZSwgMHgwODBjLCAweDc1MTEsIDB4MDAxNiwKKwkweDAwNDYsIDB4MDBjNiwgMHg2NDRjLCAweDk0ODYsIDB4ZjBmMCwgMHgxMTM4LCAweDIwNjEsIDB4MDEwMCwKKwkweDY0NGEsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHg3NGRhLCAweDk0OGMsIDB4ZmYwMCwKKwkweDcwMzgsIDB4ZDA4NCwgMHgwMTc4LCAweDkxODYsIDB4ZjgwMCwgMHgxMTYwLCAweDcwNDgsIDB4ZDA4NCwKKwkweDExNDgsIDB4YzA4NSwgMHg3MDRhLCAweDAwMzYsIDB4MjQxOCwgMHgyMDExLCAweDgwMTYsIDB4MDgwYywKKwkweDRiNTIsIDB4MDAzZSwgMHgwODBjLCAweGQwOTQsIDB4MTkwNCwgMHgyNDQ2LCAweDkxOTYsIDB4ZmYwMCwKKwkweDA1YTgsIDB4NzA2MCwgMHg5MDg0LCAweDAwZmYsIDB4ODEwZiwgMHg4MWZmLCAweDAxMTAsIDB4OTExNiwKKwkweDA1NjgsIDB4NzEzMCwgMHhkMTg0LCAweDE1NTAsIDB4MDgwYywgMHgzM2FkLCAweDAxMjgsIDB4YzE4ZCwKKwkweDcxMzIsIDB4MDgwYywgMHg2YWQ1LCAweDE1MTAsIDB4NjI0MCwgMHg5Mjk0LCAweDAwMTAsIDB4MDEzMCwKKwkweDYyNDgsIDB4OTI5NCwgMHhmZjAwLCAweDkyOTYsIDB4ZmYwMCwgMHgwMWMwLCAweDcwMzAsIDB4ZDA4YywKKwkweDA5MDQsIDB4MjQ0NiwgMHg3MDM4LCAweGQwOGMsIDB4MTE0MCwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywKKwkweGQxYWMsIDB4MTkwNCwgMHgyNDQ2LCAweGMxYWQsIDB4MjEwMiwgMHgwMDM2LCAweDczZDgsIDB4MjAxMSwKKwkweDgwMTMsIDB4MDgwYywgMHg0YjUyLCAweDAwM2UsIDB4MDgwNCwgMHgyNDQ2LCAweDcwMzgsIDB4ZDA4YywKKwkweDExNDAsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4ZDFhYywgMHgxOTA0LCAweDI0NDYsIDB4YzFhZCwKKwkweDIxMDIsIDB4MDAzNiwgMHg3M2Q4LCAweDIwMTEsIDB4ODAxMywgMHgwODBjLCAweDRiNTIsIDB4MDAzZSwKKwkweDcxMzAsIDB4YzE4NSwgMHg3MTMyLCAweDIwMTEsIDB4MTg0OCwgMHgyMjBjLCAweGQxYTQsIDB4MDFmMCwKKwkweDAwMTYsIDB4MjAwOSwgMHgwMDAxLCAweDIwMTEsIDB4MDEwMCwgMHgwODBjLCAweDg5NzksIDB4MjAxOSwKKwkweDAwMGUsIDB4MDBjNiwgMHgyMDYxLCAweDAwMDAsIDB4MDgwYywgMHhlM2I1LCAweDAwY2UsIDB4OTQ4NCwKKwkweDAwZmYsIDB4OTA4MCwgMHgzM2I5LCAweDIwMGQsIDB4OTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MjEyMCwKKwkweDkwMDYsIDB4MjAwOSwgMHgwMDBlLCAweDA4MGMsIDB4ZTQ0NSwgMHgwMDFlLCAweDAwMTYsIDB4MjAwOSwKKwkweDAwMDIsIDB4MjAxOSwgMHgwMDA0LCAweDA4MGMsIDB4MzIwNSwgMHgwMDFlLCAweDAwNzgsIDB4MDE1NiwKKwkweDAwYjYsIDB4MjBhOSwgMHgwMDdmLCAweDkwMGUsIDB4MDgwYywgMHg2NjkzLCAweDExMTAsIDB4MDgwYywKKwkweDYwYWMsIDB4ODEwOCwgMHgxZjA0LCAweDI0M2MsIDB4MDBiZSwgMHgwMTVlLCAweDAwY2UsIDB4MDA0ZSwKKwkweDA4MGMsIDB4YTkxZSwgMHgwODBjLCAweGFiZTksIDB4MDgwYywgMHhhOTNhLCAweDYwZTMsIDB4MDAwMCwKKwkweDAwMWUsIDB4MjAwMSwgMHgxODAwLCAweDIwMTQsIDB4OTI5NiwgMHgwMDA0LCAweDExNzAsIDB4ZDE5YywKKwkweDExYjAsIDB4MjAxMSwgMHgxODBjLCAweDIyMTQsIDB4ZDI5YywgMHgxMTIwLCAweDYyMDQsIDB4OTI5NSwKKwkweDAwMDIsIDB4NjIwNiwgMHg2MjI4LCAweGMyOWQsIDB4NjIyYSwgMHgyMDAzLCAweDAwMDEsIDB4MjAwMSwKKwkweDE4MjYsIDB4MjAwMywgMHgwMDAwLCAweDIwMTEsIDB4MDAyMCwgMHgwODBjLCAweDJhYjQsIDB4ZDE5NCwKKwkweDA5MDQsIDB4MjU2MiwgMHgwMDE2LCAweDA4MGMsIDB4YTkxZSwgMHg2MjIwLCAweGQyYjQsIDB4MDkwNCwKKwkweDI0ZmQsIDB4MDgwYywgMHg4NzgwLCAweDA4MGMsIDB4OWVkNCwgMHgyMDExLCAweDAwMDQsIDB4MDgwYywKKwkweDJhYjQsIDB4MDBmNiwgMHgyMDE5LCAweDE5ZjIsIDB4MjMwNCwgMHg5MDdkLCAweDA5MDQsIDB4MjRjYSwKKwkweDc4MDQsIDB4OTA4NiwgMHgwMDMyLCAweDE1ZjAsIDB4MDBkNiwgMHgwMGM2LCAweDAwZTYsIDB4MDA5NiwKKwkweDIwNjksIDB4MDE0MCwgMHg3ODJjLCAweDY4NWUsIDB4NzgwOCwgMHg2ODVhLCAweDYwNDMsIDB4MDAwMiwKKwkweDIwMDEsIDB4MDAwMywgMHg4MDAxLCAweDFkZjAsIDB4NjA0MywgMHgwMDAwLCAweDIwMDEsIDB4MDAzYywKKwkweDgwMDEsIDB4MWRmMCwgMHgwODBjLCAweDJhOGEsIDB4MjAwMSwgMHgwMDFlLCAweDgwMDEsIDB4MDI0MCwKKwkweDIwYTksIDB4MDAwOSwgMHgwODBjLCAweDJhNDEsIDB4NjkwNCwgMHhkMWRjLCAweDExNDAsIDB4MGNiMCwKKwkweDIwMDEsIDB4MDEwMCwgMHgwODBjLCAweDJhN2EsIDB4OTAwNiwgMHgwODBjLCAweDJhN2EsIDB4MDgwYywKKwkweDk2N2EsIDB4MDgwYywgMHhhOTNhLCAweDc4MTQsIDB4MjA0OCwgMHhhODY3LCAweDAxMDMsIDB4MmY2MCwKKwkweDA4MGMsIDB4YWNiMCwgMHgwMDllLCAweDAwZWUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZmUsIDB4MDAxZSwKKwkweDAwYWUsIDB4MDAwNSwgMHgwMGZlLCAweDAwZDYsIDB4MjA2OSwgMHgwMTQwLCAweDY4MDQsIDB4OTA4NCwKKwkweDQwMDAsIDB4MDExMCwgMHgwODBjLCAweDJhOGEsIDB4MDBkZSwgMHgwMGM2LCAweDIwNjEsIDB4MTllNiwKKwkweDYwMzQsIDB4MDgwYywgMHhkMDliLCAweDAxMjAsIDB4OTA5YSwgMHgwMDAzLCAweDEyNTgsIDB4MDAxOCwKKwkweDkwOWEsIDB4MDBjOCwgMHgxMjM4LCAweDgwMDAsIDB4NjAzNiwgMHgwMGNlLCAweDA4MGMsIDB4OWVhYywKKwkweDA4MDQsIDB4MjU1ZiwgMHgyMDYxLCAweDAxMDAsIDB4NjJjMCwgMHgwODBjLCAweGE4NGYsIDB4MjAxOSwKKwkweDE5ZjIsIDB4MjMwNCwgMHg5MDY1LCAweDAxMzAsIDB4NjAwMywgMHgwMDAxLCAweDIwMDksIDB4MDAyNywKKwkweDA4MGMsIDB4YWQ0ZCwgMHgwMGNlLCAweDA4MDQsIDB4MjU1ZiwgMHhkMmJjLCAweDA5MDQsIDB4MjU0MiwKKwkweDA4MGMsIDB4ODc4ZCwgMHgyMDExLCAweDAwMDQsIDB4MDgwYywgMHgyYWI0LCAweDAwZDYsIDB4MjA2OSwKKwkweDAxNDAsIDB4NjgwNCwgMHg5MDg0LCAweDQwMDAsIDB4MDExMCwgMHgwODBjLCAweDJhOGEsIDB4MDBkZSwKKwkweDAwYzYsIDB4MjA2MSwgMHgxOWU2LCAweDYwNTAsIDB4MDgwYywgMHhkMDliLCAweDAxMjAsIDB4OTA5YSwKKwkweDAwMDMsIDB4MTY2OCwgMHgwMDE4LCAweDkwOWEsIDB4MDBjOCwgMHgxNjQ4LCAweDgwMDAsIDB4NjA1MiwKKwkweDYwNGMsIDB4MDBjZSwgMHg5MDA1LCAweDA1ZDgsIDB4MjAwOSwgMHgwN2QwLCAweDA4MGMsIDB4ODc4NSwKKwkweDkwODAsIDB4MDAwOCwgMHgyMDA0LCAweDkwODYsIDB4MDAwNiwgMHgxMTM4LCAweDIwMDksIDB4MTk4NCwKKwkweDIwMTEsIDB4MDAxMiwgMHgwODBjLCAweDJhYzMsIDB4MDQ1MCwgMHg5MDgwLCAweDAwMDgsIDB4MjAwNCwKKwkweDkwODYsIDB4MDAwOSwgMHgwZDk4LCAweDIwMDksIDB4MTk4NCwgMHgyMDExLCAweDAwMTYsIDB4MDgwYywKKwkweDJhYzMsIDB4MDBlOCwgMHgyMDExLCAweDAwMDQsIDB4MDgwYywgMHgyYWI0LCAweDAwYzAsIDB4MDAzNiwKKwkweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweGExYjgsIDB4MDAzZSwgMHgyMDE5LCAweDE5ZjksIDB4MjMwNCwKKwkweDkwNjUsIDB4MDE2MCwgMHgyMDA5LCAweDAwNGYsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDksIDB4MTExMCwKKwkweDIwMDksIDB4MDA0ZiwgMHg2MDAzLCAweDAwMDMsIDB4MDgwYywgMHhhZDRkLCAweDAwY2UsIDB4MDgwYywKKwkweGE5M2EsIDB4MDAxZSwgMHhkMTljLCAweDA5MDQsIDB4MjVjNCwgMHg3MDM4LCAweGQwYWMsIDB4MTU1OCwKKwkweDAwMTYsIDB4MDE1NiwgMHgyMDExLCAweDAwMDgsIDB4MDgwYywgMHgyYWI0LCAweDA4MGMsIDB4MmFkNywKKwkweDA4MGMsIDB4MmIwYSwgMHg2MDUwLCAweGMwZTUsIDB4NjA1MiwgMHgyMGE5LCAweDAzNjcsIDB4MWYwNCwKKwkweDI1OTEsIDB4MWQwNCwgMHgyNTc5LCAweDA4MGMsIDB4ODdiNCwgMHg2MDIwLCAweGQwOWMsIDB4MWRiOCwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDA4MGMsIDB4MjllZCwgMHgwMGZlLCAweDFkODAsIDB4NjA1MCwKKwkweGMwZTQsIDB4NjA1MiwgMHgyMDExLCAweDAwMDgsIDB4MDgwYywgMHgyYWI0LCAweDAxNWUsIDB4MDAxZSwKKwkweDA0OTgsIDB4MDE1ZSwgMHgwMDFlLCAweDAwMTYsIDB4NjAyOCwgMHhjMDljLCAweDYwMmEsIDB4MDgwYywKKwkweGE5MWUsIDB4MDgwYywgMHhhYmU5LCAweDA4MGMsIDB4YTkzYSwgMHg2MGUzLCAweDAwMDAsIDB4MDgwYywKKwkweGU4ODIsIDB4MDgwYywgMHhlODlkLCAweDA4MGMsIDB4NTc0MiwgMHhkMGZjLCAweDExMzgsIDB4MDgwYywKKwkweGQwOTQsIDB4MTEyMCwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywgMHg3NTg0LCAweDkwMDYsIDB4MDgwYywKKwkweDJhN2EsIDB4MjAwOSwgMHgwMDAyLCAweDA4MGMsIDB4MmE2NiwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwKKwkweDcwMDMsIDB4MDAwNCwgMHgwODBjLCAweDBlYzEsIDB4MDBlZSwgMHgyMDExLCAweDAwMDgsIDB4MDgwYywKKwkweDJhYjQsIDB4MDgwYywgMHgwYmMzLCAweDAwMWUsIDB4OTE4YywgMHhmZmQwLCAweDIxMTAsIDB4MDgwYywKKwkweDJhYjQsIDB4MDBhZSwgMHgwMDA1LCAweDAwMTYsIDB4MjAwMSwgMHgwMzg3LCAweDIwMGMsIDB4ZDFhNCwKKwkweDAwMWUsIDB4MDkwNCwgMHgyMzcyLCAweDAwMTYsIDB4MjAwOSwgMHgyNWQ3LCAweDAwYzAsIDB4MjAwMSwKKwkweDAzODcsIDB4MjAwMywgMHgxMDAwLCAweDAwMWUsIDB4MGMzOCwgMHgwMDE2LCAweDIwMDEsIDB4MDM4NywKKwkweDIwMGMsIDB4ZDFiNCwgMHgwMDFlLCAweDA5MDQsIDB4MjM3MiwgMHgwMDE2LCAweDIwMDksIDB4MjVlOSwKKwkweDAwMzAsIDB4MjAwMSwgMHgwMzg3LCAweDIwMDMsIDB4NDAwMCwgMHgwMDFlLCAweDA4YTgsIDB4NjAyOCwKKwkweGMwYmMsIDB4NjAyYSwgMHgyMDAxLCAweDAxNTYsIDB4MjAwMywgMHhiYzkxLCAweDgwMDAsIDB4MjAwMywKKwkweGZmZmYsIDB4NjA0MywgMHgwMDAxLCAweDA4MGMsIDB4MmE2MCwgMHgyMDExLCAweDAwODAsIDB4MDgwYywKKwkweDJhYjQsIDB4NjAxNywgMHgwMDAwLCAweDYwNDMsIDB4MDAwMCwgMHgwODE3LCAweDAwMDYsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDAzNiwgMHgwMGU2LCAweDAwZjYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzFkMCwgMHg3MGQyLCAweDkxMTYsIDB4MDkwNCwgMHgyNjU5LCAweDgxZmYsIDB4MDFhMCwKKwkweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweDJhNjYsIDB4MjAxMSwgMHg4MDExLCAweDIwMTksIDB4MDEwZSwKKwkweDIzMWMsIDB4OTM5ZSwgMHgwMDA3LCAweDExMTgsIDB4MjAxOSwgMHgwMDAxLCAweDAwMTAsIDB4MjAxOSwKKwkweDAwMDAsIDB4MDgwYywgMHg0YjUyLCAweDA0NjgsIDB4MjAwMSwgMHgxOWE3LCAweDIwMGMsIDB4ODFmZiwKKwkweDExNDAsIDB4MjAwMSwgMHgwMTA5LCAweDIwMDQsIDB4ZDBiNCwgMHgwMTE4LCAweDIwMTksIDB4MDAwMywKKwkweDAwMDgsIDB4MjExOCwgMHgyMDExLCAweDgwMTIsIDB4MDgwYywgMHg0YjUyLCAweDA4MGMsIDB4MGVjMSwKKwkweDA4MGMsIDB4NTc0MiwgMHhkMGZjLCAweDExYTgsIDB4MDgwYywgMHhkMDk0LCAweDExOTAsIDB4MDBjNiwKKwkweDA4MGMsIDB4MjZmNSwgMHgwODBjLCAweGE5MWUsIDB4MDgwYywgMHhhMTEzLCAweDA4MGMsIDB4YTkzYSwKKwkweDIwNjEsIDB4MDEwMCwgMHgyMDE5LCAweDAwMjgsIDB4MjAwOSwgMHgwMDAyLCAweDA4MGMsIDB4MzIwNSwKKwkweDAwY2UsIDB4MDEyZSwgMHgwMGZlLCAweDAwZWUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwKKwkweDAwMDUsIDB4MjAyOCwgMHg5MThjLCAweDAwZmYsIDB4MjEzMCwgMHg5MDk0LCAweGZmMDAsIDB4MTFmMCwKKwkweDIwMTEsIDB4MTgzNywgMHgyMjE0LCAweGQyYWMsIDB4MTFjOCwgMHg4MWZmLCAweDAxZTgsIDB4MjAxMSwKKwkweDE4MWYsIDB4MjIwNCwgMHg5MTA2LCAweDExOTAsIDB4MjAxMSwgMHgxODIwLCAweDIyMTQsIDB4OTI5NCwKKwkweGZmMDAsIDB4OTU4NCwgMHhmZjAwLCAweDkyMDYsIDB4MTE0OCwgMHgyMDExLCAweDE4MjAsIDB4MjIxNCwKKwkweDkyOTQsIDB4MDBmZiwgMHg5NTg0LCAweDAwZmYsIDB4OTIwNiwgMHgxMTIwLCAweDI1MDAsIDB4MDgwYywKKwkweDgyNTYsIDB4MDA0OCwgMHg5NTg0LCAweDAwZmYsIDB4OTA4MCwgMHgzM2I5LCAweDIwMGQsIDB4OTE4YywKKwkweGZmMDAsIDB4ODEwZiwgMHg5MDA2LCAweDAwMDUsIDB4OTA4MCwgMHgzM2I5LCAweDIwMGQsIDB4OTE4YywKKwkweDAwZmYsIDB4MDAwNSwgMHgwMGQ2LCAweDIwNjksIDB4MDE0MCwgMHgyMDAxLCAweDE4MTgsIDB4MjAwMywKKwkweDAwZWYsIDB4MjBhOSwgMHgwMDEwLCAweDkwMDYsIDB4Njg1MiwgMHg2ODU2LCAweDFmMDQsIDB4MjZhNSwKKwkweDAwZGUsIDB4MDAwNSwgMHgwMDA2LCAweDAwZDYsIDB4MDAyNiwgMHgyMDY5LCAweDAxNDAsIDB4MjAwMSwKKwkweDE4MTgsIDB4MjEwMiwgMHg4MTE0LCAweDgyMTQsIDB4ODIxNCwgMHg4MjE0LCAweDIwYTksIDB4MDAxMCwKKwkweDY4NTMsIDB4MDAwMCwgMHg5MDA2LCAweDgyZmYsIDB4MTEyOCwgMHg5MTg0LCAweDAwMGYsIDB4OTA4MCwKKwkweGU4YjEsIDB4MjAwNSwgMHg2ODU2LCAweDgyMTEsIDB4MWYwNCwgMHgyNmJhLCAweDAwMmUsIDB4MDBkZSwKKwkweDAwMGUsIDB4MDAwNSwgMHgwMGM2LCAweDIwNjEsIDB4MTgwMCwgMHg2MDMwLCAweDAxMTAsIDB4YzA5ZCwKKwkweDAwMDgsIDB4YzA5YywgMHg2MDMyLCAweDAwY2UsIDB4MDAwNSwgMHgwMTU2LCAweDAwZDYsIDB4MDAyNiwKKwkweDAwMTYsIDB4MDAwNiwgMHgyMDY5LCAweDAxNDAsIDB4Njk4MCwgMHg5MTE2LCAweDAxODAsIDB4OTExMiwKKwkweDEyMzAsIDB4ODIxMiwgMHg4MjEwLCAweDIyYTgsIDB4MjAwMSwgMHgwNDAyLCAweDAwMTgsIDB4MjJhOCwKKwkweDIwMDEsIDB4MDQwNCwgMHg2ODBlLCAweDFmMDQsIDB4MjZlYSwgMHg2ODBmLCAweDAwMDAsIDB4MDAwZSwKKwkweDAwMWUsIDB4MDAyZSwgMHgwMGRlLCAweDAxNWUsIDB4MDAwNSwgMHgwODBjLCAweDU3M2UsIDB4ZDBjNCwKKwkweDAxNTAsIDB4ZDBhNCwgMHgwMTQwLCAweDkwMDYsIDB4MDA0NiwgMHgyMDIwLCAweDIwMDksIDB4MDAyZSwKKwkweDA4MGMsIDB4ZTQ0NSwgMHgwMDRlLCAweDAwMDUsIDB4MDBmNiwgMHgwMDE2LCAweDAwMjYsIDB4MjA3OSwKKwkweDAxNDAsIDB4NzhjNCwgMHhkMGRjLCAweDA5MDQsIDB4Mjc2MSwgMHgwODBjLCAweDI5ZGQsIDB4MDY2MCwKKwkweDkwODQsIDB4MDcwMCwgMHg5MDhlLCAweDA2MDAsIDB4MTEyMCwgMHgyMDExLCAweDQwMDAsIDB4OTAwZSwKKwkweDA0NTgsIDB4OTA4ZSwgMHgwNTAwLCAweDExMjAsIDB4MjAxMSwgMHg4MDAwLCAweDkwMGUsIDB4MDQyMCwKKwkweDkwOGUsIDB4MDQwMCwgMHgxMTIwLCAweDkwMTYsIDB4MjAwOSwgMHgwMDAxLCAweDAwZTgsIDB4OTA4ZSwKKwkweDAzMDAsIDB4MTEyMCwgMHg5MDE2LCAweDIwMDksIDB4MDAwMiwgMHgwMGIwLCAweDkwOGUsIDB4MDIwMCwKKwkweDExMjAsIDB4OTAxNiwgMHgyMDA5LCAweDAwMDQsIDB4MDA3OCwgMHg5MDhlLCAweDAxMDAsIDB4MTU0OCwKKwkweDkwMTYsIDB4MjAwOSwgMHgwMDA4LCAweDAwNDAsIDB4OTA4NCwgMHgwNzAwLCAweDkwOGUsIDB4MDMwMCwKKwkweDE1MDAsIDB4MjAxMSwgMHgwMDMwLCAweDAwNTgsIDB4MjMwMCwgMHg5MDgwLCAweDAwMjAsIDB4MjAxOCwKKwkweDA4MGMsIDB4OTFmOCwgMHg5MjhjLCAweGZmMDAsIDB4MDExMCwgMHgyMDExLCAweDAwZmYsIDB4MjIwMCwKKwkweDgwMDcsIDB4OTA4NSwgMHgwMDRjLCAweDc4YzIsIDB4MjAwOSwgMHgwMTM4LCAweDIyMGEsIDB4MDgwYywKKwkweDc1M2QsIDB4MTExOCwgMHgyMDA5LCAweDE5NmMsIDB4MjIwYSwgMHgwMDJlLCAweDAwMWUsIDB4MDBmZSwKKwkweDAwMDUsIDB4NzhjMywgMHgwMDAwLCAweDBjYzgsIDB4MDEyNiwgMHgyMDkxLCAweDI4MDAsIDB4MDAwNiwKKwkweDAwMTYsIDB4MDAyNiwgMHgyMDAxLCAweDAxNzAsIDB4MjAwYywgMHg4MDAwLCAweDIwMTQsIDB4OTE4NCwKKwkweDAwMDMsIDB4MDExMCwgMHgwODBjLCAweDBkNzYsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDEyZSwKKwkweDAwMDUsIDB4MjAwMSwgMHgwMTcxLCAweDIwMDQsIDB4ZDBkYywgMHgwMTY4LCAweDIwMDEsIDB4MDE3MCwKKwkweDIwMGMsIDB4OTE4YywgMHgwMGZmLCAweDkxOGUsIDB4MDA0YywgMHgxMTI4LCAweDIwMGMsIDB4OTE4YywKKwkweGZmMDAsIDB4ODEwZiwgMHgwMDA1LCAweDkwMGUsIDB4MjAwMSwgMHgwMjI3LCAweDIwMDQsIDB4ODAwNywKKwkweDkwODQsIDB4MDBmZiwgMHg4MDA0LCAweDkxMDgsIDB4MjAwMSwgMHgwMjI2LCAweDIwMDQsIDB4ODAwNywKKwkweDkwODQsIDB4MDBmZiwgMHg4MDA0LCAweDkxMDgsIDB4MDAwNSwgMHgwMDE4LCAweDAwMGMsIDB4MDAxOCwKKwkweDAwMjAsIDB4MTAwMCwgMHgwODAwLCAweDEwMDAsIDB4MTgwMCwgMHgwMTU2LCAweDAwMDYsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDBlNiwgMHgyMDAxLCAweDE5OGYsIDB4MjAwNCwgMHg5MDhhLCAweDAwMDcsIDB4MWEwYywKKwkweDBkN2QsIDB4MDAzMywgMHgwMGVlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAxNWUsIDB4MDAwNSwKKwkweDI3YmYsIDB4MjdkZCwgMHgyODAxLCAweDI4MDMsIDB4MjgyYywgMHgyODJlLCAweDI4MzAsIDB4MjAwMSwKKwkweDAwMDEsIDB4MDgwYywgMHgyNjA2LCAweDA4MGMsIDB4MmEyYiwgMHgyMDAxLCAweDE5OTEsIDB4MjAwMywKKwkweDAwMDAsIDB4NzgyOCwgMHg5MDg0LCAweGUxZDcsIDB4NzgyYSwgMHg5MDA2LCAweDIwYTksIDB4MDAwOSwKKwkweDA4MGMsIDB4MjlmOSwgMHgyMDAxLCAweDE5OGYsIDB4MjAwMywgMHgwMDA2LCAweDIwMDksIDB4MDAxZSwKKwkweDIwMTEsIDB4MjgzMSwgMHgwODBjLCAweDg3OTIsIDB4MDAwNSwgMHgyMDA5LCAweDE5OTQsIDB4MjAwYiwKKwkweDAwMDAsIDB4MjAwMSwgMHgxOTk5LCAweDIwMDMsIDB4MDAzNiwgMHgyMDAxLCAweDE5OTgsIDB4MjAwMywKKwkweDAwMmEsIDB4MjAwMSwgMHgxOTkxLCAweDIwMDMsIDB4MDAwMSwgMHg5MDA2LCAweDA4MGMsIDB4Mjk4ZSwKKwkweDIwMDEsIDB4ZmZmZiwgMHgyMGE5LCAweDAwMDksIDB4MDgwYywgMHgyOWY5LCAweDIwMDEsIDB4MTk4ZiwKKwkweDIwMDMsIDB4MDAwNiwgMHgyMDA5LCAweDAwMWUsIDB4MjAxMSwgMHgyODMxLCAweDA4MGMsIDB4ODc5MiwKKwkweDAwMDUsIDB4MDgwYywgMHgwZDdkLCAweDIwMDEsIDB4MTk5OSwgMHgyMDAzLCAweDAwMzYsIDB4MjAwMSwKKwkweDE5OTEsIDB4MjAwMywgMHgwMDAzLCAweDdhMzgsIDB4OTI5NCwgMHgwMDA1LCAweDkyOTYsIDB4MDAwNCwKKwkweDAxMTAsIDB4OTAwNiwgMHgwMDEwLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI5OGUsIDB4MjAwMSwKKwkweDE5OTUsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4ZmZmZiwgMHgyMGE5LCAweDAwMDksIDB4MDgwYywKKwkweDI5ZjksIDB4MjAwMSwgMHgxOThmLCAweDIwMDMsIDB4MDAwNiwgMHgyMDA5LCAweDAwMWUsIDB4MjAxMSwKKwkweDI4MzEsIDB4MDgwYywgMHg4NzkyLCAweDAwMDUsIDB4MDgwYywgMHgwZDdkLCAweDA4MGMsIDB4MGQ3ZCwKKwkweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDBlNiwgMHgwMGY2LCAweDAxNTYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDc5LCAweDAxMDAsIDB4MjAwMSwgMHgxOTkxLCAweDIwMDQsIDB4OTA4YSwKKwkweDAwMDcsIDB4MWEwYywgMHgwZDdkLCAweDAwNDMsIDB4MDEyZSwgMHgwMTVlLCAweDAwZmUsIDB4MDBlZSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4Mjg1MywgMHgyODczLCAweDI4YjMsIDB4MjhlMywKKwkweDI5MDcsIDB4MjkxNywgMHgyOTE5LCAweDA4MGMsIDB4MjllZCwgMHgxMWIwLCAweDc4NTAsIDB4OTA4NCwKKwkweGVmZmYsIDB4Nzg1MiwgMHgyMDA5LCAweDE5OTcsIDB4MjEwNCwgMHg3YTM4LCAweDkyOTQsIDB4MDAwNSwKKwkweDkyOTYsIDB4MDAwNCwgMHgwMTEwLCAweGMwOGQsIDB4MDAwOCwgMHhjMDg1LCAweDIwMGEsIDB4MjAwMSwKKwkweDE5OGYsIDB4MjAwMywgMHgwMDAxLCAweDAwMzAsIDB4MDgwYywgMHgyOTNkLCAweDIwMDEsIDB4ZmZmZiwKKwkweDA4MGMsIDB4MjdjZSwgMHgwMDA1LCAweDA4MGMsIDB4MjkxYiwgMHgwNWUwLCAweDIwMDksIDB4MTk5OCwKKwkweDIxMDQsIDB4ODAwMSwgMHgyMDBhLCAweDA4MGMsIDB4MjllZCwgMHgxMTc4LCAweDc4NTAsIDB4OTA4NCwKKwkweGVmZmYsIDB4Nzg1MiwgMHg3YTM4LCAweDkyOTQsIDB4MDAwNSwgMHg5Mjk2LCAweDAwMDUsIDB4MDUxOCwKKwkweDIwMDksIDB4MTk5NywgMHgyMTA0LCAweGMwODUsIDB4MjAwYSwgMHgyMDA5LCAweDE5OTQsIDB4MjEwNCwKKwkweDgwMDAsIDB4MjAwYSwgMHg5MDg2LCAweDAwMDUsIDB4MDExOCwgMHgwODBjLCAweDI5MjMsIDB4MDBjMCwKKwkweDIwMGIsIDB4MDAwMCwgMHg3YTM4LCAweDkyOTQsIDB4MDAwNiwgMHg5Mjk2LCAweDAwMDQsIDB4MDExMCwKKwkweDkwMDYsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyOWFiLCAweDIwMDEsIDB4MTk5MSwKKwkweDIwMDMsIDB4MDAwMiwgMHgwMDI4LCAweDIwMDEsIDB4MTk4ZiwgMHgyMDAzLCAweDAwMDMsIDB4MDAxMCwKKwkweDA4MGMsIDB4MjdmMCwgMHgwMDA1LCAweDA4MGMsIDB4MjkxYiwgMHgwNTYwLCAweDIwMDksIDB4MTk5OCwKKwkweDIxMDQsIDB4ODAwMSwgMHgyMDBhLCAweDA4MGMsIDB4MjllZCwgMHgxMTY4LCAweDc4NTAsIDB4OTA4NCwKKwkweGVmZmYsIDB4Nzg1MiwgMHgyMDAxLCAweDE5OGYsIDB4MjAwMywgMHgwMDAzLCAweDIwMDEsIDB4MTk5MCwKKwkweDIwMDMsIDB4MDAwMCwgMHgwMGI4LCAweDIwMDksIDB4MTk5OCwgMHgyMTA0LCAweDkwMDUsIDB4MTExOCwKKwkweDA4MGMsIDB4Mjk2MCwgMHgwMDEwLCAweDA4MGMsIDB4MjkzMCwgMHgwODBjLCAweDI5MjMsIDB4MjAwOSwKKwkweDE5OTQsIDB4MjAwYiwgMHgwMDAwLCAweDIwMDEsIDB4MTk5MSwgMHgyMDAzLCAweDAwMDEsIDB4MDgwYywKKwkweDI3ZjAsIDB4MDAwMCwgMHgwMDA1LCAweDA0YjksIDB4MDUwOCwgMHgwODBjLCAweDI5ZWQsIDB4MTFiOCwKKwkweDc4NTAsIDB4OTA4NCwgMHhlZmZmLCAweDc4NTIsIDB4MjAwOSwgMHgxOTk1LCAweDIxMDQsIDB4ODAwMCwKKwkweDIwMGEsIDB4OTA4NiwgMHgwMDA3LCAweDAxMDgsIDB4MDA3OCwgMHgyMDAxLCAweDE5OWEsIDB4MjAwMywKKwkweDAwMGEsIDB4MjAwOSwgMHgxOTk3LCAweDIxMDQsIDB4YzBmZCwgMHgyMDBhLCAweDAwMzgsIDB4MDQxOSwKKwkweDIwMDEsIDB4MTk5MSwgMHgyMDAzLCAweDAwMDQsIDB4MDgwYywgMHgyODFiLCAweDAwMDUsIDB4MDA5OSwKKwkweDAxNjgsIDB4MDgwYywgMHgyOWVkLCAweDExMzgsIDB4Nzg1MCwgMHg5MDg0LCAweGVmZmYsIDB4Nzg1MiwKKwkweDA4MGMsIDB4MjgwNywgMHgwMDE4LCAweDAwNzksIDB4MDgwYywgMHgyODFiLCAweDAwMDUsIDB4MDgwYywKKwkweDBkN2QsIDB4MDgwYywgMHgwZDdkLCAweDIwMDksIDB4MTk5OSwgMHgyMTA0LCAweDgwMDEsIDB4MjAwYSwKKwkweDA5MGMsIDB4Mjk3YywgMHgwMDA1LCAweDdhMzgsIDB4OTI5NCwgMHgwMDA1LCAweDkyOTYsIDB4MDAwNSwKKwkweDAxMTAsIDB4OTAwNiwgMHgwMDEwLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI5YWIsIDB4MDAwNSwKKwkweDdhMzgsIDB4OTI5NCwgMHgwMDA2LCAweDkyOTYsIDB4MDAwNiwgMHgwMTEwLCAweDkwMDYsIDB4MDAxMCwKKwkweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI5OGUsIDB4MDAwNSwgMHgyMDA5LCAweDE5OTQsIDB4MjEwNCwKKwkweDgwMDAsIDB4MjAwYSwgMHg5MDg2LCAweDAwMDUsIDB4MDEwOCwgMHgwMDY4LCAweDIwMGIsIDB4MDAwMCwKKwkweDdhMzgsIDB4OTI5NCwgMHgwMDA2LCAweDkyOTYsIDB4MDAwNiwgMHgwMTEwLCAweDkwMDYsIDB4MDAxMCwKKwkweDIwMDEsIDB4MDAwMSwgMHgwNGQ5LCAweDdhMzgsIDB4OTI5NCwgMHgwMDA1LCAweDkyOTYsIDB4MDAwNSwKKwkweDAxMTAsIDB4OTAwNiwgMHgwMDEwLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI5YWIsIDB4MDAwNSwKKwkweDAwODYsIDB4MjAwMSwgMHgxOTk3LCAweDIwMDQsIDB4OTA4NCwgMHg3ZmZmLCAweDA5MGMsIDB4MGQ3ZCwKKwkweDIwMDksIDB4MTk5NiwgMHgyMTQ0LCAweDg4NDYsIDB4MjgwYSwgMHg5ODQ0LCAweDBkZDgsIDB4ZDA4YywKKwkweDExMjAsIDB4ZDA4NCwgMHgxMTIwLCAweDA4MGMsIDB4MGQ3ZCwgMHg5MDA2LCAweDAwMTAsIDB4MjAwMSwKKwkweDAwMDEsIDB4MDBhMSwgMHgwMDhlLCAweDAwMDUsIDB4MDAwNiwgMHgwMTU2LCAweDIwMDEsIDB4MTk4ZiwKKwkweDIwYTksIDB4MDAwOSwgMHgyMDAzLCAweDAwMDAsIDB4ODAwMCwgMHgxZjA0LCAweDI5ODIsIDB4MjAwMSwKKwkweDE5OTYsIDB4MjAwMywgMHg4MDAwLCAweDAxNWUsIDB4MDAwZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwKKwkweDAxMDAsIDB4OTA4NSwgMHgwMDAwLCAweDAxNTgsIDB4NzgzOCwgMHg5MDg0LCAweGZmZjksIDB4OTA4NSwKKwkweDAwMDQsIDB4NzgzYSwgMHgyMDA5LCAweDE5OWMsIDB4MjEwYywgMHg3OTVhLCAweDAwNTAsIDB4NzgzOCwKKwkweDkwODQsIDB4ZmZmYiwgMHg5MDg1LCAweDAwMDYsIDB4NzgzYSwgMHgyMDA5LCAweDE5OWQsIDB4MjEwYywKKwkweDc5NWEsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDkwODUsIDB4MDAwMCwKKwkweDAxNTgsIDB4NzgzOCwgMHg5MDg0LCAweGZmZmEsIDB4OTA4NSwgMHgwMDA0LCAweDc4M2EsIDB4Nzg1MCwKKwkweDkwODQsIDB4ZmZmMCwgMHg3ODUyLCAweDAwZjgsIDB4NzgzOCwgMHg5MDg0LCAweGZmZmIsIDB4OTA4NSwKKwkweDAwMDUsIDB4NzgzYSwgMHg3ODUwLCAweDkwODQsIDB4ZmZmMCwgMHgwMDE2LCAweDIwMDksIDB4MDE3ZiwKKwkweDIxMGMsIDB4OTE4ZSwgMHgwMDA1LCAweDAxNDAsIDB4MjAwOSwgMHgwMDAzLCAweDIxMGMsIDB4OTE4YywKKwkweDA2MDAsIDB4OTE4ZSwgMHgwNDAwLCAweDAxMTgsIDB4OTA4NSwgMHgwMDBhLCAweDAwMTAsIDB4OTA4NSwKKwkweDAwMDAsIDB4MDAxZSwgMHg3ODUyLCAweDAwZmUsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4MDEwMCwKKwkweDIwMDQsIDB4OTA4MiwgMHgwMDA3LCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4MDEwMCwKKwkweDIwMDQsIDB4OTA4MiwgMHgwMDA5LCAweDAwMGUsIDB4MDAwNSwgMHgwMTU2LCAweDIwYTksIDB4MDA2NCwKKwkweDc4MjAsIDB4MDgwYywgMHgyYTYwLCAweGQwOWMsIDB4MTExMCwgMHgxZjA0LCAweDI5ZjAsIDB4MDE1ZSwKKwkweDAwMDUsIDB4MDEyNiwgMHgwMDE2LCAweDAwMDYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4MmFkNywKKwkweDA4MGMsIDB4MmIwYSwgMHgwMDBlLCAweDIwMDgsIDB4OTE4NiwgMHgwMDAwLCAweDExMTgsIDB4NzgzYiwKKwkweDAwMDcsIDB4MDA5MCwgMHg5MTg2LCAweDAwMDEsIDB4MTExOCwgMHg3ODNiLCAweDAwMDYsIDB4MDA2MCwKKwkweDkxODYsIDB4MDAwMiwgMHgxMTE4LCAweDc4M2IsIDB4MDAwNSwgMHgwMDMwLCAweDkxODYsIDB4MDAwMywKKwkweDExMTgsIDB4NzgzYiwgMHgwMDA0LCAweDAwMDAsIDB4MDAwNiwgMHgxZDA0LCAweDJhMWQsIDB4MDgwYywKKwkweDg3YjQsIDB4MWYwNCwgMHgyYTFkLCAweDc4NTAsIDB4OTA4NSwgMHgxMDAwLCAweDc4NTIsIDB4MDAwZSwKKwkweDAwMWUsIDB4MDEyZSwgMHgwMDA1LCAweDA4MGMsIDB4MmIwYSwgMHgwMDA1LCAweDAwMDYsIDB4MDE1NiwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDIwYTksIDB4MDAwYSwgMHg3ODU0LCAweGQwYWMsIDB4MTEwMCwKKwkweDc4NTQsIDB4ZDA4YywgMHgxMTEwLCAweDFmMDQsIDB4MmEzOCwgMHgwMGZlLCAweDAxNWUsIDB4MDAwZSwKKwkweDAwMDUsIDB4MWQwNCwgMHgyYTQxLCAweDA4MGMsIDB4ODdiNCwgMHgxZjA0LCAweDJhNDEsIDB4MDAwNSwKKwkweDAwMDYsIDB4MjAwMSwgMHgxOTliLCAweDIwMDQsIDB4OTA4NiwgMHgwMDAwLCAweDAwMGUsIDB4MDAwNSwKKwkweDAwMDYsIDB4MjAwMSwgMHgxOTliLCAweDIwMDQsIDB4OTA4NiwgMHgwMDAxLCAweDAwMGUsIDB4MDAwNSwKKwkweDAwMDYsIDB4MjAwMSwgMHgxOTliLCAweDIwMDQsIDB4OTA4NiwgMHgwMDAyLCAweDAwMGUsIDB4MDAwNSwKKwkweGEwMDEsIDB4YTAwMSwgMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwKKwkweDE5YTcsIDB4MjEwMiwgMHgwMDBlLCAweDAwMDUsIDB4MjAwOSwgMHgwMTcxLCAweDIxMDQsIDB4ZDBkYywKKwkweDAxNDAsIDB4MjAwOSwgMHgwMTcwLCAweDIxMDQsIDB4MjAwYiwgMHgwMDgwLCAweGEwMDEsIDB4YTAwMSwKKwkweDIwMGEsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsIDB4MDgwYywgMHg3NTU3LCAweDAxMDgsIDB4YzBiYywKKwkweDIwMDksIDB4MDE0MCwgMHgyMTE0LCAweDkyOTQsIDB4MDAwMSwgMHg5MjE1LCAweDIyMGEsIDB4MDAyZSwKKwkweDAwMWUsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsIDB4MjAwOSwgMHgwMTQwLCAweDIxMTQsIDB4OTI5NCwKKwkweDAwMDEsIDB4OTI4NSwgMHgxMDAwLCAweDIwMGEsIDB4MjIwYSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwKKwkweDAwMTYsIDB4MDAyNiwgMHgyMDA5LCAweDAxNDAsIDB4MjExNCwgMHg5Mjk0LCAweDAwMDEsIDB4OTIxNSwKKwkweDIyMGEsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDIwMDksIDB4MDE0MCwKKwkweDIxMDQsIDB4MTEyOCwgMHgwODBjLCAweDc1NTcsIDB4MDExMCwgMHhjMGJjLCAweDAwMDgsIDB4YzBiZCwKKwkweDIwMGEsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAzODAsIDB4Nzg0MywKKwkweDAxMDEsIDB4Nzg0NCwgMHhkMDg0LCAweDFkZTgsIDB4MjAwMSwgMHgwMTA5LCAweDIyMDIsIDB4Nzg0MywKKwkweDAxMDAsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMzgwLCAweDc4NDMsIDB4MDIwMiwKKwkweDc4NDQsIDB4ZDA4YywgMHgxZGU4LCAweDIwNzksIDB4MDEwMCwgMHg3ODE0LCAweDkxMDQsIDB4OTIwNSwKKwkweDdhMTYsIDB4MjA3OSwgMHgwMzgwLCAweDc4NDMsIDB4MDIwMCwgMHgwMGZlLCAweDAwMDUsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDAzNiwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHg2MDUwLCAweDkwODQsIDB4ZmJmZiwKKwkweDkwODUsIDB4MDA0MCwgMHg2MDUyLCAweDIwYTksIDB4MDAwMiwgMHgwODBjLCAweDJhNDEsIDB4NjA1MCwKKwkweDkwODUsIDB4MDQwMCwgMHg5MDg0LCAweGZmOWYsIDB4NjA1MiwgMHgyMGE5LCAweDAwMDUsIDB4MDgwYywKKwkweDJhNDEsIDB4NjA1NCwgMHhkMGJjLCAweDA5MGMsIDB4MGQ3ZCwgMHgyMGE5LCAweDAwMDUsIDB4MDgwYywKKwkweDJhNDEsIDB4NjA1NCwgMHhkMGFjLCAweDA5MGMsIDB4MGQ3ZCwgMHgyMDA5LCAweDE5YWUsIDB4OTA4NCwKKwkweDdlMDAsIDB4ODAwNywgMHg4MDA0LCAweDgwMDQsIDB4MjAwYSwgMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwKKwkweDAwMWUsIDB4MDAwNSwgMHgwMDA2LCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDYwNTAsIDB4YzBjZCwKKwkweDYwNTIsIDB4MDBjZSwgMHgwMDBlLCAweDAwMDUsIDB4MzAxMCwgMHgzMDEwLCAweDJjMTQsIDB4MmMxNCwKKwkweDJjMjAsIDB4MmMyMCwgMHgyYzJjLCAweDJjMmMsIDB4MmMzYSwgMHgyYzNhLCAweDJjNDYsIDB4MmM0NiwKKwkweDJjNTQsIDB4MmM1NCwgMHgyYzYyLCAweDJjNjIsIDB4MmM3NCwgMHgyYzc0LCAweDJjODAsIDB4MmM4MCwKKwkweDJjOGUsIDB4MmM4ZSwgMHgyY2FjLCAweDJjYWMsIDB4MmNjYywgMHgyY2NjLCAweDJjOWMsIDB4MmM5YywKKwkweDJjYmMsIDB4MmNiYywgMHgyY2RhLCAweDJjZGEsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwKKwkweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwKKwkweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwKKwkweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwKKwkweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmNlYywgMHgyY2VjLCAweDJjZjgsIDB4MmNmOCwKKwkweDJkMDYsIDB4MmQwNiwgMHgyZDE0LCAweDJkMTQsIDB4MmQyNCwgMHgyZDI0LCAweDJkMzIsIDB4MmQzMiwKKwkweDJkNDIsIDB4MmQ0MiwgMHgyZDUyLCAweDJkNTIsIDB4MmQ2NCwgMHgyZDY0LCAweDJkNzIsIDB4MmQ3MiwKKwkweDJkODIsIDB4MmQ4MiwgMHgyZGE0LCAweDJkYTQsIDB4MmRjOCwgMHgyZGM4LCAweDJkOTIsIDB4MmQ5MiwKKwkweDJkYjYsIDB4MmRiNiwgMHgyZGQ4LCAweDJkZDgsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwKKwkweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwKKwkweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwKKwkweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwKKwkweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmRlYywgMHgyZGVjLCAweDJkZjgsIDB4MmRmOCwKKwkweDJlMDYsIDB4MmUwNiwgMHgyZTE0LCAweDJlMTQsIDB4MmUyNCwgMHgyZTI0LCAweDJlMzIsIDB4MmUzMiwKKwkweDJlNDIsIDB4MmU0MiwgMHgyZTUyLCAweDJlNTIsIDB4MmU2NCwgMHgyZTY0LCAweDJlNzIsIDB4MmU3MiwKKwkweDJlODIsIDB4MmU4MiwgMHgyZTkyLCAweDJlOTIsIDB4MmVhNCwgMHgyZWE0LCAweDJlYjQsIDB4MmViNCwKKwkweDJlYzYsIDB4MmVjNiwgMHgyZWQ4LCAweDJlZDgsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwKKwkweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwKKwkweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwKKwkweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwKKwkweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmVlYywgMHgyZWVjLCAweDJlZmEsIDB4MmVmYSwKKwkweDJmMGEsIDB4MmYwYSwgMHgyZjFhLCAweDJmMWEsIDB4MmYyYywgMHgyZjJjLCAweDJmM2MsIDB4MmYzYywKKwkweDJmNGUsIDB4MmY0ZSwgMHgyZjYwLCAweDJmNjAsIDB4MmY3NCwgMHgyZjc0LCAweDJmODQsIDB4MmY4NCwKKwkweDJmOTYsIDB4MmY5NiwgMHgyZmE4LCAweDJmYTgsIDB4MmZiYywgMHgyZmJjLCAweDJmY2QsIDB4MmZjZCwKKwkweDJmZTAsIDB4MmZlMCwgMHgyZmYzLCAweDJmZjMsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwKKwkweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwKKwkweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwKKwkweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwKKwkweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyMmFhLCAweDA4MDQsIDB4MzAwOCwKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4MjBkNCwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyMGQ0LCAweDA4MGMsIDB4MjJhYSwKKwkweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIwZmUsIDB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjJhYSwKKwkweDA4MGMsIDB4MjBmZSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyMGQ0LCAweDA4MGMsIDB4MjBmZSwKKwkweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHgyMmFhLCAweDA4MGMsIDB4MjBmZSwKKwkweDA4MDQsIDB4MzAwOCwgMHhhMDAxLCAweDBjZjAsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgxM2JiLCAweDA4MDQsIDB4MzAwOCwKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4MjJhYSwgMHgwODBjLCAweDEzYmIsIDB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjBkNCwKKwkweDA4MGMsIDB4MTNiYiwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyMmFhLCAweDA4MGMsIDB4MTNiYiwKKwkweDA4MGMsIDB4MjBmZSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyMGQ0LCAweDA4MGMsIDB4MjJhYSwKKwkweDA4MGMsIDB4MTNiYiwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyMGQ0LCAweDA4MGMsIDB4MTNiYiwKKwkweDA4MGMsIDB4MjBmZSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgxM2JiLCAweDA4MGMsIDB4MjBmZSwKKwkweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHgyMmFhLCAweDA4MGMsIDB4MTNiYiwKKwkweDA4MGMsIDB4MjBmZSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyNzY0LCAweDA4MDQsIDB4MzAwOCwKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4Mjc2NCwgMHgwODBjLCAweDIyYWEsIDB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjc2NCwKKwkweDA4MGMsIDB4MjBkNCwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyNzY0LCAweDA4MGMsIDB4MjBkNCwKKwkweDA4MGMsIDB4MjJhYSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyNzY0LCAweDA4MGMsIDB4MjBmZSwKKwkweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHgyMmFhLCAweDA4MGMsIDB4MjBmZSwKKwkweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHgyMGQ0LCAweDA4MGMsIDB4MjBmZSwKKwkweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHgyMGQ0LCAweDA4MGMsIDB4MjJhYSwKKwkweDA4MGMsIDB4MjBmZSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyNzY0LCAweDA4MGMsIDB4MTNiYiwKKwkweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHgyMmFhLCAweDA4MGMsIDB4MTNiYiwKKwkweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHgyMGQ0LCAweDA4MGMsIDB4MTNiYiwKKwkweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHgyMmFhLCAweDA4MGMsIDB4MTNiYiwKKwkweDA4MGMsIDB4MjBmZSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyNzY0LCAweDA4MGMsIDB4MjBkNCwKKwkweDA4MGMsIDB4MjJhYSwgMHgwODBjLCAweDEzYmIsIDB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjc2NCwKKwkweDA4MGMsIDB4MjBkNCwgMHgwODBjLCAweDEzYmIsIDB4MDgwYywgMHgyMGZlLCAweDA4MDQsIDB4MzAwOCwKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4Mjc2NCwgMHgwODBjLCAweDEzYmIsIDB4MDgwYywgMHgyMGZlLCAweDA4MDQsIDB4MzAwOCwKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4Mjc2NCwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHgyMmFhLCAweDA4MGMsIDB4MTNiYiwKKwkweDA4MGMsIDB4MjBmZSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHhhOTg0LCAweDA4MDQsIDB4MzAwOCwKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4YTk4NCwgMHgwODBjLCAweDIyYWEsIDB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjBkNCwKKwkweDA4MGMsIDB4YTk4NCwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyMGQ0LCAweDA4MGMsIDB4YTk4NCwKKwkweDA4MGMsIDB4MjJhYSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHhhOTg0LCAweDA4MGMsIDB4MjBmZSwKKwkweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweGE5ODQsIDB4MDgwYywgMHgyMmFhLCAweDA4MGMsIDB4MjBmZSwKKwkweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHhhOTg0LCAweDA4MGMsIDB4MjBmZSwKKwkweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHhhOTg0LCAweDA4MGMsIDB4MjJhYSwKKwkweDA4MGMsIDB4MjBmZSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHhhOTg0LCAweDA4MGMsIDB4MTNiYiwKKwkweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweGE5ODQsIDB4MDgwYywgMHgyMmFhLCAweDA4MGMsIDB4MTNiYiwKKwkweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHhhOTg0LCAweDA4MGMsIDB4MTNiYiwKKwkweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHhhOTg0LCAweDA4MGMsIDB4MjJhYSwKKwkweDA4MGMsIDB4MTNiYiwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHhhOTg0LCAweDA4MGMsIDB4MTNiYiwKKwkweDA4MGMsIDB4MjBmZSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHhhOTg0LCAweDA4MGMsIDB4MjJhYSwKKwkweDA4MGMsIDB4MTNiYiwgMHgwODBjLCAweDIwZmUsIDB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjBkNCwKKwkweDA4MGMsIDB4YTk4NCwgMHgwODBjLCAweDEzYmIsIDB4MDgwYywgMHgyMGZlLCAweDA4MDQsIDB4MzAwOCwKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4MjBkNCwgMHgwODBjLCAweGE5ODQsIDB4MDgwYywgMHgyMmFhLCAweDA4MGMsIDB4MTNiYiwKKwkweDA4MGMsIDB4MjBmZSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyNzY0LCAweDA4MGMsIDB4YTk4NCwKKwkweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHhhOTg0LCAweDA4MGMsIDB4MjJhYSwKKwkweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHgyMGQ0LCAweDA4MGMsIDB4YTk4NCwKKwkweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHgyMGQ0LCAweDA4MGMsIDB4YTk4NCwKKwkweDA4MGMsIDB4MjJhYSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyNzY0LCAweDA4MGMsIDB4YTk4NCwKKwkweDA4MGMsIDB4MjBmZSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyNzY0LCAweDA4MGMsIDB4YTk4NCwKKwkweDA4MGMsIDB4MjJhYSwgMHgwODBjLCAweDIwZmUsIDB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjc2NCwKKwkweDA4MGMsIDB4MjBkNCwgMHgwODBjLCAweGE5ODQsIDB4MDgwYywgMHgyMGZlLCAweDA4MDQsIDB4MzAwOCwKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4Mjc2NCwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHhhOTg0LCAweDA4MGMsIDB4MjJhYSwKKwkweDA4MGMsIDB4MjBmZSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyNzY0LCAweDA4MGMsIDB4YTk4NCwKKwkweDA4MGMsIDB4MTNiYiwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyNzY0LCAweDA4MGMsIDB4YTk4NCwKKwkweDA4MGMsIDB4MjJhYSwgMHgwODBjLCAweDEzYmIsIDB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjc2NCwKKwkweDA4MGMsIDB4MjBkNCwgMHgwODBjLCAweGE5ODQsIDB4MDgwYywgMHgxM2JiLCAweDA4MDQsIDB4MzAwOCwKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4Mjc2NCwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHhhOTg0LCAweDA4MGMsIDB4MjJhYSwKKwkweDA4MGMsIDB4MTNiYiwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyNzY0LCAweDA4MGMsIDB4YTk4NCwKKwkweDA4MGMsIDB4MTNiYiwgMHgwODBjLCAweDIwZmUsIDB4MDRkOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwKKwkweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywKKwkweGE5ODQsIDB4MDgwYywgMHgyMmFhLCAweDA4MGMsIDB4MTNiYiwgMHgwODBjLCAweDIwZmUsIDB4MDQ0MCwKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4Mjc2NCwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHgxM2JiLCAweDA4MGMsIDB4YTk4NCwKKwkweDA4MGMsIDB4MjBmZSwgMHgwMGE4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwKKwkweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjc2NCwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywKKwkweGE5ODQsIDB4MDgwYywgMHgyMmFhLCAweDA4MGMsIDB4MTNiYiwgMHgwODBjLCAweDIwZmUsIDB4MDAwMCwKKwkweDAxNWUsIDB4MDE0ZSwgMHgwMTNlLCAweDAxZGUsIDB4MDFjZSwgMHgwMTJlLCAweDAwMGUsIDB4MDEwZSwKKwkweDAwMGQsIDB4MDBiNiwgMHgwMGM2LCAweDAwMjYsIDB4MDA0NiwgMHg5MDI2LCAweDA4MGMsIDB4NmE5YiwKKwkweDE5MDQsIDB4MzEyMSwgMHg3MmRjLCAweDIwMDEsIDB4MTk3YiwgMHgyMDA0LCAweDkwMDUsIDB4MTExMCwKKwkweGQyOWMsIDB4MDE0OCwgMHhkMjg0LCAweDExMzgsIDB4ZDJiYywgMHgxOTA0LCAweDMxMjEsIDB4MDgwYywKKwkweDMxMjYsIDB4MDgwNCwgMHgzMTIxLCAweGQyY2MsIDB4MTkwNCwgMHgzMTIxLCAweDA4MGMsIDB4NzUzZCwKKwkweDExMjAsIDB4NzBhZiwgMHhmZmZmLCAweDA4MDQsIDB4MzEyMSwgMHhkMjk0LCAweDAxMjAsIDB4NzBhZiwKKwkweGZmZmYsIDB4MDgwNCwgMHgzMTIxLCAweDA4MGMsIDB4MzNhOCwgMHgwMTYwLCAweDA4MGMsIDB4ZDA5YiwKKwkweDAxMjgsIDB4MjAwMSwgMHgxODE4LCAweDIwM2MsIDB4MDgwNCwgMHgzMGFlLCAweDcwYWYsIDB4ZmZmZiwKKwkweDA4MDQsIDB4MzEyMSwgMHgyMDAxLCAweDE4MTgsIDB4MjAzYywgMHg3Mjk0LCAweGQyODQsIDB4MDkwNCwKKwkweDMwYWUsIDB4ZDI4YywgMHgxOTA0LCAweDMwYWUsIDB4MDAzNiwgMHg3M2FjLCAweDkzOGUsIDB4ZmZmZiwKKwkweDExMTAsIDB4MjAxOSwgMHgwMDAxLCAweDgzMTQsIDB4OTJlMCwgMHgxZDgwLCAweDJjMDQsIDB4OTM4YywKKwkweDAwMDEsIDB4MDEyMCwgMHg5MDg0LCAweGZmMDAsIDB4ODAwNywgMHgwMDEwLCAweDkwODQsIDB4MDBmZiwKKwkweDk3MGUsIDB4MDVkMCwgMHg5MDhlLCAweDAwMDAsIDB4MDViOCwgMHg5MDhlLCAweDAwZmYsIDB4MTE1MCwKKwkweDcyMzAsIDB4ZDI4NCwgMHgxNWIwLCAweDcyOTQsIDB4YzI4ZCwgMHg3Mjk2LCAweDcwYWYsIDB4ZmZmZiwKKwkweDAwM2UsIDB4MDRhMCwgMHg5MDBlLCAweDA4MGMsIDB4MjY2MSwgMHgwODBjLCAweDY2MzIsIDB4MTUzOCwKKwkweDkwMDYsIDB4YjhiYiwgMHgwNTIwLCAweGI4YWMsIDB4OTAwNSwgMHgwMTQ4LCAweDAwYzYsIDB4MjA2MCwKKwkweDA4MGMsIDB4OGMxZiwgMHgwMGNlLCAweDA5MGMsIDB4OGZiYywgMHhiOGFmLCAweDAwMDAsIDB4MDgwYywKKwkweDZhZGQsIDB4MTE2OCwgMHg3MDMwLCAweGQwOGMsIDB4MDEzMCwgMHhiODAwLCAweGQwYmMsIDB4MDEzOCwKKwkweDA4MGMsIDB4Njk4NiwgMHgwMTIwLCAweDA4MGMsIDB4MzEzZiwgMHgwMTQ4LCAweDAwMjgsIDB4MDgwYywKKwkweDMyOGIsIDB4MDgwYywgMHgzMTZiLCAweDAxMTgsIDB4ODMxOCwgMHgwODA0LCAweDMwNWIsIDB4NzNhZSwKKwkweDAwMTAsIDB4NzBhZiwgMHhmZmZmLCAweDAwM2UsIDB4MDgwNCwgMHgzMTIxLCAweDk3ODAsIDB4MzNiOSwKKwkweDIwM2QsIDB4OTdiYywgMHhmZjAwLCAweDg3M2YsIDB4MjA0MSwgMHgwMDdlLCAweDcwYWMsIDB4OTA5NiwKKwkweGZmZmYsIDB4MTExOCwgMHg5MDBlLCAweDI4YTgsIDB4MDA1MCwgMHg5ODEyLCAweDAyMjAsIDB4MjAwOCwKKwkweDk4MDIsIDB4MjBhOCwgMHgwMDIwLCAweDcwYWYsIDB4ZmZmZiwgMHgwODA0LCAweDMxMjEsIDB4MjcwMCwKKwkweDAxNTYsIDB4MDAxNiwgMHg5MTA2LCAweDA5MDQsIDB4MzExNiwgMHhjNDg0LCAweDA4MGMsIDB4NjY5MywKKwkweDAxNDgsIDB4MDgwYywgMHhkMDliLCAweDE5MDQsIDB4MzExNiwgMHgwODBjLCAweDY2MzIsIDB4MTkwNCwKKwkweDMxMWUsIDB4MDAwOCwgMHhjNDg1LCAweGI4YmIsIDB4MDUyMCwgMHhiOGFjLCAweDkwMDUsIDB4MDE0OCwKKwkweDAwYzYsIDB4MjA2MCwgMHgwODBjLCAweDhjMWYsIDB4MDBjZSwgMHgwOTBjLCAweDhmYmMsIDB4YjhhZiwKKwkweDAwMDAsIDB4MDgwYywgMHg2YWRkLCAweDExMzAsIDB4NzAzMCwgMHhkMDhjLCAweDAxZjgsIDB4YjgwMCwKKwkweGQwYmMsIDB4MTFlMCwgMHg3Mjk0LCAweGQyOGMsIDB4MDE4MCwgMHgwODBjLCAweDZhZGQsIDB4OTA4MiwKKwkweDAwMDYsIDB4MDJlMCwgMHhkNDg0LCAweDExMTgsIDB4MDgwYywgMHg2NjU3LCAweDAwMjgsIDB4MDgwYywKKwkweDMzMWUsIDB4MDFhMCwgMHgwODBjLCAweDMzNDksIDB4MDA4OCwgMHgwODBjLCAweDMyOGIsIDB4MDgwYywKKwkweGQwOWIsIDB4MTE2MCwgMHgwODBjLCAweDMxNmIsIDB4MDE4OCwgMHgwMDQwLCAweDA4MGMsIDB4ZDA5YiwKKwkweDExMTgsIDB4MDgwYywgMHgzMzFlLCAweDAxMTAsIDB4MDQ1MSwgMHgwMTQwLCAweDAwMWUsIDB4ODEwOCwKKwkweDAxNWUsIDB4MWYwNCwgMHgzMGM3LCAweDcwYWYsIDB4ZmZmZiwgMHgwMDE4LCAweDAwMWUsIDB4MDE1ZSwKKwkweDcxYWUsIDB4MDA0ZSwgMHgwMDJlLCAweDAwY2UsIDB4MDBiZSwgMHgwMDA1LCAweDAwYzYsIDB4MDAxNiwKKwkweDcwYWYsIDB4MDAwMSwgMHgyMDA5LCAweDAwN2UsIDB4MDgwYywgMHg2NjMyLCAweDExNjgsIDB4YjgxMywKKwkweDAwZmYsIDB4YjgxNywgMHhmZmZlLCAweDA4MGMsIDB4MzI4YiwgMHgwNGE5LCAweDAxMjgsIDB4NzBkYywKKwkweGMwYmQsIDB4NzBkZSwgMHgwODBjLCAweGNkZTgsIDB4MDAxZSwgMHgwMGNlLCAweDAwMDUsIDB4MDAxNiwKKwkweDAwNzYsIDB4MDBkNiwgMHgwMGM2LCAweDIwMDEsIDB4MTg0YywgMHgyMDA0LCAweDkwODQsIDB4MDBmZiwKKwkweGI4NDIsIDB4MDgwYywgMHhhZDIwLCAweDAxZDAsIDB4MmIwMCwgMHg2MDEyLCAweDA4MGMsIDB4Y2UxNSwKKwkweDYwMjMsIDB4MDAwMSwgMHg5MDA2LCAweDA4MGMsIDB4NjVjZiwgMHgyMDAxLCAweDAwMDAsIDB4MDgwYywKKwkweDY1ZTMsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzBhOCwgMHg4MDAwLCAweDcwYWEsIDB4MDEyZSwKKwkweDIwMDksIDB4MDAwNCwgMHgwODBjLCAweGFkNGQsIDB4OTA4NSwgMHgwMDAxLCAweDAwY2UsIDB4MDBkZSwKKwkweDAwN2UsIDB4MDAxZSwgMHgwMDA1LCAweDAwMTYsIDB4MDA3NiwgMHgwMGQ2LCAweDAwYzYsIDB4MjAwMSwKKwkweDE4NGMsIDB4MjAwNCwgMHg5MDg0LCAweDAwZmYsIDB4Yjg0MiwgMHgwODBjLCAweGFkMjAsIDB4MDU0OCwKKwkweDJiMDAsIDB4NjAxMiwgMHhiODAwLCAweGMwYzQsIDB4YjgwMiwgMHhiOGEwLCAweDkwODYsIDB4MDA3ZSwKKwkweDAxNDAsIDB4YjgwNCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDA2LCAweDExMTAsIDB4MDgwYywKKwkweDMyNDAsIDB4MDgwYywgMHhjZTE1LCAweDYwMjMsIDB4MDAwMSwgMHg5MDA2LCAweDA4MGMsIDB4NjVjZiwKKwkweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDY1ZTMsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzBhOCwKKwkweDgwMDAsIDB4NzBhYSwgMHgwMTJlLCAweDIwMDksIDB4MDAwMiwgMHgwODBjLCAweGFkNGQsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDBjZSwgMHgwMGRlLCAweDAwN2UsIDB4MDAxZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBjNiwKKwkweDAwMjYsIDB4MjAwOSwgMHgwMDgwLCAweDA4MGMsIDB4NjYzMiwgMHgxMTQwLCAweGI4MTMsIDB4MDBmZiwKKwkweGI4MTcsIDB4ZmZmYywgMHgwMDM5LCAweDAxMTAsIDB4NzBlMywgMHhmZmZmLCAweDAwMmUsIDB4MDBjZSwKKwkweDAwYmUsIDB4MDAwNSwgMHgwMDE2LCAweDAwNzYsIDB4MDBkNiwgMHgwMGM2LCAweDA4MGMsIDB4YWM1YSwKKwkweDAxZDAsIDB4MmIwMCwgMHg2MDEyLCAweDA4MGMsIDB4Y2UxNSwgMHg2MDIzLCAweDAwMDEsIDB4OTAwNiwKKwkweDA4MGMsIDB4NjVjZiwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg2NWUzLCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4NzBlNCwgMHg4MDAwLCAweDcwZTYsIDB4MDEyZSwgMHgyMDA5LCAweDAwMDIsIDB4MDgwYywKKwkweGFkNGQsIDB4OTA4NSwgMHgwMDAxLCAweDAwY2UsIDB4MDBkZSwgMHgwMDdlLCAweDAwMWUsIDB4MDAwNSwKKwkweDAwYzYsIDB4MDBkNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDA5LCAweDAwN2YsIDB4MDgwYywKKwkweDY2MzIsIDB4MTFiOCwgMHhiODEzLCAweDAwZmYsIDB4YjgxNywgMHhmZmZkLCAweGI4ZDcsIDB4MDAwNCwKKwkweDA4MGMsIDB4YWM1YSwgMHgwMTcwLCAweDJiMDAsIDB4NjAxMiwgMHg2MzE2LCAweDYwMjMsIDB4MDAwMSwKKwkweDYyMGEsIDB4MDgwYywgMHhjZTE1LCAweDIwMDksIDB4MDAyMiwgMHgwODBjLCAweGFkNGQsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDEyZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGU2LCAweDAwYzYsIDB4MDA2NiwKKwkweDAwMzYsIDB4MDAyNiwgMHgwMGI2LCAweDIxZjAsIDB4MDgwYywgMHhhOTFlLCAweDAxMDYsIDB4MDgwYywKKwkweDk0NDgsIDB4MDgwYywgMHg5M2I5LCAweDA4MGMsIDB4YTg2ZiwgMHgwODBjLCAweGJiZjksIDB4MDEwZSwKKwkweDA5MGMsIDB4YTkzYSwgMHgzZTA4LCAweDIxMzAsIDB4ODFmZiwgMHgwMTIwLCAweDIwYTksIDB4MDA3ZSwKKwkweDkwMGUsIDB4MDAxOCwgMHgyMGE5LCAweDAwN2YsIDB4OTAwZSwgMHgwMDE2LCAweDA4MGMsIDB4NjY5MywKKwkweDExNDAsIDB4OTY4NiwgMHgwMDAyLCAweDExMTgsIDB4YjgwMCwgMHhkMGJjLCAweDExMTAsIDB4MDgwYywKKwkweDYwYWMsIDB4MDAxZSwgMHg4MTA4LCAweDFmMDQsIDB4MzIyNSwgMHg5Njg2LCAweDAwMDEsIDB4MTkwYywKKwkweDMzN2MsIDB4MDBiZSwgMHgwMDJlLCAweDAwM2UsIDB4MDA2ZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwKKwkweDAwZTYsIDB4MDBjNiwgMHgwMDQ2LCAweDAwMzYsIDB4MDAyNiwgMHgwMDE2LCAweDAwYjYsIDB4MDgwYywKKwkweGE5MWUsIDB4MDEwNiwgMHg2MjEwLCAweDIyNTgsIDB4YmFhMCwgMHgwMDI2LCAweDIwMTksIDB4MDAyOSwKKwkweDA4MGMsIDB4OTQzZCwgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweDkzMDYsIDB4MmMwOCwKKwkweDA4MGMsIDB4ZTE2NywgMHgwMDdlLCAweDAwMWUsIDB4MDEwZSwgMHgwOTBjLCAweGE5M2EsIDB4YmExMCwKKwkweGJiMTQsIDB4YmM4NCwgMHgwODBjLCAweDYwYWMsIDB4YmExMiwgMHhiYjE2LCAweGJjODYsIDB4MDBiZSwKKwkweDAwMWUsIDB4MDAyZSwgMHgwMDNlLCAweDAwNGUsIDB4MDBjZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwKKwkweDAwMDYsIDB4MDBiNiwgMHg2MDEwLCAweDIwNTgsIDB4YjhhMCwgMHgwMGJlLCAweDkwODYsIDB4MDA4MCwKKwkweDAxNTAsIDB4MjA3MSwgMHgxODAwLCAweDcwYTgsIDB4OTAwNSwgMHgwMTEwLCAweDgwMDEsIDB4NzBhYSwKKwkweDAwMGUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwgMHg3MGU0LCAweDkwMDUsIDB4MGRjMCwKKwkweDgwMDEsIDB4NzBlNiwgMHgwY2E4LCAweGI4MDAsIDB4YzA4YywgMHhiODAyLCAweDAwMDUsIDB4MDBmNiwKKwkweDAwZTYsIDB4MDBjNiwgMHgwMGI2LCAweDAwNDYsIDB4MDAzNiwgMHgwMDI2LCAweDAwMTYsIDB4MDE1NiwKKwkweDIxNzgsIDB4MDgwYywgMHhhOTFlLCAweDAxMDYsIDB4ODFmZiwgMHgxMTE4LCAweDIwYTksIDB4MDAwMSwKKwkweDAwNzgsIDB4MDgwYywgMHg1NzNlLCAweGQwYzQsIDB4MDE0MCwgMHhkMGE0LCAweDAxMzAsIDB4OTAwNiwKKwkweDIwMjAsIDB4MjAwOSwgMHgwMDJkLCAweDA4MGMsIDB4ZTQ0NSwgMHgyMGE5LCAweDA4MDAsIDB4OTAxNiwKKwkweDAwMjYsIDB4OTI4ZSwgMHgwMDdlLCAweDA5MDQsIDB4MzJmYSwgMHg5MjhlLCAweDAwN2YsIDB4MDkwNCwKKwkweDMyZmEsIDB4OTI4ZSwgMHgwMDgwLCAweDA1ZjAsIDB4OTI4OCwgMHgxMDAwLCAweDIxMGMsIDB4ODFmZiwKKwkweDA1YzgsIDB4OGZmZiwgMHgxMTUwLCAweDIwMDEsIDB4MTk4ZCwgMHgwMDA2LCAweDIwMDMsIDB4MDAwMSwKKwkweDA4MGMsIDB4MzMwYiwgMHgwMDBlLCAweDIwMDMsIDB4MDAwMCwgMHgwMGI2LCAweDAwYzYsIDB4MjE1OCwKKwkweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDZhYTcsIDB4MDBjZSwgMHgwMGJlLCAweDIwMTksIDB4MDAyOSwKKwkweDA4MGMsIDB4OTQzZCwgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweDkzMDYsIDB4MDBiNiwKKwkweDAwYzYsIDB4MDAyNiwgMHgyMTU4LCAweGJhMDQsIDB4OTI5NCwgMHgwMGZmLCAweDkyODYsIDB4MDAwNiwKKwkweDExMTgsIDB4YjgwNywgMHgwNDA0LCAweDAwMjgsIDB4MjAwMSwgMHgwMDA0LCAweDgwMDcsIDB4OTIxNSwKKwkweGJhMDYsIDB4MDAyZSwgMHgwMGNlLCAweDAwYmUsIDB4MDAxNiwgMHgyYzA4LCAweDA4MGMsIDB4ZTE2NywKKwkweDAwMWUsIDB4MDA3ZSwgMHgwMDJlLCAweDgyMTAsIDB4MWYwNCwgMHgzMmIwLCAweDAxMGUsIDB4MDkwYywKKwkweGE5M2EsIDB4MDE1ZSwgMHgwMDFlLCAweDAwMmUsIDB4MDAzZSwgMHgwMDRlLCAweDAwYmUsIDB4MDBjZSwKKwkweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDAwNDYsIDB4MDAyNiwgMHgwMDE2LCAweDA4MGMsIDB4NTczZSwKKwkweGQwYzQsIDB4MDE0MCwgMHhkMGE0LCAweDAxMzAsIDB4OTAwNiwgMHgyMjIwLCAweDIwMDksIDB4MDAyOSwKKwkweDA4MGMsIDB4ZTQ0NSwgMHgwMDFlLCAweDAwMmUsIDB4MDA0ZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwKKwkweDAwMzYsIDB4MDBjNiwgMHg3Mjk0LCAweDgyZmYsIDB4MDFlOCwgMHgwODBjLCAweDZhZDUsIDB4MTFkMCwKKwkweDIxMDAsIDB4MDgwYywgMHgyNjk0LCAweDgxZmYsIDB4MDFiOCwgMHgyMDE5LCAweDAwMDEsIDB4ODMxNCwKKwkweDkyZTAsIDB4MWQ4MCwgMHgyYzA0LCAweGQzODQsIDB4MDEyMCwgMHg5MDg0LCAweGZmMDAsIDB4ODAwNywKKwkweDAwMTAsIDB4OTA4NCwgMHgwMGZmLCAweDkxMTYsIDB4MDEzOCwgMHg5MDk2LCAweDAwZmYsIDB4MDExMCwKKwkweDgzMTgsIDB4MGM2OCwgMHg5MDg1LCAweDAwMDEsIDB4MDBjZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMDUsIDB4MDAxNiwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4YTkxZSwKKwkweDAxMDYsIDB4MDAzNiwgMHgyMDE5LCAweDAwMjksIDB4MDBjMSwgMHgwMDNlLCAweDAxMGUsIDB4MDkwYywKKwkweGE5M2EsIDB4OTE4MCwgMHgxMDAwLCAweDIwMDQsIDB4OTA2NSwgMHgwMTU4LCAweDAwMTYsIDB4MDBjNiwKKwkweDIwNjEsIDB4MWIzNCwgMHgwMDFlLCAweDYxMTIsIDB4MDgwYywgMHgzMjQwLCAweDAwMWUsIDB4MDgwYywKKwkweDY2NTcsIDB4MDEyZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsIDB4MjExMCwKKwkweDA4MGMsIDB4YTQwNCwgMHgwODBjLCAweGU3YWMsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MjAwMSwKKwkweDE4MzcsIDB4MjAwNCwgMHhkMGNjLCAweDAwMDUsIDB4MDBjNiwgMHgwMGI2LCAweDA4MGMsIDB4NzUzZCwKKwkweDExMTgsIDB4MjBhOSwgMHgwODAwLCAweDAwMTAsIDB4MjBhOSwgMHgwNzgyLCAweDA4MGMsIDB4NzUzZCwKKwkweDExMTAsIDB4OTAwZSwgMHgwMDEwLCAweDIwMDksIDB4MDA3ZSwgMHg5MTgwLCAweDEwMDAsIDB4MjAwNCwKKwkweDkwNWQsIDB4MDEzMCwgMHg4NmZmLCAweDAxMTAsIDB4YjgwMCwgMHhkMGJjLCAweDA5MGMsIDB4NjY1NywKKwkweDgxMDgsIDB4MWYwNCwgMHgzMzhkLCAweDIwNjEsIDB4MTgwMCwgMHg2MDdmLCAweDAwMDAsIDB4NjA4MCwKKwkweDkwODQsIDB4MDBmZiwgMHg2MDgyLCAweDYwYjMsIDB4MDAwMCwgMHgwMGJlLCAweDAwY2UsIDB4MDAwNSwKKwkweDIwMDEsIDB4MTg2OSwgMHgyMDA0LCAweGQwYmMsIDB4MDAwNSwgMHgyMDExLCAweDE4NDgsIDB4MjIxNCwKKwkweGQyZWMsIDB4MDAwNSwgMHgwMDI2LCAweDIwMTEsIDB4MTg2NywgMHgyMjE0LCAweGQyZGMsIDB4MDAyZSwKKwkweDAwMDUsIDB4N2VlZiwgMHg3ZGU4LCAweDdjZTQsIDB4ODBlMiwgMHg3YmUxLCAweDgwZTAsIDB4ODBkYywKKwkweDgwZGEsIDB4N2FkOSwgMHg4MGQ2LCAweDgwZDUsIDB4ODBkNCwgMHg4MGQzLCAweDgwZDIsIDB4ODBkMSwKKwkweDc5Y2UsIDB4NzhjZCwgMHg4MGNjLCAweDgwY2IsIDB4ODBjYSwgMHg4MGM5LCAweDgwYzcsIDB4ODBjNiwKKwkweDc3YzUsIDB4NzZjMywgMHg4MGJjLCAweDgwYmEsIDB4NzViOSwgMHg4MGI2LCAweDc0YjUsIDB4NzNiNCwKKwkweDcyYjMsIDB4ODBiMiwgMHg4MGIxLCAweDgwYWUsIDB4NzFhZCwgMHg4MGFjLCAweDcwYWIsIDB4NmZhYSwKKwkweDZlYTksIDB4ODBhNywgMHg2ZGE2LCAweDZjYTUsIDB4NmJhMywgMHg2YTlmLCAweDY5OWUsIDB4Njg5ZCwKKwkweDgwOWIsIDB4ODA5OCwgMHg2Nzk3LCAweDY2OTAsIDB4NjU4ZiwgMHg2NDg4LCAweDYzODQsIDB4NjI4MiwKKwkweDgwODEsIDB4ODA4MCwgMHg2MTdjLCAweDYwN2EsIDB4ODA3OSwgMHg1Zjc2LCAweDgwNzUsIDB4ODA3NCwKKwkweDgwNzMsIDB4ODA3MiwgMHg4MDcxLCAweDgwNmUsIDB4NWU2ZCwgMHg4MDZjLCAweDVkNmIsIDB4NWM2YSwKKwkweDViNjksIDB4ODA2NywgMHg1YTY2LCAweDU5NjUsIDB4NTg2MywgMHg1NzVjLCAweDU2NWEsIDB4NTU1OSwKKwkweDgwNTYsIDB4ODA1NSwgMHg1NDU0LCAweDUzNTMsIDB4NTI1MiwgMHg1MTUxLCAweDUwNGUsIDB4NGY0ZCwKKwkweDgwNGMsIDB4ODA0YiwgMHg0ZTRhLCAweDRkNDksIDB4ODA0NywgMHg0YzQ2LCAweDgwNDUsIDB4ODA0MywKKwkweDgwM2MsIDB4ODAzYSwgMHg4MDM5LCAweDgwMzYsIDB4NGIzNSwgMHg4MDM0LCAweDRhMzMsIDB4NDkzMiwKKwkweDQ4MzEsIDB4ODAyZSwgMHg0NzJkLCAweDQ2MmMsIDB4NDUyYiwgMHg0NDJhLCAweDQzMjksIDB4NDIyNywKKwkweDgwMjYsIDB4ODAyNSwgMHg0MTIzLCAweDQwMWYsIDB4M2YxZSwgMHgzZTFkLCAweDNkMWIsIDB4M2MxOCwKKwkweDgwMTcsIDB4ODAxMCwgMHgzYjBmLCAweDNhMDgsIDB4ODAwNCwgMHgzOTAyLCAweDgwMDEsIDB4ODAwMCwKKwkweDgwMDAsIDB4MzgwMCwgMHgzNzAwLCAweDM2MDAsIDB4ODAwMCwgMHgzNTAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4MzQwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDMzMDAsIDB4MzIwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDMxMDAsIDB4MzAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MmYwMCwgMHg4MDAwLCAweDJlMDAsIDB4MmQwMCwKKwkweDJjMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MmIwMCwgMHg4MDAwLCAweDJhMDAsIDB4MjkwMCwKKwkweDI4MDAsIDB4ODAwMCwgMHgyNzAwLCAweDI2MDAsIDB4MjUwMCwgMHgyNDAwLCAweDIzMDAsIDB4MjIwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHgyMTAwLCAweDIwMDAsIDB4MWYwMCwgMHgxZTAwLCAweDFkMDAsIDB4MWMwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHgxYjAwLCAweDFhMDAsIDB4ODAwMCwgMHgxOTAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MTgwMCwgMHg4MDAwLCAweDE3MDAsIDB4MTYwMCwKKwkweDE1MDAsIDB4ODAwMCwgMHgxNDAwLCAweDEzMDAsIDB4MTIwMCwgMHgxMTAwLCAweDEwMDAsIDB4MGYwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHgwZTAwLCAweDBkMDAsIDB4MGMwMCwgMHgwYjAwLCAweDBhMDAsIDB4MDkwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHgwODAwLCAweDA3MDAsIDB4ODAwMCwgMHgwNjAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4MDUwMCwgMHgwNDAwLCAweDAzMDAsIDB4ODAwMCwgMHgwMjAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4MDEwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDAwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4MjA3MSwgMHgxODllLCAweDcwMDMsIDB4MDAwMiwgMHg5MDA2LCAweDcwMTYsIDB4NzAxYSwKKwkweDcwNGEsIDB4NzA0ZSwgMHg3MDBlLCAweDcwNDIsIDB4NzA0NiwgMHg3MDNiLCAweDE4YmEsIDB4NzAzZiwKKwkweDE4YmEsIDB4NzAwNywgMHgwMDAxLCAweDA4MGMsIDB4MTA2MCwgMHgwOTBjLCAweDBkN2QsIDB4MjkwMCwKKwkweDcwNmEsIDB4YTg2NywgMHgwMDAyLCAweGE4YWIsIDB4ZGNiMCwgMHgwODBjLCAweDEwNjAsIDB4MDkwYywKKwkweDBkN2QsIDB4MjkwMCwgMHg3MDZlLCAweGE4NjcsIDB4MDAwMiwgMHhhOGFiLCAweGRjYjAsIDB4MDAwNSwKKwkweDIwNzEsIDB4MTg5ZSwgMHg3MDA0LCAweDAwMDIsIDB4MzRlOCwgMHgzNGU5LCAweDM0ZmMsIDB4MzUxMCwKKwkweDAwMDUsIDB4MTAwNCwgMHgzNGY5LCAweDBlMDQsIDB4MzRmOSwgMHgyMDc5LCAweDAwMDAsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHg3MDBjLCAweDkwMDUsIDB4MTEyOCwgMHg3MDBmLCAweDAwMDEsIDB4MDEyZSwKKwkweDA0NjgsIDB4MDAwNSwgMHgwMTJlLCAweDBjZTgsIDB4MjA3OSwgMHgwMDAwLCAweDIwNjEsIDB4MThiOCwKKwkweDJjNGMsIDB4YTg2YywgMHg5MDhlLCAweDAxMDAsIDB4MDEyOCwgMHg5MDg2LCAweDAyMDAsIDB4MDkwNCwKKwkweDM1ZTQsIDB4MDAwNSwgMHg3MDE4LCAweDIwNDgsIDB4MjA2MSwgMHgxODAwLCAweDcwMWMsIDB4MDgwNywKKwkweDcwMTQsIDB4MjA0OCwgMHhhODY0LCAweDkwOTQsIDB4MDBmZiwgMHg5Mjk2LCAweDAwMjksIDB4MTEyMCwKKwkweGFhNzgsIDB4ZDJmYywgMHgwMTI4LCAweDAwMDUsIDB4OTA4NiwgMHgwMTAzLCAweDAxMDgsIDB4MDAwNSwKKwkweDIwNzksIDB4MDAwMCwgMHgyMDYxLCAweDE4MDAsIDB4NzAxYywgMHgwODA3LCAweDIwNjEsIDB4MTgwMCwKKwkweDc4ODAsIDB4OTA4YSwgMHgwMDQwLCAweDEyMTAsIDB4NjFkMCwgMHgwMDQyLCAweDIxMDAsIDB4OTA4YSwKKwkweDAwM2YsIDB4MWEwNCwgMHgzNWUxLCAweDYxZDAsIDB4MDgwNCwgMHgzNTc2LCAweDM1YjgsIDB4MzVmMCwKKwkweDM1ZTEsIDB4MzVmYSwgMHgzNjA0LCAweDM2MGEsIDB4MzYwZSwgMHgzNjFlLCAweDM2MjIsIDB4MzYzOCwKKwkweDM2M2UsIDB4MzY0NCwgMHgzNjRmLCAweDM2NWEsIDB4MzY2OSwgMHgzNjc4LCAweDM2ODYsIDB4MzY5ZCwKKwkweDM2YjgsIDB4MzVlMSwgMHgzNzYxLCAweDM3OWYsIDB4Mzg0NCwgMHgzODU1LCAweDM4NzgsIDB4MzVlMSwKKwkweDM1ZTEsIDB4MzVlMSwgMHgzOGIwLCAweDM4ZDAsIDB4MzhkOSwgMHgzOTA1LCAweDM5MGIsIDB4MzVlMSwKKwkweDM5NTEsIDB4MzVlMSwgMHgzNWUxLCAweDM1ZTEsIDB4MzVlMSwgMHgzNWUxLCAweDM5NWMsIDB4Mzk2NSwKKwkweDM5NmQsIDB4Mzk2ZiwgMHgzNWUxLCAweDM1ZTEsIDB4MzVlMSwgMHgzNWUxLCAweDM1ZTEsIDB4MzVlMSwKKwkweDM5OWYsIDB4MzVlMSwgMHgzNWUxLCAweDM1ZTEsIDB4MzVlMSwgMHgzNWUxLCAweDM5YmMsIDB4M2EyNiwKKwkweDM1ZTEsIDB4MzVlMSwgMHgzNWUxLCAweDM1ZTEsIDB4MzVlMSwgMHgzNWUxLCAweDAwMDIsIDB4M2E1MCwKKwkweDNhNTMsIDB4M2FiMiwgMHgzYWNiLCAweDNhZmIsIDB4M2Q5ZCwgMHgzNWUxLCAweDUyZjQsIDB4MzVlMSwKKwkweDM1ZTEsIDB4MzVlMSwgMHgzNWUxLCAweDM1ZTEsIDB4MzVlMSwgMHgzNWUxLCAweDM1ZTEsIDB4MzYzOCwKKwkweDM2M2UsIDB4NDI4YywgMHg1NzYyLCAweDQyYWEsIDB4NTM4MywgMHg1M2Q0LCAweDU0ZGYsIDB4MzVlMSwKKwkweDU1NDEsIDB4NTU3ZCwgMHg1NWFlLCAweDU2YmUsIDB4NTVkYiwgMHg1NjNlLCAweDM1ZTEsIDB4NDJhZSwKKwkweDQ0NjMsIDB4NDQ3OSwgMHg0NDllLCAweDQ1MDMsIDB4NDU3NywgMHg0NTk3LCAweDQ2MGUsIDB4NDY2YSwKKwkweDQ2YzYsIDB4NDZjOSwgMHg0NmVlLCAweDQ3NjAsIDB4NDdjYSwgMHg0N2QyLCAweDQ5MDQsIDB4NGE3YywKKwkweDRhYjAsIDB4NGQxNCwgMHgzNWUxLCAweDRkMzIsIDB4NGRkOCwgMHg0ZWJhLCAweDRmMTQsIDB4MzVlMSwKKwkweDRmY2IsIDB4MzVlMSwgMHg1MDMzLCAweDUwNGUsIDB4NDdkMiwgMHg1Mjk0LCAweDcxNGMsIDB4MDAwMCwKKwkweDIwMjEsIDB4NDAwMCwgMHgwODBjLCAweDRiMmUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MGUwNCwKKwkweDM1YzIsIDB4MDAxMCwgMHgwMTJlLCAweDBjYzAsIDB4N2MzNiwgMHg5NDg2LCAweDQwMDAsIDB4MDExOCwKKwkweDc4MzMsIDB4MDAxMSwgMHgwMDEwLCAweDc4MzMsIDB4MDAxMCwgMHg3YzgyLCAweDc5ODYsIDB4N2E4YSwKKwkweDdiOGUsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywKKwkweDExZWUsIDB4NzAwNywgMHgwMDAxLCAweDIwOTEsIDB4NTAwMCwgMHg3MDBmLCAweDAwMDAsIDB4MDEyZSwKKwkweDAwMDUsIDB4MjAyMSwgMHg0MDAxLCAweDA4YjAsIDB4MjAyMSwgMHg0MDAyLCAweDA4OTgsIDB4MjAyMSwKKwkweDQwMDMsIDB4MDg4MCwgMHgyMDIxLCAweDQwMDUsIDB4MDg2OCwgMHgyMDIxLCAweDQwMDYsIDB4MDg1MCwKKwkweDIwMzksIDB4MDAwMSwgMHg5MDJlLCAweDI1MjAsIDB4N2I4OCwgMHg3YThjLCAweDc4ODQsIDB4Nzk5MCwKKwkweDA4MDQsIDB4NGIzYiwgMHgyMDM5LCAweDAwMDEsIDB4OTAyZSwgMHgyNTIwLCAweDdiODgsIDB4N2E4YywKKwkweDc4ODQsIDB4Nzk5MCwgMHgwODA0LCAweDRiM2UsIDB4Nzk4NCwgMHg3ODg4LCAweDIxMTQsIDB4MjAwYSwKKwkweDA4MDQsIDB4MzViOCwgMHg3OTg0LCAweDIxMTQsIDB4MDgwNCwgMHgzNWI4LCAweDIwZTEsIDB4MDAwMCwKKwkweDIwOTksIDB4MDAyMSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMDIxLCAweDIwYTksIDB4MDAxZiwKKwkweDQwMDMsIDB4Nzk4NCwgMHg3YTg4LCAweDdiOGMsIDB4MDgwNCwgMHgzNWI4LCAweDc4ODQsIDB4MjA2MCwKKwkweDA4MDQsIDB4MzY2YiwgMHgyMDA5LCAweDAwMDMsIDB4MjAxMSwgMHgwMDAzLCAweDIwMTksIDB4MDAwOCwKKwkweDc4OWIsIDB4MDEzNywgMHg3ODkzLCAweGZmZmYsIDB4MjAwMSwgMHgxODhmLCAweDIwMDQsIDB4OTAwNSwKKwkweDAxMTgsIDB4Nzg5NiwgMHgwODA0LCAweDM1YjgsIDB4Nzg5NywgMHgwMDAxLCAweDA4MDQsIDB4MzViOCwKKwkweDIwMzksIDB4MDAwMSwgMHg3ZDk4LCAweDdjOWMsIDB4MDgwNCwgMHgzNWY0LCAweDIwMzksIDB4MDAwMSwKKwkweDdkOTgsIDB4N2M5YywgMHgwODA0LCAweDM1ZmUsIDB4NzlhMCwgMHg5MTgyLCAweDAwNDAsIDB4MDIxMCwKKwkweDA4MDQsIDB4MzVlZCwgMHgyMTM4LCAweDdkOTgsIDB4N2M5YywgMHgwODA0LCAweDM1ZjQsIDB4NzlhMCwKKwkweDkxODIsIDB4MDA0MCwgMHgwMjEwLCAweDA4MDQsIDB4MzVlZCwgMHgyMTM4LCAweDdkOTgsIDB4N2M5YywKKwkweDA4MDQsIDB4MzVmZSwgMHg3OWEwLCAweDkxODIsIDB4MDA0MCwgMHgwMjEwLCAweDA4MDQsIDB4MzVlZCwKKwkweDIxZTgsIDB4Nzk4NCwgMHg3ODg4LCAweDIwYTksIDB4MDAwMSwgMHgyMWEwLCAweDQwMDQsIDB4MDgwNCwKKwkweDM1YjgsIDB4MjA2MSwgMHgwODAwLCAweGUxMGMsIDB4OTAwNiwgMHgyYzE1LCAweDkyMDAsIDB4OGM2MCwKKwkweDgxMDksIDB4MWRkOCwgMHgyMDEwLCAweDkwMDUsIDB4MDkwNCwgMHgzNWI4LCAweDA4MDQsIDB4MzVlNywKKwkweDc5YTAsIDB4OTE4MiwgMHgwMDQwLCAweDAyMTAsIDB4MDgwNCwgMHgzNWVkLCAweDIxZTAsIDB4MjBhOSwKKwkweDAwMDEsIDB4Nzk4NCwgMHgyMTk4LCAweDQwMTIsIDB4MDgwNCwgMHgzNWI4LCAweDIwNjksIDB4MTg0NywKKwkweDc4ODQsIDB4Nzk5MCwgMHg5MTFhLCAweDFhMDQsIDB4MzVlZCwgMHg4MDE5LCAweDA5MDQsIDB4MzVlZCwKKwkweDY4NGEsIDB4Njk0MiwgMHg3ODhjLCAweDY4NTIsIDB4Nzg4OCwgMHg2ODU2LCAweDkwMDYsIDB4Njg1YSwKKwkweDY4NWUsIDB4MDgwYywgMHg3ODcxLCAweDA4MDQsIDB4MzViOCwgMHgyMDY5LCAweDE4NDcsIDB4Nzg4NCwKKwkweDc5OTQsIDB4OTExYSwgMHgxYTA0LCAweDM1ZWQsIDB4ODAxOSwgMHgwOTA0LCAweDM1ZWQsIDB4Njg0ZSwKKwkweDY5NDYsIDB4Nzg4YywgMHg2ODYyLCAweDc4ODgsIDB4Njg2NiwgMHg5MDA2LCAweDY4NmEsIDB4Njg2ZSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NmI0MywgMHgwMTJlLCAweDA4MDQsIDB4MzViOCwKKwkweDkwMmUsIDB4MjUyMCwgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MDQsIDB4MzVlYSwKKwkweDc5ODQsIDB4N2I4OCwgMHg3YThjLCAweDIwYTksIDB4MDAwNSwgMHgyMGU5LCAweDAwMDEsIDB4MjBhMSwKKwkweDE4YTYsIDB4NDEwMSwgMHgwODBjLCAweDRhZjIsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwKKwkweDM1ZWEsIDB4MjAwOSwgMHgwMDIwLCAweGE4NWMsIDB4OTA4MCwgMHgwMDE5LCAweGFmNjAsIDB4MDgwYywKKwkweDRiM2IsIDB4NzAxZiwgMHgzNmRjLCAweDAwMDUsIDB4YTg2NCwgMHgyMDA4LCAweDkwODQsIDB4MDBmZiwKKwkweDkwOTYsIDB4MDAxMSwgMHgwMTY4LCAweDkwOTYsIDB4MDAxOSwgMHgwMTUwLCAweDkwOTYsIDB4MDAxNSwKKwkweDAxMzgsIDB4OTA5NiwgMHgwMDQ4LCAweDAxMjAsIDB4OTA5NiwgMHgwMDI5LCAweDE5MDQsIDB4MzVlYSwKKwkweDgxMGYsIDB4OTE4YywgMHgwMGZmLCAweDA5MDQsIDB4MzVlYSwgMHg3MTEyLCAweDcwMTAsIDB4ODAwMSwKKwkweDA1NjAsIDB4NzAxMiwgMHgwODBjLCAweDRhZjIsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwKKwkweDM1ZWEsIDB4MjAwOSwgMHgwMDIwLCAweDcwNjgsIDB4MjA0MCwgMHhhMjhjLCAweGEzOTAsIDB4YTQ5NCwKKwkweGE1OTgsIDB4OTI5MCwgMHgwMDQwLCAweDkzOTksIDB4MDAwMCwgMHg5NGExLCAweDAwMDAsIDB4OTVhOSwKKwkweDAwMDAsIDB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4YWY2MCwgMHgwODBjLCAweDRiM2IsIDB4NzAxZiwKKwkweDM3MWEsIDB4MDAwNSwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwgMHg5MDk2LCAweDAwMDIsIDB4MDEyMCwKKwkweDkwOTYsIDB4MDAwYSwgMHgxOTA0LCAweDM1ZWEsIDB4MDg4OCwgMHg3MDE0LCAweDIwNDgsIDB4YTg2OCwKKwkweGMwZmQsIDB4YTg2YSwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwgMHg5MDk2LCAweDAwMjksIDB4MTE2MCwKKwkweGMyZmQsIDB4YWE3YSwgMHgwODBjLCAweDYxZmYsIDB4MDE1MCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweGE4N2EsIDB4YTk4MiwgMHgwMTJlLCAweDAwNTAsIDB4MDgwYywgMHg2NTJmLCAweDExMjgsIDB4NzAwNywKKwkweDAwMDMsIDB4NzAxZiwgMHgzNzQ2LCAweDAwMDUsIDB4MDgwYywgMHg3MDIyLCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjBhOSwgMHgwMDA1LCAweDIwZTEsIDB4MDAwMSwgMHgyMDk5LCAweDE4YTYsIDB4NDAwYSwKKwkweDIxMDAsIDB4OTIxMCwgMHg5Mzk5LCAweDAwMDAsIDB4OTRhMSwgMHgwMDAwLCAweDk1YTksIDB4MDAwMCwKKwkweGE4NWMsIDB4OTA4MCwgMHgwMDE5LCAweDIwMDksIDB4MDAyMCwgMHgwMTJlLCAweGFmNjAsIDB4MDgwNCwKKwkweDRiM2UsIDB4MjA5MSwgMHg4MDAwLCAweDc4MzcsIDB4NDAwMCwgMHg3ODMzLCAweDAwMTAsIDB4Nzg4MywKKwkweDQwMDAsIDB4Nzg4NywgMHg0OTUzLCAweDc4OGIsIDB4NTAyMCwgMHg3ODhmLCAweDIwMjAsIDB4MjAwOSwKKwkweDAxN2YsIDB4MjEwNCwgMHg3ODkyLCAweDNmMDAsIDB4Nzg5NiwgMHgyMDYxLCAweDAxMDAsIDB4NjIwMCwKKwkweDIwNjEsIDB4MDIwMCwgMHg2MDNjLCAweDgwMDcsIDB4OTIwNSwgMHg3ODlhLCAweDIwMDksIDB4MDRmZCwKKwkweDIxMDQsIDB4Nzg5ZSwgMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwKKwkweDIwMDQsIDB4ZDA4NCwgMHgwMTgwLCAweDIwMDEsIDB4MWEyMSwgMHgyMDA0LCAweDkwMDUsIDB4MDEyOCwKKwkweDIwMDEsIDB4MDA4YiwgMHgyMDA0LCAweGQwZmMsIDB4MGRkOCwgMHgyMDAxLCAweDAwOGEsIDB4MjAwMywKKwkweDAwMDIsIDB4MjAwMywgMHgxMDAxLCAweDIwNzEsIDB4MDA4MCwgMHgwODA0LCAweDA0MjcsIDB4ODFmZiwKKwkweDE5MDQsIDB4MzVlYSwgMHg3OTg0LCAweDA4MGMsIDB4NjY5MywgMHgxOTA0LCAweDM1ZWQsIDB4N2U5OCwKKwkweDk2ODQsIDB4M2ZmZiwgMHg5MDgyLCAweDQwMDAsIDB4MWEwNCwgMHgzNWVkLCAweDdjODgsIDB4N2Q4YywKKwkweDA4MGMsIDB4NjhjOSwgMHgwODBjLCAweDY4NTYsIDB4MTUxOCwgMHgyMDYxLCAweDFkZGMsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHg2MDAwLCAweDkwODYsIDB4MDAwMCwgMHgwMTQ4LCAweDYwMTQsIDB4OTA0ZCwKKwkweDAxMzAsIDB4YTg2YywgMHg5NDA2LCAweDExMTgsIDB4YTg3MCwgMHg5NTA2LCAweDAxNTAsIDB4MDEyZSwKKwkweDljZTAsIDB4MDAxYywgMHgyMDAxLCAweDE4MWEsIDB4MjAwNCwgMHg5YzAyLCAweDFhMDQsIDB4MzVlYSwKKwkweDBjMzAsIDB4MDgwYywgMHhjNTY2LCAweDAxMmUsIDB4MDkwNCwgMHgzNWVhLCAweDA4MDQsIDB4MzViOCwKKwkweDkwMGUsIDB4MjAwMSwgMHgwMDA1LCAweDA4MGMsIDB4NzAyMiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4Y2M4NSwgMHgwODBjLCAweDZkZWUsIDB4MDEyZSwgMHgwODA0LCAweDM1YjgsIDB4MDBhNiwKKwkweDI5NTAsIDB4YjE5OCwgMHgwODBjLCAweDY2OTMsIDB4MTkwNCwgMHgzODMxLCAweGI2YTQsIDB4OTY4NCwKKwkweDNmZmYsIDB4OTA4MiwgMHg0MDAwLCAweDE2ZTgsIDB4YjQ5YywgMHhiNWEwLCAweDA4MGMsIDB4NjhjOSwKKwkweDA4MGMsIDB4Njg3MywgMHgxNTIwLCAweDIwNjEsIDB4MWRkYywgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDAxNDgsIDB4NjAxNCwgMHg5MDRkLCAweDAxMzAsIDB4YTg2YywKKwkweDk0MDYsIDB4MTExOCwgMHhhODcwLCAweDk1MDYsIDB4MDE1OCwgMHgwMTJlLCAweDljZTAsIDB4MDAxYywKKwkweDIwMDEsIDB4MTgxYSwgMHgyMDA0LCAweDljMDIsIDB4MjAwOSwgMHgwMDBkLCAweDEyYjAsIDB4MGMyOCwKKwkweDA4MGMsIDB4YzU2NiwgMHgwMTJlLCAweDIwMDksIDB4MDAwMywgMHgwMTc4LCAweDAwZTAsIDB4OTAwZSwKKwkweDIwMDEsIDB4MDAwNSwgMHgwODBjLCAweDcwMjIsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweGNjODUsIDB4MDgwYywgMHg2ZGUyLCAweDAxMmUsIDB4MDA3MCwgMHhiMDk3LCAweDQwMDUsIDB4YjE5YSwKKwkweDAwMTAsIDB4YjA5NywgMHg0MDA2LCAweDkwMGUsIDB4OTA4NSwgMHgwMDAxLCAweDIwMDEsIDB4MDAzMCwKKwkweDJhNDgsIDB4MDBhZSwgMHgwMDA1LCAweGIwOTcsIDB4NDAwMCwgMHg5MDA2LCAweDkxOGQsIDB4MDAwMSwKKwkweDIwMDgsIDB4MmE0OCwgMHgwMGFlLCAweDAwMDUsIDB4ODFmZiwgMHgxOTA0LCAweDM1ZWEsIDB4MDgwYywKKwkweDRiMDksIDB4MDkwNCwgMHgzNWVkLCAweDA4MGMsIDB4Njc1YSwgMHgwOTA0LCAweDM1ZWEsIDB4MDgwYywKKwkweDY4Y2YsIDB4MDkwNCwgMHgzNWVhLCAweDA4MDQsIDB4NDU4ZSwgMHg4MWZmLCAweDE5MDQsIDB4MzVlYSwKKwkweDA4MGMsIDB4NGIyNSwgMHgwOTA0LCAweDM1ZWQsIDB4MDgwYywgMHg2OTVkLCAweDA5MDQsIDB4MzVlYSwKKwkweDIwMTksIDB4MDAwNSwgMHg3OWE4LCAweDA4MGMsIDB4NjhlYSwgMHgwOTA0LCAweDM1ZWEsIDB4Nzg4OCwKKwkweDkwOGEsIDB4MTAwMCwgMHgxYTA0LCAweDM1ZWQsIDB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4OTEwOCwKKwkweDA4MGMsIDB4ODZkNiwgMHg3OTg0LCAweGQxODQsIDB4MTkwNCwgMHgzNWI4LCAweDA4MDQsIDB4NDU4ZSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDgxZmYsIDB4MDExOCwgMHgyMDA5LCAweDAwMDEsIDB4MDQ1MCwKKwkweDIwMjksIDB4MDdmZiwgMHg2NDVjLCAweDI0MDAsIDB4OTUwNiwgMHgwMWY4LCAweDI1MDgsIDB4MDgwYywKKwkweDY2OTMsIDB4MTFkOCwgMHgwODBjLCAweDY5NWQsIDB4MTEyOCwgMHgyMDA5LCAweDAwMDIsIDB4NjJjMCwKKwkweDI1MTgsIDB4MDBjMCwgMHgyMDE5LCAweDAwMDQsIDB4OTAwZSwgMHgwODBjLCAweDY4ZWEsIDB4MTExOCwKKwkweDIwMDksIDB4MDAwNiwgMHgwMDc4LCAweDc4ODQsIDB4OTA4YSwgMHgxMDAwLCAweDEyNzAsIDB4ODAwMywKKwkweDgwMGIsIDB4ODEwYiwgMHg5MTA4LCAweDA4MGMsIDB4ODZkNiwgMHg4NTI5LCAweDFhZTAsIDB4MDEyZSwKKwkweDA4MDQsIDB4MzViOCwgMHgwMTJlLCAweDA4MDQsIDB4MzVlYSwgMHgwMTJlLCAweDA4MDQsIDB4MzVlZCwKKwkweDA4MGMsIDB4NGIwOSwgMHgwOTA0LCAweDM1ZWQsIDB4MDgwYywgMHg2NzVhLCAweDA5MDQsIDB4MzVlYSwKKwkweDA4MGMsIDB4YTkxZSwgMHhiYWEwLCAweDIwMTksIDB4MDAwNSwgMHgwMGM2LCAweDkwNjYsIDB4MDgwYywKKwkweDk0M2QsIDB4MDA3NiwgMHg5MDNlLCAweDA4MGMsIDB4OTMwNiwgMHg5MDBlLCAweDA4MGMsIDB4ZTE2NywKKwkweDAwN2UsIDB4MDBjZSwgMHgwODBjLCAweGE5M2EsIDB4MDgwYywgMHg2OGM5LCAweDA4MDQsIDB4MzViOCwKKwkweDA4MGMsIDB4NGIwOSwgMHgwOTA0LCAweDM1ZWQsIDB4MDgwYywgMHg2OGM5LCAweDIyMDgsIDB4MDgwNCwKKwkweDM1YjgsIDB4MDE1NiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBjNiwgMHgyMDY5LCAweDE5MTAsIDB4NjgxMCwKKwkweDY5MTQsIDB4OTEwYSwgMHgxMjA4LCAweDkwMGUsIDB4NjgxNiwgMHg5MDE2LCAweDkwMWUsIDB4MjA3MSwKKwkweDE5ZTYsIDB4NzAyOCwgMHg5MDY1LCAweDAxMTgsIDB4ODIxMCwgMHg2MDBjLCAweDBjZDgsIDB4MjMwMCwKKwkweDkyMTgsIDB4MDBjZSwgMHgwMGVlLCAweDAwZGUsIDB4MDE1ZSwgMHgwODA0LCAweDM1YjgsIDB4MDBmNiwKKwkweDAwMTYsIDB4OTA3ZCwgMHgwMTM4LCAweDkwMDYsIDB4ODAwMCwgMHgyZjBjLCAweDgxZmYsIDB4MDExMCwKKwkweDIxNzgsIDB4MGNkMCwgMHgwMDFlLCAweDAwZmUsIDB4MDAwNSwgMHgyMDY5LCAweDE5MTAsIDB4NjkxMCwKKwkweDYyYmMsIDB4MDgwNCwgMHgzNWI4LCAweDgxZmYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwNCwKKwkweDM1ZWEsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg1NzUyLCAweDAxMjgsIDB4MjAwOSwKKwkweDAwMDcsIDB4MDEyZSwgMHgwODA0LCAweDM1ZWEsIDB4MDEyZSwgMHg2MTVjLCAweDkxOTAsIDB4MzNiOSwKKwkweDIyMTUsIDB4OTI5NCwgMHgwMGZmLCAweDYzN2MsIDB4ODNmZiwgMHgwMTA4LCAweDYyODAsIDB4NjdkYywKKwkweDk3YzQsIDB4MDAwYSwgMHg5OGM2LCAweDAwMGEsIDB4MTExOCwgMHgyMDMxLCAweDAwMDEsIDB4MDBlOCwKKwkweDk3YzQsIDB4MDAyMiwgMHg5OGM2LCAweDAwMjIsIDB4MTExOCwgMHgyMDMxLCAweDAwMDMsIDB4MDBhOCwKKwkweDk3YzQsIDB4MDAxMiwgMHg5OGM2LCAweDAwMTIsIDB4MTExOCwgMHgyMDMxLCAweDAwMDIsIDB4MDA2OCwKKwkweDA4MGMsIDB4NzUzZCwgMHgxMTE4LCAweDIwMzEsIDB4MDAwNCwgMHgwMDM4LCAweGQ3OWMsIDB4MDEyMCwKKwkweDIwMDksIDB4MDAwNSwgMHgwODA0LCAweDM1ZWEsIDB4OTAzNiwgMHg3ZTlhLCAweDdmOWUsIDB4MDgwNCwKKwkweDM1YjgsIDB4NjE0YywgMHg2MjUwLCAweDIwMTksIDB4MTk4NSwgMHgyMzFjLCAweDIwMDEsIDB4MTk4NiwKKwkweDIwMDQsIDB4Nzg5YSwgMHgwODA0LCAweDM1YjgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjEzOCwKKwkweDYyM2MsIDB4NjM0MCwgMHgwMTJlLCAweDA4MDQsIDB4MzViOCwgMHgwODBjLCAweDRiMjUsIDB4MDkwNCwKKwkweDM1ZWQsIDB4YmE0NCwgMHhiYjM4LCAweDA4MDQsIDB4MzViOCwgMHgwODBjLCAweDBkN2QsIDB4MDgwYywKKwkweDRiMjUsIDB4MjExMCwgMHgwOTA0LCAweDM1ZWQsIDB4YjgwNCwgMHg5MDhjLCAweDAwZmYsIDB4OTE4ZSwKKwkweDAwMDYsIDB4MDE0MCwgMHg5MDg0LCAweGZmMDAsIDB4OTA4NiwgMHgwNjAwLCAweDIwMDksIDB4MDAwOSwKKwkweDE5MDQsIDB4MzVlYSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDE5LCAweDAwMDUsIDB4MDBjNiwKKwkweDkwNjYsIDB4MDgwYywgMHhhOTFlLCAweDA4MGMsIDB4YTQwNCwgMHgwODBjLCAweDk0M2QsIDB4MDA3NiwKKwkweDkwM2UsIDB4MDgwYywgMHg5MzA2LCAweDkwMGUsIDB4MDgwYywgMHhlMTY3LCAweDAwN2UsIDB4MDBjZSwKKwkweDA4MGMsIDB4YTkzYSwgMHhiODA3LCAweDA0MDcsIDB4MDEyZSwgMHgwODA0LCAweDM1YjgsIDB4NjE0YywKKwkweDYyNTAsIDB4Nzg4NCwgMHg2MDRlLCAweDdiODgsIDB4NjM1MiwgMHgyMDY5LCAweDE4NDcsIDB4ODMxZiwKKwkweDkzMDUsIDB4NjgxNiwgMHg3ODhjLCAweDIwNjksIDB4MTk4NSwgMHgyZDFjLCAweDIwNmEsIDB4N2U5OCwKKwkweDk2ODIsIDB4MDAxNCwgMHgxMjEwLCAweDIwMzEsIDB4MDdkMCwgMHgyMDY5LCAweDE5ODYsIDB4MmQwNCwKKwkweDI2NmEsIDB4Nzg5YSwgMHgwODA0LCAweDM1YjgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjEzOCwKKwkweDc4ODQsIDB4NjAzYSwgMHg5MTBlLCAweGQxYjQsIDB4MTkwYywgMHgwZWQ5LCAweGQwYzQsIDB4MDFhOCwKKwkweDAwZDYsIDB4NzhhOCwgMHgyMDA5LCAweDE5OWMsIDB4MjAwYSwgMHg3OGFjLCAweDIwMTEsIDB4MTk5ZCwKKwkweDIwMTIsIDB4MjA2OSwgMHgwMTAwLCAweDY4MzgsIDB4OTA4NiwgMHgwMDA3LCAweDExMTgsIDB4MjIxNCwKKwkweDZhNWEsIDB4MDAxMCwgMHgyMTBjLCAweDY5NWEsIDB4MDBkZSwgMHgyMDExLCAweDAxMTYsIDB4MjIwYywKKwkweDc4ODgsIDB4ZDA4YywgMHgwMTE4LCAweDkxOGQsIDB4MDA0MCwgMHgwMDEwLCAweDkxOGMsIDB4ZmY3ZiwKKwkweDIxMTIsIDB4NjAzYywgMHg3OTg4LCAweDYxM2UsIDB4NjE0MCwgMHg5MTBkLCAweDc4OGMsIDB4NjA0MiwKKwkweDdhODgsIDB4OTI5NCwgMHgxMDAwLCAweDkyMDUsIDB4OTEwZSwgMHhkMWU0LCAweDE5MGMsIDB4MGVmNCwKKwkweDkwODQsIDB4MDAyMCwgMHgwMTMwLCAweDc4YjQsIDB4NjA0NiwgMHg5MDg0LCAweDAwMDEsIDB4MDkwYywKKwkweDQyOGMsIDB4NjA0MCwgMHhkMGNjLCAweDAxMjAsIDB4NzhiMCwgMHgyMDExLCAweDAxMTQsIDB4MjAxMiwKKwkweDAxMmUsIDB4MDgwNCwgMHgzNWI4LCAweDAwZjYsIDB4MjA3OSwgMHgxODAwLCAweDdhMzgsIDB4YTg5OCwKKwkweDkwODQsIDB4ZmViZiwgMHg5MjE1LCAweGE4OWMsIDB4OTA4NCwgMHhmZWJmLCAweDgwMDIsIDB4OTIxNCwKKwkweDc4MzgsIDB4OTA4NCwgMHgwMTQwLCAweDkyMTUsIDB4N2EzYSwgMHhhODk3LCAweDQwMDAsIDB4OTAwZSwKKwkweDkwODUsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDAsIDB4MDBmZSwgMHgwMDA1LCAweDc4OTgsIDB4OTAwNSwKKwkweDAxYTgsIDB4Nzg4OCwgMHg5MDI1LCAweDA5MDQsIDB4MzVlZCwgMHg3ODhjLCAweDkwMmQsIDB4MDkwNCwKKwkweDM1ZWQsIDB4OTAwZSwgMHgwODBjLCAweDY2OTMsIDB4MTEyMCwgMHhiYTQ0LCAweGJiMzgsIDB4YmM0NiwKKwkweGJkM2EsIDB4OTE4NiwgMHgwN2ZmLCAweDAxOTAsIDB4ODEwOCwgMHgwY2EwLCAweDA4MGMsIDB4NGIyNSwKKwkweDA5MDQsIDB4MzVlZCwgMHg3ODg4LCAweDkwMGQsIDB4MDkwNCwgMHgzNWVkLCAweDc4OGMsIDB4OTAwNSwKKwkweDA5MDQsIDB4MzVlZCwgMHhiYTQ0LCAweGI5NDYsIDB4YmIzOCwgMHhiODNhLCAweDA4MDQsIDB4MzViOCwKKwkweDIwMTEsIDB4YmMwOSwgMHgwMDEwLCAweDIwMTEsIDB4YmMwNSwgMHgwODBjLCAweDU3NTIsIDB4MTkwNCwKKwkweDM1ZWEsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4Nzk4NCwgMHg5MTg2LCAweDAwZmYsIDB4MTEzMCwKKwkweDIwMDEsIDB4MTgxOCwgMHgyMDA0LCAweDkwODUsIDB4ZmYwMCwgMHgwMDg4LCAweDkxODIsIDB4MDA3ZiwKKwkweDE2ZTAsIDB4OTE4OCwgMHgzM2I5LCAweDIxMGQsIDB4OTE4YywgMHgwMGZmLCAweDIwMDEsIDB4MTgxOCwKKwkweDIwMDQsIDB4MDAyNiwgMHg5MTE2LCAweDAwMmUsIDB4MDU4MCwgMHg4MTBmLCAweDkxMDUsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwMDA2LCAweDA4MGMsIDB4YWM1YSwgMHgwMDBlLCAweDA1MTAsIDB4NjAyZSwKKwkweDYyMGEsIDB4Nzk4NCwgMHgwMGI2LCAweDA4MGMsIDB4NjYzOCwgMHgyYjA4LCAweDAwYmUsIDB4MTUwMCwKKwkweDYxMTIsIDB4NjAyMywgMHgwMDAxLCAweDA4MGMsIDB4NGFmMiwgMHgwMWQwLCAweDkwMDYsIDB4YTg2NiwKKwkweDcwMDcsIDB4MDAwMywgMHhhODMyLCAweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweDcwMWYsIDB4M2FhYiwKKwkweDI5MDAsIDB4NjAxNiwgMHgyMDA5LCAweDAwMzIsIDB4MDgwYywgMHhhZDRkLCAweDAxMmUsIDB4MDBjZSwKKwkweDAwMDUsIDB4MDEyZSwgMHgwMGNlLCAweDA4MDQsIDB4MzVlYSwgMHgwMGNlLCAweDA4MDQsIDB4MzVlZCwKKwkweDA4MGMsIDB4YWNiMCwgMHgwY2IwLCAweGE4MzAsIDB4OTA4NiwgMHgwMTAwLCAweDA5MDQsIDB4MzVlYSwKKwkweDA4MDQsIDB4MzViOCwgMHgyMDYxLCAweDFhNmUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjAwMCwKKwkweGQwODQsIDB4MDE3MCwgMHg2MTA0LCAweDYyMDgsIDB4MjA2MSwgMHgxODAwLCAweDYzNTQsIDB4NjA3NCwKKwkweDc4OWEsIDB4NjBjMCwgMHg3ODllLCAweDYwYmMsIDB4NzhhYSwgMHgwMTJlLCAweDA4MDQsIDB4MzViOCwKKwkweDkwMGUsIDB4MjExMCwgMHgwYzg4LCAweDgxZmYsIDB4MTkwNCwgMHgzNWVhLCAweDA4MGMsIDB4NzUzZCwKKwkweDA5MDQsIDB4MzVlYSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MjU0LCAweDYwNzQsIDB4OTIwMiwKKwkweDAyNDgsIDB4OTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4MjZjYSwgMHgwODBjLCAweDU5NzEsIDB4MDEyZSwKKwkweDA4MDQsIDB4MzViOCwgMHgwMTJlLCAweDA4MDQsIDB4MzVlZCwgMHgwMDA2LCAweDAwMTYsIDB4MDBjNiwKKwkweDAwZTYsIDB4MjAwMSwgMHgxOWE4LCAweDIwNzAsIDB4MjA2MSwgMHgxODQ3LCAweDYwMDgsIDB4MjA3MiwKKwkweDkwMGUsIDB4MjAxMSwgMHgxNDAwLCAweDA4MGMsIDB4OTFmOCwgMHg3MjA2LCAweDAwZWUsIDB4MDBjZSwKKwkweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDgxZmYsIDB4MDEyOCwKKwkweDAxMmUsIDB4MjAyMSwgMHg0MDBiLCAweDA4MDQsIDB4MzViYSwgMHg3ODg0LCAweGQwZmMsIDB4MDE0OCwKKwkweDIwMDEsIDB4MDAyYSwgMHgyMDA0LCAweDkwODIsIDB4MDBlMSwgMHgwMjg4LCAweDAxMmUsIDB4MDgwNCwKKwkweDM1ZWQsIDB4MjAwMSwgMHgwMDJhLCAweDIwMDQsIDB4MjA2OSwgMHgxODQ3LCAweDY5MDgsIDB4OTEwMiwKKwkweDEyMzAsIDB4MDEyZSwgMHgwODA0LCAweDM1ZWQsIDB4MDEyZSwgMHgwODA0LCAweDM1ZWEsIDB4MDgwYywKKwkweGFiZTIsIDB4MGRkMCwgMHg3ODg0LCAweGQwZmMsIDB4MDkwNCwgMHgzYjc2LCAweDAwYzYsIDB4MDgwYywKKwkweDRhZjIsIDB4MDBjZSwgMHgwZDg4LCAweGE4NjcsIDB4MDAwMCwgMHg3ODg0LCAweGE4MGEsIDB4Nzg5OCwKKwkweGE4MGUsIDB4Nzg5YywgMHhhODEyLCAweDIwMDEsIDB4MDAyZSwgMHgyMDA0LCAweGE4MWEsIDB4MjAwMSwKKwkweDAwMmYsIDB4MjAwNCwgMHhhODFlLCAweDIwMDEsIDB4MDAzMCwgMHgyMDA0LCAweGE4MjIsIDB4MjAwMSwKKwkweDAwMzEsIDB4MjAwNCwgMHhhODI2LCAweDIwMDEsIDB4MDAzNCwgMHgyMDA0LCAweGE4MmEsIDB4MjAwMSwKKwkweDAwMzUsIDB4MjAwNCwgMHhhODJlLCAweDIwMDEsIDB4MDAyYSwgMHgyMDA0LCAweDkwODAsIDB4MDAwMywKKwkweDkwODQsIDB4MDBmYywgMHg4MDA0LCAweGE4MTYsIDB4MDgwYywgMHgzZDAwLCAweDA5MjgsIDB4NzAxNCwKKwkweDIwNDgsIDB4YWQyYywgMHhhYzI4LCAweGFiMWMsIDB4YWExOCwgMHhhOTMwLCAweGE4MDgsIDB4ZDBiNCwKKwkweDExMjAsIDB4MjAyOSwgMHgwMDAwLCAweDIwMjEsIDB4MDAwMCwgMHg4OTA2LCAweDgwMDYsIDB4ODAwNywKKwkweDkwYmMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDFiLCAweDA4MGMsIDB4NGIzYiwKKwkweDcwMWYsIDB4M2MzZCwgMHg3MDIzLCAweDAwMDEsIDB4MDEyZSwgMHgwMDA1LCAweDA4MGMsIDB4YTkxZSwKKwkweDAwNDYsIDB4MDA4NiwgMHgwMDk2LCAweDAwYTYsIDB4MDBiNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwKKwkweDAwZjYsIDB4MDgwYywgMHgzYWU1LCAweDIwMDEsIDB4MTk5ZSwgMHgyMDAzLCAweDAwMDAsIDB4MjAyMSwKKwkweDAwMGEsIDB4MjA2MSwgMHgwMTAwLCAweDYxMDQsIDB4MDAxNiwgMHg2MGJiLCAweDAwMDAsIDB4NjBiZiwKKwkweDMyZTEsIDB4NjBiZiwgMHgwMDEyLCAweDA4MGMsIDB4M2Q2ZiwgMHgwODBjLCAweDNkMmUsIDB4MDBmNiwKKwkweDAwZTYsIDB4MDA4NiwgMHgyOTQwLCAweDIwNzEsIDB4MTllNiwgMHgyMDc5LCAweDAwOTAsIDB4MDBkNiwKKwkweDIwNjksIDB4MDAwMCwgMHg2ODg0LCAweGQwYjQsIDB4MDE0MCwgMHgyMDAxLCAweDAwMzUsIDB4MjAwNCwKKwkweDc4MGUsIDB4MjAwMSwgMHgwMDM0LCAweDIwMDQsIDB4NzgwYSwgMHgwMGRlLCAweDIwMTEsIDB4MDAwMSwKKwkweDA4MGMsIDB4NDBkMCwgMHgwMDhlLCAweDAwZWUsIDB4MDBmZSwgMHgwODBjLCAweDNmZmQsIDB4MDgwYywKKwkweDNmMmEsIDB4MDViOCwgMHgyMDAxLCAweDAyMGIsIDB4MjAwNCwgMHg5MDg0LCAweDAxNDAsIDB4MWRiOCwKKwkweDA4MGMsIDB4NDE0NCwgMHgwMGY2LCAweDIwNzksIDB4MDMwMCwgMHg3OGJjLCAweDAwZmUsIDB4OTA4YywKKwkweDAwNzAsIDB4MTU2MCwgMHgyMDcxLCAweDAyMDAsIDB4NzAzNywgMHgwMDAwLCAweDcwNTAsIDB4OTA4NCwKKwkweGZmMDAsIDB4OTA4NiwgMHgzMjAwLCAweDE1MTAsIDB4NzAzNywgMHgwMDAxLCAweDcwNTAsIDB4OTA4NCwKKwkweGZmMDAsIDB4OTA4NiwgMHhlMTAwLCAweDExZDAsIDB4NzAzNywgMHgwMDAwLCAweDcwNTQsIDB4NzAzNywKKwkweDAwMDAsIDB4NzE1YywgMHg5MTA2LCAweDExOTAsIDB4MjAwMSwgMHgxODIwLCAweDIwMDQsIDB4OTEwNiwKKwkweDExNjgsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4NjAyNCwgMHg5MDg0LCAweDFlMDAsIDB4MDBjZSwKKwkweDAxMzgsIDB4MDgwYywgMHgzZjM0LCAweDA4MGMsIDB4M2QyOSwgMHgwMDU4LCAweDA4MGMsIDB4M2QyOSwKKwkweDA4MGMsIDB4NDA2OCwgMHgwODBjLCAweDNmZjMsIDB4MjAwMSwgMHgwMjBiLCAweDIwMDQsIDB4ZDBlNCwKKwkweDBkZDgsIDB4MjAwMSwgMHgwMzJhLCAweDIwMDMsIDB4MDAwNCwgMHgyMDYxLCAweDAxMDAsIDB4NjAyNywKKwkweDAwMDIsIDB4MDAxZSwgMHg2MTA2LCAweDIwMTEsIDB4MDIwZCwgMHgyMDEzLCAweDAwMjAsIDB4NjBiYiwKKwkweDAwMDAsIDB4NjBiZiwgMHgwMTA4LCAweDYwYmYsIDB4MDAxMiwgMHgyMDAxLCAweDAwMDQsIDB4MjAwYywKKwkweDkxOGMsIDB4ZmZmZCwgMHgyMTAyLCAweDA4MGMsIDB4MTM0MCwgMHgyMDA5LCAweDAwMjgsIDB4MDgwYywKKwkweDIyMGEsIDB4MjAwMSwgMHgwMjI3LCAweDIwMGMsIDB4MjEwMiwgMHgwODBjLCAweGE5M2EsIDB4MDBmZSwKKwkweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwYmUsIDB4MDBhZSwgMHgwMDllLCAweDAwOGUsIDB4MDA0ZSwKKwkweDIwMDEsIDB4MTk5ZSwgMHgyMDA0LCAweDkwMDUsIDB4MTExOCwgMHgwMTJlLCAweDA4MDQsIDB4MzViOCwKKwkweDAxMmUsIDB4MjAyMSwgMHg0MDBjLCAweDA4MDQsIDB4MzViYSwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwKKwkweDAwNDYsIDB4MDA1NiwgMHgwMDc2LCAweDAwODYsIDB4MDA5NiwgMHgwMGQ2LCAweDAxNTYsIDB4NzAxNCwKKwkweDIwNDgsIDB4NzAyMCwgMHgyMGE4LCAweDgwMDAsIDB4NzAyMiwgMHhhODA0LCAweDkwMDUsIDB4MDkwNCwKKwkweDNjOTksIDB4MjA0OCwgMHgxZjA0LCAweDNjNGQsIDB4NzA2OCwgMHgyMDQwLCAweGEyOGMsIDB4YTM5MCwKKwkweGE0OTQsIDB4YTU5OCwgMHhhOTMwLCAweGE4MDgsIDB4ZDBiNCwgMHgxMTIwLCAweDIwMjksIDB4MDAwMCwKKwkweDIwMjEsIDB4MDAwMCwgMHgwMDk2LCAweDcwMTQsIDB4MjA0OCwgMHhhODY0LCAweDAwOWUsIDB4OTA4NiwKKwkweDAxMDMsIDB4MDE3MCwgMHg4OTA2LCAweDgwMDYsIDB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwKKwkweGZmYzAsIDB4OTA4MCwgMHgwMDFiLCAweDA4MGMsIDB4NGIzYiwgMHg3MDFmLCAweDNjM2QsIDB4MDBiMCwKKwkweDg5MDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwKKwkweDAwMWIsIDB4MjFhOCwgMHgyN2UwLCAweDIwOTgsIDB4MjdlOCwgMHgyMGEwLCAweDAwMDYsIDB4MDgwYywKKwkweDBmYzQsIDB4MDAwZSwgMHgwODBjLCAweDRiM2UsIDB4NzAxZiwgMHgzYzNkLCAweDAxNWUsIDB4MDBkZSwKKwkweDAwOWUsIDB4MDA4ZSwgMHgwMDdlLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMDUsIDB4NzAxNCwgMHgyMDQ4LCAweGE4NjQsIDB4OTA4NiwgMHgwMTAzLCAweDExMTgsIDB4NzAxZiwKKwkweDNjZmUsIDB4MDQ1MCwgMHg3MDE0LCAweDIwNDgsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4MjAwOSwKKwkweDAwN2YsIDB4MDgwYywgMHg2NjMyLCAweDAxMTAsIDB4OTAwNiwgMHgwMDMwLCAweGI4MTMsIDB4MDBmZiwKKwkweGI4MTcsIDB4ZmZmZCwgMHgwODBjLCAweGNlNjQsIDB4MDE1ZSwgMHgwMGRlLCAweDAwOWUsIDB4MDA4ZSwKKwkweDAwN2UsIDB4MDA1ZSwgMHgwMDRlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDA5MDQsIDB4MzVlYSwKKwkweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwNDYsIDB4MDA1NiwgMHgwMDc2LCAweDAwODYsIDB4MDA5NiwKKwkweDAwZDYsIDB4MDE1NiwgMHg3MDFmLCAweDNjZDAsIDB4NzAwNywgMHgwMDAzLCAweDA4MDQsIDB4M2M4ZSwKKwkweGE4MzAsIDB4OTA4NiwgMHgwMTAwLCAweDIwMjEsIDB4NDAwYywgMHgwOTA0LCAweDM1YmEsIDB4MDA3NiwKKwkweGFkMTAsIDB4YWMwYywgMHhhYjI0LCAweGFhMjAsIDB4YTkzMCwgMHhhODA4LCAweGQwYjQsIDB4MTEyMCwKKwkweDIwMjksIDB4MDAwMCwgMHgyMDIxLCAweDAwMDAsIDB4ODkwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTBiYywKKwkweDAwM2YsIDB4OTA4NCwgMHhmZmMwLCAweDkwODAsIDB4MDAxYiwgMHgyMWE4LCAweDI3ZTAsIDB4MjA5OCwKKwkweDI3ZTgsIDB4MjBhMCwgMHgwMDA2LCAweDA4MGMsIDB4MGZjNCwgMHgwMDBlLCAweDA4MGMsIDB4NGIzZSwKKwkweDAwN2UsIDB4NzAxZiwgMHgzYzNkLCAweDcwMjMsIDB4MDAwMSwgMHgwMDA1LCAweDA4MDQsIDB4MzViOCwKKwkweDAxNTYsIDB4MDBjNiwgMHhhODE0LCAweDkwOGEsIDB4MDAxZSwgMHgwMjE4LCAweGE4MzMsIDB4MDAxZSwKKwkweDAwMTAsIDB4YTgzMiwgMHgwMDc4LCAweDgxZmYsIDB4MDE2OCwgMHgwMDE2LCAweDA4MGMsIDB4NGFmMiwKKwkweDAwMWUsIDB4MDEzMCwgMHhhODAwLCAweDIwNDAsIDB4YTAwOCwgMHhhODBhLCAweDIxMDAsIDB4MGM1OCwKKwkweDkwMDYsIDB4MDAxMCwgMHg5MDg1LCAweDAwMDEsIDB4MDBjZSwgMHgwMTVlLCAweDAwMDUsIDB4MDAwNiwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMDAwLCAweDc4ODAsIDB4OTA4NiwgMHgwMDQ0LCAweDAwZmUsIDB4MDAwZSwKKwkweDAwMDUsIDB4MjAwMSwgMHgxOTllLCAweDIwMDMsIDB4MDAwMSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwKKwkweDAwYzYsIDB4MjA2MSwgMHgwMjAwLCAweDIwMDEsIDB4MTlhOSwgMHgyMDA0LCAweDYwMWEsIDB4MjA2MSwKKwkweDAxMDAsIDB4MjAwMSwgMHgxOWE4LCAweDIwMDQsIDB4NjBjZSwgMHg2MTA0LCAweGMxYWMsIDB4NjEwNiwKKwkweDA4MGMsIDB4NGFmMiwgMHhhODEzLCAweDAwMTksIDB4YTgxNywgMHgwMDAxLCAweDI5MDAsIDB4YTg1YSwKKwkweDIwMDEsIDB4MDAyZSwgMHgyMDA0LCAweGE4NjYsIDB4MjAwMSwgMHgwMDJmLCAweDIwMDQsIDB4YTg2YSwKKwkweDIwNjEsIDB4MDA5MCwgMHgyMDc5LCAweDAxMDAsIDB4MjAwMSwgMHgxOWE4LCAweDIwMDQsIDB4NjAzNiwKKwkweDIwMDksIDB4MDA0MCwgMHgwODBjLCAweDIyMGEsIDB4MjAwMSwgMHgwMDJhLCAweDIwMDQsIDB4OTA4NCwKKwkweGZmZjgsIDB4YTg2ZSwgMHg2MDFhLCAweGE4NzMsIDB4MDAwMCwgMHg2MDFmLCAweDAwMDAsIDB4NzhjYSwKKwkweDkwMDYsIDB4NjAwYSwgMHg2MDBlLCAweDAwY2UsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBlNiwKKwkweDA4MGMsIDB4NGFmMiwgMHgyOTQwLCAweGEwMTMsIDB4MDAxOSwgMHhhMDE3LCAweDAwMDEsIDB4MjgwMCwKKwkweGEwNWEsIDB4MjAwMSwgMHgwMDMwLCAweDIwMDQsIDB4YTg2NiwgMHgyMDAxLCAweDAwMzEsIDB4MjAwNCwKKwkweGE4NmEsIDB4MjAwMSwgMHgwMDJhLCAweDIwMDQsIDB4OTA4NCwgMHhmZmY4LCAweGE4NmUsIDB4YTg3MywKKwkweDAwMDAsIDB4MjAwMSwgMHgwMzJhLCAweDIwMDMsIDB4MDAwNCwgMHgyMDAxLCAweDAzMDAsIDB4MjAwMywKKwkweDAwMDAsIDB4MjAwMSwgMHgwMjBkLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDAwMDQsIDB4MjAwYywKKwkweDkxOGQsIDB4MDAwMiwgMHgyMTAyLCAweDAwZWUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDgxZmYsIDB4MDE0OCwgMHgwODBjLCAweDJhNTgsIDB4MTEzMCwgMHg5MDA2LCAweDA4MGMsIDB4MjlhYiwKKwkweDkwMDYsIDB4MDgwYywgMHgyOThlLCAweDc4ODQsIDB4OTA4NCwgMHgwMDA3LCAweDAwMDIsIDB4M2RiYSwKKwkweDNkYmIsIDB4M2RiYywgMHgzZGI3LCAweDNkYjcsIDB4M2RiNywgMHgzZGI3LCAweDNkYjcsIDB4MDEyZSwKKwkweDA4MDQsIDB4MzVlZCwgMHgwY2UwLCAweDBjZDgsIDB4MDgwYywgMHg3NTNkLCAweDExMjgsIDB4MDEyZSwKKwkweDIwMDksIDB4MDAxNiwgMHgwODA0LCAweDM1ZWEsIDB4ODFmZiwgMHgwMTI4LCAweDAxMmUsIDB4MjAyMSwKKwkweDQwMGIsIDB4MDgwNCwgMHgzNWJhLCAweDA4MGMsIDB4YTkxZSwgMHgwMDg2LCAweDAwOTYsIDB4MDBhNiwKKwkweDAwYjYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgwODBjLCAweDNhZTUsIDB4MjAwOSwKKwkweDAxMDEsIDB4MjEwYywgMHgwMDE2LCAweDdlYzgsIDB4N2RjYywgMHg5MDA2LCAweDIwNjgsIDB4MjA2MCwKKwkweDIwNTgsIDB4MDgwYywgMHg0MjFmLCAweDA4MGMsIDB4NDE2ZiwgMHg5MDNlLCAweDI3MjAsIDB4MDBmNiwKKwkweDAwZTYsIDB4MDA4NiwgMHgyOTQwLCAweDIwNzEsIDB4MTllNiwgMHgyMDc5LCAweDAwOTAsIDB4MDBkNiwKKwkweDIwNjksIDB4MDAwMCwgMHg2ODg0LCAweGQwYjQsIDB4MDEyMCwgMHg2OGQ0LCAweDc4MGUsIDB4NjhkMCwKKwkweDc4MGEsIDB4MDBkZSwgMHgyMDExLCAweDAwMDEsIDB4MDgwYywgMHg0MGQwLCAweDA4MGMsIDB4MmE2MCwKKwkweDA4MGMsIDB4MmE2MCwgMHgwODBjLCAweDJhNjAsIDB4MDgwYywgMHgyYTYwLCAweDA4MGMsIDB4NDBkMCwKKwkweDAwOGUsIDB4MDBlZSwgMHgwMGZlLCAweDA4MGMsIDB4M2ZmZCwgMHgyMDA5LCAweDljNDAsIDB4ODEwOSwKKwkweDExYjAsIDB4MDgwYywgMHgzZjM0LCAweDIwMDEsIDB4MDAwNCwgMHgyMDBjLCAweDkxOGMsIDB4ZmZmZCwKKwkweDIxMDIsIDB4MDAxZSwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwYmUsIDB4MDBhZSwKKwkweDAwOWUsIDB4MDA4ZSwgMHgyMDA5LCAweDAwMTcsIDB4MDgwYywgMHgzNWVhLCAweDBjZjgsIDB4MjAwMSwKKwkweDAyMGIsIDB4MjAwNCwgMHg5MDg0LCAweDAxNDAsIDB4MWQxMCwgMHgwMGY2LCAweDIwNzksIDB4MDAwMCwKKwkweDc4ODQsIDB4MDBmZSwgMHhkMGJjLCAweDAxNzgsIDB4MjAwMSwgMHgwMjAxLCAweDIwMGMsIDB4ODFmZiwKKwkweDAxNTAsIDB4MDgwYywgMHgzZmRiLCAweDJkMDAsIDB4OWMwNSwgMHg5YjA1LCAweDAxMjAsIDB4MDgwYywKKwkweDNmMzQsIDB4MDgwNCwgMHgzZWRkLCAweDA4MGMsIDB4NDE0NCwgMHgwODBjLCAweDQwNjgsIDB4MDgwYywKKwkweDNmYmUsIDB4MDgwYywgMHgzZmYzLCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDc4MjQsIDB4ZDBhYywKKwkweDAxMzAsIDB4OGI1OCwgMHgwODBjLCAweDNmMzQsIDB4MDBmZSwgMHgwODA0LCAweDNlZGQsIDB4MDBmZSwKKwkweDA4MGMsIDB4M2YyYSwgMHgxMTUwLCAweDhkNjgsIDB4MjAwMSwgMHgwMDMyLCAweDI2MDIsIDB4MjAwMSwKKwkweDAwMzMsIDB4MjUwMiwgMHgwODBjLCAweDNmMzQsIDB4MDA4MCwgMHg4N2ZmLCAweDAxMzgsIDB4MjAwMSwKKwkweDAyMDEsIDB4MjAwNCwgMHg5MDA1LCAweDE5MDgsIDB4ODczOSwgMHgwMDM4LCAweDIwMDEsIDB4MWE2YSwKKwkweDIwMDQsIDB4OTA4NiwgMHgwMDAwLCAweDE5MDQsIDB4M2UyZCwgMHgyMDAxLCAweDAzMmYsIDB4MjAwMywKKwkweDAwZjYsIDB4ODYzMSwgMHgxMjA4LCAweDg1MjksIDB4MjUwMCwgMHg5NjA1LCAweDA5MDQsIDB4M2VkZCwKKwkweDc4ODQsIDB4ZDBiYywgMHgwMTI4LCAweDJkMDAsIDB4OWMwNSwgMHg5YjA1LCAweDE5MDQsIDB4M2VkZCwKKwkweGEwMTMsIDB4MDAxOSwgMHgyMDAxLCAweDAzMmEsIDB4MjAwMywgMHgwMDA0LCAweDc4ODQsIDB4ZDBhYywKKwkweDExNDgsIDB4MjAwMSwgMHgxYTZhLCAweDIwMDMsIDB4MDAwMywgMHgyMDAxLCAweDAzMmEsIDB4MjAwMywKKwkweDAwMDksIDB4MDAzMCwgMHhhMDE3LCAweDAwMDEsIDB4NzhiNCwgMHg5MDA1LCAweDAxMDgsIDB4YTAxNiwKKwkweDI4MDAsIDB4YTA1YSwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywgMHgyMjBhLCAweDI5MDAsIDB4YTg1YSwKKwkweGE4MTMsIDB4MDAxOSwgMHg3ODg0LCAweGQwYTQsIDB4MTE4MCwgMHhhODE3LCAweDAwMDAsIDB4MDBjNiwKKwkweDIwYTksIDB4MDAwNCwgMHgyMDYxLCAweDAwOTAsIDB4NjAyYiwgMHgwMDA4LCAweDIwMDEsIDB4MDIwMywKKwkweDIwMDQsIDB4MWYwNCwgMHgzZWI0LCAweDAwY2UsIDB4MDAzMCwgMHhhODE3LCAweDAwMDEsIDB4NzhiMCwKKwkweDkwMDUsIDB4MDEwOCwgMHhhODE2LCAweDAwZjYsIDB4MDBjNiwgMHgyMDc5LCAweDAxMDAsIDB4MjA2MSwKKwkweDAwOTAsIDB4NzgyNywgMHgwMDAyLCAweDIwMDEsIDB4MDAyYSwgMHgyMDA0LCAweDkwODQsIDB4ZmZmOCwKKwkweDYwMWEsIDB4MDAwNiwgMHgyMDAxLCAweDAwMmIsIDB4MjAwNCwgMHg2MDFlLCAweDc4YzYsIDB4MDAwZSwKKwkweDc4Y2EsIDB4MDBjZSwgMHgwMGZlLCAweDA4MDQsIDB4M2RlNywgMHgwMDFlLCAweDAwYzYsIDB4MjAwMSwKKwkweDAzMmEsIDB4MjAwMywgMHgwMDA0LCAweDIwNjEsIDB4MDEwMCwgMHg2MDI3LCAweDAwMDIsIDB4NjEwNiwKKwkweDIwMTEsIDB4MDIwZCwgMHgyMDEzLCAweDAwMjAsIDB4MjAwMSwgMHgwMDA0LCAweDIwMGMsIDB4OTE4YywKKwkweGZmZmQsIDB4MjEwMiwgMHgwODBjLCAweDEzNDAsIDB4Nzg4NCwgMHg5MDg0LCAweDAwMDMsIDB4OTA4NiwKKwkweDAwMDIsIDB4MDFiMCwgMHgyMDA5LCAweDAwMjgsIDB4MDgwYywgMHgyMjBhLCAweDIwMDEsIDB4MDIyNywKKwkweDIwMGMsIDB4MjEwMiwgMHg2MDUwLCAweDkwODQsIDB4YjdmZiwgMHgwODBjLCAweDJiMGEsIDB4NjA1MiwKKwkweDYwMmYsIDB4MDAwMCwgMHg2MDRiLCAweGY3ZjcsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwKKwkweDA4MGMsIDB4YTkzYSwgMHgwMGNlLCAweDJkMDgsIDB4MmMxMCwgMHgyYjE4LCAweDJiMDAsIDB4OWMwNSwKKwkweDlkMDUsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMGJlLCAweDAwYWUsIDB4MDA5ZSwKKwkweDAwOGUsIDB4MTExOCwgMHgwMTJlLCAweDA4MDQsIDB4MzViOCwgMHgwMTJlLCAweDIwMjEsIDB4NDAwYywKKwkweDA4MDQsIDB4MzViYSwgMHg5MDg1LCAweDAwMDEsIDB4MWQwNCwgMHgzZjMzLCAweDIwOTEsIDB4NjAwMCwKKwkweDg0MjAsIDB4OTQ4NiwgMHgwMDY0LCAweDAwMDUsIDB4MjAwMSwgMHgwMTA1LCAweDIwMDMsIDB4MDAxMCwKKwkweDIwMDEsIDB4MDMyYSwgMHgyMDAzLCAweDAwMDQsIDB4MjAwMSwgMHgxYTZhLCAweDIwMDMsIDB4MDAwMCwKKwkweDAwNzEsIDB4MjAwOSwgMHgwMDQ4LCAweDA4MGMsIDB4MjIwYSwgMHgyMDAxLCAweDAyMjcsIDB4MjAyNCwKKwkweDI0MDIsIDB4MjAwMSwgMHgwMTA5LCAweDIwMDMsIDB4NDAwMCwgMHg5MDI2LCAweDAwMDUsIDB4MDBmNiwKKwkweDAwZTYsIDB4MjA3MSwgMHgxOWU2LCAweDcwNTQsIDB4OTA4NiwgMHgwMDAwLCAweDA1MjAsIDB4MjA3OSwKKwkweDAwOTAsIDB4MjAwOSwgMHgwMjA2LCAweDIxMDQsIDB4MjAwOSwgMHgwMjAzLCAweDIxMGMsIDB4OTEwNiwKKwkweDExMjAsIDB4MjAwOSwgMHgwMDQwLCAweDA4MGMsIDB4MjIwYSwgMHg3ODJjLCAweGQwZmMsIDB4MGQ4OCwKKwkweDA4MGMsIDB4NDE0NCwgMHg3MDU0LCAweDkwODYsIDB4MDAwMCwgMHgxZDU4LCAweDc4MmIsIDB4MDAwNCwKKwkweDc4MmMsIDB4ZDBhYywgMHgxZGU4LCAweDIwMDksIDB4MDA0MCwgMHgwODBjLCAweDIyMGEsIDB4NzgyYiwKKwkweDAwMDIsIDB4NzA1NywgMHgwMDAwLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwKKwkweDAxMDAsIDB4MjAwMSwgMHgxODE4LCAweDIwMGMsIDB4NzkzMiwgMHg3OTM2LCAweDA4MGMsIDB4MjZhYSwKKwkweDA4MGMsIDB4MmFkNywgMHgwODBjLCAweDJiMGEsIDB4Nzg0YiwgMHhmN2Y3LCAweDc4NDMsIDB4MDA5MCwKKwkweDc4NDMsIDB4MDAxMCwgMHg3ODUwLCAweGMwZTUsIDB4Nzg1MiwgMHgyMDE5LCAweDYxYTgsIDB4NzgyMCwKKwkweGQwOWMsIDB4MDExMCwgMHg4MzE5LCAweDFkZDgsIDB4Nzg1MCwgMHhjMGU0LCAweDc4NTIsIDB4MjAxMSwKKwkweDAwNDgsIDB4MDgwYywgMHgyYWI0LCAweDc4NDMsIDB4MDA0MCwgMHgyMDE5LCAweDAxZjQsIDB4YTAwMSwKKwkweGEwMDEsIDB4ODMxOSwgMHgxZGUwLCAweDIwMDEsIDB4MDEwMCwgMHgwODBjLCAweDJhN2EsIDB4MjAxMSwKKwkweDAwMjAsIDB4MDgwYywgMHgyYWI0LCAweDc4NDMsIDB4MDAwMCwgMHg5MDA2LCAweDA4MGMsIDB4MmE3YSwKKwkweDIwMTEsIDB4MDA0OCwgMHgwODBjLCAweDJhYjQsIDB4MDBmZSwgMHgwMDA1LCAweDc4ODQsIDB4ZDBhYywKKwkweDExYzgsIDB4MDBmNiwgMHgwMGU2LCAweDIwNzEsIDB4MWE2YSwgMHgyMDc5LCAweDAzMjAsIDB4MjAwMSwKKwkweDAyMDEsIDB4MjAwNCwgMHg5MDA1LCAweDAxNjAsIDB4NzAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MTE0MCwKKwkweDAwNTEsIDB4ZDBiYywgMHgwMTA4LCAweDg3MzgsIDB4NzAwMywgMHgwMDAzLCAweDc4MmIsIDB4MDAxOSwKKwkweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMzAwLCAweDc4YmMsIDB4MDBmZSwKKwkweDkwOGMsIDB4MDA3MCwgMHgwMTc4LCAweDIwMDksIDB4MDAzMiwgMHgyNjBhLCAweDIwMDksIDB4MDAzMywKKwkweDI1MGEsIDB4ZDBiNCwgMHgwMTA4LCAweDhjNjAsIDB4ZDBhYywgMHgwMTA4LCAweDhkNjgsIDB4ZDBhNCwKKwkweDAxMDgsIDB4OGI1OCwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMjAwLCAweDc4MWMsIDB4ZDA4NCwKKwkweDAxMTAsIDB4NzgzNywgMHgwMDUwLCAweDAwZmUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MDEwMCwKKwkweDIwMDEsIDB4MTlhOSwgMHgyMDA0LCAweDcwZTIsIDB4MDgwYywgMHgzZDFmLCAweDExODgsIDB4MjAwMSwKKwkweDE4MjAsIDB4MjAwNCwgMHgyMDA5LCAweDE4MWYsIDB4MjEwYywgMHg5MThjLCAweDAwZmYsIDB4NzA2ZSwKKwkweDcxNmEsIDB4NzA2NiwgMHg5MThkLCAweDMyMDAsIDB4NzE2MiwgMHg3MDczLCAweGUxMDksIDB4MDA4MCwKKwkweDcwMmMsIDB4OTA4NSwgMHgwMDAyLCAweDcwMmUsIDB4MjAwOSwgMHgxODE4LCAweDIxMGMsIDB4NzE2ZSwKKwkweDcwNjMsIDB4MDEwMCwgMHg3MTY2LCAweDcxOWUsIDB4NzA2YiwgMHgwMDAwLCAweDcwNzMsIDB4MDgwOSwKKwkweDcwNzcsIDB4MDAwOCwgMHg3MDc4LCAweDkwODAsIDB4MDEwMCwgMHg3MDdhLCAweDcwODAsIDB4ODAwMCwKKwkweDcwODIsIDB4NzA4NywgMHhhYWFhLCAweDkwMDYsIDB4NzA4YSwgMHg3MDhlLCAweDcwN2UsIDB4NzBkNiwKKwkweDcwYWIsIDB4MDAzNiwgMHg3MGFmLCAweDk1ZDUsIDB4NzAxNCwgMHg5MDg0LCAweDE5ODQsIDB4OTA4NSwKKwkweDAwOTIsIDB4NzAxNiwgMHgwODBjLCAweDQxNDQsIDB4MDBmNiwgMHgyMDcxLCAweDFhNmEsIDB4MjA3OSwKKwkweDAzMjAsIDB4MDBkNiwgMHgyMDY5LCAweDAwMDAsIDB4Njg4NCwgMHhkMGI0LCAweDAxMjAsIDB4Njg5YywKKwkweDc4MGUsIDB4Njg5OCwgMHg3ODBhLCAweDAwZGUsIDB4MjAwOSwgMHgwM2U4LCAweDgxMDksIDB4MWRmMCwKKwkweDc5MmMsIDB4ZDFmYywgMHgwMTEwLCAweDc4MmIsIDB4MDAwNCwgMHgyMDExLCAweDAwMTEsIDB4MDgwYywKKwkweDQwZDAsIDB4MjAxMSwgMHgwMDAxLCAweDA4MGMsIDB4NDBkMCwgMHgwMGZlLCAweDAwZWUsIDB4MDAwNSwKKwkweDAwZjYsIDB4MDBlNiwgMHgyMDcxLCAweDFhNmEsIDB4MjA3OSwgMHgwMzIwLCAweDc5MmMsIDB4ZDFmYywKKwkweDA5MDQsIDB4NDBjZCwgMHg3ODJiLCAweDAwMDIsIDB4OTAyNiwgMHhkMTljLCAweDE5MDQsIDB4NDBjOSwKKwkweDcwMDAsIDB4MDAwMiwgMHg0MGNkLCAweDQwN2UsIDB4NDBhZSwgMHg0MGM5LCAweGQxYmMsIDB4MTE3MCwKKwkweGQxZGMsIDB4MTE5MCwgMHg4MDAxLCAweDcwMDIsIDB4MjAxMSwgMHgwMDAxLCAweDA4MGMsIDB4NDBkMCwKKwkweDA5MDQsIDB4NDBjZCwgMHgwODBjLCAweDQwZDAsIDB4MDgwNCwgMHg0MGNkLCAweDAwZjYsIDB4MjA3OSwKKwkweDAzMDAsIDB4NzhiZiwgMHgwMDAwLCAweDAwZmUsIDB4NzgxMCwgMHg3OTE0LCAweDc4MmIsIDB4MDAwNCwKKwkweDc4MTIsIDB4NzkxNiwgMHgyMDAxLCAweDAyMDEsIDB4MjAwYywgMHg4MWZmLCAweDBkZTgsIDB4MDgwYywKKwkweDNmZGIsIDB4MjAwOSwgMHgwMDAxLCAweDAwZjYsIDB4MjA3OSwgMHgwMzAwLCAweDc4YjgsIDB4MDBmZSwKKwkweGQwZWMsIDB4MDExMCwgMHgyMDA5LCAweDAwMTEsIDB4NzkyYSwgMHgwMGY4LCAweDgwMDEsIDB4NzAwMiwKKwkweDkxODQsIDB4MDg4MCwgMHgxMTQwLCAweDc4MmMsIDB4ZDBmYywgMHgxOTA0LCAweDQwNzIsIDB4MjAxMSwKKwkweDAwMDEsIDB4MDBiMSwgMHgwMDkwLCAweGEwMTAsIDB4OTA5MiwgMHgwMDA0LCAweDkwODYsIDB4MDAxNSwKKwkweDExMjAsIDB4YTAwMCwgMHhhMDVhLCAweDIwMTEsIDB4MDAzMSwgMHhhMjEyLCAweGQxZGMsIDB4MTk2MCwKKwkweDA4MjgsIDB4NzgyYiwgMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwKKwkweGEwMTQsIDB4OTAwNSwgMHgwNTUwLCAweDgwMDEsIDB4MDAzNiwgMHgwMDk2LCAweGEwMTYsIDB4YTA1OCwKKwkweDIwNDgsIDB4YTAxMCwgMHgyMDA5LCAweDAwMzEsIDB4OTExYSwgMHg4MzFjLCAweDgzMWMsIDB4OTM4YSwKKwkweDAwMDcsIDB4MWEwYywgMHgwZDdkLCAweDkzOTgsIDB4NDBmZSwgMHgyMzFkLCAweDA4M2YsIDB4OTA4MCwKKwkweDAwMDQsIDB4N2EyYSwgMHg3MTAwLCAweDgxMDgsIDB4NzEwMiwgMHgwMDllLCAweDAwM2UsIDB4OTA4YSwKKwkweDAwMzUsIDB4MTE0MCwgMHgwMDk2LCAweGEwNTgsIDB4MjA0OCwgMHhhODA0LCAweGEwNWEsIDB4MjAwMSwKKwkweDAwMTksIDB4MDA5ZSwgMHhhMDEyLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDQxM2IsIDB4NDEzMiwKKwkweDQxMjksIDB4NDEyMCwgMHg0MTE3LCAweDQxMGUsIDB4NDEwNSwgMHhhOTY0LCAweDc5MDIsIDB4YTk2OCwKKwkweDc5MDYsIDB4YTk2YywgMHg3OTEyLCAweGE5NzAsIDB4NzkxNiwgMHgwMDA1LCAweGE5NzQsIDB4NzkwMiwKKwkweGE5NzgsIDB4NzkwNiwgMHhhOTdjLCAweDc5MTIsIDB4YTk4MCwgMHg3OTE2LCAweDAwMDUsIDB4YTk4NCwKKwkweDc5MDIsIDB4YTk4OCwgMHg3OTA2LCAweGE5OGMsIDB4NzkxMiwgMHhhOTkwLCAweDc5MTYsIDB4MDAwNSwKKwkweGE5OTQsIDB4NzkwMiwgMHhhOTk4LCAweDc5MDYsIDB4YTk5YywgMHg3OTEyLCAweGE5YTAsIDB4NzkxNiwKKwkweDAwMDUsIDB4YTlhNCwgMHg3OTAyLCAweGE5YTgsIDB4NzkwNiwgMHhhOWFjLCAweDc5MTIsIDB4YTliMCwKKwkweDc5MTYsIDB4MDAwNSwgMHhhOWI0LCAweDc5MDIsIDB4YTliOCwgMHg3OTA2LCAweGE5YmMsIDB4NzkxMiwKKwkweGE5YzAsIDB4NzkxNiwgMHgwMDA1LCAweGE5YzQsIDB4NzkwMiwgMHhhOWM4LCAweDc5MDYsIDB4YTljYywKKwkweDc5MTIsIDB4YTlkMCwgMHg3OTE2LCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwODYsIDB4MjA3MSwKKwkweDE5ZTYsIDB4MjA3OSwgMHgwMDkwLCAweDc5MmMsIDB4ZDFmYywgMHgwMWU4LCAweDc4MmIsIDB4MDAwMiwKKwkweDI5NDAsIDB4OTAyNiwgMHg3MDU0LCAweDAwMDIsIDB4NDE2YiwgMHg0MTU3LCAweDQxNjIsIDB4ODAwMSwKKwkweDcwNTYsIDB4ZDE5YywgMHgxMTgwLCAweDIwMTEsIDB4MDAwMSwgMHgwODBjLCAweDQwZDAsIDB4MTkwYywKKwkweDQwZDAsIDB4MDA0OCwgMHg4MDAxLCAweDcwNTYsIDB4NzgyYywgMHhkMGZjLCAweDFkMzgsIDB4MjAxMSwKKwkweDAwMDEsIDB4MDgwYywgMHg0MGQwLCAweDAwOGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwKKwkweDAwZTYsIDB4MDBjNiwgMHgwMDg2LCAweDIwNjEsIDB4MDIwMCwgMHgyMDAxLCAweDE5YTksIDB4MjAwNCwKKwkweDYwMWEsIDB4MjA2MSwgMHgwMTAwLCAweDIwMDEsIDB4MTlhOCwgMHgyMDA0LCAweDYwY2UsIDB4NjEwNCwKKwkweGMxYWMsIDB4NjEwNiwgMHgyMDAxLCAweDAwMmMsIDB4MjAwNCwgMHg5MDA1LCAweDA1MjAsIDB4MjAzOCwKKwkweDIwMDEsIDB4MDAyZSwgMHgyMDI0LCAweDIwMDEsIDB4MDAyZiwgMHgyMDFjLCAweDA4MGMsIDB4NGFmMiwKKwkweGE4MTMsIDB4MDAxOSwgMHhhZjE2LCAweDI5MDAsIDB4YTg1YSwgMHg5NzhhLCAweDAwMDcsIDB4MDIyMCwKKwkweDIxMzgsIDB4MjAwOSwgMHgwMDA3LCAweDAwMTAsIDB4MjcwOCwgMHg5MDNlLCAweDAwOTYsIDB4YTg1OCwKKwkweDIwNDgsIDB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4MDA5ZSwgMHgwODBjLCAweDQxZTcsIDB4MWQ2OCwKKwkweDI5MDAsIDB4YTg1YSwgMHgwMGQwLCAweDA4MGMsIDB4NGFmMiwgMHhhODEzLCAweDAwMTksIDB4YTgxNywKKwkweDAwMDEsIDB4MjkwMCwgMHhhODVhLCAweDIwMDEsIDB4MDAyZSwgMHgyMDA0LCAweGE4NjYsIDB4MjAwMSwKKwkweDAwMmYsIDB4MjAwNCwgMHhhODZhLCAweDIwMDEsIDB4MDAyYSwgMHgyMDA0LCAweDkwODQsIDB4ZmZmOCwKKwkweGE4NmUsIDB4MjAwMSwgMHgwMDJiLCAweDIwMDQsIDB4YTg3MiwgMHgyMDYxLCAweDAwOTAsIDB4MjA3OSwKKwkweDAxMDAsIDB4MjAwMSwgMHgxOWE4LCAweDIwMDQsIDB4NjAzNiwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywKKwkweDIyMGEsIDB4MjAwMSwgMHgwMDJhLCAweDIwMDQsIDB4OTA4NCwgMHhmZmY4LCAweDYwMWEsIDB4MDAwNiwKKwkweDIwMDEsIDB4MDAyYiwgMHgyMDA0LCAweDYwMWUsIDB4NzhjNiwgMHgwMDBlLCAweDc4Y2EsIDB4OTAwNiwKKwkweDYwMGEsIDB4NjAwZSwgMHgwMDhlLCAweDAwY2UsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBlNiwKKwkweDIwNzEsIDB4MDA4MCwgMHhhYTYwLCAweDIyZTgsIDB4MjBhMCwgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwKKwkweDAwODgsIDB4NzAyYiwgMHgwMDI2LCAweDc0MDIsIDB4NzMwNiwgMHg5MDA2LCAweDcwMGEsIDB4NzAwZSwKKwkweDgxMGIsIDB4ODEwYiwgMHgyMWE4LCAweDgxMGIsIDB4NzExMiwgMHg3MDJiLCAweDAwNDEsIDB4NzAyYywKKwkweGQwZmMsIDB4MGRlOCwgMHg3MDJiLCAweDAwMDIsIDB4NzAyYiwgMHgwMDQwLCAweDQwMDUsIDB4NzQwMCwKKwkweDczMDQsIDB4ODdmZiwgMHgwMTkwLCAweDAwODYsIDB4MDA5NiwgMHgyOTQwLCAweDAwODYsIDB4MDgwYywKKwkweDRhZjIsIDB4MDA4ZSwgMHhhMDU4LCAweDAwYTYsIDB4MjA1MCwgMHgyOTAwLCAweGIwMDYsIDB4YTA1YSwKKwkweDAwYWUsIDB4MDA5ZSwgMHgwMDhlLCAweDkwODUsIDB4MDAwMSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwKKwkweDIwMDEsIDB4MDAyZCwgMHgyMDA0LCAweDkwMDUsIDB4MDUyOCwgMHgyMDM4LCAweDIwMDEsIDB4MDAzMCwKKwkweDIwMjQsIDB4MjAwMSwgMHgwMDMxLCAweDIwMWMsIDB4MDgwYywgMHg0YWYyLCAweDI5NDAsIDB4YTgxMywKKwkweDAwMTksIDB4YWYxNiwgMHgyOTAwLCAweGE4NWEsIDB4OTc4YSwgMHgwMDA3LCAweDAyMjAsIDB4MjEzOCwKKwkweDIwMDksIDB4MDAwNywgMHgwMDEwLCAweDI3MDgsIDB4OTAzZSwgMHgwMDk2LCAweGE4NTgsIDB4MjA0OCwKKwkweGE4NWMsIDB4OTA4MCwgMHgwMDE5LCAweDAwOWUsIDB4MDgwYywgMHg0MWU3LCAweDFkNjgsIDB4MjkwMCwKKwkweGE4NWEsIDB4MDBkOCwgMHgwODBjLCAweDRhZjIsIDB4Mjk0MCwgMHhhMDEzLCAweDAwMTksIDB4YTAxNywKKwkweDAwMDEsIDB4MjgwMCwgMHhhMDVhLCAweDIwMDEsIDB4MDAzMCwgMHgyMDA0LCAweGEwNjYsIDB4MjAwMSwKKwkweDAwMzEsIDB4MjAwNCwgMHhhMDZhLCAweDIwMDEsIDB4MDAyYSwgMHgyMDA0LCAweDkwODQsIDB4ZmZmOCwKKwkweGEwNmUsIDB4MjAwMSwgMHgwMDJiLCAweDIwMDQsIDB4YTA3MiwgMHgyMDAxLCAweDAzMmEsIDB4MjAwMywKKwkweDAwMDQsIDB4Nzg4NCwgMHhkMGFjLCAweDExODAsIDB4MjAwMSwgMHgwMTAxLCAweDIwMGMsIDB4OTE4ZCwKKwkweDAyMDAsIDB4MjEwMiwgMHhhMDE3LCAweDAwMDAsIDB4MjAwMSwgMHgxYTZhLCAweDIwMDMsIDB4MDAwMywKKwkweDIwMDEsIDB4MDMyYSwgMHgyMDAzLCAweDAwMDksIDB4MjAwMSwgMHgwMzAwLCAweDIwMDMsIDB4MDAwMCwKKwkweDIwMDEsIDB4MDIwZCwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgwMDA0LCAweDIwMGMsIDB4OTE4ZCwKKwkweDAwMDIsIDB4MjEwMiwgMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjBhOSwKKwkweDAwMDcsIDB4MjBhMSwgMHgxODQwLCAweDIwZTksIDB4MDAwMSwgMHg5MDA2LCAweDQwMDQsIDB4MjBhOSwKKwkweDAwMTQsIDB4MjBhMSwgMHhmZmVjLCAweDIwZTksIDB4MDAwMCwgMHg5MDA2LCAweDQwMDQsIDB4MjAwOSwKKwkweDAxM2MsIDB4MjAwYSwgMHgwMTJlLCAweDc4ODAsIDB4OTA4NiwgMHgwMDUyLCAweDAxMDgsIDB4MDAwNSwKKwkweDA4MDQsIDB4MzViOCwgMHg3ZDk4LCAweDdjOWMsIDB4MDgwNCwgMHgzNmJhLCAweDA4MGMsIDB4NzUzZCwKKwkweDE5MGMsIDB4NjA1NywgMHg2MDQwLCAweDkwODQsIDB4MDAyMCwgMHgwOWIxLCAweDIwNjksIDB4MTg0NywKKwkweDJkMDAsIDB4MjAwOSwgMHgwMDMwLCAweDdhOGMsIDB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4MjAzOSwKKwkweDAwMDEsIDB4MDgwYywgMHg0YjNiLCAweDcwMWYsIDB4NDJjNiwgMHgwMDA1LCAweDA4MGMsIDB4NTc0ZCwKKwkweDExMzAsIDB4M2IwMCwgMHgzYTA4LCAweGMxOTQsIDB4YzA5NSwgMHgyMGQ4LCAweDIxZDAsIDB4MjA2OSwKKwkweDE4NDcsIDB4NjgwMCwgMHg5MDA1LCAweDA5MDQsIDB4MzVlZCwgMHg2ODA0LCAweGQwYWMsIDB4MDExOCwKKwkweGQwYTQsIDB4MDkwNCwgMHgzNWVkLCAweGQwOTQsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4NjEwNCwKKwkweDAxMzgsIDB4NjIwMCwgMHg5MjkyLCAweDAwMDUsIDB4MDIxOCwgMHg5MThjLCAweGZmZGYsIDB4MDAxMCwKKwkweDkxOGQsIDB4MDAyMCwgMHg2MTA2LCAweDAwY2UsIDB4ZDA4YywgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwKKwkweDYxMDQsIDB4MDExOCwgMHg5MThkLCAweDAwMTAsIDB4MDAxMCwgMHg5MThjLCAweGZmZWYsIDB4NjEwNiwKKwkweDAwY2UsIDB4ZDA4NCwgMHgwMTU4LCAweDZhMjgsIDB4OTI4YSwgMHgwMDdmLCAweDFhMDQsIDB4MzVlZCwKKwkweDkyODgsIDB4MzNiOSwgMHgyMTBkLCAweDkxOGMsIDB4MDBmZiwgMHg2MTY2LCAweGQwZGMsIDB4MDEzMCwKKwkweDY4MjgsIDB4OTA4YSwgMHgwMDdmLCAweDFhMDQsIDB4MzVlZCwgMHg2MDVlLCAweDY4ODgsIDB4OTA4NCwKKwkweDAwMzAsIDB4ODAwNCwgMHg4MDA0LCAweDgwMDQsIDB4ODAwNCwgMHgwMDA2LCAweDIwMDksIDB4MTliMCwKKwkweDkwODAsIDB4Mjc5ZCwgMHgyMDA1LCAweDIwMGEsIDB4MjAwOCwgMHgyMDAxLCAweDAwMTgsIDB4MDgwYywKKwkweGE5MGYsIDB4MjAwOSwgMHgwMzkwLCAweDIwMGIsIDB4MDQwMCwgMHgwMDBlLCAweDIwMDksIDB4MTliMSwKKwkweDkwODAsIDB4MjdhMSwgMHgyMDA1LCAweDIwMGEsIDB4NjgwOCwgMHg5MDhhLCAweDAxMDAsIDB4MGEwNCwKKwkweDM1ZWQsIDB4OTA4YSwgMHgwODQxLCAweDFhMDQsIDB4MzVlZCwgMHg5MDg0LCAweDAwMDcsIDB4MTkwNCwKKwkweDM1ZWQsIDB4NjgwYywgMHg5MDA1LCAweDA5MDQsIDB4MzVlZCwgMHg2ODEwLCAweDkwMDUsIDB4MDkwNCwKKwkweDM1ZWQsIDB4Njg0OCwgMHg2OTQwLCAweDkxMGEsIDB4MWEwNCwgMHgzNWVkLCAweDgwMDEsIDB4MDkwNCwKKwkweDM1ZWQsIDB4Njg0YywgMHg2OTQ0LCAweDkxMGEsIDB4MWEwNCwgMHgzNWVkLCAweDgwMDEsIDB4MDkwNCwKKwkweDM1ZWQsIDB4NjgxNCwgMHg5MDhjLCAweDAwZmYsIDB4NjE0ZSwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwKKwkweDYwNTIsIDB4MDgwYywgMHg3ODcxLCAweDA4MGMsIDB4NmIwZiwgMHgwODBjLCAweDZiNDMsIDB4NjgwOCwKKwkweDYwMmEsIDB4MDgwYywgMHgyMTdjLCAweDIwMDksIDB4MDE3MCwgMHgyMDBiLCAweDAwODAsIDB4YTAwMSwKKwkweGEwMDEsIDB4MjAwYiwgMHgwMDAwLCAweDAwMzYsIDB4NmIwOCwgMHgwODBjLCAweDI3MDQsIDB4MDAzZSwKKwkweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDE5MDQsIDB4NDQ1MSwgMHg2ODE4LCAweDY5MWMsIDB4NmEyMCwKKwkweDZiMjQsIDB4ODAwNywgMHg4MTBmLCAweDgyMTcsIDB4ODMxZiwgMHg2MDE2LCAweDYxMWEsIDB4NjIxZSwKKwkweDYzMjIsIDB4NmMwNCwgMHhkNGY0LCAweDAxNDgsIDB4NjgzMCwgMHg2OTM0LCAweDZhMzgsIDB4NmIzYywKKwkweDgwMDcsIDB4ODEwZiwgMHg4MjE3LCAweDgzMWYsIDB4MDAxMCwgMHg5MDg0LCAweGYwZmYsIDB4NjAwNiwKKwkweDYxMGEsIDB4NjIwZSwgMHg2MzEyLCAweDgwMDcsIDB4ODEwZiwgMHg4MjE3LCAweDgzMWYsIDB4MjBhOSwKKwkweDAwMDQsIDB4MjBhMSwgMHgxOWIyLCAweDIwZTksIDB4MDAwMSwgMHg0MDAxLCAweDIwYTksIDB4MDAwNCwKKwkweDIwYTEsIDB4MTljYywgMHgyMGU5LCAweDAwMDEsIDB4NDAwMSwgMHgwODBjLCAweDg4NWIsIDB4MDBjNiwKKwkweDkwMGUsIDB4MjBhOSwgMHgwMDAxLCAweDZiNzAsIDB4ZDM4NCwgMHgwMWM4LCAweDAwMjAsIDB4ODM5ZCwKKwkweDEyYjAsIDB4MzUwOCwgMHg4MTA5LCAweDA4MGMsIDB4N2UzMywgMHg2ODc4LCAweDYwMTYsIDB4Njg3NCwKKwkweDIwMDgsIDB4OTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4NjAwYSwgMHg5MTg0LCAweDAwZmYsIDB4NjAwNiwKKwkweDgxMDgsIDB4MTExOCwgMHg2MDAzLCAweDAwMDMsIDB4MDAxMCwgMHg2MDAzLCAweDAwMDEsIDB4MWYwNCwKKwkweDQzYWYsIDB4MDBjZSwgMHgwMGM2LCAweDIwNjEsIDB4MTk5YiwgMHg2YTg4LCAweDkyODQsIDB4YzAwMCwKKwkweDIwMTAsIDB4OTI4NiwgMHgwMDAwLCAweDExNTgsIDB4MjA2MywgMHgwMDAwLCAweDIwMDEsIDB4MDAwMSwKKwkweDA4MGMsIDB4MjlhYiwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyOThlLCAweDAwODgsIDB4OTI4NiwKKwkweDQwMDAsIDB4MTE0OCwgMHgyMDYzLCAweDAwMDEsIDB4OTAwNiwgMHgwODBjLCAweDI5YWIsIDB4OTAwNiwKKwkweDA4MGMsIDB4Mjk4ZSwgMHgwMDI4LCAweDkyODYsIDB4ODAwMCwgMHgxZDMwLCAweDIwNjMsIDB4MDAwMiwKKwkweDAwY2UsIDB4MDBlNiwgMHgyYzcwLCAweDA4MGMsIDB4MGVjMSwgMHgwMGVlLCAweDY4ODgsIDB4ZDBlYywKKwkweDAxMzAsIDB4MjAxMSwgMHgwMTE0LCAweDIyMDQsIDB4OTA4NSwgMHgwMTgwLCAweDIwMTIsIDB4NmE4MCwKKwkweDkyODQsIDB4MDAzMCwgMHg5MDg2LCAweDAwMzAsIDB4MTEyOCwgMHg5Mjk0LCAweGZmY2YsIDB4OTI5NSwKKwkweDAwMjAsIDB4NmE4MiwgMHgyMDAxLCAweDE5N2IsIDB4NmE4MCwgMHg5Mjk0LCAweDAwMzAsIDB4OTI4ZSwKKwkweDAwMDAsIDB4MDE3MCwgMHg5MjhlLCAweDAwMTAsIDB4MDExOCwgMHg5MjhlLCAweDAwMjAsIDB4MDE0MCwKKwkweDIwMDMsIDB4YWFhYSwgMHgwODBjLCAweDI3NzksIDB4MjAwMSwgMHgxOTZjLCAweDIxMDIsIDB4MDAwOCwKKwkweDIxMDIsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4NjAyZiwgMHgwMDQwLCAweDYwMmYsIDB4MDAwMCwKKwkweDAwY2UsIDB4MDgwYywgMHg3NTNkLCAweDAxMjgsIDB4MDgwYywgMHg1MDI3LCAweDAxMTAsIDB4MDgwYywKKwkweDI2Y2EsIDB4NjBkNCwgMHg5MDA1LCAweDAxYzAsIDB4NjAwMywgMHgwMDAxLCAweDIwMDksIDB4NDQzOSwKKwkweDAwZTAsIDB4MDgwYywgMHg3NTNkLCAweDExNjgsIDB4MjAxMSwgMHg3M2IzLCAweDA4MGMsIDB4ODZjOCwKKwkweDIwMTEsIDB4NzNhNiwgMHgwODBjLCAweDg3ZDQsIDB4MDgwYywgMHg3ODQ1LCAweDA4MGMsIDB4NzQ2ZSwKKwkweDAwNDAsIDB4MDgwYywgMHg1ZjRkLCAweDAwMjgsIDB4NjAwMywgMHgwMDA0LCAweDIwMDksIDB4NDQ1MSwKKwkweDAwMjAsIDB4MDgwYywgMHg2YTNmLCAweDA4MDQsIDB4MzViOCwgMHgyMDAxLCAweDAxNzAsIDB4MjAwNCwKKwkweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwNGMsIDB4MTExOCwgMHgyMDkxLCAweDMxYmQsIDB4MDgxNywKKwkweDIwOTEsIDB4MzEzZCwgMHgwODE3LCAweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDA5MDQsIDB4MzVlYSwKKwkweDIwNjksIDB4MTg0NywgMHg3ODkwLCAweDY4NDIsIDB4Nzg5NCwgMHg2ODQ2LCAweDJkMDAsIDB4MjAwOSwKKwkweDAwMzAsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHgyMDM5LCAweDAwMDEsIDB4MDgwNCwKKwkweDRiM2UsIDB4OTAwNiwgMHgwODBjLCAweDI2Y2EsIDB4ODFmZiwgMHgxOTA0LCAweDM1ZWEsIDB4MDgwYywKKwkweDc1M2QsIDB4MTFiMCwgMHgwODBjLCAweDc4NDAsIDB4MDgwYywgMHg2MDkyLCAweDA4MGMsIDB4MzNhZCwKKwkweDAxMTgsIDB4NjEzMCwgMHhjMThkLCAweDYxMzIsIDB4MDgwYywgMHhkMDliLCAweDAxMzAsIDB4MDgwYywKKwkweDc1NjAsIDB4MTExOCwgMHgwODBjLCAweDc1MTEsIDB4MDAzOCwgMHgwODBjLCAweDc0NmUsIDB4MDAyMCwKKwkweDA4MGMsIDB4NjA1NywgMHgwODBjLCAweDVmNGQsIDB4MDgwNCwgMHgzNWI4LCAweDgxZmYsIDB4MTkwNCwKKwkweDM1ZWEsIDB4MDgwYywgMHg3NTNkLCAweDExMTAsIDB4MDgwNCwgMHgzNWVhLCAweDYxOTQsIDB4ODFmZiwKKwkweDAxYTgsIDB4NzA0ZiwgMHgwMDAwLCAweDIwMDEsIDB4MWQ4MCwgMHgyMDA5LCAweDAwNDAsIDB4N2E4YywKKwkweDdiODgsIDB4N2M5YywgMHg3ZDk4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMzksIDB4MDAwMSwKKwkweDA4MGMsIDB4NGIzZSwgMHg3MDFmLCAweDM1YjYsIDB4MDEyZSwgMHgwMDA1LCAweDcwNGYsIDB4MDAwMSwKKwkweDAwZDYsIDB4MjA2OSwgMHgxZDgwLCAweDIwYTksIDB4MDA0MCwgMHgyMGU5LCAweDAwMDEsIDB4MjBhMSwKKwkweDFkODAsIDB4MjAxOSwgMHhmZmZmLCAweDQzMDQsIDB4NjU1YywgMHg5NTg4LCAweDMzYjksIDB4MjEwZCwKKwkweDkxOGMsIDB4MDBmZiwgMHgyMTZhLCAweDkwMGUsIDB4MjAxMSwgMHgwMDAyLCAweDIxMDAsIDB4OTUwNiwKKwkweDAxYTgsIDB4MDgwYywgMHg2NjkzLCAweDExOTAsIDB4YjgxNCwgMHg4MjFjLCAweDAyMzgsIDB4OTM5OCwKKwkweDFkODAsIDB4OTA4NSwgMHhmZjAwLCAweDgwMDcsIDB4MjAxYSwgMHgwMDM4LCAweDkzOTgsIDB4MWQ4MCwKKwkweDIzMjQsIDB4OTRhNCwgMHhmZjAwLCAweDk0MDUsIDB4MjAxYSwgMHg4MjEwLCAweDgxMDgsIDB4OTE4MiwKKwkweDAwODAsIDB4MTIwOCwgMHgwYzE4LCAweDgyMDEsIDB4ODAwNywgMHgyZDBjLCAweDkxMDUsIDB4MjA2YSwKKwkweDAwZGUsIDB4MjBhOSwgMHgwMDQwLCAweDIwYTEsIDB4MWQ4MCwgMHgyMDk5LCAweDFkODAsIDB4MDgwYywKKwkweDVmZTIsIDB4MDgwNCwgMHg0NGFiLCAweDA4MGMsIDB4NGIyNSwgMHgwOTA0LCAweDM1ZWQsIDB4MDgwYywKKwkweDRhZjIsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgzNWVhLCAweDA4MGMsIDB4NTczZSwKKwkweGQwYjQsIDB4MDU1OCwgMHg3ODg0LCAweDkwOGUsIDB4MDA3ZSwgMHgwNTM4LCAweDkwOGUsIDB4MDA3ZiwKKwkweDA1MjAsIDB4OTA4ZSwgMHgwMDgwLCAweDA1MDgsIDB4MDgwYywgMHgzM2E4LCAweDExNDgsIDB4YjgwMCwKKwkweGQwOGMsIDB4MTFkOCwgMHhiODA0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDYsIDB4MTFhOCwKKwkweGE4NjcsIDB4MDAwMCwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHgwODBjLCAweGNiNGIsIDB4MTEyMCwKKwkweDIwMDksIDB4MDAwMywgMHgwODA0LCAweDM1ZWEsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NDUzOSwKKwkweDAwMDUsIDB4MDgwYywgMHg0YjI1LCAweDA5MDQsIDB4MzVlZCwgMHgyMGE5LCAweDAwMmIsIDB4YjhjNCwKKwkweDIwZTAsIDB4YjhjOCwgMHgyMDk4LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDkwODAsIDB4MDAwMiwKKwkweDIwYTAsIDB4NDAwMywgMHgyMGE5LCAweDAwMDgsIDB4OTA4MCwgMHgwMDA2LCAweDIwYTAsIDB4YjhjNCwKKwkweDIwZTAsIDB4YjhjOCwgMHg5MDgwLCAweDAwMDYsIDB4MjA5OCwgMHgwODBjLCAweDBmYzQsIDB4MDA3MCwKKwkweDIwYTksIDB4MDAwNCwgMHhhODVjLCAweDkwODAsIDB4MDAwYSwgMHgyMGEwLCAweGI4YzQsIDB4MjBlMCwKKwkweGI4YzgsIDB4OTA4MCwgMHgwMDBhLCAweDIwOTgsIDB4MDgwYywgMHgwZmM0LCAweDg5MDYsIDB4ODAwNiwKKwkweDgwMDcsIDB4OTBiYywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMDIsIDB4MjAwOSwKKwkweDAwMmIsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHgwODA0LCAweDRiM2UsIDB4ODFmZiwKKwkweDE5MDQsIDB4MzVlYSwgMHgwODBjLCAweDRiMDksIDB4MDkwNCwgMHgzNWVkLCAweDA4MGMsIDB4NjhkOCwKKwkweDA5MDQsIDB4MzVlYSwgMHgwMDU4LCAweGE4NzgsIDB4OTAwNSwgMHgwMTIwLCAweDIwMDksIDB4MDAwNCwKKwkweDA4MDQsIDB4MzVlYSwgMHhhOTc0LCAweGFhOTQsIDB4MDgwNCwgMHgzNWI4LCAweDA4MGMsIDB4NTc0NiwKKwkweDA5MDQsIDB4MzViOCwgMHg3MDFmLCAweDQ1ODMsIDB4NzAwNywgMHgwMDAzLCAweDAwMDUsIDB4ODFmZiwKKwkweDE5MDQsIDB4MzVlYSwgMHg3ODg4LCAweDkwOGEsIDB4MTAwMCwgMHgxYTA0LCAweDM1ZWQsIDB4MDgwYywKKwkweDRiMjUsIDB4MDkwNCwgMHgzNWVkLCAweDA4MGMsIDB4NmFkZCwgMHgwMTIwLCAweDA4MGMsIDB4NmFlNSwKKwkweDE5MDQsIDB4MzVlZCwgMHgwODBjLCAweDY5NWQsIDB4MDkwNCwgMHgzNWVhLCAweDIwMTksIDB4MDAwNCwKKwkweDkwMGUsIDB4MDgwYywgMHg2OGVhLCAweDA5MDQsIDB4MzVlYSwgMHg3OTg0LCAweDdhODgsIDB4MDRjOSwKKwkweDA4YTgsIDB4YTg5YywgMHg5MDhhLCAweDEwMDAsIDB4MTJmOCwgMHgwODBjLCAweDRiMjMsIDB4MDFlMCwKKwkweDA4MGMsIDB4NmFkZCwgMHgwMTE4LCAweDA4MGMsIDB4NmFlNSwgMHgxMWIwLCAweDA4MGMsIDB4Njk1ZCwKKwkweDIwMDksIDB4MDAwMiwgMHgwMTY4LCAweDIwMDksIDB4MDAwMiwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywKKwkweDY4ZWEsIDB4MjAwOSwgMHgwMDAzLCAweDAxMjAsIDB4YTk5OCwgMHhhYTljLCAweDAwZDEsIDB4MDA2MCwKKwkweGE4OTcsIDB4NDAwNSwgMHhhOTlhLCAweDAwMTAsIDB4YTg5NywgMHg0MDA2LCAweDkwMGUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MjAwMSwgMHgwMDMwLCAweDAwMDUsIDB4YTg5NywgMHg0MDAwLCAweDA4MGMsIDB4NTc0NiwKKwkweDAxMTAsIDB4OTAwNiwgMHgwMDE4LCAweDkwMGUsIDB4OTA4NSwgMHgwMDAxLCAweDIwMDEsIDB4MDAwMCwKKwkweDAwMDUsIDB4OTE4NiwgMHgwMGZmLCAweDAxMTAsIDB4MDA3MSwgMHgwMDYwLCAweDIwMjksIDB4MDA3ZSwKKwkweDIwNjEsIDB4MTgwMCwgMHg2NDVjLCAweDI0MDAsIDB4OTUwNiwgMHgwMTEwLCAweDI1MDgsIDB4MDAxOSwKKwkweDg1MjksIDB4MWVjOCwgMHgwMDA1LCAweDA4MGMsIDB4NjY5MywgMHgxMTM4LCAweDIyMDAsIDB4ODAwMywKKwkweDgwMGIsIDB4ODEwYiwgMHg5MTA4LCAweDA4MGMsIDB4ODZkNiwgMHgwMDA1LCAweDgxZmYsIDB4MTkwNCwKKwkweDM1ZWEsIDB4Nzk4YywgMHgyMDAxLCAweDE5N2YsIDB4OTE4YywgMHg4MDAwLCAweDIxMDIsIDB4MDgwYywKKwkweDRiMDksIDB4MDkwNCwgMHgzNWVkLCAweDA4MGMsIDB4NmFkZCwgMHgwMTIwLCAweDA4MGMsIDB4NmFlNSwKKwkweDE5MDQsIDB4MzVlZCwgMHgwODBjLCAweDY3NWEsIDB4MDkwNCwgMHgzNWVhLCAweDA4MGMsIDB4NjhlMSwKKwkweDA5MDQsIDB4MzVlYSwgMHgyMDAxLCAweDE5N2YsIDB4MjAwNCwgMHhkMGZjLCAweDE5MDQsIDB4MzViOCwKKwkweDA4MDQsIDB4NDU4ZSwgMHhhOWEwLCAweDIwMDEsIDB4MTk3ZiwgMHg5MThjLCAweDgwMDAsIDB4YzE4ZCwKKwkweDIxMDIsIDB4MDgwYywgMHg0YjE2LCAweDAxYTAsIDB4MDgwYywgMHg2YWRkLCAweDAxMTgsIDB4MDgwYywKKwkweDZhZTUsIDB4MTE3MCwgMHgwODBjLCAweDY3NWEsIDB4MjAwOSwgMHgwMDAyLCAweDAxMjgsIDB4MDgwYywKKwkweDY4ZTEsIDB4MTE3MCwgMHgyMDA5LCAweDAwMDMsIDB4YTg5NywgMHg0MDA1LCAweGE5OWEsIDB4MDAxMCwKKwkweGE4OTcsIDB4NDAwNiwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwgMHgyMDAxLCAweDAwMzAsIDB4MDAwNSwKKwkweGE4OTcsIDB4NDAwMCwgMHgyMDAxLCAweDE5N2YsIDB4MjAwNCwgMHhkMGZjLCAweDExMjgsIDB4MDgwYywKKwkweDU3NDYsIDB4MDExMCwgMHg5MDA2LCAweDAwMTgsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwKKwkweDAwMDAsIDB4MDAwNSwgMHg4MWZmLCAweDE5MDQsIDB4MzVlYSwgMHg3OThjLCAweDIwMDEsIDB4MTk3ZSwKKwkweDkxOGMsIDB4ODAwMCwgMHgyMTAyLCAweDA4MGMsIDB4NGIwOSwgMHgwOTA0LCAweDM1ZWQsIDB4MDgwYywKKwkweDZhZGQsIDB4MDEyMCwgMHgwODBjLCAweDZhZTUsIDB4MTkwNCwgMHgzNWVkLCAweDA4MGMsIDB4Njc1YSwKKwkweDA5MDQsIDB4MzVlYSwgMHgwODBjLCAweDY4Y2YsIDB4MDkwNCwgMHgzNWVhLCAweDIwMDEsIDB4MTk3ZSwKKwkweDIwMDQsIDB4ZDBmYywgMHgxOTA0LCAweDM1YjgsIDB4MDgwNCwgMHg0NThlLCAweGE5YTAsIDB4MjAwMSwKKwkweDE5N2UsIDB4OTE4YywgMHg4MDAwLCAweGMxOGQsIDB4MjEwMiwgMHgwODBjLCAweDRiMTYsIDB4MDFhMCwKKwkweDA4MGMsIDB4NmFkZCwgMHgwMTE4LCAweDA4MGMsIDB4NmFlNSwgMHgxMTcwLCAweDA4MGMsIDB4Njc1YSwKKwkweDIwMDksIDB4MDAwMiwgMHgwMTI4LCAweDA4MGMsIDB4NjhjZiwgMHgxMTcwLCAweDIwMDksIDB4MDAwMywKKwkweGE4OTcsIDB4NDAwNSwgMHhhOTlhLCAweDAwMTAsIDB4YTg5NywgMHg0MDA2LCAweDkwMGUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MjAwMSwgMHgwMDMwLCAweDAwMDUsIDB4YTg5NywgMHg0MDAwLCAweDIwMDEsIDB4MTk3ZSwKKwkweDIwMDQsIDB4ZDBmYywgMHgxMTI4LCAweDA4MGMsIDB4NTc0NiwgMHgwMTEwLCAweDkwMDYsIDB4MDAxOCwKKwkweDkwMGUsIDB4OTA4NSwgMHgwMDAxLCAweDIwMDEsIDB4MDAwMCwgMHgwMDA1LCAweDYxMDAsIDB4MDgwNCwKKwkweDM1YjgsIDB4MDgwYywgMHg0YjI1LCAweDA5MDQsIDB4MzVlZCwgMHgwODBjLCAweDU3NTIsIDB4MTkwNCwKKwkweDM1ZWEsIDB4NzlhOCwgMHhkMTg0LCAweDExNTgsIDB4YjgzNCwgMHg4MDA3LCAweDc4OWUsIDB4YjgzMCwKKwkweDgwMDcsIDB4Nzg5YSwgMHhiYjJjLCAweDgzMWYsIDB4YmEyOCwgMHg4MjE3LCAweDAwNTAsIDB4YjgyNCwKKwkweDgwMDcsIDB4Nzg5ZSwgMHhiODIwLCAweDgwMDcsIDB4Nzg5YSwgMHhiYjFjLCAweDgzMWYsIDB4YmExOCwKKwkweDgyMTcsIDB4YjkwMCwgMHg5MThjLCAweDAyMDIsIDB4MDgwNCwgMHgzNWI4LCAweDc4YTgsIDB4OTA5YywKKwkweDAwMDMsIDB4ZDBhYywgMHgxMTUwLCAweGQwYjQsIDB4MTE0MCwgMHg5MzlhLCAweDAwMDMsIDB4MWEwNCwKKwkweDM1ZWEsIDB4NjI1YywgMHg3ODg0LCAweDkyMDYsIDB4MTU0OCwgMHgwODBjLCAweDg4NDUsIDB4MjAwMSwKKwkweGZmZWMsIDB4MjAwOSwgMHgwMDBjLCAweDdhOGMsIDB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4MjAzOSwKKwkweDAwMDAsIDB4MDAwNiwgMHg3OGE4LCAweDkwODQsIDB4MDA4MCwgMHgxMTE4LCAweDAwMGUsIDB4MDgwNCwKKwkweDRiM2UsIDB4MDAwZSwgMHgyMDMxLCAweDAwMDAsIDB4MjA2MSwgMHgxOGI4LCAweDJjNDQsIDB4YTY2YSwKKwkweGExN2EsIDB4YTc3MiwgMHhhMDc2LCAweGEyOGUsIDB4YTM5MiwgMHhhNDk2LCAweGE1OWEsIDB4MDgwYywKKwkweDExM2MsIDB4NzAwNywgMHgwMDAyLCAweDcwMWYsIDB4NDc0NiwgMHgwMDA1LCAweDgxZmYsIDB4MTkwNCwKKwkweDM1ZWEsIDB4MDgwYywgMHg0YjI1LCAweDA5MDQsIDB4MzVlZCwgMHgwODBjLCAweDZhZGQsIDB4MTkwNCwKKwkweDM1ZWEsIDB4MDBjNiwgMHgwODBjLCAweDRhZjIsIDB4MDBjZSwgMHgwOTA0LCAweDM1ZWEsIDB4YTg2NywKKwkweDAwMDAsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4N2VhOCwgMHgwODBjLCAweGNhZjEsIDB4MDkwNCwKKwkweDM1ZWEsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NDc0YSwgMHgwMDA1LCAweDA4MGMsIDB4NDI4YywKKwkweDA4MDQsIDB4MzViOCwgMHhhODMwLCAweDkwODYsIDB4MDEwMCwgMHgwOTA0LCAweDM1ZWEsIDB4ODkwNiwKKwkweDgwMDYsIDB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwgMHhmZmMwLCAweDkwODAsIDB4MDAxYiwKKwkweDIwMDksIDB4MDAwYywgMHg3YThjLCAweDdiODgsIDB4N2M5YywgMHg3ZDk4LCAweDA4MDQsIDB4NGIzZSwKKwkweDkwMDYsIDB4MDgwYywgMHgyNmNhLCAweDc4YTgsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDBmZiwKKwkweDAxMTgsIDB4ODFmZiwgMHgxOTA0LCAweDM1ZWEsIDB4MDgwYywgMHg3NTNkLCAweDAxMTAsIDB4MDgwYywKKwkweDYwNTcsIDB4Nzg4OCwgMHg5MDhhLCAweDEwMDAsIDB4MWEwNCwgMHgzNWVkLCAweDc5ODQsIDB4OTE4NiwKKwkweDAwZmYsIDB4MDEzOCwgMHg5MTgyLCAweDAwN2YsIDB4MWEwNCwgMHgzNWVkLCAweDIxMDAsIDB4MDgwYywKKwkweDI2OTQsIDB4MDAyNiwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjEsIDB4MWEwMiwKKwkweDYwMWIsIDB4MDAwMCwgMHg2MDFmLCAweDAwMDAsIDB4NjA3MywgMHgwMDAwLCAweDYwNzcsIDB4MDAwMCwKKwkweDA4MGMsIDB4NzUzZCwgMHgxMTU4LCAweDA4MGMsIDB4Nzg0MCwgMHgwODBjLCAweDYwOTIsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDgwYywgMHg3NTg0LCAweDA4MGMsIDB4NzQ2ZSwgMHgwMGYwLCAweDA4MGMsIDB4YTkxZSwKKwkweDA4MGMsIDB4YWJlOSwgMHgwODBjLCAweGE5M2EsIDB4MjA2MSwgMHgwMTAwLCAweDIwMDEsIDB4MTgxOCwKKwkweDIwMDQsIDB4OTA4NCwgMHgwMGZmLCAweDgxMGYsIDB4OTEwNSwgMHg2MDRhLCAweDYwNDMsIDB4MDA5MCwKKwkweDYwNDMsIDB4MDAxMCwgMHgyMDA5LCAweDE5OTgsIDB4MjAwYiwgMHgwMDAwLCAweDIwMDksIDB4MDAyZCwKKwkweDIwMTEsIDB4NWY3ZCwgMHgwODBjLCAweDg3OTIsIDB4Nzk4NCwgMHgwODBjLCAweDc1M2QsIDB4MTExMCwKKwkweDIwMDksIDB4MDBmZiwgMHg3YTg4LCAweDA4MGMsIDB4NDVmMSwgMHgwMTJlLCAweDAwY2UsIDB4MDAyZSwKKwkweDA4MDQsIDB4MzViOCwgMHg3OTg0LCAweDA4MGMsIDB4NjYzMiwgMHgyYjA4LCAweDE5MDQsIDB4MzVlZCwKKwkweDA4MDQsIDB4MzViOCwgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MDQsIDB4MzVlYSwKKwkweDYwZGMsIDB4ZDBhYywgMHgxMTMwLCAweGQwOWMsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDUsIDB4MDgwNCwKKwkweDM1ZWEsIDB4MDgwYywgMHg0YWYyLCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzVlYSwKKwkweDc5ODQsIDB4OTE5MiwgMHgwMDIxLCAweDFhMDQsIDB4MzVlZCwgMHg3YThjLCAweDdiODgsIDB4N2M5YywKKwkweDdkOTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4NzAyYSwgMHhhZjYwLCAweDc3MzYsIDB4MDgwYywKKwkweDRiM2IsIDB4NzAxZiwgMHg0ODAyLCAweDc4ODAsIDB4OTA4NiwgMHgwMDZlLCAweDAxMTAsIDB4NzAxZiwKKwkweDUxZDksIDB4MDAwNSwgMHgyMDA5LCAweDAwODAsIDB4MDgwYywgMHg2NjkzLCAweDExMTgsIDB4MDgwYywKKwkweDZhZGQsIDB4MDEyMCwgMHgyMDIxLCAweDQwMGEsIDB4MDgwNCwgMHgzNWJhLCAweDAwZDYsIDB4MDA5NiwKKwkweGE5NjQsIDB4YWE2YywgMHhhYjcwLCAweGFjNzQsIDB4YWQ3OCwgMHhhZTdjLCAweGE4ODQsIDB4OTBiZSwKKwkweDAxMDAsIDB4MDkwNCwgMHg0ODliLCAweDkwYmUsIDB4MDExMiwgMHgwOTA0LCAweDQ4OWIsIDB4OTBiZSwKKwkweDAxMTMsIDB4MDkwNCwgMHg0ODliLCAweDkwYmUsIDB4MDExNCwgMHgwOTA0LCAweDQ4OWIsIDB4OTBiZSwKKwkweDAxMTcsIDB4MDkwNCwgMHg0ODliLCAweDkwYmUsIDB4MDExYSwgMHgwOTA0LCAweDQ4OWIsIDB4OTBiZSwKKwkweDAxMWMsIDB4MDkwNCwgMHg0ODliLCAweDkwYmUsIDB4MDEyMSwgMHgwOTA0LCAweDQ4ODIsIDB4OTBiZSwKKwkweDAxMzEsIDB4MDkwNCwgMHg0ODgyLCAweDkwYmUsIDB4MDE3MSwgMHgwOTA0LCAweDQ4OWIsIDB4OTBiZSwKKwkweDAxNzMsIDB4MDkwNCwgMHg0ODliLCAweDkwYmUsIDB4MDFhMSwgMHgxMTI4LCAweGE4OTQsIDB4ODAwNywKKwkweGE4OTYsIDB4MDgwNCwgMHg0OGE2LCAweDkwYmUsIDB4MDIxMiwgMHgwOTA0LCAweDQ4OGYsIDB4OTBiZSwKKwkweDAyMTMsIDB4MDVlOCwgMHg5MGJlLCAweDAyMTQsIDB4MDUwMCwgMHg5MGJlLCAweDAyMTcsIDB4MDE4OCwKKwkweDkwYmUsIDB4MDIxYSwgMHgxMTIwLCAweGE4OWMsIDB4ODAwNywgMHhhODllLCAweDA0ZTAsIDB4OTBiZSwKKwkweDAyMWYsIDB4MDVjOCwgMHg5MGJlLCAweDAzMDAsIDB4MDViMCwgMHgwMDllLCAweDAwZGUsIDB4MDgwNCwKKwkweDM1ZWQsIDB4NzAyOCwgMHg5MDgwLCAweDAwMTAsIDB4MjA5OCwgMHgyMGEwLCAweDcwMzQsIDB4MjBlMCwKKwkweDIwZTgsIDB4MjBhOSwgMHgwMDA3LCAweDA4MGMsIDB4NDhlNCwgMHg3MDI4LCAweDkwODAsIDB4MDAwZSwKKwkweDIwOTgsIDB4MjBhMCwgMHg3MDM0LCAweDIwZTAsIDB4MjBlOCwgMHgyMGE5LCAweDAwMDEsIDB4MDgwYywKKwkweDQ4ZTQsIDB4MDBjOCwgMHg3MDI4LCAweDkwODAsIDB4MDAwYywgMHgyMDk4LCAweDIwYTAsIDB4NzAzNCwKKwkweDIwZTAsIDB4MjBlOCwgMHgyMGE5LCAweDAwMDEsIDB4MDgwYywgMHg0OGYxLCAweDAwYjgsIDB4NzAyOCwKKwkweDkwODAsIDB4MDAwZSwgMHgyMDk4LCAweDIwYTAsIDB4NzAzNCwgMHgyMGUwLCAweDIwZTgsIDB4MjBhOSwKKwkweDAwMDEsIDB4MDgwYywgMHg0OGYxLCAweDcwMjgsIDB4OTA4MCwgMHgwMDBjLCAweDIwOTgsIDB4MjBhMCwKKwkweDcwMzQsIDB4MjBlMCwgMHgyMGU4LCAweDIwYTksIDB4MDAwMSwgMHgwNGYxLCAweDAwYzYsIDB4MDgwYywKKwkweDRhZjIsIDB4MDU1MCwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHhhODY3LCAweDAxMTksIDB4OTAwNiwKKwkweGE4ODIsIDB4YTg3ZiwgMHgwMDIwLCAweGE4OGIsIDB4MDAwMSwgMHg4MTBiLCAweGE5YWUsIDB4YThiMiwKKwkweGFhYjYsIDB4YWJiYSwgMHhhY2JlLCAweGFkYzIsIDB4YTljNiwgMHhhOGNhLCAweDAwY2UsIDB4MDA5ZSwKKwkweDAwZGUsIDB4YTg2NiwgMHhhODIyLCAweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweGE4MDQsIDB4MjA0OCwKKwkweDA4MGMsIDB4Y2IwYywgMHgxMTIwLCAweDIwMDksIDB4MDAwMywgMHgwODA0LCAweDM1ZWEsIDB4NzAwNywKKwkweDAwMDMsIDB4NzAxZiwgMHg0OGRiLCAweDAwMDUsIDB4MDBjZSwgMHgwMDllLCAweDAwZGUsIDB4MjAwOSwKKwkweDAwMDIsIDB4MDgwNCwgMHgzNWVhLCAweGE4MjAsIDB4OTA4NiwgMHg4MDAxLCAweDE5MDQsIDB4MzViOCwKKwkweDIwMDksIDB4MDAwNCwgMHgwODA0LCAweDM1ZWEsIDB4MDAxNiwgMHgwMDI2LCAweDM1MTAsIDB4MjBhOSwKKwkweDAwMDIsIDB4NDAwMiwgMHg0MTA0LCAweDQwMDQsIDB4ODIxMSwgMHgxZGM4LCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDA0NiwgMHgzNTIwLCAweDIwYTksIDB4MDAwNCwKKwkweDQwMDIsIDB4NDMwNCwgMHg0MjA0LCAweDQxMDQsIDB4NDAwNCwgMHg4NDIxLCAweDFkYjgsIDB4MDA0ZSwKKwkweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4ODFmZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwMSwKKwkweDA4MDQsIDB4MzVlYSwgMHg2MGRjLCAweGQwYWMsIDB4MTEzMCwgMHhkMDljLCAweDExMjAsIDB4MjAwOSwKKwkweDAwMDUsIDB4MDgwNCwgMHgzNWVhLCAweDc5ODQsIDB4NzhhOCwgMHgyMDQwLCAweDA4MGMsIDB4YWJlMiwKKwkweDExMjAsIDB4OTE4MiwgMHgwMDdmLCAweDBhMDQsIDB4MzVlZCwgMHg5MTg2LCAweDAwZmYsIDB4MDkwNCwKKwkweDM1ZWQsIDB4OTE4MiwgMHgwODAwLCAweDFhMDQsIDB4MzVlZCwgMHg3YThjLCAweDdiODgsIDB4NjA3YywKKwkweDkzMDYsIDB4MTE1OCwgMHg2MDgwLCAweDkyNGUsIDB4MDkwNCwgMHgzNWVkLCAweDA4MGMsIDB4YWJlMiwKKwkweDExMjAsIDB4OTljYywgMHhmZjAwLCAweDA5MDQsIDB4MzVlZCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4NGEwNSwgMHgwOTA0LCAweDQ5ODUsIDB4MDA4NiwgMHg5MGM2LCAweDQwMDAsIDB4MDA4ZSwKKwkweDE1MzgsIDB4MDBjNiwgMHgwMDA2LCAweDAwMzYsIDB4YjgxOCwgMHhiYjFjLCAweDkzMDUsIDB4YmIyMCwKKwkweDkzMDUsIDB4YmIyNCwgMHg5MzA1LCAweGJiMjgsIDB4OTMwNSwgMHhiYjJjLCAweDkzMDUsIDB4YmIzMCwKKwkweDkzMDUsIDB4YmIzNCwgMHg5MzA1LCAweDAwM2UsIDB4MDU3MCwgMHhkODhjLCAweDExMjgsIDB4MDgwYywKKwkweDZhZGQsIDB4MDExMCwgMHhjODlkLCAweDA0MzgsIDB4OTAwZSwgMHgwODBjLCAweDY5ODYsIDB4MTEwOCwKKwkweGMxODUsIDB4YjgwMCwgMHhkMGJjLCAweDAxMDgsIDB4YzE4ZCwgMHgwMDBlLCAweDAwY2UsIDB4MDBiOCwKKwkweDkwYzYsIDB4NDAwNywgMHgxMTEwLCAweDI0MDgsIDB4MDA5MCwgMHg5MGM2LCAweDQwMDgsIDB4MTExOCwKKwkweDI3MDgsIDB4MjYxMCwgMHgwMDYwLCAweDkwYzYsIDB4NDAwOSwgMHgxMTA4LCAweDAwNDAsIDB4OTBjNiwKKwkweDQwMDYsIDB4MTEwOCwgMHgwMDIwLCAweDIwMDEsIDB4NDAwNSwgMHgyMDA5LCAweDAwMGEsIDB4MjAyMCwKKwkweDAxMmUsIDB4MDgwNCwgMHgzNWJhLCAweDAwMGUsIDB4MDBjZSwgMHgyYjAwLCAweDcwMjYsIDB4MDAxNiwKKwkweDAwYjYsIDB4MDBjNiwgMHgwMGU2LCAweDJjNzAsIDB4MDgwYywgMHhhZDIwLCAweDA5MDQsIDB4NDlkYSwKKwkweDJiMDAsIDB4NjAxMiwgMHgwODBjLCAweGNlMTUsIDB4MmU1OCwgMHgwMGVlLCAweDAwZTYsIDB4MDBjNiwKKwkweDA4MGMsIDB4NGFmMiwgMHgwMGNlLCAweDJiNzAsIDB4MTE1OCwgMHgwODBjLCAweGFjYjAsIDB4MDBlZSwKKwkweDAwY2UsIDB4MDBiZSwgMHgwMDFlLCAweDAxMmUsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzVlYSwKKwkweDkwMGUsIDB4YTk2NiwgMHhhOTZhLCAweDI5MDAsIDB4NjAxNiwgMHhhOTMyLCAweGE4NjgsIDB4YzBmZCwKKwkweGQ4OGMsIDB4MDEwOCwgMHhjMGY1LCAweGE4NmEsIDB4ZDg5YywgMHgxMTEwLCAweDA4MGMsIDB4MzI0MCwKKwkweDYwMjMsIDB4MDAwMSwgMHg5MDA2LCAweDA4MGMsIDB4NjVjZiwgMHhkODljLCAweDAxMzgsIDB4MjAwMSwKKwkweDAwMDQsIDB4MDgwYywgMHg2NWUzLCAweDIwMDksIDB4MDAwMywgMHgwMDMwLCAweDIwMDEsIDB4MDAwMiwKKwkweDA4MGMsIDB4NjVlMywgMHgyMDA5LCAweDAwMDIsIDB4MDgwYywgMHhhZDRkLCAweDc4YTgsIDB4ZDA5NCwKKwkweDAxMzgsIDB4MDBlZSwgMHg3MDI0LCAweDAwZTYsIDB4MjA1OCwgMHhiOGQ0LCAweGMwOGQsIDB4YjhkNiwKKwkweDkwODUsIDB4MDAwMSwgMHgwMGVlLCAweDAwY2UsIDB4MDBiZSwgMHgwMDFlLCAweDAxMmUsIDB4MTEyMCwKKwkweDIwMDksIDB4MDAwMywgMHgwODA0LCAweDM1ZWEsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NDllOSwKKwkweDAwMDUsIDB4YTgzMCwgMHg5MDg2LCAweDAxMDAsIDB4NzAyNCwgMHgyMDU4LCAweDExMzgsIDB4MjAwOSwKKwkweDAwMDQsIDB4YmEwNCwgMHg5Mjk0LCAweDAwZmYsIDB4MDgwNCwgMHg1NjhjLCAweDkwMGUsIDB4YTg2OCwKKwkweGQwZjQsIDB4MTkwNCwgMHgzNWI4LCAweDA4MGMsIDB4Njk4NiwgMHgxMTA4LCAweGMxODUsIDB4YjgwMCwKKwkweGQwYmMsIDB4MDEwOCwgMHhjMThkLCAweDA4MDQsIDB4MzViOCwgMHgwMGU2LCAweDAwZDYsIDB4MDA5NiwKKwkweDgzZmYsIDB4MDkwNCwgMHg0YTU0LCAweDkwMmUsIDB4MDgwYywgMHhhYmUyLCAweDAxMzAsIDB4OTAyNiwKKwkweDIwYTksIDB4MDgwMCwgMHgyMDcxLCAweDEwMDAsIDB4MDAzMCwgMHgyMDIxLCAweDAwN2YsIDB4MjBhOSwKKwkweDA3ODEsIDB4MjA3MSwgMHgxMDdmLCAweDJlMDQsIDB4OTAwNSwgMHgxMWI4LCAweDIxMDAsIDB4OTQwNiwKKwkweDE5MDQsIDB4NGE2NSwgMHgyNDI4LCAweDk0Y2UsIDB4MDA3ZiwgMHgxMTIwLCAweDkyY2UsIDB4ZmZmZCwKKwkweDE1NTgsIDB4MDAzMCwgMHg5NGNlLCAweDAwODAsIDB4MTEzMCwgMHg5MmNlLCAweGZmZmMsIDB4MTUyMCwKKwkweDkzY2UsIDB4MDBmZiwgMHgxNTA4LCAweGM1ZmQsIDB4MDQ4MCwgMHgyMDU4LCAweGJmMTAsIDB4MjcwMCwKKwkweDkzMDYsIDB4MTFlOCwgMHhiZTE0LCAweDI2MDAsIDB4OTIwNiwgMHgxMWM4LCAweDI0MDAsIDB4OTEwNiwKKwkweDExODAsIDB4ZDg4NCwgMHgwNTk4LCAweGQ4OTQsIDB4MTU4OCwgMHgwODBjLCAweDZhN2QsIDB4MTU3MCwKKwkweDIwMDEsIDB4NDAwMCwgMHgwNDYwLCAweDA4MGMsIDB4NmFkZCwgMHgxNTQwLCAweDIwMDEsIDB4NDAwMCwKKwkweDA0MzAsIDB4MjAwMSwgMHg0MDA3LCAweDA0MTgsIDB4MjAwMSwgMHg0MDA2LCAweDA0MDAsIDB4MjQwMCwKKwkweDkxMDYsIDB4MTE1OCwgMHhiZTE0LCAweDg3ZmYsIDB4MTEyOCwgMHg4NmZmLCAweDA5MTgsIDB4MDgwYywKKwkweGFiZTIsIDB4MTkwMCwgMHgyMDAxLCAweDQwMDgsIDB4MDA5MCwgMHg4NDIwLCAweDhlNzAsIDB4MWYwNCwKKwkweDRhMWIsIDB4ODVmZiwgMHgxMTMwLCAweDIwMDEsIDB4NDAwOSwgMHgwMDQ4LCAweDIwMDEsIDB4MDAwMSwKKwkweDAwMzAsIDB4MDgwYywgMHg2NjMyLCAweDFkZDAsIDB4YmIxMiwgMHhiYTE2LCAweDkwMDYsIDB4OTAwNSwKKwkweDAwOWUsIDB4MDBkZSwgMHgwMGVlLCAweDAwMDUsIDB4ODFmZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwMSwKKwkweDA4MDQsIDB4MzVlYSwgMHgwODBjLCAweDRhZjIsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwKKwkweDM1ZWEsIDB4YTg2NywgMHgwMDAwLCAweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweDc4ODQsIDB4OTAwNSwKKwkweDA5MDQsIDB4MzVlZCwgMHg5MDk2LCAweDAwZmYsIDB4MDEyMCwgMHg5MDkyLCAweDAwMDQsIDB4MWEwNCwKKwkweDM1ZWQsIDB4MjAxMCwgMHgyOTE4LCAweDA4MGMsIDB4MzFlMCwgMHgxMTIwLCAweDIwMDksIDB4MDAwMywKKwkweDA4MDQsIDB4MzVlYSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwgMHg0YWE3LCAweDAwMDUsIDB4YTgzMCwKKwkweDkwODYsIDB4MDEwMCwgMHgxOTA0LCAweDM1YjgsIDB4MjAwOSwgMHgwMDA0LCAweDA4MDQsIDB4MzVlYSwKKwkweDc5ODQsIDB4MDgwYywgMHhhYmUyLCAweDExMjAsIDB4OTE4MiwgMHgwMDdmLCAweDBhMDQsIDB4MzVlZCwKKwkweDkxODYsIDB4MDBmZiwgMHgwOTA0LCAweDM1ZWQsIDB4OTE4MiwgMHgwODAwLCAweDFhMDQsIDB4MzVlZCwKKwkweDIwMDEsIDB4OTQwMCwgMHgwODBjLCAweDU2ZTcsIDB4MTkwNCwgMHgzNWVhLCAweDA4MDQsIDB4MzViOCwKKwkweGE5OTgsIDB4MDgwYywgMHhhYmUyLCAweDExMTgsIDB4OTE4MiwgMHgwMDdmLCAweDAyODAsIDB4OTE4NiwKKwkweDAwZmYsIDB4MDE2OCwgMHg5MTgyLCAweDA4MDAsIDB4MTI1MCwgMHgyMDAxLCAweDk0MDAsIDB4MDgwYywKKwkweDU2ZTcsIDB4MTFhOCwgMHgwMDYwLCAweGE4OTcsIDB4NDAwNSwgMHhhOTlhLCAweDAwMTAsIDB4YTg5NywKKwkweDQwMDYsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwgMHgwMDMwLCAweDAwMDUsIDB4YTg5NywKKwkweDQwMDAsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwgMHgwMDAwLCAweDAwMDUsIDB4MjAwOSwKKwkweDAwMGEsIDB4MGM0OCwgMHgwODBjLCAweDEwNDcsIDB4MDE5OCwgMHg5MDA2LCAweGE4MDIsIDB4NzAxNCwKKwkweDkwMDUsIDB4MTEyMCwgMHgyOTAwLCAweDcwMTYsIDB4NzAxYSwgMHgwMDQwLCAweDcwMTgsIDB4YTgwMiwKKwkweDAwODYsIDB4MjA0MCwgMHgyOTAwLCAweGEwMDYsIDB4NzAxYSwgMHgwMDhlLCAweDkwODUsIDB4MDAwMSwKKwkweDAwMDUsIDB4Nzk4NCwgMHgwODBjLCAweDY2OTMsIDB4MTEzMCwgMHg3ZTg4LCAweDk2ODQsIDB4M2ZmZiwKKwkweDkwODIsIDB4NDAwMCwgMHgwMjA4LCAweDkwNWUsIDB4OGJmZiwgMHgwMDA1LCAweGE5OTgsIDB4MDgwYywKKwkweDY2OTMsIDB4MTEzMCwgMHhhZTljLCAweDk2ODQsIDB4M2ZmZiwgMHg5MDgyLCAweDQwMDAsIDB4MDIwOCwKKwkweDkwNWUsIDB4OGJmZiwgMHgwMDA1LCAweGFlOTgsIDB4MDAwOCwgMHg3ZTg0LCAweDI2MDgsIDB4MDgwYywKKwkweDY2OTMsIDB4MTEwOCwgMHgwMDA4LCAweDkwNWUsIDB4OGJmZiwgMHgwMDA1LCAweDAwMTYsIDB4NzExNCwKKwkweDgxZmYsIDB4MDEyOCwgMHgyMTQ4LCAweGE5MDQsIDB4MDgwYywgMHgxMDc5LCAweDBjYzgsIDB4NzExNiwKKwkweDcxMWEsIDB4MDAxZSwgMHgwMDA1LCAweDIwMzEsIDB4MDAwMSwgMHgwMDEwLCAweDIwMzEsIDB4MDAwMCwKKwkweDIwNjEsIDB4MThiOCwgMHgyYzQ0LCAweGE2NmEsIDB4YTE3YSwgMHhhNzcyLCAweGEwNzYsIDB4YTI4ZSwKKwkweGEzOTIsIDB4YTQ5NiwgMHhhNTlhLCAweDA4MGMsIDB4MTEzYywgMHg3MDA3LCAweDAwMDIsIDB4NzAxZiwKKwkweDM1YjgsIDB4MDAwNSwgMHgwMGY2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzksIDB4MDAwMCwKKwkweDIwMDEsIDB4MThiMCwgMHgyMDA0LCAweDkwMDUsIDB4MTE5MCwgMHgwZTA0LCAweDRiNmYsIDB4N2EzNiwKKwkweDc4MzMsIDB4MDAxMiwgMHg3YTgyLCAweDdiODYsIDB4N2M4YSwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwKKwkweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDE5MGMsIDB4MTFlZSwgMHgwODA0LCAweDRiZDUsIDB4MDAxNiwKKwkweDAwODYsIDB4MDA5NiwgMHgwMGM2LCAweDAwZTYsIDB4MjA3MSwgMHgxODllLCAweDcwNDQsIDB4OTAwNSwKKwkweDE1NDAsIDB4NzE0OCwgMHg5MTgyLCAweDAwMTAsIDB4MDI4OCwgMHg3MDM4LCAweDIwNjAsIDB4MDgwYywKKwkweDEwNDcsIDB4MDkwNCwgMHg0YmNkLCAweGE4NGIsIDB4MDAwMCwgMHgyOTAwLCAweDcwNDYsIDB4MjAwMSwKKwkweDAwMDIsIDB4OTA4MCwgMHgxZWFiLCAweDIwMDUsIDB4YTg0NiwgMHgwMDk4LCAweDcwMzgsIDB4OTBlMCwKKwkweDAwMDQsIDB4MjAwMSwgMHgxOGJhLCAweDljODIsIDB4MThmYSwgMHgwMjEwLCAweDIwNjEsIDB4MThiYSwKKwkweDJjMDAsIDB4NzAzYSwgMHg3MTQ4LCAweDgxZmYsIDB4MTEwOCwgMHg3MDNlLCAweDgxMDgsIDB4NzE0YSwKKwkweDA0NjAsIDB4NzE0OCwgMHg4MTA4LCAweDcxNGEsIDB4NzA0NCwgMHgyMDQwLCAweGExNDQsIDB4MjEwNSwKKwkweDAwMTYsIDB4OTA4YSwgMHgwMDM2LCAweDFhMGMsIDB4MGQ3ZCwgMHgyMDYwLCAweDAwMWUsIDB4ODEwOCwKKwkweDIxMDUsIDB4OTAwNSwgMHhhMTQ2LCAweDE1MjAsIDB4MDgwYywgMHgxMDQ3LCAweDExMzAsIDB4ODEwOSwKKwkweGE5NDYsIDB4NzE0OCwgMHg4MTA5LCAweDcxNGEsIDB4MDBkOCwgMHg5MDA2LCAweGE4MDYsIDB4YTg0YSwKKwkweGEwNDYsIDB4MjgwMCwgMHhhODAyLCAweDI5MDAsIDB4YTAwNiwgMHg3MDQ2LCAweDIwMDEsIDB4MDAwMiwKKwkweDkwODAsIDB4MWVhYiwgMHgyMDA1LCAweGE4NDYsIDB4MDA1OCwgMHgyMjYyLCAweDYzMDYsIDB4NjQwYSwKKwkweDAwZWUsIDB4MDBjZSwgMHgwMDllLCAweDAwOGUsIDB4MDAxZSwgMHgwMTJlLCAweDAwZmUsIDB4MDAwNSwKKwkweDJjMDAsIDB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4NGJmNywgMHg0YmY3LCAweDRiZjksIDB4NGJmNywKKwkweDRiZjcsIDB4NGJmNywgMHg0YmZkLCAweDRiZjcsIDB4NGJmNywgMHg0YmY3LCAweDRjMDEsIDB4NGJmNywKKwkweDRiZjcsIDB4NGJmNywgMHg0YzA1LCAweDRiZjcsIDB4NGJmNywgMHg0YmY3LCAweDRjMDksIDB4NGJmNywKKwkweDRiZjcsIDB4NGJmNywgMHg0YzBkLCAweDRiZjcsIDB4NGJmNywgMHg0YmY3LCAweDRjMTIsIDB4MDgwYywKKwkweDBkN2QsIDB4YTI3NiwgMHhhMzdhLCAweGE0N2UsIDB4MDg5OCwgMHhhMjg2LCAweGEzOGEsIDB4YTQ4ZSwKKwkweDA4NzgsIDB4YTI5NiwgMHhhMzlhLCAweGE0OWUsIDB4MDg1OCwgMHhhMmE2LCAweGEzYWEsIDB4YTRhZSwKKwkweDA4MzgsIDB4YTJiNiwgMHhhM2JhLCAweGE0YmUsIDB4MDgxOCwgMHhhMmM2LCAweGEzY2EsIDB4YTRjZSwKKwkweDA4MDQsIDB4NGJkMCwgMHhhMmQ2LCAweGEzZGEsIDB4YTRkZSwgMHgwODA0LCAweDRiZDAsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTg5ZSwgMHg3MDQ4LCAweDkwMDUsIDB4MDkwNCwgMHg0Y2E5LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MGUwNCwgMHg0Y2E4LCAweDAwZjYsIDB4MjA3OSwgMHgwMDAwLCAweDAwYzYsIDB4MDA5NiwKKwkweDAwODYsIDB4MDA3NiwgMHg5MDA2LCAweDIwMzgsIDB4NzA0MCwgMHgyMDQ4LCAweDkwMDUsIDB4MDUwMCwKKwkweGE5NDgsIDB4MjEwNSwgMHgwMDE2LCAweDkwOGEsIDB4MDAzNiwgMHgxYTBjLCAweDBkN2QsIDB4MjA2MCwKKwkweDAwMWUsIDB4ODEwOCwgMHgyMTA1LCAweDkwMDUsIDB4YTk0YSwgMHgxOTA0LCAweDRjYWIsIDB4YTgwNCwKKwkweDkwMDUsIDB4MDkwYywgMHgwZDdkLCAweDcwNDIsIDB4MjkzOCwgMHgyMDQwLCAweGEwMDMsIDB4MDAwMCwKKwkweDIwMDEsIDB4MDAwMiwgMHg5MDgwLCAweDFlYWIsIDB4MjAwNSwgMHhhMDRhLCAweDA4MDQsIDB4NGNhYiwKKwkweDcwM2MsIDB4MjA2MCwgMHgyYzE0LCAweDYzMDQsIDB4NjQwOCwgMHg2NTBjLCAweDIyMDAsIDB4NzgzNiwKKwkweDc4MzMsIDB4MDAxMiwgMHg3ODgyLCAweDIzMDAsIDB4Nzg4NiwgMHgyNDAwLCAweDc4OGEsIDB4MjA5MSwKKwkweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLCAweDExZWUsIDB4ODdmZiwKKwkweDAxMTgsIDB4Mjc0OCwgMHgwODBjLCAweDEwNzksIDB4NzA0OCwgMHg4MDAxLCAweDcwNGEsIDB4OTAwNSwKKwkweDExNzAsIDB4NzA0MCwgMHgyMDQ4LCAweDkwMDUsIDB4MDEyOCwgMHgwODBjLCAweDEwNzksIDB4OTAwNiwKKwkweDcwNDIsIDB4NzA0NiwgMHg3MDNiLCAweDE4YmEsIDB4NzAzZiwgMHgxOGJhLCAweDA0MjAsIDB4NzA0MCwKKwkweDkwMDUsIDB4MTUwOCwgMHg3MjM4LCAweDJjMDAsIDB4OTIwNiwgMHgwMTQ4LCAweDljODAsIDB4MDAwNCwKKwkweDkwZmEsIDB4MThmYSwgMHgwMjEwLCAweDIwMDEsIDB4MThiYSwgMHg3MDNlLCAweDAwYTAsIDB4OTAwNiwKKwkweDcwM2UsIDB4NzAzYSwgMHg3MDQ0LCAweDkwMDUsIDB4MDkwYywgMHgwZDdkLCAweDIwNDgsIDB4YTgwMCwKKwkweDkwMDUsIDB4MWRlMCwgMHgyOTAwLCAweDcwNDIsIDB4MjAwMSwgMHgwMDAyLCAweDkwODAsIDB4MWVhYiwKKwkweDIwMDUsIDB4YTg0YSwgMHgwMDAwLCAweDAwN2UsIDB4MDA4ZSwgMHgwMDllLCAweDAwY2UsIDB4MDBmZSwKKwkweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweDJjMDAsIDB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4NGNjYSwKKwkweDRjY2EsIDB4NGNjYywgMHg0Y2NhLCAweDRjY2EsIDB4NGNjYSwgMHg0Y2QxLCAweDRjY2EsIDB4NGNjYSwKKwkweDRjY2EsIDB4NGNkNiwgMHg0Y2NhLCAweDRjY2EsIDB4NGNjYSwgMHg0Y2RiLCAweDRjY2EsIDB4NGNjYSwKKwkweDRjY2EsIDB4NGNlMCwgMHg0Y2NhLCAweDRjY2EsIDB4NGNjYSwgMHg0Y2U1LCAweDRjY2EsIDB4NGNjYSwKKwkweDRjY2EsIDB4NGNlYSwgMHgwODBjLCAweDBkN2QsIDB4YWE3NCwgMHhhYjc4LCAweGFjN2MsIDB4MDgwNCwKKwkweDRjNTYsIDB4YWE4NCwgMHhhYjg4LCAweGFjOGMsIDB4MDgwNCwgMHg0YzU2LCAweGFhOTQsIDB4YWI5OCwKKwkweGFjOWMsIDB4MDgwNCwgMHg0YzU2LCAweGFhYTQsIDB4YWJhOCwgMHhhY2FjLCAweDA4MDQsIDB4NGM1NiwKKwkweGFhYjQsIDB4YWJiOCwgMHhhY2JjLCAweDA4MDQsIDB4NGM1NiwgMHhhYWM0LCAweGFiYzgsIDB4YWNjYywKKwkweDA4MDQsIDB4NGM1NiwgMHhhYWQ0LCAweGFiZDgsIDB4YWNkYywgMHgwODA0LCAweDRjNTYsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDAzNiwgMHgwMGI2LCAweDAwYzYsIDB4MjAwOSwgMHgwMDdlLCAweDA4MGMsIDB4NjY5MywKKwkweDIwMTksIDB4MDAwMSwgMHhiODVjLCAweGQwYWMsIDB4MDExMCwgMHgyMDE5LCAweDAwMDAsIDB4MjAxMSwKKwkweDgwMWIsIDB4MDgwYywgMHg0YjUyLCAweDAwY2UsIDB4MDBiZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMDUsIDB4MDAyNiwgMHgwODBjLCAweDU3M2UsIDB4ZDBjNCwgMHgwMTIwLCAweDIwMTEsIDB4ODAxNCwKKwkweDA4MGMsIDB4NGI1MiwgMHgwMDJlLCAweDAwMDUsIDB4ODFmZiwgMHgxOTA0LCAweDM1ZWEsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHg2MDMwLCAweGMwOGQsIDB4YzA4NSwgMHhjMGFjLCAweDYwMzIsIDB4MDgwYywKKwkweDc1M2QsIDB4MTE1OCwgMHgwODBjLCAweDc4NDAsIDB4MDgwYywgMHg2MDkyLCAweDkwODUsIDB4MDAwMSwKKwkweDA4MGMsIDB4NzU4NCwgMHgwODBjLCAweDc0NmUsIDB4MDAxMCwgMHgwODBjLCAweDVmNGQsIDB4MDEyZSwKKwkweDA4MDQsIDB4MzViOCwgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MDQsIDB4MzVlYSwKKwkweDA4MGMsIDB4NTc1MiwgMHgwMTIwLCAweDIwMDksIDB4MDAwNywgMHgwODA0LCAweDM1ZWEsIDB4MDgwYywKKwkweDZhZDUsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDgsIDB4MDgwNCwgMHgzNWVhLCAweDc5ODQsIDB4MDgwYywKKwkweDY2MzIsIDB4MTkwNCwgMHgzNWVkLCAweDA4MGMsIDB4NGIyNSwgMHgwOTA0LCAweDM1ZWQsIDB4MmIwMCwKKwkweDcwMjYsIDB4MDgwYywgMHg2YWRkLCAweDc4ODgsIDB4MTE3MCwgMHg5MDg0LCAweDAwMDUsIDB4MTE1OCwKKwkweDkwMGUsIDB4MDgwYywgMHg2OTg2LCAweDExMDgsIDB4YzE4NSwgMHhiODAwLCAweGQwYmMsIDB4MDEwOCwKKwkweGMxOGQsIDB4MDgwNCwgMHgzNWI4LCAweDA4MGMsIDB4NGFmMiwgMHgwOTA0LCAweDM1ZWEsIDB4OTAwNiwKKwkweGE4NjYsIDB4YTgzMiwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHgwODBjLCAweGNiYjMsIDB4MDkwNCwKKwkweDM1ZWEsIDB4Nzg4OCwgMHhkMDk0LCAweDAxMTgsIDB4YjhkNCwgMHhjMDhkLCAweGI4ZDYsIDB4NzAwNywKKwkweDAwMDMsIDB4NzAxZiwgMHg0ZGM1LCAweDAwMDUsIDB4MjA2MSwgMHgxODAwLCAweDA4MGMsIDB4NTc1MiwKKwkweDIwMDksIDB4MDAwNywgMHgxNTYwLCAweDA4MGMsIDB4NmFkNSwgMHgwMTE4LCAweDIwMDksIDB4MDAwOCwKKwkweDA0MzAsIDB4YTk5OCwgMHgwODBjLCAweDY2MzIsIDB4MTUzMCwgMHgwODBjLCAweDRiMjMsIDB4MDUxOCwKKwkweDA4MGMsIDB4NmFkZCwgMHhhODljLCAweDExNjgsIDB4OTA4NCwgMHgwMDA1LCAweDExNTAsIDB4OTAwZSwKKwkweDA4MGMsIDB4Njk4NiwgMHgxMTA4LCAweGMxODUsIDB4YjgwMCwgMHhkMGJjLCAweDAxMDgsIDB4YzE4ZCwKKwkweDAwZDAsIDB4YTg2OCwgMHhjMGZjLCAweGE4NmEsIDB4MDgwYywgMHhjYmIzLCAweDExZTAsIDB4YTg5YywKKwkweGQwOTQsIDB4MDExOCwgMHhiOGQ0LCAweGMwOGQsIDB4YjhkNiwgMHgyMDA5LCAweDAwMDMsIDB4YTg5NywKKwkweDQwMDUsIDB4YTk5YSwgMHgwMDEwLCAweGE4OTcsIDB4NDAwNiwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwKKwkweDIwMDEsIDB4MDAzMCwgMHgwMDA1LCAweGE4OTcsIDB4NDAwMCwgMHhhOTlhLCAweDkwMDYsIDB4OTE4ZCwKKwkweDAwMDEsIDB4MjAwOCwgMHgwMDA1LCAweDkwMDYsIDB4MDAwNSwgMHhhODMwLCAweDkwODYsIDB4MDEwMCwKKwkweDcwMjQsIDB4MjA1OCwgMHgxMTEwLCAweDA4MDQsIDB4NTY4YywgMHg5MDBlLCAweDA4MGMsIDB4Njk4NiwKKwkweDExMDgsIDB4YzE4NSwgMHhiODAwLCAweGQwYmMsIDB4MDEwOCwgMHhjMThkLCAweDA4MDQsIDB4MzViOCwKKwkweDA4MGMsIDB4NTc1MiwgMHgwMTIwLCAweDIwMDksIDB4MDAwNywgMHgwODA0LCAweDM1ZWEsIDB4N2Y4NCwKKwkweDdhOGMsIDB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4MDgwYywgMHg0YWYyLCAweDExMjAsIDB4MjAwOSwKKwkweDAwMDIsIDB4MDgwNCwgMHgzNWVhLCAweDkwMGUsIDB4MjEzMCwgMHg3MTI2LCAweDcxMzIsIDB4YTg2MCwKKwkweDIwZTgsIDB4NzAzNiwgMHhhODVjLCAweDkwODAsIDB4MDAwNSwgMHg3MDJhLCAweDIwYTAsIDB4MDgwYywKKwkweDY2OTMsIDB4MTkwNCwgMHg0ZTY3LCAweDA4MGMsIDB4NmFkZCwgMHgwMTM4LCAweDA4MGMsIDB4NmFlNSwKKwkweDAxMjAsIDB4MDgwYywgMHg2YTdkLCAweDE5MDQsIDB4NGU2NywgMHhkNzk0LCAweDExMTAsIDB4ZDc4NCwKKwkweDAxYTgsIDB4YjhjNCwgMHgyMGUwLCAweGI4YzgsIDB4OTA4MCwgMHgwMDA2LCAweDIwOTgsIDB4MzQwMCwKKwkweGQ3OTQsIDB4MDE2MCwgMHgyMGE5LCAweDAwMDgsIDB4NDAwMywgMHgyMDk4LCAweDIwYTAsIDB4M2QwMCwKKwkweDIwZTAsIDB4MjBhOSwgMHgwMDAyLCAweDA4MGMsIDB4NDhmMSwgMHgwMDQ4LCAweDIwYTksIDB4MDAwNCwKKwkweDQwMDMsIDB4MjA5OCwgMHgyMGEwLCAweDNkMDAsIDB4MjBlMCwgMHgwODBjLCAweDQ4ZjEsIDB4OTE4NiwKKwkweDAwN2UsIDB4MDE3MCwgMHg5MTg2LCAweDAwODAsIDB4MDE1OCwgMHgwODBjLCAweDZhZGQsIDB4OTBjMiwKKwkweDAwMDYsIDB4MTIxMCwgMHhjMWZkLCAweDAwMjAsIDB4MDgwYywgMHg2OTg2LCAweDExMDgsIDB4YzFmZCwKKwkweDQxMDQsIDB4YzFmYywgMHhkNzk0LCAweDA1MjgsIDB4YjhjNCwgMHgyMGUwLCAweGI4YzgsIDB4MjA2MCwKKwkweDljODAsIDB4MDAwMCwgMHgyMDk4LCAweDIwYTksIDB4MDAwMiwgMHg0MDAzLCAweDljODAsIDB4MDAwMywKKwkweDIwOTgsIDB4MjBhOSwgMHgwMDAxLCAweDQwMDUsIDB4OWM4MCwgMHgwMDA0LCAweDIwOTgsIDB4MzQwMCwKKwkweDIwYTksIDB4MDAwMiwgMHg0MDAzLCAweDIwOTgsIDB4MjBhMCwgMHgzZDAwLCAweDIwZTAsIDB4MDgwYywKKwkweDQ4ZTQsIDB4OWM4MCwgMHgwMDI2LCAweDIwOTgsIDB4YjhjNCwgMHgyMGUwLCAweDIwYTksIDB4MDAwMiwKKwkweDQwMDMsIDB4ZDc5NCwgMHgwMTEwLCAweDk2YjAsIDB4MDAwYiwgMHg5NmIwLCAweDAwMDUsIDB4ODEwOCwKKwkweDA4MGMsIDB4YWJlMiwgMHgwMTE4LCAweDkxODYsIDB4MDgwMCwgMHgwMDQwLCAweGQ3OGMsIDB4MDEyMCwKKwkweDkxODYsIDB4MDgwMCwgMHgwMTcwLCAweDAwMTgsIDB4OTE4NiwgMHgwMDdlLCAweDAxNTAsIDB4ZDc5NCwKKwkweDAxMTgsIDB4OTY4NiwgMHgwMDIwLCAweDAwMTAsIDB4OTY4NiwgMHgwMDI4LCAweDAxNTAsIDB4MDgwNCwKKwkweDRkZjcsIDB4ODZmZiwgMHgxMTIwLCAweDcxMjQsIDB4ODEwYiwgMHgwODA0LCAweDM1YjgsIDB4NzAzMywKKwkweDAwMDEsIDB4NzEyMiwgMHg3MDI0LCAweDk2MDAsIDB4NzAyNiwgMHg3NzJlLCAweDIwNjEsIDB4MThiOCwKKwkweDJjNDQsIDB4YTA2YiwgMHgwMDAwLCAweGE2N2EsIDB4NzAzNCwgMHhhMDcyLCAweDcwMjgsIDB4YTA3NiwKKwkweGEyOGUsIDB4YTM5MiwgMHhhNDk2LCAweGE1OWEsIDB4MDgwYywgMHgxMTNjLCAweDcwMDcsIDB4MDAwMiwKKwkweDcwMWYsIDB4NGVhMywgMHgwMDA1LCAweDcwMzAsIDB4OTAwNSwgMHgxMTgwLCAweDcxMjAsIDB4NzAyOCwKKwkweDIwYTAsIDB4NzcyYywgMHg5MDM2LCAweDcwMzQsIDB4MjBlOCwgMHgyMDYxLCAweDE4YjgsIDB4MmM0NCwKKwkweGEyOGMsIDB4YTM5MCwgMHhhNDk0LCAweGE1OTgsIDB4MDgwNCwgMHg0ZGY3LCAweDcxMjQsIDB4ODEwYiwKKwkweDA4MDQsIDB4MzViOCwgMHgyMDI5LCAweDAwN2UsIDB4Nzk4NCwgMHg3YTg4LCAweDdiOGMsIDB4N2M5OCwKKwkweDkxODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwZTIsIDB4MDAyMCwgMHgwYTA0LCAweDM1ZWQsIDB4OTUwMiwKKwkweDBhMDQsIDB4MzVlZCwgMHg5MTg0LCAweDAwZmYsIDB4OTBlMiwgMHgwMDIwLCAweDBhMDQsIDB4MzVlZCwKKwkweDk1MDIsIDB4MGEwNCwgMHgzNWVkLCAweDkyODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwZTIsIDB4MDAyMCwKKwkweDBhMDQsIDB4MzVlZCwgMHg5NTAyLCAweDBhMDQsIDB4MzVlZCwgMHg5Mjg0LCAweDAwZmYsIDB4OTBlMiwKKwkweDAwMjAsIDB4MGEwNCwgMHgzNWVkLCAweDk1MDIsIDB4MGEwNCwgMHgzNWVkLCAweDkzODQsIDB4ZmYwMCwKKwkweDgwMDcsIDB4OTBlMiwgMHgwMDIwLCAweDBhMDQsIDB4MzVlZCwgMHg5NTAyLCAweDBhMDQsIDB4MzVlZCwKKwkweDkzODQsIDB4MDBmZiwgMHg5MGUyLCAweDAwMjAsIDB4MGEwNCwgMHgzNWVkLCAweDk1MDIsIDB4MGEwNCwKKwkweDM1ZWQsIDB4OTQ4NCwgMHhmZjAwLCAweDgwMDcsIDB4OTBlMiwgMHgwMDIwLCAweDBhMDQsIDB4MzVlZCwKKwkweDk1MDIsIDB4MGEwNCwgMHgzNWVkLCAweDk0ODQsIDB4MDBmZiwgMHg5MGUyLCAweDAwMjAsIDB4MGEwNCwKKwkweDM1ZWQsIDB4OTUwMiwgMHgwYTA0LCAweDM1ZWQsIDB4MjA2MSwgMHgxOTg4LCAweDYxMDIsIDB4NjIwNiwKKwkweDYzMGEsIDB4NjQwZSwgMHgwODA0LCAweDM1YjgsIDB4MDgwYywgMHg0YWYyLCAweDA5MDQsIDB4MzVlYSwKKwkweDIwMDksIDB4MDAxNiwgMHg3YThjLCAweDdiODgsIDB4N2M5YywgMHg3ZDk4LCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMTksIDB4YWY2MCwgMHgwODBjLCAweDRiM2IsIDB4NzAxZiwgMHg0ZjI3LCAweDAwMDUsIDB4MjAwMSwKKwkweDAxMzgsIDB4MjAwMywgMHgwMDAwLCAweDAwZTYsIDB4MjA3MSwgMHgwMzAwLCAweDcwMWMsIDB4ZDBhNCwKKwkweDFkZTgsIDB4MDBlZSwgMHgyMGE5LCAweDAwMTYsIDB4ODk2ZSwgMHg4ZDZlLCAweDhkNmYsIDB4OWQ4NCwKKwkweGZmYzAsIDB4OTA4MCwgMHgwMDE5LCAweDIwOTgsIDB4OWQ4NCwgMHgwMDNmLCAweDIwZTAsIDB4MjA2OSwKKwkweDE4NzcsIDB4MjBlOSwgMHgwMDAxLCAweDJkYTAsIDB4NDAwMywgMHg2ODAwLCAweDkwMDUsIDB4MDkwNCwKKwkweDRmYTgsIDB4NjgwNCwgMHgyMDA4LCAweDkxOGMsIDB4ZmZmOCwgMHgxOTA0LCAweDRmYTgsIDB4NjgwYywKKwkweDkwMDUsIDB4MDkwNCwgMHg0ZmE4LCAweDkwODIsIDB4ZmYwMSwgMHgxYTA0LCAweDRmYTgsIDB4NjgxMCwKKwkweDkwODIsIDB4MDA1YywgMHgwYTA0LCAweDRmYTgsIDB4NjgyNCwgMHgyMDA4LCAweDkwODIsIDB4MDAwOCwKKwkweDBhMDQsIDB4NGZhOCwgMHg5MTgyLCAweDA0MDAsIDB4MWEwNCwgMHg0ZmE4LCAweDAwNTYsIDB4MjAyOSwKKwkweDAwMDAsIDB4MDgwYywgMHg4ZGExLCAweDAwNWUsIDB4Njk0NCwgMHg2ODIwLCAweDkxMDIsIDB4MDZjMCwKKwkweDY4MjAsIDB4OTA4MiwgMHgwMDE5LCAweDE2YTAsIDB4NjgyOCwgMHg2OTQ0LCAweDgxMGMsIDB4OTEwMiwKKwkweDA2NzgsIDB4Njg0MCwgMHg5MDgyLCAweDAwMGYsIDB4MTY1OCwgMHgwODBjLCAweDEwNjAsIDB4MjkwMCwKKwkweDA5MDQsIDB4NGZjNCwgMHg2ODRlLCAweDAwZTYsIDB4MjA3MSwgMHgxOTMwLCAweDAwYjYsIDB4MjA1OSwKKwkweDAwMDAsIDB4MDgwYywgMHg4YzVkLCAweDAwYmUsIDB4MDBlZSwgMHgwNTY4LCAweDA4MGMsIDB4ODlhZCwKKwkweDA4MGMsIDB4ODlmOCwgMHgxMWUwLCAweDY4NTcsIDB4MDAwMCwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwKKwkweDYxMDQsIDB4OTE4ZCwgMHgyMDAwLCAweDYxMDYsIDB4NmIxMCwgMHgyMDYxLCAweDFhNmEsIDB4NjMwYSwKKwkweDAwY2UsIDB4MDgwYywgMHgyNzc5LCAweDIwMDEsIDB4MDEzOCwgMHgyMTAyLCAweDA4MDQsIDB4MzViOCwKKwkweDA4MGMsIDB4Mjc3OSwgMHgyMDAxLCAweDAxMzgsIDB4MjEwMiwgMHgwODA0LCAweDM1ZWQsIDB4MDgwYywKKwkweDg5ZjEsIDB4MDBlNiwgMHgyMDcxLCAweDE5MzAsIDB4MDgwYywgMHg4ZTIxLCAweDA4MGMsIDB4OGUzMCwKKwkweDA4MGMsIDB4OGM0NCwgMHgwMGVlLCAweDIwMDEsIDB4MTg4YSwgMHgyMDRjLCAweDA4MGMsIDB4MTA3OSwKKwkweDIwMDEsIDB4MTg4YSwgMHgyMDAzLCAweDAwMDAsIDB4MDgwYywgMHgyNzc5LCAweDIwMDEsIDB4MDEzOCwKKwkweDIxMDIsIDB4MDgwNCwgMHgzNWVhLCAweDIwMDEsIDB4MTkyNCwgMHgyMDBjLCAweDkxOGUsIDB4MDAwMCwKKwkweDA5MDQsIDB4NTAyNSwgMHgwODBjLCAweDhjM2YsIDB4MDkwNCwgMHg1MDI1LCAweDIwMDEsIDB4MDEwMSwKKwkweDIwMGMsIDB4OTE4YywgMHhkZmZmLCAweDIxMDIsIDB4MjAwMSwgMHgwMTM4LCAweDIwMDMsIDB4MDAwMCwKKwkweDAwZTYsIDB4MjA3MSwgMHgwMzAwLCAweDcwMWMsIDB4ZDBhNCwgMHgxZGU4LCAweDAwZWUsIDB4MDgwYywKKwkweDhjNDQsIDB4MjAwMSwgMHgwMDM1LCAweDA4MGMsIDB4MTZhMCwgMHgwMGM2LCAweDIwNjEsIDB4MTkzYywKKwkweDYwMDQsIDB4NjEwMCwgMHg5MTA2LCAweDFkZTAsIDB4MDBjZSwgMHgwODBjLCAweDI3NzksIDB4MjAwMSwKKwkweDAxMzgsIDB4MjEwMiwgMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwgMHgxOTIzLCAweDA4MGMsIDB4OGI3ZSwKKwkweDAxMjAsIDB4MmYwMCwgMHgwODBjLCAweDhjMGEsIDB4MGNjOCwgMHgwMGZlLCAweDAwZWUsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDAxLCAweDE4OGEsIDB4MjAwYywgMHg4MWZmLCAweDAxMzgsIDB4MjE0OCwKKwkweDA4MGMsIDB4MTA3OSwgMHgyMDAxLCAweDE4OGEsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MTgzZCwKKwkweDIwMDMsIDB4MDAyMCwgMHgwODBjLCAweDg5ZjEsIDB4MDBlNiwgMHgyMDcxLCAweDE5MzAsIDB4MDgwYywKKwkweDhlMjEsIDB4MDgwYywgMHg4ZTMwLCAweDAwZWUsIDB4MDEyZSwgMHgwODA0LCAweDM1YjgsIDB4MDAwNiwKKwkweDA4MGMsIDB4NTczZSwgMHhkMGNjLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDA4MGMsIDB4NTc0MiwKKwkweGQwYmMsIDB4MDAwZSwgMHgwMDA1LCAweDYxNzQsIDB4N2E4NCwgMHg2MzAwLCAweDgyZmYsIDB4MTExOCwKKwkweDc5ODYsIDB4MDgwNCwgMHgzNWI4LCAweDgzZmYsIDB4MTkwNCwgMHgzNWVkLCAweDIwMDEsIDB4ZmZmMCwKKwkweDkyMDAsIDB4MWEwNCwgMHgzNWVkLCAweDIwMTksIDB4ZmZmZiwgMHg2MDc4LCAweDkzMDIsIDB4OTIwMCwKKwkweDBhMDQsIDB4MzVlZCwgMHg3OTg2LCAweDYyNzYsIDB4MDgwNCwgMHgzNWI4LCAweDA4MGMsIDB4NTc1MiwKKwkweDE5MDQsIDB4MzVlYSwgMHg3Yzg4LCAweDdkODQsIDB4N2U5OCwgMHg3ZjhjLCAweDA4MGMsIDB4NGFmMiwKKwkweDA5MDQsIDB4MzVlYSwgMHg5MDBlLCAweDkwMWUsIDB4NzMyNiwgMHg3MzMyLCAweGE4NjAsIDB4MjBlOCwKKwkweDcwMzYsIDB4YTg1YywgMHg5MDgwLCAweDAwMDMsIDB4NzAyYSwgMHgyMGEwLCAweDkxZDgsIDB4MTAwMCwKKwkweDJiNWMsIDB4OGJmZiwgMHgwMTc4LCAweDA4MGMsIDB4NmFkZCwgMHgwMTE4LCAweDA4MGMsIDB4NmFlNSwKKwkweDExNDgsIDB4MjBhOSwgMHgwMDAxLCAweGI4MTQsIDB4NDAwNCwgMHhiODEwLCAweDQwMDQsIDB4NDEwNCwKKwkweDkzOTgsIDB4MDAwMywgMHg4MTA4LCAweDkxODIsIDB4MDgwMCwgMHgwMTIwLCAweDkzODYsIDB4MDAzYywKKwkweDAxNzAsIDB4MGMyMCwgMHg4M2ZmLCAweDExNDgsIDB4NzIyNCwgMHg5MDBlLCAweDIwMDEsIDB4MDAwMywKKwkweDA4MGMsIDB4OTFmOCwgMHgyMjA4LCAweDA4MDQsIDB4MzViOCwgMHg3MDMzLCAweDAwMDEsIDB4NzEyMiwKKwkweDcwMjQsIDB4OTMwMCwgMHg3MDI2LCAweDIwNjEsIDB4MThiOCwgMHgyYzQ0LCAweGEwNmIsIDB4MDAwMCwKKwkweGEzN2EsIDB4NzAyOCwgMHhhMDc2LCAweDcwMzQsIDB4YTA3MiwgMHhhNDhlLCAweGE1OTIsIDB4YTY5NiwKKwkweGE3OWEsIDB4MDgwYywgMHgxMTNjLCAweDcwMDcsIDB4MDAwMiwgMHg3MDFmLCAweDUwYTgsIDB4MDAwNSwKKwkweDcwMzAsIDB4OTAwNSwgMHgxMTc4LCAweDcxMjAsIDB4NzAyOCwgMHgyMGEwLCAweDkwMWUsIDB4NzAzNCwKKwkweDIwZTgsIDB4MjA2MSwgMHgxOGI4LCAweDJjNDQsIDB4YTQ4YywgMHhhNTkwLCAweGE2OTQsIDB4YTc5OCwKKwkweDA4MDQsIDB4NTA2NiwgMHg3MjI0LCAweDkwMGUsIDB4MjAwMSwgMHgwMDAzLCAweDA4MGMsIDB4OTFmOCwKKwkweDIyMDgsIDB4MDgwNCwgMHgzNWI4LCAweDAwZjYsIDB4MDBlNiwgMHgwODBjLCAweDU3NTIsIDB4MjAwOSwKKwkweDAwMDcsIDB4MTkwNCwgMHg1MTNiLCAweDIwNzEsIDB4MTg5ZSwgMHg3NDVjLCAweDg0ZmYsIDB4MjAwOSwKKwkweDAwMGUsIDB4MTkwNCwgMHg1MTNiLCAweGFjOWMsIDB4YWQ5OCwgMHhhZWE0LCAweGFmYTAsIDB4MDA5NiwKKwkweDA4MGMsIDB4MTA2MCwgMHgyMDA5LCAweDAwMDIsIDB4MDkwNCwgMHg1MTNiLCAweDI5MDAsIDB4NzA1ZSwKKwkweDkwMGUsIDB4OTAxZSwgMHg3MzU2LCAweDczNjIsIDB4YTg2MCwgMHg3MDY2LCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMDMsIDB4NzA1YSwgMHgyMGEwLCAweDkxZDgsIDB4MTAwMCwgMHgyYjVjLCAweDhiZmYsIDB4MDE3OCwKKwkweDA4MGMsIDB4NmFkZCwgMHgwMTE4LCAweDA4MGMsIDB4NmFlNSwgMHgxMTQ4LCAweGI4MTQsIDB4MjBhOSwKKwkweDAwMDEsIDB4NDAwNCwgMHhiODEwLCAweDQwMDQsIDB4NDEwNCwgMHg5Mzk4LCAweDAwMDMsIDB4ODEwOCwKKwkweDkxODIsIDB4MDgwMCwgMHgwMTIwLCAweDkzODYsIDB4MDAzYywgMHgwMWU4LCAweDBjMjAsIDB4ODNmZiwKKwkweDExYzAsIDB4NzI1NCwgMHg5MDBlLCAweDIwMDEsIDB4MDAwMywgMHgwODBjLCAweDkxZjgsIDB4MjIwOCwKKwkweDAwOWUsIDB4YTg5NywgMHg0MDAwLCAweGE5OWEsIDB4NzE1YywgMHg4MWZmLCAweDA5MGMsIDB4MGQ3ZCwKKwkweDIxNDgsIDB4MDgwYywgMHgxMDc5LCAweDkwMDYsIDB4NzA1ZSwgMHg5MThkLCAweDAwMDEsIDB4MjAwOCwKKwkweDA0MTgsIDB4NzA2MywgMHgwMDAxLCAweDcxNTIsIDB4NzA1NCwgMHg5MzAwLCAweDcwNTYsIDB4MjA2MSwKKwkweDE4YjksIDB4MmM0NCwgMHhhMzdhLCAweDcwNTgsIDB4YTA3NiwgMHg3MDY0LCAweGEwNzIsIDB4YTQ4ZSwKKwkweGE1OTIsIDB4YTY5NiwgMHhhNzlhLCAweGEwOWYsIDB4NTE0NywgMHgwMDBlLCAweGEwYTIsIDB4MDgwYywKKwkweDExM2MsIDB4OTAwNiwgMHgwMDQ4LCAweDAwOWUsIDB4YTg5NywgMHg0MDA1LCAweGE5OWEsIDB4OTAwZSwKKwkweDkwODUsIDB4MDAwMSwgMHgyMDAxLCAweDAwMzAsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwKKwkweGEwYTAsIDB4OTA0ZCwgMHgwOTBjLCAweDBkN2QsIDB4MDBlNiwgMHgyMDcxLCAweDE4OWUsIDB4YTA2YywKKwkweDkwOGUsIDB4MDEwMCwgMHgwMTM4LCAweGE4N2IsIDB4MDAzMCwgMHhhODgzLCAweDAwMDAsIDB4YTg5NywKKwkweDQwMDIsIDB4MDBkOCwgMHg3MDYwLCAweDkwMDUsIDB4MTE1OCwgMHg3MTUwLCAweDcwNTgsIDB4MjBhMCwKKwkweDkwMWUsIDB4NzA2NCwgMHgyMGU4LCAweGE0OGMsIDB4YTU5MCwgMHhhNjk0LCAweGE3OTgsIDB4MDQyOCwKKwkweGE4N2IsIDB4MDAwMCwgMHhhODgzLCAweDAwMDAsIDB4YTg5NywgMHg0MDAwLCAweDcyNTQsIDB4OTAwZSwKKwkweDIwMDEsIDB4MDAwMywgMHgwODBjLCAweDkxZjgsIDB4YWE5YSwgMHg3MTVjLCAweDgxZmYsIDB4MDkwYywKKwkweDBkN2QsIDB4MjE0OCwgMHgwODBjLCAweDEwNzksIDB4NzA1ZiwgMHgwMDAwLCAweGEwYTAsIDB4MjA0OCwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NmRlZSwgMHgwMTJlLCAweGEwOWYsIDB4MDAwMCwKKwkweGEwYTMsIDB4MDAwMCwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHg5MWQ4LCAweDEwMDAsIDB4MmI1YywKKwkweDhiZmYsIDB4MDE3OCwgMHgwODBjLCAweDZhZGQsIDB4MDExOCwgMHgwODBjLCAweDZhZTUsIDB4MTE0OCwKKwkweGI4MTQsIDB4MjBhOSwgMHgwMDAxLCAweDQwMDQsIDB4YjgxMCwgMHg0MDA0LCAweDQxMDQsIDB4OTM5OCwKKwkweDAwMDMsIDB4ODEwOCwgMHg5MTgyLCAweDA4MDAsIDB4MDEyMCwgMHg5Mzg2LCAweDAwM2MsIDB4MDUxOCwKKwkweDBjMjAsIDB4ODNmZiwgMHgxMWYwLCAweDcxNTQsIDB4ODEwYywgMHhhOTlhLCAweGE4OTcsIDB4NDAwMCwKKwkweDcxNWMsIDB4ODFmZiwgMHgwOTBjLCAweDBkN2QsIDB4MjE0OCwgMHgwODBjLCAweDEwNzksIDB4OTAwNiwKKwkweDcwNWUsIDB4OTE4ZCwgMHgwMDAxLCAweDIwMDgsIDB4YTBhMCwgMHgyMDQ4LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDgwYywgMHg2ZGVlLCAweDAxMmUsIDB4YTA5ZiwgMHgwMDAwLCAweGEwYTMsIDB4MDAwMCwKKwkweDAwNzAsIDB4NzA2MywgMHgwMDAxLCAweDcxNTIsIDB4NzA1NCwgMHg5MzAwLCAweDcwNTYsIDB4YTM3YSwKKwkweGE0OGUsIDB4YTU5MiwgMHhhNjk2LCAweGE3OWEsIDB4MDgwYywgMHgxMTNjLCAweDkwMDYsIDB4MDBlZSwKKwkweDAwMDUsIDB4MDA5NiwgMHhhODhjLCAweDkwYmUsIDB4NzAwMCwgMHgwMTQ4LCAweDkwYmUsIDB4NzEwMCwKKwkweDAxMzAsIDB4OTBiZSwgMHg3MjAwLCAweDAxMTgsIDB4MDA5ZSwgMHgwODA0LCAweDM1ZWQsIDB4YTg4NCwKKwkweGE5ODgsIDB4MDgwYywgMHgyNjYxLCAweDE1MTgsIDB4MDgwYywgMHg2NjMyLCAweDE1MDAsIDB4NzEyNiwKKwkweGJlMTIsIDB4YmQxNiwgMHhhZTdjLCAweDA4MGMsIDB4NGFmMiwgMHgwMWM4LCAweDA4MGMsIDB4NGFmMiwKKwkweDAxYjAsIDB4MDA5ZSwgMHhhODY3LCAweDAwMDAsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4YTgyMywKKwkweDAwMDAsIDB4YTgwNCwgMHgyMDQ4LCAweDA4MGMsIDB4Y2IyYywgMHgxMTIwLCAweDIwMDksIDB4MDAwMywKKwkweDA4MDQsIDB4MzVlYSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwgMHg1MjE0LCAweDAwMDUsIDB4MDA5ZSwKKwkweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDM1ZWEsIDB4NzEyNCwgMHgwODBjLCAweDMzNDksIDB4YTgyMCwKKwkweDkwODYsIDB4ODAwMSwgMHgxMTIwLCAweDIwMDksIDB4MDAwNCwgMHgwODA0LCAweDM1ZWEsIDB4MjkwMCwKKwkweDcwMjIsIDB4YTgwNCwgMHgwMDk2LCAweDIwNDgsIDB4ODkwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTBiYywKKwkweDAwM2YsIDB4OTA4NCwgMHhmZmMwLCAweDAwOWUsIDB4OTA4MCwgMHgwMDAyLCAweDAwNzYsIDB4MDAwNiwKKwkweDIwOTgsIDB4MjBhMCwgMHgyN2UwLCAweDI3ZTgsIDB4MjBhOSwgMHgwMDJhLCAweDA4MGMsIDB4MGZjNCwKKwkweGFhNmMsIDB4YWI3MCwgMHhhYzc0LCAweGFkNzgsIDB4MjA2MSwgMHgxOGI4LCAweDJjNDQsIDB4YTA2YiwKKwkweDAwMDAsIDB4YWU2NCwgMHhhZjhjLCAweDk3YzYsIDB4NzAwMCwgMHgwMTE4LCAweDk3YzYsIDB4NzEwMCwKKwkweDExNDgsIDB4OTZjMiwgMHgwMDA0LCAweDA2MDAsIDB4MjAwOSwgMHgwMDA0LCAweDAwMGUsIDB4MDA3ZSwKKwkweDA4MDQsIDB4NGIzZSwgMHg5N2M2LCAweDcyMDAsIDB4MTFiOCwgMHg5NmMyLCAweDAwNTQsIDB4MDJhMCwKKwkweDAwMGUsIDB4MDA3ZSwgMHgyMDYxLCAweDE4YjgsIDB4MmM0NCwgMHhhMDc2LCAweGE3NzIsIDB4YTA3YiwKKwkweDAwMmEsIDB4YTI4ZSwgMHhhMzkyLCAweGE0OTYsIDB4YTU5YSwgMHgwODBjLCAweDExM2MsIDB4NzAwNywKKwkweDAwMDIsIDB4NzAxZiwgMHg1MjcwLCAweDAwMDUsIDB4MDAwZSwgMHgwMDdlLCAweDA4MDQsIDB4MzVlZCwKKwkweDcwMjAsIDB4MjA0OCwgMHhhODA0LCAweDIwNDgsIDB4YTgwNCwgMHgyMDQ4LCAweDg5MDYsIDB4ODAwNiwKKwkweDgwMDcsIDB4OTBiYywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMDIsIDB4MjA5OCwKKwkweDIwYTAsIDB4MjdlMCwgMHgyN2U4LCAweDIwYTksIDB4MDAyYSwgMHgwODBjLCAweDBmYzQsIDB4MjEwMCwKKwkweDIyMzgsIDB4MjA2MSwgMHgxOGI4LCAweDJjNDQsIDB4YTI4YywgMHhhMzkwLCAweGE0OTQsIDB4YTU5OCwKKwkweDIwMDksIDB4MDAyYSwgMHgwODA0LCAweDRiM2UsIDB4ODFmZiwgMHgxOTA0LCAweDM1ZWEsIDB4Nzk4YywKKwkweDIwMDEsIDB4MTk3ZCwgMHg5MThjLCAweDgwMDAsIDB4MjEwMiwgMHgwODBjLCAweDRiMDksIDB4MDkwNCwKKwkweDM1ZWQsIDB4MDgwYywgMHg2YWRkLCAweDAxMjAsIDB4MDgwYywgMHg2YWU1LCAweDE5MDQsIDB4MzVlZCwKKwkweDA4MGMsIDB4Njc1YSwgMHgwOTA0LCAweDM1ZWEsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweDY4ZjMsIDB4MDEyZSwgMHgwOTA0LCAweDM1ZWEsIDB4MjAwMSwgMHgxOTdkLCAweDIwMDQsIDB4ZDBmYywKKwkweDE5MDQsIDB4MzViOCwgMHgwODA0LCAweDQ1OGUsIDB4YTlhMCwgMHgyMDAxLCAweDE5N2QsIDB4OTE4YywKKwkweDgwMDAsIDB4YzE4ZCwgMHgyMTAyLCAweDA4MGMsIDB4NGIxNiwgMHgwMWEwLCAweDA4MGMsIDB4NmFkZCwKKwkweDAxMTgsIDB4MDgwYywgMHg2YWU1LCAweDExNzAsIDB4MDgwYywgMHg2NzVhLCAweDIwMDksIDB4MDAwMiwKKwkweDAxMjgsIDB4MDgwYywgMHg2OGYzLCAweDExNzAsIDB4MjAwOSwgMHgwMDAzLCAweGE4OTcsIDB4NDAwNSwKKwkweGE5OWEsIDB4MDAxMCwgMHhhODk3LCAweDQwMDYsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwKKwkweDAwMzAsIDB4MDAwNSwgMHhhODk3LCAweDQwMDAsIDB4MjAwMSwgMHgxOTdkLCAweDIwMDQsIDB4ZDBmYywKKwkweDExMjgsIDB4MDgwYywgMHg1NzQ2LCAweDAxMTAsIDB4OTAwNiwgMHgwMDE4LCAweDkwMGUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MjAwMSwgMHgwMDAwLCAweDAwMDUsIDB4NzhhOCwgMHhkMDhjLCAweDExMTgsIDB4ZDA4NCwKKwkweDA5MDQsIDB4NDUwMywgMHgwODBjLCAweDRiMjUsIDB4MDkwNCwgMHgzNWVkLCAweDA4MGMsIDB4NGFmMiwKKwkweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzVlYSwgMHgwODBjLCAweDZhZGQsIDB4MDEzMCwKKwkweDkwOGUsIDB4MDAwNCwgMHgwMTE4LCAweDkwOGUsIDB4MDAwNSwgMHgxNWEwLCAweDc4YTgsIDB4ZDA4YywKKwkweDAxMjAsIDB4YjgwMCwgMHhjMDhjLCAweGI4MDIsIDB4MDAyOCwgMHgwODBjLCAweDU3M2UsIDB4ZDBiNCwKKwkweDA5MDQsIDB4NDUzZCwgMHg3ODg0LCAweDkwOGUsIDB4MDA3ZSwgMHgwOTA0LCAweDQ1M2QsIDB4OTA4ZSwKKwkweDAwN2YsIDB4MDkwNCwgMHg0NTNkLCAweDkwOGUsIDB4MDA4MCwgMHgwOTA0LCAweDQ1M2QsIDB4YjgwMCwKKwkweGQwOGMsIDB4MTkwNCwgMHg0NTNkLCAweGE4NjcsIDB4MDAwMCwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwKKwkweDA4MGMsIDB4Y2I0YiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMywgMHgwODA0LCAweDM1ZWEsIDB4NzAwNywKKwkweDAwMDMsIDB4NzAxZiwgMHg1MzNjLCAweDAwMDUsIDB4MDgwYywgMHg0YjI1LCAweDA5MDQsIDB4MzVlZCwKKwkweDA4MDQsIDB4NDUzZCwgMHgwODBjLCAweDMzYTgsIDB4MDEwOCwgMHgwMDA1LCAweDIwMDksIDB4MTgzNCwKKwkweDIxMGMsIDB4ODFmZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwMSwgMHgwODA0LCAweDM1ZWEsIDB4MDgwYywKKwkweDU3NTIsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDcsIDB4MDgwNCwgMHgzNWVhLCAweDA4MGMsIDB4NmFkNSwKKwkweDAxMjAsIDB4MjAwOSwgMHgwMDA4LCAweDA4MDQsIDB4MzVlYSwgMHhiODljLCAweGQwYTQsIDB4MTExOCwKKwkweGQwYWMsIDB4MTkwNCwgMHg0NTNkLCAweDkwMDYsIDB4YTg2NiwgMHhhODMyLCAweGE4NjgsIDB4YzBmZCwKKwkweGE4NmEsIDB4MDgwYywgMHhjYmIzLCAweDExMjAsIDB4MjAwOSwgMHgwMDAzLCAweDA4MDQsIDB4MzVlYSwKKwkweDcwMDcsIDB4MDAwMywgMHg3MDFmLCAweDUzNzUsIDB4MDAwNSwgMHhhODMwLCAweDkwODYsIDB4MDEwMCwKKwkweDExMjAsIDB4MjAwOSwgMHgwMDA0LCAweDA4MDQsIDB4NTY4YywgMHgwODBjLCAweDRiMjUsIDB4MDkwNCwKKwkweDM1ZWQsIDB4MDgwNCwgMHg1MzBlLCAweDgxZmYsIDB4MjAwOSwgMHgwMDAxLCAweDE5MDQsIDB4MzVlYSwKKwkweDA4MGMsIDB4NTc1MiwgMHgyMDA5LCAweDAwMDcsIDB4MTkwNCwgMHgzNWVhLCAweDA4MGMsIDB4NmFkNSwKKwkweDAxMjAsIDB4MjAwOSwgMHgwMDA4LCAweDA4MDQsIDB4MzVlYSwgMHgwODBjLCAweDRiMjUsIDB4MDkwNCwKKwkweDM1ZWQsIDB4MDgwYywgMHg2YWRkLCAweDIwMDksIDB4MDAwOSwgMHgxOTA0LCAweDM1ZWEsIDB4MDgwYywKKwkweDRhZjIsIDB4MjAwOSwgMHgwMDAyLCAweDA5MDQsIDB4MzVlYSwgMHg5MDA2LCAweGE4NjYsIDB4YTgzMiwKKwkweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweDc5ODgsIDB4OTE5NCwgMHhmZjAwLCAweDkxOGMsIDB4MDBmZiwKKwkweDkwMDYsIDB4ODJmZiwgMHgxMTI4LCAweGMwZWQsIDB4YTk1MiwgMHg3OThjLCAweGE5NTYsIDB4MDAzOCwKKwkweDkyOGUsIDB4MDEwMCwgMHgxOTA0LCAweDM1ZWQsIDB4YzBlNSwgMHhhOTUyLCAweGE5NTYsIDB4YTgzZSwKKwkweDA4MGMsIDB4Y2UxNiwgMHgyMDA5LCAweDAwMDMsIDB4MDkwNCwgMHgzNWVhLCAweDcwMDcsIDB4MDAwMywKKwkweDcwMWYsIDB4NTNjYiwgMHgwMDA1LCAweGE4MzAsIDB4OTA4NiwgMHgwMTAwLCAweDIwMDksIDB4MDAwNCwKKwkweDA5MDQsIDB4MzVlYSwgMHgwODA0LCAweDM1YjgsIDB4N2FhOCwgMHg5Mjg0LCAweGMwMDAsIDB4MDE0OCwKKwkweGQyZWMsIDB4MDFhMCwgMHgwODBjLCAweDU3NTIsIDB4MTE4OCwgMHgyMDA5LCAweDAwMTQsIDB4MDgwNCwKKwkweDM1ZWEsIDB4ZDJkYywgMHgxNTc4LCAweDgxZmYsIDB4MjAwOSwgMHgwMDAxLCAweDE5MDQsIDB4MzVlYSwKKwkweDA4MGMsIDB4NTc1MiwgMHgyMDA5LCAweDAwMDcsIDB4MTkwNCwgMHgzNWVhLCAweGQyZjQsIDB4MDEzOCwKKwkweDkyODQsIDB4NTAwMCwgMHhjMGQ1LCAweDA4MGMsIDB4NTcxOCwgMHgwODA0LCAweDM1YjgsIDB4ZDJmYywKKwkweDAxNjAsIDB4MDgwYywgMHg0YjI1LCAweDA5MDQsIDB4MzVlZCwgMHg3OTg0LCAweDkyODQsIDB4OTAwMCwKKwkweGMwZDUsIDB4MDgwYywgMHg1NmU3LCAweDA4MDQsIDB4MzViOCwgMHgwODBjLCAweDRiMjUsIDB4MDkwNCwKKwkweDM1ZWQsIDB4YjgwNCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDA2LCAweDIwMDksIDB4MDAwOSwKKwkweDE5MDQsIDB4NTRiYSwgMHgwODBjLCAweDRhZjIsIDB4MjAwOSwgMHgwMDAyLCAweDA5MDQsIDB4NTRiYSwKKwkweGE4NWMsIDB4OTA4MCwgMHgwMDFiLCAweGFmNjAsIDB4MjAwOSwgMHgwMDA4LCAweDdhOGMsIDB4N2I4OCwKKwkweDdjOWMsIDB4N2Q5OCwgMHgwODBjLCAweDRiM2IsIDB4NzAxZiwgMHg1NDI3LCAweDAwMDUsIDB4YTg2YywKKwkweDkwODYsIDB4MDUwMCwgMHgxMTM4LCAweGE4NzAsIDB4OTAwNSwgMHgxMTIwLCAweGE4NzQsIDB4OTA4NCwKKwkweGZmMDAsIDB4MDExMCwgMHgxOTA0LCAweDM1ZWQsIDB4YTg2NiwgMHhhODMyLCAweGE4NjgsIDB4YzBmZCwKKwkweGE4NmEsIDB4MDgwYywgMHg0YjI1LCAweDExMTAsIDB4MDgwNCwgMHgzNWVkLCAweDIwMDksIDB4MDA0MywKKwkweDA4MGMsIDB4Y2U3ZSwgMHgyMDA5LCAweDAwMDMsIDB4MDkwNCwgMHg1NGJhLCAweDcwMDcsIDB4MDAwMywKKwkweDcwMWYsIDB4NTQ0YiwgMHgwMDA1LCAweGE4MzAsIDB4OTA4NiwgMHgwMTAwLCAweDIwMDksIDB4MDAwNCwKKwkweDA5MDQsIDB4NTRiYSwgMHg3OTg0LCAweDdhYTgsIDB4OTI4NCwgMHgxMDAwLCAweGUwODUsIDB4MDgwYywKKwkweDU2ZTcsIDB4MDgwNCwgMHgzNWI4LCAweDAwYzYsIDB4YWFiMCwgMHg5Mjg0LCAweGMwMDAsIDB4MDE0OCwKKwkweGQyZWMsIDB4MDE3MCwgMHgwODBjLCAweDU3NTIsIDB4MTE1OCwgMHgyMDA5LCAweDAwMTQsIDB4MDgwNCwKKwkweDU0YTksIDB4MjA2MSwgMHgxODAwLCAweDA4MGMsIDB4NTc1MiwgMHgyMDA5LCAweDAwMDcsIDB4MTVjOCwKKwkweGQyZjQsIDB4MDEzMCwgMHg5Mjg0LCAweDUwMDAsIDB4YzBkNSwgMHgwODBjLCAweDU3MTgsIDB4MDA1OCwKKwkweGQyZmMsIDB4MDE4MCwgMHgwODBjLCAweDRiMjMsIDB4MDU5MCwgMHhhOTk4LCAweDkyODQsIDB4OTAwMCwKKwkweGMwZDUsIDB4MDgwYywgMHg1NmU3LCAweGE4N2IsIDB4MDAwMCwgMHhhODgzLCAweDAwMDAsIDB4YTg5NywKKwkweDQwMDAsIDB4MDQzOCwgMHgwODBjLCAweDRiMjMsIDB4MDUxMCwgMHgwODBjLCAweDZhZGQsIDB4MjAwOSwKKwkweDAwMDksIDB4MTFiOCwgMHhhOGM0LCAweDkwODYsIDB4MDUwMCwgMHgxMWM4LCAweGE4YzgsIDB4OTAwNSwKKwkweDExYjAsIDB4YThjYywgMHg5MDg0LCAweGZmMDAsIDB4MTE5MCwgMHgwODBjLCAweDRiMjMsIDB4MTEwOCwKKwkweDAwNzAsIDB4MjAwOSwgMHgwMDRiLCAweDA4MGMsIDB4Y2U3ZSwgMHgyMDA5LCAweDAwMDMsIDB4MDEwOCwKKwkweDAwNzgsIDB4MDQzMSwgMHgxOWMwLCAweGE4OTcsIDB4NDAwNSwgMHhhOTlhLCAweDAwMTAsIDB4YTg5NywKKwkweDQwMDYsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwgMHgwMDMwLCAweDAwY2UsIDB4MDAwNSwKKwkweDkwMDYsIDB4MGNlMCwgMHg3YWE4LCAweGQyZGMsIDB4MDkwNCwgMHgzNWVhLCAweDAwMTYsIDB4Nzk4NCwKKwkweDkyODQsIDB4MTAwMCwgMHhjMGZkLCAweDA4MGMsIDB4NTZlNywgMHgwMDFlLCAweDE5MDQsIDB4MzVlYSwKKwkweDA4MDQsIDB4MzViOCwgMHgwMGY2LCAweDJkNzgsIDB4YWFiMCwgMHgwMDIxLCAweDAwZmUsIDB4MDAwNSwKKwkweGFhYjAsIDB4YzJkNSwgMHhkMmRjLCAweDAxNTAsIDB4MDAxNiwgMHhhOTk4LCAweDkyODQsIDB4MTQwMCwKKwkweGMwZmQsIDB4MDgwYywgMHg1NmU3LCAweDAwMWUsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4ODFmZiwKKwkweDAxMjAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MDQsIDB4MzVlYSwgMHgwODBjLCAweDU3NTIsIDB4MDEyMCwKKwkweDIwMDksIDB4MDAwNywgMHgwODA0LCAweDM1ZWEsIDB4Nzk4NCwgMHg3ZWE4LCAweDk2YjQsIDB4MDBmZiwKKwkweDA4MGMsIDB4NjY5MywgMHgxOTA0LCAweDM1ZWQsIDB4OTE4NiwgMHgwMDdmLCAweDAxMzgsIDB4MDgwYywKKwkweDZhZGQsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDksIDB4MDgwNCwgMHgzNWVhLCAweDA4MGMsIDB4NGFmMiwKKwkweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzVlYSwgMHhhODY3LCAweDAwMDAsIDB4YTg2OCwKKwkweGMwZmQsIDB4YTg2YSwgMHgyMDAxLCAweDAxMDAsIDB4ODAwNywgMHhhODBhLCAweDA4MGMsIDB4Y2I2NSwKKwkweDExMjAsIDB4MjAwOSwgMHgwMDAzLCAweDA4MDQsIDB4MzVlYSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwKKwkweDU1MWEsIDB4MDAwNSwgMHhhODA4LCAweDgwMDcsIDB4OTA4NiwgMHgwMTAwLCAweDExMjAsIDB4MjAwOSwKKwkweDAwMDQsIDB4MDgwNCwgMHgzNWVhLCAweGE4ZTAsIDB4YTg2NiwgMHhhODEwLCAweDgwMDcsIDB4OTA4NCwKKwkweDAwZmYsIDB4ODAwYywgMHhhODE0LCAweDgwMDcsIDB4OTA4NCwgMHgwMGZmLCAweDgwMDQsIDB4OTA4MCwKKwkweDAwMDIsIDB4OTEwOCwgMHg4OTA2LCAweDgwMDYsIDB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwKKwkweGZmYzAsIDB4OTA4MCwgMHgwMDA0LCAweDdhOGMsIDB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4MDgwNCwKKwkweDRiM2UsIDB4MDgwYywgMHg0YWYyLCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzVlYSwKKwkweDc5ODQsIDB4OTE5NCwgMHhmZjAwLCAweDkxOGMsIDB4MDBmZiwgMHg4MjE3LCAweDgyZmYsIDB4MTExOCwKKwkweDcwMjMsIDB4MTliMiwgMHgwMDQwLCAweDkyYzYsIDB4MDAwMSwgMHgxMTE4LCAweDcwMjMsIDB4MTljYywKKwkweDAwMTAsIDB4MDgwNCwgMHgzNWVkLCAweDIwMDksIDB4MDAxYSwgMHg3YThjLCAweDdiODgsIDB4N2M5YywKKwkweDdkOTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4YWY2MCwgMHgwODBjLCAweDRiM2IsIDB4NzAxZiwKKwkweDU1NmEsIDB4MDAwNSwgMHgyMDAxLCAweDE4MmUsIDB4MjAwMywgMHgwMDAxLCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMTksIDB4MjA5OCwgMHhhODYwLCAweDIwZTAsIDB4MjBhOSwgMHgwMDFhLCAweDcwMjAsIDB4MjBhMCwKKwkweDIwZTksIDB4MDAwMSwgMHg0MDAzLCAweDA4MDQsIDB4MzViOCwgMHgwODBjLCAweDRhZjIsIDB4MTEyMCwKKwkweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDM1ZWEsIDB4Nzk4NCwgMHg5MTk0LCAweGZmMDAsIDB4OTE4YywKKwkweDAwZmYsIDB4ODIxNywgMHg4MmZmLCAweDExMTgsIDB4MjA5OSwgMHgxOWIyLCAweDAwNDAsIDB4OTJjNiwKKwkweDAwMDEsIDB4MTExOCwgMHgyMDk5LCAweDE5Y2MsIDB4MDAxMCwgMHgwODA0LCAweDM1ZWQsIDB4YTg1YywKKwkweDkwODAsIDB4MDAxOSwgMHgyMGEwLCAweGE4NjAsIDB4MjBlOCwgMHgyMGE5LCAweDAwMWEsIDB4MjBlMSwKKwkweDAwMDEsIDB4NDAwMywgMHgyMDA5LCAweDAwMWEsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwKKwkweGE4NWMsIDB4OTA4MCwgMHgwMDE5LCAweGFmNjAsIDB4MDgwNCwgMHg0YjNlLCAweDc4ODQsIDB4OTA4YSwKKwkweDEwMDAsIDB4MWEwNCwgMHgzNWVkLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDgwMDMsIDB4ODAwYiwKKwkweDgxMGIsIDB4OTEwOCwgMHgwMGM2LCAweDIwNjEsIDB4MWEwMiwgMHg2MTQyLCAweDAwY2UsIDB4MDEyZSwKKwkweDA4MDQsIDB4MzViOCwgMHgwMGM2LCAweDA4MGMsIDB4NzUzZCwgMHgxMTYwLCAweDA4MGMsIDB4Nzg0MCwKKwkweDA4MGMsIDB4NjA5MiwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywgMHg3NTg0LCAweDA4MGMsIDB4NzQ2ZSwKKwkweDA4MGMsIDB4MGQ3ZCwgMHgyMDYxLCAweDE4MDAsIDB4NjAzMCwgMHhjMDlkLCAweDYwMzIsIDB4MDgwYywKKwkweDVmNGQsIDB4MDBjZSwgMHgwMDA1LCAweDAwYzYsIDB4MjAwMSwgMHgxODAwLCAweDIwMDQsIDB4OTA4ZSwKKwkweDAwMDAsIDB4MDkwNCwgMHgzNWVhLCAweDc4ODQsIDB4OTAwNSwgMHgwMTg4LCAweDc4ODgsIDB4MjA2MSwKKwkweDE5OWIsIDB4MmMwYywgMHgyMDYyLCAweDA4MGMsIDB4MmE0OCwgMHgwMWEwLCAweDA4MGMsIDB4MmE1MCwKKwkweDAxODgsIDB4MDgwYywgMHgyYTU4LCAweDAxNzAsIDB4MjE2MiwgMHgwODA0LCAweDM1ZWQsIDB4MjA2MSwKKwkweDAxMDAsIDB4NjAzOCwgMHg5MDg2LCAweDAwMDcsIDB4MTExOCwgMHgyMDA5LCAweDAwMDEsIDB4MDAxMCwKKwkweDIwMDksIDB4MDAwMCwgMHg3ODg0LCAweDkwODYsIDB4MDAwMiwgMHgxNWE4LCAweDIwNjEsIDB4MDEwMCwKKwkweDYwMjgsIDB4YzA5YywgMHg2MDJhLCAweDA4MGMsIDB4YTkxZSwgMHgwMDI2LCAweDIwMTEsIDB4MDAwMywKKwkweDA4MGMsIDB4YTI0MywgMHgyMDExLCAweDAwMDIsIDB4MDgwYywgMHhhMjRkLCAweDAwMmUsIDB4MDgwYywKKwkweGExMzgsIDB4MDAzNiwgMHg5MDFlLCAweDA4MGMsIDB4YTFiOCwgMHgwMDNlLCAweDA4MGMsIDB4YTkzYSwKKwkweDYwZTMsIDB4MDAwMCwgMHgwODBjLCAweGU4ODIsIDB4MDgwYywgMHhlODlkLCAweDkwODUsIDB4MDAwMSwKKwkweDA4MGMsIDB4NzU4NCwgMHg5MDA2LCAweDA4MGMsIDB4MmE3YSwgMHgyMDAxLCAweDE4MDAsIDB4MjAwMywKKwkweDAwMDQsIDB4MjAwMSwgMHgxOWE2LCAweDIwMDMsIDB4MDAwMCwgMHgwMDI2LCAweDIwMTEsIDB4MDAwOCwKKwkweDA4MGMsIDB4MmFiNCwgMHgwMDJlLCAweDAwY2UsIDB4MDgwNCwgMHgzNWI4LCAweDgxZmYsIDB4MDEyMCwKKwkweDIwMDksIDB4MDAwMSwgMHgwODA0LCAweDM1ZWEsIDB4MDgwYywgMHg1NzUyLCAweDAxMjAsIDB4MjAwOSwKKwkweDAwMDcsIDB4MDgwNCwgMHgzNWVhLCAweDc5ODQsIDB4N2VhOCwgMHg5NmI0LCAweDAwZmYsIDB4MDgwYywKKwkweDY2OTMsIDB4MTkwNCwgMHgzNWVkLCAweDkxODYsIDB4MDA3ZiwgMHgwMTM4LCAweDA4MGMsIDB4NmFkZCwKKwkweDAxMjAsIDB4MjAwOSwgMHgwMDA5LCAweDA4MDQsIDB4MzVlYSwgMHgwODBjLCAweDRhZjIsIDB4MTEyMCwKKwkweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDM1ZWEsIDB4YTg2NywgMHgwMDAwLCAweGE4NjgsIDB4YzBmZCwKKwkweGE4NmEsIDB4MDgwYywgMHhjYjY4LCAweDExMjAsIDB4MjAwOSwgMHgwMDAzLCAweDA4MDQsIDB4MzVlYSwKKwkweDcwMDcsIDB4MDAwMywgMHg3MDFmLCAweDU2NzUsIDB4MDAwNSwgMHhhODMwLCAweDkwODYsIDB4MDEwMCwKKwkweDExMjAsIDB4MjAwOSwgMHgwMDA0LCAweDA4MDQsIDB4MzVlYSwgMHhhOGUwLCAweGE4NjYsIDB4YTgzNCwKKwkweDgwMDcsIDB4ODAwYywgMHhhODVjLCAweDkwODAsIDB4MDAwYywgMHg3YThjLCAweDdiODgsIDB4N2M5YywKKwkweDdkOTgsIDB4YWY2MCwgMHgwODA0LCAweDRiM2UsIDB4YTg5OCwgMHg5MDg2LCAweDAwMGQsIDB4MTkwNCwKKwkweDM1ZWEsIDB4MjAyMSwgMHg0MDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDBlMDQsIDB4NTY5OSwKKwkweDAwMTAsIDB4MDEyZSwgMHgwY2MwLCAweDdjMzYsIDB4OTQ4NiwgMHg0MDAwLCAweDAxMTgsIDB4NzgzMywKKwkweDAwMTEsIDB4MDAxMCwgMHg3ODMzLCAweDAwMTAsIDB4Nzg4MywgMHg0MDA1LCAweGE5OTgsIDB4Nzk4NiwKKwkweGE5YTQsIDB4Nzk5YSwgMHhhOWE4LCAweDc5OWUsIDB4MDgwYywgMHg0YjJlLCAweDIwOTEsIDB4NDA4MCwKKwkweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMWVlLCAweDcwMDcsIDB4MDAwMSwKKwkweDIwOTEsIDB4NTAwMCwgMHg3MDBmLCAweDAwMDAsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDBjNiwgMHgyMDYxLCAweDFhMDIsIDB4Nzk4NCwgMHg2MTUyLCAweDYxNGUsIDB4NjA1NywKKwkweDAwMDAsIDB4NjA0YiwgMHgwMDA5LCAweDc4OTgsIDB4NjA2YSwgMHg3ODljLCAweDYwNjYsIDB4Nzg4OCwKKwkweDYwNjIsIDB4Nzg4YywgMHg2MDVlLCAweDIwMDEsIDB4MWExMCwgMHgyMDQ0LCAweDIwMDEsIDB4MWExNywKKwkweGEwNzYsIDB4YTA2MCwgMHhhMDcyLCAweGEwN2IsIDB4MDAwMSwgMHhhMDdmLCAweDAwMDIsIDB4YTA2YiwKKwkweDAwMDAsIDB4YTA5ZiwgMHgwMDAwLCAweDAwY2UsIDB4MDEyZSwgMHgwODA0LCAweDM1YjgsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwMGI2LCAweDAwYzYsIDB4OTBlNCwgMHhjMDAwLCAweDAxOTgsIDB4MDAwNiwKKwkweGQwZDQsIDB4MDE2MCwgMHgwMDM2LCAweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweGE5MWUsIDB4MDEwNiwKKwkweDA4MGMsIDB4MzM2ZCwgMHgwMTBlLCAweDA5MGMsIDB4YTkzYSwgMHgwMDNlLCAweDA4MGMsIDB4YzljNywKKwkweDAwMGUsIDB4MTE5OCwgMHhkMGU0LCAweDAxNjAsIDB4OTE4MCwgMHgxMDAwLCAweDIwMDQsIDB4OTA1ZCwKKwkweDAxNjAsIDB4MDgwYywgMHg2MGFjLCAweDA4MGMsIDB4YWJlMiwgMHgwMTEwLCAweGI4MTcsIDB4MDAwMCwKKwkweDkwMDYsIDB4MDBjZSwgMHgwMGJlLCAweDAxMmUsIDB4MDAwNSwgMHg5MDg1LCAweDAwMDEsIDB4MGNjOCwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAxNTYsIDB4MjAxMCwgMHg5MDBlLCAweDIwYTksIDB4MDgwMCwKKwkweDAwMTYsIDB4OTE4MCwgMHgxMDAwLCAweDIwMDQsIDB4OTAwNSwgMHgwMTg4LCAweDkxODYsIDB4MDA3ZSwKKwkweDAxNzAsIDB4OTE4NiwgMHgwMDdmLCAweDAxNTgsIDB4OTE4NiwgMHgwMDgwLCAweDAxNDAsIDB4OTE4NiwKKwkweDAwZmYsIDB4MDEyOCwgMHgwMDI2LCAweDIyMDAsIDB4MDgwYywgMHg1NmU3LCAweDAwMmUsIDB4MDAxZSwKKwkweDgxMDgsIDB4MWYwNCwgMHg1NzIwLCAweDAxNWUsIDB4MDEyZSwgMHgwMDA1LCAweDIwMDEsIDB4MTg0OCwKKwkweDIwMDQsIDB4MDAwNSwgMHgyMDAxLCAweDE4NjcsIDB4MjAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwKKwkweDE4MTAsIDB4MjAwNCwgMHhkMGQ0LCAweDAwMGUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MGUsIDB4MjAwNCwKKwkweGQwYjQsIDB4MDAwNSwgMHgyMDAxLCAweDE4MDAsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDMsIDB4MDAwNSwKKwkweDAwMTYsIDB4MDBlNiwgMHgyMDcxLCAweDE4OWUsIDB4NzEwOCwgMHg5MTBkLCAweDcxMGEsIDB4MDBlZSwKKwkweDAwMWUsIDB4MDAwNSwgMHg3OWE0LCAweDkxODIsIDB4MDA4MSwgMHgxYTA0LCAweDM1ZWQsIDB4ODEwYywKKwkweDAwMTYsIDB4MDgwYywgMHg0YWYyLCAweDAxNzAsIDB4MDgwYywgMHgwZjRmLCAweDIxMDAsIDB4MjIzOCwKKwkweDdkODQsIDB4N2M4OCwgMHg3YjhjLCAweDdhOTAsIDB4MDAxZSwgMHgwODBjLCAweDRiM2IsIDB4NzAxZiwKKwkweDU3N2UsIDB4MDAwNSwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgzNWVhLCAweDIwNzksIDB4MDAwMCwKKwkweDdkOTQsIDB4N2M5OCwgMHg3YmE4LCAweDdhYWMsIDB4NzlhNCwgMHg4MTBjLCAweDIwNjEsIDB4MThiOCwKKwkweDJjNDQsIDB4YTc3MCwgMHhhMDc0LCAweDIwNzEsIDB4MTg5ZSwgMHgwODBjLCAweDRiM2UsIDB4NzAxZiwKKwkweDU3OTIsIDB4MDAwNSwgMHgyMDYxLCAweDE4YjgsIDB4MmM0NCwgMHgwMDE2LCAweDAwMjYsIDB4YTI3MCwKKwkweGExNzQsIDB4MDgwYywgMHgwZjU3LCAweDAwMmUsIDB4MDAxZSwgMHgwODBjLCAweDEwMDQsIDB4OTAwNiwKKwkweGE4MDIsIDB4YTgwNiwgMHgwODA0LCAweDM1YjgsIDB4MDEyNiwgMHgwMTU2LCAweDAxMzYsIDB4MDE0NiwKKwkweDAxYzYsIDB4MDFkNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDIwNjEsIDB4MDEwMCwKKwkweDIwNjksIDB4MDIwMCwgMHgyMDcxLCAweDE4MDAsIDB4NjA0NCwgMHhkMGE0LCAweDExZTgsIDB4ZDA4NCwKKwkweDAxMTgsIDB4MDgwYywgMHg1OTRkLCAweDAwNjgsIDB4ZDA4YywgMHgwMTE4LCAweDA4MGMsIDB4NTg1NiwKKwkweDAwNDAsIDB4ZDA5NCwgMHgwMTE4LCAweDA4MGMsIDB4NTgyNiwgMHgwMDE4LCAweGQwOWMsIDB4MDEwOCwKKwkweDAwOTksIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMWRlLCAweDAxY2UsIDB4MDE0ZSwKKwkweDAxM2UsIDB4MDE1ZSwgMHgwMTJlLCAweDAwMDUsIDB4MDAxNiwgMHg2MTI4LCAweGQxOWMsIDB4MTExMCwKKwkweGMxOWQsIDB4NjEyYSwgMHgwMDFlLCAweDBjNjgsIDB4MDAwNiwgMHg3MDk4LCAweDkwMDUsIDB4MDAwZSwKKwkweDAxMjAsIDB4NzA5YiwgMHgwMDAwLCAweDcwOTMsIDB4MDAwMCwgMHg2MjRjLCAweDkyODYsIDB4ZjBmMCwKKwkweDExNTAsIDB4NjA0OCwgMHg5MDg2LCAweGYwZjAsIDB4MDEzMCwgMHg2MjRhLCAweDYwNDMsIDB4MDA5MCwKKwkweDYwNDMsIDB4MDAxMCwgMHgwNDkwLCAweDkyOTQsIDB4ZmYwMCwgMHg5Mjk2LCAweGY3MDAsIDB4MDE3OCwKKwkweDcxMzgsIDB4ZDFhNCwgMHgxMTYwLCAweDYyNDAsIDB4OTI5NSwgMHgwMTAwLCAweDYyNDIsIDB4OTI5NCwKKwkweDAwMTAsIDB4MDEyOCwgMHgyMDA5LCAweDAwZjcsIDB4MDgwYywgMHg2MDBlLCAweDAwZjAsIDB4NjA0MCwKKwkweDkwODQsIDB4MDAxMCwgMHg5MDg1LCAweDAxNDAsIDB4NjA0MiwgMHg2MDQzLCAweDAwMDAsIDB4NzA4NywKKwkweDAwMDAsIDB4NzBhMywgMHgwMDAxLCAweDcwYzcsIDB4MDAwMCwgMHg3MGRmLCAweDAwMDAsIDB4MjAwOSwKKwkweDFkODAsIDB4MjAwYiwgMHgwMDAwLCAweDcwOTcsIDB4MDAwMCwgMHg3MDhiLCAweDAwMGYsIDB4MjAwOSwKKwkweDAwMGYsIDB4MjAxMSwgMHg1ZWYwLCAweDA4MGMsIDB4ODc5MiwgMHgwMDA1LCAweDIwMDEsIDB4MTg2OSwKKwkweDIwMDQsIDB4ZDA4YywgMHgwMTEwLCAweDcwNWYsIDB4ZmZmZiwgMHg3MDg4LCAweDkwMDUsIDB4MTUyOCwKKwkweDIwMTEsIDB4NWVmMCwgMHgwODBjLCAweDg2YzgsIDB4NjA0MCwgMHg5MDk0LCAweDAwMTAsIDB4OTI4NSwKKwkweDAwMjAsIDB4NjA0MiwgMHgyMGE5LCAweDAwYzgsIDB4NjA0NCwgMHhkMDhjLCAweDExNjgsIDB4MWYwNCwKKwkweDU4M2MsIDB4NjI0MiwgMHg3MDliLCAweDAwMDAsIDB4NjA0MCwgMHg5MDk0LCAweDAwMTAsIDB4OTI4NSwKKwkweDAwODAsIDB4NjA0MiwgMHg2MjQyLCAweDAwNDgsIDB4NjI0MiwgMHg3MDliLCAweDAwMDAsIDB4NzA4ZiwKKwkweDAwMDAsIDB4OTAwNiwgMHgwODBjLCAweDYwOTcsIDB4MDAwMCwgMHgwMDA1LCAweDcwOGMsIDB4OTA4YSwKKwkweDAwMDMsIDB4MWEwYywgMHgwZDdkLCAweDAwMGIsIDB4MDAwNSwgMHg1ODYwLCAweDU4YjEsIDB4NTk0YywKKwkweDAwZjYsIDB4MDAxNiwgMHg2OTAwLCAweDkxOGMsIDB4MDgwMCwgMHg3MDhmLCAweDAwMDEsIDB4MjAwMSwKKwkweDAxNWQsIDB4MjAwMywgMHgwMDAwLCAweDY4MDMsIDB4MDBmYywgMHgyMGE5LCAweDAwMDQsIDB4NjgwMCwKKwkweDkwODQsIDB4MDBmYywgMHgwMTIwLCAweDFmMDQsIDB4NTg2ZiwgMHgwODBjLCAweDBkN2QsIDB4NjhhMCwKKwkweDY4YTIsIDB4Njg5YywgMHg2ODllLCAweDY4OTgsIDB4Njg5YSwgMHhhMDAxLCAweDkxOGQsIDB4MTYwMCwKKwkweDY5MDIsIDB4MDAxZSwgMHg2ODM3LCAweDAwMjAsIDB4MDgwYywgMHg2MDczLCAweDIwNzksIDB4MWQwMCwKKwkweDc4MzMsIDB4MTEwMSwgMHg3ODM3LCAweDAwMDAsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksIDB4MTgwNSwKKwkweDIwZTksIDB4MDAwMSwgMHgyMGExLCAweDFkMGUsIDB4MjBhOSwgMHgwMDA0LCAweDQwMDMsIDB4MDgwYywKKwkweGE3MTMsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksIDB4MWQwMCwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwKKwkweDAyNDAsIDB4MjBhOSwgMHgwMDE0LCAweDQwMDMsIDB4NjBjMywgMHgwMDBjLCAweDYwMGYsIDB4MDAwMCwKKwkweDA4MGMsIDB4NWYyMSwgMHgwMGZlLCAweDkwMDYsIDB4NzA5MiwgMHg2MDQzLCAweDAwMDgsIDB4NjA0MiwKKwkweDAwMDUsIDB4MDBmNiwgMHg3MDkwLCAweDcwOTMsIDB4MDAwMCwgMHg5MDI1LCAweDA5MDQsIDB4NTkyOSwKKwkweDYwMjAsIDB4ZDBiNCwgMHgxOTA0LCAweDU5MjcsIDB4NzFhMCwgMHg4MWZmLCAweDA5MDQsIDB4NTkxNSwKKwkweDk0ODYsIDB4MDAwYywgMHgxOTA0LCAweDU5MjIsIDB4OTQ4MCwgMHgwMDE4LCAweDgwMDQsIDB4MjBhOCwKKwkweDA4MGMsIDB4NjA2YywgMHgyMDExLCAweDAyNjAsIDB4MjAxOSwgMHgxZDAwLCAweDIyMGMsIDB4MjMwNCwKKwkweDkxMDYsIDB4MTFlOCwgMHg4MjEwLCAweDgzMTgsIDB4MWYwNCwgMHg1OGNlLCAweDYwNDMsIDB4MDAwNCwKKwkweDIwNjEsIDB4MDE0MCwgMHg2MDViLCAweGJjOTQsIDB4NjA1ZiwgMHhmMGYwLCAweDIwNjEsIDB4MDEwMCwKKwkweDYwNDMsIDB4MDAwNiwgMHg3MDhmLCAweDAwMDIsIDB4NzA5YiwgMHgwMDAyLCAweDIwMDksIDB4MDdkMCwKKwkweDIwMTEsIDB4NWVmNywgMHgwODBjLCAweDg3OTIsIDB4MDgwYywgMHg2MDczLCAweDA0YzAsIDB4MDgwYywKKwkweDYwNmMsIDB4MjA3OSwgMHgwMjYwLCAweDc5MzAsIDB4OTE4ZSwgMHgxMTAxLCAweDE1NTgsIDB4NzgzNCwKKwkweDkwMDUsIDB4MTU0MCwgMHg3OTAwLCAweDkxOGMsIDB4MDBmZiwgMHgxMTE4LCAweDc4MDQsIDB4OTAwNSwKKwkweDAxOTAsIDB4MDgwYywgMHg2MDZjLCAweDIwMTEsIDB4MDI2ZSwgMHgyMDE5LCAweDE4MDUsIDB4MjBhOSwKKwkweDAwMDQsIDB4MjIwYywgMHgyMzA0LCAweDkxMDIsIDB4MDIzMCwgMHgxMWEwLCAweDgyMTAsIDB4ODMxOCwKKwkweDFmMDQsIDB4NTkwOSwgMHgwMDc4LCAweDcwYTMsIDB4MDAwMCwgMHgwODBjLCAweDYwNmMsIDB4MjBlMSwKKwkweDAwMDAsIDB4MjA5OSwgMHgwMjYwLCAweDIwZTksIDB4MDAwMSwgMHgyMGExLCAweDFkMDAsIDB4MjBhOSwKKwkweDAwMTQsIDB4NDAwMywgMHg2MDQzLCAweDAwMDgsIDB4NjA0MywgMHgwMDAwLCAweDAwMTAsIDB4MDBmZSwKKwkweDAwMDUsIDB4NjA0MCwgMHg5MDg1LCAweDAxMDAsIDB4NjA0MiwgMHg2MDIwLCAweGQwYjQsIDB4MWRiOCwKKwkweDA4MGMsIDB4YTcxMywgMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwgMHgxZDAwLCAweDIwZTksIDB4MDAwMCwKKwkweDIwYTEsIDB4MDI0MCwgMHgyMGE5LCAweDAwMTQsIDB4NDAwMywgMHg2MGMzLCAweDAwMGMsIDB4MjAxMSwKKwkweDE5ZjMsIDB4MjAxMywgMHgwMDAwLCAweDcwOTMsIDB4MDAwMCwgMHg2MGEzLCAweDAwNTYsIDB4NjBhNywKKwkweDk1NzUsIDB4MDgwYywgMHg5ZWM3LCAweDA4ZDgsIDB4MDAwNSwgMHg3MDk4LCAweDkwOGEsIDB4MDAxZCwKKwkweDFhMGMsIDB4MGQ3ZCwgMHgwMDBiLCAweDAwMDUsIDB4NTk3ZSwgMHg1OTkxLCAweDU5YmEsIDB4NTlkYSwKKwkweDVhMDAsIDB4NWEyZiwgMHg1YTU1LCAweDVhOGQsIDB4NWFiMywgMHg1YWUxLCAweDViMWMsIDB4NWI1NCwKKwkweDViNzIsIDB4NWI5ZCwgMHg1YmJmLCAweDViZGEsIDB4NWJlNCwgMHg1YzE4LCAweDVjM2UsIDB4NWM2ZCwKKwkweDVjOTMsIDB4NWNjYiwgMHg1ZDBmLCAweDVkNGMsIDB4NWQ2ZCwgMHg1ZGM2LCAweDVkZTgsIDB4NWUxNiwKKwkweDVlMTYsIDB4MDBjNiwgMHgyMDYxLCAweDE4MDAsIDB4NjAwMywgMHgwMDA3LCAweDIwNjEsIDB4MDEwMCwKKwkweDYwMDQsIDB4OTA4NCwgMHhmZmY5LCAweDYwMDYsIDB4MDBjZSwgMHgwMDA1LCAweDIwNjEsIDB4MDE0MCwKKwkweDYwNWIsIDB4YmM5NCwgMHg2MDVmLCAweGYwZjAsIDB4MjA2MSwgMHgwMTAwLCAweDYwNDMsIDB4MDAwMiwKKwkweDcwOWIsIDB4MDAwMSwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwgMHg1ZWY3LCAweDA4MGMsIDB4ODc5MiwKKwkweDAwMDUsIDB4MDBmNiwgMHg3MDkwLCAweDkwODYsIDB4MDAxNCwgMHgxNTEwLCAweDYwNDIsIDB4NjAyMCwKKwkweGQwYjQsIDB4MTFmMCwgMHgwODBjLCAweDYwNmMsIDB4MjA3OSwgMHgwMjYwLCAweDdhMzAsIDB4OTI5NiwKKwkweDExMDIsIDB4MTFhMCwgMHg3ODM0LCAweDkwMDUsIDB4MTE4OCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwKKwkweDcwYzQsIDB4OTAwNSwgMHgxMTEwLCAweDcwYzcsIDB4MDAwMSwgMHgyMDExLCAweDVlZjcsIDB4MDgwYywKKwkweDg2YzgsIDB4NzA5YiwgMHgwMDEwLCAweDA4MGMsIDB4NWJlNCwgMHgwMDEwLCAweDcwOTMsIDB4MDAwMCwKKwkweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOWIsIDB4MDAwMywgMHg2MDQzLCAweDAwMDQsIDB4MjAxMSwKKwkweDVlZjcsIDB4MDgwYywgMHg4NmM4LCAweDA4MGMsIDB4NWZmMCwgMHgyMDc5LCAweDAyNDAsIDB4NzgzMywKKwkweDExMDIsIDB4NzgzNywgMHgwMDAwLCAweDIwYTksIDB4MDAwOCwgMHg5Zjg4LCAweDAwMGUsIDB4MjAwYiwKKwkweDAwMDAsIDB4ODEwOCwgMHgxZjA0LCAweDU5Y2YsIDB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NWYyMSwKKwkweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOTAsIDB4OTAwNSwgMHgwNTAwLCAweDIwMTEsIDB4NWVmNywKKwkweDA4MGMsIDB4ODZjOCwgMHg5MDg2LCAweDAwMTQsIDB4MTFiOCwgMHgwODBjLCAweDYwNmMsIDB4MjA3OSwKKwkweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LCAweDExMDIsIDB4MTE3OCwgMHg3ODM0LCAweDkwMDUsIDB4MTE2MCwKKwkweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYzQsIDB4OTAwNSwgMHgxMTEwLCAweDcwYzcsIDB4MDAwMSwKKwkweDcwOWIsIDB4MDAwNCwgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg2MDQ4LCAweDAwZmUsIDB4MDAwNSwKKwkweDAwZjYsIDB4NzA5YiwgMHgwMDA1LCAweDA4MGMsIDB4NWZmMCwgMHgyMDc5LCAweDAyNDAsIDB4NzgzMywKKwkweDExMDMsIDB4NzgzNywgMHgwMDAwLCAweDA4MGMsIDB4NjA2YywgMHgwODBjLCAweDYwNGYsIDB4MTE3MCwKKwkweDcwODQsIDB4OTAwNSwgMHgxMTU4LCAweDcxNWMsIDB4OTE4NiwgMHhmZmZmLCAweDAxMzgsIDB4MjAxMSwKKwkweDAwMDgsIDB4MDgwYywgMHg1ZWE0LCAweDAxNjgsIDB4MDgwYywgMHg2MDI1LCAweDIwYTksIDB4MDAwOCwKKwkweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAyNmUsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0ZSwKKwkweDQwMDMsIDB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NWYyMSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwKKwkweDcwOTAsIDB4OTAwNSwgMHgwNTAwLCAweDIwMTEsIDB4NWVmNywgMHgwODBjLCAweDg2YzgsIDB4OTA4NiwKKwkweDAwMTQsIDB4MTFiOCwgMHgwODBjLCAweDYwNmMsIDB4MjA3OSwgMHgwMjYwLCAweDdhMzAsIDB4OTI5NiwKKwkweDExMDMsIDB4MTE3OCwgMHg3ODM0LCAweDkwMDUsIDB4MTE2MCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwKKwkweDcwYzQsIDB4OTAwNSwgMHgxMTEwLCAweDcwYzcsIDB4MDAwMSwgMHg3MDliLCAweDAwMDYsIDB4MDAyOSwKKwkweDAwMTAsIDB4MDgwYywgMHg2MDQ4LCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOWIsIDB4MDAwNywKKwkweDA4MGMsIDB4NWZmMCwgMHgyMDc5LCAweDAyNDAsIDB4NzgzMywgMHgxMTA0LCAweDc4MzcsIDB4MDAwMCwKKwkweDA4MGMsIDB4NjA2YywgMHgwODBjLCAweDYwNGYsIDB4MTFiOCwgMHg3MDg0LCAweDkwMDUsIDB4MTFhMCwKKwkweDcxNjQsIDB4OTE4NiwgMHhmZmZmLCAweDAxODAsIDB4OTE4MCwgMHgzM2I5LCAweDIwMGQsIDB4OTE4YywKKwkweGZmMDAsIDB4ODEwZiwgMHgyMDExLCAweDAwMDgsIDB4MDgwYywgMHg1ZWE0LCAweDAxODAsIDB4MDgwYywKKwkweDUwMmQsIDB4MDExMCwgMHgwODBjLCAweDI2Y2EsIDB4MjBhOSwgMHgwMDA4LCAweDIwZTEsIDB4MDAwMCwKKwkweDIwOTksIDB4MDI2ZSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMjRlLCAweDQwMDMsIDB4NjBjMywKKwkweDAwMTQsIDB4MDgwYywgMHg1ZjIxLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOTAsIDB4OTAwNSwKKwkweDA1MDAsIDB4MjAxMSwgMHg1ZWY3LCAweDA4MGMsIDB4ODZjOCwgMHg5MDg2LCAweDAwMTQsIDB4MTFiOCwKKwkweDA4MGMsIDB4NjA2YywgMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LCAweDExMDQsIDB4MTE3OCwKKwkweDc4MzQsIDB4OTAwNSwgMHgxMTYwLCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYzQsIDB4OTAwNSwKKwkweDExMTAsIDB4NzBjNywgMHgwMDAxLCAweDcwOWIsIDB4MDAwOCwgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywKKwkweDYwNDgsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5YiwgMHgwMDA5LCAweDA4MGMsIDB4NWZmMCwKKwkweDIwNzksIDB4MDI0MCwgMHg3ODMzLCAweDExMDUsIDB4NzgzNywgMHgwMTAwLCAweDA4MGMsIDB4NjA0ZiwKKwkweDExNTAsIDB4NzA4NCwgMHg5MDA1LCAweDExMzgsIDB4MDgwYywgMHg1ZTE3LCAweDExODgsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDgwYywgMHgyNmNhLCAweDIwYTksIDB4MDAwOCwgMHgwODBjLCAweDYwNmMsIDB4MjBlMSwKKwkweDAwMDAsIDB4MjA5OSwgMHgwMjZlLCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNGUsIDB4NDAwMywKKwkweDYwYzMsIDB4MDAxNCwgMHgwODBjLCAweDVmMjEsIDB4MDAxMCwgMHgwODBjLCAweDU5NzEsIDB4MDBmZSwKKwkweDAwMDUsIDB4MDBmNiwgMHg3MDkwLCAweDkwMDUsIDB4MDVhOCwgMHgyMDExLCAweDVlZjcsIDB4MDgwYywKKwkweDg2YzgsIDB4OTA4NiwgMHgwMDE0LCAweDE1NjAsIDB4MDgwYywgMHg2MDZjLCAweDIwNzksIDB4MDI2MCwKKwkweDdhMzAsIDB4OTI5NiwgMHgxMTA1LCAweDE1MjAsIDB4NzgzNCwgMHg5MDg0LCAweDAxMDAsIDB4MjAxMSwKKwkweDAxMDAsIDB4OTIxZSwgMHgxMTYwLCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYzQsIDB4OTAwNSwKKwkweDExMTAsIDB4NzBjNywgMHgwMDAxLCAweDcwOWIsIDB4MDAwYSwgMHgwMGIxLCAweDAwOTgsIDB4OTAwNSwKKwkweDExNzgsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBjNCwgMHg5MDA1LCAweDExMTAsIDB4NzBjNywKKwkweDAwMDEsIDB4NzA5NywgMHgwMDAwLCAweDcwOWIsIDB4MDAwZSwgMHgwODBjLCAweDViYmYsIDB4MDAxMCwKKwkweDA4MGMsIDB4NjA0OCwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDliLCAweDAwMGIsIDB4MjAxMSwKKwkweDFkMGUsIDB4MjBlOSwgMHgwMDAxLCAweDIyYTAsIDB4MjBhOSwgMHgwMDQwLCAweDIwMTksIDB4ZmZmZiwKKwkweDQzMDQsIDB4MDgwYywgMHg1ZmYwLCAweDIwNzksIDB4MDI0MCwgMHg3ODMzLCAweDExMDYsIDB4NzgzNywKKwkweDAwMDAsIDB4MDgwYywgMHg2MDRmLCAweDAxMTgsIDB4MjAxMywgMHgwMDAwLCAweDAwMjAsIDB4NzA2MCwKKwkweDkwODUsIDB4MDEwMCwgMHgyMDEyLCAweDIwYTksIDB4MDA0MCwgMHgyMDA5LCAweDAyNGUsIDB4MjAxMSwKKwkweDFkMGUsIDB4MjIwZSwgMHg4MjEwLCAweDgxMDgsIDB4OTE4NiwgMHgwMjYwLCAweDExMjgsIDB4NjgxMCwKKwkweDgwMDAsIDB4NjgxMiwgMHgyMDA5LCAweDAyNDAsIDB4MWYwNCwgMHg1YjQxLCAweDYwYzMsIDB4MDA4NCwKKwkweDA4MGMsIDB4NWYyMSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDkwLCAweDkwMDUsIDB4MDFjMCwKKwkweDIwMTEsIDB4NWVmNywgMHgwODBjLCAweDg2YzgsIDB4OTA4NiwgMHgwMDg0LCAweDExNzgsIDB4MDgwYywKKwkweDYwNmMsIDB4MjA3OSwgMHgwMjYwLCAweDdhMzAsIDB4OTI5NiwgMHgxMTA2LCAweDExMzgsIDB4NzgzNCwKKwkweDkwMDUsIDB4MTEyMCwgMHg3MDliLCAweDAwMGMsIDB4MDAyOSwgMHgwMDEwLCAweDA4MGMsIDB4NjA0OCwKKwkweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOWIsIDB4MDAwZCwgMHgwODBjLCAweDVmZjAsIDB4MjA3OSwKKwkweDAyNDAsIDB4NzgzMywgMHgxMTA3LCAweDc4MzcsIDB4MDAwMCwgMHgwODBjLCAweDYwNmMsIDB4MjBhOSwKKwkweDAwNDAsIDB4MjAxMSwgMHgwMjZlLCAweDIwMDksIDB4MDI0ZSwgMHgyMjBlLCAweDgyMTAsIDB4ODEwOCwKKwkweDkxODYsIDB4MDI2MCwgMHgxMTUwLCAweDY4MTAsIDB4ODAwMCwgMHg2ODEyLCAweDIwMDksIDB4MDI0MCwKKwkweDY4MTQsIDB4ODAwMCwgMHg2ODE2LCAweDIwMTEsIDB4MDI2MCwgMHgxZjA0LCAweDViODUsIDB4NjBjMywKKwkweDAwODQsIDB4MDgwYywgMHg1ZjIxLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOTAsIDB4OTAwNSwKKwkweDAxZTAsIDB4MjAxMSwgMHg1ZWY3LCAweDA4MGMsIDB4ODZjOCwgMHg5MDg2LCAweDAwODQsIDB4MTE5OCwKKwkweDA4MGMsIDB4NjA2YywgMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LCAweDExMDcsIDB4MTE1OCwKKwkweDc4MzQsIDB4OTAwNSwgMHgxMTQwLCAweDcwOTcsIDB4MDAwMSwgMHgwODBjLCAweDVmYzIsIDB4NzA5YiwKKwkweDAwMGUsIDB4MDAyOSwgMHgwMDEwLCAweDA4MGMsIDB4NjA0OCwgMHgwMGZlLCAweDAwMDUsIDB4OTE4ZCwKKwkweDAwMDEsIDB4MDgwYywgMHg2MDk3LCAweDcwOWIsIDB4MDAwZiwgMHg3MDkzLCAweDAwMDAsIDB4MjA2MSwKKwkweDAxNDAsIDB4NjA1YiwgMHhiYzg1LCAweDYwNWYsIDB4YjViNSwgMHgyMDYxLCAweDAxMDAsIDB4NjA0MywKKwkweDAwMDUsIDB4NjA0MywgMHgwMDA0LCAweDIwMDksIDB4MDdkMCwgMHgyMDExLCAweDVlZjcsIDB4MDgwYywKKwkweDg2YmMsIDB4MDAwNSwgMHg3MDkwLCAweDkwMDUsIDB4MDEzMCwgMHgyMDExLCAweDVlZjcsIDB4MDgwYywKKwkweDg2YzgsIDB4NzA5YiwgMHgwMDAwLCAweDAwMDUsIDB4NzA5YiwgMHgwMDExLCAweDA4MGMsIDB4YTcxMywKKwkweDA4MGMsIDB4NjA2YywgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwgMHgwMjYwLCAweDIwZTksIDB4MDAwMCwKKwkweDIwYTEsIDB4MDI0MCwgMHg3NDkwLCAweDk0ODAsIDB4MDAxOCwgMHg5MDgwLCAweDAwMDcsIDB4OTA4NCwKKwkweDAzZjgsIDB4ODAwNCwgMHgyMGE4LCAweDQwMDMsIDB4MDgwYywgMHg2MDRmLCAweDExYTAsIDB4NzE3YywKKwkweDgxZmYsIDB4MDE4OCwgMHg5MDBlLCAweDcwODAsIDB4OTA4NCwgMHgwMGZmLCAweDAxNjAsIDB4MDgwYywKKwkweDI2NjEsIDB4OTE4NiwgMHgwMDdlLCAweDAxMzgsIDB4OTE4NiwgMHgwMDgwLCAweDAxMjAsIDB4MjAxMSwKKwkweDAwMDgsIDB4MDgwYywgMHg1ZWE0LCAweDYwYzMsIDB4MDAxNCwgMHgwODBjLCAweDVmMjEsIDB4MDAwNSwKKwkweDAwZjYsIDB4NzA5MCwgMHg5MDA1LCAweDA1MDAsIDB4MjAxMSwgMHg1ZWY3LCAweDA4MGMsIDB4ODZjOCwKKwkweDkwODYsIDB4MDAxNCwgMHgxMWI4LCAweDA4MGMsIDB4NjA2YywgMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwKKwkweDkyOTYsIDB4MTEwMywgMHgxMTc4LCAweDc4MzQsIDB4OTAwNSwgMHgxMTYwLCAweDdhMzgsIDB4ZDJmYywKKwkweDAxMjgsIDB4NzBjNCwgMHg5MDA1LCAweDExMTAsIDB4NzBjNywgMHgwMDAxLCAweDcwOWIsIDB4MDAxMiwKKwkweDAwMjksIDB4MDAxMCwgMHg3MDkzLCAweDAwMDAsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5YiwKKwkweDAwMTMsIDB4MDgwYywgMHg1ZmZlLCAweDIwNzksIDB4MDI0MCwgMHg3ODMzLCAweDExMDMsIDB4NzgzNywKKwkweDAwMDAsIDB4MDgwYywgMHg2MDZjLCAweDA4MGMsIDB4NjA0ZiwgMHgxMTcwLCAweDcwODQsIDB4OTAwNSwKKwkweDExNTgsIDB4NzE1YywgMHg5MTg2LCAweGZmZmYsIDB4MDEzOCwgMHgyMDExLCAweDAwMDgsIDB4MDgwYywKKwkweDVlYTQsIDB4MDE2OCwgMHgwODBjLCAweDYwMjUsIDB4MjBhOSwgMHgwMDA4LCAweDIwZTEsIDB4MDAwMCwKKwkweDIwOTksIDB4MDI2ZSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMjRlLCAweDQwMDMsIDB4NjBjMywKKwkweDAwMTQsIDB4MDgwYywgMHg1ZjIxLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOTAsIDB4OTAwNSwKKwkweDA1MDAsIDB4MjAxMSwgMHg1ZWY3LCAweDA4MGMsIDB4ODZjOCwgMHg5MDg2LCAweDAwMTQsIDB4MTFiOCwKKwkweDA4MGMsIDB4NjA2YywgMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LCAweDExMDQsIDB4MTE3OCwKKwkweDc4MzQsIDB4OTAwNSwgMHgxMTYwLCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYzQsIDB4OTAwNSwKKwkweDExMTAsIDB4NzBjNywgMHgwMDAxLCAweDcwOWIsIDB4MDAxNCwgMHgwMDI5LCAweDAwMTAsIDB4NzA5MywKKwkweDAwMDAsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5YiwgMHgwMDE1LCAweDA4MGMsIDB4NWZmZSwKKwkweDIwNzksIDB4MDI0MCwgMHg3ODMzLCAweDExMDQsIDB4NzgzNywgMHgwMDAwLCAweDA4MGMsIDB4NjA2YywKKwkweDA4MGMsIDB4NjA0ZiwgMHgxMWI4LCAweDcwODQsIDB4OTAwNSwgMHgxMWEwLCAweDcxNjQsIDB4OTE4NiwKKwkweGZmZmYsIDB4MDE4MCwgMHg5MTgwLCAweDMzYjksIDB4MjAwZCwgMHg5MThjLCAweGZmMDAsIDB4ODEwZiwKKwkweDIwMTEsIDB4MDAwOCwgMHgwODBjLCAweDVlYTQsIDB4MDE4MCwgMHgwODBjLCAweDUwMmQsIDB4MDExMCwKKwkweDA4MGMsIDB4MjZjYSwgMHgyMGE5LCAweDAwMDgsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDI2ZSwKKwkweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNGUsIDB4NDAwMywgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywKKwkweDVmMjEsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5MCwgMHg5MDA1LCAweDA1ZjAsIDB4MjAxMSwKKwkweDVlZjcsIDB4MDgwYywgMHg4NmM4LCAweDkwODYsIDB4MDAxNCwgMHgxNWE4LCAweDA4MGMsIDB4NjA2YywKKwkweDIwNzksIDB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwNSwgMHgxNTY4LCAweDc4MzQsIDB4OTA4NCwKKwkweDAxMDAsIDB4MjAxMSwgMHgwMTAwLCAweDkyMWUsIDB4MTE2OCwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywKKwkweDYwOTcsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBjNCwgMHg5MDA1LCAweDExMTAsIDB4NzBjNywKKwkweDAwMDEsIDB4MDA4MCwgMHg5MDA1LCAweDExYjgsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBjNCwKKwkweDkwMDUsIDB4MTExMCwgMHg3MGM3LCAweDAwMDEsIDB4OTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4NjA5NywKKwkweDcwOTcsIDB4MDAwMCwgMHg3YTM4LCAweGQyZjQsIDB4MDExMCwgMHg3MGRmLCAweDAwMDgsIDB4NzA5YiwKKwkweDAwMTYsIDB4MDAyOSwgMHgwMDEwLCAweDcwOTMsIDB4MDAwMCwgMHgwMGZlLCAweDAwMDUsIDB4MDgwYywKKwkweGE3MTMsIDB4MDgwYywgMHg2MDZjLCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAyNjAsIDB4MjBlOSwKKwkweDAwMDAsIDB4MjBhMSwgMHgwMjQwLCAweDIwYTksIDB4MDAwZSwgMHg0MDAzLCAweDIwMTEsIDB4MDI2ZCwKKwkweDIyMDQsIDB4OTA4NCwgMHgwMTAwLCAweDIwMTEsIDB4MDI0ZCwgMHgyMDEyLCAweDIwMTEsIDB4MDI2ZSwKKwkweDcwOWIsIDB4MDAxNywgMHgwODBjLCAweDYwNGYsIDB4MTE1MCwgMHg3MDg0LCAweDkwMDUsIDB4MTEzOCwKKwkweDA4MGMsIDB4NWUxNywgMHgxMTg4LCAweDkwODUsIDB4MDAwMSwgMHgwODBjLCAweDI2Y2EsIDB4MjBhOSwKKwkweDAwMDgsIDB4MDgwYywgMHg2MDZjLCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAyNmUsIDB4MjBlOSwKKwkweDAwMDAsIDB4MjBhMSwgMHgwMjRlLCAweDQwMDMsIDB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NWYyMSwKKwkweDAwMTAsIDB4MDgwYywgMHg1OTcxLCAweDAwMDUsIDB4MDBmNiwgMHg3MDkwLCAweDkwMDUsIDB4MDFkOCwKKwkweDIwMTEsIDB4NWVmNywgMHgwODBjLCAweDg2YzgsIDB4OTA4NiwgMHgwMDg0LCAweDExOTAsIDB4MDgwYywKKwkweDYwNmMsIDB4MjA3OSwgMHgwMjYwLCAweDdhMzAsIDB4OTI5NiwgMHgxMTA2LCAweDExNTAsIDB4NzgzNCwKKwkweDkwMDUsIDB4MTEzOCwgMHg5MDA2LCAweDA4MGMsIDB4NjA5NywgMHg3MDliLCAweDAwMTgsIDB4MDAyOSwKKwkweDAwMTAsIDB4NzA5MywgMHgwMDAwLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOWIsIDB4MDAxOSwKKwkweDA4MGMsIDB4NWZmZSwgMHgyMDc5LCAweDAyNDAsIDB4NzgzMywgMHgxMTA2LCAweDc4MzcsIDB4MDAwMCwKKwkweDA4MGMsIDB4NjA2YywgMHgyMDA5LCAweDAyNmUsIDB4MjAzOSwgMHgxZDBlLCAweDIwYTksIDB4MDA0MCwKKwkweDIxM2UsIDB4ODczOCwgMHg4MTA4LCAweDkxODYsIDB4MDI4MCwgMHgxMTI4LCAweDY4MTQsIDB4ODAwMCwKKwkweDY4MTYsIDB4MjAwOSwgMHgwMjYwLCAweDFmMDQsIDB4NWQ4MCwgMHgyMDM5LCAweDFkMGUsIDB4MDgwYywKKwkweDYwNGYsIDB4MTFlOCwgMHgyNzI4LCAweDI1MTQsIDB4ODIwNywgMHg5MDg0LCAweDAwZmYsIDB4ODAwMCwKKwkweDIwMTgsIDB4OTI5NCwgMHgwMGZmLCAweDgwMDcsIDB4OTIwNSwgMHgyMDJhLCAweDcwNjAsIDB4MjMxMCwKKwkweDgyMTQsIDB4OTJhMCwgMHgxZDBlLCAweDI0MTQsIDB4OTM4YywgMHgwMDAxLCAweDAxMTgsIDB4OTI5NCwKKwkweGZmMDAsIDB4MDAxOCwgMHg5Mjk0LCAweDAwZmYsIDB4ODAwNywgMHg5MjE1LCAweDIyMjIsIDB4MjBhOSwKKwkweDAwNDAsIDB4MjAwOSwgMHgwMjRlLCAweDI3MGUsIDB4ODczOCwgMHg4MTA4LCAweDkxODYsIDB4MDI2MCwKKwkweDExMjgsIDB4NjgxMCwgMHg4MDAwLCAweDY4MTIsIDB4MjAwOSwgMHgwMjQwLCAweDFmMDQsIDB4NWRiMywKKwkweDYwYzMsIDB4MDA4NCwgMHgwODBjLCAweDVmMjEsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5MCwKKwkweDkwMDUsIDB4MDFlMCwgMHgyMDExLCAweDVlZjcsIDB4MDgwYywgMHg4NmM4LCAweDkwODYsIDB4MDA4NCwKKwkweDExOTgsIDB4MDgwYywgMHg2MDZjLCAweDIwNzksIDB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwNywKKwkweDExNTgsIDB4NzgzNCwgMHg5MDA1LCAweDExNDAsIDB4NzA5NywgMHgwMDAxLCAweDA4MGMsIDB4NWZjMiwKKwkweDcwOWIsIDB4MDAxYSwgMHgwMDI5LCAweDAwMTAsIDB4NzA5MywgMHgwMDAwLCAweDAwZmUsIDB4MDAwNSwKKwkweDkwODUsIDB4MDAwMSwgMHgwODBjLCAweDYwOTcsIDB4NzA5YiwgMHgwMDFiLCAweDA4MGMsIDB4YTcxMywKKwkweDA4MGMsIDB4NjA2YywgMHgyMDExLCAweDAyNjAsIDB4MjAwOSwgMHgwMjQwLCAweDc0OTAsIDB4OTQ4MCwKKwkweDAwMTgsIDB4OTA4MCwgMHgwMDA3LCAweDkwODQsIDB4MDNmOCwgMHg4MDA0LCAweDIwYTgsIDB4MjIwZSwKKwkweDgyMTAsIDB4ODEwOCwgMHg5MTg2LCAweDAyNjAsIDB4MTE1MCwgMHg2ODEwLCAweDgwMDAsIDB4NjgxMiwKKwkweDIwMDksIDB4MDI0MCwgMHg2ODE0LCAweDgwMDAsIDB4NjgxNiwgMHgyMDExLCAweDAyNjAsIDB4MWYwNCwKKwkweDVkZmYsIDB4NjBjMywgMHgwMDg0LCAweDA4MGMsIDB4NWYyMSwgMHgwMDA1LCAweDAwMDUsIDB4MDA4NiwKKwkweDAwOTYsIDB4MjAyOSwgMHgxODQ4LCAweDI1MmMsIDB4MjBhOSwgMHgwMDA4LCAweDIwNDEsIDB4MWQwZSwKKwkweDIwZTksIDB4MDAwMSwgMHgyOGEwLCAweDA4MGMsIDB4NjA2YywgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwKKwkweDAyNmUsIDB4NDAwMywgMHgyMGE5LCAweDAwMDgsIDB4MjAxMSwgMHgwMDA3LCAweGQ1ZDQsIDB4MDEwOCwKKwkweDkwMTYsIDB4MjgwMCwgMHg5MjAwLCAweDIwMGMsIDB4OTFhNiwgMHhmZmZmLCAweDExNDgsIDB4ZDVkNCwKKwkweDAxMTAsIDB4ODIxMCwgMHgwMDA4LCAweDgyMTEsIDB4MWYwNCwgMHg1ZTMxLCAweDA4MDQsIDB4NWVhMCwKKwkweDgyZmYsIDB4MTE2MCwgMHhkNWQ0LCAweDAxMjAsIDB4OTFhNiwgMHgzZmZmLCAweDBkOTAsIDB4MDAyMCwKKwkweDkxYTYsIDB4M2ZmZiwgMHgwOTA0LCAweDVlYTAsIDB4OTE4ZCwgMHhjMDAwLCAweDIwYTksIDB4MDAxMCwKKwkweDIwMTksIDB4MDAwMSwgMHhkNWQ0LCAweDAxMTAsIDB4MjAxOSwgMHgwMDEwLCAweDIxMjAsIDB4ZDVkNCwKKwkweDAxMTAsIDB4ODQyMywgMHgwMDA4LCAweDg0MjQsIDB4MTI0MCwgMHhkNWQ0LCAweDAxMTAsIDB4ODMxOSwKKwkweDAwMDgsIDB4ODMxOCwgMHgxZjA0LCAweDVlNTcsIDB4MDRkOCwgMHgyM2E4LCAweDIwMjEsIDB4MDAwMSwKKwkweDg0MjYsIDB4ODQyNSwgMHgxZjA0LCAweDVlNjksIDB4MjMyOCwgMHg4NTI5LCAweDkyYmUsIDB4MDAwNywKKwkweDAxNTgsIDB4MDAwNiwgMHgyMDM5LCAweDAwMDcsIDB4MjIwMCwgMHg5NzNhLCAweDAwMGUsIDB4MjdhOCwKKwkweDk1YTgsIDB4MDAxMCwgMHgxZjA0LCAweDVlNzgsIDB4NzU1ZSwgMHg5NWM4LCAweDMzYjksIDB4MjkyZCwKKwkweDk1YWMsIDB4MDBmZiwgMHg3NTgyLCAweDY1MzIsIDB4NjUzNiwgMHgwMDE2LCAweDI1MDgsIDB4MDgwYywKKwkweDI2YWEsIDB4MDAxZSwgMHg2MGU3LCAweDAwMDAsIDB4NjVlYSwgMHgyMDE4LCAweDIzMDQsIDB4OTQwNSwKKwkweDIwMWEsIDB4NzA4NywgMHgwMDAxLCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNGUsIDB4MjBlMSwKKwkweDAwMDEsIDB4Mjg5OCwgMHgyMGE5LCAweDAwMDgsIDB4NDAwMywgMHg5MDg1LCAweDAwMDEsIDB4MDAwOCwKKwkweDkwMDYsIDB4MDA5ZSwgMHgwMDhlLCAweDAwMDUsIDB4MDE1NiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MjJhOCwgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwgMHgwMjZlLCAweDIwZTksIDB4MDAwMCwKKwkweDIwMTEsIDB4MDI0ZSwgMHgyMmEwLCAweDQwMDMsIDB4MDE0ZSwgMHgwMTNlLCAweDAxZGUsIDB4MDFjZSwKKwkweDAxNWUsIDB4MjExOCwgMHg5MDI2LCAweDIwMDEsIDB4MDAwNywgMHg5MzlhLCAweDAwMTAsIDB4MDIxOCwKKwkweDg0MjAsIDB4ODAwMSwgMHgwY2QwLCAweDIxMTgsIDB4ODRmZiwgMHgwMTIwLCAweDkzOWEsIDB4MDAxMCwKKwkweDg0MjEsIDB4MWRlMCwgMHgyMDIxLCAweDAwMDEsIDB4ODNmZiwgMHgwMTE4LCAweDg0MjMsIDB4ODMxOSwKKwkweDFkZTgsIDB4OTIzOCwgMHgyMDI5LCAweDAyNmUsIDB4OTUyOCwgMHgyNTA0LCAweDk0MmMsIDB4MTFiOCwKKwkweDk0MDUsIDB4MjAzYSwgMHg3MTVlLCAweDkxYTAsIDB4MzNiOSwgMHgyNDJkLCAweDk1YWMsIDB4MDBmZiwKKwkweDc1ODIsIDB4NjUzMiwgMHg2NTM2LCAweDAwMTYsIDB4MjUwOCwgMHgwODBjLCAweDI2YWEsIDB4MDAxZSwKKwkweDYwZTcsIDB4MDAwMCwgMHg2NWVhLCAweDcwODcsIDB4MDAwMSwgMHg5MDg0LCAweDAwMDAsIDB4MDAwNSwKKwkweDAwZTYsIDB4MjA3MSwgMHgxODAwLCAweDcwOGIsIDB4MDAwMCwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDIwNzEsIDB4MDE0MCwgMHgwODBjLCAweDVmYjEsIDB4MDgwYywKKwkweDllZDQsIDB4NzAwNCwgMHg5MDg0LCAweDQwMDAsIDB4MDExMCwgMHgwODBjLCAweDJhOGEsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDE4MjYsIDB4MjA3MywgMHgwMDAwLCAweDc4NDAsIDB4MDAyNiwKKwkweDAwMTYsIDB4MjAwOSwgMHgwMGY3LCAweDA4MGMsIDB4NjAwZSwgMHgwMDFlLCAweDkwOTQsIDB4MDAxMCwKKwkweDkyODUsIDB4MDA4MCwgMHg3ODQyLCAweDdhNDIsIDB4MDAyZSwgMHgwMTJlLCAweDAwZmUsIDB4MDBlZSwKKwkweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHgyOWU1LCAweDAyMjgsIDB4MjAxMSwKKwkweDAxMDEsIDB4MjIwNCwgMHhjMGM1LCAweDIwMTIsIDB4MjAxMSwgMHgxOWYzLCAweDIwMTMsIDB4MDAwMCwKKwkweDcwOTMsIDB4MDAwMCwgMHgwMTJlLCAweDYwYTMsIDB4MDA1NiwgMHg2MGE3LCAweDk1NzUsIDB4MDgwYywKKwkweDllYzcsIDB4NjE0NCwgMHhkMTg0LCAweDAxMjAsIDB4NzE5OCwgMHg5MThkLCAweDIwMDAsIDB4MDAxOCwKKwkweDcxOGMsIDB4OTE4ZCwgMHgxMDAwLCAweDIwMTEsIDB4MTk5OCwgMHgyMTEyLCAweDIwMDksIDB4MDdkMCwKKwkweDIwMTEsIDB4NWVmNywgMHgwODBjLCAweDg3OTIsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsIDB4MDBjNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4YTkxZSwgMHgwODBjLCAweGFiZTksIDB4MDgwYywKKwkweGE5M2EsIDB4MjAwOSwgMHgwMGY3LCAweDA4MGMsIDB4NjAwZSwgMHgyMDYxLCAweDFhMDIsIDB4OTAwZSwKKwkweDYxMWEsIDB4NjExZSwgMHg2MTcyLCAweDYxNzYsIDB4MjA2MSwgMHgxODAwLCAweDYwMDMsIDB4MDAwMSwKKwkweDIwNjEsIDB4MDEwMCwgMHg2MDQzLCAweDAwOTAsIDB4NjA0MywgMHgwMDEwLCAweDIwMDksIDB4MTk5OCwKKwkweDIwMGIsIDB4MDAwMCwgMHgyMDA5LCAweDAwMmQsIDB4MjAxMSwgMHg1ZjdkLCAweDA4MGMsIDB4ODZiYywKKwkweDAxMmUsIDB4MDBjZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwMDYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwNDcxLCAweDIwNzEsIDB4MDEwMCwgMHgwODBjLCAweDllZDQsIDB4MjA3MSwKKwkweDAxNDAsIDB4NzAwNCwgMHg5MDg0LCAweDQwMDAsIDB4MDExMCwgMHgwODBjLCAweDJhOGEsIDB4MDgwYywKKwkweDc1NDUsIDB4MDE4OCwgMHgwODBjLCAweDc1NjAsIDB4MTE3MCwgMHgwODBjLCAweDc4NGEsIDB4MDAxNiwKKwkweDA4MGMsIDB4Mjc3OSwgMHgyMDAxLCAweDE5NmMsIDB4MjEwMiwgMHgwMDFlLCAweDA4MGMsIDB4Nzg0NSwKKwkweDA4MGMsIDB4NzQ2ZSwgMHgwMDUwLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLCAweDJhNjYsIDB4MjAwMSwKKwkweDAwMDEsIDB4MDgwYywgMHgyNjA2LCAweDA4MGMsIDB4NWY0ZCwgMHgwMTJlLCAweDAwMGUsIDB4MDBlZSwKKwkweDAwMDUsIDB4MjAwMSwgMHgxODBlLCAweDIwMDQsIDB4ZDBiYywgMHgwMTU4LCAweDAwMjYsIDB4MDAzNiwKKwkweDIwMTEsIDB4ODAxNywgMHgyMDAxLCAweDE5OTgsIDB4MjAxYywgMHgwODBjLCAweDRiNTIsIDB4MDAzZSwKKwkweDAwMmUsIDB4MDAwNSwgMHgyMGE5LCAweDAwMTIsIDB4MjBlOSwgMHgwMDAxLCAweDIwYTEsIDB4MWQ4MCwKKwkweDA4MGMsIDB4NjA2YywgMHgyMGU5LCAweDAwMDAsIDB4MjA5OSwgMHgwMjZlLCAweDAwOTksIDB4MjBhOSwKKwkweDAwMjAsIDB4MDgwYywgMHg2MDY2LCAweDIwOTksIDB4MDI2MCwgMHgyMGExLCAweDFkOTIsIDB4MDA1MSwKKwkweDIwYTksIDB4MDAwZSwgMHgwODBjLCAweDYwNjksIDB4MjA5OSwgMHgwMjYwLCAweDIwYTEsIDB4MWRiMiwKKwkweDAwMDksIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsIDB4MzQxMCwgMHgzMzA4LCAweDIxMDQsIDB4ODAwNywKKwkweDIwMTIsIDB4ODEwOCwgMHg4MjEwLCAweDFmMDQsIDB4NWZlNiwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwKKwkweDA4MGMsIDB4YTcxMywgMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwgMHgxZDAwLCAweDIwZTksIDB4MDAwMCwKKwkweDIwYTEsIDB4MDI0MCwgMHgyMGE5LCAweDAwMGMsIDB4NDAwMywgMHgwMDA1LCAweDA4MGMsIDB4YTcxMywKKwkweDA4MGMsIDB4NjA2YywgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwgMHgwMjYwLCAweDIwZTksIDB4MDAwMCwKKwkweDIwYTEsIDB4MDI0MCwgMHgyMGE5LCAweDAwMGMsIDB4NDAwMywgMHgwMDA1LCAweDAwYzYsIDB4MDAwNiwKKwkweDIwNjEsIDB4MDEwMCwgMHg4MTBmLCAweDIwMDEsIDB4MTgzNCwgMHgyMDA0LCAweDkwMDUsIDB4MTEzOCwKKwkweDIwMDEsIDB4MTgxOCwgMHgyMDA0LCAweDkwODQsIDB4MDBmZiwgMHg5MTA1LCAweDAwMTAsIDB4OTE4NSwKKwkweDAwZjcsIDB4NjA0YSwgMHgwMDBlLCAweDAwY2UsIDB4MDAwNSwgMHgwMDE2LCAweDAwNDYsIDB4MDgwYywKKwkweDZhZDksIDB4MDE1OCwgMHg5MDA2LCAweDIwMjAsIDB4MjAwOSwgMHgwMDJhLCAweDA4MGMsIDB4ZTQ0NSwKKwkweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGMxOTUsIDB4MjEwMiwgMHgyMDE5LCAweDAwMmEsIDB4OTAwZSwKKwkweDA4MGMsIDB4MzIwNSwgMHgwODBjLCAweGQwOWIsIDB4MDE0MCwgMHgwMDM2LCAweDIwMTksIDB4ZmZmZiwKKwkweDIwMjEsIDB4MDAwNywgMHgwODBjLCAweDRkMDksIDB4MDAzZSwgMHgwMDRlLCAweDAwMWUsIDB4MDAwNSwKKwkweDA4MGMsIDB4NWY0ZCwgMHg3MDliLCAweDAwMDAsIDB4NzA5MywgMHgwMDAwLCAweDAwMDUsIDB4MDAwNiwKKwkweDIwMDEsIDB4MTgwYywgMHgyMDA0LCAweGQwOWMsIDB4MDEwMCwgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwKKwkweDAwMTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAwMSwgMHgwMTAxLCAweDIwMGMsIDB4OTE4ZCwKKwkweDAwMDYsIDB4MjEwMiwgMHgwMTJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDIwMDksIDB4MDAwMSwKKwkweDAwMjAsIDB4MjAwOSwgMHgwMDAyLCAweDAwMDgsIDB4OTAwZSwgMHg2ODE0LCAweDkwODQsIDB4ZmZjMCwKKwkweDkxMGQsIDB4NjkxNiwgMHgwMDA1LCAweDAwZjYsIDB4MDE1NiwgMHgwMTQ2LCAweDAxZDYsIDB4OTAwNiwKKwkweDIwYTksIDB4MDA4MCwgMHgyMGU5LCAweDAwMDEsIDB4MjBhMSwgMHgxZDAwLCAweDQwMDQsIDB4MjA3OSwKKwkweDFkMDAsIDB4NzgwMywgMHgyMjAwLCAweDc4MDcsIDB4MDBlZiwgMHg3ODBmLCAweDAwZWYsIDB4NzgxMywKKwkweDAxMzgsIDB4NzgyMywgMHhmZmZmLCAweDc4MjcsIDB4ZmZmZiwgMHgwMWRlLCAweDAxNGUsIDB4MDE1ZSwKKwkweDAwZmUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MDAsIDB4MjAwMywgMHgwMDAxLCAweDAwMDUsIDB4MjAwMSwKKwkweDE5YTUsIDB4MDExOCwgMHgyMDAzLCAweDAwMDEsIDB4MDAxMCwgMHgyMDAzLCAweDAwMDAsIDB4MDAwNSwKKwkweDAxNTYsIDB4MjBhOSwgMHgwODAwLCAweDIwMDksIDB4MTAwMCwgMHg5MDA2LCAweDIwMGEsIDB4ODEwOCwKKwkweDFmMDQsIDB4NjBhNiwgMHgwMTVlLCAweDAwMDUsIDB4MDBkNiwgMHgwMDM2LCAweDAxNTYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MjA2OSwgMHgxODQ3LCAweDkwMDYsIDB4YjgwMiwgMHhiOGQ2LCAweGI4MDcsIDB4MDcwNywKKwkweGI4MGEsIDB4YjgwZSwgMHhiODEyLCAweDkxOTgsIDB4MzNiOSwgMHgyMzFkLCAweDkzOWMsIDB4MDBmZiwKKwkweGJiMTYsIDB4MDAxNiwgMHgwMDI2LCAweGI4ODYsIDB4MDgwYywgMHhhYmUyLCAweDExMjAsIDB4OTE5MiwKKwkweDAwN2UsIDB4MTIwOCwgMHhiYjg2LCAweDIwYTksIDB4MDAwNCwgMHhiOGM0LCAweDIwZTgsIDB4YjljOCwKKwkweDkxOTgsIDB4MDAwNiwgMHg5MDA2LCAweDIzYTAsIDB4NDAwNCwgMHgyMGE5LCAweDAwMDQsIDB4OTE5OCwKKwkweDAwMGEsIDB4MjNhMCwgMHg0MDA0LCAweDAwMmUsIDB4MDAxZSwgMHhiODNlLCAweGI4NDIsIDB4YjhjZSwKKwkweGI4ZDIsIDB4Yjg1ZSwgMHhiODYyLCAweGI4NjYsIDB4Yjg2YSwgMHhiODZmLCAweDAxMDAsIDB4Yjg3MiwKKwkweGI4NzYsIDB4Yjg3YSwgMHhiODhhLCAweGI4OGUsIDB4Yjg5MywgMHgwMDA4LCAweGI4OTYsIDB4Yjg5YSwKKwkweGI4OWUsIDB4YjhiZSwgMHhiOWEyLCAweDAwOTYsIDB4YjhhNCwgMHg5MDRkLCAweDAxMTAsIDB4MDgwYywKKwkweDEwNzksIDB4YjhhNywgMHgwMDAwLCAweDAwOWUsIDB4OTAwNiwgMHhiODRhLCAweDY4MTAsIDB4YjgzYSwKKwkweDY4MGMsIDB4Yjg0NiwgMHhiOGJiLCAweDA1MjAsIDB4YjhhYywgMHg5MDA1LCAweDAxOTgsIDB4MDBjNiwKKwkweDIwNjAsIDB4OWM4MiwgMHgxZGRjLCAweDBhMGMsIDB4MGQ3ZCwgMHgyMDAxLCAweDE4MWEsIDB4MjAwNCwKKwkweDljMDIsIDB4MWEwYywgMHgwZDdkLCAweDA4MGMsIDB4OGMxZiwgMHgwMGNlLCAweDA5MGMsIDB4OGZiYywKKwkweGI4YWYsIDB4MDAwMCwgMHg2ODE0LCAweDkwODQsIDB4MDBmZiwgMHhiODQyLCAweDAxNGUsIDB4MDEzZSwKKwkweDAxNWUsIDB4MDAzZSwgMHgwMGRlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YTk3NCwKKwkweGFlNzgsIDB4OTY4NCwgMHgzZmZmLCAweDkwODIsIDB4NDAwMCwgMHgxYTA0LCAweDYxODIsIDB4OTE4MiwKKwkweDA4MDAsIDB4MWEwNCwgMHg2MTg2LCAweDIwMDEsIDB4MTgwYywgMHgyMDA0LCAweDkwODQsIDB4MDAwMywKKwkweDE5MDQsIDB4NjE4YywgMHg5MTg4LCAweDEwMDAsIDB4MjEwNCwgMHg5MDVkLCAweDAxOTgsIDB4YjgwNCwKKwkweDkwODQsIDB4MDBmZiwgMHg5MDhlLCAweDAwMDYsIDB4MTE4OCwgMHhiOGE0LCAweDkwMGQsIDB4MTkwNCwKKwkweDYxOWUsIDB4MDgwYywgMHg2NTVlLCAweDkwMDYsIDB4MDEyZSwgMHgwMDA1LCAweDIwMDEsIDB4MDAwNSwKKwkweDkwMGUsIDB4MDRiOCwgMHgyMDAxLCAweDAwMjgsIDB4OTAwZSwgMHgwNDk4LCAweDkwODIsIDB4MDAwNiwKKwkweDEyOTAsIDB4MDgwYywgMHhhYmUyLCAweDExNjAsIDB4YjhhMCwgMHg5MDg0LCAweGZmODAsIDB4MTE0MCwKKwkweGI5MDAsIDB4ZDFmYywgMHgwZDEwLCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LCAweDEwMDAsIDB4MDQwOCwKKwkweDIwMDEsIDB4MDAyOCwgMHgwMGE4LCAweDIwMDksIDB4MTgwYywgMHgyMTBjLCAweGQxOGMsIDB4MDExOCwKKwkweDIwMDEsIDB4MDAwNCwgMHgwMDY4LCAweGQxODQsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsIDB4MDA0MCwKKwkweDIwMDEsIDB4MDAyOSwgMHhiOTAwLCAweGQxZmMsIDB4MDExOCwgMHgyMDA5LCAweDEwMDAsIDB4MDA0OCwKKwkweDkwMGUsIDB4MDAzOCwgMHgyMDAxLCAweDAwMjksIDB4OTAwZSwgMHgwMDE4LCAweDIwMDEsIDB4MDAyOSwKKwkweDkwMGUsIDB4OTAwNSwgMHgwMTJlLCAweDAwMDUsIDB4MjAwMSwgMHgxODBjLCAweDIwMDQsIDB4ZDA4NCwKKwkweDE5ZDAsIDB4OTE4OCwgMHgxMDAwLCAweDIxMDQsIDB4OTA2NSwgMHgwOWE4LCAweDA4MGMsIDB4NmFkZCwKKwkweDE5OTAsIDB4YjgwMCwgMHhkMGJjLCAweDA5NzgsIDB4MDgwNCwgMHg2MTQ1LCAweDA4MGMsIDB4NjkwMiwKKwkweDA5MDQsIDB4NjE0ZSwgMHgwODA0LCAweDYxNDksIDB4MDBlNiwgMHgyMDcxLCAweDE5ZTYsIDB4NzAwNCwKKwkweDkwODYsIDB4MDAwMiwgMHgxMTI4LCAweDcwMzAsIDB4OTA4MCwgMHgwMDA0LCAweDIwMDQsIDB4OWIwNiwKKwkweDAwZWUsIDB4MDAwNSwgMHgwMGI2LCAweDAwZTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YTg3NCwKKwkweDkwOGUsIDB4MDBmZiwgMHgxMTIwLCAweDIwMDEsIDB4MTk2YSwgMHgyMDVjLCAweDAwNjAsIDB4YTk3NCwKKwkweDkxODIsIDB4MDgwMCwgMHgxNjkwLCAweDkxODgsIDB4MTAwMCwgMHgyMTA0LCAweDkwNWQsIDB4MDFkMCwKKwkweDA4MGMsIDB4NmE3ZCwgMHgxMWQwLCAweDA4MGMsIDB4YWM1YSwgMHgwNTcwLCAweDJiMDAsIDB4NjAxMiwKKwkweDI5MDAsIDB4NjAxNiwgMHg2MDIzLCAweDAwMDksIDB4NjAyYiwgMHgwMDAwLCAweGE4NzQsIDB4OTA4ZSwKKwkweDAwZmYsIDB4MTExMCwgMHg2MDJiLCAweDgwMDAsIDB4MjAwOSwgMHgwMDQzLCAweDA4MGMsIDB4YWQ0ZCwKKwkweDkwMDYsIDB4MDBiMCwgMHgyMDAxLCAweDAwMjgsIDB4MDA5MCwgMHgyMDA5LCAweDE4MGMsIDB4MjEwYywKKwkweGQxOGMsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsIDB4MDAzOCwgMHhkMTg0LCAweDAxMTgsIDB4MjAwMSwKKwkweDAwMDQsIDB4MDAxMCwgMHgyMDAxLCAweDAwMjksIDB4MDAxMCwgMHgyMDAxLCAweDAwMjksIDB4OTAwNSwKKwkweDAxMmUsIDB4MDBlZSwgMHgwMGJlLCAweDAwMDUsIDB4MjAwMSwgMHgwMDJjLCAweDBjYzAsIDB4MDBiNiwKKwkweDAwZTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YTk3NCwgMHg5MTgyLCAweDA4MDAsIDB4MWEwNCwKKwkweDYyN2QsIDB4OTE4OCwgMHgxMDAwLCAweDIxMDQsIDB4OTA1ZCwgMHgwOTA0LCAweDYyNTUsIDB4YjhhMCwKKwkweDkwODYsIDB4MDA3ZiwgMHgwMTkwLCAweGE4N2MsIDB4ZDBmYywgMHgxMTc4LCAweDA4MGMsIDB4NmFlNSwKKwkweDAxNjAsIDB4YTk5NCwgMHg4MWZmLCAweDAxMzAsIDB4OTA4ZSwgMHgwMDA0LCAweDAxMzAsIDB4OTA4ZSwKKwkweDAwMDUsIDB4MDExOCwgMHgwODBjLCAweDZhZGQsIDB4MTU5OCwgMHhhODdjLCAweGQwZmMsIDB4MDFlMCwKKwkweGE4OTQsIDB4OTAwNSwgMHgwMWM4LCAweDIwNjAsIDB4MDAyNiwgMHgyMDEwLCAweDA4MGMsIDB4Yzk2OCwKKwkweDAwMmUsIDB4MTEyMCwgMHgyMDAxLCAweDAwMDgsIDB4MDgwNCwgMHg2MjdmLCAweDYwMjAsIDB4OTA4NiwKKwkweDAwMGEsIDB4MDEyMCwgMHgyMDAxLCAweDAwMDgsIDB4MDgwNCwgMHg2MjdmLCAweDYwMWEsIDB4NjAwMywKKwkweDAwMDgsIDB4MjkwMCwgMHg2MDE2LCAweDAwNTgsIDB4MDgwYywgMHhhYzVhLCAweDA1ZTgsIDB4MmIwMCwKKwkweDYwMTIsIDB4MjkwMCwgMHg2MDE2LCAweDYwMGIsIDB4ZmZmZiwgMHg2MDIzLCAweDAwMGEsIDB4MjAwOSwKKwkweDAwMDMsIDB4MDgwYywgMHhhZDRkLCAweDkwMDYsIDB4MDQ1OCwgMHgyMDAxLCAweDAwMjgsIDB4MDQzOCwKKwkweDkwODIsIDB4MDAwNiwgMHgxMjkwLCAweDA4MGMsIDB4YWJlMiwgMHgxMTYwLCAweGI4YTAsIDB4OTA4NCwKKwkweGZmODAsIDB4MTE0MCwgMHhiOTAwLCAweGQxZmMsIDB4MDkwMCwgMHgyMDAxLCAweDAwMjksIDB4MjAwOSwKKwkweDEwMDAsIDB4MDBhOCwgMHgyMDAxLCAweDAwMjgsIDB4MDA5MCwgMHgyMDA5LCAweDE4MGMsIDB4MjEwYywKKwkweGQxOGMsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsIDB4MDA1MCwgMHhkMTg0LCAweDAxMTgsIDB4MjAwMSwKKwkweDAwMDQsIDB4MDAyOCwgMHgyMDAxLCAweDAwMjksIDB4MDAxMCwgMHgyMDAxLCAweDAwMjksIDB4OTAwNSwKKwkweDAxMmUsIDB4MDBlZSwgMHgwMGJlLCAweDAwMDUsIDB4MjAwMSwgMHgwMDJjLCAweDBjYzAsIDB4MDBmNiwKKwkweDAwYjYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YThlMCwgMHg5MDA1LCAweDE1NTAsIDB4YThkYywKKwkweDkwODIsIDB4MDEwMSwgMHgxNjMwLCAweGE4YzgsIDB4OTAwNSwgMHgxNTE4LCAweGE4YzQsIDB4OTA4MiwKKwkweDAxMDEsIDB4MTJmOCwgMHhhOTc0LCAweDIwNzksIDB4MTgwMCwgMHg5MTgyLCAweDA4MDAsIDB4MTJlOCwKKwkweDc4MzAsIDB4OTA4NCwgMHgwMDAzLCAweDExMzAsIDB4YWE5OCwgMHhhYjk0LCAweGE4NzgsIDB4OTA4NCwKKwkweDAwMDcsIDB4MDBlYSwgMHg3OTMwLCAweGQxOGMsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsIDB4MDAzOCwKKwkweGQxODQsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsIDB4MDAxMCwgMHgyMDAxLCAweDAwMjksIDB4OTAwZSwKKwkweDAwMzgsIDB4MjAwMSwgMHgwMDJjLCAweDkwMGUsIDB4MDAxOCwgMHgyMDAxLCAweDAwMjksIDB4OTAwZSwKKwkweDkwMDYsIDB4MDAwOCwgMHg5MDA1LCAweDAxMmUsIDB4MDBiZSwgMHgwMGZlLCAweDAwMDUsIDB4NjMxNCwKKwkweDYyY2YsIDB4NjJlNiwgMHg2MzE0LCAweDYzMTQsIDB4NjMxNCwgMHg2MzE0LCAweDYzMTQsIDB4MjEwMCwKKwkweDkwODIsIDB4MDA3ZSwgMHgxMjc4LCAweDA4MGMsIDB4NjYzMiwgMHgwMTQ4LCAweDkwNDYsIDB4YjgxMCwKKwkweDkzMDYsIDB4MTkwNCwgMHg2MzFjLCAweGI4MTQsIDB4OTIwNiwgMHgxNWYwLCAweDAwMjgsIDB4YmIxMiwKKwkweGJhMTYsIDB4MDAxMCwgMHgwODBjLCAweDRhMDUsIDB4MDE1MCwgMHgwNGIwLCAweDA4MGMsIDB4NjY5MywKKwkweDE1OTgsIDB4YjgxMCwgMHg5MzA2LCAweDE1ODAsIDB4YjgxNCwgMHg5MjA2LCAweDE1NjgsIDB4MDgwYywKKwkweGFjNWEsIDB4MDUzMCwgMHgyYjAwLCAweDYwMTIsIDB4MDgwYywgMHhjZTE1LCAweDI5MDAsIDB4NjAxNiwKKwkweDYwMGIsIDB4ZmZmZiwgMHg2MDIzLCAweDAwMGEsIDB4YTg3OCwgMHg5MDg2LCAweDAwMDEsIDB4MTE3MCwKKwkweDA4MGMsIDB4MzI0MCwgMHg5MDA2LCAweDA4MGMsIDB4NjVjZiwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywKKwkweDY1ZTMsIDB4MjAwMSwgMHgwMjAwLCAweGI4NmUsIDB4Yjg5MywgMHgwMDAyLCAweDIwMDksIDB4MDAwMywKKwkweDA4MGMsIDB4YWQ0ZCwgMHg5MDA2LCAweDAwNjgsIDB4MjAwMSwgMHgwMDAxLCAweDkwMGUsIDB4MDAzOCwKKwkweDIwMDEsIDB4MDAyYywgMHg5MDBlLCAweDAwMTgsIDB4MjAwMSwgMHgwMDI4LCAweDkwMGUsIDB4OTAwNSwKKwkweDAwMDAsIDB4MDEyZSwgMHgwMGJlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGI2LCAweDAwZjYsIDB4MDBlNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGE4OTQsIDB4OTBjNiwgMHgwMDE1LCAweDA5MDQsIDB4NjUwNywKKwkweDkwYzYsIDB4MDA1NiwgMHgwOTA0LCAweDY1MGIsIDB4OTBjNiwgMHgwMDY2LCAweDA5MDQsIDB4NjUwZiwKKwkweDkwYzYsIDB4MDA2NywgMHgwOTA0LCAweDY1MTMsIDB4OTBjNiwgMHgwMDY4LCAweDA5MDQsIDB4NjUxNywKKwkweDkwYzYsIDB4MDA3MSwgMHgwOTA0LCAweDY1MWIsIDB4OTBjNiwgMHgwMDc0LCAweDA5MDQsIDB4NjUxZiwKKwkweDkwYzYsIDB4MDA3YywgMHgwOTA0LCAweDY1MjMsIDB4OTBjNiwgMHgwMDdlLCAweDA5MDQsIDB4NjUyNywKKwkweDkwYzYsIDB4MDAzNywgMHgwOTA0LCAweDY1MmIsIDB4OTAxNiwgMHgyMDc5LCAweDE4MDAsIDB4YTk3NCwKKwkweDkxODYsIDB4MDBmZiwgMHgwOTA0LCAweDY1MDIsIDB4OTE4MiwgMHgwODAwLCAweDFhMDQsIDB4NjUwMiwKKwkweDA4MGMsIDB4NjY5MywgMHgxMTk4LCAweGI4MDQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODIsIDB4MDAwNiwKKwkweDEyNjgsIDB4YTg5NCwgMHg5MGM2LCAweDAwNmYsIDB4MDE0OCwgMHgwODBjLCAweGFiZTIsIDB4MTkwNCwKKwkweDY0ZWIsIDB4YjhhMCwgMHg5MDg0LCAweGZmODAsIDB4MTkwNCwgMHg2NGViLCAweGE4OTQsIDB4OTBjNiwKKwkweDAwNmYsIDB4MDE1OCwgMHg5MGM2LCAweDAwNWUsIDB4MDkwNCwgMHg2NDRiLCAweDkwYzYsIDB4MDA2NCwKKwkweDA5MDQsIDB4NjQ3NCwgMHgyMDA4LCAweDA4MDQsIDB4NjQwZCwgMHhhOTk4LCAweGE4YjAsIDB4MjA0MCwKKwkweDA4MGMsIDB4YWJlMiwgMHgxMTIwLCAweDkxODIsIDB4MDA3ZiwgMHgwYTA0LCAweDY0MGQsIDB4OTE4NiwKKwkweDAwZmYsIDB4MDkwNCwgMHg2NDBkLCAweDkxODIsIDB4MDgwMCwgMHgxYTA0LCAweDY0MGQsIDB4YWFhMCwKKwkweGFiOWMsIDB4Nzg3YywgMHg5MzA2LCAweDExYTgsIDB4Nzg4MCwgMHgwMDk2LCAweDkyNGUsIDB4MTEyOCwKKwkweDIyMDgsIDB4MjMxMCwgMHgwMDllLCAweDA4MDQsIDB4NjQwZCwgMHgwODBjLCAweGFiZTIsIDB4MTE0MCwKKwkweDk5Y2MsIDB4ZmYwMCwgMHgwMDllLCAweDExMjgsIDB4MjIwOCwgMHgyMzEwLCAweDA4MDQsIDB4NjQwZCwKKwkweDAwOWUsIDB4MDgwYywgMHg0YTA1LCAweDA5MDQsIDB4NjQxNywgMHg5MDBlLCAweDkwMTYsIDB4OTBjNiwKKwkweDQwMDAsIDB4MTVlMCwgMHgwMDA2LCAweDA4MGMsIDB4Njk4NiwgMHgxMTA4LCAweGMxODUsIDB4YjgwMCwKKwkweGQwYmMsIDB4MDEwOCwgMHhjMThkLCAweDIwYTksIDB4MDAwNCwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywKKwkweDkwODAsIDB4MDAzMSwgMHgyMGEwLCAweGI4YzQsIDB4MjBlMCwgMHhiOGM4LCAweDkwODAsIDB4MDAwNiwKKwkweDIwOTgsIDB4MDgwYywgMHgwZmM0LCAweDIwYTksIDB4MDAwNCwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywKKwkweDkwODAsIDB4MDAzNSwgMHgyMGEwLCAweGI4YzQsIDB4MjBlMCwgMHhiOGM4LCAweDkwODAsIDB4MDAwYSwKKwkweDIwOTgsIDB4MDgwYywgMHgwZmM0LCAweGE4YzQsIDB4YWJjOCwgMHg5MzA1LCAweGFiY2MsIDB4OTMwNSwKKwkweGFiZDAsIDB4OTMwNSwgMHhhYmQ0LCAweDkzMDUsIDB4YWJkOCwgMHg5MzA1LCAweGFiZGMsIDB4OTMwNSwKKwkweGFiZTAsIDB4OTMwNSwgMHg5MDA1LCAweDA1MTAsIDB4MDAwZSwgMHgwMGM4LCAweDkwYzYsIDB4NDAwNywKKwkweDExMTAsIDB4MjQwOCwgMHgwMGEwLCAweDkwYzYsIDB4NDAwOCwgMHgxMTE4LCAweDI3MDgsIDB4MjYxMCwKKwkweDAwNzAsIDB4OTBjNiwgMHg0MDA5LCAweDExMDgsIDB4MDA1MCwgMHg5MGM2LCAweDQwMDYsIDB4MDEzOCwKKwkweDIwMDEsIDB4NDAwNSwgMHgyMDA5LCAweDAwMGEsIDB4MDAxMCwgMHgyMDAxLCAweDQwMDYsIDB4YTg5NiwKKwkweGE5OWEsIDB4YWE5ZSwgMHgyMDAxLCAweDAwMzAsIDB4OTAwZSwgMHgwNDc4LCAweDAwMGUsIDB4MDgwYywKKwkweGFjNWEsIDB4MTEzMCwgMHgyMDAxLCAweDQwMDUsIDB4MjAwOSwgMHgwMDAzLCAweDkwMTYsIDB4MGM3OCwKKwkweDJiMDAsIDB4NjAxMiwgMHgwODBjLCAweGNlMTUsIDB4MjkwMCwgMHg2MDE2LCAweDYwMjMsIDB4MDAwMSwKKwkweGE4NjgsIDB4ZDg4YywgMHgwMTA4LCAweGMwZjUsIDB4YTg2YSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4MzI0MCwgMHgwMTJlLCAweDkwMDYsIDB4MDgwYywgMHg2NWNmLCAweDIwMDEsIDB4MDAwMiwKKwkweDA4MGMsIDB4NjVlMywgMHgyMDA5LCAweDAwMDIsIDB4MDgwYywgMHhhZDRkLCAweGE4YjAsIDB4ZDA5NCwKKwkweDAxMTgsIDB4YjhkNCwgMHhjMDhkLCAweGI4ZDYsIDB4OTAwNiwgMHg5MDA1LCAweDAxMmUsIDB4MDBlZSwKKwkweDAwZmUsIDB4MDBiZSwgMHgwMDA1LCAweDA4MGMsIDB4NTc1MiwgMHgwMTE4LCAweDIwMDksIDB4MDAwNywKKwkweDAwZjgsIDB4YTk5OCwgMHhhZWIwLCAweDA4MGMsIDB4NjY5MywgMHgxOTA0LCAweDY0MDgsIDB4OTE4NiwKKwkweDAwN2YsIDB4MDEzMCwgMHgwODBjLCAweDZhZGQsIDB4MDExOCwgMHgyMDA5LCAweDAwMDksIDB4MDA4MCwKKwkweDAwOTYsIDB4MDgwYywgMHgxMDQ3LCAweDExMjAsIDB4MDA5ZSwgMHgyMDA5LCAweDAwMDIsIDB4MDA0MCwKKwkweDI5MDAsIDB4MDA5ZSwgMHhhODA2LCAweDA4MGMsIDB4Y2I2OCwgMHgxOWIwLCAweDIwMDksIDB4MDAwMywKKwkweDIwMDEsIDB4NDAwNSwgMHgwODA0LCAweDY0MGYsIDB4YTk5OCwgMHhhZWIwLCAweDA4MGMsIDB4NjY5MywKKwkweDE5MDQsIDB4NjQwOCwgMHgwMDk2LCAweDA4MGMsIDB4MTA0NywgMHgxMTI4LCAweDAwOWUsIDB4MjAwOSwKKwkweDAwMDIsIDB4MDgwNCwgMHg2NGM4LCAweDI5MDAsIDB4MDA5ZSwgMHhhODA2LCAweDAwOTYsIDB4MjA0OCwKKwkweDIwYTksIDB4MDAyYiwgMHhiOGM0LCAweDIwZTAsIDB4YjhjOCwgMHgyMDk4LCAweGE4NjAsIDB4MjBlOCwKKwkweGE4NWMsIDB4OTA4MCwgMHgwMDAyLCAweDIwYTAsIDB4NDAwMywgMHgyMGE5LCAweDAwMDgsIDB4OTA4MCwKKwkweDAwMDYsIDB4MjBhMCwgMHhiYmM4LCAweDkzOTgsIDB4MDAwNiwgMHgyMzk4LCAweDA4MGMsIDB4MGZjNCwKKwkweDAwOWUsIDB4YTg3YiwgMHgwMDAwLCAweGE4ODMsIDB4MDAwMCwgMHhhODk3LCAweDQwMDAsIDB4ZDY4NCwKKwkweDExNjgsIDB4MDgwYywgMHg1NzNlLCAweGQwYjQsIDB4MTExOCwgMHhhODliLCAweDAwMGIsIDB4MDBlMCwKKwkweGI4MDAsIDB4ZDA4YywgMHgwMTE4LCAweGE4OWIsIDB4MDAwYywgMHgwMGIwLCAweDA4MGMsIDB4NmFkZCwKKwkweDAxMTgsIDB4YTg5YiwgMHgwMDA5LCAweDAwODAsIDB4MDgwYywgMHg1NzUyLCAweDAxMTgsIDB4YTg5YiwKKwkweDAwMDcsIDB4MDA1MCwgMHgwODBjLCAweGNiNGIsIDB4MTkwNCwgMHg2NDQ0LCAweDIwMDksIDB4MDAwMywKKwkweDIwMDEsIDB4NDAwNSwgMHgwODA0LCAweDY0MGYsIDB4YTg3YiwgMHgwMDMwLCAweGE4OTcsIDB4NDAwNSwKKwkweGE4MDQsIDB4ODAwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTBiYywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwKKwkweDkwODAsIDB4MDAwMiwgMHgyMDA5LCAweDAwMmIsIDB4YWFhMCwgMHhhYjljLCAweGFjYTgsIDB4YWRhNCwKKwkweDIwMzEsIDB4MDAwMCwgMHgyMDQxLCAweDEyOTYsIDB4MDgwYywgMHhiMWQ0LCAweDE5MDQsIDB4NjQ0NCwKKwkweDIwMDksIDB4MDAwMiwgMHgwOGU4LCAweDIwMDEsIDB4MDAyOCwgMHg5MDBlLCAweDA4MDQsIDB4NjQ0NSwKKwkweDIwMDksIDB4MTgwYywgMHgyMTBjLCAweGQxOGMsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsIDB4MDAzOCwKKwkweGQxODQsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsIDB4MDAxMCwgMHgyMDAxLCAweDAwMjksIDB4OTAwZSwKKwkweDA4MDQsIDB4NjQ0NSwgMHgyMDAxLCAweDAwMjksIDB4OTAwZSwgMHgwODA0LCAweDY0NDUsIDB4MDgwYywKKwkweDM3ZTcsIDB4MDgwNCwgMHg2NDQ2LCAweDA4MGMsIDB4NTQ1YiwgMHgwODA0LCAweDY0NDYsIDB4MDgwYywKKwkweDQ1YjksIDB4MDgwNCwgMHg2NDQ2LCAweDA4MGMsIDB4NDYzMiwgMHgwODA0LCAweDY0NDYsIDB4MDgwYywKKwkweDQ2OGUsIDB4MDgwNCwgMHg2NDQ2LCAweDA4MGMsIDB4NGFjOCwgMHgwODA0LCAweDY0NDYsIDB4MDgwYywKKwkweDRkN2MsIDB4MDgwNCwgMHg2NDQ2LCAweDA4MGMsIDB4NTBjMywgMHgwODA0LCAweDY0NDYsIDB4MDgwYywKKwkweDUyYmMsIDB4MDgwNCwgMHg2NDQ2LCAweDA4MGMsIDB4M2EwYiwgMHgwODA0LCAweDY0NDYsIDB4MDBiNiwKKwkweGE5NzQsIDB4YWU3OCwgMHg5Njg0LCAweDNmZmYsIDB4OTA4MiwgMHg0MDAwLCAweDE2MDgsIDB4OTE4MiwKKwkweDA4MDAsIDB4MTI1OCwgMHg5MTg4LCAweDEwMDAsIDB4MjEwNCwgMHg5MDVkLCAweDAxMzAsIDB4MDgwYywKKwkweDZhZGQsIDB4MTEzOCwgMHgwMGQ5LCAweDkwMDYsIDB4MDBiMCwgMHgyMDAxLCAweDAwMjgsIDB4OTAwZSwKKwkweDAwOTAsIDB4OTA4MiwgMHgwMDA2LCAweDEyNDAsIDB4YjkwMCwgMHhkMWZjLCAweDBkOTgsIDB4MjAwMSwKKwkweDAwMjksIDB4MjAwOSwgMHgxMDAwLCAweDAwMzgsIDB4MjAwMSwgMHgwMDI5LCAweDkwMGUsIDB4MDAxOCwKKwkweDIwMDEsIDB4MDAyOSwgMHg5MDBlLCAweDkwMDUsIDB4MDBiZSwgMHgwMDA1LCAweGE4NzcsIDB4MDAwMCwKKwkweGI4ZDAsIDB4OTAwNSwgMHgxOTA0LCAweDY1YzMsIDB4Yjg4OCwgMHg5MDA1LCAweDE5MDQsIDB4NjVjMywKKwkweGI4MzgsIDB4YjkzYywgMHg5MTAyLCAweDFhMDQsIDB4NjVjMywgMHgyYjEwLCAweDA4MGMsIDB4YWM4NywKKwkweDA5MDQsIDB4NjViZiwgMHg4MTA4LCAweGI5M2UsIDB4NjIxMiwgMHgyOTAwLCAweDYwMTYsIDB4NjAyMywKKwkweDAwMDMsIDB4NjAwYiwgMHhmZmZmLCAweDYwMDcsIDB4MDA0MCwgMHhhODc4LCAweDYwNWUsIDB4YTg4MCwKKwkweDYwNjYsIDB4YTg4MywgMHgwMDAwLCAweGE4N2MsIDB4ZDBhYywgMHgwNTg4LCAweGMwZGQsIDB4YTg3ZSwKKwkweGE4ODgsIDB4ODAwMSwgMHgxNTMwLCAweGE4MTYsIDB4YTg2NCwgMHg5MDk0LCAweDAwZjcsIDB4OTI5NiwKKwkweDAwMTEsIDB4MTFmOCwgMHg5MDg0LCAweDAwZmYsIDB4YzBiZCwgMHg2MDFlLCAweGE4YWMsIDB4YWFiMCwKKwkweGE4MzYsIDB4YWEzYSwgMHgyMDAxLCAweDAwMGYsIDB4ODAwMSwgMHgxZGYwLCAweDIwMDEsIDB4ODAwNCwKKwkweDYwMDMsIDB4MDAwNCwgMHg2MDQ2LCAweDAwZjYsIDB4MjA3OSwgMHgwMzgwLCAweDc4MTgsIDB4ZDBiYywKKwkweDFkZTgsIDB4NzgzMywgMHgwMDEwLCAweDJjMDAsIDB4NzgzNiwgMHg3ODFiLCAweDgwODAsIDB4MDBmZSwKKwkweDAwMDUsIDB4MDgwYywgMHgxNzc4LCAweDYwMWMsIDB4YzBiZCwgMHg2MDFlLCAweDBjMzgsIDB4ZDBiNCwKKwkweDE5MGMsIDB4MWM4NiwgMHgyMDAxLCAweDgwMDQsIDB4NjAwMywgMHgwMDAyLCAweDBjMTgsIDB4ODFmZiwKKwkweDExMTAsIDB4Yjg4YiwgMHgwMDAxLCAweDI5MDgsIDB4YjhjYywgMHhiOWNlLCAweDkwMDUsIDB4MTExMCwKKwkweGI5ZDIsIDB4MDAyMCwgMHgwMDk2LCAweDIwNDgsIDB4YTkwMiwgMHgwMDllLCAweDAwMDUsIDB4MDBiNiwKKwkweDAxMjYsIDB4MDBjNiwgMHgwMDI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MjEwLCAweDIyNTgsIDB4YmEwMCwKKwkweDkwMDUsIDB4MDExMCwgMHhjMjg1LCAweDAwMDgsIDB4YzI4NCwgMHhiYTAyLCAweDAwMmUsIDB4MDBjZSwKKwkweDAxMmUsIDB4MDBiZSwgMHgwMDA1LCAweDAwYjYsIDB4MDEyNiwgMHgwMGM2LCAweDIwOTEsIDB4ODAwMCwKKwkweDYyMTAsIDB4MjI1OCwgMHhiYTA0LCAweDAwMDYsIDB4OTA4NiwgMHgwMDA2LCAweDExNzAsIDB4Yjg5YywKKwkweGQwYWMsIDB4MDE1OCwgMHgwODBjLCAweDZhZDksIDB4MDE0MCwgMHg5Mjg0LCAweGZmMDAsIDB4ODAwNywKKwkweDkwODYsIDB4MDAwNywgMHgxMTEwLCAweDIwMTEsIDB4MDYwMCwgMHgwMDBlLCAweDkyOTQsIDB4ZmYwMCwKKwkweDkyMTUsIDB4YmEwNiwgMHgwMDA2LCAweDkwODYsIDB4MDAwNiwgMHgxMTIwLCAweGJhOTAsIDB4ODJmZiwKKwkweDA5MGMsIDB4MGQ3ZCwgMHgwMDBlLCAweDAwY2UsIDB4MDEyZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBiNiwKKwkweDAxMjYsIDB4MDBjNiwgMHgyMDkxLCAweDgwMDAsIDB4NjIxMCwgMHgyMjU4LCAweGJhMDQsIDB4MDAwNiwKKwkweDkwODYsIDB4MDAwNiwgMHgxMTY4LCAweGI4OWMsIDB4ZDBhNCwgMHgwMTUwLCAweDA4MGMsIDB4NmFkNSwKKwkweDExMzgsIDB4OTI4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwNywgMHgxMTEwLCAweDIwMTEsIDB4MDAwNiwKKwkweDAwMGUsIDB4OTI5NCwgMHgwMGZmLCAweDgwMDcsIDB4OTIxNSwgMHhiYTA2LCAweDAwY2UsIDB4MDEyZSwKKwkweDAwYmUsIDB4MDAwNSwgMHg5MTgyLCAweDA4MDAsIDB4MDIxOCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwKKwkweDAwZDYsIDB4MDAyNiwgMHg5MTkwLCAweDEwMDAsIDB4MjIwNCwgMHg5MDVkLCAweDExODgsIDB4MDA5NiwKKwkweDA4MGMsIDB4MTA0NywgMHgyOTU4LCAweDAwOWUsIDB4MDE2OCwgMHgyYjAwLCAweDIwMTIsIDB4Yjg1YywKKwkweGI4Y2EsIDB4Yjg2MCwgMHhiOGM2LCAweDkwMDYsIDB4YjhhNiwgMHhiOGFlLCAweDA4MGMsIDB4NjBhYywKKwkweDkwMDYsIDB4MDAxMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAyZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBiNiwKKwkweDAwOTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDAyNiwgMHg5MTgyLCAweDA4MDAsIDB4MDIxOCwKKwkweDkwODUsIDB4MDAwMSwgMHgwNDU4LCAweDAwZDYsIDB4OTE5MCwgMHgxMDAwLCAweDIyMDQsIDB4OTA1ZCwKKwkweDA1MTgsIDB4MjAxMywgMHgwMDAwLCAweGI4YTQsIDB4OTA0ZCwgMHgwMTEwLCAweDA4MGMsIDB4MTA3OSwKKwkweDAwZDYsIDB4MDBjNiwgMHhiOGJjLCAweDIwNjAsIDB4OGNmZiwgMHgwMTY4LCAweDYwMGMsIDB4MDAwNiwKKwkweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGM5N2EsIDB4MDExMCwgMHgwODBjLCAweDBmZjksIDB4MDgwYywKKwkweGFjYjAsIDB4MDBjZSwgMHgwYzg4LCAweDAwY2UsIDB4MDBkZSwgMHgyYjQ4LCAweGI4YzgsIDB4Yjg1ZSwKKwkweGI4YzQsIDB4Yjg2MiwgMHgwODBjLCAweDEwODksIDB4MDBkZSwgMHg5MDA2LCAweDAwMmUsIDB4MDEyZSwKKwkweDAwOWUsIDB4MDBiZSwgMHgwMDA1LCAweDAwMTYsIDB4OTE4MiwgMHgwODAwLCAweDAyMTgsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAzMCwgMHg5MTg4LCAweDEwMDAsIDB4MjEwNCwgMHg5MDVkLCAweDBkYzAsIDB4OTAwNiwKKwkweDAwMWUsIDB4MDAwNSwgMHgwMGQ2LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LCAweDkwMDYsIDB4YjgwYSwKKwkweGI4MGUsIDB4YjgwMCwgMHhjMDhjLCAweGI4MDIsIDB4MDgwYywgMHg3NTNkLCAweDE1MTAsIDB4YjhhMCwKKwkweDkwODYsIDB4MDA3ZSwgMHgwMTIwLCAweDA4MGMsIDB4YWJlMiwgMHgxMWQ4LCAweDAwNzgsIDB4NzA0MCwKKwkweGQwZTQsIDB4MDFiOCwgMHgwMGM2LCAweDIwNjEsIDB4MTk4MSwgMHg3MDQ4LCAweDIwNjIsIDB4NzA0YywKKwkweDYwMDYsIDB4NzA1MCwgMHg2MDBhLCAweDcwNTQsIDB4NjAwZSwgMHgwMGNlLCAweDcwM2MsIDB4MjA2OSwKKwkweDAxNDAsIDB4OTAwNSwgMHgxMTEwLCAweDIwMDEsIDB4MDAwMSwgMHg2ODg2LCAweDIwNjksIDB4MTgwMCwKKwkweDY4YjYsIDB4NzA0MCwgMHhiODVlLCAweDcwNDgsIDB4Yjg2MiwgMHg3MDRjLCAweGI4NjYsIDB4MjBlMSwKKwkweDAwMDAsIDB4MjA5OSwgMHgwMjc2LCAweGI4YzQsIDB4MjBlOCwgMHhiOGM4LCAweDkwODgsIDB4MDAwYSwKKwkweDIxYTAsIDB4MjBhOSwgMHgwMDA0LCAweDQwMDMsIDB4MjA5OSwgMHgwMjdhLCAweDkwODgsIDB4MDAwNiwKKwkweDIxYTAsIDB4MjBhOSwgMHgwMDA0LCAweDQwMDMsIDB4MjA2OSwgMHgwMjAwLCAweDY4MTcsIDB4MDAwMSwKKwkweDcwNDAsIDB4Yjg2YSwgMHg3MTQ0LCAweGI5NmUsIDB4NzA0OCwgMHhiODcyLCAweDcwNTAsIDB4Yjg3NiwKKwkweDIwNjksIDB4MDIwMCwgMHg2ODE3LCAweDAwMDAsIDB4YjhhMCwgMHg5MDg2LCAweDAwN2UsIDB4MTExMCwKKwkweDcxNDQsIDB4Yjk2ZSwgMHg5MTgyLCAweDAyMTEsIDB4MTIxOCwgMHgyMDA5LCAweDAwMDgsIDB4MDQwMCwKKwkweDkxODIsIDB4MDI1OSwgMHgxMjE4LCAweDIwMDksIDB4MDAwNywgMHgwMGQwLCAweDkxODIsIDB4MDJjMSwKKwkweDEyMTgsIDB4MjAwOSwgMHgwMDA2LCAweDAwYTAsIDB4OTE4MiwgMHgwMzQ5LCAweDEyMTgsIDB4MjAwOSwKKwkweDAwMDUsIDB4MDA3MCwgMHg5MTgyLCAweDA0MjEsIDB4MTIxOCwgMHgyMDA5LCAweDAwMDQsIDB4MDA0MCwKKwkweDkxODIsIDB4MDU4MSwgMHgxMjE4LCAweDIwMDksIDB4MDAwMywgMHgwMDEwLCAweDIwMDksIDB4MDAwMiwKKwkweGI5OTIsIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsIDB4MDBkZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwKKwkweDAwZTYsIDB4MjA3MSwgMHgwMjYwLCAweDcwMzQsIDB4Yjg5NiwgMHg3MDNjLCAweGI4OWEsIDB4NzA1NCwKKwkweGI4OWUsIDB4MDAzNiwgMHhiYmQ0LCAweGMzODQsIDB4YmEwMCwgMHgyMDA5LCAweDE4NjcsIDB4MjEwYywKKwkweGQwYmMsIDB4MDEyMCwgMHhkMWVjLCAweDAxMTAsIDB4YzJhZCwgMHgwMDA4LCAweGMyYWMsIDB4ZDBjNCwKKwkweDAxNDgsIDB4ZDFlNCwgMHgwMTM4LCAweGMyYmQsIDB4ZDBjYywgMHgwMTI4LCAweGQzOGMsIDB4MTEwOCwKKwkweGMzODUsIDB4MDAwOCwgMHhjMmJjLCAweGJhMDIsIDB4YmJkNiwgMHgwMDNlLCAweDAwZWUsIDB4MDAyZSwKKwkweDAwMWUsIDB4MDAwNSwgMHgwMDk2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGI4YTQsIDB4OTA0ZCwKKwkweDA1NzgsIDB4YTkwMCwgMHg4MWZmLCAweDE1YzAsIDB4YWEwNCwgMHg5MjgyLCAweDAwMTAsIDB4MTZjOCwKKwkweDAxMzYsIDB4MDE0NiwgMHgwMWM2LCAweDAxZDYsIDB4ODkwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTA4YywKKwkweDAwM2YsIDB4MjFlMCwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDA0LCAweDIwOTgsIDB4MjAwOSwKKwkweDAwMTAsIDB4MjBhOSwgMHgwMDAxLCAweDQwMDIsIDB4OTA4NiwgMHhmZmZmLCAweDAxMjAsIDB4ODEwOSwKKwkweDFkZDAsIDB4MDgwYywgMHgwZDdkLCAweDNjMDAsIDB4MjBlOCwgMHgzMzAwLCAweDgwMDEsIDB4MjBhMCwKKwkweDQ2MDQsIDB4ODIxMCwgMHhhYTA2LCAweDAxZGUsIDB4MDFjZSwgMHgwMTRlLCAweDAxM2UsIDB4MDA2MCwKKwkweDA4MGMsIDB4MTA0NywgMHgwMTcwLCAweDI5MDAsIDB4YjhhNiwgMHhhODAzLCAweDAwMDAsIDB4MDgwYywKKwkweDY5MjIsIDB4YTgwNywgMHgwMDAxLCAweGFlMTIsIDB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDA5ZSwKKwkweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwOTYsIDB4YjhhNCwKKwkweDkwNGQsIDB4MDE4OCwgMHhhODAwLCAweDkwMDUsIDB4MTE1MCwgMHgwODBjLCAweDY5MzEsIDB4MTE1OCwKKwkweGE4MDQsIDB4OTA4YSwgMHgwMDAyLCAweDAyMTgsIDB4ODAwMSwgMHhhODA2LCAweDAwMjAsIDB4MDgwYywKKwkweDEwNzksIDB4YjhhNywgMHgwMDAwLCAweDAwOWUsIDB4MDEyZSwgMHgwMDA1LCAweDAwOTYsIDB4MDBjNiwKKwkweGI4ODgsIDB4OTAwNSwgMHgxOTA0LCAweDY4MTcsIDB4YjhkMCwgMHg5MDRkLCAweDA5MDQsIDB4NjgxNywKKwkweDA4MGMsIDB4YWM4NywgMHgwOTA0LCAweDY4MTMsIDB4ODIxMCwgMHhiYTNlLCAweGE4MDAsIDB4YjhkMiwKKwkweDkwMDUsIDB4MTEwOCwgMHhiOGNlLCAweDJiMDAsIDB4NjAxMiwgMHgyOTAwLCAweDYwMTYsIDB4NjAyMywKKwkweDAwMDMsIDB4NjAwYiwgMHhmZmZmLCAweDYwMDcsIDB4MDA0MCwgMHhhODc4LCAweDYwNWUsIDB4YTg4MCwKKwkweDkwODQsIDB4MDBmZiwgMHg2MDY2LCAweGE4ODMsIDB4MDAwMCwgMHhhODdjLCAweGQwYWMsIDB4MDFjOCwKKwkweGMwZGQsIDB4YTg3ZSwgMHhhODg4LCAweDgwMDEsIDB4MTU2OCwgMHhhODE2LCAweGE4NjQsIDB4OTA5NCwKKwkweDAwZjcsIDB4OTI5NiwgMHgwMDExLCAweDE1MzAsIDB4OTA4NCwgMHgwMGZmLCAweGMwYmQsIDB4NjAxZSwKKwkweGE4YWMsIDB4YWFiMCwgMHhhODM2LCAweGFhM2EsIDB4MjAwMSwgMHg4MDA0LCAweDYwMDMsIDB4MDAwNCwKKwkweDAwMzAsIDB4MDgwYywgMHgxYzg2LCAweDIwMDEsIDB4ODAwNCwgMHg2MDAzLCAweDAwMDIsIDB4NjA0NiwKKwkweDIwMDEsIDB4MDAxMCwgMHgyYzA4LCAweDA4MGMsIDB4YTkwZiwgMHhiODM4LCAweGJhM2MsIDB4OTIwMiwKKwkweDBhMDQsIDB4NjdjNCwgMHgwMDIwLCAweDgyZmYsIDB4MTExMCwgMHhiODhiLCAweDAwMDEsIDB4MDBjZSwKKwkweDAwOWUsIDB4MDAwNSwgMHgwODBjLCAweDE3NzgsIDB4NjAxYywgMHhjMGJkLCAweDYwMWUsIDB4MDhlMCwKKwkweDAwYjYsIDB4MDA5NiwgMHgwMDE2LCAweDIwYTksIDB4MDgwMCwgMHg5MDBlLCAweDAwMTYsIDB4MDgwYywKKwkweDY2OTMsIDB4MTE1OCwgMHhiOGQwLCAweDkwNGQsIDB4MDE0MCwgMHgzZTAwLCAweDkwODYsIDB4MDAwMiwKKwkweDExMTgsIDB4YjgwMCwgMHhkMGJjLCAweDExMDgsIDB4MDA0MSwgMHgwMDFlLCAweDgxMDgsIDB4MWYwNCwKKwkweDY4MjYsIDB4MDAxZSwgMHgwMGJlLCAweDAwOWUsIDB4MDAwNSwgMHgwMDk2LCAweDAwMTYsIDB4YjhkMCwKKwkweDkwNGQsIDB4MDE4OCwgMHhhODAwLCAweGI4ZDIsIDB4OTAwNSwgMHgxMTA4LCAweGI4Y2UsIDB4OTAwNiwKKwkweGE4MDIsIDB4YTg2NywgMHgwMTAzLCAweGFiN2EsIDB4YTg3NywgMHgwMDAwLCAweDA4MGMsIDB4Y2M3ZiwKKwkweDA4MGMsIDB4NmRlZSwgMHgwYzYwLCAweDAwMWUsIDB4MDA5ZSwgMHgwMDA1LCAweDAwODYsIDB4OTA0NiwKKwkweGI4ZDAsIDB4OTA0ZCwgMHgwMWIwLCAweGE4NmMsIDB4OTQwNiwgMHgxMTE4LCAweGE4NzAsIDB4OTUwNiwKKwkweDAxMjgsIDB4Mjk0MCwgMHhhODAwLCAweDkwNGQsIDB4MDE2MCwgMHgwY2E4LCAweGE4MDAsIDB4ODhmZiwKKwkweDExMjgsIDB4YjhkMiwgMHg5MDA1LCAweDExMTgsIDB4YjhjZSwgMHgwMDA4LCAweGEwMDIsIDB4YTgwMywKKwkweDAwMDAsIDB4MDA4ZSwgMHgwMDA1LCAweDkwMWUsIDB4MDAxMCwgMHgyMDE5LCAweDAwMDEsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwMGU2LCAweDAwOTYsIDB4MDBjNiwgMHgwMDg2LCAweDAwMjYsIDB4MjA3MSwKKwkweDE5ZTYsIDB4OTA0NiwgMHg3MDI4LCAweDkwNjUsIDB4MDFlOCwgMHg2MDE0LCAweDIwNjgsIDB4ODNmZiwKKwkweDAxMjAsIDB4NjA1YywgMHg5NjA2LCAweDAxNTgsIDB4MDAzMCwgMHhhODZjLCAweDk0MDYsIDB4MTExOCwKKwkweGE4NzAsIDB4OTUwNiwgMHgwMTIwLCAweDJjNDAsIDB4NjAwYywgMHgyMDYwLCAweDBjNjAsIDB4NjAwYywKKwkweDAwMDYsIDB4MDA2NiwgMHgyODMwLCAweDA4MGMsIDB4YTA0MiwgMHgwMDZlLCAweDAwMGUsIDB4ODNmZiwKKwkweDA1MDgsIDB4MGMwOCwgMHg5MDQ2LCAweGI4ZDAsIDB4OTA0ZCwgMHgwMWUwLCAweDgzZmYsIDB4MDEyMCwKKwkweGE4NzgsIDB4OTYwNiwgMHgwMTU4LCAweDAwMzAsIDB4YTg2YywgMHg5NDA2LCAweDExMTgsIDB4YTg3MCwKKwkweDk1MDYsIDB4MDEyMCwgMHgyOTQwLCAweGE4MDAsIDB4MjA0OCwgMHgwYzcwLCAweGI4ZDAsIDB4YWEwMCwKKwkweDAwMjYsIDB4OTkwNiwgMHgxMTEwLCAweGJhZDIsIDB4MDAwOCwgMHhhMjAyLCAweDAwMGUsIDB4ODNmZiwKKwkweDAxMDgsIDB4MGMxMCwgMHgwMDJlLCAweDAwOGUsIDB4MDBjZSwgMHgwMDllLCAweDAwZWUsIDB4MDEyZSwKKwkweDAwMDUsIDB4OTAxNiwgMHgwNDg5LCAweDExMTAsIDB4MjAxMSwgMHgwMDAxLCAweDAwMDUsIDB4MDgwYywKKwkweDY5ODYsIDB4MDEyOCwgMHgwODBjLCAweGNhM2IsIDB4MDAxMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwKKwkweDA4MGMsIDB4Njk4NiwgMHgwMTI4LCAweDA4MGMsIDB4YzlkYywgMHgwMDEwLCAweDkwODUsIDB4MDAwMSwKKwkweDAwMDUsIDB4MDgwYywgMHg2OTg2LCAweDAxMjgsIDB4MDgwYywgMHhjYTM4LCAweDAwMTAsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAwNSwgMHgwODBjLCAweDY5ODYsIDB4MDEyOCwgMHgwODBjLCAweGM5ZmIsIDB4MDAxMCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDA4MGMsIDB4Njk4NiwgMHgwMTI4LCAweDA4MGMsIDB4Y2E3ZSwKKwkweDAwMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4YjhhNCwgMHg5MDBkLCAweDExMTgsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAwNSwgMHgwMTM2LCAweDAxYzYsIDB4YTgwMCwgMHg5MDA1LCAweDExYjgsIDB4ODkwZSwKKwkweDgxMGUsIDB4ODEwZiwgMHg5MTg0LCAweDAwM2YsIDB4MjBlMCwgMHg5MTg0LCAweGZmYzAsIDB4OTA4MCwKKwkweDAwMDQsIDB4MjA5OCwgMHgyMGE5LCAweDAwMDEsIDB4MjAwOSwgMHgwMDEwLCAweDQwMDIsIDB4OTYwNiwKKwkweDAxMjgsIDB4ODEwOSwgMHgxZGQ4LCAweDkwODUsIDB4MDAwMSwgMHgwMDA4LCAweDkwMDYsIDB4MDFjZSwKKwkweDAxM2UsIDB4MDAwNSwgMHgwMTQ2LCAweDAxZDYsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMDQsIDB4MjBhMCwgMHgyMGE5LCAweDAwMTAsIDB4MjAwOSwgMHhmZmZmLCAweDQxMDQsIDB4MDFkZSwKKwkweDAxNGUsIDB4MDEzNiwgMHgwMWM2LCAweGE4MDAsIDB4OTAwNSwgMHgxMWI4LCAweDg5MGUsIDB4ODEwZSwKKwkweDgxMGYsIDB4OTE4NCwgMHgwMDNmLCAweDIwZTAsIDB4OTE4NCwgMHhmZmMwLCAweDkwODAsIDB4MDAwNCwKKwkweDIwOTgsIDB4MjBhOSwgMHgwMDAxLCAweDIwMDksIDB4MDAxMCwgMHg0MDAyLCAweDk2MDYsIDB4MDEyOCwKKwkweDgxMDksIDB4MWRkOCwgMHg5MDg1LCAweDAwMDEsIDB4MDA2OCwgMHgwMTQ2LCAweDAxZDYsIDB4MzMwMCwKKwkweDgwMDEsIDB4MjBhMCwgMHgzYzAwLCAweDIwZTgsIDB4MjAwMSwgMHhmZmZmLCAweDQwMDQsIDB4MDFkZSwKKwkweDAxNGUsIDB4OTAwNiwgMHgwMWNlLCAweDAxM2UsIDB4MDAwNSwgMHgwMDk2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4YjhhNCwgMHg5MDRkLCAweDExMjgsIDB4MDgwYywgMHgxMDQ3LCAweDAxNjgsIDB4MjkwMCwKKwkweGI4YTYsIDB4MDgwYywgMHg2OTIyLCAweGE4MDMsIDB4MDAwMSwgMHhhODA3LCAweDAwMDAsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDEyZSwgMHgwMDllLCAweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LCAweDAwOTYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHhiOGE0LCAweDkwNGQsIDB4MDEzMCwgMHhiOGE3LCAweDAwMDAsIDB4MDgwYywKKwkweDEwNzksIDB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDA5ZSwgMHgwMDA1LCAweGI4OWMsIDB4ZDBhNCwKKwkweDAwMDUsIDB4MDBiNiwgMHgwMGY2LCAweDA4MGMsIDB4NzUzZCwgMHgwMWIwLCAweDcxYzQsIDB4ODFmZiwKKwkweDExOTgsIDB4NzFkYywgMHhkMTljLCAweDAxODAsIDB4MjAwMSwgMHgwMDdlLCAweDkwODAsIDB4MTAwMCwKKwkweDIwMDQsIDB4OTA1ZCwgMHgwMTQ4LCAweGI4MDQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwNiwKKwkweDExMTgsIDB4YjgwMCwgMHhjMGVkLCAweGI4MDIsIDB4MjA3OSwgMHgxODQ3LCAweDc4MDQsIDB4ZDBhNCwKKwkweDAxZDAsIDB4MDE1NiwgMHgyMGE5LCAweDAwN2YsIDB4OTAwZSwgMHgwMDE2LCAweDA4MGMsIDB4NjY5MywKKwkweDExNjgsIDB4YjgwNCwgMHg5MDg0LCAweGZmMDAsIDB4ODAwNywgMHg5MDk2LCAweDAwMDQsIDB4MDExOCwKKwkweDkwODYsIDB4MDAwNiwgMHgxMTE4LCAweGI4MDAsIDB4YzBlZCwgMHhiODAyLCAweDAwMWUsIDB4ODEwOCwKKwkweDFmMDQsIDB4NjlhZCwgMHgwMTVlLCAweDA4MGMsIDB4NmE5YiwgMHgwMTIwLCAweDIwMDEsIDB4MTk4NCwKKwkweDIwMGMsIDB4MDAzOCwgMHgyMDc5LCAweDE4NDcsIDB4NzgwNCwgMHhkMGE0LCAweDAxMzAsIDB4MjAwOSwKKwkweDA3ZDAsIDB4MjAxMSwgMHg2OWQ4LCAweDA4MGMsIDB4ODc5MiwgMHgwMGZlLCAweDAwYmUsIDB4MDAwNSwKKwkweDAwYjYsIDB4MjAxMSwgMHg2OWQ4LCAweDA4MGMsIDB4ODZjOCwgMHgwODBjLCAweDZhOWIsIDB4MDFkOCwKKwkweDIwMDEsIDB4MTA3ZSwgMHgyMDA0LCAweDIwNTgsIDB4YjkwMCwgMHhjMWVjLCAweGI5MDIsIDB4MDgwYywKKwkweDZhZDksIDB4MDEzMCwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwgMHg2OWQ4LCAweDA4MGMsIDB4ODc5MiwKKwkweDAwZTYsIDB4MjA3MSwgMHgxODAwLCAweDkwMDYsIDB4NzA3ZSwgMHg3MDYwLCAweDcwODIsIDB4MDgwYywKKwkweDMwMTEsIDB4MDBlZSwgMHgwNGQwLCAweDAxNTYsIDB4MDBjNiwgMHgyMGE5LCAweDAwN2YsIDB4OTAwZSwKKwkweDAwMTYsIDB4MDgwYywgMHg2NjkzLCAweDE1NTgsIDB4YjgwMCwgMHhkMGVjLCAweDA1NDAsIDB4MDA0NiwKKwkweGJhYTAsIDB4MjIyMCwgMHg5MDA2LCAweDIwMDksIDB4MDAyOSwgMHgwODBjLCAweGU0NDUsIDB4YjgwMCwKKwkweGMwZTUsIDB4YzBlYywgMHhiODAyLCAweDA4MGMsIDB4NmFkNSwgMHgyMDAxLCAweDA3MDcsIDB4MTEyOCwKKwkweGI4MDQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODUsIDB4MDcwMCwgMHhiODA2LCAweDA4MGMsIDB4YTkxZSwKKwkweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweDk0M2QsIDB4MDA3NiwgMHg5MDNlLCAweDA4MGMsIDB4OTMwNiwKKwkweDkwMGUsIDB4MDgwYywgMHhlMTY3LCAweDAwN2UsIDB4MDA0ZSwgMHgwODBjLCAweGE5M2EsIDB4MDAxZSwKKwkweDgxMDgsIDB4MWYwNCwgMHg2YTAwLCAweDAwY2UsIDB4MDE1ZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBiNiwKKwkweDYwMTAsIDB4MjA1OCwgMHhiODAwLCAweGMwZWMsIDB4YjgwMiwgMHgwMGJlLCAweDAwMDUsIDB4MDBiNiwKKwkweDAwYzYsIDB4MDA5NiwgMHgwODBjLCAweDEwNjAsIDB4MDkwYywgMHgwZDdkLCAweDI5NTgsIDB4MDA5ZSwKKwkweDIwMDEsIDB4MTk2YSwgMHgyYjAyLCAweDhiMDcsIDB4ODAwNiwgMHg4MDA2LCAweDkwOGMsIDB4MDAzZiwKKwkweGI5YzYsIDB4OTA4YywgMHhmZmMwLCAweGI5Y2EsIDB4YjhhZiwgMHgwMDAwLCAweDIwMDksIDB4MDBmZiwKKwkweDA4MGMsIDB4NjBhYywgMHhiODA3LCAweDAwMDYsIDB4YjgxMywgMHgwMGZmLCAweGI4MTcsIDB4ZmZmZiwKKwkweGI4NmYsIDB4MDIwMCwgMHhiODZjLCAweGI4OTMsIDB4MDAwMiwgMHhiOGJiLCAweDA1MjAsIDB4YjhhMywKKwkweDAwZmYsIDB4YjhhZiwgMHgwMDAwLCAweDAwY2UsIDB4MDBiZSwgMHgwMDA1LCAweDc4MTAsIDB4MDBiNiwKKwkweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYWMsIDB4MDAwNSwgMHg2MDEwLCAweDAwYjYsIDB4OTA1ZCwKKwkweDAxMDgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwKKwkweGI4MDQsIDB4OTA4YywgMHgwMGZmLCAweDkxOTYsIDB4MDAwNiwgMHgwMTg4LCAweDkxOTYsIDB4MDAwNCwKKwkweDAxNzAsIDB4OTE5NiwgMHgwMDA1LCAweDAxNTgsIDB4OTA4YywgMHhmZjAwLCAweDgxMGYsIDB4OTE5NiwKKwkweDAwMDYsIDB4MDEyOCwgMHg5MTk2LCAweDAwMDQsIDB4MDExMCwgMHg5MTk2LCAweDAwMDUsIDB4MDAyZSwKKwkweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBmNiwgMHgyMDAxLCAweDEwN2UsIDB4MjAwNCwKKwkweDkwNWQsIDB4MDExMCwgMHhiODAwLCAweGQwZWMsIDB4MDBmZSwgMHgwMGJlLCAweDAwMDUsIDB4MDEyNiwKKwkweDAwMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwMDYsIDB4YmFhMCwgMHg5MjkwLCAweDEwMDAsIDB4MjIwNCwKKwkweDliMDYsIDB4MTkwYywgMHgwZDdkLCAweDAwMGUsIDB4YmEwMCwgMHg5MDA1LCAweDAxMTAsIDB4YzJmZCwKKwkweDAwMDgsIDB4YzJmYywgMHhiYTAyLCAweDAwMmUsIDB4MDEyZSwgMHgwMDA1LCAweDIwMTEsIDB4MTgzNywKKwkweDIyMDQsIDB4ZDBjYywgMHgwMTM4LCAweDIwMDEsIDB4MTk4MiwgMHgyMDBjLCAweDIwMTEsIDB4NmFjYiwKKwkweDA4MGMsIDB4ODc5MiwgMHgwMDA1LCAweDIwMTEsIDB4NmFjYiwgMHgwODBjLCAweDg2YzgsIDB4MjAxMSwKKwkweDE4MzcsIDB4MjIwNCwgMHhjMGNjLCAweDIwMTIsIDB4MDAwNSwgMHgwODBjLCAweDU3M2UsIDB4ZDBhYywKKwkweDAwMDUsIDB4MDgwYywgMHg1NzNlLCAweGQwYTQsIDB4MDAwNSwgMHgwMDE2LCAweGI5MDQsIDB4OTE4NCwKKwkweDAwZmYsIDB4OTA4ZSwgMHgwMDA2LCAweDAwMWUsIDB4MDAwNSwgMHgwMDE2LCAweGI5MDQsIDB4OTE4NCwKKwkweGZmMDAsIDB4ODAwNywgMHg5MDhlLCAweDAwMDYsIDB4MDAxZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBmNiwKKwkweDA4MGMsIDB4ZDA5YiwgMHgwMTU4LCAweDcwZGMsIDB4OTA4NCwgMHgwMDI4LCAweDAxMzgsIDB4MjAwMSwKKwkweDEwN2YsIDB4MjAwNCwgMHg5MDVkLCAweDAxMTAsIDB4YjhkNCwgMHhkMDk0LCAweDAwZmUsIDB4MDBiZSwKKwkweDAwMDUsIDB4MjA3MSwgMHgxOTEwLCAweDcwMDMsIDB4MDAwMSwgMHg3MDA3LCAweDAwMDAsIDB4OTAwNiwKKwkweDcwMTIsIDB4NzAxNiwgMHg3MDFhLCAweDcwMWUsIDB4NzAwYSwgMHg3MDQ2LCAweDAwMDUsIDB4MDAxNiwKKwkweDAwZTYsIDB4MjA3MSwgMHgxOTQ3LCAweDkwMGUsIDB4NzEwYSwgMHgwODBjLCAweDU3M2UsIDB4ZDBmYywKKwkweDExNDAsIDB4MDgwYywgMHg1NzNlLCAweDkwMGUsIDB4ZDA5YywgMHgwMTA4LCAweDgxMDgsIDB4NzEwMiwKKwkweDAwZjgsIDB4MjAwMSwgMHgxODY3LCAweDIwMGMsIDB4OTE4NCwgMHgwMDA3LCAweDAwMDIsIDB4NmIxOSwKKwkweDZiMTksIDB4NmIxOSwgMHg2YjE5LCAweDZiMTksIDB4NmIyZiwgMHg2YjNkLCAweDZiMTksIDB4NzAwMywKKwkweDAwMDMsIDB4MjAwOSwgMHgxODY4LCAweDIxMGMsIDB4OTE4NCwgMHhmZjAwLCAweDgwMDcsIDB4OTAwNSwKKwkweDExMTAsIDB4MjAwMSwgMHgwMDAyLCAweDcwMDYsIDB4MDAxOCwgMHg3MDAzLCAweDAwMDUsIDB4MGM4OCwKKwkweDAwZWUsIDB4MDAxZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgwMDUwLCAweDY4NGMsIDB4OTAwNSwKKwkweDExNTAsIDB4MDBlNiwgMHgyMDcxLCAweDE5MTAsIDB4NzAyOCwgMHhjMDg1LCAweDcwMmEsIDB4MDBlZSwKKwkweDkwODUsIDB4MDAwMSwgMHgwNDg4LCAweDY4NDQsIDB4OTAwNSwgMHgwMTU4LCAweDA4MGMsIDB4NzhiMiwKKwkweDZhNjAsIDB4OTIwMCwgMHg3MDAyLCAweDY4NjQsIDB4OTEwMSwgMHg3MDA2LCAweDkwMDYsIDB4NzAxMiwKKwkweDcwMTYsIDB4Njg2MCwgMHg3MDAyLCAweDY4NjQsIDB4NzAwNiwgMHg2ODY4LCAweDcwMGEsIDB4Njg2YywKKwkweDcwMGUsIDB4Njg0NCwgMHg5MDA1LCAweDExMTAsIDB4NzAxMiwgMHg3MDE2LCAweDY4NGMsIDB4NzAxYSwKKwkweDcwMWMsIDB4OTA4NSwgMHgwMDQwLCAweDcwMWUsIDB4NzAzNywgMHgwMDE5LCAweDcwMmIsIDB4MDAwMSwKKwkweDAwZTYsIDB4MjA3MSwgMHgxOTEwLCAweDcwMjgsIDB4YzA4NCwgMHg3MDJhLCAweDcwMDcsIDB4MDAwMSwKKwkweDcwMGIsIDB4MDAwMCwgMHgwMGVlLCAweDkwMDYsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MDAyNiwKKwkweDIwNzEsIDB4MTk0NywgMHg3MDAwLCAweDkwMTUsIDB4MDkwNCwgMHg2ZGYzLCAweDkyODYsIDB4MDAwMywKKwkweDA5MDQsIDB4NmM4MywgMHg5Mjg2LCAweDAwMDUsIDB4MDkwNCwgMHg2YzgzLCAweDIwNzEsIDB4MTg3NywKKwkweGE4N2MsIDB4OTAwNSwgMHgwOTA0LCAweDZiZTQsIDB4NzE0MCwgMHhhODY4LCAweDkxMDIsIDB4MGEwNCwKKwkweDZkZjMsIDB4YTg3OCwgMHhkMDg0LCAweDE1ZDgsIDB4YTg1MywgMHgwMDE5LCAweDIwMDEsIDB4ODAyMywKKwkweGE4NGUsIDB4MjA3MSwgMHgxOTEwLCAweDcwMWMsIDB4OTAwNSwgMHgxOTA0LCAweDZmOGEsIDB4MGUwNCwKKwkweDZmZjgsIDB4MjA3MSwgMHgwMDAwLCAweGE4NTAsIDB4NzAzMiwgMHhhODRjLCAweDcwODIsIDB4YTg3MCwKKwkweDcwODYsIDB4YTg2YywgMHg3MDhhLCAweGE4ODAsIDB4NzA4ZSwgMHg3MDM2LCAweDAxNDYsIDB4MDFkNiwKKwkweDAxMzYsIDB4MDFjNiwgMHgwMTU2LCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAwMmEsIDB4YTg2OCwKKwkweDIwYTgsIDB4YTg2MCwgMHgyMGUwLCAweGE4NWMsIDB4OTA4MCwgMHgwMDIxLCAweDIwOTgsIDB4NDAwMywKKwkweDAxNWUsIDB4MDFjZSwgMHgwMTNlLCAweDAxZGUsIDB4MDE0ZSwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwKKwkweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDE5MGMsIDB4MTFlZSwgMHgwODA0LCAweDZjNjYsIDB4YTg1MywKKwkweDAwMWIsIDB4MjAwMSwgMHg4MDI3LCAweDA4MjAsIDB4NzAwNCwgMHhkMDhjLCAweDE5MDQsIDB4NmRmMywKKwkweGE4NTMsIDB4MDAxYSwgMHgyMDAxLCAweDgwMjQsIDB4MDgwNCwgMHg2YmE4LCAweDAwZTYsIDB4MDAyNiwKKwkweDIwNzEsIDB4MTk0NywgMHg3MDAwLCAweDkwMTUsIDB4MDkwNCwgMHg2ZGYzLCAweDkyODYsIDB4MDAwMywKKwkweDA5MDQsIDB4NmM4MywgMHg5Mjg2LCAweDAwMDUsIDB4MDkwNCwgMHg2YzgzLCAweGE4NGYsIDB4ODAyMiwKKwkweGE4NTMsIDB4MDAxOCwgMHgwODA0LCAweDZjNGIsIDB4YTg2OCwgMHhkMGZjLCAweDExZDgsIDB4MDBlNiwKKwkweDAwMjYsIDB4MjAwMSwgMHgxOTQ3LCAweDIwMDQsIDB4OTAwNSwgMHgwOTA0LCAweDZkZjMsIDB4YTg3YywKKwkweGQwYmMsIDB4MTkwNCwgMHg2ZGYzLCAweGE5NzgsIDB4YTg3NCwgMHg5MTA1LCAweDE5MDQsIDB4NmRmMywKKwkweDIwMDEsIDB4MTk0NywgMHgyMDA0LCAweDAwMDIsIDB4NmRmMywgMHg2YzQ3LCAweDZjODMsIDB4NmM4MywKKwkweDZkZjMsIDB4NmM4MywgMHgwMDA1LCAweGE4NjgsIDB4ZDBmYywgMHgxNTAwLCAweDAwZTYsIDB4MDAyNiwKKwkweDIwMDksIDB4MTk0NywgMHgyMTBjLCAweDgxZmYsIDB4MDkwNCwgMHg2ZGYzLCAweGE4N2MsIDB4ZDBjYywKKwkweDA5MDQsIDB4NmRmMywgMHhhODgwLCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDEsIDB4MTkwNCwKKwkweDZkZjMsIDB4OTE4NiwgMHgwMDAzLCAweDA5MDQsIDB4NmM4MywgMHg5MTg2LCAweDAwMDUsIDB4MDkwNCwKKwkweDZjODMsIDB4YTg0ZiwgMHg4MDIxLCAweGE4NTMsIDB4MDAxNywgMHgwMDI4LCAweDAwMDUsIDB4YTg0ZiwKKwkweDgwMjAsIDB4YTg1MywgMHgwMDE2LCAweDIwNzEsIDB4MTkxMCwgMHg3MDFjLCAweDkwMDUsIDB4MTkwNCwKKwkweDZmOGEsIDB4MGUwNCwgMHg2ZmY4LCAweDIwNzEsIDB4MDAwMCwgMHhhODRjLCAweDcwODIsIDB4YTg1MCwKKwkweDcwMzIsIDB4YTg2YywgMHg3MDg2LCAweDcwMzYsIDB4YTg3MCwgMHg3MDhhLCAweDIwOTEsIDB4NDA4MCwKKwkweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMWVlLCAweDIwNzEsIDB4MTgwMCwKKwkweDIwMTEsIDB4MDAwMSwgMHhhODA0LCAweDkwMGQsIDB4NzAyYywgMHgxMTU4LCAweGE4MDIsIDB4MjkwMCwKKwkweDcwMmUsIDB4NzBjMCwgMHg5MjAwLCAweDcwYzIsIDB4MDgwYywgMHg4NWNlLCAweDAwMmUsIDB4MDBlZSwKKwkweDAwMDUsIDB4MDA5NiwgMHgyMTQ4LCAweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwKKwkweDFkYzgsIDB4MDA5ZSwgMHgwYzU4LCAweGE4NGYsIDB4MDAwMCwgMHgwMGY2LCAweDIwNzksIDB4MDA1MCwKKwkweDIwNzEsIDB4MTkxMCwgMHhhODAzLCAweDAwMDAsIDB4NzAxMCwgMHg5MDA1LCAweDE5MDQsIDB4NmQ3OCwKKwkweDc4MmMsIDB4OTA4YywgMHgwNzgwLCAweDE5MGMsIDB4NzE0NiwgMHg4MDA0LCAweDgwMDQsIDB4ODAwNCwKKwkweDkwODQsIDB4MDAwMywgMHgwMDAyLCAweDZjYTEsIDB4NmQ3OCwgMHg2Y2M2LCAweDZkMTMsIDB4MDgwYywKKwkweDBkN2QsIDB4MjA3MSwgMHgxODAwLCAweDI5MDAsIDB4NzgyMiwgMHhhODA0LCAweDkwMGQsIDB4MTE3MCwKKwkweDIwNzEsIDB4MWEwMiwgMHg3MDNjLCAweDkwMDUsIDB4MTMyOCwgMHgyMDAxLCAweDE5NDgsIDB4MjAwNCwKKwkweDgwMDUsIDB4NzAzZSwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDkwMTYsIDB4NzAyYywKKwkweDIxNDgsIDB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwKKwkweDcwYzAsIDB4OTIwMCwgMHg3MGMyLCAweDA4MGMsIDB4ODVjZSwgMHgwYzEwLCAweDIwNzEsIDB4MTgwMCwKKwkweDI5MDAsIDB4NzgyMiwgMHhhODA0LCAweDkwMGQsIDB4MTVhOCwgMHg3ODI0LCAweDAwZTYsIDB4MjA3MSwKKwkweDAwNDAsIDB4NzEyYywgMHhkMTljLCAweDExNzAsIDB4MjAwOSwgMHgxODMwLCAweDIxMGMsIDB4OTE4YSwKKwkweDAwMjAsIDB4MDI0MCwgMHg3MDIyLCAweDIwMDEsIDB4MWRjMCwgMHgyMDBjLCAweDgxMDgsIDB4MjEwMiwKKwkweDAwZWUsIDB4MDA1OCwgMHgwMGVlLCAweDIwNDgsIDB4NzAyYywgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwKKwkweDcwYzAsIDB4ODAwMCwgMHg3MGMyLCAweDA4MGMsIDB4ODVjZSwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwKKwkweDE5MGMsIDB4NzE0NiwgMHhkMGE0LCAweDE5YzgsIDB4MjA3MSwgMHgxYTAyLCAweDcwM2MsIDB4OTAwNSwKKwkweDEzMjgsIDB4MjAwMSwgMHgxOTQ4LCAweDIwMDQsIDB4ODAwNSwgMHg3MDNlLCAweDAwZmUsIDB4MDAyZSwKKwkweDAwZWUsIDB4MDAwNSwgMHg5MDE2LCAweDcwMmMsIDB4MjE0OCwgMHhhOTA0LCAweGE4MDIsIDB4ODIxMCwKKwkweDI5MDAsIDB4ODFmZiwgMHgxZGM4LCAweDcwMmUsIDB4NzBjMCwgMHg5MjAwLCAweDcwYzIsIDB4MDgwYywKKwkweDg1Y2UsIDB4MDgwNCwgMHg2Y2NkLCAweDAwOTYsIDB4MDBlNiwgMHg3ODI0LCAweDIwNDgsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzAyYywgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGMwLCAweDgwMDAsIDB4NzBjMiwKKwkweDA4MGMsIDB4ODVjZSwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcxNDYsIDB4ZDBhNCwKKwkweDFkNjAsIDB4MDBlZSwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcxNDYsIDB4ZDA5YywKKwkweDExYTAsIDB4MDA5ZSwgMHgyOTAwLCAweDc4MjIsIDB4YTgwNCwgMHg5MDBkLCAweDE1NjAsIDB4MjA3MSwKKwkweDFhMDIsIDB4NzAzYywgMHg5MDA1LCAweDEzMjgsIDB4MjAwMSwgMHgxOTQ4LCAweDIwMDQsIDB4ODAwNSwKKwkweDcwM2UsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHgwMDllLCAweDI5MDgsIDB4NzAxMCwKKwkweDgwMDAsIDB4NzAxMiwgMHg3MDE4LCAweDkwNGQsIDB4NzExYSwgMHgwMTEwLCAweGE5MDIsIDB4MDAwOCwKKwkweDcxMWUsIDB4MjE0OCwgMHhhODA0LCAweDkwMGQsIDB4MTE3MCwgMHgyMDcxLCAweDFhMDIsIDB4NzAzYywKKwkweDkwMDUsIDB4MTMyOCwgMHgyMDAxLCAweDE5NDgsIDB4MjAwNCwgMHg4MDA1LCAweDcwM2UsIDB4MDBmZSwKKwkweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwgMHg5MDE2LCAweDcwMmMsIDB4MjE0OCwKKwkweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwgMHgxZGM4LCAweDcwMmUsIDB4NzBjMCwKKwkweDkyMDAsIDB4NzBjMiwgMHgwODBjLCAweDg1Y2UsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwKKwkweDI5MDgsIDB4NzAxMCwgMHg4MDAwLCAweDcwMTIsIDB4NzAxOCwgMHg5MDRkLCAweDcxMWEsIDB4MDExMCwKKwkweGE5MDIsIDB4MDAwOCwgMHg3MTFlLCAweDIxNDgsIDB4YTgwNCwgMHg5MDBkLCAweDE5MDQsIDB4NmRjZCwKKwkweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NzE0NiwgMHhkMDljLCAweDExOTgsIDB4NzAxYywKKwkweDkwNGQsIDB4MDE4MCwgMHg3MDEwLCAweDgwMDEsIDB4NzAxMiwgMHgxMTA4LCAweDcwMWEsIDB4YTgwMCwKKwkweDcwMWUsIDB4MjkwMCwgMHg3ODIyLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NzE0NiwKKwkweGQwOWMsIDB4MGQ2OCwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcxNDYsIDB4ZDBhNCwKKwkweDAxYjAsIDB4MDBlNiwgMHg3ODI0LCAweDIwNDgsIDB4MjA3MSwgMHgxODAwLCAweDcwMmMsIDB4YTgwMiwKKwkweDI5MDAsIDB4NzAyZSwgMHg3MGMwLCAweDgwMDAsIDB4NzBjMiwgMHgwODBjLCAweDg1Y2UsIDB4NzgyYywKKwkweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcxNDYsIDB4ZDBhNCwgMHgxZDYwLCAweDAwZWUsIDB4MjA3MSwKKwkweDFhMDIsIDB4NzAzYywgMHg5MDA1LCAweDEzMjgsIDB4MjAwMSwgMHgxOTQ4LCAweDIwMDQsIDB4ODAwNSwKKwkweDcwM2UsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwKKwkweDkwMTYsIDB4NzAyYywgMHgyMTQ4LCAweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwKKwkweDFkYzgsIDB4NzAyZSwgMHg3MGMwLCAweDkyMDAsIDB4NzBjMiwgMHgwODBjLCAweDg1Y2UsIDB4MDBlZSwKKwkweDA4MDQsIDB4NmQ4OCwgMHhhODY4LCAweGQwZmMsIDB4MTU2MCwgMHgwMDk2LCAweGE4MDQsIDB4YTgwNywKKwkweDAwMDAsIDB4OTA0ZCwgMHgxOTBjLCAweDBmZjksIDB4MDA5ZSwgMHgwMDE4LCAweGE4NjgsIDB4ZDBmYywKKwkweDE1MDAsIDB4MDBlNiwgMHgwMDI2LCAweGE4NGYsIDB4MDAwMCwgMHgwMGY2LCAweDIwNzksIDB4MDA1MCwKKwkweDIwNzEsIDB4MTkxMCwgMHhhODAzLCAweDAwMDAsIDB4NzAxMCwgMHg5MDA1LCAweDE5MDQsIDB4NmYwOCwKKwkweDc4MmMsIDB4OTA4YywgMHgwNzgwLCAweDE5MGMsIDB4NzE0NiwgMHg4MDA0LCAweDgwMDQsIDB4ODAwNCwKKwkweDkwODQsIDB4MDAwMywgMHgwMDAyLCAweDZlMTIsIDB4NmYwOCwgMHg2ZTJkLCAweDZlOWIsIDB4MDgwYywKKwkweDBkN2QsIDB4MDAwNSwgMHgyMDcxLCAweDE4MDAsIDB4MjkwMCwgMHg3ODIyLCAweGE4MDQsIDB4OTAwZCwKKwkweDExMjAsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHg5MDE2LCAweDcwMmMsIDB4MjE0OCwKKwkweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwgMHgxZGM4LCAweDcwMmUsIDB4NzBjMCwKKwkweDkyMDAsIDB4NzBjMiwgMHgwODBjLCAweDg1Y2UsIDB4MGM2MCwgMHgyMDcxLCAweDE4MDAsIDB4MjkwMCwKKwkweDc4MjIsIDB4YTgwNCwgMHg5MDBkLCAweDE5MDQsIDB4NmU4YSwgMHg3ODMwLCAweGQwZGMsIDB4MTEyMCwKKwkweDAwZmUsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4NzgyNCwgMHgwMGU2LCAweDIwNzEsIDB4MDA0MCwKKwkweDcxMmMsIDB4ZDE5YywgMHgxMTcwLCAweDIwMDksIDB4MTgzMCwgMHgyMTBjLCAweDkxOGEsIDB4MDAyMCwKKwkweDAyNDAsIDB4NzAyMiwgMHgyMDAxLCAweDFkYzAsIDB4MjAwYywgMHg4MTA4LCAweDIxMDIsIDB4MDBlZSwKKwkweDAwNTgsIDB4MDBlZSwgMHgyMDQ4LCAweDcwMmMsIDB4YTgwMiwgMHgyOTAwLCAweDcwMmUsIDB4NzBjMCwKKwkweDgwMDAsIDB4NzBjMiwgMHgwODBjLCAweDg1Y2UsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywKKwkweDcxNDYsIDB4ZDBhNCwgMHgxOWM4LCAweDBlMDQsIDB4NmU4MSwgMHg3ODM4LCAweDc5MzgsIDB4OTEwZSwKKwkweDFkZTAsIDB4MDBkNiwgMHgyMDY5LCAweDAwMDAsIDB4NjgzNiwgMHg2ODMzLCAweDAwMTMsIDB4MDBkZSwKKwkweDIwMDEsIDB4MTkyMSwgMHgyMDBjLCAweGMxODQsIDB4MjEwMiwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwKKwkweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDE5MGMsIDB4MTFlZSwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwKKwkweDAwMDUsIDB4MjAwMSwgMHgxOTIxLCAweDIwMGMsIDB4YzE4NSwgMHgyMTAyLCAweDAwZmUsIDB4MDAyZSwKKwkweDAwZWUsIDB4MDAwNSwgMHg5MDE2LCAweDcwMmMsIDB4MjE0OCwgMHhhOTA0LCAweGE4MDIsIDB4ODIxMCwKKwkweDI5MDAsIDB4ODFmZiwgMHgxZGM4LCAweDcwMmUsIDB4NzBjMCwgMHg5MjAwLCAweDcwYzIsIDB4MDgwYywKKwkweDg1Y2UsIDB4MDgwNCwgMHg2ZTNjLCAweDAwOTYsIDB4MDBlNiwgMHg3ODI0LCAweDIwNDgsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzAyYywgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGMwLCAweDgwMDAsIDB4NzBjMiwKKwkweDA4MGMsIDB4ODVjZSwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcxNDYsIDB4ZDBhNCwKKwkweDFkNjAsIDB4MDBlZSwgMHgwZTA0LCAweDZlZGIsIDB4NzgzOCwgMHg3OTM4LCAweDkxMGUsIDB4MWRlMCwKKwkweDAwZDYsIDB4MjA2OSwgMHgwMDAwLCAweDY4MzYsIDB4NjgzMywgMHgwMDEzLCAweDAwZGUsIDB4NzA0NCwKKwkweGMwODQsIDB4NzA0NiwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwKKwkweDE5MGMsIDB4MTFlZSwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcxNDYsIDB4ZDA5YywKKwkweDExNzAsIDB4MDA5ZSwgMHgyOTAwLCAweDc4MjIsIDB4YTgwNCwgMHg5MDBkLCAweDExZTAsIDB4MDBmZSwKKwkweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDcwNDQsIDB4YzA4NSwgMHg3MDQ2LCAweDBjNTgsIDB4MDA5ZSwKKwkweDI5MDgsIDB4NzAxMCwgMHg4MDAwLCAweDcwMTIsIDB4NzAxOCwgMHg5MDRkLCAweDcxMWEsIDB4MDExMCwKKwkweGE5MDIsIDB4MDAwOCwgMHg3MTFlLCAweDIxNDgsIDB4YTgwNCwgMHg5MDBkLCAweDExMjAsIDB4MDBmZSwKKwkweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwgMHg5MDE2LCAweDcwMmMsIDB4MjE0OCwKKwkweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwgMHgxZGM4LCAweDcwMmUsIDB4NzBjMCwKKwkweDkyMDAsIDB4NzBjMiwgMHgwODBjLCAweDg1Y2UsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwKKwkweDI5MDgsIDB4NzAxMCwgMHg4MDAwLCAweDcwMTIsIDB4NzAxOCwgMHg5MDRkLCAweDcxMWEsIDB4MDExMCwKKwkweGE5MDIsIDB4MDAwOCwgMHg3MTFlLCAweDIxNDgsIDB4YTgwNCwgMHg5MDBkLCAweDE5MDQsIDB4NmY3NSwKKwkweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NzE0NiwgMHhkMDljLCAweDExYjAsIDB4NzAxYywKKwkweDkwNGQsIDB4MDE5OCwgMHhhODRjLCAweDkwMDUsIDB4MTE4MCwgMHg3MDEwLCAweDgwMDEsIDB4NzAxMiwKKwkweDExMDgsIDB4NzAxYSwgMHhhODAwLCAweDcwMWUsIDB4MjkwMCwgMHg3ODIyLCAweDc4MmMsIDB4OTA5NCwKKwkweDA3ODAsIDB4MTkwYywgMHg3MTQ2LCAweGQwOWMsIDB4MGQ1MCwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwKKwkweDE5MGMsIDB4NzE0NiwgMHhkMGE0LCAweDA1YTgsIDB4MDBlNiwgMHg3ODI0LCAweDIwNDgsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzAyYywgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGMwLCAweDgwMDAsIDB4NzBjMiwKKwkweDA4MGMsIDB4ODVjZSwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcxNDYsIDB4ZDBhNCwKKwkweDFkNjAsIDB4MDBlZSwgMHgwZTA0LCAweDZmNmUsIDB4NzgzOCwgMHg3OTM4LCAweDkxMGUsIDB4MWRlMCwKKwkweDAwZDYsIDB4MjA2OSwgMHgwMDAwLCAweDY4MzYsIDB4NjgzMywgMHgwMDEzLCAweDAwZGUsIDB4NzA0NCwKKwkweGMwODQsIDB4NzA0NiwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwKKwkweDE5MGMsIDB4MTFlZSwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDcwNDQsIDB4YzA4NSwKKwkweDcwNDYsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwKKwkweDkwMTYsIDB4NzAyYywgMHgyMTQ4LCAweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwKKwkweDFkYzgsIDB4NzAyZSwgMHg3MGMwLCAweDkyMDAsIDB4NzBjMiwgMHgwODBjLCAweDg1Y2UsIDB4MDBlZSwKKwkweDA4MDQsIDB4NmYxOCwgMHgyMDcxLCAweDE5MTAsIDB4YTgwMywgMHgwMDAwLCAweDI5MDgsIDB4NzAxMCwKKwkweDgwMDAsIDB4NzAxMiwgMHg3MDE4LCAweDkwNGQsIDB4NzExYSwgMHgwMTEwLCAweGE5MDIsIDB4MDAwOCwKKwkweDcxMWUsIDB4MjE0OCwgMHhhODA0LCAweDkwMGQsIDB4MTEyOCwgMHgxZTA0LCAweDZmYjUsIDB4MDAyZSwKKwkweDAwZWUsIDB4MDAwNSwgMHgyMDcxLCAweDE4MDAsIDB4OTAxNiwgMHg3MDJjLCAweDIxNDgsIDB4YTkwNCwKKwkweGE4MDIsIDB4ODIxMCwgMHgyOTAwLCAweDgxZmYsIDB4MWRjOCwgMHg3MDJlLCAweDcwYzAsIDB4OTIwMCwKKwkweDcwYzIsIDB4MDgwYywgMHg4NWNlLCAweDBlMDQsIDB4NmY5ZiwgMHgyMDcxLCAweDE5MTAsIDB4NzAxYywKKwkweDIwNDgsIDB4YTg0YywgMHg5MDBkLCAweDBkMTgsIDB4MjA3MSwgMHgwMDAwLCAweDcxODIsIDB4YTg1MCwKKwkweDcwMzIsIDB4YTg2YywgMHg3MDg2LCAweDcwMzYsIDB4YTg3MCwgMHg3MDhhLCAweGE4NTAsIDB4OTA4MiwKKwkweDAwMTksIDB4MTI3OCwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwKKwkweDE5MGMsIDB4MTFlZSwgMHgyMDcxLCAweDE5MTAsIDB4MDgwYywgMHg3MTMyLCAweDAwMmUsIDB4MDBlZSwKKwkweDAwMDUsIDB4YTg1MCwgMHg5MDgyLCAweDAwMWMsIDB4MWU2OCwgMHhhODgwLCAweDcwOGUsIDB4NzAzNiwKKwkweDAxNDYsIDB4MDFkNiwgMHgwMTM2LCAweDAxYzYsIDB4MDE1NiwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwKKwkweDAwMmEsIDB4YTg2OCwgMHgyMGE4LCAweGE4NjAsIDB4MjBlMCwgMHhhODVjLCAweDkwODAsIDB4MDAyMSwKKwkweDIwOTgsIDB4NDAwMywgMHgwMTVlLCAweDAxY2UsIDB4MDEzZSwgMHgwMWRlLCAweDAxNGUsIDB4MDg5MCwKKwkweDIwNzEsIDB4MTkxMCwgMHhhODAzLCAweDAwMDAsIDB4MjkwOCwgMHg3MDEwLCAweDgwMDAsIDB4NzAxMiwKKwkweDcwMTgsIDB4OTA0ZCwgMHg3MTFhLCAweDAxMTAsIDB4YTkwMiwgMHgwMDA4LCAweDcxMWUsIDB4MjE0OCwKKwkweGE4MDQsIDB4OTAwZCwgMHgxMTE4LCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwKKwkweDkwMTYsIDB4NzAyYywgMHgyMTQ4LCAweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwKKwkweDFkYzgsIDB4NzAyZSwgMHg3MGMwLCAweDkyMDAsIDB4NzBjMiwgMHgwODBjLCAweDg1Y2UsIDB4MDAyZSwKKwkweDAwZWUsIDB4MDAwNSwgMHgwMDA2LCAweGE4N2MsIDB4MDAwNiwgMHhhODY3LCAweDAxMDMsIDB4MjBhOSwKKwkweDAwMWMsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDFkLCAweDIwYTAsIDB4OTAwNiwKKwkweDQwMDQsIDB4MDAwZSwgMHg5MDg0LCAweDAwZmYsIDB4YTg3ZSwgMHgwMDBlLCAweGE4N2EsIDB4YTk4MiwKKwkweDAwMDUsIDB4MjA3MSwgMHgxOTEwLCAweDcwMDQsIDB4MDAwMiwgMHg3MDQ1LCAweDcwNDYsIDB4NzEzMSwKKwkweDcwNDYsIDB4NzA0MywgMHg3MTMxLCAweDA4MGMsIDB4MGQ3ZCwgMHgwMDA1LCAweDIwMDEsIDB4MTk0NywKKwkweDIwMDQsIDB4MDAwMiwgMHg3MDUwLCAweDcwNTAsIDB4NzBjYSwgMHg3MGNiLCAweDcwNTAsIDB4NzBjYiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDFlMGMsIDB4NzE1MSwgMHg3MDFjLCAweDkwNGQsIDB4MDUwOCwKKwkweGE4NGMsIDB4OTAwNSwgMHgwOTA0LCAweDcwOWIsIDB4MGUwNCwgMHg3MDc5LCAweGE5NGMsIDB4MjA3MSwKKwkweDAwMDAsIDB4NzE4MiwgMHhhODUwLCAweDcwMzIsIDB4YTg2YywgMHg3MDg2LCAweDcwMzYsIDB4YTg3MCwKKwkweDcwOGEsIDB4YTg1MCwgMHg5MDgyLCAweDAwMTksIDB4MTI3OCwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwKKwkweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDE5MGMsIDB4MTFlZSwgMHgyMDcxLCAweDE5MTAsIDB4MDgwYywKKwkweDcxMzIsIDB4MDEyZSwgMHgwODA0LCAweDcwYzksIDB4YTg1MCwgMHg5MDgyLCAweDAwMWMsIDB4MWU2OCwKKwkweGE4ODAsIDB4NzA4ZSwgMHg3MDM2LCAweDAxNDYsIDB4MDFkNiwgMHgwMTM2LCAweDAxYzYsIDB4MDE1NiwKKwkweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAwMmEsIDB4YTg2OCwgMHgyMGE4LCAweGE4NjAsIDB4MjBlMCwKKwkweGE4NWMsIDB4OTA4MCwgMHgwMDIxLCAweDIwOTgsIDB4NDAwMywgMHgwMTVlLCAweDAxY2UsIDB4MDEzZSwKKwkweDAxZGUsIDB4MDE0ZSwgMHgwODkwLCAweDIwMDEsIDB4MDA1YiwgMHgyMDA0LCAweDkwOTQsIDB4MDc4MCwKKwkweDE5MGMsIDB4NzE0NiwgMHhkMDljLCAweDIwNzEsIDB4MTkxMCwgMHgxNTEwLCAweDIwNzEsIDB4MTkxMCwKKwkweDcwMGYsIDB4MDAwMSwgMHhhOTY0LCAweDkxODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDMsIDB4MTEzMCwKKwkweDgxMGYsIDB4OTE4YywgMHgwMGZmLCAweDgxMDEsIDB4MDEwOCwgMHg3MTBlLCAweDI5MDAsIDB4MDBkNiwKKwkweDIwNjksIDB4MDA1MCwgMHg2ODIyLCAweDAwZGUsIDB4MjA3MSwgMHgxOTEwLCAweDcwMWMsIDB4MjA0OCwKKwkweDcwMTAsIDB4ODAwMSwgMHg3MDEyLCAweGE4MDAsIDB4NzAxZSwgMHg5MDA1LCAweDExMDgsIDB4NzAxYSwKKwkweDAxMmUsIDB4MDAwNSwgMHgwMDA1LCAweDAwZDYsIDB4MjAwOCwgMHgyMDY5LCAweDFhMDIsIDB4NjgzYywKKwkweDkwMDUsIDB4MDc2MCwgMHgwMTU4LCAweDkxODYsIDB4MDAwMywgMHgwNTQwLCAweDIwMDEsIDB4MTgxNSwKKwkweDIwMDQsIDB4MjAwOSwgMHgxYjUwLCAweDIxMGMsIDB4OTEwMiwgMHgxNTAwLCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA2OSwgMHgwMDUwLCAweDY5M2MsIDB4NjgzOCwgMHg5MTA2LCAweDAxOTAsIDB4MGUwNCwKKwkweDcwZmQsIDB4MjA2OSwgMHgwMDAwLCAweDY4MzcsIDB4ODA0MCwgMHg2ODMzLCAweDAwMTIsIDB4Njg4MywKKwkweDgwNDAsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywKKwkweDExZWUsIDB4MjA2OSwgMHgxYTAyLCAweDY4M2YsIDB4ZmZmZiwgMHgwMTJlLCAweDAwZGUsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgxZTBjLCAweDcxYjcsIDB4NzAxYywgMHg5MDRkLCAweDA1NDAsIDB4MjAwMSwKKwkweDAwNWIsIDB4MjAwNCwgMHg5MDk0LCAweDA3ODAsIDB4MTVjOSwgMHhkMDljLCAweDE1MDAsIDB4MjA3MSwKKwkweDE5MTAsIDB4NzAwZiwgMHgwMDAxLCAweGE5NjQsIDB4OTE4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwMywKKwkweDExMzAsIDB4ODEwZiwgMHg5MThjLCAweDAwZmYsIDB4ODEwMSwgMHgwMTA4LCAweDcxMGUsIDB4MjkwMCwKKwkweDAwZDYsIDB4MjA2OSwgMHgwMDUwLCAweDY4MjIsIDB4MDBkZSwgMHg3MDFjLCAweDIwNDgsIDB4NzAxMCwKKwkweDgwMDEsIDB4NzAxMiwgMHhhODAwLCAweDcwMWUsIDB4OTAwNSwgMHgxMTA4LCAweDcwMWEsIDB4MDEyZSwKKwkweDAwMDUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDFjLCAweDkwNGQsIDB4MDE2MCwKKwkweDcwMTAsIDB4ODAwMSwgMHg3MDEyLCAweGE4MDAsIDB4NzAxZSwgMHg5MDA1LCAweDExMDgsIDB4NzAxYSwKKwkweDAxMmUsIDB4MDgwYywgMHgxMDc5LCAweDAwMDUsIDB4MDEyZSwgMHgwMDA1LCAweDIwOTEsIDB4ODAwMCwKKwkweDBlMDQsIDB4NzE0OCwgMHgwMDA2LCAweDAwMTYsIDB4MjAwMSwgMHg4MDA0LCAweDAwMDYsIDB4MDgwNCwKKwkweDBkODYsIDB4MDA5NiwgMHgwMGY2LCAweDIwNzksIDB4MDA1MCwgMHg3MDQ0LCAweGQwODQsIDB4MDFjMCwKKwkweGMwODQsIDB4NzA0NiwgMHg3ODM4LCAweDc5MzgsIDB4OTEwZSwgMHgxZGUwLCAweDAwZDYsIDB4MjA2OSwKKwkweDAwMDAsIDB4NjgzNiwgMHg2ODMzLCAweDAwMTMsIDB4MDBkZSwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwKKwkweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDE5MGMsIDB4MTFlZSwgMHgwMGZlLCAweDAwOWUsIDB4MDAwNSwKKwkweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5OTEsIDB4ZDBhNCwgMHgwZGI4LCAweDAwZTYsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzgyNCwgMHgwMGU2LCAweDIwNzEsIDB4MDA0MCwgMHg3MTJjLCAweGQxOWMsIDB4MTE3MCwKKwkweDIwMDksIDB4MTgzMCwgMHgyMTBjLCAweDkxOGEsIDB4MDAyMCwgMHgwMjQwLCAweDcwMjIsIDB4MjAwMSwKKwkweDFkYzAsIDB4MjAwYywgMHg4MTA4LCAweDIxMDIsIDB4MDBlZSwgMHgwMDU4LCAweDAwZWUsIDB4MjA0OCwKKwkweDcwMmMsIDB4YTgwMiwgMHgyOTAwLCAweDcwMmUsIDB4NzBjMCwgMHg4MDAwLCAweDcwYzIsIDB4MDgwYywKKwkweDg1Y2UsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywgMHg3MTQ2LCAweGQwYTQsIDB4MTljOCwKKwkweDc4MzgsIDB4NzkzOCwgMHg5MTBlLCAweDFkZTAsIDB4MDBkNiwgMHgyMDY5LCAweDAwMDAsIDB4NjgzNiwKKwkweDY4MzMsIDB4MDAxMywgMHgwMGRlLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwODksIDB4MjAwNCwKKwkweGQwODQsIDB4MTkwYywgMHgxMWVlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDllLCAweDAwMDUsIDB4MDBmNiwKKwkweDIwNzksIDB4MDA1MCwgMHg3MDQ0LCAweGQwODQsIDB4MDFiOCwgMHhjMDg0LCAweDcwNDYsIDB4NzgzOCwKKwkweDc5MzgsIDB4OTEwZSwgMHgxZGUwLCAweDAwZDYsIDB4MjA2OSwgMHgwMDAwLCAweDY4MzYsIDB4NjgzMywKKwkweDAwMTMsIDB4MDBkZSwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwKKwkweDE5MGMsIDB4MTFlZSwgMHgwMGZlLCAweDAwMDUsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywKKwkweDcxNDYsIDB4ZDBhNCwgMHgwZGI4LCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLCAweDc4MjQsIDB4MjA0OCwKKwkweDcwMmMsIDB4YTgwMiwgMHgyOTAwLCAweDcwMmUsIDB4NzBjMCwgMHg4MDAwLCAweDcwYzIsIDB4MDgwYywKKwkweDg1Y2UsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywgMHg3MTQ2LCAweGQwYTQsIDB4MWQ3MCwKKwkweDAwZDYsIDB4MjA2OSwgMHgwMDUwLCAweDY5M2MsIDB4MjA2OSwgMHgxOTQ3LCAweDY4MDgsIDB4NjkwYSwKKwkweDIwNjksIDB4MWEwMiwgMHg5MTAyLCAweDExMTgsIDB4NjgzYywgMHg5MDA1LCAweDEzMjgsIDB4MjAwMSwKKwkweDE5NDgsIDB4MjAwYywgMHg4MTBkLCAweDY5M2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwKKwkweDcwOTgsIDB4OTA4YSwgMHgwMDI5LCAweDFhMGMsIDB4MGQ3ZCwgMHg5MDgyLCAweDAwMWQsIDB4MDAzYiwKKwkweDAwMjYsIDB4MjAxMSwgMHgxZTAwLCAweDA4MGMsIDB4MmFiNCwgMHgwMDJlLCAweDAwMDUsIDB4NzJlMywKKwkweDcyNjksIDB4NzI4NSwgMHg3MmFmLCAweDcyZDIsIDB4NzMxMiwgMHg3MzI0LCAweDcyODUsIDB4NzJmYSwKKwkweDcyMjQsIDB4NzI1MiwgMHg3MjIzLCAweDAwMDUsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsIDB4NjgwNCwKKwkweDkwMDUsIDB4MTE4MCwgMHg2ODA4LCAweDkwMDUsIDB4MTUxOCwgMHg3MDliLCAweDAwMjgsIDB4MjA2OSwKKwkweDE5OGUsIDB4MmQwNCwgMHg3MDAyLCAweDA4MGMsIDB4NzY3ZSwgMHg2MDI4LCAweDkwODUsIDB4MDYwMCwKKwkweDYwMmEsIDB4MDBiMCwgMHg3MDliLCAweDAwMjgsIDB4MjA2OSwgMHgxOThlLCAweDJkMDQsIDB4NzAwMiwKKwkweDYwMjgsIDB4OTA4NSwgMHgwNjAwLCAweDYwMmEsIDB4MDBlNiwgMHgwMDM2LCAweDAwNDYsIDB4MDA1NiwKKwkweDIwNzEsIDB4MWE2YSwgMHgwODBjLCAweDFiMTAsIDB4MDA1ZSwgMHgwMDRlLCAweDAwM2UsIDB4MDBlZSwKKwkweDAwZGUsIDB4MDAwNSwgMHgwMGQ2LCAweDIwNjksIDB4MDIwMCwgMHg2ODA0LCAweDkwMDUsIDB4MTE3OCwKKwkweDY4MDgsIDB4OTAwNSwgMHgxMTYwLCAweDcwOWIsIDB4MDAyOCwgMHgyMDY5LCAweDE5OGUsIDB4MmQwNCwKKwkweDcwMDIsIDB4MDgwYywgMHg3NzIxLCAweDYwMjgsIDB4OTA4NSwgMHgwNjAwLCAweDYwMmEsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweDAwOTAsIDB4MDgwYywgMHgyYTdhLCAweDAwMGUsIDB4NjEyNCwKKwkweGQxZTQsIDB4MTE5MCwgMHgwODBjLCAweDczOTUsIDB4ZDFkNCwgMHgxMTYwLCAweGQxZGMsIDB4MTEzOCwKKwkweGQxY2MsIDB4MDE1MCwgMHg3MDliLCAweDAwMjAsIDB4MDgwYywgMHg3Mzk1LCAweDAwMjgsIDB4NzA5YiwKKwkweDAwMWQsIDB4MDAxMCwgMHg3MDliLCAweDAwMWYsIDB4MDAwNSwgMHgyMDAxLCAweDAwODgsIDB4MDgwYywKKwkweDJhN2EsIDB4NjEyNCwgMHhkMWNjLCAweDExZTgsIDB4ZDFkYywgMHgxMWMwLCAweGQxZTQsIDB4MTE5OCwKKwkweDkxODQsIDB4MWUwMCwgMHgxMWQ4LCAweDA4MGMsIDB4MWIzNSwgMHg2MGUzLCAweDAwMDEsIDB4NjAwYywKKwkweGMwYjQsIDB4NjAwZSwgMHgwODBjLCAweDc1NjksIDB4MjAwMSwgMHgwMDgwLCAweDA4MGMsIDB4MmE3YSwKKwkweDcwOWIsIDB4MDAyOCwgMHgwMDU4LCAweDcwOWIsIDB4MDAxZSwgMHgwMDQwLCAweDcwOWIsIDB4MDAxZCwKKwkweDAwMjgsIDB4NzA5YiwgMHgwMDIwLCAweDAwMTAsIDB4NzA5YiwgMHgwMDFmLCAweDAwMDUsIDB4MDgwYywKKwkweDFiMzUsIDB4NjBlMywgMHgwMDAxLCAweDYwMGMsIDB4YzBiNCwgMHg2MDBlLCAweDA4MGMsIDB4NzU2OSwKKwkweDIwMDEsIDB4MDA4MCwgMHgwODBjLCAweDJhN2EsIDB4NjEyNCwgMHhkMWQ0LCAweDExODAsIDB4ZDFkYywKKwkweDExNTgsIDB4ZDFlNCwgMHgxMTMwLCAweDkxODQsIDB4MWUwMCwgMHgxMTU4LCAweDcwOWIsIDB4MDAyOCwKKwkweDAwNDAsIDB4NzA5YiwgMHgwMDFlLCAweDAwMjgsIDB4NzA5YiwgMHgwMDFkLCAweDAwMTAsIDB4NzA5YiwKKwkweDAwMWYsIDB4MDAwNSwgMHgyMDAxLCAweDAwYTAsIDB4MDgwYywgMHgyYTdhLCAweDYxMjQsIDB4ZDFkYywKKwkweDExMzgsIDB4ZDFlNCwgMHgwMTM4LCAweDA4MGMsIDB4MWIzNSwgMHg3MDliLCAweDAwMWUsIDB4MDAxMCwKKwkweDcwOWIsIDB4MDAxZCwgMHgwMDA1LCAweDA4MGMsIDB4NzQxZSwgMHg2MTI0LCAweGQxZGMsIDB4MTE4OCwKKwkweDA4MGMsIDB4NzM5NSwgMHgwMDE2LCAweDA4MGMsIDB4MWIzNSwgMHgwMDFlLCAweGQxZDQsIDB4MTEyOCwKKwkweGQxZTQsIDB4MDEzOCwgMHg3MDliLCAweDAwMWUsIDB4MDAyMCwgMHg3MDliLCAweDAwMWYsIDB4MDgwYywKKwkweDczOTUsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4MDBhMCwgMHgwODBjLCAweDJhN2EsIDB4MDAwZSwKKwkweDYxMjQsIDB4ZDFkNCwgMHgxMTYwLCAweGQxY2MsIDB4MTE1MCwgMHhkMWRjLCAweDExMjgsIDB4ZDFlNCwKKwkweDAxNDAsIDB4NzA5YiwgMHgwMDFlLCAweDAwMjgsIDB4NzA5YiwgMHgwMDFkLCAweDAwMTAsIDB4NzA5YiwKKwkweDAwMjEsIDB4MDAwNSwgMHgwODBjLCAweDc0MWUsIDB4NjEyNCwgMHhkMWQ0LCAweDExNTAsIDB4ZDFkYywKKwkweDExMjgsIDB4ZDFlNCwgMHgwMTQwLCAweDcwOWIsIDB4MDAxZSwgMHgwMDI4LCAweDcwOWIsIDB4MDAxZCwKKwkweDAwMTAsIDB4NzA5YiwgMHgwMDFmLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweDAwOTAsIDB4MDgwYywKKwkweDJhN2EsIDB4MDAwZSwgMHg2MTI0LCAweGQxZDQsIDB4MTE3OCwgMHhkMWNjLCAweDExNTAsIDB4ZDFkYywKKwkweDExMjgsIDB4ZDFlNCwgMHgwMTU4LCAweDcwOWIsIDB4MDAxZSwgMHgwMDQwLCAweDcwOWIsIDB4MDAxZCwKKwkweDAwMjgsIDB4NzA5YiwgMHgwMDIwLCAweDAwMTAsIDB4NzA5YiwgMHgwMDFmLCAweDAwMDUsIDB4MDAxNiwKKwkweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDAxMjYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksIDB4MDE0MCwKKwkweDIwNzEsIDB4MTgwMCwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg3NTNkLCAweDExZjgsIDB4MjAwMSwKKwkweDE4MGMsIDB4MjAwYywgMHhkMWI0LCAweDAxZDAsIDB4YzFiNCwgMHgyMTAyLCAweDAwMjYsIDB4MjAxMSwKKwkweDAyMDAsIDB4MDgwYywgMHgyYWI0LCAweDAwMmUsIDB4MDgwYywgMHgyYTYwLCAweDYwMjQsIDB4ZDBjYywKKwkweDAxNDgsIDB4MjAwMSwgMHgwMGEwLCAweDA4MGMsIDB4MmE3YSwgMHgwODBjLCAweDc4NDAsIDB4MDgwYywKKwkweDYwOTIsIDB4MDQyOCwgMHg2MDI4LCAweGMwY2QsIDB4NjAyYSwgMHgwNDA4LCAweDA4MGMsIDB4NzU1NywKKwkweDAxNTAsIDB4MDgwYywgMHg3NTRlLCAweDExMzgsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjYwNiwKKwkweDA4MGMsIDB4NzUxMSwgMHgwMGEwLCAweDA4MGMsIDB4NzQxYiwgMHgwMTc4LCAweDIwMDEsIDB4MDAwMSwKKwkweDA4MGMsIDB4MjYwNiwgMHg3MDk4LCAweDkwODYsIDB4MDAxZSwgMHgwMTIwLCAweDcwOTgsIDB4OTA4NiwKKwkweDAwMjIsIDB4MTExOCwgMHg3MDliLCAweDAwMjUsIDB4MDAxMCwgMHg3MDliLCAweDAwMjEsIDB4MDEyZSwKKwkweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwNSwgMHgwMDI2LCAweDIwMTEsIDB4NzNhNiwKKwkweDA4MGMsIDB4ODdkNCwgMHgwMDJlLCAweDAwMTYsIDB4MDAyNiwgMHgyMDA5LCAweDAwNjQsIDB4MjAxMSwKKwkweDczYTYsIDB4MDgwYywgMHg4N2NiLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBmNiwKKwkweDAwMTYsIDB4MDgwYywgMHg5ZWQ0LCAweDIwNzEsIDB4MTgwMCwgMHgwODBjLCAweDczM2YsIDB4MDAxZSwKKwkweDAwZmUsIDB4MDBlZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4MDBkNiwKKwkweDAwZTYsIDB4MDBmNiwgMHgwMTI2LCAweDA4MGMsIDB4OWVkNCwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwKKwkweDAxNDAsIDB4MjA3MSwgMHgxODAwLCAweDIwOTEsIDB4ODAwMCwgMHg2MDI4LCAweGMwOWMsIDB4NjAyYSwKKwkweDA4MGMsIDB4YTkxZSwgMHgyMDExLCAweDAwMDMsIDB4MDgwYywgMHhhMjQzLCAweDIwMTEsIDB4MDAwMiwKKwkweDA4MGMsIDB4YTI0ZCwgMHgwODBjLCAweGExMzgsIDB4MDgwYywgMHg4NzgwLCAweDAwMzYsIDB4OTAxZSwKKwkweDA4MGMsIDB4YTFiOCwgMHgwMDNlLCAweDA4MGMsIDB4YTkzYSwgMHg2MGUzLCAweDAwMDAsIDB4MDgwYywKKwkweGU4ODIsIDB4MDgwYywgMHhlODlkLCAweDIwMDksIDB4MDAwNCwgMHgwODBjLCAweDJhNjYsIDB4MDgwYywKKwkweDI5N2MsIDB4MjAwMSwgMHgxODAwLCAweDIwMDMsIDB4MDAwNCwgMHgyMDExLCAweDAwMDgsIDB4MDgwYywKKwkweDJhYjQsIDB4MjAxMSwgMHg3M2E2LCAweDA4MGMsIDB4ODdkNCwgMHgwODBjLCAweDc1NTcsIDB4MDExOCwKKwkweDkwMDYsIDB4MDgwYywgMHgyYTdhLCAweDA4MGMsIDB4MGJjMywgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywKKwkweDI2MDYsIDB4MDEyZSwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwKKwkweDAwMWUsIDB4MDAwNSwgMHgwMDI2LCAweDAwZTYsIDB4MjAxMSwgMHg3M2IzLCAweDIwNzEsIDB4MWEwMiwKKwkweDcwMWMsIDB4OTIwNiwgMHgxMTE4LCAweDcwMTgsIDB4OTAwNSwgMHgwMTEwLCAweDkwODUsIDB4MDAwMSwKKwkweDAwZWUsIDB4MDAyZSwgMHgwMDA1LCAweDYwMjAsIDB4ZDA5YywgMHgwMDA1LCAweDY4MDAsIDB4OTA4NCwKKwkweGZmZmUsIDB4OTA4NiwgMHgwMGMwLCAweDAxYjgsIDB4MjAwMSwgMHgwMGMwLCAweDA4MGMsIDB4MmE3YSwKKwkweDAxNTYsIDB4MjBhOSwgMHgwMDJkLCAweDFkMDQsIDB4NzQyYiwgMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwKKwkweDc0MmIsIDB4MDE1ZSwgMHgwMGQ2LCAweDIwNjksIDB4MTgwMCwgMHg2ODljLCAweDgwMDEsIDB4MDIyMCwKKwkweDAxMTgsIDB4Njg5ZSwgMHgwMGRlLCAweDAwMDUsIDB4Njg5ZiwgMHgwMDE0LCAweDY4ZWMsIDB4ZDBkYywKKwkweDBkYzgsIDB4NjgwMCwgMHg5MDg2LCAweDAwMDEsIDB4MWRhOCwgMHgwODBjLCAweDg3ZTAsIDB4MGM5MCwKKwkweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4MjA3MSwKKwkweDE4MDAsIDB4MDgwYywgMHg3ODRmLCAweDIwMDEsIDB4MTk2YywgMHgyMDAzLCAweDAwMDAsIDB4OTAwNiwKKwkweDcwOWEsIDB4NjBlMiwgMHg2ODg2LCAweDA4MGMsIDB4MjZkNSwgMHg5MDA2LCAweDA4MGMsIDB4MmE3YSwKKwkweDA4MGMsIDB4NWY0ZCwgMHgwMDI2LCAweDIwMTEsIDB4ZmZmZiwgMHgwODBjLCAweDJhYjQsIDB4MDAyZSwKKwkweDYwMmIsIDB4MTgyYywgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwYzYsIDB4MDBkNiwKKwkweDAwZTYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksIDB4MDE0MCwgMHgyMDcxLCAweDE4MDAsIDB4MjAwMSwKKwkweDE5N2MsIDB4MjAwYywgMHg5MTg2LCAweDAwMDAsIDB4MDE1OCwgMHg5MTg2LCAweDAwMDEsIDB4MDE1OCwKKwkweDkxODYsIDB4MDAwMiwgMHgwMTU4LCAweDkxODYsIDB4MDAwMywgMHgwMTU4LCAweDA4MDQsIDB4NzUwMSwKKwkweDcwOWIsIDB4MDAyMiwgMHgwMDQwLCAweDcwOWIsIDB4MDAyMSwgMHgwMDI4LCAweDcwOWIsIDB4MDAyMywKKwkweDAwMTAsIDB4NzA5YiwgMHgwMDI0LCAweDYwZTMsIDB4MDAwMCwgMHg2ODg3LCAweDAwMDEsIDB4MjAwMSwKKwkweDAwMDEsIDB4MDgwYywgMHgyNmQ1LCAweDA4MGMsIDB4YTkxZSwgMHgwMDI2LCAweDA4MGMsIDB4YWJlOSwKKwkweDAwMmUsIDB4MDgwYywgMHhhOTNhLCAweDcwMDAsIDB4OTA4ZSwgMHgwMDA0LCAweDAxMTgsIDB4NjAyYiwKKwkweDAwMjgsIDB4MDAxMCwgMHg2MDJiLCAweDAwMjAsIDB4MDE1NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDIwYTksIDB4MDAwNSwgMHg2MDI0LCAweGQwYWMsIDB4MDE1MCwgMHgwMTJlLCAweDAxNWUsIDB4MDgwYywKKwkweGQwOWIsIDB4MDExOCwgMHg5MDA2LCAweDA4MGMsIDB4MmFhNCwgMHgwODA0LCAweDc1MGQsIDB4NjgwMCwKKwkweDkwODQsIDB4MDBhMSwgMHhjMGJkLCAweDY4MDIsIDB4MDgwYywgMHgyYTYwLCAweDY5MDQsIDB4ZDFkNCwKKwkweDExNDAsIDB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmE3YSwgMHgxZjA0LCAweDc0YjIsIDB4MDgwYywKKwkweDc1OTQsIDB4MDEyZSwgMHgwMTVlLCAweDA4MGMsIDB4NzU0ZSwgMHgwMTcwLCAweDYwNDQsIDB4OTAwNSwKKwkweDAxMzAsIDB4MDgwYywgMHg3NTk0LCAweDkwMDYsIDB4ODAwMSwgMHgxZGYwLCAweDAwMjgsIDB4NjgwNCwKKwkweGQwZDQsIDB4MTExMCwgMHgwODBjLCAweDc1OTQsIDB4MDgwYywgMHhkMDliLCAweDAxMTgsIDB4OTAwNiwKKwkweDA4MGMsIDB4MmFhNCwgMHgwMDE2LCAweDAwMjYsIDB4NzAwMCwgMHg5MDhlLCAweDAwMDQsIDB4MDEzMCwKKwkweDIwMDksIDB4MDBjOCwgMHgyMDExLCAweDczYjMsIDB4MDgwYywgMHg4NzkyLCAweDAwMmUsIDB4MDAxZSwKKwkweDA4MGMsIDB4ODVjNSwgMHg3MDM0LCAweGMwODUsIDB4NzAzNiwgMHgyMDAxLCAweDE5N2MsIDB4MjAwMywKKwkweDAwMDQsIDB4MDgwYywgMHg3MjA4LCAweDA4MGMsIDB4NzU0ZSwgMHgwMTM4LCAweDY4MDQsIDB4ZDBkNCwKKwkweDExMjAsIDB4ZDBkYywgMHgxMTAwLCAweDA4MGMsIDB4Nzg0NSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwKKwkweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksIDB4MDE0MCwKKwkweDIwNzEsIDB4MTgwMCwgMHgwODBjLCAweDg1ZGMsIDB4MDgwYywgMHg4NWNlLCAweDA4MGMsIDB4Nzg0ZiwKKwkweDIwMDEsIDB4MTk2YywgMHgyMDAzLCAweDAwMDAsIDB4OTAwNiwgMHg3MDlhLCAweDYwZTIsIDB4Njg4NiwKKwkweDA4MGMsIDB4MjZkNSwgMHg5MDA2LCAweDA4MGMsIDB4MmE3YSwgMHg2MDQzLCAweDAwOTAsIDB4NjA0MywKKwkweDAwMTAsIDB4MDAyNiwgMHgyMDExLCAweGZmZmYsIDB4MDgwYywgMHgyYWI0LCAweDAwMmUsIDB4NjAyYiwKKwkweDE4MmMsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4MTk3YiwKKwkweDIwMDQsIDB4OTA4NiwgMHhhYWFhLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDA4MGMsIDB4NTc0MiwKKwkweDkwODQsIDB4MDAzMCwgMHg5MDg2LCAweDAwMDAsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MDgwYywKKwkweDU3NDIsIDB4OTA4NCwgMHgwMDMwLCAweDkwODYsIDB4MDAzMCwgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwKKwkweDA4MGMsIDB4NTc0MiwgMHg5MDg0LCAweDAwMzAsIDB4OTA4NiwgMHgwMDEwLCAweDAwMGUsIDB4MDAwNSwKKwkweDAwMDYsIDB4MDgwYywgMHg1NzQyLCAweDkwODQsIDB4MDAzMCwgMHg5MDg2LCAweDAwMjAsIDB4MDAwZSwKKwkweDAwMDUsIDB4MDAzNiwgMHgwMDE2LCAweDIwMDEsIDB4MTgwYywgMHgyMDA0LCAweDkwOGMsIDB4MDAxMywKKwkweDAxODAsIDB4MDAyMCwgMHgwODBjLCAweDI2ZjUsIDB4OTAwZSwgMHgwMDI4LCAweDA4MGMsIDB4NmFkNSwKKwkweDFkYzgsIDB4MjAwOSwgMHgwMDAyLCAweDIwMTksIDB4MDAyOCwgMHgwODBjLCAweDMyMDUsIDB4OTAwNiwKKwkweDAwMTksIDB4MDAxZSwgMHgwMDNlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE4MGMsIDB4MmUwNCwKKwkweDAxMzAsIDB4MDgwYywgMHhkMDk0LCAweDExMjgsIDB4OTA4NSwgMHgwMDEwLCAweDAwMTAsIDB4OTA4NCwKKwkweGZmZWYsIDB4MjA3MiwgMHgwMGVlLCAweDAwMDUsIDB4NjA1MCwgMHgwMDA2LCAweDYwZWMsIDB4MDAwNiwKKwkweDYwMGMsIDB4MDAwNiwgMHg2MDA0LCAweDAwMDYsIDB4NjAyOCwgMHgwMDA2LCAweDA4MGMsIDB4MmFkNywKKwkweDA4MGMsIDB4MmIwYSwgMHg2MDJmLCAweDAxMDAsIDB4NjAyZiwgMHgwMDAwLCAweDYwMmYsIDB4MDA0MCwKKwkweDYwMmYsIDB4MDAwMCwgMHgyMGE5LCAweDAwMDIsIDB4MDgwYywgMHgyYTQxLCAweDAwMjYsIDB4MjAxMSwKKwkweDAwNDAsIDB4MDgwYywgMHgyYWI0LCAweDAwMmUsIDB4MDAwZSwgMHg2MDJhLCAweDAwMGUsIDB4NjAwNiwKKwkweDAwMGUsIDB4NjAwZSwgMHgwMDBlLCAweDYwZWUsIDB4NjBlMywgMHgwMDAwLCAweDY4ODcsIDB4MDAwMSwKKwkweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI2ZDUsIDB4MjAwMSwgMHgwMGEwLCAweDAwMDYsIDB4MDgwYywKKwkweGQwOWIsIDB4MDAwZSwgMHgwMTMwLCAweDA4MGMsIDB4MmE5OCwgMHg5MDA2LCAweDA4MGMsIDB4MmFhNCwKKwkweDAwMTAsIDB4MDgwYywgMHgyYTdhLCAweDAwMGUsIDB4NjA1MiwgMHg2MDUwLCAweDAwMDYsIDB4YzBlNSwKKwkweDYwNTIsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4MDgwYywgMHgyOWVkLCAweDAwZmUsIDB4MDAwZSwKKwkweDYwNTIsIDB4MDAwNSwgMHgwMTU2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4MDBkNiwKKwkweDAwZTYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksIDB4MDE0MCwgMHgyMDcxLCAweDE4MDAsIDB4MDgwYywKKwkweGE5N2MsIDB4MDE1OCwgMHgyMDAxLCAweDAzODYsIDB4MjAwNCwgMHhkMGI0LCAweDExMzAsIDB4MjAwMSwKKwkweDAwMTYsIDB4MDgwYywgMHhhOTBmLCAweDA4MDQsIDB4NzY3MCwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywKKwkweGMxYzQsIDB4MjEwMiwgMHg2MDI4LCAweDkwODQsIDB4ZTFmZiwgMHg2MDJhLCAweDIwMTEsIDB4MDIwMCwKKwkweDA4MGMsIDB4MmFiNCwgMHgyMDAxLCAweDAwOTAsIDB4MDgwYywgMHgyYTdhLCAweDIwYTksIDB4MDM2NiwKKwkweDYwMjQsIDB4ZDBjYywgMHgxNTU4LCAweDFkMDQsIDB4NzYxMCwgMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwKKwkweDc2MTAsIDB4MDgwYywgMHhhOTFlLCAweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweGEyNDMsIDB4MjAxMSwKKwkweDAwMDIsIDB4MDgwYywgMHhhMjRkLCAweDA4MGMsIDB4YTEzOCwgMHg5MDFlLCAweDA4MGMsIDB4YTFiOCwKKwkweDIwMDEsIDB4MDM4NiwgMHgyMDAzLCAweDcwMDAsIDB4MDgwYywgMHhhOTNhLCAweDIwMDEsIDB4MDBhMCwKKwkweDA4MGMsIDB4MmE3YSwgMHgwODBjLCAweDc4NDAsIDB4MDgwYywgMHg2MDkyLCAweDA4MGMsIDB4ZDA5YiwKKwkweDAxMTAsIDB4MDgwYywgMHgwY2U5LCAweDkwODUsIDB4MDAwMSwgMHgwNGMwLCAweDA4MGMsIDB4MWIzNSwKKwkweDYwZTMsIDB4MDAwMCwgMHgyMDAxLCAweDE5NmMsIDB4MjAwNCwgMHgwODBjLCAweDI2ZDUsIDB4NjBlMiwKKwkweDIwMDEsIDB4MDA4MCwgMHgwODBjLCAweDJhN2EsIDB4MjBhOSwgMHgwMzY2LCAweDIwMTEsIDB4MWUwMCwKKwkweDA4MGMsIDB4MmFiNCwgMHgyMDA5LCAweDFlMDAsIDB4MDgwYywgMHgyYTYwLCAweDYwMjQsIDB4OTEwYywKKwkweDAxNDAsIDB4MWQwNCwgMHg3NjRlLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDc2NGUsIDB4MDgwNCwKKwkweDc2MTksIDB4MjAwMSwgMHgwMzg2LCAweDIwMDMsIDB4NzAwMCwgMHg2MDI4LCAweDkwODUsIDB4MWUwMCwKKwkweDYwMmEsIDB4NzBiNCwgMHg5MDA1LCAweDExMTgsIDB4Njg4NywgMHgwMDAxLCAweDAwMDgsIDB4Njg4NiwKKwkweDA4MGMsIDB4ZDA5YiwgMHgwMTEwLCAweDA4MGMsIDB4MGNlOSwgMHg5MDA2LCAweDAwZWUsIDB4MDBkZSwKKwkweDAwY2UsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDE1ZSwgMHgwMDA1LCAweDAxNTYsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDAzNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzAwMCwgMHg5MDg2LCAweDAwMDMsIDB4MTE2OCwgMHgyMDAxLCAweDAyMGIsIDB4MjAwNCwKKwkweDkwODQsIDB4NTU0MCwgMHg5MDg2LCAweDU1NDAsIDB4MTEyOCwgMHgyMDY5LCAweDFhNzYsIDB4MmQwNCwKKwkweDgwMDAsIDB4MjA2YSwgMHgyMDY5LCAweDAxNDAsIDB4NjAyMCwgMHg5MDg0LCAweDAwYzAsIDB4MDEyMCwKKwkweDY4ODQsIDB4OTAwNSwgMHgxOTA0LCAweDc2ZTcsIDB4MjAwMSwgMHgwMDg4LCAweDA4MGMsIDB4MmE3YSwKKwkweDkwMDYsIDB4NjBlMiwgMHg2ODg2LCAweDA4MGMsIDB4MjZkNSwgMHgyMDY5LCAweDAyMDAsIDB4NjgwNCwKKwkweDkwMDUsIDB4MTExOCwgMHg2ODA4LCAweDkwMDUsIDB4MDFkMCwgMHg2MDI4LCAweDkwODQsIDB4ZmJmZiwKKwkweDYwMmEsIDB4MjAxMSwgMHgwNDAwLCAweDA4MGMsIDB4MmFiNCwgMHgyMDY5LCAweDE5OGUsIDB4NzAwMCwKKwkweDIwNmEsIDB4NzA5YiwgMHgwMDI2LCAweDcwMDMsIDB4MDAwMSwgMHgyMGE5LCAweDAwMDIsIDB4MWQwNCwKKwkweDc2YzcsIDB4MjA5MSwgMHg2MDAwLCAweDFmMDQsIDB4NzZjNywgMHgwODA0LCAweDc3MTksIDB4MjA2OSwKKwkweDAxNDAsIDB4MjBhOSwgMHgwMzg0LCAweDIwMTEsIDB4MWUwMCwgMHgwODBjLCAweDJhYjQsIDB4MjAwOSwKKwkweDFlMDAsIDB4MDgwYywgMHgyYTYwLCAweDYwMjQsIDB4OTEwYywgMHgwNTI4LCAweDkwODQsIDB4MWEwMCwKKwkweDE1MTAsIDB4MWQwNCwgMHg3NmQzLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDc2ZDMsIDB4MDgwYywKKwkweGE5MWUsIDB4MjAxMSwgMHgwMDAzLCAweDA4MGMsIDB4YTI0MywgMHgyMDExLCAweDAwMDIsIDB4MDgwYywKKwkweGEyNGQsIDB4MDgwYywgMHhhMTM4LCAweDkwMWUsIDB4MDgwYywgMHhhMWI4LCAweDA4MGMsIDB4YTkzYSwKKwkweDIwMDEsIDB4MDBhMCwgMHgwODBjLCAweDJhN2EsIDB4MDgwYywgMHg3ODQwLCAweDA4MGMsIDB4NjA5MiwKKwkweDkwODUsIDB4MDAwMSwgMHgwMGIwLCAweDIwMDEsIDB4MDA4MCwgMHgwODBjLCAweDJhN2EsIDB4MjA2OSwKKwkweDAxNDAsIDB4NjBlMywgMHgwMDAwLCAweDcwYjQsIDB4OTAwNSwgMHgxMTE4LCAweDY4ODcsIDB4MDAwMSwKKwkweDAwMDgsIDB4Njg4NiwgMHgyMDAxLCAweDE5NmMsIDB4MjAwNCwgMHgwODBjLCAweDI2ZDUsIDB4NjBlMiwKKwkweDkwMDYsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDE1ZSwKKwkweDAwMDUsIDB4MDE1NiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwKKwkweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweDE4MDAsIDB4NjAyMCwgMHg5MDg0LCAweDAwYzAsIDB4MDFlOCwKKwkweDA4MGMsIDB4YTkxZSwgMHgyMDExLCAweDAwMDMsIDB4MDgwYywgMHhhMjQzLCAweDIwMTEsIDB4MDAwMiwKKwkweDA4MGMsIDB4YTI0ZCwgMHgwODBjLCAweGExMzgsIDB4OTAxZSwgMHgwODBjLCAweGExYjgsIDB4MDgwYywKKwkweGE5M2EsIDB4MjA2OSwgMHgwMTQwLCAweDIwMDEsIDB4MDBhMCwgMHgwODBjLCAweDJhN2EsIDB4MDgwYywKKwkweDc4NDAsIDB4MDgwYywgMHg2MDkyLCAweDA4MDQsIDB4NzdiYywgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywKKwkweGQxYjQsIDB4MTE2MCwgMHhjMWI1LCAweDIxMDIsIDB4MDgwYywgMHg3MzliLCAweDIwNjksIDB4MDE0MCwKKwkweDIwMDEsIDB4MDA4MCwgMHgwODBjLCAweDJhN2EsIDB4NjBlMywgMHgwMDAwLCAweDIwNjksIDB4MDIwMCwKKwkweDY4MDQsIDB4OTAwNSwgMHgxMTE4LCAweDY4MDgsIDB4OTAwNSwgMHgwMTkwLCAweDYwMjgsIDB4OTA4NCwKKwkweGZkZmYsIDB4NjAyYSwgMHgyMDExLCAweDAyMDAsIDB4MDgwYywgMHgyYWI0LCAweDIwNjksIDB4MTk4ZSwKKwkweDcwMDAsIDB4MjA2YSwgMHg3MDliLCAweDAwMjcsIDB4NzAwMywgMHgwMDAxLCAweDA4MDQsIDB4NzdiYywKKwkweDIwMTEsIDB4MWUwMCwgMHgwODBjLCAweDJhYjQsIDB4MjAwOSwgMHgxZTAwLCAweDA4MGMsIDB4MmE2MCwKKwkweDYwMjQsIDB4OTEwYywgMHgwMWM4LCAweDkwODQsIDB4MWMwMCwgMHgxMWIwLCAweDFkMDQsIDB4Nzc3OCwKKwkweDAwMDYsIDB4MDAxNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwODBjLCAweDg2MWMsIDB4MDBlZSwKKwkweDAwZGUsIDB4MDBjZSwgMHgwMDFlLCAweDAwMGUsIDB4MDBlNiwgMHgyMDcxLCAweDFhMDIsIDB4NzA3MCwKKwkweDAwZWUsIDB4OTAwNSwgMHgxOWU4LCAweDA0MDAsIDB4MDAyNiwgMHgyMDExLCAweDczYjMsIDB4MDgwYywKKwkweDg2YzgsIDB4MjAxMSwgMHg3M2E2LCAweDA4MGMsIDB4ODdkNCwgMHgwMDJlLCAweDIwNjksIDB4MDE0MCwKKwkweDYwZTMsIDB4MDAwMCwgMHg3MGI0LCAweDkwMDUsIDB4MTExOCwgMHg2ODg3LCAweDAwMDEsIDB4MDAwOCwKKwkweDY4ODYsIDB4MjAwMSwgMHgxOTZjLCAweDIwMDQsIDB4MDgwYywgMHgyNmQ1LCAweDYwZTIsIDB4MjAwMSwKKwkweDE4MGMsIDB4MjAwYywgMHhjMWI0LCAweDIxMDIsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAzZSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMTVlLCAweDAwMDUsIDB4MDE1NiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwKKwkweDAwNDYsIDB4MDBjNiwgMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweDE4MDAsIDB4MDgwYywKKwkweGQwOTQsIDB4MTkwNCwgMHg3ODJhLCAweDcxMzAsIDB4ZDE4NCwgMHgxMTcwLCAweDA4MGMsIDB4MzNhZCwKKwkweDAxMzgsIDB4YzE4ZCwgMHg3MTMyLCAweDIwMTEsIDB4MTg0OCwgMHgyMjE0LCAweGQyYWMsIDB4MTEyMCwKKwkweDcwMzAsIDB4ZDA4YywgMHgwOTA0LCAweDc4MmEsIDB4MjAxMSwgMHgxODQ4LCAweDIyMGMsIDB4ZDFhNCwKKwkweDA1MzgsIDB4MDAxNiwgMHgyMDE5LCAweDAwMGUsIDB4MDgwYywgMHhlM2I1LCAweDAxNTYsIDB4MDBiNiwKKwkweDIwYTksIDB4MDA3ZiwgMHg5MDBlLCAweDkxODYsIDB4MDA3ZSwgMHgwMWEwLCAweDkxODYsIDB4MDA4MCwKKwkweDAxODgsIDB4MDgwYywgMHg2NjkzLCAweDExNzAsIDB4MjEyMCwgMHg5MDA2LCAweDAwMTYsIDB4MjAwOSwKKwkweDAwMGUsIDB4MDgwYywgMHhlNDQ1LCAweDIwMDksIDB4MDAwMSwgMHgyMDExLCAweDAxMDAsIDB4MDgwYywKKwkweDg5NzksIDB4MDAxZSwgMHg4MTA4LCAweDFmMDQsIDB4NzdmMywgMHgwMGJlLCAweDAxNWUsIDB4MDAxZSwKKwkweGQxYWMsIDB4MTE0OCwgMHgwMDE2LCAweDIwMDksIDB4MDAwMiwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywKKwkweDMyMDUsIDB4MDAxZSwgMHgwMDc4LCAweDAxNTYsIDB4MDBiNiwgMHgyMGE5LCAweDAwN2YsIDB4OTAwZSwKKwkweDA4MGMsIDB4NjY5MywgMHgxMTEwLCAweDA4MGMsIDB4NjBhYywgMHg4MTA4LCAweDFmMDQsIDB4NzgyMCwKKwkweDAwYmUsIDB4MDE1ZSwgMHgwODBjLCAweDFiMzUsIDB4MDgwYywgMHhhOTFlLCAweDA4MGMsIDB4YWJlOSwKKwkweDA4MGMsIDB4YTkzYSwgMHg2MGUzLCAweDAwMDAsIDB4MDgwYywgMHg2MDkyLCAweDA4MGMsIDB4NzQ2ZSwKKwkweDAwZWUsIDB4MDBjZSwgMHgwMDRlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAxNWUsIDB4MDAwNSwKKwkweDIwMDEsIDB4MTk3YywgMHgyMDAzLCAweDAwMDEsIDB4MDAwNSwgMHgyMDAxLCAweDE5N2MsIDB4MjAwMywKKwkweDAwMDAsIDB4MDAwNSwgMHgyMDAxLCAweDE5N2IsIDB4MjAwMywgMHhhYWFhLCAweDAwMDUsIDB4MjAwMSwKKwkweDE5N2IsIDB4MjAwMywgMHgwMDAwLCAweDAwMDUsIDB4MjA3MSwgMHgxOGZhLCAweDcwMDMsIDB4MDAwMCwKKwkweDcwMDcsIDB4MDAwMCwgMHgwODBjLCAweDEwNjAsIDB4MDkwYywgMHgwZDdkLCAweGE4YWIsIDB4ZGNiMCwKKwkweDI5MDAsIDB4NzA0ZSwgMHgwODBjLCAweDEwNjAsIDB4MDkwYywgMHgwZDdkLCAweGE4YWIsIDB4ZGNiMCwKKwkweDI5MDAsIDB4NzA1MiwgMHhhODY3LCAweDAwMDAsIDB4YTg2YiwgMHgwMDAxLCAweGE4OWYsIDB4MDAwMCwKKwkweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDAwNDAsIDB4Njg0OCwgMHg5MDA1LCAweDExMTgsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDRiMCwgMHg2ODQwLCAweDkwMDUsIDB4MDE1MCwgMHgwNGExLCAweDZhNTAsIDB4OTIwMCwKKwkweDcwMDIsIDB4Njg1NCwgMHg5MTAxLCAweDcwMDYsIDB4OTAwNiwgMHg3MDEyLCAweDcwMTYsIDB4Njg1MCwKKwkweDcwMDIsIDB4Njg1NCwgMHg3MDA2LCAweDY4NTgsIDB4NzAwYSwgMHg2ODVjLCAweDcwMGUsIDB4Njg0MCwKKwkweDkwMDUsIDB4MTExMCwgMHg3MDEyLCAweDcwMTYsIDB4Njg0OCwgMHg3MDFhLCAweDcwMWMsIDB4OTA4NSwKKwkweDAwNDAsIDB4NzAxZSwgMHgyMDAxLCAweDAwMTksIDB4NzAzNiwgMHg3MDJiLCAweDAwMDEsIDB4MjAwMSwKKwkweDAwMDQsIDB4MjAwYywgMHg5MThjLCAweGZmZjcsIDB4OTE4ZCwgMHg4MDAwLCAweDIxMDIsIDB4MDBkNiwKKwkweDIwNjksIDB4MThmYSwgMHg2ODA3LCAweDAwMDEsIDB4MDBkZSwgMHgwODBjLCAweDdlMzgsIDB4OTAwNiwKKwkweDAwZWUsIDB4MDAwNSwgMHg5MDBlLCAweDAxNTYsIDB4MjBhOSwgMHgwMDA2LCAweDgwMDMsIDB4ODE4ZCwKKwkweDFmMDQsIDB4NzhiNiwgMHgwMTVlLCAweDAwMDUsIDB4MjA3OSwgMHgwMDQwLCAweDIwNzEsIDB4MThmYSwKKwkweDcwMDQsIDB4MDAwMiwgMHg3OGNjLCAweDc4Y2QsIDB4NzkxOSwgMHg3OTc0LCAweDdhODQsIDB4NzhjYSwKKwkweDc4Y2EsIDB4N2FhZSwgMHgwODBjLCAweDBkN2QsIDB4MDAwNSwgMHgyMDc5LCAweDAwNDAsIDB4MjAwMSwKKwkweDFkYzAsIDB4MjAwMywgMHgwMDAwLCAweDc4MmMsIDB4OTA4YywgMHgwNzgwLCAweDE5MGMsIDB4N2YxYSwKKwkweGQwYTQsIDB4MDU3OCwgMHgyMDAxLCAweDFkYzAsIDB4MjAwNCwgMHg5MDgyLCAweDAwODAsIDB4MTY0OCwKKwkweDFkMDQsIDB4NzhlYSwgMHgyMDAxLCAweDFhMDUsIDB4MjAwYywgMHg4MTA5LCAweDA1MTAsIDB4MjA5MSwKKwkweDYwMDAsIDB4MjEwMiwgMHg3ODI0LCAweDIwNDgsIDB4OTAwNiwgMHhhODAyLCAweGE4MDYsIDB4YTg2NCwKKwkweDkwODQsIDB4MDBmZiwgMHg5MDhhLCAweDAwNDAsIDB4MDYxMCwgMHgwMGMwLCAweDIwMDEsIDB4MTgwMCwKKwkweDIwMGMsIDB4OTE4NiwgMHgwMDAzLCAweDExNjgsIDB4NzAwNCwgMHgwMDAyLCAweDc5MDksIDB4NzhkMywKKwkweDc5MDksIDB4NzkwNywgMHg3OTA5LCAweDc5MDksIDB4NzkwOSwgMHg3OTA5LCAweDc5MDksIDB4MDgwYywKKwkweDc5NzQsIDB4NzgyYywgMHhkMDljLCAweDA5MGMsIDB4N2UzOCwgMHgwMDA1LCAweDkwODIsIDB4MDA1YSwKKwkweDEyMTgsIDB4MjEwMCwgMHgwMDNiLCAweDBjMTAsIDB4MDgwYywgMHg3OWFhLCAweDBjOTAsIDB4MDBlMywKKwkweDA4ZTgsIDB4MDAwNSwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwKKwkweDc5YWEsIDB4NzlhYSwgMHg3OWNjLCAweDc5YWEsIDB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwKKwkweDc5YWEsIDB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwKKwkweDc5YWEsIDB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwgMHg3OWFhLCAweDc5YjYsIDB4NzlhYSwKKwkweDdiOWYsIDB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzljYywgMHg3OWFhLCAweDc5YjYsIDB4N2JlMCwKKwkweDdjMjEsIDB4N2M2OCwgMHg3YzdjLCAweDc5YWEsIDB4NzlhYSwgMHg3OWNjLCAweDc5YjYsIDB4NzllMCwKKwkweDc5YWEsIDB4N2E1OCwgMHg3ZDI3LCAweDdkNDIsIDB4NzlhYSwgMHg3OWNjLCAweDc5YWEsIDB4NzllMCwKKwkweDc5YWEsIDB4NzlhYSwgMHg3YTRlLCAweDdkNDIsIDB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwKKwkweDc5YWEsIDB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwgMHg3OWY0LCAweDc5YWEsIDB4NzlhYSwKKwkweDc5YWEsIDB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4N2ViZSwKKwkweDc5YWEsIDB4N2U2OCwgMHg3OWFhLCAweDdlNjgsIDB4NzlhYSwgMHg3YTA5LCAweDc5YWEsIDB4NzlhYSwKKwkweDc5YWEsIDB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4MjA3OSwgMHgwMDQwLCAweDcwMDQsIDB4OTA4NiwKKwkweDAwMDMsIDB4MTE5OCwgMHg3ODJjLCAweDA4MGMsIDB4N2U2MSwgMHhkMGE0LCAweDAxNzAsIDB4NzgyNCwKKwkweDIwNDgsIDB4OTAwNiwgMHhhODAyLCAweGE4MDYsIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4YSwKKwkweDAwMWEsIDB4MTIxMCwgMHgwMDJiLCAweDBjNTAsIDB4MDBlOSwgMHgwODBjLCAweDdlMzgsIDB4MDAwNSwKKwkweDc5YWEsIDB4NzliNiwgMHg3YjhiLCAweDc5YWEsIDB4NzliNiwgMHg3OWFhLCAweDc5YjYsIDB4NzliNiwKKwkweDc5YWEsIDB4NzliNiwgMHg3YjhiLCAweDc5YjYsIDB4NzliNiwgMHg3OWI2LCAweDc5YjYsIDB4NzliNiwKKwkweDc5YWEsIDB4NzliNiwgMHg3YjhiLCAweDc5YWEsIDB4NzlhYSwgMHg3OWI2LCAweDc5YWEsIDB4NzlhYSwKKwkweDc5YWEsIDB4NzliNiwgMHgwMGU2LCAweDIwNzEsIDB4MThmYSwgMHgyMDA5LCAweDA0MDAsIDB4MDA3MSwKKwkweDAwZWUsIDB4MDAwNSwgMHgyMDA5LCAweDEwMDAsIDB4MDA0OSwgMHgwMDA1LCAweDIwMDksIDB4MjAwMCwKKwkweDAwMjksIDB4MDAwNSwgMHgyMDA5LCAweDA4MDAsIDB4MDAwOSwgMHgwMDA1LCAweDcwMDcsIDB4MDAwMSwKKwkweGE4NjgsIDB4OTA4NCwgMHgwMGZmLCAweDkxMDUsIDB4YTg2YSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4NmRlZSwgMHgwMTJlLCAweDAwMDUsIDB4YTg2NCwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwKKwkweDBkMDgsIDB4ODAwMSwgMHgxMTIwLCAweDcwMDcsIDB4MDAwMSwgMHgwODA0LCAweDdiMmQsIDB4NzAwNywKKwkweDAwMDMsIDB4NzAxMiwgMHgyOTAwLCAweDcwMTYsIDB4NzAxYSwgMHg3MDRiLCAweDdiMmQsIDB4MDAwNSwKKwkweGE4NjQsIDB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4MDk2OCwgMHg4MDAxLCAweDExMjAsIDB4NzAwNywKKwkweDAwMDEsIDB4MDgwNCwgMHg3YjQ4LCAweDcwMDcsIDB4MDAwMywgMHg3MDEyLCAweDI5MDAsIDB4NzAxNiwKKwkweDcwMWEsIDB4NzA0YiwgMHg3YjQ4LCAweDAwMDUsIDB4YTg2NCwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwKKwkweDA5MDQsIDB4NzliMiwgMHg4MDAxLCAweDExMjAsIDB4NzAwNywgMHgwMDAxLCAweDA4MDQsIDB4N2I2NCwKKwkweDcwMDcsIDB4MDAwMywgMHg3MDEyLCAweDI5MDAsIDB4NzAxNiwgMHg3MDFhLCAweDcwNGIsIDB4N2I2NCwKKwkweDAwMDUsIDB4YTg2NCwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDEsIDB4MTkwNCwKKwkweDc5YjIsIDB4NzAwNywgMHgwMDAxLCAweDIwMDksIDB4MTgzNCwgMHgyMTBjLCAweDgxZmYsIDB4MTFhOCwKKwkweGE4NjgsIDB4OTA4NCwgMHgwMGZmLCAweGE4NmEsIDB4YTg4MywgMHgwMDAwLCAweDA4MGMsIDB4NjMyNSwKKwkweDExMDgsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhhODY3LCAweDAxMzksIDB4YTg3YSwKKwkweGE5ODIsIDB4MDgwYywgMHg2ZGVlLCAweDAxMmUsIDB4MGNhMCwgMHhhOTk0LCAweDkxODYsIDB4MDA3MSwKKwkweDBkMzgsIDB4OTE4NiwgMHgwMDY0LCAweDBkMjAsIDB4OTE4NiwgMHgwMDdjLCAweDBkMDgsIDB4OTE4NiwKKwkweDAwMjgsIDB4MDlmMCwgMHg5MTg2LCAweDAwMzgsIDB4MDlkOCwgMHg5MTg2LCAweDAwNzgsIDB4MDljMCwKKwkweDkxODYsIDB4MDA1ZiwgMHgwOWE4LCAweDkxODYsIDB4MDA1NiwgMHgwOTkwLCAweGE4OTcsIDB4NDAwNSwKKwkweGE4OWIsIDB4MDAwMSwgMHgyMDAxLCAweDAwMzAsIDB4OTAwZSwgMHgwOGEwLCAweGE4N2MsIDB4OTA4NCwKKwkweDAwYzAsIDB4OTA4NiwgMHgwMGMwLCAweDExMjAsIDB4NzAwNywgMHgwMDAxLCAweDA4MDQsIDB4N2Q1OSwKKwkweDI5MDAsIDB4NzAxNiwgMHg3MDFhLCAweDIwYTksIDB4MDAwNCwgMHhhODYwLCAweDIwZTAsIDB4YTg1YywKKwkweDkwODAsIDB4MDAzMCwgMHgyMDk4LCAweDcwNTAsIDB4MjA0MCwgMHhhMDYwLCAweDIwZTgsIDB4YTA1YywKKwkweDkwODAsIDB4MDAyMywgMHgyMGEwLCAweDQwMDMsIDB4YTg4OCwgMHg3MDEyLCAweDkwODIsIDB4MDQwMSwKKwkweDFhMDQsIDB4NzliYSwgMHhhYWI0LCAweDkyOGEsIDB4MDAwMiwgMHgxYTA0LCAweDc5YmEsIDB4ODJmZiwKKwkweDExMzgsIDB4YThiOCwgMHhhOWJjLCAweDkxMDUsIDB4MDExOCwgMHgyMDAxLCAweDdhZWIsIDB4MDAxOCwKKwkweDkyODAsIDB4N2FlMSwgMHgyMDA1LCAweDcwNTYsIDB4NzAxMCwgMHg5MDE1LCAweDA5MDQsIDB4N2FjYywKKwkweDA4MGMsIDB4MTA2MCwgMHgxMTE4LCAweDcwMDcsIDB4MDAwNCwgMHgwMDA1LCAweDI5MDAsIDB4NzAyMiwKKwkweDcwNTQsIDB4MjA2MCwgMHhlMDAwLCAweGE4NjYsIDB4NzA1MCwgMHgyMDQwLCAweGE5NWMsIDB4ZTAwNCwKKwkweDkxMDAsIDB4YTA3NiwgMHhhODYwLCAweGEwNzIsIDB4ZTAwOCwgMHg5MjBhLCAweDEyMTAsIDB4OTAwZSwKKwkweDIyMDAsIDB4NzExMiwgMHhlMjBjLCAweDgwMDMsIDB4ODAwYiwgMHg5Mjk2LCAweDAwMDQsIDB4MDEwOCwKKwkweDkxMDgsIDB4YTE3YSwgMHg4MTBiLCAweGExN2UsIDB4MDgwYywgMHgxMTNjLCAweGEwNmMsIDB4OTA4ZSwKKwkweDAxMDAsIDB4MDE3MCwgMHg5MDg2LCAweDAyMDAsIDB4MDExOCwgMHg3MDA3LCAweDAwMDcsIDB4MDAwNSwKKwkweDcwMjAsIDB4MjA0OCwgMHgwODBjLCAweDEwNzksIDB4NzAxNCwgMHgyMDQ4LCAweDA4MDQsIDB4NzliYSwKKwkweDcwMjAsIDB4MjA0OCwgMHg3MDE4LCAweGE4MDIsIDB4YTgwNywgMHgwMDAwLCAweDI5MDgsIDB4MjA0OCwKKwkweGE5MDYsIDB4NzExYSwgMHgwODA0LCAweDdhODQsIDB4NzAxNCwgMHgyMDQ4LCAweDcwMDcsIDB4MDAwMSwKKwkweGE4YjQsIDB4OTAwNSwgMHgxMTI4LCAweGE4YjgsIDB4YTliYywgMHg5MTA1LCAweDAxMDgsIDB4MDBiOSwKKwkweGE4NjQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAxZSwgMHgwOTA0LCAweDdkNTksIDB4MDgwNCwKKwkweDdiMmQsIDB4N2FlMywgMHg3YWU3LCAweDAwMDIsIDB4MDAxZCwgMHgwMDA3LCAweDAwMDQsIDB4MDAwYSwKKwkweDAwMWIsIDB4MDAwNSwgMHgwMDA2LCAweDAwMGEsIDB4MDAxZCwgMHgwMDA1LCAweDAwMDQsIDB4MDA3NiwKKwkweDAwNjYsIDB4YWZiOCwgMHhhZWJjLCAweGE4MDQsIDB4MjA1MCwgMHhiMGMwLCAweGIwZTIsIDB4YjBiYywKKwkweGIwZGUsIDB4YjBiOCwgMHhiMGQyLCAweGIwYjQsIDB4YjBjZSwgMHhiNmRhLCAweGI3ZDYsIDB4YjBiMCwKKwkweGIwY2EsIDB4YjBhYywgMHhiMGM2LCAweGIwYTgsIDB4YjBiYSwgMHhiMGE0LCAweGIwYjYsIDB4YjZjMiwKKwkweGI3YmUsIDB4YjBhMCwgMHhiMGIyLCAweGIwOWMsIDB4YjBhZSwgMHhiMDk4LCAweGIwYTIsIDB4YjA5NCwKKwkweGIwOWUsIDB4YjZhYSwgMHhiN2E2LCAweGIwOTAsIDB4YjA5YSwgMHhiMDhjLCAweGIwOTYsIDB4YjA4OCwKKwkweGIwOGEsIDB4YjA4NCwgMHhiMDg2LCAweGI2OTIsIDB4Yjc4ZSwgMHhiMDgwLCAweGIwODIsIDB4YjA3YywKKwkweGIwN2UsIDB4YjA3OCwgMHhiMDcyLCAweGIwNzQsIDB4YjA2ZSwgMHhiNjdhLCAweGI3NzYsIDB4YjAwNCwKKwkweDkwNTUsIDB4MTk1OCwgMHgwMDZlLCAweDAwN2UsIDB4MDAwNSwgMHgyMDA5LCAweDE4MzQsIDB4MjEwYywKKwkweDgxZmYsIDB4MTE3OCwgMHgwODBjLCAweDYxMjQsIDB4MTEwOCwgMHgwMDA1LCAweDA4MGMsIDB4NzAyMiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4Y2M3ZiwgMHgwODBjLCAweDZkZWUsIDB4MDEyZSwKKwkweDBjYTAsIDB4MDgwYywgMHhkMDk0LCAweDFkNzAsIDB4MjAwMSwgMHgwMDI4LCAweDkwMGUsIDB4MGM3MCwKKwkweDIwMDksIDB4MTgzNCwgMHgyMTBjLCAweDgxZmYsIDB4MTE4OCwgMHhhODg4LCAweDkwMDUsIDB4MDE4OCwKKwkweGE4ODMsIDB4MDAwMCwgMHgwODBjLCAweDYxYjIsIDB4MTEwOCwgMHgwMDA1LCAweGE4N2EsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDZkZWUsIDB4MDEyZSwgMHgwY2I4LCAweDIwMDEsIDB4MDAyOCwKKwkweDBjYTgsIDB4MjAwMSwgMHgwMDAwLCAweDBjOTAsIDB4MjAwOSwgMHgxODM0LCAweDIxMGMsIDB4ODFmZiwKKwkweDExZDgsIDB4YTg4OCwgMHg5MDA1LCAweDAxZTAsIDB4YTg4MywgMHgwMDAwLCAweGE4N2MsIDB4ZDBmNCwKKwkweDAxMjAsIDB4MDgwYywgMHg2Mjg3LCAweDExMzgsIDB4MDAwNSwgMHg5MDA2LCAweGE4N2EsIDB4MDgwYywKKwkweDYxZmYsIDB4MTEwOCwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGE4N2EsIDB4YTk4MiwKKwkweDA4MGMsIDB4NmRlZSwgMHgwMTJlLCAweDBjYjAsIDB4MjAwMSwgMHgwMDI4LCAweDkwMGUsIDB4MGM5OCwKKwkweDIwMDEsIDB4MDAwMCwgMHgwYzgwLCAweDcwMTgsIDB4YTgwMiwgMHgyOTA4LCAweDIwNDgsIDB4YTkwNiwKKwkweDcxMWEsIDB4NzAxMCwgMHg4MDAxLCAweDcwMTIsIDB4MDExOCwgMHg3MDA3LCAweDAwMDMsIDB4MDAzMCwKKwkweDcwMTQsIDB4MjA0OCwgMHg3MDA3LCAweDAwMDEsIDB4NzA0OCwgMHgwODBmLCAweDAwMDUsIDB4MDBiNiwKKwkweDcwMDcsIDB4MDAwMSwgMHhhOTc0LCAweGE4NzgsIDB4OTA4NCwgMHgwMGZmLCAweDkwOTYsIDB4MDAwNCwKKwkweDA1NDAsIDB4MjBhOSwgMHgwMDAxLCAweDkwOTYsIDB4MDAwMSwgMHgwMTkwLCAweDkwMGUsIDB4MjBhOSwKKwkweDA4MDAsIDB4OTA5NiwgMHgwMDAyLCAweDAxNjAsIDB4OTAwNSwgMHgxMWQ4LCAweGE5NzQsIDB4MDgwYywKKwkweDY2OTMsIDB4MTFiOCwgMHgwMDY2LCAweGFlODAsIDB4MDgwYywgMHg2N2EzLCAweDAwNmUsIDB4MDA4OCwKKwkweDAwNDYsIDB4MjAxMSwgMHgxODBjLCAweDIyMjQsIDB4YzQ4NCwgMHgyNDEyLCAweDAwNGUsIDB4MDBjNiwKKwkweDA4MGMsIDB4NjY5MywgMHgxMTEwLCAweDA4MGMsIDB4Njk3NiwgMHg4MTA4LCAweDFmMDQsIDB4N2JjOCwKKwkweDAwY2UsIDB4YTg3YywgMHhkMDg0LCAweDExMjAsIDB4MDgwYywgMHgxMDc5LCAweDAwYmUsIDB4MDAwNSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NmRlZSwgMHgwMTJlLCAweDAwYmUsIDB4MDAwNSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwMDcsIDB4MDAwMSwgMHgwODBjLCAweDZhZDksIDB4MDU4MCwKKwkweDIwNjEsIDB4MWE2ZSwgMHg2MTAwLCAweGQxODQsIDB4MDE3OCwgMHhhODg4LCAweDkwODQsIDB4MDBmZiwKKwkweDE1NTAsIDB4NjAwMCwgMHhkMDg0LCAweDA1MjAsIDB4NjAwNCwgMHg5MDA1LCAweDE1MzgsIDB4NjAwMywKKwkweDAwMDAsIDB4NjAwYiwgMHgwMDAwLCAweDAwYzgsIDB4MjAxMSwgMHgwMDAxLCAweGE4OTAsIDB4OTAwNSwKKwkweDExMTAsIDB4MjAwMSwgMHgwMDFlLCAweDgwMDAsIDB4NjAxNiwgMHhhODg4LCAweDkwODQsIDB4MDBmZiwKKwkweDAxNzgsIDB4NjAwNiwgMHhhODg4LCAweDgwMDcsIDB4OTA4NCwgMHgwMGZmLCAweDAxNDgsIDB4NjAwYSwKKwkweGE4ODgsIDB4ODAwMCwgMHgxMTA4LCAweGMyOGQsIDB4NjIwMiwgMHgwMTJlLCAweDA4MDQsIDB4N2UyMiwKKwkweDAxMmUsIDB4MDgwNCwgMHg3ZTFjLCAweDAxMmUsIDB4MDgwNCwgMHg3ZTE2LCAweDAxMmUsIDB4MDgwNCwKKwkweDdlMTksIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweDA4MGMsIDB4NmFkOSwKKwkweDA1ZTAsIDB4MjA2MSwgMHgxYTZlLCAweDYwMDAsIDB4ZDA4NCwgMHgwNWI4LCAweDYyMDQsIDB4NjMwOCwKKwkweGQwOGMsIDB4MTUzMCwgMHhhYzc4LCAweDk0ODQsIDB4MDAwMywgMHgwMTcwLCAweGE5ODgsIDB4OTE4YywKKwkweDAwZmYsIDB4ODAwMSwgMHgxMTIwLCAweDIxMDAsIDB4OTIxMCwgMHgwNjIwLCAweDAwMjgsIDB4ODAwMSwKKwkweDE1MDgsIDB4MjEwMCwgMHg5MjEyLCAweDAyZjAsIDB4OTQ4NCwgMHgwMDBjLCAweDAxODgsIDB4YTk4OCwKKwkweDgxMGYsIDB4OTE4YywgMHgwMGZmLCAweDkwODIsIDB4MDAwNCwgMHgxMTIwLCAweDIxMDAsIDB4OTMxOCwKKwkweDAyODgsIDB4MDAzMCwgMHg5MDgyLCAweDAwMDQsIDB4MTE2OCwgMHgyMTAwLCAweDkzMWEsIDB4MDI1MCwKKwkweGE4OTAsIDB4OTAwNSwgMHgwMTEwLCAweDgwMDAsIDB4NjAxNiwgMHg2MjA2LCAweDYzMGEsIDB4MDEyZSwKKwkweDA4MDQsIDB4N2UyMiwgMHgwMTJlLCAweDA4MDQsIDB4N2UxZiwgMHgwMTJlLCAweDA4MDQsIDB4N2UxYywKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwMDcsIDB4MDAwMSwgMHgyMDYxLCAweDFhNmUsIDB4NjMwMCwKKwkweGQzOGMsIDB4MTEyMCwgMHg2MzA4LCAweDgzMTgsIDB4MDIyMCwgMHg2MzBhLCAweDAxMmUsIDB4MDgwNCwKKwkweDdlMzAsIDB4MDEyZSwgMHgwODA0LCAweDdlMWYsIDB4MDBiNiwgMHgwMTI2LCAweDAwYzYsIDB4MjA5MSwKKwkweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweGE4N2MsIDB4ZDBhYywgMHgwMTQ4LCAweDAwYzYsIDB4MjA2MSwKKwkweDFhNmUsIDB4NjAwMCwgMHg5MDg0LCAweGZjZmYsIDB4NjAwMiwgMHgwMGNlLCAweDA0NDAsIDB4YTg4OCwKKwkweDkwMDUsIDB4MDVkOCwgMHhhODhjLCAweDkwNjUsIDB4MDU5OCwgMHgyMDAxLCAweDE4MzQsIDB4MjAwNCwKKwkweDkwMDUsIDB4MDExOCwgMHgwODBjLCAweGFjZWIsIDB4MDA2OCwgMHg2MDE3LCAweGY0MDAsIDB4NjA2MywKKwkweDAwMDAsIDB4YTk3YywgMHhkMWE0LCAweDAxMTAsIDB4YTk4MCwgMHg2MTYyLCAweDIwMDksIDB4MDA0MSwKKwkweDA4MGMsIDB4YWQ0ZCwgMHhhOTg4LCAweDkxOGMsIDB4ZmYwMCwgMHg5MTg2LCAweDIwMDAsIDB4MTEzOCwKKwkweDAwMjYsIDB4OTAwZSwgMHgyMDExLCAweGZkZmYsIDB4MDgwYywgMHg4OTc5LCAweDAwMmUsIDB4YTg3YywKKwkweGQwYzQsIDB4MDE0OCwgMHgyMDYxLCAweDFhNmUsIDB4NjAwMCwgMHhkMDhjLCAweDExMjAsIDB4NjAwOCwKKwkweDgwMDAsIDB4MDIwOCwgMHg2MDBhLCAweDAwY2UsIDB4MDEyZSwgMHgwMGJlLCAweDA4MDQsIDB4N2UyMiwKKwkweDAwY2UsIDB4MDEyZSwgMHgwMGJlLCAweDA4MDQsIDB4N2UxYywgMHhhOTg0LCAweDkxODYsIDB4MDAyZSwKKwkweDBkMzAsIDB4OTE4NiwgMHgwMDJkLCAweDBkMTgsIDB4OTE4NiwgMHgwMDQ1LCAweDA1MTAsIDB4OTE4NiwKKwkweDAwMmEsIDB4MTEzMCwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHhjMTk0LCAweDIxMDIsIDB4MDhiOCwKKwkweDkxODYsIDB4MDAyMCwgMHgwMTU4LCAweDkxODYsIDB4MDAyOSwgMHgxZDEwLCAweGE5NzQsIDB4MDgwYywKKwkweDY2OTMsIDB4MTk2OCwgMHhiODAwLCAweGMwZTQsIDB4YjgwMiwgMHgwODQ4LCAweGE4OGMsIDB4OTA2NSwKKwkweDA5YjgsIDB4NjAwNywgMHgwMDI0LCAweDIwMDEsIDB4MTk4NSwgMHgyMDA0LCAweDYwMWEsIDB4MDgwNCwKKwkweDdjYjcsIDB4YTg4YywgMHg5MDY1LCAweDA5NjAsIDB4MDBlNiwgMHhhODkwLCAweDkwNzUsIDB4MjAwMSwKKwkweDE4MzQsIDB4MjAwNCwgMHg5MDA1LCAweDAxNTAsIDB4MDgwYywgMHhhY2ViLCAweDhlZmYsIDB4MDExOCwKKwkweDJlNjAsIDB4MDgwYywgMHhhY2ViLCAweDAwZWUsIDB4MDgwNCwgMHg3Y2I3LCAweDYwMjQsIDB4YzBkYywKKwkweGMwZDUsIDB4NjAyNiwgMHgyZTYwLCAweDYwMDcsIDB4MDAzYSwgMHhhOGEwLCAweDkwMDUsIDB4MDEzMCwKKwkweDYwMDcsIDB4MDAzYiwgMHhhOGE0LCAweDYwMmUsIDB4YThhOCwgMHg2MDE2LCAweDYwMDMsIDB4MDAwMSwKKwkweDIwMDksIDB4ODAyMCwgMHgwODBjLCAweDkyYjAsIDB4MDBlZSwgMHgwODA0LCAweDdjYjcsIDB4MjA2MSwKKwkweDFhNmUsIDB4NjAwMCwgMHhkMDg0LCAweDAxOTAsIDB4ZDA4YywgMHgxOTA0LCAweDdlMzAsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHg2MjA0LCAweDgyMTAsIDB4MDIyMCwgMHg2MjA2LCAweDAxMmUsIDB4MDgwNCwKKwkweDdlMzAsIDB4MDEyZSwgMHhhODgzLCAweDAwMTYsIDB4MDgwNCwgMHg3ZTI5LCAweGE4ODMsIDB4MDAwNywKKwkweDA4MDQsIDB4N2UyOSwgMHhhODY0LCAweDgwMDcsIDB4OTA4NCwgMHgwMGZmLCAweDAxMzAsIDB4ODAwMSwKKwkweDExMzgsIDB4NzAwNywgMHgwMDAxLCAweDAwNjksIDB4MDAwNSwgMHgwODBjLCAweDc5YjIsIDB4MDA0MCwKKwkweDcwMDcsIDB4MDAwMywgMHg3MDEyLCAweDI5MDAsIDB4NzAxNiwgMHg3MDFhLCAweDcwNGIsIDB4N2Q1OSwKKwkweDAwMDUsIDB4MDBiNiwgMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDkwM2UsIDB4MjA2MSwKKwkweDE4MDAsIDB4NjFkMCwgMHg4MWZmLCAweDE5MDQsIDB4N2RkYiwgMHg2MTMwLCAweGQxOTQsIDB4MTkwNCwKKwkweDdlMDUsIDB4YTg3OCwgMHgyMDcwLCAweDllODIsIDB4MWRkYywgMHgwYTA0LCAweDdkY2YsIDB4NjA2OCwKKwkweDllMDIsIDB4MWEwNCwgMHg3ZGNmLCAweDcxMjAsIDB4OTE4NiwgMHgwMDA2LCAweDE5MDQsIDB4N2RjMSwKKwkweDcwMTAsIDB4OTA1ZCwgMHgwOTA0LCAweDdkZGIsIDB4YjgwMCwgMHhkMGU0LCAweDE5MDQsIDB4N2RmZiwKKwkweDIwNjEsIDB4MWE2ZSwgMHg2MTAwLCAweDkxODQsIDB4MDMwMSwgMHg5MDg2LCAweDAwMDEsIDB4MTVhMCwKKwkweDcwMjQsIDB4ZDBkYywgMHgxOTA0LCAweDdlMDgsIDB4YTg4MywgMHgwMDAwLCAweGE4MDMsIDB4MDAwMCwKKwkweDI5MDgsIDB4NzAxNCwgMHg5MDA1LCAweDExOTgsIDB4NzExNiwgMHhhODdjLCAweGQwZjQsIDB4MTkwNCwKKwkweDdlMGIsIDB4MDgwYywgMHg1NzNlLCAweGQwOWMsIDB4MTExOCwgMHhhODdjLCAweGMwY2MsIDB4YTg3ZSwKKwkweDJlNjAsIDB4MDgwYywgMHg4ODY5LCAweDAxMmUsIDB4MDBlZSwgMHgwMGJlLCAweDAwMDUsIDB4MjA0OCwKKwkweGE4MDAsIDB4OTAwNSwgMHgxZGUwLCAweGE5MDIsIDB4MjE0OCwgMHhhODdjLCAweGQwZjQsIDB4MTkwNCwKKwkweDdlMGIsIDB4MDEyZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHgwMTJlLCAweDAwZWUsIDB4YTg4MywKKwkweDAwMDYsIDB4MDBiZSwgMHgwODA0LCAweDdlMjksIDB4ZDE4NCwgMHgwZGI4LCAweGQxYzQsIDB4MTE5MCwKKwkweDAwYTAsIDB4YTk3NCwgMHgwODBjLCAweDY2OTMsIDB4MTVkMCwgMHhiODAwLCAweGQwZTQsIDB4MTViOCwKKwkweDcxMjAsIDB4OTE4NiwgMHgwMDA3LCAweDExMTgsIDB4YTg4MywgMHgwMDAyLCAweDA0OTAsIDB4YTg4MywKKwkweDAwMDgsIDB4MDQ3OCwgMHhhODgzLCAweDAwMGUsIDB4MDQ2MCwgMHhhODgzLCAweDAwMTcsIDB4MDQ0OCwKKwkweGE4ODMsIDB4MDAzNSwgMHgwNDMwLCAweDA4MGMsIDB4NTc0MiwgMHhkMGZjLCAweDAxZTgsIDB4YTg3OCwKKwkweDIwNzAsIDB4OWU4MiwgMHgxZGRjLCAweDAyYzAsIDB4NjA2OCwgMHg5ZTAyLCAweDEyYTgsIDB4NzEyMCwKKwkweDkxODYsIDB4MDAwNiwgMHgxMTg4LCAweDcwMTAsIDB4OTA1ZCwgMHgwMTcwLCAweGI4MDAsIDB4ZDBiYywKKwkweDAxNTgsIDB4MjAzOSwgMHgwMDAxLCAweDcwMDAsIDB4OTA4NiwgMHgwMDA3LCAweDE5MDQsIDB4N2Q2NSwKKwkweDcwMDMsIDB4MDAwMiwgMHgwODA0LCAweDdkNjUsIDB4YTg4MywgMHgwMDI4LCAweDAwMTAsIDB4YTg4MywKKwkweDAwMjksIDB4MDEyZSwgMHgwMGVlLCAweDAwYmUsIDB4MDQyMCwgMHhhODgzLCAweDAwMmEsIDB4MGNjOCwKKwkweGE4ODMsIDB4MDA0NSwgMHgwY2IwLCAweDJlNjAsIDB4MjAxOSwgMHgwMDAyLCAweDYwMWIsIDB4MDAxNCwKKwkweDA4MGMsIDB4ZGZhMSwgMHgwMTJlLCAweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweDIwMDksIDB4MDAzZSwKKwkweDAwNTgsIDB4MjAwOSwgMHgwMDA0LCAweDAwNDAsIDB4MjAwOSwgMHgwMDA2LCAweDAwMjgsIDB4MjAwOSwKKwkweDAwMTYsIDB4MDAxMCwgMHgyMDA5LCAweDAwMDEsIDB4YTg4NCwgMHg5MDg0LCAweGZmMDAsIDB4OTEwNSwKKwkweGE4ODYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2ZGVlLCAweDAxMmUsIDB4MDAwNSwKKwkweDA4MGMsIDB4MTA3OSwgMHgwMDA1LCAweDAwZDYsIDB4MDgwYywgMHg4ODYwLCAweDAwZGUsIDB4MDAwNSwKKwkweDAwZDYsIDB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDAwNDAsIDB4NzAyYywKKwkweGQwODQsIDB4MDFkOCwgMHg5MDhjLCAweDA3ODAsIDB4MTkwYywgMHg3ZjFhLCAweGQwOWMsIDB4MTFhOCwKKwkweDIwNzEsIDB4MTgwMCwgMHg3MGMwLCAweDkwZWEsIDB4MDAyMCwgMHgwMjc4LCAweDgwMDEsIDB4NzBjMiwKKwkweDcwMmMsIDB4MjA0OCwgMHhhODAwLCAweDcwMmUsIDB4OTAwNiwgMHhhODAyLCAweGE4MDYsIDB4MjA3MSwKKwkweDAwNDAsIDB4MjkwMCwgMHg3MDIyLCAweDcwMmMsIDB4MGMyOCwgMHgwMTJlLCAweDAwZWUsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDAwNiwgMHg5MDg0LCAweDA3ODAsIDB4MTkwYywgMHg3ZjFhLCAweDAwMGUsIDB4MDAwNSwKKwkweGE4OTgsIDB4OTA4NCwgMHgwMDAzLCAweDA1YTgsIDB4MDgwYywgMHhhYzVhLCAweDA1ZDgsIDB4MjkwMCwKKwkweDYwMTYsIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDM1LCAweDExMzgsIDB4NjAyOCwKKwkweGMwZmQsIDB4NjAyYSwgMHgyMDAxLCAweDE5NmEsIDB4MjAwNCwgMHgwMDk4LCAweGE4YTAsIDB4OTA4NCwKKwkweDAwZmYsIDB4YTk5YywgMHg5MThjLCAweGZmMDAsIDB4OTEwNSwgMHhhOTljLCAweDkxOGMsIDB4MDBmZiwKKwkweDA4MGMsIDB4MjY2MSwgMHgxNTQwLCAweDAwYjYsIDB4MDgwYywgMHg2NjkzLCAweDJiMDAsIDB4MDBiZSwKKwkweDE1MTAsIDB4NjAxMiwgMHg2MDIzLCAweDAwMDEsIDB4MjAwOSwgMHgwMDQwLCAweGE4NjQsIDB4OTA4NCwKKwkweDAwZmYsIDB4OTA4NiwgMHgwMDM1LCAweDAxMTAsIDB4MjAwOSwgMHgwMDQxLCAweDA4MGMsIDB4YWQ0ZCwKKwkweDAwMDUsIDB4YTg3YiwgMHgwMTAxLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NmRlZSwKKwkweDAxMmUsIDB4MDAwNSwgMHhhODdiLCAweDAwMmMsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweDZkZWUsIDB4MDEyZSwgMHgwMDA1LCAweGE4N2IsIDB4MDAyOCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4NmRlZSwgMHgwMTJlLCAweDA4MGMsIDB4YWNiMCwgMHgwMDA1LCAweDAwZDYsIDB4MDBjNiwKKwkweDAwMzYsIDB4MDAyNiwgMHgwMDE2LCAweDAwYjYsIDB4NzAwNywgMHgwMDAxLCAweGFhNzQsIDB4OTI4MiwKKwkweDAwMDQsIDB4MWEwNCwgMHg3ZjBiLCAweGE5N2MsIDB4OTE4OCwgMHgxMDAwLCAweDIxMDQsIDB4OTA1ZCwKKwkweGI4MDQsIDB4ZDI4NCwgMHgwMTQwLCAweDA1ZTgsIDB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4OTA4NCwKKwkweDAwMDYsIDB4MTEwOCwgMHgwNGIwLCAweDJiMTAsIDB4MDgwYywgMHhhYzVhLCAweDExMTgsIDB4MDgwYywKKwkweGFkMjAsIDB4MDVhOCwgMHg2MjEyLCAweGE4NzQsIDB4MDAwMiwgMHg3ZWU5LCAweDdlZWUsIDB4N2VmMSwKKwkweDdlZjcsIDB4MjAxOSwgMHgwMDAyLCAweDA4MGMsIDB4ZTNiNSwgMHgwMDYwLCAweDA4MGMsIDB4ZTM0NSwKKwkweDAwNDgsIDB4MjAxOSwgMHgwMDAyLCAweGE5ODAsIDB4MDgwYywgMHhlMzY0LCAweDAwMTgsIDB4YTk4MCwKKwkweDA4MGMsIDB4ZTM0NSwgMHgwODBjLCAweGFjYjAsIDB4YTg4NywgMHgwMDAwLCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDgwYywgMHg2ZGVlLCAweDAxMmUsIDB4MDBiZSwgMHgwMDFlLCAweDAwMmUsIDB4MDAzZSwKKwkweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweGE4ODcsIDB4MDAwNiwgMHgwYzgwLCAweGE4ODcsIDB4MDAwMiwKKwkweDBjNjgsIDB4YTg4NywgMHgwMDA1LCAweDBjNTAsIDB4YTg4NywgMHgwMDA0LCAweDBjMzgsIDB4YTg4NywKKwkweDAwMDcsIDB4MGMyMCwgMHgyMDkxLCAweDgwMDAsIDB4MGUwNCwgMHg3ZjFjLCAweDAwMDYsIDB4MDAxNiwKKwkweDIwMDEsIDB4ODAwMywgMHgwMDA2LCAweDA4MDQsIDB4MGQ4NiwgMHgyMDAxLCAweDE4MzQsIDB4MjAwNCwKKwkweDkwMDUsIDB4MDAwNSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMzAwLCAweDIwMDEsIDB4MDIwMCwKKwkweDIwMGMsIDB4YzFlNSwgMHhjMWRjLCAweDIxMDIsIDB4MjAwOSwgMHgwMjE4LCAweDIxMGMsIDB4ZDFlYywKKwkweDExMjAsIDB4MDgwYywgMHgxNjJmLCAweDAwZmUsIDB4MDAwNSwgMHgyMDAxLCAweDAyMGQsIDB4MjAwMywKKwkweDAwMjAsIDB4NzgxZiwgMHgwMzAwLCAweDAwZmUsIDB4MDAwNSwgMHg3ODFjLCAweGQwOGMsIDB4MDkwNCwKKwkweDdmOWQsIDB4NjhjMCwgMHg5MGFhLCAweDAwMDUsIDB4MGEwNCwgMHg4NWM1LCAweDdkNDQsIDB4N2M0MCwKKwkweGQ1OWMsIDB4MTkwYywgMHgwZDdkLCAweDk1ODQsIDB4MDBmNiwgMHgxNTA4LCAweDk0ODQsIDB4NzAwMCwKKwkweDAxMzgsIDB4OTA4YSwgMHgyMDAwLCAweDEyNTgsIDB4OTU4NCwgMHgwNzAwLCAweDgwMDcsIDB4MDRmMCwKKwkweDcwMDAsIDB4OTA4NCwgMHhmZjAwLCAweDkwODYsIDB4ODEwMCwgMHgwZGIwLCAweDAwYjAsIDB4OTQ4NCwKKwkweDBmZmYsIDB4MTEzMCwgMHg3MDAwLCAweDkwODQsIDB4ZmYwMCwgMHg5MDg2LCAweDgxMDAsIDB4MTFjMCwKKwkweDA4MGMsIDB4ZTg1YSwgMHgwODBjLCAweDg0YWMsIDB4NzgxNywgMHgwMTQwLCAweDAwYTgsIDB4OTU4NCwKKwkweDAwNzYsIDB4MTExOCwgMHgwODBjLCAweDg1MDgsIDB4MTljOCwgMHhkNWE0LCAweDAxNDgsIDB4MDA0NiwKKwkweDAwNTYsIDB4MDgwYywgMHg3ZmVkLCAweDA4MGMsIDB4MjE2ZiwgMHgwMDVlLCAweDAwNGUsIDB4MDAyMCwKKwkweDA4MGMsIDB4ZTg1YSwgMHg3ODE3LCAweDAxNDAsIDB4MDgwYywgMHg3NTNkLCAweDAxNjgsIDB4MjAwMSwKKwkweDAxMTEsIDB4MjAwNCwgMHhkMDhjLCAweDAxNDAsIDB4Njg5MywgMHgwMDAwLCAweDIwMDEsIDB4MDExMCwKKwkweDIwMDMsIDB4MDAwOCwgMHgyMDAzLCAweDAwMDAsIDB4MDQ4OSwgMHgwMDA1LCAweDAwMDIsIDB4N2ZhYSwKKwkweDgyYmEsIDB4N2ZhNywgMHg3ZmE3LCAweDdmYTcsIDB4N2ZhNywgMHg3ZmE3LCAweDdmYTcsIDB4NzgxNywKKwkweDAxNDAsIDB4MDAwNSwgMHg3MDAwLCAweDkwOGMsIDB4ZmYwMCwgMHg5MTk0LCAweGYwMDAsIDB4ODEwZiwKKwkweDk0ODQsIDB4MGZmZiwgMHg2ODkyLCAweDkyODYsIDB4MjAwMCwgMHgxMTUwLCAweDY4MDAsIDB4OTA4NiwKKwkweDAwMDEsIDB4MTExOCwgMHgwODBjLCAweDU3YTQsIDB4MDA3MCwgMHgwODBjLCAweDgwMGQsIDB4MDA1OCwKKwkweDkyODYsIDB4MzAwMCwgMHgxMTE4LCAweDA4MGMsIDB4ODFmNCwgMHgwMDI4LCAweDkyODYsIDB4ODAwMCwKKwkweDExMTAsIDB4MDgwYywgMHg4M2Q5LCAweDc4MTcsIDB4MDE0MCwgMHgwMDA1LCAweDIwMDEsIDB4MTgxMCwKKwkweDIwMDQsIDB4ZDA4YywgMHgwMTc4LCAweDIwMDEsIDB4MTgwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwMywKKwkweDExNDgsIDB4MDAyNiwgMHgwMDM2LCAweDIwMTEsIDB4ODA0OCwgMHgyNTE4LCAweDA4MGMsIDB4NGI1MiwKKwkweDAwM2UsIDB4MDAyZSwgMHgwMDA1LCAweDAwMzYsIDB4MDA0NiwgMHgwMDU2LCAweDAwZjYsIDB4MjA3OSwKKwkweDAyMDAsIDB4MjAxOSwgMHhmZmZlLCAweDdjMzAsIDB4MDA1MCwgMHgwMDM2LCAweDAwNDYsIDB4MDA1NiwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMjAwLCAweDdkNDQsIDB4N2M0MCwgMHgyMDE5LCAweGZmZmYsIDB4MjAwMSwKKwkweDE4MTAsIDB4MjAwNCwgMHhkMDhjLCAweDAxNjAsIDB4MjAwMSwgMHgxODAwLCAweDIwMDQsIDB4OTA4NiwKKwkweDAwMDMsIDB4MTEzMCwgMHgwMDI2LCAweDIwMTEsIDB4ODA0OCwgMHgwODBjLCAweDRiNTIsIDB4MDAyZSwKKwkweDAwZmUsIDB4MDA1ZSwgMHgwMDRlLCAweDAwM2UsIDB4MDAwNSwgMHgwMGI2LCAweDAwYzYsIDB4NzAxMCwKKwkweDkwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwOTYsIDB4MDAwMSwgMHgwMTIwLCAweDkwOTYsIDB4MDAyMywKKwkweDE5MDQsIDB4ODFjNSwgMHg5MTg2LCAweDAwMjMsIDB4MTVjMCwgMHgwODBjLCAweDg0NzcsIDB4MDkwNCwKKwkweDgxYzUsIDB4NjEyMCwgMHg5MTg2LCAweDAwMDEsIDB4MDE1MCwgMHg5MTg2LCAweDAwMDQsIDB4MDEzOCwKKwkweDkxODYsIDB4MDAwOCwgMHgwMTIwLCAweDkxODYsIDB4MDAwYSwgMHgxOTA0LCAweDgxYzUsIDB4NzEyNCwKKwkweDYxMGEsIDB4NzAzMCwgMHg5MDhlLCAweDAyMDAsIDB4MTEzMCwgMHgyMDA5LCAweDAwMTUsIDB4MDgwYywKKwkweGFkNGQsIDB4MDgwNCwgMHg4MWM1LCAweDkwOGUsIDB4MDIxNCwgMHgwMTE4LCAweDkwOGUsIDB4MDIxMCwKKwkweDExMzAsIDB4MjAwOSwgMHgwMDE1LCAweDA4MGMsIDB4YWQ0ZCwgMHgwODA0LCAweDgxYzUsIDB4OTA4ZSwKKwkweDAxMDAsIDB4MTkwNCwgMHg4MWM1LCAweDcwMzQsIDB4OTAwNSwgMHgxOTA0LCAweDgxYzUsIDB4MjAwOSwKKwkweDAwMTYsIDB4MDgwYywgMHhhZDRkLCAweDA4MDQsIDB4ODFjNSwgMHg5MTg2LCAweDAwMjIsIDB4MTkwNCwKKwkweDgxYzUsIDB4NzAzMCwgMHg5MDhlLCAweDAzMDAsIDB4MTU4MCwgMHg2OGRjLCAweGQwYTQsIDB4MDUyOCwKKwkweGMwYjUsIDB4NjhkZSwgMHg3MTAwLCAweDkxOGMsIDB4MDBmZiwgMHg2OTdlLCAweDcwMDQsIDB4Njg4MiwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDc5ZTYsIDB4NzhlYSwgMHgwMDA2LCAweDkwODQsIDB4MDBmZiwKKwkweDAwMTYsIDB4MjAwOCwgMHgwODBjLCAweDI2YWEsIDB4NzkzMiwgMHg3OTM2LCAweDAwMWUsIDB4MDAwZSwKKwkweDAwZmUsIDB4MDgwYywgMHgyNjYxLCAweDY5NWUsIDB4NzAzYywgMHgwMGU2LCAweDIwNzEsIDB4MDE0MCwKKwkweDcwODYsIDB4MjA3MSwgMHgxODAwLCAweDcwYjYsIDB4MDBlZSwgMHg3MDM0LCAweDkwMDUsIDB4MTkwNCwKKwkweDgxYzUsIDB4MjAwOSwgMHgwMDE3LCAweDA4MDQsIDB4ODE3NSwgMHg5MDhlLCAweDA0MDAsIDB4MTE5MCwKKwkweDcwMzQsIDB4OTAwNSwgMHgxOTA0LCAweDgxYzUsIDB4MDgwYywgMHg3NTNkLCAweDAxMjAsIDB4MjAwOSwKKwkweDAwMWQsIDB4MDgwNCwgMHg4MTc1LCAweDY4ZGMsIDB4YzBhNSwgMHg2OGRlLCAweDIwMDksIDB4MDAzMCwKKwkweDA4MDQsIDB4ODE3NSwgMHg5MDhlLCAweDA1MDAsIDB4MTE0MCwgMHg3MDM0LCAweDkwMDUsIDB4MTkwNCwKKwkweDgxYzUsIDB4MjAwOSwgMHgwMDE4LCAweDA4MDQsIDB4ODE3NSwgMHg5MDhlLCAweDIwMTAsIDB4MTEyMCwKKwkweDIwMDksIDB4MDAxOSwgMHgwODA0LCAweDgxNzUsIDB4OTA4ZSwgMHgyMTEwLCAweDExMjAsIDB4MjAwOSwKKwkweDAwMWEsIDB4MDgwNCwgMHg4MTc1LCAweDkwOGUsIDB4NTIwMCwgMHgxMTQwLCAweDcwMzQsIDB4OTAwNSwKKwkweDE5MDQsIDB4ODFjNSwgMHgyMDA5LCAweDAwMWIsIDB4MDgwNCwgMHg4MTc1LCAweDkwOGUsIDB4NTAwMCwKKwkweDExNDAsIDB4NzAzNCwgMHg5MDA1LCAweDE5MDQsIDB4ODFjNSwgMHgyMDA5LCAweDAwMWMsIDB4MDgwNCwKKwkweDgxNzUsIDB4OTA4ZSwgMHgxMzAwLCAweDExMjAsIDB4MjAwOSwgMHgwMDM0LCAweDA4MDQsIDB4ODE3NSwKKwkweDkwOGUsIDB4MTIwMCwgMHgxMTQwLCAweDcwMzQsIDB4OTAwNSwgMHgxOTA0LCAweDgxYzUsIDB4MjAwOSwKKwkweDAwMjQsIDB4MDgwNCwgMHg4MTc1LCAweDkwOGMsIDB4ZmYwMCwgMHg5MThlLCAweDI0MDAsIDB4MTE3MCwKKwkweDIwMDksIDB4MDAyZCwgMHgyMDAxLCAweDE4MTAsIDB4MjAwNCwgMHhkMDljLCAweDA5MDQsIDB4ODE3NSwKKwkweDA4MGMsIDB4ZDdjOSwgMHgxOTA0LCAweDgxYzUsIDB4MDgwNCwgMHg4MTczLCAweDkwOGMsIDB4ZmYwMCwKKwkweDkxOGUsIDB4NTMwMCwgMHgxMTIwLCAweDIwMDksIDB4MDAyYSwgMHgwODA0LCAweDgxNzUsIDB4OTA4ZSwKKwkweDBmMDAsIDB4MTEyMCwgMHgyMDA5LCAweDAwMjAsIDB4MDgwNCwgMHg4MTc1LCAweDkwOGUsIDB4NjEwNCwKKwkweDE1MzAsIDB4MjAyOSwgMHgwMjA1LCAweDIwMTEsIDB4MDI2ZCwgMHg4MjA4LCAweDIyMDQsIDB4OTA4MiwKKwkweDAwMDQsIDB4ODAwNCwgMHg4MDA0LCAweDIwYTgsIDB4MjAxMSwgMHg4MDE1LCAweDIxMWMsIDB4ODEwOCwKKwkweDAwNDYsIDB4MjEyNCwgMHgwODBjLCAweDRiNTIsIDB4MDA0ZSwgMHg4MTA4LCAweDBmMDQsIDB4ODEyOSwKKwkweDkxODYsIDB4MDI4MCwgMHgxZDg4LCAweDI1MDQsIDB4ODAwMCwgMHgyMDJhLCAweDIwMDksIDB4MDI2MCwKKwkweDBjNTgsIDB4MjAyYiwgMHgwMDAwLCAweDIwMDksIDB4MDAyMywgMHgwODA0LCAweDgxNzUsIDB4OTA4ZSwKKwkweDYwMDAsIDB4MTEyMCwgMHgyMDA5LCAweDAwM2YsIDB4MDgwNCwgMHg4MTc1LCAweDkwOGUsIDB4NTQwMCwKKwkweDExMzgsIDB4MDgwYywgMHg4NTc1LCAweDE5MDQsIDB4ODFjNSwgMHgyMDA5LCAweDAwNDYsIDB4MDRhOCwKKwkweDkwOGUsIDB4NTUwMCwgMHgxMTQ4LCAweDA4MGMsIDB4ODU5ZCwgMHgxMTE4LCAweDIwMDksIDB4MDA0MSwKKwkweDA0NjAsIDB4MjAwOSwgMHgwMDQyLCAweDA0NDgsIDB4OTA4ZSwgMHg3ODAwLCAweDExMTgsIDB4MjAwOSwKKwkweDAwNDUsIDB4MDQxOCwgMHg5MDhlLCAweDEwMDAsIDB4MTExOCwgMHgyMDA5LCAweDAwNGUsIDB4MDBlOCwKKwkweDkwOGUsIDB4NjMwMCwgMHgxMTE4LCAweDIwMDksIDB4MDA0YSwgMHgwMGI4LCAweDkwOGMsIDB4ZmYwMCwKKwkweDkxOGUsIDB4NTYwMCwgMHgxMTE4LCAweDIwMDksIDB4MDA0ZiwgMHgwMDc4LCAweDkwOGMsIDB4ZmYwMCwKKwkweDkxOGUsIDB4NTcwMCwgMHgxMTE4LCAweDIwMDksIDB4MDA1MCwgMHgwMDM4LCAweDIwMDksIDB4MDAxZCwKKwkweDY4MzgsIDB4ZDBkNCwgMHgwMTEwLCAweDIwMDksIDB4MDA0YywgMHgwMDE2LCAweDIwMTEsIDB4MDI2MywKKwkweDIyMDQsIDB4ODIxMSwgMHgyMjBjLCAweDA4MGMsIDB4MjY2MSwgMHgxOTA0LCAweDgxYzgsIDB4MDgwYywKKwkweDY2MzIsIDB4MTkwNCwgMHg4MWM4LCAweGJlMTIsIDB4YmQxNiwgMHgwMDFlLCAweDAwMTYsIDB4MDgwYywKKwkweDc1M2QsIDB4MDFjMCwgMHg2OGRjLCAweGQwOGMsIDB4MTE0OCwgMHg3MDAwLCAweDkwODQsIDB4MDBmZiwKKwkweDExODgsIDB4NzAwNCwgMHg5MDg0LCAweGZmMDAsIDB4MTE2OCwgMHgwMDQwLCAweDY4N2MsIDB4OTYwNiwKKwkweDExNDgsIDB4Njg4MCwgMHg5NTA2LCAweDkwODQsIDB4ZmYwMCwgMHgxMTIwLCAweDk1ODQsIDB4MDBmZiwKKwkweGI4ODYsIDB4MDA4MCwgMHhiODg0LCAweDkwMDUsIDB4MTE2OCwgMHg5MTg2LCAweDAwNDYsIDB4MTE1MCwKKwkweDY4N2MsIDB4OTYwNiwgMHgxMTM4LCAweDY4ODAsIDB4OTUwNiwgMHg5MDg0LCAweGZmMDAsIDB4MTExMCwKKwkweDAwMWUsIDB4MDA5OCwgMHgwODBjLCAweGFjNWEsIDB4MDFhOCwgMHgyYjA4LCAweDYxMTIsIDB4NjAyMywKKwkweDAwMDQsIDB4NzEyMCwgMHg2MTBhLCAweDAwMWUsIDB4OTE4NiwgMHgwMDRjLCAweDExMTAsIDB4NjAyMywKKwkweDAwMGEsIDB4MDAxNiwgMHgwMDFlLCAweDA4MGMsIDB4YWQ0ZCwgMHgwMGNlLCAweDAwYmUsIDB4MDAwNSwKKwkweDAwMWUsIDB4MGNkOCwgMHgyMDAxLCAweDE4MGUsIDB4MjAwNCwgMHhkMGVjLCAweDAxMjAsIDB4MjAxMSwKKwkweDgwNDksIDB4MDgwYywgMHg0YjUyLCAweDA4MGMsIDB4YWQyMCwgMHgwZDkwLCAweDJiMDgsIDB4NjExMiwKKwkweDYwMjMsIDB4MDAwNCwgMHg3MTIwLCAweDYxMGEsIDB4MDAxZSwgMHgwMDE2LCAweDkxODYsIDB4MDAxNywKKwkweDAxMTgsIDB4OTE4NiwgMHgwMDMwLCAweDExMjgsIDB4NjAwNywgMHgwMDA5LCAweDYwMTcsIDB4MjkwMCwKKwkweDAwMjAsIDB4NjAwNywgMHgwMDUxLCAweDYwMTcsIDB4MDAwMCwgMHg2MDJmLCAweDAwMDksIDB4NjAwMywKKwkweDAwMDEsIDB4MDgwYywgMHg5MmI3LCAweDA4YTAsIDB4MDgwYywgMHg4NWU0LCAweDExNTgsIDB4MDgwYywKKwkweDMzNzcsIDB4MTE0MCwgMHg3MDEwLCAweDkwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwOGUsIDB4MDAwOCwKKwkweDExMDgsIDB4MDAwOSwgMHgwMDA1LCAweDAwYjYsIDB4MDBjNiwgMHgwMDQ2LCAweDcwMDAsIDB4OTA4YywKKwkweGZmMDAsIDB4ODEwZiwgMHg5MTg2LCAweDAwMzMsIDB4MTFlOCwgMHgwODBjLCAweDg0NzcsIDB4MDkwNCwKKwkweDgyNTIsIDB4NzEyNCwgMHg2MTBhLCAweDcwMzAsIDB4OTA4ZSwgMHgwMjAwLCAweDExNDAsIDB4NzAzNCwKKwkweDkwMDUsIDB4MTVjMCwgMHgyMDA5LCAweDAwMTUsIDB4MDgwYywgMHhhZDRkLCAweDA0OTgsIDB4OTA4ZSwKKwkweDAxMDAsIDB4MTU4MCwgMHg3MDM0LCAweDkwMDUsIDB4MTU2OCwgMHgyMDA5LCAweDAwMTYsIDB4MDgwYywKKwkweGFkNGQsIDB4MDQ0MCwgMHg5MTg2LCAweDAwMzIsIDB4MTUyOCwgMHg3MDMwLCAweDkwOGUsIDB4MTQwMCwKKwkweDE1MDgsIDB4MjAwOSwgMHgwMDM4LCAweDAwMTYsIDB4MjAxMSwgMHgwMjYzLCAweDIyMDQsIDB4ODIxMSwKKwkweDIyMGMsIDB4MDgwYywgMHgyNjYxLCAweDExYTgsIDB4MDgwYywgMHg2NjMyLCAweDExOTAsIDB4YmUxMiwKKwkweGJkMTYsIDB4MDgwYywgMHhhYzVhLCAweDAxNjgsIDB4MmIwOCwgMHg2MTEyLCAweDA4MGMsIDB4Y2UxNSwKKwkweDYwMjMsIDB4MDAwNCwgMHg3MTIwLCAweDYxMGEsIDB4MDAxZSwgMHgwODBjLCAweGFkNGQsIDB4MDAxMCwKKwkweDAwY2UsIDB4MDAxZSwgMHgwMDRlLCAweDAwY2UsIDB4MDBiZSwgMHgwMDA1LCAweDAwYjYsIDB4MDA0NiwKKwkweDAwZTYsIDB4MDBkNiwgMHgyMDI4LCAweDIxMzAsIDB4OTY5NiwgMHgwMGZmLCAweDExYjgsIDB4OTU5MiwKKwkweGZmZmMsIDB4MDJhMCwgMHg5NTk2LCAweGZmZmQsIDB4MTEyMCwgMHgyMDA5LCAweDAwN2YsIDB4MDgwNCwKKwkweDgyYjQsIDB4OTU5NiwgMHhmZmZlLCAweDExMjAsIDB4MjAwOSwgMHgwMDdlLCAweDA4MDQsIDB4ODJiNCwKKwkweDk1OTYsIDB4ZmZmYywgMHgxMTE4LCAweDIwMDksIDB4MDA4MCwgMHgwNGYwLCAweDIwMTEsIDB4MDAwMCwKKwkweDIwMTksIDB4MTgzNywgMHgyMzFjLCAweGQzYWMsIDB4MDEzMCwgMHg5MDI2LCAweDIwYTksIDB4MDgwMCwKKwkweDIwNzEsIDB4MTAwMCwgMHgwMDMwLCAweDIwMjEsIDB4MDA4MSwgMHgyMGE5LCAweDA3N2YsIDB4MjA3MSwKKwkweDEwODEsIDB4MmUxYywgMHg5M2RkLCAweDAwMDAsIDB4MTE0MCwgMHg4MmZmLCAweDExZDAsIDB4OTQ5NiwKKwkweDAwZmYsIDB4MDFiOCwgMHgyNDEwLCAweGMyZmQsIDB4MDBhMCwgMHhiZjEwLCAweDI2MDAsIDB4OTcwNiwKKwkweGI4MTQsIDB4MTEyMCwgMHg5NTQ2LCAweDExMTAsIDB4MjQwOCwgMHgwMGIwLCAweDk3NDUsIDB4MTE0OCwKKwkweDk0YzYsIDB4MDA3ZSwgMHgwMTMwLCAweDk0YzYsIDB4MDA3ZiwgMHgwMTE4LCAweDk0YzYsIDB4MDA4MCwKKwkweDFkMjAsIDB4ODQyMCwgMHg4ZTcwLCAweDFmMDQsIDB4ODI4OSwgMHg4MmZmLCAweDExMTgsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAxOCwgMHhjMmZjLCAweDIyMDgsIDB4OTAwNiwgMHgwMGRlLCAweDAwZWUsIDB4MDA0ZSwKKwkweDAwYmUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MzcsIDB4MjAwYywgMHg5MTg0LCAweDAwODAsIDB4MDExMCwKKwkweGQxOGMsIDB4MDEzOCwgMHg3MDAwLCAweDkwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDkxODQsIDB4MDAwZiwKKwkweDAwMWEsIDB4NzgxNywgMHgwMTQwLCAweDAwMDUsIDB4ODJkYywgMHg4MmRjLCAweDgyZGMsIDB4ODQ4OSwKKwkweDgyZGMsIDB4ODJkZiwgMHg4MzA0LCAweDgzOGQsIDB4ODJkYywgMHg4MmRjLCAweDgyZGMsIDB4ODJkYywKKwkweDgyZGMsIDB4ODJkYywgMHg4MmRjLCAweDgyZGMsIDB4NzgxNywgMHgwMTQwLCAweDAwMDUsIDB4MDBiNiwKKwkweDcxMTAsIDB4ZDFiYywgMHgwMWU4LCAweDcxMjAsIDB4MjE2MCwgMHg5YzhjLCAweDAwMDMsIDB4MTFjMCwKKwkweDljOGEsIDB4MWRkYywgMHgwMmE4LCAweDY4NjgsIDB4OWMwMiwgMHgxMjkwLCAweDcwMDgsIDB4OTA4NCwKKwkweDAwZmYsIDB4NjExMCwgMHgyMTU4LCAweGI5MTAsIDB4OTEwNiwgMHgxMTUwLCAweDcwMGMsIDB4YjkxNCwKKwkweDkxMDYsIDB4MTEzMCwgMHg3MTI0LCAweDYxMGEsIDB4MjAwOSwgMHgwMDQ2LCAweDA4MGMsIDB4YWQ0ZCwKKwkweDc4MTcsIDB4MDE0MCwgMHgwMGJlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGM2LCAweDk0ODQsIDB4MGZmZiwKKwkweDA5MDQsIDB4ODM2OSwgMHg3MTEwLCAweGQxYmMsIDB4MTkwNCwgMHg4MzY5LCAweDcxMDgsIDB4NzAwYywKKwkweDIwMjgsIDB4OTE4YywgMHgwMGZmLCAweDIxMzAsIDB4OTA5NCwgMHhmZjAwLCAweDE1YzgsIDB4ODFmZiwKKwkweDE1YjgsIDB4OTA4MCwgMHgzM2I5LCAweDIwMGQsIDB4OTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MjAwMSwKKwkweDAwODAsIDB4OTEwNiwgMHgwOTA0LCAweDgzNjksIDB4OTE4MiwgMHgwODAxLCAweDFhMDQsIDB4ODM2OSwKKwkweDkxOTAsIDB4MTAwMCwgMHgyMjA0LCAweDkwNWQsIDB4MDVlMCwgMHhiZTEyLCAweGJkMTYsIDB4YjgwMCwKKwkweGQwZWMsIDB4MTViOCwgMHhiYTA0LCAweDkyOTQsIDB4ZmYwMCwgMHg5Mjg2LCAweDA2MDAsIDB4MTE5MCwKKwkweDA4MGMsIDB4YWM1YSwgMHgwNTk4LCAweDJiMDgsIDB4NzAyOCwgMHg2MDRlLCAweDcwMmMsIDB4NjA1MiwKKwkweDYxMTIsIDB4NjAyMywgMHgwMDA2LCAweDcxMjAsIDB4NjEwYSwgMHg3MTMwLCAweDYxNWUsIDB4MDgwYywKKwkweGRhMzIsIDB4MDBmOCwgMHgwODBjLCAweDZhZGQsIDB4MTEzOCwgMHhiODA3LCAweDA2MDYsIDB4MGM0MCwKKwkweDE5MGMsIDB4ODI1NiwgMHgxMWIwLCAweDA4ODAsIDB4MDgwYywgMHhhYzVhLCAweDJiMDgsIDB4MDE4OCwKKwkweDYxMTIsIDB4NjAyMywgMHgwMDA0LCAweDcxMjAsIDB4NjEwYSwgMHg5Mjg2LCAweDA0MDAsIDB4MTExOCwKKwkweDYwMDcsIDB4MDAwNSwgMHgwMDEwLCAweDYwMDcsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywKKwkweDkyYjcsIDB4NzgxNywgMHgwMTQwLCAweDAwY2UsIDB4MDBiZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgwZSwKKwkweDIwMDQsIDB4ZDBlYywgMHgwMTIwLCAweDIwMTEsIDB4ODA0OSwgMHgwODBjLCAweDRiNTIsIDB4MDgwYywKKwkweGFkMjAsIDB4MGQ3OCwgMHgyYjA4LCAweDYxMTIsIDB4NjAyMywgMHgwMDA2LCAweDcxMjAsIDB4NjEwYSwKKwkweDcxMzAsIDB4NjE1ZSwgMHg2MDE3LCAweGYzMDAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDA0MSwKKwkweDIwMDksIDB4YTAyMiwgMHgwODBjLCAweDkyYjAsIDB4MDhlMCwgMHgwMGI2LCAweDcxMTAsIDB4ZDFiYywKKwkweDA1ZDAsIDB4NzAyMCwgMHgyMDYwLCAweDljODQsIDB4MDAwMywgMHgxNWE4LCAweDljODIsIDB4MWRkYywKKwkweDA2OTAsIDB4Njg2OCwgMHg5YzAyLCAweDE2NzgsIDB4OTQ4NCwgMHgwZmZmLCAweDkwODIsIDB4MDAwYywKKwkweDA2NTAsIDB4NzAwOCwgMHg5MDg0LCAweDAwZmYsIDB4NjExMCwgMHgyMTU4LCAweGI5MTAsIDB4OTEwNiwKKwkweDE1MTAsIDB4NzAwYywgMHhiOTE0LCAweDkxMDYsIDB4MTFmMCwgMHg3MTI0LCAweDYxMGEsIDB4NjAxYywKKwkweGQwZmMsIDB4MTFjOCwgMHgyMDAxLCAweDAyNzEsIDB4MjAwNCwgMHg5MDA1LCAweDExODAsIDB4OTQ4NCwKKwkweDBmZmYsIDB4OTA4MiwgMHgwMDBjLCAweDAxNTgsIDB4MDA2NiwgMHgyMDMxLCAweDAxMDAsIDB4YTAwMSwKKwkweGEwMDEsIDB4ODYzMSwgMHgxZGUwLCAweDAwNmUsIDB4NjAxYywgMHhkMGZjLCAweDExMjAsIDB4MjAwOSwKKwkweDAwNDUsIDB4MDgwYywgMHhhZDRkLCAweDc4MTcsIDB4MDE0MCwgMHgwMGJlLCAweDAwMDUsIDB4NjEyMCwKKwkweDkxODYsIDB4MDAwMiwgMHgwMTI4LCAweDkxODYsIDB4MDAwNSwgMHgwMTEwLCAweDkwODUsIDB4MDAwMSwKKwkweDAwMDUsIDB4MDgwYywgMHg4NWU0LCAweDExODAsIDB4MDgwYywgMHgzMzc3LCAweDExNjgsIDB4NzAxMCwKKwkweDkwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwODYsIDB4MDAwMCwgMHgxMTMwLCAweDkxODQsIDB4MDAwZiwKKwkweDkwOGEsIDB4MDAwNiwgMHgxMjA4LCAweDAwMGIsIDB4MDAwNSwgMHg4M2YzLCAweDgzZjQsIDB4ODNmMywKKwkweDgzZjMsIDB4ODQ1OSwgMHg4NDY4LCAweDAwMDUsIDB4MDBiNiwgMHg3MDBjLCAweDcxMDgsIDB4MDgwYywKKwkweDI2NjEsIDB4MTkwNCwgMHg4NDU3LCAweDA4MGMsIDB4NjYzMiwgMHgxOTA0LCAweDg0NTcsIDB4YmUxMiwKKwkweGJkMTYsIDB4NzExMCwgMHhkMWJjLCAweDA1NDAsIDB4NzAyYywgMHhkMDg0LCAweDExMjAsIDB4YjgwMCwKKwkweGQwYmMsIDB4MTkwNCwgMHg4NDU3LCAweDA4MGMsIDB4NmFkZCwgMHgwMTQ4LCAweDkwODYsIDB4MDAwNCwKKwkweDAxMzAsIDB4MDgwYywgMHg2YWU1LCAweDAxMTgsIDB4OTA4NiwgMHgwMDA0LCAweDE1ODgsIDB4MDBjNiwKKwkweDA4MGMsIDB4ODQ3NywgMHgwMGNlLCAweDA1ZDgsIDB4MDgwYywgMHhhYzVhLCAweDJiMDgsIDB4MDViOCwKKwkweDYxMTIsIDB4MDgwYywgMHhjZTE1LCAweDYwMjMsIDB4MDAwMiwgMHg3MTIwLCAweDYxMGEsIDB4MjAwOSwKKwkweDAwODgsIDB4MDgwYywgMHhhZDRkLCAweDA0NTgsIDB4MDgwYywgMHg2YWRkLCAweDAxNDgsIDB4OTA4NiwKKwkweDAwMDQsIDB4MDEzMCwgMHgwODBjLCAweDZhZTUsIDB4MDExOCwgMHg5MDg2LCAweDAwMDQsIDB4MTE4MCwKKwkweDA4MGMsIDB4YWM1YSwgMHgyYjA4LCAweDAxZDgsIDB4NjExMiwgMHgwODBjLCAweGNlMTUsIDB4NjAyMywKKwkweDAwMDUsIDB4NzEyMCwgMHg2MTBhLCAweDIwMDksIDB4MDA4OCwgMHgwODBjLCAweGFkNGQsIDB4MDA3OCwKKwkweDA4MGMsIDB4YWM1YSwgMHgyYjA4LCAweDAxNTgsIDB4NjExMiwgMHgwODBjLCAweGNlMTUsIDB4NjAyMywKKwkweDAwMDQsIDB4NzEyMCwgMHg2MTBhLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLCAweGFkNGQsIDB4MDBiZSwKKwkweDAwMDUsIDB4NzExMCwgMHhkMWJjLCAweDAxNTgsIDB4MDBkMSwgMHgwMTQ4LCAweDA4MGMsIDB4ODNjZiwKKwkweDExMzAsIDB4NzEyNCwgMHg2MTBhLCAweDIwMDksIDB4MDA4OSwgMHgwODBjLCAweGFkNGQsIDB4MDAwNSwKKwkweDcxMTAsIDB4ZDFiYywgMHgwMTU4LCAweDAwNTksIDB4MDE0OCwgMHgwODBjLCAweDgzY2YsIDB4MTEzMCwKKwkweDcxMjQsIDB4NjEwYSwgMHgyMDA5LCAweDAwOGEsIDB4MDgwYywgMHhhZDRkLCAweDAwMDUsIDB4NzAyMCwKKwkweDIwNjAsIDB4OWM4NCwgMHgwMDAzLCAweDExNTgsIDB4OWM4MiwgMHgxZGRjLCAweDAyNDAsIDB4MjAwMSwKKwkweDE4MWEsIDB4MjAwNCwgMHg5YzAyLCAweDEyMTgsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4OTAwNiwKKwkweDBjZTgsIDB4MDBiNiwgMHg3MTEwLCAweGQxYmMsIDB4MTFkOCwgMHg3MDI0LCAweDIwNjAsIDB4OWM4NCwKKwkweDAwMDMsIDB4MTFiMCwgMHg5YzgyLCAweDFkZGMsIDB4MDI5OCwgMHg2ODY4LCAweDljMDIsIDB4MTI4MCwKKwkweDcwMDgsIDB4OTA4NCwgMHgwMGZmLCAweDYxMTAsIDB4MjE1OCwgMHhiOTEwLCAweDkxMDYsIDB4MTE0MCwKKwkweDcwMGMsIDB4YjkxNCwgMHg5MTA2LCAweDExMjAsIDB4MjAwOSwgMHgwMDUxLCAweDA4MGMsIDB4YWQ0ZCwKKwkweDc4MTcsIDB4MDE0MCwgMHgwMGJlLCAweDAwMDUsIDB4MjAzMSwgMHgwMTA1LCAweDAwNjksIDB4MDAwNSwKKwkweDIwMzEsIDB4MDIwNiwgMHgwMDQ5LCAweDAwMDUsIDB4MjAzMSwgMHgwMjA3LCAweDAwMjksIDB4MDAwNSwKKwkweDIwMzEsIDB4MDIxMywgMHgwMDA5LCAweDAwMDUsIDB4MDBjNiwgMHgwMDk2LCAweDAwZjYsIDB4NzAwMCwKKwkweDkwODQsIDB4ZjAwMCwgMHg5MDg2LCAweGMwMDAsIDB4MDVjMCwgMHgwODBjLCAweGFjNWEsIDB4MDVhOCwKKwkweDAwNjYsIDB4MDBjNiwgMHgwMDQ2LCAweDIwMTEsIDB4MDI2MywgMHgyMjA0LCAweDgyMTEsIDB4MjIwYywKKwkweDA4MGMsIDB4MjY2MSwgMHgxNTkwLCAweDA4MGMsIDB4NjYzMiwgMHgxNTc4LCAweGJlMTIsIDB4YmQxNiwKKwkweDJiMDAsIDB4MDA0ZSwgMHgwMGNlLCAweDYwMTIsIDB4MDgwYywgMHhjZTE1LCAweDA4MGMsIDB4MTA0NywKKwkweDA1MDAsIDB4MjkwMCwgMHg2MDYyLCAweDkwMDYsIDB4YTgwMiwgMHhhODY2LCAweGFjNmEsIDB4YTg1YywKKwkweDkwZjgsIDB4MDAxYiwgMHgyMGE5LCAweDAwMGUsIDB4YTg2MCwgMHgyMGU4LCAweDIwZTEsIDB4MDAwMCwKKwkweDJmYTAsIDB4MmU5OCwgMHg0MDAzLCAweDAwNmUsIDB4NjYxNiwgMHg2MDA3LCAweDAwM2UsIDB4NjAyMywKKwkweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTJiNywgMHgwMGZlLCAweDAwOWUsIDB4MDBjZSwKKwkweDAwMDUsIDB4MDgwYywgMHhhY2IwLCAweDAwNmUsIDB4MGNjMCwgMHgwMDRlLCAweDAwY2UsIDB4MGNjOCwKKwkweDAwYzYsIDB4NzAwMCwgMHg5MDhjLCAweGZmMDAsIDB4OTE4NCwgMHhmMDAwLCAweDgxMGYsIDB4OTA4NiwKKwkweDIwMDAsIDB4MTkwNCwgMHg4NTVmLCAweDkxODYsIDB4MDAyMiwgMHgxNWYwLCAweDIwMDEsIDB4MDExMSwKKwkweDIwMDQsIDB4OTAwNSwgMHgxOTA0LCAweDg1NjEsIDB4NzAzMCwgMHg5MDhlLCAweDA0MDAsIDB4MDkwNCwKKwkweDg1NjEsIDB4OTA4ZSwgMHg2MDAwLCAweDA1ZTgsIDB4OTA4ZSwgMHg1NDAwLCAweDA1ZDAsIDB4OTA4ZSwKKwkweDAzMDAsIDB4MTFkOCwgMHgyMDA5LCAweDE4MzcsIDB4MjEwYywgMHhkMThjLCAweDE1OTAsIDB4ZDFhNCwKKwkweDE1ODAsIDB4MDgwYywgMHg2YTliLCAweDA1ODgsIDB4NjhiMCwgMHg5MDg0LCAweDAwZmYsIDB4NzEwMCwKKwkweDkxOGMsIDB4MDBmZiwgMHg5MTA2LCAweDE1MTgsIDB4Njg4MCwgMHg2OWIwLCAweDkxOGMsIDB4ZmYwMCwKKwkweDkxMDUsIDB4NzEwNCwgMHg5MTA2LCAweDExZDgsIDB4MDBlMCwgMHgyMDA5LCAweDAxMDMsIDB4MjEwYywKKwkweGQxYjQsIDB4MTFhOCwgMHg5MDhlLCAweDUyMDAsIDB4MDllOCwgMHg5MDhlLCAweDA1MDAsIDB4MDlkMCwKKwkweDkwOGUsIDB4NTAwMCwgMHgwOWI4LCAweDAwNTgsIDB4OTE4NiwgMHgwMDIzLCAweDExNDAsIDB4MDgwYywKKwkweDg0NzcsIDB4MDEyOCwgMHg2MDA0LCAweDkwODYsIDB4MDAwMiwgMHgwMTE4LCAweDAwMDAsIDB4OTAwNiwKKwkweDAwMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwY2UsIDB4MDAwNSwgMHg3MDMwLCAweDkwOGUsIDB4MDMwMCwKKwkweDAxMTgsIDB4OTA4ZSwgMHg1MjAwLCAweDFkOTgsIDB4MjAwMSwgMHgxODM3LCAweDIwMDQsIDB4OTA4NCwKKwkweDAwMDksIDB4OTA4NiwgMHgwMDA4LCAweDBkNjgsIDB4MGM1MCwgMHgwMTU2LCAweDAwNDYsIDB4MDAxNiwKKwkweDAwMzYsIDB4NzAzOCwgMHgyMDIwLCAweDg0MjcsIDB4OTRhNCwgMHgwMDA3LCAweGQ0ODQsIDB4MDE0OCwKKwkweDIwYTksIDB4MDAwNCwgMHgyMDE5LCAweDE4MDUsIDB4MjAxMSwgMHgwMjdhLCAweDA4MGMsIDB4YmM4ZSwKKwkweDExNzgsIDB4ZDQ4YywgMHgwMTQ4LCAweDIwYTksIDB4MDAwNCwgMHgyMDE5LCAweDE4MDEsIDB4MjAxMSwKKwkweDAyN2UsIDB4MDgwYywgMHhiYzhlLCAweDExMjAsIDB4ZDQ5NCwgMHgwMTEwLCAweDkwODUsIDB4MDAwMSwKKwkweDAwM2UsIDB4MDAxZSwgMHgwMDRlLCAweDAxNWUsIDB4MDAwNSwgMHgwMTU2LCAweDAwNDYsIDB4MDAxNiwKKwkweDAwMzYsIDB4NzAzOCwgMHgyMDIwLCAweDg0MjcsIDB4OTRhNCwgMHgwMDA3LCAweGQ0ODQsIDB4MDE0OCwKKwkweDIwYTksIDB4MDAwNCwgMHgyMDE5LCAweDE4MDUsIDB4MjAxMSwgMHgwMjcyLCAweDA4MGMsIDB4YmM4ZSwKKwkweDExNzgsIDB4ZDQ4YywgMHgwMTQ4LCAweDIwYTksIDB4MDAwNCwgMHgyMDE5LCAweDE4MDEsIDB4MjAxMSwKKwkweDAyNzYsIDB4MDgwYywgMHhiYzhlLCAweDExMjAsIDB4ZDQ5NCwgMHgwMTEwLCAweDkwODUsIDB4MDAwMSwKKwkweDAwM2UsIDB4MDAxZSwgMHgwMDRlLCAweDAxNWUsIDB4MDAwNSwgMHgwMGY2LCAweDIwNzksIDB4MDIwMCwKKwkweDc4MDAsIDB4YzBlNSwgMHhjMGNjLCAweDc4MDIsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwKKwkweDE4MDAsIDB4NzgzNCwgMHhkMDg0LCAweDExMzAsIDB4MjA3OSwgMHgwMjAwLCAweDc4MDAsIDB4OTA4NSwKKwkweDEyMDAsIDB4NzgwMiwgMHgwMGZlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE4MDAsIDB4NzAzNCwKKwkweGMwODQsIDB4NzAzNiwgMHgwMGVlLCAweDAwMDUsIDB4MDAxNiwgMHgyMDAxLCAweDE4MzcsIDB4MjAwYywKKwkweDkxODQsIDB4MDA4MCwgMHgwMTE4LCAweGQxOGMsIDB4MDExOCwgMHg5MDA2LCAweDAwMWUsIDB4MDAwNSwKKwkweDkwODUsIDB4MDAwMSwgMHgwY2Q4LCAweDIwNzEsIDB4MWEwMiwgMHg3MDAzLCAweDAwMDMsIDB4NzAwZiwKKwkweDAzNjEsIDB4OTAwNiwgMHg3MDFhLCAweDcwNzIsIDB4NzAxMiwgMHg3MDE3LCAweDFkZGMsIDB4NzAwNywKKwkweDAwMDAsIDB4NzAyNiwgMHg3MDJiLCAweDllZjQsIDB4NzAzMiwgMHg3MDM3LCAweDlmNzEsIDB4NzAzZiwKKwkweGZmZmYsIDB4NzA0MiwgMHg3MDQ3LCAweDU1YzIsIDB4NzA0YSwgMHg3MDViLCAweDg3OWIsIDB4MDgwYywKKwkweDEwNjAsIDB4MDkwYywgMHgwZDdkLCAweDI5MDAsIDB4NzAzYSwgMHhhODY3LCAweDAwMDMsIDB4YTg2ZiwKKwkweDAxMDAsIDB4YThhYiwgMHhkY2IwLCAweDAwMDUsIDB4MjA3MSwgMHgxYTAyLCAweDFkMDQsIDB4ODZiNywKKwkweDIwOTEsIDB4NjAwMCwgMHg3MDBjLCAweDgwMDEsIDB4NzAwZSwgMHgxNTkwLCAweDIwMDEsIDB4MDEzYywKKwkweDIwMDQsIDB4OTAwNSwgMHgxOTBjLCAweDg4NDUsIDB4MjAwMSwgMHgxODY5LCAweDIwMDQsIDB4ZDBjNCwKKwkweDAxNTgsIDB4M2EwMCwgMHhkMDhjLCAweDExNDAsIDB4MjBkMSwgMHgwMDAwLCAweDIwZDEsIDB4MDAwMSwKKwkweDIwZDEsIDB4MDAwMCwgMHgwODBjLCAweDBkN2QsIDB4NzAwZiwgMHgwMzYxLCAweDcwMDcsIDB4MDAwMSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksIDB4MTgwMCwgMHg2OWVjLCAweGQxZTQsIDB4MTEzOCwKKwkweGQxZGMsIDB4MTExOCwgMHgwODBjLCAweDg4MDksIDB4MDAxMCwgMHgwODBjLCAweDg3ZTAsIDB4NzA0MCwKKwkweDkwMGQsIDB4MDE0OCwgMHg4MTA5LCAweDcxNDIsIDB4MTEzMCwgMHg3MDQ0LCAweDA4MGYsIDB4MDAxOCwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwMjQsIDB4OTAwZCwgMHgwMTg4LCAweDcwMjAsIDB4ODAwMSwKKwkweDcwMjIsIDB4MTE2OCwgMHg3MDIzLCAweDAwMDksIDB4ODEwOSwgMHg3MTI2LCAweDkxODYsIDB4MDNlOCwKKwkweDExMTAsIDB4NzAyOCwgMHgwODBmLCAweDgxZmYsIDB4MTExMCwgMHg3MDI4LCAweDA4MGYsIDB4NzAzMCwKKwkweDkwMGQsIDB4MDE4MCwgMHg3MDJjLCAweDgwMDEsIDB4NzAyZSwgMHgxMTYwLCAweDcwMmYsIDB4MDAwOSwKKwkweDgxMDksIDB4NzEzMiwgMHgwMTI4LCAweDkxODQsIDB4MDA3ZiwgMHgwOTBjLCAweGEwMGQsIDB4MDAxMCwKKwkweDcwMzQsIDB4MDgwZiwgMHg3MDNjLCAweDkwMDUsIDB4MDExOCwgMHgwMzEwLCAweDgwMDEsIDB4NzAzZSwKKwkweDcwNGMsIDB4OTAwZCwgMHgwMTY4LCAweDcwNDgsIDB4ODAwMSwgMHg3MDRhLCAweDExNDgsIDB4NzA0YiwKKwkweDAwMDksIDB4ODEwOSwgMHg3MTRlLCAweDExMjAsIDB4NzE1MCwgMHg3MTRlLCAweDcwNTgsIDB4MDgwZiwKKwkweDcwMTgsIDB4OTAwZCwgMHgwMWQ4LCAweDAwMTYsIDB4NzA3MCwgMHg5MDBkLCAweDAxNTgsIDB4NzA2YywKKwkweDgwMDEsIDB4NzA2ZSwgMHgxMTM4LCAweDcwNmYsIDB4MDAwOSwgMHg4MTA5LCAweDcxNzIsIDB4MTExMCwKKwkweDcwNzQsIDB4MDgwZiwgMHgwMDFlLCAweDcwMDgsIDB4ODAwMSwgMHg3MDBhLCAweDExMzgsIDB4NzAwYiwKKwkweDAwMDksIDB4ODEwOSwgMHg3MTFhLCAweDExMTAsIDB4NzAxYywgMHgwODBmLCAweDAxMmUsIDB4NzAwNCwKKwkweDAwMDIsIDB4ODZkZiwgMHg4NmUwLCAweDg3MGEsIDB4MDBlNiwgMHgyMDcxLCAweDFhMDIsIDB4NzAxOCwKKwkweDkwMDUsIDB4MTEyMCwgMHg3MTFhLCAweDcyMWUsIDB4NzAwYiwgMHgwMDA5LCAweDAwZWUsIDB4MDAwNSwKKwkweDAwZTYsIDB4MDAwNiwgMHgyMDcxLCAweDFhMDIsIDB4NzAxYywgMHg5MjA2LCAweDExMjAsIDB4NzAxYSwKKwkweDcwMWUsIDB4NzA3MiwgMHg3MDc2LCAweDAwMGUsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwKKwkweDFhMDIsIDB4Yjg4OCwgMHg5MTAyLCAweDAyMDgsIDB4Yjk4YSwgMHgwMGVlLCAweDAwMDUsIDB4MDAwNSwKKwkweDAwYjYsIDB4MjAzMSwgMHgwMDEwLCAweDcxMTAsIDB4MDgwYywgMHg2NjkzLCAweDExYTgsIDB4Yjg4OCwKKwkweDgwMDEsIDB4MDI5MCwgMHhiODhhLCAweDExODAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDA2NiwKKwkweGI4ZDAsIDB4OTAwNSwgMHgwMTM4LCAweDAwMjYsIDB4YmEzYywgMHgwMDE2LCAweDA4MGMsIDB4NjdiZSwKKwkweDAwMWUsIDB4MDAyZSwgMHgwMDZlLCAweDAxMmUsIDB4ODEwOCwgMHg5MTgyLCAweDA4MDAsIDB4MTIyMCwKKwkweDg2MzEsIDB4MDEyOCwgMHg3MTEyLCAweDBjMDAsIDB4OTAwZSwgMHg3MDA3LCAweDAwMDIsIDB4NzExMiwKKwkweDAwYmUsIDB4MDAwNSwgMHgyMDMxLCAweDAwMTAsIDB4NzAxNCwgMHgyMDYwLCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4NjA0OCwgMHg5MDA1LCAweDAxMjgsIDB4ODAwMSwgMHg2MDRhLCAweDExMTAsIDB4MDgwYywKKwkweGNjOTYsIDB4NjAxOCwgMHg5MDA1LCAweDA5MDQsIDB4ODc2MiwgMHgwMGY2LCAweDIwNzksIDB4MDMwMCwKKwkweDc5MTgsIDB4ZDFiNCwgMHgxOTA0LCAweDg3NzUsIDB4NzgxYiwgMHgyMDIwLCAweGEwMDEsIDB4NzkxOCwKKwkweGQxYjQsIDB4MDEyMCwgMHg3ODFiLCAweDIwMDAsIDB4MDgwNCwgMHg4Nzc1LCAweDgwMDEsIDB4NjAxYSwKKwkweDAxMDYsIDB4NzgxYiwgMHgyMDAwLCAweGEwMDEsIDB4NzkxOCwgMHhkMWFjLCAweDFkZDAsIDB4MDEwZSwKKwkweDAwZmUsIDB4MTU0MCwgMHg2MTIwLCAweDkxODYsIDB4MDAwMywgMHgwMTQ4LCAweDkxODYsIDB4MDAwNiwKKwkweDAxMzAsIDB4OTE4NiwgMHgwMDA5LCAweDExZTAsIDB4NjExYywgMHhkMWM0LCAweDExMDAsIDB4MDgwYywKKwkweGM5N2EsIDB4MDFiMCwgMHg2MDE0LCAweDIwNDgsIDB4YTg4NCwgMHg5MDhhLCAweDE5OWEsIDB4MDI4MCwKKwkweDkwODIsIDB4MTk5OSwgMHhhODg2LCAweDkwOGEsIDB4MTk5YSwgMHgwMjEwLCAweDIwMDEsIDB4MTk5OSwKKwkweDgwMDMsIDB4ODAwYiwgMHg4MTBiLCAweDkxMDgsIDB4NjExYSwgMHgwODBjLCAweGQwYzcsIDB4MDExMCwKKwkweDA4MGMsIDB4YzY1YiwgMHgwMTJlLCAweDljODgsIDB4MDAxYywgMHg3MTE2LCAweDIwMDEsIDB4MTgxYSwKKwkweDIwMDQsIDB4OTEwMiwgMHgxMjI4LCAweDg2MzEsIDB4MDEzOCwgMHgyMTYwLCAweDA4MDQsIDB4ODcwZSwKKwkweDcwMTcsIDB4MWRkYywgMHg3MDA3LCAweDAwMDAsIDB4MDAwNSwgMHgwMGZlLCAweDBjNTgsIDB4MDBlNiwKKwkweDIwNzEsIDB4MWEwMiwgMHg3MDI3LCAweDA3ZDAsIDB4NzAyMywgMHgwMDA5LCAweDAwZWUsIDB4MDAwNSwKKwkweDIwMDEsIDB4MWEwYiwgMHgyMDAzLCAweDAwMDAsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MWEwMiwKKwkweDcxMzIsIDB4NzAyZiwgMHgwMDA5LCAweDAwZWUsIDB4MDAwNSwgMHgyMDExLCAweDFhMGUsIDB4MjAxMywKKwkweDAwMDAsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MWEwMiwgMHg3MTFhLCAweDcyMWUsIDB4NzAwYiwKKwkweDAwMDksIDB4MDBlZSwgMHgwMDA1LCAweDAwODYsIDB4MDAyNiwgMHg3MDU0LCAweDgwMDAsIDB4NzA1NiwKKwkweDIwMDEsIDB4MWExMCwgMHgyMDQ0LCAweGEwNmMsIDB4OTA4NiwgMHgwMDAwLCAweDAxNTAsIDB4NzA2OCwKKwkweGEwOWEsIDB4NzA2NCwgMHhhMDk2LCAweDcwNjAsIDB4YTA5MiwgMHg3MDVjLCAweGEwOGUsIDB4MDgwYywKKwkweDExM2MsIDB4MDAyZSwgMHgwMDhlLCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDAwOTYsIDB4MDBhNiwKKwkweDAwYjYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgwMTU2LCAweDA4MGMsIDB4ODYxYywKKwkweDAxNWUsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMGJlLCAweDAwYWUsIDB4MDA5ZSwKKwkweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgxYTAyLCAweDcxNzIsIDB4NzI3NiwKKwkweDcwNmYsIDB4MDAwOSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgwMDA2LCAweDIwNzEsIDB4MWEwMiwKKwkweDcwNzQsIDB4OTIwNiwgMHgxMTEwLCAweDcwNzIsIDB4NzA3NiwgMHgwMDBlLCAweDAwZWUsIDB4MDAwNSwKKwkweDIwNjksIDB4MTgwMCwgMHg2OWVjLCAweGQxZTQsIDB4MTUxOCwgMHgwMDI2LCAweGQxZWMsIDB4MDE0MCwKKwkweDZhNTQsIDB4Njg3NCwgMHg5MjAyLCAweDAyODgsIDB4ODExNywgMHg5Mjk0LCAweDAwYzEsIDB4MDA4OCwKKwkweDkxODQsIDB4MDAwNywgMHgwMWEwLCAweDgxMDksIDB4OTE4NCwgMHgwMDA3LCAweDAxMTAsIDB4NjllZSwKKwkweDAwNzAsIDB4ODEwNywgMHg5MDg0LCAweDAwMDcsIDB4OTEwZCwgMHg4MTA3LCAweDkxMDYsIDB4OTA5NCwKKwkweDAwYzEsIDB4OTE4NCwgMHhmZjNlLCAweDkyMDUsIDB4NjhlZSwgMHgwODBjLCAweDBmMTIsIDB4MDAyZSwKKwkweDAwMDUsIDB4NjllOCwgMHg5MTg0LCAweDAwM2YsIDB4MDViOCwgMHg4MTA5LCAweDkxODQsIDB4MDAzZiwKKwkweDAxYTgsIDB4NmE1NCwgMHg2ODc0LCAweDkyMDIsIDB4MDIyMCwgMHhkMWJjLCAweDAxNjgsIDB4YzFiYywKKwkweDAwMTgsIDB4ZDFiYywgMHgxMTQ4LCAweGMxYmQsIDB4MjExMCwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwKKwkweDA4MGMsIDB4MGYzNCwgMHgwMGVlLCAweDA0MDAsIDB4NjllYSwgMHgwMGYwLCAweDAwMjYsIDB4ODEwNywKKwkweDkwOTQsIDB4MDAwNywgMHgwMTI4LCAweDgwMDEsIDB4ODAwNywgMHg5MDg1LCAweDAwMDcsIDB4MDA1MCwKKwkweDIwMTAsIDB4ODAwNCwgMHg4MDA0LCAweDgwMDQsIDB4OTA4NCwgMHgwMDA3LCAweDkyMDUsIDB4ODAwNywKKwkweDkwODUsIDB4MDAyOCwgMHg5MDg2LCAweDAwNDAsIDB4MjAxMCwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwKKwkweDA4MGMsIDB4MGYzNCwgMHgwMGVlLCAweDAwMmUsIDB4MDAwNSwgMHgwMDE2LCAweDAwYzYsIDB4MjAwOSwKKwkweGZmZjQsIDB4MjEwZCwgMHgyMDYxLCAweDAxMDAsIDB4NjBmMCwgMHg5MTAwLCAweDYwZjMsIDB4MDAwMCwKKwkweDIwMDksIDB4ZmZmNCwgMHgyMDBmLCAweDEyMjAsIDB4ODEwOCwgMHgyMTA1LCAweDgwMDAsIDB4MjAwZiwKKwkweDAwY2UsIDB4MDAxZSwgMHgwMDA1LCAweDAwYzYsIDB4MjA2MSwgMHgxYTZlLCAweDAwY2UsIDB4MDAwNSwKKwkweDkxODQsIDB4MDAwZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHg5MDgwLCAweDFhNmUsIDB4MjA2MCwKKwkweDAwMDUsIDB4YTg4NCwgMHg5MDhhLCAweDE5OWEsIDB4MTYzOCwgMHg5MDA1LCAweDExNTAsIDB4MDBjNiwKKwkweDIwNjEsIDB4MWE2ZSwgMHg2MDE0LCAweDAwY2UsIDB4OTAwNSwgMHgxMTMwLCAweDIwMDEsIDB4MDAxZSwKKwkweDAwMTgsIDB4OTA4ZSwgMHhmZmZmLCAweDAxYjAsIDB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4OTEwOCwKKwkweDYxMWEsIDB4YTg3YywgMHg5MDhjLCAweDAwYzAsIDB4OTE4ZSwgMHgwMGMwLCAweDA5MDQsIDB4ODkyMywKKwkweGQwYjQsIDB4MTE2OCwgMHhkMGJjLCAweDE5MDQsIDB4ODhmYywgMHgyMDA5LCAweDAwMDYsIDB4MDgwYywKKwkweDg5NTAsIDB4MDAwNSwgMHg5MDBlLCAweDBjNjAsIDB4MjAwMSwgMHgxOTk5LCAweDA4YjAsIDB4ZDBmYywKKwkweDA1ZTAsIDB4OTA4YywgMHgyMDIzLCAweDE1NjgsIDB4ODdmZiwgMHgxNTU4LCAweGE5YTgsIDB4ODFmZiwKKwkweDE1NDAsIDB4NjEyNCwgMHg5MThjLCAweDA1MDAsIDB4MTUyMCwgMHg2MTAwLCAweDkxOGUsIDB4MDAwNywKKwkweDE1MDAsIDB4MjAwOSwgMHgxODY5LCAweDIxMGMsIDB4ZDE4NCwgMHgxMWQ4LCAweDYwMDMsIDB4MDAwMywKKwkweDYwMDcsIDB4MDA0MywgMHg2MDQ3LCAweGIwMzUsIDB4MDgwYywgMHgxYzU5LCAweGE4N2MsIDB4YzBkZCwKKwkweGE4N2UsIDB4NjAwZiwgMHgwMDAwLCAweDAwZjYsIDB4MjA3OSwgMHgwMzgwLCAweDc4MTgsIDB4ZDBiYywKKwkweDFkZTgsIDB4NzgzMywgMHgwMDEzLCAweDJjMDAsIDB4NzgzNiwgMHg3ODFiLCAweDgwODAsIDB4MDBmZSwKKwkweDAwMDUsIDB4OTA4YywgMHgwMDAzLCAweDAxMjAsIDB4OTE4ZSwgMHgwMDAzLCAweDE5MDQsIDB4ODk0YSwKKwkweDkwOGMsIDB4MjAyMCwgMHg5MThlLCAweDIwMjAsIDB4MDFhOCwgMHg2MDI0LCAweGQwZDQsIDB4MTFlOCwKKwkweDIwMDksIDB4MTg2OSwgMHgyMTA0LCAweGQwODQsIDB4MTEzOCwgMHg4N2ZmLCAweDExMjAsIDB4MjAwOSwKKwkweDAwNDMsIDB4MDgwNCwgMHhhZDRkLCAweDAwMDUsIDB4ODdmZiwgMHgxZGU4LCAweDIwMDksIDB4MDA0MiwKKwkweDA4MDQsIDB4YWQ0ZCwgMHg2MTEwLCAweDAwYjYsIDB4MjE1OCwgMHhiOTAwLCAweDAwYmUsIDB4ZDFhYywKKwkweDBkMjAsIDB4NjAyNCwgMHhjMGNkLCAweDYwMjYsIDB4MGMwMCwgMHhjMGQ0LCAweDYwMjYsIDB4YTg5MCwKKwkweDYwMmUsIDB4YTg4YywgMHg2MDMyLCAweDA4ZTAsIDB4ZDBmYywgMHgwMTYwLCAweDkwOGMsIDB4MDAwMywKKwkweDAxMjAsIDB4OTE4ZSwgMHgwMDAzLCAweDE5MDQsIDB4ODk0YSwgMHg5MDhjLCAweDIwMjAsIDB4OTE4ZSwKKwkweDIwMjAsIDB4MDE3MCwgMHgwMDc2LCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweDE3NzgsIDB4MDBmZSwKKwkweDAwN2UsIDB4ODdmZiwgMHgxMTIwLCAweDIwMDksIDB4MDA0MiwgMHgwODBjLCAweGFkNGQsIDB4MDAwNSwKKwkweDYxMTAsIDB4MDBiNiwgMHgyMTU4LCAweGI5MDAsIDB4MDBiZSwgMHhkMWFjLCAweDBkNTgsIDB4NjEyNCwKKwkweGMxY2QsIDB4NjEyNiwgMHgwYzM4LCAweGQwZmMsIDB4MDE4OCwgMHg5MDhjLCAweDIwMjAsIDB4OTE4ZSwKKwkweDIwMjAsIDB4MDFhOCwgMHg5MDg0LCAweDAwMDMsIDB4OTA4ZSwgMHgwMDAyLCAweDAxNDgsIDB4ODdmZiwKKwkweDExMjAsIDB4MjAwOSwgMHgwMDQxLCAweDA4MGMsIDB4YWQ0ZCwgMHgwMDA1LCAweDAwYjksIDB4MGNlOCwKKwkweDg3ZmYsIDB4MWRkOCwgMHgyMDA5LCAweDAwNDMsIDB4MDgwYywgMHhhZDRkLCAweDBjYjAsIDB4NjExMCwKKwkweDAwYjYsIDB4MjE1OCwgMHhiOTAwLCAweDAwYmUsIDB4ZDFhYywgMHgwZDIwLCAweDYxMjQsIDB4YzFjZCwKKwkweDYxMjYsIDB4MGMwMCwgMHgyMDA5LCAweDAwMDQsIDB4MDAxOSwgMHgwMDA1LCAweDIwMDksIDB4MDAwMSwKKwkweDAwOTYsIDB4MDgwYywgMHhjOTdhLCAweDA1MTgsIDB4NjAxNCwgMHgyMDQ4LCAweGE5ODIsIDB4YTgwMCwKKwkweDYwMTYsIDB4OTE4NiwgMHgwMDAxLCAweDExODgsIDB4YTk3YywgMHg5MThjLCAweDgxMDAsIDB4OTE4ZSwKKwkweDgxMDAsIDB4MTE1OCwgMHgwMGM2LCAweDIwNjEsIDB4MWE2ZSwgMHg2MjAwLCAweGQyOGMsIDB4MTEyMCwKKwkweDYyMDQsIDB4ODIxMCwgMHgwMjA4LCAweDYyMDYsIDB4MDBjZSwgMHgwODBjLCAweDZjMjMsIDB4NjAxNCwKKwkweDkwNGQsIDB4MDA3NiwgMHgyMDM5LCAweDAwMDAsIDB4MTkwYywgMHg4ODY5LCAweDAwN2UsIDB4MDA5ZSwKKwkweDAwMDUsIDB4MDE1NiwgMHgwMGM2LCAweDIwNjEsIDB4MWE2ZSwgMHg2MDAwLCAweDgxZmYsIDB4MDExMCwKKwkweDkyMDUsIDB4MDAwOCwgMHg5MjA0LCAweDYwMDIsIDB4MDBjZSwgMHgwMTVlLCAweDAwMDUsIDB4NjgwMCwKKwkweGQwOGMsIDB4MTEzOCwgMHg2ODA4LCAweDkwMDUsIDB4MDEyMCwgMHg4MDAxLCAweDY4MGEsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAwNSwgMHgyMDcxLCAweDE5MjMsIDB4NzAwMywgMHgwMDA2LCAweDcwMDcsIDB4MDAwMCwKKwkweDcwMGYsIDB4MDAwMCwgMHg3MDEzLCAweDAwMDEsIDB4MDgwYywgMHgxMDYwLCAweDA5MGMsIDB4MGQ3ZCwKKwkweGE4NjcsIDB4MDAwNiwgMHhhODZiLCAweDAwMDEsIDB4YThhYiwgMHhkY2IwLCAweGE4OWYsIDB4MDAwMCwKKwkweDI5MDAsIDB4NzAyZSwgMHg3MDMzLCAweDAwMDAsIDB4MDAwNSwgMHgwMDk2LCAweDAwZTYsIDB4MjA3MSwKKwkweDE5MjMsIDB4NzAyYywgMHgyMDQ4LCAweDZhMmMsIDB4NzIxZSwgMHg2YjMwLCAweDczMjIsIDB4NjgzNCwKKwkweDcwMjYsIDB4YTg5NiwgMHg2ODM4LCAweDcwMmEsIDB4YTg5YSwgMHg2ODI0LCAweDcwMTYsIDB4NjgzYywKKwkweDcwMWEsIDB4MjAwOSwgMHgwMDI4LCAweDIwMGEsIDB4OTAwNSwgMHgwMTQ4LCAweDkwMGUsIDB4OTE4OCwKKwkweDAwMGMsIDB4ODAwMSwgMHgxZGUwLCAweDIxMDAsIDB4OTIxMCwgMHgxMjA4LCAweDgzMTgsIDB4YWE4ZSwKKwkweGFiOTIsIDB4NzAxMCwgMHhkMDg0LCAweDAxNjgsIDB4YzA4NCwgMHg3MDA3LCAweDAwMDEsIDB4NzAwZiwKKwkweDAwMDAsIDB4MDAwNiwgMHgyMDA5LCAweDFiNTAsIDB4MjEwNCwgMHg5MDgyLCAweDAwMDcsIDB4MjAwYSwKKwkweDAwMGUsIDB4YzA5NSwgMHg3MDEyLCAweDIwMDgsIDB4MjAwMSwgMHgwMDNiLCAweDA4MGMsIDB4MTZhMCwKKwkweDkwMDYsIDB4MjA3MSwgMHgxOTNjLCAweDcwMDIsIDB4NzAwNiwgMHg3MDJhLCAweDAwZWUsIDB4MDA5ZSwKKwkweDAwMDUsIDB4MjAwOSwgMHgxYjUwLCAweDIxMDQsIDB4OTA4MCwgMHgwMDA3LCAweDIwMGEsIDB4MDAwNSwKKwkweDAwZTYsIDB4MDEyNiwgMHgwMTU2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDE4MDAsIDB4NzE1NCwKKwkweDIwMDEsIDB4MDAwOCwgMHg5MTBhLCAweDA2MzgsIDB4MjAwMSwgMHgxODdkLCAweDIwYWMsIDB4OTAwNiwKKwkweDkwODAsIDB4MDAwOCwgMHgxZjA0LCAweDhhMDgsIDB4NzFjMCwgMHg5MTAyLCAweDAyZTAsIDB4MjA3MSwKKwkweDE4NzcsIDB4MjBhOSwgMHgwMDA3LCAweDAwYzYsIDB4MDgwYywgMHhhYzVhLCAweDYwMjMsIDB4MDAwOSwKKwkweDYwMDMsIDB4MDAwNCwgMHg2MDFmLCAweDAxMDEsIDB4MDA4OSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4OGI4OSwgMHgwMTJlLCAweDFmMDQsIDB4OGExNCwgMHg5MDA2LCAweDAwY2UsIDB4MDE1ZSwKKwkweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweDkwODUsIDB4MDAwMSwgMHgwY2M4LCAweDAwZTYsIDB4MDBiNiwKKwkweDAwOTYsIDB4MDA4NiwgMHgwMDU2LCAweDAwNDYsIDB4MDAyNiwgMHg3MTE4LCAweDcyMGMsIDB4NzYyMCwKKwkweDcwMDQsIDB4ZDA4NCwgMHgxMTI4LCAweDIwMjEsIDB4MDAyNCwgMHgyMDI5LCAweDAwMDIsIDB4MDAyMCwKKwkweDIwMjEsIDB4MDAyYywgMHgyMDI5LCAweDAwMGEsIDB4MDgwYywgMHgxMDQ3LCAweDA5MGMsIDB4MGQ3ZCwKKwkweDI5MDAsIDB4NjAxNiwgMHgyMDU4LCAweGFjNjYsIDB4OTAwNiwgMHhhODAyLCAweGE4MDYsIDB4YTg2YSwKKwkweGE4N2EsIDB4YThhYSwgMHhhODg3LCAweDAwMDUsIDB4YTg3ZiwgMHgwMDIwLCAweDcwMDgsIDB4YTg5YSwKKwkweDcwMTAsIDB4YTg5ZSwgMHhhZThhLCAweGE4YWYsIDB4ZmZmZiwgMHhhOGIzLCAweDAwMDAsIDB4ODEwOSwKKwkweDAxNjAsIDB4MDgwYywgMHgxMDQ3LCAweDA5MGMsIDB4MGQ3ZCwgMHhhZDY2LCAweDJiMDAsIDB4YTgwMiwKKwkweDI5MDAsIDB4YjgwNiwgMHgyMDU4LCAweDgxMDksIDB4MWRhMCwgMHgwMDJlLCAweDAwNGUsIDB4MDA1ZSwKKwkweDAwOGUsIDB4MDA5ZSwgMHgwMGJlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDc5LCAweDAwMDAsIDB4MjA3MSwKKwkweDE5MjMsIDB4NzAwNCwgMHgwMDRiLCAweDcwMGMsIDB4MDAwMiwgMHg4YTgwLCAweDhhNzksIDB4OGE3OSwKKwkweDAwMDUsIDB4OGE4YSwgMHg4YWUwLCAweDhhZTAsIDB4OGFlMCwgMHg4YWUxLCAweDhhZjIsIDB4OGFmMiwKKwkweDcwMGMsIDB4MGNiYSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3OGEwLCAweDc5YTAsIDB4OTEwNiwKKwkweDE5MDQsIDB4OGFkMiwgMHg3ODE0LCAweGQwYmMsIDB4MTkwNCwgMHg4YWRiLCAweDAxMmUsIDB4NzAxOCwKKwkweDkxMGEsIDB4MTEyOCwgMHg3MDMwLCAweDkwMDUsIDB4MTkwNCwgMHg4YjI0LCAweDAwMDUsIDB4MTIxMCwKKwkweDcxMTQsIDB4OTEwYSwgMHg5MTkyLCAweDAwMGEsIDB4MDIxMCwgMHgyMDA5LCAweDAwMGEsIDB4MjAwMSwKKwkweDE4ODgsIDB4MjAxNCwgMHgyMDAxLCAweDE5MzUsIDB4MjAwNCwgMHg5MTAwLCAweDkyMDIsIDB4MGU1MCwKKwkweDA4MGMsIDB4OGM3ZCwgMHgyMjAwLCAweDkxMDIsIDB4MDIwOCwgMHgyMjA4LCAweDAwOTYsIDB4NzAyYywKKwkweDIwNDgsIDB4YTg3MywgMHgwMDAxLCAweGE5NzYsIDB4MDgwYywgMHg4ZDg2LCAweDIxMDAsIDB4YTg3ZSwKKwkweGE4NmYsIDB4MDAwMCwgMHgwMDllLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDksIDB4MWEyMCwKKwkweDIxMDQsIDB4YzA4NSwgMHgyMDBhLCAweDcwMGYsIDB4MDAwMiwgMHgwMTJlLCAweDA4MGMsIDB4MTE1YiwKKwkweDFkZTgsIDB4MDAwNSwgMHg3OGEwLCAweDc5YTAsIDB4OTEwNiwgMHgwOTA0LCAweDhhOTIsIDB4MDgwYywKKwkweDhjNTUsIDB4MDEyZSwgMHgwMDA1LCAweDc4MTAsIDB4YzBjNSwgMHg3ODEyLCAweDA4MDQsIDB4OGE5MiwKKwkweDAwMDUsIDB4NzAwYywgMHgwMDAyLCAweDhhZTYsIDB4OGFlOSwgMHg4YWU4LCAweDA4MGMsIDB4OGE4OCwKKwkweDAwMDUsIDB4ODAwMSwgMHg3MDBlLCAweDAwOTYsIDB4NzAyYywgMHgyMDQ4LCAweGE5NzQsIDB4MDA5ZSwKKwkweDAwMTEsIDB4MGNhMCwgMHgwMDA1LCAweDAwOTYsIDB4NzAyYywgMHgyMDQ4LCAweDcwMTgsIDB4OTEwMCwKKwkweDcyMTQsIDB4OTIxYSwgMHgxMTMwLCAweDcwMWMsIDB4YTg4ZSwgMHg3MDIwLCAweGE4OTIsIDB4OTAwNiwKKwkweDAwNjgsIDB4MDAwNiwgMHgwODBjLCAweDhkODYsIDB4MjEwMCwgMHhhYThjLCAweDkyMTAsIDB4YWE4ZSwKKwkweDEyMjAsIDB4YTg5MCwgMHg5MDgxLCAweDAwMDAsIDB4YTg5MiwgMHgwMDBlLCAweDAwOWUsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHg3OGEyLCAweDcwMWEsIDB4MDgwYywgMHg4YzU1LCAweDAxMmUsIDB4MDAwNSwKKwkweDAwZTYsIDB4MjA3MSwgMHgxOTIzLCAweDcwMGMsIDB4MDAwMiwgMHg4YjIyLCAweDhiMjIsIDB4OGIyMCwKKwkweDcwMGYsIDB4MDAwMSwgMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAzMCwKKwkweDkwMDUsIDB4MDUwOCwgMHgyMDc4LCAweDc4MTQsIDB4MjA0OCwgMHhhZTg4LCAweDAwYjYsIDB4MjA1OSwKKwkweDAwMDAsIDB4MDgwYywgMHg4YjkyLCAweDAwYmUsIDB4MDFiMCwgMHgwMGU2LCAweDIwNzEsIDB4MTkzYywKKwkweDA4MGMsIDB4OGJkOSwgMHgwMGVlLCAweDAxNzgsIDB4MDA5NiwgMHgwODBjLCAweDEwNjAsIDB4MjkwMCwKKwkweDAwOWUsIDB4MDE0OCwgMHhhOGFhLCAweDA0ZDEsIDB4MDA0MSwgMHgyMDAxLCAweDE5NDYsIDB4MjAwMywKKwkweDAwMDAsIDB4MDEyZSwgMHgwOGM4LCAweDAxMmUsIDB4MDAwNSwgMHgwMGQ2LCAweDAwYzYsIDB4MDA4NiwKKwkweDAwYTYsIDB4Mjk0MCwgMHgyNjUwLCAweDI2MDAsIDB4OTAwNSwgMHgwMTgwLCAweGE4NjQsIDB4OTA4NCwKKwkweDAwMGYsIDB4MjA2OCwgMHg5ZDg4LCAweDFlYWIsIDB4MjE2NSwgMHgwMDU2LCAweDIwMjksIDB4MDAwMCwKKwkweDA4MGMsIDB4OGQwYiwgMHgwODBjLCAweDFlODEsIDB4MWRkOCwgMHgwMDVlLCAweDAwYWUsIDB4MjAwMSwKKwkweDE4N2YsIDB4MjAwNCwgMHhhODhhLCAweDAwYzYsIDB4MmY2MCwgMHgwODBjLCAweDE3NzgsIDB4MDBjZSwKKwkweDc4MWYsIDB4MDEwMSwgMHg3ODEzLCAweDAwMDAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweDhiZTgsIDB4MDEyZSwgMHgwMDhlLCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweDcwMzAsIDB4OTAwNSwKKwkweDAxMzgsIDB4MjA3OCwgMHg3ODBjLCAweDcwMzIsIDB4MjAwMSwgMHgxOTQ2LCAweDIwMDMsIDB4MDAwMSwKKwkweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE5MjMsIDB4NzAzMCwgMHg2MDBlLCAweDJjMDAsIDB4NzAzMiwKKwkweDAwZWUsIDB4MDAwNSwgMHgwMGQ2LCAweDAwYzYsIDB4MDAyNiwgMHg5YjgwLCAweDhlNTQsIDB4MjAwNSwKKwkweDkwNmQsIDB4MDkwYywgMHgwZDdkLCAweDliODAsIDB4OGU0YywgMHgyMDA1LCAweDkwNjUsIDB4MDkwYywKKwkweDBkN2QsIDB4NjExNCwgMHgyNjAwLCAweDkxMDIsIDB4MDI0OCwgMHg2ODI4LCAweDkxMDIsIDB4MDJmMCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDJlLCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweDY4MDQsIDB4ZDA5NCwKKwkweDAxNDgsIDB4Njg1NCwgMHhkMDg0LCAweDExNzgsIDB4YzA4NSwgMHg2ODU2LCAweDIwMTEsIDB4ODAyNiwKKwkweDA4MGMsIDB4NGI1MiwgMHg2ODRjLCAweDAwOTYsIDB4OTA0ZCwgMHgwOTBjLCAweDBkN2QsIDB4YTgwNCwKKwkweDgwMDAsIDB4YTgwNiwgMHgwMDllLCAweDkwMDYsIDB4MjAzMCwgMHgwYzIwLCAweDY4NTQsIDB4ZDA4YywKKwkweDFkMDgsIDB4YzA4ZCwgMHg2ODU2LCAweDIwMTEsIDB4ODAyNSwgMHgwODBjLCAweDRiNTIsIDB4Njg0YywKKwkweDAwOTYsIDB4OTA0ZCwgMHgwOTBjLCAweDBkN2QsIDB4YTgwMCwgMHg4MDAwLCAweGE4MDIsIDB4MDA5ZSwKKwkweDA4ODgsIDB4NzAwMCwgMHgyMDE5LCAweDAwMDgsIDB4ODMxOSwgMHg3MTA0LCAweDkxMDIsIDB4MTExOCwKKwkweDIzMDAsIDB4OTAwNSwgMHgwMDIwLCAweDAyMTAsIDB4OTMwMiwgMHgwMDA4LCAweDgwMDIsIDB4MDAwNSwKKwkweDAwZDYsIDB4NzgxNCwgMHg5MDA1LCAweDA5MGMsIDB4MGQ3ZCwgMHg3ODFjLCAweDkwODQsIDB4MDEwMSwKKwkweDkwODYsIDB4MDEwMSwgMHgxOTBjLCAweDBkN2QsIDB4NzgyNywgMHgwMDAwLCAweDIwNjksIDB4MTkzYywKKwkweDY4MDQsIDB4OTA4MCwgMHgxOTNlLCAweDJmMDgsIDB4MjEwMiwgMHg2OTA0LCAweDgxMDgsIDB4OTE4MiwKKwkweDAwMDgsIDB4MDIwOCwgMHg5MDBlLCAweDY5MDYsIDB4OTE4MCwgMHgxOTNlLCAweDIwMDMsIDB4MDAwMCwKKwkweDAwZGUsIDB4MDAwNSwgMHgwMDk2LCAweDAwYzYsIDB4MjA2MCwgMHg2MDE0LCAweDIwNDgsIDB4YThhOCwKKwkweDAwOTYsIDB4MjA0OCwgMHg5MDA1LCAweDE5MGMsIDB4MTA3OSwgMHgwMDllLCAweGE4YWIsIDB4MDAwMCwKKwkweDA4MGMsIDB4MGZmOSwgMHgwODBjLCAweGFjYjAsIDB4MDBjZSwgMHgwMDllLCAweDAwMDUsIDB4NjAyMCwKKwkweDkwODYsIDB4MDAwOSwgMHgxMTI4LCAweDYwMWMsIDB4ZDBjNCwgMHgwMTEwLCAweDkwMDYsIDB4MDAwNSwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDAxNzgsIDB4NjAxMCwKKwkweDkwMDUsIDB4MDE1MCwgMHgwMGI2LCAweDIwNTgsIDB4MDgwYywgMHg4Zjg5LCAweDAwYmUsIDB4NjAxMywKKwkweDAwMDAsIDB4NjAxYiwgMHgwMDAwLCAweDAwMTAsIDB4MmMwMCwgMHgwODYxLCAweDAwMDUsIDB4MjAwOSwKKwkweDE5MjcsIDB4MjEwYywgMHhkMTk0LCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE5MjMsIDB4NzExMCwKKwkweGMxOTQsIDB4ZDE5YywgMHgxMTE4LCAweGMxODUsIDB4NzAwNywgMHgwMDAwLCAweDcxMTIsIDB4MjAwMSwKKwkweDAwM2IsIDB4MDgwYywgMHgxNmEwLCAweDAwZWUsIDB4MDAwNSwgMHg3ODE0LCAweGQwYmMsIDB4MTEwOCwKKwkweDAwMDUsIDB4NzgxMCwgMHhjMGM1LCAweDc4MTIsIDB4MGNjMCwgMHgwMDk2LCAweDAwZDYsIDB4OTAwNiwKKwkweDcwMDYsIDB4NzAwZSwgMHg3MDFhLCAweDcwMWUsIDB4NzAyMiwgMHg3MDE2LCAweDcwMmEsIDB4NzAyNiwKKwkweDcwMmYsIDB4MDAwMCwgMHgwODBjLCAweDhkZDQsIDB4MDE3MCwgMHgwODBjLCAweDhlMDksIDB4MDE1OCwKKwkweDI5MDAsIDB4NzAwMiwgMHg3MDBhLCAweDcwMWEsIDB4NzAxMywgMHgwMDAxLCAweDcwMWYsIDB4MDAwYSwKKwkweDAwZGUsIDB4MDA5ZSwgMHgwMDA1LCAweDkwMGUsIDB4MGNkOCwgMHgwMGU2LCAweDAwOTYsIDB4MDA4NiwKKwkweDAwZDYsIDB4MDBjNiwgMHgyMDcxLCAweDE5MzAsIDB4NzIxYywgMHgyMTAwLCAweDkyMDIsIDB4MTYxOCwKKwkweDA4MGMsIDB4OGUwOSwgMHgwOTBjLCAweDBkN2QsIDB4NzAxOCwgMHg5MDA1LCAweDExNjAsIDB4MjkwMCwKKwkweDcwMDIsIDB4NzAwYSwgMHg3MDFhLCAweDkwMDYsIDB4NzAwNiwgMHg3MDBlLCAweGE4MDYsIDB4YTgwMiwKKwkweDcwMTIsIDB4NzAxZSwgMHgwMDM4LCAweDIwNDAsIDB4YTgwNiwgMHgyOTAwLCAweGEwMDIsIDB4NzAxYSwKKwkweGE4MDMsIDB4MDAwMCwgMHg3MDEwLCAweDgwMDAsIDB4NzAxMiwgMHg3MDFjLCAweDkwODAsIDB4MDAwYSwKKwkweDcwMWUsIDB4NzIxYywgMHgwOGQwLCAweDcyMWMsIDB4MDBjZSwgMHgwMGRlLCAweDAwOGUsIDB4MDA5ZSwKKwkweDAwZWUsIDB4MDAwNSwgMHgwMDk2LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LCAweDAwZTYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDE5MzAsIDB4NzMwMCwgMHg4MzFmLCAweDgzMWUsIDB4ODMxZSwKKwkweDkzODQsIDB4MDAzZiwgMHgyMGU4LCAweDkzOWMsIDB4ZmZjMCwgMHg5Mzk4LCAweDAwMDMsIDB4NzEwNCwKKwkweDA4MGMsIDB4OGQ4NiwgMHg4MTBjLCAweDIxMDAsIDB4OTMxOCwgMHg4MDAzLCAweDIyMjgsIDB4MjAyMSwKKwkweDAwNzgsIDB4OTQwMiwgMHg5NTMyLCAweDAyMDgsIDB4MjAyOCwgMHgyNTAwLCAweDgwMDQsIDB4MjBhOCwKKwkweDIzYTAsIDB4YTAwMSwgMHhhMDAxLCAweDQwMDUsIDB4MjUwOCwgMHgwODBjLCAweDhkOGYsIDB4MjEzMCwKKwkweDcwMTQsIDB4OTYwMCwgMHg3MDE2LCAweDI2MDAsIDB4NzExYywgMHg5MTAyLCAweDcwMWUsIDB4NzAwNCwKKwkweDk2MDAsIDB4MjAwOCwgMHg5MDgyLCAweDAwMGEsIDB4MTE5MCwgMHg3MDAwLCAweDIwNDgsIDB4YTgwMCwKKwkweDkwMDUsIDB4MTE0OCwgMHgyMDA5LCAweDAwMDEsIDB4MDAyNiwgMHgwODBjLCAweDhjN2QsIDB4MDAyZSwKKwkweDcwMDAsIDB4MjA0OCwgMHhhODAwLCAweDcwMDIsIDB4NzAwNywgMHgwMDAwLCAweDAwMDgsIDB4NzEwNiwKKwkweDI1MDAsIDB4OTIxMiwgMHgxOTA0LCAweDhjYmMsIDB4MDEyZSwgMHgwMGVlLCAweDAxNGUsIDB4MDEzZSwKKwkweDAxNWUsIDB4MDA5ZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4OTU4MCwgMHg4ZTRjLCAweDIwMDUsIDB4OTA3NSwgMHgwOTBjLCAweDBkN2QsIDB4MDgwYywKKwkweDhkNjEsIDB4MDEyZSwgMHg5NTgwLCAweDhlNDgsIDB4MjAwNSwgMHg5MDc1LCAweDA5MGMsIDB4MGQ3ZCwKKwkweDAxNTYsIDB4MDEzNiwgMHgwMWM2LCAweDAxNDYsIDB4MDFkNiwgMHg4MzFmLCAweDgzMWUsIDB4ODMxZSwKKwkweDkzODQsIDB4MDAzZiwgMHgyMGUwLCAweDkzODQsIDB4ZmZjMCwgMHg5MTAwLCAweDIwOTgsIDB4YTg2MCwKKwkweDIwZTgsIDB4YTk1YywgMHgyYzA1LCAweDkxMDAsIDB4MjBhMCwgMHgyMGE5LCAweDAwMDIsIDB4NDAwMywKKwkweDJlMGMsIDB4MmQwMCwgMHgwMDAyLCAweDhkNGIsIDB4OGQ0YiwgMHg4ZDRkLCAweDhkNGIsIDB4OGQ0ZCwKKwkweDhkNGIsIDB4OGQ0YiwgMHg4ZDRiLCAweDhkNGIsIDB4OGQ0YiwgMHg4ZDUzLCAweDhkNGIsIDB4OGQ1MywKKwkweDhkNGIsIDB4OGQ0YiwgMHg4ZDRiLCAweDA4MGMsIDB4MGQ3ZCwgMHg0MTA0LCAweDIwYTksIDB4MDAwMiwKKwkweDQwMDIsIDB4NDAwMywgMHgwMDI4LCAweDIwYTksIDB4MDAwMiwgMHg0MDAzLCAweDQxMDQsIDB4NDAwMywKKwkweDAxZGUsIDB4MDE0ZSwgMHgwMWNlLCAweDAxM2UsIDB4MDE1ZSwgMHgwMGVlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMDUsIDB4MDA5NiwgMHg3MDE0LCAweDgwMDEsIDB4NzAxNiwgMHg3MTBjLCAweDIxMTAsIDB4MDBmMSwKKwkweDgxMGMsIDB4OTE4OCwgMHgwMDAzLCAweDczMDgsIDB4ODIxMCwgMHg5MjgyLCAweDAwMGEsIDB4MTE5OCwKKwkweDcwMDgsIDB4MjA0OCwgMHhhODAwLCAweDkwMDUsIDB4MDE1OCwgMHgwMDA2LCAweDA4MGMsIDB4OGUxOCwKKwkweDAwOWUsIDB4YTgwNywgMHgwMDAwLCAweDI5MDAsIDB4NzAwYSwgMHg3MDEwLCAweDgwMDEsIDB4NzAxMiwKKwkweDcwMGYsIDB4MDAwMCwgMHgwMDA4LCAweDcyMGUsIDB4MDA5ZSwgMHgwMDA1LCAweDAwMDYsIDB4ODEwYiwKKwkweDgxMGIsIDB4MjEwMCwgMHg4MTBiLCAweDkxMDAsIDB4MjAwOCwgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwKKwkweDAwMjYsIDB4MjEwMCwgMHg5MDA1LCAweDAxNTgsIDB4OTA5MiwgMHgwMDBjLCAweDAyNDAsIDB4OTAwZSwKKwkweDgxMDgsIDB4OTA4MiwgMHgwMDBjLCAweDFkZTAsIDB4MDAyZSwgMHgwMDBlLCAweDAwMDUsIDB4OTAwZSwKKwkweDBjZDgsIDB4MmQwMCwgMHg5MGI4LCAweDAwMDgsIDB4MjAzMSwgMHg4ZGQyLCAweDkwMWUsIDB4NjgwOCwKKwkweDkwMDUsIDB4MDEwOCwgMHg4MzE4LCAweDY5MGMsIDB4OTEwYSwgMHgwMjQ4LCAweDAxNDAsIDB4ODMxOCwKKwkweDY4MTAsIDB4OTExMiwgMHgwMjIwLCAweDAxMTgsIDB4ODMxOCwgMHgyMjA4LCAweDBjZDAsIDB4MjMzYSwKKwkweDY4MDQsIDB4ZDA4NCwgMHgyMzAwLCAweDIwMjEsIDB4MDAwMSwgMHgxMTUwLCAweDkwODIsIDB4MDAwMywKKwkweDA5NjcsIDB4MGE2NywgMHg4NDIwLCAweDkwODIsIDB4MDAwNywgMHgwOTY3LCAweDBhNjcsIDB4MGNkMCwKKwkweDkwODIsIDB4MDAwMiwgMHgwOTY3LCAweDBhNjcsIDB4ODQyMCwgMHg5MDgyLCAweDAwMDUsIDB4MDk2NywKKwkweDBhNjcsIDB4MGNkMCwgMHg2YzFhLCAweDAwMDUsIDB4MDA5NiwgMHgwMDQ2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MmIwMCwgMHg5MDgwLCAweDhlNTAsIDB4MjAwNSwgMHg5MDA1LCAweDA5MGMsIDB4MGQ3ZCwKKwkweDIwMDQsIDB4OTBhMCwgMHgwMDBhLCAweDA4MGMsIDB4MTA2MCwgMHgwMWQwLCAweDI5MDAsIDB4NzAyNiwKKwkweGE4MDMsIDB4MDAwMCwgMHhhODA3LCAweDAwMDAsIDB4MDgwYywgMHgxMDYwLCAweDAxODgsIDB4NzAyNCwKKwkweGE4MDIsIDB4YTgwNywgMHgwMDAwLCAweDI5MDAsIDB4NzAyNiwgMHg5NGEyLCAweDAwMGEsIDB4MDExMCwKKwkweDAyMDgsIDB4MGM5MCwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMDRlLCAweDAwOWUsIDB4MDAwNSwKKwkweDcwMjQsIDB4OTAwNSwgMHgwZGM4LCAweDIwNDgsIDB4YWMwMCwgMHgwODBjLCAweDEwNzksIDB4MjQwMCwKKwkweDBjYzAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAyNCwgMHgyMDQ4LCAweDkwMDUsIDB4MDEzMCwKKwkweGE4MDAsIDB4NzAyNiwgMHhhODAzLCAweDAwMDAsIDB4YTgwNywgMHgwMDAwLCAweDAxMmUsIDB4MDAwNSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwMjQsIDB4YTgwMiwgMHgyOTAwLCAweDcwMjYsIDB4MDEyZSwKKwkweDAwMDUsIDB4MDA5NiwgMHg5ZTgwLCAweDAwMDksIDB4MjAwNCwgMHg5MDA1LCAweDAxMzgsIDB4MjA0OCwKKwkweGE4MDAsIDB4MDAwNiwgMHgwODBjLCAweDEwNzksIDB4MDAwZSwgMHgwY2I4LCAweDAwOWUsIDB4MDAwNSwKKwkweDAwOTYsIDB4NzAwOCwgMHg5MDA1LCAweDAxMzgsIDB4MjA0OCwgMHhhODAwLCAweDAwMDYsIDB4MDgwYywKKwkweDEwNzksIDB4MDAwZSwgMHgwY2I4LCAweDkwMDYsIDB4NzAwMiwgMHg3MDBhLCAweDcwMDYsIDB4NzAwZSwKKwkweDcwMWEsIDB4NzAxZSwgMHg3MDIyLCAweDcwMmEsIDB4NzAyNiwgMHg3MDJlLCAweDAwOWUsIDB4MDAwNSwKKwkweDFhNmMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MTkzMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDE4ODgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MTg3NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwZTYsIDB4MDBjNiwgMHgwMGI2LCAweDAwYTYsIDB4YThhOCwgMHgyMDQwLCAweDIwNzEsIDB4MTg3NywKKwkweDA4MGMsIDB4OGY3NCwgMHhhMDY3LCAweDAwMjMsIDB4NjAxMCwgMHg5MDVkLCAweDA5MDQsIDB4OGY0OSwKKwkweGI4MTQsIDB4YTA2ZSwgMHhiOTEwLCAweGExNzIsIDB4YjlhMCwgMHhhMTc2LCAweDIwMDEsIDB4MDAwMywKKwkweGEwN2UsIDB4YTgzNCwgMHhhMDgyLCAweGEwN2IsIDB4MDAwMCwgMHhhODk4LCAweDkwMDUsIDB4MDExOCwKKwkweGEwNzgsIDB4YzA4NSwgMHhhMDdhLCAweDI4NTgsIDB4MjAzMSwgMHgwMDE4LCAweGEwNjgsIDB4OTA4YSwKKwkweDAwMTksIDB4MWEwYywgMHgwZDdkLCAweDIwMjAsIDB4MjA1MCwgMHgyOTQwLCAweGE4NjQsIDB4OTBiYywKKwkweDAwZmYsIDB4OTA4YywgMHgwMDBmLCAweDkxZTAsIDB4MWVhYiwgMHgyYzY1LCAweDk3ODYsIDB4MDAyNCwKKwkweDJjMDUsIDB4MTU5MCwgMHg5MDhhLCAweDAwMzYsIDB4MWEwYywgMHgwZDdkLCAweDkwODIsIDB4MDAxYiwKKwkweDAwMDIsIDB4OGViNCwgMHg4ZWI0LCAweDhlYjYsIDB4OGViNCwgMHg4ZWI0LCAweDhlYjQsIDB4OGViOCwKKwkweDhlYjQsIDB4OGViNCwgMHg4ZWI0LCAweDhlYmEsIDB4OGViNCwgMHg4ZWI0LCAweDhlYjQsIDB4OGViYywKKwkweDhlYjQsIDB4OGViNCwgMHg4ZWI0LCAweDhlYmUsIDB4OGViNCwgMHg4ZWI0LCAweDhlYjQsIDB4OGVjMCwKKwkweDhlYjQsIDB4OGViNCwgMHg4ZWI0LCAweDhlYzIsIDB4MDgwYywgMHgwZDdkLCAweGExODAsIDB4MDRiOCwKKwkweGExOTAsIDB4MDRhOCwgMHhhMWEwLCAweDA0OTgsIDB4YTFiMCwgMHgwNDg4LCAweGExYzAsIDB4MDQ3OCwKKwkweGExZDAsIDB4MDQ2OCwgMHhhMWUwLCAweDA0NTgsIDB4OTA4YSwgMHgwMDM0LCAweDFhMGMsIDB4MGQ3ZCwKKwkweDkwODIsIDB4MDAxYiwgMHgwMDAyLCAweDhlZTYsIDB4OGVlNCwgMHg4ZWU0LCAweDhlZTQsIDB4OGVlNCwKKwkweDhlZTQsIDB4OGVlOCwgMHg4ZWU0LCAweDhlZTQsIDB4OGVlNCwgMHg4ZWU0LCAweDhlZTQsIDB4OGVlYSwKKwkweDhlZTQsIDB4OGVlNCwgMHg4ZWU0LCAweDhlZTQsIDB4OGVlNCwgMHg4ZWVjLCAweDhlZTQsIDB4OGVlNCwKKwkweDhlZTQsIDB4OGVlNCwgMHg4ZWU0LCAweDhlZWUsIDB4MDgwYywgMHgwZDdkLCAweGExODAsIDB4MDAzOCwKKwkweGExOTgsIDB4MDAyOCwgMHhhMWIwLCAweDAwMTgsIDB4YTFjOCwgMHgwMDA4LCAweGExZTAsIDB4MjYwMCwKKwkweDAwMDIsIDB4OGYwYSwgMHg4ZjBjLCAweDhmMGUsIDB4OGYxMCwgMHg4ZjEyLCAweDhmMTQsIDB4OGYxNiwKKwkweDhmMTgsIDB4OGYxYSwgMHg4ZjFjLCAweDhmMWUsIDB4OGYyMCwgMHg4ZjIyLCAweDhmMjQsIDB4OGYyNiwKKwkweDhmMjgsIDB4OGYyYSwgMHg4ZjJjLCAweDhmMmUsIDB4OGYzMCwgMHg4ZjMyLCAweDhmMzQsIDB4OGYzNiwKKwkweDhmMzgsIDB4OGYzYSwgMHgwODBjLCAweDBkN2QsIDB4YjllMiwgMHgwNDY4LCAweGI5ZGUsIDB4MDQ1OCwKKwkweGI5ZGEsIDB4MDQ0OCwgMHhiOWQ2LCAweDA0MzgsIDB4YjlkMiwgMHgwNDI4LCAweGI5Y2UsIDB4MDQxOCwKKwkweGI5Y2EsIDB4MDQwOCwgMHhiOWM2LCAweDAwZjgsIDB4YjljMiwgMHgwMGU4LCAweGI5YmUsIDB4MDBkOCwKKwkweGI5YmEsIDB4MDBjOCwgMHhiOWI2LCAweDAwYjgsIDB4YjliMiwgMHgwMGE4LCAweGI5YWUsIDB4MDA5OCwKKwkweGI5YWEsIDB4MDA4OCwgMHhiOWE2LCAweDAwNzgsIDB4YjlhMiwgMHgwMDY4LCAweGI5OWUsIDB4MDA1OCwKKwkweGI5OWEsIDB4MDA0OCwgMHhiOTk2LCAweDAwMzgsIDB4Yjk5MiwgMHgwMDI4LCAweGI5OGUsIDB4MDAxOCwKKwkweGI5OGEsIDB4MDAwOCwgMHhiOTg2LCAweDg2MzEsIDB4ODQyMSwgMHgwMTMwLCAweDA4MGMsIDB4MWU4MSwKKwkweDA5MGMsIDB4MGQ3ZCwgMHgwODA0LCAweDhlOGUsIDB4MDBhZSwgMHgwMGJlLCAweDAwY2UsIDB4MDBlZSwKKwkweDAwMDUsIDB4YTg2YywgMHhhMDZlLCAweGE4NzAsIDB4YTA3MiwgMHhhMDc3LCAweDAwZmYsIDB4OTAwNiwKKwkweDA4MDQsIDB4OGU3MCwgMHgwMDA2LCAweDAwMTYsIDB4MDBiNiwgMHg2MDEwLCAweDIwNTgsIDB4YjgxMCwKKwkweDkwMDUsIDB4MDFiMCwgMHgyMDAxLCAweDE5MjQsIDB4MjAwNCwgMHg5MDA1LCAweDAxODgsIDB4MjAwMSwKKwkweDE4MDAsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDMsIDB4MTE1OCwgMHgwMDM2LCAweDAwNDYsIDB4YmJhMCwKKwkweDIwMjEsIDB4MDAwNCwgMHgyMDExLCAweDgwMTQsIDB4MDgwYywgMHg0YjUyLCAweDAwNGUsIDB4MDAzZSwKKwkweDAwYmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4OTAxNiwgMHg3MTBjLCAweGE4MzQsIDB4OTEwYSwKKwkweGE5MzYsIDB4NzAwOCwgMHg5MDA1LCAweDAxMjAsIDB4ODIxMCwgMHg5MTBhLCAweDAyMzgsIDB4MDEzMCwKKwkweDcwMTAsIDB4ODIxMCwgMHg5MTBhLCAweDAyMTAsIDB4MDEwOCwgMHgwY2Q4LCAweGFhOGEsIDB4YTI2YSwKKwkweDAwMDUsIDB4MDBmNiwgMHgwMGQ2LCAweDAwMzYsIDB4MjA3OSwgMHgwMzAwLCAweDc4MWIsIDB4MDIwMCwKKwkweDc4MTgsIDB4ZDA5NCwgMHgxZGQ4LCAweDc4MWIsIDB4MDIwMiwgMHhhMDAxLCAweGEwMDEsIDB4NzgxOCwKKwkweGQwOTQsIDB4MWRhMCwgMHhiOGFjLCAweDkwMDUsIDB4MDFiOCwgMHgyMDY4LCAweDIwNzksIDB4MDAwMCwKKwkweDJjMDgsIDB4OTExZSwgMHgxMTE4LCAweDY4MGMsIDB4YjhhZSwgMHgwMDYwLCAweDkxMDYsIDB4MDE0MCwKKwkweDJkMDAsIDB4MjA3OCwgMHg2ODBjLCAweDkwMDUsIDB4MDkwYywgMHgwZDdkLCAweDIwNjgsIDB4MGNiMCwKKwkweDZiMGMsIDB4N2IwZSwgMHg2MDBmLCAweDAwMDAsIDB4MjA3OSwgMHgwMzAwLCAweDc4MWIsIDB4MDIwMCwKKwkweDAwM2UsIDB4MDBkZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGQ2LCAweDAwOTYsIDB4MDBjNiwKKwkweDAwMzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDE1NiwgMHgyMGE5LCAweDAxZmYsIDB4MjA3MSwKKwkweDAzMDAsIDB4NzAxYiwgMHgwMjAwLCAweDcwMTgsIDB4ZDA5NCwgMHgwMTEwLCAweDFmMDQsIDB4OGZjOSwKKwkweDcwMWIsIDB4MDIwMiwgMHhhMDAxLCAweGEwMDEsIDB4NzAxOCwgMHhkMDk0LCAweDFkOTAsIDB4YjhhYywKKwkweDkwMDUsIDB4MDFlOCwgMHgyMDYwLCAweDYwMGMsIDB4YjhhZSwgMHg2MDI0LCAweGMwOGQsIDB4NjAyNiwKKwkweDYwMDMsIDB4MDAwNCwgMHg2MDFiLCAweDAwMDAsIDB4NjAxMywgMHgwMDAwLCAweDYwMWYsIDB4MDEwMSwKKwkweDYwMTQsIDB4MjA0OCwgMHhhODhiLCAweDAwMDAsIDB4YThhOCwgMHhhOGFiLCAweDAwMDAsIDB4OTA0ZCwKKwkweDA5MGMsIDB4MGQ3ZCwgMHgwODBjLCAweDEwNzksIDB4MDgwYywgMHg4Yjg5LCAweDBjMDAsIDB4MjA3MSwKKwkweDAzMDAsIDB4NzAxYiwgMHgwMjAwLCAweDAxNWUsIDB4MDEyZSwgMHgwMDNlLCAweDAwY2UsIDB4MDA5ZSwKKwkweDAwZGUsIDB4MDBlZSwgMHgwMDA1LCAweDAwYzYsIDB4MDBiNiwgMHgwMDE2LCAweDAwMDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4MjY2MSwgMHgwMTVlLCAweDExYjAsIDB4MDgwYywgMHg2NjMyLCAweDE5MGMsIDB4MGQ3ZCwKKwkweDAwMGUsIDB4MDAxZSwgMHhiOTEyLCAweGI4MTYsIDB4MDgwYywgMHhhYzVhLCAweDAxNDAsIDB4MmIwMCwKKwkweDYwMTIsIDB4NjAyMywgMHgwMDAxLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLCAweGFkNGQsIDB4MDBiZSwKKwkweDAwY2UsIDB4MDAwNSwgMHgwMDBlLCAweDAwMWUsIDB4MGNkMCwgMHgwMDY2LCAweDYwMDAsIDB4OTBiMiwKKwkweDAwMTYsIDB4MWEwYywgMHgwZDdkLCAweDAwMTMsIDB4MDA2ZSwgMHgwMDA1LCAweDkwM2UsIDB4OTAzZSwKKwkweDkwM2UsIDB4OTA0MCwgMHg5MDg5LCAweDkwM2UsIDB4OTAzZSwgMHg5MDNlLCAweDkwZjAsIDB4OTAzZSwKKwkweDkxMjgsIDB4OTAzZSwgMHg5MDNlLCAweDkwM2UsIDB4OTAzZSwgMHg5MDNlLCAweDA4MGMsIDB4MGQ3ZCwKKwkweDkxODIsIDB4MDA0MCwgMHgwMDAyLCAweDkwNTMsIDB4OTA1MywgMHg5MDUzLCAweDkwNTMsIDB4OTA1MywKKwkweDkwNTMsIDB4OTA1MywgMHg5MDUzLCAweDkwNTMsIDB4OTA1NSwgMHg5MDY2LCAweDkwNTMsIDB4OTA1MywKKwkweDkwNTMsIDB4OTA1MywgMHg5MDc3LCAweDA4MGMsIDB4MGQ3ZCwgMHgwMDk2LCAweDYxMTQsIDB4MjE0OCwKKwkweGE4N2IsIDB4MDAwMCwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiOGJiLCAweDA1MDAsIDB4MDBiZSwKKwkweDA4MGMsIDB4NmJlZSwgMHgwODBjLCAweGFjYjAsIDB4MDA5ZSwgMHgwMDA1LCAweDA4MGMsIDB4OTZkNSwKKwkweDAwZDYsIDB4NjExNCwgMHgwODBjLCAweGM5N2EsIDB4MDEzMCwgMHgwMDk2LCAweDYxMTQsIDB4MjE0OCwKKwkweDA4MGMsIDB4NmRlZSwgMHgwMDllLCAweDAwZGUsIDB4MDgwYywgMHhhY2IwLCAweDAwMDUsIDB4MDgwYywKKwkweDk2ZDUsIDB4MDgwYywgMHgzMjQwLCAweDYxMTQsIDB4MDA5NiwgMHgyMTQ4LCAweDA4MGMsIDB4Yzk3YSwKKwkweDAxMjAsIDB4YTg3YiwgMHgwMDI5LCAweDA4MGMsIDB4NmRlZSwgMHgwMDllLCAweDA4MGMsIDB4YWNiMCwKKwkweDAwMDUsIDB4NjAxYiwgMHgwMDAwLCAweDkxODIsIDB4MDA0MCwgMHgwMDk2LCAweDAwMDIsIDB4OTBhNCwKKwkweDkwYTQsIDB4OTBhNCwgMHg5MGE0LCAweDkwYTQsIDB4OTBhNCwgMHg5MGE0LCAweDkwYTQsIDB4OTBhNiwKKwkweDkwYTQsIDB4OTBhNCwgMHg5MGE0LCAweDkwZWMsIDB4OTBhNCwgMHg5MGE0LCAweDkwYTQsIDB4OTBhNCwKKwkweDkwYTQsIDB4OTBhNCwgMHg5MGFkLCAweDkwYTQsIDB4MDgwYywgMHgwZDdkLCAweDYxMTQsIDB4MjE0OCwKKwkweGE5MzgsIDB4OTE4ZSwgMHhmZmZmLCAweDA5MDQsIDB4OTBlYywgMHg2MDI0LCAweGQwOGMsIDB4MTVjMCwKKwkweDAwZTYsIDB4NjExNCwgMHgyMTQ4LCAweDA4MGMsIDB4OGU1OCwgMHgwMDk2LCAweGE4YTgsIDB4MjA0OCwKKwkweDA4MGMsIDB4NmI4NiwgMHgwMDllLCAweGE4YWIsIDB4MDAwMCwgMHg2MDEwLCAweDkwMDUsIDB4MDEyOCwKKwkweDAwYjYsIDB4MjA1OCwgMHgwODBjLCAweDhmODksIDB4MDBiZSwgMHhhZTg4LCAweDAwYjYsIDB4MjA1OSwKKwkweDAwMDAsIDB4MDgwYywgMHg4YjkyLCAweDAwYmUsIDB4MDFlMCwgMHgyMDcxLCAweDE5M2MsIDB4MDgwYywKKwkweDhiZDksIDB4MDFiOCwgMHg5MDg2LCAweDAwMDEsIDB4MTEyOCwgMHgyMDAxLCAweDE5NDYsIDB4MjAwNCwKKwkweDkwMDUsIDB4MTE3OCwgMHgwMDk2LCAweDA4MGMsIDB4MTA0NywgMHgyOTAwLCAweDAwOWUsIDB4MDE0OCwKKwkweGE4YWEsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4OGI0ZCwgMHgwMGZlLCAweDAwZWUsIDB4MDA5ZSwKKwkweDAwMDUsIDB4MDgwYywgMHg4Yjg5LCAweDBjZDAsIDB4MDgwYywgMHg5MWE0LCAweDAwOWUsIDB4MDAwNSwKKwkweDkxODIsIDB4MDA0MCwgMHgwMDk2LCAweDAwMDIsIDB4OTEwNCwgMHg5MTA0LCAweDkxMDQsIDB4OTEwNiwKKwkweDkxMDQsIDB4OTEwNCwgMHg5MTA0LCAweDkxMjYsIDB4OTEwNCwgMHg5MTA0LCAweDkxMDQsIDB4OTEwNCwKKwkweDkxMDQsIDB4OTEwNCwgMHg5MTA0LCAweDkxMDQsIDB4MDgwYywgMHgwZDdkLCAweDYwMDMsIDB4MDAwMywKKwkweDYxMDYsIDB4NjAxNCwgMHgyMDQ4LCAweGE4YWMsIDB4YTgzNiwgMHhhOGIwLCAweGE4M2EsIDB4YTg0NywKKwkweDAwMDAsIDB4YTg0YiwgMHgwMDAwLCAweGE4ODQsIDB4OTA5MiwgMHgxOTlhLCAweDAyMTAsIDB4MjAwMSwKKwkweDE5OTksIDB4ODAwMywgMHg4MDEzLCAweDgyMTMsIDB4OTIxMCwgMHg2MjFhLCAweDA4MGMsIDB4MWMxMCwKKwkweDIwMDksIDB4ODAzMCwgMHgwODBjLCAweDkyZjcsIDB4MDA5ZSwgMHgwMDA1LCAweDA4MGMsIDB4MGQ3ZCwKKwkweDA4MGMsIDB4OTZkNSwgMHg2MTE0LCAweDIxNDgsIDB4YTg3YiwgMHgwMDAwLCAweDYwMTAsIDB4MDBiNiwKKwkweDIwNTgsIDB4YjhiYiwgMHgwNTAwLCAweDAwYmUsIDB4MDgwYywgMHg2ZGVlLCAweDA4MGMsIDB4YWNiMCwKKwkweDAwOWUsIDB4MDAwNSwgMHgwODBjLCAweGE5MWUsIDB4NjE0NCwgMHhkMWZjLCAweDAxMjAsIDB4ZDFhYywKKwkweDExMTAsIDB4NjAwMywgMHgwMDAzLCAweDYwMDAsIDB4OTA4YSwgMHgwMDE2LCAweDFhMGMsIDB4MGQ3ZCwKKwkweDAwOTYsIDB4MDAyMywgMHgwMDllLCAweDA4MGMsIDB4YTkzYSwgMHgwMDA1LCAweDkxNWUsIDB4OTE1ZSwKKwkweDkxNWUsIDB4OTE2MCwgMHg5MTcxLCAweDkxNWUsIDB4OTE1ZSwgMHg5MTVlLCAweDkxNWUsIDB4OTE1ZSwKKwkweDkxNWUsIDB4OTE1ZSwgMHg5MTVlLCAweDkxNWUsIDB4OTE1ZSwgMHg5MTVlLCAweDA4MGMsIDB4MGQ3ZCwKKwkweDA4MGMsIDB4YWFiNSwgMHg2MTE0LCAweDIxNDgsIDB4YTg3YiwgMHgwMDA2LCAweDYwMTAsIDB4MDBiNiwKKwkweDIwNTgsIDB4YjhiYiwgMHgwNTAwLCAweDAwYmUsIDB4MDgwYywgMHg2ZGVlLCAweDA4MGMsIDB4YWNiMCwKKwkweDAwMDUsIDB4MDQ5MSwgMHgwMDA1LCAweDA4MGMsIDB4YTkxZSwgMHg2MDAwLCAweDYxNDQsIDB4ZDFmYywKKwkweDAxMzAsIDB4ZDFhYywgMHgxMTIwLCAweDYwMDMsIDB4MDAwMywgMHgyMDA5LCAweDAwMDMsIDB4OTA4YSwKKwkweDAwMTYsIDB4MWEwYywgMHgwZDdkLCAweDAwOTYsIDB4MDAzMywgMHgwMDllLCAweDAxMDYsIDB4MDgwYywKKwkweGE5M2EsIDB4MDEwZSwgMHgwMDA1LCAweDkxOWIsIDB4OTE5YiwgMHg5MTliLCAweDkxOWQsIDB4OTFhNCwKKwkweDkxOWIsIDB4OTE5YiwgMHg5MTliLCAweDkxOWIsIDB4OTE5YiwgMHg5MTliLCAweDkxOWIsIDB4OTE5YiwKKwkweDkxOWIsIDB4OTE5YiwgMHg5MTliLCAweDA4MGMsIDB4MGQ3ZCwgMHgwMDM2LCAweDAwZTYsIDB4MDgwYywKKwkweGFhYjUsIDB4MDBlZSwgMHgwMDNlLCAweDAwMDUsIDB4NjAyNCwgMHhkMDhjLCAweDExZjAsIDB4MDBmNiwKKwkweDAwZTYsIDB4NjAxYiwgMHgwMDAwLCAweDYwMTQsIDB4MjA0OCwgMHg2MDEwLCAweDkwMDUsIDB4MDEyOCwKKwkweDAwYjYsIDB4MjA1OCwgMHgwODBjLCAweDhmODksIDB4MDBiZSwgMHgyMDcxLCAweDE5M2MsIDB4MDgwYywKKwkweDhiZDksIDB4MDE2MCwgMHgyMDAxLCAweDE4N2YsIDB4MjAwNCwgMHhhODhhLCAweDIwMzEsIDB4MDAwMCwKKwkweDJjNzgsIDB4MDgwYywgMHg4YjRkLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDAwOTYsIDB4YTg4YiwKKwkweDAwMDAsIDB4YThhOCwgMHgyMDQ4LCAweDA4MGMsIDB4MTA3OSwgMHgwMDllLCAweGE4YWIsIDB4MDAwMCwKKwkweDA4MGMsIDB4OGI4OSwgMHgwYzgwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MTg3YSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwMzYsIDB4MDA0NiwKKwkweDIwYTksIDB4MDAxMCwgMHg5MDA2LCAweDgwMDQsIDB4ODA4NiwgMHg4MThlLCAweDEyMDgsIDB4OTIwMCwKKwkweDFmMDQsIDB4OTFlYywgMHg4MDg2LCAweDgxOGUsIDB4MDA0ZSwgMHgwMDNlLCAweDAxMmUsIDB4MDAwNSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwNzYsIDB4MDE1NiwgMHgyMGE5LCAweDAwMTAsIDB4OTAwNSwKKwkweDAxYzgsIDB4OTExYSwgMHgxMmI4LCAweDgyMTMsIDB4ODE4ZCwgMHgwMjI4LCAweDkxMWEsIDB4MTIyMCwKKwkweDFmMDQsIDB4OTIwMywgMHgwMDI4LCAweDkxMWEsIDB4MjMwOCwgMHg4MjEwLCAweDFmMDQsIDB4OTIwMywKKwkweDAwMDYsIDB4MzIwMCwgMHg5MDg0LCAweGVmZmYsIDB4MjA4MCwgMHgwMDBlLCAweDAxNWUsIDB4MDA3ZSwKKwkweDAxMmUsIDB4MDAwNSwgMHgwMDA2LCAweDMyMDAsIDB4OTA4NSwgMHgxMDAwLCAweDBjYTgsIDB4MDEyNiwKKwkweDIwOTEsIDB4MjgwMCwgMHgyMDc5LCAweDE5ZTYsIDB4MDEyZSwgMHgwMGQ2LCAweDIwNjksIDB4MTllNiwKKwkweDY4MDMsIDB4MDAwNSwgMHgwMTU2LCAweDAxNDYsIDB4MDFkNiwgMHgyMGU5LCAweDAwMDAsIDB4MjA2OSwKKwkweDAyMDAsIDB4MDgwYywgMHhhNzEzLCAweDA0YTksIDB4MDgwYywgMHhhNmZlLCAweDA0OTEsIDB4MDgwYywKKwkweGE3MDEsIDB4MDQ3OSwgMHgwODBjLCAweGE3MDQsIDB4MDQ2MSwgMHgwODBjLCAweGE3MDcsIDB4MDQ0OSwKKwkweDA4MGMsIDB4YTcwYSwgMHgwNDMxLCAweDA4MGMsIDB4YTcwZCwgMHgwNDE5LCAweDA4MGMsIDB4YTcxMCwKKwkweDA0MDEsIDB4MDFkZSwgMHgwMTRlLCAweDAxNWUsIDB4Njg1NywgMHgwMDAwLCAweDAwZjYsIDB4MjA3OSwKKwkweDAzODAsIDB4MDBmOSwgMHg3ODA3LCAweDAwMDMsIDB4NzgwMywgMHgwMDAwLCAweDc4MDMsIDB4MDAwMSwKKwkweDIwNjksIDB4MDAwNCwgMHgyZDA0LCAweDkwODQsIDB4ZmZmZSwgMHg5MDg1LCAweDgwMDAsIDB4MjA2YSwKKwkweDIwNjksIDB4MDEwMCwgMHg2ODI4LCAweDkwODQsIDB4ZmZmYywgMHg2ODJhLCAweDAwZmUsIDB4MDBkZSwKKwkweDAwMDUsIDB4MjBhOSwgMHgwMDIwLCAweDIwYTEsIDB4MDI0MCwgMHgyMDAxLCAweDAwMDAsIDB4NDAwNCwKKwkweDAwMDUsIDB4MDBjNiwgMHg3ODAzLCAweDAwMDAsIDB4OTAwNiwgMHg3ODI3LCAweDAwMzAsIDB4NzgyYiwKKwkweDA0MDAsIDB4NzgyNywgMHgwMDMxLCAweDc4MmIsIDB4MWFmMSwgMHg3ODFmLCAweGZmMDAsIDB4NzgxYiwKKwkweGZmMDAsIDB4MjA2MSwgMHgxYWU2LCAweDYwMmYsIDB4MTllNiwgMHg2MDMzLCAweDE4MDAsIDB4NjAzNywKKwkweDFhMDIsIDB4NjAzYiwgMHgxZWFiLCAweDYwM2YsIDB4MWViYiwgMHg2MDQyLCAweDYwNDcsIDB4MWFiYywKKwkweDAwY2UsIDB4MDAwNSwgMHgyMDAxLCAweDAzODIsIDB4MjAwNCwgMHg5MDg0LCAweDAwMDcsIDB4OTA4NiwKKwkweDAwMDEsIDB4MDFiMCwgMHgwMGM2LCAweDYxNDYsIDB4NjAwZiwgMHgwMDAwLCAweDJjMDgsIDB4MjA2MSwKKwkweDE5ZTYsIDB4NjAyYywgMHg4MDAwLCAweDYwMmUsIDB4NjAxYywgMHg5MDA1LCAweDAxMzAsIDB4OTA4MCwKKwkweDAwMDMsIDB4MjEwMiwgMHg2MTFlLCAweDAwY2UsIDB4MDAwNSwgMHg2MTIyLCAweDYxMWUsIDB4MGNkOCwKKwkweDYxNDYsIDB4MmMwOCwgMHgyMDAxLCAweDAwMTIsIDB4MDgwYywgMHhhOTBmLCAweDAwMDUsIDB4MDAxNiwKKwkweDIwMDksIDB4ODAyMCwgMHg2MTQ2LCAweDJjMDgsIDB4MjAwMSwgMHgwMzgyLCAweDIwMDQsIDB4OTA4NCwKKwkweDAwMDcsIDB4OTA4NiwgMHgwMDAxLCAweDExMjgsIDB4MjAwMSwgMHgwMDE5LCAweDA4MGMsIDB4YTkwZiwKKwkweDAwODgsIDB4MDBjNiwgMHgyMDYxLCAweDE5ZTYsIDB4NjAyYywgMHg4MDAwLCAweDYwMmUsIDB4NjAwYywKKwkweDkwMDUsIDB4MDEyOCwgMHg5MDgwLCAweDAwMDMsIDB4MjEwMiwgMHg2MTBlLCAweDAwMTAsIDB4NjExMiwKKwkweDYxMGUsIDB4MDBjZSwgMHgwMDFlLCAweDAwMDUsIDB4MjAwMSwgMHgwMzgyLCAweDIwMDQsIDB4OTA4NCwKKwkweDAwMDcsIDB4OTA4NiwgMHgwMDAxLCAweDAxOTgsIDB4MDBjNiwgMHg2MTQ2LCAweDYwMGYsIDB4MDAwMCwKKwkweDJjMDgsIDB4MjA2MSwgMHgxOWU2LCAweDYwNDQsIDB4OTAwNSwgMHgwMTMwLCAweDkwODAsIDB4MDAwMywKKwkweDIxMDIsIDB4NjE0NiwgMHgwMGNlLCAweDAwMDUsIDB4NjE0YSwgMHg2MTQ2LCAweDBjZDgsIDB4NjE0NiwKKwkweDYwMGYsIDB4MDAwMCwgMHgyYzA4LCAweDIwMDEsIDB4MDAxMywgMHgwODBjLCAweGE5MGYsIDB4MDAwNSwKKwkweDYwNDQsIDB4ZDBkYywgMHgwMTEwLCAweDA4MGMsIDB4YTNhYywgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwKKwkweDAwZDYsIDB4MDBjNiwgMHgwMGI2LCAweDAwOTYsIDB4MDA3NiwgMHgwMDY2LCAweDAwNTYsIDB4MDAzNiwKKwkweDAwMjYsIDB4MDAxNiwgMHgwMDA2LCAweDAxMjYsIDB4OTAyZSwgMHgyMDcxLCAweDE5ZTYsIDB4NzY0OCwKKwkweDI2NjAsIDB4MjY3OCwgMHgyMDkxLCAweDgwMDAsIDB4OGNmZiwgMHgwOTA0LCAweDkzODMsIDB4NjAxMCwKKwkweDIwNTgsIDB4YjhhMCwgMHg5MjA2LCAweDE5MDQsIDB4OTM3ZSwgMHg4N2ZmLCAweDAxMjAsIDB4NjA1YywKKwkweDkxMDYsIDB4MTkwNCwgMHg5MzdlLCAweDcwNGMsIDB4OWMwNiwgMHgxMTc4LCAweDAwMzYsIDB4MjAxOSwKKwkweDAwMDEsIDB4MDgwYywgMHhhMWI4LCAweDcwM2YsIDB4MDAwMCwgMHg5MDA2LCAweDcwNGUsIDB4NzA2YSwKKwkweDcwNTIsIDB4NzA2ZSwgMHgwMDNlLCAweDIwMjksIDB4MDAwMSwgMHgwODExLCAweDcwNDgsIDB4OWMzNiwKKwkweDExMTAsIDB4NjYwYywgMHg3NjRhLCAweDcwNDQsIDB4OWMzNiwgMHgxMTQwLCAweDJjMDAsIDB4OWYzNiwKKwkweDAxMTgsIDB4MmYwMCwgMHg3MDQ2LCAweDAwMTAsIDB4NzA0NywgMHgwMDAwLCAweDY2MGMsIDB4MDA2NiwKKwkweDJjMDAsIDB4OWYwNiwgMHgwMTEwLCAweDdlMGUsIDB4MDAwOCwgMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwKKwkweDA4MGMsIDB4Yzk3YSwgMHgwMWYwLCAweDYwMTQsIDB4MjA0OCwgMHg2MDIwLCAweDkwODYsIDB4MDAwMywKKwkweDE1ODgsIDB4NjAwNCwgMHg5MDg2LCAweDAwNDAsIDB4MDkwYywgMHhhM2FjLCAweGE4NjcsIDB4MDEwMywKKwkweGFiN2EsIDB4YTg3NywgMHgwMDAwLCAweDAwMTYsIDB4MDAzNiwgMHgwMDc2LCAweDA4MGMsIDB4Y2M3ZiwKKwkweDA4MGMsIDB4ZTc5ZCwgMHgwODBjLCAweDZkZWUsIDB4MDA3ZSwgMHgwMDNlLCAweDAwMWUsIDB4MDgwYywKKwkweGNiNmIsIDB4MDgwYywgMHhhY2ViLCAweDAwY2UsIDB4MDgwNCwgMHg5MzFjLCAweDJjNzgsIDB4NjAwYywKKwkweDIwNjAsIDB4MDgwNCwgMHg5MzFjLCAweDAxMmUsIDB4MDAwZSwgMHgwMDFlLCAweDAwMmUsIDB4MDAzZSwKKwkweDAwNWUsIDB4MDA2ZSwgMHgwMDdlLCAweDAwOWUsIDB4MDBiZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwKKwkweDAwZmUsIDB4MDAwNSwgMHg2MDIwLCAweDkwODYsIDB4MDAwNiwgMHgxMTU4LCAweDAwMTYsIDB4MDAzNiwKKwkweDAwNzYsIDB4MDgwYywgMHhlNzlkLCAweDA4MGMsIDB4ZTNlOCwgMHgwMDdlLCAweDAwM2UsIDB4MDAxZSwKKwkweDA4YzAsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDksIDB4MTE2OCwgMHhhODdiLCAweDAwMDYsIDB4MDAxNiwKKwkweDAwMzYsIDB4MDA3NiwgMHgwODBjLCAweDZkZWUsIDB4MDgwYywgMHhhY2IwLCAweDAwN2UsIDB4MDAzZSwKKwkweDAwMWUsIDB4MDg0OCwgMHg2MDIwLCAweDkwODYsIDB4MDAwYSwgMHgwOTA0LCAweDkzNjgsIDB4MDgwNCwKKwkweDkzNjEsIDB4MDAwNiwgMHgwMDY2LCAweDAwOTYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZjYsIDB4OTAzNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzksIDB4MTllNiwgMHg3ODQ4LCAweDkwNjUsIDB4MDkwNCwKKwkweDk0MWQsIDB4NjAwYywgMHgwMDA2LCAweDYwMGYsIDB4MDAwMCwgMHg3ODRjLCAweDljMDYsIDB4MTFhMCwKKwkweDAwMzYsIDB4MjAxOSwgMHgwMDAxLCAweDA4MGMsIDB4YTFiOCwgMHg3ODNmLCAweDAwMDAsIDB4OTAxZSwKKwkweDdiNGUsIDB4N2I2YSwgMHg3YjUyLCAweDdiNmUsIDB4MDAzZSwgMHgwMDBlLCAweDkwMDUsIDB4MTExOCwKKwkweDYwMGMsIDB4NjAwZiwgMHgwMDAwLCAweDAwMDYsIDB4MDBlNiwgMHgyZjcwLCAweDA4MGMsIDB4OTMwMCwKKwkweDAwZWUsIDB4MDgwYywgMHhjOTdhLCAweDA1NDgsIDB4NjAxNCwgMHgyMDQ4LCAweDYwMjAsIDB4OTA4NiwKKwkweDAwMDMsIDB4MTVhOCwgMHgzZTA4LCAweDkxOGUsIDB4MDAwMiwgMHgxMTg4LCAweDYwMTAsIDB4OTAwNSwKKwkweDAxNzAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwgMHhkMGJjLCAweDAxNDAsIDB4NjA0OCwKKwkweDkwMDUsIDB4MTFjMCwgMHgyMDAxLCAweDE5ODcsIDB4MjAwNCwgMHg2MDRhLCAweDAwOTgsIDB4NjAwNCwKKwkweDkwODYsIDB4MDA0MCwgMHgwOTBjLCAweGEzYWMsIDB4YTg2NywgMHgwMTAzLCAweGFiN2EsIDB4YTg3NywKKwkweDAwMDAsIDB4MDgwYywgMHg2ZGUyLCAweDA4MGMsIDB4Y2I2YiwgMHg2MDQ0LCAweGMwZmMsIDB4NjA0NiwKKwkweDA4MGMsIDB4YWNlYiwgMHgwMDBlLCAweDA4MDQsIDB4OTNjNiwgMHg3ZTRhLCAweDdlNDYsIDB4MDEyZSwKKwkweDAwZmUsIDB4MDBkZSwgMHgwMGNlLCAweDAwOWUsIDB4MDA2ZSwgMHgwMDBlLCAweDAwMDUsIDB4NjAyMCwKKwkweDkwODYsIDB4MDAwNiwgMHgxMTE4LCAweDA4MGMsIDB4ZTNlOCwgMHgwYzM4LCAweDYwMjAsIDB4OTA4NiwKKwkweDAwMDksIDB4MTEzMCwgMHhhYjdhLCAweDA4MGMsIDB4NmRlZSwgMHgwODBjLCAweGFjYjAsIDB4MGMxMCwKKwkweDYwMjAsIDB4OTA4NiwgMHgwMDBhLCAweDA5OTAsIDB4MDg1MCwgMHgwMDE2LCAweDAwMjYsIDB4MDA4NiwKKwkweDkwNDYsIDB4MDBhOSwgMHgwODBjLCAweDk1MzAsIDB4MDA4ZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwKKwkweDAwZjYsIDB4MDEyNiwgMHgyMDc5LCAweDE5ZTYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4OTU3OSwKKwkweDA4MGMsIDB4OTYwZiwgMHgwODBjLCAweDY4MjAsIDB4MDEyZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBiNiwKKwkweDAwOTYsIDB4MDBmNiwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgwMDY2LCAweDAwMTYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MTllNiwgMHg3NjIwLCAweDI2NjAsIDB4MjY3OCwKKwkweDhjZmYsIDB4MDkwNCwgMHg5NGY1LCAweDYwMTAsIDB4MjA1OCwgMHhiOGEwLCAweDkyMDYsIDB4MTkwNCwKKwkweDk0ZjAsIDB4ODhmZiwgMHgwMTIwLCAweDYwNWMsIDB4OTEwNiwgMHgxOTA0LCAweDk0ZjAsIDB4NzAzMCwKKwkweDljMDYsIDB4MTU4MCwgMHgyMDY5LCAweDAxMDAsIDB4NjgyMCwgMHhkMGE0LCAweDAxMTAsIDB4ZDBjYywKKwkweDE1MDgsIDB4MDgwYywgMHg4NzgwLCAweDA4MGMsIDB4OWVkNCwgMHg2OGMzLCAweDAwMDAsIDB4MDgwYywKKwkweGEzYWMsIDB4NzAzMywgMHgwMDAwLCAweDAwMzYsIDB4MjA2OSwgMHgwMTQwLCAweDZiMDQsIDB4OTM4NCwKKwkweDEwMDAsIDB4MDEzOCwgMHgyMDAxLCAweDAxMDAsIDB4MDgwYywgMHgyYTdhLCAweDkwMDYsIDB4MDgwYywKKwkweDJhN2EsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwgMHgwMTEwLCAweDY4MjcsIDB4MDAwMSwKKwkweDAwM2UsIDB4MDA0MCwgMHg3MDA4LCAweGMwYWQsIDB4NzAwYSwgMHg2MDAzLCAweDAwMDksIDB4NjMwYSwKKwkweDA4MDQsIDB4OTRmMCwgMHg3MDIwLCAweDljMzYsIDB4MTExMCwgMHg2NjBjLCAweDc2MjIsIDB4NzAxYywKKwkweDljMzYsIDB4MTE0MCwgMHgyYzAwLCAweDlmMzYsIDB4MDExOCwgMHgyZjAwLCAweDcwMWUsIDB4MDAxMCwKKwkweDcwMWYsIDB4MDAwMCwgMHg2NjBjLCAweDAwNjYsIDB4MmMwMCwgMHg5ZjA2LCAweDAxMTAsIDB4N2UwZSwKKwkweDAwMDgsIDB4MjY3OCwgMHg2MDBmLCAweDAwMDAsIDB4NjA0NCwgMHhjMGZjLCAweDYwNDYsIDB4NjAxNCwKKwkweDIwNDgsIDB4MDgwYywgMHhjOTdhLCAweDAxZTgsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDMsIDB4MTU4MCwKKwkweDA4MGMsIDB4Y2I5MSwgMHgxMTE4LCAweDA4MGMsIDB4YjY5MywgMHgwMDk4LCAweGE4NjcsIDB4MDEwMywKKwkweGFiN2EsIDB4YTg3NywgMHgwMDAwLCAweDAwMTYsIDB4MDAzNiwgMHgwMDg2LCAweDA4MGMsIDB4Y2M3ZiwKKwkweDA4MGMsIDB4ZTc5ZCwgMHgwODBjLCAweDZkZWUsIDB4MDA4ZSwgMHgwMDNlLCAweDAwMWUsIDB4MDgwYywKKwkweGNiNmIsIDB4MDgwYywgMHhhY2ViLCAweDA4MGMsIDB4YTI4MiwgMHgwMGNlLCAweDA4MDQsIDB4OTQ2OCwKKwkweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDA4MDQsIDB4OTQ2OCwgMHgwMTJlLCAweDAwMGUsIDB4MDAxZSwKKwkweDAwNmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDllLCAweDAwYmUsIDB4MDAwNSwKKwkweDYwMjAsIDB4OTA4NiwgMHgwMDA2LCAweDExNTgsIDB4MDAxNiwgMHgwMDM2LCAweDAwODYsIDB4MDgwYywKKwkweGU3OWQsIDB4MDgwYywgMHhlM2U4LCAweDAwOGUsIDB4MDAzZSwgMHgwMDFlLCAweDA4ZDAsIDB4MDgwYywKKwkweGI2OTMsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDIsIDB4MTE2MCwgMHg2MDA0LCAweDAwMDYsIDB4OTA4NiwKKwkweDAwODUsIDB4MDAwZSwgMHgwOTA0LCAweDk0ZDYsIDB4OTA4NiwgMHgwMDhiLCAweDA5MDQsIDB4OTRkNiwKKwkweDA4NDAsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDUsIDB4MTkyMCwgMHg2MDA0LCAweDAwMDYsIDB4OTA4NiwKKwkweDAwODUsIDB4MDAwZSwgMHgwOWM4LCAweDkwODYsIDB4MDA4YiwgMHgwOWIwLCAweDA4MDQsIDB4OTRlOSwKKwkweDAwMDYsIDB4MDBmNiwgMHgwMGU2LCAweDAwOTYsIDB4MDBiNiwgMHgwMGM2LCAweDAwNjYsIDB4MDAxNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDkyODAsIDB4MTAwMCwgMHgyMDA0LCAweDkwNWQsIDB4MjA3OSwKKwkweDE5ZTYsIDB4OTAzNiwgMHg3ODI4LCAweDIwNjAsIDB4OGNmZiwgMHgwNTM4LCAweDYwMTAsIDB4OWIwNiwKKwkweDE1MDAsIDB4NjA0MywgMHhmZmZmLCAweDA4MGMsIDB4YWIwMCwgMHgwMWQ4LCAweDYxMGMsIDB4MDAxNiwKKwkweDA4MGMsIDB4YTA0MiwgMHg2MDE0LCAweDIwNDgsIDB4YTg2NywgMHgwMTAzLCAweGFiN2EsIDB4YTg3NywKKwkweDAwMDAsIDB4MDAxNiwgMHgwMDM2LCAweDAwODYsIDB4MDgwYywgMHhjYzdmLCAweDA4MGMsIDB4ZTc5ZCwKKwkweDA4MGMsIDB4NmRlZSwgMHgwMDhlLCAweDAwM2UsIDB4MDAxZSwgMHgwODBjLCAweGFjZWIsIDB4MDBjZSwKKwkweDA4ZDgsIDB4MmMzMCwgMHg2MDBjLCAweDIwNjAsIDB4MDhiOCwgMHgwODBjLCAweDY4M2QsIDB4MDEyZSwKKwkweDAwMWUsIDB4MDA2ZSwgMHgwMGNlLCAweDAwYmUsIDB4MDA5ZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwZSwKKwkweDAwMDUsIDB4MDA5NiwgMHgwMDA2LCAweDAwNjYsIDB4MDBjNiwgMHgwMGQ2LCAweDkwMzYsIDB4NzgyMCwKKwkweDkwNjUsIDB4MDkwNCwgMHg5NWUyLCAweDYwMGMsIDB4MDAwNiwgMHg2MDQ0LCAweGMwZmMsIDB4NjA0NiwKKwkweDYwMGYsIDB4MDAwMCwgMHg3ODMwLCAweDljMDYsIDB4MTU5OCwgMHgyMDY5LCAweDAxMDAsIDB4NjgyMCwKKwkweGQwYTQsIDB4MDExMCwgMHhkMGNjLCAweDE1MDgsIDB4MDgwYywgMHg4NzgwLCAweDA4MGMsIDB4OWVkNCwKKwkweDY4YzMsIDB4MDAwMCwgMHgwODBjLCAweGEzYWMsIDB4NzgzMywgMHgwMDAwLCAweDAwMzYsIDB4MjA2OSwKKwkweDAxNDAsIDB4NmIwNCwgMHg5Mzg0LCAweDEwMDAsIDB4MDEzOCwgMHgyMDAxLCAweDAxMDAsIDB4MDgwYywKKwkweDJhN2EsIDB4OTAwNiwgMHgwODBjLCAweDJhN2EsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwKKwkweDAxMTAsIDB4NjgyNywgMHgwMDAxLCAweDAwM2UsIDB4MDA1OCwgMHgwODBjLCAweDZhNzUsIDB4MTUzOCwKKwkweDYwMDMsIDB4MDAwOSwgMHg2MzBhLCAweDc4MDgsIDB4YzBhZCwgMHg3ODBhLCAweDJjMzAsIDB4MDBmOCwKKwkweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGM5NzgsIDB4MDFiMCwgMHg2MDIwLCAweDkwODYsIDB4MDAwMywKKwkweDE1MDgsIDB4MDgwYywgMHhjYjkxLCAweDExMTgsIDB4MDgwYywgMHhiNjkzLCAweDAwNjAsIDB4MDgwYywKKwkweDZhNzUsIDB4MTE2OCwgMHhhODY3LCAweDAxMDMsIDB4YWI3YSwgMHhhODc3LCAweDAwMDAsIDB4MDgwYywKKwkweDZkZWUsIDB4MDgwYywgMHhjYjZiLCAweDA4MGMsIDB4YWNlYiwgMHgwODBjLCAweGEyODIsIDB4MDAwZSwKKwkweDA4MDQsIDB4OTU4MCwgMHg3ZTIyLCAweDdlMWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwNmUsIDB4MDAwZSwKKwkweDAwOWUsIDB4MDAwNSwgMHg2MDIwLCAweDkwODYsIDB4MDAwNiwgMHgxMTE4LCAweDA4MGMsIDB4ZTNlOCwKKwkweDBjNTAsIDB4MDgwYywgMHhiNjkzLCAweDYwMjAsIDB4OTA4NiwgMHgwMDAyLCAweDExNTAsIDB4NjAwNCwKKwkweDAwMDYsIDB4OTA4NiwgMHgwMDg1LCAweDAwMGUsIDB4MDk5MCwgMHg5MDg2LCAweDAwOGIsIDB4MDk3OCwKKwkweDA4ZDAsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDUsIDB4MTliMCwgMHg2MDA0LCAweDAwMDYsIDB4OTA4NiwKKwkweDAwODUsIDB4MDAwZSwgMHgwZDE4LCAweDkwODYsIDB4MDA4YiwgMHgwZDAwLCAweDA4NjAsIDB4MDAwNiwKKwkweDAwOTYsIDB4MDBiNiwgMHgwMGM2LCAweDAwNjYsIDB4OTAzNiwgMHg3ODI4LCAweDkwNjUsIDB4MDUxMCwKKwkweDYwMTAsIDB4MjA1OCwgMHg2MDBjLCAweDAwMDYsIDB4M2UwOCwgMHg5MThlLCAweDAwMDIsIDB4MTExOCwKKwkweGI4MDAsIDB4ZDBiYywgMHgxMWE4LCAweDYwNDMsIDB4ZmZmZiwgMHgwODBjLCAweGFiMDAsIDB4MDE4MCwKKwkweDYxMGMsIDB4MDgwYywgMHhhMDQyLCAweDYwMTQsIDB4MjA0OCwgMHhhODY3LCAweDAxMDMsIDB4YWI3YSwKKwkweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweDZkZWUsIDB4MDgwYywgMHhhY2ViLCAweDAwMGUsIDB4MDhmMCwKKwkweDJjMzAsIDB4MGNlMCwgMHgwMDZlLCAweDAwY2UsIDB4MDBiZSwgMHgwMDllLCAweDAwMGUsIDB4MDAwNSwKKwkweDAwZTYsIDB4MDBkNiwgMHgwMDk2LCAweDAwNjYsIDB4MDgwYywgMHg2MWE0LCAweDExYjAsIDB4MjA3MSwKKwkweDE5ZTYsIDB4NzAzMCwgMHg5MDgwLCAweDAwMDUsIDB4MjAwNCwgMHg5MDRkLCAweDAxNzAsIDB4YTg3OCwKKwkweDk2MDYsIDB4MTE1OCwgMHgyMDcxLCAweDE5ZTYsIDB4NzAzMCwgMHg5MDM1LCAweDAxMzAsIDB4OTA4MCwKKwkweDAwMDUsIDB4MjAwNCwgMHg5OTA2LCAweDExMDgsIDB4MDAyOSwgMHgwMDZlLCAweDAwOWUsIDB4MDBkZSwKKwkweDAwZWUsIDB4MDAwNSwgMHgwMGM2LCAweDI2NjAsIDB4NjA0MywgMHhmZmZmLCAweDA4MGMsIDB4YWIwMCwKKwkweDAxNzgsIDB4MDgwYywgMHhhMDQyLCAweDYwMTQsIDB4MjA0OCwgMHhhODY3LCAweDAxMDMsIDB4YWI3YSwKKwkweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweGNjN2YsIDB4MDgwYywgMHg2ZGVlLCAweDA4MGMsIDB4YWNlYiwKKwkweDAwY2UsIDB4MDAwNSwgMHgwMGI2LCAweDAwZTYsIDB4MDBjNiwgMHgwODBjLCAweGE5MWUsIDB4MDEwNiwKKwkweDIwNzEsIDB4MDEwMSwgMHgyZTA0LCAweGMwYzQsIDB4MjA3MiwgMHg2MDQ0LCAweGQwZmMsIDB4MTEzOCwKKwkweDAxMGUsIDB4MDkwYywgMHhhOTNhLCAweDAwY2UsIDB4MDBlZSwgMHgwMGJlLCAweDAwMDUsIDB4MjA3MSwKKwkweDE5ZTYsIDB4NzAzMCwgMHg5MDA1LCAweDBkYTAsIDB4OWMwNiwgMHgxOTBjLCAweDBkN2QsIDB4NzAzNiwKKwkweDA4MGMsIDB4ODc4MCwgMHg3MDA0LCAweDkwODQsIDB4MDAwNywgMHgwMDAyLCAweDk2YTgsIDB4OTZhYSwKKwkweDk2YjEsIDB4OTZiYiwgMHg5NmM5LCAweDk2YTgsIDB4OTZiNiwgMHg5NmE2LCAweDA4MGMsIDB4MGQ3ZCwKKwkweDA0MjgsIDB4MDAwNSwgMHgwODBjLCAweGFhZWIsIDB4NzAwNywgMHgwMDAwLCAweDcwMzMsIDB4MDAwMCwKKwkweDAwZTgsIDB4MDA2NiwgMHg5MDM2LCAweDA4MGMsIDB4YTA0MiwgMHgwMDZlLCAweDcwMDcsIDB4MDAwMCwKKwkweDcwMzMsIDB4MDAwMCwgMHgwMDk4LCAweDA4MGMsIDB4YWFkNiwgMHgwMTQwLCAweDA4MGMsIDB4YWFlYiwKKwkweDAxMjgsIDB4MDA2NiwgMHg5MDM2LCAweDA4MGMsIDB4YTA0MiwgMHgwMDZlLCAweDcwMzMsIDB4MDAwMCwKKwkweDAwMjgsIDB4MDgwYywgMHhhYWQ2LCAweDA4MGMsIDB4YTNhYywgMHgwMDAwLCAweDAxMGUsIDB4MDkwYywKKwkweGE5M2EsIDB4MDBjZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHgwMGQ2LCAweDAwYzYsIDB4MDgwYywKKwkweGE5MWUsIDB4MDEwNiwgMHg2MDQ0LCAweGQwZmMsIDB4MTEzMCwgMHgwMTBlLCAweDA5MGMsIDB4YTkzYSwKKwkweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweDIwNjksIDB4MTllNiwgMHg2ODRjLCAweDkwMDUsIDB4MGRhOCwKKwkweDljMDYsIDB4MTkwYywgMHgwZDdkLCAweDY4NTIsIDB4MDBlNiwgMHgyZDcwLCAweDA4MGMsIDB4OTMwMCwKKwkweDAwZWUsIDB4MDgwYywgMHg4NzhkLCAweDAwMTYsIDB4MjAwOSwgMHgwMDQwLCAweDA4MGMsIDB4MjIwYSwKKwkweDAwMWUsIDB4NjgzYywgMHg5MDg0LCAweDAwMDMsIDB4MDAwMiwgMHg5NzAzLCAweDk3MDQsIDB4OTcyMiwKKwkweDk3MDEsIDB4MDgwYywgMHgwZDdkLCAweDA0NjAsIDB4Njg2OCwgMHg5MDg2LCAweDAwMDEsIDB4MDE5MCwKKwkweDYwMGMsIDB4OTAxNSwgMHgwMTYwLCAweDZhNGEsIDB4NjAwZiwgMHgwMDAwLCAweDYwNDQsIDB4YzBmYywKKwkweDYwNDYsIDB4OTAwNiwgMHg3MDQyLCAweDY4NGUsIDB4NjgzZiwgMHgwMDAwLCAweDAwYzgsIDB4Njg0YSwKKwkweDY4NDYsIDB4MGNhMCwgMHg2ODZiLCAweDAwMDAsIDB4Njg0OCwgMHg5MDY1LCAweDBkNzgsIDB4NjAwMywKKwkweDAwMDIsIDB4MGM2MCwgMHg5MDA2LCAweDY4NmEsIDB4Njg1MiwgMHg2ODZlLCAweDYwMGMsIDB4OTAxNSwKKwkweDAxMjAsIDB4NmE0YSwgMHg2MDBmLCAweDAwMDAsIDB4MDAxOCwgMHg2ODRlLCAweDY4NGEsIDB4Njg0NiwKKwkweDY4NGYsIDB4MDAwMCwgMHgwMTBlLCAweDA5MGMsIDB4YTkzYSwgMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwKKwkweDAwMDUsIDB4NjAyMCwgMHg5MDg0LCAweDAwMGYsIDB4MDAwYiwgMHgwMDA1LCAweDk3NGUsIDB4OTc1MSwKKwkweDliYmYsIDB4OWM1OCwgMHg5NzUxLCAweDliYmYsIDB4OWM1OCwgMHg5NzRlLCAweDk3NTEsIDB4OTc0ZSwKKwkweDk3NGUsIDB4OTc0ZSwgMHg5NzRlLCAweDk3NGUsIDB4OTc0ZSwgMHg5NzRlLCAweDA4MGMsIDB4OTY3YSwKKwkweDAwMDUsIDB4MDBiNiwgMHgwMTU2LCAweDAxMzYsIDB4MDE0NiwgMHgwMWM2LCAweDAxZDYsIDB4MDBjNiwKKwkweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDIwNjksIDB4MDIwMCwgMHgyMDcxLCAweDAyNDAsIDB4NjAwNCwKKwkweDkwOGEsIDB4MDA1MywgMHgxYTBjLCAweDBkN2QsIDB4NjExMCwgMHgyMTU4LCAweGI5ODQsIDB4MmM3OCwKKwkweDIwNjEsIDB4MDEwMCwgMHg2MTlhLCAweDkwOGEsIDB4MDA0MCwgMHgxYTA0LCAweDk3YmQsIDB4MDA1YiwKKwkweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDFkZSwgMHgwMWNlLCAweDAxNGUsIDB4MDEzZSwKKwkweDAxNWUsIDB4MDBiZSwgMHgwMDA1LCAweDk5NDIsIDB4OTk3ZCwgMHg5OWE2LCAweDlhNGUsIDB4OWE3MCwKKwkweDlhNzYsIDB4OWE4MywgMHg5YThiLCAweDlhOTcsIDB4OWE5ZCwgMHg5YWFlLCAweDlhOWQsIDB4OWIwNiwKKwkweDlhOGIsIDB4OWIxMiwgMHg5YjE4LCAweDlhOTcsIDB4OWIxOCwgMHg5YjI0LCAweDk3YmIsIDB4OTdiYiwKKwkweDk3YmIsIDB4OTdiYiwgMHg5N2JiLCAweDk3YmIsIDB4OTdiYiwgMHg5N2JiLCAweDk3YmIsIDB4OTdiYiwKKwkweDk3YmIsIDB4YTA2MywgMHhhMDg2LCAweGEwOTcsIDB4YTBiNywgMHhhMGU5LCAweDlhODMsIDB4OTdiYiwKKwkweDlhODMsIDB4OWE5ZCwgMHg5N2JiLCAweDk5YTYsIDB4OWE0ZSwgMHg5N2JiLCAweGE0YWEsIDB4OWE5ZCwKKwkweDk3YmIsIDB4YTRjNiwgMHg5YTlkLCAweDk3YmIsIDB4OWE5NywgMHg5OTNjLCAweDk3ZGUsIDB4OTdiYiwKKwkweGE0ZTIsIDB4YTU0ZiwgMHhhNjMzLCAweDk3YmIsIDB4YTY0MCwgMHg5YTgwLCAweGE2NmIsIDB4OTdiYiwKKwkweGEwZjMsIDB4YTY3NywgMHg5N2JiLCAweDA4MGMsIDB4MGQ3ZCwgMHgyMTAwLCAweDAwNWIsIDB4MDBmZSwKKwkweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAxZGUsIDB4MDFjZSwgMHgwMTRlLCAweDAxM2UsIDB4MDE1ZSwKKwkweDAwYmUsIDB4MDAwNSwgMHhhNzE3LCAweGE3YzksIDB4OTdkYywgMHg5ODA1LCAweDk4YjEsIDB4OThiYywKKwkweDk3ZGMsIDB4OWE4MywgMHg5N2RjLCAweDk5MDMsIDB4OTkwZiwgMHg5ODIwLCAweDk3ZGMsIDB4OTgzYiwKKwkweDk4NmYsIDB4YWI1NiwgMHhhYjliLCAweDlhOWQsIDB4MDgwYywgMHgwZDdkLCAweDAwZDYsIDB4MDA5NiwKKwkweDA4MGMsIDB4OWIzNywgMHg3MDAzLCAweDI0MTQsIDB4NzAwNywgMHgwMDE4LCAweDcwMGIsIDB4MDgwMCwKKwkweDc4MTQsIDB4MjA0OCwgMHhhODNjLCAweDcwMGUsIDB4YTg1MCwgMHg3MDIyLCAweGE4NTQsIDB4NzAyNiwKKwkweDYwYzMsIDB4MDAxOCwgMHgwODBjLCAweDllYTQsIDB4MDA5ZSwgMHgwMGRlLCAweDAwMDUsIDB4NzgxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiOGEwLCAweDAwYmUsIDB4MDgwYywgMHhhYmUyLCAweDExMTgsIDB4OTA4NCwKKwkweGZmODAsIDB4MDExMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMGQ2LCAweDAwOTYsIDB4MDgwYywKKwkweDliMzcsIDB4NzAwMywgMHgwNTAwLCAweDc4MTQsIDB4MjA0OCwgMHhhODc0LCAweDcwMGEsIDB4YTg3OCwKKwkweDcwMGUsIDB4YTg3YywgMHg3MDEyLCAweGE4ODAsIDB4NzAxNiwgMHhhODg0LCAweDcwMWEsIDB4YTg4OCwKKwkweDcwMWUsIDB4NjBjMywgMHgwMDEwLCAweDA4MGMsIDB4OWVhNCwgMHgwMDllLCAweDAwZGUsIDB4MDAwNSwKKwkweDAwZDYsIDB4MDA5NiwgMHgwODBjLCAweDliMzcsIDB4NzAwMywgMHgwNTAwLCAweDc4MTQsIDB4MjA0OCwKKwkweGE4Y2MsIDB4NzAwYSwgMHhhOGQwLCAweDcwMGUsIDB4YThkNCwgMHg3MDEyLCAweGE4ZDgsIDB4NzAxNiwKKwkweGE4ZGMsIDB4NzAxYSwgMHhhOGUwLCAweDcwMWUsIDB4NjBjMywgMHgwMDEwLCAweDA4MGMsIDB4OWVhNCwKKwkweDAwOWUsIDB4MDBkZSwgMHgwMDA1LCAweDAwZDYsIDB4MDA5NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4OWIzNywgMHgyMGU5LCAweDAwMDAsIDB4MjAwMSwgMHgxOWEyLCAweDIwMDMsIDB4MDAwMCwKKwkweDc4MTQsIDB4MjA0OCwgMHhhODE0LCAweDgwMDMsIDB4NjBjMiwgMHhhODMwLCAweDIwYTgsIDB4YTg2MCwKKwkweDIwZTAsIDB4YTg1YywgMHg5MDgwLCAweDAwMWIsIDB4MjA5OCwgMHgyMDAxLCAweDE5YTIsIDB4MDAxNiwKKwkweDIwMGMsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjFlZiwgMHgwODBjLCAweGQ3MmIsIDB4OTAwNiwKKwkweDA4MGMsIDB4MjFlZiwgMHgwMDFlLCAweGE4MDQsIDB4OTAwNSwgMHgwMTEwLCAweDIwNDgsIDB4MGMyOCwKKwkweDA0ZDksIDB4MDgwYywgMHg5ZWE0LCAweDAxMmUsIDB4MDA5ZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBkNiwKKwkweDAwOTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg5YjgyLCAweDIwZTksIDB4MDAwMCwKKwkweDIwMDEsIDB4MTlhMiwgMHgyMDAzLCAweDAwMDAsIDB4NzgxNCwgMHgyMDQ4LCAweGE4NmYsIDB4MDIwMCwKKwkweGE4NzMsIDB4MDAwMCwgMHhhODE0LCAweDgwMDMsIDB4NjBjMiwgMHhhODMwLCAweDIwYTgsIDB4YTg2MCwKKwkweDIwZTAsIDB4YTg1YywgMHg5MDgwLCAweDAwMWIsIDB4MjA5OCwgMHgyMDAxLCAweDE5YTIsIDB4MDAxNiwKKwkweDIwMGMsIDB4MDgwYywgMHhkNzJiLCAweDAwMWUsIDB4YTgwNCwgMHg5MDA1LCAweDAxMTAsIDB4MjA0OCwKKwkweDBjNjAsIDB4MDA1MSwgMHg3ODE0LCAweDIwNDgsIDB4MDgwYywgMHgwZmY5LCAweDA4MGMsIDB4OWVhNCwKKwkweDAxMmUsIDB4MDA5ZSwgMHgwMGRlLCAweDAwMDUsIDB4NjBjMCwgMHg4MDA0LCAweDkwODQsIDB4MDAwMywKKwkweDkwMDUsIDB4MDEzMCwgMHg5MDgyLCAweDAwMDQsIDB4MjBhMywgMHgwMDAwLCAweDgwMDAsIDB4MWRlMCwKKwkweDAwMDUsIDB4MDgwYywgMHg5YjM3LCAweDcwMDMsIDB4NzgwMCwgMHg3ODA4LCAweDgwMDcsIDB4NzAwYSwKKwkweDYwYzMsIDB4MDAwOCwgMHgwODA0LCAweDllYTQsIDB4MDBkNiwgMHgwMGU2LCAweDA4MGMsIDB4OWI4MiwKKwkweDc4MTQsIDB4OTA4NCwgMHhmZjAwLCAweDIwNzMsIDB4MDIwMCwgMHg4ZTcwLCAweDhlNzAsIDB4OTA5NSwKKwkweDAwMTAsIDB4MjI3MiwgMHg4ZTcwLCAweDIwNzMsIDB4MDAzNCwgMHg4ZTcwLCAweDIwNjksIDB4MTgwNSwKKwkweDIwYTksIDB4MDAwNCwgMHgyZDc2LCAweDhkNjgsIDB4OGU3MCwgMHgxZjA0LCAweDk4ZDIsIDB4MjA2OSwKKwkweDE4MDEsIDB4MjBhOSwgMHgwMDA0LCAweDJkNzYsIDB4OGQ2OCwgMHg4ZTcwLCAweDFmMDQsIDB4OThkYiwKKwkweDIwNjksIDB4MTliMiwgMHg5MDg2LCAweGRmMDAsIDB4MDExMCwgMHgyMDY5LCAweDE5Y2MsIDB4MjBhOSwKKwkweDAwMWEsIDB4OWU4NiwgMHgwMjYwLCAweDExNDgsIDB4MDBjNiwgMHgyMDYxLCAweDAyMDAsIDB4NjAxMCwKKwkweDgwMDAsIDB4NjAxMiwgMHgwMGNlLCAweDIwNzEsIDB4MDI0MCwgMHgyZDA0LCAweDgwMDcsIDB4MjA3MiwKKwkweDhkNjgsIDB4OGU3MCwgMHgxZjA0LCAweDk4ZTksIDB4NjBjMywgMHgwMDRjLCAweDA4MGMsIDB4OWVhNCwKKwkweDAwZWUsIDB4MDBkZSwgMHgwMDA1LCAweDA4MGMsIDB4OWIzNywgMHg3MDAzLCAweDYzMDAsIDB4NzAwNywKKwkweDAwMjgsIDB4NzgwOCwgMHg3MDBlLCAweDYwYzMsIDB4MDAwOCwgMHgwODA0LCAweDllYTQsIDB4MDBkNiwKKwkweDAwMjYsIDB4MDAxNiwgMHgwODBjLCAweDliODIsIDB4NzAwMywgMHgwMjAwLCAweDc4MTQsIDB4NzAwZSwKKwkweDAwZTYsIDB4OWVmMCwgMHgwMDA0LCAweDIwMDksIDB4MDAwMSwgMHgyMDExLCAweDAwMGMsIDB4MjA2OSwKKwkweDE5MjMsIDB4NjgxMCwgMHhkMDg0LCAweDExNDgsIDB4MjA3MywgMHgwNTAwLCAweDhlNzAsIDB4MjA3MywKKwkweDAwMDAsIDB4OGU3MCwgMHg4MTA4LCAweDkyOTAsIDB4MDAwNCwgMHgyMDczLCAweDA4MDAsIDB4OGU3MCwKKwkweDIwNzMsIDB4MDAwMCwgMHgwMGVlLCAweDcyMDYsIDB4NzEwYSwgMHg2MmMyLCAweDA4MGMsIDB4OWVhNCwKKwkweDAwMWUsIDB4MDAyZSwgMHgwMGRlLCAweDAwMDUsIDB4MjAwMSwgMHgxODE4LCAweDIwMDQsIDB4NjA5YSwKKwkweDA4MDQsIDB4OWVhNCwgMHgwODBjLCAweDliMzcsIDB4NzAwMywgMHg1MjAwLCAweDIwNjksIDB4MTg0NywKKwkweDY4MDQsIDB4ZDA4NCwgMHgwMTMwLCAweDY4MjgsIDB4MDAxNiwgMHgwODBjLCAweDI2OTQsIDB4NzEwZSwKKwkweDAwMWUsIDB4MjBhOSwgMHgwMDA0LCAweDIwZTEsIDB4MDAwMSwgMHgyMDk5LCAweDE4MDUsIDB4MjBlOSwKKwkweDAwMDAsIDB4MjBhMSwgMHgwMjUwLCAweDQwMDMsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksIDB4MTgwMSwKKwkweDIwYTEsIDB4MDI1NCwgMHg0MDAzLCAweDA4MGMsIDB4YWJlMiwgMHgxMTIwLCAweGI4YTAsIDB4OTA4MiwKKwkweDAwN2YsIDB4MDI0OCwgMHgyMDAxLCAweDE4MWYsIDB4MjAwNCwgMHg3MDMyLCAweDIwMDEsIDB4MTgyMCwKKwkweDIwMDQsIDB4NzAzNiwgMHgwMDMwLCAweDIwMDEsIDB4MTgxOCwgMHgyMDA0LCAweDkwODQsIDB4MDBmZiwKKwkweDcwMzYsIDB4NjBjMywgMHgwMDFjLCAweDA4MDQsIDB4OWVhNCwgMHgwODBjLCAweDliMzcsIDB4NzAwMywKKwkweDA1MDAsIDB4MDgwYywgMHhhYmUyLCAweDExMjAsIDB4YjhhMCwgMHg5MDgyLCAweDAwN2YsIDB4MDI0OCwKKwkweDIwMDEsIDB4MTgxZiwgMHgyMDA0LCAweDcwMGEsIDB4MjAwMSwgMHgxODIwLCAweDIwMDQsIDB4NzAwZSwKKwkweDAwMzAsIDB4MjAwMSwgMHgxODE4LCAweDIwMDQsIDB4OTA4NCwgMHgwMGZmLCAweDcwMGUsIDB4MjBhOSwKKwkweDAwMDQsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksIDB4MTgwNSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwKKwkweDAyNTAsIDB4NDAwMywgMHg2MGMzLCAweDAwMTAsIDB4MDgwNCwgMHg5ZWE0LCAweDA4MGMsIDB4OWIzNywKKwkweDkwMDYsIDB4MDgwYywgMHg2YWE3LCAweGI4YTAsIDB4OTA4NiwgMHgwMDdlLCAweDExMzAsIDB4NzAwMywKKwkweDA0MDAsIDB4NjIwYywgMHhjMmI0LCAweDYyMGUsIDB4MDA1OCwgMHg3ODE0LCAweDAwOTYsIDB4OTA0ZCwKKwkweDAxMjAsIDB4OTAwNiwgMHhhODlhLCAweGE4YTYsIDB4YThhYSwgMHgwMDllLCAweDcwMDMsIDB4MDMwMCwKKwkweGI4YTAsIDB4OTA4NiwgMHgwMDdlLCAweDE5MDQsIDB4OWExNSwgMHgwMGQ2LCAweDIwNjksIDB4MTk2YiwKKwkweDIwMDEsIDB4MTgzNywgMHgyMDA0LCAweGQwYTQsIDB4MDE4OCwgMHg2ODAwLCAweDcwMGEsIDB4NjgwOCwKKwkweDkwODQsIDB4MjAwMCwgMHg3MDEyLCAweDA4MGMsIDB4YWJmOSwgMHg2ODBjLCAweDcwMTYsIDB4NzAxZiwKKwkweDI3MTAsIDB4NjgxOCwgMHg3MDIyLCAweDY4MWMsIDB4NzAyNiwgMHgwMDkwLCAweDY4MDAsIDB4NzAwYSwKKwkweDY4MDQsIDB4NzAwZSwgMHg2ODA4LCAweDA4MGMsIDB4NzUzZCwgMHgxMTE4LCAweDkwODQsIDB4MzdmZiwKKwkweDAwMTAsIDB4OTA4NCwgMHgzZmZmLCAweDcwMTIsIDB4MDgwYywgMHhhYmY5LCAweDY4MGMsIDB4NzAxNiwKKwkweDAwZGUsIDB4MjBhOSwgMHgwMDA0LCAweDIwZTEsIDB4MDAwMSwgMHgyMDk5LCAweDE4MDUsIDB4MjBlOSwKKwkweDAwMDAsIDB4MjBhMSwgMHgwMjU2LCAweDQwMDMsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksIDB4MTgwMSwKKwkweDIwYTEsIDB4MDI1YSwgMHg0MDAzLCAweDAwZDYsIDB4MDgwYywgMHhhNmZlLCAweDIwNjksIDB4MTk3MywKKwkweDIwNzEsIDB4MDI0ZSwgMHg2ODAwLCAweGMwZGQsIDB4NzAwMiwgMHgwODBjLCAweDU3NDIsIDB4ZDBlNCwKKwkweDAxMTAsIDB4NjgwYywgMHg3MDBlLCAweDAwZGUsIDB4MDRhOCwgMHgyMDAxLCAweDE4MzcsIDB4MjAwNCwKKwkweGQwYTQsIDB4MDE3MCwgMHgwMDE2LCAweDIwMDEsIDB4MTk2YywgMHgyMDBjLCAweDYwZTAsIDB4OTEwNiwKKwkweDAxMzAsIDB4MjEwMCwgMHg2MGUzLCAweDAwMDAsIDB4MDgwYywgMHgyNmQ1LCAweDYxZTIsIDB4MDAxZSwKKwkweDIwZTEsIDB4MDAwMSwgMHgyMDk5LCAweDE5NmIsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0ZSwKKwkweDIwYTksIDB4MDAwOCwgMHg0MDAzLCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LCAweDE4MDUsIDB4MjBhMSwKKwkweDAyNTYsIDB4NDAwMywgMHgyMGE5LCAweDAwMDQsIDB4MjA5OSwgMHgxODAxLCAweDIwYTEsIDB4MDI1YSwKKwkweDQwMDMsIDB4MDgwYywgMHhhNmZlLCAweDIwYTEsIDB4MDI0ZSwgMHgyMGE5LCAweDAwMDgsIDB4MjA5OSwKKwkweDE5NzMsIDB4NDAwMywgMHg2MGMzLCAweDAwNzQsIDB4MDgwNCwgMHg5ZWE0LCAweDA4MGMsIDB4OWIzNywKKwkweDcwMDMsIDB4MjAxMCwgMHg3MDA3LCAweDAwMTQsIDB4NzAwYiwgMHgwODAwLCAweDcwMGYsIDB4MjAwMCwKKwkweDkwMDYsIDB4MDBmNiwgMHgyMDc5LCAweDE4NDcsIDB4NzkwNCwgMHgwMGZlLCAweGQxYWMsIDB4MTExMCwKKwkweDkwODUsIDB4MDAyMCwgMHhkMWE0LCAweDAxMTAsIDB4OTA4NSwgMHgwMDEwLCAweDkwODUsIDB4MDAwMiwKKwkweDAwZDYsIDB4MDgwNCwgMHg5YWU3LCAweDcwMjYsIDB4NjBjMywgMHgwMDE0LCAweDA4MDQsIDB4OWVhNCwKKwkweDA4MGMsIDB4OWIzNywgMHg3MDAzLCAweDUwMDAsIDB4MDgwNCwgMHg5OWMwLCAweDA4MGMsIDB4OWIzNywKKwkweDcwMDMsIDB4MjExMCwgMHg3MDA3LCAweDAwMTQsIDB4NjBjMywgMHgwMDE0LCAweDA4MDQsIDB4OWVhNCwKKwkweDA4MGMsIDB4OWI3OSwgMHgwMDEwLCAweDA4MGMsIDB4OWI4MiwgMHg3MDAzLCAweDAyMDAsIDB4NjBjMywKKwkweDAwMDQsIDB4MDgwNCwgMHg5ZWE0LCAweDA4MGMsIDB4OWI4MiwgMHg3MDAzLCAweDAxMDAsIDB4NzAwYiwKKwkweDAwMDMsIDB4NzAwZiwgMHgyYTAwLCAweDYwYzMsIDB4MDAwOCwgMHgwODA0LCAweDllYTQsIDB4MDgwYywKKwkweDliODIsIDB4NzAwMywgMHgwMjAwLCAweDA4MDQsIDB4OTljMCwgMHgwODBjLCAweDliODIsIDB4NzAwMywKKwkweDAxMDAsIDB4NzgyYywgMHg5MDA1LCAweDAxMTAsIDB4NzAwYSwgMHgwMDEwLCAweDcwMGIsIDB4MDAwMywKKwkweDc4MTQsIDB4NzAwZSwgMHg2MGMzLCAweDAwMDgsIDB4MDgwNCwgMHg5ZWE0LCAweDAwZDYsIDB4MDgwYywKKwkweDliODIsIDB4NzAwMywgMHgwMjEwLCAweDcwMDcsIDB4MDAxNCwgMHg3MDBiLCAweDA4MDAsIDB4Yjg5NCwKKwkweDkwODYsIDB4MDAxNCwgMHgxMTk4LCAweGI5OWMsIDB4OTE4NCwgMHgwMDMwLCAweDAxOTAsIDB4Yjk5OCwKKwkweDkxODQsIDB4YzAwMCwgMHgxMTQwLCAweGQxZWMsIDB4MDExOCwgMHg3MDBmLCAweDIxMDAsIDB4MDA1OCwKKwkweDcwMGYsIDB4MDEwMCwgMHgwMDQwLCAweDcwMGYsIDB4MDQwMCwgMHgwMDI4LCAweDcwMGYsIDB4MDcwMCwKKwkweDAwMTAsIDB4NzAwZiwgMHgwODAwLCAweDAwZjYsIDB4MjA3OSwgMHgxODQ3LCAweDc5MDQsIDB4MDBmZSwKKwkweGQxYWMsIDB4MTExMCwgMHg5MDg1LCAweDAwMjAsIDB4ZDFhNCwgMHgwMTEwLCAweDkwODUsIDB4MDAxMCwKKwkweDIwMDksIDB4MTg2OSwgMHgyMTBjLCAweGQxODQsIDB4MTExMCwgMHg5MDg1LCAweDAwMDIsIDB4MDAyNiwKKwkweDIwMDksIDB4MTg2NywgMHgyMTBjLCAweGQxZTQsIDB4MDE1MCwgMHhjMGM1LCAweGJhZDQsIDB4ZDI4YywKKwkweDExMDgsIDB4YzBjZCwgMHg5MDk0LCAweDAwMzAsIDB4OTI5NiwgMHgwMDEwLCAweDAxNDAsIDB4ZDFlYywKKwkweDAxMzAsIDB4OTA5NCwgMHgwMDMwLCAweDkyOTYsIDB4MDAxMCwgMHgwMTA4LCAweGMwYmQsIDB4MDAyZSwKKwkweDcwMjYsIDB4NjBjMywgMHgwMDE0LCAweDAwZGUsIDB4MDgwNCwgMHg5ZWE0LCAweDA4MGMsIDB4OWI4MiwKKwkweDcwMDMsIDB4MDIxMCwgMHg3MDA3LCAweDAwMTQsIDB4NzAwZiwgMHgwMTAwLCAweDYwYzMsIDB4MDAxNCwKKwkweDA4MDQsIDB4OWVhNCwgMHgwODBjLCAweDliODIsIDB4NzAwMywgMHgwMjAwLCAweDA4MDQsIDB4OTk0NiwKKwkweDA4MGMsIDB4OWI4MiwgMHg3MDAzLCAweDAxMDAsIDB4NzAwYiwgMHgwMDAzLCAweDcwMGYsIDB4MmEwMCwKKwkweDYwYzMsIDB4MDAwOCwgMHgwODA0LCAweDllYTQsIDB4MDgwYywgMHg5YjgyLCAweDcwMDMsIDB4MDEwMCwKKwkweDcwMGIsIDB4MDAwYiwgMHg2MGMzLCAweDAwMDgsIDB4MDgwNCwgMHg5ZWE0LCAweDAwMjYsIDB4MDBkNiwKKwkweDAwMzYsIDB4MDA0NiwgMHgyMDE5LCAweDMyMDAsIDB4MjAyMSwgMHgwODAwLCAweDAwNDAsIDB4MDAyNiwKKwkweDAwZDYsIDB4MDAzNiwgMHgwMDQ2LCAweDIwMTksIDB4MjIwMCwgMHgyMDIxLCAweDAxMDAsIDB4MDgwYywKKwkweGE3MTMsIDB4YjgxMCwgMHg5MzA1LCAweDcwMDIsIDB4YjgxNCwgMHg3MDA2LCAweDIwNjksIDB4MTgwMCwKKwkweDY4N2MsIDB4NzAwYSwgMHg2ODgwLCAweDcwMGUsIDB4OTQ4NSwgMHgwMDI5LCAweDcwMTIsIDB4MDA0ZSwKKwkweDAwM2UsIDB4MDBkZSwgMHgwODBjLCAweDllOTgsIDB4NzIxYSwgMHg5Zjk1LCAweDAwMDAsIDB4NzIyMiwKKwkweDcwMjcsIDB4ZmZmZiwgMHgyMDcxLCAweDAyNGMsIDB4MDAyZSwgMHgwMDA1LCAweDAwMjYsIDB4MDgwYywKKwkweGE3MTMsIDB4NzAwMywgMHgwMmZmLCAweDcwMDcsIDB4ZmZmYywgMHgwMGQ2LCAweDIwNjksIDB4MTgwMCwKKwkweDY4N2MsIDB4NzAwYSwgMHg2ODgwLCAweDcwMGUsIDB4MDBkZSwgMHg3MDEzLCAweDIwMjksIDB4MGMxMCwKKwkweDcwMDMsIDB4MDEwMCwgMHg3MDA3LCAweDAwMDAsIDB4NzAwYiwgMHhmYzAyLCAweDcwMGYsIDB4MDAwMCwKKwkweDAwMDUsIDB4MDAyNiwgMHgwMGQ2LCAweDAwMzYsIDB4MDA0NiwgMHgyMDE5LCAweDMzMDAsIDB4MjAyMSwKKwkweDA4MDAsIDB4MDA0MCwgMHgwMDI2LCAweDAwZDYsIDB4MDAzNiwgMHgwMDQ2LCAweDIwMTksIDB4MjMwMCwKKwkweDIwMjEsIDB4MDEwMCwgMHgwODBjLCAweGE3MTMsIDB4YjgxMCwgMHg5MzA1LCAweDcwMDIsIDB4YjgxNCwKKwkweDcwMDYsIDB4MjA2OSwgMHgxODAwLCAweGI4MTAsIDB4OTAwNSwgMHgxMTQwLCAweGI4MTQsIDB4OTAwNSwKKwkweDExMjgsIDB4NzAwYiwgMHgwMGZmLCAweDcwMGYsIDB4ZmZmZSwgMHgwMDIwLCAweDY4N2MsIDB4NzAwYSwKKwkweDY4ODAsIDB4NzAwZSwgMHgwMDAwLCAweDk0ODUsIDB4MDA5OCwgMHg3MDEyLCAweDAwNGUsIDB4MDAzZSwKKwkweDAwZGUsIDB4MDgwYywgMHg5ZTk4LCAweDcyMWEsIDB4N2EwOCwgMHg3MjIyLCAweDJmMTAsIDB4NzIyNiwKKwkweDIwNzEsIDB4MDI0YywgMHgwMDJlLCAweDAwMDUsIDB4MDgwYywgMHg5ZTk4LCAweDcyMWEsIDB4N2EwOCwKKwkweDcyMjIsIDB4NzgxNCwgMHg3MDI2LCAweDIwNzEsIDB4MDI0YywgMHgwMDJlLCAweDAwMDUsIDB4MDBiNiwKKwkweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MjA2OSwgMHgwMjAwLCAweDIwNzEsIDB4MDI0MCwKKwkweDYwMDQsIDB4OTA4YSwgMHgwMDg1LCAweDBhMGMsIDB4MGQ3ZCwgMHg5MDhhLCAweDAwOTIsIDB4MWEwYywKKwkweDBkN2QsIDB4NjExMCwgMHgyMTU4LCAweGI5ODQsIDB4MmM3OCwgMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwKKwkweDkwODIsIDB4MDA4NSwgMHgwMDMzLCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDBiZSwKKwkweDAwMDUsIDB4OWJmMCwgMHg5YmZmLCAweDljMGEsIDB4OWJlZSwgMHg5YmVlLCAweDliZWUsIDB4OWJmMCwKKwkweDliZWUsIDB4OWJlZSwgMHg5YmVlLCAweDliZWUsIDB4OWJlZSwgMHg5YmVlLCAweDA4MGMsIDB4MGQ3ZCwKKwkweDA0MTEsIDB4NjBjMywgMHgwMDAwLCAweDAwMjYsIDB4MDgwYywgMHgyOWU1LCAweDAyMjgsIDB4MjAxMSwKKwkweDAxMDEsIDB4MjIwNCwgMHhjMGM1LCAweDIwMTIsIDB4MDAyZSwgMHgwODA0LCAweDllYTQsIDB4MDQzMSwKKwkweDc4MDgsIDB4NzAwYSwgMHg3ODE0LCAweDcwMGUsIDB4NzAxNywgMHhmZmZmLCAweDYwYzMsIDB4MDAwYywKKwkweDA4MDQsIDB4OWVhNCwgMHgwNGExLCAweDcwMDMsIDB4MDAwMywgMHg3MDA3LCAweDAzMDAsIDB4NjBjMywKKwkweDAwMDQsIDB4MDgwNCwgMHg5ZWE0LCAweDAwMjYsIDB4MDgwYywgMHhhNzEzLCAweGI4MTAsIDB4OTA4NSwKKwkweDgxMDAsIDB4NzAwMiwgMHhiODE0LCAweDcwMDYsIDB4MjA2OSwgMHgxODAwLCAweDY4N2MsIDB4NzAwYSwKKwkweDY4ODAsIDB4NzAwZSwgMHg3MDEzLCAweDAwMDksIDB4MDgwNCwgMHg5YjUyLCAweDAwMjYsIDB4MDgwYywKKwkweGE3MTMsIDB4YjgxMCwgMHg5MDg1LCAweDg0MDAsIDB4NzAwMiwgMHhiODE0LCAweDcwMDYsIDB4MjA2OSwKKwkweDE4MDAsIDB4Njg3YywgMHg3MDBhLCAweDY4ODAsIDB4NzAwZSwgMHgyMDAxLCAweDAwOTksIDB4N2EyMCwKKwkweDkyOTYsIDB4MDAwNSwgMHgwMTA4LCAweGMwYmMsIDB4NzAxMiwgMHgwODA0LCAweDliYjQsIDB4MDAyNiwKKwkweDA4MGMsIDB4YTcxMywgMHhiODEwLCAweDkwODUsIDB4ODUwMCwgMHg3MDAyLCAweGI4MTQsIDB4NzAwNiwKKwkweDIwNjksIDB4MTgwMCwgMHg2ODdjLCAweDcwMGEsIDB4Njg4MCwgMHg3MDBlLCAweDIwMDEsIDB4MDA5OSwKKwkweDdhMjAsIDB4OTI5NiwgMHgwMDA1LCAweDAxMDgsIDB4YzBiYywgMHg3MDEyLCAweDA4MDQsIDB4OWJiNCwKKwkweDAwYjYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgyYzc4LCAweDIwNjksIDB4MDIwMCwKKwkweDIwNzEsIDB4MDI0MCwgMHg3ODA0LCAweDkwOGEsIDB4MDA0MCwgMHgwYTBjLCAweDBkN2QsIDB4OTA4YSwKKwkweDAwNTcsIDB4MWEwYywgMHgwZDdkLCAweDc5MTAsIDB4MjE1OCwgMHhiOTg0LCAweDIwNjEsIDB4MDEwMCwKKwkweDYxOWEsIDB4OTA4MiwgMHgwMDQwLCAweDAwMzMsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwKKwkweDAwYmUsIDB4MDAwNSwgMHg5YzhkLCAweDljOGQsIDB4OWM4ZCwgMHg5Y2IzLCAweDljOGQsIDB4OWM4ZCwKKwkweDljOGQsIDB4OWM4ZCwgMHg5YzhkLCAweDljOGQsIDB4OWM4ZCwgMHhhMjVmLCAweGEyNjcsIDB4YTI2ZiwKKwkweGEyNzcsIDB4OWM4ZCwgMHg5YzhkLCAweDljOGQsIDB4YTI1NywgMHgwODBjLCAweDBkN2QsIDB4NjgxMywKKwkweDAwMDgsIDB4YmE4YywgMHg4MjEwLCAweGI4ZDQsIDB4ZDA4NCwgMHgwMTI4LCAweDdhNTIsIDB4N2IxNCwKKwkweDdiNGUsIDB4NzIyZSwgMHg3MzJhLCAweDkyOTQsIDB4MDBmZiwgMHhiYThlLCAweDgyMTcsIDB4NzIxYSwKKwkweGJhMTAsIDB4OTI5NSwgMHgwNjAwLCAweDcyMDIsIDB4YmExNCwgMHg3MjA2LCAweDIwNjksIDB4MTgwMCwKKwkweDZhN2MsIDB4NzIwYSwgMHg2YTgwLCAweDcyMGUsIDB4NzAxMywgMHgwODI5LCAweDJmMTAsIDB4NzIyMiwKKwkweDcwMjcsIDB4ZmZmZiwgMHgwMDA1LCAweDAwMTYsIDB4NzgxNCwgMHg5MDg0LCAweDA3MDAsIDB4ODAwNywKKwkweDAwMTMsIDB4MDAxZSwgMHgwMDA1LCAweDljYzMsIDB4OWNjMywgMHg5Y2M1LCAweDljYzMsIDB4OWNjMywKKwkweDljYzMsIDB4OWNkZiwgMHg5Y2MzLCAweDA4MGMsIDB4MGQ3ZCwgMHg3OTE0LCAweDkxOGMsIDB4MDhmZiwKKwkweDkxOGQsIDB4ZjYwMCwgMHg3OTE2LCAweDIwMDksIDB4MDAwMywgMHgwMGI5LCAweDIwNjksIDB4MTg0NywKKwkweDY4MDQsIDB4ZDBiYywgMHgwMTMwLCAweDY4MmMsIDB4OTA4NCwgMHgwMGZmLCAweDgwMDcsIDB4NzAzMiwKKwkweDAwMTAsIDB4NzAzMywgMHgzZjAwLCAweDYwYzMsIDB4MDAwMSwgMHgwODA0LCAweDllYTQsIDB4MjAwOSwKKwkweDAwMDMsIDB4MDAxOSwgMHg3MDMzLCAweDdmMDAsIDB4MGNiMCwgMHgwMDE2LCAweDA4MGMsIDB4YTcxMywKKwkweDAwMWUsIDB4YjgxMCwgMHg5MDg1LCAweDAxMDAsIDB4NzAwMiwgMHhiODE0LCAweDcwMDYsIDB4MjA2OSwKKwkweDE4MDAsIDB4NmE3YywgMHg3MjBhLCAweDZhODAsIDB4NzIwZSwgMHg3MDEzLCAweDA4ODgsIDB4OTE4ZCwKKwkweDAwMDgsIDB4NzExNiwgMHgwODBjLCAweDllOTgsIDB4NzIxYSwgMHg3YTA4LCAweDcyMjIsIDB4MmYxMCwKKwkweDcyMjYsIDB4MDAwNSwgMHgwMGI2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwNjYsIDB4MDA1NiwKKwkweDAwNDYsIDB4MDAzNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHgxODAwLCAweDcxNjAsIDB4NzgxMCwKKwkweDIwNTgsIDB4NzZkYywgMHg5NmI0LCAweDAwMjgsIDB4MDExMCwgMHg3MzdjLCAweDc0ODAsIDB4MjUwMCwKKwkweDc2ZGMsIDB4OTZiNCwgMHgwMDI4LCAweDAxNDAsIDB4MjAwMSwgMHgwNGZmLCAweDYwNjIsIDB4NjA2NywKKwkweGZmZmYsIDB4NjM2YSwgMHg2NDZlLCAweDAwNTAsIDB4MjAwMSwgMHgwMGZmLCAweDkwODUsIDB4MDQwMCwKKwkweDYwNjIsIDB4NjA2NywgMHhmZmZmLCAweDYwNmIsIDB4MDAwMCwgMHg2MTZlLCAweGI4YjgsIDB4NjA3MywKKwkweDA1MzAsIDB4NjA3NywgMHgwMDA4LCAweGI4OGMsIDB4ODAwMCwgMHg5MDg0LCAweDAwZmYsIDB4Yjg4ZSwKKwkweDgwMDcsIDB4OTA4NSwgMHgwMDIwLCAweDYwN2EsIDB4NjA3ZiwgMHgwMDAwLCAweDJiMDAsIDB4NjA4MiwKKwkweDYwODcsIDB4ZmZmZiwgMHg3ODE0LCAweDAwOTYsIDB4MjA0OCwgMHhhODQ4LCAweDYwOGEsIDB4YTg0NCwKKwkweDYwOGUsIDB4YTgzOCwgMHg2MGM2LCAweGE4MzQsIDB4NjBjYSwgMHgwMDllLCAweGI4NmMsIDB4NjBjZSwKKwkweDYwYWIsIDB4MDAzNiwgMHg2MGFmLCAweDk1ZDUsIDB4NjBkNywgMHgwMDAwLCAweDIwMDEsIDB4MTgzNywKKwkweDIwMDQsIDB4OTA4NCwgMHgwMDI4LCAweDAxMjgsIDB4NjA5ZiwgMHgwMDAwLCAweDIwMDEsIDB4MDA5MiwKKwkweDAwNTgsIDB4NjAyOCwgMHhjMGJkLCAweDYwMmEsIDB4NjA5ZiwgMHgwMGZmLCAweDIwMTEsIDB4ZmZmZiwKKwkweDA4MGMsIDB4MmFiNCwgMHgyMDAxLCAweDAwYjIsIDB4MjAxMCwgMHg5MDBlLCAweDA4MGMsIDB4MmFjMywKKwkweDIwMDksIDB4MDdkMCwgMHgwODBjLCAweDg3ODUsIDB4MDAzZSwgMHgwMDRlLCAweDAwNWUsIDB4MDA2ZSwKKwkweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHgwMGI2LCAweDAwZTYsIDB4MDBkNiwKKwkweDAwYzYsIDB4MDA2NiwgMHgwMDU2LCAweDAwNDYsIDB4MDAzNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzE2MCwgMHg3ODEwLCAweDIwNTgsIDB4YjhhMCwgMHgyMDI4LCAweDc2ZGMsIDB4ZDZhYywKKwkweDExNjgsIDB4OTU4MiwgMHgwMDdlLCAweDEyNTAsIDB4MjUwMCwgMHg5MDk0LCAweGZmODAsIDB4MTEzMCwKKwkweDkwODAsIDB4MzNiOSwgMHgyMDE1LCAweDkyOTQsIDB4MDBmZiwgMHgwMDIwLCAweGI5MTAsIDB4YmExNCwKKwkweDczN2MsIDB4NzQ4MCwgMHg3MGRjLCAweGQwYWMsIDB4MTEzMCwgMHg5NTgyLCAweDAwN2UsIDB4MTIxOCwKKwkweDk1ODQsIDB4ZmY4MCwgMHgwMTM4LCAweDkxODUsIDB4MDQwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjM2YSwKKwkweDY0NmUsIDB4MDAzMCwgMHg2MDYzLCAweDA0MDAsIDB4NjI2NiwgMHg2MDZiLCAweDAwMDAsIDB4NjE2ZSwKKwkweGI4YjgsIDB4NjA3MiwgMHg2MDc3LCAweDAwMDAsIDB4Yjg2NCwgMHhkMGE0LCAweDAxMTAsIDB4NjA3NywKKwkweDAwMDgsIDB4Yjg4YywgMHg4MDAwLCAweDkwODQsIDB4MDBmZiwgMHhiODhlLCAweDgwMDcsIDB4OTA4NSwKKwkweDAwMjAsIDB4NjA3YSwgMHg2MDdmLCAweDAwMDAsIDB4MmIwMCwgMHg2MDgyLCAweDYwODcsIDB4ZmZmZiwKKwkweDc4MTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4NDgsIDB4NjA4YSwgMHhhODQ0LCAweDYwOGUsIDB4YTgzOCwKKwkweDYwYzYsIDB4YTgzNCwgMHg2MGNhLCAweDAwOWUsIDB4Yjg2YywgMHg2MGNlLCAweDYwYWIsIDB4MDAzNiwKKwkweDYwYWYsIDB4OTVkNSwgMHg2MGQ3LCAweDAwMDAsIDB4YmE4NCwgMHg2MjllLCAweDAwZjYsIDB4MjA3OSwKKwkweDAxNDAsIDB4NzgwMywgMHgwMDAwLCAweDAwZmUsIDB4OTAwZSwgMHgyMDExLCAweDAwOTIsIDB4MDgwYywKKwkweDJhYzMsIDB4MjAwOSwgMHgwN2QwLCAweDA4MGMsIDB4ODc4NSwgMHgwMDNlLCAweDAwNGUsIDB4MDA1ZSwKKwkweDAwNmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweDAwYjYsIDB4MDA5NiwKKwkweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwNTYsIDB4MDA0NiwgMHgwMDM2LCAweDIwNjEsIDB4MDEwMCwKKwkweDIwNzEsIDB4MTgwMCwgMHg3ODEwLCAweDIwNTgsIDB4YjhhMCwgMHgyMDI4LCAweGI5MTAsIDB4YmExNCwKKwkweDczN2MsIDB4NzQ4MCwgMHg3ODIwLCAweDAwMDIsIDB4OWUyMywgMHg5ZTIzLCAweDllMjMsIDB4OWUyMywKKwkweDllMjMsIDB4OWUyMywgMHg5ZTIzLCAweDllMjMsIDB4OWUyMywgMHg5ZTIzLCAweDllMjUsIDB4OWUyMywKKwkweDllMjMsIDB4OWUyMywgMHg5ZTIzLCAweDA4MGMsIDB4MGQ3ZCwgMHhiODg0LCAweDYwOWUsIDB4NzgxNCwKKwkweDIwNDgsIDB4YTg3YywgMHhkMGZjLCAweDA1NTgsIDB4YWY5MCwgMHg5Nzg0LCAweGZmMDAsIDB4OTEwNSwKKwkweDYwNjIsIDB4ODczZiwgMHg5Nzg0LCAweGZmMDAsIDB4MDAwNiwgMHg3ODE0LCAweDIwNDgsIDB4YTg3OCwKKwkweGMwZmMsIDB4OTAwNSwgMHgwMDBlLCAweDExNjAsIDB4YWY5NCwgMHg4N2ZmLCAweDAxOTgsIDB4MjAzOSwKKwkweDAwOTgsIDB4OTcwNSwgMHg2MDcyLCAweDc4MDgsIDB4NjA4MiwgMHgyZjAwLCAweDYwODYsIDB4MDAzOCwKKwkweDkxODUsIDB4MjIwMCwgMHg2MDYyLCAweDYwNzMsIDB4MDEyOSwgMHg2MDc3LCAweDAwMDAsIDB4Yjg4NCwKKwkweDYwOWUsIDB4MDA1MCwgMHgyMDM5LCAweDAwMjksIDB4OTcwNSwgMHg2MDcyLCAweDBjYzAsIDB4OTE4NSwKKwkweDAyMDAsIDB4NjA2MiwgMHg2MDczLCAweDIwMjksIDB4YTg3YywgMHhkMGZjLCAweDAxMTgsIDB4YWY5NCwKKwkweDg3ZmYsIDB4MTEyMCwgMHgyZjAwLCAweDYwODIsIDB4NzgwOCwgMHg2MDg2LCAweDYyNjYsIDB4NjM2YSwKKwkweDY0NmUsIDB4NjA3NywgMHgwMDAwLCAweGI4OGMsIDB4ODAwMCwgMHg5MDg0LCAweDAwZmYsIDB4Yjg4ZSwKKwkweDgwMDcsIDB4NjA3YSwgMHg2MDdmLCAweDAwMDAsIDB4YTg0OCwgMHg2MDhhLCAweGE4NDQsIDB4NjA4ZSwKKwkweGE4MzgsIDB4NjBjNiwgMHhhODM0LCAweDYwY2EsIDB4Yjg2YywgMHg2MGNlLCAweDYwYWYsIDB4OTVkNSwKKwkweDYwZDcsIDB4MDAwMCwgMHgwODBjLCAweGE2ZjMsIDB4MjAwOSwgMHgwN2QwLCAweDYwYzQsIDB4OTA4NCwKKwkweGZmZjAsIDB4OTAwNSwgMHgwMTEwLCAweDIwMDksIDB4MWI1OCwgMHgwODBjLCAweDg3ODUsIDB4MDAzZSwKKwkweDAwNGUsIDB4MDA1ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMDllLCAweDAwYmUsIDB4MDAwNSwKKwkweDdhNDAsIDB4OTI5NCwgMHgwMGZmLCAweDgyMTcsIDB4MDAwNSwgMHgwMGQ2LCAweDIwNjksIDB4MTllNiwKKwkweDY4NmIsIDB4MDAwMSwgMHgwMGRlLCAweDAwMDUsIDB4NjBhMywgMHgwMDU2LCAweDYwYTcsIDB4OTU3NSwKKwkweDAwZjEsIDB4MDgwYywgMHg4Nzc3LCAweDAwMDUsIDB4MDAxNiwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywKKwkweDkxODQsIDB4MDYwMCwgMHg5MDg2LCAweDA2MDAsIDB4MDEyOCwgMHgwMDg5LCAweDA4MGMsIDB4ODc3NywKKwkweDAwMWUsIDB4MDAwNSwgMHhjMWU1LCAweDIwMDEsIDB4MTgwYywgMHgyMTAyLCAweDIwMDEsIDB4MTllNywKKwkweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDE5ZjIsIDB4MjAwMywgMHgwMDAwLCAweDBjODgsIDB4MDAwNiwKKwkweDAwMTYsIDB4MDAyNiwgMHgyMDA5LCAweDE4MDQsIDB4MjAxMSwgMHgwMDA5LCAweDA4MGMsIDB4MmFjMywKKwkweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDAxNiwgMHgwMGM2LCAweDAwMDYsIDB4MDgwYywKKwkweGE5MWUsIDB4MDEwNiwgMHgyMDYxLCAweDAxMDAsIDB4NjFhNCwgMHg2MGE3LCAweDk1ZjUsIDB4MDAxNiwKKwkweDAwMjYsIDB4MjAwOSwgMHgxODA0LCAweDIwMTEsIDB4MDAwOCwgMHgwODBjLCAweDJhYzMsIDB4MDAyZSwKKwkweDAwMWUsIDB4MDEwZSwgMHgwOTBjLCAweGE5M2EsIDB4MDAwZSwgMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwKKwkweDYxYTYsIDB4MDBjZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LCAweDAwMTYsIDB4MDAyNiwKKwkweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4MDgwYywgMHg3NTNkLCAweDE1MTAsIDB4MjAwMSwKKwkweDFhMGIsIDB4MjAwNCwgMHg5MDA1LCAweDE5MDQsIDB4OWY1MywgMHgwODBjLCAweDc1ZTIsIDB4MTFhOCwKKwkweDIwNjksIDB4MDM4MCwgMHg2ODQzLCAweDAxMDEsIDB4Njg0NCwgMHhkMDg0LCAweDFkZTgsIDB4MjA2MSwKKwkweDAxMDAsIDB4NjAyMCwgMHhkMGI0LCAweDExMjAsIDB4NjAyNCwgMHhkMDg0LCAweDA5MGMsIDB4MGQ3ZCwKKwkweDY4NDMsIDB4MDEwMCwgMHgwODBjLCAweDg3NzcsIDB4MDRiMCwgMHgwMGM2LCAweDIwNjEsIDB4MTllNiwKKwkweDAwZjAsIDB4NjkwNCwgMHg5MTk0LCAweDQwMDAsIDB4MDU5OCwgMHgwODBjLCAweDllZDQsIDB4MDgwYywKKwkweDJhOGEsIDB4MDBjNiwgMHgyMDYxLCAweDE5ZTYsIDB4NjEzNCwgMHg5MTkyLCAweDAwMDgsIDB4MTI3OCwKKwkweDgxMDgsIDB4NjEzNiwgMHgwODBjLCAweGE5MWUsIDB4NjEzMCwgMHgwODBjLCAweGE5M2EsIDB4MDBjZSwKKwkweDgxZmYsIDB4MDFjOCwgMHgwODBjLCAweDg3NzcsIDB4MDgwYywgMHg5ZWM3LCAweDAwYTAsIDB4MDgwYywKKwkweGE5MWUsIDB4NjEzMCwgMHg5MWU1LCAweDAwMDAsIDB4MDE1MCwgMHgwODBjLCAweGU4OTcsIDB4MDgwYywKKwkweDg3ODAsIDB4NjAwMywgMHgwMDAxLCAweDIwMDksIDB4MDAxNCwgMHgwODBjLCAweGFkNGQsIDB4MDgwYywKKwkweGE5M2EsIDB4MDBjZSwgMHgwMDAwLCAweDAwMmUsIDB4MDAxZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwKKwkweDIwMDEsIDB4MWEwYiwgMHgyMDA0LCAweDkwMDUsIDB4MWRiMCwgMHgwMGM2LCAweDIwNjEsIDB4MTllNiwKKwkweDYxMzQsIDB4OTE5MiwgMHgwMDAzLCAweDFhZDgsIDB4ODEwOCwgMHg2MTM2LCAweDAwY2UsIDB4MDgwYywKKwkweDg3NzcsIDB4MDgwYywgMHg1ZjRkLCAweDIwMDksIDB4MTg0NiwgMHgyMTE0LCAweDgyMTAsIDB4MjIwYSwKKwkweDBjMTAsIDB4MDA5NiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwMDE2LCAweDAwMjYsIDB4MDgwYywKKwkweDg3OGQsIDB4MDgwYywgMHhhOTFlLCAweDIwMDEsIDB4MDM4NywgMHgyMDAzLCAweDAyMDIsIDB4MjA3MSwKKwkweDE5ZTYsIDB4NzE0YywgMHg4MWZmLCAweDA5MDQsIDB4OWZmYiwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwKKwkweDAxNDAsIDB4MDgwYywgMHg3NTNkLCAweDE1MTAsIDB4MDAzNiwgMHgyMDE5LCAweDAwMDIsIDB4MDgwYywKKwkweGExYjgsIDB4MDAzZSwgMHg3MTRjLCAweDIxNjAsIDB4MDgwYywgMHhlODk3LCAweDIwMDksIDB4MDA0YSwKKwkweDYyMjAsIDB4OTI5NiwgMHgwMDA5LCAweDExMzAsIDB4NjExNCwgMHgyMTQ4LCAweGE4N2IsIDB4MDAwNiwKKwkweDIwMDksIDB4MDA0YSwgMHg2MDAzLCAweDAwMDMsIDB4MDgwYywgMHhhZDRkLCAweDIwMDEsIDB4MDM4NiwKKwkweDIwMDMsIDB4NTA0MCwgMHgwODBjLCAweDc1ZTIsIDB4MDgwNCwgMHg5ZmZiLCAweDY5MDQsIDB4ZDFmNCwKKwkweDA5MDQsIDB4YTAwOCwgMHgwODBjLCAweDJhOGEsIDB4MDBjNiwgMHg3MDRjLCAweDkwNjUsIDB4MDkwYywKKwkweDBkN2QsIDB4NjAyMCwgMHgwMGNlLCAweDkwODYsIDB4MDAwNiwgMHgxNTE4LCAweDYxYzgsIDB4NjBjNCwKKwkweDkxMDUsIDB4MTFmOCwgMHgyMDA5LCAweDE4MGMsIDB4MjEwNCwgMHhkMGQ0LCAweDAxZDAsIDB4NjIxNCwKKwkweDkyOTQsIDB4MTgwMCwgMHgxMTI4LCAweDYyMjQsIDB4OTI5NCwgMHgwMDAyLCAweDE1NjAsIDB4MDAxMCwKKwkweGMwZDQsIDB4MjAwYSwgMHg2MDE0LCAweDkwODQsIDB4ZTdmZCwgMHg5MDg1LCAweDAwMTAsIDB4NjAxNiwKKwkweDcwNGMsIDB4MjA2MCwgMHgwODBjLCAweDk2ZDUsIDB4MjAwOSwgMHgwMDQ5LCAweDA4MGMsIDB4YWQ0ZCwKKwkweDAwZDAsIDB4MDAzNiwgMHgyMDE5LCAweDAwMDEsIDB4MDgwYywgMHhhMWI4LCAweDAwM2UsIDB4NzE0YywKKwkweDIxNjAsIDB4MDgwYywgMHhlODk3LCAweDIwMDksIDB4MDA0YSwgMHg2MjIwLCAweDkyOTYsIDB4MDAwOSwKKwkweDExMzAsIDB4NjExNCwgMHgyMTQ4LCAweGE4N2IsIDB4MDAwNiwgMHgyMDA5LCAweDAwNGEsIDB4NjAwMywKKwkweDAwMDMsIDB4MDgwYywgMHhhZDRkLCAweDIwMDEsIDB4MDM4NywgMHgyMDAzLCAweDAyMDAsIDB4MDgwYywKKwkweGE5M2EsIDB4MDAyZSwgMHgwMDFlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwOWUsIDB4MDAwNSwKKwkweGQxZWMsIDB4MTkwNCwgMHg5ZmIyLCAweDA4MDQsIDB4OWZiNCwgMHgwMDI2LCAweDAwZTYsIDB4MjA3MSwKKwkweDE5ZTYsIDB4NzA2YywgMHhkMDg0LCAweDAxZTgsIDB4YzA4NCwgMHg3MDZlLCAweDcxNGMsIDB4ODFmZiwKKwkweDAxYzAsIDB4MjA3MSwgMHgwMTAwLCAweDkxODgsIDB4MDAwOCwgMHgyMTE0LCAweDkyOGUsIDB4MDAwNiwKKwkweDExMzgsIDB4MjAwOSwgMHgxOTg0LCAweDIwMTEsIDB4MDAxMiwgMHgwODBjLCAweDJhYzMsIDB4MDA0OCwKKwkweDkyOGUsIDB4MDAwOSwgMHgwZGIwLCAweDIwMDksIDB4MTk4NCwgMHgyMDExLCAweDAwMTYsIDB4MDgwYywKKwkweDJhYzMsIDB4MDBlZSwgMHgwMDJlLCAweDAwMDUsIDB4OTAzNiwgMHgyMDAxLCAweDE5ZjAsIDB4MjAwNCwKKwkweDkwMDUsIDB4MDEyOCwgMHg5YzA2LCAweDAxMjgsIDB4MmMzMCwgMHg2MDBjLCAweDBjYzgsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAwNSwgMHgwMGY2LCAweDIwNzksIDB4MTllNiwgMHg2MTBjLCAweDkwMDYsIDB4NjAwZSwKKwkweDYwNDQsIDB4YzBmYywgMHg2MDQ2LCAweDg2ZmYsIDB4MTE0MCwgMHg3ODI0LCAweDljMDYsIDB4MTExOCwKKwkweDc4MjYsIDB4NzgyYSwgMHgwMDUwLCAweDc5MmEsIDB4MDA0MCwgMHgwMGM2LCAweDI2NjAsIDB4NjEwZSwKKwkweDAwY2UsIDB4NzgyNCwgMHg5YzA2LCAweDExMDgsIDB4N2UyNiwgMHgwODBjLCAweGEyODIsIDB4MDgwYywKKwkweGNiNmIsIDB4MDBmZSwgMHgwMDA1LCAweDA4MGMsIDB4OWIzNywgMHg3MDAzLCAweDEyMDAsIDB4NzgzOCwKKwkweDcwMTIsIDB4NzgzYywgMHg3MDE2LCAweDAwYzYsIDB4NzgyMCwgMHg5MDg2LCAweDAwMDQsIDB4MTE0OCwKKwkweDc4MTAsIDB4OTAwNSwgMHgwMTMwLCAweDAwYjYsIDB4MjA1OCwgMHhiODEwLCAweGI5MTQsIDB4MDBiZSwKKwkweDAwMjAsIDB4MjA2MSwgMHgxODAwLCAweDYwN2MsIDB4NjE4MCwgMHg5MDg0LCAweDAwZmYsIDB4NzAwYSwKKwkweDcxMGUsIDB4MDBjZSwgMHg2MGMzLCAweDAwMmMsIDB4MDgwNCwgMHg5ZWE0LCAweDA4MGMsIDB4OWIzNywKKwkweDcwMDMsIDB4MGYwMCwgMHg3ODA4LCAweGQwOWMsIDB4MDEyOCwgMHhiODEwLCAweDkwODQsIDB4MDBmZiwKKwkweDcwMGEsIDB4YjgxNCwgMHg3MDBlLCAweDYwYzMsIDB4MDAwOCwgMHgwODA0LCAweDllYTQsIDB4MDE1NiwKKwkweDA4MGMsIDB4OWI4MiwgMHg3MDAzLCAweDAyMDAsIDB4MDgwYywgMHg4ODQ1LCAweDIwYTksIDB4MDAwNiwKKwkweDIwMTEsIDB4ZmZlYywgMHgyMDE5LCAweGZmZWQsIDB4OWVmMCwgMHgwMDAyLCAweDIzMDUsIDB4MjA3MiwKKwkweDhlNzAsIDB4MjIwNSwgMHgyMDcyLCAweDhlNzAsIDB4OTM5OCwgMHgwMDAyLCAweDkyOTAsIDB4MDAwMiwKKwkweDFmMDQsIDB4YTBhNiwgMHg2MGMzLCAweDAwMWMsIDB4MDE1ZSwgMHgwODA0LCAweDllYTQsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDgwYywgMHg5YjVlLCAweDA4MGMsIDB4OWI3MCwgMHg5ZTgwLCAweDAwMDQsIDB4MjBlOSwKKwkweDAwMDAsIDB4MjBhMCwgMHg3ODE0LCAweDAwOTYsIDB4MjA0OCwgMHhhODAwLCAweDIwNDgsIDB4YTg2MCwKKwkweDIwZTAsIDB4YTg1YywgMHg5MDgwLCAweDAwMjEsIDB4MjA5OCwgMHgwMDllLCAweDc4MDgsIDB4OTA4OCwKKwkweDAwMDIsIDB4MjFhOCwgMHg5MTkyLCAweDAwMTAsIDB4MTI1MCwgMHg0MDAzLCAweDkwODAsIDB4MDAwNCwKKwkweDgwMDMsIDB4NjBjMiwgMHgwODBjLCAweDllYTQsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MjBhOSwKKwkweDAwMTAsIDB4NDAwMywgMHgwODBjLCAweGE2ZmUsIDB4MjBhMSwgMHgwMjQwLCAweDIyYTgsIDB4NDAwMywKKwkweDBjNjgsIDB4MDgwYywgMHg5YjM3LCAweDcwMDMsIDB4NjIwMCwgMHg3ODA4LCAweDcwMGUsIDB4NjBjMywKKwkweDAwMDgsIDB4MDgwNCwgMHg5ZWE0LCAweDAwMTYsIDB4MDAyNiwgMHgwODBjLCAweDliMzcsIDB4MjBlOSwKKwkweDAwMDAsIDB4MjBhMSwgMHgwMjRjLCAweDc4MTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4MDAsIDB4MjA0OCwKKwkweGE4NjAsIDB4MjBlMCwgMHhhODVjLCAweDkwODAsIDB4MDAyMywgMHgyMDk4LCAweDAwOWUsIDB4NzgwOCwKKwkweDkwODgsIDB4MDAwMiwgMHgyMWE4LCAweDQwMDMsIDB4ODAwMywgMHg2MGMyLCAweDA4MGMsIDB4OWVhNCwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA3MSwgMHgxOWU2LCAweDcwMTAsIDB4MjA2MCwgMHg4Y2ZmLCAweDAxODgsIDB4MDgwYywKKwkweGNiOTEsIDB4MTExMCwgMHgwODBjLCAweGI2OTMsIDB4NjAwYywgMHgwMDA2LCAweDA4MGMsIDB4Y2UwZCwKKwkweDYwMGYsIDB4MDAwMCwgMHgwODBjLCAweGFjYjAsIDB4MDgwYywgMHhhMjgyLCAweDAwY2UsIDB4MGM2OCwKKwkweDJjMDAsIDB4NzAxMiwgMHg3MDBlLCAweDAxMmUsIDB4MDAwZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwKKwkweDAxMjYsIDB4MDE1NiwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwNjYsIDB4MDAyNiwKKwkweDAwMTYsIDB4MDAwNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4OTE4YywKKwkweGU3ZmYsIDB4MjEwMiwgMHgyMDY5LCAweDAxMDAsIDB4MjA3OSwgMHgwMTQwLCAweDIwNzEsIDB4MTllNiwKKwkweDcwMzAsIDB4MjA2MCwgMHg4Y2ZmLCAweDA1NDgsIDB4MDgwYywgMHg5ZWQ0LCAweDZhYzAsIDB4NjhjMywKKwkweDAwMDAsIDB4MDgwYywgMHg4NzgwLCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDA4MGMsIDB4YTg0ZiwKKwkweDAwY2UsIDB4MjBhOSwgMHgwMWY0LCAweDA0YjEsIDB4MDgwYywgMHg5NjdhLCAweDYwNDQsIDB4ZDBhYywKKwkweDExMjgsIDB4MjAwMSwgMHgxOTg3LCAweDIwMDQsIDB4NjA0YSwgMHgwMDIwLCAweDIwMDksIDB4MDAxMywKKwkweDA4MGMsIDB4YWQ0ZCwgMHgwMDBlLCAweDAwMWUsIDB4MDAyZSwgMHgwMDZlLCAweDAwY2UsIDB4MDBkZSwKKwkweDAwZWUsIDB4MDBmZSwgMHgwMTVlLCAweDAxMmUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MDAsIDB4MjAwNCwKKwkweDkwOTYsIDB4MDAwMSwgMHgwZDc4LCAweDkwOTYsIDB4MDAwNCwgMHgwZDYwLCAweDA4MGMsIDB4ODc4MCwKKwkweDY4MTQsIDB4OTA4NCwgMHgwMDAxLCAweDAxMTAsIDB4NjhhNywgMHg5NWY1LCAweDY4MTcsIDB4MDAwOCwKKwkweDY4YzMsIDB4MDAwMCwgMHgyMDExLCAweDVlZjcsIDB4MDgwYywgMHg4NmM4LCAweDIwYTksIDB4MDFmNCwKKwkweDAwMDksIDB4MDhjMCwgMHg2ODI0LCAweGQwOTQsIDB4MDE0MCwgMHg2ODI3LCAweDAwMDQsIDB4NzgwNCwKKwkweDkwODQsIDB4NDAwMCwgMHgxOTBjLCAweDJhOGEsIDB4MDA5MCwgMHhkMDg0LCAweDAxMTgsIDB4NjgyNywKKwkweDAwMDEsIDB4MDAxMCwgMHgxZjA0LCAweGExOWEsIDB4NzgwNCwgMHg5MDg0LCAweDEwMDAsIDB4MDEzOCwKKwkweDIwMDEsIDB4MDEwMCwgMHgwODBjLCAweDJhN2EsIDB4OTAwNiwgMHgwODBjLCAweDJhN2EsIDB4MDAwNSwKKwkweDAxMjYsIDB4MDE1NiwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwNjYsIDB4MDAyNiwKKwkweDAwMTYsIDB4MDAwNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4OTE4YywKKwkweGRiZmYsIDB4MjEwMiwgMHgyMDY5LCAweDAxMDAsIDB4MjA3OSwgMHgwMTQwLCAweDIwNzEsIDB4MDM4MCwKKwkweDcwMWMsIDB4MDAwNiwgMHg3MDFmLCAweDAyMDIsIDB4MjA3MSwgMHgxOWU2LCAweDcwNGMsIDB4MjA2MCwKKwkweDhjZmYsIDB4MDkwNCwgMHhhMjMxLCAweDkzODYsIDB4MDAwMiwgMHgxMTI4LCAweDY4MTQsIDB4OTA4NCwKKwkweDAwMDIsIDB4MDkwNCwgMHhhMjMxLCAweDY4YWYsIDB4OTVmNSwgMHg2ODE3LCAweDAwMTAsIDB4MjAwOSwKKwkweDAwZmEsIDB4ODEwOSwgMHgxZGYwLCAweDY5YzYsIDB4NjhjYiwgMHgwMDA4LCAweDA4MGMsIDB4ODc4ZCwKKwkweDA4MGMsIDB4MWUyZSwgMHgyMDAxLCAweDAwMzIsIDB4NjkyMCwgMHhkMWJjLCAweDAxMzAsIDB4ODAwMSwKKwkweDFkZDgsIDB4NjkyYywgMHg5MThkLCAweDAwMDgsIDB4NjkyZSwgMHgyMGE5LCAweDAzZTgsIDB4NjgyNCwKKwkweGQwOTQsIDB4MDE0MCwgMHg2ODI3LCAweDAwMDQsIDB4NzgwNCwgMHg5MDg0LCAweDQwMDAsIDB4MTkwYywKKwkweDJhOGEsIDB4MDA5MCwgMHhkMDhjLCAweDAxMTgsIDB4NjgyNywgMHgwMDAyLCAweDAwMTAsIDB4MWYwNCwKKwkweGExZmYsIDB4NzgwNCwgMHg5MDg0LCAweDEwMDAsIDB4MDEzOCwgMHgyMDAxLCAweDAxMDAsIDB4MDgwYywKKwkweDJhN2EsIDB4OTAwNiwgMHgwODBjLCAweDJhN2EsIDB4NjgyNywgMHg0MDAwLCAweDY4MjQsIDB4ODNmZiwKKwkweDExODAsIDB4MjAwOSwgMHgwMDQ5LCAweDYwMjAsIDB4OTA4NiwgMHgwMDA5LCAweDAxNTAsIDB4MDgwYywKKwkweDk2ZDUsIDB4NjA0NCwgMHhkMGFjLCAweDExMTgsIDB4NjAwMywgMHgwMDAyLCAweDAwMTAsIDB4MDgwYywKKwkweGFkNGQsIDB4MDAwZSwgMHgyMDcxLCAweDAzODAsIDB4ZDA4YywgMHgxMTEwLCAweDcwMWYsIDB4MDIwMCwKKwkweDAwMGUsIDB4MDAxZSwgMHgwMDJlLCAweDAwNmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwKKwkweDAxNWUsIDB4MDEyZSwgMHgwMDA1LCAweDAwZDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA2OSwKKwkweDE5ZTYsIDB4NmEwNiwgMHgwMTJlLCAweDAwZGUsIDB4MDAwNSwgMHgwMGQ2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA2OSwgMHgxOWU2LCAweDZhM2UsIDB4MDEyZSwgMHgwMGRlLCAweDAwMDUsIDB4MDgwYywKKwkweDljOGYsIDB4Nzg1YywgMHg3MDMyLCAweDcwNDIsIDB4NzA0NywgMHgxMDAwLCAweDAwZjgsIDB4MDgwYywKKwkweDljOGYsIDB4Nzg1YywgMHg3MDMyLCAweDcwNDIsIDB4NzA0NywgMHg0MDAwLCAweDAwYjgsIDB4MDgwYywKKwkweDljOGYsIDB4Nzg1YywgMHg3MDMyLCAweDcwNDIsIDB4NzA0NywgMHgyMDAwLCAweDAwNzgsIDB4MDgwYywKKwkweDljOGYsIDB4Nzg1YywgMHg3MDMyLCAweDcwNDIsIDB4NzA0NywgMHgwNDAwLCAweDAwMzgsIDB4MDgwYywKKwkweDljOGYsIDB4Nzg1YywgMHg3MDMyLCAweDcwNDIsIDB4NzA0NywgMHgwMjAwLCAweDYwYzMsIDB4MDAyMCwKKwkweDA4MDQsIDB4OWVhNCwgMHgwMGU2LCAweDIwNzEsIDB4MTllNiwgMHg3MDJjLCAweDkwMDUsIDB4MDExMCwKKwkweDgwMDEsIDB4NzAyZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwKKwkweDAwNzYsIDB4MDA2NiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MTllNiwKKwkweDc2MjAsIDB4MjY2MCwgMHgyNjc4LCAweDIwMzksIDB4MDAwMSwgMHg4N2ZmLCAweDA5MDQsIDB4YTMyNywKKwkweDhjZmYsIDB4MDkwNCwgMHhhMzI3LCAweDYwMjAsIDB4OTA4NiwgMHgwMDA2LCAweDE5MDQsIDB4YTMyMiwKKwkweDg4ZmYsIDB4MDEzOCwgMHgyODAwLCAweDljMDYsIDB4MTkwNCwgMHhhMzIyLCAweDIwMzksIDB4MDAwMCwKKwkweDAwNTAsIDB4NjAxMCwgMHg5YjA2LCAweDE5MDQsIDB4YTMyMiwgMHg4NWZmLCAweDAxMjAsIDB4NjA1YywKKwkweDkxMDYsIDB4MTkwNCwgMHhhMzIyLCAweDcwMzAsIDB4OWMwNiwgMHgxNWIwLCAweDIwNjksIDB4MDEwMCwKKwkweDY4YzAsIDB4OTAwNSwgMHgxMTYwLCAweDY4MjQsIDB4ZDA4NCwgMHgwMTQ4LCAweDY4MjcsIDB4MDAwMSwKKwkweDA4MGMsIDB4ODc4MCwgMHgwODBjLCAweGEzYWMsIDB4NzAzMywgMHgwMDAwLCAweDA0MjgsIDB4MDgwYywKKwkweDg3ODAsIDB4NjgyMCwgMHhkMGI0LCAweDAxMTAsIDB4NjhhNywgMHg5NWY1LCAweDY4MTcsIDB4MDAwOCwKKwkweDY4YzMsIDB4MDAwMCwgMHgwODBjLCAweGEzYWMsIDB4NzAzMywgMHgwMDAwLCAweDAwMzYsIDB4MjA2OSwKKwkweDAxNDAsIDB4NmIwNCwgMHg5Mzg0LCAweDEwMDAsIDB4MDEzOCwgMHgyMDAxLCAweDAxMDAsIDB4MDgwYywKKwkweDJhN2EsIDB4OTAwNiwgMHgwODBjLCAweDJhN2EsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwKKwkweDAxMTAsIDB4NjgyNywgMHgwMDAxLCAweDAwM2UsIDB4NzAyMCwgMHg5YzM2LCAweDExMTAsIDB4NjYwYywKKwkweDc2MjIsIDB4NzAxYywgMHg5YzM2LCAweDExNDAsIDB4MmMwMCwgMHg5ZjM2LCAweDAxMTgsIDB4MmYwMCwKKwkweDcwMWUsIDB4MDAxMCwgMHg3MDFmLCAweDAwMDAsIDB4NjYwYywgMHgwMDY2LCAweDJjMDAsIDB4OWYwNiwKKwkweDAxMTAsIDB4N2UwZSwgMHgwMDA4LCAweDI2NzgsIDB4ODlmZiwgMHgxMTY4LCAweDYwMGYsIDB4MDAwMCwKKwkweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LCAweDA4MGMsIDB4Yzk3OCwgMHgwMTEwLCAweDA4MGMsIDB4ZTNlOCwKKwkweDAwOWUsIDB4MDgwYywgMHhhY2ViLCAweDA4MGMsIDB4YTI4MiwgMHg4OGZmLCAweDExOTAsIDB4MDBjZSwKKwkweDA4MDQsIDB4YTI5ZCwgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwODA0LCAweGEyOWQsIDB4OTAwNiwKKwkweDAxMmUsIDB4MDAwZSwgMHgwMDZlLCAweDAwN2UsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwKKwkweDAwMDUsIDB4NjAxYiwgMHgwMDAwLCAweDAwY2UsIDB4OThjNSwgMHgwMDAxLCAweDBjODgsIDB4MDBmNiwKKwkweDAwZTYsIDB4MDBkNiwgMHgwMDk2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDI2LCAweDAwMDYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDE5ZTYsIDB4NzY0OCwgMHgyNjYwLCAweDI2NzgsIDB4OGNmZiwKKwkweDA5MDQsIDB4YTM5YiwgMHg2MDIwLCAweDkwODYsIDB4MDAwNiwgMHgxOTA0LCAweGEzOTYsIDB4ODdmZiwKKwkweDAxMjgsIDB4MjcwMCwgMHg5YzA2LCAweDE5MDQsIDB4YTM5NiwgMHgwMDQwLCAweDYwMTAsIDB4OWIwNiwKKwkweDE1ZTgsIDB4ODVmZiwgMHgwMTE4LCAweDYwNWMsIDB4OTEwNiwgMHgxNWMwLCAweDcwNGMsIDB4OWMwNiwKKwkweDExNjgsIDB4MDAzNiwgMHgyMDE5LCAweDAwMDEsIDB4MDgwYywgMHhhMWI4LCAweDcwM2YsIDB4MDAwMCwKKwkweDkwMDYsIDB4NzA0ZSwgMHg3MDZhLCAweDcwNTIsIDB4NzA2ZSwgMHgwMDNlLCAweDcwNDgsIDB4OWMzNiwKKwkweDExMTAsIDB4NjYwYywgMHg3NjRhLCAweDcwNDQsIDB4OWMzNiwgMHgxMTQwLCAweDJjMDAsIDB4OWYzNiwKKwkweDAxMTgsIDB4MmYwMCwgMHg3MDQ2LCAweDAwMTAsIDB4NzA0NywgMHgwMDAwLCAweDY2MGMsIDB4MDA2NiwKKwkweDJjMDAsIDB4OWYwNiwgMHgwMTEwLCAweDdlMGUsIDB4MDAwOCwgMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwKKwkweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGM5NzgsIDB4MDExMCwgMHgwODBjLCAweGUzZTgsIDB4MDgwYywKKwkweGFjZWIsIDB4ODdmZiwgMHgxMTk4LCAweDAwY2UsIDB4MDgwNCwgMHhhMzQ3LCAweDJjNzgsIDB4NjAwYywKKwkweDIwNjAsIDB4MDgwNCwgMHhhMzQ3LCAweDkwMDYsIDB4MDEyZSwgMHgwMDBlLCAweDAwMmUsIDB4MDA2ZSwKKwkweDAwY2UsIDB4MDA5ZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDYwMWIsIDB4MDAwMCwKKwkweDAwY2UsIDB4OTdiZCwgMHgwMDAxLCAweDBjODAsIDB4MDBlNiwgMHgyMDcxLCAweDE5ZTYsIDB4OTAwNiwKKwkweDcwMzIsIDB4NzAwYSwgMHg3MDA0LCAweDkwODYsIDB4MDAwMywgMHgwMTU4LCAweDIwMDEsIDB4MTgwMCwKKwkweDIwMDQsIDB4OTA4NiwgMHgwMDAyLCAweDExMTgsIDB4NzAwNywgMHgwMDA1LCAweDAwMTAsIDB4NzAwNywKKwkweDAwMDAsIDB4MDBlZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMGM2LCAweDAwNjYsIDB4MDAyNiwKKwkweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgxOWU2LCAweDJjMTAsIDB4NzY0OCwKKwkweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLCAweDA1NDAsIDB4MjIwMCwgMHg5YzA2LCAweDE1MDgsIDB4NzA0OCwKKwkweDljMzYsIDB4MTExMCwgMHg2NjBjLCAweDc2NGEsIDB4NzA0NCwgMHg5YzM2LCAweDExNDAsIDB4MmMwMCwKKwkweDlmMzYsIDB4MDExOCwgMHgyZjAwLCAweDcwNDYsIDB4MDAxMCwgMHg3MDQ3LCAweDAwMDAsIDB4NjYwYywKKwkweDJjMDAsIDB4OWYwNiwgMHgwMTEwLCAweDdlMGUsIDB4MDAwOCwgMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwKKwkweDYwMDQsIDB4OTA4NiwgMHgwMDQwLCAweDA5MGMsIDB4OTY3YSwgMHg5MDg1LCAweDAwMDEsIDB4MDAyMCwKKwkweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDA4YjAsIDB4MDEyZSwgMHgwMDBlLCAweDAwMmUsIDB4MDA2ZSwKKwkweDAwY2UsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDA5NiwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwKKwkweDAwYzYsIDB4MDA2NiwgMHgwMDI2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwKKwkweDE5ZTYsIDB4NzYxMCwgMHgyNjYwLCAweDI2NzgsIDB4OGNmZiwgMHgwOTA0LCAweGE0OTksIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiOGEwLCAweDAwYmUsIDB4OTIwNiwgMHgxOTA0LCAweGE0OTQsIDB4NzAzMCwKKwkweDljMDYsIDB4MTUyMCwgMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwgMHg5MDA1LCAweDA5MDQsIDB4YTQ2YiwKKwkweDA4MGMsIDB4OWVkNCwgMHg2OGMzLCAweDAwMDAsIDB4MDgwYywgMHhhM2FjLCAweDcwMzMsIDB4MDAwMCwKKwkweDAwMzYsIDB4MjA2OSwgMHgwMTQwLCAweDZiMDQsIDB4OTM4NCwgMHgxMDAwLCAweDAxMzgsIDB4MjAwMSwKKwkweDAxMDAsIDB4MDgwYywgMHgyYTdhLCAweDkwMDYsIDB4MDgwYywgMHgyYTdhLCAweDIwNjksIDB4MDEwMCwKKwkweDY4MjQsIDB4ZDA4NCwgMHgwMTEwLCAweDY4MjcsIDB4MDAwMSwgMHgwMDNlLCAweDcwMTAsIDB4OWMzNiwKKwkweDExMTAsIDB4NjYwYywgMHg3NjEyLCAweDcwMGMsIDB4OWMzNiwgMHgxMTQwLCAweDJjMDAsIDB4OWYzNiwKKwkweDAxMTgsIDB4MmYwMCwgMHg3MDBlLCAweDAwMTAsIDB4NzAwZiwgMHgwMDAwLCAweDY2MGMsIDB4MDA2NiwKKwkweDJjMDAsIDB4OWYwNiwgMHgwMTEwLCAweDdlMGUsIDB4MDAwOCwgMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwKKwkweDA4MGMsIDB4Y2I4MCwgMHgxMTgwLCAweDA4MGMsIDB4MzI2ZiwgMHgwODBjLCAweGNiOTEsIDB4MTUxOCwKKwkweDA4MGMsIDB4YjY5MywgMHgwNDAwLCAweDA4MGMsIDB4YTNhYywgMHg2ODI0LCAweGQwODQsIDB4MDliMCwKKwkweDY4MjcsIDB4MDAwMSwgMHgwODk4LCAweDA4MGMsIDB4Y2I5MSwgMHgxMTE4LCAweDA4MGMsIDB4YjY5MywKKwkweDAwOTAsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Yzk3OCwgMHgwMTY4LCAweDYwMjAsIDB4OTA4NiwKKwkweDAwMDMsIDB4MTUwOCwgMHhhODY3LCAweDAxMDMsIDB4YWI3YSwgMHhhODc3LCAweDAwMDAsIDB4MDgwYywKKwkweDZkZTIsIDB4MDgwYywgMHhjYjZiLCAweDA4MGMsIDB4Y2UwZCwgMHgwODBjLCAweGFjZWIsIDB4MDgwYywKKwkweGEyODIsIDB4MDBjZSwgMHgwODA0LCAweGE0MTQsIDB4MmM3OCwgMHg2MDBjLCAweDIwNjAsIDB4MDgwNCwKKwkweGE0MTQsIDB4MDEyZSwgMHgwMDBlLCAweDAwMmUsIDB4MDA2ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwKKwkweDAwZmUsIDB4MDA5ZSwgMHgwMDA1LCAweDYwMjAsIDB4OTA4NiwgMHgwMDA2LCAweDFkMjAsIDB4MDgwYywKKwkweGUzZTgsIDB4MGMwOCwgMHgwMGQ2LCAweDA4MGMsIDB4OWI4MiwgMHg3MDAzLCAweDAyMDAsIDB4NzAwNywKKwkweDAwMTQsIDB4NjBjMywgMHgwMDE0LCAweDIwZTEsIDB4MDAwMSwgMHgyMDk5LCAweDE5ODgsIDB4MjBlOSwKKwkweDAwMDAsIDB4MjBhMSwgMHgwMjUwLCAweDIwYTksIDB4MDAwNCwgMHg0MDAzLCAweDcwMjMsIDB4MDAwNCwKKwkweDcwMjcsIDB4Nzg3OCwgMHgwODBjLCAweDllYTQsIDB4MDBkZSwgMHgwMDA1LCAweDA4MGMsIDB4OWI4MiwKKwkweDcwMGIsIDB4MDgwMCwgMHg3ODE0LCAweDkwODQsIDB4ZmYwMCwgMHg3MDBlLCAweDc4MTQsIDB4OTA4NCwKKwkweDAwZmYsIDB4NzAyMiwgMHg3ODJjLCAweDcwMjYsIDB4Nzg2MCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NSwKKwkweDAyMDAsIDB4NzAwMiwgMHg3ODYwLCAweDkwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDcwMDYsIDB4NjBjMiwKKwkweDA4MDQsIDB4OWVhNCwgMHgwMGI2LCAweDAwZDYsIDB4MDAxNiwgMHgwMGQ2LCAweDJmNjgsIDB4MjAwOSwKKwkweDAwMzUsIDB4MDgwYywgMHhkMDEzLCAweDAwZGUsIDB4MTkwNCwgMHhhNTQ3LCAweDA4MGMsIDB4OWIzNywKKwkweDcwMDMsIDB4MTMwMCwgMHg3ODJjLCAweDA4MGMsIDB4YTY1NiwgMHgyMDY4LCAweDY4MjAsIDB4OTA4NiwKKwkweDAwMDMsIDB4MDU2MCwgMHg3ODEwLCAweDIwNTgsIDB4YmFhMCwgMHgwODBjLCAweGFiZTIsIDB4MTFkOCwKKwkweDkyODYsIDB4MDA3ZSwgMHgxMTI4LCAweDcwMGIsIDB4MDBmZiwgMHg3MDBmLCAweGZmZmUsIDB4MDQ5OCwKKwkweDkyODYsIDB4MDA3ZiwgMHgxMTI4LCAweDcwMGIsIDB4MDBmZiwgMHg3MDBmLCAweGZmZmQsIDB4MDQ1OCwKKwkweDkyODQsIDB4ZmY4MCwgMHgwMTgwLCAweDkyODYsIDB4MDA4MCwgMHgxMTI4LCAweDcwMGIsIDB4MDBmZiwKKwkweDcwMGYsIDB4ZmZmYywgMHgwNDAwLCAweDkyZDgsIDB4MTAwMCwgMHgyYjVjLCAweGI4MTAsIDB4NzAwYSwKKwkweGI4MTQsIDB4NzAwZSwgMHgwMGMwLCAweGI4ODQsIDB4NzAwZSwgMHgwMGE4LCAweDA4MGMsIDB4YWJlMiwKKwkweDExMzAsIDB4NzgxMCwgMHgyMDU4LCAweGI4YTAsIDB4OTA4MiwgMHgwMDdlLCAweDAyNTAsIDB4MDBkNiwKKwkweDIwNjksIDB4MTgxZiwgMHgyZDA0LCAweDcwMGEsIDB4OGQ2OCwgMHgyZDA0LCAweDcwMGUsIDB4MDBkZSwKKwkweDAwMTAsIDB4NjAzNCwgMHg3MDBlLCAweDc4MzgsIDB4NzAxMiwgMHg3ODNjLCAweDcwMTYsIDB4NjBjMywKKwkweDAwMGMsIDB4MDAxZSwgMHgwMGRlLCAweDA4MGMsIDB4OWVhNCwgMHgwMGJlLCAweDAwMDUsIDB4NzgxYiwKKwkweDAwMDEsIDB4NzgwMywgMHgwMDA2LCAweDAwMWUsIDB4MDBkZSwgMHgwMGJlLCAweDAwMDUsIDB4NzkyYywKKwkweDkxODAsIDB4MDAwOCwgMHgyMDBjLCAweDkxODYsIDB4MDAwNiwgMHgwMWMwLCAweDkxODYsIDB4MDAwMywKKwkweDA5MDQsIDB4YTVjNiwgMHg5MTg2LCAweDAwMDUsIDB4MDkwNCwgMHhhNWFlLCAweDkxODYsIDB4MDAwNCwKKwkweDA1ZjAsIDB4OTE4NiwgMHgwMDA4LCAweDA5MDQsIDB4YTViNywgMHg3ODA3LCAweDAwMzcsIDB4NzgyZiwKKwkweDAwMDMsIDB4NzgxNywgMHgxNzAwLCAweDA4MGMsIDB4YTYzMywgMHgwMDA1LCAweDA4MGMsIDB4YTVmNCwKKwkweDAwZDYsIDB4MDAyNiwgMHg3OTJjLCAweDIxNjgsIDB4MjAwOSwgMHg0MDAwLCAweDY4MDAsIDB4NmE0NCwKKwkweGQyZmMsIDB4MTFmOCwgMHgwMDAyLCAweGE1OGUsIDB4YTU5OSwgMHhhNTkwLCAweGE1OTksIDB4YTU5NSwKKwkweGE1OGUsIDB4YTU4ZSwgMHhhNTk5LCAweGE1OTksIDB4YTU5OSwgMHhhNTk5LCAweGE1OGUsIDB4YTU4ZSwKKwkweGE1OGUsIDB4YTU4ZSwgMHhhNThlLCAweGE1OTksIDB4YTU4ZSwgMHhhNTk5LCAweDA4MGMsIDB4MGQ3ZCwKKwkweDY4MjQsIDB4ZDBlNCwgMHgwMTEwLCAweGQwY2MsIDB4MDExMCwgMHg5MDBlLCAweDAwMTAsIDB4MjAwOSwKKwkweDIwMDAsIDB4NjgyYywgMHg3MDIyLCAweDY4MzAsIDB4NzAyNiwgMHgwODA0LCAweGE1ZWQsIDB4MDgwYywKKwkweGE1ZjQsIDB4MDBkNiwgMHgwMDI2LCAweDc5MmMsIDB4MjE2OCwgMHgyMDA5LCAweDQwMDAsIDB4NmEwMCwKKwkweDkyODYsIDB4MDAwMiwgMHgxMTA4LCAweDkwMGUsIDB4MDgwNCwgMHhhNWVkLCAweDA4MGMsIDB4YTVmNCwKKwkweDAwZDYsIDB4MDAyNiwgMHg3OTJjLCAweDIxNjgsIDB4MjAwOSwgMHg0MDAwLCAweDA0YjAsIDB4MDRlMSwKKwkweDAwZDYsIDB4MDAyNiwgMHg3OTJjLCAweDIxNjgsIDB4MjAwOSwgMHg0MDAwLCAweDkyODYsIDB4MDAwNSwKKwkweDAxMTgsIDB4OTI4NiwgMHgwMDAyLCAweDExMDgsIDB4OTAwZSwgMHgwNDM4LCAweDA0NjksIDB4MDBkNiwKKwkweDAwMjYsIDB4NzkyYywgMHgyMTY4LCAweDY4MTQsIDB4NjkyNCwgMHhjMTg1LCAweDY5MjYsIDB4MDA5NiwKKwkweDIwNDgsIDB4YTlhYywgMHhhODM0LCAweDkxMTIsIDB4YTliMCwgMHhhODM4LCAweDAwOWUsIDB4OTEwMywKKwkweDcwMjIsIDB4NzIyNiwgMHg3OTJjLCAweDkxODAsIDB4MDAxMSwgMHgyMDA0LCAweGQwZmMsIDB4MTE0OCwKKwkweDkxODAsIDB4MDAwMCwgMHgyMDA0LCAweDkwOGUsIDB4MDAwMiwgMHgwMTMwLCAweDkwOGUsIDB4MDAwNCwKKwkweDAxMTgsIDB4MjAwOSwgMHg0MDAwLCAweDAwMDgsIDB4OTAwZSwgMHg3MTJhLCAweDYwYzMsIDB4MDAxOCwKKwkweDAwMmUsIDB4MDBkZSwgMHgwODA0LCAweDllYTQsIDB4MDBiNiwgMHgwMDM2LCAweDAwNDYsIDB4MDA1NiwKKwkweDAwNjYsIDB4MDgwYywgMHg5YjgyLCAweDkwMDYsIDB4NzAwMywgMHgwMjAwLCAweDc5MzgsIDB4NzEwYSwKKwkweDc5M2MsIDB4NzEwZSwgMHg3ODEwLCAweDIwNTgsIDB4YjhhMCwgMHgwODBjLCAweGFiZTIsIDB4MTExOCwKKwkweDkwOTIsIDB4MDA3ZSwgMHgwMjY4LCAweDAwZDYsIDB4MjA2OSwgMHgxODFmLCAweDJkMmMsIDB4OGQ2OCwKKwkweDJkMzQsIDB4OTBkOCwgMHgxMDAwLCAweDJiNWMsIDB4YmIxMCwgMHhiYzE0LCAweDAwZGUsIDB4MDAyOCwKKwkweDkwMWUsIDB4YmM4NCwgMHgyMDI5LCAweDAwMDAsIDB4NjYzNCwgMHg3ODJjLCAweDkwODAsIDB4MDAwOCwKKwkweDIwMDQsIDB4OTA4NiwgMHgwMDAzLCAweDExMjgsIDB4NzUxMiwgMHg3NjE2LCAweDczMWEsIDB4NzQxZSwKKwkweDAwMjAsIDB4NzMxMiwgMHg3NDE2LCAweDc1MWEsIDB4NzYxZSwgMHgwMDZlLCAweDAwNWUsIDB4MDA0ZSwKKwkweDAwM2UsIDB4MDBiZSwgMHgwMDA1LCAweDA4MGMsIDB4OWI4MiwgMHg3MDAzLCAweDAxMDAsIDB4NzgyYywKKwkweDcwMGEsIDB4NzgxNCwgMHg3MDBlLCAweDcwMGUsIDB4NjBjMywgMHgwMDA4LCAweDA4MDQsIDB4OWVhNCwKKwkweDA4MGMsIDB4OWIyZSwgMHg3MDAzLCAweDE0MDAsIDB4NzgzOCwgMHg3MDBhLCAweDAwNzksIDB4NzgzYywKKwkweDcwMGUsIDB4NzgyYywgMHg3MDEyLCAweDc4MzAsIDB4NzAxNiwgMHg3ODM0LCAweDkwODQsIDB4MDBmZiwKKwkweDgwMDcsIDB4NzAxYSwgMHg2MGMzLCAweDAwMTAsIDB4MDgwNCwgMHg5ZWE0LCAweDAwZTYsIDB4MjA3MSwKKwkweDAyNDAsIDB4MDAwNiwgMHgwMGY2LCAweDIwNzgsIDB4NzgxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjhkNCwKKwkweGQwODQsIDB4MDEyMCwgMHg3ODRjLCAweDcwMmEsIDB4Nzg1MCwgMHg3MDJlLCAweDAwYmUsIDB4MDBmZSwKKwkweDAwMGUsIDB4MDBlZSwgMHgwMDA1LCAweDA4MGMsIDB4OWI3OSwgMHg3MDAzLCAweDAxMDAsIDB4NzgyYywKKwkweDcwMGEsIDB4NzgxNCwgMHg3MDBlLCAweDYwYzMsIDB4MDAwOCwgMHgwODA0LCAweDllYTQsIDB4MDBhOSwKKwkweDc5MTQsIDB4NzEyYSwgMHg2MGMzLCAweDAwMDAsIDB4NjBhNywgMHg5NTc1LCAweDAwMjYsIDB4MDgwYywKKwkweDI5ZTUsIDB4MDIyOCwgMHgyMDExLCAweDAxMDEsIDB4MjIwNCwgMHhjMGM1LCAweDIwMTIsIDB4MDAyZSwKKwkweDA4MGMsIDB4OWVjNywgMHgwODBjLCAweDg3NzcsIDB4MDAwNSwgMHgwMDM2LCAweDAwOTYsIDB4MDBkNiwKKwkweDAwZTYsIDB4Nzg2MCwgMHgyMDQ4LCAweGFhN2MsIDB4OTI5NiwgMHgwMGMwLCAweDkyOTQsIDB4ZmZmZCwKKwkweGFhN2UsIDB4YWE4MCwgMHg5Mjk0LCAweDAzMDAsIDB4YWE4MiwgMHhhOTZjLCAweDkxOTQsIDB4MDBmZiwKKwkweGFiNzQsIDB4OTM4NCwgMHgwMGZmLCAweDkwOGQsIDB4YzIwMCwgMHhhOTZlLCAweDkzODQsIDB4ZmYwMCwKKwkweDkyMTUsIDB4YWE3NiwgMHhhODcwLCAweGFhNzgsIDB4YTg3YSwgMHhhYTcyLCAweDAwZDYsIDB4MjA2OSwKKwkweDAyMDAsIDB4MDgwYywgMHhhNzEzLCAweDAwZGUsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0MCwKKwkweDIwYTksIDB4MDAwYSwgMHhhODYwLCAweDIwZTAsIDB4YTg1YywgMHg5MDgwLCAweDAwMWIsIDB4MjA5OCwKKwkweDQwMDMsIDB4NjBhMywgMHgwMDM1LCAweGFhNjgsIDB4OTI5NCwgMHg3MDAwLCAweDkyODYsIDB4MzAwMCwKKwkweDAxMTAsIDB4NjBhMywgMHgwMDM3LCAweDAwZWUsIDB4MDBkZSwgMHgwMDllLCAweDAwM2UsIDB4MDAwNSwKKwkweDkwMGUsIDB4NzgxNCwgMHgwMDk2LCAweDIwNDgsIDB4YTg3YywgMHhkMGZjLCAweDAxYzAsIDB4OTA4NCwKKwkweDAwMDMsIDB4MTFhOCwgMHgyMDAxLCAweDE4MGMsIDB4MjAwNCwgMHhkMGJjLCAweDAxODAsIDB4NzgyNCwKKwkweGQwY2MsIDB4MTE2OCwgMHhkMGM0LCAweDExNTgsIDB4YThhOCwgMHg5MDA1LCAweDExNDAsIDB4MjAwMSwKKwkweDE4MGMsIDB4MjAwYywgMHhjMWQ1LCAweDIxMDIsIDB4MjAwOSwgMHgxOWIxLCAweDIxMGMsIDB4MDA5ZSwKKwkweDkxOGQsIDB4MDA5MiwgMHgwMDEwLCAweDIwMDksIDB4MDA5NiwgMHg2MGFiLCAweDAwMzYsIDB4MDAyNiwKKwkweDIxMTAsIDB4OTAwZSwgMHgwODBjLCAweDJhYzMsIDB4MDAyZSwgMHgwMDA1LCAweDIwMDksIDB4MDAwOSwKKwkweDAwYTAsIDB4MjAwOSwgMHgwMDBhLCAweDAwODgsIDB4MjAwOSwgMHgwMDBiLCAweDAwNzAsIDB4MjAwOSwKKwkweDAwMGMsIDB4MDA1OCwgMHgyMDA5LCAweDAwMGQsIDB4MDA0MCwgMHgyMDA5LCAweDAwMGUsIDB4MDAyOCwKKwkweDIwMDksIDB4MDAwZiwgMHgwMDEwLCAweDIwMDksIDB4MDAwOCwgMHg2OTEyLCAweDAwMDUsIDB4MDgwYywKKwkweDliMzcsIDB4MDAxNiwgMHgwMDI2LCAweDAwOTYsIDB4MDBkNiwgMHg3ODE0LCAweDIwNDgsIDB4NzAxMywKKwkweDAxMzgsIDB4MjAwMSwgMHgxODM3LCAweDIwMDQsIDB4OTA4NCwgMHgwMDI4LCAweDExMzgsIDB4MjAwMSwKKwkweDE5N2IsIDB4MjAwNCwgMHg5MDg2LCAweGFhYWEsIDB4MTkwNCwgMHhhN2I4LCAweDcwMDMsIDB4NTQwMCwKKwkweDAwYzYsIDB4MjA2MSwgMHgxODAwLCAweDYwN2MsIDB4OTA4NCwgMHgwMGZmLCAweGE5OTgsIDB4ODEwZiwKKwkweDkxOGMsIDB4ZmYwMCwgMHg5MTA1LCAweDcwMGEsIDB4NjA4MCwgMHg3MDBlLCAweGE5OTgsIDB4OTE4YywKKwkweGZmMDAsIDB4NzExMiwgMHgyMGE5LCAweDAwMDQsIDB4MjAwOSwgMHgxODA1LCAweDJlMTAsIDB4OTI5MCwKKwkweDAwMDYsIDB4MjEwNCwgMHgyMDEyLCAweDgxMDgsIDB4ODIxMCwgMHgxZjA0LCAweGE3NDksIDB4MjBhOSwKKwkweDAwMDQsIDB4MjAwOSwgMHgxODAxLCAweDIxMDQsIDB4MjAxMiwgMHg4MTA4LCAweDgyMTAsIDB4MWYwNCwKKwkweGE3NTMsIDB4YTg2MCwgMHgyMGUwLCAweGE4NWMsIDB4OTA4MCwgMHgwMDI5LCAweDIwOTgsIDB4MjAwOSwKKwkweDAwMDYsIDB4MjBhOSwgMHgwMDAxLCAweDQwMDIsIDB4ODAwNywgMHgyMDEyLCAweDgyMTAsIDB4ODEwOSwKKwkweDFkYzAsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsIDB4MDgwYywgMHhhNmZlLCAweDAwZGUsIDB4MjA3MSwKKwkweDAyNDAsIDB4MjAxMSwgMHgwMjQwLCAweDIwMDksIDB4MDAwMiwgMHgyMGE5LCAweDAwMDEsIDB4NDAwMiwKKwkweDgwMDcsIDB4MjAxMiwgMHg4MjEwLCAweDgxMDksIDB4MWRjMCwgMHgyMDA5LCAweDAwMDgsIDB4MjBhOSwKKwkweDAwMDEsIDB4NDAwMiwgMHg4MDA3LCAweDIwMTIsIDB4ODIxMCwgMHg4MTA5LCAweDFkYzAsIDB4YTg1YywKKwkweDkwODAsIDB4MDAzMSwgMHgyMDk4LCAweDIwMDksIDB4MDAwOCwgMHgyMGE5LCAweDAwMDEsIDB4NDAwMiwKKwkweDgwMDcsIDB4MjAxMiwgMHg4MjEwLCAweDgxMDksIDB4MWRjMCwgMHgwMGNlLCAweDYwYzMsIDB4MDA0YywKKwkweDYwYTMsIDB4MDA1NiwgMHg2MGE3LCAweDk1NzUsIDB4MjAwMSwgMHgxODM3LCAweDIwMDQsIDB4OTA4NCwKKwkweDAwMjgsIDB4MTE2OCwgMHgwODBjLCAweDc1M2QsIDB4MDE1MCwgMHg2MDI4LCAweGMwYmQsIDB4NjAyYSwKKwkweDIwMDksIDB4MTgwNCwgMHgyMDExLCAweDAwMjksIDB4MDgwYywgMHgyYWMzLCAweDAwMTAsIDB4MDgwYywKKwkweDllYTQsIDB4MDgwYywgMHg4Nzc3LCAweDAwZGUsIDB4MDA5ZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwKKwkweDAwZTYsIDB4MjA3MSwgMHgwMjQwLCAweDIwMDEsIDB4MjIwMCwgMHg5MDg1LCAweDAwZmYsIDB4NzAwMiwKKwkweDcwMDcsIDB4ZmZmZiwgMHgyMDcxLCAweDAxMDAsIDB4NzA5YiwgMHgwMGZmLCAweDAwZWUsIDB4MDgwNCwKKwkweGE3MmUsIDB4MDgwYywgMHg5YjM3LCAweDAwMTYsIDB4MDAyNiwgMHgwMDk2LCAweDAwZDYsIDB4NzgxNCwKKwkweDIwNDgsIDB4NzAxMywgMHgwMTM4LCAweDcwMDMsIDB4NTUwMCwgMHgwMGM2LCAweGE4OWMsIDB4OTA4NCwKKwkweDAwZmYsIDB4YTk5OCwgMHg4MTBmLCAweDkxOGMsIDB4ZmYwMCwgMHg5MTA1LCAweDcwMGEsIDB4YTk5YywKKwkweDkxOGMsIDB4ZmYwMCwgMHhhOGEwLCAweDkwODQsIDB4MDBmZiwgMHg5MTA1LCAweDcwMGUsIDB4YTk5OCwKKwkweDkxOGMsIDB4ZmYwMCwgMHgyMDYxLCAweDE4MDAsIDB4NjA3YywgMHg5MDg0LCAweDAwZmYsIDB4OTEwZCwKKwkweDcxMTIsIDB4NjE4MCwgMHg3MTE2LCAweDIwMDksIDB4MDAwOCwgMHhhODYwLCAweDIwZTAsIDB4YTg1YywKKwkweDkwODAsIDB4MDAyOSwgMHgyMDk4LCAweDJlMTAsIDB4OTI5MCwgMHgwMDA2LCAweDIwYTksIDB4MDAwMSwKKwkweDQwMDIsIDB4ODAwNywgMHgyMDEyLCAweDgyMTAsIDB4ODEwOSwgMHgxZGMwLCAweDIwYTksIDB4MDAwNCwKKwkweDIwMDksIDB4MTgwNSwgMHgyMTA0LCAweDIwMTIsIDB4ODEwOCwgMHg4MjEwLCAweDFmMDQsIDB4YTgwYSwKKwkweDIwYTksIDB4MDAwMiwgMHgyMDA5LCAweDE4MDEsIDB4MjEwNCwgMHgyMDEyLCAweDgxMDgsIDB4ODIxMCwKKwkweDFmMDQsIDB4YTgxNCwgMHgwMGQ2LCAweDAwMTYsIDB4MjA2OSwgMHgwMjAwLCAweDA4MGMsIDB4YTZmZSwKKwkweDAwMWUsIDB4MDBkZSwgMHgyMDcxLCAweDAyNDAsIDB4MjBhOSwgMHgwMDAyLCAweDIwMDksIDB4MTgwMywKKwkweDIwMTEsIDB4MDI0MCwgMHgyMTA0LCAweDIwMTIsIDB4ODEwOCwgMHg4MjEwLCAweDFmMDQsIDB4YTgyYSwKKwkweDIwMDksIDB4MDAwOCwgMHg0MDAyLCAweDgwMDcsIDB4MjAxMiwgMHg4MjEwLCAweDgxMDksIDB4MWRkMCwKKwkweDkwMDYsIDB4MjBhOSwgMHgwMDA4LCAweDIwMTIsIDB4ODIxMCwgMHgxZjA0LCAweGE4M2IsIDB4MDBjZSwKKwkweDYwYzMsIDB4MDA0YywgMHg2MGEzLCAweDAwNTYsIDB4NjBhNywgMHg5NTc1LCAweDA4MGMsIDB4OWVhNCwKKwkweDA4MGMsIDB4ODc3NywgMHgwMGRlLCAweDAwOWUsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBkNiwKKwkweDkyOTAsIDB4MDAxOCwgMHg4MjE0LCAweDIwZTksIDB4MDAwMCwgMHgyMDY5LCAweDAyMDAsIDB4NjgxMywKKwkweDAwMDAsIDB4MjJhOCwgMHg5Mjg0LCAweDAwZTAsIDB4MDEyOCwgMHgyMGE5LCAweDAwMjAsIDB4OTI5MiwKKwkweDAwMjAsIDB4MDAwOCwgMHg5MDE2LCAweDIwYTEsIDB4MDI0MCwgMHg5MDA2LCAweDQwMDQsIDB4ODJmZiwKKwkweDAxMjAsIDB4NjgxMCwgMHg4MDAwLCAweDY4MTIsIDB4MGM2MCwgMHgwMGRlLCAweDAwMDUsIDB4MDBmNiwKKwkweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwYTYsIDB4MDA5NiwgMHgwMDY2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA3MSwgMHgxOWU2LCAweDc2MTAsIDB4MjY2MCwgMHgyNjc4LCAweDhjZmYsIDB4MDkwNCwKKwkweGE4ZmIsIDB4NzAzMCwgMHg5YzA2LCAweDE1MjAsIDB4MjA2OSwgMHgwMTAwLCAweDY4YzAsIDB4OTAwNSwKKwkweDA5MDQsIDB4YThjZCwgMHgwODBjLCAweDllZDQsIDB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4YTNhYywKKwkweDcwMzMsIDB4MDAwMCwgMHgwMDM2LCAweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweDkzODQsIDB4MTAwMCwKKwkweDAxMzgsIDB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmE3YSwgMHg5MDA2LCAweDA4MGMsIDB4MmE3YSwKKwkweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDExMCwgMHg2ODI3LCAweDAwMDEsIDB4MDAzZSwKKwkweDcwMTAsIDB4OWMzNiwgMHgxMTEwLCAweDY2MGMsIDB4NzYxMiwgMHg3MDBjLCAweDljMzYsIDB4MTE0MCwKKwkweDJjMDAsIDB4OWYzNiwgMHgwMTE4LCAweDJmMDAsIDB4NzAwZSwgMHgwMDEwLCAweDcwMGYsIDB4MDAwMCwKKwkweDY2MGMsIDB4MDA2NiwgMHgyYzAwLCAweDlmMDYsIDB4MDExMCwgMHg3ZTBlLCAweDAwMDgsIDB4MjY3OCwKKwkweDYwMGYsIDB4MDAwMCwgMHgwODBjLCAweGNiODAsIDB4MTE4MCwgMHgwODBjLCAweDMyNmYsIDB4MDgwYywKKwkweGNiOTEsIDB4MTUxOCwgMHgwODBjLCAweGI2OTMsIDB4MDQwMCwgMHgwODBjLCAweGEzYWMsIDB4NjgyNCwKKwkweGQwODQsIDB4MDliMCwgMHg2ODI3LCAweDAwMDEsIDB4MDg5OCwgMHgwODBjLCAweGNiOTEsIDB4MTExOCwKKwkweDA4MGMsIDB4YjY5MywgMHgwMDkwLCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGM5NzgsIDB4MDE2OCwKKwkweDYwMjAsIDB4OTA4NiwgMHgwMDAzLCAweDE1MjAsIDB4YTg2NywgMHgwMTAzLCAweGFiN2EsIDB4YTg3NywKKwkweDAwMDAsIDB4MDgwYywgMHg2ZGVlLCAweDA4MGMsIDB4Y2I2YiwgMHgwODBjLCAweGNlMGQsIDB4MDgwYywKKwkweGFjZWIsIDB4MDgwYywgMHhhMjgyLCAweDAwY2UsIDB4MDgwNCwgMHhhODdlLCAweDJjNzgsIDB4NjAwYywKKwkweDIwNjAsIDB4MDgwNCwgMHhhODdlLCAweDcwMTMsIDB4MDAwMCwgMHg3MDBmLCAweDAwMDAsIDB4MDEyZSwKKwkweDAwNmUsIDB4MDA5ZSwgMHgwMGFlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwKKwkweDYwMjAsIDB4OTA4NiwgMHgwMDA2LCAweDFkMDgsIDB4MDgwYywgMHhlM2U4LCAweDA4ZjAsIDB4MDBmNiwKKwkweDAwMzYsIDB4MjA3OSwgMHgwMzgwLCAweDdiMTgsIDB4ZDNiYywgMHgxZGU4LCAweDc4MzIsIDB4NzkzNiwKKwkweDdhM2EsIDB4NzgxYiwgMHg4MDgwLCAweDAwM2UsIDB4MDBmZSwgMHgwMDA1LCAweDAwMTYsIDB4MjAwMSwKKwkweDAzODIsIDB4MjAwNCwgMHg5MDg0LCAweDAwMDcsIDB4OTA4NiwgMHgwMDAxLCAweDExODgsIDB4MjAwMSwKKwkweDAwMTUsIDB4MGMyOSwgMHgyMDA5LCAweDEwMDAsIDB4MjAwMSwgMHgwMzgyLCAweDIwMDQsIDB4OTA4NCwKKwkweDAwMDcsIDB4OTA4NiwgMHgwMDAzLCAweDAxMjAsIDB4ODEwOSwgMHgxZGIwLCAweDA4MGMsIDB4MGQ3ZCwKKwkweDAwMWUsIDB4MDAwNSwgMHgyMDAxLCAweDAzODIsIDB4MjAwNCwgMHg5MDg0LCAweDAwMDcsIDB4OTA4NiwKKwkweDAwMDMsIDB4MTEyMCwgMHgyMDAxLCAweDAzODAsIDB4MjAwMywgMHgwMDAxLCAweDAwMDUsIDB4MDE1NiwKKwkweDAwMTYsIDB4MDAyNiwgMHgwMGU2LCAweDkwMGUsIDB4MjA3MSwgMHgxOWU2LCAweDA0NjksIDB4MDEwNiwKKwkweDAxOTAsIDB4NzAwNCwgMHg5MDg2LCAweDAwMDMsIDB4MDE0OCwgMHgyMGE5LCAweDEwMDAsIDB4NjA0NCwKKwkweGQwZmMsIDB4MDFkOCwgMHgxZjA0LCAweGE5NTcsIDB4MDgwYywgMHgwZDdkLCAweDA4MGMsIDB4YTkxZSwKKwkweDYwNDQsIDB4ZDBmYywgMHgwMTkwLCAweDcwMzAsIDB4OWMwNiwgMHgxMTQ4LCAweDA4MGMsIDB4OTY3YSwKKwkweDYwNDQsIDB4ZDBkYywgMHgwMTUwLCAweGMwZGMsIDB4NjA0NiwgMHg3MDBhLCAweDcwNDIsIDB4NzA0YywKKwkweDljMDYsIDB4MTkwYywgMHgwZDdkLCAweDA4MGMsIDB4OTZkNSwgMHgwMTBlLCAweDE5MTksIDB4MDBlZSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMTVlLCAweDAwMDUsIDB4MjAwMSwgMHgwMzgyLCAweDIwMDQsIDB4OTA4NCwKKwkweDAwMDcsIDB4OTA4NiwgMHgwMDAzLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDI0MDAsIDB4NzgwOCwKKwkweGQwYTQsIDB4MTkwYywgMHgwZDc2LCAweGQwOWMsIDB4MDEyOCwgMHg3ODIwLCAweDkwOGMsIDB4ZjAwMCwKKwkweDExYjgsIDB4MDAxMiwgMHgwMTJlLCAweDAwMDUsIDB4YTlhNCwgMHhhOWUyLCAweGFhMGMsIDB4YWE0MywKKwkweGFhNTMsIDB4YWE2NCwgMHhhYTczLCAweGFhODEsIDB4YWFhZSwgMHhhYWIyLCAweGE5YTQsIDB4YTlhNCwKKwkweGE5YTQsIDB4YTlhNCwgMHhhOWE0LCAweGE5YTQsIDB4MDgwYywgMHgwZDdkLCAweDAxMmUsIDB4MDAwNSwKKwkweDIwNjAsIDB4NjA0NCwgMHhkMGJjLCAweDAxNDAsIDB4YzBiYywgMHg2MDQ2LCAweDYwMDAsIDB4OTA4YSwKKwkweDAwMTYsIDB4MWEwYywgMHgwZDdkLCAweDAwMTIsIDB4MDEyZSwgMHgwMDA1LCAweGE5YzksIDB4YTljYiwKKwkweGE5YzksIDB4YTlkMSwgMHhhOWM5LCAweGE5YzksIDB4YTljOSwgMHhhOWM5LCAweGE5YzksIDB4YTljYiwKKwkweGE5YzksIDB4YTljYiwgMHhhOWM5LCAweGE5Y2IsIDB4YTljOSwgMHhhOWM5LCAweGE5YzksIDB4YTljYiwKKwkweGE5YzksIDB4MDgwYywgMHgwZDdkLCAweDIwMDksIDB4MDAxMywgMHgwODBjLCAweGFkNGQsIDB4MDEyZSwKKwkweDAwMDUsIDB4NjAxNCwgMHgyMDQ4LCAweGE4N2MsIDB4ZDBkYywgMHgwMTMwLCAweDA4MGMsIDB4ODk0ZSwKKwkweDA4MGMsIDB4YWNiMCwgMHgwMTJlLCAweDAwMDUsIDB4MjAwOSwgMHgwMDQ5LCAweDA4MGMsIDB4YWQ0ZCwKKwkweDAxMmUsIDB4MDAwNSwgMHgwODBjLCAweGE5MWUsIDB4MjAwMSwgMHgxYTBiLCAweDIwMDMsIDB4MDAwMCwKKwkweDcwMzAsIDB4OTA2NSwgMHgwOTBjLCAweDBkN2QsIDB4NzAzNCwgMHg5MDkyLCAweGMzNTAsIDB4MTI1OCwKKwkweDgwMDAsIDB4NzAzNiwgMHg3MDA0LCAweDkwODYsIDB4MDAwMywgMHgwMTEwLCAweDcwMDcsIDB4MDAwMCwKKwkweDc4MWYsIDB4MDgwOCwgMHgwMDU4LCAweDA4MGMsIDB4YWMwZSwgMHgwMTQwLCAweDA4MGMsIDB4ZTg5NywKKwkweDYwMDMsIDB4MDAwMSwgMHgyMDA5LCAweDAwMTQsIDB4MDgwYywgMHhhZDRkLCAweDc4MWYsIDB4MDEwMCwKKwkweDA4MGMsIDB4YTkzYSwgMHgwMTJlLCAweDAwMDUsIDB4MDgwYywgMHhhOTFlLCAweDcxNGMsIDB4ODFmZiwKKwkweDExMjgsIDB4MjAxMSwgMHgxYTBlLCAweDIwMTMsIDB4MDAwMCwgMHgwNDM4LCAweDIwNjEsIDB4MDEwMCwKKwkweDcxNTAsIDB4OTE5MiwgMHg3NTMwLCAweDEyZjAsIDB4ODEwOCwgMHg3MTUyLCAweDcxNGMsIDB4OTE4OCwKKwkweDAwMDgsIDB4MjEwYywgMHg5MThlLCAweDAwMDYsIDB4MTEzOCwgMHg2MDE0LCAweDkwODQsIDB4MTk4NCwKKwkweDkwODUsIDB4MDAxMiwgMHg2MDE2LCAweDAwODgsIDB4NzE0YywgMHg5MTg4LCAweDAwMDgsIDB4MjEwYywKKwkweDkxOGUsIDB4MDAwOSwgMHgwZDkwLCAweDYwMTQsIDB4OTA4NCwgMHgxOTg0LCAweDkwODUsIDB4MDAxNiwKKwkweDYwMTYsIDB4MDAxOCwgMHg3MDZjLCAweGMwODUsIDB4NzA2ZSwgMHg3ODFmLCAweDAyMDAsIDB4MDgwYywKKwkweGE5M2EsIDB4MDEyZSwgMHgwMDA1LCAweDA4MGMsIDB4YTkxZSwgMHg3MTRjLCAweDIxNjAsIDB4NjAwMywKKwkweDAwMDMsIDB4MjAwOSwgMHgwMDRhLCAweDA4MGMsIDB4YWQ0ZCwgMHg3ODFmLCAweDAyMDAsIDB4MDgwYywKKwkweGE5M2EsIDB4MDEyZSwgMHgwMDA1LCAweDc4MDgsIDB4ZDA5YywgMHgwZGU4LCAweDc4MjAsIDB4MjA2MCwKKwkweDYwMDMsIDB4MDAwMywgMHgwODBjLCAweGE5MWUsIDB4MDgwYywgMHgxZGI2LCAweDc4MWYsIDB4MDQwMCwKKwkweDA4MGMsIDB4YTkzYSwgMHgwMTJlLCAweDAwMDUsIDB4NzgwOCwgMHhkMDljLCAweDBkZTgsIDB4NzgyMCwKKwkweDIwNjAsIDB4MDgwYywgMHhhOTFlLCAweDA4MGMsIDB4MWRmZSwgMHg3ODFmLCAweDA0MDAsIDB4MDgwYywKKwkweGE5M2EsIDB4MDEyZSwgMHgwMDA1LCAweDcwMzAsIDB4OTA2NSwgMHgwMTQ4LCAweDYwNDQsIDB4YzBiYywKKwkweDYwNDYsIDB4NzEwNCwgMHg5MTg2LCAweDAwMDMsIDB4MDExMCwgMHgwODBjLCAweDk3MzksIDB4MDEyZSwKKwkweDAwMDUsIDB4MDBmNiwgMHg3MDNjLCAweDkwODYsIDB4MDAwMiwgMHgwNTI4LCAweDcwNGMsIDB4OTA3ZCwKKwkweDA1MTAsIDB4Nzg0NCwgMHhjMGJjLCAweDc4NDYsIDB4NzgyMCwgMHg5MDg2LCAweDAwMDksIDB4MDExOCwKKwkweDA4MGMsIDB4OWRmZSwgMHgwMGMwLCAweDc4MjgsIDB4ZDBmYywgMHgxMTE4LCAweDA4MGMsIDB4OWQ3ZCwKKwkweDAwOTAsIDB4MjAwMSwgMHgxODM3LCAweDIwMDQsIDB4OTA4NCwgMHgwMDI4LCAweDExMzAsIDB4MjAwMSwKKwkweDE5N2IsIDB4MjAwNCwgMHg5MDg2LCAweGFhYWEsIDB4MTEyMCwgMHgyMDAxLCAweDAzODcsIDB4MjAwMywKKwkweDEwMDAsIDB4MDgwYywgMHg5ZDAyLCAweDAwZmUsIDB4MDEyZSwgMHgwMDA1LCAweDA4MGMsIDB4NzVlMiwKKwkweDAxMmUsIDB4MDAwNSwgMHgwODBjLCAweDBkN2QsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTllNiwKKwkweDYwNDQsIDB4YzBiYywgMHg2MDQ2LCAweGQwZmMsIDB4MDFiOCwgMHg3MDRjLCAweDljMDYsIDB4MTE5MCwKKwkweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweGExYjgsIDB4NzA0ZiwgMHgwMDAwLCAweDIwMDEsIDB4MDEwOSwKKwkweDIwMDQsIDB4ZDA4YywgMHgxMTM4LCAweDIwMDEsIDB4MDEwOCwgMHgyMDA0LCAweGQwYmMsIDB4MTExMCwKKwkweDcwM2YsIDB4MDAwMCwgMHgwODBjLCAweGEzYzMsIDB4MDBlZSwgMHgwMDA1LCAweDAwMjYsIDB4NzAxMCwKKwkweDljMDYsIDB4MTE3OCwgMHgwODBjLCAweGEyODIsIDB4NjA0NCwgMHhjMGZjLCAweDYwNDYsIDB4NjAwYywKKwkweDkwMTUsIDB4MDEyMCwgMHg3MjEyLCAweDYwMGYsIDB4MDAwMCwgMHgwMDEwLCAweDcyMTIsIDB4NzIwZSwKKwkweDkwMDYsIDB4MDAyZSwgMHgwMDA1LCAweDAwMjYsIDB4NzAyMCwgMHg5YzA2LCAweDExNzgsIDB4MDgwYywKKwkweGEyODIsIDB4NjA0NCwgMHhjMGZjLCAweDYwNDYsIDB4NjAwYywgMHg5MDE1LCAweDAxMjAsIDB4NzIyMiwKKwkweDYwMGYsIDB4MDAwMCwgMHgwMDEwLCAweDcyMjIsIDB4NzIxZSwgMHg5MDA2LCAweDAwMmUsIDB4MDAwNSwKKwkweDAwZDYsIDB4MDAzNiwgMHg3ODMwLCAweDljMDYsIDB4MTU1OCwgMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwKKwkweDkwMDUsIDB4MDFmOCwgMHgwODBjLCAweDg3ODAsIDB4MDgwYywgMHg5ZWQ0LCAweDY4YzMsIDB4MDAwMCwKKwkweDA4MGMsIDB4YTNhYywgMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHg5Mzg0LCAweDEwMDAsIDB4MDEzOCwKKwkweDIwMDEsIDB4MDEwMCwgMHgwODBjLCAweDJhN2EsIDB4OTAwNiwgMHgwODBjLCAweDJhN2EsIDB4MjA2OSwKKwkweDAxMDAsIDB4NjgyNCwgMHhkMDg0LCAweDAxMTAsIDB4NjgyNywgMHgwMDAxLCAweDkwODUsIDB4MDAwMSwKKwkweDAwMzgsIDB4NzgwOCwgMHhjMGFkLCAweDc4MGEsIDB4NjAwMywgMHgwMDA5LCAweDYzMGEsIDB4OTAwNiwKKwkweDAwM2UsIDB4MDBkZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDYxMDAsIDB4MjAxOSwKKwkweDAxMDAsIDB4MjAwMSwgMHgwMzgyLCAweDIwMDQsIDB4ZDA5YywgMHgwMTkwLCAweDAwYzYsIDB4MDEyNiwKKwkweDIwOTEsIDB4MjgwMCwgMHgwMDE2LCAweDAwMzYsIDB4MDgwYywgMHhhOTg0LCAweDAwM2UsIDB4MDAxZSwKKwkweDAxMmUsIDB4MDBjZSwgMHg2MjAwLCAweDIyMDAsIDB4OTEwNiwgMHgwZDU4LCAweDIyMDAsIDB4MDAxMCwKKwkweDgzMTksIDB4MWQzOCwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwZDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4OWI4MiwgMHg3YTE0LCAweDgyZmYsIDB4MDEzOCwgMHg3MDAzLCAweDAxMDAsIDB4NzAwYiwKKwkweDAwMDMsIDB4NjBjMywgMHgwMDA4LCAweDA0OTAsIDB4NzAwMywgMHgwMjAwLCAweDcwMDcsIDB4MDAwMCwKKwkweDIwNjksIDB4MTgwMCwgMHg5MDFlLCAweDY4MDAsIDB4OTA4NiwgMHgwMDA0LCAweDExMTAsIDB4YzM4ZCwKKwkweDAwNjAsIDB4MDgwYywgMHg3NTNkLCAweDExMTAsIDB4YzNhZCwgMHgwMDA4LCAweGMzYTUsIDB4NmFkYywKKwkweGQyOWMsIDB4MTExMCwgMHhkMmFjLCAweDAxMDgsIDB4YzM5ZCwgMHg3MzBlLCAweDA4MGMsIDB4ODg0NSwKKwkweDIwYTksIDB4MDAwNiwgMHgyMDExLCAweGZmZWMsIDB4MjAxOSwgMHhmZmVkLCAweDIwNzEsIDB4MDI1MCwKKwkweDIzMDUsIDB4MjA3MiwgMHg4ZTcwLCAweDIyMDUsIDB4MjA3MiwgMHg4ZTcwLCAweDkzOTgsIDB4MDAwMiwKKwkweDkyOTAsIDB4MDAwMiwgMHgxZjA0LCAweGFiODgsIDB4NjBjMywgMHgwMDIwLCAweDA4MGMsIDB4OWVhNCwKKwkweDAxNWUsIDB4MDBkZSwgMHgwMDA1LCAweDAxNTYsIDB4MDgwYywgMHg5YjgyLCAweDdhMTQsIDB4ODJmZiwKKwkweDAxNjgsIDB4OTI4NiwgMHhmZmZmLCAweDAxMTgsIDB4OTI4MiwgMHgwMDBlLCAweDEyMzgsIDB4NzAwMywKKwkweDAxMDAsIDB4NzAwYiwgMHgwMDAzLCAweDYwYzMsIDB4MDAwOCwgMHgwNDg4LCAweDcwMDMsIDB4MDIwMCwKKwkweDcwMDcsIDB4MDAxYywgMHg3MDBmLCAweDAwMDEsIDB4MjAxMSwgMHgxOWJjLCAweDIyMDQsIDB4ODAwNywKKwkweDcwMWEsIDB4ODIxMCwgMHgyMjA0LCAweDgwMDcsIDB4NzAxZSwgMHgwNDIxLCAweDExMjAsIDB4YjhhMCwKKwkweDkwODIsIDB4MDA3ZiwgMHgwMjQ4LCAweDIwMDEsIDB4MTgxZiwgMHgyMDA0LCAweDcwMjIsIDB4MjAwMSwKKwkweDE4MjAsIDB4MjAwNCwgMHg3MDI2LCAweDAwMzAsIDB4MjAwMSwgMHgxODE4LCAweDIwMDQsIDB4OTA4NCwKKwkweDAwZmYsIDB4NzAyNiwgMHgyMGE5LCAweDAwMDQsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksIDB4MTgwNSwKKwkweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNTYsIDB4NDAwMywgMHg2MGMzLCAweDAwMWMsIDB4MDE1ZSwKKwkweDA4MDQsIDB4OWVhNCwgMHgwMDA2LCAweDIwMDEsIDB4MTgzNywgMHgyMDA0LCAweGQwYWMsIDB4MDAwZSwKKwkweDAwMDUsIDB4MjAxMSwgMHgwMDAzLCAweDA4MGMsIDB4YTI0MywgMHgyMDExLCAweDAwMDIsIDB4MDgwYywKKwkweGEyNGQsIDB4MDgwYywgMHhhMTM4LCAweDAwMzYsIDB4OTAxZSwgMHgwODBjLCAweGExYjgsIDB4MDAzZSwKKwkweDAwMDUsIDB4MDgwYywgMHgzM2IyLCAweDAxODgsIDB4MDAxNiwgMHgwMGI2LCAweDAwYzYsIDB4NzAxMCwKKwkweDkwODUsIDB4MDAyMCwgMHg3MDEyLCAweDIwMDksIDB4MDA3ZSwgMHgwODBjLCAweDY2OTMsIDB4Yjg1YywKKwkweGMwYWMsIDB4Yjg1ZSwgMHgwMGNlLCAweDAwYmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwZDYsIDB4MDBmNiwKKwkweDcxMDQsIDB4OTE4NiwgMHgwMDA0LCAweDExMjAsIDB4NzQxMCwgMHg5ZTkwLCAweDAwMDQsIDB4MDA2OCwKKwkweDkxODYsIDB4MDAwMSwgMHgxMTIwLCAweDc0MjAsIDB4OWU5MCwgMHgwMDA4LCAweDAwMzAsIDB4OTE4NiwKKwkweDAwMDIsIDB4MTUwOCwgMHg3NDI4LCAweDllOTAsIDB4MDAwYSwgMHg2MTEwLCAweDI0NjgsIDB4NjgwYywKKwkweDkwN2QsIDB4MDFjOCwgMHg3ODEwLCAweDkxMDYsIDB4MTEyOCwgMHgyZjY4LCAweDc4MGMsIDB4OTA3ZCwKKwkweDFkYzgsIDB4MDA4OCwgMHg3ODBjLCAweDY4MGUsIDB4N2MwZSwgMHgyZjEyLCAweDkwMDYsIDB4NzAzMiwKKwkweDcwMzYsIDB4NzAwNCwgMHg5MDg2LCAweDAwMDMsIDB4MDExMCwgMHg3MDA3LCAweDAwMDAsIDB4OTAwNiwKKwkweDAwZmUsIDB4MDBkZSwgMHgwMDA1LCAweDkwODUsIDB4MDAwMSwgMHgwY2QwLCAweDIwNzEsIDB4MTg4ZCwKKwkweDcwMDAsIDB4OTAwNSwgMHgwMTQwLCAweDIwMDEsIDB4MDgxMiwgMHgyMDcxLCAweDE4MDAsIDB4NzA3NiwKKwkweDcwN2EsIDB4NzA2YiwgMHhmZmQ0LCAweDIwNzEsIDB4MTgwMCwgMHg3MDc0LCAweDcwNTYsIDB4NzA1YiwKKwkweDFkZGMsIDB4MDAwNSwgMHgwMGU2LCAweDAxMjYsIDB4MjA3MSwgMHgxODAwLCAweDIwOTEsIDB4ODAwMCwKKwkweDc1NTQsIDB4OTU4MiwgMHgwMDEwLCAweDA2MDgsIDB4NzA1OCwgMHgyMDYwLCAweDYwMDAsIDB4OTA4NiwKKwkweDAwMDAsIDB4MDE0OCwgMHg5Y2UwLCAweDAwMWMsIDB4NzA2OCwgMHg5YzAyLCAweDEyMDgsIDB4MGNiMCwKKwkweDIwNjEsIDB4MWRkYywgMHgwYzk4LCAweDYwMDMsIDB4MDAwOCwgMHg4NTI5LCAweDc1NTYsIDB4OWNhOCwKKwkweDAwMWMsIDB4NzA2OCwgMHg5NTAyLCAweDEyMzAsIDB4NzU1YSwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwKKwkweDAwZWUsIDB4MDAwNSwgMHg3MDViLCAweDFkZGMsIDB4MGNjMCwgMHg5MDA2LCAweDBjYzAsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTgwMCwgMHg3NTU0LCAweDk1ODIsIDB4MDAxMCwgMHgwNjAwLCAweDcwNTgsIDB4MjA2MCwKKwkweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDAxNDgsIDB4OWNlMCwgMHgwMDFjLCAweDcwNjgsIDB4OWMwMiwKKwkweDEyMDgsIDB4MGNiMCwgMHgyMDYxLCAweDFkZGMsIDB4MGM5OCwgMHg2MDAzLCAweDAwMDgsIDB4ODUyOSwKKwkweDc1NTYsIDB4OWNhOCwgMHgwMDFjLCAweDcwNjgsIDB4OTUwMiwgMHgxMjI4LCAweDc1NWEsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDBlZSwgMHgwMDA1LCAweDcwNWIsIDB4MWRkYywgMHgwY2M4LCAweDkwMDYsIDB4MGNjOCwKKwkweDljODIsIDB4MWRkYywgMHgwYTBjLCAweDBkN2QsIDB4MjAwMSwgMHgxODFhLCAweDIwMDQsIDB4OWMwMiwKKwkweDFhMGMsIDB4MGQ3ZCwgMHg5MDA2LCAweDYwMDYsIDB4NjAwYSwgMHg2MDBlLCAweDYwMTYsIDB4NjAxYSwKKwkweDYwMTIsIDB4NjAyMywgMHgwMDAwLCAweDYwMDMsIDB4MDAwMCwgMHg2MDFlLCAweDYwNWUsIDB4NjA2MiwKKwkweDYwMjYsIDB4NjAyYSwgMHg2MDJlLCAweDYwMzIsIDB4NjAzNiwgMHg2MDNhLCAweDYwM2UsIDB4NjA0YSwKKwkweDYwMmEsIDB4NjA0NiwgMHg2MDQyLCAweDIwNjEsIDB4MTgwMCwgMHg2MDU0LCAweDgwMDAsIDB4NjA1NiwKKwkweDAwMDUsIDB4OTAwNiwgMHg2MDBlLCAweDYwMTYsIDB4NjAxYSwgMHg2MDEyLCAweDYwMjIsIDB4NjAwMiwKKwkweDYwMWUsIDB4NjA1ZSwgMHg2MDYyLCAweDYwNGEsIDB4NjA0NiwgMHgyMDYxLCAweDE4MDAsIDB4NjA1NCwKKwkweDgwMDAsIDB4NjA1NiwgMHgwMDA1LCAweDAwMDYsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDFkMCwKKwkweDYwMWMsIDB4ZDA4NCwgMHgxOTBjLCAweDFhYzUsIDB4NjAyMywgMHgwMDA3LCAweDIwMDEsIDB4MTk4NSwKKwkweDIwMDQsIDB4MDAwNiwgMHg5MDgyLCAweDAwNTEsIDB4MDAwZSwgMHgwMjA4LCAweDgwMDQsIDB4NjAxYSwKKwkweDA4MGMsIDB4ZTZhMCwgMHg2MDRiLCAweDAwMDAsIDB4NjA0NCwgMHhkMGZjLCAweDExMjksIDB4OTAwNiwKKwkweDYwNDYsIDB4NjAxNiwgMHgwMDBlLCAweDAwMDUsIDB4MDgwYywgMHhhOTFlLCAweDAxMDYsIDB4MjAwMSwKKwkweDE5ZjksIDB4MjAwNCwgMHg5YzA2LCAweDExMzAsIDB4MDAzNiwgMHgyMDE5LCAweDAwMDEsIDB4MDgwYywKKwkweGExYjgsIDB4MDAzZSwgMHgwODBjLCAweGEzYzMsIDB4MDEwZSwgMHgwOTBjLCAweGE5M2EsIDB4MDAwNSwKKwkweDAwZTYsIDB4MDEyNiwgMHgyMDcxLCAweDE4MDAsIDB4MjA5MSwgMHg4MDAwLCAweDc1NTQsIDB4OTU4MiwKKwkweDAwMDEsIDB4MDYwOCwgMHg3MDU4LCAweDIwNjAsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDE0OCwKKwkweDljZTAsIDB4MDAxYywgMHg3MDY4LCAweDljMDIsIDB4MTIwOCwgMHgwY2IwLCAweDIwNjEsIDB4MWRkYywKKwkweDBjOTgsIDB4NjAwMywgMHgwMDA4LCAweDg1MjksIDB4NzU1NiwgMHg5Y2E4LCAweDAwMWMsIDB4NzA2OCwKKwkweDk1MDIsIDB4MTIzMCwgMHg3NTVhLCAweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwKKwkweDcwNWIsIDB4MWRkYywgMHgwY2MwLCAweDkwMDYsIDB4MGNjMCwgMHg2MDIwLCAweDkwODQsIDB4MDAwZiwKKwkweDAwMDIsIDB4YWQ2MSwgMHhhZDZiLCAweGFkODYsIDB4YWRhMSwgMHhkMGVlLCAweGQxMGIsIDB4ZDEyNiwKKwkweGFkNjEsIDB4YWQ2YiwgMHg5MDI1LCAweGFkYmQsIDB4YWQ2MSwgMHhhZDYxLCAweGFkNjEsIDB4YWQ2MSwKKwkweGFkNjEsIDB4OTE4NiwgMHgwMDEzLCAweDExMzAsIDB4NjA0NCwgMHhkMGZjLCAweDAxMTAsIDB4MDgwYywKKwkweDk2N2EsIDB4MDAwNSwgMHgwMDA1LCAweDAwNjYsIDB4NjAwMCwgMHg5MGIyLCAweDAwMTYsIDB4MWEwYywKKwkweDBkN2QsIDB4MDAxMywgMHgwMDZlLCAweDAwMDUsIDB4YWQ4NCwgMHhiNGZkLCAweGI2ZGEsIDB4YWQ4NCwKKwkweGI3NzAsIDB4YjA4NiwgMHhhZDg0LCAweGFkODQsIDB4YjQ3ZiwgMHhiY2RhLCAweGFkODQsIDB4YWQ4NCwKKwkweGFkODQsIDB4YWQ4NCwgMHhhZDg0LCAweGFkODQsIDB4MDgwYywgMHgwZDdkLCAweDAwNjYsIDB4NjAwMCwKKwkweDkwYjIsIDB4MDAxNiwgMHgxYTBjLCAweDBkN2QsIDB4MDAxMywgMHgwMDZlLCAweDAwMDUsIDB4YWQ5ZiwKKwkweGMyZjIsIDB4YWQ5ZiwgMHhhZDlmLCAweGFkOWYsIDB4YWQ5ZiwgMHhhZDlmLCAweGFkOWYsIDB4YzI4OSwKKwkweGM0NzUsIDB4YWQ5ZiwgMHhjMzJmLCAweGMzYjMsIDB4YzMyZiwgMHhjM2IzLCAweGFkOWYsIDB4MDgwYywKKwkweDBkN2QsIDB4NjAwMCwgMHg5MDgyLCAweDAwMTYsIDB4MWEwYywgMHgwZDdkLCAweDYwMDAsIDB4MDAwMiwKKwkweGFkYmIsIDB4YmQyNCwgMHhiZGJlLCAweGJmM2UsIDB4YmZhZCwgMHhhZGJiLCAweGFkYmIsIDB4YWRiYiwKKwkweGJjZjMsIDB4YzIwYSwgMHhjMjBkLCAweGFkYmIsIDB4YWRiYiwgMHhhZGJiLCAweGFkYmIsIDB4YzIzZCwKKwkweGFkYmIsIDB4YWRiYiwgMHhhZGJiLCAweDA4MGMsIDB4MGQ3ZCwgMHgwMDY2LCAweDYwMDAsIDB4OTBiMiwKKwkweDAwMTYsIDB4MWEwYywgMHgwZDdkLCAweDAwMTMsIDB4MDA2ZSwgMHgwMDA1LCAweGFkZDYsIDB4YWRkNiwKKwkweGFlMTQsIDB4YWViMywgMHhhZjMzLCAweGFkZDYsIDB4YWRkNiwgMHhhZGQ2LCAweGFkZDgsIDB4YWRkNiwKKwkweGFkZDYsIDB4YWRkNiwgMHhhZGQ2LCAweGFkZDYsIDB4YWRkNiwgMHhhZGQ2LCAweDA4MGMsIDB4MGQ3ZCwKKwkweDkxODYsIDB4MDA0YywgMHgwNTYwLCAweDkxODYsIDB4MDAwMywgMHgxOTBjLCAweDBkN2QsIDB4MDA5NiwKKwkweDYwMWMsIDB4YzBlZCwgMHg2MDFlLCAweDYwMDMsIDB4MDAwMywgMHg2MTA2LCAweDYwMTQsIDB4MjA0OCwKKwkweGE4N2MsIDB4OTA4NCwgMHhhMDAwLCAweGMwYjUsIDB4YTg3ZSwgMHhhOGFjLCAweGE4MzYsIDB4YThiMCwKKwkweGE4M2EsIDB4OTAwNiwgMHhhODQ2LCAweGE4NGEsIDB4YTg4NCwgMHg5MDkyLCAweDE5OWEsIDB4MDIxMCwKKwkweDIwMDEsIDB4MTk5OSwgMHg4MDAzLCAweDgwMTMsIDB4ODIxMywgMHg5MjEwLCAweDYyMWEsIDB4MDA5ZSwKKwkweDA4MGMsIDB4MWMxMCwgMHgyMDA5LCAweDgwMzAsIDB4MDgwYywgMHg5MmY3LCAweDAwMDUsIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiY2EwLCAweDAwYmUsIDB4MmMwMCwgMHgwODBjLCAweGFmNTUsIDB4MDgwYywKKwkweGQwYjMsIDB4NjAwMywgMHgwMDA3LCAweDAwMDUsIDB4MDBkNiwgMHgwMDk2LCAweDAwZjYsIDB4MjA3OSwKKwkweDE4MDAsIDB4N2E5MCwgMHg2MDE0LCAweDIwNDgsIDB4YTg3YywgMHhkMGVjLCAweDExMTAsIDB4OTI5MCwKKwkweDAwMTgsIDB4YWM3OCwgMHhjNGZjLCAweDAwNDYsIDB4YThlMCwgMHg5MDA1LCAweDExNDAsIDB4YThkYywKKwkweDkyMWEsIDB4MDE0MCwgMHgwMjIwLCAweGE4N2IsIDB4MDAwNywgMHgyMDEwLCAweDAwMjgsIDB4YTg3YiwKKwkweDAwMTUsIDB4MDAxMCwgMHhhODdiLCAweDAwMDAsIDB4ODIxNCwgMHhhODgzLCAweDAwMDAsIDB4YWEwMiwKKwkweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MjQwMCwKKwkweDkwMDUsIDB4MTEwOCwgMHgwMDlhLCAweDIxMDAsIDB4OTA4NiwgMHgwMDE1LCAweDExMTgsIDB4MjAwMSwKKwkweDAwMDEsIDB4MDAzOCwgMHgyMTAwLCAweDkwODYsIDB4MDAxNiwgMHgwMTE4LCAweDIwMDEsIDB4MDAwMSwKKwkweDAwMmEsIDB4OTRhNCwgMHgwMDA3LCAweDg0MjMsIDB4OTQwNSwgMHgwMDAyLCAweGFlN2IsIDB4YWU3YiwKKwkweGFlNzYsIDB4YWU3OSwgMHhhZTdiLCAweGFlNzMsIDB4YWU2NiwgMHhhZTY2LCAweGFlNjYsIDB4YWU2NiwKKwkweGFlNjYsIDB4YWU2NiwgMHhhZTY2LCAweGFlNjYsIDB4YWU2NiwgMHhhZTY2LCAweDAwZmUsIDB4MDBlZSwKKwkweDAwZGUsIDB4MDBjZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDRlLCAweDAwZmUsIDB4MDA5ZSwKKwkweDAwZGUsIDB4MDgwYywgMHgwZDdkLCAweDA4MGMsIDB4YjkyZiwgMHgwMDI4LCAweDA4MGMsIDB4YmExNCwKKwkweDAwMTAsIDB4MDgwYywgMHhiYjBhLCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAyZSwKKwkweDAwMWUsIDB4MmMwMCwgMHhhODk2LCAweDAwMGUsIDB4MDgwYywgMHhiMDEzLCAweDA1MzAsIDB4YTgwNCwKKwkweGE4MGUsIDB4MDBhNiwgMHgyMDUwLCAweGIxMDAsIDB4MDBhZSwgMHg4MDA2LCAweDgwMDYsIDB4ODAwNywKKwkweDkwYmMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDAyLCAweGFhY2MsIDB4YWJkMCwKKwkweGFjZDQsIDB4YWRkOCwgMHgyMDMxLCAweDAwMDAsIDB4MjA0MSwgMHgxMmIwLCAweDA4MGMsIDB4YjFkNCwKKwkweDAxNjAsIDB4MDAwZSwgMHg5MDA1LCAweDAxMjAsIDB4MDBmZSwgMHgwMDllLCAweDAwZGUsIDB4MDAwNSwKKwkweDAwZmUsIDB4MDA5ZSwgMHgwMGRlLCAweDA4MDQsIDB4YWNiMCwgMHgyMDAxLCAweDAwMmMsIDB4OTAwZSwKKwkweDA4MGMsIDB4YjA3OSwgMHgwYzcwLCAweDkxYjYsIDB4MDAxNSwgMHgwMTcwLCAweDkxYjYsIDB4MDAxNiwKKwkweDAxNTgsIDB4OTFiMiwgMHgwMDQ3LCAweDBhMGMsIDB4MGQ3ZCwgMHg5MWIyLCAweDAwNTAsIDB4MWEwYywKKwkweDBkN2QsIDB4OTE4MiwgMHgwMDQ3LCAweDAwNDIsIDB4MDgwYywgMHhhYjMzLCAweDAxMjAsIDB4OTA4NiwKKwkweDAwMDIsIDB4MDkwNCwgMHhhZTE0LCAweDAwMDUsIDB4YWVkNSwgMHhhZWQ1LCAweGFlZDcsIDB4YWYwOSwKKwkweGFlZDUsIDB4YWVkNSwgMHhhZWQ1LCAweGFlZDUsIDB4YWYxYywgMHgwODBjLCAweDBkN2QsIDB4MDBkNiwKKwkweDAwMTYsIDB4MDA5NiwgMHg2MDAzLCAweDAwMDQsIDB4NjExNCwgMHgyMTQ4LCAweGE4N2MsIDB4ZDBmYywKKwkweDAxYzAsIDB4YTg3OCwgMHhjMGZjLCAweDkwMDUsIDB4MTE1OCwgMHhhODk0LCAweDkwMDUsIDB4MDE0MCwKKwkweDIwMDEsIDB4MDAwMCwgMHg5MDBlLCAweDA4MGMsIDB4YjA3OSwgMHgwODBjLCAweGFjYjAsIDB4MDBhOCwKKwkweDYwMDMsIDB4MDAwMiwgMHhhOGE0LCAweGE5YTgsIDB4OTEwNSwgMHgxMTc4LCAweGE4YWUsIDB4YThiMiwKKwkweDBjNzgsIDB4YTg3ZiwgMHgwMDIwLCAweGE4OGMsIDB4YTg4YSwgMHhhOGE0LCAweGE4YWUsIDB4YThhOCwKKwkweGE4YjIsIDB4YThjNywgMHgwMDAwLCAweGE4Y2IsIDB4MDAwMCwgMHgwMDllLCAweDAwMWUsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDgwYywgMHg5NmQ1LCAweDAwZDYsIDB4MDA5NiwgMHg2MTE0LCAweDIxNDgsIDB4MDgwYywKKwkweGM5N2EsIDB4MDEyMCwgMHhhODdiLCAweDAwMDYsIDB4MDgwYywgMHg2ZGVlLCAweDAwOWUsIDB4MDBkZSwKKwkweDA4MGMsIDB4YWNiMCwgMHgwODA0LCAweDk3MzgsIDB4MDgwYywgMHg5NmQ1LCAweDA4MGMsIDB4MzI0MCwKKwkweDA4MGMsIDB4ZDBiMCwgMHgwMGQ2LCAweDAwOTYsIDB4NjExNCwgMHgyMTQ4LCAweDA4MGMsIDB4Yzk3YSwKKwkweDAxMjAsIDB4YTg3YiwgMHgwMDI5LCAweDA4MGMsIDB4NmRlZSwgMHgwMDllLCAweDAwZGUsIDB4MDgwYywKKwkweGFjYjAsIDB4MDgwNCwgMHg5NzM4LCAweDkxODIsIDB4MDA0NywgMHgwMDAyLCAweGFmNDMsIDB4YWY0NSwKKwkweGFmNDMsIDB4YWY0MywgMHhhZjQzLCAweGFmNDMsIDB4YWY0MywgMHhhZjQzLCAweGFmNDMsIDB4YWY0MywKKwkweGFmNDMsIDB4YWY0MywgMHhhZjQ1LCAweDA4MGMsIDB4MGQ3ZCwgMHgwMGQ2LCAweDAwOTYsIDB4NjAxZiwKKwkweDAwMDAsIDB4NjExNCwgMHgyMTQ4LCAweGE4N2IsIDB4MDAwMCwgMHhhODgzLCAweDAwMDAsIDB4MDgwYywKKwkweDZkZWUsIDB4MDA5ZSwgMHgwMGRlLCAweDA4MDQsIDB4YWNiMCwgMHgwMDI2LCAweDAwMzYsIDB4MDA1NiwKKwkweDAwNjYsIDB4MDA5NiwgMHgwMGE2LCAweDAwZjYsIDB4MDAwNiwgMHgwODBjLCAweDEwNDcsIDB4MDAwZSwKKwkweDA5MGMsIDB4MGQ3ZCwgMHhhOTYwLCAweDIxZTgsIDB4YTk1YywgMHg5MTg4LCAweDAwMTksIDB4MjFhMCwKKwkweDkwMGUsIDB4MjBhOSwgMHgwMDIwLCAweDQxMDQsIDB4YTg3YSwgMHgyMDc5LCAweDE4MDAsIDB4Nzk5MCwKKwkweDkxODgsIDB4MDAxOCwgMHg5MThjLCAweDBmZmYsIDB4YTk3MiwgMHhhYzc2LCAweDI5NTAsIDB4MDBhNiwKKwkweDIwMDEsIDB4MDIwNSwgMHgyMDAzLCAweDAwMDAsIDB4OTAxZSwgMHgyMDI5LCAweDAwMDEsIDB4OTE4MiwKKwkweDAwMzQsIDB4MTIyOCwgMHgyMDExLCAweDAwMWYsIDB4MDgwYywgMHhjNGY4LCAweDA0YzAsIDB4MjEzMCwKKwkweDIwMDksIDB4MDAzNCwgMHgyMDExLCAweDAwMWYsIDB4MDgwYywgMHhjNGY4LCAweDk2YjIsIDB4MDAzNCwKKwkweGIwMDQsIDB4OTA0ZCwgMHgwMTEwLCAweDA4MGMsIDB4MGZmOSwgMHgwODBjLCAweDEwNDcsIDB4MDFkMCwKKwkweDg1MjgsIDB4YTg2NywgMHgwMTEwLCAweGE4NmIsIDB4MDAwMCwgMHgyOTIwLCAweGI0MDYsIDB4OTY4YSwKKwkweDAwM2QsIDB4MTIzMCwgMHgyNjA4LCAweDIwMTEsIDB4MDAxYiwgMHgwODBjLCAweGM0ZjgsIDB4MDBiOCwKKwkweDk2YjIsIDB4MDAzYywgMHgyMDA5LCAweDAwM2MsIDB4Mjk1MCwgMHgyMDExLCAweDAwMWIsIDB4MDgwYywKKwkweGM0ZjgsIDB4MGMxOCwgMHgyMDAxLCAweDAyMDUsIDB4MjAwMywgMHgwMDAwLCAweDAwYWUsIDB4ODUyZiwKKwkweDk1YWQsIDB4MDA1MCwgMHhiNTY2LCAweGIwNzAsIDB4YzBmZCwgMHhiMDcyLCAweDAwNDgsIDB4MjAwMSwKKwkweDAyMDUsIDB4MjAwMywgMHgwMDAwLCAweDAwYWUsIDB4ODUyZiwgMHg5NWFkLCAweDAwNTAsIDB4YjU2NiwKKwkweDJhNDgsIDB4YTgwNCwgMHhhODA3LCAweDAwMDAsIDB4MDAwNiwgMHgwODBjLCAweDZkZWUsIDB4MDAwZSwKKwkweDIwNDgsIDB4OTAwNSwgMHgxZGIwLCAweDAwZmUsIDB4MDBhZSwgMHgwMDllLCAweDAwNmUsIDB4MDA1ZSwKKwkweDAwM2UsIDB4MDAyZSwgMHgwMDA1LCAweDAwZDYsIDB4MDBmNiwgMHgwMDk2LCAweDAwMDYsIDB4MDgwYywKKwkweDEwNDcsIDB4MDAwZSwgMHgwOTBjLCAweDBkN2QsIDB4YTk2MCwgMHgyMWU4LCAweGE5NWMsIDB4OTE4OCwKKwkweDAwMTksIDB4MjFhMCwgMHg5MDBlLCAweDIwYTksIDB4MDAyMCwgMHg0MTA0LCAweGFhNjYsIDB4YTg3YSwKKwkweDIwNzksIDB4MTgwMCwgMHg3OTkwLCAweDgxMGMsIDB4OTE4OCwgMHgwMDBjLCAweDkxODIsIDB4MDAxYSwKKwkweDAyMTAsIDB4MjAwOSwgMHgwMDFhLCAweDIxYTgsIDB4ODEwYiwgMHhhOTcyLCAweGFjNzYsIDB4MmU5OCwKKwkweGE4NWMsIDB4OTA4MCwgMHgwMDFmLCAweDIwYTAsIDB4MjAwMSwgMHgwMjA1LCAweDIwMGMsIDB4OTE4ZCwKKwkweDAwODAsIDB4MjEwMiwgMHg0MDAzLCAweDIwMDMsIDB4MDAwMCwgMHgwODBjLCAweDZkZWUsIDB4MDA5ZSwKKwkweDAwZmUsIDB4MDBkZSwgMHgwMDA1LCAweDAwMTYsIDB4MDBkNiwgMHgwMGY2LCAweDAwOTYsIDB4MDAxNiwKKwkweDIwMDEsIDB4MDIwNSwgMHgyMDBjLCAweDkxOGQsIDB4MDA4MCwgMHgyMTAyLCAweDAwMWUsIDB4MjA3OSwKKwkweDAyMDAsIDB4MmU5OCwgMHhhODdjLCAweGQwZWMsIDB4MDExOCwgMHg5ZTgwLCAweDAwMGMsIDB4MjA5OCwKKwkweDIwMjEsIDB4MDAzZSwgMHg5MDFlLCAweDkyODIsIDB4MDAyMCwgMHgwMjE4LCAweDIwMTEsIDB4MDAyMCwKKwkweDIwMTgsIDB4OTQ4NiwgMHgwMDNlLCAweDExNzAsIDB4MDA5NiwgMHgwODBjLCAweDEwNDcsIDB4MjkwMCwKKwkweDAwOWUsIDB4MDVjMCwgMHhhODA2LCAweDIwNDgsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMDIsIDB4MjBhMCwgMHgzMzAwLCAweDkwOGUsIDB4MDI2MCwgMHgwMTQwLCAweDIwMDksIDB4MDI4MCwKKwkweDkxMDIsIDB4OTIwYSwgMHgwMjE4LCAweDIwMTAsIDB4MjEwMCwgMHg5MzE4LCAweDIyMDAsIDB4OTQwMiwKKwkweDEyMjgsIDB4MjQwMCwgMHg5MjAyLCAweDI0MTAsIDB4OTMxOCwgMHg5MDA2LCAweDIwMjAsIDB4MjJhOCwKKwkweGE4MDAsIDB4OTIwMCwgMHhhODAyLCAweDIwZTEsIDB4MDAwMCwgMHg0MDAzLCAweDgzZmYsIDB4MDE4MCwKKwkweDMzMDAsIDB4OTA4NiwgMHgwMjgwLCAweDExMzAsIDB4NzgxNCwgMHg4MDAwLCAweDkwODUsIDB4MDA4MCwKKwkweDc4MTYsIDB4MmU5OCwgMHgyMzEwLCAweDg0ZmYsIDB4MDkwNCwgMHhiMDI4LCAweDA4MDQsIDB4YjAyYSwKKwkweDkwODUsIDB4MDAwMSwgMHg3ODE3LCAweDAwMDAsIDB4MDA5ZSwgMHgwMGZlLCAweDAwZGUsIDB4MDAxZSwKKwkweDAwMDUsIDB4MDBkNiwgMHgwMDM2LCAweDAwOTYsIDB4NjMxNCwgMHgyMzQ4LCAweGE4N2EsIDB4YTk4MiwKKwkweDA4MGMsIDB4NmRlMiwgMHgwMDllLCAweDAwM2UsIDB4MDBkZSwgMHgwMDA1LCAweDkxYjYsIDB4MDAxNSwKKwkweDExMTgsIDB4MDgwYywgMHhhY2IwLCAweDAwMzAsIDB4OTFiNiwgMHgwMDE2LCAweDE5MGMsIDB4MGQ3ZCwKKwkweDA4MGMsIDB4YWNiMCwgMHgwMDA1LCAweDIwYTksIDB4MDAwZSwgMHgyMGUxLCAweDAwMDAsIDB4MmU5OCwKKwkweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDIwYTAsIDB4MDA5ZSwKKwkweDQwMDMsIDB4MDEzNiwgMHg5MDgwLCAweDAwMWIsIDB4MjBhMCwgMHgyMDExLCAweDAwMDYsIDB4MjBhOSwKKwkweDAwMDEsIDB4MzQxOCwgMHg4MzE4LCAweDIzYTAsIDB4NDAwMywgMHgzMzE4LCAweDgzMTgsIDB4MjM5OCwKKwkweDgyMTEsIDB4MWRiOCwgMHgyMDExLCAweDAwMDYsIDB4MDEzZSwgMHgyMGEwLCAweDMzMTgsIDB4ODMxOCwKKwkweDIzOTgsIDB4NDAwMywgMHgzNDE4LCAweDgzMTgsIDB4MjNhMCwgMHg4MjExLCAweDFkYjgsIDB4MDA5NiwKKwkweDA4MGMsIDB4Yzk3YSwgMHgwMTMwLCAweDYwMTQsIDB4MjA0OCwgMHhhODA3LCAweDAwMDAsIDB4YTg2NywKKwkweDAxMDMsIDB4MDA5ZSwgMHgwODA0LCAweGFjYjAsIDB4MDA5NiwgMHgwMGQ2LCAweDAwMzYsIDB4NzMzMCwKKwkweDkzODYsIDB4MDIwMCwgMHgxMWE4LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4ZDcsIDB4MDAwMCwKKwkweDAwYmUsIDB4NjAxNCwgMHg5MDA1LCAweDAxMzAsIDB4MjA0OCwgMHhhODA3LCAweDAwMDAsIDB4YTg2NywKKwkweDAxMDMsIDB4YWIzMiwgMHgwODBjLCAweGFjYjAsIDB4MDAzZSwgMHgwMGRlLCAweDAwOWUsIDB4MDAwNSwKKwkweDAwMTEsIDB4MWQ0OCwgMHgwY2M4LCAweDAwMDYsIDB4MDAxNiwgMHgwODBjLCAweGQwOWIsIDB4MDE4OCwKKwkweDYwMTQsIDB4OTAwNSwgMHgxMTcwLCAweDYwMGIsIDB4MDAwMywgMHg2MDFiLCAweDAwMDAsIDB4NjA0YiwKKwkweDAwMDAsIDB4MjAwOSwgMHgwMDIyLCAweDA4MGMsIDB4YjRkNSwgMHg5MDA2LCAweDAwMWUsIDB4MDAwZSwKKwkweDAwMDUsIDB4OTA4NSwgMHgwMDAxLCAweDBjZDAsIDB4MDA5NiwgMHgwMDE2LCAweDIwYTksIDB4MDAxNCwKKwkweDllODAsIDB4MDAwYywgMHgyMGUxLCAweDAwMDAsIDB4MjA5OCwgMHg2MDE0LCAweDIwNDgsIDB4YTg2MCwKKwkweDIwZTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMDIsIDB4MjBhMCwgMHg0MDAzLCAweDIwMDEsIDB4MDIwNSwKKwkweDIwMDMsIDB4MDAwMSwgMHgyMDk5LCAweDAyNjAsIDB4MjBhOSwgMHgwMDE2LCAweDQwMDMsIDB4MjBhOSwKKwkweDAwMGEsIDB4YTgwNCwgMHgyMDQ4LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDkwODAsIDB4MDAwMiwKKwkweDIwYTAsIDB4NDAwMywgMHgyMDAxLCAweDAyMDUsIDB4MjAwMywgMHgwMDAyLCAweDIwOTksIDB4MDI2MCwKKwkweDIwYTksIDB4MDAyMCwgMHg0MDAzLCAweDIwMDMsIDB4MDAwMCwgMHg2MDE0LCAweDIwNDgsIDB4YTgwMCwKKwkweDIwNDgsIDB4YTg2NywgMHgwMTAzLCAweDA4MGMsIDB4YWNiMCwgMHgwMDFlLCAweDAwOWUsIDB4MDAwNSwKKwkweDAwOTYsIDB4MDAxNiwgMHg5MDBlLCAweDcwMzAsIDB4OTA4NiwgMHgwMTAwLCAweDAxNDAsIDB4NzAzOCwKKwkweDkwODQsIDB4MDBmZiwgMHg4MDBjLCAweDcwM2MsIDB4OTA4NCwgMHgwMGZmLCAweDgwMDQsIDB4OTA4MCwKKwkweDAwMDQsIDB4OTEwOCwgMHg4MTBiLCAweDIwMTEsIDB4MDAwMiwgMHgyMDE5LCAweDAwMGMsIDB4NjAxNCwKKwkweDIwNDgsIDB4MDgwYywgMHhjNGY4LCAweDA4MGMsIDB4Yzk3YSwgMHgwMTQwLCAweDYwMTQsIDB4MjA0OCwKKwkweGE4MDcsIDB4MDAwMCwgMHhhODY0LCAweGE4ZTIsIDB4YTg2NywgMHgwMTAzLCAweDA4MGMsIDB4YWNiMCwKKwkweDAwMWUsIDB4MDA5ZSwgMHgwMDA1LCAweDAwMTYsIDB4MjAwOSwgMHgwMDAwLCAweDcwMzAsIDB4OTA4NiwKKwkweDAyMDAsIDB4MDExMCwgMHgyMDA5LCAweDAwMDEsIDB4MDA5NiwgMHg2MDE0LCAweDkwNGQsIDB4MDkwYywKKwkweDBkN2QsIDB4YTk3YSwgMHgwODBjLCAweDZkZWUsIDB4MDA5ZSwgMHgwODBjLCAweGFjYjAsIDB4MDAxZSwKKwkweDAwMDUsIDB4MDAxNiwgMHgwMDk2LCAweDcwMzAsIDB4OTA4NiwgMHgwMTAwLCAweDExMTgsIDB4MjAwOSwKKwkweDAwMDQsIDB4MDAxMCwgMHg3MDM0LCAweDgwMGMsIDB4ODEwYiwgMHgyMDExLCAweDAwMGMsIDB4MjAxOSwKKwkweDAwMGMsIDB4NjAxNCwgMHgyMDQ4LCAweGE4MDQsIDB4MDA5NiwgMHg5MDA1LCAweDAxMDgsIDB4MjA0OCwKKwkweDA4MGMsIDB4YzRmOCwgMHgwMDllLCAweDA4MGMsIDB4Yzk3YSwgMHgwMTQ4LCAweGE4MDQsIDB4OTAwNSwKKwkweDExNTgsIDB4YTgwNywgMHgwMDAwLCAweGE4NjQsIDB4YThlMiwgMHhhODY3LCAweDAxMDMsIDB4MDgwYywKKwkweGFjYjAsIDB4MDA5ZSwgMHgwMDFlLCAweDAwMDUsIDB4MDA4NiwgMHgyMDQwLCAweGEwMzAsIDB4ODAwNywKKwkweDkwODYsIDB4MDEwMCwgMHgxMTE4LCAweDA4MGMsIDB4YjY5MywgMHgwMGUwLCAweGEwMzQsIDB4ODAwNywKKwkweDgwMGMsIDB4ODgwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTBiYywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwKKwkweDkwODAsIDB4MDAwYywgMHhhODdiLCAweDAwMDAsIDB4YTg4MywgMHgwMDAwLCAweGE4OTcsIDB4NDAwMCwKKwkweGFhYTAsIDB4YWI5YywgMHhhY2E4LCAweGFkYTQsIDB4MjAzMSwgMHgwMDAwLCAweDIwNDEsIDB4MTI5NiwKKwkweDAwMTksIDB4MGQwOCwgMHgwMDhlLCAweDA4OTgsIDB4MDA5NiwgMHgwMDA2LCAweDA4MGMsIDB4MTA0NywKKwkweDAwMGUsIDB4MDFiMCwgMHhhOGFiLCAweDBkY2IsIDB4YTg3NiwgMHgwMDBlLCAweGE4YTIsIDB4MDAwNiwKKwkweGFlNmEsIDB4MjgwMCwgMHhhODllLCAweGE5N2EsIDB4YWY3MiwgMHhhYThlLCAweGFiOTIsIDB4YWM5NiwKKwkweGFkOWEsIDB4MDA4NiwgMHgyOTQwLCAweDA4MGMsIDB4MTEzYywgMHgwMDhlLCAweDkwODUsIDB4MDAwMSwKKwkweDAwOWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwZDYsIDB4MDAyNiwgMHg3MDA4LCAweDkwODQsIDB4MDBmZiwKKwkweDYyMTAsIDB4MDBiNiwgMHgyMjU4LCAweGJhMTAsIDB4MDBiZSwgMHg5MjA2LCAweDE1MjAsIDB4NzAwYywKKwkweDYyMTAsIDB4MDBiNiwgMHgyMjU4LCAweGJhMTQsIDB4MDBiZSwgMHg5MjA2LCAweDExZTAsIDB4NjA0YiwKKwkweDAwMDAsIDB4MmM2OCwgMHgwMDE2LCAweDIwMDksIDB4MDAzNSwgMHgwODBjLCAweGQwMTMsIDB4MDAxZSwKKwkweDExNTgsIDB4NjIyYywgMHgyMjY4LCAweDIwNzEsIDB4MDI2YywgMHg2YjIwLCAweDkzODYsIDB4MDAwMywKKwkweDAxMzAsIDB4OTM4NiwgMHgwMDA2LCAweDAxMjgsIDB4MDgwYywgMHhhY2IwLCAweDAwMjAsIDB4MDAzOSwKKwkweDAwMTAsIDB4MDgwYywgMHhiMzBhLCAweDAwMmUsIDB4MDBkZSwgMHgwMGVlLCAweDAwMDUsIDB4MDA5NiwKKwkweDY4MTQsIDB4MjA0OCwgMHg5MTg2LCAweDAwMTUsIDB4MDkwNCwgMHhiMmU5LCAweDkxOGUsIDB4MDAxNiwKKwkweDE5MDQsIDB4YjMwOCwgMHg3MDBjLCAweDkwOGMsIDB4ZmYwMCwgMHg5MTg2LCAweDE3MDAsIDB4MDEyMCwKKwkweDkxODYsIDB4MDMwMCwgMHgxOTA0LCAweGIyYzMsIDB4ODlmZiwgMHgxMTM4LCAweDY4MDAsIDB4OTA4NiwKKwkweDAwMGYsIDB4MDkwNCwgMHhiMmE1LCAweDA4MDQsIDB4YjMwNiwgMHg2ODA4LCAweDkwODYsIDB4ZmZmZiwKKwkweDE5MDQsIDB4YjJlYiwgMHhhODdjLCAweDkwODQsIDB4MDA2MCwgMHg5MDg2LCAweDAwMjAsIDB4MTE1MCwKKwkweGE4YWMsIDB4YTkzNCwgMHg5MTA2LCAweDE5MDQsIDB4YjJlYiwgMHhhOGIwLCAweGE5MzgsIDB4OTEwNiwKKwkweDE5MDQsIDB4YjJlYiwgMHg2ODI0LCAweGQwODQsIDB4MTkwNCwgMHhiMmViLCAweGQwYjQsIDB4MDE1OCwKKwkweDAwMTYsIDB4MjAwMSwgMHgxOTg1LCAweDIwMGMsIDB4NjAxOCwgMHg5MTAyLCAweDkwODIsIDB4MDAwNSwKKwkweDAwMWUsIDB4MWEwNCwgMHhiMmViLCAweDA4MGMsIDB4Y2I2YiwgMHg2ODEwLCAweDAwOTYsIDB4MjA0OCwKKwkweGE5YTAsIDB4MDA5ZSwgMHg2ODVjLCAweGE4N2EsIDB4YTk3NiwgMHg2ODY0LCAweGE4ODIsIDB4YTg3YywKKwkweGMwZGMsIDB4YzBmNCwgMHhjMGQ0LCAweGE4N2UsIDB4MDAyNiwgMHg5MDBlLCAweDZhMTgsIDB4MjAwMSwKKwkweDAwMGEsIDB4MDgwYywgMHg5MWY4LCAweGE4ODQsIDB4OTIwYSwgMHgwMjA4LCAweDgwMTEsIDB4YWE4NiwKKwkweDgyZmYsIDB4MDAyZSwgMHgxMTM4LCAweDAwYzYsIDB4MmQ2MCwgMHgwODBjLCAweGM2ODMsIDB4MDBjZSwKKwkweDA4MDQsIDB4YjMwNiwgMHgwMGM2LCAweGE4NjgsIDB4ZDBmYywgMHgxMTE4LCAweDA4MGMsIDB4NjEyNCwKKwkweDAwMTAsIDB4MDgwYywgMHg2NTJmLCAweDAwY2UsIDB4MTkwNCwgMHhiMmViLCAweDAwYzYsIDB4MmQ2MCwKKwkweDA4MGMsIDB4YWNiMCwgMHgwMGNlLCAweDA4MDQsIDB4YjMwNiwgMHgwMGM2LCAweDA4MGMsIDB4YWQyMCwKKwkweDAxOTgsIDB4NjAxNywgMHgwMDAwLCAweDY4MTAsIDB4NjAxMiwgMHgwODBjLCAweGNlMTUsIDB4NjAyMywKKwkweDAwMDMsIDB4NjkwNCwgMHgwMGM2LCAweDJkNjAsIDB4MDgwYywgMHhhY2IwLCAweDAwY2UsIDB4MDgwYywKKwkweGFkNGQsIDB4MDBjZSwgMHgwODA0LCAweGIzMDYsIDB4MjAwMSwgMHgxOTg3LCAweDIwMDQsIDB4Njg0YSwKKwkweDAwY2UsIDB4MDgwNCwgMHhiMzA2LCAweDcwMDgsIDB4OTA4NiwgMHgwMDBiLCAweDExYzgsIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiOTAwLCAweGMxYmMsIDB4YjkwMiwgMHgwMGJlLCAweDAwYzYsIDB4MmQ2MCwKKwkweGE4N2IsIDB4MDAwMywgMHgwODBjLCAweGQwNTUsIDB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwKKwkweDYwMjMsIDB4MDAwMiwgMHgyMDA5LCAweDgwMjAsIDB4MDgwYywgMHg5MmIwLCAweDAwY2UsIDB4MDQzMCwKKwkweDcwMGMsIDB4OTA4NiwgMHgyYTAwLCAweDExMzgsIDB4MjAwMSwgMHgxOTg3LCAweDIwMDQsIDB4Njg0YSwKKwkweDAwZTgsIDB4MDRjMSwgMHgwMGU4LCAweDg5ZmYsIDB4MDkwYywgMHgwZDdkLCAweDAwYzYsIDB4MDBkNiwKKwkweDJkNjAsIDB4YTg2NywgMHgwMTAzLCAweGE4N2IsIDB4MDAwMywgMHgwODBjLCAweDZjMDQsIDB4MDgwYywKKwkweGNiNmIsIDB4MDgwYywgMHhhY2ViLCAweDAwMjYsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YmEzYywKKwkweDA4MGMsIDB4NjdiZSwgMHgwMGJlLCAweDAwMmUsIDB4MDBkZSwgMHgwMGNlLCAweDA4MGMsIDB4YWNiMCwKKwkweDAwOWUsIDB4MDAwNSwgMHg5MTg2LCAweDAwMTUsIDB4MTEyOCwgMHgyMDAxLCAweDE5ODcsIDB4MjAwNCwKKwkweDY4NGEsIDB4MDA2OCwgMHg5MThlLCAweDAwMTYsIDB4MTE2MCwgMHgwMGM2LCAweDJkMDAsIDB4MjA2MCwKKwkweDA4MGMsIDB4ZTZhMCwgMHgwODBjLCAweDg5NGUsIDB4MDgwYywgMHhhY2IwLCAweDAwY2UsIDB4MDgwYywKKwkweGFjYjAsIDB4MDAwNSwgMHgwMDI2LCAweDAwMzYsIDB4MDA0NiwgMHg3MjI4LCAweGFjYjAsIDB4YWJhYywKKwkweGQyZjQsIDB4MDEzMCwgMHgyMDAxLCAweDE5ODcsIDB4MjAwNCwgMHg2ODRhLCAweDA4MDQsIDB4YjM4NCwKKwkweDAwYzYsIDB4MmQ2MCwgMHgwODBjLCAweGM1NTksIDB4MDBjZSwgMHg2ODA0LCAweDkwODYsIDB4MDA1MCwKKwkweDExNjgsIDB4MDBjNiwgMHgyZDAwLCAweDIwNjAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDA1MCwKKwkweDIwMDksIDB4ODAyMywgMHgwODBjLCAweDkyYjAsIDB4MDBjZSwgMHgwNGYwLCAweDY4MDAsIDB4OTA4NiwKKwkweDAwMGYsIDB4MDFhOCwgMHg4OWZmLCAweDA5MGMsIDB4MGQ3ZCwgMHg2ODAwLCAweDkwODYsIDB4MDAwNCwKKwkweDExOTAsIDB4YTg3YywgMHhkMGFjLCAweDAxNzgsIDB4YTg0MywgMHgwZmZmLCAweGE4M2YsIDB4MGZmZiwKKwkweGE4ODAsIDB4YzBmYywgMHhhODgyLCAweDIwMDEsIDB4MDAwMSwgMHg2ODMyLCAweDA0MDAsIDB4MjAwMSwKKwkweDAwMDcsIDB4NjgzMiwgMHgwMGUwLCAweGE4N2MsIDB4ZDBiNCwgMHgxMTUwLCAweGQwYWMsIDB4MGRiOCwKKwkweDY4MjQsIDB4ZDBmNCwgMHgxZDQ4LCAweGE4MzgsIDB4YTkzNCwgMHg5MTA1LCAweDBkODAsIDB4MGMyMCwKKwkweGQyZWMsIDB4MWQ2OCwgMHg3MDI0LCAweDkzMDYsIDB4MTExOCwgMHg3MDIwLCAweDk0MDYsIDB4MGQzOCwKKwkweDcwMjAsIDB4NjgzZSwgMHg3MDI0LCAweDY4M2EsIDB4MjAwMSwgMHgwMDA1LCAweDY4MzIsIDB4MDgwYywKKwkweGNjZmYsIDB4MDgwYywgMHg5NzM4LCAweDAwMTAsIDB4MDgwYywgMHhhY2IwLCAweDAwNGUsIDB4MDAzZSwKKwkweDAwMmUsIDB4MDAwNSwgMHgwMGU2LCAweDAwZDYsIDB4MDAyNiwgMHg3MDA4LCAweDkwODQsIDB4MDBmZiwKKwkweDYyMTAsIDB4MDBiNiwgMHgyMjU4LCAweGJhMTAsIDB4MDBiZSwgMHg5MjA2LCAweDE5MDQsIDB4YjNlZiwKKwkweDcwMGMsIDB4NjIxMCwgMHgwMGI2LCAweDIyNTgsIDB4YmExNCwgMHgwMGJlLCAweDkyMDYsIDB4MTkwNCwKKwkweGIzZWYsIDB4NjAzOCwgMHgyMDY4LCAweDY4MjQsIDB4YzBkYywgMHg2ODI2LCAweDZhMjAsIDB4OTI4NiwKKwkweDAwMDcsIDB4MDkwNCwgMHhiM2VmLCAweDkyODYsIDB4MDAwMiwgMHgwOTA0LCAweGIzZWYsIDB4OTI4NiwKKwkweDAwMDAsIDB4MDVlOCwgMHg2ODA4LCAweDYzM2MsIDB4OTMwNiwgMHgxNWM4LCAweDIwNzEsIDB4MDI2YywKKwkweDkxODYsIDB4MDAxNSwgMHgwNTcwLCAweDkxOGUsIDB4MDAxNiwgMHgxMTAwLCAweDAwYzYsIDB4NjAzOCwKKwkweDIwNjAsIDB4NjEwNCwgMHg5MTg2LCAweDAwNGIsIDB4MDFjMCwgMHg5MTg2LCAweDAwNGMsIDB4MDFhOCwKKwkweDkxODYsIDB4MDA0ZCwgMHgwMTkwLCAweDkxODYsIDB4MDA0ZSwgMHgwMTc4LCAweDkxODYsIDB4MDA1MiwKKwkweDAxNjAsIDB4NjAxNCwgMHgwMDk2LCAweDIwNDgsIDB4MDgwYywgMHhjOTdhLCAweDA5MGMsIDB4MGQ3ZCwKKwkweGE4N2IsIDB4MDAwMywgMHgwMDllLCAweDA4MGMsIDB4ZDA1NSwgMHg2MDA3LCAweDAwODUsIDB4NjAwMywKKwkweDAwMGIsIDB4NjAyMywgMHgwMDAyLCAweDIwMDksIDB4ODAyMCwgMHgwODBjLCAweDkyYjAsIDB4MDBjZSwKKwkweDAwMzAsIDB4NjAzOCwgMHgyMDcwLCAweDIwMDEsIDB4MTk4NywgMHgyMDA0LCAweDcwNGEsIDB4MDgwYywKKwkweGFjYjAsIDB4MDAyZSwgMHgwMGRlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGI2LCAweDAwOTYsIDB4MDBmNiwKKwkweDYwMTQsIDB4MjA0OCwgMHg2MDEwLCAweDIwNTgsIDB4OTFiNiwgMHgwMDE1LCAweDAxMzAsIDB4YmEwOCwKKwkweGJiMGMsIDB4YmMwMCwgMHhjNDhjLCAweGJjMDIsIDB4MDQ2MCwgMHgwMDk2LCAweDAxNTYsIDB4MDAzNiwKKwkweDAwMjYsIDB4MmI0OCwgMHg5ZTkwLCAweDAwMTAsIDB4MjAxOSwgMHgwMDBhLCAweDIwYTksIDB4MDAwNCwKKwkweDA4MGMsIDB4YmNhMiwgMHgwMDJlLCAweDAwM2UsIDB4MDE1ZSwgMHgwMDllLCAweDE5MDQsIDB4YjQ1ZSwKKwkweDAwOTYsIDB4MDE1NiwgMHgwMDM2LCAweDAwMjYsIDB4MmI0OCwgMHg5ZTkwLCAweDAwMTQsIDB4MjAxOSwKKwkweDAwMDYsIDB4MjBhOSwgMHgwMDA0LCAweDA4MGMsIDB4YmNhMiwgMHgwMDJlLCAweDAwM2UsIDB4MDE1ZSwKKwkweDAwOWUsIDB4MTVhMCwgMHg3MjM4LCAweGJhMGEsIDB4NzMzYywgMHhiYjBlLCAweGJjMDAsIDB4YzQ4ZCwKKwkweGJjMDIsIDB4YTgwNCwgMHg5MDA1LCAweDExMjgsIDB4MDBmZSwgMHgwMDllLCAweDAwYmUsIDB4MDgwNCwKKwkweGIwYmYsIDB4MDA5NiwgMHgyMDQ4LCAweGFhMTIsIDB4YWIxNiwgMHhhYzBhLCAweDAwOWUsIDB4ODAwNiwKKwkweDgwMDYsIDB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwgMHhmZmMwLCAweDkwODAsIDB4MDAwMiwKKwkweDIwMDksIDB4MDAyYiwgMHhhYWEwLCAweGFiOWMsIDB4YWNhOCwgMHhhZGE0LCAweDIwMzEsIDB4MDAwMCwKKwkweDIwNDEsIDB4MTI5NiwgMHgwODBjLCAweGIxZDQsIDB4MDEzMCwgMHgwMGZlLCAweDAwOWUsIDB4MDgwYywKKwkweGFjYjAsIDB4MDBiZSwgMHgwMDA1LCAweDA4MGMsIDB4YjY5MywgMHgwY2I4LCAweDJiNzgsIDB4MDBmNiwKKwkweDA4MGMsIDB4MzI0MCwgMHgwODBjLCAweGQwYjAsIDB4MDBmZSwgMHgwMGM2LCAweDA4MGMsIDB4YWM1YSwKKwkweDJmMDAsIDB4NjAxMiwgMHg2MDE3LCAweDAwMDAsIDB4NjAyMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwKKwkweDYwMDMsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg2NWUzLCAweDA4MGMsIDB4NjYwZiwKKwkweDA4MGMsIDB4OTJiNywgMHgwODBjLCAweDk3MzgsIDB4MDBjZSwgMHgwODA0LCAweGI0MzEsIDB4MjEwMCwKKwkweDkxYjIsIDB4MDA1MywgMHgxYTBjLCAweDBkN2QsIDB4OTFiMiwgMHgwMDQwLCAweDFhMDQsIDB4YjRlNywKKwkweDAwMDIsIDB4YjRkNSwgMHhiNGQ1LCAweGI0Y2IsIDB4YjRkNSwgMHhiNGQ1LCAweGI0ZDUsIDB4YjRjOSwKKwkweGI0YzksIDB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwKKwkweGI0YzksIDB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwKKwkweGI0YzksIDB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwKKwkweGI0ZDUsIDB4YjRjOSwgMHhiNGQ1LCAweGI0ZDUsIDB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwKKwkweGI0YzksIDB4YjRjYiwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwKKwkweGI0YzksIDB4YjRjOSwgMHhiNGM5LCAweGI0ZDUsIDB4YjRkNSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwKKwkweGI0YzksIDB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwgMHhiNGM5LCAweGI0ZDUsIDB4YjRjOSwKKwkweGI0YzksIDB4MDgwYywgMHgwZDdkLCAweDAwNjYsIDB4MDBiNiwgMHg2NjEwLCAweDI2NTgsIDB4YjhkNCwKKwkweGMwOGMsIDB4YjhkNiwgMHgwMGJlLCAweDAwNmUsIDB4MDAwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwKKwkweDkxODYsIDB4MDAzMiwgMHgwMTE4LCAweDA4MGMsIDB4OTJiNywgMHgwMDEwLCAweDA4MGMsIDB4OTJiMCwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4OTczOCwgMHgwMTJlLCAweDAwMDUsIDB4MjYwMCwKKwkweDAwMDIsIDB4YjRkNSwgMHhiNGQ1LCAweGI0ZmIsIDB4YjRkNSwgMHhiNGQ1LCAweGI0ZmIsIDB4YjRmYiwKKwkweGI0ZmIsIDB4YjRmYiwgMHhiNGQ1LCAweGI0ZmIsIDB4YjRkNSwgMHhiNGZiLCAweGI0ZDUsIDB4YjRmYiwKKwkweGI0ZmIsIDB4YjRmYiwgMHhiNGZiLCAweDA4MGMsIDB4MGQ3ZCwgMHg2MDA0LCAweDkwYjIsIDB4MDA1MywKKwkweDFhMGMsIDB4MGQ3ZCwgMHg5MWI2LCAweDAwMTMsIDB4MDkwNCwgMHhiNWQyLCAweDkxYjYsIDB4MDAyNywKKwkweDE5MDQsIDB4YjU3ZSwgMHgwODBjLCAweDk2N2EsIDB4NjAwNCwgMHgwODBjLCAweGNiODAsIDB4MDFiMCwKKwkweDA4MGMsIDB4Y2I5MSwgMHgwMWE4LCAweDkwOGUsIDB4MDAyMSwgMHgwOTA0LCAweGI1N2IsIDB4OTA4ZSwKKwkweDAwMjIsIDB4MTEzMCwgMHgwODBjLCAweGIwZWIsIDB4MDkwNCwgMHhiNTc3LCAweDA4MDQsIDB4YjU3OCwKKwkweDkwOGUsIDB4MDAzZCwgMHgwOTA0LCAweGI1N2IsIDB4MDgwNCwgMHhiNTcxLCAweDA4MGMsIDB4MzI2ZiwKKwkweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDY1ZTMsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjlhMCwKKwkweDAwYmUsIDB4MDgwYywgMHhiNjkzLCAweDkxODYsIDB4MDA3ZSwgMHgxMTQ4LCAweDIwMDEsIDB4MTgzNywKKwkweDIwMTQsIDB4YzI4NSwgMHgwODBjLCAweDc1M2QsIDB4MTEwOCwgMHhjMmFkLCAweDIyMDIsIDB4MDgwYywKKwkweGE5MWUsIDB4MDAzNiwgMHgwMDI2LCAweDIwMTksIDB4MDAyOCwgMHgyMTEwLCAweDA4MGMsIDB4ZTdhYywKKwkweDAwMmUsIDB4MDAzZSwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgyMTEwLCAweDIwMTksIDB4MDAyOCwKKwkweDA4MGMsIDB4OTQzZCwgMHgwMDc2LCAweDkwM2UsIDB4MDgwYywgMHg5MzA2LCAweDYwMTAsIDB4MDBiNiwKKwkweDkwNWQsIDB4MDEwMCwgMHgwMGJlLCAweDJjMDgsIDB4MDgwYywgMHhlMTY3LCAweDAwN2UsIDB4MDAzZSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwODBjLCAweGE5M2EsIDB4MDgwYywgMHhkMGIwLCAweDAwMTYsIDB4MDgwYywKKwkweGNlMGQsIDB4MDgwYywgMHhhY2IwLCAweDAwMWUsIDB4MDgwYywgMHgzMzQ5LCAweDA4MGMsIDB4OTczOCwKKwkweDAwMzAsIDB4MDgwYywgMHhjZTBkLCAweDA4MGMsIDB4YWNiMCwgMHgwODBjLCAweDk3MzgsIDB4MDAwNSwKKwkweDA4MGMsIDB4YjY5MywgMHgwY2IwLCAweDA4MGMsIDB4YjZjZiwgMHgwYzk4LCAweDkxODYsIDB4MDAxNSwKKwkweDAxMTgsIDB4OTE4NiwgMHgwMDE2LCAweDExNDAsIDB4MDgwYywgMHhhYjMzLCAweDBkODAsIDB4OTA4NiwKKwkweDAwMDIsIDB4MDkwNCwgMHhiNmRhLCAweDBjNTgsIDB4OTE4NiwgMHgwMDE0LCAweDFkNDAsIDB4MDgwYywKKwkweDk2N2EsIDB4NjAwNCwgMHg5MDhlLCAweDAwMjIsIDB4MTExOCwgMHgwODBjLCAweGIwZWIsIDB4MDlmOCwKKwkweDA4MGMsIDB4MzI0MCwgMHgwODBjLCAweGQwYjAsIDB4MDgwYywgMHhjYjgwLCAweDExOTAsIDB4MDgwYywKKwkweDMyNmYsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjlhMCwgMHgwMGJlLCAweDA4MGMsIDB4YjY5MywKKwkweDkxODYsIDB4MDA3ZSwgMHgxMTI4LCAweDIwMDEsIDB4MTgzNywgMHgyMDBjLCAweGMxODUsIDB4MjEwMiwKKwkweDA4MDAsIDB4MDgwYywgMHhjYjkxLCAweDExMjAsIDB4MDgwYywgMHhiNjkzLCAweDA4MDQsIDB4YjU3MSwKKwkweDYwMDQsIDB4OTA4ZSwgMHgwMDMyLCAweDExNjAsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzEsIDB4MTg5ZSwKKwkweDIwNzksIDB4MDAwMCwgMHgwODBjLCAweDM1ZWEsIDB4MDBmZSwgMHgwMGVlLCAweDA4MDQsIDB4YjU3MSwKKwkweDYwMDQsIDB4OTA4ZSwgMHgwMDIxLCAweDBkNDAsIDB4OTA4ZSwgMHgwMDIyLCAweDA5MGMsIDB4YjY5MywKKwkweDA4MDQsIDB4YjU3MSwgMHg5MGIyLCAweDAwNDAsIDB4MWEwNCwgMHhiNjczLCAweDIwMDgsIDB4MDAwMiwKKwkweGI2MWEsIDB4YjYxYiwgMHhiNjFlLCAweGI2MjEsIDB4YjYyNCwgMHhiNjI3LCAweGI2MTgsIDB4YjYxOCwKKwkweGI2MTgsIDB4YjYxOCwgMHhiNjE4LCAweGI2MTgsIDB4YjYxOCwgMHhiNjE4LCAweGI2MTgsIDB4YjYxOCwKKwkweGI2MTgsIDB4YjYxOCwgMHhiNjE4LCAweGI2MTgsIDB4YjYxOCwgMHhiNjE4LCAweGI2MTgsIDB4YjYxOCwKKwkweGI2MTgsIDB4YjYxOCwgMHhiNjE4LCAweGI2MTgsIDB4YjYxOCwgMHhiNjE4LCAweGI2MmEsIDB4YjYzNSwKKwkweGI2MTgsIDB4YjYzNiwgMHhiNjM1LCAweGI2MTgsIDB4YjYxOCwgMHhiNjE4LCAweGI2MTgsIDB4YjYxOCwKKwkweGI2MzUsIDB4YjYzNSwgMHhiNjE4LCAweGI2MTgsIDB4YjYxOCwgMHhiNjE4LCAweGI2MTgsIDB4YjYxOCwKKwkweGI2MTgsIDB4YjYxOCwgMHhiNjVlLCAweGI2MzUsIDB4YjYxOCwgMHhiNjMxLCAweGI2MTgsIDB4YjYxOCwKKwkweGI2MTgsIDB4YjYzMiwgMHhiNjE4LCAweGI2MTgsIDB4YjYxOCwgMHhiNjM1LCAweGI2NTksIDB4YjYxOCwKKwkweDA4MGMsIDB4MGQ3ZCwgMHgwMGQwLCAweDIwMDEsIDB4MDAwYiwgMHgwMGY4LCAweDIwMDEsIDB4MDAwMywKKwkweDAwZTAsIDB4MjAwMSwgMHgwMDA1LCAweDAwYzgsIDB4MjAwMSwgMHgwMDAxLCAweDAwYjAsIDB4MjAwMSwKKwkweDAwMDksIDB4MDA5OCwgMHg2MDAzLCAweDAwMDUsIDB4MDgwYywgMHhkMGIzLCAweDA4MGMsIDB4OTczOCwKKwkweDAwNTgsIDB4MDAxOCwgMHgwMDEwLCAweDA4MGMsIDB4NjVlMywgMHgwNGI4LCAweDA4MGMsIDB4ZDBiMywKKwkweDYwMDMsIDB4MDAwNCwgMHgwODBjLCAweDk3MzgsIDB4MDAwNSwgMHgwODBjLCAweDY1ZTMsIDB4NjAwMywKKwkweDAwMDIsIDB4MDAzNiwgMHgyMDE5LCAweDE4NTIsIDB4MjMwNCwgMHg5MDg0LCAweGZmMDAsIDB4MTEyMCwKKwkweDIwMDEsIDB4MTk4NSwgMHgyMDFjLCAweDAwNDAsIDB4ODAwNywgMHg5MDlhLCAweDAwMDQsIDB4MGVjMCwKKwkweDgwMDMsIDB4ODAxYiwgMHg4MzFiLCAweDkzMTgsIDB4NjMxYSwgMHgwMDNlLCAweDA4MGMsIDB4OTczOCwKKwkweDBjMTgsIDB4MDgwYywgMHhjZTBkLCAweDA4MGMsIDB4YWNiMCwgMHgwOGYwLCAweDAwZTYsIDB4MDBmNiwKKwkweDIwNzEsIDB4MTg5ZSwgMHgyMDc5LCAweDAwMDAsIDB4MDgwYywgMHgzNWVhLCAweDAwZmUsIDB4MDBlZSwKKwkweDA4MGMsIDB4OTY3YSwgMHgwODBjLCAweGFjYjAsIDB4MDg3OCwgMHg2MDAzLCAweDAwMDIsIDB4MDgwYywKKwkweGQwYjMsIDB4MDgwNCwgMHg5NzM4LCAweDI2MDAsIDB4MjAwOCwgMHgwMDAyLCAweGI2OGEsIDB4YjY2ZCwKKwkweGI2ODgsIDB4YjY2ZCwgMHhiNjZkLCAweGI2ODgsIDB4YjY4OCwgMHhiNjg4LCAweGI2ODgsIDB4YjY2ZCwKKwkweGI2ODgsIDB4YjY2ZCwgMHhiNjg4LCAweGI2NmQsIDB4YjY4OCwgMHhiNjg4LCAweGI2ODgsIDB4YjY4OCwKKwkweDA4MGMsIDB4MGQ3ZCwgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweDZkZWUsIDB4MDA5ZSwKKwkweDA4MGMsIDB4YWNiMCwgMHgwMDA1LCAweDAwZTYsIDB4MDA5NiwgMHgwMDI2LCAweDAwMTYsIDB4MDgwYywKKwkweGM5N2EsIDB4MDU2OCwgMHg2MDE0LCAweDIwNDgsIDB4YTg2NCwgMHg5MDg2LCAweDAxMzksIDB4MTFhOCwKKwkweGE4OTQsIDB4OTA4NiwgMHgwMDU2LCAweDExNDgsIDB4MDgwYywgMHg1NGNhLCAweDAxMzAsIDB4MjAwMSwKKwkweDAwMDAsIDB4OTAwZSwgMHgyMDExLCAweDQwMDAsIDB4MDAyOCwgMHgyMDAxLCAweDAwMzAsIDB4OTAwZSwKKwkweDIwMTEsIDB4NDAwNSwgMHgwODBjLCAweGNmN2EsIDB4MDA5MCwgMHhhODY4LCAweGQwZmMsIDB4MDE3OCwKKwkweGE4MDcsIDB4MDAwMCwgMHgwMDE2LCAweDYwMDQsIDB4OTA4ZSwgMHgwMDIxLCAweDAxNjgsIDB4OTA4ZSwKKwkweDAwM2QsIDB4MDE1MCwgMHgwMDFlLCAweGE4NjcsIDB4MDEwMywgMHhhODMzLCAweDAxMDAsIDB4MDAxZSwKKwkweDAwMmUsIDB4MDA5ZSwgMHgwMGVlLCAweDAwMDUsIDB4MDAxZSwgMHgwMDA5LCAweDBjYzAsIDB4MDA5NiwKKwkweDYwMTQsIDB4MjA0OCwgMHhhODAwLCAweDIwNDgsIDB4YTg2NywgMHgwMTAzLCAweGE4MjMsIDB4ODAwMSwKKwkweDAwOWUsIDB4MDAwNSwgMHgwMGI2LCAweDY2MTAsIDB4MjY1OCwgMHhiODA0LCAweDkwODQsIDB4MDBmZiwKKwkweDkwYjIsIDB4MDAwYywgMHgxYTBjLCAweDBkN2QsIDB4NjYwNCwgMHg5NmI2LCAweDAwNGQsIDB4MTEyMCwKKwkweDA4MGMsIDB4Y2U5OSwgMHgwODA0LCAweGI3NWYsIDB4NjYwNCwgMHg5NmI2LCAweDAwNDMsIDB4MTEyMCwKKwkweDA4MGMsIDB4Y2VlMiwgMHgwODA0LCAweGI3NWYsIDB4NjYwNCwgMHg5NmI2LCAweDAwNGIsIDB4MTEyMCwKKwkweDA4MGMsIDB4Y2YwZSwgMHgwODA0LCAweGI3NWYsIDB4NjYwNCwgMHg5NmI2LCAweDAwMzMsIDB4MTEyMCwKKwkweDA4MGMsIDB4Y2UyZiwgMHgwODA0LCAweGI3NWYsIDB4NjYwNCwgMHg5NmI2LCAweDAwMjgsIDB4MTEyMCwKKwkweDA4MGMsIDB4Y2JjZiwgMHgwODA0LCAweGI3NWYsIDB4NjYwNCwgMHg5NmI2LCAweDAwMjksIDB4MTEyMCwKKwkweDA4MGMsIDB4Y2MxMCwgMHgwODA0LCAweGI3NWYsIDB4NjYwNCwgMHg5NmI2LCAweDAwMWYsIDB4MTEyMCwKKwkweDA4MGMsIDB4YjA5MywgMHgwODA0LCAweGI3NWYsIDB4NjYwNCwgMHg5NmI2LCAweDAwMDAsIDB4MTExOCwKKwkweDA4MGMsIDB4YjNmNSwgMHgwNGUwLCAweDY2MDQsIDB4OTZiNiwgMHgwMDIyLCAweDExMTgsIDB4MDgwYywKKwkweGIwY2MsIDB4MDRhOCwgMHg2NjA0LCAweDk2YjYsIDB4MDAzNSwgMHgxMTE4LCAweDA4MGMsIDB4YjFmMiwKKwkweDA0NzAsIDB4NjYwNCwgMHg5NmI2LCAweDAwMzksIDB4MTExOCwgMHgwODBjLCAweGIzOGEsIDB4MDQzOCwKKwkweDY2MDQsIDB4OTZiNiwgMHgwMDNkLCAweDExMTgsIDB4MDgwYywgMHhiMTA0LCAweDA0MDAsIDB4NjYwNCwKKwkweDk2YjYsIDB4MDA0NCwgMHgxMTE4LCAweDA4MGMsIDB4YjE0MCwgMHgwMGM4LCAweDY2MDQsIDB4OTZiNiwKKwkweDAwNDksIDB4MTExOCwgMHgwODBjLCAweGIxODEsIDB4MDA5MCwgMHg2NjA0LCAweDk2YjYsIDB4MDA0MSwKKwkweDExMTgsIDB4MDgwYywgMHhiMTZiLCAweDAwNTgsIDB4OTFiNiwgMHgwMDE1LCAweDExMTAsIDB4MDA2MywKKwkweDAwMzAsIDB4OTFiNiwgMHgwMDE2LCAweDExMjgsIDB4MDBiZSwgMHgwODA0LCAweGI5YmIsIDB4MDBiZSwKKwkweDAwMDUsIDB4MDgwYywgMHhhZDZhLCAweDBjZDgsIDB4Yjc3YywgMHhiNzdmLCAweGI3N2MsIDB4YjdjNiwKKwkweGI3N2MsIDB4YjkyZiwgMHhiOWM4LCAweGI3N2MsIDB4Yjc3YywgMHhiOTkxLCAweGI3N2MsIDB4YjlhNywKKwkweDAwOTYsIDB4NjAxZiwgMHgwMDAwLCAweDYwMTQsIDB4MjA0OCwgMHhhODAwLCAweDIwNDgsIDB4YTg2NywKKwkweDAxMDMsIDB4MDA5ZSwgMHgwODA0LCAweGFjYjAsIDB4YTAwMSwgMHhhMDAxLCAweDAwMDUsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTgwMCwgMHg3MDkwLCAweDkwODYsIDB4MDA3NCwgMHgxNTQwLCAweDA4MGMsIDB4ZTEzOCwKKwkweDExYjAsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4NzAzMCwgMHhkMDhjLCAweDAxMjgsIDB4YjgwMCwKKwkweGQwYmMsIDB4MDExMCwgMHhjMGM1LCAweGI4MDIsIDB4MDBmOSwgMHgwMGJlLCAweDIwMDEsIDB4MDAwNiwKKwkweDA4MGMsIDB4NjVlMywgMHgwODBjLCAweDMyNmYsIDB4MDgwYywgMHhhY2IwLCAweDAwOTgsIDB4MjAwMSwKKwkweDAwMGEsIDB4MDgwYywgMHg2NWUzLCAweDA4MGMsIDB4MzI2ZiwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywKKwkweDAwMDEsIDB4MDgwYywgMHg5MmI3LCAweDA4MGMsIDB4OTczOCwgMHgwMDIwLCAweDIwMDEsIDB4MDAwMSwKKwkweDA4MGMsIDB4YjhmZiwgMHgwMGVlLCAweDAwMDUsIDB4MDBkNiwgMHhiODAwLCAweGQwODQsIDB4MDE2MCwKKwkweDkwMDYsIDB4MDgwYywgMHg2NWNmLCAweDIwNjksIDB4MTg0NywgMHg2ODA0LCAweGQwYTQsIDB4MDEyMCwKKwkweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDY2MGYsIDB4MDBkZSwgMHgwMDA1LCAweDAwYjYsIDB4MDA5NiwKKwkweDAwZDYsIDB4MjAxMSwgMHgxODI0LCAweDIyMDQsIDB4OTA4NiwgMHgwMDc0LCAweDE5MDQsIDB4YjhkNCwKKwkweDYwMTAsIDB4MjA1OCwgMHhiYWEwLCAweDkyODYsIDB4MDA3ZSwgMHgxMTIwLCAweDA4MGMsIDB4YmIxNSwKKwkweDA4MDQsIDB4YjgzOCwgMHgwODBjLCAweGJiMGEsIDB4NjAxMCwgMHgyMDU4LCAweGJhYTAsIDB4OTI4NiwKKwkweDAwODAsIDB4MTUxMCwgMHg2MDE0LCAweDkwMDUsIDB4MDFhOCwgMHgyMDQ4LCAweGE4NjQsIDB4OTA4NCwKKwkweDAwZmYsIDB4OTA4NiwgMHgwMDM5LCAweDExNDAsIDB4MjAwMSwgMHgwMDAwLCAweDkwMGUsIDB4MjAxMSwKKwkweDQwMDAsIDB4MDgwYywgMHhjZjdhLCAweDAwMzAsIDB4YTgwNywgMHgwMDAwLCAweGE4NjcsIDB4MDEwMywKKwkweGE4MzMsIDB4MDIwMCwgMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg2NWUzLCAweDA4MGMsIDB4MzI2ZiwKKwkweDA4MGMsIDB4YWNiMCwgMHgwODA0LCAweGI4ZDksIDB4MDgwYywgMHhiOGU3LCAweDYwMTQsIDB4OTAwNSwKKwkweDAxOTAsIDB4MjA0OCwgMHhhODY4LCAweGQwZjQsIDB4MDFlOCwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwKKwkweDkwODYsIDB4MDAzOSwgMHgxZDA4LCAweDIwMDEsIDB4MDAwMCwgMHg5MDBlLCAweDIwMTEsIDB4NDAwMCwKKwkweDA4MGMsIDB4Y2Y3YSwgMHgwOGY4LCAweDA4MGMsIDB4YjhkZCwgMHgwMTYwLCAweDkwMDYsIDB4MDgwYywKKwkweDY1Y2YsIDB4MjAwMSwgMHgwMDA0LCAweDA4MGMsIDB4NjYwZiwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywKKwkweDY1ZTMsIDB4MDhhMCwgMHgyMDAxLCAweDAwMDQsIDB4MDgwYywgMHg2NWUzLCAweDYwMDMsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDAwMywgMHgwODBjLCAweDkyYjcsIDB4MDgwYywgMHg5NzM4LCAweDA4MDQsIDB4YjhkOSwKKwkweGI4NWMsIDB4ZDBlNCwgMHgwMWQ4LCAweDA4MGMsIDB4Y2RhNywgMHgwODBjLCAweDc1M2QsIDB4MDExOCwKKwkweGQwZGMsIDB4MTkwNCwgMHhiN2ZhLCAweDIwMTEsIDB4MTgzNywgMHgyMjA0LCAweGMwYWQsIDB4MjAxMiwKKwkweDIwMDEsIDB4MTk2YywgMHgyMDA0LCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDc4ZTMsIDB4MDAwMCwKKwkweDA4MGMsIDB4MjZkNSwgMHg3OGUyLCAweDAwZmUsIDB4MDgwNCwgMHhiN2ZhLCAweDA4MGMsIDB4Y2RlOCwKKwkweDIwMTEsIDB4MTgzNywgMHgyMjA0LCAweGMwYTUsIDB4MjAxMiwgMHgwMDA2LCAweDA4MGMsIDB4ZTJjOCwKKwkweDAwMGUsIDB4MTkwNCwgMHhiN2ZhLCAweGMwYjUsIDB4MjAxMiwgMHgyMDAxLCAweDAwMDYsIDB4MDgwYywKKwkweDY1ZTMsIDB4OTAwNiwgMHgwODBjLCAweDY1Y2YsIDB4MDBjNiwgMHgyMDAxLCAweDE4MGYsIDB4MjAwNCwKKwkweGQwOWMsIDB4MDUyMCwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwKKwkweDcwMGMsIDB4OTA4NCwgMHgwMGZmLCAweDc4ZTYsIDB4NzA3ZSwgMHg3MDEwLCAweDc4ZWEsIDB4NzA4MiwKKwkweDkwOGMsIDB4MDBmZiwgMHgwMGVlLCAweDc4MGMsIDB4YzBiNSwgMHg3ODBlLCAweDAwZmUsIDB4MDgwYywKKwkweDI2YWEsIDB4MDBmNiwgMHgyMTAwLCAweDkwMGUsIDB4MDgwYywgMHgyNjYxLCAweDc5NWUsIDB4MDBmZSwKKwkweDkxODYsIDB4MDA4MSwgMHgwMWQ4LCAweDIwMDksIDB4MDA4MSwgMHgwMGM4LCAweDIwMDksIDB4MDBlZiwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDc5ZWEsIDB4NzkzMiwgMHg3OTM2LCAweDc4MGMsIDB4YzBiNSwKKwkweDc4MGUsIDB4MDBmZSwgMHgwODBjLCAweDI2YWEsIDB4MDBmNiwgMHgyMDc5LCAweDE4MDAsIDB4Nzk4MiwKKwkweDIxMDAsIDB4OTAwZSwgMHgwODBjLCAweDI2NjEsIDB4Nzk1ZSwgMHgwMGZlLCAweDgxMDgsIDB4MDgwYywKKwkweDY2MzIsIDB4MmIwMCwgMHgwMGNlLCAweDE5MDQsIDB4YjdmYSwgMHg2MDEyLCAweDIwMDksIDB4MTgwZiwKKwkweDIxMGMsIDB4ZDE5YywgMHgwMTUwLCAweDIwMDksIDB4MDI3YywgMHgyMTBjLCAweDkxOGMsIDB4MDBmZiwKKwkweGI5MTIsIDB4MjAwOSwgMHgwMjdkLCAweDIxMGMsIDB4YjkxNiwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywKKwkweDY1ZTMsIDB4NjAyMywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDIsIDB4MDgwYywKKwkweDkyYjcsIDB4MDgwYywgMHg5NzM4LCAweDAwMjgsIDB4MDgwYywgMHhiNjkzLCAweDIwMDEsIDB4MDAwMSwKKwkweDA0MzEsIDB4MDBkZSwgMHgwMDllLCAweDAwYmUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MTAsIDB4MjAwNCwKKwkweGQwYTQsIDB4MDEyMCwgMHgyMDAxLCAweDE4NDgsIDB4MjAwNCwgMHhkMGFjLCAweDAwMDUsIDB4MDBlNiwKKwkweDA4MGMsIDB4ZTgwNSwgMHgwMTkwLCAweDIwNzEsIDB4MDI2MCwgMHg3MTA4LCAweDcyMGMsIDB4OTE4YywKKwkweDAwZmYsIDB4MTExOCwgMHg5Mjg0LCAweGZmMDAsIDB4MDE0MCwgMHg2MDEwLCAweDIwNTgsIDB4YjhhMCwKKwkweDkwODQsIDB4ZmY4MCwgMHgxMTEwLCAweGI5MTIsIDB4YmExNiwgMHgwMGVlLCAweDAwMDUsIDB4MjAzMCwKKwkweDkwMDUsIDB4MDE1OCwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg2NWUzLCAweDA4MGMsIDB4NTc1MiwKKwkweDExMjAsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NjYwZiwgMHgyNjAwLCAweDkwMDUsIDB4MTFiMCwKKwkweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4NjgsIDB4MDA5ZSwgMHhkMGZjLCAweDExNzgsIDB4MDAzNiwKKwkweDAwNDYsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YmJhMCwgMHgwMGJlLCAweDIwMjEsIDB4MDAwNCwKKwkweDIwMTEsIDB4ODAxNCwgMHgwODBjLCAweDRiNTIsIDB4MDA0ZSwgMHgwMDNlLCAweDA4MGMsIDB4MzI2ZiwKKwkweDYwMjAsIDB4OTA4NiwgMHgwMDBhLCAweDExMDgsIDB4MDAwNSwgMHgwODA0LCAweGFjYjAsIDB4MDBiNiwKKwkweDAwZTYsIDB4MDAyNiwgMHgwMDE2LCAweDIwNzEsIDB4MTgwMCwgMHg3MDkwLCAweDkwODYsIDB4MDAxNCwKKwkweDE5MDQsIDB4Yjk4NywgMHgwODBjLCAweDU3NTIsIDB4MTE3MCwgMHg2MDE0LCAweDkwMDUsIDB4MTE1OCwKKwkweDAwMzYsIDB4MDA0NiwgMHg2MDEwLCAweDIwNTgsIDB4YmJhMCwgMHgyMDIxLCAweDAwMDYsIDB4MDgwYywKKwkweDRkMDksIDB4MDA0ZSwgMHgwMDNlLCAweDAwZDYsIDB4NjAxMCwgMHgyMDU4LCAweDA4MGMsIDB4NjcyZSwKKwkweDA4MGMsIDB4YjdiNCwgMHgwMGRlLCAweDA4MGMsIDB4YmJkYiwgMHgxNTg4LCAweDYwMTAsIDB4MjA1OCwKKwkweGI4OTAsIDB4OTAwNSwgMHgwNTYwLCAweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDY1ZTMsIDB4MDA5NiwKKwkweDYwMTQsIDB4OTA0ZCwgMHgwMWQwLCAweGE4NjQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAzOSwKKwkweDExNDAsIDB4MjAwMSwgMHgwMDAwLCAweDkwMGUsIDB4MjAxMSwgMHg0MDAwLCAweDA4MGMsIDB4Y2Y3YSwKKwkweDAwNjAsIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDI5LCAweDAxMzAsIDB4YTgwNywKKwkweDAwMDAsIDB4YTg2NywgMHgwMTAzLCAweGE4MzMsIDB4MDIwMCwgMHgwMDllLCAweDA4MGMsIDB4MzI2ZiwKKwkweDYwMjAsIDB4OTA4NiwgMHgwMDBhLCAweDAxNDAsIDB4MDgwYywgMHhhY2IwLCAweDAwMjgsIDB4MDgwYywKKwkweGI2OTMsIDB4OTAwNiwgMHgwODBjLCAweGI4ZmYsIDB4MDAxZSwgMHgwMDJlLCAweDAwZWUsIDB4MDBiZSwKKwkweDAwMDUsIDB4MjAxMSwgMHgxODI0LCAweDIyMDQsIDB4OTA4NiwgMHgwMDE0LCAweDExNjAsIDB4MjAwMSwKKwkweDAwMDIsIDB4MDgwYywgMHg2NWUzLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDEsIDB4MDgwYywKKwkweDkyYjcsIDB4MDgwNCwgMHg5NzM4LCAweDIwMDEsIDB4MDAwMSwgMHgwODA0LCAweGI4ZmYsIDB4MjAzMCwKKwkweDIwMTEsIDB4MTgyNCwgMHgyMjA0LCAweDkwODYsIDB4MDAwNCwgMHgxMTQ4LCAweDk2YjYsIDB4MDAwYiwKKwkweDExMjAsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NjVlMywgMHgwODA0LCAweGFjYjAsIDB4MjAwMSwKKwkweDAwMDEsIDB4MDgwNCwgMHhiOGZmLCAweDAwMDIsIDB4Yjc3YywgMHhiOWQzLCAweGI3N2MsIDB4YmExNCwKKwkweGI3N2MsIDB4YmFjMSwgMHhiOWM4LCAweGI3N2MsIDB4Yjc3YywgMHhiYWQ1LCAweGI3N2MsIDB4YmFlNywKKwkweDY2MDQsIDB4OTY4NiwgMHgwMDAzLCAweDA5MDQsIDB4YjkyZiwgMHg5NmI2LCAweDAwMWUsIDB4MTExMCwKKwkweDA4MGMsIDB4YWNiMCwgMHgwMDA1LCAweDAwYjYsIDB4MDBkNiwgMHgwMGM2LCAweDA4MGMsIDB4YmFmOSwKKwkweDExYTAsIDB4OTAwNiwgMHgwODBjLCAweDY1Y2YsIDB4MDgwYywgMHgzMjQwLCAweDA4MGMsIDB4ZDBiMCwKKwkweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDY1ZTMsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMiwKKwkweDA4MGMsIDB4OTJiNywgMHgwODBjLCAweDk3MzgsIDB4MDQxOCwgMHgyMDA5LCAweDAyNmUsIDB4MjEwNCwKKwkweDkwODYsIDB4MDAwOSwgMHgxMTYwLCAweDYwMTAsIDB4MjA1OCwgMHhiODQwLCAweDkwODQsIDB4MDBmZiwKKwkweDkwMDUsIDB4MDE3MCwgMHg4MDAxLCAweGI4NDIsIDB4NjAxYiwgMHgwMDBhLCAweDAwODgsIDB4MjAwOSwKKwkweDAyNmYsIDB4MjEwNCwgMHg5MDg0LCAweGZmMDAsIDB4OTA4NiwgMHgxOTAwLCAweDExMDgsIDB4MDhhMCwKKwkweDA4MGMsIDB4MzI0MCwgMHgwODBjLCAweGQwYjAsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4YjhmZiwKKwkweDAwY2UsIDB4MDBkZSwgMHgwMGJlLCAweDAwMDUsIDB4MDA5NiwgMHgwMGI2LCAweDAwMjYsIDB4OTAxNiwKKwkweDA4MGMsIDB4YmIwNywgMHgwMGQ2LCAweDIwNjksIDB4MTk3YiwgMHgyZDA0LCAweDkwMDUsIDB4MDE2OCwKKwkweDYwMTAsIDB4MjA1OCwgMHhiOGEwLCAweDkwODYsIDB4MDA3ZSwgMHgxMTM4LCAweDIwNjksIDB4MTgyMCwKKwkweDJkMDQsIDB4ODAwMCwgMHgyMDZhLCAweDAwZGUsIDB4MDAxMCwgMHgwMGRlLCAweDAwODgsIDB4OTAwNiwKKwkweDA4MGMsIDB4NjVjZiwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg2NWUzLCAweDYwMDMsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDAwMiwgMHgwODBjLCAweDkyYjcsIDB4MDgwYywgMHg5NzM4LCAweDA4MDQsIDB4YmE5MSwKKwkweDA4MGMsIDB4Yzk3YSwgMHgwMWIwLCAweDYwMTQsIDB4MjA0OCwgMHhhODY0LCAweDIwMTAsIDB4OTA4NiwKKwkweDAxMzksIDB4MTEzOCwgMHg2MDA3LCAweDAwMTYsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4Y2ZkNCwKKwkweDAwYjAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4NjQsIDB4ZDBmYywgMHgwMTE4LCAweDIwMDEsIDB4MDAwMSwKKwkweDBjYTgsIDB4MjAwMSwgMHgxODBlLCAweDIwMDQsIDB4ZDBkYywgMHgwMTQ4LCAweDYwMTAsIDB4MjA1OCwKKwkweGI4NDAsIDB4OTA4NCwgMHgwMGZmLCAweDkwMDUsIDB4MTExMCwgMHg5MDA2LCAweDBjMzgsIDB4MDgwYywKKwkweGI2OTMsIDB4MjAwOSwgMHgwMjZlLCAweDIxMzQsIDB4OTZiNCwgMHgwMGZmLCAweDk2ODYsIDB4MDAwNSwKKwkweDA1MjAsIDB4OTY4NiwgMHgwMDBiLCAweDAxYzgsIDB4MjAwOSwgMHgwMjZmLCAweDIxMDQsIDB4OTA4NCwKKwkweGZmMDAsIDB4MTExOCwgMHg5Njg2LCAweDAwMDksIDB4MDFjMCwgMHg5MDg2LCAweDE5MDAsIDB4MTE2OCwKKwkweDk2ODYsIDB4MDAwOSwgMHgwMTkwLCAweDIwMDEsIDB4MDAwNCwgMHgwODBjLCAweDY1ZTMsIDB4MjAwMSwKKwkweDAwMjgsIDB4NjAxYSwgMHg2MDA3LCAweDAwNTIsIDB4MDAyMCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywKKwkweGI4ZmYsIDB4MDAyZSwgMHgwMGJlLCAweDAwOWUsIDB4MDAwNSwgMHg5Mjg2LCAweDAxMzksIDB4MDE2MCwKKwkweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGM5N2EsIDB4MDE0MCwgMHhhODY0LCAweDkwODYsIDB4MDEzOSwKKwkweDAxMTgsIDB4YTg2OCwgMHhkMGZjLCAweDAxMDgsIDB4MGM0MCwgMHg2MDEwLCAweDIwNTgsIDB4Yjg0MCwKKwkweDkwODQsIDB4MDBmZiwgMHg5MDA1LCAweDAxMzgsIDB4ODAwMSwgMHhiODQyLCAweDYwMWIsIDB4MDAwYSwKKwkweDYwMDcsIDB4MDAxNiwgMHgwOGYwLCAweGI4YTAsIDB4OTA4NiwgMHgwMDdlLCAweDExMzgsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTgwMCwgMHgwODBjLCAweDYwMjUsIDB4MDBlZSwgMHgwMDEwLCAweDA4MGMsIDB4MzI0MCwKKwkweDA4NjAsIDB4MDgwYywgMHhiYjA3LCAweDExNjAsIDB4MjAwMSwgMHgwMDA0LCAweDA4MGMsIDB4NjVlMywKKwkweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDMsIDB4MDgwYywgMHg5MmI3LCAweDA4MDQsIDB4OTczOCwKKwkweDA4MGMsIDB4YjY5MywgMHg5MDA2LCAweDA4MDQsIDB4YjhmZiwgMHgwNDg5LCAweDExNjAsIDB4MjAwMSwKKwkweDAwMDgsIDB4MDgwYywgMHg2NWUzLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDUsIDB4MDgwYywKKwkweDkyYjcsIDB4MDgwNCwgMHg5NzM4LCAweDIwMDEsIDB4MDAwMSwgMHgwODA0LCAweGI4ZmYsIDB4MDBmOSwKKwkweDExNjAsIDB4MjAwMSwgMHgwMDBhLCAweDA4MGMsIDB4NjVlMywgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywKKwkweDAwMDEsIDB4MDgwYywgMHg5MmI3LCAweDA4MDQsIDB4OTczOCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwNCwKKwkweGI4ZmYsIDB4MjAwOSwgMHgwMjZlLCAweDIxMDQsIDB4OTA4NiwgMHgwMDAzLCAweDExMzgsIDB4MjAwOSwKKwkweDAyNmYsIDB4MjEwNCwgMHg5MDg0LCAweGZmMDAsIDB4OTA4NiwgMHgyYTAwLCAweDAwMDUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAwNSwgMHgwMGI2LCAweDAwYzYsIDB4MDAxNiwgMHg2MTEwLCAweDIxNTgsIDB4MDgwYywKKwkweDY2YTIsIDB4MDAxZSwgMHgwMGNlLCAweDAwYmUsIDB4MDAwNSwgMHgwMGI2LCAweDAwZjYsIDB4MDBlNiwKKwkweDAwZDYsIDB4MDAzNiwgMHgwMDE2LCAweDYwMTAsIDB4MjA1OCwgMHgyMDA5LCAweDE4MzcsIDB4MjEwNCwKKwkweDkwODUsIDB4MDAwMywgMHgyMDBhLCAweDA4MGMsIDB4YmJhZCwgMHgwNTYwLCAweDIwMDksIDB4MTgzNywKKwkweDIxMDQsIDB4YzBjZCwgMHgyMDBhLCAweDA4MGMsIDB4NmFkOSwgMHgwMTU4LCAweDkwMDYsIDB4MjAyMCwKKwkweDIwMDksIDB4MDAyYSwgMHgwODBjLCAweGU0NDUsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4YzE5NSwKKwkweDIxMDIsIDB4MjAxOSwgMHgwMDJhLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLCAweDMyMDUsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTgwMCwgMHgwODBjLCAweDMwMTEsIDB4MDBlZSwgMHgwMGM2LCAweDAxNTYsIDB4MjBhOSwKKwkweDA3ODEsIDB4MjAwOSwgMHgwMDdmLCAweDA4MGMsIDB4MzM0OSwgMHg4MTA4LCAweDFmMDQsIDB4YmI0YiwKKwkweDAxNWUsIDB4MDBjZSwgMHgwODBjLCAweGJiMGEsIDB4MjA3MSwgMHgwMjYwLCAweDIwNzksIDB4MDIwMCwKKwkweDc4MTcsIDB4MDAwMSwgMHgyMDAxLCAweDE4MzcsIDB4MjAwYywgMHhjMWM1LCAweDcwMTgsIDB4ZDBmYywKKwkweDAxMTAsIDB4ZDBkYywgMHgwMTE4LCAweDcwMzgsIDB4ZDBkYywgMHgxMTA4LCAweGMxYzQsIDB4NzgxNywKKwkweDAwMDAsIDB4MjAwMSwgMHgxODM3LCAweDIxMDIsIDB4MjA3OSwgMHgwMTAwLCAweDJlMDQsIDB4OTA4NCwKKwkweDAwZmYsIDB4MjA2OSwgMHgxODFmLCAweDIwNmEsIDB4NzhlNiwgMHgwMDA2LCAweDhlNzAsIDB4MmUwNCwKKwkweDIwNjksIDB4MTgyMCwgMHgyMDZhLCAweDc4ZWEsIDB4NzgzMiwgMHg3ODM2LCAweDIwMTAsIDB4OTA4NCwKKwkweGZmMDAsIDB4MDAxZSwgMHg5MTA1LCAweDIwMDksIDB4MTgyYywgMHgyMDBhLCAweDIyMDAsIDB4OTA4NCwKKwkweDAwZmYsIDB4MjAwOCwgMHgwODBjLCAweDI2YWEsIDB4MDgwYywgMHg3NTNkLCAweDAxNzAsIDB4MjA3MSwKKwkweDAyNjAsIDB4MjA2OSwgMHgxOTgxLCAweDcwNDgsIDB4MjA2YSwgMHg3MDRjLCAweDY4MDYsIDB4NzA1MCwKKwkweDY4MGEsIDB4NzA1NCwgMHg2ODBlLCAweDA4MGMsIDB4Y2RhNywgMHgwMDQwLCAweDIwMDEsIDB4MDAwNiwKKwkweDA4MGMsIDB4NjVlMywgMHgwODBjLCAweDMyNmYsIDB4MDgwYywgMHhhY2IwLCAweDAwMWUsIDB4MDAzZSwKKwkweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwYmUsIDB4MDAwNSwgMHgwMDk2LCAweDAwMjYsIDB4MDAzNiwKKwkweDAwZTYsIDB4MDE1NiwgMHgyMDE5LCAweDE4MmMsIDB4MjMxYywgMHg4M2ZmLCAweDAxZjAsIDB4MjA3MSwKKwkweDAyNjAsIDB4NzIwMCwgMHg5Mjk0LCAweDAwZmYsIDB4NzAwNCwgMHg5MDg0LCAweGZmMDAsIDB4OTIwNSwKKwkweDkzMDYsIDB4MTE5OCwgMHgyMDExLCAweDAyNzYsIDB4MjBhOSwgMHgwMDA0LCAweDJiNDgsIDB4MjAxOSwKKwkweDAwMGEsIDB4MDgwYywgMHhiY2EyLCAweDExNDgsIDB4MjAxMSwgMHgwMjdhLCAweDIwYTksIDB4MDAwNCwKKwkweDIwMTksIDB4MDAwNiwgMHgwODBjLCAweGJjYTIsIDB4MTEwMCwgMHgwMTVlLCAweDAwZWUsIDB4MDAzZSwKKwkweDAwMmUsIDB4MDA5ZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgwMjYwLCAweDcwMzQsIDB4OTA4NiwKKwkweDAwMTQsIDB4MTFhOCwgMHg3MDM4LCAweDkwODYsIDB4MDgwMCwgMHgxMTg4LCAweDcwM2MsIDB4ZDBlYywKKwkweDAxNjAsIDB4OTA4NCwgMHgwZjAwLCAweDkwODYsIDB4MDEwMCwgMHgxMTM4LCAweDcwNTQsIDB4ZDBhNCwKKwkweDExMTAsIDB4ZDBhYywgMHgwMTEwLCAweDkwMDYsIDB4MDAxMCwgMHg5MDg1LCAweDAwMDEsIDB4MDBlZSwKKwkweDAwMDUsIDB4MDBlNiwgMHgwMDk2LCAweDAwYzYsIDB4MDA3NiwgMHgwMDU2LCAweDAwNDYsIDB4MDAyNiwKKwkweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAyOSwgMHgxOWYyLCAweDI1MmMsIDB4MjAyMSwKKwkweDE5ZjksIDB4MjQyNCwgMHgyMDYxLCAweDFkZGMsIDB4MjA3MSwgMHgxODAwLCAweDcyNTQsIDB4NzA3NCwKKwkweDkyMDIsIDB4MWEwNCwgMHhiYzZlLCAweDA4MGMsIDB4OGMxZiwgMHgwOTA0LCAweGJjNjcsIDB4MDgwYywKKwkweGU0NzYsIDB4MDkwNCwgMHhiYzY3LCAweDY3MjAsIDB4OTc4NiwgMHgwMDA3LCAweDA5MDQsIDB4YmM2NywKKwkweDI1MDAsIDB4OWMwNiwgMHgwOTA0LCAweGJjNjcsIDB4MjQwMCwgMHg5YzA2LCAweDA5MDQsIDB4YmM2NywKKwkweDNlMDgsIDB4OTE4NiwgMHgwMDAyLCAweDExNDgsIDB4NjAxMCwgMHg5MDA1LCAweDAxMzAsIDB4MDBiNiwKKwkweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MTU5MCwgMHgwMGM2LCAweDYwNDMsIDB4ZmZmZiwKKwkweDYwMDAsIDB4OTA4NiwgMHgwMDA0LCAweDExMTAsIDB4MDgwYywgMHgxYWM1LCAweDk3ODYsIDB4MDAwYSwKKwkweDAxNDgsIDB4MDgwYywgMHhjYjkxLCAweDExMzAsIDB4MDBjZSwgMHgwODBjLCAweGI2OTMsIDB4MDgwYywKKwkweGFjZWIsIDB4MDBlOCwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhjOTdhLCAweDAxYTgsIDB4OTc4NiwKKwkweDAwMDMsIDB4MTUzMCwgMHhhODY3LCAweDAxMDMsIDB4YTg3YywgMHhkMGNjLCAweDAxMzAsIDB4MDA5NiwKKwkweGE4NzgsIDB4MjA0OCwgMHgwODBjLCAweDBmZjksIDB4MDA5ZSwgMHhhYjdhLCAweGE4NzcsIDB4MDAwMCwKKwkweDA4MGMsIDB4NmRlMiwgMHgwODBjLCAweGNiNmIsIDB4MDgwYywgMHhhY2ViLCAweDAwY2UsIDB4OWNlMCwKKwkweDAwMWMsIDB4NzA2OCwgMHg5YzAyLCAweDEyMTAsIDB4MDgwNCwgMHhiYzBlLCAweDAxMmUsIDB4MDAwZSwKKwkweDAwMmUsIDB4MDA0ZSwgMHgwMDVlLCAweDAwN2UsIDB4MDBjZSwgMHgwMDllLCAweDAwZWUsIDB4MDAwNSwKKwkweDk3ODYsIDB4MDAwNiwgMHgxMTE4LCAweDA4MGMsIDB4ZTNlOCwgMHgwYzMwLCAweDk3ODYsIDB4MDAwOSwKKwkweDExNDgsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDQsIDB4MGQwOCwgMHgyMDA5LCAweDAwNGMsIDB4MDgwYywKKwkweGFkNGQsIDB4MDhlMCwgMHg5Nzg2LCAweDAwMGEsIDB4MDk4MCwgMHgwODIwLCAweDIyMGMsIDB4MjMwNCwKKwkweDkxMDYsIDB4MTEzMCwgMHg4MjEwLCAweDgzMTgsIDB4MWYwNCwgMHhiYzhlLCAweDkwMDYsIDB4MDAwNSwKKwkweDIzMDQsIDB4OTEwMiwgMHgwMjE4LCAweDIwMDEsIDB4MDAwMSwgMHgwMDA4LCAweDkwMDYsIDB4OTE4ZCwKKwkweDAwMDEsIDB4MDAwNSwgMHgwMTM2LCAweDAxYzYsIDB4MDAxNiwgMHg4OTA2LCAweDgwMDYsIDB4ODAwNywKKwkweDkwOGMsIDB4MDAzZiwgMHgyMWUwLCAweDkwODQsIDB4ZmZjMCwgMHg5MzAwLCAweDIwOTgsIDB4MzUxOCwKKwkweDIwYTksIDB4MDAwMSwgMHgyMjBjLCAweDQwMDIsIDB4OTEwZSwgMHgxMTQwLCAweDgyMTAsIDB4ODMxOSwKKwkweDFkYzgsIDB4OTAwNiwgMHgwMDFlLCAweDAxY2UsIDB4MDEzZSwgMHgwMDA1LCAweDIyMGMsIDB4OTEwMiwKKwkweDAyMTgsIDB4MjAwMSwgMHgwMDAxLCAweDAwMTAsIDB4MjAwMSwgMHgwMDAwLCAweDkxOGQsIDB4MDAwMSwKKwkweDAwMWUsIDB4MDFjZSwgMHgwMTNlLCAweDAwMDUsIDB4MjIwYywgMHg4MTBmLCAweDIzMDQsIDB4OTEwNiwKKwkweDExMzAsIDB4ODIxMCwgMHg4MzE4LCAweDFmMDQsIDB4YmNjYywgMHg5MDA2LCAweDAwMDUsIDB4OTE4ZCwKKwkweDAwMDEsIDB4MDAwNSwgMHg2MDA0LCAweDkwOGEsIDB4MDA1MywgMHgxYTBjLCAweDBkN2QsIDB4MDgwYywKKwkweGNiODAsIDB4MDEyMCwgMHgwODBjLCAweGNiOTEsIDB4MDE1OCwgMHgwMDI4LCAweDA4MGMsIDB4MzI2ZiwKKwkweDA4MGMsIDB4Y2I5MSwgMHgwMTI4LCAweDA4MGMsIDB4OTY3YSwgMHgwODBjLCAweGFjYjAsIDB4MDAwNSwKKwkweDA4MGMsIDB4YjY5MywgMHgwY2MwLCAweDkxODIsIDB4MDA1NywgMHgxMjIwLCAweDkxODIsIDB4MDA0MCwKKwkweDAyMDgsIDB4MDAwYSwgMHgwMDA1LCAweGJkMTIsIDB4YmQxMiwgMHhiZDEyLCAweGJkMTIsIDB4YmQxMiwKKwkweGJkMTIsIDB4YmQxMiwgMHhiZDEyLCAweGJkMTIsIDB4YmQxMiwgMHhiZDEyLCAweGJkMTQsIDB4YmQxNCwKKwkweGJkMTQsIDB4YmQxNCwgMHhiZDEyLCAweGJkMTIsIDB4YmQxMiwgMHhiZDE0LCAweGJkMTIsIDB4YmQxMiwKKwkweGJkMTIsIDB4YmQxMiwgMHgwODBjLCAweDBkN2QsIDB4NjAwYiwgMHhmZmZmLCAweDYwMDMsIDB4MDAwZiwKKwkweDYxMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHhkMGIzLCAweDIwMDksIDB4ODAwMCwKKwkweDA4MGMsIDB4OTJiMCwgMHgwMTJlLCAweDAwMDUsIDB4OTE4NiwgMHgwMDEzLCAweDExMjgsIDB4NjAwNCwKKwkweDkwODIsIDB4MDA0MCwgMHgwODA0LCAweGJkOWMsIDB4OTE4NiwgMHgwMDI3LCAweDE1MjAsIDB4MDgwYywKKwkweDk2N2EsIDB4MDgwYywgMHgzMjQwLCAweDA4MGMsIDB4ZDBiMCwgMHgwMDk2LCAweDYxMTQsIDB4MjE0OCwKKwkweDA4MGMsIDB4Yzk3YSwgMHgwMTk4LCAweDA4MGMsIDB4Y2I5MSwgMHgxMTE4LCAweDA4MGMsIDB4YjY5MywKKwkweDAwNjgsIDB4YTg2NywgMHgwMTAzLCAweGE4N2IsIDB4MDAyOSwgMHhhODc3LCAweDAwMDAsIDB4YTk3YywKKwkweGMxYzUsIDB4YTk3ZSwgMHgwODBjLCAweDZkZWUsIDB4MDgwYywgMHhjYjZiLCAweDAwOWUsIDB4MDgwYywKKwkweGFjYjAsIDB4MDgwNCwgMHg5NzM4LCAweDkxODYsIDB4MDAxNCwgMHgxMTIwLCAweDYwMDQsIDB4OTA4MiwKKwkweDAwNDAsIDB4MDAzMCwgMHg5MTg2LCAweDAwNTMsIDB4MDExMCwgMHgwODBjLCAweDBkN2QsIDB4MDAwNSwKKwkweDAwMDIsIDB4YmQ3YSwgMHhiZDc4LCAweGJkNzgsIDB4YmQ3OCwgMHhiZDc4LCAweGJkNzgsIDB4YmQ3OCwKKwkweGJkNzgsIDB4YmQ3OCwgMHhiZDc4LCAweGJkNzgsIDB4YmQ5MywgMHhiZDkzLCAweGJkOTMsIDB4YmQ5MywKKwkweGJkNzgsIDB4YmQ5MywgMHhiZDc4LCAweGJkOTMsIDB4YmQ3OCwgMHhiZDc4LCAweGJkNzgsIDB4YmQ3OCwKKwkweDA4MGMsIDB4MGQ3ZCwgMHgwODBjLCAweDk2N2EsIDB4MDA5NiwgMHg2MTE0LCAweDIxNDgsIDB4MDgwYywKKwkweGM5N2EsIDB4MDE2OCwgMHhhODY3LCAweDAxMDMsIDB4YTg3YiwgMHgwMDA2LCAweGE4NzcsIDB4MDAwMCwKKwkweGE4ODAsIDB4YzBlYywgMHhhODgyLCAweDA4MGMsIDB4NmRlZSwgMHgwODBjLCAweGNiNmIsIDB4MDA5ZSwKKwkweDA4MGMsIDB4YWNiMCwgMHgwMDA1LCAweDA4MGMsIDB4OTY3YSwgMHgwODBjLCAweGNiOTEsIDB4MDkwYywKKwkweGI2OTMsIDB4MDgwYywgMHhhY2IwLCAweDAwMDUsIDB4MDAwMiwgMHhiZGI2LCAweGJkYjQsIDB4YmRiNCwKKwkweGJkYjQsIDB4YmRiNCwgMHhiZGI0LCAweGJkYjQsIDB4YmRiNCwgMHhiZGI0LCAweGJkYjQsIDB4YmRiNCwKKwkweGJkYjgsIDB4YmRiOCwgMHhiZGI4LCAweGJkYjgsIDB4YmRiNCwgMHhiZGJhLCAweGJkYjQsIDB4YmRiOCwKKwkweGJkYjQsIDB4YmRiNCwgMHhiZGI0LCAweGJkYjQsIDB4MDgwYywgMHgwZDdkLCAweDA4MGMsIDB4MGQ3ZCwKKwkweDA4MGMsIDB4MGQ3ZCwgMHgwODBjLCAweGFjYjAsIDB4MDgwNCwgMHg5NzM4LCAweDkxODIsIDB4MDA1NywKKwkweDEyMjAsIDB4OTE4MiwgMHgwMDQwLCAweDAyMDgsIDB4MDAwYSwgMHgwMDA1LCAweGJkZGQsIDB4YmRkZCwKKwkweGJkZGQsIDB4YmRkZCwgMHhiZGRkLCAweGJlMTYsIDB4YmYwNSwgMHhiZGRkLCAweGJmMTEsIDB4YmRkZCwKKwkweGJkZGQsIDB4YmRkZCwgMHhiZGRkLCAweGJkZGQsIDB4YmRkZCwgMHhiZGRkLCAweGJkZGQsIDB4YmRkZCwKKwkweGJkZGQsIDB4YmYxMSwgMHhiZGRmLCAweGJkZGQsIDB4YmYwZiwgMHgwODBjLCAweDBkN2QsIDB4MDBiNiwKKwkweDAwOTYsIDB4NjExNCwgMHgyMTQ4LCAweDYwMTAsIDB4MjA1OCwgMHhiODAwLCAweGQwYmMsIDB4MTUwOCwKKwkweGE4N2IsIDB4MDAwMCwgMHhhODY3LCAweDAxMDMsIDB4YTg3NywgMHgwMDAwLCAweGE4N2MsIDB4ZDBhYywKKwkweDAxMjgsIDB4YTgzNCwgMHhhOTM4LCAweDkxMTUsIDB4MTkwYywgMHhiZjk2LCAweDA4MGMsIDB4NmMwNCwKKwkweDYyMTAsIDB4MjI1OCwgMHhiYTNjLCAweDgyZmYsIDB4MDExMCwgMHg4MjExLCAweGJhM2UsIDB4YjhkMCwKKwkweDkwMDUsIDB4MDExMCwgMHgwODBjLCAweDY3YmUsIDB4MDgwYywgMHhhY2IwLCAweDAwOWUsIDB4MDBiZSwKKwkweDAwMDUsIDB4YTg3YywgMHhkMGFjLCAweDA5ZTAsIDB4YTgzOCwgMHhhOTM0LCAweDkxMDUsIDB4MDljMCwKKwkweGE4ODAsIDB4ZDBiYywgMHgxOWE4LCAweDA4MGMsIDB4Y2NjNiwgMHgwYzgwLCAweDAwYjYsIDB4MDA5NiwKKwkweDYxMTQsIDB4MjE0OCwgMHg2MDFjLCAweGQwZmMsIDB4MTExMCwgMHg3NjQ0LCAweDAwMDgsIDB4OTAzNiwKKwkweDk2YjQsIDB4MGZmZiwgMHg4NmZmLCAweDE1OTAsIDB4NjAxMCwgMHgyMDU4LCAweGI4MDAsIDB4ZDBiYywKKwkweDE5MDQsIDB4YmVmNCwgMHhhODdiLCAweDAwMDAsIDB4YTg2NywgMHgwMTAzLCAweGFlNzYsIDB4YTg3YywKKwkweGQwYWMsIDB4MDEyOCwgMHhhODM0LCAweGE5MzgsIDB4OTExNSwgMHgxOTBjLCAweGJmOTYsIDB4MDgwYywKKwkweDZjMDQsIDB4NjIxMCwgMHgyMjU4LCAweGJhM2MsIDB4ODJmZiwgMHgwMTEwLCAweDgyMTEsIDB4YmEzZSwKKwkweGI4ZDAsIDB4OTAwNSwgMHgwMTEwLCAweDA4MGMsIDB4NjdiZSwgMHg2MDFjLCAweGQwZmMsIDB4MTE0OCwKKwkweDcwNDQsIDB4ZDBlNCwgMHgxOTA0LCAweGJlZDgsIDB4MDgwYywgMHhhY2IwLCAweDAwOWUsIDB4MDBiZSwKKwkweDAwMDUsIDB4MjAwOSwgMHgwMjExLCAweDIxMGMsIDB4MDgwYywgMHgwZDdkLCAweDk2OGMsIDB4MGMwMCwKKwkweDAxNTAsIDB4NjAxMCwgMHgyMDU4LCAweGI4MDAsIDB4ZDBiYywgMHgxOTA0LCAweGJlZGMsIDB4NzM0OCwKKwkweGFiOTIsIDB4NzM0YywgMHhhYjhlLCAweDk2OGMsIDB4MDBmZiwgMHg5MTg2LCAweDAwMDIsIDB4MDUwOCwKKwkweDkxODYsIDB4MDAyOCwgMHgxMTE4LCAweGE4N2IsIDB4MDAxYywgMHgwMGU4LCAweGQ2ZGMsIDB4MDFhMCwKKwkweGE4N2IsIDB4MDAxNSwgMHhhODdjLCAweGQwYWMsIDB4MDE3MCwgMHhhOTM4LCAweGFhMzQsIDB4MjEwMCwKKwkweDkyMDUsIDB4MDE0OCwgMHg3MDQ4LCAweDkxMDYsIDB4MTExOCwgMHg3MDRjLCAweDkyMDYsIDB4MDExOCwKKwkweGE5OTIsIDB4YWE4ZSwgMHhjNmRjLCAweDAwMzgsIDB4ZDZkNCwgMHgwMTE4LCAweGE4N2IsIDB4MDAwNywKKwkweDAwMTAsIDB4YTg3YiwgMHgwMDAwLCAweGE4NjcsIDB4MDEwMywgMHhhZTc2LCAweDkwMWUsIDB4ZDZjNCwKKwkweDAxZDgsIDB4OTY4NiwgMHgwMTAwLCAweDExMzAsIDB4NzA2NCwgMHg5MDA1LCAweDExMTgsIDB4YzZjNCwKKwkweDA4MDQsIDB4YmUyMiwgMHg3MzVjLCAweGFiODYsIDB4ODNmZiwgMHgwMTcwLCAweDkzOGEsIDB4MDAwOSwKKwkweDAyMTAsIDB4MjAxOSwgMHgwMDA4LCAweDAwMzYsIDB4MjMwOCwgMHgyMDE5LCAweDAwMTgsIDB4MjAxMSwKKwkweDAwMjUsIDB4MDgwYywgMHhjNGY4LCAweDAwM2UsIDB4ZDZjYywgMHgwOTA0LCAweGJlMzcsIDB4NzE1NCwKKwkweGE5OGEsIDB4ODFmZiwgMHgwOTA0LCAweGJlMzcsIDB4OTE5MiwgMHgwMDIxLCAweDEyNzgsIDB4ODMwNCwKKwkweDkwOTgsIDB4MDAxOCwgMHgyMDExLCAweDAwMjksIDB4MDgwYywgMHhjNGY4LCAweDIwMTEsIDB4MDIwNSwKKwkweDIwMTMsIDB4MDAwMCwgMHgwODBjLCAweGQwNDAsIDB4MDgwNCwgMHhiZTM3LCAweGE4NjgsIDB4ZDBmYywKKwkweDAxMjAsIDB4MjAwOSwgMHgwMDIwLCAweGE5OGEsIDB4MGM1MCwgMHgwMGE2LCAweDI5NTAsIDB4MDgwYywKKwkweGM0OTcsIDB4MDBhZSwgMHgwODBjLCAweGQwNDAsIDB4MDgwYywgMHhjNGU4LCAweDA4MDQsIDB4YmUzOSwKKwkweDA4MGMsIDB4Y2M4OSwgMHgwODA0LCAweGJlNGUsIDB4YTg3YywgMHhkMGFjLCAweDA5MDQsIDB4YmU1ZiwKKwkweGE4ODAsIDB4ZDBiYywgMHgxOTA0LCAweGJlNWYsIDB4NzM0OCwgMHhhODM4LCAweDkzMDYsIDB4MTFjOCwKKwkweDczNGMsIDB4YTgzNCwgMHg5MzFlLCAweDA5MDQsIDB4YmU1ZiwgMHhkNmQ0LCAweDAxOTAsIDB4YWIzOCwKKwkweDkzMDUsIDB4MDkwNCwgMHhiZTVmLCAweDAwNjgsIDB4YTg3YywgMHhkMGFjLCAweDA5MDQsIDB4YmUyYSwKKwkweGE4MzgsIDB4YTkzNCwgMHg5MTA1LCAweDA5MDQsIDB4YmUyYSwgMHhhODgwLCAweGQwYmMsIDB4MTkwNCwKKwkweGJlMmEsIDB4MDgwYywgMHhjY2M2LCAweDA4MDQsIDB4YmU0ZSwgMHgwMGY2LCAweDIwNzksIDB4MDI2YywKKwkweDdjMDQsIDB4N2IwMCwgMHg3ZTBjLCAweDdkMDgsIDB4MDBmZSwgMHgwMDIxLCAweDAwMDUsIDB4MDAxMSwKKwkweDAwMDUsIDB4MDAwNSwgMHgwMDk2LCAweDYwMDMsIDB4MDAwMiwgMHg2MDA3LCAweDAwNDMsIDB4NjAxNCwKKwkweDIwNDgsIDB4YTg3YywgMHhkMGFjLCAweDAxMjgsIDB4MDA5ZSwgMHgwMDA1LCAweDIxMzAsIDB4MjIyOCwKKwkweDAwNTgsIDB4MjQwMCwgMHhhOWFjLCAweDkxMGEsIDB4MjMwMCwgMHhhYWIwLCAweDkyMTMsIDB4MjYwMCwKKwkweDkxMDIsIDB4MjUwMCwgMHg5MjAzLCAweDBlOTAsIDB4YWM0NiwgMHhhYjRhLCAweGFlMzYsIDB4YWQzYSwKKwkweDYwNDQsIDB4ZDBmYywgMHgxOTBjLCAweGE5NDcsIDB4NjA0YiwgMHgwMDAwLCAweDA4MGMsIDB4MWM4NiwKKwkweDExMTgsIDB4NjE0NCwgMHgwODBjLCAweDkyZGMsIDB4MDA5ZSwgMHgwMDA1LCAweDkxODIsIDB4MDA1NywKKwkweDEyMjAsIDB4OTE4MiwgMHgwMDQwLCAweDAyMDgsIDB4MDAwYSwgMHgwMDA1LCAweGJmNWQsIDB4YmY1ZCwKKwkweGJmNWQsIDB4YmY1ZCwgMHhiZjVkLCAweGJmNWQsIDB4YmY1ZCwgMHhiZjVkLCAweGJmNWQsIDB4YmY1ZCwKKwkweGJmNWYsIDB4YmY1ZCwgMHhiZjVkLCAweGJmNWQsIDB4YmY1ZCwgMHhiZjcwLCAweGJmNWQsIDB4YmY1ZCwKKwkweGJmNWQsIDB4YmY1ZCwgMHhiZjk0LCAweGJmNWQsIDB4YmY1ZCwgMHgwODBjLCAweDBkN2QsIDB4NjAwNCwKKwkweDkwODYsIDB4MDA0MCwgMHgxMTEwLCAweDA4MGMsIDB4OTY3YSwgMHgyMDE5LCAweDAwMDEsIDB4MDgwYywKKwkweGExYjgsIDB4NjAwMywgMHgwMDAyLCAweDA4MGMsIDB4ZDBiOCwgMHgwODBjLCAweDk2ZDUsIDB4MDAwNSwKKwkweDYwMDQsIDB4OTA4NiwgMHgwMDQwLCAweDExMTAsIDB4MDgwYywgMHg5NjdhLCAweDIwMTksIDB4MDAwMSwKKwkweDA4MGMsIDB4YTFiOCwgMHgwODBjLCAweDk2ZDUsIDB4MDgwYywgMHgzMjQwLCAweDA4MGMsIDB4ZDBiMCwKKwkweDAwOTYsIDB4NjExNCwgMHgyMTQ4LCAweDA4MGMsIDB4Yzk3YSwgMHgwMTUwLCAweGE4NjcsIDB4MDEwMywKKwkweGE4N2IsIDB4MDAyOSwgMHhhODc3LCAweDAwMDAsIDB4MDgwYywgMHg2ZGVlLCAweDA4MGMsIDB4Y2I2YiwKKwkweDAwOWUsIDB4MDgwYywgMHhhY2IwLCAweDAwMDUsIDB4MDgwYywgMHgwZDdkLCAweGE4N2IsIDB4MDAxNSwKKwkweGQxZmMsIDB4MDE4MCwgMHhhODdiLCAweDAwMDcsIDB4ODAwMiwgMHg4MDAwLCAweDgxMGEsIDB4OTE4OSwKKwkweDAwMDAsIDB4MDAwNiwgMHgwMDE2LCAweDIwMDksIDB4MWE3NywgMHgyMTA0LCAweDgwMDAsIDB4MjAwYSwKKwkweDAwMWUsIDB4MDAwZSwgMHhhOTkyLCAweGE4OGUsIDB4MDAwNSwgMHg5MTgyLCAweDAwNTcsIDB4MTIyMCwKKwkweDkxODIsIDB4MDA0MCwgMHgwMjA4LCAweDAwMGEsIDB4MDAwNSwgMHhiZmNjLCAweGJmY2MsIDB4YmZjYywKKwkweGJmY2MsIDB4YmZjYywgMHhiZmNlLCAweGJmY2MsIDB4YmZjYywgMHhjMDhiLCAweGJmY2MsIDB4YmZjYywKKwkweGJmY2MsIDB4YmZjYywgMHhiZmNjLCAweGJmY2MsIDB4YmZjYywgMHhiZmNjLCAweGJmY2MsIDB4YmZjYywKKwkweGMxY2IsIDB4YmZjYywgMHhjMWQ1LCAweGJmY2MsIDB4MDgwYywgMHgwZDdkLCAweDYwMWMsIDB4ZDBiYywKKwkweDAxNzgsIDB4ZDA4NCwgMHgwMTY4LCAweGQwZjQsIDB4MDEyMCwgMHhjMDg0LCAweDYwMWUsIDB4MDgwNCwKKwkweGJkYmUsIDB4NjExNCwgMHgwMDk2LCAweDIxNDgsIDB4YTg3YywgMHhjMGU1LCAweGE4N2UsIDB4MDA5ZSwKKwkweDAwNzYsIDB4MDBhNiwgMHgwMGU2LCAweDAwOTYsIDB4MjA3MSwgMHgwMjYwLCAweDYxMTQsIDB4MjE1MCwKKwkweDYwMWMsIDB4ZDBmYywgMHgxMTEwLCAweDc2NDQsIDB4MDAwOCwgMHg5MDM2LCAweGI2NzYsIDB4OTZiNCwKKwkweDBmZmYsIDB4Yjc3YywgMHhjN2U1LCAweGI3N2UsIDB4NjIxMCwgMHgwMGI2LCAweDIyNTgsIDB4YmEzYywKKwkweDgyZmYsIDB4MDExMCwgMHg4MjExLCAweGJhM2UsIDB4MDBiZSwgMHg4NmZmLCAweDA5MDQsIDB4YzA4NCwKKwkweDk2OTQsIDB4ZmYwMCwgMHg5Mjg0LCAweDBjMDAsIDB4MDEyMCwgMHg3MDQ4LCAweGIwOTIsIDB4NzA0YywKKwkweGIwOGUsIDB4OTI4NCwgMHgwMzAwLCAweDA5MDQsIDB4YzA4NCwgMHg5Njg2LCAweDAxMDAsIDB4MTEzMCwKKwkweDcwNjQsIDB4OTAwNSwgMHgxMTE4LCAweGM2YzQsIDB4YjY3NiwgMHgwYzM4LCAweDA4MGMsIDB4MTA0NywKKwkweDA5MGMsIDB4MGQ3ZCwgMHgyOTAwLCAweGIwN2EsIDB4Yjc3YywgMHg5N2JkLCAweDAyMDAsIDB4Yjc3ZSwKKwkweGE4NjcsIDB4MDEwMywgMHhiMDY4LCAweGE4NmEsIDB4YjA2YywgMHhhODZlLCAweGIwNzAsIDB4YTg3MiwKKwkweDcwNDQsIDB4OTA4NCwgMHhmMDAwLCAweDk2MzUsIDB4YWU3NiwgMHg5NjhjLCAweDBjMDAsIDB4MDEyMCwKKwkweDczNDgsIDB4YWI5MiwgMHg3MzRjLCAweGFiOGUsIDB4OTY4YywgMHgwMGZmLCAweDkxODYsIDB4MDAwMiwKKwkweDAxODAsIDB4OTE4NiwgMHgwMDI4LCAweDExMTgsIDB4YTg3YiwgMHgwMDFjLCAweDAwNjAsIDB4ZDZkYywKKwkweDAxMTgsIDB4YTg3YiwgMHgwMDE1LCAweDAwMzgsIDB4ZDZkNCwgMHgwMTE4LCAweGE4N2IsIDB4MDAwNywKKwkweDAwMTAsIDB4YTg3YiwgMHgwMDAwLCAweGFmN2UsIDB4YjA4MCwgMHhhODgyLCAweGIwODQsIDB4YTg4NiwKKwkweDkwMWUsIDB4ZDZjNCwgMHgwMTkwLCAweDczNWMsIDB4YWI4NiwgMHg4M2ZmLCAweDAxNzAsIDB4OTM4YSwKKwkweDAwMDksIDB4MDIxMCwgMHgyMDE5LCAweDAwMDgsIDB4MDAzNiwgMHgyMzA4LCAweDIwMTksIDB4MDAxOCwKKwkweDIwMTEsIDB4MDAyNSwgMHgwODBjLCAweGM0ZjgsIDB4MDAzZSwgMHhkNmNjLCAweDAxZTgsIDB4NzE1NCwKKwkweGE5OGEsIDB4ODFmZiwgMHgwMWM4LCAweDkxOTIsIDB4MDAyMSwgMHgxMjYwLCAweDgzMDQsIDB4OTA5OCwKKwkweDAwMTgsIDB4MjAxMSwgMHgwMDI5LCAweDA4MGMsIDB4YzRmOCwgMHgyMDExLCAweDAyMDUsIDB4MjAxMywKKwkweDAwMDAsIDB4MDA1MCwgMHhiMDY4LCAweGQwZmMsIDB4MDEyMCwgMHgyMDA5LCAweDAwMjAsIDB4YTk4YSwKKwkweDBjNjgsIDB4Mjk1MCwgMHgwODBjLCAweGM0OTcsIDB4MDgwYywgMHgxYTkzLCAweDAwOWUsIDB4MDBlZSwKKwkweDAwYWUsIDB4MDA3ZSwgMHgwMDA1LCAweDIwMDEsIDB4MTk4NywgMHgyMDA0LCAweDYwNGEsIDB4MDA5NiwKKwkweDYxMTQsIDB4MjE0OCwgMHhhODNjLCAweGE5NDAsIDB4OTEwNSwgMHgxMTE4LCAweGE4N2MsIDB4YzBkYywKKwkweGE4N2UsIDB4NjAwMywgMHgwMDAyLCAweDA4MGMsIDB4ZDBjMSwgMHgwOTA0LCAweGMxYzYsIDB4NjA0YiwKKwkweDAwMDAsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MTUwMCwKKwkweGQxY2MsIDB4MDkwNCwgMHhjMThhLCAweGE5NzgsIDB4YTg2OCwgMHhkMGZjLCAweDA5MDQsIDB4YzE0YiwKKwkweDAwMTYsIDB4YTg3YywgMHgwMDA2LCAweGE4ODAsIDB4MDAwNiwgMHgwMGE2LCAweDIxNTAsIDB4YjE3NCwKKwkweDkxODQsIDB4MDBmZiwgMHg5MGI2LCAweDAwMDIsIDB4MDkwNCwgMHhjMTE4LCAweDkwODYsIDB4MDAyOCwKKwkweDE5MDQsIDB4YzEwNCwgMHhhODdiLCAweDAwMWMsIDB4YjA3YiwgMHgwMDFjLCAweDA4MDQsIDB4YzEyMCwKKwkweDYwMjQsIDB4ZDBmNCwgMHgxMWQwLCAweGE4MzgsIDB4YWEzNCwgMHg5MjA1LCAweDA5YzgsIDB4YTgzOCwKKwkweGFhOTAsIDB4OTIwNiwgMHgxMTIwLCAweGE4OGMsIDB4YWEzNCwgMHg5MjA2LCAweDA5ODgsIDB4NjAyNCwKKwkweGQwZDQsIDB4MTE0OCwgMHhhOWFjLCAweGE4MzQsIDB4OTEwMiwgMHg2MDNhLCAweGE5YjAsIDB4YTgzOCwKKwkweDkxMDMsIDB4NjAzZSwgMHg2MDI0LCAweGMwZjUsIDB4NjAyNiwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwKKwkweGI4M2MsIDB4ODAwMCwgMHhiODNlLCAweDAwYmUsIDB4NjAxYywgMHhjMGZjLCAweDYwMWUsIDB4OTAwNiwKKwkweGE4NzYsIDB4YTg5MiwgMHhhODhlLCAweGE4N2MsIDB4YzBlNCwgMHhhODdlLCAweGQwY2MsIDB4MDE0MCwKKwkweGMwY2MsIDB4YTg3ZSwgMHgwMDk2LCAweGE4NzgsIDB4MjA0OCwgMHgwODBjLCAweDBmZjksIDB4MDA5ZSwKKwkweDA4MGMsIDB4Y2NjNiwgMHgwODA0LCAweGMxYzYsIDB4ZDFkYywgMHgwMTU4LCAweGE4N2IsIDB4MDAxNSwKKwkweGIwN2IsIDB4MDAxNSwgMHgwODBjLCAweGNmNjMsIDB4MDExOCwgMHhiMTc0LCAweGMxZGMsIDB4YjE3NiwKKwkweDAwNzgsIDB4ZDFkNCwgMHgwMTI4LCAweGE4N2IsIDB4MDAwNywgMHhiMDdiLCAweDAwMDcsIDB4MDA0MCwKKwkweGE4N2MsIDB4ZDBhYywgMHgwMTI4LCAweGE4MzQsIDB4YTkzOCwgMHg5MTE1LCAweDE5MGMsIDB4YmY5NiwKKwkweGE4N2MsIDB4YjA3ZSwgMHhhODkwLCAweGIwOTIsIDB4YTg4YywgMHhiMDhlLCAweGE4NjAsIDB4MjBlOCwKKwkweGE4NWMsIDB4OTA4MCwgMHgwMDE5LCAweDIwYTAsIDB4MjBhOSwgMHgwMDIwLCAweDhhMDYsIDB4ODAwNiwKKwkweDgwMDcsIDB4OTA5NCwgMHgwMDNmLCAweDIyZTAsIDB4OTA4NCwgMHhmZmMwLCAweDkwODAsIDB4MDAxOSwKKwkweDIwOTgsIDB4NDAwMywgMHgwMGFlLCAweDAwMGUsIDB4YTg4MiwgMHgwMDBlLCAweGMwY2MsIDB4YTg3ZSwKKwkweDA4MGMsIDB4ZDA0MCwgMHgwMDFlLCAweGE4NzQsIDB4MDAwNiwgMHgyMTQ4LCAweDA4MGMsIDB4MGZmOSwKKwkweDAwMWUsIDB4MDgwNCwgMHhjMWI3LCAweDAwMTYsIDB4MDBhNiwgMHgyMTUwLCAweGIxNzQsIDB4OTE4NCwKKwkweDAwZmYsIDB4OTBiNiwgMHgwMDAyLCAweDAxZTAsIDB4OTA4NiwgMHgwMDI4LCAweDExMjgsIDB4YTg3YiwKKwkweDAwMWMsIDB4YjA3YiwgMHgwMDFjLCAweDAwZTAsIDB4ZDFkYywgMHgwMTU4LCAweGE4N2IsIDB4MDAxNSwKKwkweGIwN2IsIDB4MDAxNSwgMHgwODBjLCAweGNmNjMsIDB4MDExOCwgMHhiMTc0LCAweGMxZGMsIDB4YjE3NiwKKwkweDAwNzgsIDB4ZDFkNCwgMHgwMTI4LCAweGE4N2IsIDB4MDAwNywgMHhiMDdiLCAweDAwMDcsIDB4MDA0MCwKKwkweGE4N2MsIDB4ZDBhYywgMHgwMTI4LCAweGE4MzQsIDB4YTkzOCwgMHg5MTE1LCAweDE5MGMsIDB4YmY5NiwKKwkweGE4OTAsIDB4YjA5MiwgMHhhODhjLCAweGIwOGUsIDB4YTg3YywgMHhiMDdlLCAweDAwYWUsIDB4MDgwYywKKwkweDBmZjksIDB4MDA5ZSwgMHgwODBjLCAweGQwNDAsIDB4YTk3NCwgMHgwMDE2LCAweDA4MGMsIDB4YzRlOCwKKwkweDAwMWUsIDB4MDQ2OCwgMHhhODY3LCAweDAxMDMsIDB4YTk3NCwgMHg5MTg0LCAweDAwZmYsIDB4OTBiNiwKKwkweDAwMDIsIDB4MDFiMCwgMHg5MDg2LCAweDAwMjgsIDB4MTExOCwgMHhhODdiLCAweDAwMWMsIDB4MDBkMCwKKwkweGQxZGMsIDB4MDE0OCwgMHhhODdiLCAweDAwMTUsIDB4MDgwYywgMHhjZjYzLCAweDAxMTgsIDB4YTk3NCwKKwkweGMxZGMsIDB4YTk3NiwgMHgwMDc4LCAweGQxZDQsIDB4MDExOCwgMHhhODdiLCAweDAwMDcsIDB4MDA1MCwKKwkweGE4N2IsIDB4MDAwMCwgMHhhODdjLCAweGQwYWMsIDB4MDEyOCwgMHhhODM0LCAweGE5MzgsIDB4OTExNSwKKwkweDE5MGMsIDB4YmY5NiwgMHhhOTc0LCAweDAwMTYsIDB4MDgwYywgMHg2YzA0LCAweDAwMWUsIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiYTNjLCAweGI4ZDAsIDB4MDAxNiwgMHg5MDA1LCAweDE5MGMsIDB4NjdiZSwKKwkweDAwMWUsIDB4MDBiZSwgMHhkMWU0LCAweDExMjAsIDB4MDgwYywgMHhhY2IwLCAweDAwOWUsIDB4MDAwNSwKKwkweDA4MGMsIDB4Y2M4OSwgMHgwY2Q4LCAweDYxMTQsIDB4MDA5NiwgMHgyMTQ4LCAweGE5N2MsIDB4MDgwYywKKwkweGQwYzEsIDB4MTkwYywgMHgxYWIxLCAweDAwOWUsIDB4MDAwNSwgMHgwMDk2LCAweDYxMTQsIDB4MjE0OCwKKwkweGE4M2MsIDB4YTk0MCwgMHg5MTA1LCAweDAxZTgsIDB4YTg3NywgMHgwMDAwLCAweGE4N2IsIDB4MDAwMCwKKwkweGE4NjcsIDB4MDEwMywgMHgwMGI2LCAweDYwMTAsIDB4MjA1OCwgMHhhODM0LCAweGE5MzgsIDB4OTExNSwKKwkweDExYTAsIDB4MDgwYywgMHg2YzA0LCAweGJhM2MsIDB4ODIxMSwgMHgwMjA4LCAweGJhM2UsIDB4YjhkMCwKKwkweDkwMDUsIDB4MDExMCwgMHgwODBjLCAweDY3YmUsIDB4MDgwYywgMHhhY2IwLCAweDAwYmUsIDB4MDA5ZSwKKwkweDAwMDUsIDB4YTg3YywgMHhjMGRjLCAweGE4N2UsIDB4MDhmOCwgMHhiODAwLCAweGQwYmMsIDB4MTEyMCwKKwkweGE4MzQsIDB4MDgwYywgMHhiZjk2LCAweDBjMjgsIDB4YTg4MCwgMHhkMGJjLCAweDFkYzgsIDB4MDgwYywKKwkweGNjYzYsIDB4MGM2MCwgMHgwODBjLCAweDk2N2EsIDB4MDAxMCwgMHgwODBjLCAweDk2ZDUsIDB4NjAxYywKKwkweGQwODQsIDB4MDExMCwgMHgwODBjLCAweDFhYzUsIDB4MDgwYywgMHhjOTdhLCAweDAxZjAsIDB4MDA5NiwKKwkweDYxMTQsIDB4MjE0OCwgMHgwODBjLCAweGNiOTEsIDB4MTExOCwgMHgwODBjLCAweGI2OTMsIDB4MDBhMCwKKwkweGE4NjcsIDB4MDEwMywgMHgyMDA5LCAweDE4MGMsIDB4MjEwYywgMHhkMThjLCAweDExOTgsIDB4ZDE4NCwKKwkweDExNzAsIDB4NjEwOCwgMHhhOTdhLCAweDkxOGUsIDB4MDAyOSwgMHgxMTEwLCAweDA4MGMsIDB4ZTc5ZCwKKwkweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweDZkZWUsIDB4MDA5ZSwgMHgwODA0LCAweGFjZWIsIDB4YTg3YiwKKwkweDAwMDQsIDB4MGNiMCwgMHhhODdiLCAweDAwMDQsIDB4MGM5OCwgMHg5MTgyLCAweDAwNTcsIDB4MTIyMCwKKwkweDkxODIsIDB4MDA0MCwgMHgwMjA4LCAweDAwMGEsIDB4MDAwNSwgMHhjMjVjLCAweGMyNWMsIDB4YzI1YywKKwkweGMyNWMsIDB4YzI1YywgMHhjMjVlLCAweGMyNWMsIDB4YzI1YywgMHhjMjVjLCAweGMyNWMsIDB4YzI1YywKKwkweGMyNWMsIDB4YzI1YywgMHhjMjVjLCAweGMyNWMsIDB4YzI1YywgMHhjMjVjLCAweGMyNWMsIDB4YzI1YywKKwkweGMyNWMsIDB4YzI4MiwgMHhjMjVjLCAweGMyNWMsIDB4MDgwYywgMHgwZDdkLCAweDA4MGMsIDB4NTc0NiwKKwkweDAxZjgsIDB4NjAxNCwgMHg3MTQ0LCAweDkxOGMsIDB4MGZmZiwgMHg5MDE2LCAweGQxYzQsIDB4MDExOCwKKwkweDcyNjQsIDB4OTI5NCwgMHgwMGZmLCAweDAwOTYsIDB4OTA0ZCwgMHgwMTg4LCAweGE4N2IsIDB4MDAwMCwKKwkweGE4NjQsIDB4OTA4NiwgMHgwMTM5LCAweDAxMjgsIDB4YTg2NywgMHgwMTAzLCAweGE5NzYsIDB4YWE5NiwKKwkweDAwMzAsIDB4YTg5NywgMHg0MDAwLCAweGE5OWEsIDB4YWE5ZSwgMHgwODBjLCAweDZkZWUsIDB4MDA5ZSwKKwkweDA4MDQsIDB4YWNiMCwgMHgwODBjLCAweDU3NDYsIDB4MGRkOCwgMHg2MDE0LCAweDkwMGUsIDB4OTAxNiwKKwkweDBjMTAsIDB4OTE4MiwgMHgwMDg1LCAweDAwMDIsIDB4YzI5YiwgMHhjMjk5LCAweGMyOTksIDB4YzJhNywKKwkweGMyOTksIDB4YzI5OSwgMHhjMjk5LCAweGMyOTksIDB4YzI5OSwgMHhjMjk5LCAweGMyOTksIDB4YzI5OSwKKwkweGMyOTksIDB4MDgwYywgMHgwZDdkLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjAwOSwgMHg4MDIwLCAweDA4MGMsIDB4OTJiMCwgMHgwMTJlLCAweDAwMDUsIDB4MDAyNiwKKwkweDAwNTYsIDB4MDBkNiwgMHgwMGU2LCAweDIwNzEsIDB4MDI2MCwgMHg3MjI0LCAweDYyMTYsIDB4NzIyMCwKKwkweDA4MGMsIDB4Yzk2OCwgMHgwMWY4LCAweDIyNjgsIDB4NjgwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDFkMCwKKwkweDYwMTAsIDB4NmQxMCwgMHg5NTJlLCAweDExYjAsIDB4MDBjNiwgMHgyZDYwLCAweDAwZDYsIDB4MDgwYywKKwkweGM1NTksIDB4MDBkZSwgMHgwMGNlLCAweDAxNTgsIDB4NzAyYywgMHhkMDg0LCAweDExMTgsIDB4MDgwYywKKwkweGM1MjMsIDB4MDAxMCwgMHg2ODAzLCAweDAwMDIsIDB4NjAwNywgMHgwMDg2LCAweDAwMjgsIDB4MDgwYywKKwkweGM1NDUsIDB4MGQ5MCwgMHg2MDA3LCAweDAwODcsIDB4NjAwMywgMHgwMDAxLCAweDIwMDksIDB4ODAyMCwKKwkweDA4MGMsIDB4OTJiMCwgMHg3MjIwLCAweDA4MGMsIDB4Yzk2OCwgMHgwMTc4LCAweDY4MTAsIDB4MDBiNiwKKwkweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MDE0MCwgMHg2ODI0LCAweGQwZWMsIDB4MDEyOCwKKwkweDAwYzYsIDB4MmQ2MCwgMHgwODBjLCAweGNjYzYsIDB4MDBjZSwgMHgwMGVlLCAweDAwZGUsIDB4MDA1ZSwKKwkweDAwMmUsIDB4MDAwNSwgMHg5MTg2LCAweDAwMTMsIDB4MTE2MCwgMHg2MDA0LCAweDkwOGEsIDB4MDA4NSwKKwkweDBhMGMsIDB4MGQ3ZCwgMHg5MDhhLCAweDAwOTIsIDB4MWEwYywgMHgwZDdkLCAweDkwODIsIDB4MDA4NSwKKwkweDAwZTIsIDB4OTE4NiwgMHgwMDI3LCAweDAxMjAsIDB4OTE4NiwgMHgwMDE0LCAweDE5MGMsIDB4MGQ3ZCwKKwkweDA4MGMsIDB4OTY3YSwgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGM5N2EsIDB4MDE0MCwKKwkweGE4NjcsIDB4MDEwMywgMHhhODc3LCAweDAwMDAsIDB4YTg3YiwgMHgwMDI5LCAweDA4MGMsIDB4NmRlZSwKKwkweDAwOWUsIDB4MDgwYywgMHhhY2ViLCAweDA4MDQsIDB4OTczOCwgMHhjMzJhLCAweGMzMmMsIDB4YzMyYywKKwkweGMzMmEsIDB4YzMyYSwgMHhjMzJhLCAweGMzMmEsIDB4YzMyYSwgMHhjMzJhLCAweGMzMmEsIDB4YzMyYSwKKwkweGMzMmEsIDB4YzMyYSwgMHgwODBjLCAweDBkN2QsIDB4MDgwYywgMHhhY2ViLCAweDAwMDUsIDB4OTE4NiwKKwkweDAwMTMsIDB4MTEzMCwgMHg2MDA0LCAweDkwODIsIDB4MDA4NSwgMHgyMDA4LCAweDA4MDQsIDB4YzM3YiwKKwkweDkxODYsIDB4MDAyNywgMHgxNTU4LCAweDA4MGMsIDB4OTY3YSwgMHgwODBjLCAweDMyNDAsIDB4MDgwYywKKwkweGQwYjAsIDB4MDA5NiwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhjOTdhLCAweDAxNTAsIDB4YTg2NywKKwkweDAxMDMsIDB4YTg3NywgMHgwMDAwLCAweGE4N2IsIDB4MDAyOSwgMHgwODBjLCAweDZkZWUsIDB4MDgwYywKKwkweGNiNmIsIDB4MDA5ZSwgMHgwODBjLCAweGFjYjAsIDB4MDAwNSwgMHg5MTg2LCAweDAwODksIDB4MDExOCwKKwkweDkxODYsIDB4MDA4YSwgMHgxMTQwLCAweDA4MGMsIDB4YWIzMywgMHgwMTI4LCAweDkwODYsIDB4MDAwYywKKwkweDA5MDQsIDB4YzNiMywgMHgwMDAwLCAweDA4MGMsIDB4YWQ2YSwgMHgwYzcwLCAweDkxODYsIDB4MDAxNCwKKwkweDFkNjAsIDB4MDgwYywgMHg5NjdhLCAweDAwOTYsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Yzk3YSwKKwkweDBkMDAsIDB4YTg2NywgMHgwMTAzLCAweGE4NzcsIDB4MDAwMCwgMHhhODdiLCAweDAwMDYsIDB4YTg4MCwKKwkweGMwZWMsIDB4YTg4MiwgMHgwODkwLCAweDAwMDIsIDB4YzM4YiwgMHhjMzg5LCAweGMzODksIDB4YzM4OSwKKwkweGMzODksIDB4YzM4OSwgMHhjMzlmLCAweGMzODksIDB4YzM4OSwgMHhjMzg5LCAweGMzODksIDB4YzM4OSwKKwkweGMzODksIDB4MDgwYywgMHgwZDdkLCAweDYwMzQsIDB4OTA4YywgMHhmZjAwLCAweDgxMGYsIDB4OTE4NiwKKwkweDAwMzksIDB4MDExOCwgMHg5MTg2LCAweDAwMzUsIDB4MTExOCwgMHgyMDAxLCAweDE5ODUsIDB4MDAxMCwKKwkweDIwMDEsIDB4MTk4NiwgMHgyMDA0LCAweDYwMWEsIDB4NjAwMywgMHgwMDBjLCAweDAwMDUsIDB4NjAzNCwKKwkweDkwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDkxODYsIDB4MDAzOSwgMHgwMTE4LCAweDkxODYsIDB4MDAzNSwKKwkweDExMTgsIDB4MjAwMSwgMHgxOTg1LCAweDAwMTAsIDB4MjAwMSwgMHgxOTg2LCAweDIwMDQsIDB4NjAxYSwKKwkweDYwMDMsIDB4MDAwZSwgMHgwMDA1LCAweDkxODIsIDB4MDA5MiwgMHgxMjIwLCAweDkxODIsIDB4MDA4NSwKKwkweDAyMDgsIDB4MDAxMiwgMHgwODA0LCAweGFkNmEsIDB4YzNjOSwgMHhjM2M5LCAweGMzYzksIDB4YzNjOSwKKwkweGMzY2IsIDB4YzQxOCwgMHhjM2M5LCAweGMzYzksIDB4YzNjOSwgMHhjM2M5LCAweGMzYzksIDB4YzNjOSwKKwkweGMzYzksIDB4MDgwYywgMHgwZDdkLCAweDAwOTYsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwKKwkweDAwYmUsIDB4ZDBiYywgMHgwMTY4LCAweDYwMzQsIDB4OTA4YywgMHhmZjAwLCAweDgxMGYsIDB4OTE4NiwKKwkweDAwMzksIDB4MDExOCwgMHg5MTg2LCAweDAwMzUsIDB4MTExOCwgMHgwMDllLCAweDA4MDQsIDB4YzQyYywKKwkweDA4MGMsIDB4Yzk3YSwgMHgxMTE4LCAweDA4MGMsIDB4Y2I2YiwgMHgwMDY4LCAweDYwMTQsIDB4MjA0OCwKKwkweDA4MGMsIDB4ZDBjNywgMHgxMTEwLCAweDA4MGMsIDB4Y2I2YiwgMHhhODY3LCAweDAxMDMsIDB4MDgwYywKKwkweGQwN2IsIDB4MDgwYywgMHg2ZGVlLCAweDAwZDYsIDB4MmM2OCwgMHgwODBjLCAweGFjNWEsIDB4MDFkMCwKKwkweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMWUsIDB4NjAwYiwgMHhmZmZmLCAweDIwMDksIDB4MDI2ZSwKKwkweDIxMGMsIDB4NjEzYSwgMHgyMDA5LCAweDAyNmYsIDB4MjEwYywgMHg2MTNlLCAweDY5MTAsIDB4NjExMiwKKwkweDA4MGMsIDB4Y2UxNSwgMHg2OTVjLCAweDYxNWUsIDB4NjAyMywgMHgwMDAxLCAweDIwMDksIDB4ODAyMCwKKwkweDA4MGMsIDB4OTJiMCwgMHgyZDYwLCAweDAwZGUsIDB4MDgwYywgMHhhY2IwLCAweDAwOWUsIDB4MDAwNSwKKwkweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwgMHhkMGJjLCAweDA1YTAsIDB4NjAzNCwKKwkweDkwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDkxODYsIDB4MDAzNSwgMHgwMTMwLCAweDkxODYsIDB4MDAxZSwKKwkweDAxMTgsIDB4OTE4NiwgMHgwMDM5LCAweDE1MzgsIDB4MDBkNiwgMHgyYzY4LCAweDA4MGMsIDB4ZDAxMywKKwkweDExZjAsIDB4MDgwYywgMHhhYzVhLCAweDAxZDgsIDB4NjEwNiwgMHg2MDAzLCAweDAwMDEsIDB4NjAyMywKKwkweDAwMDEsIDB4NjkxMCwgMHg2MTEyLCAweDY5MmMsIDB4NjEyZSwgMHg2OTMwLCAweDYxMzIsIDB4NjkzNCwKKwkweDkxOGMsIDB4MDBmZiwgMHg2MTM2LCAweDY5MzgsIDB4NjEzYSwgMHg2OTNjLCAweDYxM2UsIDB4Njk1YywKKwkweDYxNWUsIDB4MDgwYywgMHhjZTE1LCAweDIwMDksIDB4ODAyMCwgMHgwODBjLCAweDkyYjAsIDB4MmQ2MCwKKwkweDAwZGUsIDB4MDgwNCwgMHhhY2IwLCAweDAwOTYsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Yzk3YSwKKwkweDAxYzgsIDB4YTg2NywgMHgwMTAzLCAweGE4ODAsIDB4ZDBiNCwgMHgwMTI4LCAweGMwZWMsIDB4YTg4MiwKKwkweGE4N2IsIDB4MDAwNiwgMHgwMDQ4LCAweGQwYmMsIDB4MDExOCwgMHhhODdiLCAweDAwMDIsIDB4MDAyMCwKKwkweGE4N2IsIDB4MDAwNSwgMHgwODBjLCAweGNjODUsIDB4YTg3NywgMHgwMDAwLCAweDA4MGMsIDB4NmRlZSwKKwkweDA4MGMsIDB4Y2I2YiwgMHgwMDllLCAweDA4MDQsIDB4YWNiMCwgMHgwMDE2LCAweDAwOTYsIDB4NjAxNCwKKwkweDIwNDgsIDB4MDgwYywgMHhjOTdhLCAweDAxNDAsIDB4YTg2NywgMHgwMTAzLCAweGE4N2IsIDB4MDAyOCwKKwkweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweDZkZWUsIDB4MDA5ZSwgMHgwMDFlLCAweDkxODYsIDB4MDAxMywKKwkweDAxNTgsIDB4OTE4NiwgMHgwMDE0LCAweDAxMzAsIDB4OTE4NiwgMHgwMDI3LCAweDAxMTgsIDB4MDgwYywKKwkweGFkNmEsIDB4MDAyMCwgMHgwODBjLCAweDk2N2EsIDB4MDgwYywgMHhhY2ViLCAweDAwMDUsIDB4MDA1NiwKKwkweDAwNjYsIDB4MDA5NiwgMHgwMGE2LCAweDIwMjksIDB4MDAwMSwgMHg5MTgyLCAweDAxMDEsIDB4MTIwOCwKKwkweDAwMTAsIDB4MjAwOSwgMHgwMTAwLCAweDIxMzAsIDB4ODMwNCwgMHg5MDk4LCAweDAwMTgsIDB4MjAwOSwKKwkweDAwMjAsIDB4MjAxMSwgMHgwMDI5LCAweDA4MGMsIDB4YzRmOCwgMHg5NmIyLCAweDAwMjAsIDB4YjAwNCwKKwkweDkwNGQsIDB4MDExMCwgMHgwODBjLCAweDBmZjksIDB4MDgwYywgMHgxMDQ3LCAweDA1MjAsIDB4ODUyOCwKKwkweGE4NjcsIDB4MDExMCwgMHhhODZiLCAweDAwMDAsIDB4MjkyMCwgMHhiNDA2LCAweDk2OGEsIDB4MDAzZCwKKwkweDEyMjgsIDB4MjYwOCwgMHgyMDExLCAweDAwMWIsIDB4MDQ5OSwgMHgwMGE4LCAweDk2YjIsIDB4MDAzYywKKwkweDIwMDksIDB4MDAzYywgMHgyOTUwLCAweDIwMTEsIDB4MDAxYiwgMHgwNDUxLCAweDBjMjgsIDB4MjAwMSwKKwkweDAyMDUsIDB4MjAwMywgMHgwMDAwLCAweDAwYWUsIDB4ODUyZiwgMHg5NWFkLCAweDAwMDMsIDB4YjU2NiwKKwkweDk1YWMsIDB4MDAwMCwgMHgwMDQ4LCAweDIwMDEsIDB4MDIwNSwgMHgyMDAzLCAweDAwMDAsIDB4MDBhZSwKKwkweDg1MmYsIDB4OTVhZCwgMHgwMDAzLCAweGI1NjYsIDB4MDA5ZSwgMHgwMDZlLCAweDAwNWUsIDB4MDAwNSwKKwkweDAwYTYsIDB4ODlmZiwgMHgwMTU4LCAweGE4MDQsIDB4OTA1NSwgMHgwMTMwLCAweGE4MDcsIDB4MDAwMCwKKwkweDA4MGMsIDB4NmRlZSwgMHgyYTQ4LCAweDBjYjgsIDB4MDgwYywgMHg2ZGVlLCAweDAwYWUsIDB4MDAwNSwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMjAwLCAweDc4MTQsIDB4OTA4NSwgMHgwMDgwLCAweDc4MTYsIDB4ZDE4NCwKKwkweDAxMDgsIDB4ODEwOCwgMHg4MTBjLCAweDIwYTksIDB4MDAwMSwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywKKwkweDkyMDAsIDB4MjBhMCwgMHgyMGUxLCAweDAwMDAsIDB4MjMwMCwgMHg5ZTAwLCAweDIwOTgsIDB4NDAwMywKKwkweDgzMTgsIDB4OTM4NiwgMHgwMDIwLCAweDExNDgsIDB4MjAxOCwgMHgyMzAwLCAweDllMDAsIDB4MjA5OCwKKwkweDc4MTQsIDB4ODAwMCwgMHg5MDg1LCAweDAwODAsIDB4NzgxNiwgMHg4MTA5LCAweDFkODAsIDB4NzgxNywKKwkweDAwMDAsIDB4MDBmZSwgMHgwMDA1LCAweDY5MjAsIDB4OTE4NiwgMHgwMDAzLCAweDAxMTgsIDB4OTE4NiwKKwkweDAwMDIsIDB4MTFkMCwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgyZDYwLCAweDAwOTYsIDB4NjAxNCwKKwkweDIwNDgsIDB4MDgwYywgMHhjOTdhLCAweDAxNTAsIDB4MjAwMSwgMHgwMDA2LCAweGE5ODAsIDB4YzFkNSwKKwkweDA4MGMsIDB4NzAyMiwgMHgwODBjLCAweDZkZTIsIDB4MDgwYywgMHhjYjZiLCAweDAwOWUsIDB4MDgwYywKKwkweGFjZWIsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGM2LCAweDcwMmMsIDB4ZDA4NCwKKwkweDExNzAsIDB4NjAwOCwgMHgyMDYwLCAweDYwMjAsIDB4OTA4NiwgMHgwMDAyLCAweDExNDAsIDB4NjEwNCwKKwkweDkxODYsIDB4MDA4NSwgMHgwMTE4LCAweDkxODYsIDB4MDA4YiwgMHgxMTA4LCAweDkwMDYsIDB4MDBjZSwKKwkweDAwMDUsIDB4MDA2NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDMxLCAweDAwMDEsIDB4NjAyMCwKKwkweDkwODQsIDB4MDAwZiwgMHgwMDgzLCAweDAxMmUsIDB4MDA2ZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDA2NiwgMHgyMDMxLCAweDAwMDAsIDB4NjAyMCwgMHg5MDg0LCAweDAwMGYsIDB4MDAxYiwKKwkweDAwNmUsIDB4MDEyZSwgMHgwMDA1LCAweGM1YWIsIDB4YzVhYiwgMHhjNWE2LCAweGM1Y2YsIDB4YzU4MywKKwkweGM1YTYsIDB4YzU4NSwgMHhjNWE2LCAweGM1ODMsIDB4OTE3MywgMHhjNWE2LCAweGM1YTYsIDB4YzVhNiwKKwkweGM1ODMsIDB4YzU4MywgMHhjNTgzLCAweDA4MGMsIDB4MGQ3ZCwgMHg2MDEwLCAweDkwODAsIDB4MDAwMCwKKwkweDIwMDQsIDB4ZDBiYywgMHgxOTBjLCAweGM1Y2YsIDB4MDAzNiwgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwKKwkweGE4ODAsIDB4MDA5ZSwgMHhkMGNjLCAweDAxMTgsIDB4MjAxOSwgMHgwMDBjLCAweDAwMzgsIDB4ZDA5NCwKKwkweDAxMTgsIDB4MjAxOSwgMHgwMDBkLCAweDAwMTAsIDB4MjAxOSwgMHgwMDEwLCAweDA4MGMsIDB4ZGZhMSwKKwkweDYwMjMsIDB4MDAwNiwgMHg2MDAzLCAweDAwMDcsIDB4MDAzZSwgMHgwMDA1LCAweDkwMDYsIDB4MDAwNSwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwOTYsIDB4ODZmZiwgMHgxMWU4LCAweDYwMTQsIDB4MjA0OCwKKwkweDA4MGMsIDB4Yzk3YSwgMHgwMWQwLCAweDYwNDMsIDB4ZmZmZiwgMHhhODY0LCAweDkwODYsIDB4MDEzOSwKKwkweDExMjgsIDB4YTg3YiwgMHgwMDA1LCAweGE4ODMsIDB4MDAwMCwgMHgwMDI4LCAweDkwMGUsIDB4MjAwMSwKKwkweDAwMDUsIDB4MDgwYywgMHg3MDIyLCAweDA4MGMsIDB4Y2M4NSwgMHgwODBjLCAweDZkZTIsIDB4MDgwYywKKwkweGFjZWIsIDB4OTA4NSwgMHgwMDAxLCAweDAwOWUsIDB4MDAwNSwgMHg5MDA2LCAweDBjZTAsIDB4MDgwYywKKwkweGE5MWUsIDB4MDgwYywgMHhkMGQ1LCAweDYwMDAsIDB4OTA4YSwgMHgwMDE2LCAweDFhMGMsIDB4MGQ3ZCwKKwkweDAwMmIsIDB4MDEwNiwgMHgwODBjLCAweGE5M2EsIDB4MDEwZSwgMHgwMDA1LCAweGM1ZWUsIDB4YzYxZSwKKwkweGM1ZjAsIDB4YzY0NSwgMHhjNjE5LCAweGM1ZWUsIDB4YzVhNiwgMHhjNWFiLCAweGM1YWIsIDB4YzVhNiwKKwkweGM1YTYsIDB4YzVhNiwgMHhjNWE2LCAweGM1YTYsIDB4YzVhNiwgMHhjNWE2LCAweDA4MGMsIDB4MGQ3ZCwKKwkweDg2ZmYsIDB4MTUyMCwgMHg2MDIwLCAweDkwODYsIDB4MDAwNiwgMHgwNTAwLCAweDAwOTYsIDB4NjAxNCwKKwkweDIwNDgsIDB4MDgwYywgMHhjOTdhLCAweDAxNjgsIDB4YTg3YywgMHhkMGNjLCAweDAxNDAsIDB4MDA5NiwKKwkweGMwY2MsIDB4YTg3ZSwgMHhhODc4LCAweDIwNDgsIDB4MDgwYywgMHgwZmY5LCAweDAwOWUsIDB4MDgwYywKKwkweGNjODUsIDB4MDA5ZSwgMHgwODBjLCAweGQwNTUsIDB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwKKwkweDYwMjMsIDB4MDAwMiwgMHgyMDA5LCAweDgwMjAsIDB4MDgwYywgMHg5MjkyLCAweDkwODUsIDB4MDAwMSwKKwkweDAwMDUsIDB4MDA2NiwgMHgwODBjLCAweDFhYzUsIDB4MDA2ZSwgMHgwODkwLCAweDAwZTYsIDB4MjA3MSwKKwkweDE5ZTYsIDB4NzAzMCwgMHg5YzA2LCAweDExMjAsIDB4MDgwYywgMHhhMTM4LCAweDAwZWUsIDB4MDg0MCwKKwkweDYwMjAsIDB4OTA4NCwgMHgwMDBmLCAweDkwODYsIDB4MDAwNiwgMHgxMTUwLCAweDAwODYsIDB4MDA5NiwKKwkweDIwNDksIDB4MDAwMSwgMHgyYzQwLCAweDA4MGMsIDB4YTI4YywgMHgwMDllLCAweDAwOGUsIDB4MDA0MCwKKwkweDAwNjYsIDB4MDgwYywgMHhhMDM0LCAweDE5MGMsIDB4MGQ3ZCwgMHgwODBjLCAweGEwNDIsIDB4MDA2ZSwKKwkweDAwZWUsIDB4MTkwNCwgMHhjNWYwLCAweDA4MDQsIDB4YzVhNiwgMHgwMDM2LCAweDAwZTYsIDB4MjA3MSwKKwkweDE5ZTYsIDB4NzA0YywgMHg5YzA2LCAweDExMzgsIDB4OTAxZSwgMHgwODBjLCAweGExYjgsIDB4MDBlZSwKKwkweDAwM2UsIDB4MDgwNCwgMHhjNWYwLCAweDA4MGMsIDB4YTNjMywgMHgwMGVlLCAweDAwM2UsIDB4MTkwNCwKKwkweGM1ZjAsIDB4MDgwNCwgMHhjNWE2LCAweDAwYzYsIDB4MDA2NiwgMHg2MDIwLCAweDkwODQsIDB4MDAwZiwKKwkweDAwMWIsIDB4MDA2ZSwgMHgwMGNlLCAweDAwMDUsIDB4YzY3YiwgMHhjNzRhLCAweGM4YjQsIDB4YzY4MywKKwkweGFjZWIsIDB4YzY3YiwgMHhkZjkzLCAweGQwYmQsIDB4Yzc0YSwgMHg5MTNhLCAweGM5NDAsIDB4YzY3NCwKKwkweGM2NzQsIDB4YzY3NCwgMHhjNjc0LCAweGM2NzQsIDB4MDgwYywgMHgwZDdkLCAweDA4MGMsIDB4Y2I5MSwKKwkweDExMTAsIDB4MDgwYywgMHhiNjkzLCAweDAwMDUsIDB4MDgwYywgMHg5NjdhLCAweDA4MDQsIDB4YWNiMCwKKwkweDYwMWIsIDB4MDAwMSwgMHgwMDA1LCAweDA4MGMsIDB4Yzk3YSwgMHgwMTMwLCAweDYwMTQsIDB4MDA5NiwKKwkweDIwNDgsIDB4MmMwMCwgMHhhODk2LCAweDAwOWUsIDB4MDgwYywgMHhhOTFlLCAweDA4MGMsIDB4ZDBkNSwKKwkweDYwMDAsIDB4OTA4YSwgMHgwMDE2LCAweDFhMGMsIDB4MGQ3ZCwgMHgwMDEzLCAweDA4MDQsIDB4YTkzYSwKKwkweGM2YTgsIDB4YzZhYSwgMHhjNmQ0LCAweGM2ZTgsIDB4YzcxNSwgMHhjNmE4LCAweGM2N2IsIDB4YzY3YiwKKwkweGM2N2IsIDB4YzZlZiwgMHhjNmVmLCAweGM2YTgsIDB4YzZhOCwgMHhjNmE4LCAweGM2YTgsIDB4YzZmOSwKKwkweDA4MGMsIDB4MGQ3ZCwgMHgwMGU2LCAweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4ODAsIDB4YzBiNSwKKwkweGE4ODIsIDB4MDA5ZSwgMHgyMDcxLCAweDE5ZTYsIDB4NzAzMCwgMHg5YzA2LCAweDAxZDAsIDB4MDA2NiwKKwkweDA4MGMsIDB4YTAzNCwgMHgxOTBjLCAweDBkN2QsIDB4MDgwYywgMHhhMDQyLCAweDAwNmUsIDB4MDgwYywKKwkweGQwNTUsIDB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDIzLCAweDAwMDIsIDB4MjAwMSwKKwkweDE5ODYsIDB4MjAwNCwgMHg2MDFhLCAweDIwMDksIDB4ODAyMCwgMHgwODBjLCAweDkyOTIsIDB4MDBlZSwKKwkweDAwMDUsIDB4NjAxYiwgMHgwMDAxLCAweDBjZDgsIDB4MDA5NiwgMHg2MDE0LCAweDIwNDgsIDB4YTg4MCwKKwkweGMwYjUsIDB4YTg4MiwgMHgwMDllLCAweDA4MGMsIDB4ZDA1NSwgMHg2MDA3LCAweDAwODUsIDB4NjAwMywKKwkweDAwMGIsIDB4NjAyMywgMHgwMDAyLCAweDIwMDksIDB4ODAyMCwgMHgwODBjLCAweDkyOTIsIDB4MDAwNSwKKwkweDA4MGMsIDB4YTkxZSwgMHgwODBjLCAweGFhYjUsIDB4MDgwYywgMHhhOTNhLCAweDBjMjgsIDB4MDA5NiwKKwkweDYwMWIsIDB4MDAwMSwgMHg2MDE0LCAweDIwNDgsIDB4YTg4MCwgMHhjMGI1LCAweGE4ODIsIDB4MDA5ZSwKKwkweDAwMDUsIDB4MDgwYywgMHg1NzQ2LCAweDAxYjgsIDB4NjAxNCwgMHgwMDk2LCAweDkwNGQsIDB4MDE5MCwKKwkweGE4NjQsIDB4YTg2NywgMHgwMTAzLCAweGE4N2IsIDB4MDAwNiwgMHg5MDg2LCAweDAxMzksIDB4MTE1MCwKKwkweGE4NjcsIDB4MDEzOSwgMHhhODdiLCAweDAwMzAsIDB4YTg5NywgMHg0MDA1LCAweGE4OWIsIDB4MDAwNCwKKwkweDA4MGMsIDB4NmRlZSwgMHgwMDllLCAweDA4MDQsIDB4YWNiMCwgMHg2MDE0LCAweDAwOTYsIDB4OTA0ZCwKKwkweDA1NjAsIDB4YTk3YywgMHhkMWU0LCAweDExNTgsIDB4NjExYywgMHhkMWZjLCAweDA1MzAsIDB4NjExMCwKKwkweDAwYjYsIDB4MjE1OCwgMHhiOTNjLCAweDgxMDksIDB4MDIwOCwgMHhiOTNlLCAweDAwYmUsIDB4MDgwYywKKwkweGE5M2EsIDB4MjAwMSwgMHgxODBmLCAweDIwMDQsIDB4ZDBjNCwgMHgwMTEwLCAweDAwOWUsIDB4MDAwNSwKKwkweGE4ODQsIDB4MDA5ZSwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHg5MTA4LCAweDYxMWEsIDB4MjAwMSwKKwkweDAwMzcsIDB4MmMwOCwgMHgwODBjLCAweDE2YTAsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDQsIDB4MTEyMCwKKwkweDIwMDksIDB4MDA0OCwgMHgwODBjLCAweGFkNGQsIDB4MDAwNSwgMHgwMDllLCAweDA4MGMsIDB4MWFjNSwKKwkweDA4MDQsIDB4YzZkNCwgMHg2MDAwLCAweDkwOGEsIDB4MDAxNiwgMHgxYTBjLCAweDBkN2QsIDB4MDAwYiwKKwkweDAwMDUsIDB4Yzc2MSwgMHhjNjgwLCAweGM3NjMsIDB4Yzc2MSwgMHhjNzYzLCAweGM3NjMsIDB4YzY3YywKKwkweGM3NjEsIDB4YzY3NiwgMHhjNjc2LCAweGM3NjEsIDB4Yzc2MSwgMHhjNzYxLCAweGM3NjEsIDB4Yzc2MSwKKwkweGM3NjEsIDB4MDgwYywgMHgwZDdkLCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDQsIDB4OTA4NCwKKwkweDAwZmYsIDB4MDBiZSwgMHg5MDhhLCAweDAwMGMsIDB4MWEwYywgMHgwZDdkLCAweDAwYjYsIDB4MDAxMywKKwkweDAwYmUsIDB4MDAwNSwgMHhjNzdlLCAweGM4NGIsIDB4Yzc4MCwgMHhjN2MwLCAweGM3ODAsIDB4YzdjMCwKKwkweGM3ODAsIDB4Yzc4ZSwgMHhjNzdlLCAweGM3YzAsIDB4Yzc3ZSwgMHhjN2FmLCAweDA4MGMsIDB4MGQ3ZCwKKwkweDYwMDQsIDB4OTA4ZSwgMHgwMDE2LCAweDA1YzAsIDB4OTA4ZSwgMHgwMDA0LCAweDA1YTgsIDB4OTA4ZSwKKwkweDAwMDIsIDB4MDU5MCwgMHg5MDhlLCAweDAwNTIsIDB4MDkwNCwgMHhjODQ3LCAweDYwMDQsIDB4MDgwYywKKwkweGNiOTEsIDB4MDkwNCwgMHhjODY0LCAweDkwOGUsIDB4MDAwNCwgMHgxMTEwLCAweDA4MGMsIDB4MzI2ZiwKKwkweDkwOGUsIDB4MDAyMSwgMHgwOTA0LCAweGM4NjgsIDB4OTA4ZSwgMHgwMDIyLCAweDA5MDQsIDB4YzhhZiwKKwkweDkwOGUsIDB4MDAzZCwgMHgwOTA0LCAweGM4NjgsIDB4OTA4ZSwgMHgwMDM5LCAweDA5MDQsIDB4Yzg2YywKKwkweDkwOGUsIDB4MDAzNSwgMHgwOTA0LCAweGM4NmMsIDB4OTA4ZSwgMHgwMDFlLCAweDAxNzgsIDB4OTA4ZSwKKwkweDAwMDEsIDB4MTE0MCwgMHg2MDEwLCAweDIwNTgsIDB4YjgwNCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwKKwkweDAwMDYsIDB4MDExMCwgMHgwODBjLCAweDMyNDAsIDB4MDgwYywgMHhiNjkzLCAweDA4MDQsIDB4YWNlYiwKKwkweDAwYzYsIDB4MDBkNiwgMHg2MTA0LCAweDkxODYsIDB4MDAxNiwgMHgwOTA0LCAweGM4MzgsIDB4OTE4NiwKKwkweDAwMDIsIDB4MTkwNCwgMHhjODBkLCAweDIwMDEsIDB4MTgzNywgMHgyMDA0LCAweGQwOGMsIDB4MTFjOCwKKwkweDA4MGMsIDB4NzUzZCwgMHgxMWIwLCAweDA4MGMsIDB4ZDA5YiwgMHgwMTM4LCAweDA4MGMsIDB4NzU2MCwKKwkweDExMjAsIDB4MDgwYywgMHg3NDQ4LCAweDA4MDQsIDB4Yzg5OCwgMHgyMDAxLCAweDE5N2MsIDB4MjAwMywKKwkweDAwMDEsIDB4MjAwMSwgMHgxODAwLCAweDIwMDMsIDB4MDAwMSwgMHgwODBjLCAweDc0NmUsIDB4MDgwNCwKKwkweGM4OTgsIDB4NjAxMCwgMHgyMDU4LCAweDIwMDEsIDB4MTgzNywgMHgyMDA0LCAweGQwYWMsIDB4MTkwNCwKKwkweGM4OTgsIDB4YjhhMCwgMHg5MDg0LCAweGZmODAsIDB4MTkwNCwgMHhjODk4LCAweGI4NDAsIDB4OTA4NCwKKwkweDAwZmYsIDB4OTAwNSwgMHgwMTkwLCAweDgwMDEsIDB4Yjg0MiwgMHg2MDE3LCAweDAwMDAsIDB4NjAyMywKKwkweDAwMDcsIDB4NjAxYiwgMHgwMzk4LCAweDYwNGIsIDB4MDAwMCwgMHgwODBjLCAweGFjNWEsIDB4MDEyOCwKKwkweDJiMDAsIDB4NjAxMiwgMHg2MDIzLCAweDAwMDEsIDB4MDQ1OCwgMHgwMGRlLCAweDAwY2UsIDB4NjAwNCwKKwkweDkwOGUsIDB4MDAwMiwgMHgxMWEwLCAweDYwMTAsIDB4MjA1OCwgMHhiOGEwLCAweDkwODYsIDB4MDA3ZSwKKwkweDExNzAsIDB4MjAwOSwgMHgxODM3LCAweDIxMDQsIDB4YzA4NSwgMHgyMDBhLCAweDAwZTYsIDB4MjA3MSwKKwkweDE4MDAsIDB4MDgwYywgMHg2MDI1LCAweDAwZWUsIDB4MDgwYywgMHhiNjkzLCAweDAwMzAsIDB4MDgwYywKKwkweGI2OTMsIDB4MDgwYywgMHgzMjQwLCAweDA4MGMsIDB4ZDBiMCwgMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDgwYywgMHgzMjZmLCAweDAxMmUsIDB4MDBlZSwgMHgwODBjLCAweGFjZWIsIDB4MDAwNSwKKwkweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDY1ZTMsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMiwKKwkweDA4MGMsIDB4OTJiNywgMHgwODBjLCAweDk3MzgsIDB4MDBkZSwgMHgwMGNlLCAweDBjODAsIDB4MDgwYywKKwkweDMyNmYsIDB4MDgwNCwgMHhjN2JjLCAweDAwYzYsIDB4MDBkNiwgMHg2MTA0LCAweDkxODYsIDB4MDAxNiwKKwkweDBkMzgsIDB4NjAxMCwgMHgyMDU4LCAweGI4NDAsIDB4OTA4NCwgMHgwMGZmLCAweDkwMDUsIDB4MDkwNCwKKwkweGM4MGQsIDB4ODAwMSwgMHhiODQyLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkyYjcsIDB4MDgwYywKKwkweDk3MzgsIDB4MDBkZSwgMHgwMGNlLCAweDA4OTgsIDB4MDgwYywgMHhiNjkzLCAweDA4MDQsIDB4YzdiZSwKKwkweDA4MGMsIDB4YjZjZiwgMHgwODA0LCAweGM3YmUsIDB4MDBkNiwgMHgyYzY4LCAweDYxMDQsIDB4MDgwYywKKwkweGQwMTMsIDB4MDBkZSwgMHgwMTE4LCAweDA4MGMsIDB4YWNiMCwgMHgwNDA4LCAweDYwMDQsIDB4ODAwNywKKwkweDYxMzQsIDB4OTE4YywgMHgwMGZmLCAweDkxMDUsIDB4NjAzNiwgMHg2MDA3LCAweDAwODUsIDB4NjAwMywKKwkweDAwMGIsIDB4NjAyMywgMHgwMDAyLCAweDYwM2MsIDB4NjAwYSwgMHgyMDAxLCAweDE5ODYsIDB4MjAwNCwKKwkweDYwMWEsIDB4NjAyYywgMHgyYzA4LCAweDIwNjAsIDB4NjAyNCwgMHhkMGI0LCAweDAxMDgsIDB4YzA4NSwKKwkweGMwYjUsIDB4NjAyNiwgMHgyMTYwLCAweDIwMDksIDB4ODAyMCwgMHgwODBjLCAweDkyYjAsIDB4MDAwNSwKKwkweDAwZGUsIDB4MDBjZSwgMHgwODBjLCAweGI2OTMsIDB4MDgwYywgMHgzMjQwLCAweDAwZTYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDMyNmYsIDB4NjAxNywgMHgwMDAwLCAweDYwMjMsIDB4MDAwNywKKwkweDYwMWIsIDB4MDM5OCwgMHg2MDRiLCAweDAwMDAsIDB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4MDgwYywKKwkweGIwZWIsIDB4MTkwNCwgMHhjODY0LCAweDAwMDUsIDB4NjAwMCwgMHg5MDhhLCAweDAwMTYsIDB4MWEwYywKKwkweDBkN2QsIDB4MDA5NiwgMHgwMGQ2LCAweDAwMWIsIDB4MDBkZSwgMHgwMDllLCAweDAwMDUsIDB4YzhjZiwKKwkweGM4Y2YsIDB4YzhjZiwgMHhjOGNmLCAweGM4Y2YsIDB4YzhjZiwgMHhjOGNmLCAweGM4Y2YsIDB4YzhjZiwKKwkweGM2N2IsIDB4YzhjZiwgMHhjNjgwLCAweGM4ZDEsIDB4YzY4MCwgMHhjOGViLCAweGM4Y2YsIDB4MDgwYywKKwkweDBkN2QsIDB4NjAwNCwgMHg5MDg2LCAweDAwOGIsIDB4MDFiMCwgMHg2MDM0LCAweDkwOGMsIDB4ZmYwMCwKKwkweDgxMGYsIDB4OTE4NiwgMHgwMDM1LCAweDExMzAsIDB4NjAyYywgMHg5MDgwLCAweDAwMDksIDB4MjAwYywKKwkweGMxODUsIDB4MjEwMiwgMHg2MDA3LCAweDAwOGIsIDB4NjAwMywgMHgwMDBkLCAweDIwMDksIDB4ODAyMCwKKwkweDA4MGMsIDB4OTJiMCwgMHgwMDA1LCAweDA4MGMsIDB4ZDA4ZiwgMHgwMTE4LCAweDA4MGMsIDB4ZDBhMiwKKwkweDAwMTAsIDB4MDgwYywgMHhkMGIwLCAweDA4MGMsIDB4Y2I2YiwgMHgwODBjLCAweGM5N2EsIDB4MDU3MCwKKwkweDA4MGMsIDB4MzI0MCwgMHgwODBjLCAweGM5N2EsIDB4MDE2OCwgMHg2MDE0LCAweDIwNDgsIDB4YTg2NywKKwkweDAxMDMsIDB4YTg3YiwgMHgwMDA2LCAweGE4NzcsIDB4MDAwMCwgMHhhODgwLCAweGMwZWQsIDB4YTg4MiwKKwkweDA4MGMsIDB4NmRlZSwgMHgyYzY4LCAweDA4MGMsIDB4YWM1YSwgMHgwMTUwLCAweDY4MTAsIDB4NjAxMiwKKwkweDA4MGMsIDB4Y2UxNSwgMHgwMGM2LCAweDJkNjAsIDB4MDgwYywgMHhhY2ViLCAweDAwY2UsIDB4MDAwOCwKKwkweDJkNjAsIDB4NjAxNywgMHgwMDAwLCAweDYwMjMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDEsIDB4NjAwMywKKwkweDAwMDEsIDB4MDgwYywgMHg5MmI3LCAweDA4MGMsIDB4OTczOCwgMHgwMGM4LCAweDA4MGMsIDB4ZDA4ZiwKKwkweDAxMzgsIDB4NjAzNCwgMHg5MDg2LCAweDQwMDAsIDB4MTExOCwgMHgwODBjLCAweDMyNDAsIDB4MDhkMCwKKwkweDYwMzQsIDB4OTA4YywgMHhmZjAwLCAweDgxMGYsIDB4OTE4NiwgMHgwMDM5LCAweDAxMTgsIDB4OTE4NiwKKwkweDAwMzUsIDB4MTExOCwgMHgwODBjLCAweDMyNDAsIDB4MDg2OCwgMHgwODBjLCAweGFjZWIsIDB4MDAwNSwKKwkweDYwMDAsIDB4OTA4YSwgMHgwMDE2LCAweDFhMGMsIDB4MGQ3ZCwgMHgwMDAyLCAweGM5NTYsIDB4Yzk1NiwKKwkweGM5NTgsIDB4Yzk1OCwgMHhjOTU4LCAweGM5NTYsIDB4Yzk1NiwgMHhhY2ViLCAweGM5NTYsIDB4Yzk1NiwKKwkweGM5NTYsIDB4Yzk1NiwgMHhjOTU2LCAweGM5NTYsIDB4Yzk1NiwgMHhjOTU2LCAweDA4MGMsIDB4MGQ3ZCwKKwkweDA4MGMsIDB4YTkxZSwgMHgwODBjLCAweGFhYjUsIDB4MDgwYywgMHhhOTNhLCAweDYxMTQsIDB4MDA5NiwKKwkweDIxNDgsIDB4YTg3YiwgMHgwMDA2LCAweDA4MGMsIDB4NmRlZSwgMHgwMDllLCAweDA4MDQsIDB4YWNiMCwKKwkweDkyODQsIDB4MDAwMywgMHgxMTU4LCAweDkyODIsIDB4MWRkYywgMHgwMjQwLCAweDIwMDEsIDB4MTgxYSwKKwkweDIwMDQsIDB4OTIwMiwgMHgxMjE4LCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDkwMDYsIDB4MGNlOCwKKwkweDAwOTYsIDB4MDAyOCwgMHgwMDk2LCAweDAwMDYsIDB4NjAxNCwgMHgyMDQ4LCAweDAwMGUsIDB4MDAwNiwKKwkweDk5ODQsIDB4ZjAwMCwgMHg5MDg2LCAweGYwMDAsIDB4MDExMCwgMHgwODBjLCAweDEwZjIsIDB4MDAwZSwKKwkweDAwOWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwYzYsIDB4MDAzNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA2MSwgMHgxZGRjLCAweDIwNzEsIDB4MTgwMCwgMHg3MzU0LCAweDcwNzQsIDB4OTMwMiwKKwkweDE2NDAsIDB4NjAyMCwgMHg5MjA2LCAweDExZjgsIDB4MDgwYywgMHhkMDliLCAweDAxODAsIDB4OTI4NiwKKwkweDAwMDEsIDB4MTE2OCwgMHg2MDA0LCAweDkwODYsIDB4MDAwNCwgMHgxMTQ4LCAweDA4MGMsIDB4MzI0MCwKKwkweDA4MGMsIDB4ZDBiMCwgMHgwMGM2LCAweDA4MGMsIDB4YWNlYiwgMHgwMGNlLCAweDAwNjAsIDB4MDgwYywKKwkweGNkODcsIDB4MDE0OCwgMHgwODBjLCAweGNiOTEsIDB4MTExMCwgMHgwODBjLCAweGI2OTMsIDB4MDBjNiwKKwkweDA4MGMsIDB4YWNiMCwgMHgwMGNlLCAweDljZTAsIDB4MDAxYywgMHg3MDY4LCAweDljMDIsIDB4MTIwOCwKKwkweDA4YTAsIDB4MDEyZSwgMHgwMDBlLCAweDAwM2UsIDB4MDBjZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwKKwkweDAwYzYsIDB4MDAxNiwgMHg5MTg4LCAweDEwMDAsIDB4MjEwYywgMHg4MWZmLCAweDAxMjgsIDB4MjA2MSwKKwkweDFiMzQsIDB4NjExMiwgMHgwODBjLCAweDMyNDAsIDB4OTAwNiwgMHgwMDEwLCAweDkwODUsIDB4MDAwMSwKKwkweDAwMWUsIDB4MDBjZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4YWM1YSwgMHgwMWIwLCAweDY2NWUsIDB4MmIwMCwgMHg2MDEyLCAweDA4MGMsIDB4NTc0NiwKKwkweDAxMTgsIDB4MDgwYywgMHhjYWFkLCAweDAxNjgsIDB4MDgwYywgMHhjZTE1LCAweDYwMjMsIDB4MDAwMywKKwkweDIwMDksIDB4MDA0YiwgMHgwODBjLCAweGFkNGQsIDB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwKKwkweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YmFhMCwKKwkweDA4MGMsIDB4YWQyMCwgMHgwNTgwLCAweDYwNWYsIDB4MDAwMCwgMHgyYjAwLCAweDYwMTIsIDB4MDgwYywKKwkweGNlMTUsIDB4NjAyMywgMHgwMDAzLCAweDAwMTYsIDB4MDgwYywgMHhhOTFlLCAweDA4MGMsIDB4OTQzZCwKKwkweDAwNzYsIDB4OTAzZSwgMHgwODBjLCAweDkzMDYsIDB4MmMwOCwgMHgwODBjLCAweGUxNjcsIDB4MDA3ZSwKKwkweDA4MGMsIDB4YTkzYSwgMHgwMDFlLCAweGQxODQsIDB4MDEyOCwgMHgwODBjLCAweGFjYjAsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDA3MCwgMHgwODBjLCAweDU3NDYsIDB4MDEyOCwgMHhkMThjLCAweDExNzAsIDB4MDgwYywKKwkweGNhYWQsIDB4MDE0OCwgMHgyMDA5LCAweDAwNGMsIDB4MDgwYywgMHhhZDRkLCAweDkwODUsIDB4MDAwMSwKKwkweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNkOCwgMHgyOTAwLCAweDYwMTYsIDB4MGM5MCwKKwkweDIwMDksIDB4MDA0ZCwgMHgwMDEwLCAweDIwMDksIDB4MDA0ZSwgMHgwMGY2LCAweDAwYzYsIDB4MDA0NiwKKwkweDAwMTYsIDB4MDgwYywgMHhhYzVhLCAweDJjNzgsIDB4MDVhMCwgMHg3ZTVlLCAweDJiMDAsIDB4NzgxMiwKKwkweDc4MjMsIDB4MDAwMywgMHgwMDE2LCAweDIwMjEsIDB4MDAwNSwgMHgwODBjLCAweGNhYmYsIDB4MDAxZSwKKwkweDkxODYsIDB4MDA0ZCwgMHgwMTE4LCAweDkxODYsIDB4MDA0ZSwgMHgwMTQ4LCAweDIwMDEsIDB4MTk3ZiwKKwkweDIwMGMsIDB4ZDFmYywgMHgwMTY4LCAweDJmNjAsIDB4MDgwYywgMHhhY2IwLCAweDAwZDAsIDB4MjAwMSwKKwkweDE5N2UsIDB4MjAwYywgMHhkMWZjLCAweDAxMjAsIDB4MmY2MCwgMHgwODBjLCAweGFjYjAsIDB4MDA4OCwKKwkweDJmNjAsIDB4MDgwYywgMHg1NzQ2LCAweDAxMzgsIDB4ZDE4YywgMHgxMTE4LCAweDA0ZjEsIDB4MDE0OCwKKwkweDAwMTAsIDB4MjkwMCwgMHg3ODE2LCAweDAwMWUsIDB4MDAxNiwgMHgwODBjLCAweGFkNGQsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAxZSwgMHgwMDRlLCAweDAwY2UsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBjNiwKKwkweDAwNDYsIDB4MDgwYywgMHhhYzVhLCAweDJjNzgsIDB4MDUwOCwgMHg3ZTVlLCAweDJiMDAsIDB4NzgxMiwKKwkweDc4MjMsIDB4MDAwMywgMHgwMDk2LCAweDIwMjEsIDB4MDAwNCwgMHgwNDg5LCAweDAwOWUsIDB4MjAwMSwKKwkweDE5N2QsIDB4MjAwYywgMHhkMWZjLCAweDAxMjAsIDB4MmY2MCwgMHgwODBjLCAweGFjYjAsIDB4MDA2MCwKKwkweDJmNjAsIDB4MDgwYywgMHg1NzQ2LCAweDAxMjAsIDB4ZDE4YywgMHgxMTYwLCAweDAwNzEsIDB4MDEzMCwKKwkweDIwMDksIDB4MDA1MiwgMHgwODBjLCAweGFkNGQsIDB4OTA4NSwgMHgwMDAxLCAweDAwNGUsIDB4MDBjZSwKKwkweDAwZmUsIDB4MDAwNSwgMHgyOTAwLCAweDc4MTYsIDB4MGM5OCwgMHgwMGM2LCAweDA4MGMsIDB4NGFmMiwKKwkweDAwY2UsIDB4MTEyMCwgMHgwODBjLCAweGFjYjAsIDB4OTAwNiwgMHgwMDA1LCAweGE4NjcsIDB4MDAwMCwKKwkweGE4NmIsIDB4ODAwMCwgMHgyOTAwLCAweDYwMTYsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDA5NiwKKwkweDAwNzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHhhOTFlLCAweDA4MGMsIDB4Njg3NSwKKwkweDAxNTgsIDB4MjAwMSwgMHhjYWM2LCAweDAwMDYsIDB4OTAwZSwgMHgyNDAwLCAweDA4MGMsIDB4NzAyMiwKKwkweDA4MGMsIDB4NmRlZSwgMHgwMDBlLCAweDA4MDcsIDB4MjQxOCwgMHgwODBjLCAweDk2NDAsIDB4YmFhMCwKKwkweDAwODYsIDB4MjA0MSwgMHgwMDAxLCAweDIwMzksIDB4MDAwMSwgMHgyNjA4LCAweDA4MGMsIDB4OTQ1NywKKwkweDAwOGUsIDB4MDgwYywgMHg5MzA2LCAweDJmMDgsIDB4MjY0OCwgMHgwODBjLCAweGUxNjcsIDB4YjkzYywKKwkweDgxZmYsIDB4MDkwYywgMHg5NTMwLCAweDA4MGMsIDB4YTkzYSwgMHgwMTJlLCAweDAwN2UsIDB4MDA5ZSwKKwkweDAwMDUsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweGFjNWEsIDB4MDE5MCwKKwkweDY2MGEsIDB4MmIwOCwgMHg2MTEyLCAweDA4MGMsIDB4Y2UxNSwgMHg2MDIzLCAweDAwMDEsIDB4MjkwMCwKKwkweDYwMTYsIDB4MjAwOSwgMHgwMDFmLCAweDA4MGMsIDB4YWQ0ZCwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwKKwkweDAwY2UsIDB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4YWQyMCwgMHgwMWI4LCAweDY2MGEsIDB4MmIwOCwgMHg2MTEyLCAweDA4MGMsIDB4Y2UxNSwKKwkweDYwMjMsIDB4MDAwOCwgMHgyOTAwLCAweDYwMTYsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4MTc3OCwKKwkweDAwZmUsIDB4MjAwOSwgMHgwMDIxLCAweDA4MGMsIDB4YWQ0ZCwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwKKwkweDAwY2UsIDB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4MjAwOSwgMHgwMDNkLCAweDAwYzYsIDB4MDEyNiwKKwkweDAwMTYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4YWM1YSwgMHgwMTk4LCAweDY2MGEsIDB4MmIwOCwKKwkweDYxMTIsIDB4MDgwYywgMHhjZTE1LCAweDYwMjMsIDB4MDAwMSwgMHgyOTAwLCAweDYwMTYsIDB4MDAxZSwKKwkweDAwMTYsIDB4MDgwYywgMHhhZDRkLCAweDkwODUsIDB4MDAwMSwgMHgwMDFlLCAweDAxMmUsIDB4MDBjZSwKKwkweDAwMDUsIDB4OTAwNiwgMHgwY2QwLCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweGFkMjAsIDB4MDE4OCwgMHgyYjA4LCAweDYxMTIsIDB4MDgwYywgMHhjZTE1LCAweDYwMjMsIDB4MDAwMSwKKwkweDI5MDAsIDB4NjAxNiwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHhhZDRkLCAweDkwODUsIDB4MDAwMSwKKwkweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNkOCwgMHgyMDA5LCAweDAwNDQsIDB4MDgzMCwKKwkweDIwMDksIDB4MDA0OSwgMHgwODE4LCAweDAwMjYsIDB4MDBiNiwgMHg2MjEwLCAweDIyNTgsIDB4YmEzYywKKwkweDgyZmYsIDB4MDExOCwgMHg4MjExLCAweGJhM2UsIDB4MTE0MCwgMHhiOGQwLCAweDkwMDUsIDB4MDEyOCwKKwkweGI4ODgsIDB4OTAwNSwgMHgxMTEwLCAweGI4OGIsIDB4MDAwMSwgMHgwMGJlLCAweDAwMmUsIDB4MDAwNSwKKwkweDAwMDYsIDB4MDAxNiwgMHg2MDA0LCAweDkwOGUsIDB4MDAwMiwgMHgwMTQwLCAweDkwOGUsIDB4MDAwMywKKwkweDAxMjgsIDB4OTA4ZSwgMHgwMDA0LCAweDAxMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMWUsIDB4MDAwZSwKKwkweDAwMDUsIDB4MDAwNiwgMHgwMDg2LCAweDAwOTYsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDQsIDB4MDFhOCwKKwkweDYwMTQsIDB4OTA0ZCwgMHgwODBjLCAweGM5N2EsIDB4MDE4MCwgMHhhODY0LCAweDkwODYsIDB4MDEzOSwKKwkweDAxNzAsIDB4NjAyMCwgMHg5MGM2LCAweDAwMDMsIDB4MDE0MCwgMHg5MGM2LCAweDAwMDIsIDB4MDEyOCwKKwkweGE4NjgsIDB4ZDBmYywgMHgwMTEwLCAweDkwMDYsIDB4MDAxMCwgMHg5MDg1LCAweDAwMDEsIDB4MDA5ZSwKKwkweDAwOGUsIDB4MDAwZSwgMHgwMDA1LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweGFkMjAsIDB4MDE5OCwgMHgyYjA4LCAweDYxMTIsIDB4MDgwYywgMHhjZTE1LCAweDYwMjMsIDB4MDAwMSwKKwkweDI5MDAsIDB4NjAxNiwgMHgwODBjLCAweDMyNDAsIDB4MjAwOSwgMHgwMDI4LCAweDA4MGMsIDB4YWQ0ZCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4OTE4NiwKKwkweDAwMTUsIDB4MTFhOCwgMHgyMDExLCAweDE4MjQsIDB4MjIwNCwgMHg5MDg2LCAweDAwNzQsIDB4MTE3OCwKKwkweDAwYjYsIDB4MDgwYywgMHhiOGU3LCAweDAwYmUsIDB4MDgwYywgMHhiYjBhLCAweDYwMDMsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDAyOSwgMHgwODBjLCAweDkyYjcsIDB4MDgwYywgMHg5NzM4LCAweDAwNzgsIDB4NjAxNCwKKwkweDAwOTYsIDB4MjA0OCwgMHhhODY4LCAweDAwOWUsIDB4ZDBmYywgMHgwMTQ4LCAweDIwMDEsIDB4MDAwMSwKKwkweDA4MGMsIDB4Y2ZkNCwgMHgwODBjLCAweGI2OTMsIDB4MDgwYywgMHhhY2IwLCAweDAwMDUsIDB4MDA5NiwKKwkweDYwMTQsIDB4OTA0ZCwgMHgwOTBjLCAweDBkN2QsIDB4YTg3YiwgMHgwMDMwLCAweGE4ODMsIDB4MDAwMCwKKwkweGE4OTcsIDB4NDAwNSwgMHhhODliLCAweDAwMDQsIDB4YTg2NywgMHgwMTM5LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDgwYywgMHg2ZGVlLCAweDAxMmUsIDB4MDA5ZSwgMHgwODBjLCAweGFjYjAsIDB4MGMzMCwKKwkweDAwOTYsIDB4OTE4NiwgMHgwMDE2LCAweDExMjgsIDB4MjAwMSwgMHgwMDA0LCAweDA4MGMsIDB4NjVlMywKKwkweDAwZTgsIDB4OTE4NiwgMHgwMDE1LCAweDE1MTAsIDB4MjAxMSwgMHgxODI0LCAweDIyMDQsIDB4OTA4NiwKKwkweDAwMTQsIDB4MTFlMCwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHgwODBjLCAweDY3MmUsIDB4MDBiZSwKKwkweDA4MGMsIDB4YmJkYiwgMHgxMTk4LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4OTAsIDB4MDBiZSwKKwkweDkwMDUsIDB4MDE2MCwgMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg2NWUzLCAweDYwMTQsIDB4MjA0OCwKKwkweGE4NjgsIDB4ZDBmYywgMHgwMTcwLCAweDA4MGMsIDB4YjBiZiwgMHgwMDQ4LCAweDYwMTQsIDB4MjA0OCwKKwkweGE4NjgsIDB4ZDBmYywgMHgwNTI4LCAweDA4MGMsIDB4YjY5MywgMHgwODBjLCAweGFjYjAsIDB4MDA5ZSwKKwkweDAwMDUsIDB4NjAxNCwgMHg2MzEwLCAweDIzNTgsIDB4OTA0ZCwgMHgwOTBjLCAweDBkN2QsIDB4YTg3YiwKKwkweDAwMDAsIDB4YTg4MywgMHgwMDAwLCAweGE4OTcsIDB4NDAwMCwgMHg5MDBlLCAweDA4MGMsIDB4Njk4NiwKKwkweDExMDgsIDB4YzE4NSwgMHhiODAwLCAweGQwYmMsIDB4MDEwOCwgMHhjMThkLCAweGE5OWEsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDZkZWUsIDB4MDEyZSwgMHgwODBjLCAweGFjYjAsIDB4MDhmOCwKKwkweDYwMTQsIDB4OTA0ZCwgMHgwOTBjLCAweDBkN2QsIDB4YTg3YiwgMHgwMDMwLCAweGE4ODMsIDB4MDAwMCwKKwkweGE4OTcsIDB4NDAwNSwgMHhhODliLCAweDAwMDQsIDB4YTg2NywgMHgwMTM5LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDgwYywgMHg2ZGVlLCAweDAxMmUsIDB4MDgwYywgMHhhY2IwLCAweDA4NDAsIDB4YTg3OCwKKwkweDkwODYsIDB4MDAwNSwgMHgxMTA4LCAweDAwMDksIDB4MDAwNSwgMHhhODgwLCAweGMwYWQsIDB4YTg4MiwKKwkweDAwMDUsIDB4NjA0YiwgMHgwMDAwLCAweDYwMTcsIDB4MDAwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywKKwkweDAwNTAsIDB4MjAwOSwgMHg4MDIzLCAweDA4MGMsIDB4OTJiMCwgMHgwMDA1LCAweDAwYzYsIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgwMTMwLCAweDAwNjYsIDB4NjAyMCwKKwkweDkwODQsIDB4MDAwZiwgMHgwMDFiLCAweDAwNmUsIDB4MDBjZSwgMHgwMDA1LCAweGM2N2IsIDB4Y2NiOCwKKwkweGNjYjgsIDB4Y2NiYiwgMHhlNDk0LCAweGU0YWYsIDB4ZTRiMiwgMHhjNjdiLCAweGM2N2IsIDB4YzY3YiwKKwkweGM2N2IsIDB4YzY3YiwgMHhjNjdiLCAweGM2N2IsIDB4YzY3YiwgMHhjNjdiLCAweDA4MGMsIDB4MGQ3ZCwKKwkweGEwMDEsIDB4YTAwMSwgMHgwMDA1LCAweDAwOTYsIDB4NjAxNCwgMHg5MDRkLCAweDAxMTgsIDB4YTg3YywKKwkweGQwZTQsIDB4MTExMCwgMHgwMDllLCAweDAwMTAsIDB4MDA5ZSwgMHgwMDA1LCAweDYwMTAsIDB4MDBiNiwKKwkweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MDU1MCwgMHgyMDAxLCAweDE4MzQsIDB4MjAwNCwKKwkweDkwMDUsIDB4MTU0MCwgMHgwMGY2LCAweDJjNzgsIDB4MDgwYywgMHhhYzVhLCAweDA1MDgsIDB4NzgxMCwKKwkweDYwMTIsIDB4MDgwYywgMHhjZTE1LCAweDc4MjAsIDB4OTA4NiwgMHgwMDAzLCAweDAxMjgsIDB4NzgwOCwKKwkweDYwM2EsIDB4MmYwMCwgMHg2MDNlLCAweDAwMjAsIDB4NzgwOCwgMHg2MDNlLCAweDJmMDAsIDB4NjAzYSwKKwkweDYwMmUsIDB4NjAyMywgMHgwMDAxLCAweDYwMDcsIDB4MDAzNSwgMHg2MDAzLCAweDAwMDEsIDB4Nzk1YywKKwkweDYxNWUsIDB4MjAwOSwgMHg4MDIwLCAweDA4MGMsIDB4OTJiMCwgMHgyZjYwLCAweDAwZmUsIDB4MDAwNSwKKwkweDJmNjAsIDB4MDBmZSwgMHgyMDAxLCAweDE5ODcsIDB4MjAwNCwgMHg2MDRhLCAweDAwMDUsIDB4MDAxNiwKKwkweDAwOTYsIDB4NjgxNCwgMHgyMDQ4LCAweDY4MWMsIDB4ZDBmYywgMHhjMGZjLCAweDY4MWUsIDB4YTg3YywKKwkweDExMDgsIDB4ZDBlNCwgMHgwMTgwLCAweGMwZTQsIDB4YTg3ZSwgMHhhODc3LCAweDAwMDAsIDB4YTg5MywKKwkweDAwMDAsIDB4YTg4ZiwgMHgwMDAwLCAweGQwY2MsIDB4MDEzMCwgMHhjMGNjLCAweGE4N2UsIDB4YTg3OCwKKwkweDIwNDgsIDB4MDgwYywgMHgwZmY5LCAweDY4MzAsIDB4NjAzNiwgMHg5MDhlLCAweDAwMDEsIDB4MDE0OCwKKwkweDY4MDMsIDB4MDAwMiwgMHg5MDg2LCAweDAwMDUsIDB4MDE3MCwgMHg5MDA2LCAweDYwMmUsIDB4NjAzMiwKKwkweDAwZDAsIDB4NjgxYywgMHhjMDg1LCAweDY4MWUsIDB4NjgwMywgMHgwMDA0LCAweDY4MjQsIDB4YzBmNCwKKwkweDkwODUsIDB4MGMwMCwgMHg2ODI2LCAweDY4MTQsIDB4MjA0OCwgMHhhOGFjLCAweDY5MzgsIDB4OTEwMiwKKwkweGE4YjAsIDB4NjkzYywgMHg5MTAzLCAweDFlNDgsIDB4NjgzYywgMHg2MDJlLCAweDY4MzgsIDB4OTA4NCwKKwkweGZmZmMsIDB4NjgzYSwgMHg2MDMyLCAweDJkMDAsIDB4NjAzYSwgMHg2ODA4LCAweDYwM2UsIDB4NjkxMCwKKwkweDYxMTIsIDB4Njk1YywgMHg2MTVlLCAweDYwMjMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMzksIDB4NjAwMywKKwkweDAwMDEsIDB4MjAwOSwgMHg4MDIwLCAweDA4MGMsIDB4OTJiMCwgMHgwMDllLCAweDAwMWUsIDB4MDAwNSwKKwkweDYwMjQsIDB4ZDBkNCwgMHgwNTEwLCAweGQwZjQsIDB4MTFmOCwgMHg2MDM4LCAweDk0MGEsIDB4NjAzYywKKwkweDkzMDMsIDB4MDIzMCwgMHg5MTA1LCAweDAxMjAsIDB4NjAyNCwgMHhjMGQ0LCAweGMwZjUsIDB4MDA5OCwKKwkweDY0M2EsIDB4NjMzZSwgMHhhYzNlLCAweGFiNDIsIDB4MDA0NiwgMHgwMDM2LCAweDI0MDAsIDB4YWNhYywKKwkweDk0MDIsIDB4YTgzNiwgMHgyMzAwLCAweGFiYjAsIDB4OTMwMywgMHhhODNhLCAweDAwM2UsIDB4MDA0ZSwKKwkweDYwMjQsIDB4YzBkNCwgMHgwMDAwLCAweDYwMjYsIDB4MDAwNSwgMHhkMGY0LCAweDExMzgsIDB4YTgzYywKKwkweDYwM2EsIDB4YTg0MCwgMHg2MDNlLCAweDYwMjQsIDB4YzBmNSwgMHg2MDI2LCAweDAwMDUsIDB4MDAwNiwKKwkweDAwMTYsIDB4NjAwNCwgMHg5MDhlLCAweDAwMzQsIDB4MDFiOCwgMHg5MDhlLCAweDAwMzUsIDB4MDFhMCwKKwkweDkwOGUsIDB4MDAzNiwgMHgwMTg4LCAweDkwOGUsIDB4MDAzNywgMHgwMTcwLCAweDkwOGUsIDB4MDAzOCwKKwkweDAxNTgsIDB4OTA4ZSwgMHgwMDM5LCAweDAxNDAsIDB4OTA4ZSwgMHgwMDNhLCAweDAxMjgsIDB4OTA4ZSwKKwkweDAwM2IsIDB4MDExMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwKKwkweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwZTYsIDB4MjAwMSwgMHgxOTgxLCAweDIwMGMsIDB4ODAwMCwKKwkweDIwMTQsIDB4MjAwMSwgMHgwMDMyLCAweDA4MGMsIDB4OTFmOCwgMHgyMDAxLCAweDE5ODUsIDB4ODJmZiwKKwkweDExMTAsIDB4MjAxMSwgMHgwMDE0LCAweDIyMDIsIDB4MjAwMSwgMHgxOTgzLCAweDIwMGMsIDB4ODAwMCwKKwkweDIwMTQsIDB4MjA3MSwgMHgxOTZiLCAweDcxMWEsIDB4NzIxZSwgMHgyMDAxLCAweDAwNjQsIDB4MDgwYywKKwkweDkxZjgsIDB4MjAwMSwgMHgxOTg2LCAweDgyZmYsIDB4MTExMCwgMHgyMDExLCAweDAwMTQsIDB4MjIwMiwKKwkweDIwMDEsIDB4MTk4NywgMHg5Mjg4LCAweDAwMGEsIDB4MjEwMiwgMHgyMDAxLCAweDAwMTcsIDB4MDgwYywKKwkweGE5MGYsIDB4MjAwMSwgMHgxYThiLCAweDIxMDIsIDB4MjAwMSwgMHgwMDMyLCAweDA4MGMsIDB4MTZhMCwKKwkweDA4MGMsIDB4NmFiZSwgMHgwMGVlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwKKwkweDAwMDYsIDB4MDAxNiwgMHgwMGU2LCAweDIwMDEsIDB4MTk4NSwgMHgyMDAzLCAweDAwMjgsIDB4MjAwMSwKKwkweDE5ODYsIDB4MjAwMywgMHgwMDE0LCAweDIwNzEsIDB4MTk2YiwgMHg3MDFiLCAweDAwMDAsIDB4NzAxZiwKKwkweDA3ZDAsIDB4MjAwMSwgMHgxOTg3LCAweDIwMDksIDB4MDAxZSwgMHgyMTAyLCAweDIwMDEsIDB4MDAxNywKKwkweDA4MGMsIDB4YTkwZiwgMHgyMDAxLCAweDFhOGIsIDB4MjEwMiwgMHgyMDAxLCAweDAwMzIsIDB4MDgwYywKKwkweDE2YTAsIDB4MDBlZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgwMDk2LCAweDYwNjAsIDB4OTA0ZCwKKwkweDAxMTAsIDB4MDgwYywgMHgxMDc5LCAweDAwOWUsIDB4MDAwNSwgMHgwMDA1LCAweDAwYzYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweGFjNWEsIDB4MDE4MCwgMHgyYjA4LCAweDYxMTIsIDB4MGNhOSwKKwkweDYwMjMsIDB4MDAwMSwgMHgyOTAwLCAweDYwMTYsIDB4MjAwOSwgMHgwMDMzLCAweDA4MGMsIDB4YWQ0ZCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4MDA5NiwKKwkweDAwZTYsIDB4MDBmNiwgMHgyMDcxLCAweDE4MDAsIDB4OTE4NiwgMHgwMDE1LCAweDE1MDAsIDB4NzA5MCwKKwkweDkwODYsIDB4MDAxOCwgMHgxMWUwLCAweDYwMTQsIDB4MjA0OCwgMHhhYTNjLCAweGQyZTQsIDB4MTE2MCwKKwkweDJjNzgsIDB4MDgwYywgMHg5N2Y3LCAweDAxZDgsIDB4NzA3YywgMHhhYTUwLCAweDkyMDYsIDB4MTE2MCwKKwkweDcwODAsIDB4YWE1NCwgMHg5MjA2LCAweDExNDAsIDB4NjIxMCwgMHgwMGI2LCAweDIyNTgsIDB4YmFhMCwKKwkweDAwYmUsIDB4OTAwZSwgMHgwODBjLCAweDMyOGYsIDB4MDgwYywgMHhiMGJmLCAweDAwMjAsIDB4MDgwYywKKwkweGI2OTMsIDB4MDgwYywgMHhhY2IwLCAweDAwZmUsIDB4MDBlZSwgMHgwMDllLCAweDAwMDUsIDB4NzA2MCwKKwkweGFhNTQsIDB4OTIwNiwgMHgwZDQ4LCAweDBjODAsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4YWM1YSwgMHgwMTg4LCAweDJiMDgsIDB4NjExMiwgMHgwODBjLCAweGNlMTUsIDB4NjAyMywKKwkweDAwMDEsIDB4MjkwMCwgMHg2MDE2LCAweDIwMDksIDB4MDA0ZCwgMHgwODBjLCAweGFkNGQsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LCAweDAwYzYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwMDE2LCAweDA4MGMsIDB4YWM1YSwgMHgwMTgwLCAweDJiMDgsIDB4NjExMiwKKwkweDA4MGMsIDB4Y2UxNSwgMHg2MDIzLCAweDAwMDEsIDB4MjkwMCwgMHg2MDE2LCAweDAwMWUsIDB4MDgwYywKKwkweGFkNGQsIDB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweDAwMWUsIDB4OTAwNiwKKwkweDBjZDAsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDA0NiwgMHgwMDU2LCAweDAwNjYsIDB4MDA5NiwKKwkweDAwZTYsIDB4MDBmNiwgMHgyMDcxLCAweDE4MDAsIDB4OTE4NiwgMHgwMDE1LCAweDE1NjgsIDB4NzE5MCwKKwkweDYwMTQsIDB4MjA0OCwgMHhhODE0LCAweDgwMDMsIDB4OTEwNiwgMHgxNTMwLCAweDIwZTEsIDB4MDAwMCwKKwkweDIwMDEsIDB4MTk5ZiwgMHgyMDAzLCAweDAwMDAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4MzAsIDB4MjBhOCwKKwkweDg5MDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwOTQsIDB4MDAzZiwgMHgyMmU4LCAweDkwODQsIDB4ZmZjMCwKKwkweDkwODAsIDB4MDAxYiwgMHgyMGEwLCAweDIwMDEsIDB4MTk5ZiwgMHgwMDE2LCAweDIwMGMsIDB4MDgwYywKKwkweGQ2ZGYsIDB4MDAxZSwgMHhhODA0LCAweDkwMDUsIDB4MDExMCwgMHgyMDQ4LCAweDBjMzgsIDB4NjAxNCwKKwkweDIwNDgsIDB4YTg2NywgMHgwMTAzLCAweDAwMTAsIDB4MDgwYywgMHhiNjkzLCAweDA4MGMsIDB4YWNiMCwKKwkweDAwZmUsIDB4MDBlZSwgMHgwMDllLCAweDAwNmUsIDB4MDA1ZSwgMHgwMDRlLCAweDAwM2UsIDB4MDAyZSwKKwkweDAwMWUsIDB4MDAwNSwgMHgwMDk2LCAweDAwZTYsIDB4MDBmNiwgMHgyMDcxLCAweDE4MDAsIDB4OTE4NiwKKwkweDAwMTUsIDB4MTFiOCwgMHg3MDkwLCAweDkwODYsIDB4MDAwNCwgMHgxMTk4LCAweDYwMTQsIDB4MjA0OCwKKwkweDJjNzgsIDB4MDgwYywgMHg5N2Y3LCAweDAxYTgsIDB4NzA3YywgMHhhYTc0LCAweDkyMDYsIDB4MTEzMCwKKwkweDcwODAsIDB4YWE3OCwgMHg5MjA2LCAweDExMTAsIDB4MDgwYywgMHgzMjQwLCAweDA4MGMsIDB4YjBiZiwKKwkweDAwMjAsIDB4MDgwYywgMHhiNjkzLCAweDA4MGMsIDB4YWNiMCwgMHgwMGZlLCAweDAwZWUsIDB4MDA5ZSwKKwkweDAwMDUsIDB4NzA2MCwgMHhhYTc4LCAweDkyMDYsIDB4MGQ3OCwgMHgwYzgwLCAweDAwOTYsIDB4MDBlNiwKKwkweDAwZjYsIDB4MjA3MSwgMHgxODAwLCAweDkxODYsIDB4MDAxNSwgMHgxNTUwLCAweDcwOTAsIDB4OTA4NiwKKwkweDAwMDQsIDB4MTUzMCwgMHg2MDE0LCAweDIwNDgsIDB4MmM3OCwgMHgwODBjLCAweDk3ZjcsIDB4MDVmMCwKKwkweDcwN2MsIDB4YWFjYywgMHg5MjA2LCAweDExODAsIDB4NzA4MCwgMHhhYWQwLCAweDkyMDYsIDB4MTE2MCwKKwkweDA4MGMsIDB4MzI0MCwgMHgwMDE2LCAweGE5OTgsIDB4YWFiMCwgMHg5Mjg0LCAweDEwMDAsIDB4YzBmZCwKKwkweDA4MGMsIDB4NTZlNywgMHgwMDFlLCAweDAwMTAsIDB4MDgwYywgMHg1NGNhLCAweDA4MGMsIDB4Yzk3YSwKKwkweDA1MDgsIDB4YTg3YiwgMHgwMDAwLCAweGE4ODMsIDB4MDAwMCwgMHhhODk3LCAweDQwMDAsIDB4MDA4MCwKKwkweDA4MGMsIDB4Yzk3YSwgMHgwMWI4LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweDU0Y2EsIDB4MWQ3MCwKKwkweGE4N2IsIDB4MDAzMCwgMHhhODgzLCAweDAwMDAsIDB4YTg5NywgMHg0MDA1LCAweGE4OWIsIDB4MDAwNCwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGE4NjcsIDB4MDEzOSwgMHgwODBjLCAweDZkZWUsIDB4MDEyZSwKKwkweDA4MGMsIDB4YWNiMCwgMHgwMGZlLCAweDAwZWUsIDB4MDA5ZSwgMHgwMDA1LCAweDcwNjAsIDB4YWFkMCwKKwkweDkyMDYsIDB4MDkzMCwgMHgwODg4LCAweDAwMTYsIDB4MDAyNiwgMHhhODdjLCAweGQwYWMsIDB4MDE3OCwKKwkweGE5MzgsIDB4YWEzNCwgMHgyMTAwLCAweDkyMDUsIDB4MDE1MCwgMHhhODkwLCAweDkxMDYsIDB4MTExOCwKKwkweGE4OGMsIDB4OTIwNiwgMHgwMTIwLCAweGE5OTIsIDB4YWE4ZSwgMHg5MDg1LCAweDAwMDEsIDB4MDAyZSwKKwkweDAwMWUsIDB4MDAwNSwgMHgwMGI2LCAweDAwZDYsIDB4MDAzNiwgMHgwODBjLCAweGM5N2EsIDB4MDkwNCwKKwkweGNmZDAsIDB4MDA5NiwgMHg2MzE0LCAweDIzNDgsIDB4YTg3YSwgMHhhOTgyLCAweDkyOWUsIDB4NDAwMCwKKwkweDE1ODAsIDB4NjMxMCwgMHgwMGM2LCAweDIzNTgsIDB4MjAwOSwgMHgwMDAwLCAweGE4NjgsIDB4ZDBmNCwKKwkweDExNDAsIDB4MDgwYywgMHg2OTg2LCAweDExMDgsIDB4YzE4NSwgMHhiODAwLCAweGQwYmMsIDB4MDEwOCwKKwkweGMxOGQsIDB4YWE5NiwgMHhhOTlhLCAweDIwYTksIDB4MDAwNCwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywKKwkweDkwODAsIDB4MDAzMSwgMHgyMGEwLCAweGI4YzQsIDB4MjBlMCwgMHhiOGM4LCAweDkwODAsIDB4MDAwNiwKKwkweDIwOTgsIDB4MDgwYywgMHgwZmM0LCAweDIwYTksIDB4MDAwNCwgMHhhODVjLCAweDkwODAsIDB4MDAzNSwKKwkweDIwYTAsIDB4YjhjOCwgMHg5MDgwLCAweDAwMGEsIDB4MjA5OCwgMHgwODBjLCAweDBmYzQsIDB4MDBjZSwKKwkweDAwOTAsIDB4YWE5NiwgMHgzOTE4LCAweDkzOTgsIDB4MDAwNywgMHgyMzFjLCAweDYwMDQsIDB4OTA4NiwKKwkweDAwMTYsIDB4MDExMCwgMHhhODliLCAweDAwMDQsIDB4YWJhMiwgMHg2MzEwLCAweDIzNTgsIDB4YjgwNCwKKwkweDkwODQsIDB4MDBmZiwgMHhhODllLCAweDA4MGMsIDB4NmRlMiwgMHg2MDE3LCAweDAwMDAsIDB4MDA5ZSwKKwkweDAwM2UsIDB4MDBkZSwgMHgwMGJlLCAweDAwMDUsIDB4MDAyNiwgMHgwMDM2LCAweDAwNDYsIDB4MDBiNiwKKwkweDAwOTYsIDB4MDBmNiwgMHg2MjE0LCAweDIyNDgsIDB4NjIxMCwgMHgyMjU4LCAweDIwNzksIDB4MDI2MCwKKwkweDkwOTYsIDB4MDAwMCwgMHgxMWEwLCAweGI4MTQsIDB4OTA4NCwgMHgwMGZmLCAweDkwMGUsIDB4MDgwYywKKwkweDI2NjEsIDB4MjExOCwgMHg4MzFmLCAweDkzOWMsIDB4ZmYwMCwgMHg3ODM4LCAweDkwODQsIDB4MDBmZiwKKwkweDkzMWQsIDB4N2MzYywgMHgyMDExLCAweDgwMTgsIDB4MDgwYywgMHg0YjUyLCAweDAwYTgsIDB4OTA5NiwKKwkweDAwMDEsIDB4MTE0OCwgMHg4OWZmLCAweDAxODAsIDB4YTg5YiwgMHgwMDBkLCAweDc4MzgsIDB4YThhNiwKKwkweDc4M2MsIDB4YThhYSwgMHgwMDQ4LCAweDkwOTYsIDB4MDAwMiwgMHgxMTMwLCAweGE4OWIsIDB4MDAwZCwKKwkweDc4MzgsIDB4YThhNiwgMHg3ODNjLCAweGE4YWEsIDB4MDBmZSwgMHgwMDllLCAweDAwYmUsIDB4MDA0ZSwKKwkweDAwM2UsIDB4MDAyZSwgMHgwMDA1LCAweDAwYzYsIDB4MDAyNiwgMHgwMDE2LCAweDkxODYsIDB4MDAzNSwKKwkweDAxMTAsIDB4NmEzOCwgMHgwMDA4LCAweDZhMmMsIDB4MDgwYywgMHhjOTY4LCAweDAxZjAsIDB4MjI2MCwKKwkweDYxMjAsIDB4OTE4NiwgMHgwMDAzLCAweDAxMTgsIDB4OTE4NiwgMHgwMDA2LCAweDExOTAsIDB4NjgzOCwKKwkweDkyMDYsIDB4MDE0MCwgMHg2ODNjLCAweDkyMDYsIDB4MTE2MCwgMHg2MTA4LCAweDY4MzgsIDB4OTEwNiwKKwkweDExNDAsIDB4MDAyMCwgMHg2MDA4LCAweDY5M2MsIDB4OTEwNiwgMHgxMTE4LCAweDYwMTAsIDB4NjkxMCwKKwkweDkxMDYsIDB4MDAxZSwgMHgwMDJlLCAweDAwY2UsIDB4MDAwNSwgMHg5MDg1LCAweDAwMDEsIDB4MGNjOCwKKwkweGE5NzQsIDB4ZDFjYywgMHgwMTg4LCAweDkxOGMsIDB4MDBmZiwgMHg5MThlLCAweDAwMDIsIDB4MTE2MCwKKwkweGE5YTgsIDB4OTE4YywgMHgwZjAwLCAweDgxMGYsIDB4OTE4ZSwgMHgwMDAxLCAweDExMjgsIDB4YTgzNCwKKwkweGE5MzgsIDB4OTExNSwgMHgxOTBjLCAweGJmOTYsIDB4MDAwNSwgMHgwMDM2LCAweDIwMTksIDB4MDAwMSwKKwkweDAwMTAsIDB4MDAzNiwgMHg5MDFlLCAweDA0OTksIDB4MDFlMCwgMHgwODBjLCAweGM5N2EsIDB4MDFjOCwKKwkweDA4MGMsIDB4Y2I2YiwgMHg2MDM3LCAweDQwMDAsIDB4NjAxNCwgMHg2MDE3LCAweDAwMDAsIDB4MDA5NiwKKwkweDIwNDgsIDB4YTg3YywgMHgwODBjLCAweGNiOTEsIDB4MTExOCwgMHgwODBjLCAweGI2OTMsIDB4MDA0MCwKKwkweGE4NjcsIDB4MDEwMywgMHhhODc3LCAweDAwMDAsIDB4ODNmZiwgMHgxMTI5LCAweDA4MGMsIDB4NmRlZSwKKwkweDAwOWUsIDB4MDAzZSwgMHgwMDA1LCAweGE4ODAsIDB4ZDBiNCwgMHgwMTI4LCAweGE4N2IsIDB4MDAwNiwKKwkweGMwZWMsIDB4YTg4MiwgMHgwMDQ4LCAweGQwYmMsIDB4MDExOCwgMHhhODdiLCAweDAwMDIsIDB4MDAyMCwKKwkweGE4N2IsIDB4MDAwNSwgMHgwODBjLCAweGNjODUsIDB4YTg3NywgMHgwMDAwLCAweDAwMDUsIDB4MjAwMSwKKwkweDE4MTAsIDB4MjAwNCwgMHhkMGVjLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweDE4MTAsIDB4MjAwNCwKKwkweGQwZjQsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHgxODEwLCAweDIwMDQsIDB4ZDBlNCwKKwkweDAwMGUsIDB4MDAwNSwgMHgwMDM2LCAweDAwNDYsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YmJhMCwKKwkweDAwYmUsIDB4MjAyMSwgMHgwMDA3LCAweDA4MGMsIDB4NGQwOSwgMHgwMDRlLCAweDAwM2UsIDB4MDAwNSwKKwkweDBjNTEsIDB4MWQ4MSwgMHgwMDA1LCAweDIwMDEsIDB4MTk4NSwgMHgyMDA0LCAweDYwMWEsIDB4MDAwNSwKKwkweDIwMDEsIDB4MTk4NywgMHgyMDA0LCAweDYwNGEsIDB4MDAwNSwgMHgwODBjLCAweGFjYjAsIDB4MDgwNCwKKwkweDk3MzgsIDB4NjExYywgMHhkMWZjLCAweGE5N2MsIDB4MTEwOCwgMHhkMWU0LCAweDAwMDUsIDB4NjAxYywKKwkweGQwZmMsIDB4YTg3YywgMHgxMTA4LCAweGQwZTQsIDB4MDAwNSwgMHg2MDFjLCAweGQwZmMsIDB4YzBmYywKKwkweDYwMWUsIDB4YTg3YywgMHgxMTA4LCAweGQwZTQsIDB4MDAwNSwgMHg2MDQ0LCAweGQwZmMsIDB4MTEzOCwKKwkweGQwYmMsIDB4MDE5OCwgMHhjMGJjLCAweDYwNDYsIDB4NjAwMywgMHgwMDAyLCAweDAwNzAsIDB4ZDBhYywKKwkweDExNjAsIDB4ZDBkYywgMHgxMTI4LCAweDkwOGMsIDB4MDAwZiwgMHg5MTg2LCAweDAwMDUsIDB4MTExOCwKKwkweDYwMDMsIDB4MDAwMywgMHgwMDEwLCAweDYwMDMsIDB4MDAwMSwgMHgwMDA1LCAweDAwYjYsIDB4MDA2NiwKKwkweDYwMDAsIDB4OTBiMiwgMHgwMDE2LCAweDFhMGMsIDB4MGQ3ZCwgMHgwMDFiLCAweDAwNmUsIDB4MDBiZSwKKwkweDAwMDUsIDB4ZDEwOSwgMHhkODNhLCAweGQ5OGIsIDB4ZDEwOSwgMHhkMTA5LCAweGQxMDksIDB4ZDEwOSwKKwkweGQxMDksIDB4ZDE0MCwgMHhkYTBmLCAweGQxMDksIDB4ZDEwOSwgMHhkMTA5LCAweGQxMDksIDB4ZDEwOSwKKwkweGQxMDksIDB4MDgwYywgMHgwZDdkLCAweDAwNjYsIDB4NjAwMCwgMHg5MGIyLCAweDAwMTYsIDB4MWEwYywKKwkweDBkN2QsIDB4MDAxMywgMHgwMDZlLCAweDAwMDUsIDB4ZDEyNCwgMHhkZjMwLCAweGQxMjQsIDB4ZDEyNCwKKwkweGQxMjQsIDB4ZDEyNCwgMHhkMTI0LCAweGQxMjQsIDB4ZGVkZiwgMHhkZjgyLCAweGQxMjQsIDB4ZTVjZiwKKwkweGU2MDMsIDB4ZTVjZiwgMHhlNjAzLCAweGQxMjQsIDB4MDgwYywgMHgwZDdkLCAweDYwMDAsIDB4OTA4MiwKKwkweDAwMTYsIDB4MWEwYywgMHgwZDdkLCAweDYwMDAsIDB4MDAwYSwgMHgwMDA1LCAweGQxM2UsIDB4ZGJlYywKKwkweGRjYjcsIDB4ZGNkYSwgMHhkZDU2LCAweGQxM2UsIDB4ZGU1MSwgMHhkZGRlLCAweGRhMTksIDB4ZGViNywKKwkweGRlY2MsIDB4ZDEzZSwgMHhkMTNlLCAweGQxM2UsIDB4ZDEzZSwgMHhkMTNlLCAweDA4MGMsIDB4MGQ3ZCwKKwkweDkxYjIsIDB4MDA1MywgMHgxYTBjLCAweDBkN2QsIDB4MjEwMCwgMHg5MWIyLCAweDAwNDAsIDB4MWEwNCwKKwkweGQ1YjAsIDB4MDAwMiwgMHhkMThhLCAweGQzN2UsIDB4ZDE4YSwgMHhkMThhLCAweGQxOGEsIDB4ZDM4NywKKwkweGQxOGEsIDB4ZDE4YSwgMHhkMThhLCAweGQxOGEsIDB4ZDE4YSwgMHhkMThhLCAweGQxOGEsIDB4ZDE4YSwKKwkweGQxOGEsIDB4ZDE4YSwgMHhkMThhLCAweGQxOGEsIDB4ZDE4YSwgMHhkMThhLCAweGQxOGEsIDB4ZDE4YSwKKwkweGQxOGEsIDB4ZDE4YywgMHhkMWYzLCAweGQyMDIsIDB4ZDI2NiwgMHhkMjkxLCAweGQzMGEsIDB4ZDM2OSwKKwkweGQxOGEsIDB4ZDE4YSwgMHhkMzhhLCAweGQxOGEsIDB4ZDE4YSwgMHhkMzlmLCAweGQzYWMsIDB4ZDE4YSwKKwkweGQxOGEsIDB4ZDE4YSwgMHhkMThhLCAweGQxOGEsIDB4ZDQ1MiwgMHhkMThhLCAweGQxOGEsIDB4ZDQ2NiwKKwkweGQxOGEsIDB4ZDE4YSwgMHhkNDIxLCAweGQxOGEsIDB4ZDE4YSwgMHhkMThhLCAweGQ0N2UsIDB4ZDE4YSwKKwkweGQxOGEsIDB4ZDE4YSwgMHhkNGZiLCAweGQxOGEsIDB4ZDE4YSwgMHhkMThhLCAweGQxOGEsIDB4ZDE4YSwKKwkweGQxOGEsIDB4ZDU3OCwgMHgwODBjLCAweDBkN2QsIDB4MDgwYywgMHg2YTliLCAweDExNTAsIDB4MjAwMSwKKwkweDE4MzcsIDB4MjAwNCwgMHhkMGNjLCAweDExMjgsIDB4OTA4NCwgMHgwMDA5LCAweDkwODYsIDB4MDAwOCwKKwkweDExNDAsIDB4NjAwNywgMHgwMDA5LCAweDYwMmYsIDB4MDAwOSwgMHg2MDE3LCAweDAwMDAsIDB4MDgwNCwKKwkweGQzNzcsIDB4MDgwYywgMHg2YTM3LCAweDAwZTYsIDB4MDBjNiwgMHgwMDM2LCAweDAwMjYsIDB4MDAxNiwKKwkweDYyMTAsIDB4MjI1OCwgMHhiYWEwLCAweDAwMjYsIDB4MjAxOSwgMHgwMDI5LCAweDA4MGMsIDB4YTkxZSwKKwkweDA4MGMsIDB4OTQzZCwgMHgwMDc2LCAweDkwM2UsIDB4MDgwYywgMHg5MzA2LCAweDJjMDgsIDB4MDgwYywKKwkweGUxNjcsIDB4MDA3ZSwgMHgwMDFlLCAweDA4MGMsIDB4YTkzYSwgMHgwMDFlLCAweDAwMmUsIDB4MDAzZSwKKwkweDAwY2UsIDB4MDBlZSwgMHg2NjEwLCAweDI2NTgsIDB4MDgwYywgMHg2NmEyLCAweGJlMDQsIDB4OTY4NCwKKwkweDAwZmYsIDB4OTA4MiwgMHgwMDA2LCAweDEyNjgsIDB4MDAxNiwgMHgwMDI2LCAweDYyMTAsIDB4MDBiNiwKKwkweDIyNTgsIDB4YmFhMCwgMHgwMGJlLCAweDJjMDgsIDB4MDgwYywgMHhlODJjLCAweDAwMmUsIDB4MDAxZSwKKwkweDExNzgsIDB4MDgwYywgMHhlMDk1LCAweDE5MDQsIDB4ZDI1ZSwgMHgwODBjLCAweGUwMzEsIDB4MTEyMCwKKwkweDYwMDcsIDB4MDAwOCwgMHgwODA0LCAweGQzNzcsIDB4NjAwNywgMHgwMDA5LCAweDA4MDQsIDB4ZDM3NywKKwkweDA4MGMsIDB4ZTJjOCwgMHgwMTI4LCAweDA4MGMsIDB4ZTA5NSwgMHgwZDc4LCAweDA4MDQsIDB4ZDI1ZSwKKwkweDYwMTcsIDB4MTkwMCwgMHgwYzg4LCAweDA4MGMsIDB4MzM3NywgMHgxOTA0LCAweGQ1YWQsIDB4NjEwNiwKKwkweDA4MGMsIDB4ZGZlMiwgMHg2MDA3LCAweDAwMDYsIDB4MDgwNCwgMHhkMzc3LCAweDYwMDcsIDB4MDAwNywKKwkweDA4MDQsIDB4ZDM3NywgMHgwODBjLCAweGU2M2YsIDB4MTkwNCwgMHhkNWFkLCAweDA4MGMsIDB4MzM3NywKKwkweDE5MDQsIDB4ZDVhZCwgMHgwMGQ2LCAweDY2MTAsIDB4MjY1OCwgMHhiZTA0LCAweDk2ODQsIDB4MDBmZiwKKwkweDkwODIsIDB4MDAwNiwgMHgxMjIwLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDY1Y2YsIDB4OTZiNCwKKwkweGZmMDAsIDB4ODYzNywgMHg5Njg2LCAweDAwMDYsIDB4MDE4OCwgMHg5Njg2LCAweDAwMDQsIDB4MDE3MCwKKwkweGJlMDQsIDB4OTZiNCwgMHgwMGZmLCAweDk2ODYsIDB4MDAwNiwgMHgwMTQwLCAweDk2ODYsIDB4MDAwNCwKKwkweDAxMjgsIDB4OTY4NiwgMHgwMDA1LCAweDAxMTAsIDB4MDBkZSwgMHgwNDgwLCAweDAwZTYsIDB4MjA3MSwKKwkweDAyNjAsIDB4NzAzNCwgMHg5MDg0LCAweDAwMDMsIDB4MTE0MCwgMHg3MDM0LCAweDkwODIsIDB4MDAxNCwKKwkweDAyMjAsIDB4NzAzMCwgMHg5MDg0LCAweDAwMDMsIDB4MDEzMCwgMHgwMGVlLCAweDYwMTcsIDB4MDAwMCwKKwkweDYwMmYsIDB4MDAwNywgMHgwMGIwLCAweDAwZWUsIDB4MDgwYywgMHhlMGZkLCAweDExOTAsIDB4OTY4NiwKKwkweDAwMDYsIDB4MTE0MCwgMHgwMDI2LCAweDYyMTAsIDB4MjI1OCwgMHhiYWEwLCAweDkwMGUsIDB4MDgwYywKKwkweDMyOGYsIDB4MDAyZSwgMHgwODBjLCAweDY3MmUsIDB4NjAwNywgMHgwMDBhLCAweDAwZGUsIDB4MDgwNCwKKwkweGQzNzcsIDB4NjAwNywgMHgwMDBiLCAweDAwZGUsIDB4MDgwNCwgMHhkMzc3LCAweDA4MGMsIDB4MzI0MCwKKwkweDA4MGMsIDB4ZDBiMCwgMHg2MDA3LCAweDAwMDEsIDB4MDgwNCwgMHhkMzc3LCAweDA4MGMsIDB4ZTYzZiwKKwkweDE5MDQsIDB4ZDVhZCwgMHgwODBjLCAweDMzNzcsIDB4MTkwNCwgMHhkNWFkLCAweDIwNzEsIDB4MDI2MCwKKwkweDcwMzQsIDB4OTBiNCwgMHgwMDAzLCAweDE5NDgsIDB4OTBiMiwgMHgwMDE0LCAweDBhMzAsIDB4NzAzMCwKKwkweDkwODQsIDB4MDAwMywgMHgxOTEwLCAweDY2MTAsIDB4MjY1OCwgMHhiZTA0LCAweDk2ODYsIDB4MDcwNywKKwkweDA5ZTgsIDB4MDAyNiwgMHg2MjEwLCAweDIyNTgsIDB4YmFhMCwgMHg5MDBlLCAweDA4MGMsIDB4MzI4ZiwKKwkweDAwMmUsIDB4NjAwNywgMHgwMDBjLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweGU4MGMsIDB4MDgwNCwKKwkweGQzNzcsIDB4MDgwYywgMHg2YTliLCAweDExNDAsIDB4MjAwMSwgMHgxODM3LCAweDIwMDQsIDB4OTA4NCwKKwkweDAwMDksIDB4OTA4NiwgMHgwMDA4LCAweDExMTAsIDB4MDgwNCwgMHhkMTk5LCAweDA4MGMsIDB4NmEzNywKKwkweDY2MTAsIDB4MjY1OCwgMHhiZTA0LCAweDk2ODQsIDB4MDBmZiwgMHg5MDgyLCAweDAwMDYsIDB4MDZjOCwKKwkweDExMzgsIDB4MDAyNiwgMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg2NjBmLCAweDAwMmUsIDB4MDA1MCwKKwkweDk2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweDk2ODYsIDB4MDAwNCwgMHgwMTIwLCAweDk2ODYsIDB4MDAwNiwKKwkweDE5MDQsIDB4ZDI1ZSwgMHgwODBjLCAweGUxMGEsIDB4MTEyMCwgMHg2MDA3LCAweDAwMGUsIDB4MDgwNCwKKwkweGQzNzcsIDB4MDA0NiwgMHg2NDEwLCAweDI0NTgsIDB4YmNhMCwgMHgwMDQ2LCAweDA4MGMsIDB4MzI0MCwKKwkweDA4MGMsIDB4ZDBiMCwgMHgwMDRlLCAweDAwMTYsIDB4OTAwNiwgMHgyMDA5LCAweDE4NDgsIDB4MjEwYywKKwkweGQxYTQsIDB4MDE0OCwgMHgyMDA5LCAweDAwMjksIDB4MDgwYywgMHhlNDQ1LCAweDYwMTAsIDB4MjA1OCwKKwkweGI4MDAsIDB4YzBlNSwgMHhiODAyLCAweDAwMWUsIDB4MDA0ZSwgMHg2MDA3LCAweDAwMDEsIDB4MDgwNCwKKwkweGQzNzcsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4NjVjZiwgMHgwMTU2LCAweDAwMTYsIDB4MDAyNiwKKwkweDAwMzYsIDB4MjBhOSwgMHgwMDA0LCAweDIwMTksIDB4MTgwNSwgMHgyMDExLCAweDAyNzAsIDB4MDgwYywKKwkweGJjOGUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDE1ZSwgMHg5MDA1LCAweDAxNjgsIDB4OTZiNCwKKwkweGZmMDAsIDB4ODYzNywgMHg5NjgyLCAweDAwMDQsIDB4MGEwNCwgMHhkMjVlLCAweDk2ODIsIDB4MDAwNywKKwkweDBhMDQsIDB4ZDJiYSwgMHgwODA0LCAweGQyNWUsIDB4NjAxNywgMHgxOTAwLCAweDYwMDcsIDB4MDAwOSwKKwkweDA4MDQsIDB4ZDM3NywgMHgwODBjLCAweDZhOWIsIDB4MTE0MCwgMHgyMDAxLCAweDE4MzcsIDB4MjAwNCwKKwkweDkwODQsIDB4MDAwOSwgMHg5MDg2LCAweDAwMDgsIDB4MTExMCwgMHgwODA0LCAweGQxOTksIDB4MDgwYywKKwkweDZhMzcsIDB4NjYxMCwgMHgyNjU4LCAweGJlMDQsIDB4OTY4NCwgMHgwMGZmLCAweDAwMDYsIDB4OTA4NiwKKwkweDAwMDEsIDB4MDAwZSwgMHgwMTcwLCAweDkwODIsIDB4MDAwNiwgMHgwNjk4LCAweDAxNTAsIDB4OTZiNCwKKwkweGZmMDAsIDB4ODYzNywgMHg5Njg2LCAweDAwMDQsIDB4MDEyMCwgMHg5Njg2LCAweDAwMDYsIDB4MTkwNCwKKwkweGQyNWUsIDB4MDgwYywgMHhlMTM4LCAweDExMzAsIDB4MDgwYywgMHhlMDMxLCAweDExMTgsIDB4NjAwNywKKwkweDAwMTAsIDB4MDRlOCwgMHgwMDQ2LCAweDY0MTAsIDB4MjQ1OCwgMHhiY2EwLCAweDAwNDYsIDB4MDgwYywKKwkweDMyNDAsIDB4MDgwYywgMHhkMGIwLCAweDAwNGUsIDB4MDAxNiwgMHg5MDA2LCAweDIwMDksIDB4MTg0OCwKKwkweDIxMGMsIDB4ZDFhNCwgMHgwMTQ4LCAweDIwMDksIDB4MDAyOSwgMHgwODBjLCAweGU0NDUsIDB4NjAxMCwKKwkweDIwNTgsIDB4YjgwMCwgMHhjMGU1LCAweGI4MDIsIDB4MDAxZSwgMHgwMDRlLCAweDYwMDcsIDB4MDAwMSwKKwkweDAwZjAsIDB4MDgwYywgMHhlMmM4LCAweDAxNDAsIDB4OTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4OTY4NiwKKwkweDAwMDYsIDB4MDk3OCwgMHgwODA0LCAweGQyNWUsIDB4NjAxNywgMHgxOTAwLCAweDYwMDcsIDB4MDAwOSwKKwkweDAwNzAsIDB4MDgwYywgMHgzMzc3LCAweDE5MDQsIDB4ZDVhZCwgMHgwODBjLCAweGU2M2YsIDB4MTkwNCwKKwkweGQ1YWQsIDB4MDgwYywgMHhkNzdhLCAweDE5MDQsIDB4ZDI1ZSwgMHg2MDA3LCAweDAwMTIsIDB4NjAwMywKKwkweDAwMDEsIDB4MDgwYywgMHg5MmI3LCAweDA4MGMsIDB4OTczOCwgMHgwMDA1LCAweDYwMDcsIDB4MDAwMSwKKwkweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkyYjcsIDB4MDgwYywgMHg5NzM4LCAweDBjYjAsIDB4NjAwNywKKwkweDAwMDUsIDB4MGM2OCwgMHgwODBjLCAweGU2M2YsIDB4MTkwNCwgMHhkNWFkLCAweDA4MGMsIDB4MzM3NywKKwkweDE5MDQsIDB4ZDVhZCwgMHgwODBjLCAweGQ3N2EsIDB4MTkwNCwgMHhkMjVlLCAweDYwMDcsIDB4MDAyMCwKKwkweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkyYjcsIDB4MDgwYywgMHg5NzM4LCAweDAwMDUsIDB4MDgwYywKKwkweDMzNzcsIDB4MTkwNCwgMHhkNWFkLCAweDYwMDcsIDB4MDAyMywgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywKKwkweDkyYjcsIDB4MDgwYywgMHg5NzM4LCAweDAwMDUsIDB4MDgwYywgMHhlNjNmLCAweDE5MDQsIDB4ZDVhZCwKKwkweDA4MGMsIDB4MzM3NywgMHgxOTA0LCAweGQ1YWQsIDB4MDgwYywgMHhkNzdhLCAweDE5MDQsIDB4ZDI1ZSwKKwkweDAwMTYsIDB4MDAyNiwgMHgwMGU2LCAweDIwNzEsIDB4MDI2MCwgMHgyYzA4LCAweDIwMTEsIDB4MTgyMCwKKwkweDIyMTQsIDB4NzAzYywgMHg5MjA2LCAweDExZTAsIDB4MjAxMSwgMHgxODFmLCAweDIyMTQsIDB4NzAzOCwKKwkweDkwODQsIDB4MDBmZiwgMHg5MjA2LCAweDExYTAsIDB4NzI0MCwgMHgwODBjLCAweGM5NjgsIDB4MDU3MCwKKwkweDIyNjAsIDB4NjAwOCwgMHg5MDg2LCAweGZmZmYsIDB4MDEyMCwgMHg3MjQ0LCAweDYwMDgsIDB4OTIwNiwKKwkweDE1MjgsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDcsIDB4MTUwOCwgMHgwODBjLCAweGFjYjAsIDB4MDRhMCwKKwkweDcyNDQsIDB4OTI4NiwgMHhmZmZmLCAweDAxODAsIDB4MmMwOCwgMHgwODBjLCAweGM5NjgsIDB4MDFiMCwKKwkweDIyNjAsIDB4NzI0MCwgMHg2MDA4LCAweDkyMDYsIDB4MTE4OCwgMHg2MDEwLCAweDkxOTAsIDB4MDAwNCwKKwkweDIyMTQsIDB4OTIwNiwgMHgwMWI4LCAweDAwNTAsIDB4NzI0MCwgMHgyYzA4LCAweDkwMDYsIDB4MDgwYywKKwkweGU0MGYsIDB4MTE4MCwgMHg3MjQ0LCAweDkyODYsIDB4ZmZmZiwgMHgwMWIwLCAweDIxNjAsIDB4NjAwNywKKwkweDAwMjYsIDB4NjAxNywgMHgxNzAwLCAweDcyMTQsIDB4OTI5NiwgMHhmZmZmLCAweDExODAsIDB4NjAwNywKKwkweDAwMjUsIDB4MDA2OCwgMHg2MDIwLCAweDkwODYsIDB4MDAwNywgMHgxZDgwLCAweDYwMDQsIDB4OTA4NiwKKwkweDAwMjQsIDB4MTExMCwgMHgwODBjLCAweGFjYjAsIDB4MjE2MCwgMHg2MDA3LCAweDAwMjUsIDB4NjAwMywKKwkweDAwMDEsIDB4MDgwYywgMHg5MmI3LCAweDA4MGMsIDB4OTczOCwgMHgwMGVlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMDUsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4NjVjZiwgMHgwMTU2LCAweDAwMTYsIDB4MDAyNiwKKwkweDAwMzYsIDB4MjBhOSwgMHgwMDA0LCAweDIwMTksIDB4MTgwNSwgMHgyMDExLCAweDAyNzYsIDB4MDgwYywKKwkweGJjOGUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDE1ZSwgMHgwMTIwLCAweDYwMDcsIDB4MDAzMSwKKwkweDA4MDQsIDB4ZDM3NywgMHgwODBjLCAweGI4ZmYsIDB4MDgwYywgMHg3NTNkLCAweDExOTAsIDB4MDAwNiwKKwkweDAwMjYsIDB4MDAzNiwgMHgwODBjLCAweDc1NTcsIDB4MTEzOCwgMHgwODBjLCAweDc4NDAsIDB4MDgwYywKKwkweDYwOTIsIDB4MDgwYywgMHg3NDZlLCAweDAwMTAsIDB4MDgwYywgMHg3NTExLCAweDAwM2UsIDB4MDAyZSwKKwkweDAwMGUsIDB4MDAwNSwgMHgwODBjLCAweDMzNzcsIDB4MTkwNCwgMHhkNWFkLCAweDA4MGMsIDB4ZDc3YSwKKwkweDE5MDQsIDB4ZDI1ZSwgMHg2MTA2LCAweDA4MGMsIDB4ZDc5NiwgMHgxMTIwLCAweDYwMDcsIDB4MDAyYiwKKwkweDA4MDQsIDB4ZDM3NywgMHg2MDA3LCAweDAwMmMsIDB4MDgwNCwgMHhkMzc3LCAweDA4MGMsIDB4ZTYzZiwKKwkweDE5MDQsIDB4ZDVhZCwgMHgwODBjLCAweDMzNzcsIDB4MTkwNCwgMHhkNWFkLCAweDA4MGMsIDB4ZDc3YSwKKwkweDE5MDQsIDB4ZDI1ZSwgMHg2MTA2LCAweDA4MGMsIDB4ZDc5YiwgMHgxMTIwLCAweDYwMDcsIDB4MDAyZSwKKwkweDA4MDQsIDB4ZDM3NywgMHg2MDA3LCAweDAwMmYsIDB4MDgwNCwgMHhkMzc3LCAweDA4MGMsIDB4MzM3NywKKwkweDE5MDQsIDB4ZDVhZCwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHg2MDEwLCAweDIwNTgsIDB4YjkwNCwKKwkweDkxODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDYsIDB4MDE1OCwgMHg5MTg0LCAweGZmMDAsIDB4ODAwNywKKwkweDkwODYsIDB4MDAwNiwgMHgwMTI4LCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDA4MDQsIDB4ZDM3ZSwKKwkweDA4MGMsIDB4NTc0MiwgMHhkMGU0LCAweDA5MDQsIDB4ZDRmOCwgMHgyMDcxLCAweDAyNmMsIDB4NzAxMCwKKwkweDYwM2EsIDB4NzAxNCwgMHg2MDNlLCAweDcxMDgsIDB4NzIwYywgMHgwODBjLCAweDZhZDksIDB4MDE0MCwKKwkweDYwMTAsIDB4MjA1OCwgMHhiODEwLCAweDkxMDYsIDB4MTExOCwgMHhiODE0LCAweDkyMDYsIDB4MDUxMCwKKwkweDA4MGMsIDB4NmFkNSwgMHgxNWI4LCAweDIwNjksIDB4MTgwMCwgMHg2ODgwLCAweDkyMDYsIDB4MTU5MCwKKwkweDY4N2MsIDB4OTEwNiwgMHgxNTc4LCAweDcyMTAsIDB4MDgwYywgMHhjOTY4LCAweDA1OTAsIDB4MDgwYywKKwkweGQ2NjUsIDB4MDU3OCwgMHgwODBjLCAweGU0YzEsIDB4MDU2MCwgMHg2MjJlLCAweDYwMDcsIDB4MDAzNiwKKwkweDYwMDMsIDB4MDAwMSwgMHgyMDA5LCAweDgwMjAsIDB4MDgwYywgMHg5MmIwLCAweDAwY2UsIDB4MDBkZSwKKwkweDAwZWUsIDB4MDAwNSwgMHg3MjE0LCAweDkyODYsIDB4ZmZmZiwgMHgwMTUwLCAweDA4MGMsIDB4Yzk2OCwKKwkweDAxYzAsIDB4OTI4MCwgMHgwMDAyLCAweDIwMDQsIDB4NzExMCwgMHg5MTA2LCAweDExOTAsIDB4MDhlMCwKKwkweDcyMTAsIDB4MmMwOCwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywgMHhlNDBmLCAweDJjMTAsIDB4MjE2MCwKKwkweDAxNDAsIDB4MDg5MCwgMHg2MDA3LCAweDAwMzcsIDB4NjAyZiwgMHgwMDA5LCAweDYwMTcsIDB4MTUwMCwKKwkweDA4YjgsIDB4NjAwNywgMHgwMDM3LCAweDYwMmYsIDB4MDAwMywgMHg2MDE3LCAweDE3MDAsIDB4MDg4MCwKKwkweDYwMDcsIDB4MDAxMiwgMHgwODY4LCAweDA4MGMsIDB4MzM3NywgMHgxOTA0LCAweGQ1YWQsIDB4NjAxMCwKKwkweDIwNTgsIDB4YjgwNCwgMHg5MDg0LCAweGZmMDAsIDB4ODAwNywgMHg5MDg2LCAweDAwMDYsIDB4MTkwNCwKKwkweGQzN2UsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDgwYywgMHg1NzQyLCAweGQwZTQsIDB4MDkwNCwKKwkweGQ1NzAsIDB4MjA2OSwgMHgxODAwLCAweDIwNzEsIDB4MDI2YywgMHg3MDA4LCAweDYwM2EsIDB4NzIwYywKKwkweDYyM2UsIDB4OTI4NiwgMHhmZmZmLCAweDExNTAsIDB4NzIwOCwgMHgwMGM2LCAweDJjMDgsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDgwYywgMHhlNDBmLCAweDJjMTAsIDB4MDBjZSwgMHgwNWU4LCAweDA4MGMsIDB4Yzk2OCwKKwkweDA1ZDAsIDB4NzEwOCwgMHg5MjgwLCAweDAwMDIsIDB4MjAwNCwgMHg5MTA2LCAweDE1YTAsIDB4MDBjNiwKKwkweDAwMjYsIDB4MjI2MCwgMHgwODBjLCAweGM1NTksIDB4MDAyZSwgMHgwMGNlLCAweDcxMTgsIDB4OTE4YywKKwkweGZmMDAsIDB4ODEwZiwgMHg5MTg2LCAweDAwMDEsIDB4MDE3OCwgMHg5MTg2LCAweDAwMDUsIDB4MDExOCwKKwkweDkxODYsIDB4MDAwNywgMHgxMTk4LCAweDkyODAsIDB4MDAwNSwgMHgyMDA0LCAweDkwMDUsIDB4MDE3MCwKKwkweDA4MGMsIDB4ZDY2NSwgMHgwOTA0LCAweGQ0ZjEsIDB4MDA1NiwgMHg3NTEwLCAweDc2MTQsIDB4MDgwYywKKwkweGU0ZGEsIDB4MDA1ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMDA1LCAweDYwMDcsIDB4MDAzYiwKKwkweDYwMmYsIDB4MDAwOSwgMHg2MDE3LCAweDJhMDAsIDB4NjAwMywgMHgwMDAxLCAweDIwMDksIDB4ODAyMCwKKwkweDA4MGMsIDB4OTJiMCwgMHgwYzc4LCAweDYwMDcsIDB4MDAzYiwgMHg2MDJmLCAweDAwMDMsIDB4NjAxNywKKwkweDAzMDAsIDB4NjAwMywgMHgwMDAxLCAweDIwMDksIDB4ODAyMCwgMHgwODBjLCAweDkyYjAsIDB4MGMxMCwKKwkweDYwMDcsIDB4MDAzYiwgMHg2MDJmLCAweDAwMGIsIDB4NjAxNywgMHgwMDAwLCAweDA4MDQsIDB4ZDRjOCwKKwkweDAwZTYsIDB4MDAyNiwgMHgwODBjLCAweDZhOWIsIDB4MDU1MCwgMHgwODBjLCAweDZhMzcsIDB4MDgwYywKKwkweGU2YjEsIDB4MTUxOCwgMHgyMDcxLCAweDE4MDAsIDB4NzBkYywgMHg5MDg1LCAweDAwMDMsIDB4NzBkZSwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDcyYjAsIDB4OTI4NCwgMHgwMGZmLCAweDcwN2UsIDB4NzhlNiwKKwkweDkyODQsIDB4ZmYwMCwgMHg3MjgwLCAweDkyMDUsIDB4NzA4MiwgMHg3OGVhLCAweDAwZmUsIDB4NzBlNywKKwkweDAwMDAsIDB4MDgwYywgMHg2YWQ5LCAweDAxMjAsIDB4MjAxMSwgMHgxYTA4LCAweDIwMTMsIDB4MDdkMCwKKwkweGQwYWMsIDB4MTEyOCwgMHgwODBjLCAweDMwMTEsIDB4MDAxMCwgMHgwODBjLCAweGU2ZTMsIDB4MDAyZSwKKwkweDAwZWUsIDB4MDgwYywgMHhhY2IwLCAweDA4MDQsIDB4ZDM3ZCwgMHgwODBjLCAweGFjYjAsIDB4MDAwNSwKKwkweDI2MDAsIDB4MDAwMiwgMHhkNWM0LCAweGQ1ZjUsIDB4ZDYwNiwgMHhkNWM0LCAweGQ1YzQsIDB4ZDVjNiwKKwkweGQ2MTcsIDB4ZDVjNCwgMHhkNWM0LCAweGQ1YzQsIDB4ZDVlMywgMHhkNWM0LCAweGQ1YzQsIDB4ZDVjNCwKKwkweGQ2MjIsIDB4ZDYyZiwgMHhkNjYwLCAweGQ1YzQsIDB4MDgwYywgMHgwZDdkLCAweDA4MGMsIDB4ZTYzZiwKKwkweDFkMjAsIDB4MDgwYywgMHgzMzc3LCAweDFkMDgsIDB4MDgwYywgMHhkNzdhLCAweDExNDgsIDB4NzAzOCwKKwkweDYwMTYsIDB4NjAwNywgMHgwMDQ1LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkyYjcsIDB4MDAwNSwKKwkweDA4MGMsIDB4MzI0MCwgMHgwODBjLCAweGQwYjAsIDB4NjAwNywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwKKwkweDA4MGMsIDB4OTJiNywgMHgwMDA1LCAweDA4MGMsIDB4ZTYzZiwgMHgxOTM4LCAweDA4MGMsIDB4MzM3NywKKwkweDE5MjAsIDB4MDgwYywgMHhkNzdhLCAweDFkNjAsIDB4NzAzYywgMHg2MDE2LCAweDYwMDcsIDB4MDA0YSwKKwkweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkyYjcsIDB4MDAwNSwgMHgwODBjLCAweDMzNzcsIDB4MTkwNCwKKwkweGQ1YWQsIDB4MjAwOSwgMHgwMDQxLCAweDA4MGMsIDB4ZTZlYywgMHg2MDA3LCAweDAwNDcsIDB4NjAwMywKKwkweDAwMDEsIDB4MDgwYywgMHg5MmI3LCAweDA4MGMsIDB4OTczOCwgMHgwMDA1LCAweDA4MGMsIDB4MzM3NywKKwkweDE5MDQsIDB4ZDVhZCwgMHgyMDA5LCAweDAwNDIsIDB4MDgwYywgMHhlNmVjLCAweDYwMDcsIDB4MDA0NywKKwkweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkyYjcsIDB4MDgwYywgMHg5NzM4LCAweDAwMDUsIDB4MDgwYywKKwkweDMzNzcsIDB4MTkwNCwgMHhkNWFkLCAweDIwMDksIDB4MDA0NiwgMHgwODBjLCAweGU2ZWMsIDB4MDgwYywKKwkweGFjYjAsIDB4MDAwNSwgMHgwODBjLCAweGQ2ODIsIDB4MDkwNCwgMHhkNWFkLCAweDYwMDcsIDB4MDA0ZSwKKwkweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkyYjcsIDB4MDgwYywgMHg5NzM4LCAweDAwMDUsIDB4NjAwNywKKwkweDAwNGYsIDB4NjAxNywgMHgwMDAwLCAweDcxMzQsIDB4OTE4YywgMHgwMGZmLCAweDgxZmYsIDB4MDUwOCwKKwkweDkxODYsIDB4MDAwMSwgMHgxMTYwLCAweDcxNDAsIDB4MjAwMSwgMHgxOWJjLCAweDIwMDQsIDB4OTEwNiwKKwkweDExYjAsIDB4NzE0NCwgMHgyMDAxLCAweDE5YmQsIDB4MjAwNCwgMHg5MTA2LCAweDAxOTAsIDB4OTE4NiwKKwkweDAwMDIsIDB4MTE2OCwgMHgyMDExLCAweDAyNzYsIDB4MjBhOSwgMHgwMDA0LCAweDYwMTAsIDB4MDA5NiwKKwkweDIwNDgsIDB4MjAxOSwgMHgwMDBhLCAweDA4MGMsIDB4YmNhMiwgMHgwMDllLCAweDAxMTAsIDB4NjAxNywKKwkweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTJiNywgMHgwODBjLCAweDk3MzgsIDB4MDAwNSwKKwkweDYwMDcsIDB4MDA1MCwgMHg3MDNjLCAweDYwMTYsIDB4MGNhMCwgMHgwMDE2LCAweDAwZTYsIDB4MjA3MSwKKwkweDAyNjAsIDB4MDBiNiwgMHgwMGM2LCAweDIyNjAsIDB4NjAxMCwgMHgyMDU4LCAweGI4ZDQsIDB4ZDA4NCwKKwkweDAxNTAsIDB4NzEyOCwgMHg2MDRjLCAweDkxMDYsIDB4MTEyMCwgMHg3MTJjLCAweDYwNTAsIDB4OTEwNiwKKwkweDAxMTAsIDB4OTAwNiwgMHgwMDEwLCAweDkwODUsIDB4MDAwMSwgMHgwMGNlLCAweDAwYmUsIDB4MDBlZSwKKwkweDAwMWUsIDB4MDAwNSwgMHgwMDE2LCAweDAwOTYsIDB4MDA4NiwgMHgwMGU2LCAweDAxYzYsIDB4MDFkNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MTgwMCwgMHg3MDkwLCAweDkwOGEsIDB4MDBmOSwKKwkweDE2ZTgsIDB4MjBlMSwgMHgwMDAwLCAweDIwMDEsIDB4MTk5ZiwgMHgyMDAzLCAweDAwMDAsIDB4MDgwYywKKwkweDEwNjAsIDB4MDVhMCwgMHgyOTAwLCAweDYwMTYsIDB4NzA5MCwgMHg4MDA0LCAweGE4MTYsIDB4OTA4YSwKKwkweDAwMWUsIDB4MDJkMCwgMHhhODMzLCAweDAwMWUsIDB4MjBhOSwgMHgwMDFlLCAweGE4NjAsIDB4MjBlOCwKKwkweGE4NWMsIDB4OTA4MCwgMHgwMDFiLCAweDIwYTAsIDB4MjAwMSwgMHgxOTlmLCAweDAwMTYsIDB4MjAwYywKKwkweDA0NzEsIDB4MDAxZSwgMHgyOTQwLCAweDA4MGMsIDB4MTA2MCwgMHgwMWMwLCAweDI5MDAsIDB4YTAwNiwKKwkweDIxMDAsIDB4ODFmZiwgMHgwMTgwLCAweDBjMTgsIDB4YTgzMiwgMHgyMGE4LCAweGE4NjAsIDB4MjBlOCwKKwkweGE4NWMsIDB4OTA4MCwgMHgwMDFiLCAweDIwYTAsIDB4MjAwMSwgMHgxOTlmLCAweDAwMTYsIDB4MjAwYywKKwkweDAwYjEsIDB4MDAxZSwgMHgwMDAwLCAweDkwODUsIDB4MDAwMSwgMHgwMDQ4LCAweDIwNzEsIDB4MTgwMCwKKwkweDcwOTMsIDB4MDAwMCwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHgwZmY5LCAweDkwMDYsIDB4MDEyZSwKKwkweDAxZGUsIDB4MDFjZSwgMHgwMGVlLCAweDAwOGUsIDB4MDA5ZSwgMHgwMDFlLCAweDAwMDUsIDB4MDAwNiwKKwkweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4OTE4YywgMHhmZmZmLCAweDExYTgsIDB4MDgwYywKKwkweDIxZTMsIDB4MjA5OSwgMHgwMjZjLCAweDIwMDEsIDB4MDAxNCwgMHgzNTE4LCAweDkzMTIsIDB4MTIxOCwKKwkweDIzYTgsIDB4NDAwMywgMHgwMGY4LCAweDIwYTgsIDB4NDAwMywgMHgyMmE4LCAweDgxMDgsIDB4MDgwYywKKwkweDIxZTMsIDB4MjA5OSwgMHgwMjYwLCAweDBjYTgsIDB4MDgwYywgMHgyMWUzLCAweDIwNjEsIDB4MTk5ZiwKKwkweDYwMDQsIDB4MjA5OCwgMHg2MDA4LCAweDM1MTgsIDB4OTMxMiwgMHgxMjE4LCAweDIzYTgsIDB4NDAwMywKKwkweDAwNDgsIDB4MjBhOCwgMHg0MDAzLCAweDIyYTgsIDB4ODEwOCwgMHgwODBjLCAweDIxZTMsIDB4MjA5OSwKKwkweDAyNjAsIDB4MGNhOCwgMHgyMDYxLCAweDE5OWYsIDB4MjAxOSwgMHgwMjgwLCAweDMzMDAsIDB4OTMxZSwKKwkweDAxMTAsIDB4NjAwNiwgMHgwMDIwLCAweDIwMDEsIDB4MDI2MCwgMHg2MDA2LCAweDgxMDgsIDB4MjE2MiwKKwkweDkyOTIsIDB4MDAyMSwgMHg5Mjk2LCAweGZmZmYsIDB4NjIwYSwgMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwKKwkweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwKKwkweDgxZmYsIDB4MTFiOCwgMHgwODBjLCAweDIxZmIsIDB4MjBhMSwgMHgwMjRjLCAweDIwMDEsIDB4MDAxNCwKKwkweDM1MTgsIDB4OTMxMiwgMHgxMjE4LCAweDIzYTgsIDB4NDAwMywgMHgwNDE4LCAweDIwYTgsIDB4NDAwMywKKwkweDgyZmYsIDB4MDFmOCwgMHgyMmE4LCAweDgxMDgsIDB4MDgwYywgMHgyMWZiLCAweDIwYTEsIDB4MDI0MCwKKwkweDBjOTgsIDB4MDgwYywgMHgyMWZiLCAweDIwNjEsIDB4MTlhMiwgMHg2MDA0LCAweDIwYTAsIDB4NjAwOCwKKwkweDM1MTgsIDB4OTMxMiwgMHgxMjE4LCAweDIzYTgsIDB4NDAwMywgMHgwMDU4LCAweDIwYTgsIDB4NDAwMywKKwkweDgyZmYsIDB4MDEzOCwgMHgyMmE4LCAweDgxMDgsIDB4MDgwYywgMHgyMWZiLCAweDIwYTEsIDB4MDI0MCwKKwkweDBjOTgsIDB4MjA2MSwgMHgxOWEyLCAweDIwMTksIDB4MDI2MCwgMHgzNDAwLCAweDkzMWUsIDB4MDExMCwKKwkweDYwMDYsIDB4MDAyMCwgMHgyMDAxLCAweDAyNDAsIDB4NjAwNiwgMHg4MTA4LCAweDIxNjIsIDB4OTI5MiwKKwkweDAwMjEsIDB4OTI5NiwgMHhmZmZmLCAweDYyMGEsIDB4MDBjZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMGUsIDB4MDAwNSwgMHgwMGI2LCAweDAwNjYsIDB4NjYxMCwgMHgyNjU4LCAweGJlMDQsIDB4OTZiNCwKKwkweGZmMDAsIDB4ODYzNywgMHg5Njg2LCAweDAwMDYsIDB4MDE3MCwgMHg5Njg2LCAweDAwMDQsIDB4MDE1OCwKKwkweGJlMDQsIDB4OTZiNCwgMHgwMGZmLCAweDk2ODYsIDB4MDAwNiwgMHgwMTI4LCAweDk2ODYsIDB4MDAwNCwKKwkweDAxMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwNmUsIDB4MDBiZSwgMHgwMDA1LCAweDAwZDYsIDB4MDgwYywKKwkweGQ4MTAsIDB4MDBkZSwgMHgwMDA1LCAweDAwZDYsIDB4MDgwYywgMHhkODFkLCAweDE1MjAsIDB4NjgwYywKKwkweDkwOGMsIDB4ZmYwMCwgMHg2ODIwLCAweDkwODQsIDB4MDBmZiwgMHg5MTE1LCAweDYyMTYsIDB4NjgyNCwKKwkweDYwMmUsIDB4ZDFlNCwgMHgwMTMwLCAweDkwMDYsIDB4MDgwYywgMHhlODBjLCAweDIwMDksIDB4MDAwMSwKKwkweDAwNzgsIDB4ZDFlYywgMHgwMTgwLCAweDY5MjAsIDB4OTE4YywgMHgwMGZmLCAweDY4MjQsIDB4MDgwYywKKwkweDI2NjEsIDB4MTE0OCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHhlODBjLCAweDIxMTAsIDB4OTAwZSwKKwkweDA4MGMsIDB4MzI4ZiwgMHgwMDE4LCAweDkwODUsIDB4MDAwMSwgMHgwMDA4LCAweDkwMDYsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDBiNiwgMHgwMGM2LCAweDA4MGMsIDB4YWQyMCwgMHgwNTk4LCAweDAwMTYsIDB4MDAyNiwKKwkweDAwYzYsIDB4MjAxMSwgMHgwMjYzLCAweDIyMDQsIDB4ODIxMSwgMHgyMjBjLCAweDA4MGMsIDB4MjY2MSwKKwkweDE1NjgsIDB4MDgwYywgMHg2NjMyLCAweDE1NTAsIDB4YmUxMiwgMHhiZDE2LCAweDAwY2UsIDB4MDAyZSwKKwkweDAwMWUsIDB4MmIwMCwgMHg2MDEyLCAweDA4MGMsIDB4ZTYzZiwgMHgxMWM4LCAweDA4MGMsIDB4MzM3NywKKwkweDExYjAsIDB4MDgwYywgMHhkNzdhLCAweDA1MDAsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NjVlMywKKwkweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDY2MGYsIDB4NjAxNywgMHgwMDAwLCAweDYwMjMsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg5MmI3LCAweDAwMTAsIDB4MDgwYywKKwkweGFjYjAsIDB4OTA4NSwgMHgwMDAxLCAweDAwY2UsIDB4MDBiZSwgMHgwMDA1LCAweDA4MGMsIDB4YWNiMCwKKwkweDAwY2UsIDB4MDAyZSwgMHgwMDFlLCAweDBjYTgsIDB4MDgwYywgMHhhY2IwLCAweDkwMDYsIDB4MGM5OCwKKwkweDIwNjksIDB4MDI2ZCwgMHg2ODAwLCAweDkwODIsIDB4MDAxMCwgMHgxMjI4LCAweDYwMTcsIDB4MDAwMCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA4LCAweDkwMDYsIDB4MDAwNSwgMHg2MDE3LCAweDAwMDAsIDB4MjA2OSwKKwkweDAyNmMsIDB4NjgwOCwgMHg5MDg0LCAweGZmMDAsIDB4OTA4NiwgMHgwODAwLCAweDExOTAsIDB4NjkwNCwKKwkweDkxODYsIDB4MDAxOCwgMHgwMTE4LCAweDkxODYsIDB4MDAxNCwgMHgxMTU4LCAweDgxMGYsIDB4NjgwMCwKKwkweDkwODQsIDB4MDBmZiwgMHg5MTBkLCAweDYxNjIsIDB4OTA4ZSwgMHgwMDE0LCAweDAxMTAsIDB4OTA4ZSwKKwkweDAwMTAsIDB4MDAwNSwgMHg2MDA0LCAweDkwYjIsIDB4MDA1MywgMHgxYTBjLCAweDBkN2QsIDB4OTFiNiwKKwkweDAwMTMsIDB4MTEzMCwgMHgyMDA4LCAweDkxYjIsIDB4MDA0MCwgMHgxYTA0LCAweGQ5NWYsIDB4MDA5MiwKKwkweDkxYjYsIDB4MDAyNywgMHgwMTIwLCAweDkxYjYsIDB4MDAxNCwgMHgxOTBjLCAweDBkN2QsIDB4MjAwMSwKKwkweDAwMDcsIDB4MDgwYywgMHg2NjBmLCAweDA4MGMsIDB4OTY3YSwgMHgwODBjLCAweGFjZWIsIDB4MDgwYywKKwkweDk3MzgsIDB4MDAwNSwgMHhkODlhLCAweGQ4OWMsIDB4ZDg5YSwgMHhkODlhLCAweGQ4OWEsIDB4ZDg5YywKKwkweGQ4YTksIDB4ZDk1YywgMHhkOGY5LCAweGQ5NWMsIDB4ZDkwZCwgMHhkOTVjLCAweGQ4YTksIDB4ZDk1YywKKwkweGQ5NTQsIDB4ZDk1YywgMHhkOTU0LCAweGQ5NWMsIDB4ZDk1YywgMHhkODlhLCAweGQ4OWEsIDB4ZDg5YSwKKwkweGQ4OWEsIDB4ZDg5YSwgMHhkODlhLCAweGQ4OWEsIDB4ZDg5YSwgMHhkODlhLCAweGQ4OWEsIDB4ZDg5YSwKKwkweGQ4OWMsIDB4ZDg5YSwgMHhkOTVjLCAweGQ4OWEsIDB4ZDg5YSwgMHhkOTVjLCAweGQ4OWEsIDB4ZDk1OSwKKwkweGQ5NWMsIDB4ZDg5YSwgMHhkODlhLCAweGQ4OWEsIDB4ZDg5YSwgMHhkOTVjLCAweGQ5NWMsIDB4ZDg5YSwKKwkweGQ5NWMsIDB4ZDk1YywgMHhkODlhLCAweGQ4YTQsIDB4ZDg5YSwgMHhkODlhLCAweGQ4OWEsIDB4ZDg5YSwKKwkweGQ5NTgsIDB4ZDk1YywgMHhkODlhLCAweGQ4OWEsIDB4ZDk1YywgMHhkOTVjLCAweGQ4OWEsIDB4ZDg5YSwKKwkweGQ4OWEsIDB4ZDg5YSwgMHgwODBjLCAweDBkN2QsIDB4MDgwYywgMHhkMGIzLCAweDYwMDMsIDB4MDAwMiwKKwkweDA4MGMsIDB4OTczOCwgMHgwODA0LCAweGQ5NWUsIDB4OTAwNiwgMHgwODBjLCAweDY1Y2YsIDB4MDgwNCwKKwkweGQ5NWMsIDB4MDgwYywgMHg2YWQ1LCAweDE5MDQsIDB4ZDk1YywgMHg5MDA2LCAweDA4MGMsIDB4NjVjZiwKKwkweDYwMTAsIDB4MjA1OCwgMHhiODEwLCAweDkwODYsIDB4MDBmZiwgMHgxMTQwLCAweDAwZjYsIDB4MjA3OSwKKwkweDE4MDAsIDB4NzhhOCwgMHg4MDAwLCAweDc4YWEsIDB4MDBmZSwgMHgwNDI4LCAweDYwMTAsIDB4MjA1OCwKKwkweGI4ODQsIDB4OTAwNSwgMHgxMTc4LCAweDA4MGMsIDB4ZDA5YiwgMHgxOTA0LCAweGQ5NWMsIDB4MDAzNiwKKwkweDAwNDYsIDB4YmJhMCwgMHgyMDIxLCAweDAwMDcsIDB4MDgwYywgMHg0ZDA5LCAweDAwNGUsIDB4MDAzZSwKKwkweDA4MDQsIDB4ZDk1YywgMHgwODBjLCAweDMzYTgsIDB4MTkwNCwgMHhkOTVjLCAweDIwMDEsIDB4MTgwMCwKKwkweDIwMDQsIDB4OTA4NiwgMHgwMDAyLCAweDExMzgsIDB4MDBmNiwgMHgyMDc5LCAweDE4MDAsIDB4NzhhOCwKKwkweDgwMDAsIDB4NzhhYSwgMHgwMGZlLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDY1ZTMsIDB4NjAyMywKKwkweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMiwgMHgwODBjLCAweDkyYjcsIDB4MDgwYywKKwkweDk3MzgsIDB4NjExMCwgMHgyMTU4LCAweDIwMDksIDB4MDAwMSwgMHgwODBjLCAweDg2ZDYsIDB4MDgwNCwKKwkweGQ5NWUsIDB4NjYxMCwgMHgyNjU4LCAweGJlMDQsIDB4OTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4OTY4NiwKKwkweDAwMDYsIDB4MDkwNCwgMHhkOTVjLCAweDk2ODYsIDB4MDAwNCwgMHgwOTA0LCAweGQ5NWMsIDB4MDgwYywKKwkweDhmNTIsIDB4MjAwMSwgMHgwMDA0LCAweDA4MDQsIDB4ZDk1YSwgMHgyMDAxLCAweDE4MDAsIDB4MjAwNCwKKwkweDkwODYsIDB4MDAwMywgMHgxMTU4LCAweDAwMzYsIDB4MDA0NiwgMHg2MDEwLCAweDIwNTgsIDB4YmJhMCwKKwkweDIwMjEsIDB4MDAwNiwgMHgwODBjLCAweDRkMDksIDB4MDA0ZSwgMHgwMDNlLCAweDIwMDEsIDB4MDAwNiwKKwkweDA4MGMsIDB4ZDk3OCwgMHg2NjEwLCAweDI2NTgsIDB4YmUwNCwgMHgwMDY2LCAweDk2YjQsIDB4ZmYwMCwKKwkweDg2MzcsIDB4OTY4NiwgMHgwMDA2LCAweDAwNmUsIDB4MDE2OCwgMHgyMDAxLCAweDAwMDYsIDB4MDgwYywKKwkweDY2MGYsIDB4OTI4NCwgMHgwMGZmLCAweDkwOGUsIDB4MDAwNywgMHgxMTIwLCAweDIwMDEsIDB4MDAwNiwKKwkweDA4MGMsIDB4NjVlMywgMHgwODBjLCAweDZhZDUsIDB4MTFmOCwgMHgyMDAxLCAweDE4MzcsIDB4MjAwNCwKKwkweGQwYTQsIDB4MDFkMCwgMHhiZTA0LCAweDk2YjQsIDB4MDBmZiwgMHg5Njg2LCAweDAwMDYsIDB4MDFhMCwKKwkweDAwZjYsIDB4MjA3OSwgMHgxODAwLCAweDc4YTgsIDB4ODAwMCwgMHg3OGFhLCAweDAwZmUsIDB4MDgwNCwKKwkweGQ4ZTMsIDB4MjAwMSwgMHgwMDA0LCAweDAwMzAsIDB4MjAwMSwgMHgwMDA2LCAweDA0MDksIDB4MDAyMCwKKwkweDAwMTgsIDB4MDAxMCwgMHgwODBjLCAweDY2MGYsIDB4MDgwYywgMHhhY2IwLCAweDAwMDUsIDB4MjYwMCwKKwkweDAwMDIsIDB4ZDk3MywgMHhkOTczLCAweGQ5NzMsIDB4ZDk3MywgMHhkOTczLCAweGQ5NzUsIDB4ZDk3MywKKwkweGQ5NzUsIDB4ZDk3MywgMHhkOTczLCAweGQ5NzUsIDB4ZDk3MywgMHhkOTczLCAweGQ5NzMsIDB4ZDk3NSwKKwkweGQ5NzUsIDB4ZDk3NSwgMHhkOTc1LCAweDA4MGMsIDB4MGQ3ZCwgMHgwODBjLCAweGFjYjAsIDB4MDAwNSwKKwkweDAwMTYsIDB4MDBiNiwgMHgwMGQ2LCAweDYxMTAsIDB4MjE1OCwgMHhiOTAwLCAweGQxODQsIDB4MDEzOCwKKwkweDA4MGMsIDB4NjVlMywgMHg5MDA2LCAweDA4MGMsIDB4NjVjZiwgMHgwODBjLCAweDMyNmYsIDB4MDBkZSwKKwkweDAwYmUsIDB4MDAxZSwgMHgwMDA1LCAweDY2MTAsIDB4MjY1OCwgMHhiODA0LCAweDkwODQsIDB4ZmYwMCwKKwkweDgwMDcsIDB4OTBiMiwgMHgwMDBjLCAweDFhMGMsIDB4MGQ3ZCwgMHg5MWI2LCAweDAwMTUsIDB4MTExMCwKKwkweDAwM2IsIDB4MDAyOCwgMHg5MWI2LCAweDAwMTYsIDB4MTkwYywgMHgwZDdkLCAweDAwNmIsIDB4MDAwNSwKKwkweGI3N2MsIDB4Yjc3YywgMHhiNzdjLCAweGI3N2MsIDB4ZGEwZCwgMHhiNzdjLCAweGQ5ZjcsIDB4ZDliOCwKKwkweGI3N2MsIDB4Yjc3YywgMHhiNzdjLCAweGI3N2MsIDB4Yjc3YywgMHhiNzdjLCAweGI3N2MsIDB4Yjc3YywKKwkweGRhMGQsIDB4Yjc3YywgMHhkOWY3LCAweGQ5ZmUsIDB4Yjc3YywgMHhiNzdjLCAweGI3N2MsIDB4Yjc3YywKKwkweDAwZjYsIDB4MDgwYywgMHg2YWQ1LCAweDExZDgsIDB4MDgwYywgMHhkMDliLCAweDExYzAsIDB4NjAxMCwKKwkweDkwNWQsIDB4MDFhOCwgMHhiODg0LCAweDkwMDUsIDB4MDE5MCwgMHg5MDA2LCAweDA4MGMsIDB4NjVjZiwKKwkweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDY1ZTMsIDB4NjAyMywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDAwMiwgMHgwODBjLCAweDkyYjcsIDB4MDgwYywgMHg5NzM4LCAweDAwZjAsIDB4MjAxMSwKKwkweDAyNjMsIDB4MjIwNCwgMHg4MjExLCAweDIyMGMsIDB4MDgwYywgMHgyNjYxLCAweDExYjAsIDB4MDgwYywKKwkweDY2OTMsIDB4MDExOCwgMHgwODBjLCAweGFjYjAsIDB4MDA4MCwgMHhiODEwLCAweDAwMDYsIDB4YjgxNCwKKwkweDAwMDYsIDB4Yjg4NCwgMHgwMDA2LCAweDA4MGMsIDB4NjBhYywgMHgwMDBlLCAweGI4ODYsIDB4MDAwZSwKKwkweGI4MTYsIDB4MDAwZSwgMHhiODEyLCAweDA4MGMsIDB4YWNiMCwgMHgwMGZlLCAweDAwMDUsIDB4NjYwNCwKKwkweDk2YjYsIDB4MDAxZSwgMHgxMTEwLCAweDA4MGMsIDB4YWNiMCwgMHgwMDA1LCAweDA4MGMsIDB4YmIwNywKKwkweDExNDgsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHgwODBjLCAweDkyYjcsIDB4MDgwYywKKwkweDk3MzgsIDB4MDAxMCwgMHgwODBjLCAweGFjYjAsIDB4MDAwNSwgMHgwODA0LCAweGFjYjAsIDB4NjAwNCwKKwkweDkwOGEsIDB4MDA1MywgMHgxYTBjLCAweDBkN2QsIDB4MDgwYywgMHg5NjdhLCAweDA4MGMsIDB4YWNlYiwKKwkweDAwMDUsIDB4OTE4MiwgMHgwMDQwLCAweDAwMDIsIDB4ZGEzMCwgMHhkYTMwLCAweGRhMzAsIDB4ZGEzMCwKKwkweGRhMzIsIDB4ZGEzMCwgMHhkYTMwLCAweGRhMzAsIDB4ZGEzMCwgMHhkYTMwLCAweGRhMzAsIDB4ZGEzMCwKKwkweGRhMzAsIDB4ZGEzMCwgMHhkYTMwLCAweGRhMzAsIDB4ZGEzMCwgMHhkYTMwLCAweGRhMzAsIDB4ZGEzMCwKKwkweDA4MGMsIDB4MGQ3ZCwgMHgwMDk2LCAweDAwYjYsIDB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MDA0NiwKKwkweDAwMjYsIDB4NjIxMCwgMHgyMjU4LCAweGI4YmMsIDB4OTAwNSwgMHgxMWIwLCAweDYwMDcsIDB4MDA0NCwKKwkweDIwNzEsIDB4MDI2MCwgMHg3NDQ0LCAweDk0YTQsIDB4ZmYwMCwgMHgwOTA0LCAweGRhOTksIDB4MDgwYywKKwkweGU4MDAsIDB4MTE3MCwgMHg5NDg2LCAweDIwMDAsIDB4MTE1OCwgMHgyMDA5LCAweDAwMDEsIDB4MjAxMSwKKwkweDAyMDAsIDB4MDgwYywgMHg4OTc5LCAweDAwMjAsIDB4OTAyNiwgMHgwODBjLCAweGU2ODQsIDB4MGMzMCwKKwkweDA4MGMsIDB4MTA0NywgMHgwOTBjLCAweDBkN2QsIDB4NjAwMywgMHgwMDA3LCAweGE4NjcsIDB4MDEwZCwKKwkweDkwMDYsIDB4YTgwMiwgMHhhODZhLCAweGFjOGEsIDB4MmMwMCwgMHhhODhlLCAweDYwMDgsIDB4YThlMiwKKwkweDYwMTAsIDB4MjA1OCwgMHhiOGEwLCAweDcxMzAsIDB4YTk3YSwgMHgwMDE2LCAweGE4NzYsIDB4YTg3ZiwKKwkweDAwMDAsIDB4YTg4MywgMHgwMDAwLCAweGE4ODcsIDB4MDAzNiwgMHgwODBjLCAweDZkZWUsIDB4MDAxZSwKKwkweDA4MGMsIDB4ZTgwMCwgMHgxOTA0LCAweGRhZjksIDB4OTQ4NiwgMHgyMDAwLCAweDExMzAsIDB4MjAxOSwKKwkweDAwMTcsIDB4MDgwYywgMHhlM2I1LCAweDA4MDQsIDB4ZGFmOSwgMHg5NDg2LCAweDAyMDAsIDB4MTEyMCwKKwkweDA4MGMsIDB4ZTM0NSwgMHgwODA0LCAweGRhZjksIDB4OTQ4NiwgMHgwNDAwLCAweDAxMjAsIDB4OTQ4NiwKKwkweDEwMDAsIDB4MTkwNCwgMHhkYWY5LCAweDIwMTksIDB4MDAwMiwgMHgwODBjLCAweGUzNjQsIDB4MDgwNCwKKwkweGRhZjksIDB4MjA2OSwgMHgxYTZlLCAweDZhMDAsIDB4ZDI4NCwgMHgwOTA0LCAweGRiNjMsIDB4OTI4NCwKKwkweDAzMDAsIDB4MTkwNCwgMHhkYjVjLCAweDY4MDQsIDB4OTAwNSwgMHgwOTA0LCAweGRiNDQsIDB4MmQ3OCwKKwkweDYwMDMsIDB4MDAwNywgMHgwODBjLCAweDEwNjAsIDB4MDkwNCwgMHhkYjA1LCAweDc4MDAsIDB4ZDA4YywKKwkweDExMTgsIDB4NzgwNCwgMHg4MDAxLCAweDc4MDYsIDB4NjAxNywgMHgwMDAwLCAweDIwMDEsIDB4MTgwZiwKKwkweDIwMDQsIDB4ZDA4NCwgMHgxOTA0LCAweGRiNjcsIDB4OTAwNiwgMHhhODAyLCAweGE4NjcsIDB4MDExNiwKKwkweGE4NmEsIDB4NjAwOCwgMHhhOGUyLCAweDJjMDAsIDB4YTg3YSwgMHg2MDEwLCAweDIwNTgsIDB4YjhhMCwKKwkweDcxMzAsIDB4YTliNiwgMHhhODc2LCAweGI5MjgsIDB4YTliYSwgMHhiOTJjLCAweGE5YmUsIDB4YjkzMCwKKwkweGE5YzIsIDB4YjkzNCwgMHhhOWM2LCAweGE4ODMsIDB4MDAzZCwgMHg3MDQ0LCAweDkwODQsIDB4MDAwMywKKwkweDkwODAsIDB4ZGIwMSwgMHgyMDA1LCAweGE4N2UsIDB4MjBhOSwgMHgwMDBhLCAweDIwMDEsIDB4MDI3MCwKKwkweGFhNWMsIDB4OTI5MCwgMHgwMDIxLCAweDIwMDksIDB4MDIwNSwgMHgyMDBiLCAweDAwODAsIDB4MjBlMSwKKwkweDAwMDAsIDB4YWI2MCwgMHgyM2U4LCAweDIwOTgsIDB4MjJhMCwgMHg0MDAzLCAweDIwMGIsIDB4MDAwMCwKKwkweDIwMDEsIDB4MDI3YSwgMHgyMDBjLCAweGE5YjIsIDB4ODAwMCwgMHgyMDBjLCAweGE5YWUsIDB4MDgwYywKKwkweDZkZjEsIDB4MDAyZSwgMHgwMDRlLCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwYmUsIDB4MDA5ZSwKKwkweDAwMDUsIDB4MDAwMCwgMHgwMDgwLCAweDAwNDAsIDB4MDAwMCwgMHgyMDAxLCAweDE4MTAsIDB4MjAwNCwKKwkweGQwODQsIDB4MDEyMCwgMHgwODBjLCAweDEwNDcsIDB4MTkwNCwgMHhkYWFlLCAweDYwMTcsIDB4ZjEwMCwKKwkweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwNDEsIDB4MjAwOSwgMHhhMDIyLCAweDA4MGMsIDB4OTJiMCwKKwkweDBjMDAsIDB4MjA2OSwgMHgwMjYwLCAweDY4NDgsIDB4OTA4NCwgMHhmZjAwLCAweDkwODYsIDB4MTIwMCwKKwkweDExOTgsIDB4Njg2YywgMHg5MDg0LCAweDAwZmYsIDB4MDAxNiwgMHg2MTE0LCAweDkxOGMsIDB4ZjcwMCwKKwkweDkxMGQsIDB4NjExNiwgMHgwMDFlLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwNDMsIDB4MjAwOSwKKwkweGEwMjUsIDB4MDgwYywgMHg5MmIwLCAweDA4MjgsIDB4Njg2OCwgMHg2MDJlLCAweDY4NmMsIDB4NjAzMiwKKwkweDYwMTcsIDB4ZjIwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDQxLCAweDIwMDksIDB4YTAyMiwKKwkweDA4MGMsIDB4OTJiMCwgMHgwODA0LCAweGRhZjksIDB4MjAwMSwgMHgxODBlLCAweDIwMDQsIDB4ZDBlYywKKwkweDAxMjAsIDB4MjAxMSwgMHg4MDQ5LCAweDA4MGMsIDB4NGI1MiwgMHg2MDE3LCAweGYzMDAsIDB4MDAxMCwKKwkweDYwMTcsIDB4ZjEwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDQxLCAweDIwMDksIDB4YTAyMiwKKwkweDA4MGMsIDB4OTJiMCwgMHgwODA0LCAweGRhZjksIDB4NjAxNywgMHhmNTAwLCAweDBjOTgsIDB4NjAxNywKKwkweGY2MDAsIDB4MDgwNCwgMHhkYjE5LCAweDYwMTcsIDB4ZjIwMCwgMHgwODA0LCAweGRiMTksIDB4YTg2NywKKwkweDAxNDYsIDB4YTg2YiwgMHgwMDAwLCAweDYwMDgsIDB4YTg4NiwgMHgyYzAwLCAweGE4N2EsIDB4NzA0NCwKKwkweDkwODQsIDB4MDAwMywgMHg5MDgwLCAweGRiMDEsIDB4MjAwNSwgMHhhODdlLCAweDI5MjgsIDB4NjAxMCwKKwkweDIwNTgsIDB4YjhhMCwgMHhhODc2LCAweGI4MjgsIDB4YTg4YSwgMHhiODJjLCAweGE4OGUsIDB4YjgzMCwKKwkweGE4OTIsIDB4YjgzNCwgMHhhODk2LCAweGE4ODMsIDB4MDAzZCwgMHgyMDA5LCAweDAyMDUsIDB4MjEwNCwKKwkweDkwODUsIDB4MDA4MCwgMHgyMDBhLCAweDIwZTEsIDB4MDAwMCwgMHgyMDExLCAweDAyMTAsIDB4MjIxNCwKKwkweDkyOTQsIDB4MGZmZiwgMHhhYWEyLCAweDkyODIsIDB4MDExMSwgMHgxYTBjLCAweDBkN2QsIDB4ODIxMCwKKwkweDgyMWMsIDB4MjAwMSwgMHgwMjZjLCAweDIwOTgsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMjksIDB4MjBhMCwgMHgyMDExLCAweGRiZTMsIDB4MjA0MSwgMHgwMDAxLCAweDIyM2QsIDB4OTc4NCwKKwkweDAwZmYsIDB4OTMyMiwgMHgxMjA4LCAweDIzMDAsIDB4MjBhOCwgMHg0MDAzLCAweDkzMWEsIDB4MDUzMCwKKwkweDgyMTAsIDB4ZDdmYywgMHgxMTMwLCAweDhkNjgsIDB4MmQwYSwgMHgyMDAxLCAweDAyNjAsIDB4MjA5OCwKKwkweDBjNjgsIDB4Mjk1MCwgMHgwODBjLCAweDEwNjAsIDB4MDE3MCwgMHgyOTAwLCAweGIwMDIsIDB4YTg2NywKKwkweDAxNDcsIDB4YTg2YiwgMHgwMDAwLCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDkwODAsIDB4MDAxYiwKKwkweDIwYTAsIDB4ODg0MCwgMHgwOGQ4LCAweDI1NDgsIDB4YTgwMCwgMHg5MDJkLCAweDAxMTgsIDB4MDgwYywKKwkweDEwNzksIDB4MGNjOCwgMHgwODBjLCAweDEwNzksIDB4MDgwNCwgMHhkYjA1LCAweDI1NDgsIDB4ODg0NywKKwkweDk4ODUsIDB4MDA0NiwgMHhhODY2LCAweDIwMDksIDB4MDIwNSwgMHgyMDBiLCAweDAwMDAsIDB4MDgwYywKKwkweGUzZTgsIDB4MDgwNCwgMHhkYWY5LCAweDgwMTAsIDB4MDAwNCwgMHg4MDFhLCAweDAwMDYsIDB4ODAxOCwKKwkweDAwMDgsIDB4ODAxNiwgMHgwMDBhLCAweDgwMTQsIDB4OTE4NiwgMHgwMDEzLCAweDExNjAsIDB4NjAwNCwKKwkweDkwOGEsIDB4MDA1NywgMHgxYTBjLCAweDBkN2QsIDB4OTA4MiwgMHgwMDQwLCAweDBhMGMsIDB4MGQ3ZCwKKwkweDIwMDgsIDB4MDgwNCwgMHhkYzZmLCAweDkxODYsIDB4MDA1MSwgMHgwMTA4LCAweDAwNDAsIDB4MDgwYywKKwkweGFiMzMsIDB4MDFlOCwgMHg5MDg2LCAweDAwMDIsIDB4MDkwNCwgMHhkY2I3LCAweDAwYzAsIDB4OTE4NiwKKwkweDAwMjcsIDB4MDE4MCwgMHg5MTg2LCAweDAwNDgsIDB4MDEyOCwgMHg5MTg2LCAweDAwMTQsIDB4MDE1MCwKKwkweDE5MGMsIDB4MGQ3ZCwgMHgwODBjLCAweGFiMzMsIDB4MDE1MCwgMHg5MDg2LCAweDAwMDQsIDB4MDkwNCwKKwkweGRkNTYsIDB4MDAyOCwgMHg2MDA0LCAweDkwODIsIDB4MDA0MCwgMHgyMDA4LCAweDAwMWEsIDB4MDgwYywKKwkweGFkNmEsIDB4MDAwNSwgMHhkYzM2LCAweGRjMzgsIDB4ZGMzOCwgMHhkYzVmLCAweGRjMzYsIDB4ZGMzNiwKKwkweGRjMzYsIDB4ZGMzNiwgMHhkYzM2LCAweGRjMzYsIDB4ZGMzNiwgMHhkYzM2LCAweGRjMzYsIDB4ZGMzNiwKKwkweGRjMzYsIDB4ZGMzNiwgMHhkYzM2LCAweGRjMzYsIDB4ZGMzNiwgMHhkYzM2LCAweDA4MGMsIDB4MGQ3ZCwKKwkweDA4MGMsIDB4OTY3YSwgMHgwODBjLCAweDk3MzgsIDB4MDAzNiwgMHgwMDk2LCAweDYwMTQsIDB4OTA0ZCwKKwkweDAxZDgsIDB4MDgwYywgMHhjOTdhLCAweDAxYzAsIDB4NjAwMywgMHgwMDAyLCAweDYwMTAsIDB4MDBiNiwKKwkweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MTE3OCwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywKKwkweGUzZTgsIDB4NjAxNywgMHgwMDAwLCAweDYwMTgsIDB4OTAwNSwgMHgxMTIwLCAweDIwMDEsIDB4MTk4NiwKKwkweDIwMDQsIDB4NjAxYSwgMHg2MDAzLCAweDAwMDcsIDB4MDA5ZSwgMHgwMDNlLCAweDAwMDUsIDB4MDA5NiwKKwkweDA4MGMsIDB4OTY3YSwgMHgwODBjLCAweDk3MzgsIDB4MDgwYywgMHhjOTdhLCAweDAxMjAsIDB4NjAxNCwKKwkweDIwNDgsIDB4MDgwYywgMHgxMDc5LCAweDA4MGMsIDB4YWNlYiwgMHgwMDllLCAweDAwMDUsIDB4MDAwMiwKKwkweGRjODQsIDB4ZGM5OSwgMHhkYzg2LCAweGRjYWUsIDB4ZGM4NCwgMHhkYzg0LCAweGRjODQsIDB4ZGM4NCwKKwkweGRjODQsIDB4ZGM4NCwgMHhkYzg0LCAweGRjODQsIDB4ZGM4NCwgMHhkYzg0LCAweGRjODQsIDB4ZGM4NCwKKwkweGRjODQsIDB4ZGM4NCwgMHhkYzg0LCAweGRjODQsIDB4MDgwYywgMHgwZDdkLCAweDAwOTYsIDB4NjAxNCwKKwkweDIwNDgsIDB4YTg3YywgMHhkMGI0LCAweDAxMzgsIDB4NjAwMywgMHgwMDA3LCAweDIwMDksIDB4MDA0MywKKwkweDA4MGMsIDB4YWQ0ZCwgMHgwMDEwLCAweDYwMDMsIDB4MDAwNCwgMHgwODBjLCAweDk3MzgsIDB4MDA5ZSwKKwkweDAwMDUsIDB4MDgwYywgMHhjOTdhLCAweDAxMzgsIDB4NjExNCwgMHgwMDk2LCAweDIxNDgsIDB4YTk3YywKKwkweDAwOWUsIDB4ZDFlYywgMHgxMTM4LCAweDA4MGMsIDB4ODk0ZSwgMHgwODBjLCAweGFjYjAsIDB4MDgwYywKKwkweDk3MzgsIDB4MDAwNSwgMHgwODBjLCAweGU2NDgsIDB4MGRiMCwgMHgwY2M4LCAweDYwMDMsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDA0MSwgMHgyMDA5LCAweGEwMjIsIDB4MDgwYywgMHg5MmIwLCAweDAwMDUsIDB4OTE4MiwKKwkweDAwNDAsIDB4MDAwMiwgMHhkY2NlLCAweGRjZDAsIDB4ZGNjZSwgMHhkY2NlLCAweGRjY2UsIDB4ZGNjZSwKKwkweGRjY2UsIDB4ZGNjZSwgMHhkY2NlLCAweGRjY2UsIDB4ZGNjZSwgMHhkY2NlLCAweGRjY2UsIDB4ZGNjZSwKKwkweGRjY2UsIDB4ZGNjZSwgMHhkY2NlLCAweGRjZDEsIDB4ZGNjZSwgMHhkY2NlLCAweDA4MGMsIDB4MGQ3ZCwKKwkweDAwMDUsIDB4MDBkNiwgMHgwODBjLCAweDg5NGUsIDB4MDBkZSwgMHgwODBjLCAweGU2YTAsIDB4MDgwYywKKwkweGFjYjAsIDB4MDAwNSwgMHg5MTgyLCAweDAwNDAsIDB4MDAwMiwgMHhkY2YxLCAweGRjZjEsIDB4ZGNmMSwKKwkweGRjZjEsIDB4ZGNmMSwgMHhkY2YxLCAweGRjZjEsIDB4ZGNmMSwgMHhkY2YxLCAweGRjZjMsIDB4ZGQxZSwKKwkweGRjZjEsIDB4ZGNmMSwgMHhkY2YxLCAweGRjZjEsIDB4ZGQxZSwgMHhkY2YxLCAweGRjZjEsIDB4ZGNmMSwKKwkweGRjZjEsIDB4MDgwYywgMHgwZDdkLCAweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4N2MsIDB4ZDBmYywKKwkweDAxNjgsIDB4OTA4YywgMHgwMDAzLCAweDkxOGUsIDB4MDAwMiwgMHgwMTgwLCAweDYxNDQsIDB4ZDFlNCwKKwkweDExNjgsIDB4MjAwOSwgMHgwMDQxLCAweDAwOWUsIDB4MDgwNCwgMHhkZGRlLCAweDYwMDMsIDB4MDAwNywKKwkweDYwMWIsIDB4MDAwMCwgMHgwODBjLCAweDg5NGUsIDB4MDA5ZSwgMHgwMDA1LCAweDYwMTQsIDB4MjA0OCwKKwkweGE5N2MsIDB4ZDFlYywgMHgxMTMwLCAweDA4MGMsIDB4ODk0ZSwgMHgwODBjLCAweGFjYjAsIDB4MDA5ZSwKKwkweDAwMDUsIDB4MDgwYywgMHhlNjQ4LCAweDBkYjgsIDB4MDA5ZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgwYywKKwkweDIwMGMsIDB4YzFkNCwgMHgyMTAyLCAweDAwMzYsIDB4MDgwYywgMHg5NmQ1LCAweDA4MGMsIDB4OTczOCwKKwkweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwKKwkweGQwYmMsIDB4MDE4OCwgMHhhODdjLCAweDkwODQsIDB4MDAwMywgMHg5MDg2LCAweDAwMDIsIDB4MDE0MCwKKwkweGE4YWMsIDB4NjMzMCwgMHg5MzFhLCAweDYzMzIsIDB4YThiMCwgMHg2MzJjLCAweDkzMWIsIDB4NjMyZSwKKwkweDYwMDMsIDB4MDAwMiwgMHgwMDgwLCAweDIwMTksIDB4MDAwNCwgMHgwODBjLCAweGUzZTgsIDB4NjAxOCwKKwkweDkwMDUsIDB4MTEyOCwgMHgyMDAxLCAweDE5ODYsIDB4MjAwNCwgMHg4MDAzLCAweDYwMWEsIDB4NjAxNywKKwkweDAwMDAsIDB4NjAwMywgMHgwMDA3LCAweDAwOWUsIDB4MDAzZSwgMHgwMDA1LCAweDkxODIsIDB4MDA0MCwKKwkweDAwMDIsIDB4ZGQ2ZCwgMHhkZDZkLCAweGRkNmQsIDB4ZGQ2ZCwgMHhkZDZkLCAweGRkNmQsIDB4ZGQ2ZCwKKwkweGRkNmQsIDB4ZGQ2ZiwgMHhkZDZkLCAweGRkNmQsIDB4ZGQ2ZCwgMHhkZDZkLCAweGRkNmQsIDB4ZGQ2ZCwKKwkweGRkNmQsIDB4ZGQ2ZCwgMHhkZDZkLCAweGRkNmQsIDB4ZGRiYSwgMHgwODBjLCAweDBkN2QsIDB4NjAxNCwKKwkweDAwOTYsIDB4MjA0OCwgMHhhODM0LCAweGFhMzgsIDB4NjExMCwgMHgwMGI2LCAweDIxNTgsIDB4YjkwMCwKKwkweDAwYmUsIDB4ZDFiYywgMHgxMTkwLCAweDkyMGQsIDB4MTUxOCwgMHhhODdjLCAweGQwZmMsIDB4MDEyOCwKKwkweDIwMDksIDB4MDA0MSwgMHgwMDllLCAweDA4MDQsIDB4ZGRkZSwgMHg2MDAzLCAweDAwMDcsIDB4NjAxYiwKKwkweDAwMDAsIDB4MDgwYywgMHg4OTRlLCAweDAwOWUsIDB4MDAwNSwgMHg2MTI0LCAweGQxZjQsIDB4MWQ1OCwKKwkweDAwMDYsIDB4MDA0NiwgMHhhY2FjLCAweDk0MjIsIDB4YTliMCwgMHgyMjAwLCAweDkxMGIsIDB4NjAzMCwKKwkweDk0MjAsIDB4NjQzMiwgMHg2MDJjLCAweDkxMDksIDB4NjEyZSwgMHgwMDRlLCAweDAwMGUsIDB4MDhkOCwKKwkweDYxMTAsIDB4MDBiNiwgMHgyMTU4LCAweGI5MDAsIDB4MDBiZSwgMHhkMWJjLCAweDExNzgsIDB4MjAwOSwKKwkweDE4MGUsIDB4MjEwYywgMHhkMTljLCAweDAxMTgsIDB4NjAwMywgMHgwMDA3LCAweDAwMTAsIDB4NjAwMywKKwkweDAwMDYsIDB4MDBlOSwgMHgwODBjLCAweDg5NTAsIDB4MDA5ZSwgMHgwMDA1LCAweDYwMDMsIDB4MDAwMiwKKwkweDAwOWUsIDB4MDAwNSwgMHg2MDI0LCAweGQwZjQsIDB4MDEyOCwgMHgwODBjLCAweDE2OTcsIDB4MTkwNCwKKwkweGRkNmYsIDB4MDAwNSwgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwgMHhhODM0LCAweGE5MzgsIDB4MDA5ZSwKKwkweDkxMDUsIDB4MTEyMCwgMHgwODBjLCAweDE2OTcsIDB4MTkwNCwgMHhkZDZmLCAweDAwMDUsIDB4ZDJmYywKKwkweDAxNDAsIDB4ODAwMiwgMHg4MDAwLCAweDgyMTIsIDB4OTI5MSwgMHgwMDAwLCAweDIwMDksIDB4MDAwOSwKKwkweDAwMTAsIDB4MjAwOSwgMHgwMDE1LCAweGFhOWEsIDB4YTg5NiwgMHgwMDA1LCAweDkxODIsIDB4MDA0MCwKKwkweDAyMDgsIDB4MDA2MiwgMHg5MTg2LCAweDAwMTMsIDB4MDEyMCwgMHg5MTg2LCAweDAwMTQsIDB4MTkwYywKKwkweDBkN2QsIDB4NjAyNCwgMHhkMGRjLCAweDA5MGMsIDB4MGQ3ZCwgMHgwMDA1LCAweGRlMDIsIDB4ZGUwZSwKKwkweGRlMWEsIDB4ZGUyNiwgMHhkZTAyLCAweGRlMDIsIDB4ZGUwMiwgMHhkZTAyLCAweGRlMDksIDB4ZGUwNCwKKwkweGRlMDQsIDB4ZGUwMiwgMHhkZTAyLCAweGRlMDIsIDB4ZGUwMiwgMHhkZTA0LCAweGRlMDIsIDB4ZGUwNCwKKwkweGRlMDIsIDB4ZGUwOSwgMHgwODBjLCAweDBkN2QsIDB4NjAyNCwgMHhkMGRjLCAweDA5MGMsIDB4MGQ3ZCwKKwkweDAwMDUsIDB4NjAxNCwgMHg5MDA1LCAweDE5MGMsIDB4MGQ3ZCwgMHgwMDA1LCAweDYwMDMsIDB4MDAwMSwKKwkweDYxMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAwOSwgMHhhMDIyLCAweDA4MGMsIDB4OTI5MiwKKwkweDAxMmUsIDB4MDAwNSwgMHg2MDAzLCAweDAwMDQsIDB4NjEwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDIwMDksIDB4YTAwMSwgMHgwODBjLCAweDkyYjAsIDB4MDEyZSwgMHgwMDA1LCAweDYwMDMsIDB4MDAwMywKKwkweDYxMDYsIDB4MDgwYywgMHgxYzU5LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYwMTQsIDB4MDA5NiwKKwkweDIwNDgsIDB4YTg3YywgMHhkMGZjLCAweDAxODgsIDB4OTA4NCwgMHgwMDAzLCAweDkwODYsIDB4MDAwMiwKKwkweDAxYTAsIDB4NjAyNCwgMHhkMGNjLCAweDExNDgsIDB4ZDBjNCwgMHgxMTM4LCAweGE4YTgsIDB4OTAwNSwKKwkweDExMjAsIDB4NjE0NCwgMHg5MThkLCAweGIwMzUsIDB4MDAxOCwgMHg2MTQ0LCAweDkxOGQsIDB4YTAzNSwKKwkweDAwOWUsIDB4MDgwYywgMHg5MmY3LCAweDAxMmUsIDB4MDAwNSwgMHg2MTQ0LCAweDkxOGQsIDB4YTAzMiwKKwkweDBjYjgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDAzNiwgMHgwMDk2LCAweDkxODIsIDB4MDA0MCwKKwkweDAwMjMsIDB4MDA5ZSwgMHgwMDNlLCAweDAxMmUsIDB4MDAwNSwgMHhkZTcxLCAweGRlNzMsIDB4ZGU4OCwKKwkweGRlYTIsIDB4ZGU3MSwgMHhkZTcxLCAweGRlNzEsIDB4ZGU3MSwgMHhkZTcxLCAweGRlNzEsIDB4ZGU3MSwKKwkweGRlNzEsIDB4ZGU3MSwgMHhkZTcxLCAweGRlNzEsIDB4ZGU3MSwgMHhkZTcxLCAweGRlNzEsIDB4ZGU3MSwKKwkweGRlNzEsIDB4MDgwYywgMHgwZDdkLCAweDYwMTQsIDB4MjA0OCwgMHhhODdjLCAweGQwZmMsIDB4MDUxMCwKKwkweDkwOWMsIDB4MDAwMywgMHg5MzllLCAweDAwMDMsIDB4MDFlOCwgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDksIDB4YTAyMiwgMHgwODBjLCAweDkyYjAsIDB4MDQ3MCwKKwkweDYwMTQsIDB4MjA0OCwgMHhhODdjLCAweGQwZmMsIDB4MDE2OCwgMHg5MDljLCAweDAwMDMsIDB4OTM5ZSwKKwkweDAwMDMsIDB4MDE0MCwgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgyMDA5LCAweGEwMDEsIDB4MDgwYywKKwkweDkyYjAsIDB4MDBlMCwgMHg5MDFlLCAweDYzMTYsIDB4NjMxYSwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywKKwkweGUzZTgsIDB4MDBhMCwgMHg2MDE0LCAweDIwNDgsIDB4YTg3YywgMHhkMGZjLCAweDBkOTgsIDB4OTA5YywKKwkweDAwMDMsIDB4OTM5ZSwgMHgwMDAzLCAweDBkNzAsIDB4NjAwMywgMHgwMDAzLCAweDYxMDYsIDB4MDgwYywKKwkweDFjNTksIDB4NjE0NCwgMHg5MThkLCAweGEwMzUsIDB4MDgwYywgMHg5MmY3LCAweDAwMDUsIDB4MDgwYywKKwkweDk2N2EsIDB4NjExNCwgMHg4MWZmLCAweDAxNTgsIDB4MDA5NiwgMHgyMTQ4LCAweDA4MGMsIDB4ZTc5ZCwKKwkweDAwMzYsIDB4MjAxOSwgMHgwMDI5LCAweDA4MGMsIDB4ZTNlOCwgMHgwMDNlLCAweDAwOWUsIDB4MDgwYywKKwkweGFjZWIsIDB4MDgwYywgMHg5NzM4LCAweDAwMDUsIDB4MDgwYywgMHg5NmQ1LCAweDYxMTQsIDB4ODFmZiwKKwkweDAxNTgsIDB4MDA5NiwgMHgyMTQ4LCAweDA4MGMsIDB4ZTc5ZCwgMHgwMDM2LCAweDIwMTksIDB4MDAyOSwKKwkweDA4MGMsIDB4ZTNlOCwgMHgwMDNlLCAweDAwOWUsIDB4MDgwYywgMHhhY2ViLCAweDAwMDUsIDB4OTE4MiwKKwkweDAwODUsIDB4MDAwMiwgMHhkZWYxLCAweGRlZWYsIDB4ZGVlZiwgMHhkZWZkLCAweGRlZWYsIDB4ZGVlZiwKKwkweGRlZWYsIDB4ZGVlZiwgMHhkZWVmLCAweGRlZWYsIDB4ZGVlZiwgMHhkZWVmLCAweGRlZWYsIDB4MDgwYywKKwkweDBkN2QsIDB4NjAwMywgMHgwMDBiLCAweDYxMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAwOSwKKwkweDgwMjAsIDB4MDgwYywgMHg5MmIwLCAweDAxMmUsIDB4MDAwNSwgMHgwMDI2LCAweDAwZTYsIDB4MDgwYywKKwkweGU2M2YsIDB4MDExOCwgMHgwODBjLCAweGFjYjAsIDB4MDQ0MCwgMHgyMDcxLCAweDAyNjAsIDB4NzIyNCwKKwkweDYyMTYsIDB4MjAwMSwgMHgxODBlLCAweDIwMDQsIDB4ZDBlNCwgMHgwMTUwLCAweDYwMTAsIDB4MDBiNiwKKwkweDIwNTgsIDB4YmNhMCwgMHgwMGJlLCAweDJjMDAsIDB4MjAxMSwgMHgwMTRlLCAweDA4MGMsIDB4YWZkYiwKKwkweDcyMjAsIDB4MDgwYywgMHhlMjdlLCAweDAxMTgsIDB4NjAwNywgMHgwMDg2LCAweDAwNDAsIDB4NjAwNywKKwkweDAwODcsIDB4NzIyNCwgMHg5Mjk2LCAweGZmZmYsIDB4MTExMCwgMHg2MDA3LCAweDAwODYsIDB4NjAwMywKKwkweDAwMDEsIDB4MjAwOSwgMHg4MDIwLCAweDA4MGMsIDB4OTJiMCwgMHgwMGVlLCAweDAwMmUsIDB4MDAwNSwKKwkweDkxODYsIDB4MDAxMywgMHgxMTYwLCAweDYwMDQsIDB4OTA4YSwgMHgwMDg1LCAweDBhMGMsIDB4MGQ3ZCwKKwkweDkwOGEsIDB4MDA5MiwgMHgxYTBjLCAweDBkN2QsIDB4OTA4MiwgMHgwMDg1LCAweDAwYTIsIDB4OTE4NiwKKwkweDAwMjcsIDB4MDEzMCwgMHg5MTg2LCAweDAwMTQsIDB4MDExOCwgMHgwODBjLCAweGFkNmEsIDB4MDA1MCwKKwkweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDY2MGYsIDB4MDgwYywgMHg5NjdhLCAweDA4MGMsIDB4YWNlYiwKKwkweDA4MGMsIDB4OTczOCwgMHgwMDA1LCAweGRmNjAsIDB4ZGY2MiwgMHhkZjYyLCAweGRmNjAsIDB4ZGY2MCwKKwkweGRmNjAsIDB4ZGY2MCwgMHhkZjYwLCAweGRmNjAsIDB4ZGY2MCwgMHhkZjYwLCAweGRmNjAsIDB4ZGY2MCwKKwkweDA4MGMsIDB4MGQ3ZCwgMHgwODBjLCAweGFjZWIsIDB4MDgwYywgMHg5NzM4LCAweDAwMDUsIDB4OTE4MiwKKwkweDAwODUsIDB4MGEwYywgMHgwZDdkLCAweDkxODIsIDB4MDA5MiwgMHgxYTBjLCAweDBkN2QsIDB4OTE4MiwKKwkweDAwODUsIDB4MDAwMiwgMHhkZjdmLCAweGRmN2YsIDB4ZGY3ZiwgMHhkZjgxLCAweGRmN2YsIDB4ZGY3ZiwKKwkweGRmN2YsIDB4ZGY3ZiwgMHhkZjdmLCAweGRmN2YsIDB4ZGY3ZiwgMHhkZjdmLCAweGRmN2YsIDB4MDgwYywKKwkweDBkN2QsIDB4MDAwNSwgMHg5MTg2LCAweDAwMTMsIDB4MDE0OCwgMHg5MTg2LCAweDAwMTQsIDB4MDEzMCwKKwkweDkxODYsIDB4MDAyNywgMHgwMTE4LCAweDA4MGMsIDB4YWQ2YSwgMHgwMDIwLCAweDA4MGMsIDB4OTY3YSwKKwkweDA4MGMsIDB4YWNlYiwgMHgwMDA1LCAweDAwMzYsIDB4MDgwYywgMHhlNmEwLCAweDYwNGIsIDB4MDAwMCwKKwkweDIwMTksIDB4MDAwYiwgMHgwMDMxLCAweDYwMjMsIDB4MDAwNiwgMHg2MDAzLCAweDAwMDcsIDB4MDAzZSwKKwkweDAwMDUsIDB4MDEyNiwgMHgwMDM2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweGE5MWUsIDB4MDEwNiwKKwkweDAwODYsIDB4MmM0MCwgMHgwMDk2LCAweDkwNGUsIDB4MDgwYywgMHhhMjhjLCAweDAwOWUsIDB4MDA4ZSwKKwkweDE1NTgsIDB4MDA3NiwgMHgyYzM4LCAweDA4MGMsIDB4YTMzNywgMHgwMDdlLCAweDE1MjgsIDB4NjAwMCwKKwkweDkwODYsIDB4MDAwMCwgMHgwNTA4LCAweDYwMjAsIDB4OTA4NiwgMHgwMDA3LCAweDAxZTgsIDB4MDA5NiwKKwkweDYwMWMsIDB4ZDA4NCwgMHgwMTQwLCAweDA4MGMsIDB4ZTZhMCwgMHgwODBjLCAweGQwYjMsIDB4MDgwYywKKwkweDFhYzUsIDB4NjAyMywgMHgwMDA3LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGM5N2EsIDB4MDExMCwKKwkweDA4MGMsIDB4ZTNlOCwgMHgwMDllLCAweDkwMDYsIDB4NjA0NiwgMHg2MDE2LCAweDA4MGMsIDB4ZTZhMCwKKwkweDYwMjMsIDB4MDAwNywgMHgwODBjLCAweGQwYjMsIDB4MDEwZSwgMHgwOTBjLCAweGE5M2EsIDB4MDAzZSwKKwkweDAxMmUsIDB4MDAwNSwgMHgwMGY2LCAweDAwYzYsIDB4MDBiNiwgMHgwMDM2LCAweDAxNTYsIDB4MjA3OSwKKwkweDAyNjAsIDB4NzkzOCwgMHg3ODNjLCAweDA4MGMsIDB4MjY2MSwgMHgxNWU4LCAweDAwMTYsIDB4MDBjNiwKKwkweDA4MGMsIDB4NjY5MywgMHgxNWIwLCAweDAwMWUsIDB4MDBjNiwgMHgyMTYwLCAweDA4MGMsIDB4ZDBiMCwKKwkweDAwY2UsIDB4MDAyZSwgMHgwMDI2LCAweDAwMTYsIDB4MDgwYywgMHhhOTFlLCAweDIwMTksIDB4MDAyOSwKKwkweDA4MGMsIDB4YTQwNCwgMHgwODBjLCAweDk0M2QsIDB4MDA3NiwgMHg5MDNlLCAweDA4MGMsIDB4OTMwNiwKKwkweDAwN2UsIDB4MDAxZSwgMHgwMDc2LCAweDkwM2UsIDB4MDgwYywgMHhlMTY3LCAweDAwN2UsIDB4MDgwYywKKwkweGE5M2EsIDB4MDAyNiwgMHhiYTA0LCAweDkyOTQsIDB4ZmYwMCwgMHg4MjE3LCAweDkyODYsIDB4MDAwNiwKKwkweDAxMTgsIDB4OTI4NiwgMHgwMDA0LCAweDExMTgsIDB4YmFhMCwgMHgwODBjLCAweDMzMGIsIDB4MDAyZSwKKwkweGJjODQsIDB4MDAxZSwgMHgwODBjLCAweDYwYWMsIDB4YmUxMiwgMHhiZDE2LCAweGJjODYsIDB4OTAwNiwKKwkweDAwMTAsIDB4MDBjZSwgMHgwMDFlLCAweDAxNWUsIDB4MDAzZSwgMHgwMGJlLCAweDAwY2UsIDB4MDBmZSwKKwkweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LCAweDAwYjYsIDB4MDAxNiwgMHgyMDA5LCAweDE4MjQsIDB4MjEwNCwKKwkweDkwODYsIDB4MDA3NCwgMHgxOTA0LCAweGUwOGEsIDB4MjA2OSwgMHgwMjYwLCAweDY5NDQsIDB4OTE4MiwKKwkweDAxMDAsIDB4MDZlMCwgMHg2OTQwLCAweDkxODQsIDB4ODAwMCwgMHgwOTA0LCAweGUwODcsIDB4MjAwMSwKKwkweDE5N2IsIDB4MjAwNCwgMHg5MDA1LCAweDExNDAsIDB4NjAxMCwgMHgyMDU4LCAweGI4ODQsIDB4OTAwNSwKKwkweDAxMTgsIDB4OTE4NCwgMHgwODAwLCAweDA1OTgsIDB4Njk0OCwgMHg5MThhLCAweDAwMDEsIDB4MDY0OCwKKwkweDA4MGMsIDB4ZTgwNSwgMHgwMTE4LCAweDY5NzgsIDB4ZDFmYywgMHgxMWI4LCAweDIwMDksIDB4MDIwNSwKKwkweDIwMGIsIDB4MDAwMSwgMHg2OTNjLCAweDgxZmYsIDB4MTE5OCwgMHg2OTQ0LCAweDkxODIsIDB4MDEwMCwKKwkweDAyYTgsIDB4Njk0MCwgMHg4MWZmLCAweDExNzgsIDB4Njk0OCwgMHg5MThhLCAweDAwMDEsIDB4MDI4OCwKKwkweDY5NTAsIDB4OTE4YSwgMHgwMDAxLCAweDAyOTgsIDB4MDBkMCwgMHg2MDE3LCAweDAxMDAsIDB4MDBhMCwKKwkweDYwMTcsIDB4MDMwMCwgMHgwMDg4LCAweDYwMTcsIDB4MDUwMCwgMHgwMDcwLCAweDYwMTcsIDB4MDcwMCwKKwkweDAwNTgsIDB4NjAxNywgMHgwOTAwLCAweDAwNDAsIDB4NjAxNywgMHgwYjAwLCAweDAwMjgsIDB4NjAxNywKKwkweDBmMDAsIDB4MDAxMCwgMHg2MDE3LCAweDJkMDAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDgsIDB4OTAwNiwKKwkweDAwMWUsIDB4MDBiZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGM2LCAweDAwYjYsIDB4MDAyNiwKKwkweDAwMzYsIDB4MDE1NiwgMHg2MjEwLCAweDIyNTgsIDB4YmIwNCwgMHg5Mzk0LCAweDAwZmYsIDB4OTI4NiwKKwkweDAwMDYsIDB4MDE4MCwgMHg5Mjg2LCAweDAwMDQsIDB4MDE2OCwgMHg5Mzk0LCAweGZmMDAsIDB4ODIxNywKKwkweDkyODYsIDB4MDAwNiwgMHgwMTM4LCAweDkyODYsIDB4MDAwNCwgMHgwMTIwLCAweDA4MGMsIDB4NjZhMiwKKwkweDA4MDQsIDB4ZTBmNiwgMHgyMDExLCAweDAyNzYsIDB4MjBhOSwgMHgwMDA0LCAweDAwOTYsIDB4MmI0OCwKKwkweDIwMTksIDB4MDAwYSwgMHgwODBjLCAweGJjYTIsIDB4MDA5ZSwgMHgxNWM4LCAweDIwMTEsIDB4MDI3YSwKKwkweDIwYTksIDB4MDAwNCwgMHgwMDk2LCAweDJiNDgsIDB4MjAxOSwgMHgwMDA2LCAweDA4MGMsIDB4YmNhMiwKKwkweDAwOWUsIDB4MTU2OCwgMHgwMDQ2LCAweDAwMTYsIDB4YmFhMCwgMHgyMjIwLCAweDkwMDYsIDB4MjAwOSwKKwkweDE4NDgsIDB4MjEwYywgMHhkMWE0LCAweDAxMzgsIDB4MjAwOSwgMHgwMDI5LCAweDA4MGMsIDB4ZTQ0NSwKKwkweGI4MDAsIDB4YzBlNSwgMHhiODAyLCAweDA4MGMsIDB4YTkxZSwgMHgyMDE5LCAweDAwMjksIDB4MDgwYywKKwkweDk0M2QsIDB4MDA3NiwgMHgyMDM5LCAweDAwMDAsIDB4MDgwYywgMHg5MzA2LCAweDJjMDgsIDB4MDgwYywKKwkweGUxNjcsIDB4MDA3ZSwgMHgwODBjLCAweGE5M2EsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NjYwZiwKKwkweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDY1ZTMsIDB4MDAxZSwgMHgwMDRlLCAweDkwMDYsIDB4MDE1ZSwKKwkweDAwM2UsIDB4MDAyZSwgMHgwMGJlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGQ2LCAweDIwNjksIDB4MDI2ZSwKKwkweDY4MDAsIDB4OTA4NiwgMHgwODAwLCAweDAxMTgsIDB4NjAxNywgMHgwMDAwLCAweDAwMDgsIDB4OTAwNiwKKwkweDAwZGUsIDB4MDAwNSwgMHgwMGI2LCAweDAwZjYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDE1NiwKKwkweDIwNzksIDB4MDI2YywgMHg3OTMwLCAweDc4MzQsIDB4MDgwYywgMHgyNjYxLCAweDExZDAsIDB4MDgwYywKKwkweDY2OTMsIDB4MTFiOCwgMHgyMDExLCAweDAyNzAsIDB4MjBhOSwgMHgwMDA0LCAweDAwOTYsIDB4MmI0OCwKKwkweDIwMTksIDB4MDAwYSwgMHgwODBjLCAweGJjYTIsIDB4MDA5ZSwgMHgxMTU4LCAweDIwMTEsIDB4MDI3NCwKKwkweDIwYTksIDB4MDAwNCwgMHgwMDk2LCAweDJiNDgsIDB4MjAxOSwgMHgwMDA2LCAweDA4MGMsIDB4YmNhMiwKKwkweDAwOWUsIDB4MDE1ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMGZlLCAweDAwYmUsIDB4MDAwNSwKKwkweDAwYjYsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMTU2LCAweDIwMTEsIDB4MDI2MywKKwkweDIyMDQsIDB4ODIxMSwgMHgyMjBjLCAweDA4MGMsIDB4MjY2MSwgMHgxMWQwLCAweDA4MGMsIDB4NjY5MywKKwkweDExYjgsIDB4MjAxMSwgMHgwMjc2LCAweDIwYTksIDB4MDAwNCwgMHgwMDk2LCAweDJiNDgsIDB4MjAxOSwKKwkweDAwMGEsIDB4MDgwYywgMHhiY2EyLCAweDAwOWUsIDB4MTE1OCwgMHgyMDExLCAweDAyN2EsIDB4MjBhOSwKKwkweDAwMDQsIDB4MDA5NiwgMHgyYjQ4LCAweDIwMTksIDB4MDAwNiwgMHgwODBjLCAweGJjYTIsIDB4MDA5ZSwKKwkweDAxNWUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBlNiwKKwkweDAwYzYsIDB4MDA4NiwgMHgwMDc2LCAweDAwNjYsIDB4MDA1NiwgMHgwMDQ2LCAweDAwMjYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweGE5N2MsIDB4MDEwNiwgMHgxOTBjLCAweGE5MWUsIDB4Mjc0MCwKKwkweDIwMjksIDB4MTlmMiwgMHgyNTJjLCAweDIwMjEsIDB4MTlmOSwgMHgyNDI0LCAweDIwNjEsIDB4MWRkYywKKwkweDIwNzEsIDB4MTgwMCwgMHg3NjU0LCAweDcwNzQsIDB4ODFmZiwgMHgwMTUwLCAweDAwMDYsIDB4OTE4NiwKKwkweDFiMzQsIDB4MDAwZSwgMHgwMTI4LCAweDgwMDEsIDB4OTYwMiwgMHgxYTA0LCAweGUyMGMsIDB4MDAxOCwKKwkweDk2MDYsIDB4MDkwNCwgMHhlMjBjLCAweDA4MGMsIDB4OGMxZiwgMHgwOTA0LCAweGUyMDMsIDB4MjEwMCwKKwkweDljMDYsIDB4MDkwNCwgMHhlMjAzLCAweDA4MGMsIDB4ZTQ4NiwgMHgxOTA0LCAweGUyMDMsIDB4MDgwYywKKwkweGU4MjIsIDB4MDkwNCwgMHhlMjAzLCAweDA4MGMsIDB4ZTQ3NiwgMHgwOTA0LCAweGUyMDMsIDB4NjcyMCwKKwkweDk3ODYsIDB4MDAwMSwgMHgxMTQ4LCAweDA4MGMsIDB4MzNhOCwgMHgwOTA0LCAweGUyNGUsIDB4NjAwNCwKKwkweDkwODYsIDB4MDAwMCwgMHgxOTA0LCAweGUyNGUsIDB4OTc4NiwgMHgwMDA0LCAweDA5MDQsIDB4ZTI0ZSwKKwkweDk3ODYsIDB4MDAwNywgMHgwOTA0LCAweGUyMDMsIDB4MjUwMCwgMHg5YzA2LCAweDA5MDQsIDB4ZTIwMywKKwkweDI0MDAsIDB4OWMwNiwgMHgwOTA0LCAweGUyMDMsIDB4ODhmZiwgMHgwMTE4LCAweDYwNWMsIDB4OTkwNiwKKwkweDE1ZDAsIDB4MDA5NiwgMHg2MDQzLCAweGZmZmYsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDQsIDB4MTEyMCwKKwkweDAwMTYsIDB4MDgwYywgMHgxYWM1LCAweDAwMWUsIDB4OTc4NiwgMHgwMDBhLCAweDAxNDgsIDB4MDgwYywKKwkweGNiOTEsIDB4MTEzMCwgMHgwODBjLCAweGI2OTMsIDB4MDA5ZSwgMHgwODBjLCAweGFjZWIsIDB4MDQxOCwKKwkweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGM5N2EsIDB4MDFkOCwgMHg5Nzg2LCAweDAwMDMsIDB4MTU4OCwKKwkweGE4NjcsIDB4MDEwMywgMHhhODdjLCAweGQwY2MsIDB4MDEzMCwgMHgwMDk2LCAweGE4NzgsIDB4MjA0OCwKKwkweDA4MGMsIDB4MGZmOSwgMHgwMDllLCAweGFiN2EsIDB4YTg3NywgMHgwMDAwLCAweDA4MGMsIDB4ZTc5ZCwKKwkweDAwMTYsIDB4MDgwYywgMHhjYzdmLCAweDA4MGMsIDB4NmRlMiwgMHgwMDFlLCAweDA4MGMsIDB4Y2I2YiwKKwkweDAwOWUsIDB4MDgwYywgMHhhY2ViLCAweDljZTAsIDB4MDAxYywgMHgyMDAxLCAweDE4MWEsIDB4MjAwNCwKKwkweDljMDIsIDB4MTIxMCwgMHgwODA0LCAweGUxODAsIDB4MDEwZSwgMHgxOTBjLCAweGE5M2EsIDB4MDEyZSwKKwkweDAwMmUsIDB4MDA0ZSwgMHgwMDVlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMDhlLCAweDAwY2UsIDB4MDBlZSwKKwkweDAwMDUsIDB4OTc4NiwgMHgwMDA2LCAweDExNTAsIDB4OTM4NiwgMHgwMDA1LCAweDAxMjgsIDB4MDgwYywKKwkweGU3OWQsIDB4MDgwYywgMHhlM2U4LCAweDA4ZTAsIDB4MDA5ZSwgMHgwOGU4LCAweDk3ODYsIDB4MDAwOSwKKwkweDExZjgsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDQsIDB4MDFjMCwgMHg2MDAwLCAweDkwODYsIDB4MDAwMywKKwkweDExYTAsIDB4MDgwYywgMHg5NmQ1LCAweDAwOTYsIDB4NjExNCwgMHgyMTQ4LCAweDA4MGMsIDB4Yzk3YSwKKwkweDAxMTgsIDB4NjAxMCwgMHgwODBjLCAweDZkZWUsIDB4MDA5ZSwgMHgwMGM2LCAweDA4MGMsIDB4YWNiMCwKKwkweDAwY2UsIDB4MDAzNiwgMHgwODBjLCAweDk3MzgsIDB4MDAzZSwgMHgwMDllLCAweDA4MDQsIDB4ZTIwMywKKwkweDk3ODYsIDB4MDAwYSwgMHgwOTA0LCAweGUxZjMsIDB4MDgwNCwgMHhlMWU4LCAweDgxZmYsIDB4MDkwNCwKKwkweGUyMDMsIDB4OTE4MCwgMHgwMDAxLCAweDIwMDQsIDB4OTA4NiwgMHgwMDE4LCAweDAxMzgsIDB4OTE4MCwKKwkweDAwMDEsIDB4MjAwNCwgMHg5MDg2LCAweDAwMmQsIDB4MTkwNCwgMHhlMjAzLCAweDYwMDAsIDB4OTA4NiwKKwkweDAwMDIsIDB4MTkwNCwgMHhlMjAzLCAweDA4MGMsIDB4Y2I4MCwgMHgwMTM4LCAweDA4MGMsIDB4Y2I5MSwKKwkweDE5MDQsIDB4ZTIwMywgMHgwODBjLCAweGI2OTMsIDB4MDAzOCwgMHgwODBjLCAweDMyNmYsIDB4MDgwYywKKwkweGNiOTEsIDB4MTExMCwgMHgwODBjLCAweGI2OTMsIDB4MDgwYywgMHhhY2ViLCAweDA4MDQsIDB4ZTIwMywKKwkweGE4NjQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAzOSwgMHgwMDA1LCAweDAwYzYsIDB4MDBlNiwKKwkweDAwMTYsIDB4MmMwOCwgMHgyMTcwLCAweDkwMDYsIDB4MDgwYywgMHhlNDBmLCAweDAwMWUsIDB4MDEyMCwKKwkweDYwMjAsIDB4OTA4NCwgMHgwMDBmLCAweDAwMWIsIDB4MDBlZSwgMHgwMGNlLCAweDAwMDUsIDB4ZTI5ZCwKKwkweGUyOWQsIDB4ZTI5ZCwgMHhlMjlkLCAweGUyOWQsIDB4ZTI5ZCwgMHhlMjlmLCAweGUyOWQsIDB4ZTI5ZCwKKwkweGUyOWQsIDB4ZTI5ZCwgMHhhY2ViLCAweGFjZWIsIDB4ZTI5ZCwgMHg5MDA2LCAweDAwMDUsIDB4MDAzNiwKKwkweDAwNDYsIDB4MDAxNiwgMHg3MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiY2EwLCAweDAwYmUsIDB4MmMwMCwKKwkweDIwMDksIDB4MDAyMCwgMHgwODBjLCAweGU0NDUsIDB4MDAxZSwgMHgwMDRlLCAweDIwMTksIDB4MDAwMiwKKwkweDA4MGMsIDB4ZGZhMSwgMHgwMDNlLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwOTYsIDB4MDgwYywKKwkweGM5N2EsIDB4MDE0MCwgMHg2MDE0LCAweDkwNGQsIDB4MDgwYywgMHhjNTY2LCAweDY4N2IsIDB4MDAwNSwKKwkweDA4MGMsIDB4NmRlZSwgMHgwMDllLCAweDA4MGMsIDB4YWNlYiwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwKKwkweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDY1Y2YsIDB4MDE1NiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwKKwkweDIwYTksIDB4MDAwNCwgMHgyMDE5LCAweDE4MDUsIDB4MjAxMSwgMHgwMjc2LCAweDA4MGMsIDB4YmM4ZSwKKwkweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAxNWUsIDB4OTAwNSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwKKwkweDAwYzYsIDB4MDA4NiwgMHgwMDc2LCAweDAwNjYsIDB4MDBiNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDI3NDAsIDB4MjA2MSwgMHgxZGRjLCAweDIwNzksIDB4MDAwMSwgMHg4ZmZmLCAweDA5MDQsIDB4ZTMzOCwKKwkweDIwNzEsIDB4MTgwMCwgMHg3NjU0LCAweDcwNzQsIDB4ODAwMSwgMHg5NjAyLCAweDFhMDQsIDB4ZTMzOCwKKwkweDg4ZmYsIDB4MDEyMCwgMHgyODAwLCAweDljMDYsIDB4MTU5MCwgMHgyMDc4LCAweDA4MGMsIDB4ZTQ3NiwKKwkweDA1NzAsIDB4MjQwMCwgMHg5YzA2LCAweDA1NTgsIDB4NjcyMCwgMHg5Nzg2LCAweDAwMDYsIDB4MTUzOCwKKwkweDk3ODYsIDB4MDAwNywgMHgwNTIwLCAweDg4ZmYsIDB4MTE0MCwgMHg2MDEwLCAweDliMDYsIDB4MTFmOCwKKwkweDg1ZmYsIDB4MDExOCwgMHg2MDVjLCAweDkxMDYsIDB4MTFkMCwgMHgwMDk2LCAweDYwMWMsIDB4ZDA4NCwKKwkweDAxNDAsIDB4MDgwYywgMHhlNmEwLCAweDA4MGMsIDB4ZDBiMywgMHgwODBjLCAweDFhYzUsIDB4NjAyMywKKwkweDAwMDcsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Yzk3YSwgMHgwMTIwLCAweDAwNDYsIDB4MDgwYywKKwkweGUzZTgsIDB4MDA0ZSwgMHgwMDllLCAweDA4MGMsIDB4YWNlYiwgMHg4OGZmLCAweDExOTgsIDB4OWNlMCwKKwkweDAwMWMsIDB4MjAwMSwgMHgxODFhLCAweDIwMDQsIDB4OWMwMiwgMHgxMjEwLCAweDA4MDQsIDB4ZTJlZCwKKwkweDkwMDYsIDB4MDEyZSwgMHgwMGJlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMDhlLCAweDAwY2UsIDB4MDBlZSwKKwkweDAwZmUsIDB4MDAwNSwgMHg5OGM1LCAweDAwMDEsIDB4MGNhMCwgMHgwODBjLCAweGE5MWUsIDB4MDBiNiwKKwkweDAwNzYsIDB4MDA1NiwgMHgwMDg2LCAweDkwNDYsIDB4MjAyOSwgMHgwMDAxLCAweDJjMjAsIDB4MjAxOSwKKwkweDAwMDIsIDB4NjIxMCwgMHgyMjU4LCAweDAwOTYsIDB4OTA0ZSwgMHgwODBjLCAweGEyOGMsIDB4MDA5ZSwKKwkweDAwOGUsIDB4OTAzZSwgMHgwODBjLCAweGEzMzcsIDB4MDgwYywgMHhlMmRlLCAweDAwNWUsIDB4MDA3ZSwKKwkweDAwYmUsIDB4MDgwYywgMHhhOTNhLCAweDAwMDUsIDB4MDgwYywgMHhhOTFlLCAweDAwYjYsIDB4MDA0NiwKKwkweDAwNTYsIDB4MDA3NiwgMHgwMGM2LCAweDAxNTYsIDB4MmMyMCwgMHgyMTI4LCAweDIwYTksIDB4MDA3ZiwKKwkweDkwMGUsIDB4MDAxNiwgMHgwMDM2LCAweDA4MGMsIDB4NjY5MywgMHgxMTkwLCAweDAwNTYsIDB4MDA4NiwKKwkweDkwNDYsIDB4MjUwOCwgMHgyMDI5LCAweDAwMDEsIDB4MDA5NiwgMHg5MDRlLCAweDA4MGMsIDB4YTI4YywKKwkweDAwOWUsIDB4MDA4ZSwgMHg5MDNlLCAweDA4MGMsIDB4YTMzNywgMHgwODBjLCAweGUyZGUsIDB4MDA1ZSwKKwkweDAwM2UsIDB4MDAxZSwgMHg4MTA4LCAweDFmMDQsIDB4ZTM3MSwgMHgwMTVlLCAweDAwY2UsIDB4MDA3ZSwKKwkweDAwNWUsIDB4MDA0ZSwgMHgwMGJlLCAweDA4MGMsIDB4YTkzYSwgMHgwMDA1LCAweDA4MGMsIDB4YTkxZSwKKwkweDAwYjYsIDB4MDA3NiwgMHgwMDU2LCAweDYyMTAsIDB4MjI1OCwgMHgwMDg2LCAweDkwNDYsIDB4MjAyOSwKKwkweDAwMDEsIDB4MjAxOSwgMHgwMDQ4LCAweDAwOTYsIDB4OTA0ZSwgMHgwODBjLCAweGEyOGMsIDB4MDA5ZSwKKwkweDAwOGUsIDB4OTAzZSwgMHgwODBjLCAweGEzMzcsIDB4MmMyMCwgMHgwODBjLCAweGUyZGUsIDB4MDA1ZSwKKwkweDAwN2UsIDB4MDBiZSwgMHgwODBjLCAweGE5M2EsIDB4MDAwNSwgMHgwODBjLCAweGE5MWUsIDB4MDBiNiwKKwkweDAwNDYsIDB4MDA1NiwgMHgwMDc2LCAweDAwYzYsIDB4MDE1NiwgMHgyYzIwLCAweDIwYTksIDB4MDgwMCwKKwkweDkwMGUsIDB4MDAxNiwgMHgwMDM2LCAweDA4MGMsIDB4NjY5MywgMHgxMWEwLCAweDAwODYsIDB4OTA0NiwKKwkweDI4MjgsIDB4MDA0NiwgMHgyMDIxLCAweDAwMDEsIDB4MDgwYywgMHhlNjg0LCAweDAwNGUsIDB4MDA5NiwKKwkweDkwNGUsIDB4MDgwYywgMHhhMjhjLCAweDAwOWUsIDB4MDA4ZSwgMHg5MDNlLCAweDA4MGMsIDB4YTMzNywKKwkweDA4MGMsIDB4ZTJkZSwgMHgwMDNlLCAweDAwMWUsIDB4ODEwOCwgMHgxZjA0LCAweGUzYzEsIDB4MDE1ZSwKKwkweDAwY2UsIDB4MDA3ZSwgMHgwMDVlLCAweDAwNGUsIDB4MDBiZSwgMHgwODBjLCAweGE5M2EsIDB4MDAwNSwKKwkweDAwMTYsIDB4MDBmNiwgMHgwODBjLCAweGM5NzgsIDB4MDE5OCwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwKKwkweDkwODYsIDB4MDA0NiwgMHgwMTgwLCAweGE4MDAsIDB4OTA3ZCwgMHgwMTM4LCAweGE4MDMsIDB4MDAwMCwKKwkweGFiODIsIDB4MDgwYywgMHg2ZGVlLCAweDJmNDgsIDB4MGNiMCwgMHhhYjgyLCAweDA4MGMsIDB4NmRlZSwKKwkweDAwZmUsIDB4MDAxZSwgMHgwMDA1LCAweGE4MDAsIDB4OTA3ZCwgMHgwMTMwLCAweGE4MDMsIDB4MDAwMCwKKwkweDA4MGMsIDB4NmRlZSwgMHgyZjQ4LCAweDBjYjgsIDB4MDgwYywgMHg2ZGVlLCAweDBjODgsIDB4MDBlNiwKKwkweDAwNDYsIDB4MDAzNiwgMHgyMDYxLCAweDFkZGMsIDB4OTAwNSwgMHgxMTM4LCAweDIwNzEsIDB4MTgwMCwKKwkweDc0NTQsIDB4NzA3NCwgMHg4MDAxLCAweDk0MDIsIDB4MTJmOCwgMHgyMTAwLCAweDljMDYsIDB4MDE4OCwKKwkweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDAxNjgsIDB4NjAwOCwgMHg5MjA2LCAweDExNTAsIDB4NjMyMCwKKwkweDkzODYsIDB4MDAwOSwgMHgwMWIwLCAweDYwMTAsIDB4OTFhMCwgMHgwMDA0LCAweDI0MjQsIDB4OTQwNiwKKwkweDAxNDAsIDB4OWNlMCwgMHgwMDFjLCAweDIwMDEsIDB4MTgxYSwgMHgyMDA0LCAweDljMDIsIDB4MTIyMCwKKwkweDBjMjAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDgsIDB4OTAwNiwgMHgwMDNlLCAweDAwNGUsIDB4MDBlZSwKKwkweDAwMDUsIDB4NjMxYywgMHhkM2M0LCAweDFkNjgsIDB4MGMzMCwgMHgwMDk2LCAweDAwMDYsIDB4MDgwYywKKwkweDEwNDcsIDB4MDAwZSwgMHgwOTBjLCAweDBkN2QsIDB4YWFlMiwgMHhhODY3LCAweDAxMGQsIDB4YTg4ZSwKKwkweDAwMjYsIDB4MjAxMCwgMHgwODBjLCAweGM5NjgsIDB4MjAwMSwgMHgwMDAwLCAweDAxMjAsIDB4MjIwMCwKKwkweDkwODAsIDB4MDAxNywgMHgyMDA0LCAweDAwMmUsIDB4YTg3YSwgMHg5MTg2LCAweDAwMjAsIDB4MDExMCwKKwkweGE4ZTMsIDB4ZmZmZiwgMHhhOTg2LCAweGFjNzYsIDB4YTg3ZiwgMHgwMDAwLCAweDIwMDEsIDB4MTk4ZCwKKwkweDIwMDQsIDB4YTg4MiwgMHg5MDA2LCAweGE4MDIsIDB4YTg2YSwgMHhhODhhLCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDgwYywgMHg2ZGVlLCAweDAxMmUsIDB4MDA5ZSwgMHgwMDA1LCAweDY3MDAsIDB4OTc4NiwKKwkweDAwMDAsIDB4MDE1OCwgMHg5Nzg2LCAweDAwMDEsIDB4MDE0MCwgMHg5Nzg2LCAweDAwMGEsIDB4MDEyOCwKKwkweDk3ODYsIDB4MDAwOSwgMHgwMTEwLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwZTYsIDB4NjAxMCwKKwkweDkwNzUsIDB4MDEzOCwgMHgwMGI2LCAweDIwNTgsIDB4YjhhMCwgMHgwMGJlLCAweDkyMDYsIDB4MDBlZSwKKwkweDAwMDUsIDB4OTA4NSwgMHgwMDAxLCAweDBjZDgsIDB4MDAxNiwgMHg2MDA0LCAweDkwOGUsIDB4MDAxZSwKKwkweDExYTAsIDB4ODAwNywgMHg2MTM0LCAweDkxOGMsIDB4MDBmZiwgMHg5MTA1LCAweDYwMzYsIDB4NjAwNywKKwkweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMjMsIDB4MDAwNSwgMHgyMDAxLCAweDE5ODYsIDB4MjAwNCwKKwkweDYwMWEsIDB4MjAwOSwgMHg4MDIwLCAweDA4MGMsIDB4OTJiMCwgMHgwMDFlLCAweDAwMDUsIDB4YTAwMSwKKwkweGEwMDEsIDB4MDAwNSwgMHg2MDI0LCAweGQwZTQsIDB4MDE1OCwgMHhkMGNjLCAweDAxMTgsIDB4MDgwYywKKwkweGNjYzYsIDB4MDAzMCwgMHgwODBjLCAweGU2YTAsIDB4MDgwYywgMHg4OTRlLCAweDA4MGMsIDB4YWNiMCwKKwkweDAwMDUsIDB4OTI4MCwgMHgwMDA4LCAweDIwMDQsIDB4OTA4NCwgMHgwMDBmLCAweDAwMDIsIDB4ZTRkNSwKKwkweGU0ZDUsIDB4ZTRkNSwgMHhlNGQ3LCAweGU0ZDUsIDB4ZTRkNywgMHhlNGQ3LCAweGU0ZDUsIDB4ZTRkNywKKwkweGU0ZDUsIDB4ZTRkNSwgMHhlNGQ1LCAweGU0ZDUsIDB4ZTRkNSwgMHg5MDA2LCAweDAwMDUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAwNSwgMHg5MjgwLCAweDAwMDgsIDB4MjAwNCwgMHg5MDg0LCAweDAwMGYsIDB4MDAwMiwKKwkweGU0ZWUsIDB4ZTRlZSwgMHhlNGVlLCAweGU0ZWUsIDB4ZTRlZSwgMHhlNGVlLCAweGU0ZmIsIDB4ZTRlZSwKKwkweGU0ZWUsIDB4ZTRlZSwgMHhlNGVlLCAweGU0ZWUsIDB4ZTRlZSwgMHhlNGVlLCAweDYwMDcsIDB4MDAzYiwKKwkweDYwMmYsIDB4MDAwOSwgMHg2MDE3LCAweDJhMDAsIDB4NjAwMywgMHgwMDAxLCAweDIwMDksIDB4ODAyMCwKKwkweDA4MGMsIDB4OTJiMCwgMHgwMDA1LCAweDAwOTYsIDB4MDBjNiwgMHgyMjYwLCAweDA4MGMsIDB4ZTZhMCwKKwkweDYwNGIsIDB4MDAwMCwgMHg2MDI0LCAweGMwZjQsIDB4YzBlNCwgMHg2MDI2LCAweDYwM2IsIDB4MDAwMCwKKwkweDAwY2UsIDB4MDBkNiwgMHgyMjY4LCAweDkxODYsIDB4MDAwNywgMHgxOTA0LCAweGU1NTQsIDB4NjgxNCwKKwkweDkwMDUsIDB4MDEzOCwgMHgyMDQ4LCAweGE4N2MsIDB4ZDBmYywgMHgxMTE4LCAweDAwZGUsIDB4MDA5ZSwKKwkweDA4YTgsIDB4NjAwNywgMHgwMDNhLCAweDYwMDMsIDB4MDAwMSwgMHgyMDA5LCAweDgwMjAsIDB4MDgwYywKKwkweDkyYjAsIDB4MDBjNiwgMHgyZDYwLCAweDYxMDAsIDB4OTE4NiwgMHgwMDAyLCAweDE5MDQsIDB4ZTVjYiwKKwkweDYwMTQsIDB4OTAwNSwgMHgxMTM4LCAweDYwMDAsIDB4OTA4NiwgMHgwMDA3LCAweDE5MGMsIDB4MGQ3ZCwKKwkweDA4MDQsIDB4ZTVjYiwgMHgyMDQ4LCAweDA4MGMsIDB4Yzk3YSwgMHgxMTMwLCAweDAwMjgsIDB4MjA0OCwKKwkweGE4MDAsIDB4OTAwNSwgMHgxZGUwLCAweDI5MDAsIDB4MjA0OCwgMHhhODdjLCAweDkwODQsIDB4MDAwMywKKwkweDkwODYsIDB4MDAwMiwgMHgxMTY4LCAweGE4N2MsIDB4YzBkYywgMHhjMGY0LCAweGE4N2UsIDB4YTg4MCwKKwkweGMwZmMsIDB4YTg4MiwgMHgyMDA5LCAweDAwNDMsIDB4MDgwYywgMHhkZGRlLCAweDA4MDQsIDB4ZTVjYiwKKwkweDIwMDksIDB4MDA0MSwgMHgwODA0LCAweGU1YzUsIDB4OTE4NiwgMHgwMDA1LCAweDE1YTAsIDB4NjgxNCwKKwkweDIwNDgsIDB4YTg3YywgMHhkMGJjLCAweDExMjAsIDB4MDBkZSwgMHgwMDllLCAweDA4MDQsIDB4ZTRlZSwKKwkweGQwYjQsIDB4MDEyOCwgMHhkMGZjLCAweDA5MGMsIDB4MGQ3ZCwgMHgwODA0LCAweGU1MGYsIDB4NjAwNywKKwkweDAwM2EsIDB4NjAwMywgMHgwMDAxLCAweDIwMDksIDB4ODAyMCwgMHgwODBjLCAweDkyYjAsIDB4MDBjNiwKKwkweDJkNjAsIDB4NjEwMCwgMHg5MTg2LCAweDAwMDIsIDB4MDEyMCwgMHg5MTg2LCAweDAwMDQsIDB4MTkwNCwKKwkweGU1Y2IsIDB4NjgxNCwgMHgyMDQ4LCAweGE5N2MsIDB4YzFmNCwgMHhjMWRjLCAweGE5N2UsIDB4YTk4MCwKKwkweGMxZmMsIDB4YzFiYywgMHhhOTgyLCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweDE3NzgsIDB4MDBmZSwKKwkweDIwMDksIDB4MDA0MiwgMHgwNGQwLCAweDAwMzYsIDB4MDgwYywgMHgxMDQ3LCAweDA5MGMsIDB4MGQ3ZCwKKwkweGE4NjcsIDB4MDEwZCwgMHg5MDA2LCAweGE4MDIsIDB4YTg2YSwgMHhhODhhLCAweDJkMTgsIDB4YWI4ZSwKKwkweGE4ODcsIDB4MDA0NSwgMHgyYzAwLCAweGE4OTIsIDB4NjAzOCwgMHhhOGEyLCAweDIzNjAsIDB4NjAyNCwKKwkweGMwZGQsIDB4NjAyNiwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiOGEwLCAweDAwYmUsIDB4MjAwNCwKKwkweDYzNWMsIDB4YWI3YSwgMHhhODc2LCAweDkwMDYsIDB4YTg3ZSwgMHhhODgyLCAweGFkOWEsIDB4YWU5NiwKKwkweGE4OWYsIDB4MDAwMSwgMHgwODBjLCAweDZkZWUsIDB4MjAxOSwgMHgwMDQ1LCAweDYwMDgsIDB4MjA2OCwKKwkweDA4MGMsIDB4ZGZhMSwgMHgyZDAwLCAweDYwMGEsIDB4NjAyMywgMHgwMDA2LCAweDYwMDMsIDB4MDAwNywKKwkweDkwMWUsIDB4NjMxYSwgMHg2MzRhLCAweDAwM2UsIDB4MDAzOCwgMHg2MDRiLCAweDAwMDAsIDB4NjAwMywKKwkweDAwMDcsIDB4MDgwYywgMHhkZGRlLCAweDAwY2UsIDB4MDBkZSwgMHgwMDllLCAweDAwMDUsIDB4OTE4NiwKKwkweDAwMTMsIDB4MTEyOCwgMHg2MDA0LCAweDkwODIsIDB4MDA4NSwgMHgyMDA4LCAweDAwYzIsIDB4OTE4NiwKKwkweDAwMjcsIDB4MTE3OCwgMHgwODBjLCAweDk2N2EsIDB4MDAzNiwgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwKKwkweDIwMTksIDB4MDAwNCwgMHgwODBjLCAweGUzZTgsIDB4MDA5ZSwgMHgwMDNlLCAweDA4MGMsIDB4OTczOCwKKwkweDAwMDUsIDB4OTE4NiwgMHgwMDE0LCAweDBkNzAsIDB4MDgwYywgMHhhZDZhLCAweDAwMDUsIDB4ZTVmZSwKKwkweGU1ZmMsIDB4ZTVmYywgMHhlNWZjLCAweGU1ZmMsIDB4ZTVmYywgMHhlNWZlLCAweGU1ZmMsIDB4ZTVmYywKKwkweGU1ZmMsIDB4ZTVmYywgMHhlNWZjLCAweGU1ZmMsIDB4MDgwYywgMHgwZDdkLCAweDYwMDMsIDB4MDAwYywKKwkweDA4MGMsIDB4OTczOCwgMHgwMDA1LCAweDkxODIsIDB4MDA5MiwgMHgxMjIwLCAweDkxODIsIDB4MDA4NSwKKwkweDAyMDgsIDB4MDAxYSwgMHgwODBjLCAweGFkNmEsIDB4MDAwNSwgMHhlNjFhLCAweGU2MWEsIDB4ZTYxYSwKKwkweGU2MWEsIDB4ZTYxYywgMHhlNjNjLCAweGU2MWEsIDB4ZTYxYSwgMHhlNjFhLCAweGU2MWEsIDB4ZTYxYSwKKwkweGU2MWEsIDB4ZTYxYSwgMHgwODBjLCAweDBkN2QsIDB4MDBkNiwgMHgyYzY4LCAweDA4MGMsIDB4YWM1YSwKKwkweDAxYjAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAxZSwgMHgyMDA5LCAweDAyNmUsIDB4MjEwYywKKwkweDYxM2EsIDB4MjAwOSwgMHgwMjZmLCAweDIxMGMsIDB4NjEzZSwgMHg2MDBiLCAweGZmZmYsIDB4NjkxMCwKKwkweDYxMTIsIDB4NjAyMywgMHgwMDA0LCAweDIwMDksIDB4ODAyMCwgMHgwODBjLCAweDkyYjAsIDB4MmQ2MCwKKwkweDA4MGMsIDB4YWNiMCwgMHgwMGRlLCAweDAwMDUsIDB4MDgwYywgMHhhY2IwLCAweDAwMDUsIDB4MDBlNiwKKwkweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwgMHhkMGVjLCAweDAwZWUsIDB4MDAwNSwKKwkweDIwMDksIDB4MTg2NywgMHgyMTBjLCAweGQxZWMsIDB4MDViMCwgMHg2MDAzLCAweDAwMDIsIDB4NjAyNCwKKwkweGMwZTUsIDB4NjAyNiwgMHhkMGNjLCAweDAxNTAsIDB4MjAwMSwgMHgxOTg3LCAweDIwMDQsIDB4NjA0YSwKKwkweDIwMDksIDB4MTg2NywgMHgyMTBjLCAweGQxZjQsIDB4MTUyMCwgMHgwMGEwLCAweDIwMDksIDB4MTg2NywKKwkweDIxMGMsIDB4ZDFmNCwgMHgwMTI4LCAweDYwMjQsIDB4YzBlNCwgMHg2MDI2LCAweDkwMDYsIDB4MDBkOCwKKwkweDIwMDEsIDB4MTk4NywgMHgyMDBjLCAweDIwMDEsIDB4MTk4NSwgMHgyMDA0LCAweDkxMDAsIDB4OTA4MCwKKwkweDAwMGEsIDB4NjA0YSwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiOGJjLCAweDAwYmUsIDB4MDAwOCwKKwkweDIxMDQsIDB4OTAwNSwgMHgwMTE4LCAweDkwODgsIDB4MDAwMywgMHgwY2QwLCAweDJjMGEsIDB4NjAwZiwKKwkweDAwMDAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDAxNiwgMHgwMGM2LCAweDAwZTYsIDB4NjE1YywKKwkweGI4YmMsIDB4MjA2MCwgMHg4Y2ZmLCAweDAxODAsIDB4ODRmZiwgMHgxMTE4LCAweDYwNWMsIDB4OTEwNiwKKwkweDExMzgsIDB4NjAwYywgMHgyMDcyLCAweDA4MGMsIDB4ODk0ZSwgMHgwODBjLCAweGFjYjAsIDB4MDAxMCwKKwkweDljZjAsIDB4MDAwMywgMHgyZTY0LCAweDBjNzAsIDB4MDBlZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwNSwKKwkweDAwZDYsIDB4MDBiNiwgMHg2MDEwLCAweDIwNTgsIDB4YjhiYywgMHgyMDY4LCAweDkwMDUsIDB4MDEzMCwKKwkweDljMDYsIDB4MDExMCwgMHg2ODBjLCAweDBjZDAsIDB4NjAwYywgMHg2ODBlLCAweDAwYmUsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDAyNiwgMHgwMDM2LCAweDAxNTYsIDB4MjAxMSwgMHgxODJjLCAweDIyMDQsIDB4OTA4NCwKKwkweDAwZmYsIDB4MjAxOSwgMHgwMjZlLCAweDIzMzQsIDB4OTYzNiwgMHgxNTA4LCAweDgzMTgsIDB4MjMzNCwKKwkweDIyMDQsIDB4OTA4NCwgMHhmZjAwLCAweDk2MzYsIDB4MTFkMCwgMHgyMDExLCAweDAyNzAsIDB4MjBhOSwKKwkweDAwMDQsIDB4NjAxMCwgMHgwMDk2LCAweDIwNDgsIDB4MjAxOSwgMHgwMDBhLCAweDA4MGMsIDB4YmNhMiwKKwkweDAwOWUsIDB4MTE2OCwgMHgyMDExLCAweDAyNzQsIDB4MjBhOSwgMHgwMDA0LCAweDYwMTAsIDB4MDA5NiwKKwkweDIwNDgsIDB4MjAxOSwgMHgwMDA2LCAweDA4MGMsIDB4YmNhMiwgMHgwMDllLCAweDExMDAsIDB4MDE1ZSwKKwkweDAwM2UsIDB4MDAyZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLCAweDA4MGMsIDB4NjAyNSwKKwkweDA4MGMsIDB4MzAxMSwgMHgwMGVlLCAweDAwMDUsIDB4MDA5NiwgMHgwMDI2LCAweDA4MGMsIDB4MTA0NywKKwkweDA5MGMsIDB4MGQ3ZCwgMHhhODVjLCAweDkwODAsIDB4MDAxYSwgMHgyMGEwLCAweDIwYTksIDB4MDAwYywKKwkweGE4NjAsIDB4MjBlOCwgMHg5MDA2LCAweDQwMDQsIDB4OTE4NiwgMHgwMDQ2LCAweDExMTgsIDB4YTg2NywKKwkweDAxMzYsIDB4MDAzOCwgMHhhODY3LCAweDAxMzgsIDB4OTE4NiwgMHgwMDQxLCAweDAxMTAsIDB4YTg3YiwKKwkweDAwMDEsIDB4NzAzOCwgMHg5MDg0LCAweGZmMDAsIDB4NzI0MCwgMHg5Mjk0LCAweGZmMDAsIDB4ODAwNywKKwkweDkyMTUsIDB4YWE5YSwgMHg5MTg2LCAweDAwNDYsIDB4MTE2OCwgMHg3MDM4LCAweDkwODQsIDB4MDBmZiwKKwkweDcyM2MsIDB4OTI5NCwgMHhmZjAwLCAweDkyMTUsIDB4YWE5ZSwgMHg3MjNjLCAweDkyOTQsIDB4MDBmZiwKKwkweGFhYTIsIDB4MDA2MCwgMHg3MDQwLCAweDkwODQsIDB4MDBmZiwgMHg3MjQ0LCAweDkyOTQsIDB4ZmYwMCwKKwkweDkyMTUsIDB4YWE5ZSwgMHg3MjQ0LCAweDkyOTQsIDB4MDBmZiwgMHhhYWEyLCAweDkxODYsIDB4MDA0NiwKKwkweDExMTgsIDB4OWU5MCwgMHgwMDEyLCAweDAwMTAsIDB4OWU5MCwgMHgwMDFhLCAweDIyMDQsIDB4ODAwNywKKwkweGE4YTYsIDB4ODIxMCwgMHgyMjA0LCAweDgwMDcsIDB4YThhYSwgMHg4MjEwLCAweDIyMDQsIDB4ODAwNywKKwkweGE4YWUsIDB4ODIxMCwgMHgyMjA0LCAweDgwMDcsIDB4YThiMiwgMHg4MjEwLCAweDkxODYsIDB4MDA0NiwKKwkweDExYjgsIDB4OWU5MCwgMHgwMDE2LCAweDIyMDQsIDB4ODAwNywgMHhhOGI2LCAweDgyMTAsIDB4MjIwNCwKKwkweDgwMDcsIDB4YThiYSwgMHg4MjEwLCAweDIyMDQsIDB4ODAwNywgMHhhOGJlLCAweDgyMTAsIDB4MjIwNCwKKwkweDgwMDcsIDB4YThjMiwgMHg4MjEwLCAweDIwMTEsIDB4MDIwNSwgMHgyMDEzLCAweDAwMDEsIDB4MDBiMCwKKwkweDllOTAsIDB4MDAxZSwgMHgyMjA0LCAweDgwMDcsIDB4YThiNiwgMHg4MjEwLCAweDIyMDQsIDB4ODAwNywKKwkweGE4YmEsIDB4MjAxMSwgMHgwMjA1LCAweDIwMTMsIDB4MDAwMSwgMHgyMDExLCAweDAyNjAsIDB4MjIwNCwKKwkweDgwMDcsIDB4YThiZSwgMHg4MjEwLCAweDIyMDQsIDB4ODAwNywgMHhhOGMyLCAweDkxODYsIDB4MDA0NiwKKwkweDExMTgsIDB4MjAxMSwgMHgwMjYyLCAweDAwMTAsIDB4MjAxMSwgMHgwMjZhLCAweDAxNDYsIDB4MDFkNiwKKwkweDAwMzYsIDB4MjBhOSwgMHgwMDAxLCAweDIwMTksIDB4MDAwOCwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywKKwkweDkwODAsIDB4MDAzMSwgMHgyMGEwLCAweDIyMDQsIDB4ODAwNywgMHg0MDA0LCAweDgyMTAsIDB4ODMxOSwKKwkweDFkZDAsIDB4MDAzZSwgMHgwMWNlLCAweDAxM2UsIDB4MjAxMSwgMHgwMjA1LCAweDIwMTMsIDB4MDAwMCwKKwkweDAwMmUsIDB4MDgwYywgMHg2ZGVlLCAweDAwOWUsIDB4MDAwNSwgMHgwMGU2LCAweDYwMTAsIDB4MDBiNiwKKwkweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwZmMsIDB4MDEwOCwgMHgwMDExLCAweDAwZWUsIDB4MDAwNSwKKwkweGE4ODAsIDB4YzBlNSwgMHhhODgyLCAweDAwMDUsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDA3NiwKKwkweDAwNjYsIDB4MDA1NiwgMHgwMDQ2LCAweDAwMjYsIDB4MDAxNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDIwMjksIDB4MTlmMiwgMHgyNTJjLCAweDIwMjEsIDB4MTlmOSwgMHgyNDI0LCAweDIwNjEsIDB4MWRkYywKKwkweDIwNzEsIDB4MTgwMCwgMHg3NjU0LCAweDcwNzQsIDB4OTYwNiwgMHgwNTc4LCAweDY3MjAsIDB4OTc4NiwKKwkweDAwMDEsIDB4MDExOCwgMHg5Nzg2LCAweDAwMDgsIDB4MTUwMCwgMHgyNTAwLCAweDljMDYsIDB4MDFlOCwKKwkweDI0MDAsIDB4OWMwNiwgMHgwMWQwLCAweDA4MGMsIDB4ZTQ3NiwgMHgwMWI4LCAweDA4MGMsIDB4ZTQ4NiwKKwkweDExYTAsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDQsIDB4MTEyMCwgMHgwMDE2LCAweDA4MGMsIDB4MWFjNSwKKwkweDAwMWUsIDB4MDgwYywgMHhjYjgwLCAweDExMTAsIDB4MDgwYywgMHgzMjZmLCAweDA4MGMsIDB4Y2I5MSwKKwkweDExMTAsIDB4MDgwYywgMHhiNjkzLCAweDA4MGMsIDB4YWNlYiwgMHg5Y2UwLCAweDAwMWMsIDB4MjAwMSwKKwkweDE4MWEsIDB4MjAwNCwgMHg5YzAyLCAweDEyMDgsIDB4MDg1OCwgMHgwMTJlLCAweDAwMWUsIDB4MDAyZSwKKwkweDAwNGUsIDB4MDA1ZSwgMHgwMDZlLCAweDAwN2UsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDAwNSwKKwkweDIwMDEsIDB4MTgxMCwgMHgyMDA0LCAweGQwZGMsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4MTgzNywKKwkweDIwMDQsIDB4ZDA5YywgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwgMHgwMDM2LCAweDAwNDYsIDB4MDgwYywKKwkweGQwOWIsIDB4MDE2OCwgMHgyMDE5LCAweGZmZmYsIDB4OTAwNSwgMHgwMTI4LCAweDYwMTAsIDB4MDBiNiwKKwkweDIwNTgsIDB4YmJhMCwgMHgwMGJlLCAweDIwMjEsIDB4MDAwNCwgMHgwODBjLCAweDRkMDksIDB4MDA0ZSwKKwkweDAwM2UsIDB4MDAwZSwgMHg2MDA0LCAweDkwODYsIDB4MDAwMSwgMHgxMTI4LCAweDA4MGMsIDB4YTQwNCwKKwkweDA4MGMsIDB4YWNlYiwgMHg5MDA2LCAweDAwMDUsIDB4MDBlNiwgMHgwMGM2LCAweDAwYjYsIDB4MDA0NiwKKwkweDIwNjEsIDB4MWRkYywgMHgyMDcxLCAweDE4MDAsIDB4NzQ1NCwgMHg3MDc0LCAweDgwMDEsIDB4OTQwMiwKKwkweDEyZDgsIDB4MjEwMCwgMHg5YzA2LCAweDAxNjgsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDE0OCwKKwkweDYwMTAsIDB4MjA1OCwgMHhiOGEwLCAweDkyMDYsIDB4MTEyMCwgMHg2MDA0LCAweDkwODYsIDB4MDAwMiwKKwkweDAxNDAsIDB4OWNlMCwgMHgwMDFjLCAweDIwMDEsIDB4MTgxYSwgMHgyMDA0LCAweDljMDIsIDB4MTIyMCwKKwkweDBjNDAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDgsIDB4OTAwNiwgMHgwMDRlLCAweDAwYmUsIDB4MDBjZSwKKwkweDAwZWUsIDB4MDAwNSwgMHgwMTI2LCAweDAwMDYsIDB4MDBlNiwgMHgwMDE2LCAweDIwOTEsIDB4ODAwMCwKKwkweDIwNzEsIDB4MTg0MCwgMHhkNWE0LCAweDAxMTgsIDB4NzAwNCwgMHg4MDAwLCAweDcwMDYsIDB4ZDViNCwKKwkweDAxMTgsIDB4NzAwMCwgMHg4MDAwLCAweDcwMDIsIDB4ZDVhYywgMHgwMTc4LCAweDI1MDAsIDB4OTA4NCwKKwkweDAwMDcsIDB4OTA4ZSwgMHgwMDAzLCAweDAxNDgsIDB4OTA4ZSwgMHgwMDA0LCAweDAxMzAsIDB4OTA4ZSwKKwkweDAwMDUsIDB4MDExOCwgMHgyMDcxLCAweGZmZjYsIDB4MDA4OSwgMHgwMDFlLCAweDAwZWUsIDB4MDAwZSwKKwkweDAxMmUsIDB4MDAwNSwgMHgwMTI2LCAweDAwMDYsIDB4MDBlNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwKKwkweGZmZWUsIDB4MDAyMSwgMHgwMGVlLCAweDAwMGUsIDB4MDEyZSwgMHgwMDA1LCAweDJlMDUsIDB4ODAwMCwKKwkweDIwNzcsIDB4MTIyMCwgMHg4ZTcwLCAweDJlMDUsIDB4ODAwMCwgMHgyMDc3LCAweDAwMDUsIDB4MDBlNiwKKwkweDIwNzEsIDB4ZmZlYywgMHgwYzk5LCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4ZmZmMCwKKwkweDBjNjksIDB4MDBlZSwgMHgwMDA1LCAweDAxMjYsIDB4MDAwNiwgMHgwMGU2LCAweDIwOTEsIDB4ODAwMCwKKwkweDIwNzEsIDB4MTg0MCwgMHg3MDE0LCAweDgwMDAsIDB4NzAxNiwgMHgwMGVlLCAweDAwMGUsIDB4MDEyZSwKKwkweDAwMDUsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMjAsIDB4MDA0MCwKKwkweDAwODAsIDB4MDEwMCwgMHgwMjAwLCAweDA0MDAsIDB4MDgwMCwgMHgxMDAwLCAweDIwMDAsIDB4NDAwMCwKKwkweDgwMDAsIDB4M2YwNworfTsKKyNpZmRlZiBVTklRVUVfRldfTkFNRQordW5zaWduZWQgc2hvcnQgZncyMzIyaXB4X2xlbmd0aDAxID0gMHhlMGMyOworI2Vsc2UKK3Vuc2lnbmVkIHNob3J0IHJpc2NfY29kZV9sZW5ndGgwMSA9IDB4ZTBjMjsKKyNlbmRpZgorCisvKgorICoKKyAqLworCit1bnNpZ25lZCBsb25nIHJzZXFpcHhfY29kZV9hZGRyMDEgPSAweDAwMDFjMDAwIDsKK3Vuc2lnbmVkIHNob3J0IHJzZXFpcHhfY29kZTAxW10gPSB7IAorMHgwMDBiLCAweDAwMDMsIDB4MDAwMCwgMHgwOWU2LCAweDAwMDEsIDB4YzAwMCwgMHgwMDA4LCAweDgwNjQsCisJMHgwMDAwLCAweDAwMTAsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDgsIDB4MDEwMSwgMHgwMDAzLCAweGMwMDcsCisJMHgwMDA4LCAweDgwZTAsIDB4MDAwOCwgMHhmZjAwLCAweDAwMDAsIDB4ODBlMiwgMHgwMDA4LCAweGZmMDAsCisJMHgwMDA4LCAweDAxNjIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDgsIDB4YTEwMSwgMHgwMDBiLCAweGMwMGYsCisJMHgwMDA4LCAweDBkMDIsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAzLCAweDYwYzIsCisJMHgwMDAzLCAweDU4MTcsIDB4MDAwYiwgMHg3YWUzLCAweDAwMGIsIDB4NTIxYywgMHgwMDBiLCAweGM4MTMsCisJMHgwMDA5LCAweGJhYzAsIDB4MDAwMCwgMHgwMDhhLCAweDAwMDMsIDB4ODgxMywgMHgwMDAwLCAweDE1ZmMsCisJMHgwMDBiLCAweGIwMTMsIDB4MDAwOSwgMHhjNGMwLCAweDAwMDAsIDB4NzAwMCwgMHgwMDAxLCAweGZmYTAsCisJMHgwMDAwLCAweDIwMDAsIDB4MDAwMywgMHg5MzliLCAweDAwMDgsIDB4ODA4YywgMHgwMDAwLCAweDAwMDEsCisJMHgwMDA3LCAweDAwMDAsIDB4MDAwNywgMHgwMDAwLCAweDAwMDAsIDB4NDBkNCwgMHgwMDBhLCAweDQwNDcsCisJMHgwMDA4LCAweDgwOGMsIDB4MDAwMCwgMHgwMDAyLCAweDAwMDcsIDB4MDAwMCwgMHgwMDAzLCAweDA4MmUsCisJMHgwMDAwLCAweDQwMjIsIDB4MDAwMywgMHgwMDM0LCAweDAwMDgsIDB4NDEyMiwgMHgwMDA5LCAweGVhYzAsCisJMHgwMDA4LCAweGZmMDAsIDB4MDAwOSwgMHhmZmUwLCAweDAwMDgsIDB4MDUwMCwgMHgwMDBiLCAweDBiYzIsCisJMHgwMDAyLCAweDQ0NDcsIDB4MDAwMywgMHg4YmJmLCAweDAwMDgsIDB4MGJmZSwgMHgwMDAxLCAweDExYTAsCisJMHgwMDBiLCAweDEzYTEsIDB4MDAwMSwgMHgwY2EwLCAweDAwMGIsIDB4MTNhMSwgMHgwMDAxLCAweDkxODAsCisJMHgwMDAwLCAweDAwMDQsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDA4LCAweDdmNjIsCisJMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHgwMDA5LCAweDAwMGIsIDB4YzA0MiwgMHgwMDA4LCAweDgwOGMsCisJMHgwMDA4LCAweDAwMDAsIDB4MDAwOCwgMHgwMDYwLCAweDAwMDgsIDB4ODA2MiwgMHgwMDAwLCAweDAwMDQsCisJMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwgMHgwNDExLCAweDAwMDMsIDB4YzA0YSwgMHgwMDAwLCAweDAzZmUsCisJMHgwMDAxLCAweDQzZTAsIDB4MDAwMywgMHg4YjllLCAweDAwMDksIDB4YzJjMCwgMHgwMDA4LCAweDAwZmYsCisJMHgwMDAxLCAweDAyZTAsIDB4MDAwMywgMHg4YjllLCAweDAwMDEsIDB4OTE4MCwgMHgwMDA4LCAweDAwMDUsCisJMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDgsIDB4N2Y2MiwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDAwLCAweDAwMTksIDB4MDAwYiwgMHhjMDU5LCAweDAwMDIsIDB4MDI0MCwgMHgwMDBiLCAweDBiOWIsCisJMHgwMDA4LCAweDAwZmMsIDB4MDAwMywgMHgzMzllLCAweDAwMGEsIDB4MDI0NCwgMHgwMDBiLCAweDA4NmIsCisJMHgwMDBjLCAweDAxZjUsIDB4MDAwMSwgMHg5MTgwLCAweDAwMDAsIDB4MDAwNywgMHgwMDA4LCAweDdmNjIsCisJMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDIsIDB4MDIzNCwgMHgwMDA4LCAweDdmMDQsCisJMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwgMHgwNDBhLCAweDAwMGIsIDB4YzA2YSwgMHgwMDBhLCAweDAyNDgsCisJMHgwMDBiLCAweDA4NzUsIDB4MDAwMSwgMHg5MTgwLCAweDAwMDgsIDB4MDAwNiwgMHgwMDA4LCAweDdmNjIsCisJMHgwMDA4LCAweDgwMDIsIDB4MDAwOCwgMHgwMDAzLCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDAyMGEsCisJMHgwMDBiLCAweGMwNzQsIDB4MDAwMCwgMHgxMTJhLCAweDAwMDgsIDB4MDAyZSwgMHgwMDA4LCAweDAyMmMsCisJMHgwMDAyLCAweDNhNDQsIDB4MDAwMywgMHg4ODEzLCAweDAwMDgsIDB4ODA4YywgMHgwMDAwLCAweDAwMDIsCisJMHgwMDA4LCAweDE3NjAsIDB4MDAwOCwgMHg4MDYyLCAweDAwMDgsIDB4MDAwZiwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDA4LCAweDAwMTEsIDB4MDAwYiwgMHhjMDgxLCAweDAwMDgsIDB4MDFmZSwgMHgwMDA5LCAweDQyZTAsCisJMHgwMDBiLCAweDhiOGUsIDB4MDAwMCwgMHgwMGZlLCAweDAwMDEsIDB4NDNlMCwgMHgwMDBiLCAweDhiOGUsCisJMHgwMDAwLCAweDE3MzQsIDB4MDAwMCwgMHgxNTMwLCAweDAwMDgsIDB4MTYzMiwgMHgwMDA4LCAweDBkMmEsCisJMHgwMDAxLCAweDk4ODAsIDB4MDAwOCwgMHgwMDEyLCAweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsCisJMHgwMDA4LCAweDdmNjIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDgsIDB4MWUwYSwgMHgwMDBiLCAweGMwOTMsCisJMHgwMDA4LCAweDgwOGEsIDB4MDAwOCwgMHgwMDAzLCAweDAwMDAsIDB4MWE2MCwgMHgwMDA4LCAweDgwNjIsCisJMHgwMDAwLCAweDAwMDIsIDB4MDAwMywgMHg1ODk5LCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDM2NzksCisJMHgwMDBiLCAweGMwOWMsIDB4MDAwYiwgMHg1ODlkLCAweDAwMDgsIDB4ODA1NCwgMHgwMDA4LCAweDAwMTEsCisJMHgwMDAwLCAweDgwNzQsIDB4MDAwOCwgMHgxMDEwLCAweDAwMDgsIDB4MWVmYywgMHgwMDAzLCAweDMwMTMsCisJMHgwMDA0LCAweDAwYTYsIDB4MDAwMywgMHgwMDEzLCAweDAwMDAsIDB4MWM2MCwgMHgwMDAwLCAweDFiNjIsCisJMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHgwMjMxLCAweDAwMGIsIDB4YzBhYSwgMHgwMDBiLCAweDU4YWIsCisJMHgwMDA4LCAweDAxNDAsIDB4MDAwMCwgMHgwMjQyLCAweDAwMDIsIDB4MWY0MywgMHgwMDAzLCAweDg4YjUsCisJMHgwMDAwLCAweDBkNDQsIDB4MDAwOCwgMHgwZDQ2LCAweDAwMDgsIDB4MDM0OCwgMHgwMDA4LCAweDA0NGEsCisJMHgwMDAzLCAweDAwYjksIDB4MDAwOCwgMHgwMzQ0LCAweDAwMDgsIDB4MDQ0NiwgMHgwMDA4LCAweDA1NDgsCisJMHgwMDAwLCAweDA2NGEsIDB4MDAwYSwgMHgxOTQ4LCAweDAwMGIsIDB4MDhiYywgMHgwMDA4LCAweDBkNGEsCisJMHgwMDBiLCAweDU4YmMsIDB4MDAwOCwgMHg4MDU0LCAweDAwMDAsIDB4MDAwMSwgMHgwMDAwLCAweDgwNzQsCisJMHgwMDA4LCAweDIwMjAsIDB4MDAwZiwgMHg0MDAwLCAweDAwMDAsIDB4NDgyMCwgMHgwMDA4LCAweDBiZmUsCisJMHgwMDA5LCAweDEwYTAsIDB4MDAwMywgMHgxMTIzLCAweDAwMDEsIDB4MGNhMCwgMHgwMDAzLCAweDExMjMsCisJMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDksIDB4OTA4MCwgMHgwMDAwLCAweDAwMDgsCisJMHgwMDA4LCAweDdmNjIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDgsIDB4MDAwOSwgMHgwMDBiLCAweGMwY2YsCisJMHgwMDAxLCAweDgwZTAsIDB4MDAwOCwgMHgwMDAzLCAweDAwMGIsIDB4ODkyMywgMHgwMDAwLCAweDQ5YjQsCisJMHgwMDAyLCAweDRiNGUsIDB4MDAwYiwgMHg4OTJjLCAweDAwMDgsIDB4ODA4YSwgMHgwMDAwLCAweDAwMDQsCisJMHgwMDAwLCAweDE4ZmUsIDB4MDAwMSwgMHgxMGUwLCAweDAwMGIsIDB4ODhkZCwgMHgwMDAyLCAweDE5MmYsCisJMHgwMDA4LCAweDdmMzIsIDB4MDAwOCwgMHgxNWZlLCAweDAwMDEsIDB4MTBlMCwgMHgwMDBiLCAweDg4ZTIsCisJMHgwMDAyLCAweDE2MmYsIDB4MDAwOCwgMHg3ZjJjLCAweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsCisJMHgwMDA5LCAweDkwODAsIDB4MDAwMCwgMHgwMDA3LCAweDAwMDgsIDB4N2Y2MiwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwMywgMHhjMGU5LCAweDAwMGEsIDB4MDA0ZiwgMHgwMDBiLCAweDg5MWEsCisJMHgwMDBhLCAweDAwNDAsIDB4MDAwMywgMHgwOTA0LCAweDAwMDIsIDB4MDA0ZSwgMHgwMDAzLCAweDA5MDQsCisJMHgwMDAyLCAweDAwMzAsIDB4MDAwMiwgMHg3ZjJmLCAweDAwMDAsIDB4N2YwMCwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDA4LCAweDAwMGEsIDB4MDAwYiwgMHhjMGY1LCAweDAwMDgsIDB4MTAxMCwgMHgwMDA0LCAweDAxZGMsCisJMHgwMDBiLCAweGIwZmQsIDB4MDAwYywgMHgwMzYyLCAweDAwMGMsIDB4MDFjNiwgMHgwMDBiLCAweDc4MTQsCisJMHgwMDAzLCAweDAwMTMsIDB4MDAwMCwgMHgwODA2LCAweDAwMDgsIDB4ODAxMCwgMHgwMDAwLCAweDAwMWYsCisJMHgwMDBjLCAweDAzNjIsIDB4MDAwMCwgMHgwMzEwLCAweDAwMGMsIDB4MDM2MiwgMHgwMDAzLCAweDAwZmIsCisJMHgwMDBhLCAweDAwMmYsIDB4MDAwMCwgMHg3ZjAwLCAweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweDAwMGEsCisJMHgwMDBiLCAweGMxMDgsIDB4MDAwYywgMHgwMTlmLCAweDAwMGEsIDB4MDA0MCwgMHgwMDBiLCAweDA5MWQsCisJMHgwMDBjLCAweDAyMGMsIDB4MDAwMCwgMHg4MDAwLCAweDAwMDAsIDB4MDAwMiwgMHgwMDAwLCAweDgwNjAsCisJMHgwMDAwLCAweDA0MDAsIDB4MDAwOSwgMHg5MDgwLCAweDAwMDgsIDB4MDAwNiwgMHgwMDA4LCAweDdmNjIsCisJMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHgwMDBhLCAweDAwMGIsIDB4YzExNiwgMHgwMDAwLCAweDgwNzIsCisJMHgwMDAwLCAweDQwMDAsIDB4MDAwMywgMHgwMGZiLCAweDAwMDgsIDB4ODAxMCwgMHgwMDA4LCAweDAwMWUsCisJMHgwMDBiLCAweDAxMWYsIDB4MDAwOCwgMHg4MDEwLCAweDAwMDgsIDB4MDAxZCwgMHgwMDBjLCAweDAzNjIsCisJMHgwMDA4LCAweDEwMTAsIDB4MDAwYywgMHgwMzYyLCAweDAwMGIsIDB4MDAxNCwgMHgwMDAyLCAweDRiNGUsCisJMHgwMDAzLCAweDA5MjksIDB4MDAwOCwgMHg4MDhhLCAweDAwMDAsIDB4MDAwNCwgMHgwMDBiLCAweDYxMjksCisJMHgwMDBmLCAweDgwMDAsIDB4MDAwOCwgMHg4MDhhLCAweDAwMDAsIDB4MDAwNCwgMHgwMDBiLCAweDAwMTQsCisJMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDksIDB4OTA4MCwgMHgwMDA4LCAweDAwMTEsCisJMHgwMDA4LCAweDdmNjIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDgsIDB4MDAwOSwgMHgwMDAzLCAweGMxMzMsCisJMHgwMDBhLCAweDAwNGYsIDB4MDAwMywgMHg4OTkwLCAweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsCisJMHgwMDA5LCAweDkwODAsIDB4MDAwOCwgMHgwMDA1LCAweDAwMDgsIDB4N2Y2MiwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYiwgMHhjMTNkLCAweDAwMDgsIDB4MDA2MCwgMHgwMDA4LCAweDgwNjIsCisJMHgwMDAwLCAweDAwMWYsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsIDB4MDIwOSwgMHgwMDBiLCAweGMxNDMsCisJMHgwMDBhLCAweDAxNGIsIDB4MDAwYiwgMHgwOTkwLCAweDAwMDgsIDB4ODA2MiwgMHgwMDA4LCAweDAwMGYsCisJMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwgMHgwMjExLCAweDAwMGIsIDB4YzE0YSwgMHgwMDA4LCAweDAxZmUsCisJMHgwMDAxLCAweDAyZDAsIDB4MDAwMywgMHg4OTkwLCAweDAwMDQsIDB4MDFhOCwgMHgwMDBiLCAweDA5OTAsCisJMHgwMDA4LCAweDAzYTAsIDB4MDAwOCwgMHg4MDA0LCAweDAwMDAsIDB4MDAwMiwgMHgwMDAwLCAweDgwMDYsCisJMHgwMDAwLCAweDAwNDMsIDB4MDAwOCwgMHg0OTA4LCAweDAwMDgsIDB4ODA4YSwgMHgwMDAwLCAweDAwMDQsCisJMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDksIDB4OTA4MCwgMHgwMDA4LCAweDAwMDAsCisJMHgwMDA4LCAweDdmNjIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDgsIDB4MDQxYSwgMHgwMDAzLCAweGMxNWYsCisJMHgwMDBiLCAweGUxNjAsIDB4MDAwOCwgMHg0OTA4LCAweDAwMDgsIDB4NDgwYSwgMHgwMDA4LCAweDgwOGEsCisJMHgwMDAwLCAweDAwMDQsIDB4MDAwOCwgMHgwMDYwLCAweDAwMDgsIDB4ODA2MiwgMHgwMDA4LCAweDAwMmIsCisJMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwgMHgwNDExLCAweDAwMDMsIDB4YzE2YSwgMHgwMDA4LCAweDA0ZmUsCisJMHgwMDA5LCAweDAyYTAsIDB4MDAwMywgMHg5MTcxLCAweDAwMDIsIDB4MDUwMCwgMHgwMDBiLCAweDA5OGQsCisJMHgwMDAzLCAweDAxNzIsIDB4MDAwMCwgMHgwNWZlLCAweDAwMDEsIDB4MDNhMCwgMHgwMDBiLCAweDExOGQsCisJMHgwMDAwLCAweDBkMGMsIDB4MDAwOCwgMHgwZDBlLCAweDAwMDgsIDB4MGQxMCwgMHgwMDAwLCAweDBkMTIsCisJMHgwMDA4LCAweDAwNjAsIDB4MDAwOCwgMHg4MDYyLCAweDAwMDAsIDB4MDAwZCwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDA4LCAweDA4MzIsIDB4MDAwMywgMHhjMTdkLCAweDAwMDAsIDB4ODAwYSwgMHgwMDAwLCAweDgwMDUsCisJMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDksIDB4OTA4MCwgMHgwMDA4LCAweDAwMTEsCisJMHgwMDA4LCAweDdmNjIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDgsIDB4MGExMiwgMHgwMDAzLCAweGMxODcsCisJMHgwMDA4LCAweDUwMDYsIDB4MDAwOCwgMHgxMDBlLCAweDAwMDQsIDB4MDFiMywgMHgwMDBiLCAweDc4MTQsCisJMHgwMDAzLCAweDAwMTMsIDB4MDAwOCwgMHgwMjA4LCAweDAwMDgsIDB4MDMwYSwgMHgwMDAzLCAweDAxNzQsCisJMHgwMDBjLCAweDAxOWYsIDB4MDAwOCwgMHg4MDhhLCAweDAwMDAsIDB4MDAwNCwgMHgwMDA4LCAweDgwMTAsCisJMHgwMDA4LCAweDAwMjEsIDB4MDAwYywgMHgwMzYyLCAweDAwMDgsIDB4MTAxMCwgMHgwMDBjLCAweDAzNjIsCisJMHgwMDAwLCAweDQ4MTAsIDB4MDAwYywgMHgwMzYyLCAweDAwMDgsIDB4NDkxMCwgMHgwMDBjLCAweDAzNjIsCisJMHgwMDA4LCAweDgwOGEsIDB4MDAwMCwgMHgwMDA0LCAweDAwMGIsIDB4MDAxNCwgMHgwMDAwLCAweDgwNjAsCisJMHgwMDAwLCAweDA0MDAsIDB4MDAwOSwgMHg5MDgwLCAweDAwMDAsIDB4MDAwMiwgMHgwMDA4LCAweDdmNjIsCisJMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHhiNDBhLCAweDAwMDMsIDB4YzFhNiwgMHgwMDBmLCAweDQwMDAsCisJMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDAsIDB4MGE2MiwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDAwLCAweDA0MTEsIDB4MDAwYiwgMHhjMWFkLCAweDAwMDIsIDB4MDIxMCwgMHgwMDAxLCAweGZmYzAsCisJMHgwMDAwLCAweDAwMDcsIDB4MDAwOSwgMHgwM2UwLCAweDAwMGYsIDB4NDAwMCwgMHgwMDAwLCAweDgwNjAsCisJMHgwMDAwLCAweDA0MDAsIDB4MDAwMSwgMHg4MzgwLCAweDAwMDAsIDB4MDAwMiwgMHgwMDA5LCAweDBhODAsCisJMHgwMDA4LCAweDdmNjIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsIDB4MGUwYSwgMHgwMDAzLCAweGMxYmIsCisJMHgwMDAyLCAweDAzMDAsIDB4MDAwMSwgMHhmZmMwLCAweDAwMDAsIDB4MDAwNywgMHgwMDAwLCAweDdmMDYsCisJMHgwMDAyLCAweDBhMDAsIDB4MDAwOCwgMHg3ZjYyLCAweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweDA2MGEsCisJMHgwMDBiLCAweGMxYzQsIDB4MDAwZiwgMHg0MDAwLCAweDAwMDAsIDB4MGRhMCwgMHgwMDA4LCAweDBkYTIsCisJMHgwMDA4LCAweDBkYTQsIDB4MDAwOSwgMHg4ODgwLCAweDAwMDAsIDB4MDAwMSwgMHgwMDA4LCAweDdmNjIsCisJMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweGEwMTIsCisJMHgwMDAwLCAweDBkYTYsIDB4MDAwOCwgMHgwZGE4LCAweDAwMDAsIDB4MGRhYSwgMHgwMDAwLCAweDBkYWMsCisJMHgwMDAzLCAweGMxZDQsIDB4MDAwOSwgMHg4ODgwLCAweDAwMDgsIDB4MDAwOSwgMHgwMDA4LCAweDdmNjIsCisJMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHhhMDNhLCAweDAwMGIsIDB4YzFkYSwgMHgwMDBmLCAweDQwMDAsCisJMHgwMDA5LCAweDg4ODAsIDB4MDAwOCwgMHgwMDA1LCAweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsCisJMHgwMDA4LCAweDdmNjIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDgsIDB4MDAwOSwgMHgwMDBiLCAweGMxZTMsCisJMHgwMDA4LCAweDAwNjAsIDB4MDAwOCwgMHg4MDYyLCAweDAwMDAsIDB4MDAwZCwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDA4LCAweDAwMjEsIDB4MDAwYiwgMHhjMWU5LCAweDAwMDAsIDB4MDBmZSwgMHgwMDAxLCAweDAxZDAsCisJMHgwMDBiLCAweDg5ZjIsIDB4MDAwOCwgMHgwMmZlLCAweDAwMDksIDB4MDNkMCwgMHgwMDAzLCAweDA5ZjIsCisJMHgwMDAwLCAweDBkMDYsIDB4MDAwZiwgMHg0MDAwLCAweDAwMDAsIDB4ODAwNiwgMHgwMDAwLCAweDAwMDEsCisJMHgwMDBmLCAweDQwMDAsIDB4MDAwOCwgMHgwMDYwLCAweDAwMDgsIDB4ODA2MiwgMHgwMDA4LCAweDAwMmIsCisJMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHhhMDQxLCAweDAwMDMsIDB4YzFmYSwgMHgwMDAyLCAweDAyNDMsCisJMHgwMDBiLCAweDhhMDEsIDB4MDAwMCwgMHg1NGFjLCAweDAwMDAsIDB4NTVhZSwgMHgwMDA4LCAweDBkYTgsCisJMHgwMDAwLCAweDBkYWEsIDB4MDAwMCwgMHg1MGIwLCAweDAwMDAsIDB4NTFiMiwgMHgwMDAwLCAweDBkYjQsCisJMHgwMDA4LCAweDBkYjYsIDB4MDAwOCwgMHgwMDYwLCAweDAwMDgsIDB4ODA2MiwgMHgwMDAwLCAweDAwMDcsCisJMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHhhNDUyLCAweDAwMDMsIDB4YzIwYSwgMHgwMDBmLCAweDQwMDAsCisJMHgwMDBhLCAweDM5NDUsIDB4MDAwYiwgMHg4YTE2LCAweDAwMDAsIDB4ODA3MiwgMHgwMDA4LCAweDQwNDAsCisJMHgwMDA3LCAweDAwMDAsIDB4MDAwYSwgMHgzOTQ1LCAweDAwMDMsIDB4OGExNCwgMHgwMDBmLCAweDQwMDAsCisJMHgwMDAwLCAweDgwNzIsIDB4MDAwMCwgMHg0MDAwLCAweDAwMDcsIDB4MDAwMCwgMHgwMDA3LCAweDAwMDAsCisJMHgwMDA3LCAweDAwMDAsIDB4MDAwYSwgMHgzOTQ1LCAweDAwMDMsIDB4MGEwZSwgMHgwMDBiLCAweDAyMTYsCisJMHgwMDBhLCAweDNhNDAsIDB4MDAwYiwgMHg4ODE3LCAweDAwMDEsIDB4YWJkMCwgMHgwMDA4LCAweDAwMDAsCisJMHgwMDAwLCAweDdmMjQsIDB4MDAwYiwgMHg1YTIxLCAweDAwMDgsIDB4ODA1NCwgMHgwMDAwLCAweDAwMDIsCisJMHgwMDAyLCAweDEyNDIsIDB4MDAwMywgMHgwYTY3LCAweDAwMGEsIDB4M2E0NSwgMHgwMDBiLCAweDBhNTYsCisJMHgwMDBhLCAweDFlMTAsIDB4MDAwMCwgMHg3ZjNjLCAweDAwMGIsIDB4MGE1MywgMHgwMDAyLCAweDFkMDAsCisJMHgwMDAwLCAweDdmM2EsIDB4MDAwMCwgMHgwZDYwLCAweDAwMDgsIDB4N2Y2MiwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYiwgMHhjMjMxLCAweDAwMDgsIDB4MDBmYywgMHgwMDBiLCAweGIyNTAsCisJMHgwMDAwLCAweDFjNjAsIDB4MDAwOCwgMHg4MDYyLCAweDAwMDAsIDB4MDAwMSwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwMywgMHhjMjM5LCAweDAwMDgsIDB4MDBmYywgMHgwMDBiLCAweDMzNzcsCisJMHgwMDAwLCAweDAwMzgsIDB4MDAwOCwgMHgwMDYwLCAweDAwMDgsIDB4ODA2MiwgMHgwMDAwLCAweDAwMTksCisJMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHgwMDA5LCAweDAwMDMsIDB4YzI0MiwgMHgwMDA5LCAweDgwYzAsCisJMHgwMDA4LCAweDAwZmYsIDB4MDAwOCwgMHg3ZjNlLCAweDAwMDAsIDB4MGQ2MCwgMHgwMDA4LCAweDBlZmUsCisJMHgwMDAxLCAweDFmODAsIDB4MDAwOCwgMHg3ZjYyLCAweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweDAwMDksCisJMHgwMDBiLCAweGMyNGMsIDB4MDAwOCwgMHgwMDNhLCAweDAwMDAsIDB4MWRmZSwgMHgwMDAzLCAweDAyMmQsCisJMHgwMDA4LCAweDAwMzYsIDB4MDAwNCwgMHgwMGE2LCAweDAwMGIsIDB4MDI2NywgMHgwMDAwLCAweDgwNzQsCisJMHgwMDAwLCAweDIwMDAsIDB4MDAwYiwgMHgwMjY3LCAweDAwMDIsIDB4M2E0NCwgMHgwMDBiLCAweDBiYTQsCisJMHgwMDAwLCAweDgwNzQsIDB4MDAwMCwgMHgxMDAwLCAweDAwMDEsIDB4YWRkMCwgMHgwMDA4LCAweDAwMDAsCisJMHgwMDA4LCAweDdmMGUsIDB4MDAwMywgMHhiMzc0LCAweDAwMDEsIDB4YTdkMCwgMHgwMDA4LCAweDAwMDAsCisJMHgwMDAwLCAweDdmMDAsIDB4MDAwOSwgMHhhNmQwLCAweDAwMDgsIDB4MDAwMCwgMHgwMDA5LCAweDAwZDAsCisJMHgwMDAzLCAweDhhNzcsIDB4MDAwMCwgMHg4MDc0LCAweDAwMDgsIDB4NDA0MCwgMHgwMDAzLCAweDVhNjcsCisJMHgwMDBiLCAweDUyMWMsIDB4MDAwYSwgMHgzYTQ2LCAweDAwMDMsIDB4OGE3NywgMHgwMDAyLCAweDNhNDcsCisJMHgwMDBiLCAweDBhNzIsIDB4MDAwOCwgMHg4MDU0LCAweDAwMDAsIDB4MDAwNCwgMHgwMDAwLCAweDgwNzQsCisJMHgwMDAwLCAweDgwMDAsIDB4MDAwMywgMHgwMmQ3LCAweDAwMDksIDB4OTJjMCwgMHgwMDAwLCAweDBmYzgsCisJMHgwMDBiLCAweDA4MTMsIDB4MDAwYSwgMHgxMjQ2LCAweDAwMDMsIDB4OGI2ZSwgMHgwMDAwLCAweDFhNjAsCisJMHgwMDA4LCAweDgwNjIsIDB4MDAwMCwgMHgwMDAyLCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDM2N2EsCisJMHgwMDBiLCAweGMyN2MsIDB4MDAwOSwgMHg5MmMwLCAweDAwMDgsIDB4MDc4MCwgMHgwMDBiLCAweDhiODgsCisJMHgwMDAyLCAweDEyNGIsIDB4MDAwMywgMHgwYTg1LCAweDAwMDIsIDB4MmU0ZCwgMHgwMDAyLCAweDJlNGQsCisJMHgwMDAzLCAweDBiNzQsIDB4MDAwYSwgMHgzYTQ2LCAweDAwMDMsIDB4OGE5NSwgMHgwMDBiLCAweDVhODcsCisJMHgwMDA4LCAweDgwNTQsIDB4MDAwMCwgMHgwMDA0LCAweDAwMGEsIDB4MTI0MywgMHgwMDAzLCAweDBhZDUsCisJMHgwMDA4LCAweDgwMTAsIDB4MDAwMCwgMHgwMDBkLCAweDAwMGMsIDB4MDM2MiwgMHgwMDBhLCAweDE5NDgsCisJMHgwMDAzLCAweDBhOTIsIDB4MDAwYywgMHgwMzU3LCAweDAwMDAsIDB4MTgxMCwgMHgwMDBjLCAweDAzNjIsCisJMHgwMDBiLCAweDAyZDUsIDB4MDAwYSwgMHgxOTQ4LCAweDAwMGIsIDB4MGE5OSwgMHgwMDBhLCAweDEyNDMsCisJMHgwMDAzLCAweDBiNzcsIDB4MDAwYSwgMHgxOTRkLCAweDAwMDMsIDB4MGE5ZCwgMHgwMDBhLCAweDEyNDMsCisJMHgwMDAzLCAweDBiN2UsIDB4MDAwMywgMHg1YTlkLCAweDAwMDgsIDB4ODA1NCwgMHgwMDAwLCAweDAwMDQsCisJMHgwMDBhLCAweDE5MmUsIDB4MDAwOCwgMHg3ZjMyLCAweDAwMGEsIDB4MTk0NywgMHgwMDBiLCAweDBhY2YsCisJMHgwMDAyLCAweDE5NGYsIDB4MDAwMywgMHgwYWFkLCAweDAwMGMsIDB4MDM1NywgMHgwMDAwLCAweDE4MTAsCisJMHgwMDA0LCAweDAxZGMsIDB4MDAwMywgMHhiMmM4LCAweDAwMGMsIDB4MDM2MiwgMHgwMDBjLCAweDAxYzYsCisJMHgwMDBiLCAweDAyZDUsIDB4MDAwMCwgMHgxYTYwLCAweDAwMDgsIDB4ODA2MiwgMHgwMDAwLCAweDAwMWYsCisJMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHgwMDA5LCAweDAwMDMsIDB4YzJiMiwgMHgwMDBhLCAweDAwNGMsCisJMHgwMDAzLCAweDhhY2YsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAxLCAweDk4ODAsCisJMHgwMDAwLCAweDAwMDcsIDB4MDAwOCwgMHg3ZjYyLCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDMyMGEsCisJMHgwMDBiLCAweGMyYmMsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAxLCAweDk4ODAsCisJMHgwMDA4LCAweDAwMTIsIDB4MDAwOCwgMHg3ZjYyLCAweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweDFlMGEsCisJMHgwMDBiLCAweGMyYzQsIDB4MDAwMCwgMHgxODI2LCAweDAwMDAsIDB4MTkyOCwgMHgwMDBiLCAweDAyZDUsCisJMHgwMDAwLCAweDA4MDYsIDB4MDAwOCwgMHg4MDEwLCAweDAwMDAsIDB4MDAxZiwgMHgwMDBjLCAweDAzNjIsCisJMHgwMDAwLCAweDAzMTAsIDB4MDAwYywgMHgwMzYyLCAweDAwMGIsIDB4MDJkNSwgMHgwMDBjLCAweDAzNTcsCisJMHgwMDA4LCAweDgwMTAsIDB4MDAwMCwgMHgwMDAxLCAweDAwMGMsIDB4MDM2MiwgMHgwMDAwLCAweDE4MTAsCisJMHgwMDBjLCAweDAzNjIsIDB4MDAwMCwgMHg4MDc0LCAweDAwMDgsIDB4ZjAwMCwgMHgwMDAwLCAweDBkMzAsCisJMHgwMDAyLCAweDNhNDIsIDB4MDAwMywgMHg4YWRkLCAweDAwMDAsIDB4MTVmYywgMHgwMDBiLCAweGIwN2EsCisJMHgwMDAzLCAweDAwMTMsIDB4MDAwMCwgMHg4MDc0LCAweDAwMDAsIDB4MDUwMSwgMHgwMDA4LCAweDgwMTAsCisJMHgwMDA4LCAweDAwMGMsIDB4MDAwYywgMHgwMzYyLCAweDAwMDMsIDB4MDAxMywgMHgwMDA5LCAweGJiZTAsCisJMHgwMDA4LCAweDAwMzAsIDB4MDAwMywgMHg4YWY5LCAweDAwMDAsIDB4MThmZSwgMHgwMDA5LCAweDNjZTAsCisJMHgwMDBiLCAweDBhZjYsIDB4MDAwOCwgMHgxNWZlLCAweDAwMDksIDB4M2NlMCwgMHgwMDBiLCAweDBhZjYsCisJMHgwMDA4LCAweDEzZmUsIDB4MDAwOSwgMHgzY2UwLCAweDAwMGIsIDB4OGFmMiwgMHgwMDA0LCAweDAzNTAsCisJMHgwMDA4LCAweDBkMjYsIDB4MDAwMywgMHgwMmYzLCAweDAwMGMsIDB4MDM1MiwgMHgwMDA4LCAweDgwNzYsCisJMHgwMDAwLCAweDAwNDAsIDB4MDAwYiwgMHgwMzRkLCAweDAwMDgsIDB4ODA3NiwgMHgwMDA4LCAweDAwNDEsCisJMHgwMDBiLCAweDAzNGQsIDB4MDAwOSwgMHhiYmUwLCAweDAwMDAsIDB4MDAzMiwgMHgwMDBiLCAweDhhZmUsCisJMHgwMDA4LCAweDNjMWUsIDB4MDAwYiwgMHgwMzRkLCAweDAwMDksIDB4YmJlMCwgMHgwMDAwLCAweDAwM2IsCisJMHgwMDBiLCAweDhiMDMsIDB4MDAwMCwgMHgzY2RjLCAweDAwMGIsIDB4MDM0ZCwgMHgwMDA5LCAweGJiZTAsCisJMHgwMDA4LCAweDAwMzUsIDB4MDAwYiwgMHg4YjA5LCAweDAwMDAsIDB4ODA3MiwgMHgwMDAwLCAweDgwMDAsCisJMHgwMDAzLCAweDA0YjEsIDB4MDAwOSwgMHhiYmUwLCAweDAwMDgsIDB4MDAzNiwgMHgwMDAzLCAweDBiZDQsCisJMHgwMDA5LCAweGJiZTAsIDB4MDAwMCwgMHgwMDM3LCAweDAwMGIsIDB4OGIyZSwgMHgwMDAwLCAweDE4ZmUsCisJMHgwMDA5LCAweDNjZTAsIDB4MDAwMywgMHg4YWY2LCAweDAwMDgsIDB4ODA3NiwgMHgwMDAwLCAweDAwNDAsCisJMHgwMDAwLCAweDFhNjAsIDB4MDAwOCwgMHg4MDYyLCAweDAwMDAsIDB4MDAwZCwgMHgwMDA5LCAweGE2ZDAsCisJMHgwMDA4LCAweDAwMDAsIDB4MDAwOCwgMHg3ZjA0LCAweDAwMDEsIDB4YTdkMCwgMHgwMDA4LCAweDAwMDAsCisJMHgwMDAwLCAweDdmMDYsIDB4MDAwMSwgMHhhOGQwLCAweDAwMDgsIDB4MDAwMCwgMHgwMDA4LCAweDdmMDgsCisJMHgwMDA5LCAweGE5ZDAsIDB4MDAwOCwgMHgwMDAwLCAweDAwMDAsIDB4N2YwYSwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDAwLCAweDA0MjIsIDB4MDAwMywgMHhjMzI1LCAweDAwMGMsIDB4MDM1NywgMHgwMDA4LCAweDgwNTQsCisJMHgwMDAwLCAweDAwMDQsIDB4MDAwMCwgMHg4MDc0LCAweDAwMDgsIDB4ZjAwMCwgMHgwMDAwLCAweDgwNzIsCisJMHgwMDAwLCAweDgwMDAsIDB4MDAwMywgMHgwMmQ3LCAweDAwMDksIDB4YmJlMCwgMHgwMDAwLCAweDAwMzgsCisJMHgwMDAzLCAweDhiNDAsIDB4MDAwMCwgMHgxOGZlLCAweDAwMDksIDB4M2NlMCwgMHgwMDBiLCAweDBiM2QsCisJMHgwMDA4LCAweDE1ZmUsIDB4MDAwOSwgMHgzY2UwLCAweDAwMGIsIDB4OGFlYywgMHgwMDBjLCAweDAzNTIsCisJMHgwMDA4LCAweDgwNzYsIDB4MDAwMCwgMHgwMDQwLCAweDAwMDAsIDB4ODA3MiwgMHgwMDAwLCAweDgwMDAsCisJMHgwMDAzLCAweDAzOWIsIDB4MDAwOCwgMHg4MDc2LCAweDAwMDgsIDB4MDA0MiwgMHgwMDBiLCAweDAzNGQsCisJMHgwMDA5LCAweGJiZTAsIDB4MDAwMCwgMHgwMDE2LCAweDAwMGIsIDB4OGI0ZCwgMHgwMDAwLCAweDgwNzQsCisJMHgwMDA4LCAweDA4MDgsIDB4MDAwMiwgMHgzYTQ0LCAweDAwMDMsIDB4ODgxNiwgMHgwMDAwLCAweDgwNzQsCisJMHgwMDAwLCAweDA4MDAsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsIDB4ODAwMCwgMHgwMDBmLCAweDgwMDAsCisJMHgwMDAzLCAweDAwMTMsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAzLCAweDAwMTMsCisJMHgwMDAyLCAweDE0MzAsIDB4MDAwYiwgMHgwMzUzLCAweDAwMGEsIDB4M2QzMCwgMHgwMDAwLCAweDdmMDAsCisJMHgwMDAxLCAweGJjODAsIDB4MDAwMCwgMHgwMDA3LCAweDAwMDMsIDB4MDM1YiwgMHgwMDBhLCAweDE5MzAsCisJMHgwMDAwLCAweDdmMDAsIDB4MDAwMSwgMHg5ODgwLCAweDAwMDAsIDB4MDAwNywgMHgwMDAwLCAweDgwNjAsCisJMHgwMDAwLCAweDA0MDAsIDB4MDAwOCwgMHg3ZjYyLCAweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweDAwMGEsCisJMHgwMDBiLCAweGMzNjAsIDB4MDAwZiwgMHg0MDAwLCAweDAwMGIsIDB4MjM2MiwgMHgwMDA4LCAweDA4NzAsCisJMHgwMDBmLCAweDQwMDAsIDB4MDAwOSwgMHhiYWMwLCAweDAwMDgsIDB4MDA5MCwgMHgwMDBiLCAweDBiNmIsCisJMHgwMDAwLCAweDgwNzQsIDB4MDAwMCwgMHgwNzA2LCAweDAwMDMsIDB4MDM2ZCwgMHgwMDAwLCAweDgwNzQsCisJMHgwMDAwLCAweDA3MDMsIDB4MDAwZiwgMHg0MDAwLCAweDAwMDgsIDB4ODAxMCwgMHgwMDAwLCAweDAwMjMsCisJMHgwMDBiLCAweDAzYTksIDB4MDAwOCwgMHg4MDEwLCAweDAwMDAsIDB4MDAwOCwgMHgwMDBiLCAweDAzYTksCisJMHgwMDA4LCAweDgwMTAsIDB4MDAwOCwgMHgwMDIyLCAweDAwMGIsIDB4MDNhOSwgMHgwMDBjLCAweDAzNTcsCisJMHgwMDA4LCAweDgwMTAsIDB4MDAwMCwgMHgwMDA3LCAweDAwMGMsIDB4MDM2MiwgMHgwMDAwLCAweDE4MTAsCisJMHgwMDBjLCAweDAzNjIsIDB4MDAwMywgMHgwM2IzLCAweDAwMGMsIDB4MDM1NywgMHgwMDA4LCAweDgwMTAsCisJMHgwMDA4LCAweDAwMWIsIDB4MDAwYywgMHgwMzYyLCAweDAwMDAsIDB4MTgxMCwgMHgwMDBjLCAweDAzNjIsCisJMHgwMDAwLCAweDgwNzQsIDB4MDAwMCwgMHhmMDgwLCAweDAwMDAsIDB4MGQzMCwgMHgwMDAzLCAweDAwMTMsCisJMHgwMDA4LCAweDgwMTAsIDB4MDAwOCwgMHgwMDA5LCAweDAwMGIsIDB4MDNhOSwgMHgwMDA4LCAweDgwMTAsCisJMHgwMDA4LCAweDAwMDUsIDB4MDAwYiwgMHgwM2E5LCAweDAwMGEsIDB4MTY0OCwgMHgwMDBiLCAweDg4ODgsCisJMHgwMDA4LCAweDgwOGMsIDB4MDAwMCwgMHgwMDAxLCAweDAwMDcsIDB4MDAwMCwgMHgwMDA4LCAweDgwMTAsCisJMHgwMDAwLCAweDAwMDQsIDB4MDAwYSwgMHg0MTQzLCAweDAwMDMsIDB4MDg4OCwgMHgwMDAyLCAweDNhNDQsCisJMHgwMDAzLCAweDg4MTMsIDB4MDAwOCwgMHgwZDJhLCAweDAwMGIsIDB4MDNhOSwgMHgwMDA4LCAweDgwMTAsCisJMHgwMDA4LCAweDAwMDMsIDB4MDAwMywgMHgwM2FiLCAweDAwMDgsIDB4ODAxMCwgMHgwMDAwLCAweDAwMGIsCisJMHgwMDAzLCAweDAzYWIsIDB4MDAwOCwgMHg4MDEwLCAweDAwMDAsIDB4MDAwMiwgMHgwMDAzLCAweDAzYWIsCisJMHgwMDAyLCAweDNhNDcsIDB4MDAwYiwgMHg4YTY3LCAweDAwMDgsIDB4ODAxMCwgMHgwMDA4LCAweDAwMDYsCisJMHgwMDAzLCAweDAzYWIsIDB4MDAwMCwgMHg4MDc0LCAweDAwMDgsIDB4ZjAwMCwgMHgwMDBjLCAweDAzNjIsCisJMHgwMDA0LCAweDAzNjUsIDB4MDAwYSwgMHgzYTQwLCAweDAwMGIsIDB4MDgxMywgMHgwMDA4LCAweDgwMTAsCisJMHgwMDA4LCAweDAwMGMsIDB4MDAwYywgMHgwMzYyLCAweDAwMDMsIDB4MDAxMywgMHgwMDAwLCAweDgwNzQsCisJMHgwMDAwLCAweGYwODAsIDB4MDAwMCwgMHgwZDMwLCAweDAwMDIsIDB4MmU0ZCwgMHgwMDAyLCAweDJlNGQsCisJMHgwMDBiLCAweDBiYmMsIDB4MDAwOCwgMHg4MDU0LCAweDAwMDAsIDB4MDAxOSwgMHgwMDAzLCAweDAwMTMsCisJMHgwMDA4LCAweDgwNTQsIDB4MDAwOCwgMHgwMDA5LCAweDAwMDMsIDB4MDAxMywgMHgwMDAyLCAweDNhNDQsCisJMHgwMDAzLCAweDg4MTMsIDB4MDAwMywgMHgwMzllLCAweDAwMDgsIDB4ODA4YywgMHgwMDA4LCAweDAwMDAsCisJMHgwMDAyLCAweDQ0NDcsIDB4MDAwMywgMHgwYmU4LCAweDAwMDEsIDB4YzBjMCwgMHgwMDA4LCAweDAwZmYsCisJMHgwMDA5LCAweGZmZTAsIDB4MDAwOCwgMHgwMGZmLCAweDAwMDMsIDB4OGJiZiwgMHgwMDAxLCAweGMxZTAsCisJMHgwMDA4LCAweGZmZmYsIDB4MDAwMywgMHg4YmJmLCAweDAwMDgsIDB4ODAxMCwgMHgwMDAwLCAweDAwMTMsCisJMHgwMDBjLCAweDAzNjIsIDB4MDAwMCwgMHg4MDc0LCAweDAwMDgsIDB4MDIwMiwgMHgwMDAzLCAweDAwMTMsCisJMHgwMDBhLCAweDNhNDAsIDB4MDAwMywgMHg4YmU1LCAweDAwMDAsIDB4ODA3NCwgMHgwMDAwLCAweDAyMDAsCisJMHgwMDAwLCAweDNkMDAsIDB4MDAwMCwgMHgzY2ZlLCAweDAwMDAsIDB4ODA3MiwgMHgwMDAwLCAweDgwMDAsCisJMHgwMDAxLCAweDQzZTAsIDB4MDAwMywgMHg4YmUzLCAweDAwMDAsIDB4NDJmZSwgMHgwMDAxLCAweGZmYzAsCisJMHgwMDA4LCAweDAwZmYsIDB4MDAwOSwgMHgwMGUwLCAweDAwMGIsIDB4MGJiZiwgMHgwMDA4LCAweDBkMDgsCisJMHgwMDBiLCAweDA0MzgsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAzLCAweDAwMTMsCisJMHgwMDA0LCAweDA0YmEsIDB4MDAwOCwgMHg4MDhjLCAweDAwMDAsIDB4MDAwMSwgMHgwMDAwLCAweDA0ZmMsCisJMHgwMDBiLCAweDM0OWQsIDB4MDAwMCwgMHgwNDYwLCAweDAwMDgsIDB4ODA2MiwgMHgwMDAwLCAweDAwMDEsCisJMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHgwMDA5LCAweDAwMDMsIDB4YzNmMiwgMHgwMDAwLCAweDAwMDQsCisJMHgwMDA5LCAweDgwYzAsIDB4MDAwOCwgMHgwMGZmLCAweDAwMDAsIDB4N2YwMCwgMHgwMDAxLCAweDgwZTAsCisJMHgwMDAwLCAweDAwMDQsIDB4MDAwYiwgMHgwYzBjLCAweDAwMDEsIDB4ODBlMCwgMHgwMDA4LCAweDAwMDUsCisJMHgwMDBiLCAweDBjMGMsIDB4MDAwMSwgMHg4MGUwLCAweDAwMDgsIDB4MDAwNiwgMHgwMDBiLCAweDBjMGMsCisJMHgwMDAxLCAweDgyYzAsIDB4MDAwOCwgMHhmZjAwLCAweDAwMDgsIDB4N2YwNCwgMHgwMDA5LCAweDgyZTAsCisJMHgwMDA4LCAweDA2MDAsIDB4MDAwYiwgMHgwYzBjLCAweDAwMDksIDB4ODJlMCwgMHgwMDA4LCAweDA1MDAsCisJMHgwMDBiLCAweDBjMGMsIDB4MDAwOSwgMHg4MmUwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDBiLCAweDhjOWQsCisJMHgwMDA5LCAweGM0YzAsIDB4MDAwMCwgMHg3MDAwLCAweDAwMDksIDB4ZmZlMCwgMHgwMDAwLCAweDEwMDAsCisJMHgwMDAzLCAweDBjMzgsIDB4MDAwNCwgMHgwNGFiLCAweDAwMDIsIDB4Mzk0MSwgMHgwMDBiLCAweDBjMTcsCisJMHgwMDAwLCAweDgwNzIsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDMsIDB4MDAxMywgMHgwMDAwLCAweDA0NjAsCisJMHgwMDA4LCAweDgwZmUsIDB4MDAwOCwgMHgwMDJiLCAweDAwMDgsIDB4N2Y2MiwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDA4LCAweDIyMDksIDB4MDAwMywgMHhjNDFkLCAweDAwMDgsIDB4MTFmYywgMHgwMDAzLCAweDM0MzMsCisJMHgwMDAxLCAweDkxODAsIDB4MDAwMCwgMHgwMDAyLCAweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsCisJMHgwMDA4LCAweDdmNjIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDgsIDB4MDYwOSwgMHgwMDAzLCAweGM0MjcsCisJMHgwMDAwLCAweDQyZmUsIDB4MDAwMSwgMHhmZmMwLCAweDAwMDgsIDB4ZmYwMCwgMHgwMDA5LCAweDAzZTAsCisJMHgwMDAzLCAweDhjMzAsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAzLCAweDAwNTIsCisJMHgwMDAxLCAweDkxODAsIDB4MDAwOCwgMHgwMDAzLCAweDAwMGIsIDB4MDQxYSwgMHgwMDAwLCAweDgwNzIsCisJMHgwMDAwLCAweDA0MDAsIDB4MDAwOCwgMHg4MDEwLCAweDAwMDAsIDB4MDAxMCwgMHgwMDAzLCAweDA0OTAsCisJMHgwMDA0LCAweDA0YWIsIDB4MDAwMiwgMHgzOTQxLCAweDAwMDMsIDB4MGMzZSwgMHgwMDAwLCAweDgwNzIsCisJMHgwMDAwLCAweDA0MDAsIDB4MDAwMywgMHgwMDEzLCAweDAwMDQsIDB4MDQ3NSwgMHgwMDA4LCAweDExZmMsCisJMHgwMDAzLCAweGI0NDYsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsIDB4MDQwMCwgMHgwMDA4LCAweDgwMTAsCisJMHgwMDAwLCAweDAwMGUsIDB4MDAwMywgMHgwNDkwLCAweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsCisJMHgwMDAwLCAweDA0ZmMsIDB4MDAwMywgMHhiNDViLCAweDAwMDgsIDB4ODA4YywgMHgwMDA4LCAweDAwMDAsCisJMHgwMDAxLCAweDkxODAsIDB4MDAwOCwgMHgwMDA1LCAweDAwMDgsIDB4N2Y2MiwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYiwgMHhjNDUxLCAweDAwMDgsIDB4MDA2MCwgMHgwMDA4LCAweDgwNjIsCisJMHgwMDA4LCAweDAwMWIsIDB4MDAwOCwgMHg0MzA0LCAweDAwMDgsIDB4NDIwNiwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDAwLCAweDA0MTIsIDB4MDAwMywgMHhjNDU5LCAweDAwMDMsIDB4MDQ3MiwgMHgwMDA4LCAweDgwOGMsCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMCwgMHgwNDYwLCAweDAwMDgsIDB4ODA2MiwgMHgwMDA4LCAweDAwMmIsCisJMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHgwNjA5LCAweDAwMGIsIDB4YzQ2MiwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDA4LCAweDIyMGEsIDB4MDAwMywgMHhjNDY1LCAweDAwMDAsIDB4NDJmZSwgMHgwMDAxLCAweGZmYzAsCisJMHgwMDA4LCAweGZmMDAsIDB4MDAwOCwgMHg3ZjA0LCAweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsCisJMHgwMDAxLCAweDkxODAsIDB4MDAwMCwgMHgwMDAyLCAweDAwMDgsIDB4N2Y2MiwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDA4LCAweDA0MWEsIDB4MDAwMywgMHhjNDcxLCAweDAwMDAsIDB4ODA3MiwgMHgwMDAwLCAweDA0MDAsCisJMHgwMDAzLCAweDAwNTIsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDA4LCAweDZiNjIsCisJMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwgMHgwNDExLCAweDAwMGIsIDB4YzQ3YSwgMHgwMDA4LCAweDAyZmUsCisJMHgwMDA5LCAweDAzZTAsIDB4MDAwYiwgMHg4YzgwLCAweDAwMDAsIDB4MGQyMiwgMHgwMDBmLCAweDQwMDAsCisJMHgwMDA5LCAweDgyODAsIDB4MDAwMCwgMHgwMDAyLCAweDAwMDEsIDB4NmI4MCwgMHgwMDA4LCAweDdmNjIsCisJMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHgyMjA5LCAweDAwMGIsIDB4YzQ4NiwgMHgwMDBhLCAweDAyMDAsCisJMHgwMDAxLCAweGZmYzAsIDB4MDAwMCwgMHgwMDA3LCAweDAwMDAsIDB4N2YwNiwgMHgwMDA4LCAweDZiNjIsCisJMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHgwNjBhLCAweDAwMDMsIDB4YzQ4ZSwgMHgwMDBmLCAweDQwMDAsCisJMHgwMDAyLCAweDNhNDQsIDB4MDAwMywgMHg4ODEzLCAweDAwMGEsIDB4MmY0NCwgMHgwMDBhLCAweDJmNDQsCisJMHgwMDAzLCAweDhiOWUsIDB4MDAwOCwgMHg4MDhhLCAweDAwMDgsIDB4MDAwMywgMHgwMDAwLCAweDgwNzQsCisJMHgwMDAwLCAweGYwODAsIDB4MDAwYiwgMHg1Yzk5LCAweDAwMDgsIDB4ODA1NCwgMHgwMDAwLCAweDAwMTksCisJMHgwMDAzLCAweDAwMTMsIDB4MDAwMiwgMHgzYTQ0LCAweDAwMDMsIDB4ODgxMywgMHgwMDA4LCAweDgwOGMsCisJMHgwMDA4LCAweDAwMDAsIDB4MDAwOCwgMHg4MDEwLCAweDAwMDgsIDB4MDAxMSwgMHgwMDBjLCAweDAzNjIsCisJMHgwMDAwLCAweDQyZmUsIDB4MDAwMSwgMHhmZmMwLCAweDAwMDgsIDB4MDBmZiwgMHgwMDA4LCAweDdmMTAsCisJMHgwMDBjLCAweDAzNjIsIDB4MDAwOCwgMHg0MzEwLCAweDAwMDMsIDB4MDNhYiwgMHgwMDAyLCAweDM5NDEsCisJMHgwMDAzLCAweDBjYWUsIDB4MDAwZiwgMHg0MDAwLCAweDAwMDAsIDB4ODA3MiwgMHgwMDA4LCAweDA0MDQsCisJMHgwMDBmLCAweDQwMDAsIDB4MDAwOCwgMHg4MDEwLCAweDAwMDgsIDB4MDAxMiwgMHgwMDBjLCAweDAzNjIsCisJMHgwMDA0LCAweDA0NzUsIDB4MDAwMCwgMHgxMTEwLCAweDAwMGMsIDB4MDM2MiwgMHgwMDA4LCAweDExZmMsCisJMHgwMDBiLCAweGI0YjQsIDB4MDAwMywgMHgwMDEzLCAweDAwMDksIDB4YzJjMCwgMHgwMDA4LCAweDAwZmYsCisJMHgwMDAwLCAweDdmMDAsIDB4MDAwMSwgMHhjM2MwLCAweDAwMDgsIDB4ZmYwMCwgMHgwMDA5LCAweDAwZDAsCisJMHgwMDAzLCAweDBjZGYsIDB4MDAwMCwgMHgwZDBhLCAweDAwMDEsIDB4ODU4MCwgMHgwMDAwLCAweDEwMDAsCisJMHgwMDA4LCAweDdmNjIsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDAwLCAweDA4MDksIDB4MDAwMywgMHhjNGM5LCAweDAwMDAsIDB4MDRmYywgMHgwMDAzLCAweDM0ZDgsCisJMHgwMDAwLCAweDA0NjAsIDB4MDAwOCwgMHg4MDYyLCAweDAwMDAsIDB4MDAwNCwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDAwLCAweDAyMTEsIDB4MDAwMywgMHhjNGQxLCAweDAwMDgsIDB4MDFmZSwgMHgwMDA5LCAweDAwZTAsCisJMHgwMDAzLCAweDhjZDgsIDB4MDAwOCwgMHgwMmZlLCAweDAwMDEsIDB4NDNlMCwgMHgwMDBiLCAweDBjZGUsCisJMHgwMDAyLCAweDA1MDAsIDB4MDAwMCwgMHg3ZjBhLCAweDAwMDksIDB4ZmZlMCwgMHgwMDAwLCAweDA4MDAsCisJMHgwMDBiLCAweDhjYzIsIDB4MDAwOCwgMHgwZDA4LCAweDAwMGYsIDB4NDAwMCwgMHgwMDA4LCAweDQzZmUsCisJMHgwMDAxLCAweDNlODAsIDB4MDAwMCwgMHgwZDYwLCAweDAwMDgsIDB4N2Y2MiwgMHgwMDAwLCAweDgwNjYsCisJMHgwMDAwLCAweDA4MDksIDB4MDAwYiwgMHhjNGU1LCAweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsCisJMHgwMDAxLCAweDg0YzAsIDB4MDAwOCwgMHhmZjAwLCAweDAwMDIsIDB4N2Y3MCwgMHgwMDA5LCAweGZmODAsCisJMHgwMDAwLCAweDEwMDAsIDB4MDAwOCwgMHg3ZjYyLCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDA4MDksCisJMHgwMDAzLCAweGM0ZjAsIDB4MDAwZiwgMHg0MDAwLCAweGU1MDQsIDB4MzMzNAorfTsKK3Vuc2lnbmVkIHNob3J0IHJzZXFpcHhfY29kZV9sZW5ndGgwMSA9IDB4MDllNjsKKy8qCisgKgorICovCisKK3Vuc2lnbmVkIGxvbmcgeHNlcWlweF9jb2RlX2FkZHIwMSA9IDB4MDAwMWUwMDAgOwordW5zaWduZWQgc2hvcnQgeHNlcWlweF9jb2RlMDFbXSA9IHsgCisweDAwMTMsIDB4MDAwMywgMHgwMDAwLCAweDEwZDYsIDB4MDAwMSwgMHhlMDAwLCAweDAwMDUsIDB4MDAzMiwKKwkweDAwMDAsIDB4MDAxMCwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhiYjM5LCAweDAwMGIsIDB4ODAwNywKKwkweDAwMDQsIDB4MDEwYiwgMHgwMDE0LCAweDAxMWQsIDB4MDAxMCwgMHhjMDAwLCAweDAwMDAsIDB4YzAwMSwKKwkweDAwMDAsIDB4YzBiMCwgMHgwMDEwLCAweGMwYjEsIDB4MDAxMCwgMHhjMGIyLCAweDAwMDAsIDB4YzBiMywKKwkweDAwMTAsIDB4YzBiNCwgMHgwMDAwLCAweGMwYjUsIDB4MDAwMCwgMHhjMGI2LCAweDAwMTAsIDB4YzBiNywKKwkweDAwMTAsIDB4YzBiOCwgMHgwMDAwLCAweGMwYjksIDB4MDAwMCwgMHhjMGJhLCAweDAwMDAsIDB4YzBjMiwKKwkweDAwMTAsIDB4YzBjMywgMHgwMDAwLCAweGMwYzQsIDB4MDAxMCwgMHhjMGM1LCAweDAwMTAsIDB4YzBjNiwKKwkweDAwMDAsIDB4YzBjNywgMHgwMDAwLCAweGMwYzgsIDB4MDAxMCwgMHhjMGM5LCAweDAwMTAsIDB4YzBjYSwKKwkweDAwMDAsIDB4YzBjYiwgMHgwMDEwLCAweGMwY2MsIDB4MDAwMCwgMHhjMGNkLCAweDAwMDAsIDB4YzBjZSwKKwkweDAwMTAsIDB4YzBjZiwgMHgwMDE1LCAweDAwMzksIDB4MDAxMCwgMHhmZjAwLCAweDAwMTUsIDB4MDAzYSwKKwkweDAwMTAsIDB4ZmYwMCwgMHgwMDA1LCAweDAwZDAsIDB4MDAxMCwgMHhmZjAwLCAweDAwMTUsIDB4MDBkMSwKKwkweDAwMTAsIDB4ZmYwMCwgMHgwMDEyLCAweDNhNDAsIDB4MDAwYiwgMHgxMDMxLCAweDAwMDIsIDB4Nzk0MCwKKwkweDAwMWIsIDB4MTEyZiwgMHgwMDAyLCAweDNhNDIsIDB4MDAxYiwgMHgxMDM1LCAweDAwMDMsIDB4YjAzNSwKKwkweDAwMTMsIDB4YTFkYywgMHgwMDAyLCAweDNhNDEsIDB4MDAxYiwgMHgxMDM5LCAweDAwMTIsIDB4Nzk0MSwKKwkweDAwMWIsIDB4MTMxMSwgMHgwMDAzLCAweGUwNTUsIDB4MDAxMiwgMHhkMDQyLCAweDAwMDMsIDB4MTAzZiwKKwkweDAwMDAsIDB4NzVmZiwgMHgwMDAyLCAweGZmNDEsIDB4MDAxYiwgMHgxMDU1LCAweDAwMDAsIDB4MGNmZSwKKwkweDAwMDMsIDB4NjA0OSwgMHgwMDAyLCAweDNhNDQsIDB4MDAwYiwgMHgxMDQ5LCAweDAwMTEsIDB4MDJlOCwKKwkweDAwMTAsIDB4MDAwMCwgMHgwMDEzLCAweDEzYTIsIDB4MDAxMSwgMHgwMmU4LCAweDAwMTAsIDB4MDAwNSwKKwkweDAwMDMsIDB4MTQzMiwgMHgwMDEyLCAweDNhNDYsIDB4MDAxYiwgMHgxMDU1LCAweDAwMTIsIDB4ZDA0MiwKKwkweDAwMDMsIDB4MTA1MCwgMHgwMDAwLCAweDc1ZmYsIDB4MDAxMiwgMHhmZjQwLCAweDAwMWIsIDB4MTA1NSwKKwkweDAwMDAsIDB4MTJmZSwgMHgwMDEzLCAweDYwNTUsIDB4MDAwMSwgMHgwZmU4LCAweDAwMTAsIDB4MDAwMCwKKwkweDAwMDMsIDB4MTYzZiwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMTAsIDB4YzEzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDEwLCAweGIyMTEsIDB4MDAxYiwgMHg4MDVhLCAweDAwMTAsIDB4YjJmZiwKKwkweDAwMDEsIDB4YjNlMCwgMHgwMDFjLCAweDEwY2QsIDB4MDAwYiwgMHhmMDJkLCAweDAwMTEsIDB4M2JlOCwKKwkweDAwMDAsIDB4MDAxMCwgMHgwMDFiLCAweDEwNzIsIDB4MDAwMCwgMHgwYWZlLCAweDAwMGIsIDB4NjA2NiwKKwkweDAwMDAsIDB4M2MwYiwgMHgwMDAzLCAweDAwNmUsIDB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMDEsIDB4MGE4OCwgMHgwMDEwLCAweDAwMDMsIDB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMTAsIDB4M2MwYSwgMHgwMDBiLCAweDgwNmQsIDB4MDAxMCwgMHgzYzBhLCAweDAwMDIsIDB4MGMwMCwKKwkweDAwMTAsIDB4ZmYwYywgMHgwMDEzLCAweDAwY2EsIDB4MDAxMSwgMHgzYmU4LCAweDAwMTAsIDB4MDAxMiwKKwkweDAwMGIsIDB4MTA4NSwgMHgwMDEwLCAweDA4ZmUsIDB4MDAxYiwgMHg2MDc5LCAweDAwMTAsIDB4M2MwOSwKKwkweDAwMTMsIDB4MDA4MSwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MDg4OCwKKwkweDAwMTAsIDB4MDAwMywgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4M2MwYSwKKwkweDAwMGIsIDB4ODA4MCwgMHgwMDAwLCAweDNjMDgsIDB4MDAwMiwgMHgwYzAwLCAweDAwMTAsIDB4ZmYwYywKKwkweDAwMTMsIDB4MDBjYSwgMHgwMDExLCAweDNiZTgsIDB4MDAwMCwgMHgwMDEzLCAweDAwMWIsIDB4MTA4YiwKKwkweDAwMDAsIDB4M2NiMCwgMHgwMDA0LCAweDAwZGQsIDB4MDAxMywgMHgwMGNhLCAweDAwMTEsIDB4M2JlOCwKKwkweDAwMDAsIDB4MDAxOSwgMHgwMDBiLCAweDEwOWUsIDB4MDAxMCwgMHgwNGZlLCAweDAwMWIsIDB4NjA5MiwKKwkweDAwMTAsIDB4M2MwNSwgMHgwMDEzLCAweDAwOWEsIDB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMTEsIDB4MDQ4OCwgMHgwMDEwLCAweDAwMDMsIDB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMTAsIDB4M2MwYSwgMHgwMDFiLCAweDgwOTksIDB4MDAwMCwgMHgzYzA0LCAweDAwMDIsIDB4MGMwMCwKKwkweDAwMTAsIDB4ZmYwYywgMHgwMDEzLCAweDAwY2EsIDB4MDAxMSwgMHgzYmU4LCAweDAwMDAsIDB4MDAxNSwKKwkweDAwMWIsIDB4MTBhYSwgMHgwMDE0LCAweDAxMTQsIDB4MDAwNCwgMHgwMTI2LCAweDAwMTUsIDB4MDAzOSwKKwkweDAwMDAsIDB4ODAwMCwgMHgwMDE3LCAweDgwMDAsIDB4MDAwNCwgMHgwMTBiLCAweDAwMTQsIDB4MDExZCwKKwkweDAwMDQsIDB4MDBmNiwgMHgwMDEzLCAweDAwMmQsIDB4MDAxMSwgMHgzYmU4LCAweDAwMDAsIDB4MDAxNiwKKwkweDAwMGIsIDB4MTBiYywgMHgwMDAxLCAweDBmZTgsIDB4MDAxMCwgMHgwMDAwLCAweDAwMTMsIDB4MTBiNiwKKwkweDAwMDEsIDB4MGZlOCwgMHgwMDAwLCAweDAwMDIsIDB4MDAxMywgMHgxMGI2LCAweDAwMTUsIDB4MDAzOSwKKwkweDAwMTAsIDB4MTAxMCwgMHgwMDEzLCAweDAwY2EsIDB4MDAxNSwgMHgwMDM5LCAweDAwMDAsIDB4NTA0MCwKKwkweDAwMTUsIDB4MDBiOCwgMHgwMDAwLCAweDAwMDgsIDB4MDAwNCwgMHgwODY3LCAweDAwMTMsIDB4MDBjYSwKKwkweDAwMTEsIDB4M2JlOCwgMHgwMDEwLCAweDAwMTcsIDB4MDAwYiwgMHgxMGMxLCAweDAwMTAsIDB4M2NjMywKKwkweDAwMTMsIDB4MDBjYSwgMHgwMDExLCAweDNiZTgsIDB4MDAxMCwgMHgwMDE4LCAweDAwMWIsIDB4MTBjNiwKKwkweDAwMDAsIDB4M2NjMiwgMHgwMDEzLCAweDAwY2EsIDB4MDAwNSwgMHgwMGNlLCAweDAwMDAsIDB4MDAwMSwKKwkweDAwMDAsIDB4M2JjZiwgMHgwMDA0LCAweDA4MjksIDB4MDAxNSwgMHgwMDM5LCAweDAwMDAsIDB4ODAwMCwKKwkweDAwMTMsIDB4MDAyZCwgMHgwMDAxLCAweGIyODgsIDB4MDAwMCwgMHgwMDAyLCAweDAwMDEsIDB4YzE4MCwKKwkweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDA5LCAweDAwMGIsIDB4ODBkMywKKwkweDAwMDIsIDB4YjIwMCwgMHgwMDExLCAweGZmYzgsIDB4MDAwMCwgMHgwMDA3LCAweDAwMTAsIDB4ZmZiMiwKKwkweDAwMTAsIDB4YzEzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhiMjBhLCAweDAwMDEsIDB4YjBkMCwKKwkweDAwMGIsIDB4ODBkYywgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4YjA4OCwKKwkweDAwMDAsIDB4MDAxMCwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YjEwOSwKKwkweDAwMWIsIDB4ODBlNCwgMHgwMDAxLCAweGIxZTgsIDB4MDAxMCwgMHhmZmZmLCAweDAwMDMsIDB4MTBmNSwKKwkweDAwMDAsIDB4MTFmZSwgMHgwMDFiLCAweDYwZWMsIDB4MDAwMCwgMHhiMDEyLCAweDAwMDMsIDB4MDBmNCwKKwkweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMSwgMHgxMTg4LCAweDAwMTAsIDB4MDAwMywKKwkweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDBhLCAweDAwMWIsIDB4ODBmMywKKwkweDAwMDAsIDB4YjAxMSwgMHgwMDE3LCAweDQwMDAsIDB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMTEsIDB4YmM4OCwgMHgwMDAwLCAweDAwMWYsIDB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4YzQxMSwgMHgwMDBiLCAweDgwZmQsIDB4MDAxMSwgMHhiYzg4LCAweDAwMTAsIDB4MDAxOCwKKwkweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhjNjA5LCAweDAwMGIsIDB4ODEwMywKKwkweDAwMTEsIDB4YmM4OCwgMHgwMDAwLCAweDAwMzcsIDB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4YzcwOSwgMHgwMDBiLCAweDgxMDksIDB4MDAxNywgMHg0MDAwLCAweDAwMTUsIDB4MDAzMCwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDAxLCAweGJiODgsIDB4MDAwMCwgMHgwMDAxLCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweDAyNjksIDB4MDAwYiwgMHg4MTEyLCAweDAwMTcsIDB4NDAwMCwKKwkweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMSwgMHhiYjg4LCAweDAwMDAsIDB4MDAwMSwKKwkweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHgwMjZhLCAweDAwMGIsIDB4ODExYiwKKwkweDAwMTcsIDB4NDAwMCwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDEsIDB4YmI4OCwKKwkweDAwMTAsIDB4MDAwZiwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4MGY1OSwKKwkweDAwMGIsIDB4ODEyNCwgMHgwMDE3LCAweDQwMDAsIDB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMDEsIDB4YmI4OCwgMHgwMDEwLCAweDAwMGYsIDB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMTAsIDB4MGY1YSwgMHgwMDBiLCAweDgxMmQsIDB4MDAxNywgMHg0MDAwLCAweDAwMDAsIDB4ZDBmZiwKKwkweDAwMTIsIDB4ZmY0MCwgMHgwMDBiLCAweDEwMzEsIDB4MDAxNSwgMHgwMGQxLCAweDAwMTAsIDB4MDEwMSwKKwkweDAwMTMsIDB4OTEzNCwgMHgwMDA1LCAweDAwNzksIDB4MDAwMCwgMHgwMDAxLCAweDAwMTMsIDB4OTEzNywKKwkweDAwMTUsIDB4MDBkMSwgMHgwMDAwLCAweDAxMDAsIDB4MDAxMSwgMHgwMmU4LCAweDAwMDAsIDB4MDAwMiwKKwkweDAwMDMsIDB4MTE2MSwgMHgwMDExLCAweDAyZTgsIDB4MDAwMCwgMHgwMDAxLCAweDAwMDMsIDB4MTE3OSwKKwkweDAwMTEsIDB4MDJlOCwgMHgwMDAwLCAweDAwMDQsIDB4MDAwMywgMHgxMTk3LCAweDAwMTEsIDB4MDJlOCwKKwkweDAwMTAsIDB4MDAwMywgMHgwMDAzLCAweDExYzgsIDB4MDAwNSwgMHgwMDAyLCAweDAwMTAsIDB4MDAwMCwKKwkweDAwMDAsIDB4YzAwZSwgMHgwMDAwLCAweGMwMGQsIDB4MDAxMCwgMHhjMDAzLCAweDAwMTUsIDB4MDAzMCwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDAxLCAweGJkODgsIDB4MDAxMCwgMHgwMDA5LCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDEwLCAweGMwMGEsIDB4MDAxYiwgMHg4MTUyLCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDEwLCAweGMwMGEsIDB4MDAwYiwgMHg4MTU2LCAweDAwMTIsIDB4M2E0NSwKKwkweDAwMDMsIDB4MTE1ZSwgMHgwMDE1LCAweDAwM2EsIDB4MDAwMCwgMHgyMDAwLCAweDAwMTUsIDB4MDAzYSwKKwkweDAwMTAsIDB4MTAxMCwgMHgwMDE0LCAweDA4NTMsIDB4MDAxMiwgMHhkMDQyLCAweDAwMTMsIDB4MTAzMSwKKwkweDAwMTMsIDB4MDA1MCwgMHgwMDEyLCAweDc4NDksIDB4MDAwMywgMHgxMWQ2LCAweDAwMTAsIDB4MGRmZSwKKwkweDAwMDMsIDB4NjE0OCwgMHgwMDEyLCAweDBjMTAsIDB4MDAxMCwgMHhmZjBjLCAweDAwMTUsIDB4MDAzMCwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDExLCAweDBkODgsIDB4MDAxMCwgMHgwMDAzLCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIzMDksIDB4MDAxYiwgMHg4MTZlLCAweDAwMTAsIDB4YjNmZSwKKwkweDAwMTMsIDB4NjE3NiwgMHgwMDEwLCAweGIzMGIsIDB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YzAwYSwKKwkweDAwMGIsIDB4ODE3NCwgMHgwMDEzLCAweDAxY2IsIDB4MDAwMCwgMHhjMDBiLCAweDAwMTAsIDB4YzAwYSwKKwkweDAwMTMsIDB4MDFjYiwgMHgwMDAwLCAweDc4YjAsIDB4MDAxMiwgMHhiMDQ0LCAweDAwMDMsIDB4MTFkNiwKKwkweDAwMDIsIDB4YjA0OSwgMHgwMDAzLCAweDExZDYsIDB4MDAxMCwgMHg3MWZmLCAweDAwMTIsIDB4ZmYzOCwKKwkweDAwMTAsIDB4ZmY3MSwgMHgwMDEwLCAweDBkZmUsIDB4MDAxMywgMHg2MTQ2LCAweDAwMTIsIDB4MGMxMCwKKwkweDAwMTAsIDB4ZmYwYywgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MGQ4OCwKKwkweDAwMTAsIDB4MDAwMywgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjMwOSwKKwkweDAwMWIsIDB4ODE4YywgMHgwMDEwLCAweGIzZmUsIDB4MDAxMywgMHg2MTk0LCAweDAwMDAsIDB4YjMwOSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDEwLCAweGMwMGEsIDB4MDAxYiwgMHg4MTkyLCAweDAwMTMsIDB4MDFjYiwKKwkweDAwMTAsIDB4YzAwOSwgMHgwMDAwLCAweGMwMDgsIDB4MDAxMywgMHgwMWNiLCAweDAwMDAsIDB4NzhiMCwKKwkweDAwMTIsIDB4YjA0NCwgMHgwMDAzLCAweDExZDYsIDB4MDAwMiwgMHhiMDQ5LCAweDAwMDMsIDB4MTFkNiwKKwkweDAwMTAsIDB4NzFmZiwgMHgwMDEyLCAweGZmMzgsIDB4MDAxMCwgMHhmZjcxLCAweDAwMTAsIDB4MGRmZSwKKwkweDAwMTMsIDB4NjE0NiwgMHgwMDEyLCAweDBjMTAsIDB4MDAxMCwgMHhmZjBjLCAweDAwMTUsIDB4MDAzMCwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDExLCAweDBkODgsIDB4MDAxMCwgMHgwMDAzLCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIzMDksIDB4MDAwYiwgMHg4MWFhLCAweDAwMTAsIDB4YjNmZSwKKwkweDAwMDMsIDB4NjFiMiwgMHgwMDAwLCAweGIzMDUsIDB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YzAwYSwKKwkweDAwMWIsIDB4ODFiMCwgMHgwMDAzLCAweDAxYjQsIDB4MDAxMCwgMHhjMDA1LCAweDAwMDAsIDB4YzAwNCwKKwkweDAwMDIsIDB4MDMzZiwgMHgwMDAyLCAweGZmMjcsIDB4MDAwMCwgMHgwZGI4LCAweDAwMTQsIDB4MDM5NywKKwkweDAwMDAsIDB4MGRiOCwgMHgwMDA0LCAweDA4NjcsIDB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMTEsIDB4YmM4OCwgMHgwMDEwLCAweDAwMDAsIDB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4YjMwOSwgMHgwMDFiLCAweDgxYzEsIDB4MDAxMSwgMHhiM2U4LCAweDAwMDAsIDB4MDAwMiwKKwkweDAwMWIsIDB4MTE0NiwgMHgwMDA1LCAweDAwMDIsIDB4MDAxMCwgMHgwMDA1LCAweDAwMDMsIDB4MDE0OCwKKwkweDAwMTIsIDB4Nzg0OSwgMHgwMDAzLCAweDExZDYsIDB4MDAwMywgMHgwMTQ4LCAweDAwMDAsIDB4MGRiOCwKKwkweDAwMTIsIDB4MDM0NSwgMHgwMDBiLCAweDExZDEsIDB4MDAwMiwgMHgwMzNmLCAweDAwMTQsIDB4MDM5NywKKwkweDAwMTMsIDB4MDE0NiwgMHgwMDAyLCAweDAzM2YsIDB4MDAwMiwgMHhmZjI3LCAweDAwMTQsIDB4MDM5NywKKwkweDAwMDQsIDB4MDg2NywgMHgwMDEzLCAweDAxNDYsIDB4MDAxNSwgMHgwMGI4LCAweDAwMDAsIDB4MDAwMSwKKwkweDAwMTUsIDB4MDAzYSwgMHgwMDEwLCAweDAxMDEsIDB4MDAwNCwgMHgwODY3LCAweDAwMTMsIDB4MDE1NywKKwkweDAwMDEsIDB4MmJkOCwgMHgwMDEwLCAweDAwMDAsIDB4MDAwMCwgMHhmZmJhLCAweDAwMDMsIDB4YjFkZiwKKwkweDAwMDUsIDB4MDAyYSwgMHgwMDAwLCAweDAwMDIsIDB4MDAwMSwgMHhiYWM4LCAweDAwMDAsIDB4MDcwMCwKKwkweDAwMGIsIDB4MTJjYywgMHgwMDExLCAweDE1ZTgsIDB4MDAwMCwgMHgwMDAyLCAweDAwMTMsIDB4MTI0MiwKKwkweDAwMTEsIDB4MTVlOCwgMHgwMDAwLCAweDAwMDEsIDB4MDAxMywgMHgxMWVlLCAweDAwMDUsIDB4MDAxNSwKKwkweDAwMTAsIDB4MDAwMCwgMHgwMDEzLCAweDAyMjUsIDB4MDAwNSwgMHgwMDE1LCAweDAwMTAsIDB4MDAwMCwKKwkweDAwMDIsIDB4YmE0MywgMHgwMDAzLCAweDEyMjYsIDB4MDAwMywgMHhiMWYyLCAweDAwMDUsIDB4MDAyYSwKKwkweDAwMDAsIDB4MDAwNCwgMHgwMDEyLCAweGJhNDIsIDB4MDAwMywgMHgxMjJjLCAweDAwMTIsIDB4MTA0YiwKKwkweDAwMWIsIDB4MTIyNSwgMHgwMDAwLCAweDFhMzAsIDB4MDAwNSwgMHgwMDMxLCAweDAwMDAsIDB4MDAwMiwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweDFiMmEsIDB4MDAxYiwgMHg4MWZlLCAweDAwMTEsIDB4MjBkOCwKKwkweDAwMTAsIDB4MDAwMCwgMHgwMDAwLCAweGZmYjAsIDB4MDAwMSwgMHgyMWQ4LCAweDAwMTAsIDB4MDAwMCwKKwkweDAwMTAsIDB4ZmZiMSwgMHgwMDAxLCAweDIyZDgsIDB4MDAxMCwgMHgwMDAwLCAweDAwMTAsIDB4ZmZiMiwKKwkweDAwMTEsIDB4MjNkOCwgMHgwMDEwLCAweDAwMDAsIDB4MDAwMCwgMHhmZmIzLCAweDAwMDEsIDB4MjRkOCwKKwkweDAwMTAsIDB4MDAwMCwgMHgwMDEwLCAweGZmYjQsIDB4MDAxMSwgMHgyNWQ4LCAweDAwMTAsIDB4MDAwMCwKKwkweDAwMDAsIDB4ZmZiNSwgMHgwMDAxLCAweDI4ZDgsIDB4MDAxMCwgMHgwMDAwLCAweDAwMTAsIDB4ZmZiOCwKKwkweDAwMTEsIDB4MjlkOCwgMHgwMDEwLCAweDAwMDAsIDB4MDAwMCwgMHhmZmI5LCAweDAwMDAsIDB4MWEzMCwKKwkweDAwMDUsIDB4MDAzMSwgMHgwMDAwLCAweDAwMDcsIDB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YjAzMiwKKwkweDAwMWIsIDB4ODIxYywgMHgwMDAwLCAweDFhMzAsIDB4MDAwNSwgMHgwMDMxLCAweDAwMTAsIDB4MDAwZiwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDEwLCAweGI4MTIsIDB4MDAwYiwgMHg4MjIyLCAweDAwMDUsIDB4MDAxNSwKKwkweDAwMTAsIDB4MDAwMCwgMHgwMDEzLCAweDAwMzUsIDB4MDAwMCwgMHgxZWZlLCAweDAwMDMsIDB4NjIzYSwKKwkweDAwMTQsIDB4MDI3MSwgMHgwMDAwLCAweDFlZmUsIDB4MDAwYywgMHg2MjcxLCAweDAwMTMsIDB4MDIyNSwKKwkweDAwMDAsIDB4MWEzMCwgMHgwMDA1LCAweDAwMzEsIDB4MDAwMCwgMHgwMDIwLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4YjAwOSwgMHgwMDFiLCAweDgyMzEsIDB4MDAwMiwgMHhiMDJmLCAweDAwMDAsIDB4ZmZiMCwKKwkweDAwMDUsIDB4MDAzMSwgMHgwMDAwLCAweDAwMjAsIDB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAwYSwKKwkweDAwMWIsIDB4ODIzOCwgMHgwMDAzLCAweDAxZjksIDB4MDAxNSwgMHgwMGI4LCAweDAwMTAsIDB4MDAwNSwKKwkweDAwMDQsIDB4MDg2NywgMHgwMDAwLCAweDEzYjgsIDB4MDAxNSwgMHgwMDNhLCAweDAwMTAsIDB4MDQwNCwKKwkweDAwMDQsIDB4MDg2NywgMHgwMDEzLCAweDAyMjUsIDB4MDAwNSwgMHgwMDE1LCAweDAwMDAsIDB4MDAwMSwKKwkweDAwMTIsIDB4YmE0MiwgMHgwMDEzLCAweDEyNTAsIDB4MDAwMywgMHhiMjQ2LCAweDAwMDEsIDB4MmJkOCwKKwkweDAwMTAsIDB4MDAwMCwgMHgwMDEyLCAweGZmNGYsIDB4MDAxYiwgMHgxMWRjLCAweDAwMDIsIDB4YmE0MywKKwkweDAwMWIsIDB4MTIyYywgMHgwMDAwLCAweDFlZmUsIDB4MDAwYywgMHg2MjcxLCAweDAwMTMsIDB4MDIyNSwKKwkweDAwMDEsIDB4MjhkOCwgMHgwMDEwLCAweDAwMDAsIDB4MDAxMCwgMHhmZmI4LCAweDAwMTEsIDB4MjlkOCwKKwkweDAwMTAsIDB4MDAwMCwgMHgwMDAwLCAweGZmYjksIDB4MDAxNCwgMHgwMmUyLCAweDAwMDIsIDB4M2E0MiwKKwkweDAwMWIsIDB4MTIyNSwgMHgwMDAwLCAweDFjMzAsIDB4MDAxNSwgMHgwMGZmLCAweDAwMDAsIDB4MDAwMiwKKwkweDAwMDIsIDB4MWY0MywgMHgwMDFiLCAweDEyNjEsIDB4MDAwMSwgMHhmZjg4LCAweDAwMDAsIDB4MDAwMiwKKwkweDAwMDMsIDB4MDI2MywgMHgwMDAxLCAweGZmODgsIDB4MDAwMCwgMHgwMDA0LCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMTEsIDB4MDAwYiwgMHg4MjY2LCAweDAwMDAsIDB4YjBmZiwKKwkweDAwMTEsIDB4MTZhMCwgMHgwMDAwLCAweGZmMTYsIDB4MDAxYiwgMHgyMjZkLCAweDAwMDIsIDB4YjEwMCwKKwkweDAwMTMsIDB4MDI2ZSwgMHgwMDEwLCAweGIxZmYsIDB4MDAwMSwgMHgxN2EwLCAweDAwMTAsIDB4ZmYxNywKKwkweDAwMTMsIDB4MDIyYywgMHgwMDAwLCAweDE2ZmYsIDB4MDAwMSwgMHgxOGEwLCAweDAwMTAsIDB4ZmYwMCwKKwkweDAwMGIsIDB4MjI3OCwgMHgwMDAyLCAweDE3MDAsIDB4MDAwMywgMHgxMmNiLCAweDAwMTMsIDB4MDI3OSwKKwkweDAwMTAsIDB4MTdmZiwgMHgwMDExLCAweDE5YTAsIDB4MDAwMywgMHgyMmNiLCAweDAwMTEsIDB4MDBkMCwKKwkweDAwMDMsIDB4MTJjYiwgMHgwMDAwLCAweDFjMzAsIDB4MDAwMCwgMHgxYjMxLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4YjEzMSwgMHgwMDBiLCAweDgyODEsIDB4MDAxMywgMHhiMjgyLCAweDAwMDAsIDB4YjEyMCwKKwkweDAwMTAsIDB4YjIyMSwgMHgwMDAyLCAweDFmNDMsIDB4MDAwYiwgMHgxMjhlLCAweDAwMTAsIDB4YzAyMiwKKwkweDAwMDAsIDB4YzAyMywgMHgwMDAwLCAweGIzMjQsIDB4MDAwMCwgMHhiNDI1LCAweDAwMTAsIDB4YjNiNSwKKwkweDAwMDAsIDB4YjRiNiwgMHgwMDEzLCAweDAyOTIsIDB4MDAwMCwgMHhiMzIyLCAweDAwMDAsIDB4YjQyMywKKwkweDAwMDAsIDB4YjUyNCwgMHgwMDEwLCAweGI2MjUsIDB4MDAwMywgMHhiMjkyLCAweDAwMDUsIDB4MDAyYSwKKwkweDAwMDAsIDB4MDAwMSwgMHgwMDEyLCAweDE1MDAsIDB4MDAwMCwgMHhmZjE1LCAweDAwMDAsIDB4MTZmZiwKKwkweDAwMDEsIDB4YjU4MCwgMHgwMDAwLCAweGZmMTYsIDB4MDAxYiwgMHgyMjlkLCAweDAwMDIsIDB4MTcwMCwKKwkweDAwMTMsIDB4MDI5ZSwgMHgwMDEwLCAweDE3ZmYsIDB4MDAwMSwgMHhiNjgwLCAweDAwMTAsIDB4ZmYxNywKKwkweDAwMTIsIDB4MWUxMCwgMHgwMDEwLCAweGZmMWUsIDB4MDAxMywgMHg2MmNiLCAweDAwMDIsIDB4MWQwMCwKKwkweDAwMTAsIDB4ZmYxZCwgMHgwMDEwLCAweGMwMzAsIDB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4YjAwOSwgMHgwMDBiLCAweDgyYTksIDB4MDAxMCwgMHhiMGZlLCAweDAwMWIsIDB4NjJjYSwKKwkweDAwMDAsIDB4MWMzMCwgMHgwMDA1LCAweDAwMzEsIDB4MDAwMCwgMHgwMDAxLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4YjAwOSwgMHgwMDBiLCAweDgyYjEsIDB4MDAxMCwgMHhiMGZlLCAweDAwMWIsIDB4NjJiNywKKwkweDAwMDUsIDB4MDBjZSwgMHgwMDEwLCAweDAwMDUsIDB4MDAxMywgMHgwODI5LCAweDAwMTAsIDB4YjAxYywKKwkweDAwMDAsIDB4MWMzMCwgMHgwMDA1LCAweDAwMzEsIDB4MDAwMCwgMHgwMDE5LCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4YjAwOSwgMHgwMDBiLCAweDgyYmQsIDB4MDAwMSwgMHhiMGM4LCAweDAwMTAsIDB4MDBmZiwKKwkweDAwMDAsIDB4ZmYxZiwgMHgwMDEwLCAweGMwMzAsIDB4MDAxMSwgMHhiZTgwLCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMDksIDB4MDAwYiwgMHg4MmM2LCAweDAwMDAsIDB4YjAxZCwKKwkweDAwMTAsIDB4MWRmZiwgMHgwMDAzLCAweDAyYTUsIDB4MDAwMCwgMHhiMDFiLCAweDAwMTcsIDB4NDAwMCwKKwkweDAwMDIsIDB4M2E0MSwgMHgwMDEzLCAweDEyZDQsIDB4MDAwMywgMHhiMmNlLCAweDAwMDUsIDB4MDAyYSwKKwkweDAwMDAsIDB4MDAwNCwgMHgwMDA1LCAweDAwMTUsIDB4MDAxMCwgMHgwMDAwLCAweDAwMTMsIDB4MDIyNSwKKwkweDAwMDAsIDB4MWEzMCwgMHgwMDA1LCAweDAwMzEsIDB4MDAwMCwgMHgwMDAyLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4MWIyYSwgMHgwMDFiLCAweDgyZDksIDB4MDAxNSwgMHgwMGI4LCAweDAwMDAsIDB4MDAwNCwKKwkweDAwMDQsIDB4MDg2NywgMHgwMDAwLCAweDEzYjgsIDB4MDAxNSwgMHgwMDNhLCAweDAwMTAsIDB4MDQwNCwKKwkweDAwMDQsIDB4MDg2NywgMHgwMDEzLCAweDAwMzksIDB4MDAwMiwgMHgxZTAwLCAweDAwMTAsIDB4ZmYxZSwKKwkweDAwMTIsIDB4MWQxMCwgMHgwMDEwLCAweGZmMWQsIDB4MDAxMCwgMHhjMDMwLCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMDksIDB4MDAxYiwgMHg4MmVhLCAweDAwMTAsIDB4YjBmZSwKKwkweDAwMGIsIDB4NjMwZiwgMHgwMDAwLCAweDFjZmYsIDB4MDAwMSwgMHgxYWUwLCAweDAwMTMsIDB4MTJmOSwKKwkweDAwMDAsIDB4MWMzMCwgMHgwMDA1LCAweDAwMzEsIDB4MDAxMCwgMHgwMDAwLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4YjAwOSwgMHgwMDBiLCAweDgyZjUsIDB4MDAxMCwgMHhiMGZlLCAweDAwMWIsIDB4NjJmOSwKKwkweDAwMDAsIDB4MWFmZiwgMHgwMDAwLCAweGZmMWMsIDB4MDAwMCwgMHgxYzMwLCAweDAwMDUsIDB4MDAzMSwKKwkweDAwMDAsIDB4MDAxOSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDA5LCAweDAwMGIsIDB4ODJmZiwKKwkweDAwMDEsIDB4YjBjOCwgMHgwMDEwLCAweDAwMGYsIDB4MDAwMCwgMHhmZjFmLCAweDAwMDEsIDB4YmY4MCwKKwkweDAwMTAsIDB4ZmYxZCwgMHgwMDEwLCAweGMwMzAsIDB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4YjAwOSwgMHgwMDFiLCAweDgzMDksIDB4MDAxMCwgMHhiMGZlLCAweDAwMGIsIDB4NjMwZiwKKwkweDAwMDUsIDB4MDBjZSwgMHgwMDEwLCAweDAwMDYsIDB4MDAxMywgMHgwODI5LCAweDAwMDAsIDB4YjAxYiwKKwkweDAwMTcsIDB4NDAwMCwgMHgwMDEwLCAweDc5YjAsIDB4MDAwMCwgMHhkMGZmLCAweDAwMTIsIDB4ZmY0MCwKKwkweDAwMWIsIDB4MTAzOSwgMHgwMDE1LCAweDAwZDEsIDB4MDAxMCwgMHgwMTAxLCAweDAwMTMsIDB4OTMxNywKKwkweDAwMDUsIDB4MDA3OSwgMHgwMDAwLCAweDAwMDIsIDB4MDAwMywgMHg5MzFhLCAweDAwMTUsIDB4MDBkMSwKKwkweDAwMDAsIDB4MDEwMCwgMHgwMDEwLCAweDEzZmUsIDB4MDAwMywgMHg2MzRmLCAweDAwMTIsIDB4YjA0ZSwKKwkweDAwMWIsIDB4MTM2ZiwgMHgwMDEyLCAweDc4NGEsIDB4MDAxMywgMHgxMzc1LCAweDAwMDAsIDB4NzVmZiwKKwkweDAwMTEsIDB4ZmZjOCwgMHgwMDEwLCAweDE4MDAsIDB4MDAwYiwgMHgxMzc1LCAweDAwMDEsIDB4MGZlOCwKKwkweDAwMDAsIDB4MDAwMSwgMHgwMDFiLCAweDEzMzMsIDB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMTEsIDB4MTM4OCwgMHgwMDAwLCAweDAwMGUsIDB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4OGYwYSwgMHgwMDBiLCAweDgzMzEsIDB4MDAxMywgMHgwMzdiLCAweDAwMDEsIDB4MGZlOCwKKwkweDAwMDAsIDB4MDAwMiwgMHgwMDBiLCAweDEzM2UsIDB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMDUsIDB4MDAzMSwgMHgwMDAwLCAweDAwMWEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YzAwYSwKKwkweDAwMWIsIDB4ODMzYywgMHgwMDEzLCAweDAzN2IsIDB4MDAwMSwgMHgwZmU4LCAweDAwMTAsIDB4MDAwMCwKKwkweDAwMTMsIDB4MTM0NSwgMHgwMDA1LCAweDAwY2UsIDB4MDAwMCwgMHgwMDA3LCAweDAwMTAsIDB4MGZjZiwKKwkweDAwMTMsIDB4MDgyMywgMHgwMDAwLCAweDEzYjgsIDB4MDAwMiwgMHgxMDQ1LCAweDAwMDMsIDB4MTM0ZCwKKwkweDAwMTIsIDB4MTAzZiwgMHgwMDAyLCAweGZmMjcsIDB4MDAxNCwgMHgwMzk3LCAweDAwMDQsIDB4MDg2NywKKwkweDAwMDMsIDB4MDM0ZiwgMHgwMDEyLCAweDEwM2YsIDB4MDAxNCwgMHgwMzk3LCAweDAwMTUsIDB4MDAwZiwKKwkweDAwMTAsIDB4MDAwMCwgMHgwMDAyLCAweDM5NDQsIDB4MDAxMywgMHgxMzU4LCAweDAwMTUsIDB4MDAzOSwKKwkweDAwMDAsIDB4NTA0MCwgMHgwMDE1LCAweDAwYjgsIDB4MDAwMCwgMHgwMDA4LCAweDAwMDQsIDB4MDg2NywKKwkweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMSwgMHhiZDg4LCAweDAwMTAsIDB4MDAwYywKKwkweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhjMDBhLCAweDAwMWIsIDB4ODM1ZiwKKwkweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhjMDBhLCAweDAwMWIsIDB4ODM2MywKKwkweDAwMTAsIDB4YzAxNCwgMHgwMDAwLCAweGMwMTMsIDB4MDAwMCwgMHhjMDEwLCAweDAwMDIsIDB4M2E0NywKKwkweDAwMTMsIDB4MTM2ZSwgMHgwMDE1LCAweDAwM2EsIDB4MDAwMCwgMHg4MDAwLCAweDAwMTUsIDB4MDAzYSwKKwkweDAwMTAsIDB4NDA0MCwgMHgwMDE0LCAweDA4MmUsIDB4MDAxMywgMHgwMDM5LCAweDAwMTUsIDB4MDBiOCwKKwkweDAwMTAsIDB4MDAwMywgMHgwMDE1LCAweDAwM2EsIDB4MDAxMCwgMHgwMjAyLCAweDAwMDQsIDB4MDg2NywKKwkweDAwMDMsIDB4MDM2NywgMHgwMDE1LCAweDAwYjgsIDB4MDAwMCwgMHgwMDAyLCAweDAwMTUsIDB4MDAzYSwKKwkweDAwMTAsIDB4MDIwMiwgMHgwMDA0LCAweDA4NjcsIDB4MDAwMywgMHgwMzY3LCAweDAwMTUsIDB4MDAzMCwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDExLCAweDEzODgsIDB4MDAxMCwgMHgwMDAzLCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMDksIDB4MDAxYiwgMHg4MzgyLCAweDAwMTEsIDB4MTM4OCwKKwkweDAwMTAsIDB4MDAwMywgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YzAwYSwKKwkweDAwMWIsIDB4ODM4OCwgMHgwMDEwLCAweGIwZmUsIDB4MDAxMywgMHg2MzhkLCAweDAwMDAsIDB4YjAxMiwKKwkweDAwMDMsIDB4MDM4ZiwgMHgwMDEwLCAweGMwMTIsIDB4MDAxMCwgMHhjMDExLCAweDAwMTIsIDB4MTA0YiwKKwkweDAwMTMsIDB4MTM0NSwgMHgwMDAyLCAweDEwM2IsIDB4MDAxMCwgMHhmZjAzLCAweDAwMDUsIDB4MDAwMiwKKwkweDAwMTAsIDB4MDAwMCwgMHgwMDAwLCAweGMwMGQsIDB4MDAwMywgMHgwMzQ1LCAweDAwMDAsIDB4ZmZiMCwKKwkweDAwMTAsIDB4YzNiMSwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDEsIDB4Yjg4OCwKKwkweDAwMTAsIDB4MDAxMSwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAxMiwKKwkweDAwMWIsIDB4ODNhMCwgMHgwMDE3LCAweDQwMDAsIDB4MDAxMiwgMHgzYTQzLCAweDAwMDMsIDB4MTNiMSwKKwkweDAwMTUsIDB4MDAzYSwgMHgwMDAwLCAweDA4MDAsIDB4MDAxMCwgMHgwZGIwLCAweDAwMTMsIDB4NjNiMSwKKwkweDAwMDAsIDB4MGJmZiwgMHgwMDAxLCAweGIwZTAsIDB4MDAxMywgMHgxM2RhLCAweDAwMTAsIDB4MDlmZiwKKwkweDAwMDEsIDB4YjBlMCwgMHgwMDAzLCAweDEzYmUsIDB4MDAxMCwgMHgwNWZmLCAweDAwMDEsIDB4YjBlMCwKKwkweDAwMTMsIDB4MTNiNSwgMHgwMDAwLCAweGMwMGUsIDB4MDAwMCwgMHgwNWZlLCAweDAwMTMsIDB4NjNiYiwKKwkweDAwMDAsIDB4MDUwZCwgMHgwMDA1LCAweDAwMDIsIDB4MDAwMCwgMHgwMDA0LCAweDAwMTQsIDB4MDQzYywKKwkweDAwMDIsIDB4M2E0NywgMHgwMDFiLCAweDE0M2IsIDB4MDAwMywgMHgwM2Q1LCAweDAwMDAsIDB4MDlmZSwKKwkweDAwMTMsIDB4NjNkNywgMHgwMDAwLCAweDA5MGQsIDB4MDAwNSwgMHgwMDAyLCAweDAwMDAsIDB4MDAwMSwKKwkweDAwMTQsIDB4MDQ1NSwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MGQ4OCwKKwkweDAwMDAsIDB4MDAwNCwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YmEwOSwKKwkweDAwMGIsIDB4ODNjOCwgMHgwMDExLCAweDAzYzgsIDB4MDAxMCwgMHgwMDBmLCAweDAwMDAsIDB4ZmZiNiwKKwkweDAwMTEsIDB4YjZlOCwgMHgwMDAwLCAweDAwMDEsIDB4MDAwMywgMHgxNGVjLCAweDAwMTEsIDB4YjZlOCwKKwkweDAwMDAsIDB4MDAwMiwgMHgwMDEzLCAweDE1MGUsIDB4MDAxMSwgMHhiNmU4LCAweDAwMTAsIDB4MDAwMywKKwkweDAwMTMsIDB4MTVmZCwgMHgwMDE0LCAweDA4MmUsIDB4MDAxMywgMHgwNDNiLCAweDAwMTAsIDB4MGJmZSwKKwkweDAwMTMsIDB4NjQzYiwgMHgwMDEwLCAweDBiMGQsIDB4MDAwNSwgMHgwMDAyLCAweDAwMDAsIDB4MDAwMiwKKwkweDAwMTQsIDB4MDQ1NSwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MGQ4OCwKKwkweDAwMDAsIDB4MDAwNCwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YmEwOSwKKwkweDAwMWIsIDB4ODNlNCwgMHgwMDAwLCAweGI5MzAsIDB4MDAwNSwgMHgwMDMxLCAweDAwMTAsIDB4MDAyMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMDksIDB4MDAwYiwgMHg4M2VhLCAweDAwMDEsIDB4YjBhOCwKKwkweDAwMDAsIDB4MTk5YSwgMHgwMDAzLCAweDIzZjAsIDB4MDAwNSwgMHgwMGIwLCAweDAwMDAsIDB4MTk5OSwKKwkweDAwMTIsIDB4YjA1MCwgMHgwMDAwLCAweGZmYjAsIDB4MDAwMiwgMHhmZjUwLCAweDAwMDIsIDB4ZmY1MCwKKwkweDAwMDEsIDB4YjA4MCwgMHgwMDAwLCAweGZmYjAsIDB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMTEsIDB4MGQ4OCwgMHgwMDEwLCAweDAwMDYsIDB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4YjAwYSwgMHgwMDBiLCAweDgzZmQsIDB4MDAwMCwgMHhiOTMwLCAweDAwMDUsIDB4MDAzMSwKKwkweDAwMDAsIDB4MDAxOSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDA5LCAweDAwMGIsIDB4ODQwMywKKwkweDAwMDEsIDB4YjBjOCwgMHgwMDEwLCAweDAwZmYsIDB4MDAwMSwgMHhmZmU4LCAweDAwMTAsIDB4MDA0OCwKKwkweDAwMWIsIDB4MTQ2NCwgMHgwMDA1LCAweDAwMDIsIDB4MDAxMCwgMHgwMDA2LCAweDAwMTIsIDB4MGMxMCwKKwkweDAwMTAsIDB4ZmYwYywgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MGQ4OCwKKwkweDAwMTAsIDB4MDAwMywgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YjEwOSwKKwkweDAwMGIsIDB4ODQxNCwgMHgwMDAwLCAweGIxMGIsIDB4MDAxYiwgMHg2NDE4LCAweDAwMTAsIDB4YjEwYSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDEwLCAweGMwMGEsIDB4MDAxYiwgMHg4NDFhLCAweDAwMDIsIDB4MDMyYiwKKwkweDAwMTAsIDB4ZmYwMywgMHgwMDExLCAweDBkODgsIDB4MDAxMCwgMHgwMDExLCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDEwLCAweDAzMGEsIDB4MDAwYiwgMHg4NDIyLCAweDAwMDAsIDB4MTFmZSwKKwkweDAwMWIsIDB4NjQyNywgMHgwMDAwLCAweDBkMTIsIDB4MDAwMywgMHgwNDMwLCAweDAwMTUsIDB4MDAzMCwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDAxLCAweDExODgsIDB4MDAxMCwgMHgwMDAzLCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTAsIDB4MGRiMCwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDBhLCAweDAwMWIsIDB4ODQyZiwKKwkweDAwMDAsIDB4MGQxMSwgMHgwMDEzLCAweDA0M2IsIDB4MDAwMCwgMHgwNWZlLCAweDAwMTMsIDB4NjQzYiwKKwkweDAwMDUsIDB4MDAwMiwgMHgwMDAwLCAweDAwMDQsIDB4MDAwMCwgMHgwNTBkLCAweDAwMTQsIDB4MDQzYywKKwkweDAwMDIsIDB4M2E0NywgMHgwMDFiLCAweDE0M2IsIDB4MDAxNCwgMHgwODJlLCAweDAwMDMsIDB4MDA0OSwKKwkweDAwMDEsIDB4YzdjOCwgMHgwMDEwLCAweDAwMjgsIDB4MDAxYiwgMHgxNDU0LCAweDAwMTUsIDB4MDAzMCwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDExLCAweDBkODgsIDB4MDAxMCwgMHgwMDBhLCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMDksIDB4MDAxYiwgMHg4NDQ2LCAweDAwMDIsIDB4YjA0ZiwKKwkweDAwMDMsIDB4MTQ1NCwgMHgwMDAxLCAweDBmZTgsIDB4MDAxMCwgMHgwMDAwLCAweDAwMDMsIDB4MTQ1MiwKKwkweDAwMDEsIDB4MGZlOCwgMHgwMDAwLCAweDAwMDIsIDB4MDAwMywgMHgxNDUyLCAweDAwMTUsIDB4MDAzYSwKKwkweDAwMTAsIDB4ODA4MCwgMHgwMDEzLCAweDA0NTQsIDB4MDAxNSwgMHgwMDNhLCAweDAwMTAsIDB4NDA0MCwKKwkweDAwMTcsIDB4NDAwMCwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MGQ4OCwKKwkweDAwMTAsIDB4MDAxMSwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4MDMwOSwKKwkweDAwMGIsIDB4ODQ1YywgMHgwMDExLCAweDBkODgsIDB4MDAxMCwgMHgwMDA1LCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGI5MDksIDB4MDAxYiwgMHg4NDYyLCAweDAwMTcsIDB4NDAwMCwKKwkweDAwMDUsIDB4MDBiNiwgMHgwMDEwLCAweDA2MDAsIDB4MDAwNCwgMHgwNjJkLCAweDAwMDQsIDB4MDRkNiwKKwkweDAwMDAsIDB4YjA1YSwgMHgwMDAwLCAweGIxNWIsIDB4MDAwNSwgMHgwMDU0LCAweDAwMTAsIDB4MDgyOSwKKwkweDAwMTAsIDB4MGQ1OCwgMHgwMDE1LCAweDAwNTksIDB4MDAxMCwgMHhmZmZmLCAweDAwMDAsIDB4YjkzMCwKKwkweDAwMDUsIDB4MDAzMSwgMHgwMDEwLCAweDAwMWUsIDB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAwOSwKKwkweDAwMGIsIDB4ODQ3NCwgMHgwMDAwLCAweGIwNWMsIDB4MDAwNSwgMHgwMDMxLCAweDAwMDAsIDB4MDAxZiwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMDksIDB4MDAxYiwgMHg4NDdhLCAweDAwMDEsIDB4YjBjOCwKKwkweDAwMTAsIDB4MDAwZiwgMHgwMDBiLCAweDE0ODEsIDB4MDAxNSwgMHgwMGZmLCAweDAwMTAsIDB4MDAwNSwKKwkweDAwMTMsIDB4MDQ4OSwgMHgwMDAyLCAweGIwNDAsIDB4MDAwMywgMHgxNDg2LCAweDAwMTUsIDB4MDBmZiwKKwkweDAwMDAsIDB4MDAwNCwgMHgwMDEzLCAweDA0ODksIDB4MDAwMSwgMHhiMGM4LCAweDAwMTAsIDB4MDAwNiwKKwkweDAwMDIsIDB4ZmY2MCwgMHgwMDEwLCAweGZmYjIsIDB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMTEsIDB4MGQ4OCwgMHgwMDAwLCAweDAwMTksIDB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMTAsIDB4YjEwOSwgMHgwMDFiLCAweDg0OTEsIDB4MDAxMiwgMHhiMTcwLCAweDAwMTEsIDB4ZmZjOCwKKwkweDAwMTAsIDB4ZmYwMCwgMHgwMDExLCAweGIyZDAsIDB4MDAxMCwgMHhmZjYwLCAweDAwMDIsIDB4YjA0NSwKKwkweDAwMTMsIDB4MTQ5YywgMHgwMDE1LCAweDAwYjIsIDB4MDAwMCwgMHgwMDAyLCAweDAwMDMsIDB4MDRhNiwKKwkweDAwMDIsIDB4YjA0NiwgMHgwMDAzLCAweDE0YTEsIDB4MDAxNSwgMHgwMGIyLCAweDAwMDAsIDB4MDAwMSwKKwkweDAwMDMsIDB4MDRhNiwgMHgwMDE1LCAweDAwYjIsIDB4MDAxMCwgMHgwMDAwLCAweDAwMDAsIDB4YzBiMCwKKwkweDAwMTAsIDB4YzBiMSwgMHgwMDAzLCAweDA0YWMsIDB4MDAwMCwgMHhiOTMwLCAweDAwMDUsIDB4MDAzMSwKKwkweDAwMTAsIDB4MDAyYiwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDExLCAweDAwMWIsIDB4ODRhYiwKKwkweDAwMTAsIDB4YjE2YSwgMHgwMDEwLCAweGIwNmIsIDB4MDAwMCwgMHhiMjYxLCAweDAwMTUsIDB4MDA0NCwKKwkweDAwMTAsIDB4MDAxOCwgMHgwMDAwLCAweGI5MzAsIDB4MDAwNSwgMHgwMDMxLCAweDAwMDAsIDB4MDAyMywKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweDYyNDEsIDB4MDAxYiwgMHg4NGI2LCAweDAwMDMsIDB4OTRiNywKKwkweDAwMTUsIDB4MDBhMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAxMiwgMHhkMDQxLCAweDAwMWIsIDB4MTRiYSwKKwkweDAwMTUsIDB4MDBkMSwgMHgwMDEwLCAweDAyMDIsIDB4MDAwMywgMHg5NGJlLCAweDAwMDAsIDB4NzVmZiwKKwkweDAwMTEsIDB4ZmZjOCwgMHgwMDAwLCAweDE4MDQsIDB4MDAwMSwgMHhmZmQ4LCAweDAwMTAsIDB4MDAwOSwKKwkweDAwMTMsIDB4OTRjNCwgMHgwMDAwLCAweGZmNzUsIDB4MDAwMywgMHg5NGM2LCAweDAwMTUsIDB4MDBkMSwKKwkweDAwMDAsIDB4MDIwMCwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDEsIDB4YmQ4OCwKKwkweDAwMDAsIDB4MDAwOCwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMGIxLCAweDAwMTAsIDB4MDdkMCwKKwkweDAwMDUsIDB4MDBiMCwgMHgwMDEwLCAweDAwMDksIDB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAxMiwKKwkweDAwMGIsIDB4ODRkNCwgMHgwMDEzLCAweDA0M2IsIDB4MDAwMCwgMHhiYTMwLCAweDAwMDUsIDB4MDAzMSwKKwkweDAwMTAsIDB4MDAzNSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDA5LCAweDAwMGIsIDB4ODRkYiwKKwkweDAwMDIsIDB4YjA0MCwgMHgwMDAzLCAweDE0ZTksIDB4MDAxMCwgMHhiOWIwLCAweDAwMTAsIDB4YjdiMSwKKwkweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgwZDg4LCAweDAwMDAsIDB4MDAxMywKKwkweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDEyLCAweDAwMGIsIDB4ODRlNywKKwkweDAwMDMsIDB4MDRlYiwgMHgwMDEwLCAweGMwYjEsIDB4MDAwMCwgMHhjMGIwLCAweDAwMTcsIDB4NDAwMCwKKwkweDAwMDUsIDB4MDBiNiwgMHgwMDEwLCAweDA1MDAsIDB4MDAwNCwgMHgwNjJkLCAweDAwMDUsIDB4MDA1NCwKKwkweDAwMTAsIDB4MDg4OSwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MGQ4OCwKKwkweDAwMDAsIDB4MDAwMiwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAwOSwKKwkweDAwMWIsIDB4ODRmOCwgMHgwMDEwLCAweGIwNTgsIDB4MDAwMCwgMHgwZDU5LCAweDAwMDAsIDB4YjkzMCwKKwkweDAwMDUsIDB4MDAzMSwgMHgwMDAwLCAweDAwMjMsIDB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAxMSwKKwkweDAwMWIsIDB4ODUwMCwgMHgwMDEwLCAweGIxNWMsIDB4MDAxMCwgMHhiMDVkLCAweDAwMDUsIDB4MDAzMSwKKwkweDAwMTAsIDB4MDAyYiwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDExLCAweDAwMGIsIDB4ODUwNywKKwkweDAwMDAsIDB4YjE1ZSwgMHgwMDAwLCAweGIwNWYsIDB4MDAxMywgMHg5NTBhLCAweDAwMTUsIDB4MDBhMCwKKwkweDAwMTAsIDB4MDAwYywgMHgwMDEzLCAweDA2MTIsIDB4MDAwNSwgMHgwMGI2LCAweDAwMDAsIDB4MDcwMCwKKwkweDAwMDQsIDB4MDYyZCwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MGQ4OCwKKwkweDAwMTAsIDB4MDAwOSwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YjcwOSwKKwkweDAwMWIsIDB4ODUxOCwgMHgwMDEyLCAweGI3NDksIDB4MDAwMywgMHgxNTFlLCAweDAwMDUsIDB4MDA1NCwKKwkweDAwMTAsIDB4MDg4OSwgMHgwMDAzLCAweDA1MjAsIDB4MDAwNSwgMHgwMDU0LCAweDAwMTAsIDB4MDg5OCwKKwkweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgwZDg4LCAweDAwMDAsIDB4MDAwMiwKKwkweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDA5LCAweDAwMWIsIDB4ODUyNywKKwkweDAwMTAsIDB4YjA1OCwgMHgwMDAwLCAweDBkNTksIDB4MDAwMSwgMHhiOWE4LCAweDAwMTAsIDB4MDBmMCwKKwkweDAwMWIsIDB4MjU0ZSwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MGQ4OCwKKwkweDAwMTAsIDB4MDAwNSwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAwOSwKKwkweDAwMGIsIDB4ODUzNCwgMHgwMDAxLCAweGIwYzgsIDB4MDAwMCwgMHhmNzAwLCAweDAwMDAsIDB4ZmZiMCwKKwkweDAwMTEsIDB4YjBlOCwgMHgwMDAwLCAweGYxMDAsIDB4MDAwMywgMHgxNTk1LCAweDAwMTEsIDB4YjBlOCwKKwkweDAwMDAsIDB4ZjIwMCwgMHgwMDAzLCAweDE1OWEsIDB4MDAxMSwgMHhiMGU4LCAweDAwMTAsIDB4ZjMwMCwKKwkweDAwMTMsIDB4MTViZiwgMHgwMDExLCAweGIwZTgsIDB4MDAwMCwgMHhmNDAwLCAweDAwMTMsIDB4MTVjNCwKKwkweDAwMTEsIDB4YjBlOCwgMHgwMDEwLCAweGY1MDAsIDB4MDAwMywgMHgxNTk1LCAweDAwMTEsIDB4YjBlOCwKKwkweDAwMTAsIDB4ZjYwMCwgMHgwMDEzLCAweDE1ZDUsIDB4MDAwNSwgMHgwMGNlLCAweDAwMTAsIDB4MDAwOSwKKwkweDAwMDAsIDB4YjBjZiwgMHgwMDEzLCAweDA4MjMsIDB4MDAwMCwgMHhiOTMwLCAweDAwMDUsIDB4MDAzMSwKKwkweDAwMDAsIDB4MDAyNSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDM5LCAweDAwMWIsIDB4ODU1MywKKwkweDAwMTIsIDB4Yjc0OSwgMHgwMDEzLCAweDE1NTgsIDB4MDAwMiwgMHhiNTJjLCAweDAwMDAsIDB4ZmZiNSwKKwkweDAwMDAsIDB4YjE2MiwgMHgwMDAwLCAweGIwNjMsIDB4MDAwNSwgMHgwMDMxLCAweDAwMDAsIDB4MDAxZiwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIzMDksIDB4MDAwYiwgMHg4NTVlLCAweDAwMDEsIDB4YjNjOCwKKwkweDAwMTAsIDB4MDAwMywgMHgwMDAzLCAweDE1NjYsIDB4MDAxMCwgMHhmZmIyLCAweDAwMDEsIDB4ZmZlOCwKKwkweDAwMTAsIDB4MDAwMywgMHgwMDBiLCAweDE1NjgsIDB4MDAwMCwgMHhjMmI3LCAweDAwMDMsIDB4MDVmMSwKKwkweDAwMDEsIDB4YjJlOCwgMHgwMDAwLCAweDAwMDEsIDB4MDAwMywgMHgxNTZmLCAweDAwMDUsIDB4MDBjZSwKKwkweDAwMTAsIDB4MDAwYSwgMHgwMDEwLCAweGIyY2YsIDB4MDAxMywgMHgwODIzLCAweDAwMTAsIDB4YjQ2NSwKKwkweDAwMTAsIDB4YjY2NywgMHgwMDE1LCAweDAwYjcsIDB4MDAxMCwgMHgwMDE4LCAweDAwMDEsIDB4YjVjOCwKKwkweDAwMTAsIDB4MDMwMCwgMHgwMDEzLCAweDE1OTQsIDB4MDAxMiwgMHhiNTQ4LCAweDAwMDMsIDB4MTU3YiwKKwkweDAwMDAsIDB4YjZmZiwgMHgwMDExLCAweGI3ODAsIDB4MDAxMCwgMHhmZmI3LCAweDAwMDIsIDB4YjU0OSwKKwkweDAwMTMsIDB4MTU4MCwgMHgwMDEwLCAweGI0ZmYsIDB4MDAxMSwgMHhiNzgwLCAweDAwMTAsIDB4ZmZiNywKKwkweDAwMTUsIDB4MDA0NCwgMHgwMDEwLCAweDAwMTgsIDB4MDAwNSwgMHgwMDMxLCAweDAwMDAsIDB4MDAyYywKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweDY4NDEsIDB4MDAwYiwgMHg4NTg2LCAweDAwMTUsIDB4MDA0NCwKKwkweDAwMDAsIDB4MDAxOSwgMHgwMDA1LCAweDAwMzEsIDB4MDAwMCwgMHgwMDM0LCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4NTAyOSwgMHgwMDFiLCAweDg1OGQsIDB4MDAxNSwgMHgwMDQ0LCAweDAwMDAsIDB4MDAwOCwKKwkweDAwMTEsIDB4YjdjOCwgMHgwMDEwLCAweDAwMDMsIDB4MDAxMywgMHgxNTk0LCAweDAwMTAsIDB4ZmY1NSwKKwkweDAwMDMsIDB4MDVmMSwgMHgwMDA1LCAweDAwYjUsIDB4MDAwMCwgMHgwMDA4LCAweDAwMTUsIDB4MDBiNywKKwkweDAwMTAsIDB4MDAxOCwgMHgwMDAzLCAweDA1ZjEsIDB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMTEsIDB4MGQ4OCwgMHgwMDAwLCAweDAwMGIsIDB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4YjAxMSwgMHgwMDBiLCAweDg1YTEsIDB4MDAxMCwgMHhiMWZmLCAweDAwMDEsIDB4YjBkMCwKKwkweDAwMDMsIDB4MTVhYSwgMHgwMDA1LCAweDAwYjUsIDB4MDAxMCwgMHgwYjAyLCAweDAwMTAsIDB4YjA2MiwKKwkweDAwMTAsIDB4YjE2MywgMHgwMDEzLCAweDA1YWMsIDB4MDAwNSwgMHgwMGI1LCAweDAwMDAsIDB4MDMwMiwKKwkweDAwMTUsIDB4MDA2NSwgMHgwMDEwLCAweDAwMTIsIDB4MDAwNSwgMHgwMDY3LCAweDAwMDAsIDB4MDAwOCwKKwkweDAwMTUsIDB4MDA2YywgMHgwMDAwLCAweDcwMDAsIDB4MDAwNSwgMHgwMDZkLCAweDAwMTAsIDB4MDUwMCwKKwkweDAwMTUsIDB4MDA2ZiwgMHgwMDEwLCAweDAwMGEsIDB4MDAxNSwgMHgwMDQ0LCAweDAwMDAsIDB4MDAwMSwKKwkweDAwMDUsIDB4MDA1MiwgMHgwMDAwLCAweDI1MDAsIDB4MDAxNSwgMHgwMDQ0LCAweDAwMDAsIDB4MDAwOCwKKwkweDAwMTUsIDB4MDBiNywgMHgwMDAwLCAweDAwMzIsIDB4MDAwMywgMHgwNWYxLCAweDAwMDUsIDB4MDBiNSwKKwkweDAwMTAsIDB4MDAyOCwgMHgwMDE1LCAweDAwYjcsIDB4MDAxMCwgMHgwMDE4LCAweDAwMDMsIDB4MDVmMSwKKwkweDAwMDUsIDB4MDBiNSwgMHgwMDAwLCAweDAxMDAsIDB4MDAwNSwgMHgwMDY3LCAweDAwMDAsIDB4MDAwOCwKKwkweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgwZDg4LCAweDAwMTAsIDB4MDAxOCwKKwkweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDA5LCAweDAwMWIsIDB4ODVjZiwKKwkweDAwMDEsIDB4YjBjOCwgMHgwMDEwLCAweDAwZmYsIDB4MDAxNSwgMHgwMGI3LCAweDAwMDAsIDB4MDAyMCwKKwkweDAwMDMsIDB4MDVmMSwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MGQ4OCwKKwkweDAwMTAsIDB4MDAwNSwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjYwOSwKKwkweDAwMGIsIDB4ODVkYywgMHgwMDAxLCAweGI2YzgsIDB4MDAxMCwgMHhmZjAwLCAweDAwMDAsIDB4ZmZiMCwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMGEsIDB4MDAxYiwgMHg4NWUyLCAweDAwMDEsIDB4YjZjOCwKKwkweDAwMTAsIDB4MDBmZiwgMHgwMDEyLCAweGZmMTAsIDB4MDAxYiwgMHgxNWViLCAweDAwMDAsIDB4ZmZiNSwKKwkweDAwMTUsIDB4MDBiNywgMHgwMDEwLCAweDAwMTgsIDB4MDAwMywgMHgwNWYxLCAweDAwMTAsIDB4ZmY2MywKKwkweDAwMDUsIDB4MDBiNSwgMHgwMDAwLCAweDA4MDAsIDB4MDAxNSwgMHgwMGI3LCAweDAwMTAsIDB4MDAxOCwKKwkweDAwMDMsIDB4MDVmMSwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MGQ4OCwKKwkweDAwMTAsIDB4MDAwOSwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAwOSwKKwkweDAwMGIsIDB4ODVmOCwgMHgwMDEwLCAweGI1NjEsIDB4MDAxMywgMHg5NWZhLCAweDAwMTAsIDB4YjdhMCwKKwkweDAwMTMsIDB4MDYxMiwgMHgwMDA1LCAweDAwYjYsIDB4MDAxMCwgMHgwMzAwLCAweDAwMDQsIDB4MDYyZCwKKwkweDAwMDUsIDB4MDA1NCwgMHgwMDEwLCAweDA4MTksIDB4MDAxMCwgMHgwZDU4LCAweDAwMTUsIDB4MDAzMCwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDExLCAweDBkODgsIDB4MDAwMCwgMHgwMDAyLCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMDksIDB4MDAxYiwgMHg4NjBhLCAweDAwMDAsIDB4YjA1OSwKKwkweDAwMTMsIDB4OTYwYywgMHgwMDEwLCAweGMwYTAsIDB4MDAxMCwgMHg3MWZmLCAweDAwMDIsIDB4ZmYyOCwKKwkweDAwMTAsIDB4ZmY3MSwgMHgwMDEzLCAweDA2MTIsIDB4MDAxMiwgMHhkMDQxLCAweDAwMWIsIDB4MTYxMiwKKwkweDAwMTUsIDB4MDBkMSwgMHgwMDEwLCAweDAyMDIsIDB4MDAwMCwgMHg3NWZmLCAweDAwMTEsIDB4ZmZjOCwKKwkweDAwMDAsIDB4MTgwNCwgMHgwMDAxLCAweGZmZDgsIDB4MDAxMCwgMHgwMDA5LCAweDAwMTMsIDB4OTYxYiwKKwkweDAwMDAsIDB4ZmY3NSwgMHgwMDEzLCAweDk2MWQsIDB4MDAxNSwgMHgwMGQxLCAweDAwMDAsIDB4MDIwMCwKKwkweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMSwgMHhiZDg4LCAweDAwMDAsIDB4MDAwOCwKKwkweDAwMDAsIDB4ZmYzMSwgMHgwMDA1LCAweDAwYjAsIDB4MDAxMCwgMHgwMDA5LCAweDAwMTUsIDB4MDBiMSwKKwkweDAwMTAsIDB4MDdkMCwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDEyLCAweDAwMWIsIDB4ODYyYiwKKwkweDAwMTMsIDB4MDQzYiwgMHgwMDE1LCAweDAwNDQsIDB4MDAwMCwgMHgwMDA4LCAweDAwMDUsIDB4MDA5OCwKKwkweDAwMTAsIDB4MDA1NiwgMHgwMDE1LCAweDAwOTksIDB4MDAwMCwgMHg5NTc1LCAweDAwMDQsIDB4MDdlYSwKKwkweDAwMDAsIDB4YjA5NiwgMHgwMDEyLCAweGIyNzAsIDB4MDAxMCwgMHhmZjU2LCAweDAwMTQsIDB4MDgwYywKKwkweDAwMTAsIDB4YjA1MiwgMHgwMDEwLCAweGIxNTMsIDB4MDAwMCwgMHhiNmZmLCAweDAwMTEsIDB4YjJkMCwKKwkweDAwMTAsIDB4ZmY1MCwgMHgwMDEwLCAweGIzNTEsIDB4MDAxNywgMHg0MDAwLCAweDAwMTUsIDB4MDAzMCwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDAxLCAweDEyODgsIDB4MDAxMCwgMHgwMDExLCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweDEwMDksIDB4MDAwYiwgMHg4NjQ2LCAweDAwMTUsIDB4MDAwZiwKKwkweDAwMDAsIDB4MDAwMSwgMHgwMDEwLCAweGMwMTQsIDB4MDAwMCwgMHgxMjEzLCAweDAwMTUsIDB4MDAzMCwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDExLCAweDEzODgsIDB4MDAwMCwgMHgwMDA0LCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGJhMDksIDB4MDAwYiwgMHg4NjUyLCAweDAwMTUsIDB4MDAzMCwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDExLCAweDEzODgsIDB4MDAxMCwgMHgwMDA1LCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweDFhMDksIDB4MDAxYiwgMHg4NjVhLCAweDAwMTIsIDB4MTA0YiwKKwkweDAwMWIsIDB4MTY2MywgMHgwMDAwLCAweDFhMzAsIDB4MDAwNSwgMHgwMDMxLCAweDAwMDAsIDB4MDAwYiwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweDE2MjEsIDB4MDAwYiwgMHg4NjYyLCAweDAwMTAsIDB4MTVmZSwKKwkweDAwMGIsIDB4NjY4MiwgMHgwMDA0LCAweDA2YTksIDB4MDAwMiwgMHgzYTQyLCAweDAwMGIsIDB4MTZhOCwKKwkweDAwMDEsIDB4MTBjOCwgMHgwMDEwLCAweDAwMGYsIDB4MDAxYiwgMHgxNzBiLCAweDAwMTUsIDB4MDAzMCwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDExLCAweDEzODgsIDB4MDAwMCwgMHgwMDA4LCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMDksIDB4MDAxYiwgMHg4NjcyLCAweDAwMTEsIDB4YjBlOCwKKwkweDAwMTAsIDB4MDAwOSwgMHgwMDEzLCAweDE2NzksIDB4MDAxMSwgMHhiMGU4LCAweDAwMDAsIDB4MDAwMSwKKwkweDAwMGIsIDB4MTZhNywgMHgwMDExLCAweDEzODgsIDB4MDAxMCwgMHgwMDBhLCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMDksIDB4MDAxYiwgMHg4NjdlLCAweDAwMDIsIDB4YjA0ZiwKKwkweDAwMGIsIDB4MTY5ZSwgMHgwMDAzLCAweDA2YTcsIDB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMTEsIDB4MTM4OCwgMHgwMDEwLCAweDAwMDMsIDB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4YjAwOSwgMHgwMDBiLCAweDg2ODksIDB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YzAwYSwKKwkweDAwMGIsIDB4ODY4YywgMHgwMDEwLCAweGIwZmUsIDB4MDAwMywgMHg2NjkxLCAweDAwMDAsIDB4YjAxMiwKKwkweDAwMTMsIDB4MDY5MywgMHgwMDEwLCAweGMwMTIsIDB4MDAxMCwgMHhjMDExLCAweDAwMTUsIDB4MDAwZiwKKwkweDAwMTAsIDB4MDAwMCwgMHgwMDAyLCAweDM5NDQsIDB4MDAwMywgMHgxNjljLCAweDAwMTUsIDB4MDAzOSwKKwkweDAwMDAsIDB4NTA0MCwgMHgwMDE1LCAweDAwYjgsIDB4MDAwMCwgMHgwMDA4LCAweDAwMDQsIDB4MDg2NywKKwkweDAwMDAsIDB4YzAxMywgMHgwMDAzLCAweDA2YTgsIDB4MDAxMCwgMHgwMmZlLCAweDAwMTMsIDB4NjZhMywKKwkweDAwMTUsIDB4MDAzYSwgMHgwMDEwLCAweDIwMjAsIDB4MDAwMywgMHgwNmE4LCAweDAwMTUsIDB4MDAzYSwKKwkweDAwMDAsIDB4MjAwMCwgMHgwMDE1LCAweDAwM2EsIDB4MDAxMCwgMHgxMDEwLCAweDAwMTQsIDB4MDg1MywKKwkweDAwMTMsIDB4MDA1NSwgMHgwMDAzLCAweGI2YTksIDB4MDAwNSwgMHgwMDJhLCAweDAwMDAsIDB4MDAwNCwKKwkweDAwMDAsIDB4YmEzMCwgMHgwMDA1LCAweDAwMzEsIDB4MDAxMCwgMHgwMDFiLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4YjAwOSwgMHgwMDFiLCAweDg2YjEsIDB4MDAwMCwgMHhjMDJjLCAweDAwMDAsIDB4YjAyZCwKKwkweDAwMTIsIDB4MTA0YiwgMHgwMDAzLCAweDE2Y2MsIDB4MDAwMCwgMHgxYTMwLCAweDAwMDUsIDB4MDAzMSwKKwkweDAwMDAsIDB4MDAyMywgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMTI5LCAweDAwMWIsIDB4ODZiYiwKKwkweDAwMDAsIDB4YjEyMCwgMHgwMDEwLCAweGIyMjEsIDB4MDAwMCwgMHhiMzIyLCAweDAwMDAsIDB4YjQyMywKKwkweDAwMDAsIDB4YjUyNCwgMHgwMDAwLCAweGMwMjUsIDB4MDAxMCwgMHhiNTI2LCAweDAwMTAsIDB4YzAyNywKKwkweDAwMTAsIDB4YjUxNiwgMHgwMDEwLCAweGMwMTcsIDB4MDAwMCwgMHhiNTE4LCAweDAwMDAsIDB4YzAxOSwKKwkweDAwMTAsIDB4YzAyOCwgMHgwMDAwLCAweGMwMjksIDB4MDAxMCwgMHhjMDFlLCAweDAwMTMsIDB4MDcwMiwKKwkweDAwMTIsIDB4MTA0NCwgMHgwMDAzLCAweDE2ZmMsIDB4MDAwMiwgMHgxMDM0LCAweDAwMDAsIDB4ZmYxMCwKKwkweDAwMDAsIDB4MWEzMCwgMHgwMDA1LCAweDAwMzEsIDB4MDAwMCwgMHgwMDAyLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4MWIyOSwgMHgwMDBiLCAweDg2ZDUsIDB4MDAwMCwgMHgxYzMwLCAweDAwMDAsIDB4MWIzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIxMzEsIDB4MDAwYiwgMHg4NmRhLCAweDAwMDIsIDB4MWY0MywKKwkweDAwMWIsIDB4MTZlMSwgMHgwMDEwLCAweGIzYjUsIDB4MDAwMCwgMHhiNGI2LCAweDAwMDAsIDB4YzBiMywKKwkweDAwMTAsIDB4YzBiNCwgMHgwMDAwLCAweGIxMjAsIDB4MDAxMCwgMHhiMjIxLCAweDAwMDAsIDB4YjMyMiwKKwkweDAwMDAsIDB4YjQyMywgMHgwMDAwLCAweGI1MjQsIDB4MDAxMCwgMHhiNjI1LCAweDAwMTAsIDB4YjUxNiwKKwkweDAwMDAsIDB4YjYxNywgMHgwMDAwLCAweDE4MjYsIDB4MDAwMCwgMHgxOTI3LCAweDAwMDAsIDB4MWEzMCwKKwkweDAwMDUsIDB4MDAzMSwgMHgwMDEwLCAweDAwMGYsIDB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAxMSwKKwkweDAwMWIsIDB4ODZmMCwgMHgwMDAwLCAweGIwMjgsIDB4MDAwMCwgMHhiMTI5LCAweDAwMTIsIDB4MWUxMCwKKwkweDAwMTAsIDB4ZmYxZSwgMHgwMDEzLCAweDY3MDIsIDB4MDAwMiwgMHgxZDAwLCAweDAwMTAsIDB4ZmYxZCwKKwkweDAwMTQsIDB4MDJhNSwgMHgwMDAyLCAweDNhNDIsIDB4MDAwMywgMHgxNzAyLCAweDAwMDMsIDB4MDcwYSwKKwkweDAwMDAsIDB4MWEzMCwgMHgwMDA1LCAweDAwMzEsIDB4MDAwMCwgMHgwMDAyLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4MWI3OSwgMHgwMDFiLCAweDg3MDEsIDB4MDAwMywgMHhiNzAyLCAweDAwMDUsIDB4MDAyYSwKKwkweDAwMDAsIDB4MDAwMSwgMHgwMDA1LCAweDAwMTUsIDB4MDAwMCwgMHgwMDAxLCAweDAwMDAsIDB4MWVmZSwKKwkweDAwMDMsIDB4NjcwYSwgMHgwMDAzLCAweDAyNzEsIDB4MDAxNywgMHg0MDAwLCAweDAwMDAsIDB4YmEzMCwKKwkweDAwMDUsIDB4MDAzMSwgMHgwMDEwLCAweDAwMWIsIDB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YjA1MSwKKwkweDAwMWIsIDB4ODcxMCwgMHgwMDAwLCAweGIwYTMsIDB4MDAxMCwgMHhiNjk3LCAweDAwMTAsIDB4Yjk0NiwKKwkweDAwMTUsIDB4MDBhNSwgMHgwMDAwLCAweDAwMTAsIDB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMTEsIDB4MTM4OCwgMHgwMDAwLCAweDAwMDIsIDB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMDAsIDB4YjUwOSwgMHgwMDBiLCAweDg3MWQsIDB4MDAxNCwgMHgwODBjLCAweDAwMDQsIDB4MDdmYiwKKwkweDAwMTIsIDB4YjQ3MCwgMHgwMDEwLCAweGZmYjQsIDB4MDAxMCwgMHhiNDhlLCAweDAwMTAsIDB4YjA4YSwKKwkweDAwMTAsIDB4YjE4YiwgMHgwMDEyLCAweDEwNGQsIDB4MDAxMywgMHgxNzI4LCAweDAwMDMsIDB4MDc1NSwKKwkweDAwMTIsIDB4MTA0YiwgMHgwMDAzLCAweDE3M2IsIDB4MDAwNSwgMHgwMDhjLCAweDAwMTAsIDB4MDgyOSwKKwkweDAwMTAsIDB4YzA4ZCwgMHgwMDAxLCAweGIyZDgsIDB4MDAxMCwgMHgwNjAwLCAweDAwMTAsIDB4ZmY4OCwKKwkweDAwMTAsIDB4YjM4OSwgMHgwMDAwLCAweDEzOTAsIDB4MDAxMCwgMHhiNTkxLCAweDAwMDAsIDB4YzA4ZiwKKwkweDAwMTAsIDB4MWFiOSwgMHgwMDA0LCAweDA0ZDYsIDB4MDAwMywgMHg5NzM2LCAweDAwMTAsIDB4YjA5MiwKKwkweDAwMTAsIDB4YjE5MywgMHgwMDAzLCAweDk3MzksIDB4MDAwMywgMHgwNzUwLCAweDAwMDUsIDB4MDA4YywKKwkweDAwMDAsIDB4MDgwOSwgMHgwMDE1LCAweDAwOGQsIDB4MDAwMCwgMHgwMDA4LCAweDAwMDEsIDB4YjJkOCwKKwkweDAwMDAsIDB4MDEwMCwgMHgwMDEwLCAweGZmODgsIDB4MDAxMCwgMHhiMzg5LCAweDAwMDAsIDB4MTM5MCwKKwkweDAwMTAsIDB4YjU5MSwgMHgwMDAwLCAweGMwOGYsIDB4MDAwMCwgMHgxYTMwLCAweDAwMDUsIDB4MDAzMSwKKwkweDAwMTAsIDB4MDAwZiwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDExLCAweDAwMGIsIDB4ODc0YiwKKwkweDAwMTMsIDB4OTc0YywgMHgwMDAwLCAweGIxOTIsIDB4MDAwMCwgMHhiMDkzLCAweDAwMTMsIDB4OTc0ZiwKKwkweDAwMTAsIDB4MTlhMSwgMHgwMDAwLCAweDE4YTIsIDB4MDAxNSwgMHgwMGIxLCAweDAwMTAsIDB4MDA5NiwKKwkweDAwMDMsIDB4MDdjNiwgMHgwMDAwLCAweGI1OTAsIDB4MDAxMCwgMHgxMzkxLCAweDAwMDEsIDB4MTBjOCwKKwkweDAwMTAsIDB4MDAwZiwgMHgwMDAxLCAweGZmZTgsIDB4MDAxMCwgMHgwMDA1LCAweDAwMDMsIDB4MTc3YywKKwkweDAwMDEsIDB4YjJkOCwgMHgwMDAwLCAweDA3MDAsIDB4MDAxMCwgMHhmZjg4LCAweDAwMTAsIDB4YjM4OSwKKwkweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgxMzg4LCAweDAwMTAsIDB4MDAwOSwKKwkweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDA5LCAweDAwMWIsIDB4ODc2NywKKwkweDAwMDIsIDB4YjA0OSwgMHgwMDEzLCAweDE3NmYsIDB4MDAwNSwgMHgwMDhjLCAweDAwMTAsIDB4MDg4OSwKKwkweDAwMTUsIDB4MDBiMSwgMHgwMDEwLCAweDAwOTYsIDB4MDAxMywgMHgwNzczLCAweDAwMDUsIDB4MDA4YywKKwkweDAwMTAsIDB4MDg5OCwgMHgwMDE1LCAweDAwYjEsIDB4MDAwMCwgMHgwMDkyLCAweDAwMTAsIDB4YzA4ZCwKKwkweDAwMDAsIDB4YzA4ZiwgMHgwMDEzLCAweDk3NzUsIDB4MDAwMCwgMHhjMDkyLCAweDAwMTAsIDB4YzA5MywKKwkweDAwMDMsIDB4OTc3OCwgMHgwMDEwLCAweDE5YTEsIDB4MDAwMCwgMHgxOGEyLCAweDAwMDMsIDB4MDdjNiwKKwkweDAwMDEsIDB4YjJkOCwgMHgwMDAwLCAweDAxMDAsIDB4MDAxMCwgMHhmZjg4LCAweDAwMTAsIDB4YjM4OSwKKwkweDAwMDUsIDB4MDA4YywgMHgwMDEwLCAweDA4ODAsIDB4MDAxNSwgMHgwMDhkLCAweDAwMDAsIDB4MDAwOCwKKwkweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgxMzg4LCAweDAwMDAsIDB4MDAwZSwKKwkweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDA5LCAweDAwMGIsIDB4ODc4YiwKKwkweDAwMTAsIDB4YjA4ZiwgMHgwMDAwLCAweGI1OTAsIDB4MDAxMCwgMHgxMzkxLCAweDAwMDAsIDB4MWEzMCwKKwkweDAwMDUsIDB4MDAzMSwgMHgwMDAwLCAweDAwMGQsIDB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAyMSwKKwkweDAwMWIsIDB4ODc5NCwgMHgwMDAzLCAweDk3OTUsIDB4MDAxMCwgMHhiMzkyLCAweDAwMTAsIDB4YjI5MywKKwkweDAwMTMsIDB4OTc5OCwgMHgwMDAwLCAweGIxYTEsIDB4MDAxMCwgMHhiMGEyLCAweDAwMTUsIDB4MDAzMCwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDExLCAweDEzODgsIDB4MDAwMCwgMHgwMDBiLCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDEwLCAweGIyMTEsIDB4MDAxYiwgMHg4N2EyLCAweDAwMDAsIDB4YjNmZiwKKwkweDAwMDEsIDB4YjA4MCwgMHgwMDAwLCAweGZmYjMsIDB4MDAwYiwgMHgyN2E5LCAweDAwMDIsIDB4YjIwMCwKKwkweDAwMDMsIDB4MDdhYSwgMHgwMDEwLCAweGIyZmYsIDB4MDAxMSwgMHhiMTgwLCAweDAwMTAsIDB4ZmZiMiwKKwkweDAwMTEsIDB4MTM4OCwgMHgwMDAwLCAweDAwMGIsIDB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMTAsIDB4YjIxMiwgMHgwMDBiLCAweDg3YjEsIDB4MDAxNSwgMHgwMGIxLCAweDAwMDAsIDB4MDA5MiwKKwkweDAwMDIsIDB4MTA0YywgMHgwMDAzLCAweDE3YzQsIDB4MDAxMSwgMHhjMmU4LCAweDAwMTAsIDB4MDAwYywKKwkweDAwMWIsIDB4MTdiYywgMHgwMDE1LCAweDAwZmYsIDB4MDAwMCwgMHgwODAwLCAweDAwMTMsIDB4MDdjNCwKKwkweDAwMTEsIDB4YzJlOCwgMHgwMDAwLCAweDAwMjAsIDB4MDAxYiwgMHgxN2MyLCAweDAwMTUsIDB4MDBmZiwKKwkweDAwMTAsIDB4MTgwMCwgMHgwMDEzLCAweDA3YzQsIDB4MDAxNSwgMHgwMGZmLCAweDAwMDAsIDB4MTAwMCwKKwkweDAwMTEsIDB4YjFkMCwgMHgwMDEwLCAweGZmYjEsIDB4MDAxNSwgMHgwMDlhLCAweDAwMTAsIDB4MDAzNiwKKwkweDAwMDUsIDB4MDA5YiwgMHgwMDAwLCAweDk1ZDUsIDB4MDAxMiwgMHhkMDQxLCAweDAwMGIsIDB4MTdjYSwKKwkweDAwMTUsIDB4MDBkMSwgMHgwMDEwLCAweDAyMDIsIDB4MDAxMywgMHg5N2NlLCAweDAwMTIsIDB4MTA0ZSwKKwkweDAwMDMsIDB4MTdkMywgMHgwMDEyLCAweGIxMmYsIDB4MDAxMCwgMHhmZmIxLCAweDAwMDAsIDB4YjE3NSwKKwkweDAwMDMsIDB4OTdkNCwgMHgwMDE1LCAweDAwZDEsIDB4MDAwMCwgMHgwMjAwLCAweDAwMDEsIDB4MTljOCwKKwkweDAwMTAsIDB4ZmZmMCwgMHgwMDBiLCAweDE3ZGQsIDB4MDAxNSwgMHgwMGIxLCAweDAwMTAsIDB4MDdkMCwKKwkweDAwMTMsIDB4MDdkZiwgMHgwMDE1LCAweDAwYjEsIDB4MDAwMCwgMHgxYjU4LCAweDAwMDUsIDB4MDBiMCwKKwkweDAwMTAsIDB4MDAwOSwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDEsIDB4YmQ4OCwKKwkweDAwMDAsIDB4MDAwYiwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAxMiwKKwkweDAwMGIsIDB4ODdlOCwgMHgwMDAzLCAweDA2YTgsIDB4MDAwMCwgMHhiYTMwLCAweDAwMDUsIDB4MDAzMSwKKwkweDAwMTAsIDB4MDAyMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhiMDE5LCAweDAwMWIsIDB4ODdlZiwKKwkweDAwMDIsIDB4YjIwMCwgMHgwMDExLCAweGZmYzgsIDB4MDAxMCwgMHgwMGZmLCAweDAwMTAsIDB4ZmZiMiwKKwkweDAwMTAsIDB4YjJiNywgMHgwMDA1LCAweDAwMzEsIDB4MDAwMCwgMHgwMDIzLCAweDAwMTUsIDB4MDAzMywKKwkweDAwMTAsIDB4YjIwYSwgMHgwMDBiLCAweDg3ZjksIDB4MDAxNywgMHg0MDAwLCAweDAwMDAsIDB4YmEzMCwKKwkweDAwMDUsIDB4MDAzMSwgMHgwMDAwLCAweDAwMjMsIDB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YjQwOSwKKwkweDAwMGIsIDB4ODgwMCwgMHgwMDAyLCAweGI0MDAsIDB4MDAxMSwgMHhmZmM4LCAweDAwMTAsIDB4MDBmZiwKKwkweDAwMTAsIDB4ZmZiNCwgMHgwMDEwLCAweGI0YjcsIDB4MDAwNSwgMHgwMDMxLCAweDAwMDAsIDB4MDAyMywKKwkweDAwMTUsIDB4MDAzMywgMHgwMDEwLCAweGI0MGEsIDB4MDAwYiwgMHg4ODBhLCAweDAwMTcsIDB4NDAwMCwKKwkweDAwMDAsIDB4YmEzMCwgMHgwMDAxLCAweGM3YzgsIDB4MDAwMCwgMHgwMDIwLCAweDAwMGIsIDB4MTgxOCwKKwkweDAwMDUsIDB4MDAzMSwgMHgwMDEwLCAweDAwMjgsIDB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YjIwOSwKKwkweDAwMGIsIDB4ODgxNCwgMHgwMDExLCAweGIyYzgsIDB4MDAwMCwgMHhmZjgwLCAweDAwMTMsIDB4MTgxYiwKKwkweDAwMTAsIDB4YzRiMCwgMHgwMDEwLCAweGM1YjEsIDB4MDAwMywgMHgwODFkLCAweDAwMTAsIDB4YzZiMSwKKwkweDAwMDAsIDB4YzBiMCwgMHgwMDA1LCAweDAwMzEsIDB4MDAwMCwgMHgwMDA0LCAweDAwMTUsIDB4MDAzMywKKwkweDAwMTAsIDB4YjIxMSwgMHgwMDBiLCAweDg4MjEsIDB4MDAxNywgMHg0MDAwLCAweDAwMTUsIDB4MDBiOCwKKwkweDAwMTAsIDB4MDAwOSwgMHgwMDE1LCAweDAwM2EsIDB4MDAxMCwgMHgwNzA3LCAweDAwMDQsIDB4MDg2NywKKwkweDAwMTMsIDB4MDAyZCwgMHgwMDE1LCAweDAwYjgsIDB4MDAxMCwgMHgwMDA5LCAweDAwMTUsIDB4MDAzYSwKKwkweDAwMTAsIDB4MDcwNywgMHgwMDEzLCAweDA4NjcsIDB4MDAxNCwgMHgwMTE0LCAweDAwMTUsIDB4MDAzMCwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDExLCAweDBkODgsIDB4MDAwMCwgMHgwMDA0LCAweDAwMDAsIDB4ZmYzMSwKKwkweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGJhMDksIDB4MDAwYiwgMHg4ODM2LCAweDAwMDQsIDB4MDdlYSwKKwkweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgwZDg4LCAweDAwMDAsIDB4MDAxMCwKKwkweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhiMjBhLCAweDAwMGIsIDB4ODgzZiwKKwkweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgwZDg4LCAweDAwMTAsIDB4MDAxMSwKKwkweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHgwMzA5LCAweDAwMGIsIDB4ODg0NywKKwkweDAwMDIsIDB4MDMyNywgMHgwMDEwLCAweGZmYjIsIDB4MDAxMSwgMHgwZDg4LCAweDAwMTAsIDB4MDAxMSwKKwkweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhiMjBhLCAweDAwMWIsIDB4ODg0ZiwKKwkweDAwMTUsIDB4MDBiOCwgMHgwMDEwLCAweDAwMDYsIDB4MDAxMywgMHgwODY3LCAweDAwMDQsIDB4MDEyNiwKKwkweDAwMDQsIDB4MDdlYSwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MTM4OCwKKwkweDAwMDAsIDB4MDAxMCwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YjIwYSwKKwkweDAwMGIsIDB4ODg1YywgMHgwMDEyLCAweDEwMjcsIDB4MDAxMCwgMHhmZmIyLCAweDAwMTEsIDB4MTM4OCwKKwkweDAwMTAsIDB4MDAxMSwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YjIwYSwKKwkweDAwMWIsIDB4ODg2NCwgMHgwMDE1LCAweDAwYjgsIDB4MDAwMCwgMHgwMDA3LCAweDAwMDMsIDB4NDg2NywKKwkweDAwMDAsIDB4YjgzOCwgMHgwMDE3LCAweDQwMDAsIDB4YTJlNywgMHgyNGFkCit9OwordW5zaWduZWQgc2hvcnQgeHNlcWlweF9jb2RlX2xlbmd0aDAxID0gMHgxMGQ2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWw2MzEyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDYzMTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTI2OGViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWw2MzEyLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBRTG9naWMgSVNQNjMxMiBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAyLjYueAorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUUxvZ2ljIENvcnBvcmF0aW9uICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBSZWxlYXNlZCB1bmRlciBHUEwgdjIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgInFsYV9kZWYuaCIKKworc3RhdGljIGNoYXIgcWxhX2RyaXZlcl9uYW1lW10gPSAicWxhNjMxMiI7CisKK2V4dGVybiB1bnNpZ25lZCBjaGFyICBmdzIzMDBmbHhfdmVyc2lvbltdOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgIGZ3MjMwMGZseF92ZXJzaW9uX3N0cltdOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGZ3MjMwMGZseF9hZGRyMDE7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgZncyMzAwZmx4X2NvZGUwMVtdOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGZ3MjMwMGZseF9sZW5ndGgwMTsKKworc3RhdGljIHN0cnVjdCBxbGFfZndfaW5mbyBxbGFfZndfdGJsW10gPSB7CisJeworCQkuYWRkcmVzc2luZwk9IEZXX0lORk9fQUREUl9OT1JNQUwsCisJCS5md2NvZGUJCT0gJmZ3MjMwMGZseF9jb2RlMDFbMF0sCisJCS5md2xlbgkJPSAmZncyMzAwZmx4X2xlbmd0aDAxLAorCQkuZndzdGFydAk9ICZmdzIzMDBmbHhfYWRkcjAxLAorCX0sCisJeyBGV19JTkZPX0FERFJfTk9NT1JFLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBxbGFfYm9hcmRfaW5mbyBxbGFfYm9hcmRfdGJsW10gPSB7CisJeworCQkuZHJ2X25hbWUJPSBxbGFfZHJpdmVyX25hbWUsCisJCS5pc3BfbmFtZQk9ICJJU1A2MzEyIiwKKwkJLmZ3X2luZm8JPSBxbGFfZndfdGJsLAorCX0sCisJeworCQkuZHJ2X25hbWUJPSBxbGFfZHJpdmVyX25hbWUsCisJCS5pc3BfbmFtZQk9ICJJU1A2MzIyIiwKKwkJLmZ3X2luZm8JPSBxbGFfZndfdGJsLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcWxhNjMxMl9wY2lfdGJsW10gPSB7CisJeworCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfUUxPR0lDLAorCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDYzMTIsCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhCT0gKHVuc2lnbmVkIGxvbmcpJnFsYV9ib2FyZF90YmxbMF0sCisJfSwKKwl7CisJCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9RTE9HSUMsCisJCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQNjMyMiwKKwkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEJPSAodW5zaWduZWQgbG9uZykmcWxhX2JvYXJkX3RibFsxXSwKKwl9LAorCXswLCAwfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcWxhNjMxMl9wY2lfdGJsKTsKKworc3RhdGljIGludCBfX2RldmluaXQKK3FsYTYzMTJfcHJvYmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIHFsYTJ4MDBfcHJvYmVfb25lKHBkZXYsCisJICAgIChzdHJ1Y3QgcWxhX2JvYXJkX2luZm8gKilpZC0+ZHJpdmVyX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQKK3FsYTYzMTJfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlxbGEyeDAwX3JlbW92ZV9vbmUocGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBxbGE2MzEyX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInFsYTYzMTIiLAorCS5pZF90YWJsZQk9IHFsYTYzMTJfcGNpX3RibCwKKwkucHJvYmUJCT0gcWxhNjMxMl9wcm9iZV9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChxbGE2MzEyX3JlbW92ZV9vbmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK3FsYTYzMTJfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnFsYTYzMTJfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorcWxhNjMxMl9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZxbGE2MzEyX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChxbGE2MzEyX2luaXQpOworbW9kdWxlX2V4aXQocWxhNjMxMl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUUxvZ2ljIENvcnBvcmF0aW9uIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlFMb2dpYyBJU1A2M3h4IEZDLVNDU0kgSG9zdCBCdXMgQWRhcHRlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFFMQTJYWFhfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDYzMTJfZncuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsNjMxMl9mdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZDgyN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDYzMTJfZncuYwpAQCAtMCwwICsxLDcxNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgUUxPR0lDIExJTlVYIFNPRlRXQVJFCisgKgorICogUUxvZ2ljIElTUDJ4MDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi42LngKKyAqIENvcHlyaWdodCAoQykgMjAwMyBRTG9naWMgQ29ycG9yYXRpb24KKyAqICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUZpcm13YXJlIFZlcnNpb24gMy4wMy4wOCAoMTA6MDIgTm92IDEyLCAyMDA0KQorICovCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQordW5zaWduZWQgc2hvcnQgZncyMzAwZmx4X3ZlcnNpb24gPSAzKjEwMjQrMzsKKyNlbHNlCit1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfdmVyc2lvbiA9IDMqMTAyNCszOworI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQordW5zaWduZWQgY2hhciBmdzIzMDBmbHhfdmVyc2lvbl9zdHJbXSA9IHszLCAzLCA4fTsKKyNlbHNlCit1bnNpZ25lZCBjaGFyIGZpcm13YXJlX3ZlcnNpb25bXSA9IHszLCAzLCA4fTsKKyNlbmRpZgorCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKKyNkZWZpbmUgZncyMzAwZmx4X1ZFUlNJT05fU1RSSU5HICIzLjAzLjA4IgorI2Vsc2UKKyNkZWZpbmUgRldfVkVSU0lPTl9TVFJJTkcgIjMuMDMuMDgiCisjZW5kaWYKKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCit1bnNpZ25lZCBzaG9ydCBmdzIzMDBmbHhfYWRkcjAxID0gMHgwODAwIDsKKyNlbHNlCit1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfYWRkcjAxID0gMHgwODAwIDsKKyNlbmRpZgorCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3Vuc2lnbmVkIHNob3J0IGZ3MjMwMGZseF9jb2RlMDFbXSA9IHsgCisjZWxzZQordW5zaWduZWQgc2hvcnQgcmlzY19jb2RlMDFbXSA9IHsgCisjZW5kaWYKKwkweDA0NzAsIDB4MDAwMCwgMHgwMDAwLCAweGRkNzksIDB4MDAwMCwgMHgwMDAzLCAweDAwMDMsIDB4MDAwOCwKKwkweDAzMTcsIDB4MjA0MywgMHg0ZjUwLCAweDU5NTIsIDB4NDk0NywgMHg0ODU0LCAweDIwMzIsIDB4MzAzMCwKKwkweDMxMjAsIDB4NTE0YywgMHg0ZjQ3LCAweDQ5NDMsIDB4MjA0MywgMHg0ZjUyLCAweDUwNGYsIDB4NTI0MSwKKwkweDU0NDksIDB4NGY0ZSwgMHgyMDQ5LCAweDUzNTAsIDB4MzIzMywgMHgzMDMwLCAweDIwNDYsIDB4Njk3MiwKKwkweDZkNzcsIDB4NjE3MiwgMHg2NTIwLCAweDIwNTYsIDB4NjU3MiwgMHg3MzY5LCAweDZmNmUsIDB4MjAzMCwKKwkweDMzMmUsIDB4MzAzMywgMHgyZTMwLCAweDM4MjAsIDB4MjAyMCwgMHgyMDIwLCAweDI0MDAsIDB4MjBhOSwKKwkweDAwMGYsIDB4MjAwMSwgMHgwMDAwLCAweDQwMGYsIDB4MjA5MSwgMHgyMjAwLCAweDIwYTksIDB4MDAwZiwKKwkweDIwMDEsIDB4MDAwMCwgMHg0MDBmLCAweDIwOTEsIDB4MjQwMCwgMHgyMGE5LCAweDAwMGYsIDB4MjAwMSwKKwkweDAwMDAsIDB4NDAwZiwgMHgyMDkxLCAweDI2MDAsIDB4MjBhOSwgMHgwMDBmLCAweDIwMDEsIDB4MDAwMCwKKwkweDQwMGYsIDB4MjA5MSwgMHgyODAwLCAweDIwYTksIDB4MDAwZiwgMHgyMDAxLCAweDAwMDAsIDB4NDAwZiwKKwkweDIwOTEsIDB4MmEwMCwgMHgyMGE5LCAweDAwMGYsIDB4MjAwMSwgMHgwMDAwLCAweDQwMGYsIDB4MjA5MSwKKwkweDJjMDAsIDB4MjBhOSwgMHgwMDBmLCAweDIwMDEsIDB4MDAwMCwgMHg0MDBmLCAweDIwOTEsIDB4MmUwMCwKKwkweDIwYTksIDB4MDAwZiwgMHgyMDAxLCAweDAwMDAsIDB4NDAwZiwgMHgyMDkxLCAweDIwMDAsIDB4MjAwMSwKKwkweDAwMDAsIDB4MjBjMSwgMHgwMDA0LCAweDIwYzksIDB4MWJmZiwgMHgyMDU5LCAweDAwMDAsIDB4MmI3OCwKKwkweDc4ODMsIDB4MDAwNCwgMHgyMDg5LCAweDJjZmYsIDB4MjA1MSwgMHgxODAwLCAweDJhNzAsIDB4MjBlMSwKKwkweDAwMDEsIDB4MjBlOSwgMHgwMDAxLCAweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweDBlNzUsIDB4MjAyOSwKKwkweDI0ODAsIDB4MjAzMSwgMHhmZmZmLCAweDIwMzksIDB4MjQ1MCwgMHgyMDIxLCAweDAwNTAsIDB4MjBlOSwKKwkweDAwMDEsIDB4MjBhMSwgMHgwMDAwLCAweDIwYTksIDB4MDgwMCwgMHg5MDBlLCAweDQxMDQsIDB4MjBlOSwKKwkweDAwMDEsIDB4MjBhMSwgMHgxMDAwLCAweDkwMGUsIDB4MjAwMSwgMHgwY2MwLCAweDkwODQsIDB4MGZmZiwKKwkweDIwYTgsIDB4NDEwNCwgMHgyMDAxLCAweDAwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDAxMjAsIDB4MjFhOCwKKwkweDQxMDQsIDB4ODAwMSwgMHgxZGUwLCAweDc1NmEsIDB4NzY2ZSwgMHg3NzY2LCAweDc0NzIsIDB4NzQ3NiwKKwkweDAwZTYsIDB4MjA3MSwgMHgxYWEyLCAweDI0NzIsIDB4MDBlZSwgMHgyMGExLCAweDFjZDAsIDB4NzE2YywKKwkweDgxMGQsIDB4ODEwZCwgMHg4MTBkLCAweDgxMGQsIDB4OTE4YywgMHgwMDBmLCAweDIwMDEsIDB4MDAwMSwKKwkweDkxMTIsIDB4OTAwZSwgMHgyMWE4LCAweDQxMDQsIDB4ODIxMSwgMHgxZGUwLCAweDcxNmMsIDB4MzQwMCwKKwkweDgwMDEsIDB4OTEwMiwgMHgwMTIwLCAweDAyMTgsIDB4MjBhOCwgMHg5MDBlLCAweDQxMDQsIDB4MjAwOSwKKwkweDE4MDAsIDB4ODEwZCwgMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwgMHg4MTBkLCAweDkxOGMsIDB4MDAxZiwKKwkweDIwMDEsIDB4MDAwMSwgMHg5MTEyLCAweDIwZTksIDB4MDAwMSwgMHgyMGExLCAweDA4MDAsIDB4OTAwZSwKKwkweDIwYTksIDB4MDgwMCwgMHg0MTA0LCAweDgyMTEsIDB4MWRkOCwgMHgwODBjLCAweDBmNDksIDB4MDgwYywKKwkweDVmMzksIDB4MDgwYywgMHhhMDc5LCAweDA4MGMsIDB4MTEwMCwgMHgwODBjLCAweDEyZjgsIDB4MDgwYywKKwkweDFhZjUsIDB4MDgwYywgMHgwZDhjLCAweDA4MGMsIDB4MTA4NSwgMHgwODBjLCAweDMzZTksIDB4MDgwYywKKwkweDc1MTgsIDB4MDgwYywgMHg2ODdlLCAweDA4MGMsIDB4ODIxNSwgMHgwODBjLCAweDIzYmQsIDB4MDgwYywKKwkweDg1MjYsIDB4MDgwYywgMHg3Yjk5LCAweDA4MGMsIDB4MjFlOSwgMHgwODBjLCAweDIzMWQsIDB4MDgwYywKKwkweDIzYjIsIDB4MjA5MSwgMHgzMDA5LCAweDc4ODMsIDB4MDAwMCwgMHgxMDA0LCAweDA5MWQsIDB4Nzg4MCwKKwkweDkwODYsIDB4MDAwMiwgMHgxMTkwLCAweDc4ODMsIDB4NDAwMCwgMHg3ODM3LCAweDQwMDAsIDB4NzgzMywKKwkweDAwMTAsIDB4MGUwNCwgMHgwOTExLCAweDIwOTEsIDB4NTAwMCwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwKKwkweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDE5MGMsIDB4MTFlMCwgMHgyMDcxLCAweDE4MDAsIDB4NzAwMywKKwkweDAwMDAsIDB4MjA3MSwgMHgxODAwLCAweDcwMDAsIDB4OTA4ZSwgMHgwMDAzLCAweDExNjgsIDB4MDgwYywKKwkweDRiZTQsIDB4MDgwYywgMHgzNDEwLCAweDA4MGMsIDB4NzU4MCwgMHgwODBjLCAweDZkMmUsIDB4MDgwYywKKwkweDgyM2UsIDB4MDgwYywgMHgyYzJjLCAweDBjNjgsIDB4MDAwYiwgMHgwYzg4LCAweDA5NDAsIDB4MDk0MSwKKwkweDBhZDgsIDB4MDkzZSwgMHgwYjhmLCAweDBkOGIsIDB4MGQ4YiwgMHgwZDhiLCAweDA4MGMsIDB4MGRmYSwKKwkweDAwMDUsIDB4MDEyNiwgMHgwMGY2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDAwLCAweDkwODYsIDB4MDAwMSwKKwkweDE5MDQsIDB4MGFhYiwgMHgwODBjLCAweDBlYjcsIDB4MDgwYywgMHg3MjA3LCAweDAxNTAsIDB4MDgwYywKKwkweDcyMmEsIDB4MTVhMCwgMHgyMDc5LCAweDAxMDAsIDB4NzgyOCwgMHg5MDg1LCAweDE4MDAsIDB4NzgyYSwKKwkweDA0NjgsIDB4MDgwYywgMHg3MTI3LCAweDcwMDAsIDB4OTA4NiwgMHgwMDAxLCAweDE5MDQsIDB4MGFhYiwKKwkweDcwOTQsIDB4OTA4NiwgMHgwMDI4LCAweDE5MDQsIDB4MGFhYiwgMHgwODBjLCAweDgxZmUsIDB4MDgwYywKKwkweDgxZjAsIDB4MjAwMSwgMHgwMTYxLCAweDIwMDMsIDB4MDAwMSwgMHgyMDc5LCAweDAxMDAsIDB4NzgyNywKKwkweGZmZmYsIDB4N2EyOCwgMHg5Mjk1LCAweDVlMmYsIDB4N2EyYSwgMHgyMDExLCAweDcwNzYsIDB4MDgwYywKKwkweDgyZGEsIDB4MjAxMSwgMHg3MDY5LCAweDA4MGMsIDB4ODNhZSwgMHgyMDExLCAweDVkOTQsIDB4MDgwYywKKwkweDgyZGEsIDB4MjAxMSwgMHg4MDMwLCAweDkwMWUsIDB4NzM5MiwgMHgwNGQwLCAweDA4MGMsIDB4NTY0MSwKKwkweDIwNzksIDB4MDEwMCwgMHg3ODQ0LCAweDkwMDUsIDB4MTkwNCwgMHgwYWFiLCAweDIwMTEsIDB4NWQ5NCwKKwkweDA4MGMsIDB4ODJkYSwgMHgyMDExLCAweDcwNzYsIDB4MDgwYywgMHg4MmRhLCAweDIwMTEsIDB4NzA2OSwKKwkweDA4MGMsIDB4ODNhZSwgMHgyMDAxLCAweDAyNjUsIDB4MjAwMSwgMHgwMjA1LCAweDIwMDMsIDB4MDAwMCwKKwkweDc4NDAsIDB4OTA4NCwgMHhmZmZiLCAweDc4NDIsIDB4MjAwMSwgMHgxOTdlLCAweDIwMDQsIDB4OTAwNSwKKwkweDExNDAsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4MDgwYywgMHg1ZWUxLCAweDAwY2UsIDB4MDgwNCwKKwkweDBhYWIsIDB4NzgwZiwgMHgwMDZiLCAweDdhMjgsIDB4MDgwYywgMHg3MjBmLCAweDAxMTgsIDB4OTI5NSwKKwkweDVlMmYsIDB4MDAxMCwgMHg5Mjk1LCAweDQwMmYsIDB4N2EyYSwgMHgyMDExLCAweDgwMTAsIDB4NzNkNCwKKwkweDIwMDEsIDB4MTk3ZiwgMHgyMDAzLCAweDAwMDEsIDB4MDgwYywgMHgyYTg5LCAweDA4MGMsIDB4NGIxZiwKKwkweDcyNDQsIDB4YzI4NCwgMHg3MjQ2LCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGMxYWMsIDB4YzFjYywKKwkweDIxMDIsIDB4MDgwYywgMHg5OTA0LCAweDIwMTEsIDB4MDAwNCwgMHgwODBjLCAweGJlNDcsIDB4MDgwYywKKwkweDY2YzIsIDB4MDgwYywgMHg3MjA3LCAweDExMjAsIDB4MDgwYywgMHgyYWY2LCAweDAyZTAsIDB4MDQwMCwKKwkweDA4MGMsIDB4NWVlOCwgMHgwMTQwLCAweDcwOTMsIDB4MDAwMSwgMHg3MGNmLCAweDAwMDAsIDB4MDgwYywKKwkweDU4MGUsIDB4MDgwNCwgMHgwYWFiLCAweDA4MGMsIDB4NTVkYiwgMHhkMDk0LCAweDAxODgsIDB4MjAxMSwKKwkweDE4MGMsIDB4MjIwNCwgMHhjMGNkLCAweDIwMTIsIDB4MDgwYywgMHg1NWRmLCAweGQwZDQsIDB4MTExOCwKKwkweDA4MGMsIDB4MmFmNiwgMHgxMjcwLCAweDIwMTEsIDB4MTgwYywgMHgyMjA0LCAweGMwYmMsIDB4MDA4OCwKKwkweDA4MGMsIDB4NTVkZiwgMHhkMGQ0LCAweDFkYjgsIDB4MjAxMSwgMHgxODBjLCAweDIyMDQsIDB4YzBiZCwKKwkweDAwNDAsIDB4MjAxMSwgMHgxODBjLCAweDIyMDQsIDB4YzBiZCwgMHgyMDEyLCAweDA4MGMsIDB4NjdiYiwKKwkweDAwMDgsIDB4MjAxMiwgMHgwODBjLCAweDY3ODEsIDB4MDEyMCwgMHg3YTBjLCAweGMyYjQsIDB4N2EwZSwKKwkweDAwYTgsIDB4NzA3YiwgMHgwMDAwLCAweDA4MGMsIDB4NzIwNywgMHgxMTMwLCAweDcwYWMsIDB4OTAwNSwKKwkweDExNjgsIDB4MDgwYywgMHhjMjhhLCAweDAwNTAsIDB4MDgwYywgMHhjMjhhLCAweDcwZDgsIDB4ZDA5YywKKwkweDExMjgsIDB4NzBhYywgMHg5MDA1LCAweDAxMTAsIDB4MDgwYywgMHg1ZWJlLCAweDcwZTMsIDB4MDAwMCwKKwkweDcwZGYsIDB4MDAwMCwgMHg3MGEzLCAweDAwMDAsIDB4MDgwYywgMHgyYWZlLCAweDAyMjgsIDB4MjAxMSwKKwkweDAxMDEsIDB4MjIwNCwgMHhjMGM0LCAweDIwMTIsIDB4NzJkOCwgMHgwODBjLCAweDcyMDcsIDB4MTE3OCwKKwkweDkwMTYsIDB4MDAxNiwgMHgyMDA5LCAweDAwMDIsIDB4MjAxOSwgMHgxOTQ1LCAweDIxMWEsIDB4MDAxZSwKKwkweDcwNWIsIDB4ZmZmZiwgMHg3MDVmLCAweDAwZWYsIDB4NzA3ZiwgMHgwMDAwLCAweDAwMjAsIDB4MjAxOSwKKwkweDE5NDUsIDB4MjAxYiwgMHgwMDAwLCAweDIwNzksIDB4MTg1YiwgMHg3ODA0LCAweGQwYWMsIDB4MDEwOCwKKwkweGMyOTUsIDB4NzJkYSwgMHgwODBjLCAweDcyMDcsIDB4MDExOCwgMHg5Mjk2LCAweDAwMDQsIDB4MDU0OCwKKwkweDIwMTEsIDB4MDAwMSwgMHgwODBjLCAweGJlNDcsIDB4NzBhNywgMHgwMDAwLCAweDcwYWIsIDB4ZmZmZiwKKwkweDcwMDMsIDB4MDAwMiwgMHgyMDc5LCAweDAxMDAsIDB4NzgyNywgMHgwMDAzLCAweDc4MjgsIDB4OTA4NSwKKwkweDAwMDMsIDB4NzgyYSwgMHgwMGZlLCAweDA4MGMsIDB4MmY2YywgMHgyMDExLCAweDAwMDUsIDB4MDgwYywKKwkweDlhMGYsIDB4MDgwYywgMHg4YzEwLCAweDA4MGMsIDB4NzIwNywgMHgwMTQ4LCAweDAwYzYsIDB4MjA2MSwKKwkweDAxMDAsIDB4MDAxNiwgMHgyMDA5LCAweDAwMDIsIDB4NjFlMiwgMHgwMDFlLCAweDAwY2UsIDB4MDEyZSwKKwkweDA0MjAsIDB4NzBhNywgMHgwMDAwLCAweDcwYWIsIDB4ZmZmZiwgMHg3MDAzLCAweDAwMDIsIDB4MDBmNiwKKwkweDIwNzksIDB4MDEwMCwgMHg3ODI3LCAweDAwMDMsIDB4NzgyOCwgMHg5MDg1LCAweDAwMDMsIDB4NzgyYSwKKwkweDAwZmUsIDB4MjAxMSwgMHgwMDA1LCAweDA4MGMsIDB4OWEwZiwgMHgwODBjLCAweDhjMTAsIDB4MDgwYywKKwkweDcyMDcsIDB4MDE0OCwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHgwMDE2LCAweDIwMDksIDB4MDAwMiwKKwkweDYxZTIsIDB4MDAxZSwgMHgwMGNlLCAweDAwZmUsIDB4MDEyZSwgMHgwMDA1LCAweDAwYzYsIDB4MDBiNiwKKwkweDA4MGMsIDB4NzIwNywgMHgxMTE4LCAweDIwYTksIDB4MDgwMCwgMHgwMDEwLCAweDIwYTksIDB4MDc4MiwKKwkweDA4MGMsIDB4NzIwNywgMHgxMTEwLCAweDkwMGUsIDB4MDAxMCwgMHgyMDA5LCAweDAwN2UsIDB4ODZmZiwKKwkweDAxMzgsIDB4OTE4MCwgMHgxMDAwLCAweDIwMDQsIDB4OTA1ZCwgMHgwMTEwLCAweGI4MDAsIDB4ZDBiYywKKwkweDA5MGMsIDB4MzI4NiwgMHg4MTA4LCAweDFmMDQsIDB4MGFiZiwgMHg3MDdiLCAweDAwMDAsIDB4NzA3YywKKwkweDkwODQsIDB4MDBmZiwgMHg3MDdlLCAweDcwYWYsIDB4MDAwMCwgMHgwMGJlLCAweDAwY2UsIDB4MDAwNSwKKwkweDAwYjYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAwMCwgMHg5MDg2LCAweDAwMDIsIDB4MTkwNCwKKwkweDBiOGMsIDB4NzBhOCwgMHg5MDg2LCAweGZmZmYsIDB4MDEzMCwgMHgwODBjLCAweDJmNmMsIDB4MDgwYywKKwkweDhjMTAsIDB4MDgwNCwgMHgwYjhjLCAweDcwZDgsIDB4ZDBhYywgMHgxMTEwLCAweGQwOWMsIDB4MDU0MCwKKwkweGQwODQsIDB4MDUzMCwgMHgwMDA2LCAweDIwMDEsIDB4MDEwMywgMHgyMDAzLCAweDAwMmIsIDB4MDAwZSwKKwkweGQwOGMsIDB4MDFmMCwgMHg3MGRjLCAweDkwODYsIDB4ZmZmZiwgMHgwMWIwLCAweDA4MGMsIDB4MzBmNywKKwkweDA4MGMsIDB4OGMxMCwgMHg3MGQ4LCAweGQwOTQsIDB4MTkwNCwgMHgwYjhjLCAweDIwMTEsIDB4MDAwMSwKKwkweDA4MGMsIDB4YzUzOSwgMHgwMTEwLCAweDIwMTEsIDB4MDAwMywgMHg5MDFlLCAweDA4MGMsIDB4MzEzMSwKKwkweDA4MGMsIDB4OGMxMCwgMHgwODA0LCAweDBiOGMsIDB4NzBlMCwgMHg5MDA1LCAweDE5MDQsIDB4MGI4YywKKwkweDcwYTQsIDB4OTAwNSwgMHgxOTA0LCAweDBiOGMsIDB4NzBkOCwgMHhkMGE0LCAweDAxMTgsIDB4ZDBiNCwKKwkweDA5MDQsIDB4MGI4YywgMHgwODBjLCAweDY3ODEsIDB4MTkwNCwgMHgwYjhjLCAweDA4MGMsIDB4NjdkNCwKKwkweDE5MDQsIDB4MGI4YywgMHgwODBjLCAweDY3YmIsIDB4MDFjMCwgMHgwMTU2LCAweDAwYzYsIDB4MjBhOSwKKwkweDAwN2YsIDB4OTAwZSwgMHgwMDE2LCAweDA4MGMsIDB4NjQ5ZiwgMHgxMTE4LCAweGI4MDAsIDB4ZDBlYywKKwkweDExMzgsIDB4MDAxZSwgMHg4MTA4LCAweDFmMDQsIDB4MGIzMiwgMHgwMGNlLCAweDAxNWUsIDB4MDAyOCwKKwkweDAwMWUsIDB4MDBjZSwgMHgwMTVlLCAweDA4MDQsIDB4MGI4YywgMHgwMDA2LCAweDIwMDEsIDB4MDEwMywKKwkweDIwMDMsIDB4MDA2YiwgMHgwMDBlLCAweDIwMTEsIDB4MTk4YiwgMHgwODBjLCAweDBmYjksIDB4MjAxMSwKKwkweDE5YTUsIDB4MDgwYywgMHgwZmI5LCAweDcwMzAsIDB4YzA4YywgMHg3MDMyLCAweDcwMDMsIDB4MDAwMywKKwkweDcwYWIsIDB4ZmZmZiwgMHgwODBjLCAweDBlOTksIDB4OTAwNiwgMHgwODBjLCAweDI3MTcsIDB4MDAzNiwKKwkweDAwNDYsIDB4MjAxOSwgMHhmZmZmLCAweDIwMjEsIDB4MDAwNiwgMHgwODBjLCAweDRjYmMsIDB4MDA0ZSwKKwkweDAwM2UsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4MDgwYywgMHg3MjJhLCAweDAxNTAsIDB4MDgwYywKKwkweDcyMDcsIDB4NzgyOCwgMHgwMTE4LCAweDkwODQsIDB4ZTFmZiwgMHgwMDEwLCAweDkwODQsIDB4ZmZkZiwKKwkweDc4MmEsIDB4MDBmZSwgMHgyMDAxLCAweDE5YzAsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDUsIDB4MTEyMCwKKwkweDIwMTEsIDB4MDAwMCwgMHgwODBjLCAweDlhMGYsIDB4MjAxMSwgMHgwMDAwLCAweDA4MGMsIDB4OWExOSwKKwkweDA4MGMsIDB4OGMxMCwgMHgwODBjLCAweDhjZWQsIDB4MDEyZSwgMHgwMGJlLCAweDAwMDUsIDB4MDAxNiwKKwkweDAwNDYsIDB4MDBmNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDc5LCAweDAxMDAsIDB4NzkwNCwKKwkweDkxOGMsIDB4ZmZmZCwgMHg3OTA2LCAweDIwMDksIDB4MDBmNywgMHgwODBjLCAweDVlYTcsIDB4Nzk0MCwKKwkweDkxOGMsIDB4MDAxMCwgMHg3OTQyLCAweDc5MjQsIDB4ZDFiNCwgMHgwMTEwLCAweDc4MjcsIDB4MDA0MCwKKwkweGQxOWMsIDB4MDExMCwgMHg3ODI3LCAweDAwMDgsIDB4MDAwNiwgMHgwMDM2LCAweDAxNTYsIDB4MjAwMSwKKwkweDAxMDAsIDB4MjAwNCwgMHg5MDg2LCAweDAwMGEsIDB4MTkwNCwgMHgwYzIzLCAweDc5NTQsIDB4ZDFhYywKKwkweDE5MDQsIDB4MGMyMywgMHgyMDAxLCAweDE5N2YsIDB4MjAwNCwgMHg5MDA1LCAweDE1MTgsIDB4MDgwYywKKwkweDJiOTgsIDB4MTE0OCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyYWI4LCAweDIwMDEsIDB4MDAwMSwKKwkweDA4MGMsIDB4MmE5YiwgMHgwMGI4LCAweDA4MGMsIDB4MmJhMCwgMHgxMTM4LCAweDkwMDYsIDB4MDgwYywKKwkweDJhYjgsIDB4OTAwNiwgMHgwODBjLCAweDJhOWIsIDB4MDA2OCwgMHgwODBjLCAweDJiYTgsIDB4MWQ1MCwKKwkweDIwMDEsIDB4MTk3MCwgMHgyMDA0LCAweGQwZmMsIDB4MDEwOCwgMHgwMDIwLCAweDA4MGMsIDB4MjhiMiwKKwkweDA4MDQsIDB4MGQzMywgMHgwODBjLCAweDcyMTgsIDB4MDE0OCwgMHgwODBjLCAweDcyMmEsIDB4MTExOCwKKwkweDA4MGMsIDB4NzUxMywgMHgwMDUwLCAweDA4MGMsIDB4NzIwZiwgMHgwZGQwLCAweDA4MGMsIDB4NzUwZSwKKwkweDA4MGMsIDB4NzUwNCwgMHgwODBjLCAweDcxMjcsIDB4MDA1OCwgMHgwODBjLCAweDcyMDcsIDB4MDE0MCwKKwkweDIwMDksIDB4MDBmOCwgMHgwODBjLCAweDVlYTcsIDB4Nzg0MywgMHgwMDkwLCAweDc4NDMsIDB4MDAxMCwKKwkweDIwYTksIDB4MDljNCwgMHg3ODIwLCAweGQwOWMsIDB4MTEzOCwgMHgwODBjLCAweDcyMDcsIDB4MDEzOCwKKwkweDc4MjQsIDB4ZDBhYywgMHgxOTA0LCAweDBkMzgsIDB4MWYwNCwgMHgwYzAyLCAweDAwNzAsIDB4NzgyNCwKKwkweDA4MGMsIDB4NzIyMSwgMHgwMTE4LCAweGQwYWMsIDB4MTkwNCwgMHgwZDM4LCAweDkwODQsIDB4MTgwMCwKKwkweDBkOTgsIDB4NzAwMywgMHgwMDAxLCAweDA4MDQsIDB4MGQzOCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywKKwkweDI3MTcsIDB4MDgwNCwgMHgwZDVhLCAweDIwMDEsIDB4MTk3ZiwgMHgyMDA0LCAweDkwMDUsIDB4MTUxOCwKKwkweDA4MGMsIDB4MmI5OCwgMHgxMTQ4LCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDJhYjgsIDB4MjAwMSwKKwkweDAwMDEsIDB4MDgwYywgMHgyYTliLCAweDAwYjgsIDB4MDgwYywgMHgyYmEwLCAweDExMzgsIDB4OTAwNiwKKwkweDA4MGMsIDB4MmFiOCwgMHg5MDA2LCAweDA4MGMsIDB4MmE5YiwgMHgwMDY4LCAweDA4MGMsIDB4MmJhOCwKKwkweDFkNTAsIDB4MjAwMSwgMHgxOTcwLCAweDIwMDQsIDB4ZDBmYywgMHgwMTA4LCAweDAwMjAsIDB4MDgwYywKKwkweDI4YjIsIDB4MDgwNCwgMHgwZDMzLCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwYSwKKwkweDAxZjgsIDB4Nzg1MCwgMHg5MDg1LCAweDAwNDAsIDB4Nzg1MiwgMHg3OTM4LCAweDc4NTAsIDB4OTA4NCwKKwkweGZiY2YsIDB4Nzg1MiwgMHgwODBjLCAweDJiYjAsIDB4OTA4NSwgMHgyMDAwLCAweDc4NTIsIDB4NzkzYSwKKwkweDIwYTksIDB4MDA0NiwgMHgxZDA0LCAweDBjNjIsIDB4MDgwYywgMHg4MzhlLCAweDFmMDQsIDB4MGM2MiwKKwkweDc4NTAsIDB4OTA4NSwgMHgwNDAwLCAweDkwODQsIDB4ZGZiZiwgMHg3ODUyLCAweDc5M2EsIDB4MDA2MCwKKwkweDA4MGMsIDB4MmNjMiwgMHgwODBjLCAweDJjZjUsIDB4MjBhOSwgMHgwMDNhLCAweDFkMDQsIDB4MGM3NiwKKwkweDA4MGMsIDB4ODM4ZSwgMHgxZjA0LCAweDBjNzYsIDB4MDgwYywgMHg3MjE4LCAweDAxNDgsIDB4MDgwYywKKwkweDcyMmEsIDB4MTExOCwgMHgwODBjLCAweDc1MTMsIDB4MDA1MCwgMHgwODBjLCAweDcyMGYsIDB4MGRkMCwKKwkweDA4MGMsIDB4NzUwZSwgMHgwODBjLCAweDc1MDQsIDB4MDgwYywgMHg3MTI3LCAweDAwMjAsIDB4MjAwOSwKKwkweDAwZjgsIDB4MDgwYywgMHg1ZWE3LCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwYSwKKwkweDAxNjgsIDB4MjBhOSwgMHgwMDI4LCAweGEwMDEsIDB4MWYwNCwgMHgwYzliLCAweDc4NTAsIDB4OTA4NSwKKwkweDE0MDAsIDB4Nzg1MiwgMHgwODBjLCAweDcyMDcsIDB4MDE1OCwgMHgwMDMwLCAweDc4NTAsIDB4YzBlNSwKKwkweDc4NTIsIDB4MDgwYywgMHg3MjA3LCAweDAxMjAsIDB4Nzg0MywgMHgwMDkwLCAweDc4NDMsIDB4MDAxMCwKKwkweDIwMjEsIDB4ZTY3OCwgMHgyMDE5LCAweGVhNjAsIDB4MGQwYywgMHg4MzhlLCAweDc4MjAsIDB4ZDA5YywKKwkweDE1OTAsIDB4MDgwYywgMHg3MjA3LCAweDA5MDQsIDB4MGQxNywgMHg3ODI0LCAweGQwYWMsIDB4MTkwNCwKKwkweDBkMzgsIDB4MDgwYywgMHg3MjJhLCAweDE1MzgsIDB4MDA0NiwgMHgyMDIxLCAweDAzMjAsIDB4ODQyMSwKKwkweDFkZjAsIDB4MDA0ZSwgMHg3ODI3LCAweDE4MDAsIDB4MDgwYywgMHgyYmIwLCAweDc4MjQsIDB4OTA4NCwKKwkweDE4MDAsIDB4MTE2OCwgMHg5NDg0LCAweDBmZmYsIDB4MTE0MCwgMHgyMDAxLCAweDE4MTAsIDB4MjAwNCwKKwkweDkwODQsIDB4OTAwMCwgMHgwMTEwLCAweDA4MGMsIDB4MGQ2OCwgMHg4NDIxLCAweDExNjAsIDB4MWQwNCwKKwkweDBjZTMsIDB4MDgwYywgMHg4MzhlLCAweDA4MGMsIDB4NzUwZSwgMHgwODBjLCAweDc1MDQsIDB4NzAwMywKKwkweDAwMDEsIDB4MDgwNCwgMHgwZDM4LCAweDgzMTksIDB4MTkzOCwgMHgyMDAxLCAweDAxMDAsIDB4MjAwNCwKKwkweDkwODYsIDB4MDAwYSwgMHgxMTQwLCAweDIwMDEsIDB4MTgxMCwgMHgyMDA0LCAweDkwODQsIDB4OTAwMCwKKwkweDAxMTAsIDB4MDgwYywgMHgwZDY4LCAweDFkMDQsIDB4MGNmZiwgMHgwODBjLCAweDgzOGUsIDB4MjAwOSwKKwkweDE5NzMsIDB4MjEwNCwgMHg5MDA1LCAweDAxMTgsIDB4ODAwMSwgMHgyMDBhLCAweDExNzgsIDB4MjAwYiwKKwkweDAwMGEsIDB4NzgyNywgMHgwMDQ4LCAweDIwYTksIDB4MDAwMiwgMHgwODBjLCAweDJiOTEsIDB4NzkyNCwKKwkweDA4MGMsIDB4MmJiMCwgMHhkMTljLCAweDAxMTAsIDB4MDgwYywgMHgyYTg5LCAweDAwZTAsIDB4MDgwYywKKwkweDcyMTgsIDB4MTE0MCwgMHg5NGEyLCAweDAzZTgsIDB4MTEyOCwgMHgwODBjLCAweDcxZGYsIDB4NzAwMywKKwkweDAwMDEsIDB4MDBiMCwgMHg3ODI3LCAweDE4MDAsIDB4MDgwYywgMHgyYmIwLCAweDc4MjQsIDB4MDgwYywKKwkweDcyMjEsIDB4MDExMCwgMHhkMGFjLCAweDExNjAsIDB4OTA4NCwgMHgxODAwLCAweDA5MDQsIDB4MGNlYiwKKwkweDcwMDMsIDB4MDAwMSwgMHgwMDI4LCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI3MTcsIDB4MDBjMCwKKwkweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwYSwgMHgxMTE4LCAweDc4NTAsIDB4YzBlNCwKKwkweDc4NTIsIDB4MjAwOSwgMHgxODBjLCAweDIxMGMsIDB4ZDE5YywgMHgxMTIwLCAweDc5MDQsIDB4OTE4ZCwKKwkweDAwMDIsIDB4NzkwNiwgMHg3ODI3LCAweDAwNDgsIDB4NzgyOCwgMHg5MDg1LCAweDAwMjgsIDB4NzgyYSwKKwkweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwYSwgMHgwMTIwLCAweDc4NTAsIDB4OTA4NSwKKwkweDA0MDAsIDB4Nzg1MiwgMHgyMDAxLCAweDE5N2YsIDB4MjAwMywgMHgwMDAwLCAweDkwMDYsIDB4NzhmMiwKKwkweDAxNWUsIDB4MDAzZSwgMHgwMDBlLCAweDAxMmUsIDB4MDBmZSwgMHgwMDRlLCAweDAwMWUsIDB4MDAwNSwKKwkweDAwMDYsIDB4MDAxNiwgMHgwMDM2LCAweDAwNDYsIDB4MDBiNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwKKwkweDAwZjYsIDB4MDE1NiwgMHgwMDY5LCAweDBkMGMsIDB4ODM4ZSwgMHgwMTVlLCAweDAwZmUsIDB4MDBlZSwKKwkweDAwZGUsIDB4MDBjZSwgMHgwMGJlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwKKwkweDAwZTYsIDB4MjA3MSwgMHgxODljLCAweDcwMDQsIDB4OTA4NiwgMHgwMDAxLCAweDExMTAsIDB4MDgwYywKKwkweDM0MTAsIDB4MDBlZSwgMHgwMDA1LCAweDAwMDUsIDB4MmE3MCwgMHgyMDYxLCAweDE5ODMsIDB4MjA2MywKKwkweDAwMDMsIDB4NjAwNywgMHgwMDAzLCAweDYwMGIsIDB4MDAwOCwgMHg2MDBmLCAweDAzMTcsIDB4MjAwMSwKKwkweDE5NTQsIDB4OTAwZSwgMHgyMTAyLCAweDcxOTIsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4MiwKKwkweDAwMDIsIDB4MDIxOCwgMHg3MDViLCAweGZmZmYsIDB4MDAwOCwgMHg3MTVhLCAweDcwNjMsIDB4ZmZmZiwKKwkweDcxN2EsIDB4NzE3ZSwgMHgwODBjLCAweGMyOGEsIDB4NzBlNywgMHgwMGMwLCAweDIwNjEsIDB4MTk0NCwKKwkweDYwMDMsIDB4MDkwOSwgMHg2MTA2LCAweDYwMGIsIDB4ODgwMCwgMHg2MDBmLCAweDAyMDAsIDB4NjAxMywKKwkweDAwZmYsIDB4NjAxNywgMHgwMDBmLCAweDYxMWEsIDB4NjAxZiwgMHgwN2QwLCAweDIwNjEsIDB4MTk0YywKKwkweDYwMDMsIDB4ODAwMCwgMHg2MTA2LCAweDYxMGEsIDB4NjAwZiwgMHgwMjAwLCAweDYwMTMsIDB4MDBmZiwKKwkweDYxMTYsIDB4NjAxYiwgMHgwMDAxLCAweDYxMWUsIDB4MjA2MSwgMHgxOTYxLCAweDYwMDMsIDB4NTE0YywKKwkweDYwMDcsIDB4NGY0NywgMHg2MDBiLCAweDQ5NDMsIDB4NjAwZiwgMHgyMDIwLCAweDIwMDEsIDB4MTgyYiwKKwkweDIxMDIsIDB4MDAwNSwgMHg5MDE2LCAweDA4MGMsIDB4NjQ5ZiwgMHgxMTc4LCAweGI4MDQsIDB4OTBjNCwKKwkweDAwZmYsIDB4OThjNiwgMHgwMDA2LCAweDAxMjgsIDB4OTBjNCwgMHhmZjAwLCAweDk4YzYsIDB4MDYwMCwKKwkweDExMjAsIDB4OTE4NiwgMHgwMDgwLCAweDAxMDgsIDB4ODIxMCwgMHg4MTA4LCAweDkxODYsIDB4MDgwMCwKKwkweDFkNTAsIDB4MjIwOCwgMHgwMDA1LCAweDIwOTEsIDB4ODAwMCwgMHgyMDc5LCAweDAwMDAsIDB4MDAwZSwKKwkweDAwZjYsIDB4MDAxMCwgMHgyMDkxLCAweDgwMDAsIDB4MGUwNCwgMHgwZGZjLCAweDAwMDYsIDB4MDAxNiwKKwkweDIwMDEsIDB4ODAwMiwgMHgwMDA2LCAweDIwNzksIDB4MDAwMCwgMHgwMDBlLCAweDc4ODIsIDB4NzgzNiwKKwkweDAwMWUsIDB4Nzk4ZSwgMHgwMDBlLCAweDc4OGEsIDB4MDAwZSwgMHg3ODg2LCAweDM5MDAsIDB4Nzg5YSwKKwkweDc4MzMsIDB4MDAxMiwgMHgyMDkxLCAweDUwMDAsIDB4MDE1NiwgMHgwMGQ2LCAweDAwMzYsIDB4MDAyNiwKKwkweDIwNzksIDB4MDMwMCwgMHgyMDY5LCAweDFhN2MsIDB4N2EwOCwgMHgyMjZhLCAweDIwNjksIDB4MWE3ZCwKKwkweDdhMTgsIDB4MjI2YSwgMHg4ZDY4LCAweDdhMWMsIDB4MjI2YSwgMHg3ODJjLCAweDIwMTksIDB4MWE4YSwKKwkweDIwMWEsIDB4MjAxOSwgMHgxYThkLCAweDkwMTYsIDB4NzgwOCwgMHhkMDljLCAweDAxNjgsIDB4NzgyMCwKKwkweDIwMWEsIDB4ODIxMCwgMHg4MzE4LCAweDkzODYsIDB4MWFhMiwgMHgwMTA4LCAweDBjYTgsIDB4NzgwOCwKKwkweGQwOWMsIDB4MDExMCwgMHgyMDExLCAweGRlYWQsIDB4MjAxOSwgMHgxYThiLCAweDc4MmMsIDB4MjAxYSwKKwkweDgzMTgsIDB4MjIxYSwgMHg3ODAzLCAweDAwMDAsIDB4MjA2OSwgMHgxYTVjLCAweDkwMWUsIDB4MjBhOSwKKwkweDAwMjAsIDB4N2IyNiwgMHg3YTI4LCAweDIyNmEsIDB4OGQ2OCwgMHg4MzE4LCAweDFmMDQsIDB4MGU0OSwKKwkweDAwMmUsIDB4MDAzZSwgMHgwMGRlLCAweDAxNWUsIDB4MjA3OSwgMHgxODAwLCAweDc4MDMsIDB4MDAwNSwKKwkweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDAxODAsIDB4MjAwMSwKKwkweDE5ZjEsIDB4MjAwNCwgMHg5MDA1LCAweDAxMjgsIDB4MjAwMSwgMHgwMDhiLCAweDIwMDQsIDB4ZDBmYywKKwkweDBkZDgsIDB4MjAwMSwgMHgwMDhhLCAweDIwMDMsIDB4MDAwMiwgMHgyMDAzLCAweDEwMDEsIDB4MDgwYywKKwkweDU1ZWEsIDB4MTEwOCwgMHgwMDk5LCAweDBjZDgsIDB4MDAwNSwgMHg5MThjLCAweDAzZmYsIDB4MjAwMSwKKwkweDAwMDMsIDB4MjAwNCwgMHg5MDg0LCAweDA2MDAsIDB4MTExOCwgMHg5MThkLCAweDZjMDAsIDB4MDAxMCwKKwkweDkxOGQsIDB4NjQwMCwgMHgyMDAxLCAweDAxN2YsIDB4MjEwMiwgMHgwMDA1LCAweDAwMjYsIDB4MDEyNiwKKwkweDIwMTEsIDB4MDA4MCwgMHgwODBjLCAweDBmMTEsIDB4MjBhOSwgMHgwOTAwLCAweDA4MGMsIDB4MGYzMiwKKwkweDIwMTEsIDB4MDA0MCwgMHgwODBjLCAweDBmMTEsIDB4MjBhOSwgMHgwOTAwLCAweDA4MGMsIDB4MGYzMiwKKwkweDBjNzgsIDB4MDAyNiwgMHgwODBjLCAweDBmMWUsIDB4MTExOCwgMHgyMDExLCAweDAwNDAsIDB4MDA5OCwKKwkweDIwMTEsIDB4MDEwZSwgMHgyMjE0LCAweDkyOTQsIDB4MDAwNywgMHg5Mjk2LCAweDAwMDcsIDB4MDExOCwKKwkweDIwMTEsIDB4YTg4MCwgMHgwMDEwLCAweDIwMTEsIDB4Njg0MCwgMHhkMGU0LCAweDcwZWIsIDB4MDAwMCwKKwkweDExMjAsIDB4NzBlYiwgMHgwZmEwLCAweDA4MGMsIDB4MGYyMywgMHgwMDJlLCAweDAwMDUsIDB4MDAyNiwKKwkweDA4MGMsIDB4MGYxZSwgMHgwMTI4LCAweGQwYTQsIDB4MTEzOCwgMHgyMDExLCAweGNkZDUsIDB4MDAxMCwKKwkweDIwMTEsIDB4MDA4MCwgMHgwODBjLCAweDBmMjMsIDB4MDAyZSwgMHgwMDA1LCAweDAwMjYsIDB4NzBlYiwKKwkweDAwMDAsIDB4MDgwYywgMHgwZjFlLCAweDExNDgsIDB4MDgwYywgMHgyYmE4LCAweDExMTgsIDB4MjAxMSwKKwkweDg0ODQsIDB4MDA1OCwgMHgyMDExLCAweDgyODIsIDB4MDA0MCwgMHgwODBjLCAweDJiYTgsIDB4MTExOCwKKwkweDIwMTEsIDB4Y2RjNSwgMHgwMDEwLCAweDIwMTEsIDB4Y2FjMiwgMHgwODBjLCAweDBmMjMsIDB4MDAyZSwKKwkweDAwMDUsIDB4MDBlNiwgMHgwMDA2LCAweDIwNzEsIDB4MTgwMCwgMHhkMGI0LCAweDcwZTQsIDB4MTExMCwKKwkweGMwZTQsIDB4MDA0OCwgMHgwMDA2LCAweDNiMDAsIDB4OTA4NCwgMHhmZjNmLCAweDIwZDgsIDB4MDAwZSwKKwkweDcwZWIsIDB4MDAwMCwgMHhjMGU1LCAweDAwNzksIDB4MDAwZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTgwMCwgMHhkMGU0LCAweDcwZTQsIDB4MTExMCwgMHhjMGRjLCAweDAwMDgsIDB4YzBkZCwKKwkweDAwMTEsIDB4MDBlZSwgMHgwMDA1LCAweDcwZTYsIDB4NzAwMCwgMHg5MDg0LCAweDAwMDcsIDB4MDAwYiwKKwkweDAwMDUsIDB4MGVlMCwgMHgwZWI3LCAweDBlYjcsIDB4MGU5OSwgMHgwZWM2LCAweDBlYjcsIDB4MGViNywKKwkweDBlYzYsIDB4MDAxNiwgMHgzYjA4LCAweDNhMDAsIDB4OTEwNCwgMHg5MThkLCAweDAwYzAsIDB4MjFkOCwKKwkweDkwODQsIDB4ZmYzZiwgMHg5MjA1LCAweDIwZDAsIDB4MDAxZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgzOSwKKwkweDIwMDQsIDB4ZDBkYywgMHgwMDA1LCAweDllODYsIDB4MTgwMCwgMHgxOTBjLCAweDBkZmEsIDB4NzBlNCwKKwkweGQwZTQsIDB4MDEwOCwgMHhjMmU1LCAweDcyZTYsIDB4ZDBlNCwgMHgxMTE4LCAweDkyOTQsIDB4MDBjMCwKKwkweDBjMDEsIDB4MDAwNSwgMHgxZDA0LCAweDBmMzIsIDB4MjA5MSwgMHg2MDAwLCAweDFmMDQsIDB4MGYzMiwKKwkweDAwMDUsIDB4ODkwZSwgMHg4MTBlLCAweDgxMGYsIDB4OTE5NCwgMHgwMDNmLCAweDkxOGMsIDB4ZmZjMCwKKwkweDAwMDUsIDB4MDAwNiwgMHgyMjAwLCAweDkxNGQsIDB4ODk0ZiwgMHg4OTRkLCAweDg5NGQsIDB4MDAwZSwKKwkweDAwMDUsIDB4MDFkNiwgMHgwMTQ2LCAweDAwMzYsIDB4MDA5NiwgMHgyMDYxLCAweDE4OGIsIDB4NjAwYiwKKwkweDAwMDAsIDB4NjAwZiwgMHgwMDAwLCAweDYwMDMsIDB4MDAwMCwgMHg2MDA3LCAweDAwMDAsIDB4MjAwOSwKKwkweGZmYzAsIDB4MjEwNSwgMHgwMDA2LCAweDIwMDEsIDB4YWFhYSwgMHgyMDBmLCAweDIwMTksIDB4NTU1NSwKKwkweDkwMTYsIDB4MjA0OSwgMHgwYmZmLCAweGFiMDIsIDB4YTAwMSwgMHhhMDAxLCAweGE4MDAsIDB4OTMwNiwKKwkweDExMzgsIDB4MjEwNSwgMHg5MzA2LCAweDAxMjAsIDB4ODIxMCwgMHg5OWM4LCAweDA0MDAsIDB4MGM5OCwKKwkweDAwMGUsIDB4MjAwZiwgMHgyMDAxLCAweDE4OWIsIDB4OTI4YSwgMHgwMDBlLCAweDE2MzgsIDB4OTI4YSwKKwkweDAwMDYsIDB4MjAxMSwgMHgwMDA2LCAweDEyMTAsIDB4MjAxMSwgMHgwMDAwLCAweDIyMDIsIDB4OTAwNiwKKwkweDIwMDgsIDB4ODJmZiwgMHgwMWIwLCAweDgyMDAsIDB4NjAwYSwgMHg2MDBmLCAweGZmZmYsIDB4NjAwMywKKwkweDAwMDIsIDB4NjAwNywgMHgwMDAwLCAweDAwMjYsIDB4MjAxOSwgMHgwMDEwLCAweDkyODAsIDB4MDAwMSwKKwkweDIwZTgsIDB4MjFhMCwgMHgyMWE4LCAweDQxMDQsIDB4ODMxOSwgMHgxZGUwLCAweDgyMTEsIDB4MWRhMCwKKwkweDAwMmUsIDB4MDA5ZSwgMHgwMDNlLCAweDAxNGUsIDB4MDFkZSwgMHgwMDA1LCAweDIwMTEsIDB4MDAwZSwKKwkweDA4ZTgsIDB4MDAxNiwgMHgwMDI2LCAweDAwOTYsIDB4MzM0OCwgMHgwODBjLCAweDBmMzksIDB4MjEwMCwKKwkweDkzMDAsIDB4MjA5OCwgMHgyMmUwLCAweDAwOWUsIDB4MDAyZSwgMHgwMDFlLCAweDAwMzYsIDB4MzUxOCwKKwkweDIwYTksIDB4MDAwMSwgMHg0MDAyLCAweDgwMDcsIDB4NDAwNCwgMHg4MzE5LCAweDFkZDgsIDB4MDAzZSwKKwkweDAwMDUsIDB4MjBlOSwgMHgwMDAxLCAweDcxYjQsIDB4ODFmZiwgMHgxMWMwLCAweDkwMDYsIDB4MjAwOSwKKwkweDAyMDAsIDB4MjBhOSwgMHgwMDAyLCAweDkyOTgsIDB4MDAxOCwgMHgyM2EwLCAweDQwMDEsIDB4MjAwOSwKKwkweDA3MDAsIDB4MjBhOSwgMHgwMDAyLCAweDkyOTgsIDB4MDAwOCwgMHgyM2EwLCAweDQwMDEsIDB4NzA3OCwKKwkweDgwMDcsIDB4NzE3YywgMHg4MTBmLCAweDIwYTksIDB4MDAwMiwgMHg0MDAxLCAweDkyOTgsIDB4MDAwYywKKwkweDIzYTAsIDB4OTAwZSwgMHgwODBjLCAweDBkZGEsIDB4MjAwMSwgMHgwMDAwLCAweDgxMGYsIDB4MjBhOSwKKwkweDAwMDIsIDB4NDAwMSwgMHgwMDA1LCAweDg5ZmYsIDB4MDE0MCwgMHhhODA0LCAweGE4MDcsIDB4MDAwMCwKKwkweDAwMDYsIDB4MDgwYywgMHgxMDYzLCAweDAwOWUsIDB4MGNiMCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwKKwkweDE4MDAsIDB4MDgwYywgMHgxMGRjLCAweDA5MGMsIDB4MGRmYSwgMHgwMGVlLCAweDAwMDUsIDB4MDA4NiwKKwkweDAwZTYsIDB4MDAwNiwgMHgwMDI2LCAweDAwMzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDBjOSwKKwkweDIwNzEsIDB4MTgwMCwgMHg3M2JjLCAweDcwMmMsIDB4OTAxNiwgMHg5MDQ1LCAweDAxNTgsIDB4ODIxMCwKKwkweDk5MDYsIDB4MDkwYywgMHgwZGZhLCAweDIzMDAsIDB4OTIwMiwgMHgwMTIwLCAweDFhMGMsIDB4MGRmYSwKKwkweGEwMDAsIDB4MGM5OCwgMHgwMTJlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDBlLCAweDAwZWUsIDB4MDA4ZSwKKwkweDAwMDUsIDB4MDA4NiwgMHgwMGU2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwKKwkweDE5MGUsIDB4NzAxMCwgMHg5MDA1LCAweDAxNDAsIDB4NzAxOCwgMHg5MDQ1LCAweDAxMjgsIDB4OTkwNiwKKwkweDA5MGMsIDB4MGRmYSwgMHhhMDAwLCAweDBjYzgsIDB4MDEyZSwgMHgwMDBlLCAweDAwZWUsIDB4MDA4ZSwKKwkweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE4MDAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzBiYywKKwkweDgwMDEsIDB4MDI3MCwgMHg3MGJlLCAweDcwMmMsIDB4MjA0OCwgMHg5MDg1LCAweDAwMDEsIDB4YTgwMCwKKwkweDcwMmUsIDB4YTgwMywgMHgwMDAwLCAweGE4MDcsIDB4MDAwMCwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwKKwkweDkwNGUsIDB4MGNkOCwgMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MTgwMCwKKwkweDcwYmMsIDB4OTBjYSwgMHgwMDQwLCAweDAyNjgsIDB4ODAwMSwgMHg3MGJlLCAweDcwMmMsIDB4MjA0OCwKKwkweGE4MDAsIDB4NzAyZSwgMHhhODAzLCAweDAwMDAsIDB4YTgwNywgMHgwMDAwLCAweDAxMmUsIDB4MDBlZSwKKwkweDAwMDUsIDB4OTA0ZSwgMHgwY2Q4LCAweDAwZTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDAxNiwKKwkweDg5MGUsIDB4ODEwZSwgMHg4MTBmLCAweDkxODQsIDB4MDAzZiwgMHhhODYyLCAweDkxODQsIDB4ZmZjMCwKKwkweGE4NWUsIDB4MDAxZSwgMHgwMDIwLCAweDAwZTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzAyYywgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGJjLCAweDgwMDAsIDB4NzBiZSwKKwkweDA4MGMsIDB4ODFmMCwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDcxLCAweDE4MDAsIDB4OTAyNiwKKwkweDIwMDksIDB4MDAwMCwgMHgyMDQ5LCAweDA0MDAsIDB4MjkwMCwgMHg3MDJlLCAweDg5NDAsIDB4MjgwMCwKKwkweGE4MDIsIDB4YTk1ZSwgMHhhODYzLCAweDAwMDEsIDB4ODQyMCwgMHg5ODg2LCAweDA0NDAsIDB4MDEyMCwKKwkweDI4NDgsIDB4OTE4OCwgMHgwMDQwLCAweDBjOTAsIDB4MjA3MSwgMHgxODhiLCAweDcwMDAsIDB4OTAwNSwKKwkweDExYTAsIDB4MjAwMSwgMHgwNDkyLCAweGE4MDIsIDB4MjA0OCwgMHgyMDA5LCAweDI0ODAsIDB4ODk0MCwKKwkweDI4MDAsIDB4YTgwMiwgMHhhOTVlLCAweGE4NjMsIDB4MDAwMSwgMHg4NDIwLCAweDk4ODYsIDB4MDgwMCwKKwkweDAxMjAsIDB4Mjg0OCwgMHg5MTg4LCAweDAwNDAsIDB4MGM5MCwgMHgyMDcxLCAweDE4OGIsIDB4NzEwNCwKKwkweDcyMDAsIDB4ODJmZiwgMHgwMWQwLCAweDczMDgsIDB4ODMxOCwgMHg4MzFmLCAweDgzMWIsIDB4ODMxYiwKKwkweDczMTIsIDB4ODMxOSwgMHgyMDAxLCAweDA4MDAsIDB4YTgwMiwgMHgyMDQ4LCAweDg5MDAsIDB4YTgwMiwKKwkweDIwNDAsIDB4YTk1ZSwgMHhhYTYyLCAweDg0MjAsIDB4MjMwMCwgMHg5OTA2LCAweDAxMzAsIDB4Mjg0OCwKKwkweDkxODgsIDB4MDA0MCwgMHg5MjkxLCAweDAwMDAsIDB4MGM4OCwgMHhhODAzLCAweDAwMDAsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzRiYSwgMHg3NGJlLCAweDAwMDUsIDB4MDBlNiwgMHgwMDE2LCAweDk5ODQsIDB4ZmMwMCwKKwkweDAxZTgsIDB4OTA4YywgMHhmODAwLCAweDExNjgsIDB4OTk4MiwgMHgwNDAwLCAweDAyYjgsIDB4OTk4MiwKKwkweDA0NDAsIDB4MDI3OCwgMHg5OTgyLCAweDA0OTIsIDB4MDI4OCwgMHg5OTgyLCAweDA4MDAsIDB4MTI3MCwKKwkweDAwNDAsIDB4OTk4MiwgMHgwODAwLCAweDAyNTAsIDB4MjA3MSwgMHgxODhiLCAweDcwMTAsIDB4OTkwMiwKKwkweDEyMjgsIDB4OTA4NSwgMHgwMDAxLCAweDAwMWUsIDB4MDBlZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNkOCwKKwkweDAwZTYsIDB4MjA3MSwgMHgxOWYwLCAweDcwMDcsIDB4MDAwMCwgMHg5MDA2LCAweDcwMWUsIDB4NzAyMiwKKwkweDcwMDIsIDB4MjA3MSwgMHgwMDAwLCAweDcwMTAsIDB4OTA4NSwgMHg4MDQ0LCAweDcwMTIsIDB4MjA3MSwKKwkweDAwODAsIDB4OTAwNiwgMHgwMDA2LCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwYSwKKwkweDAwMGUsIDB4MTE1OCwgMHg3MDJiLCAweDAwNjAsIDB4MjBhOSwgMHgwMDQwLCAweDcwMjIsIDB4MWYwNCwKKwkweDExMWUsIDB4NzAyYiwgMHgwMDYwLCAweDcwMmIsIDB4MDAyMCwgMHgyMGE5LCAweDAwNDAsIDB4NzAyMiwKKwkweDFmMDQsIDB4MTEyNywgMHg3MDJiLCAweDAwMjAsIDB4MDBlZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDBlNiwgMHhhMDZmLCAweDAwMDAsIDB4MjA3MSwgMHgxOWYwLCAweDcwMWMsIDB4OTA4OCwKKwkweDE5ZmEsIDB4MjgwYSwgMHg4MDAwLCAweDkwODQsIDB4MDAzZiwgMHg3MDFlLCAweDcxMjAsIDB4OTEwNiwKKwkweDA5MGMsIDB4MGRmYSwgMHg3MDA0LCAweDkwMDUsIDB4MTEyOCwgMHgwMGY2LCAweDIwNzksIDB4MDA4MCwKKwkweDAwYTksIDB4MDBmZSwgMHgwMGVlLCAweDAxMmUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDAwZTYsIDB4MjA3MSwgMHgxOWYwLCAweDcwMDQsIDB4OTAwNSwgMHgxMTI4LCAweDAwZjYsIDB4MjA3OSwKKwkweDAwODAsIDB4MDAyMSwgMHgwMGZlLCAweDAwZWUsIDB4MDEyZSwgMHgwMDA1LCAweDcwMDQsIDB4OTA4NiwKKwkweDAwMDAsIDB4MTExMCwgMHg3MDA3LCAweDAwMDYsIDB4NzAwMCwgMHgwMDAyLCAweDExNzAsIDB4MTE2ZSwKKwkweDExNmUsIDB4MTE2ZSwgMHgxMmU3LCAweDEyZTcsIDB4MTJlNywgMHgxMmU3LCAweDA4MGMsIDB4MGRmYSwKKwkweDcwMWMsIDB4NzEyMCwgMHg5MTA2LCAweDExNDgsIDB4NzkyYywgMHg5MTg0LCAweDAwMDEsIDB4MTEyMCwKKwkweGQxZmMsIDB4MTExMCwgMHg3MDA3LCAweDAwMDAsIDB4MDAwNSwgMHgwMDk2LCAweDkxODAsIDB4MTlmYSwKKwkweDIwMDQsIDB4NzAwYSwgMHgyMDQ4LCAweDgxMDgsIDB4OTE4YywgMHgwMDNmLCAweDcxMjIsIDB4NzgyYiwKKwkweDAwMjYsIDB4YTg4YywgMHg3ODAyLCAweGE4OTAsIDB4NzgwNiwgMHhhODk0LCAweDc4MGEsIDB4YTg5OCwKKwkweDc4MGUsIDB4YTg3OCwgMHg3MDBlLCAweGE4NzAsIDB4NzAxNiwgMHhhODc0LCAweDcwMWEsIDB4YTg2OCwKKwkweDAwOWUsIDB4ZDA4NCwgMHgwMTIwLCAweDcwMDcsIDB4MDAwMSwgMHgwMDI5LCAweDAwMDUsIDB4NzAwNywKKwkweDAwMDIsIDB4MDBiMSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHg3MTBjLCAweDIwMTEsIDB4MDA0MCwKKwkweDkxODIsIDB4MDA0MCwgMHgxMjEwLCAweDIxMTAsIDB4OTAwNiwgMHg3MDBlLCAweDcyMTIsIDB4ODIwMywKKwkweDc4MTIsIDB4NzgyYiwgMHgwMDIwLCAweDc4MmIsIDB4MDA0MSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwKKwkweDAwMTYsIDB4MDAyNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHg3MDE0LCAweDIwZTAsIDB4NzAxOCwKKwkweDIwOTgsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDA4OCwgMHg3ODJiLCAweDAwMjYsIDB4NzEwYywKKwkweDIwMTEsIDB4MDA0MCwgMHg5MTgyLCAweDAwNDAsIDB4MTIxMCwgMHgyMTEwLCAweDkwMDYsIDB4NzAwZSwKKwkweDIyYTgsIDB4NDAwNiwgMHg4MjAzLCAweDc4MTIsIDB4NzgyYiwgMHgwMDIwLCAweDMzMDAsIDB4NzAxYSwKKwkweDc4MmIsIDB4MDAwMSwgMHgwMTVlLCAweDAxNGUsIDB4MDEzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwKKwkweDIwMDksIDB4MTlmMCwgMHgyMTA0LCAweGMwOTUsIDB4MjAwYSwgMHgwODBjLCAweDExNGQsIDB4MDAwNSwKKwkweDAwMTYsIDB4MDBlNiwgMHgyMDcxLCAweDE5ZjAsIDB4MDBmNiwgMHgyMDc5LCAweDAwODAsIDB4NzkyYywKKwkweGQxYmMsIDB4MTkwYywgMHgwZGYzLCAweDc4MmIsIDB4MDAwMiwgMHhkMWZjLCAweDAxMjAsIDB4OTE4YywKKwkweDA3MDAsIDB4NzAwNCwgMHgwMDIzLCAweDAwZmUsIDB4MDBlZSwgMHgwMDFlLCAweDAwMDUsIDB4MTE1ZSwKKwkweDEyMDYsIDB4MTIzYSwgMHgwZGZhLCAweDBkZmEsIDB4MTJmMywgMHgwZGZhLCAweDkxOGMsIDB4MDcwMCwKKwkweDE1NTAsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4NzAxNCwgMHgyMGU4LCAweDcwMTgsIDB4MjBhMCwKKwkweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAwODgsIDB4NzgyYiwgMHgwMDQwLCAweDcwMTAsIDB4MjBhOCwKKwkweDQwMDUsIDB4MzQwMCwgMHg3MDFhLCAweDAxNWUsIDB4MDE0ZSwgMHgwMTNlLCAweDcwMGMsIDB4OTAwNSwKKwkweDA1NzgsIDB4NzgwMCwgMHg3ODAyLCAweDc4MDQsIDB4NzgwNiwgMHgwODBjLCAweDExYTMsIDB4MDAwNSwKKwkweDcwMDgsIDB4MDA5NiwgMHgyMDQ4LCAweGE4NmYsIDB4MDEwMCwgMHgwMDllLCAweDcwMDcsIDB4MDAwMCwKKwkweDA4MGMsIDB4MTE1ZSwgMHgwMDA1LCAweDcwMDgsIDB4MDA5NiwgMHgyMDQ4LCAweGE4NmYsIDB4MDIwMCwKKwkweDAwOWUsIDB4MGNhMCwgMHg5MThjLCAweDA3MDAsIDB4MTE1MCwgMHg3MDBjLCAweDkwMDUsIDB4MDE4MCwKKwkweDc4MDAsIDB4NzgwMiwgMHg3ODA0LCAweDc4MDYsIDB4MDgwYywgMHgxMWI4LCAweDAwMDUsIDB4NzAwOCwKKwkweDAwOTYsIDB4MjA0OCwgMHhhODZmLCAweDAyMDAsIDB4MDA5ZSwgMHg3MDA3LCAweDAwMDAsIDB4MDA4MCwKKwkweDAwOTYsIDB4NzAwOCwgMHgyMDQ4LCAweDc4MDAsIDB4YTg4ZSwgMHg3ODA0LCAweGE4OTIsIDB4NzgwOCwKKwkweGE4OTYsIDB4NzgwYywgMHhhODlhLCAweGE4NmYsIDB4MDEwMCwgMHgwMDllLCAweDcwMDcsIDB4MDAwMCwKKwkweDAwOTYsIDB4MDBkNiwgMHg3MDA4LCAweDIwNDgsIDB4MjAwMSwgMHgxOGI3LCAweDIwMDQsIDB4OTkwNiwKKwkweDExMjgsIDB4YTg5YywgMHgwODBmLCAweDAwZGUsIDB4MDA5ZSwgMHgwMGEwLCAweDAwZGUsIDB4MDA5ZSwKKwkweDAwOTYsIDB4MDBkNiwgMHg3MDA4LCAweDIwNDgsIDB4MDA4MSwgMHgwMTUwLCAweGE4OWMsIDB4MDA4NiwKKwkweDI5NDAsIDB4MDgwZiwgMHgwMDhlLCAweDAwZGUsIDB4MDA5ZSwgMHgwODBjLCAweDExNGQsIDB4MDAwNSwKKwkweDAwZGUsIDB4MDA5ZSwgMHgwODBjLCAweDExNGQsIDB4MDAwNSwgMHhhOGE4LCAweGQwOGMsIDB4MDAwNSwKKwkweDAwOTYsIDB4YTBhMCwgMHg5MDRkLCAweDA5MGMsIDB4MGRmYSwgMHhhMDZjLCAweDkwOGUsIDB4MDEwMCwKKwkweDAxMzAsIDB4YTg3YiwgMHgwMDMwLCAweGE4ODMsIDB4MDAwMCwgMHhhODk3LCAweDQwMDIsIDB4MDgwYywKKwkweDZhZGMsIDB4YTA5ZiwgMHgwMDAwLCAweGEwYTMsIDB4MDAwMCwgMHgyODQ4LCAweDA4MGMsIDB4MTA2MywKKwkweDAwOWUsIDB4MDAwNSwgMHgwMGE2LCAweGEwYTAsIDB4OTA0ZCwgMHgwOTBjLCAweDBkZmEsIDB4YTA2YywKKwkweDkwOGUsIDB4MDEwMCwgMHgwMTI4LCAweGE4N2IsIDB4MDAwMSwgMHhhODgzLCAweDAwMDAsIDB4MDBjMCwKKwkweGE4MGMsIDB4MjA1MCwgMHhiMDA0LCAweDkwMDUsIDB4MDE5OCwgMHhhODBlLCAweDIwNTAsIDB4ODAwNiwKKwkweDgwMDYsIDB4ODAwNywgMHg5MDhjLCAweDAwM2YsIDB4OTA4NCwgMHhmZmMwLCAweDkwODAsIDB4MDAwMiwKKwkweGEwNzYsIDB4YTE3MiwgMHhiMDAwLCAweGEwN2EsIDB4MjgxMCwgMHgwODBjLCAweDExMmUsIDB4MDBlOCwKKwkweGE5N2MsIDB4YTg5NCwgMHgwMDE2LCAweDAwMDYsIDB4MDgwYywgMHg2YWRjLCAweDAwMGUsIDB4MDAxZSwKKwkweGQxZmMsIDB4MTEzOCwgMHhkMWY0LCAweDAxMjgsIDB4MDBjNiwgMHgyMDYwLCAweDA4MGMsIDB4YTBlMywKKwkweDAwY2UsIDB4NzAwOCwgMHgyMDQ4LCAweGE4OWYsIDB4MDAwMCwgMHhhOGEzLCAweDAwMDAsIDB4MDgwYywKKwkweDEwNjMsIDB4NzAwNywgMHgwMDAwLCAweDA4MGMsIDB4MTE0ZCwgMHgwMGFlLCAweDAwMDUsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHg3ODJiLCAweDEwMDEsIDB4NzAwNywgMHgwMDA1LCAweDcwMDAsIDB4YzA5NCwKKwkweDcwMDIsIDB4MDEyZSwgMHgwMDA1LCAweDcwMDcsIDB4MDAwMCwgMHgwODBjLCAweDExNWUsIDB4MDAwNSwKKwkweDAxMjYsIDB4MjA5MSwgMHgyMjAwLCAweDIwNzksIDB4MDMwMCwgMHgyMDcxLCAweDFhM2EsIDB4NzAwMywKKwkweDAwMDAsIDB4NzhiZiwgMHgwMGY2LCAweDc4MWIsIDB4NDgwMCwgMHgwNDE5LCAweDc4MDMsIDB4MDAwMywKKwkweDc4MGYsIDB4MDAwMCwgMHgyMDAxLCAweDAxMDAsIDB4MjAwNCwgMHg5MDg2LCAweDAwMGEsIDB4MDEyOCwKKwkweDIwYTksIDB4MDI1NCwgMHgyMDYxLCAweGRjNDIsIDB4MDAyMCwgMHgyMGE5LCAweDAyNDEsIDB4MjA2MSwKKwkweGUwZTgsIDB4MmMwZCwgMHg3OTEyLCAweGUxMDQsIDB4OWNlMCwgMHgwMDAyLCAweDc5MTYsIDB4MWYwNCwKKwkweDEzMTksIDB4NzgwNywgMHgwMDA3LCAweDc4MDMsIDB4MDAwMCwgMHg3ODAzLCAweDAwMDEsIDB4MDEyZSwKKwkweDAwMDUsIDB4MDBjNiwgMHg3ODAzLCAweDAwMDAsIDB4NzgwOCwgMHhkMDljLCAweDAxMTAsIDB4NzgyMCwKKwkweDBjZDgsIDB4MjAwMSwgMHgxYTNiLCAweDIwMDMsIDB4MDAwMCwgMHg3OGFiLCAweDAwMDQsIDB4NzhhYywKKwkweGQwYWMsIDB4MWRlOCwgMHg3OGFiLCAweDAwMDIsIDB4NzgwNywgMHgwMDA3LCAweDc4MjcsIDB4MDAzMCwKKwkweDc4MmIsIDB4MDQwMCwgMHg3ODI3LCAweDAwMzEsIDB4NzgyYiwgMHgxYTVjLCAweDc4MWYsIDB4ZmYwMCwKKwkweDc4MWIsIDB4YjcwMCwgMHgyMDAxLCAweDAyMDAsIDB4MjAwNCwgMHhkMGRjLCAweDAxMTAsIDB4NzgxZiwKKwkweDAzMDMsIDB4MjA2MSwgMHgxYTVjLCAweDYwMmYsIDB4MWNkMCwgMHgyMDAxLCAweDE4MTksIDB4MjAwNCwKKwkweDkwODIsIDB4MWNkMCwgMHg2MDMyLCAweDYwM2IsIDB4MWZjOCwgMHgyMDAxLCAweDMyZTksIDB4ZDBmYywKKwkweDE5MGMsIDB4MGRmYSwgMHgyMDAxLCAweDAwMDMsIDB4MjAwNCwgMHhkMGQ0LCAweDExMTgsIDB4NzgzZiwKKwkweDMyZTksIDB4MDAyMCwgMHg5MDg0LCAweGMwMDAsIDB4NzgzZiwgMHhiMmU5LCAweDAwY2UsIDB4MDAwNSwKKwkweDAxMjYsIDB4MjA5MSwgMHgyMjAwLCAweDc5MDgsIDB4OTE4NCwgMHgwMDcwLCAweDE5MGMsIDB4MGRmMywKKwkweGQxOWMsIDB4MDE1OCwgMHg3ODIwLCAweDkwOGMsIDB4ZjAwMCwgMHgxNWU4LCAweDkwOGEsIDB4MDAyNCwKKwkweDFhMGMsIDB4MGRmYSwgMHgwMDIzLCAweDAxMmUsIDB4MDAwNSwgMHgwMTJlLCAweDAwMDUsIDB4MTNhYiwKKwkweDEzYWIsIDB4MTNjMiwgMHgxM2M3LCAweDEzY2IsIDB4MTNkMCwgMHgxM2Y4LCAweDEzZmMsIDB4MTQwYSwKKwkweDE0MGUsIDB4MTNhYiwgMHgxNDlhLCAweDE0OWUsIDB4MTUwZSwgMHgxM2FiLCAweDEzYWIsIDB4MTNhYiwKKwkweDEzYWIsIDB4MTNhYiwgMHgxM2FiLCAweDEzYWIsIDB4MTNhYiwgMHgxM2FiLCAweDEzYWIsIDB4MTNhYiwKKwkweDEzYWIsIDB4MTNhYiwgMHgxM2QyLCAweDEzYWIsIDB4MTNhYiwgMHgxM2FiLCAweDEzYWIsIDB4MTNhYiwKKwkweDEzYWIsIDB4MTNhZiwgMHgxM2FkLCAweDA4MGMsIDB4MGRmYSwgMHgwODBjLCAweDBkZjMsIDB4MDgwYywKKwkweDE1MTUsIDB4MjAwOSwgMHgxYTUyLCAweDIxMDQsIDB4ODAwMCwgMHgyMDBhLCAweDA4MGMsIDB4N2M2ZCwKKwkweDA4MGMsIDB4MTlmZiwgMHgwMDA1LCAweDIwMDksIDB4MDA0OCwgMHgyMDYwLCAweDA4MGMsIDB4YTE1ZCwKKwkweDAxMmUsIDB4MDAwNSwgMHg3MDA0LCAweGMwODUsIDB4YzBiNSwgMHg3MDA2LCAweDAwMDUsIDB4NzAwNCwKKwkweGMwODUsIDB4NzAwNiwgMHgwMDA1LCAweDA4MGMsIDB4MTUxNSwgMHgwODBjLCAweDE2NmUsIDB4MDAwNSwKKwkweDA4MGMsIDB4MGRmYSwgMHgwODBjLCAweDE1MTUsIDB4MjA2MCwgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwKKwkweGE4M2IsIDB4ZmZmZiwgMHgwMDllLCAweDIwMDksIDB4MDA0OCwgMHgwODBjLCAweGExNWQsIDB4MjAwMSwKKwkweDAxNWQsIDB4MjAwMywgMHgwMDAwLCAweDIwMDksIDB4MDNlOCwgMHg4MTA5LCAweDAxNjAsIDB4MjAwMSwKKwkweDAyMDEsIDB4MjAwNCwgMHg5MDA1LCAweDBkYzgsIDB4MjAwMSwgMHgwMjE4LCAweDIwMDQsIDB4ZDBlYywKKwkweDExMTAsIDB4MDgwYywgMHgxNTFhLCAweDIwMDEsIDB4MDMwNywgMHgyMDAzLCAweDgwMDAsIDB4MDAwNSwKKwkweDcwMDQsIDB4YzA5NSwgMHg3MDA2LCAweDAwMDUsIDB4MDgwYywgMHgxNTE1LCAweDIwNjAsIDB4NjAxNCwKKwkweDAwOTYsIDB4MjA0OCwgMHhhODNiLCAweGZmZmYsIDB4MDA5ZSwgMHgyMDA5LCAweDAwNDgsIDB4MDgwYywKKwkweGExNWQsIDB4MDAwNSwgMHgwODBjLCAweDE1MTUsIDB4MDgwYywgMHgwZGZhLCAweDA4MGMsIDB4MTUxNSwKKwkweDA4MGMsIDB4MTQ4NSwgMHg3ODI3LCAweDAwMTgsIDB4NzlhYywgMHhkMWRjLCAweDA1NDAsIDB4NzgyNywKKwkweDAwMTUsIDB4NzgyOCwgMHg3ODJiLCAweDAwMDAsIDB4OTA2NSwgMHgwMTM4LCAweDIwMDEsIDB4MDIwZCwKKwkweDIwMDMsIDB4MDA1MCwgMHgyMDAzLCAweDAwMjAsIDB4MDQwMCwgMHg3MDA0LCAweDkwMDUsIDB4MTE4MCwKKwkweDc4YWIsIDB4MDAwNCwgMHg3ODI3LCAweDAwMTgsIDB4NzgyYiwgMHgwMDAwLCAweGQxYmMsIDB4MDkwYywKKwkweDBkZmEsIDB4MjAwMSwgMHgwMjBkLCAweDIwMDMsIDB4MDA1MCwgMHgyMDAzLCAweDAwMjAsIDB4MDQ5MCwKKwkweDc4YWIsIDB4MDAwNCwgMHg3ODAzLCAweDAwMDEsIDB4MDgwYywgMHgxNDllLCAweDAwMDUsIDB4NzgyOCwKKwkweDc4MmIsIDB4MDAwMCwgMHg5MDY1LCAweDA5MGMsIDB4MGRmYSwgMHg2MDE0LCAweDIwNDgsIDB4NzhhYiwKKwkweDAwMDQsIDB4OTE4YywgMHgwNzAwLCAweDAxYTgsIDB4MDgwYywgMHg3YzZkLCAweDA4MGMsIDB4MTlmZiwKKwkweDA4MGMsIDB4YmUzNywgMHgwMTU4LCAweGE5YWMsIDB4YTkzNiwgMHhhOWIwLCAweGE5M2EsIDB4YTgzZiwKKwkweGZmZmYsIDB4YTg0MywgMHhmZmZmLCAweGE4ODAsIDB4YzBiZCwgMHhhODgyLCAweDA4MGMsIDB4YmE1NiwKKwkweDAwMDUsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4NjAyNCwKKwkweDE5MGMsIDB4YzIyMywgMHgyMDI5LCAweDAwYzgsIDB4ODUyOSwgMHgwMTI4LCAweDIwMDEsIDB4MDIwMSwKKwkweDIwMDQsIDB4OTAwNSwgMHgwZGM4LCAweDdkYmMsIDB4MDgwYywgMHhkYmViLCAweGQ1YTQsIDB4MTExOCwKKwkweDA4MGMsIDB4MTUxYSwgMHgwMDA1LCAweDA4MGMsIDB4N2M2ZCwgMHgwODBjLCAweDE5ZmYsIDB4MDAwNSwKKwkweDc4MWYsIDB4MDMwMCwgMHg3ODAzLCAweDAwMDEsIDB4MDAwNSwgMHgwMDE2LCAweDAwNjYsIDB4MDA3NiwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMzAwLCAweDc5MDgsIDB4OTE4YywgMHgwMDA3LCAweDkxODYsIDB4MDAwMywKKwkweDAxMjAsIDB4MjAwMSwgMHgwMDE2LCAweDA4MGMsIDB4MTU4YiwgMHgwMGZlLCAweDAwN2UsIDB4MDA2ZSwKKwkweDAwMWUsIDB4MDAwNSwgMHg3MDA0LCAweGMwOWQsIDB4NzAwNiwgMHgwMDA1LCAweDcxMDQsIDB4OTE4NCwKKwkweDAwMDQsIDB4MTkwYywgMHgwZGZhLCAweGQxODQsIDB4MTFiMSwgMHhkMTljLCAweDAxODAsIDB4YzE5YywKKwkweDcxMDYsIDB4MDAxNiwgMHgwODBjLCAweDE2NTEsIDB4MDAxZSwgMHgwMTQ4LCAweDIwMDEsIDB4MDIwZCwKKwkweDIwMDMsIDB4MDA1MCwgMHgyMDAzLCAweDAwMjAsIDB4MDgwYywgMHgxNTFhLCAweDAwMDUsIDB4ODFmZiwKKwkweDE5MGMsIDB4MGRmYSwgMHgwMDA1LCAweDIxMDAsIDB4YzE4NCwgMHhjMWI0LCAweDcxMDYsIDB4ZDBiNCwKKwkweDAwMTYsIDB4MDBlNiwgMHgxOTA0LCAweDE1MDMsIDB4MjA3MSwgMHgwMjAwLCAweDA4MGMsIDB4MTY0NSwKKwkweDA4MGMsIDB4MTY1MSwgMHgwNWE4LCAweDYwMTQsIDB4OTAwNSwgMHgwNWE4LCAweDAwOTYsIDB4MjA0OCwKKwkweGE4NjQsIDB4MDA5ZSwgMHg5MDg0LCAweDAwZmYsIDB4OTA4ZSwgMHgwMDI5LCAweDAxNjAsIDB4OTA4ZSwKKwkweDAwNDgsIDB4MTU0OCwgMHg2MDFjLCAweGQwODQsIDB4MTFkOCwgMHgwMGY2LCAweDJjNzgsIDB4MDgwYywKKwkweDE2ZGIsIDB4MDBmZSwgMHgwMGE4LCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweDE4MjUsIDB4MDBmZSwKKwkweDIwMDksIDB4MDFmNCwgMHg4MTA5LCAweDAxNjAsIDB4MjAwMSwgMHgwMjAxLCAweDIwMDQsIDB4OTAwNSwKKwkweDBkYzgsIDB4MjAwMSwgMHgwMjE4LCAweDIwMDQsIDB4ZDBlYywgMHgxMTEwLCAweDA0MTksIDB4MDA0MCwKKwkweDIwMDEsIDB4MDIwZCwgMHgyMDAzLCAweDAwMjAsIDB4MDgwYywgMHgxMzI5LCAweDc4MDMsIDB4MDAwMSwKKwkweDAwZWUsIDB4MDAxZSwgMHgwMDA1LCAweDA4MGMsIDB4MTY1MSwgMHgwZGQwLCAweDIwMDEsIDB4MDIwZCwKKwkweDIwMDMsIDB4MDA1MCwgMHgyMDAzLCAweDAwMjAsIDB4MDA2OSwgMHgwYzkwLCAweDAwMzEsIDB4MjA2MCwKKwkweDIwMDksIDB4MDA1MywgMHgwODBjLCAweGExNWQsIDB4MDAwNSwgMHg3ODA4LCAweGQwOWMsIDB4MGRlOCwKKwkweDc4MjAsIDB4MDAwNSwgMHgwODBjLCAweDE0ODUsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsIDB4MjAwOSwKKwkweDAxZjQsIDB4ODEwOSwgMHgwNTEwLCAweDY4MDQsIDB4OTAwNSwgMHgwZGQ4LCAweDIwMDEsIDB4MDE1ZCwKKwkweDIwMDMsIDB4MDAwMCwgMHg3OWJjLCAweGQxYTQsIDB4MTUyOCwgMHg3OWI4LCAweDkxOGMsIDB4MGZmZiwKKwkweDAxODAsIDB4OTE4MiwgMHgwODQxLCAweDEyNjgsIDB4OTE4OCwgMHgwMDA3LCAweDkxOGMsIDB4MGZmOCwKKwkweDgxMGMsIDB4ODEwYywgMHg4MTBjLCAweDA4MGMsIDB4MTU3ZCwgMHg2ODI3LCAweDAwMDEsIDB4ODEwOSwKKwkweDFkZDAsIDB4MDRkOSwgMHg2ODI3LCAweDAwMDIsIDB4MDRjMSwgMHg2ODA0LCAweDkwMDUsIDB4MTEzMCwKKwkweDY4MmMsIDB4ZDBlNCwgMHgxNTAwLCAweDY4MDQsIDB4OTAwNSwgMHgwZGU4LCAweDc5YjgsIDB4ZDFlYywKKwkweDExMzAsIDB4MDhjMCwgMHgwODBjLCAweDdjNmQsIDB4MDgwYywgMHgxOWZmLCAweDAwOTAsIDB4NzgyNywKKwkweDAwMTUsIDB4NzgyYiwgMHgwMDAwLCAweDc4MjcsIDB4MDAxOCwgMHg3ODJiLCAweDAwMDAsIDB4MjAwMSwKKwkweDAyMGQsIDB4MjAwMywgMHgwMDIwLCAweDIwMDEsIDB4MDMwNywgMHgyMDAzLCAweDAzMDAsIDB4NzgwMywKKwkweDAwMDEsIDB4MDBkZSwgMHgwMDA1LCAweDY4MmMsIDB4OTA4NCwgMHg1NDAwLCAweDkwODYsIDB4NTQwMCwKKwkweDBkMzAsIDB4NzgyNywgMHgwMDE1LCAweDc4MmIsIDB4MDAwMCwgMHg3ODAzLCAweDAwMDEsIDB4NjgwMCwKKwkweDkwODUsIDB4MTgwMCwgMHg2ODAyLCAweDAwZGUsIDB4MDAwNSwgMHg2ODI0LCAweDkwODQsIDB4MDAwMywKKwkweDFkZTAsIDB4MDAwNSwgMHgyMDAxLCAweDAwMzAsIDB4MmMwOCwgMHg2MjFjLCAweDAwMjEsIDB4NzgzMCwKKwkweDkwODYsIDB4MDA0MSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMzAwLCAweDAwMDYsIDB4NzgwOCwKKwkweGQwOWMsIDB4MDE0MCwgMHgwMDE2LCAweDAwMjYsIDB4MDBjNiwgMHgwODBjLCAweDEzNzAsIDB4MDBjZSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDYsIDB4NzgzMiwgMHg3OTM2LCAweDdhM2EsIDB4NzgxYiwKKwkweDgwODAsIDB4MDA1OSwgMHgxMTE4LCAweDAwMGUsIDB4MDBmZSwgMHgwMDA1LCAweDAwMGUsIDB4NzkyYywKKwkweDM5MDAsIDB4ODAwMCwgMHgyMDA0LCAweDA4MGMsIDB4MGRmYSwgMHgyMDA5LCAweDE4MGMsIDB4MjEwNCwKKwkweGMwZjQsIDB4MjAwYSwgMHgyMDA5LCAweGZmMDAsIDB4ODEwOSwgMHgwOTA0LCAweDE2MDksIDB4N2ExOCwKKwkweDkyODQsIDB4MDAzMCwgMHgwOTA0LCAweDE2MDQsIDB4OTI4NCwgMHgwMDQ4LCAweDkwODYsIDB4MDAwOCwKKwkweDE5MDQsIDB4MTYwNCwgMHgyMDAxLCAweDAxMDksIDB4MjAwNCwgMHhkMDhjLCAweDAxZjAsIDB4MDAwNiwKKwkweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwKKwkweDAwZjYsIDB4MDAyNiwgMHgwMDE2LCAweDIwMDksIDB4MWE1NSwgMHgyMTA0LCAweDgwMDAsIDB4MDIwOCwKKwkweDIwMGEsIDB4MDgwYywgMHg4NjMyLCAweDAwMWUsIDB4MDAyZSwgMHgwMGZlLCAweDAxMmUsIDB4MDE1ZSwKKwkweDAxNGUsIDB4MDEzZSwgMHgwMWRlLCAweDAxY2UsIDB4MDAwZSwgMHgyMDAxLCAweDAwOWIsIDB4MjAwNCwKKwkweGQwZmMsIDB4MDFkMCwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwKKwkweDAxNTYsIDB4MDBmNiwgMHgwMDE2LCAweDIwMDksIDB4MWE1NiwgMHgyMTA0LCAweDgwMDAsIDB4MDIwOCwKKwkweDIwMGEsIDB4MDgwYywgMHgxZGVjLCAweDAwMWUsIDB4MDBmZSwgMHgwMTVlLCAweDAxNGUsIDB4MDEzZSwKKwkweDAxZGUsIDB4MDFjZSwgMHgwMTJlLCAweDAwMGUsIDB4NzgxOCwgMHhkMGJjLCAweDE5MDQsIDB4MTViNCwKKwkweDAwMDUsIDB4MjAwMSwgMHgxODBjLCAweDIwMDQsIDB4ZDBmNCwgMHgxNTI4LCAweDdhMTgsIDB4OTI4NCwKKwkweDAwMzAsIDB4MDUwOCwgMHg5Mjg0LCAweDAwNDgsIDB4OTA4NiwgMHgwMDA4LCAweDExZTAsIDB4MjAwMSwKKwkweDE5Y2UsIDB4MjAwNCwgMHg5MDA1LCAweDAxYjgsIDB4MjAwMSwgMHgxYTNkLCAweDIwMDQsIDB4OTA4NiwKKwkweDAwMDAsIDB4MDE4OCwgMHgyMDA5LCAweDFhNTQsIDB4MjEwNCwgMHg4MDAwLCAweDAyMDgsIDB4MjAwYSwKKwkweDA4MGMsIDB4OTZkNCwgMHgyMDA5LCAweDE4MGMsIDB4MjEwNCwgMHhjMGY1LCAweDIwMGEsIDB4MjAwOSwKKwkweGZmMDAsIDB4MDgwNCwgMHgxNWI0LCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDc4MzIsIDB4NzkzNiwKKwkweDdhM2EsIDB4NzgxYiwgMHg4MDgwLCAweDA4MGMsIDB4MTVhZCwgMHgxMTA4LCAweDAwMDUsIDB4NzkyYywKKwkweDM5MDAsIDB4ODAwMCwgMHgyMDA0LCAweDA4MGMsIDB4MGRmYSwgMHg3MDM3LCAweDAwMDEsIDB4NzE1MCwKKwkweDcwMzcsIDB4MDAwMiwgMHg3MDUwLCAweDIwNjAsIDB4ZDFiYywgMHgxMTEwLCAweDcwNTQsIDB4MjA2MCwKKwkweDAwMDUsIDB4MDAwNiwgMHgwMDQ2LCAweDAwZTYsIDB4MjA3MSwgMHgwMjAwLCAweDcwMzcsIDB4MDAwMiwKKwkweDcwNTgsIDB4OTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4OTA4NiwgMHgwMGJjLCAweDExNTgsIDB4MjAyMSwKKwkweDFhNTMsIDB4MjQwNCwgMHg4MDAwLCAweDAyMDgsIDB4MjAyMiwgMHgwODBjLCAweDdjNmQsIDB4MDgwYywKKwkweDE5ZmYsIDB4OTAwNiwgMHgwMGVlLCAweDAwNGUsIDB4MDAwZSwgMHgwMDA1LCAweDBjMTEsIDB4MTEwOCwKKwkweDAwMDUsIDB4MDBlNiwgMHgwMDE2LCAweDIwNzEsIDB4MDIwMCwgMHgwODc5LCAweDYxMjQsIDB4ZDFkYywKKwkweDAxZjgsIDB4NzAxYywgMHhkMDhjLCAweDA5MDQsIDB4MTZkMCwgMHg3MDE3LCAweDAwMDAsIDB4MjAwMSwKKwkweDAyNjQsIDB4MjAwNCwgMHhkMGJjLCAweDA5MDQsIDB4MTZkMCwgMHgyMDAxLCAweDAyNjgsIDB4MDBjNiwKKwkweDIwNjQsIDB4NjEwNCwgMHg2MDM4LCAweDAwY2UsIDB4OTE4ZSwgMHgwMDM5LCAweDE5MDQsIDB4MTZkMCwKKwkweDljMDYsIDB4MTVmMCwgMHgwMTI2LCAweDIwOTEsIDB4MjYwMCwgMHgwODBjLCAweDdiYjQsIDB4MDEyZSwKKwkweDczNTgsIDB4NzQ1YywgMHg2MDE0LCAweDkwNWQsIDB4MDU5OCwgMHgyYjQ4LCAweDYwMTAsIDB4MDBiNiwKKwkweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MTkwYywgMHhjMWZlLCAweGFiNDIsIDB4YWMzZSwKKwkweDIwMDEsIDB4MTg3ZCwgMHgyMDA0LCAweGQwYjQsIDB4MTE3MCwgMHg2MDFjLCAweGQwZTQsIDB4MTE1OCwKKwkweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwgMHhkMGJjLCAweDExMjAsIDB4YTgzYiwKKwkweDdmZmYsIDB4YTgzNywgMHhmZmZmLCAweDA4MGMsIDB4MWZlOCwgMHgxMTkwLCAweDA4MGMsIDB4MTg4MiwKKwkweDJhMDAsIDB4YTgxNiwgMHgwMTMwLCAweDI4MDAsIDB4YTgwZSwgMHgyYzA1LCAweGE4MGEsIDB4MmMwMCwKKwkweGE4MTIsIDB4NzAzNywgMHgwMDIwLCAweDc4MWYsIDB4MDMwMCwgMHgwMDFlLCAweDAwZWUsIDB4MDAwNSwKKwkweDcwMzcsIDB4MDA1MCwgMHg3MDM3LCAweDAwMjAsIDB4MDAxZSwgMHgwMGVlLCAweDA4MGMsIDB4MTUxYSwKKwkweDAwMDUsIDB4MDgwYywgMHgwZGZhLCAweDAwMTYsIDB4MjAwOSwgMHgwMGEwLCAweDgxMDksIDB4YTAwMSwKKwkweGEwMDEsIDB4YTAwMSwgMHgxZGQ4LCAweDAwMWUsIDB4MmZmMCwgMHgwMTI2LCAweDIwOTEsIDB4MjIwMCwKKwkweDAwMTYsIDB4MDBjNiwgMHgzZTYwLCAweDYwMTQsIDB4MjA0OCwgMHgyOTQwLCAweDkwM2UsIDB4MjczMCwKKwkweGE4NjQsIDB4MjA2OCwgMHhhODFhLCAweDlkODQsIDB4MDAwZiwgMHg5MDg4LCAweDFmYzgsIDB4MjE2NSwKKwkweDAwMDIsIDB4MTcxMCwgMHgxNzVkLCAweDE3MTAsIDB4MTcxMCwgMHgxNzEwLCAweDE3M2YsIDB4MTcxMCwKKwkweDE3MTQsIDB4MTcwOSwgMHgxNzU0LCAweDE3MTAsIDB4MTcxMCwgMHgxNzEwLCAweDE4MWEsIDB4MTcyOCwKKwkweDE3MWUsIDB4YTk2NCwgMHg5MThjLCAweDAwZmYsIDB4OTE4ZSwgMHgwMDQ4LCAweDA5MDQsIDB4MTc1NCwKKwkweDkwODUsIDB4MDAwMSwgMHgwODA0LCAweDE4MTAsIDB4YTg3YywgMHhkMGJjLCAweDBkYzgsIDB4YTg5MCwKKwkweGE4NDIsIDB4YTg4YywgMHhhODNlLCAweGE4ODgsIDB4MDgwNCwgMHgxNzY0LCAweGE4N2MsIDB4ZDBiYywKKwkweDBkNzgsIDB4YTg5MCwgMHhhODQyLCAweGE4OGMsIDB4YTgzZSwgMHhhODg4LCAweDA4MDQsIDB4MTdiMywKKwkweGE4N2MsIDB4ZDBiYywgMHgwZDI4LCAweGE4OTAsIDB4YTg0MiwgMHhhODhjLCAweGE4M2UsIDB4YTgwNCwKKwkweDkwNDUsIDB4MDkwYywgMHgwZGZhLCAweGExNjQsIDB4YTkxYSwgMHg5MWVjLCAweDAwMGYsIDB4OWQ4MCwKKwkweDFmYzgsIDB4MjA2NSwgMHhhODg4LCAweGQxOWMsIDB4MTkwNCwgMHgxN2IzLCAweDA0MjgsIDB4YTg3YywKKwkweGQwYWMsIDB4MDk3MCwgMHhhODA0LCAweDkwNDUsIDB4MDkwYywgMHgwZGZhLCAweGExNjQsIDB4YTkxYSwKKwkweDkxZWMsIDB4MDAwZiwgMHg5ZDgwLCAweDFmYzgsIDB4MjA2NSwgMHg5MDA2LCAweGE4NDIsIDB4YTgzZSwKKwkweGQxOWMsIDB4MTkwNCwgMHgxN2IzLCAweDAwODAsIDB4YTg3YywgMHhkMGFjLCAweDA5MDQsIDB4MTcxMCwKKwkweDkwMDYsIDB4YTg0MiwgMHhhODNlLCAweDA4MDQsIDB4MTdiMywgMHhhODdjLCAweGQwYWMsIDB4MDkwNCwKKwkweDE3MTAsIDB4OTAwNiwgMHhhODQyLCAweGE4M2UsIDB4MmMwNSwgMHg5MDhhLCAweDAwMzYsIDB4MWEwYywKKwkweDBkZmEsIDB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4MTc4NywgMHgxNzg3LCAweDE3ODksIDB4MTc4NywKKwkweDE3ODcsIDB4MTc4NywgMHgxNzhmLCAweDE3ODcsIDB4MTc4NywgMHgxNzg3LCAweDE3OTUsIDB4MTc4NywKKwkweDE3ODcsIDB4MTc4NywgMHgxNzliLCAweDE3ODcsIDB4MTc4NywgMHgxNzg3LCAweDE3YTEsIDB4MTc4NywKKwkweDE3ODcsIDB4MTc4NywgMHgxN2E3LCAweDE3ODcsIDB4MTc4NywgMHgxNzg3LCAweDE3YWQsIDB4MDgwYywKKwkweDBkZmEsIDB4YTU3NCwgMHhhNDc4LCAweGEzN2MsIDB4YTI4MCwgMHgwODA0LCAweDE3ZjgsIDB4YTU4NCwKKwkweGE0ODgsIDB4YTM4YywgMHhhMjkwLCAweDA4MDQsIDB4MTdmOCwgMHhhNTk0LCAweGE0OTgsIDB4YTM5YywKKwkweGEyYTAsIDB4MDgwNCwgMHgxN2Y4LCAweGE1YTQsIDB4YTRhOCwgMHhhM2FjLCAweGEyYjAsIDB4MDgwNCwKKwkweDE3ZjgsIDB4YTViNCwgMHhhNGI4LCAweGEzYmMsIDB4YTJjMCwgMHgwODA0LCAweDE3ZjgsIDB4YTVjNCwKKwkweGE0YzgsIDB4YTNjYywgMHhhMmQwLCAweDA4MDQsIDB4MTdmOCwgMHhhNWQ0LCAweGE0ZDgsIDB4YTNkYywKKwkweGEyZTAsIDB4MDgwNCwgMHgxN2Y4LCAweDJjMDUsIDB4OTA4YSwgMHgwMDM0LCAweDFhMGMsIDB4MGRmYSwKKwkweDkwODIsIDB4MDAxYiwgMHgwMDAyLCAweDE3ZDYsIDB4MTdkNCwgMHgxN2Q0LCAweDE3ZDQsIDB4MTdkNCwKKwkweDE3ZDQsIDB4MTdkZCwgMHgxN2Q0LCAweDE3ZDQsIDB4MTdkNCwgMHgxN2Q0LCAweDE3ZDQsIDB4MTdlNCwKKwkweDE3ZDQsIDB4MTdkNCwgMHgxN2Q0LCAweDE3ZDQsIDB4MTdkNCwgMHgxN2ViLCAweDE3ZDQsIDB4MTdkNCwKKwkweDE3ZDQsIDB4MTdkNCwgMHgxN2Q0LCAweDE3ZjIsIDB4MDgwYywgMHgwZGZhLCAweGE1NmMsIDB4YTQ3MCwKKwkweGE3NzQsIDB4YTY3OCwgMHhhMzdjLCAweGEyODAsIDB4MDBkOCwgMHhhNTg0LCAweGE0ODgsIDB4YTc4YywKKwkweGE2OTAsIDB4YTM5NCwgMHhhMjk4LCAweDAwYTAsIDB4YTU5YywgMHhhNGEwLCAweGE3YTQsIDB4YTZhOCwKKwkweGEzYWMsIDB4YTJiMCwgMHgwMDY4LCAweGE1YjQsIDB4YTRiOCwgMHhhN2JjLCAweGE2YzAsIDB4YTNjNCwKKwkweGEyYzgsIDB4MDAzMCwgMHhhNWNjLCAweGE0ZDAsIDB4YTdkNCwgMHhhNmQ4LCAweGEzZGMsIDB4YTJlMCwKKwkweGFiMmUsIDB4YWEzMiwgMHhhZDFlLCAweGFjMjIsIDB4YWYyNiwgMHhhZTJhLCAweGE5ODgsIDB4OGM2MCwKKwkweDJjMWQsIDB4YThhYywgMHhhYWIwLCAweGE4MzYsIDB4YWEzYSwgMHg4MTA5LCAweGE5MTYsIDB4MTE2MCwKKwkweDNlNjAsIDB4NjAxYywgMHhjMDg1LCAweDYwMWUsIDB4YTg3YywgMHhjMGRkLCAweGE4N2UsIDB4OTAwNiwKKwkweDAwY2UsIDB4MDAxZSwgMHgwMTJlLCAweDAwMDUsIDB4MjgwMCwgMHhhODBlLCAweGFiMGEsIDB4MmMwMCwKKwkweGE4MTIsIDB4MGM3MCwgMHgwODA0LCAweDE3MTAsIDB4MDAxNiwgMHgyMDA5LCAweDAwYTAsIDB4ODEwOSwKKwkweGEwMDEsIDB4YTAwMSwgMHhhMDAxLCAweDFkZDgsIDB4MDAxZSwgMHgyZmYwLCAweDAxMjYsIDB4MjA5MSwKKwkweDIyMDAsIDB4MDAxNiwgMHgwMGM2LCAweDNlNjAsIDB4NjAxNCwgMHgyMDQ4LCAweDI5NDAsIDB4YTgwZSwKKwkweDIwNjEsIDB4MWZjMywgMHhhODEzLCAweDFmYzMsIDB4MmMwNSwgMHhhODBhLCAweGE5NjQsIDB4YTkxYSwKKwkweGE4N2MsIDB4ZDBhYywgMHgwOTBjLCAweDBkZmEsIDB4OTAwNiwgMHhhODQyLCAweGE4M2UsIDB4MmMwNSwKKwkweDkwOGEsIDB4MDAzNCwgMHgxYTBjLCAweDBkZmEsIDB4YWRjYywgMHhhY2QwLCAweGFmZDQsIDB4YWVkOCwKKwkweGFiZGMsIDB4YWFlMCwgMHhhYjJlLCAweGFhMzIsIDB4YWQxZSwgMHhhYzIyLCAweGFmMjYsIDB4YWUyYSwKKwkweGE4YWMsIDB4YWFiMCwgMHhhODM2LCAweGFhM2EsIDB4YTk4OCwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwKKwkweDkwODYsIDB4MDAwOCwgMHgxMTIwLCAweDgxMDksIDB4YTkxNiwgMHgwMTI4LCAweDAwODAsIDB4OTE4YSwKKwkweDAwMDIsIDB4YTkxNiwgMHgxMTYwLCAweDNlNjAsIDB4NjAxYywgMHhjMDg1LCAweDYwMWUsIDB4YTg3YywKKwkweGMwZGQsIDB4YTg3ZSwgMHg5MDA2LCAweDAwY2UsIDB4MDAxZSwgMHgwMTJlLCAweDAwMDUsIDB4YTgwNCwKKwkweDkwNDUsIDB4MDkwYywgMHgwZGZhLCAweGE4MGUsIDB4YTA2NCwgMHhhODFhLCAweDkwODQsIDB4MDAwZiwKKwkweDkwODAsIDB4MWZjOCwgMHgyMDE1LCAweDgyZmYsIDB4MDkwYywgMHgwZGZhLCAweGFhMTIsIDB4MjIwNSwKKwkweGE4MGEsIDB4MGMwOCwgMHg5MDNlLCAweDI3MzAsIDB4YTg4MCwgMHhkMGZjLCAweDExOTAsIDB4MmQwMCwKKwkweDAwMDIsIDB4MTk3NywgMHgxOGQ5LCAweDE4ZDksIDB4MTk3NywgMHgxOTc3LCAweDE5NzEsIDB4MTk3NywKKwkweDE4ZDksIDB4MTkyOCwgMHgxOTI4LCAweDE5MjgsIDB4MTk3NywgMHgxOTc3LCAweDE5NzcsIDB4MTk2ZSwKKwkweDE5MjgsIDB4YzBmYywgMHhhODgyLCAweGFiMmMsIDB4YWEzMCwgMHhhZDFjLCAweGFjMjAsIDB4ZGQ5YywKKwkweDA5MDQsIDB4MTk3OSwgMHgyYzA1LCAweDkwOGEsIDB4MDAzNCwgMHgxYTBjLCAweDBkZmEsIDB4OTA4MiwKKwkweDAwMWIsIDB4MDAwMiwgMHgxOGM1LCAweDE4YzMsIDB4MThjMywgMHgxOGMzLCAweDE4YzMsIDB4MThjMywKKwkweDE4YzksIDB4MThjMywgMHgxOGMzLCAweDE4YzMsIDB4MThjMywgMHgxOGMzLCAweDE4Y2QsIDB4MThjMywKKwkweDE4YzMsIDB4MThjMywgMHgxOGMzLCAweDE4YzMsIDB4MThkMSwgMHgxOGMzLCAweDE4YzMsIDB4MThjMywKKwkweDE4YzMsIDB4MThjMywgMHgxOGQ1LCAweDA4MGMsIDB4MGRmYSwgMHhhNzc0LCAweGE2NzgsIDB4MDgwNCwKKwkweDE5NzksIDB4YTc4YywgMHhhNjkwLCAweDA4MDQsIDB4MTk3OSwgMHhhN2E0LCAweGE2YTgsIDB4MDgwNCwKKwkweDE5NzksIDB4YTdiYywgMHhhNmMwLCAweDA4MDQsIDB4MTk3OSwgMHhhN2Q0LCAweGE2ZDgsIDB4MDgwNCwKKwkweDE5NzksIDB4MmMwNSwgMHg5MDhhLCAweDAwMzYsIDB4MWEwYywgMHgwZGZhLCAweDkwODIsIDB4MDAxYiwKKwkweDAwMDIsIDB4MThmYywgMHgxOGZjLCAweDE4ZmUsIDB4MThmYywgMHgxOGZjLCAweDE4ZmMsIDB4MTkwNCwKKwkweDE4ZmMsIDB4MThmYywgMHgxOGZjLCAweDE5MGEsIDB4MThmYywgMHgxOGZjLCAweDE4ZmMsIDB4MTkxMCwKKwkweDE4ZmMsIDB4MThmYywgMHgxOGZjLCAweDE5MTYsIDB4MThmYywgMHgxOGZjLCAweDE4ZmMsIDB4MTkxYywKKwkweDE4ZmMsIDB4MThmYywgMHgxOGZjLCAweDE5MjIsIDB4MDgwYywgMHgwZGZhLCAweGE1NzQsIDB4YTQ3OCwKKwkweGEzN2MsIDB4YTI4MCwgMHgwODA0LCAweDE5NzksIDB4YTU4NCwgMHhhNDg4LCAweGEzOGMsIDB4YTI5MCwKKwkweDA4MDQsIDB4MTk3OSwgMHhhNTk0LCAweGE0OTgsIDB4YTM5YywgMHhhMmEwLCAweDA4MDQsIDB4MTk3OSwKKwkweGE1YTQsIDB4YTRhOCwgMHhhM2FjLCAweGEyYjAsIDB4MDgwNCwgMHgxOTc5LCAweGE1YjQsIDB4YTRiOCwKKwkweGEzYmMsIDB4YTJjMCwgMHgwODA0LCAweDE5NzksIDB4YTVjNCwgMHhhNGM4LCAweGEzY2MsIDB4YTJkMCwKKwkweDA4MDQsIDB4MTk3OSwgMHhhNWQ0LCAweGE0ZDgsIDB4YTNkYywgMHhhMmUwLCAweDA4MDQsIDB4MTk3OSwKKwkweDJjMDUsIDB4OTA4YSwgMHgwMDM0LCAweDFhMGMsIDB4MGRmYSwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwKKwkweDE5NGIsIDB4MTk0OSwgMHgxOTQ5LCAweDE5NDksIDB4MTk0OSwgMHgxOTQ5LCAweDE5NTIsIDB4MTk0OSwKKwkweDE5NDksIDB4MTk0OSwgMHgxOTQ5LCAweDE5NDksIDB4MTk1OSwgMHgxOTQ5LCAweDE5NDksIDB4MTk0OSwKKwkweDE5NDksIDB4MTk0OSwgMHgxOTYwLCAweDE5NDksIDB4MTk0OSwgMHgxOTQ5LCAweDE5NDksIDB4MTk0OSwKKwkweDE5NjcsIDB4MDgwYywgMHgwZGZhLCAweGE1NmMsIDB4YTQ3MCwgMHhhNzc0LCAweGE2NzgsIDB4YTM3YywKKwkweGEyODAsIDB4MDQzOCwgMHhhNTg0LCAweGE0ODgsIDB4YTc4YywgMHhhNjkwLCAweGEzOTQsIDB4YTI5OCwKKwkweDA0MDAsIDB4YTU5YywgMHhhNGEwLCAweGE3YTQsIDB4YTZhOCwgMHhhM2FjLCAweGEyYjAsIDB4MDBjOCwKKwkweGE1YjQsIDB4YTRiOCwgMHhhN2JjLCAweGE2YzAsIDB4YTNjNCwgMHhhMmM4LCAweDAwOTAsIDB4YTVjYywKKwkweGE0ZDAsIDB4YTdkNCwgMHhhNmQ4LCAweGEzZGMsIDB4YTJlMCwgMHgwMDU4LCAweDlkODYsIDB4MDAwZSwKKwkweDExMzAsIDB4MDgwYywgMHgxZjgwLCAweDE5MDQsIDB4MTg4MiwgMHg5MDBlLCAweDAwNTAsIDB4MDgwYywKKwkweDBkZmEsIDB4YWIyZSwgMHhhYTMyLCAweGFkMWUsIDB4YWMyMiwgMHhhZjI2LCAweGFlMmEsIDB4MDgwYywKKwkweDFmODAsIDB4MDAwNSwgMHg2MDE0LCAweDIwNDgsIDB4NjExOCwgMHg4MTBjLCAweDgxMGMsIDB4ODEwYywKKwkweDgxZmYsIDB4MTExOCwgMHhhODg3LCAweDAwMDEsIDB4MDAwOCwgMHhhOTg2LCAweDYwMWIsIDB4MDAwMiwKKwkweGE4NzQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODQsIDB4MDAwOCwgMHgwMTUwLCAweDAwZTksIDB4NjAwMCwKKwkweDkwODYsIDB4MDAwNCwgMHgxMTIwLCAweDIwMDksIDB4MDA0OCwgMHgwODBjLCAweGExNWQsIDB4MDAwNSwKKwkweGE5NzQsIDB4ZDFkYywgMHgxMTA4LCAweDAwMDUsIDB4YTkzNCwgMHhhODhjLCAweDkxMDYsIDB4MTE1OCwKKwkweGE5MzgsIDB4YTg5MCwgMHg5MTA2LCAweDExMzgsIDB4NjAxYywgMHhjMDg0LCAweDYwMWUsIDB4MjAwOSwKKwkweDAwNDgsIDB4MDgwNCwgMHhhMTVkLCAweDAwMDUsIDB4MDEyNiwgMHgwMGM2LCAweDIwOTEsIDB4MjIwMCwKKwkweDAwY2UsIDB4NzkwOCwgMHg5MThjLCAweDAwMDcsIDB4OTE4NiwgMHgwMDAwLCAweDA1YjAsIDB4OTE4NiwKKwkweDAwMDMsIDB4MDU5OCwgMHg2MDIwLCAweDYwMjMsIDB4MDAwMCwgMHgwMDA2LCAweDIwMzEsIDB4MDAwOCwKKwkweDAwYzYsIDB4NzgxZiwgMHgwODA4LCAweDc4MDgsIDB4ZDA5YywgMHgwMTIwLCAweDA4MGMsIDB4MTM3MCwKKwkweDg2MzEsIDB4MWRiOCwgMHgwMGNlLCAweDc4MWYsIDB4MDgwMCwgMHgyMDMxLCAweDAxNjgsIDB4MDBjNiwKKwkweDc4MDgsIDB4ZDA5YywgMHgxOTBjLCAweDEzNzAsIDB4MDBjZSwgMHgyMDAxLCAweDAwMzgsIDB4MDgwYywKKwkweDFhODcsIDB4NzkzMCwgMHg5MTg2LCAweDAwNDAsIDB4MDE2MCwgMHg5MTg2LCAweDAwNDIsIDB4MTkwYywKKwkweDBkZmEsIDB4MjAwMSwgMHgwMDFlLCAweDgwMDEsIDB4MWRmMCwgMHg4NjMxLCAweDFkNDAsIDB4MDgwYywKKwkweDFhOTYsIDB4MDAwZSwgMHg2MDIyLCAweDAxMmUsIDB4MDAwNSwgMHgwODBjLCAweDFhODMsIDB4NzgyNywKKwkweDAwMTUsIDB4NzgyOCwgMHg5YzA2LCAweDFkYjgsIDB4NzgyYiwgMHgwMDAwLCAweDBjYTAsIDB4MDBmNiwKKwkweDIwNzksIDB4MDMwMCwgMHg3ODAzLCAweDAwMDAsIDB4NzhhYiwgMHgwMDA0LCAweDAwZmUsIDB4MDgwYywKKwkweDcyMDcsIDB4MTE4OCwgMHgyMDAxLCAweDAxMzgsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MDE2MCwKKwkweDIwMDMsIDB4MDAwMCwgMHgyMDExLCAweDAxMmMsIDB4YTAwMSwgMHhhMDAxLCAweDgyMTEsIDB4MWRlMCwKKwkweDAwNTksIDB4MDgwNCwgMHg3MmQyLCAweDA0NzksIDB4MDAzOSwgMHgyMDAxLCAweDAxNjAsIDB4MjUwMiwKKwkweDIwMDEsIDB4MDEzOCwgMHgyMjAyLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDAyMDAsIDB4MDgwYywKKwkweDJiYmMsIDB4MjAwOSwgMHgwMDNjLCAweDA4MGMsIDB4MjMwYSwgMHgyMDAxLCAweDAxNWQsIDB4MjAwMywKKwkweDAwMDAsIDB4NzAwMCwgMHg5MDg0LCAweDAwM2MsIDB4MWRlMCwgMHgwODBjLCAweDgxZjAsIDB4NzBhMCwKKwkweDcwYTIsIDB4NzA5OCwgMHg3MDlhLCAweDcwOWMsIDB4NzA5ZSwgMHgyMDAxLCAweDAyMGQsIDB4MjAwMywKKwkweDAwMjAsIDB4MDBmNiwgMHgyMDc5LCAweDAzMDAsIDB4MDgwYywgMHgxMzI5LCAweDc4MDMsIDB4MDAwMSwKKwkweDAwZmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwMDEsIDB4MDEzOCwgMHgyMDE0LCAweDIwMDMsIDB4MDAwMCwKKwkweDIwMDEsIDB4MDE2MCwgMHgyMDJjLCAweDIwMDMsIDB4MDAwMCwgMHgwODBjLCAweDcyMDcsIDB4MTEwOCwKKwkweDAwMDUsIDB4MjAyMSwgMHgwMjYwLCAweDIwMDEsIDB4MDE0MSwgMHgyMDFjLCAweGQzZGMsIDB4MTE2OCwKKwkweDIwMDEsIDB4MDEwOSwgMHgyMDFjLCAweDkzOWMsIDB4MDA0OCwgMHgxMTYwLCAweDIwMDEsIDB4MDExMSwKKwkweDIwMWMsIDB4ODNmZiwgMHgxMTEwLCAweDg0MjEsIDB4MWQ3MCwgMHgyMDAxLCAweDAxNWQsIDB4MjAwMywKKwkweDAwMDAsIDB4MDAwNSwgMHgwMDQ2LCAweDIwMjEsIDB4MDAxOSwgMHgyMDAzLCAweDAwNDgsIDB4YTAwMSwKKwkweGEwMDEsIDB4MjAxYywgMHg5MzljLCAweDAwNDgsIDB4MDEyMCwgMHg4NDIxLCAweDFkYjAsIDB4MDA0ZSwKKwkweDBjNjAsIDB4MDA0ZSwgMHgwYzQwLCAweDYwMWMsIDB4YzA4NCwgMHg2MDFlLCAweDAwMDUsIDB4MmMwOCwKKwkweDYyMWMsIDB4MDgwYywgMHgxNThiLCAweDc5MzAsIDB4MDAwNSwgMHgyYzA4LCAweDYyMWMsIDB4MDgwYywKKwkweDE2MzYsIDB4NzkzMCwgMHgwMDA1LCAweDgwMDEsIDB4MWRmMCwgMHgwMDA1LCAweDIwMzEsIDB4MDA2NCwKKwkweDc4MWMsIDB4OTA4NCwgMHgwMDA3LCAweDAxNzAsIDB4MjAwMSwgMHgwMDM4LCAweDBjNDEsIDB4OTE4NiwKKwkweDAwNDAsIDB4MDkwNCwgMHgxYWY0LCAweDIwMDEsIDB4MDAxZSwgMHgwYzY5LCAweDg2MzEsIDB4MWQ4MCwKKwkweDA4MGMsIDB4MGRmYSwgMHg3ODFmLCAweDAyMDIsIDB4MjAwMSwgMHgwMTVkLCAweDIwMDMsIDB4MDAwMCwKKwkweDIwMDEsIDB4MGRhYywgMHgwYzAxLCAweDc4MWMsIDB4ZDA4NCwgMHgwMTEwLCAweDA4NjEsIDB4MDRlMCwKKwkweDIwMDEsIDB4MDAzMCwgMHgwODkxLCAweDkxODYsIDB4MDA0MCwgMHgwNTY4LCAweDc4MWMsIDB4ZDA4NCwKKwkweDFkYTgsIDB4NzgxZiwgMHgwMTAxLCAweDIwMDEsIDB4MDAxNCwgMHgwODY5LCAweDIwMDEsIDB4MDAzNywKKwkweDA4MjEsIDB4OTE4NiwgMHgwMDQwLCAweDAxNDAsIDB4MjAwMSwgMHgwMDMwLCAweDA4MGMsIDB4MWE4ZCwKKwkweDkxODYsIDB4MDA0MCwgMHgxOTBjLCAweDBkZmEsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsIDB4NjkyYywKKwkweGQxZjQsIDB4MTE3MCwgMHhkMWM0LCAweDAxNjAsIDB4ZDE5YywgMHgwMTMwLCAweDY4MDAsIDB4OTA4NSwKKwkweDE4MDAsIDB4NjgwMiwgMHgwMGRlLCAweDAwODAsIDB4NjkwOCwgMHg5MTg0LCAweDAwMDcsIDB4MWRiMCwKKwkweDAwZGUsIDB4NzgxZiwgMHgwMTAwLCAweDc5MWMsIDB4OTE4NCwgMHgwMDA3LCAweDA5MGMsIDB4MGRmYSwKKwkweGEwMDEsIDB4YTAwMSwgMHg3ODFmLCAweDAyMDAsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4MjQwMCwKKwkweDIwNzEsIDB4MWEzZCwgMHgyMDc5LCAweDAwOTAsIDB4MDEyZSwgMHgwMDA1LCAweDkyODAsIDB4MDAwNSwKKwkweDIwMDQsIDB4MjA0OCwgMHhhOTdjLCAweGQxZGMsIDB4MTkwNCwgMHgxYjg5LCAweGE5NjQsIDB4OTE4NCwKKwkweDAwMDcsIDB4MDAwMiwgMHgxYjEyLCAweDFiNzQsIDB4MWIyOSwgMHgxYjI5LCAweDFiMjksIDB4MWI1YywKKwkweDFiM2MsIDB4MWIyYiwgMHg5MThjLCAweDAwZmYsIDB4OTE4NiwgMHgwMDA4LCAweDExNzAsIDB4YTg3YywKKwkweGQwYjQsIDB4MDkwNCwgMHgxZGE3LCAweDkwMDYsIDB4YTg0MiwgMHhhODNlLCAweGE5ODgsIDB4MjkwMCwKKwkweGE4NWEsIDB4YTgxMywgMHgxZmMzLCAweDA4MDQsIDB4MWI4NSwgMHg5MTg2LCAweDAwNDgsIDB4MDkwNCwKKwkweDFiNzQsIDB4MDgwYywgMHgwZGZhLCAweGE4N2MsIDB4ZDBiNCwgMHgwOTA0LCAweDFkYTcsIDB4YTg5MCwKKwkweGE4NDIsIDB4YTgzYSwgMHhhODhjLCAweGE4M2UsIDB4YTgzNiwgMHhhOGFjLCAweGE4NDYsIDB4YThiMCwKKwkweGE4NGEsIDB4YTk4OCwgMHgwODA0LCAweDFiN2MsIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwKKwkweDAwMWUsIDB4MWQzOCwgMHhhODdjLCAweGQwYjQsIDB4MDkwNCwgMHgxZGE3LCAweGE4OTAsIDB4YTg0MiwKKwkweGE4M2EsIDB4YTg4YywgMHhhODNlLCAweGE4MzYsIDB4YThhYywgMHhhODQ2LCAweGE4YjAsIDB4YTg0YSwKKwkweGE4MDQsIDB4YTg1YSwgMHgyMDQwLCAweGEwNjQsIDB4OTA4NCwgMHgwMDBmLCAweDkwODAsIDB4MWZjOCwKKwkweDIwMDUsIDB4YTgxMiwgMHhhOTg4LCAweDA0NDgsIDB4OTE4YywgMHgwMGZmLCAweDkxODYsIDB4MDAxNSwKKwkweDE1NDAsIDB4YTg3YywgMHhkMGI0LCAweDA5MDQsIDB4MWRhNywgMHhhODA0LCAweGE4NWEsIDB4MjA0MCwKKwkweGEwNjQsIDB4OTA4NCwgMHgwMDBmLCAweDkwODAsIDB4MWZjOCwgMHgyMDA1LCAweGE4MTIsIDB4YTk4OCwKKwkweDkwMDYsIDB4YTg0MiwgMHhhODNlLCAweDAwODgsIDB4YTg3YywgMHhkMGI0LCAweDA5MDQsIDB4MWRhNywKKwkweGE5ODgsIDB4OTAwNiwgMHhhODQyLCAweGE4M2UsIDB4MjkwMCwgMHhhODVhLCAweGE4NjQsIDB4OTA4NCwKKwkweDAwMGYsIDB4OTA4MCwgMHgxZmM4LCAweDIwMDUsIDB4YTgxMiwgMHhhOTE2LCAweGE4N2MsIDB4YzBkZCwKKwkweGE4N2UsIDB4MDAwNSwgMHgwMGY2LCAweDIwNzksIDB4MDA5MCwgMHg3ODJjLCAweGQwZmMsIDB4MTkwYywKKwkweDFkZWMsIDB4MDBlNiwgMHgyMDcxLCAweDFhM2QsIDB4NzAwMCwgMHg5MDA1LCAweDE5MDQsIDB4MWJmMiwKKwkweDcyMDYsIDB4OTI4MCwgMHgwMDA1LCAweDIwNGMsIDB4OTI4MCwgMHgwMDA0LCAweDIwMDQsIDB4NzgyYiwKKwkweDAwMDQsIDB4MDBmNiwgMHgyMDc5LCAweDAyMDAsIDB4NzgwMywgMHgwMDQwLCAweDAwZmUsIDB4MDBiNiwKKwkweDIwNTgsIDB4Yjg2YywgMHg3ODM2LCAweGI4OTAsIDB4MDBiZSwgMHgwMGY2LCAweDIwNzksIDB4MDIwMCwKKwkweDc4MDMsIDB4MDA0MCwgMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwgMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwKKwkweDc4MWEsIDB4MjA3OSwgMHgwMTAwLCAweDgwMDQsIDB4NzhkNiwgMHgwMGZlLCAweGE4MTQsIDB4MjA1MCwKKwkweGE4NTgsIDB4MjA0MCwgMHhhODEwLCAweDIwNjAsIDB4YTA2NCwgMHg5MGVjLCAweDAwMGYsIDB4YTk0NCwKKwkweDc5MWEsIDB4NzExNiwgMHhhODQ4LCAweDc4MWUsIDB4NzAxYSwgMHg5MDA2LCAweDcwMGUsIDB4NzAxMiwKKwkweDcwMDQsIDB4YTk0MCwgMHhhODM4LCAweDkxMDYsIDB4MTUwMCwgMHhhOTNjLCAweGE4MzQsIDB4OTEwNiwKKwkweDExZTAsIDB4MDAwNiwgMHgwMDE2LCAweGE5MzgsIDB4YTgzNCwgMHg5MTA1LCAweDAxMTgsIDB4MDAxZSwKKwkweDAwMGUsIDB4MDA5OCwgMHgwMDFlLCAweDAwMGUsIDB4OGFmZiwgMHgwMWM4LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjAwOSwgMHgwMzA2LCAweDIwMGIsIDB4MDgwOCwgMHgwMGQ5LCAweDAxMDgsIDB4MDBjOSwKKwkweDAxMmUsIDB4OTAwNiwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwMDM2LCAweDAwNDYsIDB4YWIzOCwKKwkweGFjMzQsIDB4MDgwYywgMHgxZmU4LCAweDAwNGUsIDB4MDAzZSwgMHgwZDMwLCAweDBjOTgsIDB4OTA4NSwKKwkweDAwMDEsIDB4MGM4MCwgMHgyMDA5LCAweDAzMDYsIDB4MjAwYiwgMHg0ODAwLCAweDcwMjcsIDB4MDAwMCwKKwkweDAwMDUsIDB4MDA3NiwgMHgwMDY2LCAweDAwNTYsIDB4MDA0NiwgMHgwMDM2LCAweDAwMjYsIDB4OGFmZiwKKwkweDA5MDQsIDB4MWRhMCwgMHg3MDBjLCAweDcyMTQsIDB4OTIzYSwgMHg3MDEwLCAweDcyMTgsIDB4OTIwMywKKwkweDBhMDQsIDB4MWQ5ZiwgMHg5NzA1LCAweDA5MDQsIDB4MWQ5ZiwgMHg5MDNlLCAweDI3MzAsIDB4YTg4MCwKKwkweGQwZmMsIDB4MTE5MCwgMHgyZDAwLCAweDAwMDIsIDB4MWQzNCwgMHgxYzc0LCAweDFjNzQsIDB4MWQzNCwKKwkweDFkMzQsIDB4MWQxMSwgMHgxZDM0LCAweDFjNzQsIDB4MWQxOCwgMHgxY2MzLCAweDFjYzMsIDB4MWQzNCwKKwkweDFkMzQsIDB4MWQzNCwgMHgxZDBiLCAweDFjYzMsIDB4YzBmYywgMHhhODgyLCAweGFiMmMsIDB4YWEzMCwKKwkweGFkMWMsIDB4YWMyMCwgMHhkZDljLCAweDA5MDQsIDB4MWQzNiwgMHgyYzA1LCAweDkwOGEsIDB4MDAzNCwKKwkweDFhMGMsIDB4MGRmYSwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHgxYzYwLCAweDFjNWUsIDB4MWM1ZSwKKwkweDFjNWUsIDB4MWM1ZSwgMHgxYzVlLCAweDFjNjQsIDB4MWM1ZSwgMHgxYzVlLCAweDFjNWUsIDB4MWM1ZSwKKwkweDFjNWUsIDB4MWM2OCwgMHgxYzVlLCAweDFjNWUsIDB4MWM1ZSwgMHgxYzVlLCAweDFjNWUsIDB4MWM2YywKKwkweDFjNWUsIDB4MWM1ZSwgMHgxYzVlLCAweDFjNWUsIDB4MWM1ZSwgMHgxYzcwLCAweDA4MGMsIDB4MGRmYSwKKwkweGE3NzQsIDB4YTY3OCwgMHgwODA0LCAweDFkMzYsIDB4YTc4YywgMHhhNjkwLCAweDA4MDQsIDB4MWQzNiwKKwkweGE3YTQsIDB4YTZhOCwgMHgwODA0LCAweDFkMzYsIDB4YTdiYywgMHhhNmMwLCAweDA4MDQsIDB4MWQzNiwKKwkweGE3ZDQsIDB4YTZkOCwgMHgwODA0LCAweDFkMzYsIDB4MmMwNSwgMHg5MDhhLCAweDAwMzYsIDB4MWEwYywKKwkweDBkZmEsIDB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4MWM5NywgMHgxYzk3LCAweDFjOTksIDB4MWM5NywKKwkweDFjOTcsIDB4MWM5NywgMHgxYzlmLCAweDFjOTcsIDB4MWM5NywgMHgxYzk3LCAweDFjYTUsIDB4MWM5NywKKwkweDFjOTcsIDB4MWM5NywgMHgxY2FiLCAweDFjOTcsIDB4MWM5NywgMHgxYzk3LCAweDFjYjEsIDB4MWM5NywKKwkweDFjOTcsIDB4MWM5NywgMHgxY2I3LCAweDFjOTcsIDB4MWM5NywgMHgxYzk3LCAweDFjYmQsIDB4MDgwYywKKwkweDBkZmEsIDB4YTU3NCwgMHhhNDc4LCAweGEzN2MsIDB4YTI4MCwgMHgwODA0LCAweDFkMzYsIDB4YTU4NCwKKwkweGE0ODgsIDB4YTM4YywgMHhhMjkwLCAweDA4MDQsIDB4MWQzNiwgMHhhNTk0LCAweGE0OTgsIDB4YTM5YywKKwkweGEyYTAsIDB4MDgwNCwgMHgxZDM2LCAweGE1YTQsIDB4YTRhOCwgMHhhM2FjLCAweGEyYjAsIDB4MDgwNCwKKwkweDFkMzYsIDB4YTViNCwgMHhhNGI4LCAweGEzYmMsIDB4YTJjMCwgMHgwODA0LCAweDFkMzYsIDB4YTVjNCwKKwkweGE0YzgsIDB4YTNjYywgMHhhMmQwLCAweDA4MDQsIDB4MWQzNiwgMHhhNWQ0LCAweGE0ZDgsIDB4YTNkYywKKwkweGEyZTAsIDB4MDgwNCwgMHgxZDM2LCAweDJjMDUsIDB4OTA4YSwgMHgwMDM0LCAweDFhMGMsIDB4MGRmYSwKKwkweDkwODIsIDB4MDAxYiwgMHgwMDAyLCAweDFjZTYsIDB4MWNlNCwgMHgxY2U0LCAweDFjZTQsIDB4MWNlNCwKKwkweDFjZTQsIDB4MWNlZSwgMHgxY2U0LCAweDFjZTQsIDB4MWNlNCwgMHgxY2U0LCAweDFjZTQsIDB4MWNmNiwKKwkweDFjZTQsIDB4MWNlNCwgMHgxY2U0LCAweDFjZTQsIDB4MWNlNCwgMHgxY2ZkLCAweDFjZTQsIDB4MWNlNCwKKwkweDFjZTQsIDB4MWNlNCwgMHgxY2U0LCAweDFkMDQsIDB4MDgwYywgMHgwZGZhLCAweGE1NmMsIDB4YTQ3MCwKKwkweGE3NzQsIDB4YTY3OCwgMHhhMzdjLCAweGEyODAsIDB4MDgwNCwgMHgxZDM2LCAweGE1ODQsIDB4YTQ4OCwKKwkweGE3OGMsIDB4YTY5MCwgMHhhMzk0LCAweGEyOTgsIDB4MDgwNCwgMHgxZDM2LCAweGE1OWMsIDB4YTRhMCwKKwkweGE3YTQsIDB4YTZhOCwgMHhhM2FjLCAweGEyYjAsIDB4MDRjOCwgMHhhNWI0LCAweGE0YjgsIDB4YTdiYywKKwkweGE2YzAsIDB4YTNjNCwgMHhhMmM4LCAweDA0OTAsIDB4YTVjYywgMHhhNGQwLCAweGE3ZDQsIDB4YTZkOCwKKwkweGEzZGMsIDB4YTJlMCwgMHgwNDU4LCAweGE4NjQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAxZSwKKwkweDE1MTgsIDB4MDgwYywgMHgxZjgwLCAweDE5MDQsIDB4MWMwZiwgMHg5MDBlLCAweDA4MDQsIDB4MWRhMCwKKwkweGFiNjQsIDB4OTM5YywgMHgwMGZmLCAweDkzODYsIDB4MDA0OCwgMHgxMTgwLCAweDAwYzYsIDB4NzAwNCwKKwkweDIwNjAsIDB4NjAwNCwgMHg5MDg2LCAweDAwNDMsIDB4MDBjZSwgMHgwOTA0LCAweDFjYzMsIDB4YWI5YywKKwkweDkwMTYsIDB4YWQ4YywgMHhhYzkwLCAweGFmOTQsIDB4YWU5OCwgMHgwMDQwLCAweDkzODYsIDB4MDAwOCwKKwkweDA5MDQsIDB4MWNjMywgMHgwODBjLCAweDBkZmEsIDB4MDgwYywgMHgwZGZhLCAweDIwMDksIDB4MDMwZiwKKwkweDIxMDQsIDB4ZDBmYywgMHgwNTMwLCAweDAwNjYsIDB4MjAwOSwgMHgwMzA2LCAweDIxMDQsIDB4OTA4NCwKKwkweDAwMzAsIDB4MTVjOCwgMHgyMDMxLCAweDEwMDAsIDB4MjAwYiwgMHg0MDAwLCAweDI2MDAsIDB4OTMwMiwKKwkweDkyOGIsIDB4MDAwMCwgMHhhODJlLCAweGE5MzIsIDB4MDI3OCwgMHg5MTA1LCAweDAxNjgsIDB4MjAxMSwKKwkweDAwMDAsIDB4MjYxOCwgMHgyNjAwLCAweDk1MDAsIDB4YTgxZSwgMHg5NDgxLCAweDAwMDAsIDB4YTgyMiwKKwkweGE4ODAsIDB4YzBmZCwgMHhhODgyLCAweDAwMjAsIDB4YTgyZiwgMHgwMDAwLCAweGE4MzMsIDB4MDAwMCwKKwkweDAwNmUsIDB4N2IxMiwgMHg3YTE2LCAweDdkMDIsIDB4N2MwNiwgMHg3ZjBhLCAweDdlMGUsIDB4NzgyYiwKKwkweDAwMDEsIDB4NzAwMCwgMHg4MDAwLCAweDcwMDIsIDB4YTgzYywgMHg5MzAwLCAweGE4M2UsIDB4YTg0MCwKKwkweDkyMDEsIDB4YTg0MiwgMHg3MDBjLCAweDkzMDAsIDB4NzAwZSwgMHg3MDEwLCAweDkyMDEsIDB4NzAxMiwKKwkweDA4MGMsIDB4MWY4MCwgMHgwNDI4LCAweDIwMzEsIDB4MDA4MCwgMHg5NTg0LCAweDAwN2YsIDB4MDEwOCwKKwkweDk2MzIsIDB4NzEyNCwgMHg3MDAwLCAweDkwODYsIDB4MDAwMCwgMHgxMTk4LCAweGMxODUsIDB4NzEyNiwKKwkweDIwMDksIDB4MDMwNiwgMHgyMTA0LCAweGQwYjQsIDB4MTkwNCwgMHgxZDQ2LCAweDIwMGIsIDB4NDA0MCwKKwkweDIwMDksIDB4MWE1NywgMHgyMTA0LCAweDgwMDAsIDB4MGEwNCwgMHgxZDQ2LCAweDIwMGEsIDB4MDgwNCwKKwkweDFkNDYsIDB4YzE4ZCwgMHg3MTI2LCAweGQxODQsIDB4MWQ1OCwgMHgwODA0LCAweDFkNDYsIDB4OTAwNiwKKwkweDAwMmUsIDB4MDAzZSwgMHgwMDRlLCAweDAwNWUsIDB4MDA2ZSwgMHgwMDdlLCAweDAwMDUsIDB4MDgwYywKKwkweDBkZmEsIDB4MDAyNiwgMHgyMDAxLCAweDAxMDUsIDB4MjAwMywgMHgwMDEwLCAweDc4MmIsIDB4MDAwNCwKKwkweDcwMDMsIDB4MDAwMCwgMHg3MDA0LCAweDAwMTYsIDB4MDgwYywgMHgxYzAyLCAweDAwMWUsIDB4MjA2MCwKKwkweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGJlMzcsIDB4MDExOCwgMHhhODgwLCAweGMwYmQsIDB4YTg4MiwKKwkweDYwMjAsIDB4OTA4NiwgMHgwMDA2LCAweDExODAsIDB4MjA2MSwgMHgwMTAwLCAweDYyYzgsIDB4MjAwMSwKKwkweDAwZmEsIDB4ODAwMSwgMHgxZGYwLCAweDYwYzgsIDB4OTIwNiwgMHgxZGMwLCAweDYwYzQsIDB4YTg5YSwKKwkweDYwYzgsIDB4YTg5NiwgMHg3MDA0LCAweDIwNjAsIDB4MDBjNiwgMHgwODBjLCAweGJhNTYsIDB4MDBjZSwKKwkweDIwMDEsIDB4MTljZSwgMHgyMDA0LCAweDljMDYsIDB4MTE2MCwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywKKwkweDIzMGEsIDB4MDgwYywgMHg5Yjg4LCAweDIwMTEsIDB4MDAwMCwgMHgwODBjLCAweDlhMTksIDB4MDgwYywKKwkweDhjZWQsIDB4MDAyZSwgMHgwODA0LCAweDFmMzAsIDB4MDEyNiwgMHgyMDkxLCAweDI0MDAsIDB4YTg1OCwKKwkweDIwNDAsIDB4NzkyYywgMHg3ODJiLCAweDAwMDIsIDB4OTE4NCwgMHgwNzAwLCAweDE5MDQsIDB4MWRhOSwKKwkweDcwMDAsIDB4MDAwMiwgMHgxZjMwLCAweDFkZmUsIDB4MWU3ZSwgMHgxZjJlLCAweDgwMDEsIDB4NzAwMiwKKwkweDcwMjcsIDB4MDAwMCwgMHhkMTljLCAweDExNTgsIDB4OGFmZiwgMHgwOTA0LCAweDFlNGIsIDB4MDgwYywKKwkweDFjMDksIDB4MDkwNCwgMHgxZjMwLCAweDA4MGMsIDB4MWMwOSwgMHgwODA0LCAweDFmMzAsIDB4NzgyYiwKKwkweDAwMDQsIDB4ZDE5NCwgMHgwMTQ4LCAweGE4ODAsIDB4YzBmYywgMHhhODgyLCAweDhhZmYsIDB4MTUxOCwKKwkweGE4N2MsIDB4YzBmNSwgMHhhODdlLCAweDAwZjgsIDB4MDAyNiwgMHgwMDM2LCAweGFiM2MsIDB4YWE0MCwKKwkweDAwMTYsIDB4NzkxMCwgMHhhODJjLCAweDkxMDAsIDB4YTgyZSwgMHg3OTE0LCAweGE4MzAsIDB4OTEwMSwKKwkweGE4MzIsIDB4MDAxZSwgMHg3ODEwLCAweDkzMWEsIDB4NzgxNCwgMHg5MjEzLCAweDc4MDAsIDB4YTgxZSwKKwkweDc4MDQsIDB4YTgyMiwgMHhhYjNlLCAweGFhNDIsIDB4MDAzZSwgMHgwMDJlLCAweDA4MGMsIDB4MWY5YiwKKwkweGE4ODAsIDB4YzBmZCwgMHhhODgyLCAweDJhMDAsIDB4YTgxNiwgMHgyODAwLCAweGE4NWEsIDB4MmMwMCwKKwkweGE4MTIsIDB4NzAwMywgMHgwMDAwLCAweDIwMDksIDB4MDMwNiwgMHgyMDBiLCAweDQ4MDAsIDB4NzAyNywKKwkweDAwMDAsIDB4MDgwNCwgMHgxZjMwLCAweDAwZjYsIDB4MDAyNiwgMHg3ODFjLCAweDAwMDYsIDB4NzgxOCwKKwkweDAwMDYsIDB4MjA3OSwgMHgwMTAwLCAweDdhMTQsIDB4OTI4NCwgMHgxOTg0LCAweDkwODUsIDB4MDAxMiwKKwkweDc4MTYsIDB4MDAzNiwgMHgyMDE5LCAweDEwMDAsIDB4ODMxOSwgMHgwOTBjLCAweDBkZmEsIDB4NzgyMCwKKwkweGQwYmMsIDB4MWRkMCwgMHgwMDNlLCAweDc5YzgsIDB4MDAwZSwgMHg5MTAyLCAweDAwMWUsIDB4MDAwNiwKKwkweDAwMTYsIDB4NzljNCwgMHgwMDBlLCAweDkxMDMsIDB4NzhjNiwgMHgwMDBlLCAweDc4Y2EsIDB4OTI4NCwKKwkweDE5ODQsIDB4OTA4NSwgMHgwMDEyLCAweDc4MTYsIDB4MDAyZSwgMHgwMGZlLCAweDc4MmIsIDB4MDAwOCwKKwkweDcwMDMsIDB4MDAwMCwgMHgwODBjLCAweDFjMDIsIDB4MDgwNCwgMHgxZjMwLCAweDgwMDEsIDB4NzAwMiwKKwkweDcwMjQsIDB4ODAwNCwgMHg3MDI2LCAweGQxOTQsIDB4MDE3MCwgMHg3ODJjLCAweGQwZmMsIDB4MTkwNCwKKwkweDFkZjEsIDB4ZDE5YywgMHgxOTA0LCAweDFmMmMsIDB4OGFmZiwgMHgwOTA0LCAweDFmMzAsIDB4MDgwYywKKwkweDFjMDksIDB4MDgwNCwgMHgxZjMwLCAweDAwMjYsIDB4MDAzNiwgMHhhYjNjLCAweGFhNDAsIDB4MDgwYywKKwkweDFmOWIsIDB4ZGQ5YywgMHgxOTA0LCAweDFlZWIsIDB4MmMwNSwgMHg5MDhhLCAweDAwMzYsIDB4MWEwYywKKwkweDBkZmEsIDB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4MWViZiwgMHgxZWJmLCAweDFlYzEsIDB4MWViZiwKKwkweDFlYmYsIDB4MWViZiwgMHgxZWM3LCAweDFlYmYsIDB4MWViZiwgMHgxZWJmLCAweDFlY2QsIDB4MWViZiwKKwkweDFlYmYsIDB4MWViZiwgMHgxZWQzLCAweDFlYmYsIDB4MWViZiwgMHgxZWJmLCAweDFlZDksIDB4MWViZiwKKwkweDFlYmYsIDB4MWViZiwgMHgxZWRmLCAweDFlYmYsIDB4MWViZiwgMHgxZWJmLCAweDFlZTUsIDB4MDgwYywKKwkweDBkZmEsIDB4YTA3YywgMHg5MzFhLCAweGEwODAsIDB4OTIxMywgMHgwODA0LCAweDFlMjAsIDB4YTA4YywKKwkweDkzMWEsIDB4YTA5MCwgMHg5MjEzLCAweDA4MDQsIDB4MWUyMCwgMHhhMDljLCAweDkzMWEsIDB4YTBhMCwKKwkweDkyMTMsIDB4MDgwNCwgMHgxZTIwLCAweGEwYWMsIDB4OTMxYSwgMHhhMGIwLCAweDkyMTMsIDB4MDgwNCwKKwkweDFlMjAsIDB4YTBiYywgMHg5MzFhLCAweGEwYzAsIDB4OTIxMywgMHgwODA0LCAweDFlMjAsIDB4YTBjYywKKwkweDkzMWEsIDB4YTBkMCwgMHg5MjEzLCAweDA4MDQsIDB4MWUyMCwgMHhhMGRjLCAweDkzMWEsIDB4YTBlMCwKKwkweDkyMTMsIDB4MDgwNCwgMHgxZTIwLCAweDJjMDUsIDB4OTA4YSwgMHgwMDM0LCAweDFhMGMsIDB4MGRmYSwKKwkweDkwODIsIDB4MDAxYiwgMHgwMDAyLCAweDFmMGUsIDB4MWYwYywgMHgxZjBjLCAweDFmMGMsIDB4MWYwYywKKwkweDFmMGMsIDB4MWYxNCwgMHgxZjBjLCAweDFmMGMsIDB4MWYwYywgMHgxZjBjLCAweDFmMGMsIDB4MWYxYSwKKwkweDFmMGMsIDB4MWYwYywgMHgxZjBjLCAweDFmMGMsIDB4MWYwYywgMHgxZjIwLCAweDFmMGMsIDB4MWYwYywKKwkweDFmMGMsIDB4MWYwYywgMHgxZjBjLCAweDFmMjYsIDB4MDgwYywgMHgwZGZhLCAweGEwN2MsIDB4OTMxYSwKKwkweGEwODAsIDB4OTIxMywgMHgwODA0LCAweDFlMjAsIDB4YTA5NCwgMHg5MzFhLCAweGEwOTgsIDB4OTIxMywKKwkweDA4MDQsIDB4MWUyMCwgMHhhMGFjLCAweDkzMWEsIDB4YTBiMCwgMHg5MjEzLCAweDA4MDQsIDB4MWUyMCwKKwkweGEwYzQsIDB4OTMxYSwgMHhhMGM4LCAweDkyMTMsIDB4MDgwNCwgMHgxZTIwLCAweGEwZGMsIDB4OTMxYSwKKwkweGEwZTAsIDB4OTIxMywgMHgwODA0LCAweDFlMjAsIDB4MDgwNCwgMHgxZTFjLCAweDA4MGMsIDB4MGRmYSwKKwkweDAxMmUsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MjA3MSwgMHgxYTNkLCAweDcwMDAsIDB4OTA4NiwKKwkweDAwMDAsIDB4MDkwNCwgMHgxZjdiLCAweDIwNzksIDB4MDA5MCwgMHgyMDA5LCAweDAyMDcsIDB4MjEwYywKKwkweGQxOTQsIDB4MDFiOCwgMHgyMDA5LCAweDAyMGMsIDB4MjEwYywgMHg5MTg0LCAweDAwMDMsIDB4MDE4OCwKKwkweDA4MGMsIDB4ZGMzNCwgMHgyMDAxLCAweDAxMzMsIDB4MjAwNCwgMHg5MDA1LCAweDA5MGMsIDB4MGRmYSwKKwkweDAwMTYsIDB4MjAwOSwgMHgwMDQwLCAweDA4MGMsIDB4MjMwYSwgMHgwMDFlLCAweDIwMDEsIDB4MDIwYywKKwkweDIxMDIsIDB4MjAwOSwgMHgwMjA2LCAweDIxMDQsIDB4MjAwOSwgMHgwMjAzLCAweDIxMGMsIDB4OTEwNiwKKwkweDExMjAsIDB4MjAwOSwgMHgwMDQwLCAweDA4MGMsIDB4MjMwYSwgMHg3ODJjLCAweGQwZmMsIDB4MDlhOCwKKwkweDA4MGMsIDB4MWRlYywgMHg3MDAwLCAweDkwODYsIDB4MDAwMCwgMHgxOTc4LCAweDc4MmIsIDB4MDAwNCwKKwkweDc4MmMsIDB4ZDBhYywgMHgxZGU4LCAweDIwMDksIDB4MDA0MCwgMHgwODBjLCAweDIzMGEsIDB4NzgyYiwKKwkweDAwMDIsIDB4NzAwMywgMHgwMDAwLCAweDA4MGMsIDB4MWMwMiwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwKKwkweGE4ODAsIDB4ZDBmYywgMHgxMWE4LCAweDhjNjAsIDB4MmMwNSwgMHg5MDA1LCAweDAxMTAsIDB4OGE1MSwKKwkweDAwMDUsIDB4YTAwNCwgMHg5MDA1LCAweDAxNjgsIDB4YTg1YSwgMHgyMDQwLCAweGEwNjQsIDB4OTA4NCwKKwkweDAwMGYsIDB4OTA4MCwgMHgxZmM4LCAweDIwNjUsIDB4OGNmZiwgMHgwOTBjLCAweDBkZmEsIDB4OGE1MSwKKwkweDAwMDUsIDB4MjA1MCwgMHgwMDA1LCAweGE4ODAsIDB4ZDBmYywgMHgxMWI4LCAweDhhNTAsIDB4OGM2MSwKKwkweDJjMDUsIDB4OTAwNSwgMHgxMTkwLCAweDI4MDAsIDB4OTkwNiwgMHgwMTIwLCAweGEwMDAsIDB4OTAwNSwKKwkweDExMDgsIDB4MjkwMCwgMHgyMDQwLCAweGE4NWEsIDB4YTA2NCwgMHg5MDg0LCAweDAwMGYsIDB4OTA4MCwKKwkweDFmZDgsIDB4MjA2NSwgMHg4Y2ZmLCAweDA5MGMsIDB4MGRmYSwgMHgwMDA1LCAweDAwMDAsIDB4MDAxZCwKKwkweDAwMjEsIDB4MDAyNSwgMHgwMDI5LCAweDAwMmQsIDB4MDAzMSwgMHgwMDM1LCAweDAwMDAsIDB4MDAxYiwKKwkweDAwMjEsIDB4MDAyNywgMHgwMDJkLCAweDAwMzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMjMsIDB4MDAwMCwKKwkweDAwMDAsIDB4MWZiYiwgMHgxZmI3LCAweDAwMDAsIDB4MDAwMCwgMHgxZmM1LCAweDAwMDAsIDB4MWZiYiwKKwkweDFmYzIsIDB4MWZjMiwgMHgxZmJmLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDFmYzUsIDB4MWZjMiwKKwkweDAwMDAsIDB4MWZiZCwgMHgxZmJkLCAweDAwMDAsIDB4MDAwMCwgMHgxZmM1LCAweDAwMDAsIDB4MWZiZCwKKwkweDFmYzMsIDB4MWZjMywgMHgxZmMzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDFmYzUsIDB4MWZjMywKKwkweDAwYzYsIDB4MDBkNiwgMHgwMDg2LCAweGFiNDIsIDB4YWMzZSwgMHhhODg4LCAweDkwNTUsIDB4MDkwNCwKKwkweDIxYzcsIDB4Mjk0MCwgMHhhMDY0LCAweDkwZWMsIDB4MDAwZiwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwKKwkweDAwMDgsIDB4MTExOCwgMHgyMDYxLCAweDFmYzMsIDB4MDBkMCwgMHg5ZGUwLCAweDFmYzgsIDB4OWQ4NiwKKwkweDAwMDcsIDB4MDEzMCwgMHg5ZDg2LCAweDAwMGUsIDB4MDExOCwgMHg5ZDg2LCAweDAwMGYsIDB4MTEyMCwKKwkweGEwOGMsIDB4OTQyMiwgMHhhMDkwLCAweDkzMWIsIDB4MmMwNSwgMHg5MDY1LCAweDExNDAsIDB4MDMxMCwKKwkweDA4MDQsIDB4MjFjNywgMHhhMDA0LCAweDkwNDUsIDB4MDkwNCwgMHgyMWM3LCAweDA4ZDgsIDB4MmMwNSwKKwkweDkwMDUsIDB4MDkwNCwgMHgyMGFmLCAweGRkOWMsIDB4MTkwNCwgMHgyMDZiLCAweDkwOGEsIDB4MDAzNiwKKwkweDFhMGMsIDB4MGRmYSwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHgyMDQwLCAweDIwNDAsIDB4MjA0MiwKKwkweDIwNDAsIDB4MjA0MCwgMHgyMDQwLCAweDIwNDgsIDB4MjA0MCwgMHgyMDQwLCAweDIwNDAsIDB4MjA0ZSwKKwkweDIwNDAsIDB4MjA0MCwgMHgyMDQwLCAweDIwNTQsIDB4MjA0MCwgMHgyMDQwLCAweDIwNDAsIDB4MjA1YSwKKwkweDIwNDAsIDB4MjA0MCwgMHgyMDQwLCAweDIwNjAsIDB4MjA0MCwgMHgyMDQwLCAweDIwNDAsIDB4MjA2NiwKKwkweDA4MGMsIDB4MGRmYSwgMHhhMDdjLCAweDk0MjIsIDB4YTA4MCwgMHg5MzFiLCAweDA4MDQsIDB4MjBhNSwKKwkweGEwOGMsIDB4OTQyMiwgMHhhMDkwLCAweDkzMWIsIDB4MDgwNCwgMHgyMGE1LCAweGEwOWMsIDB4OTQyMiwKKwkweGEwYTAsIDB4OTMxYiwgMHgwODA0LCAweDIwYTUsIDB4YTBhYywgMHg5NDIyLCAweGEwYjAsIDB4OTMxYiwKKwkweDA4MDQsIDB4MjBhNSwgMHhhMGJjLCAweDk0MjIsIDB4YTBjMCwgMHg5MzFiLCAweDA4MDQsIDB4MjBhNSwKKwkweGEwY2MsIDB4OTQyMiwgMHhhMGQwLCAweDkzMWIsIDB4MDgwNCwgMHgyMGE1LCAweGEwZGMsIDB4OTQyMiwKKwkweGEwZTAsIDB4OTMxYiwgMHgwNGQwLCAweDkwOGEsIDB4MDAzNCwgMHgxYTBjLCAweDBkZmEsIDB4OTA4MiwKKwkweDAwMWIsIDB4MDAwMiwgMHgyMDhkLCAweDIwOGIsIDB4MjA4YiwgMHgyMDhiLCAweDIwOGIsIDB4MjA4YiwKKwkweDIwOTIsIDB4MjA4YiwgMHgyMDhiLCAweDIwOGIsIDB4MjA4YiwgMHgyMDhiLCAweDIwOTcsIDB4MjA4YiwKKwkweDIwOGIsIDB4MjA4YiwgMHgyMDhiLCAweDIwOGIsIDB4MjA5YywgMHgyMDhiLCAweDIwOGIsIDB4MjA4YiwKKwkweDIwOGIsIDB4MjA4YiwgMHgyMGExLCAweDA4MGMsIDB4MGRmYSwgMHhhMDdjLCAweDk0MjIsIDB4YTA4MCwKKwkweDkzMWIsIDB4MDA5OCwgMHhhMDk0LCAweDk0MjIsIDB4YTA5OCwgMHg5MzFiLCAweDAwNzAsIDB4YTBhYywKKwkweDk0MjIsIDB4YTBiMCwgMHg5MzFiLCAweDAwNDgsIDB4YTBjNCwgMHg5NDIyLCAweGEwYzgsIDB4OTMxYiwKKwkweDAwMjAsIDB4YTBkYywgMHg5NDIyLCAweGEwZTAsIDB4OTMxYiwgMHgwNjMwLCAweDIzMDAsIDB4OTQwNSwKKwkweDAxNjAsIDB4OGE1MSwgMHgwOTA0LCAweDIxYzcsIDB4OGM2MCwgMHgwODA0LCAweDIwMTcsIDB4YTAwNCwKKwkweDkwNDUsIDB4MDkwNCwgMHgyMWM3LCAweDA4MDQsIDB4MWZmMiwgMHg4YTUxLCAweDA5MDQsIDB4MjFjNywKKwkweDhjNjAsIDB4MmMwNSwgMHg5MDA1LCAweDExNTgsIDB4YTAwNCwgMHg5MDQ1LCAweDA5MDQsIDB4MjFjNywKKwkweGEwNjQsIDB4OTBlYywgMHgwMDBmLCAweDlkZTAsIDB4MWZjOCwgMHgyYzA1LCAweDIwNjAsIDB4YTg4MCwKKwkweGMwZmMsIDB4YTg4MiwgMHgwODA0LCAweDIxYmMsIDB4MmMwNSwgMHg4NDIyLCAweDg0MjAsIDB4ODMxYSwKKwkweDkzOTksIDB4MDAwMCwgMHhhYzJlLCAweGFiMzIsIDB4ZGQ5YywgMHgxOTA0LCAweDIxNTksIDB4OTA4MiwKKwkweDAwMWIsIDB4MDAwMiwgMHgyMGY1LCAweDIwZjUsIDB4MjBmNywgMHgyMGY1LCAweDIwZjUsIDB4MjBmNSwKKwkweDIxMDUsIDB4MjBmNSwgMHgyMGY1LCAweDIwZjUsIDB4MjExMywgMHgyMGY1LCAweDIwZjUsIDB4MjBmNSwKKwkweDIxMjEsIDB4MjBmNSwgMHgyMGY1LCAweDIwZjUsIDB4MjEyZiwgMHgyMGY1LCAweDIwZjUsIDB4MjBmNSwKKwkweDIxM2QsIDB4MjBmNSwgMHgyMGY1LCAweDIwZjUsIDB4MjE0YiwgMHgwODBjLCAweDBkZmEsIDB4YTE3YywKKwkweDI0MDAsIDB4OTEyMiwgMHhhMTgwLCAweDIzMDAsIDB4OTExYiwgMHgwYTBjLCAweDBkZmEsIDB4YTA3NCwKKwkweDk0MjAsIDB4YTA3OCwgMHg5MzE5LCAweDA4MDQsIDB4MjFiNywgMHhhMThjLCAweDI0MDAsIDB4OTEyMiwKKwkweGExOTAsIDB4MjMwMCwgMHg5MTFiLCAweDBhMGMsIDB4MGRmYSwgMHhhMDg0LCAweDk0MjAsIDB4YTA4OCwKKwkweDkzMTksIDB4MDgwNCwgMHgyMWI3LCAweGExOWMsIDB4MjQwMCwgMHg5MTIyLCAweGExYTAsIDB4MjMwMCwKKwkweDkxMWIsIDB4MGEwYywgMHgwZGZhLCAweGEwOTQsIDB4OTQyMCwgMHhhMDk4LCAweDkzMTksIDB4MDgwNCwKKwkweDIxYjcsIDB4YTFhYywgMHgyNDAwLCAweDkxMjIsIDB4YTFiMCwgMHgyMzAwLCAweDkxMWIsIDB4MGEwYywKKwkweDBkZmEsIDB4YTBhNCwgMHg5NDIwLCAweGEwYTgsIDB4OTMxOSwgMHgwODA0LCAweDIxYjcsIDB4YTFiYywKKwkweDI0MDAsIDB4OTEyMiwgMHhhMWMwLCAweDIzMDAsIDB4OTExYiwgMHgwYTBjLCAweDBkZmEsIDB4YTBiNCwKKwkweDk0MjAsIDB4YTBiOCwgMHg5MzE5LCAweDA4MDQsIDB4MjFiNywgMHhhMWNjLCAweDI0MDAsIDB4OTEyMiwKKwkweGExZDAsIDB4MjMwMCwgMHg5MTFiLCAweDBhMGMsIDB4MGRmYSwgMHhhMGM0LCAweDk0MjAsIDB4YTBjOCwKKwkweDkzMTksIDB4MDgwNCwgMHgyMWI3LCAweGExZGMsIDB4MjQwMCwgMHg5MTIyLCAweGExZTAsIDB4MjMwMCwKKwkweDkxMWIsIDB4MGEwYywgMHgwZGZhLCAweGEwZDQsIDB4OTQyMCwgMHhhMGQ4LCAweDkzMTksIDB4MDgwNCwKKwkweDIxYjcsIDB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4MjE3NywgMHgyMTc1LCAweDIxNzUsIDB4MjE3NSwKKwkweDIxNzUsIDB4MjE3NSwgMHgyMTg0LCAweDIxNzUsIDB4MjE3NSwgMHgyMTc1LCAweDIxNzUsIDB4MjE3NSwKKwkweDIxOTEsIDB4MjE3NSwgMHgyMTc1LCAweDIxNzUsIDB4MjE3NSwgMHgyMTc1LCAweDIxOWUsIDB4MjE3NSwKKwkweDIxNzUsIDB4MjE3NSwgMHgyMTc1LCAweDIxNzUsIDB4MjFhYiwgMHgwODBjLCAweDBkZmEsIDB4YTE3YywKKwkweDI0MDAsIDB4OTEyMiwgMHhhMTgwLCAweDIzMDAsIDB4OTExYiwgMHgwYTBjLCAweDBkZmEsIDB4YTA2YywKKwkweDk0MjAsIDB4YTA3MCwgMHg5MzE5LCAweDA0OTgsIDB4YTE5NCwgMHgyNDAwLCAweDkxMjIsIDB4YTE5OCwKKwkweDIzMDAsIDB4OTExYiwgMHgwYTBjLCAweDBkZmEsIDB4YTA4NCwgMHg5NDIwLCAweGEwODgsIDB4OTMxOSwKKwkweDA0MzAsIDB4YTFhYywgMHgyNDAwLCAweDkxMjIsIDB4YTFiMCwgMHgyMzAwLCAweDkxMWIsIDB4MGEwYywKKwkweDBkZmEsIDB4YTA5YywgMHg5NDIwLCAweGEwYTAsIDB4OTMxOSwgMHgwMGM4LCAweGExYzQsIDB4MjQwMCwKKwkweDkxMjIsIDB4YTFjOCwgMHgyMzAwLCAweDkxMWIsIDB4MGEwYywgMHgwZGZhLCAweGEwYjQsIDB4OTQyMCwKKwkweGEwYjgsIDB4OTMxOSwgMHgwMDYwLCAweGExZGMsIDB4MjQwMCwgMHg5MTIyLCAweGExZTAsIDB4MjMwMCwKKwkweDkxMWIsIDB4MGEwYywgMHgwZGZhLCAweGEwY2MsIDB4OTQyMCwgMHhhMGQwLCAweDkzMTksIDB4YWMxZSwKKwkweGFiMjIsIDB4YTg4MCwgMHhjMGZkLCAweGE4ODIsIDB4MjgwMCwgMHhhODVhLCAweDJjMDAsIDB4YTgxMiwKKwkweDJhMDAsIDB4YTgxNiwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHg5MDA2LCAweDAwMjgsIDB4MDA4ZSwKKwkweDAwZGUsIDB4MDBjZSwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgyMDAxLCAweDAwMDUsIDB4MjAwNCwKKwkweGQwYmMsIDB4MTkwYywgMHgwZGYzLCAweDkwODQsIDB4MDAwNywgMHgwMDAyLCAweDIxZTgsIDB4MWRlYywKKwkweDIxZTgsIDB4MjFkZSwgMHgyMWUxLCAweDIxZTQsIDB4MjFlMSwgMHgyMWU0LCAweDA4MGMsIDB4MWRlYywKKwkweDAwMDUsIDB4MDgwYywgMHgxMWU4LCAweDAwMDUsIDB4MDgwYywgMHgxZGVjLCAweDA4MGMsIDB4MTFlOCwKKwkweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDI2MDAsIDB4MjA3OSwgMHgwMjAwLCAweDIwNzEsIDB4MDI2MCwKKwkweDIwNjksIDB4MTgwMCwgMHg3ODE3LCAweDAwMDAsIDB4Nzg5YiwgMHgwODE0LCAweDc4YTMsIDB4MDQwNiwKKwkweDc4OWYsIDB4MDQxMCwgMHgyMDA5LCAweDAxM2IsIDB4MjAwYiwgMHgwNDAwLCAweDc4MWIsIDB4MDAwMiwKKwkweDc4M2IsIDB4MDAxZiwgMHg3ODM3LCAweDAwMjAsIDB4NzgwMywgMHgxNjAwLCAweDAxMmUsIDB4MDAwNSwKKwkweDIwOTEsIDB4MjYwMCwgMHg3ODFjLCAweGQwYTQsIDB4MTkwYywgMHgyMzA3LCAweDc5MDAsIDB4ZDFkYywKKwkweDExMTgsIDB4OTA4NCwgMHgwMDA2LCAweDAwMWEsIDB4OTA4NCwgMHgwMDBlLCAweDAwMDIsIDB4MjIyZiwKKwkweDIyMjcsIDB4N2JiNCwgMHgyMjI3LCAweDIyMjksIDB4MjIyOSwgMHgyMjI5LCAweDIyMjksIDB4N2I5YSwKKwkweDIyMjcsIDB4MjIyYiwgMHgyMjI3LCAweDIyMjksIDB4MjIyNywgMHgyMjI5LCAweDIyMjcsIDB4MDgwYywKKwkweDBkZmEsIDB4MDAzMSwgMHgwMDIwLCAweDA4MGMsIDB4N2I5YSwgMHgwODBjLCAweDdiYjQsIDB4MDAwNSwKKwkweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDA4MGMsIDB4ZGMzNCwgMHg3OTMwLCAweDkxODQsIDB4MDAwMywKKwkweDAxYzAsIDB4MjAwMSwgMHgxOWNlLCAweDIwMDQsIDB4OTAwNSwgMHgwMTcwLCAweDIwMDEsIDB4MDEzMywKKwkweDIwMDQsIDB4OTAwNSwgMHgwOTBjLCAweDBkZmEsIDB4MDBjNiwgMHgyMDAxLCAweDE5Y2UsIDB4MjA2NCwKKwkweDA4MGMsIDB4YmE1NiwgMHgwMGNlLCAweDAwZjgsIDB4MjAwOSwgMHgwMDQwLCAweDA4MGMsIDB4MjMwYSwKKwkweDAwZDAsIDB4OTE4NCwgMHgwMDE0LCAweDAxYTAsIDB4NmEwMCwgMHg5Mjg2LCAweDAwMDMsIDB4MDE2MCwKKwkweDA4MGMsIDB4NzIwNywgMHgxMTM4LCAweDA4MGMsIDB4NzUwNCwgMHgwODBjLCAweDVmMmIsIDB4MDgwYywKKwkweDcxMjcsIDB4MDAxMCwgMHgwODBjLCAweDVkZWEsIDB4MDgwYywgMHg3YzYzLCAweDAwNDEsIDB4MDAxOCwKKwkweDkxODQsIDB4OTU0MCwgMHgxZGM4LCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBlNiwKKwkweDAwMzYsIDB4MDA0NiwgMHgwMDU2LCAweDIwNzEsIDB4MWEzYSwgMHgwODBjLCAweDE5ZmYsIDB4MDA1ZSwKKwkweDAwNGUsIDB4MDAzZSwgMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDJlMDAsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzEyOCwgMHgyMDAxLCAweDE5NDcsIDB4MjEwMiwgMHgyMDAxLCAweDE5NGYsIDB4MjEwMiwKKwkweDIwMDEsIDB4MDEzYiwgMHgyMTAyLCAweDIwNzksIDB4MDIwMCwgMHgyMDAxLCAweDAyMDEsIDB4Nzg5ZSwKKwkweDc4YTMsIDB4MDIwMCwgMHg5MTk4LCAweDAwMDcsIDB4ODMxYywgMHg4MzFjLCAweDgzMWMsIDB4OTM5OCwKKwkweDAwMDUsIDB4MjMyMCwgMHg5MTgyLCAweDAyMDQsIDB4MTIzMCwgMHgyMDExLCAweDAwMDgsIDB4ODQyMywKKwkweDg0MjMsIDB4ODQyMywgMHgwNDg4LCAweDkxODIsIDB4MDI0YywgMHgxMjQwLCAweDIwMTEsIDB4MDAwNywKKwkweDg0MDMsIDB4ODAwMywgMHg5NDAwLCAweDk0MDAsIDB4OTQyMCwgMHgwNDMwLCAweDkxODIsIDB4MDJiYywKKwkweDEyMzgsIDB4MjAxMSwgMHgwMDA2LCAweDg0MDMsIDB4ODAwMywgMHg5NDAwLCAweDk0MjAsIDB4MDBlMCwKKwkweDkxODIsIDB4MDM0YywgMHgxMjMwLCAweDIwMTEsIDB4MDAwNSwgMHg4NDAzLCAweDgwMDMsIDB4OTQyMCwKKwkweDAwOTgsIDB4OTE4MiwgMHgwNDJjLCAweDEyMjgsIDB4MjAxMSwgMHgwMDA0LCAweDg0MjMsIDB4ODQyMywKKwkweDAwNTgsIDB4OTE4MiwgMHgwNTljLCAweDEyMjgsIDB4MjAxMSwgMHgwMDAzLCAweDg0MDMsIDB4OTQyMCwKKwkweDAwMTgsIDB4MjAxMSwgMHgwMDAyLCAweDg0MjMsIDB4OTQ4MiwgMHgwMjI4LCAweDgwMDIsIDB4ODAyMCwKKwkweDgzMDEsIDB4OTQwMiwgMHgwMTEwLCAweDAyMDgsIDB4ODMyMSwgMHg4MjE3LCAweDgyMDMsIDB4OTQwNSwKKwkweDc4OWEsIDB4MDEyZSwgMHgwMDA1LCAweDAwMDYsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsIDB4NjgxNCwKKwkweDkwODQsIDB4ZmZjMCwgMHg5MTBkLCAweDY5MTYsIDB4MDBkZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBkNiwKKwkweDIwNjksIDB4MDIwMCwgMHg5MDA1LCAweDY4MTAsIDB4MDExMCwgMHhjMGE1LCAweDAwMDgsIDB4YzBhNCwKKwkweDY4MTIsIDB4MDBkZSwgMHgwMDA1LCAweDAwMDYsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsIDB4NjgxMCwKKwkweDkwODQsIDB4ZmZmOCwgMHg5MTBkLCAweDY5MTIsIDB4MDBkZSwgMHgwMDBlLCAweDAwMDUsIDB4NzkzOCwKKwkweDA4MGMsIDB4MGRmMywgMHgwMGY2LCAweDIwNzksIDB4MDIwMCwgMHg3OTAyLCAweGEwMDEsIDB4YTAwMSwKKwkweGEwMDEsIDB4YTAwMSwgMHhhMDAxLCAweGEwMDEsIDB4NzkwMiwgMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwKKwkweGEwMDEsIDB4YTAwMSwgMHhhMDAxLCAweDAwZmUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwKKwkweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweDE4MDAsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4MmJiNiwKKwkweDA4MGMsIDB4MmE4OSwgMHgyMDAxLCAweDAxMDAsIDB4MjAwNCwgMHg5MDg2LCAweDAwMGEsIDB4MDU1OCwKKwkweDYwNTQsIDB4ODAwNCwgMHg4MDA0LCAweDgwMDQsIDB4ODAwNCwgMHg5MDg0LCAweDAwMGMsIDB4NjE1MCwKKwkweDkxOGMsIDB4ZmZmMywgMHg5MTA1LCAweDYwNTIsIDB4NjA1MCwgMHg5MDg0LCAweGIxN2YsIDB4OTA4NSwKKwkweDIwMDAsIDB4NjA1MiwgMHgyMDA5LCAweDE5NzUsIDB4MjAxMSwgMHgxOTc2LCAweDYzNTgsIDB4OTM5YywKKwkweDM4ZjAsIDB4MjMyMCwgMHgwODBjLCAweDJhZjYsIDB4MTIzOCwgMHg5MzlkLCAweDQwMDMsIDB4OTRhNSwKKwkweDg2MDMsIDB4MjMwYSwgMHgyNDEyLCAweDAwMzAsIDB4OTM5ZCwgMHgwMjAzLCAweDk0YTUsIDB4ODYwMywKKwkweDIzMGEsIDB4MjQxMiwgMHgwMDUwLCAweDIwMDEsIDB4MTk3NSwgMHgyMDAzLCAweDA3MDAsIDB4MjAwMSwKKwkweDE5NzYsIDB4MjAwMywgMHgwNzAwLCAweDA4MGMsIDB4MmNjMiwgMHg5MDA2LCAweDA4MGMsIDB4MmFiOCwKKwkweDkwMDYsIDB4MDgwYywgMHgyYTliLCAweDIwYTksIDB4MDAxMiwgMHgxZDA0LCAweDIzNmQsIDB4MjA5MSwKKwkweDYwMDAsIDB4MWYwNCwgMHgyMzZkLCAweDYwMmYsIDB4MDEwMCwgMHg2MDJmLCAweDAwMDAsIDB4NjA1MCwKKwkweDkwODUsIDB4MDQwMCwgMHg5MDg0LCAweGRmZmYsIDB4NjA1MiwgMHg2MDI0LCAweDYwMjYsIDB4MDgwYywKKwkweDI3YTcsIDB4MjAwOSwgMHgwMGVmLCAweDYxMzIsIDB4NjEzNiwgMHgwODBjLCAweDI3YjcsIDB4NjBlNywKKwkweDAwMDAsIDB4NjFlYSwgMHg2MGUzLCAweDAwMDIsIDB4NjA0YiwgMHhmN2Y3LCAweDYwNDMsIDB4MDAwMCwKKwkweDYwMmYsIDB4MDA4MCwgMHg2MDJmLCAweDAwMDAsIDB4NjAwNywgMHgxNDlmLCAweDYwYmIsIDB4MDAwMCwKKwkweDIwYTksIDB4MDAxOCwgMHg2MGJmLCAweDAwMDAsIDB4MWYwNCwgMHgyMzlhLCAweDYwYmIsIDB4MDAwMCwKKwkweDYwYmYsIDB4MDEwOCwgMHg2MGJmLCAweDAwMTIsIDB4NjBiZiwgMHgwMzIwLCAweDYwYmYsIDB4MDAxOCwKKwkweDYwMWIsIDB4MDBmMCwgMHg2MDFmLCAweDAwMWUsIDB4NjAwZiwgMHgwMDZiLCAweDYwMmIsIDB4NDAyZiwKKwkweDAxMmUsIDB4MDAwNSwgMHgwMGY2LCAweDIwNzksIDB4MDE0MCwgMHg3OGMzLCAweDAwODAsIDB4NzhjMywKKwkweDAwODMsIDB4NzhjMywgMHgwMDAwLCAweDAwZmUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MzQsIDB4MjAwMywKKwkweDAwMDAsIDB4MjAwMSwgMHgxODMzLCAweDIwMDMsIDB4MDAwMSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwKKwkweDI4MDAsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4NjEyNCwgMHg5MTg0LCAweDVlMmMsIDB4MTExOCwKKwkweDkxODQsIDB4MDAwNywgMHgwMDJhLCAweDkxOTUsIDB4MDAwNCwgMHg5Mjg0LCAweDAwMDcsIDB4MDAwMiwKKwkweDIzZmEsIDB4MjNlMCwgMHgyM2UzLCAweDIzZTYsIDB4MjNlYiwgMHgyM2VkLCAweDIzZjEsIDB4MjNmNSwKKwkweDA4MGMsIDB4ODU2MywgMHgwMGI4LCAweDA4MGMsIDB4ODYzMiwgMHgwMGEwLCAweDA4MGMsIDB4ODYzMiwKKwkweDA4MGMsIDB4ODU2MywgMHgwMDc4LCAweDAwOTksIDB4MDA2OCwgMHgwODBjLCAweDg1NjMsIDB4MDA3OSwKKwkweDAwNDgsIDB4MDgwYywgMHg4NjMyLCAweDAwNTksIDB4MDAyOCwgMHgwODBjLCAweDg2MzIsIDB4MDgwYywKKwkweDg1NjMsIDB4MDAyOSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMTJlLCAweDAwMDUsIDB4MDBhNiwKKwkweDYxMjQsIDB4NjAyOCwgMHhkMDljLCAweDAxMTgsIDB4ZDE5YywgMHgxOTA0LCAweDI2NDgsIDB4ZDFmNCwKKwkweDE5MGMsIDB4MGRmMywgMHgwODBjLCAweDcyMDcsIDB4MDkwNCwgMHgyNDU1LCAweDA4MGMsIDB4YzUzOSwKKwkweDExMjAsIDB4NzAwMCwgMHg5MDg2LCAweDAwMDMsIDB4MDU3MCwgMHg2MDI0LCAweDkwODQsIDB4MTgwMCwKKwkweDA1NTAsIDB4MDgwYywgMHg3MjJhLCAweDAxMTgsIDB4MDgwYywgMHg3MjE4LCAweDE1MjAsIDB4NjAyNywKKwkweDAwMjAsIDB4NjA0MywgMHgwMDAwLCAweDA4MGMsIDB4YzUzOSwgMHgwMTY4LCAweDA4MGMsIDB4NzIyYSwKKwkweDExNTAsIDB4MjAwMSwgMHgxOTdmLCAweDIwMDMsIDB4MDAwMSwgMHg2MDI3LCAweDE4MDAsIDB4MDgwYywKKwkweDcwNzYsIDB4MDgwNCwgMHgyNjRiLCAweDcwYTAsIDB4OTAwNSwgMHgxMTUwLCAweDcwYTMsIDB4MDAwMSwKKwkweDAwZDYsIDB4MjA2OSwgMHgwMTQwLCAweDA4MGMsIDB4NzI1ZSwgMHgwMGRlLCAweDE5MDQsIDB4MjY0YiwKKwkweDA4MGMsIDB4NzUwZSwgMHgwNDI4LCAweDA4MGMsIDB4NzIyYSwgMHgxNTkwLCAweDYwMjQsIDB4OTA4NCwKKwkweDE4MDAsIDB4MTEwOCwgMHgwNDY4LCAweDA4MGMsIDB4NzUwZSwgMHgwODBjLCAweDc1MDQsIDB4MDgwYywKKwkweDVmMmIsIDB4MDgwYywgMHg3MTI3LCAweDA4MDQsIDB4MjY0OCwgMHhkMWFjLCAweDE1MDgsIDB4NjAyNCwKKwkweGQwZGMsIDB4MTE3MCwgMHhkMGU0LCAweDExNzgsIDB4ZDBkNCwgMHgxMTkwLCAweGQwY2MsIDB4MDEzMCwKKwkweDcwOTQsIDB4OTA4NiwgMHgwMDI4LCAweDExMTAsIDB4MDgwYywgMHg3M2YzLCAweDA4MDQsIDB4MjY0OCwKKwkweDA4MGMsIDB4NzUwOSwgMHgwMDQ4LCAweDIwMDEsIDB4MTk1NSwgMHgyMDAzLCAweDAwMDIsIDB4MDAyMCwKKwkweDA4MGMsIDB4NzM1OSwgMHgwODA0LCAweDI2NDgsIDB4MDgwYywgMHg3NDhkLCAweDA4MDQsIDB4MjY0OCwKKwkweGQxYWMsIDB4MDkwNCwgMHgyNTY5LCAweDA4MGMsIDB4NzIwNywgMHgxMWMwLCAweDYwMjcsIDB4MDAyMCwKKwkweDAwMDYsIDB4MDAyNiwgMHgwMDM2LCAweDA4MGMsIDB4NzIyMSwgMHgxMTU4LCAweDA4MGMsIDB4NzUwNCwKKwkweDA4MGMsIDB4NWYyYiwgMHgwODBjLCAweDcxMjcsIDB4MDAzZSwgMHgwMDJlLCAweDAwMGUsIDB4MDBhZSwKKwkweDAwMDUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMGUsIDB4MDgwYywgMHg3MWRmLCAweDAwMTYsIDB4MDA0NiwKKwkweDAwYzYsIDB4NjQ0YywgMHg5NDg2LCAweGYwZjAsIDB4MTEzOCwgMHgyMDYxLCAweDAxMDAsIDB4NjQ0YSwKKwkweDYwNDMsIDB4MDA5MCwgMHg2MDQzLCAweDAwMTAsIDB4NzRkNiwgMHg5NDhjLCAweGZmMDAsIDB4NzAzOCwKKwkweGQwODQsIDB4MDE3OCwgMHg5MTg2LCAweGY4MDAsIDB4MTE2MCwgMHg3MDQ0LCAweGQwODQsIDB4MTE0OCwKKwkweGMwODUsIDB4NzA0NiwgMHgwMDM2LCAweDI0MTgsIDB4MjAxMSwgMHg4MDE2LCAweDA4MGMsIDB4NGIxZiwKKwkweDAwM2UsIDB4MDgwYywgMHhjNTMyLCAweDE5MDQsIDB4MjU0NiwgMHg5MTk2LCAweGZmMDAsIDB4MDVhOCwKKwkweDcwNWMsIDB4OTA4NCwgMHgwMGZmLCAweDgxMGYsIDB4ODFmZiwgMHgwMTEwLCAweDkxMTYsIDB4MDU2OCwKKwkweDcxMzAsIDB4ZDE4NCwgMHgxNTUwLCAweDA4MGMsIDB4MzJlNCwgMHgwMTI4LCAweGMxOGQsIDB4NzEzMiwKKwkweDA4MGMsIDB4NjdiYiwgMHgxNTEwLCAweDYyNDAsIDB4OTI5NCwgMHgwMDEwLCAweDAxMzAsIDB4NjI0OCwKKwkweDkyOTQsIDB4ZmYwMCwgMHg5Mjk2LCAweGZmMDAsIDB4MDFjMCwgMHg3MDMwLCAweGQwOGMsIDB4MDkwNCwKKwkweDI1NDYsIDB4NzAzOCwgMHhkMDhjLCAweDExNDAsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4ZDFhYywKKwkweDE5MDQsIDB4MjU0NiwgMHhjMWFkLCAweDIxMDIsIDB4MDAzNiwgMHg3M2Q0LCAweDIwMTEsIDB4ODAxMywKKwkweDA4MGMsIDB4NGIxZiwgMHgwMDNlLCAweDA4MDQsIDB4MjU0NiwgMHg3MDM4LCAweGQwOGMsIDB4MTE0MCwKKwkweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGQxYWMsIDB4MTkwNCwgMHgyNTQ2LCAweGMxYWQsIDB4MjEwMiwKKwkweDAwMzYsIDB4NzNkNCwgMHgyMDExLCAweDgwMTMsIDB4MDgwYywgMHg0YjFmLCAweDAwM2UsIDB4NzEzMCwKKwkweGMxODUsIDB4NzEzMiwgMHgyMDExLCAweDE4NWMsIDB4MjIwYywgMHgwMGYwLCAweDAwMTYsIDB4MjAwOSwKKwkweDAwMDEsIDB4MjAxMSwgMHgwMTAwLCAweDA4MGMsIDB4ODRkMSwgMHgyMDE5LCAweDAwMGUsIDB4MDBjNiwKKwkweDIwNjEsIDB4MDAwMCwgMHgwODBjLCAweGQ4MDEsIDB4MDBjZSwgMHg5NDg0LCAweDAwZmYsIDB4OTA4MCwKKwkweDMyZTksIDB4MjAwZCwgMHg5MThjLCAweGZmMDAsIDB4ODEwZiwgMHgyMTIwLCAweDkwMDYsIDB4MjAwOSwKKwkweDAwMGUsIDB4MDgwYywgMHhkODg1LCAweDAwMWUsIDB4ZDFhYywgMHgxMTQ4LCAweDAwMTYsIDB4MjAwOSwKKwkweDAwMDIsIDB4MjAxOSwgMHgwMDA0LCAweDA4MGMsIDB4MzE1NiwgMHgwMDFlLCAweDAwNzgsIDB4MDE1NiwKKwkweDAwYjYsIDB4MjBhOSwgMHgwMDdmLCAweDkwMGUsIDB4MDgwYywgMHg2NDlmLCAweDExMTAsIDB4MDgwYywKKwkweDVmNDUsIDB4ODEwOCwgMHgxZjA0LCAweDI1M2MsIDB4MDBiZSwgMHgwMTVlLCAweDAwY2UsIDB4MDA0ZSwKKwkweDA4MGMsIDB4YTA2OSwgMHg2MGUzLCAweDAwMDAsIDB4MDAxZSwgMHgyMDAxLCAweDE4MDAsIDB4MjAxNCwKKwkweDkyOTYsIDB4MDAwNCwgMHgxMTcwLCAweGQxOWMsIDB4MTFhMCwgMHgyMDExLCAweDE4MGMsIDB4MjIxNCwKKwkweGQyOWMsIDB4MTEyMCwgMHg2MjA0LCAweDkyOTUsIDB4MDAwMiwgMHg2MjA2LCAweDYyMjgsIDB4YzI5ZCwKKwkweDYyMmEsIDB4MjAwMywgMHgwMDAxLCAweDIwMDEsIDB4MTgyNSwgMHgyMDAzLCAweDAwMDAsIDB4NjAyNywKKwkweDAwMjAsIDB4ZDE5NCwgMHgwOTA0LCAweDI2NDgsIDB4MDAxNiwgMHg2MjIwLCAweGQyYjQsIDB4MDkwNCwKKwkweDI1ZjEsIDB4MDgwYywgMHg4MzVhLCAweDA4MGMsIDB4OTY1NiwgMHg2MDI3LCAweDAwMDQsIDB4MDBmNiwKKwkweDIwMTksIDB4MTljOCwgMHgyMzA0LCAweDkwN2QsIDB4MDkwNCwgMHgyNWMwLCAweDc4MDQsIDB4OTA4NiwKKwkweDAwMzIsIDB4MTVmMCwgMHgwMGQ2LCAweDAwYzYsIDB4MDBlNiwgMHgwMDk2LCAweDIwNjksIDB4MDE0MCwKKwkweDc4MmMsIDB4Njg1ZSwgMHg3ODA4LCAweDY4NWEsIDB4NjA0MywgMHgwMDAyLCAweDIwMDEsIDB4MDAwMywKKwkweDgwMDEsIDB4MWRmMCwgMHg2MDQzLCAweDAwMDAsIDB4MjAwMSwgMHgwMDNjLCAweDgwMDEsIDB4MWRmMCwKKwkweDA4MGMsIDB4MmM5OCwgMHgyMDAxLCAweDAwMWUsIDB4ODAwMSwgMHgwMjQwLCAweDIwYTksIDB4MDAwOSwKKwkweDA4MGMsIDB4MmI5MSwgMHg2OTA0LCAweGQxZGMsIDB4MTE0MCwgMHgwY2IwLCAweDIwMDEsIDB4MDEwMCwKKwkweDA4MGMsIDB4MmM4OCwgMHg5MDA2LCAweDA4MGMsIDB4MmM4OCwgMHgwODBjLCAweDhiMDQsIDB4MDgwYywKKwkweDhjMTAsIDB4NzgxNCwgMHgyMDQ4LCAweGE4NjcsIDB4MDEwMywgMHgyZjYwLCAweDA4MGMsIDB4YTBlMywKKwkweDAwOWUsIDB4MDBlZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBmZSwgMHgwMDFlLCAweDAwYWUsIDB4MDAwNSwKKwkweDAwZmUsIDB4MDBkNiwgMHgyMDY5LCAweDAxNDAsIDB4NjgwNCwgMHg5MDg0LCAweDQwMDAsIDB4MDExMCwKKwkweDA4MGMsIDB4MmM5OCwgMHgwMGRlLCAweDAwYzYsIDB4MjA2MSwgMHgxOWJmLCAweDYwMjgsIDB4MDgwYywKKwkweGM1MzksIDB4MDEyMCwgMHg5MDlhLCAweDAwMDMsIDB4MTI1OCwgMHgwMDE4LCAweDkwOWEsIDB4MDBjOCwKKwkweDEyMzgsIDB4ODAwMCwgMHg2MDJhLCAweDAwY2UsIDB4MDgwYywgMHg5NjMyLCAweDA4MDQsIDB4MjY0NywKKwkweDIwNjEsIDB4MDEwMCwgMHg2MmMwLCAweDA4MGMsIDB4OWVlZiwgMHgyMDE5LCAweDE5YzgsIDB4MjMwNCwKKwkweDkwNjUsIDB4MDEyMCwgMHgyMDA5LCAweDAwMjcsIDB4MDgwYywgMHhhMTVkLCAweDAwY2UsIDB4MDgwNCwKKwkweDI2NDcsIDB4ZDJiYywgMHgwOTA0LCAweDI2MzQsIDB4MDgwYywgMHg4MzY3LCAweDYwMTQsIDB4OTA4NCwKKwkweDE5ODQsIDB4OTA4NSwgMHgwMDEwLCAweDYwMTYsIDB4NjAyNywgMHgwMDA0LCAweDAwZDYsIDB4MjA2OSwKKwkweDAxNDAsIDB4NjgwNCwgMHg5MDg0LCAweDQwMDAsIDB4MDExMCwgMHgwODBjLCAweDJjOTgsIDB4MDBkZSwKKwkweDAwYzYsIDB4MjA2MSwgMHgxOWJmLCAweDYwNDQsIDB4MDgwYywgMHhjNTM5LCAweDAxMjAsIDB4OTA5YSwKKwkweDAwMDMsIDB4MTYyOCwgMHgwMDE4LCAweDkwOWEsIDB4MDBjOCwgMHgxNjA4LCAweDgwMDAsIDB4NjA0NiwKKwkweDYwM2MsIDB4MDBjZSwgMHg5MDA1LCAweDA1NTgsIDB4MjAwOSwgMHgwN2QwLCAweDA4MGMsIDB4ODM1ZiwKKwkweDkwODAsIDB4MDAwOCwgMHgyMDA0LCAweDkwODYsIDB4MDAwNiwgMHgxMTM4LCAweDYxMTQsIDB4OTE4YywKKwkweDE5ODQsIDB4OTE4ZCwgMHgwMDEyLCAweDYxMTYsIDB4MDBkMCwgMHg2MTE0LCAweDkxOGMsIDB4MTk4NCwKKwkweDkxOGQsIDB4MDAxNiwgMHg2MTE2LCAweDAwOTgsIDB4NjAyNywgMHgwMDA0LCAweDAwODAsIDB4MDAzNiwKKwkweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweDk5OWQsIDB4MDAzZSwgMHgyMDE5LCAweDE5Y2UsIDB4MjMwNCwKKwkweDkwNjUsIDB4MDEyMCwgMHgyMDA5LCAweDAwNGYsIDB4MDgwYywgMHhhMTVkLCAweDAwY2UsIDB4MDAxZSwKKwkweGQxOWMsIDB4MDkwNCwgMHgyNzEyLCAweDcwMzgsIDB4ZDBhYywgMHgxOTA0LCAweDI2ZTcsIDB4MDAxNiwKKwkweDAxNTYsIDB4NjAyNywgMHgwMDA4LCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwYSwKKwkweDA5MDQsIDB4MjZjNCwgMHg2MDUwLCAweDkwODUsIDB4MDA0MCwgMHg2MDUyLCAweDYwNTAsIDB4OTA4NCwKKwkweGZiY2YsIDB4NjA1MiwgMHgwODBjLCAweDJiYjAsIDB4OTA4NSwgMHgyMDAwLCAweDYwNTIsIDB4MjBhOSwKKwkweDAwMTIsIDB4MWQwNCwgMHgyNjY5LCAweDA4MGMsIDB4ODM4ZSwgMHgxZjA0LCAweDI2NjksIDB4NjA1MCwKKwkweDkwODUsIDB4MDQwMCwgMHg5MDg0LCAweGRmYmYsIDB4NjA1MiwgMHgyMGE5LCAweDAwMjgsIDB4YTAwMSwKKwkweDFmMDQsIDB4MjY3NywgMHg2MTUwLCAweDkxODUsIDB4MTQwMCwgMHg2MDUyLCAweDIwYTksIDB4MDM2NiwKKwkweDFkMDQsIDB4MjY4MCwgMHgwODBjLCAweDgzOGUsIDB4NjAyMCwgMHhkMDljLCAweDExMzgsIDB4MDE1ZSwKKwkweDYxNTIsIDB4MDAxZSwgMHg2MDI3LCAweDAwMDgsIDB4MDgwNCwgMHgyNzEyLCAweDA4MGMsIDB4MmI3OCwKKwkweDFmMDQsIDB4MjY4MCwgMHgwMTVlLCAweDYxNTIsIDB4MDAxZSwgMHg2MDI3LCAweDAwMDgsIDB4MDAxNiwKKwkweDYwMjgsIDB4YzA5YywgMHg2MDJhLCAweDA4MGMsIDB4YTA2OSwgMHg2MGUzLCAweDAwMDAsIDB4MDgwYywKKwkweGRjMTMsIDB4MDgwYywgMHhkYzJlLCAweDA4MGMsIDB4NTVkZiwgMHhkMGZjLCAweDExMzgsIDB4MDgwYywKKwkweGM1MzIsIDB4MTEyMCwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywgMHg3MjRlLCAweDkwMDYsIDB4MDgwYywKKwkweDJjODgsIDB4MjAwOSwgMHgwMDAyLCAweDA4MGMsIDB4MmJiNiwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwKKwkweDcwMDMsIDB4MDAwNCwgMHgwODBjLCAweDBlYzYsIDB4MDBlZSwgMHg2MDI3LCAweDAwMDgsIDB4MDgwYywKKwkweDBiOGYsIDB4MDAxZSwgMHgwODA0LCAweDI3MTIsIDB4MDgwYywgMHgyY2MyLCAweDA4MGMsIDB4MmNmNSwKKwkweDYwNTAsIDB4YzBlNSwgMHg2MDUyLCAweDIwYTksIDB4MDM2NywgMHgxZjA0LCAweDI2ZTUsIDB4MWQwNCwKKwkweDI2Y2YsIDB4MDgwYywgMHg4MzhlLCAweDYwMjAsIDB4ZDA5YywgMHgxZGI4LCAweDAwZjYsIDB4MjA3OSwKKwkweDAxMDAsIDB4MDgwYywgMHgyYjA2LCAweDAwZmUsIDB4MWQ4MCwgMHg2MDUwLCAweGMwZTQsIDB4NjA1MiwKKwkweDYwMjcsIDB4MDAwOCwgMHgwMTVlLCAweDAwMWUsIDB4MDQ2OCwgMHgwMTVlLCAweDAwMWUsIDB4MDAxNiwKKwkweDYwMjgsIDB4YzA5YywgMHg2MDJhLCAweDA4MGMsIDB4YTA2OSwgMHg2MGUzLCAweDAwMDAsIDB4MDgwYywKKwkweGRjMTMsIDB4MDgwYywgMHhkYzJlLCAweDA4MGMsIDB4NTVkZiwgMHhkMGZjLCAweDExMzgsIDB4MDgwYywKKwkweGM1MzIsIDB4MTEyMCwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywgMHg3MjRlLCAweDkwMDYsIDB4MDgwYywKKwkweDJjODgsIDB4MjAwOSwgMHgwMDAyLCAweDA4MGMsIDB4MmJiNiwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwKKwkweDcwMDMsIDB4MDAwNCwgMHgwODBjLCAweDBlYzYsIDB4MDBlZSwgMHg2MDI3LCAweDAwMDgsIDB4MDgwYywKKwkweDBiOGYsIDB4MDAxZSwgMHg5MThjLCAweGZmZDAsIDB4NjEyNiwgMHgwMGFlLCAweDAwMDUsIDB4MDAwNiwKKwkweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwZTYsIDB4MDBmNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDIwNzEsIDB4MTgwMCwgMHg3MWNjLCAweDcwY2UsIDB4OTExNiwgMHgwOTA0LCAweDI3NjYsIDB4ODFmZiwKKwkweDAxYTAsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4MmJiNiwgMHgyMDExLCAweDgwMTEsIDB4MjAxOSwKKwkweDAxMGUsIDB4MjMxYywgMHg5MzllLCAweDAwMDcsIDB4MTExOCwgMHgyMDE5LCAweDAwMDEsIDB4MDAxMCwKKwkweDIwMTksIDB4MDAwMCwgMHgwODBjLCAweDRiMWYsIDB4MDQ0OCwgMHgyMDAxLCAweDE5ODAsIDB4MjAwYywKKwkweDgxZmYsIDB4MTE0MCwgMHgyMDAxLCAweDAxMDksIDB4MjAwNCwgMHhkMGI0LCAweDAxMTgsIDB4MjAxOSwKKwkweDAwMDMsIDB4MDAwOCwgMHgyMTE4LCAweDIwMTEsIDB4ODAxMiwgMHgwODBjLCAweDRiMWYsIDB4MDgwYywKKwkweDBlYzYsIDB4MDgwYywgMHg1NWRmLCAweGQwZmMsIDB4MTE4OCwgMHgwODBjLCAweGM1MzIsIDB4MTE3MCwKKwkweDAwYzYsIDB4MDgwYywgMHgyODAyLCAweDA4MGMsIDB4OTkwNCwgMHgyMDYxLCAweDAxMDAsIDB4MjAxOSwKKwkweDAwMjgsIDB4MjAwOSwgMHgwMDAyLCAweDA4MGMsIDB4MzE1NiwgMHgwMGNlLCAweDAxMmUsIDB4MDBmZSwKKwkweDAwZWUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDIwMjgsIDB4OTE4YywKKwkweDAwZmYsIDB4MjEzMCwgMHg5MDk0LCAweGZmMDAsIDB4MTFmMCwgMHgyMDExLCAweDE4MzYsIDB4MjIxNCwKKwkweGQyYWMsIDB4MTFjOCwgMHg4MWZmLCAweDAxZTgsIDB4MjAxMSwgMHgxODFlLCAweDIyMDQsIDB4OTEwNiwKKwkweDExOTAsIDB4MjAxMSwgMHgxODFmLCAweDIyMTQsIDB4OTI5NCwgMHhmZjAwLCAweDk1ODQsIDB4ZmYwMCwKKwkweDkyMDYsIDB4MTE0OCwgMHgyMDExLCAweDE4MWYsIDB4MjIxNCwgMHg5Mjk0LCAweDAwZmYsIDB4OTU4NCwKKwkweDAwZmYsIDB4OTIwNiwgMHgxMTIwLCAweDI1MDAsIDB4MDgwYywgMHg3ZWMwLCAweDAwNDgsIDB4OTU4NCwKKwkweDAwZmYsIDB4OTA4MCwgMHgzMmU5LCAweDIwMGQsIDB4OTE4YywgMHhmZjAwLCAweDgxMGYsIDB4OTAwNiwKKwkweDAwMDUsIDB4OTA4MCwgMHgzMmU5LCAweDIwMGQsIDB4OTE4YywgMHgwMGZmLCAweDAwMDUsIDB4MDBkNiwKKwkweDIwNjksIDB4MDE0MCwgMHgyMDAxLCAweDE4MTcsIDB4MjAwMywgMHgwMGVmLCAweDIwYTksIDB4MDAxMCwKKwkweDkwMDYsIDB4Njg1MiwgMHg2ODU2LCAweDFmMDQsIDB4MjdiMiwgMHgwMGRlLCAweDAwMDUsIDB4MDAwNiwKKwkweDAwZDYsIDB4MDAyNiwgMHgyMDY5LCAweDAxNDAsIDB4MjAwMSwgMHgxODE3LCAweDIxMDIsIDB4ODExNCwKKwkweDgyMTQsIDB4ODIxNCwgMHg4MjE0LCAweDIwYTksIDB4MDAxMCwgMHg2ODUzLCAweDAwMDAsIDB4OTAwNiwKKwkweDgyZmYsIDB4MTEyOCwgMHg5MTg0LCAweDAwMGYsIDB4OTA4MCwgMHhlNTY4LCAweDIwMDUsIDB4Njg1NiwKKwkweDgyMTEsIDB4MWYwNCwgMHgyN2M3LCAweDAwMmUsIDB4MDBkZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBjNiwKKwkweDIwNjEsIDB4MTgwMCwgMHg2MDMwLCAweDAxMTAsIDB4YzA5ZCwgMHgwMDA4LCAweGMwOWMsIDB4NjAzMiwKKwkweDAwY2UsIDB4MDAwNSwgMHgwMTU2LCAweDAwZDYsIDB4MDAyNiwgMHgwMDE2LCAweDAwMDYsIDB4MjA2OSwKKwkweDAxNDAsIDB4Njk4MCwgMHg5MTE2LCAweDAxODAsIDB4OTExMiwgMHgxMjMwLCAweDgyMTIsIDB4ODIxMCwKKwkweDIyYTgsIDB4MjAwMSwgMHgwNDAyLCAweDAwMTgsIDB4MjJhOCwgMHgyMDAxLCAweDA0MDQsIDB4NjgwZSwKKwkweDFmMDQsIDB4MjdmNywgMHg2ODBmLCAweDAwMDAsIDB4MDAwZSwgMHgwMDFlLCAweDAwMmUsIDB4MDBkZSwKKwkweDAxNWUsIDB4MDAwNSwgMHgwODBjLCAweDU1ZGIsIDB4ZDBjNCwgMHgwMTUwLCAweGQwYTQsIDB4MDE0MCwKKwkweDkwMDYsIDB4MDA0NiwgMHgyMDIwLCAweDIwMDksIDB4MDAyZSwgMHgwODBjLCAweGQ4ODUsIDB4MDA0ZSwKKwkweDAwMDUsIDB4MDBmNiwgMHgwMDE2LCAweDAwMjYsIDB4MjA3OSwgMHgwMTQwLCAweDc4YzQsIDB4ZDBkYywKKwkweDA5MDQsIDB4Mjg2ZSwgMHgwODBjLCAweDJhZjYsIDB4MDY2MCwgMHg5MDg0LCAweDA3MDAsIDB4OTA4ZSwKKwkweDA2MDAsIDB4MTEyMCwgMHgyMDExLCAweDQwMDAsIDB4OTAwZSwgMHgwNDU4LCAweDkwOGUsIDB4MDUwMCwKKwkweDExMjAsIDB4MjAxMSwgMHg4MDAwLCAweDkwMGUsIDB4MDQyMCwgMHg5MDhlLCAweDA0MDAsIDB4MTEyMCwKKwkweDkwMTYsIDB4MjAwOSwgMHgwMDAxLCAweDAwZTgsIDB4OTA4ZSwgMHgwMzAwLCAweDExMjAsIDB4OTAxNiwKKwkweDIwMDksIDB4MDAwMiwgMHgwMGIwLCAweDkwOGUsIDB4MDIwMCwgMHgxMTIwLCAweDkwMTYsIDB4MjAwOSwKKwkweDAwMDQsIDB4MDA3OCwgMHg5MDhlLCAweDAxMDAsIDB4MTU0OCwgMHg5MDE2LCAweDIwMDksIDB4MDAwOCwKKwkweDAwNDAsIDB4OTA4NCwgMHgwNzAwLCAweDkwOGUsIDB4MDMwMCwgMHgxNTAwLCAweDIwMTEsIDB4MDAzMCwKKwkweDAwNTgsIDB4MjMwMCwgMHg5MDgwLCAweDAwMjAsIDB4MjAxOCwgMHgwODBjLCAweDg0ZmYsIDB4OTI4YywKKwkweGZmMDAsIDB4MDExMCwgMHgyMDExLCAweDAwZmYsIDB4MjIwMCwgMHg4MDA3LCAweDkwODUsIDB4MDA0YywKKwkweDc4YzIsIDB4MjAwOSwgMHgwMTM4LCAweDIyMGEsIDB4MDgwYywgMHg3MjA3LCAweDExMTgsIDB4MjAwOSwKKwkweDE5NDUsIDB4MjIwYSwgMHgwMDJlLCAweDAwMWUsIDB4MDBmZSwgMHgwMDA1LCAweDc4YzMsIDB4MDAwMCwKKwkweDBjYzgsIDB4MDEyNiwgMHgyMDkxLCAweDI4MDAsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MjAwMSwKKwkweDAxNzAsIDB4MjAwYywgMHg4MDAwLCAweDIwMTQsIDB4OTE4NCwgMHgwMDAzLCAweDAxMTAsIDB4MDgwYywKKwkweDBkZjMsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDEyZSwgMHgwMDA1LCAweDIwMDEsIDB4MDE3MSwKKwkweDIwMDQsIDB4ZDBkYywgMHgwMTY4LCAweDIwMDEsIDB4MDE3MCwgMHgyMDBjLCAweDkxOGMsIDB4MDBmZiwKKwkweDkxOGUsIDB4MDA0YywgMHgxMTI4LCAweDIwMGMsIDB4OTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MDAwNSwKKwkweDkwMGUsIDB4MjAwMSwgMHgwMjI3LCAweDIwMDQsIDB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4ODAwNCwKKwkweDkxMDgsIDB4MjAwMSwgMHgwMjI2LCAweDIwMDQsIDB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4ODAwNCwKKwkweDkxMDgsIDB4MDAwNSwgMHgwMDE4LCAweDAwMGMsIDB4MDAxOCwgMHgwMDIwLCAweDEwMDAsIDB4MDgwMCwKKwkweDEwMDAsIDB4MTgwMCwgMHgwMTU2LCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDAwZTYsIDB4MjAwMSwKKwkweDE5NjgsIDB4MjAwNCwgMHg5MDhhLCAweDAwMDcsIDB4MWEwYywgMHgwZGZhLCAweDAwMzMsIDB4MDBlZSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAxNWUsIDB4MDAwNSwgMHgyOGNjLCAweDI4ZWEsIDB4MjkwZSwKKwkweDI5MTAsIDB4MjkzOSwgMHgyOTNiLCAweDI5M2QsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjcxNywKKwkweDA4MGMsIDB4MmI2YSwgMHgyMDAxLCAweDE5NmEsIDB4MjAwMywgMHgwMDAwLCAweDc4MjgsIDB4OTA4NCwKKwkweGUxZDcsIDB4NzgyYSwgMHg5MDA2LCAweDIwYTksIDB4MDAwOSwgMHgwODBjLCAweDJiMTIsIDB4MjAwMSwKKwkweDE5NjgsIDB4MjAwMywgMHgwMDA2LCAweDIwMDksIDB4MDAxZSwgMHgyMDExLCAweDI5M2UsIDB4MDgwYywKKwkweDgzNmMsIDB4MDAwNSwgMHgyMDA5LCAweDE5NmQsIDB4MjAwYiwgMHgwMDAwLCAweDIwMDEsIDB4MTk3MiwKKwkweDIwMDMsIDB4MDAzNiwgMHgyMDAxLCAweDE5NzEsIDB4MjAwMywgMHgwMDJhLCAweDIwMDEsIDB4MTk2YSwKKwkweDIwMDMsIDB4MDAwMSwgMHg5MDA2LCAweDA4MGMsIDB4MmE5YiwgMHgyMDAxLCAweGZmZmYsIDB4MjBhOSwKKwkweDAwMDksIDB4MDgwYywgMHgyYjEyLCAweDIwMDEsIDB4MTk2OCwgMHgyMDAzLCAweDAwMDYsIDB4MjAwOSwKKwkweDAwMWUsIDB4MjAxMSwgMHgyOTNlLCAweDA4MGMsIDB4ODM2YywgMHgwMDA1LCAweDA4MGMsIDB4MGRmYSwKKwkweDIwMDEsIDB4MTk3MiwgMHgyMDAzLCAweDAwMzYsIDB4MjAwMSwgMHgxOTZhLCAweDIwMDMsIDB4MDAwMywKKwkweDdhMzgsIDB4OTI5NCwgMHgwMDA1LCAweDkyOTYsIDB4MDAwNCwgMHgwMTEwLCAweDkwMDYsIDB4MDAxMCwKKwkweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDJhOWIsIDB4MjAwMSwgMHgxOTZlLCAweDIwMDMsIDB4MDAwMCwKKwkweDIwMDEsIDB4ZmZmZiwgMHgyMGE5LCAweDAwMDksIDB4MDgwYywgMHgyYjEyLCAweDIwMDEsIDB4MTk2OCwKKwkweDIwMDMsIDB4MDAwNiwgMHgyMDA5LCAweDAwMWUsIDB4MjAxMSwgMHgyOTNlLCAweDA4MGMsIDB4ODM2YywKKwkweDAwMDUsIDB4MDgwYywgMHgwZGZhLCAweDA4MGMsIDB4MGRmYSwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDBlNiwgMHgwMGY2LCAweDAxNTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3OSwKKwkweDAxMDAsIDB4MjAwMSwgMHgxOTZhLCAweDIwMDQsIDB4OTA4YSwgMHgwMDA3LCAweDFhMGMsIDB4MGRmYSwKKwkweDAwNDMsIDB4MDEyZSwgMHgwMTVlLCAweDAwZmUsIDB4MDBlZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwKKwkweDAwMDUsIDB4Mjk2MCwgMHgyOTgwLCAweDI5YzAsIDB4MjlmMCwgMHgyYTE0LCAweDJhMjQsIDB4MmEyNiwKKwkweDA4MGMsIDB4MmIwNiwgMHgxMWIwLCAweDc4NTAsIDB4OTA4NCwgMHhlZmZmLCAweDc4NTIsIDB4MjAwOSwKKwkweDE5NzAsIDB4MjEwNCwgMHg3YTM4LCAweDkyOTQsIDB4MDAwNSwgMHg5Mjk2LCAweDAwMDQsIDB4MDExMCwKKwkweGMwOGQsIDB4MDAwOCwgMHhjMDg1LCAweDIwMGEsIDB4MjAwMSwgMHgxOTY4LCAweDIwMDMsIDB4MDAwMSwKKwkweDAwMzAsIDB4MDgwYywgMHgyYTRhLCAweDIwMDEsIDB4ZmZmZiwgMHgwODBjLCAweDI4ZGIsIDB4MDAwNSwKKwkweDA4MGMsIDB4MmEyOCwgMHgwNWUwLCAweDIwMDksIDB4MTk3MSwgMHgyMTA0LCAweDgwMDEsIDB4MjAwYSwKKwkweDA4MGMsIDB4MmIwNiwgMHgxMTc4LCAweDc4NTAsIDB4OTA4NCwgMHhlZmZmLCAweDc4NTIsIDB4N2EzOCwKKwkweDkyOTQsIDB4MDAwNSwgMHg5Mjk2LCAweDAwMDUsIDB4MDUxOCwgMHgyMDA5LCAweDE5NzAsIDB4MjEwNCwKKwkweGMwODUsIDB4MjAwYSwgMHgyMDA5LCAweDE5NmQsIDB4MjEwNCwgMHg4MDAwLCAweDIwMGEsIDB4OTA4NiwKKwkweDAwMDUsIDB4MDExOCwgMHgwODBjLCAweDJhMzAsIDB4MDBjMCwgMHgyMDBiLCAweDAwMDAsIDB4N2EzOCwKKwkweDkyOTQsIDB4MDAwNiwgMHg5Mjk2LCAweDAwMDQsIDB4MDExMCwgMHg5MDA2LCAweDAwMTAsIDB4MjAwMSwKKwkweDAwMDEsIDB4MDgwYywgMHgyYWI4LCAweDIwMDEsIDB4MTk2YSwgMHgyMDAzLCAweDAwMDIsIDB4MDAyOCwKKwkweDIwMDEsIDB4MTk2OCwgMHgyMDAzLCAweDAwMDMsIDB4MDAxMCwgMHgwODBjLCAweDI4ZmQsIDB4MDAwNSwKKwkweDA4MGMsIDB4MmEyOCwgMHgwNTYwLCAweDIwMDksIDB4MTk3MSwgMHgyMTA0LCAweDgwMDEsIDB4MjAwYSwKKwkweDA4MGMsIDB4MmIwNiwgMHgxMTY4LCAweDc4NTAsIDB4OTA4NCwgMHhlZmZmLCAweDc4NTIsIDB4MjAwMSwKKwkweDE5NjgsIDB4MjAwMywgMHgwMDAzLCAweDIwMDEsIDB4MTk2OSwgMHgyMDAzLCAweDAwMDAsIDB4MDBiOCwKKwkweDIwMDksIDB4MTk3MSwgMHgyMTA0LCAweDkwMDUsIDB4MTExOCwgMHgwODBjLCAweDJhNmQsIDB4MDAxMCwKKwkweDA4MGMsIDB4MmEzZCwgMHgwODBjLCAweDJhMzAsIDB4MjAwOSwgMHgxOTZkLCAweDIwMGIsIDB4MDAwMCwKKwkweDIwMDEsIDB4MTk2YSwgMHgyMDAzLCAweDAwMDEsIDB4MDgwYywgMHgyOGZkLCAweDAwMDAsIDB4MDAwNSwKKwkweDA0YjksIDB4MDUwOCwgMHgwODBjLCAweDJiMDYsIDB4MTFiOCwgMHg3ODUwLCAweDkwODQsIDB4ZWZmZiwKKwkweDc4NTIsIDB4MjAwOSwgMHgxOTZlLCAweDIxMDQsIDB4ODAwMCwgMHgyMDBhLCAweDkwODYsIDB4MDAwNywKKwkweDAxMDgsIDB4MDA3OCwgMHgyMDAxLCAweDE5NzMsIDB4MjAwMywgMHgwMDBhLCAweDIwMDksIDB4MTk3MCwKKwkweDIxMDQsIDB4YzBmZCwgMHgyMDBhLCAweDAwMzgsIDB4MDQxOSwgMHgyMDAxLCAweDE5NmEsIDB4MjAwMywKKwkweDAwMDQsIDB4MDgwYywgMHgyOTI4LCAweDAwMDUsIDB4MDA5OSwgMHgwMTY4LCAweDA4MGMsIDB4MmIwNiwKKwkweDExMzgsIDB4Nzg1MCwgMHg5MDg0LCAweGVmZmYsIDB4Nzg1MiwgMHgwODBjLCAweDI5MTQsIDB4MDAxOCwKKwkweDAwNzksIDB4MDgwYywgMHgyOTI4LCAweDAwMDUsIDB4MDgwYywgMHgwZGZhLCAweDA4MGMsIDB4MGRmYSwKKwkweDIwMDksIDB4MTk3MiwgMHgyMTA0LCAweDgwMDEsIDB4MjAwYSwgMHgwOTBjLCAweDJhODksIDB4MDAwNSwKKwkweDdhMzgsIDB4OTI5NCwgMHgwMDA1LCAweDkyOTYsIDB4MDAwNSwgMHgwMTEwLCAweDkwMDYsIDB4MDAxMCwKKwkweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDJhYjgsIDB4MDAwNSwgMHg3YTM4LCAweDkyOTQsIDB4MDAwNiwKKwkweDkyOTYsIDB4MDAwNiwgMHgwMTEwLCAweDkwMDYsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywKKwkweDJhOWIsIDB4MDAwNSwgMHgyMDA5LCAweDE5NmQsIDB4MjEwNCwgMHg4MDAwLCAweDIwMGEsIDB4OTA4NiwKKwkweDAwMDUsIDB4MDEwOCwgMHgwMDY4LCAweDIwMGIsIDB4MDAwMCwgMHg3YTM4LCAweDkyOTQsIDB4MDAwNiwKKwkweDkyOTYsIDB4MDAwNiwgMHgwMTEwLCAweDkwMDYsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDEsIDB4MDRkOSwKKwkweDdhMzgsIDB4OTI5NCwgMHgwMDA1LCAweDkyOTYsIDB4MDAwNSwgMHgwMTEwLCAweDkwMDYsIDB4MDAxMCwKKwkweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDJhYjgsIDB4MDAwNSwgMHgwMDg2LCAweDIwMDEsIDB4MTk3MCwKKwkweDIwMDQsIDB4OTA4NCwgMHg3ZmZmLCAweDA5MGMsIDB4MGRmYSwgMHgyMDA5LCAweDE5NmYsIDB4MjE0NCwKKwkweDg4NDYsIDB4MjgwYSwgMHg5ODQ0LCAweDBkZDgsIDB4ZDA4YywgMHgxMTIwLCAweGQwODQsIDB4MTEyMCwKKwkweDA4MGMsIDB4MGRmYSwgMHg5MDA2LCAweDAwMTAsIDB4MjAwMSwgMHgwMDAxLCAweDAwYTEsIDB4MDA4ZSwKKwkweDAwMDUsIDB4MDAwNiwgMHgwMTU2LCAweDIwMDEsIDB4MTk2OCwgMHgyMGE5LCAweDAwMDksIDB4MjAwMywKKwkweDAwMDAsIDB4ODAwMCwgMHgxZjA0LCAweDJhOGYsIDB4MjAwMSwgMHgxOTZmLCAweDIwMDMsIDB4ODAwMCwKKwkweDAxNWUsIDB4MDAwZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDkwODUsIDB4MDAwMCwKKwkweDAxNTgsIDB4NzgzOCwgMHg5MDg0LCAweGZmZjksIDB4OTA4NSwgMHgwMDA0LCAweDc4M2EsIDB4MjAwOSwKKwkweDE5NzUsIDB4MjEwYywgMHg3OTVhLCAweDAwNTAsIDB4NzgzOCwgMHg5MDg0LCAweGZmZmIsIDB4OTA4NSwKKwkweDAwMDYsIDB4NzgzYSwgMHgyMDA5LCAweDE5NzYsIDB4MjEwYywgMHg3OTVhLCAweDAwZmUsIDB4MDAwNSwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDkwODUsIDB4MDAwMCwgMHgwMTg4LCAweDc4MzgsIDB4OTA4NCwKKwkweGZmZmEsIDB4OTA4NSwgMHgwMDA0LCAweDc4M2EsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4NiwKKwkweDAwMGEsIDB4MTEyMCwgMHg3ODUwLCAweDkwODQsIDB4ZmZmMCwgMHg3ODUyLCAweDA0MjgsIDB4NzgzOCwKKwkweDkwODQsIDB4ZmZmYiwgMHg5MDg1LCAweDAwMDUsIDB4NzgzYSwgMHgyMDAxLCAweDAxMDAsIDB4MjAwNCwKKwkweDkwODYsIDB4MDAwYSwgMHgxMWM4LCAweDc4NTAsIDB4OTA4NCwgMHhmZmYwLCAweDAwMTYsIDB4MjAwOSwKKwkweDAxN2YsIDB4MjEwYywgMHg5MThlLCAweDAwMDUsIDB4MDE0MCwgMHgyMDA5LCAweDAwMDMsIDB4MjEwYywKKwkweDkxOGMsIDB4MDYwMCwgMHg5MThlLCAweDA0MDAsIDB4MDExOCwgMHg5MDg1LCAweDAwMGEsIDB4MDAxMCwKKwkweDkwODUsIDB4MDAwMCwgMHgwMDFlLCAweDc4NTIsIDB4MDBmZSwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwKKwkweDAxMDAsIDB4MjAwNCwgMHg5MDgyLCAweDAwMDcsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwKKwkweDAxMDAsIDB4MjAwNCwgMHg5MDgyLCAweDAwMDksIDB4MDAwZSwgMHgwMDA1LCAweDAxNTYsIDB4MjBhOSwKKwkweDAwNjQsIDB4NzgyMCwgMHgwODBjLCAweDJiYjAsIDB4ZDA5YywgMHgxMTEwLCAweDFmMDQsIDB4MmIwOSwKKwkweDAxNWUsIDB4MDAwNSwgMHgwMTI2LCAweDAwMTYsIDB4MDAwNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAwMSwKKwkweDAxMDAsIDB4MjAwNCwgMHg5MDg2LCAweDAwMGEsIDB4MDE3MCwgMHg3ODUwLCAweDkwODUsIDB4MDA0MCwKKwkweDc4NTIsIDB4Nzg1MCwgMHg5MDg0LCAweGZiY2YsIDB4Nzg1MiwgMHgwODBjLCAweDJiYjAsIDB4OTA4NSwKKwkweDIwMDAsIDB4Nzg1MiwgMHgwMDIwLCAweDA4MGMsIDB4MmNjMiwgMHgwODBjLCAweDJjZjUsIDB4MDAwZSwKKwkweDIwMDgsIDB4OTE4NiwgMHgwMDAwLCAweDExMTgsIDB4NzgzYiwgMHgwMDA3LCAweDAwOTAsIDB4OTE4NiwKKwkweDAwMDEsIDB4MTExOCwgMHg3ODNiLCAweDAwMDYsIDB4MDA2MCwgMHg5MTg2LCAweDAwMDIsIDB4MTExOCwKKwkweDc4M2IsIDB4MDAwNSwgMHgwMDMwLCAweDkxODYsIDB4MDAwMywgMHgxMTE4LCAweDc4M2IsIDB4MDAwNCwKKwkweDAwMDAsIDB4MDAwNiwgMHgxZDA0LCAweDJiNGEsIDB4MDgwYywgMHg4MzhlLCAweDFmMDQsIDB4MmI0YSwKKwkweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwYSwgMHgwMTYwLCAweDc4NTAsIDB4OTA4NSwKKwkweDA0MDAsIDB4OTA4NCwgMHhkZmJmLCAweDc4NTIsIDB4MDgwYywgMHgyYmIwLCAweDkwODUsIDB4MTAwMCwKKwkweDc4NTIsIDB4MDAyMCwgMHg3ODUwLCAweDkwODUsIDB4MTAwMCwgMHg3ODUyLCAweDAwMGUsIDB4MDAxZSwKKwkweDAxMmUsIDB4MDAwNSwgMHgyMDAxLCAweDAxMDAsIDB4MjAwNCwgMHg5MDg2LCAweDAwMGEsIDB4MDEyOCwKKwkweDc4NTAsIDB4OTA4NCwgMHhmZmNmLCAweDc4NTIsIDB4MDAxMCwgMHgwODBjLCAweDJjZjUsIDB4MDAwNSwKKwkweDAwMDYsIDB4MDE1NiwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHgyMGE5LCAweDAwMGEsIDB4Nzg1NCwKKwkweGQwYWMsIDB4MTEzMCwgMHg3ODIwLCAweGQwZTQsIDB4MTE0MCwgMHgxZjA0LCAweDJiODIsIDB4MDAyOCwKKwkweDc4NTQsIDB4ZDA4YywgMHgxMTEwLCAweDFmMDQsIDB4MmI4OCwgMHgwMGZlLCAweDAxNWUsIDB4MDAwZSwKKwkweDAwMDUsIDB4MWQwNCwgMHgyYjkxLCAweDA4MGMsIDB4ODM4ZSwgMHgxZjA0LCAweDJiOTEsIDB4MDAwNSwKKwkweDAwMDYsIDB4MjAwMSwgMHgxOTc0LCAweDIwMDQsIDB4OTA4NiwgMHgwMDAwLCAweDAwMGUsIDB4MDAwNSwKKwkweDAwMDYsIDB4MjAwMSwgMHgxOTc0LCAweDIwMDQsIDB4OTA4NiwgMHgwMDAxLCAweDAwMGUsIDB4MDAwNSwKKwkweDAwMDYsIDB4MjAwMSwgMHgxOTc0LCAweDIwMDQsIDB4OTA4NiwgMHgwMDAyLCAweDAwMGUsIDB4MDAwNSwKKwkweGEwMDEsIDB4YTAwMSwgMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwKKwkweDE5ODAsIDB4MjEwMiwgMHgwMDBlLCAweDAwMDUsIDB4MjAwOSwgMHgwMTcxLCAweDIxMDQsIDB4ZDBkYywKKwkweDAxNDAsIDB4MjAwOSwgMHgwMTcwLCAweDIxMDQsIDB4MjAwYiwgMHgwMDgwLCAweGEwMDEsIDB4YTAwMSwKKwkweDIwMGEsIDB4MDAwNSwgMHgwMDM2LCAweDAwNDYsIDB4MjAwMSwgMHgwMTQxLCAweDIwMGMsIDB4OTE4YywKKwkweGZmMDAsIDB4OTE4NiwgMHgyMTAwLCAweDAxNDAsIDB4OTE4NiwgMHgyMDAwLCAweDAxNzAsIDB4OTE4NiwKKwkweDAxMDAsIDB4MTkwNCwgMHgyYzI5LCAweDAwNDgsIDB4MDAxNiwgMHgyMDA5LCAweDFhNWEsIDB4MjEwNCwKKwkweDgwMDAsIDB4MDIwOCwgMHgyMDBhLCAweDAwMWUsIDB4MDRmMCwgMHgyMDA5LCAweDAwYTIsIDB4MDgwYywKKwkweDBlNzUsIDB4MjAxOSwgMHgwMTYwLCAweDIzMjQsIDB4MjAxMSwgMHgwMDAzLCAweDIwMDksIDB4MDE2OSwKKwkweDIxMDQsIDB4OTA4NCwgMHgwMDA3LCAweDIxMGMsIDB4OTE4YywgMHgwMDA3LCAweDkxMGUsIDB4MWRiMCwKKwkweDkwODYsIDB4MDAwMywgMHgxNTQ4LCAweDIzMDQsIDB4MDA2NiwgMHgwMDc2LCAweDIwMzEsIDB4MDAwMiwKKwkweDIzM2MsIDB4OTczZSwgMHgwMTQ4LCAweDg2MzEsIDB4MWRkOCwgMHgyMDMxLCAweDFhNWIsIDB4MjYzYywKKwkweDg3MzgsIDB4MDIwOCwgMHgyNzMyLCAweDIzMDQsIDB4MDA3ZSwgMHgwMDZlLCAweDk0MDIsIDB4MDJhMCwKKwkweDE5ZDAsIDB4ODIxMSwgMHgxOWQ4LCAweDg0ZmYsIDB4MDE3MCwgMHgyMDAxLCAweDAxNDEsIDB4MjAwYywKKwkweDkxOGMsIDB4ZmYwMCwgMHg5MTg2LCAweDAxMDAsIDB4MDEzMCwgMHgyMDA5LCAweDE4MGMsIDB4MjEwNCwKKwkweGMwZGQsIDB4MjAwYSwgMHgwMDA4LCAweDA0MjEsIDB4MjAwMSwgMHgxOTU5LCAweDIwMGMsIDB4MDgwYywKKwkweDBlNzUsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMDUsIDB4MjAwMSwgMHgxODBjLCAweDIwMDQsIDB4ZDBkYywKKwkweDAxYjAsIDB4MjAwMSwgMHgwMTYwLCAweDIwMDQsIDB4OTAwNSwgMHgwMTQwLCAweDIwMDEsIDB4MDE0MSwKKwkweDIwMDQsIDB4OTA4NCwgMHhmZjAwLCAweDkwODYsIDB4MDEwMCwgMHgxMTQ4LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDAxNiwgMHgwMDI2LCAweDAwMjEsIDB4MDAyZSwgMHgwMDFlLCAweDAxMmUsIDB4MDAwNSwKKwkweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDYwMTQsIDB4MDAwNiwgMHgyMDAxLCAweDAxNjEsIDB4MjAwMywKKwkweDAwMDAsIDB4NjAxNywgMHgwMDE4LCAweGEwMDEsIDB4YTAwMSwgMHg2MDJmLCAweDAwMDgsIDB4NjEwNCwKKwkweDkxOGUsIDB4MDAxMCwgMHg2MTA2LCAweDkxOGUsIDB4MDAxMCwgMHg2MTA2LCAweDYwMTcsIDB4MDA0MCwKKwkweDA0YjksIDB4MDAxZSwgMHg5MTg0LCAweDAwMDMsIDB4MDFlMCwgMHgwMDM2LCAweDAwMTYsIDB4MjAxOSwKKwkweDAxNDEsIDB4NjEyNCwgMHg5MThjLCAweDAwMjgsIDB4MTEyMCwgMHgyMzA0LCAweDkwODQsIDB4MjgwMCwKKwkweDBkYzAsIDB4MDAxZSwgMHg5MTljLCAweGZmZTQsIDB4OTE4NCwgMHgwMDAxLCAweDAxMTgsIDB4OTM4NSwKKwkweDAwMDksIDB4NjAxNiwgMHg5MTg0LCAweDAwMDIsIDB4MDExOCwgMHg5Mzg1LCAweDAwMTIsIDB4NjAxNiwKKwkweDAwM2UsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4YzFkYywgMHgyMTAyLCAweDAwY2UsIDB4MDAwNSwKKwkweDAwMTYsIDB4MDAyNiwgMHgwODBjLCAweDcyMjEsIDB4MDEwOCwgMHhjMGJjLCAweDIwMDksIDB4MDE0MCwKKwkweDIxMTQsIDB4OTI5NCwgMHgwMDAxLCAweDkyMTUsIDB4MjIwYSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwKKwkweDAwMTYsIDB4MDAyNiwgMHgyMDA5LCAweDAxNDAsIDB4MjExNCwgMHg5Mjk0LCAweDAwMDEsIDB4OTI4NSwKKwkweDEwMDAsIDB4MjAwYSwgMHgyMjBhLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwKKwkweDIwMDksIDB4MDE0MCwgMHgyMTE0LCAweDkyOTQsIDB4MDAwMSwgMHg5MjE1LCAweDIyMGEsIDB4MDAyZSwKKwkweDAwMWUsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4MjAwOSwgMHgwMTQwLCAweDIxMDQsIDB4MTEyOCwKKwkweDA4MGMsIDB4NzIyMSwgMHgwMTEwLCAweGMwYmMsIDB4MDAwOCwgMHhjMGJkLCAweDIwMGEsIDB4MDAxZSwKKwkweDAwMGUsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwKKwkweDYwNTAsIDB4OTA4NCwgMHhmYmZmLCAweDkwODUsIDB4MDA0MCwgMHg2MDUyLCAweDIwYTksIDB4MDAwMiwKKwkweDA4MGMsIDB4MmI5MSwgMHg2MDUwLCAweDkwODUsIDB4MDQwMCwgMHg5MDg0LCAweGZmOWYsIDB4NjA1MiwKKwkweDIwYTksIDB4MDAwNSwgMHgwODBjLCAweDJiOTEsIDB4NjA1NCwgMHhkMGJjLCAweDA5MGMsIDB4MGRmYSwKKwkweDIwYTksIDB4MDAwNSwgMHgwODBjLCAweDJiOTEsIDB4NjA1NCwgMHhkMGFjLCAweDA5MGMsIDB4MGRmYSwKKwkweDIwMDksIDB4MTk4NywgMHg5MDg0LCAweDdlMDAsIDB4ODAwNywgMHg4MDA0LCAweDgwMDQsIDB4MjAwYSwKKwkweDAwY2UsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMDA2LCAweDAwYzYsIDB4MjA2MSwKKwkweDAxMDAsIDB4NjA1MCwgMHhjMGNkLCAweDYwNTIsIDB4MDBjZSwgMHgwMDBlLCAweDAwMDUsIDB4MmY2YiwKKwkweDJmNmIsIDB4MmQ4ZiwgMHgyZDhmLCAweDJkOWIsIDB4MmQ5YiwgMHgyZGE3LCAweDJkYTcsIDB4MmRiNSwKKwkweDJkYjUsIDB4MmRjMSwgMHgyZGMxLCAweDJkY2YsIDB4MmRjZiwgMHgyZGRkLCAweDJkZGQsIDB4MmRlZiwKKwkweDJkZWYsIDB4MmRmYiwgMHgyZGZiLCAweDJlMDksIDB4MmUwOSwgMHgyZTI3LCAweDJlMjcsIDB4MmU0NywKKwkweDJlNDcsIDB4MmUxNywgMHgyZTE3LCAweDJlMzcsIDB4MmUzNywgMHgyZTU1LCAweDJlNTUsIDB4MmRlZCwKKwkweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwKKwkweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwKKwkweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwKKwkweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmU2NywKKwkweDJlNjcsIDB4MmU3MywgMHgyZTczLCAweDJlODEsIDB4MmU4MSwgMHgyZThmLCAweDJlOGYsIDB4MmU5ZiwKKwkweDJlOWYsIDB4MmVhZCwgMHgyZWFkLCAweDJlYmQsIDB4MmViZCwgMHgyZWNkLCAweDJlY2QsIDB4MmVkZiwKKwkweDJlZGYsIDB4MmVlZCwgMHgyZWVkLCAweDJlZmQsIDB4MmVmZCwgMHgyZjFmLCAweDJmMWYsIDB4MmY0MSwKKwkweDJmNDEsIDB4MmYwZCwgMHgyZjBkLCAweDJmMzAsIDB4MmYzMCwgMHgyZjUwLCAweDJmNTAsIDB4MmRlZCwKKwkweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwKKwkweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwKKwkweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwKKwkweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwKKwkweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwKKwkweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MDEwNiwKKwkweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywKKwkweDIzYzYsIDB4MDgwNCwgMHgyZjYzLCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwKKwkweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjFjZCwgMHgwODA0LCAweDJmNjMsIDB4MDEwNiwKKwkweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywKKwkweDIxY2QsIDB4MDgwYywgMHgyM2M2LCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwKKwkweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIyMDgsIDB4MDgwNCwKKwkweDJmNjMsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwKKwkweDAxNTYsIDB4MDgwYywgMHgyM2M2LCAweDA4MGMsIDB4MjIwOCwgMHgwODA0LCAweDJmNjMsIDB4MDEwNiwKKwkweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywKKwkweDIxY2QsIDB4MDgwYywgMHgyMjA4LCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwKKwkweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIxY2QsIDB4MDgwYywKKwkweDIzYzYsIDB4MDgwYywgMHgyMjA4LCAweDA4MDQsIDB4MmY2MywgMHhhMDAxLCAweDBjZjAsIDB4MDEwNiwKKwkweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywKKwkweDEzNzAsIDB4MDgwNCwgMHgyZjYzLCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwKKwkweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjNjNiwgMHgwODBjLCAweDEzNzAsIDB4MDgwNCwKKwkweDJmNjMsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwKKwkweDAxNTYsIDB4MDgwYywgMHgyMWNkLCAweDA4MGMsIDB4MTM3MCwgMHgwODA0LCAweDJmNjMsIDB4MDEwNiwKKwkweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywKKwkweDIzYzYsIDB4MDgwYywgMHgxMzcwLCAweDA4MGMsIDB4MjIwOCwgMHgwODA0LCAweDJmNjMsIDB4MDEwNiwKKwkweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywKKwkweDIxY2QsIDB4MDgwYywgMHgyM2M2LCAweDA4MGMsIDB4MTM3MCwgMHgwODA0LCAweDJmNjMsIDB4MDEwNiwKKwkweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywKKwkweDIxY2QsIDB4MDgwYywgMHgxMzcwLCAweDA4MGMsIDB4MjIwOCwgMHgwODA0LCAweDJmNjMsIDB4MDEwNiwKKwkweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywKKwkweDEzNzAsIDB4MDgwYywgMHgyMjA4LCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwKKwkweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIxY2QsIDB4MDgwYywKKwkweDIzYzYsIDB4MDgwYywgMHgxMzcwLCAweDA4MGMsIDB4MjIwOCwgMHgwODA0LCAweDJmNjMsIDB4MDEwNiwKKwkweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywKKwkweDI4NzEsIDB4MDgwNCwgMHgyZjYzLCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwKKwkweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjg3MSwgMHgwODBjLCAweDIzYzYsIDB4MDgwNCwKKwkweDJmNjMsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwKKwkweDAxNTYsIDB4MDgwYywgMHgyODcxLCAweDA4MGMsIDB4MjFjZCwgMHgwODA0LCAweDJmNjMsIDB4MDEwNiwKKwkweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywKKwkweDI4NzEsIDB4MDgwYywgMHgyMWNkLCAweDA4MGMsIDB4MjNjNiwgMHgwODA0LCAweDJmNjMsIDB4MDEwNiwKKwkweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywKKwkweDI4NzEsIDB4MDgwYywgMHgyMjA4LCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwKKwkweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI4NzEsIDB4MDgwYywKKwkweDIzYzYsIDB4MDgwYywgMHgyMjA4LCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwKKwkweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI4NzEsIDB4MDgwYywKKwkweDIxY2QsIDB4MDgwYywgMHgyMjA4LCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwKKwkweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI4NzEsIDB4MDgwYywKKwkweDIxY2QsIDB4MDgwYywgMHgyM2M2LCAweDA4MGMsIDB4MjIwOCwgMHgwODA0LCAweDJmNjMsIDB4MDEwNiwKKwkweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywKKwkweDI4NzEsIDB4MDgwYywgMHgxMzcwLCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwKKwkweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI4NzEsIDB4MDgwYywKKwkweDIzYzYsIDB4MDgwYywgMHgxMzcwLCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwKKwkweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI4NzEsIDB4MDgwYywKKwkweDIxY2QsIDB4MDgwYywgMHgxMzcwLCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwKKwkweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI4NzEsIDB4MDgwYywKKwkweDIzYzYsIDB4MDgwYywgMHgxMzcwLCAweDA4MGMsIDB4MjIwOCwgMHgwODA0LCAweDJmNjMsIDB4MDEwNiwKKwkweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywKKwkweDI4NzEsIDB4MDgwYywgMHgyMWNkLCAweDA4MGMsIDB4MjNjNiwgMHgwODBjLCAweDEzNzAsIDB4MDQ5OCwKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4Mjg3MSwgMHgwODBjLCAweDIxY2QsIDB4MDgwYywgMHgxMzcwLCAweDA4MGMsIDB4MjIwOCwKKwkweDA0MTAsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwKKwkweDAxNTYsIDB4MDgwYywgMHgyODcxLCAweDA4MGMsIDB4MTM3MCwgMHgwODBjLCAweDIyMDgsIDB4MDA5OCwKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4Mjg3MSwgMHgwODBjLCAweDIxY2QsIDB4MDgwYywgMHgyM2M2LCAweDA4MGMsIDB4MTM3MCwKKwkweDA4MGMsIDB4MjIwOCwgMHgwMDAwLCAweDAxNWUsIDB4MDE0ZSwgMHgwMTNlLCAweDAxZGUsIDB4MDFjZSwKKwkweDAxMmUsIDB4MDAwZSwgMHgwMTBlLCAweDAwMGQsIDB4MDBiNiwgMHgwMGM2LCAweDAwMjYsIDB4MDA0NiwKKwkweDkwMjYsIDB4MDgwYywgMHg2NzgxLCAweDE5MDQsIDB4MzA3MiwgMHg3MmQ4LCAweDIwMDEsIDB4MTk1NCwKKwkweDIwMDQsIDB4OTAwNSwgMHgxMTEwLCAweGQyOWMsIDB4MDE0OCwgMHhkMjg0LCAweDExMzgsIDB4ZDJiYywKKwkweDE5MDQsIDB4MzA3MiwgMHgwODBjLCAweDMwNzcsIDB4MDgwNCwgMHgzMDcyLCAweGQyY2MsIDB4MTkwNCwKKwkweDMwNzIsIDB4MDgwYywgMHg3MjA3LCAweDExMjAsIDB4NzBhYiwgMHhmZmZmLCAweDA4MDQsIDB4MzA3MiwKKwkweGQyOTQsIDB4MDEyMCwgMHg3MGFiLCAweGZmZmYsIDB4MDgwNCwgMHgzMDcyLCAweDA4MGMsIDB4MzJkZiwKKwkweDAxNjAsIDB4MDgwYywgMHhjNTM5LCAweDAxMjgsIDB4MjAwMSwgMHgxODE3LCAweDIwM2MsIDB4MDgwNCwKKwkweDMwMDQsIDB4NzBhYiwgMHhmZmZmLCAweDA4MDQsIDB4MzA3MiwgMHgyMDAxLCAweDE4MTcsIDB4MjAzYywKKwkweDcyOTAsIDB4ZDI4NCwgMHgwOTA0LCAweDMwMDQsIDB4ZDI4YywgMHgxOTA0LCAweDMwMDQsIDB4MDAzNiwKKwkweDczYTgsIDB4OTM4ZSwgMHhmZmZmLCAweDExMTAsIDB4MjAxOSwgMHgwMDAxLCAweDgzMTQsIDB4OTJlMCwKKwkweDFjODAsIDB4MmMwNCwgMHg5MzhjLCAweDAwMDEsIDB4MDEyMCwgMHg5MDg0LCAweGZmMDAsIDB4ODAwNywKKwkweDAwMTAsIDB4OTA4NCwgMHgwMGZmLCAweDk3MGUsIDB4MDVhOCwgMHg5MDhlLCAweDAwMDAsIDB4MDU5MCwKKwkweDkwOGUsIDB4MDBmZiwgMHgxMTUwLCAweDcyMzAsIDB4ZDI4NCwgMHgxNTg4LCAweDcyOTAsIDB4YzI4ZCwKKwkweDcyOTIsIDB4NzBhYiwgMHhmZmZmLCAweDAwM2UsIDB4MDQ3OCwgMHgwMDI2LCAweDIwMTEsIDB4MDAxMCwKKwkweDA4MGMsIDB4NjdlNywgMHgwMDJlLCAweDAxMTgsIDB4NzBhYiwgMHhmZmZmLCAweDA0MTAsIDB4OTAwZSwKKwkweDA4MGMsIDB4Mjc2ZSwgMHgwODBjLCAweDY0M2YsIDB4MTFjMCwgMHgwODBjLCAweDY3YzMsIDB4MTE2OCwKKwkweDcwMzAsIDB4ZDA4YywgMHgwMTMwLCAweGI4MDAsIDB4ZDBiYywgMHgwMTM4LCAweDA4MGMsIDB4NjZiZiwKKwkweDAxMjAsIDB4MDgwYywgMHgzMDkwLCAweDAxNDgsIDB4MDAyOCwgMHgwODBjLCAweDMxZDAsIDB4MDgwYywKKwkweDMwYmMsIDB4MDExOCwgMHg4MzE4LCAweDA4MDQsIDB4MmZiNiwgMHg3M2FhLCAweDAwMTAsIDB4NzBhYiwKKwkweGZmZmYsIDB4MDAzZSwgMHgwODA0LCAweDMwNzIsIDB4OTc4MCwgMHgzMmU5LCAweDIwM2QsIDB4OTdiYywKKwkweGZmMDAsIDB4ODczZiwgMHgyMDQxLCAweDAwN2UsIDB4NzBhOCwgMHg5MDk2LCAweGZmZmYsIDB4MTExOCwKKwkweDkwMGUsIDB4MjhhOCwgMHgwMDUwLCAweDk4MTIsIDB4MDIyMCwgMHgyMDA4LCAweDk4MDIsIDB4MjBhOCwKKwkweDAwMjAsIDB4NzBhYiwgMHhmZmZmLCAweDA4MDQsIDB4MzA3MiwgMHgyNzAwLCAweDAxNTYsIDB4MDAxNiwKKwkweDkxMDYsIDB4MDkwNCwgMHgzMDY3LCAweDAwMjYsIDB4MjAxMSwgMHgwMDEwLCAweDA4MGMsIDB4NjdlNywKKwkweDAwMmUsIDB4MDEyMCwgMHgyMDA5LCAweGZmZmYsIDB4MDgwNCwgMHgzMDZmLCAweGM0ODQsIDB4MDgwYywKKwkweDY0OWYsIDB4MDEzOCwgMHgwODBjLCAweGM1MzksIDB4MTU5MCwgMHgwODBjLCAweDY0M2YsIDB4MTViOCwKKwkweDAwMDgsIDB4YzQ4NSwgMHgwODBjLCAweDY3YzMsIDB4MTEzMCwgMHg3MDMwLCAweGQwOGMsIDB4MDFmOCwKKwkweGI4MDAsIDB4ZDBiYywgMHgxMWUwLCAweDcyOTAsIDB4ZDI4YywgMHgwMTgwLCAweDA4MGMsIDB4NjdjMywKKwkweDkwODIsIDB4MDAwNiwgMHgwMmUwLCAweGQ0ODQsIDB4MTExOCwgMHgwODBjLCAweDY0NjMsIDB4MDAyOCwKKwkweDA4MGMsIDB4MzI1YiwgMHgwMWEwLCAweDA4MGMsIDB4MzI4NiwgMHgwMDg4LCAweDA4MGMsIDB4MzFkMCwKKwkweDA4MGMsIDB4YzUzOSwgMHgxMTYwLCAweDA4MGMsIDB4MzBiYywgMHgwMTg4LCAweDAwNDAsIDB4MDgwYywKKwkweGM1MzksIDB4MTExOCwgMHgwODBjLCAweDMyNWIsIDB4MDExMCwgMHgwNDUxLCAweDAxNDAsIDB4MDAxZSwKKwkweDgxMDgsIDB4MDE1ZSwgMHgxZjA0LCAweDMwMWQsIDB4NzBhYiwgMHhmZmZmLCAweDAwMTgsIDB4MDAxZSwKKwkweDAxNWUsIDB4NzFhYSwgMHgwMDRlLCAweDAwMmUsIDB4MDBjZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBjNiwKKwkweDAwMTYsIDB4NzBhYiwgMHgwMDAxLCAweDIwMDksIDB4MDA3ZSwgMHgwODBjLCAweDY0M2YsIDB4MTE2OCwKKwkweGI4MTMsIDB4MDBmZiwgMHhiODE3LCAweGZmZmUsIDB4MDgwYywgMHgzMWQwLCAweDA0YTksIDB4MDEyOCwKKwkweDcwZDgsIDB4YzBiZCwgMHg3MGRhLCAweDA4MGMsIDB4YzI4YSwgMHgwMDFlLCAweDAwY2UsIDB4MDAwNSwKKwkweDAwMTYsIDB4MDA3NiwgMHgwMGQ2LCAweDAwYzYsIDB4MjAwMSwgMHgxODYwLCAweDIwMDQsIDB4OTA4NCwKKwkweDAwZmYsIDB4Yjg0MiwgMHgwODBjLCAweGExMzAsIDB4MDFkMCwgMHgyYjAwLCAweDYwMTIsIDB4MDgwYywKKwkweGMyYjMsIDB4NjAyMywgMHgwMDAxLCAweDkwMDYsIDB4MDgwYywgMHg2M2RjLCAweDIwMDEsIDB4MDAwMCwKKwkweDA4MGMsIDB4NjNmMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MGE0LCAweDgwMDAsIDB4NzBhNiwKKwkweDAxMmUsIDB4MjAwOSwgMHgwMDA0LCAweDA4MGMsIDB4YTE1ZCwgMHg5MDg1LCAweDAwMDEsIDB4MDBjZSwKKwkweDAwZGUsIDB4MDA3ZSwgMHgwMDFlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDc2LCAweDAwZDYsIDB4MDBjNiwKKwkweDIwMDEsIDB4MTg2MCwgMHgyMDA0LCAweDkwODQsIDB4MDBmZiwgMHhiODQyLCAweDA4MGMsIDB4YTEzMCwKKwkweDA1NDgsIDB4MmIwMCwgMHg2MDEyLCAweGI4MDAsIDB4YzBjNCwgMHhiODAyLCAweGI4YTAsIDB4OTA4NiwKKwkweDAwN2UsIDB4MDE0MCwgMHhiODA0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDYsIDB4MTExMCwKKwkweDA4MGMsIDB4MzE4YiwgMHgwODBjLCAweGMyYjMsIDB4NjAyMywgMHgwMDAxLCAweDkwMDYsIDB4MDgwYywKKwkweDYzZGMsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NjNmMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDcwYTQsIDB4ODAwMCwgMHg3MGE2LCAweDAxMmUsIDB4MjAwOSwgMHgwMDAyLCAweDA4MGMsIDB4YTE1ZCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMGNlLCAweDAwZGUsIDB4MDA3ZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBiNiwKKwkweDAwYzYsIDB4MDAyNiwgMHgyMDA5LCAweDAwODAsIDB4MDgwYywgMHg2NDNmLCAweDExNDAsIDB4YjgxMywKKwkweDAwZmYsIDB4YjgxNywgMHhmZmZjLCAweDAwMzksIDB4MDExMCwgMHg3MGRmLCAweGZmZmYsIDB4MDAyZSwKKwkweDAwY2UsIDB4MDBiZSwgMHgwMDA1LCAweDAwMTYsIDB4MDA3NiwgMHgwMGQ2LCAweDAwYzYsIDB4MDgwYywKKwkweGEwOGQsIDB4MDFkMCwgMHgyYjAwLCAweDYwMTIsIDB4MDgwYywgMHhjMmIzLCAweDYwMjMsIDB4MDAwMSwKKwkweDkwMDYsIDB4MDgwYywgMHg2M2RjLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDYzZjAsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHg3MGUwLCAweDgwMDAsIDB4NzBlMiwgMHgwMTJlLCAweDIwMDksIDB4MDAwMiwKKwkweDA4MGMsIDB4YTE1ZCwgMHg5MDg1LCAweDAwMDEsIDB4MDBjZSwgMHgwMGRlLCAweDAwN2UsIDB4MDAxZSwKKwkweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDksIDB4MDA3ZiwKKwkweDA4MGMsIDB4NjQzZiwgMHgxMWI4LCAweGI4MTMsIDB4MDBmZiwgMHhiODE3LCAweGZmZmQsIDB4YjhiZiwKKwkweDAwMDQsIDB4MDgwYywgMHhhMDhkLCAweDAxNzAsIDB4MmIwMCwgMHg2MDEyLCAweDYzMTYsIDB4NjAyMywKKwkweDAwMDEsIDB4NjIwYSwgMHgwODBjLCAweGMyYjMsIDB4MjAwOSwgMHgwMDIyLCAweDA4MGMsIDB4YTE1ZCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwKKwkweDAwNjYsIDB4MDAzNiwgMHgwMDI2LCAweDAwYjYsIDB4MjFmMCwgMHgwODBjLCAweDg4MGUsIDB4MDgwYywKKwkweDg3OTgsIDB4MDgwYywgMHg5ZjM2LCAweDA4MGMsIDB4YjAzYSwgMHgzZTA4LCAweDIxMzAsIDB4ODFmZiwKKwkweDAxMjAsIDB4MjBhOSwgMHgwMDdlLCAweDkwMGUsIDB4MDAxOCwgMHgyMGE5LCAweDAwN2YsIDB4OTAwZSwKKwkweDAwMTYsIDB4MDgwYywgMHg2NDlmLCAweDExNDAsIDB4OTY4NiwgMHgwMDAyLCAweDExMTgsIDB4YjgwMCwKKwkweGQwYmMsIDB4MTExMCwgMHgwODBjLCAweDVmNDUsIDB4MDAxZSwgMHg4MTA4LCAweDFmMDQsIDB4MzE3MCwKKwkweDk2ODYsIDB4MDAwMSwgMHgxOTBjLCAweDMyYjMsIDB4MDBiZSwgMHgwMDJlLCAweDAwM2UsIDB4MDA2ZSwKKwkweDAwY2UsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMDQ2LCAweDAwMzYsIDB4MDAyNiwKKwkweDAwMTYsIDB4MDBiNiwgMHg2MjEwLCAweDIyNTgsIDB4YmFhMCwgMHgwMDI2LCAweDIwMTksIDB4MDAyOSwKKwkweDA4MGMsIDB4ODgwMywgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweDg2ZjEsIDB4MmMwOCwKKwkweDA4MGMsIDB4ZDVmNiwgMHgwMDdlLCAweDAwMWUsIDB4YmExMCwgMHhiYjE0LCAweGJjYjAsIDB4MDgwYywKKwkweDVmNDUsIDB4YmExMiwgMHhiYjE2LCAweGJjYjIsIDB4MDBiZSwgMHgwMDFlLCAweDAwMmUsIDB4MDAzZSwKKwkweDAwNGUsIDB4MDBjZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgwMDA2LCAweDAwYjYsIDB4NjAxMCwKKwkweDIwNTgsIDB4YjhhMCwgMHgwMGJlLCAweDkwODYsIDB4MDA4MCwgMHgwMTUwLCAweDIwNzEsIDB4MTgwMCwKKwkweDcwYTQsIDB4OTAwNSwgMHgwMTEwLCAweDgwMDEsIDB4NzBhNiwgMHgwMDBlLCAweDAwZWUsIDB4MDAwNSwKKwkweDIwNzEsIDB4MTgwMCwgMHg3MGUwLCAweDkwMDUsIDB4MGRjMCwgMHg4MDAxLCAweDcwZTIsIDB4MGNhOCwKKwkweGI4MDAsIDB4YzA4YywgMHhiODAyLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwYzYsIDB4MDBiNiwKKwkweDAwNDYsIDB4MDAzNiwgMHgwMDI2LCAweDAwMTYsIDB4MDE1NiwgMHgyMTc4LCAweDgxZmYsIDB4MTExOCwKKwkweDIwYTksIDB4MDAwMSwgMHgwMDcwLCAweDA4MGMsIDB4NTVkYiwgMHhkMGM0LCAweDAxMzgsIDB4MDAzMCwKKwkweDkwMDYsIDB4MjAyMCwgMHgyMDA5LCAweDAwMmQsIDB4MDgwYywgMHhkODg1LCAweDIwYTksIDB4MDgwMCwKKwkweDkwMTYsIDB4MDAyNiwgMHg5MjhlLCAweDAwN2UsIDB4MDkwNCwgMHgzMjNhLCAweDkyOGUsIDB4MDA3ZiwKKwkweDA5MDQsIDB4MzIzYSwgMHg5MjhlLCAweDAwODAsIDB4MDVlOCwgMHg5Mjg4LCAweDEwMDAsIDB4MjEwYywKKwkweDgxZmYsIDB4MDVjMCwgMHg4ZmZmLCAweDExNDgsIDB4MjAwMSwgMHgxOTY2LCAweDAwMDYsIDB4MjAwMywKKwkweDAwMDEsIDB4MDRmMSwgMHgwMDBlLCAweDIwMDMsIDB4MDAwMCwgMHgwMGI2LCAweDAwYzYsIDB4MjE1OCwKKwkweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDY3OGQsIDB4MDBjZSwgMHgwMGJlLCAweDIwMTksIDB4MDAyOSwKKwkweDA4MGMsIDB4ODgwMywgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweDg2ZjEsIDB4MDBiNiwKKwkweDAwYzYsIDB4MDAyNiwgMHgyMTU4LCAweGJhMDQsIDB4OTI5NCwgMHgwMGZmLCAweDkyODYsIDB4MDAwNiwKKwkweDExMTgsIDB4YjgwNywgMHgwNDA0LCAweDAwMjgsIDB4MjAwMSwgMHgwMDA0LCAweDgwMDcsIDB4OTIxNSwKKwkweGJhMDYsIDB4MDAyZSwgMHgwMGNlLCAweDAwYmUsIDB4MDAxNiwgMHgyYzA4LCAweDA4MGMsIDB4ZDVmNiwKKwkweDAwMWUsIDB4MDA3ZSwgMHgwMDJlLCAweDgyMTAsIDB4MWYwNCwgMHgzMWYxLCAweDAxNWUsIDB4MDAxZSwKKwkweDAwMmUsIDB4MDAzZSwgMHgwMDRlLCAweDAwYmUsIDB4MDBjZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwKKwkweDAwNDYsIDB4MDAyNiwgMHgwMDE2LCAweDA4MGMsIDB4NTVkYiwgMHhkMGM0LCAweDAxNDAsIDB4ZDBhNCwKKwkweDAxMzAsIDB4OTAwNiwgMHgyMjIwLCAweDIwMDksIDB4MDAyOSwgMHgwODBjLCAweGQ4ODUsIDB4MDAxZSwKKwkweDAwMmUsIDB4MDA0ZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4NzI5MCwKKwkweDgyZmYsIDB4MDFlOCwgMHgwODBjLCAweDY3YmIsIDB4MTFkMCwgMHgyMTAwLCAweDA4MGMsIDB4MjdhMSwKKwkweDgxZmYsIDB4MDFiOCwgMHgyMDE5LCAweDAwMDEsIDB4ODMxNCwgMHg5MmUwLCAweDFjODAsIDB4MmMwNCwKKwkweGQzODQsIDB4MDEyMCwgMHg5MDg0LCAweGZmMDAsIDB4ODAwNywgMHgwMDEwLCAweDkwODQsIDB4MDBmZiwKKwkweDkxMTYsIDB4MDEzOCwgMHg5MDk2LCAweDAwZmYsIDB4MDExMCwgMHg4MzE4LCAweDBjNjgsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDBjZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwMTYsIDB4MDBjNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwMzYsIDB4MjAxOSwgMHgwMDI5LCAweDAwYTksIDB4MDAzZSwKKwkweDkxODAsIDB4MTAwMCwgMHgyMDA0LCAweDkwNjUsIDB4MDE1OCwgMHgwMDE2LCAweDAwYzYsIDB4MjA2MSwKKwkweDFhOGEsIDB4MDAxZSwgMHg2MTEyLCAweDA4MGMsIDB4MzE4YiwgMHgwMDFlLCAweDA4MGMsIDB4NjQ2MywKKwkweDAxMmUsIDB4MDBjZSwgMHgwMDFlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDIxMTAsIDB4MDgwYywKKwkweDliYzksIDB4MDgwYywgMHhkYjNkLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgzNiwKKwkweDIwMDQsIDB4ZDBjYywgMHgwMDA1LCAweDAwYzYsIDB4MDBiNiwgMHgwODBjLCAweDcyMDcsIDB4MTExOCwKKwkweDIwYTksIDB4MDgwMCwgMHgwMDEwLCAweDIwYTksIDB4MDc4MiwgMHgwODBjLCAweDcyMDcsIDB4MTExMCwKKwkweDkwMGUsIDB4MDAxMCwgMHgyMDA5LCAweDAwN2UsIDB4OTE4MCwgMHgxMDAwLCAweDIwMDQsIDB4OTA1ZCwKKwkweDAxMzAsIDB4ODZmZiwgMHgwMTEwLCAweGI4MDAsIDB4ZDBiYywgMHgwOTBjLCAweDY0NjMsIDB4ODEwOCwKKwkweDFmMDQsIDB4MzJjNCwgMHgyMDYxLCAweDE4MDAsIDB4NjA3YiwgMHgwMDAwLCAweDYwN2MsIDB4OTA4NCwKKwkweDAwZmYsIDB4NjA3ZSwgMHg2MGFmLCAweDAwMDAsIDB4MDBiZSwgMHgwMGNlLCAweDAwMDUsIDB4MjAwMSwKKwkweDE4N2QsIDB4MjAwNCwgMHhkMGJjLCAweDAwMDUsIDB4MjAxMSwgMHgxODVjLCAweDIyMTQsIDB4ZDJlYywKKwkweDAwMDUsIDB4N2VlZiwgMHg3ZGU4LCAweDdjZTQsIDB4ODBlMiwgMHg3YmUxLCAweDgwZTAsIDB4ODBkYywKKwkweDgwZGEsIDB4N2FkOSwgMHg4MGQ2LCAweDgwZDUsIDB4ODBkNCwgMHg4MGQzLCAweDgwZDIsIDB4ODBkMSwKKwkweDc5Y2UsIDB4NzhjZCwgMHg4MGNjLCAweDgwY2IsIDB4ODBjYSwgMHg4MGM5LCAweDgwYzcsIDB4ODBjNiwKKwkweDc3YzUsIDB4NzZjMywgMHg4MGJjLCAweDgwYmEsIDB4NzViOSwgMHg4MGI2LCAweDc0YjUsIDB4NzNiNCwKKwkweDcyYjMsIDB4ODBiMiwgMHg4MGIxLCAweDgwYWUsIDB4NzFhZCwgMHg4MGFjLCAweDcwYWIsIDB4NmZhYSwKKwkweDZlYTksIDB4ODBhNywgMHg2ZGE2LCAweDZjYTUsIDB4NmJhMywgMHg2YTlmLCAweDY5OWUsIDB4Njg5ZCwKKwkweDgwOWIsIDB4ODA5OCwgMHg2Nzk3LCAweDY2OTAsIDB4NjU4ZiwgMHg2NDg4LCAweDYzODQsIDB4NjI4MiwKKwkweDgwODEsIDB4ODA4MCwgMHg2MTdjLCAweDYwN2EsIDB4ODA3OSwgMHg1Zjc2LCAweDgwNzUsIDB4ODA3NCwKKwkweDgwNzMsIDB4ODA3MiwgMHg4MDcxLCAweDgwNmUsIDB4NWU2ZCwgMHg4MDZjLCAweDVkNmIsIDB4NWM2YSwKKwkweDViNjksIDB4ODA2NywgMHg1YTY2LCAweDU5NjUsIDB4NTg2MywgMHg1NzVjLCAweDU2NWEsIDB4NTU1OSwKKwkweDgwNTYsIDB4ODA1NSwgMHg1NDU0LCAweDUzNTMsIDB4NTI1MiwgMHg1MTUxLCAweDUwNGUsIDB4NGY0ZCwKKwkweDgwNGMsIDB4ODA0YiwgMHg0ZTRhLCAweDRkNDksIDB4ODA0NywgMHg0YzQ2LCAweDgwNDUsIDB4ODA0MywKKwkweDgwM2MsIDB4ODAzYSwgMHg4MDM5LCAweDgwMzYsIDB4NGIzNSwgMHg4MDM0LCAweDRhMzMsIDB4NDkzMiwKKwkweDQ4MzEsIDB4ODAyZSwgMHg0NzJkLCAweDQ2MmMsIDB4NDUyYiwgMHg0NDJhLCAweDQzMjksIDB4NDIyNywKKwkweDgwMjYsIDB4ODAyNSwgMHg0MTIzLCAweDQwMWYsIDB4M2YxZSwgMHgzZTFkLCAweDNkMWIsIDB4M2MxOCwKKwkweDgwMTcsIDB4ODAxMCwgMHgzYjBmLCAweDNhMDgsIDB4ODAwNCwgMHgzOTAyLCAweDgwMDEsIDB4ODAwMCwKKwkweDgwMDAsIDB4MzgwMCwgMHgzNzAwLCAweDM2MDAsIDB4ODAwMCwgMHgzNTAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4MzQwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDMzMDAsIDB4MzIwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDMxMDAsIDB4MzAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MmYwMCwgMHg4MDAwLCAweDJlMDAsIDB4MmQwMCwKKwkweDJjMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MmIwMCwgMHg4MDAwLCAweDJhMDAsIDB4MjkwMCwKKwkweDI4MDAsIDB4ODAwMCwgMHgyNzAwLCAweDI2MDAsIDB4MjUwMCwgMHgyNDAwLCAweDIzMDAsIDB4MjIwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHgyMTAwLCAweDIwMDAsIDB4MWYwMCwgMHgxZTAwLCAweDFkMDAsIDB4MWMwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHgxYjAwLCAweDFhMDAsIDB4ODAwMCwgMHgxOTAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MTgwMCwgMHg4MDAwLCAweDE3MDAsIDB4MTYwMCwKKwkweDE1MDAsIDB4ODAwMCwgMHgxNDAwLCAweDEzMDAsIDB4MTIwMCwgMHgxMTAwLCAweDEwMDAsIDB4MGYwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHgwZTAwLCAweDBkMDAsIDB4MGMwMCwgMHgwYjAwLCAweDBhMDAsIDB4MDkwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHgwODAwLCAweDA3MDAsIDB4ODAwMCwgMHgwNjAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4MDUwMCwgMHgwNDAwLCAweDAzMDAsIDB4ODAwMCwgMHgwMjAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4MDEwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDAwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4MjA3MSwgMHgxODljLCAweDcwMDMsIDB4MDAwMiwgMHg5MDA2LCAweDcwMTYsIDB4NzAxYSwKKwkweDcwNGEsIDB4NzA0ZSwgMHg3MDBlLCAweDcwNDIsIDB4NzA0NiwgMHg3MDNiLCAweDE4YjgsIDB4NzAzZiwKKwkweDE4YjgsIDB4NzAwNywgMHgwMDAxLCAweDA4MGMsIDB4MTA0YSwgMHgwOTBjLCAweDBkZmEsIDB4MjkwMCwKKwkweDcwNmEsIDB4YTg2NywgMHgwMDAyLCAweGE4YWIsIDB4ZGNiMCwgMHgwODBjLCAweDEwNGEsIDB4MDkwYywKKwkweDBkZmEsIDB4MjkwMCwgMHg3MDZlLCAweGE4NjcsIDB4MDAwMiwgMHhhOGFiLCAweGRjYjAsIDB4MDAwNSwKKwkweDIwNzEsIDB4MTg5YywgMHg3MDA0LCAweDAwMDIsIDB4MzQxOCwgMHgzNDE5LCAweDM0MmMsIDB4MzQ0MCwKKwkweDAwMDUsIDB4MTAwNCwgMHgzNDI5LCAweDBlMDQsIDB4MzQyOSwgMHgyMDc5LCAweDAwMDAsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHg3MDBjLCAweDkwMDUsIDB4MTEyOCwgMHg3MDBmLCAweDAwMDEsIDB4MDEyZSwKKwkweDA0NjgsIDB4MDAwNSwgMHgwMTJlLCAweDBjZTgsIDB4MjA3OSwgMHgwMDAwLCAweDIwNjEsIDB4MThiNiwKKwkweDJjNGMsIDB4YTg2YywgMHg5MDhlLCAweDAxMDAsIDB4MDEyOCwgMHg5MDg2LCAweDAyMDAsIDB4MDkwNCwKKwkweDM1MTQsIDB4MDAwNSwgMHg3MDE4LCAweDIwNDgsIDB4MjA2MSwgMHgxODAwLCAweDcwMWMsIDB4MDgwNywKKwkweDcwMTQsIDB4MjA0OCwgMHhhODY0LCAweDkwOTQsIDB4MDBmZiwgMHg5Mjk2LCAweDAwMjksIDB4MTEyMCwKKwkweGFhNzgsIDB4ZDJmYywgMHgwMTI4LCAweDAwMDUsIDB4OTA4NiwgMHgwMTAzLCAweDAxMDgsIDB4MDAwNSwKKwkweDIwNzksIDB4MDAwMCwgMHgyMDYxLCAweDE4MDAsIDB4NzAxYywgMHgwODA3LCAweDIwNjEsIDB4MTgwMCwKKwkweDc4ODAsIDB4OTA4YSwgMHgwMDQwLCAweDEyMTAsIDB4NjFjYywgMHgwMDQyLCAweDIxMDAsIDB4OTA4YSwKKwkweDAwM2YsIDB4MWEwNCwgMHgzNTExLCAweDYxY2MsIDB4MDgwNCwgMHgzNGE2LCAweDM0ZTgsIDB4MzUyMCwKKwkweDM1MTEsIDB4MzUyYSwgMHgzNTM0LCAweDM1M2EsIDB4MzUzZSwgMHgzNTRlLCAweDM1NTIsIDB4MzU2OCwKKwkweDM1NmUsIDB4MzU3NCwgMHgzNTdmLCAweDM1OGEsIDB4MzU5OSwgMHgzNWE4LCAweDM1YjYsIDB4MzVjZCwKKwkweDM1ZTgsIDB4MzUxMSwgMHgzNjkxLCAweDM2Y2YsIDB4Mzc3NSwgMHgzNzg2LCAweDM3YTksIDB4MzUxMSwKKwkweDM1MTEsIDB4MzUxMSwgMHgzN2UxLCAweDM3ZmQsIDB4MzgwNiwgMHgzODM1LCAweDM4M2IsIDB4MzUxMSwKKwkweDM4ODEsIDB4MzUxMSwgMHgzNTExLCAweDM1MTEsIDB4MzUxMSwgMHgzNTExLCAweDM4OGMsIDB4Mzg5NSwKKwkweDM4OWQsIDB4Mzg5ZiwgMHgzNTExLCAweDM1MTEsIDB4MzUxMSwgMHgzNTExLCAweDM1MTEsIDB4MzUxMSwKKwkweDM4Y2IsIDB4MzUxMSwgMHgzNTExLCAweDM1MTEsIDB4MzUxMSwgMHgzNTExLCAweDM4ZTgsIDB4Mzk1YywKKwkweDM1MTEsIDB4MzUxMSwgMHgzNTExLCAweDM1MTEsIDB4MzUxMSwgMHgzNTExLCAweDAwMDIsIDB4Mzk4NiwKKwkweDM5ODksIDB4MzllOCwgMHgzYTAxLCAweDNhMzEsIDB4M2NjZiwgMHgzNTExLCAweDUxOWYsIDB4MzUxMSwKKwkweDM1MTEsIDB4MzUxMSwgMHgzNTExLCAweDM1MTEsIDB4MzUxMSwgMHgzNTExLCAweDM1MTEsIDB4MzU2OCwKKwkweDM1NmUsIDB4NDI0OSwgMHg1NWZmLCAweDQyNWYsIDB4NTIyZSwgMHg1MjdmLCAweDUzOGEsIDB4MzUxMSwKKwkweDUzZWMsIDB4NTQyOCwgMHg1NDU5LCAweDU1NjEsIDB4NTQ4NiwgMHg1NGUxLCAweDM1MTEsIDB4NDI2MywKKwkweDQ0MDgsIDB4NDQxZSwgMHg0NDQzLCAweDQ0YTgsIDB4NDUxYywgMHg0NTNjLCAweDQ1YjMsIDB4NDYwZiwKKwkweDQ2NmIsIDB4NDY2ZSwgMHg0NjkzLCAweDQ3NDEsIDB4NDdhNywgMHg0N2FmLCAweDQ4ZTEsIDB4NGE0OSwKKwkweDRhN2QsIDB4NGNjNywgMHgzNTExLCAweDRjZTUsIDB4NGRhMiwgMHg0ZTc4LCAweDM1MTEsIDB4MzUxMSwKKwkweDM1MTEsIDB4MzUxMSwgMHg0ZWRlLCAweDRlZjksIDB4NDdhZiwgMHg1MTNmLCAweDcxNGMsIDB4MDAwMCwKKwkweDIwMjEsIDB4NDAwMCwgMHgwODBjLCAweDRhZmIsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MGUwNCwKKwkweDM0ZjIsIDB4MDAxMCwgMHgwMTJlLCAweDBjYzAsIDB4N2MzNiwgMHg5NDg2LCAweDQwMDAsIDB4MDExOCwKKwkweDc4MzMsIDB4MDAxMSwgMHgwMDEwLCAweDc4MzMsIDB4MDAxMCwgMHg3YzgyLCAweDc5ODYsIDB4N2E4YSwKKwkweDdiOGUsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywKKwkweDExZTAsIDB4NzAwNywgMHgwMDAxLCAweDIwOTEsIDB4NTAwMCwgMHg3MDBmLCAweDAwMDAsIDB4MDEyZSwKKwkweDAwMDUsIDB4MjAyMSwgMHg0MDAxLCAweDA4YjAsIDB4MjAyMSwgMHg0MDAyLCAweDA4OTgsIDB4MjAyMSwKKwkweDQwMDMsIDB4MDg4MCwgMHgyMDIxLCAweDQwMDUsIDB4MDg2OCwgMHgyMDIxLCAweDQwMDYsIDB4MDg1MCwKKwkweDIwMzksIDB4MDAwMSwgMHg5MDJlLCAweDI1MjAsIDB4N2I4OCwgMHg3YThjLCAweDc4ODQsIDB4Nzk5MCwKKwkweDA4MDQsIDB4NGIwOCwgMHgyMDM5LCAweDAwMDEsIDB4OTAyZSwgMHgyNTIwLCAweDdiODgsIDB4N2E4YywKKwkweDc4ODQsIDB4Nzk5MCwgMHgwODA0LCAweDRiMGIsIDB4Nzk4NCwgMHg3ODg4LCAweDIxMTQsIDB4MjAwYSwKKwkweDA4MDQsIDB4MzRlOCwgMHg3OTg0LCAweDIxMTQsIDB4MDgwNCwgMHgzNGU4LCAweDIwZTEsIDB4MDAwMCwKKwkweDIwOTksIDB4MDAyMSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMDIxLCAweDIwYTksIDB4MDAxZiwKKwkweDQwMDMsIDB4Nzk4NCwgMHg3YTg4LCAweDdiOGMsIDB4MDgwNCwgMHgzNGU4LCAweDc4ODQsIDB4MjA2MCwKKwkweDA4MDQsIDB4MzU5YiwgMHgyMDA5LCAweDAwMDMsIDB4MjAxMSwgMHgwMDAzLCAweDIwMTksIDB4MDAwOCwKKwkweDc4OWIsIDB4MDMxNywgMHg3ODkzLCAweGZmZmYsIDB4MjAwMSwgMHgxODhkLCAweDIwMDQsIDB4OTAwNSwKKwkweDAxMTgsIDB4Nzg5NiwgMHgwODA0LCAweDM0ZTgsIDB4Nzg5NywgMHgwMDAxLCAweDA4MDQsIDB4MzRlOCwKKwkweDIwMzksIDB4MDAwMSwgMHg3ZDk4LCAweDdjOWMsIDB4MDgwNCwgMHgzNTI0LCAweDIwMzksIDB4MDAwMSwKKwkweDdkOTgsIDB4N2M5YywgMHgwODA0LCAweDM1MmUsIDB4NzlhMCwgMHg5MTgyLCAweDAwNDAsIDB4MDIxMCwKKwkweDA4MDQsIDB4MzUxZCwgMHgyMTM4LCAweDdkOTgsIDB4N2M5YywgMHgwODA0LCAweDM1MjQsIDB4NzlhMCwKKwkweDkxODIsIDB4MDA0MCwgMHgwMjEwLCAweDA4MDQsIDB4MzUxZCwgMHgyMTM4LCAweDdkOTgsIDB4N2M5YywKKwkweDA4MDQsIDB4MzUyZSwgMHg3OWEwLCAweDkxODIsIDB4MDA0MCwgMHgwMjEwLCAweDA4MDQsIDB4MzUxZCwKKwkweDIxZTgsIDB4Nzk4NCwgMHg3ODg4LCAweDIwYTksIDB4MDAwMSwgMHgyMWEwLCAweDQwMDQsIDB4MDgwNCwKKwkweDM0ZTgsIDB4MjA2MSwgMHgwODAwLCAweGUxMGMsIDB4OTAwNiwgMHgyYzE1LCAweDkyMDAsIDB4OGM2MCwKKwkweDgxMDksIDB4MWRkOCwgMHgyMDEwLCAweDkwMDUsIDB4MDkwNCwgMHgzNGU4LCAweDA4MDQsIDB4MzUxNywKKwkweDc5YTAsIDB4OTE4MiwgMHgwMDQwLCAweDAyMTAsIDB4MDgwNCwgMHgzNTFkLCAweDIxZTAsIDB4MjBhOSwKKwkweDAwMDEsIDB4Nzk4NCwgMHgyMTk4LCAweDQwMTIsIDB4MDgwNCwgMHgzNGU4LCAweDIwNjksIDB4MTg1YiwKKwkweDc4ODQsIDB4Nzk5MCwgMHg5MTFhLCAweDFhMDQsIDB4MzUxZCwgMHg4MDE5LCAweDA5MDQsIDB4MzUxZCwKKwkweDY4NGEsIDB4Njk0MiwgMHg3ODhjLCAweDY4NTIsIDB4Nzg4OCwgMHg2ODU2LCAweDkwMDYsIDB4Njg1YSwKKwkweDY4NWUsIDB4MDgwYywgMHg3NTM1LCAweDA4MDQsIDB4MzRlOCwgMHgyMDY5LCAweDE4NWIsIDB4Nzg4NCwKKwkweDc5OTQsIDB4OTExYSwgMHgxYTA0LCAweDM1MWQsIDB4ODAxOSwgMHgwOTA0LCAweDM1MWQsIDB4Njg0ZSwKKwkweDY5NDYsIDB4Nzg4YywgMHg2ODYyLCAweDc4ODgsIDB4Njg2NiwgMHg5MDA2LCAweDY4NmEsIDB4Njg2ZSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NjhjMSwgMHgwMTJlLCAweDA4MDQsIDB4MzRlOCwKKwkweDkwMmUsIDB4MjUyMCwgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MDQsIDB4MzUxYSwKKwkweDc5ODQsIDB4N2I4OCwgMHg3YThjLCAweDIwYTksIDB4MDAwNSwgMHgyMGU5LCAweDAwMDEsIDB4MjBhMSwKKwkweDE4YTQsIDB4NDEwMSwgMHgwODBjLCAweDRhYmYsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwKKwkweDM1MWEsIDB4MjAwOSwgMHgwMDIwLCAweGE4NWMsIDB4OTA4MCwgMHgwMDE5LCAweGFmNjAsIDB4MDgwYywKKwkweDRiMDgsIDB4NzAxZiwgMHgzNjBjLCAweDAwMDUsIDB4YTg2NCwgMHgyMDA4LCAweDkwODQsIDB4MDBmZiwKKwkweDkwOTYsIDB4MDAxMSwgMHgwMTY4LCAweDkwOTYsIDB4MDAxOSwgMHgwMTUwLCAweDkwOTYsIDB4MDAxNSwKKwkweDAxMzgsIDB4OTA5NiwgMHgwMDQ4LCAweDAxMjAsIDB4OTA5NiwgMHgwMDI5LCAweDE5MDQsIDB4MzUxYSwKKwkweDgxMGYsIDB4OTE4YywgMHgwMGZmLCAweDA5MDQsIDB4MzUxYSwgMHg3MTEyLCAweDcwMTAsIDB4ODAwMSwKKwkweDA1NjAsIDB4NzAxMiwgMHgwODBjLCAweDRhYmYsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwKKwkweDM1MWEsIDB4MjAwOSwgMHgwMDIwLCAweDcwNjgsIDB4MjA0MCwgMHhhMjhjLCAweGEzOTAsIDB4YTQ5NCwKKwkweGE1OTgsIDB4OTI5MCwgMHgwMDQwLCAweDkzOTksIDB4MDAwMCwgMHg5NGExLCAweDAwMDAsIDB4OTVhOSwKKwkweDAwMDAsIDB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4YWY2MCwgMHgwODBjLCAweDRiMDgsIDB4NzAxZiwKKwkweDM2NGEsIDB4MDAwNSwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwgMHg5MDk2LCAweDAwMDIsIDB4MDEyMCwKKwkweDkwOTYsIDB4MDAwYSwgMHgxOTA0LCAweDM1MWEsIDB4MDg4OCwgMHg3MDE0LCAweDIwNDgsIDB4YTg2OCwKKwkweGMwZmQsIDB4YTg2YSwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwgMHg5MDk2LCAweDAwMjksIDB4MTE2MCwKKwkweGMyZmQsIDB4YWE3YSwgMHgwODBjLCAweDYwMzcsIDB4MDE1MCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweGE4N2EsIDB4YTk4MiwgMHgwMTJlLCAweDAwNTAsIDB4MDgwYywgMHg2MzU1LCAweDExMjgsIDB4NzAwNywKKwkweDAwMDMsIDB4NzAxZiwgMHgzNjc2LCAweDAwMDUsIDB4MDgwYywgMHg2ZDE3LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjBhOSwgMHgwMDA1LCAweDIwZTEsIDB4MDAwMSwgMHgyMDk5LCAweDE4YTQsIDB4NDAwYSwKKwkweDIxMDAsIDB4OTIxMCwgMHg5Mzk5LCAweDAwMDAsIDB4OTRhMSwgMHgwMDAwLCAweDk1YTksIDB4MDAwMCwKKwkweGE4NWMsIDB4OTA4MCwgMHgwMDE5LCAweDIwMDksIDB4MDAyMCwgMHgwMTJlLCAweGFmNjAsIDB4MDgwNCwKKwkweDRiMGIsIDB4MjA5MSwgMHg4MDAwLCAweDc4MzcsIDB4NDAwMCwgMHg3ODMzLCAweDAwMTAsIDB4Nzg4MywKKwkweDQwMDAsIDB4Nzg4NywgMHg0OTUzLCAweDc4OGIsIDB4NTAyMCwgMHg3ODhmLCAweDIwMjAsIDB4MjAwOSwKKwkweDAxN2YsIDB4MjEwNCwgMHg3ODkyLCAweDNmMDAsIDB4Nzg5NiwgMHgyMDYxLCAweDAxMDAsIDB4NjIwMCwKKwkweDIwNjEsIDB4MDIwMCwgMHg2MDNjLCAweDgwMDcsIDB4OTIwNSwgMHg3ODlhLCAweDIwMDksIDB4MDRmZCwKKwkweDIxMDQsIDB4Nzg5ZSwgMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwKKwkweDIwMDQsIDB4ZDA4NCwgMHgwMTgwLCAweDIwMDEsIDB4MTlmMSwgMHgyMDA0LCAweDkwMDUsIDB4MDEyOCwKKwkweDIwMDEsIDB4MDA4YiwgMHgyMDA0LCAweGQwZmMsIDB4MGRkOCwgMHgyMDAxLCAweDAwOGEsIDB4MjAwMywKKwkweDAwMDIsIDB4MjAwMywgMHgxMDAxLCAweDIwNzEsIDB4MDA4MCwgMHgwODA0LCAweDA0MjcsIDB4ODFmZiwKKwkweDE5MDQsIDB4MzUxYSwgMHg3OTg0LCAweDA4MGMsIDB4NjQ5ZiwgMHgxOTA0LCAweDM1MWQsIDB4N2U5OCwKKwkweDk2ODQsIDB4M2ZmZiwgMHg5MDgyLCAweDQwMDAsIDB4MWEwNCwgMHgzNTFkLCAweDdjODgsIDB4N2Q4YywKKwkweDA4MGMsIDB4NjYwMiwgMHgwODBjLCAweDY1ZDEsIDB4MDAwMCwgMHgxNTE4LCAweDIwNjEsIDB4MWNkMCwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDAxNDgsIDB4NjAxNCwKKwkweDkwNGQsIDB4MDEzMCwgMHhhODZjLCAweDk0MDYsIDB4MTExOCwgMHhhODcwLCAweDk1MDYsIDB4MDE1MCwKKwkweDAxMmUsIDB4OWNlMCwgMHgwMDE4LCAweDIwMDEsIDB4MTgxOSwgMHgyMDA0LCAweDljMDIsIDB4MWEwNCwKKwkweDM1MWEsIDB4MGMzMCwgMHgwODBjLCAweGJhNTYsIDB4MDEyZSwgMHgwOTA0LCAweDM1MWEsIDB4MDgwNCwKKwkweDM0ZTgsIDB4OTAwZSwgMHgyMDAxLCAweDAwMDUsIDB4MDgwYywgMHg2ZDE3LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDgwYywgMHhjMTMzLCAweDA4MGMsIDB4NmFlOSwgMHgwMTJlLCAweDA4MDQsIDB4MzRlOCwKKwkweDAwYTYsIDB4Mjk1MCwgMHhiMTk4LCAweDA4MGMsIDB4NjQ5ZiwgMHgxOTA0LCAweDM3NjIsIDB4YjZhNCwKKwkweDk2ODQsIDB4M2ZmZiwgMHg5MDgyLCAweDQwMDAsIDB4MTZlOCwgMHhiNDljLCAweGI1YTAsIDB4MDgwYywKKwkweDY2MDIsIDB4MDgwYywgMHg2NWQxLCAweDE1MjAsIDB4MjA2MSwgMHgxY2QwLCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDE0OCwgMHg2MDE0LCAweDkwNGQsIDB4MDEzMCwKKwkweGE4NmMsIDB4OTQwNiwgMHgxMTE4LCAweGE4NzAsIDB4OTUwNiwgMHgwMTU4LCAweDAxMmUsIDB4OWNlMCwKKwkweDAwMTgsIDB4MjAwMSwgMHgxODE5LCAweDIwMDQsIDB4OWMwMiwgMHgyMDA5LCAweDAwMGQsIDB4MTJiMCwKKwkweDBjMjgsIDB4MDgwYywgMHhiYTU2LCAweDAxMmUsIDB4MjAwOSwgMHgwMDAzLCAweDAxNzgsIDB4MDBlMCwKKwkweDkwMGUsIDB4MjAwMSwgMHgwMDA1LCAweDA4MGMsIDB4NmQxNywgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4YzEzMywgMHgwODBjLCAweDZhZGMsIDB4MDEyZSwgMHgwMDcwLCAweGIwOTcsIDB4NDAwNSwKKwkweGIxOWEsIDB4MDAxMCwgMHhiMDk3LCAweDQwMDYsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwKKwkweDAwMzAsIDB4MmE0OCwgMHgwMGFlLCAweDAwMDUsIDB4YjA5NywgMHg0MDAwLCAweDkwMDYsIDB4OTE4ZCwKKwkweDAwMDEsIDB4MjAwOCwgMHgyYTQ4LCAweDAwYWUsIDB4MDAwNSwgMHg4MWZmLCAweDE5MDQsIDB4MzUxYSwKKwkweDA4MGMsIDB4NGFkNiwgMHgwOTA0LCAweDM1MWQsIDB4MDgwYywgMHg2NTY2LCAweDA5MDQsIDB4MzUxYSwKKwkweDA4MGMsIDB4NjYwOCwgMHgwOTA0LCAweDM1MWEsIDB4MDgwNCwgMHg0NTMzLCAweDgxZmYsIDB4MTkwNCwKKwkweDM1MWEsIDB4MDgwYywgMHg0YWYyLCAweDA5MDQsIDB4MzUxZCwgMHgwODBjLCAweDY2OTYsIDB4MDkwNCwKKwkweDM1MWEsIDB4MjAxOSwgMHgwMDA1LCAweDc5YTgsIDB4MDgwYywgMHg2NjIzLCAweDA5MDQsIDB4MzUxYSwKKwkweDc4ODgsIDB4OTA4YSwgMHgxMDAwLCAweDFhMDQsIDB4MzUxZCwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwKKwkweDkxMDgsIDB4MDgwYywgMHg4MmU4LCAweDc5ODQsIDB4ZDE4NCwgMHgxOTA0LCAweDM0ZTgsIDB4MDgwNCwKKwkweDQ1MzMsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4ODFmZiwgMHgwMTE4LCAweDIwMDksIDB4MDAwMSwKKwkweDA0NTAsIDB4MjAyOSwgMHgwN2ZmLCAweDY0NTgsIDB4MjQwMCwgMHg5NTA2LCAweDAxZjgsIDB4MjUwOCwKKwkweDA4MGMsIDB4NjQ5ZiwgMHgxMWQ4LCAweDA4MGMsIDB4NjY5NiwgMHgxMTI4LCAweDIwMDksIDB4MDAwMiwKKwkweDYyYmMsIDB4MjUxOCwgMHgwMGMwLCAweDIwMTksIDB4MDAwNCwgMHg5MDBlLCAweDA4MGMsIDB4NjYyMywKKwkweDExMTgsIDB4MjAwOSwgMHgwMDA2LCAweDAwNzgsIDB4Nzg4NCwgMHg5MDhhLCAweDEwMDAsIDB4MTI3MCwKKwkweDgwMDMsIDB4ODAwYiwgMHg4MTBiLCAweDkxMDgsIDB4MDgwYywgMHg4MmU4LCAweDg1MjksIDB4MWFlMCwKKwkweDAxMmUsIDB4MDgwNCwgMHgzNGU4LCAweDAxMmUsIDB4MDgwNCwgMHgzNTFhLCAweDAxMmUsIDB4MDgwNCwKKwkweDM1MWQsIDB4MDgwYywgMHg0YWQ2LCAweDA5MDQsIDB4MzUxZCwgMHgwODBjLCAweDY1NjYsIDB4MDkwNCwKKwkweDM1MWEsIDB4YmFhMCwgMHgyMDE5LCAweDAwMDUsIDB4MDBjNiwgMHg5MDY2LCAweDA4MGMsIDB4ODgwMywKKwkweDAwNzYsIDB4OTAzZSwgMHgwODBjLCAweDg2ZjEsIDB4OTAwZSwgMHgwODBjLCAweGQ1ZjYsIDB4MDA3ZSwKKwkweDAwY2UsIDB4MDgwYywgMHg2NjAyLCAweDA4MDQsIDB4MzRlOCwgMHgwODBjLCAweDRhZDYsIDB4MDkwNCwKKwkweDM1MWQsIDB4MDgwYywgMHg2NjAyLCAweDIyMDgsIDB4MDgwNCwgMHgzNGU4LCAweDAxNTYsIDB4MDBkNiwKKwkweDAwZTYsIDB4MjA2OSwgMHgxOTBlLCAweDY4MTAsIDB4NjkxNCwgMHg5MTBhLCAweDEyMDgsIDB4OTAwZSwKKwkweDY4MTYsIDB4OTAxNiwgMHg5MDFlLCAweDIwYTksIDB4MDA3ZSwgMHgyMDY5LCAweDEwMDAsIDB4MmQwNCwKKwkweDkwNWQsIDB4MDExOCwgMHhiODRjLCAweDAwNTksIDB4OTIxMCwgMHg4ZDY4LCAweDFmMDQsIDB4MzgxNywKKwkweDIzMDAsIDB4OTIxOCwgMHgwMGVlLCAweDAwZGUsIDB4MDE1ZSwgMHgwODA0LCAweDM0ZTgsIDB4MDBmNiwKKwkweDAwMTYsIDB4OTA3ZCwgMHgwMTM4LCAweDkwMDYsIDB4ODAwMCwgMHgyZjBjLCAweDgxZmYsIDB4MDExMCwKKwkweDIxNzgsIDB4MGNkMCwgMHgwMDFlLCAweDAwZmUsIDB4MDAwNSwgMHgyMDY5LCAweDE5MGUsIDB4NjkxMCwKKwkweDYyYjgsIDB4MDgwNCwgMHgzNGU4LCAweDgxZmYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwNCwKKwkweDM1MWEsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg1NWVmLCAweDAxMjgsIDB4MjAwOSwKKwkweDAwMDcsIDB4MDEyZSwgMHgwODA0LCAweDM1MWEsIDB4MDEyZSwgMHg2MTU4LCAweDkxOTAsIDB4MzJlOSwKKwkweDIyMTUsIDB4OTI5NCwgMHgwMGZmLCAweDYzNzgsIDB4ODNmZiwgMHgwMTA4LCAweDYyN2MsIDB4NjdkOCwKKwkweDk3YzQsIDB4MDAwYSwgMHg5OGM2LCAweDAwMGEsIDB4MTExOCwgMHgyMDMxLCAweDAwMDEsIDB4MDBlOCwKKwkweDk3YzQsIDB4MDAyMiwgMHg5OGM2LCAweDAwMjIsIDB4MTExOCwgMHgyMDMxLCAweDAwMDMsIDB4MDBhOCwKKwkweDk3YzQsIDB4MDAxMiwgMHg5OGM2LCAweDAwMTIsIDB4MTExOCwgMHgyMDMxLCAweDAwMDIsIDB4MDA2OCwKKwkweDA4MGMsIDB4NzIwNywgMHgxMTE4LCAweDIwMzEsIDB4MDAwNCwgMHgwMDM4LCAweGQ3OWMsIDB4MDEyMCwKKwkweDIwMDksIDB4MDAwNSwgMHgwODA0LCAweDM1MWEsIDB4OTAzNiwgMHg3ZTlhLCAweDdmOWUsIDB4MDgwNCwKKwkweDM0ZTgsIDB4NjE0OCwgMHg2MjRjLCAweDIwMTksIDB4MTk1ZSwgMHgyMzFjLCAweDIwMDEsIDB4MTk1ZiwKKwkweDIwMDQsIDB4Nzg5YSwgMHgwODA0LCAweDM0ZTgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjEzOCwKKwkweDYyM2MsIDB4NjM0MCwgMHgwMTJlLCAweDA4MDQsIDB4MzRlOCwgMHgwODBjLCAweDRhZjIsIDB4MDkwNCwKKwkweDM1MWQsIDB4YmE0NCwgMHhiYjM4LCAweDA4MDQsIDB4MzRlOCwgMHgwODBjLCAweDBkZmEsIDB4MDgwYywKKwkweDRhZjIsIDB4MjExMCwgMHgwOTA0LCAweDM1MWQsIDB4YjgwNCwgMHg5MDhjLCAweDAwZmYsIDB4OTE4ZSwKKwkweDAwMDYsIDB4MDE0MCwgMHg5MDg0LCAweGZmMDAsIDB4OTA4NiwgMHgwNjAwLCAweDIwMDksIDB4MDAwOSwKKwkweDE5MDQsIDB4MzUxYSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDE5LCAweDAwMDUsIDB4MDBjNiwKKwkweDkwNjYsIDB4MDgwYywgMHg5YmM5LCAweDA4MGMsIDB4ODgwMywgMHgwMDc2LCAweDkwM2UsIDB4MDgwYywKKwkweDg2ZjEsIDB4OTAwZSwgMHgwODBjLCAweGQ1ZjYsIDB4MDA3ZSwgMHgwMGNlLCAweGI4MDcsIDB4MDQwNywKKwkweDAxMmUsIDB4MDgwNCwgMHgzNGU4LCAweDYxNDgsIDB4NjI0YywgMHg3ODg0LCAweDYwNGEsIDB4N2I4OCwKKwkweDYzNGUsIDB4MjA2OSwgMHgxODViLCAweDgzMWYsIDB4OTMwNSwgMHg2ODE2LCAweDc4OGMsIDB4MjA2OSwKKwkweDE5NWUsIDB4MmQxYywgMHgyMDZhLCAweDdlOTgsIDB4OTY4MiwgMHgwMDE0LCAweDEyMTAsIDB4MjAzMSwKKwkweDA3ZDAsIDB4MjA2OSwgMHgxOTVmLCAweDJkMDQsIDB4MjY2YSwgMHg3ODlhLCAweDA4MDQsIDB4MzRlOCwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYxMzgsIDB4Nzg4NCwgMHg2MDNhLCAweDkxMGUsIDB4ZDFiNCwKKwkweDE5MGMsIDB4MGVlMSwgMHhkMGM0LCAweDAxYTgsIDB4MDBkNiwgMHg3OGE4LCAweDIwMDksIDB4MTk3NSwKKwkweDIwMGEsIDB4NzhhYywgMHgyMDExLCAweDE5NzYsIDB4MjAxMiwgMHgyMDY5LCAweDAxMDAsIDB4NjgzOCwKKwkweDkwODYsIDB4MDAwNywgMHgxMTE4LCAweDIyMTQsIDB4NmE1YSwgMHgwMDEwLCAweDIxMGMsIDB4Njk1YSwKKwkweDAwZGUsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDBhLCAweDAxNjgsIDB4MjAxMSwKKwkweDAxMTQsIDB4MjIwYywgMHg3ODg4LCAweGQwOGMsIDB4MDExOCwgMHg5MThkLCAweDAwODAsIDB4MDAxMCwKKwkweDkxOGMsIDB4ZmY3ZiwgMHgyMTEyLCAweDAwNjAsIDB4MjAxMSwgMHgwMTE2LCAweDIyMGMsIDB4Nzg4OCwKKwkweGQwOGMsIDB4MDExOCwgMHg5MThkLCAweDAwNDAsIDB4MDAxMCwgMHg5MThjLCAweGZmN2YsIDB4MjExMiwKKwkweDYwM2MsIDB4Nzk4OCwgMHg2MTNlLCAweDYxNDAsIDB4OTEwZCwgMHg3ODhjLCAweDYwNDIsIDB4N2E4OCwKKwkweDkyOTQsIDB4MTAwMCwgMHg5MjA1LCAweDkxMGUsIDB4ZDFlNCwgMHgxOTBjLCAweDBlZjcsIDB4NjA0MCwKKwkweGQwY2MsIDB4MDEyMCwgMHg3OGIwLCAweDIwMTEsIDB4MDExNCwgMHgyMDEyLCAweDAxMmUsIDB4MDgwNCwKKwkweDM0ZTgsIDB4MDBmNiwgMHgyMDc5LCAweDE4MDAsIDB4N2EzOCwgMHhhODk4LCAweDkwODQsIDB4ZmViZiwKKwkweDkyMTUsIDB4YTg5YywgMHg5MDg0LCAweGZlYmYsIDB4ODAwMiwgMHg5MjE0LCAweDc4MzgsIDB4OTA4NCwKKwkweDAxNDAsIDB4OTIxNSwgMHg3YTNhLCAweGE4OTcsIDB4NDAwMCwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwKKwkweDIwMDEsIDB4MDAwMCwgMHgwMGZlLCAweDAwMDUsIDB4Nzg5OCwgMHg5MDA1LCAweDAxYTgsIDB4Nzg4OCwKKwkweDkwMjUsIDB4MDkwNCwgMHgzNTFkLCAweDc4OGMsIDB4OTAyZCwgMHgwOTA0LCAweDM1MWQsIDB4OTAwZSwKKwkweDA4MGMsIDB4NjQ5ZiwgMHgxMTIwLCAweGJhNDQsIDB4YmIzOCwgMHhiYzQ2LCAweGJkM2EsIDB4OTE4NiwKKwkweDA3ZmYsIDB4MDE5MCwgMHg4MTA4LCAweDBjYTAsIDB4MDgwYywgMHg0YWYyLCAweDA5MDQsIDB4MzUxZCwKKwkweDc4ODgsIDB4OTAwZCwgMHgwOTA0LCAweDM1MWQsIDB4Nzg4YywgMHg5MDA1LCAweDA5MDQsIDB4MzUxZCwKKwkweGJhNDQsIDB4Yjk0NiwgMHhiYjM4LCAweGI4M2EsIDB4MDgwNCwgMHgzNGU4LCAweDIwMTEsIDB4YmMwOSwKKwkweDAwMTAsIDB4MjAxMSwgMHhiYzA1LCAweDA4MGMsIDB4NTVlZiwgMHgxOTA0LCAweDM1MWEsIDB4MDBjNiwKKwkweDIwNjEsIDB4MDEwMCwgMHg3OTg0LCAweDkxODYsIDB4MDBmZiwgMHgxMTMwLCAweDIwMDEsIDB4MTgxNywKKwkweDIwMDQsIDB4OTA4NSwgMHhmZjAwLCAweDAwODgsIDB4OTE4MiwgMHgwMDdmLCAweDE2ZTAsIDB4OTE4OCwKKwkweDMyZTksIDB4MjEwZCwgMHg5MThjLCAweDAwZmYsIDB4MjAwMSwgMHgxODE3LCAweDIwMDQsIDB4MDAyNiwKKwkweDkxMTYsIDB4MDAyZSwgMHgwNTgwLCAweDgxMGYsIDB4OTEwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDAwMDYsIDB4MDgwYywgMHhhMDhkLCAweDAwMGUsIDB4MDUxMCwgMHg2MDJlLCAweDYyMGEsIDB4Nzk4NCwKKwkweDAwYjYsIDB4MDgwYywgMHg2NDQ1LCAweDJiMDgsIDB4MDBiZSwgMHgxNTAwLCAweDYxMTIsIDB4NjAyMywKKwkweDAwMDEsIDB4MDgwYywgMHg0YWJmLCAweDAxZDAsIDB4OTAwNiwgMHhhODY2LCAweDcwMDcsIDB4MDAwMywKKwkweGE4MzIsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4NzAxZiwgMHgzOWUxLCAweDI5MDAsIDB4NjAxNiwKKwkweDIwMDksIDB4MDAzMiwgMHgwODBjLCAweGExNWQsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsIDB4MDEyZSwKKwkweDAwY2UsIDB4MDgwNCwgMHgzNTFhLCAweDAwY2UsIDB4MDgwNCwgMHgzNTFkLCAweDA4MGMsIDB4YTBlMywKKwkweDBjYjAsIDB4YTgzMCwgMHg5MDg2LCAweDAxMDAsIDB4MDkwNCwgMHgzNTFhLCAweDA4MDQsIDB4MzRlOCwKKwkweDIwNjEsIDB4MWE0OCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDAwLCAweGQwODQsIDB4MDE3MCwKKwkweDYxMDQsIDB4NjIwOCwgMHgyMDYxLCAweDE4MDAsIDB4NjM1MCwgMHg2MDcwLCAweDc4OWEsIDB4NjBiYywKKwkweDc4OWUsIDB4NjBiOCwgMHg3OGFhLCAweDAxMmUsIDB4MDgwNCwgMHgzNGU4LCAweDkwMGUsIDB4MjExMCwKKwkweDBjODgsIDB4ODFmZiwgMHgxOTA0LCAweDM1MWEsIDB4MDgwYywgMHg3MjA3LCAweDA5MDQsIDB4MzUxYSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYyNTAsIDB4NjA3MCwgMHg5MjAyLCAweDAyNDgsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDgwYywgMHgyN2Q3LCAweDA4MGMsIDB4NTgwZSwgMHgwMTJlLCAweDA4MDQsIDB4MzRlOCwKKwkweDAxMmUsIDB4MDgwNCwgMHgzNTFkLCAweDAwMDYsIDB4MDAxNiwgMHgwMGM2LCAweDAwZTYsIDB4MjAwMSwKKwkweDE5ODEsIDB4MjA3MCwgMHgyMDYxLCAweDE4NWIsIDB4NjAwOCwgMHgyMDcyLCAweDkwMGUsIDB4MjAxMSwKKwkweDE0MDAsIDB4MDgwYywgMHg4NGZmLCAweDcyMDYsIDB4MDBlZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwZSwKKwkweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4ODFmZiwgMHgwMTI4LCAweDAxMmUsIDB4MjAyMSwKKwkweDQwMGIsIDB4MDgwNCwgMHgzNGVhLCAweDc4ODQsIDB4ZDBmYywgMHgwMTQ4LCAweDIwMDEsIDB4MDAyYSwKKwkweDIwMDQsIDB4OTA4MiwgMHgwMGUxLCAweDAyODgsIDB4MDEyZSwgMHgwODA0LCAweDM1MWQsIDB4MjAwMSwKKwkweDAwMmEsIDB4MjAwNCwgMHgyMDY5LCAweDE4NWIsIDB4NjkwOCwgMHg5MTAyLCAweDEyMzAsIDB4MDEyZSwKKwkweDA4MDQsIDB4MzUxZCwgMHgwMTJlLCAweDA4MDQsIDB4MzUxYSwgMHgwODBjLCAweGEwNjIsIDB4MGRkMCwKKwkweDc4ODQsIDB4ZDBmYywgMHgwOTA0LCAweDNhYWMsIDB4MDBjNiwgMHgwODBjLCAweDRhYmYsIDB4MDBjZSwKKwkweDBkODgsIDB4YTg2NywgMHgwMDAwLCAweDc4ODQsIDB4YTgwYSwgMHg3ODk4LCAweGE4MGUsIDB4Nzg5YywKKwkweGE4MTIsIDB4MjAwMSwgMHgwMDJlLCAweDIwMDQsIDB4YTgxYSwgMHgyMDAxLCAweDAwMmYsIDB4MjAwNCwKKwkweGE4MWUsIDB4MjAwMSwgMHgwMDMwLCAweDIwMDQsIDB4YTgyMiwgMHgyMDAxLCAweDAwMzEsIDB4MjAwNCwKKwkweGE4MjYsIDB4MjAwMSwgMHgwMDM0LCAweDIwMDQsIDB4YTgyYSwgMHgyMDAxLCAweDAwMzUsIDB4MjAwNCwKKwkweGE4MmUsIDB4MjAwMSwgMHgwMDJhLCAweDIwMDQsIDB4OTA4MCwgMHgwMDAzLCAweDkwODQsIDB4MDBmYywKKwkweDgwMDQsIDB4YTgxNiwgMHgwODBjLCAweDNjMzIsIDB4MDkyOCwgMHg3MDE0LCAweDIwNDgsIDB4YWQyYywKKwkweGFjMjgsIDB4YWIxYywgMHhhYTE4LCAweGE5MzAsIDB4YTgwOCwgMHhkMGI0LCAweDExMjAsIDB4MjAyOSwKKwkweDAwMDAsIDB4MjAyMSwgMHgwMDAwLCAweDg5MDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwKKwkweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMWIsIDB4MDgwYywgMHg0YjA4LCAweDcwMWYsIDB4M2I2ZiwKKwkweDcwMjMsIDB4MDAwMSwgMHgwMTJlLCAweDAwMDUsIDB4MDA0NiwgMHgwMDg2LCAweDAwOTYsIDB4MDBhNiwKKwkweDAwYjYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgwODBjLCAweDNhMWIsIDB4MjAwMSwKKwkweDE5NzcsIDB4MjAwMywgMHgwMDAwLCAweDIwMjEsIDB4MDAwYSwgMHgyMDYxLCAweDAxMDAsIDB4NjEwNCwKKwkweDAwMTYsIDB4NjBiYiwgMHgwMDAwLCAweDYwYmYsIDB4MzJlMSwgMHg2MGJmLCAweDAwMTIsIDB4MDgwYywKKwkweDNjYTEsIDB4MDgwYywgMHgzYzYwLCAweDAwZjYsIDB4MDBlNiwgMHgwMDg2LCAweDI5NDAsIDB4MjA3MSwKKwkweDFhM2QsIDB4MjA3OSwgMHgwMDkwLCAweDAwZDYsIDB4MjA2OSwgMHgwMDAwLCAweDY4ODQsIDB4ZDBiNCwKKwkweDAxNDAsIDB4MjAwMSwgMHgwMDM1LCAweDIwMDQsIDB4NzgwZSwgMHgyMDAxLCAweDAwMzQsIDB4MjAwNCwKKwkweDc4MGEsIDB4MDBkZSwgMHgyMDExLCAweDAwMDEsIDB4MDgwYywgMHg0MDhkLCAweDAwOGUsIDB4MDBlZSwKKwkweDAwZmUsIDB4MDgwYywgMHgzZmJhLCAweDA4MGMsIDB4M2U3ZiwgMHgwNWI4LCAweDIwMDEsIDB4MDIwYiwKKwkweDIwMDQsIDB4OTA4NCwgMHgwMTQwLCAweDFkYjgsIDB4MDgwYywgMHg0MTAxLCAweDAwZjYsIDB4MjA3OSwKKwkweDAzMDAsIDB4NzhiYywgMHgwMGZlLCAweDkwOGMsIDB4MDA3MCwgMHgxNTYwLCAweDIwNzEsIDB4MDIwMCwKKwkweDcwMzcsIDB4MDAwMCwgMHg3MDUwLCAweDkwODQsIDB4ZmYwMCwgMHg5MDg2LCAweDMyMDAsIDB4MTUxMCwKKwkweDcwMzcsIDB4MDAwMSwgMHg3MDUwLCAweDkwODQsIDB4ZmYwMCwgMHg5MDg2LCAweGUxMDAsIDB4MTFkMCwKKwkweDcwMzcsIDB4MDAwMCwgMHg3MDU0LCAweDcwMzcsIDB4MDAwMCwgMHg3MTVjLCAweDkxMDYsIDB4MTE5MCwKKwkweDIwMDEsIDB4MTgxZiwgMHgyMDA0LCAweDkxMDYsIDB4MTE2OCwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwKKwkweDYwMjQsIDB4OTA4NCwgMHgxZTAwLCAweDAwY2UsIDB4MDEzOCwgMHgwODBjLCAweDNlODksIDB4MDgwYywKKwkweDNjNWIsIDB4MDA1OCwgMHgwODBjLCAweDNjNWIsIDB4MDgwYywgMHg0MDI1LCAweDA4MGMsIDB4M2ZiMCwKKwkweDIwMDEsIDB4MDIwYiwgMHgyMDA0LCAweGQwZTQsIDB4MGRkOCwgMHgyMDAxLCAweDAzMmEsIDB4MjAwMywKKwkweDAwMDQsIDB4MjA2MSwgMHgwMTAwLCAweDYwMjcsIDB4MDAwMiwgMHgwMDFlLCAweDYxMDYsIDB4MjAxMSwKKwkweDAyMGQsIDB4MjAxMywgMHgwMDIwLCAweDYwYmIsIDB4MDAwMCwgMHg2MGJmLCAweDAxMDgsIDB4NjBiZiwKKwkweDAwMTIsIDB4MjAwMSwgMHgwMDA0LCAweDIwMGMsIDB4OTE4YywgMHhmZmZkLCAweDIxMDIsIDB4MDgwYywKKwkweDEyZjgsIDB4MjAwOSwgMHgwMDI4LCAweDA4MGMsIDB4MjMwYSwgMHgyMDAxLCAweDAyMjcsIDB4MjAwYywKKwkweDIxMDIsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMGJlLCAweDAwYWUsIDB4MDA5ZSwKKwkweDAwOGUsIDB4MDA0ZSwgMHgyMDAxLCAweDE5NzcsIDB4MjAwNCwgMHg5MDA1LCAweDExMTgsIDB4MDEyZSwKKwkweDA4MDQsIDB4MzRlOCwgMHgwMTJlLCAweDIwMjEsIDB4NDAwYywgMHgwODA0LCAweDM0ZWEsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MDA3NiwgMHgwMDg2LCAweDAwOTYsIDB4MDBkNiwKKwkweDAxNTYsIDB4NzAxNCwgMHgyMDQ4LCAweDcwMjAsIDB4MjBhOCwgMHg4MDAwLCAweDcwMjIsIDB4YTgwNCwKKwkweDkwMDUsIDB4MDkwNCwgMHgzYmNiLCAweDIwNDgsIDB4MWYwNCwgMHgzYjdmLCAweDcwNjgsIDB4MjA0MCwKKwkweGEyOGMsIDB4YTM5MCwgMHhhNDk0LCAweGE1OTgsIDB4YTkzMCwgMHhhODA4LCAweGQwYjQsIDB4MTEyMCwKKwkweDIwMjksIDB4MDAwMCwgMHgyMDIxLCAweDAwMDAsIDB4MDA5NiwgMHg3MDE0LCAweDIwNDgsIDB4YTg2NCwKKwkweDAwOWUsIDB4OTA4NiwgMHgwMTAzLCAweDAxNzAsIDB4ODkwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTBiYywKKwkweDAwM2YsIDB4OTA4NCwgMHhmZmMwLCAweDkwODAsIDB4MDAxYiwgMHgwODBjLCAweDRiMDgsIDB4NzAxZiwKKwkweDNiNmYsIDB4MDBiMCwgMHg4OTA2LCAweDgwMDYsIDB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwKKwkweGZmYzAsIDB4OTA4MCwgMHgwMDFiLCAweDIxYTgsIDB4MjdlMCwgMHgyMDk4LCAweDI3ZTgsIDB4MjBhMCwKKwkweDAwMDYsIDB4MDgwYywgMHgwZmFlLCAweDAwMGUsIDB4MDgwYywgMHg0YjBiLCAweDcwMWYsIDB4M2I2ZiwKKwkweDAxNWUsIDB4MDBkZSwgMHgwMDllLCAweDAwOGUsIDB4MDA3ZSwgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDcwMTQsIDB4MjA0OCwgMHhhODY0LCAweDkwODYsIDB4MDEwMywKKwkweDExMTgsIDB4NzAxZiwgMHgzYzMwLCAweDA0NTAsIDB4NzAxNCwgMHgyMDQ4LCAweGE4NjgsIDB4YzBmZCwKKwkweGE4NmEsIDB4MjAwOSwgMHgwMDdmLCAweDA4MGMsIDB4NjQzZiwgMHgwMTEwLCAweDkwMDYsIDB4MDAzMCwKKwkweGI4MTMsIDB4MDBmZiwgMHhiODE3LCAweGZmZmQsIDB4MDgwYywgMHhjMzAyLCAweDAxNWUsIDB4MDBkZSwKKwkweDAwOWUsIDB4MDA4ZSwgMHgwMDdlLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwKKwkweDA5MDQsIDB4MzUxYSwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MDA3NiwKKwkweDAwODYsIDB4MDA5NiwgMHgwMGQ2LCAweDAxNTYsIDB4NzAxZiwgMHgzYzAyLCAweDcwMDcsIDB4MDAwMywKKwkweDA4MDQsIDB4M2JjMCwgMHhhODMwLCAweDkwODYsIDB4MDEwMCwgMHgyMDIxLCAweDQwMGMsIDB4MDkwNCwKKwkweDM0ZWEsIDB4MDA3NiwgMHhhZDEwLCAweGFjMGMsIDB4YWIyNCwgMHhhYTIwLCAweGE5MzAsIDB4YTgwOCwKKwkweGQwYjQsIDB4MTEyMCwgMHgyMDI5LCAweDAwMDAsIDB4MjAyMSwgMHgwMDAwLCAweDg5MDYsIDB4ODAwNiwKKwkweDgwMDcsIDB4OTBiYywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMWIsIDB4MjFhOCwKKwkweDI3ZTAsIDB4MjA5OCwgMHgyN2U4LCAweDIwYTAsIDB4MDAwNiwgMHgwODBjLCAweDBmYWUsIDB4MDAwZSwKKwkweDA4MGMsIDB4NGIwYiwgMHgwMDdlLCAweDcwMWYsIDB4M2I2ZiwgMHg3MDIzLCAweDAwMDEsIDB4MDAwNSwKKwkweDA4MDQsIDB4MzRlOCwgMHgwMTU2LCAweDAwYzYsIDB4YTgxNCwgMHg5MDhhLCAweDAwMWUsIDB4MDIxOCwKKwkweGE4MzMsIDB4MDAxZSwgMHgwMDEwLCAweGE4MzIsIDB4MDA3OCwgMHg4MWZmLCAweDAxNjgsIDB4MDAxNiwKKwkweDA4MGMsIDB4NGFiZiwgMHgwMDFlLCAweDAxMzAsIDB4YTgwMCwgMHgyMDQwLCAweGEwMDgsIDB4YTgwYSwKKwkweDIxMDAsIDB4MGM1OCwgMHg5MDA2LCAweDAwMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwY2UsIDB4MDE1ZSwKKwkweDAwMDUsIDB4MDAwNiwgMHgwMGY2LCAweDIwNzksIDB4MDAwMCwgMHg3ODgwLCAweDkwODYsIDB4MDA0NCwKKwkweDAwZmUsIDB4MDAwZSwgMHgwMDA1LCAweDIwMDEsIDB4MTk3NywgMHgyMDAzLCAweDAwMDEsIDB4MDAwNSwKKwkweDAwZjYsIDB4MDBlNiwgMHgwMGM2LCAweDIwNjEsIDB4MDIwMCwgMHgyMDAxLCAweDE5ODIsIDB4MjAwNCwKKwkweDYwMWEsIDB4MjA2MSwgMHgwMTAwLCAweDIwMDEsIDB4MTk4MSwgMHgyMDA0LCAweDYwY2UsIDB4NjEwNCwKKwkweGMxYWMsIDB4NjEwNiwgMHgwODBjLCAweDRhYmYsIDB4YTgxMywgMHgwMDE5LCAweGE4MTcsIDB4MDAwMSwKKwkweDI5MDAsIDB4YTg1YSwgMHgyMDAxLCAweDAwMmUsIDB4MjAwNCwgMHhhODY2LCAweDIwMDEsIDB4MDAyZiwKKwkweDIwMDQsIDB4YTg2YSwgMHgyMDYxLCAweDAwOTAsIDB4MjA3OSwgMHgwMTAwLCAweDIwMDEsIDB4MTk4MSwKKwkweDIwMDQsIDB4NjAzNiwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywgMHgyMzBhLCAweDIwMDEsIDB4MDAyYSwKKwkweDIwMDQsIDB4OTA4NCwgMHhmZmY4LCAweGE4NmUsIDB4NjAxYSwgMHhhODczLCAweDAwMDAsIDB4NjAxZiwKKwkweDAwMDAsIDB4NzhjYSwgMHg5MDA2LCAweDYwMGEsIDB4NjAwZSwgMHgwMGNlLCAweDAwZWUsIDB4MDBmZSwKKwkweDAwMDUsIDB4MDBlNiwgMHgwODBjLCAweDRhYmYsIDB4Mjk0MCwgMHhhMDEzLCAweDAwMTksIDB4YTAxNywKKwkweDAwMDEsIDB4MjgwMCwgMHhhMDVhLCAweDIwMDEsIDB4MDAzMCwgMHgyMDA0LCAweGE4NjYsIDB4MjAwMSwKKwkweDAwMzEsIDB4MjAwNCwgMHhhODZhLCAweDIwMDEsIDB4MDAyYSwgMHgyMDA0LCAweDkwODQsIDB4ZmZmOCwKKwkweGE4NmUsIDB4YTg3MywgMHgwMDAwLCAweDIwMDEsIDB4MDMyYSwgMHgyMDAzLCAweDAwMDQsIDB4MjAwMSwKKwkweDAzMDAsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MDIwZCwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwKKwkweDAwMDQsIDB4MjAwYywgMHg5MThkLCAweDAwMDIsIDB4MjEwMiwgMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHg4MWZmLCAweDAxNDgsIDB4MDgwYywgMHgyYmE4LCAweDExMzAsIDB4OTAwNiwKKwkweDA4MGMsIDB4MmFiOCwgMHg5MDA2LCAweDA4MGMsIDB4MmE5YiwgMHg3ODg0LCAweDkwODQsIDB4MDAwNywKKwkweDAwMDIsIDB4M2NlYywgMHgzY2ZiLCAweDNkMGEsIDB4M2NlOSwgMHgzY2U5LCAweDNjZTksIDB4M2NlOSwKKwkweDNjZTksIDB4MDEyZSwgMHgwODA0LCAweDM1MWQsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4NiwKKwkweDAwMGEsIDB4MGRiOCwgMHgyMDA5LCAweDAxMTQsIDB4MjEwNCwgMHg5MDg1LCAweDA4MDAsIDB4MjAwYSwKKwkweDA4MGMsIDB4M2VkMywgMHgwMGYwLCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwYSwKKwkweDBkNDAsIDB4MjAwOSwgMHgwMTE0LCAweDIxMDQsIDB4OTA4NSwgMHg0MDAwLCAweDIwMGEsIDB4MDgwYywKKwkweDNlZDMsIDB4MDA3OCwgMHgwODBjLCAweDcyMDcsIDB4MTEyOCwgMHgwMTJlLCAweDIwMDksIDB4MDAxNiwKKwkweDA4MDQsIDB4MzUxYSwgMHg4MWZmLCAweDAxMjgsIDB4MDEyZSwgMHgyMDIxLCAweDQwMGIsIDB4MDgwNCwKKwkweDM0ZWEsIDB4MDA4NiwgMHgwMDk2LCAweDAwYTYsIDB4MDBiNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwKKwkweDAwZjYsIDB4MDgwYywgMHgzYTFiLCAweDIwMDksIDB4MDEwMSwgMHgyMTBjLCAweDAwMTYsIDB4N2VjOCwKKwkweDdkY2MsIDB4OTAwNiwgMHgyMDY4LCAweDIwNjAsIDB4MjA1OCwgMHgwODBjLCAweDQxZGMsIDB4MDgwYywKKwkweDQxMmMsIDB4OTAzZSwgMHgyNzIwLCAweDAwZjYsIDB4MDBlNiwgMHgwMDg2LCAweDI5NDAsIDB4MjA3MSwKKwkweDFhM2QsIDB4MjA3OSwgMHgwMDkwLCAweDAwZDYsIDB4MjA2OSwgMHgwMDAwLCAweDY4ODQsIDB4ZDBiNCwKKwkweDAxMjAsIDB4NjhkNCwgMHg3ODBlLCAweDY4ZDAsIDB4NzgwYSwgMHgwMGRlLCAweDIwMTEsIDB4MDAwMSwKKwkweDA4MGMsIDB4NDA4ZCwgMHgwODBjLCAweDJiYjAsIDB4MDgwYywgMHgyYmIwLCAweDA4MGMsIDB4MmJiMCwKKwkweDA4MGMsIDB4MmJiMCwgMHgwODBjLCAweDQwOGQsIDB4MDA4ZSwgMHgwMGVlLCAweDAwZmUsIDB4MDgwYywKKwkweDNmYmEsIDB4MjAwOSwgMHg5YzQwLCAweDgxMDksIDB4MTFiMCwgMHgwODBjLCAweDNlODksIDB4MjAwMSwKKwkweDAwMDQsIDB4MjAwYywgMHg5MThjLCAweGZmZmQsIDB4MjEwMiwgMHgwMDFlLCAweDAwZmUsIDB4MDBlZSwKKwkweDAwZGUsIDB4MDBjZSwgMHgwMGJlLCAweDAwYWUsIDB4MDA5ZSwgMHgwMDhlLCAweDIwMDksIDB4MDAxNywKKwkweDA4MGMsIDB4MzUxYSwgMHgwY2Y4LCAweDIwMDEsIDB4MDIwYiwgMHgyMDA0LCAweDkwODQsIDB4MDE0MCwKKwkweDFkMTAsIDB4MDBmNiwgMHgyMDc5LCAweDAwMDAsIDB4Nzg4NCwgMHgwMGZlLCAweGQwYmMsIDB4MDE3OCwKKwkweDIwMDEsIDB4MDIwMSwgMHgyMDBjLCAweDgxZmYsIDB4MDE1MCwgMHgwODBjLCAweDNmOTgsIDB4MmQwMCwKKwkweDljMDUsIDB4OWIwNSwgMHgwMTIwLCAweDA4MGMsIDB4M2U4OSwgMHgwODA0LCAweDNlMjksIDB4MDgwYywKKwkweDQxMDEsIDB4MDgwYywgMHg0MDI1LCAweDA4MGMsIDB4M2Y3YiwgMHgwODBjLCAweDNmYjAsIDB4MDBmNiwKKwkweDIwNzksIDB4MDEwMCwgMHg3ODI0LCAweGQwYWMsIDB4MDEzMCwgMHg4YjU4LCAweDA4MGMsIDB4M2U4OSwKKwkweDAwZmUsIDB4MDgwNCwgMHgzZTI5LCAweDAwZmUsIDB4MDgwYywgMHgzZTdmLCAweDExNTAsIDB4OGQ2OCwKKwkweDIwMDEsIDB4MDAzMiwgMHgyNjAyLCAweDIwMDEsIDB4MDAzMywgMHgyNTAyLCAweDA4MGMsIDB4M2U4OSwKKwkweDAwODAsIDB4ODdmZiwgMHgwMTM4LCAweDIwMDEsIDB4MDIwMSwgMHgyMDA0LCAweDkwMDUsIDB4MTkwOCwKKwkweDg3MzksIDB4MDAzOCwgMHgyMDAxLCAweDFhM2EsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDAsIDB4MTkwNCwKKwkweDNkNzksIDB4MjAwMSwgMHgwMzJmLCAweDIwMDMsIDB4MDBmNiwgMHg4NjMxLCAweDEyMDgsIDB4ODUyOSwKKwkweDI1MDAsIDB4OTYwNSwgMHgwOTA0LCAweDNlMjksIDB4Nzg4NCwgMHhkMGJjLCAweDAxMjgsIDB4MmQwMCwKKwkweDljMDUsIDB4OWIwNSwgMHgxOTA0LCAweDNlMjksIDB4YTAxMywgMHgwMDE5LCAweDIwMDEsIDB4MDMyYSwKKwkweDIwMDMsIDB4MDAwNCwgMHg3ODg0LCAweGQwYWMsIDB4MTE0OCwgMHgyMDAxLCAweDFhM2EsIDB4MjAwMywKKwkweDAwMDMsIDB4MjAwMSwgMHgwMzJhLCAweDIwMDMsIDB4MDAwOSwgMHgwMDMwLCAweGEwMTcsIDB4MDAwMSwKKwkweDc4YjQsIDB4OTAwNSwgMHgwMTA4LCAweGEwMTYsIDB4MjgwMCwgMHhhMDVhLCAweDIwMDksIDB4MDA0MCwKKwkweDA4MGMsIDB4MjMwYSwgMHgyOTAwLCAweGE4NWEsIDB4YTgxMywgMHgwMDE5LCAweDc4ODQsIDB4ZDBhNCwKKwkweDExODAsIDB4YTgxNywgMHgwMDAwLCAweDAwYzYsIDB4MjBhOSwgMHgwMDA0LCAweDIwNjEsIDB4MDA5MCwKKwkweDYwMmIsIDB4MDAwOCwgMHgyMDAxLCAweDAyMDMsIDB4MjAwNCwgMHgxZjA0LCAweDNlMDAsIDB4MDBjZSwKKwkweDAwMzAsIDB4YTgxNywgMHgwMDAxLCAweDc4YjAsIDB4OTAwNSwgMHgwMTA4LCAweGE4MTYsIDB4MDBmNiwKKwkweDAwYzYsIDB4MjA3OSwgMHgwMTAwLCAweDIwNjEsIDB4MDA5MCwgMHg3ODI3LCAweDAwMDIsIDB4MjAwMSwKKwkweDAwMmEsIDB4MjAwNCwgMHg5MDg0LCAweGZmZjgsIDB4NjAxYSwgMHgwMDA2LCAweDIwMDEsIDB4MDAyYiwKKwkweDIwMDQsIDB4NjAxZSwgMHg3OGM2LCAweDAwMGUsIDB4NzhjYSwgMHgwMGNlLCAweDAwZmUsIDB4MDgwNCwKKwkweDNkMzMsIDB4MDAxZSwgMHgwMGM2LCAweDIwMDEsIDB4MDMyYSwgMHgyMDAzLCAweDAwMDQsIDB4MjA2MSwKKwkweDAxMDAsIDB4NjAyNywgMHgwMDAyLCAweDYxMDYsIDB4MjAxMSwgMHgwMjBkLCAweDIwMTMsIDB4MDAyMCwKKwkweDIwMDEsIDB4MDAwNCwgMHgyMDBjLCAweDkxOGMsIDB4ZmZmZCwgMHgyMTAyLCAweDA4MGMsIDB4MTJmOCwKKwkweDc4ODQsIDB4OTA4NCwgMHgwMDAzLCAweDkwODYsIDB4MDAwMiwgMHgwNTA4LCAweDIwMDksIDB4MDAyOCwKKwkweDA4MGMsIDB4MjMwYSwgMHgyMDAxLCAweDAyMjcsIDB4MjAwYywgMHgyMTAyLCAweDYwNTAsIDB4MDAwNiwKKwkweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwYSwgMHgwMDBlLCAweDAxMTgsIDB4OTA4NCwKKwkweGI3ZWYsIDB4MDAyMCwgMHg5MDg0LCAweGI3ZmYsIDB4MDgwYywgMHgyY2Y1LCAweDYwNTIsIDB4NjAyZiwKKwkweDAwMDAsIDB4NjA0YiwgMHhmN2Y3LCAweDYwNDMsIDB4MDA5MCwgMHg2MDQzLCAweDAwMTAsIDB4MDBjZSwKKwkweDJkMDgsIDB4MmMxMCwgMHgyYjE4LCAweDJiMDAsIDB4OWMwNSwgMHg5ZDA1LCAweDAwZmUsIDB4MDBlZSwKKwkweDAwZGUsIDB4MDBjZSwgMHgwMGJlLCAweDAwYWUsIDB4MDA5ZSwgMHgwMDhlLCAweDExMTgsIDB4MDEyZSwKKwkweDA4MDQsIDB4MzRlOCwgMHgwMTJlLCAweDIwMjEsIDB4NDAwYywgMHgwODA0LCAweDM0ZWEsIDB4OTA4NSwKKwkweDAwMDEsIDB4MWQwNCwgMHgzZTg4LCAweDIwOTEsIDB4NjAwMCwgMHg4NDIwLCAweDk0ODYsIDB4MDA2NCwKKwkweDAwMDUsIDB4MjAwMSwgMHgwMTA1LCAweDIwMDMsIDB4MDAxMCwgMHgyMDAxLCAweDAzMmEsIDB4MjAwMywKKwkweDAwMDQsIDB4MjAwMSwgMHgxYTNhLCAweDIwMDMsIDB4MDAwMCwgMHgwMDcxLCAweDIwMDksIDB4MDA0OCwKKwkweDA4MGMsIDB4MjMwYSwgMHgyMDAxLCAweDAyMjcsIDB4MjAyNCwgMHgyNDAyLCAweDIwMDEsIDB4MDEwOSwKKwkweDIwMDMsIDB4NDAwMCwgMHg5MDI2LCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDIwNzEsIDB4MWEzZCwKKwkweDcwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDA1MjAsIDB4MjA3OSwgMHgwMDkwLCAweDIwMDksIDB4MDIwNiwKKwkweDIxMDQsIDB4MjAwOSwgMHgwMjAzLCAweDIxMGMsIDB4OTEwNiwgMHgxMTIwLCAweDIwMDksIDB4MDA0MCwKKwkweDA4MGMsIDB4MjMwYSwgMHg3ODJjLCAweGQwZmMsIDB4MGQ4OCwgMHgwODBjLCAweDQxMDEsIDB4NzAwMCwKKwkweDkwODYsIDB4MDAwMCwgMHgxZDU4LCAweDc4MmIsIDB4MDAwNCwgMHg3ODJjLCAweGQwYWMsIDB4MWRlOCwKKwkweDIwMDksIDB4MDA0MCwgMHgwODBjLCAweDIzMGEsIDB4NzgyYiwgMHgwMDAyLCAweDcwMDMsIDB4MDAwMCwKKwkweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwYSwKKwkweDE1ZDAsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4MjAwMSwgMHgxODE3LCAweDIwMGMsIDB4NzkzMiwKKwkweDc5MzYsIDB4MDgwYywgMHgyN2I3LCAweDA4MGMsIDB4MmNjMiwgMHgwODBjLCAweDJjZjUsIDB4Nzg0YiwKKwkweGY3ZjcsIDB4Nzg0MywgMHgwMDkwLCAweDc4NDMsIDB4MDAxMCwgMHg3ODUwLCAweGMwZTUsIDB4Nzg1MiwKKwkweDIwMTksIDB4NjFhOCwgMHg3ODIwLCAweGQwOWMsIDB4MDExMCwgMHg4MzE5LCAweDFkZDgsIDB4Nzg1MCwKKwkweGMwZTQsIDB4Nzg1MiwgMHg3ODI3LCAweDAwNDgsIDB4Nzg0MywgMHgwMDQwLCAweDIwMTksIDB4MDFmNCwKKwkweGEwMDEsIDB4YTAwMSwgMHg4MzE5LCAweDFkZTAsIDB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmM4OCwKKwkweDc4MjcsIDB4MDAyMCwgMHg3ODQzLCAweDAwMDAsIDB4OTAwNiwgMHgwODBjLCAweDJjODgsIDB4NzgyNywKKwkweDAwNDgsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDIwMDEsIDB4MTgxNywKKwkweDIwMGMsIDB4NzkzMiwgMHg3OTM2LCAweDA4MGMsIDB4MjdiNywgMHg3ODUwLCAweDkwODQsIDB4ZmJmZiwKKwkweDkwODUsIDB4MDAzMCwgMHg3ODUyLCAweDIwMTksIDB4MDFmNCwgMHg4MzE5LCAweDFkZjAsIDB4OTA4NCwKKwkweGZmY2YsIDB4OTA4NSwgMHgyMDAwLCAweDc4NTIsIDB4MjBhOSwgMHgwMDQ2LCAweDFkMDQsIDB4M2YyZSwKKwkweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDNmMmUsIDB4Nzg1MCwgMHg5MDg1LCAweDA0MDAsIDB4OTA4NCwKKwkweGRmZmYsIDB4Nzg1MiwgMHgyMDAxLCAweDAwMjEsIDB4MjAwNCwgMHg5MDg0LCAweDAwMDMsIDB4OTA4NiwKKwkweDAwMDEsIDB4MTEyMCwgMHg3ODUwLCAweDkwODQsIDB4ZGZmZiwgMHg3ODUyLCAweDc4NGIsIDB4ZjdmNywKKwkweDc4NDMsIDB4MDA5MCwgMHg3ODQzLCAweDAwMTAsIDB4MjBhOSwgMHgwMDI4LCAweGEwMDEsIDB4MWYwNCwKKwkweDNmNGUsIDB4Nzg1MCwgMHg5MDg1LCAweDE0MDAsIDB4Nzg1MiwgMHgyMDE5LCAweDYxYTgsIDB4Nzg1NCwKKwkweGEwMDEsIDB4YTAwMSwgMHhkMDhjLCAweDExMTAsIDB4ODMxOSwgMHgxZGM4LCAweDc4MjcsIDB4MDA0OCwKKwkweDc4NTAsIDB4OTA4NSwgMHgwNDAwLCAweDc4NTIsIDB4Nzg0MywgMHgwMDQwLCAweDIwMTksIDB4MDFmNCwKKwkweGEwMDEsIDB4YTAwMSwgMHg4MzE5LCAweDFkZTAsIDB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmM4OCwKKwkweDc4MjcsIDB4MDAyMCwgMHg3ODQzLCAweDAwMDAsIDB4OTAwNiwgMHgwODBjLCAweDJjODgsIDB4NzgyNywKKwkweDAwNDgsIDB4MDBmZSwgMHgwMDA1LCAweDc4ODQsIDB4ZDBhYywgMHgxMWM4LCAweDAwZjYsIDB4MDBlNiwKKwkweDIwNzEsIDB4MWEzYSwgMHgyMDc5LCAweDAzMjAsIDB4MjAwMSwgMHgwMjAxLCAweDIwMDQsIDB4OTAwNSwKKwkweDAxNjAsIDB4NzAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MTE0MCwgMHgwMDUxLCAweGQwYmMsIDB4MDEwOCwKKwkweDg3MzgsIDB4NzAwMywgMHgwMDAzLCAweDc4MmIsIDB4MDAxOSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMzAwLCAweDc4YmMsIDB4MDBmZSwgMHg5MDhjLCAweDAwNzAsIDB4MDE3OCwKKwkweDIwMDksIDB4MDAzMiwgMHgyNjBhLCAweDIwMDksIDB4MDAzMywgMHgyNTBhLCAweGQwYjQsIDB4MDEwOCwKKwkweDhjNjAsIDB4ZDBhYywgMHgwMTA4LCAweDhkNjgsIDB4ZDBhNCwgMHgwMTA4LCAweDhiNTgsIDB4MDAwNSwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMjAwLCAweDc4MWMsIDB4ZDA4NCwgMHgwMTEwLCAweDc4MzcsIDB4MDA1MCwKKwkweDAwZmUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MDEwMCwgMHgyMDAxLCAweDE5ODIsIDB4MjAwNCwKKwkweDcwZTIsIDB4MDgwYywgMHgzYzUxLCAweDExODgsIDB4MjAwMSwgMHgxODFmLCAweDIwMDQsIDB4MjAwOSwKKwkweDE4MWUsIDB4MjEwYywgMHg5MThjLCAweDAwZmYsIDB4NzA2ZSwgMHg3MTZhLCAweDcwNjYsIDB4OTE4ZCwKKwkweDMyMDAsIDB4NzE2MiwgMHg3MDczLCAweGUxMDksIDB4MDA4MCwgMHg3MDJjLCAweDkwODUsIDB4MDAwMiwKKwkweDcwMmUsIDB4MjAwOSwgMHgxODE3LCAweDIxMGMsIDB4NzE2ZSwgMHg3MDYzLCAweDAxMDAsIDB4NzE2NiwKKwkweDcxOWUsIDB4NzA2YiwgMHgwMDAwLCAweDcwNzMsIDB4MDgwOSwgMHg3MDc3LCAweDAwMDgsIDB4NzA3OCwKKwkweDkwODAsIDB4MDEwMCwgMHg3MDdhLCAweDcwODAsIDB4ODAwMCwgMHg3MDgyLCAweDcwODcsIDB4YWFhYSwKKwkweDkwMDYsIDB4NzA4YSwgMHg3MDhlLCAweDcwN2UsIDB4NzBkNiwgMHg3MGFiLCAweDAwMzYsIDB4NzBhZiwKKwkweDk1ZDUsIDB4NzAxNCwgMHg5MDg0LCAweDE5ODQsIDB4OTA4NSwgMHgwMDkyLCAweDcwMTYsIDB4MDgwYywKKwkweDQxMDEsIDB4MDBmNiwgMHgyMDcxLCAweDFhM2EsIDB4MjA3OSwgMHgwMzIwLCAweDAwZDYsIDB4MjA2OSwKKwkweDAwMDAsIDB4Njg4NCwgMHhkMGI0LCAweDAxMjAsIDB4Njg5YywgMHg3ODBlLCAweDY4OTgsIDB4NzgwYSwKKwkweDAwZGUsIDB4MjAwOSwgMHgwM2U4LCAweDgxMDksIDB4MWRmMCwgMHg3OTJjLCAweGQxZmMsIDB4MDExMCwKKwkweDc4MmIsIDB4MDAwNCwgMHgyMDExLCAweDAwMTEsIDB4MDgwYywgMHg0MDhkLCAweDIwMTEsIDB4MDAwMSwKKwkweDA4MGMsIDB4NDA4ZCwgMHgwMGZlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MjA3MSwKKwkweDFhM2EsIDB4MjA3OSwgMHgwMzIwLCAweDc5MmMsIDB4ZDFmYywgMHgwOTA0LCAweDQwOGEsIDB4NzgyYiwKKwkweDAwMDIsIDB4OTAyNiwgMHhkMTljLCAweDE5MDQsIDB4NDA4NiwgMHg3MDAwLCAweDAwMDIsIDB4NDA4YSwKKwkweDQwM2IsIDB4NDA2YiwgMHg0MDg2LCAweGQxYmMsIDB4MTE3MCwgMHhkMWRjLCAweDExOTAsIDB4ODAwMSwKKwkweDcwMDIsIDB4MjAxMSwgMHgwMDAxLCAweDA4MGMsIDB4NDA4ZCwgMHgwOTA0LCAweDQwOGEsIDB4MDgwYywKKwkweDQwOGQsIDB4MDgwNCwgMHg0MDhhLCAweDAwZjYsIDB4MjA3OSwgMHgwMzAwLCAweDc4YmYsIDB4MDAwMCwKKwkweDAwZmUsIDB4NzgxMCwgMHg3OTE0LCAweDc4MmIsIDB4MDAwNCwgMHg3ODEyLCAweDc5MTYsIDB4MjAwMSwKKwkweDAyMDEsIDB4MjAwYywgMHg4MWZmLCAweDBkZTgsIDB4MDgwYywgMHgzZjk4LCAweDIwMDksIDB4MDAwMSwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMzAwLCAweDc4YjgsIDB4MDBmZSwgMHhkMGVjLCAweDAxMTAsIDB4MjAwOSwKKwkweDAwMTEsIDB4NzkyYSwgMHgwMGY4LCAweDgwMDEsIDB4NzAwMiwgMHg5MTg0LCAweDA4ODAsIDB4MTE0MCwKKwkweDc4MmMsIDB4ZDBmYywgMHgxOTA0LCAweDQwMmYsIDB4MjAxMSwgMHgwMDAxLCAweDAwYjEsIDB4MDA5MCwKKwkweGEwMTAsIDB4OTA5MiwgMHgwMDA0LCAweDkwODYsIDB4MDAxNSwgMHgxMTIwLCAweGEwMDAsIDB4YTA1YSwKKwkweDIwMTEsIDB4MDAzMSwgMHhhMjEyLCAweGQxZGMsIDB4MTk2MCwgMHgwODI4LCAweDc4MmIsIDB4MDAwNCwKKwkweDcwMDMsIDB4MDAwMCwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHhhMDE0LCAweDkwMDUsIDB4MDU1MCwKKwkweDgwMDEsIDB4MDAzNiwgMHgwMDk2LCAweGEwMTYsIDB4YTA1OCwgMHgyMDQ4LCAweGEwMTAsIDB4MjAwOSwKKwkweDAwMzEsIDB4OTExYSwgMHg4MzFjLCAweDgzMWMsIDB4OTM4YSwgMHgwMDA3LCAweDFhMGMsIDB4MGRmYSwKKwkweDkzOTgsIDB4NDBiYiwgMHgyMzFkLCAweDA4M2YsIDB4OTA4MCwgMHgwMDA0LCAweDdhMmEsIDB4NzEwMCwKKwkweDgxMDgsIDB4NzEwMiwgMHgwMDllLCAweDAwM2UsIDB4OTA4YSwgMHgwMDM1LCAweDExNDAsIDB4MDA5NiwKKwkweGEwNTgsIDB4MjA0OCwgMHhhODA0LCAweGEwNWEsIDB4MjAwMSwgMHgwMDE5LCAweDAwOWUsIDB4YTAxMiwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDQwZjgsIDB4NDBlZiwgMHg0MGU2LCAweDQwZGQsIDB4NDBkNCwKKwkweDQwY2IsIDB4NDBjMiwgMHhhOTY0LCAweDc5MDIsIDB4YTk2OCwgMHg3OTA2LCAweGE5NmMsIDB4NzkxMiwKKwkweGE5NzAsIDB4NzkxNiwgMHgwMDA1LCAweGE5NzQsIDB4NzkwMiwgMHhhOTc4LCAweDc5MDYsIDB4YTk3YywKKwkweDc5MTIsIDB4YTk4MCwgMHg3OTE2LCAweDAwMDUsIDB4YTk4NCwgMHg3OTAyLCAweGE5ODgsIDB4NzkwNiwKKwkweGE5OGMsIDB4NzkxMiwgMHhhOTkwLCAweDc5MTYsIDB4MDAwNSwgMHhhOTk0LCAweDc5MDIsIDB4YTk5OCwKKwkweDc5MDYsIDB4YTk5YywgMHg3OTEyLCAweGE5YTAsIDB4NzkxNiwgMHgwMDA1LCAweGE5YTQsIDB4NzkwMiwKKwkweGE5YTgsIDB4NzkwNiwgMHhhOWFjLCAweDc5MTIsIDB4YTliMCwgMHg3OTE2LCAweDAwMDUsIDB4YTliNCwKKwkweDc5MDIsIDB4YTliOCwgMHg3OTA2LCAweGE5YmMsIDB4NzkxMiwgMHhhOWMwLCAweDc5MTYsIDB4MDAwNSwKKwkweGE5YzQsIDB4NzkwMiwgMHhhOWM4LCAweDc5MDYsIDB4YTljYywgMHg3OTEyLCAweGE5ZDAsIDB4NzkxNiwKKwkweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwODYsIDB4MjA3MSwgMHgxYTNkLCAweDIwNzksIDB4MDA5MCwKKwkweDc5MmMsIDB4ZDFmYywgMHgwMWU4LCAweDc4MmIsIDB4MDAwMiwgMHgyOTQwLCAweDkwMjYsIDB4NzAwMCwKKwkweDAwMDIsIDB4NDEyOCwgMHg0MTE0LCAweDQxMWYsIDB4ODAwMSwgMHg3MDAyLCAweGQxOWMsIDB4MTE4MCwKKwkweDIwMTEsIDB4MDAwMSwgMHgwODBjLCAweDQwOGQsIDB4MTkwYywgMHg0MDhkLCAweDAwNDgsIDB4ODAwMSwKKwkweDcwMDIsIDB4NzgyYywgMHhkMGZjLCAweDFkMzgsIDB4MjAxMSwgMHgwMDAxLCAweDA4MGMsIDB4NDA4ZCwKKwkweDAwOGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwYzYsIDB4MDA4NiwKKwkweDIwNjEsIDB4MDIwMCwgMHgyMDAxLCAweDE5ODIsIDB4MjAwNCwgMHg2MDFhLCAweDIwNjEsIDB4MDEwMCwKKwkweDIwMDEsIDB4MTk4MSwgMHgyMDA0LCAweDYwY2UsIDB4NjEwNCwgMHhjMWFjLCAweDYxMDYsIDB4MjAwMSwKKwkweDAwMmMsIDB4MjAwNCwgMHg5MDA1LCAweDA1MjAsIDB4MjAzOCwgMHgyMDAxLCAweDAwMmUsIDB4MjAyNCwKKwkweDIwMDEsIDB4MDAyZiwgMHgyMDFjLCAweDA4MGMsIDB4NGFiZiwgMHhhODEzLCAweDAwMTksIDB4YWYxNiwKKwkweDI5MDAsIDB4YTg1YSwgMHg5NzhhLCAweDAwMDcsIDB4MDIyMCwgMHgyMTM4LCAweDIwMDksIDB4MDAwNywKKwkweDAwMTAsIDB4MjcwOCwgMHg5MDNlLCAweDAwOTYsIDB4YTg1OCwgMHgyMDQ4LCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMTksIDB4MDA5ZSwgMHgwODBjLCAweDQxYTQsIDB4MWQ2OCwgMHgyOTAwLCAweGE4NWEsIDB4MDBkMCwKKwkweDA4MGMsIDB4NGFiZiwgMHhhODEzLCAweDAwMTksIDB4YTgxNywgMHgwMDAxLCAweDI5MDAsIDB4YTg1YSwKKwkweDIwMDEsIDB4MDAyZSwgMHgyMDA0LCAweGE4NjYsIDB4MjAwMSwgMHgwMDJmLCAweDIwMDQsIDB4YTg2YSwKKwkweDIwMDEsIDB4MDAyYSwgMHgyMDA0LCAweDkwODQsIDB4ZmZmOCwgMHhhODZlLCAweDIwMDEsIDB4MDAyYiwKKwkweDIwMDQsIDB4YTg3MiwgMHgyMDYxLCAweDAwOTAsIDB4MjA3OSwgMHgwMTAwLCAweDIwMDEsIDB4MTk4MSwKKwkweDIwMDQsIDB4NjAzNiwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywgMHgyMzBhLCAweDIwMDEsIDB4MDAyYSwKKwkweDIwMDQsIDB4OTA4NCwgMHhmZmY4LCAweDYwMWEsIDB4MDAwNiwgMHgyMDAxLCAweDAwMmIsIDB4MjAwNCwKKwkweDYwMWUsIDB4NzhjNiwgMHgwMDBlLCAweDc4Y2EsIDB4OTAwNiwgMHg2MDBhLCAweDYwMGUsIDB4MDA4ZSwKKwkweDAwY2UsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDAwODAsIDB4YWE2MCwKKwkweDIyZTgsIDB4MjBhMCwgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwgMHgwMDg4LCAweDcwMmIsIDB4MDAyNiwKKwkweDc0MDIsIDB4NzMwNiwgMHg5MDA2LCAweDcwMGEsIDB4NzAwZSwgMHg4MTBiLCAweDgxMGIsIDB4MjFhOCwKKwkweDgxMGIsIDB4NzExMiwgMHg3MDJiLCAweDAwNDEsIDB4NzAyYywgMHhkMGZjLCAweDBkZTgsIDB4NzAyYiwKKwkweDAwMDIsIDB4NzAyYiwgMHgwMDQwLCAweDQwMDUsIDB4NzQwMCwgMHg3MzA0LCAweDg3ZmYsIDB4MDE5MCwKKwkweDAwODYsIDB4MDA5NiwgMHgyOTQwLCAweDAwODYsIDB4MDgwYywgMHg0YWJmLCAweDAwOGUsIDB4YTA1OCwKKwkweDAwYTYsIDB4MjA1MCwgMHgyOTAwLCAweGIwMDYsIDB4YTA1YSwgMHgwMGFlLCAweDAwOWUsIDB4MDA4ZSwKKwkweDkwODUsIDB4MDAwMSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDAxLCAweDAwMmQsIDB4MjAwNCwKKwkweDkwMDUsIDB4MDUyOCwgMHgyMDM4LCAweDIwMDEsIDB4MDAzMCwgMHgyMDI0LCAweDIwMDEsIDB4MDAzMSwKKwkweDIwMWMsIDB4MDgwYywgMHg0YWJmLCAweDI5NDAsIDB4YTgxMywgMHgwMDE5LCAweGFmMTYsIDB4MjkwMCwKKwkweGE4NWEsIDB4OTc4YSwgMHgwMDA3LCAweDAyMjAsIDB4MjEzOCwgMHgyMDA5LCAweDAwMDcsIDB4MDAxMCwKKwkweDI3MDgsIDB4OTAzZSwgMHgwMDk2LCAweGE4NTgsIDB4MjA0OCwgMHhhODVjLCAweDkwODAsIDB4MDAxOSwKKwkweDAwOWUsIDB4MDgwYywgMHg0MWE0LCAweDFkNjgsIDB4MjkwMCwgMHhhODVhLCAweDAwZDgsIDB4MDgwYywKKwkweDRhYmYsIDB4Mjk0MCwgMHhhMDEzLCAweDAwMTksIDB4YTAxNywgMHgwMDAxLCAweDI4MDAsIDB4YTA1YSwKKwkweDIwMDEsIDB4MDAzMCwgMHgyMDA0LCAweGEwNjYsIDB4MjAwMSwgMHgwMDMxLCAweDIwMDQsIDB4YTA2YSwKKwkweDIwMDEsIDB4MDAyYSwgMHgyMDA0LCAweDkwODQsIDB4ZmZmOCwgMHhhMDZlLCAweDIwMDEsIDB4MDAyYiwKKwkweDIwMDQsIDB4YTA3MiwgMHgyMDAxLCAweDAzMmEsIDB4MjAwMywgMHgwMDA0LCAweDc4ODQsIDB4ZDBhYywKKwkweDExODAsIDB4MjAwMSwgMHgwMTAxLCAweDIwMGMsIDB4OTE4ZCwgMHgwMjAwLCAweDIxMDIsIDB4YTAxNywKKwkweDAwMDAsIDB4MjAwMSwgMHgxYTNhLCAweDIwMDMsIDB4MDAwMywgMHgyMDAxLCAweDAzMmEsIDB4MjAwMywKKwkweDAwMDksIDB4MjAwMSwgMHgwMzAwLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDAyMGQsIDB4MjAwMywKKwkweDAwMDAsIDB4MjAwMSwgMHgwMDA0LCAweDIwMGMsIDB4OTE4ZCwgMHgwMDAyLCAweDIxMDIsIDB4MDBlZSwKKwkweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjBhOSwgMHgwMDFiLCAweDIwYTEsIDB4MTg0MCwKKwkweDIwZTksIDB4MDAwMSwgMHg5MDA2LCAweDQwMDQsIDB4MjAwOSwgMHgwMTNjLCAweDIwMGEsIDB4MDEyZSwKKwkweDc4ODAsIDB4OTA4NiwgMHgwMDUyLCAweDAxMDgsIDB4MDAwNSwgMHgwODA0LCAweDM0ZTgsIDB4N2Q5OCwKKwkweDdjOWMsIDB4MDgwNCwgMHgzNWVhLCAweDA4MGMsIDB4NzIwNywgMHgxOTBjLCAweDVlZjAsIDB4MjA2OSwKKwkweDE4NWIsIDB4MmQwMCwgMHgyMDA5LCAweDAwMzAsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwKKwkweDIwMzksIDB4MDAwMSwgMHgwODBjLCAweDRiMDgsIDB4NzAxZiwgMHg0Mjc3LCAweDAwMDUsIDB4MDgwYywKKwkweDU1ZWEsIDB4MTEzMCwgMHgzYjAwLCAweDNhMDgsIDB4YzE5NCwgMHhjMDk1LCAweDIwZDgsIDB4MjFkMCwKKwkweDIwNjksIDB4MTg1YiwgMHg2ODAwLCAweDkwMDUsIDB4MDkwNCwgMHgzNTFkLCAweDY4MDQsIDB4ZDA5NCwKKwkweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDYxMDQsIDB4MDEzOCwgMHg2MjAwLCAweDkyOTIsIDB4MDAwNSwKKwkweDAyMTgsIDB4OTE4YywgMHhmZmRmLCAweDAwMTAsIDB4OTE4ZCwgMHgwMDIwLCAweDYxMDYsIDB4MDBjZSwKKwkweGQwOGMsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4NjEwNCwgMHgwMTE4LCAweDkxOGQsIDB4MDAxMCwKKwkweDAwMTAsIDB4OTE4YywgMHhmZmVmLCAweDYxMDYsIDB4MDBjZSwgMHhkMDg0LCAweDAxNTgsIDB4NmEyOCwKKwkweDkyOGEsIDB4MDA3ZiwgMHgxYTA0LCAweDM1MWQsIDB4OTI4OCwgMHgzMmU5LCAweDIxMGQsIDB4OTE4YywKKwkweDAwZmYsIDB4NjE2MiwgMHhkMGRjLCAweDAxMzAsIDB4NjgyOCwgMHg5MDhhLCAweDAwN2YsIDB4MWEwNCwKKwkweDM1MWQsIDB4NjA1YSwgMHg2ODg4LCAweDkwODQsIDB4MDAzMCwgMHg4MDA0LCAweDgwMDQsIDB4ODAwNCwKKwkweDgwMDQsIDB4MDAwNiwgMHgyMDA5LCAweDE5ODksIDB4OTA4MCwgMHgyOGFhLCAweDIwMDUsIDB4MjAwYSwKKwkweDAwMGUsIDB4MjAwOSwgMHgxOThhLCAweDkwODAsIDB4MjhhZSwgMHgyMDA1LCAweDIwMGEsIDB4NjgwOCwKKwkweDkwOGEsIDB4MDEwMCwgMHgwYTA0LCAweDM1MWQsIDB4OTA4YSwgMHgwODQxLCAweDFhMDQsIDB4MzUxZCwKKwkweDkwODQsIDB4MDAwNywgMHgxOTA0LCAweDM1MWQsIDB4NjgwYywgMHg5MDA1LCAweDA5MDQsIDB4MzUxZCwKKwkweDY4MTAsIDB4OTAwNSwgMHgwOTA0LCAweDM1MWQsIDB4Njg0OCwgMHg2OTQwLCAweDkxMGEsIDB4MWEwNCwKKwkweDM1MWQsIDB4ODAwMSwgMHgwOTA0LCAweDM1MWQsIDB4Njg0YywgMHg2OTQ0LCAweDkxMGEsIDB4MWEwNCwKKwkweDM1MWQsIDB4ODAwMSwgMHgwOTA0LCAweDM1MWQsIDB4MjAwOSwgMHgxOTU5LCAweDIwMGIsIDB4MDAwMCwKKwkweDIwMDEsIDB4MTg3ZCwgMHgyMDA0LCAweGQwYzQsIDB4MDE0MCwgMHg3ODg0LCAweDIwMGEsIDB4MjAwOSwKKwkweDAxN2YsIDB4MjAwYSwgMHgzYjAwLCAweGMwODUsIDB4MjBkOCwgMHg2ODE0LCAweDkwOGMsIDB4MDBmZiwKKwkweDYxNGEsIDB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4NjA0ZSwgMHgwODBjLCAweDc1MzUsIDB4MDgwYywKKwkweDY4OGMsIDB4MDgwYywgMHg2OGMxLCAweDY4MDgsIDB4NjAyYSwgMHgwODBjLCAweDIyN2MsIDB4MjAwOSwKKwkweDAxNzAsIDB4MjAwYiwgMHgwMDgwLCAweGEwMDEsIDB4YTAwMSwgMHgyMDBiLCAweDAwMDAsIDB4MDAzNiwKKwkweDZiMDgsIDB4MDgwYywgMHgyODExLCAweDAwM2UsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MTkwNCwKKwkweDQzZjgsIDB4NjgxOCwgMHg2OTFjLCAweDZhMjAsIDB4NmIyNCwgMHg4MDA3LCAweDgxMGYsIDB4ODIxNywKKwkweDgzMWYsIDB4NjAxNiwgMHg2MTFhLCAweDYyMWUsIDB4NjMyMiwgMHg2YzA0LCAweGQ0ZjQsIDB4MDE0OCwKKwkweDY4MzAsIDB4NjkzNCwgMHg2YTM4LCAweDZiM2MsIDB4ODAwNywgMHg4MTBmLCAweDgyMTcsIDB4ODMxZiwKKwkweDAwMTAsIDB4OTA4NCwgMHhmMGZmLCAweDYwMDYsIDB4NjEwYSwgMHg2MjBlLCAweDYzMTIsIDB4ODAwNywKKwkweDgxMGYsIDB4ODIxNywgMHg4MzFmLCAweDIwYTksIDB4MDAwNCwgMHgyMGExLCAweDE5OGIsIDB4MjBlOSwKKwkweDAwMDEsIDB4NDAwMSwgMHgyMGE5LCAweDAwMDQsIDB4MjBhMSwgMHgxOWE1LCAweDIwZTksIDB4MDAwMSwKKwkweDQwMDEsIDB4MDgwYywgMHg4M2UzLCAweDAwYzYsIDB4OTAwZSwgMHgyMGE5LCAweDAwMDEsIDB4NmI3MCwKKwkweGQzODQsIDB4MDFjOCwgMHgwMDIwLCAweDgzOWQsIDB4MTJiMCwgMHgzNTA4LCAweDgxMDksIDB4MDgwYywKKwkweDdhZjgsIDB4Njg3OCwgMHg2MDE2LCAweDY4NzQsIDB4MjAwOCwgMHg5MDg0LCAweGZmMDAsIDB4ODAwNywKKwkweDYwMGEsIDB4OTE4NCwgMHgwMGZmLCAweDYwMDYsIDB4ODEwOCwgMHgxMTE4LCAweDYwMDMsIDB4MDAwMywKKwkweDAwMTAsIDB4NjAwMywgMHgwMDAxLCAweDFmMDQsIDB4NDM2MywgMHgwMGNlLCAweDAwYzYsIDB4MjA2MSwKKwkweDE5NzQsIDB4MjA2MywgMHgwMDAxLCAweDkwMDYsIDB4MDgwYywgMHgyYWI4LCAweDkwMDYsIDB4MDgwYywKKwkweDJhOWIsIDB4MDAwMCwgMHgwMGNlLCAweDAwZTYsIDB4MmM3MCwgMHgwODBjLCAweDBlYzYsIDB4MDBlZSwKKwkweDY4ODgsIDB4ZDBlYywgMHgwMTk4LCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwYSwKKwkweDAxMzgsIDB4MjAxMSwgMHgwMTE0LCAweDIyMDQsIDB4OTA4NSwgMHgwMTAwLCAweDIwMTIsIDB4MDAzMCwKKwkweDIwMTEsIDB4MDExNCwgMHgyMjA0LCAweDkwODUsIDB4MDE4MCwgMHgyMDEyLCAweDZhODAsIDB4OTI4NCwKKwkweDAwMzAsIDB4OTA4NiwgMHgwMDMwLCAweDExMjgsIDB4OTI5NCwgMHhmZmNmLCAweDkyOTUsIDB4MDAyMCwKKwkweDZhODIsIDB4MjAwMSwgMHgxOTU0LCAweDZhODAsIDB4OTI5NCwgMHgwMDMwLCAweDkyOGUsIDB4MDAwMCwKKwkweDAxNzAsIDB4OTI4ZSwgMHgwMDEwLCAweDAxMTgsIDB4OTI4ZSwgMHgwMDIwLCAweDAxNDAsIDB4MjAwMywKKwkweGFhYWEsIDB4MDgwYywgMHgyODg2LCAweDIwMDEsIDB4MTk0NSwgMHgyMTAyLCAweDAwMDgsIDB4MjEwMiwKKwkweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDYwMmYsIDB4MDA0MCwgMHg2MDJmLCAweDAwMDAsIDB4MDBjZSwKKwkweDA4MGMsIDB4NzIwNywgMHgwMTI4LCAweDA4MGMsIDB4NGVkMiwgMHgwMTEwLCAweDA4MGMsIDB4MjdkNywKKwkweDYwZDAsIDB4OTAwNSwgMHgwMWMwLCAweDYwMDMsIDB4MDAwMSwgMHgyMDA5LCAweDQzZTAsIDB4MDBkMCwKKwkweDA4MGMsIDB4NzIwNywgMHgxMTY4LCAweDIwMTEsIDB4NzA3NiwgMHgwODBjLCAweDgyZGEsIDB4MjAxMSwKKwkweDcwNjksIDB4MDgwYywgMHg4M2FlLCAweDA4MGMsIDB4NzUwOSwgMHgwODBjLCAweDcxMjcsIDB4MDA0MCwKKwkweDA4MGMsIDB4NWRlYSwgMHgwMDI4LCAweDYwMDMsIDB4MDAwNCwgMHgyMDA5LCAweDQzZjgsIDB4MDAxMCwKKwkweDA4MDQsIDB4MzRlOCwgMHgyMDAxLCAweDAxNzAsIDB4MjAwNCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwKKwkweDAwNGMsIDB4MTExOCwgMHgyMDkxLCAweDMwYmQsIDB4MDgxNywgMHgyMDkxLCAweDMwM2QsIDB4MDgxNywKKwkweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDA5MDQsIDB4MzUxYSwgMHgyMDY5LCAweDE4NWIsIDB4Nzg5MCwKKwkweDY4NDIsIDB4Nzg5NCwgMHg2ODQ2LCAweDJkMDAsIDB4MjAwOSwgMHgwMDMwLCAweDdhOGMsIDB4N2I4OCwKKwkweDdjOWMsIDB4N2Q5OCwgMHgyMDM5LCAweDAwMDEsIDB4MDgwNCwgMHg0YjBiLCAweDkwMDYsIDB4MDgwYywKKwkweDI3ZDcsIDB4ODFmZiwgMHgxOTA0LCAweDM1MWEsIDB4MDgwYywgMHg3MjA3LCAweDExYjAsIDB4MDgwYywKKwkweDc1MDQsIDB4MDgwYywgMHg1ZjJiLCAweDA4MGMsIDB4MzJlNCwgMHgwMTE4LCAweDYxMzAsIDB4YzE4ZCwKKwkweDYxMzIsIDB4MDgwYywgMHhjNTM5LCAweDAxMzAsIDB4MDgwYywgMHg3MjJhLCAweDExMTgsIDB4MDgwYywKKwkweDcxZGYsIDB4MDAzOCwgMHgwODBjLCAweDcxMjcsIDB4MDAyMCwgMHgwODBjLCAweDVlZjAsIDB4MDgwYywKKwkweDVkZWEsIDB4MDgwNCwgMHgzNGU4LCAweDgxZmYsIDB4MTkwNCwgMHgzNTFhLCAweDA4MGMsIDB4NzIwNywKKwkweDExMTAsIDB4MDgwNCwgMHgzNTFhLCAweDYxOTAsIDB4ODFmZiwgMHgwMWE4LCAweDcwNGYsIDB4MDAwMCwKKwkweDIwMDEsIDB4MWM4MCwgMHgyMDA5LCAweDAwNDAsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMzksIDB4MDAwMSwgMHgwODBjLCAweDRiMGIsIDB4NzAxZiwKKwkweDM0ZTYsIDB4MDEyZSwgMHgwMDA1LCAweDcwNGYsIDB4MDAwMSwgMHgwMGQ2LCAweDIwNjksIDB4MWM4MCwKKwkweDIwYTksIDB4MDA0MCwgMHgyMGU5LCAweDAwMDEsIDB4MjBhMSwgMHgxYzgwLCAweDIwMTksIDB4ZmZmZiwKKwkweDQzMDQsIDB4NjU1OCwgMHg5NTg4LCAweDMyZTksIDB4MjEwZCwgMHg5MThjLCAweDAwZmYsIDB4MjE2YSwKKwkweDkwMGUsIDB4MjAxMSwgMHgwMDAyLCAweDIxMDAsIDB4OTUwNiwgMHgwMWE4LCAweDA4MGMsIDB4NjQ5ZiwKKwkweDExOTAsIDB4YjgxNCwgMHg4MjFjLCAweDAyMzgsIDB4OTM5OCwgMHgxYzgwLCAweDkwODUsIDB4ZmYwMCwKKwkweDgwMDcsIDB4MjAxYSwgMHgwMDM4LCAweDkzOTgsIDB4MWM4MCwgMHgyMzI0LCAweDk0YTQsIDB4ZmYwMCwKKwkweDk0MDUsIDB4MjAxYSwgMHg4MjEwLCAweDgxMDgsIDB4OTE4MiwgMHgwMDgwLCAweDEyMDgsIDB4MGMxOCwKKwkweDgyMDEsIDB4ODAwNywgMHgyZDBjLCAweDkxMDUsIDB4MjA2YSwgMHgwMGRlLCAweDIwYTksIDB4MDA0MCwKKwkweDIwYTEsIDB4MWM4MCwgMHgyMDk5LCAweDFjODAsIDB4MDgwYywgMHg1ZTdiLCAweDA4MDQsIDB4NDQ1MCwKKwkweDA4MGMsIDB4NGFmMiwgMHgwOTA0LCAweDM1MWQsIDB4MDgwYywgMHg0YWJmLCAweDExMjAsIDB4MjAwOSwKKwkweDAwMDIsIDB4MDgwNCwgMHgzNTFhLCAweDA4MGMsIDB4NTVkYiwgMHhkMGI0LCAweDA1NTgsIDB4Nzg4NCwKKwkweDkwOGUsIDB4MDA3ZSwgMHgwNTM4LCAweDkwOGUsIDB4MDA3ZiwgMHgwNTIwLCAweDkwOGUsIDB4MDA4MCwKKwkweDA1MDgsIDB4MDgwYywgMHgzMmRmLCAweDExNDgsIDB4YjgwMCwgMHhkMDhjLCAweDExZDgsIDB4YjgwNCwKKwkweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDYsIDB4MTFhOCwgMHhhODY3LCAweDAwMDAsIDB4YTg2OCwKKwkweGMwZmQsIDB4YTg2YSwgMHgwODBjLCAweGMwMDIsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDMsIDB4MDgwNCwKKwkweDM1MWEsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NDRkZSwgMHgwMDA1LCAweDA4MGMsIDB4NGFmMiwKKwkweDA5MDQsIDB4MzUxZCwgMHgyMGE5LCAweDAwMmIsIDB4YjhiNCwgMHgyMGUwLCAweGI4YjgsIDB4MjA5OCwKKwkweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDkwODAsIDB4MDAwMiwgMHgyMGEwLCAweDQwMDMsIDB4MjBhOSwKKwkweDAwMDgsIDB4OTA4MCwgMHgwMDA2LCAweDIwYTAsIDB4YjhiNCwgMHgyMGUwLCAweGI4YjgsIDB4OTA4MCwKKwkweDAwMDYsIDB4MjA5OCwgMHgwODBjLCAweDBmYWUsIDB4MDA3MCwgMHgyMGE5LCAweDAwMDQsIDB4YTg1YywKKwkweDkwODAsIDB4MDAwYSwgMHgyMGEwLCAweGI4YjQsIDB4MjBlMCwgMHhiOGI4LCAweDkwODAsIDB4MDAwYSwKKwkweDIwOTgsIDB4MDgwYywgMHgwZmFlLCAweDg5MDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwKKwkweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMDIsIDB4MjAwOSwgMHgwMDJiLCAweDdhOGMsIDB4N2I4OCwKKwkweDdjOWMsIDB4N2Q5OCwgMHgwODA0LCAweDRiMGIsIDB4ODFmZiwgMHgxOTA0LCAweDM1MWEsIDB4MDgwYywKKwkweDRhZDYsIDB4MDkwNCwgMHgzNTFkLCAweDA4MGMsIDB4NjYxMSwgMHgwOTA0LCAweDM1MWEsIDB4MDA1OCwKKwkweGE4NzgsIDB4OTAwNSwgMHgwMTIwLCAweDIwMDksIDB4MDAwNCwgMHgwODA0LCAweDM1MWEsIDB4YTk3NCwKKwkweGFhOTQsIDB4MDgwNCwgMHgzNGU4LCAweDA4MGMsIDB4NTVlMywgMHgwOTA0LCAweDM0ZTgsIDB4NzAxZiwKKwkweDQ1MjgsIDB4NzAwNywgMHgwMDAzLCAweDAwMDUsIDB4ODFmZiwgMHgxOTA0LCAweDM1MWEsIDB4Nzg4OCwKKwkweDkwOGEsIDB4MTAwMCwgMHgxYTA0LCAweDM1MWQsIDB4MDgwYywgMHg0YWYyLCAweDA5MDQsIDB4MzUxZCwKKwkweDA4MGMsIDB4NjdjMywgMHgwMTIwLCAweDA4MGMsIDB4NjdjYiwgMHgxOTA0LCAweDM1MWQsIDB4MDgwYywKKwkweDY2OTYsIDB4MDkwNCwgMHgzNTFhLCAweDIwMTksIDB4MDAwNCwgMHg5MDBlLCAweDA4MGMsIDB4NjYyMywKKwkweDA5MDQsIDB4MzUxYSwgMHg3OTg0LCAweDdhODgsIDB4MDRjOSwgMHgwOGE4LCAweGE4OWMsIDB4OTA4YSwKKwkweDEwMDAsIDB4MTJmOCwgMHgwODBjLCAweDRhZjAsIDB4MDFlMCwgMHgwODBjLCAweDY3YzMsIDB4MDExOCwKKwkweDA4MGMsIDB4NjdjYiwgMHgxMWIwLCAweDA4MGMsIDB4NjY5NiwgMHgyMDA5LCAweDAwMDIsIDB4MDE2OCwKKwkweDIwMDksIDB4MDAwMiwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywgMHg2NjIzLCAweDIwMDksIDB4MDAwMywKKwkweDAxMjAsIDB4YTk5OCwgMHhhYTljLCAweDAwZDEsIDB4MDA2MCwgMHhhODk3LCAweDQwMDUsIDB4YTk5YSwKKwkweDAwMTAsIDB4YTg5NywgMHg0MDA2LCAweDkwMGUsIDB4OTA4NSwgMHgwMDAxLCAweDIwMDEsIDB4MDAzMCwKKwkweDAwMDUsIDB4YTg5NywgMHg0MDAwLCAweDA4MGMsIDB4NTVlMywgMHgwMTEwLCAweDkwMDYsIDB4MDAxOCwKKwkweDkwMGUsIDB4OTA4NSwgMHgwMDAxLCAweDIwMDEsIDB4MDAwMCwgMHgwMDA1LCAweDkxODYsIDB4MDBmZiwKKwkweDAxMTAsIDB4MDA3MSwgMHgwMDYwLCAweDIwMjksIDB4MDA3ZSwgMHgyMDYxLCAweDE4MDAsIDB4NjQ1OCwKKwkweDI0MDAsIDB4OTUwNiwgMHgwMTEwLCAweDI1MDgsIDB4MDAxOSwgMHg4NTI5LCAweDFlYzgsIDB4MDAwNSwKKwkweDA4MGMsIDB4NjQ5ZiwgMHgxMTM4LCAweDIyMDAsIDB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4OTEwOCwKKwkweDA4MGMsIDB4ODJlOCwgMHgwMDA1LCAweDgxZmYsIDB4MTkwNCwgMHgzNTFhLCAweDc5OGMsIDB4MjAwMSwKKwkweDE5NTgsIDB4OTE4YywgMHg4MDAwLCAweDIxMDIsIDB4MDgwYywgMHg0YWQ2LCAweDA5MDQsIDB4MzUxZCwKKwkweDA4MGMsIDB4NjdjMywgMHgwMTIwLCAweDA4MGMsIDB4NjdjYiwgMHgxOTA0LCAweDM1MWQsIDB4MDgwYywKKwkweDY1NjYsIDB4MDkwNCwgMHgzNTFhLCAweDA4MGMsIDB4NjYxYSwgMHgwOTA0LCAweDM1MWEsIDB4MjAwMSwKKwkweDE5NTgsIDB4MjAwNCwgMHhkMGZjLCAweDE5MDQsIDB4MzRlOCwgMHgwODA0LCAweDQ1MzMsIDB4YTlhMCwKKwkweDIwMDEsIDB4MTk1OCwgMHg5MThjLCAweDgwMDAsIDB4YzE4ZCwgMHgyMTAyLCAweDA4MGMsIDB4NGFlMywKKwkweDAxYTAsIDB4MDgwYywgMHg2N2MzLCAweDAxMTgsIDB4MDgwYywgMHg2N2NiLCAweDExNzAsIDB4MDgwYywKKwkweDY1NjYsIDB4MjAwOSwgMHgwMDAyLCAweDAxMjgsIDB4MDgwYywgMHg2NjFhLCAweDExNzAsIDB4MjAwOSwKKwkweDAwMDMsIDB4YTg5NywgMHg0MDA1LCAweGE5OWEsIDB4MDAxMCwgMHhhODk3LCAweDQwMDYsIDB4OTAwZSwKKwkweDkwODUsIDB4MDAwMSwgMHgyMDAxLCAweDAwMzAsIDB4MDAwNSwgMHhhODk3LCAweDQwMDAsIDB4MjAwMSwKKwkweDE5NTgsIDB4MjAwNCwgMHhkMGZjLCAweDExMjgsIDB4MDgwYywgMHg1NWUzLCAweDAxMTAsIDB4OTAwNiwKKwkweDAwMTgsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwgMHgwMDAwLCAweDAwMDUsIDB4ODFmZiwKKwkweDE5MDQsIDB4MzUxYSwgMHg3OThjLCAweDIwMDEsIDB4MTk1NywgMHg5MThjLCAweDgwMDAsIDB4MjEwMiwKKwkweDA4MGMsIDB4NGFkNiwgMHgwOTA0LCAweDM1MWQsIDB4MDgwYywgMHg2N2MzLCAweDAxMjAsIDB4MDgwYywKKwkweDY3Y2IsIDB4MTkwNCwgMHgzNTFkLCAweDA4MGMsIDB4NjU2NiwgMHgwOTA0LCAweDM1MWEsIDB4MDgwYywKKwkweDY2MDgsIDB4MDkwNCwgMHgzNTFhLCAweDIwMDEsIDB4MTk1NywgMHgyMDA0LCAweGQwZmMsIDB4MTkwNCwKKwkweDM0ZTgsIDB4MDgwNCwgMHg0NTMzLCAweGE5YTAsIDB4MjAwMSwgMHgxOTU3LCAweDkxOGMsIDB4ODAwMCwKKwkweGMxOGQsIDB4MjEwMiwgMHgwODBjLCAweDRhZTMsIDB4MDFhMCwgMHgwODBjLCAweDY3YzMsIDB4MDExOCwKKwkweDA4MGMsIDB4NjdjYiwgMHgxMTcwLCAweDA4MGMsIDB4NjU2NiwgMHgyMDA5LCAweDAwMDIsIDB4MDEyOCwKKwkweDA4MGMsIDB4NjYwOCwgMHgxMTcwLCAweDIwMDksIDB4MDAwMywgMHhhODk3LCAweDQwMDUsIDB4YTk5YSwKKwkweDAwMTAsIDB4YTg5NywgMHg0MDA2LCAweDkwMGUsIDB4OTA4NSwgMHgwMDAxLCAweDIwMDEsIDB4MDAzMCwKKwkweDAwMDUsIDB4YTg5NywgMHg0MDAwLCAweDIwMDEsIDB4MTk1NywgMHgyMDA0LCAweGQwZmMsIDB4MTEyOCwKKwkweDA4MGMsIDB4NTVlMywgMHgwMTEwLCAweDkwMDYsIDB4MDAxOCwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwKKwkweDIwMDEsIDB4MDAwMCwgMHgwMDA1LCAweDYxMDAsIDB4MDgwNCwgMHgzNGU4LCAweDA4MGMsIDB4NGFmMiwKKwkweDA5MDQsIDB4MzUxZCwgMHgwODBjLCAweDU1ZWYsIDB4MTkwNCwgMHgzNTFhLCAweDc5YTgsIDB4ZDE4NCwKKwkweDExNTgsIDB4YjgzNCwgMHg4MDA3LCAweDc4OWUsIDB4YjgzMCwgMHg4MDA3LCAweDc4OWEsIDB4YmIyYywKKwkweDgzMWYsIDB4YmEyOCwgMHg4MjE3LCAweDAwNTAsIDB4YjgyNCwgMHg4MDA3LCAweDc4OWUsIDB4YjgyMCwKKwkweDgwMDcsIDB4Nzg5YSwgMHhiYjFjLCAweDgzMWYsIDB4YmExOCwgMHg4MjE3LCAweGI5MDAsIDB4OTE4YywKKwkweDAyMDIsIDB4MDgwNCwgMHgzNGU4LCAweDc4YTgsIDB4OTA5YywgMHgwMDAzLCAweGQwYWMsIDB4MTE1OCwKKwkweGQwYjQsIDB4MTE0OCwgMHg5MzlhLCAweDAwMDMsIDB4MWEwNCwgMHgzNTFhLCAweDYyNTgsIDB4Nzg4NCwKKwkweDkyMDYsIDB4MTkwNCwgMHg0NmViLCAweDIwMzEsIDB4MTg0OCwgMHgyMDA5LCAweDAxM2MsIDB4MjEzNiwKKwkweDIwMDEsIDB4MTg0MCwgMHgyMDA5LCAweDAwMGMsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwKKwkweDIwMzksIDB4MDAwMSwgMHgwMDA2LCAweDc4YTgsIDB4OTA4NCwgMHgwMDgwLCAweDExZjgsIDB4MDAwNiwKKwkweDAwMzYsIDB4MjAwMSwgMHgxYTU3LCAweDIwMWMsIDB4N2I5YSwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwKKwkweDFhNTgsIDB4MjAxYywgMHg3YjllLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDFhNTksIDB4MjAxYywKKwkweDdiYTIsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MWE1MywgMHgyMDFjLCAweDdiYWEsIDB4MjAwMywKKwkweDAwMDAsIDB4MDAzZSwgMHgwMDBlLCAweDAwMGUsIDB4MDgwNCwgMHg0YjBiLCAweDAwMGUsIDB4MjAzMSwKKwkweDAwMDAsIDB4MjA2MSwgMHgxOGI2LCAweDJjNDQsIDB4YTY2YSwgMHhhMTdhLCAweGE3NzIsIDB4YTA3NiwKKwkweGEyOGUsIDB4YTM5MiwgMHhhNDk2LCAweGE1OWEsIDB4MDgwYywgMHgxMTJlLCAweDcwMDcsIDB4MDAwMiwKKwkweDcwMWYsIDB4NDcwYiwgMHgwMDA1LCAweDgxZmYsIDB4MTkwNCwgMHgzNTFhLCAweDA4MGMsIDB4NGFmMiwKKwkweDA5MDQsIDB4MzUxZCwgMHgwODBjLCAweDY3YzMsIDB4MTkwNCwgMHgzNTFhLCAweDAwYzYsIDB4MDgwYywKKwkweDRhYmYsIDB4MDBjZSwgMHgwOTA0LCAweDM1MWEsIDB4YTg2NywgMHgwMDAwLCAweGE4NjgsIDB4YzBmZCwKKwkweGE4NmEsIDB4N2VhOCwgMHgwODBjLCAweGJmYTgsIDB4MDkwNCwgMHgzNTFhLCAweDcwMDcsIDB4MDAwMywKKwkweDcwMWYsIDB4NDcyYiwgMHgwMDA1LCAweDA4MGMsIDB4NDI0OSwgMHgwMDA2LCAweDAwMzYsIDB4MjAwMSwKKwkweDFhNTcsIDB4MjAxYywgMHg3YjlhLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDFhNTgsIDB4MjAxYywKKwkweDdiOWUsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MWE1OSwgMHgyMDFjLCAweDdiYTIsIDB4MjAwMywKKwkweDAwMDAsIDB4MjAwMSwgMHgxYTUzLCAweDIwMWMsIDB4N2JhYSwgMHgyMDAzLCAweDAwMDAsIDB4MDAzZSwKKwkweDAwMGUsIDB4MDgwNCwgMHgzNGU4LCAweGE4MzAsIDB4OTA4NiwgMHgwMTAwLCAweDA5MDQsIDB4MzUxYSwKKwkweDg5MDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwKKwkweDAwMWIsIDB4MjAwOSwgMHgwMDBjLCAweDdhOGMsIDB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4MDgwNCwKKwkweDRiMGIsIDB4OTAwNiwgMHgwODBjLCAweDI3ZDcsIDB4NzhhOCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwKKwkweDAwZmYsIDB4MDExOCwgMHg4MWZmLCAweDE5MDQsIDB4MzUxYSwgMHgwODBjLCAweDcyMDcsIDB4MDExMCwKKwkweDA4MGMsIDB4NWVmMCwgMHg3ODg4LCAweDkwOGEsIDB4MTAwMCwgMHgxYTA0LCAweDM1MWQsIDB4Nzk4NCwKKwkweDkxODYsIDB4MDBmZiwgMHgwMTM4LCAweDkxODIsIDB4MDA3ZiwgMHgxYTA0LCAweDM1MWQsIDB4MjEwMCwKKwkweDA4MGMsIDB4MjdhMSwgMHgwMDI2LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA2MSwKKwkweDE5ZDIsIDB4NjAxYiwgMHgwMDAwLCAweDYwMWYsIDB4MDAwMCwgMHg2MDczLCAweDAwMDAsIDB4NjA3NywKKwkweDAwMDAsIDB4MDgwYywgMHg3MjA3LCAweDExNTgsIDB4MDgwYywgMHg3NTA0LCAweDA4MGMsIDB4NWYyYiwKKwkweDkwODUsIDB4MDAwMSwgMHgwODBjLCAweDcyNGUsIDB4MDgwYywgMHg3MTI3LCAweDAwZDAsIDB4MDgwYywKKwkweGEwNjksIDB4MjA2MSwgMHgwMTAwLCAweDIwMDEsIDB4MTgxNywgMHgyMDA0LCAweDkwODQsIDB4MDBmZiwKKwkweDgxMGYsIDB4OTEwNSwgMHg2MDRhLCAweDYwNDMsIDB4MDA5MCwgMHg2MDQzLCAweDAwMTAsIDB4MjAwOSwKKwkweDE5NzEsIDB4MjAwYiwgMHgwMDAwLCAweDIwMDksIDB4MDAyZCwgMHgyMDExLCAweDVlMTYsIDB4MDgwYywKKwkweDgzNmMsIDB4Nzk4NCwgMHgwODBjLCAweDcyMDcsIDB4MTExMCwgMHgyMDA5LCAweDAwZmYsIDB4N2E4OCwKKwkweDA4MGMsIDB4NDU5NiwgMHgwMTJlLCAweDAwY2UsIDB4MDAyZSwgMHgwODA0LCAweDM0ZTgsIDB4Nzk4NCwKKwkweDA4MGMsIDB4NjQzZiwgMHgyYjA4LCAweDE5MDQsIDB4MzUxZCwgMHgwODA0LCAweDM0ZTgsIDB4ODFmZiwKKwkweDAxMjAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MDQsIDB4MzUxYSwgMHg2MGQ4LCAweGQwYWMsIDB4MTEzMCwKKwkweGQwOWMsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDUsIDB4MDgwNCwgMHgzNTFhLCAweDA4MGMsIDB4NGFiZiwKKwkweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzUxYSwgMHg3OTg0LCAweDkxOTIsIDB4MDAyMSwKKwkweDFhMDQsIDB4MzUxZCwgMHg3YThjLCAweDdiODgsIDB4N2M5YywgMHg3ZDk4LCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMTksIDB4NzAyYSwgMHhhZjYwLCAweDc3MzYsIDB4MDgwYywgMHg0YjA4LCAweDcwMWYsIDB4NDdkZiwKKwkweDc4ODAsIDB4OTA4NiwgMHgwMDZlLCAweDAxMTAsIDB4NzAxZiwgMHg1MDg0LCAweDAwMDUsIDB4MjAwOSwKKwkweDAwODAsIDB4MDgwYywgMHg2NDlmLCAweDExMTgsIDB4MDgwYywgMHg2N2MzLCAweDAxMjAsIDB4MjAyMSwKKwkweDQwMGEsIDB4MDgwNCwgMHgzNGVhLCAweDAwZDYsIDB4MDA5NiwgMHhhOTY0LCAweGFhNmMsIDB4YWI3MCwKKwkweGFjNzQsIDB4YWQ3OCwgMHhhZTdjLCAweGE4ODQsIDB4OTBiZSwgMHgwMTAwLCAweDA5MDQsIDB4NDg3OCwKKwkweDkwYmUsIDB4MDExMiwgMHgwOTA0LCAweDQ4NzgsIDB4OTBiZSwgMHgwMTEzLCAweDA5MDQsIDB4NDg3OCwKKwkweDkwYmUsIDB4MDExNCwgMHgwOTA0LCAweDQ4NzgsIDB4OTBiZSwgMHgwMTE3LCAweDA5MDQsIDB4NDg3OCwKKwkweDkwYmUsIDB4MDExYSwgMHgwOTA0LCAweDQ4NzgsIDB4OTBiZSwgMHgwMTFjLCAweDA5MDQsIDB4NDg3OCwKKwkweDkwYmUsIDB4MDEyMSwgMHgwOTA0LCAweDQ4NWYsIDB4OTBiZSwgMHgwMTMxLCAweDA5MDQsIDB4NDg1ZiwKKwkweDkwYmUsIDB4MDE3MSwgMHgwOTA0LCAweDQ4NzgsIDB4OTBiZSwgMHgwMTczLCAweDA5MDQsIDB4NDg3OCwKKwkweDkwYmUsIDB4MDFhMSwgMHgxMTI4LCAweGE4OTQsIDB4ODAwNywgMHhhODk2LCAweDA4MDQsIDB4NDg4MywKKwkweDkwYmUsIDB4MDIxMiwgMHgwOTA0LCAweDQ4NmMsIDB4OTBiZSwgMHgwMjEzLCAweDA1ZTgsIDB4OTBiZSwKKwkweDAyMTQsIDB4MDUwMCwgMHg5MGJlLCAweDAyMTcsIDB4MDE4OCwgMHg5MGJlLCAweDAyMWEsIDB4MTEyMCwKKwkweGE4OWMsIDB4ODAwNywgMHhhODllLCAweDA0ZTAsIDB4OTBiZSwgMHgwMjFmLCAweDA1YzgsIDB4OTBiZSwKKwkweDAzMDAsIDB4MDViMCwgMHgwMDllLCAweDAwZGUsIDB4MDgwNCwgMHgzNTFkLCAweDcwMjgsIDB4OTA4MCwKKwkweDAwMTAsIDB4MjA5OCwgMHgyMGEwLCAweDcwMzQsIDB4MjBlMCwgMHgyMGU4LCAweDIwYTksIDB4MDAwNywKKwkweDA4MGMsIDB4NDhjMSwgMHg3MDI4LCAweDkwODAsIDB4MDAwZSwgMHgyMDk4LCAweDIwYTAsIDB4NzAzNCwKKwkweDIwZTAsIDB4MjBlOCwgMHgyMGE5LCAweDAwMDEsIDB4MDgwYywgMHg0OGMxLCAweDAwYzgsIDB4NzAyOCwKKwkweDkwODAsIDB4MDAwYywgMHgyMDk4LCAweDIwYTAsIDB4NzAzNCwgMHgyMGUwLCAweDIwZTgsIDB4MjBhOSwKKwkweDAwMDEsIDB4MDgwYywgMHg0OGNlLCAweDAwYjgsIDB4NzAyOCwgMHg5MDgwLCAweDAwMGUsIDB4MjA5OCwKKwkweDIwYTAsIDB4NzAzNCwgMHgyMGUwLCAweDIwZTgsIDB4MjBhOSwgMHgwMDAxLCAweDA4MGMsIDB4NDhjZSwKKwkweDcwMjgsIDB4OTA4MCwgMHgwMDBjLCAweDIwOTgsIDB4MjBhMCwgMHg3MDM0LCAweDIwZTAsIDB4MjBlOCwKKwkweDIwYTksIDB4MDAwMSwgMHgwNGYxLCAweDAwYzYsIDB4MDgwYywgMHg0YWJmLCAweDA1NTAsIDB4YTg2OCwKKwkweGMwZmQsIDB4YTg2YSwgMHhhODY3LCAweDAxMTksIDB4OTAwNiwgMHhhODgyLCAweGE4N2YsIDB4MDAyMCwKKwkweGE4OGIsIDB4MDAwMSwgMHg4MTBiLCAweGE5YWUsIDB4YThiMiwgMHhhYWI2LCAweGFiYmEsIDB4YWNiZSwKKwkweGFkYzIsIDB4YTljNiwgMHhhOGNhLCAweDAwY2UsIDB4MDA5ZSwgMHgwMGRlLCAweGE4NjYsIDB4YTgyMiwKKwkweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweGE4MDQsIDB4MjA0OCwgMHgwODBjLCAweGJmYzMsIDB4MTEyMCwKKwkweDIwMDksIDB4MDAwMywgMHgwODA0LCAweDM1MWEsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NDhiOCwKKwkweDAwMDUsIDB4MDBjZSwgMHgwMDllLCAweDAwZGUsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzUxYSwKKwkweGE4MjAsIDB4OTA4NiwgMHg4MDAxLCAweDE5MDQsIDB4MzRlOCwgMHgyMDA5LCAweDAwMDQsIDB4MDgwNCwKKwkweDM1MWEsIDB4MDAxNiwgMHgwMDI2LCAweDM1MTAsIDB4MjBhOSwgMHgwMDAyLCAweDQwMDIsIDB4NDEwNCwKKwkweDQwMDQsIDB4ODIxMSwgMHgxZGM4LCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwKKwkweDAwMzYsIDB4MDA0NiwgMHgzNTIwLCAweDIwYTksIDB4MDAwNCwgMHg0MDAyLCAweDQzMDQsIDB4NDIwNCwKKwkweDQxMDQsIDB4NDAwNCwgMHg4NDIxLCAweDFkYjgsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMDUsIDB4ODFmZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwMSwgMHgwODA0LCAweDM1MWEsIDB4NjBkOCwKKwkweGQwYWMsIDB4MTE2MCwgMHhkMDljLCAweDAxMjAsIDB4MjAwOSwgMHgwMDE2LCAweDA4MDQsIDB4MzUxYSwKKwkweGQwOWMsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDUsIDB4MDgwNCwgMHgzNTFhLCAweDc5ODQsIDB4NzhhOCwKKwkweDIwNDAsIDB4MDgwYywgMHhhMDYyLCAweDExMjAsIDB4OTE4MiwgMHgwMDdmLCAweDBhMDQsIDB4MzUxZCwKKwkweDkxODYsIDB4MDBmZiwgMHgwOTA0LCAweDM1MWQsIDB4OTE4MiwgMHgwODAwLCAweDFhMDQsIDB4MzUxZCwKKwkweDdhOGMsIDB4N2I4OCwgMHg2MDc4LCAweDkzMDYsIDB4MTE1OCwgMHg2MDdjLCAweDkyNGUsIDB4MDkwNCwKKwkweDM1MWQsIDB4MDgwYywgMHhhMDYyLCAweDExMjAsIDB4OTljYywgMHhmZjAwLCAweDA5MDQsIDB4MzUxZCwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDkzODYsIDB4ZmZmZiwgMHgwMTc4LCAweDAwMjYsIDB4MjAxMSwKKwkweDgwMDgsIDB4MDgwYywgMHg2N2U3LCAweDAwMmUsIDB4MDE0MCwgMHg5MThkLCAweDgwMDAsIDB4MDgwYywKKwkweDY4MzEsIDB4MTExOCwgMHgyMDAxLCAweDQwMDksIDB4MDQ1OCwgMHgwODBjLCAweDQ5ZDksIDB4MDU2MCwKKwkweDkwYzYsIDB4NDAwMCwgMHgxMTcwLCAweDAwYzYsIDB4MDAwNiwgMHg5MDBlLCAweDA4MGMsIDB4NjZiZiwKKwkweDExMDgsIDB4YzE4NSwgMHhiODAwLCAweGQwYmMsIDB4MDEwOCwgMHhjMThkLCAweDAwMGUsIDB4MDBjZSwKKwkweDAwYjgsIDB4OTBjNiwgMHg0MDA3LCAweDExMTAsIDB4MjQwOCwgMHgwMDkwLCAweDkwYzYsIDB4NDAwOCwKKwkweDExMTgsIDB4MjcwOCwgMHgyNjEwLCAweDAwNjAsIDB4OTBjNiwgMHg0MDA5LCAweDExMDgsIDB4MDA0MCwKKwkweDkwYzYsIDB4NDAwNiwgMHgxMTA4LCAweDAwMjAsIDB4MjAwMSwgMHg0MDA1LCAweDIwMDksIDB4MDAwYSwKKwkweDIwMjAsIDB4MDEyZSwgMHgwODA0LCAweDM0ZWEsIDB4MmIwMCwgMHg3MDI2LCAweDAwMTYsIDB4MDBiNiwKKwkweDAwYzYsIDB4MDBlNiwgMHgyYzcwLCAweDA4MGMsIDB4YTEzMCwgMHgwOTA0LCAweDQ5YTYsIDB4MmIwMCwKKwkweDYwMTIsIDB4MDgwYywgMHhjMmIzLCAweDJlNTgsIDB4MDBlZSwgMHgwMGU2LCAweDAwYzYsIDB4MDgwYywKKwkweDRhYmYsIDB4MDBjZSwgMHgyYjcwLCAweDExNTgsIDB4MDgwYywgMHhhMGUzLCAweDAwZWUsIDB4MDBjZSwKKwkweDAwYmUsIDB4MDAxZSwgMHgwMTJlLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDM1MWEsIDB4OTAwZSwKKwkweGE5NjYsIDB4YTk2YSwgMHgyOTAwLCAweDYwMTYsIDB4YTkzMiwgMHhhODY4LCAweGMwZmQsIDB4ZDg4YywKKwkweDAxMDgsIDB4YzBmNSwgMHhhODZhLCAweDA4MGMsIDB4MzE4YiwgMHg2MDIzLCAweDAwMDEsIDB4OTAwNiwKKwkweDA4MGMsIDB4NjNkYywgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg2M2YwLCAweDIwMDksIDB4MDAwMiwKKwkweDA4MGMsIDB4YTE1ZCwgMHg3OGE4LCAweGQwOTQsIDB4MDEzOCwgMHgwMGVlLCAweDcwMjQsIDB4MDBlNiwKKwkweDIwNTgsIDB4YjhiYywgMHhjMDhkLCAweGI4YmUsIDB4OTA4NSwgMHgwMDAxLCAweDAwZWUsIDB4MDBjZSwKKwkweDAwYmUsIDB4MDAxZSwgMHgwMTJlLCAweDExMjAsIDB4MjAwOSwgMHgwMDAzLCAweDA4MDQsIDB4MzUxYSwKKwkweDcwMDcsIDB4MDAwMywgMHg3MDFmLCAweDQ5YjUsIDB4MDAwNSwgMHhhODMwLCAweDIwMDgsIDB4OTE4ZSwKKwkweGRlYWQsIDB4MTEyMCwgMHgyMDIxLCAweDQwMDksIDB4MDgwNCwgMHgzNGVhLCAweDkwODYsIDB4MDEwMCwKKwkweDcwMjQsIDB4MjA1OCwgMHgxMTM4LCAweDIwMDksIDB4MDAwNCwgMHhiYTA0LCAweDkyOTQsIDB4MDBmZiwKKwkweDA4MDQsIDB4NTUyZiwgMHg5MDBlLCAweGE4NjgsIDB4ZDBmNCwgMHgxOTA0LCAweDM0ZTgsIDB4MDgwYywKKwkweDY2YmYsIDB4MTEwOCwgMHhjMTg1LCAweGI4MDAsIDB4ZDBiYywgMHgwMTA4LCAweGMxOGQsIDB4MDgwNCwKKwkweDM0ZTgsIDB4MDBlNiwgMHgwMGQ2LCAweDAwOTYsIDB4ODNmZiwgMHgwOTA0LCAweDRhMjEsIDB4OTAyZSwKKwkweDA4MGMsIDB4YTA2MiwgMHgwMTMwLCAweDkwMjYsIDB4MjBhOSwgMHgwODAwLCAweDIwNzEsIDB4MTAwMCwKKwkweDAwMzAsIDB4MjAyMSwgMHgwMDdmLCAweDIwYTksIDB4MDc4MSwgMHgyMDcxLCAweDEwN2YsIDB4MmUwNCwKKwkweDkwMDUsIDB4MTFiMCwgMHgyMTAwLCAweDk0MDYsIDB4MTVlOCwgMHgyNDI4LCAweDk0Y2UsIDB4MDA3ZiwKKwkweDExMjAsIDB4OTJjZSwgMHhmZmZkLCAweDE1MjgsIDB4MDAzMCwgMHg5NGNlLCAweDAwODAsIDB4MTEzMCwKKwkweDkyY2UsIDB4ZmZmYywgMHgxMWYwLCAweDkzY2UsIDB4MDBmZiwgMHgxMWQ4LCAweGM1ZmQsIDB4MDQ1MCwKKwkweDIwNTgsIDB4YmYxMCwgMHgyNzAwLCAweDkzMDYsIDB4MTFiOCwgMHhiZTE0LCAweDI2MDAsIDB4OTIwNiwKKwkweDExOTgsIDB4MjQwMCwgMHg5MTA2LCAweDExNTAsIDB4ZDg4NCwgMHgwNTY4LCAweGQ4OTQsIDB4MTU1OCwKKwkweDA4MGMsIDB4NjdjMywgMHgxNTQwLCAweDIwMDEsIDB4NDAwMCwgMHgwNDMwLCAweDIwMDEsIDB4NDAwNywKKwkweDA0MTgsIDB4MjAwMSwgMHg0MDA2LCAweDA0MDAsIDB4MjQwMCwgMHg5MTA2LCAweDExNTgsIDB4YmUxNCwKKwkweDg3ZmYsIDB4MTEyOCwgMHg4NmZmLCAweDA5NDgsIDB4MDgwYywgMHhhMDYyLCAweDE5MzAsIDB4MjAwMSwKKwkweDQwMDgsIDB4MDA5MCwgMHg4NDIwLCAweDhlNzAsIDB4MWYwNCwgMHg0OWVmLCAweDg1ZmYsIDB4MTEzMCwKKwkweDIwMDEsIDB4NDAwOSwgMHgwMDQ4LCAweDIwMDEsIDB4MDAwMSwgMHgwMDMwLCAweDA4MGMsIDB4NjQzZiwKKwkweDFkZDAsIDB4YmIxMiwgMHhiYTE2LCAweDkwMDYsIDB4OTAwNSwgMHgwMDllLCAweDAwZGUsIDB4MDBlZSwKKwkweDAwMDUsIDB4ODFmZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwMSwgMHgwODA0LCAweDM1MWEsIDB4MDgwYywKKwkweDRhYmYsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgzNTFhLCAweGE4NjcsIDB4MDAwMCwKKwkweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweDc4ODQsIDB4OTAwNSwgMHgwOTA0LCAweDM1MWQsIDB4OTA5NiwKKwkweDAwZmYsIDB4MDEyMCwgMHg5MDkyLCAweDAwMDQsIDB4MWEwNCwgMHgzNTFkLCAweDIwMTAsIDB4MjkxOCwKKwkweDA4MGMsIDB4MzEzMSwgMHgxMTIwLCAweDIwMDksIDB4MDAwMywgMHgwODA0LCAweDM1MWEsIDB4NzAwNywKKwkweDAwMDMsIDB4NzAxZiwgMHg0YTc0LCAweDAwMDUsIDB4YTgzMCwgMHg5MDg2LCAweDAxMDAsIDB4MTkwNCwKKwkweDM0ZTgsIDB4MjAwOSwgMHgwMDA0LCAweDA4MDQsIDB4MzUxYSwgMHg3OTg0LCAweDA4MGMsIDB4YTA2MiwKKwkweDExMjAsIDB4OTE4MiwgMHgwMDdmLCAweDBhMDQsIDB4MzUxZCwgMHg5MTg2LCAweDAwZmYsIDB4MDkwNCwKKwkweDM1MWQsIDB4OTE4MiwgMHgwODAwLCAweDFhMDQsIDB4MzUxZCwgMHgyMDAxLCAweDk0MDAsIDB4MDgwYywKKwkweDU1OGEsIDB4MTkwNCwgMHgzNTFhLCAweDA4MDQsIDB4MzRlOCwgMHhhOTk4LCAweDA4MGMsIDB4YTA2MiwKKwkweDExMTgsIDB4OTE4MiwgMHgwMDdmLCAweDAyODAsIDB4OTE4NiwgMHgwMGZmLCAweDAxNjgsIDB4OTE4MiwKKwkweDA4MDAsIDB4MTI1MCwgMHgyMDAxLCAweDk0MDAsIDB4MDgwYywgMHg1NThhLCAweDExYTgsIDB4MDA2MCwKKwkweGE4OTcsIDB4NDAwNSwgMHhhOTlhLCAweDAwMTAsIDB4YTg5NywgMHg0MDA2LCAweDkwMGUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MjAwMSwgMHgwMDMwLCAweDAwMDUsIDB4YTg5NywgMHg0MDAwLCAweDkwMGUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MjAwMSwgMHgwMDAwLCAweDAwMDUsIDB4MjAwOSwgMHgwMDBhLCAweDBjNDgsIDB4MDgwYywKKwkweDEwMzEsIDB4MDE5OCwgMHg5MDA2LCAweGE4MDIsIDB4NzAxNCwgMHg5MDA1LCAweDExMjAsIDB4MjkwMCwKKwkweDcwMTYsIDB4NzAxYSwgMHgwMDQwLCAweDcwMTgsIDB4YTgwMiwgMHgwMDg2LCAweDIwNDAsIDB4MjkwMCwKKwkweGEwMDYsIDB4NzAxYSwgMHgwMDhlLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDc5ODQsIDB4MDgwYywKKwkweDY0OWYsIDB4MTEzMCwgMHg3ZTg4LCAweDk2ODQsIDB4M2ZmZiwgMHg5MDgyLCAweDQwMDAsIDB4MDIwOCwKKwkweDkwNWUsIDB4OGJmZiwgMHgwMDA1LCAweGE5OTgsIDB4MDgwYywgMHg2NDlmLCAweDExMzAsIDB4YWU5YywKKwkweDk2ODQsIDB4M2ZmZiwgMHg5MDgyLCAweDQwMDAsIDB4MDIwOCwgMHg5MDVlLCAweDhiZmYsIDB4MDAwNSwKKwkweGFlOTgsIDB4MDAwOCwgMHg3ZTg0LCAweDI2MDgsIDB4MDgwYywgMHg2NDlmLCAweDExMDgsIDB4MDAwOCwKKwkweDkwNWUsIDB4OGJmZiwgMHgwMDA1LCAweDAwMTYsIDB4NzExNCwgMHg4MWZmLCAweDAxMjgsIDB4MjE0OCwKKwkweGE5MDQsIDB4MDgwYywgMHgxMDYzLCAweDBjYzgsIDB4NzExNiwgMHg3MTFhLCAweDAwMWUsIDB4MDAwNSwKKwkweDIwMzEsIDB4MDAwMSwgMHgwMDEwLCAweDIwMzEsIDB4MDAwMCwgMHgyMDYxLCAweDE4YjYsIDB4MmM0NCwKKwkweGE2NmEsIDB4YTE3YSwgMHhhNzcyLCAweGEwNzYsIDB4YTI4ZSwgMHhhMzkyLCAweGE0OTYsIDB4YTU5YSwKKwkweDA4MGMsIDB4MTEyZSwgMHg3MDA3LCAweDAwMDIsIDB4NzAxZiwgMHgzNGU4LCAweDAwMDUsIDB4MDBmNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzksIDB4MDAwMCwgMHgyMDAxLCAweDE4YWUsIDB4MjAwNCwKKwkweDkwMDUsIDB4MTE5MCwgMHgwZTA0LCAweDRiM2MsIDB4N2EzNiwgMHg3ODMzLCAweDAwMTIsIDB4N2E4MiwKKwkweDdiODYsIDB4N2M4YSwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwKKwkweDE5MGMsIDB4MTFlMCwgMHgwODA0LCAweDRiYTIsIDB4MDAxNiwgMHgwMDg2LCAweDAwOTYsIDB4MDBjNiwKKwkweDAwZTYsIDB4MjA3MSwgMHgxODljLCAweDcwNDQsIDB4OTAwNSwgMHgxNTQwLCAweDcxNDgsIDB4OTE4MiwKKwkweDAwMTAsIDB4MDI4OCwgMHg3MDM4LCAweDIwNjAsIDB4MDgwYywgMHgxMDMxLCAweDA5MDQsIDB4NGI5YSwKKwkweGE4NGIsIDB4MDAwMCwgMHgyOTAwLCAweDcwNDYsIDB4MjAwMSwgMHgwMDAyLCAweDkwODAsIDB4MWZjOCwKKwkweDIwMDUsIDB4YTg0NiwgMHgwMDk4LCAweDcwMzgsIDB4OTBlMCwgMHgwMDA0LCAweDIwMDEsIDB4MThiOCwKKwkweDljODIsIDB4MThmOCwgMHgwMjEwLCAweDIwNjEsIDB4MThiOCwgMHgyYzAwLCAweDcwM2EsIDB4NzE0OCwKKwkweDgxZmYsIDB4MTEwOCwgMHg3MDNlLCAweDgxMDgsIDB4NzE0YSwgMHgwNDYwLCAweDcxNDgsIDB4ODEwOCwKKwkweDcxNGEsIDB4NzA0NCwgMHgyMDQwLCAweGExNDQsIDB4MjEwNSwgMHgwMDE2LCAweDkwOGEsIDB4MDAzNiwKKwkweDFhMGMsIDB4MGRmYSwgMHgyMDYwLCAweDAwMWUsIDB4ODEwOCwgMHgyMTA1LCAweDkwMDUsIDB4YTE0NiwKKwkweDE1MjAsIDB4MDgwYywgMHgxMDMxLCAweDExMzAsIDB4ODEwOSwgMHhhOTQ2LCAweDcxNDgsIDB4ODEwOSwKKwkweDcxNGEsIDB4MDBkOCwgMHg5MDA2LCAweGE4MDYsIDB4YTg0YSwgMHhhMDQ2LCAweDI4MDAsIDB4YTgwMiwKKwkweDI5MDAsIDB4YTAwNiwgMHg3MDQ2LCAweDIwMDEsIDB4MDAwMiwgMHg5MDgwLCAweDFmYzgsIDB4MjAwNSwKKwkweGE4NDYsIDB4MDA1OCwgMHgyMjYyLCAweDYzMDYsIDB4NjQwYSwgMHgwMGVlLCAweDAwY2UsIDB4MDA5ZSwKKwkweDAwOGUsIDB4MDAxZSwgMHgwMTJlLCAweDAwZmUsIDB4MDAwNSwgMHgyYzAwLCAweDkwODIsIDB4MDAxYiwKKwkweDAwMDIsIDB4NGJjNCwgMHg0YmM0LCAweDRiYzYsIDB4NGJjNCwgMHg0YmM0LCAweDRiYzQsIDB4NGJjYSwKKwkweDRiYzQsIDB4NGJjNCwgMHg0YmM0LCAweDRiY2UsIDB4NGJjNCwgMHg0YmM0LCAweDRiYzQsIDB4NGJkMiwKKwkweDRiYzQsIDB4NGJjNCwgMHg0YmM0LCAweDRiZDYsIDB4NGJjNCwgMHg0YmM0LCAweDRiYzQsIDB4NGJkYSwKKwkweDRiYzQsIDB4NGJjNCwgMHg0YmM0LCAweDRiZGYsIDB4MDgwYywgMHgwZGZhLCAweGEyNzYsIDB4YTM3YSwKKwkweGE0N2UsIDB4MDg5OCwgMHhhMjg2LCAweGEzOGEsIDB4YTQ4ZSwgMHgwODc4LCAweGEyOTYsIDB4YTM5YSwKKwkweGE0OWUsIDB4MDg1OCwgMHhhMmE2LCAweGEzYWEsIDB4YTRhZSwgMHgwODM4LCAweGEyYjYsIDB4YTNiYSwKKwkweGE0YmUsIDB4MDgxOCwgMHhhMmM2LCAweGEzY2EsIDB4YTRjZSwgMHgwODA0LCAweDRiOWQsIDB4YTJkNiwKKwkweGEzZGEsIDB4YTRkZSwgMHgwODA0LCAweDRiOWQsIDB4MDBlNiwgMHgyMDcxLCAweDE4OWMsIDB4NzA0OCwKKwkweDkwMDUsIDB4MDkwNCwgMHg0Yzc2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDBlMDQsIDB4NGM3NSwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMDAwLCAweDAwYzYsIDB4MDA5NiwgMHgwMDg2LCAweDAwNzYsIDB4OTAwNiwKKwkweDIwMzgsIDB4NzA0MCwgMHgyMDQ4LCAweDkwMDUsIDB4MDUwMCwgMHhhOTQ4LCAweDIxMDUsIDB4MDAxNiwKKwkweDkwOGEsIDB4MDAzNiwgMHgxYTBjLCAweDBkZmEsIDB4MjA2MCwgMHgwMDFlLCAweDgxMDgsIDB4MjEwNSwKKwkweDkwMDUsIDB4YTk0YSwgMHgxOTA0LCAweDRjNzgsIDB4YTgwNCwgMHg5MDA1LCAweDA5MGMsIDB4MGRmYSwKKwkweDcwNDIsIDB4MjkzOCwgMHgyMDQwLCAweGEwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDAwMDIsIDB4OTA4MCwKKwkweDFmYzgsIDB4MjAwNSwgMHhhMDRhLCAweDA4MDQsIDB4NGM3OCwgMHg3MDNjLCAweDIwNjAsIDB4MmMxNCwKKwkweDYzMDQsIDB4NjQwOCwgMHg2NTBjLCAweDIyMDAsIDB4NzgzNiwgMHg3ODMzLCAweDAwMTIsIDB4Nzg4MiwKKwkweDIzMDAsIDB4Nzg4NiwgMHgyNDAwLCAweDc4OGEsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwKKwkweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLCAweDExZTAsIDB4ODdmZiwgMHgwMTE4LCAweDI3NDgsIDB4MDgwYywKKwkweDEwNjMsIDB4NzA0OCwgMHg4MDAxLCAweDcwNGEsIDB4OTAwNSwgMHgxMTcwLCAweDcwNDAsIDB4MjA0OCwKKwkweDkwMDUsIDB4MDEyOCwgMHgwODBjLCAweDEwNjMsIDB4OTAwNiwgMHg3MDQyLCAweDcwNDYsIDB4NzAzYiwKKwkweDE4YjgsIDB4NzAzZiwgMHgxOGI4LCAweDA0MjAsIDB4NzA0MCwgMHg5MDA1LCAweDE1MDgsIDB4NzIzOCwKKwkweDJjMDAsIDB4OTIwNiwgMHgwMTQ4LCAweDljODAsIDB4MDAwNCwgMHg5MGZhLCAweDE4ZjgsIDB4MDIxMCwKKwkweDIwMDEsIDB4MThiOCwgMHg3MDNlLCAweDAwYTAsIDB4OTAwNiwgMHg3MDNlLCAweDcwM2EsIDB4NzA0NCwKKwkweDkwMDUsIDB4MDkwYywgMHgwZGZhLCAweDIwNDgsIDB4YTgwMCwgMHg5MDA1LCAweDFkZTAsIDB4MjkwMCwKKwkweDcwNDIsIDB4MjAwMSwgMHgwMDAyLCAweDkwODAsIDB4MWZjOCwgMHgyMDA1LCAweGE4NGEsIDB4MDAwMCwKKwkweDAwN2UsIDB4MDA4ZSwgMHgwMDllLCAweDAwY2UsIDB4MDBmZSwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwKKwkweDJjMDAsIDB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4NGM5NywgMHg0Yzk3LCAweDRjOTksIDB4NGM5NywKKwkweDRjOTcsIDB4NGM5NywgMHg0YzllLCAweDRjOTcsIDB4NGM5NywgMHg0Yzk3LCAweDRjYTMsIDB4NGM5NywKKwkweDRjOTcsIDB4NGM5NywgMHg0Y2E4LCAweDRjOTcsIDB4NGM5NywgMHg0Yzk3LCAweDRjYWQsIDB4NGM5NywKKwkweDRjOTcsIDB4NGM5NywgMHg0Y2IyLCAweDRjOTcsIDB4NGM5NywgMHg0Yzk3LCAweDRjYjcsIDB4MDgwYywKKwkweDBkZmEsIDB4YWE3NCwgMHhhYjc4LCAweGFjN2MsIDB4MDgwNCwgMHg0YzIzLCAweGFhODQsIDB4YWI4OCwKKwkweGFjOGMsIDB4MDgwNCwgMHg0YzIzLCAweGFhOTQsIDB4YWI5OCwgMHhhYzljLCAweDA4MDQsIDB4NGMyMywKKwkweGFhYTQsIDB4YWJhOCwgMHhhY2FjLCAweDA4MDQsIDB4NGMyMywgMHhhYWI0LCAweGFiYjgsIDB4YWNiYywKKwkweDA4MDQsIDB4NGMyMywgMHhhYWM0LCAweGFiYzgsIDB4YWNjYywgMHgwODA0LCAweDRjMjMsIDB4YWFkNCwKKwkweGFiZDgsIDB4YWNkYywgMHgwODA0LCAweDRjMjMsIDB4MDAyNiwgMHgwODBjLCAweDU1ZGIsIDB4ZDBjNCwKKwkweDAxMjAsIDB4MjAxMSwgMHg4MDE0LCAweDA4MGMsIDB4NGIxZiwgMHgwMDJlLCAweDAwMDUsIDB4ODFmZiwKKwkweDE5MDQsIDB4MzUxYSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDMwLCAweGMwOGQsIDB4YzA4NSwKKwkweGMwYWMsIDB4NjAzMiwgMHgwODBjLCAweDcyMDcsIDB4MTE1OCwgMHgwODBjLCAweDc1MDQsIDB4MDgwYywKKwkweDVmMmIsIDB4OTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4NzI0ZSwgMHgwODBjLCAweDcxMjcsIDB4MDAxMCwKKwkweDA4MGMsIDB4NWRlYSwgMHgwMTJlLCAweDA4MDQsIDB4MzRlOCwgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwKKwkweDAwMDEsIDB4MDgwNCwgMHgzNTFhLCAweDA4MGMsIDB4NTVlZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwNywKKwkweDA4MDQsIDB4MzUxYSwgMHgwODBjLCAweDY3YmIsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDgsIDB4MDgwNCwKKwkweDM1MWEsIDB4MDAyNiwgMHgyMDExLCAweDAwMTAsIDB4MDgwYywgMHg2N2U3LCAweDAwMmUsIDB4MDE0MCwKKwkweDc5ODQsIDB4MDgwYywgMHg2ODMxLCAweDExMjAsIDB4MjAwOSwgMHg0MDA5LCAweDA4MDQsIDB4MzUxYSwKKwkweDc5ODQsIDB4MDgwYywgMHg2NDNmLCAweDE5MDQsIDB4MzUxZCwgMHgwODBjLCAweDRhZjIsIDB4MDkwNCwKKwkweDM1MWQsIDB4MmIwMCwgMHg3MDI2LCAweDA4MGMsIDB4NjdjMywgMHg3ODg4LCAweDExNzAsIDB4OTA4NCwKKwkweDAwMDUsIDB4MTE1OCwgMHg5MDBlLCAweDA4MGMsIDB4NjZiZiwgMHgxMTA4LCAweGMxODUsIDB4YjgwMCwKKwkweGQwYmMsIDB4MDEwOCwgMHhjMThkLCAweDA4MDQsIDB4MzRlOCwgMHgwODBjLCAweDRhYmYsIDB4MDkwNCwKKwkweDM1MWEsIDB4OTAwNiwgMHhhODY2LCAweGE4MzIsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4MDgwYywKKwkweGMwNjEsIDB4MDkwNCwgMHgzNTFhLCAweDc4ODgsIDB4ZDA5NCwgMHgwMTE4LCAweGI4YmMsIDB4YzA4ZCwKKwkweGI4YmUsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NGQ4NywgMHgwMDA1LCAweDIwNjEsIDB4MTgwMCwKKwkweDA4MGMsIDB4NTVlZiwgMHgyMDA5LCAweDAwMDcsIDB4MTU2MCwgMHgwODBjLCAweDY3YmIsIDB4MDExOCwKKwkweDIwMDksIDB4MDAwOCwgMHgwNDMwLCAweGE5OTgsIDB4MDgwYywgMHg2NDNmLCAweDE1MzAsIDB4MDgwYywKKwkweDRhZjAsIDB4MDUxOCwgMHgwODBjLCAweDY3YzMsIDB4YTg5YywgMHgxMTY4LCAweDkwODQsIDB4MDAwNSwKKwkweDExNTAsIDB4OTAwZSwgMHgwODBjLCAweDY2YmYsIDB4MTEwOCwgMHhjMTg1LCAweGI4MDAsIDB4ZDBiYywKKwkweDAxMDgsIDB4YzE4ZCwgMHgwMGQwLCAweGE4NjgsIDB4YzBmYywgMHhhODZhLCAweDA4MGMsIDB4YzA2MSwKKwkweDExZTAsIDB4YTg5YywgMHhkMDk0LCAweDAxMTgsIDB4YjhiYywgMHhjMDhkLCAweGI4YmUsIDB4MjAwOSwKKwkweDAwMDMsIDB4YTg5NywgMHg0MDA1LCAweGE5OWEsIDB4MDAxMCwgMHhhODk3LCAweDQwMDYsIDB4OTAwZSwKKwkweDkwODUsIDB4MDAwMSwgMHgyMDAxLCAweDAwMzAsIDB4MDAwNSwgMHhhODk3LCAweDQwMDAsIDB4YTk5YSwKKwkweDkwMDYsIDB4OTE4ZCwgMHgwMDAxLCAweDIwMDgsIDB4MDAwNSwgMHg5MDA2LCAweDAwMDUsIDB4YTgzMCwKKwkweDIwMDgsIDB4OTE4ZSwgMHhkZWFkLCAweDExMjAsIDB4MjAyMSwgMHg0MDA5LCAweDA4MDQsIDB4MzRlYSwKKwkweDkwODYsIDB4MDEwMCwgMHg3MDI0LCAweDIwNTgsIDB4MTExMCwgMHgwODA0LCAweDU1MmYsIDB4OTAwZSwKKwkweDA4MGMsIDB4NjZiZiwgMHgxMTA4LCAweGMxODUsIDB4YjgwMCwgMHhkMGJjLCAweDAxMDgsIDB4YzE4ZCwKKwkweDA4MDQsIDB4MzRlOCwgMHgwODBjLCAweDU1ZWYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDcsIDB4MDgwNCwKKwkweDM1MWEsIDB4N2Y4NCwgMHg3YThjLCAweDdiODgsIDB4N2M5YywgMHg3ZDk4LCAweDA4MGMsIDB4NGFiZiwKKwkweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzUxYSwgMHg5MDBlLCAweDIxMzAsIDB4NzEyNiwKKwkweDcxMzIsIDB4YTg2MCwgMHgyMGU4LCAweDcwMzYsIDB4YTg1YywgMHg5MDgwLCAweDAwMDUsIDB4NzAyYSwKKwkweDIwYTAsIDB4MDgwYywgMHg2NDlmLCAweDE5MDQsIDB4NGUyNSwgMHgwODBjLCAweDY3YzMsIDB4MDEyMCwKKwkweDA4MGMsIDB4NjdjYiwgMHgxOTA0LCAweDRlMjUsIDB4MDgwYywgMHg2N2JiLCAweDExMzAsIDB4MDgwYywKKwkweDY2YmYsIDB4MTExOCwgMHhkNzljLCAweDA5MDQsIDB4NGUyNSwgMHhkNzk0LCAweDExMTAsIDB4ZDc4NCwKKwkweDAxYTgsIDB4YjhiNCwgMHgyMGUwLCAweGI4YjgsIDB4OTA4MCwgMHgwMDA2LCAweDIwOTgsIDB4MzQwMCwKKwkweGQ3OTQsIDB4MDE2MCwgMHgyMGE5LCAweDAwMDgsIDB4NDAwMywgMHgyMDk4LCAweDIwYTAsIDB4M2QwMCwKKwkweDIwZTAsIDB4MjBhOSwgMHgwMDAyLCAweDA4MGMsIDB4NDhjZSwgMHgwMDQ4LCAweDIwYTksIDB4MDAwNCwKKwkweDQwMDMsIDB4MjA5OCwgMHgyMGEwLCAweDNkMDAsIDB4MjBlMCwgMHgwODBjLCAweDQ4Y2UsIDB4NDEwNCwKKwkweGQ3OTQsIDB4MDUyOCwgMHhiOGI0LCAweDIwZTAsIDB4YjhiOCwgMHgyMDYwLCAweDljODAsIDB4MDAwMCwKKwkweDIwOTgsIDB4MjBhOSwgMHgwMDAyLCAweDQwMDMsIDB4OWM4MCwgMHgwMDAzLCAweDIwOTgsIDB4MjBhOSwKKwkweDAwMDEsIDB4NDAwNSwgMHg5YzgwLCAweDAwMDQsIDB4MjA5OCwgMHgzNDAwLCAweDIwYTksIDB4MDAwMiwKKwkweDQwMDMsIDB4MjA5OCwgMHgyMGEwLCAweDNkMDAsIDB4MjBlMCwgMHgwODBjLCAweDQ4YzEsIDB4OWM4MCwKKwkweDAwMjYsIDB4MjA5OCwgMHhiOGI0LCAweDIwZTAsIDB4MjBhOSwgMHgwMDAyLCAweDQwMDMsIDB4ZDc5NCwKKwkweDAxMTAsIDB4OTZiMCwgMHgwMDBiLCAweDk2YjAsIDB4MDAwNSwgMHg4MTA4LCAweDA4MGMsIDB4YTA2MiwKKwkweDAxMTgsIDB4OTE4NiwgMHgwODAwLCAweDAwNDAsIDB4ZDc4YywgMHgwMTIwLCAweDkxODYsIDB4MDgwMCwKKwkweDAxNzAsIDB4MDAxOCwgMHg5MTg2LCAweDAwN2UsIDB4MDE1MCwgMHhkNzk0LCAweDAxMTgsIDB4OTY4NiwKKwkweDAwMjAsIDB4MDAxMCwgMHg5Njg2LCAweDAwMjgsIDB4MDE1MCwgMHgwODA0LCAweDRkYzEsIDB4ODZmZiwKKwkweDExMjAsIDB4NzEyNCwgMHg4MTBiLCAweDA4MDQsIDB4MzRlOCwgMHg3MDMzLCAweDAwMDEsIDB4NzEyMiwKKwkweDcwMjQsIDB4OTYwMCwgMHg3MDI2LCAweDc3MmUsIDB4MjA2MSwgMHgxOGI2LCAweDJjNDQsIDB4YTA2YiwKKwkweDAwMDAsIDB4YTY3YSwgMHg3MDM0LCAweGEwNzIsIDB4NzAyOCwgMHhhMDc2LCAweGEyOGUsIDB4YTM5MiwKKwkweGE0OTYsIDB4YTU5YSwgMHgwODBjLCAweDExMmUsIDB4NzAwNywgMHgwMDAyLCAweDcwMWYsIDB4NGU2MSwKKwkweDAwMDUsIDB4NzAzMCwgMHg5MDA1LCAweDExODAsIDB4NzEyMCwgMHg3MDI4LCAweDIwYTAsIDB4NzcyYywKKwkweDkwMzYsIDB4NzAzNCwgMHgyMGU4LCAweDIwNjEsIDB4MThiNiwgMHgyYzQ0LCAweGEyOGMsIDB4YTM5MCwKKwkweGE0OTQsIDB4YTU5OCwgMHgwODA0LCAweDRkYzEsIDB4NzEyNCwgMHg4MTBiLCAweDA4MDQsIDB4MzRlOCwKKwkweDIwMjksIDB4MDA3ZSwgMHg3OTg0LCAweDdhODgsIDB4N2I4YywgMHg3Yzk4LCAweDkxODQsIDB4ZmYwMCwKKwkweDgwMDcsIDB4OTBlMiwgMHgwMDIwLCAweDBhMDQsIDB4MzUxZCwgMHg5NTAyLCAweDBhMDQsIDB4MzUxZCwKKwkweDkxODQsIDB4MDBmZiwgMHg5MGUyLCAweDAwMjAsIDB4MGEwNCwgMHgzNTFkLCAweDk1MDIsIDB4MGEwNCwKKwkweDM1MWQsIDB4OTI4NCwgMHhmZjAwLCAweDgwMDcsIDB4OTBlMiwgMHgwMDIwLCAweDBhMDQsIDB4MzUxZCwKKwkweDk1MDIsIDB4MGEwNCwgMHgzNTFkLCAweDkyODQsIDB4MDBmZiwgMHg5MGUyLCAweDAwMjAsIDB4MGEwNCwKKwkweDM1MWQsIDB4OTUwMiwgMHgwYTA0LCAweDM1MWQsIDB4OTM4NCwgMHhmZjAwLCAweDgwMDcsIDB4OTBlMiwKKwkweDAwMjAsIDB4MGEwNCwgMHgzNTFkLCAweDk1MDIsIDB4MGEwNCwgMHgzNTFkLCAweDkzODQsIDB4MDBmZiwKKwkweDkwZTIsIDB4MDAyMCwgMHgwYTA0LCAweDM1MWQsIDB4OTUwMiwgMHgwYTA0LCAweDM1MWQsIDB4OTQ4NCwKKwkweGZmMDAsIDB4ODAwNywgMHg5MGUyLCAweDAwMjAsIDB4MGEwNCwgMHgzNTFkLCAweDk1MDIsIDB4MGEwNCwKKwkweDM1MWQsIDB4OTQ4NCwgMHgwMGZmLCAweDkwZTIsIDB4MDAyMCwgMHgwYTA0LCAweDM1MWQsIDB4OTUwMiwKKwkweDBhMDQsIDB4MzUxZCwgMHgyMDYxLCAweDE5NjEsIDB4NjEwMiwgMHg2MjA2LCAweDYzMGEsIDB4NjQwZSwKKwkweDA4MDQsIDB4MzRlOCwgMHgwMDA2LCAweDA4MGMsIDB4NTVkYiwgMHhkMGNjLCAweDAwMGUsIDB4MDAwNSwKKwkweDAwMDYsIDB4MDgwYywgMHg1NWRmLCAweGQwYmMsIDB4MDAwZSwgMHgwMDA1LCAweDYxNzAsIDB4N2E4NCwKKwkweDYzMDAsIDB4ODJmZiwgMHgxMTE4LCAweDc5ODYsIDB4MDgwNCwgMHgzNGU4LCAweDgzZmYsIDB4MTkwNCwKKwkweDM1MWQsIDB4MjAwMSwgMHhmZmYwLCAweDkyMDAsIDB4MWEwNCwgMHgzNTFkLCAweDIwMTksIDB4ZmZmZiwKKwkweDYwNzQsIDB4OTMwMiwgMHg5MjAwLCAweDBhMDQsIDB4MzUxZCwgMHg3OTg2LCAweDYyNzIsIDB4MDgwNCwKKwkweDM0ZTgsIDB4MDgwYywgMHg1NWVmLCAweDE5MDQsIDB4MzUxYSwgMHg3Yzg4LCAweDdkODQsIDB4N2U5OCwKKwkweDdmOGMsIDB4MDgwYywgMHg0YWJmLCAweDA5MDQsIDB4MzUxYSwgMHg5MDBlLCAweDkwMWUsIDB4NzMyNiwKKwkweDczMzIsIDB4YTg2MCwgMHgyMGU4LCAweDcwMzYsIDB4YTg1YywgMHg5MDgwLCAweDAwMDMsIDB4NzAyYSwKKwkweDIwYTAsIDB4OTFkOCwgMHgxMDAwLCAweDJiNWMsIDB4OGJmZiwgMHgwMTc4LCAweDA4MGMsIDB4NjdjMywKKwkweDAxMTgsIDB4MDgwYywgMHg2N2NiLCAweDExNDgsIDB4MjBhOSwgMHgwMDAxLCAweGI4MTQsIDB4NDAwNCwKKwkweGI4MTAsIDB4NDAwNCwgMHg0MTA0LCAweDkzOTgsIDB4MDAwMywgMHg4MTA4LCAweDkxODIsIDB4MDgwMCwKKwkweDAxMjAsIDB4OTM4NiwgMHgwMDNjLCAweDAxNzAsIDB4MGMyMCwgMHg4M2ZmLCAweDExNDgsIDB4NzIyNCwKKwkweDkwMGUsIDB4MjAwMSwgMHgwMDAzLCAweDA4MGMsIDB4ODRmZiwgMHgyMjA4LCAweDA4MDQsIDB4MzRlOCwKKwkweDcwMzMsIDB4MDAwMSwgMHg3MTIyLCAweDcwMjQsIDB4OTMwMCwgMHg3MDI2LCAweDIwNjEsIDB4MThiNiwKKwkweDJjNDQsIDB4YTA2YiwgMHgwMDAwLCAweGEzN2EsIDB4NzAyOCwgMHhhMDc2LCAweDcwMzQsIDB4YTA3MiwKKwkweGE0OGUsIDB4YTU5MiwgMHhhNjk2LCAweGE3OWEsIDB4MDgwYywgMHgxMTJlLCAweDcwMDcsIDB4MDAwMiwKKwkweDcwMWYsIDB4NGY1MywgMHgwMDA1LCAweDcwMzAsIDB4OTAwNSwgMHgxMTc4LCAweDcxMjAsIDB4NzAyOCwKKwkweDIwYTAsIDB4OTAxZSwgMHg3MDM0LCAweDIwZTgsIDB4MjA2MSwgMHgxOGI2LCAweDJjNDQsIDB4YTQ4YywKKwkweGE1OTAsIDB4YTY5NCwgMHhhNzk4LCAweDA4MDQsIDB4NGYxMSwgMHg3MjI0LCAweDkwMGUsIDB4MjAwMSwKKwkweDAwMDMsIDB4MDgwYywgMHg4NGZmLCAweDIyMDgsIDB4MDgwNCwgMHgzNGU4LCAweDAwZjYsIDB4MDBlNiwKKwkweDA4MGMsIDB4NTVlZiwgMHgyMDA5LCAweDAwMDcsIDB4MTkwNCwgMHg0ZmU2LCAweDIwNzEsIDB4MTg5YywKKwkweDc0NWMsIDB4ODRmZiwgMHgyMDA5LCAweDAwMGUsIDB4MTkwNCwgMHg0ZmU2LCAweGFjOWMsIDB4YWQ5OCwKKwkweGFlYTQsIDB4YWZhMCwgMHgwMDk2LCAweDA4MGMsIDB4MTA0YSwgMHgyMDA5LCAweDAwMDIsIDB4MDkwNCwKKwkweDRmZTYsIDB4MjkwMCwgMHg3MDVlLCAweDkwMGUsIDB4OTAxZSwgMHg3MzU2LCAweDczNjIsIDB4YTg2MCwKKwkweDcwNjYsIDB4YTg1YywgMHg5MDgwLCAweDAwMDMsIDB4NzA1YSwgMHgyMGEwLCAweDkxZDgsIDB4MTAwMCwKKwkweDJiNWMsIDB4OGJmZiwgMHgwMTc4LCAweDA4MGMsIDB4NjdjMywgMHgwMTE4LCAweDA4MGMsIDB4NjdjYiwKKwkweDExNDgsIDB4YjgxNCwgMHgyMGE5LCAweDAwMDEsIDB4NDAwNCwgMHhiODEwLCAweDQwMDQsIDB4NDEwNCwKKwkweDkzOTgsIDB4MDAwMywgMHg4MTA4LCAweDkxODIsIDB4MDgwMCwgMHgwMTIwLCAweDkzODYsIDB4MDAzYywKKwkweDAxZTgsIDB4MGMyMCwgMHg4M2ZmLCAweDExYzAsIDB4NzI1NCwgMHg5MDBlLCAweDIwMDEsIDB4MDAwMywKKwkweDA4MGMsIDB4ODRmZiwgMHgyMjA4LCAweDAwOWUsIDB4YTg5NywgMHg0MDAwLCAweGE5OWEsIDB4NzE1YywKKwkweDgxZmYsIDB4MDkwYywgMHgwZGZhLCAweDIxNDgsIDB4MDgwYywgMHgxMDYzLCAweDkwMDYsIDB4NzA1ZSwKKwkweDkxOGQsIDB4MDAwMSwgMHgyMDA4LCAweDA0MTgsIDB4NzA2MywgMHgwMDAxLCAweDcxNTIsIDB4NzA1NCwKKwkweDkzMDAsIDB4NzA1NiwgMHgyMDYxLCAweDE4YjcsIDB4MmM0NCwgMHhhMzdhLCAweDcwNTgsIDB4YTA3NiwKKwkweDcwNjQsIDB4YTA3MiwgMHhhNDhlLCAweGE1OTIsIDB4YTY5NiwgMHhhNzlhLCAweGEwOWYsIDB4NGZmMiwKKwkweDAwMGUsIDB4YTBhMiwgMHgwODBjLCAweDExMmUsIDB4OTAwNiwgMHgwMDQ4LCAweDAwOWUsIDB4YTg5NywKKwkweDQwMDUsIDB4YTk5YSwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwgMHgyMDAxLCAweDAwMzAsIDB4MDBlZSwKKwkweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweGEwYTAsIDB4OTA0ZCwgMHgwOTBjLCAweDBkZmEsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTg5YywgMHhhMDZjLCAweDkwOGUsIDB4MDEwMCwgMHgwMTM4LCAweGE4N2IsIDB4MDAzMCwKKwkweGE4ODMsIDB4MDAwMCwgMHhhODk3LCAweDQwMDIsIDB4MDBkOCwgMHg3MDYwLCAweDkwMDUsIDB4MTE1OCwKKwkweDcxNTAsIDB4NzA1OCwgMHgyMGEwLCAweDkwMWUsIDB4NzA2NCwgMHgyMGU4LCAweGE0OGMsIDB4YTU5MCwKKwkweGE2OTQsIDB4YTc5OCwgMHgwNDI4LCAweGE4N2IsIDB4MDAwMCwgMHhhODgzLCAweDAwMDAsIDB4YTg5NywKKwkweDQwMDAsIDB4NzI1NCwgMHg5MDBlLCAweDIwMDEsIDB4MDAwMywgMHgwODBjLCAweDg0ZmYsIDB4YWE5YSwKKwkweDcxNWMsIDB4ODFmZiwgMHgwOTBjLCAweDBkZmEsIDB4MjE0OCwgMHgwODBjLCAweDEwNjMsIDB4NzA1ZiwKKwkweDAwMDAsIDB4YTBhMCwgMHgyMDQ4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NmFlOSwKKwkweDAxMmUsIDB4YTA5ZiwgMHgwMDAwLCAweGEwYTMsIDB4MDAwMCwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwKKwkweDkxZDgsIDB4MTAwMCwgMHgyYjVjLCAweDhiZmYsIDB4MDE3OCwgMHgwODBjLCAweDY3YzMsIDB4MDExOCwKKwkweDA4MGMsIDB4NjdjYiwgMHgxMTQ4LCAweGI4MTQsIDB4MjBhOSwgMHgwMDAxLCAweDQwMDQsIDB4YjgxMCwKKwkweDQwMDQsIDB4NDEwNCwgMHg5Mzk4LCAweDAwMDMsIDB4ODEwOCwgMHg5MTgyLCAweDA4MDAsIDB4MDEyMCwKKwkweDkzODYsIDB4MDAzYywgMHgwNTE4LCAweDBjMjAsIDB4ODNmZiwgMHgxMWYwLCAweDcxNTQsIDB4ODEwYywKKwkweGE5OWEsIDB4YTg5NywgMHg0MDAwLCAweDcxNWMsIDB4ODFmZiwgMHgwOTBjLCAweDBkZmEsIDB4MjE0OCwKKwkweDA4MGMsIDB4MTA2MywgMHg5MDA2LCAweDcwNWUsIDB4OTE4ZCwgMHgwMDAxLCAweDIwMDgsIDB4YTBhMCwKKwkweDIwNDgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2YWU5LCAweDAxMmUsIDB4YTA5ZiwKKwkweDAwMDAsIDB4YTBhMywgMHgwMDAwLCAweDAwNzAsIDB4NzA2MywgMHgwMDAxLCAweDcxNTIsIDB4NzA1NCwKKwkweDkzMDAsIDB4NzA1NiwgMHhhMzdhLCAweGE0OGUsIDB4YTU5MiwgMHhhNjk2LCAweGE3OWEsIDB4MDgwYywKKwkweDExMmUsIDB4OTAwNiwgMHgwMGVlLCAweDAwMDUsIDB4MDA5NiwgMHhhODhjLCAweDkwYmUsIDB4NzAwMCwKKwkweDAxNDgsIDB4OTBiZSwgMHg3MTAwLCAweDAxMzAsIDB4OTBiZSwgMHg3MjAwLCAweDAxMTgsIDB4MDA5ZSwKKwkweDA4MDQsIDB4MzUxZCwgMHhhODg0LCAweGE5ODgsIDB4MDgwYywgMHgyNzZlLCAweDE1MTgsIDB4MDgwYywKKwkweDY0M2YsIDB4MTUwMCwgMHg3MTI2LCAweGJlMTIsIDB4YmQxNiwgMHhhZTdjLCAweDA4MGMsIDB4NGFiZiwKKwkweDAxYzgsIDB4MDgwYywgMHg0YWJmLCAweDAxYjAsIDB4MDA5ZSwgMHhhODY3LCAweDAwMDAsIDB4YTg2OCwKKwkweGMwZmQsIDB4YTg2YSwgMHhhODIzLCAweDAwMDAsIDB4YTgwNCwgMHgyMDQ4LCAweDA4MGMsIDB4YmZlMywKKwkweDExMjAsIDB4MjAwOSwgMHgwMDAzLCAweDA4MDQsIDB4MzUxYSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwKKwkweDUwYmYsIDB4MDAwNSwgMHgwMDllLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDM1MWEsIDB4NzEyNCwKKwkweDA4MGMsIDB4MzI4NiwgMHhhODIwLCAweDkwODYsIDB4ODAwMSwgMHgxMTIwLCAweDIwMDksIDB4MDAwNCwKKwkweDA4MDQsIDB4MzUxYSwgMHgyOTAwLCAweDcwMjIsIDB4YTgwNCwgMHgwMDk2LCAweDIwNDgsIDB4ODkwNiwKKwkweDgwMDYsIDB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwgMHhmZmMwLCAweDAwOWUsIDB4OTA4MCwKKwkweDAwMDIsIDB4MDA3NiwgMHgwMDA2LCAweDIwOTgsIDB4MjBhMCwgMHgyN2UwLCAweDI3ZTgsIDB4MjBhOSwKKwkweDAwMmEsIDB4MDgwYywgMHgwZmFlLCAweGFhNmMsIDB4YWI3MCwgMHhhYzc0LCAweGFkNzgsIDB4MjA2MSwKKwkweDE4YjYsIDB4MmM0NCwgMHhhMDZiLCAweDAwMDAsIDB4YWU2NCwgMHhhZjhjLCAweDk3YzYsIDB4NzAwMCwKKwkweDAxMTgsIDB4OTdjNiwgMHg3MTAwLCAweDExNDgsIDB4OTZjMiwgMHgwMDA0LCAweDA2MDAsIDB4MjAwOSwKKwkweDAwMDQsIDB4MDAwZSwgMHgwMDdlLCAweDA4MDQsIDB4NGIwYiwgMHg5N2M2LCAweDcyMDAsIDB4MTFiOCwKKwkweDk2YzIsIDB4MDA1NCwgMHgwMmEwLCAweDAwMGUsIDB4MDA3ZSwgMHgyMDYxLCAweDE4YjYsIDB4MmM0NCwKKwkweGEwNzYsIDB4YTc3MiwgMHhhMDdiLCAweDAwMmEsIDB4YTI4ZSwgMHhhMzkyLCAweGE0OTYsIDB4YTU5YSwKKwkweDA4MGMsIDB4MTEyZSwgMHg3MDA3LCAweDAwMDIsIDB4NzAxZiwgMHg1MTFiLCAweDAwMDUsIDB4MDAwZSwKKwkweDAwN2UsIDB4MDgwNCwgMHgzNTFkLCAweDcwMjAsIDB4MjA0OCwgMHhhODA0LCAweDIwNDgsIDB4YTgwNCwKKwkweDIwNDgsIDB4ODkwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTBiYywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwKKwkweDkwODAsIDB4MDAwMiwgMHgyMDk4LCAweDIwYTAsIDB4MjdlMCwgMHgyN2U4LCAweDIwYTksIDB4MDAyYSwKKwkweDA4MGMsIDB4MGZhZSwgMHgyMTAwLCAweDIyMzgsIDB4MjA2MSwgMHgxOGI2LCAweDJjNDQsIDB4YTI4YywKKwkweGEzOTAsIDB4YTQ5NCwgMHhhNTk4LCAweDIwMDksIDB4MDAyYSwgMHgwODA0LCAweDRiMGIsIDB4ODFmZiwKKwkweDE5MDQsIDB4MzUxYSwgMHg3OThjLCAweDIwMDEsIDB4MTk1NiwgMHg5MThjLCAweDgwMDAsIDB4MjEwMiwKKwkweDA4MGMsIDB4NGFkNiwgMHgwOTA0LCAweDM1MWQsIDB4MDgwYywgMHg2N2MzLCAweDAxMjAsIDB4MDgwYywKKwkweDY3Y2IsIDB4MTkwNCwgMHgzNTFkLCAweDA4MGMsIDB4NjU2NiwgMHgwOTA0LCAweDM1MWEsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDY2MmMsIDB4MDEyZSwgMHgwOTA0LCAweDM1MWEsIDB4MjAwMSwKKwkweDE5NTYsIDB4MjAwNCwgMHhkMGZjLCAweDE5MDQsIDB4MzRlOCwgMHgwODA0LCAweDQ1MzMsIDB4YTlhMCwKKwkweDIwMDEsIDB4MTk1NiwgMHg5MThjLCAweDgwMDAsIDB4YzE4ZCwgMHgyMTAyLCAweDA4MGMsIDB4NGFlMywKKwkweDAxYTAsIDB4MDgwYywgMHg2N2MzLCAweDAxMTgsIDB4MDgwYywgMHg2N2NiLCAweDExNzAsIDB4MDgwYywKKwkweDY1NjYsIDB4MjAwOSwgMHgwMDAyLCAweDAxMjgsIDB4MDgwYywgMHg2NjJjLCAweDExNzAsIDB4MjAwOSwKKwkweDAwMDMsIDB4YTg5NywgMHg0MDA1LCAweGE5OWEsIDB4MDAxMCwgMHhhODk3LCAweDQwMDYsIDB4OTAwZSwKKwkweDkwODUsIDB4MDAwMSwgMHgyMDAxLCAweDAwMzAsIDB4MDAwNSwgMHhhODk3LCAweDQwMDAsIDB4MjAwMSwKKwkweDE5NTYsIDB4MjAwNCwgMHhkMGZjLCAweDExMjgsIDB4MDgwYywgMHg1NWUzLCAweDAxMTAsIDB4OTAwNiwKKwkweDAwMTgsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwgMHgwMDAwLCAweDAwMDUsIDB4NzhhOCwKKwkweGQwOGMsIDB4MTExOCwgMHhkMDg0LCAweDA5MDQsIDB4NDRhOCwgMHgwODBjLCAweDRhZjIsIDB4MDkwNCwKKwkweDM1MWQsIDB4MDgwYywgMHg0YWJmLCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzUxYSwKKwkweDA4MGMsIDB4NjdjMywgMHgwMTMwLCAweDkwOGUsIDB4MDAwNCwgMHgwMTE4LCAweDkwOGUsIDB4MDAwNSwKKwkweDE1YTAsIDB4NzhhOCwgMHhkMDhjLCAweDAxMjAsIDB4YjgwMCwgMHhjMDhjLCAweGI4MDIsIDB4MDAyOCwKKwkweDA4MGMsIDB4NTVkYiwgMHhkMGI0LCAweDA5MDQsIDB4NDRlMiwgMHg3ODg0LCAweDkwOGUsIDB4MDA3ZSwKKwkweDA5MDQsIDB4NDRlMiwgMHg5MDhlLCAweDAwN2YsIDB4MDkwNCwgMHg0NGUyLCAweDkwOGUsIDB4MDA4MCwKKwkweDA5MDQsIDB4NDRlMiwgMHhiODAwLCAweGQwOGMsIDB4MTkwNCwgMHg0NGUyLCAweGE4NjcsIDB4MDAwMCwKKwkweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweDA4MGMsIDB4YzAwMiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMywKKwkweDA4MDQsIDB4MzUxYSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwgMHg1MWU3LCAweDAwMDUsIDB4MDgwYywKKwkweDRhZjIsIDB4MDkwNCwgMHgzNTFkLCAweDA4MDQsIDB4NDRlMiwgMHgwODBjLCAweDMyZGYsIDB4MDEwOCwKKwkweDAwMDUsIDB4MjAwOSwgMHgxODMzLCAweDIxMGMsIDB4ODFmZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwMSwKKwkweDA4MDQsIDB4MzUxYSwgMHgwODBjLCAweDU1ZWYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDcsIDB4MDgwNCwKKwkweDM1MWEsIDB4MDgwYywgMHg2N2JiLCAweDAxMjAsIDB4MjAwOSwgMHgwMDA4LCAweDA4MDQsIDB4MzUxYSwKKwkweGI4OWMsIDB4ZDBhNCwgMHgxMTE4LCAweGQwYWMsIDB4MTkwNCwgMHg0NGUyLCAweDkwMDYsIDB4YTg2NiwKKwkweGE4MzIsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4MDgwYywgMHhjMDYxLCAweDExMjAsIDB4MjAwOSwKKwkweDAwMDMsIDB4MDgwNCwgMHgzNTFhLCAweDcwMDcsIDB4MDAwMywgMHg3MDFmLCAweDUyMjAsIDB4MDAwNSwKKwkweGE4MzAsIDB4OTA4NiwgMHgwMTAwLCAweDExMjAsIDB4MjAwOSwgMHgwMDA0LCAweDA4MDQsIDB4NTUyZiwKKwkweDA4MGMsIDB4NGFmMiwgMHgwOTA0LCAweDM1MWQsIDB4MDgwNCwgMHg1MWI5LCAweDgxZmYsIDB4MjAwOSwKKwkweDAwMDEsIDB4MTkwNCwgMHgzNTFhLCAweDA4MGMsIDB4NTVlZiwgMHgyMDA5LCAweDAwMDcsIDB4MTkwNCwKKwkweDM1MWEsIDB4MDgwYywgMHg2N2JiLCAweDAxMjAsIDB4MjAwOSwgMHgwMDA4LCAweDA4MDQsIDB4MzUxYSwKKwkweDA4MGMsIDB4NGFmMiwgMHgwOTA0LCAweDM1MWQsIDB4MDgwYywgMHg2N2MzLCAweDIwMDksIDB4MDAwOSwKKwkweDE5MDQsIDB4MzUxYSwgMHgwODBjLCAweDRhYmYsIDB4MjAwOSwgMHgwMDAyLCAweDA5MDQsIDB4MzUxYSwKKwkweDkwMDYsIDB4YTg2NiwgMHhhODMyLCAweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweDc5ODgsIDB4OTE5NCwKKwkweGZmMDAsIDB4OTE4YywgMHgwMGZmLCAweDkwMDYsIDB4ODJmZiwgMHgxMTI4LCAweGMwZWQsIDB4YTk1MiwKKwkweDc5OGMsIDB4YTk1NiwgMHgwMDM4LCAweDkyOGUsIDB4MDEwMCwgMHgxOTA0LCAweDM1MWQsIDB4YzBlNSwKKwkweGE5NTIsIDB4YTk1NiwgMHhhODNlLCAweDA4MGMsIDB4YzJiNCwgMHgyMDA5LCAweDAwMDMsIDB4MDkwNCwKKwkweDM1MWEsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NTI3NiwgMHgwMDA1LCAweGE4MzAsIDB4OTA4NiwKKwkweDAxMDAsIDB4MjAwOSwgMHgwMDA0LCAweDA5MDQsIDB4MzUxYSwgMHgwODA0LCAweDM0ZTgsIDB4N2FhOCwKKwkweDkyODQsIDB4YzAwMCwgMHgwMTQ4LCAweGQyZWMsIDB4MDFhMCwgMHgwODBjLCAweDU1ZWYsIDB4MTE4OCwKKwkweDIwMDksIDB4MDAxNCwgMHgwODA0LCAweDM1MWEsIDB4ZDJkYywgMHgxNTc4LCAweDgxZmYsIDB4MjAwOSwKKwkweDAwMDEsIDB4MTkwNCwgMHgzNTFhLCAweDA4MGMsIDB4NTVlZiwgMHgyMDA5LCAweDAwMDcsIDB4MTkwNCwKKwkweDM1MWEsIDB4ZDJmNCwgMHgwMTM4LCAweDkyODQsIDB4NTAwMCwgMHhjMGQ1LCAweDA4MGMsIDB4NTViNSwKKwkweDA4MDQsIDB4MzRlOCwgMHhkMmZjLCAweDAxNjAsIDB4MDgwYywgMHg0YWYyLCAweDA5MDQsIDB4MzUxZCwKKwkweDc5ODQsIDB4OTI4NCwgMHg5MDAwLCAweGMwZDUsIDB4MDgwYywgMHg1NThhLCAweDA4MDQsIDB4MzRlOCwKKwkweDA4MGMsIDB4NGFmMiwgMHgwOTA0LCAweDM1MWQsIDB4YjgwNCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwKKwkweDAwMDYsIDB4MjAwOSwgMHgwMDA5LCAweDE5MDQsIDB4NTM2NSwgMHgwODBjLCAweDRhYmYsIDB4MjAwOSwKKwkweDAwMDIsIDB4MDkwNCwgMHg1MzY1LCAweGE4NWMsIDB4OTA4MCwgMHgwMDFiLCAweGFmNjAsIDB4MjAwOSwKKwkweDAwMDgsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHgwODBjLCAweDRiMDgsIDB4NzAxZiwKKwkweDUyZDIsIDB4MDAwNSwgMHhhODZjLCAweDkwODYsIDB4MDUwMCwgMHgxMTM4LCAweGE4NzAsIDB4OTAwNSwKKwkweDExMjAsIDB4YTg3NCwgMHg5MDg0LCAweGZmMDAsIDB4MDExMCwgMHgxOTA0LCAweDM1MWQsIDB4YTg2NiwKKwkweGE4MzIsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4MDgwYywgMHg0YWYyLCAweDExMTAsIDB4MDgwNCwKKwkweDM1MWQsIDB4MjAwOSwgMHgwMDQzLCAweDA4MGMsIDB4YzMxYywgMHgyMDA5LCAweDAwMDMsIDB4MDkwNCwKKwkweDUzNjUsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NTJmNiwgMHgwMDA1LCAweGE4MzAsIDB4OTA4NiwKKwkweDAxMDAsIDB4MjAwOSwgMHgwMDA0LCAweDA5MDQsIDB4NTM2NSwgMHg3OTg0LCAweDdhYTgsIDB4OTI4NCwKKwkweDEwMDAsIDB4ZTA4NSwgMHgwODBjLCAweDU1OGEsIDB4MDgwNCwgMHgzNGU4LCAweDAwYzYsIDB4YWFiMCwKKwkweDkyODQsIDB4YzAwMCwgMHgwMTQ4LCAweGQyZWMsIDB4MDE3MCwgMHgwODBjLCAweDU1ZWYsIDB4MTE1OCwKKwkweDIwMDksIDB4MDAxNCwgMHgwODA0LCAweDUzNTQsIDB4MjA2MSwgMHgxODAwLCAweDA4MGMsIDB4NTVlZiwKKwkweDIwMDksIDB4MDAwNywgMHgxNWM4LCAweGQyZjQsIDB4MDEzMCwgMHg5Mjg0LCAweDUwMDAsIDB4YzBkNSwKKwkweDA4MGMsIDB4NTViNSwgMHgwMDU4LCAweGQyZmMsIDB4MDE4MCwgMHgwODBjLCAweDRhZjAsIDB4MDU5MCwKKwkweGE5OTgsIDB4OTI4NCwgMHg5MDAwLCAweGMwZDUsIDB4MDgwYywgMHg1NThhLCAweGE4N2IsIDB4MDAwMCwKKwkweGE4ODMsIDB4MDAwMCwgMHhhODk3LCAweDQwMDAsIDB4MDQzOCwgMHgwODBjLCAweDRhZjAsIDB4MDUxMCwKKwkweDA4MGMsIDB4NjdjMywgMHgyMDA5LCAweDAwMDksIDB4MTFiOCwgMHhhOGM0LCAweDkwODYsIDB4MDUwMCwKKwkweDExYzgsIDB4YThjOCwgMHg5MDA1LCAweDExYjAsIDB4YThjYywgMHg5MDg0LCAweGZmMDAsIDB4MTE5MCwKKwkweDA4MGMsIDB4NGFmMCwgMHgxMTA4LCAweDAwNzAsIDB4MjAwOSwgMHgwMDRiLCAweDA4MGMsIDB4YzMxYywKKwkweDIwMDksIDB4MDAwMywgMHgwMTA4LCAweDAwNzgsIDB4MDQzMSwgMHgxOWMwLCAweGE4OTcsIDB4NDAwNSwKKwkweGE5OWEsIDB4MDAxMCwgMHhhODk3LCAweDQwMDYsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwKKwkweDAwMzAsIDB4MDBjZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNlMCwgMHg3YWE4LCAweGQyZGMsIDB4MDkwNCwKKwkweDM1MWEsIDB4MDAxNiwgMHg3OTg0LCAweDkyODQsIDB4MTAwMCwgMHhjMGZkLCAweDA4MGMsIDB4NTU4YSwKKwkweDAwMWUsIDB4MTkwNCwgMHgzNTFhLCAweDA4MDQsIDB4MzRlOCwgMHgwMGY2LCAweDJkNzgsIDB4YWFiMCwKKwkweDAwMjEsIDB4MDBmZSwgMHgwMDA1LCAweGFhYjAsIDB4YzJkNSwgMHhkMmRjLCAweDAxNTAsIDB4MDAxNiwKKwkweGE5OTgsIDB4OTI4NCwgMHgxNDAwLCAweGMwZmQsIDB4MDgwYywgMHg1NThhLCAweDAwMWUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAwNSwgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MDQsIDB4MzUxYSwKKwkweDA4MGMsIDB4NTVlZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwNywgMHgwODA0LCAweDM1MWEsIDB4Nzk4NCwKKwkweDdlYTgsIDB4OTZiNCwgMHgwMGZmLCAweDA4MGMsIDB4NjQ5ZiwgMHgxOTA0LCAweDM1MWQsIDB4OTE4NiwKKwkweDAwN2YsIDB4MDEzOCwgMHgwODBjLCAweDY3YzMsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDksIDB4MDgwNCwKKwkweDM1MWEsIDB4MDgwYywgMHg0YWJmLCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzUxYSwKKwkweGE4NjcsIDB4MDAwMCwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHgyMDAxLCAweDAxMDAsIDB4ODAwNywKKwkweGE4MGEsIDB4MDgwYywgMHhjMDFjLCAweDExMjAsIDB4MjAwOSwgMHgwMDAzLCAweDA4MDQsIDB4MzUxYSwKKwkweDcwMDcsIDB4MDAwMywgMHg3MDFmLCAweDUzYzUsIDB4MDAwNSwgMHhhODA4LCAweDgwMDcsIDB4OTA4NiwKKwkweDAxMDAsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDQsIDB4MDgwNCwgMHgzNTFhLCAweGE4ZTAsIDB4YTg2NiwKKwkweGE4MTAsIDB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4ODAwYywgMHhhODE0LCAweDgwMDcsIDB4OTA4NCwKKwkweDAwZmYsIDB4ODAwNCwgMHg5MDgwLCAweDAwMDIsIDB4OTEwOCwgMHg4OTA2LCAweDgwMDYsIDB4ODAwNywKKwkweDkwYmMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDA0LCAweDdhOGMsIDB4N2I4OCwKKwkweDdjOWMsIDB4N2Q5OCwgMHgwODA0LCAweDRiMGIsIDB4MDgwYywgMHg0YWJmLCAweDExMjAsIDB4MjAwOSwKKwkweDAwMDIsIDB4MDgwNCwgMHgzNTFhLCAweDc5ODQsIDB4OTE5NCwgMHhmZjAwLCAweDkxOGMsIDB4MDBmZiwKKwkweDgyMTcsIDB4ODJmZiwgMHgxMTE4LCAweDcwMjMsIDB4MTk4YiwgMHgwMDQwLCAweDkyYzYsIDB4MDAwMSwKKwkweDExMTgsIDB4NzAyMywgMHgxOWE1LCAweDAwMTAsIDB4MDgwNCwgMHgzNTFkLCAweDIwMDksIDB4MDAxYSwKKwkweDdhOGMsIDB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4YWY2MCwKKwkweDA4MGMsIDB4NGIwOCwgMHg3MDFmLCAweDU0MTUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MmQsIDB4MjAwMywKKwkweDAwMDEsIDB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4MjA5OCwgMHhhODYwLCAweDIwZTAsIDB4MjBhOSwKKwkweDAwMWEsIDB4NzAyMCwgMHgyMGEwLCAweDIwZTksIDB4MDAwMSwgMHg0MDAzLCAweDA4MDQsIDB4MzRlOCwKKwkweDA4MGMsIDB4NGFiZiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDM1MWEsIDB4Nzk4NCwKKwkweDkxOTQsIDB4ZmYwMCwgMHg5MThjLCAweDAwZmYsIDB4ODIxNywgMHg4MmZmLCAweDExMTgsIDB4MjA5OSwKKwkweDE5OGIsIDB4MDA0MCwgMHg5MmM2LCAweDAwMDEsIDB4MTExOCwgMHgyMDk5LCAweDE5YTUsIDB4MDAxMCwKKwkweDA4MDQsIDB4MzUxZCwgMHhhODVjLCAweDkwODAsIDB4MDAxOSwgMHgyMGEwLCAweGE4NjAsIDB4MjBlOCwKKwkweDIwYTksIDB4MDAxYSwgMHgyMGUxLCAweDAwMDEsIDB4NDAwMywgMHgyMDA5LCAweDAwMWEsIDB4N2E4YywKKwkweDdiODgsIDB4N2M5YywgMHg3ZDk4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDE5LCAweGFmNjAsIDB4MDgwNCwKKwkweDRiMGIsIDB4Nzg4NCwgMHg5MDhhLCAweDEwMDAsIDB4MWEwNCwgMHgzNTFkLCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4OTEwOCwgMHgwMGM2LCAweDIwNjEsIDB4MTlkMiwKKwkweDYxNDIsIDB4MDBjZSwgMHgwMTJlLCAweDA4MDQsIDB4MzRlOCwgMHgwMGM2LCAweDA4MGMsIDB4NzIwNywKKwkweDExNjAsIDB4MDgwYywgMHg3NTA0LCAweDA4MGMsIDB4NWYyYiwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywKKwkweDcyNGUsIDB4MDgwYywgMHg3MTI3LCAweDA4MGMsIDB4MGRmYSwgMHgyMDYxLCAweDE4MDAsIDB4NjAzMCwKKwkweGMwOWQsIDB4NjAzMiwgMHgwODBjLCAweDVkZWEsIDB4MDBjZSwgMHgwMDA1LCAweDAwYzYsIDB4MjAwMSwKKwkweDE4MDAsIDB4MjAwNCwgMHg5MDhlLCAweDAwMDAsIDB4MDkwNCwgMHgzNTFhLCAweDc4ODQsIDB4OTAwNSwKKwkweDAxODgsIDB4Nzg4OCwgMHgyMDYxLCAweDE5NzQsIDB4MmMwYywgMHgyMDYyLCAweDA4MGMsIDB4MmI5OCwKKwkweDAxYTAsIDB4MDgwYywgMHgyYmEwLCAweDAxODgsIDB4MDgwYywgMHgyYmE4LCAweDAxNzAsIDB4MjE2MiwKKwkweDA4MDQsIDB4MzUxZCwgMHgyMDYxLCAweDAxMDAsIDB4NjAzOCwgMHg5MDg2LCAweDAwMDcsIDB4MTExOCwKKwkweDIwMDksIDB4MDAwMSwgMHgwMDEwLCAweDIwMDksIDB4MDAwMCwgMHg3ODg0LCAweDkwODYsIDB4MDAwMiwKKwkweDE1NjgsIDB4MjA2MSwgMHgwMTAwLCAweDYwMjgsIDB4YzA5YywgMHg2MDJhLCAweDAwMjYsIDB4MjAxMSwKKwkweDAwMDMsIDB4MDgwYywgMHg5YTBmLCAweDIwMTEsIDB4MDAwMiwgMHgwODBjLCAweDlhMTksIDB4MDAyZSwKKwkweDA4MGMsIDB4OTkyNywgMHgwMDM2LCAweDkwMWUsIDB4MDgwYywgMHg5OTlkLCAweDAwM2UsIDB4NjBlMywKKwkweDAwMDAsIDB4MDgwYywgMHhkYzEzLCAweDA4MGMsIDB4ZGMyZSwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywKKwkweDcyNGUsIDB4OTAwNiwgMHgwODBjLCAweDJjODgsIDB4MjAwMSwgMHgxODAwLCAweDIwMDMsIDB4MDAwNCwKKwkweDIwMDEsIDB4MTk3ZiwgMHgyMDAzLCAweDAwMDAsIDB4NjAyNywgMHgwMDA4LCAweDAwY2UsIDB4MDgwNCwKKwkweDM0ZTgsIDB4ODFmZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwMSwgMHgwODA0LCAweDM1MWEsIDB4MDgwYywKKwkweDU1ZWYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDcsIDB4MDgwNCwgMHgzNTFhLCAweDc5ODQsIDB4N2VhOCwKKwkweDk2YjQsIDB4MDBmZiwgMHgwODBjLCAweDY0OWYsIDB4MTkwNCwgMHgzNTFkLCAweDkxODYsIDB4MDA3ZiwKKwkweDAxMzgsIDB4MDgwYywgMHg2N2MzLCAweDAxMjAsIDB4MjAwOSwgMHgwMDA5LCAweDA4MDQsIDB4MzUxYSwKKwkweDA4MGMsIDB4NGFiZiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDM1MWEsIDB4YTg2NywKKwkweDAwMDAsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4MDgwYywgMHhjMDFmLCAweDExMjAsIDB4MjAwOSwKKwkweDAwMDMsIDB4MDgwNCwgMHgzNTFhLCAweDcwMDcsIDB4MDAwMywgMHg3MDFmLCAweDU1MTgsIDB4MDAwNSwKKwkweGE4MzAsIDB4OTA4NiwgMHgwMTAwLCAweDExMjAsIDB4MjAwOSwgMHgwMDA0LCAweDA4MDQsIDB4MzUxYSwKKwkweGE4ZTAsIDB4YTg2NiwgMHhhODM0LCAweDgwMDcsIDB4ODAwYywgMHhhODVjLCAweDkwODAsIDB4MDAwYywKKwkweDdhOGMsIDB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4YWY2MCwgMHgwODA0LCAweDRiMGIsIDB4YTg5OCwKKwkweDkwODYsIDB4MDAwZCwgMHgxOTA0LCAweDM1MWEsIDB4MjAyMSwgMHg0MDA1LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MGUwNCwgMHg1NTNjLCAweDAwMTAsIDB4MDEyZSwgMHgwY2MwLCAweDdjMzYsIDB4OTQ4NiwKKwkweDQwMDAsIDB4MDExOCwgMHg3ODMzLCAweDAwMTEsIDB4MDAxMCwgMHg3ODMzLCAweDAwMTAsIDB4Nzg4MywKKwkweDQwMDUsIDB4YTk5OCwgMHg3OTg2LCAweGE5YTQsIDB4Nzk5YSwgMHhhOWE4LCAweDc5OWUsIDB4MDgwYywKKwkweDRhZmIsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywKKwkweDExZTAsIDB4NzAwNywgMHgwMDAxLCAweDIwOTEsIDB4NTAwMCwgMHg3MDBmLCAweDAwMDAsIDB4MDEyZSwKKwkweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDBjNiwgMHgyMDYxLCAweDE5ZDIsIDB4Nzk4NCwKKwkweDYxNTIsIDB4NjE0ZSwgMHg2MDU3LCAweDAwMDAsIDB4NjA0YiwgMHgwMDA5LCAweDc4OTgsIDB4NjA2YSwKKwkweDc4OWMsIDB4NjA2NiwgMHg3ODg4LCAweDYwNjIsIDB4Nzg4YywgMHg2MDVlLCAweDIwMDEsIDB4MTllMCwKKwkweDIwNDQsIDB4MjAwMSwgMHgxOWU3LCAweGEwNzYsIDB4YTA2MCwgMHhhMDcyLCAweGEwN2IsIDB4MDAwMSwKKwkweGEwN2YsIDB4MDAwMiwgMHhhMDZiLCAweDAwMDAsIDB4YTA5ZiwgMHgwMDAwLCAweDAwY2UsIDB4MDEyZSwKKwkweDA4MDQsIDB4MzRlOCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGI2LCAweDAwYzYsIDB4OTBlNCwKKwkweGMwMDAsIDB4MDE2OCwgMHgwMDA2LCAweGQwZDQsIDB4MDEzMCwgMHgwMDM2LCAweDIwMTksIDB4MDAyOSwKKwkweDA4MGMsIDB4MzJhNCwgMHgwMDNlLCAweDA4MGMsIDB4YmU4NCwgMHgwMDBlLCAweDExOTgsIDB4ZDBlNCwKKwkweDAxNjAsIDB4OTE4MCwgMHgxMDAwLCAweDIwMDQsIDB4OTA1ZCwgMHgwMTYwLCAweDA4MGMsIDB4NWY0NSwKKwkweDA4MGMsIDB4YTA2MiwgMHgwMTEwLCAweGI4MTcsIDB4MDAwMCwgMHg5MDA2LCAweDAwY2UsIDB4MDBiZSwKKwkweDAxMmUsIDB4MDAwNSwgMHg5MDg1LCAweDAwMDEsIDB4MGNjOCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDAxNTYsIDB4MjAxMCwgMHg5MDBlLCAweDIwYTksIDB4MDgwMCwgMHgwMDE2LCAweDkxODAsIDB4MTAwMCwKKwkweDIwMDQsIDB4OTAwNSwgMHgwMTg4LCAweDkxODYsIDB4MDA3ZSwgMHgwMTcwLCAweDkxODYsIDB4MDA3ZiwKKwkweDAxNTgsIDB4OTE4NiwgMHgwMDgwLCAweDAxNDAsIDB4OTE4NiwgMHgwMGZmLCAweDAxMjgsIDB4MDAyNiwKKwkweDIyMDAsIDB4MDgwYywgMHg1NThhLCAweDAwMmUsIDB4MDAxZSwgMHg4MTA4LCAweDFmMDQsIDB4NTViZCwKKwkweDAxNWUsIDB4MDEyZSwgMHgwMDA1LCAweDIwMDEsIDB4MTg1YywgMHgyMDA0LCAweDAwMDUsIDB4MjAwMSwKKwkweDE4N2IsIDB4MjAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHgxODEwLCAweDIwMDQsIDB4ZDBkNCwKKwkweDAwMGUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MGUsIDB4MjAwNCwgMHhkMGI0LCAweDAwMDUsIDB4MjAwMSwKKwkweDE4MDAsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDMsIDB4MDAwNSwgMHgwMDE2LCAweDAwZTYsIDB4MjA3MSwKKwkweDE4OWMsIDB4NzEwOCwgMHg5MTBkLCAweDcxMGEsIDB4MDBlZSwgMHgwMDFlLCAweDAwMDUsIDB4NzlhNCwKKwkweDkxODIsIDB4MDA4MSwgMHgxYTA0LCAweDM1MWQsIDB4ODEwYywgMHgwMDE2LCAweDA4MGMsIDB4NGFiZiwKKwkweDAxNzAsIDB4MDgwYywgMHgwZjM5LCAweDIxMDAsIDB4MjIzOCwgMHg3ZDg0LCAweDdjODgsIDB4N2I4YywKKwkweDdhOTAsIDB4MDAxZSwgMHgwODBjLCAweDRiMDgsIDB4NzAxZiwgMHg1NjFiLCAweDAwMDUsIDB4MjAwOSwKKwkweDAwMDIsIDB4MDgwNCwgMHgzNTFhLCAweDIwNzksIDB4MDAwMCwgMHg3ZDk0LCAweDdjOTgsIDB4N2JhOCwKKwkweDdhYWMsIDB4NzlhNCwgMHg4MTBjLCAweDIwNjEsIDB4MThiNiwgMHgyYzQ0LCAweGE3NzAsIDB4YTA3NCwKKwkweDIwNzEsIDB4MTg5YywgMHgwODBjLCAweDRiMGIsIDB4NzAxZiwgMHg1NjJmLCAweDAwMDUsIDB4MjA2MSwKKwkweDE4YjYsIDB4MmM0NCwgMHgwMDE2LCAweDAwMjYsIDB4YTI3MCwgMHhhMTc0LCAweDA4MGMsIDB4MGY0MSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwODBjLCAweDBmZWUsIDB4OTAwNiwgMHhhODAyLCAweGE4MDYsIDB4MDgwNCwKKwkweDM0ZTgsIDB4MDEyNiwgMHgwMTU2LCAweDAxMzYsIDB4MDE0NiwgMHgwMWM2LCAweDAxZDYsIDB4MDBjNiwKKwkweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAyMDAsIDB4MjA3MSwKKwkweDE4MDAsIDB4NjA0NCwgMHhkMGE0LCAweDExZTgsIDB4ZDA4NCwgMHgwMTE4LCAweDA4MGMsIDB4NTdlYSwKKwkweDAwNjgsIDB4ZDA4YywgMHgwMTE4LCAweDA4MGMsIDB4NTZmMywgMHgwMDQwLCAweGQwOTQsIDB4MDExOCwKKwkweDA4MGMsIDB4NTZjMywgMHgwMDE4LCAweGQwOWMsIDB4MDEwOCwgMHgwMDk5LCAweDAwZmUsIDB4MDBlZSwKKwkweDAwZGUsIDB4MDBjZSwgMHgwMWRlLCAweDAxY2UsIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsIDB4MDEyZSwKKwkweDAwMDUsIDB4MDAxNiwgMHg2MTI4LCAweGQxOWMsIDB4MTExMCwgMHhjMTlkLCAweDYxMmEsIDB4MDAxZSwKKwkweDBjNjgsIDB4MDAwNiwgMHg3MDk0LCAweDkwMDUsIDB4MDAwZSwgMHgwMTIwLCAweDcwOTcsIDB4MDAwMCwKKwkweDcwOGYsIDB4MDAwMCwgMHg2MjRjLCAweDkyODYsIDB4ZjBmMCwgMHgxMTUwLCAweDYwNDgsIDB4OTA4NiwKKwkweGYwZjAsIDB4MDEzMCwgMHg2MjRhLCAweDYwNDMsIDB4MDA5MCwgMHg2MDQzLCAweDAwMTAsIDB4MDQ5MCwKKwkweDkyOTQsIDB4ZmYwMCwgMHg5Mjk2LCAweGY3MDAsIDB4MDE3OCwgMHg3MTM4LCAweGQxYTQsIDB4MTE2MCwKKwkweDYyNDAsIDB4OTI5NSwgMHgwMTAwLCAweDYyNDIsIDB4OTI5NCwgMHgwMDEwLCAweDAxMjgsIDB4MjAwOSwKKwkweDAwZjcsIDB4MDgwYywgMHg1ZWE3LCAweDAwZjAsIDB4NjA0MCwgMHg5MDg0LCAweDAwMTAsIDB4OTA4NSwKKwkweDAxNDAsIDB4NjA0MiwgMHg2MDQzLCAweDAwMDAsIDB4NzA4MywgMHgwMDAwLCAweDcwOWYsIDB4MDAwMSwKKwkweDcwYzMsIDB4MDAwMCwgMHg3MGRiLCAweDAwMDAsIDB4MjAwOSwgMHgxYzgwLCAweDIwMGIsIDB4MDAwMCwKKwkweDcwOTMsIDB4MDAwMCwgMHg3MDg3LCAweDAwMGYsIDB4MjAwOSwgMHgwMDBmLCAweDIwMTEsIDB4NWQ4ZCwKKwkweDA4MGMsIDB4ODM2YywgMHgwMDA1LCAweDIwMDEsIDB4MTg3ZCwgMHgyMDA0LCAweGQwOGMsIDB4MDExMCwKKwkweDcwNWIsIDB4ZmZmZiwgMHg3MDg0LCAweDkwMDUsIDB4MTUyOCwgMHgyMDExLCAweDVkOGQsIDB4MDgwYywKKwkweDgyZGEsIDB4NjA0MCwgMHg5MDk0LCAweDAwMTAsIDB4OTI4NSwgMHgwMDIwLCAweDYwNDIsIDB4MjBhOSwKKwkweDAwYzgsIDB4NjA0NCwgMHhkMDhjLCAweDExNjgsIDB4MWYwNCwgMHg1NmQ5LCAweDYyNDIsIDB4NzA5NywKKwkweDAwMDAsIDB4NjA0MCwgMHg5MDk0LCAweDAwMTAsIDB4OTI4NSwgMHgwMDgwLCAweDYwNDIsIDB4NjI0MiwKKwkweDAwNDgsIDB4NjI0MiwgMHg3MDk3LCAweDAwMDAsIDB4NzA4YiwgMHgwMDAwLCAweDkwMDYsIDB4MDgwYywKKwkweDVmMzAsIDB4MDAwMCwgMHgwMDA1LCAweDcwODgsIDB4OTA4YSwgMHgwMDAzLCAweDFhMGMsIDB4MGRmYSwKKwkweDAwMGIsIDB4MDAwNSwgMHg1NmZkLCAweDU3NGUsIDB4NTdlOSwgMHgwMGY2LCAweDAwMTYsIDB4NjkwMCwKKwkweDkxOGMsIDB4MDgwMCwgMHg3MDhiLCAweDAwMDEsIDB4MjAwMSwgMHgwMTVkLCAweDIwMDMsIDB4MDAwMCwKKwkweDY4MDMsIDB4MDBmYywgMHgyMGE5LCAweDAwMDQsIDB4NjgwMCwgMHg5MDg0LCAweDAwZmMsIDB4MDEyMCwKKwkweDFmMDQsIDB4NTcwYywgMHgwODBjLCAweDBkZmEsIDB4NjhhMCwgMHg2OGEyLCAweDY4OWMsIDB4Njg5ZSwKKwkweDY4OTgsIDB4Njg5YSwgMHhhMDAxLCAweDkxOGQsIDB4MTYwMCwgMHg2OTAyLCAweDAwMWUsIDB4NjgzNywKKwkweDAwMjAsIDB4MDgwYywgMHg1ZjBjLCAweDIwNzksIDB4MWMwMCwgMHg3ODMzLCAweDExMDEsIDB4NzgzNywKKwkweDAwMDAsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksIDB4MTgwNSwgMHgyMGU5LCAweDAwMDEsIDB4MjBhMSwKKwkweDFjMGUsIDB4MjBhOSwgMHgwMDA0LCAweDQwMDMsIDB4MDgwYywgMHg5ZWViLCAweDIwZTEsIDB4MDAwMSwKKwkweDIwOTksIDB4MWMwMCwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMjQwLCAweDIwYTksIDB4MDAxNCwKKwkweDQwMDMsIDB4NjBjMywgMHgwMDBjLCAweDYwMGYsIDB4MDAwMCwgMHgwODBjLCAweDVkYmUsIDB4MDBmZSwKKwkweDkwMDYsIDB4NzA4ZSwgMHg2MDQzLCAweDAwMDgsIDB4NjA0MiwgMHgwMDA1LCAweDAwZjYsIDB4NzA4YywKKwkweDcwOGYsIDB4MDAwMCwgMHg5MDI1LCAweDA5MDQsIDB4NTdjNiwgMHg2MDIwLCAweGQwYjQsIDB4MTkwNCwKKwkweDU3YzQsIDB4NzE5YywgMHg4MWZmLCAweDA5MDQsIDB4NTdiMiwgMHg5NDg2LCAweDAwMGMsIDB4MTkwNCwKKwkweDU3YmYsIDB4OTQ4MCwgMHgwMDE4LCAweDgwMDQsIDB4MjBhOCwgMHgwODBjLCAweDVmMDUsIDB4MjAxMSwKKwkweDAyNjAsIDB4MjAxOSwgMHgxYzAwLCAweDIyMGMsIDB4MjMwNCwgMHg5MTA2LCAweDExZTgsIDB4ODIxMCwKKwkweDgzMTgsIDB4MWYwNCwgMHg1NzZiLCAweDYwNDMsIDB4MDAwNCwgMHgyMDYxLCAweDAxNDAsIDB4NjA1YiwKKwkweGJjOTQsIDB4NjA1ZiwgMHhmMGYwLCAweDIwNjEsIDB4MDEwMCwgMHg2MDQzLCAweDAwMDYsIDB4NzA4YiwKKwkweDAwMDIsIDB4NzA5NywgMHgwMDAyLCAweDIwMDksIDB4MDdkMCwgMHgyMDExLCAweDVkOTQsIDB4MDgwYywKKwkweDgzNmMsIDB4MDgwYywgMHg1ZjBjLCAweDA0YzAsIDB4MDgwYywgMHg1ZjA1LCAweDIwNzksIDB4MDI2MCwKKwkweDc5MzAsIDB4OTE4ZSwgMHgxMTAxLCAweDE1NTgsIDB4NzgzNCwgMHg5MDA1LCAweDE1NDAsIDB4NzkwMCwKKwkweDkxOGMsIDB4MDBmZiwgMHgxMTE4LCAweDc4MDQsIDB4OTAwNSwgMHgwMTkwLCAweDA4MGMsIDB4NWYwNSwKKwkweDIwMTEsIDB4MDI2ZSwgMHgyMDE5LCAweDE4MDUsIDB4MjBhOSwgMHgwMDA0LCAweDIyMGMsIDB4MjMwNCwKKwkweDkxMDIsIDB4MDIzMCwgMHgxMWEwLCAweDgyMTAsIDB4ODMxOCwgMHgxZjA0LCAweDU3YTYsIDB4MDA3OCwKKwkweDcwOWYsIDB4MDAwMCwgMHgwODBjLCAweDVmMDUsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDI2MCwKKwkweDIwZTksIDB4MDAwMSwgMHgyMGExLCAweDFjMDAsIDB4MjBhOSwgMHgwMDE0LCAweDQwMDMsIDB4NjA0MywKKwkweDAwMDgsIDB4NjA0MywgMHgwMDAwLCAweDAwMTAsIDB4MDBmZSwgMHgwMDA1LCAweDYwNDAsIDB4OTA4NSwKKwkweDAxMDAsIDB4NjA0MiwgMHg2MDIwLCAweGQwYjQsIDB4MWRiOCwgMHgwODBjLCAweDllZWIsIDB4MjBlMSwKKwkweDAwMDEsIDB4MjA5OSwgMHgxYzAwLCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNDAsIDB4MjBhOSwKKwkweDAwMTQsIDB4NDAwMywgMHg2MGMzLCAweDAwMGMsIDB4MjAxMSwgMHgxOWM5LCAweDIwMTMsIDB4MDAwMCwKKwkweDcwOGYsIDB4MDAwMCwgMHg2MGEzLCAweDAwNTYsIDB4NjBhNywgMHg5NTc1LCAweDA4MGMsIDB4OTY0ZCwKKwkweDA4ZDgsIDB4MDAwNSwgMHg3MDk0LCAweDkwOGEsIDB4MDAxZCwgMHgxYTBjLCAweDBkZmEsIDB4MDAwYiwKKwkweDAwMDUsIDB4NTgxYiwgMHg1ODJlLCAweDU4NTcsIDB4NTg3NywgMHg1ODlkLCAweDU4Y2MsIDB4NThmMiwKKwkweDU5MmEsIDB4NTk1MCwgMHg1OTdlLCAweDU5YjksIDB4NTlmMSwgMHg1YTBmLCAweDVhM2EsIDB4NWE1YywKKwkweDVhNzcsIDB4NWE4MSwgMHg1YWI1LCAweDVhZGIsIDB4NWIwYSwgMHg1YjMwLCAweDViNjgsIDB4NWJhYywKKwkweDViZTksIDB4NWMwYSwgMHg1YzYzLCAweDVjODUsIDB4NWNiMywgMHg1Y2IzLCAweDAwYzYsIDB4MjA2MSwKKwkweDE4MDAsIDB4NjAwMywgMHgwMDA3LCAweDIwNjEsIDB4MDEwMCwgMHg2MDA0LCAweDkwODQsIDB4ZmZmOSwKKwkweDYwMDYsIDB4MDBjZSwgMHgwMDA1LCAweDIwNjEsIDB4MDE0MCwgMHg2MDViLCAweGJjOTQsIDB4NjA1ZiwKKwkweGYwZjAsIDB4MjA2MSwgMHgwMTAwLCAweDYwNDMsIDB4MDAwMiwgMHg3MDk3LCAweDAwMDEsIDB4MjAwOSwKKwkweDA3ZDAsIDB4MjAxMSwgMHg1ZDk0LCAweDA4MGMsIDB4ODM2YywgMHgwMDA1LCAweDAwZjYsIDB4NzA4YywKKwkweDkwODYsIDB4MDAxNCwgMHgxNTEwLCAweDYwNDIsIDB4NjAyMCwgMHhkMGI0LCAweDExZjAsIDB4MDgwYywKKwkweDVmMDUsIDB4MjA3OSwgMHgwMjYwLCAweDdhMzAsIDB4OTI5NiwgMHgxMTAyLCAweDExYTAsIDB4NzgzNCwKKwkweDkwMDUsIDB4MTE4OCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGMwLCAweDkwMDUsIDB4MTExMCwKKwkweDcwYzMsIDB4MDAwMSwgMHgyMDExLCAweDVkOTQsIDB4MDgwYywgMHg4MmRhLCAweDcwOTcsIDB4MDAxMCwKKwkweDA4MGMsIDB4NWE4MSwgMHgwMDEwLCAweDcwOGYsIDB4MDAwMCwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwKKwkweDcwOTcsIDB4MDAwMywgMHg2MDQzLCAweDAwMDQsIDB4MjAxMSwgMHg1ZDk0LCAweDA4MGMsIDB4ODJkYSwKKwkweDA4MGMsIDB4NWU4OSwgMHgyMDc5LCAweDAyNDAsIDB4NzgzMywgMHgxMTAyLCAweDc4MzcsIDB4MDAwMCwKKwkweDIwYTksIDB4MDAwOCwgMHg5Zjg4LCAweDAwMGUsIDB4MjAwYiwgMHgwMDAwLCAweDgxMDgsIDB4MWYwNCwKKwkweDU4NmMsIDB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NWRiZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwKKwkweDcwOGMsIDB4OTAwNSwgMHgwNTAwLCAweDIwMTEsIDB4NWQ5NCwgMHgwODBjLCAweDgyZGEsIDB4OTA4NiwKKwkweDAwMTQsIDB4MTFiOCwgMHgwODBjLCAweDVmMDUsIDB4MjA3OSwgMHgwMjYwLCAweDdhMzAsIDB4OTI5NiwKKwkweDExMDIsIDB4MTE3OCwgMHg3ODM0LCAweDkwMDUsIDB4MTE2MCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwKKwkweDcwYzAsIDB4OTAwNSwgMHgxMTEwLCAweDcwYzMsIDB4MDAwMSwgMHg3MDk3LCAweDAwMDQsIDB4MDAyOSwKKwkweDAwMTAsIDB4MDgwYywgMHg1ZWUxLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOTcsIDB4MDAwNSwKKwkweDA4MGMsIDB4NWU4OSwgMHgyMDc5LCAweDAyNDAsIDB4NzgzMywgMHgxMTAzLCAweDc4MzcsIDB4MDAwMCwKKwkweDA4MGMsIDB4NWYwNSwgMHgwODBjLCAweDVlZTgsIDB4MTE3MCwgMHg3MDgwLCAweDkwMDUsIDB4MTE1OCwKKwkweDcxNTgsIDB4OTE4NiwgMHhmZmZmLCAweDAxMzgsIDB4MjAxMSwgMHgwMDA4LCAweDA4MGMsIDB4NWQ0MSwKKwkweDAxNjgsIDB4MDgwYywgMHg1ZWJlLCAweDIwYTksIDB4MDAwOCwgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwKKwkweDAyNmUsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0ZSwgMHg0MDAzLCAweDYwYzMsIDB4MDAxNCwKKwkweDA4MGMsIDB4NWRiZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDhjLCAweDkwMDUsIDB4MDUwMCwKKwkweDIwMTEsIDB4NWQ5NCwgMHgwODBjLCAweDgyZGEsIDB4OTA4NiwgMHgwMDE0LCAweDExYjgsIDB4MDgwYywKKwkweDVmMDUsIDB4MjA3OSwgMHgwMjYwLCAweDdhMzAsIDB4OTI5NiwgMHgxMTAzLCAweDExNzgsIDB4NzgzNCwKKwkweDkwMDUsIDB4MTE2MCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGMwLCAweDkwMDUsIDB4MTExMCwKKwkweDcwYzMsIDB4MDAwMSwgMHg3MDk3LCAweDAwMDYsIDB4MDAyOSwgMHgwMDEwLCAweDA4MGMsIDB4NWVlMSwKKwkweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOTcsIDB4MDAwNywgMHgwODBjLCAweDVlODksIDB4MjA3OSwKKwkweDAyNDAsIDB4NzgzMywgMHgxMTA0LCAweDc4MzcsIDB4MDAwMCwgMHgwODBjLCAweDVmMDUsIDB4MDgwYywKKwkweDVlZTgsIDB4MTFiOCwgMHg3MDgwLCAweDkwMDUsIDB4MTFhMCwgMHg3MTYwLCAweDkxODYsIDB4ZmZmZiwKKwkweDAxODAsIDB4OTE4MCwgMHgzMmU5LCAweDIwMGQsIDB4OTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MjAxMSwKKwkweDAwMDgsIDB4MDgwYywgMHg1ZDQxLCAweDAxODAsIDB4MDgwYywgMHg0ZWQ4LCAweDAxMTAsIDB4MDgwYywKKwkweDI3ZDcsIDB4MjBhOSwgMHgwMDA4LCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAyNmUsIDB4MjBlOSwKKwkweDAwMDAsIDB4MjBhMSwgMHgwMjRlLCAweDQwMDMsIDB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NWRiZSwKKwkweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOGMsIDB4OTAwNSwgMHgwNTAwLCAweDIwMTEsIDB4NWQ5NCwKKwkweDA4MGMsIDB4ODJkYSwgMHg5MDg2LCAweDAwMTQsIDB4MTFiOCwgMHgwODBjLCAweDVmMDUsIDB4MjA3OSwKKwkweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LCAweDExMDQsIDB4MTE3OCwgMHg3ODM0LCAweDkwMDUsIDB4MTE2MCwKKwkweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYzAsIDB4OTAwNSwgMHgxMTEwLCAweDcwYzMsIDB4MDAwMSwKKwkweDcwOTcsIDB4MDAwOCwgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg1ZWUxLCAweDAwZmUsIDB4MDAwNSwKKwkweDAwZjYsIDB4NzA5NywgMHgwMDA5LCAweDA4MGMsIDB4NWU4OSwgMHgyMDc5LCAweDAyNDAsIDB4NzgzMywKKwkweDExMDUsIDB4NzgzNywgMHgwMTAwLCAweDA4MGMsIDB4NWVlOCwgMHgxMTUwLCAweDcwODAsIDB4OTAwNSwKKwkweDExMzgsIDB4MDgwYywgMHg1Y2I0LCAweDExODgsIDB4OTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4MjdkNywKKwkweDIwYTksIDB4MDAwOCwgMHgwODBjLCAweDVmMDUsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDI2ZSwKKwkweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNGUsIDB4NDAwMywgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywKKwkweDVkYmUsIDB4MDAxMCwgMHgwODBjLCAweDU4MGUsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA4YywKKwkweDkwMDUsIDB4MDVhOCwgMHgyMDExLCAweDVkOTQsIDB4MDgwYywgMHg4MmRhLCAweDkwODYsIDB4MDAxNCwKKwkweDE1NjAsIDB4MDgwYywgMHg1ZjA1LCAweDIwNzksIDB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwNSwKKwkweDE1MjAsIDB4NzgzNCwgMHg5MDg0LCAweDAxMDAsIDB4MjAxMSwgMHgwMTAwLCAweDkyMWUsIDB4MTE2MCwKKwkweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYzAsIDB4OTAwNSwgMHgxMTEwLCAweDcwYzMsIDB4MDAwMSwKKwkweDcwOTcsIDB4MDAwYSwgMHgwMGIxLCAweDAwOTgsIDB4OTAwNSwgMHgxMTc4LCAweDdhMzgsIDB4ZDJmYywKKwkweDAxMjgsIDB4NzBjMCwgMHg5MDA1LCAweDExMTAsIDB4NzBjMywgMHgwMDAxLCAweDcwOTMsIDB4MDAwMCwKKwkweDcwOTcsIDB4MDAwZSwgMHgwODBjLCAweDVhNWMsIDB4MDAxMCwgMHgwODBjLCAweDVlZTEsIDB4MDBmZSwKKwkweDAwMDUsIDB4MDBmNiwgMHg3MDk3LCAweDAwMGIsIDB4MjAxMSwgMHgxYzBlLCAweDIwZTksIDB4MDAwMSwKKwkweDIyYTAsIDB4MjBhOSwgMHgwMDQwLCAweDIwMTksIDB4ZmZmZiwgMHg0MzA0LCAweDA4MGMsIDB4NWU4OSwKKwkweDIwNzksIDB4MDI0MCwgMHg3ODMzLCAweDExMDYsIDB4NzgzNywgMHgwMDAwLCAweDA4MGMsIDB4NWVlOCwKKwkweDAxMTgsIDB4MjAxMywgMHgwMDAwLCAweDAwMjAsIDB4NzA1YywgMHg5MDg1LCAweDAxMDAsIDB4MjAxMiwKKwkweDIwYTksIDB4MDA0MCwgMHgyMDA5LCAweDAyNGUsIDB4MjAxMSwgMHgxYzBlLCAweDIyMGUsIDB4ODIxMCwKKwkweDgxMDgsIDB4OTE4NiwgMHgwMjYwLCAweDExMjgsIDB4NjgxMCwgMHg4MDAwLCAweDY4MTIsIDB4MjAwOSwKKwkweDAyNDAsIDB4MWYwNCwgMHg1OWRlLCAweDYwYzMsIDB4MDA4NCwgMHgwODBjLCAweDVkYmUsIDB4MDBmZSwKKwkweDAwMDUsIDB4MDBmNiwgMHg3MDhjLCAweDkwMDUsIDB4MDFjMCwgMHgyMDExLCAweDVkOTQsIDB4MDgwYywKKwkweDgyZGEsIDB4OTA4NiwgMHgwMDg0LCAweDExNzgsIDB4MDgwYywgMHg1ZjA1LCAweDIwNzksIDB4MDI2MCwKKwkweDdhMzAsIDB4OTI5NiwgMHgxMTA2LCAweDExMzgsIDB4NzgzNCwgMHg5MDA1LCAweDExMjAsIDB4NzA5NywKKwkweDAwMGMsIDB4MDAyOSwgMHgwMDEwLCAweDA4MGMsIDB4NWVlMSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwKKwkweDcwOTcsIDB4MDAwZCwgMHgwODBjLCAweDVlODksIDB4MjA3OSwgMHgwMjQwLCAweDc4MzMsIDB4MTEwNywKKwkweDc4MzcsIDB4MDAwMCwgMHgwODBjLCAweDVmMDUsIDB4MjBhOSwgMHgwMDQwLCAweDIwMTEsIDB4MDI2ZSwKKwkweDIwMDksIDB4MDI0ZSwgMHgyMjBlLCAweDgyMTAsIDB4ODEwOCwgMHg5MTg2LCAweDAyNjAsIDB4MTE1MCwKKwkweDY4MTAsIDB4ODAwMCwgMHg2ODEyLCAweDIwMDksIDB4MDI0MCwgMHg2ODE0LCAweDgwMDAsIDB4NjgxNiwKKwkweDIwMTEsIDB4MDI2MCwgMHgxZjA0LCAweDVhMjIsIDB4NjBjMywgMHgwMDg0LCAweDA4MGMsIDB4NWRiZSwKKwkweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOGMsIDB4OTAwNSwgMHgwMWUwLCAweDIwMTEsIDB4NWQ5NCwKKwkweDA4MGMsIDB4ODJkYSwgMHg5MDg2LCAweDAwODQsIDB4MTE5OCwgMHgwODBjLCAweDVmMDUsIDB4MjA3OSwKKwkweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LCAweDExMDcsIDB4MTE1OCwgMHg3ODM0LCAweDkwMDUsIDB4MTE0MCwKKwkweDcwOTMsIDB4MDAwMSwgMHgwODBjLCAweDVlNWIsIDB4NzA5NywgMHgwMDBlLCAweDAwMjksIDB4MDAxMCwKKwkweDA4MGMsIDB4NWVlMSwgMHgwMGZlLCAweDAwMDUsIDB4OTE4ZCwgMHgwMDAxLCAweDA4MGMsIDB4NWYzMCwKKwkweDcwOTcsIDB4MDAwZiwgMHg3MDhmLCAweDAwMDAsIDB4MjA2MSwgMHgwMTQwLCAweDYwNWIsIDB4YmM4NSwKKwkweDYwNWYsIDB4YjViNSwgMHgyMDYxLCAweDAxMDAsIDB4NjA0MywgMHgwMDA1LCAweDYwNDMsIDB4MDAwNCwKKwkweDIwMDksIDB4MDdkMCwgMHgyMDExLCAweDVkOTQsIDB4MDgwYywgMHg4MmNlLCAweDAwMDUsIDB4NzA4YywKKwkweDkwMDUsIDB4MDEzMCwgMHgyMDExLCAweDVkOTQsIDB4MDgwYywgMHg4MmRhLCAweDcwOTcsIDB4MDAwMCwKKwkweDAwMDUsIDB4NzA5NywgMHgwMDExLCAweDA4MGMsIDB4OWVlYiwgMHgwODBjLCAweDVmMDUsIDB4MjBlMSwKKwkweDAwMDAsIDB4MjA5OSwgMHgwMjYwLCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNDAsIDB4NzQ4YywKKwkweDk0ODAsIDB4MDAxOCwgMHg5MDgwLCAweDAwMDcsIDB4OTA4NCwgMHgwM2Y4LCAweDgwMDQsIDB4MjBhOCwKKwkweDQwMDMsIDB4MDgwYywgMHg1ZWU4LCAweDExYTAsIDB4NzE3OCwgMHg4MWZmLCAweDAxODgsIDB4OTAwZSwKKwkweDcwN2MsIDB4OTA4NCwgMHgwMGZmLCAweDAxNjAsIDB4MDgwYywgMHgyNzZlLCAweDkxODYsIDB4MDA3ZSwKKwkweDAxMzgsIDB4OTE4NiwgMHgwMDgwLCAweDAxMjAsIDB4MjAxMSwgMHgwMDA4LCAweDA4MGMsIDB4NWQ0MSwKKwkweDYwYzMsIDB4MDAxNCwgMHgwODBjLCAweDVkYmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOGMsIDB4OTAwNSwKKwkweDA1MDAsIDB4MjAxMSwgMHg1ZDk0LCAweDA4MGMsIDB4ODJkYSwgMHg5MDg2LCAweDAwMTQsIDB4MTFiOCwKKwkweDA4MGMsIDB4NWYwNSwgMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LCAweDExMDMsIDB4MTE3OCwKKwkweDc4MzQsIDB4OTAwNSwgMHgxMTYwLCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYzAsIDB4OTAwNSwKKwkweDExMTAsIDB4NzBjMywgMHgwMDAxLCAweDcwOTcsIDB4MDAxMiwgMHgwMDI5LCAweDAwMTAsIDB4NzA4ZiwKKwkweDAwMDAsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5NywgMHgwMDEzLCAweDA4MGMsIDB4NWU5NywKKwkweDIwNzksIDB4MDI0MCwgMHg3ODMzLCAweDExMDMsIDB4NzgzNywgMHgwMDAwLCAweDA4MGMsIDB4NWYwNSwKKwkweDA4MGMsIDB4NWVlOCwgMHgxMTcwLCAweDcwODAsIDB4OTAwNSwgMHgxMTU4LCAweDcxNTgsIDB4OTE4NiwKKwkweGZmZmYsIDB4MDEzOCwgMHgyMDExLCAweDAwMDgsIDB4MDgwYywgMHg1ZDQxLCAweDAxNjgsIDB4MDgwYywKKwkweDVlYmUsIDB4MjBhOSwgMHgwMDA4LCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAyNmUsIDB4MjBlOSwKKwkweDAwMDAsIDB4MjBhMSwgMHgwMjRlLCAweDQwMDMsIDB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NWRiZSwKKwkweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOGMsIDB4OTAwNSwgMHgwNTAwLCAweDIwMTEsIDB4NWQ5NCwKKwkweDA4MGMsIDB4ODJkYSwgMHg5MDg2LCAweDAwMTQsIDB4MTFiOCwgMHgwODBjLCAweDVmMDUsIDB4MjA3OSwKKwkweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LCAweDExMDQsIDB4MTE3OCwgMHg3ODM0LCAweDkwMDUsIDB4MTE2MCwKKwkweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYzAsIDB4OTAwNSwgMHgxMTEwLCAweDcwYzMsIDB4MDAwMSwKKwkweDcwOTcsIDB4MDAxNCwgMHgwMDI5LCAweDAwMTAsIDB4NzA4ZiwgMHgwMDAwLCAweDAwZmUsIDB4MDAwNSwKKwkweDAwZjYsIDB4NzA5NywgMHgwMDE1LCAweDA4MGMsIDB4NWU5NywgMHgyMDc5LCAweDAyNDAsIDB4NzgzMywKKwkweDExMDQsIDB4NzgzNywgMHgwMDAwLCAweDA4MGMsIDB4NWYwNSwgMHgwODBjLCAweDVlZTgsIDB4MTFiOCwKKwkweDcwODAsIDB4OTAwNSwgMHgxMWEwLCAweDcxNjAsIDB4OTE4NiwgMHhmZmZmLCAweDAxODAsIDB4OTE4MCwKKwkweDMyZTksIDB4MjAwZCwgMHg5MThjLCAweGZmMDAsIDB4ODEwZiwgMHgyMDExLCAweDAwMDgsIDB4MDgwYywKKwkweDVkNDEsIDB4MDE4MCwgMHgwODBjLCAweDRlZDgsIDB4MDExMCwgMHgwODBjLCAweDI3ZDcsIDB4MjBhOSwKKwkweDAwMDgsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDI2ZSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwKKwkweDAyNGUsIDB4NDAwMywgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg1ZGJlLCAweDAwZmUsIDB4MDAwNSwKKwkweDAwZjYsIDB4NzA4YywgMHg5MDA1LCAweDA1ZjAsIDB4MjAxMSwgMHg1ZDk0LCAweDA4MGMsIDB4ODJkYSwKKwkweDkwODYsIDB4MDAxNCwgMHgxNWE4LCAweDA4MGMsIDB4NWYwNSwgMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwKKwkweDkyOTYsIDB4MTEwNSwgMHgxNTY4LCAweDc4MzQsIDB4OTA4NCwgMHgwMTAwLCAweDIwMTEsIDB4MDEwMCwKKwkweDkyMWUsIDB4MTE2OCwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywgMHg1ZjMwLCAweDdhMzgsIDB4ZDJmYywKKwkweDAxMjgsIDB4NzBjMCwgMHg5MDA1LCAweDExMTAsIDB4NzBjMywgMHgwMDAxLCAweDAwODAsIDB4OTAwNSwKKwkweDExYjgsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBjMCwgMHg5MDA1LCAweDExMTAsIDB4NzBjMywKKwkweDAwMDEsIDB4OTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4NWYzMCwgMHg3MDkzLCAweDAwMDAsIDB4N2EzOCwKKwkweGQyZjQsIDB4MDExMCwgMHg3MGRiLCAweDAwMDgsIDB4NzA5NywgMHgwMDE2LCAweDAwMjksIDB4MDAxMCwKKwkweDcwOGYsIDB4MDAwMCwgMHgwMGZlLCAweDAwMDUsIDB4MDgwYywgMHg5ZWViLCAweDA4MGMsIDB4NWYwNSwKKwkweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAyNjAsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0MCwKKwkweDIwYTksIDB4MDAwZSwgMHg0MDAzLCAweDIwMTEsIDB4MDI2ZCwgMHgyMjA0LCAweDkwODQsIDB4MDEwMCwKKwkweDIwMTEsIDB4MDI0ZCwgMHgyMDEyLCAweDIwMTEsIDB4MDI2ZSwgMHg3MDk3LCAweDAwMTcsIDB4MDgwYywKKwkweDVlZTgsIDB4MTE1MCwgMHg3MDgwLCAweDkwMDUsIDB4MTEzOCwgMHgwODBjLCAweDVjYjQsIDB4MTE4OCwKKwkweDkwODUsIDB4MDAwMSwgMHgwODBjLCAweDI3ZDcsIDB4MjBhOSwgMHgwMDA4LCAweDA4MGMsIDB4NWYwNSwKKwkweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAyNmUsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0ZSwKKwkweDQwMDMsIDB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NWRiZSwgMHgwMDEwLCAweDA4MGMsIDB4NTgwZSwKKwkweDAwMDUsIDB4MDBmNiwgMHg3MDhjLCAweDkwMDUsIDB4MDFkOCwgMHgyMDExLCAweDVkOTQsIDB4MDgwYywKKwkweDgyZGEsIDB4OTA4NiwgMHgwMDg0LCAweDExOTAsIDB4MDgwYywgMHg1ZjA1LCAweDIwNzksIDB4MDI2MCwKKwkweDdhMzAsIDB4OTI5NiwgMHgxMTA2LCAweDExNTAsIDB4NzgzNCwgMHg5MDA1LCAweDExMzgsIDB4OTAwNiwKKwkweDA4MGMsIDB4NWYzMCwgMHg3MDk3LCAweDAwMTgsIDB4MDAyOSwgMHgwMDEwLCAweDcwOGYsIDB4MDAwMCwKKwkweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOTcsIDB4MDAxOSwgMHgwODBjLCAweDVlOTcsIDB4MjA3OSwKKwkweDAyNDAsIDB4NzgzMywgMHgxMTA2LCAweDc4MzcsIDB4MDAwMCwgMHgwODBjLCAweDVmMDUsIDB4MjAwOSwKKwkweDAyNmUsIDB4MjAzOSwgMHgxYzBlLCAweDIwYTksIDB4MDA0MCwgMHgyMTNlLCAweDg3MzgsIDB4ODEwOCwKKwkweDkxODYsIDB4MDI4MCwgMHgxMTI4LCAweDY4MTQsIDB4ODAwMCwgMHg2ODE2LCAweDIwMDksIDB4MDI2MCwKKwkweDFmMDQsIDB4NWMxZCwgMHgyMDM5LCAweDFjMGUsIDB4MDgwYywgMHg1ZWU4LCAweDExZTgsIDB4MjcyOCwKKwkweDI1MTQsIDB4ODIwNywgMHg5MDg0LCAweDAwZmYsIDB4ODAwMCwgMHgyMDE4LCAweDkyOTQsIDB4MDBmZiwKKwkweDgwMDcsIDB4OTIwNSwgMHgyMDJhLCAweDcwNWMsIDB4MjMxMCwgMHg4MjE0LCAweDkyYTAsIDB4MWMwZSwKKwkweDI0MTQsIDB4OTM4YywgMHgwMDAxLCAweDAxMTgsIDB4OTI5NCwgMHhmZjAwLCAweDAwMTgsIDB4OTI5NCwKKwkweDAwZmYsIDB4ODAwNywgMHg5MjE1LCAweDIyMjIsIDB4MjBhOSwgMHgwMDQwLCAweDIwMDksIDB4MDI0ZSwKKwkweDI3MGUsIDB4ODczOCwgMHg4MTA4LCAweDkxODYsIDB4MDI2MCwgMHgxMTI4LCAweDY4MTAsIDB4ODAwMCwKKwkweDY4MTIsIDB4MjAwOSwgMHgwMjQwLCAweDFmMDQsIDB4NWM1MCwgMHg2MGMzLCAweDAwODQsIDB4MDgwYywKKwkweDVkYmUsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA4YywgMHg5MDA1LCAweDAxZTAsIDB4MjAxMSwKKwkweDVkOTQsIDB4MDgwYywgMHg4MmRhLCAweDkwODYsIDB4MDA4NCwgMHgxMTk4LCAweDA4MGMsIDB4NWYwNSwKKwkweDIwNzksIDB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwNywgMHgxMTU4LCAweDc4MzQsIDB4OTAwNSwKKwkweDExNDAsIDB4NzA5MywgMHgwMDAxLCAweDA4MGMsIDB4NWU1YiwgMHg3MDk3LCAweDAwMWEsIDB4MDAyOSwKKwkweDAwMTAsIDB4NzA4ZiwgMHgwMDAwLCAweDAwZmUsIDB4MDAwNSwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywKKwkweDVmMzAsIDB4NzA5NywgMHgwMDFiLCAweDA4MGMsIDB4OWVlYiwgMHgwODBjLCAweDVmMDUsIDB4MjAxMSwKKwkweDAyNjAsIDB4MjAwOSwgMHgwMjQwLCAweDc0OGMsIDB4OTQ4MCwgMHgwMDE4LCAweDkwODAsIDB4MDAwNywKKwkweDkwODQsIDB4MDNmOCwgMHg4MDA0LCAweDIwYTgsIDB4MjIwZSwgMHg4MjEwLCAweDgxMDgsIDB4OTE4NiwKKwkweDAyNjAsIDB4MTE1MCwgMHg2ODEwLCAweDgwMDAsIDB4NjgxMiwgMHgyMDA5LCAweDAyNDAsIDB4NjgxNCwKKwkweDgwMDAsIDB4NjgxNiwgMHgyMDExLCAweDAyNjAsIDB4MWYwNCwgMHg1YzljLCAweDYwYzMsIDB4MDA4NCwKKwkweDA4MGMsIDB4NWRiZSwgMHgwMDA1LCAweDAwMDUsIDB4MDA4NiwgMHgwMDk2LCAweDIwMjksIDB4MTg1YywKKwkweDI1MmMsIDB4MjBhOSwgMHgwMDA4LCAweDIwNDEsIDB4MWMwZSwgMHgyMGU5LCAweDAwMDEsIDB4MjhhMCwKKwkweDA4MGMsIDB4NWYwNSwgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwgMHgwMjZlLCAweDQwMDMsIDB4MjBhOSwKKwkweDAwMDgsIDB4MjAxMSwgMHgwMDA3LCAweGQ1ZDQsIDB4MDEwOCwgMHg5MDE2LCAweDI4MDAsIDB4OTIwMCwKKwkweDIwMGMsIDB4OTFhNiwgMHhmZmZmLCAweDExNDgsIDB4ZDVkNCwgMHgwMTEwLCAweDgyMTAsIDB4MDAwOCwKKwkweDgyMTEsIDB4MWYwNCwgMHg1Y2NlLCAweDA4MDQsIDB4NWQzZCwgMHg4MmZmLCAweDExNjAsIDB4ZDVkNCwKKwkweDAxMjAsIDB4OTFhNiwgMHgzZmZmLCAweDBkOTAsIDB4MDAyMCwgMHg5MWE2LCAweDNmZmYsIDB4MDkwNCwKKwkweDVkM2QsIDB4OTE4ZCwgMHhjMDAwLCAweDIwYTksIDB4MDAxMCwgMHgyMDE5LCAweDAwMDEsIDB4ZDVkNCwKKwkweDAxMTAsIDB4MjAxOSwgMHgwMDEwLCAweDIxMjAsIDB4ZDVkNCwgMHgwMTEwLCAweDg0MjMsIDB4MDAwOCwKKwkweDg0MjQsIDB4MTI0MCwgMHhkNWQ0LCAweDAxMTAsIDB4ODMxOSwgMHgwMDA4LCAweDgzMTgsIDB4MWYwNCwKKwkweDVjZjQsIDB4MDRkOCwgMHgyM2E4LCAweDIwMjEsIDB4MDAwMSwgMHg4NDI2LCAweDg0MjUsIDB4MWYwNCwKKwkweDVkMDYsIDB4MjMyOCwgMHg4NTI5LCAweDkyYmUsIDB4MDAwNywgMHgwMTU4LCAweDAwMDYsIDB4MjAzOSwKKwkweDAwMDcsIDB4MjIwMCwgMHg5NzNhLCAweDAwMGUsIDB4MjdhOCwgMHg5NWE4LCAweDAwMTAsIDB4MWYwNCwKKwkweDVkMTUsIDB4NzU1YSwgMHg5NWM4LCAweDMyZTksIDB4MjkyZCwgMHg5NWFjLCAweDAwZmYsIDB4NzU3ZSwKKwkweDY1MzIsIDB4NjUzNiwgMHgwMDE2LCAweDI1MDgsIDB4MDgwYywgMHgyN2I3LCAweDAwMWUsIDB4NjBlNywKKwkweDAwMDAsIDB4NjVlYSwgMHgyMDE4LCAweDIzMDQsIDB4OTQwNSwgMHgyMDFhLCAweDcwODMsIDB4MDAwMSwKKwkweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNGUsIDB4MjBlMSwgMHgwMDAxLCAweDI4OTgsIDB4MjBhOSwKKwkweDAwMDgsIDB4NDAwMywgMHg5MDg1LCAweDAwMDEsIDB4MDAwOCwgMHg5MDA2LCAweDAwOWUsIDB4MDA4ZSwKKwkweDAwMDUsIDB4MDE1NiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDIyYTgsIDB4MjBlMSwKKwkweDAwMDAsIDB4MjA5OSwgMHgwMjZlLCAweDIwZTksIDB4MDAwMCwgMHgyMDExLCAweDAyNGUsIDB4MjJhMCwKKwkweDQwMDMsIDB4MDE0ZSwgMHgwMTNlLCAweDAxZGUsIDB4MDFjZSwgMHgwMTVlLCAweDIxMTgsIDB4OTAyNiwKKwkweDIwMDEsIDB4MDAwNywgMHg5MzlhLCAweDAwMTAsIDB4MDIxOCwgMHg4NDIwLCAweDgwMDEsIDB4MGNkMCwKKwkweDIxMTgsIDB4ODRmZiwgMHgwMTIwLCAweDkzOWEsIDB4MDAxMCwgMHg4NDIxLCAweDFkZTAsIDB4MjAyMSwKKwkweDAwMDEsIDB4ODNmZiwgMHgwMTE4LCAweDg0MjMsIDB4ODMxOSwgMHgxZGU4LCAweDkyMzgsIDB4MjAyOSwKKwkweDAyNmUsIDB4OTUyOCwgMHgyNTA0LCAweDk0MmMsIDB4MTFiOCwgMHg5NDA1LCAweDIwM2EsIDB4NzE1YSwKKwkweDkxYTAsIDB4MzJlOSwgMHgyNDJkLCAweDk1YWMsIDB4MDBmZiwgMHg3NTdlLCAweDY1MzIsIDB4NjUzNiwKKwkweDAwMTYsIDB4MjUwOCwgMHgwODBjLCAweDI3YjcsIDB4MDAxZSwgMHg2MGU3LCAweDAwMDAsIDB4NjVlYSwKKwkweDcwODMsIDB4MDAwMSwgMHg5MDg0LCAweDAwMDAsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwKKwkweDcwODcsIDB4MDAwMCwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwKKwkweDIwNzEsIDB4MDE0MCwgMHgwODBjLCAweDVlNGEsIDB4MDgwYywgMHg5NjU2LCAweDcwMDQsIDB4OTA4NCwKKwkweDQwMDAsIDB4MDExMCwgMHgwODBjLCAweDJjOTgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwKKwkweDE4MjUsIDB4MjA3MywgMHgwMDAwLCAweDc4NDAsIDB4MDAyNiwgMHgwMDE2LCAweDIwMDksIDB4MDBmNywKKwkweDA4MGMsIDB4NWVhNywgMHgwMDFlLCAweDkwOTQsIDB4MDAxMCwgMHg5Mjg1LCAweDAwODAsIDB4Nzg0MiwKKwkweDdhNDIsIDB4MDAyZSwgMHgwMTJlLCAweDAwZmUsIDB4MDBlZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDgwYywgMHgyYWZlLCAweDAyMjgsIDB4MjAxMSwgMHgwMTAxLCAweDIyMDQsIDB4YzBjNSwKKwkweDIwMTIsIDB4MjAxMSwgMHgxOWM5LCAweDIwMTMsIDB4MDAwMCwgMHg3MDhmLCAweDAwMDAsIDB4MDEyZSwKKwkweDYwYTMsIDB4MDA1NiwgMHg2MGE3LCAweDk1NzUsIDB4MDgwYywgMHg5NjRkLCAweDYxNDQsIDB4ZDE4NCwKKwkweDAxMjAsIDB4NzE5NCwgMHg5MThkLCAweDIwMDAsIDB4MDAxOCwgMHg3MTg4LCAweDkxOGQsIDB4MTAwMCwKKwkweDIwMTEsIDB4MTk3MSwgMHgyMTEyLCAweDIwMDksIDB4MDdkMCwgMHgyMDExLCAweDVkOTQsIDB4MDgwYywKKwkweDgzNmMsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4YTA2OSwgMHgyMDA5LCAweDAwZjcsIDB4MDgwYywgMHg1ZWE3LCAweDIwNjEsIDB4MTlkMiwKKwkweDkwMGUsIDB4NjExYSwgMHg2MTFlLCAweDYxNzIsIDB4NjE3NiwgMHgyMDYxLCAweDE4MDAsIDB4NjAwMywKKwkweDAwMDEsIDB4MjA2MSwgMHgwMTAwLCAweDYwNDMsIDB4MDA5MCwgMHg2MDQzLCAweDAwMTAsIDB4MjAwOSwKKwkweDE5NzEsIDB4MjAwYiwgMHgwMDAwLCAweDIwMDksIDB4MDAyZCwgMHgyMDExLCAweDVlMTYsIDB4MDgwYywKKwkweDgyY2UsIDB4MDEyZSwgMHgwMGNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwZTYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA0NzEsIDB4MjA3MSwgMHgwMTAwLCAweDA4MGMsIDB4OTY1NiwKKwkweDIwNzEsIDB4MDE0MCwgMHg3MDA0LCAweDkwODQsIDB4NDAwMCwgMHgwMTEwLCAweDA4MGMsIDB4MmM5OCwKKwkweDA4MGMsIDB4NzIwZiwgMHgwMTg4LCAweDA4MGMsIDB4NzIyYSwgMHgxMTcwLCAweDA4MGMsIDB4NzUwZSwKKwkweDAwMTYsIDB4MDgwYywgMHgyODg2LCAweDIwMDEsIDB4MTk0NSwgMHgyMTAyLCAweDAwMWUsIDB4MDgwYywKKwkweDc1MDksIDB4MDgwYywgMHg3MTI3LCAweDAwNTAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsIDB4MmJiNiwKKwkweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI3MTcsIDB4MDgwYywgMHg1ZGVhLCAweDAxMmUsIDB4MDAwZSwKKwkweDAwZWUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MGUsIDB4MjAwNCwgMHhkMGJjLCAweDAxNTgsIDB4MDAyNiwKKwkweDAwMzYsIDB4MjAxMSwgMHg4MDE3LCAweDIwMDEsIDB4MTk3MSwgMHgyMDFjLCAweDA4MGMsIDB4NGIxZiwKKwkweDAwM2UsIDB4MDAyZSwgMHgwMDA1LCAweDIwYTksIDB4MDAxMiwgMHgyMGU5LCAweDAwMDEsIDB4MjBhMSwKKwkweDFjODAsIDB4MDgwYywgMHg1ZjA1LCAweDIwZTksIDB4MDAwMCwgMHgyMDk5LCAweDAyNmUsIDB4MDA5OSwKKwkweDIwYTksIDB4MDAyMCwgMHgwODBjLCAweDVlZmYsIDB4MjA5OSwgMHgwMjYwLCAweDIwYTEsIDB4MWM5MiwKKwkweDAwNTEsIDB4MjBhOSwgMHgwMDBlLCAweDA4MGMsIDB4NWYwMiwgMHgyMDk5LCAweDAyNjAsIDB4MjBhMSwKKwkweDFjYjIsIDB4MDAwOSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgzNDEwLCAweDMzMDgsIDB4MjEwNCwKKwkweDgwMDcsIDB4MjAxMiwgMHg4MTA4LCAweDgyMTAsIDB4MWYwNCwgMHg1ZTdmLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMDUsIDB4MDgwYywgMHg5ZWViLCAweDIwZTEsIDB4MDAwMSwgMHgyMDk5LCAweDFjMDAsIDB4MjBlOSwKKwkweDAwMDAsIDB4MjBhMSwgMHgwMjQwLCAweDIwYTksIDB4MDAwYywgMHg0MDAzLCAweDAwMDUsIDB4MDgwYywKKwkweDllZWIsIDB4MDgwYywgMHg1ZjA1LCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAyNjAsIDB4MjBlOSwKKwkweDAwMDAsIDB4MjBhMSwgMHgwMjQwLCAweDIwYTksIDB4MDAwYywgMHg0MDAzLCAweDAwMDUsIDB4MDBjNiwKKwkweDAwMDYsIDB4MjA2MSwgMHgwMTAwLCAweDgxMGYsIDB4MjAwMSwgMHgxODMzLCAweDIwMDQsIDB4OTAwNSwKKwkweDExMzgsIDB4MjAwMSwgMHgxODE3LCAweDIwMDQsIDB4OTA4NCwgMHgwMGZmLCAweDkxMDUsIDB4MDAxMCwKKwkweDkxODUsIDB4MDBmNywgMHg2MDRhLCAweDAwMGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwMTYsIDB4MDA0NiwKKwkweDA4MGMsIDB4NjdiZiwgMHgwMTU4LCAweDkwMDYsIDB4MjAyMCwgMHgyMDA5LCAweDAwMmEsIDB4MDgwYywKKwkweGQ4ODUsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4YzE5NSwgMHgyMTAyLCAweDIwMTksIDB4MDAyYSwKKwkweDkwMGUsIDB4MDgwYywgMHgzMTU2LCAweDA4MGMsIDB4YzUzOSwgMHgwMTQwLCAweDAwMzYsIDB4MjAxOSwKKwkweGZmZmYsIDB4MjAyMSwgMHgwMDA3LCAweDA4MGMsIDB4NGNiYywgMHgwMDNlLCAweDAwNGUsIDB4MDAxZSwKKwkweDAwMDUsIDB4MDgwYywgMHg1ZGVhLCAweDcwOTcsIDB4MDAwMCwgMHg3MDhmLCAweDAwMDAsIDB4MDAwNSwKKwkweDAwMDYsIDB4MjAwMSwgMHgxODBjLCAweDIwMDQsIDB4ZDA5YywgMHgwMTAwLCAweDAwMGUsIDB4MDAwNSwKKwkweDAwMDYsIDB4MDAxNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDAxLCAweDAxMDEsIDB4MjAwYywKKwkweDkxOGQsIDB4MDAwNiwgMHgyMTAyLCAweDAxMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MjAwOSwKKwkweDAwMDEsIDB4MDAyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDAwOCwgMHg5MDBlLCAweDY4MTQsIDB4OTA4NCwKKwkweGZmYzAsIDB4OTEwZCwgMHg2OTE2LCAweDAwMDUsIDB4MDBmNiwgMHgwMTU2LCAweDAxNDYsIDB4MDFkNiwKKwkweDkwMDYsIDB4MjBhOSwgMHgwMDgwLCAweDIwZTksIDB4MDAwMSwgMHgyMGExLCAweDFjMDAsIDB4NDAwNCwKKwkweDIwNzksIDB4MWMwMCwgMHg3ODAzLCAweDIyMDAsIDB4NzgwNywgMHgwMGVmLCAweDc4MGYsIDB4MDBlZiwKKwkweDc4MTMsIDB4MDEzOCwgMHg3ODIzLCAweGZmZmYsIDB4NzgyNywgMHhmZmZmLCAweDAxZGUsIDB4MDE0ZSwKKwkweDAxNWUsIDB4MDBmZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgwMCwgMHgyMDAzLCAweDAwMDEsIDB4MDAwNSwKKwkweDIwMDEsIDB4MTk3ZSwgMHgwMTE4LCAweDIwMDMsIDB4MDAwMSwgMHgwMDEwLCAweDIwMDMsIDB4MDAwMCwKKwkweDAwMDUsIDB4MDE1NiwgMHgyMGE5LCAweDA4MDAsIDB4MjAwOSwgMHgxMDAwLCAweDkwMDYsIDB4MjAwYSwKKwkweDgxMDgsIDB4MWYwNCwgMHg1ZjNmLCAweDAxNWUsIDB4MDAwNSwgMHgwMGQ2LCAweDAwMzYsIDB4MDE1NiwKKwkweDAxMzYsIDB4MDE0NiwgMHgyMDY5LCAweDE4NWIsIDB4OTAwNiwgMHhiODAyLCAweGI4YmUsIDB4YjgwNywKKwkweDA3MDcsIDB4YjgwYSwgMHhiODBlLCAweGI4MTIsIDB4OTE5OCwgMHgzMmU5LCAweDIzMWQsIDB4OTM5YywKKwkweDAwZmYsIDB4YmIxNiwgMHgwMDE2LCAweDAwMjYsIDB4YjhiMiwgMHgwODBjLCAweGEwNjIsIDB4MTEyMCwKKwkweDkxOTIsIDB4MDA3ZSwgMHgxMjA4LCAweGJiYjIsIDB4MjBhOSwgMHgwMDA0LCAweGI4YjQsIDB4MjBlOCwKKwkweGI5YjgsIDB4OTE5OCwgMHgwMDA2LCAweDkwMDYsIDB4MjNhMCwgMHg0MDA0LCAweDIwYTksIDB4MDAwNCwKKwkweDkxOTgsIDB4MDAwYSwgMHgyM2EwLCAweDQwMDQsIDB4MDAyZSwgMHgwMDFlLCAweGI4M2UsIDB4Yjg0MiwKKwkweGI4NGUsIDB4Yjg1MiwgMHhiODU2LCAweGI4NWEsIDB4Yjg1ZSwgMHhiODYyLCAweGI4NjYsIDB4Yjg2YSwKKwkweGI4NmYsIDB4MDEwMCwgMHhiODcyLCAweGI4NzYsIDB4Yjg3YSwgMHhiODhhLCAweGI4OGUsIDB4Yjg5MywKKwkweDAwMDgsIDB4Yjg5NiwgMHhiODlhLCAweGI4OWUsIDB4YjhhZSwgMHhiOWEyLCAweDAwOTYsIDB4YjhhNCwKKwkweDkwNGQsIDB4MDExMCwgMHgwODBjLCAweDEwNjMsIDB4YjhhNywgMHgwMDAwLCAweDAwOWUsIDB4OTAwNiwKKwkweGI4NGEsIDB4NjgxMCwgMHhiODNhLCAweDY4MGMsIDB4Yjg0NiwgMHg2ODE0LCAweDkwODQsIDB4MDBmZiwKKwkweGI4NDIsIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsIDB4MDAzZSwgMHgwMGRlLCAweDAwMDUsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHhhOTc0LCAweGFlNzgsIDB4OTY4NCwgMHgzZmZmLCAweDkwODIsIDB4NDAwMCwKKwkweDFhMDQsIDB4NjAxNSwgMHg5MTgyLCAweDA4MDAsIDB4MWEwNCwgMHg2MDE5LCAweDIwMDEsIDB4MTgwYywKKwkweDIwMDQsIDB4OTA4NCwgMHgwMDAzLCAweDE5MDQsIDB4NjAxZiwgMHg5MTg4LCAweDEwMDAsIDB4MjEwNCwKKwkweDkwNWQsIDB4MDUxOCwgMHhiODA0LCAweDkwODQsIDB4MDBmZiwgMHg5MDhlLCAweDAwMDYsIDB4MTUwOCwKKwkweGI4YTQsIDB4OTAwZCwgMHgxOTA0LCAweDYwMzEsIDB4Yjg1MCwgMHg5MDBkLCAweDExNDgsIDB4YTgwMiwKKwkweDI5MDAsIDB4Yjg1MiwgMHhiODRlLCAweDA4MGMsIDB4ODY5NiwgMHg5MDA2LCAweDAxMmUsIDB4MDAwNSwKKwkweDAwYTYsIDB4MjE1MCwgMHgyOTAwLCAweGIwMDIsIDB4YTgwMywgMHgwMDAwLCAweDAwYWUsIDB4Yjg1MiwKKwkweDBjOTAsIDB4MjAwMSwgMHgwMDA1LCAweDkwMGUsIDB4MDRiOCwgMHgyMDAxLCAweDAwMjgsIDB4OTAwZSwKKwkweDA0OTgsIDB4OTA4MiwgMHgwMDA2LCAweDEyOTAsIDB4MDgwYywgMHhhMDYyLCAweDExNjAsIDB4YjhhMCwKKwkweDkwODQsIDB4ZmY4MCwgMHgxMTQwLCAweGI5MDAsIDB4ZDFmYywgMHgwOTkwLCAweDIwMDEsIDB4MDAyOSwKKwkweDIwMDksIDB4MTAwMCwgMHgwNDA4LCAweDIwMDEsIDB4MDAyOCwgMHgwMGE4LCAweDIwMDksIDB4MTgwYywKKwkweDIxMGMsIDB4ZDE4YywgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDY4LCAweGQxODQsIDB4MDExOCwKKwkweDIwMDEsIDB4MDAwNCwgMHgwMDQwLCAweDIwMDEsIDB4MDAyOSwgMHhiOTAwLCAweGQxZmMsIDB4MDExOCwKKwkweDIwMDksIDB4MTAwMCwgMHgwMDQ4LCAweDkwMGUsIDB4MDAzOCwgMHgyMDAxLCAweDAwMjksIDB4OTAwZSwKKwkweDAwMTgsIDB4MjAwMSwgMHgwMDI5LCAweDkwMGUsIDB4OTAwNSwgMHgwMTJlLCAweDAwMDUsIDB4MjAwMSwKKwkweDE4MGMsIDB4MjAwNCwgMHhkMDg0LCAweDE5ZDAsIDB4OTE4OCwgMHgxMDAwLCAweDIxMDQsIDB4OTA1ZCwKKwkweDA5YTgsIDB4MDgwYywgMHg2N2MzLCAweDE5OTAsIDB4YjgwMCwgMHhkMGJjLCAweDA5NzgsIDB4MDgwNCwKKwkweDVmYzgsIDB4MDgwYywgMHg2NjNiLCAweDA5MDQsIDB4NWZlMSwgMHgwODA0LCAweDVmY2MsIDB4MDBiNiwKKwkweDAwZTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YTk3NCwgMHg5MTgyLCAweDA4MDAsIDB4MWEwNCwKKwkweDYwYjUsIDB4OTE4OCwgMHgxMDAwLCAweDIxMDQsIDB4OTA1ZCwgMHgwOTA0LCAweDYwOGQsIDB4YjhhMCwKKwkweDkwODYsIDB4MDA3ZiwgMHgwMTkwLCAweGE4N2MsIDB4ZDBmYywgMHgxMTc4LCAweDA4MGMsIDB4NjdjYiwKKwkweDAxNjAsIDB4YTk5NCwgMHg4MWZmLCAweDAxMzAsIDB4OTA4ZSwgMHgwMDA0LCAweDAxMzAsIDB4OTA4ZSwKKwkweDAwMDUsIDB4MDExOCwgMHgwODBjLCAweDY3YzMsIDB4MTU5OCwgMHhhODdjLCAweGQwZmMsIDB4MDFlMCwKKwkweGE4OTQsIDB4OTAwNSwgMHgwMWM4LCAweDIwNjAsIDB4MDAyNiwgMHgyMDEwLCAweDA4MGMsIDB4YmUyNSwKKwkweDAwMmUsIDB4MTEyMCwgMHgyMDAxLCAweDAwMDgsIDB4MDgwNCwgMHg2MGI3LCAweDYwMjAsIDB4OTA4NiwKKwkweDAwMGEsIDB4MDEyMCwgMHgyMDAxLCAweDAwMDgsIDB4MDgwNCwgMHg2MGI3LCAweDYwMWEsIDB4NjAwMywKKwkweDAwMDgsIDB4MjkwMCwgMHg2MDE2LCAweDAwNTgsIDB4MDgwYywgMHhhMDhkLCAweDA1ZTgsIDB4MmIwMCwKKwkweDYwMTIsIDB4MjkwMCwgMHg2MDE2LCAweDYwMGIsIDB4ZmZmZiwgMHg2MDIzLCAweDAwMGEsIDB4MjAwOSwKKwkweDAwMDMsIDB4MDgwYywgMHhhMTVkLCAweDkwMDYsIDB4MDQ1OCwgMHgyMDAxLCAweDAwMjgsIDB4MDQzOCwKKwkweDkwODIsIDB4MDAwNiwgMHgxMjkwLCAweDA4MGMsIDB4YTA2MiwgMHgxMTYwLCAweGI4YTAsIDB4OTA4NCwKKwkweGZmODAsIDB4MTE0MCwgMHhiOTAwLCAweGQxZmMsIDB4MDkwMCwgMHgyMDAxLCAweDAwMjksIDB4MjAwOSwKKwkweDEwMDAsIDB4MDBhOCwgMHgyMDAxLCAweDAwMjgsIDB4MDA5MCwgMHgyMDA5LCAweDE4MGMsIDB4MjEwYywKKwkweGQxOGMsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsIDB4MDA1MCwgMHhkMTg0LCAweDAxMTgsIDB4MjAwMSwKKwkweDAwMDQsIDB4MDAyOCwgMHgyMDAxLCAweDAwMjksIDB4MDAxMCwgMHgyMDAxLCAweDAwMjksIDB4OTAwNSwKKwkweDAxMmUsIDB4MDBlZSwgMHgwMGJlLCAweDAwMDUsIDB4MjAwMSwgMHgwMDJjLCAweDBjYzAsIDB4MDBmNiwKKwkweDAwYjYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YThlMCwgMHg5MDA1LCAweDE1NTAsIDB4YThkYywKKwkweDkwODIsIDB4MDEwMSwgMHgxNjMwLCAweGE4YzgsIDB4OTAwNSwgMHgxNTE4LCAweGE4YzQsIDB4OTA4MiwKKwkweDAxMDEsIDB4MTJmOCwgMHhhOTc0LCAweDIwNzksIDB4MTgwMCwgMHg5MTgyLCAweDA4MDAsIDB4MTJlOCwKKwkweDc4MzAsIDB4OTA4NCwgMHgwMDAzLCAweDExMzAsIDB4YWE5OCwgMHhhYjk0LCAweGE4NzgsIDB4OTA4NCwKKwkweDAwMDcsIDB4MDBlYSwgMHg3OTMwLCAweGQxOGMsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsIDB4MDAzOCwKKwkweGQxODQsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsIDB4MDAxMCwgMHgyMDAxLCAweDAwMjksIDB4OTAwZSwKKwkweDAwMzgsIDB4MjAwMSwgMHgwMDJjLCAweDkwMGUsIDB4MDAxOCwgMHgyMDAxLCAweDAwMjksIDB4OTAwZSwKKwkweDkwMDYsIDB4MDAwOCwgMHg5MDA1LCAweDAxMmUsIDB4MDBiZSwgMHgwMGZlLCAweDAwMDUsIDB4NjE0YywKKwkweDYxMDcsIDB4NjExZSwgMHg2MTRjLCAweDYxNGMsIDB4NjE0YywgMHg2MTRjLCAweDYxNGMsIDB4MjEwMCwKKwkweDkwODIsIDB4MDA3ZSwgMHgxMjc4LCAweDA4MGMsIDB4NjQzZiwgMHgwMTQ4LCAweDkwNDYsIDB4YjgxMCwKKwkweDkzMDYsIDB4MTkwNCwgMHg2MTU0LCAweGI4MTQsIDB4OTIwNiwgMHgxNWYwLCAweDAwMjgsIDB4YmIxMiwKKwkweGJhMTYsIDB4MDAxMCwgMHgwODBjLCAweDQ5ZDksIDB4MDE1MCwgMHgwNGIwLCAweDA4MGMsIDB4NjQ5ZiwKKwkweDE1OTgsIDB4YjgxMCwgMHg5MzA2LCAweDE1ODAsIDB4YjgxNCwgMHg5MjA2LCAweDE1NjgsIDB4MDgwYywKKwkweGEwOGQsIDB4MDUzMCwgMHgyYjAwLCAweDYwMTIsIDB4MDgwYywgMHhjMmIzLCAweDI5MDAsIDB4NjAxNiwKKwkweDYwMGIsIDB4ZmZmZiwgMHg2MDIzLCAweDAwMGEsIDB4YTg3OCwgMHg5MDg2LCAweDAwMDEsIDB4MTE3MCwKKwkweDA4MGMsIDB4MzE4YiwgMHg5MDA2LCAweDA4MGMsIDB4NjNkYywgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywKKwkweDYzZjAsIDB4MjAwMSwgMHgwMjAwLCAweGI4NmUsIDB4Yjg5MywgMHgwMDAyLCAweDIwMDksIDB4MDAwMywKKwkweDA4MGMsIDB4YTE1ZCwgMHg5MDA2LCAweDAwNjgsIDB4MjAwMSwgMHgwMDAxLCAweDkwMGUsIDB4MDAzOCwKKwkweDIwMDEsIDB4MDAyYywgMHg5MDBlLCAweDAwMTgsIDB4MjAwMSwgMHgwMDI4LCAweDkwMGUsIDB4OTAwNSwKKwkweDAwMDAsIDB4MDEyZSwgMHgwMGJlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGI2LCAweDAwZjYsIDB4MDBlNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGE4OTQsIDB4OTBjNiwgMHgwMDE1LCAweDA5MDQsIDB4NjMyZCwKKwkweDkwYzYsIDB4MDA1NiwgMHgwOTA0LCAweDYzMzEsIDB4OTBjNiwgMHgwMDY2LCAweDA5MDQsIDB4NjMzNSwKKwkweDkwYzYsIDB4MDA2NywgMHgwOTA0LCAweDYzMzksIDB4OTBjNiwgMHgwMDY4LCAweDA5MDQsIDB4NjMzZCwKKwkweDkwYzYsIDB4MDA3MSwgMHgwOTA0LCAweDYzNDEsIDB4OTBjNiwgMHgwMDc0LCAweDA5MDQsIDB4NjM0NSwKKwkweDkwYzYsIDB4MDA3YywgMHgwOTA0LCAweDYzNDksIDB4OTBjNiwgMHgwMDdlLCAweDA5MDQsIDB4NjM0ZCwKKwkweDkwYzYsIDB4MDAzNywgMHgwOTA0LCAweDYzNTEsIDB4OTAxNiwgMHgyMDc5LCAweDE4MDAsIDB4YTk3NCwKKwkweDkxODYsIDB4MDBmZiwgMHgwOTA0LCAweDYzMjgsIDB4OTE4MiwgMHgwODAwLCAweDFhMDQsIDB4NjMyOCwKKwkweDA4MGMsIDB4NjQ5ZiwgMHgxMTk4LCAweGI4MDQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODIsIDB4MDAwNiwKKwkweDEyNjgsIDB4YTg5NCwgMHg5MGM2LCAweDAwNmYsIDB4MDE0OCwgMHgwODBjLCAweGEwNjIsIDB4MTkwNCwKKwkweDYzMTEsIDB4YjhhMCwgMHg5MDg0LCAweGZmODAsIDB4MTkwNCwgMHg2MzExLCAweGE4OTQsIDB4OTBjNiwKKwkweDAwNmYsIDB4MDE1OCwgMHg5MGM2LCAweDAwNWUsIDB4MDkwNCwgMHg2MjcxLCAweDkwYzYsIDB4MDA2NCwKKwkweDA5MDQsIDB4NjI5YSwgMHgyMDA4LCAweDA4MDQsIDB4NjIzNCwgMHhhOTk4LCAweGE4YjAsIDB4MjA0MCwKKwkweDA4MGMsIDB4YTA2MiwgMHgxMTIwLCAweDkxODIsIDB4MDA3ZiwgMHgwYTA0LCAweDYyMzQsIDB4OTE4NiwKKwkweDAwZmYsIDB4MDkwNCwgMHg2MjM0LCAweDkxODIsIDB4MDgwMCwgMHgxYTA0LCAweDYyMzQsIDB4YWFhMCwKKwkweGFiOWMsIDB4Nzg3OCwgMHg5MzA2LCAweDExYTgsIDB4Nzg3YywgMHgwMDk2LCAweDkyNGUsIDB4MTEyOCwKKwkweDIyMDgsIDB4MjMxMCwgMHgwMDllLCAweDA4MDQsIDB4NjIzNCwgMHgwODBjLCAweGEwNjIsIDB4MTE0MCwKKwkweDk5Y2MsIDB4ZmYwMCwgMHgwMDllLCAweDExMjgsIDB4MjIwOCwgMHgyMzEwLCAweDA4MDQsIDB4NjIzNCwKKwkweDAwOWUsIDB4MDgwYywgMHg0OWQ5LCAweDA5MDQsIDB4NjIzZCwgMHg5MDBlLCAweDkwMTYsIDB4OTBjNiwKKwkweDQwMDAsIDB4MTU1OCwgMHgwMDA2LCAweDA4MGMsIDB4NjZiZiwgMHgxMTA4LCAweGMxODUsIDB4YjgwMCwKKwkweGQwYmMsIDB4MDEwOCwgMHhjMThkLCAweDIwYTksIDB4MDAwNCwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywKKwkweDkwODAsIDB4MDAzMSwgMHgyMGEwLCAweGI4YjQsIDB4MjBlMCwgMHhiOGI4LCAweDkwODAsIDB4MDAwNiwKKwkweDIwOTgsIDB4MDgwYywgMHgwZmFlLCAweDIwYTksIDB4MDAwNCwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywKKwkweDkwODAsIDB4MDAzNSwgMHgyMGEwLCAweGI4YjQsIDB4MjBlMCwgMHhiOGI4LCAweDkwODAsIDB4MDAwYSwKKwkweDIwOTgsIDB4MDgwYywgMHgwZmFlLCAweDAwMGUsIDB4MDBjOCwgMHg5MGM2LCAweDQwMDcsIDB4MTExMCwKKwkweDI0MDgsIDB4MDBhMCwgMHg5MGM2LCAweDQwMDgsIDB4MTExOCwgMHgyNzA4LCAweDI2MTAsIDB4MDA3MCwKKwkweDkwYzYsIDB4NDAwOSwgMHgxMTA4LCAweDAwNTAsIDB4OTBjNiwgMHg0MDA2LCAweDAxMzgsIDB4MjAwMSwKKwkweDQwMDUsIDB4MjAwOSwgMHgwMDBhLCAweDAwMTAsIDB4MjAwMSwgMHg0MDA2LCAweGE4OTYsIDB4YTk5YSwKKwkweGFhOWUsIDB4MjAwMSwgMHgwMDMwLCAweDkwMGUsIDB4MDQ3MCwgMHgwODBjLCAweGEwOGQsIDB4MTEzMCwKKwkweDIwMDEsIDB4NDAwNSwgMHgyMDA5LCAweDAwMDMsIDB4OTAxNiwgMHgwYzgwLCAweDJiMDAsIDB4NjAxMiwKKwkweDA4MGMsIDB4YzJiMywgMHgyOTAwLCAweDYwMTYsIDB4NjAyMywgMHgwMDAxLCAweGE4NjgsIDB4ZDg4YywKKwkweDAxMDgsIDB4YzBmNSwgMHhhODZhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4MzE4YiwKKwkweDAxMmUsIDB4OTAwNiwgMHgwODBjLCAweDYzZGMsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NjNmMCwKKwkweDIwMDksIDB4MDAwMiwgMHgwODBjLCAweGExNWQsIDB4YThiMCwgMHhkMDk0LCAweDAxMTgsIDB4YjhiYywKKwkweGMwOGQsIDB4YjhiZSwgMHg5MDA2LCAweDkwMDUsIDB4MDEyZSwgMHgwMGVlLCAweDAwZmUsIDB4MDBiZSwKKwkweDAwMDUsIDB4MDgwYywgMHg1NWVmLCAweDAxMTgsIDB4MjAwOSwgMHgwMDA3LCAweDAwZjgsIDB4YTk5OCwKKwkweGFlYjAsIDB4MDgwYywgMHg2NDlmLCAweDE5MDQsIDB4NjIyZiwgMHg5MTg2LCAweDAwN2YsIDB4MDEzMCwKKwkweDA4MGMsIDB4NjdjMywgMHgwMTE4LCAweDIwMDksIDB4MDAwOSwgMHgwMDgwLCAweDAwOTYsIDB4MDgwYywKKwkweDEwMzEsIDB4MTEyMCwgMHgwMDllLCAweDIwMDksIDB4MDAwMiwgMHgwMDQwLCAweDI5MDAsIDB4MDA5ZSwKKwkweGE4MDYsIDB4MDgwYywgMHhjMDFmLCAweDE5YjAsIDB4MjAwOSwgMHgwMDAzLCAweDIwMDEsIDB4NDAwNSwKKwkweDA4MDQsIDB4NjIzNiwgMHhhOTk4LCAweGFlYjAsIDB4MDgwYywgMHg2NDlmLCAweDE5MDQsIDB4NjIyZiwKKwkweDAwOTYsIDB4MDgwYywgMHgxMDMxLCAweDExMjgsIDB4MDA5ZSwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwKKwkweDYyZWUsIDB4MjkwMCwgMHgwMDllLCAweGE4MDYsIDB4MDA5NiwgMHgyMDQ4LCAweDIwYTksIDB4MDAyYiwKKwkweGI4YjQsIDB4MjBlMCwgMHhiOGI4LCAweDIwOTgsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMDIsIDB4MjBhMCwgMHg0MDAzLCAweDIwYTksIDB4MDAwOCwgMHg5MDgwLCAweDAwMDYsIDB4MjBhMCwKKwkweGJiYjgsIDB4OTM5OCwgMHgwMDA2LCAweDIzOTgsIDB4MDgwYywgMHgwZmFlLCAweDAwOWUsIDB4YTg3YiwKKwkweDAwMDAsIDB4YTg4MywgMHgwMDAwLCAweGE4OTcsIDB4NDAwMCwgMHhkNjg0LCAweDExNjgsIDB4MDgwYywKKwkweDU1ZGIsIDB4ZDBiNCwgMHgxMTE4LCAweGE4OWIsIDB4MDAwYiwgMHgwMGUwLCAweGI4MDAsIDB4ZDA4YywKKwkweDAxMTgsIDB4YTg5YiwgMHgwMDBjLCAweDAwYjAsIDB4MDgwYywgMHg2N2MzLCAweDAxMTgsIDB4YTg5YiwKKwkweDAwMDksIDB4MDA4MCwgMHgwODBjLCAweDU1ZWYsIDB4MDExOCwgMHhhODliLCAweDAwMDcsIDB4MDA1MCwKKwkweDA4MGMsIDB4YzAwMiwgMHgxOTA0LCAweDYyNmEsIDB4MjAwOSwgMHgwMDAzLCAweDIwMDEsIDB4NDAwNSwKKwkweDA4MDQsIDB4NjIzNiwgMHhhODdiLCAweDAwMzAsIDB4YTg5NywgMHg0MDA1LCAweGE4MDQsIDB4ODAwNiwKKwkweDgwMDYsIDB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwgMHhmZmMwLCAweDkwODAsIDB4MDAwMiwKKwkweDIwMDksIDB4MDAyYiwgMHhhYWEwLCAweGFiOWMsIDB4YWNhOCwgMHhhZGE0LCAweDIwMzEsIDB4MDAwMCwKKwkweDIwNDEsIDB4MTI4OCwgMHgwODBjLCAweGE1ZTYsIDB4MTkwNCwgMHg2MjZhLCAweDIwMDksIDB4MDAwMiwKKwkweDA4ZTgsIDB4MjAwMSwgMHgwMDI4LCAweDkwMGUsIDB4MDgwNCwgMHg2MjZiLCAweDIwMDksIDB4MTgwYywKKwkweDIxMGMsIDB4ZDE4YywgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDM4LCAweGQxODQsIDB4MDExOCwKKwkweDIwMDEsIDB4MDAwNCwgMHgwMDEwLCAweDIwMDEsIDB4MDAyOSwgMHg5MDBlLCAweDA4MDQsIDB4NjI2YiwKKwkweDIwMDEsIDB4MDAyOSwgMHg5MDBlLCAweDA4MDQsIDB4NjI2YiwgMHgwODBjLCAweDM3MTgsIDB4MDgwNCwKKwkweDYyNmMsIDB4MDgwYywgMHg1MzA2LCAweDA4MDQsIDB4NjI2YywgMHgwODBjLCAweDQ1NWUsIDB4MDgwNCwKKwkweDYyNmMsIDB4MDgwYywgMHg0NWQ3LCAweDA4MDQsIDB4NjI2YywgMHgwODBjLCAweDQ2MzMsIDB4MDgwNCwKKwkweDYyNmMsIDB4MDgwYywgMHg0YTk1LCAweDA4MDQsIDB4NjI2YywgMHgwODBjLCAweDRkM2UsIDB4MDgwNCwKKwkweDYyNmMsIDB4MDgwYywgMHg0ZjZlLCAweDA4MDQsIDB4NjI2YywgMHgwODBjLCAweDUxNjcsIDB4MDgwNCwKKwkweDYyNmMsIDB4MDgwYywgMHgzOTQxLCAweDA4MDQsIDB4NjI2YywgMHgwMGI2LCAweGE5NzQsIDB4YWU3OCwKKwkweDk2ODQsIDB4M2ZmZiwgMHg5MDgyLCAweDQwMDAsIDB4MTYxOCwgMHg5MTgyLCAweDA4MDAsIDB4MTI2OCwKKwkweDkxODgsIDB4MTAwMCwgMHgyMTA0LCAweDkwNWQsIDB4MDE0MCwgMHgwODBjLCAweDY3YzMsIDB4MTE0OCwKKwkweDAwZTksIDB4MDgwYywgMHg2NWNhLCAweDkwMDYsIDB4MDBiMCwgMHgyMDAxLCAweDAwMjgsIDB4OTAwZSwKKwkweDAwOTAsIDB4OTA4MiwgMHgwMDA2LCAweDEyNDAsIDB4YjkwMCwgMHhkMWZjLCAweDBkODgsIDB4MjAwMSwKKwkweDAwMjksIDB4MjAwOSwgMHgxMDAwLCAweDAwMzgsIDB4MjAwMSwgMHgwMDI5LCAweDkwMGUsIDB4MDAxOCwKKwkweDIwMDEsIDB4MDAyOSwgMHg5MDBlLCAweDkwMDUsIDB4MDBiZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4Yjg1MCwgMHg5MDBkLCAweDAxNTAsIDB4MjkwMCwgMHgwMDk2LCAweDIxNDgsIDB4YTgwMiwKKwkweDAwOWUsIDB4YTgwMywgMHgwMDAwLCAweGI4NTIsIDB4MDEyZSwgMHgwMDA1LCAweDI5MDAsIDB4Yjg1MiwKKwkweGI4NGUsIDB4YTgwMywgMHgwMDAwLCAweDBjYzAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4Yjg0YywKKwkweDkwMDUsIDB4MDE3MCwgMHgwMGU2LCAweDIwNzEsIDB4MTliZiwgMHg3MDA0LCAweDkwODYsIDB4MDAwMiwKKwkweDAxNjgsIDB4MDBlZSwgMHhiODRjLCAweGE4MDIsIDB4MjkwMCwgMHhiODRlLCAweDAxMmUsIDB4MDAwNSwKKwkweDI5MDAsIDB4Yjg1MiwgMHhiODRlLCAweGE4MDMsIDB4MDAwMCwgMHgwY2MwLCAweDcwMWMsIDB4OWIwNiwKKwkweDFkODAsIDB4Yjg0YywgMHgwMGE2LCAweDIwNTAsIDB4YjAwMCwgMHhhODAyLCAweDI5MDAsIDB4YjAwMiwKKwkweDAwYWUsIDB4MDBlZSwgMHgwMTJlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4Yjg0YywKKwkweDkwNGQsIDB4MDEzMCwgMHhhODAwLCAweDkwMDUsIDB4MTEwOCwgMHhiODUyLCAweGI4NGUsIDB4OTkwNSwKKwkweDAxMmUsIDB4MDAwNSwgMHhiODRjLCAweDkwNGQsIDB4MDEzMCwgMHhhODAwLCAweDkwMDUsIDB4MTEwOCwKKwkweGI4NTIsIDB4Yjg0ZSwgMHg5OTA1LCAweDAwMDUsIDB4MDBiNiwgMHgwMTI2LCAweDAwYzYsIDB4MDAyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHg2MjEwLCAweDIyNTgsIDB4YmEwMCwgMHg5MDA1LCAweDAxMTAsIDB4YzI4NSwKKwkweDAwMDgsIDB4YzI4NCwgMHhiYTAyLCAweDAwMmUsIDB4MDBjZSwgMHgwMTJlLCAweDAwYmUsIDB4MDAwNSwKKwkweDAwYjYsIDB4MDEyNiwgMHgwMGM2LCAweDIwOTEsIDB4ODAwMCwgMHg2MjEwLCAweDIyNTgsIDB4YmEwNCwKKwkweDAwMDYsIDB4OTA4NiwgMHgwMDA2LCAweDExNzAsIDB4Yjg5YywgMHhkMGFjLCAweDAxNTgsIDB4MDgwYywKKwkweDY3YmYsIDB4MDE0MCwgMHg5Mjg0LCAweGZmMDAsIDB4ODAwNywgMHg5MDg2LCAweDAwMDcsIDB4MTExMCwKKwkweDIwMTEsIDB4MDYwMCwgMHgwMDBlLCAweDkyOTQsIDB4ZmYwMCwgMHg5MjE1LCAweGJhMDYsIDB4MDAwNiwKKwkweDkwODYsIDB4MDAwNiwgMHgxMTIwLCAweGJhOTAsIDB4ODJmZiwgMHgwOTBjLCAweDBkZmEsIDB4MDAwZSwKKwkweDAwY2UsIDB4MDEyZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBiNiwgMHgwMTI2LCAweDAwYzYsIDB4MjA5MSwKKwkweDgwMDAsIDB4NjIxMCwgMHgyMjU4LCAweGJhMDQsIDB4MDAwNiwgMHg5MDg2LCAweDAwMDYsIDB4MTE2OCwKKwkweGI4OWMsIDB4ZDBhNCwgMHgwMTUwLCAweDA4MGMsIDB4NjdiYiwgMHgxMTM4LCAweDkyODQsIDB4MDBmZiwKKwkweDkwODYsIDB4MDAwNywgMHgxMTEwLCAweDIwMTEsIDB4MDAwNiwgMHgwMDBlLCAweDkyOTQsIDB4MDBmZiwKKwkweDgwMDcsIDB4OTIxNSwgMHhiYTA2LCAweDAwY2UsIDB4MDEyZSwgMHgwMGJlLCAweDAwMDUsIDB4OTE4MiwKKwkweDA4MDAsIDB4MDIxOCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMGQ2LCAweDAwMjYsIDB4OTE5MCwKKwkweDEwMDAsIDB4MjIwNCwgMHg5MDVkLCAweDExODAsIDB4MDA5NiwgMHgwODBjLCAweDEwMzEsIDB4Mjk1OCwKKwkweDAwOWUsIDB4MDE2MCwgMHgyYjAwLCAweDIwMTIsIDB4Yjg1YywgMHhiOGJhLCAweGI4NjAsIDB4YjhiNiwKKwkweDkwMDYsIDB4YjhhNiwgMHgwODBjLCAweDVmNDUsIDB4OTAwNiwgMHgwMDEwLCAweDkwODUsIDB4MDAwMSwKKwkweDAwMmUsIDB4MDBkZSwgMHgwMDA1LCAweDAwYjYsIDB4MDA5NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDAwMjYsIDB4OTE4MiwgMHgwODAwLCAweDAyMTgsIDB4OTA4NSwgMHgwMDAxLCAweDA0NTgsIDB4MDBkNiwKKwkweDkxOTAsIDB4MTAwMCwgMHgyMjA0LCAweDkwNWQsIDB4MDUxOCwgMHgyMDEzLCAweDAwMDAsIDB4YjhhNCwKKwkweDkwNGQsIDB4MDExMCwgMHgwODBjLCAweDEwNjMsIDB4MDBkNiwgMHgwMGM2LCAweGI4YWMsIDB4MjA2MCwKKwkweDhjZmYsIDB4MDE2OCwgMHg2MDBjLCAweDAwMDYsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4YmUzNywKKwkweDAxMTAsIDB4MDgwYywgMHgwZmUzLCAweDA4MGMsIDB4YTBlMywgMHgwMGNlLCAweDBjODgsIDB4MDBjZSwKKwkweDAwZGUsIDB4MmI0OCwgMHhiOGI4LCAweGI4NWUsIDB4YjhiNCwgMHhiODYyLCAweDA4MGMsIDB4MTA3MywKKwkweDAwZGUsIDB4OTAwNiwgMHgwMDJlLCAweDAxMmUsIDB4MDA5ZSwgMHgwMGJlLCAweDAwMDUsIDB4MDAxNiwKKwkweDkxODIsIDB4MDgwMCwgMHgwMjE4LCAweDkwODUsIDB4MDAwMSwgMHgwMDMwLCAweDkxODgsIDB4MTAwMCwKKwkweDIxMDQsIDB4OTA1ZCwgMHgwZGMwLCAweDkwMDYsIDB4MDAxZSwgMHgwMDA1LCAweDAwZDYsIDB4MDE1NiwKKwkweDAxMzYsIDB4MDE0NiwgMHg5MDA2LCAweGI4MGEsIDB4YjgwZSwgMHhiODAwLCAweGMwOGMsIDB4YjgwMiwKKwkweDA4MGMsIDB4NzIwNywgMHgxNTEwLCAweGI4YTAsIDB4OTA4NiwgMHgwMDdlLCAweDAxMjAsIDB4MDgwYywKKwkweGEwNjIsIDB4MTFkOCwgMHgwMDc4LCAweDcwNDAsIDB4ZDBlNCwgMHgwMWI4LCAweDAwYzYsIDB4MjA2MSwKKwkweDE5NWEsIDB4NzA0OCwgMHgyMDYyLCAweDcwNGMsIDB4NjAwNiwgMHg3MDUwLCAweDYwMGEsIDB4NzA1NCwKKwkweDYwMGUsIDB4MDBjZSwgMHg3MDNjLCAweDIwNjksIDB4MDE0MCwgMHg5MDA1LCAweDExMTAsIDB4MjAwMSwKKwkweDAwMDEsIDB4Njg4NiwgMHgyMDY5LCAweDE4MDAsIDB4NjhiMiwgMHg3MDQwLCAweGI4NWUsIDB4NzA0OCwKKwkweGI4NjIsIDB4NzA0YywgMHhiODY2LCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAyNzYsIDB4YjhiNCwKKwkweDIwZTgsIDB4YjhiOCwgMHg5MDg4LCAweDAwMGEsIDB4MjFhMCwgMHgyMGE5LCAweDAwMDQsIDB4NDAwMywKKwkweDIwOTksIDB4MDI3YSwgMHg5MDg4LCAweDAwMDYsIDB4MjFhMCwgMHgyMGE5LCAweDAwMDQsIDB4NDAwMywKKwkweDIwNjksIDB4MDIwMCwgMHg2ODE3LCAweDAwMDEsIDB4NzA0MCwgMHhiODZhLCAweDcxNDQsIDB4Yjk2ZSwKKwkweDcwNDgsIDB4Yjg3MiwgMHg3MDUwLCAweGI4NzYsIDB4MjA2OSwgMHgwMjAwLCAweDY4MTcsIDB4MDAwMCwKKwkweGI4YTAsIDB4OTA4NiwgMHgwMDdlLCAweDExMTAsIDB4NzE0NCwgMHhiOTZlLCAweDkxODIsIDB4MDIxMSwKKwkweDEyMTgsIDB4MjAwOSwgMHgwMDA4LCAweDA0MDAsIDB4OTE4MiwgMHgwMjU5LCAweDEyMTgsIDB4MjAwOSwKKwkweDAwMDcsIDB4MDBkMCwgMHg5MTgyLCAweDAyYzEsIDB4MTIxOCwgMHgyMDA5LCAweDAwMDYsIDB4MDBhMCwKKwkweDkxODIsIDB4MDM0OSwgMHgxMjE4LCAweDIwMDksIDB4MDAwNSwgMHgwMDcwLCAweDkxODIsIDB4MDQyMSwKKwkweDEyMTgsIDB4MjAwOSwgMHgwMDA0LCAweDAwNDAsIDB4OTE4MiwgMHgwNTgxLCAweDEyMTgsIDB4MjAwOSwKKwkweDAwMDMsIDB4MDAxMCwgMHgyMDA5LCAweDAwMDIsIDB4Yjk5MiwgMHgwMTRlLCAweDAxM2UsIDB4MDE1ZSwKKwkweDAwZGUsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsIDB4MDBlNiwgMHgyMDcxLCAweDAyNjAsIDB4NzAzNCwKKwkweGI4OTYsIDB4NzAzYywgMHhiODlhLCAweDcwNTQsIDB4Yjg5ZSwgMHgwMDM2LCAweGJiYmMsIDB4YzM4NCwKKwkweGJhMDAsIDB4MjAwOSwgMHgxODdiLCAweDIxMGMsIDB4ZDBiYywgMHgwMTIwLCAweGQxZWMsIDB4MDExMCwKKwkweGMyYWQsIDB4MDAwOCwgMHhjMmFjLCAweGQwYzQsIDB4MDE0OCwgMHhkMWU0LCAweDAxMzgsIDB4YzJiZCwKKwkweGQwY2MsIDB4MDEyOCwgMHhkMzhjLCAweDExMDgsIDB4YzM4NSwgMHgwMDA4LCAweGMyYmMsIDB4YmEwMiwKKwkweGJiYmUsIDB4MDAzZSwgMHgwMGVlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwOTYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHhiOGE0LCAweDkwNGQsIDB4MDU3OCwgMHhhOTAwLCAweDgxZmYsIDB4MTVjMCwKKwkweGFhMDQsIDB4OTI4MiwgMHgwMDEwLCAweDE2YzgsIDB4MDEzNiwgMHgwMTQ2LCAweDAxYzYsIDB4MDFkNiwKKwkweDg5MDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwOGMsIDB4MDAzZiwgMHgyMWUwLCAweDkwODQsIDB4ZmZjMCwKKwkweDkwODAsIDB4MDAwNCwgMHgyMDk4LCAweDIwMDksIDB4MDAxMCwgMHgyMGE5LCAweDAwMDEsIDB4NDAwMiwKKwkweDkwODYsIDB4ZmZmZiwgMHgwMTIwLCAweDgxMDksIDB4MWRkMCwgMHgwODBjLCAweDBkZmEsIDB4M2MwMCwKKwkweDIwZTgsIDB4MzMwMCwgMHg4MDAxLCAweDIwYTAsIDB4NDYwNCwgMHg4MjEwLCAweGFhMDYsIDB4MDFkZSwKKwkweDAxY2UsIDB4MDE0ZSwgMHgwMTNlLCAweDAwNjAsIDB4MDgwYywgMHgxMDMxLCAweDAxNzAsIDB4MjkwMCwKKwkweGI4YTYsIDB4YTgwMywgMHgwMDAwLCAweDA4MGMsIDB4NjY1YiwgMHhhODA3LCAweDAwMDEsIDB4YWUxMiwKKwkweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwOWUsIDB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwMDk2LCAweGI4YTQsIDB4OTA0ZCwgMHgwMTg4LCAweGE4MDAsIDB4OTAwNSwKKwkweDExNTAsIDB4MDgwYywgMHg2NjZhLCAweDExNTgsIDB4YTgwNCwgMHg5MDhhLCAweDAwMDIsIDB4MDIxOCwKKwkweDgwMDEsIDB4YTgwNiwgMHgwMDIwLCAweDA4MGMsIDB4MTA2MywgMHhiOGE3LCAweDAwMDAsIDB4MDA5ZSwKKwkweDAxMmUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDg2OTYsIDB4MDEyZSwKKwkweDAwMDUsIDB4OTAxZSwgMHgwMDEwLCAweDIwMTksIDB4MDAwMSwgMHg5MDBlLCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4Yjg0YywgMHgyMDQ4LCAweGI4MDAsIDB4ZDBkYywgMHgxMTcwLCAweDg5ZmYsIDB4MDUwMCwKKwkweDgzZmYsIDB4MDEyMCwgMHhhODc4LCAweDk2MDYsIDB4MDE1OCwgMHgwMDMwLCAweGE4NmMsIDB4OTQwNiwKKwkweDExMTgsIDB4YTg3MCwgMHg5NTA2LCAweDAxMjAsIDB4MjkwOCwgMHhhODAwLCAweDIwNDgsIDB4MGM3MCwKKwkweDA4MGMsIDB4OWE0ZSwgMHhhYTAwLCAweGI4NGMsIDB4OTkwNiwgMHgxMTEwLCAweGJhNGUsIDB4MDAyMCwKKwkweDAwYTYsIDB4MjE1MCwgMHhiMjAyLCAweDAwYWUsIDB4ODJmZiwgMHgxMTEwLCAweGI5NTIsIDB4ODlmZiwKKwkweDAxMmUsIDB4MDAwNSwgMHg5MDE2LCAweDA0ODksIDB4MTExMCwgMHgyMDExLCAweDAwMDEsIDB4MDAwNSwKKwkweDA4MGMsIDB4NjZiZiwgMHgwMTI4LCAweDA4MGMsIDB4YmVmNCwgMHgwMDEwLCAweDkwODUsIDB4MDAwMSwKKwkweDAwMDUsIDB4MDgwYywgMHg2NmJmLCAweDAxMjgsIDB4MDgwYywgMHhiZTk5LCAweDAwMTAsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAwNSwgMHgwODBjLCAweDY2YmYsIDB4MDEyOCwgMHgwODBjLCAweGJlZjEsIDB4MDAxMCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDA4MGMsIDB4NjZiZiwgMHgwMTI4LCAweDA4MGMsIDB4YmViOCwKKwkweDAwMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDgwYywgMHg2NmJmLCAweDAxMjgsIDB4MDgwYywKKwkweGJmMzcsIDB4MDAxMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHhiOGE0LCAweDkwMGQsIDB4MTExOCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAxMzYsIDB4MDFjNiwgMHhhODAwLCAweDkwMDUsIDB4MTFiOCwKKwkweDg5MGUsIDB4ODEwZSwgMHg4MTBmLCAweDkxODQsIDB4MDAzZiwgMHgyMGUwLCAweDkxODQsIDB4ZmZjMCwKKwkweDkwODAsIDB4MDAwNCwgMHgyMDk4LCAweDIwYTksIDB4MDAwMSwgMHgyMDA5LCAweDAwMTAsIDB4NDAwMiwKKwkweDk2MDYsIDB4MDEyOCwgMHg4MTA5LCAweDFkZDgsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDgsIDB4OTAwNiwKKwkweDAxY2UsIDB4MDEzZSwgMHgwMDA1LCAweDAxNDYsIDB4MDFkNiwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywKKwkweDkwODAsIDB4MDAwNCwgMHgyMGEwLCAweDIwYTksIDB4MDAxMCwgMHgyMDA5LCAweGZmZmYsIDB4NDEwNCwKKwkweDAxZGUsIDB4MDE0ZSwgMHgwMTM2LCAweDAxYzYsIDB4YTgwMCwgMHg5MDA1LCAweDExYjgsIDB4ODkwZSwKKwkweDgxMGUsIDB4ODEwZiwgMHg5MTg0LCAweDAwM2YsIDB4MjBlMCwgMHg5MTg0LCAweGZmYzAsIDB4OTA4MCwKKwkweDAwMDQsIDB4MjA5OCwgMHgyMGE5LCAweDAwMDEsIDB4MjAwOSwgMHgwMDEwLCAweDQwMDIsIDB4OTYwNiwKKwkweDAxMjgsIDB4ODEwOSwgMHgxZGQ4LCAweDkwODUsIDB4MDAwMSwgMHgwMDY4LCAweDAxNDYsIDB4MDFkNiwKKwkweDMzMDAsIDB4ODAwMSwgMHgyMGEwLCAweDNjMDAsIDB4MjBlOCwgMHgyMDAxLCAweGZmZmYsIDB4NDAwNCwKKwkweDAxZGUsIDB4MDE0ZSwgMHg5MDA2LCAweDAxY2UsIDB4MDEzZSwgMHgwMDA1LCAweDAwOTYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHhiOGE0LCAweDkwNGQsIDB4MTEyOCwgMHgwODBjLCAweDEwMzEsIDB4MDE2OCwKKwkweDI5MDAsIDB4YjhhNiwgMHgwODBjLCAweDY2NWIsIDB4YTgwMywgMHgwMDAxLCAweGE4MDcsIDB4MDAwMCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwOWUsIDB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4MDA5NiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGI4YTQsIDB4OTA0ZCwgMHgwMTMwLCAweGI4YTcsIDB4MDAwMCwKKwkweDA4MGMsIDB4MTA2MywgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMDllLCAweDAwMDUsIDB4Yjg5YywKKwkweGQwYTQsIDB4MDAwNSwgMHgwMGI2LCAweDAwZjYsIDB4MDgwYywgMHg3MjA3LCAweDAxYjAsIDB4NzFjMCwKKwkweDgxZmYsIDB4MTE5OCwgMHg3MWQ4LCAweGQxOWMsIDB4MDE4MCwgMHgyMDAxLCAweDAwN2UsIDB4OTA4MCwKKwkweDEwMDAsIDB4MjAwNCwgMHg5MDVkLCAweDAxNDgsIDB4YjgwNCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwKKwkweDAwMDYsIDB4MTExOCwgMHhiODAwLCAweGMwZWQsIDB4YjgwMiwgMHgyMDc5LCAweDE4NWIsIDB4NzgwNCwKKwkweDAwZDAsIDB4MDE1NiwgMHgyMGE5LCAweDAwN2YsIDB4OTAwZSwgMHgwMDE2LCAweDA4MGMsIDB4NjQ5ZiwKKwkweDExNjgsIDB4YjgwNCwgMHg5MDg0LCAweGZmMDAsIDB4ODAwNywgMHg5MDk2LCAweDAwMDQsIDB4MDExOCwKKwkweDkwODYsIDB4MDAwNiwgMHgxMTE4LCAweGI4MDAsIDB4YzBlZCwgMHhiODAyLCAweDAwMWUsIDB4ODEwOCwKKwkweDFmMDQsIDB4NjZlNSwgMHgwMTVlLCAweDA4MGMsIDB4Njc4MSwgMHgwMTIwLCAweDIwMDEsIDB4MTk1ZCwKKwkweDIwMGMsIDB4MDAzMCwgMHgyMDc5LCAweDE4NWIsIDB4NzgwNCwgMHgwMDMwLCAweDIwMDksIDB4MDdkMCwKKwkweDIwMTEsIDB4NjcwZiwgMHgwODBjLCAweDgzNmMsIDB4MDBmZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBiNiwKKwkweDIwMTEsIDB4NjcwZiwgMHgwODBjLCAweDgyZGEsIDB4MDgwYywgMHg2NzgxLCAweDAxZDgsIDB4MjAwMSwKKwkweDEwN2UsIDB4MjAwNCwgMHgyMDU4LCAweGI5MDAsIDB4YzFlYywgMHhiOTAyLCAweDA4MGMsIDB4NjdiZiwKKwkweDAxMzAsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsIDB4NjcwZiwgMHgwODBjLCAweDgzNmMsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTgwMCwgMHg5MDA2LCAweDcwN2EsIDB4NzA1YywgMHg3MDdlLCAweDA4MGMsIDB4MmY2YywKKwkweDAwZWUsIDB4MDRiMCwgMHgwMTU2LCAweDAwYzYsIDB4MjBhOSwgMHgwMDdmLCAweDkwMGUsIDB4MDAxNiwKKwkweDA4MGMsIDB4NjQ5ZiwgMHgxNTM4LCAweGI4MDAsIDB4ZDBlYywgMHgwNTIwLCAweDAwNDYsIDB4YmFhMCwKKwkweDIyMjAsIDB4OTAwNiwgMHgyMDA5LCAweDAwMjksIDB4MDgwYywgMHhkODg1LCAweGI4MDAsIDB4YzBlNSwKKwkweGMwZWMsIDB4YjgwMiwgMHgwODBjLCAweDY3YmIsIDB4MjAwMSwgMHgwNzA3LCAweDExMjgsIDB4YjgwNCwKKwkweDkwODQsIDB4MDBmZiwgMHg5MDg1LCAweDA3MDAsIDB4YjgwNiwgMHgyMDE5LCAweDAwMjksIDB4MDgwYywKKwkweDg4MDMsIDB4MDA3NiwgMHg5MDNlLCAweDA4MGMsIDB4ODZmMSwgMHg5MDBlLCAweDA4MGMsIDB4ZDVmNiwKKwkweDAwN2UsIDB4MDA0ZSwgMHgwMDFlLCAweDgxMDgsIDB4MWYwNCwgMHg2NzM3LCAweDAwY2UsIDB4MDE1ZSwKKwkweDAwYmUsIDB4MDAwNSwgMHgwMGI2LCAweDYwMTAsIDB4MjA1OCwgMHhiODAwLCAweGMwZWMsIDB4YjgwMiwKKwkweDAwYmUsIDB4MDAwNSwgMHg3ODEwLCAweDAwYjYsIDB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBhYywKKwkweDAwMDUsIDB4NjAxMCwgMHgwMGI2LCAweDkwNWQsIDB4MDEwOCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywKKwkweDAwMDUsIDB4MDBiNiwgMHgwMGY2LCAweDIwMDEsIDB4MTA3ZSwgMHgyMDA0LCAweDkwNWQsIDB4MDExMCwKKwkweGI4MDAsIDB4ZDBlYywgMHgwMGZlLCAweDAwYmUsIDB4MDAwNSwgMHgwMTI2LCAweDAwMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDAwNiwgMHhiYWEwLCAweDkyOTAsIDB4MTAwMCwgMHgyMjA0LCAweDliMDYsIDB4MTkwYywKKwkweDBkZmEsIDB4MDAwZSwgMHhiYTAwLCAweDkwMDUsIDB4MDExMCwgMHhjMmZkLCAweDAwMDgsIDB4YzJmYywKKwkweGJhMDIsIDB4MDAyZSwgMHgwMTJlLCAweDAwMDUsIDB4MjAxMSwgMHgxODM2LCAweDIyMDQsIDB4ZDBjYywKKwkweDAxMzgsIDB4MjAwMSwgMHgxOTViLCAweDIwMGMsIDB4MjAxMSwgMHg2N2IxLCAweDA4MGMsIDB4ODM2YywKKwkweDAwMDUsIDB4MjAxMSwgMHg2N2IxLCAweDA4MGMsIDB4ODJkYSwgMHgyMDExLCAweDE4MzYsIDB4MjIwNCwKKwkweGMwY2MsIDB4MjAxMiwgMHgwMDA1LCAweDA4MGMsIDB4NTVkYiwgMHhkMGFjLCAweDAwMDUsIDB4MDgwYywKKwkweDU1ZGIsIDB4ZDBhNCwgMHgwMDA1LCAweDAwMTYsIDB4YjkwNCwgMHg5MTg0LCAweDAwZmYsIDB4OTA4ZSwKKwkweDAwMDYsIDB4MDAxZSwgMHgwMDA1LCAweDAwMTYsIDB4YjkwNCwgMHg5MTg0LCAweGZmMDAsIDB4ODAwNywKKwkweDkwOGUsIDB4MDAwNiwgMHgwMDFlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGY2LCAweDA4MGMsIDB4YzUzOSwKKwkweDAxNTgsIDB4NzBkOCwgMHg5MDg0LCAweDAwMjgsIDB4MDEzOCwgMHgyMDAxLCAweDEwN2YsIDB4MjAwNCwKKwkweDkwNWQsIDB4MDExMCwgMHhiOGJjLCAweGQwOTQsIDB4MDBmZSwgMHgwMGJlLCAweDAwMDUsIDB4MDAwNiwKKwkweDAwMTYsIDB4MDAzNiwgMHgwMDQ2LCAweDAwNzYsIDB4MDBiNiwgMHgyMDAxLCAweDE4MTcsIDB4MjAzYywKKwkweDk3ODAsIDB4MzJlOSwgMHgyMDNkLCAweDk3YmMsIDB4ZmYwMCwgMHg4NzNmLCAweDkwMDYsIDB4MjAxOCwKKwkweDIwMDgsIDB4OTI4NCwgMHg4MDAwLCAweDAxMTAsIDB4MjAxOSwgMHgwMDAxLCAweDkyOTQsIDB4N2ZmZiwKKwkweDIxMDAsIDB4OTcwNiwgMHgwMTkwLCAweDkxYTAsIDB4MTAwMCwgMHgyNDA0LCAweDkwNWQsIDB4MDE2OCwKKwkweGI4MDQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwNiwgMHgxMTM4LCAweDgzZmYsIDB4MDExOCwKKwkweGI4OWMsIDB4ZDBhNCwgMHgwMTEwLCAweDgyMTEsIDB4MDE1OCwgMHg4MTA4LCAweDgzZmYsIDB4MDEyMCwKKwkweDkxODIsIDB4MDgwMCwgMHgwZTI4LCAweDAwNjgsIDB4OTE4MiwgMHgwMDdlLCAweDBlMDgsIDB4MDA0OCwKKwkweDAwYmUsIDB4MDA3ZSwgMHgwMDRlLCAweDAwM2UsIDB4MDAxZSwgMHg5MDg1LCAweDAwMDEsIDB4MDAwZSwKKwkweDAwMDUsIDB4MDBiZSwgMHgwMDdlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDFlLCAweDkwMDYsIDB4MDAwZSwKKwkweDAwMDUsIDB4MDA0NiwgMHgwMDU2LCAweDAwNzYsIDB4MDBiNiwgMHgyMTAwLCAweDkwODQsIDB4N2ZmZiwKKwkweDkwODAsIDB4MTAwMCwgMHgyMDA0LCAweDkwNWQsIDB4MDEzMCwgMHhiODA0LCAweDkwODQsIDB4MDBmZiwKKwkweDkwODYsIDB4MDAwNiwgMHgwNTUwLCAweDkxODQsIDB4ODAwMCwgMHgwNTgwLCAweDIwMDEsIDB4MTgxNywKKwkweDIwM2MsIDB4OTc4MCwgMHgzMmU5LCAweDIwM2QsIDB4OTdiYywgMHhmZjAwLCAweDg3M2YsIDB4OTAwNiwKKwkweDIwMjAsIDB4MjQwMCwgMHg5NzA2LCAweDAxYTAsIDB4OTRhOCwgMHgxMDAwLCAweDI1MDQsIDB4OTA1ZCwKKwkweDAxNzgsIDB4YjgwNCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDA2LCAweDExNDgsIDB4Yjg5YywKKwkweGQwYTQsIDB4MDEzMCwgMHhiODE0LCAweDkyMDYsIDB4MTExOCwgMHhiODEwLCAweDkzMDYsIDB4MDEyOCwKKwkweDg0MjAsIDB4OTQ4MiwgMHgwODAwLCAweDBlMjgsIDB4MDA0OCwgMHg5MThjLCAweDdmZmYsIDB4MDBiZSwKKwkweDAwN2UsIDB4MDA1ZSwgMHgwMDRlLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDkxOGMsIDB4N2ZmZiwKKwkweDAwYmUsIDB4MDA3ZSwgMHgwMDVlLCAweDAwNGUsIDB4OTAwNiwgMHgwMDA1LCAweDIwNzEsIDB4MTkwZSwKKwkweDcwMDMsIDB4MDAwMSwgMHg3MDA3LCAweDAwMDAsIDB4OTAwNiwgMHg3MDEyLCAweDcwMTYsIDB4NzAxYSwKKwkweDcwMWUsIDB4NzAwYSwgMHg3MDQ2LCAweDAwMDUsIDB4MDAxNiwgMHgwMGU2LCAweDIwNzEsIDB4MTkyMSwKKwkweDkwMGUsIDB4NzEwYSwgMHgwODBjLCAweDU1ZGIsIDB4ZDBmYywgMHgxMTQwLCAweDA4MGMsIDB4NTVkYiwKKwkweDkwMGUsIDB4ZDA5YywgMHgwMTA4LCAweDgxMDgsIDB4NzEwMiwgMHgwNDAwLCAweDIwMDEsIDB4MTg3YiwKKwkweDIwMGMsIDB4OTE4NCwgMHgwMDA3LCAweDkwMDYsIDB4MDAwMiwgMHg2ODk2LCAweDY4OTYsIDB4Njg5NiwKKwkweDY4OTYsIDB4Njg5NiwgMHg2OGFkLCAweDY4YmIsIDB4Njg5NiwgMHg3MDAzLCAweDAwMDMsIDB4MjAwOSwKKwkweDE4N2MsIDB4MjEwYywgMHg5MTg0LCAweGZmMDAsIDB4ODAwNywgMHg5MDA1LCAweDExMTAsIDB4MjAwMSwKKwkweDAwMDIsIDB4NzAwNiwgMHgwMDE4LCAweDcwMDMsIDB4MDAwNSwgMHgwYzg4LCAweDAwZWUsIDB4MDAxZSwKKwkweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDAwNTAsIDB4Njg0YywgMHg5MDA1LCAweDExNTAsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTkwZSwgMHg3MDI4LCAweGMwODUsIDB4NzAyYSwgMHgwMGVlLCAweDkwODUsIDB4MDAwMSwKKwkweDA0ODgsIDB4Njg0NCwgMHg5MDA1LCAweDAxNTgsIDB4MDgwYywgMHg3NTc2LCAweDZhNjAsIDB4OTIwMCwKKwkweDcwMDIsIDB4Njg2NCwgMHg5MTAxLCAweDcwMDYsIDB4OTAwNiwgMHg3MDEyLCAweDcwMTYsIDB4Njg2MCwKKwkweDcwMDIsIDB4Njg2NCwgMHg3MDA2LCAweDY4NjgsIDB4NzAwYSwgMHg2ODZjLCAweDcwMGUsIDB4Njg0NCwKKwkweDkwMDUsIDB4MTExMCwgMHg3MDEyLCAweDcwMTYsIDB4Njg0YywgMHg3MDFhLCAweDcwMWMsIDB4OTA4NSwKKwkweDAwNDAsIDB4NzAxZSwgMHg3MDM3LCAweDAwMTksIDB4NzAyYiwgMHgwMDAxLCAweDAwZTYsIDB4MjA3MSwKKwkweDE5MGUsIDB4NzAyOCwgMHhjMDg0LCAweDcwMmEsIDB4NzAwNywgMHgwMDAxLCAweDcwMGIsIDB4MDAwMCwKKwkweDAwZWUsIDB4OTAwNiwgMHgwMGVlLCAweDAwMDUsIDB4YTg2OCwgMHhkMGZjLCAweDExZDgsIDB4MDBlNiwKKwkweDAwMjYsIDB4MjAwMSwgMHgxOTIxLCAweDIwMDQsIDB4OTAwNSwgMHgwOTA0LCAweDZhZWUsIDB4YTg3YywKKwkweGQwYmMsIDB4MTkwNCwgMHg2YWVlLCAweGE5NzgsIDB4YTg3NCwgMHg5MTA1LCAweDE5MDQsIDB4NmFlZSwKKwkweDIwMDEsIDB4MTkyMSwgMHgyMDA0LCAweDAwMDIsIDB4NmFlZSwgMHg2OTQ3LCAweDY5ODMsIDB4Njk4MywKKwkweDZhZWUsIDB4Njk4MywgMHgwMDA1LCAweGE4NjgsIDB4ZDBmYywgMHgxNTAwLCAweDAwZTYsIDB4MDAyNiwKKwkweDIwMDksIDB4MTkyMSwgMHgyMTBjLCAweDgxZmYsIDB4MDkwNCwgMHg2YWVlLCAweGE4N2MsIDB4ZDBjYywKKwkweDA5MDQsIDB4NmFlZSwgMHhhODgwLCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDEsIDB4MTkwNCwKKwkweDZhZWUsIDB4OTE4NiwgMHgwMDAzLCAweDA5MDQsIDB4Njk4MywgMHg5MTg2LCAweDAwMDUsIDB4MDkwNCwKKwkweDY5ODMsIDB4YTg0ZiwgMHg4MDIxLCAweGE4NTMsIDB4MDAxNywgMHgwMDI4LCAweDAwMDUsIDB4YTg0ZiwKKwkweDgwMjAsIDB4YTg1MywgMHgwMDE2LCAweDIwNzEsIDB4MTkwZSwgMHg3MDFjLCAweDkwMDUsIDB4MTkwNCwKKwkweDZjYTIsIDB4MGUwNCwgMHg2Y2VkLCAweDIwNzEsIDB4MDAwMCwgMHhhODRjLCAweDcwODIsIDB4YTg1MCwKKwkweDcwMzIsIDB4YTg2YywgMHg3MDg2LCAweDcwMzYsIDB4YTg3MCwgMHg3MDhhLCAweDIwOTEsIDB4NDA4MCwKKwkweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMWUwLCAweDIwNzEsIDB4MTgwMCwKKwkweDIwMTEsIDB4MDAwMSwgMHhhODA0LCAweDkwMGQsIDB4NzAyYywgMHgxMTU4LCAweGE4MDIsIDB4MjkwMCwKKwkweDcwMmUsIDB4NzBiYywgMHg5MjAwLCAweDcwYmUsIDB4MDgwYywgMHg4MWYwLCAweDAwMmUsIDB4MDBlZSwKKwkweDAwMDUsIDB4MDA5NiwgMHgyMTQ4LCAweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwKKwkweDFkYzgsIDB4MDA5ZSwgMHgwYzU4LCAweGE4NGYsIDB4MDAwMCwgMHgwMGY2LCAweDIwNzksIDB4MDA1MCwKKwkweDIwNzEsIDB4MTkwZSwgMHhhODAzLCAweDAwMDAsIDB4NzAxMCwgMHg5MDA1LCAweDE5MDQsIDB4NmE3MiwKKwkweDc4MmMsIDB4OTA4YywgMHgwNzgwLCAweDE5MGMsIDB4NmUxNiwgMHg4MDA0LCAweDgwMDQsIDB4ODAwNCwKKwkweDkwODQsIDB4MDAwMywgMHgwMDAyLCAweDY5YTEsIDB4NmE3MiwgMHg2OWM2LCAweDZhMGQsIDB4MDgwYywKKwkweDBkZmEsIDB4MjA3MSwgMHgxODAwLCAweDI5MDAsIDB4NzgyMiwgMHhhODA0LCAweDkwMGQsIDB4MTE3MCwKKwkweDIwNzEsIDB4MTlkMiwgMHg3MDNjLCAweDkwMDUsIDB4MTMyOCwgMHgyMDAxLCAweDE5MjIsIDB4MjAwNCwKKwkweDgwMDUsIDB4NzAzZSwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDkwMTYsIDB4NzAyYywKKwkweDIxNDgsIDB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwKKwkweDcwYmMsIDB4OTIwMCwgMHg3MGJlLCAweDA4MGMsIDB4ODFmMCwgMHgwYzEwLCAweDIwNzEsIDB4MTgwMCwKKwkweDI5MDAsIDB4NzgyMiwgMHhhODA0LCAweDkwMGQsIDB4MTU4MCwgMHg3ODI0LCAweDAwZTYsIDB4MjA3MSwKKwkweDAwNDAsIDB4NzEyYywgMHhkMTljLCAweDExNDgsIDB4MjAwOSwgMHgxODJmLCAweDIxMGMsIDB4OTE4YSwKKwkweDAwNDAsIDB4MDIxOCwgMHg3MDIyLCAweDAwZWUsIDB4MDA1OCwgMHgwMGVlLCAweDIwNDgsIDB4NzAyYywKKwkweGE4MDIsIDB4MjkwMCwgMHg3MDJlLCAweDcwYmMsIDB4ODAwMCwgMHg3MGJlLCAweDA4MGMsIDB4ODFmMCwKKwkweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NmUxNiwgMHhkMGE0LCAweDE5ZjAsIDB4MjA3MSwKKwkweDE5ZDIsIDB4NzAzYywgMHg5MDA1LCAweDEzMjgsIDB4MjAwMSwgMHgxOTIyLCAweDIwMDQsIDB4ODAwNSwKKwkweDcwM2UsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHg5MDE2LCAweDcwMmMsIDB4MjE0OCwKKwkweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwgMHgxZGM4LCAweDcwMmUsIDB4NzBiYywKKwkweDkyMDAsIDB4NzBiZSwgMHgwODBjLCAweDgxZjAsIDB4MDgwMCwgMHgwMDk2LCAweDAwZTYsIDB4NzgyNCwKKwkweDIwNDgsIDB4MjA3MSwgMHgxODAwLCAweDcwMmMsIDB4YTgwMiwgMHgyOTAwLCAweDcwMmUsIDB4NzBiYywKKwkweDgwMDAsIDB4NzBiZSwgMHgwODBjLCAweDgxZjAsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywKKwkweDZlMTYsIDB4ZDBhNCwgMHgxZDYwLCAweDAwZWUsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywKKwkweDZlMTYsIDB4ZDA5YywgMHgxMWEwLCAweDAwOWUsIDB4MjkwMCwgMHg3ODIyLCAweGE4MDQsIDB4OTAwZCwKKwkweDE1NjAsIDB4MjA3MSwgMHgxOWQyLCAweDcwM2MsIDB4OTAwNSwgMHgxMzI4LCAweDIwMDEsIDB4MTkyMiwKKwkweDIwMDQsIDB4ODAwNSwgMHg3MDNlLCAweDAwZmUsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4MDA5ZSwKKwkweDI5MDgsIDB4NzAxMCwgMHg4MDAwLCAweDcwMTIsIDB4NzAxOCwgMHg5MDRkLCAweDcxMWEsIDB4MDExMCwKKwkweGE5MDIsIDB4MDAwOCwgMHg3MTFlLCAweDIxNDgsIDB4YTgwNCwgMHg5MDBkLCAweDExNzAsIDB4MjA3MSwKKwkweDE5ZDIsIDB4NzAzYywgMHg5MDA1LCAweDEzMjgsIDB4MjAwMSwgMHgxOTIyLCAweDIwMDQsIDB4ODAwNSwKKwkweDcwM2UsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDcxLCAweDE4MDAsIDB4OTAxNiwKKwkweDcwMmMsIDB4MjE0OCwgMHhhOTA0LCAweGE4MDIsIDB4ODIxMCwgMHgyOTAwLCAweDgxZmYsIDB4MWRjOCwKKwkweDcwMmUsIDB4NzBiYywgMHg5MjAwLCAweDcwYmUsIDB4MDgwYywgMHg4MWYwLCAweDAwZmUsIDB4MDAyZSwKKwkweDAwZWUsIDB4MDAwNSwgMHgyOTA4LCAweDcwMTAsIDB4ODAwMCwgMHg3MDEyLCAweDcwMTgsIDB4OTA0ZCwKKwkweDcxMWEsIDB4MDExMCwgMHhhOTAyLCAweDAwMDgsIDB4NzExZSwgMHgyMTQ4LCAweGE4MDQsIDB4OTAwZCwKKwkweDE5MDQsIDB4NmFjNywgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDZlMTYsIDB4ZDA5YywKKwkweDExOTgsIDB4NzAxYywgMHg5MDRkLCAweDAxODAsIDB4NzAxMCwgMHg4MDAxLCAweDcwMTIsIDB4MTEwOCwKKwkweDcwMWEsIDB4YTgwMCwgMHg3MDFlLCAweDI5MDAsIDB4NzgyMiwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwKKwkweDE5MGMsIDB4NmUxNiwgMHhkMDljLCAweDBkNjgsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywKKwkweDZlMTYsIDB4ZDBhNCwgMHgwMWIwLCAweDAwZTYsIDB4NzgyNCwgMHgyMDQ4LCAweDIwNzEsIDB4MTgwMCwKKwkweDcwMmMsIDB4YTgwMiwgMHgyOTAwLCAweDcwMmUsIDB4NzBiYywgMHg4MDAwLCAweDcwYmUsIDB4MDgwYywKKwkweDgxZjAsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywgMHg2ZTE2LCAweGQwYTQsIDB4MWQ2MCwKKwkweDAwZWUsIDB4MjA3MSwgMHgxOWQyLCAweDcwM2MsIDB4OTAwNSwgMHgxMzI4LCAweDIwMDEsIDB4MTkyMiwKKwkweDIwMDQsIDB4ODAwNSwgMHg3MDNlLCAweDAwZmUsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTgwMCwgMHg5MDE2LCAweDcwMmMsIDB4MjE0OCwgMHhhOTA0LCAweGE4MDIsIDB4ODIxMCwKKwkweDI5MDAsIDB4ODFmZiwgMHgxZGM4LCAweDcwMmUsIDB4NzBiYywgMHg5MjAwLCAweDcwYmUsIDB4MDgwYywKKwkweDgxZjAsIDB4MDBlZSwgMHgwODA0LCAweDZhODIsIDB4YTg2OCwgMHhkMGZjLCAweDE5MDQsIDB4NmIyYSwKKwkweDAwOTYsIDB4YTgwNCwgMHhhODA3LCAweDAwMDAsIDB4OTA0ZCwgMHgxOTBjLCAweDBmZTMsIDB4MDA5ZSwKKwkweDAwMTgsIDB4YTg2OCwgMHhkMGZjLCAweDE1ZjAsIDB4MDBlNiwgMHgwMDI2LCAweGE4NGYsIDB4MDAwMCwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMDUwLCAweDIwNzEsIDB4MTgwMCwgMHg3MGU4LCAweDgwMDEsIDB4MDFkMCwKKwkweDE2NzgsIDB4MjA3MSwgMHgxOTBlLCAweGE4MDMsIDB4MDAwMCwgMHg3MDEwLCAweDkwMDUsIDB4MTkwNCwKKwkweDZjMjAsIDB4NzgyYywgMHg5MDhjLCAweDA3ODAsIDB4MTkwYywgMHg2ZTE2LCAweDgwMDQsIDB4ODAwNCwKKwkweDgwMDQsIDB4OTA4NCwgMHgwMDAzLCAweDAwMDIsIDB4NmIyYiwgMHg2YzIwLCAweDZiNDYsIDB4NmJiMywKKwkweDA4MGMsIDB4MGRmYSwgMHg3MGViLCAweDBmYTAsIDB4NzFlNCwgMHg4MTA3LCAweDkxMDYsIDB4OTA5NCwKKwkweDAwYzAsIDB4OTE4NCwgMHhmZjNmLCAweDkyMDUsIDB4NzBlNiwgMHgzYjA4LCAweDNhMDAsIDB4OTEwNCwKKwkweDkxOGQsIDB4MDBjMCwgMHgyMWQ4LCAweDkwODQsIDB4ZmYzZiwgMHg5MjA1LCAweDIwZDAsIDB4MDg4OCwKKwkweDcwZWEsIDB4MDg3OCwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwgMHgyOTAwLCAweDc4MjIsIDB4YTgwNCwKKwkweDkwMGQsIDB4MTEyMCwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDkwMTYsIDB4NzAyYywKKwkweDIxNDgsIDB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwKKwkweDcwYmMsIDB4OTIwMCwgMHg3MGJlLCAweDA4MGMsIDB4ODFmMCwgMHgwYzYwLCAweDIwNzEsIDB4MTgwMCwKKwkweDI5MDAsIDB4NzgyMiwgMHhhODA0LCAweDkwMGQsIDB4MTkwNCwgMHg2YmEyLCAweDc4MzAsIDB4ODAwNywKKwkweDkwODQsIDB4MDAxZiwgMHg5MDgyLCAweDAwMDEsIDB4MTIyMCwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwKKwkweDAwMDUsIDB4NzgyNCwgMHgwMGU2LCAweDIwNzEsIDB4MDA0MCwgMHg3MTJjLCAweGQxOWMsIDB4MTE0OCwKKwkweDIwMDksIDB4MTgyZiwgMHgyMTBjLCAweDkxOGEsIDB4MDA0MCwgMHgwMjE4LCAweDcwMjIsIDB4MDBlZSwKKwkweDAwNTgsIDB4MDBlZSwgMHgyMDQ4LCAweDcwMmMsIDB4YTgwMiwgMHgyOTAwLCAweDcwMmUsIDB4NzBiYywKKwkweDgwMDAsIDB4NzBiZSwgMHgwODBjLCAweDgxZjAsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywKKwkweDZlMTYsIDB4ZDBhNCwgMHgxOWYwLCAweDBlMDQsIDB4NmI5OSwgMHg3ODM4LCAweDc5MzgsIDB4OTEwZSwKKwkweDFkZTAsIDB4MDBkNiwgMHgyMDY5LCAweDAwMDAsIDB4NjgzNiwgMHg2ODMzLCAweDAwMTMsIDB4MDBkZSwKKwkweDIwMDEsIDB4MTkxZiwgMHgyMDBjLCAweGMxODQsIDB4MjEwMiwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwKKwkweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDE5MGMsIDB4MTFlMCwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwKKwkweDAwMDUsIDB4MjAwMSwgMHgxOTFmLCAweDIwMGMsIDB4YzE4NSwgMHgyMTAyLCAweDAwZmUsIDB4MDAyZSwKKwkweDAwZWUsIDB4MDAwNSwgMHg5MDE2LCAweDcwMmMsIDB4MjE0OCwgMHhhOTA0LCAweGE4MDIsIDB4ODIxMCwKKwkweDI5MDAsIDB4ODFmZiwgMHgxZGM4LCAweDcwMmUsIDB4NzBiYywgMHg5MjAwLCAweDcwYmUsIDB4MDgwYywKKwkweDgxZjAsIDB4MDgwNCwgMHg2YjU5LCAweDAwOTYsIDB4MDBlNiwgMHg3ODI0LCAweDIwNDgsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzAyYywgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGJjLCAweDgwMDAsIDB4NzBiZSwKKwkweDA4MGMsIDB4ODFmMCwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDZlMTYsIDB4ZDBhNCwKKwkweDFkNjAsIDB4MDBlZSwgMHgwZTA0LCAweDZiZjMsIDB4NzgzOCwgMHg3OTM4LCAweDkxMGUsIDB4MWRlMCwKKwkweDAwZDYsIDB4MjA2OSwgMHgwMDAwLCAweDY4MzYsIDB4NjgzMywgMHgwMDEzLCAweDAwZGUsIDB4NzA0NCwKKwkweGMwODQsIDB4NzA0NiwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwKKwkweDE5MGMsIDB4MTFlMCwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDZlMTYsIDB4ZDA5YywKKwkweDExNzAsIDB4MDA5ZSwgMHgyOTAwLCAweDc4MjIsIDB4YTgwNCwgMHg5MDBkLCAweDExZTAsIDB4MDBmZSwKKwkweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDcwNDQsIDB4YzA4NSwgMHg3MDQ2LCAweDBjNTgsIDB4MDA5ZSwKKwkweDI5MDgsIDB4NzAxMCwgMHg4MDAwLCAweDcwMTIsIDB4NzAxOCwgMHg5MDRkLCAweDcxMWEsIDB4MDExMCwKKwkweGE5MDIsIDB4MDAwOCwgMHg3MTFlLCAweDIxNDgsIDB4YTgwNCwgMHg5MDBkLCAweDExMjAsIDB4MDBmZSwKKwkweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwgMHg5MDE2LCAweDcwMmMsIDB4MjE0OCwKKwkweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwgMHgxZGM4LCAweDcwMmUsIDB4NzBiYywKKwkweDkyMDAsIDB4NzBiZSwgMHgwODBjLCAweDgxZjAsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwKKwkweDI5MDgsIDB4NzAxMCwgMHg4MDAwLCAweDcwMTIsIDB4NzAxOCwgMHg5MDRkLCAweDcxMWEsIDB4MDExMCwKKwkweGE5MDIsIDB4MDAwOCwgMHg3MTFlLCAweDIxNDgsIDB4YTgwNCwgMHg5MDBkLCAweDE5MDQsIDB4NmM4ZCwKKwkweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NmUxNiwgMHhkMDljLCAweDExYjAsIDB4NzAxYywKKwkweDkwNGQsIDB4MDE5OCwgMHhhODRjLCAweDkwMDUsIDB4MTE4MCwgMHg3MDEwLCAweDgwMDEsIDB4NzAxMiwKKwkweDExMDgsIDB4NzAxYSwgMHhhODAwLCAweDcwMWUsIDB4MjkwMCwgMHg3ODIyLCAweDc4MmMsIDB4OTA5NCwKKwkweDA3ODAsIDB4MTkwYywgMHg2ZTE2LCAweGQwOWMsIDB4MGQ1MCwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwKKwkweDE5MGMsIDB4NmUxNiwgMHhkMGE0LCAweDA1YTgsIDB4MDBlNiwgMHg3ODI0LCAweDIwNDgsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzAyYywgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGJjLCAweDgwMDAsIDB4NzBiZSwKKwkweDA4MGMsIDB4ODFmMCwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDZlMTYsIDB4ZDBhNCwKKwkweDFkNjAsIDB4MDBlZSwgMHgwZTA0LCAweDZjODYsIDB4NzgzOCwgMHg3OTM4LCAweDkxMGUsIDB4MWRlMCwKKwkweDAwZDYsIDB4MjA2OSwgMHgwMDAwLCAweDY4MzYsIDB4NjgzMywgMHgwMDEzLCAweDAwZGUsIDB4NzA0NCwKKwkweGMwODQsIDB4NzA0NiwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwKKwkweDE5MGMsIDB4MTFlMCwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDcwNDQsIDB4YzA4NSwKKwkweDcwNDYsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwKKwkweDkwMTYsIDB4NzAyYywgMHgyMTQ4LCAweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwKKwkweDFkYzgsIDB4NzAyZSwgMHg3MGJjLCAweDkyMDAsIDB4NzBiZSwgMHgwODBjLCAweDgxZjAsIDB4MDBlZSwKKwkweDA4MDQsIDB4NmMzMCwgMHgyMDcxLCAweDE5MGUsIDB4YTgwMywgMHgwMDAwLCAweDI5MDgsIDB4NzAxMCwKKwkweDgwMDAsIDB4NzAxMiwgMHg3MDE4LCAweDkwNGQsIDB4NzExYSwgMHgwMTEwLCAweGE5MDIsIDB4MDAwOCwKKwkweDcxMWUsIDB4MjE0OCwgMHhhODA0LCAweDkwMGQsIDB4MTEyOCwgMHgxZTA0LCAweDZjY2QsIDB4MDAyZSwKKwkweDAwZWUsIDB4MDAwNSwgMHgyMDcxLCAweDE4MDAsIDB4OTAxNiwgMHg3MDJjLCAweDIxNDgsIDB4YTkwNCwKKwkweGE4MDIsIDB4ODIxMCwgMHgyOTAwLCAweDgxZmYsIDB4MWRjOCwgMHg3MDJlLCAweDcwYmMsIDB4OTIwMCwKKwkweDcwYmUsIDB4MDgwYywgMHg4MWYwLCAweDBlMDQsIDB4NmNiNywgMHgyMDcxLCAweDE5MGUsIDB4NzAxYywKKwkweDIwNDgsIDB4YTg0YywgMHg5MDBkLCAweDBkMTgsIDB4MjA3MSwgMHgwMDAwLCAweDcxODIsIDB4YTg1MCwKKwkweDcwMzIsIDB4YTg2YywgMHg3MDg2LCAweDcwMzYsIDB4YTg3MCwgMHg3MDhhLCAweDIwOTEsIDB4NDA4MCwKKwkweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMWUwLCAweDIwNzEsIDB4MTkwZSwKKwkweDA4MGMsIDB4NmUwMiwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDcxLCAweDE5MGUsIDB4YTgwMywKKwkweDAwMDAsIDB4MjkwOCwgMHg3MDEwLCAweDgwMDAsIDB4NzAxMiwgMHg3MDE4LCAweDkwNGQsIDB4NzExYSwKKwkweDAxMTAsIDB4YTkwMiwgMHgwMDA4LCAweDcxMWUsIDB4MjE0OCwgMHhhODA0LCAweDkwMGQsIDB4MTExOCwKKwkweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwgMHg5MDE2LCAweDcwMmMsIDB4MjE0OCwKKwkweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwgMHgxZGM4LCAweDcwMmUsIDB4NzBiYywKKwkweDkyMDAsIDB4NzBiZSwgMHgwODBjLCAweDgxZjAsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4MDAwNiwKKwkweGE4N2MsIDB4MDAwNiwgMHhhODY3LCAweDAxMDMsIDB4MjBhOSwgMHgwMDFjLCAweGE4NjAsIDB4MjBlOCwKKwkweGE4NWMsIDB4OTA4MCwgMHgwMDFkLCAweDIwYTAsIDB4OTAwNiwgMHg0MDA0LCAweDAwMGUsIDB4OTA4NCwKKwkweDAwZmYsIDB4YTg3ZSwgMHgwMDBlLCAweGE4N2EsIDB4YTk4MiwgMHgwMDA1LCAweDIwNzEsIDB4MTkwZSwKKwkweDcwMDQsIDB4MDAwMiwgMHg2ZDNhLCAweDZkM2IsIDB4NmUwMSwgMHg2ZDNiLCAweDZkMzgsIDB4NmUwMSwKKwkweDA4MGMsIDB4MGRmYSwgMHgwMDA1LCAweDIwMDEsIDB4MTkyMSwgMHgyMDA0LCAweDAwMDIsIDB4NmQ0NSwKKwkweDZkNDUsIDB4NmQ5YSwgMHg2ZDliLCAweDZkNDUsIDB4NmQ5YiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDFlMGMsIDB4NmUyMSwgMHg3MDFjLCAweDkwNGQsIDB4MDFlMCwgMHhhODRjLCAweDkwMDUsIDB4MDFkOCwKKwkweDBlMDQsIDB4NmQ2OSwgMHhhOTRjLCAweDIwNzEsIDB4MDAwMCwgMHg3MTgyLCAweGE4NTAsIDB4NzAzMiwKKwkweGE4NmMsIDB4NzA4NiwgMHg3MDM2LCAweGE4NzAsIDB4NzA4YSwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwKKwkweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDE5MGMsIDB4MTFlMCwgMHgyMDcxLCAweDE5MGUsIDB4MDgwYywKKwkweDZlMDIsIDB4MDEyZSwgMHgwNDcwLCAweDIwMDEsIDB4MDA1YiwgMHgyMDA0LCAweDkwOTQsIDB4MDc4MCwKKwkweDE5MGMsIDB4NmUxNiwgMHhkMDljLCAweDIwNzEsIDB4MTkwZSwgMHgxNTEwLCAweDIwNzEsIDB4MTkwZSwKKwkweDcwMGYsIDB4MDAwMSwgMHhhOTY0LCAweDkxODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDMsIDB4MTEzMCwKKwkweDgxMGYsIDB4OTE4YywgMHgwMGZmLCAweDgxMDEsIDB4MDEwOCwgMHg3MTBlLCAweDI5MDAsIDB4MDBkNiwKKwkweDIwNjksIDB4MDA1MCwgMHg2ODIyLCAweDAwZGUsIDB4MjA3MSwgMHgxOTBlLCAweDcwMWMsIDB4MjA0OCwKKwkweDcwMTAsIDB4ODAwMSwgMHg3MDEyLCAweGE4MDAsIDB4NzAxZSwgMHg5MDA1LCAweDExMDgsIDB4NzAxYSwKKwkweDAxMmUsIDB4MDAwNSwgMHgwMDA1LCAweDAwZDYsIDB4MjAwOCwgMHgyMDY5LCAweDE5ZDIsIDB4NjgzYywKKwkweDkwMDUsIDB4MDc2MCwgMHgwMTU4LCAweDkxODYsIDB4MDAwMywgMHgwNTQwLCAweDIwMDEsIDB4MTgxNCwKKwkweDIwMDQsIDB4MjAwOSwgMHgxYWEyLCAweDIxMGMsIDB4OTEwMiwgMHgxNTAwLCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA2OSwgMHgwMDUwLCAweDY5M2MsIDB4NjgzOCwgMHg5MTA2LCAweDAxOTAsIDB4MGUwNCwKKwkweDZkY2QsIDB4MjA2OSwgMHgwMDAwLCAweDY4MzcsIDB4ODA0MCwgMHg2ODMzLCAweDAwMTIsIDB4Njg4MywKKwkweDgwNDAsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywKKwkweDExZTAsIDB4MjA2OSwgMHgxOWQyLCAweDY4M2YsIDB4ZmZmZiwgMHgwMTJlLCAweDAwZGUsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgxZTBjLCAweDZlODIsIDB4NzAxYywgMHg5MDRkLCAweDA1NDAsIDB4MjAwMSwKKwkweDAwNWIsIDB4MjAwNCwgMHg5MDk0LCAweDA3ODAsIDB4MTVjOSwgMHhkMDljLCAweDE1MDAsIDB4MjA3MSwKKwkweDE5MGUsIDB4NzAwZiwgMHgwMDAxLCAweGE5NjQsIDB4OTE4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwMywKKwkweDExMzAsIDB4ODEwZiwgMHg5MThjLCAweDAwZmYsIDB4ODEwMSwgMHgwMTA4LCAweDcxMGUsIDB4MjkwMCwKKwkweDAwZDYsIDB4MjA2OSwgMHgwMDUwLCAweDY4MjIsIDB4MDBkZSwgMHg3MDFjLCAweDIwNDgsIDB4NzAxMCwKKwkweDgwMDEsIDB4NzAxMiwgMHhhODAwLCAweDcwMWUsIDB4OTAwNSwgMHgxMTA4LCAweDcwMWEsIDB4MDEyZSwKKwkweDAwMDUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDFjLCAweDkwNGQsIDB4MDE2MCwKKwkweDcwMTAsIDB4ODAwMSwgMHg3MDEyLCAweGE4MDAsIDB4NzAxZSwgMHg5MDA1LCAweDExMDgsIDB4NzAxYSwKKwkweDAxMmUsIDB4MDgwYywgMHgxMDYzLCAweDAwMDUsIDB4MDEyZSwgMHgwMDA1LCAweDIwOTEsIDB4ODAwMCwKKwkweDBlMDQsIDB4NmUxOCwgMHgwMDA2LCAweDAwMTYsIDB4MjAwMSwgMHg4MDA0LCAweDAwMDYsIDB4MDgwNCwKKwkweDBlMDMsIDB4MDA5NiwgMHgwMGY2LCAweDIwNzksIDB4MDA1MCwgMHg3MDQ0LCAweGQwODQsIDB4MDFjMCwKKwkweGMwODQsIDB4NzA0NiwgMHg3ODM4LCAweDc5MzgsIDB4OTEwZSwgMHgxZGUwLCAweDAwZDYsIDB4MjA2OSwKKwkweDAwMDAsIDB4NjgzNiwgMHg2ODMzLCAweDAwMTMsIDB4MDBkZSwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwKKwkweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDE5MGMsIDB4MTFlMCwgMHgwMGZlLCAweDAwOWUsIDB4MDAwNSwKKwkweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5OTEsIDB4ZDBhNCwgMHgwZGI4LCAweDAwZTYsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzgyNCwgMHgwMGU2LCAweDIwNzEsIDB4MDA0MCwgMHg3MTJjLCAweGQxOWMsIDB4MTE0OCwKKwkweDIwMDksIDB4MTgyZiwgMHgyMTBjLCAweDkxOGEsIDB4MDA0MCwgMHgwMjE4LCAweDcwMjIsIDB4MDBlZSwKKwkweDAwNTgsIDB4MDBlZSwgMHgyMDQ4LCAweDcwMmMsIDB4YTgwMiwgMHgyOTAwLCAweDcwMmUsIDB4NzBiYywKKwkweDgwMDAsIDB4NzBiZSwgMHgwODBjLCAweDgxZjAsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywKKwkweDZlMTYsIDB4ZDBhNCwgMHgxOWYwLCAweDc4MzgsIDB4NzkzOCwgMHg5MTBlLCAweDFkZTAsIDB4MDBkNiwKKwkweDIwNjksIDB4MDAwMCwgMHg2ODM2LCAweDY4MzMsIDB4MDAxMywgMHgwMGRlLCAweDIwOTEsIDB4NDA4MCwKKwkweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMWUwLCAweDAwZWUsIDB4MDBmZSwKKwkweDAwOWUsIDB4MDAwNSwgMHgwMGY2LCAweDIwNzksIDB4MDA1MCwgMHg3MDQ0LCAweGQwODQsIDB4MDFiOCwKKwkweGMwODQsIDB4NzA0NiwgMHg3ODM4LCAweDc5MzgsIDB4OTEwZSwgMHgxZGUwLCAweDAwZDYsIDB4MjA2OSwKKwkweDAwMDAsIDB4NjgzNiwgMHg2ODMzLCAweDAwMTMsIDB4MDBkZSwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwKKwkweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDE5MGMsIDB4MTFlMCwgMHgwMGZlLCAweDAwMDUsIDB4NzgyYywKKwkweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDZlMTYsIDB4ZDBhNCwgMHgwZGI4LCAweDAwZTYsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzgyNCwgMHgyMDQ4LCAweDcwMmMsIDB4YTgwMiwgMHgyOTAwLCAweDcwMmUsIDB4NzBiYywKKwkweDgwMDAsIDB4NzBiZSwgMHgwODBjLCAweDgxZjAsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywKKwkweDZlMTYsIDB4ZDBhNCwgMHgxZDcwLCAweDAwZDYsIDB4MjA2OSwgMHgwMDUwLCAweDY5M2MsIDB4MjA2OSwKKwkweDE5MjEsIDB4NjgwOCwgMHg2OTBhLCAweDIwNjksIDB4MTlkMiwgMHg5MTAyLCAweDExMTgsIDB4NjgzYywKKwkweDkwMDUsIDB4MTMyOCwgMHgyMDAxLCAweDE5MjIsIDB4MjAwYywgMHg4MTBkLCAweDY5M2UsIDB4MDBkZSwKKwkweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDcwOTQsIDB4OTA4YSwgMHgwMDI5LCAweDFhMGMsIDB4MGRmYSwKKwkweDkwODIsIDB4MDAxZCwgMHgwMDFiLCAweDYwMjcsIDB4MWUwMCwgMHgwMDA1LCAweDZmYWEsIDB4NmYzMCwKKwkweDZmNGMsIDB4NmY3NiwgMHg2Zjk5LCAweDZmZDksIDB4NmZlYiwgMHg2ZjRjLCAweDZmYzEsIDB4NmVlYiwKKwkweDZmMTksIDB4NmVlYSwgMHgwMDA1LCAweDAwZDYsIDB4MjA2OSwgMHgwMjAwLCAweDY4MDQsIDB4OTAwNSwKKwkweDExODAsIDB4NjgwOCwgMHg5MDA1LCAweDE1MTgsIDB4NzA5NywgMHgwMDI4LCAweDIwNjksIDB4MTk2NywKKwkweDJkMDQsIDB4NzAwMiwgMHgwODBjLCAweDczNTksIDB4NjAyOCwgMHg5MDg1LCAweDA2MDAsIDB4NjAyYSwKKwkweDAwYjAsIDB4NzA5NywgMHgwMDI4LCAweDIwNjksIDB4MTk2NywgMHgyZDA0LCAweDcwMDIsIDB4NjAyOCwKKwkweDkwODUsIDB4MDYwMCwgMHg2MDJhLCAweDAwZTYsIDB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MjA3MSwKKwkweDFhM2EsIDB4MDgwYywgMHgxOWZmLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDNlLCAweDAwZWUsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsIDB4NjgwNCwgMHg5MDA1LCAweDExNzgsIDB4NjgwOCwKKwkweDkwMDUsIDB4MTE2MCwgMHg3MDk3LCAweDAwMjgsIDB4MjA2OSwgMHgxOTY3LCAweDJkMDQsIDB4NzAwMiwKKwkweDA4MGMsIDB4NzNmMywgMHg2MDI4LCAweDkwODUsIDB4MDYwMCwgMHg2MDJhLCAweDAwZGUsIDB4MDAwNSwKKwkweDAwMDYsIDB4MjAwMSwgMHgwMDkwLCAweDA4MGMsIDB4MmM4OCwgMHgwMDBlLCAweDYxMjQsIDB4ZDFlNCwKKwkweDExOTAsIDB4MDgwYywgMHg3MDU4LCAweGQxZDQsIDB4MTE2MCwgMHhkMWRjLCAweDExMzgsIDB4ZDFjYywKKwkweDAxNTAsIDB4NzA5NywgMHgwMDIwLCAweDA4MGMsIDB4NzA1OCwgMHgwMDI4LCAweDcwOTcsIDB4MDAxZCwKKwkweDAwMTAsIDB4NzA5NywgMHgwMDFmLCAweDAwMDUsIDB4MjAwMSwgMHgwMDg4LCAweDA4MGMsIDB4MmM4OCwKKwkweDYxMjQsIDB4ZDFjYywgMHgxMWU4LCAweGQxZGMsIDB4MTFjMCwgMHhkMWU0LCAweDExOTgsIDB4OTE4NCwKKwkweDFlMDAsIDB4MTFkOCwgMHgwODBjLCAweDFhMjQsIDB4NjBlMywgMHgwMDAxLCAweDYwMGMsIDB4YzBiNCwKKwkweDYwMGUsIDB4MDgwYywgMHg3MjMzLCAweDIwMDEsIDB4MDA4MCwgMHgwODBjLCAweDJjODgsIDB4NzA5NywKKwkweDAwMjgsIDB4MDA1OCwgMHg3MDk3LCAweDAwMWUsIDB4MDA0MCwgMHg3MDk3LCAweDAwMWQsIDB4MDAyOCwKKwkweDcwOTcsIDB4MDAyMCwgMHgwMDEwLCAweDcwOTcsIDB4MDAxZiwgMHgwMDA1LCAweDA4MGMsIDB4MWEyNCwKKwkweDYwZTMsIDB4MDAwMSwgMHg2MDBjLCAweGMwYjQsIDB4NjAwZSwgMHgwODBjLCAweDcyMzMsIDB4MjAwMSwKKwkweDAwODAsIDB4MDgwYywgMHgyYzg4LCAweDYxMjQsIDB4ZDFkNCwgMHgxMTgwLCAweGQxZGMsIDB4MTE1OCwKKwkweGQxZTQsIDB4MTEzMCwgMHg5MTg0LCAweDFlMDAsIDB4MTE1OCwgMHg3MDk3LCAweDAwMjgsIDB4MDA0MCwKKwkweDcwOTcsIDB4MDAxZSwgMHgwMDI4LCAweDcwOTcsIDB4MDAxZCwgMHgwMDEwLCAweDcwOTcsIDB4MDAxZiwKKwkweDAwMDUsIDB4MjAwMSwgMHgwMGEwLCAweDA4MGMsIDB4MmM4OCwgMHg2MTI0LCAweGQxZGMsIDB4MTEzOCwKKwkweGQxZTQsIDB4MDEzOCwgMHgwODBjLCAweDFhMjQsIDB4NzA5NywgMHgwMDFlLCAweDAwMTAsIDB4NzA5NywKKwkweDAwMWQsIDB4MDAwNSwgMHgwODBjLCAweDcwZGIsIDB4NjEyNCwgMHhkMWRjLCAweDExODgsIDB4MDgwYywKKwkweDcwNTgsIDB4MDAxNiwgMHgwODBjLCAweDFhMjQsIDB4MDAxZSwgMHhkMWQ0LCAweDExMjgsIDB4ZDFlNCwKKwkweDAxMzgsIDB4NzA5NywgMHgwMDFlLCAweDAwMjAsIDB4NzA5NywgMHgwMDFmLCAweDA4MGMsIDB4NzA1OCwKKwkweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweDAwYTAsIDB4MDgwYywgMHgyYzg4LCAweDAwMGUsIDB4NjEyNCwKKwkweGQxZDQsIDB4MTE2MCwgMHhkMWNjLCAweDExNTAsIDB4ZDFkYywgMHgxMTI4LCAweGQxZTQsIDB4MDE0MCwKKwkweDcwOTcsIDB4MDAxZSwgMHgwMDI4LCAweDcwOTcsIDB4MDAxZCwgMHgwMDEwLCAweDcwOTcsIDB4MDAyMSwKKwkweDAwMDUsIDB4MDgwYywgMHg3MGRiLCAweDYxMjQsIDB4ZDFkNCwgMHgxMTUwLCAweGQxZGMsIDB4MTEyOCwKKwkweGQxZTQsIDB4MDE0MCwgMHg3MDk3LCAweDAwMWUsIDB4MDAyOCwgMHg3MDk3LCAweDAwMWQsIDB4MDAxMCwKKwkweDcwOTcsIDB4MDAxZiwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHgwMDkwLCAweDA4MGMsIDB4MmM4OCwKKwkweDAwMGUsIDB4NjEyNCwgMHhkMWQ0LCAweDExNzgsIDB4ZDFjYywgMHgxMTUwLCAweGQxZGMsIDB4MTEyOCwKKwkweGQxZTQsIDB4MDE1OCwgMHg3MDk3LCAweDAwMWUsIDB4MDA0MCwgMHg3MDk3LCAweDAwMWQsIDB4MDAyOCwKKwkweDcwOTcsIDB4MDAyMCwgMHgwMDEwLCAweDcwOTcsIDB4MDAxZiwgMHgwMDA1LCAweDAwMTYsIDB4MDBjNiwKKwkweDAwZDYsIDB4MDBlNiwgMHgwMTI2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4MjA3MSwKKwkweDE4MDAsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NzIwNywgMHgxMWQ4LCAweDIwMDEsIDB4MTgwYywKKwkweDIwMGMsIDB4ZDFiNCwgMHgwMWIwLCAweGMxYjQsIDB4MjEwMiwgMHg2MDI3LCAweDAyMDAsIDB4MDgwYywKKwkweDJiYjAsIDB4NjAyNCwgMHhkMGNjLCAweDAxNDgsIDB4MjAwMSwgMHgwMGEwLCAweDA4MGMsIDB4MmM4OCwKKwkweDA4MGMsIDB4NzUwNCwgMHgwODBjLCAweDVmMmIsIDB4MDQyOCwgMHg2MDI4LCAweGMwY2QsIDB4NjAyYSwKKwkweDA0MDgsIDB4MDgwYywgMHg3MjIxLCAweDAxNTAsIDB4MDgwYywgMHg3MjE4LCAweDExMzgsIDB4MjAwMSwKKwkweDAwMDEsIDB4MDgwYywgMHgyNzE3LCAweDA4MGMsIDB4NzFkZiwgMHgwMGEwLCAweDA4MGMsIDB4NzBkOCwKKwkweDAxNzgsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjcxNywgMHg3MDk0LCAweDkwODYsIDB4MDAxZSwKKwkweDAxMjAsIDB4NzA5NCwgMHg5MDg2LCAweDAwMjIsIDB4MTExOCwgMHg3MDk3LCAweDAwMjUsIDB4MDAxMCwKKwkweDcwOTcsIDB4MDAyMSwgMHgwMTJlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwNSwKKwkweDAwMjYsIDB4MjAxMSwgMHg3MDY5LCAweDA4MGMsIDB4ODNhZSwgMHgwMDJlLCAweDAwMTYsIDB4MDAyNiwKKwkweDIwMDksIDB4MDA2NCwgMHgyMDExLCAweDcwNjksIDB4MDgwYywgMHg4M2E1LCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMDUsIDB4MDBlNiwgMHgwMGY2LCAweDAwMTYsIDB4MDgwYywgMHg5NjU2LCAweDIwNzEsIDB4MTgwMCwKKwkweDA4MGMsIDB4NzAwNiwgMHgwMDFlLCAweDAwZmUsIDB4MDBlZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwKKwkweDAwMzYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgwMTI2LCAweDA4MGMsIDB4OTY1NiwKKwkweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4MjA3MSwgMHgxODAwLCAweDIwOTEsIDB4ODAwMCwKKwkweDYwMjgsIDB4YzA5YywgMHg2MDJhLCAweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweDlhMGYsIDB4MjAxMSwKKwkweDAwMDIsIDB4MDgwYywgMHg5YTE5LCAweDA4MGMsIDB4OTkyNywgMHgwODBjLCAweDgzNWEsIDB4MDAzNiwKKwkweDkwMWUsIDB4MDgwYywgMHg5OTlkLCAweDAwM2UsIDB4NjBlMywgMHgwMDAwLCAweDA4MGMsIDB4ZGMxMywKKwkweDA4MGMsIDB4ZGMyZSwgMHgyMDA5LCAweDAwMDQsIDB4MDgwYywgMHgyYmI2LCAweDA4MGMsIDB4MmE4OSwKKwkweDIwMDEsIDB4MTgwMCwgMHgyMDAzLCAweDAwMDQsIDB4NjAyNywgMHgwMDA4LCAweDIwMTEsIDB4NzA2OSwKKwkweDA4MGMsIDB4ODNhZSwgMHgwODBjLCAweDcyMjEsIDB4MDExOCwgMHg5MDA2LCAweDA4MGMsIDB4MmM4OCwKKwkweDA4MGMsIDB4MGI4ZiwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyNzE3LCAweDAxMmUsIDB4MDBmZSwKKwkweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDAyNiwKKwkweDAwZTYsIDB4MjAxMSwgMHg3MDc2LCAweDIwNzEsIDB4MTlkMiwgMHg3MDFjLCAweDkyMDYsIDB4MTExOCwKKwkweDcwMTgsIDB4OTAwNSwgMHgwMTEwLCAweDkwODUsIDB4MDAwMSwgMHgwMGVlLCAweDAwMmUsIDB4MDAwNSwKKwkweDYwMjAsIDB4ZDA5YywgMHgwMDA1LCAweDY4MDAsIDB4OTA4NCwgMHhmZmZlLCAweDkwODYsIDB4MDBjMCwKKwkweDAxYjgsIDB4MjAwMSwgMHgwMGMwLCAweDA4MGMsIDB4MmM4OCwgMHgwMTU2LCAweDIwYTksIDB4MDAyZCwKKwkweDFkMDQsIDB4NzBlOCwgMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwgMHg3MGU4LCAweDAxNWUsIDB4MDBkNiwKKwkweDIwNjksIDB4MTgwMCwgMHg2ODk4LCAweDgwMDEsIDB4MDIyMCwgMHgwMTE4LCAweDY4OWEsIDB4MDBkZSwKKwkweDAwMDUsIDB4Njg5YiwgMHgwMDE0LCAweDY4ZTQsIDB4ZDBkYywgMHgwZGM4LCAweDY4MDAsIDB4OTA4NiwKKwkweDAwMDEsIDB4MWRhOCwgMHgwODBjLCAweDgzYmEsIDB4MGM5MCwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwKKwkweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4MjA3MSwgMHgxODAwLCAweDA4MGMsIDB4NzUxMywKKwkweDIwMDEsIDB4MTk0NSwgMHgyMDAzLCAweDAwMDAsIDB4OTAwNiwgMHg3MDk2LCAweDYwZTIsIDB4Njg4NiwKKwkweDA4MGMsIDB4MjdlMiwgMHg5MDA2LCAweDA4MGMsIDB4MmM4OCwgMHgwODBjLCAweDVkZWEsIDB4NjAyNywKKwkweGZmZmYsIDB4NjAyYiwgMHgxODJmLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMDUsIDB4MDBjNiwKKwkweDAwZDYsIDB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLCAweDIwNzEsIDB4MTgwMCwKKwkweDIwMDEsIDB4MTk1NSwgMHgyMDBjLCAweDkxODYsIDB4MDAwMCwgMHgwMTU4LCAweDkxODYsIDB4MDAwMSwKKwkweDAxNTgsIDB4OTE4NiwgMHgwMDAyLCAweDAxNTgsIDB4OTE4NiwgMHgwMDAzLCAweDAxNTgsIDB4MDgwNCwKKwkweDcxY2YsIDB4NzA5NywgMHgwMDIyLCAweDAwNDAsIDB4NzA5NywgMHgwMDIxLCAweDAwMjgsIDB4NzA5NywKKwkweDAwMjMsIDB4MDAxMCwgMHg3MDk3LCAweDAwMjQsIDB4NjBlMywgMHgwMDAwLCAweDY4ODcsIDB4MDAwMSwKKwkweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI3ZTIsIDB4MDAyNiwgMHgwODBjLCAweGEwNjksIDB4MDAyZSwKKwkweDcwMDAsIDB4OTA4ZSwgMHgwMDA0LCAweDAxMTgsIDB4NjAyYiwgMHgwMDI4LCAweDAwMTAsIDB4NjAyYiwKKwkweDAwMjAsIDB4MDE1NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMGE5LCAweDAwMDUsIDB4NjAyNCwKKwkweGQwYWMsIDB4MDE1MCwgMHgwMTJlLCAweDAxNWUsIDB4MDgwYywgMHhjNTM5LCAweDAxMTgsIDB4OTAwNiwKKwkweDA4MGMsIDB4MmNiMiwgMHgwODA0LCAweDcxZGIsIDB4NjgwMCwgMHg5MDg0LCAweDAwYTEsIDB4YzBiZCwKKwkweDY4MDIsIDB4MDgwYywgMHgyYmIwLCAweDY5MDQsIDB4ZDFkNCwgMHgxMTQwLCAweDIwMDEsIDB4MDEwMCwKKwkweDA4MGMsIDB4MmM4OCwgMHgxZjA0LCAweDcxNjcsIDB4MDgwYywgMHg3MjVlLCAweDAxMmUsIDB4MDE1ZSwKKwkweDA4MGMsIDB4NzIxOCwgMHgwNTM4LCAweDYwNDQsIDB4OTAwNSwgMHgwMWY4LCAweDIwMDEsIDB4MDEwMCwKKwkweDIwMDQsIDB4OTA4NiwgMHgwMDBhLCAweDAxNTgsIDB4MjAxMSwgMHgwMTE0LCAweDIyMDQsIDB4OTA4NSwKKwkweDAxMDAsIDB4MjAxMiwgMHg2MDUwLCAweDAwMDYsIDB4OTA4NSwgMHgwMDIwLCAweDYwNTIsIDB4MDgwYywKKwkweDcyNWUsIDB4OTAwNiwgMHg4MDAxLCAweDFkZjAsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4NiwKKwkweDAwMGEsIDB4MDE0MCwgMHgwMDBlLCAweDYwNTIsIDB4MDAyOCwgMHg2ODA0LCAweGQwZDQsIDB4MTExMCwKKwkweDA4MGMsIDB4NzI1ZSwgMHgwODBjLCAweGM1MzksIDB4MDExOCwgMHg5MDA2LCAweDA4MGMsIDB4MmNiMiwKKwkweDAwMTYsIDB4MDAyNiwgMHg3MDAwLCAweDkwOGUsIDB4MDAwNCwgMHgwMTMwLCAweDIwMDksIDB4MDBjOCwKKwkweDIwMTEsIDB4NzA3NiwgMHgwODBjLCAweDgzNmMsIDB4MDAyZSwgMHgwMDFlLCAweDA4MGMsIDB4ODFlNywKKwkweDcwMzQsIDB4YzA4NSwgMHg3MDM2LCAweDIwMDEsIDB4MTk1NSwgMHgyMDAzLCAweDAwMDQsIDB4MDgwYywKKwkweDZlZDMsIDB4MDgwYywgMHg3MjE4LCAweDAxMzgsIDB4NjgwNCwgMHhkMGQ0LCAweDExMjAsIDB4ZDBkYywKKwkweDExMDAsIDB4MDgwYywgMHg3NTA5LCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMDUsIDB4MDBjNiwKKwkweDAwZDYsIDB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLCAweDIwNzEsIDB4MTgwMCwKKwkweDA4MGMsIDB4ODFmZSwgMHgwODBjLCAweDgxZjAsIDB4MDgwYywgMHg3NTEzLCAweDIwMDEsIDB4MTk0NSwKKwkweDIwMDMsIDB4MDAwMCwgMHg5MDA2LCAweDcwOTYsIDB4NjBlMiwgMHg2ODg2LCAweDA4MGMsIDB4MjdlMiwKKwkweDkwMDYsIDB4MDgwYywgMHgyYzg4LCAweDYwNDMsIDB4MDA5MCwgMHg2MDQzLCAweDAwMTAsIDB4NjAyNywKKwkweGZmZmYsIDB4NjAyYiwgMHgxODJmLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMDUsIDB4MDAwNiwKKwkweDIwMDEsIDB4MTk1NCwgMHgyMDA0LCAweDkwODYsIDB4YWFhYSwgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwKKwkweDA4MGMsIDB4NTVkZiwgMHg5MDg0LCAweDAwMzAsIDB4OTA4NiwgMHgwMDAwLCAweDAwMGUsIDB4MDAwNSwKKwkweDAwMDYsIDB4MDgwYywgMHg1NWRmLCAweDkwODQsIDB4MDAzMCwgMHg5MDg2LCAweDAwMzAsIDB4MDAwZSwKKwkweDAwMDUsIDB4MDAwNiwgMHgwODBjLCAweDU1ZGYsIDB4OTA4NCwgMHgwMDMwLCAweDkwODYsIDB4MDAxMCwKKwkweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDA4MGMsIDB4NTVkZiwgMHg5MDg0LCAweDAwMzAsIDB4OTA4NiwKKwkweDAwMjAsIDB4MDAwZSwgMHgwMDA1LCAweDAwMzYsIDB4MDAxNiwgMHgyMDAxLCAweDE4MGMsIDB4MjAwNCwKKwkweDkwOGMsIDB4MDAxMywgMHgwMTgwLCAweDAwMjAsIDB4MDgwYywgMHgyODAyLCAweDkwMGUsIDB4MDAyOCwKKwkweDA4MGMsIDB4NjdiYiwgMHgxZGM4LCAweDIwMDksIDB4MDAwMiwgMHgyMDE5LCAweDAwMjgsIDB4MDgwYywKKwkweDMxNTYsIDB4OTAwNiwgMHgwMDE5LCAweDAwMWUsIDB4MDAzZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwKKwkweDE4MGMsIDB4MmUwNCwgMHgwMTMwLCAweDA4MGMsIDB4YzUzMiwgMHgxMTI4LCAweDkwODUsIDB4MDAxMCwKKwkweDAwMTAsIDB4OTA4NCwgMHhmZmVmLCAweDIwNzIsIDB4MDBlZSwgMHgwMDA1LCAweDYwNTAsIDB4MDAwNiwKKwkweDYwZWMsIDB4MDAwNiwgMHg2MDBjLCAweDAwMDYsIDB4NjAwNCwgMHgwMDA2LCAweDYwMjgsIDB4MDAwNiwKKwkweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwYSwgMHgwNTEwLCAweDAwMTYsIDB4NjEzOCwKKwkweDYwNTAsIDB4OTA4NCwgMHhmYmZmLCAweDkwODUsIDB4MjAwMCwgMHg2MDUyLCAweDYxM2EsIDB4MjBhOSwKKwkweDAwMTIsIDB4MWQwNCwgMHg3Mjc5LCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDcyNzksIDB4NjAyZiwKKwkweDAxMDAsIDB4NjAyZiwgMHgwMDAwLCAweDYwNTAsIDB4OTA4NSwgMHgwNDAwLCAweDkwODQsIDB4ZGZmZiwKKwkweDYwNTIsIDB4NjEzYSwgMHgwMDFlLCAweDYwMmYsIDB4MDA0MCwgMHg2MDJmLCAweDAwMDAsIDB4MDBhMCwKKwkweDA4MGMsIDB4MmNjMiwgMHgwODBjLCAweDJjZjUsIDB4NjAyZiwgMHgwMTAwLCAweDYwMmYsIDB4MDAwMCwKKwkweDYwMmYsIDB4MDA0MCwgMHg2MDJmLCAweDAwMDAsIDB4MjBhOSwgMHgwMDAyLCAweDA4MGMsIDB4MmI5MSwKKwkweDAwMjYsIDB4NjAyNywgMHgwMDQwLCAweDAwMmUsIDB4MDAwZSwgMHg2MDJhLCAweDAwMGUsIDB4NjAwNiwKKwkweDAwMGUsIDB4NjAwZSwgMHgwMDBlLCAweDYwZWUsIDB4NjBlMywgMHgwMDAwLCAweDY4ODcsIDB4MDAwMSwKKwkweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI3ZTIsIDB4MjAwMSwgMHgwMGEwLCAweDAwMDYsIDB4MDgwYywKKwkweGM1MzksIDB4MDAwZSwgMHgwMTMwLCAweDA4MGMsIDB4MmNhNiwgMHg5MDA2LCAweDA4MGMsIDB4MmNiMiwKKwkweDAwMTAsIDB4MDgwYywgMHgyYzg4LCAweDAwMGUsIDB4NjA1MiwgMHg2MDUwLCAweDAwMDYsIDB4YzBlNSwKKwkweDYwNTIsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4MDgwYywgMHgyYjA2LCAweDAwZmUsIDB4MDAwZSwKKwkweDYwNTIsIDB4MDAwNSwgMHgwMTU2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4MDBkNiwKKwkweDAwZTYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksIDB4MDE0MCwgMHgyMDcxLCAweDE4MDAsIDB4NjAyMCwKKwkweDkwODQsIDB4MDA4MCwgMHgwMTM4LCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGMxYzUsIDB4MjEwMiwKKwkweDA4MDQsIDB4NzM0YiwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHhjMWM0LCAweDIxMDIsIDB4NjAyOCwKKwkweDkwODQsIDB4ZTFmZiwgMHg2MDJhLCAweDYwMjcsIDB4MDIwMCwgMHgyMDAxLCAweDAwOTAsIDB4MDgwYywKKwkweDJjODgsIDB4MjBhOSwgMHgwMzY2LCAweDYwMjQsIDB4ZDBjYywgMHgxNTE4LCAweDFkMDQsIDB4NzJmYiwKKwkweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDcyZmIsIDB4MjAxMSwgMHgwMDAzLCAweDA4MGMsIDB4OWEwZiwKKwkweDIwMTEsIDB4MDAwMiwgMHgwODBjLCAweDlhMTksIDB4MDgwYywgMHg5OTI3LCAweDkwMWUsIDB4MDgwYywKKwkweDk5OWQsIDB4MjAwMSwgMHgwMGEwLCAweDA4MGMsIDB4MmM4OCwgMHgwODBjLCAweDc1MDQsIDB4MDgwYywKKwkweDVmMmIsIDB4MDgwYywgMHhjNTM5LCAweDAxMTAsIDB4MDgwYywgMHgwZDY4LCAweDkwODUsIDB4MDAwMSwKKwkweDA0ODAsIDB4MDgwYywgMHgxYTI0LCAweDYwZTMsIDB4MDAwMCwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywKKwkweDI3ZTIsIDB4NjBlMiwgMHgyMDAxLCAweDAwODAsIDB4MDgwYywgMHgyYzg4LCAweDIwYTksIDB4MDM2NiwKKwkweDYwMjcsIDB4MWUwMCwgMHgyMDA5LCAweDFlMDAsIDB4MDgwYywgMHgyYmIwLCAweDYwMjQsIDB4OTEwYywKKwkweDAxMzgsIDB4MWQwNCwgMHg3MzMwLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDczMzAsIDB4MDgyMCwKKwkweDYwMjgsIDB4OTA4NSwgMHgxZTAwLCAweDYwMmEsIDB4NzBiMCwgMHg5MDA1LCAweDExMTgsIDB4Njg4NywKKwkweDAwMDEsIDB4MDAwOCwgMHg2ODg2LCAweDA4MGMsIDB4YzUzOSwgMHgwMTEwLCAweDA4MGMsIDB4MGQ2OCwKKwkweDkwMDYsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDE1ZSwKKwkweDAwMDUsIDB4MDE1NiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwKKwkweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweDE4MDAsIDB4NzAwMCwgMHg5MDg2LCAweDAwMDMsIDB4MTE2OCwKKwkweDIwMDEsIDB4MDIwYiwgMHgyMDA0LCAweDkwODQsIDB4NTU0MCwgMHg5MDg2LCAweDU1NDAsIDB4MTEyOCwKKwkweDIwNjksIDB4MWE1MCwgMHgyZDA0LCAweDgwMDAsIDB4MjA2YSwgMHgyMDY5LCAweDAxNDAsIDB4NjAyMCwKKwkweDkwODQsIDB4MDBjMCwgMHgwMTIwLCAweDY4ODQsIDB4OTAwNSwgMHgxOTA0LCAweDczYmUsIDB4MjAwMSwKKwkweDAwODgsIDB4MDgwYywgMHgyYzg4LCAweDkwMDYsIDB4NjBlMiwgMHg2ODg2LCAweDA4MGMsIDB4MjdlMiwKKwkweDIwNjksIDB4MDIwMCwgMHg2ODA0LCAweDkwMDUsIDB4MTExOCwgMHg2ODA4LCAweDkwMDUsIDB4MDFjMCwKKwkweDYwMjgsIDB4OTA4NCwgMHhmYmZmLCAweDYwMmEsIDB4NjAyNywgMHgwNDAwLCAweDIwNjksIDB4MTk2NywKKwkweDcwMDAsIDB4MjA2YSwgMHg3MDk3LCAweDAwMjYsIDB4NzAwMywgMHgwMDAxLCAweDIwYTksIDB4MDAwMiwKKwkweDFkMDQsIDB4NzNhMCwgMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwgMHg3M2EwLCAweDA4MDQsIDB4NzNlYiwKKwkweDIwNjksIDB4MDE0MCwgMHgyMGE5LCAweDAzODQsIDB4NjAyNywgMHgxZTAwLCAweDIwMDksIDB4MWUwMCwKKwkweDA4MGMsIDB4MmJiMCwgMHg2MDI0LCAweDkxMGMsIDB4MDUwOCwgMHg5MDg0LCAweDFhMDAsIDB4MTFmMCwKKwkweDFkMDQsIDB4NzNhYywgMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwgMHg3M2FjLCAweDIwMTEsIDB4MDAwMywKKwkweDA4MGMsIDB4OWEwZiwgMHgyMDExLCAweDAwMDIsIDB4MDgwYywgMHg5YTE5LCAweDA4MGMsIDB4OTkyNywKKwkweDkwMWUsIDB4MDgwYywgMHg5OTlkLCAweDIwMDEsIDB4MDBhMCwgMHgwODBjLCAweDJjODgsIDB4MDgwYywKKwkweDc1MDQsIDB4MDgwYywgMHg1ZjJiLCAweDkwODUsIDB4MDAwMSwgMHgwMGE4LCAweDIwMDEsIDB4MDA4MCwKKwkweDA4MGMsIDB4MmM4OCwgMHgyMDY5LCAweDAxNDAsIDB4NjBlMywgMHgwMDAwLCAweDcwYjAsIDB4OTAwNSwKKwkweDExMTgsIDB4Njg4NywgMHgwMDAxLCAweDAwMDgsIDB4Njg4NiwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywKKwkweDI3ZTIsIDB4NjBlMiwgMHg5MDA2LCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwKKwkweDAwMWUsIDB4MDE1ZSwgMHgwMDA1LCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwKKwkweDAwZDYsIDB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHgxODAwLCAweDYwMjAsIDB4OTA4NCwKKwkweDAwYzAsIDB4MDFjOCwgMHgyMDExLCAweDAwMDMsIDB4MDgwYywgMHg5YTBmLCAweDIwMTEsIDB4MDAwMiwKKwkweDA4MGMsIDB4OWExOSwgMHgwODBjLCAweDk5MjcsIDB4OTAxZSwgMHgwODBjLCAweDk5OWQsIDB4MjA2OSwKKwkweDAxNDAsIDB4MjAwMSwgMHgwMGEwLCAweDA4MGMsIDB4MmM4OCwgMHgwODBjLCAweDc1MDQsIDB4MDgwYywKKwkweDVmMmIsIDB4MDgwNCwgMHg3NDg1LCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGQxYjQsIDB4MTE2MCwKKwkweGMxYjUsIDB4MjEwMiwgMHgwODBjLCAweDcwNWUsIDB4MjA2OSwgMHgwMTQwLCAweDIwMDEsIDB4MDA4MCwKKwkweDA4MGMsIDB4MmM4OCwgMHg2MGUzLCAweDAwMDAsIDB4MjA2OSwgMHgwMjAwLCAweDY4MDQsIDB4OTAwNSwKKwkweDExMTgsIDB4NjgwOCwgMHg5MDA1LCAweDAxODAsIDB4NjAyOCwgMHg5MDg0LCAweGZkZmYsIDB4NjAyYSwKKwkweDYwMjcsIDB4MDIwMCwgMHgyMDY5LCAweDE5NjcsIDB4NzAwMCwgMHgyMDZhLCAweDcwOTcsIDB4MDAyNywKKwkweDcwMDMsIDB4MDAwMSwgMHgwODA0LCAweDc0ODUsIDB4NjAyNywgMHgxZTAwLCAweDIwMDksIDB4MWUwMCwKKwkweDA4MGMsIDB4MmJiMCwgMHg2MDI0LCAweDkxMGMsIDB4MDFjOCwgMHg5MDg0LCAweDFjMDAsIDB4MTFiMCwKKwkweDFkMDQsIDB4NzQ0NCwgMHgwMDA2LCAweDAwMTYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDgwYywKKwkweDgyM2UsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAxZSwgMHgwMDBlLCAweDAwZTYsIDB4MjA3MSwKKwkweDE5ZDIsIDB4NzA3MCwgMHgwMGVlLCAweDkwMDUsIDB4MTlmOCwgMHgwMGY4LCAweDAwMjYsIDB4MjAxMSwKKwkweDcwNzYsIDB4MDgwYywgMHg4MmRhLCAweDIwMTEsIDB4NzA2OSwgMHgwODBjLCAweDgzYWUsIDB4MDAyZSwKKwkweDIwNjksIDB4MDE0MCwgMHg2MGUzLCAweDAwMDAsIDB4NzBiMCwgMHg5MDA1LCAweDExMTgsIDB4Njg4NywKKwkweDAwMDEsIDB4MDAwOCwgMHg2ODg2LCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDI3ZTIsIDB4NjBlMiwKKwkweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGMxYjQsIDB4MjEwMiwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwKKwkweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAxNWUsIDB4MDAwNSwgMHgwMTU2LCAweDAwMTYsIDB4MDAyNiwKKwkweDAwMzYsIDB4MDA0NiwgMHgwMGM2LCAweDAwZTYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNzEsIDB4MTgwMCwKKwkweDA4MGMsIDB4YzUzMiwgMHgxOTA0LCAweDc0ZjIsIDB4NzEzMCwgMHhkMTg0LCAweDExNzAsIDB4MDgwYywKKwkweDMyZTQsIDB4MDEzOCwgMHhjMThkLCAweDcxMzIsIDB4MjAxMSwgMHgxODVjLCAweDIyMTQsIDB4ZDJhYywKKwkweDExMjAsIDB4NzAzMCwgMHhkMDhjLCAweDA5MDQsIDB4NzRmMiwgMHgyMDExLCAweDE4NWMsIDB4MjIwYywKKwkweDA0MzgsIDB4MDAxNiwgMHgyMDE5LCAweDAwMGUsIDB4MDgwYywgMHhkODAxLCAweDAxNTYsIDB4MDBiNiwKKwkweDIwYTksIDB4MDA3ZiwgMHg5MDBlLCAweDkxODYsIDB4MDA3ZSwgMHgwMWEwLCAweDkxODYsIDB4MDA4MCwKKwkweDAxODgsIDB4MDgwYywgMHg2NDlmLCAweDExNzAsIDB4MjEyMCwgMHg5MDA2LCAweDAwMTYsIDB4MjAwOSwKKwkweDAwMGUsIDB4MDgwYywgMHhkODg1LCAweDIwMDksIDB4MDAwMSwgMHgyMDExLCAweDAxMDAsIDB4MDgwYywKKwkweDg0ZDEsIDB4MDAxZSwgMHg4MTA4LCAweDFmMDQsIDB4NzRiYiwgMHgwMGJlLCAweDAxNWUsIDB4MDAxZSwKKwkweGQxYWMsIDB4MTE0OCwgMHgwMDE2LCAweDIwMDksIDB4MDAwMiwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywKKwkweDMxNTYsIDB4MDAxZSwgMHgwMDc4LCAweDAxNTYsIDB4MDBiNiwgMHgyMGE5LCAweDAwN2YsIDB4OTAwZSwKKwkweDA4MGMsIDB4NjQ5ZiwgMHgxMTEwLCAweDA4MGMsIDB4NWY0NSwgMHg4MTA4LCAweDFmMDQsIDB4NzRlOCwKKwkweDAwYmUsIDB4MDE1ZSwgMHgwODBjLCAweDFhMjQsIDB4MDgwYywgMHhhMDY5LCAweDYwZTMsIDB4MDAwMCwKKwkweDA4MGMsIDB4NWYyYiwgMHgwODBjLCAweDcxMjcsIDB4MDBlZSwgMHgwMGNlLCAweDAwNGUsIDB4MDAzZSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMTVlLCAweDAwMDUsIDB4MjAwMSwgMHgxOTU1LCAweDIwMDMsIDB4MDAwMSwKKwkweDAwMDUsIDB4MjAwMSwgMHgxOTU1LCAweDIwMDMsIDB4MDAwMCwgMHgwMDA1LCAweDIwMDEsIDB4MTk1NCwKKwkweDIwMDMsIDB4YWFhYSwgMHgwMDA1LCAweDIwMDEsIDB4MTk1NCwgMHgyMDAzLCAweDAwMDAsIDB4MDAwNSwKKwkweDIwNzEsIDB4MThmOCwgMHg3MDAzLCAweDAwMDAsIDB4NzAwNywgMHgwMDAwLCAweDA4MGMsIDB4MTA0YSwKKwkweDA5MGMsIDB4MGRmYSwgMHhhOGFiLCAweGRjYjAsIDB4MjkwMCwgMHg3MDRlLCAweDA4MGMsIDB4MTA0YSwKKwkweDA5MGMsIDB4MGRmYSwgMHhhOGFiLCAweGRjYjAsIDB4MjkwMCwgMHg3MDUyLCAweGE4NjcsIDB4MDAwMCwKKwkweGE4NmIsIDB4MDAwMSwgMHhhODlmLCAweDAwMDAsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MDA0MCwKKwkweDY4NDgsIDB4OTAwNSwgMHgxMTE4LCAweDkwODUsIDB4MDAwMSwgMHgwNGIwLCAweDY4NDAsIDB4OTAwNSwKKwkweDAxNTAsIDB4MDRhMSwgMHg2YTUwLCAweDkyMDAsIDB4NzAwMiwgMHg2ODU0LCAweDkxMDEsIDB4NzAwNiwKKwkweDkwMDYsIDB4NzAxMiwgMHg3MDE2LCAweDY4NTAsIDB4NzAwMiwgMHg2ODU0LCAweDcwMDYsIDB4Njg1OCwKKwkweDcwMGEsIDB4Njg1YywgMHg3MDBlLCAweDY4NDAsIDB4OTAwNSwgMHgxMTEwLCAweDcwMTIsIDB4NzAxNiwKKwkweDY4NDgsIDB4NzAxYSwgMHg3MDFjLCAweDkwODUsIDB4MDA0MCwgMHg3MDFlLCAweDIwMDEsIDB4MDAxOSwKKwkweDcwMzYsIDB4NzAyYiwgMHgwMDAxLCAweDIwMDEsIDB4MDAwNCwgMHgyMDBjLCAweDkxOGMsIDB4ZmZmNywKKwkweDkxOGQsIDB4ODAwMCwgMHgyMTAyLCAweDAwZDYsIDB4MjA2OSwgMHgxOGY4LCAweDY4MDcsIDB4MDAwMSwKKwkweDAwZGUsIDB4MDgwYywgMHg3YWZkLCAweDkwMDYsIDB4MDBlZSwgMHgwMDA1LCAweDkwMGUsIDB4MDE1NiwKKwkweDIwYTksIDB4MDAwNiwgMHg4MDAzLCAweDgxOGQsIDB4MWYwNCwgMHg3NTdhLCAweDAxNWUsIDB4MDAwNSwKKwkweDIwNzksIDB4MDA0MCwgMHgyMDcxLCAweDE4ZjgsIDB4NzAwNCwgMHgwMDAyLCAweDc1OTAsIDB4NzU5MSwKKwkweDc1YzksIDB4NzYyNCwgMHg3NzY1LCAweDc1OGUsIDB4NzU4ZSwgMHg3NzhmLCAweDA4MGMsIDB4MGRmYSwKKwkweDAwMDUsIDB4MjA3OSwgMHgwMDQwLCAweDc4MmMsIDB4OTA4YywgMHgwNzgwLCAweDE5MGMsIDB4N2I4OSwKKwkweGQwYTQsIDB4MDFmOCwgMHg3ODI0LCAweDIwNDgsIDB4OTAwNiwgMHhhODAyLCAweGE4MDYsIDB4YTg2NCwKKwkweDkwODQsIDB4MDBmZiwgMHg5MDhhLCAweDAwNDAsIDB4MDYxMCwgMHgwMGMwLCAweDIwMDEsIDB4MTgwMCwKKwkweDIwMGMsIDB4OTE4NiwgMHgwMDAzLCAweDExNjgsIDB4NzAwNCwgMHgwMDAyLCAweDc1YjksIDB4NzU5MywKKwkweDc1YjksIDB4NzViNywgMHg3NWI5LCAweDc1YjksIDB4NzViOSwgMHg3NWI5LCAweDc1YjksIDB4MDgwYywKKwkweDc2MjQsIDB4NzgyYywgMHhkMDljLCAweDA5MGMsIDB4N2FmZCwgMHgwMDA1LCAweDkwODIsIDB4MDA1YSwKKwkweDEyMTgsIDB4MjEwMCwgMHgwMDNiLCAweDBjMTAsIDB4MDgwYywgMHg3NjVhLCAweDBjOTAsIDB4MDBlMywKKwkweDA4ZTgsIDB4MDAwNSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwKKwkweDc2NWEsIDB4NzY1YSwgMHg3NjdjLCAweDc2NWEsIDB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwKKwkweDc2NWEsIDB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwKKwkweDc2NWEsIDB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwgMHg3NjVhLCAweDc2NjYsIDB4NzY1YSwKKwkweDc4NjQsIDB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY3YywgMHg3NjVhLCAweDc2NjYsIDB4NzhhNSwKKwkweDc4ZTYsIDB4NzkyZCwgMHg3OTQxLCAweDc2NWEsIDB4NzY1YSwgMHg3NjdjLCAweDc2NjYsIDB4NzY1YSwKKwkweDc2NWEsIDB4NzczOSwgMHg3OWVjLCAweDdhMDcsIDB4NzY1YSwgMHg3NjdjLCAweDc2NWEsIDB4NzY1YSwKKwkweDc2NWEsIDB4NzY1YSwgMHg3NzJmLCAweDdhMDcsIDB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwKKwkweDc2NWEsIDB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwgMHg3NjkwLCAweDc2NWEsIDB4NzY1YSwKKwkweDc2NWEsIDB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4N2IyZCwKKwkweDc2NWEsIDB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwgMHg3NmE0LCAweDc2NWEsIDB4NzY1YSwKKwkweDc2NWEsIDB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4MjA3OSwgMHgwMDQwLCAweDcwMDQsIDB4OTA4NiwKKwkweDAwMDMsIDB4MTE5OCwgMHg3ODJjLCAweDA4MGMsIDB4N2IyNiwgMHhkMGE0LCAweDAxNzAsIDB4NzgyNCwKKwkweDIwNDgsIDB4OTAwNiwgMHhhODAyLCAweGE4MDYsIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4YSwKKwkweDAwMWEsIDB4MTIxMCwgMHgwMDJiLCAweDBjNTAsIDB4MDBlOSwgMHgwODBjLCAweDdhZmQsIDB4MDAwNSwKKwkweDc2NWEsIDB4NzY2NiwgMHg3ODUwLCAweDc2NWEsIDB4NzY2NiwgMHg3NjVhLCAweDc2NjYsIDB4NzY2NiwKKwkweDc2NWEsIDB4NzY2NiwgMHg3ODUwLCAweDc2NjYsIDB4NzY2NiwgMHg3NjY2LCAweDc2NjYsIDB4NzY2NiwKKwkweDc2NWEsIDB4NzY2NiwgMHg3ODUwLCAweDc2NWEsIDB4NzY1YSwgMHg3NjY2LCAweDc2NWEsIDB4NzY1YSwKKwkweDc2NWEsIDB4NzY2NiwgMHgwMGU2LCAweDIwNzEsIDB4MThmOCwgMHgyMDA5LCAweDA0MDAsIDB4MDA3MSwKKwkweDAwZWUsIDB4MDAwNSwgMHgyMDA5LCAweDEwMDAsIDB4MDA0OSwgMHgwMDA1LCAweDIwMDksIDB4MjAwMCwKKwkweDAwMjksIDB4MDAwNSwgMHgyMDA5LCAweDA4MDAsIDB4MDAwOSwgMHgwMDA1LCAweDcwMDcsIDB4MDAwMSwKKwkweGE4NjgsIDB4OTA4NCwgMHgwMGZmLCAweDkxMDUsIDB4YTg2YSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4NmFlOSwgMHgwMTJlLCAweDAwMDUsIDB4YTg2NCwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwKKwkweDBkMDgsIDB4ODAwMSwgMHgxMTIwLCAweDcwMDcsIDB4MDAwMSwgMHgwODA0LCAweDc4MGUsIDB4NzAwNywKKwkweDAwMDMsIDB4NzAxMiwgMHgyOTAwLCAweDcwMTYsIDB4NzAxYSwgMHg3MDRiLCAweDc4MGUsIDB4MDAwNSwKKwkweGE4NjQsIDB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4MDk2OCwgMHg4MDAxLCAweDExMjAsIDB4NzAwNywKKwkweDAwMDEsIDB4MDgwNCwgMHg3ODI5LCAweDcwMDcsIDB4MDAwMywgMHg3MDEyLCAweDI5MDAsIDB4NzAxNiwKKwkweDcwMWEsIDB4NzA0YiwgMHg3ODI5LCAweDAwMDUsIDB4YTg2NCwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwKKwkweDkwODYsIDB4MDAwMSwgMHgxOTA0LCAweDc2NjIsIDB4NzAwNywgMHgwMDAxLCAweDIwMDksIDB4MTgzMywKKwkweDIxMGMsIDB4ODFmZiwgMHgxOTA0LCAweDc3MDYsIDB4YTk5NCwgMHg5MTg2LCAweDAwNmYsIDB4MDE4OCwKKwkweDkxODYsIDB4MDA3NCwgMHgxNWIwLCAweDAwMjYsIDB4MjAxMSwgMHgwMDEwLCAweDA4MGMsIDB4NjdlNywKKwkweDAwMmUsIDB4MDU3OCwgMHgwMDE2LCAweGE5OTgsIDB4MDgwYywgMHg2ODMxLCAweDAwMWUsIDB4MTU0OCwKKwkweDA0MDAsIDB4MDgwYywgMHg3MjA3LCAweDAxNDAsIDB4YTg5NywgMHg0MDA1LCAweGE4OWIsIDB4MDAxNiwKKwkweDIwMDEsIDB4MDAzMCwgMHg5MDBlLCAweDA0MzgsIDB4MDAyNiwgMHgyMDExLCAweDgwMDgsIDB4MDgwYywKKwkweDY3ZTcsIDB4MDAyZSwgMHgwMWIwLCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweGE5OTgsIDB4YWFhMCwKKwkweGFiOWMsIDB4OTE4ZCwgMHg4MDAwLCAweDA4MGMsIDB4NjgzMSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwKKwkweDExNDAsIDB4YTg5NywgMHg0MDA1LCAweGE4OWIsIDB4NDAwOSwgMHgyMDAxLCAweDAwMzAsIDB4OTAwZSwKKwkweDAwNTAsIDB4YTg2OCwgMHg5MDg0LCAweDAwZmYsIDB4YTg2YSwgMHhhODgzLCAweDAwMDAsIDB4MDgwYywKKwkweDYxNWQsIDB4MTEwOCwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGE4NjcsIDB4MDEzOSwKKwkweGE4N2EsIDB4YTk4MiwgMHgwODBjLCAweDZhZTksIDB4MDEyZSwgMHgwY2EwLCAweGE5OTQsIDB4OTE4NiwKKwkweDAwNzEsIDB4MDkwNCwgMHg3NmI0LCAweDkxODYsIDB4MDA2NCwgMHgwOTA0LCAweDc2YjQsIDB4OTE4NiwKKwkweDAwN2MsIDB4MDkwNCwgMHg3NmI0LCAweDkxODYsIDB4MDAyOCwgMHgwOTA0LCAweDc2YjQsIDB4OTE4NiwKKwkweDAwMzgsIDB4MDkwNCwgMHg3NmI0LCAweDkxODYsIDB4MDA3OCwgMHgwOTA0LCAweDc2YjQsIDB4OTE4NiwKKwkweDAwNWYsIDB4MDkwNCwgMHg3NmI0LCAweDkxODYsIDB4MDA1NiwgMHgwOTA0LCAweDc2YjQsIDB4YTg5NywKKwkweDQwMDUsIDB4YTg5YiwgMHgwMDAxLCAweDIwMDEsIDB4MDAzMCwgMHg5MDBlLCAweDA4NjAsIDB4YTg3YywKKwkweDkwODQsIDB4MDBjMCwgMHg5MDg2LCAweDAwYzAsIDB4MTEyMCwgMHg3MDA3LCAweDAwMDEsIDB4MDgwNCwKKwkweDdhMWUsIDB4MjkwMCwgMHg3MDE2LCAweDcwMWEsIDB4MjBhOSwgMHgwMDA0LCAweGE4NjAsIDB4MjBlMCwKKwkweGE4NWMsIDB4OTA4MCwgMHgwMDMwLCAweDIwOTgsIDB4NzA1MCwgMHgyMDQwLCAweGEwNjAsIDB4MjBlOCwKKwkweGEwNWMsIDB4OTA4MCwgMHgwMDIzLCAweDIwYTAsIDB4NDAwMywgMHhhODg4LCAweDcwMTIsIDB4OTA4MiwKKwkweDA0MDEsIDB4MWEwNCwgMHg3NjZhLCAweGFhYjQsIDB4OTI4YSwgMHgwMDAyLCAweDFhMDQsIDB4NzY2YSwKKwkweDgyZmYsIDB4MTEzOCwgMHhhOGI4LCAweGE5YmMsIDB4OTEwNSwgMHgwMTE4LCAweDIwMDEsIDB4NzdjYywKKwkweDAwMTgsIDB4OTI4MCwgMHg3N2MyLCAweDIwMDUsIDB4NzA1NiwgMHg3MDEwLCAweDkwMTUsIDB4MDkwNCwKKwkweDc3YWQsIDB4MDgwYywgMHgxMDRhLCAweDExMTgsIDB4NzAwNywgMHgwMDA0LCAweDAwMDUsIDB4MjkwMCwKKwkweDcwMjIsIDB4NzA1NCwgMHgyMDYwLCAweGUwMDAsIDB4YTg2NiwgMHg3MDUwLCAweDIwNDAsIDB4YTk1YywKKwkweGUwMDQsIDB4OTEwMCwgMHhhMDc2LCAweGE4NjAsIDB4YTA3MiwgMHhlMDA4LCAweDkyMGEsIDB4MTIxMCwKKwkweDkwMGUsIDB4MjIwMCwgMHg3MTEyLCAweGUyMGMsIDB4ODAwMywgMHg4MDBiLCAweDkyOTYsIDB4MDAwNCwKKwkweDAxMDgsIDB4OTEwOCwgMHhhMTdhLCAweDgxMGIsIDB4YTE3ZSwgMHgwODBjLCAweDExMmUsIDB4YTA2YywKKwkweDkwOGUsIDB4MDEwMCwgMHgwMTcwLCAweDkwODYsIDB4MDIwMCwgMHgwMTE4LCAweDcwMDcsIDB4MDAwNywKKwkweDAwMDUsIDB4NzAyMCwgMHgyMDQ4LCAweDA4MGMsIDB4MTA2MywgMHg3MDE0LCAweDIwNDgsIDB4MDgwNCwKKwkweDc2NmEsIDB4NzAyMCwgMHgyMDQ4LCAweDcwMTgsIDB4YTgwMiwgMHhhODA3LCAweDAwMDAsIDB4MjkwOCwKKwkweDIwNDgsIDB4YTkwNiwgMHg3MTFhLCAweDA4MDQsIDB4Nzc2NSwgMHg3MDE0LCAweDIwNDgsIDB4NzAwNywKKwkweDAwMDEsIDB4YThiNCwgMHg5MDA1LCAweDExMjgsIDB4YThiOCwgMHhhOWJjLCAweDkxMDUsIDB4MDEwOCwKKwkweDAwYjksIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDFlLCAweDA5MDQsIDB4N2ExZSwKKwkweDA4MDQsIDB4NzgwZSwgMHg3N2M0LCAweDc3YzgsIDB4MDAwMiwgMHgwMDFkLCAweDAwMDcsIDB4MDAwNCwKKwkweDAwMGEsIDB4MDAxYiwgMHgwMDA1LCAweDAwMDYsIDB4MDAwYSwgMHgwMDFkLCAweDAwMDUsIDB4MDAwNCwKKwkweDAwNzYsIDB4MDA2NiwgMHhhZmI4LCAweGFlYmMsIDB4YTgwNCwgMHgyMDUwLCAweGIwYzAsIDB4YjBlMiwKKwkweGIwYmMsIDB4YjBkZSwgMHhiMGI4LCAweGIwZDIsIDB4YjBiNCwgMHhiMGNlLCAweGI2ZGEsIDB4YjdkNiwKKwkweGIwYjAsIDB4YjBjYSwgMHhiMGFjLCAweGIwYzYsIDB4YjBhOCwgMHhiMGJhLCAweGIwYTQsIDB4YjBiNiwKKwkweGI2YzIsIDB4YjdiZSwgMHhiMGEwLCAweGIwYjIsIDB4YjA5YywgMHhiMGFlLCAweGIwOTgsIDB4YjBhMiwKKwkweGIwOTQsIDB4YjA5ZSwgMHhiNmFhLCAweGI3YTYsIDB4YjA5MCwgMHhiMDlhLCAweGIwOGMsIDB4YjA5NiwKKwkweGIwODgsIDB4YjA4YSwgMHhiMDg0LCAweGIwODYsIDB4YjY5MiwgMHhiNzhlLCAweGIwODAsIDB4YjA4MiwKKwkweGIwN2MsIDB4YjA3ZSwgMHhiMDc4LCAweGIwNzIsIDB4YjA3NCwgMHhiMDZlLCAweGI2N2EsIDB4Yjc3NiwKKwkweGIwMDQsIDB4OTA1NSwgMHgxOTU4LCAweDAwNmUsIDB4MDA3ZSwgMHgwMDA1LCAweDIwMDksIDB4MTgzMywKKwkweDIxMGMsIDB4ODFmZiwgMHgxMTc4LCAweDA4MGMsIDB4NWZhNywgMHgxMTA4LCAweDAwMDUsIDB4MDgwYywKKwkweDZkMTcsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHhjMTJkLCAweDA4MGMsIDB4NmFlOSwKKwkweDAxMmUsIDB4MGNhMCwgMHgwODBjLCAweGM1MzIsIDB4MWQ3MCwgMHgyMDAxLCAweDAwMjgsIDB4OTAwZSwKKwkweDBjNzAsIDB4MjAwOSwgMHgxODMzLCAweDIxMGMsIDB4ODFmZiwgMHgxMWQ4LCAweGE4ODgsIDB4OTAwNSwKKwkweDAxZTAsIDB4YTg4MywgMHgwMDAwLCAweGE4N2MsIDB4ZDBmNCwgMHgwMTIwLCAweDA4MGMsIDB4NjBiZiwKKwkweDExMzgsIDB4MDAwNSwgMHg5MDA2LCAweGE4N2EsIDB4MDgwYywgMHg2MDM3LCAweDExMDgsIDB4MDAwNSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGE4N2EsIDB4YTk4MiwgMHgwODBjLCAweDZhZTksIDB4MDEyZSwKKwkweDBjYjAsIDB4MjAwMSwgMHgwMDI4LCAweDkwMGUsIDB4MGM5OCwgMHgyMDAxLCAweDAwMDAsIDB4MGM4MCwKKwkweDcwMTgsIDB4YTgwMiwgMHgyOTA4LCAweDIwNDgsIDB4YTkwNiwgMHg3MTFhLCAweDcwMTAsIDB4ODAwMSwKKwkweDcwMTIsIDB4MDExOCwgMHg3MDA3LCAweDAwMDMsIDB4MDAzMCwgMHg3MDE0LCAweDIwNDgsIDB4NzAwNywKKwkweDAwMDEsIDB4NzA0OCwgMHgwODBmLCAweDAwMDUsIDB4MDBiNiwgMHg3MDA3LCAweDAwMDEsIDB4YTk3NCwKKwkweGE4NzgsIDB4OTA4NCwgMHgwMGZmLCAweDkwOTYsIDB4MDAwNCwgMHgwNTQwLCAweDIwYTksIDB4MDAwMSwKKwkweDkwOTYsIDB4MDAwMSwgMHgwMTkwLCAweDkwMGUsIDB4MjBhOSwgMHgwODAwLCAweDkwOTYsIDB4MDAwMiwKKwkweDAxNjAsIDB4OTAwNSwgMHgxMWQ4LCAweGE5NzQsIDB4MDgwYywgMHg2NDlmLCAweDExYjgsIDB4MDA2NiwKKwkweGFlODAsIDB4MDgwYywgMHg2NWFmLCAweDAwNmUsIDB4MDA4OCwgMHgwMDQ2LCAweDIwMTEsIDB4MTgwYywKKwkweDIyMjQsIDB4YzQ4NCwgMHgyNDEyLCAweDAwNGUsIDB4MDBjNiwgMHgwODBjLCAweDY0OWYsIDB4MTExMCwKKwkweDA4MGMsIDB4NjZhZiwgMHg4MTA4LCAweDFmMDQsIDB4Nzg4ZCwgMHgwMGNlLCAweGE4N2MsIDB4ZDA4NCwKKwkweDExMjAsIDB4MDgwYywgMHgxMDYzLCAweDAwYmUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4NmFlOSwgMHgwMTJlLCAweDAwYmUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDcwMDcsIDB4MDAwMSwgMHgwODBjLCAweDY3YmYsIDB4MDU4MCwgMHgyMDYxLCAweDFhNDgsIDB4NjEwMCwKKwkweGQxODQsIDB4MDE3OCwgMHhhODg4LCAweDkwODQsIDB4MDBmZiwgMHgxNTUwLCAweDYwMDAsIDB4ZDA4NCwKKwkweDA1MjAsIDB4NjAwNCwgMHg5MDA1LCAweDE1MzgsIDB4NjAwMywgMHgwMDAwLCAweDYwMGIsIDB4MDAwMCwKKwkweDAwYzgsIDB4MjAxMSwgMHgwMDAxLCAweGE4OTAsIDB4OTAwNSwgMHgxMTEwLCAweDIwMDEsIDB4MDAxZSwKKwkweDgwMDAsIDB4NjAxNiwgMHhhODg4LCAweDkwODQsIDB4MDBmZiwgMHgwMTc4LCAweDYwMDYsIDB4YTg4OCwKKwkweDgwMDcsIDB4OTA4NCwgMHgwMGZmLCAweDAxNDgsIDB4NjAwYSwgMHhhODg4LCAweDgwMDAsIDB4MTEwOCwKKwkweGMyOGQsIDB4NjIwMiwgMHgwMTJlLCAweDA4MDQsIDB4N2FlNywgMHgwMTJlLCAweDA4MDQsIDB4N2FlMSwKKwkweDAxMmUsIDB4MDgwNCwgMHg3YWRiLCAweDAxMmUsIDB4MDgwNCwgMHg3YWRlLCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweDA4MGMsIDB4NjdiZiwgMHgwNWUwLCAweDIwNjEsIDB4MWE0OCwKKwkweDYwMDAsIDB4ZDA4NCwgMHgwNWI4LCAweDYyMDQsIDB4NjMwOCwgMHhkMDhjLCAweDE1MzAsIDB4YWM3OCwKKwkweDk0ODQsIDB4MDAwMywgMHgwMTcwLCAweGE5ODgsIDB4OTE4YywgMHgwMGZmLCAweDgwMDEsIDB4MTEyMCwKKwkweDIxMDAsIDB4OTIxMCwgMHgwNjIwLCAweDAwMjgsIDB4ODAwMSwgMHgxNTA4LCAweDIxMDAsIDB4OTIxMiwKKwkweDAyZjAsIDB4OTQ4NCwgMHgwMDBjLCAweDAxODgsIDB4YTk4OCwgMHg4MTBmLCAweDkxOGMsIDB4MDBmZiwKKwkweDkwODIsIDB4MDAwNCwgMHgxMTIwLCAweDIxMDAsIDB4OTMxOCwgMHgwMjg4LCAweDAwMzAsIDB4OTA4MiwKKwkweDAwMDQsIDB4MTE2OCwgMHgyMTAwLCAweDkzMWEsIDB4MDI1MCwgMHhhODkwLCAweDkwMDUsIDB4MDExMCwKKwkweDgwMDAsIDB4NjAxNiwgMHg2MjA2LCAweDYzMGEsIDB4MDEyZSwgMHgwODA0LCAweDdhZTcsIDB4MDEyZSwKKwkweDA4MDQsIDB4N2FlNCwgMHgwMTJlLCAweDA4MDQsIDB4N2FlMSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDcwMDcsIDB4MDAwMSwgMHgyMDYxLCAweDFhNDgsIDB4NjMwMCwgMHhkMzhjLCAweDExMjAsIDB4NjMwOCwKKwkweDgzMTgsIDB4MDIyMCwgMHg2MzBhLCAweDAxMmUsIDB4MDgwNCwgMHg3YWY1LCAweDAxMmUsIDB4MDgwNCwKKwkweDdhZTQsIDB4MDBiNiwgMHgwMTI2LCAweDAwYzYsIDB4MjA5MSwgMHg4MDAwLCAweDcwMDcsIDB4MDAwMSwKKwkweGE4N2MsIDB4ZDBhYywgMHgwMTQ4LCAweDAwYzYsIDB4MjA2MSwgMHgxYTQ4LCAweDYwMDAsIDB4OTA4NCwKKwkweGZjZmYsIDB4NjAwMiwgMHgwMGNlLCAweDA0NDAsIDB4YTg4OCwgMHg5MDA1LCAweDA1ZDgsIDB4YTg4YywKKwkweDkwNjUsIDB4MDU5OCwgMHgyMDAxLCAweDE4MzMsIDB4MjAwNCwgMHg5MDA1LCAweDAxMTgsIDB4MDgwYywKKwkweGExMTMsIDB4MDA2OCwgMHg2MDE3LCAweGY0MDAsIDB4NjA1YiwgMHgwMDAwLCAweGE5N2MsIDB4ZDFhNCwKKwkweDAxMTAsIDB4YTk4MCwgMHg2MTVhLCAweDIwMDksIDB4MDA0MSwgMHgwODBjLCAweGExNWQsIDB4YTk4OCwKKwkweDkxOGMsIDB4ZmYwMCwgMHg5MTg2LCAweDIwMDAsIDB4MTEzOCwgMHgwMDI2LCAweDkwMGUsIDB4MjAxMSwKKwkweGZkZmYsIDB4MDgwYywgMHg4NGQxLCAweDAwMmUsIDB4YTg3YywgMHhkMGM0LCAweDAxNDgsIDB4MjA2MSwKKwkweDFhNDgsIDB4NjAwMCwgMHhkMDhjLCAweDExMjAsIDB4NjAwOCwgMHg4MDAwLCAweDAyMDgsIDB4NjAwYSwKKwkweDAwY2UsIDB4MDEyZSwgMHgwMGJlLCAweDA4MDQsIDB4N2FlNywgMHgwMGNlLCAweDAxMmUsIDB4MDBiZSwKKwkweDA4MDQsIDB4N2FlMSwgMHhhOTg0LCAweDkxODYsIDB4MDAyZSwgMHgwZDMwLCAweDkxODYsIDB4MDAyZCwKKwkweDBkMTgsIDB4OTE4NiwgMHgwMDQ1LCAweDA1MTAsIDB4OTE4NiwgMHgwMDJhLCAweDExMzAsIDB4MjAwMSwKKwkweDE4MGMsIDB4MjAwYywgMHhjMTk0LCAweDIxMDIsIDB4MDhiOCwgMHg5MTg2LCAweDAwMjAsIDB4MDE1OCwKKwkweDkxODYsIDB4MDAyOSwgMHgxZDEwLCAweGE5NzQsIDB4MDgwYywgMHg2NDlmLCAweDE5NjgsIDB4YjgwMCwKKwkweGMwZTQsIDB4YjgwMiwgMHgwODQ4LCAweGE4OGMsIDB4OTA2NSwgMHgwOWI4LCAweDYwMDcsIDB4MDAyNCwKKwkweDIwMDEsIDB4MTk1ZSwgMHgyMDA0LCAweDYwMWEsIDB4MDgwNCwgMHg3OTdjLCAweGE4OGMsIDB4OTA2NSwKKwkweDA5NjAsIDB4MDBlNiwgMHhhODkwLCAweDkwNzUsIDB4MjAwMSwgMHgxODMzLCAweDIwMDQsIDB4OTAwNSwKKwkweDAxNTAsIDB4MDgwYywgMHhhMTEzLCAweDhlZmYsIDB4MDExOCwgMHgyZTYwLCAweDA4MGMsIDB4YTExMywKKwkweDAwZWUsIDB4MDgwNCwgMHg3OTdjLCAweDYwMjQsIDB4YzBkYywgMHhjMGQ1LCAweDYwMjYsIDB4MmU2MCwKKwkweDYwMDcsIDB4MDAzYSwgMHhhOGEwLCAweDkwMDUsIDB4MDEzMCwgMHg2MDA3LCAweDAwM2IsIDB4YThhNCwKKwkweDYwMmUsIDB4YThhOCwgMHg2MDE2LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDg2NzksIDB4MDgwYywKKwkweDhjMTAsIDB4MDBlZSwgMHgwODA0LCAweDc5N2MsIDB4MjA2MSwgMHgxYTQ4LCAweDYwMDAsIDB4ZDA4NCwKKwkweDAxOTAsIDB4ZDA4YywgMHgxOTA0LCAweDdhZjUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjIwNCwKKwkweDgyMTAsIDB4MDIyMCwgMHg2MjA2LCAweDAxMmUsIDB4MDgwNCwgMHg3YWY1LCAweDAxMmUsIDB4YTg4MywKKwkweDAwMTYsIDB4MDgwNCwgMHg3YWVlLCAweGE4ODMsIDB4MDAwNywgMHgwODA0LCAweDdhZWUsIDB4YTg2NCwKKwkweDgwMDcsIDB4OTA4NCwgMHgwMGZmLCAweDAxMzAsIDB4ODAwMSwgMHgxMTM4LCAweDcwMDcsIDB4MDAwMSwKKwkweDAwNjksIDB4MDAwNSwgMHgwODBjLCAweDc2NjIsIDB4MDA0MCwgMHg3MDA3LCAweDAwMDMsIDB4NzAxMiwKKwkweDI5MDAsIDB4NzAxNiwgMHg3MDFhLCAweDcwNGIsIDB4N2ExZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBlNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDkwM2UsIDB4MjA2MSwgMHgxODAwLCAweDYxY2MsIDB4ODFmZiwKKwkweDE5MDQsIDB4N2FhMCwgMHg2MTMwLCAweGQxOTQsIDB4MTkwNCwgMHg3YWNhLCAweGE4NzgsIDB4MjA3MCwKKwkweDllODIsIDB4MWNkMCwgMHgwYTA0LCAweDdhOTQsIDB4NjA2NCwgMHg5ZTAyLCAweDFhMDQsIDB4N2E5NCwKKwkweDcxMjAsIDB4OTE4NiwgMHgwMDA2LCAweDE5MDQsIDB4N2E4NiwgMHg3MDEwLCAweDkwNWQsIDB4MDkwNCwKKwkweDdhYTAsIDB4YjgwMCwgMHhkMGU0LCAweDE5MDQsIDB4N2FjNCwgMHgyMDYxLCAweDFhNDgsIDB4NjEwMCwKKwkweDkxODQsIDB4MDMwMSwgMHg5MDg2LCAweDAwMDEsIDB4MTVhMCwgMHg3MDI0LCAweGQwZGMsIDB4MTkwNCwKKwkweDdhY2QsIDB4YTg4MywgMHgwMDAwLCAweGE4MDMsIDB4MDAwMCwgMHgyOTA4LCAweDcwMTQsIDB4OTAwNSwKKwkweDExOTgsIDB4NzExNiwgMHhhODdjLCAweGQwZjQsIDB4MTkwNCwgMHg3YWQwLCAweDA4MGMsIDB4NTVkYiwKKwkweGQwOWMsIDB4MTExOCwgMHhhODdjLCAweGMwY2MsIDB4YTg3ZSwgMHgyZTYwLCAweDA4MGMsIDB4ODNmMSwKKwkweDAxMmUsIDB4MDBlZSwgMHgwMGJlLCAweDAwMDUsIDB4MjA0OCwgMHhhODAwLCAweDkwMDUsIDB4MWRlMCwKKwkweGE5MDIsIDB4MjE0OCwgMHhhODdjLCAweGQwZjQsIDB4MTkwNCwgMHg3YWQwLCAweDAxMmUsIDB4MDBlZSwKKwkweDAwYmUsIDB4MDAwNSwgMHgwMTJlLCAweDAwZWUsIDB4YTg4MywgMHgwMDA2LCAweDAwYmUsIDB4MDgwNCwKKwkweDdhZWUsIDB4ZDE4NCwgMHgwZGI4LCAweGQxYzQsIDB4MTE5MCwgMHgwMGEwLCAweGE5NzQsIDB4MDgwYywKKwkweDY0OWYsIDB4MTVkMCwgMHhiODAwLCAweGQwZTQsIDB4MTViOCwgMHg3MTIwLCAweDkxODYsIDB4MDAwNywKKwkweDExMTgsIDB4YTg4MywgMHgwMDAyLCAweDA0OTAsIDB4YTg4MywgMHgwMDA4LCAweDA0NzgsIDB4YTg4MywKKwkweDAwMGUsIDB4MDQ2MCwgMHhhODgzLCAweDAwMTcsIDB4MDQ0OCwgMHhhODgzLCAweDAwMzUsIDB4MDQzMCwKKwkweDA4MGMsIDB4NTVkZiwgMHhkMGZjLCAweDAxZTgsIDB4YTg3OCwgMHgyMDcwLCAweDllODIsIDB4MWNkMCwKKwkweDAyYzAsIDB4NjA2NCwgMHg5ZTAyLCAweDEyYTgsIDB4NzEyMCwgMHg5MTg2LCAweDAwMDYsIDB4MTE4OCwKKwkweDcwMTAsIDB4OTA1ZCwgMHgwMTcwLCAweGI4MDAsIDB4ZDBiYywgMHgwMTU4LCAweDIwMzksIDB4MDAwMSwKKwkweDcwMDAsIDB4OTA4NiwgMHgwMDA3LCAweDE5MDQsIDB4N2EyYSwgMHg3MDAzLCAweDAwMDIsIDB4MDgwNCwKKwkweDdhMmEsIDB4YTg4MywgMHgwMDI4LCAweDAwMTAsIDB4YTg4MywgMHgwMDI5LCAweDAxMmUsIDB4MDBlZSwKKwkweDAwYmUsIDB4MDQyMCwgMHhhODgzLCAweDAwMmEsIDB4MGNjOCwgMHhhODgzLCAweDAwNDUsIDB4MGNiMCwKKwkweDJlNjAsIDB4MjAxOSwgMHgwMDAyLCAweDYwMWIsIDB4MDAxNCwgMHgwODBjLCAweGQ0NDAsIDB4MDEyZSwKKwkweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweDIwMDksIDB4MDAzZSwgMHgwMDU4LCAweDIwMDksIDB4MDAwNCwKKwkweDAwNDAsIDB4MjAwOSwgMHgwMDA2LCAweDAwMjgsIDB4MjAwOSwgMHgwMDE2LCAweDAwMTAsIDB4MjAwOSwKKwkweDAwMDEsIDB4YTg4NCwgMHg5MDg0LCAweGZmMDAsIDB4OTEwNSwgMHhhODg2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDgwYywgMHg2YWU5LCAweDAxMmUsIDB4MDAwNSwgMHgwODBjLCAweDEwNjMsIDB4MDAwNSwKKwkweDAwZDYsIDB4MDgwYywgMHg4M2U4LCAweDAwZGUsIDB4MDAwNSwgMHgwMGQ2LCAweDAwZTYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDAwNDAsIDB4NzAyYywgMHhkMDg0LCAweDAxZDgsIDB4OTA4YywKKwkweDA3ODAsIDB4MTkwYywgMHg3Yjg5LCAweGQwOWMsIDB4MTFhOCwgMHgyMDcxLCAweDE4MDAsIDB4NzBiYywKKwkweDkwZWEsIDB4MDA0MCwgMHgwMjc4LCAweDgwMDEsIDB4NzBiZSwgMHg3MDJjLCAweDIwNDgsIDB4YTgwMCwKKwkweDcwMmUsIDB4OTAwNiwgMHhhODAyLCAweGE4MDYsIDB4MjA3MSwgMHgwMDQwLCAweDI5MDAsIDB4NzAyMiwKKwkweDcwMmMsIDB4MGMyOCwgMHgwMTJlLCAweDAwZWUsIDB4MDBkZSwgMHgwMDA1LCAweDAwMDYsIDB4OTA4NCwKKwkweDA3ODAsIDB4MTkwYywgMHg3Yjg5LCAweDAwMGUsIDB4MDAwNSwgMHgwMGQ2LCAweDAwYzYsIDB4MDAzNiwKKwkweDAwMjYsIDB4MDAxNiwgMHgwMGI2LCAweDcwMDcsIDB4MDAwMSwgMHhhYTc0LCAweDkyODIsIDB4MDAwNCwKKwkweDFhMDQsIDB4N2I3YSwgMHhhOTdjLCAweDkxODgsIDB4MTAwMCwgMHgyMTA0LCAweDkwNWQsIDB4YjgwNCwKKwkweGQyODQsIDB4MDE0MCwgMHgwNWU4LCAweDgwMDcsIDB4OTA4NCwgMHgwMGZmLCAweDkwODQsIDB4MDAwNiwKKwkweDExMDgsIDB4MDRiMCwgMHgyYjEwLCAweDA4MGMsIDB4YTA4ZCwgMHgxMTE4LCAweDA4MGMsIDB4YTEzMCwKKwkweDA1YTgsIDB4NjIxMiwgMHhhODc0LCAweDAwMDIsIDB4N2I1OCwgMHg3YjVkLCAweDdiNjAsIDB4N2I2NiwKKwkweDIwMTksIDB4MDAwMiwgMHgwODBjLCAweGQ4MDEsIDB4MDA2MCwgMHgwODBjLCAweGQ3OWQsIDB4MDA0OCwKKwkweDIwMTksIDB4MDAwMiwgMHhhOTgwLCAweDA4MGMsIDB4ZDdiOCwgMHgwMDE4LCAweGE5ODAsIDB4MDgwYywKKwkweGQ3OWQsIDB4MDgwYywgMHhhMGUzLCAweGE4ODcsIDB4MDAwMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4NmFlOSwgMHgwMTJlLCAweDAwYmUsIDB4MDAxZSwgMHgwMDJlLCAweDAwM2UsIDB4MDBjZSwKKwkweDAwZGUsIDB4MDAwNSwgMHhhODg3LCAweDAwMDYsIDB4MGM4MCwgMHhhODg3LCAweDAwMDIsIDB4MGM2OCwKKwkweGE4ODcsIDB4MDAwNSwgMHgwYzUwLCAweGE4ODcsIDB4MDAwNCwgMHgwYzM4LCAweGE4ODcsIDB4MDAwNywKKwkweDBjMjAsIDB4MjA5MSwgMHg4MDAwLCAweDBlMDQsIDB4N2I4YiwgMHgwMDA2LCAweDAwMTYsIDB4MjAwMSwKKwkweDgwMDMsIDB4MDAwNiwgMHgwODA0LCAweDBlMDMsIDB4MjAwMSwgMHgxODMzLCAweDIwMDQsIDB4OTAwNSwKKwkweDAwMDUsIDB4MDAwNSwgMHgwMGY2LCAweDIwNzksIDB4MDMwMCwgMHgyMDAxLCAweDAyMDAsIDB4MjAwYywKKwkweGMxZTUsIDB4YzFkYywgMHgyMTAyLCAweDIwMDksIDB4MDIxOCwgMHgyMTBjLCAweGQxZWMsIDB4MTEyMCwKKwkweDA4MGMsIDB4MTUxYSwgMHgwMGZlLCAweDAwMDUsIDB4MjAwMSwgMHgwMjBkLCAweDIwMDMsIDB4MDAyMCwKKwkweDc4MWYsIDB4MDMwMCwgMHgwMGZlLCAweDAwMDUsIDB4NzgxYywgMHhkMDhjLCAweDA5MDQsIDB4N2MwYiwKKwkweDY4YmMsIDB4OTBhYSwgMHgwMDA1LCAweDBhMDQsIDB4ODFlNywgMHg3ZDQ0LCAweDdjNDAsIDB4OTU4NCwKKwkweDAwZjYsIDB4MTUxMCwgMHg5NDg0LCAweDcwMDAsIDB4MDE0MCwgMHg5MDhhLCAweDIwMDAsIDB4MTI2MCwKKwkweDk1ODQsIDB4MDcwMCwgMHg4MDA3LCAweDA4MDQsIDB4N2MxMiwgMHg3MDAwLCAweDkwODQsIDB4ZmYwMCwKKwkweDkwODYsIDB4ODEwMCwgMHgwZGE4LCAweDAwYjAsIDB4OTQ4NCwgMHgwZmZmLCAweDExMzAsIDB4NzAwMCwKKwkweDkwODQsIDB4ZmYwMCwgMHg5MDg2LCAweDgxMDAsIDB4MTFjMCwgMHgwODBjLCAweGRiZWIsIDB4MDgwYywKKwkweDgxMWMsIDB4NzgxNywgMHgwMTQwLCAweDAwYTgsIDB4OTU4NCwgMHgwMDc2LCAweDExMTgsIDB4MDgwYywKKwkweDgxN2EsIDB4MTljMCwgMHhkNWE0LCAweDAxNDgsIDB4MDA0NiwgMHgwMDU2LCAweDA4MGMsIDB4N2M2ZCwKKwkweDA4MGMsIDB4MjI2ZiwgMHgwMDVlLCAweDAwNGUsIDB4MDAyMCwgMHgwODBjLCAweGRiZWIsIDB4NzgxNywKKwkweDAxNDAsIDB4MDgwYywgMHg3MjA3LCAweDAxNjgsIDB4MjAwMSwgMHgwMTExLCAweDIwMDQsIDB4ZDA4YywKKwkweDAxNDAsIDB4Njg4ZiwgMHgwMDAwLCAweDIwMDEsIDB4MDExMCwgMHgyMDAzLCAweDAwMDgsIDB4MjAwMywKKwkweDAwMDAsIDB4MDgwYywgMHg3YzRlLCAweDIwMDEsIDB4MTljOCwgMHgyMDA0LCAweDkwMDUsIDB4MDkwYywKKwkweDhjMTAsIDB4MDAwNSwgMHgwMDAyLCAweDdjMjQsIDB4N2YyNCwgMHg3YzFiLCAweDdjMWIsIDB4N2MxYiwKKwkweDdjMWIsIDB4N2MxYiwgMHg3YzFiLCAweDc4MTcsIDB4MDE0MCwgMHgyMDAxLCAweDE5YzgsIDB4MjAwNCwKKwkweDkwMDUsIDB4MDkwYywgMHg4YzEwLCAweDAwMDUsIDB4NzAwMCwgMHg5MDhjLCAweGZmMDAsIDB4OTE5NCwKKwkweGYwMDAsIDB4ODEwZiwgMHg5NDg0LCAweDBmZmYsIDB4Njg4ZSwgMHg5Mjg2LCAweDIwMDAsIDB4MTE1MCwKKwkweDY4MDAsIDB4OTA4NiwgMHgwMDAxLCAweDExMTgsIDB4MDgwYywgMHg1NjQxLCAweDAwNzAsIDB4MDgwYywKKwkweDdjOGQsIDB4MDA1OCwgMHg5Mjg2LCAweDMwMDAsIDB4MTExOCwgMHgwODBjLCAweDdlNWMsIDB4MDAyOCwKKwkweDkyODYsIDB4ODAwMCwgMHgxMTEwLCAweDA4MGMsIDB4ODA0MywgMHg3ODE3LCAweDAxNDAsIDB4MjAwMSwKKwkweDE5YzgsIDB4MjAwNCwgMHg5MDA1LCAweDA5MGMsIDB4OGMxMCwgMHgwMDA1LCAweDIwMDEsIDB4MTgxMCwKKwkweDIwMDQsIDB4ZDA4YywgMHgwMTc4LCAweDIwMDEsIDB4MTgwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwMywKKwkweDExNDgsIDB4MDAyNiwgMHgwMDM2LCAweDIwMTEsIDB4ODA0OCwgMHgyNTE4LCAweDA4MGMsIDB4NGIxZiwKKwkweDAwM2UsIDB4MDAyZSwgMHgwMDA1LCAweDAwMzYsIDB4MDA0NiwgMHgwMDU2LCAweDAwZjYsIDB4MjA3OSwKKwkweDAyMDAsIDB4MjAxOSwgMHhmZmZlLCAweDdjMzAsIDB4MDA1MCwgMHgwMDM2LCAweDAwNDYsIDB4MDA1NiwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMjAwLCAweDdkNDQsIDB4N2M0MCwgMHgyMDE5LCAweGZmZmYsIDB4MjAwMSwKKwkweDE4MTAsIDB4MjAwNCwgMHhkMDhjLCAweDAxNjAsIDB4MjAwMSwgMHgxODAwLCAweDIwMDQsIDB4OTA4NiwKKwkweDAwMDMsIDB4MTEzMCwgMHgwMDI2LCAweDIwMTEsIDB4ODA0OCwgMHgwODBjLCAweDRiMWYsIDB4MDAyZSwKKwkweDAwZmUsIDB4MDA1ZSwgMHgwMDRlLCAweDAwM2UsIDB4MDAwNSwgMHgwMGI2LCAweDAwYzYsIDB4NzAxMCwKKwkweDkwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwOTYsIDB4MDAwMSwgMHgwMTIwLCAweDkwOTYsIDB4MDAyMywKKwkweDE5MDQsIDB4N2UyZCwgMHg5MTg2LCAweDAwMjMsIDB4MTVjMCwgMHgwODBjLCAweDgwZTEsIDB4MDkwNCwKKwkweDdlMmQsIDB4NjEyMCwgMHg5MTg2LCAweDAwMDEsIDB4MDE1MCwgMHg5MTg2LCAweDAwMDQsIDB4MDEzOCwKKwkweDkxODYsIDB4MDAwOCwgMHgwMTIwLCAweDkxODYsIDB4MDAwYSwgMHgxOTA0LCAweDdlMmQsIDB4NzEyNCwKKwkweDYxMGEsIDB4NzAzMCwgMHg5MDhlLCAweDAyMDAsIDB4MTEzMCwgMHgyMDA5LCAweDAwMTUsIDB4MDgwYywKKwkweGExNWQsIDB4MDgwNCwgMHg3ZTJkLCAweDkwOGUsIDB4MDIxNCwgMHgwMTE4LCAweDkwOGUsIDB4MDIxMCwKKwkweDExMzAsIDB4MjAwOSwgMHgwMDE1LCAweDA4MGMsIDB4YTE1ZCwgMHgwODA0LCAweDdlMmQsIDB4OTA4ZSwKKwkweDAxMDAsIDB4MTkwNCwgMHg3ZTJkLCAweDcwMzQsIDB4OTAwNSwgMHgxOTA0LCAweDdlMmQsIDB4MjAwOSwKKwkweDAwMTYsIDB4MDgwYywgMHhhMTVkLCAweDA4MDQsIDB4N2UyZCwgMHg5MTg2LCAweDAwMjIsIDB4MTkwNCwKKwkweDdlMmQsIDB4NzAzMCwgMHg5MDhlLCAweDAzMDAsIDB4MTU4MCwgMHg2OGQ4LCAweGQwYTQsIDB4MDUyOCwKKwkweGMwYjUsIDB4NjhkYSwgMHg3MTAwLCAweDkxOGMsIDB4MDBmZiwgMHg2OTdhLCAweDcwMDQsIDB4Njg3ZSwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDc5ZTYsIDB4NzhlYSwgMHgwMDA2LCAweDkwODQsIDB4MDBmZiwKKwkweDAwMTYsIDB4MjAwOCwgMHgwODBjLCAweDI3YjcsIDB4NzkzMiwgMHg3OTM2LCAweDAwMWUsIDB4MDAwZSwKKwkweDAwZmUsIDB4MDgwYywgMHgyNzZlLCAweDY5NWEsIDB4NzAzYywgMHgwMGU2LCAweDIwNzEsIDB4MDE0MCwKKwkweDcwODYsIDB4MjA3MSwgMHgxODAwLCAweDcwYjIsIDB4MDBlZSwgMHg3MDM0LCAweDkwMDUsIDB4MTkwNCwKKwkweDdlMmQsIDB4MjAwOSwgMHgwMDE3LCAweDA4MDQsIDB4N2RkZCwgMHg5MDhlLCAweDA0MDAsIDB4MTE5MCwKKwkweDcwMzQsIDB4OTAwNSwgMHgxOTA0LCAweDdlMmQsIDB4MDgwYywgMHg3MjA3LCAweDAxMjAsIDB4MjAwOSwKKwkweDAwMWQsIDB4MDgwNCwgMHg3ZGRkLCAweDY4ZDgsIDB4YzBhNSwgMHg2OGRhLCAweDIwMDksIDB4MDAzMCwKKwkweDA4MDQsIDB4N2RkZCwgMHg5MDhlLCAweDA1MDAsIDB4MTE0MCwgMHg3MDM0LCAweDkwMDUsIDB4MTkwNCwKKwkweDdlMmQsIDB4MjAwOSwgMHgwMDE4LCAweDA4MDQsIDB4N2RkZCwgMHg5MDhlLCAweDIwMTAsIDB4MTEyMCwKKwkweDIwMDksIDB4MDAxOSwgMHgwODA0LCAweDdkZGQsIDB4OTA4ZSwgMHgyMTEwLCAweDExMjAsIDB4MjAwOSwKKwkweDAwMWEsIDB4MDgwNCwgMHg3ZGRkLCAweDkwOGUsIDB4NTIwMCwgMHgxMTQwLCAweDcwMzQsIDB4OTAwNSwKKwkweDE5MDQsIDB4N2UyZCwgMHgyMDA5LCAweDAwMWIsIDB4MDgwNCwgMHg3ZGRkLCAweDkwOGUsIDB4NTAwMCwKKwkweDExNDAsIDB4NzAzNCwgMHg5MDA1LCAweDE5MDQsIDB4N2UyZCwgMHgyMDA5LCAweDAwMWMsIDB4MDgwNCwKKwkweDdkZGQsIDB4OTA4ZSwgMHgxMzAwLCAweDExMjAsIDB4MjAwOSwgMHgwMDM0LCAweDA4MDQsIDB4N2RkZCwKKwkweDkwOGUsIDB4MTIwMCwgMHgxMTQwLCAweDcwMzQsIDB4OTAwNSwgMHgxOTA0LCAweDdlMmQsIDB4MjAwOSwKKwkweDAwMjQsIDB4MDgwNCwgMHg3ZGRkLCAweDkwOGMsIDB4ZmYwMCwgMHg5MThlLCAweDI0MDAsIDB4MTE3MCwKKwkweDIwMDksIDB4MDAyZCwgMHgyMDAxLCAweDE4MTAsIDB4MjAwNCwgMHhkMDljLCAweDA5MDQsIDB4N2RkZCwKKwkweDA4MGMsIDB4Y2MwNywgMHgxOTA0LCAweDdlMmQsIDB4MDgwNCwgMHg3ZGRiLCAweDkwOGMsIDB4ZmYwMCwKKwkweDkxOGUsIDB4NTMwMCwgMHgxMTIwLCAweDIwMDksIDB4MDAyYSwgMHgwODA0LCAweDdkZGQsIDB4OTA4ZSwKKwkweDBmMDAsIDB4MTEyMCwgMHgyMDA5LCAweDAwMjAsIDB4MDgwNCwgMHg3ZGRkLCAweDkwOGUsIDB4NjEwNCwKKwkweDE1MjgsIDB4MjAyOSwgMHgwMjA1LCAweDIwMTEsIDB4MDI2ZCwgMHg4MjA4LCAweDIyMDQsIDB4OTA4MiwKKwkweDAwMDQsIDB4ODAwNCwgMHg4MDA0LCAweDIwYTgsIDB4MjAxMSwgMHg4MDE1LCAweDIxMWMsIDB4ODEwOCwKKwkweDAwNDYsIDB4MjEyNCwgMHgwODBjLCAweDRiMWYsIDB4MDA0ZSwgMHg4MTA4LCAweDBmMDQsIDB4N2RhOSwKKwkweDkxODYsIDB4MDI4MCwgMHgxZDg4LCAweDI1MDQsIDB4ODAwMCwgMHgyMDJhLCAweDIwMDksIDB4MDI2MCwKKwkweDBjNTgsIDB4MjAyYiwgMHgwMDAwLCAweDIwMDksIDB4MDAyMywgMHgwNDc4LCAweDkwOGUsIDB4NjAwMCwKKwkweDExMTgsIDB4MjAwOSwgMHgwMDNmLCAweDA0NDgsIDB4OTA4ZSwgMHg3ODAwLCAweDExMTgsIDB4MjAwOSwKKwkweDAwNDUsIDB4MDQxOCwgMHg5MDhlLCAweDEwMDAsIDB4MTExOCwgMHgyMDA5LCAweDAwNGUsIDB4MDBlOCwKKwkweDkwOGUsIDB4NjMwMCwgMHgxMTE4LCAweDIwMDksIDB4MDA0YSwgMHgwMGI4LCAweDkwOGMsIDB4ZmYwMCwKKwkweDkxOGUsIDB4NTYwMCwgMHgxMTE4LCAweDIwMDksIDB4MDA0ZiwgMHgwMDc4LCAweDkwOGMsIDB4ZmYwMCwKKwkweDkxOGUsIDB4NTcwMCwgMHgxMTE4LCAweDIwMDksIDB4MDA1MCwgMHgwMDM4LCAweDIwMDksIDB4MDAxZCwKKwkweDY4MzgsIDB4ZDBkNCwgMHgwMTEwLCAweDIwMDksIDB4MDA0YywgMHgwMDE2LCAweDIwMTEsIDB4MDI2MywKKwkweDIyMDQsIDB4ODIxMSwgMHgyMjBjLCAweDA4MGMsIDB4Mjc2ZSwgMHgxOTA0LCAweDdlMzAsIDB4MDgwYywKKwkweDY0M2YsIDB4MTkwNCwgMHg3ZTMwLCAweGJlMTIsIDB4YmQxNiwgMHgwMDFlLCAweDAwMTYsIDB4MDgwYywKKwkweDcyMDcsIDB4MDFjMCwgMHg2OGQ4LCAweGQwOGMsIDB4MTE0OCwgMHg3MDAwLCAweDkwODQsIDB4MDBmZiwKKwkweDExODgsIDB4NzAwNCwgMHg5MDg0LCAweGZmMDAsIDB4MTE2OCwgMHgwMDQwLCAweDY4NzgsIDB4OTYwNiwKKwkweDExNDgsIDB4Njg3YywgMHg5NTA2LCAweDkwODQsIDB4ZmYwMCwgMHgxMTIwLCAweDk1ODQsIDB4MDBmZiwKKwkweGI4YjIsIDB4MDA4MCwgMHhiOGIwLCAweDkwMDUsIDB4MTE2OCwgMHg5MTg2LCAweDAwNDYsIDB4MTE1MCwKKwkweDY4NzgsIDB4OTYwNiwgMHgxMTM4LCAweDY4N2MsIDB4OTUwNiwgMHg5MDg0LCAweGZmMDAsIDB4MTExMCwKKwkweDAwMWUsIDB4MDA5OCwgMHgwODBjLCAweGEwOGQsIDB4MDFhOCwgMHgyYjA4LCAweDYxMTIsIDB4NjAyMywKKwkweDAwMDQsIDB4NzEyMCwgMHg2MTBhLCAweDAwMWUsIDB4OTE4NiwgMHgwMDRjLCAweDExMTAsIDB4NjAyMywKKwkweDAwMGEsIDB4MDAxNiwgMHgwMDFlLCAweDA4MGMsIDB4YTE1ZCwgMHgwMGNlLCAweDAwYmUsIDB4MDAwNSwKKwkweDAwMWUsIDB4MGNkOCwgMHgyMDAxLCAweDE4MGUsIDB4MjAwNCwgMHhkMGVjLCAweDAxMjAsIDB4MjAxMSwKKwkweDgwNDksIDB4MDgwYywgMHg0YjFmLCAweDA4MGMsIDB4YTEzMCwgMHgwZDkwLCAweDJiMDgsIDB4NjExMiwKKwkweDYwMjMsIDB4MDAwNCwgMHg3MTIwLCAweDYxMGEsIDB4MDAxZSwgMHgwMDE2LCAweDkxODYsIDB4MDAxNywKKwkweDAxMTgsIDB4OTE4NiwgMHgwMDMwLCAweDExMjgsIDB4NjAwNywgMHgwMDA5LCAweDYwMTcsIDB4MjkwMCwKKwkweDAwMjAsIDB4NjAwNywgMHgwMDUxLCAweDYwMTcsIDB4MDAwMCwgMHg2MDJmLCAweDAwMDksIDB4NjAwMywKKwkweDAwMDEsIDB4MDgwYywgMHg4NmMxLCAweDA4YTAsIDB4MDgwYywgMHg4MjA2LCAweDExNTgsIDB4MDgwYywKKwkweDMyYWUsIDB4MTE0MCwgMHg3MDEwLCAweDkwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwOGUsIDB4MDAwOCwKKwkweDExMDgsIDB4MDAwOSwgMHgwMDA1LCAweDAwYjYsIDB4MDBjNiwgMHgwMDQ2LCAweDcwMDAsIDB4OTA4YywKKwkweGZmMDAsIDB4ODEwZiwgMHg5MTg2LCAweDAwMzMsIDB4MTFlOCwgMHgwODBjLCAweDgwZTEsIDB4MDkwNCwKKwkweDdlYmMsIDB4NzEyNCwgMHg2MTBhLCAweDcwMzAsIDB4OTA4ZSwgMHgwMjAwLCAweDExNDAsIDB4NzAzNCwKKwkweDkwMDUsIDB4MTVkMCwgMHgyMDA5LCAweDAwMTUsIDB4MDgwYywgMHhhMTVkLCAweDA0YTgsIDB4OTA4ZSwKKwkweDAxMDAsIDB4MTU5MCwgMHg3MDM0LCAweDkwMDUsIDB4MTU3OCwgMHgyMDA5LCAweDAwMTYsIDB4MDgwYywKKwkweGExNWQsIDB4MDQ1MCwgMHg5MTg2LCAweDAwMzIsIDB4MTUzOCwgMHg3MDMwLCAweDkwOGUsIDB4MTQwMCwKKwkweDE1MTgsIDB4MjAwOSwgMHgwMDM4LCAweDAwMTYsIDB4MjAxMSwgMHgwMjYzLCAweDIyMDQsIDB4ODIxMSwKKwkweDIyMGMsIDB4MDgwYywgMHgyNzZlLCAweDExYjgsIDB4MDgwYywgMHg2NDNmLCAweDExYTAsIDB4YmUxMiwKKwkweGJkMTYsIDB4MDgwYywgMHhhMDhkLCAweDAxNzgsIDB4MmIwOCwgMHg2MTEyLCAweDA4MGMsIDB4YzJiMywKKwkweDYwMjMsIDB4MDAwNCwgMHg3MTIwLCAweDYxMGEsIDB4MDAxZSwgMHgwODBjLCAweGExNWQsIDB4MDgwYywKKwkweDhjMTAsIDB4MDAxMCwgMHgwMGNlLCAweDAwMWUsIDB4MDA0ZSwgMHgwMGNlLCAweDAwYmUsIDB4MDAwNSwKKwkweDAwYjYsIDB4MDA0NiwgMHgwMGU2LCAweDAwZDYsIDB4MjAyOCwgMHgyMTMwLCAweDk2OTYsIDB4MDBmZiwKKwkweDExYjgsIDB4OTU5MiwgMHhmZmZjLCAweDAyYTAsIDB4OTU5NiwgMHhmZmZkLCAweDExMjAsIDB4MjAwOSwKKwkweDAwN2YsIDB4MDgwNCwgMHg3ZjFlLCAweDk1OTYsIDB4ZmZmZSwgMHgxMTIwLCAweDIwMDksIDB4MDA3ZSwKKwkweDA4MDQsIDB4N2YxZSwgMHg5NTk2LCAweGZmZmMsIDB4MTExOCwgMHgyMDA5LCAweDAwODAsIDB4MDRmMCwKKwkweDIwMTEsIDB4MDAwMCwgMHgyMDE5LCAweDE4MzYsIDB4MjMxYywgMHhkM2FjLCAweDAxMzAsIDB4OTAyNiwKKwkweDIwYTksIDB4MDgwMCwgMHgyMDcxLCAweDEwMDAsIDB4MDAzMCwgMHgyMDIxLCAweDAwODEsIDB4MjBhOSwKKwkweDA3N2YsIDB4MjA3MSwgMHgxMDgxLCAweDJlMWMsIDB4OTNkZCwgMHgwMDAwLCAweDExNDAsIDB4ODJmZiwKKwkweDExZDAsIDB4OTQ5NiwgMHgwMGZmLCAweDAxYjgsIDB4MjQxMCwgMHhjMmZkLCAweDAwYTAsIDB4YmYxMCwKKwkweDI2MDAsIDB4OTcwNiwgMHhiODE0LCAweDExMjAsIDB4OTU0NiwgMHgxMTEwLCAweDI0MDgsIDB4MDBiMCwKKwkweDk3NDUsIDB4MTE0OCwgMHg5NGM2LCAweDAwN2UsIDB4MDEzMCwgMHg5NGM2LCAweDAwN2YsIDB4MDExOCwKKwkweDk0YzYsIDB4MDA4MCwgMHgxZDIwLCAweDg0MjAsIDB4OGU3MCwgMHgxZjA0LCAweDdlZjMsIDB4ODJmZiwKKwkweDExMTgsIDB4OTA4NSwgMHgwMDAxLCAweDAwMTgsIDB4YzJmYywgMHgyMjA4LCAweDkwMDYsIDB4MDBkZSwKKwkweDAwZWUsIDB4MDA0ZSwgMHgwMGJlLCAweDAwMDUsIDB4MjAwMSwgMHgxODM2LCAweDIwMGMsIDB4OTE4NCwKKwkweDAwODAsIDB4MDExMCwgMHhkMThjLCAweDAxMzgsIDB4NzAwMCwgMHg5MDhjLCAweGZmMDAsIDB4ODEwZiwKKwkweDkxODQsIDB4MDAwZiwgMHgwMDRhLCAweDc4MTcsIDB4MDE0MCwgMHgyMDAxLCAweDE5YzgsIDB4MjAwNCwKKwkweDkwMDUsIDB4MDkwYywgMHg4YzEwLCAweDAwMDUsIDB4N2Y0YywgMHg3ZjRjLCAweDdmNGMsIDB4ODBmMywKKwkweDdmNGMsIDB4N2Y1NSwgMHg3ZjgwLCAweDgwMGUsIDB4N2Y0YywgMHg3ZjRjLCAweDdmNGMsIDB4N2Y0YywKKwkweDdmNGMsIDB4N2Y0YywgMHg3ZjRjLCAweDdmNGMsIDB4NzgxNywgMHgwMTQwLCAweDIwMDEsIDB4MTljOCwKKwkweDIwMDQsIDB4OTAwNSwgMHgwOTBjLCAweDhjMTAsIDB4MDAwNSwgMHgwMGI2LCAweDcxMTAsIDB4ZDFiYywKKwkweDAxZTgsIDB4NzEyMCwgMHgyMTYwLCAweDljOGMsIDB4MDAwNywgMHgxMWMwLCAweDljOGEsIDB4MWNkMCwKKwkweDAyYTgsIDB4Njg2NCwgMHg5YzAyLCAweDEyOTAsIDB4NzAwOCwgMHg5MDg0LCAweDAwZmYsIDB4NjExMCwKKwkweDIxNTgsIDB4YjkxMCwgMHg5MTA2LCAweDExNTAsIDB4NzAwYywgMHhiOTE0LCAweDkxMDYsIDB4MTEzMCwKKwkweDcxMjQsIDB4NjEwYSwgMHgyMDA5LCAweDAwNDYsIDB4MDgwYywgMHhhMTVkLCAweDc4MTcsIDB4MDE0MCwKKwkweDIwMDEsIDB4MTljOCwgMHgyMDA0LCAweDkwMDUsIDB4MDkwYywgMHg4YzEwLCAweDAwYmUsIDB4MDAwNSwKKwkweDAwYjYsIDB4MDBjNiwgMHg5NDg0LCAweDBmZmYsIDB4MDkwNCwgMHg3ZmU0LCAweDcxMTAsIDB4ZDFiYywKKwkweDE5MDQsIDB4N2ZlNCwgMHg3MTA4LCAweDcwMGMsIDB4MjAyOCwgMHg5MThjLCAweDAwZmYsIDB4MjEzMCwKKwkweDkwOTQsIDB4ZmYwMCwgMHgxNWIwLCAweDgxZmYsIDB4MTVhMCwgMHg5MDgwLCAweDMyZTksIDB4MjAwZCwKKwkweDkxOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDIwMDEsIDB4MDA4MCwgMHg5MTA2LCAweDA5MDQsIDB4N2ZlNCwKKwkweDA4MGMsIDB4NjQzZiwgMHgxOTA0LCAweDdmZTQsIDB4YmUxMiwgMHhiZDE2LCAweGI4MDAsIDB4ZDBlYywKKwkweDE1ZDgsIDB4YmEwNCwgMHg5Mjk0LCAweGZmMDAsIDB4OTI4NiwgMHgwNjAwLCAweDExYTAsIDB4MDgwYywKKwkweGEwOGQsIDB4MDVlOCwgMHgyYjA4LCAweDcwMjgsIDB4NjA0NiwgMHg3MDJjLCAweDYwNGEsIDB4NjExMiwKKwkweDYwMjMsIDB4MDAwNiwgMHg3MTIwLCAweDYxMGEsIDB4NzEzMCwgMHg2MTU2LCAweDIwMDksIDB4MDA0NCwKKwkweDA4MGMsIDB4Y2U2NSwgMHgwNDA4LCAweDA4MGMsIDB4NjdjMywgMHgxMTM4LCAweGI4MDcsIDB4MDYwNiwKKwkweDBjMzAsIDB4MTkwYywgMHg3ZWMwLCAweDExYzAsIDB4MDg5OCwgMHgwODBjLCAweGEwOGQsIDB4MmIwOCwKKwkweDAxOTgsIDB4NjExMiwgMHg2MDIzLCAweDAwMDQsIDB4NzEyMCwgMHg2MTBhLCAweDkyODYsIDB4MDQwMCwKKwkweDExMTgsIDB4NjAwNywgMHgwMDA1LCAweDAwMTAsIDB4NjAwNywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwKKwkweDA4MGMsIDB4ODZjMSwgMHgwODBjLCAweDhjMTAsIDB4NzgxNywgMHgwMTQwLCAweDIwMDEsIDB4MTljOCwKKwkweDIwMDQsIDB4OTAwNSwgMHgwOTBjLCAweDhjMTAsIDB4MDBjZSwgMHgwMGJlLCAweDAwMDUsIDB4MjAwMSwKKwkweDE4MGUsIDB4MjAwNCwgMHhkMGVjLCAweDAxMjAsIDB4MjAxMSwgMHg4MDQ5LCAweDA4MGMsIDB4NGIxZiwKKwkweDA4MGMsIDB4YTEzMCwgMHgwZDQ4LCAweDJiMDgsIDB4NjExMiwgMHg2MDIzLCAweDAwMDYsIDB4NzEyMCwKKwkweDYxMGEsIDB4NzEzMCwgMHg2MTU2LCAweDYwMTcsIDB4ZjMwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywKKwkweDAwNDEsIDB4MDgwYywgMHg4Njc5LCAweDA4MGMsIDB4OGMxMCwgMHgwOGIwLCAweDAwYjYsIDB4NzExMCwKKwkweGQxYmMsIDB4MDFlOCwgMHg3MDIwLCAweDIwNjAsIDB4OWM4NCwgMHgwMDA3LCAweDExYzAsIDB4OWM4MiwKKwkweDFjZDAsIDB4MDJhOCwgMHg2ODY0LCAweDljMDIsIDB4MTI5MCwgMHg3MDA4LCAweDkwODQsIDB4MDBmZiwKKwkweDYxMTAsIDB4MjE1OCwgMHhiOTEwLCAweDkxMDYsIDB4MTE1MCwgMHg3MDBjLCAweGI5MTQsIDB4OTEwNiwKKwkweDExMzAsIDB4NzEyNCwgMHg2MTBhLCAweDIwMDksIDB4MDA0NSwgMHgwODBjLCAweGExNWQsIDB4NzgxNywKKwkweDAxNDAsIDB4MjAwMSwgMHgxOWM4LCAweDIwMDQsIDB4OTAwNSwgMHgwOTBjLCAweDhjMTAsIDB4MDBiZSwKKwkweDAwMDUsIDB4NjEyMCwgMHg5MTg2LCAweDAwMDIsIDB4MDEyOCwgMHg5MTg2LCAweDAwMDUsIDB4MDExMCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDA4MGMsIDB4ODIwNiwgMHgxMTgwLCAweDA4MGMsIDB4MzJhZSwKKwkweDExNjgsIDB4NzAxMCwgMHg5MDg0LCAweGZmMDAsIDB4ODAwNywgMHg5MDg2LCAweDAwMDAsIDB4MTEzMCwKKwkweDkxODQsIDB4MDAwZiwgMHg5MDhhLCAweDAwMDYsIDB4MTIwOCwgMHgwMDBiLCAweDAwMDUsIDB4ODA1ZCwKKwkweDgwNWUsIDB4ODA1ZCwgMHg4MDVkLCAweDgwYzMsIDB4ODBkMiwgMHgwMDA1LCAweDAwYjYsIDB4NzAwYywKKwkweDcxMDgsIDB4MDgwYywgMHgyNzZlLCAweDE5MDQsIDB4ODBjMSwgMHgwODBjLCAweDY0M2YsIDB4MTkwNCwKKwkweDgwYzEsIDB4YmUxMiwgMHhiZDE2LCAweDcxMTAsIDB4ZDFiYywgMHgwNTQwLCAweDcwMmMsIDB4ZDA4NCwKKwkweDExMjAsIDB4YjgwMCwgMHhkMGJjLCAweDE5MDQsIDB4ODBjMSwgMHgwODBjLCAweDY3YzMsIDB4MDE0OCwKKwkweDkwODYsIDB4MDAwNCwgMHgwMTMwLCAweDA4MGMsIDB4NjdjYiwgMHgwMTE4LCAweDkwODYsIDB4MDAwNCwKKwkweDE1ODgsIDB4MDBjNiwgMHgwODBjLCAweDgwZTEsIDB4MDBjZSwgMHgwNWQ4LCAweDA4MGMsIDB4YTA4ZCwKKwkweDJiMDgsIDB4MDViOCwgMHg2MTEyLCAweDA4MGMsIDB4YzJiMywgMHg2MDIzLCAweDAwMDIsIDB4NzEyMCwKKwkweDYxMGEsIDB4MjAwOSwgMHgwMDg4LCAweDA4MGMsIDB4YTE1ZCwgMHgwNDU4LCAweDA4MGMsIDB4NjdjMywKKwkweDAxNDgsIDB4OTA4NiwgMHgwMDA0LCAweDAxMzAsIDB4MDgwYywgMHg2N2NiLCAweDAxMTgsIDB4OTA4NiwKKwkweDAwMDQsIDB4MTE4MCwgMHgwODBjLCAweGEwOGQsIDB4MmIwOCwgMHgwMWQ4LCAweDYxMTIsIDB4MDgwYywKKwkweGMyYjMsIDB4NjAyMywgMHgwMDA1LCAweDcxMjAsIDB4NjEwYSwgMHgyMDA5LCAweDAwODgsIDB4MDgwYywKKwkweGExNWQsIDB4MDA3OCwgMHgwODBjLCAweGEwOGQsIDB4MmIwOCwgMHgwMTU4LCAweDYxMTIsIDB4MDgwYywKKwkweGMyYjMsIDB4NjAyMywgMHgwMDA0LCAweDcxMjAsIDB4NjEwYSwgMHgyMDA5LCAweDAwMDEsIDB4MDgwYywKKwkweGExNWQsIDB4MDBiZSwgMHgwMDA1LCAweDcxMTAsIDB4ZDFiYywgMHgwMTU4LCAweDAwZDEsIDB4MDE0OCwKKwkweDA4MGMsIDB4ODAzOSwgMHgxMTMwLCAweDcxMjQsIDB4NjEwYSwgMHgyMDA5LCAweDAwODksIDB4MDgwYywKKwkweGExNWQsIDB4MDAwNSwgMHg3MTEwLCAweGQxYmMsIDB4MDE1OCwgMHgwMDU5LCAweDAxNDgsIDB4MDgwYywKKwkweDgwMzksIDB4MTEzMCwgMHg3MTI0LCAweDYxMGEsIDB4MjAwOSwgMHgwMDhhLCAweDA4MGMsIDB4YTE1ZCwKKwkweDAwMDUsIDB4NzAyMCwgMHgyMDYwLCAweDljODQsIDB4MDAwNywgMHgxMTU4LCAweDljODIsIDB4MWNkMCwKKwkweDAyNDAsIDB4MjAwMSwgMHgxODE5LCAweDIwMDQsIDB4OWMwMiwgMHgxMjE4LCAweDkwODUsIDB4MDAwMSwKKwkweDAwMDUsIDB4OTAwNiwgMHgwY2U4LCAweDAwYjYsIDB4NzExMCwgMHhkMWJjLCAweDExZDgsIDB4NzAyNCwKKwkweDIwNjAsIDB4OWM4NCwgMHgwMDA3LCAweDExYjAsIDB4OWM4MiwgMHgxY2QwLCAweDAyOTgsIDB4Njg2NCwKKwkweDljMDIsIDB4MTI4MCwgMHg3MDA4LCAweDkwODQsIDB4MDBmZiwgMHg2MTEwLCAweDIxNTgsIDB4YjkxMCwKKwkweDkxMDYsIDB4MTE0MCwgMHg3MDBjLCAweGI5MTQsIDB4OTEwNiwgMHgxMTIwLCAweDIwMDksIDB4MDA1MSwKKwkweDA4MGMsIDB4YTE1ZCwgMHg3ODE3LCAweDAxNDAsIDB4MjAwMSwgMHgxOWM4LCAweDIwMDQsIDB4OTAwNSwKKwkweDA5MGMsIDB4OGMxMCwgMHgwMGJlLCAweDAwMDUsIDB4MjAzMSwgMHgwMTA1LCAweDAwNjksIDB4MDAwNSwKKwkweDIwMzEsIDB4MDIwNiwgMHgwMDQ5LCAweDAwMDUsIDB4MjAzMSwgMHgwMjA3LCAweDAwMjksIDB4MDAwNSwKKwkweDIwMzEsIDB4MDIxMywgMHgwMDA5LCAweDAwMDUsIDB4MDBjNiwgMHgwMDk2LCAweDAwZjYsIDB4NzAwMCwKKwkweDkwODQsIDB4ZjAwMCwgMHg5MDg2LCAweGMwMDAsIDB4MDVkMCwgMHgwODBjLCAweGEwOGQsIDB4MDViOCwKKwkweDAwNjYsIDB4MDBjNiwgMHgwMDQ2LCAweDIwMTEsIDB4MDI2MywgMHgyMjA0LCAweDgyMTEsIDB4MjIwYywKKwkweDA4MGMsIDB4Mjc2ZSwgMHgxNWEwLCAweDA4MGMsIDB4NjQzZiwgMHgxNTg4LCAweGJlMTIsIDB4YmQxNiwKKwkweDJiMDAsIDB4MDA0ZSwgMHgwMGNlLCAweDYwMTIsIDB4MDgwYywgMHhjMmIzLCAweDA4MGMsIDB4MTAzMSwKKwkweDA1MTAsIDB4MjkwMCwgMHg2MDVhLCAweDkwMDYsIDB4YTgwMiwgMHhhODY2LCAweGFjNmEsIDB4YTg1YywKKwkweDkwZjgsIDB4MDAxYiwgMHgyMGE5LCAweDAwMGUsIDB4YTg2MCwgMHgyMGU4LCAweDIwZTEsIDB4MDAwMCwKKwkweDJmYTAsIDB4MmU5OCwgMHg0MDAzLCAweDAwNmUsIDB4NjYxNiwgMHg2MDA3LCAweDAwM2UsIDB4NjAyMywKKwkweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4ODZjMSwgMHgwODBjLCAweDhjMTAsIDB4MDBmZSwKKwkweDAwOWUsIDB4MDBjZSwgMHgwMDA1LCAweDA4MGMsIDB4YTBlMywgMHgwMDZlLCAweDBjYzAsIDB4MDA0ZSwKKwkweDAwY2UsIDB4MGNjOCwgMHgwMGM2LCAweDcwMDAsIDB4OTA4YywgMHhmZjAwLCAweDkxODQsIDB4ZjAwMCwKKwkweDgxMGYsIDB4OTA4NiwgMHgyMDAwLCAweDE5MDQsIDB4ODFkMSwgMHg5MTg2LCAweDAwMjIsIDB4MTVmMCwKKwkweDIwMDEsIDB4MDExMSwgMHgyMDA0LCAweDkwMDUsIDB4MTkwNCwgMHg4MWQzLCAweDcwMzAsIDB4OTA4ZSwKKwkweDA0MDAsIDB4MDkwNCwgMHg4MWQzLCAweDkwOGUsIDB4NjAwMCwgMHgwNWU4LCAweDkwOGUsIDB4NTQwMCwKKwkweDA1ZDAsIDB4OTA4ZSwgMHgwMzAwLCAweDExZDgsIDB4MjAwOSwgMHgxODM2LCAweDIxMGMsIDB4ZDE4YywKKwkweDE1OTAsIDB4ZDFhNCwgMHgxNTgwLCAweDA4MGMsIDB4Njc4MSwgMHgwNTg4LCAweDY4YWMsIDB4OTA4NCwKKwkweDAwZmYsIDB4NzEwMCwgMHg5MThjLCAweDAwZmYsIDB4OTEwNiwgMHgxNTE4LCAweDY4N2MsIDB4NjlhYywKKwkweDkxOGMsIDB4ZmYwMCwgMHg5MTA1LCAweDcxMDQsIDB4OTEwNiwgMHgxMWQ4LCAweDAwZTAsIDB4MjAwOSwKKwkweDAxMDMsIDB4MjEwYywgMHhkMWI0LCAweDExYTgsIDB4OTA4ZSwgMHg1MjAwLCAweDA5ZTgsIDB4OTA4ZSwKKwkweDA1MDAsIDB4MDlkMCwgMHg5MDhlLCAweDUwMDAsIDB4MDliOCwgMHgwMDU4LCAweDkxODYsIDB4MDAyMywKKwkweDExNDAsIDB4MDgwYywgMHg4MGUxLCAweDAxMjgsIDB4NjAwNCwgMHg5MDg2LCAweDAwMDIsIDB4MDExOCwKKwkweDAwMDAsIDB4OTAwNiwgMHgwMDEwLCAweDkwODUsIDB4MDAwMSwgMHgwMGNlLCAweDAwMDUsIDB4NzAzMCwKKwkweDkwOGUsIDB4MDMwMCwgMHgwMTE4LCAweDkwOGUsIDB4NTIwMCwgMHgxZDk4LCAweDIwMDEsIDB4MTgzNiwKKwkweDIwMDQsIDB4OTA4NCwgMHgwMDA5LCAweDkwODYsIDB4MDAwOCwgMHgwZDY4LCAweDBjNTAsIDB4MDBmNiwKKwkweDIwNzksIDB4MDIwMCwgMHg3ODAwLCAweGMwZTUsIDB4YzBjYywgMHg3ODAyLCAweDAwZmUsIDB4MDAwNSwKKwkweDAwZjYsIDB4MjA3OSwgMHgxODAwLCAweDc4MzQsIDB4ZDA4NCwgMHgxMTMwLCAweDIwNzksIDB4MDIwMCwKKwkweDc4MDAsIDB4OTA4NSwgMHgxMjAwLCAweDc4MDIsIDB4MDBmZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzAzNCwgMHhjMDg0LCAweDcwMzYsIDB4MDBlZSwgMHgwMDA1LCAweDAwMTYsIDB4MjAwMSwKKwkweDE4MzYsIDB4MjAwYywgMHg5MTg0LCAweDAwODAsIDB4MDExOCwgMHhkMThjLCAweDAxMTgsIDB4OTAwNiwKKwkweDAwMWUsIDB4MDAwNSwgMHg5MDg1LCAweDAwMDEsIDB4MGNkOCwgMHgyMDcxLCAweDE5ZDIsIDB4NzAwMywKKwkweDAwMDMsIDB4NzAwZiwgMHgwMzYxLCAweDkwMDYsIDB4NzAxYSwgMHg3MDcyLCAweDcwMTIsIDB4NzAxNywKKwkweDFjZDAsIDB4NzAwNywgMHgwMDAwLCAweDcwMjYsIDB4NzAyYiwgMHg5NjZjLCAweDcwMzIsIDB4NzAzNywKKwkweDk2ZDQsIDB4NzAzZiwgMHhmZmZmLCAweDcwNDIsIDB4NzA0NywgMHg1NDZkLCAweDcwNGEsIDB4NzA1YiwKKwkweDgzNzUsIDB4MDgwYywgMHgxMDRhLCAweDA5MGMsIDB4MGRmYSwgMHgyOTAwLCAweDcwM2EsIDB4YTg2NywKKwkweDAwMDMsIDB4YTg2ZiwgMHgwMTAwLCAweGE4YWIsIDB4ZGNiMCwgMHgwMDA1LCAweDIwNzEsIDB4MTlkMiwKKwkweDFkMDQsIDB4ODJjOSwgMHgyMDkxLCAweDYwMDAsIDB4NzAwYywgMHg4MDAxLCAweDcwMGUsIDB4MTUxMCwKKwkweDIwMDEsIDB4MTg3ZCwgMHgyMDA0LCAweGQwYzQsIDB4MDE1OCwgMHgzYTAwLCAweGQwOGMsIDB4MTE0MCwKKwkweDIwZDEsIDB4MDAwMCwgMHgyMGQxLCAweDAwMDEsIDB4MjBkMSwgMHgwMDAwLCAweDA4MGMsIDB4MGRmYSwKKwkweDcwMGYsIDB4MDM2MSwgMHg3MDA3LCAweDAwMDEsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweDgzYmEsIDB4NzA0MCwgMHg5MDBkLCAweDAxNDgsIDB4ODEwOSwgMHg3MTQyLCAweDExMzAsIDB4NzA0NCwKKwkweDA4MGYsIDB4MDAxOCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDI0LCAweDkwMGQsIDB4MDE4OCwKKwkweDcwMjAsIDB4ODAwMSwgMHg3MDIyLCAweDExNjgsIDB4NzAyMywgMHgwMDA5LCAweDgxMDksIDB4NzEyNiwKKwkweDkxODYsIDB4MDNlOCwgMHgxMTEwLCAweDcwMjgsIDB4MDgwZiwgMHg4MWZmLCAweDExMTAsIDB4NzAyOCwKKwkweDA4MGYsIDB4NzAzMCwgMHg5MDBkLCAweDAxODAsIDB4NzAyYywgMHg4MDAxLCAweDcwMmUsIDB4MTE2MCwKKwkweDcwMmYsIDB4MDAwOSwgMHg4MTA5LCAweDcxMzIsIDB4MDEyOCwgMHg5MTg0LCAweDAwN2YsIDB4MDkwYywKKwkweDk4MDIsIDB4MDAxMCwgMHg3MDM0LCAweDA4MGYsIDB4NzAzYywgMHg5MDA1LCAweDAxMTgsIDB4MDMxMCwKKwkweDgwMDEsIDB4NzAzZSwgMHg3MDRjLCAweDkwMGQsIDB4MDE2OCwgMHg3MDQ4LCAweDgwMDEsIDB4NzA0YSwKKwkweDExNDgsIDB4NzA0YiwgMHgwMDA5LCAweDgxMDksIDB4NzE0ZSwgMHgxMTIwLCAweDcxNTAsIDB4NzE0ZSwKKwkweDcwNTgsIDB4MDgwZiwgMHg3MDE4LCAweDkwMGQsIDB4MDFkOCwgMHgwMDE2LCAweDcwNzAsIDB4OTAwZCwKKwkweDAxNTgsIDB4NzA2YywgMHg4MDAxLCAweDcwNmUsIDB4MTEzOCwgMHg3MDZmLCAweDAwMDksIDB4ODEwOSwKKwkweDcxNzIsIDB4MTExMCwgMHg3MDc0LCAweDA4MGYsIDB4MDAxZSwgMHg3MDA4LCAweDgwMDEsIDB4NzAwYSwKKwkweDExMzgsIDB4NzAwYiwgMHgwMDA5LCAweDgxMDksIDB4NzExYSwgMHgxMTEwLCAweDcwMWMsIDB4MDgwZiwKKwkweDAxMmUsIDB4NzAwNCwgMHgwMDAyLCAweDgyZjEsIDB4ODJmMiwgMHg4MzBlLCAweDAwZTYsIDB4MjA3MSwKKwkweDE5ZDIsIDB4NzAxOCwgMHg5MDA1LCAweDExMjAsIDB4NzExYSwgMHg3MjFlLCAweDcwMGIsIDB4MDAwOSwKKwkweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwMDYsIDB4MjA3MSwgMHgxOWQyLCAweDcwMWMsIDB4OTIwNiwKKwkweDExMjAsIDB4NzAxYSwgMHg3MDFlLCAweDcwNzIsIDB4NzA3NiwgMHgwMDBlLCAweDAwZWUsIDB4MDAwNSwKKwkweDAwZTYsIDB4MjA3MSwgMHgxOWQyLCAweGI4ODgsIDB4OTEwMiwgMHgwMjA4LCAweGI5OGEsIDB4MDBlZSwKKwkweDAwMDUsIDB4MDAwNSwgMHgwMGI2LCAweDcxMTAsIDB4MDgwYywgMHg2NDlmLCAweDExNjgsIDB4Yjg4OCwKKwkweDgwMDEsIDB4MDI1MCwgMHhiODhhLCAweDExNDAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDAxNiwKKwkweDA4MGMsIDB4OGMxMCwgMHgwMDFlLCAweDAxMmUsIDB4ODEwOCwgMHg5MTgyLCAweDA4MDAsIDB4MDIxOCwKKwkweDkwMGUsIDB4NzAwNywgMHgwMDAyLCAweDcxMTIsIDB4MDBiZSwgMHgwMDA1LCAweDcwMTQsIDB4MjA2MCwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYwNDAsIDB4OTAwNSwgMHgwMTI4LCAweDgwMDEsIDB4NjA0MiwKKwkweDExMTAsIDB4MDgwYywgMHhjMTQ0LCAweDYwMTgsIDB4OTAwNSwgMHgwNTI4LCAweDgwMDEsIDB4NjAxYSwKKwkweDE1MTAsIDB4NjEyMCwgMHg5MTg2LCAweDAwMDMsIDB4MDExOCwgMHg5MTg2LCAweDAwMDYsIDB4MTFjOCwKKwkweDA4MGMsIDB4YmUzNywgMHgwMWIwLCAweDYwMTQsIDB4MjA0OCwgMHhhODg0LCAweDkwOGEsIDB4MTk5YSwKKwkweDAyODAsIDB4OTA4MiwgMHgxOTk5LCAweGE4ODYsIDB4OTA4YSwgMHgxOTlhLCAweDAyMTAsIDB4MjAwMSwKKwkweDE5OTksIDB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4OTEwOCwgMHg2MTFhLCAweGE4N2MsIDB4ZDBlNCwKKwkweDAxMTAsIDB4MDgwYywgMHhiYjIzLCAweDAxMmUsIDB4OWM4OCwgMHgwMDE4LCAweDcxMTYsIDB4MjAwMSwKKwkweDE4MTksIDB4MjAwNCwgMHg5MTAyLCAweDAyMjAsIDB4NzAxNywgMHgxY2QwLCAweDcwMDcsIDB4MDAwMCwKKwkweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE5ZDIsIDB4NzAyNywgMHgwN2QwLCAweDcwMjMsIDB4MDAwOSwKKwkweDAwZWUsIDB4MDAwNSwgMHgyMDAxLCAweDE5ZGIsIDB4MjAwMywgMHgwMDAwLCAweDAwMDUsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTlkMiwgMHg3MTMyLCAweDcwMmYsIDB4MDAwOSwgMHgwMGVlLCAweDAwMDUsIDB4MjAxMSwKKwkweDE5ZGUsIDB4MjAxMywgMHgwMDAwLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE5ZDIsIDB4NzExYSwKKwkweDcyMWUsIDB4NzAwYiwgMHgwMDA5LCAweDAwZWUsIDB4MDAwNSwgMHgwMDg2LCAweDAwMjYsIDB4NzA1NCwKKwkweDgwMDAsIDB4NzA1NiwgMHgyMDAxLCAweDE5ZTAsIDB4MjA0NCwgMHhhMDZjLCAweDkwODYsIDB4MDAwMCwKKwkweDAxNTAsIDB4NzA2OCwgMHhhMDlhLCAweDcwNjQsIDB4YTA5NiwgMHg3MDYwLCAweGEwOTIsIDB4NzA1YywKKwkweGEwOGUsIDB4MDgwYywgMHgxMTJlLCAweDAwMmUsIDB4MDA4ZSwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwKKwkweDAwOTYsIDB4MDBhNiwgMHgwMGI2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MDE1NiwKKwkweDA4MGMsIDB4ODIzZSwgMHgwMTVlLCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDBiZSwKKwkweDAwYWUsIDB4MDA5ZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTlkMiwKKwkweDcxNzIsIDB4NzI3NiwgMHg3MDZmLCAweDAwMDksIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MDAwNiwKKwkweDIwNzEsIDB4MTlkMiwgMHg3MDc0LCAweDkyMDYsIDB4MTExMCwgMHg3MDcyLCAweDcwNzYsIDB4MDAwZSwKKwkweDAwZWUsIDB4MDAwNSwgMHgyMDY5LCAweDE4MDAsIDB4NjllNCwgMHhkMWU0LCAweDE1MTgsIDB4MDAyNiwKKwkweGQxZWMsIDB4MDE0MCwgMHg2YTUwLCAweDY4NzAsIDB4OTIwMiwgMHgwMjg4LCAweDgxMTcsIDB4OTI5NCwKKwkweDAwYzAsIDB4MDA4OCwgMHg5MTg0LCAweDAwMDcsIDB4MDFhMCwgMHg4MTA5LCAweDkxODQsIDB4MDAwNywKKwkweDAxMTAsIDB4NjllNiwgMHgwMDcwLCAweDgxMDcsIDB4OTA4NCwgMHgwMDA3LCAweDkxMGQsIDB4ODEwNywKKwkweDkxMDYsIDB4OTA5NCwgMHgwMGMwLCAweDkxODQsIDB4ZmYzZiwgMHg5MjA1LCAweDY4ZTYsIDB4MDgwYywKKwkweDBmMTEsIDB4MDAyZSwgMHgwMDA1LCAweDAwYzYsIDB4MjA2MSwgMHgxYTQ4LCAweDAwY2UsIDB4MDAwNSwKKwkweDkxODQsIDB4MDAwZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHg5MDgwLCAweDFhNDgsIDB4MjA2MCwKKwkweDAwMDUsIDB4YTg4NCwgMHg5MDhhLCAweDE5OWEsIDB4MTYzOCwgMHg5MDA1LCAweDExNTAsIDB4MDBjNiwKKwkweDIwNjEsIDB4MWE0OCwgMHg2MDE0LCAweDAwY2UsIDB4OTAwNSwgMHgxMTMwLCAweDIwMDEsIDB4MDAxZSwKKwkweDAwMTgsIDB4OTA4ZSwgMHhmZmZmLCAweDAxYjAsIDB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4OTEwOCwKKwkweDYxMWEsIDB4YTg3YywgMHg5MDhjLCAweDAwYzAsIDB4OTE4ZSwgMHgwMGMwLCAweDA5MDQsIDB4ODQ3YiwKKwkweGQwYjQsIDB4MTE2OCwgMHhkMGJjLCAweDE5MDQsIDB4ODQ1NCwgMHgyMDA5LCAweDAwMDYsIDB4MDgwYywKKwkweDg0YTgsIDB4MDAwNSwgMHg5MDBlLCAweDBjNjAsIDB4MjAwMSwgMHgxOTk5LCAweDA4YjAsIDB4ZDBmYywKKwkweDAxNjAsIDB4OTA4YywgMHgwMDAzLCAweDAxMjAsIDB4OTE4ZSwgMHgwMDAzLCAweDE5MDQsIDB4ODRhMiwKKwkweDkwOGMsIDB4MjAyMCwgMHg5MThlLCAweDIwMjAsIDB4MDFhOCwgMHg2MDI0LCAweGQwZDQsIDB4MTFlOCwKKwkweDIwMDksIDB4MTg3ZCwgMHgyMTA0LCAweGQwODQsIDB4MTEzOCwgMHg4N2ZmLCAweDExMjAsIDB4MjAwOSwKKwkweDAwNDMsIDB4MDgwNCwgMHhhMTVkLCAweDAwMDUsIDB4ODdmZiwgMHgxZGU4LCAweDIwMDksIDB4MDA0MiwKKwkweDA4MDQsIDB4YTE1ZCwgMHg2MTEwLCAweDAwYjYsIDB4MjE1OCwgMHhiOTAwLCAweDAwYmUsIDB4ZDFhYywKKwkweDBkMjAsIDB4NjAyNCwgMHhjMGNkLCAweDYwMjYsIDB4MGMwMCwgMHhjMGQ0LCAweDYwMjYsIDB4YTg5MCwKKwkweDYwMmUsIDB4YTg4YywgMHg2MDMyLCAweDA4ZTAsIDB4ZDBmYywgMHgwMTYwLCAweDkwOGMsIDB4MDAwMywKKwkweDAxMjAsIDB4OTE4ZSwgMHgwMDAzLCAweDE5MDQsIDB4ODRhMiwgMHg5MDhjLCAweDIwMjAsIDB4OTE4ZSwKKwkweDIwMjAsIDB4MDE3MCwgMHgwMDc2LCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweDE2ZGIsIDB4MDBmZSwKKwkweDAwN2UsIDB4ODdmZiwgMHgxMTIwLCAweDIwMDksIDB4MDA0MiwgMHgwODBjLCAweGExNWQsIDB4MDAwNSwKKwkweDYxMTAsIDB4MDBiNiwgMHgyMTU4LCAweGI5MDAsIDB4MDBiZSwgMHhkMWFjLCAweDBkNTgsIDB4NjEyNCwKKwkweGMxY2QsIDB4NjEyNiwgMHgwYzM4LCAweGQwZmMsIDB4MDE4OCwgMHg5MDhjLCAweDIwMjAsIDB4OTE4ZSwKKwkweDIwMjAsIDB4MDFhOCwgMHg5MDg0LCAweDAwMDMsIDB4OTA4ZSwgMHgwMDAyLCAweDAxNDgsIDB4ODdmZiwKKwkweDExMjAsIDB4MjAwOSwgMHgwMDQxLCAweDA4MGMsIDB4YTE1ZCwgMHgwMDA1LCAweDAwYjksIDB4MGNlOCwKKwkweDg3ZmYsIDB4MWRkOCwgMHgyMDA5LCAweDAwNDMsIDB4MDgwYywgMHhhMTVkLCAweDBjYjAsIDB4NjExMCwKKwkweDAwYjYsIDB4MjE1OCwgMHhiOTAwLCAweDAwYmUsIDB4ZDFhYywgMHgwZDIwLCAweDYxMjQsIDB4YzFjZCwKKwkweDYxMjYsIDB4MGMwMCwgMHgyMDA5LCAweDAwMDQsIDB4MDAxOSwgMHgwMDA1LCAweDIwMDksIDB4MDAwMSwKKwkweDAwOTYsIDB4MDgwYywgMHhiZTM3LCAweDA1MTgsIDB4NjAxNCwgMHgyMDQ4LCAweGE5ODIsIDB4YTgwMCwKKwkweDYwMTYsIDB4OTE4NiwgMHgwMDAxLCAweDExODgsIDB4YTk3YywgMHg5MThjLCAweDgxMDAsIDB4OTE4ZSwKKwkweDgxMDAsIDB4MTE1OCwgMHgwMGM2LCAweDIwNjEsIDB4MWE0OCwgMHg2MjAwLCAweGQyOGMsIDB4MTEyMCwKKwkweDYyMDQsIDB4ODIxMCwgMHgwMjA4LCAweDYyMDYsIDB4MDBjZSwgMHgwODBjLCAweDY5MjMsIDB4NjAxNCwKKwkweDkwNGQsIDB4MDA3NiwgMHgyMDM5LCAweDAwMDAsIDB4MTkwYywgMHg4M2YxLCAweDAwN2UsIDB4MDA5ZSwKKwkweDAwMDUsIDB4MDE1NiwgMHgwMGM2LCAweDIwNjEsIDB4MWE0OCwgMHg2MDAwLCAweDgxZmYsIDB4MDExMCwKKwkweDkyMDUsIDB4MDAwOCwgMHg5MjA0LCAweDYwMDIsIDB4MDBjZSwgMHgwMTVlLCAweDAwMDUsIDB4NjgwMCwKKwkweGQwOGMsIDB4MTEzOCwgMHg2ODA4LCAweDkwMDUsIDB4MDEyMCwgMHg4MDAxLCAweDY4MGEsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDM2LCAweDAwNDYsIDB4MjBhOSwKKwkweDAwMTAsIDB4OTAwNiwgMHg4MDA0LCAweDgwODYsIDB4ODE4ZSwgMHgxMjA4LCAweDkyMDAsIDB4MWYwNCwKKwkweDg0ZjMsIDB4ODA4NiwgMHg4MThlLCAweDAwNGUsIDB4MDAzZSwgMHgwMTJlLCAweDAwMDUsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwMDc2LCAweDAxNTYsIDB4MjBhOSwgMHgwMDEwLCAweDkwMDUsIDB4MDFjOCwKKwkweDkxMWEsIDB4MTJiOCwgMHg4MjEzLCAweDgxOGQsIDB4MDIyOCwgMHg5MTFhLCAweDEyMjAsIDB4MWYwNCwKKwkweDg1MGEsIDB4MDAyOCwgMHg5MTFhLCAweDIzMDgsIDB4ODIxMCwgMHgxZjA0LCAweDg1MGEsIDB4MDAwNiwKKwkweDMyMDAsIDB4OTA4NCwgMHhlZmZmLCAweDIwODAsIDB4MDAwZSwgMHgwMTVlLCAweDAwN2UsIDB4MDEyZSwKKwkweDAwMDUsIDB4MDAwNiwgMHgzMjAwLCAweDkwODUsIDB4MTAwMCwgMHgwY2E4LCAweDAxMjYsIDB4MjA5MSwKKwkweDI4MDAsIDB4MjA3OSwgMHgxOWJmLCAweDAxMmUsIDB4MDBkNiwgMHgyMDY5LCAweDE5YmYsIDB4NjgwMywKKwkweDAwMDUsIDB4MDE1NiwgMHgwMTQ2LCAweDAxZDYsIDB4MjBlOSwgMHgwMDAwLCAweDIwNjksIDB4MDIwMCwKKwkweDA4MGMsIDB4OWVlYiwgMHgwNDAxLCAweDA4MGMsIDB4OWVkNiwgMHgwMGU5LCAweDA4MGMsIDB4OWVkOSwKKwkweDAwZDEsIDB4MDgwYywgMHg5ZWRjLCAweDAwYjksIDB4MDgwYywgMHg5ZWRmLCAweDAwYTEsIDB4MDgwYywKKwkweDllZTIsIDB4MDA4OSwgMHgwODBjLCAweDllZTUsIDB4MDA3MSwgMHgwODBjLCAweDllZTgsIDB4MDA1OSwKKwkweDAxZGUsIDB4MDE0ZSwgMHgwMTVlLCAweDIwNjksIDB4MDAwNCwgMHgyZDA0LCAweDkwODUsIDB4ODAwMSwKKwkweDIwNmEsIDB4MDBkZSwgMHgwMDA1LCAweDIwYTksIDB4MDAyMCwgMHgyMGExLCAweDAyNDAsIDB4MjAwMSwKKwkweDAwMDAsIDB4NDAwNCwgMHgwMDA1LCAweDAwYzYsIDB4NjAyNywgMHgwMDAxLCAweDc4MDQsIDB4OTA4NCwKKwkweDAwMDcsIDB4MDAwMiwgMHg4NTc0LCAweDg1OTgsIDB4ODVkOSwgMHg4NTdhLCAweDg1OTgsIDB4ODU3NCwKKwkweDg1NzIsIDB4ODU3MiwgMHgwODBjLCAweDBkZmEsIDB4MDgwYywgMHg4MzVhLCAweDA4MGMsIDB4OGMxMCwKKwkweDAwY2UsIDB4MDAwNSwgMHg2MmMwLCAweDgyZmYsIDB4MTExMCwgMHgwMGNlLCAweDAwMDUsIDB4MjAxMSwKKwkweDVkOTQsIDB4MDgwYywgMHg4MmRhLCAweDc4MjgsIDB4OTA5MiwgMHgwMGM4LCAweDEyMjgsIDB4ODAwMCwKKwkweDc4MmEsIDB4MDgwYywgMHg1ZGQ0LCAweDBjODgsIDB4NjJjMCwgMHgwODBjLCAweDllZWYsIDB4MDgwYywKKwkweDVkOTQsIDB4NzgwNywgMHgwMDAzLCAweDc4MjcsIDB4MDAwMCwgMHg3ODJiLCAweDAwMDAsIDB4MGMyOCwKKwkweDA4MGMsIDB4ODM1YSwgMHg2MjIwLCAweGQyYTQsIDB4MDE3MCwgMHhkMmNjLCAweDAxNjAsIDB4NzgyYiwKKwkweDAwMDAsIDB4NzgyNCwgMHg5MDY1LCAweDA5MGMsIDB4MGRmYSwgMHgyMDA5LCAweDAwMTMsIDB4MDgwYywKKwkweGExNWQsIDB4MDBjZSwgMHgwMDA1LCAweDAwYzYsIDB4NzgyNCwgMHg5MDY1LCAweDA5MGMsIDB4MGRmYSwKKwkweDc4MjgsIDB4OTA5MiwgMHhjMzUwLCAweDEyYzAsIDB4ODAwMCwgMHg3ODJhLCAweDAwY2UsIDB4MDgwYywKKwkweDJhZmUsIDB4MDI3OCwgMHgwMGM2LCAweDc5MjQsIDB4MjE2MCwgMHg2MDEwLCAweDkwNmQsIDB4MDkwYywKKwkweDBkZmEsIDB4NzgwNywgMHgwMDAwLCAweDc4MjcsIDB4MDAwMCwgMHgwMGNlLCAweDA4MGMsIDB4OGMxMCwKKwkweDBjMDAsIDB4MDgwYywgMHg5NjMyLCAweDA4ZTgsIDB4MjAxMSwgMHgwMTMwLCAweDIyMTQsIDB4MDgwYywKKwkweDllZWYsIDB4MDgwYywgMHhkYzI4LCAweDIwMDksIDB4MDAxNCwgMHgwODBjLCAweGExNWQsIDB4MDBjZSwKKwkweDA4ODAsIDB4MjAwMSwgMHgxOWRiLCAweDIwMDMsIDB4MDAwMCwgMHg2MmMwLCAweDgyZmYsIDB4MTE2MCwKKwkweDc4MmIsIDB4MDAwMCwgMHg3ODI0LCAweDkwNjUsIDB4MDkwYywgMHgwZGZhLCAweDIwMDksIDB4MDAxMywKKwkweDA4MGMsIDB4YTFhZiwgMHgwMGNlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGM2LCAweDAwZDYsIDB4NzgyNCwKKwkweDkwMDUsIDB4MDkwYywgMHgwZGZhLCAweDc4MjgsIDB4OTA5MiwgMHhjMzUwLCAweDE2NDgsIDB4ODAwMCwKKwkweDc4MmEsIDB4MDBkZSwgMHgwMGNlLCAweDAwYmUsIDB4MDgwYywgMHgyYWZlLCAweDAyZjAsIDB4MDBiNiwKKwkweDAwYzYsIDB4MDBkNiwgMHg3ODFjLCAweDkwNWQsIDB4MDkwYywgMHgwZGZhLCAweGI4MDAsIDB4YzBkYywKKwkweGI4MDIsIDB4NzkyNCwgMHgyMTYwLCAweDA4MGMsIDB4YTBlMywgMHhiOTNjLCAweDgxZmYsIDB4MDkwYywKKwkweDBkZmEsIDB4ODEwOSwgMHhiOTNlLCAweDc4MDcsIDB4MDAwMCwgMHg3ODI3LCAweDAwMDAsIDB4MDBkZSwKKwkweDAwY2UsIDB4MDBiZSwgMHgwODBjLCAweDhjMTAsIDB4MDg2OCwgMHgwODBjLCAweDk2MzIsIDB4MDg1MCwKKwkweDIwMTEsIDB4MDEzMCwgMHgyMjE0LCAweDA4MGMsIDB4OWVlZiwgMHgwODBjLCAweGRjMjgsIDB4NzgyNCwKKwkweDkwNjUsIDB4MjAwOSwgMHgwMDE0LCAweDA4MGMsIDB4YTE1ZCwgMHgwMGRlLCAweDAwY2UsIDB4MDBiZSwKKwkweDA4MDQsIDB4ODVlYSwgMHgwMGM2LCAweDIwMDEsIDB4MDA5YiwgMHgyMDA0LCAweGQwZmMsIDB4MTkwYywKKwkweDFkZWMsIDB4NjAyNCwgMHg2MDI3LCAweDAwMDIsIDB4ZDBmNCwgMHgxNTgwLCAweDYyYzgsIDB4NjBjNCwKKwkweDkyMDUsIDB4MTE3MCwgMHg3ODNjLCAweDkwNjUsIDB4MDEzMCwgMHgyMDA5LCAweDAwNDksIDB4MDgwYywKKwkweGExNWQsIDB4MDBjZSwgMHgwMDA1LCAweDIwMTEsIDB4MTlkZSwgMHgyMDEzLCAweDAwMDAsIDB4MGNjOCwKKwkweDc5M2MsIDB4ODFmZiwgMHgwZGMwLCAweDc5NDQsIDB4OTE5MiwgMHg3NTMwLCAweDEyZjAsIDB4ODEwOCwKKwkweDc5NDYsIDB4NzkzYywgMHg5MTg4LCAweDAwMDgsIDB4MjEwYywgMHg5MThlLCAweDAwMDYsIDB4MTEzOCwKKwkweDYwMTQsIDB4OTA4NCwgMHgxOTg0LCAweDkwODUsIDB4MDAxMiwgMHg2MDE2LCAweDBjMTAsIDB4NjAxNCwKKwkweDkwODQsIDB4MTk4NCwgMHg5MDg1LCAweDAwMTYsIDB4NjAxNiwgMHgwOGQ4LCAweDc5M2MsIDB4MjE2MCwKKwkweDIwMDksIDB4MDA0YSwgMHgwODBjLCAweGExNWQsIDB4MDhhMCwgMHg3ODQ4LCAweGMwODUsIDB4Nzg0YSwKKwkweDA4ODAsIDB4MDAwNiwgMHgwMDE2LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjAwZiwKKwkweDAwMDAsIDB4MmMwOCwgMHgyMDYxLCAweDE5YmYsIDB4NjAyMCwgMHg4MDAwLCAweDYwMjIsIDB4NjAxMCwKKwkweDkwMDUsIDB4MDE0OCwgMHg5MDgwLCAweDAwMDMsIDB4MjEwMiwgMHg2MTEyLCAweDAxMmUsIDB4MDBjZSwKKwkweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDYxMTYsIDB4NjExMiwgMHgwY2MwLCAweDAwZDYsIDB4MjA2OSwKKwkweDE5YmYsIDB4YjgwMCwgMHhkMGQ0LCAweDAxNjgsIDB4NjgyMCwgMHg4MDAwLCAweDY4MjIsIDB4OTA4NiwKKwkweDAwMDEsIDB4MTExMCwgMHgyYjAwLCAweDY4MWUsIDB4MDBkZSwgMHgwODA0LCAweDhjMTAsIDB4MDBkZSwKKwkweDAwMDUsIDB4YzBkNSwgMHhiODAyLCAweDY4MTgsIDB4OTAwNSwgMHgwMTY4LCAweGI4NTYsIDB4Yjg1YiwKKwkweDAwMDAsIDB4MDA4NiwgMHgwMDA2LCAweDJiMDAsIDB4NjgxYSwgMHgwMDhlLCAweGEwNWEsIDB4MDA4ZSwKKwkweDIwNjksIDB4MTliZiwgMHgwYzA4LCAweGI4NTYsIDB4Yjg1YSwgMHgyYjAwLCAweDY4MWEsIDB4NjgxZSwKKwkweDA4ZDgsIDB4MDAwNiwgMHgwMDE2LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjAwZiwKKwkweDAwMDAsIDB4MmMwOCwgMHgyMDYxLCAweDE5YmYsIDB4NjAyMCwgMHg4MDAwLCAweDYwMjIsIDB4NjAwOCwKKwkweDkwMDUsIDB4MDE0OCwgMHg5MDgwLCAweDAwMDMsIDB4MjEwMiwgMHg2MTBhLCAweDAxMmUsIDB4MDBjZSwKKwkweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDYxMGUsIDB4NjEwYSwgMHgwY2MwLCAweDAwYzYsIDB4NjAwZiwKKwkweDAwMDAsIDB4MmMwOCwgMHgyMDYxLCAweDE5YmYsIDB4NjAzNCwgMHg5MDA1LCAweDAxMzAsIDB4OTA4MCwKKwkweDAwMDMsIDB4MjEwMiwgMHg2MTM2LCAweDAwY2UsIDB4MDAwNSwgMHg2MTNhLCAweDYxMzYsIDB4MDBjZSwKKwkweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgwMGI2LCAweDAwOTYsIDB4MDA3NiwKKwkweDAwNjYsIDB4MDA1NiwgMHgwMDM2LCAweDAwMjYsIDB4MDAxNiwgMHgwMDA2LCAweDAxMjYsIDB4OTAyZSwKKwkweDIwNzEsIDB4MTliZiwgMHg3NjM4LCAweDI2NjAsIDB4MjY3OCwgMHgyMDkxLCAweDgwMDAsIDB4OGNmZiwKKwkweDA5MDQsIDB4ODc2ZCwgMHg2MDEwLCAweDIwNTgsIDB4YjhhMCwgMHg5MjA2LCAweDE5MDQsIDB4ODc2OCwKKwkweDg3ZmYsIDB4MDEyMCwgMHg2MDU0LCAweDkxMDYsIDB4MTkwNCwgMHg4NzY4LCAweDcwM2MsIDB4OWMwNiwKKwkweDExNzgsIDB4MDAzNiwgMHgyMDE5LCAweDAwMDEsIDB4MDgwYywgMHg5OTlkLCAweDcwMzMsIDB4MDAwMCwKKwkweDkwMDYsIDB4NzAzZSwgMHg3MDQyLCAweDcwNDYsIDB4NzA0YSwgMHgwMDNlLCAweDIwMjksIDB4MDAwMSwKKwkweDcwMzgsIDB4OWMzNiwgMHgxMTEwLCAweDY2MGMsIDB4NzYzYSwgMHg3MDM0LCAweDljMzYsIDB4MTE0MCwKKwkweDJjMDAsIDB4OWYzNiwgMHgwMTE4LCAweDJmMDAsIDB4NzAzNiwgMHgwMDEwLCAweDcwMzcsIDB4MDAwMCwKKwkweDY2MGMsIDB4MDA2NiwgMHgyYzAwLCAweDlmMDYsIDB4MDExMCwgMHg3ZTBlLCAweDAwMDgsIDB4MjY3OCwKKwkweDYwMGYsIDB4MDAwMCwgMHgwODBjLCAweGJlMzcsIDB4MDFmMCwgMHg2MDE0LCAweDIwNDgsIDB4NjAyMCwKKwkweDkwODYsIDB4MDAwMywgMHgxNWI4LCAweDYwMDQsIDB4OTA4NiwgMHgwMDQwLCAweDA5MGMsIDB4OWI3OCwKKwkweGE4NjcsIDB4MDEwMywgMHhhYjdhLCAweGE4NzcsIDB4MDAwMCwgMHgwMDE2LCAweDAwMzYsIDB4MDA3NiwKKwkweDA4MGMsIDB4YzEyZCwgMHgwODBjLCAweGRiMmUsIDB4MDgwYywgMHg2YWU5LCAweDAwN2UsIDB4MDAzZSwKKwkweDAwMWUsIDB4MDgwYywgMHhjMDIyLCAweDA4MGMsIDB4YTExMywgMHgwMGNlLCAweDA4MDQsIDB4ODcwNywKKwkweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDA4MDQsIDB4ODcwNywgMHg4NWZmLCAweDAxMjAsIDB4MDAzNiwKKwkweDA4MGMsIDB4OGNlZCwgMHgwMDNlLCAweDAxMmUsIDB4MDAwZSwgMHgwMDFlLCAweDAwMmUsIDB4MDAzZSwKKwkweDAwNWUsIDB4MDA2ZSwgMHgwMDdlLCAweDAwOWUsIDB4MDBiZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwKKwkweDAwZmUsIDB4MDAwNSwgMHg2MDIwLCAweDkwODYsIDB4MDAwNiwgMHgxMTU4LCAweDAwMTYsIDB4MDAzNiwKKwkweDAwNzYsIDB4MDgwYywgMHhkYjJlLCAweDA4MGMsIDB4ZDgzMCwgMHgwMDdlLCAweDAwM2UsIDB4MDAxZSwKKwkweDA4OTAsIDB4NjAyMCwgMHg5MDg2LCAweDAwMGEsIDB4MDkwNCwgMHg4NzUyLCAweDA4MDQsIDB4ODc0YiwKKwkweDAwMDYsIDB4MDA2NiwgMHgwMDk2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGY2LCAweDkwMzYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDc5LCAweDE5YmYsIDB4NzgzOCwgMHg5MDY1LCAweDA5MDQsIDB4ODdlZCwKKwkweDYwMGMsIDB4MDAwNiwgMHg2MDBmLCAweDAwMDAsIDB4NzgzYywgMHg5YzA2LCAweDExNjgsIDB4MDAzNiwKKwkweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweDk5OWQsIDB4NzgzMywgMHgwMDAwLCAweDkwMWUsIDB4N2IzZSwKKwkweDdiNDIsIDB4N2I0NiwgMHg3YjRhLCAweDAwM2UsIDB4MDgwYywgMHhiZTM3LCAweDA1NDgsIDB4NjAxNCwKKwkweDIwNDgsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDMsIDB4MTU5MCwgMHgzZTA4LCAweDkxOGUsIDB4MDAwMiwKKwkweDExODgsIDB4NjAxMCwgMHg5MDA1LCAweDAxNzAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwKKwkweGQwYmMsIDB4MDE0MCwgMHg2MDQwLCAweDkwMDUsIDB4MTFhOCwgMHgyMDAxLCAweDE5NjAsIDB4MjAwNCwKKwkweDYwNDIsIDB4MDA4MCwgMHg2MDA0LCAweDkwODYsIDB4MDA0MCwgMHgwOTBjLCAweDliNzgsIDB4YTg2NywKKwkweDAxMDMsIDB4YWI3YSwgMHhhODc3LCAweDAwMDAsIDB4MDgwYywgMHg2YWRjLCAweDA4MGMsIDB4YzAyMiwKKwkweDA4MGMsIDB4YTExMywgMHgwMDBlLCAweDA4MDQsIDB4ODdhNSwgMHg3ZTNhLCAweDdlMzYsIDB4MDEyZSwKKwkweDAwZmUsIDB4MDBkZSwgMHgwMGNlLCAweDAwOWUsIDB4MDA2ZSwgMHgwMDBlLCAweDAwMDUsIDB4NjAyMCwKKwkweDkwODYsIDB4MDAwNiwgMHgxMTE4LCAweDA4MGMsIDB4ZDgzMCwgMHgwYzUwLCAweDYwMjAsIDB4OTA4NiwKKwkweDAwMGEsIDB4MDlmOCwgMHgwOGI4LCAweDAwMTYsIDB4MDAyNiwgMHgwMDg2LCAweDkwNDYsIDB4MDA5OSwKKwkweDA4MGMsIDB4ODhlZSwgMHgwMDhlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwZjYsIDB4MDEyNiwKKwkweDIwNzksIDB4MTliZiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg4OTg1LCAweDA4MGMsIDB4OGExNSwKKwkweDAxMmUsIDB4MDBmZSwgMHgwMDA1LCAweDAwYjYsIDB4MDA5NiwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwKKwkweDAwYzYsIDB4MDA2NiwgMHgwMDE2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwKKwkweDE5YmYsIDB4NzYxNCwgMHgyNjYwLCAweDI2NzgsIDB4OGNmZiwgMHgwOTA0LCAweDg4YjMsIDB4NjAxMCwKKwkweDIwNTgsIDB4YjhhMCwgMHg5MjA2LCAweDE5MDQsIDB4ODhhZSwgMHg4OGZmLCAweDAxMjAsIDB4NjA1NCwKKwkweDkxMDYsIDB4MTkwNCwgMHg4OGFlLCAweDcwMjQsIDB4OWMwNiwgMHgxNTY4LCAweDIwNjksIDB4MDEwMCwKKwkweDY4MjAsIDB4ZDBhNCwgMHgwMTEwLCAweGQwY2MsIDB4MTUwOCwgMHgwODBjLCAweDgzNWEsIDB4MDgwYywKKwkweDk2NTYsIDB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4OWI3OCwgMHg3MDI3LCAweDAwMDAsIDB4MDAzNiwKKwkweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweDkzODQsIDB4MTAwMCwgMHgwMTM4LCAweDIwMDEsIDB4MDEwMCwKKwkweDA4MGMsIDB4MmM4OCwgMHg5MDA2LCAweDA4MGMsIDB4MmM4OCwgMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwKKwkweGQwODQsIDB4MDExMCwgMHg2ODI3LCAweDAwMDEsIDB4MDAzZSwgMHgwMDI4LCAweDYwMDMsIDB4MDAwOSwKKwkweDYzMGEsIDB4MDgwNCwgMHg4OGFlLCAweDcwMTQsIDB4OWMzNiwgMHgxMTEwLCAweDY2MGMsIDB4NzYxNiwKKwkweDcwMTAsIDB4OWMzNiwgMHgxMTQwLCAweDJjMDAsIDB4OWYzNiwgMHgwMTE4LCAweDJmMDAsIDB4NzAxMiwKKwkweDAwMTAsIDB4NzAxMywgMHgwMDAwLCAweDY2MGMsIDB4MDA2NiwgMHgyYzAwLCAweDlmMDYsIDB4MDExMCwKKwkweDdlMGUsIDB4MDAwOCwgMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywKKwkweGJlMzcsIDB4MDFlOCwgMHg2MDIwLCAweDkwODYsIDB4MDAwMywgMHgxNTgwLCAweDA4MGMsIDB4YzAzZiwKKwkweDExMTgsIDB4MDgwYywgMHhhYTgxLCAweDAwOTgsIDB4YTg2NywgMHgwMTAzLCAweGFiN2EsIDB4YTg3NywKKwkweDAwMDAsIDB4MDAxNiwgMHgwMDM2LCAweDAwODYsIDB4MDgwYywgMHhjMTJkLCAweDA4MGMsIDB4ZGIyZSwKKwkweDA4MGMsIDB4NmFlOSwgMHgwMDhlLCAweDAwM2UsIDB4MDAxZSwgMHgwODBjLCAweGMwMjIsIDB4MDgwYywKKwkweGExMTMsIDB4MDgwYywgMHg5YTRlLCAweDAwY2UsIDB4MDgwNCwgMHg4ODJjLCAweDJjNzgsIDB4NjAwYywKKwkweDIwNjAsIDB4MDgwNCwgMHg4ODJjLCAweDAxMmUsIDB4MDAwZSwgMHgwMDFlLCAweDAwNmUsIDB4MDBjZSwKKwkweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwOWUsIDB4MDBiZSwgMHgwMDA1LCAweDYwMjAsIDB4OTA4NiwKKwkweDAwMDYsIDB4MTE1OCwgMHgwMDE2LCAweDAwMzYsIDB4MDA4NiwgMHgwODBjLCAweGRiMmUsIDB4MDgwYywKKwkweGQ4MzAsIDB4MDA4ZSwgMHgwMDNlLCAweDAwMWUsIDB4MDhkMCwgMHgwODBjLCAweGFhODEsIDB4NjAyMCwKKwkweDkwODYsIDB4MDAwMiwgMHgxMTYwLCAweDYwMDQsIDB4MDAwNiwgMHg5MDg2LCAweDAwODUsIDB4MDAwZSwKKwkweDA5MDQsIDB4ODg5NCwgMHg5MDg2LCAweDAwOGIsIDB4MDkwNCwgMHg4ODk0LCAweDA4NDAsIDB4NjAyMCwKKwkweDkwODYsIDB4MDAwNSwgMHgxOTIwLCAweDYwMDQsIDB4MDAwNiwgMHg5MDg2LCAweDAwODUsIDB4MDAwZSwKKwkweDA5YzgsIDB4OTA4NiwgMHgwMDhiLCAweDA5YjAsIDB4MDgwNCwgMHg4OGE3LCAweDAwYjYsIDB4MDBhNiwKKwkweDAwOTYsIDB4MDBjNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDkyODAsIDB4MTAwMCwKKwkweDIwMDQsIDB4OTA1ZCwgMHgwOTA0LCAweDg5N2UsIDB4MDBmNiwgMHgwMGU2LCAweDAwZDYsIDB4MDA2NiwKKwkweDIwNzEsIDB4MTliZiwgMHhiZTU0LCAweDcwMTgsIDB4OWIwNiwgMHgxMTA4LCAweDc2MWEsIDB4NzAxYywKKwkweDliMDYsIDB4MTEzMCwgMHg4NmZmLCAweDExMTgsIDB4NzAxOCwgMHg3MDFlLCAweDAwMDgsIDB4NzYxZSwKKwkweGI4NTgsIDB4OTA0ZCwgMHgwMTA4LCAweGFlNTYsIDB4OTZkNSwgMHgwMDAwLCAweDAxMTAsIDB4MjkwMCwKKwkweGIwNWEsIDB4Yjg1NywgMHgwMDAwLCAweGI4NWIsIDB4MDAwMCwgMHhiODAwLCAweGMwZDQsIDB4YzBkYywKKwkweGI4MDIsIDB4MDgwYywgMHg2M2QyLCAweDA5MDQsIDB4ODk3YSwgMHg3NjI0LCAweDg2ZmYsIDB4MDkwNCwKKwkweDg5NjksIDB4OTY4MCwgMHgwMDA1LCAweDIwMDQsIDB4OTkwNiwgMHgxNWQ4LCAweDAwZDYsIDB4MjA2OSwKKwkweDAxMDAsIDB4NjhjMCwgMHg5MDA1LCAweDA1NjAsIDB4MDgwYywgMHg4MzVhLCAweDA4MGMsIDB4OTY1NiwKKwkweDY4YzMsIDB4MDAwMCwgMHgwODBjLCAweDliNzgsIDB4NzAyNywgMHgwMDAwLCAweDAwMzYsIDB4MjA2OSwKKwkweDAxNDAsIDB4NmIwNCwgMHg5Mzg0LCAweDEwMDAsIDB4MDEzOCwgMHgyMDAxLCAweDAxMDAsIDB4MDgwYywKKwkweDJjODgsIDB4OTAwNiwgMHgwODBjLCAweDJjODgsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwKKwkweDAxMTAsIDB4NjgyNywgMHgwMDAxLCAweDAwM2UsIDB4MDBkZSwgMHgwMGM2LCAweGI4M2MsIDB4OTAwNSwKKwkweDAxMTAsIDB4ODAwMSwgMHhiODNlLCAweDI2NjAsIDB4MDgwYywgMHhhMTEzLCAweDAwY2UsIDB4MDA0OCwKKwkweDAwZGUsIDB4MDBjNiwgMHgyNjYwLCAweDYwMDMsIDB4MDAwOSwgMHg2MzBhLCAweDAwY2UsIDB4MDgwNCwKKwkweDg5MjEsIDB4ODlmZiwgMHgwMTU4LCAweGE4NjcsIDB4MDEwMywgMHhhYjdhLCAweGE4NzcsIDB4MDAwMCwKKwkweDA4MGMsIDB4YzEyZCwgMHgwODBjLCAweGRiMmUsIDB4MDgwYywgMHg2YWU5LCAweDA4MGMsIDB4OWE0ZSwKKwkweDA4MDQsIDB4ODkyMSwgMHgwMDZlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAxMmUsIDB4MDAwZSwKKwkweDAwY2UsIDB4MDA5ZSwgMHgwMGFlLCAweDAwYmUsIDB4MDAwNSwgMHgwMDk2LCAweDAwMDYsIDB4MDA2NiwKKwkweDAwYzYsIDB4MDBkNiwgMHg5MDM2LCAweDc4MTQsIDB4OTA2NSwgMHgwOTA0LCAweDg5ZTgsIDB4NjAwYywKKwkweDAwMDYsIDB4NjAwZiwgMHgwMDAwLCAweDc4MjQsIDB4OWMwNiwgMHgxNTgwLCAweDIwNjksIDB4MDEwMCwKKwkweDY4MjAsIDB4ZDBhNCwgMHgwMTEwLCAweGQwY2MsIDB4MTUwOCwgMHgwODBjLCAweDgzNWEsIDB4MDgwYywKKwkweDk2NTYsIDB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4OWI3OCwgMHg3ODI3LCAweDAwMDAsIDB4MDAzNiwKKwkweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweDkzODQsIDB4MTAwMCwgMHgwMTM4LCAweDIwMDEsIDB4MDEwMCwKKwkweDA4MGMsIDB4MmM4OCwgMHg5MDA2LCAweDA4MGMsIDB4MmM4OCwgMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwKKwkweGQwODQsIDB4MDExMCwgMHg2ODI3LCAweDAwMDEsIDB4MDAzZSwgMHgwMDQwLCAweDA4MGMsIDB4Njc3OSwKKwkweDE1MjAsIDB4NjAwMywgMHgwMDA5LCAweDYzMGEsIDB4MmMzMCwgMHgwMGY4LCAweDYwMTQsIDB4MjA0OCwKKwkweDA4MGMsIDB4YmUzNSwgMHgwMWIwLCAweDYwMjAsIDB4OTA4NiwgMHgwMDAzLCAweDE1MDgsIDB4MDgwYywKKwkweGMwM2YsIDB4MTExOCwgMHgwODBjLCAweGFhODEsIDB4MDA2MCwgMHgwODBjLCAweDY3NzksIDB4MTE2OCwKKwkweGE4NjcsIDB4MDEwMywgMHhhYjdhLCAweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweDZhZTksIDB4MDgwYywKKwkweGMwMjIsIDB4MDgwYywgMHhhMTEzLCAweDA4MGMsIDB4OWE0ZSwgMHgwMDBlLCAweDA4MDQsIDB4ODk4YywKKwkweDdlMTYsIDB4N2UxMiwgMHgwMGRlLCAweDAwY2UsIDB4MDA2ZSwgMHgwMDBlLCAweDAwOWUsIDB4MDAwNSwKKwkweDYwMjAsIDB4OTA4NiwgMHgwMDA2LCAweDExMTgsIDB4MDgwYywgMHhkODMwLCAweDBjNTAsIDB4MDgwYywKKwkweGFhODEsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDIsIDB4MTE1MCwgMHg2MDA0LCAweDAwMDYsIDB4OTA4NiwKKwkweDAwODUsIDB4MDAwZSwgMHgwOTkwLCAweDkwODYsIDB4MDA4YiwgMHgwOTc4LCAweDA4ZDAsIDB4NjAyMCwKKwkweDkwODYsIDB4MDAwNSwgMHgxOWIwLCAweDYwMDQsIDB4MDAwNiwgMHg5MDg2LCAweDAwODUsIDB4MDAwZSwKKwkweDBkMTgsIDB4OTA4NiwgMHgwMDhiLCAweDBkMDAsIDB4MDg2MCwgMHgwMDA2LCAweDAwNjYsIDB4MDA5NiwKKwkweDAwYjYsIDB4MDBjNiwgMHgwMGQ2LCAweDc4MTgsIDB4OTA1ZCwgMHgwOTA0LCAweDhhOTUsIDB4Yjg1NCwKKwkweDAwMDYsIDB4OTAwNiwgMHhiODU2LCAweGI4NWEsIDB4YjgwMCwgMHhjMGQ0LCAweGMwZGMsIDB4YjgwMiwKKwkweDA4MGMsIDB4NjNkMiwgMHgwOTA0LCAweDhhOTIsIDB4N2UyNCwgMHg4NmZmLCAweDA5MDQsIDB4OGE4NSwKKwkweDk2ODAsIDB4MDAwNSwgMHgyMDA0LCAweDk5MDYsIDB4MTkwNCwgMHg4YTg1LCAweDAwZDYsIDB4MjA2OSwKKwkweDAxMDAsIDB4NjhjMCwgMHg5MDA1LCAweDA5MDQsIDB4OGE3YywgMHgwODBjLCAweDgzNWEsIDB4MDgwYywKKwkweDk2NTYsIDB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4OWI3OCwgMHg3ODI3LCAweDAwMDAsIDB4MDAzNiwKKwkweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweDkzODQsIDB4MTAwMCwgMHgwMTM4LCAweDIwMDEsIDB4MDEwMCwKKwkweDA4MGMsIDB4MmM4OCwgMHg5MDA2LCAweDA4MGMsIDB4MmM4OCwgMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwKKwkweGQwODQsIDB4MDExMCwgMHg2ODI3LCAweDAwMDEsIDB4MDAzZSwgMHgwMGRlLCAweDAwYzYsIDB4M2UwOCwKKwkweDkxOGUsIDB4MDAwMiwgMHgxMTY4LCAweGI4MDAsIDB4ZDBiYywgMHgwMTUwLCAweDk2ODAsIDB4MDAxMCwKKwkweDIwMGMsIDB4ODFmZiwgMHgxNTE4LCAweDIwMDksIDB4MTk2MCwgMHgyMTBjLCAweDIxMDIsIDB4MDBmMCwKKwkweGI4M2MsIDB4OTAwNSwgMHgwMTEwLCAweDgwMDEsIDB4YjgzZSwgMHgyNjYwLCAweDYwMGYsIDB4MDAwMCwKKwkweDA4MGMsIDB4YTExMywgMHgwMGNlLCAweDAwNDgsIDB4MDBkZSwgMHgwMGM2LCAweDI2NjAsIDB4NjAwMywKKwkweDAwMDksIDB4NjMwYSwgMHgwMGNlLCAweDA4MDQsIDB4OGEyOCwgMHg4OWZmLCAweDAxMzgsIDB4YTg2NywKKwkweDAxMDMsIDB4YWI3YSwgMHhhODc3LCAweDAwMDAsIDB4MDgwYywgMHg2YWU5LCAweDA4MGMsIDB4OWE0ZSwKKwkweDA4MDQsIDB4OGEyOCwgMHgwMDBlLCAweDA4MDQsIDB4OGExYywgMHg3ODFlLCAweDc4MWEsIDB4MDBkZSwKKwkweDAwY2UsIDB4MDBiZSwgMHgwMDllLCAweDAwNmUsIDB4MDAwZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBkNiwKKwkweDAwOTYsIDB4MDA2NiwgMHhiODAwLCAweGQwZGMsIDB4MDFhMCwgMHhiODRjLCAweDkwNGQsIDB4MDE4OCwKKwkweGE4NzgsIDB4OTYwNiwgMHgxMTcwLCAweDIwNzEsIDB4MTliZiwgMHg3MDI0LCAweDkwMzUsIDB4MDE0OCwKKwkweDkwODAsIDB4MDAwNSwgMHgyMDA0LCAweDk5MDYsIDB4MTEyMCwgMHhiODAwLCAweGMwZGMsIDB4YjgwMiwKKwkweDAwMjksIDB4MDA2ZSwgMHgwMDllLCAweDAwZGUsIDB4MDBlZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwKKwkweDAxMDAsIDB4NzhjMCwgMHg5MDA1LCAweDExMzgsIDB4MDBjNiwgMHgyNjYwLCAweDYwMDMsIDB4MDAwOSwKKwkweDYzMGEsIDB4MDBjZSwgMHgwNGI4LCAweDA4MGMsIDB4OTY1NiwgMHg3OGMzLCAweDAwMDAsIDB4MDgwYywKKwkweDliNzgsIDB4NzAyNywgMHgwMDAwLCAweDAwMzYsIDB4MjA3OSwgMHgwMTQwLCAweDdiMDQsIDB4OTM4NCwKKwkweDEwMDAsIDB4MDEzOCwgMHgyMDAxLCAweDAxMDAsIDB4MDgwYywgMHgyYzg4LCAweDkwMDYsIDB4MDgwYywKKwkweDJjODgsIDB4MjA3OSwgMHgwMTAwLCAweDc4MjQsIDB4ZDA4NCwgMHgwMTEwLCAweDc4MjcsIDB4MDAwMSwKKwkweDA4MGMsIDB4OWI3OCwgMHgwMDNlLCAweDA4MGMsIDB4NjNkMiwgMHgwMGM2LCAweGI4M2MsIDB4OTAwNSwKKwkweDAxMTAsIDB4ODAwMSwgMHhiODNlLCAweDI2NjAsIDB4MDgwYywgMHhhMGUzLCAweDAwY2UsIDB4YTg2NywKKwkweDAxMDMsIDB4YWI3YSwgMHhhODc3LCAweDAwMDAsIDB4MDgwYywgMHhjMTJkLCAweDA4MGMsIDB4NmFlOSwKKwkweDA4MGMsIDB4OWE0ZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGU2LCAweDAwYzYsIDB4MjAxMSwKKwkweDAxMDEsIDB4MjIwNCwgMHhjMGM0LCAweDIwMTIsIDB4MjAwMSwgMHgxODBjLCAweDIwMTQsIDB4YzJlNCwKKwkweDIyMDIsIDB4MjA3MSwgMHgxOWJmLCAweDcwMDQsIDB4OTA4NCwgMHgwMDA3LCAweDAwMDIsIDB4OGIyMSwKKwkweDhiMjUsIDB4OGI0MywgMHg4YjZjLCAweDhiYWEsIDB4OGIyMSwgMHg4YjNjLCAweDhiMWYsIDB4MDgwYywKKwkweDBkZmEsIDB4MDBjZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHg3MDI0LCAweDkwNjUsIDB4MDE0OCwKKwkweDcwMjAsIDB4ODAwMSwgMHg3MDIyLCAweDYwMGMsIDB4OTAxNSwgMHgwMTU4LCAweDcyMTYsIDB4NjAwZiwKKwkweDAwMDAsIDB4NzAwNywgMHgwMDAwLCAweDcwMjcsIDB4MDAwMCwgMHgwMGNlLCAweDAwZWUsIDB4MDBiZSwKKwkweDAwMDUsIDB4NzIxNiwgMHg3MjEyLCAweDBjYTgsIDB4NzAwNywgMHgwMDAwLCAweDcwMjcsIDB4MDAwMCwKKwkweDcwMjAsIDB4OTAwNSwgMHgwMDcwLCAweDYwMTAsIDB4MjA1OCwgMHgwODBjLCAweDYzZDIsIDB4YjgwMCwKKwkweGMwZGMsIDB4YjgwMiwgMHg3MDA3LCAweDAwMDAsIDB4NzAyNywgMHgwMDAwLCAweDcwMjAsIDB4ODAwMSwKKwkweDcwMjIsIDB4MTE0OCwgMHgyMDAxLCAweDE4MGMsIDB4MjAxNCwgMHhkMmVjLCAweDExODAsIDB4MDBjZSwKKwkweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweGI4NTQsIDB4OTAxNSwgMHgwMTIwLCAweDcyMWUsIDB4MDgwYywKKwkweDhjMTAsIDB4MGNhOCwgMHg3MjE4LCAweDcyMWUsIDB4MDgwYywgMHg4YzEwLCAweDBjODAsIDB4YzJlYywKKwkweDIyMDIsIDB4MDgwYywgMHg4Y2VkLCAweDBjNTgsIDB4NzAyNCwgMHg5MDY1LCAweDA1YjgsIDB4NzAwYywKKwkweDljMDYsIDB4MTE2MCwgMHgwODBjLCAweDlhNGUsIDB4NjAwYywgMHg5MDE1LCAweDAxMjAsIDB4NzIwZSwKKwkweDYwMGYsIDB4MDAwMCwgMHgwNDQ4LCAweDcyMGUsIDB4NzIwYSwgMHgwNDMwLCAweDcwMTQsIDB4OWMwNiwKKwkweDExNjAsIDB4MDgwYywgMHg5YTRlLCAweDYwMGMsIDB4OTAxNSwgMHgwMTIwLCAweDcyMTYsIDB4NjAwZiwKKwkweDAwMDAsIDB4MDBkMCwgMHg3MjE2LCAweDcyMTIsIDB4MDBiOCwgMHg2MDIwLCAweDkwODYsIDB4MDAwMywKKwkweDExOTgsIDB4NjAxMCwgMHgyMDU4LCAweDA4MGMsIDB4NjNkMiwgMHhiODAwLCAweGMwZGMsIDB4YjgwMiwKKwkweDA4MGMsIDB4OWE0ZSwgMHg3MDFjLCAweDkwNjUsIDB4MDEzOCwgMHhiODU0LCAweDkwMTUsIDB4MDExMCwKKwkweDcyMWUsIDB4MDAxMCwgMHg3MjE4LCAweDcyMWUsIDB4NzAyNywgMHgwMDAwLCAweDAwY2UsIDB4MDBlZSwKKwkweDAwYmUsIDB4MDAwNSwgMHg3MDI0LCAweDkwNjUsIDB4MDE0MCwgMHgwODBjLCAweDlhNGUsIDB4NjAwYywKKwkweDkwMTUsIDB4MDE1OCwgMHg3MjBlLCAweDYwMGYsIDB4MDAwMCwgMHgwODBjLCAweDliNzgsIDB4NzAyNywKKwkweDAwMDAsIDB4MDBjZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHg3MjBlLCAweDcyMGEsIDB4MGNhOCwKKwkweDAwZDYsIDB4MjA2OSwgMHgxOWJmLCAweDY4MzAsIDB4OTA4NCwgMHgwMDAzLCAweDAwMDIsIDB4OGJjZCwKKwkweDhiY2YsIDB4OGJmMywgMHg4YmNiLCAweDA4MGMsIDB4MGRmYSwgMHgwMGRlLCAweDAwMDUsIDB4MDBjNiwKKwkweDY4NDAsIDB4OTA4NiwgMHgwMDAxLCAweDAxYjgsIDB4NjgzYywgMHg5MDY1LCAweDAxMzAsIDB4NjAwYywKKwkweDkwMTUsIDB4MDE3MCwgMHg2YTNhLCAweDYwMGYsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4NjgzZiwKKwkweDAwMDAsIDB4MjAxMSwgMHgxOWRlLCAweDIwMTMsIDB4MDAwMCwgMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwKKwkweDY4M2EsIDB4NjgzNiwgMHgwYzkwLCAweDY4NDMsIDB4MDAwMCwgMHg2ODM4LCAweDkwNjUsIDB4MGQ2OCwKKwkweDYwMDMsIDB4MDAwMywgMHgwYzUwLCAweDAwYzYsIDB4OTAwNiwgMHg2ODQyLCAweDY4NDYsIDB4Njg0YSwKKwkweDY4M2MsIDB4OTA2NSwgMHgwMTYwLCAweDYwMGMsIDB4OTAxNSwgMHgwMTMwLCAweDZhM2EsIDB4NjAwZiwKKwkweDAwMDAsIDB4NjgzZiwgMHgwMDAwLCAweDAwMTgsIDB4NjgzZSwgMHg2ODNhLCAweDY4MzYsIDB4MDBjZSwKKwkweDAwZGUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHhjMWU1LCAweDIxMDIsIDB4MDAwNSwKKwkweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGQxZWMsIDB4MDEyMCwgMHhjMWVjLCAweDIxMDIsIDB4MDgwYywKKwkweDhjZWQsIDB4MjAwMSwgMHgxOWNiLCAweDIwMDQsIDB4OTA4NiwgMHgwMDAxLCAweDBkNTgsIDB4MDBkNiwKKwkweDIwNjksIDB4MTliZiwgMHg2ODA0LCAweDkwODQsIDB4MDAwNywgMHgwMDAyLCAweDhjMzAsIDB4OGNkNSwKKwkweDhjZDUsIDB4OGNkNSwgMHg4Y2Q1LCAweDhjZDcsIDB4OGNkNSwgMHg4YzJlLCAweDA4MGMsIDB4MGRmYSwKKwkweDY4MjAsIDB4OTAwNSwgMHgxMTEwLCAweDAwZGUsIDB4MDAwNSwgMHgwMGM2LCAweDY4MGMsIDB4OTA2NSwKKwkweDAxNTAsIDB4NjgwNywgMHgwMDA0LCAweDY4MjYsIDB4NjgyYiwgMHgwMDAwLCAweDA4MGMsIDB4OGQ0NCwKKwkweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweDY4MTQsIDB4OTA2NSwgMHgwMTUwLCAweDY4MDcsIDB4MDAwMSwKKwkweDY4MjYsIDB4NjgyYiwgMHgwMDAwLCAweDA4MGMsIDB4OGQ0NCwgMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwKKwkweDAwYjYsIDB4MDBlNiwgMHg2YTFjLCAweDkyZGQsIDB4MDAwMCwgMHgwOTA0LCAweDhjYmYsIDB4Yjg0YywKKwkweDkwMGQsIDB4MDExOCwgMHhiODg4LCAweDkwMDUsIDB4MDFhMCwgMHhiODU0LCAweDkwNWQsIDB4MDEyMCwKKwkweDkyMGUsIDB4MDkwNCwgMHg4Y2JmLCAweDAwMjgsIDB4NjgxOCwgMHg5MjBlLCAweDA5MDQsIDB4OGNiZiwKKwkweDIwNTgsIDB4Yjg0YywgMHg5MDBkLCAweDBkODgsIDB4Yjg4OCwgMHg5MDA1LCAweDFkNzAsIDB4MmIwMCwKKwkweDY4MWUsIDB4YmIzYywgMHhiODM4LCAweDkzMDIsIDB4MWU0MCwgMHgwODBjLCAweGEwYmEsIDB4MDkwNCwKKwkweDhjYmYsIDB4ODMxOCwgMHhiYjNlLCAweDYxMTYsIDB4MmIxMCwgMHg2MjEyLCAweDAwOTYsIDB4MjE0OCwKKwkweGE4ODAsIDB4OTA4NCwgMHgwMGZmLCAweDYwNWUsIDB4YTg4MywgMHgwMDAwLCAweGE4ODQsIDB4MDA5ZSwKKwkweDkwOGEsIDB4MTk5YSwgMHgwMjEwLCAweDIwMDEsIDB4MTk5OSwgMHg4MDAzLCAweDgwMWIsIDB4ODMxYiwKKwkweDkzMTgsIDB4NjMxYSwgMHg2MTE0LCAweDAwOTYsIDB4MjE0OCwgMHhhOTY0LCAweDAwOWUsIDB4OTE4YywKKwkweDAwZmYsIDB4OTE4ZSwgMHgwMDQ4LCAweDA1MzgsIDB4MDBmNiwgMHgyYzc4LCAweDIwNjEsIDB4MDEwMCwKKwkweGJhYjAsIDB4NjI5YSwgMHgyMDY5LCAweDAyMDAsIDB4MjA3MSwgMHgwMjQwLCAweDA4MGMsIDB4OTI4NiwKKwkweDIwNjksIDB4MTliZiwgMHhiYjAwLCAweGMzZGQsIDB4YmIwMiwgMHg2ODA3LCAweDAwMDIsIDB4MmYxOCwKKwkweDZiMjYsIDB4NjgyYiwgMHgwMDAwLCAweDc4MjMsIDB4MDAwMywgMHg3ODAzLCAweDAwMDEsIDB4NzgwNywKKwkweDAwNDAsIDB4MDBmZSwgMHgwMGVlLCAweDAwYmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBlZSwKKwkweDAwYmUsIDB4MDBjZSwgMHgwY2QwLCAweDY4MDcsIDB4MDAwNiwgMHgyYzE4LCAweDZiMjYsIDB4NjgyMCwKKwkweDgwMDEsIDB4NjgyMiwgMHg2ODJiLCAweDAwMDAsIDB4MDgwYywgMHg2M2QyLCAweDA4MGMsIDB4OWYwZiwKKwkweDAwZWUsIDB4MDBiZSwgMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwgMHgwMGRlLCAweDAwMDUsIDB4MDBjNiwKKwkweDY4MGMsIDB4OTA2NSwgMHgwMTM4LCAweDY4MDcsIDB4MDAwNCwgMHg2ODI2LCAweDY4MmIsIDB4MDAwMCwKKwkweDA4MGMsIDB4OGQ0NCwgMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MGMsIDB4MjAxNCwKKwkweGMyZWQsIDB4MjIwMiwgMHgwMGRlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDAwZDYsIDB4MjA2OSwKKwkweDE5YmYsIDB4NjgzMCwgMHg5MDg2LCAweDAwMDAsIDB4MTU0OCwgMHgyMDAxLCAweDE4MGMsIDB4MjAxNCwKKwkweGQyZTQsIDB4MDEzMCwgMHhjMmU0LCAweDIyMDIsIDB4MDgwYywgMHg4YzFmLCAweDIwNjksIDB4MTliZiwKKwkweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGQxYzQsIDB4MTFlMCwgMHg2ODM4LCAweDkwN2QsIDB4MDFiMCwKKwkweDZhMDQsIDB4OTI5NiwgMHgwMDAwLCAweDE1NjgsIDB4NjgzMywgMHgwMDAxLCAweDY4M2UsIDB4Njg0NywKKwkweDAwMDAsIDB4Njg0YiwgMHgwMDAwLCAweDAxMjYsIDB4MDBmNiwgMHgyMDkxLCAweDI0MDAsIDB4MDAyZSwKKwkweDA4MGMsIDB4MWI4YSwgMHgxMTU4LCAweDAxMmUsIDB4MDgwYywgMHg5NGIzLCAweDAwZGUsIDB4MDBmZSwKKwkweDAwMDUsIDB4YzFjNCwgMHgyMTAyLCAweDA4MGMsIDB4NzJkMiwgMHgwOGY4LCAweDAxMmUsIDB4Njg0MywKKwkweDAwMDAsIDB4NzgwMywgMHgwMDAyLCAweDc4MGMsIDB4OTAxNSwgMHgwMTQwLCAweDZhM2EsIDB4NzgwZiwKKwkweDAwMDAsIDB4NjgzMywgMHgwMDAwLCAweDY4M2YsIDB4MDAwMCwgMHgwYzQwLCAweDY4M2EsIDB4NjgzNiwKKwkweDBjYzAsIDB4NmEwNCwgMHg5Mjk2LCAweDAwMDYsIDB4MTkwNCwgMHg4Y2U1LCAweDZhMzAsIDB4OTI5NiwKKwkweDAwMDAsIDB4MDk1MCwgMHgwODA0LCAweDhjZTUsIDB4NjAyMCwgMHg5MDg0LCAweDAwMGYsIDB4MDAwYiwKKwkweDAwMDUsIDB4OGQ1OCwgMHg4ZDVkLCAweDkxYjYsIDB4OTI0ZiwgMHg4ZDVkLCAweDkxYjYsIDB4OTI0ZiwKKwkweDhkNTgsIDB4OGQ1ZCwgMHg4ZDU4LCAweDhkNTgsIDB4OGQ1OCwgMHg4ZDU4LCAweDhkNTgsIDB4OGQ1OCwKKwkweDA4MGMsIDB4OGIwNCwgMHgwODBjLCAweDhjMTAsIDB4MDAwNSwgMHgwMGI2LCAweDAxNTYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDFjNiwgMHgwMWQ2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MjA2OSwKKwkweDAyMDAsIDB4MjA3MSwgMHgwMjQwLCAweDYwMDQsIDB4OTA4YSwgMHgwMDUzLCAweDFhMGMsIDB4MGRmYSwKKwkweDYxMTAsIDB4MjE1OCwgMHhiOWIwLCAweDJjNzgsIDB4MjA2MSwgMHgwMTAwLCAweDYxOWEsIDB4OTA4YSwKKwkweDAwNDAsIDB4MWEwNCwgMHg4ZGM5LCAweDAwNWIsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwKKwkweDAxZGUsIDB4MDFjZSwgMHgwMTRlLCAweDAxM2UsIDB4MDE1ZSwgMHgwMGJlLCAweDAwMDUsIDB4OGY0MCwKKwkweDhmN2IsIDB4OGZhNCwgMHg5MDQ3LCAweDkwNjgsIDB4OTA2ZSwgMHg5MDdiLCAweDkwODMsIDB4OTA4ZiwKKwkweDkwOTUsIDB4OTBhNiwgMHg5MDk1LCAweDkwZmQsIDB4OTA4MywgMHg5MTA5LCAweDkxMGYsIDB4OTA4ZiwKKwkweDkxMGYsIDB4OTExYiwgMHg4ZGM3LCAweDhkYzcsIDB4OGRjNywgMHg4ZGM3LCAweDhkYzcsIDB4OGRjNywKKwkweDhkYzcsIDB4OGRjNywgMHg4ZGM3LCAweDhkYzcsIDB4OGRjNywgMHg5ODU0LCAweDk4NzcsIDB4OTg4OCwKKwkweDk4YTgsIDB4OThkYSwgMHg5MDdiLCAweDhkYzcsIDB4OTA3YiwgMHg5MDk1LCAweDhkYzcsIDB4OGZhNCwKKwkweDkwNDcsIDB4OGRjNywgMHg5YzZmLCAweDkwOTUsIDB4OGRjNywgMHg5YzhiLCAweDkwOTUsIDB4OGRjNywKKwkweDkwOGYsIDB4OGYzYSwgMHg4ZGVhLCAweDhkYzcsIDB4OWNhNywgMHg5ZDE0LCAweDlkZWYsIDB4OGRjNywKKwkweDlkZmMsIDB4OTA3OCwgMHg5ZTI3LCAweDhkYzcsIDB4OThlNCwgMHg5ZTU0LCAweDhkYzcsIDB4MDgwYywKKwkweDBkZmEsIDB4MjEwMCwgMHgwMDViLCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDFkZSwKKwkweDAxY2UsIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsIDB4MDBiZSwgMHgwMDA1LCAweDhkZTgsIDB4OGRlOCwKKwkweDhkZTgsIDB4OGUxMSwgMHg4ZWJkLCAweDhlYzgsIDB4OGRlOCwgMHg4ZGU4LCAweDhkZTgsIDB4OGYwZiwKKwkweDhmMWIsIDB4OGUyYywgMHg4ZGU4LCAweDhlNDcsIDB4OGU3YiwgMHg5ZmQ2LCAweGEwMWIsIDB4OTA5NSwKKwkweDA4MGMsIDB4MGRmYSwgMHgwMGQ2LCAweDAwOTYsIDB4MDgwYywgMHg5MTJlLCAweDcwMDMsIDB4MjQxNCwKKwkweDcwMDcsIDB4MDAxOCwgMHg3MDBiLCAweDA4MDAsIDB4NzgxNCwgMHgyMDQ4LCAweGE4M2MsIDB4NzAwZSwKKwkweGE4NTAsIDB4NzAyMiwgMHhhODU0LCAweDcwMjYsIDB4NjBjMywgMHgwMDE4LCAweDA4MGMsIDB4OTYyYSwKKwkweDAwOWUsIDB4MDBkZSwgMHgwMDA1LCAweDc4MTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4YTAsIDB4MDBiZSwKKwkweDA4MGMsIDB4YTA2MiwgMHgxMTE4LCAweDkwODQsIDB4ZmY4MCwgMHgwMTEwLCAweDkwODUsIDB4MDAwMSwKKwkweDAwMDUsIDB4MDBkNiwgMHgwMDk2LCAweDA4MGMsIDB4OTEyZSwgMHg3MDAzLCAweDA1MDAsIDB4NzgxNCwKKwkweDIwNDgsIDB4YTg3NCwgMHg3MDBhLCAweGE4NzgsIDB4NzAwZSwgMHhhODdjLCAweDcwMTIsIDB4YTg4MCwKKwkweDcwMTYsIDB4YTg4NCwgMHg3MDFhLCAweGE4ODgsIDB4NzAxZSwgMHg2MGMzLCAweDAwMTAsIDB4MDgwYywKKwkweDk2MmEsIDB4MDA5ZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBkNiwgMHgwMDk2LCAweDA4MGMsIDB4OTEyZSwKKwkweDcwMDMsIDB4MDUwMCwgMHg3ODE0LCAweDIwNDgsIDB4YThjYywgMHg3MDBhLCAweGE4ZDAsIDB4NzAwZSwKKwkweGE4ZDQsIDB4NzAxMiwgMHhhOGQ4LCAweDcwMTYsIDB4YThkYywgMHg3MDFhLCAweGE4ZTAsIDB4NzAxZSwKKwkweDYwYzMsIDB4MDAxMCwgMHgwODBjLCAweDk2MmEsIDB4MDA5ZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBkNiwKKwkweDAwOTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg5MTJlLCAweDIwZTksIDB4MDAwMCwKKwkweDIwMDEsIDB4MTk3YiwgMHgyMDAzLCAweDAwMDAsIDB4NzgxNCwgMHgyMDQ4LCAweGE4MTQsIDB4ODAwMywKKwkweDYwYzIsIDB4YTgzMCwgMHgyMGE4LCAweGE4NjAsIDB4MjBlMCwgMHhhODVjLCAweDkwODAsIDB4MDAxYiwKKwkweDIwOTgsIDB4MjAwMSwgMHgxOTdiLCAweDAwMTYsIDB4MjAwYywgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywKKwkweDIyZWYsIDB4MDgwYywgMHhjYjY5LCAweDkwMDYsIDB4MDgwYywgMHgyMmVmLCAweDAwMWUsIDB4YTgwNCwKKwkweDkwMDUsIDB4MDExMCwgMHgyMDQ4LCAweDBjMjgsIDB4MDRkOSwgMHgwODBjLCAweDk2MmEsIDB4MDEyZSwKKwkweDAwOWUsIDB4MDBkZSwgMHgwMDA1LCAweDAwZDYsIDB4MDA5NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4OTE3OSwgMHgyMGU5LCAweDAwMDAsIDB4MjAwMSwgMHgxOTdiLCAweDIwMDMsIDB4MDAwMCwKKwkweDc4MTQsIDB4MjA0OCwgMHhhODZmLCAweDAyMDAsIDB4YTg3MywgMHgwMDAwLCAweGE4MTQsIDB4ODAwMywKKwkweDYwYzIsIDB4YTgzMCwgMHgyMGE4LCAweGE4NjAsIDB4MjBlMCwgMHhhODVjLCAweDkwODAsIDB4MDAxYiwKKwkweDIwOTgsIDB4MjAwMSwgMHgxOTdiLCAweDAwMTYsIDB4MjAwYywgMHgwODBjLCAweGNiNjksIDB4MDAxZSwKKwkweGE4MDQsIDB4OTAwNSwgMHgwMTEwLCAweDIwNDgsIDB4MGM2MCwgMHgwMDUxLCAweDc4MTQsIDB4MjA0OCwKKwkweDA4MGMsIDB4MGZlMywgMHgwODBjLCAweDk2MmEsIDB4MDEyZSwgMHgwMDllLCAweDAwZGUsIDB4MDAwNSwKKwkweDYwYzAsIDB4ODAwNCwgMHg5MDg0LCAweDAwMDMsIDB4OTAwNSwgMHgwMTMwLCAweDkwODIsIDB4MDAwNCwKKwkweDIwYTMsIDB4MDAwMCwgMHg4MDAwLCAweDFkZTAsIDB4MDAwNSwgMHgwODBjLCAweDkxMmUsIDB4NzAwMywKKwkweDc4MDAsIDB4NzgwOCwgMHg4MDA3LCAweDcwMGEsIDB4NjBjMywgMHgwMDA4LCAweDA4MDQsIDB4OTYyYSwKKwkweDAwZDYsIDB4MDBlNiwgMHgwODBjLCAweDkxNzksIDB4NzgxNCwgMHg5MDg0LCAweGZmMDAsIDB4MjA3MywKKwkweDAyMDAsIDB4OGU3MCwgMHg4ZTcwLCAweDkwOTUsIDB4MDAxMCwgMHgyMjcyLCAweDhlNzAsIDB4MjA3MywKKwkweDAwMzQsIDB4OGU3MCwgMHgyMDY5LCAweDE4MDUsIDB4MjBhOSwgMHgwMDA0LCAweDJkNzYsIDB4OGQ2OCwKKwkweDhlNzAsIDB4MWYwNCwgMHg4ZWRlLCAweDIwNjksIDB4MTgwMSwgMHgyMGE5LCAweDAwMDQsIDB4MmQ3NiwKKwkweDhkNjgsIDB4OGU3MCwgMHgxZjA0LCAweDhlZTcsIDB4MjA2OSwgMHgxOThiLCAweDkwODYsIDB4ZGYwMCwKKwkweDAxMTAsIDB4MjA2OSwgMHgxOWE1LCAweDIwYTksIDB4MDAxYSwgMHg5ZTg2LCAweDAyNjAsIDB4MTE0OCwKKwkweDAwYzYsIDB4MjA2MSwgMHgwMjAwLCAweDYwMTAsIDB4ODAwMCwgMHg2MDEyLCAweDAwY2UsIDB4MjA3MSwKKwkweDAyNDAsIDB4MmQwNCwgMHg4MDA3LCAweDIwNzIsIDB4OGQ2OCwgMHg4ZTcwLCAweDFmMDQsIDB4OGVmNSwKKwkweDYwYzMsIDB4MDA0YywgMHgwODBjLCAweDk2MmEsIDB4MDBlZSwgMHgwMGRlLCAweDAwMDUsIDB4MDgwYywKKwkweDkxMmUsIDB4NzAwMywgMHg2MzAwLCAweDcwMDcsIDB4MDAyOCwgMHg3ODA4LCAweDcwMGUsIDB4NjBjMywKKwkweDAwMDgsIDB4MDgwNCwgMHg5NjJhLCAweDAwZDYsIDB4MDAyNiwgMHgwMDE2LCAweDA4MGMsIDB4OTE3OSwKKwkweDcwMDMsIDB4MDIwMCwgMHg3ODE0LCAweDcwMGUsIDB4MDBlNiwgMHg5ZWYwLCAweDAwMDQsIDB4MjAwOSwKKwkweDAwMDEsIDB4MjAxMSwgMHgwMDBjLCAweDIwNzMsIDB4MDgwMCwgMHg4ZTcwLCAweDIwNzMsIDB4MDAwMCwKKwkweDAwZWUsIDB4NzIwNiwgMHg3MTBhLCAweDYyYzIsIDB4MDgwYywgMHg5NjJhLCAweDAwMWUsIDB4MDAyZSwKKwkweDAwZGUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MTcsIDB4MjAwNCwgMHg2MDlhLCAweDA4MDQsIDB4OTYyYSwKKwkweDA4MGMsIDB4OTEyZSwgMHg3MDAzLCAweDUyMDAsIDB4MjA2OSwgMHgxODViLCAweDY4MDQsIDB4ZDA4NCwKKwkweDAxMzAsIDB4NjgyOCwgMHgwMDE2LCAweDA4MGMsIDB4MjdhMSwgMHg3MTBlLCAweDAwMWUsIDB4MjBhOSwKKwkweDAwMDQsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksIDB4MTgwNSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwKKwkweDAyNTAsIDB4NDAwMywgMHgyMGE5LCAweDAwMDQsIDB4MjA5OSwgMHgxODAxLCAweDIwYTEsIDB4MDI1NCwKKwkweDQwMDMsIDB4MDgwYywgMHhhMDYyLCAweDExMjAsIDB4YjhhMCwgMHg5MDgyLCAweDAwN2YsIDB4MDI0OCwKKwkweDIwMDEsIDB4MTgxZSwgMHgyMDA0LCAweDcwMzIsIDB4MjAwMSwgMHgxODFmLCAweDIwMDQsIDB4NzAzNiwKKwkweDAwMzAsIDB4MjAwMSwgMHgxODE3LCAweDIwMDQsIDB4OTA4NCwgMHgwMGZmLCAweDcwMzYsIDB4NjBjMywKKwkweDAwMWMsIDB4MDgwNCwgMHg5NjJhLCAweDA4MGMsIDB4OTEyZSwgMHg3MDAzLCAweDA1MDAsIDB4MDgwYywKKwkweGEwNjIsIDB4MTEyMCwgMHhiOGEwLCAweDkwODIsIDB4MDA3ZiwgMHgwMjQ4LCAweDIwMDEsIDB4MTgxZSwKKwkweDIwMDQsIDB4NzAwYSwgMHgyMDAxLCAweDE4MWYsIDB4MjAwNCwgMHg3MDBlLCAweDAwMzAsIDB4MjAwMSwKKwkweDE4MTcsIDB4MjAwNCwgMHg5MDg0LCAweDAwZmYsIDB4NzAwZSwgMHgyMGE5LCAweDAwMDQsIDB4MjBlMSwKKwkweDAwMDEsIDB4MjA5OSwgMHgxODA1LCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNTAsIDB4NDAwMywKKwkweDYwYzMsIDB4MDAxMCwgMHgwODA0LCAweDk2MmEsIDB4MDgwYywgMHg5MTJlLCAweDkwMDYsIDB4MDgwYywKKwkweDY3OGQsIDB4YjhhMCwgMHg5MDg2LCAweDAwN2UsIDB4MTEzMCwgMHg3MDAzLCAweDA0MDAsIDB4NjIwYywKKwkweGMyYjQsIDB4NjIwZSwgMHgwMDU4LCAweDc4MTQsIDB4MDA5NiwgMHg5MDRkLCAweDAxMjAsIDB4OTAwNiwKKwkweGE4OWEsIDB4YThhNiwgMHhhOGFhLCAweDAwOWUsIDB4NzAwMywgMHgwMzAwLCAweGI4YTAsIDB4OTA4NiwKKwkweDAwN2UsIDB4MTkwNCwgMHg5MDBmLCAweDAwZDYsIDB4MjA2OSwgMHgxOTQ0LCAweDIwMDEsIDB4MTgzNiwKKwkweDIwMDQsIDB4ZDBhNCwgMHgwMTc4LCAweDY4MDAsIDB4NzAwYSwgMHg2ODA4LCAweDkwODQsIDB4MjAwMCwKKwkweDcwMTIsIDB4NjgwYywgMHg3MDE2LCAweDcwMWYsIDB4MjcxMCwgMHg2ODE4LCAweDcwMjIsIDB4NjgxYywKKwkweDcwMjYsIDB4MDA4MCwgMHg2ODAwLCAweDcwMGEsIDB4NjgwNCwgMHg3MDBlLCAweDY4MDgsIDB4MDgwYywKKwkweDcyMDcsIDB4MTExOCwgMHg5MDg0LCAweDM3ZmYsIDB4MDAxMCwgMHg5MDg0LCAweDNmZmYsIDB4NzAxMiwKKwkweDY4MGMsIDB4NzAxNiwgMHgwMGRlLCAweDIwYTksIDB4MDAwNCwgMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwKKwkweDE4MDUsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI1NiwgMHg0MDAzLCAweDIwYTksIDB4MDAwNCwKKwkweDIwOTksIDB4MTgwMSwgMHgyMGExLCAweDAyNWEsIDB4NDAwMywgMHgwMGQ2LCAweDA4MGMsIDB4OWVkNiwKKwkweDIwNjksIDB4MTk0YywgMHgyMDcxLCAweDAyNGUsIDB4NjgwMCwgMHhjMGRkLCAweDcwMDIsIDB4MDgwYywKKwkweDU1ZGYsIDB4ZDBlNCwgMHgwMTEwLCAweDY4MGMsIDB4NzAwZSwgMHgwMGRlLCAweDA0YTAsIDB4MjAwMSwKKwkweDE4MzYsIDB4MjAwNCwgMHhkMGE0LCAweDAxNjgsIDB4MDAxNiwgMHgyMDA5LCAweDAwMDIsIDB4NjBlMCwKKwkweDkxMDYsIDB4MDEzMCwgMHgyMTAwLCAweDYwZTMsIDB4MDAwMCwgMHgwODBjLCAweDI3ZTIsIDB4NjFlMiwKKwkweDAwMWUsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksIDB4MTk0NCwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwKKwkweDAyNGUsIDB4MjBhOSwgMHgwMDA4LCAweDQwMDMsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksIDB4MTgwNSwKKwkweDIwYTEsIDB4MDI1NiwgMHg0MDAzLCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LCAweDE4MDEsIDB4MjBhMSwKKwkweDAyNWEsIDB4NDAwMywgMHgwODBjLCAweDllZDYsIDB4MjBhMSwgMHgwMjRlLCAweDIwYTksIDB4MDAwOCwKKwkweDIwOTksIDB4MTk0YywgMHg0MDAzLCAweDYwYzMsIDB4MDA3NCwgMHgwODA0LCAweDk2MmEsIDB4MDgwYywKKwkweDkxMmUsIDB4NzAwMywgMHgyMDEwLCAweDcwMDcsIDB4MDAxNCwgMHg3MDBiLCAweDA4MDAsIDB4NzAwZiwKKwkweDIwMDAsIDB4OTAwNiwgMHgwMGY2LCAweDIwNzksIDB4MTg1YiwgMHg3OTA0LCAweDAwZmUsIDB4ZDFhYywKKwkweDExMTAsIDB4OTA4NSwgMHgwMDIwLCAweDAwMTAsIDB4OTA4NSwgMHgwMDEwLCAweDkwODUsIDB4MDAwMiwKKwkweDAwZDYsIDB4MDgwNCwgMHg5MGRlLCAweDcwMjYsIDB4NjBjMywgMHgwMDE0LCAweDA4MDQsIDB4OTYyYSwKKwkweDA4MGMsIDB4OTEyZSwgMHg3MDAzLCAweDUwMDAsIDB4MDgwNCwgMHg4ZmJlLCAweDA4MGMsIDB4OTEyZSwKKwkweDcwMDMsIDB4MjExMCwgMHg3MDA3LCAweDAwMTQsIDB4NjBjMywgMHgwMDE0LCAweDA4MDQsIDB4OTYyYSwKKwkweDA4MGMsIDB4OTE3MCwgMHgwMDEwLCAweDA4MGMsIDB4OTE3OSwgMHg3MDAzLCAweDAyMDAsIDB4NjBjMywKKwkweDAwMDQsIDB4MDgwNCwgMHg5NjJhLCAweDA4MGMsIDB4OTE3OSwgMHg3MDAzLCAweDAxMDAsIDB4NzAwYiwKKwkweDAwMDMsIDB4NzAwZiwgMHgyYTAwLCAweDYwYzMsIDB4MDAwOCwgMHgwODA0LCAweDk2MmEsIDB4MDgwYywKKwkweDkxNzksIDB4NzAwMywgMHgwMjAwLCAweDA4MDQsIDB4OGZiZSwgMHgwODBjLCAweDkxNzksIDB4NzAwMywKKwkweDAxMDAsIDB4NzgyYywgMHg5MDA1LCAweDAxMTAsIDB4NzAwYSwgMHgwMDEwLCAweDcwMGIsIDB4MDAwMywKKwkweDc4MTQsIDB4NzAwZSwgMHg2MGMzLCAweDAwMDgsIDB4MDgwNCwgMHg5NjJhLCAweDAwZDYsIDB4MDgwYywKKwkweDkxNzksIDB4NzAwMywgMHgwMjEwLCAweDcwMDcsIDB4MDAxNCwgMHg3MDBiLCAweDA4MDAsIDB4Yjg5NCwKKwkweDkwODYsIDB4MDAxNCwgMHgxMTk4LCAweGI5OWMsIDB4OTE4NCwgMHgwMDMwLCAweDAxOTAsIDB4Yjk5OCwKKwkweDkxODQsIDB4YzAwMCwgMHgxMTQwLCAweGQxZWMsIDB4MDExOCwgMHg3MDBmLCAweDIxMDAsIDB4MDA1OCwKKwkweDcwMGYsIDB4MDEwMCwgMHgwMDQwLCAweDcwMGYsIDB4MDQwMCwgMHgwMDI4LCAweDcwMGYsIDB4MDcwMCwKKwkweDAwMTAsIDB4NzAwZiwgMHgwODAwLCAweDAwZjYsIDB4MjA3OSwgMHgxODViLCAweDc5MDQsIDB4MDBmZSwKKwkweGQxYWMsIDB4MTExMCwgMHg5MDg1LCAweDAwMjAsIDB4MDAxMCwgMHg5MDg1LCAweDAwMTAsIDB4MjAwOSwKKwkweDE4N2QsIDB4MjEwYywgMHhkMTg0LCAweDExMTAsIDB4OTA4NSwgMHgwMDAyLCAweDAwMjYsIDB4MjAwOSwKKwkweDE4N2IsIDB4MjEwYywgMHhkMWU0LCAweDAxNTAsIDB4YzBjNSwgMHhiYWJjLCAweGQyOGMsIDB4MTEwOCwKKwkweGMwY2QsIDB4OTA5NCwgMHgwMDMwLCAweDkyOTYsIDB4MDAxMCwgMHgwMTQwLCAweGQxZWMsIDB4MDEzMCwKKwkweDkwOTQsIDB4MDAzMCwgMHg5Mjk2LCAweDAwMTAsIDB4MDEwOCwgMHhjMGJkLCAweDAwMmUsIDB4NzAyNiwKKwkweDYwYzMsIDB4MDAxNCwgMHgwMGRlLCAweDA4MDQsIDB4OTYyYSwgMHgwODBjLCAweDkxNzksIDB4NzAwMywKKwkweDAyMTAsIDB4NzAwNywgMHgwMDE0LCAweDcwMGYsIDB4MDEwMCwgMHg2MGMzLCAweDAwMTQsIDB4MDgwNCwKKwkweDk2MmEsIDB4MDgwYywgMHg5MTc5LCAweDcwMDMsIDB4MDIwMCwgMHgwODA0LCAweDhmNDQsIDB4MDgwYywKKwkweDkxNzksIDB4NzAwMywgMHgwMTAwLCAweDcwMGIsIDB4MDAwMywgMHg3MDBmLCAweDJhMDAsIDB4NjBjMywKKwkweDAwMDgsIDB4MDgwNCwgMHg5NjJhLCAweDA4MGMsIDB4OTE3OSwgMHg3MDAzLCAweDAxMDAsIDB4NzAwYiwKKwkweDAwMGIsIDB4NjBjMywgMHgwMDA4LCAweDA4MDQsIDB4OTYyYSwgMHgwMDI2LCAweDAwZDYsIDB4MDAzNiwKKwkweDAwNDYsIDB4MjAxOSwgMHgzMjAwLCAweDIwMjEsIDB4MDgwMCwgMHgwMDQwLCAweDAwMjYsIDB4MDBkNiwKKwkweDAwMzYsIDB4MDA0NiwgMHgyMDE5LCAweDIyMDAsIDB4MjAyMSwgMHgwMTAwLCAweDA4MGMsIDB4OWVlYiwKKwkweGI4MTAsIDB4OTMwNSwgMHg3MDAyLCAweGI4MTQsIDB4NzAwNiwgMHgyMDY5LCAweDE4MDAsIDB4Njg3OCwKKwkweDcwMGEsIDB4Njg3YywgMHg3MDBlLCAweDk0ODUsIDB4MDAyOSwgMHg3MDEyLCAweDAwNGUsIDB4MDAzZSwKKwkweDAwZGUsIDB4MDgwYywgMHg5NjE4LCAweDcyMWEsIDB4OWY5NSwgMHgwMDAwLCAweDcyMjIsIDB4NzAyNywKKwkweGZmZmYsIDB4MjA3MSwgMHgwMjRjLCAweDAwMmUsIDB4MDAwNSwgMHgwMDI2LCAweDA4MGMsIDB4OWVlYiwKKwkweDcwMDMsIDB4MDJmZiwgMHg3MDA3LCAweGZmZmMsIDB4MDBkNiwgMHgyMDY5LCAweDE4MDAsIDB4Njg3OCwKKwkweDcwMGEsIDB4Njg3YywgMHg3MDBlLCAweDAwZGUsIDB4NzAxMywgMHgyMDI5LCAweDBjMTAsIDB4NzAwMywKKwkweDAxMDAsIDB4NzAwNywgMHgwMDAwLCAweDcwMGIsIDB4ZmMwMiwgMHg3MDBmLCAweDAwMDAsIDB4MDAwNSwKKwkweDAwMjYsIDB4MDBkNiwgMHgwMDM2LCAweDAwNDYsIDB4MjAxOSwgMHgzMzAwLCAweDIwMjEsIDB4MDgwMCwKKwkweDAwNDAsIDB4MDAyNiwgMHgwMGQ2LCAweDAwMzYsIDB4MDA0NiwgMHgyMDE5LCAweDIzMDAsIDB4MjAyMSwKKwkweDAxMDAsIDB4MDgwYywgMHg5ZWViLCAweGI4MTAsIDB4OTMwNSwgMHg3MDAyLCAweGI4MTQsIDB4NzAwNiwKKwkweDIwNjksIDB4MTgwMCwgMHhiODEwLCAweDkwMDUsIDB4MTE0MCwgMHhiODE0LCAweDkwMDUsIDB4MTEyOCwKKwkweDcwMGIsIDB4MDBmZiwgMHg3MDBmLCAweGZmZmUsIDB4MDAyMCwgMHg2ODc4LCAweDcwMGEsIDB4Njg3YywKKwkweDcwMGUsIDB4MDAwMCwgMHg5NDg1LCAweDAwOTgsIDB4NzAxMiwgMHgwMDRlLCAweDAwM2UsIDB4MDBkZSwKKwkweDA4MGMsIDB4OTYxOCwgMHg3MjFhLCAweDdhMDgsIDB4NzIyMiwgMHgyZjEwLCAweDcyMjYsIDB4MjA3MSwKKwkweDAyNGMsIDB4MDAyZSwgMHgwMDA1LCAweDA4MGMsIDB4OTYxOCwgMHg3MjFhLCAweDdhMDgsIDB4NzIyMiwKKwkweDc4MTQsIDB4NzAyNiwgMHgyMDcxLCAweDAyNGMsIDB4MDAyZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBjNiwKKwkweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDIwNjksIDB4MDIwMCwgMHgyMDcxLCAweDAyNDAsIDB4NjAwNCwKKwkweDkwOGEsIDB4MDA4NSwgMHgwYTBjLCAweDBkZmEsIDB4OTA4YSwgMHgwMDkyLCAweDFhMGMsIDB4MGRmYSwKKwkweDYxMTAsIDB4MjE1OCwgMHhiOWIwLCAweDJjNzgsIDB4MjA2MSwgMHgwMTAwLCAweDYxOWEsIDB4OTA4MiwKKwkweDAwODUsIDB4MDAzMywgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwYmUsIDB4MDAwNSwKKwkweDkxZTcsIDB4OTFmNiwgMHg5MjAxLCAweDkxZTUsIDB4OTFlNSwgMHg5MWU1LCAweDkxZTcsIDB4OTFlNSwKKwkweDkxZTUsIDB4OTFlNSwgMHg5MWU1LCAweDkxZTUsIDB4OTFlNSwgMHgwODBjLCAweDBkZmEsIDB4MDQxMSwKKwkweDYwYzMsIDB4MDAwMCwgMHgwMDI2LCAweDA4MGMsIDB4MmFmZSwgMHgwMjI4LCAweDIwMTEsIDB4MDEwMSwKKwkweDIyMDQsIDB4YzBjNSwgMHgyMDEyLCAweDAwMmUsIDB4MDgwNCwgMHg5NjJhLCAweDA0MzEsIDB4NzgwOCwKKwkweDcwMGEsIDB4NzgxNCwgMHg3MDBlLCAweDcwMTcsIDB4ZmZmZiwgMHg2MGMzLCAweDAwMGMsIDB4MDgwNCwKKwkweDk2MmEsIDB4MDRhMSwgMHg3MDAzLCAweDAwMDMsIDB4NzAwNywgMHgwMzAwLCAweDYwYzMsIDB4MDAwNCwKKwkweDA4MDQsIDB4OTYyYSwgMHgwMDI2LCAweDA4MGMsIDB4OWVlYiwgMHhiODEwLCAweDkwODUsIDB4ODEwMCwKKwkweDcwMDIsIDB4YjgxNCwgMHg3MDA2LCAweDIwNjksIDB4MTgwMCwgMHg2ODc4LCAweDcwMGEsIDB4Njg3YywKKwkweDcwMGUsIDB4NzAxMywgMHgwMDA5LCAweDA4MDQsIDB4OTE0OSwgMHgwMDI2LCAweDA4MGMsIDB4OWVlYiwKKwkweGI4MTAsIDB4OTA4NSwgMHg4NDAwLCAweDcwMDIsIDB4YjgxNCwgMHg3MDA2LCAweDIwNjksIDB4MTgwMCwKKwkweDY4NzgsIDB4NzAwYSwgMHg2ODdjLCAweDcwMGUsIDB4MjAwMSwgMHgwMDk5LCAweDdhMjAsIDB4OTI5NiwKKwkweDAwMDUsIDB4MDEwOCwgMHhjMGJjLCAweDcwMTIsIDB4MDgwNCwgMHg5MWFiLCAweDAwMjYsIDB4MDgwYywKKwkweDllZWIsIDB4YjgxMCwgMHg5MDg1LCAweDg1MDAsIDB4NzAwMiwgMHhiODE0LCAweDcwMDYsIDB4MjA2OSwKKwkweDE4MDAsIDB4Njg3OCwgMHg3MDBhLCAweDY4N2MsIDB4NzAwZSwgMHgyMDAxLCAweDAwOTksIDB4N2EyMCwKKwkweDkyOTYsIDB4MDAwNSwgMHgwMTA4LCAweGMwYmMsIDB4NzAxMiwgMHgwODA0LCAweDkxYWIsIDB4MDBiNiwKKwkweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MmM3OCwgMHgyMDY5LCAweDAyMDAsIDB4MjA3MSwKKwkweDAyNDAsIDB4NzgwNCwgMHg5MDhhLCAweDAwNDAsIDB4MGEwYywgMHgwZGZhLCAweDkwOGEsIDB4MDA1NCwKKwkweDFhMGMsIDB4MGRmYSwgMHg3OTEwLCAweDIxNTgsIDB4YjliMCwgMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwKKwkweDkwODIsIDB4MDA0MCwgMHgwMDMzLCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDBiZSwKKwkweDAwMDUsIDB4OTI4NiwgMHg5MzQyLCAweDkzMTUsIDB4OTQ2NCwgMHg5Mjg0LCAweDkyODQsIDB4OTI4NCwKKwkweDkyODQsIDB4OTI4NCwgMHg5Mjg0LCAweDkyODQsIDB4OWEyYiwgMHg5YTMzLCAweDlhM2IsIDB4OWE0MywKKwkweDkyODQsIDB4OWUzMywgMHg5Mjg0LCAweDlhMjMsIDB4MDgwYywgMHgwZGZhLCAweDAwOTYsIDB4NzgwYiwKKwkweGZmZmYsIDB4MDgwYywgMHg5MmYxLCAweDc5MTQsIDB4MjE0OCwgMHhhOTc4LCAweDc5NTYsIDB4YWU2NCwKKwkweDk2YjQsIDB4MDBmZiwgMHg5Njg2LCAweDAwMDgsIDB4MTE0OCwgMHhhOGI0LCAweDcwMzIsIDB4YThiOCwKKwkweDcwMzYsIDB4YThiYywgMHg3MDNhLCAweGE4YzAsIDB4NzAzZSwgMHgwMDA4LCAweDcxMzIsIDB4YTk3YywKKwkweDkxODQsIDB4MDAwZiwgMHgxMTE4LCAweDIwMDEsIDB4MDAwNSwgMHgwMDQwLCAweGQxODQsIDB4MDExOCwKKwkweDIwMDEsIDB4MDAwNCwgMHgwMDE4LCAweDkwODQsIDB4MDAwNiwgMHg4MDA0LCAweDIwMTAsIDB4Nzg1YywKKwkweDkwODQsIDB4MDBmZiwgMHg4MDA3LCAweDkyMDUsIDB4NzA0MiwgMHhkMWFjLCAweDAxNTgsIDB4NzA0NywKKwkweDAwMDIsIDB4OTY4NiwgMHgwMDA4LCAweDExMTgsIDB4MDgwYywgMHgxODFjLCAweDAwMTAsIDB4MDgwYywKKwkweDE2ZGIsIDB4MDA1MCwgMHhkMWI0LCAweDAxMTgsIDB4NzA0NywgMHgwMDAxLCAweDAwMjgsIDB4NzA0NywKKwkweDAwMDAsIDB4OTAxNiwgMHgyMjMwLCAweDAwMTAsIDB4YWFiMCwgMHhhZWFjLCAweDcyNmEsIDB4NzY2ZSwKKwkweDIwYTksIDB4MDAwOCwgMHgyMGU5LCAweDAwMDAsIDB4YTg2MCwgMHgyMGUwLCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMjMsIDB4MjA5OCwgMHgyMGExLCAweDAyNTIsIDB4MjA2OSwgMHgwMjAwLCAweDY4MTMsIDB4MDAxOCwKKwkweDQwMDMsIDB4NjgxMywgMHgwMDA4LCAweDYwYzMsIDB4MDAyMCwgMHg2MDE3LCAweDAwMDksIDB4MjAwMSwKKwkweDE5ZGIsIDB4MjAwMywgMHgwN2QwLCAweDIwMDEsIDB4MTlkYSwgMHgyMDAzLCAweDAwMDksIDB4MDA5ZSwKKwkweDAwMDUsIDB4NjgxMywgMHgwMDA4LCAweGJhOGMsIDB4ODIxMCwgMHhiOGJjLCAweGQwODQsIDB4MDEyOCwKKwkweDdhNGEsIDB4N2IxNCwgMHg3YjQ2LCAweDcyMmUsIDB4NzMyYSwgMHg5Mjk0LCAweDAwZmYsIDB4YmE4ZSwKKwkweDgyMTcsIDB4NzIxYSwgMHhiYTEwLCAweDkyOTUsIDB4MDYwMCwgMHg3MjAyLCAweGJhMTQsIDB4NzIwNiwKKwkweDIwNjksIDB4MTgwMCwgMHg2YTc4LCAweDcyMGEsIDB4NmE3YywgMHg3MjBlLCAweDcwMTMsIDB4MDgyOSwKKwkweDJmMTAsIDB4NzIyMiwgMHg3MDI3LCAweGZmZmYsIDB4MDAwNSwgMHgwMGQ2LCAweDAwOTYsIDB4MDA4MSwKKwkweDc4MTQsIDB4MjA0OCwgMHhhODkwLCAweDcwMDIsIDB4YTg4YywgMHg3MDA2LCAweGE4YjAsIDB4NzAwYSwKKwkweGE4YWMsIDB4NzAwZSwgMHg2MGMzLCAweDAwMGMsIDB4MDA5ZSwgMHgwMGRlLCAweDA4MDQsIDB4OTYyYSwKKwkweDY4MTMsIDB4MDAwOCwgMHhiODEwLCAweDkwODUsIDB4MDUwMCwgMHg3MDAyLCAweGI4MTQsIDB4NzAwNiwKKwkweDIwNjksIDB4MTgwMCwgMHg2ODc4LCAweDcwMGEsIDB4Njg3YywgMHg3MDBlLCAweDcwMTMsIDB4MDg4OSwKKwkweDA4MGMsIDB4OTYxOCwgMHg3MjFhLCAweDdhMDgsIDB4NzIyMiwgMHgyZjEwLCAweDcyMjYsIDB4MjA3MSwKKwkweDAyNGMsIDB4MDAwNSwgMHgwMGQ2LCAweDAwOTYsIDB4MDgwYywgMHg5NDQyLCAweDc4MTQsIDB4MjA0OCwKKwkweDA4MGMsIDB4YmUzNSwgMHgxMTMwLCAweDc4MTQsIDB4OTA4NCwgMHgwNzAwLCAweDgwMDcsIDB4MDAzMywKKwkweDAwMTAsIDB4OTAwNiwgMHgwMDFiLCAweDAwOWUsIDB4MDBkZSwgMHgwMDA1LCAweDkzNjAsIDB4OTNjOSwKKwkweDkzZDksIDB4OTNmZiwgMHg5NDBiLCAweDk0MWMsIDB4OTQyNCwgMHg5MzVlLCAweDA4MGMsIDB4MGRmYSwKKwkweDAwMTYsIDB4MDAzNiwgMHhhOTdjLCAweDkxOGMsIDB4MDAwMywgMHgwMTE4LCAweDkxODYsIDB4MDAwMywKKwkweDExOTgsIDB4YWJhOCwgMHg3ODI0LCAweGQwY2MsIDB4MTE2OCwgMHg3MzE2LCAweGE4OTgsIDB4NzAxYSwKKwkweGE4OTQsIDB4NzAxZSwgMHgwMDNlLCAweDAwMWUsIDB4MjAwMSwgMHgxOTg5LCAweDIwMDQsIDB4NjBjMiwKKwkweDA4MDQsIDB4OTYyYSwgMHhjM2U1LCAweDBjODgsIDB4OTE4NiwgMHgwMDAxLCAweDE5MGMsIDB4MGRmYSwKKwkweGFiYTgsIDB4NzgyNCwgMHhkMGNjLCAweDE5MDQsIDB4OTNjNiwgMHg3MzE2LCAweGE4OTgsIDB4NzAxYSwKKwkweGE4OTQsIDB4NzAxZSwgMHhhOGE0LCAweDcwMjYsIDB4YThhYywgMHg3MDJlLCAweDIwMDksIDB4MDAxOCwKKwkweDkzODQsIDB4MDMwMCwgMHgwNTcwLCAweGQzYzQsIDB4MDExMCwgMHhhOGFjLCAweDkxMDgsIDB4ZDNjYywKKwkweDAxMTAsIDB4YThhNCwgMHg5MTA4LCAweDY4MTAsIDB4OTA4NSwgMHgwMDEwLCAweDY4MTIsIDB4MjAxMSwKKwkweDAyNTgsIDB4MjBlOSwgMHgwMDAwLCAweDIyYTAsIDB4MDE1NiwgMHgyMGE5LCAweDAwMDgsIDB4YTg2MCwKKwkweDIwZTAsIDB4YTg1YywgMHg5MDgwLCAweDAwMmMsIDB4MjA5OCwgMHg0MDAzLCAweDY4MTAsIDB4ODAwMCwKKwkweDY4MTIsIDB4MjAxMSwgMHgwMjQwLCAweDIyYTAsIDB4MjBhOSwgMHgwMDA1LCAweDQwMDMsIDB4NjgxMCwKKwkweGMwODQsIDB4NjgxMiwgMHgwMTVlLCAweDkxODQsIDB4MDAwMywgMHgwMTE4LCAweDIwMTksIDB4MDI0NSwKKwkweDIwMWEsIDB4NjFjMiwgMHgwMDNlLCAweDAwMWUsIDB4MDgwNCwgMHg5NjJhLCAweGMzZTUsIDB4MDgwNCwKKwkweDkzODUsIDB4MjAxMSwgMHgwMDA4LCAweDIwMDEsIDB4MTgwZiwgMHgyMDA0LCAweGQwYTQsIDB4MDExMCwKKwkweDIwMTEsIDB4MDAyOCwgMHg3ODI0LCAweGQwY2MsIDB4MTExMCwgMHg3MjE2LCAweDA0NzAsIDB4MGNlOCwKKwkweGMyZTUsIDB4MjAxMSwgMHgwMzAyLCAweDAwMTYsIDB4NzgyYywgMHg3MDFhLCAweDc5MzAsIDB4NzExZSwKKwkweDkxMDUsIDB4MDEwOCwgMHhjMmRkLCAweDAwMWUsIDB4NzgyNCwgMHhkMGNjLCAweDAxMDgsIDB4YzJlNSwKKwkweDcyMTYsIDB4NzAyNywgMHgwMDEyLCAweDcwMmYsIDB4MDAwOCwgMHg3MDQzLCAweDcwMDAsIDB4NzA0NywKKwkweDA1MDAsIDB4NzA0ZiwgMHgwMDBhLCAweDIwNjksIDB4MDIwMCwgMHg2ODEzLCAweDAwMDksIDB4MjA3MSwKKwkweDAyNDAsIDB4NzAwYiwgMHgyNTAwLCAweDYwYzMsIDB4MDAzMiwgMHgwODA0LCAweDk2MmEsIDB4MjAxMSwKKwkweDAwMjgsIDB4NzgyNCwgMHhkMGNjLCAweDExMjgsIDB4NzIxNiwgMHg2MGMzLCAweDAwMTgsIDB4MDgwNCwKKwkweDk2MmEsIDB4MGNkMCwgMHhjMmU1LCAweDIwMTEsIDB4MDEwMCwgMHg3ODI0LCAweGQwY2MsIDB4MDEwOCwKKwkweGMyZTUsIDB4NzIxNiwgMHg3MDJmLCAweDAwMDgsIDB4Nzg1OCwgMHg5MDg0LCAweDAwZmYsIDB4NzAzNiwKKwkweDYwYzMsIDB4MDAyMCwgMHgwODA0LCAweDk2MmEsIDB4MjAxMSwgMHgwMDA4LCAweDc4MjQsIDB4ZDBjYywKKwkweDAxMDgsIDB4YzJlNSwgMHg3MjE2LCAweDBjMDgsIDB4MDAzNiwgMHg3YjE0LCAweDkzODQsIDB4ZmYwMCwKKwkweDc4MTYsIDB4OTM4NCwgMHgwMGZmLCAweDgwMDEsIDB4MTEzOCwgMHg3ODI0LCAweGQwY2MsIDB4MDEwOCwKKwkweGMyZTUsIDB4NzIxNiwgMHgwMDNlLCAweDA4ODgsIDB4MDA0NiwgMHgyMDIxLCAweDA4MDAsIDB4MDAwNiwKKwkweDc4MjQsIDB4ZDBjYywgMHgwMDBlLCAweDAxMDgsIDB4YzRlNSwgMHg3NDE2LCAweDAwNGUsIDB4NzAxZSwKKwkweDAwM2UsIDB4MDgxOCwgMHgwMGQ2LCAweDY4MTMsIDB4MDAwOCwgMHhiODEwLCAweDkwODUsIDB4MDcwMCwKKwkweDcwMDIsIDB4YjgxNCwgMHg3MDA2LCAweDIwNjksIDB4MTgwMCwgMHg2ODc4LCAweDcwMGEsIDB4Njg3YywKKwkweDcwMGUsIDB4NzgyNCwgMHhkMGNjLCAweDExNjgsIDB4NzAxMywgMHgwODk4LCAweDA4MGMsIDB4OTYxOCwKKwkweDcyMWEsIDB4N2EwOCwgMHg3MjIyLCAweDJmMTAsIDB4NzIyNiwgMHgyMDcxLCAweDAyNGMsIDB4MDBkZSwKKwkweDAwMDUsIDB4NzAxMywgMHgwODg5LCAweDBjOTAsIDB4MDAxNiwgMHg3ODE0LCAweDkwODQsIDB4MDcwMCwKKwkweDgwMDcsIDB4MDAxMywgMHgwMDFlLCAweDAwMDUsIDB4OTQ3NCwgMHg5NDc0LCAweDk0NzYsIDB4OTQ3NCwKKwkweDk0NzQsIDB4OTQ3NCwgMHg5NDkwLCAweDk0NzQsIDB4MDgwYywgMHgwZGZhLCAweDc5MTQsIDB4OTE4YywKKwkweDA4ZmYsIDB4OTE4ZCwgMHhmNjAwLCAweDc5MTYsIDB4MjAwOSwgMHgwMDAzLCAweDAwYjksIDB4MjA2OSwKKwkweDE4NWIsIDB4NjgwNCwgMHhkMGJjLCAweDAxMzAsIDB4NjgyYywgMHg5MDg0LCAweDAwZmYsIDB4ODAwNywKKwkweDcwMzIsIDB4MDAxMCwgMHg3MDMzLCAweDNmMDAsIDB4NjBjMywgMHgwMDAxLCAweDA4MDQsIDB4OTYyYSwKKwkweDIwMDksIDB4MDAwMywgMHgwMDE5LCAweDcwMzMsIDB4N2YwMCwgMHgwY2IwLCAweDAwMTYsIDB4MDgwYywKKwkweDllZWIsIDB4MDAxZSwgMHhiODEwLCAweDkwODUsIDB4MDEwMCwgMHg3MDAyLCAweGI4MTQsIDB4NzAwNiwKKwkweDIwNjksIDB4MTgwMCwgMHg2YTc4LCAweDcyMGEsIDB4NmE3YywgMHg3MjBlLCAweDcwMTMsIDB4MDg4OCwKKwkweDkxOGQsIDB4MDAwOCwgMHg3MTE2LCAweDA4MGMsIDB4OTYxOCwgMHg3MjFhLCAweDdhMDgsIDB4NzIyMiwKKwkweDJmMTAsIDB4NzIyNiwgMHgwMDA1LCAweDAwYjYsIDB4MDA5NiwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwKKwkweDAwNTYsIDB4MDA0NiwgMHgwMDM2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweDE4MDAsIDB4NzgxMCwKKwkweDIwNTgsIDB4YjhhMCwgMHgyMDI4LCAweGI5MTAsIDB4YmExNCwgMHg3Mzc4LCAweDc0N2MsIDB4NzgyMCwKKwkweDkwYmUsIDB4MDAwNiwgMHgwOTA0LCAweDk1ODcsIDB4OTBiZSwgMHgwMDBhLCAweDE5MDQsIDB4OTU0MywKKwkweGI4YjAsIDB4NjA5ZSwgMHg3ODE0LCAweDIwNDgsIDB4YTg3YywgMHhkMGZjLCAweDA1NTgsIDB4YWY5MCwKKwkweDk3ODQsIDB4ZmYwMCwgMHg5MTA1LCAweDYwNjIsIDB4ODczZiwgMHg5Nzg0LCAweGZmMDAsIDB4MDAwNiwKKwkweDc4MTQsIDB4MjA0OCwgMHhhODc4LCAweGMwZmMsIDB4OTAwNSwgMHgwMDBlLCAweDExNjAsIDB4YWY5NCwKKwkweDg3ZmYsIDB4MDE5OCwgMHgyMDM5LCAweDAwOTgsIDB4OTcwNSwgMHg2MDcyLCAweDc4MDgsIDB4NjA4MiwKKwkweDJmMDAsIDB4NjA4NiwgMHgwMDM4LCAweDkxODUsIDB4MjIwMCwgMHg2MDYyLCAweDYwNzMsIDB4MDEyOSwKKwkweDYwNzcsIDB4MDAwMCwgMHhiOGIwLCAweDYwOWUsIDB4MDA1MCwgMHgyMDM5LCAweDAwMjksIDB4OTcwNSwKKwkweDYwNzIsIDB4MGNjMCwgMHg5MTg1LCAweDAyMDAsIDB4NjA2MiwgMHg2MDczLCAweDIwMjksIDB4YTg3YywKKwkweGQwZmMsIDB4MDExOCwgMHhhZjk0LCAweDg3ZmYsIDB4MTEyMCwgMHgyZjAwLCAweDYwODIsIDB4NzgwOCwKKwkweDYwODYsIDB4NjI2NiwgMHg2MzZhLCAweDY0NmUsIDB4NjA3NywgMHgwMDAwLCAweGI4OGMsIDB4ODAwMCwKKwkweDkwODQsIDB4MDBmZiwgMHhiODhlLCAweDgwMDcsIDB4NjA3YSwgMHg2MDdmLCAweDAwMDAsIDB4YTgzOCwKKwkweDYwOGEsIDB4YTgzNCwgMHg2MDhlLCAweGE4NDgsIDB4NjBjNiwgMHhhODQ0LCAweDYwY2EsIDB4Yjg2YywKKwkweDYwY2UsIDB4NjBhZiwgMHg5NWQ1LCAweDYwZDcsIDB4MDAwMCwgMHgwODBjLCAweDllZDAsIDB4MjAwOSwKKwkweDA3ZDAsIDB4NjBjNCwgMHg5MDg0LCAweGZmZjAsIDB4OTAwNSwgMHgwMTEwLCAweDIwMDksIDB4MWI1OCwKKwkweDA4MGMsIDB4ODM1ZiwgMHgwMDNlLCAweDAwNGUsIDB4MDA1ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwKKwkweDAwOWUsIDB4MDBiZSwgMHgwMDA1LCAweDc4MDQsIDB4OTA4NiwgMHgwMDQwLCAweDA5MDQsIDB4OTVjMywKKwkweDkxODUsIDB4MDEwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjM2YSwgMHg2NDZlLCAweDYwNzMsIDB4MDgwOSwKKwkweDYwNzcsIDB4MDAwOCwgMHg2MGFmLCAweDk1ZDUsIDB4NjBkNywgMHgwMDAwLCAweGI4OGMsIDB4ODAwMCwKKwkweDkwODQsIDB4MDBmZiwgMHhiODhlLCAweDgwMDcsIDB4NjA3YSwgMHg2MDdmLCAweDAwMDAsIDB4MmYwMCwKKwkweDYwODIsIDB4NzgwOCwgMHg2MDg2LCAweDc4MTQsIDB4MjA0OCwgMHhhODM4LCAweDYwOGEsIDB4YTgzNCwKKwkweDYwOGUsIDB4YTg0OCwgMHg2MGM2LCAweGE4NDQsIDB4NjBjYSwgMHhiODZjLCAweDYwY2UsIDB4YmFiMCwKKwkweDYyOWUsIDB4MDgwYywgMHg5ZWQwLCAweDIwMDksIDB4MDdkMCwgMHg2MGM0LCAweDkwODQsIDB4ZmZmMCwKKwkweDkwMDUsIDB4MDExMCwgMHgyMDA5LCAweDFiNTgsIDB4MDgwYywgMHg4MzVmLCAweDAwM2UsIDB4MDA0ZSwKKwkweDAwNWUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDA5ZSwgMHgwMGJlLCAweDAwMDUsIDB4NzgxNCwKKwkweDIwNDgsIDB4YTg3YywgMHg5MDg0LCAweDAwMDMsIDB4OTA4NiwgMHgwMDAyLCAweDA5MDQsIDB4OTVkZiwKKwkweDkxODUsIDB4MDEwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjM2YSwgMHg2NDZlLCAweDYwNzMsIDB4MDg4MCwKKwkweDYwNzcsIDB4MDAwOCwgMHhiODhjLCAweDgwMDAsIDB4OTA4NCwgMHgwMGZmLCAweGI4OGUsIDB4ODAwNywKKwkweDYwN2EsIDB4NzgzOCwgMHg2MDdlLCAweDJmMDAsIDB4NjA4NiwgMHg3ODA4LCAweDYwODIsIDB4YTg5MCwKKwkweDYwOGEsIDB4YTg4YywgMHg2MDhlLCAweGE4YjAsIDB4NjBjNiwgMHhhOGFjLCAweDYwY2EsIDB4YThhYywKKwkweDc5MzAsIDB4OTEwOCwgMHg3OTMyLCAweGE4YjAsIDB4NzkyYywgMHg5MTA5LCAweDc5MmUsIDB4Yjg2YywKKwkweDYwY2UsIDB4NjBhZiwgMHg5NWQ1LCAweDYwZDcsIDB4MDAwMCwgMHhiYWIwLCAweDYyOWUsIDB4MDgwYywKKwkweDllYWQsIDB4MDgwNCwgMHg5NTczLCAweGI4YmMsIDB4ZDA4NCwgMHgwMTQ4LCAweGI4OGMsIDB4NzgxNCwKKwkweDIwNDgsIDB4Yjg4YywgMHg3ODRhLCAweGE4MzYsIDB4MjkwMCwgMHhhODNhLCAweGIwNDYsIDB4OTE4NSwKKwkweDA2MDAsIDB4NjA2MiwgMHg2MjY2LCAweDYzNmEsIDB4NjQ2ZSwgMHg2MDczLCAweDA4MjksIDB4NjA3NywKKwkweDAwMDAsIDB4NjBhZiwgMHg5NTc1LCAweDYwZDcsIDB4MDAwMCwgMHgwODA0LCAweDk1NTYsIDB4OTE4NSwKKwkweDA3MDAsIDB4NjA2MiwgMHg2MjY2LCAweDYzNmEsIDB4NjQ2ZSwgMHg3ODI0LCAweGQwY2MsIDB4NzgyNiwKKwkweDAxMTgsIDB4NjA3MywgMHgwODg5LCAweDAwMTAsIDB4NjA3MywgMHgwODk4LCAweDYwNzcsIDB4MDAwMCwKKwkweGI4OGMsIDB4ODAwMCwgMHg5MDg0LCAweDAwZmYsIDB4Yjg4ZSwgMHg4MDA3LCAweDYwN2EsIDB4NjA3ZiwKKwkweDAwMDAsIDB4MmYwMCwgMHg2MDg2LCAweDc4MDgsIDB4NjA4MiwgMHhhODM4LCAweDYwOGEsIDB4YTgzNCwKKwkweDYwOGUsIDB4YTg0OCwgMHg2MGM2LCAweGE4NDQsIDB4NjBjYSwgMHhiODZjLCAweDYwY2UsIDB4NjBhZiwKKwkweDk1ZDUsIDB4NjBkNywgMHgwMDAwLCAweGJhYjAsIDB4NjI5ZSwgMHg3ODI0LCAweGQwY2MsIDB4MDEyMCwKKwkweDA4MGMsIDB4OWVkMCwgMHgwODA0LCAweDk1NzMsIDB4MDgwYywgMHg5ZWFkLCAweDA4MDQsIDB4OTU3MywKKwkweDdhMTAsIDB4MDBiNiwgMHgyMjU4LCAweGJhOGMsIDB4ODIxMCwgMHg5Mjk0LCAweDAwZmYsIDB4YmE4ZSwKKwkweDAwYmUsIDB4ODIxNywgMHgwMDA1LCAweDAwZDYsIDB4MjA2OSwgMHgxOWJmLCAweDY4NDMsIDB4MDAwMSwKKwkweDAwZGUsIDB4MDAwNSwgMHg2MGEzLCAweDAwNTYsIDB4NjBhNywgMHg5NTc1LCAweDAwZjEsIDB4MDgwYywKKwkweDgzNTEsIDB4MDAwNSwgMHgwMDE2LCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweDkxODQsIDB4MDYwMCwKKwkweDkwODYsIDB4MDYwMCwgMHgwMTI4LCAweDAwODksIDB4MDgwYywgMHg4MzUxLCAweDAwMWUsIDB4MDAwNSwKKwkweGMxZTUsIDB4MjAwMSwgMHgxODBjLCAweDIxMDIsIDB4MjAwMSwgMHgxOWMwLCAweDIwMDMsIDB4MDAwMCwKKwkweDIwMDEsIDB4MTljOCwgMHgyMDAzLCAweDAwMDAsIDB4MGM4OCwgMHgwMDA2LCAweDYwMTQsIDB4OTA4NCwKKwkweDE4MDQsIDB4OTA4NSwgMHgwMDA5LCAweDYwMTYsIDB4MDAwZSwgMHgwMDA1LCAweDAwMTYsIDB4MDBjNiwKKwkweDAwMDYsIDB4MjA2MSwgMHgwMTAwLCAweDYxYTQsIDB4NjBhNywgMHg5NWY1LCAweDYwMTQsIDB4OTA4NCwKKwkweDE4MDQsIDB4OTA4NSwgMHgwMDA4LCAweDYwMTYsIDB4MDAwZSwgMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwKKwkweDYxYTYsIDB4MDBjZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LCAweDAwMTYsIDB4MDAyNiwKKwkweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4MDgwYywgMHg3MjA3LCAweDExYzAsIDB4MjAwMSwKKwkweDE5ZGIsIDB4MjAwNCwgMHg5MDA1LCAweDE1ZDAsIDB4MDgwYywgMHg3MmQyLCAweDExNjAsIDB4MjA2MSwKKwkweDAxMDAsIDB4NjAyMCwgMHhkMGI0LCAweDExMjAsIDB4NjAyNCwgMHhkMDg0LCAweDA5MGMsIDB4MGRmYSwKKwkweDA4MGMsIDB4ODM1MSwgMHgwNDU4LCAweDAwYzYsIDB4MjA2MSwgMHgxOWJmLCAweDAwYzgsIDB4NjkwNCwKKwkweDkxOTQsIDB4NDAwMCwgMHgwNTQwLCAweDA4MTEsIDB4MDgwYywgMHgyYzk4LCAweDAwYzYsIDB4MjA2MSwKKwkweDE5YmYsIDB4NjEyOCwgMHg5MTkyLCAweDAwMDgsIDB4MTI1OCwgMHg4MTA4LCAweDYxMmEsIDB4NjEyNCwKKwkweDAwY2UsIDB4ODFmZiwgMHgwMTk4LCAweDA4MGMsIDB4ODM1MSwgMHgwODBjLCAweDk2NGQsIDB4MDA3MCwKKwkweDYxMjQsIDB4OTFlNSwgMHgwMDAwLCAweDAxNDAsIDB4MDgwYywgMHhkYzI4LCAweDA4MGMsIDB4ODM1YSwKKwkweDIwMDksIDB4MDAxNCwgMHgwODBjLCAweGExNWQsIDB4MDBjZSwgMHgwMDAwLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDIwMDEsIDB4MTlkYiwgMHgyMDA0LCAweDkwMDUsIDB4MWRiMCwKKwkweDAwYzYsIDB4MjA2MSwgMHgxOWJmLCAweDYxMjgsIDB4OTE5MiwgMHgwMDAzLCAweDFlMDgsIDB4ODEwOCwKKwkweDYxMmEsIDB4MDBjZSwgMHgwODBjLCAweDgzNTEsIDB4MDgwYywgMHg1ZGVhLCAweDIwMDksIDB4MTg1YSwKKwkweDIxMTQsIDB4ODIxMCwgMHgyMjBhLCAweDBjMTAsIDB4MDA5NiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwKKwkweDAwMTYsIDB4MDAyNiwgMHgwODBjLCAweDgzNjcsIDB4MjA3MSwgMHgxOWJmLCAweDcxM2MsIDB4ODFmZiwKKwkweDA5MDQsIDB4OTc0YSwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLCAweDA4MGMsIDB4NzIwNywKKwkweDExOTAsIDB4MDAzNiwgMHgyMDE5LCAweDAwMDIsIDB4MDgwYywgMHg5OTlkLCAweDAwM2UsIDB4NzEzYywKKwkweDIxNjAsIDB4MDgwYywgMHhkYzI4LCAweDIwMDksIDB4MDA0YSwgMHgwODBjLCAweGExNWQsIDB4MDgwYywKKwkweDcyZDIsIDB4MDgwNCwgMHg5NzRhLCAweDA4MGMsIDB4OTc1NiwgMHgwOTA0LCAweDk3NGEsIDB4NjkwNCwKKwkweGQxZjQsIDB4MDkwNCwgMHg5NzUxLCAweDA4MGMsIDB4MmM5OCwgMHgwMGM2LCAweDcwM2MsIDB4OTA2NSwKKwkweDA5MGMsIDB4MGRmYSwgMHg2MDIwLCAweDAwY2UsIDB4OTA4NiwgMHgwMDA2LCAweDE1NjgsIDB4NjFjOCwKKwkweDYwYzQsIDB4OTEwNSwgMHgxNTQ4LCAweDIwMDksIDB4MTgwYywgMHgyMTA0LCAweGQwZDQsIDB4MDUyMCwKKwkweDYyMTQsIDB4OTI5NCwgMHgxODAwLCAweDExMjgsIDB4NjIyNCwgMHg5Mjk0LCAweDAwMDIsIDB4MTU1MCwKKwkweDAwNzAsIDB4YzBkNCwgMHgyMDBhLCAweDAwMDYsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4NiwKKwkweDAwMGEsIDB4MDAwZSwgMHgwMTIwLCAweGQwY2MsIDB4MDExMCwgMHgwODBjLCAweDJiY2EsIDB4NjAxNCwKKwkweDkwODQsIDB4ZTdmZCwgMHg5MDg1LCAweDAwMTAsIDB4NjAxNiwgMHg3MDNjLCAweDIwNjAsIDB4MjAwOSwKKwkweDAwNDksIDB4MDgwYywgMHhhMTVkLCAweDAwNzAsIDB4MDAzNiwgMHgyMDE5LCAweDAwMDEsIDB4MDgwYywKKwkweDk5OWQsIDB4MDAzZSwgMHg3MTNjLCAweDIxNjAsIDB4MDgwYywgMHhkYzI4LCAweDIwMDksIDB4MDA0YSwKKwkweDA4MGMsIDB4YTE1ZCwgMHgwMDJlLCAweDAwMWUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDA5ZSwKKwkweDAwMDUsIDB4ZDFlYywgMHgxOTA0LCAweDk3MDMsIDB4MDgwNCwgMHg5NzA1LCAweDAwZDYsIDB4MDBjNiwKKwkweDAwOTYsIDB4NzAzYywgMHg5MDY1LCAweDA5MGMsIDB4MGRmYSwgMHgyMDAxLCAweDAzMDYsIDB4MjAwYywKKwkweDkxODQsIDB4MDAzMCwgMHgwOTA0LCAweDk3ZmYsIDB4OTE4NCwgMHgwMDQ4LCAweDkwODYsIDB4MDAwOCwKKwkweDE5MDQsIDB4OTdmZiwgMHgyMDA5LCAweDAyMDYsIDB4MjEwNCwgMHgyMDA5LCAweDAyMDMsIDB4MjEwYywKKwkweDkxMDYsIDB4MTkwNCwgMHg5N2ZmLCAweDIwMDksIDB4MDIyYSwgMHgyMTA0LCAweDIwMDksIDB4MDIyZiwKKwkweDIxMGMsIDB4OTExNiwgMHg5MDg0LCAweDAzZmYsIDB4OTE4YywgMHgwM2ZmLCAweDkyOTQsIDB4MDQwMCwKKwkweDAxMTAsIDB4OTEwMiwgMHgwMDMwLCAweDIwMTAsIDB4MjEwMCwgMHg5MjAyLCAweDIwMDksIDB4MDIyOCwKKwkweDkxMDIsIDB4OTA4MiwgMHgwMDA1LCAweDAyNTAsIDB4MjAwOCwgMHgyMDAxLCAweDAxM2IsIDB4MjAwNCwKKwkweDgwMDQsIDB4ODAwNCwgMHg4MDA0LCAweDkxMDIsIDB4MWEwNCwgMHg5N2ZmLCAweDIwMDksIDB4MWE1OCwKKwkweDIxMDQsIDB4ODAwMCwgMHgwMjA4LCAweDIwMGEsIDB4MjA2OSwgMHgwMTAwLCAweDY5MTQsIDB4OTE4YywKKwkweDAxODQsIDB4OTE4ZCwgMHgwMDEwLCAweDY5MTYsIDB4NjljOCwgMHgyMDExLCAweDAwMjAsIDB4NjhjOCwKKwkweDkxMDYsIDB4MTU3MCwgMHg4MjExLCAweDFkZDgsIDB4MjAwMSwgMHgwMzA2LCAweDIwMDMsIDB4NDgwMCwKKwkweDIwMDEsIDB4MDA5YSwgMHgyMDAzLCAweDAwMDQsIDB4MjAwMSwgMHgxYTNkLCAweDIwMDMsIDB4MDAwMCwKKwkweDIwMDEsIDB4MWE0NiwgMHgyMDAzLCAweDAwMDAsIDB4NmE4OCwgMHg2OThjLCAweDIyMDAsIDB4OTEwNSwKKwkweDExMjAsIDB4MmMxMCwgMHgwODBjLCAweDFhZmUsIDB4MDA0MCwgMHg2MDE0LCAweDIwNDgsIDB4YWEzYSwKKwkweGE5MzYsIDB4NmFjNCwgMHg2OWM4LCAweGE5NDYsIDB4YWE0YSwgMHgwMTI2LCAweDAwYzYsIDB4MjA5MSwKKwkweDI0MDAsIDB4MDAyZSwgMHgwODBjLCAweDFiOGEsIDB4MTkwYywgMHgwZGZhLCAweDAxMmUsIDB4MDA5MCwKKwkweDIwMDksIDB4MWE1OSwgMHgyMTA0LCAweDgwMDAsIDB4MDIwOCwgMHgyMDBhLCAweDY5YzgsIDB4MjAxMSwKKwkweDAwMjAsIDB4ODIxMSwgMHgxZGYwLCAweDY4YzgsIDB4OTEwNiwgMHgxZGMwLCAweDY5YzQsIDB4NjhjOCwKKwkweDkxMDUsIDB4MDE2MCwgMHg2ODI0LCAweGQwOGMsIDB4MDExMCwgMHg2ODI3LCAweDAwMDIsIDB4NzA0OCwKKwkweGMwODUsIDB4NzA0YSwgMHgwMDc5LCAweDcwNDgsIDB4YzA4NCwgMHg3MDRhLCAweDIwMDksIDB4MDdkMCwKKwkweDA4MGMsIDB4ODM1ZiwgMHg5MDA2LCAweDAwOWUsIDB4MDBjZSwgMHgwMGRlLCAweDAwMDUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MGNjOCwgMHgwMDI2LCAweDAwZTYsIDB4MjA3MSwgMHgxOWJmLCAweDcwNDgsIDB4ZDA4NCwKKwkweDAxYzAsIDB4NzEzYywgMHg4MWZmLCAweDAxYTgsIDB4MjA3MSwgMHgwMTAwLCAweDkxODgsIDB4MDAwOCwKKwkweDIxMTQsIDB4OTI4ZSwgMHgwMDA2LCAweDExMzgsIDB4NzAxNCwgMHg5MDg0LCAweDE5ODQsIDB4OTA4NSwKKwkweDAwMTIsIDB4NzAxNiwgMHgwMDMwLCAweDcwMTQsIDB4OTA4NCwgMHgxOTg0LCAweDkwODUsIDB4MDAxNiwKKwkweDcwMTYsIDB4MDBlZSwgMHgwMDJlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwKKwkweDAwNjYsIDB4MDA1NiwgMHgwMDQ2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjAxMCwKKwkweDIwNTgsIDB4YmNhMCwgMHgyMDcxLCAweDE5YmYsIDB4NzAxOCwgMHgyMDU4LCAweDhiZmYsIDB4MDE5MCwKKwkweGI4YTAsIDB4OTQwNiwgMHgwMTE4LCAweGI4NTQsIDB4MjA1OCwgMHgwY2MwLCAweDYwMTQsIDB4MDA5NiwKKwkweDIwNDgsIDB4YWM2YywgMHhhZDcwLCAweGFlNzgsIDB4MDA5ZSwgMHgwODBjLCAweDY1ZDEsIDB4MDExMCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwMGUsIDB4MDA0ZSwgMHgwMDVlLCAweDAwNmUsIDB4MDBjZSwKKwkweDAwZGUsIDB4MDBlZSwgMHgwMGJlLCAweDAwMDUsIDB4MDgwYywgMHg5MTJlLCAweDcwMDMsIDB4MTIwMCwKKwkweDc4MzgsIDB4NzAxMiwgMHg3ODNjLCAweDcwMTYsIDB4MDBjNiwgMHg3ODIwLCAweDkwODYsIDB4MDAwNCwKKwkweDExNDgsIDB4NzgxMCwgMHg5MDA1LCAweDAxMzAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MTAsIDB4YjkxNCwKKwkweDAwYmUsIDB4MDAyMCwgMHgyMDYxLCAweDE4MDAsIDB4NjA3OCwgMHg2MTdjLCAweDkwODQsIDB4MDBmZiwKKwkweDcwMGEsIDB4NzEwZSwgMHgwMGNlLCAweDYwYzMsIDB4MDAyYywgMHgwODA0LCAweDk2MmEsIDB4MDgwYywKKwkweDkxMmUsIDB4NzAwMywgMHgwZjAwLCAweDc4MDgsIDB4ZDA5YywgMHgwMTI4LCAweGI4MTAsIDB4OTA4NCwKKwkweDAwZmYsIDB4NzAwYSwgMHhiODE0LCAweDcwMGUsIDB4NjBjMywgMHgwMDA4LCAweDA4MDQsIDB4OTYyYSwKKwkweDAxNTYsIDB4MDgwYywgMHg5MTc5LCAweDcwMDMsIDB4MDIwMCwgMHgyMDExLCAweDE4NDgsIDB4NjNmMCwKKwkweDIzMTIsIDB4MjBhOSwgMHgwMDA2LCAweDIwMTEsIDB4MTg0MCwgMHgyMDE5LCAweDE4NDEsIDB4OWVmMCwKKwkweDAwMDIsIDB4MjM3NiwgMHg4ZTcwLCAweDIyNzYsIDB4OGU3MCwgMHg5Mzk4LCAweDAwMDIsIDB4OTI5MCwKKwkweDAwMDIsIDB4MWYwNCwgMHg5ODk5LCAweDYwYzMsIDB4MDAxYywgMHgwMTVlLCAweDA4MDQsIDB4OTYyYSwKKwkweDAwMTYsIDB4MDAyNiwgMHgwODBjLCAweDkxNTUsIDB4MDgwYywgMHg5MTY3LCAweDllODAsIDB4MDAwNCwKKwkweDIwZTksIDB4MDAwMCwgMHgyMGEwLCAweDc4MTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4MDAsIDB4MjA0OCwKKwkweGE4NjAsIDB4MjBlMCwgMHhhODVjLCAweDkwODAsIDB4MDAyMSwgMHgyMDk4LCAweDAwOWUsIDB4NzgwOCwKKwkweDkwODgsIDB4MDAwMiwgMHgyMWE4LCAweDkxOTIsIDB4MDAxMCwgMHgxMjUwLCAweDQwMDMsIDB4OTA4MCwKKwkweDAwMDQsIDB4ODAwMywgMHg2MGMyLCAweDA4MGMsIDB4OTYyYSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwKKwkweDIwYTksIDB4MDAxMCwgMHg0MDAzLCAweDA4MGMsIDB4OWVkNiwgMHgyMGExLCAweDAyNDAsIDB4MjJhOCwKKwkweDQwMDMsIDB4MGM2OCwgMHgwODBjLCAweDkxMmUsIDB4NzAwMywgMHg2MjAwLCAweDc4MDgsIDB4NzAwZSwKKwkweDYwYzMsIDB4MDAwOCwgMHgwODA0LCAweDk2MmEsIDB4MDAxNiwgMHgwMDI2LCAweDA4MGMsIDB4OTEyZSwKKwkweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNGMsIDB4NzgxNCwgMHgwMDk2LCAweDIwNDgsIDB4YTgwMCwKKwkweDIwNDgsIDB4YTg2MCwgMHgyMGUwLCAweGE4NWMsIDB4OTA4MCwgMHgwMDIzLCAweDIwOTgsIDB4MDA5ZSwKKwkweDc4MDgsIDB4OTA4OCwgMHgwMDAyLCAweDIxYTgsIDB4NDAwMywgMHg4MDAzLCAweDYwYzIsIDB4MDgwYywKKwkweDk2MmEsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGM2LCAweDAwMDYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDE5YmYsIDB4NzAwYywgMHgyMDYwLCAweDhjZmYsIDB4MDE3OCwKKwkweDA4MGMsIDB4YzAzZiwgMHgxMTEwLCAweDA4MGMsIDB4YWE4MSwgMHg2MDBjLCAweDAwMDYsIDB4MDgwYywKKwkweGMyYWIsIDB4MDgwYywgMHhhMGUzLCAweDA4MGMsIDB4OWE0ZSwgMHgwMGNlLCAweDBjNzgsIDB4MmMwMCwKKwkweDcwMGUsIDB4NzAwYSwgMHgwMTJlLCAweDAwMGUsIDB4MDBjZSwgMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwKKwkweDAxNTYsIDB4MDBmNiwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgwMDY2LCAweDAwMjYsIDB4MDAxNiwKKwkweDAwMDYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweDkxOGMsIDB4ZTdmZiwKKwkweDIxMDIsIDB4MjA2OSwgMHgwMTAwLCAweDIwNzksIDB4MDE0MCwgMHgyMDcxLCAweDE5YmYsIDB4NzAyNCwKKwkweDIwNjAsIDB4OGNmZiwgMHgwMWY4LCAweDA4MGMsIDB4OTY1NiwgMHg2YWMwLCAweDY4YzMsIDB4MDAwMCwKKwkweDA4MGMsIDB4ODM1YSwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHgwODBjLCAweDllZWYsIDB4MDBjZSwKKwkweDIwYTksIDB4MDFmNCwgMHgwNDYxLCAweDIwMDksIDB4MDAxMywgMHgwODBjLCAweGExNWQsIDB4MDAwZSwKKwkweDAwMWUsIDB4MDAyZSwgMHgwMDZlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDE1ZSwKKwkweDAxMmUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MDAsIDB4MjAwNCwgMHg5MDk2LCAweDAwMDEsIDB4MGQ3OCwKKwkweDkwOTYsIDB4MDAwNCwgMHgwZDYwLCAweDA4MGMsIDB4ODM1YSwgMHg2ODE0LCAweDkwODQsIDB4MDAwMSwKKwkweDAxMTAsIDB4NjhhNywgMHg5NWY1LCAweDY4MTcsIDB4MDAwOCwgMHg2OGMzLCAweDAwMDAsIDB4MjAxMSwKKwkweDVkOTQsIDB4MDgwYywgMHg4MmRhLCAweDIwYTksIDB4MDFmNCwgMHgwMDA5LCAweDA4YzAsIDB4NjgyNCwKKwkweGQwOTQsIDB4MDE0MCwgMHg2ODI3LCAweDAwMDQsIDB4NzgwNCwgMHg5MDg0LCAweDQwMDAsIDB4MTkwYywKKwkweDJjOTgsIDB4MDA5MCwgMHhkMDg0LCAweDAxMTgsIDB4NjgyNywgMHgwMDAxLCAweDAwMTAsIDB4MWYwNCwKKwkweDk5N2YsIDB4NzgwNCwgMHg5MDg0LCAweDEwMDAsIDB4MDEzOCwgMHgyMDAxLCAweDAxMDAsIDB4MDgwYywKKwkweDJjODgsIDB4OTAwNiwgMHgwODBjLCAweDJjODgsIDB4MDAwNSwgMHgwMTI2LCAweDAxNTYsIDB4MDBmNiwKKwkweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwNjYsIDB4MDAyNiwgMHgwMDE2LCAweDAwMDYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4OTE4YywgMHhkYmZmLCAweDIxMDIsIDB4MjA2OSwKKwkweDAxMDAsIDB4MjA3OSwgMHgwMTQwLCAweDIwNzEsIDB4MTliZiwgMHg3MDNjLCAweDIwNjAsIDB4OGNmZiwKKwkweDA5MDQsIDB4OWEwNCwgMHg5Mzg2LCAweDAwMDIsIDB4MTEyOCwgMHg2ODE0LCAweDkwODQsIDB4MDAwMiwKKwkweDA5MDQsIDB4OWEwNCwgMHg2OGFmLCAweDk1ZjUsIDB4NjgxNywgMHgwMDEwLCAweDIwMDksIDB4MDBmYSwKKwkweDgxMDksIDB4MWRmMCwgMHg2OWM2LCAweDY4Y2IsIDB4MDAwOCwgMHgwODBjLCAweDgzNjcsIDB4MDgwYywKKwkweDFmMzIsIDB4MjAwMSwgMHgwMDMyLCAweDY5MjAsIDB4ZDFiYywgMHgwMTMwLCAweDgwMDEsIDB4MWRkOCwKKwkweDY5MmMsIDB4OTE4ZCwgMHgwMDA4LCAweDY5MmUsIDB4MjBhOSwgMHgwM2U4LCAweDY4MjQsIDB4ZDA5NCwKKwkweDAxNDAsIDB4NjgyNywgMHgwMDA0LCAweDc4MDQsIDB4OTA4NCwgMHg0MDAwLCAweDE5MGMsIDB4MmM5OCwKKwkweDAwOTAsIDB4ZDA4YywgMHgwMTE4LCAweDY4MjcsIDB4MDAwMiwgMHgwMDEwLCAweDFmMDQsIDB4OTlkZSwKKwkweDc4MDQsIDB4OTA4NCwgMHgxMDAwLCAweDAxMzgsIDB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmM4OCwKKwkweDkwMDYsIDB4MDgwYywgMHgyYzg4LCAweDY4MjcsIDB4NDAwMCwgMHg2ODI0LCAweDgzZmYsIDB4MTEyMCwKKwkweDIwMDksIDB4MDA0OSwgMHgwODBjLCAweGExNWQsIDB4MDAwZSwgMHgwMDFlLCAweDAwMmUsIDB4MDA2ZSwKKwkweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDE1ZSwgMHgwMTJlLCAweDAwMDUsIDB4MDBkNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksIDB4MTliZiwgMHg2YTA2LCAweDAxMmUsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDBkNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDY5LCAweDE5YmYsIDB4NmEzMiwKKwkweDAxMmUsIDB4MDBkZSwgMHgwMDA1LCAweDA4MGMsIDB4OTJmMSwgMHg3ODU0LCAweDcwMzIsIDB4NzA0MiwKKwkweDcwNDcsIDB4MTAwMCwgMHgwMGY4LCAweDA4MGMsIDB4OTJmMSwgMHg3ODU0LCAweDcwMzIsIDB4NzA0MiwKKwkweDcwNDcsIDB4NDAwMCwgMHgwMGI4LCAweDA4MGMsIDB4OTJmMSwgMHg3ODU0LCAweDcwMzIsIDB4NzA0MiwKKwkweDcwNDcsIDB4MjAwMCwgMHgwMDc4LCAweDA4MGMsIDB4OTJmMSwgMHg3ODU0LCAweDcwMzIsIDB4NzA0MiwKKwkweDcwNDcsIDB4MDQwMCwgMHgwMDM4LCAweDA4MGMsIDB4OTJmMSwgMHg3ODU0LCAweDcwMzIsIDB4NzA0MiwKKwkweDcwNDcsIDB4MDIwMCwgMHg2MGMzLCAweDAwMjAsIDB4MDgwNCwgMHg5NjJhLCAweDAwZTYsIDB4MjA3MSwKKwkweDE5YmYsIDB4NzAyMCwgMHg5MDA1LCAweDAxMTAsIDB4ODAwMSwgMHg3MDIyLCAweDAwZWUsIDB4MDAwNSwKKwkweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDA3NiwgMHgwMDY2LCAweDAwMDYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDE5YmYsIDB4NzYxNCwgMHgyNjYwLCAweDI2NzgsIDB4MjAzOSwKKwkweDAwMDEsIDB4ODdmZiwgMHgwOTA0LCAweDlhZjMsIDB4OGNmZiwgMHgwOTA0LCAweDlhZjMsIDB4NjAyMCwKKwkweDkwODYsIDB4MDAwNiwgMHgxOTA0LCAweDlhZWUsIDB4ODhmZiwgMHgwMTM4LCAweDI4MDAsIDB4OWMwNiwKKwkweDE5MDQsIDB4OWFlZSwgMHgyMDM5LCAweDAwMDAsIDB4MDA1MCwgMHg2MDEwLCAweDliMDYsIDB4MTkwNCwKKwkweDlhZWUsIDB4ODVmZiwgMHgwMTIwLCAweDYwNTQsIDB4OTEwNiwgMHgxOTA0LCAweDlhZWUsIDB4NzAyNCwKKwkweDljMDYsIDB4MTViMCwgMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwgMHg5MDA1LCAweDExNjAsIDB4NjgyNCwKKwkweGQwODQsIDB4MDE0OCwgMHg2ODI3LCAweDAwMDEsIDB4MDgwYywgMHg4MzVhLCAweDA4MGMsIDB4OWI3OCwKKwkweDcwMjcsIDB4MDAwMCwgMHgwNDI4LCAweDA4MGMsIDB4ODM1YSwgMHg2ODIwLCAweGQwYjQsIDB4MDExMCwKKwkweDY4YTcsIDB4OTVmNSwgMHg2ODE3LCAweDAwMDgsIDB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4OWI3OCwKKwkweDcwMjcsIDB4MDAwMCwgMHgwMDM2LCAweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweDkzODQsIDB4MTAwMCwKKwkweDAxMzgsIDB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmM4OCwgMHg5MDA2LCAweDA4MGMsIDB4MmM4OCwKKwkweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDExMCwgMHg2ODI3LCAweDAwMDEsIDB4MDAzZSwKKwkweDcwMTQsIDB4OWMzNiwgMHgxMTEwLCAweDY2MGMsIDB4NzYxNiwgMHg3MDEwLCAweDljMzYsIDB4MTE0MCwKKwkweDJjMDAsIDB4OWYzNiwgMHgwMTE4LCAweDJmMDAsIDB4NzAxMiwgMHgwMDEwLCAweDcwMTMsIDB4MDAwMCwKKwkweDY2MGMsIDB4MDA2NiwgMHgyYzAwLCAweDlmMDYsIDB4MDExMCwgMHg3ZTBlLCAweDAwMDgsIDB4MjY3OCwKKwkweDg5ZmYsIDB4MTE2OCwgMHg2MDBmLCAweDAwMDAsIDB4NjAxNCwgMHgwMDk2LCAweDIwNDgsIDB4MDgwYywKKwkweGJlMzUsIDB4MDExMCwgMHgwODBjLCAweGQ4MzAsIDB4MDA5ZSwgMHgwODBjLCAweGExMTMsIDB4MDgwYywKKwkweDlhNGUsIDB4ODhmZiwgMHgxMTkwLCAweDAwY2UsIDB4MDgwNCwgMHg5YTY5LCAweDJjNzgsIDB4NjAwYywKKwkweDIwNjAsIDB4MDgwNCwgMHg5YTY5LCAweDkwMDYsIDB4MDEyZSwgMHgwMDBlLCAweDAwNmUsIDB4MDA3ZSwKKwkweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHg2MDFiLCAweDAwMDAsIDB4MDBjZSwKKwkweDk4YzUsIDB4MDAwMSwgMHgwYzg4LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwOTYsIDB4MDBjNiwKKwkweDAwNjYsIDB4MDAyNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MTliZiwKKwkweDc2MzgsIDB4MjY2MCwgMHgyNjc4LCAweDhjZmYsIDB4MDkwNCwgMHg5YjY3LCAweDYwMjAsIDB4OTA4NiwKKwkweDAwMDYsIDB4MTkwNCwgMHg5YjYyLCAweDg3ZmYsIDB4MDEyOCwgMHgyNzAwLCAweDljMDYsIDB4MTkwNCwKKwkweDliNjIsIDB4MDA0MCwgMHg2MDEwLCAweDliMDYsIDB4MTVlOCwgMHg4NWZmLCAweDAxMTgsIDB4NjA1NCwKKwkweDkxMDYsIDB4MTVjMCwgMHg3MDNjLCAweDljMDYsIDB4MTE2OCwgMHgwMDM2LCAweDIwMTksIDB4MDAwMSwKKwkweDA4MGMsIDB4OTk5ZCwgMHg3MDMzLCAweDAwMDAsIDB4OTAwNiwgMHg3MDNlLCAweDcwNDIsIDB4NzA0NiwKKwkweDcwNGEsIDB4MDAzZSwgMHg3MDM4LCAweDljMzYsIDB4MTExMCwgMHg2NjBjLCAweDc2M2EsIDB4NzAzNCwKKwkweDljMzYsIDB4MTE0MCwgMHgyYzAwLCAweDlmMzYsIDB4MDExOCwgMHgyZjAwLCAweDcwMzYsIDB4MDAxMCwKKwkweDcwMzcsIDB4MDAwMCwgMHg2NjBjLCAweDAwNjYsIDB4MmMwMCwgMHg5ZjA2LCAweDAxMTAsIDB4N2UwZSwKKwkweDAwMDgsIDB4MjY3OCwgMHg2MDBmLCAweDAwMDAsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4YmUzNSwKKwkweDAxMTAsIDB4MDgwYywgMHhkODMwLCAweDA4MGMsIDB4YTExMywgMHg4N2ZmLCAweDExOTgsIDB4MDBjZSwKKwkweDA4MDQsIDB4OWIxMywgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwODA0LCAweDliMTMsIDB4OTAwNiwKKwkweDAxMmUsIDB4MDAwZSwgMHgwMDJlLCAweDAwNmUsIDB4MDBjZSwgMHgwMDllLCAweDAwZGUsIDB4MDBlZSwKKwkweDAwZmUsIDB4MDAwNSwgMHg2MDFiLCAweDAwMDAsIDB4MDBjZSwgMHg5N2JkLCAweDAwMDEsIDB4MGM4MCwKKwkweDAwZTYsIDB4MjA3MSwgMHgxOWJmLCAweDIwMDEsIDB4MTgwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwMiwKKwkweDExMTgsIDB4NzAwNywgMHgwMDA1LCAweDAwMTAsIDB4NzAwNywgMHgwMDAwLCAweDAwZWUsIDB4MDAwNSwKKwkweDAwZjYsIDB4MDBlNiwgMHgwMGM2LCAweDAwNjYsIDB4MDAyNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA3MSwgMHgxOWJmLCAweDJjMTAsIDB4NzYzOCwgMHgyNjYwLCAweDI2NzgsIDB4OGNmZiwKKwkweDA1NDAsIDB4MjIwMCwgMHg5YzA2LCAweDE1MDgsIDB4NzAzOCwgMHg5YzM2LCAweDExMTAsIDB4NjYwYywKKwkweDc2M2EsIDB4NzAzNCwgMHg5YzM2LCAweDExNDAsIDB4MmMwMCwgMHg5ZjM2LCAweDAxMTgsIDB4MmYwMCwKKwkweDcwMzYsIDB4MDAxMCwgMHg3MDM3LCAweDAwMDAsIDB4NjYwYywgMHgyYzAwLCAweDlmMDYsIDB4MDExMCwKKwkweDdlMGUsIDB4MDAwOCwgMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwgMHg2MDA0LCAweDkwODYsIDB4MDA0MCwKKwkweDA5MGMsIDB4OGIwNCwgMHg5MDg1LCAweDAwMDEsIDB4MDAyMCwgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwKKwkweDA4YjAsIDB4MDEyZSwgMHgwMDBlLCAweDAwMmUsIDB4MDA2ZSwgMHgwMGNlLCAweDAwZWUsIDB4MDBmZSwKKwkweDAwMDUsIDB4MDA5NiwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwNjYsIDB4MDAyNiwKKwkweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgxOWJmLCAweDc2MGMsIDB4MjY2MCwKKwkweDI2NzgsIDB4OGNmZiwgMHgwOTA0LCAweDljNWUsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjhhMCwKKwkweDAwYmUsIDB4OTIwNiwgMHgxOTA0LCAweDljNTksIDB4NzAyNCwgMHg5YzA2LCAweDE1MjAsIDB4MjA2OSwKKwkweDAxMDAsIDB4NjhjMCwgMHg5MDA1LCAweDA5MDQsIDB4OWMzMCwgMHgwODBjLCAweDk2NTYsIDB4NjhjMywKKwkweDAwMDAsIDB4MDgwYywgMHg5Yjc4LCAweDcwMjcsIDB4MDAwMCwgMHgwMDM2LCAweDIwNjksIDB4MDE0MCwKKwkweDZiMDQsIDB4OTM4NCwgMHgxMDAwLCAweDAxMzgsIDB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmM4OCwKKwkweDkwMDYsIDB4MDgwYywgMHgyYzg4LCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDExMCwKKwkweDY4MjcsIDB4MDAwMSwgMHgwMDNlLCAweDcwMGMsIDB4OWMzNiwgMHgxMTEwLCAweDY2MGMsIDB4NzYwZSwKKwkweDcwMDgsIDB4OWMzNiwgMHgxMTQwLCAweDJjMDAsIDB4OWYzNiwgMHgwMTE4LCAweDJmMDAsIDB4NzAwYSwKKwkweDAwMTAsIDB4NzAwYiwgMHgwMDAwLCAweDY2MGMsIDB4MDA2NiwgMHgyYzAwLCAweDlmMDYsIDB4MDExMCwKKwkweDdlMGUsIDB4MDAwOCwgMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwgMHgwODBjLCAweGMwMmUsIDB4MTE4MCwKKwkweDA4MGMsIDB4MzFiNCwgMHgwODBjLCAweGMwM2YsIDB4MTUxOCwgMHgwODBjLCAweGFhODEsIDB4MDQwMCwKKwkweDA4MGMsIDB4OWI3OCwgMHg2ODI0LCAweGQwODQsIDB4MDliMCwgMHg2ODI3LCAweDAwMDEsIDB4MDg5OCwKKwkweDA4MGMsIDB4YzAzZiwgMHgxMTE4LCAweDA4MGMsIDB4YWE4MSwgMHgwMDkwLCAweDYwMTQsIDB4MjA0OCwKKwkweDA4MGMsIDB4YmUzNSwgMHgwMTY4LCAweDYwMjAsIDB4OTA4NiwgMHgwMDAzLCAweDE1MDgsIDB4YTg2NywKKwkweDAxMDMsIDB4YWI3YSwgMHhhODc3LCAweDAwMDAsIDB4MDgwYywgMHg2YWRjLCAweDA4MGMsIDB4YzAyMiwKKwkweDA4MGMsIDB4YzJhYiwgMHgwODBjLCAweGExMTMsIDB4MDgwYywgMHg5YTRlLCAweDAwY2UsIDB4MDgwNCwKKwkweDliZDksIDB4MmM3OCwgMHg2MDBjLCAweDIwNjAsIDB4MDgwNCwgMHg5YmQ5LCAweDAxMmUsIDB4MDAwZSwKKwkweDAwMmUsIDB4MDA2ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwOWUsIDB4MDAwNSwKKwkweDYwMjAsIDB4OTA4NiwgMHgwMDA2LCAweDFkMjAsIDB4MDgwYywgMHhkODMwLCAweDBjMDgsIDB4MDBkNiwKKwkweDA4MGMsIDB4OTE3OSwgMHg3MDAzLCAweDAyMDAsIDB4NzAwNywgMHgwMDE0LCAweDYwYzMsIDB4MDAxNCwKKwkweDIwZTEsIDB4MDAwMSwgMHgyMDk5LCAweDE5NjEsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI1MCwKKwkweDIwYTksIDB4MDAwNCwgMHg0MDAzLCAweDcwMjMsIDB4MDAwNCwgMHg3MDI3LCAweDc4NzgsIDB4MDgwYywKKwkweDk2MmEsIDB4MDBkZSwgMHgwMDA1LCAweDA4MGMsIDB4OTE3OSwgMHg3MDBiLCAweDA4MDAsIDB4NzgxNCwKKwkweDkwODQsIDB4ZmYwMCwgMHg3MDBlLCAweDc4MTQsIDB4OTA4NCwgMHgwMGZmLCAweDcwMjIsIDB4NzgyYywKKwkweDcwMjYsIDB4Nzg1OCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NSwgMHgwMjAwLCAweDcwMDIsIDB4Nzg1OCwKKwkweDkwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDcwMDYsIDB4NjBjMiwgMHgwODA0LCAweDk2MmEsIDB4MDBiNiwKKwkweDAwZDYsIDB4MDAxNiwgMHgwMGQ2LCAweDJmNjgsIDB4MjAwOSwgMHgwMDM1LCAweDA4MGMsIDB4YzRiMSwKKwkweDAwZGUsIDB4MTkwNCwgMHg5ZDBjLCAweDA4MGMsIDB4OTEyZSwgMHg3MDAzLCAweDEzMDAsIDB4NzgyYywKKwkweDA4MGMsIDB4OWUxMiwgMHgyMDY4LCAweDY4MjAsIDB4OTA4NiwgMHgwMDAzLCAweDA1NjAsIDB4NzgxMCwKKwkweDIwNTgsIDB4YmFhMCwgMHgwODBjLCAweGEwNjIsIDB4MTFkOCwgMHg5Mjg2LCAweDAwN2UsIDB4MTEyOCwKKwkweDcwMGIsIDB4MDBmZiwgMHg3MDBmLCAweGZmZmUsIDB4MDQ5OCwgMHg5Mjg2LCAweDAwN2YsIDB4MTEyOCwKKwkweDcwMGIsIDB4MDBmZiwgMHg3MDBmLCAweGZmZmQsIDB4MDQ1OCwgMHg5Mjg0LCAweGZmODAsIDB4MDE4MCwKKwkweDkyODYsIDB4MDA4MCwgMHgxMTI4LCAweDcwMGIsIDB4MDBmZiwgMHg3MDBmLCAweGZmZmMsIDB4MDQwMCwKKwkweDkyZDgsIDB4MTAwMCwgMHgyYjVjLCAweGI4MTAsIDB4NzAwYSwgMHhiODE0LCAweDcwMGUsIDB4MDBjMCwKKwkweDYwOTgsIDB4NzAwZSwgMHgwMGE4LCAweDA4MGMsIDB4YTA2MiwgMHgxMTMwLCAweDc4MTAsIDB4MjA1OCwKKwkweGI4YTAsIDB4OTA4MiwgMHgwMDdlLCAweDAyNTAsIDB4MDBkNiwgMHgyMDY5LCAweDE4MWUsIDB4MmQwNCwKKwkweDcwMGEsIDB4OGQ2OCwgMHgyZDA0LCAweDcwMGUsIDB4MDBkZSwgMHgwMDEwLCAweDYwMzQsIDB4NzAwZSwKKwkweDc4MzgsIDB4NzAxMiwgMHg3ODNjLCAweDcwMTYsIDB4NjBjMywgMHgwMDBjLCAweDAwMWUsIDB4MDBkZSwKKwkweDA4MGMsIDB4OTYyYSwgMHgwMGJlLCAweDAwMDUsIDB4NzgxYiwgMHgwMDAxLCAweDc4MDMsIDB4MDAwNiwKKwkweDAwMWUsIDB4MDBkZSwgMHgwMGJlLCAweDAwMDUsIDB4NzkyYywgMHg5MTgwLCAweDAwMDgsIDB4MjAwYywKKwkweDkxODYsIDB4MDAwNiwgMHgwMWMwLCAweDkxODYsIDB4MDAwMywgMHgwOTA0LCAweDlkODcsIDB4OTE4NiwKKwkweDAwMDUsIDB4MDkwNCwgMHg5ZDZmLCAweDkxODYsIDB4MDAwNCwgMHgwNWQ4LCAweDkxODYsIDB4MDAwOCwKKwkweDA5MDQsIDB4OWQ3OCwgMHg3ODA3LCAweDAwMzcsIDB4NzgyZiwgMHgwMDAzLCAweDc4MTcsIDB4MTcwMCwKKwkweDA4MGMsIDB4OWRlZiwgMHgwMDA1LCAweDA4MGMsIDB4OWRiMCwgMHgwMGQ2LCAweDAwMjYsIDB4NzkyYywKKwkweDIxNjgsIDB4MjAwOSwgMHg0MDAwLCAweDY4MDAsIDB4MDAwMiwgMHg5ZDUwLCAweDlkNWIsIDB4OWQ1MiwKKwkweDlkNWIsIDB4OWQ1NywgMHg5ZDUwLCAweDlkNTAsIDB4OWQ1YiwgMHg5ZDViLCAweDlkNWIsIDB4OWQ1YiwKKwkweDlkNTAsIDB4OWQ1MCwgMHg5ZDUwLCAweDlkNTAsIDB4OWQ1MCwgMHg5ZDViLCAweDlkNTAsIDB4OWQ1YiwKKwkweDA4MGMsIDB4MGRmYSwgMHg2ODI0LCAweGQwZTQsIDB4MDExMCwgMHhkMGNjLCAweDAxMTAsIDB4OTAwZSwKKwkweDAwMTAsIDB4MjAwOSwgMHgyMDAwLCAweDY4MmMsIDB4NzAyMiwgMHg2ODMwLCAweDcwMjYsIDB4MDgwNCwKKwkweDlkYTksIDB4MDgwYywgMHg5ZGIwLCAweDAwZDYsIDB4MDAyNiwgMHg3OTJjLCAweDIxNjgsIDB4MjAwOSwKKwkweDQwMDAsIDB4NmEwMCwgMHg5Mjg2LCAweDAwMDIsIDB4MTEwOCwgMHg5MDBlLCAweDA0ZDAsIDB4MDgwYywKKwkweDlkYjAsIDB4MDBkNiwgMHgwMDI2LCAweDc5MmMsIDB4MjE2OCwgMHgyMDA5LCAweDQwMDAsIDB4MDQ4OCwKKwkweDA0YjksIDB4MDBkNiwgMHgwMDI2LCAweDc5MmMsIDB4MjE2OCwgMHgyMDA5LCAweDQwMDAsIDB4OTI4NiwKKwkweDAwMDUsIDB4MDExOCwgMHg5Mjg2LCAweDAwMDIsIDB4MTEwOCwgMHg5MDBlLCAweDA0MTAsIDB4MDQ0MSwKKwkweDAwZDYsIDB4MDAyNiwgMHg3OTJjLCAweDIxNjgsIDB4NjgxNCwgMHg2OTI0LCAweGMxODUsIDB4NjkyNiwKKwkweDAwOTYsIDB4MjA0OCwgMHhhOWFjLCAweGE4MzQsIDB4OTExMiwgMHhhOWIwLCAweGE4MzgsIDB4MDA5ZSwKKwkweDkxMDMsIDB4NzAyMiwgMHg3MjI2LCAweDc5MmMsIDB4OTE4MCwgMHgwMDAwLCAweDIwMDQsIDB4OTA4ZSwKKwkweDAwMDIsIDB4MDEzMCwgMHg5MDhlLCAweDAwMDQsIDB4MDExOCwgMHgyMDA5LCAweDQwMDAsIDB4MDAwOCwKKwkweDkwMGUsIDB4NzEyYSwgMHg2MGMzLCAweDAwMTgsIDB4MDAyZSwgMHgwMGRlLCAweDA4MDQsIDB4OTYyYSwKKwkweDAwYjYsIDB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MDA2NiwgMHgwODBjLCAweDkxNzksIDB4OTAwNiwKKwkweDcwMDMsIDB4MDIwMCwgMHg3OTM4LCAweDcxMGEsIDB4NzkzYywgMHg3MTBlLCAweDc4MTAsIDB4MjA1OCwKKwkweGI4YTAsIDB4MDgwYywgMHhhMDYyLCAweDExMTgsIDB4OTA5MiwgMHgwMDdlLCAweDAyNjgsIDB4MDBkNiwKKwkweDIwNjksIDB4MTgxZSwgMHgyZDJjLCAweDhkNjgsIDB4MmQzNCwgMHg5MGQ4LCAweDEwMDAsIDB4MmI1YywKKwkweGJiMTAsIDB4YmMxNCwgMHgwMGRlLCAweDAwMjgsIDB4OTAxZSwgMHg2NDk4LCAweDIwMjksIDB4MDAwMCwKKwkweDY2MzQsIDB4NzgyYywgMHg5MDgwLCAweDAwMDgsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDMsIDB4MTEyOCwKKwkweDc1MTIsIDB4NzYxNiwgMHg3MzFhLCAweDc0MWUsIDB4MDAyMCwgMHg3MzEyLCAweDc0MTYsIDB4NzUxYSwKKwkweDc2MWUsIDB4MDA2ZSwgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwgMHgwMGJlLCAweDAwMDUsIDB4MDgwYywKKwkweDkxNzksIDB4NzAwMywgMHgwMTAwLCAweDc4MmMsIDB4NzAwYSwgMHg3ODE0LCAweDcwMGUsIDB4NzAwZSwKKwkweDYwYzMsIDB4MDAwOCwgMHgwODA0LCAweDk2MmEsIDB4MDgwYywgMHg5MTI1LCAweDcwMDMsIDB4MTQwMCwKKwkweDc4MzgsIDB4NzAwYSwgMHgwMDc5LCAweDc4M2MsIDB4NzAwZSwgMHg3ODJjLCAweDcwMTIsIDB4NzgzMCwKKwkweDcwMTYsIDB4NzgzNCwgMHg5MDg0LCAweDAwZmYsIDB4ODAwNywgMHg3MDFhLCAweDYwYzMsIDB4MDAxMCwKKwkweDA4MDQsIDB4OTYyYSwgMHgwMGU2LCAweDIwNzEsIDB4MDI0MCwgMHgwMDA2LCAweDAwZjYsIDB4MjA3OCwKKwkweDc4MTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4YmMsIDB4ZDA4NCwgMHgwMTIwLCAweDc4NDQsIDB4NzAyYSwKKwkweDc4NDgsIDB4NzAyZSwgMHgwMGJlLCAweDAwZmUsIDB4MDAwZSwgMHgwMGVlLCAweDAwMDUsIDB4MDgwYywKKwkweDkxNzAsIDB4NzAwMywgMHgwMTAwLCAweDc4MmMsIDB4NzAwYSwgMHg3ODE0LCAweDcwMGUsIDB4NjBjMywKKwkweDAwMDgsIDB4MDgwNCwgMHg5NjJhLCAweDAwMjEsIDB4NjBjMywgMHgwMDAwLCAweDA4MDQsIDB4OTYyYSwKKwkweDAwZDYsIDB4MDgwYywgMHg5ZWViLCAweGI4MTAsIDB4OTA4NSwgMHgwMzAwLCAweDcwMDIsIDB4YjgxNCwKKwkweDcwMDYsIDB4MjA2OSwgMHgxODAwLCAweDY4NzgsIDB4NzAwYSwgMHg2ODdjLCAweDcwMGUsIDB4NzAxMywKKwkweDA4MTksIDB4MDgwYywgMHg5NjE4LCAweDcyMWEsIDB4MmYxMCwgMHg3MjIyLCAweDdhMDgsIDB4NzIyNiwKKwkweDIwNzEsIDB4MDI0YywgMHgwMGRlLCAweDAwMDUsIDB4MDBhOSwgMHg3OTE0LCAweDcxMmEsIDB4NjBjMywKKwkweDAwMDAsIDB4NjBhNywgMHg5NTc1LCAweDAwMjYsIDB4MDgwYywgMHgyYWZlLCAweDAyMjgsIDB4MjAxMSwKKwkweDAxMDEsIDB4MjIwNCwgMHhjMGM1LCAweDIwMTIsIDB4MDAyZSwgMHgwODBjLCAweDk2NGQsIDB4MDgwYywKKwkweDgzNTEsIDB4MDAwNSwgMHgwMDM2LCAweDAwOTYsIDB4MDBkNiwgMHgwMGU2LCAweDc4NTgsIDB4MjA0OCwKKwkweGFhN2MsIDB4OTI5NiwgMHgwMGMwLCAweDkyOTQsIDB4ZmZmZCwgMHhhYTdlLCAweGFhODAsIDB4OTI5NCwKKwkweDAzMDAsIDB4YWE4MiwgMHhhOTZjLCAweDkxOTQsIDB4MDBmZiwgMHhhYjc0LCAweDkzODQsIDB4MDBmZiwKKwkweDkwOGQsIDB4YzIwMCwgMHhhOTZlLCAweDkzODQsIDB4ZmYwMCwgMHg5MjE1LCAweGFhNzYsIDB4YTg3MCwKKwkweGFhNzgsIDB4YTg3YSwgMHhhYTcyLCAweDAwZDYsIDB4MjA2OSwgMHgwMjAwLCAweDA4MGMsIDB4OWVlYiwKKwkweDAwZGUsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0MCwgMHgyMGE5LCAweDAwMGEsIDB4YTg2MCwKKwkweDIwZTAsIDB4YTg1YywgMHg5MDgwLCAweDAwMWIsIDB4MjA5OCwgMHg0MDAzLCAweDYwYTMsIDB4MDAzNSwKKwkweGFhNjgsIDB4OTI5NCwgMHg3MDAwLCAweDkyODYsIDB4MzAwMCwgMHgwMTEwLCAweDYwYTMsIDB4MDAzNywKKwkweDAwZWUsIDB4MDBkZSwgMHgwMDllLCAweDAwM2UsIDB4MDAwNSwgMHg5MDBlLCAweDc4MTQsIDB4MDA5NiwKKwkweDIwNDgsIDB4YTg3YywgMHhkMGZjLCAweDAxYzAsIDB4OTA4NCwgMHgwMDAzLCAweDExYTgsIDB4MjAwMSwKKwkweDE4MGMsIDB4MjAwNCwgMHhkMGJjLCAweDAxODAsIDB4NzgyNCwgMHhkMGNjLCAweDExNjgsIDB4ZDBjNCwKKwkweDExNTgsIDB4YThhOCwgMHg5MDA1LCAweDExNDAsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4YzFkNSwKKwkweDIxMDIsIDB4MjAwOSwgMHgxOThhLCAweDIxMGMsIDB4MDA5ZSwgMHg5MThkLCAweDAwOTIsIDB4MDAxMCwKKwkweDIwMDksIDB4MDA5NiwgMHg2MGFiLCAweDAwMzYsIDB4NjExNiwgMHgwMDA1LCAweDIwMDksIDB4MDAwOSwKKwkweDAwYTAsIDB4MjAwOSwgMHgwMDBhLCAweDAwODgsIDB4MjAwOSwgMHgwMDBiLCAweDAwNzAsIDB4MjAwOSwKKwkweDAwMGMsIDB4MDA1OCwgMHgyMDA5LCAweDAwMGQsIDB4MDA0MCwgMHgyMDA5LCAweDAwMGUsIDB4MDAyOCwKKwkweDIwMDksIDB4MDAwZiwgMHgwMDEwLCAweDIwMDksIDB4MDAwOCwgMHg2OTEyLCAweDAwMDUsIDB4MDBkNiwKKwkweDkyOTAsIDB4MDAxOCwgMHg4MjE0LCAweDIwZTksIDB4MDAwMCwgMHgyMDY5LCAweDAyMDAsIDB4NjgxMywKKwkweDAwMDAsIDB4MjJhOCwgMHg5Mjg0LCAweDAwZTAsIDB4MDEyOCwgMHgyMGE5LCAweDAwMjAsIDB4OTI5MiwKKwkweDAwMjAsIDB4MDAwOCwgMHg5MDE2LCAweDIwYTEsIDB4MDI0MCwgMHg5MDA2LCAweDQwMDQsIDB4ODJmZiwKKwkweDAxMjAsIDB4NjgxMCwgMHg4MDAwLCAweDY4MTIsIDB4MGM2MCwgMHgwMGRlLCAweDAwMDUsIDB4MDBkNiwKKwkweDAwOTYsIDB4NjAxNCwgMHgyMDQ4LCAweGE4NzgsIDB4NjA1NiwgMHg5MDA2LCAweGE4MzYsIDB4YTgzYSwKKwkweGE5OWMsIDB4YTk0NiwgMHhhODRhLCAweDYwMjMsIDB4MDAwMywgMHg2MDA3LCAweDAwNDAsIDB4NjAwMywKKwkweDAwMDMsIDB4NjAwYiwgMHhmZmZmLCAweGE4MTcsIDB4MDAwMSwgMHhhODQyLCAweGE4M2UsIDB4MjkwMCwKKwkweGE4NWEsIDB4YTgxMywgMHgxZmM2LCAweDA4MGMsIDB4ODZkZSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4OGNlZCwgMHgwMTJlLCAweDAwOWUsIDB4MDBkZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwKKwkweDAwZDYsIDB4MDBjNiwgMHgwMGE2LCAweDAwOTYsIDB4MDA2NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDIwNzEsIDB4MTliZiwgMHg3NjBjLCAweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLCAweDA5MDQsIDB4OWZjMiwKKwkweDcwMjQsIDB4OWMwNiwgMHgxNTIwLCAweDIwNjksIDB4MDEwMCwgMHg2OGMwLCAweDkwMDUsIDB4MDkwNCwKKwkweDlmOTQsIDB4MDgwYywgMHg5NjU2LCAweDY4YzMsIDB4MDAwMCwgMHgwODBjLCAweDliNzgsIDB4NzAyNywKKwkweDAwMDAsIDB4MDAzNiwgMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHg5Mzg0LCAweDEwMDAsIDB4MDEzOCwKKwkweDIwMDEsIDB4MDEwMCwgMHgwODBjLCAweDJjODgsIDB4OTAwNiwgMHgwODBjLCAweDJjODgsIDB4MjA2OSwKKwkweDAxMDAsIDB4NjgyNCwgMHhkMDg0LCAweDAxMTAsIDB4NjgyNywgMHgwMDAxLCAweDAwM2UsIDB4NzAwYywKKwkweDljMzYsIDB4MTExMCwgMHg2NjBjLCAweDc2MGUsIDB4NzAwOCwgMHg5YzM2LCAweDExNDAsIDB4MmMwMCwKKwkweDlmMzYsIDB4MDExOCwgMHgyZjAwLCAweDcwMGEsIDB4MDAxMCwgMHg3MDBiLCAweDAwMDAsIDB4NjYwYywKKwkweDAwNjYsIDB4MmMwMCwgMHg5ZjA2LCAweDAxMTAsIDB4N2UwZSwgMHgwMDA4LCAweDI2NzgsIDB4NjAwZiwKKwkweDAwMDAsIDB4MDgwYywgMHhjMDJlLCAweDExODAsIDB4MDgwYywgMHgzMWI0LCAweDA4MGMsIDB4YzAzZiwKKwkweDE1MTgsIDB4MDgwYywgMHhhYTgxLCAweDA0MDAsIDB4MDgwYywgMHg5Yjc4LCAweDY4MjQsIDB4ZDA4NCwKKwkweDA5YjAsIDB4NjgyNywgMHgwMDAxLCAweDA4OTgsIDB4MDgwYywgMHhjMDNmLCAweDExMTgsIDB4MDgwYywKKwkweGFhODEsIDB4MDA5MCwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhiZTM1LCAweDAxNjgsIDB4NjAyMCwKKwkweDkwODYsIDB4MDAwMywgMHgxNTIwLCAweGE4NjcsIDB4MDEwMywgMHhhYjdhLCAweGE4NzcsIDB4MDAwMCwKKwkweDA4MGMsIDB4NmFlOSwgMHgwODBjLCAweGMwMjIsIDB4MDgwYywgMHhjMmFiLCAweDA4MGMsIDB4YTExMywKKwkweDA4MGMsIDB4OWE0ZSwgMHgwMGNlLCAweDA4MDQsIDB4OWY0NSwgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwKKwkweDA4MDQsIDB4OWY0NSwgMHg3MDBmLCAweDAwMDAsIDB4NzAwYiwgMHgwMDAwLCAweDAxMmUsIDB4MDA2ZSwKKwkweDAwOWUsIDB4MDBhZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4NjAyMCwKKwkweDkwODYsIDB4MDAwNiwgMHgxZDA4LCAweDA4MGMsIDB4ZDgzMCwgMHgwOGYwLCAweDAwZDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4OTE3OSwgMHg3YTE0LCAweDgyZmYsIDB4MDEzOCwgMHg3MDAzLCAweDAxMDAsIDB4NzAwYiwKKwkweDAwMDMsIDB4NjBjMywgMHgwMDA4LCAweDA0OTAsIDB4NzAwMywgMHgwMjAwLCAweDcwMDcsIDB4MDAwMCwKKwkweDIwNjksIDB4MTgwMCwgMHg5MDFlLCAweDY4MDAsIDB4OTA4NiwgMHgwMDA0LCAweDExMTAsIDB4YzM4ZCwKKwkweDAwNjAsIDB4MDgwYywgMHg3MjA3LCAweDExMTAsIDB4YzNhZCwgMHgwMDA4LCAweGMzYTUsIDB4NmFkOCwKKwkweGQyOWMsIDB4MTExMCwgMHhkMmFjLCAweDAxMDgsIDB4YzM5ZCwgMHg3MzBlLCAweDIwMTEsIDB4MTg0OCwKKwkweDYzZjAsIDB4MjMxMiwgMHgyMGE5LCAweDAwMDYsIDB4MjAxMSwgMHgxODQwLCAweDIwMTksIDB4MTg0MSwKKwkweDIwNzEsIDB4MDI1MCwgMHgyMzc2LCAweDhlNzAsIDB4MjI3NiwgMHg4ZTcwLCAweDkzOTgsIDB4MDAwMiwKKwkweDkyOTAsIDB4MDAwMiwgMHgxZjA0LCAweGEwMGEsIDB4NjBjMywgMHgwMDIwLCAweDA4MGMsIDB4OTYyYSwKKwkweDAxNWUsIDB4MDBkZSwgMHgwMDA1LCAweDAxNTYsIDB4MDgwYywgMHg5MTc5LCAweDdhMTQsIDB4ODJmZiwKKwkweDAxNjgsIDB4OTI4NiwgMHhmZmZmLCAweDAxMTgsIDB4OTI4MiwgMHgwMDBlLCAweDEyMzgsIDB4NzAwMywKKwkweDAxMDAsIDB4NzAwYiwgMHgwMDAzLCAweDYwYzMsIDB4MDAwOCwgMHgwNDg4LCAweDcwMDMsIDB4MDIwMCwKKwkweDcwMDcsIDB4MDAxYywgMHg3MDBmLCAweDAwMDEsIDB4MjAxMSwgMHgxOTk1LCAweDIyMDQsIDB4ODAwNywKKwkweDcwMWEsIDB4ODIxMCwgMHgyMjA0LCAweDgwMDcsIDB4NzAxZSwgMHgwNDIxLCAweDExMjAsIDB4YjhhMCwKKwkweDkwODIsIDB4MDA3ZiwgMHgwMjQ4LCAweDIwMDEsIDB4MTgxZSwgMHgyMDA0LCAweDcwMjIsIDB4MjAwMSwKKwkweDE4MWYsIDB4MjAwNCwgMHg3MDI2LCAweDAwMzAsIDB4MjAwMSwgMHgxODE3LCAweDIwMDQsIDB4OTA4NCwKKwkweDAwZmYsIDB4NzAyNiwgMHgyMGE5LCAweDAwMDQsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksIDB4MTgwNSwKKwkweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNTYsIDB4NDAwMywgMHg2MGMzLCAweDAwMWMsIDB4MDE1ZSwKKwkweDA4MDQsIDB4OTYyYSwgMHgwMDA2LCAweDIwMDEsIDB4MTgzNiwgMHgyMDA0LCAweGQwYWMsIDB4MDAwZSwKKwkweDAwMDUsIDB4MjAxMSwgMHgwMDAzLCAweDA4MGMsIDB4OWEwZiwgMHgyMDExLCAweDAwMDIsIDB4MDgwYywKKwkweDlhMTksIDB4MDgwYywgMHg5OTI3LCAweDAwMzYsIDB4OTAxZSwgMHgwODBjLCAweDk5OWQsIDB4MDAzZSwKKwkweDAwMDUsIDB4MjA3MSwgMHgxODhiLCAweDcwMDAsIDB4OTAwNSwgMHgwMTQwLCAweDIwMDEsIDB4MDk3NiwKKwkweDIwNzEsIDB4MTgwMCwgMHg3MDcyLCAweDcwNzYsIDB4NzA2NywgMHhmZmUwLCAweDIwNzEsIDB4MTgwMCwKKwkweDcwNzAsIDB4NzA1MiwgMHg3MDU3LCAweDFjZDAsIDB4MDAwNSwgMHgwMGU2LCAweDAxMjYsIDB4MjA3MSwKKwkweDE4MDAsIDB4MjA5MSwgMHg4MDAwLCAweDc1NTAsIDB4OTU4MiwgMHgwMDEwLCAweDA2MDgsIDB4NzA1NCwKKwkweDIwNjAsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDE0OCwgMHg5Y2UwLCAweDAwMTgsIDB4NzA2NCwKKwkweDljMDIsIDB4MTIwOCwgMHgwY2IwLCAweDIwNjEsIDB4MWNkMCwgMHgwYzk4LCAweDYwMDMsIDB4MDAwOCwKKwkweDg1MjksIDB4NzU1MiwgMHg5Y2E4LCAweDAwMTgsIDB4NzA2NCwgMHg5NTAyLCAweDEyMzAsIDB4NzU1NiwKKwkweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHg3MDU3LCAweDFjZDAsIDB4MGNjMCwKKwkweDkwMDYsIDB4MGNjMCwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwgMHg3NTUwLCAweDk1ODIsIDB4MDAxMCwKKwkweDA2MDAsIDB4NzA1NCwgMHgyMDYwLCAweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDAxNDgsIDB4OWNlMCwKKwkweDAwMTgsIDB4NzA2NCwgMHg5YzAyLCAweDEyMDgsIDB4MGNiMCwgMHgyMDYxLCAweDFjZDAsIDB4MGM5OCwKKwkweDYwMDMsIDB4MDAwOCwgMHg4NTI5LCAweDc1NTIsIDB4OWNhOCwgMHgwMDE4LCAweDcwNjQsIDB4OTUwMiwKKwkweDEyMjgsIDB4NzU1NiwgMHg5MDg1LCAweDAwMDEsIDB4MDBlZSwgMHgwMDA1LCAweDcwNTcsIDB4MWNkMCwKKwkweDBjYzgsIDB4OTAwNiwgMHgwY2M4LCAweDljODIsIDB4MWNkMCwgMHgwYTBjLCAweDBkZmEsIDB4MjAwMSwKKwkweDE4MTksIDB4MjAwNCwgMHg5YzAyLCAweDFhMGMsIDB4MGRmYSwgMHg5MDA2LCAweDYwMDYsIDB4NjAwYSwKKwkweDYwMGUsIDB4NjAxNiwgMHg2MDFhLCAweDYwMTIsIDB4NjAyMywgMHgwMDAwLCAweDYwMDMsIDB4MDAwMCwKKwkweDYwMWUsIDB4NjA1NiwgMHg2MDVhLCAweDYwMjYsIDB4NjAyYSwgMHg2MDJlLCAweDYwMzIsIDB4NjAzNiwKKwkweDYwM2EsIDB4NjAzZSwgMHg2MDQyLCAweDIwNjEsIDB4MTgwMCwgMHg2MDUwLCAweDgwMDAsIDB4NjA1MiwKKwkweDkwODYsIDB4MDAwMSwgMHgwMTA4LCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweDhjMTAsIDB4MDEyZSwgMHgwY2MwLCAweDAwMDYsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDFiMCwKKwkweDYwMWMsIDB4ZDA4NCwgMHgxOTBjLCAweDE5YjQsIDB4NjAxNywgMHgwMDAwLCAweDYwMjMsIDB4MDAwNywKKwkweDIwMDEsIDB4MTk1ZSwgMHgyMDA0LCAweDAwMDYsIDB4OTA4MiwgMHgwMDUxLCAweDAwMGUsIDB4MDIwOCwKKwkweDgwMDQsIDB4NjAxYSwgMHgwODBjLCAweGRhZTIsIDB4NjA0MywgMHgwMDAwLCAweDAwMGUsIDB4MDAwNSwKKwkweDAwZTYsIDB4MDEyNiwgMHgyMDcxLCAweDE4MDAsIDB4MjA5MSwgMHg4MDAwLCAweDc1NTAsIDB4OTU4MiwKKwkweDAwMDEsIDB4MDYwOCwgMHg3MDU0LCAweDIwNjAsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDE0OCwKKwkweDljZTAsIDB4MDAxOCwgMHg3MDY0LCAweDljMDIsIDB4MTIwOCwgMHgwY2IwLCAweDIwNjEsIDB4MWNkMCwKKwkweDBjOTgsIDB4NjAwMywgMHgwMDA4LCAweDg1MjksIDB4NzU1MiwgMHg5Y2E4LCAweDAwMTgsIDB4NzA2NCwKKwkweDk1MDIsIDB4MTIzMCwgMHg3NTU2LCAweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwKKwkweDcwNTcsIDB4MWNkMCwgMHgwY2MwLCAweDkwMDYsIDB4MGNjMCwgMHg2MDIwLCAweDkwODQsIDB4MDAwZiwKKwkweDAwMDIsIDB4YTE3MCwgMHhhMTc5LCAweGExOTQsIDB4YTFhZiwgMHhjNTVmLCAweGM1N2MsIDB4YzU5NywKKwkweGExNzAsIDB4YTE3OSwgMHhhMTcwLCAweGExY2IsIDB4YTE3MCwgMHhhMTcwLCAweGExNzAsIDB4YTE3MCwKKwkweDkxODYsIDB4MDAxMywgMHgxMTI4LCAweDA4MGMsIDB4OGIwNCwgMHgwODBjLCAweDhjMTAsIDB4MDAwNSwKKwkweDAwMDUsIDB4MDA2NiwgMHg2MDAwLCAweDkwYjIsIDB4MDAxNiwgMHgxYTBjLCAweDBkZmEsIDB4MDAxMywKKwkweDAwNmUsIDB4MDAwNSwgMHhhMTkyLCAweGE4ZjgsIDB4YWFjOCwgMHhhMTkyLCAweGFiNTYsIDB4YTRhZSwKKwkweGExOTIsIDB4YTE5MiwgMHhhODdhLCAweGIwZmEsIDB4YTE5MiwgMHhhMTkyLCAweGExOTIsIDB4YTE5MiwKKwkweGExOTIsIDB4YTE5MiwgMHgwODBjLCAweDBkZmEsIDB4MDA2NiwgMHg2MDAwLCAweDkwYjIsIDB4MDAxNiwKKwkweDFhMGMsIDB4MGRmYSwgMHgwMDEzLCAweDAwNmUsIDB4MDAwNSwgMHhhMWFkLCAweGI3ZTEsIDB4YTFhZCwKKwkweGExYWQsIDB4YTFhZCwgMHhhMWFkLCAweGExYWQsIDB4YTFhZCwgMHhiNzc4LCAweGI5NjMsIDB4YTFhZCwKKwkweGI4MjIsIDB4YjhhMSwgMHhiODIyLCAweGI4YTEsIDB4YTFhZCwgMHgwODBjLCAweDBkZmEsIDB4NjAwMCwKKwkweDkwODIsIDB4MDAxNiwgMHgxYTBjLCAweDBkZmEsIDB4NjAwMCwgMHgwMDAyLCAweGExYzksIDB4YjE0MSwKKwkweGIyMjYsIDB4YjM1NiwgMHhiNTA1LCAweGExYzksIDB4YTFjOSwgMHhhMWM5LCAweGIxMTUsIDB4YjcwNCwKKwkweGI3MDcsIDB4YTFjOSwgMHhhMWM5LCAweGExYzksIDB4YTFjOSwgMHhiNzM2LCAweGExYzksIDB4YTFjOSwKKwkweGExYzksIDB4MDgwYywgMHgwZGZhLCAweDAwNjYsIDB4NjAwMCwgMHg5MGIyLCAweDAwMTYsIDB4MWEwYywKKwkweDBkZmEsIDB4MDAxMywgMHgwMDZlLCAweDAwMDUsIDB4YTFlNCwgMHhhMWU0LCAweGEyMjcsIDB4YTJjNiwKKwkweGEzNWIsIDB4YTFlNCwgMHhhMWU0LCAweGExZTQsIDB4YTFlNiwgMHhhMWU0LCAweGExZTQsIDB4YTFlNCwKKwkweGExZTQsIDB4YTFlNCwgMHhhMWU0LCAweGExZTQsIDB4MDgwYywgMHgwZGZhLCAweDkxODYsIDB4MDA0YywKKwkweDA1ODgsIDB4OTE4NiwgMHgwMDAzLCAweDE5MGMsIDB4MGRmYSwgMHgwMDk2LCAweDYwMWMsIDB4YzBlZCwKKwkweDYwMWUsIDB4NjAwMywgMHgwMDAzLCAweDYxMDYsIDB4NjAxNCwgMHgyMDQ4LCAweGE4N2MsIDB4OTA4NCwKKwkweGEwMDAsIDB4YzBiNSwgMHhhODdlLCAweGE4YWMsIDB4YTg0NiwgMHhhOGIwLCAweGE4NGEsIDB4OTAwNiwKKwkweGE4MzYsIDB4YTgzYSwgMHhhODg0LCAweDkwOTIsIDB4MTk5YSwgMHgwMjEwLCAweDIwMDEsIDB4MTk5OSwKKwkweDgwMDMsIDB4ODAxMywgMHg4MjEzLCAweDkyMTAsIDB4NjIxYSwgMHgwMDllLCAweDJjMTAsIDB4MDgwYywKKwkweDFhZmUsIDB4MDgwYywgMHg4NmRlLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4OGNlZCwKKwkweDAxMmUsIDB4MDAwNSwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiY2EwLCAweDAwYmUsIDB4MmMwMCwKKwkweDA4MGMsIDB4YTM3ZCwgMHgwODBjLCAweGM1NTEsIDB4NjAwMywgMHgwMDA3LCAweDAwMDUsIDB4MDBkNiwKKwkweDAwOTYsIDB4MDBmNiwgMHgyMDc5LCAweDE4MDAsIDB4N2E4YywgMHg2MDE0LCAweDIwNDgsIDB4YTg3YywKKwkweGQwZWMsIDB4MTExMCwgMHg5MjkwLCAweDAwMTgsIDB4YWM3OCwgMHhjNGZjLCAweDAwNDYsIDB4YThlMCwKKwkweDkwMDUsIDB4MTE0MCwgMHhhOGRjLCAweDkyMWEsIDB4MDE0MCwgMHgwMjIwLCAweGE4N2IsIDB4MDAwNywKKwkweDIwMTAsIDB4MDAyOCwgMHhhODdiLCAweDAwMTUsIDB4MDAxMCwgMHhhODdiLCAweDAwMDAsIDB4ODIxNCwKKwkweGE4ODMsIDB4MDAwMCwgMHhhYTAyLCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDAwYzYsIDB4MDBkNiwKKwkweDAwZTYsIDB4MDBmNiwgMHgyNDAwLCAweDkwMDUsIDB4MTEwOCwgMHgwMDlhLCAweDIxMDAsIDB4OTA4NiwKKwkweDAwMTUsIDB4MTExOCwgMHgyMDAxLCAweDAwMDEsIDB4MDAzOCwgMHgyMTAwLCAweDkwODYsIDB4MDAxNiwKKwkweDAxMTgsIDB4MjAwMSwgMHgwMDAxLCAweDAwMmEsIDB4OTRhNCwgMHgwMDA3LCAweDg0MjMsIDB4OTQwNSwKKwkweDAwMDIsIDB4YTI4ZSwgMHhhMjhlLCAweGEyODksIDB4YTI4YywgMHhhMjhlLCAweGEyODYsIDB4YTI3OSwKKwkweGEyNzksIDB4YTI3OSwgMHhhMjc5LCAweGEyNzksIDB4YTI3OSwgMHhhMjc5LCAweGEyNzksIDB4YTI3OSwKKwkweGEyNzksIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwKKwkweDAwNGUsIDB4MDBmZSwgMHgwMDllLCAweDAwZGUsIDB4MDgwYywgMHgwZGZhLCAweDA4MGMsIDB4YWQzOSwKKwkweDAwMjgsIDB4MDgwYywgMHhhZTVjLCAweDAwMTAsIDB4MDgwYywgMHhhZjRiLCAweDAwZmUsIDB4MDBlZSwKKwkweDAwZGUsIDB4MDBjZSwgMHgwMDJlLCAweDAwMWUsIDB4MmMwMCwgMHhhODk2LCAweDAwMGUsIDB4MDgwYywKKwkweGE0M2IsIDB4MDUzMCwgMHhhODA0LCAweGE4MGUsIDB4MDBhNiwgMHgyMDUwLCAweGIxMDAsIDB4MDBhZSwKKwkweDgwMDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwKKwkweDAwMDIsIDB4YWFjYywgMHhhYmQwLCAweGFjZDQsIDB4YWRkOCwgMHgyMDMxLCAweDAwMDAsIDB4MjA0MSwKKwkweDEyYTIsIDB4MDgwYywgMHhhNWU2LCAweDAxNjAsIDB4MDAwZSwgMHg5MDA1LCAweDAxMjAsIDB4MDBmZSwKKwkweDAwOWUsIDB4MDBkZSwgMHgwMDA1LCAweDAwZmUsIDB4MDA5ZSwgMHgwMGRlLCAweDA4MDQsIDB4YTBlMywKKwkweDIwMDEsIDB4MDAyYywgMHg5MDBlLCAweDA4MGMsIDB4YTRhMSwgMHgwYzcwLCAweDkxYjYsIDB4MDAxNSwKKwkweDAxNzAsIDB4OTFiNiwgMHgwMDE2LCAweDAxNTgsIDB4OTFiMiwgMHgwMDQ3LCAweDBhMGMsIDB4MGRmYSwKKwkweDkxYjIsIDB4MDA1MCwgMHgxYTBjLCAweDBkZmEsIDB4OTE4MiwgMHgwMDQ3LCAweDAwY2EsIDB4MjAwMSwKKwkweDAxMDksIDB4MjAwNCwgMHhkMDhjLCAweDAxOTgsIDB4MDEyNiwgMHgyMDkxLCAweDI4MDAsIDB4MDAwNiwKKwkweDAwMTYsIDB4MDAyNiwgMHgwODBjLCAweDg2MzIsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDEyZSwKKwkweGEwMDEsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDIsIDB4MTExMCwgMHgwODA0LCAweGEyMjcsIDB4MDAwNSwKKwkweGEyZjksIDB4YTJmOSwgMHhhMmZiLCAweGEzMzEsIDB4YTJmOSwgMHhhMmY5LCAweGEyZjksIDB4YTJmOSwKKwkweGEzNDQsIDB4MDgwYywgMHgwZGZhLCAweDAwZDYsIDB4MDAxNiwgMHgwMDk2LCAweDA4MGMsIDB4OGJjMCwKKwkweDA4MGMsIDB4OGNlZCwgMHg2MDAzLCAweDAwMDQsIDB4NjExNCwgMHgyMTQ4LCAweGE4N2MsIDB4ZDBmYywKKwkweDAxYzAsIDB4YTg3OCwgMHhjMGZjLCAweDkwMDUsIDB4MTE1OCwgMHhhODk0LCAweDkwMDUsIDB4MDE0MCwKKwkweDIwMDEsIDB4MDAwMCwgMHg5MDBlLCAweDA4MGMsIDB4YTRhMSwgMHgwODBjLCAweGEwZTMsIDB4MDBhOCwKKwkweDYwMDMsIDB4MDAwMiwgMHhhOGE0LCAweGE5YTgsIDB4OTEwNSwgMHgxMTc4LCAweGE4YWUsIDB4YThiMiwKKwkweDBjNzgsIDB4YTg3ZiwgMHgwMDIwLCAweGE4OGMsIDB4YTg4YSwgMHhhOGE0LCAweGE4YWUsIDB4YThhOCwKKwkweGE4YjIsIDB4YThjNywgMHgwMDAwLCAweGE4Y2IsIDB4MDAwMCwgMHgwMDllLCAweDAwMWUsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDgwYywgMHg4YmMwLCAweDAwZDYsIDB4MDA5NiwgMHg2MTE0LCAweDIxNDgsIDB4MDgwYywKKwkweGJlMzcsIDB4MDEyMCwgMHhhODdiLCAweDAwMDYsIDB4MDgwYywgMHg2YWU5LCAweDAwOWUsIDB4MDBkZSwKKwkweDA4MGMsIDB4YTBlMywgMHgwODA0LCAweDhjZWQsIDB4MDgwYywgMHg4YmMwLCAweDA4MGMsIDB4MzE4YiwKKwkweDA4MGMsIDB4YzU0ZSwgMHgwMGQ2LCAweDAwOTYsIDB4NjExNCwgMHgyMTQ4LCAweDA4MGMsIDB4YmUzNywKKwkweDAxMjAsIDB4YTg3YiwgMHgwMDI5LCAweDA4MGMsIDB4NmFlOSwgMHgwMDllLCAweDAwZGUsIDB4MDgwYywKKwkweGEwZTMsIDB4MDgwNCwgMHg4Y2VkLCAweDkxODIsIDB4MDA0NywgMHgwMDAyLCAweGEzNmIsIDB4YTM2ZCwKKwkweGEzNmIsIDB4YTM2YiwgMHhhMzZiLCAweGEzNmIsIDB4YTM2YiwgMHhhMzZiLCAweGEzNmIsIDB4YTM2YiwKKwkweGEzNmIsIDB4YTM2YiwgMHhhMzZkLCAweDA4MGMsIDB4MGRmYSwgMHgwMGQ2LCAweDAwOTYsIDB4MDgwYywKKwkweDE1ODIsIDB4NjExNCwgMHgyMTQ4LCAweGE4N2IsIDB4MDAwMCwgMHhhODgzLCAweDAwMDAsIDB4MDgwYywKKwkweDZhZTksIDB4MDA5ZSwgMHgwMGRlLCAweDA4MDQsIDB4YTBlMywgMHgwMDI2LCAweDAwMzYsIDB4MDA1NiwKKwkweDAwNjYsIDB4MDA5NiwgMHgwMGE2LCAweDAwZjYsIDB4MDAwNiwgMHgwODBjLCAweDEwMzEsIDB4MDAwZSwKKwkweDA5MGMsIDB4MGRmYSwgMHhhOTYwLCAweDIxZTgsIDB4YTk1YywgMHg5MTg4LCAweDAwMTksIDB4MjFhMCwKKwkweDkwMGUsIDB4MjBhOSwgMHgwMDIwLCAweDQxMDQsIDB4YTg3YSwgMHgyMDc5LCAweDE4MDAsIDB4Nzk4YywKKwkweDkxODgsIDB4MDAxOCwgMHg5MThjLCAweDBmZmYsIDB4YTk3MiwgMHhhYzc2LCAweDI5NTAsIDB4MDBhNiwKKwkweDIwMDEsIDB4MDIwNSwgMHgyMDAzLCAweDAwMDAsIDB4OTAxZSwgMHgyMDI5LCAweDAwMDEsIDB4OTE4MiwKKwkweDAwMzQsIDB4MTIyOCwgMHgyMDExLCAweDAwMWYsIDB4MDgwYywgMHhiOWU4LCAweDA0YzAsIDB4MjEzMCwKKwkweDIwMDksIDB4MDAzNCwgMHgyMDExLCAweDAwMWYsIDB4MDgwYywgMHhiOWU4LCAweDk2YjIsIDB4MDAzNCwKKwkweGIwMDQsIDB4OTA0ZCwgMHgwMTEwLCAweDA4MGMsIDB4MGZlMywgMHgwODBjLCAweDEwMzEsIDB4MDFkMCwKKwkweDg1MjgsIDB4YTg2NywgMHgwMTEwLCAweGE4NmIsIDB4MDAwMCwgMHgyOTIwLCAweGI0MDYsIDB4OTY4YSwKKwkweDAwM2QsIDB4MTIzMCwgMHgyNjA4LCAweDIwMTEsIDB4MDAxYiwgMHgwODBjLCAweGI5ZTgsIDB4MDBiOCwKKwkweDk2YjIsIDB4MDAzYywgMHgyMDA5LCAweDAwM2MsIDB4Mjk1MCwgMHgyMDExLCAweDAwMWIsIDB4MDgwYywKKwkweGI5ZTgsIDB4MGMxOCwgMHgyMDAxLCAweDAyMDUsIDB4MjAwMywgMHgwMDAwLCAweDAwYWUsIDB4ODUyZiwKKwkweDk1YWQsIDB4MDA1MCwgMHhiNTY2LCAweGIwNzAsIDB4YzBmZCwgMHhiMDcyLCAweDAwNDgsIDB4MjAwMSwKKwkweDAyMDUsIDB4MjAwMywgMHgwMDAwLCAweDAwYWUsIDB4ODUyZiwgMHg5NWFkLCAweDAwNTAsIDB4YjU2NiwKKwkweDJhNDgsIDB4YTgwNCwgMHhhODA3LCAweDAwMDAsIDB4MDAwNiwgMHgwODBjLCAweDZhZTksIDB4MDAwZSwKKwkweDIwNDgsIDB4OTAwNSwgMHgxZGIwLCAweDAwZmUsIDB4MDBhZSwgMHgwMDllLCAweDAwNmUsIDB4MDA1ZSwKKwkweDAwM2UsIDB4MDAyZSwgMHgwMDA1LCAweDAwZDYsIDB4MDBmNiwgMHgwMDk2LCAweDAwMDYsIDB4MDgwYywKKwkweDEwMzEsIDB4MDAwZSwgMHgwOTBjLCAweDBkZmEsIDB4YTk2MCwgMHgyMWU4LCAweGE5NWMsIDB4OTE4OCwKKwkweDAwMTksIDB4MjFhMCwgMHg5MDBlLCAweDIwYTksIDB4MDAyMCwgMHg0MTA0LCAweGFhNjYsIDB4YTg3YSwKKwkweDIwNzksIDB4MTgwMCwgMHg3OThjLCAweDgxMGMsIDB4OTE4OCwgMHgwMDBjLCAweDkxODIsIDB4MDAxYSwKKwkweDAyMTAsIDB4MjAwOSwgMHgwMDFhLCAweDIxYTgsIDB4ODEwYiwgMHhhOTcyLCAweGFjNzYsIDB4MmU5OCwKKwkweGE4NWMsIDB4OTA4MCwgMHgwMDFmLCAweDIwYTAsIDB4MjAwMSwgMHgwMjA1LCAweDIwMGMsIDB4OTE4ZCwKKwkweDAwODAsIDB4MjEwMiwgMHg0MDAzLCAweDIwMDMsIDB4MDAwMCwgMHgwODBjLCAweDZhZTksIDB4MDA5ZSwKKwkweDAwZmUsIDB4MDBkZSwgMHgwMDA1LCAweDAwMTYsIDB4MDBkNiwgMHgwMGY2LCAweDAwOTYsIDB4MDAxNiwKKwkweDIwMDEsIDB4MDIwNSwgMHgyMDBjLCAweDkxOGQsIDB4MDA4MCwgMHgyMTAyLCAweDAwMWUsIDB4MjA3OSwKKwkweDAyMDAsIDB4MmU5OCwgMHhhODdjLCAweGQwZWMsIDB4MDExOCwgMHg5ZTgwLCAweDAwMGMsIDB4MjA5OCwKKwkweDIwMjEsIDB4MDAzZSwgMHg5MDFlLCAweDkyODIsIDB4MDAyMCwgMHgwMjE4LCAweDIwMTEsIDB4MDAyMCwKKwkweDIwMTgsIDB4OTQ4NiwgMHgwMDNlLCAweDExNzAsIDB4MDA5NiwgMHgwODBjLCAweDEwMzEsIDB4MjkwMCwKKwkweDAwOWUsIDB4MDVjMCwgMHhhODA2LCAweDIwNDgsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMDIsIDB4MjBhMCwgMHgzMzAwLCAweDkwOGUsIDB4MDI2MCwgMHgwMTQwLCAweDIwMDksIDB4MDI4MCwKKwkweDkxMDIsIDB4OTIwYSwgMHgwMjE4LCAweDIwMTAsIDB4MjEwMCwgMHg5MzE4LCAweDIyMDAsIDB4OTQwMiwKKwkweDEyMjgsIDB4MjQwMCwgMHg5MjAyLCAweDI0MTAsIDB4OTMxOCwgMHg5MDA2LCAweDIwMjAsIDB4MjJhOCwKKwkweGE4MDAsIDB4OTIwMCwgMHhhODAyLCAweDIwZTEsIDB4MDAwMCwgMHg0MDAzLCAweDgzZmYsIDB4MDE4MCwKKwkweDMzMDAsIDB4OTA4NiwgMHgwMjgwLCAweDExMzAsIDB4NzgxNCwgMHg4MDAwLCAweDkwODUsIDB4MDA4MCwKKwkweDc4MTYsIDB4MmU5OCwgMHgyMzEwLCAweDg0ZmYsIDB4MDkwNCwgMHhhNDUwLCAweDA4MDQsIDB4YTQ1MiwKKwkweDkwODUsIDB4MDAwMSwgMHg3ODE3LCAweDAwMDAsIDB4MDA5ZSwgMHgwMGZlLCAweDAwZGUsIDB4MDAxZSwKKwkweDAwMDUsIDB4MDBkNiwgMHgwMDM2LCAweDAwOTYsIDB4NjMxNCwgMHgyMzQ4LCAweGE4N2EsIDB4YTk4MiwKKwkweDA4MGMsIDB4NmFkYywgMHgwMDllLCAweDAwM2UsIDB4MDBkZSwgMHgwMDA1LCAweDkxYjYsIDB4MDAxNSwKKwkweDExMTgsIDB4MDgwYywgMHhhMGUzLCAweDAwMzAsIDB4OTFiNiwgMHgwMDE2LCAweDE5MGMsIDB4MGRmYSwKKwkweDA4MGMsIDB4YTBlMywgMHgwMDA1LCAweDIwYTksIDB4MDAwZSwgMHgyMGUxLCAweDAwMDAsIDB4MmU5OCwKKwkweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDIwYTAsIDB4MDA5ZSwKKwkweDQwMDMsIDB4MDEzNiwgMHg5MDgwLCAweDAwMWIsIDB4MjBhMCwgMHgyMDExLCAweDAwMDYsIDB4MjBhOSwKKwkweDAwMDEsIDB4MzQxOCwgMHg4MzE4LCAweDIzYTAsIDB4NDAwMywgMHgzMzE4LCAweDgzMTgsIDB4MjM5OCwKKwkweDgyMTEsIDB4MWRiOCwgMHgyMDExLCAweDAwMDYsIDB4MDEzZSwgMHgyMGEwLCAweDMzMTgsIDB4ODMxOCwKKwkweDIzOTgsIDB4NDAwMywgMHgzNDE4LCAweDgzMTgsIDB4MjNhMCwgMHg4MjExLCAweDFkYjgsIDB4MDA5NiwKKwkweDA4MGMsIDB4YmUzNywgMHgwMTMwLCAweDYwMTQsIDB4MjA0OCwgMHhhODA3LCAweDAwMDAsIDB4YTg2NywKKwkweDAxMDMsIDB4MDA5ZSwgMHgwODA0LCAweGEwZTMsIDB4MDA5NiwgMHgwMGQ2LCAweDAwMzYsIDB4NzMzMCwKKwkweDkzODYsIDB4MDIwMCwgMHgxMWE4LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4YmYsIDB4MDAwMCwKKwkweDAwYmUsIDB4NjAxNCwgMHg5MDA1LCAweDAxMzAsIDB4MjA0OCwgMHhhODA3LCAweDAwMDAsIDB4YTg2NywKKwkweDAxMDMsIDB4YWIzMiwgMHgwODBjLCAweGEwZTMsIDB4MDAzZSwgMHgwMGRlLCAweDAwOWUsIDB4MDAwNSwKKwkweDAwMTEsIDB4MWQ0OCwgMHgwY2M4LCAweDAwMDYsIDB4MDAxNiwgMHgwODBjLCAweGM1MzksIDB4MDE4OCwKKwkweDYwMTQsIDB4OTAwNSwgMHgxMTcwLCAweDYwMGIsIDB4MDAwMywgMHg2MDFiLCAweDAwMDAsIDB4NjA0MywKKwkweDAwMDAsIDB4MjAwOSwgMHgwMDIyLCAweDA4MGMsIDB4YThkMCwgMHg5MDA2LCAweDAwMWUsIDB4MDAwZSwKKwkweDAwMDUsIDB4OTA4NSwgMHgwMDAxLCAweDBjZDAsIDB4MDA5NiwgMHgwMDE2LCAweDIwYTksIDB4MDAxNCwKKwkweDllODAsIDB4MDAwYywgMHgyMGUxLCAweDAwMDAsIDB4MjA5OCwgMHg2MDE0LCAweDIwNDgsIDB4YTg2MCwKKwkweDIwZTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMDIsIDB4MjBhMCwgMHg0MDAzLCAweDIwMDEsIDB4MDIwNSwKKwkweDIwMDMsIDB4MDAwMSwgMHgyMDk5LCAweDAyNjAsIDB4MjBhOSwgMHgwMDE2LCAweDQwMDMsIDB4MjBhOSwKKwkweDAwMGEsIDB4YTgwNCwgMHgyMDQ4LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDkwODAsIDB4MDAwMiwKKwkweDIwYTAsIDB4NDAwMywgMHgyMDAxLCAweDAyMDUsIDB4MjAwMywgMHgwMDAyLCAweDIwOTksIDB4MDI2MCwKKwkweDIwYTksIDB4MDAyMCwgMHg0MDAzLCAweDIwMDMsIDB4MDAwMCwgMHg2MDE0LCAweDIwNDgsIDB4YTgwMCwKKwkweDIwNDgsIDB4YTg2NywgMHgwMTAzLCAweDA4MGMsIDB4YTBlMywgMHgwMDFlLCAweDAwOWUsIDB4MDAwNSwKKwkweDAwOTYsIDB4MDAxNiwgMHg5MDBlLCAweDcwMzAsIDB4OTA4NiwgMHgwMTAwLCAweDAxNDAsIDB4NzAzOCwKKwkweDkwODQsIDB4MDBmZiwgMHg4MDBjLCAweDcwM2MsIDB4OTA4NCwgMHgwMGZmLCAweDgwMDQsIDB4OTA4MCwKKwkweDAwMDQsIDB4OTEwOCwgMHg4MTBiLCAweDIwMTEsIDB4MDAwMiwgMHgyMDE5LCAweDAwMGMsIDB4NjAxNCwKKwkweDIwNDgsIDB4MDgwYywgMHhiOWU4LCAweDA4MGMsIDB4YmUzNywgMHgwMTQwLCAweDYwMTQsIDB4MjA0OCwKKwkweGE4MDcsIDB4MDAwMCwgMHhhODY0LCAweGE4ZTIsIDB4YTg2NywgMHgwMTAzLCAweDA4MGMsIDB4YTBlMywKKwkweDAwMWUsIDB4MDA5ZSwgMHgwMDA1LCAweDAwMTYsIDB4MDA5NiwgMHg3MDMwLCAweDkwODYsIDB4MDEwMCwKKwkweDExMTgsIDB4MjAwOSwgMHgwMDA0LCAweDAwMTAsIDB4NzAzNCwgMHg4MDBjLCAweDgxMGIsIDB4MjAxMSwKKwkweDAwMGMsIDB4MjAxOSwgMHgwMDBjLCAweDYwMTQsIDB4MjA0OCwgMHhhODA0LCAweDAwOTYsIDB4OTAwNSwKKwkweDAxMDgsIDB4MjA0OCwgMHgwODBjLCAweGI5ZTgsIDB4MDA5ZSwgMHgwODBjLCAweGJlMzcsIDB4MDE0OCwKKwkweGE4MDQsIDB4OTAwNSwgMHgxMTU4LCAweGE4MDcsIDB4MDAwMCwgMHhhODY0LCAweGE4ZTIsIDB4YTg2NywKKwkweDAxMDMsIDB4MDgwYywgMHhhMGUzLCAweDAwOWUsIDB4MDAxZSwgMHgwMDA1LCAweDAwODYsIDB4MjA0MCwKKwkweGEwMzAsIDB4ODAwNywgMHg5MDg2LCAweDAxMDAsIDB4MTExOCwgMHgwODBjLCAweGFhODEsIDB4MDBlMCwKKwkweGEwMzQsIDB4ODAwNywgMHg4MDBjLCAweDg4MDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwKKwkweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMGMsIDB4YTg3YiwgMHgwMDAwLCAweGE4ODMsIDB4MDAwMCwKKwkweGE4OTcsIDB4NDAwMCwgMHhhYWEwLCAweGFiOWMsIDB4YWNhOCwgMHhhZGE0LCAweDIwMzEsIDB4MDAwMCwKKwkweDIwNDEsIDB4MTI4OCwgMHgwMDE5LCAweDBkMDgsIDB4MDA4ZSwgMHgwODk4LCAweDAwOTYsIDB4MDAwNiwKKwkweDA4MGMsIDB4MTAzMSwgMHgwMDBlLCAweDAxYjAsIDB4YThhYiwgMHgwZGNiLCAweGE4NzYsIDB4MDAwZSwKKwkweGE4YTIsIDB4MDAwNiwgMHhhZTZhLCAweDI4MDAsIDB4YTg5ZSwgMHhhOTdhLCAweGFmNzIsIDB4YWE4ZSwKKwkweGFiOTIsIDB4YWM5NiwgMHhhZDlhLCAweDAwODYsIDB4Mjk0MCwgMHgwODBjLCAweDExMmUsIDB4MDA4ZSwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDllLCAweDAwMDUsIDB4MDBlNiwgMHgwMGQ2LCAweDAwMjYsIDB4NzAwOCwKKwkweDkwODQsIDB4MDBmZiwgMHg2MjEwLCAweDAwYjYsIDB4MjI1OCwgMHhiYTEwLCAweDAwYmUsIDB4OTIwNiwKKwkweDE1MjAsIDB4NzAwYywgMHg2MjEwLCAweDAwYjYsIDB4MjI1OCwgMHhiYTE0LCAweDAwYmUsIDB4OTIwNiwKKwkweDExZTAsIDB4NjA0MywgMHgwMDAwLCAweDJjNjgsIDB4MDAxNiwgMHgyMDA5LCAweDAwMzUsIDB4MDgwYywKKwkweGM0YjEsIDB4MDAxZSwgMHgxMTU4LCAweDYyMmMsIDB4MjI2OCwgMHgyMDcxLCAweDAyNmMsIDB4NmIyMCwKKwkweDkzODYsIDB4MDAwMywgMHgwMTMwLCAweDkzODYsIDB4MDAwNiwgMHgwMTI4LCAweDA4MGMsIDB4YTBlMywKKwkweDAwMjAsIDB4MDAzOSwgMHgwMDEwLCAweDA4MGMsIDB4YTcwNSwgMHgwMDJlLCAweDAwZGUsIDB4MDBlZSwKKwkweDAwMDUsIDB4MDA5NiwgMHg2ODE0LCAweDIwNDgsIDB4OTE4NiwgMHgwMDE1LCAweDA5MDQsIDB4YTZlZCwKKwkweDkxOGUsIDB4MDAxNiwgMHgxOTA0LCAweGE3MDMsIDB4NzAwYywgMHg5MDhjLCAweGZmMDAsIDB4OTE4NiwKKwkweDE3MDAsIDB4MDEyMCwgMHg5MTg2LCAweDAzMDAsIDB4MTkwNCwgMHhhNmM3LCAweDg5ZmYsIDB4MTEzOCwKKwkweDY4MDAsIDB4OTA4NiwgMHgwMDBmLCAweDA5MDQsIDB4YTZhYSwgMHgwODA0LCAweGE3MDEsIDB4NjgwOCwKKwkweDkwODYsIDB4ZmZmZiwgMHgxOTA0LCAweGE2ZWYsIDB4YTg3YywgMHg5MDg0LCAweDAwNjAsIDB4OTA4NiwKKwkweDAwMjAsIDB4MTEyOCwgMHhhODNjLCAweGE5NDAsIDB4OTEwNSwgMHgxOTA0LCAweGE2ZWYsIDB4NjgyNCwKKwkweGQwODQsIDB4MTkwNCwgMHhhNmVmLCAweGQwYjQsIDB4MDE1OCwgMHgwMDE2LCAweDIwMDEsIDB4MTk1ZSwKKwkweDIwMGMsIDB4NjAxOCwgMHg5MTAyLCAweDkwODIsIDB4MDAwNSwgMHgwMDFlLCAweDFhMDQsIDB4YTZlZiwKKwkweDA4MGMsIDB4YzAyMiwgMHg2ODVjLCAweGE4ODIsIDB4YTg3YywgMHhjMGRjLCAweGMwZjQsIDB4YzBkNCwKKwkweGE4N2UsIDB4MDAyNiwgMHg5MDBlLCAweDZhMTgsIDB4MjAwMSwgMHgwMDBhLCAweDA4MGMsIDB4ODRmZiwKKwkweGE4ODQsIDB4OTIwYSwgMHgwMjA4LCAweDgwMTEsIDB4YWE4NiwgMHg4MmZmLCAweDAwMmUsIDB4MTEzOCwKKwkweDAwYzYsIDB4MmQ2MCwgMHgwODBjLCAweGJiNGEsIDB4MDBjZSwgMHgwODA0LCAweGE3MDEsIDB4MDBjNiwKKwkweGE4NjgsIDB4ZDBmYywgMHgxMTE4LCAweDA4MGMsIDB4NWZhNywgMHgwMDEwLCAweDA4MGMsIDB4NjM1NSwKKwkweDAwY2UsIDB4MTkwNCwgMHhhNmVmLCAweDAwYzYsIDB4MmQ2MCwgMHgwODBjLCAweGEwZTMsIDB4MDBjZSwKKwkweDA4MDQsIDB4YTcwMSwgMHgwMGM2LCAweDA4MGMsIDB4YTEzMCwgMHgwMTk4LCAweDYwMTcsIDB4MDAwMCwKKwkweDY4MTAsIDB4NjAxMiwgMHgwODBjLCAweGMyYjMsIDB4NjAyMywgMHgwMDAzLCAweDY5MDQsIDB4MDBjNiwKKwkweDJkNjAsIDB4MDgwYywgMHhhMGUzLCAweDAwY2UsIDB4MDgwYywgMHhhMTVkLCAweDAwY2UsIDB4MDgwNCwKKwkweGE3MDEsIDB4MjAwMSwgMHgxOTYwLCAweDIwMDQsIDB4Njg0MiwgMHgwMGNlLCAweDA0ZDAsIDB4NzAwOCwKKwkweDkwODYsIDB4MDAwYiwgMHgxMWM4LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI5MDAsIDB4YzFiYywKKwkweGI5MDIsIDB4MDBiZSwgMHgwMGM2LCAweDJkNjAsIDB4YTg3YiwgMHgwMDAzLCAweDA4MGMsIDB4YzRmMywKKwkweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAyMywgMHgwMDAyLCAweDA4MGMsIDB4ODY3OSwKKwkweDA4MGMsIDB4OGMxMCwgMHgwMGNlLCAweDAwZTgsIDB4NzAwYywgMHg5MDg2LCAweDJhMDAsIDB4MTEzOCwKKwkweDIwMDEsIDB4MTk2MCwgMHgyMDA0LCAweDY4NDIsIDB4MDBhMCwgMHgwNDc5LCAweDAwYTAsIDB4ODlmZiwKKwkweDA5MGMsIDB4MGRmYSwgMHgwMGM2LCAweDAwZDYsIDB4MmQ2MCwgMHhhODY3LCAweDAxMDMsIDB4YTg3YiwKKwkweDAwMDMsIDB4MDgwYywgMHg2OTA0LCAweDA4MGMsIDB4YzAyMiwgMHgwODBjLCAweGExMTMsIDB4MDBkZSwKKwkweDAwY2UsIDB4MDgwYywgMHhhMGUzLCAweDAwOWUsIDB4MDAwNSwgMHg5MTg2LCAweDAwMTUsIDB4MTEyOCwKKwkweDIwMDEsIDB4MTk2MCwgMHgyMDA0LCAweDY4NDIsIDB4MDA2OCwgMHg5MThlLCAweDAwMTYsIDB4MTE2MCwKKwkweDAwYzYsIDB4MmQwMCwgMHgyMDYwLCAweDA4MGMsIDB4ZGFlMiwgMHgwODBjLCAweDg0YTYsIDB4MDgwYywKKwkweGEwZTMsIDB4MDBjZSwgMHgwODBjLCAweGEwZTMsIDB4MDAwNSwgMHgwMDI2LCAweDAwMzYsIDB4MDA0NiwKKwkweDcyMjgsIDB4YWNiMCwgMHhhYmFjLCAweGQyZjQsIDB4MDEzMCwgMHgyMDAxLCAweDE5NjAsIDB4MjAwNCwKKwkweDY4NDIsIDB4MDgwNCwgMHhhNzdmLCAweDAwYzYsIDB4MmQ2MCwgMHgwODBjLCAweGJhNDksIDB4MDBjZSwKKwkweDY4MDQsIDB4OTA4NiwgMHgwMDUwLCAweDExNjgsIDB4MDBjNiwgMHgyZDAwLCAweDIwNjAsIDB4NjAwMywKKwkweDAwMDEsIDB4NjAwNywgMHgwMDUwLCAweDA4MGMsIDB4ODY3OSwgMHgwODBjLCAweDhjMTAsIDB4MDBjZSwKKwkweDA0ZjAsIDB4NjgwMCwgMHg5MDg2LCAweDAwMGYsIDB4MDFhOCwgMHg4OWZmLCAweDA5MGMsIDB4MGRmYSwKKwkweDY4MDAsIDB4OTA4NiwgMHgwMDA0LCAweDExOTAsIDB4YTg3YywgMHhkMGFjLCAweDAxNzgsIDB4YTg0MywKKwkweDBmZmYsIDB4YTgzZiwgMHgwZmZmLCAweGE4ODAsIDB4YzBmYywgMHhhODgyLCAweDIwMDEsIDB4MDAwMSwKKwkweDY4MzIsIDB4MDQwMCwgMHgyMDAxLCAweDAwMDcsIDB4NjgzMiwgMHgwMGUwLCAweGE4N2MsIDB4ZDBiNCwKKwkweDExNTAsIDB4ZDBhYywgMHgwZGI4LCAweDY4MjQsIDB4ZDBmNCwgMHgxZDQ4LCAweGE4MzgsIDB4YTkzNCwKKwkweDkxMDUsIDB4MGQ4MCwgMHgwYzIwLCAweGQyZWMsIDB4MWQ2OCwgMHg3MDI0LCAweDkzMDYsIDB4MTExOCwKKwkweDcwMjAsIDB4OTQwNiwgMHgwZDM4LCAweDcwMjAsIDB4NjgzZSwgMHg3MDI0LCAweDY4M2EsIDB4MjAwMSwKKwkweDAwMDUsIDB4NjgzMiwgMHgwODBjLCAweGMxYWEsIDB4MDgwYywgMHg4YzEwLCAweDAwMTAsIDB4MDgwYywKKwkweGEwZTMsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAwNSwgMHgwMGU2LCAweDAwZDYsIDB4MDAyNiwKKwkweDcwMDgsIDB4OTA4NCwgMHgwMGZmLCAweDYyMTAsIDB4MDBiNiwgMHgyMjU4LCAweGJhMTAsIDB4MDBiZSwKKwkweDkyMDYsIDB4MTkwNCwgMHhhN2VhLCAweDcwMGMsIDB4NjIxMCwgMHgwMGI2LCAweDIyNTgsIDB4YmExNCwKKwkweDAwYmUsIDB4OTIwNiwgMHgxOTA0LCAweGE3ZWEsIDB4NjAzOCwgMHgyMDY4LCAweDY4MjQsIDB4YzBkYywKKwkweDY4MjYsIDB4NmEyMCwgMHg5Mjg2LCAweDAwMDcsIDB4MDkwNCwgMHhhN2VhLCAweDkyODYsIDB4MDAwMiwKKwkweDA5MDQsIDB4YTdlYSwgMHg5Mjg2LCAweDAwMDAsIDB4MDVlOCwgMHg2ODA4LCAweDYzM2MsIDB4OTMwNiwKKwkweDE1YzgsIDB4MjA3MSwgMHgwMjZjLCAweDkxODYsIDB4MDAxNSwgMHgwNTcwLCAweDkxOGUsIDB4MDAxNiwKKwkweDExMDAsIDB4MDBjNiwgMHg2MDM4LCAweDIwNjAsIDB4NjEwNCwgMHg5MTg2LCAweDAwNGIsIDB4MDFjMCwKKwkweDkxODYsIDB4MDA0YywgMHgwMWE4LCAweDkxODYsIDB4MDA0ZCwgMHgwMTkwLCAweDkxODYsIDB4MDA0ZSwKKwkweDAxNzgsIDB4OTE4NiwgMHgwMDUyLCAweDAxNjAsIDB4NjAxNCwgMHgwMDk2LCAweDIwNDgsIDB4MDgwYywKKwkweGJlMzcsIDB4MDkwYywgMHgwZGZhLCAweGE4N2IsIDB4MDAwMywgMHgwMDllLCAweDA4MGMsIDB4YzRmMywKKwkweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAyMywgMHgwMDAyLCAweDA4MGMsIDB4ODY3OSwKKwkweDA4MGMsIDB4OGMxMCwgMHgwMGNlLCAweDAwMzAsIDB4NjAzOCwgMHgyMDcwLCAweDIwMDEsIDB4MTk2MCwKKwkweDIwMDQsIDB4NzA0MiwgMHgwODBjLCAweGEwZTMsIDB4MDAyZSwgMHgwMGRlLCAweDAwZWUsIDB4MDAwNSwKKwkweDAwYjYsIDB4MDA5NiwgMHgwMGY2LCAweDYwMTQsIDB4MjA0OCwgMHg2MDEwLCAweDIwNTgsIDB4OTFiNiwKKwkweDAwMTUsIDB4MDEzMCwgMHhiYTA4LCAweGJiMGMsIDB4YmMwMCwgMHhjNDhjLCAweGJjMDIsIDB4MDQ2MCwKKwkweDAwOTYsIDB4MDE1NiwgMHgwMDM2LCAweDAwMjYsIDB4MmI0OCwgMHg5ZTkwLCAweDAwMTAsIDB4MjAxOSwKKwkweDAwMGEsIDB4MjBhOSwgMHgwMDA0LCAweDA4MGMsIDB4YjBkMCwgMHgwMDJlLCAweDAwM2UsIDB4MDE1ZSwKKwkweDAwOWUsIDB4MTkwNCwgMHhhODU5LCAweDAwOTYsIDB4MDE1NiwgMHgwMDM2LCAweDAwMjYsIDB4MmI0OCwKKwkweDllOTAsIDB4MDAxNCwgMHgyMDE5LCAweDAwMDYsIDB4MjBhOSwgMHgwMDA0LCAweDA4MGMsIDB4YjBkMCwKKwkweDAwMmUsIDB4MDAzZSwgMHgwMTVlLCAweDAwOWUsIDB4MTVhMCwgMHg3MjM4LCAweGJhMGEsIDB4NzMzYywKKwkweGJiMGUsIDB4YmMwMCwgMHhjNDhkLCAweGJjMDIsIDB4YTgwNCwgMHg5MDA1LCAweDExMjgsIDB4MDBmZSwKKwkweDAwOWUsIDB4MDBiZSwgMHgwODA0LCAweGE0ZTcsIDB4MDA5NiwgMHgyMDQ4LCAweGFhMTIsIDB4YWIxNiwKKwkweGFjMGEsIDB4MDA5ZSwgMHg4MDA2LCAweDgwMDYsIDB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwKKwkweGZmYzAsIDB4OTA4MCwgMHgwMDAyLCAweDIwMDksIDB4MDAyYiwgMHhhYWEwLCAweGFiOWMsIDB4YWNhOCwKKwkweGFkYTQsIDB4MjAzMSwgMHgwMDAwLCAweDIwNDEsIDB4MTI4OCwgMHgwODBjLCAweGE1ZTYsIDB4MDEzMCwKKwkweDAwZmUsIDB4MDA5ZSwgMHgwODBjLCAweGEwZTMsIDB4MDBiZSwgMHgwMDA1LCAweDA4MGMsIDB4YWE4MSwKKwkweDBjYjgsIDB4MmI3OCwgMHgwMGY2LCAweDA4MGMsIDB4MzE4YiwgMHgwODBjLCAweGM1NGUsIDB4MDBmZSwKKwkweDAwYzYsIDB4MDgwYywgMHhhMDhkLCAweDJmMDAsIDB4NjAxMiwgMHg2MDE3LCAweDAwMDAsIDB4NjAyMywKKwkweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywKKwkweDYzZjAsIDB4MDgwYywgMHg2NDFjLCAweDA4MGMsIDB4ODZjMSwgMHgwODBjLCAweDhjMTAsIDB4MDBjZSwKKwkweDA4MDQsIDB4YTgyYywgMHgyMTAwLCAweDkxYjIsIDB4MDA1MywgMHgxYTBjLCAweDBkZmEsIDB4OTFiMiwKKwkweDAwNDAsIDB4MWEwNCwgMHhhOGUyLCAweDAwMDIsIDB4YThkMCwgMHhhOGQwLCAweGE4YzYsIDB4YThkMCwKKwkweGE4ZDAsIDB4YThkMCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwKKwkweGE4YzQsIDB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwKKwkweGE4YzQsIDB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwKKwkweGE4YzQsIDB4YThjNCwgMHhhOGM0LCAweGE4ZDAsIDB4YThjNCwgMHhhOGQwLCAweGE4ZDAsIDB4YThjNCwKKwkweGE4YzQsIDB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNiwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwKKwkweGE4YzQsIDB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwgMHhhOGM0LCAweGE4ZDAsIDB4YThkMCwKKwkweGE4YzQsIDB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwKKwkweGE4YzQsIDB4YThkMCwgMHhhOGM0LCAweGE4YzQsIDB4MDgwYywgMHgwZGZhLCAweDAwNjYsIDB4MDBiNiwKKwkweDY2MTAsIDB4MjY1OCwgMHhiOGJjLCAweGMwOGMsIDB4YjhiZSwgMHgwMGJlLCAweDAwNmUsIDB4MDAwMCwKKwkweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDkxODYsIDB4MDAzMiwgMHgwMTE4LCAweDA4MGMsIDB4ODZjMSwKKwkweDAwMTAsIDB4MDgwYywgMHg4Njc5LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4OGMxMCwKKwkweDAxMmUsIDB4MDAwNSwgMHgyNjAwLCAweDAwMDIsIDB4YThmNiwgMHhhOGY2LCAweGE4ZjYsIDB4YThkMCwKKwkweGE4ZDAsIDB4YThmNiwgMHhhOGY2LCAweGE4ZjYsIDB4YThmNiwgMHhhOGQwLCAweGE4ZjYsIDB4YThkMCwKKwkweGE4ZjYsIDB4YThkMCwgMHhhOGY2LCAweGE4ZjYsIDB4YThmNiwgMHhhOGY2LCAweDA4MGMsIDB4MGRmYSwKKwkweDYwMDQsIDB4OTBiMiwgMHgwMDUzLCAweDFhMGMsIDB4MGRmYSwgMHg5MWI2LCAweDAwMTMsIDB4MDkwNCwKKwkweGE5YmEsIDB4OTFiNiwgMHgwMDI3LCAweDE5MDQsIDB4YTk3NSwgMHgwODBjLCAweDhiMDQsIDB4NjAwNCwKKwkweDA4MGMsIDB4YzAyZSwgMHgwMWIwLCAweDA4MGMsIDB4YzAzZiwgMHgwMWE4LCAweDkwOGUsIDB4MDAyMSwKKwkweDA5MDQsIDB4YTk3MiwgMHg5MDhlLCAweDAwMjIsIDB4MTEzMCwgMHgwODBjLCAweGE1MTMsIDB4MDkwNCwKKwkweGE5NmUsIDB4MDgwNCwgMHhhOTZmLCAweDkwOGUsIDB4MDAzZCwgMHgwOTA0LCAweGE5NzIsIDB4MDgwNCwKKwkweGE5NjgsIDB4MDgwYywgMHgzMWI0LCAweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDYzZjAsIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiOWEwLCAweDAwYmUsIDB4MDgwYywgMHhhYTgxLCAweDkxODYsIDB4MDA3ZSwKKwkweDExNDgsIDB4MjAwMSwgMHgxODM2LCAweDIwMTQsIDB4YzI4NSwgMHgwODBjLCAweDcyMDcsIDB4MTEwOCwKKwkweGMyYWQsIDB4MjIwMiwgMHgwMDM2LCAweDAwMjYsIDB4MjAxOSwgMHgwMDI4LCAweDIxMTAsIDB4MDgwYywKKwkweGRiM2QsIDB4MDAyZSwgMHgwMDNlLCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDIxMTAsIDB4MjAxOSwKKwkweDAwMjgsIDB4MDgwYywgMHg4ODAzLCAweDAwNzYsIDB4OTAzZSwgMHgwODBjLCAweDg2ZjEsIDB4NjAxMCwKKwkweDAwYjYsIDB4OTA1ZCwgMHgwMTAwLCAweDAwYmUsIDB4MmMwOCwgMHgwODBjLCAweGQ1ZjYsIDB4MDA3ZSwKKwkweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDA4MGMsIDB4YzU0ZSwgMHgwMDE2LCAweDA4MGMsIDB4YzJhYiwKKwkweDA4MGMsIDB4YTBlMywgMHgwMDFlLCAweDA4MGMsIDB4MzI4NiwgMHgwODBjLCAweDhjMTAsIDB4MDAzMCwKKwkweDA4MGMsIDB4YzJhYiwgMHgwODBjLCAweGEwZTMsIDB4MDgwYywgMHg4YzEwLCAweDAwMDUsIDB4MDgwYywKKwkweGFhODEsIDB4MGNiMCwgMHgwODBjLCAweGFhYmQsIDB4MGM5OCwgMHg5MTg2LCAweDAwMTQsIDB4MWRiMCwKKwkweDA4MGMsIDB4OGIwNCwgMHg2MDA0LCAweDkwOGUsIDB4MDAyMiwgMHgxMTE4LCAweDA4MGMsIDB4YTUxMywKKwkweDBkNjgsIDB4MDgwYywgMHgzMThiLCAweDA4MGMsIDB4YzU0ZSwgMHgwODBjLCAweGMwMmUsIDB4MTE5MCwKKwkweDA4MGMsIDB4MzFiNCwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiOWEwLCAweDAwYmUsIDB4MDgwYywKKwkweGFhODEsIDB4OTE4NiwgMHgwMDdlLCAweDExMjgsIDB4MjAwMSwgMHgxODM2LCAweDIwMGMsIDB4YzE4NSwKKwkweDIxMDIsIDB4MDg3MCwgMHgwODBjLCAweGMwM2YsIDB4MTExOCwgMHgwODBjLCAweGFhODEsIDB4MDg0MCwKKwkweDYwMDQsIDB4OTA4ZSwgMHgwMDMyLCAweDExNjAsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzEsIDB4MTg5YywKKwkweDIwNzksIDB4MDAwMCwgMHgwODBjLCAweDM1MWEsIDB4MDBmZSwgMHgwMGVlLCAweDA4MDQsIDB4YTk2OCwKKwkweDYwMDQsIDB4OTA4ZSwgMHgwMDIxLCAweDBkNDgsIDB4OTA4ZSwgMHgwMDIyLCAweDA5MGMsIDB4YWE4MSwKKwkweDA4MDQsIDB4YTk2OCwgMHg5MGIyLCAweDAwNDAsIDB4MWEwNCwgMHhhYTZhLCAweDIwMDgsIDB4MDAwMiwKKwkweGFhMDIsIDB4YWEwMywgMHhhYTA2LCAweGFhMDksIDB4YWEwYywgMHhhYTBmLCAweGFhMDAsIDB4YWEwMCwKKwkweGFhMDAsIDB4YWEwMCwgMHhhYTAwLCAweGFhMDAsIDB4YWEwMCwgMHhhYTAwLCAweGFhMDAsIDB4YWEwMCwKKwkweGFhMDAsIDB4YWEwMCwgMHhhYTAwLCAweGFhMDAsIDB4YWEwMCwgMHhhYTAwLCAweGFhMDAsIDB4YWEwMCwKKwkweGFhMDAsIDB4YWEwMCwgMHhhYTAwLCAweGFhMDAsIDB4YWEwMCwgMHhhYTAwLCAweGFhMTIsIDB4YWExZiwKKwkweGFhMDAsIDB4YWEyMSwgMHhhYTFmLCAweGFhMDAsIDB4YWEwMCwgMHhhYTAwLCAweGFhMDAsIDB4YWEwMCwKKwkweGFhMWYsIDB4YWExZiwgMHhhYTAwLCAweGFhMDAsIDB4YWEwMCwgMHhhYTAwLCAweGFhMDAsIDB4YWEwMCwKKwkweGFhMDAsIDB4YWEwMCwgMHhhYTUxLCAweGFhMWYsIDB4YWEwMCwgMHhhYTFiLCAweGFhMDAsIDB4YWEwMCwKKwkweGFhMDAsIDB4YWExYywgMHhhYTAwLCAweGFhMDAsIDB4YWEwMCwgMHhhYTFmLCAweGFhNDgsIDB4YWEwMCwKKwkweDA4MGMsIDB4MGRmYSwgMHgwMGUwLCAweDIwMDEsIDB4MDAwYiwgMHgwNDIwLCAweDIwMDEsIDB4MDAwMywKKwkweDA0MDgsIDB4MjAwMSwgMHgwMDA1LCAweDAwZjAsIDB4MjAwMSwgMHgwMDAxLCAweDAwZDgsIDB4MjAwMSwKKwkweDAwMDksIDB4MDBjMCwgMHgwODBjLCAweDhiMDQsIDB4NjAwMywgMHgwMDA1LCAweDA4MGMsIDB4YzU1MSwKKwkweDA4MGMsIDB4OGMxMCwgMHgwMDcwLCAweDAwMTgsIDB4MDAxMCwgMHgwODBjLCAweDYzZjAsIDB4MDgwNCwKKwkweGFhNjIsIDB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4YzU1MSwgMHg2MDAzLCAweDAwMDQsIDB4MDgwYywKKwkweDhjMTAsIDB4MDAwNSwgMHgwODBjLCAweDYzZjAsIDB4MDgwYywgMHg4YjA0LCAweDYwMDMsIDB4MDAwMiwKKwkweDAwMzYsIDB4MjAxOSwgMHgxODY2LCAweDIzMDQsIDB4OTA4NCwgMHhmZjAwLCAweDExMjAsIDB4MjAwMSwKKwkweDE5NWUsIDB4MjAxYywgMHgwMDQwLCAweDgwMDcsIDB4OTA5YSwgMHgwMDA0LCAweDBlYzAsIDB4ODAwMywKKwkweDgwMWIsIDB4ODMxYiwgMHg5MzE4LCAweDYzMWEsIDB4MDAzZSwgMHgwODBjLCAweDhjMTAsIDB4MGMwOCwKKwkweDA4MGMsIDB4OGIwNCwgMHgwODBjLCAweGMyYWIsIDB4MDgwYywgMHhhMGUzLCAweDA4MGMsIDB4OGMxMCwKKwkweDA4YzAsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzEsIDB4MTg5YywgMHgyMDc5LCAweDAwMDAsIDB4MDgwYywKKwkweDM1MWEsIDB4MDBmZSwgMHgwMGVlLCAweDA4MGMsIDB4OGIwNCwgMHgwODBjLCAweGEwZTMsIDB4MDgwYywKKwkweDhjMTAsIDB4MDgzOCwgMHgwODBjLCAweDhiMDQsIDB4NjAwMywgMHgwMDAyLCAweDA4MGMsIDB4YzU1MSwKKwkweDA4MDQsIDB4OGMxMCwgMHgyNjAwLCAweDIwMDgsIDB4MDAwMiwgMHhhYTdmLCAweGFhN2YsIDB4YWE3ZiwKKwkweGFhNjIsIDB4YWE2MiwgMHhhYTdmLCAweGFhN2YsIDB4YWE3ZiwgMHhhYTdmLCAweGFhNjIsIDB4YWE3ZiwKKwkweGFhNjIsIDB4YWE3ZiwgMHhhYTYyLCAweGFhN2YsIDB4YWE3ZiwgMHhhYTdmLCAweGFhN2YsIDB4MDgwYywKKwkweDBkZmEsIDB4MDBlNiwgMHgwMDk2LCAweDAwMjYsIDB4MDAxNiwgMHgwODBjLCAweGJlMzcsIDB4MDU2OCwKKwkweDYwMTQsIDB4MjA0OCwgMHhhODY0LCAweDkwODYsIDB4MDEzOSwgMHgxMWE4LCAweGE4OTQsIDB4OTA4NiwKKwkweDAwNTYsIDB4MTE0OCwgMHgwODBjLCAweDUzNzUsIDB4MDEzMCwgMHgyMDAxLCAweDAwMDAsIDB4OTAwZSwKKwkweDIwMTEsIDB4NDAwMCwgMHgwMDI4LCAweDIwMDEsIDB4MDAzMCwgMHg5MDBlLCAweDIwMTEsIDB4NDAwNSwKKwkweDA4MGMsIDB4YzQxOCwgMHgwMDkwLCAweGE4NjgsIDB4ZDBmYywgMHgwMTc4LCAweGE4MDcsIDB4MDAwMCwKKwkweDAwMTYsIDB4NjAwNCwgMHg5MDhlLCAweDAwMjEsIDB4MDE2OCwgMHg5MDhlLCAweDAwM2QsIDB4MDE1MCwKKwkweDAwMWUsIDB4YTg2NywgMHgwMTAzLCAweGE4MzMsIDB4MDEwMCwgMHgwMDFlLCAweDAwMmUsIDB4MDA5ZSwKKwkweDAwZWUsIDB4MDAwNSwgMHgwMDFlLCAweDAwMDksIDB4MGNjMCwgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwKKwkweGE4MDAsIDB4MjA0OCwgMHhhODY3LCAweDAxMDMsIDB4YTgyMywgMHg4MDAxLCAweDAwOWUsIDB4MDAwNSwKKwkweDAwYjYsIDB4NjYxMCwgMHgyNjU4LCAweGI4MDQsIDB4OTA4NCwgMHgwMGZmLCAweDkwYjIsIDB4MDAwYywKKwkweDFhMGMsIDB4MGRmYSwgMHg2NjA0LCAweDk2YjYsIDB4MDA0ZCwgMHgxMTIwLCAweDA4MGMsIDB4YzMzNywKKwkweDA4MDQsIDB4YWI0NSwgMHg2NjA0LCAweDk2YjYsIDB4MDA0MywgMHgxMTIwLCAweDA4MGMsIDB4YzM4MCwKKwkweDA4MDQsIDB4YWI0NSwgMHg2NjA0LCAweDk2YjYsIDB4MDA0YiwgMHgxMTIwLCAweDA4MGMsIDB4YzNhYywKKwkweDA4MDQsIDB4YWI0NSwgMHg2NjA0LCAweDk2YjYsIDB4MDAzMywgMHgxMTIwLCAweDA4MGMsIDB4YzJjZCwKKwkweDA4MDQsIDB4YWI0NSwgMHg2NjA0LCAweDk2YjYsIDB4MDAyOCwgMHgxMTIwLCAweDA4MGMsIDB4YzA3ZCwKKwkweDA4MDQsIDB4YWI0NSwgMHg2NjA0LCAweDk2YjYsIDB4MDAyOSwgMHgxMTIwLCAweDA4MGMsIDB4YzBiZSwKKwkweDA4MDQsIDB4YWI0NSwgMHg2NjA0LCAweDk2YjYsIDB4MDAxZiwgMHgxMTE4LCAweDA4MGMsIDB4YTRiYiwKKwkweDA0ZTAsIDB4NjYwNCwgMHg5NmI2LCAweDAwMDAsIDB4MTExOCwgMHgwODBjLCAweGE3ZjAsIDB4MDRhOCwKKwkweDY2MDQsIDB4OTZiNiwgMHgwMDIyLCAweDExMTgsIDB4MDgwYywgMHhhNGY0LCAweDA0NzAsIDB4NjYwNCwKKwkweDk2YjYsIDB4MDAzNSwgMHgxMTE4LCAweDA4MGMsIDB4YTYwNCwgMHgwNDM4LCAweDY2MDQsIDB4OTZiNiwKKwkweDAwMzksIDB4MTExOCwgMHgwODBjLCAweGE3ODUsIDB4MDQwMCwgMHg2NjA0LCAweDk2YjYsIDB4MDAzZCwKKwkweDExMTgsIDB4MDgwYywgMHhhNTJjLCAweDAwYzgsIDB4NjYwNCwgMHg5NmI2LCAweDAwNDQsIDB4MTExOCwKKwkweDA4MGMsIDB4YTU2OCwgMHgwMDkwLCAweDY2MDQsIDB4OTZiNiwgMHgwMDQ5LCAweDExMTgsIDB4MDgwYywKKwkweGE1OTMsIDB4MDA1OCwgMHg5MWI2LCAweDAwMTUsIDB4MTExMCwgMHgwMDYzLCAweDAwMzAsIDB4OTFiNiwKKwkweDAwMTYsIDB4MTEyOCwgMHgwMGJlLCAweDA4MDQsIDB4YWUwNSwgMHgwMGJlLCAweDAwMDUsIDB4MDgwYywKKwkweGExNzgsIDB4MGNkOCwgMHhhYjYyLCAweGFiNjUsIDB4YWI2MiwgMHhhYmE5LCAweGFiNjIsIDB4YWQzOSwKKwkweGFlMTIsIDB4YWI2MiwgMHhhYjYyLCAweGFkZGYsIDB4YWI2MiwgMHhhZGYzLCAweDAwOTYsIDB4MDgwYywKKwkweDE1ODIsIDB4NjAxNCwgMHgyMDQ4LCAweGE4MDAsIDB4MjA0OCwgMHhhODY3LCAweDAxMDMsIDB4MDA5ZSwKKwkweDA4MDQsIDB4YTBlMywgMHhhMDAxLCAweGEwMDEsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwKKwkweDcwOGMsIDB4OTA4NiwgMHgwMDc0LCAweDE1NDAsIDB4MDgwYywgMHhkNWM3LCAweDExYjAsIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHg3MDMwLCAweGQwOGMsIDB4MDEyOCwgMHhiODAwLCAweGQwYmMsIDB4MDExMCwKKwkweGMwYzUsIDB4YjgwMiwgMHgwMGU5LCAweDAwYmUsIDB4MjAwMSwgMHgwMDA2LCAweDA4MGMsIDB4NjNmMCwKKwkweDA4MGMsIDB4MzFiNCwgMHgwODBjLCAweGEwZTMsIDB4MDA4OCwgMHgyMDAxLCAweDAwMGEsIDB4MDgwYywKKwkweDYzZjAsIDB4MDgwYywgMHgzMWI0LCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDEsIDB4MDgwYywKKwkweDg2YzEsIDB4MDgwYywgMHg4YzEwLCAweDAwMTAsIDB4MDgwYywgMHhhZDI0LCAweDAwZWUsIDB4MDAwNSwKKwkweDAwZDYsIDB4YjgwMCwgMHhkMDg0LCAweDAxNTgsIDB4OTAwNiwgMHgwODBjLCAweDYzZGMsIDB4MjA2OSwKKwkweDE4NWIsIDB4NjgwNCwgMHgwMDIwLCAweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDY0MWMsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDBiNiwgMHgwMDk2LCAweDAwZDYsIDB4MjAxMSwgMHgxODIzLCAweDIyMDQsIDB4OTA4NiwKKwkweDAwNzQsIDB4MTkwNCwgMHhhY2ZiLCAweDYwMTAsIDB4MjA1OCwgMHhiYWEwLCAweDkyODYsIDB4MDA3ZSwKKwkweDExMjAsIDB4MDgwYywgMHhhZjU2LCAweDA4MDQsIDB4YWM2MCwgMHgwMGQ2LCAweDA4MGMsIDB4NzIwNywKKwkweDAxOTgsIDB4MDAyNiwgMHgyMDExLCAweDAwMTAsIDB4MDgwYywgMHg2N2U3LCAweDAwMmUsIDB4MDVjOCwKKwkweDA4MGMsIDB4NTVlZiwgMHgxNTQwLCAweDYwMTQsIDB4MjA0OCwgMHhhODA3LCAweDAwMDAsIDB4YTg2NywKKwkweDAxMDMsIDB4YTgzMywgMHhkZWFkLCAweDAwZjgsIDB4MDAyNiwgMHgyMDExLCAweDgwMDgsIDB4MDgwYywKKwkweDY3ZTcsIDB4MDAyZSwgMHgwNTMwLCAweDYwMTQsIDB4MjA0OCwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwKKwkweDkwODYsIDB4MDAzOSwgMHgxMTQwLCAweDIwMDEsIDB4MDAzMCwgMHg5MDBlLCAweDIwMTEsIDB4NDAwOSwKKwkweDA4MGMsIDB4YzQxOCwgMHgwMDQwLCAweDYwMTQsIDB4MjA0OCwgMHhhODA3LCAweDAwMDAsIDB4YTg2NywKKwkweDAxMDMsIDB4YTgzMywgMHhkZWFkLCAweDYwMTAsIDB4MjA1OCwgMHhiOWEwLCAweDAwMTYsIDB4MDgwYywKKwkweDMxYjQsIDB4MDgwYywgMHhhMGUzLCAweDAwMWUsIDB4MDgwYywgMHgzMjg2LCAweDAwZGUsIDB4MDgwNCwKKwkweGFjZmUsIDB4MDBkZSwgMHgwODBjLCAweGFmNGIsIDB4NjAxMCwgMHgyMDU4LCAweGJhYTAsIDB4OTI4NiwKKwkweDAwODAsIDB4MTUxMCwgMHg2MDE0LCAweDkwMDUsIDB4MDFhOCwgMHgyMDQ4LCAweGE4NjQsIDB4OTA4NCwKKwkweDAwZmYsIDB4OTA4NiwgMHgwMDM5LCAweDExNDAsIDB4MjAwMSwgMHgwMDAwLCAweDkwMGUsIDB4MjAxMSwKKwkweDQwMDAsIDB4MDgwYywgMHhjNDE4LCAweDAwMzAsIDB4YTgwNywgMHgwMDAwLCAweGE4NjcsIDB4MDEwMywKKwkweGE4MzMsIDB4MDIwMCwgMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg2M2YwLCAweDA4MGMsIDB4MzFiNCwKKwkweDA4MGMsIDB4YTBlMywgMHgwODA0LCAweGFjZmUsIDB4MDgwYywgMHhhZDBjLCAweDYwMTQsIDB4OTAwNSwKKwkweDAxOTAsIDB4MjA0OCwgMHhhODY4LCAweGQwZjQsIDB4MDFlOCwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwKKwkweDkwODYsIDB4MDAzOSwgMHgxZDA4LCAweDIwMDEsIDB4MDAwMCwgMHg5MDBlLCAweDIwMTEsIDB4NDAwMCwKKwkweDA4MGMsIDB4YzQxOCwgMHgwOGY4LCAweDA4MGMsIDB4YWQwMiwgMHgwMTYwLCAweDkwMDYsIDB4MDgwYywKKwkweDYzZGMsIDB4MjAwMSwgMHgwMDA0LCAweDA4MGMsIDB4NjQxYywgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywKKwkweDYzZjAsIDB4MDhhMCwgMHgyMDAxLCAweDAwMDQsIDB4MDgwYywgMHg2M2YwLCAweDYwMDMsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDAwMywgMHgwODBjLCAweDg2YzEsIDB4MDgwYywgMHg4YzEwLCAweDA4MDQsIDB4YWNmZSwKKwkweGI4NWMsIDB4ZDBlNCwgMHgwMWQwLCAweDA4MGMsIDB4YzI0ZCwgMHgwODBjLCAweDcyMDcsIDB4MDExOCwKKwkweGQwZGMsIDB4MTkwNCwgMHhhYzIyLCAweDIwMTEsIDB4MTgzNiwgMHgyMjA0LCAweGMwYWQsIDB4MjAxMiwKKwkweDIwMDEsIDB4MDAwMiwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHg3OGUzLCAweDAwMDAsIDB4MDgwYywKKwkweDI3ZTIsIDB4NzhlMiwgMHgwMGZlLCAweDA4MDQsIDB4YWMyMiwgMHgwODBjLCAweGMyOGEsIDB4MjAxMSwKKwkweDE4MzYsIDB4MjIwNCwgMHhjMGE1LCAweDIwMTIsIDB4MDAwNiwgMHgwODBjLCAweGQ3MjAsIDB4MDAwZSwKKwkweDE5MDQsIDB4YWMyMiwgMHhjMGI1LCAweDIwMTIsIDB4MjAwMSwgMHgwMDA2LCAweDA4MGMsIDB4NjNmMCwKKwkweDkwMDYsIDB4MDgwYywgMHg2M2RjLCAweDAwYzYsIDB4MjAwMSwgMHgxODBmLCAweDIwMDQsIDB4ZDA5YywKKwkweDA1MjAsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4MDBlNiwgMHgyMDcxLCAweDE4MDAsIDB4NzAwYywKKwkweDkwODQsIDB4MDBmZiwgMHg3OGU2LCAweDcwN2EsIDB4NzAxMCwgMHg3OGVhLCAweDcwN2UsIDB4OTA4YywKKwkweDAwZmYsIDB4MDBlZSwgMHg3ODBjLCAweGMwYjUsIDB4NzgwZSwgMHgwMGZlLCAweDA4MGMsIDB4MjdiNywKKwkweDAwZjYsIDB4MjEwMCwgMHg5MDBlLCAweDA4MGMsIDB4Mjc2ZSwgMHg3OTVhLCAweDAwZmUsIDB4OTE4NiwKKwkweDAwODEsIDB4MDFkOCwgMHgyMDA5LCAweDAwODEsIDB4MDBjOCwgMHgyMDA5LCAweDAwZWYsIDB4MDBmNiwKKwkweDIwNzksIDB4MDEwMCwgMHg3OWVhLCAweDc5MzIsIDB4NzkzNiwgMHg3ODBjLCAweGMwYjUsIDB4NzgwZSwKKwkweDAwZmUsIDB4MDgwYywgMHgyN2I3LCAweDAwZjYsIDB4MjA3OSwgMHgxODAwLCAweDc5N2UsIDB4MjEwMCwKKwkweDkwMGUsIDB4MDgwYywgMHgyNzZlLCAweDc5NWEsIDB4MDBmZSwgMHg4MTA4LCAweDA4MGMsIDB4NjQzZiwKKwkweDJiMDAsIDB4MDBjZSwgMHgxOTA0LCAweGFjMjIsIDB4NjAxMiwgMHgyMDA5LCAweDE4MGYsIDB4MjEwYywKKwkweGQxOWMsIDB4MDE1MCwgMHgyMDA5LCAweDAyN2MsIDB4MjEwYywgMHg5MThjLCAweDAwZmYsIDB4YjkxMiwKKwkweDIwMDksIDB4MDI3ZCwgMHgyMTBjLCAweGI5MTYsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NjNmMCwKKwkweDYwMjMsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAyLCAweDA4MGMsIDB4ODZjMSwKKwkweDA4MGMsIDB4OGMxMCwgMHgwMDE4LCAweDA4MGMsIDB4YWE4MSwgMHgwNDMxLCAweDAwZGUsIDB4MDA5ZSwKKwkweDAwYmUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MTAsIDB4MjAwNCwgMHhkMGE0LCAweDAxMjAsIDB4MjAwMSwKKwkweDE4NWMsIDB4MjAwNCwgMHhkMGFjLCAweDAwMDUsIDB4MDBlNiwgMHgwODBjLCAweGRiOTYsIDB4MDE5MCwKKwkweDIwNzEsIDB4MDI2MCwgMHg3MTA4LCAweDcyMGMsIDB4OTE4YywgMHgwMGZmLCAweDExMTgsIDB4OTI4NCwKKwkweGZmMDAsIDB4MDE0MCwgMHg2MDEwLCAweDIwNTgsIDB4YjhhMCwgMHg5MDg0LCAweGZmODAsIDB4MTExMCwKKwkweGI5MTIsIDB4YmExNiwgMHgwMGVlLCAweDAwMDUsIDB4MjAzMCwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywKKwkweDYzZjAsIDB4MDgwYywgMHg1NWVmLCAweDExMjAsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NjQxYywKKwkweDA4MGMsIDB4MzFiNCwgMHg2MDIwLCAweDkwODYsIDB4MDAwYSwgMHgxMTA4LCAweDAwMDUsIDB4MDgwNCwKKwkweGEwZTMsIDB4MDBiNiwgMHgwMGU2LCAweDAwMjYsIDB4MDAxNiwgMHgyMDcxLCAweDE4MDAsIDB4NzA4YywKKwkweDkwODYsIDB4MDAxNCwgMHgxOTA0LCAweGFkZDYsIDB4MDBkNiwgMHgwODBjLCAweDcyMDcsIDB4MDE5OCwKKwkweDAwMjYsIDB4MjAxMSwgMHgwMDEwLCAweDA4MGMsIDB4NjdlNywgMHgwMDJlLCAweDA1YzgsIDB4MDgwYywKKwkweDU1ZWYsIDB4MTU0MCwgMHg2MDE0LCAweDIwNDgsIDB4YTgwNywgMHgwMDAwLCAweGE4NjcsIDB4MDEwMywKKwkweGE4MzMsIDB4ZGVhZCwgMHgwMGY4LCAweDAwMjYsIDB4MjAxMSwgMHg4MDA4LCAweDA4MGMsIDB4NjdlNywKKwkweDAwMmUsIDB4MDUzMCwgMHg2MDE0LCAweDIwNDgsIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwKKwkweDAwMzksIDB4MTE0MCwgMHgyMDAxLCAweDAwMzAsIDB4OTAwZSwgMHgyMDExLCAweDQwMDksIDB4MDgwYywKKwkweGM0MTgsIDB4MDA0MCwgMHg2MDE0LCAweDIwNDgsIDB4YTgwNywgMHgwMDAwLCAweGE4NjcsIDB4MDEwMywKKwkweGE4MzMsIDB4ZGVhZCwgMHg2MDEwLCAweDIwNTgsIDB4YjlhMCwgMHgwMDE2LCAweDA4MGMsIDB4MzFiNCwKKwkweDA4MGMsIDB4YTBlMywgMHgwMDFlLCAweDA4MGMsIDB4MzI4NiwgMHgwMGRlLCAweDA4MDQsIDB4YWRkYSwKKwkweDAwZGUsIDB4MDgwYywgMHg1NWVmLCAweDExNzAsIDB4NjAxNCwgMHg5MDA1LCAweDExNTgsIDB4MDAzNiwKKwkweDAwNDYsIDB4NjAxMCwgMHgyMDU4LCAweGJiYTAsIDB4MjAyMSwgMHgwMDA2LCAweDA4MGMsIDB4NGNiYywKKwkweDAwNGUsIDB4MDAzZSwgMHgwMGQ2LCAweDYwMTAsIDB4MjA1OCwgMHgwODBjLCAweDY1M2EsIDB4MDgwYywKKwkweGFiOTgsIDB4MDBkZSwgMHgwODBjLCAweGIwMWMsIDB4MTU4OCwgMHg2MDEwLCAweDIwNTgsIDB4Yjg5MCwKKwkweDkwMDUsIDB4MDU2MCwgMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg2M2YwLCAweDAwOTYsIDB4NjAxNCwKKwkweDkwNGQsIDB4MDFkMCwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMzksIDB4MTE0MCwKKwkweDIwMDEsIDB4MDAwMCwgMHg5MDBlLCAweDIwMTEsIDB4NDAwMCwgMHgwODBjLCAweGM0MTgsIDB4MDA2MCwKKwkweGE4NjQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAyOSwgMHgwMTMwLCAweGE4MDcsIDB4MDAwMCwKKwkweGE4NjcsIDB4MDEwMywgMHhhODMzLCAweDAyMDAsIDB4MDA5ZSwgMHgwODBjLCAweDMxYjQsIDB4NjAyMCwKKwkweDkwODYsIDB4MDAwYSwgMHgwMTM4LCAweDA4MGMsIDB4YTBlMywgMHgwMDIwLCAweDA4MGMsIDB4YWE4MSwKKwkweDA4MGMsIDB4YWQyNCwgMHgwMDFlLCAweDAwMmUsIDB4MDBlZSwgMHgwMGJlLCAweDAwMDUsIDB4MjAxMSwKKwkweDE4MjMsIDB4MjIwNCwgMHg5MDg2LCAweDAwMTQsIDB4MTE2MCwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywKKwkweDYzZjAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHgwODBjLCAweDg2YzEsIDB4MDgwNCwKKwkweDhjMTAsIDB4MDgwNCwgMHhhZDI0LCAweDIwMzAsIDB4MjAxMSwgMHgxODIzLCAweDIyMDQsIDB4OTA4NiwKKwkweDAwMDQsIDB4MTE0OCwgMHg5NmI2LCAweDAwMGIsIDB4MTEyMCwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywKKwkweDYzZjAsIDB4MDgwNCwgMHhhMGUzLCAweDA4MDQsIDB4YWQyNCwgMHgwMDAyLCAweGFiNjIsIDB4YWUxZCwKKwkweGFiNjIsIDB4YWU1YywgMHhhYjYyLCAweGFmMDcsIDB4YWUxMiwgMHhhYjYyLCAweGFiNjIsIDB4YWYxYSwKKwkweGFiNjIsIDB4YWYyYSwgMHg2NjA0LCAweDk2ODYsIDB4MDAwMywgMHgwOTA0LCAweGFkMzksIDB4OTZiNiwKKwkweDAwMWUsIDB4MTExMCwgMHgwODBjLCAweGEwZTMsIDB4MDAwNSwgMHgwMGI2LCAweDAwZDYsIDB4MDBjNiwKKwkweDA4MGMsIDB4YWYzYSwgMHgxMWEwLCAweDkwMDYsIDB4MDgwYywgMHg2M2RjLCAweDA4MGMsIDB4MzE4YiwKKwkweDA4MGMsIDB4YzU0ZSwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg2M2YwLCAweDYwMDMsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDAwMiwgMHgwODBjLCAweDg2YzEsIDB4MDgwYywgMHg4YzEwLCAweDA0MDgsIDB4MjAwOSwKKwkweDAyNmUsIDB4MjEwNCwgMHg5MDg2LCAweDAwMDksIDB4MTE2MCwgMHg2MDEwLCAweDIwNTgsIDB4Yjg0MCwKKwkweDkwODQsIDB4MDBmZiwgMHg5MDA1LCAweDAxNzAsIDB4ODAwMSwgMHhiODQyLCAweDYwMWIsIDB4MDAwYSwKKwkweDAwNzgsIDB4MjAwOSwgMHgwMjZmLCAweDIxMDQsIDB4OTA4NCwgMHhmZjAwLCAweDkwODYsIDB4MTkwMCwKKwkweDExMDgsIDB4MDhhMCwgMHgwODBjLCAweDMxOGIsIDB4MDgwYywgMHhjNTRlLCAweDA4MGMsIDB4YWQyNCwKKwkweDAwY2UsIDB4MDBkZSwgMHgwMGJlLCAweDAwMDUsIDB4MDA5NiwgMHgwMGI2LCAweDAwMjYsIDB4OTAxNiwKKwkweDA4MGMsIDB4YWY0OCwgMHgwMGQ2LCAweDIwNjksIDB4MTk1NCwgMHgyZDA0LCAweDkwMDUsIDB4MDE2OCwKKwkweDYwMTAsIDB4MjA1OCwgMHhiOGEwLCAweDkwODYsIDB4MDA3ZSwgMHgxMTM4LCAweDIwNjksIDB4MTgxZiwKKwkweDJkMDQsIDB4ODAwMCwgMHgyMDZhLCAweDAwZGUsIDB4MDAxMCwgMHgwMGRlLCAweDAwODgsIDB4OTAwNiwKKwkweDA4MGMsIDB4NjNkYywgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg2M2YwLCAweDYwMDMsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDAwMiwgMHgwODBjLCAweDg2YzEsIDB4MDgwYywgMHg4YzEwLCAweDA4MDQsIDB4YWVkNywKKwkweDA4MGMsIDB4YmUzNywgMHgwMWIwLCAweDYwMTQsIDB4MjA0OCwgMHhhODY0LCAweDIwMTAsIDB4OTA4NiwKKwkweDAxMzksIDB4MTEzOCwgMHg2MDA3LCAweDAwMTYsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4YzQ3MiwKKwkweDAwYjAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4NjQsIDB4ZDBmYywgMHgwMTE4LCAweDIwMDEsIDB4MDAwMSwKKwkweDBjYTgsIDB4MjAwMSwgMHgxODBlLCAweDIwMDQsIDB4ZDBkYywgMHgwMTQ4LCAweDYwMTAsIDB4MjA1OCwKKwkweGI4NDAsIDB4OTA4NCwgMHgwMGZmLCAweDkwMDUsIDB4MTExMCwgMHg5MDA2LCAweDBjMzgsIDB4MDgwYywKKwkweGFhODEsIDB4MjAwOSwgMHgwMjZlLCAweDIxMzQsIDB4OTZiNCwgMHgwMGZmLCAweDk2ODYsIDB4MDAwNSwKKwkweDA1MTAsIDB4OTY4NiwgMHgwMDBiLCAweDAxYzgsIDB4MjAwOSwgMHgwMjZmLCAweDIxMDQsIDB4OTA4NCwKKwkweGZmMDAsIDB4MTExOCwgMHg5Njg2LCAweDAwMDksIDB4MDFiMCwgMHg5MDg2LCAweDE5MDAsIDB4MTE2OCwKKwkweDk2ODYsIDB4MDAwOSwgMHgwMTgwLCAweDIwMDEsIDB4MDAwNCwgMHgwODBjLCAweDYzZjAsIDB4MjAwMSwKKwkweDAwMjgsIDB4NjAxYSwgMHg2MDA3LCAweDAwNTIsIDB4MDAxMCwgMHgwODBjLCAweGFkMjQsIDB4MDAyZSwKKwkweDAwYmUsIDB4MDA5ZSwgMHgwMDA1LCAweDkyODYsIDB4MDEzOSwgMHgwMTYwLCAweDYwMTQsIDB4MjA0OCwKKwkweDA4MGMsIDB4YmUzNywgMHgwMTQwLCAweGE4NjQsIDB4OTA4NiwgMHgwMTM5LCAweDAxMTgsIDB4YTg2OCwKKwkweGQwZmMsIDB4MDEwOCwgMHgwYzUwLCAweDYwMTAsIDB4MjA1OCwgMHhiODQwLCAweDkwODQsIDB4MDBmZiwKKwkweDkwMDUsIDB4MDEzOCwgMHg4MDAxLCAweGI4NDIsIDB4NjAxYiwgMHgwMDBhLCAweDYwMDcsIDB4MDAxNiwKKwkweDA4ZjAsIDB4YjhhMCwgMHg5MDg2LCAweDAwN2UsIDB4MTEzOCwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwKKwkweDA4MGMsIDB4NWViZSwgMHgwMGVlLCAweDAwMTAsIDB4MDgwYywgMHgzMThiLCAweDA4NzAsIDB4MDgwYywKKwkweGFmNDgsIDB4MTE2MCwgMHgyMDAxLCAweDAwMDQsIDB4MDgwYywgMHg2M2YwLCAweDYwMDMsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDAwMywgMHgwODBjLCAweDg2YzEsIDB4MDgwNCwgMHg4YzEwLCAweDA4MGMsIDB4YWE4MSwKKwkweDA4MDQsIDB4YWQyNCwgMHgwNDY5LCAweDExNjAsIDB4MjAwMSwgMHgwMDA4LCAweDA4MGMsIDB4NjNmMCwKKwkweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDUsIDB4MDgwYywgMHg4NmMxLCAweDA4MDQsIDB4OGMxMCwKKwkweDA4MDQsIDB4YWQyNCwgMHgwMGU5LCAweDExNjAsIDB4MjAwMSwgMHgwMDBhLCAweDA4MGMsIDB4NjNmMCwKKwkweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDEsIDB4MDgwYywgMHg4NmMxLCAweDA4MDQsIDB4OGMxMCwKKwkweDA4MDQsIDB4YWQyNCwgMHgyMDA5LCAweDAyNmUsIDB4MjEwNCwgMHg5MDg2LCAweDAwMDMsIDB4MTEzOCwKKwkweDIwMDksIDB4MDI2ZiwgMHgyMTA0LCAweDkwODQsIDB4ZmYwMCwgMHg5MDg2LCAweDJhMDAsIDB4MDAwNSwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwYjYsIDB4MDBjNiwgMHgwMDE2LCAweDYxMTAsIDB4MjE1OCwKKwkweDA4MGMsIDB4NjRhZSwgMHgwMDFlLCAweDAwY2UsIDB4MDBiZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBmNiwKKwkweDAwZTYsIDB4MDBkNiwgMHgwMDM2LCAweDAwMTYsIDB4NjAxMCwgMHgyMDU4LCAweDIwMDksIDB4MTgzNiwKKwkweDIxMDQsIDB4OTA4NSwgMHgwMDAzLCAweDIwMGEsIDB4MDgwYywgMHhhZmVlLCAweDA1NjAsIDB4MjAwOSwKKwkweDE4MzYsIDB4MjEwNCwgMHhjMGNkLCAweDIwMGEsIDB4MDgwYywgMHg2N2JmLCAweDAxNTgsIDB4OTAwNiwKKwkweDIwMjAsIDB4MjAwOSwgMHgwMDJhLCAweDA4MGMsIDB4ZDg4NSwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywKKwkweGMxOTUsIDB4MjEwMiwgMHgyMDE5LCAweDAwMmEsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsIDB4MzE1NiwKKwkweDAwZTYsIDB4MjA3MSwgMHgxODAwLCAweDA4MGMsIDB4MmY2YywgMHgwMGVlLCAweDAwYzYsIDB4MDE1NiwKKwkweDIwYTksIDB4MDc4MSwgMHgyMDA5LCAweDAwN2YsIDB4MDgwYywgMHgzMjg2LCAweDgxMDgsIDB4MWYwNCwKKwkweGFmOGMsIDB4MDE1ZSwgMHgwMGNlLCAweDA4MGMsIDB4YWY0YiwgMHgyMDcxLCAweDAyNjAsIDB4MjA3OSwKKwkweDAyMDAsIDB4NzgxNywgMHgwMDAxLCAweDIwMDEsIDB4MTgzNiwgMHgyMDBjLCAweGMxYzUsIDB4NzAxOCwKKwkweGQwZmMsIDB4MDExMCwgMHhkMGRjLCAweDAxMTgsIDB4NzAzOCwgMHhkMGRjLCAweDExMDgsIDB4YzFjNCwKKwkweDc4MTcsIDB4MDAwMCwgMHgyMDAxLCAweDE4MzYsIDB4MjEwMiwgMHgyMDc5LCAweDAxMDAsIDB4MmUwNCwKKwkweDkwODQsIDB4MDBmZiwgMHgyMDY5LCAweDE4MWUsIDB4MjA2YSwgMHg3OGU2LCAweDAwMDYsIDB4OGU3MCwKKwkweDJlMDQsIDB4MjA2OSwgMHgxODFmLCAweDIwNmEsIDB4NzhlYSwgMHg3ODMyLCAweDc4MzYsIDB4MjAxMCwKKwkweDkwODQsIDB4ZmYwMCwgMHgwMDFlLCAweDkxMDUsIDB4MjAwOSwgMHgxODJiLCAweDIwMGEsIDB4MjIwMCwKKwkweDkwODQsIDB4MDBmZiwgMHgyMDA4LCAweDA4MGMsIDB4MjdiNywgMHgwODBjLCAweDcyMDcsIDB4MDE3MCwKKwkweDIwNzEsIDB4MDI2MCwgMHgyMDY5LCAweDE5NWEsIDB4NzA0OCwgMHgyMDZhLCAweDcwNGMsIDB4NjgwNiwKKwkweDcwNTAsIDB4NjgwYSwgMHg3MDU0LCAweDY4MGUsIDB4MDgwYywgMHhjMjRkLCAweDAwNDAsIDB4MjAwMSwKKwkweDAwMDYsIDB4MDgwYywgMHg2M2YwLCAweDA4MGMsIDB4MzFiNCwgMHgwODBjLCAweGEwZTMsIDB4MDAxZSwKKwkweDAwM2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDBiZSwgMHgwMDA1LCAweDAwOTYsIDB4MDAyNiwKKwkweDAwMzYsIDB4MDBlNiwgMHgwMTU2LCAweDIwMTksIDB4MTgyYiwgMHgyMzFjLCAweDgzZmYsIDB4MDFmMCwKKwkweDIwNzEsIDB4MDI2MCwgMHg3MjAwLCAweDkyOTQsIDB4MDBmZiwgMHg3MDA0LCAweDkwODQsIDB4ZmYwMCwKKwkweDkyMDUsIDB4OTMwNiwgMHgxMTk4LCAweDIwMTEsIDB4MDI3NiwgMHgyMGE5LCAweDAwMDQsIDB4MmI0OCwKKwkweDIwMTksIDB4MDAwYSwgMHgwODBjLCAweGIwZDAsIDB4MTE0OCwgMHgyMDExLCAweDAyN2EsIDB4MjBhOSwKKwkweDAwMDQsIDB4MjAxOSwgMHgwMDA2LCAweDA4MGMsIDB4YjBkMCwgMHgxMTAwLCAweDAxNWUsIDB4MDBlZSwKKwkweDAwM2UsIDB4MDAyZSwgMHgwMDllLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDAyNjAsIDB4NzAzNCwKKwkweDkwODYsIDB4MDAxNCwgMHgxMWE4LCAweDcwMzgsIDB4OTA4NiwgMHgwODAwLCAweDExODgsIDB4NzAzYywKKwkweGQwZWMsIDB4MDE2MCwgMHg5MDg0LCAweDBmMDAsIDB4OTA4NiwgMHgwMTAwLCAweDExMzgsIDB4NzA1NCwKKwkweGQwYTQsIDB4MTExMCwgMHhkMGFjLCAweDAxMTAsIDB4OTAwNiwgMHgwMDEwLCAweDkwODUsIDB4MDAwMSwKKwkweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwOTYsIDB4MDBjNiwgMHgwMDc2LCAweDAwNTYsIDB4MDA0NiwKKwkweDAwMjYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDI5LCAweDE5YzgsIDB4MjUyYywKKwkweDIwMjEsIDB4MTljZSwgMHgyNDI0LCAweDIwNjEsIDB4MWNkMCwgMHgyMDcxLCAweDE4MDAsIDB4NzI1MCwKKwkweDcwNzAsIDB4OTIwMiwgMHgxYTA0LCAweGIwYTgsIDB4MDgwYywgMHhkOGI2LCAweDA5MDQsIDB4YjBhMSwKKwkweDY3MjAsIDB4OTc4NiwgMHgwMDA3LCAweDA5MDQsIDB4YjBhMSwgMHgyNTAwLCAweDljMDYsIDB4MDkwNCwKKwkweGIwYTEsIDB4MjQwMCwgMHg5YzA2LCAweDA1ZTgsIDB4M2UwOCwgMHg5MTg2LCAweDAwMDIsIDB4MTE0OCwKKwkweDYwMTAsIDB4OTAwNSwgMHgwMTMwLCAweDAwYjYsIDB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywKKwkweDE1ODAsIDB4MDBjNiwgMHg2MDAwLCAweDkwODYsIDB4MDAwNCwgMHgxMTEwLCAweDA4MGMsIDB4MTliNCwKKwkweDk3ODYsIDB4MDAwYSwgMHgwMTQ4LCAweDA4MGMsIDB4YzAzZiwgMHgxMTMwLCAweDAwY2UsIDB4MDgwYywKKwkweGFhODEsIDB4MDgwYywgMHhhMTEzLCAweDAwZTgsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4YmUzNywKKwkweDAxYTgsIDB4OTc4NiwgMHgwMDAzLCAweDE1MzAsIDB4YTg2NywgMHgwMTAzLCAweGE4N2MsIDB4ZDBjYywKKwkweDAxMzAsIDB4MDA5NiwgMHhhODc4LCAweDIwNDgsIDB4MDgwYywgMHgwZmUzLCAweDAwOWUsIDB4YWI3YSwKKwkweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweDZhZGMsIDB4MDgwYywgMHhjMDIyLCAweDA4MGMsIDB4YTExMywKKwkweDAwY2UsIDB4OWNlMCwgMHgwMDE4LCAweDcwNjQsIDB4OWMwMiwgMHgxMjEwLCAweDA4MDQsIDB4YjA0ZiwKKwkweDAxMmUsIDB4MDAwZSwgMHgwMDJlLCAweDAwNGUsIDB4MDA1ZSwgMHgwMDdlLCAweDAwY2UsIDB4MDA5ZSwKKwkweDAwZWUsIDB4MDAwNSwgMHg5Nzg2LCAweDAwMDYsIDB4MTExOCwgMHgwODBjLCAweGQ4MzAsIDB4MGMzMCwKKwkweDk3ODYsIDB4MDAwYSwgMHgwOWUwLCAweDA4ODAsIDB4MjIwYywgMHgyMzA0LCAweDkxMDYsIDB4MTEzMCwKKwkweDgyMTAsIDB4ODMxOCwgMHgxZjA0LCAweGIwYmMsIDB4OTAwNiwgMHgwMDA1LCAweDIzMDQsIDB4OTEwMiwKKwkweDAyMTgsIDB4MjAwMSwgMHgwMDAxLCAweDAwMDgsIDB4OTAwNiwgMHg5MThkLCAweDAwMDEsIDB4MDAwNSwKKwkweDAxMzYsIDB4MDFjNiwgMHgwMDE2LCAweDg5MDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwOGMsIDB4MDAzZiwKKwkweDIxZTAsIDB4OTA4NCwgMHhmZmMwLCAweDkzMDAsIDB4MjA5OCwgMHgzNTE4LCAweDIwYTksIDB4MDAwMSwKKwkweDIyMGMsIDB4NDAwMiwgMHg5MTBlLCAweDExNDAsIDB4ODIxMCwgMHg4MzE5LCAweDFkYzgsIDB4OTAwNiwKKwkweDAwMWUsIDB4MDFjZSwgMHgwMTNlLCAweDAwMDUsIDB4MjIwYywgMHg5MTAyLCAweDAyMTgsIDB4MjAwMSwKKwkweDAwMDEsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDAsIDB4OTE4ZCwgMHgwMDAxLCAweDAwMWUsIDB4MDFjZSwKKwkweDAxM2UsIDB4MDAwNSwgMHg2MDA0LCAweDkwOGEsIDB4MDA1MywgMHgxYTBjLCAweDBkZmEsIDB4MDgwYywKKwkweGMwMmUsIDB4MDEyMCwgMHgwODBjLCAweGMwM2YsIDB4MDE2OCwgMHgwMDI4LCAweDA4MGMsIDB4MzFiNCwKKwkweDA4MGMsIDB4YzAzZiwgMHgwMTM4LCAweDA4MGMsIDB4OGIwNCwgMHgwODBjLCAweGEwZTMsIDB4MDgwYywKKwkweDhjMTAsIDB4MDAwNSwgMHgwODBjLCAweGFhODEsIDB4MGNiMCwgMHg5MTgyLCAweDAwNTQsIDB4MTIyMCwKKwkweDkxODIsIDB4MDA0MCwgMHgwMjA4LCAweDAwMGEsIDB4MDAwNSwgMHhiMTMxLCAweGIxMzEsIDB4YjEzMSwKKwkweGIxMzEsIDB4YjEzMSwgMHhiMTMxLCAweGIxMzEsIDB4YjEzMSwgMHhiMTMxLCAweGIxMzEsIDB4YjEzMSwKKwkweGIxMzMsIDB4YjEzMywgMHhiMTMzLCAweGIxMzMsIDB4YjEzMSwgMHhiMTMxLCAweGIxMzEsIDB4YjEzMywKKwkweGIxMzEsIDB4MDgwYywgMHgwZGZhLCAweDYwMGIsIDB4ZmZmZiwgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwKKwkweDA4MGMsIDB4ODY3OSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDhjMTAsIDB4MDEyZSwKKwkweDAwMDUsIDB4OTE4NiwgMHgwMDEzLCAweDExMjgsIDB4NjAwNCwgMHg5MDgyLCAweDAwNDAsIDB4MDgwNCwKKwkweGIxZTgsIDB4OTE4NiwgMHgwMDI3LCAweDE1MjAsIDB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4MzE4YiwKKwkweDA4MGMsIDB4YzU0ZSwgMHgwMDk2LCAweDYxMTQsIDB4MjE0OCwgMHgwODBjLCAweGJlMzcsIDB4MDE5OCwKKwkweDA4MGMsIDB4YzAzZiwgMHgxMTE4LCAweDA4MGMsIDB4YWE4MSwgMHgwMDY4LCAweGE4NjcsIDB4MDEwMywKKwkweGE4N2IsIDB4MDAyOSwgMHhhODc3LCAweDAwMDAsIDB4YTk3YywgMHhjMWM1LCAweGE5N2UsIDB4MDgwYywKKwkweDZhZTksIDB4MDgwYywgMHhjMDIyLCAweDAwOWUsIDB4MDgwYywgMHhhMGUzLCAweDA4MDQsIDB4OGMxMCwKKwkweDkxODYsIDB4MDAxNCwgMHgxMTIwLCAweDYwMDQsIDB4OTA4MiwgMHgwMDQwLCAweDA0YTAsIDB4OTE4NiwKKwkweDAwNDYsIDB4MDE1MCwgMHg5MTg2LCAweDAwNDUsIDB4MDEzOCwgMHg5MTg2LCAweDAwNTMsIDB4MDEyMCwKKwkweDkxODYsIDB4MDA0OCwgMHgxOTBjLCAweDBkZmEsIDB4MjAwMSwgMHgwMTA5LCAweDIwMDQsIDB4ZDA4NCwKKwkweDA1MDgsIDB4MDEyNiwgMHgyMDkxLCAweDI4MDAsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwKKwkweDAwZjYsIDB4MDBlNiwgMHgwMGM2LCAweDIwNzksIDB4MTliZiwgMHgyMDcxLCAweDE4MDAsIDB4MjA2MSwKKwkweDAxMDAsIDB4MDgwYywgMHg4NTYzLCAweDAwY2UsIDB4MDBlZSwgMHgwMGZlLCAweDAwM2UsIDB4MDAyZSwKKwkweDAwMWUsIDB4MDAwZSwgMHgwMTJlLCAweGEwMDEsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDIsIDB4MTExMCwKKwkweDA4MDQsIDB4YjIyNiwgMHgwMDA1LCAweDAwMDIsIDB4YjFjMiwgMHhiMWMwLCAweGIxYzAsIDB4YjFjMCwKKwkweGIxYzAsIDB4YjFjMCwgMHhiMWMwLCAweGIxYzAsIDB4YjFjMCwgMHhiMWMwLCAweGIxYzAsIDB4YjFkZCwKKwkweGIxZGQsIDB4YjFkZCwgMHhiMWRkLCAweGIxYzAsIDB4YjFkZCwgMHhiMWMwLCAweGIxZGQsIDB4YjFjMCwKKwkweDA4MGMsIDB4MGRmYSwgMHgwODBjLCAweDhiMDQsIDB4MDA5NiwgMHg2MTE0LCAweDIxNDgsIDB4MDgwYywKKwkweGJlMzcsIDB4MDE2OCwgMHhhODY3LCAweDAxMDMsIDB4YTg3YiwgMHgwMDA2LCAweGE4NzcsIDB4MDAwMCwKKwkweGE4ODAsIDB4YzBlYywgMHhhODgyLCAweDA4MGMsIDB4NmFlOSwgMHgwODBjLCAweGMwMjIsIDB4MDA5ZSwKKwkweDA4MGMsIDB4YTBlMywgMHgwODBjLCAweDhjMTAsIDB4MDAwNSwgMHgwODBjLCAweDhiMDQsIDB4MDgwYywKKwkweGMwM2YsIDB4MDkwYywgMHhhYTgxLCAweDA4MGMsIDB4YTBlMywgMHgwODBjLCAweDhjMTAsIDB4MDAwNSwKKwkweDAwMDIsIDB4YjFmZiwgMHhiMWZkLCAweGIxZmQsIDB4YjFmZCwgMHhiMWZkLCAweGIxZmQsIDB4YjFmZCwKKwkweGIxZmQsIDB4YjFmZCwgMHhiMWZkLCAweGIxZmQsIDB4YjIxNiwgMHhiMjE2LCAweGIyMTYsIDB4YjIxNiwKKwkweGIxZmQsIDB4YjIyMCwgMHhiMWZkLCAweGIyMTYsIDB4YjFmZCwgMHgwODBjLCAweDBkZmEsIDB4MDA5NiwKKwkweDA4MGMsIDB4OGIwNCwgMHg2MDE0LCAweDIwNDgsIDB4MjAwMSwgMHgxOTYwLCAweDIwMDQsIDB4NjA0MiwKKwkweGE5N2MsIDB4ZDFhYywgMHgwMTQwLCAweDYwMDMsIDB4MDAwNCwgMHhhODdjLCAweDkwODUsIDB4MDQwMCwKKwkweGE4N2UsIDB4MDA5ZSwgMHgwMDA1LCAweDYwMDMsIDB4MDAwMiwgMHgwY2I4LCAweDA4MGMsIDB4OGIwNCwKKwkweDA4MGMsIDB4YzU1MSwgMHgwODBjLCAweGM1NTYsIDB4NjAwMywgMHgwMDBmLCAweDA4MDQsIDB4OGMxMCwKKwkweDA4MGMsIDB4OGIwNCwgMHgwODBjLCAweGEwZTMsIDB4MDgwNCwgMHg4YzEwLCAweDkxODIsIDB4MDA1NCwKKwkweDEyMjAsIDB4OTE4MiwgMHgwMDQwLCAweDAyMDgsIDB4MDAwYSwgMHgwMDA1LCAweGIyNDIsIDB4YjI0MiwKKwkweGIyNDIsIDB4YjI0MiwgMHhiMjQyLCAweGIyNDQsIDB4YjMyMSwgMHhiMjQyLCAweGIzNTUsIDB4YjI0MiwKKwkweGIyNDIsIDB4YjI0MiwgMHhiMjQyLCAweGIyNDIsIDB4YjI0MiwgMHhiMjQyLCAweGIyNDIsIDB4YjI0MiwKKwkweGIyNDIsIDB4YjM1NSwgMHgwODBjLCAweDBkZmEsIDB4MDBiNiwgMHgwMDk2LCAweDYxMTQsIDB4MjE0OCwKKwkweDc2NDQsIDB4OTZiNCwgMHgwZmZmLCAweDg2ZmYsIDB4MTUyOCwgMHg2MDEwLCAweDIwNTgsIDB4YjgwMCwKKwkweGQwYmMsIDB4MTkwNCwgMHhiMzEwLCAweGE4N2IsIDB4MDAwMCwgMHhhODY3LCAweDAxMDMsIDB4YWU3NiwKKwkweGE4N2MsIDB4ZDBhYywgMHgwMTI4LCAweGE4MzQsIDB4YTkzOCwgMHg5MTE1LCAweDE5MGMsIDB4YjRlZSwKKwkweDA4MGMsIDB4NjkwNCwgMHg2MjEwLCAweDIyNTgsIDB4YmEzYywgMHg4MmZmLCAweDAxMTAsIDB4ODIxMSwKKwkweGJhM2UsIDB4NzA0NCwgMHhkMGU0LCAweDE5MDQsIDB4YjJmNCwgMHgwODBjLCAweGEwZTMsIDB4MDA5ZSwKKwkweDAwYmUsIDB4MDAwNSwgMHg5NjhjLCAweDBjMDAsIDB4MDE1MCwgMHg2MDEwLCAweDIwNTgsIDB4YjgwMCwKKwkweGQwYmMsIDB4MTkwNCwgMHhiMmY4LCAweDczNDgsIDB4YWI5MiwgMHg3MzRjLCAweGFiOGUsIDB4OTY4YywKKwkweDAwZmYsIDB4OTE4NiwgMHgwMDAyLCAweDA1MDgsIDB4OTE4NiwgMHgwMDI4LCAweDExMTgsIDB4YTg3YiwKKwkweDAwMWMsIDB4MDBlOCwgMHhkNmRjLCAweDAxYTAsIDB4YTg3YiwgMHgwMDE1LCAweGE4N2MsIDB4ZDBhYywKKwkweDAxNzAsIDB4YTkzOCwgMHhhYTM0LCAweDIxMDAsIDB4OTIwNSwgMHgwMTQ4LCAweDcwNDgsIDB4OTEwNiwKKwkweDExMTgsIDB4NzA0YywgMHg5MjA2LCAweDAxMTgsIDB4YTk5MiwgMHhhYThlLCAweGM2ZGMsIDB4MDAzOCwKKwkweGQ2ZDQsIDB4MDExOCwgMHhhODdiLCAweDAwMDcsIDB4MDAxMCwgMHhhODdiLCAweDAwMDAsIDB4YTg2NywKKwkweDAxMDMsIDB4YWU3NiwgMHg5MDFlLCAweGQ2YzQsIDB4MDFkOCwgMHg5Njg2LCAweDAxMDAsIDB4MTEzMCwKKwkweDcwNjQsIDB4OTAwNSwgMHgxMTE4LCAweGM2YzQsIDB4MDgwNCwgMHhiMjRiLCAweDczNWMsIDB4YWI4NiwKKwkweDgzZmYsIDB4MDE3MCwgMHg5MzhhLCAweDAwMDksIDB4MDIxMCwgMHgyMDE5LCAweDAwMDgsIDB4MDAzNiwKKwkweDIzMDgsIDB4MjAxOSwgMHgwMDE4LCAweDIwMTEsIDB4MDAyNSwgMHgwODBjLCAweGI5ZTgsIDB4MDAzZSwKKwkweGQ2Y2MsIDB4MDkwNCwgMHhiMjYwLCAweDcxNTQsIDB4YTk4YSwgMHg4MWZmLCAweDA5MDQsIDB4YjI2MCwKKwkweDkxOTIsIDB4MDAyMSwgMHgxMjc4LCAweDgzMDQsIDB4OTA5OCwgMHgwMDE4LCAweDIwMTEsIDB4MDAyOSwKKwkweDA4MGMsIDB4YjllOCwgMHgyMDExLCAweDAyMDUsIDB4MjAxMywgMHgwMDAwLCAweDA4MGMsIDB4YzRkZSwKKwkweDA4MDQsIDB4YjI2MCwgMHhhODY4LCAweGQwZmMsIDB4MDEyMCwgMHgyMDA5LCAweDAwMjAsIDB4YTk4YSwKKwkweDBjNTAsIDB4MDBhNiwgMHgyOTUwLCAweDA4MGMsIDB4Yjk4NywgMHgwMGFlLCAweDA4MGMsIDB4YzRkZSwKKwkweDA4MGMsIDB4YjlkOCwgMHgwODA0LCAweGIyNjIsIDB4MDgwYywgMHhjMTM3LCAweDA4MDQsIDB4YjI2ZiwKKwkweGE4N2MsIDB4ZDBhYywgMHgwOTA0LCAweGIyN2IsIDB4YTg4MCwgMHhkMGJjLCAweDE5MDQsIDB4YjI3YiwKKwkweDczNDgsIDB4YTgzOCwgMHg5MzA2LCAweDExYzgsIDB4NzM0YywgMHhhODM0LCAweDkzMWUsIDB4MDkwNCwKKwkweGIyN2IsIDB4ZDZkNCwgMHgwMTkwLCAweGFiMzgsIDB4OTMwNSwgMHgwOTA0LCAweGIyN2IsIDB4MDA2OCwKKwkweGE4N2MsIDB4ZDBhYywgMHgwOTA0LCAweGIyNTMsIDB4YTgzOCwgMHhhOTM0LCAweDkxMDUsIDB4MDkwNCwKKwkweGIyNTMsIDB4YTg4MCwgMHhkMGJjLCAweDE5MDQsIDB4YjI1MywgMHgwODBjLCAweGMxNzEsIDB4MDgwNCwKKwkweGIyNmYsIDB4MDA5NiwgMHgwMGY2LCAweDYwMDMsIDB4MDAwMywgMHg2MDA3LCAweDAwNDMsIDB4MjA3OSwKKwkweDAyNmMsIDB4N2MwNCwgMHg3YjAwLCAweDdlMGMsIDB4N2QwOCwgMHg2MDE0LCAweDIwNDgsIDB4YTg3YywKKwkweGQwYWMsIDB4MDE0MCwgMHg2MDAzLCAweDAwMDIsIDB4MDBmZSwgMHgwMDllLCAweDAwMDUsIDB4MjEzMCwKKwkweDIyMjgsIDB4MDA1OCwgMHgyNDAwLCAweGE5YWMsIDB4OTEwYSwgMHgyMzAwLCAweGFhYjAsIDB4OTIxMywKKwkweDI2MDAsIDB4OTEwMiwgMHgyNTAwLCAweDkyMDMsIDB4MGU5MCwgMHhhYzM2LCAweGFiM2EsIDB4YWU0NiwKKwkweGFkNGEsIDB4MDBmZSwgMHg2MDQzLCAweDAwMDAsIDB4MmMxMCwgMHgwODBjLCAweDFhZmUsIDB4MDgwYywKKwkweDg2ZGUsIDB4MDgwYywgMHg4Y2VkLCAweDAwOWUsIDB4MDAwNSwgMHgwMDA1LCAweDkxODIsIDB4MDA1NCwKKwkweDEyMjAsIDB4OTE4MiwgMHgwMDQwLCAweDAyMDgsIDB4MDAwYSwgMHgwMDA1LCAweGIzNzIsIDB4YjM3MiwKKwkweGIzNzIsIDB4YjM3MiwgMHhiMzcyLCAweGIzNzQsIDB4YjQwYSwgMHhiMzcyLCAweGIzNzIsIDB4YjQyMSwKKwkweGI0YjEsIDB4YjM3MiwgMHhiMzcyLCAweGIzNzIsIDB4YjM3MiwgMHhiNGM2LCAweGIzNzIsIDB4YjM3MiwKKwkweGIzNzIsIDB4YjM3MiwgMHgwODBjLCAweDBkZmEsIDB4MDA3NiwgMHgwMGE2LCAweDAwZTYsIDB4MDA5NiwKKwkweDIwNzEsIDB4MDI2MCwgMHg2MTE0LCAweDIxNTAsIDB4NzY0NCwgMHhiNjc2LCAweDk2YjQsIDB4MGZmZiwKKwkweGI3N2MsIDB4YzdlNSwgMHhiNzdlLCAweDYyMTAsIDB4MDBiNiwgMHgyMjU4LCAweGJhM2MsIDB4ODJmZiwKKwkweDAxMTAsIDB4ODIxMSwgMHhiYTNlLCAweDAwYmUsIDB4ODZmZiwgMHgwOTA0LCAweGI0MDUsIDB4OTY5NCwKKwkweGZmMDAsIDB4OTI4NCwgMHgwYzAwLCAweDAxMjAsIDB4NzA0OCwgMHhiMDkyLCAweDcwNGMsIDB4YjA4ZSwKKwkweDkyODQsIDB4MDMwMCwgMHgwOTA0LCAweGI0MDUsIDB4MDgwYywgMHgxMDMxLCAweDA5MGMsIDB4MGRmYSwKKwkweDI5MDAsIDB4YjA3YSwgMHhiNzdjLCAweGM3Y2QsIDB4Yjc3ZSwgMHhhODY3LCAweDAxMDMsIDB4YjA2OCwKKwkweGE4NmEsIDB4YjA2YywgMHhhODZlLCAweGIwNzAsIDB4YTg3MiwgMHhhZTc2LCAweDk2OGMsIDB4MGMwMCwKKwkweDAxMjAsIDB4NzM0OCwgMHhhYjkyLCAweDczNGMsIDB4YWI4ZSwgMHg5NjhjLCAweDAwZmYsIDB4OTE4NiwKKwkweDAwMDIsIDB4MDE4MCwgMHg5MTg2LCAweDAwMjgsIDB4MTExOCwgMHhhODdiLCAweDAwMWMsIDB4MDA2MCwKKwkweGQ2ZGMsIDB4MDExOCwgMHhhODdiLCAweDAwMTUsIDB4MDAzOCwgMHhkNmQ0LCAweDAxMTgsIDB4YTg3YiwKKwkweDAwMDcsIDB4MDAxMCwgMHhhODdiLCAweDAwMDAsIDB4YWY3ZSwgMHhiMDgwLCAweGE4ODIsIDB4YjA4NCwKKwkweGE4ODYsIDB4OTAxZSwgMHhkNmM0LCAweDAxOTAsIDB4NzM1YywgMHhhYjg2LCAweDgzZmYsIDB4MDE3MCwKKwkweDkzOGEsIDB4MDAwOSwgMHgwMjEwLCAweDIwMTksIDB4MDAwOCwgMHgwMDM2LCAweDIzMDgsIDB4MjAxOSwKKwkweDAwMTgsIDB4MjAxMSwgMHgwMDI1LCAweDA4MGMsIDB4YjllOCwgMHgwMDNlLCAweGQ2Y2MsIDB4MDFlOCwKKwkweDcxNTQsIDB4YTk4YSwgMHg4MWZmLCAweDAxYzgsIDB4OTE5MiwgMHgwMDIxLCAweDEyNjAsIDB4ODMwNCwKKwkweDkwOTgsIDB4MDAxOCwgMHgyMDExLCAweDAwMjksIDB4MDgwYywgMHhiOWU4LCAweDIwMTEsIDB4MDIwNSwKKwkweDIwMTMsIDB4MDAwMCwgMHgwMDUwLCAweGIwNjgsIDB4ZDBmYywgMHgwMTIwLCAweDIwMDksIDB4MDAyMCwKKwkweGE5OGEsIDB4MGM2OCwgMHgyOTUwLCAweDA4MGMsIDB4Yjk4NywgMHgwMDllLCAweDAwZWUsIDB4MDBhZSwKKwkweDAwN2UsIDB4MDAwNSwgMHgwMGY2LCAweDAwYTYsIDB4NjAwMywgMHgwMDAzLCAweDIwNzksIDB4MDI2YywKKwkweDdjMDQsIDB4N2IwMCwgMHg3ZTBjLCAweDdkMDgsIDB4NjAxNCwgMHgyMDUwLCAweGI0MzYsIDB4YjMzYSwKKwkweGI2NDYsIDB4YjU0YSwgMHgwMGFlLCAweDAwZmUsIDB4MmMxMCwgMHgwODBjLCAweDFhZmUsIDB4MDgwNCwKKwkweDk2MjMsIDB4NjAwMywgMHgwMDAyLCAweDYwMDQsIDB4OTA4NiwgMHgwMDQwLCAweDExYzgsIDB4MDA5NiwKKwkweDYwMTQsIDB4MjA0OCwgMHhhODdjLCAweGQwYWMsIDB4MDE2MCwgMHg2MDFjLCAweGQwODQsIDB4MTEzMCwKKwkweDAwZjYsIDB4MmMwMCwgMHgyMDc4LCAweDA4MGMsIDB4MTZkYiwgMHgwMGZlLCAweDYwMDMsIDB4MDAwNCwKKwkweDAwMTAsIDB4NjAwMywgMHgwMDAyLCAweDAwOWUsIDB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4OGMxMCwKKwkweDAwOTYsIDB4MjAwMSwgMHgxOTYwLCAweDIwMDQsIDB4NjA0MiwgMHgwODBjLCAweDhiYzAsIDB4MDgwYywKKwkweDhjZWQsIDB4NjExNCwgMHgyMTQ4LCAweGE5N2MsIDB4ZDFlNCwgMHgwOTA0LCAweGI0YWMsIDB4ZDFjYywKKwkweDA1YzgsIDB4YTk3OCwgMHhhODY4LCAweGQwZmMsIDB4MDU0MCwgMHgwMDE2LCAweGE4N2MsIDB4MDAwNiwKKwkweGE4ODAsIDB4MDAwNiwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4MjBhMCwKKwkweDgxMGUsIDB4ODEwZSwgMHg4MTBmLCAweDkxODQsIDB4MDAzZiwgMHgyMGUwLCAweDkxODQsIDB4ZmZjMCwKKwkweDkwODAsIDB4MDAxOSwgMHgyMDk4LCAweDAxNTYsIDB4MjBhOSwgMHgwMDIwLCAweDQwMDMsIDB4MDE1ZSwKKwkweDAwMGUsIDB4YTg4MiwgMHgwMDBlLCAweGMwY2MsIDB4YTg3ZSwgMHgwMDFlLCAweGE4NzQsIDB4MDAwNiwKKwkweDIxNDgsIDB4MDgwYywgMHgwZmUzLCAweDAwMWUsIDB4MDQ1OCwgMHgwMDE2LCAweDA4MGMsIDB4MGZlMywKKwkweDAwOWUsIDB4YTg3YywgMHhjMGNjLCAweGE4N2UsIDB4YTk3NCwgMHgwMDE2LCAweDA4MGMsIDB4YjlkOCwKKwkweDAwMWUsIDB4MDBmMCwgMHhhODY3LCAweDAxMDMsIDB4YTk3NCwgMHg5MTg0LCAweDAwZmYsIDB4OTBiNiwKKwkweDAwMDIsIDB4MDE4MCwgMHg5MDg2LCAweDAwMjgsIDB4MTExOCwgMHhhODdiLCAweDAwMWMsIDB4MDA2MCwKKwkweGQxZGMsIDB4MDExOCwgMHhhODdiLCAweDAwMTUsIDB4MDAzOCwgMHhkMWQ0LCAweDAxMTgsIDB4YTg3YiwKKwkweDAwMDcsIDB4MDAxMCwgMHhhODdiLCAweDAwMDAsIDB4MDAxNiwgMHgwODBjLCAweDY5MDQsIDB4MDAxZSwKKwkweGQxZTQsIDB4MTEyMCwgMHgwODBjLCAweGEwZTMsIDB4MDA5ZSwgMHgwMDA1LCAweDA4MGMsIDB4YzEzNywKKwkweDBjZDgsIDB4NjAwNCwgMHg5MDg2LCAweDAwNDAsIDB4MTEyMCwgMHgwODBjLCAweDhiMDQsIDB4MDgwYywKKwkweDhjMTAsIDB4MjAxOSwgMHgwMDAxLCAweDA4MGMsIDB4OTk5ZCwgMHg2MDAzLCAweDAwMDIsIDB4MDgwYywKKwkweGM1NTYsIDB4MDgwYywgMHg4YmMwLCAweDA4MGMsIDB4OGNlZCwgMHgwMDA1LCAweDYwMDQsIDB4OTA4NiwKKwkweDAwNDAsIDB4MTEyMCwgMHgwODBjLCAweDhiMDQsIDB4MDgwYywgMHg4YzEwLCAweDIwMTksIDB4MDAwMSwKKwkweDA4MGMsIDB4OTk5ZCwgMHgwODBjLCAweDhiYzAsIDB4MDgwYywgMHgzMThiLCAweDA4MGMsIDB4YzU0ZSwKKwkweDAwOTYsIDB4NjExNCwgMHgyMTQ4LCAweDA4MGMsIDB4YmUzNywgMHgwMTUwLCAweGE4NjcsIDB4MDEwMywKKwkweGE4N2IsIDB4MDAyOSwgMHhhODc3LCAweDAwMDAsIDB4MDgwYywgMHg2YWU5LCAweDA4MGMsIDB4YzAyMiwKKwkweDAwOWUsIDB4MDgwYywgMHhhMGUzLCAweDA4MGMsIDB4OGNlZCwgMHgwMDA1LCAweGE4N2IsIDB4MDAxNSwKKwkweGQxZmMsIDB4MDE4MCwgMHhhODdiLCAweDAwMDcsIDB4ODAwMiwgMHg4MDAwLCAweDgxMGEsIDB4OTE4OSwKKwkweDAwMDAsIDB4MDAwNiwgMHgwMDE2LCAweDIwMDksIDB4MWE1MSwgMHgyMTA0LCAweDgwMDAsIDB4MjAwYSwKKwkweDAwMWUsIDB4MDAwZSwgMHhhOTkyLCAweGE4OGUsIDB4MDAwNSwgMHg5MTgyLCAweDAwNTQsIDB4MTIyMCwKKwkweDkxODIsIDB4MDA0MCwgMHgwMjA4LCAweDAwMGEsIDB4MDAwNSwgMHhiNTIxLCAweGI1MjEsIDB4YjUyMSwKKwkweGI1MjEsIDB4YjUyMSwgMHhiNTIzLCAweGI1MjEsIDB4YjUyMSwgMHhiNWM5LCAweGI1MjEsIDB4YjUyMSwKKwkweGI1MjEsIDB4YjUyMSwgMHhiNTIxLCAweGI1MjEsIDB4YjUyMSwgMHhiNTIxLCAweGI1MjEsIDB4YjUyMSwKKwkweGI2ZmIsIDB4MDgwYywgMHgwZGZhLCAweDAwNzYsIDB4MDBhNiwgMHgwMGU2LCAweDAwOTYsIDB4MjA3MSwKKwkweDAyNjAsIDB4NjExNCwgMHgyMTUwLCAweDc2NDQsIDB4YjY3NiwgMHg5NmI0LCAweDBmZmYsIDB4Yjc3YywKKwkweGM3ZTUsIDB4Yjc3ZSwgMHg2MjEwLCAweDAwYjYsIDB4MjI1OCwgMHhiYTNjLCAweDgyZmYsIDB4MDExMCwKKwkweDgyMTEsIDB4YmEzZSwgMHgwMGJlLCAweDg2ZmYsIDB4MDkwNCwgMHhiNWMyLCAweDk2OTQsIDB4ZmYwMCwKKwkweDkyODQsIDB4MGMwMCwgMHgwMTIwLCAweDcwNDgsIDB4YjA5MiwgMHg3MDRjLCAweGIwOGUsIDB4OTI4NCwKKwkweDAzMDAsIDB4MDkwNCwgMHhiNWMyLCAweDk2ODYsIDB4MDEwMCwgMHgxMTMwLCAweDcwNjQsIDB4OTAwNSwKKwkweDExMTgsIDB4YzZjNCwgMHhiNjc2LCAweDBjMzgsIDB4MDgwYywgMHgxMDMxLCAweDA5MGMsIDB4MGRmYSwKKwkweDI5MDAsIDB4YjA3YSwgMHhiNzdjLCAweDk3YmQsIDB4MDIwMCwgMHhiNzdlLCAweGE4NjcsIDB4MDEwMywKKwkweGIwNjgsIDB4YTg2YSwgMHhiMDZjLCAweGE4NmUsIDB4YjA3MCwgMHhhODcyLCAweDcwNDQsIDB4OTA4NCwKKwkweGYwMDAsIDB4OTYzNSwgMHhhZTc2LCAweDk2OGMsIDB4MGMwMCwgMHgwMTIwLCAweDczNDgsIDB4YWI5MiwKKwkweDczNGMsIDB4YWI4ZSwgMHg5NjhjLCAweDAwZmYsIDB4OTE4NiwgMHgwMDAyLCAweDAxODAsIDB4OTE4NiwKKwkweDAwMjgsIDB4MTExOCwgMHhhODdiLCAweDAwMWMsIDB4MDA2MCwgMHhkNmRjLCAweDAxMTgsIDB4YTg3YiwKKwkweDAwMTUsIDB4MDAzOCwgMHhkNmQ0LCAweDAxMTgsIDB4YTg3YiwgMHgwMDA3LCAweDAwMTAsIDB4YTg3YiwKKwkweDAwMDAsIDB4YWY3ZSwgMHhiMDgwLCAweGE4ODIsIDB4YjA4NCwgMHhhODg2LCAweDkwMWUsIDB4ZDZjNCwKKwkweDAxOTAsIDB4NzM1YywgMHhhYjg2LCAweDgzZmYsIDB4MDE3MCwgMHg5MzhhLCAweDAwMDksIDB4MDIxMCwKKwkweDIwMTksIDB4MDAwOCwgMHgwMDM2LCAweDIzMDgsIDB4MjAxOSwgMHgwMDE4LCAweDIwMTEsIDB4MDAyNSwKKwkweDA4MGMsIDB4YjllOCwgMHgwMDNlLCAweGQ2Y2MsIDB4MDFlOCwgMHg3MTU0LCAweGE5OGEsIDB4ODFmZiwKKwkweDAxYzgsIDB4OTE5MiwgMHgwMDIxLCAweDEyNjAsIDB4ODMwNCwgMHg5MDk4LCAweDAwMTgsIDB4MjAxMSwKKwkweDAwMjksIDB4MDgwYywgMHhiOWU4LCAweDIwMTEsIDB4MDIwNSwgMHgyMDEzLCAweDAwMDAsIDB4MDA1MCwKKwkweGIwNjgsIDB4ZDBmYywgMHgwMTIwLCAweDIwMDksIDB4MDAyMCwgMHhhOThhLCAweDBjNjgsIDB4Mjk1MCwKKwkweDA4MGMsIDB4Yjk4NywgMHgwODBjLCAweDE5ODIsIDB4MDA5ZSwgMHgwMGVlLCAweDAwYWUsIDB4MDA3ZSwKKwkweDAwMDUsIDB4MjAwMSwgMHgxOTYwLCAweDIwMDQsIDB4NjA0MiwgMHgwMDk2LCAweDYxMTQsIDB4MjE0OCwKKwkweGE4M2MsIDB4YTk0MCwgMHg5MTA1LCAweDExMTgsIDB4YTg3YywgMHhjMGRjLCAweGE4N2UsIDB4NjAwMywKKwkweDAwMDIsIDB4YTk3YywgMHhkMWU0LCAweDA5MDQsIDB4YjZmNiwgMHg2MDQzLCAweDAwMDAsIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgxNTAwLCAweGQxY2MsIDB4MDkwNCwKKwkweGI2YzUsIDB4YTk3OCwgMHhhODY4LCAweGQwZmMsIDB4MDkwNCwgMHhiNjg2LCAweDAwMTYsIDB4YTg3YywKKwkweDAwMDYsIDB4YTg4MCwgMHgwMDA2LCAweDAwYTYsIDB4MjE1MCwgMHhiMTc0LCAweDkxODQsIDB4MDBmZiwKKwkweDkwYjYsIDB4MDAwMiwgMHgwOTA0LCAweGI2NTMsIDB4OTA4NiwgMHgwMDI4LCAweDE5MDQsIDB4YjYzZiwKKwkweGE4N2IsIDB4MDAxYywgMHhiMDdiLCAweDAwMWMsIDB4MDgwNCwgMHhiNjViLCAweDYwMjQsIDB4ZDBmNCwKKwkweDExZDAsIDB4YTgzOCwgMHhhYTM0LCAweDkyMDUsIDB4MDljOCwgMHhhODM4LCAweGFhOTAsIDB4OTIwNiwKKwkweDExMjAsIDB4YTg4YywgMHhhYTM0LCAweDkyMDYsIDB4MDk4OCwgMHg2MDI0LCAweGQwZDQsIDB4MTE0OCwKKwkweGE5YWMsIDB4YTgzNCwgMHg5MTAyLCAweDYwM2EsIDB4YTliMCwgMHhhODM4LCAweDkxMDMsIDB4NjAzZSwKKwkweDYwMjQsIDB4YzBmNSwgMHg2MDI2LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4M2MsIDB4ODAwMCwKKwkweGI4M2UsIDB4MDBiZSwgMHg5MDA2LCAweGE4NzYsIDB4YTg5MiwgMHhhODhlLCAweGE4N2MsIDB4YzBlNCwKKwkweGE4N2UsIDB4ZDBjYywgMHgwMTQwLCAweGMwY2MsIDB4YTg3ZSwgMHgwMDk2LCAweGE4NzgsIDB4MjA0OCwKKwkweDA4MGMsIDB4MGZlMywgMHgwMDllLCAweDA4MGMsIDB4YzE3MSwgMHgwODA0LCAweGI2ZjYsIDB4ZDFkYywKKwkweDAxNTgsIDB4YTg3YiwgMHgwMDE1LCAweGIwN2IsIDB4MDAxNSwgMHgwODBjLCAweGM0MDEsIDB4MDExOCwKKwkweGIxNzQsIDB4YzFkYywgMHhiMTc2LCAweDAwNzgsIDB4ZDFkNCwgMHgwMTI4LCAweGE4N2IsIDB4MDAwNywKKwkweGIwN2IsIDB4MDAwNywgMHgwMDQwLCAweGE4N2MsIDB4ZDBhYywgMHgwMTI4LCAweGE4MzQsIDB4YTkzOCwKKwkweDkxMTUsIDB4MTkwYywgMHhiNGVlLCAweGE4N2MsIDB4YjA3ZSwgMHhhODkwLCAweGIwOTIsIDB4YTg4YywKKwkweGIwOGUsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDE5LCAweDIwYTAsIDB4MjBhOSwKKwkweDAwMjAsIDB4OGEwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTA5NCwgMHgwMDNmLCAweDIyZTAsIDB4OTA4NCwKKwkweGZmYzAsIDB4OTA4MCwgMHgwMDE5LCAweDIwOTgsIDB4NDAwMywgMHgwMGFlLCAweDAwMGUsIDB4YTg4MiwKKwkweDAwMGUsIDB4YzBjYywgMHhhODdlLCAweDA4MGMsIDB4YzRkZSwgMHgwMDFlLCAweGE4NzQsIDB4MDAwNiwKKwkweDIxNDgsIDB4MDgwYywgMHgwZmUzLCAweDAwMWUsIDB4MDgwNCwgMHhiNmYyLCAweDAwMTYsIDB4MDBhNiwKKwkweDIxNTAsIDB4YjE3NCwgMHg5MTg0LCAweDAwZmYsIDB4OTBiNiwgMHgwMDAyLCAweDAxZTAsIDB4OTA4NiwKKwkweDAwMjgsIDB4MTEyOCwgMHhhODdiLCAweDAwMWMsIDB4YjA3YiwgMHgwMDFjLCAweDAwZTAsIDB4ZDFkYywKKwkweDAxNTgsIDB4YTg3YiwgMHgwMDE1LCAweGIwN2IsIDB4MDAxNSwgMHgwODBjLCAweGM0MDEsIDB4MDExOCwKKwkweGIxNzQsIDB4YzFkYywgMHhiMTc2LCAweDAwNzgsIDB4ZDFkNCwgMHgwMTI4LCAweGE4N2IsIDB4MDAwNywKKwkweGIwN2IsIDB4MDAwNywgMHgwMDQwLCAweGE4N2MsIDB4ZDBhYywgMHgwMTI4LCAweGE4MzQsIDB4YTkzOCwKKwkweDkxMTUsIDB4MTkwYywgMHhiNGVlLCAweGE4OTAsIDB4YjA5MiwgMHhhODhjLCAweGIwOGUsIDB4YTg3YywKKwkweGIwN2UsIDB4MDBhZSwgMHgwODBjLCAweDBmZTMsIDB4MDA5ZSwgMHgwODBjLCAweGM0ZGUsIDB4YTk3NCwKKwkweDAwMTYsIDB4MDgwYywgMHhiOWQ4LCAweDAwMWUsIDB4MDQ2OCwgMHhhODY3LCAweDAxMDMsIDB4YTk3NCwKKwkweDkxODQsIDB4MDBmZiwgMHg5MGI2LCAweDAwMDIsIDB4MDFiMCwgMHg5MDg2LCAweDAwMjgsIDB4MTExOCwKKwkweGE4N2IsIDB4MDAxYywgMHgwMGQwLCAweGQxZGMsIDB4MDE0OCwgMHhhODdiLCAweDAwMTUsIDB4MDgwYywKKwkweGM0MDEsIDB4MDExOCwgMHhhOTc0LCAweGMxZGMsIDB4YTk3NiwgMHgwMDc4LCAweGQxZDQsIDB4MDExOCwKKwkweGE4N2IsIDB4MDAwNywgMHgwMDUwLCAweGE4N2IsIDB4MDAwMCwgMHhhODdjLCAweGQwYWMsIDB4MDEyOCwKKwkweGE4MzQsIDB4YTkzOCwgMHg5MTE1LCAweDE5MGMsIDB4YjRlZSwgMHhhOTc0LCAweDAwMTYsIDB4MDgwYywKKwkweDY5MDQsIDB4MDAxZSwgMHhkMWU0LCAweDExMjAsIDB4MDgwYywgMHhhMGUzLCAweDAwOWUsIDB4MDAwNSwKKwkweDA4MGMsIDB4YzEzNywgMHgwY2Q4LCAweDYxMTQsIDB4MDA5NiwgMHgyMTQ4LCAweGE5N2MsIDB4ZDFlNCwKKwkweDE5MGMsIDB4MTlhMCwgMHgwMDllLCAweDAwMDUsIDB4MDgwYywgMHg4YjA0LCAweDAwMTAsIDB4MDgwYywKKwkweDhiYzAsIDB4MDgwYywgMHhiZTM3LCAweDAxZjAsIDB4MDA5NiwgMHg2MTE0LCAweDIxNDgsIDB4MDgwYywKKwkweGMwM2YsIDB4MTExOCwgMHgwODBjLCAweGFhODEsIDB4MDBhMCwgMHhhODY3LCAweDAxMDMsIDB4MjAwOSwKKwkweDE4MGMsIDB4MjEwYywgMHhkMThjLCAweDExYjgsIDB4ZDE4NCwgMHgxMTkwLCAweDYxMDgsIDB4YTk3YSwKKwkweDkxOGUsIDB4MDAyOSwgMHgxMTEwLCAweDA4MGMsIDB4ZGIyZSwgMHhhODc3LCAweDAwMDAsIDB4MDgwYywKKwkweDZhZTksIDB4MDA5ZSwgMHgwODBjLCAweGEwZTMsIDB4MDgwYywgMHg4YzEwLCAweDA4MDQsIDB4OGNlZCwKKwkweGE4N2IsIDB4MDAwNCwgMHgwYzkwLCAweGE4N2IsIDB4MDAwNCwgMHgwYzc4LCAweDkxODIsIDB4MDA1NCwKKwkweDEyMjAsIDB4OTE4MiwgMHgwMDQwLCAweDAyMDgsIDB4MDAwYSwgMHgwMDA1LCAweGI3NTIsIDB4Yjc1MiwKKwkweGI3NTIsIDB4Yjc1MiwgMHhiNzUyLCAweGI3NTQsIDB4Yjc1MiwgMHhiNzUyLCAweGI3NTIsIDB4Yjc1MiwKKwkweGI3NTIsIDB4Yjc1MiwgMHhiNzUyLCAweGI3NTIsIDB4Yjc1MiwgMHhiNzUyLCAweGI3NTIsIDB4Yjc1MiwKKwkweGI3NTIsIDB4Yjc1MiwgMHgwODBjLCAweDBkZmEsIDB4MDgwYywgMHg1NWUzLCAweDAxZjgsIDB4NjAxNCwKKwkweDcxNDQsIDB4OTE4YywgMHgwZmZmLCAweDkwMTYsIDB4ZDFjNCwgMHgwMTE4LCAweDcyNjQsIDB4OTI5NCwKKwkweDAwZmYsIDB4MDA5NiwgMHg5MDRkLCAweDAxODgsIDB4YTg3YiwgMHgwMDAwLCAweGE4NjQsIDB4OTA4NiwKKwkweDAxMzksIDB4MDEyOCwgMHhhODY3LCAweDAxMDMsIDB4YTk3NiwgMHhhYTk2LCAweDAwMzAsIDB4YTg5NywKKwkweDQwMDAsIDB4YTk5YSwgMHhhYTllLCAweDA4MGMsIDB4NmFlOSwgMHgwMDllLCAweDA4MDQsIDB4YTBlMywKKwkweDkxODIsIDB4MDA4NSwgMHgwMDAyLCAweGI3OGEsIDB4Yjc4OCwgMHhiNzg4LCAweGI3OTYsIDB4Yjc4OCwKKwkweGI3ODgsIDB4Yjc4OCwgMHhiNzg4LCAweGI3ODgsIDB4Yjc4OCwgMHhiNzg4LCAweGI3ODgsIDB4Yjc4OCwKKwkweDA4MGMsIDB4MGRmYSwgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgwODBjLCAweDg2NzksIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDhjMTAsIDB4MDEyZSwgMHgwMDA1LCAweDAwMjYsIDB4MDA1NiwKKwkweDAwZDYsIDB4MDBlNiwgMHgyMDcxLCAweDAyNjAsIDB4NzIyNCwgMHg2MjE2LCAweDcyMjAsIDB4MDgwYywKKwkweGJlMjUsIDB4MDFmOCwgMHgyMjY4LCAweDY4MDAsIDB4OTA4NiwgMHgwMDAwLCAweDAxZDAsIDB4NjAxMCwKKwkweDZkMTAsIDB4OTUyZSwgMHgxMWIwLCAweDAwYzYsIDB4MmQ2MCwgMHgwMGQ2LCAweDA4MGMsIDB4YmE0OSwKKwkweDAwZGUsIDB4MDBjZSwgMHgwMTU4LCAweDcwMmMsIDB4ZDA4NCwgMHgxMTE4LCAweDA4MGMsIDB4YmExMywKKwkweDAwMTAsIDB4NjgwMywgMHgwMDAyLCAweDYwMDcsIDB4MDA4NiwgMHgwMDI4LCAweDA4MGMsIDB4YmEzNSwKKwkweDBkOTAsIDB4NjAwNywgMHgwMDg3LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDg2NzksIDB4MDgwYywKKwkweDhjMTAsIDB4NzIyMCwgMHgwODBjLCAweGJlMjUsIDB4MDE3OCwgMHg2ODEwLCAweDAwYjYsIDB4MjA1OCwKKwkweGI4MDAsIDB4MDBiZSwgMHhkMGJjLCAweDAxNDAsIDB4NjgyNCwgMHhkMGVjLCAweDAxMjgsIDB4MDBjNiwKKwkweDJkNjAsIDB4MDgwYywgMHhjMTcxLCAweDAwY2UsIDB4MDBlZSwgMHgwMGRlLCAweDAwNWUsIDB4MDAyZSwKKwkweDAwMDUsIDB4OTE4NiwgMHgwMDEzLCAweDExNjAsIDB4NjAwNCwgMHg5MDhhLCAweDAwODUsIDB4MGEwYywKKwkweDBkZmEsIDB4OTA4YSwgMHgwMDkyLCAweDFhMGMsIDB4MGRmYSwgMHg5MDgyLCAweDAwODUsIDB4MDBlMiwKKwkweDkxODYsIDB4MDAyNywgMHgwMTIwLCAweDkxODYsIDB4MDAxNCwgMHgxOTBjLCAweDBkZmEsIDB4MDgwYywKKwkweDhiMDQsIDB4MDA5NiwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhiZTM3LCAweDAxNDAsIDB4YTg2NywKKwkweDAxMDMsIDB4YTg3NywgMHgwMDAwLCAweGE4N2IsIDB4MDAyOSwgMHgwODBjLCAweDZhZTksIDB4MDA5ZSwKKwkweDA4MGMsIDB4YTExMywgMHgwODA0LCAweDhjMTAsIDB4YjgxOSwgMHhiODFiLCAweGI4MWIsIDB4YjgxOSwKKwkweGI4MTksIDB4YjgxOSwgMHhiODE5LCAweGI4MTksIDB4YjgxOSwgMHhiODE5LCAweGI4MTksIDB4YjgxOSwKKwkweGI4MTksIDB4MDgwYywgMHgwZGZhLCAweDA4MGMsIDB4OGIwNCwgMHgwODBjLCAweGExMTMsIDB4MDgwYywKKwkweDhjMTAsIDB4MDAwNSwgMHg5MTg2LCAweDAwMTMsIDB4MTEyOCwgMHg2MDA0LCAweDkwODIsIDB4MDA4NSwKKwkweDIwMDgsIDB4MDRiOCwgMHg5MTg2LCAweDAwMjcsIDB4MTFmOCwgMHgwODBjLCAweDhiMDQsIDB4MDgwYywKKwkweDMxOGIsIDB4MDgwYywgMHhjNTRlLCAweDAwOTYsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4YmUzNywKKwkweDAxNTAsIDB4YTg2NywgMHgwMTAzLCAweGE4NzcsIDB4MDAwMCwgMHhhODdiLCAweDAwMjksIDB4MDgwYywKKwkweDZhZTksIDB4MDgwYywgMHhjMDIyLCAweDAwOWUsIDB4MDgwYywgMHhhMGUzLCAweDA4MGMsIDB4OGMxMCwKKwkweDAwMDUsIDB4MDgwYywgMHhhMTc4LCAweDBjZTAsIDB4OTE4NiwgMHgwMDE0LCAweDFkZDAsIDB4MDgwYywKKwkweDhiMDQsIDB4MDA5NiwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhiZTM3LCAweDBkNjAsIDB4YTg2NywKKwkweDAxMDMsIDB4YTg3NywgMHgwMDAwLCAweGE4N2IsIDB4MDAwNiwgMHhhODgwLCAweGMwZWMsIDB4YTg4MiwKKwkweDA4ZjAsIDB4MDAwMiwgMHhiODcxLCAweGI4NmYsIDB4Yjg2ZiwgMHhiODZmLCAweGI4NmYsIDB4Yjg2ZiwKKwkweGI4ODksIDB4Yjg2ZiwgMHhiODZmLCAweGI4NmYsIDB4Yjg2ZiwgMHhiODZmLCAweGI4NmYsIDB4MDgwYywKKwkweDBkZmEsIDB4MDgwYywgMHg4YjA0LCAweDYwMzQsIDB4OTA4YywgMHhmZjAwLCAweDgxMGYsIDB4OTE4NiwKKwkweDAwMzksIDB4MDExOCwgMHg5MTg2LCAweDAwMzUsIDB4MTExOCwgMHgyMDAxLCAweDE5NWUsIDB4MDAxMCwKKwkweDIwMDEsIDB4MTk1ZiwgMHgyMDA0LCAweDYwMWEsIDB4NjAwMywgMHgwMDBjLCAweDA4MGMsIDB4OGMxMCwKKwkweDAwMDUsIDB4MDgwYywgMHg4YjA0LCAweDYwMzQsIDB4OTA4YywgMHhmZjAwLCAweDgxMGYsIDB4OTE4NiwKKwkweDAwMzksIDB4MDExOCwgMHg5MTg2LCAweDAwMzUsIDB4MTExOCwgMHgyMDAxLCAweDE5NWUsIDB4MDAxMCwKKwkweDIwMDEsIDB4MTk1ZiwgMHgyMDA0LCAweDYwMWEsIDB4NjAwMywgMHgwMDBlLCAweDA4MGMsIDB4OGMxMCwKKwkweDAwMDUsIDB4OTE4MiwgMHgwMDkyLCAweDEyMjAsIDB4OTE4MiwgMHgwMDg1LCAweDAyMDgsIDB4MDAxMiwKKwkweDA4MDQsIDB4YTE3OCwgMHhiOGI3LCAweGI4YjcsIDB4YjhiNywgMHhiOGI3LCAweGI4YjksIDB4YjkwNiwKKwkweGI4YjcsIDB4YjhiNywgMHhiOGI3LCAweGI4YjcsIDB4YjhiNywgMHhiOGI3LCAweGI4YjcsIDB4MDgwYywKKwkweDBkZmEsIDB4MDA5NiwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywKKwkweDAxNjgsIDB4NjAzNCwgMHg5MDhjLCAweGZmMDAsIDB4ODEwZiwgMHg5MTg2LCAweDAwMzksIDB4MDExOCwKKwkweDkxODYsIDB4MDAzNSwgMHgxMTE4LCAweDAwOWUsIDB4MDgwNCwgMHhiOTFhLCAweDA4MGMsIDB4YmUzNywKKwkweDExMTgsIDB4MDgwYywgMHhjMDIyLCAweDAwNjgsIDB4NjAxNCwgMHgyMDQ4LCAweGE4N2MsIDB4ZDBlNCwKKwkweDExMTAsIDB4MDgwYywgMHhjMDIyLCAweGE4NjcsIDB4MDEwMywgMHgwODBjLCAweGM1MTksIDB4MDgwYywKKwkweDZhZTksIDB4MDBkNiwgMHgyYzY4LCAweDA4MGMsIDB4YTA4ZCwgMHgwMWQwLCAweDYwMDMsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDAxZSwgMHg2MDBiLCAweGZmZmYsIDB4MjAwOSwgMHgwMjZlLCAweDIxMGMsIDB4NjEzYSwKKwkweDIwMDksIDB4MDI2ZiwgMHgyMTBjLCAweDYxM2UsIDB4NjkxMCwgMHg2MTEyLCAweDA4MGMsIDB4YzJiMywKKwkweDY5NTQsIDB4NjE1NiwgMHg2MDIzLCAweDAwMDEsIDB4MDgwYywgMHg4Njc5LCAweDA4MGMsIDB4OGMxMCwKKwkweDJkNjAsIDB4MDBkZSwgMHgwODBjLCAweGEwZTMsIDB4MDA5ZSwgMHgwMDA1LCAweDYwMTAsIDB4MDBiNiwKKwkweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MDVhMCwgMHg2MDM0LCAweDkwOGMsIDB4ZmYwMCwKKwkweDgxMGYsIDB4OTE4NiwgMHgwMDM1LCAweDAxMzAsIDB4OTE4NiwgMHgwMDFlLCAweDAxMTgsIDB4OTE4NiwKKwkweDAwMzksIDB4MTUzOCwgMHgwMGQ2LCAweDJjNjgsIDB4MDgwYywgMHhjNGIxLCAweDExZjAsIDB4MDgwYywKKwkweGEwOGQsIDB4MDFkOCwgMHg2MTA2LCAweDYwMDMsIDB4MDAwMSwgMHg2MDIzLCAweDAwMDEsIDB4NjkxMCwKKwkweDYxMTIsIDB4NjkyYywgMHg2MTJlLCAweDY5MzAsIDB4NjEzMiwgMHg2OTM0LCAweDkxOGMsIDB4MDBmZiwKKwkweDYxMzYsIDB4NjkzOCwgMHg2MTNhLCAweDY5M2MsIDB4NjEzZSwgMHg2OTU0LCAweDYxNTYsIDB4MDgwYywKKwkweGMyYjMsIDB4MDgwYywgMHg4Njc5LCAweDA4MGMsIDB4OGMxMCwgMHgyZDYwLCAweDAwZGUsIDB4MDgwNCwKKwkweGEwZTMsIDB4MDA5NiwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhiZTM3LCAweDAxYzgsIDB4YTg2NywKKwkweDAxMDMsIDB4YTg4MCwgMHhkMGI0LCAweDAxMjgsIDB4YzBlYywgMHhhODgyLCAweGE4N2IsIDB4MDAwNiwKKwkweDAwNDgsIDB4ZDBiYywgMHgwMTE4LCAweGE4N2IsIDB4MDAwMiwgMHgwMDIwLCAweGE4N2IsIDB4MDAwNSwKKwkweDA4MGMsIDB4YzEzMywgMHhhODc3LCAweDAwMDAsIDB4MDgwYywgMHg2YWU5LCAweDA4MGMsIDB4YzAyMiwKKwkweDAwOWUsIDB4MDgwNCwgMHhhMGUzLCAweDAwMTYsIDB4MDA5NiwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywKKwkweGJlMzcsIDB4MDE0MCwgMHhhODY3LCAweDAxMDMsIDB4YTg3YiwgMHgwMDI4LCAweGE4NzcsIDB4MDAwMCwKKwkweDA4MGMsIDB4NmFlOSwgMHgwMDllLCAweDAwMWUsIDB4OTE4NiwgMHgwMDEzLCAweDAxNDgsIDB4OTE4NiwKKwkweDAwMTQsIDB4MDEzMCwgMHg5MTg2LCAweDAwMjcsIDB4MDExOCwgMHgwODBjLCAweGExNzgsIDB4MDAzMCwKKwkweDA4MGMsIDB4OGIwNCwgMHgwODBjLCAweGExMTMsIDB4MDgwYywgMHg4YzEwLCAweDAwMDUsIDB4MDA1NiwKKwkweDAwNjYsIDB4MDA5NiwgMHgwMGE2LCAweDIwMjksIDB4MDAwMSwgMHg5MTgyLCAweDAxMDEsIDB4MTIwOCwKKwkweDAwMTAsIDB4MjAwOSwgMHgwMTAwLCAweDIxMzAsIDB4ODMwNCwgMHg5MDk4LCAweDAwMTgsIDB4MjAwOSwKKwkweDAwMjAsIDB4MjAxMSwgMHgwMDI5LCAweDA4MGMsIDB4YjllOCwgMHg5NmIyLCAweDAwMjAsIDB4YjAwNCwKKwkweDkwNGQsIDB4MDExMCwgMHgwODBjLCAweDBmZTMsIDB4MDgwYywgMHgxMDMxLCAweDA1MjAsIDB4ODUyOCwKKwkweGE4NjcsIDB4MDExMCwgMHhhODZiLCAweDAwMDAsIDB4MjkyMCwgMHhiNDA2LCAweDk2OGEsIDB4MDAzZCwKKwkweDEyMjgsIDB4MjYwOCwgMHgyMDExLCAweDAwMWIsIDB4MDQ5OSwgMHgwMGE4LCAweDk2YjIsIDB4MDAzYywKKwkweDIwMDksIDB4MDAzYywgMHgyOTUwLCAweDIwMTEsIDB4MDAxYiwgMHgwNDUxLCAweDBjMjgsIDB4MjAwMSwKKwkweDAyMDUsIDB4MjAwMywgMHgwMDAwLCAweDAwYWUsIDB4ODUyZiwgMHg5NWFkLCAweDAwMDMsIDB4YjU2NiwKKwkweDk1YWMsIDB4MDAwMCwgMHgwMDQ4LCAweDIwMDEsIDB4MDIwNSwgMHgyMDAzLCAweDAwMDAsIDB4MDBhZSwKKwkweDg1MmYsIDB4OTVhZCwgMHgwMDAzLCAweGI1NjYsIDB4MDA5ZSwgMHgwMDZlLCAweDAwNWUsIDB4MDAwNSwKKwkweDAwYTYsIDB4ODlmZiwgMHgwMTU4LCAweGE4MDQsIDB4OTA1NSwgMHgwMTMwLCAweGE4MDcsIDB4MDAwMCwKKwkweDA4MGMsIDB4NmFlOSwgMHgyYTQ4LCAweDBjYjgsIDB4MDgwYywgMHg2YWU5LCAweDAwYWUsIDB4MDAwNSwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMjAwLCAweDc4MTQsIDB4OTA4NSwgMHgwMDgwLCAweDc4MTYsIDB4ZDE4NCwKKwkweDAxMDgsIDB4ODEwOCwgMHg4MTBjLCAweDIwYTksIDB4MDAwMSwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywKKwkweDkyMDAsIDB4MjBhMCwgMHgyMGUxLCAweDAwMDAsIDB4MjMwMCwgMHg5ZTAwLCAweDIwOTgsIDB4NDAwMywKKwkweDgzMTgsIDB4OTM4NiwgMHgwMDIwLCAweDExNDgsIDB4MjAxOCwgMHgyMzAwLCAweDllMDAsIDB4MjA5OCwKKwkweDc4MTQsIDB4ODAwMCwgMHg5MDg1LCAweDAwODAsIDB4NzgxNiwgMHg4MTA5LCAweDFkODAsIDB4NzgxNywKKwkweDAwMDAsIDB4MDBmZSwgMHgwMDA1LCAweDY5MjAsIDB4OTE4NiwgMHgwMDAzLCAweDAxMTgsIDB4OTE4NiwKKwkweDAwMDIsIDB4MTFkMCwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgyZDYwLCAweDAwOTYsIDB4NjAxNCwKKwkweDIwNDgsIDB4MDgwYywgMHhiZTM3LCAweDAxNTAsIDB4MjAwMSwgMHgwMDA2LCAweGE5ODAsIDB4YzFkNSwKKwkweDA4MGMsIDB4NmQxNywgMHgwODBjLCAweDZhZGMsIDB4MDgwYywgMHhjMDIyLCAweDAwOWUsIDB4MDgwYywKKwkweGExMTMsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGM2LCAweDcwMmMsIDB4ZDA4NCwKKwkweDExNzAsIDB4NjAwOCwgMHgyMDYwLCAweDYwMjAsIDB4OTA4NiwgMHgwMDAyLCAweDExNDAsIDB4NjEwNCwKKwkweDkxODYsIDB4MDA4NSwgMHgwMTE4LCAweDkxODYsIDB4MDA4YiwgMHgxMTA4LCAweDkwMDYsIDB4MDBjZSwKKwkweDAwMDUsIDB4MDA2NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDMxLCAweDAwMDEsIDB4NjAyMCwKKwkweDkwODQsIDB4MDAwZiwgMHgwMDgzLCAweDAxMmUsIDB4MDA2ZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDA2NiwgMHgyMDMxLCAweDAwMDAsIDB4NjAyMCwgMHg5MDg0LCAweDAwMGYsIDB4MDAxYiwKKwkweDAwNmUsIDB4MDEyZSwgMHgwMDA1LCAweGJhODQsIDB4YmE4NCwgMHhiYTdmLCAweGJhYTYsIDB4YmE3MiwKKwkweGJhN2YsIDB4YmFhNiwgMHhiYTdmLCAweGJhNzIsIDB4YmE3MiwgMHhiYTdmLCAweGJhN2YsIDB4YmE3ZiwKKwkweGJhNzIsIDB4YmE3MiwgMHgwODBjLCAweDBkZmEsIDB4MDAzNiwgMHgyMDE5LCAweDAwMTAsIDB4MDgwYywKKwkweGQ0NDAsIDB4NjAyMywgMHgwMDA2LCAweDYwMDMsIDB4MDAwNywgMHgwMDNlLCAweDAwMDUsIDB4OTAwNiwKKwkweDAwMDUsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDA5NiwgMHg4NmZmLCAweDExZDgsIDB4NjAxNCwKKwkweDIwNDgsIDB4MDgwYywgMHhiZTM3LCAweDAxYzAsIDB4YTg2NCwgMHg5MDg2LCAweDAxMzksIDB4MTEyOCwKKwkweGE4N2IsIDB4MDAwNSwgMHhhODgzLCAweDAwMDAsIDB4MDAyOCwgMHg5MDBlLCAweDIwMDEsIDB4MDAwNSwKKwkweDA4MGMsIDB4NmQxNywgMHgwODBjLCAweGMxMzMsIDB4MDgwYywgMHg2YWRjLCAweDA4MGMsIDB4YTExMywKKwkweDkwODUsIDB4MDAwMSwgMHgwMDllLCAweDAwMDUsIDB4OTAwNiwgMHgwY2UwLCAweDYwMDAsIDB4OTA4YSwKKwkweDAwMTYsIDB4MWEwYywgMHgwZGZhLCAweDAwMDIsIDB4YmFiYywgMHhiYWVjLCAweGJhYmUsIDB4YmIwZCwKKwkweGJhZTcsIDB4YmFiYywgMHhiYTdmLCAweGJhODQsIDB4YmE4NCwgMHhiYTdmLCAweGJhN2YsIDB4YmE3ZiwKKwkweGJhN2YsIDB4YmE3ZiwgMHhiYTdmLCAweGJhN2YsIDB4MDgwYywgMHgwZGZhLCAweDg2ZmYsIDB4MTUyMCwKKwkweDYwMjAsIDB4OTA4NiwgMHgwMDA2LCAweDA1MDAsIDB4MDA5NiwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywKKwkweGJlMzcsIDB4MDE2OCwgMHhhODdjLCAweGQwY2MsIDB4MDE0MCwgMHgwMDk2LCAweGMwY2MsIDB4YTg3ZSwKKwkweGE4NzgsIDB4MjA0OCwgMHgwODBjLCAweDBmZTMsIDB4MDA5ZSwgMHgwODBjLCAweGMxMzMsIDB4MDA5ZSwKKwkweDA4MGMsIDB4YzRmMywgMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMjMsIDB4MDAwMiwKKwkweDA4MGMsIDB4ODY3OSwgMHgwODBjLCAweDhjMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDA2NiwKKwkweDA4MGMsIDB4MTliNCwgMHgwMDZlLCAweDA4OTAsIDB4MDBlNiwgMHgyMDcxLCAweDE5YmYsIDB4NzAyNCwKKwkweDljMDYsIDB4MTEyMCwgMHgwODBjLCAweDk5MjcsIDB4MDBlZSwgMHgwODQwLCAweDYwMjAsIDB4OTA4NCwKKwkweDAwMGYsIDB4OTA4NiwgMHgwMDA2LCAweDExNTAsIDB4MDA4NiwgMHgwMDk2LCAweDIwNDksIDB4MDAwMSwKKwkweDJjNDAsIDB4MDgwYywgMHg5YTU4LCAweDAwOWUsIDB4MDA4ZSwgMHgwMDEwLCAweDA4MGMsIDB4OTgyNCwKKwkweDAwZWUsIDB4MTkwNCwgMHhiYWJlLCAweDA4MDQsIDB4YmE3ZiwgMHgwMDM2LCAweDAwZTYsIDB4MjA3MSwKKwkweDE5YmYsIDB4NzAzYywgMHg5YzA2LCAweDExMzgsIDB4OTAxZSwgMHgwODBjLCAweDk5OWQsIDB4MDBlZSwKKwkweDAwM2UsIDB4MDgwNCwgMHhiYWJlLCAweDA4MGMsIDB4OWI4OCwgMHgwMGVlLCAweDAwM2UsIDB4MTkwNCwKKwkweGJhYmUsIDB4MDgwNCwgMHhiYTdmLCAweDAwYzYsIDB4NjAyMCwgMHg5MDg0LCAweDAwMGYsIDB4MDAxMywKKwkweDAwY2UsIDB4MDAwNSwgMHhiYjQwLCAweGJjMGIsIDB4YmQ3NSwgMHhiYjRhLCAweGExMTMsIDB4YmI0MCwKKwkweGQ0MzIsIDB4YzU1YiwgMHhiYzBiLCAweGJiMzksIDB4YmUwMSwgMHhiYjM5LCAweGJiMzksIDB4YmIzOSwKKwkweGJiMzksIDB4MDgwYywgMHgwZGZhLCAweDA4MGMsIDB4YzAzZiwgMHgxMTEwLCAweDA4MGMsIDB4YWE4MSwKKwkweDAwMDUsIDB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4OGMxMCwgMHgwODA0LCAweGEwZTMsIDB4NjAxYiwKKwkweDAwMDEsIDB4MDAwNSwgMHgwODBjLCAweGJlMzcsIDB4MDEzMCwgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwKKwkweDJjMDAsIDB4YTg5NiwgMHgwMDllLCAweDYwMDAsIDB4OTA4YSwgMHgwMDE2LCAweDFhMGMsIDB4MGRmYSwKKwkweDAwMDIsIDB4YmI2OSwgMHhiYjZiLCAweGJiOGYsIDB4YmJhMywgMHhiYmM5LCAweGJiNjksIDB4YmI0MCwKKwkweGJiNDAsIDB4YmI0MCwgMHhiYmEzLCAweGJiYTMsIDB4YmI2OSwgMHhiYjY5LCAweGJiNjksIDB4YmI2OSwKKwkweGJiYWQsIDB4MDgwYywgMHgwZGZhLCAweDAwZTYsIDB4NjAxNCwgMHgwMDk2LCAweDIwNDgsIDB4YTg4MCwKKwkweGMwYjUsIDB4YTg4MiwgMHgwMDllLCAweDIwNzEsIDB4MTliZiwgMHg3MDI0LCAweDljMDYsIDB4MDFhMCwKKwkweDA4MGMsIDB4OTgyNCwgMHgwODBjLCAweGM0ZjMsIDB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwKKwkweDYwMjMsIDB4MDAwMiwgMHgyMDAxLCAweDE5NWYsIDB4MjAwNCwgMHg2MDFhLCAweDA4MGMsIDB4ODY3OSwKKwkweDA4MGMsIDB4OGMxMCwgMHgwMGVlLCAweDAwMDUsIDB4NjAxYiwgMHgwMDAxLCAweDBjZDgsIDB4MDA5NiwKKwkweDYwMTQsIDB4MjA0OCwgMHhhODgwLCAweGMwYjUsIDB4YTg4MiwgMHgwMDllLCAweDA4MGMsIDB4YzRmMywKKwkweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAyMywgMHgwMDAyLCAweDA4MGMsIDB4ODY3OSwKKwkweDA4MGMsIDB4OGMxMCwgMHgwMDA1LCAweDAwOTYsIDB4NjAxYiwgMHgwMDAxLCAweDYwMTQsIDB4MjA0OCwKKwkweGE4ODAsIDB4YzBiNSwgMHhhODgyLCAweDAwOWUsIDB4MDAwNSwgMHgwODBjLCAweDU1ZTMsIDB4MDFiOCwKKwkweDYwMTQsIDB4MDA5NiwgMHg5MDRkLCAweDAxOTAsIDB4YTg2NCwgMHhhODY3LCAweDAxMDMsIDB4YTg3YiwKKwkweDAwMDYsIDB4OTA4NiwgMHgwMTM5LCAweDExNTAsIDB4YTg2NywgMHgwMTM5LCAweGE4N2IsIDB4MDAzMCwKKwkweGE4OTcsIDB4NDAwNSwgMHhhODliLCAweDAwMDQsIDB4MDgwYywgMHg2YWU5LCAweDAwOWUsIDB4MDgwNCwKKwkweGEwZTMsIDB4NjAxNCwgMHgwMDk2LCAweDkwNGQsIDB4MDVjOCwgMHhhOTdjLCAweGQxZTQsIDB4MDViMCwKKwkweDIwMDEsIDB4MTgwZiwgMHgyMDA0LCAweGQwYzQsIDB4MDExMCwgMHgwMDllLCAweDAwMDUsIDB4YTg4NCwKKwkweDAwOWUsIDB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4OTEwOCwgMHg2MTFhLCAweDIwMDEsIDB4MDAzMCwKKwkweDJjMDgsIDB4MDgwYywgMHgxNThiLCAweDIwMDEsIDB4MDMwYywgMHgyMDA0LCAweDkwODYsIDB4MDA0MSwKKwkweDExYTAsIDB4NjAxNCwgMHgwMDk2LCAweDkwNGQsIDB4MDkwYywgMHgwZGZhLCAweGE4ODAsIDB4ZDBmNCwKKwkweDExMzAsIDB4YzBmNSwgMHhhODgyLCAweDAwOWUsIDB4NjAxYiwgMHgwMDAyLCAweDAwNzAsIDB4MDA5ZSwKKwkweDIwMDEsIDB4MDAzNywgMHgyYzA4LCAweDA4MGMsIDB4MTU4YiwgMHg2MDAwLCAweDkwODYsIDB4MDAwNCwKKwkweDExMjAsIDB4MjAwOSwgMHgwMDQ4LCAweDA4MGMsIDB4YTE1ZCwgMHgwMDA1LCAweDAwOWUsIDB4MDgwYywKKwkweDE5YjQsIDB4MDgwNCwgMHhiYjhmLCAweDYwMDAsIDB4OTA4YSwgMHgwMDE2LCAweDFhMGMsIDB4MGRmYSwKKwkweDAwMGIsIDB4MDAwNSwgMHhiYzIyLCAweGJiNDcsIDB4YmMyNCwgMHhiYzIyLCAweGJjMjQsIDB4YmMyNCwKKwkweGJiNDEsIDB4YmMyMiwgMHhiYjNiLCAweGJiM2IsIDB4YmMyMiwgMHhiYzIyLCAweGJjMjIsIDB4YmMyMiwKKwkweGJjMjIsIDB4YmMyMiwgMHgwODBjLCAweDBkZmEsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwNCwKKwkweDkwODQsIDB4MDBmZiwgMHgwMGJlLCAweDkwOGEsIDB4MDAwYywgMHgxYTBjLCAweDBkZmEsIDB4MDBiNiwKKwkweDAwMTMsIDB4MDBiZSwgMHgwMDA1LCAweGJjM2YsIDB4YmQwYywgMHhiYzQxLCAweGJjODEsIDB4YmM0MSwKKwkweGJjODEsIDB4YmM0MSwgMHhiYzRmLCAweGJjM2YsIDB4YmM4MSwgMHhiYzNmLCAweGJjNzAsIDB4MDgwYywKKwkweDBkZmEsIDB4NjAwNCwgMHg5MDhlLCAweDAwMTYsIDB4MDVjMCwgMHg5MDhlLCAweDAwMDQsIDB4MDVhOCwKKwkweDkwOGUsIDB4MDAwMiwgMHgwNTkwLCAweDkwOGUsIDB4MDA1MiwgMHgwOTA0LCAweGJkMDgsIDB4NjAwNCwKKwkweDA4MGMsIDB4YzAzZiwgMHgwOTA0LCAweGJkMjUsIDB4OTA4ZSwgMHgwMDA0LCAweDExMTAsIDB4MDgwYywKKwkweDMxYjQsIDB4OTA4ZSwgMHgwMDIxLCAweDA5MDQsIDB4YmQyOSwgMHg5MDhlLCAweDAwMjIsIDB4MDkwNCwKKwkweGJkNzAsIDB4OTA4ZSwgMHgwMDNkLCAweDA5MDQsIDB4YmQyOSwgMHg5MDhlLCAweDAwMzksIDB4MDkwNCwKKwkweGJkMmQsIDB4OTA4ZSwgMHgwMDM1LCAweDA5MDQsIDB4YmQyZCwgMHg5MDhlLCAweDAwMWUsIDB4MDE3OCwKKwkweDkwOGUsIDB4MDAwMSwgMHgxMTQwLCAweDYwMTAsIDB4MjA1OCwgMHhiODA0LCAweDkwODQsIDB4MDBmZiwKKwkweDkwODYsIDB4MDAwNiwgMHgwMTEwLCAweDA4MGMsIDB4MzE4YiwgMHgwODBjLCAweGFhODEsIDB4MDgwNCwKKwkweGExMTMsIDB4MDBjNiwgMHgwMGQ2LCAweDYxMDQsIDB4OTE4NiwgMHgwMDE2LCAweDA5MDQsIDB4YmNmOSwKKwkweDkxODYsIDB4MDAwMiwgMHgxOTA0LCAweGJjY2UsIDB4MjAwMSwgMHgxODM2LCAweDIwMDQsIDB4ZDA4YywKKwkweDExYzgsIDB4MDgwYywgMHg3MjA3LCAweDExYjAsIDB4MDgwYywgMHhjNTM5LCAweDAxMzgsIDB4MDgwYywKKwkweDcyMmEsIDB4MTEyMCwgMHgwODBjLCAweDcxMDUsIDB4MDgwNCwgMHhiZDU5LCAweDIwMDEsIDB4MTk1NSwKKwkweDIwMDMsIDB4MDAwMSwgMHgyMDAxLCAweDE4MDAsIDB4MjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NzEyNywKKwkweDA4MDQsIDB4YmQ1OSwgMHg2MDEwLCAweDIwNTgsIDB4MjAwMSwgMHgxODM2LCAweDIwMDQsIDB4ZDBhYywKKwkweDE5MDQsIDB4YmQ1OSwgMHhiOGEwLCAweDkwODQsIDB4ZmY4MCwgMHgxOTA0LCAweGJkNTksIDB4Yjg0MCwKKwkweDkwODQsIDB4MDBmZiwgMHg5MDA1LCAweDAxOTAsIDB4ODAwMSwgMHhiODQyLCAweDYwMTcsIDB4MDAwMCwKKwkweDYwMjMsIDB4MDAwNywgMHg2MDFiLCAweDAzOTgsIDB4NjA0MywgMHgwMDAwLCAweDA4MGMsIDB4YTA4ZCwKKwkweDAxMjgsIDB4MmIwMCwgMHg2MDEyLCAweDYwMjMsIDB4MDAwMSwgMHgwNDU4LCAweDAwZGUsIDB4MDBjZSwKKwkweDYwMDQsIDB4OTA4ZSwgMHgwMDAyLCAweDExYTAsIDB4NjAxMCwgMHgyMDU4LCAweGI4YTAsIDB4OTA4NiwKKwkweDAwN2UsIDB4MTE3MCwgMHgyMDA5LCAweDE4MzYsIDB4MjEwNCwgMHhjMDg1LCAweDIwMGEsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTgwMCwgMHgwODBjLCAweDVlYmUsIDB4MDBlZSwgMHgwODBjLCAweGFhODEsIDB4MDAzMCwKKwkweDA4MGMsIDB4YWE4MSwgMHgwODBjLCAweDMxOGIsIDB4MDgwYywgMHhjNTRlLCAweDAwZTYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDMxYjQsIDB4MDEyZSwgMHgwMGVlLCAweDA4MGMsIDB4YTExMywKKwkweDAwMDUsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NjNmMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywKKwkweDAwMDIsIDB4MDgwYywgMHg4NmMxLCAweDA4MGMsIDB4OGMxMCwgMHgwMGRlLCAweDAwY2UsIDB4MGM4MCwKKwkweDA4MGMsIDB4MzFiNCwgMHgwODA0LCAweGJjN2QsIDB4MDBjNiwgMHgwMGQ2LCAweDYxMDQsIDB4OTE4NiwKKwkweDAwMTYsIDB4MGQzOCwgMHg2MDEwLCAweDIwNTgsIDB4Yjg0MCwgMHg5MDg0LCAweDAwZmYsIDB4OTAwNSwKKwkweDA5MDQsIDB4YmNjZSwgMHg4MDAxLCAweGI4NDIsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4ODZjMSwKKwkweDA4MGMsIDB4OGMxMCwgMHgwMGRlLCAweDAwY2UsIDB4MDg5OCwgMHgwODBjLCAweGFhODEsIDB4MDgwNCwKKwkweGJjN2YsIDB4MDgwYywgMHhhYWJkLCAweDA4MDQsIDB4YmM3ZiwgMHgwMGQ2LCAweDJjNjgsIDB4NjEwNCwKKwkweDA4MGMsIDB4YzRiMSwgMHgwMGRlLCAweDAxMTgsIDB4MDgwYywgMHhhMGUzLCAweDA0MDgsIDB4NjAwNCwKKwkweDgwMDcsIDB4NjEzNCwgMHg5MThjLCAweDAwZmYsIDB4OTEwNSwgMHg2MDM2LCAweDYwMDcsIDB4MDA4NSwKKwkweDYwMDMsIDB4MDAwYiwgMHg2MDIzLCAweDAwMDIsIDB4NjAzYywgMHg2MDBhLCAweDIwMDEsIDB4MTk1ZiwKKwkweDIwMDQsIDB4NjAxYSwgMHg2MDJjLCAweDJjMDgsIDB4MjA2MCwgMHg2MDI0LCAweGQwYjQsIDB4MDEwOCwKKwkweGMwODUsIDB4YzBiNSwgMHg2MDI2LCAweDIxNjAsIDB4MDgwYywgMHg4Njc5LCAweDA4MGMsIDB4OGMxMCwKKwkweDAwMDUsIDB4MDBkZSwgMHgwMGNlLCAweDA4MGMsIDB4YWE4MSwgMHgwODBjLCAweDMxOGIsIDB4MDBlNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4MzFiNCwgMHg2MDE3LCAweDAwMDAsIDB4NjAyMywKKwkweDAwMDcsIDB4NjAxYiwgMHgwMzk4LCAweDYwNDMsIDB4MDAwMCwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwKKwkweDA4MGMsIDB4YTUxMywgMHgxOTA0LCAweGJkMjUsIDB4MDAwNSwgMHg2MDAwLCAweDkwOGEsIDB4MDAxNiwKKwkweDFhMGMsIDB4MGRmYSwgMHgwMDk2LCAweDAwZDYsIDB4MDAxYiwgMHgwMGRlLCAweDAwOWUsIDB4MDAwNSwKKwkweGJkOTAsIDB4YmQ5MCwgMHhiZDkwLCAweGJkOTAsIDB4YmQ5MCwgMHhiZDkwLCAweGJkOTAsIDB4YmQ5MCwKKwkweGJkOTAsIDB4YmI0MCwgMHhiZDkwLCAweGJiNDcsIDB4YmQ5MiwgMHhiYjQ3LCAweGJkYWMsIDB4YmQ5MCwKKwkweDA4MGMsIDB4MGRmYSwgMHg2MDA0LCAweDkwODYsIDB4MDA4YiwgMHgwMWIwLCAweDYwMzQsIDB4OTA4YywKKwkweGZmMDAsIDB4ODEwZiwgMHg5MTg2LCAweDAwMzUsIDB4MTEzMCwgMHg2MDJjLCAweDkwODAsIDB4MDAwOSwKKwkweDIwMGMsIDB4YzE4NSwgMHgyMTAyLCAweDYwMDcsIDB4MDA4YiwgMHg2MDAzLCAweDAwMGQsIDB4MDgwYywKKwkweDg2NzksIDB4MDgwYywgMHg4YzEwLCAweDAwMDUsIDB4MDgwYywgMHhjNTJkLCAweDAxMTgsIDB4MDgwYywKKwkweGM1NDAsIDB4MDAxMCwgMHgwODBjLCAweGM1NGUsIDB4MDgwYywgMHhjMDIyLCAweDA4MGMsIDB4YmUzNywKKwkweDA1NzAsIDB4MDgwYywgMHgzMThiLCAweDA4MGMsIDB4YmUzNywgMHgwMTY4LCAweDYwMTQsIDB4MjA0OCwKKwkweGE4NjcsIDB4MDEwMywgMHhhODdiLCAweDAwMDYsIDB4YTg3NywgMHgwMDAwLCAweGE4ODAsIDB4YzBlZCwKKwkweGE4ODIsIDB4MDgwYywgMHg2YWU5LCAweDJjNjgsIDB4MDgwYywgMHhhMDhkLCAweDAxNTAsIDB4NjgxMCwKKwkweDYwMTIsIDB4MDgwYywgMHhjMmIzLCAweDAwYzYsIDB4MmQ2MCwgMHgwODBjLCAweGExMTMsIDB4MDBjZSwKKwkweDAwMDgsIDB4MmQ2MCwgMHg2MDE3LCAweDAwMDAsIDB4NjAyMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwKKwkweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDg2YzEsIDB4MDgwYywgMHg4YzEwLCAweDAwYzgsIDB4MDgwYywKKwkweGM1MmQsIDB4MDEzOCwgMHg2MDM0LCAweDkwODYsIDB4NDAwMCwgMHgxMTE4LCAweDA4MGMsIDB4MzE4YiwKKwkweDA4ZDAsIDB4NjAzNCwgMHg5MDhjLCAweGZmMDAsIDB4ODEwZiwgMHg5MTg2LCAweDAwMzksIDB4MDExOCwKKwkweDkxODYsIDB4MDAzNSwgMHgxMTE4LCAweDA4MGMsIDB4MzE4YiwgMHgwODY4LCAweDA4MGMsIDB4YTExMywKKwkweDAwMDUsIDB4NjAwMCwgMHg5MDhhLCAweDAwMTYsIDB4MWEwYywgMHgwZGZhLCAweDAwMDIsIDB4YmUxNywKKwkweGJlMTcsIDB4YmUxOSwgMHhiZTE5LCAweGJlMTksIDB4YmUxNywgMHhiZTE3LCAweGExMTMsIDB4YmUxNywKKwkweGJlMTcsIDB4YmUxNywgMHhiZTE3LCAweGJlMTcsIDB4YmUxNywgMHhiZTE3LCAweGJlMTcsIDB4MDgwYywKKwkweDBkZmEsIDB4MDgwYywgMHg5Yjg4LCAweDYxMTQsIDB4MDA5NiwgMHgyMTQ4LCAweGE4N2IsIDB4MDAwNiwKKwkweDA4MGMsIDB4NmFlOSwgMHgwMDllLCAweDA4MDQsIDB4YTBlMywgMHg5Mjg0LCAweDAwMDcsIDB4MTE1OCwKKwkweDkyODIsIDB4MWNkMCwgMHgwMjQwLCAweDIwMDEsIDB4MTgxOSwgMHgyMDA0LCAweDkyMDIsIDB4MTIxOCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDkwMDYsIDB4MGNlOCwgMHgwMDk2LCAweDAwMjgsIDB4MDA5NiwKKwkweDAwMDYsIDB4NjAxNCwgMHgyMDQ4LCAweDAwMGUsIDB4MDAwNiwgMHg5OTg0LCAweGYwMDAsIDB4OTA4NiwKKwkweGYwMDAsIDB4MDExMCwgMHgwODBjLCAweDEwZGMsIDB4MDAwZSwgMHgwMDllLCAweDAwMDUsIDB4MDBlNiwKKwkweDAwYzYsIDB4MDAzNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjEsIDB4MWNkMCwKKwkweDIwNzEsIDB4MTgwMCwgMHg3MzUwLCAweDcwNzAsIDB4OTMwMiwgMHgxNjQwLCAweDYwMjAsIDB4OTIwNiwKKwkweDExZjgsIDB4MDgwYywgMHhjNTM5LCAweDAxODAsIDB4OTI4NiwgMHgwMDAxLCAweDExNjgsIDB4NjAwNCwKKwkweDkwODYsIDB4MDAwNCwgMHgxMTQ4LCAweDA4MGMsIDB4MzE4YiwgMHgwODBjLCAweGM1NGUsIDB4MDBjNiwKKwkweDA4MGMsIDB4YTExMywgMHgwMGNlLCAweDAwNjAsIDB4MDgwYywgMHhjMjJkLCAweDAxNDgsIDB4MDgwYywKKwkweGMwM2YsIDB4MTExMCwgMHgwODBjLCAweGFhODEsIDB4MDBjNiwgMHgwODBjLCAweGEwZTMsIDB4MDBjZSwKKwkweDljZTAsIDB4MDAxOCwgMHg3MDY0LCAweDljMDIsIDB4MTIwOCwgMHgwOGEwLCAweDAxMmUsIDB4MDAwZSwKKwkweDAwM2UsIDB4MDBjZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGM2LCAweDAwMTYsIDB4OTE4OCwKKwkweDEwMDAsIDB4MjEwYywgMHg4MWZmLCAweDAxMjgsIDB4MjA2MSwgMHgxYThhLCAweDYxMTIsIDB4MDgwYywKKwkweDMxOGIsIDB4OTAwNiwgMHgwMDEwLCAweDkwODUsIDB4MDAwMSwgMHgwMDFlLCAweDAwY2UsIDB4MDBlZSwKKwkweDAwMDUsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweGEwOGQsIDB4MDFiMCwKKwkweDY2NTYsIDB4MmIwMCwgMHg2MDEyLCAweDA4MGMsIDB4NTVlMywgMHgwMTE4LCAweDA4MGMsIDB4YmY2NiwKKwkweDAxNjgsIDB4MDgwYywgMHhjMmIzLCAweDYwMjMsIDB4MDAwMywgMHgyMDA5LCAweDAwNGIsIDB4MDgwYywKKwkweGExNWQsIDB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNkOCwKKwkweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YmFhMCwgMHgwODBjLCAweGExMzAsIDB4MDU2MCwKKwkweDYwNTcsIDB4MDAwMCwgMHgyYjAwLCAweDYwMTIsIDB4MDgwYywgMHhjMmIzLCAweDYwMjMsIDB4MDAwMywKKwkweDAwMTYsIDB4MDgwYywgMHg4ODAzLCAweDAwNzYsIDB4OTAzZSwgMHgwODBjLCAweDg2ZjEsIDB4MmMwOCwKKwkweDA4MGMsIDB4ZDVmNiwgMHgwMDdlLCAweDAwMWUsIDB4ZDE4NCwgMHgwMTI4LCAweDA4MGMsIDB4YTBlMywKKwkweDkwODUsIDB4MDAwMSwgMHgwMDcwLCAweDA4MGMsIDB4NTVlMywgMHgwMTI4LCAweGQxOGMsIDB4MTE3MCwKKwkweDA4MGMsIDB4YmY2NiwgMHgwMTQ4LCAweDIwMDksIDB4MDA0YywgMHgwODBjLCAweGExNWQsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LCAweDI5MDAsIDB4NjAxNiwKKwkweDBjOTAsIDB4MjAwOSwgMHgwMDRkLCAweDAwMTAsIDB4MjAwOSwgMHgwMDRlLCAweDAwZjYsIDB4MDBjNiwKKwkweDAwNDYsIDB4MDAxNiwgMHgwODBjLCAweGEwOGQsIDB4MmM3OCwgMHgwNWEwLCAweDdlNTYsIDB4MmIwMCwKKwkweDc4MTIsIDB4NzgyMywgMHgwMDAzLCAweDAwMTYsIDB4MjAyMSwgMHgwMDA1LCAweDA4MGMsIDB4YmY3OCwKKwkweDAwMWUsIDB4OTE4NiwgMHgwMDRkLCAweDAxMTgsIDB4OTE4NiwgMHgwMDRlLCAweDAxNDgsIDB4MjAwMSwKKwkweDE5NTgsIDB4MjAwYywgMHhkMWZjLCAweDAxNjgsIDB4MmY2MCwgMHgwODBjLCAweGEwZTMsIDB4MDBkMCwKKwkweDIwMDEsIDB4MTk1NywgMHgyMDBjLCAweGQxZmMsIDB4MDEyMCwgMHgyZjYwLCAweDA4MGMsIDB4YTBlMywKKwkweDAwODgsIDB4MmY2MCwgMHgwODBjLCAweDU1ZTMsIDB4MDEzOCwgMHhkMThjLCAweDExMTgsIDB4MDRmMSwKKwkweDAxNDgsIDB4MDAxMCwgMHgyOTAwLCAweDc4MTYsIDB4MDAxZSwgMHgwMDE2LCAweDA4MGMsIDB4YTE1ZCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDFlLCAweDAwNGUsIDB4MDBjZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwKKwkweDAwYzYsIDB4MDA0NiwgMHgwODBjLCAweGEwOGQsIDB4MmM3OCwgMHgwNTA4LCAweDdlNTYsIDB4MmIwMCwKKwkweDc4MTIsIDB4NzgyMywgMHgwMDAzLCAweDAwOTYsIDB4MjAyMSwgMHgwMDA0LCAweDA0ODksIDB4MDA5ZSwKKwkweDIwMDEsIDB4MTk1NiwgMHgyMDBjLCAweGQxZmMsIDB4MDEyMCwgMHgyZjYwLCAweDA4MGMsIDB4YTBlMywKKwkweDAwNjAsIDB4MmY2MCwgMHgwODBjLCAweDU1ZTMsIDB4MDEyMCwgMHhkMThjLCAweDExNjAsIDB4MDA3MSwKKwkweDAxMzAsIDB4MjAwOSwgMHgwMDUyLCAweDA4MGMsIDB4YTE1ZCwgMHg5MDg1LCAweDAwMDEsIDB4MDA0ZSwKKwkweDAwY2UsIDB4MDBmZSwgMHgwMDA1LCAweDI5MDAsIDB4NzgxNiwgMHgwYzk4LCAweDAwYzYsIDB4MDgwYywKKwkweDRhYmYsIDB4MDBjZSwgMHgxMTIwLCAweDA4MGMsIDB4YTBlMywgMHg5MDA2LCAweDAwMDUsIDB4YTg2NywKKwkweDAwMDAsIDB4YTg2YiwgMHg4MDAwLCAweDI5MDAsIDB4NjAxNiwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwKKwkweDAwOTYsIDB4MDA3NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDY1ZDMsIDB4MDE1OCwKKwkweDIwMDEsIDB4YmY3ZCwgMHgwMDA2LCAweDkwMGUsIDB4MjQwMCwgMHgwODBjLCAweDZkMTcsIDB4MDgwYywKKwkweDZhZTksIDB4MDAwZSwgMHgwODA3LCAweDI0MTgsIDB4MDgwYywgMHg4YTllLCAweGJhYTAsIDB4MDA4NiwKKwkweDIwNDEsIDB4MDAwMSwgMHgyMDM5LCAweDAwMDEsIDB4MjYwOCwgMHgwODBjLCAweDg4MWIsIDB4MDA4ZSwKKwkweDA4MGMsIDB4ODZmMSwgMHgyZjA4LCAweDI2NDgsIDB4MDgwYywgMHhkNWY2LCAweGI5M2MsIDB4ODFmZiwKKwkweDA5MGMsIDB4ODhlZSwgMHgwODBjLCAweDhjMTAsIDB4MDEyZSwgMHgwMDdlLCAweDAwOWUsIDB4MDAwNSwKKwkweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHhhMDhkLCAweDAxOTAsIDB4NjYwYSwKKwkweDJiMDgsIDB4NjExMiwgMHgwODBjLCAweGMyYjMsIDB4NjAyMywgMHgwMDAxLCAweDI5MDAsIDB4NjAxNiwKKwkweDIwMDksIDB4MDAxZiwgMHgwODBjLCAweGExNWQsIDB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwKKwkweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweGExMzAsIDB4MDFiOCwgMHg2NjBhLCAweDJiMDgsIDB4NjExMiwgMHgwODBjLCAweGMyYjMsIDB4NjAyMywKKwkweDAwMDgsIDB4MjkwMCwgMHg2MDE2LCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweDE2ZGIsIDB4MDBmZSwKKwkweDIwMDksIDB4MDAyMSwgMHgwODBjLCAweGExNWQsIDB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwKKwkweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LCAweDIwMDksIDB4MDAzZCwgMHgwMGM2LCAweDAxMjYsIDB4MDAxNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweGEwOGQsIDB4MDE5OCwgMHg2NjBhLCAweDJiMDgsIDB4NjExMiwKKwkweDA4MGMsIDB4YzJiMywgMHg2MDIzLCAweDAwMDEsIDB4MjkwMCwgMHg2MDE2LCAweDAwMWUsIDB4MDAxNiwKKwkweDA4MGMsIDB4YTE1ZCwgMHg5MDg1LCAweDAwMDEsIDB4MDAxZSwgMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwKKwkweDkwMDYsIDB4MGNkMCwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4YTEzMCwKKwkweDAxODgsIDB4MmIwOCwgMHg2MTEyLCAweDA4MGMsIDB4YzJiMywgMHg2MDIzLCAweDAwMDEsIDB4MjkwMCwKKwkweDYwMTYsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4YTE1ZCwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwKKwkweDAwY2UsIDB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4MjAwOSwgMHgwMDQ0LCAweDA4MzAsIDB4MjAwOSwKKwkweDAwNDksIDB4MDgxOCwgMHgwMDI2LCAweDAwYjYsIDB4NjIxMCwgMHgyMjU4LCAweGJhM2MsIDB4ODJmZiwKKwkweDAxMTAsIDB4ODIxMSwgMHhiYTNlLCAweDAwYmUsIDB4MDAyZSwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwKKwkweDYwMDQsIDB4OTA4ZSwgMHgwMDAyLCAweDAxNDAsIDB4OTA4ZSwgMHgwMDAzLCAweDAxMjgsIDB4OTA4ZSwKKwkweDAwMDQsIDB4MDExMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwKKwkweDAwODYsIDB4MDA5NiwgMHg2MDIwLCAweDkwODYsIDB4MDAwNCwgMHgwMWE4LCAweDYwMTQsIDB4OTA0ZCwKKwkweDA4MGMsIDB4YmUzNywgMHgwMTgwLCAweGE4NjQsIDB4OTA4NiwgMHgwMTM5LCAweDAxNzAsIDB4NjAyMCwKKwkweDkwYzYsIDB4MDAwMywgMHgwMTQwLCAweDkwYzYsIDB4MDAwMiwgMHgwMTI4LCAweGE4NjgsIDB4ZDBmYywKKwkweDAxMTAsIDB4OTAwNiwgMHgwMDEwLCAweDkwODUsIDB4MDAwMSwgMHgwMDllLCAweDAwOGUsIDB4MDAwZSwKKwkweDAwMDUsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweGExMzAsIDB4MDE5OCwKKwkweDJiMDgsIDB4NjExMiwgMHgwODBjLCAweGMyYjMsIDB4NjAyMywgMHgwMDAxLCAweDI5MDAsIDB4NjAxNiwKKwkweDA4MGMsIDB4MzE4YiwgMHgyMDA5LCAweDAwMjgsIDB4MDgwYywgMHhhMTVkLCAweDkwODUsIDB4MDAwMSwKKwkweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNkOCwgMHg5MTg2LCAweDAwMTUsIDB4MTFhOCwKKwkweDIwMTEsIDB4MTgyMywgMHgyMjA0LCAweDkwODYsIDB4MDA3NCwgMHgxMTc4LCAweDAwYjYsIDB4MDgwYywKKwkweGFkMGMsIDB4MDBiZSwgMHgwODBjLCAweGFmNGIsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAyOSwKKwkweDA4MGMsIDB4ODZjMSwgMHgwODBjLCAweDhjMTAsIDB4MDA3OCwgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwKKwkweGE4NjgsIDB4MDA5ZSwgMHhkMGZjLCAweDAxNDgsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4YzQ3MiwKKwkweDA4MGMsIDB4YWE4MSwgMHgwODBjLCAweGEwZTMsIDB4MDAwNSwgMHgwMDk2LCAweDYwMTQsIDB4OTA0ZCwKKwkweDA5MGMsIDB4MGRmYSwgMHhhODdiLCAweDAwMzAsIDB4YTg4MywgMHgwMDAwLCAweGE4OTcsIDB4NDAwNSwKKwkweGE4OWIsIDB4MDAwNCwgMHhhODY3LCAweDAxMzksIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweDZhZTksIDB4MDEyZSwgMHgwMDllLCAweDA4MGMsIDB4YTBlMywgMHgwYzMwLCAweDAwOTYsIDB4OTE4NiwKKwkweDAwMTYsIDB4MTEyOCwgMHgyMDAxLCAweDAwMDQsIDB4MDgwYywgMHg2M2YwLCAweDAwZTgsIDB4OTE4NiwKKwkweDAwMTUsIDB4MTUxMCwgMHgyMDExLCAweDE4MjMsIDB4MjIwNCwgMHg5MDg2LCAweDAwMTQsIDB4MTFlMCwKKwkweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweDA4MGMsIDB4NjUzYSwgMHgwMGJlLCAweDA4MGMsIDB4YjAxYywKKwkweDExOTgsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4Yjg5MCwgMHgwMGJlLCAweDkwMDUsIDB4MDE2MCwKKwkweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDYzZjAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4NjgsIDB4ZDBmYywKKwkweDAxNzAsIDB4MDgwYywgMHhhNGU3LCAweDAwNDgsIDB4NjAxNCwgMHgyMDQ4LCAweGE4NjgsIDB4ZDBmYywKKwkweDA1MjgsIDB4MDgwYywgMHhhYTgxLCAweDA4MGMsIDB4YTBlMywgMHgwMDllLCAweDAwMDUsIDB4NjAxNCwKKwkweDYzMTAsIDB4MjM1OCwgMHg5MDRkLCAweDA5MGMsIDB4MGRmYSwgMHhhODdiLCAweDAwMDAsIDB4YTg4MywKKwkweDAwMDAsIDB4YTg5NywgMHg0MDAwLCAweDkwMGUsIDB4MDgwYywgMHg2NmJmLCAweDExMDgsIDB4YzE4NSwKKwkweGI4MDAsIDB4ZDBiYywgMHgwMTA4LCAweGMxOGQsIDB4YTk5YSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4NmFlOSwgMHgwMTJlLCAweDA4MGMsIDB4YTBlMywgMHgwOGY4LCAweDYwMTQsIDB4OTA0ZCwKKwkweDA5MGMsIDB4MGRmYSwgMHhhODdiLCAweDAwMzAsIDB4YTg4MywgMHgwMDAwLCAweGE4OTcsIDB4NDAwNSwKKwkweGE4OWIsIDB4MDAwNCwgMHhhODY3LCAweDAxMzksIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweDZhZTksIDB4MDEyZSwgMHgwODBjLCAweGEwZTMsIDB4MDg0MCwgMHhhODc4LCAweDkwODYsIDB4MDAwNSwKKwkweDExMDgsIDB4MDAwOSwgMHgwMDA1LCAweGE4ODAsIDB4YzBhZCwgMHhhODgyLCAweDAwMDUsIDB4NjA0MywKKwkweDAwMDAsIDB4NjAxNywgMHgwMDAwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwNTAsIDB4MDgwYywKKwkweDg2NzksIDB4MDgwYywgMHg4YzEwLCAweDAwMDUsIDB4MDBjNiwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwKKwkweGI4MDAsIDB4MDBiZSwgMHhkMGJjLCAweDAxMjAsIDB4NjAyMCwgMHg5MDg0LCAweDAwMGYsIDB4MDAxMywKKwkweDAwY2UsIDB4MDAwNSwgMHhiYjQwLCAweGMxNjMsIDB4YzE2MywgMHhjMTY2LCAweGQ4ZDQsIDB4ZDhlZiwKKwkweGQ4ZjIsIDB4YmI0MCwgMHhiYjQwLCAweGJiNDAsIDB4YmI0MCwgMHhiYjQwLCAweGJiNDAsIDB4YmI0MCwKKwkweGJiNDAsIDB4MDgwYywgMHgwZGZhLCAweGEwMDEsIDB4YTAwMSwgMHgwMDA1LCAweDAwOTYsIDB4NjAxNCwKKwkweDkwNGQsIDB4MDExOCwgMHhhODdjLCAweGQwZTQsIDB4MTExMCwgMHgwMDllLCAweDAwMTAsIDB4MDA5ZSwKKwkweDAwMDUsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MDU1MCwKKwkweDIwMDEsIDB4MTgzMywgMHgyMDA0LCAweDkwMDUsIDB4MTU0MCwgMHgwMGY2LCAweDJjNzgsIDB4MDgwYywKKwkweGEwOGQsIDB4MDUwOCwgMHg3ODEwLCAweDYwMTIsIDB4MDgwYywgMHhjMmIzLCAweDc4MjAsIDB4OTA4NiwKKwkweDAwMDMsIDB4MDEyOCwgMHg3ODA4LCAweDYwM2EsIDB4MmYwMCwgMHg2MDNlLCAweDAwMjAsIDB4NzgwOCwKKwkweDYwM2UsIDB4MmYwMCwgMHg2MDNhLCAweDYwMmUsIDB4NjAyMywgMHgwMDAxLCAweDYwMDcsIDB4MDAzNSwKKwkweDYwMDMsIDB4MDAwMSwgMHg3OTU0LCAweDYxNTYsIDB4MDgwYywgMHg4Njc5LCAweDA4MGMsIDB4OGMxMCwKKwkweDJmNjAsIDB4MDBmZSwgMHgwMDA1LCAweDJmNjAsIDB4MDBmZSwgMHgyMDAxLCAweDE5NjAsIDB4MjAwNCwKKwkweDYwNDIsIDB4MDAwNSwgMHgwMDE2LCAweDAwOTYsIDB4NjgxNCwgMHgyMDQ4LCAweGE4N2MsIDB4ZDBlNCwKKwkweDAxODAsIDB4YzBlNCwgMHhhODdlLCAweGE4NzcsIDB4MDAwMCwgMHhhODkzLCAweDAwMDAsIDB4YTg4ZiwKKwkweDAwMDAsIDB4ZDBjYywgMHgwMTMwLCAweGMwY2MsIDB4YTg3ZSwgMHhhODc4LCAweDIwNDgsIDB4MDgwYywKKwkweDBmZTMsIDB4NjgzMCwgMHg2MDM2LCAweDkwOGUsIDB4MDAwMSwgMHgwMTQ4LCAweDY4MDMsIDB4MDAwMiwKKwkweDkwODYsIDB4MDAwNSwgMHgwMTcwLCAweDkwMDYsIDB4NjAyZSwgMHg2MDMyLCAweDAwZDAsIDB4NjgxYywKKwkweGMwODUsIDB4NjgxZSwgMHg2ODAzLCAweDAwMDQsIDB4NjgyNCwgMHhjMGY0LCAweDkwODUsIDB4MGMwMCwKKwkweDY4MjYsIDB4NjgxNCwgMHgyMDQ4LCAweGE4YWMsIDB4NjkzOCwgMHg5MTAyLCAweGE4YjAsIDB4NjkzYywKKwkweDkxMDMsIDB4MWU0OCwgMHg2ODNjLCAweDYwMmUsIDB4NjgzOCwgMHg5MDg0LCAweGZmZmMsIDB4NjgzYSwKKwkweDYwMzIsIDB4MmQwMCwgMHg2MDNhLCAweDY4MDgsIDB4NjAzZSwgMHg2OTEwLCAweDYxMTIsIDB4Njk1NCwKKwkweDYxNTYsIDB4NjAyMywgMHgwMDAxLCAweDYwMDcsIDB4MDAzOSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywKKwkweDg2NzksIDB4MDgwYywgMHg4YzEwLCAweDAwOWUsIDB4MDAxZSwgMHgwMDA1LCAweDYwMjQsIDB4ZDBkNCwKKwkweDA1MTAsIDB4ZDBmNCwgMHgxMWY4LCAweDYwMzgsIDB4OTQwYSwgMHg2MDNjLCAweDkzMDMsIDB4MDIzMCwKKwkweDkxMDUsIDB4MDEyMCwgMHg2MDI0LCAweGMwZDQsIDB4YzBmNSwgMHgwMDk4LCAweDY0M2EsIDB4NjMzZSwKKwkweGFjM2UsIDB4YWI0MiwgMHgwMDQ2LCAweDAwMzYsIDB4MjQwMCwgMHhhY2FjLCAweDk0MDIsIDB4YTgzNiwKKwkweDIzMDAsIDB4YWJiMCwgMHg5MzAzLCAweGE4M2EsIDB4MDAzZSwgMHgwMDRlLCAweDYwMjQsIDB4YzBkNCwKKwkweDAwMDAsIDB4NjAyNiwgMHgwMDA1LCAweGQwZjQsIDB4MTEzOCwgMHhhODNjLCAweDYwM2EsIDB4YTg0MCwKKwkweDYwM2UsIDB4NjAyNCwgMHhjMGY1LCAweDYwMjYsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4NjAwNCwKKwkweDkwOGUsIDB4MDAzNCwgMHgwMWI4LCAweDkwOGUsIDB4MDAzNSwgMHgwMWEwLCAweDkwOGUsIDB4MDAzNiwKKwkweDAxODgsIDB4OTA4ZSwgMHgwMDM3LCAweDAxNzAsIDB4OTA4ZSwgMHgwMDM4LCAweDAxNTgsIDB4OTA4ZSwKKwkweDAwMzksIDB4MDE0MCwgMHg5MDhlLCAweDAwM2EsIDB4MDEyOCwgMHg5MDhlLCAweDAwM2IsIDB4MDExMCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwKKwkweDAwMzYsIDB4MDBlNiwgMHgyMDAxLCAweDE5NWEsIDB4MjAwYywgMHg4MDAwLCAweDIwMTQsIDB4MjAwMSwKKwkweDAwMzIsIDB4MDgwYywgMHg4NGZmLCAweDIwMDEsIDB4MTk1ZSwgMHg4MmZmLCAweDExMTAsIDB4MjAxMSwKKwkweDAwMTQsIDB4MjIwMiwgMHgyMDAxLCAweDE5NWMsIDB4MjAwYywgMHg4MDAwLCAweDIwMTQsIDB4MjA3MSwKKwkweDE5NDQsIDB4NzExYSwgMHg3MjFlLCAweDIwMDEsIDB4MDA2NCwgMHgwODBjLCAweDg0ZmYsIDB4MjAwMSwKKwkweDE5NWYsIDB4ODJmZiwgMHgxMTEwLCAweDIwMTEsIDB4MDAxNCwgMHgyMjAyLCAweDIwMDEsIDB4MTk2MCwKKwkweDkyODgsIDB4MDAwYSwgMHgyMTAyLCAweDIwMDEsIDB4MWE2YiwgMHgyMTAyLCAweDIwMDEsIDB4MDAzMiwKKwkweDA4MGMsIDB4MTU4YiwgMHgwODBjLCAweDY3YTQsIDB4MDBlZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4MDBlNiwgMHgyMDAxLCAweDE5NWUsIDB4MjAwMywKKwkweDAwMjgsIDB4MjAwMSwgMHgxOTVmLCAweDIwMDMsIDB4MDAxNCwgMHgyMDcxLCAweDE5NDQsIDB4NzAxYiwKKwkweDAwMDAsIDB4NzAxZiwgMHgwN2QwLCAweDIwMDEsIDB4MTk2MCwgMHgyMDA5LCAweDAwMWUsIDB4MjEwMiwKKwkweDIwMDEsIDB4MWE2YiwgMHgyMTAyLCAweDIwMDEsIDB4MDAzMiwgMHgwODBjLCAweDE1OGIsIDB4MDBlZSwKKwkweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDAwOTYsIDB4NjA1OCwgMHg5MDRkLCAweDAxMTAsIDB4MDgwYywKKwkweDEwNjMsIDB4MDA5ZSwgMHgwMDA1LCAweDAwMDUsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4YTA4ZCwgMHgwMTgwLCAweDJiMDgsIDB4NjExMiwgMHgwY2E5LCAweDYwMjMsIDB4MDAwMSwKKwkweDI5MDAsIDB4NjAxNiwgMHgyMDA5LCAweDAwMzMsIDB4MDgwYywgMHhhMTVkLCAweDkwODUsIDB4MDAwMSwKKwkweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNkOCwgMHgwMDk2LCAweDAwZTYsIDB4MDBmNiwKKwkweDIwNzEsIDB4MTgwMCwgMHg5MTg2LCAweDAwMTUsIDB4MTUwMCwgMHg3MDhjLCAweDkwODYsIDB4MDAxOCwKKwkweDExZTAsIDB4NjAxNCwgMHgyMDQ4LCAweGFhM2MsIDB4ZDJlNCwgMHgxMTYwLCAweDJjNzgsIDB4MDgwYywKKwkweDhlMDMsIDB4MDFkOCwgMHg3MDc4LCAweGFhNTAsIDB4OTIwNiwgMHgxMTYwLCAweDcwN2MsIDB4YWE1NCwKKwkweDkyMDYsIDB4MTE0MCwgMHg2MjEwLCAweDAwYjYsIDB4MjI1OCwgMHhiYWEwLCAweDAwYmUsIDB4OTAwZSwKKwkweDA4MGMsIDB4MzFkNCwgMHgwODBjLCAweGE0ZTcsIDB4MDAyMCwgMHgwODBjLCAweGFhODEsIDB4MDgwYywKKwkweGEwZTMsIDB4MDBmZSwgMHgwMGVlLCAweDAwOWUsIDB4MDAwNSwgMHg3MDVjLCAweGFhNTQsIDB4OTIwNiwKKwkweDBkNDgsIDB4MGM4MCwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4YTA4ZCwKKwkweDAxODgsIDB4MmIwOCwgMHg2MTEyLCAweDA4MGMsIDB4YzJiMywgMHg2MDIzLCAweDAwMDEsIDB4MjkwMCwKKwkweDYwMTYsIDB4MjAwOSwgMHgwMDRkLCAweDA4MGMsIDB4YTE1ZCwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwKKwkweDAwY2UsIDB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDAwMTYsIDB4MDgwYywgMHhhMDhkLCAweDAxODAsIDB4MmIwOCwgMHg2MTEyLCAweDA4MGMsIDB4YzJiMywKKwkweDYwMjMsIDB4MDAwMSwgMHgyOTAwLCAweDYwMTYsIDB4MDAxZSwgMHgwODBjLCAweGExNWQsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsIDB4MDAxZSwgMHg5MDA2LCAweDBjZDAsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MDA2NiwgMHgwMDk2LCAweDAwZTYsIDB4MDBmNiwKKwkweDIwNzEsIDB4MTgwMCwgMHg5MTg2LCAweDAwMTUsIDB4MTU2OCwgMHg3MThjLCAweDYwMTQsIDB4MjA0OCwKKwkweGE4MTQsIDB4ODAwMywgMHg5MTA2LCAweDE1MzAsIDB4MjBlMSwgMHgwMDAwLCAweDIwMDEsIDB4MTk3OCwKKwkweDIwMDMsIDB4MDAwMCwgMHg2MDE0LCAweDIwNDgsIDB4YTgzMCwgMHgyMGE4LCAweDg5MDYsIDB4ODAwNiwKKwkweDgwMDcsIDB4OTA5NCwgMHgwMDNmLCAweDIyZTgsIDB4OTA4NCwgMHhmZmMwLCAweDkwODAsIDB4MDAxYiwKKwkweDIwYTAsIDB4MjAwMSwgMHgxOTc4LCAweDAwMTYsIDB4MjAwYywgMHgwODBjLCAweGNiMWQsIDB4MDAxZSwKKwkweGE4MDQsIDB4OTAwNSwgMHgwMTEwLCAweDIwNDgsIDB4MGMzOCwgMHg2MDE0LCAweDIwNDgsIDB4YTg2NywKKwkweDAxMDMsIDB4MDAxMCwgMHgwODBjLCAweGFhODEsIDB4MDgwYywgMHhhMGUzLCAweDAwZmUsIDB4MDBlZSwKKwkweDAwOWUsIDB4MDA2ZSwgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwKKwkweDAwOTYsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzEsIDB4MTgwMCwgMHg5MTg2LCAweDAwMTUsIDB4MTFiOCwKKwkweDcwOGMsIDB4OTA4NiwgMHgwMDA0LCAweDExOTgsIDB4NjAxNCwgMHgyMDQ4LCAweDJjNzgsIDB4MDgwYywKKwkweDhlMDMsIDB4MDFhOCwgMHg3MDc4LCAweGFhNzQsIDB4OTIwNiwgMHgxMTMwLCAweDcwN2MsIDB4YWE3OCwKKwkweDkyMDYsIDB4MTExMCwgMHgwODBjLCAweDMxOGIsIDB4MDgwYywgMHhhNGU3LCAweDAwMjAsIDB4MDgwYywKKwkweGFhODEsIDB4MDgwYywgMHhhMGUzLCAweDAwZmUsIDB4MDBlZSwgMHgwMDllLCAweDAwMDUsIDB4NzA1YywKKwkweGFhNzgsIDB4OTIwNiwgMHgwZDc4LCAweDBjODAsIDB4MDA5NiwgMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwKKwkweDE4MDAsIDB4OTE4NiwgMHgwMDE1LCAweDE1NTAsIDB4NzA4YywgMHg5MDg2LCAweDAwMDQsIDB4MTUzMCwKKwkweDYwMTQsIDB4MjA0OCwgMHgyYzc4LCAweDA4MGMsIDB4OGUwMywgMHgwNWYwLCAweDcwNzgsIDB4YWFjYywKKwkweDkyMDYsIDB4MTE4MCwgMHg3MDdjLCAweGFhZDAsIDB4OTIwNiwgMHgxMTYwLCAweDA4MGMsIDB4MzE4YiwKKwkweDAwMTYsIDB4YTk5OCwgMHhhYWIwLCAweDkyODQsIDB4MTAwMCwgMHhjMGZkLCAweDA4MGMsIDB4NTU4YSwKKwkweDAwMWUsIDB4MDAxMCwgMHgwODBjLCAweDUzNzUsIDB4MDgwYywgMHhiZTM3LCAweDA1MDgsIDB4YTg3YiwKKwkweDAwMDAsIDB4YTg4MywgMHgwMDAwLCAweGE4OTcsIDB4NDAwMCwgMHgwMDgwLCAweDA4MGMsIDB4YmUzNywKKwkweDAxYjgsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4NTM3NSwgMHgxZDcwLCAweGE4N2IsIDB4MDAzMCwKKwkweGE4ODMsIDB4MDAwMCwgMHhhODk3LCAweDQwMDUsIDB4YTg5YiwgMHgwMDA0LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4YTg2NywgMHgwMTM5LCAweDA4MGMsIDB4NmFlOSwgMHgwMTJlLCAweDA4MGMsIDB4YTBlMywKKwkweDAwZmUsIDB4MDBlZSwgMHgwMDllLCAweDAwMDUsIDB4NzA1YywgMHhhYWQwLCAweDkyMDYsIDB4MDkzMCwKKwkweDA4ODgsIDB4MDAxNiwgMHgwMDI2LCAweGE4N2MsIDB4ZDBhYywgMHgwMTc4LCAweGE5MzgsIDB4YWEzNCwKKwkweDIxMDAsIDB4OTIwNSwgMHgwMTUwLCAweGE4OTAsIDB4OTEwNiwgMHgxMTE4LCAweGE4OGMsIDB4OTIwNiwKKwkweDAxMjAsIDB4YTk5MiwgMHhhYThlLCAweDkwODUsIDB4MDAwMSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwKKwkweDAwYjYsIDB4MDBkNiwgMHgwMDM2LCAweDA4MGMsIDB4YmUzNywgMHgwOTA0LCAweGM0NmUsIDB4MDA5NiwKKwkweDYzMTQsIDB4MjM0OCwgMHhhODdhLCAweGE5ODIsIDB4OTI5ZSwgMHg0MDAwLCAweDE1ODAsIDB4NjMxMCwKKwkweDAwYzYsIDB4MjM1OCwgMHgyMDA5LCAweDAwMDAsIDB4YTg2OCwgMHhkMGY0LCAweDExNDAsIDB4MDgwYywKKwkweDY2YmYsIDB4MTEwOCwgMHhjMTg1LCAweGI4MDAsIDB4ZDBiYywgMHgwMTA4LCAweGMxOGQsIDB4YWE5NiwKKwkweGE5OWEsIDB4MjBhOSwgMHgwMDA0LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDkwODAsIDB4MDAzMSwKKwkweDIwYTAsIDB4YjhiNCwgMHgyMGUwLCAweGI4YjgsIDB4OTA4MCwgMHgwMDA2LCAweDIwOTgsIDB4MDgwYywKKwkweDBmYWUsIDB4MjBhOSwgMHgwMDA0LCAweGE4NWMsIDB4OTA4MCwgMHgwMDM1LCAweDIwYTAsIDB4YjhiOCwKKwkweDkwODAsIDB4MDAwYSwgMHgyMDk4LCAweDA4MGMsIDB4MGZhZSwgMHgwMGNlLCAweDAwOTAsIDB4YWE5NiwKKwkweDM5MTgsIDB4OTM5OCwgMHgwMDA3LCAweDIzMWMsIDB4NjAwNCwgMHg5MDg2LCAweDAwMTYsIDB4MDExMCwKKwkweGE4OWIsIDB4MDAwNCwgMHhhYmEyLCAweDYzMTAsIDB4MjM1OCwgMHhiODA0LCAweDkwODQsIDB4MDBmZiwKKwkweGE4OWUsIDB4MDgwYywgMHg2YWRjLCAweDYwMTcsIDB4MDAwMCwgMHgwMDllLCAweDAwM2UsIDB4MDBkZSwKKwkweDAwYmUsIDB4MDAwNSwgMHgwMDI2LCAweDAwMzYsIDB4MDA0NiwgMHgwMGI2LCAweDAwOTYsIDB4MDBmNiwKKwkweDYyMTQsIDB4MjI0OCwgMHg2MjEwLCAweDIyNTgsIDB4MjA3OSwgMHgwMjYwLCAweDkwOTYsIDB4MDAwMCwKKwkweDExYTAsIDB4YjgxNCwgMHg5MDg0LCAweDAwZmYsIDB4OTAwZSwgMHgwODBjLCAweDI3NmUsIDB4MjExOCwKKwkweDgzMWYsIDB4OTM5YywgMHhmZjAwLCAweDc4MzgsIDB4OTA4NCwgMHgwMGZmLCAweDkzMWQsIDB4N2MzYywKKwkweDIwMTEsIDB4ODAxOCwgMHgwODBjLCAweDRiMWYsIDB4MDBhOCwgMHg5MDk2LCAweDAwMDEsIDB4MTE0OCwKKwkweDg5ZmYsIDB4MDE4MCwgMHhhODliLCAweDAwMGQsIDB4NzgzOCwgMHhhOGE2LCAweDc4M2MsIDB4YThhYSwKKwkweDAwNDgsIDB4OTA5NiwgMHgwMDAyLCAweDExMzAsIDB4YTg5YiwgMHgwMDBkLCAweDc4MzgsIDB4YThhNiwKKwkweDc4M2MsIDB4YThhYSwgMHgwMGZlLCAweDAwOWUsIDB4MDBiZSwgMHgwMDRlLCAweDAwM2UsIDB4MDAyZSwKKwkweDAwMDUsIDB4MDBjNiwgMHgwMDI2LCAweDAwMTYsIDB4OTE4NiwgMHgwMDM1LCAweDAxMTAsIDB4NmEzOCwKKwkweDAwMDgsIDB4NmEyYywgMHgwODBjLCAweGJlMjUsIDB4MDFmMCwgMHgyMjYwLCAweDYxMjAsIDB4OTE4NiwKKwkweDAwMDMsIDB4MDExOCwgMHg5MTg2LCAweDAwMDYsIDB4MTE5MCwgMHg2ODM4LCAweDkyMDYsIDB4MDE0MCwKKwkweDY4M2MsIDB4OTIwNiwgMHgxMTYwLCAweDYxMDgsIDB4NjgzOCwgMHg5MTA2LCAweDExNDAsIDB4MDAyMCwKKwkweDYwMDgsIDB4NjkzYywgMHg5MTA2LCAweDExMTgsIDB4NjAxMCwgMHg2OTEwLCAweDkxMDYsIDB4MDAxZSwKKwkweDAwMmUsIDB4MDBjZSwgMHgwMDA1LCAweDkwODUsIDB4MDAwMSwgMHgwY2M4LCAweGE5NzQsIDB4ZDFjYywKKwkweDAxODgsIDB4OTE4YywgMHgwMGZmLCAweDkxOGUsIDB4MDAwMiwgMHgxMTYwLCAweGE5YTgsIDB4OTE4YywKKwkweDBmMDAsIDB4ODEwZiwgMHg5MThlLCAweDAwMDEsIDB4MTEyOCwgMHhhODM0LCAweGE5MzgsIDB4OTExNSwKKwkweDE5MGMsIDB4YjRlZSwgMHgwMDA1LCAweDAwMzYsIDB4MjAxOSwgMHgwMDAxLCAweDAwMTAsIDB4MDAzNiwKKwkweDkwMWUsIDB4MDQ5OSwgMHgwMWUwLCAweDA4MGMsIDB4YmUzNywgMHgwMWM4LCAweDA4MGMsIDB4YzAyMiwKKwkweDYwMzcsIDB4NDAwMCwgMHg2MDE0LCAweDYwMTcsIDB4MDAwMCwgMHgwMDk2LCAweDIwNDgsIDB4YTg3YywKKwkweDA4MGMsIDB4YzAzZiwgMHgxMTE4LCAweDA4MGMsIDB4YWE4MSwgMHgwMDQwLCAweGE4NjcsIDB4MDEwMywKKwkweGE4NzcsIDB4MDAwMCwgMHg4M2ZmLCAweDExMjksIDB4MDgwYywgMHg2YWU5LCAweDAwOWUsIDB4MDAzZSwKKwkweDAwMDUsIDB4YTg4MCwgMHhkMGI0LCAweDAxMjgsIDB4YTg3YiwgMHgwMDA2LCAweGMwZWMsIDB4YTg4MiwKKwkweDAwNDgsIDB4ZDBiYywgMHgwMTE4LCAweGE4N2IsIDB4MDAwMiwgMHgwMDIwLCAweGE4N2IsIDB4MDAwNSwKKwkweDA4MGMsIDB4YzEzMywgMHhhODc3LCAweDAwMDAsIDB4MDAwNSwgMHgyMDAxLCAweDE4MTAsIDB4MjAwNCwKKwkweGQwZWMsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4MTgxMCwgMHgyMDA0LCAweGQwZjQsIDB4MDAwZSwKKwkweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweDE4MTAsIDB4MjAwNCwgMHhkMGU0LCAweDAwMGUsIDB4MDAwNSwKKwkweDAwMzYsIDB4MDA0NiwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiYmEwLCAweDAwYmUsIDB4MjAyMSwKKwkweDAwMDcsIDB4MDgwYywgMHg0Y2JjLCAweDAwNGUsIDB4MDAzZSwgMHgwMDA1LCAweDBjNTEsIDB4MWQ4MSwKKwkweDAwMDUsIDB4MjAwMSwgMHgxOTVlLCAweDIwMDQsIDB4NjAxYSwgMHgwMDA1LCAweDIwMDEsIDB4MTk2MCwKKwkweDIwMDQsIDB4NjA0MiwgMHgwMDA1LCAweDA4MGMsIDB4YTBlMywgMHgwODA0LCAweDhjMTAsIDB4MDBiNiwKKwkweDAwNjYsIDB4NjAwMCwgMHg5MGIyLCAweDAwMTYsIDB4MWEwYywgMHgwZGZhLCAweDAwMWIsIDB4MDA2ZSwKKwkweDAwYmUsIDB4MDAwNSwgMHhjNTdhLCAweGNjN2EsIDB4Y2RkNSwgMHhjNTdhLCAweGM1N2EsIDB4YzU3YSwKKwkweGM1N2EsIDB4YzU3YSwgMHhjNWIxLCAweGNlNTksIDB4YzU3YSwgMHhjNTdhLCAweGM1N2EsIDB4YzU3YSwKKwkweGM1N2EsIDB4YzU3YSwgMHgwODBjLCAweDBkZmEsIDB4MDA2NiwgMHg2MDAwLCAweDkwYjIsIDB4MDAxNiwKKwkweDFhMGMsIDB4MGRmYSwgMHgwMDEzLCAweDAwNmUsIDB4MDAwNSwgMHhjNTk1LCAweGQzY2IsIDB4YzU5NSwKKwkweGM1OTUsIDB4YzU5NSwgMHhjNTk1LCAweGM1OTUsIDB4YzU5NSwgMHhkMzc4LCAweGQ0MWYsIDB4YzU5NSwKKwkweGRhMGYsIDB4ZGE0NSwgMHhkYTBmLCAweGRhNDUsIDB4YzU5NSwgMHgwODBjLCAweDBkZmEsIDB4NjAwMCwKKwkweDkwODIsIDB4MDAxNiwgMHgxYTBjLCAweDBkZmEsIDB4NjAwMCwgMHgwMDBhLCAweDAwMDUsIDB4YzVhZiwKKwkweGQwMzcsIDB4ZDEyOSwgMHhkMTRjLCAweGQyMGMsIDB4YzVhZiwgMHhkMmViLCAweGQyOTQsIDB4Y2U2NSwKKwkweGQzNGUsIDB4ZDM2MywgMHhjNWFmLCAweGM1YWYsIDB4YzVhZiwgMHhjNWFmLCAweGM1YWYsIDB4MDgwYywKKwkweDBkZmEsIDB4OTFiMiwgMHgwMDUzLCAweDFhMGMsIDB4MGRmYSwgMHgyMTAwLCAweDkxYjIsIDB4MDA0MCwKKwkweDFhMDQsIDB4Y2ExYiwgMHgwMDAyLCAweGM1ZmIsIDB4YzdlOSwgMHhjNWZiLCAweGM1ZmIsIDB4YzVmYiwKKwkweGM3ZjIsIDB4YzVmYiwgMHhjNWZiLCAweGM1ZmIsIDB4YzVmYiwgMHhjNWZiLCAweGM1ZmIsIDB4YzVmYiwKKwkweGM1ZmIsIDB4YzVmYiwgMHhjNWZiLCAweGM1ZmIsIDB4YzVmYiwgMHhjNWZiLCAweGM1ZmIsIDB4YzVmYiwKKwkweGM1ZmIsIDB4YzVmYiwgMHhjNWZkLCAweGM2NjAsIDB4YzY2ZiwgMHhjNmQzLCAweGM2ZmUsIDB4Yzc3NiwKKwkweGM3ZDQsIDB4YzVmYiwgMHhjNWZiLCAweGM3ZjUsIDB4YzVmYiwgMHhjNWZiLCAweGM4MGEsIDB4YzgxNywKKwkweGM1ZmIsIDB4YzVmYiwgMHhjNWZiLCAweGM1ZmIsIDB4YzVmYiwgMHhjOGJkLCAweGM1ZmIsIDB4YzVmYiwKKwkweGM4ZDEsIDB4YzVmYiwgMHhjNWZiLCAweGM4OGMsIDB4YzVmYiwgMHhjNWZiLCAweGM1ZmIsIDB4YzhlOSwKKwkweGM1ZmIsIDB4YzVmYiwgMHhjNWZiLCAweGM5NjYsIDB4YzVmYiwgMHhjNWZiLCAweGM1ZmIsIDB4YzVmYiwKKwkweGM1ZmIsIDB4YzVmYiwgMHhjOWUzLCAweDA4MGMsIDB4MGRmYSwgMHgwODBjLCAweDY3ODEsIDB4MTE1MCwKKwkweDIwMDEsIDB4MTgzNiwgMHgyMDA0LCAweGQwY2MsIDB4MTEyOCwgMHg5MDg0LCAweDAwMDksIDB4OTA4NiwKKwkweDAwMDgsIDB4MTE0MCwgMHg2MDA3LCAweDAwMDksIDB4NjAyZiwgMHgwMDA5LCAweDYwMTcsIDB4MDAwMCwKKwkweDA4MDQsIDB4YzdlMiwgMHgwODBjLCAweDY3NmEsIDB4MDBlNiwgMHgwMGM2LCAweDAwMzYsIDB4MDAyNiwKKwkweDAwMTYsIDB4NjIxMCwgMHgyMjU4LCAweGJhYTAsIDB4MDAyNiwgMHgyMDE5LCAweDAwMjksIDB4MDgwYywKKwkweDg4MDMsIDB4MDA3NiwgMHg5MDNlLCAweDA4MGMsIDB4ODZmMSwgMHgyYzA4LCAweDA4MGMsIDB4ZDVmNiwKKwkweDAwN2UsIDB4MDAxZSwgMHgwMDFlLCAweDAwMmUsIDB4MDAzZSwgMHgwMGNlLCAweDAwZWUsIDB4NjYxMCwKKwkweDI2NTgsIDB4MDgwYywgMHg2NGFlLCAweGJlMDQsIDB4OTY4NCwgMHgwMGZmLCAweDkwODIsIDB4MDAwNiwKKwkweDEyNjgsIDB4MDAxNiwgMHgwMDI2LCAweDYyMTAsIDB4MDBiNiwgMHgyMjU4LCAweGJhYTAsIDB4MDBiZSwKKwkweDJjMDgsIDB4MDgwYywgMHhkYmJkLCAweDAwMmUsIDB4MDAxZSwgMHgxMTc4LCAweDA4MGMsIDB4ZDUyOSwKKwkweDE5MDQsIDB4YzZjYiwgMHgwODBjLCAweGQ0YzUsIDB4MTEyMCwgMHg2MDA3LCAweDAwMDgsIDB4MDgwNCwKKwkweGM3ZTIsIDB4NjAwNywgMHgwMDA5LCAweDA4MDQsIDB4YzdlMiwgMHgwODBjLCAweGQ3MjAsIDB4MDEyOCwKKwkweDA4MGMsIDB4ZDUyOSwgMHgwZDc4LCAweDA4MDQsIDB4YzZjYiwgMHg2MDE3LCAweDE5MDAsIDB4MGM4OCwKKwkweDA4MGMsIDB4MzJhZSwgMHgxOTA0LCAweGNhMTgsIDB4NjEwNiwgMHgwODBjLCAweGQ0N2EsIDB4NjAwNywKKwkweDAwMDYsIDB4MDgwNCwgMHhjN2UyLCAweDYwMDcsIDB4MDAwNywgMHgwODA0LCAweGM3ZTIsIDB4MDgwYywKKwkweGRhODEsIDB4MTkwNCwgMHhjYTE4LCAweDA4MGMsIDB4MzJhZSwgMHgxOTA0LCAweGNhMTgsIDB4MDBkNiwKKwkweDY2MTAsIDB4MjY1OCwgMHhiZTA0LCAweDk2ODQsIDB4MDBmZiwgMHg5MDgyLCAweDAwMDYsIDB4MTIyMCwKKwkweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDYzZGMsIDB4OTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4OTY4NiwKKwkweDAwMDYsIDB4MDE4OCwgMHg5Njg2LCAweDAwMDQsIDB4MDE3MCwgMHhiZTA0LCAweDk2YjQsIDB4MDBmZiwKKwkweDk2ODYsIDB4MDAwNiwgMHgwMTQwLCAweDk2ODYsIDB4MDAwNCwgMHgwMTI4LCAweDk2ODYsIDB4MDAwNSwKKwkweDAxMTAsIDB4MDBkZSwgMHgwNDgwLCAweDAwZTYsIDB4MjA3MSwgMHgwMjYwLCAweDcwMzQsIDB4OTA4NCwKKwkweDAwMDMsIDB4MTE0MCwgMHg3MDM0LCAweDkwODIsIDB4MDAxNCwgMHgwMjIwLCAweDcwMzAsIDB4OTA4NCwKKwkweDAwMDMsIDB4MDEzMCwgMHgwMGVlLCAweDYwMTcsIDB4MDAwMCwgMHg2MDJmLCAweDAwMDcsIDB4MDBiMCwKKwkweDAwZWUsIDB4MDgwYywgMHhkNThjLCAweDExOTAsIDB4OTY4NiwgMHgwMDA2LCAweDExNDAsIDB4MDAyNiwKKwkweDYyMTAsIDB4MjI1OCwgMHhiYWEwLCAweDkwMGUsIDB4MDgwYywgMHgzMWQ0LCAweDAwMmUsIDB4MDgwYywKKwkweDY1M2EsIDB4NjAwNywgMHgwMDBhLCAweDAwZGUsIDB4MDgwNCwgMHhjN2UyLCAweDYwMDcsIDB4MDAwYiwKKwkweDAwZGUsIDB4MDgwNCwgMHhjN2UyLCAweDA4MGMsIDB4MzE4YiwgMHgwODBjLCAweGM1NGUsIDB4NjAwNywKKwkweDAwMDEsIDB4MDgwNCwgMHhjN2UyLCAweDA4MGMsIDB4ZGE4MSwgMHgxOTA0LCAweGNhMTgsIDB4MDgwYywKKwkweDMyYWUsIDB4MTkwNCwgMHhjYTE4LCAweDIwNzEsIDB4MDI2MCwgMHg3MDM0LCAweDkwYjQsIDB4MDAwMywKKwkweDE5NDgsIDB4OTBiMiwgMHgwMDE0LCAweDBhMzAsIDB4NzAzMCwgMHg5MDg0LCAweDAwMDMsIDB4MTkxMCwKKwkweDY2MTAsIDB4MjY1OCwgMHhiZTA0LCAweDk2ODYsIDB4MDcwNywgMHgwOWU4LCAweDAwMjYsIDB4NjIxMCwKKwkweDIyNTgsIDB4YmFhMCwgMHg5MDBlLCAweDA4MGMsIDB4MzFkNCwgMHgwMDJlLCAweDYwMDcsIDB4MDAwYywKKwkweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweGRiOWQsIDB4MDgwNCwgMHhjN2UyLCAweDA4MGMsIDB4Njc4MSwKKwkweDExNDAsIDB4MjAwMSwgMHgxODM2LCAweDIwMDQsIDB4OTA4NCwgMHgwMDA5LCAweDkwODYsIDB4MDAwOCwKKwkweDExMTAsIDB4MDgwNCwgMHhjNjBhLCAweDA4MGMsIDB4Njc2YSwgMHg2NjEwLCAweDI2NTgsIDB4YmUwNCwKKwkweDk2ODQsIDB4MDBmZiwgMHg5MDgyLCAweDAwMDYsIDB4MDZjMCwgMHgxMTM4LCAweDAwMjYsIDB4MjAwMSwKKwkweDAwMDYsIDB4MDgwYywgMHg2NDFjLCAweDAwMmUsIDB4MDA1MCwgMHg5NmI0LCAweGZmMDAsIDB4ODYzNywKKwkweDk2ODYsIDB4MDAwNCwgMHgwMTIwLCAweDk2ODYsIDB4MDAwNiwgMHgxOTA0LCAweGM2Y2IsIDB4MDgwYywKKwkweGQ1OTksIDB4MTEyMCwgMHg2MDA3LCAweDAwMGUsIDB4MDgwNCwgMHhjN2UyLCAweDAwNDYsIDB4NjQxMCwKKwkweDI0NTgsIDB4YmNhMCwgMHgwMDQ2LCAweDA4MGMsIDB4MzE4YiwgMHgwODBjLCAweGM1NGUsIDB4MDA0ZSwKKwkweDAwMTYsIDB4OTAwNiwgMHgyMDA5LCAweDE4NWMsIDB4MjEwYywgMHgwMDQ4LCAweDIwMDksIDB4MDAyOSwKKwkweDA4MGMsIDB4ZDg4NSwgMHg2MDEwLCAweDIwNTgsIDB4YjgwMCwgMHhjMGU1LCAweGI4MDIsIDB4MDAxZSwKKwkweDAwNGUsIDB4NjAwNywgMHgwMDAxLCAweDA4MDQsIDB4YzdlMiwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywKKwkweDYzZGMsIDB4MDE1NiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgyMGE5LCAweDAwMDQsIDB4MjAxOSwKKwkweDE4MDUsIDB4MjAxMSwgMHgwMjcwLCAweDA4MGMsIDB4YjBiYywgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAxNWUsIDB4OTAwNSwgMHgwMTY4LCAweDk2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweDk2ODIsIDB4MDAwNCwKKwkweDBhMDQsIDB4YzZjYiwgMHg5NjgyLCAweDAwMDcsIDB4MGEwNCwgMHhjNzI3LCAweDA4MDQsIDB4YzZjYiwKKwkweDYwMTcsIDB4MTkwMCwgMHg2MDA3LCAweDAwMDksIDB4MDgwNCwgMHhjN2UyLCAweDA4MGMsIDB4Njc4MSwKKwkweDExNDAsIDB4MjAwMSwgMHgxODM2LCAweDIwMDQsIDB4OTA4NCwgMHgwMDA5LCAweDkwODYsIDB4MDAwOCwKKwkweDExMTAsIDB4MDgwNCwgMHhjNjBhLCAweDA4MGMsIDB4Njc2YSwgMHg2NjEwLCAweDI2NTgsIDB4YmUwNCwKKwkweDk2ODQsIDB4MDBmZiwgMHgwMDA2LCAweDkwODYsIDB4MDAwMSwgMHgwMDBlLCAweDAxNzAsIDB4OTA4MiwKKwkweDAwMDYsIDB4MDY5MCwgMHgwMTUwLCAweDk2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweDk2ODYsIDB4MDAwNCwKKwkweDAxMjAsIDB4OTY4NiwgMHgwMDA2LCAweDE5MDQsIDB4YzZjYiwgMHgwODBjLCAweGQ1YzcsIDB4MTEzMCwKKwkweDA4MGMsIDB4ZDRjNSwgMHgxMTE4LCAweDYwMDcsIDB4MDAxMCwgMHgwNGUwLCAweDAwNDYsIDB4NjQxMCwKKwkweDI0NTgsIDB4YmNhMCwgMHgwMDQ2LCAweDA4MGMsIDB4MzE4YiwgMHgwODBjLCAweGM1NGUsIDB4MDA0ZSwKKwkweDAwMTYsIDB4OTAwNiwgMHgyMDA5LCAweDE4NWMsIDB4MjEwYywgMHgwMDQ4LCAweDIwMDksIDB4MDAyOSwKKwkweDA4MGMsIDB4ZDg4NSwgMHg2MDEwLCAweDIwNTgsIDB4YjgwMCwgMHhjMGU1LCAweGI4MDIsIDB4MDAxZSwKKwkweDAwNGUsIDB4NjAwNywgMHgwMDAxLCAweDAwZjAsIDB4MDgwYywgMHhkNzIwLCAweDAxNDAsIDB4OTZiNCwKKwkweGZmMDAsIDB4ODYzNywgMHg5Njg2LCAweDAwMDYsIDB4MDk4MCwgMHgwODA0LCAweGM2Y2IsIDB4NjAxNywKKwkweDE5MDAsIDB4NjAwNywgMHgwMDA5LCAweDAwNzAsIDB4MDgwYywgMHgzMmFlLCAweDE5MDQsIDB4Y2ExOCwKKwkweDA4MGMsIDB4ZGE4MSwgMHgxOTA0LCAweGNhMTgsIDB4MDgwYywgMHhjYmI4LCAweDE5MDQsIDB4YzZjYiwKKwkweDYwMDcsIDB4MDAxMiwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg4NmMxLCAweDA4MGMsIDB4OGMxMCwKKwkweDAwMDUsIDB4NjAwNywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDg2YzEsIDB4MDgwYywKKwkweDhjMTAsIDB4MGNiMCwgMHg2MDA3LCAweDAwMDUsIDB4MGM2OCwgMHgwODBjLCAweGRhODEsIDB4MTkwNCwKKwkweGNhMTgsIDB4MDgwYywgMHgzMmFlLCAweDE5MDQsIDB4Y2ExOCwgMHgwODBjLCAweGNiYjgsIDB4MTkwNCwKKwkweGM2Y2IsIDB4NjAwNywgMHgwMDIwLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDg2YzEsIDB4MDgwYywKKwkweDhjMTAsIDB4MDAwNSwgMHgwODBjLCAweDMyYWUsIDB4MTkwNCwgMHhjYTE4LCAweDYwMDcsIDB4MDAyMywKKwkweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDg2YzEsIDB4MDgwYywgMHg4YzEwLCAweDAwMDUsIDB4MDgwYywKKwkweGRhODEsIDB4MTkwNCwgMHhjYTE4LCAweDA4MGMsIDB4MzJhZSwgMHgxOTA0LCAweGNhMTgsIDB4MDgwYywKKwkweGNiYjgsIDB4MTkwNCwgMHhjNmNiLCAweDAwMTYsIDB4MDAyNiwgMHgwMGU2LCAweDIwNzEsIDB4MDI2MCwKKwkweDJjMDgsIDB4MjAxMSwgMHgxODFmLCAweDIyMTQsIDB4NzAzYywgMHg5MjA2LCAweDExZTAsIDB4MjAxMSwKKwkweDE4MWUsIDB4MjIxNCwgMHg3MDM4LCAweDkwODQsIDB4MDBmZiwgMHg5MjA2LCAweDExYTAsIDB4NzI0MCwKKwkweDA4MGMsIDB4YmUyNSwgMHgwNTcwLCAweDIyNjAsIDB4NjAwOCwgMHg5MDg2LCAweGZmZmYsIDB4MDEyMCwKKwkweDcyNDQsIDB4NjAwOCwgMHg5MjA2LCAweDE1MjgsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDcsIDB4MTUwOCwKKwkweDA4MGMsIDB4YTBlMywgMHgwNGEwLCAweDcyNDQsIDB4OTI4NiwgMHhmZmZmLCAweDAxODAsIDB4MmMwOCwKKwkweDA4MGMsIDB4YmUyNSwgMHgwMWIwLCAweDIyNjAsIDB4NzI0MCwgMHg2MDA4LCAweDkyMDYsIDB4MTE4OCwKKwkweDYwMTAsIDB4OTE5MCwgMHgwMDA0LCAweDIyMTQsIDB4OTIwNiwgMHgwMWI4LCAweDAwNTAsIDB4NzI0MCwKKwkweDJjMDgsIDB4OTAwNiwgMHgwODBjLCAweGQ4NTcsIDB4MTE4MCwgMHg3MjQ0LCAweDkyODYsIDB4ZmZmZiwKKwkweDAxYjAsIDB4MjE2MCwgMHg2MDA3LCAweDAwMjYsIDB4NjAxNywgMHgxNzAwLCAweDcyMTQsIDB4OTI5NiwKKwkweGZmZmYsIDB4MTE4MCwgMHg2MDA3LCAweDAwMjUsIDB4MDA2OCwgMHg2MDIwLCAweDkwODYsIDB4MDAwNywKKwkweDFkODAsIDB4NjAwNCwgMHg5MDg2LCAweDAwMjQsIDB4MTExMCwgMHgwODBjLCAweGEwZTMsIDB4MjE2MCwKKwkweDYwMDcsIDB4MDAyNSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg4NmMxLCAweDA4MGMsIDB4OGMxMCwKKwkweDAwZWUsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4NjNkYywKKwkweDAxNTYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MjBhOSwgMHgwMDA0LCAweDIwMTksIDB4MTgwNSwKKwkweDIwMTEsIDB4MDI3NiwgMHgwODBjLCAweGIwYmMsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDE1ZSwKKwkweDAxMjAsIDB4NjAwNywgMHgwMDMxLCAweDA4MDQsIDB4YzdlMiwgMHgwODBjLCAweGFkMjQsIDB4MDgwYywKKwkweDcyMDcsIDB4MTE5MCwgMHgwMDA2LCAweDAwMjYsIDB4MDAzNiwgMHgwODBjLCAweDcyMjEsIDB4MTEzOCwKKwkweDA4MGMsIDB4NzUwNCwgMHgwODBjLCAweDVmMmIsIDB4MDgwYywgMHg3MTI3LCAweDAwMTAsIDB4MDgwYywKKwkweDcxZGYsIDB4MDAzZSwgMHgwMDJlLCAweDAwMGUsIDB4MDAwNSwgMHgwODBjLCAweDMyYWUsIDB4MTkwNCwKKwkweGNhMTgsIDB4MDgwYywgMHhjYmI4LCAweDE5MDQsIDB4YzZjYiwgMHg2MTA2LCAweDA4MGMsIDB4Y2JkNCwKKwkweDExMjAsIDB4NjAwNywgMHgwMDJiLCAweDA4MDQsIDB4YzdlMiwgMHg2MDA3LCAweDAwMmMsIDB4MDgwNCwKKwkweGM3ZTIsIDB4MDgwYywgMHhkYTgxLCAweDE5MDQsIDB4Y2ExOCwgMHgwODBjLCAweDMyYWUsIDB4MTkwNCwKKwkweGNhMTgsIDB4MDgwYywgMHhjYmI4LCAweDE5MDQsIDB4YzZjYiwgMHg2MTA2LCAweDA4MGMsIDB4Y2JkOSwKKwkweDExMjAsIDB4NjAwNywgMHgwMDJlLCAweDA4MDQsIDB4YzdlMiwgMHg2MDA3LCAweDAwMmYsIDB4MDgwNCwKKwkweGM3ZTIsIDB4MDgwYywgMHgzMmFlLCAweDE5MDQsIDB4Y2ExOCwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwKKwkweDYwMTAsIDB4MjA1OCwgMHhiOTA0LCAweDkxODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDYsIDB4MDE1OCwKKwkweDkxODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwODYsIDB4MDAwNiwgMHgwMTI4LCAweDAwY2UsIDB4MDBkZSwKKwkweDAwZWUsIDB4MDgwNCwgMHhjN2U5LCAweDA4MGMsIDB4NTVkZiwgMHhkMGU0LCAweDA5MDQsIDB4Yzk2MywKKwkweDIwNzEsIDB4MDI2YywgMHg3MDEwLCAweDYwM2EsIDB4NzAxNCwgMHg2MDNlLCAweDcxMDgsIDB4NzIwYywKKwkweDA4MGMsIDB4NjdiZiwgMHgwMTQwLCAweDYwMTAsIDB4MjA1OCwgMHhiODEwLCAweDkxMDYsIDB4MTExOCwKKwkweGI4MTQsIDB4OTIwNiwgMHgwNTEwLCAweDA4MGMsIDB4NjdiYiwgMHgxNWI4LCAweDIwNjksIDB4MTgwMCwKKwkweDY4N2MsIDB4OTIwNiwgMHgxNTkwLCAweDY4NzgsIDB4OTEwNiwgMHgxNTc4LCAweDcyMTAsIDB4MDgwYywKKwkweGJlMjUsIDB4MDU5MCwgMHgwODBjLCAweGNhYTMsIDB4MDU3OCwgMHgwODBjLCAweGQ5MDEsIDB4MDU2MCwKKwkweDYyMmUsIDB4NjAwNywgMHgwMDM2LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDg2NzksIDB4MDgwYywKKwkweDhjMTAsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDAwNSwgMHg3MjE0LCAweDkyODYsIDB4ZmZmZiwKKwkweDAxNTAsIDB4MDgwYywgMHhiZTI1LCAweDAxYzAsIDB4OTI4MCwgMHgwMDAyLCAweDIwMDQsIDB4NzExMCwKKwkweDkxMDYsIDB4MTE5MCwgMHgwOGUwLCAweDcyMTAsIDB4MmMwOCwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywKKwkweGQ4NTcsIDB4MmMxMCwgMHgyMTYwLCAweDAxNDAsIDB4MDg5MCwgMHg2MDA3LCAweDAwMzcsIDB4NjAyZiwKKwkweDAwMDksIDB4NjAxNywgMHgxNTAwLCAweDA4YjgsIDB4NjAwNywgMHgwMDM3LCAweDYwMmYsIDB4MDAwMywKKwkweDYwMTcsIDB4MTcwMCwgMHgwODgwLCAweDYwMDcsIDB4MDAxMiwgMHgwODY4LCAweDA4MGMsIDB4MzJhZSwKKwkweDE5MDQsIDB4Y2ExOCwgMHg2MDEwLCAweDIwNTgsIDB4YjgwNCwgMHg5MDg0LCAweGZmMDAsIDB4ODAwNywKKwkweDkwODYsIDB4MDAwNiwgMHgxOTA0LCAweGM3ZTksIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDgwYywKKwkweDU1ZGYsIDB4ZDBlNCwgMHgwOTA0LCAweGM5ZGIsIDB4MjA2OSwgMHgxODAwLCAweDIwNzEsIDB4MDI2YywKKwkweDcwMDgsIDB4NjAzYSwgMHg3MjBjLCAweDYyM2UsIDB4OTI4NiwgMHhmZmZmLCAweDExNTAsIDB4NzIwOCwKKwkweDAwYzYsIDB4MmMwOCwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywgMHhkODU3LCAweDJjMTAsIDB4MDBjZSwKKwkweDA1ZTgsIDB4MDgwYywgMHhiZTI1LCAweDA1ZDAsIDB4NzEwOCwgMHg5MjgwLCAweDAwMDIsIDB4MjAwNCwKKwkweDkxMDYsIDB4MTVhMCwgMHgwMGM2LCAweDAwMjYsIDB4MjI2MCwgMHgwODBjLCAweGJhNDksIDB4MDAyZSwKKwkweDAwY2UsIDB4NzExOCwgMHg5MThjLCAweGZmMDAsIDB4ODEwZiwgMHg5MTg2LCAweDAwMDEsIDB4MDE3OCwKKwkweDkxODYsIDB4MDAwNSwgMHgwMTE4LCAweDkxODYsIDB4MDAwNywgMHgxMTk4LCAweDkyODAsIDB4MDAwNSwKKwkweDIwMDQsIDB4OTAwNSwgMHgwMTcwLCAweDA4MGMsIDB4Y2FhMywgMHgwOTA0LCAweGM5NWMsIDB4MDA1NiwKKwkweDc1MTAsIDB4NzYxNCwgMHgwODBjLCAweGQ5MWEsIDB4MDA1ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwKKwkweDAwMDUsIDB4NjAwNywgMHgwMDNiLCAweDYwMmYsIDB4MDAwOSwgMHg2MDE3LCAweDJhMDAsIDB4NjAwMywKKwkweDAwMDEsIDB4MDgwYywgMHg4Njc5LCAweDA4MGMsIDB4OGMxMCwgMHgwYzc4LCAweDYwMDcsIDB4MDAzYiwKKwkweDYwMmYsIDB4MDAwMywgMHg2MDE3LCAweDAzMDAsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4ODY3OSwKKwkweDA4MGMsIDB4OGMxMCwgMHgwYzEwLCAweDYwMDcsIDB4MDAzYiwgMHg2MDJmLCAweDAwMGIsIDB4NjAxNywKKwkweDAwMDAsIDB4MDgwNCwgMHhjOTMzLCAweDAwZTYsIDB4MDAyNiwgMHgwODBjLCAweDY3ODEsIDB4MDU1MCwKKwkweDA4MGMsIDB4Njc2YSwgMHgwODBjLCAweGRhZjMsIDB4MTUxOCwgMHgyMDcxLCAweDE4MDAsIDB4NzBkOCwKKwkweDkwODUsIDB4MDAwMywgMHg3MGRhLCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDcyYWMsIDB4OTI4NCwKKwkweDAwZmYsIDB4NzA3YSwgMHg3OGU2LCAweDkyODQsIDB4ZmYwMCwgMHg3MjdjLCAweDkyMDUsIDB4NzA3ZSwKKwkweDc4ZWEsIDB4MDBmZSwgMHg3MGUzLCAweDAwMDAsIDB4MDgwYywgMHg2N2JmLCAweDAxMjAsIDB4MjAxMSwKKwkweDE5ZDgsIDB4MjAxMywgMHgwN2QwLCAweGQwYWMsIDB4MTEyOCwgMHgwODBjLCAweDJmNmMsIDB4MDAxMCwKKwkweDA4MGMsIDB4ZGIyNSwgMHgwMDJlLCAweDAwZWUsIDB4MDgwYywgMHhhMGUzLCAweDA4MDQsIDB4YzdlOCwKKwkweDA4MGMsIDB4YTBlMywgMHgwMDA1LCAweDI2MDAsIDB4MDAwMiwgMHhjYTJmLCAweGNhMmYsIDB4Y2EyZiwKKwkweGNhMmYsIDB4Y2EyZiwgMHhjYTMxLCAweGNhMmYsIDB4Y2EyZiwgMHhjYTJmLCAweGNhMmYsIDB4Y2E0ZSwKKwkweGNhMmYsIDB4Y2EyZiwgMHhjYTJmLCAweGNhNjAsIDB4Y2E2ZCwgMHhjYTllLCAweGNhMmYsIDB4MDgwYywKKwkweDBkZmEsIDB4MDgwYywgMHhkYTgxLCAweDFkMjAsIDB4MDgwYywgMHgzMmFlLCAweDFkMDgsIDB4MDgwYywKKwkweGNiYjgsIDB4MTE0OCwgMHg3MDM4LCAweDYwMTYsIDB4NjAwNywgMHgwMDQ1LCAweDYwMDMsIDB4MDAwMSwKKwkweDA4MGMsIDB4ODZjMSwgMHgwMDA1LCAweDA4MGMsIDB4MzE4YiwgMHgwODBjLCAweGM1NGUsIDB4NjAwNywKKwkweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4ODZjMSwgMHgwMDA1LCAweDA4MGMsIDB4ZGE4MSwKKwkweDE5MzgsIDB4MDgwYywgMHgzMmFlLCAweDE5MjAsIDB4MDgwYywgMHhjYmI4LCAweDFkNjAsIDB4NzAzYywKKwkweDYwMTYsIDB4NjAwNywgMHgwMDRhLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDg2YzEsIDB4MDAwNSwKKwkweDA4MGMsIDB4Y2FjMCwgMHgwOTA0LCAweGNhMTgsIDB4NjAwNywgMHgwMDRlLCAweDYwMDMsIDB4MDAwMSwKKwkweDA4MGMsIDB4ODZjMSwgMHgwODBjLCAweDhjMTAsIDB4MDAwNSwgMHg2MDA3LCAweDAwNGYsIDB4NjAxNywKKwkweDAwMDAsIDB4NzEzNCwgMHg5MThjLCAweDAwZmYsIDB4ODFmZiwgMHgwNTA4LCAweDkxODYsIDB4MDAwMSwKKwkweDExNjAsIDB4NzE0MCwgMHgyMDAxLCAweDE5OTUsIDB4MjAwNCwgMHg5MTA2LCAweDExYjAsIDB4NzE0NCwKKwkweDIwMDEsIDB4MTk5NiwgMHgyMDA0LCAweDkxMDYsIDB4MDE5MCwgMHg5MTg2LCAweDAwMDIsIDB4MTE2OCwKKwkweDIwMTEsIDB4MDI3NiwgMHgyMGE5LCAweDAwMDQsIDB4NjAxMCwgMHgwMDk2LCAweDIwNDgsIDB4MjAxOSwKKwkweDAwMGEsIDB4MDgwYywgMHhiMGQwLCAweDAwOWUsIDB4MDExMCwgMHg2MDE3LCAweDAwMDEsIDB4NjAwMywKKwkweDAwMDEsIDB4MDgwYywgMHg4NmMxLCAweDA4MGMsIDB4OGMxMCwgMHgwMDA1LCAweDYwMDcsIDB4MDA1MCwKKwkweDcwM2MsIDB4NjAxNiwgMHgwY2EwLCAweDAwMTYsIDB4MDBlNiwgMHgyMDcxLCAweDAyNjAsIDB4MDBiNiwKKwkweDAwYzYsIDB4MjI2MCwgMHg2MDEwLCAweDIwNTgsIDB4YjhiYywgMHhkMDg0LCAweDAxNTAsIDB4NzEyOCwKKwkweDYwNDQsIDB4OTEwNiwgMHgxMTIwLCAweDcxMmMsIDB4NjA0OCwgMHg5MTA2LCAweDAxMTAsIDB4OTAwNiwKKwkweDAwMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwY2UsIDB4MDBiZSwgMHgwMGVlLCAweDAwMWUsIDB4MDAwNSwKKwkweDAwMTYsIDB4MDA5NiwgMHgwMDg2LCAweDAwZTYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA3MSwgMHgxODAwLCAweDcwOGMsIDB4OTA4YSwgMHgwMGY5LCAweDE2ZTgsIDB4MjBlMSwKKwkweDAwMDAsIDB4MjAwMSwgMHgxOTc4LCAweDIwMDMsIDB4MDAwMCwgMHgwODBjLCAweDEwNGEsIDB4MDVhMCwKKwkweDI5MDAsIDB4NjAxNiwgMHg3MDhjLCAweDgwMDQsIDB4YTgxNiwgMHg5MDhhLCAweDAwMWUsIDB4MDJkMCwKKwkweGE4MzMsIDB4MDAxZSwgMHgyMGE5LCAweDAwMWUsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMWIsIDB4MjBhMCwgMHgyMDAxLCAweDE5NzgsIDB4MDAxNiwgMHgyMDBjLCAweDA0NzEsIDB4MDAxZSwKKwkweDI5NDAsIDB4MDgwYywgMHgxMDRhLCAweDAxYzAsIDB4MjkwMCwgMHhhMDA2LCAweDIxMDAsIDB4ODFmZiwKKwkweDAxODAsIDB4MGMxOCwgMHhhODMyLCAweDIwYTgsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMWIsIDB4MjBhMCwgMHgyMDAxLCAweDE5NzgsIDB4MDAxNiwgMHgyMDBjLCAweDAwYjEsIDB4MDAxZSwKKwkweDAwMDAsIDB4OTA4NSwgMHgwMDAxLCAweDAwNDgsIDB4MjA3MSwgMHgxODAwLCAweDcwOGYsIDB4MDAwMCwKKwkweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweDBmZTMsIDB4OTAwNiwgMHgwMTJlLCAweDAxZGUsIDB4MDFjZSwKKwkweDAwZWUsIDB4MDA4ZSwgMHgwMDllLCAweDAwMWUsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwKKwkweDAwMzYsIDB4MDBjNiwgMHg5MThjLCAweGZmZmYsIDB4MTFhOCwgMHgwODBjLCAweDIyZTMsIDB4MjA5OSwKKwkweDAyNmMsIDB4MjAwMSwgMHgwMDE0LCAweDM1MTgsIDB4OTMxMiwgMHgxMjE4LCAweDIzYTgsIDB4NDAwMywKKwkweDAwZjgsIDB4MjBhOCwgMHg0MDAzLCAweDIyYTgsIDB4ODEwOCwgMHgwODBjLCAweDIyZTMsIDB4MjA5OSwKKwkweDAyNjAsIDB4MGNhOCwgMHgwODBjLCAweDIyZTMsIDB4MjA2MSwgMHgxOTc4LCAweDYwMDQsIDB4MjA5OCwKKwkweDYwMDgsIDB4MzUxOCwgMHg5MzEyLCAweDEyMTgsIDB4MjNhOCwgMHg0MDAzLCAweDAwNDgsIDB4MjBhOCwKKwkweDQwMDMsIDB4MjJhOCwgMHg4MTA4LCAweDA4MGMsIDB4MjJlMywgMHgyMDk5LCAweDAyNjAsIDB4MGNhOCwKKwkweDIwNjEsIDB4MTk3OCwgMHgyMDE5LCAweDAyODAsIDB4MzMwMCwgMHg5MzFlLCAweDAxMTAsIDB4NjAwNiwKKwkweDAwMjAsIDB4MjAwMSwgMHgwMjYwLCAweDYwMDYsIDB4ODEwOCwgMHgyMTYyLCAweDkyOTIsIDB4MDAyMSwKKwkweDkyOTYsIDB4ZmZmZiwgMHg2MjBhLCAweDAwY2UsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwKKwkweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMGM2LCAweDgxZmYsIDB4MTFiOCwKKwkweDA4MGMsIDB4MjJmYiwgMHgyMGExLCAweDAyNGMsIDB4MjAwMSwgMHgwMDE0LCAweDM1MTgsIDB4OTMxMiwKKwkweDEyMTgsIDB4MjNhOCwgMHg0MDAzLCAweDA0MTgsIDB4MjBhOCwgMHg0MDAzLCAweDgyZmYsIDB4MDFmOCwKKwkweDIyYTgsIDB4ODEwOCwgMHgwODBjLCAweDIyZmIsIDB4MjBhMSwgMHgwMjQwLCAweDBjOTgsIDB4MDgwYywKKwkweDIyZmIsIDB4MjA2MSwgMHgxOTdiLCAweDYwMDQsIDB4MjBhMCwgMHg2MDA4LCAweDM1MTgsIDB4OTMxMiwKKwkweDEyMTgsIDB4MjNhOCwgMHg0MDAzLCAweDAwNTgsIDB4MjBhOCwgMHg0MDAzLCAweDgyZmYsIDB4MDEzOCwKKwkweDIyYTgsIDB4ODEwOCwgMHgwODBjLCAweDIyZmIsIDB4MjBhMSwgMHgwMjQwLCAweDBjOTgsIDB4MjA2MSwKKwkweDE5N2IsIDB4MjAxOSwgMHgwMjYwLCAweDM0MDAsIDB4OTMxZSwgMHgwMTEwLCAweDYwMDYsIDB4MDAyMCwKKwkweDIwMDEsIDB4MDI0MCwgMHg2MDA2LCAweDgxMDgsIDB4MjE2MiwgMHg5MjkyLCAweDAwMjEsIDB4OTI5NiwKKwkweGZmZmYsIDB4NjIwYSwgMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwKKwkweDAwYjYsIDB4MDA2NiwgMHg2NjEwLCAweDI2NTgsIDB4YmUwNCwgMHg5NmI0LCAweGZmMDAsIDB4ODYzNywKKwkweDk2ODYsIDB4MDAwNiwgMHgwMTcwLCAweDk2ODYsIDB4MDAwNCwgMHgwMTU4LCAweGJlMDQsIDB4OTZiNCwKKwkweDAwZmYsIDB4OTY4NiwgMHgwMDA2LCAweDAxMjgsIDB4OTY4NiwgMHgwMDA0LCAweDAxMTAsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDA2ZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBkNiwgMHgwODBjLCAweGNjNTAsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDBkNiwgMHgwODBjLCAweGNjNWQsIDB4MTUyMCwgMHg2ODBjLCAweDkwOGMsIDB4ZmYwMCwKKwkweDY4MjAsIDB4OTA4NCwgMHgwMGZmLCAweDkxMTUsIDB4NjIxNiwgMHg2ODI0LCAweDYwMmUsIDB4ZDFlNCwKKwkweDAxMzAsIDB4OTAwNiwgMHgwODBjLCAweGRiOWQsIDB4MjAwOSwgMHgwMDAxLCAweDAwNzgsIDB4ZDFlYywKKwkweDAxODAsIDB4NjkyMCwgMHg5MThjLCAweDAwZmYsIDB4NjgyNCwgMHgwODBjLCAweDI3NmUsIDB4MTE0OCwKKwkweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweGRiOWQsIDB4MjExMCwgMHg5MDBlLCAweDA4MGMsIDB4MzFkNCwKKwkweDAwMTgsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDgsIDB4OTAwNiwgMHgwMGRlLCAweDAwMDUsIDB4MDBiNiwKKwkweDAwYzYsIDB4MDgwYywgMHhhMTMwLCAweDA1YTgsIDB4MDAxNiwgMHgwMDI2LCAweDAwYzYsIDB4MjAxMSwKKwkweDAyNjMsIDB4MjIwNCwgMHg4MjExLCAweDIyMGMsIDB4MDgwYywgMHgyNzZlLCAweDE1NzgsIDB4MDgwYywKKwkweDY0M2YsIDB4MTU2MCwgMHhiZTEyLCAweGJkMTYsIDB4MDBjZSwgMHgwMDJlLCAweDAwMWUsIDB4MmIwMCwKKwkweDYwMTIsIDB4MDgwYywgMHhkYTgxLCAweDExZDgsIDB4MDgwYywgMHgzMmFlLCAweDExYzAsIDB4MDgwYywKKwkweGNiYjgsIDB4MDUxMCwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg2M2YwLCAweDIwMDEsIDB4MDAwNywKKwkweDA4MGMsIDB4NjQxYywgMHg2MDE3LCAweDAwMDAsIDB4NjAyMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwKKwkweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDg2YzEsIDB4MDgwYywgMHg4YzEwLCAweDAwMTAsIDB4MDgwYywKKwkweGEwZTMsIDB4OTA4NSwgMHgwMDAxLCAweDAwY2UsIDB4MDBiZSwgMHgwMDA1LCAweDA4MGMsIDB4YTBlMywKKwkweDAwY2UsIDB4MDAyZSwgMHgwMDFlLCAweDBjYTgsIDB4MDgwYywgMHhhMGUzLCAweDkwMDYsIDB4MGM5OCwKKwkweDIwNjksIDB4MDI2ZCwgMHg2ODAwLCAweDkwODIsIDB4MDAxMCwgMHgxMjI4LCAweDYwMTcsIDB4MDAwMCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA4LCAweDkwMDYsIDB4MDAwNSwgMHg2MDE3LCAweDAwMDAsIDB4MjA2OSwKKwkweDAyNmMsIDB4NjgwOCwgMHg5MDg0LCAweGZmMDAsIDB4OTA4NiwgMHgwODAwLCAweDExOTAsIDB4NjkwNCwKKwkweDkxODYsIDB4MDAxOCwgMHgwMTE4LCAweDkxODYsIDB4MDAxNCwgMHgxMTU4LCAweDgxMGYsIDB4NjgwMCwKKwkweDkwODQsIDB4MDBmZiwgMHg5MTBkLCAweDYxNWEsIDB4OTA4ZSwgMHgwMDE0LCAweDAxMTAsIDB4OTA4ZSwKKwkweDAwMTAsIDB4MDAwNSwgMHg2MDA0LCAweDkwYjIsIDB4MDA1MywgMHgxYTBjLCAweDBkZmEsIDB4OTFiNiwKKwkweDAwMTMsIDB4MTEzMCwgMHgyMDA4LCAweDkxYjIsIDB4MDA0MCwgMHgxYTA0LCAweGNkYTUsIDB4MDA5MiwKKwkweDkxYjYsIDB4MDAyNywgMHgwMTIwLCAweDkxYjYsIDB4MDAxNCwgMHgxOTBjLCAweDBkZmEsIDB4MjAwMSwKKwkweDAwMDcsIDB4MDgwYywgMHg2NDFjLCAweDA4MGMsIDB4OGIwNCwgMHgwODBjLCAweGExMTMsIDB4MDgwYywKKwkweDhjMTAsIDB4MDAwNSwgMHhjY2RhLCAweGNjZGMsIDB4Y2NkYSwgMHhjY2RhLCAweGNjZGEsIDB4Y2NkYywKKwkweGNjZWIsIDB4Y2Q5ZSwgMHhjZDNkLCAweGNkOWUsIDB4Y2Q0ZiwgMHhjZDllLCAweGNjZWIsIDB4Y2Q5ZSwKKwkweGNkOTYsIDB4Y2Q5ZSwgMHhjZDk2LCAweGNkOWUsIDB4Y2Q5ZSwgMHhjY2RhLCAweGNjZGEsIDB4Y2NkYSwKKwkweGNjZGEsIDB4Y2NkYSwgMHhjY2RhLCAweGNjZGEsIDB4Y2NkYSwgMHhjY2RhLCAweGNjZGEsIDB4Y2NkYSwKKwkweGNjZGMsIDB4Y2NkYSwgMHhjZDllLCAweGNjZGEsIDB4Y2NkYSwgMHhjZDllLCAweGNjZGEsIDB4Y2Q5YiwKKwkweGNkOWUsIDB4Y2NkYSwgMHhjY2RhLCAweGNjZGEsIDB4Y2NkYSwgMHhjZDllLCAweGNkOWUsIDB4Y2NkYSwKKwkweGNkOWUsIDB4Y2Q5ZSwgMHhjY2RhLCAweGNjZTYsIDB4Y2NkYSwgMHhjY2RhLCAweGNjZGEsIDB4Y2NkYSwKKwkweGNkOWEsIDB4Y2Q5ZSwgMHhjY2RhLCAweGNjZGEsIDB4Y2Q5ZSwgMHhjZDllLCAweGNjZGEsIDB4Y2NkYSwKKwkweGNjZGEsIDB4Y2NkYSwgMHgwODBjLCAweDBkZmEsIDB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4YzU1MSwKKwkweDYwMDMsIDB4MDAwMiwgMHgwODBjLCAweDhjMTAsIDB4MDgwNCwgMHhjZGE0LCAweDkwMDYsIDB4MDgwYywKKwkweDYzZGMsIDB4MDgwNCwgMHhjZDllLCAweDA4MGMsIDB4NjdiYiwgMHgxOTA0LCAweGNkOWUsIDB4OTAwNiwKKwkweDA4MGMsIDB4NjNkYywgMHg2MDEwLCAweDIwNTgsIDB4YjgxMCwgMHg5MDg2LCAweDAwZmYsIDB4MTE0MCwKKwkweDAwZjYsIDB4MjA3OSwgMHgxODAwLCAweDc4YTQsIDB4ODAwMCwgMHg3OGE2LCAweDAwZmUsIDB4MDQyOCwKKwkweDYwMTAsIDB4MjA1OCwgMHhiOGIwLCAweDkwMDUsIDB4MTE3OCwgMHgwODBjLCAweGM1MzksIDB4MTkwNCwKKwkweGNkOWUsIDB4MDAzNiwgMHgwMDQ2LCAweGJiYTAsIDB4MjAyMSwgMHgwMDA3LCAweDA4MGMsIDB4NGNiYywKKwkweDAwNGUsIDB4MDAzZSwgMHgwODA0LCAweGNkOWUsIDB4MDgwYywgMHgzMmRmLCAweDE5MDQsIDB4Y2Q5ZSwKKwkweDIwMDEsIDB4MTgwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwMiwgMHgxMTM4LCAweDAwZjYsIDB4MjA3OSwKKwkweDE4MDAsIDB4NzhhNCwgMHg4MDAwLCAweDc4YTYsIDB4MDBmZSwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywKKwkweDYzZjAsIDB4MDgwYywgMHg4YjA0LCAweDYwMjMsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywKKwkweDAwMDIsIDB4MDgwYywgMHg4NmMxLCAweDA4MGMsIDB4OGMxMCwgMHg2MTEwLCAweDIxNTgsIDB4MjAwOSwKKwkweDAwMDEsIDB4MDgwYywgMHg4MmU4LCAweDA4MDQsIDB4Y2RhNCwgMHg2NjEwLCAweDI2NTgsIDB4YmUwNCwKKwkweDk2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweDk2ODYsIDB4MDAwNiwgMHgwOTA0LCAweGNkOWUsIDB4OTY4NiwKKwkweDAwMDQsIDB4MDkwNCwgMHhjZDllLCAweDIwMDEsIDB4MDAwNCwgMHgwODA0LCAweGNkOWMsIDB4MjAwMSwKKwkweDE4MDAsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDMsIDB4MTE1OCwgMHgwMDM2LCAweDAwNDYsIDB4NjAxMCwKKwkweDIwNTgsIDB4YmJhMCwgMHgyMDIxLCAweDAwMDYsIDB4MDgwYywgMHg0Y2JjLCAweDAwNGUsIDB4MDAzZSwKKwkweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweGNkYzIsIDB4NjYxMCwgMHgyNjU4LCAweGJlMDQsIDB4MDA2NiwKKwkweDk2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweDk2ODYsIDB4MDAwNiwgMHgwMDZlLCAweDAxNjgsIDB4MjAwMSwKKwkweDAwMDYsIDB4MDgwYywgMHg2NDFjLCAweDkyODQsIDB4MDBmZiwgMHg5MDhlLCAweDAwMDcsIDB4MTEyMCwKKwkweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDYzZjAsIDB4MDgwYywgMHg2N2JiLCAweDExZjgsIDB4MjAwMSwKKwkweDE4MzYsIDB4MjAwNCwgMHhkMGE0LCAweDAxZDAsIDB4YmUwNCwgMHg5NmI0LCAweDAwZmYsIDB4OTY4NiwKKwkweDAwMDYsIDB4MDFhMCwgMHgwMGY2LCAweDIwNzksIDB4MTgwMCwgMHg3OGE0LCAweDgwMDAsIDB4NzhhNiwKKwkweDAwZmUsIDB4MDgwNCwgMHhjZDI1LCAweDIwMDEsIDB4MDAwNCwgMHgwMDMwLCAweDIwMDEsIDB4MDAwNiwKKwkweDA0NDksIDB4MDAyMCwgMHgwMDE4LCAweDAwMTAsIDB4MDgwYywgMHg2NDFjLCAweDA4MGMsIDB4OGIwNCwKKwkweDA4MGMsIDB4YTBlMywgMHgwODBjLCAweDhjMTAsIDB4MDAwNSwgMHgyNjAwLCAweDAwMDIsIDB4Y2RiOSwKKwkweGNkYjksIDB4Y2RiOSwgMHhjZGI5LCAweGNkYjksIDB4Y2RiYiwgMHhjZGI5LCAweGNkYjksIDB4Y2RiOSwKKwkweGNkYjksIDB4Y2RiYiwgMHhjZGI5LCAweGNkYjksIDB4Y2RiOSwgMHhjZGJiLCAweGNkYmIsIDB4Y2RiYiwKKwkweGNkYmIsIDB4MDgwYywgMHgwZGZhLCAweDA4MGMsIDB4OGIwNCwgMHgwODBjLCAweGEwZTMsIDB4MDgwYywKKwkweDhjMTAsIDB4MDAwNSwgMHgwMDE2LCAweDAwYjYsIDB4MDBkNiwgMHg2MTEwLCAweDIxNTgsIDB4YjkwMCwKKwkweGQxODQsIDB4MDEzOCwgMHgwODBjLCAweDYzZjAsIDB4OTAwNiwgMHgwODBjLCAweDYzZGMsIDB4MDgwYywKKwkweDMxYjQsIDB4MDBkZSwgMHgwMGJlLCAweDAwMWUsIDB4MDAwNSwgMHg2NjEwLCAweDI2NTgsIDB4YjgwNCwKKwkweDkwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwYjIsIDB4MDAwYywgMHgxYTBjLCAweDBkZmEsIDB4OTFiNiwKKwkweDAwMTUsIDB4MTExMCwgMHgwMDNiLCAweDAwMjgsIDB4OTFiNiwgMHgwMDE2LCAweDE5MGMsIDB4MGRmYSwKKwkweDAwNmIsIDB4MDAwNSwgMHhhYjYyLCAweGFiNjIsIDB4YWI2MiwgMHhhYjYyLCAweGNlNTcsIDB4YWI2MiwKKwkweGNlNDEsIDB4Y2UwMiwgMHhhYjYyLCAweGFiNjIsIDB4YWI2MiwgMHhhYjYyLCAweGFiNjIsIDB4YWI2MiwKKwkweGFiNjIsIDB4YWI2MiwgMHhjZTU3LCAweGFiNjIsIDB4Y2U0MSwgMHhjZTQ4LCAweGFiNjIsIDB4YWI2MiwKKwkweGFiNjIsIDB4YWI2MiwgMHgwMGY2LCAweDA4MGMsIDB4NjdiYiwgMHgxMWQ4LCAweDA4MGMsIDB4YzUzOSwKKwkweDExYzAsIDB4NjAxMCwgMHg5MDVkLCAweDAxYTgsIDB4YjhiMCwgMHg5MDA1LCAweDAxOTAsIDB4OTAwNiwKKwkweDA4MGMsIDB4NjNkYywgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg2M2YwLCAweDYwMjMsIDB4MDAwMSwKKwkweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDIsIDB4MDgwYywgMHg4NmMxLCAweDA4MGMsIDB4OGMxMCwKKwkweDAwZjAsIDB4MjAxMSwgMHgwMjYzLCAweDIyMDQsIDB4ODIxMSwgMHgyMjBjLCAweDA4MGMsIDB4Mjc2ZSwKKwkweDExYjAsIDB4MDgwYywgMHg2NDlmLCAweDAxMTgsIDB4MDgwYywgMHhhMGUzLCAweDAwODAsIDB4YjgxMCwKKwkweDAwMDYsIDB4YjgxNCwgMHgwMDA2LCAweGI4YjAsIDB4MDAwNiwgMHgwODBjLCAweDVmNDUsIDB4MDAwZSwKKwkweGI4YjIsIDB4MDAwZSwgMHhiODE2LCAweDAwMGUsIDB4YjgxMiwgMHgwODBjLCAweGEwZTMsIDB4MDBmZSwKKwkweDAwMDUsIDB4NjYwNCwgMHg5NmI2LCAweDAwMWUsIDB4MTExMCwgMHgwODBjLCAweGEwZTMsIDB4MDAwNSwKKwkweDA4MGMsIDB4YWY0OCwgMHgxMTQ4LCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDEsIDB4MDgwYywKKwkweDg2YzEsIDB4MDgwYywgMHg4YzEwLCAweDAwMTAsIDB4MDgwYywgMHhhMGUzLCAweDAwMDUsIDB4MDgwNCwKKwkweGEwZTMsIDB4NjAwNCwgMHg5MDhhLCAweDAwNTMsIDB4MWEwYywgMHgwZGZhLCAweDA4MGMsIDB4OGIwNCwKKwkweDA4MGMsIDB4YTExMywgMHgwODBjLCAweDhjMTAsIDB4MDAwNSwgMHg5MTgyLCAweDAwNDAsIDB4MDAwMiwKKwkweGNlN2MsIDB4Y2U3YywgMHhjZTdjLCAweGNlN2MsIDB4Y2U3ZSwgMHhjZTdjLCAweGNlN2MsIDB4Y2U3YywKKwkweGNlN2MsIDB4Y2U3YywgMHhjZTdjLCAweGNlN2MsIDB4Y2U3YywgMHhjZTdjLCAweGNlN2MsIDB4Y2U3YywKKwkweGNlN2MsIDB4Y2U3YywgMHhjZTdjLCAweGNlN2MsIDB4MDgwYywgMHgwZGZhLCAweDAwOTYsIDB4MDBiNiwKKwkweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDAwNDYsIDB4MDAyNiwgMHg2MjEwLCAweDIyNTgsIDB4YjhhYywKKwkweDkwMDUsIDB4MTFhOCwgMHg2MTA2LCAweDIwNzEsIDB4MDI2MCwgMHg3NDQ0LCAweDk0YTQsIDB4ZmYwMCwKKwkweDA5MDQsIDB4Y2VlNCwgMHgwODBjLCAweGRiOTEsIDB4MTE3MCwgMHg5NDg2LCAweDIwMDAsIDB4MTE1OCwKKwkweDIwMDksIDB4MDAwMSwgMHgyMDExLCAweDAyMDAsIDB4MDgwYywgMHg4NGQxLCAweDAwMjAsIDB4OTAyNiwKKwkweDA4MGMsIDB4ZGFjNiwgMHgwYzM4LCAweDA4MGMsIDB4MTAzMSwgMHgwOTBjLCAweDBkZmEsIDB4NjAwMywKKwkweDAwMDcsIDB4YTg2NywgMHgwMTBkLCAweDkwMDYsIDB4YTgwMiwgMHhhODZhLCAweGFjOGEsIDB4MmMwMCwKKwkweGE4OGUsIDB4NjAwOCwgMHhhOGUyLCAweDYwMTAsIDB4MjA1OCwgMHhiOGEwLCAweDcxMzAsIDB4YTk3YSwKKwkweDAwMTYsIDB4YTg3NiwgMHhhODdmLCAweDAwMDAsIDB4YTg4MywgMHgwMDAwLCAweGE4ODcsIDB4MDAzNiwKKwkweDA4MGMsIDB4NmFlOSwgMHgwMDFlLCAweDA4MGMsIDB4ZGI5MSwgMHgxOTA0LCAweGNmNDQsIDB4OTQ4NiwKKwkweDIwMDAsIDB4MTEzMCwgMHgyMDE5LCAweDAwMTcsIDB4MDgwYywgMHhkODAxLCAweDA4MDQsIDB4Y2Y0NCwKKwkweDk0ODYsIDB4MDIwMCwgMHgxMTIwLCAweDA4MGMsIDB4ZDc5ZCwgMHgwODA0LCAweGNmNDQsIDB4OTQ4NiwKKwkweDA0MDAsIDB4MDEyMCwgMHg5NDg2LCAweDEwMDAsIDB4MTkwNCwgMHhjZjQ0LCAweDIwMTksIDB4MDAwMiwKKwkweDA4MGMsIDB4ZDdiOCwgMHgwODA0LCAweGNmNDQsIDB4MjA2OSwgMHgxYTQ4LCAweDZhMDAsIDB4ZDI4NCwKKwkweDA5MDQsIDB4Y2ZhZSwgMHg5Mjg0LCAweDAzMDAsIDB4MTkwNCwgMHhjZmE3LCAweDY4MDQsIDB4OTAwNSwKKwkweDA5MDQsIDB4Y2Y4ZiwgMHgyZDc4LCAweDYwMDMsIDB4MDAwNywgMHgwODBjLCAweDEwNGEsIDB4MDkwNCwKKwkweGNmNTAsIDB4NzgwMCwgMHhkMDhjLCAweDExMTgsIDB4NzgwNCwgMHg4MDAxLCAweDc4MDYsIDB4NjAxNywKKwkweDAwMDAsIDB4MjAwMSwgMHgxODBmLCAweDIwMDQsIDB4ZDA4NCwgMHgxOTA0LCAweGNmYjIsIDB4OTAwNiwKKwkweGE4MDIsIDB4YTg2NywgMHgwMTE2LCAweGE4NmEsIDB4NjAwOCwgMHhhOGUyLCAweDJjMDAsIDB4YTg3YSwKKwkweDYwMTAsIDB4MjA1OCwgMHhiOGEwLCAweDcxMzAsIDB4YTliNiwgMHhhODc2LCAweGI5MjgsIDB4YTliYSwKKwkweGI5MmMsIDB4YTliZSwgMHhiOTMwLCAweGE5YzIsIDB4YjkzNCwgMHhhOWM2LCAweGE4ODMsIDB4MDAzZCwKKwkweDcwNDQsIDB4OTA4NCwgMHgwMDAzLCAweDkwODAsIDB4Y2Y0YywgMHgyMDA1LCAweGE4N2UsIDB4MjBhOSwKKwkweDAwMGEsIDB4MjAwMSwgMHgwMjcwLCAweGFhNWMsIDB4OTI5MCwgMHgwMDIxLCAweDIwMDksIDB4MDIwNSwKKwkweDIwMGIsIDB4MDA4MCwgMHgyMGUxLCAweDAwMDAsIDB4YWI2MCwgMHgyM2U4LCAweDIwOTgsIDB4MjJhMCwKKwkweDQwMDMsIDB4MjAwYiwgMHgwMDAwLCAweDIwMDEsIDB4MDI3YSwgMHgyMDBjLCAweGE5YjIsIDB4ODAwMCwKKwkweDIwMGMsIDB4YTlhZSwgMHgwODBjLCAweDZhZTksIDB4MDAyZSwgMHgwMDRlLCAweDAwZmUsIDB4MDBlZSwKKwkweDAwZGUsIDB4MDBiZSwgMHgwMDllLCAweDAwMDUsIDB4MDAwMCwgMHgwMDgwLCAweDAwNDAsIDB4MDAwMCwKKwkweDIwMDEsIDB4MTgxMCwgMHgyMDA0LCAweGQwODQsIDB4MDEyMCwgMHgwODBjLCAweDEwMzEsIDB4MTkwNCwKKwkweGNlZjksIDB4NjAxNywgMHhmMTAwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwNDEsIDB4MDgwYywKKwkweDg2NzksIDB4MDgwYywgMHg4YzEwLCAweDBjMDAsIDB4MjA2OSwgMHgwMjYwLCAweDY4NDgsIDB4OTA4NCwKKwkweGZmMDAsIDB4OTA4NiwgMHgxMjAwLCAweDExOTgsIDB4Njg2YywgMHg5MDg0LCAweDAwZmYsIDB4MDAxNiwKKwkweDYxMTQsIDB4OTE4YywgMHhmNzAwLCAweDkxMGQsIDB4NjExNiwgMHgwMDFlLCAweDYwMDMsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDA0MywgMHgwODBjLCAweDg2NzksIDB4MDgwYywgMHg4YzEwLCAweDA4MjgsIDB4Njg2OCwKKwkweDYwMmUsIDB4Njg2YywgMHg2MDMyLCAweDYwMTcsIDB4ZjIwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywKKwkweDAwNDEsIDB4MDgwYywgMHg4Njc5LCAweDA4MGMsIDB4OGMxMCwgMHgwODA0LCAweGNmNDQsIDB4MjAwMSwKKwkweDE4MGUsIDB4MjAwNCwgMHhkMGVjLCAweDAxMjAsIDB4MjAxMSwgMHg4MDQ5LCAweDA4MGMsIDB4NGIxZiwKKwkweDYwMTcsIDB4ZjMwMCwgMHgwMDEwLCAweDYwMTcsIDB4ZjEwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywKKwkweDAwNDEsIDB4MDgwYywgMHg4Njc5LCAweDA4MGMsIDB4OGMxMCwgMHgwODA0LCAweGNmNDQsIDB4NjAxNywKKwkweGY1MDAsIDB4MGM5OCwgMHg2MDE3LCAweGY2MDAsIDB4MDgwNCwgMHhjZjY0LCAweDYwMTcsIDB4ZjIwMCwKKwkweDA4MDQsIDB4Y2Y2NCwgMHhhODY3LCAweDAxNDYsIDB4YTg2YiwgMHgwMDAwLCAweDYwMDgsIDB4YTg4NiwKKwkweDJjMDAsIDB4YTg3YSwgMHg3MDQ0LCAweDkwODQsIDB4MDAwMywgMHg5MDgwLCAweGNmNGMsIDB4MjAwNSwKKwkweGE4N2UsIDB4MjkyOCwgMHg2MDEwLCAweDIwNTgsIDB4YjhhMCwgMHhhODc2LCAweGI4MjgsIDB4YTg4YSwKKwkweGI4MmMsIDB4YTg4ZSwgMHhiODMwLCAweGE4OTIsIDB4YjgzNCwgMHhhODk2LCAweGE4ODMsIDB4MDAzZCwKKwkweDIwMDksIDB4MDIwNSwgMHgyMTA0LCAweDkwODUsIDB4MDA4MCwgMHgyMDBhLCAweDIwZTEsIDB4MDAwMCwKKwkweDIwMTEsIDB4MDIxMCwgMHgyMjE0LCAweDkyOTQsIDB4MGZmZiwgMHhhYWEyLCAweDkyODIsIDB4MDExMSwKKwkweDFhMGMsIDB4MGRmYSwgMHg4MjEwLCAweDgyMWMsIDB4MjAwMSwgMHgwMjZjLCAweDIwOTgsIDB4YTg2MCwKKwkweDIwZTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMjksIDB4MjBhMCwgMHgyMDExLCAweGQwMmUsIDB4MjA0MSwKKwkweDAwMDEsIDB4MjIzZCwgMHg5Nzg0LCAweDAwZmYsIDB4OTMyMiwgMHgxMjA4LCAweDIzMDAsIDB4MjBhOCwKKwkweDQwMDMsIDB4OTMxYSwgMHgwNTMwLCAweDgyMTAsIDB4ZDdmYywgMHgxMTMwLCAweDhkNjgsIDB4MmQwYSwKKwkweDIwMDEsIDB4MDI2MCwgMHgyMDk4LCAweDBjNjgsIDB4Mjk1MCwgMHgwODBjLCAweDEwNGEsIDB4MDE3MCwKKwkweDI5MDAsIDB4YjAwMiwgMHhhODY3LCAweDAxNDcsIDB4YTg2YiwgMHgwMDAwLCAweGE4NjAsIDB4MjBlOCwKKwkweGE4NWMsIDB4OTA4MCwgMHgwMDFiLCAweDIwYTAsIDB4ODg0MCwgMHgwOGQ4LCAweDI1NDgsIDB4YTgwMCwKKwkweDkwMmQsIDB4MDExOCwgMHgwODBjLCAweDEwNjMsIDB4MGNjOCwgMHgwODBjLCAweDEwNjMsIDB4MDgwNCwKKwkweGNmNTAsIDB4MjU0OCwgMHg4ODQ3LCAweDk4ODUsIDB4MDA0NiwgMHhhODY2LCAweDIwMDksIDB4MDIwNSwKKwkweDIwMGIsIDB4MDAwMCwgMHgwODBjLCAweGQ4MzAsIDB4MDgwNCwgMHhjZjQ0LCAweDgwMTAsIDB4MDAwNCwKKwkweDgwMWEsIDB4MDAwNiwgMHg4MDE4LCAweDAwMDgsIDB4ODAxNiwgMHgwMDBhLCAweDgwMTQsIDB4OTE4NiwKKwkweDAwMTMsIDB4MTE2MCwgMHg2MDA0LCAweDkwOGEsIDB4MDA1NCwgMHgxYTBjLCAweDBkZmEsIDB4OTA4MiwKKwkweDAwNDAsIDB4MGEwYywgMHgwZGZhLCAweDIwMDgsIDB4MDgwNCwgMHhkMGUwLCAweDkxODYsIDB4MDA1MSwKKwkweDAxMDgsIDB4MDBjMCwgMHgyMDAxLCAweDAxMDksIDB4MjAwNCwgMHhkMDg0LCAweDA5MDQsIDB4ZDA5MCwKKwkweDAxMjYsIDB4MjA5MSwgMHgyODAwLCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDA4MGMsIDB4ODU2MywKKwkweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAxMmUsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDIsIDB4MTU4MCwKKwkweDA4MDQsIDB4ZDEyOSwgMHg5MTg2LCAweDAwMjcsIDB4MDUzMCwgMHg5MTg2LCAweDAwNDgsIDB4MDEyOCwKKwkweDkxODYsIDB4MDAxNCwgMHgwNTAwLCAweDE5MGMsIDB4MGRmYSwgMHgyMDAxLCAweDAxMDksIDB4MjAwNCwKKwkweGQwODQsIDB4MDFmMCwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHgyODAwLCAweDAwYzYsIDB4MjA2MSwKKwkweDAxMDAsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDgwYywgMHg4NTYzLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMGUsIDB4MDBjZSwgMHgwMTJlLCAweDAwY2UsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDQsIDB4MTkwYywKKwkweDBkZmEsIDB4MDgwNCwgMHhkMjBjLCAweDYwMDQsIDB4OTA4MiwgMHgwMDQwLCAweDIwMDgsIDB4MDAxYSwKKwkweDA4MGMsIDB4YTE3OCwgMHgwMDA1LCAweGQwYTcsIDB4ZDBhOSwgMHhkMGE5LCAweGQwZDAsIDB4ZDBhNywKKwkweGQwYTcsIDB4ZDBhNywgMHhkMGE3LCAweGQwYTcsIDB4ZDBhNywgMHhkMGE3LCAweGQwYTcsIDB4ZDBhNywKKwkweGQwYTcsIDB4ZDBhNywgMHhkMGE3LCAweGQwYTcsIDB4ZDBhNywgMHhkMGE3LCAweGQwYTcsIDB4MDgwYywKKwkweDBkZmEsIDB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4OGMxMCwgMHgwMDM2LCAweDAwOTYsIDB4NjAxNCwKKwkweDkwNGQsIDB4MDFkOCwgMHgwODBjLCAweGJlMzcsIDB4MDFjMCwgMHg2MDAzLCAweDAwMDIsIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgxMTc4LCAweDIwMTksIDB4MDAwNCwKKwkweDA4MGMsIDB4ZDgzMCwgMHg2MDE3LCAweDAwMDAsIDB4NjAxOCwgMHg5MDA1LCAweDExMjAsIDB4MjAwMSwKKwkweDE5NWYsIDB4MjAwNCwgMHg2MDFhLCAweDYwMDMsIDB4MDAwNywgMHgwMDllLCAweDAwM2UsIDB4MDAwNSwKKwkweDAwOTYsIDB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4OGMxMCwgMHgwODBjLCAweGJlMzcsIDB4MDEyMCwKKwkweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweDEwNjMsIDB4MDgwYywgMHhhMTEzLCAweDAwOWUsIDB4MDAwNSwKKwkweDAwMDIsIDB4ZDBmNSwgMHhkMTBjLCAweGQwZjcsIDB4ZDEyMywgMHhkMGY1LCAweGQwZjUsIDB4ZDBmNSwKKwkweGQwZjUsIDB4ZDBmNSwgMHhkMGY1LCAweGQwZjUsIDB4ZDBmNSwgMHhkMGY1LCAweGQwZjUsIDB4ZDBmNSwKKwkweGQwZjUsIDB4ZDBmNSwgMHhkMGY1LCAweGQwZjUsIDB4ZDBmNSwgMHgwODBjLCAweDBkZmEsIDB4MDA5NiwKKwkweDA4MGMsIDB4OGIwNCwgMHg2MDE0LCAweDIwNDgsIDB4YTg3YywgMHhkMGI0LCAweDAxMzgsIDB4NjAwMywKKwkweDAwMDcsIDB4MjAwOSwgMHgwMDQzLCAweDA4MGMsIDB4YTE1ZCwgMHgwMDEwLCAweDYwMDMsIDB4MDAwNCwKKwkweDA4MGMsIDB4OGMxMCwgMHgwMDllLCAweDAwMDUsIDB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4YmUzNywKKwkweDAxMzgsIDB4NjExNCwgMHgwMDk2LCAweDIxNDgsIDB4YTk3YywgMHgwMDllLCAweGQxZWMsIDB4MTEzOCwKKwkweDA4MGMsIDB4ODRhNiwgMHgwODBjLCAweGEwZTMsIDB4MDgwYywgMHg4YzEwLCAweDAwMDUsIDB4MDgwYywKKwkweGRhOGEsIDB4MGRiMCwgMHgwY2M4LCAweDA4MGMsIDB4OGIwNCwgMHgyMDA5LCAweDAwNDEsIDB4MDgwNCwKKwkweGQyOTQsIDB4OTE4MiwgMHgwMDQwLCAweDAwMDIsIDB4ZDE0MCwgMHhkMTQyLCAweGQxNDAsIDB4ZDE0MCwKKwkweGQxNDAsIDB4ZDE0MCwgMHhkMTQwLCAweGQxNDAsIDB4ZDE0MCwgMHhkMTQwLCAweGQxNDAsIDB4ZDE0MCwKKwkweGQxNDAsIDB4ZDE0MCwgMHhkMTQwLCAweGQxNDAsIDB4ZDE0MCwgMHhkMTQzLCAweGQxNDAsIDB4ZDE0MCwKKwkweDA4MGMsIDB4MGRmYSwgMHgwMDA1LCAweDAwZDYsIDB4MDgwYywgMHg4NGE2LCAweDAwZGUsIDB4MDgwYywKKwkweGRhZTIsIDB4MDgwYywgMHhhMGUzLCAweDAwMDUsIDB4OTE4MiwgMHgwMDQwLCAweDAwMDIsIDB4ZDE2MywKKwkweGQxNjMsIDB4ZDE2MywgMHhkMTYzLCAweGQxNjMsIDB4ZDE2MywgMHhkMTYzLCAweGQxNjMsIDB4ZDE2MywKKwkweGQxNjUsIDB4ZDFkNCwgMHhkMTYzLCAweGQxNjMsIDB4ZDE2MywgMHhkMTYzLCAweGQxZDQsIDB4ZDE2MywKKwkweGQxNjMsIDB4ZDE2MywgMHhkMTYzLCAweDA4MGMsIDB4MGRmYSwgMHgyMDAxLCAweDAxMDUsIDB4MjAwNCwKKwkweDkwODQsIDB4MTgwMCwgMHgwMWM4LCAweDIwMDEsIDB4MDEzMiwgMHgyMDBjLCAweDIwMDEsIDB4MDEzMSwKKwkweDIwMDQsIDB4OTEwNSwgMHgxOTA0LCAweGQxZDQsIDB4MjAwOSwgMHgxODBjLCAweDIxMDQsIDB4ZDBkNCwKKwkweDA5MDQsIDB4ZDFkNCwgMHhjMGQ0LCAweDIwMGEsIDB4MjAwOSwgMHgwMTA1LCAweDIxMDQsIDB4OTA4NCwKKwkweGU3ZmQsIDB4OTA4NSwgMHgwMDEwLCAweDIwMGEsIDB4MjAwMSwgMHgxODdiLCAweDIwMDQsIDB4ZDBlNCwKKwkweDE1MjgsIDB4NjAzYiwgMHgwMDAwLCAweDA4MGMsIDB4OGJjMCwgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwKKwkweGE4N2MsIDB4ZDBmYywgMHgwMTg4LCAweDkwOGMsIDB4MDAwMywgMHg5MThlLCAweDAwMDIsIDB4MDUwOCwKKwkweDIwMDEsIDB4MTgwYywgMHgyMDA0LCAweGQwZDQsIDB4MTFlMCwgMHgwODBjLCAweDhjZWQsIDB4MjAwOSwKKwkweDAwNDEsIDB4MDA5ZSwgMHgwODA0LCAweGQyOTQsIDB4MDgwYywgMHg4Y2VkLCAweDYwMDMsIDB4MDAwNywKKwkweDYwMWIsIDB4MDAwMCwgMHgwODBjLCAweDg0YTYsIDB4MDA5ZSwgMHgwMDA1LCAweDIwMDEsIDB4MDEwMCwKKwkweDIwMDQsIDB4OTA4MiwgMHgwMDA1LCAweDBhYTgsIDB4MjAwMSwgMHgwMTFmLCAweDIwMDQsIDB4NjAzYSwKKwkweDA4OTAsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4YzFkNCwgMHgyMTAyLCAweGQxY2MsIDB4MDExMCwKKwkweDA4MGMsIDB4MmJjYSwgMHgwODBjLCAweDhjZWQsIDB4NjAxNCwgMHgyMDQ4LCAweGE5N2MsIDB4ZDFlYywKKwkweDExMzAsIDB4MDgwYywgMHg4NGE2LCAweDA4MGMsIDB4YTBlMywgMHgwMDllLCAweDAwMDUsIDB4MDgwYywKKwkweGRhOGEsIDB4MGRiOCwgMHgwMDllLCAweDAwMDUsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4YzFkNCwKKwkweDIxMDIsIDB4MDAzNiwgMHgwODBjLCAweDhiYzAsIDB4MDgwYywgMHg4Y2VkLCAweDYwMTQsIDB4MDA5NiwKKwkweDIwNDgsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MDE4OCwKKwkweGE4N2MsIDB4OTA4NCwgMHgwMDAzLCAweDkwODYsIDB4MDAwMiwgMHgwMTQwLCAweGE4YWMsIDB4NjMzMCwKKwkweDkzMWEsIDB4NjMzMiwgMHhhOGIwLCAweDYzMmMsIDB4OTMxYiwgMHg2MzJlLCAweDYwMDMsIDB4MDAwMiwKKwkweDAwODAsIDB4MjAxOSwgMHgwMDA0LCAweDA4MGMsIDB4ZDgzMCwgMHg2MDE4LCAweDkwMDUsIDB4MTEyOCwKKwkweDIwMDEsIDB4MTk1ZiwgMHgyMDA0LCAweDgwMDMsIDB4NjAxYSwgMHg2MDE3LCAweDAwMDAsIDB4NjAwMywKKwkweDAwMDcsIDB4MDA5ZSwgMHgwMDNlLCAweDAwMDUsIDB4OTE4MiwgMHgwMDQwLCAweDAwMDIsIDB4ZDIyMywKKwkweGQyMjMsIDB4ZDIyMywgMHhkMjIzLCAweGQyMjMsIDB4ZDIyMywgMHhkMjIzLCAweGQyMjMsIDB4ZDIyNSwKKwkweGQyMjMsIDB4ZDIyMywgMHhkMjIzLCAweGQyMjMsIDB4ZDIyMywgMHhkMjIzLCAweGQyMjMsIDB4ZDIyMywKKwkweGQyMjMsIDB4ZDIyMywgMHhkMjcwLCAweDA4MGMsIDB4MGRmYSwgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwKKwkweGE4MzQsIDB4YWEzOCwgMHg2MTEwLCAweDAwYjYsIDB4MjE1OCwgMHhiOTAwLCAweDAwYmUsIDB4ZDFiYywKKwkweDExOTAsIDB4OTIwZCwgMHgxNTE4LCAweGE4N2MsIDB4ZDBmYywgMHgwMTI4LCAweDIwMDksIDB4MDA0MSwKKwkweDAwOWUsIDB4MDgwNCwgMHhkMjk0LCAweDYwMDMsIDB4MDAwNywgMHg2MDFiLCAweDAwMDAsIDB4MDgwYywKKwkweDg0YTYsIDB4MDA5ZSwgMHgwMDA1LCAweDYxMjQsIDB4ZDFmNCwgMHgxZDU4LCAweDAwMDYsIDB4MDA0NiwKKwkweGFjYWMsIDB4OTQyMiwgMHhhOWIwLCAweDIyMDAsIDB4OTEwYiwgMHg2MDMwLCAweDk0MjAsIDB4NjQzMiwKKwkweDYwMmMsIDB4OTEwOSwgMHg2MTJlLCAweDAwNGUsIDB4MDAwZSwgMHgwOGQ4LCAweDYxMTAsIDB4MDBiNiwKKwkweDIxNTgsIDB4YjkwMCwgMHgwMGJlLCAweGQxYmMsIDB4MTE3OCwgMHgyMDA5LCAweDE4MGUsIDB4MjEwYywKKwkweGQxOWMsIDB4MDExOCwgMHg2MDAzLCAweDAwMDcsIDB4MDAxMCwgMHg2MDAzLCAweDAwMDYsIDB4MDBlOSwKKwkweDA4MGMsIDB4ODRhOCwgMHgwMDllLCAweDAwMDUsIDB4NjAwMywgMHgwMDAyLCAweDAwOWUsIDB4MDAwNSwKKwkweDYwMjQsIDB4ZDBmNCwgMHgwMTI4LCAweDA4MGMsIDB4MTU4MiwgMHgxOTA0LCAweGQyMjUsIDB4MDAwNSwKKwkweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4MzQsIDB4YTkzOCwgMHgwMDllLCAweDkxMDUsIDB4MTEyMCwKKwkweDA4MGMsIDB4MTU4MiwgMHgxOTA0LCAweGQyMjUsIDB4MDAwNSwgMHhkMmZjLCAweDAxNDAsIDB4ODAwMiwKKwkweDgwMDAsIDB4ODIxMiwgMHg5MjkxLCAweDAwMDAsIDB4MjAwOSwgMHgwMDA5LCAweDAwMTAsIDB4MjAwOSwKKwkweDAwMTUsIDB4YWE5YSwgMHhhODk2LCAweDAwMDUsIDB4OTE4MiwgMHgwMDQwLCAweDAyMDgsIDB4MDA2MiwKKwkweDkxODYsIDB4MDAxMywgMHgwMTIwLCAweDkxODYsIDB4MDAxNCwgMHgxOTBjLCAweDBkZmEsIDB4NjAyNCwKKwkweGQwZGMsIDB4MDkwYywgMHgwZGZhLCAweDAwMDUsIDB4ZDJiOCwgMHhkMmM0LCAweGQyZDAsIDB4ZDJkYywKKwkweGQyYjgsIDB4ZDJiOCwgMHhkMmI4LCAweGQyYjgsIDB4ZDJiZiwgMHhkMmJhLCAweGQyYmEsIDB4ZDJiOCwKKwkweGQyYjgsIDB4ZDJiOCwgMHhkMmI4LCAweGQyYmEsIDB4ZDJiOCwgMHhkMmJhLCAweGQyYjgsIDB4ZDJiZiwKKwkweDA4MGMsIDB4MGRmYSwgMHg2MDI0LCAweGQwZGMsIDB4MDkwYywgMHgwZGZhLCAweDAwMDUsIDB4NjAxNCwKKwkweDkwMDUsIDB4MTkwYywgMHgwZGZhLCAweDAwMDUsIDB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MDgwYywKKwkweDg2NzksIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg4YzEwLCAweDAxMmUsIDB4MDAwNSwKKwkweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDA4MGMsIDB4ODY3OSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4OGMxMCwgMHgwMTJlLCAweDAwMDUsIDB4NjAwMywgMHgwMDAzLCAweDYxMDYsIDB4MmMxMCwKKwkweDA4MGMsIDB4MWFmZSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDg2ZGUsIDB4MDgwYywKKwkweDhjZWQsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwMzYsIDB4MDA5NiwKKwkweDkxODIsIDB4MDA0MCwgMHgwMDIzLCAweDAwOWUsIDB4MDAzZSwgMHgwMTJlLCAweDAwMDUsIDB4ZDMwYiwKKwkweGQzMGQsIDB4ZDMxZiwgMHhkMzM5LCAweGQzMGIsIDB4ZDMwYiwgMHhkMzBiLCAweGQzMGIsIDB4ZDMwYiwKKwkweGQzMGIsIDB4ZDMwYiwgMHhkMzBiLCAweGQzMGIsIDB4ZDMwYiwgMHhkMzBiLCAweGQzMGIsIDB4ZDMwYiwKKwkweGQzMGIsIDB4ZDMwYiwgMHhkMzBiLCAweDA4MGMsIDB4MGRmYSwgMHg2MDE0LCAweDIwNDgsIDB4YTg3YywKKwkweGQwZmMsIDB4MDFmOCwgMHg5MDljLCAweDAwMDMsIDB4OTM5ZSwgMHgwMDAzLCAweDAxZDAsIDB4NjAwMywKKwkweDAwMDEsIDB4NjEwNiwgMHgwODBjLCAweDg2NzksIDB4MDgwYywgMHg4YzEwLCAweDA0NzAsIDB4NjAxNCwKKwkweDIwNDgsIDB4YTg3YywgMHhkMGZjLCAweDAxNjgsIDB4OTA5YywgMHgwMDAzLCAweDkzOWUsIDB4MDAwMywKKwkweDAxNDAsIDB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MDgwYywgMHg4Njc5LCAweDA4MGMsIDB4OGMxMCwKKwkweDAwZTAsIDB4OTAxZSwgMHg2MzE2LCAweDYzMWEsIDB4MjAxOSwgMHgwMDA0LCAweDA4MGMsIDB4ZDgzMCwKKwkweDAwYTAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4N2MsIDB4ZDBmYywgMHgwZDk4LCAweDkwOWMsIDB4MDAwMywKKwkweDkzOWUsIDB4MDAwMywgMHgwZDcwLCAweDYwMDMsIDB4MDAwMywgMHg2MTA2LCAweDJjMTAsIDB4MDgwYywKKwkweDFhZmUsIDB4MDgwYywgMHg4NmRlLCAweDA4MGMsIDB4OGNlZCwgMHgwMDA1LCAweDA4MGMsIDB4OGIwNCwKKwkweDYxMTQsIDB4ODFmZiwgMHgwMTU4LCAweDAwOTYsIDB4MjE0OCwgMHgwODBjLCAweGRiMmUsIDB4MDAzNiwKKwkweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweGQ4MzAsIDB4MDAzZSwgMHgwMDllLCAweDA4MGMsIDB4YTExMywKKwkweDA4MGMsIDB4OGMxMCwgMHgwMDA1LCAweDA4MGMsIDB4OGJjMCwgMHg2MTE0LCAweDgxZmYsIDB4MDE1OCwKKwkweDAwOTYsIDB4MjE0OCwgMHgwODBjLCAweGRiMmUsIDB4MDAzNiwgMHgyMDE5LCAweDAwMjksIDB4MDgwYywKKwkweGQ4MzAsIDB4MDAzZSwgMHgwMDllLCAweDA4MGMsIDB4YTExMywgMHgwODBjLCAweDhjZWQsIDB4MDAwNSwKKwkweDkxODIsIDB4MDA4NSwgMHgwMDAyLCAweGQzOGEsIDB4ZDM4OCwgMHhkMzg4LCAweGQzOTYsIDB4ZDM4OCwKKwkweGQzODgsIDB4ZDM4OCwgMHhkMzg4LCAweGQzODgsIDB4ZDM4OCwgMHhkMzg4LCAweGQzODgsIDB4ZDM4OCwKKwkweDA4MGMsIDB4MGRmYSwgMHg2MDAzLCAweDAwMGIsIDB4NjEwNiwgMHgwODBjLCAweDg2NzksIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDhjMTAsIDB4MDEyZSwgMHgwMDA1LCAweDAwMjYsIDB4MDBlNiwKKwkweDA4MGMsIDB4ZGE4MSwgMHgwMTE4LCAweDA4MGMsIDB4YTBlMywgMHgwNDUwLCAweDIwNzEsIDB4MDI2MCwKKwkweDcyMjQsIDB4NjIxNiwgMHgyMDAxLCAweDE4MGUsIDB4MjAwNCwgMHhkMGU0LCAweDAxNTAsIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiY2EwLCAweDAwYmUsIDB4MmMwMCwgMHgyMDExLCAweDAxNGUsIDB4MDgwYywKKwkweGE0MDMsIDB4NzIyMCwgMHgwODBjLCAweGQ2ZDYsIDB4MDExOCwgMHg2MDA3LCAweDAwODYsIDB4MDA0MCwKKwkweDYwMDcsIDB4MDA4NywgMHg3MjI0LCAweDkyOTYsIDB4ZmZmZiwgMHgxMTEwLCAweDYwMDcsIDB4MDA4NiwKKwkweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDg2NzksIDB4MDgwYywgMHg4YzEwLCAweDA4MGMsIDB4OGNlZCwKKwkweDAwZWUsIDB4MDAyZSwgMHgwMDA1LCAweDkxODYsIDB4MDAxMywgMHgxMTYwLCAweDYwMDQsIDB4OTA4YSwKKwkweDAwODUsIDB4MGEwYywgMHgwZGZhLCAweDkwOGEsIDB4MDA5MiwgMHgxYTBjLCAweDBkZmEsIDB4OTA4MiwKKwkweDAwODUsIDB4MDBhMiwgMHg5MTg2LCAweDAwMjcsIDB4MDEzMCwgMHg5MTg2LCAweDAwMTQsIDB4MDExOCwKKwkweDA4MGMsIDB4YTE3OCwgMHgwMDUwLCAweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDY0MWMsIDB4MDgwYywKKwkweDhiMDQsIDB4MDgwYywgMHhhMTEzLCAweDA4MGMsIDB4OGMxMCwgMHgwMDA1LCAweGQzZmIsIDB4ZDNmZCwKKwkweGQzZmQsIDB4ZDNmYiwgMHhkM2ZiLCAweGQzZmIsIDB4ZDNmYiwgMHhkM2ZiLCAweGQzZmIsIDB4ZDNmYiwKKwkweGQzZmIsIDB4ZDNmYiwgMHhkM2ZiLCAweDA4MGMsIDB4MGRmYSwgMHgwODBjLCAweDhiMDQsIDB4MDgwYywKKwkweGExMTMsIDB4MDgwYywgMHg4YzEwLCAweDAwMDUsIDB4OTE4MiwgMHgwMDg1LCAweDBhMGMsIDB4MGRmYSwKKwkweDkxODIsIDB4MDA5MiwgMHgxYTBjLCAweDBkZmEsIDB4OTE4MiwgMHgwMDg1LCAweDAwMDIsIDB4ZDQxYywKKwkweGQ0MWMsIDB4ZDQxYywgMHhkNDFlLCAweGQ0MWMsIDB4ZDQxYywgMHhkNDFjLCAweGQ0MWMsIDB4ZDQxYywKKwkweGQ0MWMsIDB4ZDQxYywgMHhkNDFjLCAweGQ0MWMsIDB4MDgwYywgMHgwZGZhLCAweDAwMDUsIDB4OTE4NiwKKwkweDAwMTMsIDB4MDE0OCwgMHg5MTg2LCAweDAwMTQsIDB4MDEzMCwgMHg5MTg2LCAweDAwMjcsIDB4MDExOCwKKwkweDA4MGMsIDB4YTE3OCwgMHgwMDMwLCAweDA4MGMsIDB4OGIwNCwgMHgwODBjLCAweGExMTMsIDB4MDgwYywKKwkweDhjMTAsIDB4MDAwNSwgMHgwMDM2LCAweDA4MGMsIDB4ZGFlMiwgMHg2MDQzLCAweDAwMDAsIDB4MjAxOSwKKwkweDAwMGIsIDB4MDAzMSwgMHg2MDIzLCAweDAwMDYsIDB4NjAwMywgMHgwMDA3LCAweDAwM2UsIDB4MDAwNSwKKwkweDAxMjYsIDB4MDAzNiwgMHgyMDkxLCAweDgwMDAsIDB4MDA4NiwgMHgyYzQwLCAweDAwOTYsIDB4OTA0ZSwKKwkweDA4MGMsIDB4OWE1OCwgMHgwMDllLCAweDAwOGUsIDB4MTU1MCwgMHgwMDc2LCAweDJjMzgsIDB4MDgwYywKKwkweDliMDMsIDB4MDA3ZSwgMHgxNTIwLCAweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDA1MDAsIDB4NjAyMCwKKwkweDkwODYsIDB4MDAwNywgMHgwMWUwLCAweDAwOTYsIDB4NjAxYywgMHhkMDg0LCAweDAxNDAsIDB4MDgwYywKKwkweGRhZTIsIDB4MDgwYywgMHhjNTUxLCAweDA4MGMsIDB4MTliNCwgMHg2MDIzLCAweDAwMDcsIDB4NjAxNCwKKwkweDIwNDgsIDB4MDgwYywgMHhiZTM3LCAweDAxMTAsIDB4MDgwYywgMHhkODMwLCAweDAwOWUsIDB4NjAxNywKKwkweDAwMDAsIDB4MDgwYywgMHhkYWUyLCAweDYwMjMsIDB4MDAwNywgMHgwODBjLCAweGM1NTEsIDB4MDAzZSwKKwkweDAxMmUsIDB4MDAwNSwgMHgwMGY2LCAweDAwYzYsIDB4MDBiNiwgMHgwMDM2LCAweDAxNTYsIDB4MjA3OSwKKwkweDAyNjAsIDB4NzkzOCwgMHg3ODNjLCAweDA4MGMsIDB4Mjc2ZSwgMHgxNWM4LCAweDAwMTYsIDB4MDBjNiwKKwkweDA4MGMsIDB4NjQ5ZiwgMHgxNTkwLCAweDAwMWUsIDB4MDBjNiwgMHgyMTYwLCAweDA4MGMsIDB4YzU0ZSwKKwkweDAwY2UsIDB4MDAyZSwgMHgwMDI2LCAweDAwMTYsIDB4MjAxOSwgMHgwMDI5LCAweDA4MGMsIDB4OWJjOSwKKwkweDA4MGMsIDB4ODgwMywgMHgwMDc2LCAweDkwM2UsIDB4MDgwYywgMHg4NmYxLCAweDAwN2UsIDB4MDAxZSwKKwkweDAwNzYsIDB4OTAzZSwgMHgwODBjLCAweGQ1ZjYsIDB4MDA3ZSwgMHgwMDI2LCAweGJhMDQsIDB4OTI5NCwKKwkweGZmMDAsIDB4ODIxNywgMHg5Mjg2LCAweDAwMDYsIDB4MDExOCwgMHg5Mjg2LCAweDAwMDQsIDB4MTExOCwKKwkweGJhYTAsIDB4MDgwYywgMHgzMjQ4LCAweDAwMmUsIDB4YmNiMCwgMHgwMDFlLCAweDA4MGMsIDB4NWY0NSwKKwkweGJlMTIsIDB4YmQxNiwgMHhiY2IyLCAweDkwMDYsIDB4MDAxMCwgMHgwMGNlLCAweDAwMWUsIDB4MDE1ZSwKKwkweDAwM2UsIDB4MDBiZSwgMHgwMGNlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGM2LCAweDAwZDYsIDB4MDBiNiwKKwkweDAwMTYsIDB4MjAwOSwgMHgxODIzLCAweDIxMDQsIDB4OTA4NiwgMHgwMDc0LCAweDE5MDQsIDB4ZDUxZSwKKwkweDIwNjksIDB4MDI2MCwgMHg2OTQ0LCAweDkxODIsIDB4MDEwMCwgMHgwNmUwLCAweDY5NDAsIDB4OTE4NCwKKwkweDgwMDAsIDB4MDkwNCwgMHhkNTFiLCAweDIwMDEsIDB4MTk1NCwgMHgyMDA0LCAweDkwMDUsIDB4MTE0MCwKKwkweDYwMTAsIDB4MjA1OCwgMHhiOGIwLCAweDkwMDUsIDB4MDExOCwgMHg5MTg0LCAweDA4MDAsIDB4MDU5OCwKKwkweDY5NDgsIDB4OTE4YSwgMHgwMDAxLCAweDA2NDgsIDB4MDgwYywgMHhkYjk2LCAweDAxMTgsIDB4Njk3OCwKKwkweGQxZmMsIDB4MTFiOCwgMHgyMDA5LCAweDAyMDUsIDB4MjAwYiwgMHgwMDAxLCAweDY5M2MsIDB4ODFmZiwKKwkweDExOTgsIDB4Njk0NCwgMHg5MTgyLCAweDAxMDAsIDB4MDJhOCwgMHg2OTQwLCAweDgxZmYsIDB4MTE3OCwKKwkweDY5NDgsIDB4OTE4YSwgMHgwMDAxLCAweDAyODgsIDB4Njk1MCwgMHg5MThhLCAweDAwMDEsIDB4MDI5OCwKKwkweDAwZDAsIDB4NjAxNywgMHgwMTAwLCAweDAwYTAsIDB4NjAxNywgMHgwMzAwLCAweDAwODgsIDB4NjAxNywKKwkweDA1MDAsIDB4MDA3MCwgMHg2MDE3LCAweDA3MDAsIDB4MDA1OCwgMHg2MDE3LCAweDA5MDAsIDB4MDA0MCwKKwkweDYwMTcsIDB4MGIwMCwgMHgwMDI4LCAweDYwMTcsIDB4MGYwMCwgMHgwMDEwLCAweDYwMTcsIDB4MmQwMCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA4LCAweDkwMDYsIDB4MDAxZSwgMHgwMGJlLCAweDAwZGUsIDB4MDBjZSwKKwkweDAwMDUsIDB4MDBjNiwgMHgwMGI2LCAweDAwMjYsIDB4MDAzNiwgMHgwMTU2LCAweDYyMTAsIDB4MjI1OCwKKwkweGJiMDQsIDB4OTM5NCwgMHgwMGZmLCAweDkyODYsIDB4MDAwNiwgMHgwMTgwLCAweDkyODYsIDB4MDAwNCwKKwkweDAxNjgsIDB4OTM5NCwgMHhmZjAwLCAweDgyMTcsIDB4OTI4NiwgMHgwMDA2LCAweDAxMzgsIDB4OTI4NiwKKwkweDAwMDQsIDB4MDEyMCwgMHgwODBjLCAweDY0YWUsIDB4MDgwNCwgMHhkNTg1LCAweDIwMTEsIDB4MDI3NiwKKwkweDIwYTksIDB4MDAwNCwgMHgwMDk2LCAweDJiNDgsIDB4MjAxOSwgMHgwMDBhLCAweDA4MGMsIDB4YjBkMCwKKwkweDAwOWUsIDB4MTVhMCwgMHgyMDExLCAweDAyN2EsIDB4MjBhOSwgMHgwMDA0LCAweDAwOTYsIDB4MmI0OCwKKwkweDIwMTksIDB4MDAwNiwgMHgwODBjLCAweGIwZDAsIDB4MDA5ZSwgMHgxNTQwLCAweDAwNDYsIDB4MDAxNiwKKwkweGJhYTAsIDB4MjIyMCwgMHg5MDA2LCAweDIwMDksIDB4MTg1YywgMHgyMTBjLCAweDAwMzgsIDB4MjAwOSwKKwkweDAwMjksIDB4MDgwYywgMHhkODg1LCAweGI4MDAsIDB4YzBlNSwgMHhiODAyLCAweDIwMTksIDB4MDAyOSwKKwkweDA4MGMsIDB4ODgwMywgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweDg2ZjEsIDB4MmMwOCwKKwkweDA4MGMsIDB4ZDVmNiwgMHgwMDdlLCAweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDY0MWMsIDB4MjAwMSwKKwkweDAwMDcsIDB4MDgwYywgMHg2M2YwLCAweDAwMWUsIDB4MDA0ZSwgMHg5MDA2LCAweDAxNWUsIDB4MDAzZSwKKwkweDAwMmUsIDB4MDBiZSwgMHgwMGNlLCAweDAwMDUsIDB4MDBkNiwgMHgyMDY5LCAweDAyNmUsIDB4NjgwMCwKKwkweDkwODYsIDB4MDgwMCwgMHgwMTE4LCAweDYwMTcsIDB4MDAwMCwgMHgwMDA4LCAweDkwMDYsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDBiNiwgMHgwMGY2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAxNTYsIDB4MjA3OSwKKwkweDAyNmMsIDB4NzkzMCwgMHg3ODM0LCAweDA4MGMsIDB4Mjc2ZSwgMHgxMWQwLCAweDA4MGMsIDB4NjQ5ZiwKKwkweDExYjgsIDB4MjAxMSwgMHgwMjcwLCAweDIwYTksIDB4MDAwNCwgMHgwMDk2LCAweDJiNDgsIDB4MjAxOSwKKwkweDAwMGEsIDB4MDgwYywgMHhiMGQwLCAweDAwOWUsIDB4MTE1OCwgMHgyMDExLCAweDAyNzQsIDB4MjBhOSwKKwkweDAwMDQsIDB4MDA5NiwgMHgyYjQ4LCAweDIwMTksIDB4MDAwNiwgMHgwODBjLCAweGIwZDAsIDB4MDA5ZSwKKwkweDAxNWUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDBmZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBiNiwKKwkweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDE1NiwgMHgyMDExLCAweDAyNjMsIDB4MjIwNCwKKwkweDgyMTEsIDB4MjIwYywgMHgwODBjLCAweDI3NmUsIDB4MTFkMCwgMHgwODBjLCAweDY0OWYsIDB4MTFiOCwKKwkweDIwMTEsIDB4MDI3NiwgMHgyMGE5LCAweDAwMDQsIDB4MDA5NiwgMHgyYjQ4LCAweDIwMTksIDB4MDAwYSwKKwkweDA4MGMsIDB4YjBkMCwgMHgwMDllLCAweDExNTgsIDB4MjAxMSwgMHgwMjdhLCAweDIwYTksIDB4MDAwNCwKKwkweDAwOTYsIDB4MmI0OCwgMHgyMDE5LCAweDAwMDYsIDB4MDgwYywgMHhiMGQwLCAweDAwOWUsIDB4MDE1ZSwKKwkweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDBiZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwKKwkweDAwODYsIDB4MDA3NiwgMHgwMDY2LCAweDAwNTYsIDB4MDA0NiwgMHgwMDI2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4Mjc0MCwgMHgyMDI5LCAweDE5YzgsIDB4MjUyYywgMHgyMDIxLCAweDE5Y2UsIDB4MjQyNCwKKwkweDIwNjEsIDB4MWNkMCwgMHgyMDcxLCAweDE4MDAsIDB4NzY1MCwgMHg3MDcwLCAweDgxZmYsIDB4MDE1MCwKKwkweDAwMDYsIDB4OTE4NiwgMHgxYThhLCAweDAwMGUsIDB4MDEyOCwgMHg4MDAxLCAweDk2MDIsIDB4MWEwNCwKKwkweGQ2OGYsIDB4MDAxOCwgMHg5NjA2LCAweDA5MDQsIDB4ZDY4ZiwgMHgyMTAwLCAweDljMDYsIDB4MDkwNCwKKwkweGQ2ODYsIDB4MDgwYywgMHhkOGM2LCAweDE5MDQsIDB4ZDY4NiwgMHgwODBjLCAweGRiYjMsIDB4MDkwNCwKKwkweGQ2ODYsIDB4MDgwYywgMHhkOGI2LCAweDA5MDQsIDB4ZDY4NiwgMHg2NzIwLCAweDk3ODYsIDB4MDAwMSwKKwkweDExNDgsIDB4MDgwYywgMHgzMmRmLCAweDA5MDQsIDB4ZDZhYSwgMHg2MDA0LCAweDkwODYsIDB4MDAwMCwKKwkweDE5MDQsIDB4ZDZhYSwgMHg5Nzg2LCAweDAwMDQsIDB4MDkwNCwgMHhkNmFhLCAweDk3ODYsIDB4MDAwNywKKwkweDA5MDQsIDB4ZDY4NiwgMHgyNTAwLCAweDljMDYsIDB4MDkwNCwgMHhkNjg2LCAweDI0MDAsIDB4OWMwNiwKKwkweDA1ZTgsIDB4ODhmZiwgMHgwMTE4LCAweDYwNTQsIDB4OTkwNiwgMHgxNWMwLCAweDAwOTYsIDB4NjAwMCwKKwkweDkwODYsIDB4MDAwNCwgMHgxMTIwLCAweDAwMTYsIDB4MDgwYywgMHgxOWI0LCAweDAwMWUsIDB4OTc4NiwKKwkweDAwMGEsIDB4MDE0OCwgMHgwODBjLCAweGMwM2YsIDB4MTEzMCwgMHgwODBjLCAweGFhODEsIDB4MDA5ZSwKKwkweDA4MGMsIDB4YTExMywgMHgwNDE4LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGJlMzcsIDB4MDFkOCwKKwkweDk3ODYsIDB4MDAwMywgMHgxNTcwLCAweGE4NjcsIDB4MDEwMywgMHhhODdjLCAweGQwY2MsIDB4MDEzMCwKKwkweDAwOTYsIDB4YTg3OCwgMHgyMDQ4LCAweDA4MGMsIDB4MGZlMywgMHgwMDllLCAweGFiN2EsIDB4YTg3NywKKwkweDAwMDAsIDB4MDgwYywgMHhkYjJlLCAweDAwMTYsIDB4MDgwYywgMHhjMTJkLCAweDA4MGMsIDB4NmFkYywKKwkweDAwMWUsIDB4MDgwYywgMHhjMDIyLCAweDAwOWUsIDB4MDgwYywgMHhhMTEzLCAweDljZTAsIDB4MDAxOCwKKwkweDIwMDEsIDB4MTgxOSwgMHgyMDA0LCAweDljMDIsIDB4MTIxMCwgMHgwODA0LCAweGQ2MGEsIDB4MDEyZSwKKwkweDAwMmUsIDB4MDA0ZSwgMHgwMDVlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMDhlLCAweDAwY2UsIDB4MDBlZSwKKwkweDAwMDUsIDB4OTc4NiwgMHgwMDA2LCAweDExNTAsIDB4OTM4NiwgMHgwMDA1LCAweDAxMjgsIDB4MDgwYywKKwkweGRiMmUsIDB4MDgwYywgMHhkODMwLCAweDA4ZjgsIDB4MDA5ZSwgMHgwYzAwLCAweDk3ODYsIDB4MDAwYSwKKwkweDA5NjgsIDB4MDgwOCwgMHg4MWZmLCAweDA5ZDAsIDB4OTE4MCwgMHgwMDAxLCAweDIwMDQsIDB4OTA4NiwKKwkweDAwMTgsIDB4MDEzMCwgMHg5MTgwLCAweDAwMDEsIDB4MjAwNCwgMHg5MDg2LCAweDAwMmQsIDB4MTk3MCwKKwkweDYwMDAsIDB4OTA4NiwgMHgwMDAyLCAweDE5NTAsIDB4MDgwYywgMHhjMDJlLCAweDAxMzAsIDB4MDgwYywKKwkweGMwM2YsIDB4MTkyMCwgMHgwODBjLCAweGFhODEsIDB4MDAzOCwgMHgwODBjLCAweDMxYjQsIDB4MDgwYywKKwkweGMwM2YsIDB4MTExMCwgMHgwODBjLCAweGFhODEsIDB4MDgwYywgMHhhMTEzLCAweDA4MDQsIDB4ZDY4NiwKKwkweGE4NjQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAzOSwgMHgwMDA1LCAweDAwYzYsIDB4MDBlNiwKKwkweDAwMTYsIDB4MmMwOCwgMHgyMTcwLCAweDkwMDYsIDB4MDgwYywgMHhkODU3LCAweDAwMWUsIDB4MDEyMCwKKwkweDYwMjAsIDB4OTA4NCwgMHgwMDBmLCAweDAwMWIsIDB4MDBlZSwgMHgwMGNlLCAweDAwMDUsIDB4ZDZmNSwKKwkweGQ2ZjUsIDB4ZDZmNSwgMHhkNmY1LCAweGQ2ZjUsIDB4ZDZmNSwgMHhkNmY3LCAweGQ2ZjUsIDB4ZDZmNSwKKwkweGQ2ZjUsIDB4ZDZmNSwgMHhhMTEzLCAweGExMTMsIDB4ZDZmNSwgMHg5MDA2LCAweDAwMDUsIDB4MDAzNiwKKwkweDAwNDYsIDB4MDAxNiwgMHg3MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiY2EwLCAweDAwYmUsIDB4MmMwMCwKKwkweDIwMDksIDB4MDAyMCwgMHgwODBjLCAweGQ4ODUsIDB4MDAxZSwgMHgwMDRlLCAweDIwMTksIDB4MDAwMiwKKwkweDA4MGMsIDB4ZDQ0MCwgMHgwMDNlLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwOTYsIDB4MDgwYywKKwkweGJlMzcsIDB4MDE0MCwgMHg2MDE0LCAweDkwNGQsIDB4MDgwYywgMHhiYTU2LCAweDY4N2IsIDB4MDAwNSwKKwkweDA4MGMsIDB4NmFlOSwgMHgwMDllLCAweDA4MGMsIDB4YTExMywgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwKKwkweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDYzZGMsIDB4MDE1NiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwKKwkweDIwYTksIDB4MDAwNCwgMHgyMDE5LCAweDE4MDUsIDB4MjAxMSwgMHgwMjc2LCAweDA4MGMsIDB4YjBiYywKKwkweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAxNWUsIDB4OTAwNSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwKKwkweDAwYzYsIDB4MDA4NiwgMHgwMDc2LCAweDAwNjYsIDB4MDBiNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDI3NDAsIDB4MjA2MSwgMHgxY2QwLCAweDIwNzksIDB4MDAwMSwgMHg4ZmZmLCAweDA5MDQsIDB4ZDc5MCwKKwkweDIwNzEsIDB4MTgwMCwgMHg3NjUwLCAweDcwNzAsIDB4ODAwMSwgMHg5NjAyLCAweDFhMDQsIDB4ZDc5MCwKKwkweDg4ZmYsIDB4MDEyMCwgMHgyODAwLCAweDljMDYsIDB4MTU5MCwgMHgyMDc4LCAweDA4MGMsIDB4ZDhiNiwKKwkweDA1NzAsIDB4MjQwMCwgMHg5YzA2LCAweDA1NTgsIDB4NjcyMCwgMHg5Nzg2LCAweDAwMDYsIDB4MTUzOCwKKwkweDk3ODYsIDB4MDAwNywgMHgwNTIwLCAweDg4ZmYsIDB4MTE0MCwgMHg2MDEwLCAweDliMDYsIDB4MTFmOCwKKwkweDg1ZmYsIDB4MDExOCwgMHg2MDU0LCAweDkxMDYsIDB4MTFkMCwgMHgwMDk2LCAweDYwMWMsIDB4ZDA4NCwKKwkweDAxNDAsIDB4MDgwYywgMHhkYWUyLCAweDA4MGMsIDB4YzU1MSwgMHgwODBjLCAweDE5YjQsIDB4NjAyMywKKwkweDAwMDcsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4YmUzNywgMHgwMTIwLCAweDAwNDYsIDB4MDgwYywKKwkweGQ4MzAsIDB4MDA0ZSwgMHgwMDllLCAweDA4MGMsIDB4YTExMywgMHg4OGZmLCAweDExOTgsIDB4OWNlMCwKKwkweDAwMTgsIDB4MjAwMSwgMHgxODE5LCAweDIwMDQsIDB4OWMwMiwgMHgxMjEwLCAweDA4MDQsIDB4ZDc0NSwKKwkweDkwMDYsIDB4MDEyZSwgMHgwMGJlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMDhlLCAweDAwY2UsIDB4MDBlZSwKKwkweDAwZmUsIDB4MDAwNSwgMHg5OGM1LCAweDAwMDEsIDB4MGNhMCwgMHgwMGI2LCAweDAwNzYsIDB4MDA1NiwKKwkweDAwODYsIDB4OTA0NiwgMHgyMDI5LCAweDAwMDEsIDB4MmMyMCwgMHgyMDE5LCAweDAwMDIsIDB4NjIxMCwKKwkweDIyNTgsIDB4MDA5NiwgMHg5MDRlLCAweDA4MGMsIDB4OWE1OCwgMHgwMDllLCAweDAwOGUsIDB4OTAzZSwKKwkweDA4MGMsIDB4OWIwMywgMHgwODBjLCAweGQ3MzYsIDB4MDA1ZSwgMHgwMDdlLCAweDAwYmUsIDB4MDAwNSwKKwkweDAwYjYsIDB4MDA0NiwgMHgwMDU2LCAweDAwNzYsIDB4MDBjNiwgMHgwMTU2LCAweDJjMjAsIDB4MjEyOCwKKwkweDIwYTksIDB4MDA3ZiwgMHg5MDBlLCAweDAwMTYsIDB4MDAzNiwgMHgwODBjLCAweDY0OWYsIDB4MTE5MCwKKwkweDAwNTYsIDB4MDA4NiwgMHg5MDQ2LCAweDI1MDgsIDB4MjAyOSwgMHgwMDAxLCAweDAwOTYsIDB4OTA0ZSwKKwkweDA4MGMsIDB4OWE1OCwgMHgwMDllLCAweDAwOGUsIDB4OTAzZSwgMHgwODBjLCAweDliMDMsIDB4MDgwYywKKwkweGQ3MzYsIDB4MDA1ZSwgMHgwMDNlLCAweDAwMWUsIDB4ODEwOCwgMHgxZjA0LCAweGQ3YzMsIDB4MDE1ZSwKKwkweDAwY2UsIDB4MDA3ZSwgMHgwMDVlLCAweDAwNGUsIDB4MDBiZSwgMHgwMDA1LCAweDAwYjYsIDB4MDA3NiwKKwkweDAwNTYsIDB4NjIxMCwgMHgyMjU4LCAweDAwODYsIDB4OTA0NiwgMHgyMDI5LCAweDAwMDEsIDB4MjAxOSwKKwkweDAwNDgsIDB4MDA5NiwgMHg5MDRlLCAweDA4MGMsIDB4OWE1OCwgMHgwMDllLCAweDAwOGUsIDB4OTAzZSwKKwkweDA4MGMsIDB4OWIwMywgMHgyYzIwLCAweDA4MGMsIDB4ZDczNiwgMHgwMDVlLCAweDAwN2UsIDB4MDBiZSwKKwkweDAwMDUsIDB4MDBiNiwgMHgwMDQ2LCAweDAwNTYsIDB4MDA3NiwgMHgwMGM2LCAweDAxNTYsIDB4MmMyMCwKKwkweDIwYTksIDB4MDgwMCwgMHg5MDBlLCAweDAwMTYsIDB4MDAzNiwgMHgwODBjLCAweDY0OWYsIDB4MTFhMCwKKwkweDAwODYsIDB4OTA0NiwgMHgyODI4LCAweDAwNDYsIDB4MjAyMSwgMHgwMDAxLCAweDA4MGMsIDB4ZGFjNiwKKwkweDAwNGUsIDB4MDA5NiwgMHg5MDRlLCAweDA4MGMsIDB4OWE1OCwgMHgwMDllLCAweDAwOGUsIDB4OTAzZSwKKwkweDA4MGMsIDB4OWIwMywgMHgwODBjLCAweGQ3MzYsIDB4MDAzZSwgMHgwMDFlLCAweDgxMDgsIDB4MWYwNCwKKwkweGQ4MGIsIDB4MDE1ZSwgMHgwMGNlLCAweDAwN2UsIDB4MDA1ZSwgMHgwMDRlLCAweDAwYmUsIDB4MDAwNSwKKwkweDAwMTYsIDB4MDBmNiwgMHgwODBjLCAweGJlMzUsIDB4MDE5OCwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwKKwkweDkwODYsIDB4MDA0NiwgMHgwMTgwLCAweGE4MDAsIDB4OTA3ZCwgMHgwMTM4LCAweGE4MDMsIDB4MDAwMCwKKwkweGFiODIsIDB4MDgwYywgMHg2YWU5LCAweDJmNDgsIDB4MGNiMCwgMHhhYjgyLCAweDA4MGMsIDB4NmFlOSwKKwkweDAwZmUsIDB4MDAxZSwgMHgwMDA1LCAweGE4MDAsIDB4OTA3ZCwgMHgwMTMwLCAweGE4MDMsIDB4MDAwMCwKKwkweDA4MGMsIDB4NmFlOSwgMHgyZjQ4LCAweDBjYjgsIDB4MDgwYywgMHg2YWU5LCAweDBjODgsIDB4MDBlNiwKKwkweDAwNDYsIDB4MDAzNiwgMHgyMDYxLCAweDFjZDAsIDB4OTAwNSwgMHgxMTM4LCAweDIwNzEsIDB4MTgwMCwKKwkweDc0NTAsIDB4NzA3MCwgMHg4MDAxLCAweDk0MDIsIDB4MTJkOCwgMHgyMTAwLCAweDljMDYsIDB4MDE2OCwKKwkweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDAxNDgsIDB4NjAwOCwgMHg5MjA2LCAweDExMzAsIDB4NjAxMCwKKwkweDkxYTAsIDB4MDAwNCwgMHgyNDI0LCAweDk0MDYsIDB4MDE0MCwgMHg5Y2UwLCAweDAwMTgsIDB4MjAwMSwKKwkweDE4MTksIDB4MjAwNCwgMHg5YzAyLCAweDEyMjAsIDB4MGM0MCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwOCwKKwkweDkwMDYsIDB4MDAzZSwgMHgwMDRlLCAweDAwZWUsIDB4MDAwNSwgMHgwMDk2LCAweDAwMDYsIDB4MDgwYywKKwkweDEwMzEsIDB4MDAwZSwgMHgwOTBjLCAweDBkZmEsIDB4YWFlMiwgMHhhODY3LCAweDAxMGQsIDB4YTg4ZSwKKwkweDAwMjYsIDB4MjAxMCwgMHgwODBjLCAweGJlMjUsIDB4MjAwMSwgMHgwMDAwLCAweDAxMjAsIDB4MjIwMCwKKwkweDkwODAsIDB4MDAxNSwgMHgyMDA0LCAweDAwMmUsIDB4YTg3YSwgMHg5MTg2LCAweDAwMjAsIDB4MDExMCwKKwkweGE4ZTMsIDB4ZmZmZiwgMHhhOTg2LCAweGFjNzYsIDB4YTg3ZiwgMHgwMDAwLCAweDIwMDEsIDB4MTk2NiwKKwkweDIwMDQsIDB4YTg4MiwgMHg5MDA2LCAweGE4MDIsIDB4YTg2YSwgMHhhODhhLCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDgwYywgMHg2YWU5LCAweDAxMmUsIDB4MDA5ZSwgMHgwMDA1LCAweDY3MDAsIDB4OTc4NiwKKwkweDAwMDAsIDB4MDE1OCwgMHg5Nzg2LCAweDAwMDEsIDB4MDE0MCwgMHg5Nzg2LCAweDAwMGEsIDB4MDEyOCwKKwkweDk3ODYsIDB4MDAwOSwgMHgwMTEwLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwZTYsIDB4NjAxMCwKKwkweDkwNzUsIDB4MDEzOCwgMHgwMGI2LCAweDIwNTgsIDB4YjhhMCwgMHgwMGJlLCAweDkyMDYsIDB4MDBlZSwKKwkweDAwMDUsIDB4OTA4NSwgMHgwMDAxLCAweDBjZDgsIDB4MDAxNiwgMHg2MDA0LCAweDkwOGUsIDB4MDAxZSwKKwkweDExYTAsIDB4ODAwNywgMHg2MTM0LCAweDkxOGMsIDB4MDBmZiwgMHg5MTA1LCAweDYwMzYsIDB4NjAwNywKKwkweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMjMsIDB4MDAwNSwgMHgyMDAxLCAweDE5NWYsIDB4MjAwNCwKKwkweDYwMWEsIDB4MDgwYywgMHg4Njc5LCAweDA4MGMsIDB4OGMxMCwgMHgwMDFlLCAweDAwMDUsIDB4YTAwMSwKKwkweGEwMDEsIDB4MDAwNSwgMHg2MDI0LCAweGQwZTQsIDB4MDE1OCwgMHhkMGNjLCAweDAxMTgsIDB4MDgwYywKKwkweGMxNzEsIDB4MDAzMCwgMHgwODBjLCAweGRhZTIsIDB4MDgwYywgMHg4NGE2LCAweDA4MGMsIDB4YTBlMywKKwkweDAwMDUsIDB4OTI4MCwgMHgwMDA4LCAweDIwMDQsIDB4OTA4NCwgMHgwMDBmLCAweDAwMDIsIDB4ZDkxNSwKKwkweGQ5MTUsIDB4ZDkxNSwgMHhkOTE3LCAweGQ5MTUsIDB4ZDkxNywgMHhkOTE3LCAweGQ5MTUsIDB4ZDkxNywKKwkweGQ5MTUsIDB4ZDkxNSwgMHhkOTE1LCAweGQ5MTUsIDB4ZDkxNSwgMHg5MDA2LCAweDAwMDUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAwNSwgMHg5MjgwLCAweDAwMDgsIDB4MjAwNCwgMHg5MDg0LCAweDAwMGYsIDB4MDAwMiwKKwkweGQ5MmUsIDB4ZDkyZSwgMHhkOTJlLCAweGQ5MmUsIDB4ZDkyZSwgMHhkOTJlLCAweGQ5M2IsIDB4ZDkyZSwKKwkweGQ5MmUsIDB4ZDkyZSwgMHhkOTJlLCAweGQ5MmUsIDB4ZDkyZSwgMHhkOTJlLCAweDYwMDcsIDB4MDAzYiwKKwkweDYwMmYsIDB4MDAwOSwgMHg2MDE3LCAweDJhMDAsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4ODY3OSwKKwkweDA4MGMsIDB4OGMxMCwgMHgwMDA1LCAweDAwOTYsIDB4MDBjNiwgMHgyMjYwLCAweDA4MGMsIDB4ZGFlMiwKKwkweDYwNDMsIDB4MDAwMCwgMHg2MDI0LCAweGMwZjQsIDB4YzBlNCwgMHg2MDI2LCAweDYwM2IsIDB4MDAwMCwKKwkweDAwY2UsIDB4MDBkNiwgMHgyMjY4LCAweDkxODYsIDB4MDAwNywgMHgxOTA0LCAweGQ5OTQsIDB4NjgxNCwKKwkweDkwMDUsIDB4MDEzOCwgMHgyMDQ4LCAweGE4N2MsIDB4ZDBmYywgMHgxMTE4LCAweDAwZGUsIDB4MDA5ZSwKKwkweDA4YTgsIDB4NjAwNywgMHgwMDNhLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDg2NzksIDB4MDgwYywKKwkweDhjMTAsIDB4MDBjNiwgMHgyZDYwLCAweDYxMDAsIDB4OTE4NiwgMHgwMDAyLCAweDE5MDQsIDB4ZGEwYiwKKwkweDYwMTQsIDB4OTAwNSwgMHgxMTM4LCAweDYwMDAsIDB4OTA4NiwgMHgwMDA3LCAweDE5MGMsIDB4MGRmYSwKKwkweDA4MDQsIDB4ZGEwYiwgMHgyMDQ4LCAweDA4MGMsIDB4YmUzNywgMHgxMTMwLCAweDAwMjgsIDB4MjA0OCwKKwkweGE4MDAsIDB4OTAwNSwgMHgxZGUwLCAweDI5MDAsIDB4MjA0OCwgMHhhODdjLCAweDkwODQsIDB4MDAwMywKKwkweDkwODYsIDB4MDAwMiwgMHgxMTY4LCAweGE4N2MsIDB4YzBkYywgMHhjMGY0LCAweGE4N2UsIDB4YTg4MCwKKwkweGMwZmMsIDB4YTg4MiwgMHgyMDA5LCAweDAwNDMsIDB4MDgwYywgMHhkMjk0LCAweDA4MDQsIDB4ZGEwYiwKKwkweDIwMDksIDB4MDA0MSwgMHgwODA0LCAweGRhMDUsIDB4OTE4NiwgMHgwMDA1LCAweDE1YTAsIDB4NjgxNCwKKwkweDIwNDgsIDB4YTg3YywgMHhkMGJjLCAweDExMjAsIDB4MDBkZSwgMHgwMDllLCAweDA4MDQsIDB4ZDkyZSwKKwkweGQwYjQsIDB4MDEyOCwgMHhkMGZjLCAweDA5MGMsIDB4MGRmYSwgMHgwODA0LCAweGQ5NGYsIDB4NjAwNywKKwkweDAwM2EsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4ODY3OSwgMHgwODBjLCAweDhjMTAsIDB4MDBjNiwKKwkweDJkNjAsIDB4NjEwMCwgMHg5MTg2LCAweDAwMDIsIDB4MDEyMCwgMHg5MTg2LCAweDAwMDQsIDB4MTkwNCwKKwkweGRhMGIsIDB4NjgxNCwgMHgyMDQ4LCAweGE5N2MsIDB4YzFmNCwgMHhjMWRjLCAweGE5N2UsIDB4YTk4MCwKKwkweGMxZmMsIDB4YzFiYywgMHhhOTgyLCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweDE2ZGIsIDB4MDBmZSwKKwkweDIwMDksIDB4MDA0MiwgMHgwNGQwLCAweDAwMzYsIDB4MDgwYywgMHgxMDMxLCAweDA5MGMsIDB4MGRmYSwKKwkweGE4NjcsIDB4MDEwZCwgMHg5MDA2LCAweGE4MDIsIDB4YTg2YSwgMHhhODhhLCAweDJkMTgsIDB4YWI4ZSwKKwkweGE4ODcsIDB4MDA0NSwgMHgyYzAwLCAweGE4OTIsIDB4NjAzOCwgMHhhOGEyLCAweDIzNjAsIDB4NjAyNCwKKwkweGMwZGQsIDB4NjAyNiwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiOGEwLCAweDAwYmUsIDB4MjAwNCwKKwkweDYzNTQsIDB4YWI3YSwgMHhhODc2LCAweDkwMDYsIDB4YTg3ZSwgMHhhODgyLCAweGFkOWEsIDB4YWU5NiwKKwkweGE4OWYsIDB4MDAwMSwgMHgwODBjLCAweDZhZTksIDB4MjAxOSwgMHgwMDQ1LCAweDYwMDgsIDB4MjA2OCwKKwkweDA4MGMsIDB4ZDQ0MCwgMHgyZDAwLCAweDYwMGEsIDB4NjAyMywgMHgwMDA2LCAweDYwMDMsIDB4MDAwNywKKwkweDkwMWUsIDB4NjMxYSwgMHg2MzQyLCAweDAwM2UsIDB4MDAzOCwgMHg2MDQzLCAweDAwMDAsIDB4NjAwMywKKwkweDAwMDcsIDB4MDgwYywgMHhkMjk0LCAweDAwY2UsIDB4MDBkZSwgMHgwMDllLCAweDAwMDUsIDB4OTE4NiwKKwkweDAwMTMsIDB4MTEyOCwgMHg2MDA0LCAweDkwODIsIDB4MDA4NSwgMHgyMDA4LCAweDAwYzIsIDB4OTE4NiwKKwkweDAwMjcsIDB4MTE3OCwgMHgwODBjLCAweDhiMDQsIDB4MDAzNiwgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwKKwkweDIwMTksIDB4MDAwNCwgMHgwODBjLCAweGQ4MzAsIDB4MDA5ZSwgMHgwMDNlLCAweDA4MGMsIDB4OGMxMCwKKwkweDAwMDUsIDB4OTE4NiwgMHgwMDE0LCAweDBkNzAsIDB4MDgwYywgMHhhMTc4LCAweDAwMDUsIDB4ZGEzZSwKKwkweGRhM2MsIDB4ZGEzYywgMHhkYTNjLCAweGRhM2MsIDB4ZGEzYywgMHhkYTNlLCAweGRhM2MsIDB4ZGEzYywKKwkweGRhM2MsIDB4ZGEzYywgMHhkYTNjLCAweGRhM2MsIDB4MDgwYywgMHgwZGZhLCAweDA4MGMsIDB4OGIwNCwKKwkweDYwMDMsIDB4MDAwYywgMHgwODBjLCAweDhjMTAsIDB4MDAwNSwgMHg5MTgyLCAweDAwOTIsIDB4MTIyMCwKKwkweDkxODIsIDB4MDA4NSwgMHgwMjA4LCAweDAwMWEsIDB4MDgwYywgMHhhMTc4LCAweDAwMDUsIDB4ZGE1YywKKwkweGRhNWMsIDB4ZGE1YywgMHhkYTVjLCAweGRhNWUsIDB4ZGE3ZSwgMHhkYTVjLCAweGRhNWMsIDB4ZGE1YywKKwkweGRhNWMsIDB4ZGE1YywgMHhkYTVjLCAweGRhNWMsIDB4MDgwYywgMHgwZGZhLCAweDAwZDYsIDB4MmM2OCwKKwkweDA4MGMsIDB4YTA4ZCwgMHgwMWIwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMWUsIDB4MjAwOSwKKwkweDAyNmUsIDB4MjEwYywgMHg2MTNhLCAweDIwMDksIDB4MDI2ZiwgMHgyMTBjLCAweDYxM2UsIDB4NjAwYiwKKwkweGZmZmYsIDB4NjkxMCwgMHg2MTEyLCAweDYwMjMsIDB4MDAwNCwgMHgwODBjLCAweDg2NzksIDB4MDgwYywKKwkweDhjMTAsIDB4MmQ2MCwgMHgwODBjLCAweGEwZTMsIDB4MDBkZSwgMHgwMDA1LCAweDA4MGMsIDB4YTBlMywKKwkweDAwMDUsIDB4MDBlNiwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBlYywKKwkweDAwZWUsIDB4MDAwNSwgMHgyMDA5LCAweDE4N2IsIDB4MjEwYywgMHhkMWVjLCAweDA1YjAsIDB4NjAwMywKKwkweDAwMDIsIDB4NjAyNCwgMHhjMGU1LCAweDYwMjYsIDB4ZDBjYywgMHgwMTUwLCAweDIwMDEsIDB4MTk2MCwKKwkweDIwMDQsIDB4NjA0MiwgMHgyMDA5LCAweDE4N2IsIDB4MjEwYywgMHhkMWY0LCAweDE1MjAsIDB4MDBhMCwKKwkweDIwMDksIDB4MTg3YiwgMHgyMTBjLCAweGQxZjQsIDB4MDEyOCwgMHg2MDI0LCAweGMwZTQsIDB4NjAyNiwKKwkweDkwMDYsIDB4MDBkOCwgMHgyMDAxLCAweDE5NjAsIDB4MjAwYywgMHgyMDAxLCAweDE5NWUsIDB4MjAwNCwKKwkweDkxMDAsIDB4OTA4MCwgMHgwMDBhLCAweDYwNDIsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjhhYywKKwkweDAwYmUsIDB4MDAwOCwgMHgyMTA0LCAweDkwMDUsIDB4MDExOCwgMHg5MDg4LCAweDAwMDMsIDB4MGNkMCwKKwkweDJjMGEsIDB4NjAwZiwgMHgwMDAwLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwMTYsIDB4MDBjNiwKKwkweDAwZTYsIDB4NjE1NCwgMHhiOGFjLCAweDIwNjAsIDB4OGNmZiwgMHgwMTgwLCAweDg0ZmYsIDB4MTExOCwKKwkweDYwNTQsIDB4OTEwNiwgMHgxMTM4LCAweDYwMGMsIDB4MjA3MiwgMHgwODBjLCAweDg0YTYsIDB4MDgwYywKKwkweGEwZTMsIDB4MDAxMCwgMHg5Y2YwLCAweDAwMDMsIDB4MmU2NCwgMHgwYzcwLCAweDAwZWUsIDB4MDBjZSwKKwkweDAwMWUsIDB4MDAwNSwgMHgwMGQ2LCAweDAwYjYsIDB4NjAxMCwgMHgyMDU4LCAweGI4YWMsIDB4MjA2OCwKKwkweDkwMDUsIDB4MDEzMCwgMHg5YzA2LCAweDAxMTAsIDB4NjgwYywgMHgwY2QwLCAweDYwMGMsIDB4NjgwZSwKKwkweDAwYmUsIDB4MDBkZSwgMHgwMDA1LCAweDAwMjYsIDB4MDAzNiwgMHgwMTU2LCAweDIwMTEsIDB4MTgyYiwKKwkweDIyMDQsIDB4OTA4NCwgMHgwMGZmLCAweDIwMTksIDB4MDI2ZSwgMHgyMzM0LCAweDk2MzYsIDB4MTUwOCwKKwkweDgzMTgsIDB4MjMzNCwgMHgyMjA0LCAweDkwODQsIDB4ZmYwMCwgMHg5NjM2LCAweDExZDAsIDB4MjAxMSwKKwkweDAyNzAsIDB4MjBhOSwgMHgwMDA0LCAweDYwMTAsIDB4MDA5NiwgMHgyMDQ4LCAweDIwMTksIDB4MDAwYSwKKwkweDA4MGMsIDB4YjBkMCwgMHgwMDllLCAweDExNjgsIDB4MjAxMSwgMHgwMjc0LCAweDIwYTksIDB4MDAwNCwKKwkweDYwMTAsIDB4MDA5NiwgMHgyMDQ4LCAweDIwMTksIDB4MDAwNiwgMHgwODBjLCAweGIwZDAsIDB4MDA5ZSwKKwkweDExMDAsIDB4MDE1ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwKKwkweDA4MGMsIDB4NWViZSwgMHgwODBjLCAweDJmNmMsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBmYywgMHgwMTA4LCAweDAwMTEsIDB4MDBlZSwKKwkweDAwMDUsIDB4YTg4MCwgMHhjMGU1LCAweGE4ODIsIDB4MDAwNSwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwKKwkweDAwNzYsIDB4MDA2NiwgMHgwMDU2LCAweDAwNDYsIDB4MDAyNiwgMHgwMDE2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjAyOSwgMHgxOWM4LCAweDI1MmMsIDB4MjAyMSwgMHgxOWNlLCAweDI0MjQsIDB4MjA2MSwKKwkweDFjZDAsIDB4MjA3MSwgMHgxODAwLCAweDc2NTAsIDB4NzA3MCwgMHg5NjA2LCAweDA1NzgsIDB4NjcyMCwKKwkweDk3ODYsIDB4MDAwMSwgMHgwMTE4LCAweDk3ODYsIDB4MDAwOCwgMHgxNTAwLCAweDI1MDAsIDB4OWMwNiwKKwkweDAxZTgsIDB4MjQwMCwgMHg5YzA2LCAweDAxZDAsIDB4MDgwYywgMHhkOGI2LCAweDAxYjgsIDB4MDgwYywKKwkweGQ4YzYsIDB4MTFhMCwgMHg2MDAwLCAweDkwODYsIDB4MDAwNCwgMHgxMTIwLCAweDAwMTYsIDB4MDgwYywKKwkweDE5YjQsIDB4MDAxZSwgMHgwODBjLCAweGMwMmUsIDB4MTExMCwgMHgwODBjLCAweDMxYjQsIDB4MDgwYywKKwkweGMwM2YsIDB4MTExMCwgMHgwODBjLCAweGFhODEsIDB4MDgwYywgMHhhMTEzLCAweDljZTAsIDB4MDAxOCwKKwkweDIwMDEsIDB4MTgxOSwgMHgyMDA0LCAweDljMDIsIDB4MTIwOCwgMHgwODU4LCAweDAxMmUsIDB4MDAxZSwKKwkweDAwMmUsIDB4MDA0ZSwgMHgwMDVlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwKKwkweDAwMDUsIDB4MjAwMSwgMHgxODEwLCAweDIwMDQsIDB4ZDBkYywgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwKKwkweDE4MzYsIDB4MjAwNCwgMHhkMDljLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDAwMzYsIDB4MDA0NiwKKwkweDA4MGMsIDB4YzUzOSwgMHgwMTY4LCAweDIwMTksIDB4ZmZmZiwgMHg5MDA1LCAweDAxMjgsIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiYmEwLCAweDAwYmUsIDB4MjAyMSwgMHgwMDA0LCAweDA4MGMsIDB4NGNiYywKKwkweDAwNGUsIDB4MDAzZSwgMHgwMDBlLCAweDYwMDQsIDB4OTA4NiwgMHgwMDAxLCAweDExMjgsIDB4MDgwYywKKwkweDliYzksIDB4MDgwYywgMHhhMTEzLCAweDkwMDYsIDB4MDAwNSwgMHgwMGU2LCAweDAwYzYsIDB4MDBiNiwKKwkweDAwNDYsIDB4MjA2MSwgMHgxY2QwLCAweDIwNzEsIDB4MTgwMCwgMHg3NDUwLCAweDcwNzAsIDB4ODAwMSwKKwkweDk0MDIsIDB4MTJkOCwgMHgyMTAwLCAweDljMDYsIDB4MDE2OCwgMHg2MDAwLCAweDkwODYsIDB4MDAwMCwKKwkweDAxNDgsIDB4NjAxMCwgMHgyMDU4LCAweGI4YTAsIDB4OTIwNiwgMHgxMTIwLCAweDYwMDQsIDB4OTA4NiwKKwkweDAwMDIsIDB4MDE0MCwgMHg5Y2UwLCAweDAwMTgsIDB4MjAwMSwgMHgxODE5LCAweDIwMDQsIDB4OWMwMiwKKwkweDEyMjAsIDB4MGM0MCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwOCwgMHg5MDA2LCAweDAwNGUsIDB4MDBiZSwKKwkweDAwY2UsIDB4MDBlZSwgMHgwMDA1LCAweDAxMjYsIDB4MDAwNiwgMHgwMGU2LCAweDAwMTYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA3MSwgMHgxODQwLCAweGQ1YTQsIDB4MDExOCwgMHg3MDU0LCAweDgwMDAsIDB4NzA1NiwKKwkweGQ1YjQsIDB4MDExOCwgMHg3MDUwLCAweDgwMDAsIDB4NzA1MiwgMHhkNWFjLCAweDAxNzgsIDB4MjUwMCwKKwkweDkwODQsIDB4MDAwNywgMHg5MDhlLCAweDAwMDMsIDB4MDE0OCwgMHg5MDhlLCAweDAwMDQsIDB4MDEzMCwKKwkweDkwOGUsIDB4MDAwNSwgMHgwMTE4LCAweDIwNzEsIDB4MTg0YSwgMHgwMDg5LCAweDAwMWUsIDB4MDBlZSwKKwkweDAwMGUsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MDAwNiwgMHgwMGU2LCAweDIwOTEsIDB4ODAwMCwKKwkweDIwNzEsIDB4MTg0MiwgMHgwMDIxLCAweDAwZWUsIDB4MDAwZSwgMHgwMTJlLCAweDAwMDUsIDB4MmUwNCwKKwkweDgwMDAsIDB4MjA3MiwgMHgxMjIwLCAweDhlNzAsIDB4MmUwNCwgMHg4MDAwLCAweDIwNzIsIDB4MDAwNSwKKwkweDAwZTYsIDB4MjA3MSwgMHgxODQwLCAweDBjOTksIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwKKwkweDE4NDQsIDB4MGM2OSwgMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwgMHgwMDA2LCAweDAwZTYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA3MSwgMHgxODQwLCAweDcwNjQsIDB4ODAwMCwgMHg3MDY2LCAweDAwZWUsIDB4MDAwZSwKKwkweDAxMmUsIDB4MDAwNSwgMHgwMDAzLCAweDAwMGIsIDB4MDRhNiwgMHgwMDAwLCAweGMwMDAsIDB4MDAwMSwKKwkweDgwNjQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDAxMDEsIDB4MDAwOCwKKwkweDQ0MDcsIDB4MDAwMywgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAwLCAweDU4MGQsIDB4MDAwYiwKKwkweDc5OGUsIDB4MDAwMywgMHg1MGRiLCAweDAwMGIsIDB4NGMwYSwgMHgwMDAzLCAweGJhYzAsIDB4MDAwOSwKKwkweDAwOGEsIDB4MDAwMCwgMHgwYzBhLCAweDAwMGIsIDB4MTVmZSwgMHgwMDA4LCAweDM0MGEsIDB4MDAwMywKKwkweGM0YzAsIDB4MDAwOSwgMHg3MDAwLCAweDAwMDAsIDB4ZmZhMCwgMHgwMDAxLCAweDIwMDAsIDB4MDAwMCwKKwkweDE2MjcsIDB4MDAwMywgMHg4MDhjLCAweDAwMDgsIDB4MDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwNywKKwkweDQwNDcsIDB4MDAwYSwgMHg4MDhjLCAweDAwMDgsIDB4MDAwMiwgMHgwMDAwLCAweDA4MjEsIDB4MDAwMywKKwkweDQwMjIsIDB4MDAwMCwgMHgwMDIyLCAweDAwMGIsIDB4NDEyMiwgMHgwMDA4LCAweDQ0NDcsIDB4MDAwMiwKKwkweDBlNGYsIDB4MDAwYiwgMHgwYmZlLCAweDAwMDgsIDB4MTFhMCwgMHgwMDAxLCAweDEyMmQsIDB4MDAwYiwKKwkweDBjYTAsIDB4MDAwMSwgMHgxMjJkLCAweDAwMGIsIDB4OTE4MCwgMHgwMDAxLCAweDAwMDQsIDB4MDAwMCwKKwkweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDAsIDB4N2Y2MiwgMHgwMDA4LCAweDgwNjYsIDB4MDAwMCwKKwkweDAwMDksIDB4MDAwOCwgMHg0NDMwLCAweDAwMGIsIDB4ODA4YywgMHgwMDA4LCAweDAwMDAsIDB4MDAwOCwKKwkweDAwNjAsIDB4MDAwOCwgMHg4MDYyLCAweDAwMDgsIDB4MDAwNCwgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwKKwkweDA0MTEsIDB4MDAwMCwgMHg0NDM4LCAweDAwMDMsIDB4MDNmZSwgMHgwMDAwLCAweDQzZTAsIDB4MDAwMSwKKwkweDBlMmEsIDB4MDAwYiwgMHhjMmMwLCAweDAwMDksIDB4MDBmZiwgMHgwMDA4LCAweDAyZTAsIDB4MDAwMSwKKwkweDBlMmEsIDB4MDAwYiwgMHg5MTgwLCAweDAwMDEsIDB4MDAwNSwgMHgwMDA4LCAweDgwNjAsIDB4MDAwMCwKKwkweDA0MDAsIDB4MDAwMCwgMHg3ZjYyLCAweDAwMDgsIDB4ODA2NiwgMHgwMDAwLCAweDAwMTksIDB4MDAwMCwKKwkweDQ0NDcsIDB4MDAwYiwgMHgwMjQwLCAweDAwMDIsIDB4MGEyNywgMHgwMDBiLCAweDAwZmUsIDB4MDAwMCwKKwkweDMyMmEsIDB4MDAwYiwgMHgxMTJhLCAweDAwMDAsIDB4MDAyZSwgMHgwMDA4LCAweDAyMmMsIDB4MDAwOCwKKwkweDNhNDQsIDB4MDAwMiwgMHgwYzBhLCAweDAwMGIsIDB4ODA4YywgMHgwMDA4LCAweDAwMDIsIDB4MDAwMCwKKwkweDE3NjAsIDB4MDAwOCwgMHg4MDYyLCAweDAwMDgsIDB4MDAwZiwgMHgwMDA4LCAweDgwNjYsIDB4MDAwMCwKKwkweDAwMTEsIDB4MDAwOCwgMHg0NDU4LCAweDAwMDMsIDB4MDFmZSwgMHgwMDA4LCAweDQyZTAsIDB4MDAwOSwKKwkweDBlMWQsIDB4MDAwMywgMHgwMGZlLCAweDAwMDAsIDB4NDNlMCwgMHgwMDAxLCAweDBlMWQsIDB4MDAwMywKKwkweDE3MzQsIDB4MDAwMCwgMHgxNTMwLCAweDAwMDAsIDB4MTYzMiwgMHgwMDA4LCAweDBkMmEsIDB4MDAwOCwKKwkweDk4ODAsIDB4MDAwMSwgMHgwMDEwLCAweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMCwKKwkweDdmNjIsIDB4MDAwOCwgMHg4MDY2LCAweDAwMDAsIDB4MWUwYSwgMHgwMDA4LCAweDQ0NmEsIDB4MDAwYiwKKwkweDgwOGEsIDB4MDAwOCwgMHgwMDAzLCAweDAwMDgsIDB4MWE2MCwgMHgwMDAwLCAweDgwNjIsIDB4MDAwOCwKKwkweDAwMDIsIDB4MDAwMCwgMHg1ODcwLCAweDAwMGIsIDB4ODA2NiwgMHgwMDAwLCAweDM2NzksIDB4MDAwMCwKKwkweDQ0NzMsIDB4MDAwMywgMHg1ODc0LCAweDAwMDMsIDB4M2VmZSwgMHgwMDA4LCAweDdmNGYsIDB4MDAwMiwKKwkweDA4N2EsIDB4MDAwYiwgMHgwZDAwLCAweDAwMDAsIDB4MDA4MiwgMHgwMDA0LCAweDgwNTQsIDB4MDAwOCwKKwkweDAwMTEsIDB4MDAwOCwgMHg4MDc0LCAweDAwMDAsIDB4MTAxMCwgMHgwMDA4LCAweDFlZmUsIDB4MDAwMCwKKwkweDMwMGEsIDB4MDAwYiwgMHgwMGI4LCAweDAwMDQsIDB4MDAwYSwgMHgwMDBiLCAweDAwZmUsIDB4MDAwMCwKKwkweDM0OGEsIDB4MDAwYiwgMHgxYTYwLCAweDAwMDAsIDB4ODA2MiwgMHgwMDA4LCAweDAwMDcsIDB4MDAwMCwKKwkweDgwNjYsIDB4MDAwMCwgMHgwMjMxLCAweDAwMDgsIDB4NDQ4OSwgMHgwMDAzLCAweDAzZmUsIDB4MDAwMCwKKwkweDA0ZDAsIDB4MDAwMSwgMHgwY2IwLCAweDAwMDMsIDB4ODJjMCwgMHgwMDAxLCAweDFmMDAsIDB4MDAwMCwKKwkweGZmYTAsIDB4MDAwMSwgMHgwNDAwLCAweDAwMDAsIDB4MDg5ZiwgMHgwMDAzLCAweDE0YjAsIDB4MDAwMywKKwkweDAxZmUsIDB4MDAwOCwgMHgwNTgwLCAweDAwMDksIDB4N2YwNiwgMHgwMDAwLCAweDAyZmUsIDB4MDAwOCwKKwkweGZmYzAsIDB4MDAwMSwgMHgwMGZmLCAweDAwMDgsIDB4MDY5MCwgMHgwMDAxLCAweDEwOWYsIDB4MDAwMywKKwkweDdmMDgsIDB4MDAwOCwgMHg4NGMwLCAweDAwMDEsIDB4ZmYwMCwgMHgwMDA4LCAweDA4YjAsIDB4MDAwYiwKKwkweDAwZmUsIDB4MDAwMCwgMHgzNGE2LCAweDAwMDMsIDB4ODA3MiwgMHgwMDAwLCAweDEwMTAsIDB4MDAwOCwKKwkweDM5NDQsIDB4MDAwMiwgMHgwOGExLCAweDAwMGIsIDB4MDBhYSwgMHgwMDBiLCAweDgwNzIsIDB4MDAwMCwKKwkweDIwMjAsIDB4MDAwOCwgMHgzOTQ1LCAweDAwMGEsIDB4MDhhNiwgMHgwMDAzLCAweDM5NDYsIDB4MDAwYSwKKwkweDBjYjcsIDB4MDAwYiwgMHgwMDAwLCAweDAwMDcsIDB4Mzk0MywgMHgwMDBhLCAweDA4YjcsIDB4MDAwMywKKwkweDAwYWEsIDB4MDAwYiwgMHgwMGZlLCAweDAwMDAsIDB4MzRiNSwgMHgwMDBiLCAweDgwNzIsIDB4MDAwMCwKKwkweDEwMDAsIDB4MDAwMCwgMHgwMGI3LCAweDAwMGIsIDB4ODA3MiwgMHgwMDAwLCAweDIwMDAsIDB4MDAwMCwKKwkweDQwMDAsIDB4MDAwZiwgMHgxYzYwLCAweDAwMDAsIDB4MWI2MiwgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwKKwkweDAyMzEsIDB4MDAwOCwgMHg0NGJjLCAweDAwMDMsIDB4NThiZCwgMHgwMDAzLCAweDAxNDAsIDB4MDAwOCwKKwkweDAyNDIsIDB4MDAwMCwgMHgxZjQzLCAweDAwMDIsIDB4MGNjYiwgMHgwMDAzLCAweDBkNDQsIDB4MDAwMCwKKwkweDBkNDYsIDB4MDAwOCwgMHgwMzQ4LCAweDAwMDgsIDB4MDQ0YSwgMHgwMDA4LCAweDAzMGEsIDB4MDAwOCwKKwkweDA0MGMsIDB4MDAwMCwgMHgwZDA2LCAweDAwMDAsIDB4MGQwOCwgMHgwMDA4LCAweDAwY2YsIDB4MDAwYiwKKwkweDAzNDQsIDB4MDAwOCwgMHgwNDQ2LCAweDAwMDgsIDB4MDU0OCwgMHgwMDA4LCAweDA2NGEsIDB4MDAwMCwKKwkweDU4Y2YsIDB4MDAwMywgMHgzZWZlLCAweDAwMDgsIDB4N2Y0ZiwgMHgwMDAyLCAweDA4ZDYsIDB4MDAwYiwKKwkweDgwMDAsIDB4MDAwMCwgMHgwMDAxLCAweDAwMDAsIDB4MDA4MiwgMHgwMDA0LCAweDgwNTQsIDB4MDAwOCwKKwkweDAwMDEsIDB4MDAwMCwgMHg4MDc0LCAweDAwMDAsIDB4MjAyMCwgMHgwMDA4LCAweDQwMDAsIDB4MDAwZiwKKwkweDNhNDAsIDB4MDAwYSwgMHgwYzBkLCAweDAwMDMsIDB4MmIyNCwgMHgwMDA4LCAweDJiMjQsIDB4MDAwOCwKKwkweDU4ZGYsIDB4MDAwYiwgMHg4MDU0LCAweDAwMDgsIDB4MDAwMiwgMHgwMDAwLCAweDEyNDIsIDB4MDAwMiwKKwkweDA5MmQsIDB4MDAwYiwgMHgzYTQ1LCAweDAwMGEsIDB4MDkxYywgMHgwMDAzLCAweDgwNzIsIDB4MDAwMCwKKwkweDEwMDAsIDB4MDAwMCwgMHgzOTQ1LCAweDAwMGEsIDB4MDhlYywgMHgwMDBiLCAweDgwNzIsIDB4MDAwMCwKKwkweDMwMTAsIDB4MDAwMCwgMHgxZTEwLCAweDAwMGEsIDB4N2YzYywgMHgwMDAwLCAweDA5MTcsIDB4MDAwYiwKKwkweDFkMDAsIDB4MDAwMiwgMHg3ZjNhLCAweDAwMDAsIDB4MGQ2MCwgMHgwMDAwLCAweDdmNjIsIDB4MDAwOCwKKwkweDgwNjYsIDB4MDAwMCwgMHgwMDA5LCAweDAwMDgsIDB4NDRmNSwgMHgwMDBiLCAweDAwZmUsIDB4MDAwMCwKKwkweDM1MTQsIDB4MDAwYiwgMHgxYzYwLCAweDAwMDAsIDB4ODA2MiwgMHgwMDA4LCAweDAwMDEsIDB4MDAwMCwKKwkweDgwNjYsIDB4MDAwMCwgMHgwMDA5LCAweDAwMDgsIDB4NDRmZCwgMHgwMDAzLCAweDAwZmUsIDB4MDAwMCwKKwkweDMyMDQsIDB4MDAwYiwgMHgwMDM4LCAweDAwMDAsIDB4MDA2MCwgMHgwMDA4LCAweDgwNjIsIDB4MDAwOCwKKwkweDAwMTksIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsIDB4MDAwOSwgMHgwMDA4LCAweDQ1MDYsIDB4MDAwMywKKwkweDgwYzAsIDB4MDAwOSwgMHgwMGZmLCAweDAwMDgsIDB4N2YzZSwgMHgwMDA4LCAweDBkNjAsIDB4MDAwMCwKKwkweDBlZmUsIDB4MDAwOCwgMHgxZjgwLCAweDAwMDEsIDB4N2Y2MiwgMHgwMDA4LCAweDgwNjYsIDB4MDAwMCwKKwkweDAwMDksIDB4MDAwOCwgMHg0NTEwLCAweDAwMGIsIDB4MDAzYSwgMHgwMDA4LCAweDFkZmUsIDB4MDAwMCwKKwkweDAwZjEsIDB4MDAwMywgMHgwMDM2LCAweDAwMDgsIDB4MDBiOCwgMHgwMDA0LCAweDAxMmQsIDB4MDAwMywKKwkweDgwNzQsIDB4MDAwMCwgMHgyMDAwLCAweDAwMDAsIDB4ODA3MiwgMHgwMDAwLCAweDIwMDAsIDB4MDAwMCwKKwkweDAxMmQsIDB4MDAwMywgMHgzYTQ0LCAweDAwMDIsIDB4MGEzMCwgMHgwMDBiLCAweDgwNzQsIDB4MDAwMCwKKwkweDEwMDAsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsIDB4MTAwMCwgMHgwMDAwLCAweDJkMGUsIDB4MDAwMCwKKwkweDJkMGUsIDB4MDAwMCwgMHgzNjAxLCAweDAwMDMsIDB4MjZmZSwgMHgwMDA4LCAweDI2ZmUsIDB4MDAwOCwKKwkweDI3MDAsIDB4MDAwOCwgMHgyNzAwLCAweDAwMDgsIDB4MDBkMCwgMHgwMDA5LCAweDBkM2YsIDB4MDAwMywKKwkweDgwNzQsIDB4MDAwMCwgMHg0MDQwLCAweDAwMDgsIDB4NTkyZCwgMHgwMDBiLCAweDUwZGIsIDB4MDAwYiwKKwkweDNhNDYsIDB4MDAwYSwgMHgwZDNmLCAweDAwMDMsIDB4M2E0NywgMHgwMDAyLCAweDA5M2EsIDB4MDAwYiwKKwkweDgwNTQsIDB4MDAwOCwgMHgwMDA0LCAweDAwMDAsIDB4ODA3NCwgMHgwMDAwLCAweDgwMDAsIDB4MDAwMCwKKwkweDgwNzIsIDB4MDAwMCwgMHgzMDAwLCAweDAwMDgsIDB4MDE4MiwgMHgwMDAzLCAweDkyYzAsIDB4MDAwOSwKKwkweDBmYzgsIDB4MDAwMCwgMHgwODBhLCAweDAwMDMsIDB4MTI0NiwgMHgwMDBhLCAweDBkZmIsIDB4MDAwYiwKKwkweDFhNjAsIDB4MDAwMCwgMHg4MDYyLCAweDAwMDgsIDB4MDAwMiwgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwKKwkweDM2MmEsIDB4MDAwMCwgMHg0NTQ0LCAweDAwMDMsIDB4MjAwMCwgMHgwMDAwLCAweDIwMDAsIDB4MDAwMCwKKwkweDIxMDIsIDB4MDAwMCwgMHgyMTAyLCAweDAwMDAsIDB4MjIwNCwgMHgwMDAwLCAweDIyMDQsIDB4MDAwMCwKKwkweDIzMDYsIDB4MDAwMCwgMHgyMzA2LCAweDAwMDAsIDB4MjQwOCwgMHgwMDAwLCAweDI0MDgsIDB4MDAwMCwKKwkweDI1MGEsIDB4MDAwMCwgMHgyNTBhLCAweDAwMDAsIDB4MjYwYywgMHgwMDAwLCAweDI2MGMsIDB4MDAwMCwKKwkweDI3MGUsIDB4MDAwMCwgMHgyNzBlLCAweDAwMDAsIDB4MjgxMCwgMHgwMDAwLCAweDI4MTAsIDB4MDAwMCwKKwkweDI5MTIsIDB4MDAwMCwgMHgyOTEyLCAweDAwMDAsIDB4MWE2MCwgMHgwMDAwLCAweDgwNjIsIDB4MDAwOCwKKwkweDAwMDcsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsIDB4MDA1MiwgMHgwMDAwLCAweDQ1NWUsIDB4MDAwYiwKKwkweDkyYzAsIDB4MDAwOSwgMHgwNzgwLCAweDAwMDgsIDB4MGUxNywgMHgwMDAzLCAweDEyNGIsIDB4MDAwMiwKKwkweDA5NjcsIDB4MDAwMywgMHgyZTRkLCAweDAwMDIsIDB4MmU0ZCwgMHgwMDAyLCAweDBhMDEsIDB4MDAwMywKKwkweDNhNDYsIDB4MDAwYSwgMHgwZDc0LCAweDAwMDMsIDB4NTk2OSwgMHgwMDBiLCAweDgwNTQsIDB4MDAwOCwKKwkweDAwMDQsIDB4MDAwMCwgMHgxMjQzLCAweDAwMGEsIDB4MDk3ZSwgMHgwMDBiLCAweDgwMTAsIDB4MDAwOCwKKwkweDAwMGQsIDB4MDAwMCwgMHgwMWVmLCAweDAwMDQsIDB4MTgxMCwgMHgwMDAwLCAweDAxZWYsIDB4MDAwNCwKKwkweDAxN2UsIDB4MDAwMywgMHgxOTRkLCAweDAwMGEsIDB4MDk3OCwgMHgwMDBiLCAweDEyNDMsIDB4MDAwYSwKKwkweDBhMGIsIDB4MDAwMywgMHg1OTc4LCAweDAwMGIsIDB4ODA1NCwgMHgwMDA4LCAweDAwMDQsIDB4MDAwMCwKKwkweDAxZTQsIDB4MDAwYywgMHgxODEwLCAweDAwMDAsIDB4MDFlZiwgMHgwMDA0LCAweDgwNzQsIDB4MDAwMCwKKwkweGYwMDAsIDB4MDAwOCwgMHg4MDcyLCAweDAwMDAsIDB4MzAwMCwgMHgwMDA4LCAweDBkMzAsIDB4MDAwMCwKKwkweDNhNDIsIDB4MDAwMiwgMHgwZDg4LCAweDAwMDMsIDB4MTVmZSwgMHgwMDA4LCAweDM0NTEsIDB4MDAwYiwKKwkweDAwMGEsIDB4MDAwYiwgMHg4MDc0LCAweDAwMDAsIDB4MDUwMSwgMHgwMDAwLCAweDgwMTAsIDB4MDAwOCwKKwkweDAwMGMsIDB4MDAwOCwgMHgwMWVmLCAweDAwMDQsIDB4MDAwYSwgMHgwMDBiLCAweGJiZTAsIDB4MDAwOSwKKwkweDAwMzAsIDB4MDAwOCwgMHgwZDllLCAweDAwMGIsIDB4MThmZSwgMHgwMDAwLCAweDNjZTAsIDB4MDAwOSwKKwkweDA5OWIsIDB4MDAwMywgMHgxNWZlLCAweDAwMDgsIDB4M2NlMCwgMHgwMDA5LCAweDA5OWIsIDB4MDAwMywKKwkweDAxZGYsIDB4MDAwNCwgMHg4MDc2LCAweDAwMDgsIDB4MDA0MCwgMHgwMDAwLCAweDAxZGMsIDB4MDAwYiwKKwkweDgwNzYsIDB4MDAwOCwgMHgwMDQxLCAweDAwMDgsIDB4MDFkYywgMHgwMDBiLCAweGJiZTAsIDB4MDAwOSwKKwkweDAwMzIsIDB4MDAwMCwgMHgwZGEzLCAweDAwMDMsIDB4M2MxZSwgMHgwMDA4LCAweDAxZGMsIDB4MDAwYiwKKwkweGJiZTAsIDB4MDAwOSwgMHgwMDM3LCAweDAwMDAsIDB4MGRjMSwgMHgwMDBiLCAweDE4ZmUsIDB4MDAwMCwKKwkweDNjZTAsIDB4MDAwOSwgMHgwZDliLCAweDAwMGIsIDB4ODA3NiwgMHgwMDA4LCAweDAwNDAsIDB4MDAwMCwKKwkweDFhNjAsIDB4MDAwMCwgMHg4MDYyLCAweDAwMDgsIDB4MDAwZCwgMHgwMDAwLCAweDI2MDQsIDB4MDAwOCwKKwkweDI2MDQsIDB4MDAwOCwgMHgyNzA2LCAweDAwMDgsIDB4MjcwNiwgMHgwMDA4LCAweDI4MDgsIDB4MDAwMCwKKwkweDI4MDgsIDB4MDAwMCwgMHgyOTBhLCAweDAwMDAsIDB4MjkwYSwgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwKKwkweDA0MjIsIDB4MDAwMCwgMHg0NWI4LCAweDAwMDMsIDB4MDFlNCwgMHgwMDBjLCAweDgwNTQsIDB4MDAwOCwKKwkweDAwMDQsIDB4MDAwMCwgMHg4MDc0LCAweDAwMDAsIDB4ZjAwMCwgMHgwMDA4LCAweDgwNzIsIDB4MDAwMCwKKwkweGIwMDAsIDB4MDAwMCwgMHgwMTgyLCAweDAwMDMsIDB4YmJlMCwgMHgwMDA5LCAweDAwMzgsIDB4MDAwMCwKKwkweDBkZDMsIDB4MDAwYiwgMHgxOGZlLCAweDAwMDAsIDB4M2NlMCwgMHgwMDA5LCAweDA5ZDAsIDB4MDAwMywKKwkweDE1ZmUsIDB4MDAwOCwgMHgzY2UwLCAweDAwMDksIDB4MGQ5NywgMHgwMDBiLCAweDAxZGYsIDB4MDAwNCwKKwkweDgwNzYsIDB4MDAwOCwgMHgwMDQwLCAweDAwMDAsIDB4ODA3MiwgMHgwMDAwLCAweDgwMDAsIDB4MDAwMCwKKwkweDAyMjcsIDB4MDAwMywgMHg4MDc2LCAweDAwMDgsIDB4MDA0MiwgMHgwMDA4LCAweDAxZGMsIDB4MDAwYiwKKwkweGJiZTAsIDB4MDAwOSwgMHgwMDE2LCAweDAwMDAsIDB4MGRkYywgMHgwMDBiLCAweDNhNDQsIDB4MDAwMiwKKwkweDBjMGMsIDB4MDAwYiwgMHg4MDcyLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLCAweDgwMDAsIDB4MDAwZiwKKwkweDAwMGEsIDB4MDAwYiwgMHg4MDcyLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLCAweDAwMGEsIDB4MDAwYiwKKwkweDNkMzAsIDB4MDAwYSwgMHg3ZjAwLCAweDAwMDAsIDB4YmM4MCwgMHgwMDAxLCAweDAwMDcsIDB4MDAwMCwKKwkweDAxZTgsIDB4MDAwMywgMHgxOTMwLCAweDAwMGEsIDB4N2YwMCwgMHgwMDAwLCAweDk4ODAsIDB4MDAwMSwKKwkweDAwMDcsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAwLCAweDdmNjIsIDB4MDAwOCwKKwkweDgwNjYsIDB4MDAwMCwgMHgwMDBhLCAweDAwMDgsIDB4NDVlZCwgMHgwMDAzLCAweDQwMDAsIDB4MDAwZiwKKwkweDIxZWYsIDB4MDAwMywgMHgwODcwLCAweDAwMDgsIDB4NDAwMCwgMHgwMDBmLCAweGJhYzAsIDB4MDAwOSwKKwkweDAwOTAsIDB4MDAwOCwgMHgwOWY4LCAweDAwMDMsIDB4ODA3NCwgMHgwMDAwLCAweDA3MDYsIDB4MDAwMCwKKwkweDAxZmEsIDB4MDAwMywgMHg4MDc0LCAweDAwMDAsIDB4MDcwMywgMHgwMDAwLCAweDQwMDAsIDB4MDAwZiwKKwkweDgwMTAsIDB4MDAwOCwgMHgwMDIzLCAweDAwMDAsIDB4MDIzNSwgMHgwMDAzLCAweDgwMTAsIDB4MDAwOCwKKwkweDAwMDgsIDB4MDAwMCwgMHgwMjM1LCAweDAwMDMsIDB4ODAxMCwgMHgwMDA4LCAweDAwMjIsIDB4MDAwOCwKKwkweDAyMzUsIDB4MDAwMywgMHgwMWU0LCAweDAwMGMsIDB4ODAxMCwgMHgwMDA4LCAweDAwMDcsIDB4MDAwMCwKKwkweDAxZWYsIDB4MDAwNCwgMHgxODEwLCAweDAwMDAsIDB4MDFlZiwgMHgwMDA0LCAweDAyNDEsIDB4MDAwMywKKwkweDAxZTQsIDB4MDAwYywgMHg4MDEwLCAweDAwMDgsIDB4MDAxYiwgMHgwMDA4LCAweDAxZWYsIDB4MDAwNCwKKwkweDE4MTAsIDB4MDAwMCwgMHgwMWVmLCAweDAwMDQsIDB4ODA3NCwgMHgwMDAwLCAweGYwODAsIDB4MDAwMCwKKwkweDgwNzIsIDB4MDAwMCwgMHgzMDAwLCAweDAwMDgsIDB4MGQzMCwgMHgwMDAwLCAweDAwMGEsIDB4MDAwYiwKKwkweDgwMTAsIDB4MDAwOCwgMHgwMDA5LCAweDAwMDgsIDB4MDIzNSwgMHgwMDAzLCAweDgwMTAsIDB4MDAwOCwKKwkweDAwMDUsIDB4MDAwOCwgMHgwMjM1LCAweDAwMDMsIDB4ODA4YywgMHgwMDA4LCAweDAwMDEsIDB4MDAwMCwKKwkweDgwMTAsIDB4MDAwOCwgMHgwMDA0LCAweDAwMDAsIDB4NDE0MywgMHgwMDBhLCAweDA4NWYsIDB4MDAwMywKKwkweDNhNDQsIDB4MDAwMiwgMHgwYzBhLCAweDAwMGIsIDB4MGQyYSwgMHgwMDA4LCAweDAyMzUsIDB4MDAwMywKKwkweDgwMTAsIDB4MDAwOCwgMHgwMDAzLCAweDAwMDgsIDB4MDIzOSwgMHgwMDAzLCAweDgwMTAsIDB4MDAwOCwKKwkweDAwMGIsIDB4MDAwMCwgMHgwMjM5LCAweDAwMDMsIDB4ODAxMCwgMHgwMDA4LCAweDAwMDIsIDB4MDAwMCwKKwkweDAyMzksIDB4MDAwMywgMHgzYTQ3LCAweDAwMDIsIDB4MGQyZCwgMHgwMDAzLCAweDgwMTAsIDB4MDAwOCwKKwkweDAwMDYsIDB4MDAwOCwgMHgwMjM5LCAweDAwMDMsIDB4ODA3NCwgMHgwMDAwLCAweGYwMDAsIDB4MDAwOCwKKwkweDgwNzIsIDB4MDAwMCwgMHgzMDAwLCAweDAwMDgsIDB4MDFlZiwgMHgwMDA0LCAweDAxZjIsIDB4MDAwNCwKKwkweDNhNDAsIDB4MDAwYSwgMHgwODBhLCAweDAwMDMsIDB4ODAxMCwgMHgwMDA4LCAweDAwMGMsIDB4MDAwOCwKKwkweDAxZWYsIDB4MDAwNCwgMHgwMDBhLCAweDAwMGIsIDB4ODA3NCwgMHgwMDAwLCAweGYwODAsIDB4MDAwMCwKKwkweDgwNzIsIDB4MDAwMCwgMHgzMDAwLCAweDAwMDgsIDB4MGQzMCwgMHgwMDAwLCAweDJlNGQsIDB4MDAwMiwKKwkweDJlNGQsIDB4MDAwMiwgMHgwYTRjLCAweDAwMDMsIDB4ODA1NCwgMHgwMDA4LCAweDAwMTksIDB4MDAwMCwKKwkweDAwMGEsIDB4MDAwYiwgMHg4MDU0LCAweDAwMDgsIDB4MDAwOSwgMHgwMDA4LCAweDAwMGEsIDB4MDAwYiwKKwkweDNhNDQsIDB4MDAwMiwgMHgwYzBhLCAweDAwMGIsIDB4MDIyYSwgMHgwMDBiLCAweDE1YjYsIDB4ZjRhYywKKwkweDAwMDMsIDB4MDAwYiwgMHgwNDgwLCAweDAwMDAsIDB4YzAwMCwgMHgwMDAxLCAweDgwNjQsIDB4MDAwOCwKKwkweDAwMTAsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsIDB4MDEwMSwgMHgwMDA4LCAweGMwMDcsIDB4MDAwMywKKwkweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDAsIDB4NTgwZCwgMHgwMDBiLCAweDc5NzcsIDB4MDAwMywKKwkweDUwZGIsIDB4MDAwYiwgMHhjODBhLCAweDAwMDMsIDB4YmFjMCwgMHgwMDA5LCAweDAwOGEsIDB4MDAwMCwKKwkweDg4MGEsIDB4MDAwYiwgMHgxNWZlLCAweDAwMDgsIDB4YjAwYSwgMHgwMDAzLCAweGM0YzAsIDB4MDAwOSwKKwkweDcwMDAsIDB4MDAwMCwgMHhmZmEwLCAweDAwMDEsIDB4MjAwMCwgMHgwMDAwLCAweDkyMTQsIDB4MDAwMywKKwkweDgwOGMsIDB4MDAwOCwgMHgwMDAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDA3LCAweDQwNDcsIDB4MDAwYSwKKwkweDgwOGMsIDB4MDAwOCwgMHgwMDAyLCAweDAwMDAsIDB4MDgyMSwgMHgwMDAzLCAweDQwMjIsIDB4MDAwMCwKKwkweDAwMjIsIDB4MDAwYiwgMHg0MTIyLCAweDAwMDgsIDB4NDQ0NywgMHgwMDAyLCAweDhhM2MsIDB4MDAwMywKKwkweDBiZmUsIDB4MDAwOCwgMHgxMWEwLCAweDAwMDEsIDB4MTIxYSwgMHgwMDAzLCAweDBjYTAsIDB4MDAwMSwKKwkweDEyMWEsIDB4MDAwMywgMHg5MTgwLCAweDAwMDEsIDB4MDAwNCwgMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwKKwkweDA0MDAsIDB4MDAwMCwgMHg3ZjYyLCAweDAwMDgsIDB4ODA2NiwgMHgwMDAwLCAweDAwMDksIDB4MDAwOCwKKwkweGMwMzAsIDB4MDAwYiwgMHg4MDhjLCAweDAwMDgsIDB4MDAwMCwgMHgwMDA4LCAweDAwNjAsIDB4MDAwOCwKKwkweDgwNjIsIDB4MDAwOCwgMHgwMDA0LCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDA0MTEsIDB4MDAwMCwKKwkweGMwMzgsIDB4MDAwMywgMHgwM2ZlLCAweDAwMDAsIDB4NDNlMCwgMHgwMDAxLCAweDhhMTcsIDB4MDAwMywKKwkweGMyYzAsIDB4MDAwOSwgMHgwMGZmLCAweDAwMDgsIDB4MDJlMCwgMHgwMDAxLCAweDhhMTcsIDB4MDAwMywKKwkweDkxODAsIDB4MDAwMSwgMHgwMDA1LCAweDAwMDgsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMCwKKwkweDdmNjIsIDB4MDAwOCwgMHg4MDY2LCAweDAwMDAsIDB4MDAxOSwgMHgwMDAwLCAweGMwNDcsIDB4MDAwYiwKKwkweDAyNDAsIDB4MDAwMiwgMHgwYTE0LCAweDAwMGIsIDB4MDBmZSwgMHgwMDAwLCAweDMyMTcsIDB4MDAwMywKKwkweDExMmEsIDB4MDAwMCwgMHgwMDJlLCAweDAwMDgsIDB4MDIyYywgMHgwMDA4LCAweDNhNDQsIDB4MDAwMiwKKwkweDg4MGEsIDB4MDAwYiwgMHg4MDhjLCAweDAwMDgsIDB4MDAwMiwgMHgwMDAwLCAweDE3NjAsIDB4MDAwOCwKKwkweDgwNjIsIDB4MDAwOCwgMHgwMDBmLCAweDAwMDgsIDB4ODA2NiwgMHgwMDAwLCAweDAwMTEsIDB4MDAwOCwKKwkweGMwNTgsIDB4MDAwMywgMHgwMWZlLCAweDAwMDgsIDB4NDJlMCwgMHgwMDA5LCAweDhhMGEsIDB4MDAwMywKKwkweDAwZmUsIDB4MDAwMCwgMHg0M2UwLCAweDAwMDEsIDB4OGEwYSwgMHgwMDAzLCAweDE3MzQsIDB4MDAwMCwKKwkweDE1MzAsIDB4MDAwMCwgMHgxNjMyLCAweDAwMDgsIDB4MGQyYSwgMHgwMDA4LCAweDk4ODAsIDB4MDAwMSwKKwkweDAwMTAsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAwLCAweDdmNjIsIDB4MDAwOCwKKwkweDgwNjYsIDB4MDAwMCwgMHgxZTBhLCAweDAwMDgsIDB4YzA2YSwgMHgwMDBiLCAweDgwOGEsIDB4MDAwOCwKKwkweDAwMDMsIDB4MDAwOCwgMHgxYTYwLCAweDAwMDAsIDB4ODA2MiwgMHgwMDA4LCAweDAwMDIsIDB4MDAwMCwKKwkweDU4NzAsIDB4MDAwYiwgMHg4MDY2LCAweDAwMDAsIDB4MzY3OSwgMHgwMDAwLCAweGMwNzMsIDB4MDAwMywKKwkweDU4NzQsIDB4MDAwMywgMHgzZWZlLCAweDAwMDgsIDB4N2Y0ZiwgMHgwMDAyLCAweDA4N2EsIDB4MDAwYiwKKwkweDBkMDAsIDB4MDAwMCwgMHgwMDgyLCAweDAwMDQsIDB4ODA1NCwgMHgwMDA4LCAweDAwMTEsIDB4MDAwOCwKKwkweDgwNzQsIDB4MDAwMCwgMHgxMDEwLCAweDAwMDgsIDB4MWVmZSwgMHgwMDAwLCAweDMwMGEsIDB4MDAwYiwKKwkweDAwYjgsIDB4MDAwNCwgMHgwMDBhLCAweDAwMGIsIDB4MDBmZSwgMHgwMDAwLCAweGIwOGEsIDB4MDAwYiwKKwkweDFhNjAsIDB4MDAwMCwgMHg4MDYyLCAweDAwMDgsIDB4MDAwNywgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwKKwkweDAyMzEsIDB4MDAwOCwgMHhjMDg5LCAweDAwMDMsIDB4MDNmZSwgMHgwMDAwLCAweDA0ZDAsIDB4MDAwMSwKKwkweDg4YjAsIDB4MDAwMywgMHg4MmMwLCAweDAwMDEsIDB4MWYwMCwgMHgwMDAwLCAweGZmYTAsIDB4MDAwMSwKKwkweDA0MDAsIDB4MDAwMCwgMHgwODlmLCAweDAwMDMsIDB4OTBiMCwgMHgwMDAzLCAweDAxZmUsIDB4MDAwOCwKKwkweDA1ODAsIDB4MDAwOSwgMHg3ZjA2LCAweDAwMDAsIDB4MDJmZSwgMHgwMDA4LCAweGZmYzAsIDB4MDAwMSwKKwkweDAwZmYsIDB4MDAwOCwgMHgwNjkwLCAweDAwMDEsIDB4MTA5ZiwgMHgwMDAzLCAweDdmMDgsIDB4MDAwOCwKKwkweDg0YzAsIDB4MDAwMSwgMHhmZjAwLCAweDAwMDgsIDB4MDhiMCwgMHgwMDBiLCAweDAwZmUsIDB4MDAwMCwKKwkweGIwYTYsIDB4MDAwMywgMHg4MDcyLCAweDAwMDAsIDB4MTAxMCwgMHgwMDA4LCAweDM5NDQsIDB4MDAwMiwKKwkweDA4YTEsIDB4MDAwYiwgMHgwMGFhLCAweDAwMGIsIDB4ODA3MiwgMHgwMDAwLCAweDIwMjAsIDB4MDAwOCwKKwkweDM5NDUsIDB4MDAwYSwgMHgwOGE2LCAweDAwMDMsIDB4Mzk0NiwgMHgwMDBhLCAweDg4YjcsIDB4MDAwYiwKKwkweDAwMDAsIDB4MDAwNywgMHgzOTQzLCAweDAwMGEsIDB4MDhiNywgMHgwMDAzLCAweDAwYWEsIDB4MDAwYiwKKwkweDAwZmUsIDB4MDAwMCwgMHhiMGI1LCAweDAwMGIsIDB4ODA3MiwgMHgwMDAwLCAweDEwMDAsIDB4MDAwMCwKKwkweDAwYjcsIDB4MDAwYiwgMHg4MDcyLCAweDAwMDAsIDB4MjAwMCwgMHgwMDAwLCAweDQwMDAsIDB4MDAwZiwKKwkweDFjNjAsIDB4MDAwMCwgMHgxYjYyLCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDAyMzEsIDB4MDAwOCwKKwkweGMwYmMsIDB4MDAwMywgMHg1OGJkLCAweDAwMDMsIDB4MDE0MCwgMHgwMDA4LCAweDAyNDIsIDB4MDAwMCwKKwkweDFmNDMsIDB4MDAwMiwgMHg4OGNiLCAweDAwMDMsIDB4MGQ0NCwgMHgwMDAwLCAweDBkNDYsIDB4MDAwOCwKKwkweDAzNDgsIDB4MDAwOCwgMHgwNDRhLCAweDAwMDgsIDB4MDMwYSwgMHgwMDA4LCAweDA0MGMsIDB4MDAwMCwKKwkweDBkMDYsIDB4MDAwMCwgMHgwZDA4LCAweDAwMDgsIDB4MDBjZiwgMHgwMDBiLCAweDAzNDQsIDB4MDAwOCwKKwkweDA0NDYsIDB4MDAwOCwgMHgwNTQ4LCAweDAwMDgsIDB4MDY0YSwgMHgwMDAwLCAweDU4Y2YsIDB4MDAwMywKKwkweDNlZmUsIDB4MDAwOCwgMHg3ZjRmLCAweDAwMDIsIDB4MDhkNiwgMHgwMDBiLCAweDgwMDAsIDB4MDAwMCwKKwkweDAwMDEsIDB4MDAwMCwgMHgwMDgyLCAweDAwMDQsIDB4ODA1NCwgMHgwMDA4LCAweDAwMDEsIDB4MDAwMCwKKwkweDgwNzQsIDB4MDAwMCwgMHgyMDIwLCAweDAwMDgsIDB4NDAwMCwgMHgwMDBmLCAweDNhNDAsIDB4MDAwYSwKKwkweDg4MGQsIDB4MDAwMywgMHhhYmQwLCAweDAwMDEsIDB4MDAwMCwgMHgwMDA4LCAweDdmMjQsIDB4MDAwMCwKKwkweDU4ZTAsIDB4MDAwYiwgMHg4MDU0LCAweDAwMDgsIDB4MDAwMiwgMHgwMDAwLCAweDEyNDIsIDB4MDAwMiwKKwkweDA5MzAsIDB4MDAwYiwgMHgzYTQ1LCAweDAwMGEsIDB4MDkxZCwgMHgwMDBiLCAweDgwNzIsIDB4MDAwMCwKKwkweDEwMDAsIDB4MDAwMCwgMHgzOTQ1LCAweDAwMGEsIDB4MDhlZCwgMHgwMDAzLCAweDgwNzIsIDB4MDAwMCwKKwkweDMwMTAsIDB4MDAwMCwgMHgxZTEwLCAweDAwMGEsIDB4N2YzYywgMHgwMDAwLCAweDA5MTgsIDB4MDAwYiwKKwkweDFkMDAsIDB4MDAwMiwgMHg3ZjNhLCAweDAwMDAsIDB4MGQ2MCwgMHgwMDAwLCAweDdmNjIsIDB4MDAwOCwKKwkweDgwNjYsIDB4MDAwMCwgMHgwMDA5LCAweDAwMDgsIDB4YzBmNiwgMHgwMDBiLCAweDAwZmUsIDB4MDAwMCwKKwkweGIxMTUsIDB4MDAwMywgMHgxYzYwLCAweDAwMDAsIDB4ODA2MiwgMHgwMDA4LCAweDAwMDEsIDB4MDAwMCwKKwkweDgwNjYsIDB4MDAwMCwgMHgwMDA5LCAweDAwMDgsIDB4YzBmZSwgMHgwMDAzLCAweDAwZmUsIDB4MDAwMCwKKwkweDMxZjEsIDB4MDAwYiwgMHgwMDM4LCAweDAwMDAsIDB4MDA2MCwgMHgwMDA4LCAweDgwNjIsIDB4MDAwOCwKKwkweDAwMTksIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsIDB4MDAwOSwgMHgwMDA4LCAweGMxMDcsIDB4MDAwYiwKKwkweDgwYzAsIDB4MDAwOSwgMHgwMGZmLCAweDAwMDgsIDB4N2YzZSwgMHgwMDA4LCAweDBkNjAsIDB4MDAwMCwKKwkweDBlZmUsIDB4MDAwOCwgMHgxZjgwLCAweDAwMDEsIDB4N2Y2MiwgMHgwMDA4LCAweDgwNjYsIDB4MDAwMCwKKwkweDAwMDksIDB4MDAwOCwgMHhjMTExLCAweDAwMDMsIDB4MDAzYSwgMHgwMDA4LCAweDFkZmUsIDB4MDAwMCwKKwkweDAwZjIsIDB4MDAwMywgMHgwMDM2LCAweDAwMDgsIDB4MDBiOCwgMHgwMDA0LCAweDAxMzAsIDB4MDAwMywKKwkweDgwNzQsIDB4MDAwMCwgMHgyMDAwLCAweDAwMDAsIDB4ODA3MiwgMHgwMDAwLCAweDIwMDAsIDB4MDAwMCwKKwkweDAxMzAsIDB4MDAwMywgMHgzYTQ0LCAweDAwMDIsIDB4MGExZCwgMHgwMDBiLCAweDgwNzQsIDB4MDAwMCwKKwkweDEwMDAsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsIDB4MTAwMCwgMHgwMDAwLCAweGFkZDAsIDB4MDAwMSwKKwkweDAwMDAsIDB4MDAwOCwgMHg3ZjBlLCAweDAwMDgsIDB4YjFlZSwgMHgwMDBiLCAweGE3ZDAsIDB4MDAwMSwKKwkweDAwMDAsIDB4MDAwOCwgMHg3ZjAwLCAweDAwMDAsIDB4YTZkMCwgMHgwMDA5LCAweDAwMDAsIDB4MDAwOCwKKwkweDAwZDAsIDB4MDAwOSwgMHg4OTQyLCAweDAwMDMsIDB4ODA3NCwgMHgwMDAwLCAweDQwNDAsIDB4MDAwOCwKKwkweDU5MzAsIDB4MDAwYiwgMHg1MGRiLCAweDAwMGIsIDB4M2E0NiwgMHgwMDBhLCAweDg5NDIsIDB4MDAwMywKKwkweDNhNDcsIDB4MDAwMiwgMHgwOTNkLCAweDAwMDMsIDB4ODA1NCwgMHgwMDA4LCAweDAwMDQsIDB4MDAwMCwKKwkweDgwNzQsIDB4MDAwMCwgMHg4MDAwLCAweDAwMDAsIDB4ODA3MiwgMHgwMDAwLCAweDMwMDAsIDB4MDAwOCwKKwkweDAxNmIsIDB4MDAwYiwgMHg5MmMwLCAweDAwMDksIDB4MGZjOCwgMHgwMDAwLCAweDA4MGEsIDB4MDAwMywKKwkweDEyNDYsIDB4MDAwYSwgMHg4OWU4LCAweDAwMDMsIDB4MWE2MCwgMHgwMDAwLCAweDgwNjIsIDB4MDAwOCwKKwkweDAwMDIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsIDB4MzY3YSwgMHgwMDAwLCAweGMxNDcsIDB4MDAwMywKKwkweDkyYzAsIDB4MDAwOSwgMHgwNzgwLCAweDAwMDgsIDB4OGEwNCwgMHgwMDBiLCAweDEyNGIsIDB4MDAwMiwKKwkweDA5NTAsIDB4MDAwYiwgMHgyZTRkLCAweDAwMDIsIDB4MmU0ZCwgMHgwMDAyLCAweDA5ZWUsIDB4MDAwYiwKKwkweDNhNDYsIDB4MDAwYSwgMHg4OTVkLCAweDAwMGIsIDB4NTk1MiwgMHgwMDAzLCAweDgwNTQsIDB4MDAwOCwKKwkweDAwMDQsIDB4MDAwMCwgMHgxMjQzLCAweDAwMGEsIDB4MDk2NywgMHgwMDAzLCAweDgwMTAsIDB4MDAwOCwKKwkweDAwMGQsIDB4MDAwMCwgMHgwMWRjLCAweDAwMDQsIDB4MTgxMCwgMHgwMDAwLCAweDAxZGMsIDB4MDAwNCwKKwkweDAxNjcsIDB4MDAwYiwgMHgxOTRkLCAweDAwMGEsIDB4MDk2MSwgMHgwMDAzLCAweDEyNDMsIDB4MDAwYSwKKwkweDA5ZjgsIDB4MDAwMywgMHg1OTYxLCAweDAwMDMsIDB4ODA1NCwgMHgwMDA4LCAweDAwMDQsIDB4MDAwMCwKKwkweDAxZDEsIDB4MDAwYywgMHgxODEwLCAweDAwMDAsIDB4MDFkYywgMHgwMDA0LCAweDgwNzQsIDB4MDAwMCwKKwkweGYwMDAsIDB4MDAwOCwgMHg4MDcyLCAweDAwMDAsIDB4MzAwMCwgMHgwMDA4LCAweDBkMzAsIDB4MDAwMCwKKwkweDNhNDIsIDB4MDAwMiwgMHg4OTcxLCAweDAwMDMsIDB4MTVmZSwgMHgwMDA4LCAweGIwNTEsIDB4MDAwYiwKKwkweDAwMGEsIDB4MDAwYiwgMHg4MDc0LCAweDAwMDAsIDB4MDUwMSwgMHgwMDAwLCAweDgwMTAsIDB4MDAwOCwKKwkweDAwMGMsIDB4MDAwOCwgMHgwMWRjLCAweDAwMDQsIDB4MDAwYSwgMHgwMDBiLCAweGJiZTAsIDB4MDAwOSwKKwkweDAwMzAsIDB4MDAwOCwgMHg4OTg3LCAweDAwMDMsIDB4MThmZSwgMHgwMDAwLCAweDNjZTAsIDB4MDAwOSwKKwkweDA5ODQsIDB4MDAwYiwgMHgxNWZlLCAweDAwMDgsIDB4M2NlMCwgMHgwMDA5LCAweDA5ODQsIDB4MDAwYiwKKwkweDAxY2MsIDB4MDAwYywgMHg4MDc2LCAweDAwMDgsIDB4MDA0MCwgMHgwMDAwLCAweDAxYzksIDB4MDAwMywKKwkweDgwNzYsIDB4MDAwOCwgMHgwMDQxLCAweDAwMDgsIDB4MDFjOSwgMHgwMDAzLCAweGJiZTAsIDB4MDAwOSwKKwkweDAwMzIsIDB4MDAwMCwgMHg4OThjLCAweDAwMGIsIDB4M2MxZSwgMHgwMDA4LCAweDAxYzksIDB4MDAwMywKKwkweGJiZTAsIDB4MDAwOSwgMHgwMDM3LCAweDAwMDAsIDB4ODlhZSwgMHgwMDBiLCAweDE4ZmUsIDB4MDAwMCwKKwkweDNjZTAsIDB4MDAwOSwgMHg4OTg0LCAweDAwMDMsIDB4ODA3NiwgMHgwMDA4LCAweDAwNDAsIDB4MDAwMCwKKwkweDFhNjAsIDB4MDAwMCwgMHg4MDYyLCAweDAwMDgsIDB4MDAwZCwgMHgwMDAwLCAweGE2ZDAsIDB4MDAwOSwKKwkweDAwMDAsIDB4MDAwOCwgMHg3ZjA0LCAweDAwMDgsIDB4YTdkMCwgMHgwMDAxLCAweDAwMDAsIDB4MDAwOCwKKwkweDdmMDYsIDB4MDAwMCwgMHhhOGQwLCAweDAwMDEsIDB4MDAwMCwgMHgwMDA4LCAweDdmMDgsIDB4MDAwOCwKKwkweGE5ZDAsIDB4MDAwOSwgMHgwMDAwLCAweDAwMDgsIDB4N2YwYSwgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwKKwkweDA0MjIsIDB4MDAwMCwgMHhjMWE1LCAweDAwMDMsIDB4MDFkMSwgMHgwMDBjLCAweDgwNTQsIDB4MDAwOCwKKwkweDAwMDQsIDB4MDAwMCwgMHg4MDc0LCAweDAwMDAsIDB4ZjAwMCwgMHgwMDA4LCAweDgwNzIsIDB4MDAwMCwKKwkweGIwMDAsIDB4MDAwMCwgMHgwMTZiLCAweDAwMGIsIDB4YmJlMCwgMHgwMDA5LCAweDAwMzgsIDB4MDAwMCwKKwkweDg5YzAsIDB4MDAwMywgMHgxOGZlLCAweDAwMDAsIDB4M2NlMCwgMHgwMDA5LCAweDA5YmQsIDB4MDAwYiwKKwkweDE1ZmUsIDB4MDAwOCwgMHgzY2UwLCAweDAwMDksIDB4ODk4MCwgMHgwMDBiLCAweDAxY2MsIDB4MDAwYywKKwkweDgwNzYsIDB4MDAwOCwgMHgwMDQwLCAweDAwMDAsIDB4ODA3MiwgMHgwMDAwLCAweDgwMDAsIDB4MDAwMCwKKwkweDAyMTQsIDB4MDAwMywgMHg4MDc2LCAweDAwMDgsIDB4MDA0MiwgMHgwMDA4LCAweDAxYzksIDB4MDAwMywKKwkweGJiZTAsIDB4MDAwOSwgMHgwMDE2LCAweDAwMDAsIDB4ODljOSwgMHgwMDAzLCAweDNhNDQsIDB4MDAwMiwKKwkweDg4MGMsIDB4MDAwYiwgMHg4MDcyLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLCAweDgwMDAsIDB4MDAwZiwKKwkweDAwMGEsIDB4MDAwYiwgMHg4MDcyLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLCAweDAwMGEsIDB4MDAwYiwKKwkweDNkMzAsIDB4MDAwYSwgMHg3ZjAwLCAweDAwMDAsIDB4YmM4MCwgMHgwMDAxLCAweDAwMDcsIDB4MDAwMCwKKwkweDAxZDUsIDB4MDAwYiwgMHgxOTMwLCAweDAwMGEsIDB4N2YwMCwgMHgwMDAwLCAweDk4ODAsIDB4MDAwMSwKKwkweDAwMDcsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAwLCAweDdmNjIsIDB4MDAwOCwKKwkweDgwNjYsIDB4MDAwMCwgMHgwMDBhLCAweDAwMDgsIDB4YzFkYSwgMHgwMDBiLCAweDQwMDAsIDB4MDAwZiwKKwkweDIxZGMsIDB4MDAwMywgMHgwODcwLCAweDAwMDgsIDB4NDAwMCwgMHgwMDBmLCAweGJhYzAsIDB4MDAwOSwKKwkweDAwOTAsIDB4MDAwOCwgMHgwOWU1LCAweDAwMDMsIDB4ODA3NCwgMHgwMDAwLCAweDA3MDYsIDB4MDAwMCwKKwkweDAxZTcsIDB4MDAwMywgMHg4MDc0LCAweDAwMDAsIDB4MDcwMywgMHgwMDAwLCAweDQwMDAsIDB4MDAwZiwKKwkweDgwMTAsIDB4MDAwOCwgMHgwMDIzLCAweDAwMDAsIDB4MDIyMiwgMHgwMDAzLCAweDgwMTAsIDB4MDAwOCwKKwkweDAwMDgsIDB4MDAwMCwgMHgwMjIyLCAweDAwMDMsIDB4ODAxMCwgMHgwMDA4LCAweDAwMjIsIDB4MDAwOCwKKwkweDAyMjIsIDB4MDAwMywgMHgwMWQxLCAweDAwMGMsIDB4ODAxMCwgMHgwMDA4LCAweDAwMDcsIDB4MDAwMCwKKwkweDAxZGMsIDB4MDAwNCwgMHgxODEwLCAweDAwMDAsIDB4MDFkYywgMHgwMDA0LCAweDAyMmUsIDB4MDAwMywKKwkweDAxZDEsIDB4MDAwYywgMHg4MDEwLCAweDAwMDgsIDB4MDAxYiwgMHgwMDA4LCAweDAxZGMsIDB4MDAwNCwKKwkweDE4MTAsIDB4MDAwMCwgMHgwMWRjLCAweDAwMDQsIDB4ODA3NCwgMHgwMDAwLCAweGYwODAsIDB4MDAwMCwKKwkweDgwNzIsIDB4MDAwMCwgMHgzMDAwLCAweDAwMDgsIDB4MGQzMCwgMHgwMDAwLCAweDAwMGEsIDB4MDAwYiwKKwkweDgwMTAsIDB4MDAwOCwgMHgwMDA5LCAweDAwMDgsIDB4MDIyMiwgMHgwMDAzLCAweDgwMTAsIDB4MDAwOCwKKwkweDAwMDUsIDB4MDAwOCwgMHgwMjIyLCAweDAwMDMsIDB4ODA4YywgMHgwMDA4LCAweDAwMDEsIDB4MDAwMCwKKwkweDgwMTAsIDB4MDAwOCwgMHgwMDA0LCAweDAwMDAsIDB4NDE0MywgMHgwMDBhLCAweDA4NWYsIDB4MDAwMywKKwkweDNhNDQsIDB4MDAwMiwgMHg4ODBhLCAweDAwMGIsIDB4MGQyYSwgMHgwMDA4LCAweDAyMjIsIDB4MDAwMywKKwkweDgwMTAsIDB4MDAwOCwgMHgwMDAzLCAweDAwMDgsIDB4MDIyNiwgMHgwMDBiLCAweDgwMTAsIDB4MDAwOCwKKwkweDAwMGIsIDB4MDAwMCwgMHgwMjI2LCAweDAwMGIsIDB4ODAxMCwgMHgwMDA4LCAweDAwMDIsIDB4MDAwMCwKKwkweDAyMjYsIDB4MDAwYiwgMHgzYTQ3LCAweDAwMDIsIDB4ODkzMCwgMHgwMDAzLCAweDgwMTAsIDB4MDAwOCwKKwkweDAwMDYsIDB4MDAwOCwgMHgwMjI2LCAweDAwMGIsIDB4ODA3NCwgMHgwMDAwLCAweGYwMDAsIDB4MDAwOCwKKwkweDgwNzIsIDB4MDAwMCwgMHgzMDAwLCAweDAwMDgsIDB4MDFkYywgMHgwMDA0LCAweDAxZGYsIDB4MDAwNCwKKwkweDNhNDAsIDB4MDAwYSwgMHgwODBhLCAweDAwMDMsIDB4ODAxMCwgMHgwMDA4LCAweDAwMGMsIDB4MDAwOCwKKwkweDAxZGMsIDB4MDAwNCwgMHgwMDBhLCAweDAwMGIsIDB4ODA3NCwgMHgwMDAwLCAweGYwODAsIDB4MDAwMCwKKwkweDgwNzIsIDB4MDAwMCwgMHgzMDAwLCAweDAwMDgsIDB4MGQzMCwgMHgwMDAwLCAweDJlNGQsIDB4MDAwMiwKKwkweDJlNGQsIDB4MDAwMiwgMHgwYTM5LCAweDAwMGIsIDB4ODA1NCwgMHgwMDA4LCAweDAwMTksIDB4MDAwMCwKKwkweDAwMGEsIDB4MDAwYiwgMHg4MDU0LCAweDAwMDgsIDB4MDAwOSwgMHgwMDA4LCAweDAwMGEsIDB4MDAwYiwKKwkweDNhNDQsIDB4MDAwMiwgMHg4ODBhLCAweDAwMGIsIDB4MDIxNywgMHgwMDAzLCAweGY0ZTUsIDB4ZjQ4MiwKKwkweDAwMDEsIDB4MDAwMiwgMHgwMDA0LCAweDAwMDgsIDB4MDAxMCwgMHgwMDIwLCAweDAwNDAsIDB4MDA4MCwKKwkweDAxMDAsIDB4MDIwMCwgMHgwNDAwLCAweDA4MDAsIDB4MTAwMCwgMHgyMDAwLCAweDQwMDAsIDB4ODAwMCwKKwkweDY4NzAKK307CisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3Vuc2lnbmVkIHNob3J0IGZ3MjMwMGZseF9sZW5ndGgwMSA9IDB4ZGQ3OTsKKyNlbHNlCit1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfbGVuZ3RoMDEgPSAweGRkNzk7CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYzMzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKQEAgLTAsMCArMSwxMTU4IEBACisvKgorICogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyAqCisgKiBRTG9naWMgSVNQMngwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAyLjYueAorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUUxvZ2ljIENvcnBvcmF0aW9uCisgKiAod3d3LnFsb2dpYy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2luY2x1ZGUgInFsYV9kZWYuaCIKKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKK3N0YXRpYyBpbnQgcWxhX3VwcmludGYoY2hhciAqKiwgY2hhciAqLCAuLi4pOworCisvKioKKyAqIHFsYTIzMDBfZndfZHVtcCgpIC0gRHVtcHMgYmluYXJ5IGRhdGEgZnJvbSB0aGUgMjMwMCBmaXJtd2FyZS4KKyAqIEBoYTogSEEgY29udGV4dAorICogQGhhcmR3YXJlX2xvY2tlZDogQ2FsbGVkIHdpdGggdGhlIGhhcmR3YXJlX2xvY2sKKyAqLwordm9pZAorcWxhMjMwMF9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGludCBoYXJkd2FyZV9sb2NrZWQpCit7CisJaW50CQlydmFsOworCXVpbnQzMl90CWNudCwgdGltZXI7CisJdWludDMyX3QJcmlzY19hZGRyZXNzOworCXVpbnQxNl90CW1iMCwgbWIyOworCisJdWludDMyX3QJc3RhdDsKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKwl1aW50MTZfdCBfX2lvbWVtICpkbXBfcmVnOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJc3RydWN0IHFsYTIzMDBfZndfZHVtcAkqZnc7CisJdWludDMyX3QJZHVtcF9zaXplLCBkYXRhX3JhbV9jbnQ7CisKKwlyaXNjX2FkZHJlc3MgPSBkYXRhX3JhbV9jbnQgPSAwOworCW1iMCA9IG1iMiA9IDA7CisJZmxhZ3MgPSAwOworCisJaWYgKCFoYXJkd2FyZV9sb2NrZWQpCisJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJaWYgKGhhLT5md19kdW1wICE9IE5VTEwpIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIkZpcm13YXJlIGhhcyBiZWVuIHByZXZpb3VzbHkgZHVtcGVkICglcCkgLS0gaWdub3JpbmcgIgorCQkgICAgInJlcXVlc3QuLi5cbiIsIGhhLT5md19kdW1wKTsKKwkJZ290byBxbGEyMzAwX2Z3X2R1bXBfZmFpbGVkOworCX0KKworCS8qIEFsbG9jYXRlIChsYXJnZSkgZHVtcCBidWZmZXIuICovCisJZHVtcF9zaXplID0gc2l6ZW9mKHN0cnVjdCBxbGEyMzAwX2Z3X2R1bXApOworCWR1bXBfc2l6ZSArPSAoaGEtPmZ3X21lbW9yeV9zaXplIC0gMHgxMTAwMCkgKiBzaXplb2YodWludDE2X3QpOworCWhhLT5md19kdW1wX29yZGVyID0gZ2V0X29yZGVyKGR1bXBfc2l6ZSk7CisJaGEtPmZ3X2R1bXAgPSAoc3RydWN0IHFsYTIzMDBfZndfZHVtcCAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9BVE9NSUMsCisJICAgIGhhLT5md19kdW1wX29yZGVyKTsKKwlpZiAoaGEtPmZ3X2R1bXAgPT0gTlVMTCkgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlZCBtZW1vcnkgZm9yIGZpcm13YXJlIGR1bXAgKCVkLyVkKS5cbiIsCisJCSAgICBoYS0+ZndfZHVtcF9vcmRlciwgZHVtcF9zaXplKTsKKwkJZ290byBxbGEyMzAwX2Z3X2R1bXBfZmFpbGVkOworCX0KKwlmdyA9IGhhLT5md19kdW1wOworCisJcnZhbCA9IFFMQV9TVUNDRVNTOworCWZ3LT5oY2NyID0gUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CisKKwkvKiBQYXVzZSBSSVNDLiAqLworCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX1BBVVNFX1JJU0MpOyAKKwlpZiAoSVNfUUxBMjMwMChoYSkpIHsKKwkJZm9yIChjbnQgPSAzMDAwMDsKKwkJICAgIChSRF9SRUdfV09SRCgmcmVnLT5oY2NyKSAmIEhDQ1JfUklTQ19QQVVTRSkgPT0gMCAmJgorCQkJcnZhbCA9PSBRTEFfU1VDQ0VTUzsgY250LS0pIHsKKwkJCWlmIChjbnQpCisJCQkJdWRlbGF5KDEwMCk7CisJCQllbHNlCisJCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9USU1FT1VUOworCQl9CisJfSBlbHNlIHsKKwkJUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CQkvKiBQQ0kgUG9zdGluZy4gKi8KKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgeworCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikocmVnICsgMCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5wYml1X3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+cGJpdV9yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDEwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPnJpc2NfaG9zdF9yZWcpIC8gMjsgY250KyspIAorCQkJZnctPnJpc2NfaG9zdF9yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDQwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPm1haWxib3hfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5tYWlsYm94X3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMsIDB4NDApOworCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4ODApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+cmVzcF9kbWFfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5yZXNwX2RtYV9yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPmN0cmxfc3RhdHVzLCAweDUwKTsKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDgwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPmRtYV9yZWcpIC8gMjsgY250KyspIAorCQkJZnctPmRtYV9yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPmN0cmxfc3RhdHVzLCAweDAwKTsKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEEwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPnJpc2NfaGR3X3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+cmlzY19oZHdfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5wY3IsIDB4MjAwMCk7IAorCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4ODApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+cmlzY19ncDBfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5yaXNjX2dwMF9yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPnBjciwgMHgyMjAwKTsgCisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHg4MCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5yaXNjX2dwMV9yZWcpIC8gMjsgY250KyspIAorCQkJZnctPnJpc2NfZ3AxX3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+cGNyLCAweDI0MDApOyAKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDgwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPnJpc2NfZ3AyX3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+cmlzY19ncDJfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5wY3IsIDB4MjYwMCk7IAorCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4ODApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+cmlzY19ncDNfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5yaXNjX2dwM19yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPnBjciwgMHgyODAwKTsgCisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHg4MCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5yaXNjX2dwNF9yZWcpIC8gMjsgY250KyspIAorCQkJZnctPnJpc2NfZ3A0X3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+cGNyLCAweDJBMDApOyAKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDgwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPnJpc2NfZ3A1X3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+cmlzY19ncDVfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5wY3IsIDB4MkMwMCk7IAorCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4ODApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+cmlzY19ncDZfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5yaXNjX2dwNl9yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPnBjciwgMHgyRTAwKTsgCisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHg4MCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5yaXNjX2dwN19yZWcpIC8gMjsgY250KyspIAorCQkJZnctPnJpc2NfZ3A3X3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMsIDB4MTApOyAKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDgwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPmZyYW1lX2J1Zl9oZHdfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5mcmFtZV9idWZfaGR3X3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMsIDB4MjApOyAKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDgwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPmZwbV9iMF9yZWcpIC8gMjsgY250KyspIAorCQkJZnctPmZwbV9iMF9yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPmN0cmxfc3RhdHVzLCAweDMwKTsgCisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHg4MCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5mcG1fYjFfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5mcG1fYjFfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCS8qIFJlc2V0IFJJU0MuICovCisJCVdSVF9SRUdfV09SRCgmcmVnLT5jdHJsX3N0YXR1cywgQ1NSX0lTUF9TT0ZUX1JFU0VUKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCAzMDAwMDsgY250KyspIHsKKwkJCWlmICgoUkRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMpICYKKwkJCSAgICBDU1JfSVNQX1NPRlRfUkVTRVQpID09IDApCisJCQkJYnJlYWs7CisKKwkJCXVkZWxheSgxMCk7CisJCX0KKwl9CisKKwlpZiAoIUlTX1FMQTIzMDAoaGEpKSB7CisJCWZvciAoY250ID0gMzAwMDA7IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDApICE9IDAgJiYKKwkJICAgIHJ2YWwgPT0gUUxBX1NVQ0NFU1M7IGNudC0tKSB7CisJCQlpZiAoY250KQorCQkJCXVkZWxheSgxMDApOworCQkJZWxzZQorCQkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fVElNRU9VVDsKKwkJfQorCX0KKworCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CisJCS8qIEdldCBSSVNDIFNSQU0uICovCisJCXJpc2NfYWRkcmVzcyA9IDB4ODAwOworIAkJV1JUX01BSUxCT1hfUkVHKGhhLCByZWcsIDAsIE1CQ19SRUFEX1JBTV9XT1JEKTsKKwkJY2xlYXJfYml0KE1CWF9JTlRFUlJVUFQsICZoYS0+bWJ4X2NtZF9mbGFncyk7CisJfQorCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5yaXNjX3JhbSkgLyAyICYmIHJ2YWwgPT0gUUxBX1NVQ0NFU1M7CisJICAgIGNudCsrLCByaXNjX2FkZHJlc3MrKykgeworIAkJV1JUX01BSUxCT1hfUkVHKGhhLCByZWcsIDEsICh1aW50MTZfdClyaXNjX2FkZHJlc3MpOworCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9TRVRfSE9TVF9JTlQpOworCisJCWZvciAodGltZXIgPSA2MDAwMDAwOyB0aW1lcjsgdGltZXItLSkgeworCQkJLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KKyAJCQlzdGF0ID0gUkRfUkVHX0RXT1JEKCZyZWctPnUuaXNwMjMwMC5ob3N0X3N0YXR1cyk7CisJCQlpZiAoc3RhdCAmIEhTUl9SSVNDX0lOVCkgeworCQkJCXN0YXQgJj0gMHhmZjsKKworCQkJCWlmIChzdGF0ID09IDB4MSB8fCBzdGF0ID09IDB4MikgeworCQkJCQlzZXRfYml0KE1CWF9JTlRFUlJVUFQsCisJCQkJCSAgICAmaGEtPm1ieF9jbWRfZmxhZ3MpOworCisJCQkJCW1iMCA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDApOworCQkJCQltYjIgPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAyKTsKKworCQkJCQkvKiBSZWxlYXNlIG1haWxib3ggcmVnaXN0ZXJzLiAqLworCQkJCQlXUlRfUkVHX1dPUkQoJnJlZy0+c2VtYXBob3JlLCAwKTsKKwkJCQkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsCisJCQkJCSAgICBIQ0NSX0NMUl9SSVNDX0lOVCk7CisJCQkJCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgaWYgKHN0YXQgPT0gMHgxMCB8fCBzdGF0ID09IDB4MTEpIHsKKwkJCQkJc2V0X2JpdChNQlhfSU5URVJSVVBULAorCQkJCQkgICAgJmhhLT5tYnhfY21kX2ZsYWdzKTsKKworCQkJCQltYjAgPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAwKTsKKwkJCQkJbWIyID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMik7CisKKwkJCQkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsCisJCQkJCSAgICBIQ0NSX0NMUl9SSVNDX0lOVCk7CisJCQkJCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvKiBjbGVhciB0aGlzIGludHI7IGl0IHdhc24ndCBhIG1haWxib3ggaW50ciAqLworCQkJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX0NMUl9SSVNDX0lOVCk7CisJCQkJUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CisJCQl9CisJCQl1ZGVsYXkoNSk7CisJCX0KKworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE1CWF9JTlRFUlJVUFQsICZoYS0+bWJ4X2NtZF9mbGFncykpIHsKKwkJCXJ2YWwgPSBtYjAgJiBNQlNfTUFTSzsKKwkJCWZ3LT5yaXNjX3JhbVtjbnRdID0gbWIyOworCQl9IGVsc2UgeworCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCX0KKwl9CisKKwlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgeworCQkvKiBHZXQgc3RhY2sgU1JBTS4gKi8KKwkJcmlzY19hZGRyZXNzID0gMHgxMDAwMDsKKyAJCVdSVF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAwLCBNQkNfUkVBRF9SQU1fRVhURU5ERUQpOworCQljbGVhcl9iaXQoTUJYX0lOVEVSUlVQVCwgJmhhLT5tYnhfY21kX2ZsYWdzKTsKKwl9CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPnN0YWNrX3JhbSkgLyAyICYmIHJ2YWwgPT0gUUxBX1NVQ0NFU1M7CisJICAgIGNudCsrLCByaXNjX2FkZHJlc3MrKykgeworIAkJV1JUX01BSUxCT1hfUkVHKGhhLCByZWcsIDEsIExTVyhyaXNjX2FkZHJlc3MpKTsKKyAJCVdSVF9NQUlMQk9YX1JFRyhoYSwgcmVnLCA4LCBNU1cocmlzY19hZGRyZXNzKSk7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX1NFVF9IT1NUX0lOVCk7CisKKwkJZm9yICh0aW1lciA9IDYwMDAwMDA7IHRpbWVyOyB0aW1lci0tKSB7CisJCQkvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzLiAqLworIAkJCXN0YXQgPSBSRF9SRUdfRFdPUkQoJnJlZy0+dS5pc3AyMzAwLmhvc3Rfc3RhdHVzKTsKKwkJCWlmIChzdGF0ICYgSFNSX1JJU0NfSU5UKSB7CisJCQkJc3RhdCAmPSAweGZmOworCisJCQkJaWYgKHN0YXQgPT0gMHgxIHx8IHN0YXQgPT0gMHgyKSB7CisJCQkJCXNldF9iaXQoTUJYX0lOVEVSUlVQVCwKKwkJCQkJICAgICZoYS0+bWJ4X2NtZF9mbGFncyk7CisKKwkJCQkJbWIwID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMCk7CisJCQkJCW1iMiA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDIpOworCisJCQkJCS8qIFJlbGVhc2UgbWFpbGJveCByZWdpc3RlcnMuICovCisJCQkJCVdSVF9SRUdfV09SRCgmcmVnLT5zZW1hcGhvcmUsIDApOworCQkJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwKKwkJCQkJICAgIEhDQ1JfQ0xSX1JJU0NfSU5UKTsKKwkJCQkJUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSBpZiAoc3RhdCA9PSAweDEwIHx8IHN0YXQgPT0gMHgxMSkgeworCQkJCQlzZXRfYml0KE1CWF9JTlRFUlJVUFQsCisJCQkJCSAgICAmaGEtPm1ieF9jbWRfZmxhZ3MpOworCisJCQkJCW1iMCA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDApOworCQkJCQltYjIgPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAyKTsKKworCQkJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwKKwkJCQkJICAgIEhDQ1JfQ0xSX1JJU0NfSU5UKTsKKwkJCQkJUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIGNsZWFyIHRoaXMgaW50cjsgaXQgd2Fzbid0IGEgbWFpbGJveCBpbnRyICovCisJCQkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfQ0xSX1JJU0NfSU5UKTsKKwkJCQlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsKKwkJCX0KKwkJCXVkZWxheSg1KTsKKwkJfQorCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTUJYX0lOVEVSUlVQVCwgJmhhLT5tYnhfY21kX2ZsYWdzKSkgeworCQkJcnZhbCA9IG1iMCAmIE1CU19NQVNLOworCQkJZnctPnN0YWNrX3JhbVtjbnRdID0gbWIyOworCQl9IGVsc2UgeworCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCX0KKwl9CisKKwlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgeworCQkvKiBHZXQgZGF0YSBTUkFNLiAqLworCQlyaXNjX2FkZHJlc3MgPSAweDExMDAwOworCQlkYXRhX3JhbV9jbnQgPSBoYS0+ZndfbWVtb3J5X3NpemUgLSByaXNjX2FkZHJlc3MgKyAxOworIAkJV1JUX01BSUxCT1hfUkVHKGhhLCByZWcsIDAsIE1CQ19SRUFEX1JBTV9FWFRFTkRFRCk7CisJCWNsZWFyX2JpdChNQlhfSU5URVJSVVBULCAmaGEtPm1ieF9jbWRfZmxhZ3MpOworCX0KKwlmb3IgKGNudCA9IDA7IGNudCA8IGRhdGFfcmFtX2NudCAmJiBydmFsID09IFFMQV9TVUNDRVNTOworCSAgICBjbnQrKywgcmlzY19hZGRyZXNzKyspIHsKKyAJCVdSVF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAxLCBMU1cocmlzY19hZGRyZXNzKSk7CisgCQlXUlRfTUFJTEJPWF9SRUcoaGEsIHJlZywgOCwgTVNXKHJpc2NfYWRkcmVzcykpOworCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9TRVRfSE9TVF9JTlQpOworCisJCWZvciAodGltZXIgPSA2MDAwMDAwOyB0aW1lcjsgdGltZXItLSkgeworCQkJLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KKyAJCQlzdGF0ID0gUkRfUkVHX0RXT1JEKCZyZWctPnUuaXNwMjMwMC5ob3N0X3N0YXR1cyk7CisJCQlpZiAoc3RhdCAmIEhTUl9SSVNDX0lOVCkgeworCQkJCXN0YXQgJj0gMHhmZjsKKworCQkJCWlmIChzdGF0ID09IDB4MSB8fCBzdGF0ID09IDB4MikgeworCQkJCQlzZXRfYml0KE1CWF9JTlRFUlJVUFQsCisJCQkJCSAgICAmaGEtPm1ieF9jbWRfZmxhZ3MpOworCisJCQkJCW1iMCA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDApOworCQkJCQltYjIgPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAyKTsKKworCQkJCQkvKiBSZWxlYXNlIG1haWxib3ggcmVnaXN0ZXJzLiAqLworCQkJCQlXUlRfUkVHX1dPUkQoJnJlZy0+c2VtYXBob3JlLCAwKTsKKwkJCQkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsCisJCQkJCSAgICBIQ0NSX0NMUl9SSVNDX0lOVCk7CisJCQkJCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgaWYgKHN0YXQgPT0gMHgxMCB8fCBzdGF0ID09IDB4MTEpIHsKKwkJCQkJc2V0X2JpdChNQlhfSU5URVJSVVBULAorCQkJCQkgICAgJmhhLT5tYnhfY21kX2ZsYWdzKTsKKworCQkJCQltYjAgPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAwKTsKKwkJCQkJbWIyID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMik7CisKKwkJCQkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsCisJCQkJCSAgICBIQ0NSX0NMUl9SSVNDX0lOVCk7CisJCQkJCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvKiBjbGVhciB0aGlzIGludHI7IGl0IHdhc24ndCBhIG1haWxib3ggaW50ciAqLworCQkJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX0NMUl9SSVNDX0lOVCk7CisJCQkJUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CisJCQl9CisJCQl1ZGVsYXkoNSk7CisJCX0KKworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE1CWF9JTlRFUlJVUFQsICZoYS0+bWJ4X2NtZF9mbGFncykpIHsKKwkJCXJ2YWwgPSBtYjAgJiBNQlNfTUFTSzsKKwkJCWZ3LT5kYXRhX3JhbVtjbnRdID0gbWIyOworCQl9IGVsc2UgeworCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCX0KKwl9CisKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJGYWlsZWQgdG8gZHVtcCBmaXJtd2FyZSAoJXgpISEhXG4iLCBydmFsKTsKKworCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWhhLT5md19kdW1wLCBoYS0+ZndfZHVtcF9vcmRlcik7CisJCWhhLT5md19kdW1wID0gTlVMTDsKKwl9IGVsc2UgeworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCSAgICAiRmlybXdhcmUgZHVtcCBzYXZlZCB0byB0ZW1wIGJ1ZmZlciAoJWxkLyVwKS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgaGEtPmZ3X2R1bXApOworCX0KKworcWxhMjMwMF9md19kdW1wX2ZhaWxlZDoKKwlpZiAoIWhhcmR3YXJlX2xvY2tlZCkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBxbGEyMzAwX2FzY2lpX2Z3X2R1bXAoKSAtIENvbnZlcnRzIGEgYmluYXJ5IGZpcm13YXJlIGR1bXAgdG8gQVNDSUkuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqLwordm9pZAorcWxhMjMwMF9hc2NpaV9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJdWludDMyX3QgY250OworCWNoYXIgKnVpdGVyOworCWNoYXIgZndfaW5mb1szMF07CisJc3RydWN0IHFsYTIzMDBfZndfZHVtcCAqZnc7CisJdWludDMyX3QgZGF0YV9yYW1fY250OworCisJdWl0ZXIgPSBoYS0+ZndfZHVtcF9idWZmZXI7CisJZncgPSBoYS0+ZndfZHVtcDsKKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIiVzIEZpcm13YXJlIFZlcnNpb24gJXNcbiIsIGhhLT5tb2RlbF9udW1iZXIsCisJICAgIHFsYTJ4MDBfZ2V0X2Z3X3ZlcnNpb25fc3RyKGhhLCBmd19pbmZvKSk7CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcbls9PT5CRUddXG4iKTsKKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIkhDQ1IgUmVnaXN0ZXI6XG4lMDR4XG5cbiIsIGZ3LT5oY2NyKTsKKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlBCSVUgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+cGJpdV9yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5wYml1X3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuUmVxUS1Sc3BRLVJpc2MySG9zdCBTdGF0dXMgcmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+cmlzY19ob3N0X3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPnJpc2NfaG9zdF9yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cbk1haWxib3ggUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+bWFpbGJveF9yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5tYWlsYm94X3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuQXV0byBSZXF1ZXN0IFJlc3BvbnNlIERNQSBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5yZXNwX2RtYV9yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5yZXNwX2RtYV9yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cbkRNQSBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5kbWFfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+ZG1hX3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuUklTQyBIYXJkd2FyZSBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5yaXNjX2hkd19yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5yaXNjX2hkd19yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cblJJU0MgR1AwIFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPnJpc2NfZ3AwX3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPnJpc2NfZ3AwX3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuUklTQyBHUDEgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+cmlzY19ncDFfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+cmlzY19ncDFfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5SSVNDIEdQMiBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5yaXNjX2dwMl9yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5yaXNjX2dwMl9yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cblJJU0MgR1AzIFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPnJpc2NfZ3AzX3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPnJpc2NfZ3AzX3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuUklTQyBHUDQgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+cmlzY19ncDRfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+cmlzY19ncDRfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5SSVNDIEdQNSBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5yaXNjX2dwNV9yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5yaXNjX2dwNV9yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cblJJU0MgR1A2IFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPnJpc2NfZ3A2X3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPnJpc2NfZ3A2X3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuUklTQyBHUDcgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+cmlzY19ncDdfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+cmlzY19ncDdfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5GcmFtZSBCdWZmZXIgSGFyZHdhcmUgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+ZnJhbWVfYnVmX2hkd19yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5mcmFtZV9idWZfaGR3X3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuRlBNIEIwIFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPmZwbV9iMF9yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5mcG1fYjBfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5GUE0gQjEgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+ZnBtX2IxX3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPmZwbV9iMV9yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cbkNvZGUgUkFNIER1bXA6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5yaXNjX3JhbSkgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiUwNHg6ICIsIGNudCArIDB4MDgwMCk7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+cmlzY19yYW1bY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cblN0YWNrIFJBTSBEdW1wOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+c3RhY2tfcmFtKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuJTA1eDogIiwgY250ICsgMHgxMDAwMCk7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+c3RhY2tfcmFtW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5EYXRhIFJBTSBEdW1wOiIpOworCWRhdGFfcmFtX2NudCA9IGhhLT5md19tZW1vcnlfc2l6ZSAtIDB4MTEwMDAgKyAxOworCWZvciAoY250ID0gMDsgY250IDwgZGF0YV9yYW1fY250OyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiUwNXg6ICIsIGNudCArIDB4MTEwMDApOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPmRhdGFfcmFtW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5bPD09RU5EXSBJU1AgRGVidWcgRHVtcC4iKTsKK30KKworLyoqCisgKiBxbGEyMTAwX2Z3X2R1bXAoKSAtIER1bXBzIGJpbmFyeSBkYXRhIGZyb20gdGhlIDIxMDAvMjIwMCBmaXJtd2FyZS4KKyAqIEBoYTogSEEgY29udGV4dAorICogQGhhcmR3YXJlX2xvY2tlZDogQ2FsbGVkIHdpdGggdGhlIGhhcmR3YXJlX2xvY2sKKyAqLwordm9pZAorcWxhMjEwMF9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGludCBoYXJkd2FyZV9sb2NrZWQpCit7CisJaW50CQlydmFsOworCXVpbnQzMl90CWNudCwgdGltZXI7CisJdWludDE2X3QJcmlzY19hZGRyZXNzOworCXVpbnQxNl90CW1iMCwgbWIyOworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCXVpbnQxNl90IF9faW9tZW0gKmRtcF9yZWc7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlzdHJ1Y3QgcWxhMjEwMF9md19kdW1wCSpmdzsKKworCXJpc2NfYWRkcmVzcyA9IDA7CisJbWIwID0gbWIyID0gMDsKKwlmbGFncyA9IDA7CisKKwlpZiAoIWhhcmR3YXJlX2xvY2tlZCkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoaGEtPmZ3X2R1bXAgIT0gTlVMTCkgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiRmlybXdhcmUgaGFzIGJlZW4gcHJldmlvdXNseSBkdW1wZWQgKCVwKSAtLSBpZ25vcmluZyAiCisJCSAgICAicmVxdWVzdC4uLlxuIiwgaGEtPmZ3X2R1bXApOworCQlnb3RvIHFsYTIxMDBfZndfZHVtcF9mYWlsZWQ7CisJfQorCisJLyogQWxsb2NhdGUgKGxhcmdlKSBkdW1wIGJ1ZmZlci4gKi8KKwloYS0+ZndfZHVtcF9vcmRlciA9IGdldF9vcmRlcihzaXplb2Yoc3RydWN0IHFsYTIxMDBfZndfZHVtcCkpOworCWhhLT5md19kdW1wID0gKHN0cnVjdCBxbGEyMTAwX2Z3X2R1bXAgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDLAorCSAgICBoYS0+ZndfZHVtcF9vcmRlcik7CisJaWYgKGhhLT5md19kdW1wID09IE5VTEwpIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZWQgbWVtb3J5IGZvciBmaXJtd2FyZSBkdW1wICglZC8lWmQpLlxuIiwKKwkJICAgIGhhLT5md19kdW1wX29yZGVyLCBzaXplb2Yoc3RydWN0IHFsYTIxMDBfZndfZHVtcCkpOworCQlnb3RvIHFsYTIxMDBfZndfZHVtcF9mYWlsZWQ7CisJfQorCWZ3ID0gaGEtPmZ3X2R1bXA7CisKKwlydmFsID0gUUxBX1NVQ0NFU1M7CisJZnctPmhjY3IgPSBSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsKKworCS8qIFBhdXNlIFJJU0MuICovCisJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfUEFVU0VfUklTQyk7IAorCWZvciAoY250ID0gMzAwMDA7IChSRF9SRUdfV09SRCgmcmVnLT5oY2NyKSAmIEhDQ1JfUklTQ19QQVVTRSkgPT0gMCAmJgorCSAgICBydmFsID09IFFMQV9TVUNDRVNTOyBjbnQtLSkgeworCQlpZiAoY250KQorCQkJdWRlbGF5KDEwMCk7CisJCWVsc2UKKwkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fVElNRU9VVDsKKwl9CisJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKHJlZyArIDApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+cGJpdV9yZWcpIC8gMjsgY250KyspIAorCQkJZnctPnBiaXVfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHgxMCk7CisJCWZvciAoY250ID0gMDsgY250IDwgaGEtPm1ieF9jb3VudDsgY250KyspIHsKKwkJCWlmIChjbnQgPT0gOCkgeworCQkJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHhlMCk7CisJCQl9CisJCQlmdy0+bWFpbGJveF9yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisJCX0KKworCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4MjApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+ZG1hX3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+ZG1hX3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMsIDB4MDApOworCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4QTApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+cmlzY19oZHdfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5yaXNjX2hkd19yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPnBjciwgMHgyMDAwKTsgCisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHg4MCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5yaXNjX2dwMF9yZWcpIC8gMjsgY250KyspIAorCQkJZnctPnJpc2NfZ3AwX3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+cGNyLCAweDIxMDApOyAKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDgwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPnJpc2NfZ3AxX3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+cmlzY19ncDFfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5wY3IsIDB4MjIwMCk7IAorCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4ODApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+cmlzY19ncDJfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5yaXNjX2dwMl9yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPnBjciwgMHgyMzAwKTsgCisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHg4MCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5yaXNjX2dwM19yZWcpIC8gMjsgY250KyspIAorCQkJZnctPnJpc2NfZ3AzX3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+cGNyLCAweDI0MDApOyAKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDgwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPnJpc2NfZ3A0X3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+cmlzY19ncDRfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5wY3IsIDB4MjUwMCk7IAorCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4ODApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+cmlzY19ncDVfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5yaXNjX2dwNV9yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPnBjciwgMHgyNjAwKTsgCisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHg4MCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5yaXNjX2dwNl9yZWcpIC8gMjsgY250KyspIAorCQkJZnctPnJpc2NfZ3A2X3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+cGNyLCAweDI3MDApOyAKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDgwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPnJpc2NfZ3A3X3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+cmlzY19ncDdfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5jdHJsX3N0YXR1cywgMHgxMCk7IAorCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4ODApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+ZnJhbWVfYnVmX2hkd19yZWcpIC8gMjsgY250KyspIAorCQkJZnctPmZyYW1lX2J1Zl9oZHdfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5jdHJsX3N0YXR1cywgMHgyMCk7IAorCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4ODApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+ZnBtX2IwX3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+ZnBtX2IwX3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMsIDB4MzApOyAKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDgwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPmZwbV9iMV9yZWcpIC8gMjsgY250KyspIAorCQkJZnctPmZwbV9iMV9yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJLyogUmVzZXQgdGhlIElTUC4gKi8KKwkJV1JUX1JFR19XT1JEKCZyZWctPmN0cmxfc3RhdHVzLCBDU1JfSVNQX1NPRlRfUkVTRVQpOworCX0KKworCWZvciAoY250ID0gMzAwMDA7IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDApICE9IDAgJiYKKwkgICAgcnZhbCA9PSBRTEFfU1VDQ0VTUzsgY250LS0pIHsKKwkJaWYgKGNudCkKKwkJCXVkZWxheSgxMDApOworCQllbHNlCisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX1RJTUVPVVQ7CisJfQorCisJLyogUGF1c2UgUklTQy4gKi8KKwlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUyAmJiAoSVNfUUxBMjIwMChoYSkgfHwgKElTX1FMQTIxMDAoaGEpICYmCisJICAgIChSRF9SRUdfV09SRCgmcmVnLT5tY3RyKSAmIChCSVRfMSB8IEJJVF8wKSkgIT0gMCkpKSB7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfUEFVU0VfUklTQyk7IAorCQlmb3IgKGNudCA9IDMwMDAwOworCQkgICAgKFJEX1JFR19XT1JEKCZyZWctPmhjY3IpICYgSENDUl9SSVNDX1BBVVNFKSA9PSAwICYmCisJCSAgICBydmFsID09IFFMQV9TVUNDRVNTOyBjbnQtLSkgeworCQkJaWYgKGNudCkKKwkJCQl1ZGVsYXkoMTAwKTsKKwkJCWVsc2UKKwkJCQlydmFsID0gUUxBX0ZVTkNUSU9OX1RJTUVPVVQ7CisJCX0KKwkJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKKwkJCS8qIFNldCBtZW1vcnkgY29uZmlndXJhdGlvbiBhbmQgdGltaW5nLiAqLworCQkJaWYgKElTX1FMQTIxMDAoaGEpKQorCQkJCVdSVF9SRUdfV09SRCgmcmVnLT5tY3RyLCAweGYxKTsKKwkJCWVsc2UKKwkJCQlXUlRfUkVHX1dPUkQoJnJlZy0+bWN0ciwgMHhmMik7CisJCQlSRF9SRUdfV09SRCgmcmVnLT5tY3RyKTsJLyogUENJIFBvc3RpbmcuICovCisKKwkJCS8qIFJlbGVhc2UgUklTQy4gKi8KKwkJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX1JFTEVBU0VfUklTQyk7CisJCX0KKwl9CisKKwlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgeworCQkvKiBHZXQgUklTQyBTUkFNLiAqLworCQlyaXNjX2FkZHJlc3MgPSAweDEwMDA7CisgCQlXUlRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMCwgTUJDX1JFQURfUkFNX1dPUkQpOworCQljbGVhcl9iaXQoTUJYX0lOVEVSUlVQVCwgJmhhLT5tYnhfY21kX2ZsYWdzKTsKKwl9CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPnJpc2NfcmFtKSAvIDIgJiYgcnZhbCA9PSBRTEFfU1VDQ0VTUzsKKwkgICAgY250KyssIHJpc2NfYWRkcmVzcysrKSB7CisgCQlXUlRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMSwgcmlzY19hZGRyZXNzKTsKKwkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfU0VUX0hPU1RfSU5UKTsKKworCQlmb3IgKHRpbWVyID0gNjAwMDAwMDsgdGltZXIgIT0gMDsgdGltZXItLSkgeworCQkJLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KKwkJCWlmIChSRF9SRUdfV09SRCgmcmVnLT5pc3RhdHVzKSAmIElTUl9SSVNDX0lOVCkgeworCQkJCWlmIChSRF9SRUdfV09SRCgmcmVnLT5zZW1hcGhvcmUpICYgQklUXzApIHsKKwkJCQkJc2V0X2JpdChNQlhfSU5URVJSVVBULAorCQkJCQkgICAgJmhhLT5tYnhfY21kX2ZsYWdzKTsKKworCQkJCQltYjAgPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAwKTsKKwkJCQkJbWIyID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMik7CisKKwkJCQkJV1JUX1JFR19XT1JEKCZyZWctPnNlbWFwaG9yZSwgMCk7CisJCQkJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLAorCQkJCQkgICAgSENDUl9DTFJfUklTQ19JTlQpOworCQkJCQlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX0NMUl9SSVNDX0lOVCk7CisJCQkJUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CisJCQl9CisJCQl1ZGVsYXkoNSk7CisJCX0KKworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE1CWF9JTlRFUlJVUFQsICZoYS0+bWJ4X2NtZF9mbGFncykpIHsKKwkJCXJ2YWwgPSBtYjAgJiBNQlNfTUFTSzsKKwkJCWZ3LT5yaXNjX3JhbVtjbnRdID0gbWIyOworCQl9IGVsc2UgeworCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCX0KKwl9CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiRmFpbGVkIHRvIGR1bXAgZmlybXdhcmUgKCV4KSEhIVxuIiwgcnZhbCk7CisKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyloYS0+ZndfZHVtcCwgaGEtPmZ3X2R1bXBfb3JkZXIpOworCQloYS0+ZndfZHVtcCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkgICAgIkZpcm13YXJlIGR1bXAgc2F2ZWQgdG8gdGVtcCBidWZmZXIgKCVsZC8lcCkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIGhhLT5md19kdW1wKTsKKwl9CisKK3FsYTIxMDBfZndfZHVtcF9mYWlsZWQ6CisJaWYgKCFoYXJkd2FyZV9sb2NrZWQpCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogcWxhMjEwMF9hc2NpaV9md19kdW1wKCkgLSBDb252ZXJ0cyBhIGJpbmFyeSBmaXJtd2FyZSBkdW1wIHRvIEFTQ0lJLgorICogQGhhOiBIQSBjb250ZXh0CisgKi8KK3ZvaWQKK3FsYTIxMDBfYXNjaWlfZndfZHVtcChzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCXVpbnQzMl90IGNudDsKKwljaGFyICp1aXRlcjsKKwljaGFyIGZ3X2luZm9bMzBdOworCXN0cnVjdCBxbGEyMTAwX2Z3X2R1bXAgKmZ3OworCisJdWl0ZXIgPSBoYS0+ZndfZHVtcF9idWZmZXI7CisJZncgPSBoYS0+ZndfZHVtcDsKKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIiVzIEZpcm13YXJlIFZlcnNpb24gJXNcbiIsIGhhLT5tb2RlbF9udW1iZXIsCisJICAgIHFsYTJ4MDBfZ2V0X2Z3X3ZlcnNpb25fc3RyKGhhLCBmd19pbmZvKSk7CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcbls9PT5CRUddXG4iKTsKKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIkhDQ1IgUmVnaXN0ZXI6XG4lMDR4XG5cbiIsIGZ3LT5oY2NyKTsKKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlBCSVUgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+cGJpdV9yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5wYml1X3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuTWFpbGJveCBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5tYWlsYm94X3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPm1haWxib3hfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5ETUEgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+ZG1hX3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPmRtYV9yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cblJJU0MgSGFyZHdhcmUgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+cmlzY19oZHdfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+cmlzY19oZHdfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5SSVNDIEdQMCBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5yaXNjX2dwMF9yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5yaXNjX2dwMF9yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cblJJU0MgR1AxIFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPnJpc2NfZ3AxX3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPnJpc2NfZ3AxX3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuUklTQyBHUDIgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+cmlzY19ncDJfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+cmlzY19ncDJfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5SSVNDIEdQMyBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5yaXNjX2dwM19yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5yaXNjX2dwM19yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cblJJU0MgR1A0IFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPnJpc2NfZ3A0X3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPnJpc2NfZ3A0X3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuUklTQyBHUDUgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+cmlzY19ncDVfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+cmlzY19ncDVfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5SSVNDIEdQNiBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5yaXNjX2dwNl9yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5yaXNjX2dwNl9yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cblJJU0MgR1A3IFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPnJpc2NfZ3A3X3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPnJpc2NfZ3A3X3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuRnJhbWUgQnVmZmVyIEhhcmR3YXJlIFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPmZyYW1lX2J1Zl9oZHdfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+ZnJhbWVfYnVmX2hkd19yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cbkZQTSBCMCBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5mcG1fYjBfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+ZnBtX2IwX3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuRlBNIEIxIFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPmZwbV9iMV9yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5mcG1fYjFfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5SSVNDIFNSQU06Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5yaXNjX3JhbSkgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiUwNHg6ICIsIGNudCArIDB4MTAwMCk7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+cmlzY19yYW1bY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cbls8PT1FTkRdIElTUCBEZWJ1ZyBEdW1wLiIpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50CitxbGFfdXByaW50ZihjaGFyICoqdWl0ZXIsIGNoYXIgKmZtdCwgLi4uKQoreworCWludAlpdGVyLCBsZW47CisJY2hhcglidWZbMTI4XTsKKwl2YV9saXN0CWFyZ3M7CisgCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlsZW4gPSB2c3ByaW50ZihidWYsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJZm9yIChpdGVyID0gMDsgaXRlciA8IGxlbjsgaXRlcisrLCAqdWl0ZXIgKz0gMSkKKwkJKnVpdGVyWzBdID0gYnVmW2l0ZXJdOworCisJcmV0dXJuIChsZW4pOworfQorCisvL0ZJWE1FCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVyIERlYnVnIEZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAKK3FsYTJ4MDBfZHVtcF9yZWdzKHNjc2lfcWxhX2hvc3RfdCAqaGEpIAoreworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCisJcHJpbnRrKCJNYWlsYm94IHJlZ2lzdGVyczpcbiIpOworCXByaW50aygic2NzaSglbGQpOiBtYm94IDAgMHglMDR4IFxuIiwKKwkgICAgaGEtPmhvc3Rfbm8sIFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDApKTsKKwlwcmludGsoInNjc2koJWxkKTogbWJveCAxIDB4JTA0eCBcbiIsCisJICAgIGhhLT5ob3N0X25vLCBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAxKSk7CisJcHJpbnRrKCJzY3NpKCVsZCk6IG1ib3ggMiAweCUwNHggXG4iLAorCSAgICBoYS0+aG9zdF9ubywgUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMikpOworCXByaW50aygic2NzaSglbGQpOiBtYm94IDMgMHglMDR4IFxuIiwKKwkgICAgaGEtPmhvc3Rfbm8sIFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDMpKTsKKwlwcmludGsoInNjc2koJWxkKTogbWJveCA0IDB4JTA0eCBcbiIsCisJICAgIGhhLT5ob3N0X25vLCBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCA0KSk7CisJcHJpbnRrKCJzY3NpKCVsZCk6IG1ib3ggNSAweCUwNHggXG4iLAorCSAgICBoYS0+aG9zdF9ubywgUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgNSkpOworfQorCisKK3ZvaWQKK3FsYTJ4MDBfZHVtcF9idWZmZXIodWludDhfdCAqIGIsIHVpbnQzMl90IHNpemUpIAoreworCXVpbnQzMl90IGNudDsKKwl1aW50OF90IGM7CisKKwlwcmludGsoIiAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAiCisJICAgICJBaCAgQmggIENoICBEaCAgRWggIEZoXG4iKTsKKwlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZTspIHsKKwkJYyA9ICpiKys7CisJCXByaW50aygiJTAyeCIsKHVpbnQzMl90KSBjKTsKKwkJY250Kys7CisJCWlmICghKGNudCAlIDE2KSkKKwkJCXByaW50aygiXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCIgICIpOworCX0KKwlpZiAoY250ICUgMTYpCisJCXByaW50aygiXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIHFsYTJ4MDBfcHJpbnRfc2NzaV9jbWQKKyAqCSBEdW1wcyBvdXQgaW5mbyBhYm91dCB0aGUgc2NzaSBjbWQgYW5kIHNyYi4KKyAqICAgSW5wdXQJIAorICoJIGNtZCA6IHN0cnVjdCBzY3NpX2NtbmQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK3FsYTJ4MDBfcHJpbnRfc2NzaV9jbWQoc3RydWN0IHNjc2lfY21uZCAqIGNtZCkgCit7CisJaW50IGk7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCXNyYl90ICpzcDsKKworCWhhID0gKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJc3AgPSAoc3JiX3QgKikgY21kLT5TQ3AucHRyOworCXByaW50aygiU0NTSSBDb21tYW5kIEA9MHglcCwgSGFuZGxlPTB4JXBcbiIsIGNtZCwgY21kLT5ob3N0X3NjcmliYmxlKTsKKwlwcmludGsoIiAgY2hhbj0weCUwMngsIHRhcmdldD0weCUwMngsIGx1bj0weCUwMngsIGNtZF9sZW49MHglMDJ4XG4iLAorCSAgICBjbWQtPmRldmljZS0+Y2hhbm5lbCwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLAorCSAgICBjbWQtPmNtZF9sZW4pOworCXByaW50aygiIENEQjogIik7CisJZm9yIChpID0gMDsgaSA8IGNtZC0+Y21kX2xlbjsgaSsrKSB7CisJCXByaW50aygiMHglMDJ4ICIsIGNtZC0+Y21uZFtpXSk7CisJfQorCXByaW50aygiXG4gIHNlZ19jbnQ9JWQsIGFsbG93ZWQ9JWQsIHJldHJpZXM9JWQsICIKKwkgICAgInNlcmlhbF9udW1iZXJfYXRfdGltZW91dD0weCVseFxuIiwKKwkgICAgY21kLT51c2Vfc2csIGNtZC0+YWxsb3dlZCwgY21kLT5yZXRyaWVzLAorCSAgICBjbWQtPnNlcmlhbF9udW1iZXJfYXRfdGltZW91dCk7CisJcHJpbnRrKCIgIHJlcXVlc3QgYnVmZmVyPTB4JXAsIHJlcXVlc3QgYnVmZmVyIGxlbj0weCV4XG4iLAorCSAgICBjbWQtPnJlcXVlc3RfYnVmZmVyLCBjbWQtPnJlcXVlc3RfYnVmZmxlbik7CisJcHJpbnRrKCIgIHRhZz0lZCwgdHJhbnNmZXJzaXplPTB4JXhcbiIsCisJICAgIGNtZC0+dGFnLCBjbWQtPnRyYW5zZmVyc2l6ZSk7CisJcHJpbnRrKCIgIHNlcmlhbF9udW1iZXI9JWx4LCBTUD0lcFxuIiwgY21kLT5zZXJpYWxfbnVtYmVyLCBzcCk7IAorCXByaW50aygiICBkYXRhIGRpcmVjdGlvbj0lZFxuIiwgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisKKwlpZiAoIXNwKQorCQlyZXR1cm47CisKKwlwcmludGsoIiAgc3AgZmxhZ3M9MHgleFxuIiwgc3AtPmZsYWdzKTsKKwlwcmludGsoIiAgcl9zdGFydD0weCVseCwgdV9zdGFydD0weCVseCwgZl9zdGFydD0weCVseCwgc3RhdGU9JWRcbiIsCisJICAgIHNwLT5yX3N0YXJ0LCBzcC0+dV9zdGFydCwgc3AtPmZfc3RhcnQsIHNwLT5zdGF0ZSk7CisKKwlwcmludGsoIiBlX3N0YXJ0PSAweCVseCwgZXh0X2hpc3Rvcnk9JWQsIGZvIHJldHJ5PSVkLCBsb29waWQ9JXgsICIKKwkgICAgInBvcnQgcGF0aD0lZFxuIiwgc3AtPmVfc3RhcnQsIHNwLT5leHRfaGlzdG9yeSwgc3AtPmZvX3JldHJ5X2NudCwKKwkgICAgc3AtPmx1bl9xdWV1ZS0+ZmNsdW4tPmZjcG9ydC0+bG9vcF9pZCwKKwkgICAgc3AtPmx1bl9xdWV1ZS0+ZmNsdW4tPmZjcG9ydC0+Y3VyX3BhdGgpOworfQorCisjaWYgZGVmaW5lZChRTF9ERUJVR19ST1VUSU5FUykKKy8qCisgKiBxbGEyeDAwX2Zvcm1hdHRlZF9kdW1wX2J1ZmZlcgorICogICAgICAgUHJpbnRzIHN0cmluZyBwbHVzIGJ1ZmZlci4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgIHN0cmluZyAgPSBOdWxsIHRlcm1pbmF0ZWQgc3RyaW5nIChubyBuZXdsaW5lIGF0IGVuZCkuCisgKiAgICAgICBidWZmZXIgID0gYnVmZmVyIGFkZHJlc3MuCisgKiAgICAgICB3ZF9zaXplID0gd29yZCBzaXplIDgsIDE2LCAzMiBvciA2NCBiaXRzCisgKiAgICAgICBjb3VudCAgID0gbnVtYmVyIG9mIHdvcmRzLgorICovCit2b2lkCitxbGEyeDAwX2Zvcm1hdHRlZF9kdW1wX2J1ZmZlcihjaGFyICpzdHJpbmcsIHVpbnQ4X3QgKiBidWZmZXIsIAorCQkJCXVpbnQ4X3Qgd2Rfc2l6ZSwgdWludDMyX3QgY291bnQpIAoreworCXVpbnQzMl90IGNudDsKKwl1aW50MTZfdCAqYnVmMTY7CisJdWludDMyX3QgKmJ1ZjMyOworCisJaWYgKHN0cmNtcChzdHJpbmcsICIiKSAhPSAwKQorCQlwcmludGsoIiVzXG4iLHN0cmluZyk7CisKKwlzd2l0Y2ggKHdkX3NpemUpIHsKKwkJY2FzZSA4OgorCQkJcHJpbnRrKCIgMCAgICAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgICIKKwkJCQkiOCAgICA5ICAgIEFoICAgQmggICBDaCAgIERoICAgRWggICBGaFxuIik7CisJCQlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCQkJCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKworCQkJZm9yIChjbnQgPSAxOyBjbnQgPD0gY291bnQ7IGNudCsrLCBidWZmZXIrKykgeworCQkJCXByaW50aygiJTAyeCIsKmJ1ZmZlcik7CisJCQkJaWYgKGNudCAlIDE2ID09IDApCisJCQkJCXByaW50aygiXG4iKTsKKwkJCQllbHNlCisJCQkJCXByaW50aygiICAiKTsKKwkJCX0KKwkJCWlmIChjbnQgJSAxNiAhPSAwKQorCQkJCXByaW50aygiXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJcHJpbnRrKCIgICAwICAgICAgMiAgICAgIDQgICAgICA2ICAgICAgOCAgICAgIEFoICIKKwkJCQkiCUNoICAgICBFaFxuIik7CisJCQlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCQkJCSItLS0tLS0tLS0tLS0tXG4iKTsKKworCQkJYnVmMTYgPSAodWludDE2X3QgKikgYnVmZmVyOworCQkJZm9yIChjbnQgPSAxOyBjbnQgPD0gY291bnQ7IGNudCsrLCBidWYxNisrKSB7CisJCQkJcHJpbnRrKCIlNHgiLCpidWYxNik7CisKKwkJCQlpZiAoY250ICUgOCA9PSAwKQorCQkJCQlwcmludGsoIlxuIik7CisJCQkJZWxzZSBpZiAoKmJ1ZjE2IDwgMTApCisJCQkJCXByaW50aygiICAgIik7CisJCQkJZWxzZQorCQkJCQlwcmludGsoIiAgIik7CisJCQl9CisJCQlpZiAoY250ICUgOCAhPSAwKQorCQkJCXByaW50aygiXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDMyOgorCQkJcHJpbnRrKCIgICAgICAgMCAgICAgICAgICA0ICAgICAgICAgIDggICAgICAgICAgQ2hcbiIpOworCQkJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisJCQlidWYzMiA9ICh1aW50MzJfdCAqKSBidWZmZXI7CisJCQlmb3IgKGNudCA9IDE7IGNudCA8PSBjb3VudDsgY250KyssIGJ1ZjMyKyspIHsKKwkJCQlwcmludGsoIiU4eCIsICpidWYzMik7CisKKwkJCQlpZiAoY250ICUgNCA9PSAwKQorCQkJCQlwcmludGsoIlxuIik7CisJCQkJZWxzZSBpZiAoKmJ1ZjMyIDwgMTApCisJCQkJCXByaW50aygiICAgIik7CisJCQkJZWxzZQorCQkJCQlwcmludGsoIiAgIik7CisJCQl9CisJCQlpZiAoY250ICUgNCAhPSAwKQorCQkJCXByaW50aygiXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmNTZjNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaApAQCAtMCwwICsxLDIzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyAqCisgKiBRTG9naWMgSVNQMngwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAyLjYueAorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUUxvZ2ljIENvcnBvcmF0aW9uCisgKiAod3d3LnFsb2dpYy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBEcml2ZXIgZGVidWcgZGVmaW5pdGlvbnMuCisgKi8KKy8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfMSAgKi8gLyogT3V0cHV0IHJlZ2lzdGVyIGFjY2Vzc2VzIHRvIENPTTEgKi8KKy8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfMiAgKi8gLyogT3V0cHV0IGVycm9yIG1zZ3MgdG8gQ09NMSAqLworLyogI2RlZmluZSBRTF9ERUJVR19MRVZFTF8zICAqLyAvKiBPdXRwdXQgZnVuY3Rpb24gdHJhY2UgbXNncyB0byBDT00xICovCisvKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzQgICovIC8qIE91dHB1dCBOVlJBTSB0cmFjZSBtc2dzIHRvIENPTTEgKi8KKy8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfNSAgKi8gLyogT3V0cHV0IHJpbmcgdHJhY2UgbXNncyB0byBDT00xICovCisvKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzYgICovIC8qIE91dHB1dCBXQVRDSERPRyB0aW1lciB0cmFjZSB0byBDT00xICovCisvKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzcgICovIC8qIE91dHB1dCBSSVNDIGxvYWQgdHJhY2UgbXNncyB0byBDT00xICovCisvKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzggICovIC8qIE91dHB1dCByaW5nIHNhdHVyYXRpb24gbXNncyB0byBDT00xICovCisvKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzkgICovIC8qIE91dHB1dCBJT0NUTCB0cmFjZSBtc2dzICovCisvKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzEwICovIC8qIE91dHB1dCBJT0NUTCBlcnJvciBtc2dzICovCisvKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzExICovIC8qIE91dHB1dCBNYnggQ21kIHRyYWNlIG1zZ3MgKi8KKy8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfMTIgKi8gLyogT3V0cHV0IElQIHRyYWNlIG1zZ3MgKi8KKy8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfMTMgKi8gLyogT3V0cHV0IGZkbWkgZnVuY3Rpb24gdHJhY2UgbXNncyAqLworLyogI2RlZmluZSBRTF9ERUJVR19MRVZFTF8xNCAqLyAvKiBPdXRwdXQgUlNDTiB0cmFjZSBtc2dzICovCisvKgorICogIExvY2FsIE1hY3JvIERlZmluaXRpb25zLgorICovCisjaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8xKSAgfHwgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8yKSB8fCBcCisgICAgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8zKSAgfHwgZGVmaW5lZChRTF9ERUJVR19MRVZFTF80KSB8fCBcCisgICAgZGVmaW5lZChRTF9ERUJVR19MRVZFTF81KSAgfHwgZGVmaW5lZChRTF9ERUJVR19MRVZFTF82KSB8fCBcCisgICAgZGVmaW5lZChRTF9ERUJVR19MRVZFTF83KSAgfHwgZGVmaW5lZChRTF9ERUJVR19MRVZFTF84KSB8fCBcCisgICAgZGVmaW5lZChRTF9ERUJVR19MRVZFTF85KSAgfHwgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8xMCkgfHwgXAorICAgIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMTEpIHx8IGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMTIpIHx8IFwKKyAgICBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzEzKSB8fCBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzE0KQorICAgICNkZWZpbmUgUUxfREVCVUdfUk9VVElORVMKKyNlbmRpZgorCisvKgorKiBNYWNyb3MgdXNlIGZvciBkZWJ1Z2dpbmcgdGhlIGRyaXZlci4KKyovCisjdW5kZWYgRU5URVJfVFJBQ0UKKyNpZiBkZWZpbmVkKEVOVEVSX1RSQUNFKQorI2RlZmluZSBFTlRFUih4KQlkbyB7IHByaW50aygicWxhMjEwMCA6IEVudGVyaW5nICVzKClcbiIsIHgpOyB9IHdoaWxlICgwKQorI2RlZmluZSBMRUFWRSh4KQlkbyB7IHByaW50aygicWxhMjEwMCA6IExlYXZpbmcgJXMoKVxuIiwgeCk7ICB9IHdoaWxlICgwKQorI2RlZmluZSBFTlRFUl9JTlRSKHgpCWRvIHsgcHJpbnRrKCJxbGEyMTAwIDogRW50ZXJpbmcgJXMoKVxuIiwgeCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIExFQVZFX0lOVFIoeCkJZG8geyBwcmludGsoInFsYTIxMDAgOiBMZWF2aW5nICVzKClcbiIsIHgpOyAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIEVOVEVSKHgpCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBMRUFWRSh4KQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgRU5URVJfSU5UUih4KSAJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIExFQVZFX0lOVFIoeCkgICBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgIERFQlVHX1FMQTIxMDAKKyNkZWZpbmUgREVCVUcoeCkJZG8ge3g7fSB3aGlsZSAoMCk7CisjZWxzZQorI2RlZmluZSBERUJVRyh4KQlkbyB7fSB3aGlsZSAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMSkKKyNkZWZpbmUgREVCVUcxKHgpCWRvIHt4O30gd2hpbGUgKDApOworI2Vsc2UKKyNkZWZpbmUgREVCVUcxKHgpCWRvIHt9IHdoaWxlICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8yKQorI2RlZmluZSBERUJVRzIoeCkgICAgICAgZG8ge3g7fSB3aGlsZSAoMCk7CisjZGVmaW5lIERFQlVHMl8zKHgpICAgICBkbyB7eDt9IHdoaWxlICgwKTsKKyNkZWZpbmUgREVCVUcyXzNfMTEoeCkgIGRvIHt4O30gd2hpbGUgKDApOworI2RlZmluZSBERUJVRzJfOV8xMCh4KSAgICBkbyB7eDt9IHdoaWxlICgwKTsKKyNkZWZpbmUgREVCVUcyXzExKHgpICAgIGRvIHt4O30gd2hpbGUgKDApOworI2Vsc2UKKyNkZWZpbmUgREVCVUcyKHgpCWRvIHt9IHdoaWxlICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8zKQorI2RlZmluZSBERUJVRzMoeCkJZG8ge3g7fSB3aGlsZSAoMCk7CisjZGVmaW5lIERFQlVHMl8zKHgpCWRvIHt4O30gd2hpbGUgKDApOworI2RlZmluZSBERUJVRzJfM18xMSh4KQlkbyB7eDt9IHdoaWxlICgwKTsKKyNkZWZpbmUgREVCVUczXzExKHgpCWRvIHt4O30gd2hpbGUgKDApOworI2Vsc2UKKyNkZWZpbmUgREVCVUczKHgpCWRvIHt9IHdoaWxlICgwKTsKKyAgI2lmICFkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzIpCisgICNkZWZpbmUgREVCVUcyXzMoeCkJZG8ge30gd2hpbGUgKDApOworICAjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF80KQorI2RlZmluZSBERUJVRzQoeCkJZG8ge3g7fSB3aGlsZSAoMCk7CisjZWxzZQorI2RlZmluZSBERUJVRzQoeCkJZG8ge30gd2hpbGUgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzUpCisjZGVmaW5lIERFQlVHNSh4KSAgICAgICAgICBkbyB7eDt9IHdoaWxlICgwKTsKKyNlbHNlCisjZGVmaW5lIERFQlVHNSh4KQlkbyB7fSB3aGlsZSAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfNykKKyNkZWZpbmUgREVCVUc3KHgpICAgICAgICAgIGRvIHt4O30gd2hpbGUgKDApOworI2Vsc2UKKyNkZWZpbmUgREVCVUc3KHgpCSAgIGRvIHt9IHdoaWxlICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF85KQorI2RlZmluZSBERUJVRzkoeCkgICAgICAgZG8ge3g7fSB3aGlsZSAoMCk7CisjZGVmaW5lIERFQlVHOV8xMCh4KSAgICBkbyB7eDt9IHdoaWxlICgwKTsKKyNkZWZpbmUgREVCVUcyXzlfMTAoeCkJZG8ge3g7fSB3aGlsZSAoMCk7CisjZWxzZQorI2RlZmluZSBERUJVRzkoeCkJZG8ge30gd2hpbGUgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzEwKQorI2RlZmluZSBERUJVRzEwKHgpICAgICAgZG8ge3g7fSB3aGlsZSAoMCk7CisjZGVmaW5lIERFQlVHMl85XzEwKHgpCWRvIHt4O30gd2hpbGUgKDApOworI2RlZmluZSBERUJVRzlfMTAoeCkJZG8ge3g7fSB3aGlsZSAoMCk7CisjZWxzZQorI2RlZmluZSBERUJVRzEwKHgpCWRvIHt9IHdoaWxlICgwKTsKKyAgI2lmICFkZWZpbmVkKERFQlVHMl85XzEwKQorICAjZGVmaW5lIERFQlVHMl85XzEwKHgpCWRvIHt9IHdoaWxlICgwKTsKKyAgI2VuZGlmCisgICNpZiAhZGVmaW5lZChERUJVRzlfMTApCisgICNkZWZpbmUgREVCVUc5XzEwKHgpCWRvIHt9IHdoaWxlICgwKTsKKyAgI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMTEpCisjZGVmaW5lIERFQlVHMTEoeCkgICAgICBkb3t4O30gd2hpbGUoMCk7CisjaWYgIWRlZmluZWQoREVCVUcyXzExKQorI2RlZmluZSBERUJVRzJfMTEoeCkgICAgZG97eDt9IHdoaWxlKDApOworI2VuZGlmCisjaWYgIWRlZmluZWQoREVCVUcyXzNfMTEpCisjZGVmaW5lIERFQlVHMl8zXzExKHgpICBkb3t4O30gd2hpbGUoMCk7CisjZW5kaWYKKyNpZiAhZGVmaW5lZChERUJVRzNfMTEpCisjZGVmaW5lIERFQlVHM18xMSh4KSAgICBkb3t4O30gd2hpbGUoMCk7CisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIERFQlVHMTEoeCkJZG97fSB3aGlsZSgwKTsKKyAgI2lmICFkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzIpCisgICNkZWZpbmUgREVCVUcyXzExKHgpCWRve30gd2hpbGUoMCk7CisgICAgI2lmICFkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzMpCisgICAgI2RlZmluZSBERUJVRzJfM18xMSh4KSBkb3t9IHdoaWxlKDApOworICAgICNlbmRpZgorICAjZW5kaWYKKyAgI2lmICFkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzMpCisgICNkZWZpbmUgREVCVUczXzExKHgpCWRve30gd2hpbGUoMCk7CisgICNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzEyKQorI2RlZmluZSBERUJVRzEyKHgpICAgICAgZG8ge3g7fSB3aGlsZSAoMCk7CisjZWxzZQorI2RlZmluZSBERUJVRzEyKHgpCWRvIHt9IHdoaWxlICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8xMykKKyNkZWZpbmUgREVCVUcxMyh4KSAgICAgIGRvIHt4O30gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBERUJVRzEzKHgpCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzE0KQorI2RlZmluZSBERUJVRzE0KHgpICAgICAgZG8ge3g7fSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIERFQlVHMTQoeCkJZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworLyoKKyAqIEZpcm13YXJlIER1bXAgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqLworI2RlZmluZSBGV19EVU1QX1NJWkVfMTI4SwkweEJDMDAwCisjZGVmaW5lIEZXX0RVTVBfU0laRV81MTJLCTB4MkZDMDAwCisjZGVmaW5lIEZXX0RVTVBfU0laRV8xTQkJMHg1RkMwMDAKKworc3RydWN0IHFsYTIzMDBfZndfZHVtcCB7CisJdWludDE2X3QgaGNjcjsKKwl1aW50MTZfdCBwYml1X3JlZ1s4XTsKKwl1aW50MTZfdCByaXNjX2hvc3RfcmVnWzhdOworCXVpbnQxNl90IG1haWxib3hfcmVnWzMyXTsKKwl1aW50MTZfdCByZXNwX2RtYV9yZWdbMzJdOworCXVpbnQxNl90IGRtYV9yZWdbNDhdOworCXVpbnQxNl90IHJpc2NfaGR3X3JlZ1sxNl07CisJdWludDE2X3QgcmlzY19ncDBfcmVnWzE2XTsKKwl1aW50MTZfdCByaXNjX2dwMV9yZWdbMTZdOworCXVpbnQxNl90IHJpc2NfZ3AyX3JlZ1sxNl07CisJdWludDE2X3QgcmlzY19ncDNfcmVnWzE2XTsKKwl1aW50MTZfdCByaXNjX2dwNF9yZWdbMTZdOworCXVpbnQxNl90IHJpc2NfZ3A1X3JlZ1sxNl07CisJdWludDE2X3QgcmlzY19ncDZfcmVnWzE2XTsKKwl1aW50MTZfdCByaXNjX2dwN19yZWdbMTZdOworCXVpbnQxNl90IGZyYW1lX2J1Zl9oZHdfcmVnWzY0XTsKKwl1aW50MTZfdCBmcG1fYjBfcmVnWzY0XTsKKwl1aW50MTZfdCBmcG1fYjFfcmVnWzY0XTsKKwl1aW50MTZfdCByaXNjX3JhbVsweGY4MDBdOworCXVpbnQxNl90IHN0YWNrX3JhbVsweDEwMDBdOworCXVpbnQxNl90IGRhdGFfcmFtWzFdOworfTsKKworc3RydWN0IHFsYTIxMDBfZndfZHVtcCB7CisJdWludDE2X3QgaGNjcjsKKwl1aW50MTZfdCBwYml1X3JlZ1s4XTsKKwl1aW50MTZfdCBtYWlsYm94X3JlZ1szMl07CisJdWludDE2X3QgZG1hX3JlZ1s0OF07CisJdWludDE2X3QgcmlzY19oZHdfcmVnWzE2XTsKKwl1aW50MTZfdCByaXNjX2dwMF9yZWdbMTZdOworCXVpbnQxNl90IHJpc2NfZ3AxX3JlZ1sxNl07CisJdWludDE2X3QgcmlzY19ncDJfcmVnWzE2XTsKKwl1aW50MTZfdCByaXNjX2dwM19yZWdbMTZdOworCXVpbnQxNl90IHJpc2NfZ3A0X3JlZ1sxNl07CisJdWludDE2X3QgcmlzY19ncDVfcmVnWzE2XTsKKwl1aW50MTZfdCByaXNjX2dwNl9yZWdbMTZdOworCXVpbnQxNl90IHJpc2NfZ3A3X3JlZ1sxNl07CisJdWludDE2X3QgZnJhbWVfYnVmX2hkd19yZWdbMTZdOworCXVpbnQxNl90IGZwbV9iMF9yZWdbNjRdOworCXVpbnQxNl90IGZwbV9iMV9yZWdbNjRdOworCXVpbnQxNl90IHJpc2NfcmFtWzB4ZjAwMF07Cit9OworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmFlMDMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCkBAIC0wLDAgKzEsMjQ5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgUUxPR0lDIExJTlVYIFNPRlRXQVJFCisqCisqIFFMb2dpYyBJU1AyeDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFFMb2dpYyBDb3Jwb3JhdGlvbgorKiAod3d3LnFsb2dpYy5jb20pCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisqIGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fUUxBX0RFRl9ICisjZGVmaW5lIF9fUUxBX0RFRl9ICisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CisjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisKKy8qIFhYWChoY2gpOiBtb3ZlIHRvIHBjaV9pZHMuaCAqLworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMzAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIzMDAJMHgyMzAwCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMzEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIzMTIJMHgyMzEyCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMzIyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIzMjIJMHgyMzIyCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A2MzEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDYzMTIJMHg2MzEyCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A2MzIyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDYzMjIJMHg2MzIyCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NDU0lfUUxBMjFYWCkgfHwgZGVmaW5lZChDT05GSUdfU0NTSV9RTEEyMVhYX01PRFVMRSkKKyNkZWZpbmUgSVNfUUxBMjEwMChoYSkJKChoYSktPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMTAwKQorI2Vsc2UKKyNkZWZpbmUgSVNfUUxBMjEwMChoYSkJMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TQ1NJX1FMQTIyWFgpIHx8IGRlZmluZWQoQ09ORklHX1NDU0lfUUxBMjJYWF9NT0RVTEUpCisjZGVmaW5lIElTX1FMQTIyMDAoaGEpCSgoaGEpLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjIwMCkKKyNlbHNlCisjZGVmaW5lIElTX1FMQTIyMDAoaGEpCTAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0NTSV9RTEEyMzAwKSB8fCBkZWZpbmVkKENPTkZJR19TQ1NJX1FMQTIzMDBfTU9EVUxFKQorI2RlZmluZSBJU19RTEEyMzAwKGhhKQkoKGhhKS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIzMDApCisjZGVmaW5lIElTX1FMQTIzMTIoaGEpCSgoaGEpLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjMxMikKKyNlbHNlCisjZGVmaW5lIElTX1FMQTIzMDAoaGEpCTAKKyNkZWZpbmUgSVNfUUxBMjMxMihoYSkJMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TQ1NJX1FMQTIzMjIpIHx8IGRlZmluZWQoQ09ORklHX1NDU0lfUUxBMjMyMl9NT0RVTEUpCisjZGVmaW5lIElTX1FMQTIzMjIoaGEpCSgoaGEpLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjMyMikKKyNlbHNlCisjZGVmaW5lIElTX1FMQTIzMjIoaGEpCTAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0NTSV9RTEE2MzEyKSB8fCBkZWZpbmVkKENPTkZJR19TQ1NJX1FMQTYzMTJfTU9EVUxFKQorI2RlZmluZSBJU19RTEE2MzEyKGhhKQkoKGhhKS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDYzMTIpCisjZGVmaW5lIElTX1FMQTYzMjIoaGEpCSgoaGEpLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQNjMyMikKKyNlbHNlCisjZGVmaW5lIElTX1FMQTYzMTIoaGEpCTAKKyNkZWZpbmUgSVNfUUxBNjMyMihoYSkJMAorI2VuZGlmCisKKyNkZWZpbmUgSVNfUUxBMjNYWChoYSkJKElTX1FMQTIzMDAoaGEpIHx8IElTX1FMQTIzMTIoaGEpIHx8IElTX1FMQTIzMjIoaGEpIHx8IFwKKyAgICAJCQkgSVNfUUxBNjMxMihoYSkgfHwgSVNfUUxBNjMyMihoYSkpCisKKy8qCisgKiBPbmx5IG5vbi1JU1AyWzEyXTAwIGhhdmUgZXh0ZW5kZWQgYWRkcmVzc2luZyBzdXBwb3J0IGluIHRoZSBmaXJtd2FyZS4KKyAqLworI2RlZmluZSBIQVNfRVhURU5ERURfSURTKGhhKQkoIUlTX1FMQTIxMDAoaGEpICYmICFJU19RTEEyMjAwKGhhKSkKKworLyoKKyAqIFdlIGhhdmUgTUFJTEJPWF9SRUdJU1RFUl9DT1VOVCBzaXplZCBhcnJheXMgaW4gYSBmZXcgcGxhY2VzLAorICogYnV0IHRoYXQncyBmaW5lIGFzIHdlIGRvbid0IGxvb2sgYXQgdGhlIGxhc3QgMjQgb25lcyBmb3IKKyAqIElTUDIxMDAgSEJBcy4KKyAqLworI2RlZmluZSBNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXzIxMDAJOAorI2RlZmluZSBNQUlMQk9YX1JFR0lTVEVSX0NPVU5UCQkzMgorCisjZGVmaW5lIFFMQTIyMDBBX1JJU0NfUk9NX1ZFUgk0CisjZGVmaW5lIEZQTV8yMzAwCQk2CisjZGVmaW5lIEZQTV8yMzEwCQk3CisKKyNpbmNsdWRlICJxbGFfc2V0dGluZ3MuaCIKKworLyogCisgKiBEYXRhIGJpdCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIEJJVF8wCTB4MQorI2RlZmluZSBCSVRfMQkweDIKKyNkZWZpbmUgQklUXzIJMHg0CisjZGVmaW5lIEJJVF8zCTB4OAorI2RlZmluZSBCSVRfNAkweDEwCisjZGVmaW5lIEJJVF81CTB4MjAKKyNkZWZpbmUgQklUXzYJMHg0MAorI2RlZmluZSBCSVRfNwkweDgwCisjZGVmaW5lIEJJVF84CTB4MTAwCisjZGVmaW5lIEJJVF85CTB4MjAwCisjZGVmaW5lIEJJVF8xMAkweDQwMAorI2RlZmluZSBCSVRfMTEJMHg4MDAKKyNkZWZpbmUgQklUXzEyCTB4MTAwMAorI2RlZmluZSBCSVRfMTMJMHgyMDAwCisjZGVmaW5lIEJJVF8xNAkweDQwMDAKKyNkZWZpbmUgQklUXzE1CTB4ODAwMAorI2RlZmluZSBCSVRfMTYJMHgxMDAwMAorI2RlZmluZSBCSVRfMTcJMHgyMDAwMAorI2RlZmluZSBCSVRfMTgJMHg0MDAwMAorI2RlZmluZSBCSVRfMTkJMHg4MDAwMAorI2RlZmluZSBCSVRfMjAJMHgxMDAwMDAKKyNkZWZpbmUgQklUXzIxCTB4MjAwMDAwCisjZGVmaW5lIEJJVF8yMgkweDQwMDAwMAorI2RlZmluZSBCSVRfMjMJMHg4MDAwMDAKKyNkZWZpbmUgQklUXzI0CTB4MTAwMDAwMAorI2RlZmluZSBCSVRfMjUJMHgyMDAwMDAwCisjZGVmaW5lIEJJVF8yNgkweDQwMDAwMDAKKyNkZWZpbmUgQklUXzI3CTB4ODAwMDAwMAorI2RlZmluZSBCSVRfMjgJMHgxMDAwMDAwMAorI2RlZmluZSBCSVRfMjkJMHgyMDAwMDAwMAorI2RlZmluZSBCSVRfMzAJMHg0MDAwMDAwMAorI2RlZmluZSBCSVRfMzEJMHg4MDAwMDAwMAorCisjZGVmaW5lIExTQih4KQkoKHVpbnQ4X3QpKHgpKQorI2RlZmluZSBNU0IoeCkJKCh1aW50OF90KSgodWludDE2X3QpKHgpID4+IDgpKQorCisjZGVmaW5lIExTVyh4KQkoKHVpbnQxNl90KSh4KSkKKyNkZWZpbmUgTVNXKHgpCSgodWludDE2X3QpKCh1aW50MzJfdCkoeCkgPj4gMTYpKQorCisjZGVmaW5lIExTRCh4KQkoKHVpbnQzMl90KSgodWludDY0X3QpKHgpKSkKKyNkZWZpbmUgTVNEKHgpCSgodWludDMyX3QpKCgoKHVpbnQ2NF90KSh4KSkgPj4gMTYpID4+IDE2KSkKKworCisvKgorICogSS9PIHJlZ2lzdGVyCisqLworCisjZGVmaW5lIFJEX1JFR19CWVRFKGFkZHIpCQlyZWFkYihhZGRyKQorI2RlZmluZSBSRF9SRUdfV09SRChhZGRyKQkJcmVhZHcoYWRkcikKKyNkZWZpbmUgUkRfUkVHX0RXT1JEKGFkZHIpCQlyZWFkbChhZGRyKQorI2RlZmluZSBSRF9SRUdfQllURV9SRUxBWEVEKGFkZHIpCXJlYWRiX3JlbGF4ZWQoYWRkcikKKyNkZWZpbmUgUkRfUkVHX1dPUkRfUkVMQVhFRChhZGRyKQlyZWFkd19yZWxheGVkKGFkZHIpCisjZGVmaW5lIFJEX1JFR19EV09SRF9SRUxBWEVEKGFkZHIpCXJlYWRsX3JlbGF4ZWQoYWRkcikKKyNkZWZpbmUgV1JUX1JFR19CWVRFKGFkZHIsIGRhdGEpCXdyaXRlYihkYXRhLGFkZHIpCisjZGVmaW5lIFdSVF9SRUdfV09SRChhZGRyLCBkYXRhKQl3cml0ZXcoZGF0YSxhZGRyKQorI2RlZmluZSBXUlRfUkVHX0RXT1JEKGFkZHIsIGRhdGEpCXdyaXRlbChkYXRhLGFkZHIpCisKKy8qCisgKiBGaWJyZSBDaGFubmVsIGRldmljZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBXV05fU0laRQkJOAkvKiBTaXplIG9mIFdXUE4sIFdXTiAmIFdXTk4gKi8KKyNkZWZpbmUgTUFYX0ZJQlJFX0RFVklDRVMJNTEyCisjZGVmaW5lIE1BWF9GSUJSRV9MVU5TICAJMjU2CisjZGVmaW5lCU1BWF9SU0NOX0NPVU5UCQkzMgorI2RlZmluZQlNQVhfSE9TVF9DT1VOVAkJMTYKKworLyoKKyAqIEhvc3QgYWRhcHRlciBkZWZhdWx0IGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIE1BWF9CVVNFUwkJMSAgLyogV2Ugb25seSBoYXZlIG9uZSBidXMgdG9kYXkgKi8KKyNkZWZpbmUgTUFYX1RBUkdFVFNfMjEwMAlNQVhfRklCUkVfREVWSUNFUworI2RlZmluZSBNQVhfVEFSR0VUU18yMjAwCU1BWF9GSUJSRV9ERVZJQ0VTCisjZGVmaW5lIE1BWF9UQVJHRVRTCQlNQVhfRklCUkVfREVWSUNFUworI2RlZmluZSBNSU5fTFVOUwkJOAorI2RlZmluZSBNQVhfTFVOUwkJTUFYX0ZJQlJFX0xVTlMKKyNkZWZpbmUgTUFYX0NNRFNfUEVSX0xVTgkyNTUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qCisgKiBGaWJyZSBDaGFubmVsIGRldmljZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBTTlNfTEFTVF9MT09QX0lEXzIxMDAJMHhmZQorI2RlZmluZSBTTlNfTEFTVF9MT09QX0lEXzIzMDAJMHg3ZmYKKworI2RlZmluZSBMQVNUX0xPQ0FMX0xPT1BfSUQJMHg3ZAorI2RlZmluZSBTTlNfRkxfUE9SVAkJMHg3ZQorI2RlZmluZSBGQUJSSUNfQ09OVFJPTExFUgkweDdmCisjZGVmaW5lIFNJTVBMRV9OQU1FX1NFUlZFUgkweDgwCisjZGVmaW5lIFNOU19GSVJTVF9MT09QX0lECTB4ODEKKyNkZWZpbmUgTUFOQUdFTUVOVF9TRVJWRVIJMHhmZQorI2RlZmluZSBCUk9BRENBU1QJCTB4ZmYKKworI2RlZmluZSBSRVNFUlZFRF9MT09QX0lEKHgpCSgoeCA+IExBU1RfTE9DQUxfTE9PUF9JRCAmJiBcCisJCQkJIHggPCBTTlNfRklSU1RfTE9PUF9JRCkgfHwgXAorCQkJCSB4ID09IE1BTkFHRU1FTlRfU0VSVkVSIHx8IFwKKwkJCQkgeCA9PSBCUk9BRENBU1QpCisKKy8qCisgKiBUaW1lb3V0IHRpbWVyIGNvdW50cyBpbiBzZWNvbmRzCisgKi8KKyNkZWZpbmUgUE9SVF9SRVRSWV9USU1FCQkJMgorI2RlZmluZSBMT09QX0RPV05fVElNRU9VVAkJNjAKKyNkZWZpbmUgTE9PUF9ET1dOX1RJTUUJCQkyNTUJLyogMjQwICovCisjZGVmaW5lCUxPT1BfRE9XTl9SRVNFVAkJCShMT09QX0RPV05fVElNRSAtIDMwKQorCisvKiBNYXhpbXVtIG91dHN0YW5kaW5nIGNvbW1hbmRzIGluIElTUCBxdWV1ZXMgKDEtNjU1MzUpICovCisjZGVmaW5lIE1BWF9PVVRTVEFORElOR19DT01NQU5EUwkxMDI0CisKKy8qIElTUCByZXF1ZXN0IGFuZCByZXNwb25zZSBlbnRyeSBjb3VudHMgKDM3LTY1NTM1KSAqLworI2RlZmluZSBSRVFVRVNUX0VOVFJZX0NOVF8yMTAwCQkxMjgJLyogTnVtYmVyIG9mIHJlcXVlc3QgZW50cmllcy4gKi8KKyNkZWZpbmUgUkVRVUVTVF9FTlRSWV9DTlRfMjIwMAkJMjA0OAkvKiBOdW1iZXIgb2YgcmVxdWVzdCBlbnRyaWVzLiAqLworI2RlZmluZSBSRVFVRVNUX0VOVFJZX0NOVF8yWFhYX0VYVF9NRU0JNDA5NgkvKiBOdW1iZXIgb2YgcmVxdWVzdCBlbnRyaWVzLiAqLworI2RlZmluZSBSRVNQT05TRV9FTlRSWV9DTlRfMjEwMAkJNjQJLyogTnVtYmVyIG9mIHJlc3BvbnNlIGVudHJpZXMuKi8KKyNkZWZpbmUgUkVTUE9OU0VfRU5UUllfQ05UXzIzMDAJCTUxMgkvKiBOdW1iZXIgb2YgcmVzcG9uc2UgZW50cmllcy4qLworCisvKgorICogU0NTSSBSZXF1ZXN0IEJsb2NrIAorICovCit0eXBlZGVmIHN0cnVjdCBzcmIgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsJLyogSEEgdGhlIFNQIGlzIHF1ZXVlZCBvbiAqLworCisJc3RydWN0IHNjc2lfY21uZCAqY21kOwkJLyogTGludXggU0NTSSBjb21tYW5kIHBrdCAqLworCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CS8qIENvbW1hbmQgdGltZXIgKi8KKwlhdG9taWNfdCByZWZfY291bnQ7CS8qIFJlZmVyZW5jZSBjb3VudCBmb3IgdGhpcyBzdHJ1Y3R1cmUgKi8JCQkKKwl1aW50MTZfdCBmbGFnczsKKworCS8qIFJlcXVlc3Qgc3RhdGUgKi8KKwl1aW50MTZfdCBzdGF0ZTsKKworCS8qIFRhcmdldC9MVU4gcXVldWUgcG9pbnRlcnMuICovCisJc3RydWN0IG9zX3RndCAqdGd0X3F1ZXVlOwkvKiBwdHIgdG8gdmlzaWJsZSBoYSdzIHRhcmdldCAqLworCXN0cnVjdCBvc19sdW4gKmx1bl9xdWV1ZTsJLyogcHRyIHRvIHZpc2libGUgaGEncyBsdW4gKi8KKwlzdHJ1Y3QgZmNfbHVuICpmY2x1bjsJCS8qIEZDIExVTiBjb250ZXh0IHBvaW50ZXIuICovCisKKwkvKiBUaW1pbmcgY291bnRzLiAqLworCXVuc2lnbmVkIGxvbmcgZV9zdGFydDsJCS8qIFN0YXJ0IG9mIGV4dGVuZCB0aW1lb3V0ICovCisJdW5zaWduZWQgbG9uZyByX3N0YXJ0OwkJLyogU3RhcnQgb2YgcmVxdWVzdCAqLworCXVuc2lnbmVkIGxvbmcgdV9zdGFydDsJCS8qIFdoZW4gc2VudCB0byBSSVNDICovCisJdW5zaWduZWQgbG9uZyBmX3N0YXJ0OwkJLyogV2hlbiBwbGFjZWQgaW4gRk8gcXVldWUqLworCisJLyogU2luZ2xlIHRyYW5zZmVyIERNQSBjb250ZXh0ICovCisJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOworCisJdWludDMyX3QgcmVxdWVzdF9zZW5zZV9sZW5ndGg7CisJdWludDhfdCAqcmVxdWVzdF9zZW5zZV9wdHI7CisKKwlpbnQgZXh0X2hpc3Rvcnk7CisKKwkvKiBTdXNwZW5kIGRlbGF5ICovCisJaW50IGRlbGF5OworCisJLyogUmF3IGNvbXBsZXRpb24gaW5mbyBmb3IgdXNlIGJ5IGZhaWxvdmVyID8gKi8KKwl1aW50OF90CWZvX3JldHJ5X2NudDsJCS8qIFJldHJ5IGNvdW50IHRoaXMgcmVxdWVzdCAqLworCXVpbnQ4X3QJZXJyX2lkOwkJCS8qIGVycm9yIGlkICovCisjZGVmaW5lIFNSQl9FUlJfUE9SVAkxCQkvKiBSZXF1ZXN0IGZhaWxlZCAtLSAicG9ydCBkb3duIiAqLworI2RlZmluZSBTUkJfRVJSX0xPT1AJMgkJLyogUmVxdWVzdCBmYWlsZWQgLS0gImxvb3AgZG93biIgKi8KKyNkZWZpbmUgU1JCX0VSUl9ERVZJQ0UJMwkJLyogUmVxdWVzdCBmYWlsZWQgLS0gImRldmljZSBlcnJvciIgKi8KKyNkZWZpbmUgU1JCX0VSUl9PVEhFUgk0CisKKwkvKiBTUkIgbWFnaWMgbnVtYmVyICovCisJdWludDE2X3QgbWFnaWM7CisjZGVmaW5lIFNSQl9NQUdJQyAgICAgICAweDEwQ0IKK30gc3JiX3Q7CisKKy8qCisgKiBTUkIgZmxhZyBkZWZpbml0aW9ucworICovCisjZGVmaW5lIFNSQl9USU1FT1VUCQlCSVRfMAkvKiBDb21tYW5kIHRpbWVkIG91dCAqLworI2RlZmluZSBTUkJfRE1BX1ZBTElECQlCSVRfMQkvKiBDb21tYW5kIHNlbnQgdG8gSVNQICovCisjZGVmaW5lIFNSQl9XQVRDSERPRwkJQklUXzIJLyogQ29tbWFuZCBvbiB3YXRjaGRvZyBsaXN0ICovCisjZGVmaW5lIFNSQl9BQk9SVF9QRU5ESU5HCUJJVF8zCS8qIENvbW1hbmQgYWJvcnQgc2VudCB0byBkZXZpY2UgKi8KKworI2RlZmluZSBTUkJfQUJPUlRFRAkJQklUXzQJLyogQ29tbWFuZCBhYm9ydGVkIGNvbW1hbmQgYWxyZWFkeSAqLworI2RlZmluZSBTUkJfUkVUUlkJCUJJVF81CS8qIENvbW1hbmQgbmVlZHMgcmV0cnlpbmcgKi8KKyNkZWZpbmUgU1JCX0dPVF9TRU5TRQkJQklUXzYJLyogQ29tbWFuZCBoYXMgc2Vuc2UgZGF0YSAqLworI2RlZmluZSBTUkJfRkFJTE9WRVIJCUJJVF83CS8qIENvbW1hbmQgaW4gZmFpbG92ZXIgc3RhdGUgKi8KKworI2RlZmluZSBTUkJfQlVTWQkJQklUXzgJLyogQ29tbWFuZCBpcyBpbiBidXN5IHJldHJ5IHN0YXRlICovCisjZGVmaW5lIFNSQl9GT19DQU5DRUwJCUJJVF85CS8qIENvbW1hbmQgZG9uJ3QgbmVlZCB0byBkbyBmYWlsb3ZlciAqLworI2RlZmluZSBTUkJfSU9DVEwJCUJJVF8xMAkvKiBJT0NUTCBjb21tYW5kLiAqLworI2RlZmluZSBTUkJfVEFQRQkJQklUXzExCS8qIEZDUDIgKFRhcGUpIGNvbW1hbmQuICovCisKKy8qCisgKiBTUkIgc3RhdGUgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBTUkJfRlJFRV9TVEFURQkJMAkvKiAgIHJldHVybmVkIGJhY2sgKi8KKyNkZWZpbmUgU1JCX1BFTkRJTkdfU1RBVEUJMQkvKiAgIHF1ZXVlZCBpbiBMVU4gUSAqLworI2RlZmluZSBTUkJfQUNUSVZFX1NUQVRFCTIJLyogICBpbiBBY3RpdmUgQXJyYXkgKi8KKyNkZWZpbmUgU1JCX0RPTkVfU1RBVEUJCTMJLyogICBxdWV1ZWQgaW4gRG9uZSBRdWV1ZSAqLworI2RlZmluZSBTUkJfUkVUUllfU1RBVEUJCTQJLyogICBpbiBSZXRyeSBRdWV1ZSAqLworI2RlZmluZSBTUkJfU1VTUEVOREVEX1NUQVRFCTUJLyogICBpbiBzdXNwZW5kZWQgc3RhdGUgKi8KKyNkZWZpbmUgU1JCX05PX1FVRVVFX1NUQVRFCTYJLyogICBpcyBpbiBiZXR3ZWVuIHN0YXRlcyAqLworI2RlZmluZSBTUkJfQUNUSVZFX1RJTUVPVVRfU1RBVEUgNwkvKiAgIGluIEFjdGl2ZSBBcnJheSBidXQgdGltZWQgb3V0ICovCisjZGVmaW5lIFNSQl9GQUlMT1ZFUl9TVEFURQk4CS8qICAgaW4gRmFpbG92ZXIgUXVldWUgKi8KKyNkZWZpbmUgU1JCX1NDU0lfUkVUUllfU1RBVEUJOQkvKiAgIGluIFNjc2kgUmV0cnkgUXVldWUgKi8KKworCisvKgorICogSVNQIEkvTyBSZWdpc3RlciBTZXQgc3RydWN0dXJlIGRlZmluaXRpb25zLgorICovCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCB7CisJdm9sYXRpbGUgdWludDE2X3QgZmxhc2hfYWRkcmVzczsgLyogRmxhc2ggQklPUyBhZGRyZXNzICovCisJdm9sYXRpbGUgdWludDE2X3QgZmxhc2hfZGF0YTsJLyogRmxhc2ggQklPUyBkYXRhICovCisJdWludDE2X3QgdW51c2VkXzFbMV07CQkvKiBHYXAgKi8KKwl2b2xhdGlsZSB1aW50MTZfdCBjdHJsX3N0YXR1czsJLyogQ29udHJvbC9TdGF0dXMgKi8KKyNkZWZpbmUgQ1NSX0ZMQVNIXzY0S19CQU5LCUJJVF8zCS8qIEZsYXNoIHVwcGVyIDY0SyBiYW5rIHNlbGVjdCAqLyAKKyNkZWZpbmUgQ1NSX0ZMQVNIX0VOQUJMRQlCSVRfMQkvKiBGbGFzaCBCSU9TIFJlYWQvV3JpdGUgZW5hYmxlICovCisjZGVmaW5lIENTUl9JU1BfU09GVF9SRVNFVAlCSVRfMAkvKiBJU1Agc29mdCByZXNldCAqLworCisJdm9sYXRpbGUgdWludDE2X3QgaWN0cmw7CS8qIEludGVycnVwdCBjb250cm9sICovCisjZGVmaW5lIElDUl9FTl9JTlQJCUJJVF8xNQkvKiBJU1AgZW5hYmxlIGludGVycnVwdHMuICovCisjZGVmaW5lIElDUl9FTl9SSVNDCQlCSVRfMwkvKiBJU1AgZW5hYmxlIFJJU0MgaW50ZXJydXB0cy4gKi8KKworCXZvbGF0aWxlIHVpbnQxNl90IGlzdGF0dXM7CS8qIEludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgSVNSX1JJU0NfSU5UCQlCSVRfMwkvKiBSSVNDIGludGVycnVwdCAqLworCisJdm9sYXRpbGUgdWludDE2X3Qgc2VtYXBob3JlOwkvKiBTZW1hcGhvcmUgKi8KKwl2b2xhdGlsZSB1aW50MTZfdCBudnJhbTsJLyogTlZSQU0gcmVnaXN0ZXIuICovCisjZGVmaW5lIE5WUl9ERVNFTEVDVAkJMAorI2RlZmluZSBOVlJfQlVTWQkJQklUXzE1CisjZGVmaW5lIE5WUl9XUlRfRU5BQkxFCQlCSVRfMTQJLyogV3JpdGUgZW5hYmxlICovCisjZGVmaW5lIE5WUl9QUl9FTkFCTEUJCUJJVF8xMwkvKiBQcm90ZWN0aW9uIHJlZ2lzdGVyIGVuYWJsZSAqLworI2RlZmluZSBOVlJfREFUQV9JTgkJQklUXzMKKyNkZWZpbmUgTlZSX0RBVEFfT1VUCQlCSVRfMgorI2RlZmluZSBOVlJfU0VMRUNUCQlCSVRfMQorI2RlZmluZSBOVlJfQ0xPQ0sJCUJJVF8wCisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MDsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxOworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDI7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MzsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3g0OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDU7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94NjsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3g3OworCQkJdWludDE2X3QgdW51c2VkXzJbNTldOwkJLyogR2FwICovCisJCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgaXNwMjEwMDsKKwkJc3RydWN0IHsKKwkJCQkJCQkvKiBSZXF1ZXN0IFF1ZXVlICovCisJCQl2b2xhdGlsZSB1aW50MTZfdCByZXFfcV9pbjsJLyogIEluLVBvaW50ZXIgKi8KKwkJCXZvbGF0aWxlIHVpbnQxNl90IHJlcV9xX291dDsJLyogIE91dC1Qb2ludGVyICovCisJCQkJCQkJLyogUmVzcG9uc2UgUXVldWUgKi8KKwkJCXZvbGF0aWxlIHVpbnQxNl90IHJzcF9xX2luOwkvKiAgSW4tUG9pbnRlciAqLworCQkJdm9sYXRpbGUgdWludDE2X3QgcnNwX3Ffb3V0OwkvKiAgT3V0LVBvaW50ZXIgKi8KKworCQkJCQkJLyogUklTQyB0byBIb3N0IFN0YXR1cyAqLworCQkJdm9sYXRpbGUgdWludDMyX3QgaG9zdF9zdGF0dXM7CQorI2RlZmluZSBIU1JfUklTQ19JTlQJCUJJVF8xNQkvKiBSSVNDIGludGVycnVwdCAqLworI2RlZmluZSBIU1JfUklTQ19QQVVTRUQJCUJJVF84CS8qIFJJU0MgUGF1c2VkICovCisKKwkJCQkJLyogSG9zdCB0byBIb3N0IFNlbWFwaG9yZSAqLworCQkJdm9sYXRpbGUgdWludDE2X3QgaG9zdF9zZW1hcGhvcmU7IAorCQkJdWludDE2X3QgdW51c2VkXzNbMTddOwkJLyogR2FwICovCisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MDsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxOworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDI7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MzsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3g0OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDU7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94NjsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3g3OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDg7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94OTsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxMDsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxMTsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxMjsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxMzsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxNDsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxNTsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxNjsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxNzsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxODsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxOTsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gyMDsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gyMTsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gyMjsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gyMzsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gyNDsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gyNTsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gyNjsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gyNzsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gyODsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gyOTsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gzMDsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gzMTsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IGZiX2NtZDsKKwkJCXVpbnQxNl90IHVudXNlZF80WzEwXTsJCS8qIEdhcCAqLworCQl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGlzcDIzMDA7CisJfSB1OworCisJdm9sYXRpbGUgdWludDE2X3QgZnBtX2RpYWdfY29uZmlnOworCXVpbnQxNl90IHVudXNlZF81WzB4Nl07CQkvKiBHYXAgKi8KKwl2b2xhdGlsZSB1aW50MTZfdCBwY3I7CQkvKiBQcm9jZXNzb3IgQ29udHJvbCBSZWdpc3Rlci4gKi8KKwl1aW50MTZfdCB1bnVzZWRfNlsweDVdOwkJLyogR2FwICovCisJdm9sYXRpbGUgdWludDE2X3QgbWN0cjsJCS8qIE1lbW9yeSBDb25maWd1cmF0aW9uIGFuZCBUaW1pbmcuICovCisJdWludDE2X3QgdW51c2VkXzdbMHgzXTsJCS8qIEdhcCAqLworCXZvbGF0aWxlIHVpbnQxNl90IGZiX2NtZF8yMTAwOwkvKiBVbnVzZWQgb24gMjNYWCAqLworCXVpbnQxNl90IHVudXNlZF84WzB4M107CQkvKiBHYXAgKi8KKwl2b2xhdGlsZSB1aW50MTZfdCBoY2NyOwkJLyogSG9zdCBjb21tYW5kICYgY29udHJvbCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgSENDUl9IT1NUX0lOVAkJQklUXzcJLyogSG9zdCBpbnRlcnJ1cHQgYml0ICovCisjZGVmaW5lIEhDQ1JfUklTQ19QQVVTRQkJQklUXzUJLyogUGF1c2UgbW9kZSBiaXQgKi8KKwkJCQkJLyogSENDUiBjb21tYW5kcyAqLworI2RlZmluZSBIQ0NSX1JFU0VUX1JJU0MJCTB4MTAwMAkvKiBSZXNldCBSSVNDICovCisjZGVmaW5lIEhDQ1JfUEFVU0VfUklTQwkJMHgyMDAwCS8qIFBhdXNlIFJJU0MgKi8KKyNkZWZpbmUgSENDUl9SRUxFQVNFX1JJU0MJMHgzMDAwCS8qIFJlbGVhc2UgUklTQyBmcm9tIHJlc2V0LiAqLworI2RlZmluZSBIQ0NSX1NFVF9IT1NUX0lOVAkweDUwMDAJLyogU2V0IGhvc3QgaW50ZXJydXB0ICovCisjZGVmaW5lIEhDQ1JfQ0xSX0hPU1RfSU5UCTB4NjAwMAkvKiBDbGVhciBIT1NUIGludGVycnVwdCAqLworI2RlZmluZSBIQ0NSX0NMUl9SSVNDX0lOVAkweDcwMDAJLyogQ2xlYXIgUklTQyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJSENDUl9ESVNBQkxFX1BBUklUWV9QQVVTRSAweDQwMDEgLyogRGlzYWJsZSBwYXJpdHkgZXJyb3IgUklTQyBwYXVzZS4gKi8KKyNkZWZpbmUgSENDUl9FTkFCTEVfUEFSSVRZCTB4QTAwMAkvKiBFbmFibGUgUEFSSVRZIGludGVycnVwdCAqLworCisJdWludDE2X3QgdW51c2VkXzlbNV07CQkvKiBHYXAgKi8KKwl2b2xhdGlsZSB1aW50MTZfdCBncGlvZDsJLyogR1BJTyBEYXRhIHJlZ2lzdGVyLiAqLworCXZvbGF0aWxlIHVpbnQxNl90IGdwaW9lOwkvKiBHUElPIEVuYWJsZSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgR1BJT19MRURfTUFTSwkJCTB4MDBDMAorI2RlZmluZSBHUElPX0xFRF9HUkVFTl9PRkZfQU1CRVJfT0ZGCTB4MDAwMAorI2RlZmluZSBHUElPX0xFRF9HUkVFTl9PTl9BTUJFUl9PRkYJMHgwMDQwCisjZGVmaW5lIEdQSU9fTEVEX0dSRUVOX09GRl9BTUJFUl9PTgkweDAwODAKKyNkZWZpbmUgR1BJT19MRURfR1JFRU5fT05fQU1CRVJfT04JMHgwMEMwCisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1aW50MTZfdCB1bnVzZWRfMTBbOF07CQkvKiBHYXAgKi8KKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3g4OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDk7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MTA7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MTE7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MTI7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MTM7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MTQ7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MTU7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MTY7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MTc7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MTg7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MTk7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MjA7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MjE7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MjI7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MjM7CS8qIEFsc28gcHJvYmUgcmVnLiAqLworCQl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGlzcDIyMDA7CisJfSB1X2VuZDsKK30gZGV2aWNlX3JlZ190OworCisjZGVmaW5lIElTUF9SRVFfUV9JTihoYSwgcmVnKSBcCisJKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpID8gXAorCSAmKHJlZyktPnUuaXNwMjEwMC5tYWlsYm94NCA6IFwKKwkgJihyZWcpLT51LmlzcDIzMDAucmVxX3FfaW4pCisjZGVmaW5lIElTUF9SRVFfUV9PVVQoaGEsIHJlZykgXAorCShJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSA/IFwKKwkgJihyZWcpLT51LmlzcDIxMDAubWFpbGJveDQgOiBcCisJICYocmVnKS0+dS5pc3AyMzAwLnJlcV9xX291dCkKKyNkZWZpbmUgSVNQX1JTUF9RX0lOKGhhLCByZWcpIFwKKwkoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkgPyBcCisJICYocmVnKS0+dS5pc3AyMTAwLm1haWxib3g1IDogXAorCSAmKHJlZyktPnUuaXNwMjMwMC5yc3BfcV9pbikKKyNkZWZpbmUgSVNQX1JTUF9RX09VVChoYSwgcmVnKSBcCisJKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpID8gXAorCSAmKHJlZyktPnUuaXNwMjEwMC5tYWlsYm94NSA6IFwKKwkgJihyZWcpLT51LmlzcDIzMDAucnNwX3Ffb3V0KQorCisjZGVmaW5lIE1BSUxCT1hfUkVHKGhhLCByZWcsIG51bSkgXAorCShJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSA/IFwKKwkgKG51bSA8IDggPyBcCisJICAmKHJlZyktPnUuaXNwMjEwMC5tYWlsYm94MCArIChudW0pIDogXAorCSAgJihyZWcpLT51X2VuZC5pc3AyMjAwLm1haWxib3g4ICsgKG51bSkgLSA4KSA6IFwKKwkgJihyZWcpLT51LmlzcDIzMDAubWFpbGJveDAgKyAobnVtKSkKKyNkZWZpbmUgUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgbnVtKSBcCisJUkRfUkVHX1dPUkQoTUFJTEJPWF9SRUcoaGEsIHJlZywgbnVtKSkKKyNkZWZpbmUgV1JUX01BSUxCT1hfUkVHKGhhLCByZWcsIG51bSwgZGF0YSkgXAorCVdSVF9SRUdfV09SRChNQUlMQk9YX1JFRyhoYSwgcmVnLCBudW0pLCBkYXRhKQorCisjZGVmaW5lIEZCX0NNRF9SRUcoaGEsIHJlZykgXAorCShJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSA/IFwKKwkgJihyZWcpLT5mYl9jbWRfMjEwMCA6IFwKKwkgJihyZWcpLT51LmlzcDIzMDAuZmJfY21kKQorI2RlZmluZSBSRF9GQl9DTURfUkVHKGhhLCByZWcpIFwKKwlSRF9SRUdfV09SRChGQl9DTURfUkVHKGhhLCByZWcpKQorI2RlZmluZSBXUlRfRkJfQ01EX1JFRyhoYSwgcmVnLCBkYXRhKSBcCisJV1JUX1JFR19XT1JEKEZCX0NNRF9SRUcoaGEsIHJlZyksIGRhdGEpCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdAlvdXRfbWI7CQkvKiBvdXRib3VuZCBmcm9tIGRyaXZlciAqLworCXVpbnQzMl90CWluX21iOwkJCS8qIEluY29taW5nIGZyb20gUklTQyAqLworCXVpbnQxNl90CW1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOworCWxvbmcJCWJ1Zl9zaXplOworCXZvaWQJCSpidWZwOworCXVpbnQzMl90CXRvdjsKKwl1aW50OF90CQlmbGFnczsKKyNkZWZpbmUgTUJYX0RNQV9JTglCSVRfMAorI2RlZmluZQlNQlhfRE1BX09VVAlCSVRfMQorI2RlZmluZSBJT0NUTF9DTUQJQklUXzIKK30gbWJ4X2NtZF90OworCisjZGVmaW5lCU1CWF9UT1ZfU0VDT05EUwkzMAorCisvKgorICogIElTUCBwcm9kdWN0IGlkZW50aWZpY2F0aW9uIGRlZmluaXRpb25zIGluIG1haWxib3hlcyBhZnRlciByZXNldC4KKyAqLworI2RlZmluZSBQUk9EX0lEXzEJCTB4NDk1MworI2RlZmluZSBQUk9EX0lEXzIJCTB4MDAwMAorI2RlZmluZSBQUk9EX0lEXzJhCQkweDUwMjAKKyNkZWZpbmUgUFJPRF9JRF8zCQkweDIwMjAKKworLyoKKyAqIElTUCBtYWlsYm94IFNlbGYtVGVzdCBzdGF0dXMgY29kZXMKKyAqLworI2RlZmluZSBNQlNfRlJNX0FMSVZFCQkwCS8qIEZpcm13YXJlIEFsaXZlLiAqLworI2RlZmluZSBNQlNfQ0hLU1VNX0VSUgkJMQkvKiBDaGVja3N1bSBFcnJvci4gKi8KKyNkZWZpbmUgTUJTX0JVU1kJCTQJLyogQnVzeS4gKi8KKworLyoKKyAqIElTUCBtYWlsYm94IGNvbW1hbmQgY29tcGxldGUgc3RhdHVzIGNvZGVzCisgKi8KKyNkZWZpbmUgTUJTX0NPTU1BTkRfQ09NUExFVEUJCTB4NDAwMAorI2RlZmluZSBNQlNfSU5WQUxJRF9DT01NQU5ECQkweDQwMDEKKyNkZWZpbmUgTUJTX0hPU1RfSU5URVJGQUNFX0VSUk9SCTB4NDAwMgorI2RlZmluZSBNQlNfVEVTVF9GQUlMRUQJCQkweDQwMDMKKyNkZWZpbmUgTUJTX0NPTU1BTkRfRVJST1IJCTB4NDAwNQorI2RlZmluZSBNQlNfQ09NTUFORF9QQVJBTUVURVJfRVJST1IJMHg0MDA2CisjZGVmaW5lIE1CU19QT1JUX0lEX1VTRUQJCTB4NDAwNworI2RlZmluZSBNQlNfTE9PUF9JRF9VU0VECQkweDQwMDgKKyNkZWZpbmUgTUJTX0FMTF9JRFNfSU5fVVNFCQkweDQwMDkKKyNkZWZpbmUgTUJTX05PVF9MT0dHRURfSU4JCTB4NDAwQQorCisvKgorICogSVNQIG1haWxib3ggYXN5bmNocm9ub3VzIGV2ZW50IHN0YXR1cyBjb2RlcworICovCisjZGVmaW5lIE1CQV9BU1lOQ19FVkVOVAkJMHg4MDAwCS8qIEFzeW5jaHJvbm91cyBldmVudC4gKi8KKyNkZWZpbmUgTUJBX1JFU0VUCQkweDgwMDEJLyogUmVzZXQgRGV0ZWN0ZWQuICovCisjZGVmaW5lIE1CQV9TWVNURU1fRVJSCQkweDgwMDIJLyogU3lzdGVtIEVycm9yLiAqLworI2RlZmluZSBNQkFfUkVRX1RSQU5TRkVSX0VSUgkweDgwMDMJLyogUmVxdWVzdCBUcmFuc2ZlciBFcnJvci4gKi8KKyNkZWZpbmUgTUJBX1JTUF9UUkFOU0ZFUl9FUlIJMHg4MDA0CS8qIFJlc3BvbnNlIFRyYW5zZmVyIEVycm9yLiAqLworI2RlZmluZSBNQkFfV0FLRVVQX1RIUkVTCTB4ODAwNQkvKiBSZXF1ZXN0IFF1ZXVlIFdha2UtdXAuICovCisjZGVmaW5lIE1CQV9MSVBfT0NDVVJSRUQJMHg4MDEwCS8qIExvb3AgSW5pdGlhbGl6YXRpb24gUHJvY2VkdXJlICovCisJCQkJCS8qIG9jY3VycmVkLiAqLworI2RlZmluZSBNQkFfTE9PUF9VUAkJMHg4MDExCS8qIEZDIExvb3AgVVAuICovCisjZGVmaW5lIE1CQV9MT09QX0RPV04JCTB4ODAxMgkvKiBGQyBMb29wIERvd24uICovCisjZGVmaW5lIE1CQV9MSVBfUkVTRVQJCTB4ODAxMwkvKiBMSVAgcmVzZXQgb2NjdXJyZWQuICovCisjZGVmaW5lIE1CQV9QT1JUX1VQREFURQkJMHg4MDE0CS8qIFBvcnQgRGF0YWJhc2UgdXBkYXRlLiAqLworI2RlZmluZSBNQkFfUlNDTl9VUERBVEUJCTB4ODAxNQkvKiBSZWdpc3RlciBTdGF0ZSBDaGcgTm90aWZpY2F0aW9uLiAqLworI2RlZmluZSBNQkFfTElQX0Y4CQkweDgwMTYJLyogUmVjZWl2ZWQgYSBMSVAgRjguICovCisjZGVmaW5lIE1CQV9MT09QX0lOSVRfRVJSCTB4ODAxNwkvKiBMb29wIEluaXRpYWxpemF0aW9uIEVycm9yLiAqLworI2RlZmluZSBNQkFfRkFCUklDX0FVVEhfUkVRCTB4ODAxYgkvKiBGYWJyaWMgQXV0aGVudGljYXRpb24gUmVxdWlyZWQuICovCisjZGVmaW5lIE1CQV9TQ1NJX0NPTVBMRVRJT04JMHg4MDIwCS8qIFNDU0kgQ29tbWFuZCBDb21wbGV0ZS4gKi8KKyNkZWZpbmUgTUJBX0NUSU9fQ09NUExFVElPTgkweDgwMjEJLyogQ1RJTyBDb21wbGV0ZS4gKi8KKyNkZWZpbmUgTUJBX0lQX0NPTVBMRVRJT04JMHg4MDIyCS8qIElQIFRyYW5zbWl0IENvbW1hbmQgQ29tcGxldGUuICovCisjZGVmaW5lIE1CQV9JUF9SRUNFSVZFCQkweDgwMjMJLyogSVAgUmVjZWl2ZWQuICovCisjZGVmaW5lIE1CQV9JUF9CUk9BRENBU1QJMHg4MDI0CS8qIElQIEJyb2FkY2FzdCBSZWNlaXZlZC4gKi8KKyNkZWZpbmUgTUJBX0lQX0xPV19XQVRFUl9NQVJLCTB4ODAyNQkvKiBJUCBMb3cgV2F0ZXIgTWFyayByZWFjaGVkLiAqLworI2RlZmluZSBNQkFfSVBfUkNWX0JVRkZFUl9FTVBUWSAweDgwMjYJLyogSVAgcmVjZWl2ZSBidWZmZXIgcXVldWUgZW1wdHkuICovCisjZGVmaW5lIE1CQV9JUF9IRFJfREFUQV9TUExJVAkweDgwMjcJLyogSVAgaGVhZGVyL2RhdGEgc3BsaXR0aW5nIGZlYXR1cmUgKi8KKwkJCQkJLyogdXNlZC4gKi8KKyNkZWZpbmUgTUJBX1BPSU5UX1RPX1BPSU5UCTB4ODAzMAkvKiBQb2ludCB0byBwb2ludCBtb2RlLiAqLworI2RlZmluZSBNQkFfQ01QTFRfMV8xNkJJVAkweDgwMzEJLyogQ29tcGxldGlvbiAxIDE2Yml0IElPU0IuICovCisjZGVmaW5lIE1CQV9DTVBMVF8yXzE2QklUCTB4ODAzMgkvKiBDb21wbGV0aW9uIDIgMTZiaXQgSU9TQi4gKi8KKyNkZWZpbmUgTUJBX0NNUExUXzNfMTZCSVQJMHg4MDMzCS8qIENvbXBsZXRpb24gMyAxNmJpdCBJT1NCLiAqLworI2RlZmluZSBNQkFfQ01QTFRfNF8xNkJJVAkweDgwMzQJLyogQ29tcGxldGlvbiA0IDE2Yml0IElPU0IuICovCisjZGVmaW5lIE1CQV9DTVBMVF81XzE2QklUCTB4ODAzNQkvKiBDb21wbGV0aW9uIDUgMTZiaXQgSU9TQi4gKi8KKyNkZWZpbmUgTUJBX0NIR19JTl9DT05ORUNUSU9OCTB4ODAzNgkvKiBDaGFuZ2UgaW4gY29ubmVjdGlvbiBtb2RlLiAqLworI2RlZmluZSBNQkFfUklPX1JFU1BPTlNFCTB4ODA0MAkvKiBSSU8gcmVzcG9uc2UgcXVldWUgdXBkYXRlLiAqLworI2RlZmluZSBNQkFfWklPX1JFU1BPTlNFCTB4ODA0MAkvKiBaSU8gcmVzcG9uc2UgcXVldWUgdXBkYXRlLiAqLworI2RlZmluZSBNQkFfQ01QTFRfMl8zMkJJVAkweDgwNDIJLyogQ29tcGxldGlvbiAyIDMyYml0IElPU0IuICovCisjZGVmaW5lIE1CQV9CWVBBU1NfTk9USUZJQ0FUSU9OCTB4ODA0MwkvKiBBdXRvIGJ5cGFzcyBub3RpZmljYXRpb24uICovCisjZGVmaW5lIE1CQV9ESVNDQVJEX1JORF9GUkFNRQkweDgwNDgJLyogZGlzY2FyZCBSTkQgZnJhbWUgZHVlIHRvIGVycm9yLiAqLworI2RlZmluZSBNQkFfUkVKRUNURURfRkNQX0NNRAkweDgwNDkJLyogcmVqZWN0ZWQgRkNQX0NNRC4gKi8KKworLyoKKyAqIEZpcm13YXJlIG9wdGlvbnMgMSwgMiwgMy4KKyAqLworI2RlZmluZSBGTzFfQUVfT05fTElQRjgJCQlCSVRfMAorI2RlZmluZSBGTzFfQUVfQUxMX0xJUF9SRVNFVAkJQklUXzEKKyNkZWZpbmUgRk8xX0NUSU9fUkVUUlkJCQlCSVRfMworI2RlZmluZSBGTzFfRElTQUJMRV9MSVBfRjdfU1cJCUJJVF80CisjZGVmaW5lIEZPMV9ESVNBQkxFXzEwME1TX0xPU19XQUlUCUJJVF81CisjZGVmaW5lIEZPMV9ESVNBQkxFX0dQSU82XzcJCUJJVF82CisjZGVmaW5lIEZPMV9BRV9PTl9MT09QX0lOSVRfRVJSCQlCSVRfNworI2RlZmluZSBGTzFfU0VUX0VNUEhBU0lTX1NXSU5HCQlCSVRfOAorI2RlZmluZSBGTzFfQUVfQVVUT19CWVBBU1MJCUJJVF85CisjZGVmaW5lIEZPMV9FTkFCTEVfUFVSRV9JT0NCCQlCSVRfMTAKKyNkZWZpbmUgRk8xX0FFX1BMT0dJX1JKVAkJQklUXzExCisjZGVmaW5lIEZPMV9FTkFCTEVfQUJPUlRfU0VRVUVOQ0UJQklUXzEyCisjZGVmaW5lIEZPMV9BRV9RVUVVRV9GVUxMCQlCSVRfMTMKKworI2RlZmluZSBGTzJfRU5BQkxFX0FUSU9fVFlQRV8zCQlCSVRfMAorI2RlZmluZSBGTzJfUkVWX0xPT1BCQUNLCQlCSVRfMQorCisjZGVmaW5lIEZPM19FTkFCTEVfRU1FUkdfSU9DQgkJQklUXzAKKyNkZWZpbmUgRk8zX0FFX1JORF9FUlJPUgkJQklUXzEKKworLyoKKyAqIElTUCBtYWlsYm94IGNvbW1hbmRzCisgKi8KKyNkZWZpbmUgTUJDX0xPQURfUkFNCQkJMQkvKiBMb2FkIFJBTS4gKi8KKyNkZWZpbmUgTUJDX0VYRUNVVEVfRklSTVdBUkUJCTIJLyogRXhlY3V0ZSBmaXJtd2FyZS4gKi8KKyNkZWZpbmUgTUJDX1dSSVRFX1JBTV9XT1JECQk0CS8qIFdyaXRlIFJBTSB3b3JkLiAqLworI2RlZmluZSBNQkNfUkVBRF9SQU1fV09SRAkJNQkvKiBSZWFkIFJBTSB3b3JkLiAqLworI2RlZmluZSBNQkNfTUFJTEJPWF9SRUdJU1RFUl9URVNUCTYJLyogV3JhcCBpbmNvbWluZyBtYWlsYm94ZXMgKi8KKyNkZWZpbmUgTUJDX1ZFUklGWV9DSEVDS1NVTQkJNwkvKiBWZXJpZnkgY2hlY2tzdW0uICovCisjZGVmaW5lIE1CQ19HRVRfRklSTVdBUkVfVkVSU0lPTgk4CS8qIEdldCBmaXJtd2FyZSByZXZpc2lvbi4gKi8KKyNkZWZpbmUgTUJDX0xPQURfUklTQ19SQU0JCTkJLyogTG9hZCBSQU0gY29tbWFuZC4gKi8KKyNkZWZpbmUgTUJDX0RVTVBfUklTQ19SQU0JCTB4YQkvKiBEdW1wIFJBTSBjb21tYW5kLiAqLworI2RlZmluZSBNQkNfTE9BRF9SSVNDX1JBTV9FWFRFTkRFRAkweGIJLyogTG9hZCBSQU0gZXh0ZW5kZWQuICovCisjZGVmaW5lIE1CQ19EVU1QX1JJU0NfUkFNX0VYVEVOREVECTB4YwkvKiBEdW1wIFJBTSBleHRlbmRlZC4gKi8KKyNkZWZpbmUgTUJDX1dSSVRFX1JBTV9XT1JEX0VYVEVOREVECTB4ZAkvKiBXcml0ZSBSQU0gd29yZCBleHRlbmRlZCAqLworI2RlZmluZSBNQkNfUkVBRF9SQU1fRVhURU5ERUQJCTB4ZgkvKiBSZWFkIFJBTSBleHRlbmRlZC4gKi8KKyNkZWZpbmUgTUJDX0lPQ0JfQ09NTUFORAkJMHgxMgkvKiBFeGVjdXRlIElPQ0IgY29tbWFuZC4gKi8KKyNkZWZpbmUgTUJDX0FCT1JUX0NPTU1BTkQJCTB4MTUJLyogQWJvcnQgSU9DQiBjb21tYW5kLiAqLworI2RlZmluZSBNQkNfQUJPUlRfREVWSUNFCQkweDE2CS8qIEFib3J0IGRldmljZSAoSUQvTFVOKS4gKi8KKyNkZWZpbmUgTUJDX0FCT1JUX1RBUkdFVAkJMHgxNwkvKiBBYm9ydCB0YXJnZXQgKElEKS4gKi8KKyNkZWZpbmUgTUJDX1JFU0VUCQkJMHgxOAkvKiBSZXNldC4gKi8KKyNkZWZpbmUgTUJDX0dFVF9BREFQVEVSX0xPT1BfSUQJCTB4MjAJLyogR2V0IGxvb3AgaWQgb2YgSVNQMjIwMC4gKi8KKyNkZWZpbmUgTUJDX0dFVF9SRVRSWV9DT1VOVAkJMHgyMgkvKiBHZXQgZi93IHJldHJ5IGNudC9kZWxheS4gKi8KKyNkZWZpbmUgTUJDX0RJU0FCTEVfVkkJCQkweDI0CS8qIERpc2FibGUgVkkgb3BlcmF0aW9uLiAqLworI2RlZmluZSBNQkNfRU5BQkxFX1ZJCQkJMHgyNQkvKiBFbmFibGUgVkkgb3BlcmF0aW9uLiAqLworI2RlZmluZSBNQkNfR0VUX0ZJUk1XQVJFX09QVElPTgkJMHgyOAkvKiBHZXQgRmlybXdhcmUgT3B0aW9ucy4gKi8KKyNkZWZpbmUgTUJDX1NFVF9GSVJNV0FSRV9PUFRJT04JCTB4MzgJLyogU2V0IEZpcm13YXJlIE9wdGlvbnMuICovCisjZGVmaW5lIE1CQ19MT09QX1BPUlRfQllQQVNTCQkweDQwCS8qIExvb3AgUG9ydCBCeXBhc3MuICovCisjZGVmaW5lIE1CQ19MT09QX1BPUlRfRU5BQkxFCQkweDQxCS8qIExvb3AgUG9ydCBFbmFibGUuICovCisjZGVmaW5lIE1CQ19HRVRfUkVTT1VSQ0VfQ09VTlRTCQkweDQyCS8qIEdldCBSZXNvdXJjZSBDb3VudHMuICovCisjZGVmaW5lIE1CQ19OT05fUEFSVElDSVBBVEUJCTB4NDMJLyogTm9uLVBhcnRpY2lwYXRpbmcgTW9kZS4gKi8KKyNkZWZpbmUgTUJDX0RJQUdOT1NUSUNfRUNITwkJMHg0NAkvKiBEaWFnbm9zdGljIGVjaG8uICovCisjZGVmaW5lIE1CQ19ESUFHTk9TVElDX0xPT1BfQkFDSwkweDQ1CS8qIERpYWdub3N0aWMgbG9vcCBiYWNrLiAqLworI2RlZmluZSBNQkNfT05MSU5FX1NFTEZfVEVTVAkJMHg0NgkvKiBPbmxpbmUgc2VsZi10ZXN0LiAqLworI2RlZmluZSBNQkNfRU5IQU5DRURfR0VUX1BPUlRfREFUQUJBU0UJMHg0NwkvKiBHZXQgcG9ydCBkYXRhYmFzZSArIGxvZ2luICovCisjZGVmaW5lIE1CQ19SRVNFVF9MSU5LX1NUQVRVUwkJMHg1MgkvKiBSZXNldCBMaW5rIEVycm9yIFN0YXR1cyAqLworI2RlZmluZSBNQkNfSU9DQl9DT01NQU5EX0E2NAkJMHg1NAkvKiBFeGVjdXRlIElPQ0IgY29tbWFuZCAoNjQpICovCisjZGVmaW5lIE1CQ19TRU5EX1JOSURfRUxTCQkweDU3CS8qIFNlbmQgUk5JRCBFTFMgcmVxdWVzdCAqLworI2RlZmluZSBNQkNfU0VUX1JOSURfUEFSQU1TCQkweDU5CS8qIFNldCBSTklEIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgTUJDX0dFVF9STklEX1BBUkFNUwkJMHg1YQkvKiBEYXRhIFJhdGUgKi8KKyNkZWZpbmUgTUJDX0RBVEFfUkFURQkJCTB4NWQJLyogR2V0IFJOSUQgcGFyYW1ldGVycyAqLworI2RlZmluZSBNQkNfSU5JVElBTElaRV9GSVJNV0FSRQkJMHg2MAkvKiBJbml0aWFsaXplIGZpcm13YXJlICovCisjZGVmaW5lIE1CQ19JTklUSUFURV9MSVAJCTB4NjIJLyogSW5pdGlhdGUgTG9vcCAqLworCQkJCQkJLyogSW5pdGlhbGl6YXRpb24gUHJvY2VkdXJlICovCisjZGVmaW5lIE1CQ19HRVRfRkNfQUxfUE9TSVRJT05fTUFQCTB4NjMJLyogR2V0IEZDX0FMIFBvc2l0aW9uIE1hcC4gKi8KKyNkZWZpbmUgTUJDX0dFVF9QT1JUX0RBVEFCQVNFCQkweDY0CS8qIEdldCBQb3J0IERhdGFiYXNlLiAqLworI2RlZmluZSBNQkNfQ0xFQVJfQUNBCQkJMHg2NQkvKiBDbGVhciBBQ0EuICovCisjZGVmaW5lIE1CQ19UQVJHRVRfUkVTRVQJCTB4NjYJLyogVGFyZ2V0IFJlc2V0LiAqLworI2RlZmluZSBNQkNfQ0xFQVJfVEFTS19TRVQJCTB4NjcJLyogQ2xlYXIgVGFzayBTZXQuICovCisjZGVmaW5lIE1CQ19BQk9SVF9UQVNLX1NFVAkJMHg2OAkvKiBBYm9ydCBUYXNrIFNldC4gKi8KKyNkZWZpbmUgTUJDX0dFVF9GSVJNV0FSRV9TVEFURQkJMHg2OQkvKiBHZXQgZmlybXdhcmUgc3RhdGUuICovCisjZGVmaW5lIE1CQ19HRVRfUE9SVF9OQU1FCQkweDZhCS8qIEdldCBwb3J0IG5hbWUuICovCisjZGVmaW5lIE1CQ19HRVRfTElOS19TVEFUVVMJCTB4NmIJLyogR2V0IHBvcnQgbGluayBzdGF0dXMuICovCisjZGVmaW5lIE1CQ19MSVBfUkVTRVQJCQkweDZjCS8qIExJUCByZXNldC4gKi8KKyNkZWZpbmUgTUJDX1NFTkRfU05TX0NPTU1BTkQJCTB4NmUJLyogU2VuZCBTaW1wbGUgTmFtZSBTZXJ2ZXIgKi8KKwkJCQkJCS8qIGNvbW1hbmRkLiAqLworI2RlZmluZSBNQkNfTE9HSU5fRkFCUklDX1BPUlQJCTB4NmYJLyogTG9naW4gZmFicmljIHBvcnQuICovCisjZGVmaW5lIE1CQ19TRU5EX0NIQU5HRV9SRVFVRVNUCQkweDcwCS8qIFNlbmQgQ2hhbmdlIFJlcXVlc3QuICovCisjZGVmaW5lIE1CQ19MT0dPVVRfRkFCUklDX1BPUlQJCTB4NzEJLyogTG9nb3V0IGZhYnJpYyBwb3J0LiAqLworI2RlZmluZSBNQkNfTElQX0ZVTExfTE9HSU4JCTB4NzIJLyogRnVsbCBsb2dpbiBMSVAuICovCisjZGVmaW5lIE1CQ19MT0dJTl9MT09QX1BPUlQJCTB4NzQJLyogTG9naW4gTG9vcCBQb3J0LiAqLworI2RlZmluZSBNQkNfUE9SVF9OT0RFX05BTUVfTElTVAkJMHg3NQkvKiBHZXQgcG9ydC9ub2RlIG5hbWUgbGlzdC4gKi8KKyNkZWZpbmUgTUJDX0lOSVRJQUxJWkVfUkVDRUlWRV9RVUVVRQkweDc3CS8qIEluaXRpYWxpemUgcmVjZWl2ZSBxdWV1ZSAqLworI2RlZmluZSBNQkNfVU5MT0FEX0lQCQkJMHg3OQkvKiBTaHV0ZG93biBJUCAqLworI2RlZmluZSBNQkNfR0VUX0lEX0xJU1QJCQkweDdDCS8qIEdldCBQb3J0IElEIGxpc3QuICovCisjZGVmaW5lIE1CQ19TRU5EX0xGQV9DT01NQU5ECQkweDdECS8qIFNlbmQgTG9vcCBGYWJyaWMgQWRkcmVzcyAqLworI2RlZmluZSBNQkNfTFVOX1JFU0VUCQkJMHg3RQkvKiBTZW5kIExVTiByZXNldCAqLworCisvKiBGaXJtd2FyZSByZXR1cm4gZGF0YSBzaXplcyAqLworI2RlZmluZSBGQ0FMX01BUF9TSVpFCTEyOAorCisvKiBNYWlsYm94IGJpdCBkZWZpbml0aW9ucyBmb3Igb3V0X21iIGFuZCBpbl9tYiAqLworI2RlZmluZQlNQlhfMzEJCUJJVF8zMQorI2RlZmluZQlNQlhfMzAJCUJJVF8zMAorI2RlZmluZQlNQlhfMjkJCUJJVF8yOQorI2RlZmluZQlNQlhfMjgJCUJJVF8yOAorI2RlZmluZQlNQlhfMjcJCUJJVF8yNworI2RlZmluZQlNQlhfMjYJCUJJVF8yNgorI2RlZmluZQlNQlhfMjUJCUJJVF8yNQorI2RlZmluZQlNQlhfMjQJCUJJVF8yNAorI2RlZmluZQlNQlhfMjMJCUJJVF8yMworI2RlZmluZQlNQlhfMjIJCUJJVF8yMgorI2RlZmluZQlNQlhfMjEJCUJJVF8yMQorI2RlZmluZQlNQlhfMjAJCUJJVF8yMAorI2RlZmluZQlNQlhfMTkJCUJJVF8xOQorI2RlZmluZQlNQlhfMTgJCUJJVF8xOAorI2RlZmluZQlNQlhfMTcJCUJJVF8xNworI2RlZmluZQlNQlhfMTYJCUJJVF8xNgorI2RlZmluZQlNQlhfMTUJCUJJVF8xNQorI2RlZmluZQlNQlhfMTQJCUJJVF8xNAorI2RlZmluZQlNQlhfMTMJCUJJVF8xMworI2RlZmluZQlNQlhfMTIJCUJJVF8xMgorI2RlZmluZQlNQlhfMTEJCUJJVF8xMQorI2RlZmluZQlNQlhfMTAJCUJJVF8xMAorI2RlZmluZQlNQlhfOQkJQklUXzkKKyNkZWZpbmUJTUJYXzgJCUJJVF84CisjZGVmaW5lCU1CWF83CQlCSVRfNworI2RlZmluZQlNQlhfNgkJQklUXzYKKyNkZWZpbmUJTUJYXzUJCUJJVF81CisjZGVmaW5lCU1CWF80CQlCSVRfNAorI2RlZmluZQlNQlhfMwkJQklUXzMKKyNkZWZpbmUJTUJYXzIJCUJJVF8yCisjZGVmaW5lCU1CWF8xCQlCSVRfMQorI2RlZmluZQlNQlhfMAkJQklUXzAKKworLyoKKyAqIEZpcm13YXJlIHN0YXRlIGNvZGVzIGZyb20gZ2V0IGZpcm13YXJlIHN0YXRlIG1haWxib3ggY29tbWFuZAorICovCisjZGVmaW5lIEZTVEFURV9DT05GSUdfV0FJVCAgICAgIDAKKyNkZWZpbmUgRlNUQVRFX1dBSVRfQUxfUEEgICAgICAgMQorI2RlZmluZSBGU1RBVEVfV0FJVF9MT0dJTiAgICAgICAyCisjZGVmaW5lIEZTVEFURV9SRUFEWSAgICAgICAgICAgIDMKKyNkZWZpbmUgRlNUQVRFX0xPU1NfT0ZfU1lOQyAgICAgNAorI2RlZmluZSBGU1RBVEVfRVJST1IgICAgICAgICAgICA1CisjZGVmaW5lIEZTVEFURV9SRUlOSVQgICAgICAgICAgIDYKKyNkZWZpbmUgRlNUQVRFX05PTl9QQVJUICAgICAgICAgNworCisjZGVmaW5lIEZTVEFURV9DT05GSUdfQ09SUkVDVCAgICAgIDAKKyNkZWZpbmUgRlNUQVRFX1AyUF9SQ1ZfTElQICAgICAgICAgMQorI2RlZmluZSBGU1RBVEVfUDJQX0NIT09TRV9MT09QICAgICAyCisjZGVmaW5lIEZTVEFURV9QMlBfUkNWX1VOSURFTl9MSVAgIDMKKyNkZWZpbmUgRlNUQVRFX0ZBVEFMX0VSUk9SICAgICAgICAgNAorI2RlZmluZSBGU1RBVEVfTE9PUF9CQUNLX0NPTk4gICAgICA1CisKKy8qCisgKiBQb3J0IERhdGFiYXNlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKiBMaXR0bGUgZW5kaWFuIGV4Y2VwdCB3aGVyZSBub3RlZC4KKyAqLworI2RlZmluZQlQT1JUX0RBVEFCQVNFX1NJWkUJMTI4CS8qIGJ5dGVzICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBvcHRpb25zOworCXVpbnQ4X3QgY29udHJvbDsKKwl1aW50OF90IG1hc3Rlcl9zdGF0ZTsKKwl1aW50OF90IHNsYXZlX3N0YXRlOworCXVpbnQ4X3QgcmVzZXJ2ZWRbMl07CisJdWludDhfdCBoYXJkX2FkZHJlc3M7CisJdWludDhfdCByZXNlcnZlZF8xOworCXVpbnQ4X3QgcG9ydF9pZFs0XTsKKwl1aW50OF90IG5vZGVfbmFtZVtXV05fU0laRV07CisJdWludDhfdCBwb3J0X25hbWVbV1dOX1NJWkVdOworCXVpbnQxNl90IGV4ZWN1dGlvbl90aHJvdHRsZTsKKwl1aW50MTZfdCBleGVjdXRpb25fY291bnQ7CisJdWludDhfdCByZXNldF9jb3VudDsKKwl1aW50OF90IHJlc2VydmVkXzI7CisJdWludDE2X3QgcmVzb3VyY2VfYWxsb2NhdGlvbjsKKwl1aW50MTZfdCBjdXJyZW50X2FsbG9jYXRpb247CisJdWludDE2X3QgcXVldWVfaGVhZDsKKwl1aW50MTZfdCBxdWV1ZV90YWlsOworCXVpbnQxNl90IHRyYW5zbWl0X2V4ZWN1dGlvbl9saXN0X25leHQ7CisJdWludDE2X3QgdHJhbnNtaXRfZXhlY3V0aW9uX2xpc3RfcHJldmlvdXM7CisJdWludDE2X3QgY29tbW9uX2ZlYXR1cmVzOworCXVpbnQxNl90IHRvdGFsX2NvbmN1cnJlbnRfc2VxdWVuY2VzOworCXVpbnQxNl90IFJPX2J5X2luZm9ybWF0aW9uX2NhdGVnb3J5OworCXVpbnQ4X3QgcmVjaXBpZW50OworCXVpbnQ4X3QgaW5pdGlhdG9yOworCXVpbnQxNl90IHJlY2VpdmVfZGF0YV9zaXplOworCXVpbnQxNl90IGNvbmN1cnJlbnRfc2VxdWVuY2VzOworCXVpbnQxNl90IG9wZW5fc2VxdWVuY2VzX3Blcl9leGNoYW5nZTsKKwl1aW50MTZfdCBsdW5fYWJvcnRfZmxhZ3M7CisJdWludDE2X3QgbHVuX3N0b3BfZmxhZ3M7CisJdWludDE2X3Qgc3RvcF9xdWV1ZV9oZWFkOworCXVpbnQxNl90IHN0b3BfcXVldWVfdGFpbDsKKwl1aW50MTZfdCBwb3J0X3JldHJ5X3RpbWVyOworCXVpbnQxNl90IG5leHRfc2VxdWVuY2VfaWQ7CisJdWludDE2X3QgZnJhbWVfY291bnQ7CisJdWludDE2X3QgUFJMSV9wYXlsb2FkX2xlbmd0aDsKKwl1aW50OF90IHBybGlfc3ZjX3BhcmFtX3dvcmRfMFsyXTsJLyogQmlnIGVuZGlhbiAqLworCQkJCQkJLyogQml0cyAxNS0wIG9mIHdvcmQgMCAqLworCXVpbnQ4X3QgcHJsaV9zdmNfcGFyYW1fd29yZF8zWzJdOwkvKiBCaWcgZW5kaWFuICovCisJCQkJCQkvKiBCaXRzIDE1LTAgb2Ygd29yZCAzICovCisJdWludDE2X3QgbG9vcF9pZDsKKwl1aW50MTZfdCBleHRlbmRlZF9sdW5faW5mb19saXN0X3BvaW50ZXI7CisJdWludDE2X3QgZXh0ZW5kZWRfbHVuX3N0b3BfbGlzdF9wb2ludGVyOworfSBwb3J0X2RhdGFiYXNlX3Q7CisKKy8qCisgKiBQb3J0IGRhdGFiYXNlIHNsYXZlL21hc3RlciBzdGF0ZXMKKyAqLworI2RlZmluZSBQRF9TVEFURV9ESVNDT1ZFUlkJCQkwCisjZGVmaW5lIFBEX1NUQVRFX1dBSVRfRElTQ09WRVJZX0FDSwkJMQorI2RlZmluZSBQRF9TVEFURV9QT1JUX0xPR0lOCQkJMgorI2RlZmluZSBQRF9TVEFURV9XQUlUX1BPUlRfTE9HSU5fQUNLCQkzCisjZGVmaW5lIFBEX1NUQVRFX1BST0NFU1NfTE9HSU4JCQk0CisjZGVmaW5lIFBEX1NUQVRFX1dBSVRfUFJPQ0VTU19MT0dJTl9BQ0sJCTUKKyNkZWZpbmUgUERfU1RBVEVfUE9SVF9MT0dHRURfSU4JCQk2CisjZGVmaW5lIFBEX1NUQVRFX1BPUlRfVU5BVkFJTEFCTEUJCTcKKyNkZWZpbmUgUERfU1RBVEVfUFJPQ0VTU19MT0dPVVQJCQk4CisjZGVmaW5lIFBEX1NUQVRFX1dBSVRfUFJPQ0VTU19MT0dPVVRfQUNLCTkKKyNkZWZpbmUgUERfU1RBVEVfUE9SVF9MT0dPVVQJCQkxMAorI2RlZmluZSBQRF9TVEFURV9XQUlUX1BPUlRfTE9HT1VUX0FDSwkJMTEKKworCisvKgorICogSVNQIEluaXRpYWxpemF0aW9uIENvbnRyb2wgQmxvY2suCisgKiBMaXR0bGUgZW5kaWFuIGV4Y2VwdCB3aGVyZSBub3RlZC4KKyAqLworI2RlZmluZQlJQ0JfVkVSU0lPTiAxCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCAgdmVyc2lvbjsKKwl1aW50OF90ICByZXNlcnZlZF8xOworCisJLyoKKwkgKiBMU0IgQklUIDAgID0gRW5hYmxlIEhhcmQgTG9vcCBJZAorCSAqIExTQiBCSVQgMSAgPSBFbmFibGUgRmFpcm5lc3MKKwkgKiBMU0IgQklUIDIgID0gRW5hYmxlIEZ1bGwtRHVwbGV4CisJICogTFNCIEJJVCAzICA9IEVuYWJsZSBGYXN0IFBvc3RpbmcKKwkgKiBMU0IgQklUIDQgID0gRW5hYmxlIFRhcmdldCBNb2RlCisJICogTFNCIEJJVCA1ICA9IERpc2FibGUgSW5pdGlhdG9yIE1vZGUKKwkgKiBMU0IgQklUIDYgID0gRW5hYmxlIEFESVNDCisJICogTFNCIEJJVCA3ICA9IEVuYWJsZSBUYXJnZXQgSW5xdWlyeSBEYXRhCisJICoKKwkgKiBNU0IgQklUIDAgID0gRW5hYmxlIFBEQkMgTm90aWZ5CisJICogTVNCIEJJVCAxICA9IE5vbiBQYXJ0aWNpcGF0aW5nIExJUAorCSAqIE1TQiBCSVQgMiAgPSBEZXNjZW5kaW5nIExvb3AgSUQgU2VhcmNoCisJICogTVNCIEJJVCAzICA9IEFjcXVpcmUgTG9vcCBJRCBpbiBMSVBBCisJICogTVNCIEJJVCA0ICA9IFN0b3AgUG9ydFEgb24gRnVsbCBTdGF0dXMKKwkgKiBNU0IgQklUIDUgID0gRnVsbCBMb2dpbiBhZnRlciBMSVAKKwkgKiBNU0IgQklUIDYgID0gTm9kZSBOYW1lIE9wdGlvbgorCSAqIE1TQiBCSVQgNyAgPSBFeHQgSUZXQ0IgZW5hYmxlIGJpdAorCSAqLworCXVpbnQ4X3QgIGZpcm13YXJlX29wdGlvbnNbMl07CisKKwl1aW50MTZfdCBmcmFtZV9wYXlsb2FkX3NpemU7CisJdWludDE2X3QgbWF4X2lvY2JfYWxsb2NhdGlvbjsKKwl1aW50MTZfdCBleGVjdXRpb25fdGhyb3R0bGU7CisJdWludDhfdCAgcmV0cnlfY291bnQ7CisJdWludDhfdAkgcmV0cnlfZGVsYXk7CQkJLyogdW51c2VkICovCisJdWludDhfdAkgcG9ydF9uYW1lW1dXTl9TSVpFXTsJCS8qIEJpZyBlbmRpYW4uICovCisJdWludDE2X3QgaGFyZF9hZGRyZXNzOworCXVpbnQ4X3QJIGlucXVpcnlfZGF0YTsKKwl1aW50OF90CSBsb2dpbl90aW1lb3V0OworCXVpbnQ4X3QJIG5vZGVfbmFtZVtXV05fU0laRV07CQkvKiBCaWcgZW5kaWFuLiAqLworCisJdWludDE2X3QgcmVxdWVzdF9xX291dHBvaW50ZXI7CisJdWludDE2X3QgcmVzcG9uc2VfcV9pbnBvaW50ZXI7CisJdWludDE2X3QgcmVxdWVzdF9xX2xlbmd0aDsKKwl1aW50MTZfdCByZXNwb25zZV9xX2xlbmd0aDsKKwl1aW50MzJfdCByZXF1ZXN0X3FfYWRkcmVzc1syXTsKKwl1aW50MzJfdCByZXNwb25zZV9xX2FkZHJlc3NbMl07CisKKwl1aW50MTZfdCBsdW5fZW5hYmxlczsKKwl1aW50OF90ICBjb21tYW5kX3Jlc291cmNlX2NvdW50OworCXVpbnQ4X3QgIGltbWVkaWF0ZV9ub3RpZnlfcmVzb3VyY2VfY291bnQ7CisJdWludDE2X3QgdGltZW91dDsKKwl1aW50OF90ICByZXNlcnZlZF8yWzJdOworCisJLyoKKwkgKiBMU0IgQklUIDAgPSBUaW1lciBPcGVyYXRpb24gbW9kZSBiaXQgMAorCSAqIExTQiBCSVQgMSA9IFRpbWVyIE9wZXJhdGlvbiBtb2RlIGJpdCAxCisJICogTFNCIEJJVCAyID0gVGltZXIgT3BlcmF0aW9uIG1vZGUgYml0IDIKKwkgKiBMU0IgQklUIDMgPSBUaW1lciBPcGVyYXRpb24gbW9kZSBiaXQgMworCSAqIExTQiBCSVQgNCA9IEluaXQgQ29uZmlnIE1vZGUgYml0IDAKKwkgKiBMU0IgQklUIDUgPSBJbml0IENvbmZpZyBNb2RlIGJpdCAxCisJICogTFNCIEJJVCA2ID0gSW5pdCBDb25maWcgTW9kZSBiaXQgMgorCSAqIExTQiBCSVQgNyA9IEVuYWJsZSBOb24gcGFydCBvbiBMSUhBIGZhaWx1cmUKKwkgKgorCSAqIE1TQiBCSVQgMCA9IEVuYWJsZSBjbGFzcyAyCisJICogTVNCIEJJVCAxID0gRW5hYmxlIEFDSzAKKwkgKiBNU0IgQklUIDIgPQorCSAqIE1TQiBCSVQgMyA9CisJICogTVNCIEJJVCA0ID0gRkMgVGFwZSBFbmFibGUKKwkgKiBNU0IgQklUIDUgPSBFbmFibGUgRkMgQ29uZmlybQorCSAqIE1TQiBCSVQgNiA9IEVuYWJsZSBjb21tYW5kIHF1ZXVpbmcgaW4gdGFyZ2V0IG1vZGUKKwkgKiBNU0IgQklUIDcgPSBObyBMb2dvIE9uIExpbmsgRG93bgorCSAqLworCXVpbnQ4X3QJIGFkZF9maXJtd2FyZV9vcHRpb25zWzJdOworCisJdWludDhfdAkgcmVzcG9uc2VfYWNjdW11bGF0aW9uX3RpbWVyOworCXVpbnQ4X3QJIGludGVycnVwdF9kZWxheV90aW1lcjsKKworCS8qCisJICogTFNCIEJJVCAwID0gRW5hYmxlIFJlYWQgeGZyX3JkeQorCSAqIExTQiBCSVQgMSA9IFNvZnQgSUQgb25seQorCSAqIExTQiBCSVQgMiA9CisJICogTFNCIEJJVCAzID0KKwkgKiBMU0IgQklUIDQgPSBGQ1AgUlNQIFBheWxvYWQgWzBdCisJICogTFNCIEJJVCA1ID0gRkNQIFJTUCBQYXlsb2FkIFsxXSAvIFNidXMgZW5hYmxlIC0gMjIwMAorCSAqIExTQiBCSVQgNiA9IEVuYWJsZSBPdXQtb2YtT3JkZXIgZnJhbWUgaGFuZGxpbmcKKwkgKiBMU0IgQklUIDcgPSBEaXNhYmxlIEF1dG9tYXRpYyBQTE9HSSBvbiBMb2NhbCBMb29wCisJICoKKwkgKiBNU0IgQklUIDAgPSBTYnVzIGVuYWJsZSAtIDIzMDAKKwkgKiBNU0IgQklUIDEgPQorCSAqIE1TQiBCSVQgMiA9CisJICogTVNCIEJJVCAzID0KKwkgKiBNU0IgQklUIDQgPQorCSAqIE1TQiBCSVQgNSA9IGVuYWJsZSA1MCBvaG0gdGVybWluYXRpb24KKwkgKiBNU0IgQklUIDYgPSBEYXRhIFJhdGUgKDIzMDAgb25seSkKKwkgKiBNU0IgQklUIDcgPSBEYXRhIFJhdGUgKDIzMDAgb25seSkKKwkgKi8KKwl1aW50OF90CSBzcGVjaWFsX29wdGlvbnNbMl07CisKKwl1aW50OF90ICByZXNlcnZlZF8zWzI2XTsKK30gaW5pdF9jYl90OworCisvKgorICogR2V0IExpbmsgU3RhdHVzIG1haWxib3ggY29tbWFuZCByZXR1cm4gYnVmZmVyLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QJbGlua19mYWlsX2NudDsKKwl1aW50MzJfdAlsb3NzX3N5bmNfY250OworCXVpbnQzMl90CWxvc3Nfc2lnX2NudDsKKwl1aW50MzJfdAlwcmltX3NlcV9lcnJfY250OworCXVpbnQzMl90CWludmFsX3htaXRfd29yZF9jbnQ7CisJdWludDMyX3QJaW52YWxfY3JjX2NudDsKK30gbGlua19zdGF0X3Q7CisKKy8qCisgKiBOVlJBTSBDb21tYW5kIHZhbHVlcy4KKyAqLworI2RlZmluZSBOVl9TVEFSVF9CSVQgICAgICAgICAgICBCSVRfMgorI2RlZmluZSBOVl9XUklURV9PUCAgICAgICAgICAgICAoQklUXzI2K0JJVF8yNCkKKyNkZWZpbmUgTlZfUkVBRF9PUCAgICAgICAgICAgICAgKEJJVF8yNitCSVRfMjUpCisjZGVmaW5lIE5WX0VSQVNFX09QICAgICAgICAgICAgIChCSVRfMjYrQklUXzI1K0JJVF8yNCkKKyNkZWZpbmUgTlZfTUFTS19PUCAgICAgICAgICAgICAgKEJJVF8yNitCSVRfMjUrQklUXzI0KQorI2RlZmluZSBOVl9ERUxBWV9DT1VOVCAgICAgICAgICAxMAorCisvKgorICogUUxvZ2ljIElTUDIxMDAsIElTUDIyMDAgYW5kIElTUDIzMDAgTlZSQU0gc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKgorCSAqIE5WUkFNIGhlYWRlcgorCSAqLworCXVpbnQ4X3QJaWRbNF07CisJdWludDhfdAludnJhbV92ZXJzaW9uOworCXVpbnQ4X3QJcmVzZXJ2ZWRfMDsKKworCS8qCisJICogTlZSQU0gUklTQyBwYXJhbWV0ZXIgYmxvY2sKKwkgKi8KKwl1aW50OF90CXBhcmFtZXRlcl9ibG9ja192ZXJzaW9uOworCXVpbnQ4X3QJcmVzZXJ2ZWRfMTsKKworCS8qCisJICogTFNCIEJJVCAwICA9IEVuYWJsZSBIYXJkIExvb3AgSWQKKwkgKiBMU0IgQklUIDEgID0gRW5hYmxlIEZhaXJuZXNzCisJICogTFNCIEJJVCAyICA9IEVuYWJsZSBGdWxsLUR1cGxleAorCSAqIExTQiBCSVQgMyAgPSBFbmFibGUgRmFzdCBQb3N0aW5nCisJICogTFNCIEJJVCA0ICA9IEVuYWJsZSBUYXJnZXQgTW9kZQorCSAqIExTQiBCSVQgNSAgPSBEaXNhYmxlIEluaXRpYXRvciBNb2RlCisJICogTFNCIEJJVCA2ICA9IEVuYWJsZSBBRElTQworCSAqIExTQiBCSVQgNyAgPSBFbmFibGUgVGFyZ2V0IElucXVpcnkgRGF0YQorCSAqCisJICogTVNCIEJJVCAwICA9IEVuYWJsZSBQREJDIE5vdGlmeQorCSAqIE1TQiBCSVQgMSAgPSBOb24gUGFydGljaXBhdGluZyBMSVAKKwkgKiBNU0IgQklUIDIgID0gRGVzY2VuZGluZyBMb29wIElEIFNlYXJjaAorCSAqIE1TQiBCSVQgMyAgPSBBY3F1aXJlIExvb3AgSUQgaW4gTElQQQorCSAqIE1TQiBCSVQgNCAgPSBTdG9wIFBvcnRRIG9uIEZ1bGwgU3RhdHVzCisJICogTVNCIEJJVCA1ICA9IEZ1bGwgTG9naW4gYWZ0ZXIgTElQCisJICogTVNCIEJJVCA2ICA9IE5vZGUgTmFtZSBPcHRpb24KKwkgKiBNU0IgQklUIDcgID0gRXh0IElGV0NCIGVuYWJsZSBiaXQKKwkgKi8KKwl1aW50OF90CSBmaXJtd2FyZV9vcHRpb25zWzJdOworCisJdWludDE2X3QgZnJhbWVfcGF5bG9hZF9zaXplOworCXVpbnQxNl90IG1heF9pb2NiX2FsbG9jYXRpb247CisJdWludDE2X3QgZXhlY3V0aW9uX3Rocm90dGxlOworCXVpbnQ4X3QJIHJldHJ5X2NvdW50OworCXVpbnQ4X3QJIHJldHJ5X2RlbGF5OwkJCS8qIHVudXNlZCAqLworCXVpbnQ4X3QJIHBvcnRfbmFtZVtXV05fU0laRV07CQkvKiBCaWcgZW5kaWFuLiAqLworCXVpbnQxNl90IGhhcmRfYWRkcmVzczsKKwl1aW50OF90CSBpbnF1aXJ5X2RhdGE7CisJdWludDhfdAkgbG9naW5fdGltZW91dDsKKwl1aW50OF90CSBub2RlX25hbWVbV1dOX1NJWkVdOwkJLyogQmlnIGVuZGlhbi4gKi8KKworCS8qCisJICogTFNCIEJJVCAwID0gVGltZXIgT3BlcmF0aW9uIG1vZGUgYml0IDAKKwkgKiBMU0IgQklUIDEgPSBUaW1lciBPcGVyYXRpb24gbW9kZSBiaXQgMQorCSAqIExTQiBCSVQgMiA9IFRpbWVyIE9wZXJhdGlvbiBtb2RlIGJpdCAyCisJICogTFNCIEJJVCAzID0gVGltZXIgT3BlcmF0aW9uIG1vZGUgYml0IDMKKwkgKiBMU0IgQklUIDQgPSBJbml0IENvbmZpZyBNb2RlIGJpdCAwCisJICogTFNCIEJJVCA1ID0gSW5pdCBDb25maWcgTW9kZSBiaXQgMQorCSAqIExTQiBCSVQgNiA9IEluaXQgQ29uZmlnIE1vZGUgYml0IDIKKwkgKiBMU0IgQklUIDcgPSBFbmFibGUgTm9uIHBhcnQgb24gTElIQSBmYWlsdXJlCisJICoKKwkgKiBNU0IgQklUIDAgPSBFbmFibGUgY2xhc3MgMgorCSAqIE1TQiBCSVQgMSA9IEVuYWJsZSBBQ0swCisJICogTVNCIEJJVCAyID0KKwkgKiBNU0IgQklUIDMgPQorCSAqIE1TQiBCSVQgNCA9IEZDIFRhcGUgRW5hYmxlCisJICogTVNCIEJJVCA1ID0gRW5hYmxlIEZDIENvbmZpcm0KKwkgKiBNU0IgQklUIDYgPSBFbmFibGUgY29tbWFuZCBxdWV1aW5nIGluIHRhcmdldCBtb2RlCisJICogTVNCIEJJVCA3ID0gTm8gTG9nbyBPbiBMaW5rIERvd24KKwkgKi8KKwl1aW50OF90CSBhZGRfZmlybXdhcmVfb3B0aW9uc1syXTsKKworCXVpbnQ4X3QJIHJlc3BvbnNlX2FjY3VtdWxhdGlvbl90aW1lcjsKKwl1aW50OF90CSBpbnRlcnJ1cHRfZGVsYXlfdGltZXI7CisKKwkvKgorCSAqIExTQiBCSVQgMCA9IEVuYWJsZSBSZWFkIHhmcl9yZHkKKwkgKiBMU0IgQklUIDEgPSBTb2Z0IElEIG9ubHkKKwkgKiBMU0IgQklUIDIgPQorCSAqIExTQiBCSVQgMyA9CisJICogTFNCIEJJVCA0ID0gRkNQIFJTUCBQYXlsb2FkIFswXQorCSAqIExTQiBCSVQgNSA9IEZDUCBSU1AgUGF5bG9hZCBbMV0gLyBTYnVzIGVuYWJsZSAtIDIyMDAKKwkgKiBMU0IgQklUIDYgPSBFbmFibGUgT3V0LW9mLU9yZGVyIGZyYW1lIGhhbmRsaW5nCisJICogTFNCIEJJVCA3ID0gRGlzYWJsZSBBdXRvbWF0aWMgUExPR0kgb24gTG9jYWwgTG9vcAorCSAqCisJICogTVNCIEJJVCAwID0gU2J1cyBlbmFibGUgLSAyMzAwCisJICogTVNCIEJJVCAxID0KKwkgKiBNU0IgQklUIDIgPQorCSAqIE1TQiBCSVQgMyA9CisJICogTVNCIEJJVCA0ID0KKwkgKiBNU0IgQklUIDUgPSBlbmFibGUgNTAgb2htIHRlcm1pbmF0aW9uCisJICogTVNCIEJJVCA2ID0gRGF0YSBSYXRlICgyMzAwIG9ubHkpCisJICogTVNCIEJJVCA3ID0gRGF0YSBSYXRlICgyMzAwIG9ubHkpCisJICovCisJdWludDhfdAkgc3BlY2lhbF9vcHRpb25zWzJdOworCisJLyogUmVzZXJ2ZWQgZm9yIGV4cGFuZGVkIFJJU0MgcGFyYW1ldGVyIGJsb2NrICovCisJdWludDhfdCByZXNlcnZlZF8yWzIyXTsKKworCS8qCisJICogTFNCIEJJVCAwID0gVHggU2Vuc2l0aXZpdHkgMUcgYml0IDAKKwkgKiBMU0IgQklUIDEgPSBUeCBTZW5zaXRpdml0eSAxRyBiaXQgMQorCSAqIExTQiBCSVQgMiA9IFR4IFNlbnNpdGl2aXR5IDFHIGJpdCAyCisJICogTFNCIEJJVCAzID0gVHggU2Vuc2l0aXZpdHkgMUcgYml0IDMKKwkgKiBMU0IgQklUIDQgPSBSeCBTZW5zaXRpdml0eSAxRyBiaXQgMAorCSAqIExTQiBCSVQgNSA9IFJ4IFNlbnNpdGl2aXR5IDFHIGJpdCAxCisJICogTFNCIEJJVCA2ID0gUnggU2Vuc2l0aXZpdHkgMUcgYml0IDIKKwkgKiBMU0IgQklUIDcgPSBSeCBTZW5zaXRpdml0eSAxRyBiaXQgMworCSAqICAgICAgICAgICAgCisJICogTVNCIEJJVCAwID0gVHggU2Vuc2l0aXZpdHkgMkcgYml0IDAKKwkgKiBNU0IgQklUIDEgPSBUeCBTZW5zaXRpdml0eSAyRyBiaXQgMQorCSAqIE1TQiBCSVQgMiA9IFR4IFNlbnNpdGl2aXR5IDJHIGJpdCAyCisJICogTVNCIEJJVCAzID0gVHggU2Vuc2l0aXZpdHkgMkcgYml0IDMKKwkgKiBNU0IgQklUIDQgPSBSeCBTZW5zaXRpdml0eSAyRyBiaXQgMAorCSAqIE1TQiBCSVQgNSA9IFJ4IFNlbnNpdGl2aXR5IDJHIGJpdCAxCisJICogTVNCIEJJVCA2ID0gUnggU2Vuc2l0aXZpdHkgMkcgYml0IDIKKwkgKiBNU0IgQklUIDcgPSBSeCBTZW5zaXRpdml0eSAyRyBiaXQgMworCSAqCisJICogTFNCIEJJVCAwID0gT3V0cHV0IFN3aW5nIDFHIGJpdCAwCisJICogTFNCIEJJVCAxID0gT3V0cHV0IFN3aW5nIDFHIGJpdCAxCisJICogTFNCIEJJVCAyID0gT3V0cHV0IFN3aW5nIDFHIGJpdCAyCisJICogTFNCIEJJVCAzID0gT3V0cHV0IEVtcGhhc2lzIDFHIGJpdCAwCisJICogTFNCIEJJVCA0ID0gT3V0cHV0IEVtcGhhc2lzIDFHIGJpdCAxCisJICogTFNCIEJJVCA1ID0gT3V0cHV0IFN3aW5nIDJHIGJpdCAwCisJICogTFNCIEJJVCA2ID0gT3V0cHV0IFN3aW5nIDJHIGJpdCAxCisJICogTFNCIEJJVCA3ID0gT3V0cHV0IFN3aW5nIDJHIGJpdCAyCisJICogICAgICAgICAgICAKKwkgKiBNU0IgQklUIDAgPSBPdXRwdXQgRW1waGFzaXMgMkcgYml0IDAKKwkgKiBNU0IgQklUIDEgPSBPdXRwdXQgRW1waGFzaXMgMkcgYml0IDEKKwkgKiBNU0IgQklUIDIgPSBPdXRwdXQgRW5hYmxlCisJICogTVNCIEJJVCAzID0KKwkgKiBNU0IgQklUIDQgPQorCSAqIE1TQiBCSVQgNSA9CisJICogTVNCIEJJVCA2ID0KKwkgKiBNU0IgQklUIDcgPQorCSAqLworCXVpbnQ4X3Qgc2VyaWFsbGlua19vcHRpb25zWzRdOworCisJLyoKKwkgKiBOVlJBTSBob3N0IHBhcmFtZXRlciBibG9jaworCSAqCisJICogTFNCIEJJVCAwID0gRW5hYmxlIHNwaW51cCBkZWxheQorCSAqIExTQiBCSVQgMSA9IERpc2FibGUgQklPUworCSAqIExTQiBCSVQgMiA9IEVuYWJsZSBNZW1vcnkgTWFwIEJJT1MKKwkgKiBMU0IgQklUIDMgPSBFbmFibGUgU2VsZWN0YWJsZSBCb290CisJICogTFNCIEJJVCA0ID0gRGlzYWJsZSBSSVNDIGNvZGUgbG9hZAorCSAqIExTQiBCSVQgNSA9IFNldCBjYWNoZSBsaW5lIHNpemUgMQorCSAqIExTQiBCSVQgNiA9IFBDSSBQYXJpdHkgRGlzYWJsZQorCSAqIExTQiBCSVQgNyA9IEVuYWJsZSBleHRlbmRlZCBsb2dnaW5nCisJICoKKwkgKiBNU0IgQklUIDAgPSBFbmFibGUgNjRiaXQgYWRkcmVzc2luZworCSAqIE1TQiBCSVQgMSA9IEVuYWJsZSBsaXAgcmVzZXQKKwkgKiBNU0IgQklUIDIgPSBFbmFibGUgbGlwIGZ1bGwgbG9naW4KKwkgKiBNU0IgQklUIDMgPSBFbmFibGUgdGFyZ2V0IHJlc2V0CisJICogTVNCIEJJVCA0ID0gRW5hYmxlIGRhdGFiYXNlIHN0b3JhZ2UKKwkgKiBNU0IgQklUIDUgPSBFbmFibGUgY2FjaGUgZmx1c2ggcmVhZAorCSAqIE1TQiBCSVQgNiA9IEVuYWJsZSBkYXRhYmFzZSBsb2FkCisJICogTVNCIEJJVCA3ID0gRW5hYmxlIGFsdGVybmF0ZSBXV04KKwkgKi8KKwl1aW50OF90IGhvc3RfcFsyXTsKKworCXVpbnQ4X3QgYm9vdF9ub2RlX25hbWVbV1dOX1NJWkVdOworCXVpbnQ4X3QgYm9vdF9sdW5fbnVtYmVyOworCXVpbnQ4X3QgcmVzZXRfZGVsYXk7CisJdWludDhfdCBwb3J0X2Rvd25fcmV0cnlfY291bnQ7CisJdWludDhfdCBib290X2lkX251bWJlcjsKKwl1aW50MTZfdCBtYXhfbHVuc19wZXJfdGFyZ2V0OworCXVpbnQ4X3QgZmNvZGVfYm9vdF9wb3J0X25hbWVbV1dOX1NJWkVdOworCXVpbnQ4X3QgYWx0ZXJuYXRlX3BvcnRfbmFtZVtXV05fU0laRV07CisJdWludDhfdCBhbHRlcm5hdGVfbm9kZV9uYW1lW1dXTl9TSVpFXTsKKworCS8qCisJICogQklUIDAgPSBTZWxlY3RpdmUgTG9naW4KKwkgKiBCSVQgMSA9IEFsdC1Cb290IEVuYWJsZQorCSAqIEJJVCAyID0KKwkgKiBCSVQgMyA9IEJvb3QgT3JkZXIgTGlzdAorCSAqIEJJVCA0ID0KKwkgKiBCSVQgNSA9IFNlbGVjdGl2ZSBMVU4KKwkgKiBCSVQgNiA9CisJICogQklUIDcgPSB1bnVzZWQKKwkgKi8KKwl1aW50OF90IGVmaV9wYXJhbWV0ZXJzOworCisJdWludDhfdCBsaW5rX2Rvd25fdGltZW91dDsKKworCXVpbnQ4X3QgYWRhcHRlcl9pZF8wWzRdOworCXVpbnQ4X3QgYWRhcHRlcl9pZF8xWzRdOworCXVpbnQ4X3QgYWRhcHRlcl9pZF8yWzRdOworCXVpbnQ4X3QgYWRhcHRlcl9pZF8zWzRdOworCisJdWludDhfdCBhbHQxX2Jvb3Rfbm9kZV9uYW1lW1dXTl9TSVpFXTsKKwl1aW50MTZfdCBhbHQxX2Jvb3RfbHVuX251bWJlcjsKKwl1aW50OF90IGFsdDJfYm9vdF9ub2RlX25hbWVbV1dOX1NJWkVdOworCXVpbnQxNl90IGFsdDJfYm9vdF9sdW5fbnVtYmVyOworCXVpbnQ4X3QgYWx0M19ib290X25vZGVfbmFtZVtXV05fU0laRV07CisJdWludDE2X3QgYWx0M19ib290X2x1bl9udW1iZXI7CisJdWludDhfdCBhbHQ0X2Jvb3Rfbm9kZV9uYW1lW1dXTl9TSVpFXTsKKwl1aW50MTZfdCBhbHQ0X2Jvb3RfbHVuX251bWJlcjsKKwl1aW50OF90IGFsdDVfYm9vdF9ub2RlX25hbWVbV1dOX1NJWkVdOworCXVpbnQxNl90IGFsdDVfYm9vdF9sdW5fbnVtYmVyOworCXVpbnQ4X3QgYWx0Nl9ib290X25vZGVfbmFtZVtXV05fU0laRV07CisJdWludDE2X3QgYWx0Nl9ib290X2x1bl9udW1iZXI7CisJdWludDhfdCBhbHQ3X2Jvb3Rfbm9kZV9uYW1lW1dXTl9TSVpFXTsKKwl1aW50MTZfdCBhbHQ3X2Jvb3RfbHVuX251bWJlcjsKKworCXVpbnQ4X3QgcmVzZXJ2ZWRfM1syXTsKKworCS8qIE9mZnNldCAyMDAtMjE1IDogTW9kZWwgTnVtYmVyICovCisJdWludDhfdCBtb2RlbF9udW1iZXJbMTZdOworCisJLyogT0VNIHJlbGF0ZWQgaXRlbXMgKi8KKwl1aW50OF90IG9lbV9zcGVjaWZpY1sxNl07CisKKwkvKgorCSAqIE5WUkFNIEFkYXB0ZXIgRmVhdHVyZXMgb2Zmc2V0IDIzMi0yMzkKKwkgKgorCSAqIExTQiBCSVQgMCA9IEV4dGVybmFsIEdCSUMKKwkgKiBMU0IgQklUIDEgPSBSaXNjIFJBTSBwYXJpdHkKKwkgKiBMU0IgQklUIDIgPSBCdWZmZXIgUGx1cyBNb2R1bGUKKwkgKiBMU0IgQklUIDMgPSBNdWx0aSBDaGlwIEFkYXB0ZXIKKwkgKiBMU0IgQklUIDQgPSBJbnRlcm5hbCBjb25uZWN0b3IKKwkgKiBMU0IgQklUIDUgPQorCSAqIExTQiBCSVQgNiA9CisJICogTFNCIEJJVCA3ID0KKwkgKgorCSAqIE1TQiBCSVQgMCA9CisJICogTVNCIEJJVCAxID0KKwkgKiBNU0IgQklUIDIgPQorCSAqIE1TQiBCSVQgMyA9CisJICogTVNCIEJJVCA0ID0KKwkgKiBNU0IgQklUIDUgPQorCSAqIE1TQiBCSVQgNiA9CisJICogTVNCIEJJVCA3ID0KKwkgKi8KKwl1aW50OF90CWFkYXB0ZXJfZmVhdHVyZXNbMl07CisKKwl1aW50OF90IHJlc2VydmVkXzRbMTZdOworCisJLyogU3Vic3lzdGVtIHZlbmRvciBJRCBmb3IgSVNQMjIwMCAqLworCXVpbnQxNl90IHN1YnN5c3RlbV92ZW5kb3JfaWRfMjIwMDsKKworCS8qIFN1YnN5c3RlbSBkZXZpY2UgSUQgZm9yIElTUDIyMDAgKi8KKwl1aW50MTZfdCBzdWJzeXN0ZW1fZGV2aWNlX2lkXzIyMDA7CisKKwl1aW50OF90CSByZXNlcnZlZF81OworCXVpbnQ4X3QJIGNoZWNrc3VtOworfSBudnJhbV90OworCisvKgorICogSVNQIHF1ZXVlIC0gcmVzcG9uc2UgcXVldWUgZW50cnkgZGVmaW5pdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QJCWRhdGFbNjBdOworCXVpbnQzMl90CXNpZ25hdHVyZTsKKyNkZWZpbmUgUkVTUE9OU0VfUFJPQ0VTU0VECTB4REVBRERFQUQJLyogU2lnbmF0dXJlICovCit9IHJlc3BvbnNlX3Q7CisKK3R5cGVkZWYgdW5pb24geworCXVpbnQxNl90IGV4dGVuZGVkOworCXN0cnVjdCB7CisJCXVpbnQ4X3QgcmVzZXJ2ZWQ7CisJCXVpbnQ4X3Qgc3RhbmRhcmQ7CisJfSBpZDsKK30gdGFyZ2V0X2lkX3Q7CisKKyNkZWZpbmUgU0VUX1RBUkdFVF9JRChoYSwgdG8sIGZyb20pCQkJXAorZG8gewkJCQkJCQlcCisJaWYgKEhBU19FWFRFTkRFRF9JRFMoaGEpKQkJCVwKKwkJdG8uZXh0ZW5kZWQgPSBjcHVfdG9fbGUxNihmcm9tKTsJXAorCWVsc2UJCQkJCQlcCisJCXRvLmlkLnN0YW5kYXJkID0gKHVpbnQ4X3QpZnJvbTsJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBJU1AgcXVldWUgLSBjb21tYW5kIGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCisjZGVmaW5lIENPTU1BTkRfVFlQRQkweDExCQkvKiBDb21tYW5kIGVudHJ5ICovCisjZGVmaW5lIE1BWF9DTURTWgkxNgkJLyogU0NTSSBtYXhpbXVtIENEQiBzaXplLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgZW50cnlfdHlwZTsJCS8qIEVudHJ5IHR5cGUuICovCisJdWludDhfdCBlbnRyeV9jb3VudDsJCS8qIEVudHJ5IGNvdW50LiAqLworCXVpbnQ4X3Qgc3lzX2RlZmluZTsJCS8qIFN5c3RlbSBkZWZpbmVkLiAqLworCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkJLyogRW50cnkgU3RhdHVzLiAqLworCXVpbnQzMl90IGhhbmRsZTsJCS8qIFN5c3RlbSBoYW5kbGUuICovCisJdGFyZ2V0X2lkX3QgdGFyZ2V0OwkJLyogU0NTSSBJRCAqLworCXVpbnQxNl90IGx1bjsJCQkvKiBTQ1NJIExVTiAqLworCXVpbnQxNl90IGNvbnRyb2xfZmxhZ3M7CQkvKiBDb250cm9sIGZsYWdzLiAqLworI2RlZmluZSBDRl9XUklURQlCSVRfNgorI2RlZmluZSBDRl9SRUFECQlCSVRfNQorI2RlZmluZSBDRl9TSU1QTEVfVEFHCUJJVF8zCisjZGVmaW5lIENGX09SREVSRURfVEFHCUJJVF8yCisjZGVmaW5lIENGX0hFQURfVEFHCUJJVF8xCisJdWludDE2X3QgcmVzZXJ2ZWRfMTsKKwl1aW50MTZfdCB0aW1lb3V0OwkJLyogQ29tbWFuZCB0aW1lb3V0LiAqLworCXVpbnQxNl90IGRzZWdfY291bnQ7CQkvKiBEYXRhIHNlZ21lbnQgY291bnQuICovCisJdWludDhfdCBzY3NpX2NkYltNQVhfQ01EU1pdOyAJLyogU0NTSSBjb21tYW5kIHdvcmRzLiAqLworCXVpbnQzMl90IGJ5dGVfY291bnQ7CQkvKiBUb3RhbCBieXRlIGNvdW50LiAqLworCXVpbnQzMl90IGRzZWdfMF9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMF9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ18xX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAxIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18xX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAxIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzJfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDIgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzJfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDIgbGVuZ3RoLiAqLworfSBjbWRfZW50cnlfdDsKKworLyoKKyAqIElTUCBxdWV1ZSAtIDY0LUJpdCBhZGRyZXNzaW5nLCBjb21tYW5kIGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCisjZGVmaW5lIENPTU1BTkRfQTY0X1RZUEUJMHgxOQkvKiBDb21tYW5kIEE2NCBlbnRyeSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgZW50cnlfdHlwZTsJCS8qIEVudHJ5IHR5cGUuICovCisJdWludDhfdCBlbnRyeV9jb3VudDsJCS8qIEVudHJ5IGNvdW50LiAqLworCXVpbnQ4X3Qgc3lzX2RlZmluZTsJCS8qIFN5c3RlbSBkZWZpbmVkLiAqLworCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkJLyogRW50cnkgU3RhdHVzLiAqLworCXVpbnQzMl90IGhhbmRsZTsJCS8qIFN5c3RlbSBoYW5kbGUuICovCisJdGFyZ2V0X2lkX3QgdGFyZ2V0OwkJLyogU0NTSSBJRCAqLworCXVpbnQxNl90IGx1bjsJCQkvKiBTQ1NJIExVTiAqLworCXVpbnQxNl90IGNvbnRyb2xfZmxhZ3M7CQkvKiBDb250cm9sIGZsYWdzLiAqLworCXVpbnQxNl90IHJlc2VydmVkXzE7CisJdWludDE2X3QgdGltZW91dDsJCS8qIENvbW1hbmQgdGltZW91dC4gKi8KKwl1aW50MTZfdCBkc2VnX2NvdW50OwkJLyogRGF0YSBzZWdtZW50IGNvdW50LiAqLworCXVpbnQ4X3Qgc2NzaV9jZGJbTUFYX0NNRFNaXTsJLyogU0NTSSBjb21tYW5kIHdvcmRzLiAqLworCXVpbnQzMl90IGJ5dGVfY291bnQ7CQkvKiBUb3RhbCBieXRlIGNvdW50LiAqLworCXVpbnQzMl90IGRzZWdfMF9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMF9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ18xX2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCAxIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18xX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAxIGxlbmd0aC4gKi8KK30gY21kX2E2NF9lbnRyeV90LCByZXF1ZXN0X3Q7CisKKy8qCisgKiBJU1AgcXVldWUgLSBjb250aW51YXRpb24gZW50cnkgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KKyNkZWZpbmUgQ09OVElOVUVfVFlQRQkJMHgwMgkvKiBDb250aW51YXRpb24gZW50cnkuICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBlbnRyeV90eXBlOwkJLyogRW50cnkgdHlwZS4gKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCBzeXNfZGVmaW5lOwkJLyogU3lzdGVtIGRlZmluZWQuICovCisJdWludDhfdCBlbnRyeV9zdGF0dXM7CQkvKiBFbnRyeSBTdGF0dXMuICovCisJdWludDMyX3QgcmVzZXJ2ZWQ7CisJdWludDMyX3QgZHNlZ18wX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAwIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18wX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzFfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzFfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfMl9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMiBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMl9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMiBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ18zX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAzIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18zX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAzIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzRfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDQgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzRfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDQgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfNV9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgNSBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfNV9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgNSBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ182X2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCA2IGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ182X2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCA2IGxlbmd0aC4gKi8KK30gY29udF9lbnRyeV90OworCisvKgorICogSVNQIHF1ZXVlIC0gNjQtQml0IGFkZHJlc3NpbmcsIGNvbnRpbnVhdGlvbiBlbnRyeSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworI2RlZmluZSBDT05USU5VRV9BNjRfVFlQRQkweDBBCS8qIENvbnRpbnVhdGlvbiBBNjQgZW50cnkuICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBlbnRyeV90eXBlOwkJLyogRW50cnkgdHlwZS4gKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCBzeXNfZGVmaW5lOwkJLyogU3lzdGVtIGRlZmluZWQuICovCisJdWludDhfdCBlbnRyeV9zdGF0dXM7CQkvKiBFbnRyeSBTdGF0dXMuICovCisJdWludDMyX3QgZHNlZ18wX2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCAwIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18wX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzFfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzFfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfMl9hZGRyZXNzCVsyXTsJLyogRGF0YSBzZWdtZW50IDIgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzJfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDIgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfM19hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMyBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfM19sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMyBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ180X2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCA0IGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ180X2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCA0IGxlbmd0aC4gKi8KK30gY29udF9hNjRfZW50cnlfdDsKKworLyoKKyAqIElTUCBxdWV1ZSAtIHN0YXR1cyBlbnRyeSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworI2RlZmluZQlTVEFUVVNfVFlQRQkweDAzCQkvKiBTdGF0dXMgZW50cnkuICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBlbnRyeV90eXBlOwkJLyogRW50cnkgdHlwZS4gKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCBzeXNfZGVmaW5lOwkJLyogU3lzdGVtIGRlZmluZWQuICovCisJdWludDhfdCBlbnRyeV9zdGF0dXM7CQkvKiBFbnRyeSBTdGF0dXMuICovCisJdWludDMyX3QgaGFuZGxlOwkJLyogU3lzdGVtIGhhbmRsZS4gKi8KKwl1aW50MTZfdCBzY3NpX3N0YXR1czsJCS8qIFNDU0kgc3RhdHVzLiAqLworCXVpbnQxNl90IGNvbXBfc3RhdHVzOwkJLyogQ29tcGxldGlvbiBzdGF0dXMuICovCisJdWludDE2X3Qgc3RhdGVfZmxhZ3M7CQkvKiBTdGF0ZSBmbGFncy4gKi8KKwl1aW50MTZfdCBzdGF0dXNfZmxhZ3M7CQkvKiBTdGF0dXMgZmxhZ3MuICovCisJdWludDE2X3QgcnNwX2luZm9fbGVuOwkJLyogUmVzcG9uc2UgSW5mbyBMZW5ndGguICovCisJdWludDE2X3QgcmVxX3NlbnNlX2xlbmd0aDsJLyogUmVxdWVzdCBzZW5zZSBkYXRhIGxlbmd0aC4gKi8KKwl1aW50MzJfdCByZXNpZHVhbF9sZW5ndGg7CS8qIFJlc2lkdWFsIHRyYW5zZmVyIGxlbmd0aC4gKi8KKwl1aW50OF90IHJzcF9pbmZvWzhdOwkJLyogRkNQIHJlc3BvbnNlIGluZm9ybWF0aW9uLiAqLworCXVpbnQ4X3QgcmVxX3NlbnNlX2RhdGFbMzJdOwkvKiBSZXF1ZXN0IHNlbnNlIGRhdGEuICovCit9IHN0c19lbnRyeV90OworCisvKgorICogU3RhdHVzIGVudHJ5IGVudHJ5IHN0YXR1cworICovCisjZGVmaW5lIFJGX0lOVl9FX09SREVSCUJJVF81CQkvKiBJbnZhbGlkIGVudHJ5IG9yZGVyLiAqLworI2RlZmluZSBSRl9JTlZfRV9DT1VOVAlCSVRfNAkJLyogSW52YWxpZCBlbnRyeSBjb3VudC4gKi8KKyNkZWZpbmUgUkZfSU5WX0VfUEFSQU0JQklUXzMJCS8qIEludmFsaWQgZW50cnkgcGFyYW1ldGVyLiAqLworI2RlZmluZSBSRl9JTlZfRV9UWVBFCUJJVF8yCQkvKiBJbnZhbGlkIGVudHJ5IHR5cGUuICovCisjZGVmaW5lIFJGX0JVU1kJCUJJVF8xCQkvKiBCdXN5ICovCisKKy8qCisgKiBTdGF0dXMgZW50cnkgU0NTSSBzdGF0dXMgYml0IGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIFNTX01BU0sJCQkJMHhmZmYJLyogUmVzZXJ2ZWQgYml0cyBCSVRfMTItQklUXzE1Ki8KKyNkZWZpbmUgU1NfUkVTSURVQUxfVU5ERVIJCUJJVF8xMQorI2RlZmluZSBTU19SRVNJRFVBTF9PVkVSCQlCSVRfMTAKKyNkZWZpbmUgU1NfU0VOU0VfTEVOX1ZBTElECQlCSVRfOQorI2RlZmluZSBTU19SRVNQT05TRV9JTkZPX0xFTl9WQUxJRAlCSVRfOAorCisjZGVmaW5lIFNTX1JFU0VSVkVfQ09ORkxJQ1QJCShCSVRfNCB8IEJJVF8zKQorI2RlZmluZSBTU19CVVNZX0NPTkRJVElPTgkJQklUXzMKKyNkZWZpbmUgU1NfQ09ORElUSU9OX01FVAkJQklUXzIKKyNkZWZpbmUgU1NfQ0hFQ0tfQ09ORElUSU9OCQlCSVRfMQorCisvKgorICogU3RhdHVzIGVudHJ5IGNvbXBsZXRpb24gc3RhdHVzCisgKi8KKyNkZWZpbmUgQ1NfQ09NUExFVEUJCTB4MAkvKiBObyBlcnJvcnMgKi8KKyNkZWZpbmUgQ1NfSU5DT01QTEVURQkJMHgxCS8qIEluY29tcGxldGUgdHJhbnNmZXIgb2YgY21kLiAqLworI2RlZmluZSBDU19ETUEJCQkweDIJLyogQSBETUEgZGlyZWN0aW9uIGVycm9yLiAqLworI2RlZmluZSBDU19UUkFOU1BPUlQJCTB4MwkvKiBUcmFuc3BvcnQgZXJyb3IuICovCisjZGVmaW5lIENTX1JFU0VUCQkweDQJLyogU0NTSSBidXMgcmVzZXQgb2NjdXJyZWQgKi8KKyNkZWZpbmUgQ1NfQUJPUlRFRAkJMHg1CS8qIFN5c3RlbSBhYm9ydGVkIGNvbW1hbmQuICovCisjZGVmaW5lIENTX1RJTUVPVVQJCTB4NgkvKiBUaW1lb3V0IGVycm9yLiAqLworI2RlZmluZSBDU19EQVRBX09WRVJSVU4JCTB4NwkvKiBEYXRhIG92ZXJydW4uICovCisKKyNkZWZpbmUgQ1NfREFUQV9VTkRFUlJVTgkweDE1CS8qIERhdGEgVW5kZXJydW4uICovCisjZGVmaW5lIENTX1FVRVVFX0ZVTEwJCTB4MUMJLyogUXVldWUgRnVsbC4gKi8KKyNkZWZpbmUgQ1NfUE9SVF9VTkFWQUlMQUJMRQkweDI4CS8qIFBvcnQgdW5hdmFpbGFibGUgKi8KKwkJCQkJLyogKHNlbGVjdGlvbiB0aW1lb3V0KSAqLworI2RlZmluZSBDU19QT1JUX0xPR0dFRF9PVVQJMHgyOQkvKiBQb3J0IExvZ2dlZCBPdXQgKi8KKyNkZWZpbmUgQ1NfUE9SVF9DT05GSUdfQ0hHCTB4MkEJLyogUG9ydCBDb25maWd1cmF0aW9uIENoYW5nZWQgKi8KKyNkZWZpbmUgQ1NfUE9SVF9CVVNZCQkweDJCCS8qIFBvcnQgQnVzeSAqLworI2RlZmluZSBDU19DT01QTEVURV9DSEtDT05ECTB4MzAJLyogRXJyb3I/ICovCisjZGVmaW5lIENTX0JBRF9QQVlMT0FECQkweDgwCS8qIERyaXZlciBkZWZpbmVkICovCisjZGVmaW5lIENTX1VOS05PV04JCTB4ODEJLyogRHJpdmVyIGRlZmluZWQgKi8KKyNkZWZpbmUgQ1NfUkVUUlkJCTB4ODIJLyogRHJpdmVyIGRlZmluZWQgKi8KKyNkZWZpbmUgQ1NfTE9PUF9ET1dOX0FCT1JUCTB4ODMJLyogRHJpdmVyIGRlZmluZWQgKi8KKworLyoKKyAqIFN0YXR1cyBlbnRyeSBzdGF0dXMgZmxhZ3MKKyAqLworI2RlZmluZSBTRl9BQlRTX1RFUk1JTkFURUQJQklUXzEwCisjZGVmaW5lIFNGX0xPR09VVF9TRU5UCQlCSVRfMTMKKworLyoKKyAqIElTUCBxdWV1ZSAtIHN0YXR1cyBjb250aW51YXRpb24gZW50cnkgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KKyNkZWZpbmUJU1RBVFVTX0NPTlRfVFlQRQkweDEwCS8qIFN0YXR1cyBjb250aW51YXRpb24gZW50cnkuICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBlbnRyeV90eXBlOwkJLyogRW50cnkgdHlwZS4gKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCBzeXNfZGVmaW5lOwkJLyogU3lzdGVtIGRlZmluZWQuICovCisJdWludDhfdCBlbnRyeV9zdGF0dXM7CQkvKiBFbnRyeSBTdGF0dXMuICovCisJdWludDhfdCBkYXRhWzYwXTsJCS8qIGRhdGEgKi8KK30gc3RzX2NvbnRfZW50cnlfdDsKKworLyoKKyAqIElTUCBxdWV1ZSAtCVJJTyBUeXBlIDEgc3RhdHVzIGVudHJ5ICgzMiBiaXQgSS9PIGVudHJ5IGhhbmRsZXMpCisgKgkJc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KKyNkZWZpbmUJU1RBVFVTX1RZUEVfMjEgMHgyMQkJLyogU3RhdHVzIGVudHJ5LiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgZW50cnlfdHlwZTsJCS8qIEVudHJ5IHR5cGUuICovCisJdWludDhfdCBlbnRyeV9jb3VudDsJCS8qIEVudHJ5IGNvdW50LiAqLworCXVpbnQ4X3QgaGFuZGxlX2NvdW50OwkJLyogSGFuZGxlIGNvdW50LiAqLworCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkJLyogRW50cnkgU3RhdHVzLiAqLworCXVpbnQzMl90IGhhbmRsZVsxNV07CQkvKiBTeXN0ZW0gaGFuZGxlcy4gKi8KK30gc3RzMjFfZW50cnlfdDsKKworLyoKKyAqIElTUCBxdWV1ZSAtCVJJTyBUeXBlIDIgc3RhdHVzIGVudHJ5ICgxNiBiaXQgSS9PIGVudHJ5IGhhbmRsZXMpCisgKgkJc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KKyNkZWZpbmUJU1RBVFVTX1RZUEVfMjIJMHgyMgkJLyogU3RhdHVzIGVudHJ5LiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgZW50cnlfdHlwZTsJCS8qIEVudHJ5IHR5cGUuICovCisJdWludDhfdCBlbnRyeV9jb3VudDsJCS8qIEVudHJ5IGNvdW50LiAqLworCXVpbnQ4X3QgaGFuZGxlX2NvdW50OwkJLyogSGFuZGxlIGNvdW50LiAqLworCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkJLyogRW50cnkgU3RhdHVzLiAqLworCXVpbnQxNl90IGhhbmRsZVszMF07CQkvKiBTeXN0ZW0gaGFuZGxlcy4gKi8KK30gc3RzMjJfZW50cnlfdDsKKworLyoKKyAqIElTUCBxdWV1ZSAtIG1hcmtlciBlbnRyeSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworI2RlZmluZSBNQVJLRVJfVFlQRQkweDA0CQkvKiBNYXJrZXIgZW50cnkuICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBlbnRyeV90eXBlOwkJLyogRW50cnkgdHlwZS4gKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCBoYW5kbGVfY291bnQ7CQkvKiBIYW5kbGUgY291bnQuICovCisJdWludDhfdCBlbnRyeV9zdGF0dXM7CQkvKiBFbnRyeSBTdGF0dXMuICovCisJdWludDMyX3Qgc3lzX2RlZmluZV8yOwkJLyogU3lzdGVtIGRlZmluZWQuICovCisJdGFyZ2V0X2lkX3QgdGFyZ2V0OwkJLyogU0NTSSBJRCAqLworCXVpbnQ4X3QgbW9kaWZpZXI7CQkvKiBNb2RpZmllciAoNy0wKS4gKi8KKyNkZWZpbmUgTUtfU1lOQ19JRF9MVU4JMAkJLyogU3luY2hyb25pemUgSUQvTFVOICovCisjZGVmaW5lIE1LX1NZTkNfSUQJMQkJLyogU3luY2hyb25pemUgSUQgKi8KKyNkZWZpbmUgTUtfU1lOQ19BTEwJMgkJLyogU3luY2hyb25pemUgYWxsIElEL0xVTiAqLworI2RlZmluZSBNS19TWU5DX0xJUAkzCQkvKiBTeW5jaHJvbml6ZSBhbGwgSUQvTFVOLCAqLworCQkJCQkvKiBjbGVhciBwb3J0IGNoYW5nZWQsICovCisJCQkJCS8qIHVzZSBzZXF1ZW5jZSBudW1iZXIuICovCisJdWludDhfdCByZXNlcnZlZF8xOworCXVpbnQxNl90IHNlcXVlbmNlX251bWJlcjsJLyogU2VxdWVuY2UgbnVtYmVyIG9mIGV2ZW50ICovCisJdWludDE2X3QgbHVuOwkJCS8qIFNDU0kgTFVOICovCisJdWludDhfdCByZXNlcnZlZF8yWzQ4XTsKK30gbXJrX2VudHJ5X3Q7CisKKy8qCisgKiBJU1AgcXVldWUgLSBNYW5hZ2VtZW50IFNlcnZlciBlbnRyeSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworI2RlZmluZSBNU19JT0NCX1RZUEUJCTB4MjkJLyogTWFuYWdlbWVudCBTZXJ2ZXIgSU9DQiBlbnRyeSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgZW50cnlfdHlwZTsJCS8qIEVudHJ5IHR5cGUuICovCisJdWludDhfdCBlbnRyeV9jb3VudDsJCS8qIEVudHJ5IGNvdW50LiAqLworCXVpbnQ4X3QgaGFuZGxlX2NvdW50OwkJLyogSGFuZGxlIGNvdW50LiAqLworCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkJLyogRW50cnkgU3RhdHVzLiAqLworCXVpbnQzMl90IGhhbmRsZTE7CQkvKiBTeXN0ZW0gaGFuZGxlLiAqLworCXRhcmdldF9pZF90IGxvb3BfaWQ7CisJdWludDE2X3Qgc3RhdHVzOworCXVpbnQxNl90IGNvbnRyb2xfZmxhZ3M7CQkvKiBDb250cm9sIGZsYWdzLiAqLworCXVpbnQxNl90IHJlc2VydmVkMjsKKwl1aW50MTZfdCB0aW1lb3V0OworCXVpbnQxNl90IGNtZF9kc2RfY291bnQ7CisJdWludDE2X3QgdG90YWxfZHNkX2NvdW50OworCXVpbnQ4X3QgdHlwZTsKKwl1aW50OF90IHJfY3RsOworCXVpbnQxNl90IHJ4X2lkOworCXVpbnQxNl90IHJlc2VydmVkMzsKKwl1aW50MzJfdCBoYW5kbGUyOworCXVpbnQzMl90IHJzcF9ieXRlY291bnQ7CisJdWludDMyX3QgcmVxX2J5dGVjb3VudDsKKwl1aW50MzJfdCBkc2VnX3JlcV9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfcmVxX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDAgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfcnNwX2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCAxIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ19yc3BfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMSBsZW5ndGguICovCit9IG1zX2lvY2JfZW50cnlfdDsKKworCisvKgorICogSVNQIHF1ZXVlIC0gTWFpbGJveCBDb21tYW5kIGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCisjZGVmaW5lIE1CWF9JT0NCX1RZUEUJMHgzOQorc3RydWN0IG1ieF9lbnRyeSB7CisJdWludDhfdCBlbnRyeV90eXBlOworCXVpbnQ4X3QgZW50cnlfY291bnQ7CisJdWludDhfdCBzeXNfZGVmaW5lMTsKKwkvKiBVc2Ugc3lzX2RlZmluZTEgZm9yIHNvdXJjZSB0eXBlICovCisjZGVmaW5lIFNPVVJDRV9TQ1NJCTB4MDAKKyNkZWZpbmUgU09VUkNFX0lQCTB4MDEKKyNkZWZpbmUgU09VUkNFX1ZJCTB4MDIKKyNkZWZpbmUgU09VUkNFX1NDVFAJMHgwMworI2RlZmluZSBTT1VSQ0VfTVAJMHgwNAorI2RlZmluZSBTT1VSQ0VfTVBJT0NUTAkweDA1CisjZGVmaW5lIFNPVVJDRV9BU1lOQ19JT0NCIDB4MDcKKworCXVpbnQ4X3QgZW50cnlfc3RhdHVzOworCisJdWludDMyX3QgaGFuZGxlOworCXRhcmdldF9pZF90IGxvb3BfaWQ7CisKKwl1aW50MTZfdCBzdGF0dXM7CisJdWludDE2X3Qgc3RhdGVfZmxhZ3M7CisJdWludDE2X3Qgc3RhdHVzX2ZsYWdzOworCisJdWludDMyX3Qgc3lzX2RlZmluZTJbMl07CisKKwl1aW50MTZfdCBtYjA7CisJdWludDE2X3QgbWIxOworCXVpbnQxNl90IG1iMjsKKwl1aW50MTZfdCBtYjM7CisJdWludDE2X3QgbWI2OworCXVpbnQxNl90IG1iNzsKKwl1aW50MTZfdCBtYjk7CisJdWludDE2X3QgbWIxMDsKKwl1aW50MzJfdCByZXNlcnZlZF8yWzJdOworCXVpbnQ4X3Qgbm9kZV9uYW1lW1dXTl9TSVpFXTsKKwl1aW50OF90IHBvcnRfbmFtZVtXV05fU0laRV07Cit9OworCisvKgorICogSVNQIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHF1ZXVlIGVudHJ5IHNpemVzCisgKi8KKyNkZWZpbmUgUkVTUE9OU0VfRU5UUllfU0laRQkoc2l6ZW9mKHJlc3BvbnNlX3QpKQorI2RlZmluZSBSRVFVRVNUX0VOVFJZX1NJWkUJKHNpemVvZihyZXF1ZXN0X3QpKQorCisKKy8qCisgKiAyNCBiaXQgcG9ydCBJRCB0eXBlIGRlZmluaXRpb24uCisgKi8KK3R5cGVkZWYgdW5pb24geworCXVpbnQzMl90IGIyNCA6IDI0OworCisJc3RydWN0IHsKKwkJdWludDhfdCBkX2lkWzNdOworCQl1aW50OF90IHJzdmRfMTsKKwl9IHI7CisKKwlzdHJ1Y3QgeworCQl1aW50OF90IGFsX3BhOworCQl1aW50OF90IGFyZWE7CisJCXVpbnQ4X3QgZG9tYWluOworCQl1aW50OF90IHJzdmRfMTsKKwl9IGI7Cit9IHBvcnRfaWRfdDsKKyNkZWZpbmUgSU5WQUxJRF9QT1JUX0lECTB4RkZGRkZGCisKKy8qCisgKiBTd2l0Y2ggaW5mbyBnYXRoZXJpbmcgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJcG9ydF9pZF90IGRfaWQ7CisJdWludDhfdCBub2RlX25hbWVbV1dOX1NJWkVdOworCXVpbnQ4X3QgcG9ydF9uYW1lW1dXTl9TSVpFXTsKKwl1aW50MzJfdCB0eXBlOworI2RlZmluZSBTV19UWVBFX0lQCUJJVF8xCisjZGVmaW5lIFNXX1RZUEVfU0NTSQlCSVRfMAorfSBzd19pbmZvX3Q7CisKKy8qCisgKiBJbnF1aXJ5IGNvbW1hbmQgc3RydWN0dXJlLgorICovCisjZGVmaW5lIElOUV9EQVRBX1NJWkUJMzYKKworLyoKKyAqIElucXVpcnkgbWFpbGJveCBJT0NCIHBhY2tldCBkZWZpbml0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5pb24geworCQljbWRfYTY0X2VudHJ5X3QgY21kOworCQlzdHNfZW50cnlfdCByc3A7CisJfSBwOworCXVpbnQ4X3QgaW5xW0lOUV9EQVRBX1NJWkVdOworfSBpbnFfY21kX3JzcF90OworCisvKgorICogUmVwb3J0IExVTiBjb21tYW5kIHN0cnVjdHVyZS4KKyAqLworI2RlZmluZSBDSEFSX1RPX1NIT1JUKGEsIGIpCSh1aW50MTZfdCkoKHVpbnQ4X3QpYiA8PCA4IHwgKHVpbnQ4X3QpYSkKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IGxlbjsKKwl1aW50MzJfdCByc3J2OworfSBycHRfaGRyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgeworCQl1aW50OF90IGIgOiA2OworCQl1aW50OF90IGFkZHJlc3NfbWV0aG9kIDogMjsKKwl9IG1zYjsKKwl1aW50OF90IGxzYjsKKwl1aW50OF90IHVudXNlZFs2XTsKK30gcnB0X2x1bl90OworCit0eXBlZGVmIHN0cnVjdCB7CisJcnB0X2hkcl90IGhkcjsKKwlycHRfbHVuX3QgbHN0W01BWF9MVU5TXTsKK30gcnB0X2x1bl9sc3RfdDsKKworLyoKKyAqIFJlcG9ydCBMdW4gbWFpbGJveCBJT0NCIHBhY2tldCBkZWZpbml0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5pb24geworCQljbWRfYTY0X2VudHJ5X3QgY21kOworCQlzdHNfZW50cnlfdCByc3A7CisJfSBwOworCXJwdF9sdW5fbHN0X3QgbGlzdDsKK30gcnB0X2x1bl9jbWRfcnNwX3Q7CisKKy8qCisgKiBTQ1NJIFRhcmdldCBRdWV1ZSBzdHJ1Y3R1cmUKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgb3NfdGd0IHsKKwlzdHJ1Y3Qgb3NfbHVuICpvbHVuW01BWF9MVU5TXTsgLyogTFVOIGNvbnRleHQgcG9pbnRlci4gKi8KKwlzdHJ1Y3QgZmNfcG9ydCAqZmNwb3J0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWludDhfdCBwb3J0X2Rvd25fcmV0cnlfY291bnQ7CisgICAgCXVpbnQzMl90IGRvd25fdGltZXI7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCisJLyogUGVyc2lzdGVudCBiaW5kaW5nIGluZm9ybWF0aW9uICovCisJcG9ydF9pZF90IGRfaWQ7CisJdWludDhfdCBub2RlX25hbWVbV1dOX1NJWkVdOworCXVpbnQ4X3QgcG9ydF9uYW1lW1dXTl9TSVpFXTsKK30gb3NfdGd0X3Q7CisKKy8qCisgKiBTQ1NJIFRhcmdldCBRdWV1ZSBmbGFncworICovCisjZGVmaW5lIFRRRl9PTkxJTkUJCTAJCS8qIERldmljZSBvbmxpbmUgdG8gT1MuICovCisjZGVmaW5lIFRRRl9TVVNQRU5ERUQJCTEKKyNkZWZpbmUgVFFGX1JFVFJZX0NNRFMJCTIKKworLyoKKyAqIFNDU0kgTFVOIFF1ZXVlIHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdCBvc19sdW4geworCXN0cnVjdCBmY19sdW4gKmZjbHVuOwkJLyogRkMgTFVOIGNvbnRleHQgcG9pbnRlci4gKi8KKyAgICAJc3BpbmxvY2tfdCBxX2xvY2s7CQkvKiBMdW4gTG9jayAqLworCisJdW5zaWduZWQgbG9uZyBxX2ZsYWc7CisjZGVmaW5lIExVTl9NUElPX1JFU0VUX0NOVFMJMQkvKiBMdW4gKi8KKyNkZWZpbmUgTFVOX01QSU9fQlVTWQkJMgkvKiBMdW4gaXMgY2hhbmdpbmcgcGF0aHMgICovCisjZGVmaW5lIExVTl9FWEVDX0RFTEFZRUQJNwkvKiBMdW4gZXhlY3V0aW9uIGlzIGRlbGF5ZWQgKi8KKworCXVfbG9uZyBxX3RpbWVvdXQ7CQkvKiB0b3RhbCBjb21tYW5kIHRpbWVvdXRzICovCisJYXRvbWljX3QgcV90aW1lcjsJCS8qIHN1c3BlbmQgdGltZXIgKi8KKwl1aW50MzJfdCBxX2NvdW50OwkJLyogY3VycmVudCBjb3VudCAqLworCXVpbnQzMl90IHFfbWF4OwkJCS8qIG1heG11bSBjb3VudCBsdW4gY2FuIGJlIHN1c3BlbmRlZCAqLworCXVpbnQ4X3QgcV9zdGF0ZTsJCS8qIGx1biBTdGF0ZSAqLworI2RlZmluZSBMVU5fU1RBVEVfUkVBRFkJCTEJLyogbHVuIGlzIHJlYWR5IGZvciBpL28gKi8KKyNkZWZpbmUgTFVOX1NUQVRFX1JVTgkJMgkvKiBsdW4gaGFzIGEgdGltZXIgcnVubmluZyAqLworI2RlZmluZSBMVU5fU1RBVEVfV0FJVAkJMwkvKiBsdW4gaXMgc3VzcGVuZGVkICovCisjZGVmaW5lIExVTl9TVEFURV9USU1FT1VUCTQJLyogbHVuIGhhcyB0aW1lZCBvdXQgKi8KKworCXVfbG9uZyBpb19jbnQ7CQkJLyogdG90YWwgeGZlciBjb3VudCBzaW5jZSBib290ICovCisJdV9sb25nIG91dF9jbnQ7CQkJLyogdG90YWwgb3V0c3RhbmRpbmcgSU8gY291bnQgKi8KKwl1X2xvbmcgd19jbnQ7CQkJLyogdG90YWwgd3JpdGVzICovCisJdV9sb25nIHJfY250OwkJCS8qIHRvdGFsIHJlYWRzICovCisJdV9sb25nIGF2Z190aW1lOwkJLyogICovCit9IG9zX2x1bl90OworCisKKy8qIExVTiBCaXRNYXNrIHN0cnVjdHVyZSBkZWZpbml0aW9uLCBhcnJheSBvZiAzMmJpdCB3b3JkcywKKyAqIDEgYml0IHBlciBsdW4uICBXaGVuIGJpdCA9PSAxLCB0aGUgbHVuIGlzIG1hc2tlZC4KKyAqIE1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIG1hc2tbMF0gaXMgbHVuIDAsIGJpdCAyNCBpcyBsdW4gNy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbHVuX2JpdF9tYXNrIHsKKwkvKiBNdXN0IGFsbG9jYXRlIGF0IGxlYXN0IGVub3VnaCBiaXRzIHRvIGFjY29tb2RhdGUgYWxsIExVTnMgKi8KKyNpZiAoKE1BWF9GSUJSRV9MVU5TICYgMHg3KSA9PSAwKQorCXVpbnQ4X3QgbWFza1tNQVhfRklCUkVfTFVOUyA+PiAzXTsKKyNlbHNlCisJdWludDhfdCBtYXNrWyhNQVhfRklCUkVfTFVOUyArIDgpID4+IDNdOworI2VuZGlmCit9IGx1bl9iaXRfbWFza190OworCisvKgorICogRmlicmUgY2hhbm5lbCBwb3J0IHR5cGUuCisgKi8KKyB0eXBlZGVmIGVudW0geworCUZDVF9VTktOT1dOLAorCUZDVF9SU0NOLAorCUZDVF9TV0lUQ0gsCisJRkNUX0JST0FEQ0FTVCwKKwlGQ1RfSU5JVElBVE9SLAorCUZDVF9UQVJHRVQKK30gZmNfcG9ydF90eXBlX3Q7CisKKy8qCisgKiBGaWJyZSBjaGFubmVsIHBvcnQgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBmY19wb3J0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBmY2x1bnM7CisKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZpc19oYTsJLyogb25seSB1c2VkIHdoZW4gc3VzcGVuZGluZyBsdW4gKi8KKworCXVpbnQ4X3Qgbm9kZV9uYW1lW1dXTl9TSVpFXTsKKwl1aW50OF90IHBvcnRfbmFtZVtXV05fU0laRV07CisJcG9ydF9pZF90IGRfaWQ7CisJdWludDE2X3QgbG9vcF9pZDsKKwl1aW50MTZfdCBvbGRfbG9vcF9pZDsKKworCWZjX3BvcnRfdHlwZV90IHBvcnRfdHlwZTsKKworCWF0b21pY190IHN0YXRlOworCXVpbnQzMl90IGZsYWdzOworCisJb3NfdGd0X3QgKnRndF9xdWV1ZTsKKwl1aW50MTZfdCBvc190YXJnZXRfaWQ7CisKKwl1aW50MTZfdCBpb2Rlc2NfaWR4X3NlbnQ7CisKKwlpbnQgcG9ydF9sb2dpbl9yZXRyeV9jb3VudDsKKwlpbnQgbG9naW5fcmV0cnk7CisJYXRvbWljX3QgcG9ydF9kb3duX3RpbWVyOworCisJdWludDhfdCBkZXZpY2VfdHlwZTsKKwl1aW50OF90IHVudXNlZDsKKworCXVpbnQ4X3QgbXBfYnl0ZTsJCS8qIG11bHRpLXBhdGggYnl0ZSAobm90IHVzZWQpICovCisgICAgCXVpbnQ4X3QgY3VyX3BhdGg7CQkvKiBjdXJyZW50IHBhdGggaWQgKi8KKworCWx1bl9iaXRfbWFza190IGx1bl9tYXNrOworfSBmY19wb3J0X3Q7CisKKy8qCisgKiBGaWJyZSBjaGFubmVsIHBvcnQvbHVuIHN0YXRlcy4KKyAqLworI2RlZmluZSBGQ1NfVU5DT05GSUdVUkVECTEKKyNkZWZpbmUgRkNTX0RFVklDRV9ERUFECQkyCisjZGVmaW5lIEZDU19ERVZJQ0VfTE9TVAkJMworI2RlZmluZSBGQ1NfT05MSU5FCQk0CisjZGVmaW5lIEZDU19OT1RfU1VQUE9SVEVECTUKKyNkZWZpbmUgRkNTX0ZBSUxPVkVSCQk2CisjZGVmaW5lIEZDU19GQUlMT1ZFUl9GQUlMRUQJNworCisvKgorICogRkMgcG9ydCBmbGFncy4KKyAqLworI2RlZmluZSBGQ0ZfRkFCUklDX0RFVklDRQlCSVRfMAorI2RlZmluZSBGQ0ZfTE9HSU5fTkVFREVECUJJVF8xCisjZGVmaW5lIEZDRl9GT19NQVNLRUQJCUJJVF8yCisjZGVmaW5lIEZDRl9GQUlMT1ZFUl9ORUVERUQJQklUXzMKKyNkZWZpbmUgRkNGX1JFU0VUX05FRURFRAlCSVRfNAorI2RlZmluZSBGQ0ZfUEVSU0lTVEVOVF9CT1VORAlCSVRfNQorI2RlZmluZSBGQ0ZfVEFQRV9QUkVTRU5UCUJJVF82CisjZGVmaW5lIEZDRl9GQVJQX0RPTkUJCUJJVF83CisjZGVmaW5lIEZDRl9GQVJQX0ZBSUxFRAkJQklUXzgKKyNkZWZpbmUgRkNGX0ZBUlBfUkVQTFlfTkVFREVECUJJVF85CisjZGVmaW5lIEZDRl9BVVRIX1JFUQkJQklUXzEwCisjZGVmaW5lIEZDRl9TRU5EX0FVVEhfUkVRCUJJVF8xMQorI2RlZmluZSBGQ0ZfUkVDRUlWRV9BVVRIX1JFUQlCSVRfMTIKKyNkZWZpbmUgRkNGX0FVVEhfU1VDQ0VTUwlCSVRfMTMKKyNkZWZpbmUgRkNGX1JMQ19TVVBQT1JUCQlCSVRfMTQKKyNkZWZpbmUgRkNGX0NPTkZJRwkJQklUXzE1CS8qIE5lZWRlZD8gKi8KKyNkZWZpbmUgRkNGX1JFU0NBTl9ORUVERUQJQklUXzE2CisjZGVmaW5lIEZDRl9YUF9ERVZJQ0UJCUJJVF8xNworI2RlZmluZSBGQ0ZfTVNBX0RFVklDRQkJQklUXzE4CisjZGVmaW5lIEZDRl9FVkFfREVWSUNFCQlCSVRfMTkKKyNkZWZpbmUgRkNGX01TQV9QT1JUX0FDVElWRQlCSVRfMjAKKyNkZWZpbmUgRkNGX0ZBSUxCQUNLX0RJU0FCTEUJQklUXzIxCisjZGVmaW5lIEZDRl9GQUlMT1ZFUl9ESVNBQkxFCUJJVF8yMgorI2RlZmluZSBGQ0ZfRFNYWFhfREVWSUNFCUJJVF8yMworI2RlZmluZSBGQ0ZfQUFfRVZBX0RFVklDRQlCSVRfMjQKKworLyogTm8gbG9vcCBJRCBmbGFnLiAqLworI2RlZmluZSBGQ19OT19MT09QX0lECQkweDEwMDAKKworLyoKKyAqIEZpYnJlIGNoYW5uZWwgTFVOIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZmNfbHVuIHsKKyAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJZmNfcG9ydF90ICpmY3BvcnQ7CisJZmNfcG9ydF90ICpvX2ZjcG9ydDsKKwl1aW50MTZfdCBsdW47CisJYXRvbWljX3Qgc3RhdGU7CisJdWludDhfdCBkZXZpY2VfdHlwZTsKKworCXVpbnQ4X3QgbWF4X3BhdGhfcmV0cmllczsKKwl1aW50MzJfdCBmbGFnczsKK30gZmNfbHVuX3Q7CisKKyNkZWZpbmUJRkxGX1ZJU0lCTEVfTFVOCQlCSVRfMAorI2RlZmluZQlGTEZfQUNUSVZFX0xVTgkJQklUXzEKKworLyoKKyAqIEZDLUNUIGludGVyZmFjZQorICoKKyAqIE5PVEU6IEFsbCBzdHJ1Y3R1cmVzIGFyZSBiaWctZW5kaWFuIGluIGZvcm0uCisgKi8KKworI2RlZmluZSBDVF9SRUpFQ1RfUkVTUE9OU0UJMHg4MDAxCisjZGVmaW5lIENUX0FDQ0VQVF9SRVNQT05TRQkweDgwMDIKKworI2RlZmluZSBOU19OX1BPUlRfVFlQRQkweDAxCisjZGVmaW5lIE5TX05MX1BPUlRfVFlQRQkweDAyCisjZGVmaW5lIE5TX05YX1BPUlRfVFlQRQkweDdGCisKKyNkZWZpbmUJR0FfTlhUX0NNRAkweDEwMAorI2RlZmluZQlHQV9OWFRfUkVRX1NJWkUJKDE2ICsgNCkKKyNkZWZpbmUJR0FfTlhUX1JTUF9TSVpFCSgxNiArIDYyMCkKKworI2RlZmluZQlHSURfUFRfQ01ECTB4MUExCisjZGVmaW5lCUdJRF9QVF9SRVFfU0laRQkoMTYgKyA0KQorI2RlZmluZQlHSURfUFRfUlNQX1NJWkUJKDE2ICsgKE1BWF9GSUJSRV9ERVZJQ0VTICogNCkpCisKKyNkZWZpbmUJR1BOX0lEX0NNRAkweDExMgorI2RlZmluZQlHUE5fSURfUkVRX1NJWkUJKDE2ICsgNCkKKyNkZWZpbmUJR1BOX0lEX1JTUF9TSVpFCSgxNiArIDgpCisKKyNkZWZpbmUJR05OX0lEX0NNRAkweDExMworI2RlZmluZQlHTk5fSURfUkVRX1NJWkUJKDE2ICsgNCkKKyNkZWZpbmUJR05OX0lEX1JTUF9TSVpFCSgxNiArIDgpCisKKyNkZWZpbmUJR0ZUX0lEX0NNRAkweDExNworI2RlZmluZQlHRlRfSURfUkVRX1NJWkUJKDE2ICsgNCkKKyNkZWZpbmUJR0ZUX0lEX1JTUF9TSVpFCSgxNiArIDMyKQorCisjZGVmaW5lCVJGVF9JRF9DTUQJMHgyMTcKKyNkZWZpbmUJUkZUX0lEX1JFUV9TSVpFCSgxNiArIDQgKyAzMikKKyNkZWZpbmUJUkZUX0lEX1JTUF9TSVpFCTE2CisKKyNkZWZpbmUJUkZGX0lEX0NNRAkweDIxRgorI2RlZmluZQlSRkZfSURfUkVRX1NJWkUJKDE2ICsgNCArIDIgKyAxICsgMSkKKyNkZWZpbmUJUkZGX0lEX1JTUF9TSVpFCTE2CisKKyNkZWZpbmUJUk5OX0lEX0NNRAkweDIxMworI2RlZmluZQlSTk5fSURfUkVRX1NJWkUJKDE2ICsgNCArIDgpCisjZGVmaW5lCVJOTl9JRF9SU1BfU0laRQkxNgorCisjZGVmaW5lCVJTTk5fTk5fQ01ECSAweDIzOQorI2RlZmluZQlSU05OX05OX1JFUV9TSVpFICgxNiArIDggKyAxICsgMjU1KQorI2RlZmluZQlSU05OX05OX1JTUF9TSVpFIDE2CisKKy8qIENUIGNvbW1hbmQgaGVhZGVyIC0tIHJlcXVlc3QvcmVzcG9uc2UgY29tbW9uIGZpZWxkcyAqLworc3RydWN0IGN0X2NtZF9oZHIgeworCXVpbnQ4X3QgcmV2aXNpb247CisJdWludDhfdCBpbl9pZFszXTsKKwl1aW50OF90IGdzX3R5cGU7CisJdWludDhfdCBnc19zdWJ0eXBlOworCXVpbnQ4X3Qgb3B0aW9uczsKKwl1aW50OF90IHJlc2VydmVkOworfTsKKworLyogQ1QgY29tbWFuZCByZXF1ZXN0ICovCitzdHJ1Y3QgY3Rfc25zX3JlcSB7CisJc3RydWN0IGN0X2NtZF9oZHIgaGVhZGVyOworCXVpbnQxNl90IGNvbW1hbmQ7CisJdWludDE2X3QgbWF4X3JzcF9zaXplOworCXVpbnQ4X3QgZnJhZ21lbnRfaWQ7CisJdWludDhfdCByZXNlcnZlZFszXTsKKworCXVuaW9uIHsKKwkJLyogR0FfTlhULCBHUE5fSUQsIEdOTl9JRCwgR0ZUX0lEICovCisJCXN0cnVjdCB7CisJCQl1aW50OF90IHJlc2VydmVkOworCQkJdWludDhfdCBwb3J0X2lkWzNdOworCQl9IHBvcnRfaWQ7CisKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgcG9ydF90eXBlOworCQkJdWludDhfdCBkb21haW47CisJCQl1aW50OF90IGFyZWE7CisJCQl1aW50OF90IHJlc2VydmVkOworCQl9IGdpZF9wdDsKKworCQlzdHJ1Y3QgeworCQkJdWludDhfdCByZXNlcnZlZDsKKwkJCXVpbnQ4X3QgcG9ydF9pZFszXTsKKwkJCXVpbnQ4X3QgZmM0X3R5cGVzWzMyXTsKKwkJfSByZnRfaWQ7CisKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgcmVzZXJ2ZWQ7CisJCQl1aW50OF90IHBvcnRfaWRbM107CisJCQl1aW50MTZfdCByZXNlcnZlZDI7CisJCQl1aW50OF90IGZjNF9mZWF0dXJlOworCQkJdWludDhfdCBmYzRfdHlwZTsKKwkJfSByZmZfaWQ7CisKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgcmVzZXJ2ZWQ7CisJCQl1aW50OF90IHBvcnRfaWRbM107CisJCQl1aW50OF90IG5vZGVfbmFtZVs4XTsKKwkJfSBybm5faWQ7CisKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3Qgbm9kZV9uYW1lWzhdOworCQkJdWludDhfdCBuYW1lX2xlbjsKKwkJCXVpbnQ4X3Qgc3ltX25vZGVfbmFtZVsyNTVdOworCQl9IHJzbm5fbm47CisJfSByZXE7Cit9OworCisvKiBDVCBjb21tYW5kIHJlc3BvbnNlIGhlYWRlciAqLworc3RydWN0IGN0X3JzcF9oZHIgeworCXN0cnVjdCBjdF9jbWRfaGRyIGhlYWRlcjsKKwl1aW50MTZfdCByZXNwb25zZTsKKwl1aW50MTZfdCByZXNpZHVhbDsKKwl1aW50OF90IGZyYWdtZW50X2lkOworCXVpbnQ4X3QgcmVhc29uX2NvZGU7CisJdWludDhfdCBleHBsYW5hdGlvbl9jb2RlOworCXVpbnQ4X3QgdmVuZG9yX3VuaXF1ZTsKK307CisKK3N0cnVjdCBjdF9zbnNfZ2lkX3B0X2RhdGEgeworCXVpbnQ4X3QgY29udHJvbF9ieXRlOworCXVpbnQ4X3QgcG9ydF9pZFszXTsKK307CisKK3N0cnVjdCBjdF9zbnNfcnNwIHsKKwlzdHJ1Y3QgY3RfcnNwX2hkciBoZWFkZXI7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1aW50OF90IHBvcnRfdHlwZTsKKwkJCXVpbnQ4X3QgcG9ydF9pZFszXTsKKwkJCXVpbnQ4X3QgcG9ydF9uYW1lWzhdOworCQkJdWludDhfdCBzeW1fcG9ydF9uYW1lX2xlbjsKKwkJCXVpbnQ4X3Qgc3ltX3BvcnRfbmFtZVsyNTVdOworCQkJdWludDhfdCBub2RlX25hbWVbOF07CisJCQl1aW50OF90IHN5bV9ub2RlX25hbWVfbGVuOworCQkJdWludDhfdCBzeW1fbm9kZV9uYW1lWzI1NV07CisJCQl1aW50OF90IGluaXRfcHJvY19hc3NvY1s4XTsKKwkJCXVpbnQ4X3Qgbm9kZV9pcF9hZGRyWzE2XTsKKwkJCXVpbnQ4X3QgY2xhc3Nfb2Zfc2VydmljZVs0XTsKKwkJCXVpbnQ4X3QgZmM0X3R5cGVzWzMyXTsKKwkJCXVpbnQ4X3QgaXBfYWRkcmVzc1sxNl07CisJCQl1aW50OF90IGZhYnJpY19wb3J0X25hbWVbOF07CisJCQl1aW50OF90IHJlc2VydmVkOworCQkJdWludDhfdCBoYXJkX2FkZHJlc3NbM107CisJCX0gZ2Ffbnh0OworCisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgY3Rfc25zX2dpZF9wdF9kYXRhIGVudHJpZXNbTUFYX0ZJQlJFX0RFVklDRVNdOworCQl9IGdpZF9wdDsKKworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBwb3J0X25hbWVbOF07CisJCX0gZ3BuX2lkOworCisJCXN0cnVjdCB7CisJCQl1aW50OF90IG5vZGVfbmFtZVs4XTsKKwkJfSBnbm5faWQ7CisKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgZmM0X3R5cGVzWzMyXTsKKwkJfSBnZnRfaWQ7CisJfSByc3A7Cit9OworCitzdHJ1Y3QgY3Rfc25zX3BrdCB7CisJdW5pb24geworCQlzdHJ1Y3QgY3Rfc25zX3JlcSByZXE7CisJCXN0cnVjdCBjdF9zbnNfcnNwIHJzcDsKKwl9IHA7Cit9OworCisvKgorICogU05TIGNvbW1hbmQgc3RydWN0dXJlcyAtLSBmb3IgMjIwMCBjb21wYXRhYmlsaXR5LgorICovCisjZGVmaW5lCVJGVF9JRF9TTlNfU0NNRF9MRU4JMjIKKyNkZWZpbmUJUkZUX0lEX1NOU19DTURfU0laRQk2MAorI2RlZmluZQlSRlRfSURfU05TX0RBVEFfU0laRQkxNgorCisjZGVmaW5lCVJOTl9JRF9TTlNfU0NNRF9MRU4JMTAKKyNkZWZpbmUJUk5OX0lEX1NOU19DTURfU0laRQkzNgorI2RlZmluZQlSTk5fSURfU05TX0RBVEFfU0laRQkxNgorCisjZGVmaW5lCUdBX05YVF9TTlNfU0NNRF9MRU4JNgorI2RlZmluZQlHQV9OWFRfU05TX0NNRF9TSVpFCTI4CisjZGVmaW5lCUdBX05YVF9TTlNfREFUQV9TSVpFCSg2MjAgKyAxNikKKworI2RlZmluZQlHSURfUFRfU05TX1NDTURfTEVOCTYKKyNkZWZpbmUJR0lEX1BUX1NOU19DTURfU0laRQkyOAorI2RlZmluZQlHSURfUFRfU05TX0RBVEFfU0laRQkoTUFYX0ZJQlJFX0RFVklDRVMgKiA0ICsgMTYpCisKKyNkZWZpbmUJR1BOX0lEX1NOU19TQ01EX0xFTgk2CisjZGVmaW5lCUdQTl9JRF9TTlNfQ01EX1NJWkUJMjgKKyNkZWZpbmUJR1BOX0lEX1NOU19EQVRBX1NJWkUJKDggKyAxNikKKworI2RlZmluZQlHTk5fSURfU05TX1NDTURfTEVOCTYKKyNkZWZpbmUJR05OX0lEX1NOU19DTURfU0laRQkyOAorI2RlZmluZQlHTk5fSURfU05TX0RBVEFfU0laRQkoOCArIDE2KQorCitzdHJ1Y3Qgc25zX2NtZF9wa3QgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVpbnQxNl90IGJ1ZmZlcl9sZW5ndGg7CisJCQl1aW50MTZfdCByZXNlcnZlZF8xOworCQkJdWludDMyX3QgYnVmZmVyX2FkZHJlc3NbMl07CisJCQl1aW50MTZfdCBzdWJjb21tYW5kX2xlbmd0aDsKKwkJCXVpbnQxNl90IHJlc2VydmVkXzI7CisJCQl1aW50MTZfdCBzdWJjb21tYW5kOworCQkJdWludDE2X3Qgc2l6ZTsKKwkJCXVpbnQzMl90IHJlc2VydmVkXzM7CisJCQl1aW50OF90IHBhcmFtWzM2XTsKKwkJfSBjbWQ7CisKKwkJdWludDhfdCByZnRfZGF0YVtSRlRfSURfU05TX0RBVEFfU0laRV07CisJCXVpbnQ4X3Qgcm5uX2RhdGFbUk5OX0lEX1NOU19EQVRBX1NJWkVdOworCQl1aW50OF90IGdhbl9kYXRhW0dBX05YVF9TTlNfREFUQV9TSVpFXTsKKwkJdWludDhfdCBnaWRfZGF0YVtHSURfUFRfU05TX0RBVEFfU0laRV07CisJCXVpbnQ4X3QgZ3BuX2RhdGFbR1BOX0lEX1NOU19EQVRBX1NJWkVdOworCQl1aW50OF90IGdubl9kYXRhW0dOTl9JRF9TTlNfREFUQV9TSVpFXTsKKwl9IHA7Cit9OworCisvKiBJTyBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBNQVhfSU9fREVTQ1JJUFRPUlMJMzIKKworI2RlZmluZSBBQk9SVF9JT0NCX0NCCQkwCisjZGVmaW5lIEFESVNDX1BPUlRfSU9DQl9DQgkxCisjZGVmaW5lIExPR09VVF9QT1JUX0lPQ0JfQ0IJMgorI2RlZmluZSBMT0dJTl9QT1JUX0lPQ0JfQ0IJMworI2RlZmluZSBMQVNUX0lPQ0JfQ0IJCTQKKworI2RlZmluZSBJT0RFU0NfSU5WQUxJRF9JTkRFWAkweEZGRkYKKyNkZWZpbmUgSU9ERVNDX0FESVNDX05FRURFRAkweEZGRkUKKyNkZWZpbmUgSU9ERVNDX0xPR0lOX05FRURFRAkweEZGRkQKKworc3RydWN0IGlvX2Rlc2NyaXB0b3IgeworCXVpbnQxNl90IHVzZWQ6MTsKKwl1aW50MTZfdCBpZHg6MTE7CisJdWludDE2X3QgY2JfaWR4OjQ7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKKworCXBvcnRfaWRfdCBkX2lkOworCWZjX3BvcnRfdCAqcmVtb3RlX2ZjcG9ydDsKKworCXVpbnQzMl90IHNpZ25hdHVyZTsKK307CisKK3N0cnVjdCBxbGFfZndfaW5mbyB7CisJdW5zaWduZWQgc2hvcnQgYWRkcmVzc2luZzsJLyogYWRkcmVzc2luZyBtZXRob2QgdXNlZCB0byBsb2FkIGZ3ICovCisjZGVmaW5lIEZXX0lORk9fQUREUl9OT1JNQUwJMAorI2RlZmluZSBGV19JTkZPX0FERFJfRVhURU5ERUQJMQorI2RlZmluZSBGV19JTkZPX0FERFJfTk9NT1JFCTB4ZmZmZgorCXVuc2lnbmVkIHNob3J0ICpmd2NvZGU7CQkvKiBwb2ludGVyIHRvIEZXIGFycmF5ICovCisJdW5zaWduZWQgc2hvcnQgKmZ3bGVuOwkJLyogbnVtYmVyIG9mIHdvcmRzIGluIGFycmF5ICovCisJdW5zaWduZWQgc2hvcnQgKmZ3c3RhcnQ7CS8qIHN0YXJ0IGFkZHJlc3MgZm9yIEYvVyAqLworCXVuc2lnbmVkIGxvbmcgKmxmd3N0YXJ0OwkvKiBzdGFydCBhZGRyZXNzIChsb25nKSBmb3IgRi9XICovCit9OworCitzdHJ1Y3QgcWxhX2JvYXJkX2luZm8geworCWNoYXIgKmRydl9uYW1lOworCisJY2hhciBpc3BfbmFtZVs4XTsKKwlzdHJ1Y3QgcWxhX2Z3X2luZm8gKmZ3X2luZm87Cit9OworCisvKiBSZXR1cm4gZGF0YSBmcm9tIE1CQ19HRVRfSURfTElTVCBjYWxsLiAqLworc3RydWN0IGdpZF9saXN0X2luZm8geworCXVpbnQ4X3QJYWxfcGE7CisJdWludDhfdAlhcmVhOworCXVpbnQ4X3QJZG9tYWluOwkJCisJdWludDhfdAlsb29wX2lkXzIxMDA7CS8qIElTUDIxMDAvSVNQMjIwMCAtLSA0IGJ5dGVzLiAqLworCXVpbnQxNl90IGxvb3BfaWQ7CS8qIElTUDIzWFggICAgICAgICAtLSA2IGJ5dGVzLiAqLworfTsKKyNkZWZpbmUgR0lEX0xJU1RfU0laRSAoc2l6ZW9mKHN0cnVjdCBnaWRfbGlzdF9pbmZvKSAqIE1BWF9GSUJSRV9ERVZJQ0VTKQorCisvKgorICogTGludXggSG9zdCBBZGFwdGVyIHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdCBzY3NpX3FsYV9ob3N0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBDb21tb25seSB1c2VkIGZsYWdzIGFuZCBzdGF0ZSBpbmZvcm1hdGlvbi4gKi8KKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXN0cnVjdCBwY2lfZGV2CSpwZGV2OworCisJdW5zaWduZWQgbG9uZwlob3N0X25vOworCXVuc2lnbmVkIGxvbmcJaW5zdGFuY2U7CisKKwl2b2xhdGlsZSBzdHJ1Y3QgeworCQl1aW50MzJfdAlpbml0X2RvbmUJCToxOworCQl1aW50MzJfdAlvbmxpbmUJCQk6MTsKKwkJdWludDMyX3QJbWJveF9pbnQJCToxOworCQl1aW50MzJfdAltYm94X2J1c3kJCToxOworCQl1aW50MzJfdAlyc2NuX3F1ZXVlX292ZXJmbG93CToxOworCQl1aW50MzJfdAlyZXNldF9hY3RpdmUJCToxOworCisJCXVpbnQzMl90CW1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA6MTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdAlwcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlCToxOworCisJCXVpbnQzMl90CWRpc2FibGVfcmlzY19jb2RlX2xvYWQJOjE7CisJCXVpbnQzMl90CWVuYWJsZV82NGJpdF9hZGRyZXNzaW5nCToxOworCQl1aW50MzJfdAllbmFibGVfbGlwX3Jlc2V0CToxOworCQl1aW50MzJfdAllbmFibGVfbGlwX2Z1bGxfbG9naW4JOjE7CisJCXVpbnQzMl90CWVuYWJsZV90YXJnZXRfcmVzZXQJOjE7CisJCXVpbnQzMl90CWVuYWJsZV9sZWRfc2NoZW1lCToxOworCX0gZmxhZ3M7CisKKwlhdG9taWNfdAlsb29wX3N0YXRlOworI2RlZmluZSBMT09QX1RJTUVPVVQJMQorI2RlZmluZSBMT09QX0RPV04JMgorI2RlZmluZSBMT09QX1VQCQkzCisjZGVmaW5lIExPT1BfVVBEQVRFCTQKKyNkZWZpbmUgTE9PUF9SRUFEWQk1CisjZGVmaW5lIExPT1BfREVBRAk2CisKKwl1bnNpZ25lZCBsb25nICAgZHBjX2ZsYWdzOworI2RlZmluZQlSRVNFVF9NQVJLRVJfTkVFREVECTAJLyogU2VuZCBtYXJrZXIgdG8gSVNQLiAqLworI2RlZmluZQlSRVNFVF9BQ1RJVkUJCTEKKyNkZWZpbmUJSVNQX0FCT1JUX05FRURFRAkyCS8qIEluaXRpYXRlIElTUCBhYm9ydC4gKi8KKyNkZWZpbmUJQUJPUlRfSVNQX0FDVElWRQkzCS8qIElTUCBhYm9ydCBpbiBwcm9ncmVzcy4gKi8KKyNkZWZpbmUJTE9PUF9SRVNZTkNfTkVFREVECTQJLyogRGV2aWNlIFJlc3luYyBuZWVkZWQuICovCisjZGVmaW5lCUxPT1BfUkVTWU5DX0FDVElWRQk1CisjZGVmaW5lIExPQ0FMX0xPT1BfVVBEQVRFICAgICAgIDYJLyogUGVyZm9ybSBhIGxvY2FsIGxvb3AgdXBkYXRlLiAqLworI2RlZmluZSBSU0NOX1VQREFURSAgICAgICAgICAgICA3CS8qIFBlcmZvcm0gYW4gUlNDTiB1cGRhdGUuICovCisjZGVmaW5lIE1BSUxCT1hfUkVUUlkgICAgICAgICAgIDgKKyNkZWZpbmUgSVNQX1JFU0VUX05FRURFRCAgICAgICAgOQkvKiBJbml0aWF0ZSBhIElTUCByZXNldC4gKi8KKyNkZWZpbmUgRkFJTE9WRVJfRVZFTlRfTkVFREVEICAgMTAKKyNkZWZpbmUgRkFJTE9WRVJfRVZFTlQJCTExCisjZGVmaW5lIEZBSUxPVkVSX05FRURFRCAgIAkxMgorI2RlZmluZSBTQ1NJX1JFU1RBUlRfTkVFREVECTEzCS8qIFByb2Nlc3NlcyBTQ1NJIHJldHJ5IHF1ZXVlLiAqLworI2RlZmluZSBQT1JUX1JFU1RBUlRfTkVFREVECTE0CS8qIFByb2Nlc3NlcyBSZXRyeSBxdWV1ZS4gKi8KKyNkZWZpbmUgUkVTVEFSVF9RVUVVRVNfTkVFREVECTE1CS8qIFJlc3RhcnRzIHRoZSBMdW4gcXVldWUuICovCisjZGVmaW5lIEFCT1JUX1FVRVVFU19ORUVERUQJMTYKKyNkZWZpbmUgUkVMT0dJTl9ORUVERUQJICAgICAgICAxNworI2RlZmluZSBMT0dJTl9SRVRSWV9ORUVERUQJMTgJLyogSW5pdGlhdGUgcmVxdWlyZWQgZmFicmljIGxvZ2lucy4gKi8KKyNkZWZpbmUgUkVHSVNURVJfRkM0X05FRURFRAkxOQkvKiBTTlMgRkM0IHJlZ2lzdHJhdGlvbiByZXF1aXJlZC4gKi8KKyNkZWZpbmUgSVNQX0FCT1JUX1JFVFJZICAgICAgICAgMjAgICAgICAvKiBJU1AgYWJvcnRlZC4gKi8KKyNkZWZpbmUgRkNQT1JUX1JFU0NBTl9ORUVERUQJMjEgICAgICAvKiBJTyBkZXNjcmlwdG9yIHByb2Nlc3NpbmcgbmVlZGVkICovCisjZGVmaW5lIElPREVTQ19QUk9DRVNTX05FRURFRAkyMiAgICAgIC8qIElPIGRlc2NyaXB0b3IgcHJvY2Vzc2luZyBuZWVkZWQgKi8KKyNkZWZpbmUgSU9DVExfRVJST1JfUkVDT1ZFUlkJMjMgICAgICAKKyNkZWZpbmUgTE9PUF9SRVNFVF9ORUVERUQJMjQKKworCXVpbnQzMl90CWRldmljZV9mbGFnczsKKyNkZWZpbmUgREZMR19MT0NBTF9ERVZJQ0VTCQlCSVRfMAorI2RlZmluZSBERkxHX1JFVFJZX0xPQ0FMX0RFVklDRVMJQklUXzEKKyNkZWZpbmUgREZMR19GQUJSSUNfREVWSUNFUwkJQklUXzIKKyNkZWZpbmUJU1dJVENIX0ZPVU5ECQkJQklUXzMKKyNkZWZpbmUJREZMR19OT19DQUJMRQkJCUJJVF80CisKKwkvKiBTUkIgY2FjaGUuICovCisjZGVmaW5lIFNSQl9NSU5fUkVRCTEyOAorCW1lbXBvb2xfdAkqc3JiX21lbXBvb2w7CisKKwkvKiBUaGlzIHNwaW5sb2NrIGlzIHVzZWQgdG8gcHJvdGVjdCAiaW8gdHJhbnNhY3Rpb25zIiwgeW91IG11c3QJCisJICogYXF1aXJlIGl0IGJlZm9yZSBkb2luZyBhbnkgSU8gdG8gdGhlIGNhcmQsIGVnIHdpdGggUkRfUkVHKigpIGFuZAorCSAqIFdSVF9SRUcqKCkgZm9yIHRoZSBkdXJhdGlvbiBvZiB5b3VyIGVudGlyZSBjb21tYW5kdHJhbnNhY3Rpb24uCisJICoKKwkgKiBUaGlzIHNwaW5sb2NrIGlzIG9mIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIGlvIHJlcXVlc3QgbG9jay4KKwkgKi8KKworCXNwaW5sb2NrX3QJCWhhcmR3YXJlX2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkOworCisJZGV2aWNlX3JlZ190IF9faW9tZW0gKmlvYmFzZTsJCS8qIEJhc2UgSS9PIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nCXBpb19hZGRyZXNzOworCXVuc2lnbmVkIGxvbmcJcGlvX2xlbmd0aDsKKyNkZWZpbmUgTUlOX0lPQkFTRV9MRU4JCTB4MTAwCisKKwkvKiBJU1AgcmluZyBsb2NrLCByaW5ncywgYW5kIGluZGV4ZXMgKi8KKwlkbWFfYWRkcl90CXJlcXVlc3RfZG1hOyAgICAgICAgLyogUGh5c2ljYWwgYWRkcmVzcy4gKi8KKwlyZXF1ZXN0X3QgICAgICAgKnJlcXVlc3RfcmluZzsgICAgICAvKiBCYXNlIHZpcnR1YWwgYWRkcmVzcyAqLworCXJlcXVlc3RfdCAgICAgICAqcmVxdWVzdF9yaW5nX3B0cjsgIC8qIEN1cnJlbnQgYWRkcmVzcy4gKi8KKwl1aW50MTZfdCAgICAgICAgcmVxX3JpbmdfaW5kZXg7ICAgICAvKiBDdXJyZW50IGluZGV4LiAqLworCXVpbnQxNl90ICAgICAgICByZXFfcV9jbnQ7ICAgICAgICAgIC8qIE51bWJlciBvZiBhdmFpbGFibGUgZW50cmllcy4gKi8KKwl1aW50MTZfdAlyZXF1ZXN0X3FfbGVuZ3RoOworCisJZG1hX2FkZHJfdAlyZXNwb25zZV9kbWE7ICAgICAgIC8qIFBoeXNpY2FsIGFkZHJlc3MuICovCisJcmVzcG9uc2VfdCAgICAgICpyZXNwb25zZV9yaW5nOyAgICAgLyogQmFzZSB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlyZXNwb25zZV90ICAgICAgKnJlc3BvbnNlX3JpbmdfcHRyOyAvKiBDdXJyZW50IGFkZHJlc3MuICovCisJdWludDE2X3QgICAgICAgIHJzcF9yaW5nX2luZGV4OyAgICAgLyogQ3VycmVudCBpbmRleC4gKi8KKwl1aW50MTZfdAlyZXNwb25zZV9xX2xlbmd0aDsKKyAgICAKKwl1aW50MTZfdAkoKmNhbGNfcmVxdWVzdF9lbnRyaWVzKSh1aW50MTZfdCk7CisJdm9pZAkJKCpidWlsZF9zY3NpX2lvY2JzKShzcmJfdCAqLCBjbWRfZW50cnlfdCAqLCB1aW50MTZfdCk7CisKKwkvKiBPdXRzdGFuZGluZ3MgSVNQIGNvbW1hbmRzLiAqLworCXNyYl90CQkqb3V0c3RhbmRpbmdfY21kc1tNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFNdOworCXVpbnQzMl90CWN1cnJlbnRfb3V0c3RhbmRpbmdfY21kOyAKKwlzcmJfdAkJKnN0YXR1c19zcmI7CS8qIFN0YXR1cyBjb250aW51YXRpb24gZW50cnkuICovCisKKwkvKgorCSAqIE5lZWQgdG8gaG9sZCB0aGUgbGlzdF9sb2NrIHdpdGggaXJxJ3MgZGlzYWJsZWQgaW4gb3JkZXIgdG8gYWNjZXNzCisJICogdGhlIGZvbGxvd2luZyBsaXN0LgorCSAqCisJICogVGhpcyBsaXN0X2xvY2sgaXMgb2YgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgaG9zdF9sb2NrLgorCSAqLworCXNwaW5sb2NrX3QJCWxpc3RfbG9jayBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJCQkJCQkvKiBsb2NrIHRvIGd1YXJkIGxpc3RzIHdoaWNoCisJCQkJCQkgKiBob2xkIHNyYl90J3MgKi8KKyAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAgICAgICAgcmV0cnlfcXVldWU7ICAgIC8qIHdhdGNoZG9nIHF1ZXVlICovCisgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgICAgICAgIGRvbmVfcXVldWU7ICAgICAvKiBqb2Igb24gZG9uZSBxdWV1ZSAqLworICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBmYWlsb3Zlcl9xdWV1ZTsgLyogZmFpbG92ZXIgbGlzdCBsaW5rLiAqLworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIHNjc2lfcmV0cnlfcXVldWU7ICAgICAvKiBTQ1NJIHJldHJ5IHF1ZXVlICovCisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgcGVuZGluZ19xdWV1ZTsJLyogU0NTSSBjb21tYW5kIHBlbmRpbmcgcXVldWUgKi8KKworCXVuc2lnbmVkIGxvbmcgICAgZG9uZV9xX2NudDsKKwl1bnNpZ25lZCBsb25nICAgIHBlbmRpbmdfaW5fcTsKKyAgICAgICAgdWludDMyX3QJcmV0cnlfcV9jbnQ7IAorICAgICAgICB1aW50MzJfdAlzY3NpX3JldHJ5X3FfY250OyAKKyAgICAgICAgdWludDMyX3QJZmFpbG92ZXJfY250OyAKKworCXVuc2lnbmVkIGxvbmcJbGFzdF9pcnFfY3B1OwkvKiBjcHUgd2hlcmUgd2UgZ290IG91ciBsYXN0IGlycSAqLworCisJdWludDE2X3QgICAgICAgICAgIHJldmlzaW9uOworCXVpbnQ4X3QgICAgICAgICAgIHBvcnRzOworCXVfbG9uZyAgICAgICAgICAgIGFjdHRocmVhZHM7CisJdV9sb25nICAgICAgICAgICAgaXByZXFfY250OworCXVfbG9uZyAgICAgICAgICAgIHF0aHJlYWRzOworCisJdWludDMyX3QgICAgICAgIHRvdGFsX2lzcl9jbnQ7CQkvKiBJbnRlcnJ1cHQgY291bnQgKi8KKwl1aW50MzJfdCAgICAgICAgdG90YWxfaXNwX2Fib3J0czsJLyogY29udHJvbGxlciBlcnIgY250ICovCisJdWludDMyX3QgICAgICAgIHRvdGFsX2xpcF9jbnQ7CQkvKiBMSVAgY250ICovCisJdWludDMyX3QJdG90YWxfZGV2X2VycnM7CQkvKiBkZXZpY2UgZXJyb3IgY250ICovCisJdWludDMyX3QJdG90YWxfaW9zOwkJLyogSU8gY250ICovCisJdWludDY0X3QJdG90YWxfYnl0ZXM7CQkvKiB4ZnIgYnl0ZSBjbnQgKi8KKwl1aW50MzJfdAl0b3RhbF9tYnhfdGltZW91dDsJLyogbWFpbGJveCB0aW1lb3V0IGNudCAqLworCXVpbnQzMl90IAl0b3RhbF9sb29wX3Jlc3luYzsgCS8qIGxvb3AgcmVzeW4gY250ICovCisJdWludDMyX3QJZHJvcHBlZF9mcmFtZV9lcnJvcl9jbnQ7CisKKwkvKiBJU1AgY29uZmlndXJhdGlvbiBkYXRhLiAqLworCXVpbnQxNl90CWxvb3BfaWQ7CQkvKiBIb3N0IGFkYXB0ZXIgbG9vcCBpZCAqLworCXVpbnQxNl90CWZiX3JldjsKKworCXBvcnRfaWRfdAlkX2lkOwkJCS8qIEhvc3QgYWRhcHRlciBwb3J0IGlkICovCisJdWludDE2X3QJbWF4X3B1YmxpY19sb29wX2lkczsKKwl1aW50MTZfdAltaW5fZXh0ZXJuYWxfbG9vcGlkOwkvKiBGaXJzdCBleHRlcm5hbCBsb29wIElkICovCisKKwl1aW50MTZfdAlsaW5rX2RhdGFfcmF0ZTsJCS8qIEYvVyBvcGVyYXRpbmcgc3BlZWQgKi8KKworCXVpbnQ4X3QJCWN1cnJlbnRfdG9wb2xvZ3k7CisJdWludDhfdAkJcHJldl90b3BvbG9neTsKKyNkZWZpbmUgSVNQX0NGR19OTAkxCisjZGVmaW5lIElTUF9DRkdfTgkyCisjZGVmaW5lIElTUF9DRkdfRkwJNAorI2RlZmluZSBJU1BfQ0ZHX0YJOAorCisJdWludDhfdAkJb3BlcmF0aW5nX21vZGU7CQkvKiBGL1cgb3BlcmF0aW5nIG1vZGUgKi8KKyNkZWZpbmUgTE9PUCAgICAgIDAKKyNkZWZpbmUgUDJQICAgICAgIDEKKyNkZWZpbmUgTE9PUF9QMlAgIDIKKyNkZWZpbmUgUDJQX0xPT1AgIDMKKworICAgICAgICB1aW50OF90CQltYXJrZXJfbmVlZGVkOyAKKwl1aW50OF90CQlzbnNfcmV0cnlfY250OworCXVpbnQ4X3QJCW1lbV9lcnI7CisKKwl1aW50OF90CQlpbnRlcnJ1cHRzX29uOworCisJLyogSEJBIHNlcmlhbCBudW1iZXIgKi8KKwl1aW50OF90CQlzZXJpYWwwOworCXVpbnQ4X3QJCXNlcmlhbDE7CisJdWludDhfdAkJc2VyaWFsMjsKKworCS8qIE5WUkFNIGNvbmZpZ3VyYXRpb24gZGF0YSAqLworCXVpbnQxNl90CW52cmFtX2Jhc2U7CisKKwl1aW50MTZfdAlsb29wX3Jlc2V0X2RlbGF5OworCXVpbnQxNl90CW1pbmltdW1fdGltZW91dDsKKwl1aW50OF90CQlyZXRyeV9jb3VudDsKKwl1aW50OF90CQlsb2dpbl90aW1lb3V0OworCXVpbnQxNl90CXJfYV90b3Y7CisJaW50CQlwb3J0X2Rvd25fcmV0cnlfY291bnQ7CisJdWludDhfdAkJbG9vcF9kb3duX3RpbWVvdXQ7CisJdWludDhfdAkJbWJ4X2NvdW50OworCXVpbnQxNl90CW1heF9wcm9iZV9sdW5zOworCXVpbnQxNl90CW1heF9sdW5zOworCXVpbnQxNl90CW1heF90YXJnZXRzOworCXVpbnQxNl90CWxhc3RfbG9vcF9pZDsKKworICAgICAgICB1aW50MzJfdAlsb2dpbl9yZXRyeV9jb3VudDsgCisKKwkvKiBGaWJyZSBDaGFubmVsIERldmljZSBMaXN0LiAqLworCXN0cnVjdCBsaXN0X2hlYWQJZmNwb3J0czsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXJzY25fZmNwb3J0czsKKworCXN0cnVjdCBpb19kZXNjcmlwdG9yCWlvX2Rlc2NyaXB0b3JzW01BWF9JT19ERVNDUklQVE9SU107CisJdWludDE2X3QJCWlvZGVzY19zaWduYXR1cmU7CisKKwkvKiBPUyB0YXJnZXQgcXVldWUgcG9pbnRlcnMuICovCisJb3NfdGd0X3QJCSpvdGd0W01BWF9GSUJSRV9ERVZJQ0VTXTsKKworCS8qIFJTQ04gcXVldWUuICovCisJdWludDMyX3QgcnNjbl9xdWV1ZVtNQVhfUlNDTl9DT1VOVF07CisJdWludDhfdCByc2NuX2luX3B0cjsKKwl1aW50OF90IHJzY25fb3V0X3B0cjsKKworCS8qIFNOUyBjb21tYW5kIGludGVyZmFjZXMuICovCisJbXNfaW9jYl9lbnRyeV90CQkqbXNfaW9jYjsKKwlkbWFfYWRkcl90CQltc19pb2NiX2RtYTsKKwlzdHJ1Y3QgY3Rfc25zX3BrdAkqY3Rfc25zOworCWRtYV9hZGRyX3QJCWN0X3Nuc19kbWE7CisJLyogU05TIGNvbW1hbmQgaW50ZXJmYWNlcyBmb3IgMjIwMC4gKi8KKwlzdHJ1Y3Qgc25zX2NtZF9wa3QJKnNuc19jbWQ7CisJZG1hX2FkZHJfdAkJc25zX2NtZF9kbWE7CisKKwlwaWRfdAkJCWRwY19waWQ7CisJaW50CQkJZHBjX3Nob3VsZF9kaWU7CisJc3RydWN0IGNvbXBsZXRpb24JZHBjX2luaXRlZDsKKwlzdHJ1Y3QgY29tcGxldGlvbglkcGNfZXhpdGVkOworCXN0cnVjdCBzZW1hcGhvcmUJKmRwY193YWl0OworCXVpbnQ4X3QgZHBjX2FjdGl2ZTsgICAgICAgICAgICAgICAgICAvKiBEUEMgcm91dGluZSBpcyBhY3RpdmUgKi8KKworCS8qIFRpbWVvdXQgdGltZXJzLiAqLworCXVpbnQ4X3QgICAgICAgICBxdWV1ZV9yZXN0YXJ0X3RpbWVyOyAgIAorCXVpbnQ4X3QgICAgICAgICBsb29wX2Rvd25fYWJvcnRfdGltZTsgICAgLyogcG9ydCBkb3duIHRpbWVyICovCisJYXRvbWljX3QgICAgICAgIGxvb3BfZG93bl90aW1lcjsgICAgICAgICAvKiBsb29wIGRvd24gdGltZXIgKi8KKwl1aW50OF90ICAgICAgICAgbGlua19kb3duX3RpbWVvdXQ7ICAgICAgIC8qIGxpbmsgZG93biB0aW1lb3V0ICovCisKKwl1aW50MzJfdCAgICAgICAgdGltZXJfYWN0aXZlOworCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgICB0aW1lcjsKKworCWRtYV9hZGRyX3QJZ2lkX2xpc3RfZG1hOworCXN0cnVjdCBnaWRfbGlzdF9pbmZvICpnaWRfbGlzdDsKKworCWRtYV9hZGRyX3QJcmxjX3JzcF9kbWE7CisJcnB0X2x1bl9jbWRfcnNwX3QgKnJsY19yc3A7CisKKwkvKiBTbWFsbCBETUEgcG9vbCBhbGxvY2F0aW9ucyAtLSBtYXhpbXVtIDI1NiBieXRlcyBpbiBsZW5ndGguICovIAorI2RlZmluZSBETUFfUE9PTF9TSVpFCTI1NgorCXN0cnVjdCBkbWFfcG9vbCAqc19kbWFfcG9vbDsKKworCWRtYV9hZGRyX3QJaW5pdF9jYl9kbWE7CisJaW5pdF9jYl90ICAgICAgICppbml0X2NiOworCisJZG1hX2FkZHJfdAlpb2Rlc2NfcGRfZG1hOworCXBvcnRfZGF0YWJhc2VfdCAqaW9kZXNjX3BkOworCisJLyogVGhlc2UgYXJlIHVzZWQgYnkgbWFpbGJveCBvcGVyYXRpb25zLiAqLworCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3hfb3V0W01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOworCisJbWJ4X2NtZF90CSptY3A7CisJdW5zaWduZWQgbG9uZwltYnhfY21kX2ZsYWdzOworI2RlZmluZSBNQlhfSU5URVJSVVBUCTEKKyNkZWZpbmUgTUJYX0lOVFJfV0FJVAkyCisjZGVmaW5lIE1CWF9VUERBVEVfRkxBU0hfQUNUSVZFCTMKKworCXNwaW5sb2NrX3QJbWJ4X3JlZ19sb2NrOyAgIC8qIE1ieCBDbWQgUmVnaXN0ZXIgTG9jayAqLworCisJc3RydWN0IHNlbWFwaG9yZSBtYnhfY21kX3NlbTsJLyogU2VyaWFsaWFsaXplIG1ieCBhY2Nlc3MgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIG1ieF9pbnRyX3NlbTsgIC8qIFVzZWQgZm9yIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uICovCisKKwl1aW50MzJfdAltYnhfZmxhZ3M7CisjZGVmaW5lICBNQlhfSU5fUFJPR1JFU1MJQklUXzAKKyNkZWZpbmUgIE1CWF9CVVNZCQlCSVRfMQkvKiBHb3QgdGhlIEFjY2VzcyAqLworI2RlZmluZSAgTUJYX1NMRUVQSU5HX09OX1NFTQlCSVRfMiAKKyNkZWZpbmUgIE1CWF9QT0xMSU5HX0ZPUl9DT01QCUJJVF8zCisjZGVmaW5lICBNQlhfQ09NUExFVEVECQlCSVRfNAorI2RlZmluZSAgTUJYX1RJTUVET1VUCQlCSVRfNSAKKyNkZWZpbmUgIE1CWF9BQ0NFU1NfVElNRURPVVQJQklUXzYKKworCW1ieF9jbWRfdCAJbWM7CisKKwl1aW50OF90CSpjbWRsaW5lOworCisJdWludDMyX3QgZmFpbG92ZXJfdHlwZTsKKwl1aW50MzJfdCBmYWlsYmFja19kZWxheTsKKwl1bnNpZ25lZCBsb25nICAgY2ZnX2ZsYWdzOworI2RlZmluZQlDRkdfQUNUSVZFCTAJLyogQ0ZHIGR1cmluZyBhIGZhaWxvdmVyLCBldmVudCB1cGRhdGUsIG9yIGlvY3RsICovCisjZGVmaW5lCUNGR19GQUlMT1ZFUgkxCS8qIENGRyBkdXJpbmcgcGF0aCBjaGFuZ2UgKi8KKworCXVpbnQzMl90CWJpbmRpbmdfdHlwZTsKKyNkZWZpbmUgQklORF9CWV9QT1JUX05BTUUJMAorI2RlZmluZSBCSU5EX0JZX1BPUlRfSUQJCTEKKworCS8qIEJhc2ljIGZpcm13YXJlIHJlbGF0ZWQgaW5mb3JtYXRpb24uICovCisJc3RydWN0IHFsYV9ib2FyZF9pbmZvCSpicmRfaW5mbzsKKwl1aW50MTZfdAlmd19tYWpvcl92ZXJzaW9uOworCXVpbnQxNl90CWZ3X21pbm9yX3ZlcnNpb247CisJdWludDE2X3QJZndfc3VibWlub3JfdmVyc2lvbjsKKwl1aW50MTZfdAlmd19hdHRyaWJ1dGVzOworCXVpbnQzMl90CWZ3X21lbW9yeV9zaXplOworCXVpbnQzMl90CWZ3X3RyYW5zZmVyX3NpemU7CisKKwl1aW50MTZfdAlmd19vcHRpb25zWzE2XTsJCS8qIHNsb3RzOiAxLDIsMywxMCwxMSAqLworCXVpbnQ4X3QJCWZ3X3NlcmlhbGxpbmtfb3B0aW9uc1s0XTsKKworCS8qIEZpcm13YXJlIGR1bXAgaW5mb3JtYXRpb24uICovCisJdm9pZAkJKmZ3X2R1bXA7CisJaW50CQlmd19kdW1wX29yZGVyOworCWludAkJZndfZHVtcF9yZWFkaW5nOworCWNoYXIJCSpmd19kdW1wX2J1ZmZlcjsKKwlpbnQJCWZ3X2R1bXBfYnVmZmVyX2xlbjsKKworCXVpbnQ4X3QJCWhvc3Rfc3RyWzE2XTsKKwl1aW50MTZfdAlwY2lfYXR0cjsKKworCXVpbnQxNl90CXByb2R1Y3RfaWRbNF07CisKKwl1aW50OF90CQltb2RlbF9udW1iZXJbMTYrMV07CisjZGVmaW5lIEJJTlpFUk8JCSJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCIKKwljaGFyCQkqbW9kZWxfZGVzYzsKKworCXVpbnQ4X3QgICAgIG5vZGVfbmFtZVtXV05fU0laRV07CisJdWludDhfdCAgICAgbnZyYW1fdmVyc2lvbjsgCisJdWludDMyX3QgICAgaXNwX2Fib3J0X2NudDsKKworCS8qIEFkYXB0ZXIgSS9PIHN0YXRpc3RpY3MgZm9yIGZhaWxvdmVyICovCisJdWludDY0X3QJSW9zUmVxdWVzdGVkOworCXVpbnQ2NF90CUJ5dGVzUmVxdWVzdGVkOworCXVpbnQ2NF90CUlvc0V4ZWN1dGVkOworCXVpbnQ2NF90CUJ5dGVzRXhlY3V0ZWQ7CisKKwkvKiBOZWVkZWQgZm9yIEJFQUNPTiAqLworCXVpbnQxNl90CWJlYWNvbl9ibGlua19sZWQ7CisJdWludDE2X3QJYmVhY29uX2dyZWVuX29uOworfSBzY3NpX3FsYV9ob3N0X3Q7CisKKworLyoKKyAqIE1hY3JvcyB0byBoZWxwIGNvZGUsIG1haW50YWluLCBldGMuCisgKi8KKyNkZWZpbmUgTE9PUF9UUkFOU0lUSU9OKGhhKSBcCisJKHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSB8fCBcCisJIHRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKQorCisjZGVmaW5lIExPT1BfTk9UX1JFQURZKGhhKSBcCisJKCh0ZXN0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncykgfHwgXAorCSAgdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpIHx8IFwKKwkgIHRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpIHx8IFwKKwkgIHRlc3RfYml0KExPT1BfUkVTWU5DX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpKSB8fCBcCisJIGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ET1dOKQorCQkJCSAKKyNkZWZpbmUgTE9PUF9SRFkoaGEpCSghTE9PUF9OT1RfUkVBRFkoaGEpKQorCisjZGVmaW5lIFRHVF9RKGhhLCB0KSAoaGEtPm90Z3RbdF0pCisjZGVmaW5lIExVTl9RKGhhLCB0LCBsKQkoVEdUX1EoaGEsIHQpLT5vbHVuW2xdKQorI2RlZmluZSBHRVRfTFVfUShoYSwgdCwgbCkgKChUR1RfUShoYSx0KSAhPSBOVUxMKT8gVEdUX1EoaGEsIHQpLT5vbHVuW2xdIDogTlVMTCkKKworI2RlZmluZSB0b19xbGFfaG9zdCh4KQkJKChzY3NpX3FsYV9ob3N0X3QgKikgKHgpLT5ob3N0ZGF0YSkKKworI2RlZmluZSBxbGFfcHJpbnRrKGxldmVsLCBoYSwgZm9ybWF0LCBhcmcuLi4pIFwKKwlkZXZfcHJpbnRrKGxldmVsICwgJigoaGEpLT5wZGV2LT5kZXYpICwgZm9ybWF0ICwgIyMgYXJnKQorCisvKgorICogcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGVzCisgKi8KKyNkZWZpbmUgTUJTX01BU0sJCTB4M2ZmZgorCisjZGVmaW5lIFFMQV9TVUNDRVNTCQkoTUJTX0NPTU1BTkRfQ09NUExFVEUgJiBNQlNfTUFTSykKKyNkZWZpbmUgUUxBX0lOVkFMSURfQ09NTUFORAkoTUJTX0lOVkFMSURfQ09NTUFORCAmIE1CU19NQVNLKQorI2RlZmluZSBRTEFfSU5URVJGQUNFX0VSUk9SCShNQlNfSE9TVF9JTlRFUkZBQ0VfRVJST1IgJiBNQlNfTUFTSykKKyNkZWZpbmUgUUxBX1RFU1RfRkFJTEVECQkoTUJTX1RFU1RfRkFJTEVEICYgTUJTX01BU0spCisjZGVmaW5lIFFMQV9DT01NQU5EX0VSUk9SCShNQlNfQ09NTUFORF9FUlJPUiAmIE1CU19NQVNLKQorI2RlZmluZSBRTEFfUEFSQU1FVEVSX0VSUk9SCShNQlNfQ09NTUFORF9QQVJBTUVURVJfRVJST1IgJiBNQlNfTUFTSykKKyNkZWZpbmUgUUxBX1BPUlRfSURfVVNFRAkoTUJTX1BPUlRfSURfVVNFRCAmIE1CU19NQVNLKQorI2RlZmluZSBRTEFfTE9PUF9JRF9VU0VECShNQlNfTE9PUF9JRF9VU0VEICYgTUJTX01BU0spCisjZGVmaW5lIFFMQV9BTExfSURTX0lOX1VTRQkoTUJTX0FMTF9JRFNfSU5fVVNFICYgTUJTX01BU0spCisjZGVmaW5lIFFMQV9OT1RfTE9HR0VEX0lOCShNQlNfTk9UX0xPR0dFRF9JTiAmIE1CU19NQVNLKQorCisjZGVmaW5lIFFMQV9GVU5DVElPTl9USU1FT1VUCQkweDEwMAorI2RlZmluZSBRTEFfRlVOQ1RJT05fUEFSQU1FVEVSX0VSUk9SCTB4MTAxCisjZGVmaW5lIFFMQV9GVU5DVElPTl9GQUlMRUQJCTB4MTAyCisjZGVmaW5lIFFMQV9NRU1PUllfQUxMT0NfRkFJTEVECQkweDEwMworI2RlZmluZSBRTEFfTE9DS19USU1FT1VUCQkweDEwNAorI2RlZmluZSBRTEFfQUJPUlRFRAkJCTB4MTA1CisjZGVmaW5lIFFMQV9TVVNQRU5ERUQJCQkweDEwNgorI2RlZmluZSBRTEFfQlVTWQkJCTB4MTA3CisjZGVmaW5lIFFMQV9SU0NOU19IQU5ETEVECQkweDEwOAorCisvKgorKiBTdGF0IGluZm8gZm9yIGFsbCBhZHBhdGVycworKi8KK3N0cnVjdCBfcWxhMngwMHN0YXRzICB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICBtYm94dG91dDsgICAgICAgICAgICAvKiBtYWlsYm94IHRpbWVvdXRzICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICBtYm94ZXJyOyAgICAgICAgICAgICAvKiBtYWlsYm94IGVycm9ycyAqLworICAgICAgICB1bnNpZ25lZCBsb25nICAgaXNwQWJvcnQ7ICAgICAgICAgICAgLyogSVNQIGFib3J0cyAqLworICAgICAgICB1bnNpZ25lZCBsb25nICAgZGVidWdObzsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgIGxvb3BfcmVzeW5jOworICAgICAgICB1bnNpZ25lZCBsb25nICAgb3V0YXJyYXlfZnVsbDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgIHJldHJ5X3FfY250OworfTsKKworI2RlZmluZSBOVlJBTV9ERUxBWSgpCQl1ZGVsYXkoMTApCisKKyNkZWZpbmUgSU5WQUxJRF9IQU5ETEUJKE1BWF9PVVRTVEFORElOR19DT01NQU5EUysxKQorCisvKgorICogRmxhc2ggc3VwcG9ydCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIEZMQVNIX0lNQUdFX1NJWkUJMTMxMDcyCisKKyNpbmNsdWRlICJxbGFfZ2JsLmgiCisjaW5jbHVkZSAicWxhX2RiZy5oIgorI2luY2x1ZGUgInFsYV9pbmxpbmUuaCIKKyNpbmNsdWRlICJxbGFfbGlzdG9wcy5oIgorCisvKgorKiBTdHJpbmcgYXJyYXlzCisqLworI2RlZmluZSBMSU5FU0laRSAgICAyNTYKKyNkZWZpbmUgTUFYQVJHUyAgICAgIDI2CisKKyNkZWZpbmUgQ01EX1NQKENtbmQpCQkoKENtbmQpLT5TQ3AucHRyKQorI2RlZmluZSBDTURfQ09NUExfU1RBVFVTKENtbmQpICAoKENtbmQpLT5TQ3AudGhpc19yZXNpZHVhbCkKKyNkZWZpbmUgQ01EX1JFU0lEX0xFTihDbW5kKQkoKENtbmQpLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCkKKyNkZWZpbmUgQ01EX1NDU0lfU1RBVFVTKENtbmQpCSgoQ21uZCktPlNDcC5TdGF0dXMpCisjZGVmaW5lIENNRF9BQ1RVQUxfU05TTEVOKENtbmQpCSgoQ21uZCktPlNDcC5NZXNzYWdlKQorI2RlZmluZSBDTURfRU5UUllfU1RBVFVTKENtbmQpCSgoQ21uZCktPlNDcC5oYXZlX2RhdGFfaW4pCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RldnRibC5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RldnRibC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZTQ4MDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGV2dGJsLmgKQEAgLTAsMCArMSwxMTAgQEAKKyNkZWZpbmUgUUxBX01PREVMX05BTUVTICAgICAgICAgMHgzMgorCisvKgorICogQWRhcHRlciBtb2RlbCBuYW1lcy4KKyAqLworc3RhdGljIGNoYXIgKnFsYTJ4MDBfbW9kZWxfbmFtZVtRTEFfTU9ERUxfTkFNRVNdID0geworCSJRTEEyMzQwIiwJLyogMHgxMDAgKi8KKwkiUUxBMjM0MiIsCS8qIDB4MTAxICovCisJIlFMQTIzNDQiLAkvKiAweDEwMiAqLworCSJRQ1AyMzQyIiwJLyogMHgxMDMgKi8KKwkiUVNCMjM0MCIsCS8qIDB4MTA0ICovCisJIlFTQjIzNDIiLAkvKiAweDEwNSAqLworCSJRTEEyMzEwIiwJLyogMHgxMDYgKi8KKwkiUUxBMjMzMiIsCS8qIDB4MTA3ICovCisJIlFDUDIzMzIiLAkvKiAweDEwOCAqLworCSJRQ1AyMzQwIiwJLyogMHgxMDkgKi8KKwkiUUxBMjM0MiIsCS8qIDB4MTBhICovCisJIlFDUDIzNDIiLAkvKiAweDEwYiAqLworCSJRTEEyMzUwIiwJLyogMHgxMGMgKi8KKwkiUUxBMjM1MiIsCS8qIDB4MTBkICovCisJIlFMQTIzNTIiLAkvKiAweDEwZSAqLworCSJIUFEgU1ZTIiwJLyogMHgxMGYgKi8KKwkiSFBRIFNWUyIsCS8qIDB4MTEwICovCisJIiAiLAkJLyogMHgxMTEgKi8KKwkiICIsCQkvKiAweDExMiAqLworCSIgIiwJCS8qIDB4MTEzICovCisJIiAiLAkJLyogMHgxMTQgKi8KKwkiUUxBMjM2MCIsCS8qIDB4MTE1ICovCisJIlFMQTIzNjIiLAkvKiAweDExNiAqLworCSJRTEUyMzYwIiwJLyogMHgxMTcgKi8KKwkiUUxFMjM2MiIsCS8qIDB4MTE4ICovCisJIlFMQTIwMCIsCS8qIDB4MTE5ICovCisJIlFMQTIwMEMiLAkvKiAweDExYSAqLworCSJRTEEyMDBQIiwJLyogMHgxMWIgKi8KKwkiUUxBMjAwUCIsCS8qIDB4MTFjICovCisJIiAiLAkJLyogMHgxMWQgKi8KKwkiICIsCQkvKiAweDExZSAqLworCSIgIiwJCS8qIDB4MTFmICovCisJIiAiLAkJLyogMHgxMjAgKi8KKwkiICIsCQkvKiAweDEyMSAqLworCSIgIiwJCS8qIDB4MTIyICovCisJIiAiLAkJLyogMHgxMjMgKi8KKwkiICIsCQkvKiAweDEyNCAqLworCSIgIiwJCS8qIDB4MTI1ICovCisJIiAiLAkJLyogMHgxMjYgKi8KKwkiICIsCQkvKiAweDEyNyAqLworCSIgIiwJCS8qIDB4MTI4ICovCisJIiAiLAkJLyogMHgxMjkgKi8KKwkiICIsCQkvKiAweDEyYSAqLworCSIgIiwJCS8qIDB4MTJiICovCisJIiAiLAkJLyogMHgxMmMgKi8KKwkiICIsCQkvKiAweDEyZCAqLworCSIgIiwJCS8qIDB4MTJlICovCisJIlFMQTIxMCIsCS8qIDB4MTJmICovCisJIkVNQyAyNTAiLAkvKiAweDEzMCAqLworCSJIUCBBNzUzOEEiCS8qIDB4MTMxICovCit9OworCitzdGF0aWMgY2hhciAqcWxhMngwMF9tb2RlbF9kZXNjW1FMQV9NT0RFTF9OQU1FU10gPSB7CisJIjEzM01IeiBQQ0ktWCB0byAyR2IgRkMsIFNpbmdsZSBDaGFubmVsIiwJLyogMHgxMDAgKi8KKwkiMTMzTUh6IFBDSS1YIHRvIDJHYiBGQywgRHVhbCBDaGFubmVsIiwJCS8qIDB4MTAxICovCisJIjEzM01IeiBQQ0ktWCB0byAyR2IgRkMsIFF1YWQgQ2hhbm5lbCIsCQkvKiAweDEwMiAqLworCSIgIiwJCQkJCQkvKiAweDEwMyAqLworCSIgIiwJCQkJCQkvKiAweDEwNCAqLworCSIgIiwJCQkJCQkvKiAweDEwNSAqLworCSIgIiwJCQkJCQkvKiAweDEwNiAqLworCSIgIiwJCQkJCQkvKiAweDEwNyAqLworCSIgIiwJCQkJCQkvKiAweDEwOCAqLworCSIgIiwJCQkJCQkvKiAweDEwOSAqLworCSIgIiwJCQkJCQkvKiAweDEwYSAqLworCSIgIiwJCQkJCQkvKiAweDEwYiAqLworCSIxMzNNSHogUENJLVggdG8gMkdiIEZDLCBTaW5nbGUgQ2hhbm5lbCIsCS8qIDB4MTBjICovCisJIjEzM01IeiBQQ0ktWCB0byAyR2IgRkMsIER1YWwgQ2hhbm5lbCIsCQkvKiAweDEwZCAqLworCSIgIiwJCQkJCQkvKiAweDEwZSAqLworCSJIUFEgU1ZTIEhCQS0gSW5pdGlhdG9yIGRldmljZSIsCQkvKiAweDEwZiAqLworCSJIUFEgU1ZTIEhCQS0gVGFyZ2V0IGRldmljZSIsCQkJLyogMHgxMTAgKi8KKwkiICIsCQkJCQkJLyogMHgxMTEgKi8KKwkiICIsCQkJCQkJLyogMHgxMTIgKi8KKwkiICIsCQkJCQkJLyogMHgxMTMgKi8KKwkiICIsCQkJCQkJLyogMHgxMTQgKi8KKwkiMTMzTUh6IFBDSS1YIHRvIDJHYiBGQyBTaW5nbGUgQ2hhbm5lbCIsCS8qIDB4MTE1ICovCisJIjEzM01IeiBQQ0ktWCB0byAyR2IgRkMgRHVhbCBDaGFubmVsIiwJCS8qIDB4MTE2ICovCisJIlBDSS1FeHByZXNzIHRvIDJHYiBGQywgU2luZ2xlIENoYW5uZWwiLAkvKiAweDExNyAqLworCSJQQ0ktRXhwcmVzcyB0byAyR2IgRkMsIER1YWwgQ2hhbm5lbCIsCQkvKiAweDExOCAqLworCSIxMzNNSHogUENJLVggdG8gMkdiIEZDIE9wdGljYWwiLAkJLyogMHgxMTkgKi8KKwkiMTMzTUh6IFBDSS1YIHRvIDJHYiBGQyBDb3BwZXIiLAkJLyogMHgxMWEgKi8KKwkiMTMzTUh6IFBDSS1YIHRvIDJHYiBGQyBTRlAiLAkJCS8qIDB4MTFiICovCisJIjEzM01IeiBQQ0ktWCB0byAyR2IgRkMgU0ZQIiwJCQkvKiAweDExYyAqLworCSIgIiwJCQkJCQkvKiAweDExZCAqLworCSIgIiwJCQkJCQkvKiAweDExZSAqLworCSIgIiwJCQkJCQkvKiAweDExZiAqLworCSIgIiwJCQkJCQkvKiAweDEyMCAqLworCSIgIiwJCQkJCQkvKiAweDEyMSAqLworCSIgIiwJCQkJCQkvKiAweDEyMiAqLworCSIgIiwJCQkJCQkvKiAweDEyMyAqLworCSIgIiwJCQkJCQkvKiAweDEyNCAqLworCSIgIiwJCQkJCQkvKiAweDEyNSAqLworCSIgIiwJCQkJCQkvKiAweDEyNiAqLworCSIgIiwJCQkJCQkvKiAweDEyNyAqLworCSIgIiwJCQkJCQkvKiAweDEyOCAqLworCSIgIiwJCQkJCQkvKiAweDEyOSAqLworCSIgIiwJCQkJCQkvKiAweDEyYSAqLworCSIgIiwJCQkJCQkvKiAweDEyYiAqLworCSIgIiwJCQkJCQkvKiAweDEyYyAqLworCSIgIiwJCQkJCQkvKiAweDEyZCAqLworCSIgIiwJCQkJCQkvKiAweDEyZSAqLworCSIxMzNNSHogUENJLVggdG8gMkdiIEZDIFNGRiIsCQkJLyogMHgxMmYgKi8KKwkiMTMzTUh6IFBDSS1YIHRvIDJHYiBGQyBTRkYiLAkJCS8qIDB4MTMwICovCisJIkhQIDFwMmcgUUxBMjM0MCIJCQkJLyogMHgxMzEgKi8KK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkZjJhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaApAQCAtMCwwICsxLDI1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgUUxPR0lDIExJTlVYIFNPRlRXQVJFCisqCisqIFFMb2dpYyBJU1AyeDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFFMb2dpYyBDb3Jwb3JhdGlvbgorKiAod3d3LnFsb2dpYy5jb20pCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisqIGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogR2xvYmFsIGluY2x1ZGUgZmlsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fUUxBX0dCTF9ICisjZGVmaW5lCV9fUUxBX0dCTF9ICisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworZXh0ZXJuIHZvaWQgcWxhMngwMF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICopOworZXh0ZXJuIGludCBxbGEyeDAwX3Byb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqLCBzdHJ1Y3QgcWxhX2JvYXJkX2luZm8gKik7CisKKy8qCisgKiBHbG9iYWwgRnVuY3Rpb24gUHJvdG90eXBlcyBpbiBxbGFfaW5pdC5jIHNvdXJjZSBmaWxlLgorICovCitleHRlcm4gaW50IHFsYTJ4MDBfaW5pdGlhbGl6ZV9hZGFwdGVyKHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiBmY19wb3J0X3QgKnFsYTJ4MDBfYWxsb2NfZmNwb3J0KHNjc2lfcWxhX2hvc3RfdCAqLCBpbnQpOworCitleHRlcm4gaW50IHFsYTJ4MDBfbG9vcF9yZXN5bmMoc2NzaV9xbGFfaG9zdF90ICopOworCitleHRlcm4gaW50IHFsYTJ4MDBfZmluZF9uZXdfbG9vcF9pZChzY3NpX3FsYV9ob3N0X3QgKiwgZmNfcG9ydF90ICopOworZXh0ZXJuIGludCBxbGEyeDAwX2ZhYnJpY19sb2dpbihzY3NpX3FsYV9ob3N0X3QgKiwgZmNfcG9ydF90ICosIHVpbnQxNl90ICopOworZXh0ZXJuIGludCBxbGEyeDAwX2xvY2FsX2RldmljZV9sb2dpbihzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QpOworCitleHRlcm4gdm9pZCBxbGEyeDAwX3Jlc3RhcnRfcXVldWVzKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50OF90KTsKKworZXh0ZXJuIHZvaWQgcWxhMngwMF9yZXNjYW5fZmNwb3J0cyhzY3NpX3FsYV9ob3N0X3QgKik7CisKK2V4dGVybiB2b2lkIHFsYTJ4MDBfdGd0X2ZyZWUoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgdCk7CisKK2V4dGVybiBpbnQgcWxhMngwMF9hYm9ydF9pc3Aoc2NzaV9xbGFfaG9zdF90ICopOworCisvKgorICogR2xvYmFsIERhdGEgaW4gcWxhX29zLmMgc291cmNlIGZpbGUuCisgKi8KK2V4dGVybiBjaGFyIHFsYTJ4MDBfdmVyc2lvbl9zdHJbXTsKKworZXh0ZXJuIGludCBudW1faG9zdHM7CitleHRlcm4gaW50IGFwaUhCQUluc3RhbmNlOworCitleHRlcm4gc3RydWN0IF9xbGEyeDAwc3RhdHMgcWxhMngwMF9zdGF0czsKK2V4dGVybiBpbnQgcWwyeHJldHJ5Y291bnQ7CitleHRlcm4gaW50IHFsMnhsb2dpbnRpbWVvdXQ7CitleHRlcm4gaW50IHFscG9ydF9kb3duX3JldHJ5OworZXh0ZXJuIGludCBxbDJ4bWF4cWRlcHRoOworZXh0ZXJuIGludCBkaXNwbGF5Q29uZmlnOworZXh0ZXJuIGludCBxbDJ4cGxvZ2lhYnNlbnRkZXZpY2U7CitleHRlcm4gaW50IHFsMnhlbmFibGV6aW87CitleHRlcm4gaW50IHFsMnhpbnRyZGVsYXl0aW1lcjsKK2V4dGVybiBpbnQgcWwyeGxvZ2lucmV0cnljb3VudDsKKworZXh0ZXJuIGludCBDb25maWdSZXF1aXJlZDsKKworZXh0ZXJuIGludCBCaW5kOworZXh0ZXJuIGludCBxbDJ4c3VzcGVuZGNvdW50OworI2lmIGRlZmluZWQoTU9EVUxFKQorZXh0ZXJuIGNoYXIgKnFsMnhvcHRzOworI2VuZGlmCisKK2V4dGVybiBjaGFyICpxbGEyeDAwX2dldF9md192ZXJzaW9uX3N0cihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCBjaGFyICopOworCitleHRlcm4gdm9pZCBxbGEyeDAwX2NtZF90aW1lb3V0KHNyYl90ICopOworCitleHRlcm4gaW50IF9fcWxhMngwMF9zdXNwZW5kX2x1bihzY3NpX3FsYV9ob3N0X3QgKiwgb3NfbHVuX3QgKiwgaW50LCBpbnQsIGludCk7CisKK2V4dGVybiB2b2lkIHFsYTJ4MDBfZG9uZShzY3NpX3FsYV9ob3N0X3QgKik7CitleHRlcm4gdm9pZCBxbGEyeDAwX25leHQoc2NzaV9xbGFfaG9zdF90ICopOworZXh0ZXJuIHZvaWQgcWxhMngwMF9mbHVzaF9mYWlsb3Zlcl9xKHNjc2lfcWxhX2hvc3RfdCAqLCBvc19sdW5fdCAqKTsKK2V4dGVybiB2b2lkIHFsYTJ4MDBfcmVzZXRfbHVuX2ZvX2NvdW50cyhzY3NpX3FsYV9ob3N0X3QgKiwgb3NfbHVuX3QgKik7CisKK2V4dGVybiB2b2lkIHFsYTJ4MDBfZXh0ZW5kX3RpbWVvdXQoc3RydWN0IHNjc2lfY21uZCAqLCBpbnQpOworCitleHRlcm4gdm9pZCBxbGEyeDAwX21hcmtfZGV2aWNlX2xvc3Qoc2NzaV9xbGFfaG9zdF90ICosIGZjX3BvcnRfdCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgcWxhMngwMF9tYXJrX2FsbF9kZXZpY2VzX2xvc3Qoc2NzaV9xbGFfaG9zdF90ICopOworCitleHRlcm4gdm9pZCBxbGEyeDAwX2Fib3J0X3F1ZXVlcyhzY3NpX3FsYV9ob3N0X3QgKiwgdWludDhfdCk7CisKK2V4dGVybiB2b2lkIHFsYTJ4MDBfYmxpbmtfbGVkKHNjc2lfcWxhX2hvc3RfdCAqKTsKKworZXh0ZXJuIGludCBxbGEyeDAwX2Rvd25fdGltZW91dChzdHJ1Y3Qgc2VtYXBob3JlICosIHVuc2lnbmVkIGxvbmcpOworCisvKgorICogR2xvYmFsIEZ1bmN0aW9uIFByb3RvdHlwZXMgaW4gcWxhX2lvY2IuYyBzb3VyY2UgZmlsZS4KKyAqLworZXh0ZXJuIHZvaWQgcWxhMngwMF9pc3BfY21kKHNjc2lfcWxhX2hvc3RfdCAqKTsKKworZXh0ZXJuIHVpbnQxNl90IHFsYTJ4MDBfY2FsY19pb2Nic18zMih1aW50MTZfdCk7CitleHRlcm4gdWludDE2X3QgcWxhMngwMF9jYWxjX2lvY2JzXzY0KHVpbnQxNl90KTsKK2V4dGVybiB2b2lkIHFsYTJ4MDBfYnVpbGRfc2NzaV9pb2Nic18zMihzcmJfdCAqLCBjbWRfZW50cnlfdCAqLCB1aW50MTZfdCk7CitleHRlcm4gdm9pZCBxbGEyeDAwX2J1aWxkX3Njc2lfaW9jYnNfNjQoc3JiX3QgKiwgY21kX2VudHJ5X3QgKiwgdWludDE2X3QpOworZXh0ZXJuIGludCBxbGEyeDAwX3N0YXJ0X3Njc2koc3JiX3QgKnNwKTsKK2ludCBxbGEyeDAwX21hcmtlcihzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QsIHVpbnQxNl90LCB1aW50OF90KTsKK2ludCBfX3FsYTJ4MDBfbWFya2VyKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCwgdWludDE2X3QsIHVpbnQ4X3QpOworCisvKgorICogR2xvYmFsIEZ1bmN0aW9uIFByb3RvdHlwZXMgaW4gcWxhX21ieC5jIHNvdXJjZSBmaWxlLgorICovCitleHRlcm4gaW50CitxbGEyeDAwX2xvYWRfcmFtKHNjc2lfcWxhX2hvc3RfdCAqLCBkbWFfYWRkcl90LCB1aW50MTZfdCwgdWludDE2X3QpOworCitleHRlcm4gaW50CitxbGEyeDAwX2xvYWRfcmFtX2V4dChzY3NpX3FsYV9ob3N0X3QgKiwgZG1hX2FkZHJfdCwgdWludDMyX3QsIHVpbnQxNl90KTsKKworZXh0ZXJuIGludAorcWxhMngwMF9leGVjdXRlX2Z3KHNjc2lfcWxhX2hvc3RfdCAqKTsKKworZXh0ZXJuIHZvaWQKK3FsYTJ4MDBfZ2V0X2Z3X3ZlcnNpb24oc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90ICosCisgICAgdWludDE2X3QgKiwgdWludDE2X3QgKiwgdWludDE2X3QgKiwgdWludDMyX3QgKik7CisKK2V4dGVybiBpbnQKK3FsYTJ4MDBfZ2V0X2Z3X29wdGlvbnMoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90ICopOworCitleHRlcm4gaW50CitxbGEyeDAwX3NldF9md19vcHRpb25zKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCAqKTsKKworZXh0ZXJuIGludAorcWxhMngwMF9tYnhfcmVnX3Rlc3Qoc2NzaV9xbGFfaG9zdF90ICopOworCitleHRlcm4gaW50CitxbGEyeDAwX3ZlcmlmeV9jaGVja3N1bShzY3NpX3FsYV9ob3N0X3QgKik7CisKK2V4dGVybiBpbnQKK3FsYTJ4MDBfaXNzdWVfaW9jYihzY3NpX3FsYV9ob3N0X3QgKiwgdm9pZCAqLCBkbWFfYWRkcl90LCBzaXplX3QpOworCitleHRlcm4gaW50CitxbGEyeDAwX2Fib3J0X2NvbW1hbmQoc2NzaV9xbGFfaG9zdF90ICosIHNyYl90ICopOworCisjaWYgVVNFX0FCT1JUX1RHVAorZXh0ZXJuIGludAorcWxhMngwMF9hYm9ydF90YXJnZXQoZmNfcG9ydF90ICpmY3BvcnQpOworI2VuZGlmCisKK2V4dGVybiBpbnQKK3FsYTJ4MDBfdGFyZ2V0X3Jlc2V0KHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCwgdWludDE2X3QpOworCitleHRlcm4gaW50CitxbGEyeDAwX2dldF9hZGFwdGVyX2lkKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCAqLCB1aW50OF90ICosIHVpbnQ4X3QgKiwKKyAgICB1aW50OF90ICosIHVpbnQxNl90ICopOworCitleHRlcm4gaW50CitxbGEyeDAwX2dldF9yZXRyeV9jbnQoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQ4X3QgKiwgdWludDhfdCAqLCB1aW50MTZfdCAqKTsKKworZXh0ZXJuIGludAorcWxhMngwMF9pbml0X2Zpcm13YXJlKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCk7CisKK2V4dGVybiBpbnQKK3FsYTJ4MDBfZ2V0X3BvcnRfZGF0YWJhc2Uoc2NzaV9xbGFfaG9zdF90ICosIGZjX3BvcnRfdCAqLCB1aW50OF90KTsKKworZXh0ZXJuIGludAorcWxhMngwMF9nZXRfZmlybXdhcmVfc3RhdGUoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90ICopOworCitleHRlcm4gaW50CitxbGEyeDAwX2dldF9wb3J0X25hbWUoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90LCB1aW50OF90ICosIHVpbnQ4X3QpOworCitleHRlcm4gaW50CitxbGEyeDAwX2xpcF9yZXNldChzY3NpX3FsYV9ob3N0X3QgKik7CisKK2V4dGVybiBpbnQKK3FsYTJ4MDBfc2VuZF9zbnMoc2NzaV9xbGFfaG9zdF90ICosIGRtYV9hZGRyX3QsIHVpbnQxNl90LCBzaXplX3QpOworCitleHRlcm4gaW50CitxbGEyeDAwX2xvZ2luX2ZhYnJpYyhzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QsIHVpbnQ4X3QsIHVpbnQ4X3QsIHVpbnQ4X3QsCisgICAgdWludDE2X3QgKiwgdWludDhfdCk7CisKK2V4dGVybiBpbnQKK3FsYTJ4MDBfbG9naW5fbG9jYWxfZGV2aWNlKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCwgdWludDE2X3QgKiwgdWludDhfdCk7CisKK2V4dGVybiBpbnQKK3FsYTJ4MDBfZmFicmljX2xvZ291dChzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCBsb29wX2lkKTsKKworZXh0ZXJuIGludAorcWxhMngwMF9mdWxsX2xvZ2luX2xpcChzY3NpX3FsYV9ob3N0X3QgKmhhKTsKKworZXh0ZXJuIGludAorcWxhMngwMF9nZXRfaWRfbGlzdChzY3NpX3FsYV9ob3N0X3QgKiwgdm9pZCAqLCBkbWFfYWRkcl90LCB1aW50MTZfdCAqKTsKKworZXh0ZXJuIGludAorcWxhMngwMF9nZXRfcmVzb3VyY2VfY250cyhzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QgKiwgdWludDE2X3QgKiwgdWludDE2X3QgKiwKKyAgICB1aW50MTZfdCAqKTsKKworZXh0ZXJuIGludAorcWxhMngwMF9nZXRfZmNhbF9wb3NpdGlvbl9tYXAoc2NzaV9xbGFfaG9zdF90ICpoYSwgY2hhciAqcG9zX21hcCk7CisKKy8qCisgKiBHbG9iYWwgRnVuY3Rpb24gUHJvdG90eXBlcyBpbiBxbGFfaXNyLmMgc291cmNlIGZpbGUuCisgKi8KK2V4dGVybiBpcnFyZXR1cm5fdCBxbGEyMTAwX2ludHJfaGFuZGxlcihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitleHRlcm4gaXJxcmV0dXJuX3QgcWxhMjMwMF9pbnRyX2hhbmRsZXIoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworZXh0ZXJuIHZvaWQgcWxhMngwMF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOworCisvKgorICogR2xvYmFsIEZ1bmN0aW9uIFByb3RvdHlwZXMgaW4gcWxhX3N1cC5jIHNvdXJjZSBmaWxlLgorICovCitleHRlcm4gdm9pZCBxbGEyeDAwX2xvY2tfbnZyYW1fYWNjZXNzKHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiB2b2lkIHFsYTJ4MDBfdW5sb2NrX252cmFtX2FjY2VzcyhzY3NpX3FsYV9ob3N0X3QgKik7CitleHRlcm4gdm9pZCBxbGEyeDAwX3JlbGVhc2VfbnZyYW1fcHJvdGVjdGlvbihzY3NpX3FsYV9ob3N0X3QgKik7CitleHRlcm4gdWludDE2X3QgcWxhMngwMF9nZXRfbnZyYW1fd29yZChzY3NpX3FsYV9ob3N0X3QgKiwgdWludDMyX3QpOworZXh0ZXJuIHZvaWQgcWxhMngwMF93cml0ZV9udnJhbV93b3JkKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MzJfdCwgdWludDE2X3QpOworLyoKKyAqIEdsb2JhbCBGdW5jdGlvbiBQcm90b3R5cGVzIGluIHFsYV9kYmcuYyBzb3VyY2UgZmlsZS4KKyAqLworZXh0ZXJuIHZvaWQgcWxhMjEwMF9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgcWxhMjMwMF9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgcWxhMjEwMF9hc2NpaV9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiB2b2lkIHFsYTIzMDBfYXNjaWlfZndfZHVtcChzY3NpX3FsYV9ob3N0X3QgKik7CitleHRlcm4gdm9pZCBxbGEyeDAwX2R1bXBfcmVncyhzY3NpX3FsYV9ob3N0X3QgKik7CitleHRlcm4gdm9pZCBxbGEyeDAwX2R1bXBfYnVmZmVyKHVpbnQ4X3QgKiwgdWludDMyX3QpOworZXh0ZXJuIHZvaWQgcWxhMngwMF9wcmludF9zY3NpX2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICopOworCisvKgorICogR2xvYmFsIEZ1bmN0aW9uIFByb3RvdHlwZXMgaW4gcWxhX2dzLmMgc291cmNlIGZpbGUuCisgKi8KK2V4dGVybiBpbnQgcWxhMngwMF9nYV9ueHQoc2NzaV9xbGFfaG9zdF90ICosIGZjX3BvcnRfdCAqKTsKK2V4dGVybiBpbnQgcWxhMngwMF9naWRfcHQoc2NzaV9xbGFfaG9zdF90ICosIHN3X2luZm9fdCAqKTsKK2V4dGVybiBpbnQgcWxhMngwMF9ncG5faWQoc2NzaV9xbGFfaG9zdF90ICosIHN3X2luZm9fdCAqKTsKK2V4dGVybiBpbnQgcWxhMngwMF9nbm5faWQoc2NzaV9xbGFfaG9zdF90ICosIHN3X2luZm9fdCAqKTsKK2V4dGVybiBpbnQgcWxhMngwMF9yZnRfaWQoc2NzaV9xbGFfaG9zdF90ICopOworZXh0ZXJuIGludCBxbGEyeDAwX3JmZl9pZChzY3NpX3FsYV9ob3N0X3QgKik7CitleHRlcm4gaW50IHFsYTJ4MDBfcm5uX2lkKHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiBpbnQgcWxhMngwMF9yc25uX25uKHNjc2lfcWxhX2hvc3RfdCAqKTsKKworLyoKKyAqIEdsb2JhbCBGdW5jdGlvbiBQcm90b3R5cGVzIGluIHFsYV9yc2NuLmMgc291cmNlIGZpbGUuCisgKi8KK2V4dGVybiBmY19wb3J0X3QgKnFsYTJ4MDBfYWxsb2NfcnNjbl9mY3BvcnQoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CitleHRlcm4gaW50IHFsYTJ4MDBfaGFuZGxlX3BvcnRfcnNjbihzY3NpX3FsYV9ob3N0X3QgKiwgdWludDMyX3QsIGZjX3BvcnRfdCAqLAorICAgIGludCk7CitleHRlcm4gdm9pZCBxbGEyeDAwX3Byb2Nlc3NfaW9kZXNjKHNjc2lfcWxhX2hvc3RfdCAqLCBzdHJ1Y3QgbWJ4X2VudHJ5ICopOworZXh0ZXJuIHZvaWQgcWxhMngwMF9jYW5jZWxfaW9fZGVzY3JpcHRvcnMoc2NzaV9xbGFfaG9zdF90ICopOworCisvKgorICogR2xvYmFsIEZ1bmN0aW9uIFByb3RvdHlwZXMgaW4gcWxhX3hpb2N0bC5jIHNvdXJjZSBmaWxlLgorICovCisjZGVmaW5lIHFsYTJ4MDBfZW5xdWV1ZV9hZW4oaGEsIGNtZCwgbW9kZSkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBxbGEyeDAwX2FsbG9jX2lvY3RsX21lbShoYSkJCSgwKQorI2RlZmluZSBxbGEyeDAwX2ZyZWVfaW9jdGxfbWVtKGhhKQkJZG8geyB9IHdoaWxlICgwKQorCisjZW5kaWYgLyogX1FMQV9HQkxfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzFkYWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMKQEAgLTAsMCArMSwxMDU5IEBACisvKgorICogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyAqCisgKiBRTG9naWMgSVNQMngwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAyLjYueAorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUUxvZ2ljIENvcnBvcmF0aW9uCisgKiAod3d3LnFsb2dpYy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2luY2x1ZGUgInFsYV9kZWYuaCIKKworc3RhdGljIGlubGluZSBtc19pb2NiX2VudHJ5X3QgKgorcWxhMngwMF9wcmVwX21zX2lvY2Ioc2NzaV9xbGFfaG9zdF90ICosIHVpbnQzMl90LCB1aW50MzJfdCk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGN0X3Nuc19yZXEgKgorcWxhMngwMF9wcmVwX2N0X3JlcShzdHJ1Y3QgY3Rfc25zX3JlcSAqLCB1aW50MTZfdCwgdWludDE2X3QpOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzbnNfY21kX3BrdCAqCitxbGEyeDAwX3ByZXBfc25zX2NtZChzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QsIHVpbnQxNl90LCB1aW50MTZfdCk7CisKK3N0YXRpYyBpbnQgcWxhMngwMF9zbnNfZ2Ffbnh0KHNjc2lfcWxhX2hvc3RfdCAqLCBmY19wb3J0X3QgKik7CitzdGF0aWMgaW50IHFsYTJ4MDBfc25zX2dpZF9wdChzY3NpX3FsYV9ob3N0X3QgKiwgc3dfaW5mb190ICopOworc3RhdGljIGludCBxbGEyeDAwX3Nuc19ncG5faWQoc2NzaV9xbGFfaG9zdF90ICosIHN3X2luZm9fdCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9zbnNfZ25uX2lkKHNjc2lfcWxhX2hvc3RfdCAqLCBzd19pbmZvX3QgKik7CitzdGF0aWMgaW50IHFsYTJ4MDBfc25zX3JmdF9pZChzY3NpX3FsYV9ob3N0X3QgKik7CitzdGF0aWMgaW50IHFsYTJ4MDBfc25zX3Jubl9pZChzY3NpX3FsYV9ob3N0X3QgKik7CisKKy8qKgorICogcWxhMngwMF9wcmVwX21zX2lvY2IoKSAtIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgZmllbGRzIGZvciBTTlMgQ1QgcXVlcnkuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEByZXFfc2l6ZTogcmVxdWVzdCBzaXplIGluIGJ5dGVzCisgKiBAcnNwX3NpemU6IHJlc3BvbnNlIHNpemUgaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgQGhhJ3MgbXNfaW9jYi4KKyAqLworc3RhdGljIGlubGluZSBtc19pb2NiX2VudHJ5X3QgKgorcWxhMngwMF9wcmVwX21zX2lvY2Ioc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDMyX3QgcmVxX3NpemUsIHVpbnQzMl90IHJzcF9zaXplKQoreworCW1zX2lvY2JfZW50cnlfdCAqbXNfcGt0OworCisJbXNfcGt0ID0gaGEtPm1zX2lvY2I7CisJbWVtc2V0KG1zX3BrdCwgMCwgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOworCisJbXNfcGt0LT5lbnRyeV90eXBlID0gTVNfSU9DQl9UWVBFOworCW1zX3BrdC0+ZW50cnlfY291bnQgPSAxOworCVNFVF9UQVJHRVRfSUQoaGEsIG1zX3BrdC0+bG9vcF9pZCwgU0lNUExFX05BTUVfU0VSVkVSKTsKKwltc19wa3QtPmNvbnRyb2xfZmxhZ3MgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KENGX1JFQUQgfCBDRl9IRUFEX1RBRyk7CisJbXNfcGt0LT50aW1lb3V0ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigyNSk7CisJbXNfcGt0LT5jbWRfZHNkX2NvdW50ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigxKTsKKwltc19wa3QtPnRvdGFsX2RzZF9jb3VudCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMik7CisJbXNfcGt0LT5yc3BfYnl0ZWNvdW50ID0gY3B1X3RvX2xlMzIocnNwX3NpemUpOworCW1zX3BrdC0+cmVxX2J5dGVjb3VudCA9IGNwdV90b19sZTMyKHJlcV9zaXplKTsKKworCW1zX3BrdC0+ZHNlZ19yZXFfYWRkcmVzc1swXSA9IGNwdV90b19sZTMyKExTRChoYS0+Y3Rfc25zX2RtYSkpOworCW1zX3BrdC0+ZHNlZ19yZXFfYWRkcmVzc1sxXSA9IGNwdV90b19sZTMyKE1TRChoYS0+Y3Rfc25zX2RtYSkpOworCW1zX3BrdC0+ZHNlZ19yZXFfbGVuZ3RoID0gbXNfcGt0LT5yZXFfYnl0ZWNvdW50OworCisJbXNfcGt0LT5kc2VnX3JzcF9hZGRyZXNzWzBdID0gY3B1X3RvX2xlMzIoTFNEKGhhLT5jdF9zbnNfZG1hKSk7CisJbXNfcGt0LT5kc2VnX3JzcF9hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoTVNEKGhhLT5jdF9zbnNfZG1hKSk7CisJbXNfcGt0LT5kc2VnX3JzcF9sZW5ndGggPSBtc19wa3QtPnJzcF9ieXRlY291bnQ7CisKKwlyZXR1cm4gKG1zX3BrdCk7Cit9CisKKy8qKgorICogcWxhMngwMF9wcmVwX2N0X3JlcSgpIC0gUHJlcGFyZSBjb21tb24gQ1QgcmVxdWVzdCBmaWVsZHMgZm9yIFNOUyBxdWVyeS4KKyAqIEBjdF9yZXE6IENUIHJlcXVlc3QgYnVmZmVyCisgKiBAY21kOiBHUyBjb21tYW5kCisgKiBAcnNwX3NpemU6IHJlc3BvbnNlIHNpemUgaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW50aXRpYWxpemVkIEBjdF9yZXEuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGN0X3Nuc19yZXEgKgorcWxhMngwMF9wcmVwX2N0X3JlcShzdHJ1Y3QgY3Rfc25zX3JlcSAqY3RfcmVxLCB1aW50MTZfdCBjbWQsIHVpbnQxNl90IHJzcF9zaXplKQoreworCW1lbXNldChjdF9yZXEsIDAsIHNpemVvZihzdHJ1Y3QgY3Rfc25zX3BrdCkpOworCisJY3RfcmVxLT5oZWFkZXIucmV2aXNpb24gPSAweDAxOworCWN0X3JlcS0+aGVhZGVyLmdzX3R5cGUgPSAweEZDOworCWN0X3JlcS0+aGVhZGVyLmdzX3N1YnR5cGUgPSAweDAyOworCWN0X3JlcS0+Y29tbWFuZCA9IGNwdV90b19iZTE2KGNtZCk7CisJY3RfcmVxLT5tYXhfcnNwX3NpemUgPSBjcHVfdG9fYmUxNigocnNwX3NpemUgLSAxNikgLyA0KTsKKworCXJldHVybiAoY3RfcmVxKTsKK30KKworCisvKioKKyAqIHFsYTJ4MDBfZ2Ffbnh0KCkgLSBTTlMgc2NhbiBmb3IgZmFicmljIGRldmljZXMgdmlhIEdBX05YVCBjb21tYW5kLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAZmNwb3J0OiBmY3BvcnQgZW50cnkgdG8gdXBkYXRlZAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitpbnQKK3FsYTJ4MDBfZ2Ffbnh0KHNjc2lfcWxhX2hvc3RfdCAqaGEsIGZjX3BvcnRfdCAqZmNwb3J0KQoreworCWludAkJcnZhbDsKKworCW1zX2lvY2JfZW50cnlfdAkqbXNfcGt0OworCXN0cnVjdCBjdF9zbnNfcmVxCSpjdF9yZXE7CisJc3RydWN0IGN0X3Nuc19yc3AJKmN0X3JzcDsKKworCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkgeworCQlyZXR1cm4gKHFsYTJ4MDBfc25zX2dhX254dChoYSwgZmNwb3J0KSk7CisJfQorCisJLyogSXNzdWUgR0FfTlhUICovCisJLyogUHJlcGFyZSBjb21tb24gTVMgSU9DQiAqLworCW1zX3BrdCA9IHFsYTJ4MDBfcHJlcF9tc19pb2NiKGhhLCBHQV9OWFRfUkVRX1NJWkUsIEdBX05YVF9SU1BfU0laRSk7CisKKwkvKiBQcmVwYXJlIENUIHJlcXVlc3QgKi8KKwljdF9yZXEgPSBxbGEyeDAwX3ByZXBfY3RfcmVxKCZoYS0+Y3Rfc25zLT5wLnJlcSwgR0FfTlhUX0NNRCwKKwkgICAgR0FfTlhUX1JTUF9TSVpFKTsKKwljdF9yc3AgPSAmaGEtPmN0X3Nucy0+cC5yc3A7CisKKwkvKiBQcmVwYXJlIENUIGFyZ3VtZW50cyAtLSBwb3J0X2lkICovCisJY3RfcmVxLT5yZXEucG9ydF9pZC5wb3J0X2lkWzBdID0gZmNwb3J0LT5kX2lkLmIuZG9tYWluOworCWN0X3JlcS0+cmVxLnBvcnRfaWQucG9ydF9pZFsxXSA9IGZjcG9ydC0+ZF9pZC5iLmFyZWE7CisJY3RfcmVxLT5yZXEucG9ydF9pZC5wb3J0X2lkWzJdID0gZmNwb3J0LT5kX2lkLmIuYWxfcGE7CisKKwkvKiBFeGVjdXRlIE1TIElPQ0IgKi8KKwlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKGhhLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hLAorCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHQV9OWFQgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCX0gZWxzZSBpZiAoY3RfcnNwLT5oZWFkZXIucmVzcG9uc2UgIT0KKwkgICAgX19jb25zdGFudF9jcHVfdG9fYmUxNihDVF9BQ0NFUFRfUkVTUE9OU0UpKSB7CisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHQV9OWFQgZmFpbGVkLCByZWplY3RlZCByZXF1ZXN0LCAiCisJCSAgICAiZ2Ffbnh0X3JzcDpcbiIsIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMl8zKHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKikmY3RfcnNwLT5oZWFkZXIsCisJCSAgICBzaXplb2Yoc3RydWN0IGN0X3JzcF9oZHIpKSk7CisJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCX0gZWxzZSB7CisJCS8qIFBvcHVsYXRlIGZjX3BvcnRfdCBlbnRyeS4gKi8KKwkJZmNwb3J0LT5kX2lkLmIuZG9tYWluID0gY3RfcnNwLT5yc3AuZ2Ffbnh0LnBvcnRfaWRbMF07CisJCWZjcG9ydC0+ZF9pZC5iLmFyZWEgPSBjdF9yc3AtPnJzcC5nYV9ueHQucG9ydF9pZFsxXTsKKwkJZmNwb3J0LT5kX2lkLmIuYWxfcGEgPSBjdF9yc3AtPnJzcC5nYV9ueHQucG9ydF9pZFsyXTsKKworCQltZW1jcHkoZmNwb3J0LT5ub2RlX25hbWUsIGN0X3JzcC0+cnNwLmdhX254dC5ub2RlX25hbWUsCisJCSAgICBXV05fU0laRSk7CisJCW1lbWNweShmY3BvcnQtPnBvcnRfbmFtZSwgY3RfcnNwLT5yc3AuZ2Ffbnh0LnBvcnRfbmFtZSwKKwkJICAgIFdXTl9TSVpFKTsKKworCQlpZiAoY3RfcnNwLT5yc3AuZ2Ffbnh0LnBvcnRfdHlwZSAhPSBOU19OX1BPUlRfVFlQRSAmJgorCQkgICAgY3RfcnNwLT5yc3AuZ2Ffbnh0LnBvcnRfdHlwZSAhPSBOU19OTF9QT1JUX1RZUEUpCisJCQlmY3BvcnQtPmRfaWQuYi5kb21haW4gPSAweGYwOworCisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHQV9OWFQgZW50cnkgLSAiCisJCSAgICAibm4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkgICAgInBuICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICJwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLAorCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbMF0sIGZjcG9ydC0+bm9kZV9uYW1lWzFdLAorCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbMl0sIGZjcG9ydC0+bm9kZV9uYW1lWzNdLAorCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbNF0sIGZjcG9ydC0+bm9kZV9uYW1lWzVdLAorCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbNl0sIGZjcG9ydC0+bm9kZV9uYW1lWzddLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbMF0sIGZjcG9ydC0+cG9ydF9uYW1lWzFdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbMl0sIGZjcG9ydC0+cG9ydF9uYW1lWzNdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNF0sIGZjcG9ydC0+cG9ydF9uYW1lWzVdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNl0sIGZjcG9ydC0+cG9ydF9uYW1lWzddLAorCQkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKioKKyAqIHFsYTJ4MDBfZ2lkX3B0KCkgLSBTTlMgc2NhbiBmb3IgZmFicmljIGRldmljZXMgdmlhIEdJRF9QVCBjb21tYW5kLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAbGlzdDogc3dpdGNoIGluZm8gZW50cmllcyB0byBwb3B1bGF0ZQorICoKKyAqIE5PVEU6IE5vbi1OeF9Qb3J0cyBhcmUgbm90IHJlcXVlc3RlZC4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworaW50CitxbGEyeDAwX2dpZF9wdChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzd19pbmZvX3QgKmxpc3QpCit7CisJaW50CQlydmFsOworCXVpbnQxNl90CWk7CisKKwltc19pb2NiX2VudHJ5X3QJKm1zX3BrdDsKKwlzdHJ1Y3QgY3Rfc25zX3JlcQkqY3RfcmVxOworCXN0cnVjdCBjdF9zbnNfcnNwCSpjdF9yc3A7CisKKwlzdHJ1Y3QgY3Rfc25zX2dpZF9wdF9kYXRhICpnaWRfZGF0YTsKKworCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkgeworCQlyZXR1cm4gKHFsYTJ4MDBfc25zX2dpZF9wdChoYSwgbGlzdCkpOworCX0KKworCWdpZF9kYXRhID0gTlVMTDsKKworCS8qIElzc3VlIEdJRF9QVCAqLworCS8qIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgKi8KKwltc19wa3QgPSBxbGEyeDAwX3ByZXBfbXNfaW9jYihoYSwgR0lEX1BUX1JFUV9TSVpFLCBHSURfUFRfUlNQX1NJWkUpOworCisJLyogUHJlcGFyZSBDVCByZXF1ZXN0ICovCisJY3RfcmVxID0gcWxhMngwMF9wcmVwX2N0X3JlcSgmaGEtPmN0X3Nucy0+cC5yZXEsIEdJRF9QVF9DTUQsCisJICAgIEdJRF9QVF9SU1BfU0laRSk7CisJY3RfcnNwID0gJmhhLT5jdF9zbnMtPnAucnNwOworCisJLyogUHJlcGFyZSBDVCBhcmd1bWVudHMgLS0gcG9ydF90eXBlICovCisJY3RfcmVxLT5yZXEuZ2lkX3B0LnBvcnRfdHlwZSA9IE5TX05YX1BPUlRfVFlQRTsKKworCS8qIEV4ZWN1dGUgTVMgSU9DQiAqLworCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IoaGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCisJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdJRF9QVCBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7CisJfSBlbHNlIGlmIChjdF9yc3AtPmhlYWRlci5yZXNwb25zZSAhPQorCSAgICBfX2NvbnN0YW50X2NwdV90b19iZTE2KENUX0FDQ0VQVF9SRVNQT05TRSkpIHsKKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdJRF9QVCBmYWlsZWQsIHJlamVjdGVkIHJlcXVlc3QsICIKKwkJICAgICJnaWRfcHRfcnNwOlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcyXzMocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKSZjdF9yc3AtPmhlYWRlciwKKwkJICAgIHNpemVvZihzdHJ1Y3QgY3RfcnNwX2hkcikpKTsKKwkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJfSBlbHNlIHsKKwkJLyogU2V0IHBvcnQgSURzIGluIHN3aXRjaCBpbmZvIGxpc3QuICovCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfRklCUkVfREVWSUNFUzsgaSsrKSB7CisJCQlnaWRfZGF0YSA9ICZjdF9yc3AtPnJzcC5naWRfcHQuZW50cmllc1tpXTsKKwkJCWxpc3RbaV0uZF9pZC5iLmRvbWFpbiA9IGdpZF9kYXRhLT5wb3J0X2lkWzBdOworCQkJbGlzdFtpXS5kX2lkLmIuYXJlYSA9IGdpZF9kYXRhLT5wb3J0X2lkWzFdOworCQkJbGlzdFtpXS5kX2lkLmIuYWxfcGEgPSBnaWRfZGF0YS0+cG9ydF9pZFsyXTsKKworCQkJLyogTGFzdCBvbmUgZXhpdC4gKi8KKwkJCWlmIChnaWRfZGF0YS0+Y29udHJvbF9ieXRlICYgQklUXzcpIHsKKwkJCQlsaXN0W2ldLmRfaWQuYi5yc3ZkXzEgPSBnaWRfZGF0YS0+Y29udHJvbF9ieXRlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogSWYgd2UndmUgdXNlZCBhbGwgYXZhaWxhYmxlIHNsb3RzLCB0aGVuIHRoZSBzd2l0Y2ggaXMKKwkJICogcmVwb3J0aW5nIGJhY2sgbW9yZSBkZXZpY2VzIHRoYW4gd2UgY2FuIGhhbmRsZSB3aXRoIHRoaXMKKwkJICogc2luZ2xlIGNhbGwuICBSZXR1cm4gYSBmYWlsZWQgc3RhdHVzLCBhbmQgbGV0IEdBX05YVCBoYW5kbGUKKwkJICogdGhlIG92ZXJsb2FkLgorCQkgKi8KKwkJaWYgKGkgPT0gTUFYX0ZJQlJFX0RFVklDRVMpIAorCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworLyoqCisgKiBxbGEyeDAwX2dwbl9pZCgpIC0gU05TIEdldCBQb3J0IE5hbWUgKEdQTl9JRCkgcXVlcnkuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBsaXN0OiBzd2l0Y2ggaW5mbyBlbnRyaWVzIHRvIHBvcHVsYXRlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludAorcWxhMngwMF9ncG5faWQoc2NzaV9xbGFfaG9zdF90ICpoYSwgc3dfaW5mb190ICpsaXN0KQoreworCWludAkJcnZhbDsKKwl1aW50MTZfdAlpOworCisJbXNfaW9jYl9lbnRyeV90CSptc19wa3Q7CisJc3RydWN0IGN0X3Nuc19yZXEJKmN0X3JlcTsKKwlzdHJ1Y3QgY3Rfc25zX3JzcAkqY3RfcnNwOworCisJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKSB7CisJCXJldHVybiAocWxhMngwMF9zbnNfZ3BuX2lkKGhhLCBsaXN0KSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1BWF9GSUJSRV9ERVZJQ0VTOyBpKyspIHsKKwkJLyogSXNzdWUgR1BOX0lEICovCisJCS8qIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgKi8KKwkJbXNfcGt0ID0gcWxhMngwMF9wcmVwX21zX2lvY2IoaGEsIEdQTl9JRF9SRVFfU0laRSwKKwkJICAgIEdQTl9JRF9SU1BfU0laRSk7CisKKwkJLyogUHJlcGFyZSBDVCByZXF1ZXN0ICovCisJCWN0X3JlcSA9IHFsYTJ4MDBfcHJlcF9jdF9yZXEoJmhhLT5jdF9zbnMtPnAucmVxLCBHUE5fSURfQ01ELAorCQkgICAgR1BOX0lEX1JTUF9TSVpFKTsKKwkJY3RfcnNwID0gJmhhLT5jdF9zbnMtPnAucnNwOworCisJCS8qIFByZXBhcmUgQ1QgYXJndW1lbnRzIC0tIHBvcnRfaWQgKi8KKwkJY3RfcmVxLT5yZXEucG9ydF9pZC5wb3J0X2lkWzBdID0gbGlzdFtpXS5kX2lkLmIuZG9tYWluOworCQljdF9yZXEtPnJlcS5wb3J0X2lkLnBvcnRfaWRbMV0gPSBsaXN0W2ldLmRfaWQuYi5hcmVhOworCQljdF9yZXEtPnJlcS5wb3J0X2lkLnBvcnRfaWRbMl0gPSBsaXN0W2ldLmRfaWQuYi5hbF9wYTsKKworCQkvKiBFeGVjdXRlIE1TIElPQ0IgKi8KKwkJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihoYSwgaGEtPm1zX2lvY2IsIGhhLT5tc19pb2NiX2RtYSwKKwkJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKKwkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCS8qRU1QVFkqLworCQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdQTl9JRCBpc3N1ZSBJT0NCIGZhaWxlZCAiCisJCQkgICAgIiglZCkuXG4iLCBoYS0+aG9zdF9ubywgcnZhbCkpOworCQl9IGVsc2UgaWYgKGN0X3JzcC0+aGVhZGVyLnJlc3BvbnNlICE9CisJCSAgICBfX2NvbnN0YW50X2NwdV90b19iZTE2KENUX0FDQ0VQVF9SRVNQT05TRSkpIHsKKwkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHUE5fSUQgZmFpbGVkLCByZWplY3RlZCAiCisJCQkgICAgInJlcXVlc3QsIGdwbl9pZF9yc3A6XG4iLCBoYS0+aG9zdF9ubykpOworCQkJREVCVUcyXzMocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKSZjdF9yc3AtPmhlYWRlciwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGN0X3JzcF9oZHIpKSk7CisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJfSBlbHNlIHsKKwkJCS8qIFNhdmUgcG9ydG5hbWUgKi8KKwkJCW1lbWNweShsaXN0W2ldLnBvcnRfbmFtZSwKKwkJCSAgICBjdF9yc3AtPnJzcC5ncG5faWQucG9ydF9uYW1lLCBXV05fU0laRSk7CisJCX0KKworCQkvKiBMYXN0IGRldmljZSBleGl0LiAqLworCQlpZiAobGlzdFtpXS5kX2lkLmIucnN2ZF8xICE9IDApCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKioKKyAqIHFsYTJ4MDBfZ25uX2lkKCkgLSBTTlMgR2V0IE5vZGUgTmFtZSAoR05OX0lEKSBxdWVyeS4KKyAqIEBoYTogSEEgY29udGV4dAorICogQGxpc3Q6IHN3aXRjaCBpbmZvIGVudHJpZXMgdG8gcG9wdWxhdGUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworaW50CitxbGEyeDAwX2dubl9pZChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzd19pbmZvX3QgKmxpc3QpCit7CisJaW50CQlydmFsOworCXVpbnQxNl90CWk7CisKKwltc19pb2NiX2VudHJ5X3QJKm1zX3BrdDsKKwlzdHJ1Y3QgY3Rfc25zX3JlcQkqY3RfcmVxOworCXN0cnVjdCBjdF9zbnNfcnNwCSpjdF9yc3A7CisKKwlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpIHsKKwkJcmV0dXJuIChxbGEyeDAwX3Nuc19nbm5faWQoaGEsIGxpc3QpKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0ZJQlJFX0RFVklDRVM7IGkrKykgeworCQkvKiBJc3N1ZSBHTk5fSUQgKi8KKwkJLyogUHJlcGFyZSBjb21tb24gTVMgSU9DQiAqLworCQltc19wa3QgPSBxbGEyeDAwX3ByZXBfbXNfaW9jYihoYSwgR05OX0lEX1JFUV9TSVpFLAorCQkgICAgR05OX0lEX1JTUF9TSVpFKTsKKworCQkvKiBQcmVwYXJlIENUIHJlcXVlc3QgKi8KKwkJY3RfcmVxID0gcWxhMngwMF9wcmVwX2N0X3JlcSgmaGEtPmN0X3Nucy0+cC5yZXEsIEdOTl9JRF9DTUQsCisJCSAgICBHTk5fSURfUlNQX1NJWkUpOworCQljdF9yc3AgPSAmaGEtPmN0X3Nucy0+cC5yc3A7CisKKwkJLyogUHJlcGFyZSBDVCBhcmd1bWVudHMgLS0gcG9ydF9pZCAqLworCQljdF9yZXEtPnJlcS5wb3J0X2lkLnBvcnRfaWRbMF0gPSBsaXN0W2ldLmRfaWQuYi5kb21haW47CisJCWN0X3JlcS0+cmVxLnBvcnRfaWQucG9ydF9pZFsxXSA9IGxpc3RbaV0uZF9pZC5iLmFyZWE7CisJCWN0X3JlcS0+cmVxLnBvcnRfaWQucG9ydF9pZFsyXSA9IGxpc3RbaV0uZF9pZC5iLmFsX3BhOworCisJCS8qIEV4ZWN1dGUgTVMgSU9DQiAqLworCQlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKGhhLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hLAorCQkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOworCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkJLypFTVBUWSovCisJCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR05OX0lEIGlzc3VlIElPQ0IgZmFpbGVkICIKKwkJCSAgICAiKCVkKS5cbiIsIGhhLT5ob3N0X25vLCBydmFsKSk7CisJCX0gZWxzZSBpZiAoY3RfcnNwLT5oZWFkZXIucmVzcG9uc2UgIT0KKwkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoQ1RfQUNDRVBUX1JFU1BPTlNFKSkgeworCQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdOTl9JRCBmYWlsZWQsIHJlamVjdGVkICIKKwkJCSAgICAicmVxdWVzdCwgZ25uX2lkX3JzcDpcbiIsIGhhLT5ob3N0X25vKSk7CisJCQlERUJVRzJfMyhxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopJmN0X3JzcC0+aGVhZGVyLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgY3RfcnNwX2hkcikpKTsKKwkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQl9IGVsc2UgeworCQkJLyogU2F2ZSBub2RlbmFtZSAqLworCQkJbWVtY3B5KGxpc3RbaV0ubm9kZV9uYW1lLAorCQkJICAgIGN0X3JzcC0+cnNwLmdubl9pZC5ub2RlX25hbWUsIFdXTl9TSVpFKTsKKworCQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdJRF9QVCBlbnRyeSAtICIKKwkJCSAgICAibm4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkJICAgICJwbiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCQkgICAgInBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLAorCQkJICAgIGhhLT5ob3N0X25vLAorCQkJICAgIGxpc3RbaV0ubm9kZV9uYW1lWzBdLCBsaXN0W2ldLm5vZGVfbmFtZVsxXSwKKwkJCSAgICBsaXN0W2ldLm5vZGVfbmFtZVsyXSwgbGlzdFtpXS5ub2RlX25hbWVbM10sCisJCQkgICAgbGlzdFtpXS5ub2RlX25hbWVbNF0sIGxpc3RbaV0ubm9kZV9uYW1lWzVdLAorCQkJICAgIGxpc3RbaV0ubm9kZV9uYW1lWzZdLCBsaXN0W2ldLm5vZGVfbmFtZVs3XSwKKwkJCSAgICBsaXN0W2ldLnBvcnRfbmFtZVswXSwgbGlzdFtpXS5wb3J0X25hbWVbMV0sCisJCQkgICAgbGlzdFtpXS5wb3J0X25hbWVbMl0sIGxpc3RbaV0ucG9ydF9uYW1lWzNdLAorCQkJICAgIGxpc3RbaV0ucG9ydF9uYW1lWzRdLCBsaXN0W2ldLnBvcnRfbmFtZVs1XSwKKwkJCSAgICBsaXN0W2ldLnBvcnRfbmFtZVs2XSwgbGlzdFtpXS5wb3J0X25hbWVbN10sCisJCQkgICAgbGlzdFtpXS5kX2lkLmIuZG9tYWluLCBsaXN0W2ldLmRfaWQuYi5hcmVhLAorCQkJICAgIGxpc3RbaV0uZF9pZC5iLmFsX3BhKSk7CisJCX0KKworCQkvKiBMYXN0IGRldmljZSBleGl0LiAqLworCQlpZiAobGlzdFtpXS5kX2lkLmIucnN2ZF8xICE9IDApCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKioKKyAqIHFsYTJ4MDBfcmZ0X2lkKCkgLSBTTlMgUmVnaXN0ZXIgRkMtNCBUWVBFcyAoUkZUX0lEKSBzdXBwb3J0ZWQgYnkgdGhlIEhCQS4KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitpbnQKK3FsYTJ4MDBfcmZ0X2lkKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50CQlydmFsOworCisJbXNfaW9jYl9lbnRyeV90CSptc19wa3Q7CisJc3RydWN0IGN0X3Nuc19yZXEJKmN0X3JlcTsKKwlzdHJ1Y3QgY3Rfc25zX3JzcAkqY3RfcnNwOworCisJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKSB7CisJCXJldHVybiAocWxhMngwMF9zbnNfcmZ0X2lkKGhhKSk7CisJfQorCisJLyogSXNzdWUgUkZUX0lEICovCisJLyogUHJlcGFyZSBjb21tb24gTVMgSU9DQiAqLworCW1zX3BrdCA9IHFsYTJ4MDBfcHJlcF9tc19pb2NiKGhhLCBSRlRfSURfUkVRX1NJWkUsIFJGVF9JRF9SU1BfU0laRSk7CisKKwkvKiBQcmVwYXJlIENUIHJlcXVlc3QgKi8KKwljdF9yZXEgPSBxbGEyeDAwX3ByZXBfY3RfcmVxKCZoYS0+Y3Rfc25zLT5wLnJlcSwgUkZUX0lEX0NNRCwKKwkgICAgUkZUX0lEX1JTUF9TSVpFKTsKKwljdF9yc3AgPSAmaGEtPmN0X3Nucy0+cC5yc3A7CisKKwkvKiBQcmVwYXJlIENUIGFyZ3VtZW50cyAtLSBwb3J0X2lkLCBGQy00IHR5cGVzICovCisJY3RfcmVxLT5yZXEucmZ0X2lkLnBvcnRfaWRbMF0gPSBoYS0+ZF9pZC5iLmRvbWFpbjsKKwljdF9yZXEtPnJlcS5yZnRfaWQucG9ydF9pZFsxXSA9IGhhLT5kX2lkLmIuYXJlYTsKKwljdF9yZXEtPnJlcS5yZnRfaWQucG9ydF9pZFsyXSA9IGhhLT5kX2lkLmIuYWxfcGE7CisKKwljdF9yZXEtPnJlcS5yZnRfaWQuZmM0X3R5cGVzWzJdID0gMHgwMTsJCS8qIEZDUC0zICovCisKKwkvKiBFeGVjdXRlIE1TIElPQ0IgKi8KKwlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKGhhLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hLAorCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBSRlRfSUQgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCX0gZWxzZSBpZiAoY3RfcnNwLT5oZWFkZXIucmVzcG9uc2UgIT0KKwkgICAgX19jb25zdGFudF9jcHVfdG9fYmUxNihDVF9BQ0NFUFRfUkVTUE9OU0UpKSB7CisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBSRlRfSUQgZmFpbGVkLCByZWplY3RlZCAiCisJCSAgICAicmVxdWVzdCwgcmZ0X2lkX3JzcDpcbiIsIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMl8zKHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKikmY3RfcnNwLT5oZWFkZXIsCisJCSAgICBzaXplb2Yoc3RydWN0IGN0X3JzcF9oZHIpKSk7CisJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCX0gZWxzZSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUkZUX0lEIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKioKKyAqIHFsYTJ4MDBfcmZmX2lkKCkgLSBTTlMgUmVnaXN0ZXIgRkMtNCBGZWF0dXJlcyAoUkZGX0lEKSBzdXBwb3J0ZWQgYnkgdGhlIEhCQS4KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitpbnQKK3FsYTJ4MDBfcmZmX2lkKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50CQlydmFsOworCisJbXNfaW9jYl9lbnRyeV90CSptc19wa3Q7CisJc3RydWN0IGN0X3Nuc19yZXEJKmN0X3JlcTsKKwlzdHJ1Y3QgY3Rfc25zX3JzcAkqY3RfcnNwOworCisJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUkZGX0lEIGNhbGwgdW5zdXBwb3J0ZWQgb24gIgorCQkgICAgIklTUDIxMDAvSVNQMjIwMC5cbiIsIGhhLT5ob3N0X25vKSk7CisJCXJldHVybiAoUUxBX1NVQ0NFU1MpOworCX0KKworCS8qIElzc3VlIFJGRl9JRCAqLworCS8qIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgKi8KKwltc19wa3QgPSBxbGEyeDAwX3ByZXBfbXNfaW9jYihoYSwgUkZGX0lEX1JFUV9TSVpFLCBSRkZfSURfUlNQX1NJWkUpOworCisJLyogUHJlcGFyZSBDVCByZXF1ZXN0ICovCisJY3RfcmVxID0gcWxhMngwMF9wcmVwX2N0X3JlcSgmaGEtPmN0X3Nucy0+cC5yZXEsIFJGRl9JRF9DTUQsCisJICAgIFJGRl9JRF9SU1BfU0laRSk7CisJY3RfcnNwID0gJmhhLT5jdF9zbnMtPnAucnNwOworCisJLyogUHJlcGFyZSBDVCBhcmd1bWVudHMgLS0gcG9ydF9pZCwgRkMtNCBmZWF0dXJlLCBGQy00IHR5cGUgKi8KKwljdF9yZXEtPnJlcS5yZmZfaWQucG9ydF9pZFswXSA9IGhhLT5kX2lkLmIuZG9tYWluOworCWN0X3JlcS0+cmVxLnJmZl9pZC5wb3J0X2lkWzFdID0gaGEtPmRfaWQuYi5hcmVhOworCWN0X3JlcS0+cmVxLnJmZl9pZC5wb3J0X2lkWzJdID0gaGEtPmRfaWQuYi5hbF9wYTsKKworCWN0X3JlcS0+cmVxLnJmZl9pZC5mYzRfdHlwZSA9IDB4MDg7CQkvKiBTQ1NJIC0gRkNQICovCisKKwkvKiBFeGVjdXRlIE1TIElPQ0IgKi8KKwlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKGhhLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hLAorCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBSRkZfSUQgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCX0gZWxzZSBpZiAoY3RfcnNwLT5oZWFkZXIucmVzcG9uc2UgIT0KKwkgICAgX19jb25zdGFudF9jcHVfdG9fYmUxNihDVF9BQ0NFUFRfUkVTUE9OU0UpKSB7CisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBSRkZfSUQgZmFpbGVkLCByZWplY3RlZCAiCisJCSAgICAicmVxdWVzdCwgcmZmX2lkX3JzcDpcbiIsIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMl8zKHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKikmY3RfcnNwLT5oZWFkZXIsCisJCSAgICBzaXplb2Yoc3RydWN0IGN0X3JzcF9oZHIpKSk7CisJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCX0gZWxzZSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUkZGX0lEIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKioKKyAqIHFsYTJ4MDBfcm5uX2lkKCkgLSBTTlMgUmVnaXN0ZXIgTm9kZSBOYW1lIChSTk5fSUQpIG9mIHRoZSBIQkEuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworaW50CitxbGEyeDAwX3Jubl9pZChzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludAkJcnZhbDsKKworCW1zX2lvY2JfZW50cnlfdAkqbXNfcGt0OworCXN0cnVjdCBjdF9zbnNfcmVxCSpjdF9yZXE7CisJc3RydWN0IGN0X3Nuc19yc3AJKmN0X3JzcDsKKworCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkgeworCQlyZXR1cm4gKHFsYTJ4MDBfc25zX3Jubl9pZChoYSkpOworCX0KKworCS8qIElzc3VlIFJOTl9JRCAqLworCS8qIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgKi8KKwltc19wa3QgPSBxbGEyeDAwX3ByZXBfbXNfaW9jYihoYSwgUk5OX0lEX1JFUV9TSVpFLCBSTk5fSURfUlNQX1NJWkUpOworCisJLyogUHJlcGFyZSBDVCByZXF1ZXN0ICovCisJY3RfcmVxID0gcWxhMngwMF9wcmVwX2N0X3JlcSgmaGEtPmN0X3Nucy0+cC5yZXEsIFJOTl9JRF9DTUQsCisJICAgIFJOTl9JRF9SU1BfU0laRSk7CisJY3RfcnNwID0gJmhhLT5jdF9zbnMtPnAucnNwOworCisJLyogUHJlcGFyZSBDVCBhcmd1bWVudHMgLS0gcG9ydF9pZCwgbm9kZV9uYW1lICovCisJY3RfcmVxLT5yZXEucm5uX2lkLnBvcnRfaWRbMF0gPSBoYS0+ZF9pZC5iLmRvbWFpbjsKKwljdF9yZXEtPnJlcS5ybm5faWQucG9ydF9pZFsxXSA9IGhhLT5kX2lkLmIuYXJlYTsKKwljdF9yZXEtPnJlcS5ybm5faWQucG9ydF9pZFsyXSA9IGhhLT5kX2lkLmIuYWxfcGE7CisKKwltZW1jcHkoY3RfcmVxLT5yZXEucm5uX2lkLm5vZGVfbmFtZSwgaGEtPmluaXRfY2ItPm5vZGVfbmFtZSwgV1dOX1NJWkUpOworCisJLyogRXhlY3V0ZSBNUyBJT0NCICovCisJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihoYSwgaGEtPm1zX2lvY2IsIGhhLT5tc19pb2NiX2RtYSwKKwkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUk5OX0lEIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgaWYgKGN0X3JzcC0+aGVhZGVyLnJlc3BvbnNlICE9CisJICAgIF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoQ1RfQUNDRVBUX1JFU1BPTlNFKSkgeworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUk5OX0lEIGZhaWxlZCwgcmVqZWN0ZWQgIgorCQkgICAgInJlcXVlc3QsIHJubl9pZF9yc3A6XG4iLCBoYS0+aG9zdF9ubykpOworCQlERUJVRzJfMyhxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopJmN0X3JzcC0+aGVhZGVyLAorCQkgICAgc2l6ZW9mKHN0cnVjdCBjdF9yc3BfaGRyKSkpOworCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9IGVsc2UgeworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJOTl9JRCBleGl0aW5nIG5vcm1hbGx5LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworLyoqCisgKiBxbGEyeDAwX3Jzbm5fbm4oKSAtIFNOUyBSZWdpc3RlciBTeW1ib2xpYyBOb2RlIE5hbWUgKFJTTk5fTk4pIG9mIHRoZSBIQkEuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworaW50CitxbGEyeDAwX3Jzbm5fbm4oc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQJCXJ2YWw7CisJdWludDhfdAkJKnNubjsKKwl1aW50OF90CQl2ZXJzaW9uWzIwXTsKKworCW1zX2lvY2JfZW50cnlfdAkqbXNfcGt0OworCXN0cnVjdCBjdF9zbnNfcmVxCSpjdF9yZXE7CisJc3RydWN0IGN0X3Nuc19yc3AJKmN0X3JzcDsKKworCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkgeworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJTTk5fSUQgY2FsbCB1bnN1cHBvcnRlZCBvbiAiCisJCSAgICAiSVNQMjEwMC9JU1AyMjAwLlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJcmV0dXJuIChRTEFfU1VDQ0VTUyk7CisJfQorCisJLyogSXNzdWUgUlNOTl9OTiAqLworCS8qIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgKi8KKwkvKiAgIFJlcXVlc3Qgc2l6ZSBhZGp1c3RlZCBhZnRlciBDVCBwcmVwYXJhdGlvbiAqLworCW1zX3BrdCA9IHFsYTJ4MDBfcHJlcF9tc19pb2NiKGhhLCAwLCBSU05OX05OX1JTUF9TSVpFKTsKKworCS8qIFByZXBhcmUgQ1QgcmVxdWVzdCAqLworCWN0X3JlcSA9IHFsYTJ4MDBfcHJlcF9jdF9yZXEoJmhhLT5jdF9zbnMtPnAucmVxLCBSU05OX05OX0NNRCwKKwkgICAgUlNOTl9OTl9SU1BfU0laRSk7CisJY3RfcnNwID0gJmhhLT5jdF9zbnMtPnAucnNwOworCisJLyogUHJlcGFyZSBDVCBhcmd1bWVudHMgLS0gbm9kZV9uYW1lLCBzeW1ib2xpYyBub2RlX25hbWUsIHNpemUgKi8KKwltZW1jcHkoY3RfcmVxLT5yZXEucnNubl9ubi5ub2RlX25hbWUsIGhhLT5pbml0X2NiLT5ub2RlX25hbWUsIFdXTl9TSVpFKTsKKwkKKwkvKiBQcmVwYXJlIHRoZSBTeW1ib2xpYyBOb2RlIE5hbWUgKi8KKwkvKiBCb2FyZCB0eXBlICovCisJc25uID0gY3RfcmVxLT5yZXEucnNubl9ubi5zeW1fbm9kZV9uYW1lOworCXN0cmNweShzbm4sIGhhLT5tb2RlbF9udW1iZXIpOworCS8qIEZpcm13YXJlIHZlcnNpb24gKi8KKwlzdHJjYXQoc25uLCAiIEZXOnYiKTsKKwlzcHJpbnRmKHZlcnNpb24sICIlZC4lMDJkLiUwMmQiLCBoYS0+ZndfbWFqb3JfdmVyc2lvbiwKKwkgICAgaGEtPmZ3X21pbm9yX3ZlcnNpb24sIGhhLT5md19zdWJtaW5vcl92ZXJzaW9uKTsKKwlzdHJjYXQoc25uLCB2ZXJzaW9uKTsKKwkvKiBEcml2ZXIgdmVyc2lvbiAqLworCXN0cmNhdChzbm4sICIgRFZSOnYiKTsKKwlzdHJjYXQoc25uLCBxbGEyeDAwX3ZlcnNpb25fc3RyKTsKKworCS8qIENhbGN1bGF0ZSBTTk4gbGVuZ3RoICovCisJY3RfcmVxLT5yZXEucnNubl9ubi5uYW1lX2xlbiA9ICh1aW50OF90KXN0cmxlbihzbm4pOworCisJLyogVXBkYXRlIE1TIElPQ0IgcmVxdWVzdCAqLworCW1zX3BrdC0+cmVxX2J5dGVjb3VudCA9CisJICAgIGNwdV90b19sZTMyKDI0ICsgMSArIGN0X3JlcS0+cmVxLnJzbm5fbm4ubmFtZV9sZW4pOworCW1zX3BrdC0+ZHNlZ19yZXFfbGVuZ3RoID0gbXNfcGt0LT5yZXFfYnl0ZWNvdW50OworCisJLyogRXhlY3V0ZSBNUyBJT0NCICovCisJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihoYSwgaGEtPm1zX2lvY2IsIGhhLT5tc19pb2NiX2RtYSwKKwkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUlNOTl9OTiBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7CisJfSBlbHNlIGlmIChjdF9yc3AtPmhlYWRlci5yZXNwb25zZSAhPQorCSAgICBfX2NvbnN0YW50X2NwdV90b19iZTE2KENUX0FDQ0VQVF9SRVNQT05TRSkpIHsKKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJTTk5fTk4gZmFpbGVkLCByZWplY3RlZCAiCisJCSAgICAicmVxdWVzdCwgcnNubl9pZF9yc3A6XG4iLCBoYS0+aG9zdF9ubykpOworCQlERUJVRzJfMyhxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopJmN0X3JzcC0+aGVhZGVyLAorCQkgICAgc2l6ZW9mKHN0cnVjdCBjdF9yc3BfaGRyKSkpOworCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9IGVsc2UgeworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJTTk5fTk4gZXhpdGluZyBub3JtYWxseS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCX0KKworCXJldHVybiAocnZhbCk7Cit9CisKKworLyoqCisgKiBxbGEyeDAwX3ByZXBfc25zX2NtZCgpIC0gUHJlcGFyZSBjb21tb24gU05TIGNvbW1hbmQgcmVxdWVzdCBmaWVsZHMgZm9yIHF1ZXJ5LgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAY21kOiBHUyBjb21tYW5kCisgKiBAc2NtZF9sZW46IFN1YmNvbW1hbmQgbGVuZ3RoCisgKiBAZGF0YV9zaXplOiByZXNwb25zZSBzaXplIGluIGJ5dGVzCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIEBoYSdzIHNuc19jbWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNuc19jbWRfcGt0ICoKK3FsYTJ4MDBfcHJlcF9zbnNfY21kKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90IGNtZCwgdWludDE2X3Qgc2NtZF9sZW4sCisgICAgdWludDE2X3QgZGF0YV9zaXplKQoreworCXVpbnQxNl90CQl3YzsKKwlzdHJ1Y3Qgc25zX2NtZF9wa3QJKnNuc19jbWQ7CisKKwlzbnNfY21kID0gaGEtPnNuc19jbWQ7CisJbWVtc2V0KHNuc19jbWQsIDAsIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpKTsKKwl3YyA9IGRhdGFfc2l6ZSAvIDI7CQkJLyogU2l6ZSBpbiAxNmJpdCB3b3Jkcy4gKi8KKwlzbnNfY21kLT5wLmNtZC5idWZmZXJfbGVuZ3RoID0gY3B1X3RvX2xlMTYod2MpOworCXNuc19jbWQtPnAuY21kLmJ1ZmZlcl9hZGRyZXNzWzBdID0gY3B1X3RvX2xlMzIoTFNEKGhhLT5zbnNfY21kX2RtYSkpOworCXNuc19jbWQtPnAuY21kLmJ1ZmZlcl9hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoTVNEKGhhLT5zbnNfY21kX2RtYSkpOworCXNuc19jbWQtPnAuY21kLnN1YmNvbW1hbmRfbGVuZ3RoID0gY3B1X3RvX2xlMTYoc2NtZF9sZW4pOworCXNuc19jbWQtPnAuY21kLnN1YmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWQpOworCXdjID0gKGRhdGFfc2l6ZSAtIDE2KSAvIDQ7CQkvKiBTaXplIGluIDMyYml0IHdvcmRzLiAqLworCXNuc19jbWQtPnAuY21kLnNpemUgPSBjcHVfdG9fbGUxNih3Yyk7CisKKwlyZXR1cm4gKHNuc19jbWQpOworfQorCisvKioKKyAqIHFsYTJ4MDBfc25zX2dhX254dCgpIC0gU05TIHNjYW4gZm9yIGZhYnJpYyBkZXZpY2VzIHZpYSBHQV9OWFQgY29tbWFuZC4KKyAqIEBoYTogSEEgY29udGV4dAorICogQGZjcG9ydDogZmNwb3J0IGVudHJ5IHRvIHVwZGF0ZWQKKyAqCisgKiBUaGlzIGNvbW1hbmQgdXNlcyB0aGUgb2xkIEV4ZWN0dXRlIFNOUyBDb21tYW5kIG1haWxib3ggcm91dGluZS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9zbnNfZ2Ffbnh0KHNjc2lfcWxhX2hvc3RfdCAqaGEsIGZjX3BvcnRfdCAqZmNwb3J0KQoreworCWludAkJcnZhbDsKKworCXN0cnVjdCBzbnNfY21kX3BrdAkqc25zX2NtZDsKKworCS8qIElzc3VlIEdBX05YVC4gKi8KKwkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIHJlcXVlc3QuICovCisJc25zX2NtZCA9IHFsYTJ4MDBfcHJlcF9zbnNfY21kKGhhLCBHQV9OWFRfQ01ELCBHQV9OWFRfU05TX1NDTURfTEVOLAorCSAgICBHQV9OWFRfU05TX0RBVEFfU0laRSk7CisKKwkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIGFyZ3VtZW50cyAtLSBwb3J0X2lkLiAqLworCXNuc19jbWQtPnAuY21kLnBhcmFtWzBdID0gZmNwb3J0LT5kX2lkLmIuYWxfcGE7CisJc25zX2NtZC0+cC5jbWQucGFyYW1bMV0gPSBmY3BvcnQtPmRfaWQuYi5hcmVhOworCXNuc19jbWQtPnAuY21kLnBhcmFtWzJdID0gZmNwb3J0LT5kX2lkLmIuZG9tYWluOworCisJLyogRXhlY3V0ZSBTTlMgY29tbWFuZC4gKi8KKwlydmFsID0gcWxhMngwMF9zZW5kX3NucyhoYSwgaGEtPnNuc19jbWRfZG1hLCBHQV9OWFRfU05TX0NNRF9TSVpFIC8gMiwKKwkgICAgc2l6ZW9mKHN0cnVjdCBzbnNfY21kX3BrdCkpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR0FfTlhUIFNlbmQgU05TIGZhaWxlZCAoJWQpLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7CisJfSBlbHNlIGlmIChzbnNfY21kLT5wLmdhbl9kYXRhWzhdICE9IDB4ODAgfHwKKwkgICAgc25zX2NtZC0+cC5nYW5fZGF0YVs5XSAhPSAweDAyKSB7CisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHQV9OWFQgZmFpbGVkLCByZWplY3RlZCByZXF1ZXN0LCAiCisJCSAgICAiZ2Ffbnh0X3JzcDpcbiIsIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMl8zKHFsYTJ4MDBfZHVtcF9idWZmZXIoc25zX2NtZC0+cC5nYW5fZGF0YSwgMTYpKTsKKwkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJfSBlbHNlIHsKKwkJLyogUG9wdWxhdGUgZmNfcG9ydF90IGVudHJ5LiAqLworCQlmY3BvcnQtPmRfaWQuYi5kb21haW4gPSBzbnNfY21kLT5wLmdhbl9kYXRhWzE3XTsKKwkJZmNwb3J0LT5kX2lkLmIuYXJlYSA9IHNuc19jbWQtPnAuZ2FuX2RhdGFbMThdOworCQlmY3BvcnQtPmRfaWQuYi5hbF9wYSA9IHNuc19jbWQtPnAuZ2FuX2RhdGFbMTldOworCisJCW1lbWNweShmY3BvcnQtPm5vZGVfbmFtZSwgJnNuc19jbWQtPnAuZ2FuX2RhdGFbMjg0XSwgV1dOX1NJWkUpOworCQltZW1jcHkoZmNwb3J0LT5wb3J0X25hbWUsICZzbnNfY21kLT5wLmdhbl9kYXRhWzIwXSwgV1dOX1NJWkUpOworCisJCWlmIChzbnNfY21kLT5wLmdhbl9kYXRhWzE2XSAhPSBOU19OX1BPUlRfVFlQRSAmJgorCQkgICAgc25zX2NtZC0+cC5nYW5fZGF0YVsxNl0gIT0gTlNfTkxfUE9SVF9UWVBFKQorCQkJZmNwb3J0LT5kX2lkLmIuZG9tYWluID0gMHhmMDsKKworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR0FfTlhUIGVudHJ5IC0gIgorCQkgICAgIm5uICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICJwbiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCSAgICAicG9ydGlkPSUwMnglMDJ4JTAyeC5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywKKwkJICAgIGZjcG9ydC0+bm9kZV9uYW1lWzBdLCBmY3BvcnQtPm5vZGVfbmFtZVsxXSwKKwkJICAgIGZjcG9ydC0+bm9kZV9uYW1lWzJdLCBmY3BvcnQtPm5vZGVfbmFtZVszXSwKKwkJICAgIGZjcG9ydC0+bm9kZV9uYW1lWzRdLCBmY3BvcnQtPm5vZGVfbmFtZVs1XSwKKwkJICAgIGZjcG9ydC0+bm9kZV9uYW1lWzZdLCBmY3BvcnQtPm5vZGVfbmFtZVs3XSwKKwkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzBdLCBmY3BvcnQtPnBvcnRfbmFtZVsxXSwKKwkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzJdLCBmY3BvcnQtPnBvcnRfbmFtZVszXSwKKwkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzRdLCBmY3BvcnQtPnBvcnRfbmFtZVs1XSwKKwkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzZdLCBmY3BvcnQtPnBvcnRfbmFtZVs3XSwKKwkJICAgIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworLyoqCisgKiBxbGEyeDAwX3Nuc19naWRfcHQoKSAtIFNOUyBzY2FuIGZvciBmYWJyaWMgZGV2aWNlcyB2aWEgR0lEX1BUIGNvbW1hbmQuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBsaXN0OiBzd2l0Y2ggaW5mbyBlbnRyaWVzIHRvIHBvcHVsYXRlCisgKgorICogVGhpcyBjb21tYW5kIHVzZXMgdGhlIG9sZCBFeGVjdHV0ZSBTTlMgQ29tbWFuZCBtYWlsYm94IHJvdXRpbmUuCisgKgorICogTk9URTogTm9uLU54X1BvcnRzIGFyZSBub3QgcmVxdWVzdGVkLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX3Nuc19naWRfcHQoc2NzaV9xbGFfaG9zdF90ICpoYSwgc3dfaW5mb190ICpsaXN0KQoreworCWludAkJcnZhbDsKKworCXVpbnQxNl90CWk7CisJdWludDhfdAkJKmVudHJ5OworCXN0cnVjdCBzbnNfY21kX3BrdAkqc25zX2NtZDsKKworCS8qIElzc3VlIEdJRF9QVC4gKi8KKwkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIHJlcXVlc3QuICovCisJc25zX2NtZCA9IHFsYTJ4MDBfcHJlcF9zbnNfY21kKGhhLCBHSURfUFRfQ01ELCBHSURfUFRfU05TX1NDTURfTEVOLAorCSAgICBHSURfUFRfU05TX0RBVEFfU0laRSk7CisKKwkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIGFyZ3VtZW50cyAtLSBwb3J0X3R5cGUuICovCisJc25zX2NtZC0+cC5jbWQucGFyYW1bMF0gPSBOU19OWF9QT1JUX1RZUEU7CisKKwkvKiBFeGVjdXRlIFNOUyBjb21tYW5kLiAqLworCXJ2YWwgPSBxbGEyeDAwX3NlbmRfc25zKGhhLCBoYS0+c25zX2NtZF9kbWEsIEdJRF9QVF9TTlNfQ01EX1NJWkUgLyAyLAorCSAgICBzaXplb2Yoc3RydWN0IHNuc19jbWRfcGt0KSk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHSURfUFQgU2VuZCBTTlMgZmFpbGVkICglZCkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgaWYgKHNuc19jbWQtPnAuZ2lkX2RhdGFbOF0gIT0gMHg4MCB8fAorCSAgICBzbnNfY21kLT5wLmdpZF9kYXRhWzldICE9IDB4MDIpIHsKKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdJRF9QVCBmYWlsZWQsIHJlamVjdGVkIHJlcXVlc3QsICIKKwkJICAgICJnaWRfcnNwOlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcyXzMocWxhMngwMF9kdW1wX2J1ZmZlcihzbnNfY21kLT5wLmdpZF9kYXRhLCAxNikpOworCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9IGVsc2UgeworCQkvKiBTZXQgcG9ydCBJRHMgaW4gc3dpdGNoIGluZm8gbGlzdC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IE1BWF9GSUJSRV9ERVZJQ0VTOyBpKyspIHsKKwkJCWVudHJ5ID0gJnNuc19jbWQtPnAuZ2lkX2RhdGFbKGkgKiA0KSArIDE2XTsKKwkJCWxpc3RbaV0uZF9pZC5iLmRvbWFpbiA9IGVudHJ5WzFdOworCQkJbGlzdFtpXS5kX2lkLmIuYXJlYSA9IGVudHJ5WzJdOworCQkJbGlzdFtpXS5kX2lkLmIuYWxfcGEgPSBlbnRyeVszXTsKKworCQkJLyogTGFzdCBvbmUgZXhpdC4gKi8KKwkJCWlmIChlbnRyeVswXSAmIEJJVF83KSB7CisJCQkJbGlzdFtpXS5kX2lkLmIucnN2ZF8xID0gZW50cnlbMF07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBJZiB3ZSd2ZSB1c2VkIGFsbCBhdmFpbGFibGUgc2xvdHMsIHRoZW4gdGhlIHN3aXRjaCBpcworCQkgKiByZXBvcnRpbmcgYmFjayBtb3JlIGRldmljZXMgdGhhdCB3ZSBjYW4gaGFuZGxlIHdpdGggdGhpcworCQkgKiBzaW5nbGUgY2FsbC4gIFJldHVybiBhIGZhaWxlZCBzdGF0dXMsIGFuZCBsZXQgR0FfTlhUIGhhbmRsZQorCQkgKiB0aGUgb3ZlcmxvYWQuCisJCSAqLworCQlpZiAoaSA9PSBNQVhfRklCUkVfREVWSUNFUykgCisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKioKKyAqIHFsYTJ4MDBfc25zX2dwbl9pZCgpIC0gU05TIEdldCBQb3J0IE5hbWUgKEdQTl9JRCkgcXVlcnkuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBsaXN0OiBzd2l0Y2ggaW5mbyBlbnRyaWVzIHRvIHBvcHVsYXRlCisgKgorICogVGhpcyBjb21tYW5kIHVzZXMgdGhlIG9sZCBFeGVjdHV0ZSBTTlMgQ29tbWFuZCBtYWlsYm94IHJvdXRpbmUuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfc25zX2dwbl9pZChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzd19pbmZvX3QgKmxpc3QpCit7CisJaW50CQlydmFsOworCisJdWludDE2X3QJaTsKKwlzdHJ1Y3Qgc25zX2NtZF9wa3QJKnNuc19jbWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0ZJQlJFX0RFVklDRVM7IGkrKykgeworCQkvKiBJc3N1ZSBHUE5fSUQgKi8KKwkJLyogUHJlcGFyZSBTTlMgY29tbWFuZCByZXF1ZXN0LiAqLworCQlzbnNfY21kID0gcWxhMngwMF9wcmVwX3Nuc19jbWQoaGEsIEdQTl9JRF9DTUQsCisJCSAgICBHUE5fSURfU05TX1NDTURfTEVOLCBHUE5fSURfU05TX0RBVEFfU0laRSk7CisKKwkJLyogUHJlcGFyZSBTTlMgY29tbWFuZCBhcmd1bWVudHMgLS0gcG9ydF9pZC4gKi8KKwkJc25zX2NtZC0+cC5jbWQucGFyYW1bMF0gPSBsaXN0W2ldLmRfaWQuYi5hbF9wYTsKKwkJc25zX2NtZC0+cC5jbWQucGFyYW1bMV0gPSBsaXN0W2ldLmRfaWQuYi5hcmVhOworCQlzbnNfY21kLT5wLmNtZC5wYXJhbVsyXSA9IGxpc3RbaV0uZF9pZC5iLmRvbWFpbjsKKworCQkvKiBFeGVjdXRlIFNOUyBjb21tYW5kLiAqLworCQlydmFsID0gcWxhMngwMF9zZW5kX3NucyhoYSwgaGEtPnNuc19jbWRfZG1hLAorCQkgICAgR1BOX0lEX1NOU19DTURfU0laRSAvIDIsIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpKTsKKwkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCS8qRU1QVFkqLworCQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdQTl9JRCBTZW5kIFNOUyBmYWlsZWQgIgorCQkJICAgICIoJWQpLlxuIiwgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJfSBlbHNlIGlmIChzbnNfY21kLT5wLmdwbl9kYXRhWzhdICE9IDB4ODAgfHwKKwkJICAgIHNuc19jbWQtPnAuZ3BuX2RhdGFbOV0gIT0gMHgwMikgeworCQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdQTl9JRCBmYWlsZWQsIHJlamVjdGVkICIKKwkJCSAgICAicmVxdWVzdCwgZ3BuX3JzcDpcbiIsIGhhLT5ob3N0X25vKSk7CisJCQlERUJVRzJfMyhxbGEyeDAwX2R1bXBfYnVmZmVyKHNuc19jbWQtPnAuZ3BuX2RhdGEsIDE2KSk7CisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJfSBlbHNlIHsKKwkJCS8qIFNhdmUgcG9ydG5hbWUgKi8KKwkJCW1lbWNweShsaXN0W2ldLnBvcnRfbmFtZSwgJnNuc19jbWQtPnAuZ3BuX2RhdGFbMTZdLAorCQkJICAgIFdXTl9TSVpFKTsKKwkJfQorCisJCS8qIExhc3QgZGV2aWNlIGV4aXQuICovCisJCWlmIChsaXN0W2ldLmRfaWQuYi5yc3ZkXzEgIT0gMCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAocnZhbCk7Cit9CisKKy8qKgorICogcWxhMngwMF9zbnNfZ25uX2lkKCkgLSBTTlMgR2V0IE5vZGUgTmFtZSAoR05OX0lEKSBxdWVyeS4KKyAqIEBoYTogSEEgY29udGV4dAorICogQGxpc3Q6IHN3aXRjaCBpbmZvIGVudHJpZXMgdG8gcG9wdWxhdGUKKyAqCisgKiBUaGlzIGNvbW1hbmQgdXNlcyB0aGUgb2xkIEV4ZWN0dXRlIFNOUyBDb21tYW5kIG1haWxib3ggcm91dGluZS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9zbnNfZ25uX2lkKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN3X2luZm9fdCAqbGlzdCkKK3sKKwlpbnQJCXJ2YWw7CisKKwl1aW50MTZfdAlpOworCXN0cnVjdCBzbnNfY21kX3BrdAkqc25zX2NtZDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfRklCUkVfREVWSUNFUzsgaSsrKSB7CisJCS8qIElzc3VlIEdOTl9JRCAqLworCQkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIHJlcXVlc3QuICovCisJCXNuc19jbWQgPSBxbGEyeDAwX3ByZXBfc25zX2NtZChoYSwgR05OX0lEX0NNRCwKKwkJICAgIEdOTl9JRF9TTlNfU0NNRF9MRU4sIEdOTl9JRF9TTlNfREFUQV9TSVpFKTsKKworCQkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIGFyZ3VtZW50cyAtLSBwb3J0X2lkLiAqLworCQlzbnNfY21kLT5wLmNtZC5wYXJhbVswXSA9IGxpc3RbaV0uZF9pZC5iLmFsX3BhOworCQlzbnNfY21kLT5wLmNtZC5wYXJhbVsxXSA9IGxpc3RbaV0uZF9pZC5iLmFyZWE7CisJCXNuc19jbWQtPnAuY21kLnBhcmFtWzJdID0gbGlzdFtpXS5kX2lkLmIuZG9tYWluOworCisJCS8qIEV4ZWN1dGUgU05TIGNvbW1hbmQuICovCisJCXJ2YWwgPSBxbGEyeDAwX3NlbmRfc25zKGhhLCBoYS0+c25zX2NtZF9kbWEsCisJCSAgICBHTk5fSURfU05TX0NNRF9TSVpFIC8gMiwgc2l6ZW9mKHN0cnVjdCBzbnNfY21kX3BrdCkpOworCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkJLypFTVBUWSovCisJCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR05OX0lEIFNlbmQgU05TIGZhaWxlZCAiCisJCQkgICAgIiglZCkuXG4iLCBoYS0+aG9zdF9ubywgcnZhbCkpOworCQl9IGVsc2UgaWYgKHNuc19jbWQtPnAuZ25uX2RhdGFbOF0gIT0gMHg4MCB8fAorCQkgICAgc25zX2NtZC0+cC5nbm5fZGF0YVs5XSAhPSAweDAyKSB7CisJCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR05OX0lEIGZhaWxlZCwgcmVqZWN0ZWQgIgorCQkJICAgICJyZXF1ZXN0LCBnbm5fcnNwOlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJCURFQlVHMl8zKHFsYTJ4MDBfZHVtcF9idWZmZXIoc25zX2NtZC0+cC5nbm5fZGF0YSwgMTYpKTsKKwkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQl9IGVsc2UgeworCQkJLyogU2F2ZSBub2RlbmFtZSAqLworCQkJbWVtY3B5KGxpc3RbaV0ubm9kZV9uYW1lLCAmc25zX2NtZC0+cC5nbm5fZGF0YVsxNl0sCisJCQkgICAgV1dOX1NJWkUpOworCisJCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR0lEX1BUIGVudHJ5IC0gIgorCQkJICAgICJubiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCQkgICAgInBuICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJCSAgICAicG9ydGlkPSUwMnglMDJ4JTAyeC5cbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8sCisJCQkgICAgbGlzdFtpXS5ub2RlX25hbWVbMF0sIGxpc3RbaV0ubm9kZV9uYW1lWzFdLAorCQkJICAgIGxpc3RbaV0ubm9kZV9uYW1lWzJdLCBsaXN0W2ldLm5vZGVfbmFtZVszXSwKKwkJCSAgICBsaXN0W2ldLm5vZGVfbmFtZVs0XSwgbGlzdFtpXS5ub2RlX25hbWVbNV0sCisJCQkgICAgbGlzdFtpXS5ub2RlX25hbWVbNl0sIGxpc3RbaV0ubm9kZV9uYW1lWzddLAorCQkJICAgIGxpc3RbaV0ucG9ydF9uYW1lWzBdLCBsaXN0W2ldLnBvcnRfbmFtZVsxXSwKKwkJCSAgICBsaXN0W2ldLnBvcnRfbmFtZVsyXSwgbGlzdFtpXS5wb3J0X25hbWVbM10sCisJCQkgICAgbGlzdFtpXS5wb3J0X25hbWVbNF0sIGxpc3RbaV0ucG9ydF9uYW1lWzVdLAorCQkJICAgIGxpc3RbaV0ucG9ydF9uYW1lWzZdLCBsaXN0W2ldLnBvcnRfbmFtZVs3XSwKKwkJCSAgICBsaXN0W2ldLmRfaWQuYi5kb21haW4sIGxpc3RbaV0uZF9pZC5iLmFyZWEsCisJCQkgICAgbGlzdFtpXS5kX2lkLmIuYWxfcGEpKTsKKwkJfQorCisJCS8qIExhc3QgZGV2aWNlIGV4aXQuICovCisJCWlmIChsaXN0W2ldLmRfaWQuYi5yc3ZkXzEgIT0gMCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAocnZhbCk7Cit9CisKKy8qKgorICogcWxhMngwMF9zbmRfcmZ0X2lkKCkgLSBTTlMgUmVnaXN0ZXIgRkMtNCBUWVBFcyAoUkZUX0lEKSBzdXBwb3J0ZWQgYnkgdGhlIEhCQS4KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIFRoaXMgY29tbWFuZCB1c2VzIHRoZSBvbGQgRXhlY3R1dGUgU05TIENvbW1hbmQgbWFpbGJveCByb3V0aW5lLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX3Nuc19yZnRfaWQoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQJCXJ2YWw7CisKKwlzdHJ1Y3Qgc25zX2NtZF9wa3QJKnNuc19jbWQ7CisKKwkvKiBJc3N1ZSBSRlRfSUQuICovCisJLyogUHJlcGFyZSBTTlMgY29tbWFuZCByZXF1ZXN0LiAqLworCXNuc19jbWQgPSBxbGEyeDAwX3ByZXBfc25zX2NtZChoYSwgUkZUX0lEX0NNRCwgUkZUX0lEX1NOU19TQ01EX0xFTiwKKwkgICAgUkZUX0lEX1NOU19EQVRBX1NJWkUpOworCisJLyogUHJlcGFyZSBTTlMgY29tbWFuZCBhcmd1bWVudHMgLS0gcG9ydF9pZCwgRkMtNCB0eXBlcyAqLworCXNuc19jbWQtPnAuY21kLnBhcmFtWzBdID0gaGEtPmRfaWQuYi5hbF9wYTsKKwlzbnNfY21kLT5wLmNtZC5wYXJhbVsxXSA9IGhhLT5kX2lkLmIuYXJlYTsKKwlzbnNfY21kLT5wLmNtZC5wYXJhbVsyXSA9IGhhLT5kX2lkLmIuZG9tYWluOworCisJc25zX2NtZC0+cC5jbWQucGFyYW1bNV0gPSAweDAxOwkJCS8qIEZDUC0zICovCisKKwkvKiBFeGVjdXRlIFNOUyBjb21tYW5kLiAqLworCXJ2YWwgPSBxbGEyeDAwX3NlbmRfc25zKGhhLCBoYS0+c25zX2NtZF9kbWEsIFJGVF9JRF9TTlNfQ01EX1NJWkUgLyAyLAorCSAgICBzaXplb2Yoc3RydWN0IHNuc19jbWRfcGt0KSk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBSRlRfSUQgU2VuZCBTTlMgZmFpbGVkICglZCkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgaWYgKHNuc19jbWQtPnAucmZ0X2RhdGFbOF0gIT0gMHg4MCB8fAorCSAgICBzbnNfY21kLT5wLnJmdF9kYXRhWzldICE9IDB4MDIpIHsKKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJGVF9JRCBmYWlsZWQsIHJlamVjdGVkIHJlcXVlc3QsICIKKwkJICAgICJyZnRfcnNwOlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcyXzMocWxhMngwMF9kdW1wX2J1ZmZlcihzbnNfY21kLT5wLnJmdF9kYXRhLCAxNikpOworCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9IGVsc2UgeworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJGVF9JRCBleGl0aW5nIG5vcm1hbGx5LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworLyoqCisgKiBxbGEyeDAwX3Nuc19ybm5faWQoKSAtIFNOUyBSZWdpc3RlciBOb2RlIE5hbWUgKFJOTl9JRCkgb2YgdGhlIEhCQS4KKyAqIEhCQS4KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIFRoaXMgY29tbWFuZCB1c2VzIHRoZSBvbGQgRXhlY3R1dGUgU05TIENvbW1hbmQgbWFpbGJveCByb3V0aW5lLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX3Nuc19ybm5faWQoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQJCXJ2YWw7CisKKwlzdHJ1Y3Qgc25zX2NtZF9wa3QJKnNuc19jbWQ7CisKKwkvKiBJc3N1ZSBSTk5fSUQuICovCisJLyogUHJlcGFyZSBTTlMgY29tbWFuZCByZXF1ZXN0LiAqLworCXNuc19jbWQgPSBxbGEyeDAwX3ByZXBfc25zX2NtZChoYSwgUk5OX0lEX0NNRCwgUk5OX0lEX1NOU19TQ01EX0xFTiwKKwkgICAgUk5OX0lEX1NOU19EQVRBX1NJWkUpOworCisJLyogUHJlcGFyZSBTTlMgY29tbWFuZCBhcmd1bWVudHMgLS0gcG9ydF9pZCwgbm9kZW5hbWUuICovCisJc25zX2NtZC0+cC5jbWQucGFyYW1bMF0gPSBoYS0+ZF9pZC5iLmFsX3BhOworCXNuc19jbWQtPnAuY21kLnBhcmFtWzFdID0gaGEtPmRfaWQuYi5hcmVhOworCXNuc19jbWQtPnAuY21kLnBhcmFtWzJdID0gaGEtPmRfaWQuYi5kb21haW47CisKKwlzbnNfY21kLT5wLmNtZC5wYXJhbVs0XSA9IGhhLT5pbml0X2NiLT5ub2RlX25hbWVbN107CisJc25zX2NtZC0+cC5jbWQucGFyYW1bNV0gPSBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzZdOworCXNuc19jbWQtPnAuY21kLnBhcmFtWzZdID0gaGEtPmluaXRfY2ItPm5vZGVfbmFtZVs1XTsKKwlzbnNfY21kLT5wLmNtZC5wYXJhbVs3XSA9IGhhLT5pbml0X2NiLT5ub2RlX25hbWVbNF07CisJc25zX2NtZC0+cC5jbWQucGFyYW1bOF0gPSBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzNdOworCXNuc19jbWQtPnAuY21kLnBhcmFtWzldID0gaGEtPmluaXRfY2ItPm5vZGVfbmFtZVsyXTsKKwlzbnNfY21kLT5wLmNtZC5wYXJhbVsxMF0gPSBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzFdOworCXNuc19jbWQtPnAuY21kLnBhcmFtWzExXSA9IGhhLT5pbml0X2NiLT5ub2RlX25hbWVbMF07CisKKwkvKiBFeGVjdXRlIFNOUyBjb21tYW5kLiAqLworCXJ2YWwgPSBxbGEyeDAwX3NlbmRfc25zKGhhLCBoYS0+c25zX2NtZF9kbWEsIFJOTl9JRF9TTlNfQ01EX1NJWkUgLyAyLAorCSAgICBzaXplb2Yoc3RydWN0IHNuc19jbWRfcGt0KSk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBSTk5fSUQgU2VuZCBTTlMgZmFpbGVkICglZCkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgaWYgKHNuc19jbWQtPnAucm5uX2RhdGFbOF0gIT0gMHg4MCB8fAorCSAgICBzbnNfY21kLT5wLnJubl9kYXRhWzldICE9IDB4MDIpIHsKKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJOTl9JRCBmYWlsZWQsIHJlamVjdGVkIHJlcXVlc3QsICIKKwkJICAgICJybm5fcnNwOlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcyXzMocWxhMngwMF9kdW1wX2J1ZmZlcihzbnNfY21kLT5wLnJubl9kYXRhLCAxNikpOworCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9IGVsc2UgeworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJOTl9JRCBleGl0aW5nIG5vcm1hbGx5LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjVkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCkBAIC0wLDAgKzEsMzkwOCBAQAorLyoKKyAqICAgICAgICAgICAgICAgICAgUUxPR0lDIExJTlVYIFNPRlRXQVJFCisgKgorICogUUxvZ2ljIElTUDJ4MDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi42LngKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFFMb2dpYyBDb3Jwb3JhdGlvbgorICogKHd3dy5xbG9naWMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNpbmNsdWRlICJxbGFfZGVmLmgiCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAicWxhX2RldnRibC5oIgorCisvKiBYWFgoaGNoKTogdGhpcyBpcyB1Z2x5LCBidXQgd2UgZG9uJ3Qgd2FudCB0byBwdWxsIGluIGV4aW9jdGwuaCAqLworI2lmbmRlZiBFWFRfSVNfTFVOX0JJVF9TRVQKKyNkZWZpbmUgRVhUX0lTX0xVTl9CSVRfU0VUKFAsTCkgXAorICAgICgoKFApLT5tYXNrW0wvOF0gJiAoMHg4MCA+PiAoTCU4KSkpPzE6MCkKKyNkZWZpbmUgRVhUX1NFVF9MVU5fQklUKFAsTCkgXAorICAgICgoUCktPm1hc2tbTC84XSB8PSAoMHg4MCA+PiAoTCU4KSkpCisjZW5kaWYKKworLyoKKyogIFFMb2dpYyBJU1AyeDAwIEhhcmR3YXJlIFN1cHBvcnQgRnVuY3Rpb24gUHJvdG90eXBlcy4KKyovCitzdGF0aWMgaW50IHFsYTJ4MDBfcGNpX2NvbmZpZyhzY3NpX3FsYV9ob3N0X3QgKik7CitzdGF0aWMgaW50IHFsYTJ4MDBfaXNwX2Zpcm13YXJlKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfcmVzZXRfY2hpcChzY3NpX3FsYV9ob3N0X3QgKik7CitzdGF0aWMgaW50IHFsYTJ4MDBfY2hpcF9kaWFnKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfcmVzaXplX3JlcXVlc3RfcShzY3NpX3FsYV9ob3N0X3QgKik7CitzdGF0aWMgaW50IHFsYTJ4MDBfc2V0dXBfY2hpcChzY3NpX3FsYV9ob3N0X3QgKik7CitzdGF0aWMgdm9pZCBxbGEyeDAwX2luaXRfcmVzcG9uc2VfcV9lbnRyaWVzKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9pbml0X3JpbmdzKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9md19yZWFkeShzY3NpX3FsYV9ob3N0X3QgKik7CitzdGF0aWMgaW50IHFsYTJ4MDBfY29uZmlndXJlX2hiYShzY3NpX3FsYV9ob3N0X3QgKik7CitzdGF0aWMgaW50IHFsYTJ4MDBfbnZyYW1fY29uZmlnKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfaW5pdF90Z3RfbWFwKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9jb25maWd1cmVfbG9vcChzY3NpX3FsYV9ob3N0X3QgKik7CitzdGF0aWMgaW50IHFsYTJ4MDBfY29uZmlndXJlX2xvY2FsX2xvb3Aoc2NzaV9xbGFfaG9zdF90ICopOworc3RhdGljIHZvaWQgcWxhMngwMF91cGRhdGVfZmNwb3J0KHNjc2lfcWxhX2hvc3RfdCAqLCBmY19wb3J0X3QgKik7CitzdGF0aWMgdm9pZCBxbGEyeDAwX2x1bl9kaXNjb3Zlcnkoc2NzaV9xbGFfaG9zdF90ICosIGZjX3BvcnRfdCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9ycHRfbHVuX2Rpc2NvdmVyeShzY3NpX3FsYV9ob3N0X3QgKiwgZmNfcG9ydF90ICosCisgICAgaW5xX2NtZF9yc3BfdCAqLCBkbWFfYWRkcl90KTsKK3N0YXRpYyBpbnQgcWxhMngwMF9yZXBvcnRfbHVuKHNjc2lfcWxhX2hvc3RfdCAqLCBmY19wb3J0X3QgKik7CitzdGF0aWMgZmNfbHVuX3QgKnFsYTJ4MDBfY2ZnX2x1bihzY3NpX3FsYV9ob3N0X3QgKiwgZmNfcG9ydF90ICosIHVpbnQxNl90LAorICAgIGlucV9jbWRfcnNwX3QgKiwgZG1hX2FkZHJfdCk7CitzdGF0aWMgZmNfbHVuX3QgKiBxbGEyeDAwX2FkZF9sdW4oZmNfcG9ydF90ICosIHVpbnQxNl90KTsKK3N0YXRpYyBpbnQgcWxhMngwMF9pbnF1aXJ5KHNjc2lfcWxhX2hvc3RfdCAqLCBmY19wb3J0X3QgKiwgdWludDE2X3QsCisgICAgaW5xX2NtZF9yc3BfdCAqLCBkbWFfYWRkcl90KTsKK3N0YXRpYyBpbnQgcWxhMngwMF9jb25maWd1cmVfZmFicmljKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9maW5kX2FsbF9mYWJyaWNfZGV2cyhzY3NpX3FsYV9ob3N0X3QgKiwgc3RydWN0IGxpc3RfaGVhZCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9kZXZpY2VfcmVzeW5jKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9mYWJyaWNfZGV2X2xvZ2luKHNjc2lfcWxhX2hvc3RfdCAqLCBmY19wb3J0X3QgKiwKKyAgICB1aW50MTZfdCAqKTsKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfY29uZmlnX29zKHNjc2lfcWxhX2hvc3RfdCAqaGEpOworc3RhdGljIHVpbnQxNl90IHFsYTJ4MDBfZmNwb3J0X2JpbmQoc2NzaV9xbGFfaG9zdF90ICpoYSwgZmNfcG9ydF90ICpmY3BvcnQpOworc3RhdGljIG9zX2x1bl90ICogcWxhMngwMF9mY2x1bl9iaW5kKHNjc2lfcWxhX2hvc3RfdCAqLCBmY19wb3J0X3QgKiwKKyAgICBmY19sdW5fdCAqKTsKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfbHVuX2ZyZWUoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90LCB1aW50MTZfdCk7CisKK3N0YXRpYyBpbnQgcWxhMngwMF9yZXN0YXJ0X2lzcChzY3NpX3FsYV9ob3N0X3QgKik7CitzdGF0aWMgdm9pZCBxbGEyeDAwX3Jlc2V0X2FkYXB0ZXIoc2NzaV9xbGFfaG9zdF90ICopOworc3RhdGljIG9zX3RndF90ICpxbGEyeDAwX3RndF9hbGxvYyhzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QpOworc3RhdGljIG9zX2x1bl90ICpxbGEyeDAwX2x1bl9hbGxvYyhzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QsIHVpbnQxNl90KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICBRTG9naWMgSVNQMngwMCBIYXJkd2FyZSBTdXBwb3J0IEZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorKiBxbGEyeDAwX2luaXRpYWxpemVfYWRhcHRlcgorKiAgICAgIEluaXRpYWxpemUgYm9hcmQuCisqCisqIElucHV0OgorKiAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorKgorKiBSZXR1cm5zOgorKiAgICAgIDAgPSBzdWNjZXNzCisqLworaW50CitxbGEyeDAwX2luaXRpYWxpemVfYWRhcHRlcihzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludAlydmFsOworCXVpbnQ4X3QJcmVzdGFydF9yaXNjID0gMDsKKwl1aW50OF90CXJldHJ5OworCXVpbnQzMl90IHdhaXRfdGltZTsKKworCS8qIENsZWFyIGFkYXB0ZXIgZmxhZ3MuICovCisJaGEtPmZsYWdzLm9ubGluZSA9IDA7CisJaGEtPmZsYWdzLnJlc2V0X2FjdGl2ZSA9IDA7CisJYXRvbWljX3NldCgmaGEtPmxvb3BfZG93bl90aW1lciwgTE9PUF9ET1dOX1RJTUUpOworCWF0b21pY19zZXQoJmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOworCWhhLT5kZXZpY2VfZmxhZ3MgPSAwOworCWhhLT5zbnNfcmV0cnlfY250ID0gMDsKKwloYS0+ZHBjX2ZsYWdzID0gMDsKKwloYS0+ZmFpbGJhY2tfZGVsYXkgPSAwOworCWhhLT5mbGFncy5tYW5hZ2VtZW50X3NlcnZlcl9sb2dnZWRfaW4gPSAwOworCWhhLT5tYXJrZXJfbmVlZGVkID0gMDsKKwloYS0+bWJ4X2ZsYWdzID0gMDsKKwloYS0+aXNwX2Fib3J0X2NudCA9IDA7CisJaGEtPmJlYWNvbl9ibGlua19sZWQgPSAwOworCisJcnZhbCA9IHFsYTJ4MDBfcGNpX2NvbmZpZyhoYSk7CisJaWYgKHJ2YWwpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBVbmFibGUgdG8gY29uZmlndXJlIFBDSSBzcGFjZT1uIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJCXJldHVybiAocnZhbCk7CisJfQorCisJcWxhMngwMF9yZXNldF9jaGlwKGhhKTsKKworCS8qIEluaXRpYWxpemUgdGFyZ2V0IG1hcCBkYXRhYmFzZS4gKi8KKwlxbGEyeDAwX2luaXRfdGd0X21hcChoYSk7CisKKwlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJDb25maWd1cmUgTlZSQU0gcGFyYW1ldGVycy4uLlxuIik7CisJcWxhMngwMF9udnJhbV9jb25maWcoaGEpOworCisJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiVmVyaWZ5aW5nIGxvYWRlZCBSSVNDIGNvZGUuLi5cbiIpOworCisJcmV0cnkgPSAxMDsKKwkvKgorCSAqIFRyeSB0byBjb25maWd1cmUgdGhlIGxvb3AuCisJICovCisJZG8geworCQlyZXN0YXJ0X3Jpc2MgPSAwOworCisJCS8qIElmIGZpcm13YXJlIG5lZWRzIHRvIGJlIGxvYWRlZCAqLworCQlpZiAocWxhMngwMF9pc3BfZmlybXdhcmUoaGEpICE9IFFMQV9TVUNDRVNTKSB7CisJCQlpZiAoKHJ2YWwgPSBxbGEyeDAwX2NoaXBfZGlhZyhoYSkpID09IFFMQV9TVUNDRVNTKSB7CisJCQkJcnZhbCA9IHFsYTJ4MDBfc2V0dXBfY2hpcChoYSk7CisJCQl9CisJCX0KKworCQlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUyAmJgorCQkgICAgKHJ2YWwgPSBxbGEyeDAwX2luaXRfcmluZ3MoaGEpKSA9PSBRTEFfU1VDQ0VTUykgeworY2hlY2tfZndfcmVhZHlfYWdhaW46CisJCQkvKgorCQkJICogV2FpdCBmb3IgYSBzdWNjZXNzZnVsIExJUCB1cCB0byBhIG1heGltdW0gCisJCQkgKiBvZiAoaW4gc2Vjb25kcyk6IFJJU0MgbG9naW4gdGltZW91dCB2YWx1ZSwKKwkJCSAqIFJJU0MgcmV0cnkgY291bnQgdmFsdWUsIGFuZCBwb3J0IGRvd24gcmV0cnkKKwkJCSAqIHZhbHVlIE9SIGEgbWluaW11bSBvZiA0IHNlY29uZHMgT1IgSWYgbm8gCisJCQkgKiBjYWJsZSwgb25seSA1IHNlY29uZHMuCisJCQkgKi8KKwkJCXJ2YWwgPSBxbGEyeDAwX2Z3X3JlYWR5KGhhKTsKKwkJCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CisJCQkJY2xlYXJfYml0KFJFU0VUX01BUktFUl9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKworCQkJCS8qCisJCQkJICogV2FpdCBhdCBtb3N0IE1BWF9UQVJHRVQgUlNDTnMgZm9yIGEgc3RhYmxlCisJCQkJICogbGluay4KKwkJCQkgKi8KKwkJCQl3YWl0X3RpbWUgPSAyNTY7CisJCQkJZG8geworCQkJCQljbGVhcl9iaXQoTE9PUF9SRVNZTkNfTkVFREVELAorCQkJCQkgICAgJmhhLT5kcGNfZmxhZ3MpOworCQkJCQlydmFsID0gcWxhMngwMF9jb25maWd1cmVfbG9vcChoYSk7CisKKwkJCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChJU1BfQUJPUlRfTkVFREVELAorCQkJCQkgICAgJmhhLT5kcGNfZmxhZ3MpKSB7CisJCQkJCQlyZXN0YXJ0X3Jpc2MgPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvKgorCQkJCQkgKiBJZiBsb29wIHN0YXRlIGNoYW5nZSB3aGlsZSB3ZSB3ZXJlCisJCQkJCSAqIGRpc2NvdmVyeWluZyBkZXZpY2VzIHRoZW4gd2FpdCBmb3IKKwkJCQkJICogTElQIHRvIGNvbXBsZXRlCisJCQkJCSAqLworCisJCQkJCWlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpID09CisJCQkJCSAgICBMT09QX0RPV04gJiYgcmV0cnktLSkgeworCQkJCQkJZ290byBjaGVja19md19yZWFkeV9hZ2FpbjsKKwkJCQkJfQorCQkJCQl3YWl0X3RpbWUtLTsKKwkJCQl9IHdoaWxlICghYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpICYmCisJCQkJICAgIHJldHJ5ICYmCisJCQkJICAgIHdhaXRfdGltZSAmJgorCQkJCSAgICAodGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELAorCQkJCQkmaGEtPmRwY19mbGFncykpKTsKKworCQkJCWlmICh3YWl0X3RpbWUgPT0gMCkKKwkJCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCQkJaWYgKGhhLT5tZW1fZXJyKQorCQkJCQlyZXN0YXJ0X3Jpc2MgPSAxOworCQkJfSBlbHNlIGlmIChoYS0+ZGV2aWNlX2ZsYWdzICYgREZMR19OT19DQUJMRSkKKwkJCQkvKiBJZiBubyBjYWJsZSwgdGhlbiBhbGwgaXMgZ29vZC4gKi8KKwkJCQlydmFsID0gUUxBX1NVQ0NFU1M7CisJCX0KKwl9IHdoaWxlIChyZXN0YXJ0X3Jpc2MgJiYgcmV0cnktLSk7CisKKwlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgeworCQljbGVhcl9iaXQoUkVTRVRfTUFSS0VSX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQloYS0+bWFya2VyX25lZWRlZCA9IDE7CisJCXFsYTJ4MDBfbWFya2VyKGhhLCAwLCAwLCBNS19TWU5DX0FMTCk7CisJCWhhLT5tYXJrZXJfbmVlZGVkID0gMDsKKworCQloYS0+ZmxhZ3Mub25saW5lID0gMTsKKwl9IGVsc2UgeworCQlERUJVRzJfMyhwcmludGsoIiVzKCk6ICoqKiogRkFJTEVEICoqKipcbiIsIF9fZnVuY19fKSk7CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworLyoqCisgKiBxbGEyeDAwX3BjaV9jb25maWcoKSAtIFNldHVwIGRldmljZSBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9wY2lfY29uZmlnKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJdWludDE2X3QJdywgbXdpOworCXVuc2lnbmVkIGxvbmcgICBmbGFncyA9IDA7CisJdWludDMyX3QJY250OworCisJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiQ29uZmlndXJpbmcgUENJIHNwYWNlLi4uXG4iKTsKKworCS8qIAorCSAqIFR1cm4gb24gUENJIG1hc3RlcjsgZm9yIHN5c3RlbSBCSU9TZXMgdGhhdCBkb24ndCB0dXJuIGl0IG9uIGJ5CisJICogZGVmYXVsdC4KKwkgKi8KKwlwY2lfc2V0X21hc3RlcihoYS0+cGRldik7CisJbXdpID0gMDsKKwlpZiAocGNpX3NldF9td2koaGEtPnBkZXYpKQorCQltd2kgPSBQQ0lfQ09NTUFORF9JTlZBTElEQVRFOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGhhLT5wZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZoYS0+cmV2aXNpb24pOworCisJaWYgKCFoYS0+aW9iYXNlKQorCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOworCisJLyoKKwkgKiBXZSB3YW50IHRvIHJlc3BlY3QgZnJhbWV3b3JrJ3Mgc2V0dGluZyBvZiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZQorCSAqIGNvbW1hbmQgcmVnaXN0ZXIgYW5kIGFsc28gd2FudCB0byBtYWtlIHN1cmUgdGhhdCBhbGwgYml0cyBvZgorCSAqIGludGVyZXN0IHRvIHVzIGFyZSBwcm9wZXJseSBzZXQgaW4gY29tbWFuZCByZWdpc3Rlci4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChoYS0+cGRldiwgUENJX0NPTU1BTkQsICZ3KTsKKwl3IHw9IG13aSB8IChQQ0lfQ09NTUFORF9QQVJJVFkgfCBQQ0lfQ09NTUFORF9TRVJSKTsKKworCS8qIEdldCBQQ0kgYnVzIGluZm9ybWF0aW9uLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCWhhLT5wY2lfYXR0ciA9IFJEX1JFR19XT1JEKCZoYS0+aW9iYXNlLT5jdHJsX3N0YXR1cyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCWlmICghSVNfUUxBMjEwMChoYSkgJiYgIUlTX1FMQTIyMDAoaGEpKSB7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShoYS0+cGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDB4ODApOworCisJCS8qIFBDSSBTcGVjaWZpY2F0aW9uIFJldmlzaW9uIDIuMyBjaGFuZ2VzICovCisJCWlmIChJU19RTEEyMzIyKGhhKSB8fCBJU19RTEE2MzIyKGhhKSkKKwkJCS8qIENvbW1hbmQgUmVnaXN0ZXIgLSBSZXNldCBJbnRlcnJ1cHQgRGlzYWJsZS4gKi8KKwkJCXcgJj0gflBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKKworCQkvKgorCQkgKiBJZiB0aGlzIGlzIGEgMjMwMCBjYXJkIGFuZCBub3QgMjMxMiwgcmVzZXQgdGhlCisJCSAqIENPTU1BTkRfSU5WQUxJREFURSBkdWUgdG8gYSBidWcgaW4gdGhlIDIzMDAuIFVuZm9ydHVuYXRlbHksCisJCSAqIHRoZSAyMzEwIGFsc28gcmVwb3J0cyBpdHNlbGYgYXMgYSAyMzAwIHNvIHdlIG5lZWQgdG8gZ2V0IHRoZQorCQkgKiBmYiByZXZpc2lvbiBsZXZlbCAtLSBhIDYgaW5kaWNhdGVzIGl0IHJlYWxseSBpcyBhIDIzMDAgYW5kCisJCSAqIG5vdCBhIDIzMTAuCisJCSAqLworCQlpZiAoSVNfUUxBMjMwMChoYSkpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJCQkvKiBQYXVzZSBSSVNDLiAqLworCQkJV1JUX1JFR19XT1JEKCZoYS0+aW9iYXNlLT5oY2NyLCBIQ0NSX1BBVVNFX1JJU0MpOworCQkJZm9yIChjbnQgPSAwOyBjbnQgPCAzMDAwMDsgY250KyspIHsKKwkJCQlpZiAoKFJEX1JFR19XT1JEKCZoYS0+aW9iYXNlLT5oY2NyKSAmCisJCQkJICAgIEhDQ1JfUklTQ19QQVVTRSkgIT0gMCkKKwkJCQkJYnJlYWs7CisJCisJCQkJdWRlbGF5KDEwKTsKKwkJCX0KKworCQkJLyogU2VsZWN0IEZQTSByZWdpc3RlcnMuICovCisJCQlXUlRfUkVHX1dPUkQoJmhhLT5pb2Jhc2UtPmN0cmxfc3RhdHVzLCAweDIwKTsKKwkJCVJEX1JFR19XT1JEKCZoYS0+aW9iYXNlLT5jdHJsX3N0YXR1cyk7CisKKwkJCS8qIEdldCB0aGUgZmIgcmV2IGxldmVsICovCisJCQloYS0+ZmJfcmV2ID0gUkRfRkJfQ01EX1JFRyhoYSwgaGEtPmlvYmFzZSk7CisKKwkJCWlmIChoYS0+ZmJfcmV2ID09IEZQTV8yMzAwKQorCQkJCXcgJj0gflBDSV9DT01NQU5EX0lOVkFMSURBVEU7CisKKwkJCS8qIERlc2VsZWN0IEZQTSByZWdpc3RlcnMuICovCisJCQlXUlRfUkVHX1dPUkQoJmhhLT5pb2Jhc2UtPmN0cmxfc3RhdHVzLCAweDApOworCQkJUkRfUkVHX1dPUkQoJmhhLT5pb2Jhc2UtPmN0cmxfc3RhdHVzKTsKKworCQkJLyogUmVsZWFzZSBSSVNDIG1vZHVsZS4gKi8KKwkJCVdSVF9SRUdfV09SRCgmaGEtPmlvYmFzZS0+aGNjciwgSENDUl9SRUxFQVNFX1JJU0MpOworCQkJZm9yIChjbnQgPSAwOyBjbnQgPCAzMDAwMDsgY250KyspIHsKKwkJCQlpZiAoKFJEX1JFR19XT1JEKCZoYS0+aW9iYXNlLT5oY2NyKSAmCisJCQkJICAgIEhDQ1JfUklTQ19QQVVTRSkgPT0gMCkKKwkJCQkJYnJlYWs7CisJCisJCQkJdWRlbGF5KDEwKTsKKwkJCX0KKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwkJfQorCX0KKworCXBjaV93cml0ZV9jb25maWdfd29yZChoYS0+cGRldiwgUENJX0NPTU1BTkQsIHcpOworCisJLyogUmVzZXQgZXhwYW5zaW9uIFJPTSBhZGRyZXNzIGRlY29kZSBlbmFibGUgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChoYS0+cGRldiwgUENJX1JPTV9BRERSRVNTLCAmdyk7CisJdyAmPSB+UENJX1JPTV9BRERSRVNTX0VOQUJMRTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaGEtPnBkZXYsIFBDSV9ST01fQUREUkVTUywgdyk7CisKKwlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKK30KKworLyoqCisgKiBxbGEyeDAwX2lzcF9maXJtd2FyZSgpIC0gQ2hvb3NlIGZpcm13YXJlIGltYWdlLgorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfaXNwX2Zpcm13YXJlKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50ICBydmFsOworCisJLyogQXNzdW1lIGxvYWRpbmcgcmlzYyBjb2RlICovCisJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7IAorCisJaWYgKGhhLT5mbGFncy5kaXNhYmxlX3Jpc2NfY29kZV9sb2FkKSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUklTQyBDT0RFIE5PVCBsb2FkZWRcbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJSSVNDIENPREUgTk9UIGxvYWRlZFxuIik7CisKKwkJLyogVmVyaWZ5IGNoZWNrc3VtIG9mIGxvYWRlZCBSSVNDIGNvZGUuICovCisJCXJ2YWwgPSBxbGEyeDAwX3ZlcmlmeV9jaGVja3N1bShoYSk7CisJfQorCisJaWYgKHJ2YWwpIHsKKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6ICoqKiogTG9hZCBSSVNDIGNvZGUgKioqKlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworLyoqCisgKiBxbGEyeDAwX3Jlc2V0X2NoaXAoKSAtIFJlc2V0IElTUCBjaGlwLgorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyB2b2lkCitxbGEyeDAwX3Jlc2V0X2NoaXAoc2NzaV9xbGFfaG9zdF90ICpoYSkgCit7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzID0gMDsKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKwl1aW50MzJfdAljbnQ7CisJdW5zaWduZWQgbG9uZwltYnhfZmxhZ3MgPSAwOworCXVpbnQxNl90CWNtZDsKKworCS8qIERpc2FibGUgSVNQIGludGVycnVwdHMuICovCisJcWxhMngwMF9kaXNhYmxlX2ludHJzKGhhKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJLyogVHVybiBvZmYgbWFzdGVyIGVuYWJsZSAqLworCWNtZCA9IDA7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoaGEtPnBkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKKwljbWQgJj0gflBDSV9DT01NQU5EX01BU1RFUjsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaGEtPnBkZXYsIFBDSV9DT01NQU5ELCBjbWQpOworCisJaWYgKCFJU19RTEEyMTAwKGhhKSkgeworCQkvKiBQYXVzZSBSSVNDLiAqLworCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9QQVVTRV9SSVNDKTsKKwkJaWYgKElTX1FMQTIyMDAoaGEpIHx8IElTX1FMQTIzMDAoaGEpKSB7CisJCQlmb3IgKGNudCA9IDA7IGNudCA8IDMwMDAwOyBjbnQrKykgeworCQkJCWlmICgoUkRfUkVHX1dPUkQoJnJlZy0+aGNjcikgJgorCQkJCSAgICBIQ0NSX1JJU0NfUEFVU0UpICE9IDApCisJCQkJCWJyZWFrOworCQkJCXVkZWxheSgxMDApOworCQkJfQorCQl9IGVsc2UgeworCQkJUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CS8qIFBDSSBQb3N0aW5nLiAqLworCQkJdWRlbGF5KDEwKTsKKwkJfQorCisJCS8qIFNlbGVjdCBGUE0gcmVnaXN0ZXJzLiAqLworCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMsIDB4MjApOworCQlSRF9SRUdfV09SRCgmcmVnLT5jdHJsX3N0YXR1cyk7CQkvKiBQQ0kgUG9zdGluZy4gKi8KKworCQkvKiBGUE0gU29mdCBSZXNldC4gKi8KKwkJV1JUX1JFR19XT1JEKCZyZWctPmZwbV9kaWFnX2NvbmZpZywgMHgxMDApOworCQlSRF9SRUdfV09SRCgmcmVnLT5mcG1fZGlhZ19jb25maWcpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKworCQkvKiBUb2dnbGUgRnBtIFJlc2V0LiAqLworCQlpZiAoIUlTX1FMQTIyMDAoaGEpKSB7CisJCQlXUlRfUkVHX1dPUkQoJnJlZy0+ZnBtX2RpYWdfY29uZmlnLCAweDApOworCQkJUkRfUkVHX1dPUkQoJnJlZy0+ZnBtX2RpYWdfY29uZmlnKTsgLyogUENJIFBvc3RpbmcuICovCisJCX0KKworCQkvKiBTZWxlY3QgZnJhbWUgYnVmZmVyIHJlZ2lzdGVycy4gKi8KKwkJV1JUX1JFR19XT1JEKCZyZWctPmN0cmxfc3RhdHVzLCAweDEwKTsKKwkJUkRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMpOwkJLyogUENJIFBvc3RpbmcuICovCisKKwkJLyogUmVzZXQgZnJhbWUgYnVmZmVyIEZJRk9zLiAqLworCQlpZiAoSVNfUUxBMjIwMChoYSkpIHsKKwkJCVdSVF9GQl9DTURfUkVHKGhhLCByZWcsIDB4YTAwMCk7CisJCQlSRF9GQl9DTURfUkVHKGhhLCByZWcpOwkJLyogUENJIFBvc3RpbmcuICovCisJCX0gZWxzZSB7CisJCQlXUlRfRkJfQ01EX1JFRyhoYSwgcmVnLCAweDAwZmMpOworCisJCQkvKiBSZWFkIGJhY2sgZmJfY21kIHVudGlsIHplcm8gb3IgMyBzZWNvbmRzIG1heCAqLworCQkJZm9yIChjbnQgPSAwOyBjbnQgPCAzMDAwOyBjbnQrKykgeworCQkJCWlmICgoUkRfRkJfQ01EX1JFRyhoYSwgcmVnKSAmIDB4ZmYpID09IDApCisJCQkJCWJyZWFrOworCQkJCXVkZWxheSgxMDApOworCQkJfQorCQl9CisKKwkJLyogU2VsZWN0IFJJU0MgbW9kdWxlIHJlZ2lzdGVycy4gKi8KKwkJV1JUX1JFR19XT1JEKCZyZWctPmN0cmxfc3RhdHVzLCAwKTsKKwkJUkRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMpOwkJLyogUENJIFBvc3RpbmcuICovCisKKwkJLyogUmVzZXQgUklTQyBwcm9jZXNzb3IuICovCisJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX1JFU0VUX1JJU0MpOworCQlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsJCS8qIFBDSSBQb3N0aW5nLiAqLworCisJCS8qIFJlbGVhc2UgUklTQyBwcm9jZXNzb3IuICovCisJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX1JFTEVBU0VfUklTQyk7CisJCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOwkJLyogUENJIFBvc3RpbmcuICovCisJfQorCisJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfQ0xSX1JJU0NfSU5UKTsKKwlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9DTFJfSE9TVF9JTlQpOworCisJLyogUmVzZXQgSVNQIGNoaXAuICovCisJV1JUX1JFR19XT1JEKCZyZWctPmN0cmxfc3RhdHVzLCBDU1JfSVNQX1NPRlRfUkVTRVQpOworCisJLyogV2FpdCBmb3IgUklTQyB0byByZWNvdmVyIGZyb20gcmVzZXQuICovCisJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpIHx8IElTX1FMQTIzMDAoaGEpKSB7CisJCS8qCisJCSAqIEl0IGlzIG5lY2Vzc2FyeSB0byBmb3IgYSBkZWxheSBoZXJlIHNpbmNlIHRoZSBjYXJkIGRvZXNuJ3QKKwkJICogcmVzcG9uZCB0byBQQ0kgcmVhZHMgZHVyaW5nIGEgcmVzZXQuIE9uIHNvbWUgYXJjaGl0ZWN0dXJlcworCQkgKiB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIE1DQS4KKwkJICovCisJCXVkZWxheSgyMCk7CisJCWZvciAoY250ID0gMzAwMDA7IGNudDsgY250LS0pIHsKKwkJCWlmICgoUkRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMpICYKKwkJCSAgICBDU1JfSVNQX1NPRlRfUkVTRVQpID09IDApCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoMTAwKTsKKwkJfQorCX0gZWxzZQorCQl1ZGVsYXkoMTApOworCisJLyogUmVzZXQgUklTQyBwcm9jZXNzb3IuICovCisJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfUkVTRVRfUklTQyk7CisKKwlXUlRfUkVHX1dPUkQoJnJlZy0+c2VtYXBob3JlLCAwKTsKKworCS8qIFJlbGVhc2UgUklTQyBwcm9jZXNzb3IuICovCisJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfUkVMRUFTRV9SSVNDKTsKKwlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsJCQkvKiBQQ0kgUG9zdGluZy4gKi8KKworCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSB8fCBJU19RTEEyMzAwKGhhKSkgeworCQlmb3IgKGNudCA9IDA7IGNudCA8IDMwMDAwOyBjbnQrKykgeworCQkJaWYgKCEodGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpKSkKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPm1ieF9yZWdfbG9jaywgbWJ4X2ZsYWdzKTsKKworCQkJaWYgKFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDApICE9IE1CU19CVVNZKSB7CisJCQkJaWYgKCEodGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwKKwkJCQkgICAgJmhhLT5kcGNfZmxhZ3MpKSkKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKKwkJCQkJICAgICZoYS0+bWJ4X3JlZ19sb2NrLCBtYnhfZmxhZ3MpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoISh0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmaGEtPmRwY19mbGFncykpKQorCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5tYnhfcmVnX2xvY2ssCisJCQkJICAgIG1ieF9mbGFncyk7CisKKwkJCXVkZWxheSgxMDApOworCQl9CisJfSBlbHNlCisJCXVkZWxheSgxMDApOworCisJLyogVHVybiBvbiBtYXN0ZXIgZW5hYmxlICovCisJY21kIHw9IFBDSV9DT01NQU5EX01BU1RFUjsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaGEtPnBkZXYsIFBDSV9DT01NQU5ELCBjbWQpOworCisJLyogRGlzYWJsZSBSSVNDIHBhdXNlIG9uIEZQTSBwYXJpdHkgZXJyb3IuICovCisJaWYgKCFJU19RTEEyMTAwKGhhKSkgeworCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9ESVNBQkxFX1BBUklUWV9QQVVTRSk7CisJCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOwkJLyogUENJIFBvc3RpbmcuICovCisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBxbGEyeDAwX2NoaXBfZGlhZygpIC0gVGVzdCBjaGlwIGZvciBwcm9wZXIgb3BlcmF0aW9uLgorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfY2hpcF9kaWFnKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50CQlydmFsOworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCXVuc2lnbmVkIGxvbmcJZmxhZ3MgPSAwOworCXVpbnQxNl90CWRhdGE7CisJdWludDMyX3QJY250OworCXVpbnQxNl90CW1iWzVdOworCisJLyogQXNzdW1lIGEgZmFpbGVkIHN0YXRlICovCisJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisKKwlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IFRlc3RpbmcgZGV2aWNlIGF0ICVseC5cbiIsCisJICAgIGhhLT5ob3N0X25vLCAodV9sb25nKSZyZWctPmZsYXNoX2FkZHJlc3MpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJLyogUmVzZXQgSVNQIGNoaXAuICovCisJV1JUX1JFR19XT1JEKCZyZWctPmN0cmxfc3RhdHVzLCBDU1JfSVNQX1NPRlRfUkVTRVQpOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGhhdmUgYSBkZWxheSBoZXJlIHNpbmNlIHRoZSBjYXJkIHdpbGwgbm90IHJlc3BvbmQgd2hpbGUKKwkgKiBpbiByZXNldCBjYXVzaW5nIGFuIE1DQSBvbiBzb21lIGFyY2hpdGVjdHVyZXMuCisJICovCisJdWRlbGF5KDIwKTsKKwlkYXRhID0gcWxhMngwMF9kZWJvdW5jZV9yZWdpc3RlcigmcmVnLT5jdHJsX3N0YXR1cyk7CisJZm9yIChjbnQgPSA2MDAwMDAwIDsgY250ICYmIChkYXRhICYgQ1NSX0lTUF9TT0ZUX1JFU0VUKTsgY250LS0pIHsKKwkJdWRlbGF5KDUpOworCQlkYXRhID0gUkRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMpOworCQliYXJyaWVyKCk7CisJfQorCisJaWYgKCFjbnQpCisJCWdvdG8gY2hpcF9kaWFnX2ZhaWxlZDsKKworCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogUmVzZXQgcmVnaXN0ZXIgY2xlYXJlZCBieSBjaGlwIHJlc2V0XG4iLAorCSAgICBoYS0+aG9zdF9ubykpOworCisJLyogUmVzZXQgUklTQyBwcm9jZXNzb3IuICovCisJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfUkVTRVRfUklTQyk7CisJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfUkVMRUFTRV9SSVNDKTsKKworCS8qIFdvcmthcm91bmQgZm9yIFFMQTIzMTIgUENJIHBhcml0eSBlcnJvciAqLworCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSB8fCBJU19RTEEyMzAwKGhhKSkgeworCQlkYXRhID0gcWxhMngwMF9kZWJvdW5jZV9yZWdpc3RlcihNQUlMQk9YX1JFRyhoYSwgcmVnLCAwKSk7CisJCWZvciAoY250ID0gNjAwMDAwMDsgY250ICYmIChkYXRhID09IE1CU19CVVNZKTsgY250LS0pIHsKKwkJCXVkZWxheSg1KTsKKwkJCWRhdGEgPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAwKTsKKwkJCWJhcnJpZXIoKTsgCisJCX0KKwl9IGVsc2UKKwkJdWRlbGF5KDEwKTsKKworCWlmICghY250KQorCQlnb3RvIGNoaXBfZGlhZ19mYWlsZWQ7CisKKwkvKiBDaGVjayBwcm9kdWN0IElEIG9mIGNoaXAgKi8KKwlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IENoZWNraW5nIHByb2R1Y3QgSUQgb2YgY2hpcFxuIiwgaGEtPmhvc3Rfbm8pKTsKKworCW1iWzFdID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMSk7CisJbWJbMl0gPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAyKTsKKwltYlszXSA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDMpOworCW1iWzRdID0gcWxhMngwMF9kZWJvdW5jZV9yZWdpc3RlcihNQUlMQk9YX1JFRyhoYSwgcmVnLCA0KSk7CisJaWYgKG1iWzFdICE9IFBST0RfSURfMSB8fCAobWJbMl0gIT0gUFJPRF9JRF8yICYmIG1iWzJdICE9IFBST0RfSURfMmEpIHx8CisJICAgIG1iWzNdICE9IFBST0RfSURfMykgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiV3JvbmcgcHJvZHVjdCBJRCA9IDB4JXgsMHgleCwweCV4XG4iLCBtYlsxXSwgbWJbMl0sIG1iWzNdKTsKKworCQlnb3RvIGNoaXBfZGlhZ19mYWlsZWQ7CisJfQorCWhhLT5wcm9kdWN0X2lkWzBdID0gbWJbMV07CisJaGEtPnByb2R1Y3RfaWRbMV0gPSBtYlsyXTsKKwloYS0+cHJvZHVjdF9pZFsyXSA9IG1iWzNdOworCWhhLT5wcm9kdWN0X2lkWzNdID0gbWJbNF07CisKKwkvKiBBZGp1c3QgZncgUklTQyB0cmFuc2ZlciBzaXplICovCisJaWYgKGhhLT5yZXF1ZXN0X3FfbGVuZ3RoID4gMTAyNCkKKwkJaGEtPmZ3X3RyYW5zZmVyX3NpemUgPSBSRVFVRVNUX0VOVFJZX1NJWkUgKiAxMDI0OworCWVsc2UKKwkJaGEtPmZ3X3RyYW5zZmVyX3NpemUgPSBSRVFVRVNUX0VOVFJZX1NJWkUgKgorCQkgICAgaGEtPnJlcXVlc3RfcV9sZW5ndGg7CisKKwlpZiAoSVNfUUxBMjIwMChoYSkgJiYKKwkgICAgUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgNykgPT0gUUxBMjIwMEFfUklTQ19ST01fVkVSKSB7CisJCS8qIExpbWl0IGZpcm13YXJlIHRyYW5zZmVyIHNpemUgd2l0aCBhIDIyMDBBICovCisJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogRm91bmQgUUxBMjIwMEEgY2hpcC5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCisJCWhhLT5md190cmFuc2Zlcl9zaXplID0gMTI4OworCX0KKworCS8qIFdyYXAgSW5jb21pbmcgTWFpbGJveGVzIFRlc3QuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogQ2hlY2tpbmcgbWFpbGJveGVzLlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwlydmFsID0gcWxhMngwMF9tYnhfcmVnX3Rlc3QoaGEpOworCWlmIChydmFsKSB7CisJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBGYWlsZWQgbWFpbGJveCBzZW5kIHJlZ2lzdGVyIHRlc3RcbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiRmFpbGVkIG1haWxib3ggc2VuZCByZWdpc3RlciB0ZXN0XG4iKTsKKwl9CisJZWxzZSB7CisJCS8qIEZsYWcgYSBzdWNjZXNzZnVsIHJ2YWwgKi8KKwkJcnZhbCA9IFFMQV9TVUNDRVNTOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworY2hpcF9kaWFnX2ZhaWxlZDoKKwlpZiAocnZhbCkKKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IENoaXAgZGlhZ25vc3RpY3MgKioqKiBGQUlMRUQgIgorCQkgICAgIioqKipcbiIsIGhhLT5ob3N0X25vKSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIChydmFsKTsKK30KKworLyoqCisgKiBxbGEyeDAwX3Jlc2l6ZV9yZXF1ZXN0X3EoKSAtIFJlc2l6ZSByZXF1ZXN0IHF1ZXVlIGdpdmVuIGF2YWlsYWJsZSBJU1AgbWVtb3J5LgorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyB2b2lkCitxbGEyeDAwX3Jlc2l6ZV9yZXF1ZXN0X3Eoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQgcnZhbDsKKwl1aW50MTZfdCBmd19pb2NiX2NudCA9IDA7CisJdWludDE2X3QgcmVxdWVzdF9xX2xlbmd0aCA9IFJFUVVFU1RfRU5UUllfQ05UXzJYWFhfRVhUX01FTTsKKwlkbWFfYWRkcl90IHJlcXVlc3RfZG1hOworCXJlcXVlc3RfdCAqcmVxdWVzdF9yaW5nOworCisJLyogVmFsaWQgb25seSBvbiByZWNlbnQgSVNQcy4gKi8KKwlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpCisJCXJldHVybjsKKworCS8qIFJldHJpZXZlIElPQ0IgY291bnRzIGF2YWlsYWJsZSB0byB0aGUgZmlybXdhcmUuICovCisJcnZhbCA9IHFsYTJ4MDBfZ2V0X3Jlc291cmNlX2NudHMoaGEsIE5VTEwsIE5VTEwsIE5VTEwsICZmd19pb2NiX2NudCk7CisJaWYgKHJ2YWwpCisJCXJldHVybjsKKwkvKiBObyBwb2ludCBpbiBjb250aW51aW5nIGlmIGN1cnJlbnQgc2V0dGluZ3MgYXJlIHN1ZmZpY2llbnQuICovCisJaWYgKGZ3X2lvY2JfY250IDwgMTAyNCkKKwkJcmV0dXJuOworCWlmIChoYS0+cmVxdWVzdF9xX2xlbmd0aCA+PSByZXF1ZXN0X3FfbGVuZ3RoKQorCQlyZXR1cm47CisKKwkvKiBBdHRlbXB0IHRvIGNsYWltIGxhcmdlciBhcmVhIGZvciByZXF1ZXN0IHF1ZXVlLiAqLworCXJlcXVlc3RfcmluZyA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKKwkgICAgKHJlcXVlc3RfcV9sZW5ndGggKyAxKSAqIHNpemVvZihyZXF1ZXN0X3QpLCAmcmVxdWVzdF9kbWEsCisJICAgIEdGUF9LRVJORUwpOworCWlmIChyZXF1ZXN0X3JpbmcgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogUmVzaXplIHN1Y2Nlc3NmdWwsIHJlcG9ydCBleHRlbnNpb25zLiAqLworCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkV4dGVuZGVkIG1lbW9yeSBkZXRlY3RlZCAoJWQgS0IpLi4uXG4iLAorCSAgICAoaGEtPmZ3X21lbW9yeV9zaXplICsgMSkgLyAxMDI0KTsKKwlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJSZXNpemluZyByZXF1ZXN0IHF1ZXVlIGRlcHRoICIKKwkgICAgIiglZCAtPiAlZCkuLi5cbiIsIGhhLT5yZXF1ZXN0X3FfbGVuZ3RoLCByZXF1ZXN0X3FfbGVuZ3RoKTsKKworCS8qIENsZWFyIG9sZCBhbGxvY2F0aW9ucy4gKi8KKwlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKKwkgICAgKGhhLT5yZXF1ZXN0X3FfbGVuZ3RoICsgMSkgKiBzaXplb2YocmVxdWVzdF90KSwgaGEtPnJlcXVlc3RfcmluZywKKwkgICAgaGEtPnJlcXVlc3RfZG1hKTsKKworCS8qIEJlZ2luIHVzaW5nIGxhcmdlciBxdWV1ZS4gKi8KKwloYS0+cmVxdWVzdF9xX2xlbmd0aCA9IHJlcXVlc3RfcV9sZW5ndGg7CisJaGEtPnJlcXVlc3RfcmluZyA9IHJlcXVlc3RfcmluZzsKKwloYS0+cmVxdWVzdF9kbWEgPSByZXF1ZXN0X2RtYTsKK30KKworLyoqCisgKiBxbGEyeDAwX3NldHVwX2NoaXAoKSAtIExvYWQgYW5kIHN0YXJ0IFJJU0MgZmlybXdhcmUuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9zZXR1cF9jaGlwKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50CQlydmFsOworCXVpbnQxNl90CWNudDsKKwl1aW50MTZfdAkqcmlzY19jb2RlOworCXVuc2lnbmVkIGxvbmcJcmlzY19hZGRyZXNzOworCXVuc2lnbmVkIGxvbmcJcmlzY19jb2RlX3NpemU7CisJaW50CQludW07CisJaW50CQlpOworCXVpbnQxNl90CSpyZXFfcmluZzsKKwlzdHJ1Y3QgcWxhX2Z3X2luZm8gKmZ3X2l0ZXI7CisKKwlydmFsID0gUUxBX1NVQ0NFU1M7CisKKwkvKiBMb2FkIGZpcm13YXJlIHNlcXVlbmNlcyAqLworCWZ3X2l0ZXIgPSBoYS0+YnJkX2luZm8tPmZ3X2luZm87CisJd2hpbGUgKGZ3X2l0ZXItPmFkZHJlc3NpbmcgIT0gRldfSU5GT19BRERSX05PTU9SRSkgeworCQlyaXNjX2NvZGUgPSBmd19pdGVyLT5md2NvZGU7CisJCXJpc2NfY29kZV9zaXplID0gKmZ3X2l0ZXItPmZ3bGVuOworCisJCWlmIChmd19pdGVyLT5hZGRyZXNzaW5nID09IEZXX0lORk9fQUREUl9OT1JNQUwpIHsKKwkJCXJpc2NfYWRkcmVzcyA9ICpmd19pdGVyLT5md3N0YXJ0OworCQl9IGVsc2UgeworCQkJLyogRXh0ZW5kZWQgYWRkcmVzcyAqLworCQkJcmlzY19hZGRyZXNzID0gKmZ3X2l0ZXItPmxmd3N0YXJ0OworCQl9CisKKwkJbnVtID0gMDsKKwkJcnZhbCA9IDA7CisJCXdoaWxlIChyaXNjX2NvZGVfc2l6ZSA+IDAgJiYgIXJ2YWwpIHsKKwkJCWNudCA9ICh1aW50MTZfdCkoaGEtPmZ3X3RyYW5zZmVyX3NpemUgPj4gMSk7CisJCQlpZiAoY250ID4gcmlzY19jb2RlX3NpemUpCisJCQkJY250ID0gcmlzY19jb2RlX3NpemU7CisKKwkJCURFQlVHNyhwcmludGsoInNjc2koJWxkKTogTG9hZGluZyByaXNjIHNlZ21lbnRAICIKKwkJCSAgICAiYWRkciAlcCwgbnVtYmVyIG9mIGJ5dGVzIDB4JXgsIG9mZnNldCAweCVseC5cbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8sIHJpc2NfY29kZSwgY250LCByaXNjX2FkZHJlc3MpKTsKKworCQkJcmVxX3JpbmcgPSAodWludDE2X3QgKiloYS0+cmVxdWVzdF9yaW5nOworCQkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKQorCQkJCXJlcV9yaW5nW2ldID0gY3B1X3RvX2xlMTYocmlzY19jb2RlW2ldKTsKKworCQkJaWYgKGZ3X2l0ZXItPmFkZHJlc3NpbmcgPT0gRldfSU5GT19BRERSX05PUk1BTCkgeworCQkJCXJ2YWwgPSBxbGEyeDAwX2xvYWRfcmFtKGhhLAorCQkJCSAgICBoYS0+cmVxdWVzdF9kbWEsIHJpc2NfYWRkcmVzcywgY250KTsKKwkJCX0gZWxzZSB7CisJCQkJcnZhbCA9IHFsYTJ4MDBfbG9hZF9yYW1fZXh0KGhhLAorCQkJCSAgICBoYS0+cmVxdWVzdF9kbWEsIHJpc2NfYWRkcmVzcywgY250KTsKKwkJCX0KKwkJCWlmIChydmFsKSB7CisJCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IFtFUlJPUl0gRmFpbGVkIHRvICIKKwkJCQkgICAgImxvYWQgc2VnbWVudCAlZCBvZiBmaXJtd2FyZVxuIiwKKwkJCQkgICAgaGEtPmhvc3Rfbm8sIG51bSkpOworCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCQkgICAgIltFUlJPUl0gRmFpbGVkIHRvIGxvYWQgIgorCQkJCSAgICAic2VnbWVudCAlZCBvZiBmaXJtd2FyZVxuIiwgbnVtKTsKKworCQkJCXFsYTJ4MDBfZHVtcF9yZWdzKGhhKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcmlzY19jb2RlICs9IGNudDsKKwkJCXJpc2NfYWRkcmVzcyArPSBjbnQ7CisJCQlyaXNjX2NvZGVfc2l6ZSAtPSBjbnQ7CisJCQludW0rKzsKKwkJfQorCisJCS8qIE5leHQgZmlybXdhcmUgc2VxdWVuY2UgKi8KKwkJZndfaXRlcisrOworCX0KKworCS8qIFZlcmlmeSBjaGVja3N1bSBvZiBsb2FkZWQgUklTQyBjb2RlLiAqLworCWlmICghcnZhbCkgeworCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogVmVyaWZ5aW5nIENoZWNrc3VtIG9mIGxvYWRlZCBSSVNDICIKKwkJICAgICJjb2RlLlxuIiwgaGEtPmhvc3Rfbm8pKTsKKworCQlydmFsID0gcWxhMngwMF92ZXJpZnlfY2hlY2tzdW0oaGEpOworCQlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgeworCQkJLyogU3RhcnQgZmlybXdhcmUgZXhlY3V0aW9uLiAqLworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IENoZWNrc3VtIE9LLCBzdGFydCAiCisJCQkgICAgImZpcm13YXJlLlxuIiwgaGEtPmhvc3Rfbm8pKTsKKworCQkJcnZhbCA9IHFsYTJ4MDBfZXhlY3V0ZV9mdyhoYSk7CisJCQkvKiBSZXRyaWV2ZSBmaXJtd2FyZSBpbmZvcm1hdGlvbi4gKi8KKwkJCWlmIChydmFsID09IFFMQV9TVUNDRVNTICYmIGhhLT5md19tYWpvcl92ZXJzaW9uID09IDApIHsKKwkJCQlxbGEyeDAwX2dldF9md192ZXJzaW9uKGhhLAorCQkJCSAgICAmaGEtPmZ3X21ham9yX3ZlcnNpb24sCisJCQkJICAgICZoYS0+ZndfbWlub3JfdmVyc2lvbiwKKwkJCQkgICAgJmhhLT5md19zdWJtaW5vcl92ZXJzaW9uLAorCQkJCSAgICAmaGEtPmZ3X2F0dHJpYnV0ZXMsICZoYS0+ZndfbWVtb3J5X3NpemUpOworCQkJCXFsYTJ4MDBfcmVzaXplX3JlcXVlc3RfcShoYSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTworCQkJICAgICJzY3NpKCVsZCk6IElTUCBGaXJtd2FyZSBmYWlsZWQgY2hlY2tzdW0uXG4iLAorCQkJICAgIGhhLT5ob3N0X25vKSk7CisJCX0KKwl9CisKKwlpZiAocnZhbCkgeworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogU2V0dXAgY2hpcCAqKioqIEZBSUxFRCAqKioqLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworLyoqCisgKiBxbGEyeDAwX2luaXRfcmVzcG9uc2VfcV9lbnRyaWVzKCkgLSBJbml0aWFsaXplcyByZXNwb25zZSBxdWV1ZSBlbnRyaWVzLgorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogQmVnaW5uaW5nIG9mIHJlcXVlc3QgcmluZyBoYXMgaW5pdGlhbGl6YXRpb24gY29udHJvbCBibG9jayBhbHJlYWR5IGJ1aWx0CisgKiBieSBudnJhbSBjb25maWcgcm91dGluZS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfaW5pdF9yZXNwb25zZV9xX2VudHJpZXMoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwl1aW50MTZfdCBjbnQ7CisJcmVzcG9uc2VfdCAqcGt0OworCisJcGt0ID0gaGEtPnJlc3BvbnNlX3JpbmdfcHRyOworCWZvciAoY250ID0gMDsgY250IDwgaGEtPnJlc3BvbnNlX3FfbGVuZ3RoOyBjbnQrKykgeworCQlwa3QtPnNpZ25hdHVyZSA9IFJFU1BPTlNFX1BST0NFU1NFRDsKKwkJcGt0Kys7CisJfQorCit9CisKKy8qKgorICogcWxhMngwMF91cGRhdGVfZndfb3B0aW9ucygpIC0gUmVhZCBhbmQgcHJvY2VzcyBmaXJtd2FyZSBvcHRpb25zLgorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyB2b2lkCitxbGEyeDAwX3VwZGF0ZV9md19vcHRpb25zKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJdWludDE2X3Qgc3dpbmcsIGVtcGhhc2lzLCB0eF9zZW5zLCByeF9zZW5zOworCisJbWVtc2V0KGhhLT5md19vcHRpb25zLCAwLCBzaXplb2YoaGEtPmZ3X29wdGlvbnMpKTsKKwlxbGEyeDAwX2dldF9md19vcHRpb25zKGhhLCBoYS0+Zndfb3B0aW9ucyk7CisKKwlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpCisJCXJldHVybjsKKworCS8qIFNlcmlhbCBMaW5rIG9wdGlvbnMuICovCisJREVCVUczKHByaW50aygic2NzaSglbGQpOiBTZXJpYWwgbGluayBvcHRpb25zOlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8pKTsKKwlERUJVRzMocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKSZoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zLAorCSAgICBzaXplb2YoaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9ucykpKTsKKworCWhhLT5md19vcHRpb25zWzFdICY9IH5GTzFfU0VUX0VNUEhBU0lTX1NXSU5HOworCWlmIChoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zWzNdICYgQklUXzIpIHsKKwkJaGEtPmZ3X29wdGlvbnNbMV0gfD0gRk8xX1NFVF9FTVBIQVNJU19TV0lORzsKKworCQkvKiAgMUcgc2V0dGluZ3MgKi8KKwkJc3dpbmcgPSBoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zWzJdICYgKEJJVF8yIHwgQklUXzEgfCBCSVRfMCk7CisJCWVtcGhhc2lzID0gKGhhLT5md19zZXJpYWxsaW5rX29wdGlvbnNbMl0gJgorCQkgICAgKEJJVF80IHwgQklUXzMpKSA+PiAzOworCQl0eF9zZW5zID0gaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9uc1swXSAmCisJCSAgICAoQklUXzMgfCBCSVRfMiB8IEJJVF8xIHwgQklUXzApOyAKKwkJcnhfc2VucyA9IChoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zWzBdICYKKwkJICAgIChCSVRfNyB8IEJJVF82IHwgQklUXzUgfCBCSVRfNCkpID4+IDQ7CisJCWhhLT5md19vcHRpb25zWzEwXSA9IChlbXBoYXNpcyA8PCAxNCkgfCAoc3dpbmcgPDwgOCk7CisJCWlmIChJU19RTEEyMzAwKGhhKSB8fCBJU19RTEEyMzEyKGhhKSB8fCBJU19RTEE2MzEyKGhhKSkgeworCQkJaWYgKHJ4X3NlbnMgPT0gMHgwKQorCQkJCXJ4X3NlbnMgPSAweDM7CisJCQloYS0+Zndfb3B0aW9uc1sxMF0gfD0gKHR4X3NlbnMgPDwgNCkgfCByeF9zZW5zOworCQl9IGVsc2UgaWYgKElTX1FMQTIzMjIoaGEpIHx8IElTX1FMQTYzMjIoaGEpKQorCQkJaGEtPmZ3X29wdGlvbnNbMTBdIHw9IEJJVF81IHwKKwkJCSAgICAoKHJ4X3NlbnMgJiAoQklUXzEgfCBCSVRfMCkpIDw8IDIpIHwKKwkJCSAgICAodHhfc2VucyAmIChCSVRfMSB8IEJJVF8wKSk7CisKKwkJLyogIDJHIHNldHRpbmdzICovCisJCXN3aW5nID0gKGhhLT5md19zZXJpYWxsaW5rX29wdGlvbnNbMl0gJgorCQkgICAgKEJJVF83IHwgQklUXzYgfCBCSVRfNSkpID4+IDU7CisJCWVtcGhhc2lzID0gaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9uc1szXSAmIChCSVRfMSB8IEJJVF8wKTsKKwkJdHhfc2VucyA9IGhhLT5md19zZXJpYWxsaW5rX29wdGlvbnNbMV0gJgorCQkgICAgKEJJVF8zIHwgQklUXzIgfCBCSVRfMSB8IEJJVF8wKTsgCisJCXJ4X3NlbnMgPSAoaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9uc1sxXSAmCisJCSAgICAoQklUXzcgfCBCSVRfNiB8IEJJVF81IHwgQklUXzQpKSA+PiA0OworCQloYS0+Zndfb3B0aW9uc1sxMV0gPSAoZW1waGFzaXMgPDwgMTQpIHwgKHN3aW5nIDw8IDgpOworCQlpZiAoSVNfUUxBMjMwMChoYSkgfHwgSVNfUUxBMjMxMihoYSkgfHwgSVNfUUxBNjMxMihoYSkpIHsKKwkJCWlmIChyeF9zZW5zID09IDB4MCkKKwkJCQlyeF9zZW5zID0gMHgzOworCQkJaGEtPmZ3X29wdGlvbnNbMTFdIHw9ICh0eF9zZW5zIDw8IDQpIHwgcnhfc2VuczsKKwkJfSBlbHNlIGlmIChJU19RTEEyMzIyKGhhKSB8fCBJU19RTEE2MzIyKGhhKSkKKwkJCWhhLT5md19vcHRpb25zWzExXSB8PSBCSVRfNSB8CisJCQkgICAgKChyeF9zZW5zICYgKEJJVF8xIHwgQklUXzApKSA8PCAyKSB8CisJCQkgICAgKHR4X3NlbnMgJiAoQklUXzEgfCBCSVRfMCkpOworCX0KKworCS8qIEZDUDIgb3B0aW9ucy4gKi8KKwkvKiAgUmV0dXJuIGNvbW1hbmQgSU9DQnMgd2l0aG91dCB3YWl0aW5nIGZvciBhbiBBQlRTIHRvIGNvbXBsZXRlLiAqLworCWhhLT5md19vcHRpb25zWzNdIHw9IEJJVF8xMzsKKworCS8qIExFRCBzY2hlbWUuICovCisJaWYgKGhhLT5mbGFncy5lbmFibGVfbGVkX3NjaGVtZSkKKwkJaGEtPmZ3X29wdGlvbnNbMl0gfD0gQklUXzEyOworCisJLyogVXBkYXRlIGZpcm13YXJlIG9wdGlvbnMuICovCisJcWxhMngwMF9zZXRfZndfb3B0aW9ucyhoYSwgaGEtPmZ3X29wdGlvbnMpOworfQorCisvKioKKyAqIHFsYTJ4MDBfaW5pdF9yaW5ncygpIC0gSW5pdGlhbGl6ZXMgZmlybXdhcmUuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBCZWdpbm5pbmcgb2YgcmVxdWVzdCByaW5nIGhhcyBpbml0aWFsaXphdGlvbiBjb250cm9sIGJsb2NrIGFscmVhZHkgYnVpbHQKKyAqIGJ5IG52cmFtIGNvbmZpZyByb3V0aW5lLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX2luaXRfcmluZ3Moc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQJcnZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlpbnQgY250OworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwkvKiBDbGVhciBvdXRzdGFuZGluZyBjb21tYW5kcyBhcnJheS4gKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgY250KyspCisJCWhhLT5vdXRzdGFuZGluZ19jbWRzW2NudF0gPSBOVUxMOworCisJaGEtPmN1cnJlbnRfb3V0c3RhbmRpbmdfY21kID0gMDsKKworCS8qIENsZWFyIFJTQ04gcXVldWUuICovCisJaGEtPnJzY25faW5fcHRyID0gMDsKKwloYS0+cnNjbl9vdXRfcHRyID0gMDsKKworCS8qIEluaXRpYWxpemUgZmlybXdhcmUuICovCisJaGEtPnJlcXVlc3RfcmluZ19wdHIgID0gaGEtPnJlcXVlc3RfcmluZzsKKwloYS0+cmVxX3JpbmdfaW5kZXggICAgPSAwOworCWhhLT5yZXFfcV9jbnQgICAgICAgICA9IGhhLT5yZXF1ZXN0X3FfbGVuZ3RoOworCWhhLT5yZXNwb25zZV9yaW5nX3B0ciA9IGhhLT5yZXNwb25zZV9yaW5nOworCWhhLT5yc3BfcmluZ19pbmRleCAgICA9IDA7CisKKwkvKiBTZXR1cCByaW5nIHBhcmFtZXRlcnMgaW4gaW5pdGlhbGl6YXRpb24gY29udHJvbCBibG9jay4gKi8KKwloYS0+aW5pdF9jYi0+cmVxdWVzdF9xX291dHBvaW50ZXIgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDApOworCWhhLT5pbml0X2NiLT5yZXNwb25zZV9xX2lucG9pbnRlciA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7CisJaGEtPmluaXRfY2ItPnJlcXVlc3RfcV9sZW5ndGggPSBjcHVfdG9fbGUxNihoYS0+cmVxdWVzdF9xX2xlbmd0aCk7CisJaGEtPmluaXRfY2ItPnJlc3BvbnNlX3FfbGVuZ3RoID0gY3B1X3RvX2xlMTYoaGEtPnJlc3BvbnNlX3FfbGVuZ3RoKTsKKwloYS0+aW5pdF9jYi0+cmVxdWVzdF9xX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMihMU0QoaGEtPnJlcXVlc3RfZG1hKSk7CisJaGEtPmluaXRfY2ItPnJlcXVlc3RfcV9hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoTVNEKGhhLT5yZXF1ZXN0X2RtYSkpOworCWhhLT5pbml0X2NiLT5yZXNwb25zZV9xX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMihMU0QoaGEtPnJlc3BvbnNlX2RtYSkpOworCWhhLT5pbml0X2NiLT5yZXNwb25zZV9xX2FkZHJlc3NbMV0gPSBjcHVfdG9fbGUzMihNU0QoaGEtPnJlc3BvbnNlX2RtYSkpOworCisJLyogSW5pdGlhbGl6ZSByZXNwb25zZSBxdWV1ZSBlbnRyaWVzICovCisJcWxhMngwMF9pbml0X3Jlc3BvbnNlX3FfZW50cmllcyhoYSk7CisKKyAJV1JUX1JFR19XT1JEKElTUF9SRVFfUV9JTihoYSwgcmVnKSwgMCk7CisgCVdSVF9SRUdfV09SRChJU1BfUkVRX1FfT1VUKGhhLCByZWcpLCAwKTsKKyAJV1JUX1JFR19XT1JEKElTUF9SU1BfUV9JTihoYSwgcmVnKSwgMCk7CisgCVdSVF9SRUdfV09SRChJU1BfUlNQX1FfT1VUKGhhLCByZWcpLCAwKTsKKwlSRF9SRUdfV09SRChJU1BfUlNQX1FfT1VUKGhhLCByZWcpKTsJCS8qIFBDSSBQb3N0aW5nLiAqLworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCS8qIFVwZGF0ZSBhbnkgSVNQIHNwZWNpZmljIGZpcm13YXJlIG9wdGlvbnMgYmVmb3JlIGluaXRpYWxpemF0aW9uLiAqLworCXFsYTJ4MDBfdXBkYXRlX2Z3X29wdGlvbnMoaGEpOworCisJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IElzc3VlIGluaXQgZmlybXdhcmUuXG4iLCBoYS0+aG9zdF9ubykpOworCXJ2YWwgPSBxbGEyeDAwX2luaXRfZmlybXdhcmUoaGEsIHNpemVvZihpbml0X2NiX3QpKTsKKwlpZiAocnZhbCkgeworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogSW5pdCBmaXJtd2FyZSAqKioqIEZBSUxFRCAqKioqLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJfSBlbHNlIHsKKwkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBJbml0IGZpcm13YXJlIC0tIHN1Y2Nlc3MuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKioKKyAqIHFsYTJ4MDBfZndfcmVhZHkoKSAtIFdhaXRzIGZvciBmaXJtd2FyZSByZWFkeS4KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX2Z3X3JlYWR5KHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50CQlydmFsOworCXVuc2lnbmVkIGxvbmcJd3RpbWUsIG10aW1lOworCXVpbnQxNl90CW1pbl93YWl0OwkvKiBNaW5pbXVtIHdhaXQgdGltZSBpZiBsb29wIGlzIGRvd24gKi8KKwl1aW50MTZfdAl3YWl0X3RpbWU7CS8qIFdhaXQgdGltZSBpZiBsb29wIGlzIGNvbWluZyByZWFkeSAqLworCXVpbnQxNl90CWZ3X3N0YXRlOworCisJcnZhbCA9IFFMQV9TVUNDRVNTOworCisJLyogMjAgc2Vjb25kcyBmb3IgbG9vcCBkb3duLiAqLworCW1pbl93YWl0ID0gMjA7CQkKKworCS8qCisJICogRmlybXdhcmUgc2hvdWxkIHRha2UgYXQgbW9zdCBvbmUgUkFUT1YgdG8gbG9naW4sIHBsdXMgNSBzZWNvbmRzIGZvcgorCSAqIG91ciBvd24gcHJvY2Vzc2luZy4KKwkgKi8KKwlpZiAoKHdhaXRfdGltZSA9IChoYS0+cmV0cnlfY291bnQqaGEtPmxvZ2luX3RpbWVvdXQpICsgNSkgPCBtaW5fd2FpdCkgeworCQl3YWl0X3RpbWUgPSBtaW5fd2FpdDsKKwl9CisKKwkvKiBNaW4gd2FpdCB0aW1lIGlmIGxvb3AgZG93biAqLworCW10aW1lID0gamlmZmllcyArIChtaW5fd2FpdCAqIEhaKTsKKworCS8qIHdhaXQgdGltZSBiZWZvcmUgZmlybXdhcmUgcmVhZHkgKi8KKwl3dGltZSA9IGppZmZpZXMgKyAod2FpdF90aW1lICogSFopOworCisJLyogV2FpdCBmb3IgSVNQIHRvIGZpbmlzaCBMSVAgKi8KKwlpZiAoIWhhLT5mbGFncy5pbml0X2RvbmUpCisgCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJXYWl0aW5nIGZvciBMSVAgdG8gY29tcGxldGUuLi5cbiIpOworCisJREVCVUczKHByaW50aygic2NzaSglbGQpOiBXYWl0aW5nIGZvciBMSVAgdG8gY29tcGxldGUuLi5cbiIsCisJICAgIGhhLT5ob3N0X25vKSk7CisKKwlkbyB7CisJCXJ2YWwgPSBxbGEyeDAwX2dldF9maXJtd2FyZV9zdGF0ZShoYSwgJmZ3X3N0YXRlKTsKKwkJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKKwkJCWlmIChmd19zdGF0ZSA8IEZTVEFURV9MT1NTX09GX1NZTkMpIHsKKwkJCQloYS0+ZGV2aWNlX2ZsYWdzICY9IH5ERkxHX05PX0NBQkxFOworCQkJfQorCQkJaWYgKGZ3X3N0YXRlID09IEZTVEFURV9SRUFEWSkgeworCQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBGL1cgUmVhZHkgLSBPSyBcbiIsCisJCQkJICAgIGhhLT5ob3N0X25vKSk7CisKKwkJCQlxbGEyeDAwX2dldF9yZXRyeV9jbnQoaGEsICZoYS0+cmV0cnlfY291bnQsCisJCQkJICAgICZoYS0+bG9naW5fdGltZW91dCwgJmhhLT5yX2FfdG92KTsKKworCQkJCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisKKwkJCWlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3BfZG93bl90aW1lcikgJiYKKwkJCSAgICAoZndfc3RhdGUgPj0gRlNUQVRFX0xPU1NfT0ZfU1lOQyB8fAorCQkJCWZ3X3N0YXRlID09IEZTVEFURV9XQUlUX0FMX1BBKSkgeworCQkJCS8qIExvb3AgZG93bi4gVGltZW91dCBvbiBtaW5fd2FpdCBmb3Igc3RhdGVzCisJCQkJICogb3RoZXIgdGhhbiBXYWl0IGZvciBMb2dpbi4gCisJCQkJICovCQorCQkJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIG10aW1lKSkgeworCQkJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkJCSAgICAiQ2FibGUgaXMgdW5wbHVnZ2VkLi4uXG4iKTsKKworCQkJCQloYS0+ZGV2aWNlX2ZsYWdzIHw9IERGTEdfTk9fQ0FCTEU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIE1haWxib3ggY21kIGZhaWxlZC4gVGltZW91dCBvbiBtaW5fd2FpdC4gKi8KKwkJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIG10aW1lKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHd0aW1lKSkKKwkJCWJyZWFrOworCisJCS8qIERlbGF5IGZvciBhIHdoaWxlICovCisJCW1zbGVlcCg1MDApOworCisJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogZndfc3RhdGU9JXggY3VyciB0aW1lPSVseC5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgZndfc3RhdGUsIGppZmZpZXMpKTsKKwl9IHdoaWxlICgxKTsKKworCURFQlVHKHByaW50aygic2NzaSglbGQpOiBmd19zdGF0ZT0leCBjdXJyIHRpbWU9JWx4LlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8sIGZ3X3N0YXRlLCBqaWZmaWVzKSk7CisKKwlpZiAocnZhbCkgeworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogRmlybXdhcmUgcmVhZHkgKioqKiBGQUlMRUQgKioqKi5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCX0KKworCXJldHVybiAocnZhbCk7Cit9CisKKy8qCisqICBxbGEyeDAwX2NvbmZpZ3VyZV9oYmEKKyogICAgICBTZXR1cCBhZGFwdGVyIGNvbnRleHQuCisqCisqIElucHV0OgorKiAgICAgIGhhID0gYWRhcHRlciBzdGF0ZSBwb2ludGVyLgorKgorKiBSZXR1cm5zOgorKiAgICAgIDAgPSBzdWNjZXNzCisqCisqIENvbnRleHQ6CisqICAgICAgS2VybmVsIGNvbnRleHQuCisqLworc3RhdGljIGludAorcWxhMngwMF9jb25maWd1cmVfaGJhKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50ICAgICAgIHJ2YWw7CisJdWludDE2X3QgICAgICBsb29wX2lkOworCXVpbnQxNl90ICAgICAgdG9wbzsKKwl1aW50OF90ICAgICAgIGFsX3BhOworCXVpbnQ4X3QgICAgICAgYXJlYTsKKwl1aW50OF90ICAgICAgIGRvbWFpbjsKKwljaGFyCQljb25uZWN0X3R5cGVbMjJdOworCisJLyogR2V0IGhvc3QgYWRkcmVzc2VzLiAqLworCXJ2YWwgPSBxbGEyeDAwX2dldF9hZGFwdGVyX2lkKGhhLAorCSAgICAmbG9vcF9pZCwgJmFsX3BhLCAmYXJlYSwgJmRvbWFpbiwgJnRvcG8pOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJFUlJPUiAtLSBVbmFibGUgdG8gZ2V0IGhvc3QgbG9vcCBJRC5cbiIpOworCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJcmV0dXJuIChydmFsKTsKKwl9CisKKwlpZiAodG9wbyA9PSA0KSB7CisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCSJDYW5ub3QgZ2V0IHRvcG9sb2d5IC0gcmV0cnlpbmcuXG4iKTsKKwkJcmV0dXJuIChRTEFfRlVOQ1RJT05fRkFJTEVEKTsKKwl9CisKKwloYS0+bG9vcF9pZCA9IGxvb3BfaWQ7CisKKwkvKiBpbml0aWFsaXplICovCisJaGEtPm1pbl9leHRlcm5hbF9sb29waWQgPSBTTlNfRklSU1RfTE9PUF9JRDsKKwloYS0+b3BlcmF0aW5nX21vZGUgPSBMT09QOworCisJc3dpdGNoICh0b3BvKSB7CisJY2FzZSAwOgorCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IEhCQSBpbiBOTCB0b3BvbG9neS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCQloYS0+Y3VycmVudF90b3BvbG9neSA9IElTUF9DRkdfTkw7CisJCXN0cmNweShjb25uZWN0X3R5cGUsICIoTG9vcCkiKTsKKwkJYnJlYWs7CisKKwljYXNlIDE6CisJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogSEJBIGluIEZMIHRvcG9sb2d5LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJCWhhLT5jdXJyZW50X3RvcG9sb2d5ID0gSVNQX0NGR19GTDsKKwkJc3RyY3B5KGNvbm5lY3RfdHlwZSwgIihGTF9Qb3J0KSIpOworCQlicmVhazsKKworCWNhc2UgMjoKKwkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBIQkEgaW4gTiBQMlAgdG9wb2xvZ3kuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJaGEtPm9wZXJhdGluZ19tb2RlID0gUDJQOworCQloYS0+Y3VycmVudF90b3BvbG9neSA9IElTUF9DRkdfTjsKKwkJc3RyY3B5KGNvbm5lY3RfdHlwZSwgIihOX1BvcnQtdG8tTl9Qb3J0KSIpOworCQlicmVhazsKKworCWNhc2UgMzoKKwkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBIQkEgaW4gRiBQMlAgdG9wb2xvZ3kuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJaGEtPm9wZXJhdGluZ19tb2RlID0gUDJQOworCQloYS0+Y3VycmVudF90b3BvbG9neSA9IElTUF9DRkdfRjsKKwkJc3RyY3B5KGNvbm5lY3RfdHlwZSwgIihGX1BvcnQpIik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBIQkEgaW4gdW5rbm93biB0b3BvbG9neSAleC4gIgorCQkgICAgIlVzaW5nIE5MLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCB0b3BvKSk7CisJCWhhLT5jdXJyZW50X3RvcG9sb2d5ID0gSVNQX0NGR19OTDsKKwkJc3RyY3B5KGNvbm5lY3RfdHlwZSwgIihMb29wKSIpOworCQlicmVhazsKKwl9CisKKwkvKiBTYXZlIEhvc3QgcG9ydCBhbmQgbG9vcCBJRC4gKi8KKwkvKiBieXRlIG9yZGVyIC0gQmlnIEVuZGlhbiAqLworCWhhLT5kX2lkLmIuZG9tYWluID0gZG9tYWluOworCWhhLT5kX2lkLmIuYXJlYSA9IGFyZWE7CisJaGEtPmRfaWQuYi5hbF9wYSA9IGFsX3BhOworCisJaWYgKCFoYS0+ZmxhZ3MuaW5pdF9kb25lKQorIAkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkgICAgIlRvcG9sb2d5IC0gJXMsIEhvc3QgTG9vcCBhZGRyZXNzIDB4JXhcbiIsCisgCQkgICAgY29ubmVjdF90eXBlLCBoYS0+bG9vcF9pZCk7CisKKwlpZiAocnZhbCkgeworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogRkFJTEVELlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwl9IGVsc2UgeworCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IGV4aXRpbmcgbm9ybWFsbHkuXG4iLCBoYS0+aG9zdF9ubykpOworCX0KKworCXJldHVybihydmFsKTsKK30KKworLyoKKyogTlZSQU0gY29uZmlndXJhdGlvbiBmb3IgSVNQIDJ4eHgKKyoKKyogSW5wdXQ6CisqICAgICAgaGEgICAgICAgICAgICAgICAgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisqCisqIE91dHB1dDoKKyogICAgICBpbml0aWFsaXphdGlvbiBjb250cm9sIGJsb2NrIGluIHJlc3BvbnNlX3JpbmcKKyogICAgICBob3N0IGFkYXB0ZXJzIHBhcmFtZXRlcnMgaW4gaG9zdCBhZGFwdGVyIGJsb2NrCisqCisqIFJldHVybnM6CisqICAgICAgMCA9IHN1Y2Nlc3MuCisqLworc3RhdGljIGludAorcWxhMngwMF9udnJhbV9jb25maWcoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQgICBydmFsOworCXVpbnQ4X3QgICBjaGtzdW0gPSAwOworCXVpbnQxNl90ICBjbnQ7CisJdWludDhfdCAgICpkcHRyMSwgKmRwdHIyOworCWluaXRfY2JfdCAqaWNiICAgPSBoYS0+aW5pdF9jYjsKKwludnJhbV90ICpudiAgICA9IChudnJhbV90ICopaGEtPnJlcXVlc3RfcmluZzsKKwl1aW50MTZfdCAgKndwdHIgID0gKHVpbnQxNl90ICopaGEtPnJlcXVlc3RfcmluZzsKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKwl1aW50OF90ICB0aW1lcl9tb2RlOworCisJcnZhbCA9IFFMQV9TVUNDRVNTOworCisJLyogRGV0ZXJtaW5lIE5WUkFNIHN0YXJ0aW5nIGFkZHJlc3MuICovCisJaGEtPm52cmFtX2Jhc2UgPSAwOworCWlmICghSVNfUUxBMjEwMChoYSkgJiYgIUlTX1FMQTIyMDAoaGEpICYmICFJU19RTEEyMzAwKGhhKSkKKwkJaWYgKChSRF9SRUdfV09SRCgmcmVnLT5jdHJsX3N0YXR1cykgPj4gMTQpID09IDEpCisJCQloYS0+bnZyYW1fYmFzZSA9IDB4ODA7CisKKwkvKiBHZXQgTlZSQU0gZGF0YSBhbmQgY2FsY3VsYXRlIGNoZWNrc3VtLiAqLworCXFsYTJ4MDBfbG9ja19udnJhbV9hY2Nlc3MoaGEpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKG52cmFtX3QpLzI7IGNudCsrKSB7CisJCSp3cHRyID0gY3B1X3RvX2xlMTYocWxhMngwMF9nZXRfbnZyYW1fd29yZChoYSwKKwkJICAgIChjbnQraGEtPm52cmFtX2Jhc2UpKSk7CisJCWNoa3N1bSArPSAodWludDhfdCkqd3B0cjsKKwkJY2hrc3VtICs9ICh1aW50OF90KSgqd3B0ciA+PiA4KTsKKwkJd3B0cisrOworCX0KKwlxbGEyeDAwX3VubG9ja19udnJhbV9hY2Nlc3MoaGEpOworCisJREVCVUc1KHByaW50aygic2NzaSglbGQpOiBDb250ZW50cyBvZiBOVlJBTVxuIiwgaGEtPmhvc3Rfbm8pKTsKKwlERUJVRzUocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKWhhLT5yZXF1ZXN0X3JpbmcsCisJICAgIHNpemVvZihudnJhbV90KSkpOworCisJLyogQmFkIE5WUkFNIGRhdGEsIHNldCBkZWZhdWx0cyBwYXJhbWV0ZXJzLiAqLworCWlmIChjaGtzdW0gfHwgbnYtPmlkWzBdICE9ICdJJyB8fCBudi0+aWRbMV0gIT0gJ1MnIHx8CisJICAgIG52LT5pZFsyXSAhPSAnUCcgfHwgbnYtPmlkWzNdICE9ICcgJyB8fCBudi0+bnZyYW1fdmVyc2lvbiA8IDEpIHsKKwkJLyogUmVzZXQgTlZSQU0gZGF0YS4gKi8KKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiSW5jb25zaXN0ZW50IE5WUkFNIGRldGVjdGVkOiAiCisJCSAgICAiY2hlY2tzdW09MHgleCBpZD0lYyB2ZXJzaW9uPTB4JXguXG4iLCBjaGtzdW0sIG52LT5pZFswXSwKKwkJICAgIG52LT5udnJhbV92ZXJzaW9uKTsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiRmFsbGluZyBiYWNrIHRvIGZ1bmN0aW9uaW5nICh5ZXQgIgorCQkgICAgImludmFsaWQgLS0gV1dQTikgZGVmYXVsdHMuXG4iKTsKKworCQkvKgorCQkgKiBTZXQgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBjb250cm9sIGJsb2NrLgorCQkgKi8KKwkJbWVtc2V0KG52LCAwLCBzaXplb2YobnZyYW1fdCkpOworCQludi0+cGFyYW1ldGVyX2Jsb2NrX3ZlcnNpb24gPSBJQ0JfVkVSU0lPTjsKKworCQlpZiAoSVNfUUxBMjNYWChoYSkpIHsKKwkJCW52LT5maXJtd2FyZV9vcHRpb25zWzBdID0gQklUXzIgfCBCSVRfMTsKKwkJCW52LT5maXJtd2FyZV9vcHRpb25zWzFdID0gQklUXzcgfCBCSVRfNTsKKwkJCW52LT5hZGRfZmlybXdhcmVfb3B0aW9uc1swXSA9IEJJVF81OworCQkJbnYtPmFkZF9maXJtd2FyZV9vcHRpb25zWzFdID0gQklUXzUgfCBCSVRfNDsKKwkJCW52LT5mcmFtZV9wYXlsb2FkX3NpemUgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDIwNDgpOworCQkJbnYtPnNwZWNpYWxfb3B0aW9uc1sxXSA9IEJJVF83OworCQl9IGVsc2UgaWYgKElTX1FMQTIyMDAoaGEpKSB7CisJCQludi0+ZmlybXdhcmVfb3B0aW9uc1swXSA9IEJJVF8yIHwgQklUXzE7CisJCQludi0+ZmlybXdhcmVfb3B0aW9uc1sxXSA9IEJJVF83IHwgQklUXzU7CisJCQludi0+YWRkX2Zpcm13YXJlX29wdGlvbnNbMF0gPSBCSVRfNTsKKwkJCW52LT5hZGRfZmlybXdhcmVfb3B0aW9uc1sxXSA9IEJJVF81IHwgQklUXzQ7CisJCQludi0+ZnJhbWVfcGF5bG9hZF9zaXplID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigxMDI0KTsKKwkJfSBlbHNlIGlmIChJU19RTEEyMTAwKGhhKSkgeworCQkJbnYtPmZpcm13YXJlX29wdGlvbnNbMF0gPSBCSVRfMyB8IEJJVF8xOworCQkJbnYtPmZpcm13YXJlX29wdGlvbnNbMV0gPSBCSVRfNTsKKwkJCW52LT5mcmFtZV9wYXlsb2FkX3NpemUgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDEwMjQpOworCQl9CisKKwkJbnYtPm1heF9pb2NiX2FsbG9jYXRpb24gPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDI1Nik7CisJCW52LT5leGVjdXRpb25fdGhyb3R0bGUgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDE2KTsKKwkJbnYtPnJldHJ5X2NvdW50ID0gODsKKwkJbnYtPnJldHJ5X2RlbGF5ID0gMTsKKworCQludi0+cG9ydF9uYW1lWzBdID0gMzM7CisJCW52LT5wb3J0X25hbWVbM10gPSAyMjQ7CisJCW52LT5wb3J0X25hbWVbNF0gPSAxMzk7CisKKwkJbnYtPmxvZ2luX3RpbWVvdXQgPSA0OworCisJCS8qCisJCSAqIFNldCBkZWZhdWx0IGhvc3QgYWRhcHRlciBwYXJhbWV0ZXJzCisJCSAqLworCQludi0+aG9zdF9wWzFdID0gQklUXzI7CisJCW52LT5yZXNldF9kZWxheSA9IDU7CisJCW52LT5wb3J0X2Rvd25fcmV0cnlfY291bnQgPSA4OworCQludi0+bWF4X2x1bnNfcGVyX3RhcmdldCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoOCk7CisJCW52LT5saW5rX2Rvd25fdGltZW91dCA9IDYwOworCisJCXJ2YWwgPSAxOworCX0KKworI2lmIGRlZmluZWQoQ09ORklHX0lBNjRfR0VORVJJQykgfHwgZGVmaW5lZChDT05GSUdfSUE2NF9TR0lfU04yKQorCS8qCisJICogVGhlIFNOMiBkb2VzIG5vdCBwcm92aWRlIEJJT1MgZW11bGF0aW9uIHdoaWNoIG1lYW5zIHlvdSBjYW4ndCBjaGFuZ2UKKwkgKiBwb3RlbnRpYWxseSBib2d1cyBCSU9TIHNldHRpbmdzLiBGb3JjZSB0aGUgdXNlIG9mIGRlZmF1bHQgc2V0dGluZ3MKKwkgKiBmb3IgbGluayByYXRlIGFuZCBmcmFtZSBzaXplLiAgSG9wZSB0aGF0IHRoZSByZXN0IG9mIHRoZSBzZXR0aW5ncworCSAqIGFyZSB2YWxpZC4KKwkgKi8KKwlpZiAoaWE2NF9wbGF0Zm9ybV9pcygic24yIikpIHsKKwkJbnYtPmZyYW1lX3BheWxvYWRfc2l6ZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMjA0OCk7CisJCWlmIChJU19RTEEyM1hYKGhhKSkKKwkJCW52LT5zcGVjaWFsX29wdGlvbnNbMV0gPSBCSVRfNzsKKwl9CisjZW5kaWYKKworCS8qIFJlc2V0IEluaXRpYWxpemF0aW9uIGNvbnRyb2wgYmxvY2sgKi8KKwltZW1zZXQoaWNiLCAwLCBzaXplb2YoaW5pdF9jYl90KSk7CisKKwkvKgorCSAqIFNldHVwIGRyaXZlciBOVlJBTSBvcHRpb25zLgorCSAqLworCW52LT5maXJtd2FyZV9vcHRpb25zWzBdIHw9IChCSVRfNiB8IEJJVF8xKTsKKwludi0+ZmlybXdhcmVfb3B0aW9uc1swXSAmPSB+KEJJVF81IHwgQklUXzQpOworCW52LT5maXJtd2FyZV9vcHRpb25zWzFdIHw9IChCSVRfNSB8IEJJVF8wKTsKKwludi0+ZmlybXdhcmVfb3B0aW9uc1sxXSAmPSB+QklUXzQ7CisKKwlpZiAoSVNfUUxBMjNYWChoYSkpIHsKKwkJbnYtPmZpcm13YXJlX29wdGlvbnNbMF0gfD0gQklUXzI7CisJCW52LT5maXJtd2FyZV9vcHRpb25zWzBdICY9IH5CSVRfMzsKKworCQlpZiAoSVNfUUxBMjMwMChoYSkpIHsKKwkJCWlmIChoYS0+ZmJfcmV2ID09IEZQTV8yMzEwKSB7CisJCQkJc3RyY3B5KGhhLT5tb2RlbF9udW1iZXIsICJRTEEyMzEwIik7CisJCQl9IGVsc2UgeworCQkJCXN0cmNweShoYS0+bW9kZWxfbnVtYmVyLCAiUUxBMjMwMCIpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHJ2YWwgPT0gMCAmJgorCQkJICAgIG1lbWNtcChudi0+bW9kZWxfbnVtYmVyLCBCSU5aRVJPLAorCQkJCSAgICBzaXplb2YobnYtPm1vZGVsX251bWJlcikpICE9IDApIHsKKwkJCQljaGFyICpzdCwgKmVuOworCisJCQkJc3RybmNweShoYS0+bW9kZWxfbnVtYmVyLCBudi0+bW9kZWxfbnVtYmVyLAorCQkJCSAgICBzaXplb2YobnYtPm1vZGVsX251bWJlcikpOworCQkJCXN0ID0gZW4gPSBoYS0+bW9kZWxfbnVtYmVyOworCQkJCWVuICs9IHNpemVvZihudi0+bW9kZWxfbnVtYmVyKSAtIDE7CisJCQkJd2hpbGUgKGVuID4gc3QpIHsKKwkJCQkJaWYgKCplbiAhPSAweDIwICYmICplbiAhPSAweDAwKQorCQkJCQkJYnJlYWs7CisJCQkJCSplbi0tID0gJ1wwJzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXVpbnQxNl90ICAgICAgICBpbmRleDsKKworCQkJCWluZGV4ID0gKGhhLT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlICYgMHhmZik7CisJCQkJaWYgKGluZGV4IDwgUUxBX01PREVMX05BTUVTKSB7CisJCQkJCXN0cmNweShoYS0+bW9kZWxfbnVtYmVyLAorCQkJCQkgICAgcWxhMngwMF9tb2RlbF9uYW1lW2luZGV4XSk7CisJCQkJCWhhLT5tb2RlbF9kZXNjID0KKwkJCQkJICAgIHFsYTJ4MDBfbW9kZWxfZGVzY1tpbmRleF07CisJCQkJfSBlbHNlIHsKKwkJCQkJc3RyY3B5KGhhLT5tb2RlbF9udW1iZXIsICJRTEEyM3h4Iik7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIGlmIChJU19RTEEyMjAwKGhhKSkgeworCQludi0+ZmlybXdhcmVfb3B0aW9uc1swXSB8PSBCSVRfMjsKKwkJLyoKKwkJICogJ1BvaW50LXRvLXBvaW50IHByZWZlcnJlZCwgZWxzZSBsb29wJyBpcyBub3QgYSBzYWZlCisJCSAqIGNvbm5lY3Rpb24gbW9kZSBzZXR0aW5nLgorCQkgKi8KKwkJaWYgKChudi0+YWRkX2Zpcm13YXJlX29wdGlvbnNbMF0gJiAoQklUXzYgfCBCSVRfNSB8IEJJVF80KSkgPT0KKwkJICAgIChCSVRfNSB8IEJJVF80KSkgeworCQkJLyogRm9yY2UgJ2xvb3AgcHJlZmVycmVkLCBlbHNlIHBvaW50LXRvLXBvaW50Jy4gKi8KKwkJCW52LT5hZGRfZmlybXdhcmVfb3B0aW9uc1swXSAmPSB+KEJJVF82IHwgQklUXzUgfCBCSVRfNCk7CisJCQludi0+YWRkX2Zpcm13YXJlX29wdGlvbnNbMF0gfD0gQklUXzU7CisJCX0KKwkJc3RyY3B5KGhhLT5tb2RlbF9udW1iZXIsICJRTEEyMnh4Iik7CisJfSBlbHNlIC8qaWYgKElTX1FMQTIxMDAoaGEpKSovIHsKKwkJc3RyY3B5KGhhLT5tb2RlbF9udW1iZXIsICJRTEEyMTAwIik7CisJfQorCisJLyoKKwkgKiBDb3B5IG92ZXIgTlZSQU0gUklTQyBwYXJhbWV0ZXIgYmxvY2sgdG8gaW5pdGlhbGl6YXRpb24gY29udHJvbCBibG9jay4KKwkgKi8KKwlkcHRyMSA9ICh1aW50OF90ICopaWNiOworCWRwdHIyID0gKHVpbnQ4X3QgKikmbnYtPnBhcmFtZXRlcl9ibG9ja192ZXJzaW9uOworCWNudCA9ICh1aW50OF90ICopJmljYi0+cmVxdWVzdF9xX291dHBvaW50ZXIgLSAodWludDhfdCAqKSZpY2ItPnZlcnNpb247CisJd2hpbGUgKGNudC0tKQorCQkqZHB0cjErKyA9ICpkcHRyMisrOworCisJLyogQ29weSAybmQgaGFsZi4gKi8KKwlkcHRyMSA9ICh1aW50OF90ICopaWNiLT5hZGRfZmlybXdhcmVfb3B0aW9uczsKKwljbnQgPSAodWludDhfdCAqKWljYi0+cmVzZXJ2ZWRfMyAtICh1aW50OF90ICopaWNiLT5hZGRfZmlybXdhcmVfb3B0aW9uczsKKwl3aGlsZSAoY250LS0pCisJCSpkcHRyMSsrID0gKmRwdHIyKys7CisKKwkvKiBQcmVwYXJlIG5vZGVuYW1lICovCisJaWYgKChpY2ItPmZpcm13YXJlX29wdGlvbnNbMV0gJiBCSVRfNikgPT0gMCkgeworCQkvKgorCQkgKiBGaXJtd2FyZSB3aWxsIGFwcGx5IHRoZSBmb2xsb3dpbmcgbWFzayBpZiB0aGUgbm9kZW5hbWUgd2FzCisJCSAqIG5vdCBwcm92aWRlZC4KKwkJICovCisJCW1lbWNweShpY2ItPm5vZGVfbmFtZSwgaWNiLT5wb3J0X25hbWUsIFdXTl9TSVpFKTsKKwkJaWNiLT5ub2RlX25hbWVbMF0gJj0gMHhGMDsKKwl9CisKKwkvKgorCSAqIFNldCBob3N0IGFkYXB0ZXIgcGFyYW1ldGVycy4KKwkgKi8KKwloYS0+bnZyYW1fdmVyc2lvbiA9IG52LT5udnJhbV92ZXJzaW9uOworCisJaGEtPmZsYWdzLmRpc2FibGVfcmlzY19jb2RlX2xvYWQgPSAoKG52LT5ob3N0X3BbMF0gJiBCSVRfNCkgPyAxIDogMCk7CisJLyogQWx3YXlzIGxvYWQgUklTQyBjb2RlIG9uIG5vbiBJU1AyWzEyXTAwIGNoaXBzLiAqLworCWlmICghSVNfUUxBMjEwMChoYSkgJiYgIUlTX1FMQTIyMDAoaGEpKQorCQloYS0+ZmxhZ3MuZGlzYWJsZV9yaXNjX2NvZGVfbG9hZCA9IDA7CisJaGEtPmZsYWdzLmVuYWJsZV9saXBfcmVzZXQgPSAoKG52LT5ob3N0X3BbMV0gJiBCSVRfMSkgPyAxIDogMCk7CisJaGEtPmZsYWdzLmVuYWJsZV9saXBfZnVsbF9sb2dpbiA9ICgobnYtPmhvc3RfcFsxXSAmIEJJVF8yKSA/IDEgOiAwKTsKKwloYS0+ZmxhZ3MuZW5hYmxlX3RhcmdldF9yZXNldCA9ICgobnYtPmhvc3RfcFsxXSAmIEJJVF8zKSA/IDEgOiAwKTsKKwloYS0+ZmxhZ3MuZW5hYmxlX2xlZF9zY2hlbWUgPSAoKG52LT5lZmlfcGFyYW1ldGVycyAmIEJJVF8zKSA/IDEgOiAwKTsKKworCWhhLT5vcGVyYXRpbmdfbW9kZSA9CisJICAgIChpY2ItPmFkZF9maXJtd2FyZV9vcHRpb25zWzBdICYgKEJJVF82IHwgQklUXzUgfCBCSVRfNCkpID4+IDQ7CisKKwltZW1jcHkoaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9ucywgbnYtPnNlcmlhbGxpbmtfb3B0aW9ucywKKwkgICAgc2l6ZW9mKGhhLT5md19zZXJpYWxsaW5rX29wdGlvbnMpKTsKKworCS8qIHNhdmUgSEJBIHNlcmlhbCBudW1iZXIgKi8KKwloYS0+c2VyaWFsMCA9IGljYi0+cG9ydF9uYW1lWzVdOworCWhhLT5zZXJpYWwxID0gaWNiLT5wb3J0X25hbWVbNl07CisJaGEtPnNlcmlhbDIgPSBpY2ItPnBvcnRfbmFtZVs3XTsKKwltZW1jcHkoaGEtPm5vZGVfbmFtZSwgaWNiLT5ub2RlX25hbWUsIFdXTl9TSVpFKTsKKworCWljYi0+ZXhlY3V0aW9uX3Rocm90dGxlID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigweEZGRkYpOworCisJaGEtPnJldHJ5X2NvdW50ID0gbnYtPnJldHJ5X2NvdW50OworCisJLyogU2V0IG1pbmltdW0gbG9naW5fdGltZW91dCB0byA0IHNlY29uZHMuICovCisJaWYgKG52LT5sb2dpbl90aW1lb3V0IDwgcWwyeGxvZ2ludGltZW91dCkKKwkJbnYtPmxvZ2luX3RpbWVvdXQgPSBxbDJ4bG9naW50aW1lb3V0OworCWlmIChudi0+bG9naW5fdGltZW91dCA8IDQpCisJCW52LT5sb2dpbl90aW1lb3V0ID0gNDsKKwloYS0+bG9naW5fdGltZW91dCA9IG52LT5sb2dpbl90aW1lb3V0OworCWljYi0+bG9naW5fdGltZW91dCA9IG52LT5sb2dpbl90aW1lb3V0OworCisJLyogU2V0IG1pbmltdW0gUkFUT1YgdG8gMjAwIHRlbnRocyBvZiBhIHNlY29uZC4gKi8KKwloYS0+cl9hX3RvdiA9IDIwMDsKKworCWhhLT5taW5pbXVtX3RpbWVvdXQgPQorCSAgICAoaGEtPmxvZ2luX3RpbWVvdXQgKiBoYS0+cmV0cnlfY291bnQpICsgbnYtPnBvcnRfZG93bl9yZXRyeV9jb3VudDsKKwloYS0+bG9vcF9yZXNldF9kZWxheSA9IG52LT5yZXNldF9kZWxheTsKKworCS8qIFdpbGwgZ2V0IHRoZSB2YWx1ZSBmcm9tIE5WUkFNLiAqLworCWhhLT5sb29wX2Rvd25fdGltZW91dCA9IExPT1BfRE9XTl9USU1FT1VUOworCisJLyogTGluayBEb3duIFRpbWVvdXQgPSAwOgorCSAqCisJICogCVdoZW4gUG9ydCBEb3duIHRpbWVyIGV4cGlyZXMgd2Ugd2lsbCBzdGFydCByZXR1cm5pbmcKKwkgKglJL08ncyB0byBPUyB3aXRoICJESURfTk9fQ09OTkVDVCIuCisJICoKKwkgKiBMaW5rIERvd24gVGltZW91dCAhPSAwOgorCSAqCisJICoJIFRoZSBkcml2ZXIgd2FpdHMgZm9yIHRoZSBsaW5rIHRvIGNvbWUgdXAgYWZ0ZXIgbGluayBkb3duCisJICoJIGJlZm9yZSByZXR1cm5pbmcgSS9PcyB0byBPUyB3aXRoICJESURfTk9fQ09OTkVDVCIuCisJICovCQkJCQkJCisJaWYgKG52LT5saW5rX2Rvd25fdGltZW91dCA9PSAwKSB7CisJCWhhLT5sb29wX2Rvd25fYWJvcnRfdGltZSA9CisJCSAgICAoTE9PUF9ET1dOX1RJTUUgLSBoYS0+bG9vcF9kb3duX3RpbWVvdXQpOworCX0gZWxzZSB7CisJCWhhLT5saW5rX2Rvd25fdGltZW91dCA9CSBudi0+bGlua19kb3duX3RpbWVvdXQ7CisJCWhhLT5sb29wX2Rvd25fYWJvcnRfdGltZSA9CisJCSAgICAoTE9PUF9ET1dOX1RJTUUgLSBoYS0+bGlua19kb3duX3RpbWVvdXQpOworCX0gCisKKwloYS0+bWF4X2x1bnMgPSBNQVhfTFVOUzsKKwloYS0+bWF4X3Byb2JlX2x1bnMgPSBsZTE2X3RvX2NwdShudi0+bWF4X2x1bnNfcGVyX3RhcmdldCk7CisJaWYgKGhhLT5tYXhfcHJvYmVfbHVucyA9PSAwKQorCQloYS0+bWF4X3Byb2JlX2x1bnMgPSBNSU5fTFVOUzsKKworCS8qCisJICogTmVlZCBlbm91Z2ggdGltZSB0byB0cnkgYW5kIGdldCB0aGUgcG9ydCBiYWNrLgorCSAqLworCWhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgPSBudi0+cG9ydF9kb3duX3JldHJ5X2NvdW50OworCWlmIChxbHBvcnRfZG93bl9yZXRyeSkKKwkJaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudCA9IHFscG9ydF9kb3duX3JldHJ5OworCS8qIFNldCBsb2dpbl9yZXRyeV9jb3VudCAqLworCWhhLT5sb2dpbl9yZXRyeV9jb3VudCAgPSBudi0+cmV0cnlfY291bnQ7CisJaWYgKGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgPT0gbnYtPnBvcnRfZG93bl9yZXRyeV9jb3VudCAmJgorCSAgICBoYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50ID4gMykKKwkJaGEtPmxvZ2luX3JldHJ5X2NvdW50ID0gaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudDsKKwllbHNlIGlmIChoYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50ID4gKGludCloYS0+bG9naW5fcmV0cnlfY291bnQpCisJCWhhLT5sb2dpbl9yZXRyeV9jb3VudCA9IGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQ7CisJaWYgKHFsMnhsb2dpbnJldHJ5Y291bnQpCisJCWhhLT5sb2dpbl9yZXRyeV9jb3VudCA9IHFsMnhsb2dpbnJldHJ5Y291bnQ7CisKKwloYS0+YmluZGluZ190eXBlID0gQmluZDsKKwlpZiAoaGEtPmJpbmRpbmdfdHlwZSAhPSBCSU5EX0JZX1BPUlRfTkFNRSAmJgorCSAgICBoYS0+YmluZGluZ190eXBlICE9IEJJTkRfQllfUE9SVF9JRCkgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiSW52YWxpZCBiaW5kaW5nIHR5cGUgc3BlY2lmaWVkICglZCksICIKKwkJICAgICJkZWZhdWx0aW5nIHRvIEJJTkRfQllfUE9SVF9OQU1FISEhXG4iLCBoYS0+YmluZGluZ190eXBlKTsKKworCQloYS0+YmluZGluZ190eXBlID0gQklORF9CWV9QT1JUX05BTUU7CisJfQorCisJaWNiLT5sdW5fZW5hYmxlcyA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7CisJaWNiLT5jb21tYW5kX3Jlc291cmNlX2NvdW50ID0gMDsKKwlpY2ItPmltbWVkaWF0ZV9ub3RpZnlfcmVzb3VyY2VfY291bnQgPSAwOworCWljYi0+dGltZW91dCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7CisKKwlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpIHsKKwkJLyogRW5hYmxlIFJJTyAqLworCQlpY2ItPmZpcm13YXJlX29wdGlvbnNbMF0gJj0gfkJJVF8zOworCQlpY2ItPmFkZF9maXJtd2FyZV9vcHRpb25zWzBdICY9CisJCSAgICB+KEJJVF8zIHwgQklUXzIgfCBCSVRfMSB8IEJJVF8wKTsKKwkJaWNiLT5hZGRfZmlybXdhcmVfb3B0aW9uc1swXSB8PSBCSVRfMjsKKwkJaWNiLT5yZXNwb25zZV9hY2N1bXVsYXRpb25fdGltZXIgPSAzOworCQlpY2ItPmludGVycnVwdF9kZWxheV90aW1lciA9IDU7CisKKwkJaGEtPmZsYWdzLnByb2Nlc3NfcmVzcG9uc2VfcXVldWUgPSAxOworCX0gZWxzZSB7CisJCS8qIEVuYWJsZSBaSU8gLS0gU3VwcG9ydCBtb2RlIDUgb25seS4gKi8KKwkJdGltZXJfbW9kZSA9IGljYi0+YWRkX2Zpcm13YXJlX29wdGlvbnNbMF0gJgorCQkgICAgKEJJVF8zIHwgQklUXzIgfCBCSVRfMSB8IEJJVF8wKTsKKwkJaWNiLT5hZGRfZmlybXdhcmVfb3B0aW9uc1swXSAmPQorCQkgICAgfihCSVRfMyB8IEJJVF8yIHwgQklUXzEgfCBCSVRfMCk7CisJCWlmIChxbDJ4ZW5hYmxlemlvKQorCQkJdGltZXJfbW9kZSA9IEJJVF8yIHwgQklUXzA7CisJCWlmICh0aW1lcl9tb2RlID09IChCSVRfMiB8IEJJVF8wKSkgeworCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBaSU8gZW5hYmxlZDsgdGltZXIgZGVsYXkgIgorCQkJICAgICIoJWQpLlxuIiwgaGEtPmhvc3Rfbm8sIHFsMnhpbnRyZGVsYXl0aW1lcikpOworCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJICAgICJaSU8gZW5hYmxlZDsgdGltZXIgZGVsYXkgKCVkKS5cbiIsCisJCQkgICAgcWwyeGludHJkZWxheXRpbWVyKTsKKworCQkJaWNiLT5hZGRfZmlybXdhcmVfb3B0aW9uc1swXSB8PSB0aW1lcl9tb2RlOworCQkJaWNiLT5pbnRlcnJ1cHRfZGVsYXlfdGltZXIgPSBxbDJ4aW50cmRlbGF5dGltZXI7CisJCQloYS0+ZmxhZ3MucHJvY2Vzc19yZXNwb25zZV9xdWV1ZSA9IDE7CisJCX0KKwl9CisKKwlpZiAocnZhbCkgeworCQlERUJVRzJfMyhwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAic2NzaSglbGQpOiBOVlJBTSBjb25maWd1cmF0aW9uIGZhaWxlZCFcbiIsIGhhLT5ob3N0X25vKSk7CisJfQorCXJldHVybiAocnZhbCk7Cit9CisKKy8qCisqIHFsYTJ4MDBfaW5pdF90Z3RfbWFwCisqICAgICAgSW5pdGlhbGl6ZXMgdGFyZ2V0IG1hcC4KKyoKKyogSW5wdXQ6CisqICAgICAgaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisqCisqIE91dHB1dDoKKyogICAgICBUR1RfUSBpbml0aWFsaXplZAorKi8KK3N0YXRpYyB2b2lkCitxbGEyeDAwX2luaXRfdGd0X21hcChzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCXVpbnQzMl90IHQ7CisKKwlmb3IgKHQgPSAwOyB0IDwgTUFYX1RBUkdFVFM7IHQrKykKKwkJVEdUX1EoaGEsIHQpID0gKG9zX3RndF90ICopTlVMTDsKK30KKworLyoqCisgKiBxbGEyeDAwX2FsbG9jX2ZjcG9ydCgpIC0gQWxsb2NhdGUgYSBnZW5lcmljIGZjcG9ydC4KKyAqIEBoYTogSEEgY29udGV4dAorICogQGZsYWdzOiBhbGxvY2F0aW9uIGZsYWdzCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBmY3BvcnQsIG9yIE5VTEwsIGlmIG5vbmUgYXZhaWxhYmxlLgorICovCitmY19wb3J0X3QgKgorcWxhMngwMF9hbGxvY19mY3BvcnQoc2NzaV9xbGFfaG9zdF90ICpoYSwgaW50IGZsYWdzKQoreworCWZjX3BvcnRfdCAqZmNwb3J0OworCisJZmNwb3J0ID0ga21hbGxvYyhzaXplb2YoZmNfcG9ydF90KSwgZmxhZ3MpOworCWlmIChmY3BvcnQgPT0gTlVMTCkKKwkJcmV0dXJuIChmY3BvcnQpOworCisJLyogU2V0dXAgZmNwb3J0IHRlbXBsYXRlIHN0cnVjdHVyZS4gKi8KKwltZW1zZXQoZmNwb3J0LCAwLCBzaXplb2YgKGZjX3BvcnRfdCkpOworCWZjcG9ydC0+aGEgPSBoYTsKKwlmY3BvcnQtPnBvcnRfdHlwZSA9IEZDVF9VTktOT1dOOworCWZjcG9ydC0+bG9vcF9pZCA9IEZDX05PX0xPT1BfSUQ7CisJZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgPSBJT0RFU0NfSU5WQUxJRF9JTkRFWDsKKwlhdG9taWNfc2V0KCZmY3BvcnQtPnN0YXRlLCBGQ1NfVU5DT05GSUdVUkVEKTsKKwlmY3BvcnQtPmZsYWdzID0gRkNGX1JMQ19TVVBQT1JUOworCUlOSVRfTElTVF9IRUFEKCZmY3BvcnQtPmZjbHVucyk7CisKKwlyZXR1cm4gKGZjcG9ydCk7Cit9CisKKy8qCisgKiBxbGEyeDAwX2NvbmZpZ3VyZV9sb29wCisgKiAgICAgIFVwZGF0ZXMgRmlicmUgQ2hhbm5lbCBEZXZpY2UgRGF0YWJhc2Ugd2l0aCB3aGF0IGlzIGFjdHVhbGx5IG9uIGxvb3AuCisgKgorICogSW5wdXQ6CisgKiAgICAgIGhhICAgICAgICAgICAgICAgID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgIDAgPSBzdWNjZXNzLgorICogICAgICAxID0gZXJyb3IuCisgKiAgICAgIDIgPSBkYXRhYmFzZSB3YXMgZnVsbCBhbmQgZGV2aWNlIHdhcyBub3QgY29uZmlndXJlZC4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9jb25maWd1cmVfbG9vcChzY3NpX3FsYV9ob3N0X3QgKmhhKSAKK3sKKwlpbnQgIHJ2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFncywgc2F2ZV9mbGFnczsKKworCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKKworCS8qIEdldCBJbml0aWF0b3IgSUQgKi8KKwlpZiAodGVzdF9iaXQoTE9DQUxfTE9PUF9VUERBVEUsICZoYS0+ZHBjX2ZsYWdzKSkgeworCQlydmFsID0gcWxhMngwMF9jb25maWd1cmVfaGJhKGhhKTsKKwkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBVbmFibGUgdG8gY29uZmlndXJlIEhCQS5cbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJCXJldHVybiAocnZhbCk7CisJCX0KKwl9CisKKwlzYXZlX2ZsYWdzID0gZmxhZ3MgPSBoYS0+ZHBjX2ZsYWdzOworCURFQlVHKHByaW50aygic2NzaSglbGQpOiBDb25maWd1cmUgbG9vcCAtLSBkcGMgZmxhZ3MgPTB4JWx4XG4iLAorCSAgICBoYS0+aG9zdF9ubywgZmxhZ3MpKTsKKworCS8qCisJICogSWYgd2UgaGF2ZSBib3RoIGFuIFJTQ04gYW5kIFBPUlQgVVBEQVRFIHBlbmRpbmcgdGhlbiBoYW5kbGUgdGhlbQorCSAqIGJvdGggYXQgdGhlIHNhbWUgdGltZS4KKwkgKi8KKwljbGVhcl9iaXQoTE9DQUxfTE9PUF9VUERBVEUsICZoYS0+ZHBjX2ZsYWdzKTsKKwljbGVhcl9iaXQoUlNDTl9VUERBVEUsICZoYS0+ZHBjX2ZsYWdzKTsKKwloYS0+bWVtX2VyciA9IDAgOworCisJLyogRGV0ZXJtaW5lIHdoYXQgd2UgbmVlZCB0byBkbyAqLworCWlmIChoYS0+Y3VycmVudF90b3BvbG9neSA9PSBJU1BfQ0ZHX0ZMICYmCisJICAgICh0ZXN0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJmZsYWdzKSkpIHsKKworCQloYS0+ZmxhZ3MucnNjbl9xdWV1ZV9vdmVyZmxvdyA9IDE7CisJCXNldF9iaXQoUlNDTl9VUERBVEUsICZmbGFncyk7CisKKwl9IGVsc2UgaWYgKGhhLT5jdXJyZW50X3RvcG9sb2d5ID09IElTUF9DRkdfRiAmJgorCSAgICAodGVzdF9iaXQoTE9DQUxfTE9PUF9VUERBVEUsICZmbGFncykpKSB7CisKKwkJaGEtPmZsYWdzLnJzY25fcXVldWVfb3ZlcmZsb3cgPSAxOworCQlzZXRfYml0KFJTQ05fVVBEQVRFLCAmZmxhZ3MpOworCQljbGVhcl9iaXQoTE9DQUxfTE9PUF9VUERBVEUsICZmbGFncyk7CisKKwl9IGVsc2UgaWYgKCFoYS0+ZmxhZ3Mub25saW5lIHx8CisJICAgICh0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmZmxhZ3MpKSkgeworCisJCWhhLT5mbGFncy5yc2NuX3F1ZXVlX292ZXJmbG93ID0gMTsKKwkJc2V0X2JpdChSU0NOX1VQREFURSwgJmZsYWdzKTsKKwkJc2V0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJmZsYWdzKTsKKwl9CisKKwlpZiAodGVzdF9iaXQoTE9DQUxfTE9PUF9VUERBVEUsICZmbGFncykpIHsKKwkJaWYgKHRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSB7CisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJfSBlbHNlIHsKKwkJCXJ2YWwgPSBxbGEyeDAwX2NvbmZpZ3VyZV9sb2NhbF9sb29wKGhhKTsKKwkJfQorCX0KKworCWlmIChydmFsID09IFFMQV9TVUNDRVNTICYmIHRlc3RfYml0KFJTQ05fVVBEQVRFLCAmZmxhZ3MpKSB7CisJCWlmICh0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkgeworCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCX0gZWxzZSB7CisJCQlydmFsID0gcWxhMngwMF9jb25maWd1cmVfZmFicmljKGhhKTsKKwkJfQorCX0KKworCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CisJCWlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3BfZG93bl90aW1lcikgfHwKKwkJICAgIHRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSB7CisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJfSBlbHNlIHsKKwkJCXFsYTJ4MDBfY29uZmlnX29zKGhhKTsKKwkJCWF0b21pY19zZXQoJmhhLT5sb29wX3N0YXRlLCBMT09QX1JFQURZKTsKKworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IExPT1AgUkVBRFlcbiIsIGhhLT5ob3N0X25vKSk7CisJCX0KKwl9CisKKwlpZiAocnZhbCkgeworCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6ICoqKiBGQUlMRUQgKioqXG4iLAorCQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJfSBlbHNlIHsKKwkJREVCVUczKHByaW50aygiJXM6IGV4aXRpbmcgbm9ybWFsbHlcbiIsIF9fZnVuY19fKSk7CisJfQorCisJLyogUmVzdG9yZSBzdGF0ZSBpZiBhIHJlc3luYyBldmVudCBvY2N1cmVkIGR1cmluZyBwcm9jZXNzaW5nICovCisJaWYgKHRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSB7CisJCWlmICh0ZXN0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJnNhdmVfZmxhZ3MpKQorCQkJc2V0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJmhhLT5kcGNfZmxhZ3MpOworCQlpZiAodGVzdF9iaXQoUlNDTl9VUERBVEUsICZzYXZlX2ZsYWdzKSkKKwkJCXNldF9iaXQoUlNDTl9VUERBVEUsICZoYS0+ZHBjX2ZsYWdzKTsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisKKworLyoKKyAqIHFsYTJ4MDBfY29uZmlndXJlX2xvY2FsX2xvb3AKKyAqCVVwZGF0ZXMgRmlicmUgQ2hhbm5lbCBEZXZpY2UgRGF0YWJhc2Ugd2l0aCBsb2NhbCBsb29wIGRldmljZXMuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCisgKiBSZXR1cm5zOgorICoJMCA9IHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfY29uZmlndXJlX2xvY2FsX2xvb3Aoc2NzaV9xbGFfaG9zdF90ICpoYSkgCit7CisJaW50CQlydmFsLCBydmFsMjsKKwlpbnQJCWZvdW5kX2RldnM7CisJaW50CQlmb3VuZDsKKwlmY19wb3J0X3QJKmZjcG9ydCwgKm5ld19mY3BvcnQ7CisKKwl1aW50MTZfdAlpbmRleDsKKwl1aW50MTZfdAllbnRyaWVzOworCWNoYXIJCSppZF9pdGVyOworCXVpbnQxNl90CWxvb3BfaWQ7CisJdWludDhfdAkJZG9tYWluLCBhcmVhLCBhbF9wYTsKKworCWZvdW5kX2RldnMgPSAwOworCW5ld19mY3BvcnQgPSBOVUxMOworCWVudHJpZXMgPSBNQVhfRklCUkVfREVWSUNFUzsKKworCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogR2V0dGluZyBGQ0FMIHBvc2l0aW9uIG1hcFxuIiwgaGEtPmhvc3Rfbm8pKTsKKwlERUJVRzMocWxhMngwMF9nZXRfZmNhbF9wb3NpdGlvbl9tYXAoaGEsIE5VTEwpKTsKKworCS8qIEdldCBsaXN0IG9mIGxvZ2dlZCBpbiBkZXZpY2VzLiAqLworCW1lbXNldChoYS0+Z2lkX2xpc3QsIDAsIEdJRF9MSVNUX1NJWkUpOworCXJ2YWwgPSBxbGEyeDAwX2dldF9pZF9saXN0KGhhLCBoYS0+Z2lkX2xpc3QsIGhhLT5naWRfbGlzdF9kbWEsCisJICAgICZlbnRyaWVzKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKKwkJZ290byBjbGVhbnVwX2FsbG9jYXRpb247CisKKwlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IEVudHJpZXMgaW4gSUQgbGlzdCAoJWQpXG4iLAorCSAgICBoYS0+aG9zdF9ubywgZW50cmllcykpOworCURFQlVHMyhxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopaGEtPmdpZF9saXN0LAorCSAgICBlbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBnaWRfbGlzdF9pbmZvKSkpOworCisJLyogQWxsb2NhdGUgdGVtcG9yYXJ5IGZjcG9ydCBmb3IgYW55IG5ldyBmY3BvcnRzIGRpc2NvdmVyZWQuICovCisJbmV3X2ZjcG9ydCA9IHFsYTJ4MDBfYWxsb2NfZmNwb3J0KGhhLCBHRlBfS0VSTkVMKTsKKwlpZiAobmV3X2ZjcG9ydCA9PSBOVUxMKSB7CisJCXJ2YWwgPSBRTEFfTUVNT1JZX0FMTE9DX0ZBSUxFRDsKKwkJZ290byBjbGVhbnVwX2FsbG9jYXRpb247CisJfQorCW5ld19mY3BvcnQtPmZsYWdzICY9IH5GQ0ZfRkFCUklDX0RFVklDRTsKKworCS8qCisJICogTWFyayBsb2NhbCBkZXZpY2VzIHRoYXQgd2VyZSBwcmVzZW50IHdpdGggRkNGX0RFVklDRV9MT1NUIGZvciBub3cuCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZoYS0+ZmNwb3J0cywgbGlzdCkgeworCQlpZiAoYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpID09IEZDU19PTkxJTkUgJiYKKwkJICAgIGZjcG9ydC0+cG9ydF90eXBlICE9IEZDVF9CUk9BRENBU1QgJiYKKwkJICAgIChmY3BvcnQtPmZsYWdzICYgRkNGX0ZBQlJJQ19ERVZJQ0UpID09IDApIHsKKworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IE1hcmtpbmcgcG9ydCBsb3N0LCAiCisJCQkgICAgImxvb3BfaWQ9MHglMDR4XG4iLAorCQkJICAgIGhhLT5ob3N0X25vLCBmY3BvcnQtPmxvb3BfaWQpKTsKKworCQkJYXRvbWljX3NldCgmZmNwb3J0LT5zdGF0ZSwgRkNTX0RFVklDRV9MT1NUKTsKKwkJCWZjcG9ydC0+ZmxhZ3MgJj0gfkZDRl9GQVJQX0RPTkU7CisJCX0KKwl9CisKKwkvKiBBZGQgZGV2aWNlcyB0byBwb3J0IGxpc3QuICovCisJaWRfaXRlciA9IChjaGFyICopaGEtPmdpZF9saXN0OworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGVudHJpZXM7IGluZGV4KyspIHsKKwkJZG9tYWluID0gKChzdHJ1Y3QgZ2lkX2xpc3RfaW5mbyAqKWlkX2l0ZXIpLT5kb21haW47CisJCWFyZWEgPSAoKHN0cnVjdCBnaWRfbGlzdF9pbmZvICopaWRfaXRlciktPmFyZWE7CisJCWFsX3BhID0gKChzdHJ1Y3QgZ2lkX2xpc3RfaW5mbyAqKWlkX2l0ZXIpLT5hbF9wYTsKKwkJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKSB7CisJCQlsb29wX2lkID0gKHVpbnQxNl90KQorCQkJICAgICgoc3RydWN0IGdpZF9saXN0X2luZm8gKilpZF9pdGVyKS0+bG9vcF9pZF8yMTAwOworCQkJaWRfaXRlciArPSA0OworCQl9IGVsc2UgeworCQkJbG9vcF9pZCA9IGxlMTZfdG9fY3B1KAorCQkJICAgICgoc3RydWN0IGdpZF9saXN0X2luZm8gKilpZF9pdGVyKS0+bG9vcF9pZCk7CisJCQlpZF9pdGVyICs9IDY7CisJCX0KKworCQkvKiBCeXBhc3MgcmVzZXJ2ZWQgZG9tYWluIGZpZWxkcy4gKi8KKwkJaWYgKChkb21haW4gJiAweGYwKSA9PSAweGYwKQorCQkJY29udGludWU7CisKKwkJLyogQnlwYXNzIGlmIG5vdCBzYW1lIGRvbWFpbiBhbmQgYXJlYSBvZiBhZGFwdGVyLiAqLworCQlpZiAoYXJlYSAhPSBoYS0+ZF9pZC5iLmFyZWEgfHwgZG9tYWluICE9IGhhLT5kX2lkLmIuZG9tYWluKQorCQkJY29udGludWU7CisKKwkJLyogQnlwYXNzIGludmFsaWQgbG9jYWwgbG9vcCBJRC4gKi8KKwkJaWYgKGxvb3BfaWQgPiBMQVNUX0xPQ0FMX0xPT1BfSUQpCisJCQljb250aW51ZTsKKworCQkvKiBGaWxsIGluIG1lbWJlciBkYXRhLiAqLworCQluZXdfZmNwb3J0LT5kX2lkLmIuZG9tYWluID0gZG9tYWluOworCQluZXdfZmNwb3J0LT5kX2lkLmIuYXJlYSA9IGFyZWE7CisJCW5ld19mY3BvcnQtPmRfaWQuYi5hbF9wYSA9IGFsX3BhOworCQluZXdfZmNwb3J0LT5sb29wX2lkID0gbG9vcF9pZDsKKwkJcnZhbDIgPSBxbGEyeDAwX2dldF9wb3J0X2RhdGFiYXNlKGhhLCBuZXdfZmNwb3J0LCAwKTsKKwkJaWYgKHJ2YWwyICE9IFFMQV9TVUNDRVNTKSB7CisJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEZhaWxlZCB0byByZXRyaWV2ZSBmY3BvcnQgIgorCQkJICAgICJpbmZvcm1hdGlvbiAtLSBnZXRfcG9ydF9kYXRhYmFzZT0leCwgIgorCQkJICAgICJsb29wX2lkPTB4JTA0eFxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgcnZhbDIsIG5ld19mY3BvcnQtPmxvb3BfaWQpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogQ2hlY2sgZm9yIG1hdGNoaW5nIGRldmljZSBpbiBwb3J0IGxpc3QuICovCisJCWZvdW5kID0gMDsKKwkJZmNwb3J0ID0gTlVMTDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZoYS0+ZmNwb3J0cywgbGlzdCkgeworCQkJaWYgKG1lbWNtcChuZXdfZmNwb3J0LT5wb3J0X25hbWUsIGZjcG9ydC0+cG9ydF9uYW1lLAorCQkJICAgIFdXTl9TSVpFKSkKKwkJCQljb250aW51ZTsKKworCQkJZmNwb3J0LT5mbGFncyAmPSB+KEZDRl9GQUJSSUNfREVWSUNFIHwKKwkJCSAgICBGQ0ZfUEVSU0lTVEVOVF9CT1VORCk7CisJCQlmY3BvcnQtPmxvb3BfaWQgPSBuZXdfZmNwb3J0LT5sb29wX2lkOworCQkJZmNwb3J0LT5wb3J0X3R5cGUgPSBuZXdfZmNwb3J0LT5wb3J0X3R5cGU7CisJCQlmY3BvcnQtPmRfaWQuYjI0ID0gbmV3X2ZjcG9ydC0+ZF9pZC5iMjQ7CisJCQltZW1jcHkoZmNwb3J0LT5ub2RlX25hbWUsIG5ld19mY3BvcnQtPm5vZGVfbmFtZSwKKwkJCSAgICBXV05fU0laRSk7CisKKwkJCWZvdW5kKys7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghZm91bmQpIHsKKwkJCS8qIE5ldyBkZXZpY2UsIGFkZCB0byBmY3BvcnRzIGxpc3QuICovCisJCQluZXdfZmNwb3J0LT5mbGFncyAmPSB+RkNGX1BFUlNJU1RFTlRfQk9VTkQ7CisJCQlsaXN0X2FkZF90YWlsKCZuZXdfZmNwb3J0LT5saXN0LCAmaGEtPmZjcG9ydHMpOworCisJCQkvKiBBbGxvY2F0ZSBhIG5ldyByZXBsYWNlbWVudCBmY3BvcnQuICovCisJCQlmY3BvcnQgPSBuZXdfZmNwb3J0OworCQkJbmV3X2ZjcG9ydCA9IHFsYTJ4MDBfYWxsb2NfZmNwb3J0KGhhLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChuZXdfZmNwb3J0ID09IE5VTEwpIHsKKwkJCQlydmFsID0gUUxBX01FTU9SWV9BTExPQ19GQUlMRUQ7CisJCQkJZ290byBjbGVhbnVwX2FsbG9jYXRpb247CisJCQl9CisJCQluZXdfZmNwb3J0LT5mbGFncyAmPSB+RkNGX0ZBQlJJQ19ERVZJQ0U7CisJCX0KKworCQlxbGEyeDAwX3VwZGF0ZV9mY3BvcnQoaGEsIGZjcG9ydCk7CisKKwkJZm91bmRfZGV2cysrOworCX0KKworY2xlYW51cF9hbGxvY2F0aW9uOgorCWlmIChuZXdfZmNwb3J0KQorCQlrZnJlZShuZXdfZmNwb3J0KTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQ29uZmlndXJlIGxvY2FsIGxvb3AgZXJyb3IgZXhpdDogIgorCQkgICAgInJ2YWw9JXhcbiIsIGhhLT5ob3N0X25vLCBydmFsKSk7CisJfQorCisJaWYgKGZvdW5kX2RldnMpIHsKKwkJaGEtPmRldmljZV9mbGFncyB8PSBERkxHX0xPQ0FMX0RFVklDRVM7CisJCWhhLT5kZXZpY2VfZmxhZ3MgJj0gfkRGTEdfUkVUUllfTE9DQUxfREVWSUNFUzsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCitzdGF0aWMgdm9pZAorcWxhMngwMF9wcm9iZV9mb3JfYWxsX2x1bnMoc2NzaV9xbGFfaG9zdF90ICpoYSkgCit7CisJZmNfcG9ydF90CSpmY3BvcnQ7CisKKwlxbGEyeDAwX21hcmtfYWxsX2RldmljZXNfbG9zdChoYSk7IAorIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJmhhLT5mY3BvcnRzLCBsaXN0KSB7CisJCWlmIChmY3BvcnQtPnBvcnRfdHlwZSAhPSBGQ1RfVEFSR0VUKQorCQkJY29udGludWU7CisKKwkJcWxhMngwMF91cGRhdGVfZmNwb3J0KGhhLCBmY3BvcnQpOyAKKwl9Cit9CisKKy8qCisgKiBxbGEyeDAwX3VwZGF0ZV9mY3BvcnQKKyAqCVVwZGF0ZXMgZGV2aWNlIG9uIGxpc3QuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCWZjcG9ydCA9IHBvcnQgc3RydWN0dXJlIHBvaW50ZXIuCisgKgorICogUmV0dXJuOgorICoJMCAgLSBTdWNjZXNzCisgKiAgQklUXzAgLSBlcnJvcgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfdXBkYXRlX2ZjcG9ydChzY3NpX3FsYV9ob3N0X3QgKmhhLCBmY19wb3J0X3QgKmZjcG9ydCkKK3sKKwl1aW50MTZfdAlpbmRleDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNyYl90ICpzcDsKKworCWZjcG9ydC0+aGEgPSBoYTsKKwlmY3BvcnQtPmxvZ2luX3JldHJ5ID0gMDsKKwlmY3BvcnQtPnBvcnRfbG9naW5fcmV0cnlfY291bnQgPSBoYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50ICoKKwkgICAgUE9SVF9SRVRSWV9USU1FOworCWF0b21pY19zZXQoJmZjcG9ydC0+cG9ydF9kb3duX3RpbWVyLCBoYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50ICoKKwkgICAgUE9SVF9SRVRSWV9USU1FKTsKKwlmY3BvcnQtPmZsYWdzICY9IH5GQ0ZfTE9HSU5fTkVFREVEOworCisJLyoKKwkgKiBDaGVjayBmb3Igb3V0c3RhbmRpbmcgY21kIG9uIHRhcGUgQnlwYXNzIExVTiBkaXNjb3ZlcnkgaWYgYWN0aXZlCisJICogY29tbWFuZCBvbiB0YXBlLgorCSAqLworCWlmIChmY3BvcnQtPmZsYWdzICYgRkNGX1RBUEVfUFJFU0VOVCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwkJZm9yIChpbmRleCA9IDE7IGluZGV4IDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTOyBpbmRleCsrKSB7CisJCQlpZiAoKHNwID0gaGEtPm91dHN0YW5kaW5nX2NtZHNbaW5kZXhdKSAhPSAwKSB7CisJCQkJaWYgKHNwLT5mY2x1bi0+ZmNwb3J0ID09IGZjcG9ydCkgeworCQkJCQlhdG9taWNfc2V0KCZmY3BvcnQtPnN0YXRlLCBGQ1NfT05MSU5FKTsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKKwkJCQkJICAgICZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJfQorCisJLyogRG8gTFVOIGRpc2NvdmVyeS4gKi8KKwlpZiAoZmNwb3J0LT5wb3J0X3R5cGUgPT0gRkNUX0lOSVRJQVRPUiB8fAorCSAgICBmY3BvcnQtPnBvcnRfdHlwZSA9PSBGQ1RfQlJPQURDQVNUKSB7CisJCWZjcG9ydC0+ZGV2aWNlX3R5cGUgPSBUWVBFX1BST0NFU1NPUjsKKwl9IGVsc2UgeworCQlxbGEyeDAwX2x1bl9kaXNjb3ZlcnkoaGEsIGZjcG9ydCk7CisJfQorCWF0b21pY19zZXQoJmZjcG9ydC0+c3RhdGUsIEZDU19PTkxJTkUpOworfQorCisvKgorICogcWxhMngwMF9sdW5fZGlzY292ZXJ5CisgKglJc3N1ZSBTQ1NJIGlucXVpcnkgY29tbWFuZCBmb3IgTFVOIGRpc2NvdmVyeS4KKyAqCisgKiBJbnB1dDoKKyAqCWhhOgkJYWRhcHRlciBzdGF0ZSBwb2ludGVyLgorICoJZmNwb3J0OgkJRkMgcG9ydCBzdHJ1Y3R1cmUgcG9pbnRlci4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK3N0YXRpYyB2b2lkCitxbGEyeDAwX2x1bl9kaXNjb3Zlcnkoc2NzaV9xbGFfaG9zdF90ICpoYSwgZmNfcG9ydF90ICpmY3BvcnQpCit7CisJaW5xX2NtZF9yc3BfdAkqaW5xOworCWRtYV9hZGRyX3QJaW5xX2RtYTsKKwl1aW50MTZfdAlsdW47CisKKwlpbnEgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwgJmlucV9kbWEpOworCWlmIChpbnEgPT0gTlVMTCkgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIC0gSU5RXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFsd2F5cyBhZGQgYSBmY19sdW5fdCBzdHJ1Y3R1cmUgZm9yIGx1biAwIC0tIG1pZC1sYXllciByZXF1aXJlbWVudCAqLworCXFsYTJ4MDBfYWRkX2x1bihmY3BvcnQsIDApOworCisJLyogSWYgcmVwb3J0IExVTiB3b3JrcywgZXhpdC4gKi8KKwlpZiAocWxhMngwMF9ycHRfbHVuX2Rpc2NvdmVyeShoYSwgZmNwb3J0LCBpbnEsIGlucV9kbWEpICE9CisJICAgIFFMQV9TVUNDRVNTKSB7CisJCWZvciAobHVuID0gMDsgbHVuIDwgaGEtPm1heF9wcm9iZV9sdW5zOyBsdW4rKykgeworCQkJLyogQ29uZmlndXJlIExVTi4gKi8KKwkJCXFsYTJ4MDBfY2ZnX2x1bihoYSwgZmNwb3J0LCBsdW4sIGlucSwgaW5xX2RtYSk7CisJCX0KKwl9CisKKwlkbWFfcG9vbF9mcmVlKGhhLT5zX2RtYV9wb29sLCBpbnEsIGlucV9kbWEpOworfQorCisvKgorICogcWxhMngwMF9ycHRfbHVuX2Rpc2NvdmVyeQorICoJSXNzdWUgU0NTSSByZXBvcnQgTFVOIGNvbW1hbmQgZm9yIExVTiBkaXNjb3ZlcnkuCisgKgorICogSW5wdXQ6CisgKgloYToJCWFkYXB0ZXIgc3RhdGUgcG9pbnRlci4KKyAqCWZjcG9ydDoJCUZDIHBvcnQgc3RydWN0dXJlIHBvaW50ZXIuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9ycHRfbHVuX2Rpc2NvdmVyeShzY3NpX3FsYV9ob3N0X3QgKmhhLCBmY19wb3J0X3QgKmZjcG9ydCwKKyAgICBpbnFfY21kX3JzcF90ICppbnEsIGRtYV9hZGRyX3QgaW5xX2RtYSkKK3sKKwlpbnQJCQlydmFsOworCXVpbnQzMl90CQlsZW4sIGNudDsKKwl1aW50MTZfdAkJbHVuOworCisJLyogQXNzdW1lIGEgZmFpbGVkIHN0YXR1cyAqLworCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCisJLyogTm8gcG9pbnQgaW4gY29udGludWluZyBpZiB0aGUgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBSTEMgKi8KKwlpZiAoKGZjcG9ydC0+ZmxhZ3MgJiBGQ0ZfUkxDX1NVUFBPUlQpID09IDApCisJCXJldHVybiAocnZhbCk7CisKKwlydmFsID0gcWxhMngwMF9yZXBvcnRfbHVuKGhhLCBmY3BvcnQpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQorCQlyZXR1cm4gKHJ2YWwpOworCisJLyogQ29uZmlndXJlIExVTiBsaXN0LiAqLworCWxlbiA9IGJlMzJfdG9fY3B1KGhhLT5ybGNfcnNwLT5saXN0Lmhkci5sZW4pOworCWxlbiAvPSA4OworCWZvciAoY250ID0gMDsgY250IDwgbGVuOyBjbnQrKykgeworCQlsdW4gPSBDSEFSX1RPX1NIT1JUKGhhLT5ybGNfcnNwLT5saXN0LmxzdFtjbnRdLmxzYiwKKwkJICAgIGhhLT5ybGNfcnNwLT5saXN0LmxzdFtjbnRdLm1zYi5iKTsKKworCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IFJMQyBsdW4gPSAoJWQpXG4iLCBoYS0+aG9zdF9ubywgbHVuKSk7CisKKwkJLyogV2Ugb25seSBzdXBwb3J0IDAgdGhyb3VnaCBNQVhfTFVOUy0xIHJhbmdlICovCisJCWlmIChsdW4gPCBNQVhfTFVOUykgeworCQkJcWxhMngwMF9jZmdfbHVuKGhhLCBmY3BvcnQsIGx1biwgaW5xLCBpbnFfZG1hKTsKKwkJfQorCX0KKwlhdG9taWNfc2V0KCZmY3BvcnQtPnN0YXRlLCBGQ1NfT05MSU5FKTsKKworCXJldHVybiAocnZhbCk7Cit9CisKKy8qCisgKiBxbGEyeDAwX3JlcG9ydF9sdW4KKyAqCUlzc3VlIFNDU0kgcmVwb3J0IExVTiBjb21tYW5kLgorICoKKyAqIElucHV0OgorICoJaGE6CQlhZGFwdGVyIHN0YXRlIHBvaW50ZXIuCisgKglmY3BvcnQ6CQlGQyBwb3J0IHN0cnVjdHVyZSBwb2ludGVyLgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfcmVwb3J0X2x1bihzY3NpX3FsYV9ob3N0X3QgKmhhLCBmY19wb3J0X3QgKmZjcG9ydCkKK3sKKwlpbnQgcnZhbDsKKwl1aW50MTZfdCByZXRyaWVzOworCXVpbnQxNl90IGNvbXBfc3RhdHVzOworCXVpbnQxNl90IHNjc2lfc3RhdHVzOworCXJwdF9sdW5fY21kX3JzcF90ICpybGM7CisJZG1hX2FkZHJfdCBybGNfZG1hOworCisJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJcmxjID0gaGEtPnJsY19yc3A7CisJcmxjX2RtYSA9IGhhLT5ybGNfcnNwX2RtYTsKKworCWZvciAocmV0cmllcyA9IDM7IHJldHJpZXM7IHJldHJpZXMtLSkgeworCQltZW1zZXQocmxjLCAwLCBzaXplb2YocnB0X2x1bl9jbWRfcnNwX3QpKTsKKwkJcmxjLT5wLmNtZC5lbnRyeV90eXBlID0gQ09NTUFORF9BNjRfVFlQRTsKKwkJcmxjLT5wLmNtZC5lbnRyeV9jb3VudCA9IDE7CisJCVNFVF9UQVJHRVRfSUQoaGEsIHJsYy0+cC5jbWQudGFyZ2V0LCBmY3BvcnQtPmxvb3BfaWQpOworCQlybGMtPnAuY21kLmNvbnRyb2xfZmxhZ3MgPQorCQkgICAgX19jb25zdGFudF9jcHVfdG9fbGUxNihDRl9SRUFEIHwgQ0ZfU0lNUExFX1RBRyk7CisJCXJsYy0+cC5jbWQuc2NzaV9jZGJbMF0gPSBSRVBPUlRfTFVOUzsKKwkJcmxjLT5wLmNtZC5zY3NpX2NkYls4XSA9IE1TQihzaXplb2YocnB0X2x1bl9sc3RfdCkpOworCQlybGMtPnAuY21kLnNjc2lfY2RiWzldID0gTFNCKHNpemVvZihycHRfbHVuX2xzdF90KSk7CisJCXJsYy0+cC5jbWQuZHNlZ19jb3VudCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMSk7CisJCXJsYy0+cC5jbWQudGltZW91dCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMTApOworCQlybGMtPnAuY21kLmJ5dGVfY291bnQgPQorCQkgICAgX19jb25zdGFudF9jcHVfdG9fbGUzMihzaXplb2YocnB0X2x1bl9sc3RfdCkpOworCQlybGMtPnAuY21kLmRzZWdfMF9hZGRyZXNzWzBdID0gY3B1X3RvX2xlMzIoCisJCSAgICBMU0QocmxjX2RtYSArIHNpemVvZihzdHNfZW50cnlfdCkpKTsKKwkJcmxjLT5wLmNtZC5kc2VnXzBfYWRkcmVzc1sxXSA9IGNwdV90b19sZTMyKAorCQkgICAgTVNEKHJsY19kbWEgKyBzaXplb2Yoc3RzX2VudHJ5X3QpKSk7CisJCXJsYy0+cC5jbWQuZHNlZ18wX2xlbmd0aCA9CisJCSAgICBfX2NvbnN0YW50X2NwdV90b19sZTMyKHNpemVvZihycHRfbHVuX2xzdF90KSk7CisKKwkJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihoYSwgcmxjLCBybGNfZG1hLAorCQkgICAgc2l6ZW9mKHJwdF9sdW5fY21kX3JzcF90KSk7CisKKwkJY29tcF9zdGF0dXMgPSBsZTE2X3RvX2NwdShybGMtPnAucnNwLmNvbXBfc3RhdHVzKTsKKwkJc2NzaV9zdGF0dXMgPSBsZTE2X3RvX2NwdShybGMtPnAucnNwLnNjc2lfc3RhdHVzKTsKKworCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUyB8fCBjb21wX3N0YXR1cyAhPSBDU19DT01QTEVURSB8fAorCQkgICAgc2NzaV9zdGF0dXMgJiBTU19DSEVDS19DT05ESVRJT04pIHsKKworCQkJLyogRGV2aWNlIHVuZGVycnVuLCB0cmVhdCBhcyBPSy4gKi8KKwkJCWlmIChydmFsID09IFFMQV9TVUNDRVNTICYmCisJCQkgICAgY29tcF9zdGF0dXMgPT0gQ1NfREFUQV9VTkRFUlJVTiAmJgorCQkJICAgIHNjc2lfc3RhdHVzICYgU1NfUkVTSURVQUxfVU5ERVIpIHsKKworCQkJCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IFJMQyBmYWlsZWQgdG8gaXNzdWUgaW9jYiEgIgorCQkJICAgICJmY3BvcnQ9WyUwNHgvJXBdIHJ2YWw9JXggY3M9JXggc3M9JXhcbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8sIGZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LCBydmFsLAorCQkJICAgIGNvbXBfc3RhdHVzLCBzY3NpX3N0YXR1cykpOworCisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJCWlmIChzY3NpX3N0YXR1cyAmIFNTX0NIRUNLX0NPTkRJVElPTikgeworCQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUkxDICIKKwkJCQkgICAgIlNTX0NIRUNLX0NPTkRJVElPTiBTZW5zZSBEYXRhICIKKwkJCQkgICAgIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCQkgICAgaGEtPmhvc3Rfbm8sCisJCQkJICAgIHJsYy0+cC5yc3AucmVxX3NlbnNlX2RhdGFbMF0sCisJCQkJICAgIHJsYy0+cC5yc3AucmVxX3NlbnNlX2RhdGFbMV0sCisJCQkJICAgIHJsYy0+cC5yc3AucmVxX3NlbnNlX2RhdGFbMl0sCisJCQkJICAgIHJsYy0+cC5yc3AucmVxX3NlbnNlX2RhdGFbM10sCisJCQkJICAgIHJsYy0+cC5yc3AucmVxX3NlbnNlX2RhdGFbNF0sCisJCQkJICAgIHJsYy0+cC5yc3AucmVxX3NlbnNlX2RhdGFbNV0sCisJCQkJICAgIHJsYy0+cC5yc3AucmVxX3NlbnNlX2RhdGFbNl0sCisJCQkJICAgIHJsYy0+cC5yc3AucmVxX3NlbnNlX2RhdGFbN10pKTsKKwkJCQlpZiAocmxjLT5wLnJzcC5yZXFfc2Vuc2VfZGF0YVsyXSA9PQorCQkJCSAgICBJTExFR0FMX1JFUVVFU1QpIHsKKwkJCQkJZmNwb3J0LT5mbGFncyAmPSB+KEZDRl9STENfU1VQUE9SVCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworLyoKKyAqIHFsYTJ4MDBfY2ZnX2x1bgorICoJQ29uZmlndXJlcyBMVU4gaW50byBmY3BvcnQgTFVOIGxpc3QuCisgKgorICogSW5wdXQ6CisgKglmY3BvcnQ6CQlGQyBwb3J0IHN0cnVjdHVyZSBwb2ludGVyLgorICoJbHVuOgkJTFVOIG51bWJlci4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK3N0YXRpYyBmY19sdW5fdCAqCitxbGEyeDAwX2NmZ19sdW4oc2NzaV9xbGFfaG9zdF90ICpoYSwgZmNfcG9ydF90ICpmY3BvcnQsIHVpbnQxNl90IGx1biwKKyAgICBpbnFfY21kX3JzcF90ICppbnEsIGRtYV9hZGRyX3QgaW5xX2RtYSkgCit7CisJZmNfbHVuX3QgKmZjbHVuOworCXVpbnQ4X3QJICBkZXZpY2VfdHlwZTsKKworCS8qIEJ5cGFzcyBMVU5zIHRoYXQgZmFpbGVkLiAqLworCWlmIChxbGEyeDAwX2lucXVpcnkoaGEsIGZjcG9ydCwgbHVuLCBpbnEsIGlucV9kbWEpICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRmFpbGVkIGlucXVpcnkgLSBsb29wIGlkPTB4JTA0eCAiCisJCSAgICAibHVuPSVkXG4iLCBoYS0+aG9zdF9ubywgZmNwb3J0LT5sb29wX2lkLCBsdW4pKTsKKworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlkZXZpY2VfdHlwZSA9IChpbnEtPmlucVswXSAmIDB4MWYpOworCXN3aXRjaCAoZGV2aWNlX3R5cGUpIHsKKwljYXNlIFRZUEVfRElTSzoKKwljYXNlIFRZUEVfUFJPQ0VTU09SOgorCWNhc2UgVFlQRV9XT1JNOgorCWNhc2UgVFlQRV9ST006CisJY2FzZSBUWVBFX1NDQU5ORVI6CisJY2FzZSBUWVBFX01PRDoKKwljYXNlIFRZUEVfTUVESVVNX0NIQU5HRVI6CisJY2FzZSBUWVBFX0VOQ0xPU1VSRToKKwljYXNlIDB4MjA6CisJY2FzZSAweDBDOgorCQlicmVhazsKKwljYXNlIFRZUEVfVEFQRToKKwkJZmNwb3J0LT5mbGFncyB8PSBGQ0ZfVEFQRV9QUkVTRU5UOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFVuc3VwcG9ydGVkIGx1biB0eXBlIC0tICIKKwkJICAgICJsb29wIGlkPTB4JTA0eCBsdW49JWQgdHlwZT0leFxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBmY3BvcnQtPmxvb3BfaWQsIGx1biwgZGV2aWNlX3R5cGUpKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwlmY3BvcnQtPmRldmljZV90eXBlID0gZGV2aWNlX3R5cGU7CisJZmNsdW4gPSBxbGEyeDAwX2FkZF9sdW4oZmNwb3J0LCBsdW4pOworCisJaWYgKGZjbHVuICE9IE5VTEwpIHsKKwkJYXRvbWljX3NldCgmZmNwb3J0LT5zdGF0ZSwgRkNTX09OTElORSk7CisJfQorCisJcmV0dXJuIChmY2x1bik7Cit9CisKKy8qCisgKiBxbGEyeDAwX2FkZF9sdW4KKyAqCUFkZHMgTFVOIHRvIGRhdGFiYXNlCisgKgorICogSW5wdXQ6CisgKglmY3BvcnQ6CQlGQyBwb3J0IHN0cnVjdHVyZSBwb2ludGVyLgorICoJbHVuOgkJTFVOIG51bWJlci4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK3N0YXRpYyBmY19sdW5fdCAqCitxbGEyeDAwX2FkZF9sdW4oZmNfcG9ydF90ICpmY3BvcnQsIHVpbnQxNl90IGx1bikKK3sKKwlpbnQJCWZvdW5kOworCWZjX2x1bl90CSpmY2x1bjsKKworCWlmIChmY3BvcnQgPT0gTlVMTCkgeworCQlERUJVRyhwcmludGsoInNjc2k6IFVuYWJsZSB0byBhZGQgbHVuIHRvIE5VTEwgcG9ydFxuIikpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCS8qIEFsbG9jYXRlIExVTiBpZiBub3QgYWxyZWFkeSBhbGxvY2F0ZWQuICovCisJZm91bmQgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNsdW4sICZmY3BvcnQtPmZjbHVucywgbGlzdCkgeworCQlpZiAoZmNsdW4tPmx1biA9PSBsdW4pIHsKKwkJCWZvdW5kKys7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoZm91bmQpCisJCXJldHVybiAoTlVMTCk7CisKKwlmY2x1biA9IGttYWxsb2Moc2l6ZW9mKGZjX2x1bl90KSwgR0ZQX0FUT01JQyk7CisJaWYgKGZjbHVuID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgIiVzKCk6IE1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCAtIEZDTFVOXG4iLAorCQkgICAgX19mdW5jX18pOworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCS8qIFNldHVwIExVTiBzdHJ1Y3R1cmUuICovCisJbWVtc2V0KGZjbHVuLCAwLCBzaXplb2YoZmNfbHVuX3QpKTsKKwlmY2x1bi0+bHVuID0gbHVuOworCWZjbHVuLT5mY3BvcnQgPSBmY3BvcnQ7CisJZmNsdW4tPm9fZmNwb3J0ID0gZmNwb3J0OworCWZjbHVuLT5kZXZpY2VfdHlwZSA9IGZjcG9ydC0+ZGV2aWNlX3R5cGU7CisJYXRvbWljX3NldCgmZmNwb3J0LT5zdGF0ZSwgRkNTX1VOQ09ORklHVVJFRCk7CisKKwlsaXN0X2FkZF90YWlsKCZmY2x1bi0+bGlzdCwgJmZjcG9ydC0+ZmNsdW5zKTsKKworCXJldHVybiAoZmNsdW4pOworfQorCisvKgorICogcWxhMngwMF9pbnF1aXJ5CisgKglJc3N1ZSBTQ1NJIGlucXVpcnkgY29tbWFuZC4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJZmNwb3J0ID0gRkMgcG9ydCBzdHJ1Y3R1cmUgcG9pbnRlci4KKyAqCisgKiBSZXR1cm46CisgKgkwICAtIFN1Y2Nlc3MKKyAqICBCSVRfMCAtIGVycm9yCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX2lucXVpcnkoc2NzaV9xbGFfaG9zdF90ICpoYSwKKyAgICBmY19wb3J0X3QgKmZjcG9ydCwgdWludDE2X3QgbHVuLCBpbnFfY21kX3JzcF90ICppbnEsIGRtYV9hZGRyX3QgaW5xX2RtYSkKK3sKKwlpbnQgcnZhbDsKKwl1aW50MTZfdCByZXRyaWVzOworCXVpbnQxNl90IGNvbXBfc3RhdHVzOworCXVpbnQxNl90IHNjc2lfc3RhdHVzOworCisJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisKKwlmb3IgKHJldHJpZXMgPSAzOyByZXRyaWVzOyByZXRyaWVzLS0pIHsKKwkJbWVtc2V0KGlucSwgMCwgc2l6ZW9mKGlucV9jbWRfcnNwX3QpKTsKKwkJaW5xLT5wLmNtZC5lbnRyeV90eXBlID0gQ09NTUFORF9BNjRfVFlQRTsKKwkJaW5xLT5wLmNtZC5lbnRyeV9jb3VudCA9IDE7CisJCWlucS0+cC5jbWQubHVuID0gY3B1X3RvX2xlMTYobHVuKTsKKwkJU0VUX1RBUkdFVF9JRChoYSwgaW5xLT5wLmNtZC50YXJnZXQsIGZjcG9ydC0+bG9vcF9pZCk7CisJCWlucS0+cC5jbWQuY29udHJvbF9mbGFncyA9CisJCSAgICBfX2NvbnN0YW50X2NwdV90b19sZTE2KENGX1JFQUQgfCBDRl9TSU1QTEVfVEFHKTsKKwkJaW5xLT5wLmNtZC5zY3NpX2NkYlswXSA9IElOUVVJUlk7CisJCWlucS0+cC5jbWQuc2NzaV9jZGJbNF0gPSBJTlFfREFUQV9TSVpFOworCQlpbnEtPnAuY21kLmRzZWdfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDEpOworCQlpbnEtPnAuY21kLnRpbWVvdXQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDEwKTsKKwkJaW5xLT5wLmNtZC5ieXRlX2NvdW50ID0KKwkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSU5RX0RBVEFfU0laRSk7CisJCWlucS0+cC5jbWQuZHNlZ18wX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMigKKwkJICAgIExTRChpbnFfZG1hICsgc2l6ZW9mKHN0c19lbnRyeV90KSkpOworCQlpbnEtPnAuY21kLmRzZWdfMF9hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoCisJCSAgICBNU0QoaW5xX2RtYSArIHNpemVvZihzdHNfZW50cnlfdCkpKTsKKwkJaW5xLT5wLmNtZC5kc2VnXzBfbGVuZ3RoID0KKwkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSU5RX0RBVEFfU0laRSk7CisKKwkJREVCVUc1KHByaW50aygic2NzaSglbGQpOiBMdW4gSW5xdWlyeSAtIGZjcG9ydD1bJTA0eC8lcF0sIgorCQkgICAgIiBsdW4gKCVkKVxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBmY3BvcnQtPmxvb3BfaWQsIGZjcG9ydCwgbHVuKSk7CisKKwkJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihoYSwgaW5xLCBpbnFfZG1hLAorCQkgICAgc2l6ZW9mKGlucV9jbWRfcnNwX3QpKTsKKworCQljb21wX3N0YXR1cyA9IGxlMTZfdG9fY3B1KGlucS0+cC5yc3AuY29tcF9zdGF0dXMpOworCQlzY3NpX3N0YXR1cyA9IGxlMTZfdG9fY3B1KGlucS0+cC5yc3Auc2NzaV9zdGF0dXMpOworCisJCURFQlVHNShwcmludGsoInNjc2koJWxkKTogbHVuICglZCkgaW5xdWlyeSAtICIKKwkJICAgICJpbnFbMF09IDB4JXgsIGNvbXAgc3RhdHVzIDB4JXgsIHNjc2kgc3RhdHVzIDB4JXgsICIKKwkJICAgICJydmFsPSVkXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIGx1biwgaW5xLT5pbnFbMF0sIGNvbXBfc3RhdHVzLCBzY3NpX3N0YXR1cywKKwkJICAgIHJ2YWwpKTsKKworCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUyB8fCBjb21wX3N0YXR1cyAhPSBDU19DT01QTEVURSB8fAorCQkgICAgc2NzaV9zdGF0dXMgJiBTU19DSEVDS19DT05ESVRJT04pIHsKKworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IElOUSBmYWlsZWQgdG8gaXNzdWUgaW9jYiEgIgorCQkJICAgICJmY3BvcnQ9WyUwNHgvJXBdIHJ2YWw9JXggY3M9JXggc3M9JXhcbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8sIGZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LCBydmFsLAorCQkJICAgIGNvbXBfc3RhdHVzLCBzY3NpX3N0YXR1cykpOworCisJCQlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykKKwkJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKworCQkJaWYgKHNjc2lfc3RhdHVzICYgU1NfQ0hFQ0tfQ09ORElUSU9OKSB7CisJCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBJTlEgIgorCQkJCSAgICAiU1NfQ0hFQ0tfQ09ORElUSU9OIFNlbnNlIERhdGEgIgorCQkJCSAgICAiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJCSAgICBoYS0+aG9zdF9ubywKKwkJCQkgICAgaW5xLT5wLnJzcC5yZXFfc2Vuc2VfZGF0YVswXSwKKwkJCQkgICAgaW5xLT5wLnJzcC5yZXFfc2Vuc2VfZGF0YVsxXSwKKwkJCQkgICAgaW5xLT5wLnJzcC5yZXFfc2Vuc2VfZGF0YVsyXSwKKwkJCQkgICAgaW5xLT5wLnJzcC5yZXFfc2Vuc2VfZGF0YVszXSwKKwkJCQkgICAgaW5xLT5wLnJzcC5yZXFfc2Vuc2VfZGF0YVs0XSwKKwkJCQkgICAgaW5xLT5wLnJzcC5yZXFfc2Vuc2VfZGF0YVs1XSwKKwkJCQkgICAgaW5xLT5wLnJzcC5yZXFfc2Vuc2VfZGF0YVs2XSwKKwkJCQkgICAgaW5xLT5wLnJzcC5yZXFfc2Vuc2VfZGF0YVs3XSkpOworCQkJfQorCisJCQkvKiBEZXZpY2UgdW5kZXJydW4gZHJvcCBMVU4uICovCisJCQlpZiAoY29tcF9zdGF0dXMgPT0gQ1NfREFUQV9VTkRFUlJVTiAmJgorCQkJICAgIHNjc2lfc3RhdHVzICYgU1NfUkVTSURVQUxfVU5ERVIpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworCisvKgorICogcWxhMngwMF9jb25maWd1cmVfZmFicmljCisgKiAgICAgIFNldHVwIFNOUyBkZXZpY2VzIHdpdGggbG9vcCBJRCdzLgorICoKKyAqIElucHV0OgorICogICAgICBoYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICAwID0gc3VjY2Vzcy4KKyAqICAgICAgQklUXzAgPSBlcnJvcgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX2NvbmZpZ3VyZV9mYWJyaWMoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQJcnZhbCwgcnZhbDI7CisJZmNfcG9ydF90CSpmY3BvcnQsICpmY3B0ZW1wOworCXVpbnQxNl90CW5leHRfbG9vcGlkOworCXVpbnQxNl90CW1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOworCUxJU1RfSEVBRChuZXdfZmNwb3J0cyk7CisKKwkvKiBJZiBGTCBwb3J0IGV4aXN0cywgdGhlbiBTTlMgaXMgcHJlc2VudCAqLworCXJ2YWwgPSBxbGEyeDAwX2dldF9wb3J0X25hbWUoaGEsIFNOU19GTF9QT1JULCBOVUxMLCAwKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IE1CQ19HRVRfUE9SVF9OQU1FIEZhaWxlZCwgTm8gRkwgIgorCQkgICAgIlBvcnRcbiIsIGhhLT5ob3N0X25vKSk7CisKKwkJaGEtPmRldmljZV9mbGFncyAmPSB+U1dJVENIX0ZPVU5EOworCQlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKKwl9CisKKwkvKiBNYXJrIGRldmljZXMgdGhhdCBuZWVkIHJlLXN5bmNocm9uaXphdGlvbi4gKi8KKwlydmFsMiA9IHFsYTJ4MDBfZGV2aWNlX3Jlc3luYyhoYSk7CisJaWYgKHJ2YWwyID09IFFMQV9SU0NOU19IQU5ETEVEKSB7CisJCS8qIE5vIHBvaW50IGRvaW5nIHRoZSBzY2FuLCBqdXN0IGNvbnRpbnVlLiAqLworCQlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKKwl9CisJZG8geworCQkvKiBFbnN1cmUgd2UgYXJlIGxvZ2dlZCBpbnRvIHRoZSBTTlMuICovCisJCXFsYTJ4MDBfbG9naW5fZmFicmljKGhhLCBTSU1QTEVfTkFNRV9TRVJWRVIsIDB4ZmYsIDB4ZmYsIDB4ZmMsCisJCSAgICBtYiwgQklUXzEgfCBCSVRfMCk7CisJCWlmIChtYlswXSAhPSBNQlNfQ09NTUFORF9DT01QTEVURSkgeworCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCSAgICAiRmFpbGVkIFNOUyBsb2dpbjogbG9vcF9pZD0leCBtYlswXT0leCBtYlsxXT0leCAiCisJCQkgICAgIm1iWzJdPSV4IG1iWzZdPSV4IG1iWzddPSV4XG4iLCBTSU1QTEVfTkFNRV9TRVJWRVIsCisJCQkgICAgbWJbMF0sIG1iWzFdLCBtYlsyXSwgbWJbNl0sIG1iWzddKSk7CisJCQlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKKwkJfQorCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUkVHSVNURVJfRkM0X05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSB7CisJCQlpZiAocWxhMngwMF9yZnRfaWQoaGEpKSB7CisJCQkJLyogRU1QVFkgKi8KKwkJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJlZ2lzdGVyIEZDLTQgIgorCQkJCSAgICAiVFlQRSBmYWlsZWQuXG4iLCBoYS0+aG9zdF9ubykpOworCQkJfQorCQkJaWYgKHFsYTJ4MDBfcmZmX2lkKGhhKSkgeworCQkJCS8qIEVNUFRZICovCisJCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSZWdpc3RlciBGQy00ICIKKwkJCQkgICAgIkZlYXR1cmVzIGZhaWxlZC5cbiIsIGhhLT5ob3N0X25vKSk7CisJCQl9CisJCQlpZiAocWxhMngwMF9ybm5faWQoaGEpKSB7CisJCQkJLyogRU1QVFkgKi8KKwkJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJlZ2lzdGVyIE5vZGUgTmFtZSAiCisJCQkJICAgICJmYWlsZWQuXG4iLCBoYS0+aG9zdF9ubykpOworCQkJfSBlbHNlIGlmIChxbGEyeDAwX3Jzbm5fbm4oaGEpKSB7CisJCQkJLyogRU1QVFkgKi8KKwkJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJlZ2lzdGVyIFN5bWJvbGljICIKKwkJCQkgICAgIk5vZGUgTmFtZSBmYWlsZWQuXG4iLCBoYS0+aG9zdF9ubykpOworCQkJfQorCQl9CisKKwkJcnZhbCA9IHFsYTJ4MDBfZmluZF9hbGxfZmFicmljX2RldnMoaGEsICZuZXdfZmNwb3J0cyk7CisJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogTG9nb3V0IGFsbCBwcmV2aW91cyBmYWJyaWMgZGV2aWNlcyBtYXJrZWQgbG9zdCwgZXhjZXB0CisJCSAqIHRhcGUgZGV2aWNlcy4KKwkJICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmaGEtPmZjcG9ydHMsIGxpc3QpIHsKKwkJCWlmICh0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkKKwkJCQlicmVhazsKKworCQkJaWYgKChmY3BvcnQtPmZsYWdzICYgRkNGX0ZBQlJJQ19ERVZJQ0UpID09IDApCisJCQkJY29udGludWU7CisKKwkJCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgPT0gRkNTX0RFVklDRV9MT1NUKSB7CisJCQkJcWxhMngwMF9tYXJrX2RldmljZV9sb3N0KGhhLCBmY3BvcnQsCisJCQkJICAgIHFsMnhwbG9naWFic2VudGRldmljZSk7CisJCQkJaWYgKGZjcG9ydC0+bG9vcF9pZCAhPSBGQ19OT19MT09QX0lEICYmCisJCQkJICAgIChmY3BvcnQtPmZsYWdzICYgRkNGX1RBUEVfUFJFU0VOVCkgPT0gMCAmJgorCQkJCSAgICBmY3BvcnQtPnBvcnRfdHlwZSAhPSBGQ1RfSU5JVElBVE9SICYmCisJCQkJICAgIGZjcG9ydC0+cG9ydF90eXBlICE9IEZDVF9CUk9BRENBU1QpIHsKKworCQkJCQlxbGEyeDAwX2ZhYnJpY19sb2dvdXQoaGEsCisJCQkJCSAgICBmY3BvcnQtPmxvb3BfaWQpOworCQkJCQlmY3BvcnQtPmxvb3BfaWQgPSBGQ19OT19MT09QX0lEOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIFN0YXJ0aW5nIGZyZWUgbG9vcCBJRC4gKi8KKwkJbmV4dF9sb29waWQgPSBoYS0+bWluX2V4dGVybmFsX2xvb3BpZDsKKworCQkvKgorCQkgKiBTY2FuIHRocm91Z2ggb3VyIHBvcnQgbGlzdCBhbmQgbG9naW4gZW50cmllcyB0aGF0IG5lZWQgdG8gYmUKKwkJICogbG9nZ2VkIGluLgorCQkgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZoYS0+ZmNwb3J0cywgbGlzdCkgeworCQkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSB8fAorCQkJICAgIHRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKQorCQkJCWJyZWFrOworCisJCQlpZiAoKGZjcG9ydC0+ZmxhZ3MgJiBGQ0ZfRkFCUklDX0RFVklDRSkgPT0gMCB8fAorCQkJICAgIChmY3BvcnQtPmZsYWdzICYgRkNGX0xPR0lOX05FRURFRCkgPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGZjcG9ydC0+bG9vcF9pZCA9PSBGQ19OT19MT09QX0lEKSB7CisJCQkJZmNwb3J0LT5sb29wX2lkID0gbmV4dF9sb29waWQ7CisJCQkJcnZhbCA9IHFsYTJ4MDBfZmluZF9uZXdfbG9vcF9pZChoYSwgZmNwb3J0KTsKKwkJCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkJCQkvKiBSYW4gb3V0IG9mIElEcyB0byB1c2UgKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQkvKiBMb2dpbiBhbmQgdXBkYXRlIGRhdGFiYXNlICovCisJCQlxbGEyeDAwX2ZhYnJpY19kZXZfbG9naW4oaGEsIGZjcG9ydCwgJm5leHRfbG9vcGlkKTsKKwkJfQorCisJCS8qIEV4aXQgaWYgb3V0IG9mIGxvb3AgSURzLiAqLworCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBMb2dpbiBhbmQgYWRkIHRoZSBuZXcgZGV2aWNlcyB0byBvdXIgcG9ydCBsaXN0LgorCQkgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZjcG9ydCwgZmNwdGVtcCwgJm5ld19mY3BvcnRzLCBsaXN0KSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpIHx8CisJCQkgICAgdGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncykpCisJCQkJYnJlYWs7CisKKwkJCS8qIEZpbmQgYSBuZXcgbG9vcCBJRCB0byB1c2UuICovCisJCQlmY3BvcnQtPmxvb3BfaWQgPSBuZXh0X2xvb3BpZDsKKwkJCXJ2YWwgPSBxbGEyeDAwX2ZpbmRfbmV3X2xvb3BfaWQoaGEsIGZjcG9ydCk7CisJCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkJCS8qIFJhbiBvdXQgb2YgSURzIHRvIHVzZSAqLworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBMb2dpbiBhbmQgdXBkYXRlIGRhdGFiYXNlICovCisJCQlxbGEyeDAwX2ZhYnJpY19kZXZfbG9naW4oaGEsIGZjcG9ydCwgJm5leHRfbG9vcGlkKTsKKworCQkJLyogUmVtb3ZlIGRldmljZSBmcm9tIHRoZSBuZXcgbGlzdCBhbmQgYWRkIGl0IHRvIERCICovCisJCQlsaXN0X2RlbCgmZmNwb3J0LT5saXN0KTsKKwkJCWxpc3RfYWRkX3RhaWwoJmZjcG9ydC0+bGlzdCwgJmhhLT5mY3BvcnRzKTsKKwkJfQorCX0gd2hpbGUgKDApOworCisJLyogRnJlZSBhbGwgbmV3IGRldmljZSBzdHJ1Y3R1cmVzIG5vdCBwcm9jZXNzZWQuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZjcG9ydCwgZmNwdGVtcCwgJm5ld19mY3BvcnRzLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZmY3BvcnQtPmxpc3QpOworCQlrZnJlZShmY3BvcnQpOworCX0KKworCWlmIChydmFsKSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQ29uZmlndXJlIGZhYnJpYyBlcnJvciBleGl0OiAiCisJCSAgICAicnZhbD0lZFxuIiwgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisKKy8qCisgKiBxbGEyeDAwX2ZpbmRfYWxsX2ZhYnJpY19kZXZzCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCWRldiA9IGRhdGFiYXNlIGRldmljZSBlbnRyeSBwb2ludGVyLgorICoKKyAqIFJldHVybnM6CisgKgkwID0gc3VjY2Vzcy4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfZmluZF9hbGxfZmFicmljX2RldnMoc2NzaV9xbGFfaG9zdF90ICpoYSwgc3RydWN0IGxpc3RfaGVhZCAqbmV3X2ZjcG9ydHMpCit7CisJaW50CQlydmFsOworCXVpbnQxNl90CWxvb3BfaWQ7CisJZmNfcG9ydF90CSpmY3BvcnQsICpuZXdfZmNwb3J0LCAqZmNwdGVtcDsKKwlpbnQJCWZvdW5kOworCisJc3dfaW5mb190CSpzd2w7CisJaW50CQlzd2xfaWR4OworCWludAkJZmlyc3RfZGV2LCBsYXN0X2RldjsKKwlwb3J0X2lkX3QJd3JhcCwgbnh0X2RfaWQ7CisKKwlydmFsID0gUUxBX1NVQ0NFU1M7CisKKwkvKiBUcnkgR0lEX1BUIHRvIGdldCBkZXZpY2UgbGlzdCwgZWxzZSBHQU4uICovCisJc3dsID0ga21hbGxvYyhzaXplb2Yoc3dfaW5mb190KSAqIE1BWF9GSUJSRV9ERVZJQ0VTLCBHRlBfQVRPTUlDKTsKKwlpZiAoc3dsID09IE5VTEwpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogR0lEX1BUIGFsbG9jYXRpb25zIGZhaWxlZCwgZmFsbGJhY2sgIgorCQkgICAgIm9uIEdBX05YVFxuIiwgaGEtPmhvc3Rfbm8pKTsKKwl9IGVsc2UgeworCQltZW1zZXQoc3dsLCAwLCBzaXplb2Yoc3dfaW5mb190KSAqIE1BWF9GSUJSRV9ERVZJQ0VTKTsKKwkJaWYgKHFsYTJ4MDBfZ2lkX3B0KGhhLCBzd2wpICE9IFFMQV9TVUNDRVNTKSB7CisJCQlrZnJlZShzd2wpOworCQkJc3dsID0gTlVMTDsKKwkJfSBlbHNlIGlmIChxbGEyeDAwX2dwbl9pZChoYSwgc3dsKSAhPSBRTEFfU1VDQ0VTUykgeworCQkJa2ZyZWUoc3dsKTsKKwkJCXN3bCA9IE5VTEw7CisJCX0gZWxzZSBpZiAocWxhMngwMF9nbm5faWQoaGEsIHN3bCkgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCWtmcmVlKHN3bCk7CisJCQlzd2wgPSBOVUxMOworCQl9CisJfQorCXN3bF9pZHggPSAwOworCisJLyogQWxsb2NhdGUgdGVtcG9yYXJ5IGZjcG9ydCBmb3IgYW55IG5ldyBmY3BvcnRzIGRpc2NvdmVyZWQuICovCisJbmV3X2ZjcG9ydCA9IHFsYTJ4MDBfYWxsb2NfZmNwb3J0KGhhLCBHRlBfS0VSTkVMKTsKKwlpZiAobmV3X2ZjcG9ydCA9PSBOVUxMKSB7CisJCWlmIChzd2wpCisJCQlrZnJlZShzd2wpOworCQlyZXR1cm4gKFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEKTsKKwl9CisJbmV3X2ZjcG9ydC0+ZmxhZ3MgfD0gKEZDRl9GQUJSSUNfREVWSUNFIHwgRkNGX0xPR0lOX05FRURFRCk7CisKKwkvKiBTZXQgc3RhcnQgcG9ydCBJRCBzY2FuIGF0IGFkYXB0ZXIgSUQuICovCisJZmlyc3RfZGV2ID0gMTsKKwlsYXN0X2RldiA9IDA7CisKKwkvKiBTdGFydGluZyBmcmVlIGxvb3AgSUQuICovCisJbG9vcF9pZCA9IGhhLT5taW5fZXh0ZXJuYWxfbG9vcGlkOworCisJZm9yICg7IGxvb3BfaWQgPD0gaGEtPmxhc3RfbG9vcF9pZDsgbG9vcF9pZCsrKSB7CisJCWlmIChSRVNFUlZFRF9MT09QX0lEKGxvb3BfaWQpKQorCQkJY29udGludWU7CisKKwkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSB8fAorCQkgICAgdGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncykpCisJCQlicmVhazsKKworCQlpZiAoc3dsICE9IE5VTEwpIHsKKwkJCWlmIChsYXN0X2RldikgeworCQkJCXdyYXAuYjI0ID0gbmV3X2ZjcG9ydC0+ZF9pZC5iMjQ7CisJCQl9IGVsc2UgeworCQkJCW5ld19mY3BvcnQtPmRfaWQuYjI0ID0gc3dsW3N3bF9pZHhdLmRfaWQuYjI0OworCQkJCW1lbWNweShuZXdfZmNwb3J0LT5ub2RlX25hbWUsCisJCQkJICAgIHN3bFtzd2xfaWR4XS5ub2RlX25hbWUsIFdXTl9TSVpFKTsKKwkJCQltZW1jcHkobmV3X2ZjcG9ydC0+cG9ydF9uYW1lLAorCQkJCSAgICBzd2xbc3dsX2lkeF0ucG9ydF9uYW1lLCBXV05fU0laRSk7CisKKwkJCQlpZiAoc3dsW3N3bF9pZHhdLmRfaWQuYi5yc3ZkXzEgIT0gMCkgeworCQkJCQlsYXN0X2RldiA9IDE7CisJCQkJfQorCQkJCXN3bF9pZHgrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFNlbmQgR0FfTlhUIHRvIHRoZSBzd2l0Y2ggKi8KKwkJCXJ2YWwgPSBxbGEyeDAwX2dhX254dChoYSwgbmV3X2ZjcG9ydCk7CisJCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCQkgICAgIlNOUyBzY2FuIGZhaWxlZCAtLSBhc3N1bWluZyB6ZXJvLWVudHJ5ICIKKwkJCQkgICAgInJlc3VsdC4uLlxuIik7CisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZjcG9ydCwgZmNwdGVtcCwKKwkJCQkgICAgbmV3X2ZjcG9ydHMsIGxpc3QpIHsKKwkJCQkJbGlzdF9kZWwoJmZjcG9ydC0+bGlzdCk7CisJCQkJCWtmcmVlKGZjcG9ydCk7CisJCQkJfQorCQkJCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIElmIHdyYXAgb24gc3dpdGNoIGRldmljZSBsaXN0LCBleGl0LiAqLworCQlpZiAoZmlyc3RfZGV2KSB7CisJCQl3cmFwLmIyNCA9IG5ld19mY3BvcnQtPmRfaWQuYjI0OworCQkJZmlyc3RfZGV2ID0gMDsKKwkJfSBlbHNlIGlmIChuZXdfZmNwb3J0LT5kX2lkLmIyNCA9PSB3cmFwLmIyNCkgeworCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBkZXZpY2Ugd3JhcCAoJTAyeCUwMnglMDJ4KVxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgbmV3X2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkJCSAgICBuZXdfZmNwb3J0LT5kX2lkLmIuYXJlYSwgbmV3X2ZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIEJ5cGFzcyBpZiBob3N0IGFkYXB0ZXIuICovCisJCWlmIChuZXdfZmNwb3J0LT5kX2lkLmIyNCA9PSBoYS0+ZF9pZC5iMjQpCisJCQljb250aW51ZTsKKworCQkvKiBCeXBhc3MgcmVzZXJ2ZWQgZG9tYWluIGZpZWxkcy4gKi8KKwkJaWYgKChuZXdfZmNwb3J0LT5kX2lkLmIuZG9tYWluICYgMHhmMCkgPT0gMHhmMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIExvY2F0ZSBtYXRjaGluZyBkZXZpY2UgaW4gZGF0YWJhc2UuICovCisJCWZvdW5kID0gMDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZoYS0+ZmNwb3J0cywgbGlzdCkgeworCQkJaWYgKG1lbWNtcChuZXdfZmNwb3J0LT5wb3J0X25hbWUsIGZjcG9ydC0+cG9ydF9uYW1lLAorCQkJICAgIFdXTl9TSVpFKSkKKwkJCQljb250aW51ZTsKKworCQkJZm91bmQrKzsKKworCQkJLyoKKwkJCSAqIElmIGFkZHJlc3MgdGhlIHNhbWUgYW5kIHN0YXRlIEZDU19PTkxJTkUsIG5vdGhpbmcKKwkJCSAqIGNoYW5nZWQuCisJCQkgKi8KKwkJCWlmIChmY3BvcnQtPmRfaWQuYjI0ID09IG5ld19mY3BvcnQtPmRfaWQuYjI0ICYmCisJCQkgICAgYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpID09IEZDU19PTkxJTkUpIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElmIGRldmljZSB3YXMgbm90IGEgZmFicmljIGRldmljZSBiZWZvcmUuCisJCQkgKi8KKwkJCWlmICgoZmNwb3J0LT5mbGFncyAmIEZDRl9GQUJSSUNfREVWSUNFKSA9PSAwKSB7CisJCQkJZmNwb3J0LT5kX2lkLmIyNCA9IG5ld19mY3BvcnQtPmRfaWQuYjI0OworCQkJCWZjcG9ydC0+bG9vcF9pZCA9IEZDX05PX0xPT1BfSUQ7CisJCQkJZmNwb3J0LT5mbGFncyB8PSAoRkNGX0ZBQlJJQ19ERVZJQ0UgfAorCQkJCSAgICBGQ0ZfTE9HSU5fTkVFREVEKTsKKwkJCQlmY3BvcnQtPmZsYWdzICY9IH5GQ0ZfUEVSU0lTVEVOVF9CT1VORDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFBvcnQgSUQgY2hhbmdlZCBvciBkZXZpY2Ugd2FzIG1hcmtlZCB0byBiZSB1cGRhdGVkOworCQkJICogTG9nIGl0IG91dCBpZiBzdGlsbCBsb2dnZWQgaW4gYW5kIG1hcmsgaXQgZm9yCisJCQkgKiByZWxvZ2luIGxhdGVyLgorCQkJICovCisJCQlmY3BvcnQtPmRfaWQuYjI0ID0gbmV3X2ZjcG9ydC0+ZF9pZC5iMjQ7CisJCQlmY3BvcnQtPmZsYWdzIHw9IEZDRl9MT0dJTl9ORUVERUQ7CisJCQlpZiAoZmNwb3J0LT5sb29wX2lkICE9IEZDX05PX0xPT1BfSUQgJiYKKwkJCSAgICAoZmNwb3J0LT5mbGFncyAmIEZDRl9UQVBFX1BSRVNFTlQpID09IDAgJiYKKwkJCSAgICBmY3BvcnQtPnBvcnRfdHlwZSAhPSBGQ1RfSU5JVElBVE9SICYmCisJCQkgICAgZmNwb3J0LT5wb3J0X3R5cGUgIT0gRkNUX0JST0FEQ0FTVCkgeworCQkJCXFsYTJ4MDBfZmFicmljX2xvZ291dChoYSwgZmNwb3J0LT5sb29wX2lkKTsKKwkJCQlmY3BvcnQtPmxvb3BfaWQgPSBGQ19OT19MT09QX0lEOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWlmIChmb3VuZCkKKwkJCWNvbnRpbnVlOworCisJCS8qIElmIGRldmljZSB3YXMgbm90IGluIG91ciBmY3BvcnRzIGxpc3QsIHRoZW4gYWRkIGl0LiAqLworCQlsaXN0X2FkZF90YWlsKCZuZXdfZmNwb3J0LT5saXN0LCBuZXdfZmNwb3J0cyk7CisKKwkJLyogQWxsb2NhdGUgYSBuZXcgcmVwbGFjZW1lbnQgZmNwb3J0LiAqLworCQlueHRfZF9pZC5iMjQgPSBuZXdfZmNwb3J0LT5kX2lkLmIyNDsKKwkJbmV3X2ZjcG9ydCA9IHFsYTJ4MDBfYWxsb2NfZmNwb3J0KGhhLCBHRlBfS0VSTkVMKTsKKwkJaWYgKG5ld19mY3BvcnQgPT0gTlVMTCkgeworCQkJaWYgKHN3bCkKKwkJCQlrZnJlZShzd2wpOworCQkJcmV0dXJuIChRTEFfTUVNT1JZX0FMTE9DX0ZBSUxFRCk7CisJCX0KKwkJbmV3X2ZjcG9ydC0+ZmxhZ3MgfD0gKEZDRl9GQUJSSUNfREVWSUNFIHwgRkNGX0xPR0lOX05FRURFRCk7CisJCW5ld19mY3BvcnQtPmRfaWQuYjI0ID0gbnh0X2RfaWQuYjI0OworCX0KKworCWlmIChzd2wpCisJCWtmcmVlKHN3bCk7CisKKwlpZiAobmV3X2ZjcG9ydCkKKwkJa2ZyZWUobmV3X2ZjcG9ydCk7CisKKwlpZiAoIWxpc3RfZW1wdHkobmV3X2ZjcG9ydHMpKQorCQloYS0+ZGV2aWNlX2ZsYWdzIHw9IERGTEdfRkFCUklDX0RFVklDRVM7CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKgorICogcWxhMngwMF9maW5kX25ld19sb29wX2lkCisgKglTY2FuIHRocm91Z2ggb3VyIHBvcnQgbGlzdCBhbmQgZmluZCBhIG5ldyB1c2FibGUgbG9vcCBJRC4KKyAqCisgKiBJbnB1dDoKKyAqCWhhOglhZGFwdGVyIHN0YXRlIHBvaW50ZXIuCisgKglkZXY6CXBvcnQgc3RydWN0dXJlIHBvaW50ZXIuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX2ZpbmRfbmV3X2xvb3BfaWQoc2NzaV9xbGFfaG9zdF90ICpoYSwgZmNfcG9ydF90ICpkZXYpCit7CisJaW50CXJ2YWw7CisJaW50CWZvdW5kOworCWZjX3BvcnRfdCAqZmNwb3J0OworCXVpbnQxNl90IGZpcnN0X2xvb3BfaWQ7CisKKwlydmFsID0gUUxBX1NVQ0NFU1M7CisKKwkvKiBTYXZlIHN0YXJ0aW5nIGxvb3AgSUQuICovCisJZmlyc3RfbG9vcF9pZCA9IGRldi0+bG9vcF9pZDsKKworCWZvciAoOzspIHsKKwkJLyogU2tpcCBsb29wIElEIGlmIGFscmVhZHkgdXNlZCBieSBhZGFwdGVyLiAqLworCQlpZiAoZGV2LT5sb29wX2lkID09IGhhLT5sb29wX2lkKSB7CisJCQlkZXYtPmxvb3BfaWQrKzsKKwkJfQorCisJCS8qIFNraXAgcmVzZXJ2ZWQgbG9vcCBJRHMuICovCisJCXdoaWxlIChSRVNFUlZFRF9MT09QX0lEKGRldi0+bG9vcF9pZCkpIHsKKwkJCWRldi0+bG9vcF9pZCsrOworCQl9CisKKwkJLyogUmVzZXQgbG9vcCBJRCBpZiBwYXNzZWQgdGhlIGVuZC4gKi8KKwkJaWYgKGRldi0+bG9vcF9pZCA+IGhhLT5sYXN0X2xvb3BfaWQpIHsKKwkJCS8qIGZpcnN0IGxvb3AgSUQuICovCisJCQlkZXYtPmxvb3BfaWQgPSBoYS0+bWluX2V4dGVybmFsX2xvb3BpZDsKKwkJfQorCisJCS8qIENoZWNrIGZvciBsb29wIElEIGJlaW5nIGFscmVhZHkgaW4gdXNlLiAqLworCQlmb3VuZCA9IDA7CisJCWZjcG9ydCA9IE5VTEw7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmaGEtPmZjcG9ydHMsIGxpc3QpIHsKKwkJCWlmIChmY3BvcnQtPmxvb3BfaWQgPT0gZGV2LT5sb29wX2lkICYmIGZjcG9ydCAhPSBkZXYpIHsKKwkJCQkvKiBJRCBwb3NzaWJseSBpbiB1c2UgKi8KKwkJCQlmb3VuZCsrOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogSWYgbm90IGluIHVzZSB0aGVuIGl0IGlzIGZyZWUgdG8gdXNlLiAqLworCQlpZiAoIWZvdW5kKSB7CisJCQlicmVhazsKKwkJfQorCisJCS8qIElEIGluIHVzZS4gVHJ5IG5leHQgdmFsdWUuICovCisJCWRldi0+bG9vcF9pZCsrOworCisJCS8qIElmIHdyYXAgYXJvdW5kLiBObyBmcmVlIElEIHRvIHVzZS4gKi8KKwkJaWYgKGRldi0+bG9vcF9pZCA9PSBmaXJzdF9sb29wX2lkKSB7CisJCQlkZXYtPmxvb3BfaWQgPSBGQ19OT19MT09QX0lEOworCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAocnZhbCk7Cit9CisKKy8qCisgKiBxbGEyeDAwX2RldmljZV9yZXN5bmMKKyAqCU1hcmtzIGRldmljZXMgaW4gdGhlIGRhdGFiYXNlIHRoYXQgbmVlZHMgcmVzeW5jaHJvbml6YXRpb24uCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfZGV2aWNlX3Jlc3luYyhzY3NpX3FsYV9ob3N0X3QgKmhhKSAKK3sKKwlpbnQJcnZhbDsKKwlpbnQJcnZhbDI7CisJdWludDMyX3QgbWFzazsKKwlmY19wb3J0X3QgKmZjcG9ydDsKKwl1aW50MzJfdCByc2NuX2VudHJ5OworCXVpbnQ4X3QgcnNjbl9vdXRfaXRlcjsKKwl1aW50OF90IGZvcm1hdDsKKwlwb3J0X2lkX3QgZF9pZDsKKworCXJ2YWwgPSBRTEFfUlNDTlNfSEFORExFRDsKKworCXdoaWxlIChoYS0+cnNjbl9vdXRfcHRyICE9IGhhLT5yc2NuX2luX3B0ciB8fAorCSAgICBoYS0+ZmxhZ3MucnNjbl9xdWV1ZV9vdmVyZmxvdykgeworCisJCXJzY25fZW50cnkgPSBoYS0+cnNjbl9xdWV1ZVtoYS0+cnNjbl9vdXRfcHRyXTsKKwkJZm9ybWF0ID0gTVNCKE1TVyhyc2NuX2VudHJ5KSk7CisJCWRfaWQuYi5kb21haW4gPSBMU0IoTVNXKHJzY25fZW50cnkpKTsKKwkJZF9pZC5iLmFyZWEgPSBNU0IoTFNXKHJzY25fZW50cnkpKTsKKwkJZF9pZC5iLmFsX3BhID0gTFNCKExTVyhyc2NuX2VudHJ5KSk7CisKKwkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IFJTQ04gcXVldWUgZW50cnlbJWRdID0gIgorCQkgICAgIlslMDJ4LyUwMnglMDJ4JTAyeF0uXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIGhhLT5yc2NuX291dF9wdHIsIGZvcm1hdCwgZF9pZC5iLmRvbWFpbiwKKwkJICAgIGRfaWQuYi5hcmVhLCBkX2lkLmIuYWxfcGEpKTsKKworCQloYS0+cnNjbl9vdXRfcHRyKys7CisJCWlmIChoYS0+cnNjbl9vdXRfcHRyID09IE1BWF9SU0NOX0NPVU5UKQorCQkJaGEtPnJzY25fb3V0X3B0ciA9IDA7CisKKwkJLyogU2tpcCBkdXBsaWNhdGUgZW50cmllcy4gKi8KKwkJZm9yIChyc2NuX291dF9pdGVyID0gaGEtPnJzY25fb3V0X3B0cjsKKwkJICAgICFoYS0+ZmxhZ3MucnNjbl9xdWV1ZV9vdmVyZmxvdyAmJgorCQkgICAgcnNjbl9vdXRfaXRlciAhPSBoYS0+cnNjbl9pbl9wdHI7CisJCSAgICByc2NuX291dF9pdGVyID0gKHJzY25fb3V0X2l0ZXIgPT0KKwkJCShNQVhfUlNDTl9DT1VOVCAtIDEpKSA/IDA6IHJzY25fb3V0X2l0ZXIgKyAxKSB7CisKKwkJCWlmIChyc2NuX2VudHJ5ICE9IGhhLT5yc2NuX3F1ZXVlW3JzY25fb3V0X2l0ZXJdKQorCQkJCWJyZWFrOworCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogU2tpcHBpbmcgZHVwbGljYXRlIFJTQ04gcXVldWUgIgorCQkJICAgICJlbnRyeSBmb3VuZCBhdCBbJWRdLlxuIiwgaGEtPmhvc3Rfbm8sCisJCQkgICAgcnNjbl9vdXRfaXRlcikpOworCisJCQloYS0+cnNjbl9vdXRfcHRyID0gcnNjbl9vdXRfaXRlcjsKKwkJfQorCisJCS8qIFF1ZXVlIG92ZXJmbG93LCBzZXQgc3dpdGNoIGRlZmF1bHQgY2FzZS4gKi8KKwkJaWYgKGhhLT5mbGFncy5yc2NuX3F1ZXVlX292ZXJmbG93KSB7CisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogZGV2aWNlX3Jlc3luYzogcnNjbiAiCisJCQkgICAgIm92ZXJmbG93LlxuIiwgaGEtPmhvc3Rfbm8pKTsKKworCQkJZm9ybWF0ID0gMzsKKwkJCWhhLT5mbGFncy5yc2NuX3F1ZXVlX292ZXJmbG93ID0gMDsKKwkJfQorCisJCXN3aXRjaCAoZm9ybWF0KSB7CisJCWNhc2UgMDoKKwkJCWlmICghSVNfUUxBMjEwMChoYSkgJiYgIUlTX1FMQTIyMDAoaGEpICYmCisJCQkgICAgIUlTX1FMQTYzMTIoaGEpICYmICFJU19RTEE2MzIyKGhhKSAmJgorCQkJICAgIGhhLT5mbGFncy5pbml0X2RvbmUpIHsKKwkJCQkvKiBIYW5kbGUgcG9ydCBSU0NOIHZpYSBhc3luY3Jvbm91cyBJT0NCcyAqLworCQkJCXJ2YWwyID0gcWxhMngwMF9oYW5kbGVfcG9ydF9yc2NuKGhhLCByc2NuX2VudHJ5LAorCQkJCSAgICBOVUxMLCAwKTsKKwkJCQlpZiAocnZhbDIgPT0gUUxBX1NVQ0NFU1MpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbWFzayA9IDB4ZmZmZmZmOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCW1hc2sgPSAweGZmZmYwMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQltYXNrID0gMHhmZjAwMDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW1hc2sgPSAweDA7CisJCQlkX2lkLmIyNCA9IDA7CisJCQloYS0+cnNjbl9vdXRfcHRyID0gaGEtPnJzY25faW5fcHRyOworCQkJYnJlYWs7CisJCX0KKworCQlydmFsID0gUUxBX1NVQ0NFU1M7CisKKwkJLyogQWJvcnQgYW55IG91dHN0YW5kaW5nIElPIGRlc2NyaXB0b3JzLiAqLworCQlpZiAoIUlTX1FMQTIxMDAoaGEpICYmICFJU19RTEEyMjAwKGhhKSkKKwkJCXFsYTJ4MDBfY2FuY2VsX2lvX2Rlc2NyaXB0b3JzKGhhKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJmhhLT5mY3BvcnRzLCBsaXN0KSB7CisJCQlpZiAoKGZjcG9ydC0+ZmxhZ3MgJiBGQ0ZfRkFCUklDX0RFVklDRSkgPT0gMCB8fAorCQkJICAgIChmY3BvcnQtPmRfaWQuYjI0ICYgbWFzaykgIT0gZF9pZC5iMjQgfHwKKwkJCSAgICBmY3BvcnQtPnBvcnRfdHlwZSA9PSBGQ1RfQlJPQURDQVNUKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpID09IEZDU19PTkxJTkUpIHsKKwkJCQlpZiAoZm9ybWF0ICE9IDMgfHwKKwkJCQkgICAgZmNwb3J0LT5wb3J0X3R5cGUgIT0gRkNUX0lOSVRJQVRPUikgeworCQkJCQlhdG9taWNfc2V0KCZmY3BvcnQtPnN0YXRlLAorCQkJCQkgICAgRkNTX0RFVklDRV9MT1NUKTsKKwkJCQl9CisJCQl9CisJCQlmY3BvcnQtPmZsYWdzICY9IH5GQ0ZfRkFSUF9ET05FOworCQl9CisJfQorCXJldHVybiAocnZhbCk7Cit9CisKKy8qCisgKiBxbGEyeDAwX2ZhYnJpY19kZXZfbG9naW4KKyAqCUxvZ2luIGZhYnJpYyB0YXJnZXQgZGV2aWNlIGFuZCB1cGRhdGUgRkMgcG9ydCBkYXRhYmFzZS4KKyAqCisgKiBJbnB1dDoKKyAqCWhhOgkJYWRhcHRlciBzdGF0ZSBwb2ludGVyLgorICoJZmNwb3J0OgkJcG9ydCBzdHJ1Y3R1cmUgbGlzdCBwb2ludGVyLgorICoJbmV4dF9sb29waWQ6CWNvbnRhaW5zIHZhbHVlIG9mIGEgbmV3IGxvb3AgSUQgdGhhdCBjYW4gYmUgdXNlZAorICoJCQlieSB0aGUgbmV4dCBsb2dpbiBhdHRlbXB0LgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfZmFicmljX2Rldl9sb2dpbihzY3NpX3FsYV9ob3N0X3QgKmhhLCBmY19wb3J0X3QgKmZjcG9ydCwKKyAgICB1aW50MTZfdCAqbmV4dF9sb29waWQpCit7CisJaW50CXJ2YWw7CisJaW50CXJldHJ5OworCisJcnZhbCA9IFFMQV9TVUNDRVNTOworCXJldHJ5ID0gMDsKKworCXJ2YWwgPSBxbGEyeDAwX2ZhYnJpY19sb2dpbihoYSwgZmNwb3J0LCBuZXh0X2xvb3BpZCk7CisJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKKwkJcnZhbCA9IHFsYTJ4MDBfZ2V0X3BvcnRfZGF0YWJhc2UoaGEsIGZjcG9ydCwgMCk7CisJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCQlxbGEyeDAwX2ZhYnJpY19sb2dvdXQoaGEsIGZjcG9ydC0+bG9vcF9pZCk7CisJCX0gZWxzZSB7CisJCQlxbGEyeDAwX3VwZGF0ZV9mY3BvcnQoaGEsIGZjcG9ydCk7CisJCX0KKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKgorICogcWxhMngwMF9mYWJyaWNfbG9naW4KKyAqCUlzc3VlIGZhYnJpYyBsb2dpbiBjb21tYW5kLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglkZXZpY2UgPSBwb2ludGVyIHRvIEZDIGRldmljZSB0eXBlIHN0cnVjdHVyZS4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICAwIC0gTG9naW4gc3VjY2Vzc2Z1bGx5CisgKiAgICAgIDEgLSBMb2dpbiBmYWlsZWQKKyAqICAgICAgMiAtIEluaXRpYXRvciBkZXZpY2UKKyAqICAgICAgMyAtIEZhdGFsIGVycm9yCisgKi8KK2ludAorcWxhMngwMF9mYWJyaWNfbG9naW4oc2NzaV9xbGFfaG9zdF90ICpoYSwgZmNfcG9ydF90ICpmY3BvcnQsCisgICAgdWludDE2X3QgKm5leHRfbG9vcGlkKQoreworCWludAlydmFsOworCWludAlyZXRyeTsKKwl1aW50MTZfdCB0bXBfbG9vcGlkOworCXVpbnQxNl90IG1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOworCisJcmV0cnkgPSAwOworCXRtcF9sb29waWQgPSAwOworCisJZm9yICg7OykgeworCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogVHJ5aW5nIEZhYnJpYyBMb2dpbiB3L2xvb3AgaWQgMHglMDR4ICIKKyAJCSAgICAiZm9yIHBvcnQgJTAyeCUwMnglMDJ4LlxuIiwKKyAJCSAgICBoYS0+aG9zdF9ubywgZmNwb3J0LT5sb29wX2lkLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sCisJCSAgICBmY3BvcnQtPmRfaWQuYi5hcmVhLCBmY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCisJCS8qIExvZ2luIGZjcG9ydCBvbiBzd2l0Y2guICovCisJCXFsYTJ4MDBfbG9naW5fZmFicmljKGhhLCBmY3BvcnQtPmxvb3BfaWQsCisJCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSwgbWIsIEJJVF8wKTsKKwkJaWYgKG1iWzBdID09IE1CU19QT1JUX0lEX1VTRUQpIHsKKwkJCS8qCisJCQkgKiBEZXZpY2UgaGFzIGFub3RoZXIgbG9vcCBJRC4gIFRoZSBmaXJtd2FyZSB0ZWFtCisJCQkgKiByZWNvbW1lbmRzIHVzIHRvIHBlcmZvcm0gYW4gaW1wbGljaXQgbG9naW4gd2l0aCB0aGUKKwkJCSAqIHNwZWNpZmllZCBJRCBhZ2Fpbi4gVGhlIElEIHdlIGp1c3QgdXNlZCBpcyBzYXZlIGhlcmUKKwkJCSAqIHNvIHdlIHJldHVybiB3aXRoIGFuIElEIHRoYXQgY2FuIGJlIHRyaWVkIGJ5IHRoZQorCQkJICogbmV4dCBsb2dpbi4KKwkJCSAqLworCQkJcmV0cnkrKzsKKwkJCXRtcF9sb29waWQgPSBmY3BvcnQtPmxvb3BfaWQ7CisJCQlmY3BvcnQtPmxvb3BfaWQgPSBtYlsxXTsKKworCQkJREVCVUcocHJpbnRrKCJGYWJyaWMgTG9naW46IHBvcnQgaW4gdXNlIC0gbmV4dCAiCisgCQkJICAgICJsb29wIGlkPTB4JTA0eCwgcG9ydCBJZD0lMDJ4JTAyeCUwMnguXG4iLAorCQkJICAgIGZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLAorCQkJICAgIGZjcG9ydC0+ZF9pZC5iLmFyZWEsIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisKKwkJfSBlbHNlIGlmIChtYlswXSA9PSBNQlNfQ09NTUFORF9DT01QTEVURSkgeworCQkJLyoKKwkJCSAqIExvZ2luIHN1Y2NlZWRlZC4KKwkJCSAqLworCQkJaWYgKHJldHJ5KSB7CisJCQkJLyogQSByZXRyeSBvY2N1cnJlZCBiZWZvcmUuICovCisJCQkJKm5leHRfbG9vcGlkID0gdG1wX2xvb3BpZDsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBObyByZXRyeSBvY2N1cnJlZCBiZWZvcmUuIEp1c3QgaW5jcmVtZW50IHRoZQorCQkJCSAqIElEIHZhbHVlIGZvciBuZXh0IGxvZ2luLgorCQkJCSAqLworCQkJCSpuZXh0X2xvb3BpZCA9IChmY3BvcnQtPmxvb3BfaWQgKyAxKTsKKwkJCX0KKworCQkJaWYgKG1iWzFdICYgQklUXzApIHsKKwkJCQlmY3BvcnQtPnBvcnRfdHlwZSA9IEZDVF9JTklUSUFUT1I7CisJCQl9IGVsc2UgeworCQkJCWZjcG9ydC0+cG9ydF90eXBlID0gRkNUX1RBUkdFVDsKKwkJCQlpZiAobWJbMV0gJiBCSVRfMSkgeworCQkJCQlmY3BvcnQtPmZsYWdzIHw9IEZDRl9UQVBFX1BSRVNFTlQ7CisJCQkJfQorCQkJfQorCisJCQlydmFsID0gUUxBX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChtYlswXSA9PSBNQlNfTE9PUF9JRF9VU0VEKSB7CisJCQkvKgorCQkJICogTG9vcCBJRCBhbHJlYWR5IHVzZWQsIHRyeSBuZXh0IGxvb3AgSUQuCisJCQkgKi8KKwkJCWZjcG9ydC0+bG9vcF9pZCsrOworCQkJcnZhbCA9IHFsYTJ4MDBfZmluZF9uZXdfbG9vcF9pZChoYSwgZmNwb3J0KTsKKwkJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCQkJLyogUmFuIG91dCBvZiBsb29wIElEcyB0byB1c2UgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIGlmIChtYlswXSA9PSBNQlNfQ09NTUFORF9FUlJPUikgeworCQkJLyoKKwkJCSAqIEZpcm13YXJlIHBvc3NpYmx5IHRpbWVkIG91dCBkdXJpbmcgbG9naW4uIElmIE5PCisJCQkgKiByZXRyaWVzIGFyZSBsZWZ0IHRvIGRvIHRoZW4gdGhlIGRldmljZSBpcyBkZWNsYXJlZAorCQkJICogZGVhZC4KKwkJCSAqLworCQkJKm5leHRfbG9vcGlkID0gZmNwb3J0LT5sb29wX2lkOworCQkJcWxhMngwMF9mYWJyaWNfbG9nb3V0KGhhLCBmY3BvcnQtPmxvb3BfaWQpOworCQkJcWxhMngwMF9tYXJrX2RldmljZV9sb3N0KGhhLCBmY3BvcnQsIDEpOworCisJCQlydmFsID0gMTsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIHVucmVjb3ZlcmFibGUgLyBub3QgaGFuZGxlZCBlcnJvcgorCQkJICovCisJCQlERUJVRzIocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggcG9ydF9pZD0lMDJ4JTAyeCUwMnggIgorIAkJCSAgICAibG9vcF9pZD0leCBqaWZmaWVzPSVseC5cbiIsIAorIAkJCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIG1iWzBdLCAKKwkJCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEsIGZjcG9ydC0+bG9vcF9pZCwgamlmZmllcykpOworCisJCQkqbmV4dF9sb29waWQgPSBmY3BvcnQtPmxvb3BfaWQ7CisJCQlxbGEyeDAwX2ZhYnJpY19sb2dvdXQoaGEsIGZjcG9ydC0+bG9vcF9pZCk7CisJCQlmY3BvcnQtPmxvb3BfaWQgPSBGQ19OT19MT09QX0lEOworCQkJYXRvbWljX3NldCgmZmNwb3J0LT5zdGF0ZSwgRkNTX0RFVklDRV9ERUFEKTsKKworCQkJcnZhbCA9IDM7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAocnZhbCk7Cit9CisKKy8qCisgKiBxbGEyeDAwX2xvY2FsX2RldmljZV9sb2dpbgorICoJSXNzdWUgbG9jYWwgZGV2aWNlIGxvZ2luIGNvbW1hbmQuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCWxvb3BfaWQgPSBsb29wIGlkIG9mIGRldmljZSB0byBsb2dpbiB0by4KKyAqCisgKiBSZXR1cm5zIChXaGVyZSdzIHRoZSAjZGVmaW5lISEhISk6CisgKiAgICAgIDAgLSBMb2dpbiBzdWNjZXNzZnVsbHkKKyAqICAgICAgMSAtIExvZ2luIGZhaWxlZAorICogICAgICAzIC0gRmF0YWwgZXJyb3IKKyAqLworaW50CitxbGEyeDAwX2xvY2FsX2RldmljZV9sb2dpbihzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCBsb29wX2lkKQoreworCWludAkJcnZhbDsKKwl1aW50MTZfdAltYltNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXTsKKworCW1lbXNldChtYiwgMCwgc2l6ZW9mKG1iKSk7CisJcnZhbCA9IHFsYTJ4MDBfbG9naW5fbG9jYWxfZGV2aWNlKGhhLCBsb29wX2lkLCBtYiwgQklUXzApOworCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CisJCS8qIEludGVycm9nYXRlIG1haWxib3ggcmVnaXN0ZXJzIGZvciBhbnkgZXJyb3JzICovCisJCWlmIChtYlswXSA9PSBNQlNfQ09NTUFORF9FUlJPUikKKwkJCXJ2YWwgPSAxOworCQllbHNlIGlmIChtYlswXSA9PSBNQlNfQ09NTUFORF9QQVJBTUVURVJfRVJST1IpCisJCQkvKiBkZXZpY2Ugbm90IGluIFBDQiB0YWJsZSAqLworCQkJcnZhbCA9IDM7CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworLyoKKyAqICBxbGEyeDAwX2xvb3BfcmVzeW5jCisgKiAgICAgIFJlc3luYyB3aXRoIGZpYnJlIGNoYW5uZWwgZGV2aWNlcy4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgMCA9IHN1Y2Nlc3MKKyAqLworaW50CitxbGEyeDAwX2xvb3BfcmVzeW5jKHNjc2lfcWxhX2hvc3RfdCAqaGEpIAoreworCWludCAgIHJ2YWw7CisJdWludDMyX3Qgd2FpdF90aW1lOworCisJcnZhbCA9IFFMQV9TVUNDRVNTOworCisJYXRvbWljX3NldCgmaGEtPmxvb3Bfc3RhdGUsIExPT1BfVVBEQVRFKTsKKwlxbGEyeDAwX3N0YXRzLmxvb3BfcmVzeW5jKys7CisJY2xlYXJfYml0KElTUF9BQk9SVF9SRVRSWSwgJmhhLT5kcGNfZmxhZ3MpOworCWlmIChoYS0+ZmxhZ3Mub25saW5lKSB7CisJCWlmICghKHJ2YWwgPSBxbGEyeDAwX2Z3X3JlYWR5KGhhKSkpIHsKKwkJCS8qIFdhaXQgYXQgbW9zdCBNQVhfVEFSR0VUIFJTQ05zIGZvciBhIHN0YWJsZSBsaW5rLiAqLworCQkJd2FpdF90aW1lID0gMjU2OworCQkJZG8geworCQkJCS8qIHYyLjE5LjA1YjYgKi8KKwkJCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9VUERBVEUpOworCisJCQkJLyoKKwkJCQkgKiBJc3N1ZSBtYXJrZXIgY29tbWFuZCBvbmx5IHdoZW4gd2UgYXJlIGdvaW5nCisJCQkJICogdG8gc3RhcnQgdGhlIEkvTyAuCisJCQkJICovCisJCQkJaGEtPm1hcmtlcl9uZWVkZWQgPSAxOworCisJCQkJLyogUmVtYXAgZGV2aWNlcyBvbiBMb29wLiAqLworCQkJCWNsZWFyX2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKworCQkJCXFsYTJ4MDBfY29uZmlndXJlX2xvb3AoaGEpOworCQkJCXdhaXRfdGltZS0tOworCQkJfSB3aGlsZSAoIWF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSAmJgorCQkJCSEodGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSAmJgorCQkJCXdhaXRfdGltZSAmJgorCQkJCSh0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkpOworCQl9CisJCXFsYTJ4MDBfcmVzdGFydF9xdWV1ZXMoaGEsIDEpOworCX0KKworCWlmICh0ZXN0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncykpIHsKKwkJcmV0dXJuIChRTEFfRlVOQ1RJT05fRkFJTEVEKTsKKwl9CisKKwlpZiAocnZhbCkgeworCQlERUJVRzJfMyhwcmludGsoIiVzKCk6ICoqKiogRkFJTEVEICoqKipcbiIsIF9fZnVuY19fKSk7CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworLyoKKyAqICBxbGEyeDAwX3Jlc3RhcnRfcXVldWVzCisgKglSZXN0YXJ0IGRldmljZSBxdWV1ZXMuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsL0ludGVycnVwdCBjb250ZXh0LgorICovCit2b2lkCitxbGEyeDAwX3Jlc3RhcnRfcXVldWVzKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQ4X3QgZmx1c2gpIAoreworCXNyYl90ICAJCSpzcDsKKwlpbnQJCXJldHJ5X3FfY250ID0gMDsKKwlpbnQJCXBlbmRpbmdfcV9jbnQgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsICp0ZW1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCisJY2xlYXJfYml0KFJFU1RBUlRfUVVFVUVTX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCisJLyogc3RhcnQgcGVuZGluZyBxdWV1ZSAqLworCXBlbmRpbmdfcV9jbnQgPSBoYS0+cXRocmVhZHM7CisJaWYgKGZsdXNoKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+bGlzdF9sb2NrLGZsYWdzKTsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3QsIHRlbXAsICZoYS0+cGVuZGluZ19xdWV1ZSkgeworCQkJc3AgPSBsaXN0X2VudHJ5KGxpc3QsIHNyYl90LCBsaXN0KTsKKworCQkJaWYgKChzcC0+ZmxhZ3MgJiBTUkJfVEFQRSkpCisJCQkJY29udGludWU7CisJCQkgCisJCQkvKiAKKwkJCSAqIFdoZW4gdGltZSBleHBpcmUgcmV0dXJuIHJlcXVlc3QgYmFjayB0byBPUyBhcyBCVVNZIAorCQkJICovCisJCQlfX2RlbF9mcm9tX3BlbmRpbmdfcXVldWUoaGEsIHNwKTsKKwkJCXNwLT5jbWQtPnJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNjsKKwkJCXNwLT5jbWQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKU5VTEw7CisJCQlfX2FkZF90b19kb25lX3F1ZXVlKGhhLCBzcCk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCWlmICghbGlzdF9lbXB0eSgmaGEtPnBlbmRpbmdfcXVldWUpKQorCQkJcWxhMngwMF9uZXh0KGhhKTsKKwl9CisKKwkvKgorCSAqIENsZWFyIG91dCBvdXIgcmV0cnkgcXVldWUKKwkgKi8KKwlpZiAoZmx1c2gpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKKwkJcmV0cnlfcV9jbnQgPSBoYS0+cmV0cnlfcV9jbnQ7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0LCB0ZW1wLCAmaGEtPnJldHJ5X3F1ZXVlKSB7CisJCQlzcCA9IGxpc3RfZW50cnkobGlzdCwgc3JiX3QsIGxpc3QpOworCQkJLyogd2hlbiB0aW1lIGV4cGlyZSByZXR1cm4gcmVxdWVzdCBiYWNrIHRvIE9TIGFzIEJVU1kgKi8KKwkJCV9fZGVsX2Zyb21fcmV0cnlfcXVldWUoaGEsIHNwKTsKKwkJCXNwLT5jbWQtPnJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNjsKKwkJCXNwLT5jbWQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKU5VTEw7CisJCQlfX2FkZF90b19kb25lX3F1ZXVlKGhhLCBzcCk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCisJCURFQlVHMihwcmludGsoIiVzKCVsZCk6IGNhbGxiYWNrICVkIGNvbW1hbmRzLlxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQloYS0+aG9zdF9ubywKKwkJCQlyZXRyeV9xX2NudCk7KQorCX0KKworCURFQlVHMihwcmludGsoIiVzKCVsZCk6IGFjdGl2ZT0lbGQsIHJldHJ5PSVkLCBwZW5kaW5nPSVkLCAiCisJCQkiZG9uZT0lbGQsIHNjc2kgcmV0cnk9JWQgY29tbWFuZHMuXG4iLAorCQkJX19mdW5jX18sCisJCQloYS0+aG9zdF9ubywKKwkJCWhhLT5hY3R0aHJlYWRzLAorCQkJaGEtPnJldHJ5X3FfY250LAorCQkJcGVuZGluZ19xX2NudCwKKwkJCWhhLT5kb25lX3FfY250LAorCQkJaGEtPnNjc2lfcmV0cnlfcV9jbnQpOykKKworCWlmICghbGlzdF9lbXB0eSgmaGEtPmRvbmVfcXVldWUpKQorCQlxbGEyeDAwX2RvbmUoaGEpOworfQorCit2b2lkCitxbGEyeDAwX3Jlc2Nhbl9mY3BvcnRzKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50IHJlc2Nhbl9kb25lOworCWZjX3BvcnRfdCAqZmNwb3J0OworCisJcmVzY2FuX2RvbmUgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmaGEtPmZjcG9ydHMsIGxpc3QpIHsKKwkJaWYgKChmY3BvcnQtPmZsYWdzICYgRkNGX1JFU0NBTl9ORUVERUQpID09IDApCisJCQljb250aW51ZTsKKworCQlxbGEyeDAwX3VwZGF0ZV9mY3BvcnQoaGEsIGZjcG9ydCk7CisJCWZjcG9ydC0+ZmxhZ3MgJj0gfkZDRl9SRVNDQU5fTkVFREVEOworCisJCXJlc2Nhbl9kb25lID0gMTsKKwl9CisJcWxhMngwMF9wcm9iZV9mb3JfYWxsX2x1bnMoaGEpOyAKKworCS8qIFVwZGF0ZSBPUyB0YXJnZXQgYW5kIGx1biBzdHJ1Y3R1cmVzIGlmIG5lY2Vzc2FyeS4gKi8KKwlpZiAocmVzY2FuX2RvbmUpIHsKKwkJcWxhMngwMF9jb25maWdfb3MoaGEpOworCX0KK30KKworCisvKgorICogcWxhMngwMF9jb25maWdfb3MKKyAqCVNldHVwIE9TIHRhcmdldCBhbmQgTFVOIHN0cnVjdHVyZXMuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgc3RhdGUgcG9pbnRlci4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK3N0YXRpYyB2b2lkCitxbGEyeDAwX2NvbmZpZ19vcyhzY3NpX3FsYV9ob3N0X3QgKmhhKSAKK3sKKwlmY19wb3J0X3QJKmZjcG9ydDsKKwlmY19sdW5fdAkqZmNsdW47CisJb3NfdGd0X3QJKnRxOworCXVpbnQxNl90CXRndDsKKworCisJZm9yICh0Z3QgPSAwOyB0Z3QgPCBNQVhfVEFSR0VUUzsgdGd0KyspIHsKKwkJaWYgKCh0cSA9IFRHVF9RKGhhLCB0Z3QpKSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJY2xlYXJfYml0KFRRRl9PTkxJTkUsICZ0cS0+ZmxhZ3MpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmaGEtPmZjcG9ydHMsIGxpc3QpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSAhPSBGQ1NfT05MSU5FIHx8CisJCSAgICBmY3BvcnQtPnBvcnRfdHlwZSA9PSBGQ1RfSU5JVElBVE9SIHx8CisJCSAgICBmY3BvcnQtPnBvcnRfdHlwZSA9PSBGQ1RfQlJPQURDQVNUKSB7CisJCQlmY3BvcnQtPm9zX3RhcmdldF9pZCA9IE1BWF9UQVJHRVRTOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoZmNwb3J0LT5mbGFncyAmIEZDRl9GT19NQVNLRUQpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogQmluZCBGQyBwb3J0IHRvIE9TIHRhcmdldCBudW1iZXIuICovCisJCWlmIChxbGEyeDAwX2ZjcG9ydF9iaW5kKGhhLCBmY3BvcnQpID09IE1BWF9UQVJHRVRTKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEJpbmQgRkMgTFVOIHRvIE9TIExVTiBudW1iZXIuICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNsdW4sICZmY3BvcnQtPmZjbHVucywgbGlzdCkgeworCQkJcWxhMngwMF9mY2x1bl9iaW5kKGhhLCBmY3BvcnQsIGZjbHVuKTsKKwkJfQorCX0KK30KKworLyoKKyAqIHFsYTJ4MDBfZmNwb3J0X2JpbmQKKyAqCUxvY2F0ZXMgYSB0YXJnZXQgbnVtYmVyIGZvciBGQyBwb3J0LgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIHN0YXRlIHBvaW50ZXIuCisgKglmY3BvcnQgPSBGQyBwb3J0IHN0cnVjdHVyZSBwb2ludGVyLgorICoKKyAqIFJldHVybnM6CisgKgl0YXJnZXQgbnVtYmVyCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitzdGF0aWMgdWludDE2X3QKK3FsYTJ4MDBfZmNwb3J0X2JpbmQoc2NzaV9xbGFfaG9zdF90ICpoYSwgZmNfcG9ydF90ICpmY3BvcnQpIAoreworCWludAkJZm91bmQ7CisJdWludDE2X3QJdGd0OworCW9zX3RndF90CSp0cTsKKworCS8qIENoZWNrIGZvciBwZXJzaXN0ZW50IGJpbmRpbmcuICovCisJZm9yICh0Z3QgPSAwOyB0Z3QgPCBNQVhfVEFSR0VUUzsgdGd0KyspIHsKKwkJaWYgKCh0cSA9IFRHVF9RKGhhLCB0Z3QpKSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJZm91bmQgPSAwOworCQlzd2l0Y2ggKGhhLT5iaW5kaW5nX3R5cGUpIHsKKwkJY2FzZSBCSU5EX0JZX1BPUlRfSUQ6CisJCQlpZiAoZmNwb3J0LT5kX2lkLmIyNCA9PSB0cS0+ZF9pZC5iMjQpIHsKKwkJCQltZW1jcHkodHEtPm5vZGVfbmFtZSwgZmNwb3J0LT5ub2RlX25hbWUsCisJCQkJICAgIFdXTl9TSVpFKTsKKwkJCQltZW1jcHkodHEtPnBvcnRfbmFtZSwgZmNwb3J0LT5wb3J0X25hbWUsCisJCQkJICAgIFdXTl9TSVpFKTsKKwkJCQlmb3VuZCsrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQklORF9CWV9QT1JUX05BTUU6ICAgIAorCQkJaWYgKG1lbWNtcChmY3BvcnQtPnBvcnRfbmFtZSwgdHEtPnBvcnRfbmFtZSwKKwkJCSAgICBXV05fU0laRSkgPT0gMCkgeworCQkJCS8qCisJCQkJICogSW4gY2FzZSBvZiBwZXJzaXN0ZW50IGJpbmRpbmcsIHVwZGF0ZSB0aGUKKwkJCQkgKiBXV05OLgorCQkJCSAqLworCQkJCW1lbWNweSh0cS0+bm9kZV9uYW1lLCBmY3BvcnQtPm5vZGVfbmFtZSwKKwkJCQkgICAgV1dOX1NJWkUpOworCQkJCWZvdW5kKys7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlpZiAoZm91bmQpCisJCSAgICBicmVhazsJCisJfQorCisJLyogVE9ETzogaG9ub3IgdGhlIENvbmZpZ1JlcXVpcmVkIGZsYWcgKi8KKwlpZiAodGd0ID09IE1BWF9UQVJHRVRTKSB7CisJCS8qIENoZWNrIGlmIHRhcmdldElEIDAgYXZhaWxhYmxlLiAqLworCQl0Z3QgPSAwOworCisJCWlmIChUR1RfUShoYSwgdGd0KSAhPSBOVUxMKSB7CisJCQkvKiBMb2NhdGUgZmlyc3QgZnJlZSB0YXJnZXQgZm9yIGRldmljZS4gKi8KKwkJCWZvciAodGd0ID0gMDsgdGd0IDwgTUFYX1RBUkdFVFM7IHRndCsrKSB7CisJCQkJaWYgKFRHVF9RKGhhLCB0Z3QpID09IE5VTEwpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWlmICh0Z3QgIT0gTUFYX1RBUkdFVFMpIHsKKwkJCWlmICgodHEgPSBxbGEyeDAwX3RndF9hbGxvYyhoYSwgdGd0KSkgIT0gTlVMTCkgeworCQkJCW1lbWNweSh0cS0+bm9kZV9uYW1lLCBmY3BvcnQtPm5vZGVfbmFtZSwKKwkJCQkgICAgV1dOX1NJWkUpOworCQkJCW1lbWNweSh0cS0+cG9ydF9uYW1lLCBmY3BvcnQtPnBvcnRfbmFtZSwKKwkJCQkgICAgV1dOX1NJWkUpOworCQkJCXRxLT5kX2lkLmIyNCA9IGZjcG9ydC0+ZF9pZC5iMjQ7CisJCQl9CisJCX0KKwl9CisKKwkvKiBSZXNldCB0YXJnZXQgbnVtYmVycyBpbmNhc2UgaXQgY2hhbmdlZC4gKi8KKwlmY3BvcnQtPm9zX3RhcmdldF9pZCA9IHRndDsKKwlpZiAodGd0ICE9IE1BWF9UQVJHRVRTICYmIHRxICE9IE5VTEwpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3NpZ25pbmcgdGFyZ2V0IElEPSUwMmQgQCAlcCB0byAiCisJCSAgICAibG9vcCBpZD0weCUwNHgsIHBvcnQgc3RhdGU9MHgleCwgcG9ydCBkb3duIHJldHJ5PSVkXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHRndCwgdHEsIGZjcG9ydC0+bG9vcF9pZCwKKwkJICAgIGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSwKKwkJICAgIGF0b21pY19yZWFkKCZmY3BvcnQtPnBvcnRfZG93bl90aW1lcikpKTsKKworCQlmY3BvcnQtPnRndF9xdWV1ZSA9IHRxOworCQlmY3BvcnQtPmZsYWdzIHw9IEZDRl9QRVJTSVNURU5UX0JPVU5EOworCQl0cS0+ZmNwb3J0ID0gZmNwb3J0OworCQlzZXRfYml0KFRRRl9PTkxJTkUsICZ0cS0+ZmxhZ3MpOworCQl0cS0+cG9ydF9kb3duX3JldHJ5X2NvdW50ID0gaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudDsKKwl9CisKKwlpZiAodGd0ID09IE1BWF9UQVJHRVRTKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJVbmFibGUgdG8gYmluZCBmY3BvcnQsIGxvb3BfaWQ9JXhcbiIsIGZjcG9ydC0+bG9vcF9pZCk7CisJfQorCisJcmV0dXJuICh0Z3QpOworfQorCisvKgorICogcWxhMngwMF9mY2x1bl9iaW5kCisgKglCaW5kcyBhbGwgRkMgZGV2aWNlIExVTlMgdG8gT1MgTFVOUy4KKyAqCisgKiBJbnB1dDoKKyAqCWhhOgkJYWRhcHRlciBzdGF0ZSBwb2ludGVyLgorICoJZmNwb3J0OgkJRkMgcG9ydCBzdHJ1Y3R1cmUgcG9pbnRlci4KKyAqCisgKiBSZXR1cm5zOgorICoJdGFyZ2V0IG51bWJlcgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworc3RhdGljIG9zX2x1bl90ICoKK3FsYTJ4MDBfZmNsdW5fYmluZChzY3NpX3FsYV9ob3N0X3QgKmhhLCBmY19wb3J0X3QgKmZjcG9ydCwgZmNfbHVuX3QgKmZjbHVuKQoreworCW9zX2x1bl90CSpscTsKKwl1aW50MTZfdAl0Z3Q7CisJdWludDE2X3QJbHVuOworCisJdGd0ID0gZmNwb3J0LT5vc190YXJnZXRfaWQ7CisJbHVuID0gZmNsdW4tPmx1bjsKKworCS8qIEFsbG9jYXRlIExVTnMgKi8KKwlpZiAobHVuID49IE1BWF9MVU5TKSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogVW5hYmxlIHRvIGJpbmQgbHVuLCBpbnZhbGlkICIKKwkJICAgICJsdW49KCV4KS5cbiIsIGhhLT5ob3N0X25vLCBsdW4pKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwkvKiBBbHdheXMgYWxsb2MgTFVOIDAgc28ga2VybmVsIHdpbGwgc2NhbiBwYXN0IExVTiAwLiAqLworCWlmIChsdW4gIT0gMCAmJiAoRVhUX0lTX0xVTl9CSVRfU0VUKCYoZmNwb3J0LT5sdW5fbWFzayksIGx1bikpKSB7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJaWYgKChscSA9IHFsYTJ4MDBfbHVuX2FsbG9jKGhhLCB0Z3QsIGx1bikpID09IE5VTEwpIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIlVuYWJsZSB0byBiaW5kIGZjbHVuLCBsb29wX2lkPSV4IGx1bj0leFxuIiwKKwkJICAgIGZjcG9ydC0+bG9vcF9pZCwgbHVuKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwlscS0+ZmNsdW4gPSBmY2x1bjsKKworCXJldHVybiAobHEpOworfQorCisvKgorICogcWxhMngwMF90Z3RfYWxsb2MKKyAqCUFsbG9jYXRlIGFuZCBwcmUtaW5pdGlhbGl6ZSB0YXJnZXQgcXVldWUuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCXQgPSBTQ1NJIHRhcmdldCBudW1iZXIuCisgKgorICogUmV0dXJuczoKKyAqCU5VTEwgPSBmYWlsdXJlCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitzdGF0aWMgb3NfdGd0X3QgKgorcWxhMngwMF90Z3RfYWxsb2Moc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgdGd0KSAKK3sKKwlvc190Z3RfdAkqdHE7CisKKwkvKgorCSAqIElmIFNDU0kgYWRkcmVzc2luZyBPSywgYWxsb2NhdGUgVEdUIHF1ZXVlIGFuZCBsb2NrLgorCSAqLworCWlmICh0Z3QgPj0gTUFYX1RBUkdFVFMpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBVbmFibGUgdG8gYWxsb2NhdGUgdGFyZ2V0LCBpbnZhbGlkICIKKwkJICAgICJ0YXJnZXQgbnVtYmVyICVkLlxuIiwgaGEtPmhvc3Rfbm8sIHRndCkpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCXRxID0gVEdUX1EoaGEsIHRndCk7CisJaWYgKHRxID09IE5VTEwpIHsKKwkJdHEgPSBrbWFsbG9jKHNpemVvZihvc190Z3RfdCksIEdGUF9BVE9NSUMpOworCQlpZiAodHEgIT0gTlVMTCkgeworCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBbGxvYyBUYXJnZXQgJWQgQCAlcFxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgdGd0LCB0cSkpOworCisJCQltZW1zZXQodHEsIDAsIHNpemVvZihvc190Z3RfdCkpOworCQkJdHEtPmhhID0gaGE7CisKKwkJCVRHVF9RKGhhLCB0Z3QpID0gdHE7CisJCX0KKwl9CisJaWYgKHRxICE9IE5VTEwpIHsKKwkJdHEtPnBvcnRfZG93bl9yZXRyeV9jb3VudCA9IGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQ7CisJfSBlbHNlIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSB0YXJnZXQuXG4iKTsKKwkJaGEtPm1lbV9lcnIrKzsKKwl9CisKKwlyZXR1cm4gKHRxKTsKK30KKworLyoKKyAqIHFsYTJ4MDBfdGd0X2ZyZWUKKyAqCUZyZWVzIHRhcmdldCBhbmQgTFVOIHF1ZXVlcy4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJdCA9IFNDU0kgdGFyZ2V0IG51bWJlci4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK3ZvaWQKK3FsYTJ4MDBfdGd0X2ZyZWUoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgdGd0KSAKK3sKKwlvc190Z3RfdAkqdHE7CisJdWludDE2X3QJbHVuOworCisJLyoKKwkgKiBJZiBTQ1NJIGFkZHJlc3NpbmcgT0ssIGFsbG9jYXRlIFRHVCBxdWV1ZSBhbmQgbG9jay4KKwkgKi8KKwlpZiAodGd0ID49IE1BWF9UQVJHRVRTKSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogVW5hYmxlIHRvIGRlLWFsbG9jYXRlIHRhcmdldCwgIgorCQkgICAgImludmFsaWQgdGFyZ2V0IG51bWJlciAlZC5cbiIsIGhhLT5ob3N0X25vLCB0Z3QpKTsKKworCQlyZXR1cm47CisJfQorCisJdHEgPSBUR1RfUShoYSwgdGd0KTsKKwlpZiAodHEgIT0gTlVMTCkgeworCQlUR1RfUShoYSwgdGd0KSA9IE5VTEw7CisKKwkJLyogRnJlZSBMVU4gc3RydWN0dXJlcy4gKi8KKwkJZm9yIChsdW4gPSAwOyBsdW4gPCBNQVhfTFVOUzsgbHVuKyspCisJCQlxbGEyeDAwX2x1bl9mcmVlKGhhLCB0Z3QsIGx1bik7CisKKwkJa2ZyZWUodHEpOworCX0KKworCXJldHVybjsKK30KKworLyoKKyAqIHFsYTJ4MDBfbHVuX2FsbG9jCisgKglBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBMVU4gcXVldWUuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCXQgPSBTQ1NJIHRhcmdldCBudW1iZXIuCisgKglsID0gTFVOIG51bWJlci4KKyAqCisgKiBSZXR1cm5zOgorICoJTlVMTCA9IGZhaWx1cmUKKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK3N0YXRpYyBvc19sdW5fdCAqCitxbGEyeDAwX2x1bl9hbGxvYyhzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCB0Z3QsIHVpbnQxNl90IGx1bikgCit7CisJb3NfbHVuX3QJKmxxOworCisJLyoKKwkgKiBJZiBTQ1NJIGFkZHJlc3NpbmcgT0ssIGFsbG9jYXRlIExVTiBxdWV1ZS4KKwkgKi8KKwlpZiAodGd0ID49IE1BWF9UQVJHRVRTIHx8IGx1biA+PSBNQVhfTFVOUyB8fCBUR1RfUShoYSwgdGd0KSA9PSBOVUxMKSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogVW5hYmxlIHRvIGFsbG9jYXRlIGx1biwgaW52YWxpZCAiCisJCSAgICAicGFyYW1ldGVyLlxuIiwgaGEtPmhvc3Rfbm8pKTsKKworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCWxxID0gTFVOX1EoaGEsIHRndCwgbHVuKTsKKwlpZiAobHEgPT0gTlVMTCkgeworCQlscSA9IGttYWxsb2Moc2l6ZW9mKG9zX2x1bl90KSwgR0ZQX0FUT01JQyk7CisJCWlmIChscSAhPSBOVUxMKSB7CisJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFsbG9jIEx1biAlZCBAIHRndCAlZC5cbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8sIGx1biwgdGd0KSk7CisKKwkJCW1lbXNldChscSwgMCwgc2l6ZW9mKG9zX2x1bl90KSk7CisJCQlMVU5fUShoYSwgdGd0LCBsdW4pID0gbHE7CisKKwkJCS8qCisJCQkgKiBUaGUgZm9sbG93aW5nIGx1biBxdWV1ZSBpbml0aWFsaXphdGlvbiBjb2RlCisJCQkgKiBtdXN0IGJlIGR1cGxpY2F0ZWQgaW4gYWxsb2NfaW9jdGxfbWVtIGZ1bmN0aW9uCisJCQkgKiBmb3IgaW9jdGxfbHEuCisJCQkgKi8KKwkJCWxxLT5xX3N0YXRlID0gTFVOX1NUQVRFX1JFQURZOworCQkJc3Bpbl9sb2NrX2luaXQoJmxxLT5xX2xvY2spOworCQl9CisJfQorCisJaWYgKGxxID09IE5VTEwpIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiVW5hYmxlIHRvIGFsbG9jYXRlIGx1bi5cbiIpOworCX0KKworCXJldHVybiAobHEpOworfQorCisvKgorICogcWxhMngwMF9sdW5fZnJlZQorICoJRnJlZXMgTFVOIHF1ZXVlLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKgl0ID0gU0NTSSB0YXJnZXQgbnVtYmVyLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfbHVuX2ZyZWUoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgdGd0LCB1aW50MTZfdCBsdW4pIAoreworCW9zX2x1bl90CSpscTsKKworCS8qCisJICogSWYgU0NTSSBhZGRyZXNzaW5nIE9LLCBhbGxvY2F0ZSBUR1QgcXVldWUgYW5kIGxvY2suCisJICovCisJaWYgKHRndCA+PSBNQVhfVEFSR0VUUyB8fCBsdW4gPj0gTUFYX0xVTlMpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBVbmFibGUgdG8gZGVhbGxvY2F0ZSBsdW4sIGludmFsaWQgIgorCQkgICAgInBhcmFtZXRlci5cbiIsIGhhLT5ob3N0X25vKSk7CisKKwkJcmV0dXJuOworCX0KKworCWlmIChUR1RfUShoYSwgdGd0KSAhPSBOVUxMICYmIChscSA9IExVTl9RKGhhLCB0Z3QsIGx1bikpICE9IE5VTEwpIHsKKwkJTFVOX1EoaGEsIHRndCwgbHVuKSA9IE5VTEw7CisJCWtmcmVlKGxxKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisqICBxbGEyeDAwX2Fib3J0X2lzcAorKiAgICAgIFJlc2V0cyBJU1AgYW5kIGFib3J0cyBhbGwgb3V0c3RhbmRpbmcgY29tbWFuZHMuCisqCisqIElucHV0OgorKiAgICAgIGhhICAgICAgICAgICA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyoKKyogUmV0dXJuczoKKyogICAgICAwID0gc3VjY2VzcworKi8KK2ludAorcWxhMngwMF9hYm9ydF9pc3Aoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwl1aW50MTZfdCAgICAgICBjbnQ7CisJc3JiX3QgICAgICAgICAgKnNwOworCXVpbnQ4X3QgICAgICAgIHN0YXR1cyA9IDA7CisKKwlpZiAoaGEtPmZsYWdzLm9ubGluZSkgeworCQloYS0+ZmxhZ3Mub25saW5lID0gMDsKKwkJY2xlYXJfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJcWxhMngwMF9zdGF0cy5pc3BBYm9ydCsrOworCQloYS0+dG90YWxfaXNwX2Fib3J0cysrOyAgLyogdXNlZCBieSBpb2N0bCAqLworCQloYS0+c25zX3JldHJ5X2NudCA9IDA7CisKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkgICAgIlBlcmZvcm1pbmcgSVNQIGVycm9yIHJlY292ZXJ5IC0gaGE9ICVwLlxuIiwgaGEpOworCQlxbGEyeDAwX3Jlc2V0X2NoaXAoaGEpOworCisJCWF0b21pY19zZXQoJmhhLT5sb29wX2Rvd25fdGltZXIsIExPT1BfRE9XTl9USU1FKTsKKwkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9ET1dOKSB7CisJCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9ET1dOKTsKKwkJCXFsYTJ4MDBfbWFya19hbGxfZGV2aWNlc19sb3N0KGhhKTsKKwkJfSBlbHNlIHsKKwkJCWlmICghYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpKQorCQkJCWF0b21pY19zZXQoJmhhLT5sb29wX2Rvd25fdGltZXIsCisJCQkJICAgIExPT1BfRE9XTl9USU1FKTsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCQkvKiBSZXF1ZXVlIGFsbCBjb21tYW5kcyBpbiBvdXRzdGFuZGluZyBjb21tYW5kIGxpc3QuICovCisJCWZvciAoY250ID0gMTsgY250IDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTOyBjbnQrKykgeworCQkJc3AgPSBoYS0+b3V0c3RhbmRpbmdfY21kc1tjbnRdOworCQkJaWYgKHNwKSB7CisJCQkJaGEtPm91dHN0YW5kaW5nX2NtZHNbY250XSA9IE5VTEw7CisJCQkJaWYgKGhhLT5hY3R0aHJlYWRzKQorCQkJCQloYS0+YWN0dGhyZWFkcy0tOworCQkJCXNwLT5sdW5fcXVldWUtPm91dF9jbnQtLTsKKworCQkJCS8qCisJCQkJICogU2V0IHRoZSBjbWQgaG9zdF9ieXRlIHN0YXR1cyBkZXBlbmRpbmcgb24KKwkJCQkgKiB3aGV0aGVyIHRoZSBzY3NpX2Vycm9yX2hhbmRsZXIgaXMKKwkJCQkgKiBhY3RpdmUgb3Igbm90LgorIAkJCQkgKi8KKwkJCQlpZiAoc3AtPmZsYWdzICYgU1JCX1RBUEUpIHsKKwkJCQkJc3AtPmNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGhhLT5ob3N0LT5laF9hY3RpdmUgIT0gRUhfQUNUSVZFKQorCQkJCQkJc3AtPmNtZC0+cmVzdWx0ID0KKwkJCQkJCSAgICBESURfQlVTX0JVU1kgPDwgMTY7CisJCQkJCWVsc2UKKwkJCQkJCXNwLT5jbWQtPnJlc3VsdCA9CisJCQkJCQkgICAgRElEX1JFU0VUIDw8IDE2OworCQkJCX0KKwkJCQlzcC0+ZmxhZ3MgPSAwOworCQkJCXNwLT5jbWQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKU5VTEw7CisJCQkJYWRkX3RvX2RvbmVfcXVldWUoaGEsIHNwKTsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJCXFsYTJ4MDBfbnZyYW1fY29uZmlnKGhhKTsKKworCQlpZiAoIXFsYTJ4MDBfcmVzdGFydF9pc3AoaGEpKSB7CisJCQljbGVhcl9iaXQoUkVTRVRfTUFSS0VSX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCisJCQlpZiAoIWF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSkgeworCQkJCS8qCisJCQkJICogSXNzdWUgbWFya2VyIGNvbW1hbmQgb25seSB3aGVuIHdlIGFyZSBnb2luZworCQkJCSAqIHRvIHN0YXJ0IHRoZSBJL08gLgorCQkJCSAqLworCQkJCWhhLT5tYXJrZXJfbmVlZGVkID0gMTsKKwkJCX0KKworCQkJaGEtPmZsYWdzLm9ubGluZSA9IDE7CisKKwkJCS8qIEVuYWJsZSBJU1AgaW50ZXJydXB0cy4gKi8KKwkJCXFsYTJ4MDBfZW5hYmxlX2ludHJzKGhhKTsKKworCQkJLyogdjIuMTkuNWI2IFJldHVybiBhbGwgY29tbWFuZHMgKi8KKwkJCXFsYTJ4MDBfYWJvcnRfcXVldWVzKGhhLCAxKTsKKworCQkJLyogUmVzdGFydCBxdWV1ZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIHN0b3BwZWQuICovCisJCQlxbGEyeDAwX3Jlc3RhcnRfcXVldWVzKGhhLCAxKTsKKwkJCWhhLT5pc3BfYWJvcnRfY250ID0gMDsgCisJCQljbGVhcl9iaXQoSVNQX0FCT1JUX1JFVFJZLCAmaGEtPmRwY19mbGFncyk7CisJCX0gZWxzZSB7CS8qIGZhaWxlZCB0aGUgSVNQIGFib3J0ICovCisJCQloYS0+ZmxhZ3Mub25saW5lID0gMTsKKwkJCWlmICh0ZXN0X2JpdChJU1BfQUJPUlRfUkVUUlksICZoYS0+ZHBjX2ZsYWdzKSkgeworCQkJCWlmIChoYS0+aXNwX2Fib3J0X2NudCA9PSAwKSB7CisgCQkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkJCSAgICAiSVNQIGVycm9yIHJlY292ZXJ5IGZhaWxlZCAtICIKKwkJCQkJICAgICJib2FyZCBkaXNhYmxlZFxuIik7CisJCQkJCS8qIAorCQkJCQkgKiBUaGUgbmV4dCBjYWxsIGRpc2FibGVzIHRoZSBib2FyZAorCQkJCQkgKiBjb21wbGV0ZWx5LgorCQkJCQkgKi8KKwkJCQkJcWxhMngwMF9yZXNldF9hZGFwdGVyKGhhKTsKKwkJCQkJcWxhMngwMF9hYm9ydF9xdWV1ZXMoaGEsIDApOworCQkJCQloYS0+ZmxhZ3Mub25saW5lID0gMDsKKwkJCQkJY2xlYXJfYml0KElTUF9BQk9SVF9SRVRSWSwKKwkJCQkJICAgICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQkJc3RhdHVzID0gMDsKKwkJCQl9IGVsc2UgeyAvKiBzY2hlZHVsZSBhbm90aGVyIElTUCBhYm9ydCAqLworCQkJCQloYS0+aXNwX2Fib3J0X2NudC0tOworCQkJCQlERUJVRyhwcmludGsoInFsYSVsZDogSVNQIGFib3J0IC0gIgorCQkJCQkgICAgInJldHJ5IHJlbWFpbm5pbmcgJWRcbiIsCisJCQkJCSAgICBoYS0+aG9zdF9ubywgaGEtPmlzcF9hYm9ydF9jbnQpOykKKwkJCQkJc3RhdHVzID0gMTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWhhLT5pc3BfYWJvcnRfY250ID0gTUFYX1JFVFJJRVNfT0ZfSVNQX0FCT1JUOworCQkJCURFQlVHKHByaW50aygicWxhMngwMCglbGQpOiBJU1AgZXJyb3IgcmVjb3ZlcnkgIgorCQkJCSAgICAiLSByZXRyeWluZyAoJWQpIG1vcmUgdGltZXNcbiIsCisJCQkJICAgIGhhLT5ob3N0X25vLCBoYS0+aXNwX2Fib3J0X2NudCk7KQorCQkJCXNldF9iaXQoSVNQX0FCT1JUX1JFVFJZLCAmaGEtPmRwY19mbGFncyk7CisJCQkJc3RhdHVzID0gMTsKKwkJCX0KKwkJfQorCQkgICAgICAgCisJfQorCisJaWYgKHN0YXR1cykgeworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkicWxhMngwMF9hYm9ydF9pc3A6ICoqKiogRkFJTEVEICoqKipcbiIpOworCX0gZWxzZSB7CisJCURFQlVHKHByaW50ayhLRVJOX0lORk8KKwkJCQkicWxhMngwMF9hYm9ydF9pc3AoJWxkKTogZXhpdGluZy5cbiIsCisJCQkJaGEtPmhvc3Rfbm8pOykKKwl9CisKKwlyZXR1cm4oc3RhdHVzKTsKK30KKworLyoKKyogIHFsYTJ4MDBfcmVzdGFydF9pc3AKKyogICAgICByZXN0YXJ0cyB0aGUgSVNQIGFmdGVyIGEgcmVzZXQKKyoKKyogSW5wdXQ6CisqICAgICAgaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisqCisqIFJldHVybnM6CisqICAgICAgMCA9IHN1Y2Nlc3MKKyovCitzdGF0aWMgaW50CitxbGEyeDAwX3Jlc3RhcnRfaXNwKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJdWludDhfdAkJc3RhdHVzID0gMDsKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzID0gMDsKKwl1aW50MzJfdCB3YWl0X3RpbWU7CisKKwkvKiBJZiBmaXJtd2FyZSBuZWVkcyB0byBiZSBsb2FkZWQgKi8KKwlpZiAocWxhMngwMF9pc3BfZmlybXdhcmUoaGEpKSB7CisJCWhhLT5mbGFncy5vbmxpbmUgPSAwOworCQlpZiAoIShzdGF0dXMgPSBxbGEyeDAwX2NoaXBfZGlhZyhoYSkpKSB7CisJCQlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpIHsKKwkJCQlzdGF0dXMgPSBxbGEyeDAwX3NldHVwX2NoaXAoaGEpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKworCQkJcmVnID0gaGEtPmlvYmFzZTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwkJCS8qIERpc2FibGUgU1JBTSwgSW5zdHJ1Y3Rpb24gUkFNIGFuZCBHUCBSQU0gcGFyaXR5LiAqLworCQkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIChIQ0NSX0VOQUJMRV9QQVJJVFkgKyAweDApKTsKKwkJCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwkKKwkJCXN0YXR1cyA9IHFsYTJ4MDBfc2V0dXBfY2hpcChoYSk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworIAorIAkJCS8qIEVuYWJsZSBwcm9wZXIgcGFyaXR5ICovCisgCQkJaWYgKElTX1FMQTIzMDAoaGEpKQorIAkJCQkvKiBTUkFNIHBhcml0eSAqLworIAkJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwKKyAJCQkJICAgIChIQ0NSX0VOQUJMRV9QQVJJVFkgKyAweDEpKTsKKyAJCQllbHNlCisgCQkJCS8qIFNSQU0sIEluc3RydWN0aW9uIFJBTSBhbmQgR1AgUkFNIHBhcml0eSAqLworIAkJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwKKyAJCQkJICAgIChIQ0NSX0VOQUJMRV9QQVJJVFkgKyAweDcpKTsKKwkJCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwkJfQorCX0KKworIGRvbmU6CisJaWYgKCFzdGF0dXMgJiYgIShzdGF0dXMgPSBxbGEyeDAwX2luaXRfcmluZ3MoaGEpKSkgeworCQljbGVhcl9iaXQoUkVTRVRfTUFSS0VSX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQlpZiAoIShzdGF0dXMgPSBxbGEyeDAwX2Z3X3JlYWR5KGhhKSkpIHsKKwkJCURFQlVHKHByaW50aygiJXMoKTogU3RhcnQgY29uZmlndXJlIGxvb3AsICIKKwkJCQkJInN0YXR1cyA9ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywKKwkJCQkJc3RhdHVzKTspCisJCQloYS0+ZmxhZ3Mub25saW5lID0gMTsKKwkJCS8qIFdhaXQgYXQgbW9zdCBNQVhfVEFSR0VUIFJTQ05zIGZvciBhIHN0YWJsZSBsaW5rLiAqLworCQkJd2FpdF90aW1lID0gMjU2OworCQkJZG8geworCQkJCWNsZWFyX2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQlxbGEyeDAwX2NvbmZpZ3VyZV9sb29wKGhhKTsKKwkJCQl3YWl0X3RpbWUtLTsKKwkJCX0gd2hpbGUgKCFhdG9taWNfcmVhZCgmaGEtPmxvb3BfZG93bl90aW1lcikgJiYKKwkJCQkhKHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkgJiYKKwkJCQl3YWl0X3RpbWUgJiYKKwkJCQkodGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncykpKTsKKwkJfQorCisJCS8qIGlmIG5vIGNhYmxlIHRoZW4gYXNzdW1lIGl0J3MgZ29vZCAqLworCQlpZiAoKGhhLT5kZXZpY2VfZmxhZ3MgJiBERkxHX05PX0NBQkxFKSkgCisJCQlzdGF0dXMgPSAwOworCisJCURFQlVHKHByaW50aygiJXMoKTogQ29uZmlndXJlIGxvb3AgZG9uZSwgc3RhdHVzID0gMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlzdGF0dXMpOykKKwl9CisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKgorKiBxbGEyeDAwX3Jlc2V0X2FkYXB0ZXIKKyogICAgICBSZXNldCBhZGFwdGVyLgorKgorKiBJbnB1dDoKKyogICAgICBoYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyovCitzdGF0aWMgdm9pZAorcWxhMngwMF9yZXNldF9hZGFwdGVyKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisKKwloYS0+ZmxhZ3Mub25saW5lID0gMDsKKwlxbGEyeDAwX2Rpc2FibGVfaW50cnMoaGEpOworCisJLyogUmVzZXQgUklTQyBwcm9jZXNzb3IuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfUkVTRVRfUklTQyk7CisJUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CQkJLyogUENJIFBvc3RpbmcuICovCisJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfUkVMRUFTRV9SSVNDKTsKKwlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsJCQkvKiBQQ0kgUG9zdGluZy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lubGluZS5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lubGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzExMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5saW5lLmgKQEAgLTAsMCArMSwyOTIgQEAKKy8qCisgKiAgICAgICAgICAgICAgICAgIFFMT0dJQyBMSU5VWCBTT0ZUV0FSRQorICoKKyAqIFFMb2dpYyBJU1AyeDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBRTG9naWMgQ29ycG9yYXRpb24KKyAqICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKworc3RhdGljIF9faW5saW5lX18gdWludDE2X3QgcWxhMngwMF9kZWJvdW5jZV9yZWdpc3Rlcih2b2xhdGlsZSB1aW50MTZfdCBfX2lvbWVtICopOworLyoKKyAqIHFsYTJ4MDBfZGVib3VuY2VfcmVnaXN0ZXIKKyAqICAgICAgRGVib3VuY2UgcmVnaXN0ZXIuCisgKgorICogSW5wdXQ6CisgKiAgICAgIHBvcnQgPSByZWdpc3RlciBhZGRyZXNzLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgIHJlZ2lzdGVyIHZhbHVlLgorICovCitzdGF0aWMgX19pbmxpbmVfXyB1aW50MTZfdAorcWxhMngwMF9kZWJvdW5jZV9yZWdpc3Rlcih2b2xhdGlsZSB1aW50MTZfdCBfX2lvbWVtICphZGRyKSAKK3sKKwl2b2xhdGlsZSB1aW50MTZfdCBmaXJzdDsKKwl2b2xhdGlsZSB1aW50MTZfdCBzZWNvbmQ7CisKKwlkbyB7CisJCWZpcnN0ID0gUkRfUkVHX1dPUkQoYWRkcik7CisJCWJhcnJpZXIoKTsKKwkJY3B1X3JlbGF4KCk7CisJCXNlY29uZCA9IFJEX1JFR19XT1JEKGFkZHIpOworCX0gd2hpbGUgKGZpcnN0ICE9IHNlY29uZCk7CisKKwlyZXR1cm4gKGZpcnN0KTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHFsYTJ4MDBfbm9ybWFsaXplX2RtYV9hZGRyKAorICAgIGRtYV9hZGRyX3QgKmVfYWRkciwgIHVpbnQzMl90ICplX2xlbiwKKyAgICBkbWFfYWRkcl90ICpuZV9hZGRyLCB1aW50MzJfdCAqbmVfbGVuKTsKKworLyoqCisgKiBxbGEyeDAwX25vcm1hbGl6ZV9kbWFfYWRkcigpIC0gTm9ybWFsaXplIGFuIERNQSBhZGRyZXNzLgorICogQGVfYWRkcjogUmF3IERNQSBhZGRyZXNzCisgKiBAZV9sZW46IFJhdyBETUEgbGVuZ3RoCisgKiBAbmVfYWRkcjogTm9ybWFsaXplZCBzZWNvbmQgRE1BIGFkZHJlc3MKKyAqIEBuZV9sZW46IE5vcm1hbGl6ZWQgc2Vjb25kIERNQSBsZW5ndGgKKyAqCisgKiBJZiB0aGUgYWRkcmVzcyBkb2VzIG5vdCBzcGFuIGEgNEdCIHBhZ2UgYm91bmRhcnksIHRoZSBjb250ZW50cyBvZiBAbmVfYWRkcgorICogYW5kIEBuZV9sZW4gYXJlIHVuZGVmaW5lZC4gIEBlX2xlbiBpcyB1cGRhdGVkIHRvIHJlZmxlY3QgYSBub3JtYWxpemF0aW9uLgorICoKKyAqIEV4YW1wbGU6CisgKgorICogCWZmZmZhYmMwZmZmZmVlZWUJKGVfYWRkcikgc3RhcnQgb2YgRE1BIGFkZHJlc3MKKyAqIAkwMDAwMDAwMDIwMDAwMDAwCShlX2xlbikgIGxlbmd0aCBvZiBETUEgdHJhbnNmZXIKKyAqCWZmZmZhYmMxMWZmZmVlZWQJZW5kIG9mIERNQSB0cmFuc2ZlcgorICoKKyAqIElzIHRoZSA0R0IgYm91bmRhcnkgY3Jvc3NlZD8KKyAqCisgKiAJZmZmZmFiYzBmZmZmZWVlZQkoZV9hZGRyKQorICoJZmZmZmFiYzExZmZmZWVlZAkoZV9hZGRyICsgZV9sZW4gLSAxKQorICoJMDAwMDAwMDFlMDAwMDAwMwkoKGVfYWRkciBeIChlX2FkZHIgKyBlX2xlbiAtIDEpKQorICoJMDAwMDAwMDEwMDAwMDAwMAkoKGVfYWRkciBeIChlX2FkZHIgKyBlX2xlbiAtIDEpKSAmIH4oMHhmZmZmZmZmZikKKyAqCisgKiBDb21wdXRlIHN0YXJ0IG9mIHNlY29uZCBETUEgc2VnbWVudDoKKyAqCisgKiAJZmZmZmFiYzBmZmZmZWVlZQkoZV9hZGRyKQorICoJZmZmZmFiYzFmZmZmZWVlZQkoMHgxMDAwMDAwMDAgKyBlX2FkZHIpCisgKglmZmZmYWJjMTAwMDAwMDAwCSgweDEwMDAwMDAwMCArIGVfYWRkcikgJiB+KDB4ZmZmZmZmZmYpCisgKglmZmZmYWJjMTAwMDAwMDAwCShuZV9hZGRyKQorICoJCisgKiBDb21wdXRlIGxlbmd0aCBvZiBzZWNvbmQgRE1BIHNlZ21lbnQ6CisgKgorICoJMDAwMDAwMDBmZmZmZWVlZQkoZV9hZGRyICYgMHhmZmZmZmZmZikKKyAqCTAwMDAwMDAwMDAwMDExMTIJKDB4MTAwMDAwMDAwIC0gKGVfYWRkciAmIDB4ZmZmZmZmZmYpKQorICoJMDAwMDAwMDAxZmZmZWVlZQkoZV9sZW4gLSAoMHgxMDAwMDAwMDAgLSAoZV9hZGRyICYgMHhmZmZmZmZmZikpCisgKgkwMDAwMDAwMDFmZmZlZWVlCShuZV9sZW4pCisgKgorICogQWRqdXN0IGxlbmd0aCBvZiBmaXJzdCBETUEgc2VnbWVudAorICoKKyAqIAkwMDAwMDAwMDIwMDAwMDAwCShlX2xlbikKKyAqCTAwMDAwMDAwMDAwMDExMTIJKGVfbGVuIC0gbmVfbGVuKQorICoJMDAwMDAwMDAwMDAwMTExMgkoZV9sZW4pCisgKgorICogUmV0dXJucyBub24temVybyBpZiB0aGUgc3BlY2lmaWVkIGFkZHJlc3Mgd2FzIG5vcm1hbGl6ZWQsIGVsc2UgemVyby4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50CitxbGEyeDAwX25vcm1hbGl6ZV9kbWFfYWRkcigKKyAgICBkbWFfYWRkcl90ICplX2FkZHIsICB1aW50MzJfdCAqZV9sZW4sCisgICAgZG1hX2FkZHJfdCAqbmVfYWRkciwgdWludDMyX3QgKm5lX2xlbikKK3sKKwlpbnQgbm9ybWFsaXplZDsKKworCW5vcm1hbGl6ZWQgPSAwOworCWlmICgoKmVfYWRkciBeICgqZV9hZGRyICsgKmVfbGVuIC0gMSkpICYgfigweEZGRkZGRkZGVUxMKSkgeworCQkvKiBDb21wdXRlIG5vcm1hbGl6ZWQgY3Jvc3NlZCBhZGRyZXNzIGFuZCBsZW4gKi8KKwkJKm5lX2FkZHIgPSAoMHgxMDAwMDAwMDBVTEwgKyAqZV9hZGRyKSAmIH4oMHhGRkZGRkZGRlVMTCk7CisJCSpuZV9sZW4gPSAqZV9sZW4gLSAoMHgxMDAwMDAwMDBVTEwgLSAoKmVfYWRkciAmIDB4RkZGRkZGRkZVTEwpKTsKKwkJKmVfbGVuIC09ICpuZV9sZW47CisKKwkJbm9ybWFsaXplZCsrOworCX0KKwlyZXR1cm4gKG5vcm1hbGl6ZWQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHFsYTJ4MDBfcG9sbChzY3NpX3FsYV9ob3N0X3QgKik7CitzdGF0aWMgaW5saW5lIHZvaWQgCitxbGEyeDAwX3BvbGwoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpCisJCXFsYTIxMDBfaW50cl9oYW5kbGVyKDAsIGhhLCBOVUxMKTsKKwllbHNlCisJCXFsYTIzMDBfaW50cl9oYW5kbGVyKDAsIGhhLCBOVUxMKTsKK30KKworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHFsYTJ4MDBfZW5hYmxlX2ludHJzKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcWxhMngwMF9kaXNhYmxlX2ludHJzKHNjc2lfcWxhX2hvc3RfdCAqKTsKKworc3RhdGljIGlubGluZSB2b2lkIAorcWxhMngwMF9lbmFibGVfaW50cnMoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCWhhLT5pbnRlcnJ1cHRzX29uID0gMTsKKwkvKiBlbmFibGUgcmlzYyBhbmQgaG9zdCBpbnRlcnJ1cHRzICovCisJV1JUX1JFR19XT1JEKCZyZWctPmljdHJsLCBJQ1JfRU5fSU5UIHwgSUNSX0VOX1JJU0MpOworCVJEX1JFR19XT1JEKCZyZWctPmljdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAKK3FsYTJ4MDBfZGlzYWJsZV9pbnRycyhzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJaGEtPmludGVycnVwdHNfb24gPSAwOworCS8qIGRpc2FibGUgcmlzYyBhbmQgaG9zdCBpbnRlcnJ1cHRzICovCisJV1JUX1JFR19XT1JEKCZyZWctPmljdHJsLCAwKTsKKwlSRF9SRUdfV09SRCgmcmVnLT5pY3RybCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcWxhMngwMF9pc193d25femVybyh1aW50OF90ICopOworCisvKgorICogcWxhMngwMF9pc193d25femVybyAtIENoZWNrIGZvciB6ZXJvIG5vZGUgbmFtZQorICoKKyAqIElucHV0OgorICogICAgICB3d24gPSBQb2ludGVyIHRvIFdXIG5hbWUgdG8gY2hlY2sKKyAqCisgKiBSZXR1cm5zOgorICogICAgICAxIGlmIG5hbWUgaXMgMHgwMCBlbHNlIDAKKyAqCisgKiBDb250ZXh0OgorICogICAgICBLZXJuZWwgY29udGV4dC4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50CitxbGEyeDAwX2lzX3d3bl96ZXJvKHVpbnQ4X3QgKnd3bikKK3sKKwlpbnQgY250OworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBXV05fU0laRSA7IGNudCsrLCB3d24rKykgeworCQlpZiAoKnd3biAhPSAwKQorCQkJYnJlYWs7CisJfQorCS8qIGlmIHplcm8gcmV0dXJuIDEgKi8KKwlpZiAoY250ID09IFdXTl9TSVpFKQorCQlyZXR1cm4gKDEpOworCWVsc2UKKwkJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdWludDhfdAorcWxhMngwMF9zdXNwZW5kX2x1bihzY3NpX3FsYV9ob3N0X3QgKiwgb3NfbHVuX3QgKiwgaW50LCBpbnQpOworc3RhdGljIF9faW5saW5lX18gdWludDhfdAorcWxhMngwMF9kZWxheV9sdW4oc2NzaV9xbGFfaG9zdF90ICosIG9zX2x1bl90ICosIGludCk7CisKK3N0YXRpYyBfX2lubGluZV9fIHVpbnQ4X3QKK3FsYTJ4MDBfc3VzcGVuZF9sdW4oc2NzaV9xbGFfaG9zdF90ICpoYSwgb3NfbHVuX3QgKmxxLCBpbnQgdGltZSwgaW50IGNvdW50KQoreworCXJldHVybiAoX19xbGEyeDAwX3N1c3BlbmRfbHVuKGhhLCBscSwgdGltZSwgY291bnQsIDApKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdWludDhfdAorcWxhMngwMF9kZWxheV9sdW4oc2NzaV9xbGFfaG9zdF90ICpoYSwgb3NfbHVuX3QgKmxxLCBpbnQgdGltZSkKK3sKKwlyZXR1cm4gKF9fcWxhMngwMF9zdXNwZW5kX2x1bihoYSwgbHEsIHRpbWUsIDEsIDEpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBxbGEyeDAwX2NoZWNrX2ZhYnJpY19kZXZpY2VzKHNjc2lfcWxhX2hvc3RfdCAqKTsKKy8qCisgKiBUaGlzIHJvdXRpbmUgd2lsbCB3YWl0IGZvciBmYWJyaWMgZGV2aWNlcyBmb3IKKyAqIHRoZSByZXNldCBkZWxheS4KKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBxbGEyeDAwX2NoZWNrX2ZhYnJpY19kZXZpY2VzKHNjc2lfcWxhX2hvc3RfdCAqaGEpIAoreworCXVpbnQxNl90CWZ3X3N0YXRlOworCisJcWxhMngwMF9nZXRfZmlybXdhcmVfc3RhdGUoaGEsICZmd19zdGF0ZSk7Cit9CisKKy8qKgorICogcWxhMngwMF9pc3N1ZV9tYXJrZXIoKSAtIElzc3VlIGEgTWFya2VyIElPQ0IgaWYgbmVjZXNzYXJ5LgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAaGFfbG9ja2VkOiBpcyBmdW5jdGlvbiBjYWxsZWQgd2l0aCB0aGUgaGFyZHdhcmUgbG9jaworICoKKyAqIFJldHVybnMgbm9uLXplcm8gaWYgYSBmYWlsdXJlIG9jY3VyZWQsIGVsc2UgemVyby4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK3FsYTJ4MDBfaXNzdWVfbWFya2VyKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGludCBoYV9sb2NrZWQpCit7CisJLyogU2VuZCBtYXJrZXIgaWYgcmVxdWlyZWQgKi8KKwlpZiAoaGEtPm1hcmtlcl9uZWVkZWQgIT0gMCkgeworCQlpZiAoaGFfbG9ja2VkKSB7CisJCQlpZiAoX19xbGEyeDAwX21hcmtlcihoYSwgMCwgMCwgTUtfU1lOQ19BTEwpICE9CisJCQkgICAgUUxBX1NVQ0NFU1MpCisJCQkJcmV0dXJuIChRTEFfRlVOQ1RJT05fRkFJTEVEKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChxbGEyeDAwX21hcmtlcihoYSwgMCwgMCwgTUtfU1lOQ19BTEwpICE9CisJCQkgICAgUUxBX1NVQ0NFU1MpCisJCQkJcmV0dXJuIChRTEFfRlVOQ1RJT05fRkFJTEVEKTsKKwkJfQorCQloYS0+bWFya2VyX25lZWRlZCA9IDA7CisJfQorCXJldHVybiAoUUxBX1NVQ0NFU1MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHFsYTJ4MDBfYWRkX3RpbWVyX3RvX2NtZChzcmJfdCAqLCBpbnQpOworc3RhdGljIF9faW5saW5lX18gdm9pZCBxbGEyeDAwX2RlbGV0ZV90aW1lcl9mcm9tX2NtZChzcmJfdCAqKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgcWxhMngwMF9hZGRfdGltZXJfdG9fY21kCisqCisqIERlc2NyaXB0aW9uOgorKiAgICAgICBDcmVhdGVzIGEgdGltZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4gVGhlIHRpbWVvdXQgaXMgdXN1YWxseQorKiAgICAgICB0aGUgY29tbWFuZCB0aW1lIGZyb20ga2VybmVsIG1pbnVzIDIgc2Vjcy4KKyoKKyogSW5wdXQ6CisqICAgICBzcCAtIHBvaW50ZXIgdG8gdmFsaWRhdGUKKyoKKyogUmV0dXJuczoKKyogICAgIE5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMngwMF9hZGRfdGltZXJfdG9fY21kKHNyYl90ICpzcCwgaW50IHRpbWVvdXQpCit7CisJaW5pdF90aW1lcigmc3AtPnRpbWVyKTsKKwlzcC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0ICogSFo7CisJc3AtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgc3A7CisJc3AtPnRpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKCopICh1bnNpZ25lZCBsb25nKSlxbGEyeDAwX2NtZF90aW1lb3V0OworCWFkZF90aW1lcigmc3AtPnRpbWVyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgcWxhMngwMF9kZWxldGVfdGltZXJfZnJvbV9jbWQKKyoKKyogRGVzY3JpcHRpb246CisqICAgICAgIERlbGV0ZSB0aGUgdGltZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4KKyoKKyogSW5wdXQ6CisqICAgICBzcCAtIHBvaW50ZXIgdG8gdmFsaWRhdGUKKyoKKyogUmV0dXJuczoKKyogICAgIE5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAKK3FsYTJ4MDBfZGVsZXRlX3RpbWVyX2Zyb21fY21kKHNyYl90ICpzcCkKK3sKKwlpZiAoc3AtPnRpbWVyLmZ1bmN0aW9uICE9IE5VTEwpIHsKKwkJZGVsX3RpbWVyKCZzcC0+dGltZXIpOworCQlzcC0+dGltZXIuZnVuY3Rpb24gPSAgTlVMTDsKKwkJc3AtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgTlVMTDsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMDY2MDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jCkBAIC0wLDAgKzEsNjMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIFFMT0dJQyBMSU5VWCBTT0ZUV0FSRQorICoKKyAqIFFMb2dpYyBJU1AyeDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBRTG9naWMgQ29ycG9yYXRpb24KKyAqICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInFsYV9kZWYuaCIKKworI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgcWxhMngwMF9nZXRfY21kX2RpcmVjdGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOworc3RhdGljIGlubGluZSBjb250X2VudHJ5X3QgKnFsYTJ4MDBfcHJlcF9jb250X3R5cGUwX2lvY2Ioc2NzaV9xbGFfaG9zdF90ICopOworc3RhdGljIGlubGluZSBjb250X2E2NF9lbnRyeV90ICpxbGEyeDAwX3ByZXBfY29udF90eXBlMV9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyByZXF1ZXN0X3QgKnFsYTJ4MDBfcmVxX3BrdChzY3NpX3FsYV9ob3N0X3QgKmhhKTsKKworLyoqCisgKiBxbGEyeDAwX2dldF9jbWRfZGlyZWN0aW9uKCkgLSBEZXRlcm1pbmUgY29udHJvbF9mbGFnIGRhdGEgZGlyZWN0aW9uLgorICogQGNtZDogU0NTSSBjb21tYW5kCisgKgorICogUmV0dXJucyB0aGUgcHJvcGVyIENGXyogZGlyZWN0aW9uIGJhc2VkIG9uIENEQi4KKyAqLworc3RhdGljIGlubGluZSB1aW50MTZfdAorcWxhMngwMF9nZXRfY21kX2RpcmVjdGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJdWludDE2X3QgY2ZsYWdzOworCisJY2ZsYWdzID0gMDsKKworCS8qIFNldCB0cmFuc2ZlciBkaXJlY3Rpb24gKi8KKwlpZiAoY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKQorCQljZmxhZ3MgPSBDRl9XUklURTsKKwllbHNlIGlmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkKKwkJY2ZsYWdzID0gQ0ZfUkVBRDsKKwlyZXR1cm4gKGNmbGFncyk7Cit9CisKKy8qKgorICogcWxhMngwMF9jYWxjX2lvY2JzXzMyKCkgLSBEZXRlcm1pbmUgbnVtYmVyIG9mIENvbW1hbmQgVHlwZSAyIGFuZAorICogQ29udGludWF0aW9uIFR5cGUgMCBJT0NCcyB0byBhbGxvY2F0ZS4KKyAqCisgKiBAZHNkczogbnVtYmVyIG9mIGRhdGEgc2VnbWVudCBkZWNyaXB0b3JzIG5lZWRlZAorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBJT0NCIGVudHJpZXMgbmVlZGVkIHRvIHN0b3JlIEBkc2RzLgorICovCit1aW50MTZfdAorcWxhMngwMF9jYWxjX2lvY2JzXzMyKHVpbnQxNl90IGRzZHMpCit7CisJdWludDE2X3QgaW9jYnM7CisKKwlpb2NicyA9IDE7CisJaWYgKGRzZHMgPiAzKSB7CisJCWlvY2JzICs9IChkc2RzIC0gMykgLyA3OworCQlpZiAoKGRzZHMgLSAzKSAlIDcpCisJCQlpb2NicysrOworCX0KKwlyZXR1cm4gKGlvY2JzKTsKK30KKworLyoqCisgKiBxbGEyeDAwX2NhbGNfaW9jYnNfNjQoKSAtIERldGVybWluZSBudW1iZXIgb2YgQ29tbWFuZCBUeXBlIDMgYW5kCisgKiBDb250aW51YXRpb24gVHlwZSAxIElPQ0JzIHRvIGFsbG9jYXRlLgorICoKKyAqIEBkc2RzOiBudW1iZXIgb2YgZGF0YSBzZWdtZW50IGRlY3JpcHRvcnMgbmVlZGVkCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIElPQ0IgZW50cmllcyBuZWVkZWQgdG8gc3RvcmUgQGRzZHMuCisgKi8KK3VpbnQxNl90CitxbGEyeDAwX2NhbGNfaW9jYnNfNjQodWludDE2X3QgZHNkcykKK3sKKwl1aW50MTZfdCBpb2NiczsKKworCWlvY2JzID0gMTsKKwlpZiAoZHNkcyA+IDIpIHsKKwkJaW9jYnMgKz0gKGRzZHMgLSAyKSAvIDU7CisJCWlmICgoZHNkcyAtIDIpICUgNSkKKwkJCWlvY2JzKys7CisJfQorCXJldHVybiAoaW9jYnMpOworfQorCisvKioKKyAqIHFsYTJ4MDBfcHJlcF9jb250X3R5cGUwX2lvY2IoKSAtIEluaXRpYWxpemUgYSBDb250aW51YXRpb24gVHlwZSAwIElPQ0IuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgQ29udGludWF0aW9uIFR5cGUgMCBJT0NCIHBhY2tldC4KKyAqLworc3RhdGljIGlubGluZSBjb250X2VudHJ5X3QgKgorcWxhMngwMF9wcmVwX2NvbnRfdHlwZTBfaW9jYihzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWNvbnRfZW50cnlfdCAqY29udF9wa3Q7CisKKwkvKiBBZGp1c3QgcmluZyBpbmRleC4gKi8KKwloYS0+cmVxX3JpbmdfaW5kZXgrKzsKKwlpZiAoaGEtPnJlcV9yaW5nX2luZGV4ID09IGhhLT5yZXF1ZXN0X3FfbGVuZ3RoKSB7CisJCWhhLT5yZXFfcmluZ19pbmRleCA9IDA7CisJCWhhLT5yZXF1ZXN0X3JpbmdfcHRyID0gaGEtPnJlcXVlc3RfcmluZzsKKwl9IGVsc2UgeworCQloYS0+cmVxdWVzdF9yaW5nX3B0cisrOworCX0KKworCWNvbnRfcGt0ID0gKGNvbnRfZW50cnlfdCAqKWhhLT5yZXF1ZXN0X3JpbmdfcHRyOworCisJLyogTG9hZCBwYWNrZXQgZGVmYXVsdHMuICovCisJKigodWludDMyX3QgKikoJmNvbnRfcGt0LT5lbnRyeV90eXBlKSkgPQorCSAgICBfX2NvbnN0YW50X2NwdV90b19sZTMyKENPTlRJTlVFX1RZUEUpOworCisJcmV0dXJuIChjb250X3BrdCk7Cit9CisKKy8qKgorICogcWxhMngwMF9wcmVwX2NvbnRfdHlwZTFfaW9jYigpIC0gSW5pdGlhbGl6ZSBhIENvbnRpbnVhdGlvbiBUeXBlIDEgSU9DQi4KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjb250aW51YXRpb24gdHlwZSAxIElPQ0IgcGFja2V0LgorICovCitzdGF0aWMgaW5saW5lIGNvbnRfYTY0X2VudHJ5X3QgKgorcWxhMngwMF9wcmVwX2NvbnRfdHlwZTFfaW9jYihzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWNvbnRfYTY0X2VudHJ5X3QgKmNvbnRfcGt0OworCisJLyogQWRqdXN0IHJpbmcgaW5kZXguICovCisJaGEtPnJlcV9yaW5nX2luZGV4Kys7CisJaWYgKGhhLT5yZXFfcmluZ19pbmRleCA9PSBoYS0+cmVxdWVzdF9xX2xlbmd0aCkgeworCQloYS0+cmVxX3JpbmdfaW5kZXggPSAwOworCQloYS0+cmVxdWVzdF9yaW5nX3B0ciA9IGhhLT5yZXF1ZXN0X3Jpbmc7CisJfSBlbHNlIHsKKwkJaGEtPnJlcXVlc3RfcmluZ19wdHIrKzsKKwl9CisKKwljb250X3BrdCA9IChjb250X2E2NF9lbnRyeV90ICopaGEtPnJlcXVlc3RfcmluZ19wdHI7CisKKwkvKiBMb2FkIHBhY2tldCBkZWZhdWx0cy4gKi8KKwkqKCh1aW50MzJfdCAqKSgmY29udF9wa3QtPmVudHJ5X3R5cGUpKSA9CisJICAgIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoQ09OVElOVUVfQTY0X1RZUEUpOworCisJcmV0dXJuIChjb250X3BrdCk7Cit9CisKKy8qKgorICogcWxhMngwMF9idWlsZF9zY3NpX2lvY2JzXzMyKCkgLSBCdWlsZCBJT0NCIGNvbW1hbmQgdXRpbGl6aW5nIDMyYml0CisgKiBjYXBhYmxlIElPQ0IgdHlwZXMuCisgKgorICogQHNwOiBTUkIgY29tbWFuZCB0byBwcm9jZXNzCisgKiBAY21kX3BrdDogQ29tbWFuZCB0eXBlIDIgSU9DQgorICogQHRvdF9kc2RzOiBUb3RhbCBudW1iZXIgb2Ygc2VnbWVudHMgdG8gdHJhbnNmZXIKKyAqLwordm9pZCBxbGEyeDAwX2J1aWxkX3Njc2lfaW9jYnNfMzIoc3JiX3QgKnNwLCBjbWRfZW50cnlfdCAqY21kX3BrdCwKKyAgICB1aW50MTZfdCB0b3RfZHNkcykKK3sKKwl1aW50MTZfdAlhdmFpbF9kc2RzOworCXVpbnQzMl90CSpjdXJfZHNkOworCXNjc2lfcWxhX2hvc3RfdAkqaGE7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCisJY21kID0gc3AtPmNtZDsKKworCS8qIFVwZGF0ZSBlbnRyeSB0eXBlIHRvIGluZGljYXRlIENvbW1hbmQgVHlwZSAyIElPQ0IgKi8KKwkqKCh1aW50MzJfdCAqKSgmY21kX3BrdC0+ZW50cnlfdHlwZSkpID0KKwkgICAgX19jb25zdGFudF9jcHVfdG9fbGUzMihDT01NQU5EX1RZUEUpOworCisJLyogTm8gZGF0YSB0cmFuc2ZlciAqLworCWlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbiA9PSAwIHx8IGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX05PTkUpIHsKKwkJY21kX3BrdC0+Ynl0ZV9jb3VudCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMCk7CisJCXJldHVybjsKKwl9CisKKwloYSA9IHNwLT5oYTsKKworCWNtZF9wa3QtPmNvbnRyb2xfZmxhZ3MgfD0gY3B1X3RvX2xlMTYocWxhMngwMF9nZXRfY21kX2RpcmVjdGlvbihjbWQpKTsKKworCS8qIFRocmVlIERTRHMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgQ29tbWFuZCBUeXBlIDIgSU9DQiAqLworCWF2YWlsX2RzZHMgPSAzOworCWN1cl9kc2QgPSAodWludDMyX3QgKikmY21kX3BrdC0+ZHNlZ18wX2FkZHJlc3M7CisKKwkvKiBMb2FkIGRhdGEgc2VnbWVudHMgKi8KKwlpZiAoY21kLT51c2Vfc2cgIT0gMCkgeworCQlzdHJ1Y3QJc2NhdHRlcmxpc3QgKmN1cl9zZWc7CisJCXN0cnVjdAlzY2F0dGVybGlzdCAqZW5kX3NlZzsKKworCQljdXJfc2VnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKWNtZC0+cmVxdWVzdF9idWZmZXI7CisJCWVuZF9zZWcgPSBjdXJfc2VnICsgdG90X2RzZHM7CisJCXdoaWxlIChjdXJfc2VnIDwgZW5kX3NlZykgeworCQkJY29udF9lbnRyeV90CSpjb250X3BrdDsKKworCQkJLyogQWxsb2NhdGUgYWRkaXRpb25hbCBjb250aW51YXRpb24gcGFja2V0cz8gKi8KKwkJCWlmIChhdmFpbF9kc2RzID09IDApIHsKKwkJCQkvKgorCQkJCSAqIFNldmVuIERTRHMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgQ29udGludWF0aW9uCisJCQkJICogVHlwZSAwIElPQ0IuCisJCQkJICovCisJCQkJY29udF9wa3QgPSBxbGEyeDAwX3ByZXBfY29udF90eXBlMF9pb2NiKGhhKTsKKwkJCQljdXJfZHNkID0gKHVpbnQzMl90ICopJmNvbnRfcGt0LT5kc2VnXzBfYWRkcmVzczsKKwkJCQlhdmFpbF9kc2RzID0gNzsKKwkJCX0KKworCQkJKmN1cl9kc2QrKyA9IGNwdV90b19sZTMyKHNnX2RtYV9hZGRyZXNzKGN1cl9zZWcpKTsKKwkJCSpjdXJfZHNkKysgPSBjcHVfdG9fbGUzMihzZ19kbWFfbGVuKGN1cl9zZWcpKTsKKwkJCWF2YWlsX2RzZHMtLTsKKworCQkJY3VyX3NlZysrOworCQl9CisJfSBlbHNlIHsKKwkJZG1hX2FkZHJfdAlyZXFfZG1hOworCQlzdHJ1Y3QgcGFnZQkqcGFnZTsKKwkJdW5zaWduZWQgbG9uZwlvZmZzZXQ7CisKKwkJcGFnZSA9IHZpcnRfdG9fcGFnZShjbWQtPnJlcXVlc3RfYnVmZmVyKTsKKwkJb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nKWNtZC0+cmVxdWVzdF9idWZmZXIgJiB+UEFHRV9NQVNLKTsKKwkJcmVxX2RtYSA9IHBjaV9tYXBfcGFnZShoYS0+cGRldiwgcGFnZSwgb2Zmc2V0LAorCQkgICAgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCisJCXNwLT5kbWFfaGFuZGxlID0gcmVxX2RtYTsKKworCQkqY3VyX2RzZCsrID0gY3B1X3RvX2xlMzIocmVxX2RtYSk7CisJCSpjdXJfZHNkKysgPSBjcHVfdG9fbGUzMihjbWQtPnJlcXVlc3RfYnVmZmxlbik7CisJfQorfQorCisvKioKKyAqIHFsYTJ4MDBfYnVpbGRfc2NzaV9pb2Nic182NCgpIC0gQnVpbGQgSU9DQiBjb21tYW5kIHV0aWxpemluZyA2NGJpdAorICogY2FwYWJsZSBJT0NCIHR5cGVzLgorICoKKyAqIEBzcDogU1JCIGNvbW1hbmQgdG8gcHJvY2VzcworICogQGNtZF9wa3Q6IENvbW1hbmQgdHlwZSAzIElPQ0IKKyAqIEB0b3RfZHNkczogVG90YWwgbnVtYmVyIG9mIHNlZ21lbnRzIHRvIHRyYW5zZmVyCisgKi8KK3ZvaWQgcWxhMngwMF9idWlsZF9zY3NpX2lvY2JzXzY0KHNyYl90ICpzcCwgY21kX2VudHJ5X3QgKmNtZF9wa3QsCisgICAgdWludDE2X3QgdG90X2RzZHMpCit7CisJdWludDE2X3QJYXZhaWxfZHNkczsKKwl1aW50MzJfdAkqY3VyX2RzZDsKKwlzY3NpX3FsYV9ob3N0X3QJKmhhOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKworCWNtZCA9IHNwLT5jbWQ7CisKKwkvKiBVcGRhdGUgZW50cnkgdHlwZSB0byBpbmRpY2F0ZSBDb21tYW5kIFR5cGUgMyBJT0NCICovCisJKigodWludDMyX3QgKikoJmNtZF9wa3QtPmVudHJ5X3R5cGUpKSA9CisJICAgIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoQ09NTUFORF9BNjRfVFlQRSk7CisKKwkvKiBObyBkYXRhIHRyYW5zZmVyICovCisJaWYgKGNtZC0+cmVxdWVzdF9idWZmbGVuID09IDAgfHwgY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfTk9ORSkgeworCQljbWRfcGt0LT5ieXRlX2NvdW50ID0gX19jb25zdGFudF9jcHVfdG9fbGUzMigwKTsKKwkJcmV0dXJuOworCX0KKworCWhhID0gc3AtPmhhOworCisJY21kX3BrdC0+Y29udHJvbF9mbGFncyB8PSBjcHVfdG9fbGUxNihxbGEyeDAwX2dldF9jbWRfZGlyZWN0aW9uKGNtZCkpOworCisJLyogVHdvIERTRHMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgQ29tbWFuZCBUeXBlIDMgSU9DQiAqLworCWF2YWlsX2RzZHMgPSAyOworCWN1cl9kc2QgPSAodWludDMyX3QgKikmY21kX3BrdC0+ZHNlZ18wX2FkZHJlc3M7CisKKwkvKiBMb2FkIGRhdGEgc2VnbWVudHMgKi8KKwlpZiAoY21kLT51c2Vfc2cgIT0gMCkgeworCQlzdHJ1Y3QJc2NhdHRlcmxpc3QgKmN1cl9zZWc7CisJCXN0cnVjdAlzY2F0dGVybGlzdCAqZW5kX3NlZzsKKworCQljdXJfc2VnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKWNtZC0+cmVxdWVzdF9idWZmZXI7CisJCWVuZF9zZWcgPSBjdXJfc2VnICsgdG90X2RzZHM7CisJCXdoaWxlIChjdXJfc2VnIDwgZW5kX3NlZykgeworCQkJZG1hX2FkZHJfdAlzbGVfZG1hOworCQkJY29udF9hNjRfZW50cnlfdCAqY29udF9wa3Q7CisKKwkJCS8qIEFsbG9jYXRlIGFkZGl0aW9uYWwgY29udGludWF0aW9uIHBhY2tldHM/ICovCisJCQlpZiAoYXZhaWxfZHNkcyA9PSAwKSB7CisJCQkJLyoKKwkJCQkgKiBGaXZlIERTRHMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgQ29udGludWF0aW9uCisJCQkJICogVHlwZSAxIElPQ0IuCisJCQkJICovCisJCQkJY29udF9wa3QgPSBxbGEyeDAwX3ByZXBfY29udF90eXBlMV9pb2NiKGhhKTsKKwkJCQljdXJfZHNkID0gKHVpbnQzMl90ICopY29udF9wa3QtPmRzZWdfMF9hZGRyZXNzOworCQkJCWF2YWlsX2RzZHMgPSA1OworCQkJfQorCisJCQlzbGVfZG1hID0gc2dfZG1hX2FkZHJlc3MoY3VyX3NlZyk7CisJCQkqY3VyX2RzZCsrID0gY3B1X3RvX2xlMzIoTFNEKHNsZV9kbWEpKTsKKwkJCSpjdXJfZHNkKysgPSBjcHVfdG9fbGUzMihNU0Qoc2xlX2RtYSkpOworCQkJKmN1cl9kc2QrKyA9IGNwdV90b19sZTMyKHNnX2RtYV9sZW4oY3VyX3NlZykpOworCQkJYXZhaWxfZHNkcy0tOworCisJCQljdXJfc2VnKys7CisJCX0KKwl9IGVsc2UgeworCQlkbWFfYWRkcl90CXJlcV9kbWE7CisJCXN0cnVjdCBwYWdlCSpwYWdlOworCQl1bnNpZ25lZCBsb25nCW9mZnNldDsKKworCQlwYWdlID0gdmlydF90b19wYWdlKGNtZC0+cmVxdWVzdF9idWZmZXIpOworCQlvZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcpY21kLT5yZXF1ZXN0X2J1ZmZlciAmIH5QQUdFX01BU0spOworCQlyZXFfZG1hID0gcGNpX21hcF9wYWdlKGhhLT5wZGV2LCBwYWdlLCBvZmZzZXQsCisJCSAgICBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisKKwkJc3AtPmRtYV9oYW5kbGUgPSByZXFfZG1hOworCisJCSpjdXJfZHNkKysgPSBjcHVfdG9fbGUzMihMU0QocmVxX2RtYSkpOworCQkqY3VyX2RzZCsrID0gY3B1X3RvX2xlMzIoTVNEKHJlcV9kbWEpKTsKKwkJKmN1cl9kc2QrKyA9IGNwdV90b19sZTMyKGNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwl9Cit9CisKKy8qKgorICogcWxhMngwMF9zdGFydF9zY3NpKCkgLSBTZW5kIGEgU0NTSSBjb21tYW5kIHRvIHRoZSBJU1AKKyAqIEBzcDogY29tbWFuZCB0byBzZW5kIHRvIHRoZSBJU1AKKyAqCisgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGEgZmFpbHVyZSBvY2N1cmVkLCBlbHNlIHplcm8uCisgKi8KK2ludAorcWxhMngwMF9zdGFydF9zY3NpKHNyYl90ICpzcCkKK3sKKwlpbnQJCXJldDsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJc2NzaV9xbGFfaG9zdF90CSpoYTsKKwlmY19sdW5fdAkqZmNsdW47CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCXVpbnQzMl90CSpjbHJfcHRyOworCXVpbnQzMl90ICAgICAgICBpbmRleDsKKwl1aW50MzJfdAloYW5kbGU7CisJY21kX2VudHJ5X3QJKmNtZF9wa3Q7CisJdWludDMyX3QgICAgICAgIHRpbWVvdXQ7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl1aW50MTZfdAljbnQ7CisJdWludDE2X3QJcmVxX2NudDsKKwl1aW50MTZfdAl0b3RfZHNkczsKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnOworCWNoYXIJCXRhZ1syXTsKKworCS8qIFNldHVwIGRldmljZSBwb2ludGVycy4gKi8KKwlyZXQgPSAwOworCWZjbHVuID0gc3AtPmx1bl9xdWV1ZS0+ZmNsdW47CisJaGEgPSBmY2x1bi0+ZmNwb3J0LT5oYTsKKwlyZWcgPSBoYS0+aW9iYXNlOworCWNtZCA9IHNwLT5jbWQ7CisKKwkvKiBTZW5kIG1hcmtlciBpZiByZXF1aXJlZCAqLworCWlmIChoYS0+bWFya2VyX25lZWRlZCAhPSAwKSB7CisJCWlmIChxbGEyeDAwX21hcmtlcihoYSwgMCwgMCwgTUtfU1lOQ19BTEwpICE9IFFMQV9TVUNDRVNTKSB7CisJCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOworCQl9CisJCWhhLT5tYXJrZXJfbmVlZGVkID0gMDsKKwl9CisKKwkvKiBBY3F1aXJlIHJpbmcgc3BlY2lmaWMgbG9jayAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgZm9yIHJvb20gaW4gb3V0c3RhbmRpbmcgY29tbWFuZCBsaXN0LiAqLworCWhhbmRsZSA9IGhhLT5jdXJyZW50X291dHN0YW5kaW5nX2NtZDsKKwlmb3IgKGluZGV4ID0gMTsgaW5kZXggPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFM7IGluZGV4KyspIHsKKwkJaGFuZGxlKys7CisJCWlmIChoYW5kbGUgPT0gTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKQorCQkJaGFuZGxlID0gMTsKKwkJaWYgKGhhLT5vdXRzdGFuZGluZ19jbWRzW2hhbmRsZV0gPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaW5kZXggPT0gTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKQorCQlnb3RvIHF1ZXVpbmdfZXJyb3I7CisKKwkvKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiByZXF1ZXN0IGVudHJpZXMgbmVlZGVkLiAqLworCXJlcV9jbnQgPSAoaGEtPmNhbGNfcmVxdWVzdF9lbnRyaWVzKShjbWQtPnJlcXVlc3QtPm5yX2h3X3NlZ21lbnRzKTsKKwlpZiAoaGEtPnJlcV9xX2NudCA8IChyZXFfY250ICsgMikpIHsKKwkJY250ID0gUkRfUkVHX1dPUkRfUkVMQVhFRChJU1BfUkVRX1FfT1VUKGhhLCByZWcpKTsKKwkJaWYgKGhhLT5yZXFfcmluZ19pbmRleCA8IGNudCkKKwkJCWhhLT5yZXFfcV9jbnQgPSBjbnQgLSBoYS0+cmVxX3JpbmdfaW5kZXg7CisJCWVsc2UKKwkJCWhhLT5yZXFfcV9jbnQgPSBoYS0+cmVxdWVzdF9xX2xlbmd0aCAtCisJCQkgICAgKGhhLT5yZXFfcmluZ19pbmRleCAtIGNudCk7CisJfQorCWlmIChoYS0+cmVxX3FfY250IDwgKHJlcV9jbnQgKyAyKSkKKwkJZ290byBxdWV1aW5nX2Vycm9yOworCisJLyogRmluYWxseSwgd2UgaGF2ZSBlbm91Z2ggc3BhY2UsIG5vdyBwZXJmb3JtIG1hcHBpbmdzLiAqLworCXRvdF9kc2RzID0gMDsKKwlpZiAoY21kLT51c2Vfc2cpIHsKKwkJc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIGNtZC0+cmVxdWVzdF9idWZmZXI7CisJCXRvdF9kc2RzID0gcGNpX21hcF9zZyhoYS0+cGRldiwgc2csIGNtZC0+dXNlX3NnLAorCQkgICAgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCWlmICh0b3RfZHNkcyA9PSAwKQorCQkJZ290byBxdWV1aW5nX2Vycm9yOworCX0gZWxzZSBpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKKwkgICAgdG90X2RzZHMrKzsKKwl9CisJcmVxX2NudCA9IChoYS0+Y2FsY19yZXF1ZXN0X2VudHJpZXMpKHRvdF9kc2RzKTsKKworCS8qIEJ1aWxkIGNvbW1hbmQgcGFja2V0ICovCisJaGEtPmN1cnJlbnRfb3V0c3RhbmRpbmdfY21kID0gaGFuZGxlOworCWhhLT5vdXRzdGFuZGluZ19jbWRzW2hhbmRsZV0gPSBzcDsKKwlzcC0+aGEgPSBoYTsKKwlzcC0+Y21kLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikodW5zaWduZWQgbG9uZyloYW5kbGU7CisJaGEtPnJlcV9xX2NudCAtPSByZXFfY250OworCisJY21kX3BrdCA9IChjbWRfZW50cnlfdCAqKWhhLT5yZXF1ZXN0X3JpbmdfcHRyOworCWNtZF9wa3QtPmhhbmRsZSA9IGhhbmRsZTsKKwkvKiBaZXJvIG91dCByZW1haW5pbmcgcG9ydGlvbiBvZiBwYWNrZXQuICovCisJY2xyX3B0ciA9ICh1aW50MzJfdCAqKWNtZF9wa3QgKyAyOworCW1lbXNldChjbHJfcHRyLCAwLCBSRVFVRVNUX0VOVFJZX1NJWkUgLSA4KTsKKwljbWRfcGt0LT5kc2VnX2NvdW50ID0gY3B1X3RvX2xlMTYodG90X2RzZHMpOworCisJLyogU2V0IHRhcmdldCBJRCAqLworCVNFVF9UQVJHRVRfSUQoaGEsIGNtZF9wa3QtPnRhcmdldCwgZmNsdW4tPmZjcG9ydC0+bG9vcF9pZCk7CisKKwkvKiBTZXQgTFVOIG51bWJlciovCisJY21kX3BrdC0+bHVuID0gY3B1X3RvX2xlMTYoZmNsdW4tPmx1bik7CisKKwkvKiBVcGRhdGUgdGFnZ2VkIHF1ZXVpbmcgbW9kaWZpZXIgKi8KKwljbWRfcGt0LT5jb250cm9sX2ZsYWdzID0gX19jb25zdGFudF9jcHVfdG9fbGUxNihDRl9TSU1QTEVfVEFHKTsKKwlpZiAoc2NzaV9wb3B1bGF0ZV90YWdfbXNnKGNtZCwgdGFnKSkgeworCQlzd2l0Y2ggKHRhZ1swXSkgeworCQljYXNlIE1TR19IRUFEX1RBRzoKKwkJCWNtZF9wa3QtPmNvbnRyb2xfZmxhZ3MgPQorCQkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoQ0ZfSEVBRF9UQUcpOworCQkJYnJlYWs7CisJCWNhc2UgTVNHX09SREVSRURfVEFHOgorCQkJY21kX3BrdC0+Y29udHJvbF9mbGFncyA9CisJCQkgICAgX19jb25zdGFudF9jcHVfdG9fbGUxNihDRl9PUkRFUkVEX1RBRyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogQWxsb2NhdGUgYXQgbGVhc3QgNSAoKyBRTEFfQ01EX1RJTUVSX0RFTFRBKSBzZWNvbmRzIGZvciBSSVNDIHRpbWVvdXQuCisJICovCisJdGltZW91dCA9ICh1aW50MzJfdCkoY21kLT50aW1lb3V0X3Blcl9jb21tYW5kIC8gSFopOworCWlmICh0aW1lb3V0ID4gNjU1MzUpCisJCWNtZF9wa3QtPnRpbWVvdXQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDApOworCWVsc2UgaWYgKHRpbWVvdXQgPiAyNSkKKwkJY21kX3BrdC0+dGltZW91dCA9IGNwdV90b19sZTE2KCh1aW50MTZfdCl0aW1lb3V0IC0KKwkJICAgICg1ICsgUUxBX0NNRF9USU1FUl9ERUxUQSkpOworCWVsc2UKKwkJY21kX3BrdC0+dGltZW91dCA9IGNwdV90b19sZTE2KCh1aW50MTZfdCl0aW1lb3V0KTsKKworCS8qIExvYWQgU0NTSSBjb21tYW5kIHBhY2tldC4gKi8KKwltZW1jcHkoY21kX3BrdC0+c2NzaV9jZGIsIGNtZC0+Y21uZCwgY21kLT5jbWRfbGVuKTsKKwljbWRfcGt0LT5ieXRlX2NvdW50ID0gY3B1X3RvX2xlMzIoKHVpbnQzMl90KWNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKworCS8qIEJ1aWxkIElPQ0Igc2VnbWVudHMgKi8KKwkoaGEtPmJ1aWxkX3Njc2lfaW9jYnMpKHNwLCBjbWRfcGt0LCB0b3RfZHNkcyk7CisKKwkvKiBTZXQgdG90YWwgZGF0YSBzZWdtZW50IGNvdW50LiAqLworCWNtZF9wa3QtPmVudHJ5X2NvdW50ID0gKHVpbnQ4X3QpcmVxX2NudDsKKwl3bWIoKTsKKworCS8qIEFkanVzdCByaW5nIGluZGV4LiAqLworCWhhLT5yZXFfcmluZ19pbmRleCsrOworCWlmIChoYS0+cmVxX3JpbmdfaW5kZXggPT0gaGEtPnJlcXVlc3RfcV9sZW5ndGgpIHsKKwkJaGEtPnJlcV9yaW5nX2luZGV4ID0gMDsKKwkJaGEtPnJlcXVlc3RfcmluZ19wdHIgPSBoYS0+cmVxdWVzdF9yaW5nOworCX0gZWxzZQorCQloYS0+cmVxdWVzdF9yaW5nX3B0cisrOworCisJaGEtPmFjdHRocmVhZHMrKzsKKwloYS0+dG90YWxfaW9zKys7CisJc3AtPmx1bl9xdWV1ZS0+b3V0X2NudCsrOworCXNwLT5mbGFncyB8PSBTUkJfRE1BX1ZBTElEOworCXNwLT5zdGF0ZSA9IFNSQl9BQ1RJVkVfU1RBVEU7CisJc3AtPnVfc3RhcnQgPSBqaWZmaWVzOworCisJLyogU2V0IGNoaXAgbmV3IHJpbmcgaW5kZXguICovCisJV1JUX1JFR19XT1JEKElTUF9SRVFfUV9JTihoYSwgcmVnKSwgaGEtPnJlcV9yaW5nX2luZGV4KTsKKwlSRF9SRUdfV09SRF9SRUxBWEVEKElTUF9SRVFfUV9JTihoYSwgcmVnKSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKKworcXVldWluZ19lcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIChRTEFfRlVOQ1RJT05fRkFJTEVEKTsKK30KKworLyoqCisgKiBxbGEyeDAwX21hcmtlcigpIC0gU2VuZCBhIG1hcmtlciBJT0NCIHRvIHRoZSBmaXJtd2FyZS4KKyAqIEBoYTogSEEgY29udGV4dAorICogQGxvb3BfaWQ6IGxvb3AgSUQKKyAqIEBsdW46IExVTgorICogQHR5cGU6IG1hcmtlciBtb2RpZmllcgorICoKKyAqIENhbiBiZSBjYWxsZWQgZnJvbSBib3RoIG5vcm1hbCBhbmQgaW50ZXJydXB0IGNvbnRleHQuCisgKgorICogUmV0dXJucyBub24temVybyBpZiBhIGZhaWx1cmUgb2NjdXJlZCwgZWxzZSB6ZXJvLgorICovCitpbnQKK19fcWxhMngwMF9tYXJrZXIoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgbG9vcF9pZCwgdWludDE2X3QgbHVuLAorICAgIHVpbnQ4X3QgdHlwZSkKK3sKKwltcmtfZW50cnlfdAkqcGt0OworCisJcGt0ID0gKG1ya19lbnRyeV90ICopcWxhMngwMF9yZXFfcGt0KGhhKTsKKwlpZiAocGt0ID09IE5VTEwpIHsKKwkJREVCVUcyXzMocHJpbnRrKCIlcygpOiAqKioqIEZBSUxFRCAqKioqXG4iLCBfX2Z1bmNfXykpOworCisJCXJldHVybiAoUUxBX0ZVTkNUSU9OX0ZBSUxFRCk7CisJfQorCisJcGt0LT5lbnRyeV90eXBlID0gTUFSS0VSX1RZUEU7CisJcGt0LT5tb2RpZmllciA9IHR5cGU7CisKKwlpZiAodHlwZSAhPSBNS19TWU5DX0FMTCkgeworCQlwa3QtPmx1biA9IGNwdV90b19sZTE2KGx1bik7CisJCVNFVF9UQVJHRVRfSUQoaGEsIHBrdC0+dGFyZ2V0LCBsb29wX2lkKTsKKwl9CisJd21iKCk7CisKKwkvKiBJc3N1ZSBjb21tYW5kIHRvIElTUCAqLworCXFsYTJ4MDBfaXNwX2NtZChoYSk7CisKKwlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKK30KKworaW50IAorcWxhMngwMF9tYXJrZXIoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgbG9vcF9pZCwgdWludDE2X3QgbHVuLAorICAgIHVpbnQ4X3QgdHlwZSkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJcmV0ID0gX19xbGEyeDAwX21hcmtlcihoYSwgbG9vcF9pZCwgbHVuLCB0eXBlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIChyZXQpOworfQorCisvKioKKyAqIHFsYTJ4MDBfcmVxX3BrdCgpIC0gUmV0cmlldmUgYSByZXF1ZXN0IHBhY2tldCBmcm9tIHRoZSByZXF1ZXN0IHJpbmcuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBOb3RlOiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgaGFyZHdhcmUgbG9jayBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCisgKgorICogUmV0dXJucyBOVUxMIGlmIGZ1bmN0aW9uIGZhaWxlZCwgZWxzZSwgYSBwb2ludGVyIHRvIHRoZSByZXF1ZXN0IHBhY2tldC4KKyAqLworc3RhdGljIHJlcXVlc3RfdCAqCitxbGEyeDAwX3JlcV9wa3Qoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKwlyZXF1ZXN0X3QJKnBrdCA9IE5VTEw7CisJdWludDE2X3QJY250OworCXVpbnQzMl90CSpkd29yZF9wdHI7CisJdWludDMyX3QJdGltZXI7CisJdWludDE2X3QJcmVxX2NudCA9IDE7CisKKwkvKiBXYWl0IDEgc2Vjb25kIGZvciBzbG90LiAqLworCWZvciAodGltZXIgPSBIWjsgdGltZXI7IHRpbWVyLS0pIHsKKwkJaWYgKChyZXFfY250ICsgMikgPj0gaGEtPnJlcV9xX2NudCkgeworCQkJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBmcmVlIHJlcXVlc3QgZW50cmllcy4gKi8KKwkJCWNudCA9IHFsYTJ4MDBfZGVib3VuY2VfcmVnaXN0ZXIoSVNQX1JFUV9RX09VVChoYSwgcmVnKSk7CisJCQlpZiAgKGhhLT5yZXFfcmluZ19pbmRleCA8IGNudCkKKwkJCQloYS0+cmVxX3FfY250ID0gY250IC0gaGEtPnJlcV9yaW5nX2luZGV4OworCQkJZWxzZQorCQkJCWhhLT5yZXFfcV9jbnQgPSBoYS0+cmVxdWVzdF9xX2xlbmd0aCAtCisJCQkJICAgIChoYS0+cmVxX3JpbmdfaW5kZXggLSBjbnQpOworCQl9CisJCS8qIElmIHJvb20gZm9yIHJlcXVlc3QgaW4gcmVxdWVzdCByaW5nLiAqLworCQlpZiAoKHJlcV9jbnQgKyAyKSA8IGhhLT5yZXFfcV9jbnQpIHsKKwkJCWhhLT5yZXFfcV9jbnQtLTsKKwkJCXBrdCA9IGhhLT5yZXF1ZXN0X3JpbmdfcHRyOworCisJCQkvKiBaZXJvIG91dCBwYWNrZXQuICovCisJCQlkd29yZF9wdHIgPSAodWludDMyX3QgKilwa3Q7CisJCQlmb3IgKGNudCA9IDA7IGNudCA8IFJFUVVFU1RfRU5UUllfU0laRSAvIDQ7IGNudCsrKQorCQkJCSpkd29yZF9wdHIrKyA9IDA7CisKKwkJCS8qIFNldCBzeXN0ZW0gZGVmaW5lZCBmaWVsZC4gKi8KKwkJCXBrdC0+c3lzX2RlZmluZSA9ICh1aW50OF90KWhhLT5yZXFfcmluZ19pbmRleDsKKworCQkJLyogU2V0IGVudHJ5IGNvdW50LiAqLworCQkJcGt0LT5lbnRyeV9jb3VudCA9IDE7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLyogUmVsZWFzZSByaW5nIHNwZWNpZmljIGxvY2sgKi8KKwkJc3Bpbl91bmxvY2soJmhhLT5oYXJkd2FyZV9sb2NrKTsKKworCQl1ZGVsYXkoMik7ICAgLyogMiB1cyAqLworCisJCS8qIENoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdHMuICovCisJCS8qIER1cmluZyBpbml0IHdlIGlzc3VlIG1hcmtlciBkaXJlY3RseSAqLworCQlpZiAoIWhhLT5tYXJrZXJfbmVlZGVkKQorCQkJcWxhMngwMF9wb2xsKGhhKTsKKworCQlzcGluX2xvY2tfaXJxKCZoYS0+aGFyZHdhcmVfbG9jayk7CisJfQorCWlmICghcGt0KSB7CisJCURFQlVHMl8zKHByaW50aygiJXMoKTogKioqKiBGQUlMRUQgKioqKlxuIiwgX19mdW5jX18pKTsKKwl9CisKKwlyZXR1cm4gKHBrdCk7Cit9CisKKy8qKgorICogcWxhMngwMF9pc3BfY21kKCkgLSBNb2RpZnkgdGhlIHJlcXVlc3QgcmluZyBwb2ludGVyLgorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogTm90ZTogVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIGhhcmR3YXJlIGxvY2sgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgorICovCit2b2lkCitxbGEyeDAwX2lzcF9jbWQoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKworCURFQlVHNShwcmludGsoIiVzKCk6IElPQ0IgZGF0YTpcbiIsIF9fZnVuY19fKSk7CisJREVCVUc1KHFsYTJ4MDBfZHVtcF9idWZmZXIoCisJICAgICh1aW50OF90ICopaGEtPnJlcXVlc3RfcmluZ19wdHIsIFJFUVVFU1RfRU5UUllfU0laRSkpOworCisJLyogQWRqdXN0IHJpbmcgaW5kZXguICovCisJaGEtPnJlcV9yaW5nX2luZGV4Kys7CisJaWYgKGhhLT5yZXFfcmluZ19pbmRleCA9PSBoYS0+cmVxdWVzdF9xX2xlbmd0aCkgeworCQloYS0+cmVxX3JpbmdfaW5kZXggPSAwOworCQloYS0+cmVxdWVzdF9yaW5nX3B0ciA9IGhhLT5yZXF1ZXN0X3Jpbmc7CisJfSBlbHNlCisJCWhhLT5yZXF1ZXN0X3JpbmdfcHRyKys7CisKKwkvKiBTZXQgY2hpcCBuZXcgcmluZyBpbmRleC4gKi8KKwlXUlRfUkVHX1dPUkQoSVNQX1JFUV9RX0lOKGhhLCByZWcpLCBoYS0+cmVxX3JpbmdfaW5kZXgpOworCVJEX1JFR19XT1JEX1JFTEFYRUQoSVNQX1JFUV9RX0lOKGhhLCByZWcpKTsJLyogUENJIFBvc3RpbmcuICovCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAzZDRjNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwpAQCAtMCwwICsxLDE0NjQgQEAKKy8qCisgKiAgICAgICAgICAgICAgICAgIFFMT0dJQyBMSU5VWCBTT0ZUV0FSRQorICoKKyAqIFFMb2dpYyBJU1AyeDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBRTG9naWMgQ29ycG9yYXRpb24KKyAqICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaW5jbHVkZSAicWxhX2RlZi5oIgorCitzdGF0aWMgdm9pZCBxbGEyeDAwX21ieF9jb21wbGV0aW9uKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCk7CitzdGF0aWMgdm9pZCBxbGEyeDAwX2FzeW5jX2V2ZW50KHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MzJfdCk7CitzdGF0aWMgdm9pZCBxbGEyeDAwX3Byb2Nlc3NfY29tcGxldGVkX3JlcXVlc3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgdWludDMyX3QpOwordm9pZCBxbGEyeDAwX3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CitzdGF0aWMgdm9pZCBxbGEyeDAwX3N0YXR1c19lbnRyeShzY3NpX3FsYV9ob3N0X3QgKiwgc3RzX2VudHJ5X3QgKik7CitzdGF0aWMgdm9pZCBxbGEyeDAwX3N0YXR1c19jb250X2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqLCBzdHNfY29udF9lbnRyeV90ICopOworc3RhdGljIHZvaWQgcWxhMngwMF9lcnJvcl9lbnRyeShzY3NpX3FsYV9ob3N0X3QgKiwgc3RzX2VudHJ5X3QgKik7CitzdGF0aWMgdm9pZCBxbGEyeDAwX21zX2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqLCBtc19pb2NiX2VudHJ5X3QgKik7CisKK3N0YXRpYyBpbnQgcWxhMngwMF9jaGVja19zZW5zZShzdHJ1Y3Qgc2NzaV9jbW5kICpjcCwgb3NfbHVuX3QgKik7CisKKy8qKgorICogcWxhMjEwMF9pbnRyX2hhbmRsZXIoKSAtIFByb2Nlc3MgaW50ZXJydXB0cyBmb3IgdGhlIElTUDIxMDAgYW5kIElTUDIyMDAuCisgKiBAaXJxOgorICogQGRldl9pZDogU0NTSSBkcml2ZXIgSEEgY29udGV4dAorICogQHJlZ3M6CisgKgorICogQ2FsbGVkIGJ5IHN5c3RlbSB3aGVuZXZlciB0aGUgaG9zdCBhZGFwdGVyIGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQuCisgKgorICogUmV0dXJucyBoYW5kbGVkIGZsYWcuCisgKi8KK2lycXJldHVybl90CitxbGEyMTAwX2ludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNjc2lfcWxhX2hvc3RfdAkqaGE7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZzsKKwlpbnQJCXN0YXR1czsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXVuc2lnbmVkIGxvbmcJaXRlcjsKKwl1aW50MzJfdAltYng7CisKKwloYSA9IChzY3NpX3FsYV9ob3N0X3QgKikgZGV2X2lkOworCWlmICghaGEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgIiVzKCk6IE5VTEwgaG9zdCBwb2ludGVyXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAoSVJRX05PTkUpOworCX0KKworCXJlZyA9IGhhLT5pb2Jhc2U7CisJc3RhdHVzID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCWZvciAoaXRlciA9IDUwOyBpdGVyLS07ICkgeworCQlpZiAoKFJEX1JFR19XT1JEKCZyZWctPmlzdGF0dXMpICYgSVNSX1JJU0NfSU5UKSA9PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKFJEX1JFR19XT1JEKCZyZWctPnNlbWFwaG9yZSkgJiBCSVRfMCkgeworCQkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfQ0xSX1JJU0NfSU5UKTsKKwkJCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOworCisJCQkvKiBHZXQgbWFpbGJveCBkYXRhLiAqLworCQkJbWJ4ID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMCk7CisJCQlpZiAobWJ4ID4gMHgzZmZmICYmIG1ieCA8IDB4ODAwMCkgeworCQkJCXFsYTJ4MDBfbWJ4X2NvbXBsZXRpb24oaGEsICh1aW50MTZfdCltYngpOworCQkJCXN0YXR1cyB8PSBNQlhfSU5URVJSVVBUOworCQkJfSBlbHNlIGlmIChtYnggPiAweDdmZmYgJiYgbWJ4IDwgMHhjMDAwKSB7CisJCQkJcWxhMngwMF9hc3luY19ldmVudChoYSwgbWJ4KTsKKwkJCX0gZWxzZSB7CisJCQkJLypFTVBUWSovCisJCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBVbnJlY29nbml6ZWQgIgorCQkJCSAgICAiaW50ZXJydXB0IHR5cGUgKCVkKVxuIiwKKwkJCQkgICAgaGEtPmhvc3Rfbm8sIG1ieCkpOworCQkJfQorCQkJLyogUmVsZWFzZSBtYWlsYm94IHJlZ2lzdGVycy4gKi8KKwkJCVdSVF9SRUdfV09SRCgmcmVnLT5zZW1hcGhvcmUsIDApOworCQkJUkRfUkVHX1dPUkQoJnJlZy0+c2VtYXBob3JlKTsKKwkJfSBlbHNlIHsKKwkJCXFsYTJ4MDBfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShoYSk7CisKKwkJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX0NMUl9SSVNDX0lOVCk7CisJCQlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJcWxhMngwMF9uZXh0KGhhKTsKKwloYS0+bGFzdF9pcnFfY3B1ID0gX3NtcF9wcm9jZXNzb3JfaWQoKTsKKwloYS0+dG90YWxfaXNyX2NudCsrOworCisJaWYgKHRlc3RfYml0KE1CWF9JTlRSX1dBSVQsICZoYS0+bWJ4X2NtZF9mbGFncykgJiYKKwkgICAgKHN0YXR1cyAmIE1CWF9JTlRFUlJVUFQpICYmIGhhLT5mbGFncy5tYm94X2ludCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPm1ieF9yZWdfbG9jaywgZmxhZ3MpOworCisJCXNldF9iaXQoTUJYX0lOVEVSUlVQVCwgJmhhLT5tYnhfY21kX2ZsYWdzKTsKKwkJdXAoJmhhLT5tYnhfaW50cl9zZW0pOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5tYnhfcmVnX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJmhhLT5kb25lX3F1ZXVlKSkKKwkJcWxhMngwMF9kb25lKGhhKTsKKworCXJldHVybiAoSVJRX0hBTkRMRUQpOworfQorCisvKioKKyAqIHFsYTIzMDBfaW50cl9oYW5kbGVyKCkgLSBQcm9jZXNzIGludGVycnVwdHMgZm9yIHRoZSBJU1AyM3h4IGFuZCBJU1A2M3h4LgorICogQGlycToKKyAqIEBkZXZfaWQ6IFNDU0kgZHJpdmVyIEhBIGNvbnRleHQKKyAqIEByZWdzOgorICoKKyAqIENhbGxlZCBieSBzeXN0ZW0gd2hlbmV2ZXIgdGhlIGhvc3QgYWRhcHRlciBnZW5lcmF0ZXMgYW4gaW50ZXJydXB0LgorICoKKyAqIFJldHVybnMgaGFuZGxlZCBmbGFnLgorICovCitpcnFyZXR1cm5fdAorcWxhMjMwMF9pbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzY3NpX3FsYV9ob3N0X3QJKmhhOworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWc7CisJaW50CQlzdGF0dXM7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl1bnNpZ25lZCBsb25nCWl0ZXI7CisJdWludDMyX3QJc3RhdDsKKwl1aW50MzJfdAltYng7CisJdWludDE2X3QJaGNjcjsKKworCWhhID0gKHNjc2lfcWxhX2hvc3RfdCAqKSBkZXZfaWQ7CisJaWYgKCFoYSkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAiJXMoKTogTlVMTCBob3N0IHBvaW50ZXJcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIChJUlFfTk9ORSk7CisJfQorCisJcmVnID0gaGEtPmlvYmFzZTsKKwlzdGF0dXMgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJZm9yIChpdGVyID0gNTA7IGl0ZXItLTsgKSB7CisJCXN0YXQgPSBSRF9SRUdfRFdPUkQoJnJlZy0+dS5pc3AyMzAwLmhvc3Rfc3RhdHVzKTsKKwkJaWYgKHN0YXQgJiBIU1JfUklTQ19QQVVTRUQpIHsKKwkJCWhjY3IgPSBSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsKKwkJCWlmIChoY2NyICYgKEJJVF8xNSB8IEJJVF8xMyB8IEJJVF8xMSB8IEJJVF84KSkKKwkJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkJICAgICJQYXJpdHkgZXJyb3IgLS0gSENDUj0leC5cbiIsIGhjY3IpOworCQkJZWxzZQorCQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCQkgICAgIlJJU0MgcGF1c2VkIC0tIEhDQ1I9JXhcbiIsIGhjY3IpOworCisJCQkvKgorCQkJICogSXNzdWUgYSAiSEFSRCIgcmVzZXQgaW4gb3JkZXIgZm9yIHRoZSBSSVNDCisJCQkgKiBpbnRlcnJ1cHQgYml0IHRvIGJlIGNsZWFyZWQuICBTY2hlZHVsZSBhIGJpZworCQkJICogaGFtbW1lciB0byBnZXQgb3V0IG9mIHRoZSBSSVNDIFBBVVNFRCBzdGF0ZS4KKwkJCSAqLworCQkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfUkVTRVRfUklTQyk7CisJCQlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsKKwkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoKHN0YXQgJiBIU1JfUklTQ19JTlQpID09IDApCisJCQlicmVhazsKKworCQltYnggPSBNU1coc3RhdCk7CisJCXN3aXRjaCAoc3RhdCAmIDB4ZmYpIHsKKwkJY2FzZSAweDEzOgorCQkJcWxhMngwMF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKGhhKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MToKKwkJY2FzZSAweDI6CisJCWNhc2UgMHgxMDoKKwkJY2FzZSAweDExOgorCQkJcWxhMngwMF9tYnhfY29tcGxldGlvbihoYSwgKHVpbnQxNl90KW1ieCk7CisJCQlzdGF0dXMgfD0gTUJYX0lOVEVSUlVQVDsKKworCQkJLyogUmVsZWFzZSBtYWlsYm94IHJlZ2lzdGVycy4gKi8KKwkJCVdSVF9SRUdfV09SRCgmcmVnLT5zZW1hcGhvcmUsIDApOworCQkJYnJlYWs7CisJCWNhc2UgMHgxMjoKKwkJCXFsYTJ4MDBfYXN5bmNfZXZlbnQoaGEsIG1ieCk7CisJCQlicmVhazsKKwkJY2FzZSAweDE1OgorCQkJbWJ4ID0gbWJ4IDw8IDE2IHwgTUJBX0NNUExUXzFfMTZCSVQ7CisJCQlxbGEyeDAwX2FzeW5jX2V2ZW50KGhhLCBtYngpOworCQkJYnJlYWs7CisJCWNhc2UgMHgxNjoKKwkJCW1ieCA9IG1ieCA8PCAxNiB8IE1CQV9TQ1NJX0NPTVBMRVRJT047CisJCQlxbGEyeDAwX2FzeW5jX2V2ZW50KGhhLCBtYngpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFVucmVjb2duaXplZCBpbnRlcnJ1cHQgdHlwZSAiCisJCQkgICAgIiglZClcbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8sIHN0YXQgJiAweGZmKSk7CisJCQlicmVhazsKKwkJfQorCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9DTFJfUklTQ19JTlQpOworCQlSRF9SRUdfV09SRF9SRUxBWEVEKCZyZWctPmhjY3IpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJcWxhMngwMF9uZXh0KGhhKTsKKwloYS0+bGFzdF9pcnFfY3B1ID0gX3NtcF9wcm9jZXNzb3JfaWQoKTsKKwloYS0+dG90YWxfaXNyX2NudCsrOworCisJaWYgKHRlc3RfYml0KE1CWF9JTlRSX1dBSVQsICZoYS0+bWJ4X2NtZF9mbGFncykgJiYKKwkgICAgKHN0YXR1cyAmIE1CWF9JTlRFUlJVUFQpICYmIGhhLT5mbGFncy5tYm94X2ludCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPm1ieF9yZWdfbG9jaywgZmxhZ3MpOworCisJCXNldF9iaXQoTUJYX0lOVEVSUlVQVCwgJmhhLT5tYnhfY21kX2ZsYWdzKTsKKwkJdXAoJmhhLT5tYnhfaW50cl9zZW0pOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5tYnhfcmVnX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJmhhLT5kb25lX3F1ZXVlKSkKKwkJcWxhMngwMF9kb25lKGhhKTsKKworCXJldHVybiAoSVJRX0hBTkRMRUQpOworfQorCisvKioKKyAqIHFsYTJ4MDBfbWJ4X2NvbXBsZXRpb24oKSAtIFByb2Nlc3MgbWFpbGJveCBjb21tYW5kIGNvbXBsZXRpb25zLgorICogQGhhOiBTQ1NJIGRyaXZlciBIQSBjb250ZXh0CisgKiBAbWIwOiBNYWlsYm94MCByZWdpc3RlcgorICovCitzdGF0aWMgdm9pZAorcWxhMngwMF9tYnhfY29tcGxldGlvbihzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCBtYjApCit7CisJdWludDE2X3QJY250OworCXVpbnQxNl90IF9faW9tZW0gKndwdHI7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisKKwkvKiBMb2FkIHJldHVybiBtYWlsYm94IHJlZ2lzdGVycy4gKi8KKwloYS0+ZmxhZ3MubWJveF9pbnQgPSAxOworCWhhLT5tYWlsYm94X291dFswXSA9IG1iMDsKKwl3cHRyID0gKHVpbnQxNl90IF9faW9tZW0gKilNQUlMQk9YX1JFRyhoYSwgcmVnLCAxKTsKKworCWZvciAoY250ID0gMTsgY250IDwgaGEtPm1ieF9jb3VudDsgY250KyspIHsKKwkJaWYgKElTX1FMQTIyMDAoaGEpICYmIGNudCA9PSA4KSAKKwkJCXdwdHIgPSAodWludDE2X3QgX19pb21lbSAqKU1BSUxCT1hfUkVHKGhhLCByZWcsIDgpOworCQlpZiAoY250ID09IDQgfHwgY250ID09IDUpCisJCQloYS0+bWFpbGJveF9vdXRbY250XSA9IHFsYTJ4MDBfZGVib3VuY2VfcmVnaXN0ZXIod3B0cik7CisJCWVsc2UKKwkJCWhhLT5tYWlsYm94X291dFtjbnRdID0gUkRfUkVHX1dPUkQod3B0cik7CisJCisJCXdwdHIrKzsKKwl9CisKKwlpZiAoaGEtPm1jcCkgeworCQlERUJVRzMocHJpbnRrKCIlcyglbGQpOiBHb3QgbWFpbGJveCBjb21wbGV0aW9uLiBjbWQ9JXguXG4iLAorCQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vLCBoYS0+bWNwLT5tYlswXSkpOworCX0gZWxzZSB7CisJCURFQlVHMl8zKHByaW50aygiJXMoJWxkKTogTUJYIHBvaW50ZXIgRVJST1IhXG4iLAorCQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJfQorfQorCisvKioKKyAqIHFsYTJ4MDBfYXN5bmNfZXZlbnQoKSAtIFByb2Nlc3MgYXluY2hyb25vdXMgZXZlbnRzLgorICogQGhhOiBTQ1NJIGRyaXZlciBIQSBjb250ZXh0CisgKiBAbWIwOiBNYWlsYm94MCByZWdpc3RlcgorICovCitzdGF0aWMgdm9pZAorcWxhMngwMF9hc3luY19ldmVudChzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCBtYngpCit7CisJc3RhdGljIGNoYXIJKmxpbmtfc3BlZWRzWzVdID0geyAiMSIsICIyIiwgIjQiLCAiPyIsICIxMCIgfTsKKwljaGFyCQkqbGlua19zcGVlZDsKKwl1aW50MTZfdAltYls0XTsKKwl1aW50MTZfdAloYW5kbGVfY250OworCXVpbnQxNl90CWNudDsKKwl1aW50MzJfdAloYW5kbGVzWzVdOworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCXVpbnQzMl90CXJzY25fZW50cnksIGhvc3RfcGlkOworCXVpbnQ4X3QJCXJzY25fcXVldWVfaW5kZXg7CisKKwkvKiBTZXR1cCB0byBwcm9jZXNzIFJJTyBjb21wbGV0aW9uLiAqLworCWhhbmRsZV9jbnQgPSAwOworCW1iWzBdID0gTFNXKG1ieCk7CisJc3dpdGNoIChtYlswXSkgeworCWNhc2UgTUJBX1NDU0lfQ09NUExFVElPTjoKKwkJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKQorCQkJaGFuZGxlc1swXSA9IGxlMzJfdG9fY3B1KAorCQkJICAgICgodWludDMyX3QpKFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDIpIDw8IDE2KSkgfAorCQkJICAgIFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDEpKTsKKwkJZWxzZQorCQkJaGFuZGxlc1swXSA9IGxlMzJfdG9fY3B1KAorCQkJICAgICgodWludDMyX3QpKFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDIpIDw8IDE2KSkgfAorCQkJICAgIE1TVyhtYngpKTsKKwkJaGFuZGxlX2NudCA9IDE7CisJCWJyZWFrOworCWNhc2UgTUJBX0NNUExUXzFfMTZCSVQ6CisJCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkKKwkJCWhhbmRsZXNbMF0gPSAodWludDMyX3QpUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMSk7CisJCWVsc2UKKwkJCWhhbmRsZXNbMF0gPSBNU1cobWJ4KTsKKwkJaGFuZGxlX2NudCA9IDE7CisJCW1iWzBdID0gTUJBX1NDU0lfQ09NUExFVElPTjsKKwkJYnJlYWs7CisJY2FzZSBNQkFfQ01QTFRfMl8xNkJJVDoKKwkJaGFuZGxlc1swXSA9ICh1aW50MzJfdClSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAxKTsKKwkJaGFuZGxlc1sxXSA9ICh1aW50MzJfdClSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAyKTsKKwkJaGFuZGxlX2NudCA9IDI7CisJCW1iWzBdID0gTUJBX1NDU0lfQ09NUExFVElPTjsKKwkJYnJlYWs7CisJY2FzZSBNQkFfQ01QTFRfM18xNkJJVDoKKwkJaGFuZGxlc1swXSA9ICh1aW50MzJfdClSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAxKTsKKwkJaGFuZGxlc1sxXSA9ICh1aW50MzJfdClSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAyKTsKKwkJaGFuZGxlc1syXSA9ICh1aW50MzJfdClSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAzKTsKKwkJaGFuZGxlX2NudCA9IDM7CisJCW1iWzBdID0gTUJBX1NDU0lfQ09NUExFVElPTjsKKwkJYnJlYWs7CisJY2FzZSBNQkFfQ01QTFRfNF8xNkJJVDoKKwkJaGFuZGxlc1swXSA9ICh1aW50MzJfdClSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAxKTsKKwkJaGFuZGxlc1sxXSA9ICh1aW50MzJfdClSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAyKTsKKwkJaGFuZGxlc1syXSA9ICh1aW50MzJfdClSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAzKTsKKwkJaGFuZGxlc1szXSA9ICh1aW50MzJfdClSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCA2KTsKKwkJaGFuZGxlX2NudCA9IDQ7CisJCW1iWzBdID0gTUJBX1NDU0lfQ09NUExFVElPTjsKKwkJYnJlYWs7CisJY2FzZSBNQkFfQ01QTFRfNV8xNkJJVDoKKwkJaGFuZGxlc1swXSA9ICh1aW50MzJfdClSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAxKTsKKwkJaGFuZGxlc1sxXSA9ICh1aW50MzJfdClSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAyKTsKKwkJaGFuZGxlc1syXSA9ICh1aW50MzJfdClSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAzKTsKKwkJaGFuZGxlc1szXSA9ICh1aW50MzJfdClSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCA2KTsKKwkJaGFuZGxlc1s0XSA9ICh1aW50MzJfdClSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCA3KTsKKwkJaGFuZGxlX2NudCA9IDU7CisJCW1iWzBdID0gTUJBX1NDU0lfQ09NUExFVElPTjsKKwkJYnJlYWs7CisJY2FzZSBNQkFfQ01QTFRfMl8zMkJJVDoKKwkJaGFuZGxlc1swXSA9IGxlMzJfdG9fY3B1KAorCQkgICAgKCh1aW50MzJfdCkoUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMikgPDwgMTYpKSB8CisJCSAgICBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAxKSk7CisJCWhhbmRsZXNbMV0gPSBsZTMyX3RvX2NwdSgKKwkJICAgICgodWludDMyX3QpKFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDcpIDw8IDE2KSkgfAorCQkgICAgUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgNikpOworCQloYW5kbGVfY250ID0gMjsKKwkJbWJbMF0gPSBNQkFfU0NTSV9DT01QTEVUSU9OOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKG1iWzBdKSB7CisJY2FzZSBNQkFfU0NTSV9DT01QTEVUSU9OOgkvKiBGYXN0IFBvc3QgKi8KKwkJaWYgKCFoYS0+ZmxhZ3Mub25saW5lKQorCQkJYnJlYWs7CisKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBoYW5kbGVfY250OyBjbnQrKykKKwkJCXFsYTJ4MDBfcHJvY2Vzc19jb21wbGV0ZWRfcmVxdWVzdChoYSwgaGFuZGxlc1tjbnRdKTsKKwkJYnJlYWs7CisKKwljYXNlIE1CQV9SRVNFVDoJCQkvKiBSZXNldCAqLworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBSRVNFVC5cbiIsIGhhLT5ob3N0X25vKSk7CisKKwkJc2V0X2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBNQkFfU1lTVEVNX0VSUjoJCS8qIFN5c3RlbSBFcnJvciAqLworCQltYlsxXSA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDEpOworCQltYlsyXSA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDIpOworCQltYlszXSA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDMpOworCisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJICAgICJJU1AgU3lzdGVtIEVycm9yIC0gbWJ4MT0leGggbWJ4Mj0leGggbWJ4Mz0leGguXG4iLAorCQkgICAgbWJbMV0sIG1iWzJdLCBtYlszXSk7CisKKwkJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKQorCQkJcWxhMjEwMF9md19kdW1wKGhhLCAxKTsKKwkJZWxzZQorCSAgICAJCXFsYTIzMDBfZndfZHVtcChoYSwgMSk7CisKKwkJaWYgKG1iWzFdID09IDApIHsKKwkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCSAgICAiVW5yZWNvdmVyYWJsZSBIYXJkd2FyZSBFcnJvcjogYWRhcHRlciBtYXJrZWQgIgorCQkJICAgICJPRkZMSU5FIVxuIik7CisJCQloYS0+ZmxhZ3Mub25saW5lID0gMDsKKwkJfSBlbHNlCisJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIE1CQV9SRVFfVFJBTlNGRVJfRVJSOgkvKiBSZXF1ZXN0IFRyYW5zZmVyIEVycm9yICovCisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogSVNQIFJlcXVlc3QgVHJhbnNmZXIgRXJyb3IuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiSVNQIFJlcXVlc3QgVHJhbnNmZXIgRXJyb3IuXG4iKTsKKworCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIE1CQV9SU1BfVFJBTlNGRVJfRVJSOgkvKiBSZXNwb25zZSBUcmFuc2ZlciBFcnJvciAqLworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IElTUCBSZXNwb25zZSBUcmFuc2ZlciBFcnJvci5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJJU1AgUmVzcG9uc2UgVHJhbnNmZXIgRXJyb3IuXG4iKTsKKworCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIE1CQV9XQUtFVVBfVEhSRVM6CQkvKiBSZXF1ZXN0IFF1ZXVlIFdha2UtdXAgKi8KKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgV0FLRVVQX1RIUkVTLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJCWJyZWFrOworCisJY2FzZSBNQkFfTElQX09DQ1VSUkVEOgkJLyogTG9vcCBJbml0aWFsaXphdGlvbiBQcm9jZWR1cmUgKi8KKwkJbWJbMV0gPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAxKTsKKworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IExJUCBvY2N1cmVkICgleCkuXG4iLCBoYS0+aG9zdF9ubywKKwkJICAgIG1iWzFdKSk7CisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkxJUCBvY2N1cmVkICgleCkuXG4iLCBtYlsxXSk7CisKKwkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9ET1dOKSB7CisJCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9ET1dOKTsKKwkJCWF0b21pY19zZXQoJmhhLT5sb29wX2Rvd25fdGltZXIsIExPT1BfRE9XTl9USU1FKTsKKwkJCXFsYTJ4MDBfbWFya19hbGxfZGV2aWNlc19sb3N0KGhhKTsKKwkJfQorCisJCXNldF9iaXQoUkVHSVNURVJfRkM0X05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCisJCWhhLT5mbGFncy5tYW5hZ2VtZW50X3NlcnZlcl9sb2dnZWRfaW4gPSAwOworCisJCS8qIFVwZGF0ZSBBRU4gcXVldWUuICovCisJCXFsYTJ4MDBfZW5xdWV1ZV9hZW4oaGEsIE1CQV9MSVBfT0NDVVJSRUQsIE5VTEwpOworCisJCWhhLT50b3RhbF9saXBfY250Kys7CisJCWJyZWFrOworCisJY2FzZSBNQkFfTE9PUF9VUDoJCS8qIExvb3AgVXAgRXZlbnQgKi8KKwkJbWJbMV0gPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAxKTsKKworCQloYS0+bGlua19kYXRhX3JhdGUgPSAwOworCQlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpIHsKKwkJCWxpbmtfc3BlZWQgPSBsaW5rX3NwZWVkc1swXTsKKwkJfSBlbHNlIHsKKwkJCWxpbmtfc3BlZWQgPSBsaW5rX3NwZWVkc1szXTsKKwkJCWlmIChtYlsxXSA8IDUpCisJCQkJbGlua19zcGVlZCA9IGxpbmtfc3BlZWRzW21iWzFdXTsKKwkJCWhhLT5saW5rX2RhdGFfcmF0ZSA9IG1iWzFdOworCQl9CisKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgTE9PUCBVUCAoJXMgR2JwcykuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIGxpbmtfc3BlZWQpKTsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiTE9PUCBVUCBkZXRlY3RlZCAoJXMgR2JwcykuXG4iLAorCQkgICAgbGlua19zcGVlZCk7CisKKwkJaGEtPmZsYWdzLm1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA9IDA7CisKKwkJLyogVXBkYXRlIEFFTiBxdWV1ZS4gKi8KKwkJcWxhMngwMF9lbnF1ZXVlX2FlbihoYSwgTUJBX0xPT1BfVVAsIE5VTEwpOworCQlicmVhazsKKworCWNhc2UgTUJBX0xPT1BfRE9XTjoJCS8qIExvb3AgRG93biBFdmVudCAqLworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBMT09QIERPV04uXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiTE9PUCBET1dOIGRldGVjdGVkLlxuIik7CisKKwkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9ET1dOKSB7CisJCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9ET1dOKTsKKwkJCWF0b21pY19zZXQoJmhhLT5sb29wX2Rvd25fdGltZXIsIExPT1BfRE9XTl9USU1FKTsKKwkJCWhhLT5kZXZpY2VfZmxhZ3MgfD0gREZMR19OT19DQUJMRTsKKwkJCXFsYTJ4MDBfbWFya19hbGxfZGV2aWNlc19sb3N0KGhhKTsKKwkJfQorCisJCWhhLT5mbGFncy5tYW5hZ2VtZW50X3NlcnZlcl9sb2dnZWRfaW4gPSAwOworCQloYS0+bGlua19kYXRhX3JhdGUgPSAwOworCisJCS8qIFVwZGF0ZSBBRU4gcXVldWUuICovCisJCXFsYTJ4MDBfZW5xdWV1ZV9hZW4oaGEsIE1CQV9MT09QX0RPV04sIE5VTEwpOworCQlicmVhazsKKworCWNhc2UgTUJBX0xJUF9SRVNFVDoJCS8qIExJUCByZXNldCBvY2N1cnJlZCAqLworCQltYlsxXSA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDEpOworCisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQXN5bmNocm9ub3VzIExJUCBSRVNFVCAoJXgpLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBtYlsxXSkpOworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCSAgICAiTElQIHJlc2V0IG9jY3VyZWQgKCV4KS5cbiIsIG1iWzFdKTsKKworCQlpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04pIHsKKwkJCWF0b21pY19zZXQoJmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOworCQkJYXRvbWljX3NldCgmaGEtPmxvb3BfZG93bl90aW1lciwgTE9PUF9ET1dOX1RJTUUpOworCQkJcWxhMngwMF9tYXJrX2FsbF9kZXZpY2VzX2xvc3QoaGEpOworCQl9CisKKwkJc2V0X2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisKKwkJaGEtPm9wZXJhdGluZ19tb2RlID0gTE9PUDsKKwkJaGEtPmZsYWdzLm1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA9IDA7CisKKwkJLyogVXBkYXRlIEFFTiBxdWV1ZS4gKi8KKwkJcWxhMngwMF9lbnF1ZXVlX2FlbihoYSwgTUJBX0xJUF9SRVNFVCwgTlVMTCk7CisKKwkJaGEtPnRvdGFsX2xpcF9jbnQrKzsKKwkJYnJlYWs7CisKKwljYXNlIE1CQV9QT0lOVF9UT19QT0lOVDoJLyogUG9pbnQtdG8tUG9pbnQgKi8KKwkJaWYgKElTX1FMQTIxMDAoaGEpKQorCQkJYnJlYWs7CisKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgUDJQIE1PREUgcmVjZWl2ZWQuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKworCQkvKgorCQkgKiBVbnRpbCB0aGVyZSdzIGEgdHJhbnNpdGlvbiBmcm9tIGxvb3AgZG93biB0byBsb29wIHVwLCB0cmVhdAorCQkgKiB0aGlzIGFzIGxvb3AgZG93biBvbmx5LgorCQkgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9ET1dOKSB7CisJCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9ET1dOKTsKKwkJCWlmICghYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpKQorCQkJCWF0b21pY19zZXQoJmhhLT5sb29wX2Rvd25fdGltZXIsCisJCQkJICAgIExPT1BfRE9XTl9USU1FKTsKKwkJCXFsYTJ4MDBfbWFya19hbGxfZGV2aWNlc19sb3N0KGhhKTsKKwkJfQorCisJCWlmICghKHRlc3RfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKSkpIHsKKwkJCXNldF9iaXQoUkVTRVRfTUFSS0VSX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQl9CisJCXNldF9iaXQoUkVHSVNURVJfRkM0X05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgTUJBX0NIR19JTl9DT05ORUNUSU9OOgkvKiBDaGFuZ2UgaW4gY29ubmVjdGlvbiBtb2RlICovCisJCWlmIChJU19RTEEyMTAwKGhhKSkKKwkJCWJyZWFrOworCisJCW1iWzFdID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMSk7CisKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgQ2hhbmdlIEluIENvbm5lY3Rpb24gIgorCQkgICAgInJlY2VpdmVkLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJICAgICJDb25maWd1cmF0aW9uIGNoYW5nZSBkZXRlY3RlZDogdmFsdWU9JXguXG4iLCBtYlsxXSk7CisKKwkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9ET1dOKSB7CisJCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9ET1dOKTsgIAorCQkJaWYgKCFhdG9taWNfcmVhZCgmaGEtPmxvb3BfZG93bl90aW1lcikpCisJCQkJYXRvbWljX3NldCgmaGEtPmxvb3BfZG93bl90aW1lciwKKwkJCQkgICAgTE9PUF9ET1dOX1RJTUUpOworCQkJcWxhMngwMF9tYXJrX2FsbF9kZXZpY2VzX2xvc3QoaGEpOworCQl9CisKKwkJc2V0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJc2V0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJmhhLT5kcGNfZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgTUJBX1BPUlRfVVBEQVRFOgkJLyogUG9ydCBkYXRhYmFzZSB1cGRhdGUgKi8KKwkJbWJbMV0gPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAxKTsKKwkJbWJbMl0gPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAyKTsKKworCQkvKgorCQkgKiBJZiBhIHNpbmdsZSByZW1vdGUgcG9ydCBqdXN0IGxvZ2dlZCBpbnRvIChvciBsb2dnZWQgb3V0IG9mKQorCQkgKiB1cywgY3JlYXRlIGEgbmV3IGVudHJ5IGluIG91ciByc2NuIGZjcG9ydHMgbGlzdCBhbmQgaGFuZGxlCisJCSAqIHRoZSBldmVudCBsaWtlIGFuIFJTQ04uCisJCSAqLworCQlpZiAoIUlTX1FMQTIxMDAoaGEpICYmICFJU19RTEEyMjAwKGhhKSAmJiAhSVNfUUxBNjMxMihoYSkgJiYKKwkJICAgICFJU19RTEE2MzIyKGhhKSAmJiBoYS0+ZmxhZ3MuaW5pdF9kb25lICYmIG1iWzFdICE9IDB4ZmZmZiAmJgorCQkgICAgKChoYS0+b3BlcmF0aW5nX21vZGUgPT0gUDJQICYmIG1iWzFdICE9IDApIHx8CisJCSAgICAoaGEtPm9wZXJhdGluZ19tb2RlICE9IFAyUCAmJiBtYlsxXSAhPQorCQkJU05TX0ZJUlNUX0xPT1BfSUQpKSAmJiAobWJbMl0gPT0gNiB8fCBtYlsyXSA9PSA3KSkgeworCQkJaW50IHJ2YWw7CisJCQlmY19wb3J0X3QgKnJzY25fZmNwb3J0OworCisJCQkvKiBDcmVhdGUgbmV3IGZjcG9ydCBmb3IgbG9naW4uICovCisJCQlyc2NuX2ZjcG9ydCA9IHFsYTJ4MDBfYWxsb2NfcnNjbl9mY3BvcnQoaGEsIEdGUF9BVE9NSUMpOworCQkJaWYgKHJzY25fZmNwb3J0KSB7CisJCQkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogUG9ydCBVcGRhdGUgLS0gIgorCQkJCSAgICAiY3JlYXRpbmcgUlNDTiBmY3BvcnQgJXAgZm9yICV4LyV4LlxuIiwKKwkJCQkgICAgaGEtPmhvc3Rfbm8sIHJzY25fZmNwb3J0LCBtYlsxXSwgbWJbMl0pKTsKKworCQkJCXJzY25fZmNwb3J0LT5sb29wX2lkID0gbWJbMV07CisJCQkJcnNjbl9mY3BvcnQtPmRfaWQuYjI0ID0gSU5WQUxJRF9QT1JUX0lEOworCQkJCWF0b21pY19zZXQoJnJzY25fZmNwb3J0LT5zdGF0ZSwKKwkJCQkgICAgRkNTX0RFVklDRV9MT1NUKTsKKwkJCQlsaXN0X2FkZF90YWlsKCZyc2NuX2ZjcG9ydC0+bGlzdCwKKwkJCQkgICAgJmhhLT5yc2NuX2ZjcG9ydHMpOworCisJCQkJcnZhbCA9IHFsYTJ4MDBfaGFuZGxlX3BvcnRfcnNjbihoYSwgMCwKKwkJCQkgICAgcnNjbl9mY3BvcnQsIDEpOworCQkJCWlmIChydmFsID09IFFMQV9TVUNDRVNTKQorCQkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogUG9ydCBVcGRhdGUgLS0gIgorCQkJCSAgICAiLS0gdW5hYmxlIHRvIGFsbG9jYXRlIFJTQ04gZmNwb3J0ICIKKwkJCQkgICAgImxvZ2luLlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIElmIFBPUlQgVVBEQVRFIGlzIGdsb2JhbCAocmVjaWV2ZWQgTElQX09DQ1VSRUQvTElQX1JFU0VUCisJCSAqIGV2ZW50IGV0Yy4gZWFybGllciBpbmRpY2F0aW5nIGxvb3AgaXMgZG93bikgdGhlbiBwcm9jZXNzCisJCSAqIGl0LiAgT3RoZXJ3aXNlIGlnbm9yZSBpdCBhbmQgV2FpdCBmb3IgUlNDTiB0byBjb21lIGluLgorCQkgKi8KKwkJYXRvbWljX3NldCgmaGEtPmxvb3BfZG93bl90aW1lciwgMCk7CisJCWlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTiAmJgorCQkgICAgYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RFQUQpIHsKKwkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQXN5bmNocm9ub3VzIFBPUlQgVVBEQVRFICIKKwkJCSAgICAiaWdub3JlZC5cbiIsIGhhLT5ob3N0X25vKSk7CisJCQlicmVhazsKKwkJfQorCisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQXN5bmNocm9ub3VzIFBPUlQgVVBEQVRFLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJCURFQlVHKHByaW50ayhLRVJOX0lORk8KKwkJICAgICJzY3NpKCVsZCk6IFBvcnQgZGF0YWJhc2UgY2hhbmdlZCAlMDR4ICUwNHguXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSkpOworCisJCS8qCisJCSAqIE1hcmsgYWxsIGRldmljZXMgYXMgbWlzc2luZyBzbyB3ZSB3aWxsIGxvZ2luIGFnYWluLgorCQkgKi8KKwkJYXRvbWljX3NldCgmaGEtPmxvb3Bfc3RhdGUsIExPT1BfVVApOworCisJCXFsYTJ4MDBfbWFya19hbGxfZGV2aWNlc19sb3N0KGhhKTsKKworCQloYS0+ZmxhZ3MucnNjbl9xdWV1ZV9vdmVyZmxvdyA9IDE7CisKKwkJc2V0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJc2V0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJmhhLT5kcGNfZmxhZ3MpOworCisJCS8qIFVwZGF0ZSBBRU4gcXVldWUuICovCisJCXFsYTJ4MDBfZW5xdWV1ZV9hZW4oaGEsIE1CQV9QT1JUX1VQREFURSwgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBNQkFfUlNDTl9VUERBVEU6CQkvKiBTdGF0ZSBDaGFuZ2UgUmVnaXN0cmF0aW9uICovCisJCW1iWzFdID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMSk7CisJCW1iWzJdID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMik7CisKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgUlNDUiBVUERBVEUuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcocHJpbnRrKEtFUk5fSU5GTworCQkgICAgInNjc2koJWxkKTogUlNDTiBkYXRhYmFzZSBjaGFuZ2VkIC0tICUwNHggJTA0eC5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgbWJbMV0sIG1iWzJdKSk7CisKKwkJcnNjbl9lbnRyeSA9IChtYlsxXSA8PCAxNikgfCBtYlsyXTsKKwkJaG9zdF9waWQgPSAoaGEtPmRfaWQuYi5kb21haW4gPDwgMTYpIHwgKGhhLT5kX2lkLmIuYXJlYSA8PCA4KSB8CisJCSAgICBoYS0+ZF9pZC5iLmFsX3BhOworCQlpZiAocnNjbl9lbnRyeSA9PSBob3N0X3BpZCkgeworCQkJREVCVUcocHJpbnRrKEtFUk5fSU5GTworCQkJICAgICJzY3NpKCVsZCk6IElnbm9yaW5nIFJTQ04gdXBkYXRlIHRvIGxvY2FsIGhvc3QgIgorCQkJICAgICJwb3J0IElEICglMDZ4KVxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgaG9zdF9waWQpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcnNjbl9xdWV1ZV9pbmRleCA9IGhhLT5yc2NuX2luX3B0ciArIDE7CisJCWlmIChyc2NuX3F1ZXVlX2luZGV4ID09IE1BWF9SU0NOX0NPVU5UKQorCQkJcnNjbl9xdWV1ZV9pbmRleCA9IDA7CisJCWlmIChyc2NuX3F1ZXVlX2luZGV4ICE9IGhhLT5yc2NuX291dF9wdHIpIHsKKwkJCWhhLT5yc2NuX3F1ZXVlW2hhLT5yc2NuX2luX3B0cl0gPSByc2NuX2VudHJ5OworCQkJaGEtPnJzY25faW5fcHRyID0gcnNjbl9xdWV1ZV9pbmRleDsKKwkJfSBlbHNlIHsKKwkJCWhhLT5mbGFncy5yc2NuX3F1ZXVlX292ZXJmbG93ID0gMTsKKwkJfQorCisJCWF0b21pY19zZXQoJmhhLT5sb29wX3N0YXRlLCBMT09QX1VQREFURSk7CisJCWF0b21pY19zZXQoJmhhLT5sb29wX2Rvd25fdGltZXIsIDApOworCQloYS0+ZmxhZ3MubWFuYWdlbWVudF9zZXJ2ZXJfbG9nZ2VkX2luID0gMDsKKworCQlzZXRfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQlzZXRfYml0KFJTQ05fVVBEQVRFLCAmaGEtPmRwY19mbGFncyk7CisKKwkJLyogVXBkYXRlIEFFTiBxdWV1ZS4gKi8KKwkJcWxhMngwMF9lbnF1ZXVlX2FlbihoYSwgTUJBX1JTQ05fVVBEQVRFLCAmbWJbMF0pOworCQlicmVhazsKKworCS8qIGNhc2UgTUJBX1JJT19SRVNQT05TRTogKi8KKwljYXNlIE1CQV9aSU9fUkVTUE9OU0U6CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogW1J8Wl1JTyB1cGRhdGUgY29tcGxldGlvbi5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCQlERUJVRyhwcmludGsoS0VSTl9JTkZPCisJCSAgICAic2NzaSglbGQpOiBbUnxaXUlPIHVwZGF0ZSBjb21wbGV0aW9uLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisKKwkJcWxhMngwMF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKGhhKTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIHFsYTJ4MDBfcHJvY2Vzc19jb21wbGV0ZWRfcmVxdWVzdCgpIC0gUHJvY2VzcyBhIEZhc3QgUG9zdCByZXNwb25zZS4KKyAqIEBoYTogU0NTSSBkcml2ZXIgSEEgY29udGV4dAorICogQGluZGV4OiBTUkIgaW5kZXgKKyAqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfcHJvY2Vzc19jb21wbGV0ZWRfcmVxdWVzdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90IGluZGV4KQoreworCXNyYl90ICpzcDsKKworCS8qIFZhbGlkYXRlIGhhbmRsZS4gKi8KKwlpZiAoaW5kZXggPj0gTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogSW52YWxpZCBTQ1NJIGNvbXBsZXRpb24gaGFuZGxlICVkLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBpbmRleCkpOworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiSW52YWxpZCBTQ1NJIGNvbXBsZXRpb24gaGFuZGxlICVkLlxuIiwgaW5kZXgpOworCisJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJc3AgPSBoYS0+b3V0c3RhbmRpbmdfY21kc1tpbmRleF07CisJaWYgKHNwKSB7CisJCS8qIEZyZWUgb3V0c3RhbmRpbmcgY29tbWFuZCBzbG90LiAqLworCQloYS0+b3V0c3RhbmRpbmdfY21kc1tpbmRleF0gPSBOVUxMOworCisJCWlmIChoYS0+YWN0dGhyZWFkcykKKwkJCWhhLT5hY3R0aHJlYWRzLS07CisJCXNwLT5sdW5fcXVldWUtPm91dF9jbnQtLTsKKwkJQ01EX0NPTVBMX1NUQVRVUyhzcC0+Y21kKSA9IDBMOworCQlDTURfU0NTSV9TVEFUVVMoc3AtPmNtZCkgPSAwTDsKKworCQkvKiBTYXZlIElTUCBjb21wbGV0aW9uIHN0YXR1cyAqLworCQlzcC0+Y21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisJCXNwLT5mb19yZXRyeV9jbnQgPSAwOworCQlhZGRfdG9fZG9uZV9xdWV1ZShoYSwgc3ApOworCX0gZWxzZSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogSW52YWxpZCBJU1AgU0NTSSBjb21wbGV0aW9uIGhhbmRsZVxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJJbnZhbGlkIElTUCBTQ1NJIGNvbXBsZXRpb24gaGFuZGxlXG4iKTsKKworCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwl9Cit9CisKKy8qKgorICogcWxhMngwMF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKCkgLSBQcm9jZXNzIHJlc3BvbnNlIHF1ZXVlIGVudHJpZXMuCisgKiBAaGE6IFNDU0kgZHJpdmVyIEhBIGNvbnRleHQKKyAqLwordm9pZAorcWxhMngwMF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKwlzdHNfZW50cnlfdAkqcGt0OworCXVpbnQxNl90ICAgICAgICBoYW5kbGVfY250OworCXVpbnQxNl90ICAgICAgICBjbnQ7CisKKwlpZiAoIWhhLT5mbGFncy5vbmxpbmUpCisJCXJldHVybjsKKworCXdoaWxlIChoYS0+cmVzcG9uc2VfcmluZ19wdHItPnNpZ25hdHVyZSAhPSBSRVNQT05TRV9QUk9DRVNTRUQpIHsKKwkJcGt0ID0gKHN0c19lbnRyeV90ICopaGEtPnJlc3BvbnNlX3JpbmdfcHRyOworCisJCWhhLT5yc3BfcmluZ19pbmRleCsrOworCQlpZiAoaGEtPnJzcF9yaW5nX2luZGV4ID09IGhhLT5yZXNwb25zZV9xX2xlbmd0aCkgeworCQkJaGEtPnJzcF9yaW5nX2luZGV4ID0gMDsKKwkJCWhhLT5yZXNwb25zZV9yaW5nX3B0ciA9IGhhLT5yZXNwb25zZV9yaW5nOworCQl9IGVsc2UgeworCQkJaGEtPnJlc3BvbnNlX3JpbmdfcHRyKys7CisJCX0KKworCQlpZiAocGt0LT5lbnRyeV9zdGF0dXMgIT0gMCkgeworCQkJREVCVUczKHByaW50ayhLRVJOX0lORk8KKwkJCSAgICAic2NzaSglbGQpOiBQcm9jZXNzIGVycm9yIGVudHJ5LlxuIiwgaGEtPmhvc3Rfbm8pKTsKKworCQkJcWxhMngwMF9lcnJvcl9lbnRyeShoYSwgcGt0KTsKKwkJCSgocmVzcG9uc2VfdCAqKXBrdCktPnNpZ25hdHVyZSA9IFJFU1BPTlNFX1BST0NFU1NFRDsKKwkJCXdtYigpOworCQkJY29udGludWU7CisJCX0KKworCQlzd2l0Y2ggKHBrdC0+ZW50cnlfdHlwZSkgeworCQljYXNlIFNUQVRVU19UWVBFOgorCQkJcWxhMngwMF9zdGF0dXNfZW50cnkoaGEsIHBrdCk7CisJCQlicmVhazsKKwkJY2FzZSBTVEFUVVNfVFlQRV8yMToKKwkJCWhhbmRsZV9jbnQgPSAoKHN0czIxX2VudHJ5X3QgKilwa3QpLT5oYW5kbGVfY291bnQ7CisJCQlmb3IgKGNudCA9IDA7IGNudCA8IGhhbmRsZV9jbnQ7IGNudCsrKSB7CisJCQkJcWxhMngwMF9wcm9jZXNzX2NvbXBsZXRlZF9yZXF1ZXN0KGhhLAorCQkJCSAgICAoKHN0czIxX2VudHJ5X3QgKilwa3QpLT5oYW5kbGVbY250XSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTVEFUVVNfVFlQRV8yMjoKKwkJCWhhbmRsZV9jbnQgPSAoKHN0czIyX2VudHJ5X3QgKilwa3QpLT5oYW5kbGVfY291bnQ7CisJCQlmb3IgKGNudCA9IDA7IGNudCA8IGhhbmRsZV9jbnQ7IGNudCsrKSB7CisJCQkJcWxhMngwMF9wcm9jZXNzX2NvbXBsZXRlZF9yZXF1ZXN0KGhhLAorCQkJCSAgICAoKHN0czIyX2VudHJ5X3QgKilwa3QpLT5oYW5kbGVbY250XSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTVEFUVVNfQ09OVF9UWVBFOgorCQkJcWxhMngwMF9zdGF0dXNfY29udF9lbnRyeShoYSwgKHN0c19jb250X2VudHJ5X3QgKilwa3QpOworCQkJYnJlYWs7CisJCWNhc2UgTVNfSU9DQl9UWVBFOgorCQkJcWxhMngwMF9tc19lbnRyeShoYSwgKG1zX2lvY2JfZW50cnlfdCAqKXBrdCk7CisJCQlicmVhazsKKwkJY2FzZSBNQlhfSU9DQl9UWVBFOgorCQkJaWYgKCFJU19RTEEyMTAwKGhhKSAmJiAhSVNfUUxBMjIwMChoYSkgJiYKKwkJCSAgICAhSVNfUUxBNjMxMihoYSkgJiYgIUlTX1FMQTYzMjIoaGEpKSB7CisJCQkJaWYgKHBrdC0+c3lzX2RlZmluZSA9PSBTT1VSQ0VfQVNZTkNfSU9DQikgeworCQkJCQlxbGEyeDAwX3Byb2Nlc3NfaW9kZXNjKGhhLAorCQkJCQkgICAgKHN0cnVjdCBtYnhfZW50cnkgKilwa3QpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIE1CWCBJT0NCIFR5cGUgTm90IFN1cHBvcnRlZC4gKi8KKwkJCQkJREVCVUc0KHByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJICAgICJzY3NpKCVsZCk6IFJlY2VpdmVkIHVua25vd24gTUJYICIKKwkJCQkJICAgICJJT0NCIHJlc3BvbnNlIHBrdCB0eXBlPSV4ICIKKwkJCQkJICAgICJzb3VyY2U9JXggZW50cnkgc3RhdHVzPSV4LlxuIiwKKwkJCQkJICAgIGhhLT5ob3N0X25vLCBwa3QtPmVudHJ5X3R5cGUsCisJCQkJCSAgICBwa3QtPnN5c19kZWZpbmUsCisJCQkJCSAgICBwa3QtPmVudHJ5X3N0YXR1cykpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIEZhbGx0aHJvdWdoLiAqLworCQlkZWZhdWx0OgorCQkJLyogVHlwZSBOb3QgU3VwcG9ydGVkLiAqLworCQkJREVCVUc0KHByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAic2NzaSglbGQpOiBSZWNlaXZlZCB1bmtub3duIHJlc3BvbnNlIHBrdCB0eXBlICV4ICIKKwkJCSAgICAiZW50cnkgc3RhdHVzPSV4LlxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgcGt0LT5lbnRyeV90eXBlLCBwa3QtPmVudHJ5X3N0YXR1cykpOworCQkJYnJlYWs7CisJCX0KKwkJKChyZXNwb25zZV90ICopcGt0KS0+c2lnbmF0dXJlID0gUkVTUE9OU0VfUFJPQ0VTU0VEOworCQl3bWIoKTsKKwl9CisKKwkvKiBBZGp1c3QgcmluZyBpbmRleCAqLworCVdSVF9SRUdfV09SRChJU1BfUlNQX1FfT1VUKGhhLCByZWcpLCBoYS0+cnNwX3JpbmdfaW5kZXgpOworfQorCisvKioKKyAqIHFsYTJ4MDBfc3RhdHVzX2VudHJ5KCkgLSBQcm9jZXNzIGEgU3RhdHVzIElPQ0IgZW50cnkuCisgKiBAaGE6IFNDU0kgZHJpdmVyIEhBIGNvbnRleHQKKyAqIEBwa3Q6IEVudHJ5IHBvaW50ZXIKKyAqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfc3RhdHVzX2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN0c19lbnRyeV90ICpwa3QpCit7CisJaW50CQlyZXQ7CisJdW5zaWduZWQJYiwgdCwgbDsKKwlzcmJfdAkJKnNwOworCW9zX2x1bl90CSpscTsKKwlvc190Z3RfdAkqdHE7CisJZmNfcG9ydF90CSpmY3BvcnQ7CisJc3RydWN0IHNjc2lfY21uZCAqY3A7CisJdWludDE2X3QJY29tcF9zdGF0dXM7CisJdWludDE2X3QJc2NzaV9zdGF0dXM7CisJdWludDhfdAkJbHNjc2lfc3RhdHVzOworCWludDMyX3QJCXJlc2lkOworCXVpbnQ4X3QJCXNlbnNlX3N6ID0gMDsKKwl1aW50MTZfdAlyc3BfaW5mb19sZW47CisKKwkvKiBGYXN0IHBhdGggY29tcGxldGlvbi4gKi8KKwlpZiAobGUxNl90b19jcHUocGt0LT5jb21wX3N0YXR1cykgPT0gQ1NfQ09NUExFVEUgJiYKKwkgICAgKGxlMTZfdG9fY3B1KHBrdC0+c2NzaV9zdGF0dXMpICYgU1NfTUFTSykgPT0gMCkgeworCQlxbGEyeDAwX3Byb2Nlc3NfY29tcGxldGVkX3JlcXVlc3QoaGEsIHBrdC0+aGFuZGxlKTsKKworCQlyZXR1cm47CisJfQorCisJLyogVmFsaWRhdGUgaGFuZGxlLiAqLworCWlmIChwa3QtPmhhbmRsZSA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUykgeworCQlzcCA9IGhhLT5vdXRzdGFuZGluZ19jbWRzW3BrdC0+aGFuZGxlXTsKKwkJaGEtPm91dHN0YW5kaW5nX2NtZHNbcGt0LT5oYW5kbGVdID0gTlVMTDsKKwl9IGVsc2UKKwkJc3AgPSBOVUxMOworCisJaWYgKHNwID09IE5VTEwpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBTdGF0dXMgRW50cnkgaW52YWxpZCBoYW5kbGUuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiU3RhdHVzIEVudHJ5IGludmFsaWQgaGFuZGxlLlxuIik7CisKKwkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCWlmIChoYS0+ZHBjX3dhaXQgJiYgIWhhLT5kcGNfYWN0aXZlKSAKKwkJCXVwKGhhLT5kcGNfd2FpdCk7CisKKwkJcmV0dXJuOworCX0KKwljcCA9IHNwLT5jbWQ7CisJaWYgKGNwID09IE5VTEwpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBDb21tYW5kIGFscmVhZHkgcmV0dXJuZWQgYmFjayB0byBPUyAiCisJCSAgICAicGt0LT5oYW5kbGU9JWQgc3A9JXAgc3AtPnN0YXRlOiVkXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHBrdC0+aGFuZGxlLCBzcCwgc3AtPnN0YXRlKSk7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJDb21tYW5kIGlzIE5VTEw6IGFscmVhZHkgcmV0dXJuZWQgdG8gT1MgKHNwPSVwKVxuIiwgc3ApOworCisJCXJldHVybjsKKwl9CisKKwlpZiAoaGEtPmFjdHRocmVhZHMpCisJCWhhLT5hY3R0aHJlYWRzLS07CisKKwlpZiAoc3AtPmx1bl9xdWV1ZSA9PSBOVUxMKSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogU3RhdHVzIEVudHJ5IGludmFsaWQgbHVuIHBvaW50ZXIuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIlN0YXR1cyBFbnRyeSBpbnZhbGlkIGx1biBwb2ludGVyLlxuIik7CisKKwkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCWlmIChoYS0+ZHBjX3dhaXQgJiYgIWhhLT5kcGNfYWN0aXZlKSAKKwkJCXVwKGhhLT5kcGNfd2FpdCk7CisKKwkJcmV0dXJuOworCX0KKworCXNwLT5sdW5fcXVldWUtPm91dF9jbnQtLTsKKworCWNvbXBfc3RhdHVzID0gbGUxNl90b19jcHUocGt0LT5jb21wX3N0YXR1cyk7CisJLyogTWFzayBvZiByZXNlcnZlZCBiaXRzIDEyLTE1LCBiZWZvcmUgd2UgZXhhbWluZSB0aGUgc2NzaSBzdGF0dXMgKi8KKwlzY3NpX3N0YXR1cyA9IGxlMTZfdG9fY3B1KHBrdC0+c2NzaV9zdGF0dXMpICYgU1NfTUFTSzsKKwlsc2NzaV9zdGF0dXMgPSBzY3NpX3N0YXR1cyAmIFNUQVRVU19NQVNLOworCisJQ01EX0VOVFJZX1NUQVRVUyhjcCkgPSBwa3QtPmVudHJ5X3N0YXR1czsKKwlDTURfQ09NUExfU1RBVFVTKGNwKSA9IGNvbXBfc3RhdHVzOworCUNNRF9TQ1NJX1NUQVRVUyhjcCkgPSBzY3NpX3N0YXR1czsKKworCS8qIEdlbmVyYXRlIExVIHF1ZXVlIG9uIGNudHJsLCB0YXJnZXQsIExVTiAqLworCWIgPSBjcC0+ZGV2aWNlLT5jaGFubmVsOworCXQgPSBjcC0+ZGV2aWNlLT5pZDsKKwlsID0gY3AtPmRldmljZS0+bHVuLAorCisJdHEgPSBzcC0+dGd0X3F1ZXVlOworCWxxID0gc3AtPmx1bl9xdWV1ZTsKKworCS8qCisJICogSWYgbG9vcCBpcyBpbiB0cmFuc2llbnQgc3RhdGUgUmVwb3J0IERJRF9CVVNfQlVTWQorCSAqLworCWlmICgoY29tcF9zdGF0dXMgIT0gQ1NfQ09NUExFVEUgfHwgc2NzaV9zdGF0dXMgIT0gMCkpIHsKKwkJaWYgKCEoc3AtPmZsYWdzICYgKFNSQl9JT0NUTCB8IFNSQl9UQVBFKSkgJiYKKwkJICAgIChhdG9taWNfcmVhZCgmaGEtPmxvb3BfZG93bl90aW1lcikgfHwKKwkJCWF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9SRUFEWSkpIHsKKworCQkJREVCVUcyKHByaW50aygic2NzaSglbGQ6JWQ6JWQ6JWQpOiBMb29wIE5vdCBSZWFkeSAtICIKKwkJCSAgICAicGlkPSVseC5cbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8sIGIsIHQsIGwsIGNwLT5zZXJpYWxfbnVtYmVyKSk7CisKKwkJCXFsYTJ4MDBfZXh0ZW5kX3RpbWVvdXQoY3AsIEVYVEVORF9DTURfVElNRU9VVCk7CisJCQlhZGRfdG9fcmV0cnlfcXVldWUoaGEsIHNwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIENoZWNrIGZvciBhbnkgRkNQIHRyYW5zcG9ydCBlcnJvcnMuICovCisJaWYgKHNjc2lfc3RhdHVzICYgU1NfUkVTUE9OU0VfSU5GT19MRU5fVkFMSUQpIHsKKwkJcnNwX2luZm9fbGVuID0gbGUxNl90b19jcHUocGt0LT5yc3BfaW5mb19sZW4pOworCQlpZiAocnNwX2luZm9fbGVuID4gMyAmJiBwa3QtPnJzcF9pbmZvWzNdKSB7CisJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZDolZDolZDolZCkgRkNQIEkvTyBwcm90b2NvbCAiCisJCQkgICAgImZhaWx1cmUgKCV4LyUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4KS4uLiIKKwkJCSAgICAicmV0cnlpbmcgY29tbWFuZFxuIiwgaGEtPmhvc3Rfbm8sIGIsIHQsIGwsCisJCQkgICAgcnNwX2luZm9fbGVuLCBwa3QtPnJzcF9pbmZvWzBdLCBwa3QtPnJzcF9pbmZvWzFdLAorCQkJICAgIHBrdC0+cnNwX2luZm9bMl0sIHBrdC0+cnNwX2luZm9bM10sCisJCQkgICAgcGt0LT5yc3BfaW5mb1s0XSwgcGt0LT5yc3BfaW5mb1s1XSwKKwkJCSAgICBwa3QtPnJzcF9pbmZvWzZdLCBwa3QtPnJzcF9pbmZvWzddKSk7CisKKwkJCWNwLT5yZXN1bHQgPSBESURfQlVTX0JVU1kgPDwgMTY7CisJCQlhZGRfdG9fZG9uZV9xdWV1ZShoYSwgc3ApOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyoKKwkgKiBCYXNlZCBvbiBIb3N0IGFuZCBzY3NpIHN0YXR1cyBnZW5lcmF0ZSBzdGF0dXMgY29kZSBmb3IgTGludXgKKwkgKi8KKwlzd2l0Y2ggKGNvbXBfc3RhdHVzKSB7CisJY2FzZSBDU19DT01QTEVURToKKwkJaWYgKHNjc2lfc3RhdHVzID09IDApIHsKKwkJCWNwLT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc2NzaV9zdGF0dXMgJiAoU1NfUkVTSURVQUxfVU5ERVIgfCBTU19SRVNJRFVBTF9PVkVSKSkgeworCQkJcmVzaWQgPSBsZTMyX3RvX2NwdShwa3QtPnJlc2lkdWFsX2xlbmd0aCk7CisJCQljcC0+cmVzaWQgPSByZXNpZDsKKwkJCUNNRF9SRVNJRF9MRU4oY3ApID0gcmVzaWQ7CisJCX0KKwkJaWYgKGxzY3NpX3N0YXR1cyA9PSBTU19CVVNZX0NPTkRJVElPTikgeworCQkJY3AtPnJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNiB8IGxzY3NpX3N0YXR1czsKKwkJCWJyZWFrOworCQl9CisKKwkJY3AtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IGxzY3NpX3N0YXR1czsKKworCQlpZiAobHNjc2lfc3RhdHVzICE9IFNTX0NIRUNLX0NPTkRJVElPTikKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIENvcHkgU2Vuc2UgRGF0YSBpbnRvIHNlbnNlIGJ1ZmZlcgorCQkgKi8KKwkJbWVtc2V0KGNwLT5zZW5zZV9idWZmZXIsIDAsIHNpemVvZihjcC0+c2Vuc2VfYnVmZmVyKSk7CisKKwkJaWYgKCEoc2NzaV9zdGF0dXMgJiBTU19TRU5TRV9MRU5fVkFMSUQpKQorCQkJYnJlYWs7CisKKwkJaWYgKGxlMTZfdG9fY3B1KHBrdC0+cmVxX3NlbnNlX2xlbmd0aCkgPAorCQkgICAgc2l6ZW9mKGNwLT5zZW5zZV9idWZmZXIpKQorCQkJc2Vuc2Vfc3ogPSBsZTE2X3RvX2NwdShwa3QtPnJlcV9zZW5zZV9sZW5ndGgpOworCQllbHNlCisJCQlzZW5zZV9zeiA9IHNpemVvZihjcC0+c2Vuc2VfYnVmZmVyKTsKKworCQlDTURfQUNUVUFMX1NOU0xFTihjcCkgPSBzZW5zZV9zejsKKwkJc3AtPnJlcXVlc3Rfc2Vuc2VfbGVuZ3RoID0gc2Vuc2Vfc3o7CisJCXNwLT5yZXF1ZXN0X3NlbnNlX3B0ciA9IGNwLT5zZW5zZV9idWZmZXI7CisKKwkJaWYgKHNwLT5yZXF1ZXN0X3NlbnNlX2xlbmd0aCA+IDMyKQorCQkJc2Vuc2Vfc3ogPSAzMjsKKworCQltZW1jcHkoY3AtPnNlbnNlX2J1ZmZlciwgcGt0LT5yZXFfc2Vuc2VfZGF0YSwgc2Vuc2Vfc3opOworCisJCXNwLT5yZXF1ZXN0X3NlbnNlX3B0ciArPSBzZW5zZV9zejsKKwkJc3AtPnJlcXVlc3Rfc2Vuc2VfbGVuZ3RoIC09IHNlbnNlX3N6OworCQlpZiAoc3AtPnJlcXVlc3Rfc2Vuc2VfbGVuZ3RoICE9IDApCisJCQloYS0+c3RhdHVzX3NyYiA9IHNwOworCisJCWlmICghKHNwLT5mbGFncyAmIChTUkJfSU9DVEwgfCBTUkJfVEFQRSkpICYmCisJCSAgICBxbGEyeDAwX2NoZWNrX3NlbnNlKGNwLCBscSkgPT0gUUxBX1NVQ0NFU1MpIHsKKwkJCS8qIFRocm93IGF3YXkgc3RhdHVzX2NvbnQgaWYgYW55ICovCisJCQloYS0+c3RhdHVzX3NyYiA9IE5VTEw7CisJCQlhZGRfdG9fc2NzaV9yZXRyeV9xdWV1ZShoYSwgc3ApOworCQkJcmV0dXJuOworCQl9CisKKwkJREVCVUc1KHByaW50aygiJXMoKTogQ2hlY2sgY29uZGl0aW9uIFNlbnNlIGRhdGEsICIKKwkJICAgICJzY3NpKCVsZDolZDolZDolZCkgY21kPSVwIHBpZD0lbGRcbiIsCisJCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIGIsIHQsIGwsIGNwLAorCQkgICAgY3AtPnNlcmlhbF9udW1iZXIpKTsKKwkJaWYgKHNlbnNlX3N6KQorCQkJREVCVUc1KHFsYTJ4MDBfZHVtcF9idWZmZXIoY3AtPnNlbnNlX2J1ZmZlciwKKwkJCSAgICBDTURfQUNUVUFMX1NOU0xFTihjcCkpKTsKKwkJYnJlYWs7CisKKwljYXNlIENTX0RBVEFfVU5ERVJSVU46CisJCURFQlVHMihwcmludGsoS0VSTl9JTkZPCisJCSAgICAic2NzaSglbGQ6JWQ6JWQpIFVOREVSUlVOIHN0YXR1cyBkZXRlY3RlZCAweCV4LTB4JXguXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHQsIGwsIGNvbXBfc3RhdHVzLCBzY3NpX3N0YXR1cykpOworCisJCXJlc2lkID0gbGUzMl90b19jcHUocGt0LT5yZXNpZHVhbF9sZW5ndGgpOworCQlpZiAoc2NzaV9zdGF0dXMgJiBTU19SRVNJRFVBTF9VTkRFUikgeworCQkJY3AtPnJlc2lkID0gcmVzaWQ7CisJCQlDTURfUkVTSURfTEVOKGNwKSA9IHJlc2lkOworCQl9CisKKwkJLyoKKwkJICogQ2hlY2sgdG8gc2VlIGlmIFNDU0kgU3RhdHVzIGlzIG5vbiB6ZXJvLiBJZiBzbyByZXBvcnQgU0NTSSAKKwkJICogU3RhdHVzLgorCQkgKi8KKwkJaWYgKGxzY3NpX3N0YXR1cyAhPSAwKSB7CisJCQlpZiAobHNjc2lfc3RhdHVzID09IFNTX0JVU1lfQ09ORElUSU9OKSB7CisJCQkJY3AtPnJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNiB8CisJCQkJICAgIGxzY3NpX3N0YXR1czsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY3AtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IGxzY3NpX3N0YXR1czsKKworCQkJaWYgKGxzY3NpX3N0YXR1cyAhPSBTU19DSEVDS19DT05ESVRJT04pCisJCQkJYnJlYWs7CisKKwkJCS8qIENvcHkgU2Vuc2UgRGF0YSBpbnRvIHNlbnNlIGJ1ZmZlciAqLworCQkJbWVtc2V0KGNwLT5zZW5zZV9idWZmZXIsIDAsIHNpemVvZihjcC0+c2Vuc2VfYnVmZmVyKSk7CisKKwkJCWlmICghKHNjc2lfc3RhdHVzICYgU1NfU0VOU0VfTEVOX1ZBTElEKSkKKwkJCQlicmVhazsKKworCQkJaWYgKGxlMTZfdG9fY3B1KHBrdC0+cmVxX3NlbnNlX2xlbmd0aCkgPAorCQkJICAgIHNpemVvZihjcC0+c2Vuc2VfYnVmZmVyKSkKKwkJCQlzZW5zZV9zeiA9IGxlMTZfdG9fY3B1KHBrdC0+cmVxX3NlbnNlX2xlbmd0aCk7CisJCQllbHNlCisJCQkJc2Vuc2Vfc3ogPSBzaXplb2YoY3AtPnNlbnNlX2J1ZmZlcik7CisKKwkJCUNNRF9BQ1RVQUxfU05TTEVOKGNwKSA9IHNlbnNlX3N6OworCQkJc3AtPnJlcXVlc3Rfc2Vuc2VfbGVuZ3RoID0gc2Vuc2Vfc3o7CisJCQlzcC0+cmVxdWVzdF9zZW5zZV9wdHIgPSBjcC0+c2Vuc2VfYnVmZmVyOworCisJCQlpZiAoc3AtPnJlcXVlc3Rfc2Vuc2VfbGVuZ3RoID4gMzIpIAorCQkJCXNlbnNlX3N6ID0gMzI7CisKKwkJCW1lbWNweShjcC0+c2Vuc2VfYnVmZmVyLCBwa3QtPnJlcV9zZW5zZV9kYXRhLCBzZW5zZV9zeik7CisKKwkJCXNwLT5yZXF1ZXN0X3NlbnNlX3B0ciArPSBzZW5zZV9zejsKKwkJCXNwLT5yZXF1ZXN0X3NlbnNlX2xlbmd0aCAtPSBzZW5zZV9zejsKKwkJCWlmIChzcC0+cmVxdWVzdF9zZW5zZV9sZW5ndGggIT0gMCkKKwkJCQloYS0+c3RhdHVzX3NyYiA9IHNwOworCisJCQlpZiAoIShzcC0+ZmxhZ3MgJiAoU1JCX0lPQ1RMIHwgU1JCX1RBUEUpKSAmJgorCQkJICAgIChxbGEyeDAwX2NoZWNrX3NlbnNlKGNwLCBscSkgPT0gUUxBX1NVQ0NFU1MpKSB7CisJCQkJaGEtPnN0YXR1c19zcmIgPSBOVUxMOworCQkJCWFkZF90b19zY3NpX3JldHJ5X3F1ZXVlKGhhLCBzcCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJREVCVUc1KHByaW50aygiJXMoKTogQ2hlY2sgY29uZGl0aW9uIFNlbnNlIGRhdGEsICIKKwkJCSAgICAic2NzaSglbGQ6JWQ6JWQ6JWQpIGNtZD0lcCBwaWQ9JWxkXG4iLAorCQkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubywgYiwgdCwgbCwgY3AsCisJCQkgICAgY3AtPnNlcmlhbF9udW1iZXIpKTsKKwkJCWlmIChzZW5zZV9zeikKKwkJCQlERUJVRzUocWxhMngwMF9kdW1wX2J1ZmZlcihjcC0+c2Vuc2VfYnVmZmVyLAorCQkJCSAgICBDTURfQUNUVUFMX1NOU0xFTihjcCkpKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBJZiBSSVNDIHJlcG9ydHMgdW5kZXJydW4gYW5kIHRhcmdldCBkb2VzIG5vdCByZXBvcnQKKwkJCSAqIGl0IHRoZW4gd2UgbXVzdCBoYXZlIGEgbG9zdCBmcmFtZSwgc28gdGVsbCB1cHBlcgorCQkJICogbGF5ZXIgdG8gcmV0cnkgaXQgYnkgcmVwb3J0aW5nIGEgYnVzIGJ1c3kuCisJCQkgKi8KKwkJCWlmICghKHNjc2lfc3RhdHVzICYgU1NfUkVTSURVQUxfVU5ERVIpKSB7CisJCQkJREVCVUcyKHByaW50aygic2NzaSglbGQ6JWQ6JWQ6JWQpIERyb3BwZWQgIgorCQkJCSAgICAiZnJhbWUocykgZGV0ZWN0ZWQgKCV4IG9mICV4IGJ5dGVzKS4uLiIKKwkJCQkgICAgInJldHJ5aW5nIGNvbW1hbmQuXG4iLAorCQkJCSAgICBoYS0+aG9zdF9ubywgYiwgdCwgbCwgcmVzaWQsCisJCQkJICAgIGNwLT5yZXF1ZXN0X2J1ZmZsZW4pKTsKKworCQkJCWNwLT5yZXN1bHQgPSBESURfQlVTX0JVU1kgPDwgMTY7CisJCQkJaGEtPmRyb3BwZWRfZnJhbWVfZXJyb3JfY250Kys7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIEhhbmRsZSBtaWQtbGF5ZXIgdW5kZXJmbG93ICovCisJCQlpZiAoKHVuc2lnbmVkKShjcC0+cmVxdWVzdF9idWZmbGVuIC0gcmVzaWQpIDwKKwkJCSAgICBjcC0+dW5kZXJmbG93KSB7CisJCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCSAgICAic2NzaSglbGQ6JWQ6JWQ6JWQpOiBNaWQtbGF5ZXIgdW5kZXJmbG93ICIKKwkJCQkgICAgImRldGVjdGVkICgleCBvZiAleCBieXRlcykuLi5yZXR1cm5pbmcgIgorCQkJCSAgICAiZXJyb3Igc3RhdHVzLlxuIiwKKwkJCQkgICAgaGEtPmhvc3Rfbm8sIGIsIHQsIGwsIHJlc2lkLAorCQkJCSAgICBjcC0+cmVxdWVzdF9idWZmbGVuKTsKKworCQkJCWNwLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIEV2ZXJ5Ym9keSBvbmxpbmUsIGxvb2tpbmcgZ29vZC4uLiAqLworCQkJY3AtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ1NfREFUQV9PVkVSUlVOOgorCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTworCQkgICAgInNjc2koJWxkOiVkOiVkKTogT1ZFUlJVTiBzdGF0dXMgZGV0ZWN0ZWQgMHgleC0weCV4XG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHQsIGwsIGNvbXBfc3RhdHVzLCBzY3NpX3N0YXR1cykpOworCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTworCQkgICAgIkNEQjogMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXhcbiIsCisJCSAgICBjcC0+Y21uZFswXSwgY3AtPmNtbmRbMV0sIGNwLT5jbW5kWzJdLCBjcC0+Y21uZFszXSwKKwkJICAgIGNwLT5jbW5kWzRdLCBjcC0+Y21uZFs1XSkpOworCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTworCQkgICAgIlBJRD0weCVseCByZXE9MHgleCB4dHJhPTB4JXggLS0gcmV0dXJuaW5nIERJRF9FUlJPUiAiCisJCSAgICAic3RhdHVzIVxuIiwKKwkJICAgIGNwLT5zZXJpYWxfbnVtYmVyLCBjcC0+cmVxdWVzdF9idWZmbGVuLAorCQkgICAgbGUzMl90b19jcHUocGt0LT5yZXNpZHVhbF9sZW5ndGgpKSk7CisKKwkJY3AtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJYnJlYWs7CisKKwljYXNlIENTX1BPUlRfTE9HR0VEX09VVDoKKwljYXNlIENTX1BPUlRfQ09ORklHX0NIRzoKKwljYXNlIENTX1BPUlRfQlVTWToKKwljYXNlIENTX0lOQ09NUExFVEU6CisJY2FzZSBDU19QT1JUX1VOQVZBSUxBQkxFOgorCQkvKgorCQkgKiBJZiB0aGUgcG9ydCBpcyBpbiBUYXJnZXQgRG93biBzdGF0ZSwgcmV0dXJuIGFsbCBJT3MgZm9yIHRoaXMKKwkJICogVGFyZ2V0IHdpdGggRElEX05PX0NPTk5FQ1QgRUxTRSBRdWV1ZSB0aGUgSU9zIGluIHRoZQorCQkgKiByZXRyeV9xdWV1ZS4KKwkJICovCisJCWZjcG9ydCA9IHNwLT5mY2x1bi0+ZmNwb3J0OworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZDolZDolZCk6IHN0YXR1c19lbnRyeTogUG9ydCBEb3duICIKKwkJICAgICJwaWQ9JWxkLCBjb21wbCBzdGF0dXM9MHgleCwgcG9ydCBzdGF0ZT0weCV4XG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHQsIGwsIGNwLT5zZXJpYWxfbnVtYmVyLCBjb21wX3N0YXR1cywKKwkJICAgIGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSkpOworCisJCWlmICgoc3AtPmZsYWdzICYgKFNSQl9JT0NUTCB8IFNSQl9UQVBFKSkgfHwKKwkJICAgIGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSA9PSBGQ1NfREVWSUNFX0RFQUQpIHsKKwkJCWNwLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJCWlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpID09IExPT1BfRE9XTikgCisJCQkJc3AtPmVycl9pZCA9IFNSQl9FUlJfTE9PUDsKKwkJCWVsc2UKKwkJCQlzcC0+ZXJyX2lkID0gU1JCX0VSUl9QT1JUOworCQkJYWRkX3RvX2RvbmVfcXVldWUoaGEsIHNwKTsKKwkJfSBlbHNlIHsKKwkJCXFsYTJ4MDBfZXh0ZW5kX3RpbWVvdXQoY3AsIEVYVEVORF9DTURfVElNRU9VVCk7CisJCQlhZGRfdG9fcmV0cnlfcXVldWUoaGEsIHNwKTsKKwkJfQorCisJCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgPT0gRkNTX09OTElORSkgeworCQkJcWxhMngwMF9tYXJrX2RldmljZV9sb3N0KGhhLCBmY3BvcnQsIDEpOworCQl9CisKKwkJcmV0dXJuOworCQlicmVhazsKKworCWNhc2UgQ1NfUkVTRVQ6CisJCURFQlVHMihwcmludGsoS0VSTl9JTkZPCisJCSAgICAic2NzaSglbGQpOiBSRVNFVCBzdGF0dXMgZGV0ZWN0ZWQgMHgleC0weCV4LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBjb21wX3N0YXR1cywgc2NzaV9zdGF0dXMpKTsKKworCQlpZiAoc3AtPmZsYWdzICYgKFNSQl9JT0NUTCB8IFNSQl9UQVBFKSkgeworCQkJY3AtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwkJfSBlbHNlIHsKKwkJCXFsYTJ4MDBfZXh0ZW5kX3RpbWVvdXQoY3AsIEVYVEVORF9DTURfVElNRU9VVCk7CisJCQlhZGRfdG9fcmV0cnlfcXVldWUoaGEsIHNwKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ1NfQUJPUlRFRDoKKwkJLyogCisJCSAqIGh2Mi4xOS4xMiAtIERJRF9BQk9SVCBkb2VzIG5vdCByZXRyeSB0aGUgcmVxdWVzdCBpZiB3ZQorCQkgKiBhYm9ydGVkIHRoaXMgcmVxdWVzdCB0aGVuIGFib3J0IG90aGVyd2lzZSBpdCBtdXN0IGJlIGEKKwkJICogcmVzZXQuCisJCSAqLworCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTworCQkgICAgInNjc2koJWxkKTogQUJPUlQgc3RhdHVzIGRldGVjdGVkIDB4JXgtMHgleC5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgY29tcF9zdGF0dXMsIHNjc2lfc3RhdHVzKSk7CisKKwkJY3AtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwkJYnJlYWs7CisKKwljYXNlIENTX1RJTUVPVVQ6CisJCURFQlVHMihwcmludGsoS0VSTl9JTkZPCisJCSAgICAic2NzaSglbGQ6JWQ6JWQ6JWQpOiBUSU1FT1VUIHN0YXR1cyBkZXRlY3RlZCAweCV4LTB4JXggIgorCQkgICAgInNmbGFncz0leC5cbiIsIGhhLT5ob3N0X25vLCBiLCB0LCBsLCBjb21wX3N0YXR1cywKKwkJICAgIHNjc2lfc3RhdHVzLCBsZTE2X3RvX2NwdShwa3QtPnN0YXR1c19mbGFncykpKTsKKworCQljcC0+cmVzdWx0ID0gRElEX0JVU19CVVNZIDw8IDE2OworCisJCWZjcG9ydCA9IGxxLT5mY2x1bi0+ZmNwb3J0OworCisJCS8qIENoZWNrIHRvIHNlZSBpZiBsb2dvdXQgb2NjdXJyZWQgKi8KKwkJaWYgKChsZTE2X3RvX2NwdShwa3QtPnN0YXR1c19mbGFncykgJiBTRl9MT0dPVVRfU0VOVCkpIHsKKwkJCXFsYTJ4MDBfbWFya19kZXZpY2VfbG9zdChoYSwgZmNwb3J0LCAxKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ1NfUVVFVUVfRlVMTDoKKwkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KKwkJICAgICJzY3NpKCVsZCk6IFFVRVVFIEZVTEwgc3RhdHVzIGRldGVjdGVkIDB4JXgtMHgleC5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgY29tcF9zdGF0dXMsIHNjc2lfc3RhdHVzKSk7CisKKwkJLyogU0NTSSBNaWQtTGF5ZXIgaGFuZGxlcyBkZXZpY2UgcXVldWUgZnVsbCAqLworCisJCWNwLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBsc2NzaV9zdGF0dXM7IAorCisJCS8qIFRPRE86ID8/PyAqLworCQkvKiBBZGp1c3QgcXVldWUgZGVwdGggKi8KKwkJcmV0ID0gc2NzaV90cmFja19xdWV1ZV9mdWxsKGNwLT5kZXZpY2UsCisJCSAgICBzcC0+bHVuX3F1ZXVlLT5vdXRfY250IC0gMSk7CisJCWlmIChyZXQpIHsKKwkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCSAgICAic2NzaSglbGQ6JWQ6JWQ6JWQpOiBRdWV1ZSBkZXB0aCBhZGp1c3RlZCB0byAlZC5cbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8sIGNwLT5kZXZpY2UtPmNoYW5uZWwsIGNwLT5kZXZpY2UtPmlkLAorCQkJICAgIGNwLT5kZXZpY2UtPmx1biwgcmV0KTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogRXJyb3IgZGV0ZWN0ZWQgKHVua25vd24gc3RhdHVzKSAiCisJCSAgICAiMHgleC0weCV4LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBjb21wX3N0YXR1cywgc2NzaV9zdGF0dXMpKTsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkgICAgIlVua25vd24gc3RhdHVzIGRldGVjdGVkIDB4JXgtMHgleC5cbiIsCisJCSAgICBjb21wX3N0YXR1cywgc2NzaV9zdGF0dXMpOworCisJCWNwLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCWJyZWFrOworCX0KKworCS8qIFBsYWNlIGNvbW1hbmQgb24gZG9uZSBxdWV1ZS4gKi8KKwlpZiAoaGEtPnN0YXR1c19zcmIgPT0gTlVMTCkKKwkJYWRkX3RvX2RvbmVfcXVldWUoaGEsIHNwKTsKK30KKworLyoqCisgKiBxbGEyeDAwX3N0YXR1c19jb250X2VudHJ5KCkgLSBQcm9jZXNzIGEgU3RhdHVzIENvbnRpbnVhdGlvbnMgZW50cnkuCisgKiBAaGE6IFNDU0kgZHJpdmVyIEhBIGNvbnRleHQKKyAqIEBwa3Q6IEVudHJ5IHBvaW50ZXIKKyAqCisgKiBFeHRlbmRlZCBzZW5zZSBkYXRhLgorICovCitzdGF0aWMgdm9pZAorcWxhMngwMF9zdGF0dXNfY29udF9lbnRyeShzY3NpX3FsYV9ob3N0X3QgKmhhLCBzdHNfY29udF9lbnRyeV90ICpwa3QpCit7CisJdWludDhfdAkJc2Vuc2Vfc3ogPSAwOworCXNyYl90CQkqc3AgPSBoYS0+c3RhdHVzX3NyYjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjcDsKKworCWlmIChzcCAhPSBOVUxMICYmIHNwLT5yZXF1ZXN0X3NlbnNlX2xlbmd0aCAhPSAwKSB7CisJCWNwID0gc3AtPmNtZDsKKwkJaWYgKGNwID09IE5VTEwpIHsKKwkJCURFQlVHMihwcmludGsoIiVzKCk6IENtZCBhbHJlYWR5IHJldHVybmVkIGJhY2sgdG8gT1MgIgorCQkJICAgICJzcD0lcCBzcC0+c3RhdGU6JWRcbiIsIF9fZnVuY19fLCBzcCwgc3AtPnN0YXRlKSk7CisJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkgICAgImNtZCBpcyBOVUxMOiBhbHJlYWR5IHJldHVybmVkIHRvIE9TIChzcD0lcClcbiIsCisJCQkgICAgc3ApOyAKKworCQkJaGEtPnN0YXR1c19zcmIgPSBOVUxMOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKHNwLT5yZXF1ZXN0X3NlbnNlX2xlbmd0aCA+IHNpemVvZihwa3QtPmRhdGEpKSB7CisJCQlzZW5zZV9zeiA9IHNpemVvZihwa3QtPmRhdGEpOworCQl9IGVsc2UgeworCQkJc2Vuc2Vfc3ogPSBzcC0+cmVxdWVzdF9zZW5zZV9sZW5ndGg7CisJCX0KKworCQkvKiBNb3ZlIHNlbnNlIGRhdGEuICovCisJCW1lbWNweShzcC0+cmVxdWVzdF9zZW5zZV9wdHIsIHBrdC0+ZGF0YSwgc2Vuc2Vfc3opOworCQlERUJVRzUocWxhMngwMF9kdW1wX2J1ZmZlcihzcC0+cmVxdWVzdF9zZW5zZV9wdHIsIHNlbnNlX3N6KSk7CisKKwkJc3AtPnJlcXVlc3Rfc2Vuc2VfcHRyICs9IHNlbnNlX3N6OworCQlzcC0+cmVxdWVzdF9zZW5zZV9sZW5ndGggLT0gc2Vuc2Vfc3o7CisKKwkJLyogUGxhY2UgY29tbWFuZCBvbiBkb25lIHF1ZXVlLiAqLworCQlpZiAoc3AtPnJlcXVlc3Rfc2Vuc2VfbGVuZ3RoID09IDApIHsKKwkJCWFkZF90b19kb25lX3F1ZXVlKGhhLCBzcCk7CisJCQloYS0+c3RhdHVzX3NyYiA9IE5VTEw7CisJCX0KKwl9Cit9CisKKy8qKgorICogcWxhMngwMF9lcnJvcl9lbnRyeSgpIC0gUHJvY2VzcyBhbiBlcnJvciBlbnRyeS4KKyAqIEBoYTogU0NTSSBkcml2ZXIgSEEgY29udGV4dAorICogQHBrdDogRW50cnkgcG9pbnRlcgorICovCitzdGF0aWMgdm9pZAorcWxhMngwMF9lcnJvcl9lbnRyeShzY3NpX3FsYV9ob3N0X3QgKmhhLCBzdHNfZW50cnlfdCAqcGt0KSAKK3sKKwlzcmJfdCAqc3A7CisKKyNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzIpCisJaWYgKHBrdC0+ZW50cnlfc3RhdHVzICYgUkZfSU5WX0VfT1JERVIpCisJCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IEludmFsaWQgRW50cnkgT3JkZXJcbiIsIF9fZnVuY19fKTsKKwllbHNlIGlmIChwa3QtPmVudHJ5X3N0YXR1cyAmIFJGX0lOVl9FX0NPVU5UKQorCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBJbnZhbGlkIEVudHJ5IENvdW50XG4iLCBfX2Z1bmNfXyk7CisJZWxzZSBpZiAocGt0LT5lbnRyeV9zdGF0dXMgJiBSRl9JTlZfRV9QQVJBTSkKKwkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsIAorCQkgICAgIiVzOiBJbnZhbGlkIEVudHJ5IFBhcmFtZXRlclxuIiwgX19mdW5jX18pOworCWVsc2UgaWYgKHBrdC0+ZW50cnlfc3RhdHVzICYgUkZfSU5WX0VfVFlQRSkKKwkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogSW52YWxpZCBFbnRyeSBUeXBlXG4iLCBfX2Z1bmNfXyk7CisJZWxzZSBpZiAocGt0LT5lbnRyeV9zdGF0dXMgJiBSRl9CVVNZKQorCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBCdXN5XG4iLCBfX2Z1bmNfXyk7CisJZWxzZQorCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBVTktOT1dOIGZsYWcgZXJyb3JcbiIsIF9fZnVuY19fKTsKKyNlbmRpZgorCisJLyogVmFsaWRhdGUgaGFuZGxlLiAqLworCWlmIChwa3QtPmhhbmRsZSA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUykKKwkJc3AgPSBoYS0+b3V0c3RhbmRpbmdfY21kc1twa3QtPmhhbmRsZV07CisJZWxzZQorCQlzcCA9IE5VTEw7CisKKwlpZiAoc3ApIHsKKwkJLyogRnJlZSBvdXRzdGFuZGluZyBjb21tYW5kIHNsb3QuICovCisJCWhhLT5vdXRzdGFuZGluZ19jbWRzW3BrdC0+aGFuZGxlXSA9IE5VTEw7CisJCWlmIChoYS0+YWN0dGhyZWFkcykKKwkJCWhhLT5hY3R0aHJlYWRzLS07CisJCXNwLT5sdW5fcXVldWUtPm91dF9jbnQtLTsKKworCQkvKiBCYWQgcGF5bG9hZCBvciBoZWFkZXIgKi8KKwkJaWYgKHBrdC0+ZW50cnlfc3RhdHVzICYKKwkJICAgIChSRl9JTlZfRV9PUkRFUiB8IFJGX0lOVl9FX0NPVU5UIHwKKwkJICAgICBSRl9JTlZfRV9QQVJBTSB8IFJGX0lOVl9FX1RZUEUpKSB7CisJCQlzcC0+Y21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCX0gZWxzZSBpZiAocGt0LT5lbnRyeV9zdGF0dXMgJiBSRl9CVVNZKSB7CisJCQlzcC0+Y21kLT5yZXN1bHQgPSBESURfQlVTX0JVU1kgPDwgMTY7CisJCX0gZWxzZSB7CisJCQlzcC0+Y21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCX0KKwkJLyogUGxhY2UgY29tbWFuZCBvbiBkb25lIHF1ZXVlLiAqLworCQlhZGRfdG9fZG9uZV9xdWV1ZShoYSwgc3ApOworCisJfSBlbHNlIGlmIChwa3QtPmVudHJ5X3R5cGUgPT0gQ09NTUFORF9BNjRfVFlQRSB8fAorCSAgICBwa3QtPmVudHJ5X3R5cGUgPT0gQ09NTUFORF9UWVBFKSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRXJyb3IgZW50cnkgLSBpbnZhbGlkIGhhbmRsZVxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJFcnJvciBlbnRyeSAtIGludmFsaWQgaGFuZGxlXG4iKTsKKworCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJaWYgKGhhLT5kcGNfd2FpdCAmJiAhaGEtPmRwY19hY3RpdmUpIAorCQkJdXAoaGEtPmRwY193YWl0KTsKKwl9Cit9CisKKy8qKgorICogcWxhMngwMF9tc19lbnRyeSgpIC0gUHJvY2VzcyBhIE1hbmFnZW1lbnQgU2VydmVyIGVudHJ5LgorICogQGhhOiBTQ1NJIGRyaXZlciBIQSBjb250ZXh0CisgKiBAaW5kZXg6IFJlc3BvbnNlIHF1ZXVlIG91dCBwb2ludGVyCisgKi8KK3N0YXRpYyB2b2lkCitxbGEyeDAwX21zX2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqaGEsIG1zX2lvY2JfZW50cnlfdCAqcGt0KSAKK3sKKwlzcmJfdCAgICAgICAgICAqc3A7CisKKwlERUJVRzMocHJpbnRrKCIlcyglbGQpOiBwa3Q9JXAgcGt0aGFuZGxlPSVkLlxuIiwKKwkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vLCBwa3QsIHBrdC0+aGFuZGxlMSkpOworCisJLyogVmFsaWRhdGUgaGFuZGxlLiAqLworIAlpZiAocGt0LT5oYW5kbGUxIDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKQorIAkJc3AgPSBoYS0+b3V0c3RhbmRpbmdfY21kc1twa3QtPmhhbmRsZTFdOworCWVsc2UKKwkJc3AgPSBOVUxMOworCisJaWYgKHNwID09IE5VTEwpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBNUyBlbnRyeSAtIGludmFsaWQgaGFuZGxlXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiTVMgZW50cnkgLSBpbnZhbGlkIGhhbmRsZVxuIik7CisKKwkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlDTURfQ09NUExfU1RBVFVTKHNwLT5jbWQpID0gbGUxNl90b19jcHUocGt0LT5zdGF0dXMpOworCUNNRF9FTlRSWV9TVEFUVVMoc3AtPmNtZCkgPSBwa3QtPmVudHJ5X3N0YXR1czsKKworCS8qIEZyZWUgb3V0c3RhbmRpbmcgY29tbWFuZCBzbG90LiAqLworCWhhLT5vdXRzdGFuZGluZ19jbWRzW3BrdC0+aGFuZGxlMV0gPSBOVUxMOworCisJYWRkX3RvX2RvbmVfcXVldWUoaGEsIHNwKTsKK30KKworLyoqCisgKiBxbGEyeDAwX2NoZWNrX3NlbnNlKCkgLSBQZXJmb3JtIGFueSBzZW5zZSBkYXRhIGludGVycm9nYXRpb24uCisgKiBAY3A6IFNDU0kgQ29tbWFuZAorICogQGxxOiBMdW4gcXVldWUKKyAqCisgKiBSZXR1cm5zIFFMQV9TVUNDRVNTIGlmIHRoZSBsdW4gcXVldWUgaXMgc3VzcGVuZGVkLCBlbHNlCisgKiBRTEFfRlVOQ1RJT05fRkFJTEVEICAobHVuIHF1ZXVlIG5vdCBzdXNwZW5kZWQpLgorICovCitzdGF0aWMgaW50IAorcWxhMngwMF9jaGVja19zZW5zZShzdHJ1Y3Qgc2NzaV9jbW5kICpjcCwgb3NfbHVuX3QgKmxxKQoreworCXNjc2lfcWxhX2hvc3RfdAkqaGE7CisJc3JiX3QJCSpzcDsKKwlmY19wb3J0X3QJKmZjcG9ydDsKKworCWhhID0gKHNjc2lfcWxhX2hvc3RfdCAqKSBjcC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlpZiAoKGNwLT5zZW5zZV9idWZmZXJbMF0gJiAweDcwKSAhPSAweDcwKSB7CisJCXJldHVybiAoUUxBX0ZVTkNUSU9OX0ZBSUxFRCk7CisJfQorCisJc3AgPSAoc3JiX3QgKiApQ01EX1NQKGNwKTsKKwlzcC0+ZmxhZ3MgfD0gU1JCX0dPVF9TRU5TRTsKKworCXN3aXRjaCAoY3AtPnNlbnNlX2J1ZmZlclsyXSAmIDB4ZikgeworCWNhc2UgUkVDT1ZFUkVEX0VSUk9SOgorCQljcC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCQljcC0+c2Vuc2VfYnVmZmVyWzBdID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIE5PVF9SRUFEWToKKwkJZmNwb3J0ID0gbHEtPmZjbHVuLT5mY3BvcnQ7CisKKwkJLyoKKwkJICogU3VzcGVuZCB0aGUgbHVuIG9ubHkgZm9yIGhhcmQgZGlzayBkZXZpY2UgdHlwZS4KKwkJICovCisJCWlmICgoZmNwb3J0LT5mbGFncyAmIEZDRl9UQVBFX1BSRVNFTlQpID09IDAgJiYKKwkJICAgIGxxLT5xX3N0YXRlICE9IExVTl9TVEFURV9USU1FT1VUKSB7CisJCQkvKgorCQkJICogSWYgdGFyZ2V0IGlzIGluIHByb2Nlc3Mgb2YgYmVpbmcgcmVhZHkgdGhlbiBzdXNwZW5kCisJCQkgKiBsdW4gZm9yIDYgc2VjcyBhbmQgcmV0cnkgYWxsIHRoZSBjb21tYW5kcy4KKwkJCSAqLworCQkJaWYgKGNwLT5zZW5zZV9idWZmZXJbMTJdID09IDB4NCAmJgorCQkJICAgIGNwLT5zZW5zZV9idWZmZXJbMTNdID09IDB4MSkgeworCisJCQkJLyogU3VzcGVuZCB0aGUgbHVuIGZvciA2IHNlY3MgKi8KKwkJCQlxbGEyeDAwX3N1c3BlbmRfbHVuKGhhLCBscSwgNiwKKwkJCQkgICAgcWwyeHN1c3BlbmRjb3VudCk7CisKKwkJCQlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2xpc3RvcHMuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9saXN0b3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhMDM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9saXN0b3BzLmgKQEAgLTAsMCArMSwzNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgUUxPR0lDIExJTlVYIFNPRlRXQVJFCisgKgorICogUUxvZ2ljIElTUDJ4MDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi42LngKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFFMb2dpYyBDb3Jwb3JhdGlvbgorICogKHd3dy5xbG9naWMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNYW5hZ2VtZW50IGZ1bmN0aW9ucyBmb3IgdmFyaW91cyBsaXN0cyAqLworCisvKiBfX2FkZF90b19kb25lX3F1ZXVlKCkKKyAqIAorICogUGxhY2UgU1JCIGNvbW1hbmQgb24gZG9uZSBxdWV1ZS4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgICAgICAgICAgID0gaG9zdCBwb2ludGVyCisgKiAgICAgIHNwICAgICAgICAgICA9IHNyYiBwb2ludGVyLgorICogTG9ja2luZzoKKyAqIAl0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhlIGhhLT5saXN0X2xvY2sgaXMgYWxyZWFkeSB0YWtlbgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgCitfX2FkZF90b19kb25lX3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsIHNyYl90ICogc3ApCit7CisJLyoKKyAgICAgICAgaWYgKHNwLT5zdGF0ZSAhPSBTUkJfTk9fUVVFVUVfU1RBVEUgJiYgCisgICAgICAgIAlzcC0+c3RhdGUgIT0gU1JCX0FDVElWRV9TVEFURSkKKwkJQlVHKCk7CisJKi8KKworICAgICAgICAvKiBQbGFjZSBibG9jayBvbiBkb25lIHF1ZXVlICovCisgICAgICAgIHNwLT5jbWQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSBOVUxMOworICAgICAgICBzcC0+c3RhdGUgPSBTUkJfRE9ORV9TVEFURTsKKyAgICAgICAgbGlzdF9hZGRfdGFpbCgmc3AtPmxpc3QsJmhhLT5kb25lX3F1ZXVlKTsKKyAgICAgICAgaGEtPmRvbmVfcV9jbnQrKzsKKwlzcC0+aGEgPSBoYTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIAorX19hZGRfdG9fcmV0cnlfcXVldWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwgc3JiX3QgKiBzcCkKK3sKKwkvKgorICAgICAgICBpZiggc3AtPnN0YXRlICE9IFNSQl9OT19RVUVVRV9TVEFURSAmJiAKKyAgICAgICAgCXNwLT5zdGF0ZSAhPSBTUkJfQUNUSVZFX1NUQVRFKQorCQlCVUcoKTsKKwkqLworCisgICAgICAgIC8qIFBsYWNlIGJsb2NrIG9uIHJldHJ5IHF1ZXVlICovCisgICAgICAgIGxpc3RfYWRkX3RhaWwoJnNwLT5saXN0LCZoYS0+cmV0cnlfcXVldWUpOworICAgICAgICBoYS0+cmV0cnlfcV9jbnQrKzsKKyAgICAgICAgc3AtPmZsYWdzIHw9IFNSQl9XQVRDSERPRzsKKyAgICAgICAgc3AtPnN0YXRlID0gU1JCX1JFVFJZX1NUQVRFOworCXNwLT5oYSA9IGhhOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgCitfX2FkZF90b19zY3NpX3JldHJ5X3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsIHNyYl90ICogc3ApCit7CisJLyoKKyAgICAgICAgaWYoIHNwLT5zdGF0ZSAhPSBTUkJfTk9fUVVFVUVfU1RBVEUgJiYgCisgICAgICAgIAlzcC0+c3RhdGUgIT0gU1JCX0FDVElWRV9TVEFURSkKKwkJQlVHKCk7CisJKi8KKworICAgICAgICAvKiBQbGFjZSBibG9jayBvbiByZXRyeSBxdWV1ZSAqLworICAgICAgICBsaXN0X2FkZF90YWlsKCZzcC0+bGlzdCwmaGEtPnNjc2lfcmV0cnlfcXVldWUpOworICAgICAgICBoYS0+c2NzaV9yZXRyeV9xX2NudCsrOworICAgICAgICBzcC0+c3RhdGUgPSBTUkJfU0NTSV9SRVRSWV9TVEFURTsKKwlzcC0+aGEgPSBoYTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIAorYWRkX3RvX2RvbmVfcXVldWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwgc3JiX3QgKiBzcCkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworICAgICAgICBfX2FkZF90b19kb25lX3F1ZXVlKGhhLHNwKTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgCithZGRfdG9fZnJlZV9xdWV1ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLCBzcmJfdCAqIHNwKQoreworCW1lbXBvb2xfZnJlZShzcCwgaGEtPnNyYl9tZW1wb29sKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIAorYWRkX3RvX3JldHJ5X3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsIHNyYl90ICogc3ApCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKKyAgICAgICAgX19hZGRfdG9fcmV0cnlfcXVldWUoaGEsc3ApOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+bGlzdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAKK2FkZF90b19zY3NpX3JldHJ5X3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsIHNyYl90ICogc3ApCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKKyAgICAgICAgX19hZGRfdG9fc2NzaV9yZXRyeV9xdWV1ZShoYSxzcCk7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIF9fZGVsX2Zyb21fcmV0cnlfcXVldWUKKyAqICAgICAgRnVuY3Rpb24gdXNlZCB0byByZW1vdmUgYSBjb21tYW5kIGJsb2NrIGZyb20gdGhlCisgKiAgICAgIHdhdGNoZG9nIHRpbWVyIHF1ZXVlLgorICoKKyAqICAgICAgTm90ZTogTXVzdCBpbnN1cmUgdGhhdCBjb21tYW5kIGlzIG9uIHdhdGNoZG9nCisgKiAgICAgICAgICAgIGxpc3QgYmVmb3JlIGNhbGxpbmcgZGVsX2Zyb21fcmV0cnlfcXVldWUKKyAqICAgICAgICAgICAgaWYgKHNwLT5mbGFncyAmIFNSQl9XQVRDSERPRykKKyAqCisgKiBJbnB1dDogCisgKiAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICogICAgICBzcCA9IHNyYiBwb2ludGVyLgorICogTG9ja2luZzoKKyAqCXRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGUgbGlzdF9sb2NrIGlzIGFscmVhZHkgdGFrZW4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIAorX19kZWxfZnJvbV9yZXRyeV9xdWV1ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLCBzcmJfdCAqIHNwKQoreworICAgICAgICBsaXN0X2RlbF9pbml0KCZzcC0+bGlzdCk7CisKKyAgICAgICAgc3AtPmZsYWdzICY9IH4oU1JCX1dBVENIRE9HIHwgU1JCX0JVU1kpOworICAgICAgICBzcC0+c3RhdGUgPSBTUkJfTk9fUVVFVUVfU1RBVEU7CisgICAgICAgIGhhLT5yZXRyeV9xX2NudC0tOworfQorCisvKgorICogX19kZWxfZnJvbV9zY3NpX3JldHJ5X3F1ZXVlCisgKiAgICAgIEZ1bmN0aW9uIHVzZWQgdG8gcmVtb3ZlIGEgY29tbWFuZCBibG9jayBmcm9tIHRoZQorICogICAgICBzY3NpIHJldHJ5IHF1ZXVlLgorICoKKyAqIElucHV0OiAKKyAqICAgICAgaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKiAgICAgIHNwID0gc3JiIHBvaW50ZXIuCisgKiBMb2NraW5nOgorICoJdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoZSBsaXN0X2xvY2sgaXMgYWxyZWFkeSB0YWtlbgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgCitfX2RlbF9mcm9tX3Njc2lfcmV0cnlfcXVldWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwgc3JiX3QgKiBzcCkKK3sKKyAgICAgICAgbGlzdF9kZWxfaW5pdCgmc3AtPmxpc3QpOworCisgICAgICAgIGhhLT5zY3NpX3JldHJ5X3FfY250LS07CisgICAgICAgIHNwLT5zdGF0ZSA9IFNSQl9OT19RVUVVRV9TVEFURTsKK30KKworLyoKKyAqIGRlbF9mcm9tX3JldHJ5X3F1ZXVlCisgKiAgICAgIEZ1bmN0aW9uIHVzZWQgdG8gcmVtb3ZlIGEgY29tbWFuZCBibG9jayBmcm9tIHRoZQorICogICAgICB3YXRjaGRvZyB0aW1lciBxdWV1ZS4KKyAqCisgKiAgICAgIE5vdGU6IE11c3QgaW5zdXJlIHRoYXQgY29tbWFuZCBpcyBvbiB3YXRjaGRvZworICogICAgICAgICAgICBsaXN0IGJlZm9yZSBjYWxsaW5nIGRlbF9mcm9tX3JldHJ5X3F1ZXVlCisgKiAgICAgICAgICAgIGlmIChzcC0+ZmxhZ3MgJiBTUkJfV0FUQ0hET0cpCisgKgorICogSW5wdXQ6IAorICogICAgICBoYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqICAgICAgc3AgPSBzcmIgcG9pbnRlci4KKyAqIExvY2tpbmc6CisgKgl0aGlzIGZ1bmN0aW9uIHRha2VzIGFuZCByZWxlYXNlcyB0aGUgbGlzdF9sb2NrCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAKK2RlbF9mcm9tX3JldHJ5X3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsIHNyYl90ICogc3ApCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAgICAgLyoJaWYgKHVubGlrZWx5KCEoc3AtPmZsYWdzICYgU1JCX1dBVENIRE9HKSkpCisgICAgICAgIAkJQlVHKCk7Ki8KKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKKworICAgICAgICAvKglpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmaGEtPnJldHJ5X3F1ZXVlKSkpCisgICAgICAgIAkJQlVHKCk7Ki8KKworICAgICAgICBfX2RlbF9mcm9tX3JldHJ5X3F1ZXVlKGhhLHNwKTsKKworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+bGlzdF9sb2NrLCBmbGFncyk7Cit9CisvKgorICogZGVsX2Zyb21fc2NzaV9yZXRyeV9xdWV1ZQorICogICAgICBGdW5jdGlvbiB1c2VkIHRvIHJlbW92ZSBhIGNvbW1hbmQgYmxvY2sgZnJvbSB0aGUKKyAqICAgICAgc2NzaSByZXRyeSBxdWV1ZS4KKyAqCisgKiBJbnB1dDogCisgKiAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICogICAgICBzcCA9IHNyYiBwb2ludGVyLgorICogTG9ja2luZzoKKyAqCXRoaXMgZnVuY3Rpb24gdGFrZXMgYW5kIHJlbGVhc2VzIHRoZSBsaXN0X2xvY2sKKyAqLworc3RhdGljIGlubGluZSB2b2lkIAorZGVsX2Zyb21fc2NzaV9yZXRyeV9xdWV1ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLCBzcmJfdCAqIHNwKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+bGlzdF9sb2NrLCBmbGFncyk7CisKKyAgICAgICAgLyoJaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJmhhLT5zY3NpX3JldHJ5X3F1ZXVlKSkpCisgICAgICAgIAkJQlVHKCk7Ki8KKworICAgICAgICBfX2RlbF9mcm9tX3Njc2lfcmV0cnlfcXVldWUoaGEsc3ApOworCisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIF9fYWRkX3RvX3BlbmRpbmdfcXVldWUKKyAqICAgICAgQWRkIHRoZSBzdGFuZGFyZCBTQ0Igam9iIHRvIHRoZSBib3R0b20gb2Ygc3RhbmRhcmQgU0NCIGNvbW1hbmRzLgorICoKKyAqIElucHV0OgorICogQ09NUExFVEUhISEKKyAqICAgICAgcSAgPSBTQ1NJIExVIHBvaW50ZXIuCisgKiAgICAgIHNwID0gc3JiIHBvaW50ZXIuCisgKiAgICAgIFNDU0lfTFVfUSBsb2NrIG11c3QgYmUgYWxyZWFkeSBvYnRhaW5lZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgCitfX2FkZF90b19wZW5kaW5nX3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgc3JiX3QgKiBzcCkKK3sKKwlpbnQJZW1wdHk7CisJLyoKKyAgICAgICAgaWYoIHNwLT5zdGF0ZSAhPSBTUkJfTk9fUVVFVUVfU1RBVEUgJiYKKyAgICAgICAgCXNwLT5zdGF0ZSAhPSBTUkJfRlJFRV9TVEFURSAmJgorICAgICAgICAJc3AtPnN0YXRlICE9IFNSQl9BQ1RJVkVfU1RBVEUpCisJCUJVRygpOworCSovCisKKwllbXB0eSA9IGxpc3RfZW1wdHkoJmhhLT5wZW5kaW5nX3F1ZXVlKTsKKwlsaXN0X2FkZF90YWlsKCZzcC0+bGlzdCwgJmhhLT5wZW5kaW5nX3F1ZXVlKTsKKwloYS0+cXRocmVhZHMrKzsKKwlzcC0+c3RhdGUgPSBTUkJfUEVORElOR19TVEFURTsKKworCXJldHVybiAoZW1wdHkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgCitfX2FkZF90b19wZW5kaW5nX3F1ZXVlX2hlYWQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBzcmJfdCAqIHNwKQoreworCS8qCisgICAgICAgIGlmKCBzcC0+c3RhdGUgIT0gU1JCX05PX1FVRVVFX1NUQVRFICYmIAorICAgICAgICAJc3AtPnN0YXRlICE9IFNSQl9GUkVFX1NUQVRFICYmCisgICAgICAgIAlzcC0+c3RhdGUgIT0gU1JCX0FDVElWRV9TVEFURSkKKwkJQlVHKCk7CisJKi8KKworCWxpc3RfYWRkKCZzcC0+bGlzdCwgJmhhLT5wZW5kaW5nX3F1ZXVlKTsKKwloYS0+cXRocmVhZHMrKzsKKwlzcC0+c3RhdGUgPSBTUkJfUEVORElOR19TVEFURTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2FkZF90b19wZW5kaW5nX3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgc3JiX3QgKnNwKQoreworCWludAllbXB0eTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKKwllbXB0eSA9IF9fYWRkX3RvX3BlbmRpbmdfcXVldWUoaGEsIHNwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+bGlzdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gKGVtcHR5KTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZAorYWRkX3RvX3BlbmRpbmdfcXVldWVfaGVhZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHNyYl90ICpzcCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKKwlfX2FkZF90b19wZW5kaW5nX3F1ZXVlX2hlYWQoaGEsIHNwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+bGlzdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19kZWxfZnJvbV9wZW5kaW5nX3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgc3JiX3QgKnNwKQoreworCWxpc3RfZGVsX2luaXQoJnNwLT5saXN0KTsKKwloYS0+cXRocmVhZHMtLTsKKwlzcC0+c3RhdGUgPSBTUkJfTk9fUVVFVUVfU1RBVEU7Cit9CisKKy8qCisgKiBGYWlsb3ZlciBTdHVmZi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitfX2FkZF90b19mYWlsb3Zlcl9xdWV1ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLCBzcmJfdCAqIHNwKQoreworCS8qCisgICAgICAgIGlmKCBzcC0+c3RhdGUgIT0gU1JCX05PX1FVRVVFX1NUQVRFICYmIAorICAgICAgICAJc3AtPnN0YXRlICE9IFNSQl9BQ1RJVkVfU1RBVEUpCisJCUJVRygpOworCSovCisKKyAgICAgICAgbGlzdF9hZGRfdGFpbCgmc3AtPmxpc3QsJmhhLT5mYWlsb3Zlcl9xdWV1ZSk7CisgICAgICAgIGhhLT5mYWlsb3Zlcl9jbnQrKzsKKyAgICAgICAgc3AtPnN0YXRlID0gU1JCX0ZBSUxPVkVSX1NUQVRFOworCXNwLT5oYSA9IGhhOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRkX3RvX2ZhaWxvdmVyX3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsIHNyYl90ICogc3ApCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKKworICAgICAgICBfX2FkZF90b19mYWlsb3Zlcl9xdWV1ZShoYSxzcCk7CisKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworfQorc3RhdGljIGlubGluZSB2b2lkIF9fZGVsX2Zyb21fZmFpbG92ZXJfcXVldWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwgc3JiX3QgKgorICAgICAgICAgICAgICAgIHNwKQoreworICAgICAgICBoYS0+ZmFpbG92ZXJfY250LS07CisgICAgICAgIGxpc3RfZGVsX2luaXQoJnNwLT5saXN0KTsKKyAgICAgICAgc3AtPnN0YXRlID0gU1JCX05PX1FVRVVFX1NUQVRFOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsX2Zyb21fZmFpbG92ZXJfcXVldWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwgc3JiX3QgKiBzcCkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCisgICAgICAgIF9fZGVsX2Zyb21fZmFpbG92ZXJfcXVldWUoaGEsc3ApOworCisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIAorZGVsX2Zyb21fcGVuZGluZ19xdWV1ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLCBzcmJfdCAqIHNwKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+bGlzdF9sb2NrLCBmbGFncyk7CisKKyAgICAgICAgX19kZWxfZnJvbV9wZW5kaW5nX3F1ZXVlKGhhLHNwKTsKKworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+bGlzdF9sb2NrLCBmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA0ZmJjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYwpAQCAtMCwwICsxLDE5NTAgQEAKKy8qCisgKiAgICAgICAgICAgICAgICAgIFFMT0dJQyBMSU5VWCBTT0ZUV0FSRQorICoKKyAqIFFMb2dpYyBJU1AyeDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBRTG9naWMgQ29ycG9yYXRpb24KKyAqICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaW5jbHVkZSAicWxhX2RlZi5oIgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworc3RhdGljIHZvaWQKK3FsYTJ4MDBfbWJ4X3NlbV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgc2VtYXBob3JlCSpzZW1fcHRyID0gKHN0cnVjdCBzZW1hcGhvcmUgKilkYXRhOworCisJREVCVUcxMShwcmludGsoInFsYTJ4MDBfc2VtX3RpbWVvdXQ6IGVudGVyZWQuXG4iKTspCisKKwlpZiAoc2VtX3B0ciAhPSBOVUxMKSB7CisJCXVwKHNlbV9wdHIpOworCX0KKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX21ieF9zZW1fdGltZW91dDogZXhpdGluZy5cbiIpOykKK30KKworLyoKKyAqIHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kCisgKglJc3N1ZSBtYWlsYm94IGNvbW1hbmQgYW5kIHdhaXRzIGZvciBjb21wbGV0aW9uLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKgltY3AgPSBkcml2ZXIgaW50ZXJuYWwgbWJ4IHN0cnVjdCBwb2ludGVyLgorICoKKyAqIE91dHB1dDoKKyAqCW1iW01BWF9NQUlMQk9YX1JFR0lTVEVSX0NPVU5UXSA9IHJldHVybmVkIG1haWxib3ggZGF0YS4KKyAqCisgKiBSZXR1cm5zOgorICoJMCA6IFFMQV9TVUNDRVNTID0gY21kIHBlcmZvcm1lZCBzdWNjZXNzCisgKgkxIDogUUxBX0ZVTkNUSU9OX0ZBSUxFRCAgIChlcnJvciBlbmNvdW50ZXJlZCkKKyAqCTYgOiBRTEFfRlVOQ1RJT05fVElNRU9VVCAodGltZW91dCBjb25kaXRpb24gZW5jb3VudGVyZWQpCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX21haWxib3hfY29tbWFuZChzY3NpX3FsYV9ob3N0X3QgKmhhLCBtYnhfY21kX3QgKm1jcCkKK3sKKwlpbnQJCXJ2YWw7CisJdW5zaWduZWQgbG9uZyAgICBmbGFncyA9IDA7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisJc3RydWN0IHRpbWVyX2xpc3QJdG1wX2ludHJfdGltZXI7CisJdWludDhfdAkJYWJvcnRfYWN0aXZlID0gdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpOworCXVpbnQ4X3QJCWlvX2xvY2tfb24gPSBoYS0+ZmxhZ3MuaW5pdF9kb25lOworCXVpbnQxNl90CWNvbW1hbmQ7CisJdWludDE2X3QJKmlwdHI7CisJdWludDE2X3QgX19pb21lbSAqb3B0cjsKKwl1aW50MzJfdAljbnQ7CisJdWludDMyX3QJbWJveGVzOworCXVuc2lnbmVkIGxvbmcJbWJ4X2ZsYWdzID0gMDsKKwl1bnNpZ25lZCBsb25nCXdhaXRfdGltZTsKKworCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX21haWxib3hfY29tbWFuZCglbGQpOiBlbnRlcmVkLlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8pOykKKwkvKgorCSAqIFdhaXQgZm9yIGFjdGl2ZSBtYWlsYm94IGNvbW1hbmRzIHRvIGZpbmlzaCBieSB3YWl0aW5nIGF0IG1vc3QKKwkgKiB0b3Ygc2Vjb25kcy4gVGhpcyBpcyB0byBzZXJpYWxpemUgYWN0dWFsIGlzc3Vpbmcgb2YgbWFpbGJveCBjbWRzCisJICogZHVyaW5nIG5vbiBJU1AgYWJvcnQgdGltZS4KKwkgKi8KKwlpZiAoIWFib3J0X2FjdGl2ZSkgeworCQlpZiAocWxhMngwMF9kb3duX3RpbWVvdXQoJmhhLT5tYnhfY21kX3NlbSwgbWNwLT50b3YgKiBIWikpIHsKKwkJCS8qIFRpbWVvdXQgb2NjdXJyZWQuIFJldHVybiBlcnJvci4gKi8KKwkJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9tYWlsYm94X2NvbW1hbmQoJWxkKTogY21kICIKKwkJCSAgICAiYWNjZXNzIHRpbWVvdXQuIEV4aXRpbmcuXG4iLCBoYS0+aG9zdF9ubyk7KQorCQkJcmV0dXJuIFFMQV9GVU5DVElPTl9USU1FT1VUOworCQl9CisJfQorCisJaGEtPmZsYWdzLm1ib3hfYnVzeSA9IDE7CisJLyogU2F2ZSBtYWlsYm94IGNvbW1hbmQgZm9yIGRlYnVnICovCisJaGEtPm1jcCA9IG1jcDsKKworCS8qIFRyeSB0byBnZXQgbWFpbGJveCByZWdpc3RlciBhY2Nlc3MgKi8KKwlpZiAoIWFib3J0X2FjdGl2ZSkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5tYnhfcmVnX2xvY2ssIG1ieF9mbGFncyk7CisKKwlERUJVRzExKHByaW50aygic2NzaSVkOiBwcmVwYXJlIHRvIGlzc3VlIG1ib3ggY21kPTB4JXguXG4iLAorCSAgICAoaW50KWhhLT5ob3N0X25vLCBtY3AtPm1iWzBdKTspCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCS8qIExvYWQgbWFpbGJveCByZWdpc3RlcnMuICovCisJb3B0ciA9ICh1aW50MTZfdCBfX2lvbWVtICopTUFJTEJPWF9SRUcoaGEsIHJlZywgMCk7CisKKwlpcHRyID0gbWNwLT5tYjsKKwljb21tYW5kID0gbWNwLT5tYlswXTsKKwltYm94ZXMgPSBtY3AtPm91dF9tYjsKKworCWZvciAoY250ID0gMDsgY250IDwgaGEtPm1ieF9jb3VudDsgY250KyspIHsKKwkJaWYgKElTX1FMQTIyMDAoaGEpICYmIGNudCA9PSA4KQorCQkJb3B0ciA9ICh1aW50MTZfdCBfX2lvbWVtICopTUFJTEJPWF9SRUcoaGEsIHJlZywgOCk7CisJCWlmIChtYm94ZXMgJiBCSVRfMCkKKwkJCVdSVF9SRUdfV09SRChvcHRyLCAqaXB0cik7CisKKwkJbWJveGVzID4+PSAxOworCQlvcHRyKys7CisJCWlwdHIrKzsKKwl9CisKKyNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzEpCisJcHJpbnRrKCJxbGEyeDAwX21haWxib3hfY29tbWFuZDogTG9hZGVkIE1CWCByZWdpc3RlcnMgIgorCSAgICAiKGRpc3BsYXllZCBpbiBieXRlcykgPSBcbiIpOworCXFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKiltY3AtPm1iLCAxNik7CisJcHJpbnRrKCJcbiIpOworCXFsYTJ4MDBfZHVtcF9idWZmZXIoKCh1aW50OF90ICopbWNwLT5tYiArIDB4MTApLCAxNik7CisJcHJpbnRrKCJcbiIpOworCXFsYTJ4MDBfZHVtcF9idWZmZXIoKCh1aW50OF90ICopbWNwLT5tYiArIDB4MjApLCA4KTsKKwlwcmludGsoIlxuIik7CisJcHJpbnRrKCJxbGEyeDAwX21haWxib3hfY29tbWFuZDogSS9PIGFkZHJlc3MgPSAlbHguXG4iLAorCSAgICAodV9sb25nKW9wdHIpOworCXFsYTJ4MDBfZHVtcF9yZWdzKGhhKTsKKyNlbmRpZgorCisJLyogSXNzdWUgc2V0IGhvc3QgaW50ZXJydXB0IGNvbW1hbmQgdG8gc2VuZCBjbWQgb3V0LiAqLworCWhhLT5mbGFncy5tYm94X2ludCA9IDA7CisJY2xlYXJfYml0KE1CWF9JTlRFUlJVUFQsICZoYS0+bWJ4X2NtZF9mbGFncyk7CisKKwkvKiBVbmxvY2sgbWJ4IHJlZ2lzdGVycyBhbmQgd2FpdCBmb3IgaW50ZXJydXB0ICovCisKKwlERUJVRzExKHByaW50aygicWxhMngwMF9tYWlsYm94X2NvbW1hbmQ6IGdvaW5nIHRvIHVubG9jayBpcnEgJiAiCisJICAgICJ3YWl0aW5nIGZvciBpbnRlcnJ1cHQuIGppZmZpZXM9JWx4LlxuIiwgamlmZmllcyk7KQorCisJLyogV2FpdCBmb3IgbWJ4IGNtZCBjb21wbGV0aW9uIHVudGlsIHRpbWVvdXQgKi8KKworCWlmICghYWJvcnRfYWN0aXZlICYmIGlvX2xvY2tfb24pIHsKKwkJLyogc2xlZXAgb24gY29tcGxldGlvbiBzZW1hcGhvcmUgKi8KKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKCVsZCk6ICIKKwkJICAgICJJTlRFUlJVUFQgTU9ERS4gSW5pdGlhbGl6aW5nIHRpbWVyLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKTspCisKKwkJaW5pdF90aW1lcigmdG1wX2ludHJfdGltZXIpOworCQl0bXBfaW50cl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpJmhhLT5tYnhfaW50cl9zZW07CisJCXRtcF9pbnRyX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbWNwLT50b3YgKiBIWjsKKwkJdG1wX2ludHJfdGltZXIuZnVuY3Rpb24gPQorCQkgICAgKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKXFsYTJ4MDBfbWJ4X3NlbV90aW1lb3V0OworCisJCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX21haWxib3hfY29tbWFuZCglbGQpOiAiCisJCSAgICAiQWRkaW5nIHRpbWVyLlxuIiwgaGEtPmhvc3Rfbm8pOykKKwkJYWRkX3RpbWVyKCZ0bXBfaW50cl90aW1lcik7CisKKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfbWFpbGJveF9jb21tYW5kOiBnb2luZyB0byAiCisJCSAgICAidW5sb2NrICYgc2xlZXAuIHRpbWU9MHglbHguXG4iLCBqaWZmaWVzKTspCisKKwkJc2V0X2JpdChNQlhfSU5UUl9XQUlULCAmaGEtPm1ieF9jbWRfZmxhZ3MpOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX1NFVF9IT1NUX0lOVCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwkJaWYgKCFhYm9ydF9hY3RpdmUpCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+bWJ4X3JlZ19sb2NrLCBtYnhfZmxhZ3MpOworCisJCS8qIFdhaXQgZm9yIGVpdGhlciB0aGUgdGltZXIgdG8gZXhwaXJlCisJCSAqIG9yIHRoZSBtYm94IGNvbXBsZXRpb24gaW50ZXJydXB0CisJCSAqLworCQlkb3duKCZoYS0+bWJ4X2ludHJfc2VtKTsKKworCQlERUJVRzExKHByaW50aygicWxhMngwMF9tYWlsYm94X2NvbW1hbmQ6IgorCQkgICAgIndha2luZyB1cC4iCisJCSAgICAidGltZT0weCVseFxuIiwgamlmZmllcyk7KQorCQljbGVhcl9iaXQoTUJYX0lOVFJfV0FJVCwgJmhhLT5tYnhfY21kX2ZsYWdzKTsKKworCQkvKiBkZWxldGUgdGhlIHRpbWVyICovCisJCWRlbF90aW1lcigmdG1wX2ludHJfdGltZXIpOworCX0gZWxzZSB7CisKKwkJREVCVUczXzExKHByaW50aygicWxhMngwMF9tYWlsYm94X2NvbW1hbmQoJWxkKTogY21kPSV4ICIKKwkJCSJQT0xMSU5HIE1PREUuXG4iLCBoYS0+aG9zdF9ubywgY29tbWFuZCk7KQorCisJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX1NFVF9IT1NUX0lOVCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJCWlmICghYWJvcnRfYWN0aXZlKQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPm1ieF9yZWdfbG9jaywgbWJ4X2ZsYWdzKTsKKworCQl3YWl0X3RpbWUgPSBqaWZmaWVzICsgbWNwLT50b3YgKiBIWjsgLyogd2FpdCBhdCBtb3N0IHRvdiBzZWNzICovCisJCXdoaWxlICghaGEtPmZsYWdzLm1ib3hfaW50KSB7CisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB3YWl0X3RpbWUpKQorCQkJCWJyZWFrOworCisJCQkvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzLiAqLworCQkJcWxhMngwMF9wb2xsKGhhKTsKKworCQkJdWRlbGF5KDEwKTsgLyogdjQuMjcgKi8KKwkJfSAvKiB3aGlsZSAqLworCX0KKworCWlmICghYWJvcnRfYWN0aXZlKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPm1ieF9yZWdfbG9jaywgbWJ4X2ZsYWdzKTsKKworCS8qIENoZWNrIHdoZXRoZXIgd2UgdGltZWQgb3V0ICovCisJaWYgKGhhLT5mbGFncy5tYm94X2ludCkgeworCQl1aW50MTZfdCAqaXB0cjI7CisKKwkJREVCVUczXzExKHByaW50aygicWxhMngwMF9tYWlsYm94X2NtZDogY21kICV4IGNvbXBsZXRlZC5cbiIsCisJCSAgICBjb21tYW5kKTspCisKKwkJLyogR290IGludGVycnVwdC4gQ2xlYXIgdGhlIGZsYWcuICovCisJCWhhLT5mbGFncy5tYm94X2ludCA9IDA7CisJCWNsZWFyX2JpdChNQlhfSU5URVJSVVBULCAmaGEtPm1ieF9jbWRfZmxhZ3MpOworCisJCWlmIChoYS0+bWFpbGJveF9vdXRbMF0gIT0gTUJTX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJCXFsYTJ4MDBfc3RhdHMubWJveGVycisrOworCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCX0KKworCQkvKiBMb2FkIHJldHVybiBtYWlsYm94IHJlZ2lzdGVycy4gKi8KKwkJaXB0cjIgPSBtY3AtPm1iOworCQlpcHRyID0gKHVpbnQxNl90ICopJmhhLT5tYWlsYm94X291dFswXTsKKwkJbWJveGVzID0gbWNwLT5pbl9tYjsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBoYS0+bWJ4X2NvdW50OyBjbnQrKykgeworCQkJaWYgKG1ib3hlcyAmIEJJVF8wKQorCQkJCSppcHRyMiA9ICppcHRyOworCisJCQltYm94ZXMgPj49IDE7CisJCQlpcHRyMisrOworCQkJaXB0cisrOworCQl9CisJfSBlbHNlIHsKKworI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMikgfHwgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8zKSB8fCBcCisJCWRlZmluZWQoUUxfREVCVUdfTEVWRUxfMTEpCisJCXByaW50aygicWxhMngwMF9tYWlsYm94X2NvbW1hbmQoJWxkKTogKioqKiBNQiBDb21tYW5kIFRpbWVvdXQgIgorCQkgICAgImZvciBjbWQgJXggKioqKlxuIiwgaGEtPmhvc3Rfbm8sIGNvbW1hbmQpOworCQlwcmludGsoInFsYTJ4MDBfbWFpbGJveF9jb21tYW5kOiBpY29udHJvbD0leCBqaWZmaWVzPSVseFxuIiwKKwkJICAgIFJEX1JFR19XT1JEKCZyZWctPmljdHJsKSwgamlmZmllcyk7CisJCXByaW50aygicWxhMngwMF9tYWlsYm94X2NvbW1hbmQ6ICoqKiBtYWlsYm94WzBdID0gMHgleCAqKipcbiIsCisJCSAgICBSRF9SRUdfV09SRChvcHRyKSk7CisJCXFsYTJ4MDBfZHVtcF9yZWdzKGhhKTsKKyNlbmRpZgorCisJCXFsYTJ4MDBfc3RhdHMubWJveHRvdXQrKzsKKwkJaGEtPnRvdGFsX21ieF90aW1lb3V0Kys7CisJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fVElNRU9VVDsKKwl9CisKKwlpZiAoIWFib3J0X2FjdGl2ZSkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPm1ieF9yZWdfbG9jaywgbWJ4X2ZsYWdzKTsKKworCWhhLT5mbGFncy5tYm94X2J1c3kgPSAwOworCisJLyogQ2xlYW4gdXAgKi8KKwloYS0+bWNwID0gTlVMTDsKKworCWlmICghYWJvcnRfYWN0aXZlKSB7CisJCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX21haWxib3hfY21kOiBjaGVja2luZyBmb3IgYWRkaXRpb25hbCAiCisJCSAgICAicmVzcCBpbnRlcnJ1cHQuXG4iKTspCisKKwkJLyogcG9sbGluZyBtb2RlIGZvciBub24gaXNwX2Fib3J0IGNvbW1hbmRzLiAqLworCQlxbGEyeDAwX3BvbGwoaGEpOworCX0KKworCWlmIChydmFsID09IFFMQV9GVU5DVElPTl9USU1FT1VUKSB7CisJCWlmICghaW9fbG9ja19vbiB8fCAobWNwLT5mbGFncyAmIElPQ1RMX0NNRCkpIHsKKwkJCS8qIG5vdCBpbiBkcGMuIHNjaGVkdWxlIGl0IGZvciBkcGMgdG8gdGFrZSBvdmVyLiAqLworCQkJREVCVUcocHJpbnRrKCJxbGEyeDAwX21haWxib3hfY29tbWFuZCglbGQpOiB0aW1lb3V0ICIKKwkJCSAgICAic2NoZWR1bGUgaXNwX2Fib3J0X25lZWRlZC5cbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8pOykKKwkJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9tYWlsYm94X2NvbW1hbmQoJWxkKTogIgorCQkJICAgICJ0aW1lb3V0IHNjaGVkdWxlIGlzcF9hYm9ydF9uZWVkZWQuXG4iLAorCQkJICAgIGhhLT5ob3N0X25vKTspCisJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkgICAgIk1haWxib3ggY29tbWFuZCB0aW1lb3V0IG9jY3VyZWQuIFNjaGVkdWxpbmcgSVNQICIKKwkJCSAgICAiYWJvcnQuXG4iKTsKKwkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQkJaWYgKGhhLT5kcGNfd2FpdCAmJiAhaGEtPmRwY19hY3RpdmUpIAorCQkJCXVwKGhhLT5kcGNfd2FpdCk7CisKKwkJfSBlbHNlIGlmICghYWJvcnRfYWN0aXZlKSB7CisKKwkJCS8qIGNhbGwgYWJvcnQgZGlyZWN0bHkgc2luY2Ugd2UgYXJlIGluIHRoZSBEUEMgdGhyZWFkICovCisJCQlERUJVRyhwcmludGsoInFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKCVsZCk6IHRpbWVvdXQgIgorCQkJICAgICJjYWxsaW5nIGFib3J0X2lzcFxuIiwgaGEtPmhvc3Rfbm8pOykKKwkJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9tYWlsYm94X2NvbW1hbmQoJWxkKTogIgorCQkJICAgICJ0aW1lb3V0IGNhbGxpbmcgYWJvcnRfaXNwXG4iLCBoYS0+aG9zdF9ubyk7KQorCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJICAgICJNYWlsYm94IGNvbW1hbmQgdGltZW91dCBvY2N1cmVkLiBJc3N1aW5nIElTUCAiCisJCQkgICAgImFib3J0LlxuIik7CisKKwkJCXNldF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpOworCQkJY2xlYXJfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCWlmIChxbGEyeDAwX2Fib3J0X2lzcChoYSkpIHsKKwkJCQkvKiBmYWlsZWQuIHJldHJ5IGxhdGVyLiAqLworCQkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQkJfQorCQkJY2xlYXJfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKTsKKworCQkJREVCVUcocHJpbnRrKCJxbGEyeDAwX21haWxib3hfY29tbWFuZDogZmluaXNoZWQgIgorCQkJICAgICJhYm9ydF9pc3BcbiIpOykKKwkJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9tYWlsYm94X2NvbW1hbmQ6IGZpbmlzaGVkICIKKwkJCSAgICAiYWJvcnRfaXNwXG4iKTspCisJCX0KKwl9CisKKwkvKiBBbGxvdyBuZXh0IG1ieCBjbWQgdG8gY29tZSBpbi4gKi8KKwlpZiAoIWFib3J0X2FjdGl2ZSkKKwkJdXAoJmhhLT5tYnhfY21kX3NlbSk7CisKKwlpZiAocnZhbCkgeworCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKCVsZCk6ICoqKiogRkFJTEVELiAiCisJCSAgICAibWJ4MD0leCwgbWJ4MT0leCwgbWJ4Mj0leCwgY21kPSV4ICoqKipcbiIsCisJCWhhLT5ob3N0X25vLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdLCBtY3AtPm1iWzJdLCBjb21tYW5kKTspCisJfSBlbHNlIHsKKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKCVsZCk6IGRvbmUuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pOykKKwl9CisKKwlERUJVRzExKHByaW50aygicWxhMngwMF9tYWlsYm94X2NvbW1hbmQoJWxkKTogZXhpdGluZy5cbiIsCisJICAgIGhhLT5ob3N0X25vKTspCisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIHFsYTJ4MDBfbG9hZF9yYW0KKyAqCUxvYWQgYWRhcHRlciBSQU0gdXNpbmcgRE1BLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX2xvYWRfcmFtKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGRtYV9hZGRyX3QgcmVxX2RtYSwgdWludDE2X3QgcmlzY19hZGRyLAorICAgIHVpbnQxNl90IHJpc2NfY29kZV9zaXplKQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKwl1aW50MzJfdAlyZXFfbGVuOworCWRtYV9hZGRyX3QJbm1sX2RtYTsKKwl1aW50MzJfdAlubWxfbGVuOworCXVpbnQzMl90CW5vcm1hbGl6ZWQ7CisKKwlERUJVRzExKHByaW50aygicWxhMngwMF9sb2FkX3JhbSglbGQpOiBlbnRlcmVkLlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8pOykKKworCXJlcV9sZW4gPSByaXNjX2NvZGVfc2l6ZTsKKwlubWxfZG1hID0gMDsKKwlubWxfbGVuID0gMDsKKworCW5vcm1hbGl6ZWQgPSBxbGEyeDAwX25vcm1hbGl6ZV9kbWFfYWRkcigmcmVxX2RtYSwgJnJlcV9sZW4sICZubWxfZG1hLAorCSAgICAmbm1sX2xlbik7CisKKwkvKiBMb2FkIGZpcnN0IHNlZ21lbnQgKi8KKwltY3AtPm1iWzBdID0gTUJDX0xPQURfUklTQ19SQU07CisJbWNwLT5tYlsxXSA9IHJpc2NfYWRkcjsKKwltY3AtPm1iWzJdID0gTVNXKHJlcV9kbWEpOworCW1jcC0+bWJbM10gPSBMU1cocmVxX2RtYSk7CisJbWNwLT5tYls0XSA9ICh1aW50MTZfdClyZXFfbGVuOworCW1jcC0+bWJbNl0gPSBNU1coTVNEKHJlcV9kbWEpKTsKKwltY3AtPm1iWzddID0gTFNXKE1TRChyZXFfZG1hKSk7CisJbWNwLT5vdXRfbWIgPSBNQlhfN3xNQlhfNnxNQlhfNHxNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKKwltY3AtPmluX21iID0gTUJYXzA7CisJbWNwLT50b3YgPSAzMDsKKwltY3AtPmZsYWdzID0gMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKwkvKiBMb2FkIHNlY29uZCBzZWdtZW50IC0gaWYgbmVjZXNzYXJ5ICovCisJaWYgKG5vcm1hbGl6ZWQgJiYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpKSB7CisJCW1jcC0+bWJbMF0gPSBNQkNfTE9BRF9SSVNDX1JBTTsKKwkJbWNwLT5tYlsxXSA9IHJpc2NfYWRkciArICh1aW50MTZfdClyZXFfbGVuOworCQltY3AtPm1iWzJdID0gTVNXKG5tbF9kbWEpOworCQltY3AtPm1iWzNdID0gTFNXKG5tbF9kbWEpOworCQltY3AtPm1iWzRdID0gKHVpbnQxNl90KW5tbF9sZW47CisJCW1jcC0+bWJbNl0gPSBNU1coTVNEKG5tbF9kbWEpKTsKKwkJbWNwLT5tYls3XSA9IExTVyhNU0Qobm1sX2RtYSkpOworCQltY3AtPm91dF9tYiA9IE1CWF83fE1CWF82fE1CWF80fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCQltY3AtPmluX21iID0gTUJYXzA7CisJCW1jcC0+dG92ID0gMzA7CisJCW1jcC0+ZmxhZ3MgPSAwOworCQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJfQorCisJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKKwkJLyogRW1wdHkgKi8KKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfbG9hZF9yYW0oJWxkKTogZG9uZS5cbiIsIGhhLT5ob3N0X25vKTspCisJfSBlbHNlIHsKKwkJLyogRW1wdHkgKi8KKwkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2xvYWRfcmFtKCVsZCk6IGZhaWxlZC4gcnZhbD0leCAiCisJCSAgICAibWJbMF09JXguXG4iLCBoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSk7KQorCX0KKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIHFsYTJ4MDBfbG9hZF9yYW1fZXh0CisgKglMb2FkIGFkYXB0ZXIgZXh0ZW5kZWQgUkFNIHVzaW5nIERNQS4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK2ludAorcWxhMngwMF9sb2FkX3JhbV9leHQoc2NzaV9xbGFfaG9zdF90ICpoYSwgZG1hX2FkZHJfdCByZXFfZG1hLAorICAgIHVpbnQzMl90IHJpc2NfYWRkciwgdWludDE2X3QgcmlzY19jb2RlX3NpemUpCit7CisJaW50IHJ2YWw7CisJbWJ4X2NtZF90IG1jOworCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCXVpbnQzMl90CXJlcV9sZW47CisJZG1hX2FkZHJfdAlubWxfZG1hOworCXVpbnQzMl90CW5tbF9sZW47CisJdWludDMyX3QJbm9ybWFsaXplZDsKKworCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisKKwlyZXFfbGVuID0gcmlzY19jb2RlX3NpemU7CisJbm1sX2RtYSA9IDA7CisJbm1sX2xlbiA9IDA7CisKKwlub3JtYWxpemVkID0gcWxhMngwMF9ub3JtYWxpemVfZG1hX2FkZHIoJnJlcV9kbWEsICZyZXFfbGVuLCAmbm1sX2RtYSwKKwkgICAgJm5tbF9sZW4pOworCisJLyogTG9hZCBmaXJzdCBzZWdtZW50ICovCisJbWNwLT5tYlswXSA9IE1CQ19MT0FEX1JJU0NfUkFNX0VYVEVOREVEOworCW1jcC0+bWJbMV0gPSBMU1cocmlzY19hZGRyKTsKKwltY3AtPm1iWzJdID0gTVNXKHJlcV9kbWEpOworCW1jcC0+bWJbM10gPSBMU1cocmVxX2RtYSk7CisJbWNwLT5tYls0XSA9ICh1aW50MTZfdClyZXFfbGVuOworCW1jcC0+bWJbNl0gPSBNU1coTVNEKHJlcV9kbWEpKTsKKwltY3AtPm1iWzddID0gTFNXKE1TRChyZXFfZG1hKSk7CisJbWNwLT5tYls4XSA9IE1TVyhyaXNjX2FkZHIpOworCW1jcC0+b3V0X21iID0gTUJYXzh8TUJYXzd8TUJYXzZ8TUJYXzR8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisJbWNwLT5pbl9tYiA9IE1CWF8wOworCW1jcC0+dG92ID0gMzA7CisJbWNwLT5mbGFncyA9IDA7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCisJLyogTG9hZCBzZWNvbmQgc2VnbWVudCAtIGlmIG5lY2Vzc2FyeSAqLworCWlmIChub3JtYWxpemVkICYmIChydmFsID09IFFMQV9TVUNDRVNTKSkgeworCQlyaXNjX2FkZHIgKz0gcmVxX2xlbjsKKwkJbWNwLT5tYlswXSA9IE1CQ19MT0FEX1JJU0NfUkFNX0VYVEVOREVEOworCQltY3AtPm1iWzFdID0gTFNXKHJpc2NfYWRkcik7CisJCW1jcC0+bWJbMl0gPSBNU1cobm1sX2RtYSk7CisJCW1jcC0+bWJbM10gPSBMU1cobm1sX2RtYSk7CisJCW1jcC0+bWJbNF0gPSAodWludDE2X3Qpbm1sX2xlbjsKKwkJbWNwLT5tYls2XSA9IE1TVyhNU0Qobm1sX2RtYSkpOworCQltY3AtPm1iWzddID0gTFNXKE1TRChubWxfZG1hKSk7CisJCW1jcC0+bWJbOF0gPSBNU1cocmlzY19hZGRyKTsKKwkJbWNwLT5vdXRfbWIgPSBNQlhfOHxNQlhfN3xNQlhfNnxNQlhfNHxNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKKwkJbWNwLT5pbl9tYiA9IE1CWF8wOworCQltY3AtPnRvdiA9IDMwOworCQltY3AtPmZsYWdzID0gMDsKKwkJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCX0KKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leC5cbiIsCisJCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0pKTsKKwl9IGVsc2UgeworCQkvKkVNUFRZKi8KKwkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIHFsYTJ4MDBfZXhlY3V0ZV9mdworICoJU3RhcnQgYWRhcHRlciBmaXJtd2FyZS4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJVEFSR0VUX1FVRVVFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KKyAqCUFEQVBURVJfU1RBVEVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK2ludAorcWxhMngwMF9leGVjdXRlX2Z3KHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50IHJ2YWw7CisJbWJ4X2NtZF90IG1jOworCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCisJREVCVUcxMShwcmludGsoInFsYTJ4MDBfZXhlY3V0ZV9mdyglbGQpOiBlbnRlcmVkLlxuIiwgaGEtPmhvc3Rfbm8pOykKKworCW1jcC0+bWJbMF0gPSBNQkNfRVhFQ1VURV9GSVJNV0FSRTsKKwltY3AtPm1iWzFdID0gKmhhLT5icmRfaW5mby0+ZndfaW5mb1swXS5md3N0YXJ0OworCW1jcC0+b3V0X21iID0gTUJYXzF8TUJYXzA7CisJaWYgKElTX1FMQTIzMjIoaGEpIHx8IElTX1FMQTYzMjIoaGEpKSB7CisJCW1jcC0+bWJbMl0gPSAwOworCQltY3AtPm91dF9tYiB8PSBNQlhfMjsKKwl9CisKKwltY3AtPmluX21iID0gTUJYXzA7CisJbWNwLT50b3YgPSAzMDsKKwltY3AtPmZsYWdzID0gMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKwlERUJVRzExKHByaW50aygicWxhMngwMF9leGVjdXRlX2Z3KCVsZCk6IGRvbmUuXG4iLCBoYS0+aG9zdF9ubyk7KQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBxbGEyeDAwX2dldF9md192ZXJzaW9uCisgKglHZXQgZmlybXdhcmUgdmVyc2lvbi4KKyAqCisgKiBJbnB1dDoKKyAqCWhhOgkJYWRhcHRlciBzdGF0ZSBwb2ludGVyLgorICoJbWFqb3I6CQlwb2ludGVyIGZvciBtYWpvciBudW1iZXIuCisgKgltaW5vcjoJCXBvaW50ZXIgZm9yIG1pbm9yIG51bWJlci4KKyAqCXN1Ym1pbm9yOglwb2ludGVyIGZvciBzdWJtaW5vciBudW1iZXIuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLwordm9pZAorcWxhMngwMF9nZXRfZndfdmVyc2lvbihzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCAqbWFqb3IsIHVpbnQxNl90ICptaW5vciwKKyAgICB1aW50MTZfdCAqc3VibWlub3IsIHVpbnQxNl90ICphdHRyaWJ1dGVzLCB1aW50MzJfdCAqbWVtb3J5KQoreworCWludAkJcnZhbDsKKwltYnhfY21kX3QJbWM7CisJbWJ4X2NtZF90CSptY3AgPSAmbWM7CisKKwlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCisJbWNwLT5tYlswXSA9IE1CQ19HRVRfRklSTVdBUkVfVkVSU0lPTjsKKwltY3AtPm91dF9tYiA9IE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfNnxNQlhfNXxNQlhfNHxNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKKwltY3AtPmZsYWdzID0gMDsKKwltY3AtPnRvdiA9IDMwOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKworCS8qIFJldHVybiBtYWlsYm94IGRhdGEuICovCisJKm1ham9yID0gbWNwLT5tYlsxXTsKKwkqbWlub3IgPSBtY3AtPm1iWzJdOworCSpzdWJtaW5vciA9IG1jcC0+bWJbM107CisJKmF0dHJpYnV0ZXMgPSBtY3AtPm1iWzZdOworCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkKKwkJKm1lbW9yeSA9IDB4MUZGRkY7CQkJLyogRGVmYXVsdHMgdG8gMTI4S0IuICovCisJZWxzZQorCQkqbWVtb3J5ID0gKG1jcC0+bWJbNV0gPDwgMTYpIHwgbWNwLT5tYls0XTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgeworCQkvKkVNUFRZKi8KKwkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwl9Cit9CisKKy8qCisgKiBxbGEyeDAwX2dldF9md19vcHRpb25zCisgKglTZXQgZmlybXdhcmUgb3B0aW9ucy4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJZndvcHQgPSBwb2ludGVyIGZvciBmaXJtd2FyZSBvcHRpb25zLgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK2ludAorcWxhMngwMF9nZXRfZndfb3B0aW9ucyhzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCAqZndvcHRzKQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKworCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisKKwltY3AtPm1iWzBdID0gTUJDX0dFVF9GSVJNV0FSRV9PUFRJT047CisJbWNwLT5vdXRfbWIgPSBNQlhfMDsKKwltY3AtPmluX21iID0gTUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisJbWNwLT50b3YgPSAzMDsKKwltY3AtPmZsYWdzID0gMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXguXG4iLCBfX2Z1bmNfXywKKwkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7CisJfSBlbHNlIHsKKwkJZndvcHRzWzFdID0gbWNwLT5tYlsxXTsKKwkJZndvcHRzWzJdID0gbWNwLT5tYlsyXTsKKwkJZndvcHRzWzNdID0gbWNwLT5tYlszXTsKKworCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCX0KKworCXJldHVybiBydmFsOworfQorCisKKy8qCisgKiBxbGEyeDAwX3NldF9md19vcHRpb25zCisgKglTZXQgZmlybXdhcmUgb3B0aW9ucy4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJZndvcHQgPSBwb2ludGVyIGZvciBmaXJtd2FyZSBvcHRpb25zLgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK2ludAorcWxhMngwMF9zZXRfZndfb3B0aW9ucyhzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCAqZndvcHRzKQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKworCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisKKwltY3AtPm1iWzBdID0gTUJDX1NFVF9GSVJNV0FSRV9PUFRJT047CisJbWNwLT5tYlsxXSA9IGZ3b3B0c1sxXTsKKwltY3AtPm1iWzJdID0gZndvcHRzWzJdOworCW1jcC0+bWJbM10gPSBmd29wdHNbM107CisJbWNwLT5tYlsxMF0gPSBmd29wdHNbMTBdOworCW1jcC0+bWJbMTFdID0gZndvcHRzWzExXTsKKwltY3AtPm1iWzEyXSA9IDA7CS8qIFVuZG9jdW1lbnRlZCwgYnV0IHVzZWQgKi8KKwltY3AtPm91dF9tYiA9IE1CWF8xMnxNQlhfMTF8TUJYXzEwfE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfMDsKKwltY3AtPnRvdiA9IDMwOworCW1jcC0+ZmxhZ3MgPSAwOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgeworCQkvKkVNUFRZKi8KKwkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIHFsYTJ4MDBfbWJ4X3JlZ190ZXN0CisgKglNYWlsYm94IHJlZ2lzdGVyIHdyYXAgdGVzdC4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJVEFSR0VUX1FVRVVFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KKyAqCUFEQVBURVJfU1RBVEVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK2ludAorcWxhMngwMF9tYnhfcmVnX3Rlc3Qoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQgcnZhbDsKKwltYnhfY21kX3QgbWM7CisJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisKKwlERUJVRzExKHByaW50aygicWxhMngwMF9tYnhfcmVnX3Rlc3QoJWxkKTogZW50ZXJlZC5cbiIsIGhhLT5ob3N0X25vKTspCisKKwltY3AtPm1iWzBdID0gTUJDX01BSUxCT1hfUkVHSVNURVJfVEVTVDsKKwltY3AtPm1iWzFdID0gMHhBQUFBOworCW1jcC0+bWJbMl0gPSAweDU1NTU7CisJbWNwLT5tYlszXSA9IDB4QUE1NTsKKwltY3AtPm1iWzRdID0gMHg1NUFBOworCW1jcC0+bWJbNV0gPSAweEE1QTU7CisJbWNwLT5tYls2XSA9IDB4NUE1QTsKKwltY3AtPm1iWzddID0gMHgyNTI1OworCW1jcC0+b3V0X21iID0gTUJYXzd8TUJYXzZ8TUJYXzV8TUJYXzR8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisJbWNwLT5pbl9tYiA9IE1CWF83fE1CWF82fE1CWF81fE1CWF80fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+dG92ID0gMzA7CisJbWNwLT5mbGFncyA9IDA7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCisJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKKwkJaWYgKG1jcC0+bWJbMV0gIT0gMHhBQUFBIHx8IG1jcC0+bWJbMl0gIT0gMHg1NTU1IHx8CisJCSAgICBtY3AtPm1iWzNdICE9IDB4QUE1NSB8fCBtY3AtPm1iWzRdICE9IDB4NTVBQSkKKwkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQlpZiAobWNwLT5tYls1XSAhPSAweEE1QTUgfHwgbWNwLT5tYls2XSAhPSAweDVBNUEgfHwKKwkJICAgIG1jcC0+bWJbN10gIT0gMHgyNTI1KQorCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJfQorCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9tYnhfcmVnX3Rlc3QoJWxkKTogZmFpbGVkPSV4LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBydmFsKTspCisJfSBlbHNlIHsKKwkJLypFTVBUWSovCisJCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX21ieF9yZWdfdGVzdCglbGQpOiBkb25lLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKTspCisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBxbGEyeDAwX3ZlcmlmeV9jaGVja3N1bQorICoJVmVyaWZ5IGZpcm13YXJlIGNoZWNrc3VtLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglUQVJHRVRfUVVFVUVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoJQURBUFRFUl9TVEFURV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX3ZlcmlmeV9jaGVja3N1bShzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX3ZlcmlmeV9jaGVja3N1bSglbGQpOiBlbnRlcmVkLlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8pOykKKworCW1jcC0+bWJbMF0gPSBNQkNfVkVSSUZZX0NIRUNLU1VNOworCW1jcC0+bWJbMV0gPSAqaGEtPmJyZF9pbmZvLT5md19pbmZvWzBdLmZ3c3RhcnQ7CisJbWNwLT5vdXRfbWIgPSBNQlhfMXxNQlhfMDsKKwltY3AtPmluX21iID0gTUJYXzJ8TUJYXzA7CisJbWNwLT50b3YgPSAzMDsKKwltY3AtPmZsYWdzID0gMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX3ZlcmlmeV9jaGVja3N1bSglbGQpOiBmYWlsZWQ9JXguXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpOykKKwl9IGVsc2UgeworCQkvKkVNUFRZKi8KKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfdmVyaWZ5X2NoZWNrc3VtKCVsZCk6IGRvbmUuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pOykKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIHFsYTJ4MDBfaXNzdWVfaW9jYgorICoJSXNzdWUgSU9DQiB1c2luZyBtYWlsYm94IGNvbW1hbmQKKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBzdGF0ZSBwb2ludGVyLgorICoJYnVmZmVyID0gYnVmZmVyIHBvaW50ZXIuCisgKglwaHlzX2FkZHIgPSBwaHlzaWNhbCBhZGRyZXNzIG9mIGJ1ZmZlci4KKyAqCXNpemUgPSBzaXplIG9mIGJ1ZmZlci4KKyAqCVRBUkdFVF9RVUVVRV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKglBREFQVEVSX1NUQVRFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KKyAqCisgKiBSZXR1cm5zOgorICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitpbnQKK3FsYTJ4MDBfaXNzdWVfaW9jYihzY3NpX3FsYV9ob3N0X3QgKmhhLCB2b2lkKiAgYnVmZmVyLCBkbWFfYWRkcl90IHBoeXNfYWRkciwKKyAgICBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQJCXJ2YWw7CisJbWJ4X2NtZF90CW1jOworCW1ieF9jbWRfdAkqbWNwID0gJm1jOworCisJbWNwLT5tYlswXSA9IE1CQ19JT0NCX0NPTU1BTkRfQTY0OworCW1jcC0+bWJbMV0gPSAwOworCW1jcC0+bWJbMl0gPSBNU1cocGh5c19hZGRyKTsKKwltY3AtPm1iWzNdID0gTFNXKHBoeXNfYWRkcik7CisJbWNwLT5tYls2XSA9IE1TVyhNU0QocGh5c19hZGRyKSk7CisJbWNwLT5tYls3XSA9IExTVyhNU0QocGh5c19hZGRyKSk7CisJbWNwLT5vdXRfbWIgPSBNQlhfN3xNQlhfNnxNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKKwltY3AtPmluX21iID0gTUJYXzJ8TUJYXzA7CisJbWNwLT50b3YgPSAzMDsKKwltY3AtPmZsYWdzID0gMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcocHJpbnRrKCJxbGEyeDAwX2lzc3VlX2lvY2IoJWxkKTogZmFpbGVkIHJ2YWwgMHgleCIsCisJCSAgICBoYS0+aG9zdF9ubyxydmFsKTspCisJCURFQlVHMihwcmludGsoInFsYTJ4MDBfaXNzdWVfaW9jYiglbGQpOiBmYWlsZWQgcnZhbCAweCV4IiwKKwkJICAgIGhhLT5ob3N0X25vLHJ2YWwpOykKKwl9IGVsc2UgeworCQkvKkVNUFRZKi8KKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIHFsYTJ4MDBfYWJvcnRfY29tbWFuZAorICoJQWJvcnQgY29tbWFuZCBhYm9ydHMgYSBzcGVjaWZpZWQgSU9DQi4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJc3AgPSBTQiBzdHJ1Y3R1cmUgcG9pbnRlci4KKyAqCisgKiBSZXR1cm5zOgorICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitpbnQKK3FsYTJ4MDBfYWJvcnRfY29tbWFuZChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzcmJfdCAqc3ApCit7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzID0gMDsKKwlmY19wb3J0X3QJKmZjcG9ydDsKKwlpbnQJCXJ2YWw7CisJdWludDMyX3QJaGFuZGxlOworCW1ieF9jbWRfdAltYzsKKwltYnhfY21kX3QJKm1jcCA9ICZtYzsKKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2Fib3J0X2NvbW1hbmQoJWxkKTogZW50ZXJlZC5cbiIsIGhhLT5ob3N0X25vKTspCisKKwlmY3BvcnQgPSBzcC0+ZmNsdW4tPmZjcG9ydDsKKworCWlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpID09IExPT1BfRE9XTiB8fAorCSAgICBhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgPT0gRkNTX0RFVklDRV9MT1NUKSB7CisJCXJldHVybiAxOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCWZvciAoaGFuZGxlID0gMTsgaGFuZGxlIDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTOyBoYW5kbGUrKykgeworCQlpZiAoaGEtPm91dHN0YW5kaW5nX2NtZHNbaGFuZGxlXSA9PSBzcCkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJaWYgKGhhbmRsZSA9PSBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMpIHsKKwkJLyogY29tbWFuZCBub3QgZm91bmQgKi8KKwkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJfQorCisJbWNwLT5tYlswXSA9IE1CQ19BQk9SVF9DT01NQU5EOworCWlmIChIQVNfRVhURU5ERURfSURTKGhhKSkKKwkJbWNwLT5tYlsxXSA9IGZjcG9ydC0+bG9vcF9pZDsKKwllbHNlCisJCW1jcC0+bWJbMV0gPSBmY3BvcnQtPmxvb3BfaWQgPDwgODsKKwltY3AtPm1iWzJdID0gKHVpbnQxNl90KWhhbmRsZTsKKwltY3AtPm1iWzNdID0gKHVpbnQxNl90KShoYW5kbGUgPj4gMTYpOworCW1jcC0+bWJbNl0gPSAodWludDE2X3Qpc3AtPmZjbHVuLT5sdW47CisJbWNwLT5vdXRfbWIgPSBNQlhfNnxNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKKwltY3AtPmluX21iID0gTUJYXzA7CisJbWNwLT50b3YgPSAzMDsKKwltY3AtPmZsYWdzID0gMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfYWJvcnRfY29tbWFuZCglbGQpOiBmYWlsZWQ9JXguXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpOykKKwl9IGVsc2UgeworCQlzcC0+ZmxhZ3MgfD0gU1JCX0FCT1JUX1BFTkRJTkc7CisJCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2Fib3J0X2NvbW1hbmQoJWxkKTogZG9uZS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubyk7KQorCX0KKworCXJldHVybiBydmFsOworfQorCisjaWYgVVNFX0FCT1JUX1RHVAorLyoKKyAqIHFsYTJ4MDBfYWJvcnRfdGFyZ2V0CisgKglJc3N1ZSBhYm9ydCB0YXJnZXQgbWFpbGJveCBjb21tYW5kLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX2Fib3J0X3RhcmdldChmY19wb3J0X3QgKmZjcG9ydCkKK3sKKwlpbnQgICAgICAgIHJ2YWw7CisJbWJ4X2NtZF90ICBtYzsKKwltYnhfY21kX3QgICptY3AgPSAmbWM7CisKKwlERUJVRzExKHByaW50aygicWxhMngwMF9hYm9ydF90YXJnZXQoJWxkKTogZW50ZXJlZC5cbiIsCisJICAgIGZjcG9ydC0+aGEtPmhvc3Rfbm8pOykKKworCWlmIChmY3BvcnQgPT0gTlVMTCkgeworCQkvKiBubyB0YXJnZXQgdG8gYWJvcnQgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJbWNwLT5tYlswXSA9IE1CQ19BQk9SVF9UQVJHRVQ7CisJbWNwLT5vdXRfbWIgPSBNQlhfMnxNQlhfMXxNQlhfMDsKKwlpZiAoSEFTX0VYVEVOREVEX0lEUyhmY3BvcnQtPmhhKSkgeworCQltY3AtPm1iWzFdID0gZmNwb3J0LT5sb29wX2lkOworCQltY3AtPm1iWzEwXSA9IDA7CisJCW1jcC0+b3V0X21iIHw9IE1CWF8xMDsKKwl9IGVsc2UgeworCQltY3AtPm1iWzFdID0gZmNwb3J0LT5sb29wX2lkIDw8IDg7CisJfQorCW1jcC0+bWJbMl0gPSBmY3BvcnQtPmhhLT5sb29wX3Jlc2V0X2RlbGF5OworCisJbWNwLT5pbl9tYiA9IE1CWF8wOworCW1jcC0+dG92ID0gMzA7CisJbWNwLT5mbGFncyA9IDA7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGZjcG9ydC0+aGEsIG1jcCk7CisKKwkvKiBJc3N1ZSBtYXJrZXIgY29tbWFuZC4gKi8KKwlmY3BvcnQtPmhhLT5tYXJrZXJfbmVlZGVkID0gMTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9hYm9ydF90YXJnZXQoJWxkKTogZmFpbGVkPSV4LlxuIiwKKwkJICAgIGZjcG9ydC0+aGEtPmhvc3Rfbm8sIHJ2YWwpOykKKwl9IGVsc2UgeworCQkvKkVNUFRZKi8KKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfYWJvcnRfdGFyZ2V0KCVsZCk6IGRvbmUuXG4iLAorCQkgICAgZmNwb3J0LT5oYS0+aG9zdF9ubyk7KQorCX0KKworCXJldHVybiBydmFsOworfQorI2VuZGlmCisKKy8qCisgKiBxbGEyeDAwX3RhcmdldF9yZXNldAorICoJSXNzdWUgdGFyZ2V0IHJlc2V0IG1haWxib3ggY29tbWFuZC4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJVEFSR0VUX1FVRVVFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KKyAqCUFEQVBURVJfU1RBVEVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK2ludAorcWxhMngwMF90YXJnZXRfcmVzZXQoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgYiwgdWludDE2X3QgdCkKK3sKKwlpbnQgcnZhbDsKKwltYnhfY21kX3QgbWM7CisJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisJb3NfdGd0X3QgKnRndDsKKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX3RhcmdldF9yZXNldCglbGQpOiBlbnRlcmVkLlxuIiwgaGEtPmhvc3Rfbm8pOykKKworCXRndCA9IFRHVF9RKGhhLCB0KTsKKwlpZiAodGd0LT5mY3BvcnQgPT0gTlVMTCkgeworCQkvKiBubyB0YXJnZXQgdG8gYWJvcnQgKi8KKwkJcmV0dXJuIDA7CisJfQorCWlmIChhdG9taWNfcmVhZCgmdGd0LT5mY3BvcnQtPnN0YXRlKSAhPSBGQ1NfT05MSU5FKSB7CisJCS8qIHRhcmdldCBub3Qgb25saW5lICovCisJCXJldHVybiAwOworCX0KKworCW1jcC0+bWJbMF0gPSBNQkNfVEFSR0VUX1JFU0VUOworCWlmIChIQVNfRVhURU5ERURfSURTKGhhKSkKKwkJbWNwLT5tYlsxXSA9IHRndC0+ZmNwb3J0LT5sb29wX2lkOworCWVsc2UKKwkJbWNwLT5tYlsxXSA9IHRndC0+ZmNwb3J0LT5sb29wX2lkIDw8IDg7CisJbWNwLT5tYlsyXSA9IGhhLT5sb29wX3Jlc2V0X2RlbGF5OworCW1jcC0+b3V0X21iID0gTUJYXzJ8TUJYXzF8TUJYXzA7CisJbWNwLT5pbl9tYiA9IE1CWF8wOworCW1jcC0+dG92ID0gMzA7CisJbWNwLT5mbGFncyA9IDA7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF90YXJnZXRfcmVzZXQoJWxkKTogZmFpbGVkPSV4LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBydmFsKTspCisJfSBlbHNlIHsKKwkJLypFTVBUWSovCisJCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX3RhcmdldF9yZXNldCglbGQpOiBkb25lLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKTspCisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBxbGEyeDAwX2dldF9hZGFwdGVyX2lkCisgKglHZXQgYWRhcHRlciBJRCBhbmQgdG9wb2xvZ3kuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCWlkID0gcG9pbnRlciBmb3IgbG9vcCBJRC4KKyAqCWFsX3BhID0gcG9pbnRlciBmb3IgQUxfUEEuCisgKglhcmVhID0gcG9pbnRlciBmb3IgYXJlYS4KKyAqCWRvbWFpbiA9IHBvaW50ZXIgZm9yIGRvbWFpbi4KKyAqCXRvcCA9IHBvaW50ZXIgZm9yIHRvcG9sb2d5LgorICoJVEFSR0VUX1FVRVVFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KKyAqCUFEQVBURVJfU1RBVEVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK2ludAorcWxhMngwMF9nZXRfYWRhcHRlcl9pZChzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCAqaWQsIHVpbnQ4X3QgKmFsX3BhLAorICAgIHVpbnQ4X3QgKmFyZWEsIHVpbnQ4X3QgKmRvbWFpbiwgdWludDE2X3QgKnRvcCkKK3sKKwlpbnQgcnZhbDsKKwltYnhfY21kX3QgbWM7CisJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisKKwlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfYWRhcHRlcl9pZCglbGQpOiBlbnRlcmVkLlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8pOykKKworCW1jcC0+bWJbMF0gPSBNQkNfR0VUX0FEQVBURVJfTE9PUF9JRDsKKwltY3AtPm91dF9tYiA9IE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfN3xNQlhfNnxNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKKwltY3AtPnRvdiA9IDMwOworCW1jcC0+ZmxhZ3MgPSAwOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKworCS8qIFJldHVybiBkYXRhLiAqLworCSppZCA9IG1jcC0+bWJbMV07CisJKmFsX3BhID0gTFNCKG1jcC0+bWJbMl0pOworCSphcmVhID0gTVNCKG1jcC0+bWJbMl0pOworCSpkb21haW4JPSBMU0IobWNwLT5tYlszXSk7CisJKnRvcCA9IG1jcC0+bWJbNl07CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2dldF9hZGFwdGVyX2lkKCVsZCk6IGZhaWxlZD0leC5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgcnZhbCk7KQorCX0gZWxzZSB7CisJCS8qRU1QVFkqLworCQlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfYWRhcHRlcl9pZCglbGQpOiBkb25lLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKTspCisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBxbGEyeDAwX2dldF9yZXRyeV9jbnQKKyAqCUdldCBjdXJyZW50IGZpcm13YXJlIGxvZ2luIHJldHJ5IGNvdW50IGFuZCBkZWxheS4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJcmV0cnlfY250ID0gcG9pbnRlciB0byBsb2dpbiByZXRyeSBjb3VudC4KKyAqCXRvdiA9IHBvaW50ZXIgdG8gbG9naW4gdGltZW91dCB2YWx1ZS4KKyAqCisgKiBSZXR1cm5zOgorICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitpbnQKK3FsYTJ4MDBfZ2V0X3JldHJ5X2NudChzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50OF90ICpyZXRyeV9jbnQsIHVpbnQ4X3QgKnRvdiwKKyAgICB1aW50MTZfdCAqcl9hX3RvdikKK3sKKwlpbnQgcnZhbDsKKwl1aW50MTZfdCByYXRvdjsKKwltYnhfY21kX3QgbWM7CisJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisKKwlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfcmV0cnlfY250KCVsZCk6IGVudGVyZWQuXG4iLAorCQkJaGEtPmhvc3Rfbm8pOykKKworCW1jcC0+bWJbMF0gPSBNQkNfR0VUX1JFVFJZX0NPVU5UOworCW1jcC0+b3V0X21iID0gTUJYXzA7CisJbWNwLT5pbl9tYiA9IE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+dG92ID0gMzA7CisJbWNwLT5mbGFncyA9IDA7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9nZXRfcmV0cnlfY250KCVsZCk6IGZhaWxlZCA9ICV4LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBtY3AtPm1iWzBdKTspCisJfSBlbHNlIHsKKwkJLyogQ29udmVydCByZXR1cm5lZCBkYXRhIGFuZCBjaGVjayBvdXIgdmFsdWVzLiAqLworCQkqcl9hX3RvdiA9IG1jcC0+bWJbM10gLyAyOworCQlyYXRvdiA9IChtY3AtPm1iWzNdLzIpIC8gMTA7ICAvKiBtYlszXSB2YWx1ZSBpcyBpbiAxMDBtcyAqLworCQlpZiAobWNwLT5tYlsxXSAqIHJhdG92ID4gKCpyZXRyeV9jbnQpICogKCp0b3YpKSB7CisJCQkvKiBVcGRhdGUgdG8gdGhlIGxhcmdlciB2YWx1ZXMgKi8KKwkJCSpyZXRyeV9jbnQgPSAodWludDhfdCltY3AtPm1iWzFdOworCQkJKnRvdiA9IHJhdG92OworCQl9CisKKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfZ2V0X3JldHJ5X2NudCglbGQpOiBkb25lLiBtYjM9JWQgIgorCQkgICAgInJhdG92PSVkLlxuIiwgaGEtPmhvc3Rfbm8sIG1jcC0+bWJbM10sIHJhdG92KTspCisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBxbGEyeDAwX2luaXRfZmlybXdhcmUKKyAqCUluaXRpYWxpemUgYWRhcHRlciBmaXJtd2FyZS4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJZHB0ciA9IEluaXRpYWxpemF0aW9uIGNvbnRyb2wgYmxvY2sgcG9pbnRlci4KKyAqCXNpemUgPSBzaXplIG9mIGluaXRpYWxpemF0aW9uIGNvbnRyb2wgYmxvY2suCisgKglUQVJHRVRfUVVFVUVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoJQURBUFRFUl9TVEFURV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX2luaXRfZmlybXdhcmUoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3Qgc2l6ZSkKK3sKKwlpbnQgcnZhbDsKKwltYnhfY21kX3QgbWM7CisJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisKKwlERUJVRzExKHByaW50aygicWxhMngwMF9pbml0X2Zpcm13YXJlKCVsZCk6IGVudGVyZWQuXG4iLAorCSAgICBoYS0+aG9zdF9ubyk7KQorCisJbWNwLT5tYlswXSA9IE1CQ19JTklUSUFMSVpFX0ZJUk1XQVJFOworCW1jcC0+bWJbMl0gPSBNU1coaGEtPmluaXRfY2JfZG1hKTsKKwltY3AtPm1iWzNdID0gTFNXKGhhLT5pbml0X2NiX2RtYSk7CisJbWNwLT5tYls0XSA9IDA7CisJbWNwLT5tYls1XSA9IDA7CisJbWNwLT5tYls2XSA9IE1TVyhNU0QoaGEtPmluaXRfY2JfZG1hKSk7CisJbWNwLT5tYls3XSA9IExTVyhNU0QoaGEtPmluaXRfY2JfZG1hKSk7CisJbWNwLT5vdXRfbWIgPSBNQlhfN3xNQlhfNnxNQlhfM3xNQlhfMnxNQlhfMDsKKwltY3AtPmluX21iID0gTUJYXzV8TUJYXzR8TUJYXzA7CisJbWNwLT5idWZfc2l6ZSA9IHNpemU7CisJbWNwLT5mbGFncyA9IE1CWF9ETUFfT1VUOworCW1jcC0+dG92ID0gMzA7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9pbml0X2Zpcm13YXJlKCVsZCk6IGZhaWxlZD0leCAiCisJCSAgICAibWIwPSV4LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKTspCisJfSBlbHNlIHsKKwkJLypFTVBUWSovCisJCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2luaXRfZmlybXdhcmUoJWxkKTogZG9uZS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubyk7KQorCX0KKworCXJldHVybiBydmFsOworfQorCisvKgorICogcWxhMngwMF9nZXRfcG9ydF9kYXRhYmFzZQorICoJSXNzdWUgbm9ybWFsL2VuaGFuY2VkIGdldCBwb3J0IGRhdGFiYXNlIG1haWxib3ggY29tbWFuZAorICoJYW5kIGNvcHkgZGV2aWNlIG5hbWUgYXMgbmVjZXNzYXJ5LgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIHN0YXRlIHBvaW50ZXIuCisgKglkZXYgPSBzdHJ1Y3R1cmUgcG9pbnRlci4KKyAqCW9wdCA9IGVuaGFuY2VkIGNtZCBvcHRpb24gYnl0ZS4KKyAqCisgKiBSZXR1cm5zOgorICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitpbnQKK3FsYTJ4MDBfZ2V0X3BvcnRfZGF0YWJhc2Uoc2NzaV9xbGFfaG9zdF90ICpoYSwgZmNfcG9ydF90ICpmY3BvcnQsIHVpbnQ4X3Qgb3B0KQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKwlwb3J0X2RhdGFiYXNlX3QgKnBkOworCWRtYV9hZGRyX3QgcGRfZG1hOworCisJREVCVUcxMShwcmludGsoInFsYTJ4MDBfZ2V0X3BvcnRfZGF0YWJhc2UoJWxkKTogZW50ZXJlZC5cbiIsCisJICAgIGhhLT5ob3N0X25vKTspCisKKwlwZCA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfQVRPTUlDLCAmcGRfZG1hKTsKKwlpZiAocGQgID09IE5VTEwpIHsKKwkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2dldF9wb3J0X2RhdGFiYXNlKCVsZCk6ICoqKiogIgorCQkgICAgIk1lbSBBbGxvYyBGYWlsZWQgKioqKiIsIGhhLT5ob3N0X25vKTspCisJCXJldHVybiBRTEFfTUVNT1JZX0FMTE9DX0ZBSUxFRDsKKwl9CisJbWVtc2V0KHBkLCAwLCBQT1JUX0RBVEFCQVNFX1NJWkUpOworCisJaWYgKG9wdCAhPSAwKQorCQltY3AtPm1iWzBdID0gTUJDX0VOSEFOQ0VEX0dFVF9QT1JUX0RBVEFCQVNFOworCWVsc2UKKwkJbWNwLT5tYlswXSA9IE1CQ19HRVRfUE9SVF9EQVRBQkFTRTsKKwltY3AtPm91dF9tYiA9IE1CWF83fE1CWF82fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCWlmIChIQVNfRVhURU5ERURfSURTKGhhKSkgeworCQltY3AtPm1iWzFdID0gZmNwb3J0LT5sb29wX2lkOworCQltY3AtPm1iWzEwXSA9IG9wdDsKKwkJbWNwLT5vdXRfbWIgfD0gTUJYXzEwOworCX0gZWxzZSB7CisJCW1jcC0+bWJbMV0gPSBmY3BvcnQtPmxvb3BfaWQgPDwgOCB8IG9wdDsKKwl9CisJbWNwLT5tYlsyXSA9IE1TVyhwZF9kbWEpOworCW1jcC0+bWJbM10gPSBMU1cocGRfZG1hKTsKKwltY3AtPm1iWzZdID0gTVNXKE1TRChwZF9kbWEpKTsKKwltY3AtPm1iWzddID0gTFNXKE1TRChwZF9kbWEpKTsKKworCW1jcC0+aW5fbWIgPSBNQlhfMDsKKwltY3AtPmJ1Zl9zaXplID0gUE9SVF9EQVRBQkFTRV9TSVpFOworCW1jcC0+ZmxhZ3MgPSBNQlhfRE1BX0lOOworCW1jcC0+dG92ID0gKGhhLT5sb2dpbl90aW1lb3V0ICogMikgKyAoaGEtPmxvZ2luX3RpbWVvdXQgLyAyKTsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCisJCWdvdG8gZ3BkX2Vycm9yX291dDsKKworCS8qIENoZWNrIGZvciBsb2dnZWQgaW4gc3RhdGUuICovCisJaWYgKHBkLT5tYXN0ZXJfc3RhdGUgIT0gUERfU1RBVEVfUE9SVF9MT0dHRURfSU4gJiYKKwkgICAgcGQtPnNsYXZlX3N0YXRlICE9IFBEX1NUQVRFX1BPUlRfTE9HR0VEX0lOKSB7CisJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQlnb3RvIGdwZF9lcnJvcl9vdXQ7CisJfQorCisJLyogTmFtZXMgYXJlIGxpdHRsZS1lbmRpYW4uICovCisJbWVtY3B5KGZjcG9ydC0+bm9kZV9uYW1lLCBwZC0+bm9kZV9uYW1lLCBXV05fU0laRSk7CisJbWVtY3B5KGZjcG9ydC0+cG9ydF9uYW1lLCBwZC0+cG9ydF9uYW1lLCBXV05fU0laRSk7CisKKwkvKiBHZXQgcG9ydF9pZCBvZiBkZXZpY2UuICovCisJZmNwb3J0LT5kX2lkLmIuYWxfcGEgPSBwZC0+cG9ydF9pZFsyXTsKKwlmY3BvcnQtPmRfaWQuYi5hcmVhID0gcGQtPnBvcnRfaWRbM107CisJZmNwb3J0LT5kX2lkLmIuZG9tYWluID0gcGQtPnBvcnRfaWRbMF07CisJZmNwb3J0LT5kX2lkLmIucnN2ZF8xID0gMDsKKworCS8qIENoZWNrIGZvciBkZXZpY2UgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi4gKi8KKwlwZC0+Y29tbW9uX2ZlYXR1cmVzICYgQklUXzUgPyAoZmNwb3J0LT5mbGFncyB8PSBGQ0ZfQVVUSF9SRVEpIDoKKwkgICAgKGZjcG9ydC0+ZmxhZ3MgJj0gfkZDRl9BVVRIX1JFUSk7CisKKwkvKiBJZiBub3QgdGFyZ2V0IG11c3QgYmUgaW5pdGlhdG9yIG9yIHVua25vd24gdHlwZS4gKi8KKwlpZiAoKHBkLT5wcmxpX3N2Y19wYXJhbV93b3JkXzNbMF0gJiBCSVRfNCkgPT0gMCkKKwkJZmNwb3J0LT5wb3J0X3R5cGUgPSBGQ1RfSU5JVElBVE9SOworCWVsc2UKKwkJZmNwb3J0LT5wb3J0X3R5cGUgPSBGQ1RfVEFSR0VUOworCitncGRfZXJyb3Jfb3V0OgorCWRtYV9wb29sX2ZyZWUoaGEtPnNfZG1hX3Bvb2wsIHBkLCBwZF9kbWEpOworCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9nZXRfcG9ydF9kYXRhYmFzZSglbGQpOiAiCisJCSAgICAiZmFpbGVkPSV4LlxuIiwgaGEtPmhvc3Rfbm8sIHJ2YWwpOykKKwl9IGVsc2UgeworCQkvKkVNUFRZKi8KKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfZ2V0X3BvcnRfZGF0YWJhc2UoJWxkKTogZG9uZS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubyk7KQorCX0KKworCXJldHVybiBydmFsOworfQorCisvKgorICogcWxhMngwMF9nZXRfZmlybXdhcmVfc3RhdGUKKyAqCUdldCBhZGFwdGVyIGZpcm13YXJlIHN0YXRlLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglkcHRyID0gcG9pbnRlciBmb3IgZmlybXdhcmUgc3RhdGUuCisgKglUQVJHRVRfUVVFVUVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoJQURBUFRFUl9TVEFURV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX2dldF9maXJtd2FyZV9zdGF0ZShzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCAqZHB0cikKK3sKKwlpbnQgcnZhbDsKKwltYnhfY21kX3QgbWM7CisJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisKKwlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfZmlybXdhcmVfc3RhdGUoJWxkKTogZW50ZXJlZC5cbiIsCisJICAgIGhhLT5ob3N0X25vKTspCisKKwltY3AtPm1iWzBdID0gTUJDX0dFVF9GSVJNV0FSRV9TVEFURTsKKwltY3AtPm91dF9tYiA9IE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfMnxNQlhfMXxNQlhfMDsKKwltY3AtPnRvdiA9IDMwOworCW1jcC0+ZmxhZ3MgPSAwOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKworCS8qIFJldHVybiBmaXJtd2FyZSBzdGF0ZS4gKi8KKwkqZHB0ciA9IG1jcC0+bWJbMV07CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2dldF9maXJtd2FyZV9zdGF0ZSglbGQpOiAiCisJCSAgICAiZmFpbGVkPSV4LlxuIiwgaGEtPmhvc3Rfbm8sIHJ2YWwpOykKKwl9IGVsc2UgeworCQkvKkVNUFRZKi8KKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfZ2V0X2Zpcm13YXJlX3N0YXRlKCVsZCk6IGRvbmUuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pOykKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIHFsYTJ4MDBfZ2V0X3BvcnRfbmFtZQorICoJSXNzdWUgZ2V0IHBvcnQgbmFtZSBtYWlsYm94IGNvbW1hbmQuCisgKglSZXR1cm5lZCBuYW1lIGlzIGluIGJpZyBlbmRpYW4gZm9ybWF0LgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglsb29wX2lkID0gbG9vcCBJRCBvZiBkZXZpY2UuCisgKgluYW1lID0gcG9pbnRlciBmb3IgbmFtZS4KKyAqCVRBUkdFVF9RVUVVRV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKglBREFQVEVSX1NUQVRFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KKyAqCisgKiBSZXR1cm5zOgorICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitpbnQKK3FsYTJ4MDBfZ2V0X3BvcnRfbmFtZShzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCBsb29wX2lkLCB1aW50OF90ICpuYW1lLAorICAgIHVpbnQ4X3Qgb3B0KQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2dldF9wb3J0X25hbWUoJWxkKTogZW50ZXJlZC5cbiIsCisJICAgIGhhLT5ob3N0X25vKTspCisKKwltY3AtPm1iWzBdID0gTUJDX0dFVF9QT1JUX05BTUU7CisJbWNwLT5vdXRfbWIgPSBNQlhfMXxNQlhfMDsKKwlpZiAoSEFTX0VYVEVOREVEX0lEUyhoYSkpIHsKKwkJbWNwLT5tYlsxXSA9IGxvb3BfaWQ7CisJCW1jcC0+bWJbMTBdID0gb3B0OworCQltY3AtPm91dF9tYiB8PSBNQlhfMTA7CisJfSBlbHNlIHsKKwkJbWNwLT5tYlsxXSA9IGxvb3BfaWQgPDwgOCB8IG9wdDsKKwl9CisKKwltY3AtPmluX21iID0gTUJYXzd8TUJYXzZ8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisJbWNwLT50b3YgPSAzMDsKKwltY3AtPmZsYWdzID0gMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2dldF9wb3J0X25hbWUoJWxkKTogZmFpbGVkPSV4LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBydmFsKTspCisJfSBlbHNlIHsKKwkJaWYgKG5hbWUgIT0gTlVMTCkgeworCQkJLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIG5hbWUgaW4gYmlnIGVuZGlhbi4gKi8KKwkJCW5hbWVbMF0gPSBMU0IobWNwLT5tYlsyXSk7CisJCQluYW1lWzFdID0gTVNCKG1jcC0+bWJbMl0pOworCQkJbmFtZVsyXSA9IExTQihtY3AtPm1iWzNdKTsKKwkJCW5hbWVbM10gPSBNU0IobWNwLT5tYlszXSk7CisJCQluYW1lWzRdID0gTFNCKG1jcC0+bWJbNl0pOworCQkJbmFtZVs1XSA9IE1TQihtY3AtPm1iWzZdKTsKKwkJCW5hbWVbNl0gPSBMU0IobWNwLT5tYls3XSk7CisJCQluYW1lWzddID0gTVNCKG1jcC0+bWJbN10pOworCQl9CisKKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfZ2V0X3BvcnRfbmFtZSglbGQpOiBkb25lLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKTspCisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBxbGEyeDAwX2xpcF9yZXNldAorICoJSXNzdWUgTElQIHJlc2V0IG1haWxib3ggY29tbWFuZC4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJVEFSR0VUX1FVRVVFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KKyAqCUFEQVBURVJfU1RBVEVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK2ludAorcWxhMngwMF9saXBfcmVzZXQoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQgcnZhbDsKKwltYnhfY21kX3QgbWM7CisJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisKKwlERUJVRzExKHByaW50aygicWxhMngwMF9saXBfcmVzZXQoJWxkKTogZW50ZXJlZC5cbiIsCisJICAgIGhhLT5ob3N0X25vKTspCisKKwltY3AtPm1iWzBdID0gTUJDX0xJUF9SRVNFVDsKKwltY3AtPm91dF9tYiA9IE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCWlmIChIQVNfRVhURU5ERURfSURTKGhhKSkgeworCQltY3AtPm1iWzFdID0gMHgwMGZmOworCQltY3AtPm1iWzEwXSA9IDA7CisJCW1jcC0+b3V0X21iIHw9IE1CWF8xMDsKKwl9IGVsc2UgeworCQltY3AtPm1iWzFdID0gMHhmZjAwOworCX0KKwltY3AtPm1iWzJdID0gaGEtPmxvb3BfcmVzZXRfZGVsYXk7CisJbWNwLT5tYlszXSA9IDA7CisKKwltY3AtPmluX21iID0gTUJYXzA7CisJbWNwLT50b3YgPSAzMDsKKwltY3AtPmZsYWdzID0gMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2xpcF9yZXNldCglbGQpOiBmYWlsZWQ9JXguXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpOykKKwl9IGVsc2UgeworCQkvKkVNUFRZKi8KKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfbGlwX3Jlc2V0KCVsZCk6IGRvbmUuXG4iLCBoYS0+aG9zdF9ubyk7KQorCX0KKworCXJldHVybiBydmFsOworfQorCisvKgorICogcWxhMngwMF9zZW5kX3NucworICoJU2VuZCBTTlMgY29tbWFuZC4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJc25zID0gcG9pbnRlciBmb3IgY29tbWFuZC4KKyAqCWNtZF9zaXplID0gY29tbWFuZCBzaXplLgorICoJYnVmX3NpemUgPSByZXNwb25zZS9jb21tYW5kIHNpemUuCisgKglUQVJHRVRfUVVFVUVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoJQURBUFRFUl9TVEFURV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX3NlbmRfc25zKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGRtYV9hZGRyX3Qgc25zX3BoeXNfYWRkcmVzcywKKyAgICB1aW50MTZfdCBjbWRfc2l6ZSwgc2l6ZV90IGJ1Zl9zaXplKQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX3NlbmRfc25zKCVsZCk6IGVudGVyZWQuXG4iLAorCSAgICBoYS0+aG9zdF9ubyk7KQorCisJREVCVUcxMShwcmludGsoInFsYTJ4MDBfc2VuZF9zbnM6IHJldHJ5IGNudD0lZCByYXRvdj0lZCB0b3RhbCAiCisJICAgICJ0b3Y9JWQuXG4iLCBoYS0+cmV0cnlfY291bnQsIGhhLT5sb2dpbl90aW1lb3V0LCBtY3AtPnRvdik7KQorCisJbWNwLT5tYlswXSA9IE1CQ19TRU5EX1NOU19DT01NQU5EOworCW1jcC0+bWJbMV0gPSBjbWRfc2l6ZTsKKwltY3AtPm1iWzJdID0gTVNXKHNuc19waHlzX2FkZHJlc3MpOworCW1jcC0+bWJbM10gPSBMU1coc25zX3BoeXNfYWRkcmVzcyk7CisJbWNwLT5tYls2XSA9IE1TVyhNU0Qoc25zX3BoeXNfYWRkcmVzcykpOworCW1jcC0+bWJbN10gPSBMU1coTVNEKHNuc19waHlzX2FkZHJlc3MpKTsKKwltY3AtPm91dF9tYiA9IE1CWF83fE1CWF82fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfMHxNQlhfMTsKKwltY3AtPmJ1Zl9zaXplID0gYnVmX3NpemU7CisJbWNwLT5mbGFncyA9IE1CWF9ETUFfT1VUfE1CWF9ETUFfSU47CisJbWNwLT50b3YgPSAoaGEtPmxvZ2luX3RpbWVvdXQgKiAyKSArIChoYS0+bG9naW5fdGltZW91dCAvIDIpOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRyhwcmludGsoInFsYTJ4MDBfc2VuZF9zbnMoJWxkKTogZmFpbGVkPSV4IG1iWzBdPSV4ICIKKwkJICAgICJtYlsxXT0leC5cbiIsIGhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKTspCisJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9zZW5kX3NucyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXggIgorCQkgICAgIm1iWzFdPSV4LlxuIiwgaGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pOykKKwl9IGVsc2UgeworCQkvKkVNUFRZKi8KKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfc2VuZF9zbnMoJWxkKTogZG9uZS5cbiIsIGhhLT5ob3N0X25vKTspCisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBxbGEyeDAwX2xvZ2luX2ZhYnJpYworICoJSXNzdWUgbG9naW4gZmFicmljIHBvcnQgbWFpbGJveCBjb21tYW5kLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglsb29wX2lkID0gZGV2aWNlIGxvb3AgSUQuCisgKglkb21haW4gPSBkZXZpY2UgZG9tYWluLgorICoJYXJlYSA9IGRldmljZSBhcmVhLgorICoJYWxfcGEgPSBkZXZpY2UgQUxfUEEuCisgKglzdGF0dXMgPSBwb2ludGVyIGZvciByZXR1cm4gc3RhdHVzLgorICoJb3B0ID0gY29tbWFuZCBvcHRpb25zLgorICoJVEFSR0VUX1FVRVVFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KKyAqCUFEQVBURVJfU1RBVEVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK2ludAorcWxhMngwMF9sb2dpbl9mYWJyaWMoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgbG9vcF9pZCwgdWludDhfdCBkb21haW4sCisgICAgdWludDhfdCBhcmVhLCB1aW50OF90IGFsX3BhLCB1aW50MTZfdCAqbWIsIHVpbnQ4X3Qgb3B0KQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2xvZ2luX2ZhYnJpYyglbGQpOiBlbnRlcmVkLlxuIiwgaGEtPmhvc3Rfbm8pOykKKworCW1jcC0+bWJbMF0gPSBNQkNfTE9HSU5fRkFCUklDX1BPUlQ7CisJbWNwLT5vdXRfbWIgPSBNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKKwlpZiAoSEFTX0VYVEVOREVEX0lEUyhoYSkpIHsKKwkJbWNwLT5tYlsxXSA9IGxvb3BfaWQ7CisJCW1jcC0+bWJbMTBdID0gb3B0OworCQltY3AtPm91dF9tYiB8PSBNQlhfMTA7CisJfSBlbHNlIHsKKwkJbWNwLT5tYlsxXSA9IChsb29wX2lkIDw8IDgpIHwgb3B0OworCX0KKwltY3AtPm1iWzJdID0gZG9tYWluOworCW1jcC0+bWJbM10gPSBhcmVhIDw8IDggfCBhbF9wYTsKKworCW1jcC0+aW5fbWIgPSBNQlhfN3xNQlhfNnxNQlhfMnxNQlhfMXxNQlhfMDsKKwltY3AtPnRvdiA9IChoYS0+bG9naW5fdGltZW91dCAqIDIpICsgKGhhLT5sb2dpbl90aW1lb3V0IC8gMik7CisJbWNwLT5mbGFncyA9IDA7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCisJLyogUmV0dXJuIG1haWxib3ggc3RhdHVzZXMuICovCisJaWYgKG1iICE9IE5VTEwpIHsKKwkJbWJbMF0gPSBtY3AtPm1iWzBdOworCQltYlsxXSA9IG1jcC0+bWJbMV07CisJCW1iWzJdID0gbWNwLT5tYlsyXTsKKwkJbWJbNl0gPSBtY3AtPm1iWzZdOworCQltYls3XSA9IG1jcC0+bWJbN107CisJfQorCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLyogUkxVIHRtcCBjb2RlOiBuZWVkIHRvIGNoYW5nZSBtYWluIG1haWxib3hfY29tbWFuZCBmdW5jdGlvbiB0bworCQkgKiByZXR1cm4gb2sgZXZlbiB3aGVuIHRoZSBtYWlsYm94IGNvbXBsZXRpb24gdmFsdWUgaXMgbm90CisJCSAqIFNVQ0NFU1MuIFRoZSBjYWxsZXIgbmVlZHMgdG8gYmUgcmVzcG9uc2libGUgdG8gaW50ZXJwcmV0CisJCSAqIHRoZSByZXR1cm4gdmFsdWVzIG9mIHRoaXMgbWFpbGJveCBjb21tYW5kIGlmIHdlJ3JlIG5vdAorCQkgKiB0byBjaGFuZ2UgdG9vIG11Y2ggb2YgdGhlIGV4aXN0aW5nIGNvZGUuCisJCSAqLworCQlpZiAobWNwLT5tYlswXSA9PSAweDQwMDEgfHwgbWNwLT5tYlswXSA9PSAweDQwMDIgfHwKKwkJICAgIG1jcC0+bWJbMF0gPT0gMHg0MDAzIHx8IG1jcC0+bWJbMF0gPT0gMHg0MDA1IHx8CisJCSAgICBtY3AtPm1iWzBdID09IDB4NDAwNikKKwkJCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKKworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2xvZ2luX2ZhYnJpYyglbGQpOiBmYWlsZWQ9JXggIgorCQkgICAgIm1iWzBdPSV4IG1iWzFdPSV4IG1iWzJdPSV4LlxuIiwgaGEtPmhvc3Rfbm8sIHJ2YWwsCisJCSAgICBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdLCBtY3AtPm1iWzJdKTspCisJfSBlbHNlIHsKKwkJLypFTVBUWSovCisJCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2xvZ2luX2ZhYnJpYyglbGQpOiBkb25lLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKTspCisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBxbGEyeDAwX2xvZ2luX2xvY2FsX2RldmljZQorICogICAgICAgICAgIElzc3VlIGxvZ2luIGxvb3AgcG9ydCBtYWlsYm94IGNvbW1hbmQuCisgKiAgICAKKyAqIElucHV0OgorICogICAgICAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICogICAgICAgICAgIGxvb3BfaWQgPSBkZXZpY2UgbG9vcCBJRC4KKyAqICAgICAgICAgICBvcHQgPSBjb21tYW5kIG9wdGlvbnMuCisgKiAgICAgICAgICAKKyAqIFJldHVybnM6CisgKiAgICAgICAgICAgIFJldHVybiBzdGF0dXMgY29kZS4KKyAqICAgICAgICAgICAgIAorICogQ29udGV4dDoKKyAqICAgICAgICAgICAgS2VybmVsIGNvbnRleHQuCisgKiAgICAgICAgICAgICAKKyAqLworaW50CitxbGEyeDAwX2xvZ2luX2xvY2FsX2RldmljZShzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCBsb29wX2lkLAorICAgIHVpbnQxNl90ICptYl9yZXQsIHVpbnQ4X3Qgb3B0KQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKworCURFQlVHMyhwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pOykKKworCW1jcC0+bWJbMF0gPSBNQkNfTE9HSU5fTE9PUF9QT1JUOworCWlmIChIQVNfRVhURU5ERURfSURTKGhhKSkKKwkJbWNwLT5tYlsxXSA9IGxvb3BfaWQ7CisJZWxzZQorCQltY3AtPm1iWzFdID0gbG9vcF9pZCA8PCA4OworCW1jcC0+bWJbMl0gPSBvcHQ7CisJbWNwLT5vdXRfbWIgPSBNQlhfMnxNQlhfMXxNQlhfMDsKKyAJbWNwLT5pbl9tYiA9IE1CWF83fE1CWF82fE1CWF8xfE1CWF8wOworCW1jcC0+dG92ID0gKGhhLT5sb2dpbl90aW1lb3V0ICogMikgKyAoaGEtPmxvZ2luX3RpbWVvdXQgLyAyKTsKKwltY3AtPmZsYWdzID0gMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKyAJLyogUmV0dXJuIG1haWxib3ggc3RhdHVzZXMuICovCisgCWlmIChtYl9yZXQgIT0gTlVMTCkgeworIAkJbWJfcmV0WzBdID0gbWNwLT5tYlswXTsKKyAJCW1iX3JldFsxXSA9IG1jcC0+bWJbMV07CisgCQltYl9yZXRbNl0gPSBtY3AtPm1iWzZdOworIAkJbWJfcmV0WzddID0gbWNwLT5tYls3XTsKKyAJfQorCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKyAJCS8qIEFWIHRtcCBjb2RlOiBuZWVkIHRvIGNoYW5nZSBtYWluIG1haWxib3hfY29tbWFuZCBmdW5jdGlvbiB0bworIAkJICogcmV0dXJuIG9rIGV2ZW4gd2hlbiB0aGUgbWFpbGJveCBjb21wbGV0aW9uIHZhbHVlIGlzIG5vdAorIAkJICogU1VDQ0VTUy4gVGhlIGNhbGxlciBuZWVkcyB0byBiZSByZXNwb25zaWJsZSB0byBpbnRlcnByZXQKKyAJCSAqIHRoZSByZXR1cm4gdmFsdWVzIG9mIHRoaXMgbWFpbGJveCBjb21tYW5kIGlmIHdlJ3JlIG5vdAorIAkJICogdG8gY2hhbmdlIHRvbyBtdWNoIG9mIHRoZSBleGlzdGluZyBjb2RlLgorIAkJICovCisgCQlpZiAobWNwLT5tYlswXSA9PSAweDQwMDUgfHwgbWNwLT5tYlswXSA9PSAweDQwMDYpCisgCQkJcnZhbCA9IFFMQV9TVUNDRVNTOworCisJCURFQlVHKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4IG1iWzBdPSV4IG1iWzFdPSV4ICIKKwkJICAgICJtYls2XT0leCBtYls3XT0leC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywgcnZhbCwKKwkJICAgIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0sIG1jcC0+bWJbNl0sIG1jcC0+bWJbN10pOykKKwkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXggIgorCQkgICAgIm1iWzZdPSV4IG1iWzddPSV4LlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLCBydmFsLAorCQkgICAgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSwgbWNwLT5tYls2XSwgbWNwLT5tYls3XSk7KQorCX0gZWxzZSB7CisJCS8qRU1QVFkqLworCQlERUJVRzMocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKTspCisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworLyoKKyAqIHFsYTJ4MDBfZmFicmljX2xvZ291dAorICoJSXNzdWUgbG9nb3V0IGZhYnJpYyBwb3J0IG1haWxib3ggY29tbWFuZC4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJbG9vcF9pZCA9IGRldmljZSBsb29wIElELgorICoJVEFSR0VUX1FVRVVFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KKyAqCUFEQVBURVJfU1RBVEVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK2ludAorcWxhMngwMF9mYWJyaWNfbG9nb3V0KHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90IGxvb3BfaWQpCit7CisJaW50IHJ2YWw7CisJbWJ4X2NtZF90IG1jOworCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCisJREVCVUcxMShwcmludGsoInFsYTJ4MDBfZmFicmljX2xvZ291dCglbGQpOiBlbnRlcmVkLlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8pOykKKworCW1jcC0+bWJbMF0gPSBNQkNfTE9HT1VUX0ZBQlJJQ19QT1JUOworCW1jcC0+b3V0X21iID0gTUJYXzF8TUJYXzA7CisJaWYgKEhBU19FWFRFTkRFRF9JRFMoaGEpKSB7CisJCW1jcC0+bWJbMV0gPSBsb29wX2lkOworCQltY3AtPm1iWzEwXSA9IDA7CisJCW1jcC0+b3V0X21iIHw9IE1CWF8xMDsKKwl9IGVsc2UgeworCQltY3AtPm1iWzFdID0gbG9vcF9pZCA8PCA4OworCX0KKworCW1jcC0+aW5fbWIgPSBNQlhfMXxNQlhfMDsKKwltY3AtPnRvdiA9IDMwOworCW1jcC0+ZmxhZ3MgPSAwOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfZmFicmljX2xvZ291dCglbGQpOiBmYWlsZWQ9JXggIgorCQkgICAgIm1ieDE9JXguXG4iLCBoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlsxXSk7KQorCX0gZWxzZSB7CisJCS8qRU1QVFkqLworCQlERUJVRzExKHByaW50aygicWxhMngwMF9mYWJyaWNfbG9nb3V0KCVsZCk6IGRvbmUuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pOykKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIHFsYTJ4MDBfZnVsbF9sb2dpbl9saXAKKyAqCUlzc3VlIGZ1bGwgbG9naW4gTElQIG1haWxib3ggY29tbWFuZC4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJVEFSR0VUX1FVRVVFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KKyAqCUFEQVBURVJfU1RBVEVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK2ludAorcWxhMngwMF9mdWxsX2xvZ2luX2xpcChzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2Z1bGxfbG9naW5fbGlwKCVsZCk6IGVudGVyZWQuXG4iLAorCSAgICBoYS0+aG9zdF9ubyk7KQorCisJbWNwLT5tYlswXSA9IE1CQ19MSVBfRlVMTF9MT0dJTjsKKwltY3AtPm1iWzFdID0gMDsKKwltY3AtPm1iWzJdID0gMDsKKwltY3AtPm1iWzNdID0gMDsKKwltY3AtPm91dF9tYiA9IE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfMDsKKwltY3AtPnRvdiA9IDMwOworCW1jcC0+ZmxhZ3MgPSAwOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfZnVsbF9sb2dpbl9saXAoJWxkKTogZmFpbGVkPSV4LlxuIiwKKwkJICAgIGhhLT5pbnN0YW5jZSwgcnZhbCk7KQorCX0gZWxzZSB7CisJCS8qRU1QVFkqLworCQlERUJVRzExKHByaW50aygicWxhMngwMF9mdWxsX2xvZ2luX2xpcCglbGQpOiBkb25lLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKTspCisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBxbGEyeDAwX2dldF9pZF9saXN0CisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCisgKiBSZXR1cm5zOgorICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitpbnQKK3FsYTJ4MDBfZ2V0X2lkX2xpc3Qoc2NzaV9xbGFfaG9zdF90ICpoYSwgdm9pZCAqaWRfbGlzdCwgZG1hX2FkZHJfdCBpZF9saXN0X2RtYSwKKyAgICB1aW50MTZfdCAqZW50cmllcykKK3sKKwlpbnQgcnZhbDsKKwltYnhfY21kX3QgbWM7CisJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisKKwlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfaWRfbGlzdCglbGQpOiBlbnRlcmVkLlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8pOykKKworCWlmIChpZF9saXN0ID09IE5VTEwpCisJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOworCisJbWNwLT5tYlswXSA9IE1CQ19HRVRfSURfTElTVDsKKwltY3AtPm1iWzFdID0gTVNXKGlkX2xpc3RfZG1hKTsKKwltY3AtPm1iWzJdID0gTFNXKGlkX2xpc3RfZG1hKTsKKwltY3AtPm1iWzNdID0gTVNXKE1TRChpZF9saXN0X2RtYSkpOworCW1jcC0+bWJbNl0gPSBMU1coTVNEKGlkX2xpc3RfZG1hKSk7CisJbWNwLT5vdXRfbWIgPSBNQlhfNnxNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKKwltY3AtPmluX21iID0gTUJYXzF8TUJYXzA7CisJbWNwLT50b3YgPSAzMDsKKwltY3AtPmZsYWdzID0gMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2dldF9pZF9saXN0KCVsZCk6IGZhaWxlZD0leC5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgcnZhbCk7KQorCX0gZWxzZSB7CisJCSplbnRyaWVzID0gbWNwLT5tYlsxXTsKKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfZ2V0X2lkX2xpc3QoJWxkKTogZG9uZS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubyk7KQorCX0KKworCXJldHVybiBydmFsOworfQorCisvKgorICogcWxhMngwMF9nZXRfcmVzb3VyY2VfY250cworICoJR2V0IGN1cnJlbnQgZmlybXdhcmUgcmVzb3VyY2UgY291bnRzLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX2dldF9yZXNvdXJjZV9jbnRzKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90ICpjdXJfeGNoZ19jbnQsCisgICAgdWludDE2X3QgKm9yaWdfeGNoZ19jbnQsIHVpbnQxNl90ICpjdXJfaW9jYl9jbnQsIHVpbnQxNl90ICpvcmlnX2lvY2JfY250KQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKworCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisKKwltY3AtPm1iWzBdID0gTUJDX0dFVF9SRVNPVVJDRV9DT1VOVFM7CisJbWNwLT5vdXRfbWIgPSBNQlhfMDsKKwltY3AtPmluX21iID0gTUJYXzEwfE1CWF83fE1CWF82fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+dG92ID0gMzA7CisJbWNwLT5mbGFncyA9IDA7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkID0gJXguXG4iLCBfX2Z1bmNfXywKKwkJICAgIGhhLT5ob3N0X25vLCBtY3AtPm1iWzBdKTspCisJfSBlbHNlIHsKKwkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuIG1iMT0leCBtYjI9JXggbWIzPSV4IG1iNj0leCAiCisJCSAgICAibWI3PSV4IG1iMTA9JXguXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJCSAgICBtY3AtPm1iWzFdLCBtY3AtPm1iWzJdLCBtY3AtPm1iWzNdLCBtY3AtPm1iWzZdLCBtY3AtPm1iWzddLCAKKwkJICAgIG1jcC0+bWJbMTBdKSk7CisKKwkJaWYgKGN1cl94Y2hnX2NudCkKKwkJCSpjdXJfeGNoZ19jbnQgPSBtY3AtPm1iWzNdOworCQlpZiAob3JpZ194Y2hnX2NudCkKKwkJCSpvcmlnX3hjaGdfY250ID0gbWNwLT5tYls2XTsKKwkJaWYgKGN1cl9pb2NiX2NudCkKKwkJCSpjdXJfaW9jYl9jbnQgPSBtY3AtPm1iWzddOworCQlpZiAob3JpZ19pb2NiX2NudCkKKwkJCSpvcmlnX2lvY2JfY250ID0gbWNwLT5tYlsxMF07CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMykKKy8qCisgKiBxbGEyeDAwX2dldF9mY2FsX3Bvc2l0aW9uX21hcAorICoJR2V0IEZDQUwgKExJTFApIHBvc2l0aW9uIG1hcCB1c2luZyBtYWlsYm94IGNvbW1hbmQKKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBzdGF0ZSBwb2ludGVyLgorICoJcG9zX21hcCA9IGJ1ZmZlciBwb2ludGVyIChjYW4gYmUgTlVMTCkuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX2dldF9mY2FsX3Bvc2l0aW9uX21hcChzY3NpX3FsYV9ob3N0X3QgKmhhLCBjaGFyICpwb3NfbWFwKQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKwljaGFyICpwbWFwOworCWRtYV9hZGRyX3QgcG1hcF9kbWE7CisKKwlwbWFwID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9BVE9NSUMsICZwbWFwX2RtYSk7CisJaWYgKHBtYXAgID09IE5VTEwpIHsKKwkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiAqKioqIE1lbSBBbGxvYyBGYWlsZWQgKioqKiIsCisJCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJcmV0dXJuIFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOworCX0KKwltZW1zZXQocG1hcCwgMCwgRkNBTF9NQVBfU0laRSk7CisKKwltY3AtPm1iWzBdID0gTUJDX0dFVF9GQ19BTF9QT1NJVElPTl9NQVA7CisJbWNwLT5tYlsyXSA9IE1TVyhwbWFwX2RtYSk7CisJbWNwLT5tYlszXSA9IExTVyhwbWFwX2RtYSk7CisJbWNwLT5tYls2XSA9IE1TVyhNU0QocG1hcF9kbWEpKTsKKwltY3AtPm1iWzddID0gTFNXKE1TRChwbWFwX2RtYSkpOworCW1jcC0+b3V0X21iID0gTUJYXzd8TUJYXzZ8TUJYXzN8TUJYXzJ8TUJYXzA7CisJbWNwLT5pbl9tYiA9IE1CWF8xfE1CWF8wOworCW1jcC0+YnVmX3NpemUgPSBGQ0FMX01BUF9TSVpFOworCW1jcC0+ZmxhZ3MgPSBNQlhfRE1BX0lOOworCW1jcC0+dG92ID0gKGhhLT5sb2dpbl90aW1lb3V0ICogMikgKyAoaGEtPmxvZ2luX3RpbWVvdXQgLyAyKTsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKwlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogKG1iMD0leC9tYjE9JXgpIEZDL0FMIFBvc2l0aW9uIE1hcCAiCisJCSAgICAic2l6ZSAoJXgpXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIG1jcC0+bWJbMF0sCisJCSAgICBtY3AtPm1iWzFdLCAodW5zaWduZWQpcG1hcFswXSkpOworCQlERUJVRzExKHFsYTJ4MDBfZHVtcF9idWZmZXIocG1hcCwgcG1hcFswXSArIDEpKTsKKworCQlpZiAocG9zX21hcCkKKwkJCW1lbWNweShwb3NfbWFwLCBwbWFwLCBGQ0FMX01BUF9TSVpFKTsKKwl9CisJZG1hX3Bvb2xfZnJlZShoYS0+c19kbWFfcG9vbCwgcG1hcCwgcG1hcF9kbWEpOworCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXguXG4iLCBfX2Z1bmNfXywKKwkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7CisJfSBlbHNlIHsKKwkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTg2M2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKQEAgLTAsMCArMSw0NDU2IEBACisvKgorICogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyAqCisgKiBRTG9naWMgSVNQMngwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAyLjYueAorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUUxvZ2ljIENvcnBvcmF0aW9uCisgKiAod3d3LnFsb2dpYy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2luY2x1ZGUgInFsYV9kZWYuaCIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oPgorCisvKgorICogRHJpdmVyIHZlcnNpb24KKyAqLworY2hhciBxbGEyeDAwX3ZlcnNpb25fc3RyWzQwXTsKKworLyoKKyAqIFNSQiBhbGxvY2F0aW9uIGNhY2hlCisgKi8KK2NoYXIgc3JiX2NhY2hlcF9uYW1lWzE2XTsKK2ttZW1fY2FjaGVfdCAqc3JiX2NhY2hlcDsKKworLyoKKyAqIFN0YXRzIGZvciBhbGwgYWRwYXRlcnMuCisgKi8KK3N0cnVjdCBfcWxhMngwMHN0YXRzIHFsYTJ4MDBfc3RhdHM7CisKKy8qCisgKiBJb2N0bCByZWxhdGVkIGluZm9ybWF0aW9uLgorICovCitpbnQgbnVtX2hvc3RzOworaW50IGFwaUhCQUluc3RhbmNlOworCisvKgorICogTW9kdWxlIHBhcmFtZXRlciBpbmZvcm1hdGlvbiBhbmQgdmFyaWFibGVzCisgKi8KK2ludCBxbDJ4bWF4cWRlcHRoOworbW9kdWxlX3BhcmFtKHFsMnhtYXhxZGVwdGgsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MocWwyeG1heHFkZXB0aCwKKwkJIk1heGltdW0gcXVldWUgZGVwdGggdG8gcmVwb3J0IGZvciB0YXJnZXQgZGV2aWNlcy4iKTsKKworaW50IHFsMnhsb2dpbnRpbWVvdXQgPSAyMDsKK21vZHVsZV9wYXJhbShxbDJ4bG9naW50aW1lb3V0LCBpbnQsIFNfSVJVR098U19JUlVTUik7CitNT0RVTEVfUEFSTV9ERVNDKHFsMnhsb2dpbnRpbWVvdXQsCisJCSJMb2dpbiB0aW1lb3V0IHZhbHVlIGluIHNlY29uZHMuIik7CisKK2ludCBxbHBvcnRfZG93bl9yZXRyeTsKK21vZHVsZV9wYXJhbShxbHBvcnRfZG93bl9yZXRyeSwgaW50LCBTX0lSVUdPfFNfSVJVU1IpOworTU9EVUxFX1BBUk1fREVTQyhxbHBvcnRfZG93bl9yZXRyeSwKKwkJIk1heGltdW0gbnVtYmVyIG9mIGNvbW1hbmQgcmV0cmllcyB0byBhIHBvcnQgdGhhdCByZXR1cm5zIgorCQkiYSBQT1JULURPV04gc3RhdHVzLiIpOworCitpbnQgcWwyeHJldHJ5Y291bnQgPSAyMDsKK21vZHVsZV9wYXJhbShxbDJ4cmV0cnljb3VudCwgaW50LCBTX0lSVUdPfFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhxbDJ4cmV0cnljb3VudCwKKwkJIk1heGltdW0gbnVtYmVyIG9mIG1pZC1sYXllciByZXRyaWVzIGFsbG93ZWQgZm9yIGEgY29tbWFuZC4gICIKKwkJIkRlZmF1bHQgdmFsdWUgaXMgMjAsICIpOworCitpbnQgZGlzcGxheUNvbmZpZzsKK21vZHVsZV9wYXJhbShkaXNwbGF5Q29uZmlnLCBpbnQsIFNfSVJVR098U19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRpc3BsYXlDb25maWcsCisJCSJJZiAxIHRoZW4gZGlzcGxheSB0aGUgY29uZmlndXJhdGlvbiB1c2VkIGluIC9ldGMvbW9kcHJvYmUuY29uZi4iKTsKKworaW50IHFsMnhwbG9naWFic2VudGRldmljZTsKK21vZHVsZV9wYXJhbShxbDJ4cGxvZ2lhYnNlbnRkZXZpY2UsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MocWwyeHBsb2dpYWJzZW50ZGV2aWNlLAorCQkiT3B0aW9uIHRvIGVuYWJsZSBQTE9HSSB0byBkZXZpY2VzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGFmdGVyICIKKwkJImEgRmFicmljIHNjYW4uICBUaGlzIGlzIG5lZWRlZCBmb3Igc2V2ZXJhbCBicm9rZW4gc3dpdGNoZXMuIgorCQkiRGVmYXVsdCBpcyAwIC0gbm8gUExPR0kuIDEgLSBwZXJmb20gUExPR0kuIik7CisKK2ludCBxbDJ4ZW5hYmxlemlvID0gMDsKK21vZHVsZV9wYXJhbShxbDJ4ZW5hYmxlemlvLCBpbnQsIFNfSVJVR098U19JUlVTUik7CitNT0RVTEVfUEFSTV9ERVNDKHFsMnhlbmFibGV6aW8sCisJCSJPcHRpb24gdG8gZW5hYmxlIFpJTzpJZiAxIHRoZW4gZW5hYmxlIGl0IG90aGVyd2lzZSIgCisJCSIgdXNlIHRoZSBkZWZhdWx0IHNldCBpbiB0aGUgTlZSQU0uIgorCQkiIERlZmF1bHQgaXMgMCA6IGRpc2FibGVkIik7CisKK2ludCBxbDJ4aW50cmRlbGF5dGltZXIgPSAxMDsKK21vZHVsZV9wYXJhbShxbDJ4aW50cmRlbGF5dGltZXIsIGludCwgU19JUlVHT3xTX0lSVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MocWwyeGludHJkZWxheXRpbWVyLAorCQkiWklPOiBXYWl0aW5nIHRpbWUgZm9yIEZpcm13YXJlIGJlZm9yZSBpdCBnZW5lcmF0ZXMgYW4gIgorCQkiaW50ZXJydXB0IHRvIHRoZSBob3N0IHRvIG5vdGlmeSBjb21wbGV0aW9uIG9mIHJlcXVlc3QuIik7CisKK2ludCBDb25maWdSZXF1aXJlZDsKK21vZHVsZV9wYXJhbShDb25maWdSZXF1aXJlZCwgaW50LCBTX0lSVUdPfFNfSVJVU1IpOworTU9EVUxFX1BBUk1fREVTQyhDb25maWdSZXF1aXJlZCwKKwkJIklmIDEsIHRoZW4gb25seSBjb25maWd1cmVkIGRldmljZXMgcGFzc2VkIGluIHRocm91Z2ggdGhlIgorCQkicWwyeG9wdHMgcGFyYW1ldGVyIHdpbGwgYmUgcHJlc2VudGVkIHRvIHRoZSBPUyIpOworCitpbnQgQmluZCA9IEJJTkRfQllfUE9SVF9OQU1FOworbW9kdWxlX3BhcmFtKEJpbmQsIGludCwgU19JUlVHT3xTX0lSVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoQmluZCwKKwkJIlRhcmdldCBwZXJzaXN0ZW50IGJpbmRpbmcgbWV0aG9kOiAiCisJCSIwIGJ5IFBvcnRuYW1lIChkZWZhdWx0KTsgMSBieSBQb3J0SUQ7IDIgYnkgTm9kZW5hbWUuICIpOworCitpbnQgcWwyeHN1c3BlbmRjb3VudCA9IFNVU1BFTkRfQ09VTlQ7Cittb2R1bGVfcGFyYW0ocWwyeHN1c3BlbmRjb3VudCwgaW50LCBTX0lSVUdPfFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhxbDJ4c3VzcGVuZGNvdW50LAorCQkiTnVtYmVyIG9mIDYtc2Vjb25kIHN1c3BlbmQgaXRlcmF0aW9ucyB0byBwZXJmb3JtIHdoaWxlIGEgIgorCQkidGFyZ2V0IHJldHVybnMgYSA8Tk9UIFJFQURZPiBzdGF0dXMuICBEZWZhdWx0IGlzIDEwICIKKwkJIml0ZXJhdGlvbnMuIik7CisKK2ludCBxbDJ4ZG9pbml0c2NhbiA9IDE7Cittb2R1bGVfcGFyYW0ocWwyeGRvaW5pdHNjYW4sIGludCwgU19JUlVHT3xTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MocWwyeGRvaW5pdHNjYW4sCisJCSJTaWduYWwgbWlkLWxheWVyIHRvIHBlcmZvcm0gc2NhbiBhZnRlciBkcml2ZXIgbG9hZDogMCAtLSBubyAiCisJCSJzaWduYWwgc2VudCB0byBtaWQtbGF5ZXIuIik7CisKK2ludCBxbDJ4bG9naW5yZXRyeWNvdW50ID0gMDsKK21vZHVsZV9wYXJhbShxbDJ4bG9naW5yZXRyeWNvdW50LCBpbnQsIFNfSVJVR098U19JUlVTUik7CitNT0RVTEVfUEFSTV9ERVNDKHFsMnhsb2dpbnJldHJ5Y291bnQsCisJCSJTcGVjaWZ5IGFuIGFsdGVybmF0ZSB2YWx1ZSBmb3IgdGhlIE5WUkFNIGxvZ2luIHJldHJ5IGNvdW50LiIpOworCisvKgorICogUHJvYyBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMKKyAqLworc3RydWN0IGluZm9fc3RyIHsKKwljaGFyCSpidWZmZXI7CisJaW50CWxlbmd0aDsKKwlvZmZfdAlvZmZzZXQ7CisJaW50CXBvczsKK307CisKK3N0YXRpYyB2b2lkIGNvcHlfbWVtX2luZm8oc3RydWN0IGluZm9fc3RyICosIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgY29weV9pbmZvKHN0cnVjdCBpbmZvX3N0ciAqLCBjaGFyICosIC4uLik7CisKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfZnJlZV9kZXZpY2Uoc2NzaV9xbGFfaG9zdF90ICopOworCitzdGF0aWMgdm9pZCBxbGEyeDAwX2NvbmZpZ19kbWFfYWRkcmVzc2luZyhzY3NpX3FsYV9ob3N0X3QgKmhhKTsKKworLyoKKyAqIFNDU0kgaG9zdCB0ZW1wbGF0ZSBlbnRyeSBwb2ludHMgCisgKi8KK3N0YXRpYyBpbnQgcWxhMnh4eF9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICogZGV2aWNlKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQl2b2lkICgqZm4pKHN0cnVjdCBzY3NpX2NtbmQgKikpOworc3RhdGljIGludCBxbGEyeHh4X2VoX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgaW50IHFsYTJ4eHhfZWhfZGV2aWNlX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgaW50IHFsYTJ4eHhfZWhfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgaW50IHFsYTJ4eHhfZWhfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIGludCBxbGEyeDAwX2xvb3BfcmVzZXQoc2NzaV9xbGFfaG9zdF90ICpoYSk7CitzdGF0aWMgaW50IHFsYTJ4MDBfZGV2aWNlX3Jlc2V0KHNjc2lfcWxhX2hvc3RfdCAqLCBmY19wb3J0X3QgKik7CisKK3N0YXRpYyBpbnQgcWxhMngwMF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqLCBjaGFyICosIGNoYXIgKiosCisgICAgb2ZmX3QsIGludCwgaW50KTsKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgcWxhMngwMF9kcml2ZXJfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9ICJxbGEyeHh4IiwKKwkucHJvY19uYW1lCQk9ICJxbGEyeHh4IiwKKwkucHJvY19pbmZvCQk9IHFsYTJ4MDBfcHJvY19pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gcWxhMngwMF9xdWV1ZWNvbW1hbmQsCisKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IHFsYTJ4eHhfZWhfYWJvcnQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gcWxhMnh4eF9laF9kZXZpY2VfcmVzZXQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gcWxhMnh4eF9laF9idXNfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IHFsYTJ4eHhfZWhfaG9zdF9yZXNldCwKKworCS5zbGF2ZV9jb25maWd1cmUJPSBxbGEyeHh4X3NsYXZlX2NvbmZpZ3VyZSwKKworCS50aGlzX2lkCQk9IC0xLAorCS5jbWRfcGVyX2x1bgkJPSAzLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKworCS8qCisJICogVGhlIFJJU0MgYWxsb3dzIGZvciBlYWNoIGNvbW1hbmQgdG8gdHJhbnNmZXIgKDJeMzItMSkgYnl0ZXMgb2YgZGF0YSwKKwkgKiB3aGljaCBlcXVhdGVzIHRvIDB4ODAwMDAwIHNlY3RvcnMuCisJICovCisJLm1heF9zZWN0b3JzCQk9IDB4RkZGRiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKnFsYTJ4eHhfdHJhbnNwb3J0X3RlbXBsYXRlID0gTlVMTDsKKworc3RhdGljIHZvaWQgcWxhMngwMF9kaXNwbGF5X2ZjX25hbWVzKHNjc2lfcWxhX2hvc3RfdCAqKTsKKworLyogVE9ETyBDb252ZXJ0IHRvIGlubGluZXMKKyAqCisgKiBUaW1lciByb3V0aW5lcworICovCisjZGVmaW5lCVdBVENIX0lOVEVSVkFMCQkxICAgICAgIC8qIG51bWJlciBvZiBzZWNvbmRzICovCisKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfdGltZXIoc2NzaV9xbGFfaG9zdF90ICopOworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHFsYTJ4MDBfc3RhcnRfdGltZXIoc2NzaV9xbGFfaG9zdF90ICosCisgICAgdm9pZCAqLCB1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcWxhMngwMF9yZXN0YXJ0X3RpbWVyKHNjc2lfcWxhX2hvc3RfdCAqLCB1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcWxhMngwMF9zdG9wX3RpbWVyKHNjc2lfcWxhX2hvc3RfdCAqKTsKKworc3RhdGljIGlubGluZSB2b2lkCitxbGEyeDAwX3N0YXJ0X3RpbWVyKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHZvaWQgKmZ1bmMsIHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwpCit7CisJaW5pdF90aW1lcigmaGEtPnRpbWVyKTsKKwloYS0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBpbnRlcnZhbCAqIEhaOworCWhhLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaGE7CisJaGEtPnRpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKWZ1bmM7CisJYWRkX3RpbWVyKCZoYS0+dGltZXIpOworCWhhLT50aW1lcl9hY3RpdmUgPSAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTJ4MDBfcmVzdGFydF90aW1lcihzY3NpX3FsYV9ob3N0X3QgKmhhLCB1bnNpZ25lZCBsb25nIGludGVydmFsKQoreworCW1vZF90aW1lcigmaGEtPnRpbWVyLCBqaWZmaWVzICsgaW50ZXJ2YWwgKiBIWik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK3FsYTJ4MDBfc3RvcF90aW1lcihzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWRlbF90aW1lcl9zeW5jKCZoYS0+dGltZXIpOworCWhhLT50aW1lcl9hY3RpdmUgPSAwOworfQorCit2b2lkIHFsYTJ4MDBfY21kX3RpbWVvdXQoc3JiX3QgKik7CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcWxhMngwMF9jYWxsYmFjayhzY3NpX3FsYV9ob3N0X3QgKiwgc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc3BfcHV0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsIHNyYl90ICpzcCk7CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNwX2dldChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLCBzcmJfdCAqc3ApOworc3RhdGljIF9faW5saW5lX18gdm9pZAorcWxhMngwMF9kZWxldGVfZnJvbV9kb25lX3F1ZXVlKHNjc2lfcWxhX2hvc3RfdCAqLCBzcmJfdCAqKTsgCisKKy8qCisqIHFsYTJ4MDBfY2FsbGJhY2sKKyogICAgICBSZXR1cm5zIHRoZSBjb21wbGV0ZWQgU0NTSSBjb21tYW5kIHRvIExJTlVYLgorKgorKiBJbnB1dDoKKyoJaGEgLS0gSG9zdCBhZGFwdGVyIHN0cnVjdHVyZQorKgljbWQgLS0gU0NTSSBtaWQtbGV2ZWwgY29tbWFuZCBzdHJ1Y3R1cmUuCisqIFJldHVybnM6CisqICAgICAgTm9uZQorKiBOb3RlOkZyb20gZmFpbG92ZXIgcG9pbnQgb2YgdmlldyB3ZSBhbHdheXMgZ2V0IHRoZSBzcAorKiAgICAgIGZyb20gdmlzX2hhIHBvb2wgaW4gcXVldWVjb21tYW5kLlNvIHdoZW4gd2UgcHV0IGl0IAorKiAgICAgIGJhY2sgdG8gdGhlIHBvb2wgaXQgaGFzIHRvIGJlIHRoZSB2aXNfaGEuCSAKKyogICAgICBTbyByZWx5IG9uIHN0cnVjdCBzY3NpX2NtbmQgdG8gZ2V0IHRoZSB2aXNfaGEgYW5kIG5vdCBvbiBzcC4gCQkgCQorKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMngwMF9jYWxsYmFjayhzY3NpX3FsYV9ob3N0X3QgKmhhLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3JiX3QgKnNwID0gKHNyYl90ICopIENNRF9TUChjbWQpOworCXNjc2lfcWxhX2hvc3RfdCAqdmlzX2hhOworCW9zX2x1bl90ICpscTsKKwlpbnQgZ290X3NlbnNlOworCXVuc2lnbmVkIGxvbmcJY3B1X2ZsYWdzID0gMDsKKworCWNtZC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopIE5VTEw7CisJdmlzX2hhID0gKHNjc2lfcWxhX2hvc3RfdCAqKSBjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlpZiAoc3AgPT0gTlVMTCkgeworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkiJXMoKTogKioqKiBDTUQgZGVyaXZlcyBhIE5VTEwgU1BcbiIsCisJCQlfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgREVCVUcyKEJVRygpOykKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSWYgY29tbWFuZCBzdGF0dXMgaXMgbm90IERJRF9CVVNfQlVTWSB0aGVuIGdvIGFoZWFkIGFuZCBmcmVlZCBzcC4KKwkgKi8KKwkvKgorCSAqIENhbmNlbCBjb21tYW5kIHRpbWVvdXQKKwkgKi8KKwlxbGEyeDAwX2RlbGV0ZV90aW1lcl9mcm9tX2NtZChzcCk7CisKKwkvKgorCSAqIFB1dCBTUCBiYWNrIGluIHRoZSBmcmVlIHF1ZXVlCisJICovCisJc3AtPmNtZCAgID0gTlVMTDsKKwlDTURfU1AoY21kKSA9IE5VTEw7CisJbHEgPSBzcC0+bHVuX3F1ZXVlOworCWdvdF9zZW5zZSA9IChzcC0+ZmxhZ3MgJiBTUkJfR09UX1NFTlNFKT8gMTogMDsKKwlhZGRfdG9fZnJlZV9xdWV1ZSh2aXNfaGEsIHNwKTsKKworCWlmIChob3N0X2J5dGUoY21kLT5yZXN1bHQpID09IERJRF9PSykgeworCQkvKiBkZXZpY2Ugb2sgKi8KKwkJaGEtPnRvdGFsX2J5dGVzICs9IGNtZC0+YnVmZmxlbjsKKwkJaWYgKCFnb3Rfc2Vuc2UpIHsKKwkJCS8qIElmIGx1biB3YXMgc3VzcGVuZGVkIHRoZW4gY2xlYXIgcmV0cnkgY291bnQgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZscS0+cV9sb2NrLCBjcHVfZmxhZ3MpOworCQkJaWYgKCF0ZXN0X2JpdChMVU5fRVhFQ19ERUxBWUVELCAmbHEtPnFfZmxhZykpCisJCQkJbHEtPnFfc3RhdGUgPSBMVU5fU1RBVEVfUkVBRFk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscS0+cV9sb2NrLCBjcHVfZmxhZ3MpOworCQl9CisJfSBlbHNlIGlmIChob3N0X2J5dGUoY21kLT5yZXN1bHQpID09IERJRF9FUlJPUikgeworCQkvKiBkZXZpY2UgZXJyb3IgKi8KKwkJaGEtPnRvdGFsX2Rldl9lcnJzKys7CisJfQorCisJLyogQ2FsbCB0aGUgbWlkLWxldmVsIGRyaXZlciBpbnRlcnJ1cHQgaGFuZGxlciAqLworCSgqKGNtZCktPnNjc2lfZG9uZSkoY21kKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHNwX3B1dAorKgorKiBEZXNjcmlwdGlvbjoKKyogICBEZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IGFuZCBjYWxsIHRoZSBjYWxsYmFjayBpZiB3ZSdyZSB0aGUgbGFzdAorKiAgIG93bmVyIG9mIHRoZSBzcGVjaWZpZWQgc3AuIFdpbGwgZ2V0IHRoZSBob3N0X2xvY2sgYmVmb3JlIGNhbGxpbmcKKyogICB0aGUgY2FsbGJhY2suCisqCisqIElucHV0OgorKiAgIGhhIC0gcG9pbnRlciB0byB0aGUgc2NzaV9xbGFfaG9zdF90IHdoZXJlIHRoZSBjYWxsYmFjayBpcyB0byBvY2N1ci4KKyogICBzcCAtIHBvaW50ZXIgdG8gc3JiX3Qgc3RydWN0dXJlIHRvIHVzZS4KKyoKKyogUmV0dXJuczoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkCitzcF9wdXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwgc3JiX3QgKnNwKQoreworICAgICAgICBpZiAoYXRvbWljX3JlYWQoJnNwLT5yZWZfY291bnQpID09IDApIHsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJIiVzKCk6ICoqKiogU1AtPnJlZl9jb3VudCBub3QgemVyb1xuIiwKKwkJCV9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICBERUJVRzIoQlVHKCk7KQorCisgICAgICAgICAgICAgICAgcmV0dXJuOworCX0KKworICAgICAgICBpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJnNwLT5yZWZfY291bnQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcWxhMngwMF9jYWxsYmFjayhoYSwgc3AtPmNtZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBzcF9nZXQKKyoKKyogRGVzY3JpcHRpb246CisqICAgSW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgc3BlY2lmaWVkIHNwLgorKgorKiBJbnB1dDoKKyogICBzcCAtIHBvaW50ZXIgdG8gc3JiX3Qgc3RydWN0dXJlIHRvIHVzZS4KKyoKKyogUmV0dXJuczoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkCitzcF9nZXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwgc3JiX3QgKnNwKQoreworICAgICAgICBhdG9taWNfaW5jKCZzcC0+cmVmX2NvdW50KTsKKworICAgICAgICBpZiAoYXRvbWljX3JlYWQoJnNwLT5yZWZfY291bnQpID4gMikgeworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkiJXMoKTogKioqKiBTUC0+cmVmX2NvdW50IGdyZWF0ZXIgdGhhbiB0d29cbiIsCisJCQlfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgREVCVUcyKEJVRygpOykKKworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgCitxbGEyeDAwX2RlbGV0ZV9mcm9tX2RvbmVfcXVldWUoc2NzaV9xbGFfaG9zdF90ICpkZXN0X2hhLCBzcmJfdCAqc3ApIAoreworCS8qIHJlbW92ZSBjb21tYW5kIGZyb20gZG9uZSBsaXN0ICovCisJbGlzdF9kZWxfaW5pdCgmc3AtPmxpc3QpOworCWRlc3RfaGEtPmRvbmVfcV9jbnQtLTsKKwlzcC0+c3RhdGUgPSBTUkJfTk9fUVVFVUVfU1RBVEU7CisKKwlpZiAoc3AtPmZsYWdzICYgU1JCX0RNQV9WQUxJRCkgeworCQlzcC0+ZmxhZ3MgJj0gflNSQl9ETUFfVkFMSUQ7CisKKwkJLyogUmVsZWFzZSBtZW1vcnkgdXNlZCBmb3IgdGhpcyBJL08gKi8KKwkJaWYgKHNwLT5jbWQtPnVzZV9zZykgeworCQkJcGNpX3VubWFwX3NnKGRlc3RfaGEtPnBkZXYsIHNwLT5jbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJICAgIHNwLT5jbWQtPnVzZV9zZywgc3AtPmNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQl9IGVsc2UgaWYgKHNwLT5jbWQtPnJlcXVlc3RfYnVmZmxlbikgeworCQkJcGNpX3VubWFwX3BhZ2UoZGVzdF9oYS0+cGRldiwgc3AtPmRtYV9oYW5kbGUsCisJCQkgICAgc3AtPmNtZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJICAgIHNwLT5jbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBxbGEyeDAwX2RvX2RwYyh2b2lkICpkYXRhKTsKKworc3RhdGljIHZvaWQgcWxhMngwMF9yc3RfYWVuKHNjc2lfcWxhX2hvc3RfdCAqKTsKKworc3RhdGljIHVpbnQ4X3QgcWxhMngwMF9tZW1fYWxsb2Moc2NzaV9xbGFfaG9zdF90ICopOworc3RhdGljIHZvaWQgcWxhMngwMF9tZW1fZnJlZShzY3NpX3FsYV9ob3N0X3QgKmhhKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9hbGxvY2F0ZV9zcF9wb29sKCBzY3NpX3FsYV9ob3N0X3QgKmhhKTsKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfZnJlZV9zcF9wb29sKHNjc2lfcWxhX2hvc3RfdCAqaGEpOworc3RhdGljIHNyYl90ICpxbGEyeDAwX2dldF9uZXdfc3Aoc2NzaV9xbGFfaG9zdF90ICpoYSk7CisKK3N0YXRpYyBzc2l6ZV90IHFsYTJ4MDBfc3lzZnNfcmVhZF9md19kdW1wKHN0cnVjdCBrb2JqZWN0ICosIGNoYXIgKiwgbG9mZl90LAorICAgIHNpemVfdCk7CitzdGF0aWMgc3NpemVfdCBxbGEyeDAwX3N5c2ZzX3dyaXRlX2Z3X2R1bXAoc3RydWN0IGtvYmplY3QgKiwgY2hhciAqLCBsb2ZmX3QsCisgICAgc2l6ZV90KTsKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBzeXNmc19md19kdW1wX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0gImZ3X2R1bXAiLAorCQkubW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5zaXplID0gMCwKKwkucmVhZCA9IHFsYTJ4MDBfc3lzZnNfcmVhZF9md19kdW1wLAorCS53cml0ZSA9IHFsYTJ4MDBfc3lzZnNfd3JpdGVfZndfZHVtcCwKK307CitzdGF0aWMgc3NpemVfdCBxbGEyeDAwX3N5c2ZzX3JlYWRfbnZyYW0oc3RydWN0IGtvYmplY3QgKiwgY2hhciAqLCBsb2ZmX3QsCisgICAgc2l6ZV90KTsKK3N0YXRpYyBzc2l6ZV90IHFsYTJ4MDBfc3lzZnNfd3JpdGVfbnZyYW0oc3RydWN0IGtvYmplY3QgKiwgY2hhciAqLCBsb2ZmX3QsCisgICAgc2l6ZV90KTsKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBzeXNmc19udnJhbV9hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9ICJudnJhbSIsCisJCS5tb2RlID0gU19JUlVTUiB8IFNfSVdVU1IsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnNpemUgPSBzaXplb2YobnZyYW1fdCksCisJLnJlYWQgPSBxbGEyeDAwX3N5c2ZzX3JlYWRfbnZyYW0sCisJLndyaXRlID0gcWxhMngwMF9zeXNmc193cml0ZV9udnJhbSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogU3lzRlMgYXR0cmlidXRlcy4gKi8KK3N0YXRpYyBzc2l6ZV90IHFsYTJ4MDBfc3lzZnNfcmVhZF9md19kdW1wKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsCisgICAgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHRvX3FsYV9ob3N0KGRldl90b19zaG9zdChjb250YWluZXJfb2Yoa29iaiwKKwkgICAgc3RydWN0IGRldmljZSwga29iaikpKTsKKworCWlmIChoYS0+ZndfZHVtcF9yZWFkaW5nID09IDApCisJCXJldHVybiAwOworCWlmIChvZmYgPiBoYS0+ZndfZHVtcF9idWZmZXJfbGVuKQorCQlyZXR1cm4gMDsKKwlpZiAob2ZmICsgY291bnQgPiBoYS0+ZndfZHVtcF9idWZmZXJfbGVuKQorCQljb3VudCA9IGhhLT5md19kdW1wX2J1ZmZlcl9sZW4gLSBvZmY7CisKKwltZW1jcHkoYnVmLCAmaGEtPmZ3X2R1bXBfYnVmZmVyW29mZl0sIGNvdW50KTsKKworCXJldHVybiAoY291bnQpOworfQorCitzdGF0aWMgc3NpemVfdCBxbGEyeDAwX3N5c2ZzX3dyaXRlX2Z3X2R1bXAoc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZiwKKyAgICBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gdG9fcWxhX2hvc3QoZGV2X3RvX3Nob3N0KGNvbnRhaW5lcl9vZihrb2JqLAorCSAgICBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSkpOworCWludCByZWFkaW5nOworCXVpbnQzMl90IGR1bXBfc2l6ZTsKKworCWlmIChvZmYgIT0gMCkKKwkJcmV0dXJuICgwKTsKKworCXJlYWRpbmcgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCXN3aXRjaCAocmVhZGluZykgeworCWNhc2UgMDoKKwkJaWYgKGhhLT5md19kdW1wX3JlYWRpbmcgPT0gMSkgeworCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJICAgICJGaXJtd2FyZSBkdW1wIGNsZWFyZWQgb24gKCVsZCkuXG4iLAorCQkJICAgIGhhLT5ob3N0X25vKTsKKworCQkJdmZyZWUoaGEtPmZ3X2R1bXBfYnVmZmVyKTsKKwkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaGEtPmZ3X2R1bXAsCisJCQkgICAgaGEtPmZ3X2R1bXBfb3JkZXIpOworCisJCQloYS0+ZndfZHVtcF9yZWFkaW5nID0gMDsKKwkJCWhhLT5md19kdW1wX2J1ZmZlciA9IE5VTEw7CisJCQloYS0+ZndfZHVtcCA9IE5VTEw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpZiAoaGEtPmZ3X2R1bXAgIT0gTlVMTCAmJiAhaGEtPmZ3X2R1bXBfcmVhZGluZykgeworCQkJaGEtPmZ3X2R1bXBfcmVhZGluZyA9IDE7CisKKwkJCWR1bXBfc2l6ZSA9IEZXX0RVTVBfU0laRV8xTTsKKwkJCWlmIChoYS0+ZndfbWVtb3J5X3NpemUgPCAweDIwMDAwKSAKKwkJCQlkdW1wX3NpemUgPSBGV19EVU1QX1NJWkVfMTI4SzsKKwkJCWVsc2UgaWYgKGhhLT5md19tZW1vcnlfc2l6ZSA8IDB4ODAwMDApIAorCQkJCWR1bXBfc2l6ZSA9IEZXX0RVTVBfU0laRV81MTJLOworCQkJaGEtPmZ3X2R1bXBfYnVmZmVyID0gKGNoYXIgKil2bWFsbG9jKGR1bXBfc2l6ZSk7CisJCQlpZiAoaGEtPmZ3X2R1bXBfYnVmZmVyID09IE5VTEwpIHsKKwkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBmaXJtd2FyZSAiCisJCQkJICAgICJkdW1wIGJ1ZmZlciAoJWQpLlxuIiwgZHVtcF9zaXplKTsKKworCQkJCWhhLT5md19kdW1wX3JlYWRpbmcgPSAwOworCQkJCXJldHVybiAoY291bnQpOworCQkJfQorCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJICAgICJGaXJtd2FyZSBkdW1wIHJlYWR5IGZvciByZWFkIG9uICglbGQpLlxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubyk7CisJCQltZW1zZXQoaGEtPmZ3X2R1bXBfYnVmZmVyLCAwLCBkdW1wX3NpemUpOworCQkJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKQorIAkJCQlxbGEyMTAwX2FzY2lpX2Z3X2R1bXAoaGEpOworIAkJCWVsc2UKKyAJCQkJcWxhMjMwMF9hc2NpaV9md19kdW1wKGhhKTsKKwkJCWhhLT5md19kdW1wX2J1ZmZlcl9sZW4gPSBzdHJsZW4oaGEtPmZ3X2R1bXBfYnVmZmVyKTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIChjb3VudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHFsYTJ4MDBfc3lzZnNfcmVhZF9udnJhbShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLAorICAgIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSB0b19xbGFfaG9zdChkZXZfdG9fc2hvc3QoY29udGFpbmVyX29mKGtvYmosCisJICAgIHN0cnVjdCBkZXZpY2UsIGtvYmopKSk7CisJdWludDE2X3QJKndpdGVyOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdWludDE2X3QJY250OworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8IG9mZiAhPSAwIHx8IGNvdW50ICE9IHNpemVvZihudnJhbV90KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBSZWFkIE5WUkFNLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCXFsYTJ4MDBfbG9ja19udnJhbV9hY2Nlc3MoaGEpOworIAl3aXRlciA9ICh1aW50MTZfdCAqKWJ1ZjsKKyAJZm9yIChjbnQgPSAwOyBjbnQgPCBjb3VudCAvIDI7IGNudCsrKSB7CisJCSp3aXRlciA9IGNwdV90b19sZTE2KHFsYTJ4MDBfZ2V0X252cmFtX3dvcmQoaGEsCisJCSAgICBjbnQraGEtPm52cmFtX2Jhc2UpKTsKKwkJd2l0ZXIrKzsKKyAJfQorCXFsYTJ4MDBfdW5sb2NrX252cmFtX2FjY2VzcyhoYSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAoY291bnQpOworfQorCitzdGF0aWMgc3NpemVfdCBxbGEyeDAwX3N5c2ZzX3dyaXRlX252cmFtKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsCisgICAgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHRvX3FsYV9ob3N0KGRldl90b19zaG9zdChjb250YWluZXJfb2Yoa29iaiwKKwkgICAgc3RydWN0IGRldmljZSwga29iaikpKTsKKwl1aW50OF90CQkqaXRlcjsKKwl1aW50MTZfdAkqd2l0ZXI7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl1aW50MTZfdAljbnQ7CisJdWludDhfdAkJY2hrc3VtOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8IG9mZiAhPSAwIHx8IGNvdW50ICE9IHNpemVvZihudnJhbV90KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBDaGVja3N1bSBOVlJBTS4gKi8KKwlpdGVyID0gKHVpbnQ4X3QgKilidWY7CisJY2hrc3VtID0gMDsKKwlmb3IgKGNudCA9IDA7IGNudCA8IGNvdW50IC0gMTsgY250KyspCisJCWNoa3N1bSArPSAqaXRlcisrOworCWNoa3N1bSA9IH5jaGtzdW0gKyAxOworCSppdGVyID0gY2hrc3VtOworCisJLyogV3JpdGUgTlZSQU0uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJcWxhMngwMF9sb2NrX252cmFtX2FjY2VzcyhoYSk7CisJcWxhMngwMF9yZWxlYXNlX252cmFtX3Byb3RlY3Rpb24oaGEpOworIAl3aXRlciA9ICh1aW50MTZfdCAqKWJ1ZjsKKwlmb3IgKGNudCA9IDA7IGNudCA8IGNvdW50IC8gMjsgY250KyspIHsKKwkJcWxhMngwMF93cml0ZV9udnJhbV93b3JkKGhhLCBjbnQraGEtPm52cmFtX2Jhc2UsCisJCSAgICBjcHVfdG9fbGUxNigqd2l0ZXIpKTsKKwkJd2l0ZXIrKzsKKwl9CisJcWxhMngwMF91bmxvY2tfbnZyYW1fYWNjZXNzKGhhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIChjb3VudCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY2hhciAqCitxbGEyeDAwX2dldF9wY2lfaW5mb19zdHIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBjaGFyICpzdHIpCit7CisJc3RhdGljIGNoYXIgKnBjaV9idXNfbW9kZXNbXSA9IHsKKwkJIjMzIiwgIjY2IiwgIjEwMCIsICIxMzMiLAorCX07CisJdWludDE2X3QgcGNpX2J1czsKKworCXN0cmNweShzdHIsICJQQ0kiKTsKKwlwY2lfYnVzID0gKGhhLT5wY2lfYXR0ciAmIChCSVRfOSB8IEJJVF8xMCkpID4+IDk7CisJaWYgKHBjaV9idXMpIHsKKwkJc3RyY2F0KHN0ciwgIi1YICgiKTsKKwkJc3RyY2F0KHN0ciwgcGNpX2J1c19tb2Rlc1twY2lfYnVzXSk7CisJfSBlbHNlIHsKKwkJcGNpX2J1cyA9IChoYS0+cGNpX2F0dHIgJiBCSVRfOCkgPj4gODsKKwkJc3RyY2F0KHN0ciwgIiAoIik7CisJCXN0cmNhdChzdHIsIHBjaV9idXNfbW9kZXNbcGNpX2J1c10pOworCX0KKwlzdHJjYXQoc3RyLCAiIE1IeikiKTsKKworCXJldHVybiAoc3RyKTsKK30KKworY2hhciAqCitxbGEyeDAwX2dldF9md192ZXJzaW9uX3N0cihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGNoYXIgKnN0cikKK3sKKwljaGFyIHVuX3N0clsxMF07CisJCisJc3ByaW50ZihzdHIsICIlZC4lMDJkLiUwMmQgIiwgaGEtPmZ3X21ham9yX3ZlcnNpb24sCisJICAgIGhhLT5md19taW5vcl92ZXJzaW9uLAorCSAgICBoYS0+Zndfc3VibWlub3JfdmVyc2lvbik7CisKKwlpZiAoaGEtPmZ3X2F0dHJpYnV0ZXMgJiBCSVRfOSkgeworCQlzdHJjYXQoc3RyLCAiRkxYIik7CisJCXJldHVybiAoc3RyKTsKKwl9CisKKwlzd2l0Y2ggKGhhLT5md19hdHRyaWJ1dGVzICYgMHhGRikgeworCWNhc2UgMHg3OgorCQlzdHJjYXQoc3RyLCAiRUYiKTsKKwkJYnJlYWs7CisJY2FzZSAweDE3OgorCQlzdHJjYXQoc3RyLCAiVFAiKTsKKwkJYnJlYWs7CisJY2FzZSAweDM3OgorCQlzdHJjYXQoc3RyLCAiSVAiKTsKKwkJYnJlYWs7CisJY2FzZSAweDc3OgorCQlzdHJjYXQoc3RyLCAiVkkiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3ByaW50Zih1bl9zdHIsICIoJXgpIiwgaGEtPmZ3X2F0dHJpYnV0ZXMpOworCQlzdHJjYXQoc3RyLCB1bl9zdHIpOworCQlicmVhazsKKwl9CisJaWYgKGhhLT5md19hdHRyaWJ1dGVzICYgMHgxMDApCisJCXN0cmNhdChzdHIsICJYIik7CisKKwlyZXR1cm4gKHN0cik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBxbGEyeDAwX3F1ZXVlY29tbWFuZAorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgIFF1ZXVlIGEgY29tbWFuZCB0byB0aGUgY29udHJvbGxlci4KKyoKKyogSW5wdXQ6CisqICAgICBjbWQgLSBwb2ludGVyIHRvIFNjc2kgY21kIHN0cnVjdHVyZQorKiAgICAgZm4gLSBwb2ludGVyIHRvIFNjc2kgZG9uZSBmdW5jdGlvbgorKgorKiBSZXR1cm5zOgorKiAgIDAgLSBBbHdheXMKKyoKKyogTm90ZToKKyogVGhlIG1pZC1sZXZlbCBkcml2ZXIgdHJpZXMgdG8gZW5zdXJlcyB0aGF0IHF1ZXVlY29tbWFuZCBuZXZlciBnZXRzIGludm9rZWQKKyogY29uY3VycmVudGx5IHdpdGggaXRzZWxmIG9yIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAoYWx0aG91Z2ggdGhlCisqIGludGVycnVwdCBoYW5kbGVyIG1heSBjYWxsIHRoaXMgcm91dGluZSBhcyBwYXJ0IG9mIHJlcXVlc3QtY29tcGxldGlvbgorKiBoYW5kbGluZykuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdm9pZCAoKmZuKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCWZjX3BvcnRfdAkqZmNwb3J0OworCW9zX2x1bl90CSpscTsKKwlvc190Z3RfdAkqdHE7CisJc2NzaV9xbGFfaG9zdF90CSpoYSwgKmhhMjsKKwlzcmJfdAkJKnNwOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJdW5zaWduZWQgaW50CWIsIHQsIGw7CisJdW5zaWduZWQgbG9uZwloYW5kbGU7CisJaW50CQl3YXNfZW1wdHk7CisKKworCWhvc3QgPSBjbWQtPmRldmljZS0+aG9zdDsKKwloYSA9IChzY3NpX3FsYV9ob3N0X3QgKikgaG9zdC0+aG9zdGRhdGE7CisJd2FzX2VtcHR5ID0gMTsKKworCWNtZC0+c2NzaV9kb25lID0gZm47CisKKwlzcGluX3VubG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisKKwkvKgorCSAqIEFsbG9jYXRlIGEgY29tbWFuZCBwYWNrZXQgZnJvbSB0aGUgInNwIiBwb29sLiAgSWYgd2UgY2FudCBnZXQgYmFjaworCSAqIG9uZSB0aGVuIGxldCBzY3NpIGxheWVyIGNvbWUgYmFjayBsYXRlci4KKwkgKi8KKwlpZiAoKHNwID0gcWxhMngwMF9nZXRfbmV3X3NwKGhhKSkgPT0gTlVMTCkgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBzcCAtIHJldHJpZWQuXG4iKTsKKworCQlzcGluX2xvY2tfaXJxKGhhLT5ob3N0LT5ob3N0X2xvY2spOworCisJCXJldHVybiAoMSk7CisJfQorCisJc3AtPmNtZCA9IGNtZDsKKwlDTURfU1AoY21kKSA9ICh2b2lkICopc3A7CisKKwlzcC0+ZmxhZ3MgPSAwOworCWlmIChDTURfUkVTSURfTEVOKGNtZCkgJiBTUkJfSU9DVEwpIHsKKwkJLyogTmVlZCB0byBzZXQgc3AtPmZsYWdzICovCisJCXNwLT5mbGFncyB8PSBTUkJfSU9DVEw7CisJCUNNRF9SRVNJRF9MRU4oY21kKSA9IDA7IC8qIENsZWFyIGl0IHNpbmNlIG5vIG1vcmUgdXNlLiAqLworCX0KKworCXNwLT5mb19yZXRyeV9jbnQgPSAwOworCXNwLT5lcnJfaWQgPSAwOworCisJLyogR2VuZXJhdGUgTFUgcXVldWUgb24gYnVzLCB0YXJnZXQsIExVTiAqLworCWIgPSBjbWQtPmRldmljZS0+Y2hhbm5lbDsKKwl0ID0gY21kLT5kZXZpY2UtPmlkOworCWwgPSBjbWQtPmRldmljZS0+bHVuOworCisJLyoKKwkgKiBTdGFydCBDb21tYW5kIFRpbWVyLiBUeXBpY2FsbHkgaXQgd2lsbCBiZSAyIHNlY29uZHMgbGVzcyB0aGFuIHdoYXQKKwkgKiBpcyByZXF1ZXN0ZWQgYnkgdGhlIEhvc3Qgc3VjaCB0aGF0IHdlIGNhbiByZXR1cm4gdGhlIElPIGJlZm9yZQorCSAqIGFib3J0cyBhcmUgY2FsbGVkLgorCSAqLworCWlmICgoY21kLT50aW1lb3V0X3Blcl9jb21tYW5kIC8gSFopID4gUUxBX0NNRF9USU1FUl9ERUxUQSkKKwkJcWxhMngwMF9hZGRfdGltZXJfdG9fY21kKHNwLAorCQkgICAgKGNtZC0+dGltZW91dF9wZXJfY29tbWFuZCAvIEhaKSAtIFFMQV9DTURfVElNRVJfREVMVEEpOworCWVsc2UKKwkJcWxhMngwMF9hZGRfdGltZXJfdG9fY21kKHNwLCBjbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQgLyBIWik7CisKKwlpZiAobCA+PSBoYS0+bWF4X2x1bnMpIHsKKwkJY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJc3AtPmVycl9pZCA9IFNSQl9FUlJfUE9SVDsKKworCQlzcGluX2xvY2tfaXJxKGhhLT5ob3N0LT5ob3N0X2xvY2spOworCisJCXNwX3B1dChoYSwgc3ApOworCisJCXJldHVybiAoMCk7CisJfQorCisJaWYgKCh0cSA9IChvc190Z3RfdCAqKSBUR1RfUShoYSwgdCkpICE9IE5VTEwgJiYKKwkgICAgKGxxID0gKG9zX2x1bl90ICopIExVTl9RKGhhLCB0LCBsKSkgIT0gTlVMTCkgeworCQlmY3BvcnQgPSBscS0+ZmNsdW4tPmZjcG9ydDsKKwkJaGEyID0gZmNwb3J0LT5oYTsKKwl9IGVsc2UgeworCQlscSA9IE5VTEw7CisJCWZjcG9ydCA9IE5VTEw7CisJCWhhMiA9IGhhOworCX0KKworCS8qIFNldCBhbiBpbnZhbGlkIGhhbmRsZSB1bnRpbCB3ZSBpc3N1ZSB0aGUgY29tbWFuZCB0byBJU1AgKi8KKwkvKiB0aGVuIHdlIHdpbGwgc2V0IHRoZSByZWFsIGhhbmRsZSB2YWx1ZS4gICAgICAgICAgICAgICAgICovCisJaGFuZGxlID0gSU5WQUxJRF9IQU5ETEU7CisJY21kLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKiloYW5kbGU7CisKKwkvKiBCb29ra2VlcGluZyBpbmZvcm1hdGlvbiAqLworCXNwLT5yX3N0YXJ0ID0gamlmZmllczsJCS8qIFRpbWUgdGhlIHJlcXVlc3Qgd2FzIHJlY2lldmVkLiAqLworCXNwLT51X3N0YXJ0ID0gMDsKKworCS8qIFNldHVwIGRldmljZSBxdWV1ZSBwb2ludGVycy4gKi8KKwlzcC0+dGd0X3F1ZXVlID0gdHE7CisJc3AtPmx1bl9xdWV1ZSA9IGxxOworCisJLyoKKwkgKiBOT1RFIDogcSBpcyBOVUxMCisJICoKKwkgKiAxLiBXaGVuIGRldmljZSBpcyBhZGRlZCBmcm9tIHBlcnNpc3RlbnQgYmluZGluZyBidXQgaGFzIG5vdCBiZWVuCisJICogICAgZGlzY292ZXJlZCB5ZXQuVGhlIHN0YXRlIG9mIGxvb3BpZCA9PSBQT1JUX0FWQUlMLgorCSAqIDIuIFdoZW4gZGV2aWNlIGlzIG5ldmVyIGZvdW5kIG9uIHRoZSBidXMuKGxvb3BpZCA9PSBVTlVTRUQpCisJICoKKwkgKiBJRiBEZXZpY2UgUXVldWUgaXMgbm90IGNyZWF0ZWQsIG9yIGRldmljZSBpcyBub3QgaW4gYSB2YWxpZCBzdGF0ZQorCSAqIGFuZCBsaW5rIGRvd24gZXJyb3IgcmVwb3J0aW5nIGlzIGVuYWJsZWQsIHJlamVjdCBJTy4KKwkgKi8KKwlpZiAoZmNwb3J0ID09IE5VTEwpIHsKKwkJREVCVUczKHByaW50aygic2NzaSglbGQ6JTJkOiUyZCk6IHBvcnQgdW5hdmFpbGFibGVcbiIsCisJCSAgICBoYS0+aG9zdF9ubyx0LGwpKTsKKworCQljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQlzcC0+ZXJyX2lkID0gU1JCX0VSUl9QT1JUOworCisJCXNwaW5fbG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisKKwkJc3BfcHV0KGhhLCBzcCk7CisKKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKiBPbmx5IG1vZGlmeSB0aGUgYWxsb3dlZCBjb3VudCBpZiB0aGUgdGFyZ2V0IGlzIGEgKm5vbiogdGFwZSBkZXZpY2UgKi8KKwlpZiAoKGZjcG9ydC0+ZmxhZ3MgJiBGQ0ZfVEFQRV9QUkVTRU5UKSA9PSAwKSB7CisJCXNwLT5mbGFncyAmPSB+U1JCX1RBUEU7CisJCWlmIChjbWQtPmFsbG93ZWQgPCBxbDJ4cmV0cnljb3VudCkgeworCQkJY21kLT5hbGxvd2VkID0gcWwyeHJldHJ5Y291bnQ7CisJCX0KKwl9IGVsc2UKKwkJc3AtPmZsYWdzIHw9IFNSQl9UQVBFOworCisJREVCVUc1KHByaW50aygic2NzaSglbGQ6JTJkOiUyZCk6IChxdWV1ZWNtZCkgcXVldWUgc3AgPSAlcCwgIgorCSAgICAiZmxhZ3M9MHgleCBmbyByZXRyeT0lZCwgcGlkPSVsZFxuIiwKKwkgICAgaGEtPmhvc3Rfbm8sIHQsIGwsIHNwLCBzcC0+ZmxhZ3MsIHNwLT5mb19yZXRyeV9jbnQsCisJICAgIGNtZC0+c2VyaWFsX251bWJlcikpOworCURFQlVHNShxbGEyeDAwX3ByaW50X3Njc2lfY21kKGNtZCkpOworCisJc3AtPmZjbHVuID0gbHEtPmZjbHVuOworCXNwLT5oYSA9IGhhMjsKKworCWlmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9CSURJUkVDVElPTkFMICYmCisJICAgIGNtZC0+cmVxdWVzdF9idWZmbGVuICE9IDApIHsKKworCQlERUJVRzIocHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgInNjc2koJWxkKTogSW5jb3JyZWN0IGRhdGEgZGlyZWN0aW9uIC0gdHJhbnNmZXIgIgorCQkgICAgImxlbmd0aD0lZCwgZGlyZWN0aW9uPSVkLCBwaWQ9JWxkLCBvcGNvZGU9JXhcbiIsCisJCSAgICBoYS0+aG9zdF9ubywgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24sCisJCSAgICBjbWQtPnNlcmlhbF9udW1iZXIsIGNtZC0+Y21uZFswXSkpOworCX0KKworCS8qIEZpbmFsIHByZS1jaGVjayA6CisJICoKKwkgKglFaXRoZXIgUE9SVF9ET1dOX1RJTUVSIE9SIExJTktfRE9XTl9USU1FUiBFeHBpcmVkLgorCSAqLworCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgPT0gRkNTX0RFVklDRV9ERUFEIHx8CisJICAgIGF0b21pY19yZWFkKCZoYTItPmxvb3Bfc3RhdGUpID09IExPT1BfREVBRCkgeworCQkvKgorCQkgKiBBZGQgdGhlIGNvbW1hbmQgdG8gdGhlIGRvbmUtcXVldWUgZm9yIGxhdGVyIGZhaWxvdmVyCisJCSAqIHByb2Nlc3NpbmcuCisJCSAqLworCQljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQlpZiAoYXRvbWljX3JlYWQoJmhhMi0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ET1dOKSAKKwkJCXNwLT5lcnJfaWQgPSBTUkJfRVJSX0xPT1A7CisJCWVsc2UKKwkJCXNwLT5lcnJfaWQgPSBTUkJfRVJSX1BPUlQ7CisKKwkJYWRkX3RvX2RvbmVfcXVldWUoaGEsIHNwKTsKKwkJcWxhMngwMF9kb25lKGhhKTsKKworCQlzcGluX2xvY2tfaXJxKGhhLT5ob3N0LT5ob3N0X2xvY2spOworCQlyZXR1cm4gKDApOworCX0KKworCWlmICh0cSAmJiB0ZXN0X2JpdChUUUZfU1VTUEVOREVELCAmdHEtPmZsYWdzKSAmJgorCSAgICAoc3AtPmZsYWdzICYgU1JCX1RBUEUpID09IDApIHsKKwkJLyogSWYgdGFyZ2V0IHN1c3BlbmRlZCBwdXQgaW5jb21pbmcgSS9PIGluIHJldHJ5X3EuICovCisJCXFsYTJ4MDBfZXh0ZW5kX3RpbWVvdXQoc3AtPmNtZCwgMTApOworCQlhZGRfdG9fc2NzaV9yZXRyeV9xdWV1ZShoYSwgc3ApOworCX0gZWxzZQorCQl3YXNfZW1wdHkgPSBhZGRfdG9fcGVuZGluZ19xdWV1ZShoYSwgc3ApOworCisJaWYgKChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkgJiYgaGEtPmZsYWdzLm9ubGluZSkgeworCQlpZiAoaGEtPnJlc3BvbnNlX3JpbmdfcHRyLT5zaWduYXR1cmUgIT0gUkVTUE9OU0VfUFJPQ0VTU0VEKSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsJCisJCQlxbGEyeDAwX3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoaGEpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwkJfQorCX0KKworCS8qIFdlIHN1Ym1pdCB0byB0aGUgaGFyZHdhcmUgaWY6CisJICoKKwkgKgkxKSB3ZSdyZSBvbiB0aGUgY3B1IHRoZSBpcnEncyBhcnJpdmUgb24gb3IKKwkgKgkyKSB0aGVyZSBhcmUgdmVyeSBmZXcgaW8ncyBvdXRzdGFuZGluZy4KKwkgKgorCSAqIEluIGFsbCBvdGhlciBjYXNlcyB3ZSdsbCBsZXQgYW4gaXJxIHBpY2sgdXAgb3VyIElPIGFuZCBzdWJtaXQgaXQKKwkgKiB0byB0aGUgY29udHJvbGxlciB0byBpbXByb3ZlIGFmZmluaXR5LgorCSAqLworCWlmIChfc21wX3Byb2Nlc3Nvcl9pZCgpID09IGhhLT5sYXN0X2lycV9jcHUgfHwgd2FzX2VtcHR5KQorCQlxbGEyeDAwX25leHQoaGEpOworCisJc3Bpbl9sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBxbGEyeDAwX2VoX3dhaXRfb25fY29tbWFuZAorICogICAgV2FpdHMgZm9yIHRoZSBjb21tYW5kIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBGaXJtd2FyZSBmb3Igc29tZQorICogICAgbWF4IHRpbWUuCisgKgorICogSW5wdXQ6CisgKiAgICBoYSA9IGFjdHVhbCBoYSB3aG9zZSBkb25lIHF1ZXVlIHdpbGwgY29udGFpbiB0aGUgY29tbWFuZAorICoJICAgICAgcmV0dXJuZWQgYnkgZmlybXdhcmUuCisgKiAgICBjbWQgPSBTY3NpIENvbW1hbmQgdG8gd2FpdCBvbi4KKyAqICAgIGZsYWcgPSBBYm9ydC9SZXNldChCdXMgb3IgRGV2aWNlIFJlc2V0KQorICoKKyAqIFJldHVybjoKKyAqICAgIE5vdCBGb3VuZCA6IDAKKyAqICAgIEZvdW5kIDogMQorICovCitzdGF0aWMgaW50CitxbGEyeDAwX2VoX3dhaXRfb25fY29tbWFuZChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisjZGVmaW5lIEFCT1JUX1BPTExJTkdfUEVSSU9ECUhaCisjZGVmaW5lIEFCT1JUX1dBSVRfVElNRQkJKCgxMCAqIEhaKSAvIChBQk9SVF9QT0xMSU5HX1BFUklPRCkpCisKKwlpbnQJCWZvdW5kID0gMDsKKwlpbnQJCWRvbmUgPSAwOworCXNyYl90CQkqcnAgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsICp0ZW1wOworCXVfbG9uZwkJbWF4X3dhaXRfdGltZSA9IEFCT1JUX1dBSVRfVElNRTsKKworCWRvIHsKKwkJLyogQ2hlY2sgb24gZG9uZSBxdWV1ZSAqLworCQlzcGluX2xvY2soJmhhLT5saXN0X2xvY2spOworCQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgdGVtcCwgJmhhLT5kb25lX3F1ZXVlKSB7CisJCQlycCA9IGxpc3RfZW50cnkobGlzdCwgc3JiX3QsIGxpc3QpOworCisJCQkvKgorCQkJICogRm91bmQgY29tbWFuZC4gSnVzdCBleGl0IGFuZCB3YWl0IGZvciB0aGUgY21kIHNlbnQKKwkJCSAqIHRvIE9TLgorCQkJKi8KKwkJCWlmIChjbWQgPT0gcnAtPmNtZCkgeworCQkJCWZvdW5kKys7CisJCQkJREVCVUczKHByaW50aygiJXM6IGZvdW5kIGluIGRvbmUgcXVldWUuXG4iLAorCQkJCSAgICBfX2Z1bmNfXyk7KQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrKCZoYS0+bGlzdF9sb2NrKTsKKworCQkvKiBDb21wbGV0ZSB0aGUgY21kIHJpZ2h0IGF3YXkuICovCisJCWlmIChmb3VuZCkgeyAKKwkJCXFsYTJ4MDBfZGVsZXRlX2Zyb21fZG9uZV9xdWV1ZShoYSwgcnApOworCQkJc3BfcHV0KGhhLCBycCk7CisJCQlkb25lKys7CisJCQlicmVhazsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoQUJPUlRfUE9MTElOR19QRVJJT0QpOworCisJCXNwaW5fbG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisKKwl9IHdoaWxlICgobWF4X3dhaXRfdGltZS0tKSk7CisKKwlpZiAoZG9uZSkKKwkJREVCVUcyKHByaW50ayhLRVJOX0lORk8gIiVzOiBmb3VuZCBjbWQ9JXAuXG4iLCBfX2Z1bmNfXywgY21kKSk7CisKKwlyZXR1cm4gKGRvbmUpOworfQorCisvKgorICogcWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lCisgKiAgICBXYWl0IHRpbGwgdGhlIEhCQSBpcyBvbmxpbmUgYWZ0ZXIgZ29pbmcgdGhyb3VnaCAKKyAqICAgIDw9IE1BWF9SRVRSSUVTX09GX0lTUF9BQk9SVCAgb3IKKyAqICAgIGZpbmFsbHkgSEJBIGlzIGRpc2FibGVkIGllIG1hcmtlZCBvZmZsaW5lCisgKgorICogSW5wdXQ6CisgKiAgICAgaGEgLSBwb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIAorICogTm90ZTogICAgCisgKiAgICBEb2VzIGNvbnRleHQgc3dpdGNoaW5nLVJlbGVhc2UgU1BJTl9MT0NLCisgKiAgICAoaWYgYW55KSBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCisgKgorICogUmV0dXJuOgorICogICAgU3VjY2VzcyAoQWRhcHRlciBpcyBvbmxpbmUpIDogMAorICogICAgRmFpbGVkICAoQWRhcHRlciBpcyBvZmZsaW5lL2Rpc2FibGVkKSA6IDEKKyAqLworc3RhdGljIGludCAKK3FsYTJ4MDBfd2FpdF9mb3JfaGJhX29ubGluZShzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludCAJIHJldHVybl9zdGF0dXM7CisJdW5zaWduZWQgbG9uZyB3YWl0X29ubGluZTsKKworCXdhaXRfb25saW5lID0gamlmZmllcyArIChNQVhfTE9PUF9USU1FT1VUICogSFopOyAKKwl3aGlsZSAoKCh0ZXN0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncykpIHx8CisJICAgIHRlc3RfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKSB8fAorCSAgICB0ZXN0X2JpdChJU1BfQUJPUlRfUkVUUlksICZoYS0+ZHBjX2ZsYWdzKSB8fAorCSAgICBoYS0+ZHBjX2FjdGl2ZSkgJiYgdGltZV9iZWZvcmUoamlmZmllcywgd2FpdF9vbmxpbmUpKSB7CisKKwkJbXNsZWVwKDEwMDApOworCX0KKwlpZiAoaGEtPmZsYWdzLm9ubGluZSkgCisJCXJldHVybl9zdGF0dXMgPSBRTEFfU1VDQ0VTUzsgCisJZWxzZQorCQlyZXR1cm5fc3RhdHVzID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKworCURFQlVHMihwcmludGsoIiVzIHJldHVybl9zdGF0dXM9JWRcbiIsX19mdW5jX18scmV0dXJuX3N0YXR1cykpOworCisJcmV0dXJuIChyZXR1cm5fc3RhdHVzKTsKK30KKworLyoKKyAqIHFsYTJ4MDBfd2FpdF9mb3JfbG9vcF9yZWFkeQorICogICAgV2FpdCBmb3IgTUFYX0xPT1BfVElNRU9VVCg1IG1pbikgdmFsdWUgZm9yIGxvb3AKKyAqICAgIHRvIGJlIGluIExPT1BfUkVBRFkgc3RhdGUuCSAKKyAqIElucHV0OgorICogICAgIGhhIC0gcG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlCisgKiAKKyAqIE5vdGU6ICAgIAorICogICAgRG9lcyBjb250ZXh0IHN3aXRjaGluZy1SZWxlYXNlIFNQSU5fTE9DSworICogICAgKGlmIGFueSkgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgorICogICAgCisgKgorICogUmV0dXJuOgorICogICAgU3VjY2VzcyAoTE9PUF9SRUFEWSkgOiAwCisgKiAgICBGYWlsZWQgIChMT09QX05PVF9SRUFEWSkgOiAxCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IAorcWxhMngwMF93YWl0X2Zvcl9sb29wX3JlYWR5KHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50IAkgcmV0dXJuX3N0YXR1cyA9IFFMQV9TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgbG9vcF90aW1lb3V0IDsKKworCS8qIHdhaXQgZm9yIDUgbWluIGF0IHRoZSBtYXggZm9yIGxvb3AgdG8gYmUgcmVhZHkgKi8KKwlsb29wX3RpbWVvdXQgPSBqaWZmaWVzICsgKE1BWF9MT09QX1RJTUVPVVQgKiBIWik7IAorCisJd2hpbGUgKCghYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpICYmCisJICAgIGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ET1dOKSB8fAorCSAgICB0ZXN0X2JpdChDRkdfQUNUSVZFLCAmaGEtPmNmZ19mbGFncykgfHwKKwkgICAgYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX1JFQURZKSB7CisJCW1zbGVlcCgxMDAwKTsKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgbG9vcF90aW1lb3V0KSkgeworCQkJcmV0dXJuX3N0YXR1cyA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gKHJldHVybl9zdGF0dXMpOwkKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHFsYTJ4eHhfZWhfYWJvcnQKKyoKKyogRGVzY3JpcHRpb246CisqICAgIFRoZSBhYm9ydCBmdW5jdGlvbiB3aWxsIGFib3J0IHRoZSBzcGVjaWZpZWQgY29tbWFuZC4KKyoKKyogSW5wdXQ6CisqICAgIGNtZCA9IExpbnV4IFNDU0kgY29tbWFuZCBwYWNrZXQgdG8gYmUgYWJvcnRlZC4KKyoKKyogUmV0dXJuczoKKyogICAgRWl0aGVyIFNVQ0NFU1Mgb3IgRkFJTEVELgorKgorKiBOb3RlOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK3FsYTJ4eHhfZWhfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCWludAkJaTsKKwlpbnQJCXJldHVybl9zdGF0dXMgPSBGQUlMRUQ7CisJb3NfbHVuX3QJKnE7CisJc2NzaV9xbGFfaG9zdF90ICpoYTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZpc19oYTsKKwlzcmJfdAkJKnNwOworCXNyYl90CQkqcnA7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgKnRlbXA7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwl1aW50OF90CQlmb3VuZCA9IDA7CisJdW5zaWduZWQgaW50CWIsIHQsIGw7CisKKwkvKiBHZXQgdGhlIFNDU0kgcmVxdWVzdCBwdHIgKi8KKwlzcCA9IChzcmJfdCAqKSBDTURfU1AoY21kKTsKKworCS8qCisJICogSWYgc3AgaXMgTlVMTCwgY29tbWFuZCBpcyBhbHJlYWR5IHJldHVybmVkLgorCSAqIHNwIGlzIE5VTExFRCBqdXN0IGJlZm9yZSB3ZSBjYWxsIGJhY2sgc2NzaV9kb25lCisJICoKKwkgKi8KKwlpZiAoKHNwID09IE5VTEwpKSB7CisJCS8qIG5vIGFjdGlvbiAtIHdlIGRvbid0IGhhdmUgY29tbWFuZCAqLworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgdG9fcWxhX2hvc3QoY21kLT5kZXZpY2UtPmhvc3QpLAorCQkgICAgInFsYTJ4eHhfZWhfYWJvcnQ6IGNtZCBhbHJlYWR5IGRvbmUgc3A9JXBcbiIsIHNwKTsKKwkJREVCVUcocHJpbnRrKCJxbGEyeHh4X2VoX2Fib3J0OiBjbWQgYWxyZWFkeSBkb25lIHNwPSVwXG4iLCBzcCk7KQorCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisJaWYgKHNwKSB7CisJCURFQlVHKHByaW50aygicWxhMnh4eF9laF9hYm9ydDogcmVmY291bnQgJWkgXG4iLAorCQkgICAgYXRvbWljX3JlYWQoJnNwLT5yZWZfY291bnQpKTspCisJfQorCisJdmlzX2hhID0gKHNjc2lfcWxhX2hvc3RfdCAqKSBjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJaGEgPSAoc2NzaV9xbGFfaG9zdF90ICopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJaG9zdCA9IGhhLT5ob3N0OworCisJLyogR2VuZXJhdGUgTFUgcXVldWUgb24gYnVzLCB0YXJnZXQsIExVTiAqLworCWIgPSBjbWQtPmRldmljZS0+Y2hhbm5lbDsKKwl0ID0gY21kLT5kZXZpY2UtPmlkOworCWwgPSBjbWQtPmRldmljZS0+bHVuOworCXEgPSBHRVRfTFVfUSh2aXNfaGEsIHQsIGwpOworCisJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAKKwkgICAgIiVzIHNjc2koJWxkOiVkOiVkOiVkKTogY21kX3RpbWVvdXRfaW5fc2VjPTB4JXguXG4iLCBfX2Z1bmNfXywKKwkgICAgaGEtPmhvc3Rfbm8sIChpbnQpYiwgKGludCl0LCAoaW50KWwsCisJICAgIGNtZC0+dGltZW91dF9wZXJfY29tbWFuZCAvIEhaKTsKKworCS8qCisJICogaWYgbm8gTFVOIHF1ZXVlIHRoZW4gc29tZXRoaW5nIGlzIHZlcnkgd3JvbmchISEKKwkgKi8KKwlpZiAocSA9PSBOVUxMKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCSJxbGEyeDAwOiAoJXg6JXg6JXgpIE5vIExVTiBxdWV1ZS5cbiIsIGIsIHQsIGwpOworCisJCS8qIG5vIGFjdGlvbiAtIHdlIGRvbid0IGhhdmUgY29tbWFuZCAqLworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQUJPUlRpbmcgY21kPSVwIHNwPSVwIGppZmZpZXMgPSAweCVseCwgIgorCSAgICAidGltZW91dD0leCwgZHBjX2ZsYWdzPSVseCwgdmlzX2hhLT5kcGNfZmxhZ3M9JWx4IHEtPmZsYWc9JWx4XG4iLAorCSAgICBoYS0+aG9zdF9ubywgY21kLCBzcCwgamlmZmllcywgY21kLT50aW1lb3V0X3Blcl9jb21tYW5kIC8gSFosCisJICAgIGhhLT5kcGNfZmxhZ3MsIHZpc19oYS0+ZHBjX2ZsYWdzLCBxLT5xX2ZsYWcpKTsKKwlERUJVRzIocWxhMngwMF9wcmludF9zY3NpX2NtZChjbWQpKTsKKworCXNwaW5fdW5sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKKwlpZiAocWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKGhhKSAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocHJpbnRrKCIlcyBmYWlsZWQ6Ym9hcmQgZGlzYWJsZWRcbiIsIF9fZnVuY19fKTspCisJCXNwaW5fbG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCXNwaW5fbG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisKKwkvKiBTZWFyY2ggZG9uZSBxdWV1ZSAqLworCXNwaW5fbG9jaygmaGEtPmxpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3QsIHRlbXAsICZoYS0+ZG9uZV9xdWV1ZSkgeworCQlycCA9IGxpc3RfZW50cnkobGlzdCwgc3JiX3QsIGxpc3QpOworCisJCWlmIChjbWQgIT0gcnAtPmNtZCkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIEZvdW5kIGNvbW1hbmQuUmVtb3ZlIGl0IGZyb20gZG9uZSBsaXN0LgorCQkgKiBBbmQgcHJvY2VlZCB0byBwb3N0IGNvbXBsZXRpb24gdG8gc2NzaSBtaWQgbGF5ZXIuCisJCSAqLworCQlyZXR1cm5fc3RhdHVzID0gU1VDQ0VTUzsKKwkJZm91bmQrKzsKKwkJcWxhMngwMF9kZWxldGVfZnJvbV9kb25lX3F1ZXVlKGhhLCBzcCk7CisKKwkJYnJlYWs7CisJfSAvKiBsaXN0X2Zvcl9lYWNoX3NhZmUoKSAqLworCXNwaW5fdW5sb2NrKCZoYS0+bGlzdF9sb2NrKTsKKworCS8qCisJICogUmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZSBhYm9ydGVkIGNvbW1hbmQgd2FzIGFscmVhZHkgaW4gdGhlIGRvbmUKKwkgKiBxdWV1ZQorCSAqLworCWlmIChmb3VuZCkgeworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCSAgICAicWxhMnh4eF9laF9hYm9ydDogUmV0dXJuaW5nIGNvbXBsZXRlZCBjb21tYW5kPSVwIHNwPSVwXG4iLAorCQkgICAgY21kLCBzcCk7CisJCXNwX3B1dChoYSwgc3ApOworCQlyZXR1cm4gKHJldHVybl9zdGF0dXMpOworCX0KKwkKKworCS8qCisJICogU2VlIGlmIHRoaXMgY29tbWFuZCBpcyBpbiB0aGUgcmV0cnkgcXVldWUKKwkgKi8KKwlERUJVRzMocHJpbnRrKCJxbGEyeHh4X2VoX2Fib3J0OiBzZWFyY2hpbmcgc3AgJXAgaW4gcmV0cnkgIgorCQkgICAgInF1ZXVlLlxuIiwgc3ApOykKKworCXNwaW5fbG9jaygmaGEtPmxpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3QsIHRlbXAsICZoYS0+cmV0cnlfcXVldWUpIHsKKwkJcnAgPSBsaXN0X2VudHJ5KGxpc3QsIHNyYl90LCBsaXN0KTsKKworCQlpZiAoY21kICE9IHJwLT5jbWQpCisJCQljb250aW51ZTsKKworCisJCURFQlVHMihwcmludGsoInFsYTJ4eHhfZWhfYWJvcnQ6IGZvdW5kICIKKwkJICAgICJpbiByZXRyeSBxdWV1ZS4gU1A9JXBcbiIsIHNwKTspCisKKwkJX19kZWxfZnJvbV9yZXRyeV9xdWV1ZShoYSwgcnApOworCQljbWQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKwkJX19hZGRfdG9fZG9uZV9xdWV1ZShoYSwgcnApOworCisJCXJldHVybl9zdGF0dXMgPSBTVUNDRVNTOworCQlmb3VuZCsrOworCisJCWJyZWFrOworCisJfSAKKwlzcGluX3VubG9jaygmaGEtPmxpc3RfbG9jayk7CisKKworCS8qCisJICogT3VyIFNQIHBvaW50ZXIgcG9pbnRzIGF0IHRoZSBjb21tYW5kIHdlIHdhbnQgdG8gcmVtb3ZlIGZyb20gdGhlCisJICogcGVuZGluZyBxdWV1ZSBwcm92aWRpbmcgd2UgaGF2ZW4ndCBhbHJlYWR5IHNlbnQgaXQgdG8gdGhlIGFkYXB0ZXIuCisJICovCisJaWYgKCFmb3VuZCkgeworCQlERUJVRzMocHJpbnRrKCJxbGEyeHh4X2VoX2Fib3J0OiBzZWFyY2hpbmcgc3AgJXAgIgorCQkgICAgImluIHBlbmRpbmcgcXVldWUuXG4iLCBzcCk7KQorCisJCXNwaW5fbG9jaygmdmlzX2hhLT5saXN0X2xvY2spOworCQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgdGVtcCwgJnZpc19oYS0+cGVuZGluZ19xdWV1ZSkgeworCQkJcnAgPSBsaXN0X2VudHJ5KGxpc3QsIHNyYl90LCBsaXN0KTsKKworCQkJaWYgKHJwLT5jbWQgIT0gY21kKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBSZW1vdmUgc3JiIGZyb20gTFVOIHF1ZXVlLiAqLworCQkJcnAtPmZsYWdzIHw9ICBTUkJfQUJPUlRFRDsKKworCQkJREVCVUcyKHByaW50aygicWxhMnh4eF9laF9hYm9ydDogQ21kIGluIHBlbmRpbmcgcXVldWUuIgorCQkJICAgICIgc2VyaWFsX251bWJlciAlbGQuXG4iLAorCQkJICAgIHNwLT5jbWQtPnNlcmlhbF9udW1iZXIpOykKKworCQkJX19kZWxfZnJvbV9wZW5kaW5nX3F1ZXVlKHZpc19oYSwgcnApOworCQkJY21kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisKKwkJCV9fYWRkX3RvX2RvbmVfcXVldWUodmlzX2hhLCBycCk7CisKKwkJCXJldHVybl9zdGF0dXMgPSBTVUNDRVNTOworCisJCQlmb3VuZCsrOworCQkJYnJlYWs7CisJCX0gLyogbGlzdF9mb3JfZWFjaF9zYWZlKCkgKi8KKwkJc3Bpbl91bmxvY2soJnZpc19oYS0+bGlzdF9sb2NrKTsKKwl9IC8qRW5kIG9mIGlmICFmb3VuZCAqLworCisJaWYgKCFmb3VuZCkgeyAgLyogZmluZCB0aGUgY29tbWFuZCBpbiBvdXIgYWN0aXZlIGxpc3QgKi8KKwkJREVCVUczKHByaW50aygicWxhMnh4eF9laF9hYm9ydDogc2VhcmNoaW5nIHNwICVwICIKKwkJICAgICJpbiBvdXRzdGFuZGluZyBxdWV1ZS5cbiIsIHNwKTspCisKKwkJc3Bpbl9sb2NrKCZoYS0+aGFyZHdhcmVfbG9jayk7CisJCWZvciAoaSA9IDE7IGkgPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFM7IGkrKykgeworCQkJc3AgPSBoYS0+b3V0c3RhbmRpbmdfY21kc1tpXTsKKworCQkJaWYgKHNwID09IE5VTEwpCisJCQkJY29udGludWU7CisKKwkJCWlmIChzcC0+Y21kICE9IGNtZCkKKwkJCQljb250aW51ZTsKKworCQkJREVCVUcyKHByaW50aygicWxhMnh4eF9laF9hYm9ydCglbGQpOiBhYm9ydGluZyBzcCAlcCAiCisJCQkgICAgImZyb20gUklTQy4gcGlkPSVsZCBzcC0+c3RhdGU9JXggcS0+cV9mbGFnPSVseFxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgc3AsIHNwLT5jbWQtPnNlcmlhbF9udW1iZXIsCisJCQkgICAgc3AtPnN0YXRlLCBxLT5xX2ZsYWcpOykKKwkJCURFQlVHKHFsYTJ4MDBfcHJpbnRfc2NzaV9jbWQoY21kKTspCisKKwkJCS8qIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgc3AgYW5kIGRyb3AgdGhlIGxvY2suKi8KKwkJCXNwX2dldChoYSwgc3ApOworCisJCQlzcGluX3VubG9jaygmaGEtPmhhcmR3YXJlX2xvY2spOworCQkJc3Bpbl91bmxvY2tfaXJxKGhhLT5ob3N0LT5ob3N0X2xvY2spOworCisJCQlpZiAocWxhMngwMF9hYm9ydF9jb21tYW5kKGhhLCBzcCkpIHsKKwkJCQlERUJVRzIocHJpbnRrKCJxbGEyeHh4X2VoX2Fib3J0OiBhYm9ydF9jb21tYW5kICIKKwkJCQkgICAgIm1ieCBmYWlsZWQuXG4iKTspCisJCQkJcmV0dXJuX3N0YXR1cyA9IEZBSUxFRDsKKwkJCX0gZWxzZSB7CisJCQkJREVCVUczKHByaW50aygicWxhMnh4eF9laF9hYm9ydDogYWJvcnRfY29tbWFuZCAiCisJCQkJICAgICIgbWJ4IHN1Y2Nlc3MuXG4iKTspCisJCQkJcmV0dXJuX3N0YXR1cyA9IFNVQ0NFU1M7CisJCQl9CisKKwkJCXNwX3B1dChoYSxzcCk7CisKKwkJCXNwaW5fbG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisJCQlzcGluX2xvY2soJmhhLT5oYXJkd2FyZV9sb2NrKTsKKworCQkJLyoKKwkJCSAqIFJlZ2FyZGxlc3Mgb2YgbWFpbGJveCBjb21tYW5kIHN0YXR1cywgZ28gY2hlY2sgb24KKwkJCSAqIGRvbmUgcXVldWUganVzdCBpbiBjYXNlIHRoZSBzcCBpcyBhbHJlYWR5IGRvbmUuCisJCQkgKi8KKwkJCWJyZWFrOworCisJCX0vKkVuZCBvZiBmb3IgbG9vcCAqLworCQlzcGluX3VubG9jaygmaGEtPmhhcmR3YXJlX2xvY2spOworCisJfSAvKkVuZCBvZiBpZiAhZm91bmQgKi8KKworCS8qIFdhaXRpbmcgZm9yIG91ciBjb21tYW5kIGluIGRvbmVfcXVldWUgdG8gYmUgcmV0dXJuZWQgdG8gT1MuKi8KKwlpZiAocWxhMngwMF9laF93YWl0X29uX2NvbW1hbmQoaGEsIGNtZCkgIT0gMCkgeworCQlERUJVRzIocHJpbnRrKCJxbGEyeHh4X2VoX2Fib3J0OiBjbWQgcmV0dXJuZWQgYmFjayB0byBPUy5cbiIpOykKKwkJcmV0dXJuX3N0YXR1cyA9IFNVQ0NFU1M7CisJfQorCisJaWYgKHJldHVybl9zdGF0dXMgPT0gRkFJTEVEKSB7CisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgCisJCQkicWxhMnh4eF9laF9hYm9ydCBFeGl0aW5nOiBzdGF0dXM9RmFpbGVkXG4iKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlERUJVRzIocHJpbnRrKCJxbGEyeHh4X2VoX2Fib3J0OiBFeGl0aW5nLiByZXR1cm5fc3RhdHVzPTB4JXguXG4iLAorCSAgICByZXR1cm5fc3RhdHVzKSk7CisKKwlyZXR1cm4gcmV0dXJuX3N0YXR1czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHFsYTJ4MDBfZWhfd2FpdF9mb3JfcGVuZGluZ190YXJnZXRfY29tbWFuZHMKKyoKKyogRGVzY3JpcHRpb246CisqICAgIFdhaXRzIGZvciBhbGwgdGhlIGNvbW1hbmRzIHRvIGNvbWUgYmFjayBmcm9tIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LgorKgorKiBJbnB1dDoKKyogICAgaGEgLSBwb2ludGVyIHRvIHNjc2lfcWxhX2hvc3Qgc3RydWN0dXJlLgorKiAgICB0ICAtIHRhcmdldCAJCisqIFJldHVybnM6CisqICAgIEVpdGhlciBTVUNDRVNTIG9yIEZBSUxFRC4KKyoKKyogTm90ZToKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorcWxhMngwMF9laF93YWl0X2Zvcl9wZW5kaW5nX3RhcmdldF9jb21tYW5kcyhzY3NpX3FsYV9ob3N0X3QgKmhhLCB1bnNpZ25lZCBpbnQgdCkKK3sKKwlpbnQJY250OworCWludAlzdGF0dXM7CisJc3JiX3QJCSpzcDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisKKwlzdGF0dXMgPSAwOworCisJLyoKKwkgKiBXYWl0aW5nIGZvciBhbGwgY29tbWFuZHMgZm9yIHRoZSBkZXNpZ25hdGVkIHRhcmdldCBpbiB0aGUgYWN0aXZlCisJICogYXJyYXkKKwkgKi8KKwlmb3IgKGNudCA9IDE7IGNudCA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgY250KyspIHsKKwkJc3Bpbl9sb2NrKCZoYS0+aGFyZHdhcmVfbG9jayk7CisJCXNwID0gaGEtPm91dHN0YW5kaW5nX2NtZHNbY250XTsKKwkJaWYgKHNwKSB7CisJCQljbWQgPSBzcC0+Y21kOworCQkJc3Bpbl91bmxvY2soJmhhLT5oYXJkd2FyZV9sb2NrKTsKKwkJCWlmIChjbWQtPmRldmljZS0+aWQgPT0gdCkgeworCQkJCWlmICghcWxhMngwMF9laF93YWl0X29uX2NvbW1hbmQoaGEsIGNtZCkpIHsKKwkJCQkJc3RhdHVzID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UgeworCQkJc3Bpbl91bmxvY2soJmhhLT5oYXJkd2FyZV9sb2NrKTsKKwkJfQorCX0KKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHFsYTJ4eHhfZWhfZGV2aWNlX3Jlc2V0CisqCisqIERlc2NyaXB0aW9uOgorKiAgICBUaGUgZGV2aWNlIHJlc2V0IGZ1bmN0aW9uIHdpbGwgcmVzZXQgdGhlIHRhcmdldCBhbmQgYWJvcnQgYW55CisqICAgIGV4ZWN1dGluZyBjb21tYW5kcy4KKyoKKyogICAgTk9URTogVGhlIHVzZSBvZiBTUCBpcyB1bmRlZmluZWQgd2l0aGluIHRoaXMgY29udGV4dC4gIERvICpOT1QqCisqICAgICAgICAgIGF0dGVtcHQgdG8gdXNlIHRoaXMgdmFsdWUsIGV2ZW4gaWYgeW91IGRldGVybWluZSBpdCBpcyAKKyogICAgICAgICAgbm9uLW51bGwuCisqCisqIElucHV0OgorKiAgICBjbWQgPSBMaW51eCBTQ1NJIGNvbW1hbmQgcGFja2V0IG9mIHRoZSBjb21tYW5kIHRoYXQgY2F1c2UgdGhlCisqICAgICAgICAgIGJ1cyBkZXZpY2UgcmVzZXQuCisqCisqIFJldHVybnM6CisqICAgIFNVQ0NFU1MvRkFJTFVSRSAoZGVmaW5lZCBhcyBtYWNybyBpbiBzY3NpLmgpLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK3FsYTJ4eHhfZWhfZGV2aWNlX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlpbnQJCXJldHVybl9zdGF0dXM7CisJdW5zaWduZWQgaW50CWIsIHQsIGw7CisJc2NzaV9xbGFfaG9zdF90CSpoYTsKKwlvc190Z3RfdAkqdHE7CisJb3NfbHVuX3QJKmxxOworCWZjX3BvcnRfdAkqZmNwb3J0X3RvX3Jlc2V0OworCXNyYl90CQkqcnA7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgKnRlbXA7CisKKwlyZXR1cm5fc3RhdHVzID0gRkFJTEVEOworCWlmIChjbWQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAiJXMoKTogKioqKiBTQ1NJIG1pZC1sYXllciBwYXNzaW5nIGluIE5VTEwgY21kXG4iLAorCQkgICAgX19mdW5jX18pOworCisJCXJldHVybiAocmV0dXJuX3N0YXR1cyk7CisJfQorCisJYiA9IGNtZC0+ZGV2aWNlLT5jaGFubmVsOworCXQgPSBjbWQtPmRldmljZS0+aWQ7CisJbCA9IGNtZC0+ZGV2aWNlLT5sdW47CisJaGEgPSAoc2NzaV9xbGFfaG9zdF90ICopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJdHEgPSBUR1RfUShoYSwgdCk7CisJaWYgKHRxID09IE5VTEwpIHsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkgICAgIiVzKCk6ICoqKiogQ01EIGRlcml2ZXMgYSBOVUxMIFRHVF9RXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0dXJuIChyZXR1cm5fc3RhdHVzKTsKKwl9CisJbHEgPSAob3NfbHVuX3QgKilMVU5fUShoYSwgdCwgbCk7CisJaWYgKGxxID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgIiVzKCk6ICoqKiogQ01EIGRlcml2ZXMgYSBOVUxMIExVTl9RXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0dXJuIChyZXR1cm5fc3RhdHVzKTsKKwl9CisJZmNwb3J0X3RvX3Jlc2V0ID0gbHEtPmZjbHVuLT5mY3BvcnQ7CisKKwkvKiBJZiB3ZSBhcmUgY29taW5nIGluIGZyb20gdGhlIGJhY2stZG9vciwgc3RhbGwgSS9PIHVudGlsIGNvbXBsZXRlLiAqLworCWlmICghY21kLT5kZXZpY2UtPmhvc3QtPmVoX2FjdGl2ZSkKKwkJc2V0X2JpdChUUUZfU1VTUEVOREVELCAmdHEtPmZsYWdzKTsKKworCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkgICAgInNjc2koJWxkOiVkOiVkOiVkKTogREVWSUNFIFJFU0VUIElTU1VFRC5cbiIsIGhhLT5ob3N0X25vLCBiLCB0LCBsKTsKKworCURFQlVHMihwcmludGsoS0VSTl9JTkZPCisJICAgICJzY3NpKCVsZCk6IERFVklDRV9SRVNFVCBjbWQ9JXAgamlmZmllcyA9IDB4JWx4LCB0aW1lb3V0PSV4LCAiCisJICAgICJkcGNfZmxhZ3M9JWx4LCBzdGF0dXM9JXggYWxsb3dlZD0lZCBjbWQuc3RhdGU9JXhcbiIsCisJICAgIGhhLT5ob3N0X25vLCBjbWQsIGppZmZpZXMsIGNtZC0+dGltZW91dF9wZXJfY29tbWFuZCAvIEhaLAorCSAgICBoYS0+ZHBjX2ZsYWdzLCBjbWQtPnJlc3VsdCwgY21kLT5hbGxvd2VkLCBjbWQtPnN0YXRlKSk7CisKKyAJLyogQ2xlYXIgY29tbWFuZHMgZnJvbSB0aGUgcmV0cnkgcXVldWUuICovCisgCXNwaW5fbG9jaygmaGEtPmxpc3RfbG9jayk7CisgCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0LCB0ZW1wLCAmaGEtPnJldHJ5X3F1ZXVlKSB7CisgCQlycCA9IGxpc3RfZW50cnkobGlzdCwgc3JiX3QsIGxpc3QpOworIAorIAkJaWYgKHQgIT0gcnAtPmNtZC0+ZGV2aWNlLT5pZCkgCisgCQkJY29udGludWU7CisgCisgCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTworCQkgICAgInFsYTJ4eHhfZWhfcmVzZXQ6IGZvdW5kIGluIHJldHJ5IHF1ZXVlLiBTUD0lcFxuIiwgcnApKTsKKyAKKyAJCV9fZGVsX2Zyb21fcmV0cnlfcXVldWUoaGEsIHJwKTsKKyAJCXJwLT5jbWQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKyAJCV9fYWRkX3RvX2RvbmVfcXVldWUoaGEsIHJwKTsKKyAJfQorIAlzcGluX3VubG9jaygmaGEtPmxpc3RfbG9jayk7CisKKwlzcGluX3VubG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisKKwlpZiAocWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKGhhKSAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTworCQkgICAgIiVzIGZhaWxlZDpib2FyZCBkaXNhYmxlZFxuIixfX2Z1bmNfXykpOworCisJCXNwaW5fbG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisJCWdvdG8gZWhfZGV2X3Jlc2V0X2RvbmU7CisJfQorCisJaWYgKHFsYTJ4MDBfd2FpdF9mb3JfbG9vcF9yZWFkeShoYSkgPT0gUUxBX1NVQ0NFU1MpIHsKKwkJaWYgKHFsYTJ4MDBfZGV2aWNlX3Jlc2V0KGhhLCBmY3BvcnRfdG9fcmVzZXQpID09IDApIHsKKwkJCXJldHVybl9zdGF0dXMgPSBTVUNDRVNTOworCQl9CisKKyNpZiBkZWZpbmVkKExPR09VVF9BRlRFUl9ERVZJQ0VfUkVTRVQpCisJCWlmIChyZXR1cm5fc3RhdHVzID09IFNVQ0NFU1MpIHsKKwkJCWlmIChmY3BvcnRfdG9fcmVzZXQtPmZsYWdzICYgRkNfRkFCUklDX0RFVklDRSkgeworCQkJCXFsYTJ4MDBfZmFicmljX2xvZ291dChoYSwKKwkJCQkgICAgZmNwb3J0X3RvX3Jlc2V0LT5sb29wX2lkKTsKKwkJCQlxbGEyeDAwX21hcmtfZGV2aWNlX2xvc3QoaGEsIGZjcG9ydF90b19yZXNldCk7CisJCQl9CisJCX0KKyNlbmRpZgorCX0gZWxzZSB7CisJCURFQlVHMihwcmludGsoS0VSTl9JTkZPCisJCSAgICAiJXMgZmFpbGVkOiBsb29wIG5vdCByZWFkeVxuIixfX2Z1bmNfXyk7KQorCX0KKworCXNwaW5fbG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisKKwlpZiAocmV0dXJuX3N0YXR1cyA9PSBGQUlMRUQpIHsKKwkJREVCVUczKHByaW50aygiJXMoJWxkKTogZGV2aWNlIHJlc2V0IGZhaWxlZFxuIiwKKwkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogZGV2aWNlIHJlc2V0IGZhaWxlZFxuIiwKKwkJICAgIF9fZnVuY19fKTsKKworCQlnb3RvIGVoX2Rldl9yZXNldF9kb25lOworCX0KKworCS8qCisJICogSWYgd2UgYXJlIGNvbWluZyBkb3duIHRoZSBFSCBwYXRoLCB3YWl0IGZvciBhbGwgY29tbWFuZHMgdG8KKwkgKiBjb21wbGV0ZSBmb3IgdGhlIGRldmljZS4KKwkgKi8KKwlpZiAoY21kLT5kZXZpY2UtPmhvc3QtPmVoX2FjdGl2ZSkgeworCQlpZiAocWxhMngwMF9laF93YWl0X2Zvcl9wZW5kaW5nX3RhcmdldF9jb21tYW5kcyhoYSwgdCkpCisJCQlyZXR1cm5fc3RhdHVzID0gRkFJTEVEOworCisJCWlmIChyZXR1cm5fc3RhdHVzID09IEZBSUxFRCkgeworCQkJREVCVUczKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHdoaWxlIHdhaXRpbmcgZm9yICIKKwkJCSAgICAiY29tbWFuZHNcbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJICAgICIlczogZmFpbGVkIHdoaWxlIHdhaXRpbmcgZm9yIGNvbW1hbmRzXG4iLAorCQkJICAgIF9fZnVuY19fKTsgCisKKwkJCWdvdG8gZWhfZGV2X3Jlc2V0X2RvbmU7CisJCX0KKwl9CisKKwlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJICAgICJzY3NpKCVsZDolZDolZDolZCk6IERFVklDRSBSRVNFVCBTVUNDRUVERUQuXG4iLAorCSAgICBoYS0+aG9zdF9ubywgYiwgdCwgbCk7CisKK2VoX2Rldl9yZXNldF9kb25lOgorCisJaWYgKCFjbWQtPmRldmljZS0+aG9zdC0+ZWhfYWN0aXZlKQorCQljbGVhcl9iaXQoVFFGX1NVU1BFTkRFRCwgJnRxLT5mbGFncyk7CisKKwlyZXR1cm4gKHJldHVybl9zdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcWxhMngwMF9laF93YWl0X2Zvcl9wZW5kaW5nX2NvbW1hbmRzCisqCisqIERlc2NyaXB0aW9uOgorKiAgICBXYWl0cyBmb3IgYWxsIHRoZSBjb21tYW5kcyB0byBjb21lIGJhY2sgZnJvbSB0aGUgc3BlY2lmaWVkIGhvc3QuCisqCisqIElucHV0OgorKiAgICBoYSAtIHBvaW50ZXIgdG8gc2NzaV9xbGFfaG9zdCBzdHJ1Y3R1cmUuCisqCisqIFJldHVybnM6CisqICAgIDEgOiBTVUNDRVNTCisqICAgIDAgOiBGQUlMRUQKKyoKKyogTm90ZToKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorcWxhMngwMF9laF93YWl0X2Zvcl9wZW5kaW5nX2NvbW1hbmRzKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50CWNudDsKKwlpbnQJc3RhdHVzOworCXNyYl90CQkqc3A7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCisJc3RhdHVzID0gMTsKKworCS8qCisJICogV2FpdGluZyBmb3IgYWxsIGNvbW1hbmRzIGZvciB0aGUgZGVzaWduYXRlZCB0YXJnZXQgaW4gdGhlIGFjdGl2ZQorCSAqIGFycmF5CisJICovCisJZm9yIChjbnQgPSAxOyBjbnQgPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFM7IGNudCsrKSB7CisJCXNwaW5fbG9jaygmaGEtPmhhcmR3YXJlX2xvY2spOworCQlzcCA9IGhhLT5vdXRzdGFuZGluZ19jbWRzW2NudF07CisJCWlmIChzcCkgeworCQkJY21kID0gc3AtPmNtZDsKKwkJCXNwaW5fdW5sb2NrKCZoYS0+aGFyZHdhcmVfbG9jayk7CisJCQlzdGF0dXMgPSBxbGEyeDAwX2VoX3dhaXRfb25fY29tbWFuZChoYSwgY21kKTsKKwkJCWlmIChzdGF0dXMgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQllbHNlIHsKKwkJCXNwaW5fdW5sb2NrKCZoYS0+aGFyZHdhcmVfbG9jayk7CisJCX0KKwl9CisJcmV0dXJuIChzdGF0dXMpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBxbGEyeHh4X2VoX2J1c19yZXNldAorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgVGhlIGJ1cyByZXNldCBmdW5jdGlvbiB3aWxsIHJlc2V0IHRoZSBidXMgYW5kIGFib3J0IGFueSBleGVjdXRpbmcKKyogICAgY29tbWFuZHMuCisqCisqIElucHV0OgorKiAgICBjbWQgPSBMaW51eCBTQ1NJIGNvbW1hbmQgcGFja2V0IG9mIHRoZSBjb21tYW5kIHRoYXQgY2F1c2UgdGhlCisqICAgICAgICAgIGJ1cyByZXNldC4KKyoKKyogUmV0dXJuczoKKyogICAgU1VDQ0VTUy9GQUlMVVJFIChkZWZpbmVkIGFzIG1hY3JvIGluIHNjc2kuaCkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorcWxhMnh4eF9laF9idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXNjc2lfcWxhX2hvc3RfdCAqaGE7CisJc3JiX3QgKnNwOworCWludCBydmFsID0gRkFJTEVEOworCisJaGEgPSAoc2NzaV9xbGFfaG9zdF90ICopIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlzcCA9IChzcmJfdCAqKSBDTURfU1AoY21kKTsKKworCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkgICAgInNjc2koJWxkOiVkOiVkOiVkKTogTE9PUCBSRVNFVCBJU1NVRUQuXG4iLCBoYS0+aG9zdF9ubywKKwkgICAgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisKKwlzcGluX3VubG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisKKwlpZiAocWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKGhhKSAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocHJpbnRrKCIlcyBmYWlsZWQ6Ym9hcmQgZGlzYWJsZWRcbiIsX19mdW5jX18pKTsKKwkJc3Bpbl9sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlpZiAocWxhMngwMF93YWl0X2Zvcl9sb29wX3JlYWR5KGhhKSA9PSBRTEFfU1VDQ0VTUykgeworCQlpZiAocWxhMngwMF9sb29wX3Jlc2V0KGhhKSA9PSBRTEFfU1VDQ0VTUykgCisJCQlydmFsID0gU1VDQ0VTUzsKKwl9CisKKwlzcGluX2xvY2tfaXJxKGhhLT5ob3N0LT5ob3N0X2xvY2spOworCWlmIChydmFsID09IEZBSUxFRCkKKwkJZ290byBvdXQ7CisKKwkvKiBXYWl0aW5nIGZvciBvdXIgY29tbWFuZCBpbiBkb25lX3F1ZXVlIHRvIGJlIHJldHVybmVkIHRvIE9TLiovCisJaWYgKGNtZC0+ZGV2aWNlLT5ob3N0LT5laF9hY3RpdmUpCisJCWlmICghcWxhMngwMF9laF93YWl0X2Zvcl9wZW5kaW5nX2NvbW1hbmRzKGhhKSkKKwkJCXJ2YWwgPSBGQUlMRUQ7CisKKyBvdXQ6CisJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IHJlc2V0ICVzXG4iLCBfX2Z1bmNfXywKKwkJCShydmFsID09IEZBSUxFRCkgPyAiZmFpbGVkIiA6ICJzdWNjZWRlZCIpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBxbGEyeHh4X2VoX2hvc3RfcmVzZXQKKyoKKyogRGVzY3JpcHRpb246CisqICAgIFRoZSByZXNldCBmdW5jdGlvbiB3aWxsIHJlc2V0IHRoZSBBZGFwdGVyLgorKgorKiBJbnB1dDoKKyogICAgICBjbWQgPSBMaW51eCBTQ1NJIGNvbW1hbmQgcGFja2V0IG9mIHRoZSBjb21tYW5kIHRoYXQgY2F1c2UgdGhlCisqICAgICAgICAgICAgYWRhcHRlciByZXNldC4KKyoKKyogUmV0dXJuczoKKyogICAgICBFaXRoZXIgU1VDQ0VTUyBvciBGQUlMRUQuCisqCisqIE5vdGU6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorcWxhMnh4eF9laF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzY3NpX3FsYV9ob3N0X3QgKmhhID0gKHNjc2lfcWxhX2hvc3RfdCAqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlpbnQJCXJ2YWwgPSBTVUNDRVNTOworCisJLyogRGlzcGxheSB3aGljaCBvbmUgd2UncmUgYWN0dWFsbHkgcmVzZXR0aW5nIGZvciBkZWJ1Zy4gKi8KKwlERUJVRyhwcmludGsoInFsYTJ4eHhfZWhfaG9zdF9yZXNldDpSZXNldHRpbmcgc2NzaSglbGQpLlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8pKTsKKworCS8qCisJICogIE5vdyBpc3N1ZSByZXNldC4KKwkgKi8KKwlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJICAgICJzY3NpKCVsZDolZDolZDolZCk6IEFEQVBURVIgUkVTRVQgaXNzdWVkLlxuIiwgaGEtPmhvc3Rfbm8sCisJICAgIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCisJc3Bpbl91bmxvY2tfaXJxKGhhLT5ob3N0LT5ob3N0X2xvY2spOworCisJaWYgKHFsYTJ4MDBfd2FpdF9mb3JfaGJhX29ubGluZShoYSkgIT0gUUxBX1NVQ0NFU1MpCisJCWdvdG8gYm9hcmRfZGlzYWJsZWQ7CisKKwkvKgorCSAqIEZpeG1lLW1heSBiZSBkcGMgdGhyZWFkIGlzIGFjdGl2ZSBhbmQgcHJvY2Vzc2luZworCSAqIGxvb3BfcmVzeW5jLHNvIHdhaXQgYSB3aGlsZSBmb3IgaXQgdG8gCisJICogYmUgY29tcGxldGVkIGFuZCB0aGVuIGlzc3VlIGJpZyBoYW1tZXIuT3RoZXJ3aXNlCisJICogaXQgbWF5IGNhdXNlIEkvTyBmYWlsdXJlIGFzIGJpZyBoYW1tZXIgbWFya3MgdGhlCisJICogZGV2aWNlcyBhcyBsb3N0IGtpY2tpbmcgb2YgdGhlIHBvcnRfZG93bl90aW1lcgorCSAqIHdoaWxlIGRwYyBpcyBzdHVjayBmb3IgdGhlIG1haWxib3ggdG8gY29tcGxldGUuCisJICovCisJLyogQmxvY2tpbmcgY2FsbC1Eb2VzIGNvbnRleHQgc3dpdGNoaW5nIGlmIGxvb3AgaXMgTm90IFJlYWR5ICovCisJcWxhMngwMF93YWl0X2Zvcl9sb29wX3JlYWR5KGhhKTsKKwlzZXRfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKTsKKwlpZiAocWxhMngwMF9hYm9ydF9pc3AoaGEpKSB7CisJCWNsZWFyX2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmaGEtPmRwY19mbGFncyk7CisJCS8qIGZhaWxlZC4gc2NoZWR1bGUgZHBjIHRvIHRyeSAqLworCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKworCQlpZiAocWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKGhhKSAhPSBRTEFfU1VDQ0VTUykKKwkJCWdvdG8gYm9hcmRfZGlzYWJsZWQ7CisJfSAKKworCWNsZWFyX2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmaGEtPmRwY19mbGFncyk7CisKKwlzcGluX2xvY2tfaXJxKGhhLT5ob3N0LT5ob3N0X2xvY2spOworCWlmIChydmFsID09IEZBSUxFRCkKKwkJZ290byBvdXQ7CisKKwkvKiBXYWl0aW5nIGZvciBvdXIgY29tbWFuZCBpbiBkb25lX3F1ZXVlIHRvIGJlIHJldHVybmVkIHRvIE9TLiovCisJaWYgKCFxbGEyeDAwX2VoX3dhaXRfZm9yX3BlbmRpbmdfY29tbWFuZHMoaGEpKQorCQlydmFsID0gRkFJTEVEOworCisgb3V0OgorCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiByZXNldCAlc1xuIiwgX19mdW5jX18sCisJCQkocnZhbCA9PSBGQUlMRUQpID8gImZhaWxlZCIgOiAic3VjY2VkZWQiKTsKKworCXJldHVybiBydmFsOworCisgYm9hcmRfZGlzYWJsZWQ6CisJc3Bpbl9sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKKworCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBmYWlsZWQ6Ym9hcmQgZGlzYWJsZWRcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gRkFJTEVEOworfQorCisKKy8qCisqIHFsYTJ4MDBfbG9vcF9yZXNldAorKiAgICAgIElzc3VlIGxvb3AgcmVzZXQuCisqCisqIElucHV0OgorKiAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorKgorKiBSZXR1cm5zOgorKiAgICAgIDAgPSBzdWNjZXNzCisqLworc3RhdGljIGludAorcWxhMngwMF9sb29wX3Jlc2V0KHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50IHN0YXR1cyA9IFFMQV9TVUNDRVNTOworCXVpbnQxNl90IHQ7CisJb3NfdGd0X3QgICAgICAgICp0cTsKKworCWlmIChoYS0+ZmxhZ3MuZW5hYmxlX2xpcF9yZXNldCkgeworCQlzdGF0dXMgPSBxbGEyeDAwX2xpcF9yZXNldChoYSk7CisJfQorCisJaWYgKHN0YXR1cyA9PSBRTEFfU1VDQ0VTUyAmJiBoYS0+ZmxhZ3MuZW5hYmxlX3RhcmdldF9yZXNldCkgeworCQlmb3IgKHQgPSAwOyB0IDwgTUFYX0ZJQlJFX0RFVklDRVM7IHQrKykgeworCQkJaWYgKCh0cSA9IFRHVF9RKGhhLCB0KSkgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHRxLT5mY3BvcnQgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKworCQkJc3RhdHVzID0gcWxhMngwMF90YXJnZXRfcmVzZXQoaGEsIDAsIHQpOworCQkJaWYgKHN0YXR1cyAhPSBRTEFfU1VDQ0VTUykgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKHN0YXR1cyA9PSBRTEFfU1VDQ0VTUyAmJgorCQkoKCFoYS0+ZmxhZ3MuZW5hYmxlX3RhcmdldF9yZXNldCAmJiAKKwkJICAhaGEtPmZsYWdzLmVuYWJsZV9saXBfcmVzZXQpIHx8CisJCWhhLT5mbGFncy5lbmFibGVfbGlwX2Z1bGxfbG9naW4pKSB7CisKKwkJc3RhdHVzID0gcWxhMngwMF9mdWxsX2xvZ2luX2xpcChoYSk7CisJfQorCisJLyogSXNzdWUgbWFya2VyIGNvbW1hbmQgb25seSB3aGVuIHdlIGFyZSBnb2luZyB0byBzdGFydCB0aGUgSS9PICovCisJaGEtPm1hcmtlcl9uZWVkZWQgPSAxOworCisJaWYgKHN0YXR1cykgeworCQkvKiBFbXB0eSAqLworCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6ICoqKiogRkFJTEVEICoqKipcbiIsCisJCQkJX19mdW5jX18sCisJCQkJaGEtPmhvc3Rfbm8pOykKKwl9IGVsc2UgeworCQkvKiBFbXB0eSAqLworCQlERUJVRzMocHJpbnRrKCIlcyglbGQpOiBleGl0aW5nIG5vcm1hbGx5LlxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQloYS0+aG9zdF9ubyk7KQorCX0KKworCXJldHVybihzdGF0dXMpOworfQorCisvKgorICogcWxhMngwMF9kZXZpY2VfcmVzZXQKKyAqCUlzc3VlIGJ1cyBkZXZpY2UgcmVzZXQgbWVzc2FnZSB0byB0aGUgdGFyZ2V0LgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKgl0ID0gU0NTSSBJRC4KKyAqCVRBUkdFVF9RVUVVRV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKglBREFQVEVSX1NUQVRFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfZGV2aWNlX3Jlc2V0KHNjc2lfcWxhX2hvc3RfdCAqaGEsIGZjX3BvcnRfdCAqcmVzZXRfZmNwb3J0KQoreworCS8qIEFib3J0IFRhcmdldCBjb21tYW5kIHdpbGwgY2xlYXIgUmVzZXJ2YXRpb24gKi8KKwlyZXR1cm4gcWxhMngwMF9hYm9ydF90YXJnZXQocmVzZXRfZmNwb3J0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHFsYTJ4eHhfc2xhdmVfY29uZmlndXJlCisqCisqIERlc2NyaXB0aW9uOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK3FsYTJ4eHhfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzY3NpX3FsYV9ob3N0X3QgKmhhID0gdG9fcWxhX2hvc3Qoc2Rldi0+aG9zdCk7CisJaW50IHF1ZXVlX2RlcHRoOworCisJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKQorCQlxdWV1ZV9kZXB0aCA9IDE2OworCWVsc2UKKwkJcXVldWVfZGVwdGggPSAzMjsKKworCWlmIChzZGV2LT50YWdnZWRfc3VwcG9ydGVkKSB7CisJCWlmIChxbDJ4bWF4cWRlcHRoICE9IDAgJiYgcWwyeG1heHFkZXB0aCA8PSAweGZmZmZVKQorCQkJcXVldWVfZGVwdGggPSBxbDJ4bWF4cWRlcHRoOworCisJCXFsMnhtYXhxZGVwdGggPSBxdWV1ZV9kZXB0aDsKKworCQlzY3NpX2FjdGl2YXRlX3RjcShzZGV2LCBxdWV1ZV9kZXB0aCk7CisKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkgICAgInNjc2koJWQ6JWQ6JWQ6JWQpOiBFbmFibGVkIHRhZ2dlZCBxdWV1aW5nLCBxdWV1ZSAiCisJCSAgICAiZGVwdGggJWQuXG4iLAorCQkgICAgc2Rldi0+aG9zdC0+aG9zdF9ubywgc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQsIHNkZXYtPmx1biwKKwkJICAgIHNkZXYtPnF1ZXVlX2RlcHRoKTsKKwl9IGVsc2UgeworCQkgc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RldiwgMCAvKiBUQ1Egb2ZmICovLAorCQkgICAgIHNkZXYtPmhvc3QtPmhvc3R0LT5jbWRfcGVyX2x1biAvKiAzICovKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCisvKioKKyAqIHFsYTJ4MDBfY29uZmlnX2RtYV9hZGRyZXNzaW5nKCkgLSBDb25maWd1cmUgT1MgRE1BIGFkZHJlc3NpbmcgbWV0aG9kLgorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogQXQgZXhpdCwgdGhlIEBoYSdzIGZsYWdzLmVuYWJsZV82NGJpdF9hZGRyZXNzaW5nIHNldCB0byBpbmRpY2F0ZWQKKyAqIHN1cHBvcnRlZCBhZGRyZXNzaW5nIG1ldGhvZC4KKyAqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfY29uZmlnX2RtYV9hZGRyZXNzaW5nKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJLyogQXNzdW1lIDMyYml0IERNQSBhZGRyZXNzICovCisJaGEtPmZsYWdzLmVuYWJsZV82NGJpdF9hZGRyZXNzaW5nID0gMDsKKwloYS0+Y2FsY19yZXF1ZXN0X2VudHJpZXMgPSBxbGEyeDAwX2NhbGNfaW9jYnNfMzI7CisJaGEtPmJ1aWxkX3Njc2lfaW9jYnMgPSBxbGEyeDAwX2J1aWxkX3Njc2lfaW9jYnNfMzI7CisKKwkvKgorCSAqIEdpdmVuIHRoZSB0d28gdmFyaWFudHMgcGNpX3NldF9kbWFfbWFzaygpLCBhbGxvdyB0aGUgY29tcGlsZXIgdG8KKwkgKiBhc3Npc3QgaW4gc2V0dGluZyB0aGUgcHJvcGVyIGRtYSBtYXNrLgorCSAqLworCWlmIChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSB7CisJCWlmIChwY2lfc2V0X2RtYV9tYXNrKGhhLT5wZGV2LCBETUFfNjRCSVRfTUFTSykgPT0gMCkgeworCQkJaGEtPmZsYWdzLmVuYWJsZV82NGJpdF9hZGRyZXNzaW5nID0gMTsKKwkJCWhhLT5jYWxjX3JlcXVlc3RfZW50cmllcyA9IHFsYTJ4MDBfY2FsY19pb2Nic182NDsKKwkJCWhhLT5idWlsZF9zY3NpX2lvY2JzID0gcWxhMngwMF9idWlsZF9zY3NpX2lvY2JzXzY0OworCisJCQlpZiAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKGhhLT5wZGV2LAorCQkJICAgIERNQV82NEJJVF9NQVNLKSkgeworCQkJCXFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsIAorCQkJCSAgICAiRmFpbGVkIHRvIHNldCA2NCBiaXQgUENJIGNvbnNpc3RlbnQgbWFzazsgIgorCQkJCSAgICAidXNpbmcgMzIgYml0LlxuIik7CisJCQkJcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKGhhLT5wZGV2LAorCQkJCSAgICBETUFfMzJCSVRfTUFTSyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlxbGFfcHJpbnRrKEtFUk5fREVCVUcsIGhhLAorCQkJICAgICJGYWlsZWQgdG8gc2V0IDY0IGJpdCBQQ0kgRE1BIG1hc2ssIGZhbGxpbmcgYmFjayAiCisJCQkgICAgInRvIDMyIGJpdCBNQVNLLlxuIik7CisJCQlwY2lfc2V0X2RtYV9tYXNrKGhhLT5wZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJCX0KKwl9IGVsc2UgeworCQlwY2lfc2V0X2RtYV9tYXNrKGhhLT5wZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJfQorfQorCitzdGF0aWMgaW50CitxbGEyeDAwX2lvc3BhY2VfY29uZmlnKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJdW5zaWduZWQgbG9uZwlwaW8sIHBpb19sZW4sIHBpb19mbGFnczsKKwl1bnNpZ25lZCBsb25nCW1taW8sIG1taW9fbGVuLCBtbWlvX2ZsYWdzOworCisJLyogV2Ugb25seSBuZWVkIFBJTyBmb3IgRmxhc2ggb3BlcmF0aW9ucyBvbiBJU1AyMzEyIHYyIGNoaXBzLiAqLworCXBpbyA9IHBjaV9yZXNvdXJjZV9zdGFydChoYS0+cGRldiwgMCk7CisJcGlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4oaGEtPnBkZXYsIDApOworCXBpb19mbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyhoYS0+cGRldiwgMCk7CisJaWYgKHBpb19mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJaWYgKHBpb19sZW4gPCBNSU5fSU9CQVNFX0xFTikgeworCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJICAgICJJbnZhbGlkIFBDSSBJL08gcmVnaW9uIHNpemUgKCVzKS4uLlxuIiwKKwkJCQlwY2lfbmFtZShoYS0+cGRldikpOworCQkJcGlvID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJyZWdpb24gIzAgbm90IGEgUElPIHJlc291cmNlICglcykuLi5cbiIsCisJCSAgICBwY2lfbmFtZShoYS0+cGRldikpOworCQlwaW8gPSAwOworCX0KKworCS8qIFVzZSBNTUlPIG9wZXJhdGlvbnMgZm9yIGFsbCBhY2Nlc3Nlcy4gKi8KKwltbWlvID0gcGNpX3Jlc291cmNlX3N0YXJ0KGhhLT5wZGV2LCAxKTsKKwltbWlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4oaGEtPnBkZXYsIDEpOworCW1taW9fZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MoaGEtPnBkZXYsIDEpOworCisJaWYgKCEobW1pb19mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSkgeworCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJICAgICJyZWdpb24gIzAgbm90IGFuIE1NSU8gcmVzb3VyY2UgKCVzKSwgYWJvcnRpbmdcbiIsCisJCSAgICBwY2lfbmFtZShoYS0+cGRldikpOworCQlnb3RvIGlvc3BhY2VfZXJyb3JfZXhpdDsKKwl9CisJaWYgKG1taW9fbGVuIDwgTUlOX0lPQkFTRV9MRU4pIHsKKwkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCisJCSAgICAiSW52YWxpZCBQQ0kgbWVtIHJlZ2lvbiBzaXplICglcyksIGFib3J0aW5nXG4iLAorCQkJcGNpX25hbWUoaGEtPnBkZXYpKTsKKwkJZ290byBpb3NwYWNlX2Vycm9yX2V4aXQ7CisJfQorCisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMoaGEtPnBkZXYsIGhhLT5icmRfaW5mby0+ZHJ2X25hbWUpKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJGYWlsZWQgdG8gcmVzZXJ2ZSBQSU8vTU1JTyByZWdpb25zICglcylcbiIsCisJCSAgICBwY2lfbmFtZShoYS0+cGRldikpOworCisJCWdvdG8gaW9zcGFjZV9lcnJvcl9leGl0OworCX0KKworCWhhLT5waW9fYWRkcmVzcyA9IHBpbzsKKwloYS0+cGlvX2xlbmd0aCA9IHBpb19sZW47CisJaGEtPmlvYmFzZSA9IGlvcmVtYXAobW1pbywgTUlOX0lPQkFTRV9MRU4pOworCWlmICghaGEtPmlvYmFzZSkgeworCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJICAgICJjYW5ub3QgcmVtYXAgTU1JTyAoJXMpLCBhYm9ydGluZ1xuIiwgcGNpX25hbWUoaGEtPnBkZXYpKTsKKworCQlnb3RvIGlvc3BhY2VfZXJyb3JfZXhpdDsKKwl9CisKKwlyZXR1cm4gKDApOworCitpb3NwYWNlX2Vycm9yX2V4aXQ6CisJcmV0dXJuICgtRU5PTUVNKTsKK30KKworLyoKKyAqIFBDSSBkcml2ZXIgaW50ZXJmYWNlCisgKi8KK2ludCBxbGEyeDAwX3Byb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHFsYV9ib2FyZF9pbmZvICpicmRfaW5mbykKK3sKKwlpbnQJcmV0OworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWc7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlzY3NpX3FsYV9ob3N0X3QgKmhhOworCXVuc2lnbmVkIGxvbmcJZmxhZ3MgPSAwOworCXVuc2lnbmVkIGxvbmcJd2FpdF9zd2l0Y2ggPSAwOworCWNoYXIgcGNpX2luZm9bMjBdOworCWNoYXIgZndfc3RyWzMwXTsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJcmV0dXJuIC0xOworCisJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmcWxhMngwMF9kcml2ZXJfdGVtcGxhdGUsCisJICAgIHNpemVvZihzY3NpX3FsYV9ob3N0X3QpKTsKKwlpZiAoaG9zdCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICJxbGEyeHh4OiBDb3VsZG4ndCBhbGxvY2F0ZSBob3N0IGZyb20gc2NzaSBsYXllciFcbiIpOworCQlnb3RvIHByb2JlX2Rpc2FibGVfZGV2aWNlOworCX0KKworCS8qIENsZWFyIG91ciBkYXRhIGFyZWEgKi8KKwloYSA9IChzY3NpX3FsYV9ob3N0X3QgKilob3N0LT5ob3N0ZGF0YTsKKwltZW1zZXQoaGEsIDAsIHNpemVvZihzY3NpX3FsYV9ob3N0X3QpKTsKKworCWhhLT5wZGV2ID0gcGRldjsKKwloYS0+aG9zdCA9IGhvc3Q7CisJaGEtPmhvc3Rfbm8gPSBob3N0LT5ob3N0X25vOworCWhhLT5icmRfaW5mbyA9IGJyZF9pbmZvOworCXNwcmludGYoaGEtPmhvc3Rfc3RyLCAiJXNfJWxkIiwgaGEtPmJyZF9pbmZvLT5kcnZfbmFtZSwgaGEtPmhvc3Rfbm8pOworCisJLyogQ29uZmlndXJlIFBDSSBJL08gc3BhY2UgKi8KKwlyZXQgPSBxbGEyeDAwX2lvc3BhY2VfY29uZmlnKGhhKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZ290byBwcm9iZV9mYWlsZWQ7CisJfQorCisJLyogU2FuaXRpemUgdGhlIGluZm9ybWF0aW9uIGZyb20gUENJIEJJT1MuICovCisJaG9zdC0+aXJxID0gcGRldi0+aXJxOworCisJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCSAgICAiRm91bmQgYW4gJXMsIGlycSAlZCwgaW9iYXNlIDB4JXBcbiIsIGhhLT5icmRfaW5mby0+aXNwX25hbWUsCisJICAgIGhvc3QtPmlycSwgaGEtPmlvYmFzZSk7CisKKwlzcGluX2xvY2tfaW5pdCgmaGEtPmhhcmR3YXJlX2xvY2spOworCisJLyogNC4yMyBJbml0aWFsaXplIC9wcm9jL3Njc2kvcWxhMngwMCBjb3VudGVycyAqLworCWhhLT5hY3R0aHJlYWRzID0gMDsKKwloYS0+cXRocmVhZHMgICA9IDA7CisJaGEtPnRvdGFsX2lzcl9jbnQgPSAwOworCWhhLT50b3RhbF9pc3BfYWJvcnRzID0gMDsKKwloYS0+dG90YWxfbGlwX2NudCA9IDA7CisJaGEtPnRvdGFsX2Rldl9lcnJzID0gMDsKKwloYS0+dG90YWxfaW9zID0gMDsKKwloYS0+dG90YWxfYnl0ZXMgPSAwOworCisJaGEtPnByZXZfdG9wb2xvZ3kgPSAwOworCWhhLT5wb3J0cyA9IE1BWF9CVVNFUzsKKworCWlmIChJU19RTEEyMTAwKGhhKSkgeworCQloYS0+bWF4X3RhcmdldHMgPSBNQVhfVEFSR0VUU18yMTAwOworCQloYS0+bWJ4X2NvdW50ID0gTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF8yMTAwOworCQloYS0+cmVxdWVzdF9xX2xlbmd0aCA9IFJFUVVFU1RfRU5UUllfQ05UXzIxMDA7CisJCWhhLT5yZXNwb25zZV9xX2xlbmd0aCA9IFJFU1BPTlNFX0VOVFJZX0NOVF8yMTAwOworCQloYS0+bGFzdF9sb29wX2lkID0gU05TX0xBU1RfTE9PUF9JRF8yMTAwOworCQlob3N0LT5zZ190YWJsZXNpemUgPSAzMjsKKwl9IGVsc2UgaWYgKElTX1FMQTIyMDAoaGEpKSB7CisJCWhhLT5tYXhfdGFyZ2V0cyA9IE1BWF9UQVJHRVRTXzIyMDA7CisJCWhhLT5tYnhfY291bnQgPSBNQUlMQk9YX1JFR0lTVEVSX0NPVU5UOworCQloYS0+cmVxdWVzdF9xX2xlbmd0aCA9IFJFUVVFU1RfRU5UUllfQ05UXzIyMDA7CisJCWhhLT5yZXNwb25zZV9xX2xlbmd0aCA9IFJFU1BPTlNFX0VOVFJZX0NOVF8yMTAwOworCQloYS0+bGFzdF9sb29wX2lkID0gU05TX0xBU1RfTE9PUF9JRF8yMTAwOworCX0gZWxzZSAvKmlmIChJU19RTEEyMzAwKGhhKSkqLyB7CisJCWhhLT5tYXhfdGFyZ2V0cyA9IE1BWF9UQVJHRVRTXzIyMDA7CisJCWhhLT5tYnhfY291bnQgPSBNQUlMQk9YX1JFR0lTVEVSX0NPVU5UOworCQloYS0+cmVxdWVzdF9xX2xlbmd0aCA9IFJFUVVFU1RfRU5UUllfQ05UXzIyMDA7CisJCWhhLT5yZXNwb25zZV9xX2xlbmd0aCA9IFJFU1BPTlNFX0VOVFJZX0NOVF8yMzAwOworCQloYS0+bGFzdF9sb29wX2lkID0gU05TX0xBU1RfTE9PUF9JRF8yMzAwOworCX0KKwlob3N0LT5jYW5fcXVldWUgPSBoYS0+cmVxdWVzdF9xX2xlbmd0aCArIDEyODsKKworCS8qIGxvYWQgdGhlIEYvVywgcmVhZCBwYXJhbWF0ZXJzLCBhbmQgaW5pdCB0aGUgSC9XICovCisJaGEtPmluc3RhbmNlID0gbnVtX2hvc3RzOworCisJaW5pdF9NVVRFWCgmaGEtPm1ieF9jbWRfc2VtKTsKKwlpbml0X01VVEVYX0xPQ0tFRCgmaGEtPm1ieF9pbnRyX3NlbSk7CisKKwlJTklUX0xJU1RfSEVBRCgmaGEtPmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZoYS0+ZmNwb3J0cyk7CisJSU5JVF9MSVNUX0hFQUQoJmhhLT5yc2NuX2ZjcG9ydHMpOworCUlOSVRfTElTVF9IRUFEKCZoYS0+ZG9uZV9xdWV1ZSk7CisJSU5JVF9MSVNUX0hFQUQoJmhhLT5yZXRyeV9xdWV1ZSk7CisJSU5JVF9MSVNUX0hFQUQoJmhhLT5zY3NpX3JldHJ5X3F1ZXVlKTsKKwlJTklUX0xJU1RfSEVBRCgmaGEtPnBlbmRpbmdfcXVldWUpOworCisJLyoKKwkgKiBUaGVzZSBsb2NrcyBhcmUgdXNlZCB0byBwcmV2ZW50IG1vcmUgdGhhbiBvbmUgQ1BVCisJICogZnJvbSBtb2RpZnlpbmcgdGhlIHF1ZXVlIGF0IHRoZSBzYW1lIHRpbWUuIFRoZQorCSAqIGhpZ2hlciBsZXZlbCAiaG9zdF9sb2NrIiB3aWxsIHJlZHVjZSBtb3N0CisJICogY29udGVudGlvbiBmb3IgdGhlc2UgbG9ja3MuCisJICovCisJc3Bpbl9sb2NrX2luaXQoJmhhLT5tYnhfcmVnX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZoYS0+bGlzdF9sb2NrKTsKKworCWhhLT5kcGNfcGlkID0gLTE7CisJaW5pdF9jb21wbGV0aW9uKCZoYS0+ZHBjX2luaXRlZCk7CisJaW5pdF9jb21wbGV0aW9uKCZoYS0+ZHBjX2V4aXRlZCk7CisKKwlxbGEyeDAwX2NvbmZpZ19kbWFfYWRkcmVzc2luZyhoYSk7CisJaWYgKHFsYTJ4MDBfbWVtX2FsbG9jKGhhKSkgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiW0VSUk9SXSBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhZGFwdGVyXG4iKTsKKworCQlnb3RvIHByb2JlX2ZhaWxlZDsKKwl9CisKKwlpZiAocWxhMngwMF9pbml0aWFsaXplX2FkYXB0ZXIoaGEpICYmCisJICAgICEoaGEtPmRldmljZV9mbGFncyAmIERGTEdfTk9fQ0FCTEUpKSB7CisKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIkZhaWxlZCB0byBpbml0aWFsaXplIGFkYXB0ZXJcbiIpOworCisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRmFpbGVkIHRvIGluaXRpYWxpemUgYWRhcHRlciAtICIKKwkJICAgICJBZGFwdGVyIGZsYWdzICV4LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBoYS0+ZGV2aWNlX2ZsYWdzKSk7CisKKwkJZ290byBwcm9iZV9mYWlsZWQ7CisJfQorCisJLyoKKwkgKiBTdGFydHVwIHRoZSBrZXJuZWwgdGhyZWFkIGZvciB0aGlzIGhvc3QgYWRhcHRlcgorCSAqLworCWhhLT5kcGNfc2hvdWxkX2RpZSA9IDA7CisJaGEtPmRwY19waWQgPSBrZXJuZWxfdGhyZWFkKHFsYTJ4MDBfZG9fZHBjLCBoYSwgMCk7CisJaWYgKGhhLT5kcGNfcGlkIDwgMCkgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiVW5hYmxlIHRvIHN0YXJ0IERQQyB0aHJlYWQhXG4iKTsKKworCQlnb3RvIHByb2JlX2ZhaWxlZDsKKwl9CisJd2FpdF9mb3JfY29tcGxldGlvbigmaGEtPmRwY19pbml0ZWQpOworCisJaG9zdC0+dGhpc19pZCA9IDI1NTsKKwlob3N0LT5jbWRfcGVyX2x1biA9IDM7CisJaG9zdC0+bWF4X2NtZF9sZW4gPSBNQVhfQ01EU1o7CisJaG9zdC0+bWF4X2NoYW5uZWwgPSBoYS0+cG9ydHMgLSAxOworCWhvc3QtPm1heF9sdW4gPSBoYS0+bWF4X2x1bnM7CisJQlVHX09OKHFsYTJ4eHhfdHJhbnNwb3J0X3RlbXBsYXRlID09IE5VTEwpOworCWhvc3QtPnRyYW5zcG9ydHQgPSBxbGEyeHh4X3RyYW5zcG9ydF90ZW1wbGF0ZTsKKwlob3N0LT51bmlxdWVfaWQgPSBoYS0+aW5zdGFuY2U7CisJaG9zdC0+bWF4X2lkID0gaGEtPm1heF90YXJnZXRzOworCisJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKQorCQlyZXQgPSByZXF1ZXN0X2lycShob3N0LT5pcnEsIHFsYTIxMDBfaW50cl9oYW5kbGVyLAorCQkgICAgU0FfSU5URVJSVVBUfFNBX1NISVJRLCBoYS0+YnJkX2luZm8tPmRydl9uYW1lLCBoYSk7CisJZWxzZQorCQlyZXQgPSByZXF1ZXN0X2lycShob3N0LT5pcnEsIHFsYTIzMDBfaW50cl9oYW5kbGVyLAorCQkgICAgU0FfSU5URVJSVVBUfFNBX1NISVJRLCBoYS0+YnJkX2luZm8tPmRydl9uYW1lLCBoYSk7CisJaWYgKHJldCAhPSAwKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJGYWlsZWQgdG8gcmVzZXJ2ZSBpbnRlcnJ1cHQgJWQgYWxyZWFkeSBpbiB1c2UuXG4iLAorCQkgICAgaG9zdC0+aXJxKTsKKwkJZ290byBwcm9iZV9mYWlsZWQ7CisJfQorCisJLyogSW5pdGlhbGl6ZWQgdGhlIHRpbWVyICovCisJcWxhMngwMF9zdGFydF90aW1lcihoYSwgcWxhMngwMF90aW1lciwgV0FUQ0hfSU5URVJWQUwpOworCisJREVCVUcyKHByaW50aygiREVCVUc6IGRldGVjdCBoYmEgJWxkIGF0IGFkZHJlc3MgPSAlcFxuIiwKKwkgICAgaGEtPmhvc3Rfbm8sIGhhKSk7CisKKwlyZWcgPSBoYS0+aW9iYXNlOworCisJLyogRGlzYWJsZSBJU1AgaW50ZXJydXB0cy4gKi8KKwlxbGEyeDAwX2Rpc2FibGVfaW50cnMoaGEpOworCisJLyogRW5zdXJlIG1haWxib3ggcmVnaXN0ZXJzIGFyZSBmcmVlLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCVdSVF9SRUdfV09SRCgmcmVnLT5zZW1hcGhvcmUsIDApOworCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX0NMUl9SSVNDX0lOVCk7CisJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfQ0xSX0hPU1RfSU5UKTsKKworCS8qIEVuYWJsZSBwcm9wZXIgcGFyaXR5ICovCisJaWYgKCFJU19RTEEyMTAwKGhhKSAmJiAhSVNfUUxBMjIwMChoYSkpIHsKKwkJaWYgKElTX1FMQTIzMDAoaGEpKQorCQkJLyogU1JBTSBwYXJpdHkgKi8KKwkJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCAoSENDUl9FTkFCTEVfUEFSSVRZICsgMHgxKSk7CisJCWVsc2UKKwkJCS8qIFNSQU0sIEluc3RydWN0aW9uIFJBTSBhbmQgR1AgUkFNIHBhcml0eSAqLworCQkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIChIQ0NSX0VOQUJMRV9QQVJJVFkgKyAweDcpKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCS8qIEVuYWJsZSBjaGlwIGludGVycnVwdHMuICovCisJcWxhMngwMF9lbmFibGVfaW50cnMoaGEpOworCisJLyogdjIuMTkuNWI2ICovCisJLyoKKwkgKiBXYWl0IGFyb3VuZCBtYXggbG9vcF9yZXNldF9kZWxheSBzZWNzIGZvciB0aGUgZGV2aWNlcyB0byBjb21lCisJICogb24tbGluZS4gV2UgZG9uJ3Qgd2FudCBMaW51eCBzY2FubmluZyBiZWZvcmUgd2UgYXJlIHJlYWR5LgorCSAqCisJICovCisJZm9yICh3YWl0X3N3aXRjaCA9IGppZmZpZXMgKyAoaGEtPmxvb3BfcmVzZXRfZGVsYXkgKiBIWik7CisJICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsd2FpdF9zd2l0Y2gpICYmCisJICAgICAhKGhhLT5kZXZpY2VfZmxhZ3MgJiAoREZMR19OT19DQUJMRSB8IERGTEdfRkFCUklDX0RFVklDRVMpKQorCSAgICAgJiYgKGhhLT5kZXZpY2VfZmxhZ3MgJiBTV0lUQ0hfRk9VTkQpIDspIHsKKworCQlxbGEyeDAwX2NoZWNrX2ZhYnJpY19kZXZpY2VzKGhhKTsKKworCQltc2xlZXAoMTApOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBoYSk7CisJaGEtPmZsYWdzLmluaXRfZG9uZSA9IDE7CisJbnVtX2hvc3RzKys7CisKKwkvKiBMaXN0IHRoZSB0YXJnZXQgd2UgaGF2ZSBmb3VuZCAqLworCWlmIChkaXNwbGF5Q29uZmlnKSB7CisJCXFsYTJ4MDBfZGlzcGxheV9mY19uYW1lcyhoYSk7CisJfQorCisJaWYgKHNjc2lfYWRkX2hvc3QoaG9zdCwgJnBkZXYtPmRldikpCisJCWdvdG8gcHJvYmVfZmFpbGVkOworCisJc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZob3N0LT5zaG9zdF9nZW5kZXYua29iaiwgJnN5c2ZzX2Z3X2R1bXBfYXR0cik7CisJc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZob3N0LT5zaG9zdF9nZW5kZXYua29iaiwgJnN5c2ZzX252cmFtX2F0dHIpOworCisJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiXG4iCisJICAgICIgUUxvZ2ljIEZpYnJlIENoYW5uZWwgSEJBIERyaXZlcjogJXNcbiIKKwkgICAgIiAgUUxvZ2ljICVzIC0gJXNcbiIKKwkgICAgIiAgJXM6ICVzIEAgJXMgaGRtYSVjLCBob3N0Iz0lbGQsIGZ3PSVzXG4iLCBxbGEyeDAwX3ZlcnNpb25fc3RyLAorCSAgICBoYS0+bW9kZWxfbnVtYmVyLCBoYS0+bW9kZWxfZGVzYyA/IGhhLT5tb2RlbF9kZXNjOiAiIiwKKwkgICAgaGEtPmJyZF9pbmZvLT5pc3BfbmFtZSwgcWxhMngwMF9nZXRfcGNpX2luZm9fc3RyKGhhLCBwY2lfaW5mbyksCisJICAgIHBjaV9uYW1lKGhhLT5wZGV2KSwgaGEtPmZsYWdzLmVuYWJsZV82NGJpdF9hZGRyZXNzaW5nID8gJysnOiAnLScsCisJICAgIGhhLT5ob3N0X25vLCBxbGEyeDAwX2dldF9md192ZXJzaW9uX3N0cihoYSwgZndfc3RyKSk7CisKKwlpZiAocWwyeGRvaW5pdHNjYW4pCisJCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCisJcmV0dXJuIDA7CisKK3Byb2JlX2ZhaWxlZDoKKwlxbGEyeDAwX2ZyZWVfZGV2aWNlKGhhKTsKKworCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisKK3Byb2JlX2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCXJldHVybiAtMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHFsYTJ4MDBfcHJvYmVfb25lKTsKKwordm9pZCBxbGEyeDAwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc2NzaV9xbGFfaG9zdF90ICpoYTsKKworCWhhID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZoYS0+aG9zdC0+c2hvc3RfZ2VuZGV2LmtvYmosCisJICAgICZzeXNmc19md19kdW1wX2F0dHIpOworCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaGEtPmhvc3QtPnNob3N0X2dlbmRldi5rb2JqLCAmc3lzZnNfbnZyYW1fYXR0cik7CisKKwlzY3NpX3JlbW92ZV9ob3N0KGhhLT5ob3N0KTsKKworCXFsYTJ4MDBfZnJlZV9kZXZpY2UoaGEpOworCisJc2NzaV9ob3N0X3B1dChoYS0+aG9zdCk7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChxbGEyeDAwX3JlbW92ZV9vbmUpOworCitzdGF0aWMgdm9pZAorcWxhMngwMF9mcmVlX2RldmljZShzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludCByZXQ7CisKKwkvKiBBYm9ydCBhbnkgb3V0c3RhbmRpbmcgSU8gZGVzY3JpcHRvcnMuICovCisJaWYgKCFJU19RTEEyMTAwKGhhKSAmJiAhSVNfUUxBMjIwMChoYSkpCisJCXFsYTJ4MDBfY2FuY2VsX2lvX2Rlc2NyaXB0b3JzKGhhKTsKKworCS8qIHR1cm4tb2ZmIGludGVycnVwdHMgb24gdGhlIGNhcmQgKi8KKwlpZiAoaGEtPmludGVycnVwdHNfb24pCisJCXFsYTJ4MDBfZGlzYWJsZV9pbnRycyhoYSk7CisKKwkvKiBEaXNhYmxlIHRpbWVyICovCisJaWYgKGhhLT50aW1lcl9hY3RpdmUpCisJCXFsYTJ4MDBfc3RvcF90aW1lcihoYSk7CisKKwkvKiBLaWxsIHRoZSBrZXJuZWwgdGhyZWFkIGZvciB0aGlzIGhvc3QgKi8KKwlpZiAoaGEtPmRwY19waWQgPj0gMCkgeworCQloYS0+ZHBjX3Nob3VsZF9kaWUgPSAxOworCQl3bWIoKTsKKwkJcmV0ID0ga2lsbF9wcm9jKGhhLT5kcGNfcGlkLCBTSUdIVVAsIDEpOworCQlpZiAocmV0KSB7CisJCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJCSAgICAiVW5hYmxlIHRvIHNpZ25hbCBEUEMgdGhyZWFkIC0tICglZClcbiIsIHJldCk7CisKKwkJCS8qIFRPRE86IFNPTUVUSElORyBNT1JFPz8/ICovCisJCX0gZWxzZSB7CisJCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZoYS0+ZHBjX2V4aXRlZCk7CisJCX0KKwl9CisKKwlxbGEyeDAwX21lbV9mcmVlKGhhKTsKKworCisJaGEtPmZsYWdzLm9ubGluZSA9IDA7CisKKwkvKiBEZXRhY2ggaW50ZXJydXB0cyAqLworCWlmIChoYS0+cGRldi0+aXJxKQorCQlmcmVlX2lycShoYS0+cGRldi0+aXJxLCBoYSk7CisKKwkvKiByZWxlYXNlIGlvIHNwYWNlIHJlZ2lzdGVycyAgKi8KKwlpZiAoaGEtPmlvYmFzZSkKKwkJaW91bm1hcChoYS0+aW9iYXNlKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKGhhLT5wZGV2KTsKKworCXBjaV9kaXNhYmxlX2RldmljZShoYS0+cGRldik7Cit9CisKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgc3VwcG9ydCBmdW5jdGlvbnMgYXJlIGFkb3B0ZWQgdG8gaGFuZGxlCisgKiB0aGUgcmUtZW50cmFudCBxbGEyeDAwX3Byb2NfaW5mbyBjb3JyZWN0bHkuCisgKi8KK3N0YXRpYyB2b2lkCitjb3B5X21lbV9pbmZvKHN0cnVjdCBpbmZvX3N0ciAqaW5mbywgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlpZiAoaW5mby0+cG9zICsgbGVuID4gaW5mby0+b2Zmc2V0ICsgaW5mby0+bGVuZ3RoKQorCQlsZW4gPSBpbmZvLT5vZmZzZXQgKyBpbmZvLT5sZW5ndGggLSBpbmZvLT5wb3M7CisKKwlpZiAoaW5mby0+cG9zICsgbGVuIDwgaW5mby0+b2Zmc2V0KSB7CisJCWluZm8tPnBvcyArPSBsZW47CisJCXJldHVybjsKKwl9CisgCisJaWYgKGluZm8tPnBvcyA8IGluZm8tPm9mZnNldCkgeworCQlvZmZfdCBwYXJ0aWFsOworIAorCQlwYXJ0aWFsID0gaW5mby0+b2Zmc2V0IC0gaW5mby0+cG9zOworCQlkYXRhICs9IHBhcnRpYWw7CisJCWluZm8tPnBvcyArPSBwYXJ0aWFsOworCQlsZW4gIC09IHBhcnRpYWw7CisJfQorIAorCWlmIChsZW4gPiAwKSB7CisJCW1lbWNweShpbmZvLT5idWZmZXIsIGRhdGEsIGxlbik7CisJCWluZm8tPnBvcyArPSBsZW47CisJCWluZm8tPmJ1ZmZlciArPSBsZW47CisJfQorfQorCitzdGF0aWMgaW50Citjb3B5X2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY2hhciBidWZbMjU2XTsKKwlpbnQgbGVuOworIAorCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbGVuID0gdnNwcmludGYoYnVmLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKyAKKwljb3B5X21lbV9pbmZvKGluZm8sIGJ1ZiwgbGVuKTsKKworCXJldHVybiAobGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcWxhMngwMF9wcm9jX2luZm8KKyoKKyogRGVzY3JpcHRpb246CisqICAgUmV0dXJuIGluZm9ybWF0aW9uIHRvIGhhbmRsZSAvcHJvYyBzdXBwb3J0IGZvciB0aGUgZHJpdmVyLgorKgorKiBpbm91dCA6IGRlY2lkZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgZGF0YWZsb3cgYW5kIHRoZSBtZWFuaW5nIG9mIHRoZQorKiAgICAgICAgIHZhcmlhYmxlcworKiBidWZmZXI6IElmIGlub3V0PT0wIGRhdGEgaXMgYmVpbmcgd3JpdHRlbiB0byBpdCBlbHNlIHJlYWQgZnJvbSBpdAorKiAgICAgICAgIChwdHIgdG8gYSBwYWdlIGJ1ZmZlcikKKyogKnN0YXJ0OiBJZiBpbm91dD09MCBzdGFydCBvZiB0aGUgdmFsaWQgZGF0YSBpbiB0aGUgYnVmZmVyCisqIG9mZnNldDogSWYgaW5vdXQ9PTAgc3RhcnRpbmcgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiBhbGwKKyogICAgICAgICBwb3NzaWJsZSBkYXRhIHRvIHJldHVybi4KKyogbGVuZ3RoOiBJZiBpbm91dD09MCBtYXggbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgYnVmZmVyCisqICAgICAgICAgZWxzZSBudW1iZXIgb2YgYnl0ZXMgaW4gImJ1ZmZlciIKKyogUmV0dXJuczoKKyogICAgICAgICA8IDA6ICBlcnJvci4gZXJybm8gdmFsdWUuCisqICAgICAgICAgPj0gMDogc2l6ZW9mIGRhdGEgcmV0dXJuZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitxbGEyeDAwX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgY2hhciAqYnVmZmVyLAorICAgIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCit7CisJc3RydWN0IGluZm9fc3RyCWluZm87CisJaW50ICAgICAgICAgICAgIHJldHZhbCA9IC1FSU5WQUw7CisJb3NfbHVuX3QJKnVwOworCW9zX3RndF90CSp0cTsKKwl1bnNpZ25lZCBpbnQJdCwgbDsKKwl1aW50MzJfdCAgICAgICAgdG1wX3NuOworCXVpbnQzMl90CSpmbGFnczsKKwl1aW50OF90CQkqbG9vcF9zdGF0ZTsKKwlzY3NpX3FsYV9ob3N0X3QgKmhhOworCWNoYXIgZndfaW5mb1szMF07CisgCisJREVCVUczKHByaW50ayhLRVJOX0lORk8KKwkgICAgIkVudGVyaW5nIHByb2NfaW5mbyBidWZmX2luPSVwLCBvZmZzZXQ9MHglbHgsIGxlbmd0aD0weCV4XG4iLAorCSAgICBidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTspCisKKwloYSA9IChzY3NpX3FsYV9ob3N0X3QgKikgc2hvc3QtPmhvc3RkYXRhOworCisJaWYgKGlub3V0KSB7CisJCS8qIEhhcyBkYXRhIGJlZW4gd3JpdHRlbiB0byB0aGUgZmlsZT8gKi8KKwkJREVCVUczKHByaW50aygKKwkJICAgICIlczogaGFzIGRhdGEgYmVlbiB3cml0dGVuIHRvIHRoZSBmaWxlLiBcbiIsCisJCSAgICBfX2Z1bmNfXyk7KQorCisJCXJldHVybiAtRU5PU1lTOworCX0KKworCWlmIChzdGFydCkgeworCQkqc3RhcnQgPSBidWZmZXI7CisJfQorCisJaW5mby5idWZmZXIgPSBidWZmZXI7CisJaW5mby5sZW5ndGggPSBsZW5ndGg7CisJaW5mby5vZmZzZXQgPSBvZmZzZXQ7CisJaW5mby5wb3MgICAgPSAwOworCisJLyogc3RhcnQgYnVpbGRpbmcgdGhlIHByaW50IGJ1ZmZlciAqLworCWNvcHlfaW5mbygmaW5mbywKKwkgICAgIlFMb2dpYyBQQ0kgdG8gRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIgZm9yICVzOlxuIgorCSAgICAiICAgICAgICBGaXJtd2FyZSB2ZXJzaW9uICVzLCAiLAorCSAgICBoYS0+bW9kZWxfbnVtYmVyLCBxbGEyeDAwX2dldF9md192ZXJzaW9uX3N0cihoYSwgZndfaW5mbykpOworCisJY29weV9pbmZvKCZpbmZvLCAiRHJpdmVyIHZlcnNpb24gJXNcbiIsIHFsYTJ4MDBfdmVyc2lvbl9zdHIpOworCisJdG1wX3NuID0gKChoYS0+c2VyaWFsMCAmIDB4MWYpIDw8IDE2KSB8IChoYS0+c2VyaWFsMiA8PCA4KSB8IAorCSAgICBoYS0+c2VyaWFsMTsKKwljb3B5X2luZm8oJmluZm8sICJJU1A6ICVzLCBTZXJpYWwjICVjJTA1ZFxuIiwKKwkgICAgaGEtPmJyZF9pbmZvLT5pc3BfbmFtZSwgKCdBJyArIHRtcF9zbi8xMDAwMDApLCAodG1wX3NuJTEwMDAwMCkpOworCisJY29weV9pbmZvKCZpbmZvLAorCSAgICAiUmVxdWVzdCBRdWV1ZSA9IDB4JWxseCwgUmVzcG9uc2UgUXVldWUgPSAweCVsbHhcbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpaGEtPnJlcXVlc3RfZG1hLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWhhLT5yZXNwb25zZV9kbWEpOworCisJY29weV9pbmZvKCZpbmZvLAorCSAgICAiUmVxdWVzdCBRdWV1ZSBjb3VudCA9ICVkLCBSZXNwb25zZSBRdWV1ZSBjb3VudCA9ICVkXG4iLAorCSAgICBoYS0+cmVxdWVzdF9xX2xlbmd0aCwgaGEtPnJlc3BvbnNlX3FfbGVuZ3RoKTsKKworCWNvcHlfaW5mbygmaW5mbywKKwkgICAgIlRvdGFsIG51bWJlciBvZiBhY3RpdmUgY29tbWFuZHMgPSAlbGRcbiIsCisJICAgIGhhLT5hY3R0aHJlYWRzKTsKKworCWNvcHlfaW5mbygmaW5mbywKKwkgICAgIlRvdGFsIG51bWJlciBvZiBpbnRlcnJ1cHRzID0gJWxkXG4iLAorCSAgICAobG9uZyloYS0+dG90YWxfaXNyX2NudCk7CisKKwljb3B5X2luZm8oJmluZm8sCisJICAgICIgICAgRGV2aWNlIHF1ZXVlIGRlcHRoID0gMHgleFxuIiwKKwkgICAgKHFsMnhtYXhxZGVwdGggPT0gMCkgPyAxNiA6IHFsMnhtYXhxZGVwdGgpOworCisJY29weV9pbmZvKCZpbmZvLAorCSAgICAiTnVtYmVyIG9mIGZyZWUgcmVxdWVzdCBlbnRyaWVzID0gJWRcbiIsIGhhLT5yZXFfcV9jbnQpOworCisJY29weV9pbmZvKCZpbmZvLAorCSAgICAiTnVtYmVyIG9mIG1haWxib3ggdGltZW91dHMgPSAlbGRcbiIsIGhhLT50b3RhbF9tYnhfdGltZW91dCk7CisKKwljb3B5X2luZm8oJmluZm8sCisJICAgICJOdW1iZXIgb2YgSVNQIGFib3J0cyA9ICVsZFxuIiwgaGEtPnRvdGFsX2lzcF9hYm9ydHMpOworCisJY29weV9pbmZvKCZpbmZvLAorCSAgICAiTnVtYmVyIG9mIGxvb3AgcmVzeW5jcyA9ICVsZFxuIiwgaGEtPnRvdGFsX2xvb3BfcmVzeW5jKTsKKworCWNvcHlfaW5mbygmaW5mbywKKwkgICAgIk51bWJlciBvZiByZXRyaWVzIGZvciBlbXB0eSBzbG90cyA9ICVsZFxuIiwKKwkgICAgcWxhMngwMF9zdGF0cy5vdXRhcnJheV9mdWxsKTsKKworCWNvcHlfaW5mbygmaW5mbywKKwkgICAgIk51bWJlciBvZiByZXFzIGluIHBlbmRpbmdfcT0gJWxkLCByZXRyeV9xPSAlZCwgIgorCSAgICAiZG9uZV9xPSAlbGQsIHNjc2lfcmV0cnlfcT0gJWRcbiIsCisJICAgIGhhLT5xdGhyZWFkcywgaGEtPnJldHJ5X3FfY250LAorCSAgICBoYS0+ZG9uZV9xX2NudCwgaGEtPnNjc2lfcmV0cnlfcV9jbnQpOworCisKKwlmbGFncyA9ICh1aW50MzJfdCAqKSAmaGEtPmZsYWdzOworCisJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ET1dOKSB7CisJCWxvb3Bfc3RhdGUgPSAiRE9XTiI7CisJfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpID09IExPT1BfVVApIHsKKwkJbG9vcF9zdGF0ZSA9ICJVUCI7CisJfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpID09IExPT1BfUkVBRFkpIHsKKwkJbG9vcF9zdGF0ZSA9ICJSRUFEWSI7CisJfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpID09IExPT1BfVElNRU9VVCkgeworCQlsb29wX3N0YXRlID0gIlRJTUVPVVQiOworCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX1VQREFURSkgeworCQlsb29wX3N0YXRlID0gIlVQREFURSI7CisJfSBlbHNlIHsKKwkJbG9vcF9zdGF0ZSA9ICJVTktOT1dOIjsKKwl9CisKKwljb3B5X2luZm8oJmluZm8sIAorCSAgICAiSG9zdCBhZGFwdGVyOmxvb3Agc3RhdGUgPSA8JXM+LCBmbGFncyA9IDB4JWx4XG4iLAorCSAgICBsb29wX3N0YXRlICwgKmZsYWdzKTsKKworCWNvcHlfaW5mbygmaW5mbywgIkRwYyBmbGFncyA9IDB4JWx4XG4iLCBoYS0+ZHBjX2ZsYWdzKTsKKworCWNvcHlfaW5mbygmaW5mbywgIk1CWCBmbGFncyA9IDB4JXhcbiIsIGhhLT5tYnhfZmxhZ3MpOworCisJY29weV9pbmZvKCZpbmZvLCAiTGluayBkb3duIFRpbWVvdXQgPSAlMy4zZFxuIiwKKwkgICAgaGEtPmxpbmtfZG93bl90aW1lb3V0KTsKKworCWNvcHlfaW5mbygmaW5mbywgIlBvcnQgZG93biByZXRyeSA9ICUzLjNkXG4iLAorCSAgICBoYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50KTsKKworCWNvcHlfaW5mbygmaW5mbywgIkxvZ2luIHJldHJ5IGNvdW50ID0gJTMuM2RcbiIsCisJICAgIGhhLT5sb2dpbl9yZXRyeV9jb3VudCk7CisKKwljb3B5X2luZm8oJmluZm8sCisJICAgICJDb21tYW5kcyByZXRyaWVkIHdpdGggZHJvcHBlZCBmcmFtZShzKSA9ICVkXG4iLAorCSAgICBoYS0+ZHJvcHBlZF9mcmFtZV9lcnJvcl9jbnQpOworCisJY29weV9pbmZvKCZpbmZvLAorCSAgICAiUHJvZHVjdCBJRCA9ICUwNHggJTA0eCAlMDR4ICUwNHhcbiIsIGhhLT5wcm9kdWN0X2lkWzBdLAorCSAgICBoYS0+cHJvZHVjdF9pZFsxXSwgaGEtPnByb2R1Y3RfaWRbMl0sIGhhLT5wcm9kdWN0X2lkWzNdKTsKKworCWNvcHlfaW5mbygmaW5mbywgIlxuIik7CisKKwkvKiAyLjI1IG5vZGUvcG9ydCBkaXNwbGF5IHRvIHByb2MgKi8KKwkvKiBEaXNwbGF5IHRoZSBub2RlIG5hbWUgZm9yIGFkYXB0ZXIgKi8KKwljb3B5X2luZm8oJmluZm8sICJcblNDU0kgRGV2aWNlIEluZm9ybWF0aW9uOlxuIik7CisJY29weV9pbmZvKCZpbmZvLAorCSAgICAic2NzaS1xbGElZC1hZGFwdGVyLW5vZGU9IgorCSAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMng7XG4iLAorCSAgICAoaW50KWhhLT5pbnN0YW5jZSwKKwkgICAgaGEtPmluaXRfY2ItPm5vZGVfbmFtZVswXSwKKwkgICAgaGEtPmluaXRfY2ItPm5vZGVfbmFtZVsxXSwKKwkgICAgaGEtPmluaXRfY2ItPm5vZGVfbmFtZVsyXSwKKwkgICAgaGEtPmluaXRfY2ItPm5vZGVfbmFtZVszXSwKKwkgICAgaGEtPmluaXRfY2ItPm5vZGVfbmFtZVs0XSwKKwkgICAgaGEtPmluaXRfY2ItPm5vZGVfbmFtZVs1XSwKKwkgICAgaGEtPmluaXRfY2ItPm5vZGVfbmFtZVs2XSwKKwkgICAgaGEtPmluaXRfY2ItPm5vZGVfbmFtZVs3XSk7CisKKwkvKiBkaXNwbGF5IHRoZSBwb3J0IG5hbWUgZm9yIGFkYXB0ZXIgKi8KKwljb3B5X2luZm8oJmluZm8sCisJICAgICJzY3NpLXFsYSVkLWFkYXB0ZXItcG9ydD0iCisJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeDtcbiIsCisJICAgIChpbnQpaGEtPmluc3RhbmNlLAorCSAgICBoYS0+aW5pdF9jYi0+cG9ydF9uYW1lWzBdLAorCSAgICBoYS0+aW5pdF9jYi0+cG9ydF9uYW1lWzFdLAorCSAgICBoYS0+aW5pdF9jYi0+cG9ydF9uYW1lWzJdLAorCSAgICBoYS0+aW5pdF9jYi0+cG9ydF9uYW1lWzNdLAorCSAgICBoYS0+aW5pdF9jYi0+cG9ydF9uYW1lWzRdLAorCSAgICBoYS0+aW5pdF9jYi0+cG9ydF9uYW1lWzVdLAorCSAgICBoYS0+aW5pdF9jYi0+cG9ydF9uYW1lWzZdLAorCSAgICBoYS0+aW5pdF9jYi0+cG9ydF9uYW1lWzddKTsKKworCS8qIFByaW50IG91dCBkZXZpY2UgcG9ydCBuYW1lcyAqLworCWZvciAodCA9IDA7IHQgPCBNQVhfRklCUkVfREVWSUNFUzsgdCsrKSB7CisJCWlmICgodHEgPSBUR1RfUShoYSwgdCkpID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQljb3B5X2luZm8oJmluZm8sCisJCSAgICAic2NzaS1xbGElZC10YXJnZXQtJWQ9IgorCQkgICAgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4O1xuIiwKKwkJICAgIChpbnQpaGEtPmluc3RhbmNlLCB0LAorCQkgICAgdHEtPnBvcnRfbmFtZVswXSwgdHEtPnBvcnRfbmFtZVsxXSwKKwkJICAgIHRxLT5wb3J0X25hbWVbMl0sIHRxLT5wb3J0X25hbWVbM10sCisJCSAgICB0cS0+cG9ydF9uYW1lWzRdLCB0cS0+cG9ydF9uYW1lWzVdLAorCQkgICAgdHEtPnBvcnRfbmFtZVs2XSwgdHEtPnBvcnRfbmFtZVs3XSk7CisJfQorCisJY29weV9pbmZvKCZpbmZvLCAiXG5TQ1NJIExVTiBJbmZvcm1hdGlvbjpcbiIpOworCWNvcHlfaW5mbygmaW5mbywKKwkgICAgIihJZDpMdW4pICAqIC0gaW5kaWNhdGVzIGx1biBpcyBub3QgcmVnaXN0ZXJlZCB3aXRoIHRoZSBPUy5cbiIpOworCisJLyogc2NhbiBmb3IgYWxsIGVxdWlwbWVudCBzdGF0cyAqLworCWZvciAodCA9IDA7IHQgPCBNQVhfRklCUkVfREVWSUNFUzsgdCsrKSB7CisJCS8qIHNjYW4gYWxsIGx1bnMgKi8KKwkJZm9yIChsID0gMDsgbCA8IGhhLT5tYXhfbHVuczsgbCsrKSB7CisJCQl1cCA9IChvc19sdW5fdCAqKSBHRVRfTFVfUShoYSwgdCwgbCk7CisKKwkJCWlmICh1cCA9PSBOVUxMKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAodXAtPmZjbHVuID09IE5VTEwpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJY29weV9pbmZvKCZpbmZvLAorCQkJICAgICIoJTJkOiUyZCk6IFRvdGFsIHJlcXMgJWxkLCIsCisJCQkgICAgdCxsLHVwLT5pb19jbnQpOworCisJCQljb3B5X2luZm8oJmluZm8sCisJCQkgICAgIiBQZW5kaW5nIHJlcXMgJWxkLCIsCisJCQkgICAgdXAtPm91dF9jbnQpOworCisJCQlpZiAodXAtPmlvX2NudCA8IDQpIHsKKwkJCQljb3B5X2luZm8oJmluZm8sCisJCQkJICAgICIgZmxhZ3MgMHgleCosIiwKKwkJCQkgICAgKGludCl1cC0+cV9mbGFnKTsKKwkJCX0gZWxzZSB7CisJCQkJY29weV9pbmZvKCZpbmZvLAorCQkJCSAgICAiIGZsYWdzIDB4JXgsIiwKKwkJCQkgICAgKGludCl1cC0+cV9mbGFnKTsKKwkJCX0KKworCQkJY29weV9pbmZvKCZpbmZvLCAKKwkJCSAgICAiICVsZDolZDolMDJ4ICUwMngiLAorCQkJICAgIHVwLT5mY2x1bi0+ZmNwb3J0LT5oYS0+aW5zdGFuY2UsCisJCQkgICAgdXAtPmZjbHVuLT5mY3BvcnQtPmN1cl9wYXRoLAorCQkJICAgIHVwLT5mY2x1bi0+ZmNwb3J0LT5sb29wX2lkLAorCQkJICAgIHVwLT5mY2x1bi0+ZGV2aWNlX3R5cGUpOworCisJCQljb3B5X2luZm8oJmluZm8sICJcbiIpOworCisJCQlpZiAoaW5mby5wb3MgPj0gaW5mby5vZmZzZXQgKyBpbmZvLmxlbmd0aCkgeworCQkJCS8qIE5vIG5lZWQgdG8gY29udGludWUgKi8KKwkJCQlnb3RvIHByb2ZpbGVfc3RvcDsKKwkJCX0KKwkJfQorCisJCWlmIChpbmZvLnBvcyA+PSBpbmZvLm9mZnNldCArIGluZm8ubGVuZ3RoKSB7CisJCQkvKiBObyBuZWVkIHRvIGNvbnRpbnVlICovCisJCQlicmVhazsKKwkJfQorCX0KKworcHJvZmlsZV9zdG9wOgorCisJcmV0dmFsID0gaW5mby5wb3MgPiBpbmZvLm9mZnNldCA/IGluZm8ucG9zIC0gaW5mby5vZmZzZXQgOiAwOworCisJREVCVUczKHByaW50ayhLRVJOX0lORk8gCisJICAgICJFeGl0aW5nIHByb2NfaW5mbzogaW5mby5wb3M9JWQsIG9mZnNldD0weCVseCwgIgorCSAgICAibGVuZ3RoPTB4JXhcbiIsIGluZm8ucG9zLCBvZmZzZXQsIGxlbmd0aCk7KQorCisJcmV0dXJuIChyZXR2YWwpOworfQorCisvKgorKiBxbGEyeDAwX2Rpc3BsYXlfZmNfbmFtZXMKKyogICAgICBUaGlzIHJvdXRpbmUgd2lsbCB0aGUgbm9kZSBuYW1lcyBvZiB0aGUgZGlmZmVyZW50IGRldmljZXMgZm91bmQKKyogICAgICBhZnRlciBwb3J0IGlucXVpcnkuCisqCisqIElucHV0OgorKiAgICAgIGNtZCA9IFNDU0kgY29tbWFuZCBzdHJ1Y3R1cmUKKyoKKyogUmV0dXJuczoKKyogICAgICBOb25lLgorKi8KK3N0YXRpYyB2b2lkCitxbGEyeDAwX2Rpc3BsYXlfZmNfbmFtZXMoc2NzaV9xbGFfaG9zdF90ICpoYSkgCit7CisJdWludDE2X3QJdGd0OworCW9zX3RndF90CSp0cTsKKworCS8qIERpc3BsYXkgdGhlIG5vZGUgbmFtZSBmb3IgYWRhcHRlciAqLworCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkgICAgInNjc2ktcWxhJWQtYWRhcHRlci1ub2RlPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XFw7XG4iLAorCSAgICAoaW50KWhhLT5pbnN0YW5jZSwKKwkgICAgaGEtPmluaXRfY2ItPm5vZGVfbmFtZVswXSwKKwkgICAgaGEtPmluaXRfY2ItPm5vZGVfbmFtZVsxXSwKKwkgICAgaGEtPmluaXRfY2ItPm5vZGVfbmFtZVsyXSwKKwkgICAgaGEtPmluaXRfY2ItPm5vZGVfbmFtZVszXSwKKwkgICAgaGEtPmluaXRfY2ItPm5vZGVfbmFtZVs0XSwKKwkgICAgaGEtPmluaXRfY2ItPm5vZGVfbmFtZVs1XSwKKwkgICAgaGEtPmluaXRfY2ItPm5vZGVfbmFtZVs2XSwKKwkgICAgaGEtPmluaXRfY2ItPm5vZGVfbmFtZVs3XSk7CisKKwkvKiBkaXNwbGF5IHRoZSBwb3J0IG5hbWUgZm9yIGFkYXB0ZXIgKi8KKwlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJICAgICJzY3NpLXFsYSVkLWFkYXB0ZXItcG9ydD0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxcO1xuIiwKKwkgICAgKGludCloYS0+aW5zdGFuY2UsCisJICAgIGhhLT5pbml0X2NiLT5wb3J0X25hbWVbMF0sCisJICAgIGhhLT5pbml0X2NiLT5wb3J0X25hbWVbMV0sCisJICAgIGhhLT5pbml0X2NiLT5wb3J0X25hbWVbMl0sCisJICAgIGhhLT5pbml0X2NiLT5wb3J0X25hbWVbM10sCisJICAgIGhhLT5pbml0X2NiLT5wb3J0X25hbWVbNF0sCisJICAgIGhhLT5pbml0X2NiLT5wb3J0X25hbWVbNV0sCisJICAgIGhhLT5pbml0X2NiLT5wb3J0X25hbWVbNl0sCisJICAgIGhhLT5pbml0X2NiLT5wb3J0X25hbWVbN10pOworCisJLyogUHJpbnQgb3V0IGRldmljZSBwb3J0IG5hbWVzICovCisJZm9yICh0Z3QgPSAwOyB0Z3QgPCBNQVhfVEFSR0VUUzsgdGd0KyspIHsKKwkJaWYgKCh0cSA9IGhhLT5vdGd0W3RndF0pID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlpZiAodHEtPmZjcG9ydCA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChoYS0+YmluZGluZ190eXBlKSB7CisJCQljYXNlIEJJTkRfQllfUE9SVF9OQU1FOgorCQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCQkgICAgInNjc2ktcWxhJWQtdGd0LSVkLWRpLTAtcG9ydD0iCisJCQkJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxcO1xuIiwKKwkJCQkgICAgKGludCloYS0+aW5zdGFuY2UsIAorCQkJCSAgICB0Z3QsCisJCQkJICAgIHRxLT5wb3J0X25hbWVbMF0sIAorCQkJCSAgICB0cS0+cG9ydF9uYW1lWzFdLAorCQkJCSAgICB0cS0+cG9ydF9uYW1lWzJdLCAKKwkJCQkgICAgdHEtPnBvcnRfbmFtZVszXSwKKwkJCQkgICAgdHEtPnBvcnRfbmFtZVs0XSwgCisJCQkJICAgIHRxLT5wb3J0X25hbWVbNV0sCisJCQkJICAgIHRxLT5wb3J0X25hbWVbNl0sIAorCQkJCSAgICB0cS0+cG9ydF9uYW1lWzddKTsKKworCQkJCWJyZWFrOworCisJCQljYXNlIEJJTkRfQllfUE9SVF9JRDoKKwkJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkJICAgICJzY3NpLXFsYSVkLXRndC0lZC1kaS0wLXBpZD0iCisJCQkJICAgICIlMDJ4JTAyeCUwMnhcXDtcbiIsCisJCQkJICAgIChpbnQpaGEtPmluc3RhbmNlLAorCQkJCSAgICB0Z3QsCisJCQkJICAgIHRxLT5kX2lkLmIuZG9tYWluLAorCQkJCSAgICB0cS0+ZF9pZC5iLmFyZWEsCisJCQkJICAgIHRxLT5kX2lkLmIuYWxfcGEpOworCQkJCWJyZWFrOworCQl9CisKKyNpZiBWU0EKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkgICAgInNjc2ktcWxhJWQtdGFyZ2V0LSVkLXZzYT0wMTtcbiIsIChpbnQpaGEtPmluc3RhbmNlLCB0Z3QpOworI2VuZGlmCisJfQorfQorCisvKgorICogIHFsYTJ4MDBfc3VzcGVuZF9sdW4KKyAqCVN1c3BlbmQgbHVuIGFuZCBzdGFydCBwb3J0IGRvd24gdGltZXIKKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gdmlzYWJsZSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKiAgbHEgPSBsdW4gcXVldWUKKyAqICBjcCA9IFNjc2kgY29tbWFuZCBwb2ludGVyIAorICogIHRpbWUgPSB0aW1lIGluIHNlY29uZHMKKyAqICBjb3VudCA9IG51bWJlciBvZiB0aW1lcyB0byBsZXQgdGltZSBleHBpcmUKKyAqICBkZWxheV9sdW4gPSBub24temVybywgaWYgbHVuIHNob3VsZCBiZSBkZWxheWVkIHJhdGhlciB0aGFuIHN1c3BlbmRlZAorICoKKyAqIFJldHVybjoKKyAqICAgICBRTEFfU1VDQ0VTUyAgLS0gc3VzcGVuZGVkIGx1biAKKyAqICAgICBRTEFfRlVOQ1RJT05fRkFJTEVEICAtLSBEaWRuJ3Qgc3VzcGVuZCBsdW4KKyAqCisgKiBDb250ZXh0OgorICoJSW50ZXJydXB0IGNvbnRleHQuCisgKi8KK2ludAorX19xbGEyeDAwX3N1c3BlbmRfbHVuKHNjc2lfcWxhX2hvc3RfdCAqaGEsCisJCW9zX2x1bl90ICpscSwgaW50IHRpbWUsIGludCBjb3VudCwgaW50IGRlbGF5X2x1bikKK3sKKwlpbnQJcnZhbDsKKwlzcmJfdCAqc3A7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgKnRlbXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKKworCS8qIGlmIHRoZSBsdW5fcSBpcyBhbHJlYWR5IHN1c3BlbmRlZCB0aGVuIGRvbid0IGRvIGl0IGFnYWluICovCisJaWYgKGxxLT5xX3N0YXRlID09IExVTl9TVEFURV9SRUFEWSB8fGxxLT5xX3N0YXRlID09IExVTl9TVEFURV9SVU4pIHsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHEtPnFfbG9jaywgZmxhZ3MpOworCQlpZiAobHEtPnFfc3RhdGUgPT0gTFVOX1NUQVRFX1JFQURZKSB7CisJCQlscS0+cV9tYXggPSBjb3VudDsKKwkJCWxxLT5xX2NvdW50ID0gMDsKKwkJfQorCQkvKiBTZXQgdGhlIHN1c3BlbmQgdGltZSB1c3VhbGx5IDYgc2VjcyAqLworCQlhdG9taWNfc2V0KCZscS0+cV90aW1lciwgdGltZSk7CisKKwkJLyogbm93IHN1c3BlbmQgdGhlIGx1biAqLworCQlscS0+cV9zdGF0ZSA9IExVTl9TVEFURV9XQUlUOworCisJCWlmIChkZWxheV9sdW4pIHsKKwkJCXNldF9iaXQoTFVOX0VYRUNfREVMQVlFRCwgJmxxLT5xX2ZsYWcpOworCQkJREVCVUcocHJpbnRrKEtFUk5fSU5GTworCQkJICAgICJzY3NpKCVsZCk6IERlbGF5IGx1biBleGVjdXRpb24gZm9yICVkIHNlY3MsICIKKwkJCSAgICAiY291bnQ9JWQsIG1heCBjb3VudD0lZCwgc3RhdGU9JWRcbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8sCisJCQkgICAgdGltZSwKKwkJCSAgICBscS0+cV9jb3VudCwgbHEtPnFfbWF4LCBscS0+cV9zdGF0ZSkpOworCQl9IGVsc2UgeworCQkJREVCVUcocHJpbnRrKEtFUk5fSU5GTworCQkJICAgICJzY3NpKCVsZCk6IFN1c3BlbmQgbHVuIGZvciAlZCBzZWNzLCBjb3VudD0lZCwgIgorCQkJICAgICJtYXggY291bnQ9JWQsIHN0YXRlPSVkXG4iLAorCQkJICAgIGhhLT5ob3N0X25vLAorCQkJICAgIHRpbWUsCisJCQkgICAgbHEtPnFfY291bnQsIGxxLT5xX21heCwgbHEtPnFfc3RhdGUpKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscS0+cV9sb2NrLCBmbGFncyk7CisKKwkJLyoKKwkJICogUmVtb3ZlIGFsbCBwZW5kaW5nIGNvbW1hbmRzIGZyb20gcmVxdWVzdCBxdWV1ZSBhbmQgIHB1dCB0aGVtCisJCSAqIGluIHRoZSBzY3NpX3JldHJ5IHF1ZXVlLgorCQkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3QsIHRlbXAsICZoYS0+cGVuZGluZ19xdWV1ZSkgeworCQkJc3AgPSBsaXN0X2VudHJ5KGxpc3QsIHNyYl90LCBsaXN0KTsKKwkJCWlmIChzcC0+bHVuX3F1ZXVlICE9IGxxKQorCQkJCWNvbnRpbnVlOworCisJCQlfX2RlbF9mcm9tX3BlbmRpbmdfcXVldWUoaGEsIHNwKTsKKworCQkJaWYgKHNwLT5jbWQtPmFsbG93ZWQgPCBjb3VudCkKKwkJCQlzcC0+Y21kLT5hbGxvd2VkID0gY291bnQ7CisJCQlfX2FkZF90b19zY3NpX3JldHJ5X3F1ZXVlKGhhLCBzcCk7CisKKwkJfSAvKiBsaXN0X2Zvcl9lYWNoX3NhZmUgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCQlydmFsID0gUUxBX1NVQ0NFU1M7CisJfSBlbHNlIHsKKwkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworLyoKKyAqIHFsYTJ4MDBfbWFya19kZXZpY2VfbG9zdCBVcGRhdGVzIGZjcG9ydCBzdGF0ZSB3aGVuIGRldmljZSBnb2VzIG9mZmxpbmUuCisgKgorICogSW5wdXQ6IGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLiAgZmNwb3J0ID0gcG9ydCBzdHJ1Y3R1cmUgcG9pbnRlci4KKyAqCisgKiBSZXR1cm46IE5vbmUuCisgKgorICogQ29udGV4dDoKKyAqLwordm9pZCBxbGEyeDAwX21hcmtfZGV2aWNlX2xvc3Qoc2NzaV9xbGFfaG9zdF90ICpoYSwgZmNfcG9ydF90ICpmY3BvcnQsCisgICAgaW50IGRvX2xvZ2luKQoreworCS8qIAorCSAqIFdlIG1heSBuZWVkIHRvIHJldHJ5IHRoZSBsb2dpbiwgc28gZG9uJ3QgY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUKKwkgKiBwb3J0IGJ1dCBkbyB0aGUgcmV0cmllcy4KKwkgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpICE9IEZDU19ERVZJQ0VfREVBRCkKKwkJYXRvbWljX3NldCgmZmNwb3J0LT5zdGF0ZSwgRkNTX0RFVklDRV9MT1NUKTsKKworCWlmICghZG9fbG9naW4pCisJCXJldHVybjsKKworCWlmIChmY3BvcnQtPmxvZ2luX3JldHJ5ID09IDApIHsKKwkJZmNwb3J0LT5sb2dpbl9yZXRyeSA9IGhhLT5sb2dpbl9yZXRyeV9jb3VudDsKKwkJc2V0X2JpdChSRUxPR0lOX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCisJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBQb3J0IGxvZ2luIHJldHJ5OiAiCisJCSAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngsICIKKwkJICAgICJpZCA9IDB4JTA0eCByZXRyeSBjbnQ9JWRcbiIsCisJCSAgICBoYS0+aG9zdF9ubywKKwkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzBdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbMV0sCisJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVsyXSwKKwkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzNdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNF0sCisJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVs1XSwKKwkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzZdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbN10sCisJCSAgICBmY3BvcnQtPmxvb3BfaWQsCisJCSAgICBmY3BvcnQtPmxvZ2luX3JldHJ5KSk7CisJfQorfQorCisvKgorICogcWxhMngwMF9tYXJrX2FsbF9kZXZpY2VzX2xvc3QKKyAqCVVwZGF0ZXMgZmNwb3J0IHN0YXRlIHdoZW4gZGV2aWNlIGdvZXMgb2ZmbGluZS4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJZmNwb3J0ID0gcG9ydCBzdHJ1Y3R1cmUgcG9pbnRlci4KKyAqCisgKiBSZXR1cm46CisgKglOb25lLgorICoKKyAqIENvbnRleHQ6CisgKi8KK3ZvaWQKK3FsYTJ4MDBfbWFya19hbGxfZGV2aWNlc19sb3N0KHNjc2lfcWxhX2hvc3RfdCAqaGEpIAoreworCWZjX3BvcnRfdCAqZmNwb3J0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZoYS0+ZmNwb3J0cywgbGlzdCkgeworCQlpZiAoZmNwb3J0LT5wb3J0X3R5cGUgIT0gRkNUX1RBUkdFVCkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIE5vIHBvaW50IGluIG1hcmtpbmcgdGhlIGRldmljZSBhcyBsb3N0LCBpZiB0aGUgZGV2aWNlIGlzCisJCSAqIGFscmVhZHkgREVBRC4KKwkJICovCisJCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgPT0gRkNTX0RFVklDRV9ERUFEKQorCQkJY29udGludWU7CisKKwkJYXRvbWljX3NldCgmZmNwb3J0LT5zdGF0ZSwgRkNTX0RFVklDRV9MT1NUKTsKKwl9Cit9CisKKy8qCisqIHFsYTJ4MDBfbWVtX2FsbG9jCisqICAgICAgQWxsb2NhdGVzIGFkYXB0ZXIgbWVtb3J5LgorKgorKiBSZXR1cm5zOgorKiAgICAgIDAgID0gc3VjY2Vzcy4KKyogICAgICAxICA9IGZhaWx1cmUuCisqLworc3RhdGljIHVpbnQ4X3QKK3FsYTJ4MDBfbWVtX2FsbG9jKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJY2hhcgluYW1lWzE2XTsKKwl1aW50OF90ICAgc3RhdHVzID0gMTsKKwlpbnQJcmV0cnk9IDEwOworCisJZG8geworCQkvKgorCQkgKiBUaGlzIHdpbGwgbG9vcCBvbmx5IG9uY2UgaWYgZXZlcnl0aGluZyBnb2VzIHdlbGwsIGVsc2Ugc29tZQorCQkgKiBudW1iZXIgb2YgcmV0cmllcyB3aWxsIGJlIHBlcmZvcm1lZCB0byBnZXQgYXJvdW5kIGEga2VybmVsCisJCSAqIGJ1ZyB3aGVyZSBhdmFpbGFibGUgbWVtIGlzIG5vdCBhbGxvY2F0ZWQgdW50aWwgYWZ0ZXIgYQorCQkgKiBsaXR0bGUgZGVsYXkgYW5kIGEgcmV0cnkuCisJCSAqLworCQloYS0+cmVxdWVzdF9yaW5nID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCQkgICAgKGhhLT5yZXF1ZXN0X3FfbGVuZ3RoICsgMSkgKiBzaXplb2YocmVxdWVzdF90KSwKKwkJICAgICZoYS0+cmVxdWVzdF9kbWEsIEdGUF9LRVJORUwpOworCQlpZiAoaGEtPnJlcXVlc3RfcmluZyA9PSBOVUxMKSB7CisJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkgICAgIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCAtIHJlcXVlc3RfcmluZ1xuIik7CisKKwkJCXFsYTJ4MDBfbWVtX2ZyZWUoaGEpOworCQkJbXNsZWVwKDEwMCk7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaGEtPnJlc3BvbnNlX3JpbmcgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCisJCSAgICAoaGEtPnJlc3BvbnNlX3FfbGVuZ3RoICsgMSkgKiBzaXplb2YocmVzcG9uc2VfdCksCisJCSAgICAmaGEtPnJlc3BvbnNlX2RtYSwgR0ZQX0tFUk5FTCk7CisJCWlmIChoYS0+cmVzcG9uc2VfcmluZyA9PSBOVUxMKSB7CisJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkgICAgIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCAtIHJlc3BvbnNlX3JpbmdcbiIpOworCisJCQlxbGEyeDAwX21lbV9mcmVlKGhhKTsKKwkJCW1zbGVlcCgxMDApOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWhhLT5naWRfbGlzdCA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgR0lEX0xJU1RfU0laRSwKKwkJICAgICZoYS0+Z2lkX2xpc3RfZG1hLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGhhLT5naWRfbGlzdCA9PSBOVUxMKSB7CisJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkgICAgIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCAtIGdpZF9saXN0XG4iKTsKKworCQkJcWxhMngwMF9tZW1fZnJlZShoYSk7CisJCQltc2xlZXAoMTAwKTsKKworCQkJY29udGludWU7CisJCX0KKworCQloYS0+cmxjX3JzcCA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKKwkJICAgIHNpemVvZihycHRfbHVuX2NtZF9yc3BfdCksICZoYS0+cmxjX3JzcF9kbWEsIEdGUF9LRVJORUwpOworCQlpZiAoaGEtPnJsY19yc3AgPT0gTlVMTCkgeworCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCSJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSBybGMiKTsKKworCQkJcWxhMngwMF9tZW1fZnJlZShoYSk7CisJCQltc2xlZXAoMTAwKTsKKworCQkJY29udGludWU7CisJCX0KKworCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJxbGEyeHh4XyVsZCIsIGhhLT5ob3N0X25vKTsKKwkJaGEtPnNfZG1hX3Bvb2wgPSBkbWFfcG9vbF9jcmVhdGUobmFtZSwgJmhhLT5wZGV2LT5kZXYsCisJCSAgICBETUFfUE9PTF9TSVpFLCA4LCAwKTsKKwkJaWYgKGhhLT5zX2RtYV9wb29sID09IE5VTEwpIHsKKwkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCSAgICAiTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIC0gc19kbWFfcG9vbFxuIik7CisKKwkJCXFsYTJ4MDBfbWVtX2ZyZWUoaGEpOworCQkJbXNsZWVwKDEwMCk7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogZ2V0IGNvbnNpc3RlbnQgbWVtb3J5IGFsbG9jYXRlZCBmb3IgaW5pdCBjb250cm9sIGJsb2NrICovCisJCWhhLT5pbml0X2NiID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsCisJCSAgICAmaGEtPmluaXRfY2JfZG1hKTsKKwkJaWYgKGhhLT5pbml0X2NiID09IE5VTEwpIHsKKwkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCSAgICAiTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIC0gaW5pdF9jYlxuIik7CisKKwkJCXFsYTJ4MDBfbWVtX2ZyZWUoaGEpOworCQkJbXNsZWVwKDEwMCk7CisKKwkJCWNvbnRpbnVlOworCQl9CisJCW1lbXNldChoYS0+aW5pdF9jYiwgMCwgc2l6ZW9mKGluaXRfY2JfdCkpOworCisJCS8qIEdldCBjb25zaXN0ZW50IG1lbW9yeSBhbGxvY2F0ZWQgZm9yIEdldCBQb3J0IERhdGFiYXNlIGNtZCAqLworCQloYS0+aW9kZXNjX3BkID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsCisJCSAgICAmaGEtPmlvZGVzY19wZF9kbWEpOworCQlpZiAoaGEtPmlvZGVzY19wZCA9PSBOVUxMKSB7CisJCQkvKiBlcnJvciAqLworCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJICAgICJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSBpb2Rlc2NfcGRcbiIpOworCisJCQlxbGEyeDAwX21lbV9mcmVlKGhhKTsKKwkJCW1zbGVlcCgxMDApOworCisJCQljb250aW51ZTsKKwkJfQorCQltZW1zZXQoaGEtPmlvZGVzY19wZCwgMCwgUE9SVF9EQVRBQkFTRV9TSVpFKTsKKworCQkvKiBBbGxvY2F0ZSBpb2N0bCByZWxhdGVkIG1lbW9yeS4gKi8KKwkJaWYgKHFsYTJ4MDBfYWxsb2NfaW9jdGxfbWVtKGhhKSkgeworCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJICAgICJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSBpb2N0bF9tZW1cbiIpOworCisJCQlxbGEyeDAwX21lbV9mcmVlKGhhKTsKKwkJCW1zbGVlcCgxMDApOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChxbGEyeDAwX2FsbG9jYXRlX3NwX3Bvb2woaGEpKSB7CisJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkgICAgIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCAtICIKKwkJCSAgICAicWxhMngwMF9hbGxvY2F0ZV9zcF9wb29sKClcbiIpOworCisJCQlxbGEyeDAwX21lbV9mcmVlKGhhKTsKKwkJCW1zbGVlcCgxMDApOworCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgU05TIGNvbW1hbmRzICovCisJCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkgeworCQkJLyogR2V0IGNvbnNpc3RlbnQgbWVtb3J5IGFsbG9jYXRlZCBmb3IgU05TIGNvbW1hbmRzICovCisJCQloYS0+c25zX2NtZCA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKKwkJCSAgICBzaXplb2Yoc3RydWN0IHNuc19jbWRfcGt0KSwgJmhhLT5zbnNfY21kX2RtYSwKKwkJCSAgICBHRlBfS0VSTkVMKTsKKwkJCWlmIChoYS0+c25zX2NtZCA9PSBOVUxMKSB7CisJCQkJLyogZXJyb3IgKi8KKwkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkJICAgICJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSBzbnNfY21kXG4iKTsKKworCQkJCXFsYTJ4MDBfbWVtX2ZyZWUoaGEpOworCQkJCW1zbGVlcCgxMDApOworCisJCQkJY29udGludWU7CisJCQl9CisJCQltZW1zZXQoaGEtPnNuc19jbWQsIDAsIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEdldCBjb25zaXN0ZW50IG1lbW9yeSBhbGxvY2F0ZWQgZm9yIE1TIElPQ0IgKi8KKwkJCWhhLT5tc19pb2NiID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsCisJCQkgICAgJmhhLT5tc19pb2NiX2RtYSk7CisJCQlpZiAoaGEtPm1zX2lvY2IgPT0gTlVMTCkgeworCQkJCS8qIGVycm9yICovCisJCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCSAgICAiTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIC0gbXNfaW9jYlxuIik7CisKKwkJCQlxbGEyeDAwX21lbV9mcmVlKGhhKTsKKwkJCQltc2xlZXAoMTAwKTsKKworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbWVtc2V0KGhhLT5tc19pb2NiLCAwLCBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CisKKwkJCS8qCisJCQkgKiBHZXQgY29uc2lzdGVudCBtZW1vcnkgYWxsb2NhdGVkIGZvciBDVCBTTlMKKwkJCSAqIGNvbW1hbmRzCisJCQkgKi8KKwkJCWhhLT5jdF9zbnMgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBjdF9zbnNfcGt0KSwgJmhhLT5jdF9zbnNfZG1hLAorCQkJICAgIEdGUF9LRVJORUwpOworCQkJaWYgKGhhLT5jdF9zbnMgPT0gTlVMTCkgeworCQkJCS8qIGVycm9yICovCisJCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCSAgICAiTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIC0gY3Rfc25zXG4iKTsKKworCQkJCXFsYTJ4MDBfbWVtX2ZyZWUoaGEpOworCQkJCW1zbGVlcCgxMDApOworCisJCQkJY29udGludWU7CisJCQl9CisJCQltZW1zZXQoaGEtPmN0X3NucywgMCwgc2l6ZW9mKHN0cnVjdCBjdF9zbnNfcGt0KSk7CisJCX0KKworCQkvKiBEb25lIGFsbCBhbGxvY2F0aW9ucyB3aXRob3V0IGFueSBlcnJvci4gKi8KKwkJc3RhdHVzID0gMDsKKworCX0gd2hpbGUgKHJldHJ5LS0gJiYgc3RhdHVzICE9IDApOworCisJaWYgKHN0YXR1cykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiJXMoKTogKioqKiBGQUlMRUQgKioqKlxuIiwgX19mdW5jX18pOworCX0KKworCXJldHVybihzdGF0dXMpOworfQorCisvKgorKiBxbGEyeDAwX21lbV9mcmVlCisqICAgICAgRnJlZXMgYWxsIGFkYXB0ZXIgYWxsb2NhdGVkIG1lbW9yeS4KKyoKKyogSW5wdXQ6CisqICAgICAgaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfbWVtX2ZyZWUoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwl1aW50MzJfdAl0OworCXN0cnVjdCBsaXN0X2hlYWQJKmZjcGwsICpmY3B0ZW1wOworCWZjX3BvcnRfdAkqZmNwb3J0OworCXN0cnVjdCBsaXN0X2hlYWQJKmZjbGwsICpmY2x0ZW1wOworCWZjX2x1bl90CSpmY2x1bjsKKwl1bnNpZ25lZCBsb25nCXd0aW1lOy8qIG1heCB3YWl0IHRpbWUgaWYgbWJ4IGNtZCBpcyBidXN5LiAqLworCisJaWYgKGhhID09IE5VTEwpIHsKKwkJLyogZXJyb3IgKi8KKwkJREVCVUcyKHByaW50aygiJXMoKTogRVJST1IgaW52YWxpZCBoYSBwb2ludGVyLlxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEZyZWUgdGhlIHRhcmdldCBxdWV1ZXMgKi8KKwlmb3IgKHQgPSAwOyB0IDwgTUFYX1RBUkdFVFM7IHQrKykgeworCQlxbGEyeDAwX3RndF9mcmVlKGhhLCB0KTsKKwl9CisKKwkvKiBNYWtlIHN1cmUgYWxsIG90aGVyIHRocmVhZHMgYXJlIHN0b3BwZWQuICovCisJd3RpbWUgPSA2MCAqIEhaOworCXdoaWxlIChoYS0+ZHBjX3dhaXQgJiYgd3RpbWUpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJd3RpbWUgPSBzY2hlZHVsZV90aW1lb3V0KHd0aW1lKTsKKwl9CisKKwkvKiBmcmVlIGlvY3RsIG1lbW9yeSAqLworCXFsYTJ4MDBfZnJlZV9pb2N0bF9tZW0oaGEpOworCisJLyogZnJlZSBzcCBwb29sICovCisJcWxhMngwMF9mcmVlX3NwX3Bvb2woaGEpOworCisJaWYgKGhhLT5zbnNfY21kKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBzbnNfY21kX3BrdCksCisJCSAgICBoYS0+c25zX2NtZCwgaGEtPnNuc19jbWRfZG1hKTsKKworCWlmIChoYS0+Y3Rfc25zKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBjdF9zbnNfcGt0KSwKKwkJICAgIGhhLT5jdF9zbnMsIGhhLT5jdF9zbnNfZG1hKTsKKworCWlmIChoYS0+bXNfaW9jYikKKwkJZG1hX3Bvb2xfZnJlZShoYS0+c19kbWFfcG9vbCwgaGEtPm1zX2lvY2IsIGhhLT5tc19pb2NiX2RtYSk7CisKKwlpZiAoaGEtPmlvZGVzY19wZCkKKwkJZG1hX3Bvb2xfZnJlZShoYS0+c19kbWFfcG9vbCwgaGEtPmlvZGVzY19wZCwgaGEtPmlvZGVzY19wZF9kbWEpOworCisJaWYgKGhhLT5pbml0X2NiKQorCQlkbWFfcG9vbF9mcmVlKGhhLT5zX2RtYV9wb29sLCBoYS0+aW5pdF9jYiwgaGEtPmluaXRfY2JfZG1hKTsKKworCWlmIChoYS0+c19kbWFfcG9vbCkKKwkJZG1hX3Bvb2xfZGVzdHJveShoYS0+c19kbWFfcG9vbCk7CisKKwlpZiAoaGEtPnJsY19yc3ApCisJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCQkgICAgc2l6ZW9mKHJwdF9sdW5fY21kX3JzcF90KSwgaGEtPnJsY19yc3AsCisJCSAgICBoYS0+cmxjX3JzcF9kbWEpOworCisJaWYgKGhhLT5naWRfbGlzdCkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIEdJRF9MSVNUX1NJWkUsIGhhLT5naWRfbGlzdCwKKwkJICAgIGhhLT5naWRfbGlzdF9kbWEpOworCisJaWYgKGhhLT5yZXNwb25zZV9yaW5nKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKKwkJICAgIChoYS0+cmVzcG9uc2VfcV9sZW5ndGggKyAxKSAqIHNpemVvZihyZXNwb25zZV90KSwKKwkJICAgIGhhLT5yZXNwb25zZV9yaW5nLCBoYS0+cmVzcG9uc2VfZG1hKTsKKworCWlmIChoYS0+cmVxdWVzdF9yaW5nKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKKwkJICAgIChoYS0+cmVxdWVzdF9xX2xlbmd0aCArIDEpICogc2l6ZW9mKHJlcXVlc3RfdCksCisJCSAgICBoYS0+cmVxdWVzdF9yaW5nLCBoYS0+cmVxdWVzdF9kbWEpOworCisJaGEtPnNuc19jbWQgPSBOVUxMOworCWhhLT5zbnNfY21kX2RtYSA9IDA7CisJaGEtPmN0X3NucyA9IE5VTEw7CisJaGEtPmN0X3Nuc19kbWEgPSAwOworCWhhLT5tc19pb2NiID0gTlVMTDsKKwloYS0+bXNfaW9jYl9kbWEgPSAwOworCWhhLT5pb2Rlc2NfcGQgPSBOVUxMOworCWhhLT5pb2Rlc2NfcGRfZG1hID0gMDsKKwloYS0+aW5pdF9jYiA9IE5VTEw7CisJaGEtPmluaXRfY2JfZG1hID0gMDsKKworCWhhLT5zX2RtYV9wb29sID0gTlVMTDsKKworCWhhLT5ybGNfcnNwID0gTlVMTDsKKwloYS0+cmxjX3JzcF9kbWEgPSAwOworCWhhLT5naWRfbGlzdCA9IE5VTEw7CisJaGEtPmdpZF9saXN0X2RtYSA9IDA7CisKKwloYS0+cmVzcG9uc2VfcmluZyA9IE5VTEw7CisJaGEtPnJlc3BvbnNlX2RtYSA9IDA7CisJaGEtPnJlcXVlc3RfcmluZyA9IE5VTEw7CisJaGEtPnJlcXVlc3RfZG1hID0gMDsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShmY3BsLCBmY3B0ZW1wLCAmaGEtPmZjcG9ydHMpIHsKKwkJZmNwb3J0ID0gbGlzdF9lbnRyeShmY3BsLCBmY19wb3J0X3QsIGxpc3QpOworCisJCS8qIGZjIGx1bnMgKi8KKwkJbGlzdF9mb3JfZWFjaF9zYWZlKGZjbGwsIGZjbHRlbXAsICZmY3BvcnQtPmZjbHVucykgeworCQkJZmNsdW4gPSBsaXN0X2VudHJ5KGZjbGwsIGZjX2x1bl90LCBsaXN0KTsKKworCQkJbGlzdF9kZWxfaW5pdCgmZmNsdW4tPmxpc3QpOworCQkJa2ZyZWUoZmNsdW4pOworCQl9CisKKwkJLyogZmMgcG9ydHMgKi8KKwkJbGlzdF9kZWxfaW5pdCgmZmNwb3J0LT5saXN0KTsKKwkJa2ZyZWUoZmNwb3J0KTsKKwl9CisJSU5JVF9MSVNUX0hFQUQoJmhhLT5mY3BvcnRzKTsKKworCWlmIChoYS0+ZndfZHVtcCkKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyloYS0+ZndfZHVtcCwgaGEtPmZ3X2R1bXBfb3JkZXIpOworCisJaWYgKGhhLT5md19kdW1wX2J1ZmZlcikKKwkJdmZyZWUoaGEtPmZ3X2R1bXBfYnVmZmVyKTsKKworCWhhLT5md19kdW1wID0gTlVMTDsKKwloYS0+ZndfZHVtcF9yZWFkaW5nID0gMDsKKwloYS0+ZndfZHVtcF9idWZmZXIgPSBOVUxMOworfQorCisvKgorICogcWxhMngwMF9hbGxvY2F0ZV9zcF9wb29sCisgKiAJIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIHRvIGFsbG9jYXRlCisgKiAgCSBtZW1vcnkgZm9yIGxvY2FsIHNyYl90LgorICoKKyAqIElucHV0OgorICoJIGhhICAgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKgorICogQ29udGV4dDoKKyAqICAgICAgS2VybmVsIGNvbnRleHQuCisgKiAKKyAqIE5vdGU6IFNldHMgdGhlIHJlZl9jb3VudCBmb3Igbm9uIE51bGwgc3AgdG8gb25lLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX2FsbG9jYXRlX3NwX3Bvb2woc2NzaV9xbGFfaG9zdF90ICpoYSkgCit7CisJaW50ICAgICAgcnZhbDsKKworCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKKwloYS0+c3JiX21lbXBvb2wgPSBtZW1wb29sX2NyZWF0ZShTUkJfTUlOX1JFUSwgbWVtcG9vbF9hbGxvY19zbGFiLAorCSAgICBtZW1wb29sX2ZyZWVfc2xhYiwgc3JiX2NhY2hlcCk7CisJaWYgKGhhLT5zcmJfbWVtcG9vbCA9PSBOVUxMKSB7CisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlVuYWJsZSB0byBhbGxvY2F0ZSBTUkIgbWVtcG9vbC5cbiIpOworCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9CisJcmV0dXJuIChydmFsKTsKK30KKworLyoKKyAqICBUaGlzIHJvdXRpbmUgZnJlZXMgYWxsIGFkYXB0ZXIgYWxsb2NhdGVkIG1lbW9yeS4KKyAqICAKKyAqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfZnJlZV9zcF9wb29sKCBzY3NpX3FsYV9ob3N0X3QgKmhhKSAKK3sKKwlpZiAoaGEtPnNyYl9tZW1wb29sKSB7CisJCW1lbXBvb2xfZGVzdHJveShoYS0+c3JiX21lbXBvb2wpOworCQloYS0+c3JiX21lbXBvb2wgPSBOVUxMOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHFsYTJ4MDBfZG9fZHBjCisqICAgVGhpcyBrZXJuZWwgdGhyZWFkIGlzIGEgdGFzayB0aGF0IGlzIHNjaGVkdWxlIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgorKiAgIHRvIHBlcmZvcm0gdGhlIGJhY2tncm91bmQgcHJvY2Vzc2luZyBmb3IgaW50ZXJydXB0cy4KKyoKKyogTm90ZXM6CisqIFRoaXMgdGFzayBhbHdheXMgcnVuIGluIHRoZSBjb250ZXh0IG9mIGEga2VybmVsIHRocmVhZC4gIEl0CisqIGlzIGtpY2stb2ZmIGJ5IHRoZSBkcml2ZXIncyBkZXRlY3QgY29kZSBhbmQgc3RhcnRzIHVwCisqIHVwIG9uZSBwZXIgYWRhcHRlci4gSXQgaW1tZWRpYXRlbHkgZ29lcyB0byBzbGVlcCBhbmQgd2FpdHMgZm9yCisqIHNvbWUgZmlicmUgZXZlbnQuICBXaGVuIGVpdGhlciB0aGUgaW50ZXJydXB0IGhhbmRsZXIgb3IKKyogdGhlIHRpbWVyIHJvdXRpbmUgZGV0ZWN0cyBhIGV2ZW50IGl0IHdpbGwgb25lIG9mIHRoZSB0YXNrCisqIGJpdHMgdGhlbiB3YWtlIHVzIHVwLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitxbGEyeDAwX2RvX2RwYyh2b2lkICpkYXRhKQoreworCURFQ0xBUkVfTVVURVhfTE9DS0VEKHNlbSk7CisJc2NzaV9xbGFfaG9zdF90ICpoYTsKKwlmY19wb3J0X3QJKmZjcG9ydDsKKwlvc19sdW5fdCAgICAgICAgKnE7CisJc3JiX3QgICAgICAgICAgICpzcDsKKwl1aW50OF90CQlzdGF0dXM7CisJdW5zaWduZWQgbG9uZwlmbGFncyA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgKnRlbXBsaXN0OworCWludAlkZWFkX2NudCwgb25saW5lX2NudDsKKwlpbnQJcmV0cnlfY21kcyA9IDA7CisJdWludDE2X3QJbmV4dF9sb29waWQ7CisJaW50IHQ7CisJb3NfdGd0X3QgKnRxOworCisJaGEgPSAoc2NzaV9xbGFfaG9zdF90ICopZGF0YTsKKworCWxvY2tfa2VybmVsKCk7CisKKwlkYWVtb25pemUoIiVzX2RwYyIsIGhhLT5ob3N0X3N0cik7CisJYWxsb3dfc2lnbmFsKFNJR0hVUCk7CisKKwloYS0+ZHBjX3dhaXQgPSAmc2VtOworCisJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMjApOworCisJdW5sb2NrX2tlcm5lbCgpOworCisJY29tcGxldGUoJmhhLT5kcGNfaW5pdGVkKTsKKworCXdoaWxlICgxKSB7CisJCURFQlVHMyhwcmludGsoInFsYTJ4MDA6IERQQyBoYW5kbGVyIHNsZWVwaW5nXG4iKSk7CisKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc2VtKSkKKwkJCWJyZWFrOworCisJCWlmIChoYS0+ZHBjX3Nob3VsZF9kaWUpCisJCQlicmVhazsKKworCQlERUJVRzMocHJpbnRrKCJxbGEyeDAwOiBEUEMgaGFuZGxlciB3YWtpbmcgdXBcbiIpKTsKKworCQkvKiBJbml0aWFsaXphdGlvbiBub3QgeWV0IGZpbmlzaGVkLiBEb24ndCBkbyBhbnl0aGluZyB5ZXQuICovCisJCWlmICghaGEtPmZsYWdzLmluaXRfZG9uZSB8fCBoYS0+ZHBjX2FjdGl2ZSkKKwkJCWNvbnRpbnVlOworCisJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogRFBDIGhhbmRsZXJcbiIsIGhhLT5ob3N0X25vKSk7CisKKwkJaGEtPmRwY19hY3RpdmUgPSAxOworCisJCWlmICghbGlzdF9lbXB0eSgmaGEtPmRvbmVfcXVldWUpKQorCQkJcWxhMngwMF9kb25lKGhhKTsKKworCQkvKiBQcm9jZXNzIGNvbW1hbmRzIGluIHJldHJ5IHF1ZXVlICovCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUE9SVF9SRVNUQVJUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSB7CisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogRFBDIGNoZWNraW5nIHJldHJ5X3EuICIKKwkJCSAgICAidG90YWw9JWRcbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8sIGhhLT5yZXRyeV9xX2NudCkpOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCQkJZGVhZF9jbnQgPSBvbmxpbmVfY250ID0gMDsKKwkJCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0LCB0ZW1wbGlzdCwgJmhhLT5yZXRyeV9xdWV1ZSkgeworCQkJCXNwID0gbGlzdF9lbnRyeShsaXN0LCBzcmJfdCwgbGlzdCk7CisJCQkJcSA9IHNwLT5sdW5fcXVldWU7CisJCQkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBwaWQ9JWxkIHNwPSVwLCAiCisJCQkJICAgICJzcGZsYWdzPTB4JXgsIHFfZmxhZz0gMHglbHhcbiIsCisJCQkJICAgIGhhLT5ob3N0X25vLCBzcC0+Y21kLT5zZXJpYWxfbnVtYmVyLCBzcCwKKwkJCQkgICAgc3AtPmZsYWdzLCBxLT5xX2ZsYWcpKTsKKworCQkJCWlmIChxID09IE5VTEwpCisJCQkJCWNvbnRpbnVlOworCQkJCWZjcG9ydCA9IHEtPmZjbHVuLT5mY3BvcnQ7CisKKwkJCQlpZiAoYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpID09CisJCQkJICAgIEZDU19ERVZJQ0VfREVBRCB8fAorCQkJCSAgICBhdG9taWNfcmVhZCgmZmNwb3J0LT5oYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ERUFEKSB7CisKKwkJCQkJX19kZWxfZnJvbV9yZXRyeV9xdWV1ZShoYSwgc3ApOworCQkJCQlzcC0+Y21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJCQkJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPmhhLT5sb29wX3N0YXRlKSA9PQorCQkJCQkgICAgTE9PUF9ET1dOKSAKKwkJCQkJCXNwLT5lcnJfaWQgPSBTUkJfRVJSX0xPT1A7CisJCQkJCWVsc2UKKwkJCQkJCXNwLT5lcnJfaWQgPSBTUkJfRVJSX1BPUlQ7CisJCQkJCXNwLT5jbWQtPmhvc3Rfc2NyaWJibGUgPQorCQkJCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgTlVMTDsKKwkJCQkJX19hZGRfdG9fZG9uZV9xdWV1ZShoYSwgc3ApOworCQkJCQlkZWFkX2NudCsrOworCQkJCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpICE9CisJCQkJICAgIEZDU19ERVZJQ0VfTE9TVCkgeworCisJCQkJCV9fZGVsX2Zyb21fcmV0cnlfcXVldWUoaGEsIHNwKTsKKwkJCQkJc3AtPmNtZC0+cmVzdWx0ID0gRElEX0JVU19CVVNZIDw8IDE2OworCQkJCQlzcC0+Y21kLT5ob3N0X3NjcmliYmxlID0KKwkJCQkJICAgICh1bnNpZ25lZCBjaGFyICopIE5VTEw7CisJCQkJCV9fYWRkX3RvX2RvbmVfcXVldWUoaGEsIHNwKTsKKwkJCQkJb25saW5lX2NudCsrOworCQkJCX0KKwkJCX0gLyogbGlzdF9mb3JfZWFjaF9zYWZlKCkgKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKKworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IGRvbmUgcHJvY2Vzc2luZyByZXRyeSBxdWV1ZSAiCisJCQkgICAgIi0gZGVhZD0lZCwgb25saW5lPSVkXG4gIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgZGVhZF9jbnQsIG9ubGluZV9jbnQpKTsKKwkJfQorCisJCS8qIFByb2Nlc3MgY29tbWFuZHMgaW4gc2NzaSByZXRyeSBxdWV1ZSAqLworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNDU0lfUkVTVEFSVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkgeworCQkJLyoKKwkJCSAqIEFueSByZXF1ZXN0cyB3ZSB3YW50IHRvIGRlbGF5IGZvciBzb21lIHBlcmlvZCBpcyBwdXQKKwkJCSAqIGluIHRoZSBzY3NpIHJldHJ5IHF1ZXVlIHdpdGggYSBkZWxheSBhZGRlZC4gVGhlCisJCQkgKiB0aW1lciB3aWxsIHNjaGVkdWxlIGEgInNjc2lfcmVzdGFydF9uZWVkZWQiIGV2ZXJ5IAorCQkJICogc2Vjb25kIGFzIGxvbmcgYXMgdGhlcmUgYXJlIHJlcXVlc3RzIGluIHRoZSBzY3NpCisJCQkgKiBxdWV1ZS4gCisJCQkgKi8KKwkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBEUEMgY2hlY2tpbmcgc2NzaSAiCisJCQkgICAgInJldHJ5X3EudG90YWw9JWRcbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8sIGhhLT5zY3NpX3JldHJ5X3FfY250KSk7CisKKwkJCW9ubGluZV9jbnQgPSAwOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKKwkJCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0LCB0ZW1wbGlzdCwKKwkJCSAgICAmaGEtPnNjc2lfcmV0cnlfcXVldWUpIHsKKworCQkJCXNwID0gbGlzdF9lbnRyeShsaXN0LCBzcmJfdCwgbGlzdCk7CisJCQkJcSA9IHNwLT5sdW5fcXVldWU7CisJCQkJdHEgPSBzcC0+dGd0X3F1ZXVlOworCisJCQkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBzY3NpX3JldHJ5X3E6ICIKKwkJCQkgICAgInBpZD0lbGQgc3A9JXAsIHNwZmxhZ3M9MHgleCwgIgorCQkJCSAgICAicV9mbGFnPSAweCVseCxxX3N0YXRlPSVkXG4iLAorCQkJCSAgICBoYS0+aG9zdF9ubywgc3AtPmNtZC0+c2VyaWFsX251bWJlciwKKwkJCQkgICAgc3AsIHNwLT5mbGFncywgcS0+cV9mbGFnLCBxLT5xX3N0YXRlKSk7CisKKwkJCQkvKiBXYXMgdGhpcyBsdW4gc3VzcGVuZGVkICovCisJCQkJaWYgKHEtPnFfc3RhdGUgIT0gTFVOX1NUQVRFX1dBSVQpIHsKKwkJCQkJb25saW5lX2NudCsrOworCQkJCQlfX2RlbF9mcm9tX3Njc2lfcmV0cnlfcXVldWUoaGEsIHNwKTsKKworCQkJCQlpZiAodGVzdF9iaXQoVFFGX1JFVFJZX0NNRFMsCisJCQkJCSAgICAmdHEtPmZsYWdzKSkgeworCQkJCQkJcWxhMngwMF9leHRlbmRfdGltZW91dChzcC0+Y21kLAorCQkJCQkJICAgIChzcC0+Y21kLT50aW1lb3V0X3Blcl9jb21tYW5kIC8gSFopIC0gUUxBX0NNRF9USU1FUl9ERUxUQSk7CisJCQkJCQlfX2FkZF90b19wZW5kaW5nX3F1ZXVlKGhhLCBzcCk7CisJCQkJCQlyZXRyeV9jbWRzKys7CisJCQkJCX0gZWxzZQorCQkJCQkJX19hZGRfdG9fcmV0cnlfcXVldWUoaGEsIHNwKTsKKwkJCQl9CisKKwkJCQkvKiBXYXMgdGhpcyBjb21tYW5kIHN1c3BlbmRlZCBmb3IgTiBzZWNzICovCisJCQkJaWYgKHNwLT5kZWxheSAhPSAwKSB7CisJCQkJCXNwLT5kZWxheS0tOworCQkJCQlpZiAoc3AtPmRlbGF5ID09IDApIHsKKwkJCQkJCW9ubGluZV9jbnQrKzsKKwkJCQkJCV9fZGVsX2Zyb21fc2NzaV9yZXRyeV9xdWV1ZSgKKwkJCQkJCSAgICBoYSwgc3ApOworCQkJCQkJX19hZGRfdG9fcmV0cnlfcXVldWUoaGEsc3ApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCisJCQkvKiBDbGVhciBhbGwgVGFyZ2V0IFVuc3VzcGVuZGVkIGJpdHMgKi8KKwkJCWZvciAodCA9IDA7IHQgPCBoYS0+bWF4X3RhcmdldHM7IHQrKykgeworCQkJCWlmICgodHEgPSBoYS0+b3RndFt0XSkgPT0gTlVMTCkKKwkJCQkJY29udGludWU7CisKKwkJCQlpZiAodGVzdF9iaXQoVFFGX1JFVFJZX0NNRFMsICZ0cS0+ZmxhZ3MpKQorCQkJCQljbGVhcl9iaXQoVFFGX1JFVFJZX0NNRFMsICZ0cS0+ZmxhZ3MpOworCQkJfQorCQkJaWYgKHJldHJ5X2NtZHMpCisJCQkJcWxhMngwMF9uZXh0KGhhKTsKKworCQkJREVCVUcoaWYgKG9ubGluZV9jbnQgPiAwKSkKKwkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBkcGMoKSBmb3VuZCBzY3NpIHJlcXMgdG8gIgorCQkJICAgICJyZXN0YXJ0PSAlZFxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgb25saW5lX2NudCkpOworCQl9CisKKwkJaWYgKGhhLT5mbGFncy5tYm94X2J1c3kpIHsKKwkJCWlmICghbGlzdF9lbXB0eSgmaGEtPmRvbmVfcXVldWUpKQorCQkJCXFsYTJ4MDBfZG9uZShoYSk7CisKKwkJCWhhLT5kcGNfYWN0aXZlID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncykpIHsKKworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IGRwYzogc2NoZWQgIgorCQkJICAgICJxbGEyeDAwX2Fib3J0X2lzcCBoYSA9ICVwXG4iLAorCQkJICAgIGhhLT5ob3N0X25vLCBoYSkpOworCQkJaWYgKCEodGVzdF9hbmRfc2V0X2JpdChBQk9SVF9JU1BfQUNUSVZFLAorCQkJICAgICZoYS0+ZHBjX2ZsYWdzKSkpIHsKKworCQkJCWlmIChxbGEyeDAwX2Fib3J0X2lzcChoYSkpIHsKKwkJCQkJLyogZmFpbGVkLiByZXRyeSBsYXRlciAqLworCQkJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsCisJCQkJCSAgICAmaGEtPmRwY19mbGFncyk7CisJCQkJfQorCQkJCWNsZWFyX2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmaGEtPmRwY19mbGFncyk7CisJCQl9CisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogZHBjOiBxbGEyeDAwX2Fib3J0X2lzcCBlbmRcbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJfQorCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUkVTRVRfTUFSS0VSX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpICYmCisJCSAgICAoISh0ZXN0X2FuZF9zZXRfYml0KFJFU0VUX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpKSkpIHsKKworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IHFsYTJ4MDBfcmVzZXRfbWFya2VyKClcbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKworCQkJcWxhMngwMF9yc3RfYWVuKGhhKTsKKwkJCWNsZWFyX2JpdChSRVNFVF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJfQorCisJCS8qIFJldHJ5IGVhY2ggZGV2aWNlIHVwIHRvIGxvZ2luIHJldHJ5IGNvdW50ICovCisJCWlmICgodGVzdF9hbmRfY2xlYXJfYml0KFJFTE9HSU5fTkVFREVELCAmaGEtPmRwY19mbGFncykpICYmCisJCSAgICAhdGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncykgJiYKKwkJICAgIGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9ET1dOKSB7CisKKwkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBxbGEyeDAwX3BvcnRfbG9naW4oKVxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubykpOworCisJCQluZXh0X2xvb3BpZCA9IDA7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJmhhLT5mY3BvcnRzLCBsaXN0KSB7CisJCQkJaWYgKGZjcG9ydC0+cG9ydF90eXBlICE9IEZDVF9UQVJHRVQpCisJCQkJCWNvbnRpbnVlOworCisJCQkJLyoKKwkJCQkgKiBJZiB0aGUgcG9ydCBpcyBub3QgT05MSU5FIHRoZW4gdHJ5IHRvIGxvZ2luCisJCQkJICogdG8gaXQgaWYgd2UgaGF2ZW4ndCBydW4gb3V0IG9mIHJldHJpZXMuCisJCQkJICovCisJCQkJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSAhPSBGQ1NfT05MSU5FICYmCisJCQkJICAgIGZjcG9ydC0+bG9naW5fcmV0cnkpIHsKKworCQkJCQlmY3BvcnQtPmxvZ2luX3JldHJ5LS07CisJCQkJCWlmIChmY3BvcnQtPmZsYWdzICYgRkNGX0ZBQlJJQ19ERVZJQ0UpIHsKKwkJCQkJCWlmIChmY3BvcnQtPmZsYWdzICYKKwkJCQkJCSAgICBGQ0ZfVEFQRV9QUkVTRU5UKQorCQkJCQkJCXFsYTJ4MDBfZmFicmljX2xvZ291dCgKKwkJCQkJCQkgICAgaGEsCisJCQkJCQkJICAgIGZjcG9ydC0+bG9vcF9pZCk7CisJCQkJCQlzdGF0dXMgPSBxbGEyeDAwX2ZhYnJpY19sb2dpbigKKwkJCQkJCSAgICBoYSwgZmNwb3J0LCAmbmV4dF9sb29waWQpOworCQkJCQl9IGVsc2UKKwkJCQkJCXN0YXR1cyA9CisJCQkJCQkgICAgcWxhMngwMF9sb2NhbF9kZXZpY2VfbG9naW4oCisJCQkJCQkJaGEsIGZjcG9ydC0+bG9vcF9pZCk7CisKKwkJCQkJaWYgKHN0YXR1cyA9PSBRTEFfU1VDQ0VTUykgeworCQkJCQkJZmNwb3J0LT5vbGRfbG9vcF9pZCA9IGZjcG9ydC0+bG9vcF9pZDsKKworCQkJCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IHBvcnQgbG9naW4gT0s6IGxvZ2dlZCBpbiBJRCAweCV4XG4iLAorCQkJCQkJICAgIGhhLT5ob3N0X25vLCBmY3BvcnQtPmxvb3BfaWQpKTsKKwkJCQkJCQorCQkJCQkJZmNwb3J0LT5wb3J0X2xvZ2luX3JldHJ5X2NvdW50ID0KKwkJCQkJCSAgICBoYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50ICogUE9SVF9SRVRSWV9USU1FOworCQkJCQkJYXRvbWljX3NldCgmZmNwb3J0LT5zdGF0ZSwgRkNTX09OTElORSk7CisJCQkJCQlhdG9taWNfc2V0KCZmY3BvcnQtPnBvcnRfZG93bl90aW1lciwKKwkJCQkJCSAgICBoYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50ICogUE9SVF9SRVRSWV9USU1FKTsKKworCQkJCQkJZmNwb3J0LT5sb2dpbl9yZXRyeSA9IDA7CisJCQkJCX0gZWxzZSBpZiAoc3RhdHVzID09IDEpIHsKKwkJCQkJCXNldF9iaXQoUkVMT0dJTl9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQkJCS8qIHJldHJ5IHRoZSBsb2dpbiBhZ2FpbiAqLworCQkJCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IFJldHJ5aW5nICVkIGxvZ2luIGFnYWluIGxvb3BfaWQgMHgleFxuIiwKKwkJCQkJCSAgICBoYS0+aG9zdF9ubywKKwkJCQkJCSAgICBmY3BvcnQtPmxvZ2luX3JldHJ5LCBmY3BvcnQtPmxvb3BfaWQpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZjcG9ydC0+bG9naW5fcmV0cnkgPSAwOworCQkJCQl9CisJCQkJfQorCQkJCWlmICh0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcWxhMngwMF9wb3J0X2xvZ2luIC0gZW5kXG4iLAorCQkJICAgIGhhLT5ob3N0X25vKSk7CisJCX0KKworCQlpZiAoKHRlc3RfYml0KExPR0lOX1JFVFJZX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSAmJgorCQkgICAgYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04pIHsKKworCQkJY2xlYXJfYml0KExPR0lOX1JFVFJZX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IHFsYTJ4MDBfbG9naW5fcmV0cnkoKVxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubykpOworCQkJCQorCQkJc2V0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IHFsYTJ4MDBfbG9naW5fcmV0cnkgLSBlbmRcbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJfQorCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncykpIHsKKworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IHFsYTJ4MDBfbG9vcF9yZXN5bmMoKVxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubykpOworCisJCQlpZiAoISh0ZXN0X2FuZF9zZXRfYml0KExPT1BfUkVTWU5DX0FDVElWRSwKKwkJCSAgICAmaGEtPmRwY19mbGFncykpKSB7CisKKwkJCQlxbGEyeDAwX2xvb3BfcmVzeW5jKGhhKTsKKworCQkJCWNsZWFyX2JpdChMT09QX1JFU1lOQ19BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCX0KKworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IHFsYTJ4MDBfbG9vcF9yZXN5bmMgLSBlbmRcbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJfQorCisKKwkJaWYgKHRlc3RfYml0KFJFU1RBUlRfUVVFVUVTX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSB7CisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcWxhMngwMF9yZXN0YXJ0X3F1ZXVlcygpXG4iLAorCQkJICAgIGhhLT5ob3N0X25vKSk7CisKKwkJCXFsYTJ4MDBfcmVzdGFydF9xdWV1ZXMoaGEsIDApOworCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcWxhMngwMF9yZXN0YXJ0X3F1ZXVlcyAtIGVuZFxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubykpOworCQl9CisKKwkJaWYgKHRlc3RfYml0KEFCT1JUX1FVRVVFU19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkgeworCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcWxhMngwMF9hYm9ydF9xdWV1ZXMoKVxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubykpOworCQkJCQorCQkJcWxhMngwMF9hYm9ydF9xdWV1ZXMoaGEsIDApOworCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcWxhMngwMF9hYm9ydF9xdWV1ZXMgLSBlbmRcbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJfQorCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRkNQT1JUX1JFU0NBTl9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkgeworCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogUmVzY2FuIGZsYWdnZWQgZmNwb3J0cy4uLlxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubykpOworCisJCQlxbGEyeDAwX3Jlc2Nhbl9mY3BvcnRzKGhhKTsKKworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IFJlc2NhbiBmbGFnZ2VkIGZjcG9ydHMuLi4iCisJCQkgICAgImVuZC5cbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJfQorCisKKwkJaWYgKCFoYS0+aW50ZXJydXB0c19vbikKKwkJCXFsYTJ4MDBfZW5hYmxlX2ludHJzKGhhKTsKKworCQlpZiAoIWxpc3RfZW1wdHkoJmhhLT5kb25lX3F1ZXVlKSkKKwkJCXFsYTJ4MDBfZG9uZShoYSk7CisKKwkJaGEtPmRwY19hY3RpdmUgPSAwOworCX0gLyogRW5kIG9mIHdoaWxlKDEpICovCisKKwlERUJVRyhwcmludGsoInNjc2koJWxkKTogRFBDIGhhbmRsZXIgZXhpdGluZ1xuIiwgaGEtPmhvc3Rfbm8pKTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgbm9ib2R5IHRyaWVzIHRvIHdha2UgdXMgdXAgYWdhaW4uCisJICovCisJaGEtPmRwY193YWl0ID0gTlVMTDsKKwloYS0+ZHBjX2FjdGl2ZSA9IDA7CisKKwljb21wbGV0ZV9hbmRfZXhpdCgmaGEtPmRwY19leGl0ZWQsIDApOworfQorCisvKgorICogIHFsYTJ4MDBfYWJvcnRfcXVldWVzCisgKglBYm9ydCBhbGwgY29tbWFuZHMgb24gcXVldWVzIG9uIGRldmljZQorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKgorICogQ29udGV4dDoKKyAqCUludGVycnVwdCBjb250ZXh0LgorICovCit2b2lkCitxbGEyeDAwX2Fib3J0X3F1ZXVlcyhzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50OF90IGRvbmVxZmxnKSAKK3sKKworCXNyYl90ICAgICAgICpzcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCAqdGVtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY2xlYXJfYml0KEFCT1JUX1FVRVVFU19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKworCS8qIFJldHVybiBhbGwgY29tbWFuZHMgZGV2aWNlIHF1ZXVlcy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmxpc3RfbG9jayxmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3QsIHRlbXAsICZoYS0+cGVuZGluZ19xdWV1ZSkgeworCQlzcCA9IGxpc3RfZW50cnkobGlzdCwgc3JiX3QsIGxpc3QpOworCisJCWlmIChzcC0+ZmxhZ3MgJiBTUkJfQUJPUlRFRCkKKwkJCWNvbnRpbnVlOworCisJCS8qIFJlbW92ZSBzcmIgZnJvbSBMVU4gcXVldWUuICovCisJCV9fZGVsX2Zyb21fcGVuZGluZ19xdWV1ZShoYSwgc3ApOworCisJCS8qIFNldCBlbmRpbmcgc3RhdHVzLiAqLworCQlzcC0+Y21kLT5yZXN1bHQgPSBESURfQlVTX0JVU1kgPDwgMTY7CisKKwkJX19hZGRfdG9fZG9uZV9xdWV1ZShoYSwgc3ApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+bGlzdF9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisqICBxbGEyeDAwX3JzdF9hZW4KKyogICAgICBQcm9jZXNzZXMgYXN5bmNocm9ub3VzIHJlc2V0LgorKgorKiBJbnB1dDoKKyogICAgICBoYSAgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfcnN0X2FlbihzY3NpX3FsYV9ob3N0X3QgKmhhKSAKK3sKKwlpZiAoaGEtPmZsYWdzLm9ubGluZSAmJiAhaGEtPmZsYWdzLnJlc2V0X2FjdGl2ZSAmJgorCSAgICAhYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpICYmCisJICAgICEodGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpKSkgeworCQlkbyB7CisJCQljbGVhcl9iaXQoUkVTRVRfTUFSS0VSX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCisJCQkvKgorCQkJICogSXNzdWUgbWFya2VyIGNvbW1hbmQgb25seSB3aGVuIHdlIGFyZSBnb2luZyB0byBzdGFydAorCQkJICogdGhlIEkvTy4KKwkJCSAqLworCQkJaGEtPm1hcmtlcl9uZWVkZWQgPSAxOworCQl9IHdoaWxlICghYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpICYmCisJCSAgICAodGVzdF9iaXQoUkVTRVRfTUFSS0VSX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSk7CisJfQorfQorCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBhbGxvY2F0ZSBTUCBmcm9tIHRoZSBmcmVlIHF1ZXVlCisgKiBpbnB1dDoKKyAqICAgICAgICBzY3NpX3FsYV9ob3N0X3QgKgorICogb3V0cHV0OgorICogICAgICAgIHNyYl90ICogb3IgTlVMTAorICovCitzdGF0aWMgc3JiX3QgKgorcWxhMngwMF9nZXRfbmV3X3NwKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJc3JiX3QgKnNwOworCisJc3AgPSBtZW1wb29sX2FsbG9jKGhhLT5zcmJfbWVtcG9vbCwgR0ZQX0FUT01JQyk7CisJaWYgKHNwKQorCQlhdG9taWNfc2V0KCZzcC0+cmVmX2NvdW50LCAxKTsKKwlyZXR1cm4gKHNwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgcWxhMngwMF90aW1lcgorKgorKiBEZXNjcmlwdGlvbjoKKyogICBPbmUgc2Vjb25kIHRpbWVyCisqCisqIENvbnRleHQ6IEludGVycnVwdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfdGltZXIoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQJCXQsbDsKKwl1bnNpZ25lZCBsb25nCWNwdV9mbGFncyA9IDA7CisJZmNfcG9ydF90CSpmY3BvcnQ7CisJb3NfbHVuX3QgKmxxOworCW9zX3RndF90ICp0cTsKKwlpbnQJCXN0YXJ0X2RwYyA9IDA7CisJaW50CQlpbmRleDsKKwlzcmJfdAkJKnNwOworCisJLyoKKwkgKiBXZSB0cnkgYW5kIHJlc3RhcnQgYW55IHJlcXVlc3QgaW4gdGhlIHJldHJ5IHF1ZXVlIGV2ZXJ5IHNlY29uZC4KKwkgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmhhLT5yZXRyeV9xdWV1ZSkpIHsKKwkJc2V0X2JpdChQT1JUX1JFU1RBUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCXN0YXJ0X2RwYysrOworCX0KKworCS8qCisJICogV2UgdHJ5IGFuZCByZXN0YXJ0IGFueSByZXF1ZXN0IGluIHRoZSBzY3NpX3JldHJ5IHF1ZXVlIGV2ZXJ5IHNlY29uZC4KKwkgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmhhLT5zY3NpX3JldHJ5X3F1ZXVlKSkgeworCQlzZXRfYml0KFNDU0lfUkVTVEFSVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJc3RhcnRfZHBjKys7CisJfQorCisJLyoKKwkgKiBQb3J0cyAtIFBvcnQgZG93biB0aW1lci4KKwkgKgorCSAqIFdoZW5ldmVyLCBhIHBvcnQgaXMgaW4gdGhlIExPU1Qgc3RhdGUgd2Ugc3RhcnQgZGVjcmVtZW50aW5nIGl0cyBwb3J0CisJICogZG93biB0aW1lciBldmVyeSBzZWNvbmQgdW50aWwgaXQgcmVhY2hlcyB6ZXJvLiBPbmNlICBpdCByZWFjaGVzIHplcm8KKwkgKiB0aGUgcG9ydCBpdCBtYXJrZWQgREVBRC4gCisJICovCisJdCA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZoYS0+ZmNwb3J0cywgbGlzdCkgeworCQlpZiAoZmNwb3J0LT5wb3J0X3R5cGUgIT0gRkNUX1RBUkdFVCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgPT0gRkNTX0RFVklDRV9MT1NUKSB7CisKKwkJCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5wb3J0X2Rvd25fdGltZXIpID09IDApCisJCQkJY29udGludWU7CisKKwkJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZmY3BvcnQtPnBvcnRfZG93bl90aW1lcikgIT0gMCkgCisJCQkJYXRvbWljX3NldCgmZmNwb3J0LT5zdGF0ZSwgRkNTX0RFVklDRV9ERUFEKTsKKwkJCQorCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IGZjcG9ydC0lZCAtIHBvcnQgcmV0cnkgY291bnQ6ICIKKwkJCSAgICAiJWQgcmVtYWlubmluZ1xuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywKKwkJCSAgICB0LCBhdG9taWNfcmVhZCgmZmNwb3J0LT5wb3J0X2Rvd25fdGltZXIpKSk7CisJCX0KKwkJdCsrOworCX0gLyogRW5kIG9mIGZvciBmY3BvcnQgICovCisKKwkvKgorCSAqIExVTlMgLSBsdW4gc3VzcGVuZCB0aW1lci4KKwkgKgorCSAqIFdoZW5ldmVyLCBhIGx1biBpcyBzdXNwZW5kZWQgdGhlIHRpbWVyIHN0YXJ0cyBkZWNyZW1lbnRpbmcgaXRzCisJICogc3VzcGVuZCB0aW1lciBldmVyeSBzZWNvbmQgdW50aWwgaXQgcmVhY2hlcyB6ZXJvLiBPbmNlICBpdCByZWFjaGVzCisJICogemVybyB0aGUgbHVuIHJldHJ5IGNvdW50IGlzIGRlY3JlbWVudGVkLiAKKwkgKi8KKworCS8qCisJICogRklYTUUoZGcpIC0gTmVlZCB0byBjb252ZXJ0IHRoaXMgbGluZWFyIHNlYXJjaCBvZiBsdW5zIGludG8gYSBzZWFyY2gKKwkgKiBvZiBhIGxpc3Qgb2Ygc3VzcGVuZGVkIGx1bnMuCisJICovCisJZm9yICh0ID0gMDsgdCA8IGhhLT5tYXhfdGFyZ2V0czsgdCsrKSB7CisJCWlmICgodHEgPSBoYS0+b3RndFt0XSkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWZvciAobCA9IDA7IGwgPCBoYS0+bWF4X2x1bnM7IGwrKykgeworCQkJaWYgKChscSA9IChvc19sdW5fdCAqKSB0cS0+b2x1bltsXSkgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxxLT5xX2xvY2ssIGNwdV9mbGFncyk7CisJCQlpZiAobHEtPnFfc3RhdGUgPT0gTFVOX1NUQVRFX1dBSVQgJiYKKwkJCQlhdG9taWNfcmVhZCgmbHEtPnFfdGltZXIpICE9IDApIHsKKworCQkJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZscS0+cV90aW1lcikgIT0gMCkgeworCQkJCQkvKgorCQkJCQkgKiBBIGRlbGF5IHNob3VsZCBpbW1lZGlhdGVseQorCQkJCQkgKiB0cmFuc2l0aW9uIHRvIGEgUkVBRFkgc3RhdGUKKwkJCQkJICovCisJCQkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTFVOX0VYRUNfREVMQVlFRCwKKwkJCQkJICAgICZscS0+cV9mbGFnKSkgeworCQkJCQkJbHEtPnFfc3RhdGUgPSBMVU5fU1RBVEVfUkVBRFk7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQlscS0+cV9jb3VudCsrOworCQkJCQkJaWYgKGxxLT5xX2NvdW50ID09IGxxLT5xX21heCkKKwkJCQkJCQlscS0+cV9zdGF0ZSA9CisJCQkJCQkJICAgIExVTl9TVEFURV9USU1FT1VUOworCQkJCQkJZWxzZQorCQkJCQkJCWxxLT5xX3N0YXRlID0KKwkJCQkJCQkgICAgTFVOX1NUQVRFX1JVTjsKKwkJCQkJfQorCQkJCX0KKwkJCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IGx1biVkIC0gdGltZXIgJWQsICIKKwkJCQkgICAgImNvdW50PSVkLCBtYXg9JWQsIHN0YXRlPSVkXG4iLAorCQkJCSAgICBoYS0+aG9zdF9ubywKKwkJCQkgICAgbCwKKwkJCQkgICAgYXRvbWljX3JlYWQoJmxxLT5xX3RpbWVyKSwKKwkJCQkgICAgbHEtPnFfY291bnQsIGxxLT5xX21heCwgbHEtPnFfc3RhdGUpKTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxxLT5xX2xvY2ssIGNwdV9mbGFncyk7CisJCX0gLyogRW5kIG9mIGZvciBsdW5zICAqLworCX0gLyogRW5kIG9mIGZvciB0YXJnZXRzICAqLworCisJLyogTG9vcCBkb3duIGhhbmRsZXIuICovCisJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSA+IDAgJiYKKwkgICAgISh0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmaGEtPmRwY19mbGFncykpICYmIGhhLT5mbGFncy5vbmxpbmUpIHsKKworCQlpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpID09CisJCSAgICBoYS0+bG9vcF9kb3duX2Fib3J0X3RpbWUpIHsKKworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IExvb3AgRG93biAtIGFib3J0aW5nIHRoZSAiCisJCQkgICAgInF1ZXVlcyBiZWZvcmUgdGltZSBleHBpcmVcbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKworCQkJaWYgKCFJU19RTEEyMTAwKGhhKSAmJiBoYS0+bGlua19kb3duX3RpbWVvdXQpCisJCQkJYXRvbWljX3NldCgmaGEtPmxvb3Bfc3RhdGUsIExPT1BfREVBRCk7IAorCisJCQkvKiBTY2hlZHVsZSBhbiBJU1AgYWJvcnQgdG8gcmV0dXJuIGFueSB0YXBlIGNvbW1hbmRzLiAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkJZm9yIChpbmRleCA9IDE7IGluZGV4IDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTOworCQkJICAgIGluZGV4KyspIHsKKwkJCQlzcCA9IGhhLT5vdXRzdGFuZGluZ19jbWRzW2luZGV4XTsKKwkJCQlpZiAoIXNwKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoIShzcC0+ZmNsdW4tPmZjcG9ydC0+ZmxhZ3MgJgorCQkJCSAgICBGQ0ZfVEFQRV9QUkVTRU5UKSkKKwkJCQkJY29udGludWU7CisKKwkJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJCQlzZXRfYml0KEFCT1JUX1FVRVVFU19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCXN0YXJ0X2RwYysrOworCQl9CisKKwkJLyogaWYgdGhlIGxvb3AgaGFzIGJlZW4gZG93biBmb3IgNCBtaW51dGVzLCByZWluaXQgYWRhcHRlciAqLworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaGEtPmxvb3BfZG93bl90aW1lcikgIT0gMCkgeworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IExvb3AgZG93biBleGNlZWQgNCBtaW5zIC0gIgorCQkJICAgICJyZXN0YXJ0aW5nIHF1ZXVlcy5cbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKworCQkJc2V0X2JpdChSRVNUQVJUX1FVRVVFU19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCXN0YXJ0X2RwYysrOworCisJCQlpZiAoIShoYS0+ZGV2aWNlX2ZsYWdzICYgREZMR19OT19DQUJMRSkpIHsKKwkJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogTG9vcCBkb3duIC0gIgorCQkJCSAgICAiYWJvcnRpbmcgSVNQLlxuIiwKKwkJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkJICAgICJMb29wIGRvd24gLSBhYm9ydGluZyBJU1AuXG4iKTsKKworCQkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQkJfQorCQl9CisJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogTG9vcCBEb3duIC0gc2Vjb25kcyByZW1haW5uaW5nICVkXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sCisJCSAgICBhdG9taWNfcmVhZCgmaGEtPmxvb3BfZG93bl90aW1lcikpKTsKKwl9CisKKwkvKgorCSAqIERvbmUgUSBIYW5kbGVyIC0tIGRnRklYTUUgVGhpcyBoYW5kbGVyIHdpbGwga2ljayBvZmYgZG9uZXEgaWYgd2UKKwkgKiBoYXZlbid0IHByb2Nlc3MgaXQgaW4gMiBzZWNvbmRzLgorCSAqLworCWlmICghbGlzdF9lbXB0eSgmaGEtPmRvbmVfcXVldWUpKQorCQlxbGEyeDAwX2RvbmUoaGEpOworCisKKwkvKiBTY2hlZHVsZSB0aGUgRFBDIHJvdXRpbmUgaWYgbmVlZGVkICovCisJaWYgKCh0ZXN0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncykgfHwKKwkgICAgdGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncykgfHwKKwkgICAgc3RhcnRfZHBjIHx8CisJICAgIHRlc3RfYml0KExPR0lOX1JFVFJZX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpIHx8CisJICAgIHRlc3RfYml0KFJFTE9HSU5fTkVFREVELCAmaGEtPmRwY19mbGFncykpICYmCisJICAgIGhhLT5kcGNfd2FpdCAmJiAhaGEtPmRwY19hY3RpdmUpIHsKKworCQl1cChoYS0+ZHBjX3dhaXQpOworCX0KKworCXFsYTJ4MDBfcmVzdGFydF90aW1lcihoYSwgV0FUQ0hfSU5URVJWQUwpOworfQorCisvKgorICogcWxhMngwMF9leHRlbmRfdGltZW91dAorICogICAgICBUaGlzIHJvdXRpbmUgd2lsbCBleHRlbmQgdGhlIHRpbWVvdXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgY21kID0gU0NTSSBjb21tYW5kIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnM6CisgKiAgICAgIE5vbmUuCisgKi8KK3ZvaWQgCitxbGEyeDAwX2V4dGVuZF90aW1lb3V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgaW50IHRpbWVvdXQpIAoreworCXNyYl90ICpzcCA9IChzcmJfdCAqKSBDTURfU1AoY21kKTsKKwl1X2xvbmcgb3VyX2ppZmZpZXMgPSAodGltZW91dCAqIEhaKSArIGppZmZpZXM7CisKKyAgICAJc3AtPmV4dF9oaXN0b3J5PSAwOyAKKwlzcC0+ZV9zdGFydCA9IGppZmZpZXM7CisJaWYgKGNtZC0+ZWhfdGltZW91dC5mdW5jdGlvbikgeworCQltb2RfdGltZXIoJmNtZC0+ZWhfdGltZW91dCxvdXJfamlmZmllcyk7CisJCXNwLT5leHRfaGlzdG9yeSB8PSAxOworCX0KKwlpZiAoc3AtPnRpbWVyLmZ1bmN0aW9uICE9IE5VTEwpIHsKKwkJLyogCisJCSAqIE91ciBpbnRlcm5hbCB0aW1lciBzaG91bGQgdGltZW91dCBiZWZvcmUgdGhlIG1pZGxheWVyIGhhcyBhCisJCSAqIGNoYW5jZSBiZWdpbiB0aGUgYWJvcnQgcHJvY2VzcworCQkgKi8KKwkJbW9kX3RpbWVyKCZzcC0+dGltZXIsb3VyX2ppZmZpZXMgLSAoUUxBX0NNRF9USU1FUl9ERUxUQSAqIEhaKSk7CisKKyAgICAJIAlzcC0+ZXh0X2hpc3RvcnkgfD0gMjsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIHFsYTJ4MDBfY21kX3RpbWVvdXQKKyoKKyogRGVzY3JpcHRpb246CisqICAgICAgIEhhbmRsZXMgdGhlIGNvbW1hbmQgaWYgaXQgdGltZXMgb3V0IGluIGFueSBzdGF0ZS4KKyoKKyogSW5wdXQ6CisqICAgICBzcCAtIHBvaW50ZXIgdG8gdmFsaWRhdGUKKyoKKyogUmV0dXJuczoKKyogTm9uZS4KKyogTm90ZTpOZWVkIHRvIGFkZCB0aGUgc3VwcG9ydCBmb3IgaWYoIHNwLT5zdGF0ZSA9PSBTUkJfRkFJTE9WRVJfU1RBVEUpLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitxbGEyeDAwX2NtZF90aW1lb3V0KHNyYl90ICpzcCkKK3sKKwlpbnQgdCwgbDsKKwlpbnQgcHJvY2Vzc2VkOworCXNjc2lfcWxhX2hvc3RfdCAqdmlzX2hhLCAqZGVzdF9oYTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJdW5zaWduZWQgbG9uZyBmbGFncywgY3B1X2ZsYWdzOworCWZjX3BvcnRfdCAqZmNwb3J0OworCisJY21kID0gc3AtPmNtZDsKKwl2aXNfaGEgPSAoc2NzaV9xbGFfaG9zdF90ICopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJREVCVUczKHByaW50aygiY21kX3RpbWVvdXQ6IEVudGVyaW5nIHNwLT5zdGF0ZSA9ICV4XG4iLCBzcC0+c3RhdGUpKTsKKworCXQgPSBjbWQtPmRldmljZS0+aWQ7CisJbCA9IGNtZC0+ZGV2aWNlLT5sdW47CisJZmNwb3J0ID0gc3AtPmZjbHVuLT5mY3BvcnQ7CisJZGVzdF9oYSA9IHNwLT5oYTsKKworCS8qCisJICogSWYgSU8gaXMgZm91bmQgZWl0aGVyIGluIHJldHJ5IFF1ZXVlIAorCSAqICAgIE9SIGluIEx1biBRdWV1ZQorCSAqIFJldHVybiB0aGlzIElPIGJhY2sgdG8gaG9zdAorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aXNfaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCXByb2Nlc3NlZCA9IDA7CisJaWYgKHNwLT5zdGF0ZSA9PSBTUkJfUEVORElOR19TVEFURSkgeworCQlfX2RlbF9mcm9tX3BlbmRpbmdfcXVldWUodmlzX2hhLCBzcCk7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRm91bmQgaW4gUGVuZGluZyBxdWV1ZSBwaWQgJWxkLCAiCisJCSAgICAiU3RhdGUgPSAleC4sIGZjcG9ydCBzdGF0ZT0lZCBzamlmZnM9JWx4IG5qaWZmcz0lbHhcbiIsCisJCSAgICB2aXNfaGEtPmhvc3Rfbm8sIGNtZC0+c2VyaWFsX251bWJlciwgc3AtPnN0YXRlLAorCQkgICAgYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpLCBzcC0+cl9zdGFydCwgamlmZmllcykpOworCisJCS8qCisJCSAqIElmIEZDX0RFVklDRSBpcyBtYXJrZWQgYXMgZGVhZCByZXR1cm4gdGhlIGNtZCB3aXRoCisJCSAqIERJRF9OT19DT05ORUNUIHN0YXR1cy4gIE90aGVyd2lzZSBzZXQgdGhlIGhvc3RfYnl0ZSB0bworCQkgKiBESURfQlVTX0JVU1kgdG8gbGV0IHRoZSBPUyAgcmV0cnkgdGhpcyBjbWQuCisJCSAqLworCQlpZiAoYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpID09IEZDU19ERVZJQ0VfREVBRCB8fAorCQkgICAgYXRvbWljX3JlYWQoJmZjcG9ydC0+aGEtPmxvb3Bfc3RhdGUpID09IExPT1BfREVBRCkgeworCQkJY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5oYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ET1dOKSAKKwkJCQlzcC0+ZXJyX2lkID0gU1JCX0VSUl9MT09QOworCQkJZWxzZQorCQkJCXNwLT5lcnJfaWQgPSBTUkJfRVJSX1BPUlQ7CisJCX0gZWxzZSB7CisJCQljbWQtPnJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNjsKKwkJfQorCQlfX2FkZF90b19kb25lX3F1ZXVlKHZpc19oYSwgc3ApOworCQlwcm9jZXNzZWQrKzsKKwl9IAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpc19oYS0+bGlzdF9sb2NrLCBmbGFncyk7CisKKwlpZiAocHJvY2Vzc2VkKSB7CisJCXFsYTJ4MDBfZG9uZSh2aXNfaGEpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc3RfaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCWlmICgoc3AtPnN0YXRlID09IFNSQl9SRVRSWV9TVEFURSkgfHwKKwkgICAgKHNwLT5zdGF0ZSA9PSBTUkJfU0NTSV9SRVRSWV9TVEFURSkpIHsKKworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEZvdW5kIGluIChTY3NpKSBSZXRyeSBxdWV1ZSBvciAiCisJCSAgICAiZmFpbG92ZXIgUSBwaWQgJWxkLCBTdGF0ZSA9ICV4LiwgZmNwb3J0IHN0YXRlPSVkICIKKwkJICAgICJqaWZmaWVzPSVseCByZXRyaWVkPSVkXG4iLAorCQkgICAgZGVzdF9oYS0+aG9zdF9ubywgY21kLT5zZXJpYWxfbnVtYmVyLCBzcC0+c3RhdGUsCisJCSAgICBhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSksIGppZmZpZXMsIGNtZC0+cmV0cmllcykpOworCisJCWlmICgoc3AtPnN0YXRlID09IFNSQl9SRVRSWV9TVEFURSkpIHsKKwkJCV9fZGVsX2Zyb21fcmV0cnlfcXVldWUoZGVzdF9oYSwgc3ApOworCQl9IGVsc2UgaWYgKChzcC0+c3RhdGUgPT0gU1JCX1NDU0lfUkVUUllfU1RBVEUpKSB7CisJCQlfX2RlbF9mcm9tX3Njc2lfcmV0cnlfcXVldWUoZGVzdF9oYSwgc3ApOworCQl9IAorCisJCS8qCisJCSAqIElmIEZDX0RFVklDRSBpcyBtYXJrZWQgYXMgZGVhZCByZXR1cm4gdGhlIGNtZCB3aXRoCisJCSAqIERJRF9OT19DT05ORUNUIHN0YXR1cy4gIE90aGVyd2lzZSBzZXQgdGhlIGhvc3RfYnl0ZSB0bworCQkgKiBESURfQlVTX0JVU1kgdG8gbGV0IHRoZSBPUyAgcmV0cnkgdGhpcyBjbWQuCisJCSAqLworCQlpZiAoKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSA9PSBGQ1NfREVWSUNFX0RFQUQpIHx8CisJCSAgICBhdG9taWNfcmVhZCgmZGVzdF9oYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ERUFEKSB7CisJCQlxbGEyeDAwX2V4dGVuZF90aW1lb3V0KGNtZCwgRVhURU5EX0NNRF9USU1FT1VUKTsKKwkJCWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCQlpZiAoYXRvbWljX3JlYWQoJmRlc3RfaGEtPmxvb3Bfc3RhdGUpID09IExPT1BfRE9XTikgCisJCQkJc3AtPmVycl9pZCA9IFNSQl9FUlJfTE9PUDsKKwkJCWVsc2UKKwkJCQlzcC0+ZXJyX2lkID0gU1JCX0VSUl9QT1JUOworCQl9IGVsc2UgeworCQkJY21kLT5yZXN1bHQgPSBESURfQlVTX0JVU1kgPDwgMTY7CisJCX0KKworCQlfX2FkZF90b19kb25lX3F1ZXVlKGRlc3RfaGEsIHNwKTsKKwkJcHJvY2Vzc2VkKys7CisJfSAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXN0X2hhLT5saXN0X2xvY2ssIGZsYWdzKTsKKworCWlmIChwcm9jZXNzZWQpIHsKKwkJcWxhMngwMF9kb25lKGRlc3RfaGEpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc3RfaGEtPmxpc3RfbG9jaywgY3B1X2ZsYWdzKTsKKwlpZiAoc3AtPnN0YXRlID09IFNSQl9ET05FX1NUQVRFKSB7CisJCS8qIElPIGluIGRvbmVfcSAgLS0gbGVhdmUgaXQgKi8KKwkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IEZvdW5kIGluIERvbmUgcXVldWUgcGlkICVsZCBzcD0lcC5cbiIsCisJCSAgICBkZXN0X2hhLT5ob3N0X25vLCBjbWQtPnNlcmlhbF9udW1iZXIsIHNwKSk7CisJfSBlbHNlIGlmIChzcC0+c3RhdGUgPT0gU1JCX1NVU1BFTkRFRF9TVEFURSkgeworCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogRm91bmQgU1AgJXAgaW4gc3VzcGVuZGVkIHN0YXRlICAiCisJCSAgICAiLSBwaWQgJWxkOlxuIiwKKwkJICAgIGRlc3RfaGEtPmhvc3Rfbm8sIHNwLCBjbWQtPnNlcmlhbF9udW1iZXIpKTsKKwkJREVCVUcocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKXNwLCBzaXplb2Yoc3JiX3QpKTspCisJfSBlbHNlIGlmIChzcC0+c3RhdGUgPT0gU1JCX0FDVElWRV9TVEFURSkgeworCQkvKgorCQkgKiBJTyBpcyB3aXRoIElTUCBmaW5kIHRoZSBjb21tYW5kIGluIG91ciBhY3RpdmUgbGlzdC4KKwkJICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc3RfaGEtPmxpc3RfbG9jaywgY3B1X2ZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc3RfaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwkJaWYgKHNwID09IGRlc3RfaGEtPm91dHN0YW5kaW5nX2NtZHNbCisJCSAgICAodW5zaWduZWQgbG9uZylzcC0+Y21kLT5ob3N0X3NjcmliYmxlXSkgeworCisJCQlERUJVRyhwcmludGsoImNtZF90aW1lb3V0OiBGb3VuZCBpbiBJU1AgXG4iKSk7CisKKwkJCWlmIChzcC0+ZmxhZ3MgJiBTUkJfVEFQRSkgeworCQkJCS8qCisJCQkJICogV2UgY2Fubm90IGFsbG93IHRoZSBtaWRsYXllciBlcnJvciBoYW5kbGVyCisJCQkJICogdG8gd2FrZXVwIGFuZCBiZWdpbiB0aGUgYWJvcnQgcHJvY2Vzcy4KKwkJCQkgKiBFeHRlbmQgdGhlIHRpbWVyIHNvIHRoYXQgdGhlIGZpcm13YXJlIGNhbgorCQkJCSAqIHByb3Blcmx5IHJldHVybiB0aGUgSU9DQi4KKwkJCQkgKi8KKwkJCQlERUJVRyhwcmludGsoImNtZF90aW1lb3V0OiBFeHRlbmRpbmcgdGltZW91dCAiCisJCQkJICAgICJvZiBGQ1AyIHRhcGUgY29tbWFuZCFcbiIpKTsKKwkJCQlxbGEyeDAwX2V4dGVuZF90aW1lb3V0KHNwLT5jbWQsCisJCQkJICAgIEVYVEVORF9DTURfVElNRU9VVCk7CisJCQl9CisJCQlzcC0+c3RhdGUgPSBTUkJfQUNUSVZFX1RJTUVPVVRfU1RBVEU7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXN0X2hhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXN0X2hhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSJxbGFfY21kX3RpbWVvdXQ6IFN0YXRlIGluZGljYXRlcyBpdCBpcyB3aXRoICIKKwkJCQkiSVNQLCBCdXQgbm90IGluIGFjdGl2ZSBhcnJheVxuIik7CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc3RfaGEtPmxpc3RfbG9jaywgY3B1X2ZsYWdzKTsKKwl9IGVsc2UgaWYgKHNwLT5zdGF0ZSA9PSBTUkJfQUNUSVZFX1RJTUVPVVRfU1RBVEUpIHsKKwkJREVCVUcocHJpbnRrKCJxbGEyMTAwJWxkOiBGb3VuZCBpbiBBY3RpdmUgdGltZW91dCBzdGF0ZSIKKwkJCQkicGlkICVsZCwgU3RhdGUgPSAleC4sIFxuIiwKKwkJCQlkZXN0X2hhLT5ob3N0X25vLAorCQkJCXNwLT5jbWQtPnNlcmlhbF9udW1iZXIsIHNwLT5zdGF0ZSk7KQorCX0gZWxzZSB7CisJCS8qIEVNUFRZICovCisJCURFQlVHMihwcmludGsoImNtZF90aW1lb3V0JWxkOiBMT1NUIGNvbW1hbmQgc3RhdGUgPSAiCisJCQkJIjB4JXgsIHNwPSVwXG4iLAorCQkJCXZpc19oYS0+aG9zdF9ubywgc3AtPnN0YXRlLHNwKTspCisKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIHZpc19oYSwKKwkJCSJjbWRfdGltZW91dDogTE9TVCBjb21tYW5kIHN0YXRlID0gMHgleFxuIiwgc3AtPnN0YXRlKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzdF9oYS0+bGlzdF9sb2NrLCBjcHVfZmxhZ3MpOworCisJREVCVUczKHByaW50aygiY21kX3RpbWVvdXQ6IExlYXZpbmdcbiIpOykKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHFsYTJ4MDBfZG9uZQorKiAgICAgIFByb2Nlc3MgY29tcGxldGVkIGNvbW1hbmRzLgorKgorKiBJbnB1dDoKKyogICAgICBvbGRfaGEgICAgICAgICAgID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitxbGEyeDAwX2RvbmUoc2NzaV9xbGFfaG9zdF90ICpvbGRfaGEpCit7CisJb3NfbHVuX3QJKmxxOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzID0gMDsKKwlzY3NpX3FsYV9ob3N0X3QJKmhhOworCXNjc2lfcWxhX2hvc3RfdAkqdmlzX2hhOworCWludAlzZW5kX21hcmtlcl9vbmNlID0gMDsKKwlzcmJfdCAgICAgICAgICAgKnNwLCAqc3B0ZW1wOworCUxJU1RfSEVBRChsb2NhbF9zcF9saXN0KTsKKworCS8qCisJICogR2V0IGludG8gbG9jYWwgcXVldWUgc3VjaCB0aGF0IHdlIGRvIG5vdCB3aW5kIHVwIGNhbGxpbmcgZG9uZSBxdWV1ZQorCSAqIHRhc2tsZXQgZm9yIHRoZSBzYW1lIElPcyBmcm9tIERQQyBvciBhbnkgb3RoZXIgcGxhY2UuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9sZF9oYS0+bGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9zcGxpY2VfaW5pdCgmb2xkX2hhLT5kb25lX3F1ZXVlLCAmbG9jYWxfc3BfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2xkX2hhLT5saXN0X2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogQWxsIGRvbmUgY29tbWFuZHMgYXJlIGluIHRoZSBsb2NhbCBxdWV1ZSwgbm93IGRvIHRoZSBjYWxsIGJhY2suCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNwLCBzcHRlbXAsICZsb2NhbF9zcF9saXN0LCBsaXN0KSB7CisJCW9sZF9oYS0+ZG9uZV9xX2NudC0tOworICAgICAgICAJc3AtPnN0YXRlID0gU1JCX05PX1FVRVVFX1NUQVRFOworCisJCS8qIHJlbW92ZSBjb21tYW5kIGZyb20gbG9jYWwgbGlzdCAqLworCQlsaXN0X2RlbF9pbml0KCZzcC0+bGlzdCk7CisKKwkJY21kID0gc3AtPmNtZDsKKwkJaWYgKGNtZCA9PSBOVUxMKQorCQkgCWNvbnRpbnVlOworCisJCXZpc19oYSA9IChzY3NpX3FsYV9ob3N0X3QgKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJCWxxID0gc3AtPmx1bl9xdWV1ZTsKKwkJaGEgPSBzcC0+aGE7CisKKwkJaWYgKHNwLT5mbGFncyAmIFNSQl9ETUFfVkFMSUQpIHsKKwkJCXNwLT5mbGFncyAmPSB+U1JCX0RNQV9WQUxJRDsKKworCQkJLyogUmVsZWFzZSBtZW1vcnkgdXNlZCBmb3IgdGhpcyBJL08gKi8KKwkJCWlmIChjbWQtPnVzZV9zZykgeworCQkJCXBjaV91bm1hcF9zZyhoYS0+cGRldiwgY21kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQkgICAgY21kLT51c2Vfc2csIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQkJfSBlbHNlIGlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbikgeworCQkJCXBjaV91bm1hcF9wYWdlKGhhLT5wZGV2LCBzcC0+ZG1hX2hhbmRsZSwKKwkJCQkgICAgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJICAgIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQkJfQorCQl9CisKKworCQlzd2l0Y2ggKGhvc3RfYnl0ZShjbWQtPnJlc3VsdCkpIHsKKwkJCWNhc2UgRElEX09LOgorCQkJY2FzZSBESURfRVJST1I6CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRElEX1JFU0VUOgorCQkJCS8qCisJCQkJICogU2V0IG1hcmtlciBuZWVkZWQsIHNvIHdlIGRvbid0IGhhdmUgdG8KKwkJCQkgKiBzZW5kIG11bHRpcGxlIG1hcmtlcnMKKwkJCQkgKi8KKwkJCQlpZiAoIXNlbmRfbWFya2VyX29uY2UpIHsKKwkJCQkJaGEtPm1hcmtlcl9uZWVkZWQgPSAxOworCQkJCQlzZW5kX21hcmtlcl9vbmNlKys7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBXT1JLQVJPVU5ECisJCQkJICoKKwkJCQkgKiBBIGJhY2tkb29yIGRldmljZS1yZXNldCByZXF1aXJlcyBkaWZmZXJlbnQKKwkJCQkgKiBlcnJvciBoYW5kbGluZy4gIFRoaXMgY29kZSBkaWZmZXJlbnRpYXRlcworCQkJCSAqIGJldHdlZW4gbm9ybWFsIGVycm9yIGhhbmRsaW5nIGFuZCB0aGUKKwkJCQkgKiBiYWNrZG9vciBtZXRob2QuCisJCQkJICoKKwkJCQkgKi8KKwkJCQlpZiAoaGEtPmhvc3QtPmVoX2FjdGl2ZSAhPSBFSF9BQ1RJVkUpCisJCQkJCWNtZC0+cmVzdWx0ID0gRElEX0JVU19CVVNZIDw8IDE2OworCQkJCWJyZWFrOworCisKKwkJCWNhc2UgRElEX0FCT1JUOgorCQkJCXNwLT5mbGFncyAmPSB+U1JCX0FCT1JUX1BFTkRJTkc7CisJCQkJc3AtPmZsYWdzIHw9IFNSQl9BQk9SVEVEOworCisJCQkJaWYgKHNwLT5mbGFncyAmIFNSQl9USU1FT1VUKQorCQkJCQljbWQtPnJlc3VsdCA9IERJRF9USU1FX09VVCA8PCAxNjsKKworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCURFQlVHMihwcmludGsoInNjc2koJWxkOiVkOiVkKSAlczogZGlkX2Vycm9yICIKKwkJCQkgICAgIj0gJWQsIGNvbXAtc2NzaT0gMHgleC0weCV4IHBpZD0lbGQuXG4iLAorCQkJCSAgICB2aXNfaGEtPmhvc3Rfbm8sCisJCQkJICAgIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwKKwkJCQkgICAgX19mdW5jX18sCisJCQkJICAgIGhvc3RfYnl0ZShjbWQtPnJlc3VsdCksCisJCQkJICAgIENNRF9DT01QTF9TVEFUVVMoY21kKSwKKwkJCQkgICAgQ01EX1NDU0lfU1RBVFVTKGNtZCksIGNtZC0+c2VyaWFsX251bWJlcikpOworCQkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogQ2FsbCB0aGUgbWlkLWxldmVsIGRyaXZlciBpbnRlcnJ1cHQgaGFuZGxlciAtLSB2aWEgc3BfcHV0KCkKKwkJICovCisJCXNwX3B1dChoYSwgc3ApOworCX0gLyogZW5kIG9mIHdoaWxlICovCit9CisKKy8qCisgKiBxbGEyeDAwX3Byb2Nlc3NfcmVzcG9uc2VfcXVldWVfaW5femlvX21vZGUKKyAqCVByb2Nlc3MgcmVzcG9uc2UgcXVldWUgY29tcGxldGlvbiBhcyBmYXN0IGFzIHBvc3NpYmxlCisgKgl0byBhY2hpZXZlIFplcm8gSW50ZXJydXB0IE9wZXJ0aW9ucy1aSU8KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitxbGEyeDAwX3Byb2Nlc3NfcmVzcG9uc2VfcXVldWVfaW5femlvX21vZGUoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogQ2hlY2sgZm9yIHVucHJvY2Vzc2VkIGNvbW1hbmRzIGluIHJlc3BvbnNlIHF1ZXVlLiAqLworCWlmICghaGEtPmZsYWdzLnByb2Nlc3NfcmVzcG9uc2VfcXVldWUpCisJCXJldHVybjsKKwlpZiAoIWhhLT5mbGFncy5vbmxpbmUpCisJCXJldHVybjsKKwlpZiAoaGEtPnJlc3BvbnNlX3JpbmdfcHRyLT5zaWduYXR1cmUgPT0gUkVTUE9OU0VfUFJPQ0VTU0VEKQorCQlyZXR1cm47CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLGZsYWdzKTsKKwlxbGEyeDAwX3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoaGEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBxbGEyeDAwX25leHQKKyAqCVJldHJpZXZlIGFuZCBwcm9jZXNzIG5leHQgam9iIGluIHRoZSBMVU4gcXVldWUuCisgKgorICogSW5wdXQ6CisgKgl0cSA9IFNDU0kgdGFyZ2V0IHF1ZXVlIHBvaW50ZXIuCisgKglscSA9IFNDU0kgTFVOIHF1ZXVlIHBvaW50ZXIuCisgKglUR1RfTE9DSyBtdXN0IGJlIGFscmVhZHkgb2J0YWluZWQuCisgKgorICogT3V0cHV0OgorICoJUmVsZWFzZXMgVEdUX0xPQ0sgdXBvbiBleGl0LgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwvSW50ZXJydXB0IGNvbnRleHQuCisgKiAKKyAqIE5vdGU6IFRoaXMgcm91dGluZSB3aWxsIGFsd2F5cyB0cnkgdG8gc3RhcnQgSS9PIGZyb20gdmlzaWJsZSBIQkEuCisgKi8KK3ZvaWQKK3FsYTJ4MDBfbmV4dChzY3NpX3FsYV9ob3N0X3QgKnZpc19oYSkgCit7CisJaW50CQlydmFsOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwlzY3NpX3FsYV9ob3N0X3QgKmRlc3RfaGE7CisJZmNfcG9ydF90CSpmY3BvcnQ7CisJc3JiX3QgICAgICAgICAgICpzcCwgKnNwdGVtcDsKKwlMSVNUX0hFQUQobG9jYWxfc3BfbGlzdCk7CisKKwlkZXN0X2hhID0gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aXNfaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCWxpc3Rfc3BsaWNlX2luaXQoJnZpc19oYS0+cGVuZGluZ19xdWV1ZSwgJmxvY2FsX3NwX2xpc3QpOworCXZpc19oYS0+cXRocmVhZHMgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpc19oYS0+bGlzdF9sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3AsIHNwdGVtcCwgJmxvY2FsX3NwX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmc3AtPmxpc3QpOworICAgICAgICAJc3AtPnN0YXRlID0gU1JCX05PX1FVRVVFX1NUQVRFOworCisJCWZjcG9ydCA9IHNwLT5mY2x1bi0+ZmNwb3J0OworCQlkZXN0X2hhID0gZmNwb3J0LT5oYTsKKworCQkvKiBJZiBkZXZpY2UgaXMgZGVhZCB0aGVuIHNlbmQgcmVxdWVzdCBiYWNrIHRvIE9TICovCisJCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgPT0gRkNTX0RFVklDRV9ERUFEKSB7CisJCQlzcC0+Y21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJCWlmIChhdG9taWNfcmVhZCgmZGVzdF9oYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ET1dOKSAKKwkJCQlzcC0+ZXJyX2lkID0gU1JCX0VSUl9MT09QOworCQkJZWxzZQorCQkJCXNwLT5lcnJfaWQgPSBTUkJfRVJSX1BPUlQ7CisKKwkJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogbG9vcC9wb3J0IGlzIGRvd24gLSBwaWQ9JWxkLCAiCisJCQkgICAgInNwPSVwIGVycl9pZD0lZCBsb29waWQ9MHgleCBxdWV1ZWQgdG8gZGVzdCBIQkEgIgorCQkJICAgICJzY3NpJWxkLlxuIiwgZGVzdF9oYS0+aG9zdF9ubywKKwkJCSAgICBzcC0+Y21kLT5zZXJpYWxfbnVtYmVyLCBzcCwgc3AtPmVycl9pZCwKKwkJCSAgICBmY3BvcnQtPmxvb3BfaWQsIGRlc3RfaGEtPmhvc3Rfbm8pKTsKKwkJCS8qIAorCQkJICogSW5pdGlhdGUgYSBmYWlsb3ZlciAtIGRvbmUgcm91dGluZSB3aWxsIGluaXRpYXRlLgorCQkJICovCisJCQlhZGRfdG9fZG9uZV9xdWV1ZSh2aXNfaGEsIHNwKTsKKworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBTQ1NJIEtsdWdlOiBXaGVuZXZlciwgd2UgbmVlZCB0byB3YWl0IGZvciBhbiBldmVudCBzdWNoIGFzCisJCSAqIGxvb3AgZG93biAoaS5lLiBsb29wX2Rvd25fdGltZXIgKSBvciBwb3J0IGRvd24gKGkuZS4gIExVTgorCQkgKiByZXF1ZXN0IHFldWV1ZSBpcyBzdXNwZW5kZWQpIHRoZW4gd2Ugd2lsbCByZWN5Y2xlIG5ldworCQkgKiBjb21tYW5kcyBiYWNrIHRvIHRoZSBTQ1NJIGxheWVyLiAgV2UgZG8gdGhpcyBiZWNhdXNlIHRoaXMgaXMKKwkJICogbm9ybWFsbHkgYSB0ZW1wb3JhcnkgY29uZGl0aW9uIGFuZCB3ZSBkb24ndCB3YW50IHRoZQorCQkgKiBtaWQtbGV2ZWwgc2NzaS5jIGRyaXZlciB0byBnZXQgdXBzZXQgYW5kIHN0YXJ0IGFib3J0aW5nCisJCSAqIGNvbW1hbmRzLiAgVGhlIHRpbWVvdXQgdmFsdWUgaXMgZXh0cmFjdGVkIGZyb20gdGhlIGNvbW1hbmQKKwkJICogbWludXMgMS1zZWNvbmQgYW5kIHB1dCBvbiBhIHJldHJ5IHF1ZXVlICh3YXRjaGRvZykuIE9uY2UgdGhlCisJCSAqIGNvbW1hbmQgdGltZW91dCBpdCBpcyByZXR1cm5lZCB0byB0aGUgbWlkLWxldmVsIHdpdGggYSBCVVNZCisJCSAqIHN0YXR1cywgc28gdGhlIG1pZC1sZXZlbCB3aWxsIHJldHJ5IGl0LiBUaGlzIHByb2Nlc3MKKwkJICogY29udGludWVzIHVudGlsIHRoZSBMT09QIERPV04gdGltZSBleHBpcmVzIG9yIHRoZSBjb25kaXRpb24KKwkJICogZ29lcyBhd2F5LgorCQkgKi8KKwkJaWYgKCEoc3AtPmZsYWdzICYgKFNSQl9JT0NUTCB8IFNSQl9UQVBFKSkgJiYKKwkJICAgIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgIT0gRkNTX09OTElORSB8fAorCQkJdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmRlc3RfaGEtPmRwY19mbGFncykgfHwKKwkJCWF0b21pY19yZWFkKCZkZXN0X2hhLT5sb29wX3N0YXRlKSAhPSBMT09QX1JFQURZKSkgeworCisJCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IHBpZD0lbGQgcG9ydD0weCV4IHN0YXRlPSVkICIKKwkJCSAgICAibG9vcCBzdGF0ZT0lZCwgbG9vcCBjb3VudGVyPTB4JXggIgorCQkJICAgICJkcGNfZmxhZ3M9MHglbHhcbiIsIHNwLT5jbWQtPnNlcmlhbF9udW1iZXIsCisJCQkgICAgZGVzdF9oYS0+aG9zdF9ubywgZmNwb3J0LT5sb29wX2lkLAorCQkJICAgIGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSwKKwkJCSAgICBhdG9taWNfcmVhZCgmZGVzdF9oYS0+bG9vcF9zdGF0ZSksCisJCQkgICAgYXRvbWljX3JlYWQoJmRlc3RfaGEtPmxvb3BfZG93bl90aW1lciksCisJCQkgICAgZGVzdF9oYS0+ZHBjX2ZsYWdzKSk7CisKKwkJCXFsYTJ4MDBfZXh0ZW5kX3RpbWVvdXQoc3AtPmNtZCwgRVhURU5EX0NNRF9USU1FT1VUKTsKKwkJCWFkZF90b19yZXRyeV9xdWV1ZSh2aXNfaGEsIHNwKTsKKworCQkJY29udGludWU7CisJCX0gCisKKwkJLyoKKwkJICogSWYgdGhpcyByZXF1ZXN0J3MgbHVuIGlzIHN1c3BlbmRlZCB0aGVuIHB1dCB0aGUgcmVxdWVzdCBvbgorCQkgKiB0aGUgIHNjc2lfcmV0cnkgcXVldWUuIAorCQkgKi8KKwkgCWlmICghKHNwLT5mbGFncyAmIChTUkJfSU9DVEwgfCBTUkJfVEFQRSkpICYmCisJCSAgICBzcC0+bHVuX3F1ZXVlLT5xX3N0YXRlID09IExVTl9TVEFURV9XQUlUKSB7CisJCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IGx1biB3YWl0IHN0YXRlIC0gcGlkPSVsZCwgIgorCQkJICAgICJvcGNvZGU9JWQsIGFsbG93ZWQ9JWQsIHJldHJpZXM9JWRcbiIsCisJCQkgICAgZGVzdF9oYS0+aG9zdF9ubywKKwkJCSAgICBzcC0+Y21kLT5zZXJpYWxfbnVtYmVyLAorCQkJICAgIHNwLT5jbWQtPmNtbmRbMF0sCisJCQkgICAgc3AtPmNtZC0+YWxsb3dlZCwKKwkJCSAgICBzcC0+Y21kLT5yZXRyaWVzKSk7CisJCQkJCisJCQlhZGRfdG9fc2NzaV9yZXRyeV9xdWV1ZSh2aXNfaGEsIHNwKTsKKworCQkJY29udGludWU7CisJCX0KKworCQlzcC0+bHVuX3F1ZXVlLT5pb19jbnQrKzsKKworCQlydmFsID0gcWxhMngwMF9zdGFydF9zY3NpKHNwKTsKKwkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCS8qIFBsYWNlIHJlcXVlc3QgYmFjayBvbiB0b3Agb2YgZGV2aWNlIHF1ZXVlICovCisJCQkvKiBhZGQgdG8gdGhlIHRvcCBvZiBxdWV1ZSAqLworCQkJYWRkX3RvX3BlbmRpbmdfcXVldWVfaGVhZCh2aXNfaGEsIHNwKTsKKworCQkJc3AtPmx1bl9xdWV1ZS0+aW9fY250LS07CisJCX0KKwl9CisKKwlpZiAoIUlTX1FMQTIxMDAodmlzX2hhKSAmJiAhSVNfUUxBMjIwMCh2aXNfaGEpKSB7CisJCS8qIFByb2Nlc3MgcmVzcG9uc2VfcXVldWUgaWYgWklPIHN1cHBvcnQgaXMgZW5hYmxlZCovIAorCQlxbGEyeDAwX3Byb2Nlc3NfcmVzcG9uc2VfcXVldWVfaW5femlvX21vZGUodmlzX2hhKTsKKworCX0KK30KKworLyogWFhYKGhjaCk6IGNydWRlIGhhY2sgdG8gZW11bGF0ZSBhIGRvd25fdGltZW91dCgpICovCitpbnQKK3FsYTJ4MDBfZG93bl90aW1lb3V0KHN0cnVjdCBzZW1hcGhvcmUgKnNlbWEsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgc3RlcCA9IEhaLzEwOworCisJZG8geworCQlpZiAoIWRvd25fdHJ5bG9jayhzZW1hKSkKKwkJCXJldHVybiAwOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAoc2NoZWR1bGVfdGltZW91dChzdGVwKSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKCh0aW1lb3V0IC09IHN0ZXApID4gMCk7CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3RhdGljIHZvaWQKK3FsYTJ4eHhfZ2V0X3BvcnRfaWQoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSB0b19xbGFfaG9zdChzaG9zdCk7CisJc3RydWN0IGZjX3BvcnQgKmZjOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmYywgJmhhLT5mY3BvcnRzLCBsaXN0KSB7CisJCWlmIChmYy0+b3NfdGFyZ2V0X2lkID09IHN0YXJnZXQtPmlkKSB7CisJCQlmY19zdGFyZ2V0X3BvcnRfaWQoc3RhcmdldCkgPSBmYy0+ZF9pZC5iLmRvbWFpbiA8PCAxNiB8CisJCQkJZmMtPmRfaWQuYi5hcmVhIDw8IDggfCAKKwkJCQlmYy0+ZF9pZC5iLmFsX3BhOworCQkJcmV0dXJuOworCQl9CisJfQorCWZjX3N0YXJnZXRfcG9ydF9pZChzdGFyZ2V0KSA9IC0xOworfQorCitzdGF0aWMgdm9pZAorcWxhMnh4eF9nZXRfcG9ydF9uYW1lKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzY3NpX3FsYV9ob3N0X3QgKmhhID0gdG9fcWxhX2hvc3Qoc2hvc3QpOworCXN0cnVjdCBmY19wb3J0ICpmYzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZmMsICZoYS0+ZmNwb3J0cywgbGlzdCkgeworCQlpZiAoZmMtPm9zX3RhcmdldF9pZCA9PSBzdGFyZ2V0LT5pZCkgeworCQkJZmNfc3RhcmdldF9wb3J0X25hbWUoc3RhcmdldCkgPQorCQkJCV9fYmU2NF90b19jcHUoKih1aW50NjRfdCAqKWZjLT5wb3J0X25hbWUpOworCQkJcmV0dXJuOworCQl9CisJfQorCWZjX3N0YXJnZXRfcG9ydF9uYW1lKHN0YXJnZXQpID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitxbGEyeHh4X2dldF9ub2RlX25hbWUoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSB0b19xbGFfaG9zdChzaG9zdCk7CisJc3RydWN0IGZjX3BvcnQgKmZjOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmYywgJmhhLT5mY3BvcnRzLCBsaXN0KSB7CisJCWlmIChmYy0+b3NfdGFyZ2V0X2lkID09IHN0YXJnZXQtPmlkKSB7CisJCQlmY19zdGFyZ2V0X25vZGVfbmFtZShzdGFyZ2V0KSA9CisJCQkJX19iZTY0X3RvX2NwdSgqKHVpbnQ2NF90ICopZmMtPm5vZGVfbmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZmNfc3RhcmdldF9ub2RlX25hbWUoc3RhcmdldCkgPSAtMTsKK30KKworc3RhdGljIHN0cnVjdCBmY19mdW5jdGlvbl90ZW1wbGF0ZSBxbGEyeHh4X3RyYW5zcG9ydF9mdW5jdGlvbnMgPSB7CisJLmdldF9zdGFyZ2V0X3BvcnRfaWQgPSBxbGEyeHh4X2dldF9wb3J0X2lkLAorCS5zaG93X3N0YXJnZXRfcG9ydF9pZCA9IDEsCisJLmdldF9zdGFyZ2V0X3BvcnRfbmFtZSA9IHFsYTJ4eHhfZ2V0X3BvcnRfbmFtZSwKKwkuc2hvd19zdGFyZ2V0X3BvcnRfbmFtZSA9IDEsCisJLmdldF9zdGFyZ2V0X25vZGVfbmFtZSA9IHFsYTJ4eHhfZ2V0X25vZGVfbmFtZSwKKwkuc2hvd19zdGFyZ2V0X25vZGVfbmFtZSA9IDEsCit9OworCisvKioKKyAqIHFsYTJ4MDBfbW9kdWxlX2luaXQgLSBNb2R1bGUgaW5pdGlhbGl6YXRpb24uCisgKiovCitzdGF0aWMgaW50IF9faW5pdAorcWxhMngwMF9tb2R1bGVfaW5pdCh2b2lkKQoreworCS8qIEFsbG9jYXRlIGNhY2hlIGZvciBTUkJzLiAqLworCXNwcmludGYoc3JiX2NhY2hlcF9uYW1lLCAicWxhMnh4eF9zcmJzIik7CisJc3JiX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKHNyYl9jYWNoZXBfbmFtZSwgc2l6ZW9mKHNyYl90KSwgMCwKKwkgICAgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMLCBOVUxMKTsKKwlpZiAoc3JiX2NhY2hlcCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgInFsYTJ4eHg6IFVuYWJsZSB0byBhbGxvY2F0ZSBTUkIgY2FjaGUuLi5GYWlsaW5nIGxvYWQhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogRGVyaXZlIHZlcnNpb24gc3RyaW5nLiAqLworCXN0cmNweShxbGEyeDAwX3ZlcnNpb25fc3RyLCBRTEEyWFhYX1ZFUlNJT04pOworI2lmIERFQlVHX1FMQTIxMDAKKwlzdHJjYXQocWxhMngwMF92ZXJzaW9uX3N0ciwgIi1kZWJ1ZyIpOworI2VuZGlmCisKKwlxbGEyeHh4X3RyYW5zcG9ydF90ZW1wbGF0ZSA9IGZjX2F0dGFjaF90cmFuc3BvcnQoJnFsYTJ4eHhfdHJhbnNwb3J0X2Z1bmN0aW9ucyk7CisJaWYgKCFxbGEyeHh4X3RyYW5zcG9ydF90ZW1wbGF0ZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwcmludGsoS0VSTl9JTkZPICJRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBxbGEyeDAwX21vZHVsZV9leGl0IC0gTW9kdWxlIGNsZWFudXAuCisgKiovCitzdGF0aWMgdm9pZCBfX2V4aXQKK3FsYTJ4MDBfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwkvKiBGcmVlIFNSQnMgY2FjaGUuICovCisJaWYgKHNyYl9jYWNoZXAgIT0gTlVMTCkgeworCQlpZiAoa21lbV9jYWNoZV9kZXN0cm95KHNyYl9jYWNoZXApICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICJxbGEyeHh4OiBVbmFibGUgdG8gZnJlZSBTUkIgY2FjaGUuLi5NZW1vcnkgcG9vbHMgIgorCQkJICAgICJzdGlsbCBhY3RpdmU/XG4iKTsKKwkJfQorCQlzcmJfY2FjaGVwID0gTlVMTDsKKwl9CisKKwlmY19yZWxlYXNlX3RyYW5zcG9ydChxbGEyeHh4X3RyYW5zcG9ydF90ZW1wbGF0ZSk7Cit9CisKK21vZHVsZV9pbml0KHFsYTJ4MDBfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQocWxhMngwMF9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlFMb2dpYyBDb3Jwb3JhdGlvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihRTEEyWFhYX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3JzY24uYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9yc2NuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1NDViNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9yc2NuLmMKQEAgLTAsMCArMSwxNDM3IEBACisvKgorICogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyAqCisgKiBRTG9naWMgSVNQMngwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAyLjYueAorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUUxvZ2ljIENvcnBvcmF0aW9uCisgKiAod3d3LnFsb2dpYy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2luY2x1ZGUgInFsYV9kZWYuaCIKKworLyoqCisgKiBJTyBkZXNjcmlwdG9yIGhhbmRsZSBkZWZpbml0aW9ucy4KKyAqCisgKiBTaWduYXR1cmUgZm9ybToKKyAqCisgKgl8MzEtLS0tLS0yOHwyNy0tLS0tLS0tLS0tLS0tLS0tLS0xMnwxMS0tLS0tLS0wfAorICoJfCAgIFR5cGUgICB8ICAgUm9sbGluZyBTaWduYXR1cmUgICB8ICAgSW5kZXggIHwKKyAqCXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgKgorICoqLworCisjZGVmaW5lIEhETF9UWVBFX1NDU0kJCTAKKyNkZWZpbmUgSERMX1RZUEVfQVNZTkNfSU9DQgkweDBBCisKKyNkZWZpbmUgSERMX0lOREVYX0JJVFMJMTIKKyNkZWZpbmUgSERMX0lURVJfQklUUwkxNgorI2RlZmluZSBIRExfVFlQRV9CSVRTCTQKKworI2RlZmluZSBIRExfSU5ERVhfTUFTSwkoKDFVTCA8PCBIRExfSU5ERVhfQklUUykgLSAxKQorI2RlZmluZSBIRExfSVRFUl9NQVNLCSgoMVVMIDw8IEhETF9JVEVSX0JJVFMpIC0gMSkKKyNkZWZpbmUgSERMX1RZUEVfTUFTSwkoKDFVTCA8PCBIRExfVFlQRV9CSVRTKSAtIDEpCisKKyNkZWZpbmUgSERMX0lOREVYX1NISUZUCTAKKyNkZWZpbmUgSERMX0lURVJfU0hJRlQJKEhETF9JTkRFWF9TSElGVCArIEhETF9JTkRFWF9CSVRTKQorI2RlZmluZSBIRExfVFlQRV9TSElGVAkoSERMX0lURVJfU0hJRlQgKyBIRExfSVRFUl9CSVRTKQorCisvKiBMb2NhbCBQcm90b3R5cGVzLiAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBxbGEyeDAwX3RvX2hhbmRsZSh1aW50MTZfdCwgdWludDE2X3QsIHVpbnQxNl90KTsKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgcWxhMngwMF9oYW5kbGVfdG9faWR4KHVpbnQzMl90KTsKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgcWxhMngwMF9pb2Rlc2NfdG9faGFuZGxlKHN0cnVjdCBpb19kZXNjcmlwdG9yICopOworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqcWxhMngwMF9oYW5kbGVfdG9faW9kZXNjKHNjc2lfcWxhX2hvc3RfdCAqLAorICAgIHVpbnQzMl90KTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqcWxhMngwMF9hbGxvY19pb2Rlc2Moc2NzaV9xbGFfaG9zdF90ICopOworc3RhdGljIGlubGluZSB2b2lkIHFsYTJ4MDBfZnJlZV9pb2Rlc2Moc3RydWN0IGlvX2Rlc2NyaXB0b3IgKik7CitzdGF0aWMgaW5saW5lIHZvaWQgcWxhMngwMF9pbml0X2lvX2Rlc2NyaXB0b3JzKHNjc2lfcWxhX2hvc3RfdCAqKTsKKworc3RhdGljIHZvaWQgcWxhMngwMF9pb2Rlc2NfdGltZW91dCh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBxbGEyeDAwX2FkZF9pb2Rlc2NfdGltZXIoc3RydWN0IGlvX2Rlc2NyaXB0b3IgKik7CitzdGF0aWMgaW5saW5lIHZvaWQgcWxhMngwMF9yZW1vdmVfaW9kZXNjX3RpbWVyKHN0cnVjdCBpb19kZXNjcmlwdG9yICopOworCitzdGF0aWMgaW5saW5lIHZvaWQgcWxhMngwMF91cGRhdGVfbG9naW5fZmNwb3J0KHNjc2lfcWxhX2hvc3RfdCAqLAorICAgIHN0cnVjdCBtYnhfZW50cnkgKiwgZmNfcG9ydF90ICopOworCitzdGF0aWMgaW50IHFsYTJ4MDBfc2VuZF9hYm9ydF9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqLCBzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqLAorICAgIHVpbnQzMl90LCBpbnQpOworc3RhdGljIGludCBxbGEyeDAwX3NlbmRfYWJvcnRfaW9jYl9jYihzY3NpX3FsYV9ob3N0X3QgKiwgc3RydWN0IGlvX2Rlc2NyaXB0b3IgKiwKKyAgICBzdHJ1Y3QgbWJ4X2VudHJ5ICopOworCitzdGF0aWMgaW50IHFsYTJ4MDBfc2VuZF9hZGlzY19pb2NiKHNjc2lfcWxhX2hvc3RfdCAqLCBzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqLAorICAgIGludCk7CitzdGF0aWMgaW50IHFsYTJ4MDBfc2VuZF9hZGlzY19pb2NiX2NiKHNjc2lfcWxhX2hvc3RfdCAqLCBzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqLAorICAgIHN0cnVjdCBtYnhfZW50cnkgKik7CisKK3N0YXRpYyBpbnQgcWxhMngwMF9zZW5kX2xvZ291dF9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqLCBzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqLAorICAgIGludCk7CitzdGF0aWMgaW50IHFsYTJ4MDBfc2VuZF9sb2dvdXRfaW9jYl9jYihzY3NpX3FsYV9ob3N0X3QgKiwKKyAgICBzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqLCBzdHJ1Y3QgbWJ4X2VudHJ5ICopOworCitzdGF0aWMgaW50IHFsYTJ4MDBfc2VuZF9sb2dpbl9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqLCBzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqLAorICAgIHBvcnRfaWRfdCAqLCBpbnQpOworc3RhdGljIGludCBxbGEyeDAwX3NlbmRfbG9naW5faW9jYl9jYihzY3NpX3FsYV9ob3N0X3QgKiwgc3RydWN0IGlvX2Rlc2NyaXB0b3IgKiwKKyAgICBzdHJ1Y3QgbWJ4X2VudHJ5ICopOworCisvKiogCisgKiBNYWlsYm94IElPQ0IgY2FsbGJhY2sgYXJyYXkuCisgKiovCitzdGF0aWMgaW50ICgqaW9jYl9mdW5jdGlvbl9jYl9saXN0W0xBU1RfSU9DQl9DQl0pCisJKHNjc2lfcWxhX2hvc3RfdCAqLCBzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqLCBzdHJ1Y3QgbWJ4X2VudHJ5ICopID0geworCisJcWxhMngwMF9zZW5kX2Fib3J0X2lvY2JfY2IsCisJcWxhMngwMF9zZW5kX2FkaXNjX2lvY2JfY2IsCisJcWxhMngwMF9zZW5kX2xvZ291dF9pb2NiX2NiLAorCXFsYTJ4MDBfc2VuZF9sb2dpbl9pb2NiX2NiLAorfTsKKworCisvKiogCisgKiBHZW5lcmljIElPIGRlc2NyaXB0b3IgaGFuZGxlIHJvdXRpbmVzLgorICoqLworCisvKioKKyAqIHFsYTJ4MDBfdG9faGFuZGxlKCkgLSBDcmVhdGUgYSBkZXNjcmlwdG9yIGhhbmRsZS4KKyAqIEB0eXBlOiBkZXNjcmlwdG9yIHR5cGUKKyAqIEBpdGVyOiBkZXNjcmlwdG9yIHJvbGxpbmcgc2lnbmF0dXJlCisgKiBAaWR4OiBpbmRleCB0byB0aGUgZGVzY3JpcHRvciBhcnJheQorICoKKyAqIFJldHVybnMgYSBjb21wb3NpdGUgaGFuZGxlIGJhc2VkIGluIHRoZSBAdHlwZSwgQGl0ZXIsIGFuZCBAaWR4LgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90CitxbGEyeDAwX3RvX2hhbmRsZSh1aW50MTZfdCB0eXBlLCB1aW50MTZfdCBpdGVyLCB1aW50MTZfdCBpZHgpCit7CisJcmV0dXJuICgodWludDMyX3QpKCgodWludDMyX3QpdHlwZSA8PCBIRExfVFlQRV9TSElGVCkgfAorCSAgICAoKHVpbnQzMl90KWl0ZXIgPDwgSERMX0lURVJfU0hJRlQpIHwKKwkgICAgKCh1aW50MzJfdClpZHggPDwgSERMX0lOREVYX1NISUZUKSkpOworfQorCisvKioKKyAqIHFsYTJ4MDBfaGFuZGxlX3RvX2lkeCgpIC0gUmV0cml2ZSB0aGUgaW5kZXggZm9yIGEgZ2l2ZW4gaGFuZGxlLgorICogQGhhbmRsZTogZGVzY3JpcHRvciBoYW5kbGUKKyAqCisgKiBSZXR1cm5zIHRoZSBpbmRleCBzcGVjaWZpZWQgYnkgdGhlIEBoYW5kbGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDE2X3QKK3FsYTJ4MDBfaGFuZGxlX3RvX2lkeCh1aW50MzJfdCBoYW5kbGUpCit7CisJcmV0dXJuICgodWludDE2X3QpKCgoaGFuZGxlKSA+PiBIRExfSU5ERVhfU0hJRlQpICYgSERMX0lOREVYX01BU0spKTsKK30KKworLyoqCisgKiBxbGEyeDAwX2lvZGVzY190b19oYW5kbGUoKSAtIENvbnZlcnQgYW4gSU8gZGVzY3JpcHRvciB0byBhIHVuaXF1ZSBoYW5kbGUuCisgKiBAaW9kZXNjOiBpbyBkZXNjcmlwdG9yCisgKgorICogUmV0dXJucyBhIHVuaXF1ZSBoYW5kbGUgZm9yIEBpb2Rlc2MuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK3FsYTJ4MDBfaW9kZXNjX3RvX2hhbmRsZShzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqaW9kZXNjKQoreworCXVpbnQzMl90IGhhbmRsZTsKKworCWhhbmRsZSA9IHFsYTJ4MDBfdG9faGFuZGxlKEhETF9UWVBFX0FTWU5DX0lPQ0IsCisJICAgICsraW9kZXNjLT5oYS0+aW9kZXNjX3NpZ25hdHVyZSwgaW9kZXNjLT5pZHgpOworCWlvZGVzYy0+c2lnbmF0dXJlID0gaGFuZGxlOworCisJcmV0dXJuIChoYW5kbGUpOworfQorCisvKioKKyAqIHFsYTJ4MDBfaGFuZGxlX3RvX2lvZGVzYygpIC0gUmV0cmlldmUgYW4gSU8gZGVzY3JpcHRvciBnaXZlbiBhIHVuaXF1ZSBoYW5kbGUuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBoYW5kbGU6IGhhbmRsZSB0byBpbyBkZXNjcmlwdG9yCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGlvIGRlc2NyaXB0b3IsIG9yIE5VTEwsIGlmIHRoZSBpbyBkZXNjcmlwdG9yIGRvZXMKKyAqIG5vdCBleGlzdCBvciB0aGUgaW8gZGVzY3JpcHRvcnMgc2lnbmF0dXJlIGRvZXMgbm90IEBoYW5kbGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlvX2Rlc2NyaXB0b3IgKgorcWxhMngwMF9oYW5kbGVfdG9faW9kZXNjKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQzMl90IGhhbmRsZSkKK3sKKwl1aW50MTZfdCBpZHg7CisJc3RydWN0IGlvX2Rlc2NyaXB0b3IgKmlvZGVzYzsKKworCWlkeCA9IHFsYTJ4MDBfaGFuZGxlX3RvX2lkeChoYW5kbGUpOworCWlvZGVzYyA9ICZoYS0+aW9fZGVzY3JpcHRvcnNbaWR4XTsKKwlpZiAoaW9kZXNjKQorCQlpZiAoaW9kZXNjLT5zaWduYXR1cmUgIT0gaGFuZGxlKQorCQkJaW9kZXNjID0gTlVMTDsKKworCXJldHVybiAoaW9kZXNjKTsKK30KKworCisvKiogCisgKiBJTyBkZXNjcmlwdG9yIGFsbG9jYXRpb24gcm91dGluZXMuCisgKiovCisKKy8qKgorICogcWxhMngwMF9hbGxvY19pb2Rlc2MoKSAtIEFsbG9jYXRlIGFuIElPIGRlc2NyaXB0b3IgZnJvbSB0aGUgcG9vbC4KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgaW8gZGVzY3JpcHRvciwgb3IgTlVMTCwgaWYgbm9uZSBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlvX2Rlc2NyaXB0b3IgKgorcWxhMngwMF9hbGxvY19pb2Rlc2Moc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwl1aW50MTZfdCBpdGVyOworCXN0cnVjdCBpb19kZXNjcmlwdG9yICppb2Rlc2M7CisKKwlpb2Rlc2MgPSBOVUxMOworCWZvciAoaXRlciA9IDA7IGl0ZXIgPCBNQVhfSU9fREVTQ1JJUFRPUlM7IGl0ZXIrKykgeworCQlpZiAoaGEtPmlvX2Rlc2NyaXB0b3JzW2l0ZXJdLnVzZWQpCisJCQljb250aW51ZTsKKworCQlpb2Rlc2MgPSAmaGEtPmlvX2Rlc2NyaXB0b3JzW2l0ZXJdOworCQlpb2Rlc2MtPnVzZWQgPSAxOworCQlpb2Rlc2MtPmlkeCA9IGl0ZXI7CisJCWluaXRfdGltZXIoJmlvZGVzYy0+dGltZXIpOworCQlpb2Rlc2MtPmhhID0gaGE7CisJCWlvZGVzYy0+c2lnbmF0dXJlID0gcWxhMngwMF9pb2Rlc2NfdG9faGFuZGxlKGlvZGVzYyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAoaW9kZXNjKTsKK30KKworLyoqCisgKiBxbGEyeDAwX2ZyZWVfaW9kZXNjKCkgLSBGcmVlIGFuIElPIGRlc2NyaXB0b3IuCisgKiBAaW9kZXNjOiBpbyBkZXNjcmlwdG9yCisgKgorICogTk9URTogVGhlIGlvIGRlc2NyaXB0b3JzIHRpbWVyICptdXN0KiBiZSBzdG9wcGVkIGJlZm9yZSBpdCBjYW4gYmUgZnJlZSdkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTJ4MDBfZnJlZV9pb2Rlc2Moc3RydWN0IGlvX2Rlc2NyaXB0b3IgKmlvZGVzYykKK3sKKwlpb2Rlc2MtPnVzZWQgPSAwOworCWlvZGVzYy0+c2lnbmF0dXJlID0gMDsKK30KKworLyoqCisgKiBxbGEyeDAwX3JlbW92ZV9pb2Rlc2NfdGltZXIoKSAtIFJlbW92ZSBhbiBhY3RpdmUgdGltZXIgZnJvbSBhbiBJTyBkZXNjcmlwdG9yLgorICogQGlvZGVzYzogaW8gZGVzY3JpcHRvcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTJ4MDBfcmVtb3ZlX2lvZGVzY190aW1lcihzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqaW9kZXNjKQoreworCWlmIChpb2Rlc2MtPnRpbWVyLmZ1bmN0aW9uICE9IE5VTEwpIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmlvZGVzYy0+dGltZXIpOworCQlpb2Rlc2MtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgTlVMTDsKKwkJaW9kZXNjLT50aW1lci5mdW5jdGlvbiA9IE5VTEw7CisJfQorfQorCisvKioKKyAqIHFsYTJ4MDBfaW5pdF9pb19kZXNjcmlwdG9ycygpIC0gSW5pdGlhbGl6ZSB0aGUgcG9vbCBvZiBJTyBkZXNjcmlwdG9ycy4KKyAqIEBoYTogSEEgY29udGV4dAorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTJ4MDBfaW5pdF9pb19kZXNjcmlwdG9ycyhzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCXVpbnQxNl90IGl0ZXI7CisKKwlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgTUFYX0lPX0RFU0NSSVBUT1JTOyBpdGVyKyspIHsKKwkJaWYgKCFoYS0+aW9fZGVzY3JpcHRvcnNbaXRlcl0udXNlZCkKKwkJCWNvbnRpbnVlOworCisJCXFsYTJ4MDBfcmVtb3ZlX2lvZGVzY190aW1lcigmaGEtPmlvX2Rlc2NyaXB0b3JzW2l0ZXJdKTsKKwkJcWxhMngwMF9mcmVlX2lvZGVzYygmaGEtPmlvX2Rlc2NyaXB0b3JzW2l0ZXJdKTsKKwl9Cit9CisKKworLyoqIAorICogSU8gZGVzY3JpcHRvciB0aW1lciByb3V0aW5lcy4KKyAqKi8KKworLyoqCisgKiBxbGEyeDAwX2lvZGVzY190aW1lb3V0KCkgLSBUaW1lb3V0IElPIGRlc2NyaXB0b3IgaGFuZGxlci4KKyAqIEBkYXRhOiBpbyBkZXNjcmlwdG9yCisgKi8KK3N0YXRpYyB2b2lkCitxbGEyeDAwX2lvZGVzY190aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqaW9kZXNjOworCisJaW9kZXNjID0gKHN0cnVjdCBpb19kZXNjcmlwdG9yICopIGRhdGE7CisKKwlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBJTyBkZXNjcmlwdG9yIHRpbWVvdXQsIGluZGV4PSV4ICIKKwkgICAgInNpZ25hdHVyZT0lMDh4LCBzY2hlZHVsaW5nIElTUCBhYm9ydC5cbiIsIGlvZGVzYy0+aGEtPmhvc3Rfbm8sCisJICAgIGlvZGVzYy0+aWR4LCBpb2Rlc2MtPnNpZ25hdHVyZSkpOworCisJcWxhMngwMF9mcmVlX2lvZGVzYyhpb2Rlc2MpOworCisJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGlvZGVzYy0+aGEsCisJICAgICJJTyBkZXNjcmlwdG9yIHRpbWVvdXQuIFNjaGVkdWxpbmcgSVNQIGFib3J0LlxuIik7CisJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaW9kZXNjLT5oYS0+ZHBjX2ZsYWdzKTsKK30KKworLyoqCisgKiBxbGEyeDAwX2FkZF9pb2Rlc2NfdGltZXIoKSAtIEFkZCBhbmQgc3RhcnQgYSB0aW1lciBmb3IgYW4gSU8gZGVzY3JpcHRvci4KKyAqIEBpb2Rlc2M6IGlvIGRlc2NyaXB0b3IKKyAqCisgKiBOT1RFOgorICogVGhlIGZpcm13YXJlIHNoYWxsIHRpbWVvdXQgYW4gb3V0c3RhbmRpbmcgbWFpbGJveCBJT0NCIGluIDIgKiBSX0FfVE9WIChpbgorICogdGVudGhzIG9mIGEgc2Vjb25kKSBhZnRlciBpdCBoaXRzIHRoZSB3aXJlLiAgQnV0LCBpZiB0aGVyZSBhcmUgYW55IHJlcXVlc3QKKyAqIHJlc291cmNlIGNvbnRyYWludHMgKGkuZS4gZHVyaW5nIGhlYXZ5IEkvTyksIGV4Y2hhbmdlcyBjYW4gYmUgaGVsZCBvZmYgZm9yCisgKiBhdCBtb3N0IFJfQV9UT1YuICBUaGVyZWZvcmUsIHRoZSBkcml2ZXIgd2lsbCB3YWl0IDQgKiBSX0FfVE9WIGJlZm9yZQorICogc2NoZWR1bGluZyBhIHJlY292ZXJ5IChiaWcgaGFtbWVyKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitxbGEyeDAwX2FkZF9pb2Rlc2NfdGltZXIoc3RydWN0IGlvX2Rlc2NyaXB0b3IgKmlvZGVzYykKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwl0aW1lb3V0ID0gKGlvZGVzYy0+aGEtPnJfYV90b3YgKiA0KSAvIDEwOworCWluaXRfdGltZXIoJmlvZGVzYy0+dGltZXIpOworCWlvZGVzYy0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBpb2Rlc2M7CisJaW9kZXNjLT50aW1lci5leHBpcmVzID0gamlmZmllcyArICh0aW1lb3V0ICogSFopOworCWlvZGVzYy0+dGltZXIuZnVuY3Rpb24gPQorCSAgICAodm9pZCAoKikgKHVuc2lnbmVkIGxvbmcpKSBxbGEyeDAwX2lvZGVzY190aW1lb3V0OworCWFkZF90aW1lcigmaW9kZXNjLT50aW1lcik7Cit9CisKKy8qKiAKKyAqIElPIGRlc2NyaXB0b3Igc3VwcG9ydCByb3V0aW5lcy4KKyAqKi8KKworLyoqCisgKiBxbGEyeDAwX3VwZGF0ZV9sb2dpbl9mY3BvcnQoKSAtIFVwZGF0ZSBmY3BvcnQgZGF0YSBhZnRlciBsb2dpbiBwcm9jZXNzaW5nLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAbWJ4c3RhdDogTWFpbGJveCBjb21tYW5kIHN0YXR1cyBJT0NCCisgKiBAZmNwb3J0OiBwb3J0IHRvIHVwZGF0ZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTJ4MDBfdXBkYXRlX2xvZ2luX2ZjcG9ydChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzdHJ1Y3QgbWJ4X2VudHJ5ICptYnhzdGF0LAorICAgIGZjX3BvcnRfdCAqZmNwb3J0KQoreworCWlmIChsZTE2X3RvX2NwdShtYnhzdGF0LT5tYjEpICYgQklUXzApIHsKKwkJZmNwb3J0LT5wb3J0X3R5cGUgPSBGQ1RfSU5JVElBVE9SOworCX0gZWxzZSB7CisJCWZjcG9ydC0+cG9ydF90eXBlID0gRkNUX1RBUkdFVDsKKwkJaWYgKGxlMTZfdG9fY3B1KG1ieHN0YXQtPm1iMSkgJiBCSVRfMSkgeworCQkJZmNwb3J0LT5mbGFncyB8PSBGQ0ZfVEFQRV9QUkVTRU5UOworCQl9CisJfQorCWZjcG9ydC0+bG9naW5fcmV0cnkgPSAwOworCWZjcG9ydC0+cG9ydF9sb2dpbl9yZXRyeV9jb3VudCA9IGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgKgorCSAgICBQT1JUX1JFVFJZX1RJTUU7CisJYXRvbWljX3NldCgmZmNwb3J0LT5wb3J0X2Rvd25fdGltZXIsIGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgKgorCSAgICBQT1JUX1JFVFJZX1RJTUUpOworCWZjcG9ydC0+ZmxhZ3MgfD0gRkNGX0ZBQlJJQ19ERVZJQ0U7CisJZmNwb3J0LT5mbGFncyAmPSB+RkNGX0ZBSUxPVkVSX05FRURFRDsKKwlmY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9IElPREVTQ19JTlZBTElEX0lOREVYOworCWF0b21pY19zZXQoJmZjcG9ydC0+c3RhdGUsIEZDU19PTkxJTkUpOworfQorCisKKy8qKiAKKyAqIE1haWxib3ggSU9DQiBjb21tYW5kcy4KKyAqKi8KKworLyoqCisgKiBxbGEyeDAwX2dldF9tYnhfaW9jYl9lbnRyeSgpIC0gUmV0cmlldmUgYW4gSU9DQiBmcm9tIHRoZSByZXF1ZXN0IHF1ZXVlLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAaGFuZGxlOiBoYW5kbGUgdG8gaW8gZGVzY3JpcHRvcgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSByZXFlc3QgZW50cnksIG9yIE5VTEwsIGlmIG5vbmUgd2VyZSBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1ieF9lbnRyeSAqCitxbGEyeDAwX2dldF9tYnhfaW9jYl9lbnRyeShzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCBoYW5kbGUpCit7CisJdWludDE2X3QgY250OworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCXN0cnVjdCBtYnhfZW50cnkgKm1ieGVudHJ5OworCisJbWJ4ZW50cnkgPSBOVUxMOworCisJaWYgKGhhLT5yZXFfcV9jbnQgPCAzKSB7CisJCWNudCA9IHFsYTJ4MDBfZGVib3VuY2VfcmVnaXN0ZXIoSVNQX1JFUV9RX09VVChoYSwgcmVnKSk7CisJCWlmICAoaGEtPnJlcV9yaW5nX2luZGV4IDwgY250KQorCQkJaGEtPnJlcV9xX2NudCA9IGNudCAtIGhhLT5yZXFfcmluZ19pbmRleDsKKwkJZWxzZQorCQkJaGEtPnJlcV9xX2NudCA9IGhhLT5yZXF1ZXN0X3FfbGVuZ3RoIC0KKwkJCSAgICAoaGEtPnJlcV9yaW5nX2luZGV4IC0gY250KTsKKwl9CisJaWYgKGhhLT5yZXFfcV9jbnQgPj0gMykgeworCQltYnhlbnRyeSA9IChzdHJ1Y3QgbWJ4X2VudHJ5ICopaGEtPnJlcXVlc3RfcmluZ19wdHI7CisKKwkJbWVtc2V0KG1ieGVudHJ5LCAwLCBzaXplb2Yoc3RydWN0IG1ieF9lbnRyeSkpOworCQltYnhlbnRyeS0+ZW50cnlfdHlwZSA9IE1CWF9JT0NCX1RZUEU7CisJCW1ieGVudHJ5LT5lbnRyeV9jb3VudCA9IDE7CisJCW1ieGVudHJ5LT5zeXNfZGVmaW5lMSA9IFNPVVJDRV9BU1lOQ19JT0NCOworCQltYnhlbnRyeS0+aGFuZGxlID0gaGFuZGxlOworCX0KKwlyZXR1cm4gKG1ieGVudHJ5KTsKK30KKworLyoqCisgKiBxbGEyeDAwX3NlbmRfYWJvcnRfaW9jYigpIC0gSXNzdWUgYW4gYWJvcnQgSU9DQiB0byB0aGUgZmlybXdhcmUuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBpb2Rlc2M6IGlvIGRlc2NyaXB0b3IKKyAqIEBoYW5kbGVfdG9fYWJvcnQ6IGZpcm13YXJlIGhhbmRsZSB0byBhYm9ydAorICogQGhhX2xvY2tlZDogaXMgZnVuY3Rpb24gY2FsbGVkIHdpdGggdGhlIGhhcmR3YXJlIGxvY2sKKyAqCisgKiBSZXR1cm5zIFFMQV9TVUNDRVNTIGlmIHRoZSBJT0NCIHdhcyBpc3N1ZWQuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfc2VuZF9hYm9ydF9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN0cnVjdCBpb19kZXNjcmlwdG9yICppb2Rlc2MsIAorICAgIHVpbnQzMl90IGhhbmRsZV90b19hYm9ydCwgaW50IGhhX2xvY2tlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlzdHJ1Y3QgbWJ4X2VudHJ5ICptYnhlbnRyeTsKKworCS8qIFNlbmQgbWFya2VyIGlmIHJlcXVpcmVkLiAqLworCWlmIChxbGEyeDAwX2lzc3VlX21hcmtlcihoYSwgaGFfbG9ja2VkKSAhPSBRTEFfU1VDQ0VTUykKKwkJcmV0dXJuIChRTEFfRlVOQ1RJT05fRkFJTEVEKTsKKworCWlmICghaGFfbG9ja2VkKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCS8qIEJ1aWxkIGFib3J0IG1haWxib3ggSU9DQi4gKi8KKwltYnhlbnRyeSA9IHFsYTJ4MDBfZ2V0X21ieF9pb2NiX2VudHJ5KGhhLCBpb2Rlc2MtPnNpZ25hdHVyZSk7CisJaWYgKG1ieGVudHJ5ID09IE5VTEwpIHsKKwkJaWYgKCFoYV9sb2NrZWQpCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJCXJldHVybiAoUUxBX0ZVTkNUSU9OX0ZBSUxFRCk7CisJfQorCW1ieGVudHJ5LT5tYjAgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KE1CQ19BQk9SVF9DT01NQU5EKTsKKwltYnhlbnRyeS0+bWIxID0gbWJ4ZW50cnktPmxvb3BfaWQuZXh0ZW5kZWQgPQorCSAgICBjcHVfdG9fbGUxNihpb2Rlc2MtPnJlbW90ZV9mY3BvcnQtPmxvb3BfaWQpOworCW1ieGVudHJ5LT5tYjIgPSBMU1coaGFuZGxlX3RvX2Fib3J0KTsKKwltYnhlbnRyeS0+bWIzID0gTVNXKGhhbmRsZV90b19hYm9ydCk7CisJd21iKCk7CisKKwlxbGEyeDAwX2FkZF9pb2Rlc2NfdGltZXIoaW9kZXNjKTsKKworCS8qIElzc3VlIGNvbW1hbmQgdG8gSVNQLiAqLworCXFsYTJ4MDBfaXNwX2NtZChoYSk7CisKKwlpZiAoIWhhX2xvY2tlZCkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IFNlbmRpbmcgQWJvcnQgSU9DQiAoJTA4eCkgdG8gWyV4XSwgYWJvcnRpbmcgIgorCSAgICAiJTA4eC5cbiIsIGhhLT5ob3N0X25vLCBpb2Rlc2MtPnNpZ25hdHVyZSwKKwkgICAgaW9kZXNjLT5yZW1vdGVfZmNwb3J0LT5sb29wX2lkLCBoYW5kbGVfdG9fYWJvcnQpKTsKKworCXJldHVybiAoUUxBX1NVQ0NFU1MpOworfQorCisvKioKKyAqIHFsYTJ4MDBfc2VuZF9hYm9ydF9pb2NiX2NiKCkgLSBBYm9ydCBJT0NCIGNhbGxiYWNrLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAaW9kZXNjOiBpbyBkZXNjcmlwdG9yCisgKiBAbWJ4c3RhdDogbWFpbGJveCBzdGF0dXMgSU9DQgorICoKKyAqIFJldHVybnMgUUxBX1NVQ0NFU1MgaWYgQGlvZGVzYyBjYW4gYmUgZnJlZWQgYnkgdGhlIGNhbGxlciwgZWxzZSwgQGlvZGVzYworICogd2lsbCBiZSB1c2VkIGZvciBhIHJldHJ5LgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX3NlbmRfYWJvcnRfaW9jYl9jYihzY3NpX3FsYV9ob3N0X3QgKmhhLCBzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqaW9kZXNjLAorICAgIHN0cnVjdCBtYnhfZW50cnkgKm1ieHN0YXQpCit7CisJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogQWJvcnQgSU9DQiAtLSBzZW50IHRvIFsleC8lMDJ4JTAyeCUwMnhdLCAiCisJICAgICJzdGF0dXM9JXggbWIwPSV4LlxuIiwgaGEtPmhvc3Rfbm8sIGlvZGVzYy0+cmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCwKKwkgICAgaW9kZXNjLT5kX2lkLmIuZG9tYWluLCBpb2Rlc2MtPmRfaWQuYi5hcmVhLCBpb2Rlc2MtPmRfaWQuYi5hbF9wYSwKKwkgICAgbGUxNl90b19jcHUobWJ4c3RhdC0+c3RhdHVzKSwgbGUxNl90b19jcHUobWJ4c3RhdC0+bWIwKSkpOworCisJcmV0dXJuIChRTEFfU1VDQ0VTUyk7Cit9CisKKworLyoqCisgKiBxbGEyeDAwX3NlbmRfYWRpc2NfaW9jYigpIC0gSXNzdWUgYSBHZXQgUG9ydCBEYXRhYmFzZSBJT0NCIHRvIHRoZSBmaXJtd2FyZS4KKyAqIEBoYTogSEEgY29udGV4dAorICogQGlvZGVzYzogaW8gZGVzY3JpcHRvcgorICogQGhhX2xvY2tlZDogaXMgZnVuY3Rpb24gY2FsbGVkIHdpdGggdGhlIGhhcmR3YXJlIGxvY2sKKyAqCisgKiBSZXR1cm5zIFFMQV9TVUNDRVNTIGlmIHRoZSBJT0NCIHdhcyBpc3N1ZWQuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfc2VuZF9hZGlzY19pb2NiKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN0cnVjdCBpb19kZXNjcmlwdG9yICppb2Rlc2MsCisgICAgaW50IGhhX2xvY2tlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlzdHJ1Y3QgbWJ4X2VudHJ5ICptYnhlbnRyeTsKKworCS8qIFNlbmQgbWFya2VyIGlmIHJlcXVpcmVkLiAqLworCWlmIChxbGEyeDAwX2lzc3VlX21hcmtlcihoYSwgaGFfbG9ja2VkKSAhPSBRTEFfU1VDQ0VTUykKKwkJcmV0dXJuIChRTEFfRlVOQ1RJT05fRkFJTEVEKTsKKworCWlmICghaGFfbG9ja2VkKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCS8qIEJ1aWxkIEdldCBQb3J0IERhdGFiYXNlIElPQ0IuICovCisJbWJ4ZW50cnkgPSBxbGEyeDAwX2dldF9tYnhfaW9jYl9lbnRyeShoYSwgaW9kZXNjLT5zaWduYXR1cmUpOworCWlmIChtYnhlbnRyeSA9PSBOVUxMKSB7CisJCWlmICghaGFfbG9ja2VkKQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOworCX0KKwltYnhlbnRyeS0+bWIwID0gX19jb25zdGFudF9jcHVfdG9fbGUxNihNQkNfR0VUX1BPUlRfREFUQUJBU0UpOworCW1ieGVudHJ5LT5tYjEgPSBtYnhlbnRyeS0+bG9vcF9pZC5leHRlbmRlZCA9CisJICAgIGNwdV90b19sZTE2KGlvZGVzYy0+cmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCk7CisJbWJ4ZW50cnktPm1iMiA9IGNwdV90b19sZTE2KE1TVyhMU0QoaGEtPmlvZGVzY19wZF9kbWEpKSk7CisJbWJ4ZW50cnktPm1iMyA9IGNwdV90b19sZTE2KExTVyhMU0QoaGEtPmlvZGVzY19wZF9kbWEpKSk7CisJbWJ4ZW50cnktPm1iNiA9IGNwdV90b19sZTE2KE1TVyhNU0QoaGEtPmlvZGVzY19wZF9kbWEpKSk7CisJbWJ4ZW50cnktPm1iNyA9IGNwdV90b19sZTE2KExTVyhNU0QoaGEtPmlvZGVzY19wZF9kbWEpKSk7CisJbWJ4ZW50cnktPm1iMTAgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KEJJVF8wKTsKKwl3bWIoKTsKKworCXFsYTJ4MDBfYWRkX2lvZGVzY190aW1lcihpb2Rlc2MpOworCisJLyogSXNzdWUgY29tbWFuZCB0byBJU1AuICovCisJcWxhMngwMF9pc3BfY21kKGhhKTsKKworCWlmICghaGFfbG9ja2VkKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogU2VuZGluZyBBZGlzYyBJT0NCICglMDh4KSB0byBbJXhdLlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8sIGlvZGVzYy0+c2lnbmF0dXJlLCBpb2Rlc2MtPnJlbW90ZV9mY3BvcnQtPmxvb3BfaWQpKTsKKworCXJldHVybiAoUUxBX1NVQ0NFU1MpOworfQorCisvKioKKyAqIHFsYTJ4MDBfc2VuZF9hZGlzY19pb2NiX2NiKCkgLSBHZXQgUG9ydCBEYXRhYmFzZSBJT0NCIGNhbGxiYWNrLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAaW9kZXNjOiBpbyBkZXNjcmlwdG9yCisgKiBAbWJ4c3RhdDogbWFpbGJveCBzdGF0dXMgSU9DQgorICoKKyAqIFJldHVybnMgUUxBX1NVQ0NFU1MgaWYgQGlvZGVzYyBjYW4gYmUgZnJlZWQgYnkgdGhlIGNhbGxlciwgZWxzZSwgQGlvZGVzYworICogd2lsbCBiZSB1c2VkIGZvciBhIHJldHJ5LgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX3NlbmRfYWRpc2NfaW9jYl9jYihzY3NpX3FsYV9ob3N0X3QgKmhhLCBzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqaW9kZXNjLAorICAgIHN0cnVjdCBtYnhfZW50cnkgKm1ieHN0YXQpCit7CisJZmNfcG9ydF90ICpyZW1vdGVfZmNwb3J0OworCisJcmVtb3RlX2ZjcG9ydCA9IGlvZGVzYy0+cmVtb3RlX2ZjcG9ydDsKKworCS8qIEVuc3VyZSB0aGUgcG9ydCBJRHMgYXJlIGNvbnNpc3RlbnQuICovCisJaWYgKHJlbW90ZV9mY3BvcnQtPmRfaWQuYjI0ICE9IGlvZGVzYy0+ZF9pZC5iMjQpIHsKKwkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogQWRpc2MgSU9DQiAtLSBpZ25vcmluZywgcmVtb3RlIHBvcnQgIgorCQkgICAgImlkIGNoYW5nZWQgZnJvbSBbJTAyeCUwMnglMDJ4XSB0byBbJTAyeCUwMnglMDJ4XS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkJICAgIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5hcmVhLCByZW1vdGVfZmNwb3J0LT5kX2lkLmIuYWxfcGEsCisJCSAgICBpb2Rlc2MtPmRfaWQuYi5kb21haW4sIGlvZGVzYy0+ZF9pZC5iLmFyZWEsCisJCSAgICBpb2Rlc2MtPmRfaWQuYi5hbF9wYSkpOworCisJCXJldHVybiAoUUxBX1NVQ0NFU1MpOworCX0KKworCS8qIE9ubHkgcHJvY2VzcyB0aGUgbGFzdCBjb21tYW5kLiAqLworCWlmIChyZW1vdGVfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgIT0gaW9kZXNjLT5pZHgpIHsKKwkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogQWRpc2MgSU9DQiAtLSBpZ25vcmluZywgc2VudCB0byAiCisJCSAgICAiWyUwMnglMDJ4JTAyeF0sIGV4cGVjdGVkICV4LCByZWNlaXZlZCAleC5cbiIsIGhhLT5ob3N0X25vLAorCQkgICAgaW9kZXNjLT5kX2lkLmIuZG9tYWluLCBpb2Rlc2MtPmRfaWQuYi5hcmVhLAorCQkgICAgaW9kZXNjLT5kX2lkLmIuYWxfcGEsIHJlbW90ZV9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCwKKwkJICAgIGlvZGVzYy0+aWR4KSk7CisKKwkJcmV0dXJuIChRTEFfU1VDQ0VTUyk7CisJfQorCisJaWYgKGxlMTZfdG9fY3B1KG1ieHN0YXQtPnN0YXR1cykgPT0gQ1NfQ09NUExFVEUpIHsKKwkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogQWRpc2MgSU9DQiAtLSBtYXJraW5nICIKKwkJICAgICJbJXgvJTAyeCUwMnglMDJ4XSBvbmxpbmUuXG4iLCBoYS0+aG9zdF9ubywKKwkJICAgIHJlbW90ZV9mY3BvcnQtPmxvb3BfaWQsIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5kb21haW4sCisJCSAgICByZW1vdGVfZmNwb3J0LT5kX2lkLmIuYXJlYSwgcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisKKwkJYXRvbWljX3NldCgmcmVtb3RlX2ZjcG9ydC0+c3RhdGUsIEZDU19PTkxJTkUpOworCX0gZWxzZSB7CisJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IEFkaXNjIElPQ0IgLS0gbWFya2luZyAiCisJCSAgICAiWyV4LyUwMnglMDJ4JTAyeF0gbG9zdCwgc3RhdHVzPSV4IG1iMD0leC5cbiIsIGhhLT5ob3N0X25vLAorCQkgICAgcmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCwgcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkJICAgIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5hcmVhLCByZW1vdGVfZmNwb3J0LT5kX2lkLmIuYWxfcGEsCisJCSAgICBsZTE2X3RvX2NwdShtYnhzdGF0LT5zdGF0dXMpLCBsZTE2X3RvX2NwdShtYnhzdGF0LT5tYjApKSk7CisKKwkJaWYgKGF0b21pY19yZWFkKCZyZW1vdGVfZmNwb3J0LT5zdGF0ZSkgIT0gRkNTX0RFVklDRV9ERUFEKQorCQkJYXRvbWljX3NldCgmcmVtb3RlX2ZjcG9ydC0+c3RhdGUsIEZDU19ERVZJQ0VfTE9TVCk7CisJfQorCXJlbW90ZV9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9IElPREVTQ19JTlZBTElEX0lOREVYOworCisJcmV0dXJuIChRTEFfU1VDQ0VTUyk7Cit9CisKKworLyoqCisgKiBxbGEyeDAwX3NlbmRfbG9nb3V0X2lvY2IoKSAtIElzc3VlIGEgZmFicmljIHBvcnQgbG9nb3V0IElPQ0IgdG8gdGhlIGZpcm13YXJlLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAaW9kZXNjOiBpbyBkZXNjcmlwdG9yCisgKiBAaGFfbG9ja2VkOiBpcyBmdW5jdGlvbiBjYWxsZWQgd2l0aCB0aGUgaGFyZHdhcmUgbG9jaworICoKKyAqIFJldHVybnMgUUxBX1NVQ0NFU1MgaWYgdGhlIElPQ0Igd2FzIGlzc3VlZC4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9zZW5kX2xvZ291dF9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN0cnVjdCBpb19kZXNjcmlwdG9yICppb2Rlc2MsCisgICAgaW50IGhhX2xvY2tlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlzdHJ1Y3QgbWJ4X2VudHJ5ICptYnhlbnRyeTsKKworCS8qIFNlbmQgbWFya2VyIGlmIHJlcXVpcmVkLiAqLworCWlmIChxbGEyeDAwX2lzc3VlX21hcmtlcihoYSwgaGFfbG9ja2VkKSAhPSBRTEFfU1VDQ0VTUykKKwkJcmV0dXJuIChRTEFfRlVOQ1RJT05fRkFJTEVEKTsKKworCWlmICghaGFfbG9ja2VkKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCS8qIEJ1aWxkIGZhYnJpYyBwb3J0IGxvZ291dCBtYWlsYm94IElPQ0IuICovCisJbWJ4ZW50cnkgPSBxbGEyeDAwX2dldF9tYnhfaW9jYl9lbnRyeShoYSwgaW9kZXNjLT5zaWduYXR1cmUpOworCWlmIChtYnhlbnRyeSA9PSBOVUxMKSB7CisJCWlmICghaGFfbG9ja2VkKQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOworCX0KKwltYnhlbnRyeS0+bWIwID0gX19jb25zdGFudF9jcHVfdG9fbGUxNihNQkNfTE9HT1VUX0ZBQlJJQ19QT1JUKTsKKwltYnhlbnRyeS0+bWIxID0gbWJ4ZW50cnktPmxvb3BfaWQuZXh0ZW5kZWQgPQorCSAgICBjcHVfdG9fbGUxNihpb2Rlc2MtPnJlbW90ZV9mY3BvcnQtPmxvb3BfaWQpOworCXdtYigpOworCisJcWxhMngwMF9hZGRfaW9kZXNjX3RpbWVyKGlvZGVzYyk7CisKKwkvKiBJc3N1ZSBjb21tYW5kIHRvIElTUC4gKi8KKwlxbGEyeDAwX2lzcF9jbWQoaGEpOworCisJaWYgKCFoYV9sb2NrZWQpCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBTZW5kaW5nIExvZ291dCBJT0NCICglMDh4KSB0byBbJXhdLlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8sIGlvZGVzYy0+c2lnbmF0dXJlLCBpb2Rlc2MtPnJlbW90ZV9mY3BvcnQtPmxvb3BfaWQpKTsKKworCXJldHVybiAoUUxBX1NVQ0NFU1MpOworfQorCisvKioKKyAqIHFsYTJ4MDBfc2VuZF9sb2dvdXRfaW9jYl9jYigpIC0gRmFicmljIHBvcnQgbG9nb3V0IElPQ0IgY2FsbGJhY2suCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBpb2Rlc2M6IGlvIGRlc2NyaXB0b3IKKyAqIEBtYnhzdGF0OiBtYWlsYm94IHN0YXR1cyBJT0NCCisgKgorICogUmV0dXJucyBRTEFfU1VDQ0VTUyBpZiBAaW9kZXNjIGNhbiBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLCBlbHNlLCBAaW9kZXNjCisgKiB3aWxsIGJlIHVzZWQgZm9yIGEgcmV0cnkuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfc2VuZF9sb2dvdXRfaW9jYl9jYihzY3NpX3FsYV9ob3N0X3QgKmhhLCBzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqaW9kZXNjLAorICAgIHN0cnVjdCBtYnhfZW50cnkgKm1ieHN0YXQpCit7CisJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogTG9nb3V0IElPQ0IgLS0gc2VudCB0byBbJXgvJTAyeCUwMnglMDJ4XSwgIgorCSAgICAic3RhdHVzPSV4IG1iMD0leCBtYjE9JXguXG4iLCBoYS0+aG9zdF9ubywKKwkgICAgaW9kZXNjLT5yZW1vdGVfZmNwb3J0LT5sb29wX2lkLAorCSAgICBpb2Rlc2MtPnJlbW90ZV9mY3BvcnQtPmRfaWQuYi5kb21haW4sCisJICAgIGlvZGVzYy0+cmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJICAgIGlvZGVzYy0+cmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmFsX3BhLCBsZTE2X3RvX2NwdShtYnhzdGF0LT5zdGF0dXMpLAorCSAgICBsZTE2X3RvX2NwdShtYnhzdGF0LT5tYjApLCBsZTE2X3RvX2NwdShtYnhzdGF0LT5tYjEpKSk7CisKKwlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKK30KKworCisvKioKKyAqIHFsYTJ4MDBfc2VuZF9sb2dpbl9pb2NiKCkgLSBJc3N1ZSBhIGZhYnJpYyBwb3J0IGxvZ2luIElPQ0IgdG8gdGhlIGZpcm13YXJlLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAaW9kZXNjOiBpbyBkZXNjcmlwdG9yCisgKiBAZF9pZDogcG9ydCBpZCBmb3IgZGV2aWNlCisgKiBAaGFfbG9ja2VkOiBpcyBmdW5jdGlvbiBjYWxsZWQgd2l0aCB0aGUgaGFyZHdhcmUgbG9jaworICoKKyAqIFJldHVybnMgUUxBX1NVQ0NFU1MgaWYgdGhlIElPQ0Igd2FzIGlzc3VlZC4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9zZW5kX2xvZ2luX2lvY2Ioc2NzaV9xbGFfaG9zdF90ICpoYSwgc3RydWN0IGlvX2Rlc2NyaXB0b3IgKmlvZGVzYywKKyAgICBwb3J0X2lkX3QgKmRfaWQsIGludCBoYV9sb2NrZWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc3RydWN0IG1ieF9lbnRyeSAqbWJ4ZW50cnk7CisKKwkvKiBTZW5kIG1hcmtlciBpZiByZXF1aXJlZC4gKi8KKwlpZiAocWxhMngwMF9pc3N1ZV9tYXJrZXIoaGEsIGhhX2xvY2tlZCkgIT0gUUxBX1NVQ0NFU1MpCisJCXJldHVybiAoUUxBX0ZVTkNUSU9OX0ZBSUxFRCk7CisKKwlpZiAoIWhhX2xvY2tlZCkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwkvKiBCdWlsZCBmYWJyaWMgcG9ydCBsb2dpbiBtYWlsYm94IElPQ0IuICovCisJbWJ4ZW50cnkgPSBxbGEyeDAwX2dldF9tYnhfaW9jYl9lbnRyeShoYSwgaW9kZXNjLT5zaWduYXR1cmUpOworCWlmIChtYnhlbnRyeSA9PSBOVUxMKSB7CisJCWlmICghaGFfbG9ja2VkKQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOworCX0KKwltYnhlbnRyeS0+bWIwID0gX19jb25zdGFudF9jcHVfdG9fbGUxNihNQkNfTE9HSU5fRkFCUklDX1BPUlQpOworCW1ieGVudHJ5LT5tYjEgPSBtYnhlbnRyeS0+bG9vcF9pZC5leHRlbmRlZCA9CisJICAgIGNwdV90b19sZTE2KGlvZGVzYy0+cmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCk7CisJbWJ4ZW50cnktPm1iMiA9IGNwdV90b19sZTE2KGRfaWQtPmIuZG9tYWluKTsKKwltYnhlbnRyeS0+bWIzID0gY3B1X3RvX2xlMTYoZF9pZC0+Yi5hcmVhIDw8IDggfCBkX2lkLT5iLmFsX3BhKTsKKwltYnhlbnRyeS0+bWIxMCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoQklUXzApOworCXdtYigpOworCisJcWxhMngwMF9hZGRfaW9kZXNjX3RpbWVyKGlvZGVzYyk7CisKKwkvKiBJc3N1ZSBjb21tYW5kIHRvIElTUC4gKi8KKwlxbGEyeDAwX2lzcF9jbWQoaGEpOworCisJaWYgKCFoYV9sb2NrZWQpCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBTZW5kaW5nIExvZ2luIElPQ0IgKCUwOHgpIHRvICIKKwkgICAgIlsleC8lMDJ4JTAyeCUwMnhdLlxuIiwgaGEtPmhvc3Rfbm8sIGlvZGVzYy0+c2lnbmF0dXJlLAorCSAgICBpb2Rlc2MtPnJlbW90ZV9mY3BvcnQtPmxvb3BfaWQsIGRfaWQtPmIuZG9tYWluLCBkX2lkLT5iLmFyZWEsCisJICAgIGRfaWQtPmIuYWxfcGEpKTsKKworCXJldHVybiAoUUxBX1NVQ0NFU1MpOworfQorCisvKioKKyAqIHFsYTJ4MDBfc2VuZF9sb2dpbl9pb2NiX2NiKCkgLSBGYWJyaWMgcG9ydCBsb2dvdXQgSU9DQiBjYWxsYmFjay4KKyAqIEBoYTogSEEgY29udGV4dAorICogQGlvZGVzYzogaW8gZGVzY3JpcHRvcgorICogQG1ieHN0YXQ6IG1haWxib3ggc3RhdHVzIElPQ0IKKyAqCisgKiBSZXR1cm5zIFFMQV9TVUNDRVNTIGlmIEBpb2Rlc2MgY2FuIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIsIGVsc2UsIEBpb2Rlc2MKKyAqIHdpbGwgYmUgdXNlZCBmb3IgYSByZXRyeS4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9zZW5kX2xvZ2luX2lvY2JfY2Ioc2NzaV9xbGFfaG9zdF90ICpoYSwgc3RydWN0IGlvX2Rlc2NyaXB0b3IgKmlvZGVzYywKKyAgICBzdHJ1Y3QgbWJ4X2VudHJ5ICptYnhzdGF0KQoreworCWludCBydmFsOworCWZjX3BvcnRfdCAqZmNwb3J0LCAqcmVtb3RlX2ZjcG9ydCwgKmV4aXN0X2ZjcG9ydDsKKwlzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqYWJvcnRfaW9kZXNjLCAqbG9naW5faW9kZXNjOworCXVpbnQxNl90IHN0YXR1cywgbWJbOF07CisJdWludDE2X3QgcmV1c2U7CisJdWludDE2X3QgcmVtb3RlX2xvb3BpZDsKKwlwb3J0X2lkX3QgcmVtb3RlX2RpZCwgaW51c2VfZGlkOworCisJcmVtb3RlX2ZjcG9ydCA9IGlvZGVzYy0+cmVtb3RlX2ZjcG9ydDsKKworCS8qIE9ubHkgcHJvY2VzcyB0aGUgbGFzdCBjb21tYW5kLiAqLworCWlmIChyZW1vdGVfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgIT0gaW9kZXNjLT5pZHgpIHsKKwkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogTG9naW4gSU9DQiAtLSBpZ25vcmluZywgc2VudCB0byAiCisJCSAgICAiWyUwMnglMDJ4JTAyeF0sIGV4cGVjdGVkICV4LCByZWNlaXZlZCAleC5cbiIsIAorCQkgICAgaGEtPmhvc3Rfbm8sIGlvZGVzYy0+ZF9pZC5iLmRvbWFpbiwgaW9kZXNjLT5kX2lkLmIuYXJlYSwKKwkJICAgIGlvZGVzYy0+ZF9pZC5iLmFsX3BhLCByZW1vdGVfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQsCisJCSAgICBpb2Rlc2MtPmlkeCkpOworCisJCS8qIEZyZWUgUlNDTiBmY3BvcnQgcmVzb3VyY2VzLiAqLworCQlpZiAocmVtb3RlX2ZjcG9ydC0+cG9ydF90eXBlID09IEZDVF9SU0NOKSB7CisJCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBMb2dpbiBJT0NCIC0tIEZyZWVpbmcgUlNDTiAiCisJCQkgICAgImZjcG9ydCAlcCBbJXgvJTAyeCUwMnglMDJ4XSBnaXZlbiBpZ25vcmVkIExvZ2luICIKKwkJCSAgICAiSU9DQi5cbiIsIGhhLT5ob3N0X25vLCByZW1vdGVfZmNwb3J0LAorCQkJICAgIHJlbW90ZV9mY3BvcnQtPmxvb3BfaWQsCisJCQkgICAgcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkJCSAgICByZW1vdGVfZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkJCSAgICByZW1vdGVfZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKworCQkJbGlzdF9kZWwoJnJlbW90ZV9mY3BvcnQtPmxpc3QpOworCQkJa2ZyZWUocmVtb3RlX2ZjcG9ydCk7CisJCX0KKwkJcmV0dXJuIChRTEFfU1VDQ0VTUyk7CisJfQorCisJc3RhdHVzID0gbGUxNl90b19jcHUobWJ4c3RhdC0+c3RhdHVzKTsKKwltYlswXSA9IGxlMTZfdG9fY3B1KG1ieHN0YXQtPm1iMCk7CisJbWJbMV0gPSBsZTE2X3RvX2NwdShtYnhzdGF0LT5tYjEpOworCW1iWzJdID0gbGUxNl90b19jcHUobWJ4c3RhdC0+bWIyKTsKKwltYls2XSA9IGxlMTZfdG9fY3B1KG1ieHN0YXQtPm1iNik7CisJbWJbN10gPSBsZTE2X3RvX2NwdShtYnhzdGF0LT5tYjcpOworCisJLyogR29vZCBzdGF0dXM/ICovCisJaWYgKChzdGF0dXMgPT0gQ1NfQ09NUExFVEUgfHwgc3RhdHVzID09IENTX0NPTVBMRVRFX0NIS0NPTkQpICYmCisJICAgIG1iWzBdID09IE1CU19DT01NQU5EX0NPTVBMRVRFKSB7CisKKwkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogTG9naW4gSU9DQiAtLSBzdGF0dXM9JXggbWIxPSV4IHBuPSIKKwkJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeC5cbiIsIGhhLT5ob3N0X25vLCBzdGF0dXMsCisJCSAgICBtYlsxXSwgbWJ4c3RhdC0+cG9ydF9uYW1lWzBdLCBtYnhzdGF0LT5wb3J0X25hbWVbMV0sIAorCQkgICAgbWJ4c3RhdC0+cG9ydF9uYW1lWzJdLCBtYnhzdGF0LT5wb3J0X25hbWVbM10sIAorCQkgICAgbWJ4c3RhdC0+cG9ydF9uYW1lWzRdLCBtYnhzdGF0LT5wb3J0X25hbWVbNV0sIAorCQkgICAgbWJ4c3RhdC0+cG9ydF9uYW1lWzZdLCBtYnhzdGF0LT5wb3J0X25hbWVbN10pKTsKKworCQltZW1jcHkocmVtb3RlX2ZjcG9ydC0+bm9kZV9uYW1lLCBtYnhzdGF0LT5ub2RlX25hbWUsIFdXTl9TSVpFKTsKKwkJbWVtY3B5KHJlbW90ZV9mY3BvcnQtPnBvcnRfbmFtZSwgbWJ4c3RhdC0+cG9ydF9uYW1lLCBXV05fU0laRSk7CisKKwkJLyogSXMgdGhlIGRldmljZSBhbHJlYWR5IGluIG91ciBmY3BvcnRzIGxpc3Q/ICovCisJCWlmIChyZW1vdGVfZmNwb3J0LT5wb3J0X3R5cGUgIT0gRkNUX1JTQ04pIHsKKwkJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IExvZ2luIElPQ0IgLS0gbWFya2luZyAiCisJCQkgICAgIlsleC8lMDJ4JTAyeCUwMnhdIG9ubGluZS5cbiIsIGhhLT5ob3N0X25vLAorCQkJICAgIHJlbW90ZV9mY3BvcnQtPmxvb3BfaWQsCisJCQkgICAgcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkJCSAgICByZW1vdGVfZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkJCSAgICByZW1vdGVfZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKworCQkJcWxhMngwMF91cGRhdGVfbG9naW5fZmNwb3J0KGhhLCBtYnhzdGF0LCByZW1vdGVfZmNwb3J0KTsKKworCQkJcmV0dXJuIChRTEFfU1VDQ0VTUyk7CisJCX0KKworCQkvKiBEb2VzIHRoZSBSU0NOIHBvcnRuYW1lIGFscmVhZHkgZXhpc3QgaW4gb3VyIGZjcG9ydHMgbGlzdD8gKi8KKwkJZXhpc3RfZmNwb3J0ID0gTlVMTDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZoYS0+ZmNwb3J0cywgbGlzdCkgeworCQkJaWYgKG1lbWNtcChyZW1vdGVfZmNwb3J0LT5wb3J0X25hbWUsIGZjcG9ydC0+cG9ydF9uYW1lLAorCQkJICAgIFdXTl9TSVpFKSA9PSAwKSB7CisJCQkJZXhpc3RfZmNwb3J0ID0gZmNwb3J0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChleGlzdF9mY3BvcnQgIT0gTlVMTCkgeworCQkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogTG9naW4gSU9DQiAtLSBmb3VuZCBSU0NOICIKKwkJCSAgICAiZmNwb3J0IGluIGZjcG9ydHMgbGlzdCBbJXBdLlxuIiwgaGEtPmhvc3Rfbm8sCisJCQkgICAgZXhpc3RfZmNwb3J0KSk7CisKKwkJCS8qIEFib3J0IGFueSBBRElTQyB0aGF0IGNvdWxkIGhhdmUgYmVlbiBzZW50LiAqLworCQkJaWYgKGV4aXN0X2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ICE9IGlvZGVzYy0+aWR4ICYmCisJCQkgICAgZXhpc3RfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgPAorCQkJICAgIE1BWF9JT19ERVNDUklQVE9SUyAmJgorCQkJICAgIGhhLT5pb19kZXNjcmlwdG9yc1tleGlzdF9mY3BvcnQtPmlvZGVzY19pZHhfc2VudF0uCisJCQkgICAgY2JfaWR4ID09IEFESVNDX1BPUlRfSU9DQl9DQikgeworCisJCQkJYWJvcnRfaW9kZXNjID0gcWxhMngwMF9hbGxvY19pb2Rlc2MoaGEpOworCQkJCWlmIChhYm9ydF9pb2Rlc2MpIHsKKwkJCQkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogTG9naW4gSU9DQiAiCisJCQkJCSAgICAiLS0gaXNzdWluZyBhYm9ydCB0byBvdXRzdGFuZGluZyAiCisJCQkJCSAgICAiQWRpc2MgWyV4LyUwMnglMDJ4JTAyeF0uXG4iLAorCQkJCQkgICAgaGEtPmhvc3Rfbm8sIHJlbW90ZV9mY3BvcnQtPmxvb3BfaWQsCisJCQkJCSAgICBleGlzdF9mY3BvcnQtPmRfaWQuYi5kb21haW4sCisJCQkJCSAgICBleGlzdF9mY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkJCQkgICAgZXhpc3RfZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKworCQkJCQlhYm9ydF9pb2Rlc2MtPmNiX2lkeCA9IEFCT1JUX0lPQ0JfQ0I7CisJCQkJCWFib3J0X2lvZGVzYy0+ZF9pZC5iMjQgPQorCQkJCQkgICAgZXhpc3RfZmNwb3J0LT5kX2lkLmIyNDsKKwkJCQkJYWJvcnRfaW9kZXNjLT5yZW1vdGVfZmNwb3J0ID0KKwkJCQkJICAgIGV4aXN0X2ZjcG9ydDsKKwkJCQkJZXhpc3RfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgPQorCQkJCQkgICAgYWJvcnRfaW9kZXNjLT5pZHg7CisJCQkJCXFsYTJ4MDBfc2VuZF9hYm9ydF9pb2NiKGhhLAorCQkJCQkgICAgYWJvcnRfaW9kZXNjLCBoYS0+aW9fZGVzY3JpcHRvcnNbCisJCQkJCSAgICAgZXhpc3RfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnRdLgorCQkJCQkgICAgICBzaWduYXR1cmUsIDEpOworCQkJCX0gZWxzZSB7CisJCQkJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IExvZ2luIElPQ0IgIgorCQkJCQkgICAgIi0tIHVuYWJsZSB0byBhYm9ydCBvdXRzdGFuZGluZyAiCisJCQkJCSAgICAiQWRpc2MgWyV4LyUwMnglMDJ4JTAyeF0uXG4iLAorCQkJCQkgICAgaGEtPmhvc3Rfbm8sIHJlbW90ZV9mY3BvcnQtPmxvb3BfaWQsCisJCQkJCSAgICBleGlzdF9mY3BvcnQtPmRfaWQuYi5kb21haW4sCisJCQkJCSAgICBleGlzdF9mY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkJCQkgICAgZXhpc3RfZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKwkJCQl9CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgZXhpc3RpbmcgZmNwb3J0IGlzIHdhaXRpbmcgdG8gc2VuZCBhbiBBRElTQworCQkJICogb3IgTE9HSU4sIHRoZW4gcmV1c2UgcmVtb3RlIGZjcG9ydCAoUlNDTikgdG8KKwkJCSAqIGNvbnRpbnVlIHdhaXRpbmcuCisJCQkgKi8KKwkJCXJldXNlID0gMDsKKwkJCXJlbW90ZV9sb29waWQgPSByZW1vdGVfZmNwb3J0LT5sb29wX2lkOworCQkJcmVtb3RlX2RpZC5iMjQgPSByZW1vdGVfZmNwb3J0LT5kX2lkLmIyNDsKKwkJCWlmIChleGlzdF9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9PQorCQkJICAgIElPREVTQ19BRElTQ19ORUVERUQgfHwKKwkJCSAgICBleGlzdF9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9PQorCQkJICAgIElPREVTQ19MT0dJTl9ORUVERUQpIHsKKwkJCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBMb2dpbiBJT0NCIC0tICIKKwkJCQkgICAgImV4aXN0aW5nIGZjcG9ydCBbJXgvJTAyeCUwMnglMDJ4XSAiCisJCQkJICAgICJ3YWl0aW5nIGZvciBJTyBkZXNjcmlwdG9yLCByZXVzZSBSU0NOICIKKwkJCQkgICAgImZjcG9ydC5cbiIsIGhhLT5ob3N0X25vLAorCQkJCSAgICBleGlzdF9mY3BvcnQtPmxvb3BfaWQsCisJCQkJICAgIGV4aXN0X2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkJCQkgICAgZXhpc3RfZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkJCQkgICAgZXhpc3RfZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKworCQkJCXJldXNlKys7CisJCQkJcmVtb3RlX2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID0KKwkJCQkgICAgZXhpc3RfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQ7CisJCQkJZXhpc3RfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgPQorCQkJCSAgICBJT0RFU0NfSU5WQUxJRF9JTkRFWDsKKwkJCQlyZW1vdGVfZmNwb3J0LT5sb29wX2lkID0gZXhpc3RfZmNwb3J0LT5sb29wX2lkOworCQkJCXJlbW90ZV9mY3BvcnQtPmRfaWQuYjI0ID0KKwkJCQkgICAgZXhpc3RfZmNwb3J0LT5kX2lkLmIyNDsKKwkJCX0KKworCQkJLyogTG9nb3V0IHRoZSBvbGQgbG9vcGlkLiAqLworCQkJaWYgKCFyZXVzZSAmJgorCQkJICAgIGV4aXN0X2ZjcG9ydC0+bG9vcF9pZCAhPSByZW1vdGVfZmNwb3J0LT5sb29wX2lkICYmCisJCQkgICAgZXhpc3RfZmNwb3J0LT5sb29wX2lkICE9IEZDX05PX0xPT1BfSUQpIHsKKwkJCQlsb2dpbl9pb2Rlc2MgPSBxbGEyeDAwX2FsbG9jX2lvZGVzYyhoYSk7CisJCQkJaWYgKGxvZ2luX2lvZGVzYykgeworCQkJCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBMb2dpbiBJT0NCICIKKwkJCQkJICAgICItLSBpc3N1aW5nIGxvZ291dCB0byBmcmVlIG9sZCAiCisJCQkJCSAgICAibG9vcCBpZCBbJXgvJTAyeCUwMnglMDJ4XS5cbiIsCisJCQkJCSAgICBoYS0+aG9zdF9ubywgZXhpc3RfZmNwb3J0LT5sb29wX2lkLAorCQkJCQkgICAgZXhpc3RfZmNwb3J0LT5kX2lkLmIuZG9tYWluLAorCQkJCQkgICAgZXhpc3RfZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkJCQkJICAgIGV4aXN0X2ZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisKKwkJCQkJbG9naW5faW9kZXNjLT5jYl9pZHggPQorCQkJCQkgICAgTE9HT1VUX1BPUlRfSU9DQl9DQjsKKwkJCQkJbG9naW5faW9kZXNjLT5kX2lkLmIyNCA9CisJCQkJCSAgICBleGlzdF9mY3BvcnQtPmRfaWQuYjI0OworCQkJCQlsb2dpbl9pb2Rlc2MtPnJlbW90ZV9mY3BvcnQgPQorCQkJCQkgICAgZXhpc3RfZmNwb3J0OworCQkJCQlleGlzdF9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9CisJCQkJCSAgICBsb2dpbl9pb2Rlc2MtPmlkeDsKKwkJCQkJcWxhMngwMF9zZW5kX2xvZ291dF9pb2NiKGhhLAorCQkJCQkgICAgbG9naW5faW9kZXNjLCAxKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBSYW4gb3V0IG9mIElPIGRlc2NyaXB0aW9ycy4gKi8KKwkJCQkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogTG9naW4gSU9DQiAiCisJCQkJCSAgICAiLS0gdW5hYmxlIHRvIGxvZ291dCB0byBmcmVlIG9sZCAiCisJCQkJCSAgICAibG9vcCBpZCBbJXgvJTAyeCUwMnglMDJ4XS5cbiIsCisJCQkJCSAgICBoYS0+aG9zdF9ubywgZXhpc3RfZmNwb3J0LT5sb29wX2lkLAorCQkJCQkgICAgZXhpc3RfZmNwb3J0LT5kX2lkLmIuZG9tYWluLAorCQkJCQkgICAgZXhpc3RfZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkJCQkJICAgIGV4aXN0X2ZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisKKwkJCQkJZXhpc3RfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgPQorCQkJCQkgICAgSU9ERVNDX0lOVkFMSURfSU5ERVg7CisJCQkJfQorCisJCQl9CisKKwkJCS8qIFVwZGF0ZSBleGlzdGluZyBmY3BvcnQgd2l0aCByZW1vdGUgZmNwb3J0IGluZm8uICovCisJCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBMb2dpbiBJT0NCIC0tIG1hcmtpbmcgIgorCQkJICAgICJleGlzdGluZyBmY3BvcnQgWyV4LyUwMnglMDJ4JTAyeF0gb25saW5lLlxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgcmVtb3RlX2xvb3BpZCwgcmVtb3RlX2RpZC5iLmRvbWFpbiwKKwkJCSAgICByZW1vdGVfZGlkLmIuYXJlYSwgcmVtb3RlX2RpZC5iLmFsX3BhKSk7CisKKwkJCW1lbWNweShleGlzdF9mY3BvcnQtPm5vZGVfbmFtZSwKKwkJCSAgICByZW1vdGVfZmNwb3J0LT5ub2RlX25hbWUsIFdXTl9TSVpFKTsKKwkJCWV4aXN0X2ZjcG9ydC0+bG9vcF9pZCA9IHJlbW90ZV9sb29waWQ7CisJCQlleGlzdF9mY3BvcnQtPmRfaWQuYjI0ID0gcmVtb3RlX2RpZC5iMjQ7CisJCQlxbGEyeDAwX3VwZGF0ZV9sb2dpbl9mY3BvcnQoaGEsIG1ieHN0YXQsIGV4aXN0X2ZjcG9ydCk7CisKKwkJCS8qIEZpbmFsbHksIGZyZWUgdGhlIHJlbW90ZSAoUlNDTikgZmNwb3J0LiAqLworCQkJaWYgKCFyZXVzZSkgeworCQkJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IExvZ2luIElPQ0IgLS0gIgorCQkJCSAgICAiRnJlZWluZyBSU0NOIGZjcG9ydCAlcCAiCisJCQkJICAgICJbJXgvJTAyeCUwMnglMDJ4XS5cbiIsIGhhLT5ob3N0X25vLAorCQkJCSAgICByZW1vdGVfZmNwb3J0LCByZW1vdGVfZmNwb3J0LT5sb29wX2lkLAorCQkJCSAgICByZW1vdGVfZmNwb3J0LT5kX2lkLmIuZG9tYWluLAorCQkJCSAgICByZW1vdGVfZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkJCQkgICAgcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisKKwkJCQlsaXN0X2RlbCgmcmVtb3RlX2ZjcG9ydC0+bGlzdCk7CisJCQkJa2ZyZWUocmVtb3RlX2ZjcG9ydCk7CisJCQl9CisKKwkJCXJldHVybiAoUUxBX1NVQ0NFU1MpOworCQl9CisKKwkJLyoKKwkJICogQSBuZXcgZGV2aWNlIGhhcyBiZWVuIGFkZGVkLCBtb3ZlIHRoZSBSU0NOIGZjcG9ydCB0byBvdXIKKwkJICogZmNwb3J0cyBsaXN0LgorCQkgKi8KKwkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogTG9naW4gSU9DQiAtLSBhZGRpbmcgUlNDTiBmY3BvcnQgIgorCQkgICAgIlsleC8lMDJ4JTAyeCUwMnhdIHRvIGZjcG9ydHMgbGlzdC5cbiIsIGhhLT5ob3N0X25vLAorCQkgICAgcmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCwgcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkJICAgIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5hcmVhLCByZW1vdGVfZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKworCQlsaXN0X2RlbCgmcmVtb3RlX2ZjcG9ydC0+bGlzdCk7CisJCXJlbW90ZV9mY3BvcnQtPmZsYWdzID0gKEZDRl9STENfU1VQUE9SVCB8IEZDRl9SRVNDQU5fTkVFREVEKTsKKwkJcWxhMngwMF91cGRhdGVfbG9naW5fZmNwb3J0KGhhLCBtYnhzdGF0LCByZW1vdGVfZmNwb3J0KTsKKwkJbGlzdF9hZGRfdGFpbCgmcmVtb3RlX2ZjcG9ydC0+bGlzdCwgJmhhLT5mY3BvcnRzKTsKKwkJc2V0X2JpdChGQ1BPUlRfUkVTQ0FOX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCX0gZWxzZSB7CisJCS8qIEhhbmRsZSBsb2dpbiBmYWlsdXJlLiAqLworCQlpZiAocmVtb3RlX2ZjcG9ydC0+bG9naW5fcmV0cnkgIT0gMCkgeworCQkJaWYgKG1iWzBdID09IE1CU19MT09QX0lEX1VTRUQpIHsKKwkJCQlpbnVzZV9kaWQuYi5kb21haW4gPSBMU0IobWJbMV0pOworCQkJCWludXNlX2RpZC5iLmFyZWEgPSBNU0IobWJbMl0pOworCQkJCWludXNlX2RpZC5iLmFsX3BhID0gTFNCKG1iWzJdKTsKKworCQkJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IExvZ2luIElPQ0IgLS0gbG9vcCAiCisJCQkJICAgICJpZCBbJXhdIHVzZWQgYnkgcG9ydCBpZCBbJTAyeCUwMnglMDJ4XS5cbiIsCisJCQkJICAgIGhhLT5ob3N0X25vLCByZW1vdGVfZmNwb3J0LT5sb29wX2lkLAorCQkJCSAgICBpbnVzZV9kaWQuYi5kb21haW4sIGludXNlX2RpZC5iLmFyZWEsCisJCQkJICAgIGludXNlX2RpZC5iLmFsX3BhKSk7CisKKwkJCQlpZiAocmVtb3RlX2ZjcG9ydC0+ZF9pZC5iMjQgPT0KKwkJCQkgICAgSU5WQUxJRF9QT1JUX0lEKSB7CisJCQkJCS8qCisJCQkJCSAqIEludmFsaWQgcG9ydCBpZCBtZWFucyB3ZSBhcmUgdHJ5aW5nCisJCQkJCSAqIHRvIGxvZ2luIHRvIGEgcmVtb3RlIHBvcnQgd2l0aCBqdXN0CisJCQkJCSAqIGEgbG9vcCBpZCB3aXRob3V0IGtub3dpbmcgYWJvdXQgdGhlCisJCQkJCSAqIHBvcnQgaWQuICBDb3B5IHRoZSBwb3J0IGlkIGFuZCB0cnkKKwkJCQkJICogYWdhaW4uCisJCQkJCSAqLworCQkJCQlyZW1vdGVfZmNwb3J0LT5kX2lkLmIyNCA9IGludXNlX2RpZC5iMjQ7CisJCQkJCWlvZGVzYy0+ZF9pZC5iMjQgPSBpbnVzZV9kaWQuYjI0OworCQkJCX0gZWxzZSB7CisJCQkJCXJlbW90ZV9mY3BvcnQtPmxvb3BfaWQrKzsKKwkJCQkJcnZhbCA9IHFsYTJ4MDBfZmluZF9uZXdfbG9vcF9pZChoYSwKKwkJCQkJICAgIHJlbW90ZV9mY3BvcnQpOworCQkJCQlpZiAocnZhbCA9PSBRTEFfRlVOQ1RJT05fRkFJTEVEKSB7CisJCQkJCQkvKiBObyBtb3JlIGxvb3AgaWRzLiAqLworCQkJCQkJcmV0dXJuIChRTEFfU1VDQ0VTUyk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKG1iWzBdID09IE1CU19QT1JUX0lEX1VTRUQpIHsKKwkJCQkvKgorCQkJCSAqIERldmljZSBoYXMgYW5vdGhlciBsb29wIElELiAgVGhlIGZpcm13YXJlCisJCQkJICogZ3JvdXAgcmVjb21tZW5kcyB0aGUgZHJpdmVyIHBlcmZvcm0gYW4KKwkJCQkgKiBpbXBsaWNpdCBsb2dpbiB3aXRoIHRoZSBzcGVjaWZpZWQgSUQuCisJCQkJICovCisJCQkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogTG9naW4gSU9DQiAtLSBwb3J0ICIKKwkJCQkgICAgImlkIFslMDJ4JTAyeCUwMnhdIGFscmVhZHkgYXNzaWduZWQgdG8gIgorCQkJCSAgICAibG9vcCBpZCBbJXhdLlxuIiwgaGEtPmhvc3Rfbm8sCisJCQkJICAgIGlvZGVzYy0+ZF9pZC5iLmRvbWFpbiwgaW9kZXNjLT5kX2lkLmIuYXJlYSwKKwkJCQkgICAgaW9kZXNjLT5kX2lkLmIuYWxfcGEsIG1iWzFdKSk7CisKKwkJCQlyZW1vdGVfZmNwb3J0LT5sb29wX2lkID0gbWJbMV07CisKKwkJCX0gZWxzZSB7CisJCQkJLyogVW5hYmxlIHRvIHBlcmZvcm0gbG9naW4sIHRyeSBhZ2Fpbi4gKi8KKwkJCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBMb2dpbiBJT0NCIC0tICIKKwkJCQkgICAgImZhaWxlZCBsb2dpbiBbJXgvJTAyeCUwMnglMDJ4XSwgc3RhdHVzPSV4ICIKKwkJCQkgICAgIm1iMD0leCBtYjE9JXggbWIyPSV4IG1iNj0leCBtYjc9JXguXG4iLAorCQkJCSAgICBoYS0+aG9zdF9ubywgcmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCwKKwkJCQkgICAgaW9kZXNjLT5kX2lkLmIuZG9tYWluLCBpb2Rlc2MtPmRfaWQuYi5hcmVhLAorCQkJCSAgICBpb2Rlc2MtPmRfaWQuYi5hbF9wYSwgc3RhdHVzLCBtYlswXSwgbWJbMV0sCisJCQkJICAgIG1iWzJdLCBtYls2XSwgbWJbN10pKTsKKwkJCX0KKworCQkJLyogUmVpc3N1ZSBMb2dpbiB3aXRoIHRoZSBzYW1lIElPIGRlc2NyaXB0b3IuICovCisJCQlpb2Rlc2MtPnNpZ25hdHVyZSA9CisJCQkgICAgcWxhMngwMF9pb2Rlc2NfdG9faGFuZGxlKGlvZGVzYyk7CisJCQlpb2Rlc2MtPmNiX2lkeCA9IExPR0lOX1BPUlRfSU9DQl9DQjsKKwkJCWlvZGVzYy0+ZF9pZC5iMjQgPSByZW1vdGVfZmNwb3J0LT5kX2lkLmIyNDsKKwkJCXJlbW90ZV9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9IGlvZGVzYy0+aWR4OworCQkJcmVtb3RlX2ZjcG9ydC0+bG9naW5fcmV0cnktLTsKKworCQkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogTG9naW4gSU9DQiAtLSByZXRyeWluZyAiCisJCQkgICAgImxvZ2luIHRvIFsleC8lMDJ4JTAyeCUwMnhdICglZCkuXG4iLCBoYS0+aG9zdF9ubywKKwkJCSAgICByZW1vdGVfZmNwb3J0LT5sb29wX2lkLAorCQkJICAgIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5kb21haW4sCisJCQkgICAgcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJCQkgICAgcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmFsX3BhLAorCQkJICAgIHJlbW90ZV9mY3BvcnQtPmxvZ2luX3JldHJ5KSk7CisKKwkJCXFsYTJ4MDBfc2VuZF9sb2dpbl9pb2NiKGhhLCBpb2Rlc2MsCisJCQkgICAgJnJlbW90ZV9mY3BvcnQtPmRfaWQsIDEpOworCisJCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOworCQl9IGVsc2UgeworCQkJLyogTm8gbW9yZSBsb2dpbnMsIG1hcmsgZGV2aWNlIGRlYWQuICovCisJCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBMb2dpbiBJT0NCIC0tIGZhaWxlZCAiCisJCQkgICAgImxvZ2luIFsleC8lMDJ4JTAyeCUwMnhdIGFmdGVyIHJldHJpZXMsIHN0YXR1cz0leCAiCisJCQkgICAgIm1iMD0leCBtYjE9JXggbWIyPSV4IG1iNj0leCBtYjc9JXguXG4iLAorCQkJICAgIGhhLT5ob3N0X25vLCByZW1vdGVfZmNwb3J0LT5sb29wX2lkLAorCQkJICAgIGlvZGVzYy0+ZF9pZC5iLmRvbWFpbiwgaW9kZXNjLT5kX2lkLmIuYXJlYSwKKwkJCSAgICBpb2Rlc2MtPmRfaWQuYi5hbF9wYSwgc3RhdHVzLCBtYlswXSwgbWJbMV0sCisJCQkgICAgbWJbMl0sIG1iWzZdLCBtYls3XSkpOworCisJCQlhdG9taWNfc2V0KCZyZW1vdGVfZmNwb3J0LT5zdGF0ZSwgRkNTX0RFVklDRV9ERUFEKTsKKwkJCWlmIChyZW1vdGVfZmNwb3J0LT5wb3J0X3R5cGUgPT0gRkNUX1JTQ04pIHsKKwkJCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBMb2dpbiBJT0NCIC0tICIKKwkJCQkgICAgIkZyZWVpbmcgZGVhZCBSU0NOIGZjcG9ydCAlcCAiCisJCQkJICAgICJbJXgvJTAyeCUwMnglMDJ4XS5cbiIsIGhhLT5ob3N0X25vLAorCQkJCSAgICByZW1vdGVfZmNwb3J0LCByZW1vdGVfZmNwb3J0LT5sb29wX2lkLAorCQkJCSAgICByZW1vdGVfZmNwb3J0LT5kX2lkLmIuZG9tYWluLAorCQkJCSAgICByZW1vdGVfZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkJCQkgICAgcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisKKwkJCQlsaXN0X2RlbCgmcmVtb3RlX2ZjcG9ydC0+bGlzdCk7CisJCQkJa2ZyZWUocmVtb3RlX2ZjcG9ydCk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKK30KKworCisvKiogCisgKiBJTyBkZXNjcmlwdG9yIHByb2Nlc3Npbmcgcm91dGluZXMuCisgKiovCisKKy8qKgorICogcWxhMngwMF9hbGxvY19yc2NuX2ZjcG9ydCgpIC0gQWxsb2NhdGUgYW4gUlNDTiB0eXBlIGZjcG9ydC4KKyAqIEBoYTogSEEgY29udGV4dAorICogQGZsYWdzOiBhbGxvY2F0aW9uIGZsYWdzCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBSU0NOIGZjcG9ydCwgb3IgTlVMTCwgaWYgbm9uZSBhdmFpbGFibGUuCisgKi8KK2ZjX3BvcnRfdCAqCitxbGEyeDAwX2FsbG9jX3JzY25fZmNwb3J0KHNjc2lfcWxhX2hvc3RfdCAqaGEsIGludCBmbGFncykKK3sKKwlmY19wb3J0X3QgKmZjcG9ydDsKKworCWZjcG9ydCA9IHFsYTJ4MDBfYWxsb2NfZmNwb3J0KGhhLCBmbGFncyk7CisJaWYgKGZjcG9ydCA9PSBOVUxMKQorCQlyZXR1cm4gKGZjcG9ydCk7CisKKwkvKiBTZXR1cCBSU0NOIGZjcG9ydCBzdHJ1Y3R1cmUuICovCisJZmNwb3J0LT5wb3J0X3R5cGUgPSBGQ1RfUlNDTjsKKworCXJldHVybiAoZmNwb3J0KTsKK30KKworLyoqCisgKiBxbGEyeDAwX2hhbmRsZV9wb3J0X3JzY24oKSAtIEhhbmRsZSBwb3J0IFJTQ04uCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEByc2NuX2VudHJ5OiBSU0NOIGVudHJ5CisgKiBAZmNwb3J0OiBmY3BvcnQgZW50cnkgdG8gdXBkYXRlZAorICoKKyAqIFJldHVybnMgUUxBX1NVQ0NFU1MgaWYgdGhlIHBvcnQgUlNDTiB3YXMgaGFuZGxlZC4KKyAqLworaW50CitxbGEyeDAwX2hhbmRsZV9wb3J0X3JzY24oc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDMyX3QgcnNjbl9lbnRyeSwKKyAgICBmY19wb3J0X3QgKmtub3duX2ZjcG9ydCwgaW50IGhhX2xvY2tlZCkKK3sKKwlpbnQJcnZhbDsKKwlwb3J0X2lkX3QgcnNjbl9waWQ7CisJZmNfcG9ydF90ICpmY3BvcnQsICpyZW1vdGVfZmNwb3J0LCAqcnNjbl9mY3BvcnQ7CisJc3RydWN0IGlvX2Rlc2NyaXB0b3IgKmlvZGVzYzsKKworCXJlbW90ZV9mY3BvcnQgPSBOVUxMOworCXJzY25fZmNwb3J0ID0gTlVMTDsKKworCS8qIFByZXBhcmUgcG9ydCBpZCBiYXNlZCBvbiBpbmNvbWluZyBlbnRyaWVzLiAqLworCWlmIChrbm93bl9mY3BvcnQpIHsKKwkJcnNjbl9waWQuYjI0ID0ga25vd25fZmNwb3J0LT5kX2lkLmIyNDsKKwkJcmVtb3RlX2ZjcG9ydCA9IGtub3duX2ZjcG9ydDsKKworCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBIYW5kbGUgUlNDTiAtLSBwcm9jZXNzIFJTQ04gZm9yICIKKwkJICAgICJmY3BvcnQgWyUwMnglMDJ4JTAyeF0uXG4iLCBoYS0+aG9zdF9ubywKKwkJICAgIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5kb21haW4sIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkgICAgcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisJfSBlbHNlIHsKKwkJcnNjbl9waWQuYi5kb21haW4gPSBMU0IoTVNXKHJzY25fZW50cnkpKTsKKwkJcnNjbl9waWQuYi5hcmVhID0gTVNCKExTVyhyc2NuX2VudHJ5KSk7CisJCXJzY25fcGlkLmIuYWxfcGEgPSBMU0IoTFNXKHJzY25fZW50cnkpKTsKKworCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBIYW5kbGUgUlNDTiAtLSBwcm9jZXNzIFJTQ04gZm9yICIKKwkJICAgICJwb3J0IGlkIFslMDJ4JTAyeCUwMnhdLlxuIiwgaGEtPmhvc3Rfbm8sCisJCSAgICByc2NuX3BpZC5iLmRvbWFpbiwgcnNjbl9waWQuYi5hcmVhLCByc2NuX3BpZC5iLmFsX3BhKSk7CisKKwkJLyoKKwkJICogU2VhcmNoIGZjcG9ydCBsaXN0cyBmb3IgYSBrbm93biBlbnRyeSBhdCB0aGUgc3BlY2lmaWVkIHBvcnQKKwkJICogSUQuCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJmhhLT5mY3BvcnRzLCBsaXN0KSB7CisJCSAgICBpZiAocnNjbl9waWQuYjI0ID09IGZjcG9ydC0+ZF9pZC5iMjQpIHsKKwkJCSAgICByZW1vdGVfZmNwb3J0ID0gZmNwb3J0OworCQkJICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmaGEtPnJzY25fZmNwb3J0cywgbGlzdCkgeworCQkgICAgaWYgKHJzY25fcGlkLmIyNCA9PSBmY3BvcnQtPmRfaWQuYjI0KSB7CisJCQkgICAgcnNjbl9mY3BvcnQgPSBmY3BvcnQ7CisJCQkgICAgYnJlYWs7CisJCSAgICB9CisJCX0KKwkJaWYgKHJlbW90ZV9mY3BvcnQgPT0gTlVMTCkKKwkJICAgIHJlbW90ZV9mY3BvcnQgPSByc2NuX2ZjcG9ydDsKKwl9CisKKwkvKiAKKwkgKiBJZiB0aGUgcG9ydCBpcyBhbHJlYWR5IGluIG91ciBmY3BvcnQgbGlzdCBhbmQgb25saW5lLCBzZW5kIGFuIEFESVNDCisJICogdG8gc2VlIGlmIGl0J3Mgc3RpbGwgYWxpdmUuICBJc3N1ZSBsb2dpbiBpZiBhIG5ldyBmY3BvcnQgb3IgdGhlIGtub3duCisJICogZmNwb3J0IGlzIGN1cnJlbnRseSBvZmZsaW5lLgorCSAqLworCWlmIChyZW1vdGVfZmNwb3J0KSB7CisJCS8qCisJCSAqIE5vIG5lZWQgdG8gc2VuZCByZXF1ZXN0IGlmIHRoZSByZW1vdGUgZmNwb3J0IGlzIGN1cnJlbnRseQorCQkgKiB3YWl0aW5nIGZvciBhbiBhdmFpbGFibGUgaW8gZGVzY3JpcHRvci4KKwkJICovCisJCWlmIChrbm93bl9mY3BvcnQgPT0gTlVMTCAmJgorCQkgICAgKHJlbW90ZV9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9PSBJT0RFU0NfQURJU0NfTkVFREVEIHx8CisJCSAgICByZW1vdGVfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgPT0gSU9ERVNDX0xPR0lOX05FRURFRCkpIHsKKwkJCS8qCisJCQkgKiBJZiBwcmV2aW91cyB3YWl0aW5nIGlvIGRlc2NyaXB0b3IgaXMgYW4gQURJU0MsIHRoZW4KKwkJCSAqIHRoZSBuZXcgUlNDTiBtYXkgY29tZSBmcm9tIGEgbmV3IHJlbW90ZSBmY3BvcnQgYmVpbmcKKwkJCSAqIHBsdWdnZWQgaW50byB0aGUgc2FtZSBsb2NhdGlvbi4KKwkJCSAqLworCQkJaWYgKHJlbW90ZV9mY3BvcnQtPnBvcnRfdHlwZSA9PSBGQ1RfUlNDTikgeworCQkJICAgIHJlbW90ZV9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9CisJCQkJSU9ERVNDX0xPR0lOX05FRURFRDsKKwkJCX0gZWxzZSBpZiAocmVtb3RlX2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID09CisJCQkgICAgSU9ERVNDX0FESVNDX05FRURFRCkgeworCQkJCWZjX3BvcnRfdCAqbmV3X2ZjcG9ydDsKKworCQkJCXJlbW90ZV9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9CisJCQkJICAgIElPREVTQ19JTlZBTElEX0lOREVYOworCisJCQkJLyogQ3JlYXRlIG5ldyBmY3BvcnQgZm9yIGxhdGVyIGxvZ2luLiAqLworCQkJCW5ld19mY3BvcnQgPSBxbGEyeDAwX2FsbG9jX3JzY25fZmNwb3J0KGhhLAorCQkJCSAgICBoYV9sb2NrZWQgPyBHRlBfQVRPTUlDOiBHRlBfS0VSTkVMKTsKKwkJCQlpZiAobmV3X2ZjcG9ydCkgeworCQkJCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBIYW5kbGUgUlNDTiAiCisJCQkJCSAgICAiLS0gY3JlYXRpbmcgUlNDTiBmY3BvcnQgJXAgZm9yICIKKwkJCQkJICAgICJmdXR1cmUgbG9naW4uXG4iLCBoYS0+aG9zdF9ubywKKwkJCQkJICAgIG5ld19mY3BvcnQpKTsKKworCQkJCQluZXdfZmNwb3J0LT5kX2lkLmIyNCA9CisJCQkJCSAgICByZW1vdGVfZmNwb3J0LT5kX2lkLmIyNDsKKwkJCQkJbmV3X2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID0KKwkJCQkJICAgIElPREVTQ19MT0dJTl9ORUVERUQ7CisKKwkJCQkJbGlzdF9hZGRfdGFpbCgmbmV3X2ZjcG9ydC0+bGlzdCwKKwkJCQkJICAgICZoYS0+cnNjbl9mY3BvcnRzKTsKKwkJCQkJc2V0X2JpdChJT0RFU0NfUFJPQ0VTU19ORUVERUQsCisJCQkJCSAgICAmaGEtPmRwY19mbGFncyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogSGFuZGxlIFJTQ04gIgorCQkJCQkgICAgIi0tIHVuYWJsZSB0byBhbGxvY2F0ZSBSU0NOIGZjcG9ydCAiCisJCQkJCSAgICAiZm9yIGZ1dHVyZSBsb2dpbi5cbiIsCisJCQkJCSAgICBoYS0+aG9zdF9ubykpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiAoUUxBX1NVQ0NFU1MpOworCQl9CisJCQorCQkvKiBTZW5kIEFESVNDIGlmIHRoZSBmY3BvcnQgaXMgb25saW5lICovCisJCWlmIChhdG9taWNfcmVhZCgmcmVtb3RlX2ZjcG9ydC0+c3RhdGUpID09IEZDU19PTkxJTkUgfHwKKwkJICAgIHJlbW90ZV9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9PSBJT0RFU0NfQURJU0NfTkVFREVEKSB7CisKKwkJCWF0b21pY19zZXQoJnJlbW90ZV9mY3BvcnQtPnN0YXRlLCBGQ1NfREVWSUNFX0xPU1QpOworCisJCQlpb2Rlc2MgPSBxbGEyeDAwX2FsbG9jX2lvZGVzYyhoYSk7CisJCQlpZiAoaW9kZXNjID09IE5VTEwpIHsKKwkJCQkvKiBNYXJrIGZjcG9ydCBmb3IgbGF0ZXIgYWRpc2MgcHJvY2Vzc2luZyAqLworCQkJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IEhhbmRsZSBSU0NOIC0tIG5vdCAiCisJCQkJICAgICJlbm91Z2ggSU8gZGVzY3JpcHRvcnMgZm9yIEFkaXNjLCBmbGFnICIKKwkJCQkgICAgImZvciBsYXRlciBwcm9jZXNzaW5nLlxuIiwgaGEtPmhvc3Rfbm8pKTsKKworCQkJCXJlbW90ZV9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9CisJCQkJICAgIElPREVTQ19BRElTQ19ORUVERUQ7CisJCQkJc2V0X2JpdChJT0RFU0NfUFJPQ0VTU19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKworCQkJCXJldHVybiAoUUxBX1NVQ0NFU1MpOworCQkJfQorCisJCQlpb2Rlc2MtPmNiX2lkeCA9IEFESVNDX1BPUlRfSU9DQl9DQjsKKwkJCWlvZGVzYy0+ZF9pZC5iMjQgPSByc2NuX3BpZC5iMjQ7CisJCQlpb2Rlc2MtPnJlbW90ZV9mY3BvcnQgPSByZW1vdGVfZmNwb3J0OworCQkJcmVtb3RlX2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID0gaW9kZXNjLT5pZHg7CisJCQlxbGEyeDAwX3NlbmRfYWRpc2NfaW9jYihoYSwgaW9kZXNjLCBoYV9sb2NrZWQpOworCisJCQlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKKwkJfSBlbHNlIGlmIChyZW1vdGVfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgPAorCQkgICAgTUFYX0lPX0RFU0NSSVBUT1JTICYmCisJCSAgICBoYS0+aW9fZGVzY3JpcHRvcnNbcmVtb3RlX2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50XS5jYl9pZHggPT0KKwkJICAgIEFESVNDX1BPUlRfSU9DQl9DQikgeworCQkJLyoKKwkJCSAqIFJlY2VpdmluZyBhbm90aGVyIFJTQ04gd2hpbGUgYW4gQURJU0MgaXMgcGVuZGluZywKKwkJCSAqIGFib3J0IHRoZSBJT0NCLiAgVXNlIHRoZSBzYW1lIGRlc2NyaXB0b3IgZm9yIHRoZQorCQkJICogYWJvcnQuCisJCQkgKi8KKwkJCXVpbnQzMl90IGhhbmRsZV90b19hYm9ydDsKKwkJCQorCQkJaW9kZXNjID0gJmhhLT5pb19kZXNjcmlwdG9yc1sKKwkJCQlyZW1vdGVfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnRdOworCQkJcWxhMngwMF9yZW1vdmVfaW9kZXNjX3RpbWVyKGlvZGVzYyk7CisJCQloYW5kbGVfdG9fYWJvcnQgPSBpb2Rlc2MtPnNpZ25hdHVyZTsKKwkJCWlvZGVzYy0+c2lnbmF0dXJlID0gcWxhMngwMF9pb2Rlc2NfdG9faGFuZGxlKGlvZGVzYyk7CisJCQlpb2Rlc2MtPmNiX2lkeCA9IEFCT1JUX0lPQ0JfQ0I7CisJCQlpb2Rlc2MtPmRfaWQuYjI0ID0gcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iMjQ7CisJCQlpb2Rlc2MtPnJlbW90ZV9mY3BvcnQgPSByZW1vdGVfZmNwb3J0OworCQkJcmVtb3RlX2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID0gaW9kZXNjLT5pZHg7CisKKwkJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IEhhbmRsZSBSU0NOIC0tIGlzc3VpbmcgIgorCQkJICAgICJhYm9ydCB0byBvdXRzdGFuZGluZyBBZGlzYyBbJXgvJTAyeCUwMnglMDJ4XS5cbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8sIHJlbW90ZV9mY3BvcnQtPmxvb3BfaWQsCisJCQkgICAgaW9kZXNjLT5kX2lkLmIuZG9tYWluLCBpb2Rlc2MtPmRfaWQuYi5hcmVhLAorCQkJICAgIGlvZGVzYy0+ZF9pZC5iLmFsX3BhKSk7CisKKwkJCXFsYTJ4MDBfc2VuZF9hYm9ydF9pb2NiKGhhLCBpb2Rlc2MsIGhhbmRsZV90b19hYm9ydCwKKwkJCSAgICBoYV9sb2NrZWQpOworCQl9CisJfQorCisJLyogV2UgbmVlZCB0byBsb2dpbiB0byB0aGUgcmVtb3RlIHBvcnQsIGZpbmQgaXQuICovCisJaWYgKGtub3duX2ZjcG9ydCkgeworCQlyZW1vdGVfZmNwb3J0ID0ga25vd25fZmNwb3J0OworCX0gZWxzZSBpZiAocnNjbl9mY3BvcnQgJiYgcnNjbl9mY3BvcnQtPmRfaWQuYjI0ICE9IElOVkFMSURfUE9SVF9JRCAmJgorCSAgICByc2NuX2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50IDwgTUFYX0lPX0RFU0NSSVBUT1JTICYmCisJICAgIGhhLT5pb19kZXNjcmlwdG9yc1tyc2NuX2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50XS5jYl9pZHggPT0KKwkgICAgTE9HSU5fUE9SVF9JT0NCX0NCKSB7CisJCS8qCisJCSAqIElnbm9yZSBkdXBsaWNhdGUgUlNDTiBvbiBmY3BvcnQgd2hpY2ggaGFzIGFscmVhZHkKKwkJICogaW5pdGlhdGVkIGEgbG9naW4gSU9DQi4KKwkJICovCisJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IEhhbmRsZSBSU0NOIC0tIGlnbm9yaW5nLCBsb2dpbiAiCisJCSAgICAiYWxyZWFkeSBzZW50IHRvIFslMDJ4JTAyeCUwMnhdLlxuIiwgaGEtPmhvc3Rfbm8sCisJCSAgICByc2NuX2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgcnNjbl9mY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkgICAgcnNjbl9mY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCisJCXJldHVybiAoUUxBX1NVQ0NFU1MpOworCX0gZWxzZSBpZiAocnNjbl9mY3BvcnQgJiYgcnNjbl9mY3BvcnQtPmRfaWQuYjI0ICE9IElOVkFMSURfUE9SVF9JRCAmJgorCSAgICByc2NuX2ZjcG9ydCAhPSByZW1vdGVfZmNwb3J0KSB7CisJCS8qIFJldXNlIHNhbWUgcnNjbiBmY3BvcnQuICovCisJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IEhhbmRsZSBSU0NOIC0tIHJldXNpbmcgUlNDTiBmY3BvcnQgIgorCQkgICAgIlslMDJ4JTAyeCUwMnhdLlxuIiwgaGEtPmhvc3Rfbm8sCisJCSAgICByc2NuX2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgcnNjbl9mY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkgICAgcnNjbl9mY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCisJCXJlbW90ZV9mY3BvcnQgPSByc2NuX2ZjcG9ydDsKKwl9IGVsc2UgeworCQkvKiBDcmVhdGUgbmV3IGZjcG9ydCBmb3IgbGF0ZXIgbG9naW4uICovCisJCXJlbW90ZV9mY3BvcnQgPSBxbGEyeDAwX2FsbG9jX3JzY25fZmNwb3J0KGhhLAorCQkgICAgaGFfbG9ja2VkID8gR0ZQX0FUT01JQzogR0ZQX0tFUk5FTCk7CisJCWxpc3RfYWRkX3RhaWwoJnJlbW90ZV9mY3BvcnQtPmxpc3QsICZoYS0+cnNjbl9mY3BvcnRzKTsKKwl9CisJaWYgKHJlbW90ZV9mY3BvcnQgPT0gTlVMTCkKKwkJcmV0dXJuIChRTEFfU1VDQ0VTUyk7CisKKwkvKiBQcmVwYXJlIGZjcG9ydCBmb3IgbG9naW4uICovCisJYXRvbWljX3NldCgmcmVtb3RlX2ZjcG9ydC0+c3RhdGUsIEZDU19ERVZJQ0VfTE9TVCk7CisJcmVtb3RlX2ZjcG9ydC0+bG9naW5fcmV0cnkgPSAzOyAvKiBoYS0+bG9naW5fcmV0cnlfY291bnQ7ICovCisJcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iMjQgPSByc2NuX3BpZC5iMjQ7CisKKwlpb2Rlc2MgPSBxbGEyeDAwX2FsbG9jX2lvZGVzYyhoYSk7CisJaWYgKGlvZGVzYyA9PSBOVUxMKSB7CisJCS8qIE1hcmsgZmNwb3J0IGZvciBsYXRlciBhZGlzYyBwcm9jZXNzaW5nLiAqLworCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBIYW5kbGUgUlNDTiAtLSBub3QgZW5vdWdoIElPICIKKwkJICAgICJkZXNjcmlwdG9ycyBmb3IgTG9naW4sIGZsYWcgZm9yIGxhdGVyIHByb2Nlc3NpbmcuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKworCQlyZW1vdGVfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgPSBJT0RFU0NfTE9HSU5fTkVFREVEOworCQlzZXRfYml0KElPREVTQ19QUk9DRVNTX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCisJCXJldHVybiAoUUxBX1NVQ0NFU1MpOworCX0KKworCWlmIChrbm93bl9mY3BvcnQgPT0gTlVMTCB8fCByc2NuX3BpZC5iMjQgIT0gSU5WQUxJRF9QT1JUX0lEKSB7CisJCXJlbW90ZV9mY3BvcnQtPmxvb3BfaWQgPSBoYS0+bWluX2V4dGVybmFsX2xvb3BpZDsKKworCQlydmFsID0gcWxhMngwMF9maW5kX25ld19sb29wX2lkKGhhLCByZW1vdGVfZmNwb3J0KTsKKwkJaWYgKHJ2YWwgPT0gUUxBX0ZVTkNUSU9OX0ZBSUxFRCkgeworCQkJLyogTm8gbW9yZSBsb29wIGlkcywgZmFpbGVkLiAqLworCQkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogSGFuZGxlIFJTQ04gLS0gbm8gYXZhaWxhYmxlICIKKwkJCSAgICAibG9vcCBpZCB0byBwZXJmb3JtIExvZ2luLCBmYWlsZWQuXG4iLAorCQkJICAgIGhhLT5ob3N0X25vKSk7CisKKwkJCXJldHVybiAocnZhbCk7CisJCX0KKwl9CisKKwlpb2Rlc2MtPmNiX2lkeCA9IExPR0lOX1BPUlRfSU9DQl9DQjsKKwlpb2Rlc2MtPmRfaWQuYjI0ID0gcnNjbl9waWQuYjI0OworCWlvZGVzYy0+cmVtb3RlX2ZjcG9ydCA9IHJlbW90ZV9mY3BvcnQ7CisJcmVtb3RlX2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID0gaW9kZXNjLT5pZHg7CisKKwlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBIYW5kbGUgUlNDTiAtLSBhdHRlbXB0aW5nIGxvZ2luIHRvICIKKwkgICAgIlsleC8lMDJ4JTAyeCUwMnhdLlxuIiwgaGEtPmhvc3Rfbm8sIHJlbW90ZV9mY3BvcnQtPmxvb3BfaWQsCisJICAgIGlvZGVzYy0+ZF9pZC5iLmRvbWFpbiwgaW9kZXNjLT5kX2lkLmIuYXJlYSwgaW9kZXNjLT5kX2lkLmIuYWxfcGEpKTsKKworCXFsYTJ4MDBfc2VuZF9sb2dpbl9pb2NiKGhhLCBpb2Rlc2MsICZyc2NuX3BpZCwgaGFfbG9ja2VkKTsKKworCXJldHVybiAoUUxBX1NVQ0NFU1MpOworfQorCisvKioKKyAqIHFsYTJ4MDBfcHJvY2Vzc19pb2Rlc2MoKSAtIENvbXBsZXRlIElPIGRlc2NyaXB0b3IgcHJvY2Vzc2luZy4KKyAqIEBoYTogSEEgY29udGV4dAorICogQG1ieHN0YXQ6IE1haWxib3ggSU9DQiBzdGF0dXMKKyAqLwordm9pZAorcWxhMngwMF9wcm9jZXNzX2lvZGVzYyhzY3NpX3FsYV9ob3N0X3QgKmhhLCBzdHJ1Y3QgbWJ4X2VudHJ5ICptYnhzdGF0KQoreworCWludCBydmFsOworCXVpbnQzMl90IHNpZ25hdHVyZTsKKwlmY19wb3J0X3QgKmZjcG9ydDsKKwlzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqaW9kZXNjOworCisJc2lnbmF0dXJlID0gbWJ4c3RhdC0+aGFuZGxlOworCisJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogUHJvY2VzcyBJT0Rlc2MgLS0gcHJvY2Vzc2luZyAlMDh4LlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8sIHNpZ25hdHVyZSkpOworCisJLyogUmV0cmlldmUgcHJvcGVyIElPIGRlc2NyaXB0b3IuICovCisJaW9kZXNjID0gcWxhMngwMF9oYW5kbGVfdG9faW9kZXNjKGhhLCBzaWduYXR1cmUpOworCWlmIChpb2Rlc2MgPT0gTlVMTCkgeworCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBQcm9jZXNzIElPRGVzYyAtLSBpZ25vcmluZywgIgorCQkgICAgImluY29ycmVjdCBzaWduYXR1cmUgJTA4eC5cbiIsIGhhLT5ob3N0X25vLCBzaWduYXR1cmUpKTsKKworCQlyZXR1cm47CisJfQorCisJLyogU3RvcCBJTyBkZXNjcmlwdG9yIHRpbWVyLiAqLworCXFsYTJ4MDBfcmVtb3ZlX2lvZGVzY190aW1lcihpb2Rlc2MpOworCisJLyogVmVyaWZ5IHNpZ25hdHVyZSBtYXRjaC4gKi8KKwlpZiAoaW9kZXNjLT5zaWduYXR1cmUgIT0gc2lnbmF0dXJlKSB7CisJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IFByb2Nlc3MgSU9EZXNjIC0tIGlnbm9yaW5nLCAiCisJCSAgICAic2lnbmF0dXJlIG1pc21hdGNoLCBzZW50ICUwOHgsIHJlY2VpdmVkICUwOHguXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIGlvZGVzYy0+c2lnbmF0dXJlLCBzaWduYXR1cmUpKTsKKworCQlyZXR1cm47CisJfQorCisJLyogR28gd2l0aCBJT0NCIGNhbGxiYWNrLiAqLworCXJ2YWwgPSBpb2NiX2Z1bmN0aW9uX2NiX2xpc3RbaW9kZXNjLT5jYl9pZHhdKGhhLCBpb2Rlc2MsIG1ieHN0YXQpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qIElPIGRlc2NyaXB0b3IgcmV1c2VkIGJ5IGNhbGxiYWNrLiAqLworCQlyZXR1cm47CisJfQorCisJcWxhMngwMF9mcmVlX2lvZGVzYyhpb2Rlc2MpOworCisJaWYgKHRlc3RfYml0KElPREVTQ19QUk9DRVNTX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSB7CisJCS8qIFNjYW4gb3VyIGZjcG9ydHMgbGlzdCBmb3IgYW55IFJTQ04gcmVxdWVzdHMuICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmaGEtPmZjcG9ydHMsIGxpc3QpIHsKKwkJCWlmIChmY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9PSBJT0RFU0NfQURJU0NfTkVFREVEIHx8CisJCQkgICAgZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgPT0gSU9ERVNDX0xPR0lOX05FRURFRCkgeworCQkJCXFsYTJ4MDBfaGFuZGxlX3BvcnRfcnNjbihoYSwgMCwgZmNwb3J0LCAxKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQkvKiBTY2FuIG91ciBSU0NOIGZjcG9ydHMgbGlzdCBmb3IgYW55IFJTQ04gcmVxdWVzdHMuICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmaGEtPnJzY25fZmNwb3J0cywgbGlzdCkgeworCQkJaWYgKGZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID09IElPREVTQ19BRElTQ19ORUVERUQgfHwKKwkJCSAgICBmY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9PSBJT0RFU0NfTE9HSU5fTkVFREVEKSB7CisJCQkJcWxhMngwMF9oYW5kbGVfcG9ydF9yc2NuKGhhLCAwLCBmY3BvcnQsIDEpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKwljbGVhcl9iaXQoSU9ERVNDX1BST0NFU1NfTkVFREVELCAmaGEtPmRwY19mbGFncyk7Cit9CisKKy8qKgorICogcWxhMngwMF9jYW5jZWxfaW9fZGVzY3JpcHRvcnMoKSAtIENhbmNlbCBhbGwgb3V0c3RhbmRpbmcgaW8gZGVzY3JpcHRvcnMuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBhbHNvIGRlbGV0ZSBhbnkgUlNDTiBlbnRyaWVzIHJlbGF0ZWQgdG8gdGhlIG91dHN0YW5kaW5nCisgKiBJTyBkZXNjcmlwdG9ycy4KKyAqLwordm9pZAorcWxhMngwMF9jYW5jZWxfaW9fZGVzY3JpcHRvcnMoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlmY19wb3J0X3QgKmZjcG9ydCwgKmZjcHRlbXA7CisKKwljbGVhcl9iaXQoSU9ERVNDX1BST0NFU1NfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisKKwkvKiBBYm9ydCBhbGwgSU8gZGVzY3JpcHRvcnMuICovCisJcWxhMngwMF9pbml0X2lvX2Rlc2NyaXB0b3JzKGhhKTsKKworCS8qIFJlc2V0IGFsbCBwZW5kaW5nIElPIGRlc2NyaXB0b3JzIGluIGZjcG9ydHMgbGlzdC4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJmhhLT5mY3BvcnRzLCBsaXN0KSB7CisJCWZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID0gSU9ERVNDX0lOVkFMSURfSU5ERVg7CisJfQorCisJLyogUmVzZXQgYWxsIHBlbmRpbmcgSU8gZGVzY3JpcHRvcnMgaW4gcnNjbiBmY3BvcnRzIGxpc3QuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZjcG9ydCwgZmNwdGVtcCwgJmhhLT5yc2NuX2ZjcG9ydHMsIGxpc3QpIHsKKwkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogQ2FuY2VsIElPcyAtLSBGcmVlaW5nIFJTQ04gZmNwb3J0ICIKKwkJICAgICIlcCBbJXgvJTAyeCUwMnglMDJ4XS5cbiIsIGhhLT5ob3N0X25vLCBmY3BvcnQsCisJCSAgICBmY3BvcnQtPmxvb3BfaWQsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisKKwkJbGlzdF9kZWwoJmZjcG9ydC0+bGlzdCk7CisJCWtmcmVlKGZjcG9ydCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3NldHRpbmdzLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc2V0dGluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNThmNWZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3NldHRpbmdzLmgKQEAgLTAsMCArMSw2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyAqCisgKiBRTG9naWMgSVNQMngwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAyLjYueAorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUUxvZ2ljIENvcnBvcmF0aW9uCisgKiAod3d3LnFsb2dpYy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ29tcGlsZSB0aW1lIE9wdGlvbnM6CisgKiAgICAgMCAtIERpc2FibGUgYW5kIDEgLSBFbmFibGUKKyAqLworI2RlZmluZSBERUJVR19RTEEyMTAwCQkwCS8qIEZvciBEZWJ1ZyBvZiBxbGEyeDAwICovCisKKyNkZWZpbmUgU1RPUF9PTl9SRVNFVAkJMAorI2RlZmluZSBVU0VfQUJPUlRfVEdUCQkxCS8qIFVzZSBBYm9ydCBUYXJnZXQgbWJ4IGNtZCAqLworCisjZGVmaW5lIFZTQQkJCTAJLyogVm9sdW1lIFNldCBBZGRyZXNzaW5nICovCisKKy8qIEZhaWxvdmVyIG9wdGlvbnMgKi8KKyNkZWZpbmUgTUFYX1JFQ09WRVJZVElNRQkxMAkvKgorCQkJCQkgKiBNYXggc3VzcGVuZCB0aW1lIGZvciBhIGx1biByZWNvdmVyeQorCQkJCQkgKiB0aW1lCisJCQkJCSAqLworI2RlZmluZSBNQVhfRkFJTEJBQ0tUSU1FCTUJLyogTWF4IHN1c3BlbmQgdGltZSBiZWZvcmUgZmFpbCBiYWNrICovCisKKyNkZWZpbmUgUUxBX0NNRF9USU1FUl9ERUxUQQkzCisKKy8qIAorICogV2hlbiBhIGx1biBpcyBzdXNwZW5kZWQgZm9yIHRoZSAiTm90IFJlYWR5IiBjb25kaXRpb24gdGhlbiBpdCB3aWxsIHN1c3BlbmQKKyAqIHRoZSBsdW4gZm9yIGluY3JlbWVudHMgb2YgNiBzZWMgZGVsYXlzLiAgU1VTUEVORF9DT1VOVCBpcyB0aGF0IGNvdW50LgorICovCisjZGVmaW5lIFNVU1BFTkRfQ09VTlQJCTEwCS8qIDYgc2VjcyAqIDEwIHJldHJpZXMgPSA2MCBzZWNzICovCisKKy8qCisgKiBEZWZpbmVzIHRoZSB0aW1lIGluIHNlY29uZHMgdGhhdCB0aGUgZHJpdmVyIGV4dGVuZHMgdGhlIGNvbW1hbmQgdGltZW91dCB0bworICogZ2V0IGFyb3VuZCB0aGUgcHJvYmxlbSB3aGVyZSB0aGUgbWlkLWxheWVyIG9ubHkgYWxsb3dzIDUgcmV0cmllcyBmb3IKKyAqIGNvbW1hbmRzIHRoYXQgcmV0dXJuIEJVU19CVVNZCisgKi8KKyNkZWZpbmUgRVhURU5EX0NNRF9USU1FT1VUCTYwCisKKyNkZWZpbmUgTUFYX1JFVFJJRVNfT0ZfSVNQX0FCT1JUCTUKKworLyogTWF4IHRpbWUgdG8gd2FpdCBmb3IgdGhlIGxvb3AgdG8gYmUgaW4gTE9PUF9SRUFEWSBzdGF0ZSAqLworI2RlZmluZSBNQVhfTE9PUF9USU1FT1VUCSg2MCAqIDUpCisjZGVmaW5lIEVIX0FDVElWRQkJMQkvKiBFcnJvciBoYW5kbGVyIGFjdGl2ZSAqLworCisvKgorICogU29tZSB2ZW5kb3Igc3Vic3lzdGVtcyBkbyBub3QgcmVjb3ZlciBwcm9wZXJseSBhZnRlciBhIGRldmljZSByZXNldC4gIERlZmluZQorICogdGhlIGZvbGxvd2luZyB0byBmb3JjZSBhIGxvZ291dCBhZnRlciBhIHN1Y2Nlc3NmdWwgZGV2aWNlIHJlc2V0LgorICovCisjdW5kZWYgTE9HT1VUX0FGVEVSX0RFVklDRV9SRVNFVAorCisjaW5jbHVkZSAicWxhX3ZlcnNpb24uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTc1ZmJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCkBAIC0wLDAgKzEsMjk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIFFMT0dJQyBMSU5VWCBTT0ZUV0FSRQorICoKKyAqIFFMb2dpYyBJU1AyeDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBRTG9naWMgQ29ycG9yYXRpb24KKyAqICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInFsYV9kZWYuaCIKKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIHVpbnQxNl90IHFsYTJ4MDBfbnZyYW1fcmVxdWVzdChzY3NpX3FsYV9ob3N0X3QgKiwgdWludDMyX3QpOworc3RhdGljIHZvaWQgcWxhMngwMF9udl9kZXNlbGVjdChzY3NpX3FsYV9ob3N0X3QgKik7CitzdGF0aWMgdm9pZCBxbGEyeDAwX252X3dyaXRlKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCk7CisKKy8qCisgKiBOVlJBTSBzdXBwb3J0IHJvdXRpbmVzCisgKi8KKworLyoqCisgKiBxbGEyeDAwX2xvY2tfbnZyYW1fYWNjZXNzKCkgLSAKKyAqIEBoYTogSEEgY29udGV4dAorICovCit2b2lkCitxbGEyeDAwX2xvY2tfbnZyYW1fYWNjZXNzKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJdWludDE2X3QgZGF0YTsKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKworCWlmICghSVNfUUxBMjEwMChoYSkgJiYgIUlTX1FMQTIyMDAoaGEpICYmICFJU19RTEEyMzAwKGhhKSkgeworCQlkYXRhID0gUkRfUkVHX1dPUkQoJnJlZy0+bnZyYW0pOworCQl3aGlsZSAoZGF0YSAmIE5WUl9CVVNZKSB7CisJCQl1ZGVsYXkoMTAwKTsKKwkJCWRhdGEgPSBSRF9SRUdfV09SRCgmcmVnLT5udnJhbSk7CisJCX0KKworCQkvKiBMb2NrIHJlc291cmNlICovCisJCVdSVF9SRUdfV09SRCgmcmVnLT51LmlzcDIzMDAuaG9zdF9zZW1hcGhvcmUsIDB4MSk7CisJCVJEX1JFR19XT1JEKCZyZWctPnUuaXNwMjMwMC5ob3N0X3NlbWFwaG9yZSk7CisJCXVkZWxheSg1KTsKKwkJZGF0YSA9IFJEX1JFR19XT1JEKCZyZWctPnUuaXNwMjMwMC5ob3N0X3NlbWFwaG9yZSk7CisJCXdoaWxlICgoZGF0YSAmIEJJVF8wKSA9PSAwKSB7CisJCQkvKiBMb2NrIGZhaWxlZCAqLworCQkJdWRlbGF5KDEwMCk7CisJCQlXUlRfUkVHX1dPUkQoJnJlZy0+dS5pc3AyMzAwLmhvc3Rfc2VtYXBob3JlLCAweDEpOworCQkJUkRfUkVHX1dPUkQoJnJlZy0+dS5pc3AyMzAwLmhvc3Rfc2VtYXBob3JlKTsKKwkJCXVkZWxheSg1KTsKKwkJCWRhdGEgPSBSRF9SRUdfV09SRCgmcmVnLT51LmlzcDIzMDAuaG9zdF9zZW1hcGhvcmUpOworCQl9CisJfQorfQorCisvKioKKyAqIHFsYTJ4MDBfdW5sb2NrX252cmFtX2FjY2VzcygpIC0gCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqLwordm9pZAorcWxhMngwMF91bmxvY2tfbnZyYW1fYWNjZXNzKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisKKwlpZiAoIUlTX1FMQTIxMDAoaGEpICYmICFJU19RTEEyMjAwKGhhKSAmJiAhSVNfUUxBMjMwMChoYSkpIHsKKwkJV1JUX1JFR19XT1JEKCZyZWctPnUuaXNwMjMwMC5ob3N0X3NlbWFwaG9yZSwgMCk7CisJCVJEX1JFR19XT1JEKCZyZWctPnUuaXNwMjMwMC5ob3N0X3NlbWFwaG9yZSk7CisJfQorfQorCisvKioKKyAqIHFsYTJ4MDBfcmVsZWFzZV9udnJhbV9wcm90ZWN0aW9uKCkgLSAKKyAqIEBoYTogSEEgY29udGV4dAorICovCit2b2lkCitxbGEyeDAwX3JlbGVhc2VfbnZyYW1fcHJvdGVjdGlvbihzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWRldmljZV9yZWdfdCAqcmVnOworCXVpbnQzMl90IHdvcmQ7CisKKwlyZWcgPSBoYS0+aW9iYXNlOworCisJLyogUmVsZWFzZSBOVlJBTSB3cml0ZSBwcm90ZWN0aW9uLiAqLworCWlmIChJU19RTEEyMzIyKGhhKSB8fCBJU19RTEE2MzIyKGhhKSkgeworCQkvKiBXcml0ZSBlbmFibGUuICovCisJCXFsYTJ4MDBfbnZfd3JpdGUoaGEsIE5WUl9EQVRBX09VVCk7CisJCXFsYTJ4MDBfbnZfd3JpdGUoaGEsIDApOworCQlxbGEyeDAwX252X3dyaXRlKGhhLCAwKTsKKwkJZm9yICh3b3JkID0gMDsgd29yZCA8IDg7IHdvcmQrKykKKwkJCXFsYTJ4MDBfbnZfd3JpdGUoaGEsIE5WUl9EQVRBX09VVCk7CisKKwkJcWxhMngwMF9udl9kZXNlbGVjdChoYSk7CisKKwkJLyogRW5hYmxlIHByb3RlY3Rpb24gcmVnaXN0ZXIuICovCisJCXFsYTJ4MDBfbnZfd3JpdGUoaGEsIE5WUl9QUl9FTkFCTEUgfCBOVlJfREFUQV9PVVQpOworCQlxbGEyeDAwX252X3dyaXRlKGhhLCBOVlJfUFJfRU5BQkxFKTsKKwkJcWxhMngwMF9udl93cml0ZShoYSwgTlZSX1BSX0VOQUJMRSk7CisJCWZvciAod29yZCA9IDA7IHdvcmQgPCA4OyB3b3JkKyspCisJCQlxbGEyeDAwX252X3dyaXRlKGhhLCBOVlJfREFUQV9PVVQgfCBOVlJfUFJfRU5BQkxFKTsKKworCQlxbGEyeDAwX252X2Rlc2VsZWN0KGhhKTsKKworCQkvKiBDbGVhciBwcm90ZWN0aW9uIHJlZ2lzdGVyIChmZmZmIGlzIGNsZWFyZWQpLiAqLworCQlxbGEyeDAwX252X3dyaXRlKGhhLCBOVlJfUFJfRU5BQkxFIHwgTlZSX0RBVEFfT1VUKTsKKwkJcWxhMngwMF9udl93cml0ZShoYSwgTlZSX1BSX0VOQUJMRSB8IE5WUl9EQVRBX09VVCk7CisJCXFsYTJ4MDBfbnZfd3JpdGUoaGEsIE5WUl9QUl9FTkFCTEUgfCBOVlJfREFUQV9PVVQpOworCQlmb3IgKHdvcmQgPSAwOyB3b3JkIDwgODsgd29yZCsrKQorCQkJcWxhMngwMF9udl93cml0ZShoYSwgTlZSX0RBVEFfT1VUIHwgTlZSX1BSX0VOQUJMRSk7CisKKwkJcWxhMngwMF9udl9kZXNlbGVjdChoYSk7CisKKwkJLyogV2FpdCBmb3IgTlZSQU0gdG8gYmVjb21lIHJlYWR5LiAqLworCQlXUlRfUkVHX1dPUkQoJnJlZy0+bnZyYW0sIE5WUl9TRUxFQ1QpOworCQlkbyB7CisJCQlOVlJBTV9ERUxBWSgpOworCQkJd29yZCA9IFJEX1JFR19XT1JEKCZyZWctPm52cmFtKTsKKwkJfSB3aGlsZSAoKHdvcmQgJiBOVlJfREFUQV9JTikgPT0gMCk7CisJfQorfQorCisvKioKKyAqIHFsYTJ4MDBfZ2V0X252cmFtX3dvcmQoKSAtIENhbGN1bGF0ZXMgd29yZCBwb3NpdGlvbiBpbiBOVlJBTSBhbmQgY2FsbHMgdGhlCisgKglyZXF1ZXN0IHJvdXRpbmUgdG8gZ2V0IHRoZSB3b3JkIGZyb20gTlZSQU0uCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBhZGRyOiBBZGRyZXNzIGluIE5WUkFNIHRvIHJlYWQKKyAqCisgKiBSZXR1cm5zIHRoZSB3b3JkIHJlYWQgZnJvbSBudnJhbSBAYWRkci4KKyAqLwordWludDE2X3QKK3FsYTJ4MDBfZ2V0X252cmFtX3dvcmQoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDMyX3QgYWRkcikKK3sKKwl1aW50MTZfdAlkYXRhOworCXVpbnQzMl90CW52X2NtZDsKKworCW52X2NtZCA9IGFkZHIgPDwgMTY7CisJbnZfY21kIHw9IE5WX1JFQURfT1A7CisJZGF0YSA9IHFsYTJ4MDBfbnZyYW1fcmVxdWVzdChoYSwgbnZfY21kKTsKKworCXJldHVybiAoZGF0YSk7Cit9CisKKy8qKgorICogcWxhMngwMF93cml0ZV9udnJhbV93b3JkKCkgLSBXcml0ZSBOVlJBTSBkYXRhLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAYWRkcjogQWRkcmVzcyBpbiBOVlJBTSB0byB3cml0ZQorICogQGRhdGE6IHdvcmQgdG8gcHJvZ3JhbQorICovCit2b2lkCitxbGEyeDAwX3dyaXRlX252cmFtX3dvcmQoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDMyX3QgYWRkciwgdWludDE2X3QgZGF0YSkKK3sKKwlpbnQgY291bnQ7CisJdWludDE2X3Qgd29yZDsKKwl1aW50MzJfdCBudl9jbWQ7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisKKwlxbGEyeDAwX252X3dyaXRlKGhhLCBOVlJfREFUQV9PVVQpOworCXFsYTJ4MDBfbnZfd3JpdGUoaGEsIDApOworCXFsYTJ4MDBfbnZfd3JpdGUoaGEsIDApOworCisJZm9yICh3b3JkID0gMDsgd29yZCA8IDg7IHdvcmQrKykKKwkJcWxhMngwMF9udl93cml0ZShoYSwgTlZSX0RBVEFfT1VUKTsKKworCXFsYTJ4MDBfbnZfZGVzZWxlY3QoaGEpOworCisJLyogV3JpdGUgZGF0YSAqLworCW52X2NtZCA9IChhZGRyIDw8IDE2KSB8IE5WX1dSSVRFX09QOworCW52X2NtZCB8PSBkYXRhOworCW52X2NtZCA8PD0gNTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAyNzsgY291bnQrKykgeworCQlpZiAobnZfY21kICYgQklUXzMxKQorCQkJcWxhMngwMF9udl93cml0ZShoYSwgTlZSX0RBVEFfT1VUKTsKKwkJZWxzZQorCQkJcWxhMngwMF9udl93cml0ZShoYSwgMCk7CisKKwkJbnZfY21kIDw8PSAxOworCX0KKworCXFsYTJ4MDBfbnZfZGVzZWxlY3QoaGEpOworCisJLyogV2FpdCBmb3IgTlZSQU0gdG8gYmVjb21lIHJlYWR5ICovCisJV1JUX1JFR19XT1JEKCZyZWctPm52cmFtLCBOVlJfU0VMRUNUKTsKKwlkbyB7CisJCU5WUkFNX0RFTEFZKCk7CisJCXdvcmQgPSBSRF9SRUdfV09SRCgmcmVnLT5udnJhbSk7CisJfSB3aGlsZSAoKHdvcmQgJiBOVlJfREFUQV9JTikgPT0gMCk7CisKKwlxbGEyeDAwX252X2Rlc2VsZWN0KGhhKTsKKworCS8qIERpc2FibGUgd3JpdGVzICovCisJcWxhMngwMF9udl93cml0ZShoYSwgTlZSX0RBVEFfT1VUKTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAxMDsgY291bnQrKykKKwkJcWxhMngwMF9udl93cml0ZShoYSwgMCk7CisKKwlxbGEyeDAwX252X2Rlc2VsZWN0KGhhKTsKK30KKworLyoqCisgKiBxbGEyeDAwX252cmFtX3JlcXVlc3QoKSAtIFNlbmRzIHJlYWQgY29tbWFuZCB0byBOVlJBTSBhbmQgZ2V0cyBkYXRhIGZyb20KKyAqCU5WUkFNLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAbnZfY21kOiBOVlJBTSBjb21tYW5kCisgKgorICogQml0IGRlZmluaXRpb25zIGZvciBOVlJBTSBjb21tYW5kOgorICoKKyAqCUJpdCAyNiAgICAgPSBzdGFydCBiaXQKKyAqCUJpdCAyNSwgMjQgPSBvcGNvZGUKKyAqCUJpdCAyMy0xNiAgPSBhZGRyZXNzCisgKglCaXQgMTUtMCAgID0gd3JpdGUgZGF0YQorICoKKyAqIFJldHVybnMgdGhlIHdvcmQgcmVhZCBmcm9tIG52cmFtIEBhZGRyLgorICovCitzdGF0aWMgdWludDE2X3QKK3FsYTJ4MDBfbnZyYW1fcmVxdWVzdChzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCBudl9jbWQpCit7CisJdWludDhfdAkJY250OworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCXVpbnQxNl90CWRhdGEgPSAwOworCXVpbnQxNl90CXJlZ19kYXRhOworCisJLyogU2VuZCBjb21tYW5kIHRvIE5WUkFNLiAqLworCW52X2NtZCA8PD0gNTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IDExOyBjbnQrKykgeworCQlpZiAobnZfY21kICYgQklUXzMxKQorCQkJcWxhMngwMF9udl93cml0ZShoYSwgTlZSX0RBVEFfT1VUKTsKKwkJZWxzZQorCQkJcWxhMngwMF9udl93cml0ZShoYSwgMCk7CisJCW52X2NtZCA8PD0gMTsKKwl9CisKKwkvKiBSZWFkIGRhdGEgZnJvbSBOVlJBTS4gKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IDE2OyBjbnQrKykgeworCQlXUlRfUkVHX1dPUkQoJnJlZy0+bnZyYW0sIE5WUl9TRUxFQ1QgfCBOVlJfQ0xPQ0spOworCQlOVlJBTV9ERUxBWSgpOworCQlkYXRhIDw8PSAxOworCQlyZWdfZGF0YSA9IFJEX1JFR19XT1JEKCZyZWctPm52cmFtKTsKKwkJaWYgKHJlZ19kYXRhICYgTlZSX0RBVEFfSU4pCisJCQlkYXRhIHw9IEJJVF8wOworCQlXUlRfUkVHX1dPUkQoJnJlZy0+bnZyYW0sIE5WUl9TRUxFQ1QpOworCQlSRF9SRUdfV09SRCgmcmVnLT5udnJhbSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCQlOVlJBTV9ERUxBWSgpOworCX0KKworCS8qIERlc2VsZWN0IGNoaXAuICovCisJV1JUX1JFR19XT1JEKCZyZWctPm52cmFtLCBOVlJfREVTRUxFQ1QpOworCVJEX1JFR19XT1JEKCZyZWctPm52cmFtKTsJCS8qIFBDSSBQb3N0aW5nLiAqLworCU5WUkFNX0RFTEFZKCk7CisKKwlyZXR1cm4gKGRhdGEpOworfQorCisvKioKKyAqIHFsYTJ4MDBfbnZfd3JpdGUoKSAtIENsZWFuIE5WUkFNIG9wZXJhdGlvbnMuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfbnZfZGVzZWxlY3Qoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKworCVdSVF9SRUdfV09SRCgmcmVnLT5udnJhbSwgTlZSX0RFU0VMRUNUKTsKKwlSRF9SRUdfV09SRCgmcmVnLT5udnJhbSk7CQkvKiBQQ0kgUG9zdGluZy4gKi8KKwlOVlJBTV9ERUxBWSgpOworfQorCisvKioKKyAqIHFsYTJ4MDBfbnZfd3JpdGUoKSAtIFByZXBhcmUgZm9yIE5WUkFNIHJlYWQvd3JpdGUgb3BlcmF0aW9uLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAZGF0YTogU2VyaWFsIGludGVyZmFjZSBzZWxlY3RvcgorICovCitzdGF0aWMgdm9pZAorcWxhMngwMF9udl93cml0ZShzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCBkYXRhKQoreworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCisJV1JUX1JFR19XT1JEKCZyZWctPm52cmFtLCBkYXRhIHwgTlZSX1NFTEVDVCB8IE5WUl9XUlRfRU5BQkxFKTsKKwlSRF9SRUdfV09SRCgmcmVnLT5udnJhbSk7CQkvKiBQQ0kgUG9zdGluZy4gKi8KKwlOVlJBTV9ERUxBWSgpOworCVdSVF9SRUdfV09SRCgmcmVnLT5udnJhbSwgZGF0YSB8IE5WUl9TRUxFQ1R8IE5WUl9DTE9DSyB8CisJICAgIE5WUl9XUlRfRU5BQkxFKTsKKwlSRF9SRUdfV09SRCgmcmVnLT5udnJhbSk7CQkvKiBQQ0kgUG9zdGluZy4gKi8KKwlOVlJBTV9ERUxBWSgpOworCVdSVF9SRUdfV09SRCgmcmVnLT5udnJhbSwgZGF0YSB8IE5WUl9TRUxFQ1QgfCBOVlJfV1JUX0VOQUJMRSk7CisJUkRfUkVHX1dPUkQoJnJlZy0+bnZyYW0pOwkJLyogUENJIFBvc3RpbmcuICovCisJTlZSQU1fREVMQVkoKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmZjg4YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyAqCisgKiBRTG9naWMgSVNQMngwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAyLjYueAorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUUxvZ2ljIENvcnBvcmF0aW9uCisgKiAod3d3LnFsb2dpYy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogRHJpdmVyIHZlcnNpb24gCisgKi8KKyNkZWZpbmUgUUxBMlhYWF9WRVJTSU9OICAgICAgIjguMDAuMDJiNC1rIgorCisjZGVmaW5lIFFMQV9EUklWRVJfTUFKT1JfVkVSCTgKKyNkZWZpbmUgUUxBX0RSSVZFUl9NSU5PUl9WRVIJMAorI2RlZmluZSBRTEFfRFJJVkVSX1BBVENIX1ZFUgkyCisjZGVmaW5lIFFMQV9EUklWRVJfQkVUQV9WRVIJNApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Fsb2dpY2Zhcy5jIGIvZHJpdmVycy9zY3NpL3Fsb2dpY2Zhcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYWRiMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljZmFzLmMKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiBRbG9naWMgRkFTNDA4IElTQSBjYXJkIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAxOTk0LCBUb20gWmVydWNoYS4gICAKKyAqIHR6QGV4ZWNwYy5jb20KKyAqIAorICogUmVkaXN0cmlidXRhYmxlIHVuZGVyIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoKKyAqIEZvciB0aGUgYXZvaWRhbmNlIG9mIGRvdWJ0IHRoZSAicHJlZmVycmVkIGZvcm0iIG9mIHRoaXMgY29kZSBpcyBvbmUgd2hpY2gKKyAqIGlzIGluIGFuIG9wZW4gbm9uIHBhdGVudCBlbmN1bWJlcmVkIGZvcm1hdC4gV2hlcmUgY3J5cHRvZ3JhcGhpYyBrZXkgc2lnbmluZworICogZm9ybXMgcGFydCBvZiB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBleGVjdXRhYmxlIHRoZSBpbmZvcm1hdGlvbgorICogaW5jbHVkaW5nIGtleXMgbmVlZGVkIHRvIGdlbmVyYXRlIGFuIGVxdWl2YWxlbnRseSBmdW5jdGlvbmFsIGV4ZWN1dGFibGUKKyAqIGFyZSBkZWVtZWQgdG8gYmUgcGFydCBvZiB0aGUgc291cmNlIGNvZGUuCisgKgorICogQ2hlY2sgcWxvZ2ljZmFzNDA4LmMgZm9yIG1vcmUgY3JlZGl0cyBhbmQgaW5mby4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CQkvKiB0byBnZXQgZGlzayBjYXBhY2l0eSAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAicWxvZ2ljZmFzNDA4LmgiCisKKy8qIFNldCB0aGUgZm9sbG93aW5nIHRvIDIgdG8gdXNlIG5vcm1hbCBpbnRlcnJ1cHQgKGFjdGl2ZSBoaWdoL3RvdGVtcG9sZS0KKyAqIHRyaXN0YXRlKSwgb3RoZXJ3aXNlIHVzZSAwIChSRVFVSVJFRCBGT1IgUENNQ0lBKSBmb3IgYWN0aXZlIGxvdywgb3BlbgorICogZHJhaW4KKyAqLworI2RlZmluZSBJTlRfVFlQRQkyCisKK3N0YXRpYyBjaGFyIHFsb2dpY2Zhc19uYW1lW10gPSAicWxvZ2ljZmFzIjsKKworLyoKKyAqCUxvb2sgZm9yIHFsb2dpYyBjYXJkIGFuZCBpbml0IGlmIGZvdW5kIAorICovCisgCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqX19xbG9naWNmYXNfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqaG9zdCwKKwkJCQkJCQkJaW50IHFiYXNlLAorCQkJCQkJCQlpbnQgcWxpcnEpCit7CisJaW50IHFsdHlwOwkJLyogdHlwZSBvZiBjaGlwICovCisJaW50IHFpbml0aWQ7CisJc3RydWN0IFNjc2lfSG9zdCAqaHJlZzsJLyogcmVnaXN0ZXJlZCBob3N0IHN0cnVjdHVyZSAqLworCXN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqcHJpdjsKKworCS8qCVFsb2dpYyBDYXJkcyBvbmx5IGV4aXN0IGF0IDB4MjMwIG9yIDB4MzMwICh0aGUgY2hpcCBpdHNlbGYKKwkgKglkZWNvZGVzIHRoZSBhZGRyZXNzIC0gSSBjaGVjayAyMzAgZmlyc3Qgc2luY2UgTUlESSBjYXJkcyBhcmUKKwkgKgl0eXBpY2FsbHkgYXQgMHgzMzAKKwkgKgorCSAqCVRoZW9yZXRpY2FsbHksIHR3byBRbG9naWMgY2FyZHMgY2FuIGNvZXhpc3QgaW4gdGhlIHNhbWUgc3lzdGVtLgorCSAqCVRoaXMgc2hvdWxkIHdvcmsgYnkgc2ltcGx5IHVzaW5nIHRoaXMgYXMgYSBsb2FkYWJsZSBtb2R1bGUgZm9yCisJICoJdGhlIHNlY29uZCBjYXJkLCBidXQgSSBoYXZlbid0IHRlc3RlZCB0aGlzLgorCSAqLworCisJaWYgKCFxYmFzZSB8fCBxbGlycSA9PSAtMSkKKwkJZ290byBlcnI7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHFiYXNlLCAweDEwLCBxbG9naWNmYXNfbmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGFkZHJlc3MgJSN4IGlzIGJ1c3lcbiIsIHFsb2dpY2Zhc19uYW1lLAorCQkJCQkJCSAgICAgIHFiYXNlKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKCFxbG9naWNmYXM0MDhfZGV0ZWN0KHFiYXNlLCBJTlRfVFlQRSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHByb2JlIGZhaWxlZCBmb3IgJSN4XG4iLAorCQkJCQkJCQlxbG9naWNmYXNfbmFtZSwKKwkJCQkJCQkJcWJhc2UpOworCQlnb3RvIGVycl9yZWxlYXNlX21lbTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogVXNpbmcgcHJlc2V0IGJhc2UgYWRkcmVzcyBvZiAlMDN4LCIKKwkJCSAiIElSUSAlZFxuIiwgcWxvZ2ljZmFzX25hbWUsIHFiYXNlLCBxbGlycSk7CisKKwlxbHR5cCA9IHFsb2dpY2ZhczQwOF9nZXRfY2hpcF90eXBlKHFiYXNlLCBJTlRfVFlQRSk7CisJcWluaXRpZCA9IGhvc3QtPnRoaXNfaWQ7CisJaWYgKHFpbml0aWQgPCAwKQorCQlxaW5pdGlkID0gNzsJLyogaWYgbm8gSUQsIHVzZSA3ICovCisKKwlxbG9naWNmYXM0MDhfc2V0dXAocWJhc2UsIHFpbml0aWQsIElOVF9UWVBFKTsKKworCWhyZWcgPSBzY3NpX2hvc3RfYWxsb2MoaG9zdCwgc2l6ZW9mKHN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdikpOworCWlmICghaHJlZykKKwkJZ290byBlcnJfcmVsZWFzZV9tZW07CisJcHJpdiA9IGdldF9wcml2X2J5X2hvc3QoaHJlZyk7CisJaHJlZy0+aW9fcG9ydCA9IHFiYXNlOworCWhyZWctPm5faW9fcG9ydCA9IDE2OworCWhyZWctPmRtYV9jaGFubmVsID0gLTE7CisJaWYgKHFsaXJxICE9IC0xKQorCQlocmVnLT5pcnEgPSBxbGlycTsKKwlwcml2LT5xYmFzZSA9IHFiYXNlOworCXByaXYtPnFsaXJxID0gcWxpcnE7CisJcHJpdi0+cWluaXRpZCA9IHFpbml0aWQ7CisJcHJpdi0+c2hvc3QgPSBocmVnOworCXByaXYtPmludF90eXBlID0gSU5UX1RZUEU7CisKKwlzcHJpbnRmKHByaXYtPnFpbmZvLAorCQkiUWxvZ2ljZmFzIERyaXZlciB2ZXJzaW9uIDAuNDYsIGNoaXAgJTAyWCBhdCAlMDNYLCBJUlEgJWQsIFRQZG1hOiVkIiwKKwkJcWx0eXAsIHFiYXNlLCBxbGlycSwgUUxfVFVSQk9fUERNQSk7CisJaG9zdC0+bmFtZSA9IHFsb2dpY2Zhc19uYW1lOworCisJaWYgKHJlcXVlc3RfaXJxKHFsaXJxLCBxbG9naWNmYXM0MDhfaWhhbmRsLCAwLCBxbG9naWNmYXNfbmFtZSwgaHJlZykpCisJCWdvdG8gZnJlZV9zY3NpX2hvc3Q7CisKKwlpZiAoc2NzaV9hZGRfaG9zdChocmVnLCBOVUxMKSkKKwkJZ290byBmcmVlX2ludGVycnVwdDsKKworCXNjc2lfc2Nhbl9ob3N0KGhyZWcpOworCisJcmV0dXJuIGhyZWc7CisKK2ZyZWVfaW50ZXJydXB0OgorCWZyZWVfaXJxKHFsaXJxLCBocmVnKTsKKworZnJlZV9zY3NpX2hvc3Q6CisJc2NzaV9ob3N0X3B1dChocmVnKTsKKworZXJyX3JlbGVhc2VfbWVtOgorCXJlbGVhc2VfcmVnaW9uKHFiYXNlLCAweDEwKTsKK2VycjoKKwlyZXR1cm4gTlVMTDsKK30KKworI2RlZmluZSBNQVhfUUxPR0lDRkFTCTgKK3N0YXRpYyBzdHJ1Y3QgcWxvZ2ljZmFzNDA4X3ByaXYgKmNhcmRzOworc3RhdGljIGludCBpb2Jhc2VbTUFYX1FMT0dJQ0ZBU107CitzdGF0aWMgaW50IGlycVtNQVhfUUxPR0lDRkFTXSA9IHsgWzAgLi4uIE1BWF9RTE9HSUNGQVMtMV0gPSAtMSB9OworbW9kdWxlX3BhcmFtX2FycmF5KGlvYmFzZSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvYmFzZSwgIkkvTyBhZGRyZXNzIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSIpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBxbG9naWNmYXNfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqc2h0KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqcHJpdjsKKwlpbnQgbnVtOworCisJZm9yIChudW0gPSAwOyBudW0gPCBNQVhfUUxPR0lDRkFTOyBudW0rKykgeworCQlzaG9zdCA9IF9fcWxvZ2ljZmFzX2RldGVjdChzaHQsIGlvYmFzZVtudW1dLCBpcnFbbnVtXSk7CisJCWlmIChzaG9zdCA9PSBOVUxMKSB7CisJCQkvKiBubyBtb3JlIGRldmljZXMgKi8KKwkJCWJyZWFrOworCQl9CisJCXByaXYgPSBnZXRfcHJpdl9ieV9ob3N0KHNob3N0KTsKKwkJcHJpdi0+bmV4dCA9IGNhcmRzOworCQljYXJkcyA9IHByaXY7CisJfQorCisJcmV0dXJuIG51bTsKK30KKworc3RhdGljIGludCBxbG9naWNmYXNfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3QgcWxvZ2ljZmFzNDA4X3ByaXYgKnByaXYgPSBnZXRfcHJpdl9ieV9ob3N0KHNob3N0KTsKKworCWlmIChzaG9zdC0+aXJxKSB7CisJCXFsb2dpY2ZhczQwOF9kaXNhYmxlX2ludHMocHJpdik7CQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBzaG9zdCk7CisJfQorCWlmIChzaG9zdC0+ZG1hX2NoYW5uZWwgIT0gMHhmZikKKwkJZnJlZV9kbWEoc2hvc3QtPmRtYV9jaGFubmVsKTsKKwlpZiAoc2hvc3QtPmlvX3BvcnQgJiYgc2hvc3QtPm5faW9fcG9ydCkKKwkJcmVsZWFzZV9yZWdpb24oc2hvc3QtPmlvX3BvcnQsIHNob3N0LT5uX2lvX3BvcnQpOworCXNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpOworCXNjc2lfaG9zdF9wdXQoc2hvc3QpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglUaGUgZHJpdmVyIHRlbXBsYXRlIGlzIGFsc28gbmVlZGVkIGZvciBQQ01DSUEKKyAqLworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBxbG9naWNmYXNfZHJpdmVyX3RlbXBsYXRlID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSBxbG9naWNmYXNfbmFtZSwKKwkucHJvY19uYW1lCQk9IHFsb2dpY2Zhc19uYW1lLAorCS5pbmZvCQkJPSBxbG9naWNmYXM0MDhfaW5mbywKKwkucXVldWVjb21tYW5kCQk9IHFsb2dpY2ZhczQwOF9xdWV1ZWNvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBxbG9naWNmYXM0MDhfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gcWxvZ2ljZmFzNDA4X2J1c19yZXNldCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXI9IHFsb2dpY2ZhczQwOF9kZXZpY2VfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IHFsb2dpY2ZhczQwOF9ob3N0X3Jlc2V0LAorCS5iaW9zX3BhcmFtCQk9IHFsb2dpY2ZhczQwOF9iaW9zcGFyYW0sCisJLmNhbl9xdWV1ZQkJPSAxLAorCS50aGlzX2lkCQk9IC0xLAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcsCit9OworCitzdGF0aWMgX19pbml0IGludCBxbG9naWNmYXNfaW5pdCh2b2lkKQoreworCWlmICghcWxvZ2ljZmFzX2RldGVjdCgmcWxvZ2ljZmFzX2RyaXZlcl90ZW1wbGF0ZSkpIHsKKwkJLyogbm8gY2FyZHMgZm91bmQgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIGNhcmRzIHdlcmUgZm91bmQsIHBsZWFzZSBzcGVjaWZ5ICIKKwkJCQkgIkkvTyBhZGRyZXNzIGFuZCBJUlEgdXNpbmcgaW9iYXNlPSBhbmQgaXJxPSAiCisJCQkJICJvcHRpb25zIiwgcWxvZ2ljZmFzX25hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIHFsb2dpY2Zhc19leGl0KHZvaWQpCit7CisJc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICpwcml2OworCisJZm9yIChwcml2ID0gY2FyZHM7IHByaXYgIT0gTlVMTDsgcHJpdiA9IHByaXYtPm5leHQpCisJCXFsb2dpY2Zhc19yZWxlYXNlKHByaXYtPnNob3N0KTsKK30KKworTU9EVUxFX0FVVEhPUigiVG9tIFplcnVjaGEsIE1pY2hhZWwgR3JpZmZpdGgiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB0aGUgUWxvZ2ljIEZBUzQwOCBiYXNlZCBJU0EgY2FyZCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX2luaXQocWxvZ2ljZmFzX2luaXQpOworbW9kdWxlX2V4aXQocWxvZ2ljZmFzX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxvZ2ljZmFzNDA4LmMgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljZmFzNDA4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2Y2UwYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbG9naWNmYXM0MDguYwpAQCAtMCwwICsxLDYzNyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgICBRbG9naWMgbGludXggZHJpdmVyIC0gd29yayBpbiBwcm9ncmVzcy4gTm8gV2FycmFudHkgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgVXNlIGF0IHlvdXIgb3duIHJpc2suICBTdXBwb3J0IFRvcnQgUmVmb3JtIHNvIHlvdSB3b24ndCBoYXZlIHRvIHJlYWQgYWxsCisgICB0aGVzZSBzaWxseSBkaXNjbGFpbWVycy4KKworICAgQ29weXJpZ2h0IDE5OTQsIFRvbSBaZXJ1Y2hhLiAgIAorICAgdHpAZXhlY3BjLmNvbQorICAgCisgICBBZGRpdGlvbmFsIENvZGUsIGFuZCBtdWNoIGFwcHJlY2lhdGVkIGhlbHAgYnkKKyAgIE1pY2hhZWwgQS4gR3JpZmZpdGgKKyAgIGdyaWZAY3MudWNyLmVkdQorCisgICBUaGFua3MgdG8gRXJpYyBZb3VuZ2RhbGUgYW5kIERhdmUgSGluZHMgZm9yIGxvYWRhYmxlIG1vZHVsZSBhbmQgUENNQ0lBCisgICBoZWxwIHJlc3BlY3RpdmVseSwgYW5kIGZvciBzdWZmZXJpbmcgdGhyb3VnaCBteSBmb29saXNobmVzcyBkdXJpbmcgdGhlCisgICBkZWJ1Z2dpbmcgcHJvY2Vzcy4KKworICAgUmVmZXJlbmNlIFFsb2dpYyBGQVM0MDggVGVjaG5pY2FsIE1hbnVhbCwgNTM0MDgtNTEwLTAwQSwgTWF5IDEwLCAxOTk0CisgICAoeW91IGNhbiByZWZlcmVuY2UgaXQsIGJ1dCBpdCBpcyBpbmNvbXBsZXRlIGFuZCBpbmFjY3VyYXRlIGluIHBsYWNlcykKKworICAgVmVyc2lvbiAwLjQ2IDEvMzAvOTcgLSBrZXJuZWwgMS4yLjArCisKKyAgIEZ1bmN0aW9ucyBhcyBzdGFuZGFsb25lLCBsb2FkYWJsZSwgYW5kIFBDTUNJQSBkcml2ZXIsIHRoZSBsYXR0ZXIgZnJvbQorICAgRGF2ZSBIaW5kcycgUENNQ0lBIHBhY2thZ2UuCisgICAKKyAgIENsZWFuZWQgdXAgMjYvMTAvMjAwMiBieSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiBhcyBwYXJ0IG9mIHRoZSAyLjUKKyAgIFNDU0kgZHJpdmVyIGNsZWFudXAgYW5kIGF1ZGl0LiBUaGlzIGRyaXZlciBzdGlsbCBuZWVkcyB3b3JrIG9uIHRoZQorICAgZm9sbG93aW5nCisgICAJLQlOb24gdGVybWluYXRpbmcgaGFyZHdhcmUgd2FpdHMKKyAgIAktCVNvbWUgbGF5ZXJpbmcgdmlvbGF0aW9ucyB3aXRoIGl0cyBwY21jaWEgc3R1YgorCisgICBSZWRpc3RyaWJ1dGFibGUgdW5kZXIgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisKKyAgIEZvciB0aGUgYXZvaWRhbmNlIG9mIGRvdWJ0IHRoZSAicHJlZmVycmVkIGZvcm0iIG9mIHRoaXMgY29kZSBpcyBvbmUgd2hpY2gKKyAgIGlzIGluIGFuIG9wZW4gbm9uIHBhdGVudCBlbmN1bWJlcmVkIGZvcm1hdC4gV2hlcmUgY3J5cHRvZ3JhcGhpYyBrZXkgc2lnbmluZworICAgZm9ybXMgcGFydCBvZiB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBleGVjdXRhYmxlIHRoZSBpbmZvcm1hdGlvbgorICAgaW5jbHVkaW5nIGtleXMgbmVlZGVkIHRvIGdlbmVyYXRlIGFuIGVxdWl2YWxlbnRseSBmdW5jdGlvbmFsIGV4ZWN1dGFibGUKKyAgIGFyZSBkZWVtZWQgdG8gYmUgcGFydCBvZiB0aGUgc291cmNlIGNvZGUuCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4JCS8qIHRvIGdldCBkaXNrIGNhcGFjaXR5ICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJxbG9naWNmYXM0MDguaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgcWxjZmc1ID0gKFhUQUxGUkVRIDw8IDUpOwkvKiAxNTYyNS81MTIgKi8KK3N0YXRpYyBpbnQgcWxjZmc2ID0gU1lOQ1hGUlBEOworc3RhdGljIGludCBxbGNmZzcgPSBTWU5DT0ZGU1Q7CitzdGF0aWMgaW50IHFsY2ZnOCA9IChTTE9XQ0FCTEUgPDwgNykgfCAoUUxfRU5BQkxFX1BBUklUWSA8PCA0KTsKK3N0YXRpYyBpbnQgcWxjZmc5ID0gKChYVEFMRlJFUSArIDQpIC8gNSk7CitzdGF0aWMgaW50IHFsY2ZnYyA9IChGQVNUQ0xLIDw8IDMpIHwgKEZBU1RTQ1NJIDw8IDQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogbG9jYWwgZnVuY3Rpb25zICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBlcnJvciByZWNvdmVyeSAtIHJlc2V0IGV2ZXJ5dGhpbmcgKi8KKworc3RhdGljIHZvaWQgcWxfemFwKHN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqcHJpdikKK3sKKwlpbnQgeDsKKwlpbnQgcWJhc2UgPSBwcml2LT5xYmFzZTsKKwlpbnQgaW50X3R5cGUgPSBwcml2LT5pbnRfdHlwZTsKKworCXggPSBpbmIocWJhc2UgKyAweGQpOworCVJFRzA7CisJb3V0YigzLCBxYmFzZSArIDMpOwkvKiByZXNldCBTQ1NJICovCisJb3V0YigyLCBxYmFzZSArIDMpOwkvKiByZXNldCBjaGlwICovCisJaWYgKHggJiAweDgwKQorCQlSRUcxOworfQorCisvKgorICoJRG8gYSBwc2V1ZG8tZG1hIHRyYW5mZXIKKyAqLworIAorc3RhdGljIGludCBxbF9wZG1hKHN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqcHJpdiwgaW50IHBoYXNlLCBjaGFyICpyZXF1ZXN0LCBpbnQgcmVxbGVuKQoreworCWludCBqOworCWludCBxYmFzZSA9IHByaXYtPnFiYXNlOworCWogPSAwOworCWlmIChwaGFzZSAmIDEpIHsJLyogaW4gKi8KKyNpZiBRTF9UVVJCT19QRE1BCisJCXJ0cmMoNCkKKwkJLyogZW1wdHkgZmlmbyBpbiBsYXJnZSBjaHVua3MgKi8KKwkJaWYgKHJlcWxlbiA+PSAxMjggJiYgKGluYihxYmFzZSArIDgpICYgMikpIHsJLyogZnVsbCAqLworCQkJaW5zbChxYmFzZSArIDQsIHJlcXVlc3QsIDMyKTsKKwkJCXJlcWxlbiAtPSAxMjg7CisJCQlyZXF1ZXN0ICs9IDEyODsKKwkJfQorCQl3aGlsZSAocmVxbGVuID49IDg0ICYmICEoaiAmIDB4YzApKQkvKiAyLzMgKi8KKwkJCWlmICgoaiA9IGluYihxYmFzZSArIDgpKSAmIDQpIAorCQkJeworCQkJCWluc2wocWJhc2UgKyA0LCByZXF1ZXN0LCAyMSk7CisJCQkJcmVxbGVuIC09IDg0OworCQkJCXJlcXVlc3QgKz0gODQ7CisJCQl9CisJCWlmIChyZXFsZW4gPj0gNDQgJiYgKGluYihxYmFzZSArIDgpICYgOCkpIHsJLyogMS8zICovCisJCQlpbnNsKHFiYXNlICsgNCwgcmVxdWVzdCwgMTEpOworCQkJcmVxbGVuIC09IDQ0OworCQkJcmVxdWVzdCArPSA0NDsKKwkJfQorI2VuZGlmCisJCS8qIHVudGlsIGJvdGggZW1wdHkgYW5kIGludCAob3IgdW50aWwgcmVjbGVuIGlzIDApICovCisJCXJ0cmMoNykKKwkJaiA9IDA7CisJCXdoaWxlIChyZXFsZW4gJiYgISgoaiAmIDB4MTApICYmIChqICYgMHhjMCkpKSAKKwkJeworCQkJLyogd2hpbGUgYnl0ZXMgdG8gcmVjZWl2ZSBhbmQgbm90IGVtcHR5ICovCisJCQlqICY9IDB4YzA7CisJCQl3aGlsZSAocmVxbGVuICYmICEoKGogPSBpbmIocWJhc2UgKyA4KSkgJiAweDEwKSkgCisJCQl7CisJCQkJKnJlcXVlc3QrKyA9IGluYihxYmFzZSArIDQpOworCQkJCXJlcWxlbi0tOworCQkJfQorCQkJaWYgKGogJiAweDEwKQorCQkJCWogPSBpbmIocWJhc2UgKyA4KTsKKworCQl9CisJfSBlbHNlIHsJCS8qIG91dCAqLworI2lmIFFMX1RVUkJPX1BETUEKKwkJcnRyYyg0KQorCQkgICAgaWYgKHJlcWxlbiA+PSAxMjggJiYgaW5iKHFiYXNlICsgOCkgJiAweDEwKSB7CS8qIGVtcHR5ICovCisJCQlvdXRzbChxYmFzZSArIDQsIHJlcXVlc3QsIDMyKTsKKwkJCXJlcWxlbiAtPSAxMjg7CisJCQlyZXF1ZXN0ICs9IDEyODsKKwkJfQorCQl3aGlsZSAocmVxbGVuID49IDg0ICYmICEoaiAmIDB4YzApKQkvKiAxLzMgKi8KKwkJCWlmICghKChqID0gaW5iKHFiYXNlICsgOCkpICYgOCkpIHsKKwkJCQlvdXRzbChxYmFzZSArIDQsIHJlcXVlc3QsIDIxKTsKKwkJCQlyZXFsZW4gLT0gODQ7CisJCQkJcmVxdWVzdCArPSA4NDsKKwkJCX0KKwkJaWYgKHJlcWxlbiA+PSA0MCAmJiAhKGluYihxYmFzZSArIDgpICYgNCkpIHsJLyogMi8zICovCisJCQlvdXRzbChxYmFzZSArIDQsIHJlcXVlc3QsIDEwKTsKKwkJCXJlcWxlbiAtPSA0MDsKKwkJCXJlcXVlc3QgKz0gNDA7CisJCX0KKyNlbmRpZgorCQkvKiB1bnRpbCBmdWxsIGFuZCBpbnQgKG9yIHVudGlsIHJlY2xlbiBpcyAwKSAqLworCQlydHJjKDcpCisJCSAgICBqID0gMDsKKwkJd2hpbGUgKHJlcWxlbiAmJiAhKChqICYgMikgJiYgKGogJiAweGMwKSkpIHsKKwkJCS8qIHdoaWxlIGJ5dGVzIHRvIHNlbmQgYW5kIG5vdCBmdWxsICovCisJCQl3aGlsZSAocmVxbGVuICYmICEoKGogPSBpbmIocWJhc2UgKyA4KSkgJiAyKSkgCisJCQl7CisJCQkJb3V0YigqcmVxdWVzdCsrLCBxYmFzZSArIDQpOworCQkJCXJlcWxlbi0tOworCQkJfQorCQkJaWYgKGogJiAyKQorCQkJCWogPSBpbmIocWJhc2UgKyA4KTsKKwkJfQorCX0KKwkvKiBtYXliZSByZXR1cm4gcmVxbGVuICovCisJcmV0dXJuIGluYihxYmFzZSArIDgpICYgMHhjMDsKK30KKworLyoKKyAqCVdhaXQgZm9yIGludGVycnVwdCBmbGFnIChwb2xsZWQgLSBub3QgcmVhbCBoYXJkd2FyZSBpbnRlcnJ1cHQpIAorICovCisKK3N0YXRpYyBpbnQgcWxfd2FpKHN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqcHJpdikKK3sKKwlpbnQgazsKKwlpbnQgcWJhc2UgPSBwcml2LT5xYmFzZTsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlrID0gMDsKKwlpID0gamlmZmllcyArIFdBVENIRE9HOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBpKSAmJiAhcHJpdi0+cWFib3J0ICYmCisJCQkJCSEoKGsgPSBpbmIocWJhc2UgKyA0KSkgJiAweGUwKSkgeworCQliYXJyaWVyKCk7CisJCWNwdV9yZWxheCgpOworCX0KKwlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBpKSkKKwkJcmV0dXJuIChESURfVElNRV9PVVQpOworCWlmIChwcml2LT5xYWJvcnQpCisJCXJldHVybiAocHJpdi0+cWFib3J0ID09IDEgPyBESURfQUJPUlQgOiBESURfUkVTRVQpOworCWlmIChrICYgMHg2MCkKKwkJcWxfemFwKHByaXYpOworCWlmIChrICYgMHgyMCkKKwkJcmV0dXJuIChESURfUEFSSVRZKTsKKwlpZiAoayAmIDB4NDApCisJCXJldHVybiAoRElEX0VSUk9SKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUluaXRpYXRlIHNjc2kgY29tbWFuZCAtIHF1ZXVlaW5nIGhhbmRsZXIgCisgKgljYWxsZXIgbXVzdCBob2xkIGhvc3QgbG9jaworICovCisKK3N0YXRpYyB2b2lkIHFsX2ljbWQoU2NzaV9DbW5kICogY21kKQoreworCXN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqcHJpdiA9IGdldF9wcml2X2J5X2NtZChjbWQpOworCWludCAJcWJhc2UgPSBwcml2LT5xYmFzZTsKKwlpbnQJaW50X3R5cGUgPSBwcml2LT5pbnRfdHlwZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXByaXYtPnFhYm9ydCA9IDA7CisKKwlSRUcwOworCS8qIGNsZWFyaW5nIG9mIGludGVycnVwdHMgYW5kIHRoZSBmaWZvIGlzIG5lZWRlZCAqLworCisJaW5iKHFiYXNlICsgNSk7CQkvKiBjbGVhciBpbnRlcnJ1cHRzICovCisJaWYgKGluYihxYmFzZSArIDUpKQkvKiBpZiBzdGlsbCBpbnRlcnJ1cHRpbmcgKi8KKwkJb3V0YigyLCBxYmFzZSArIDMpOwkvKiByZXNldCBjaGlwICovCisJZWxzZSBpZiAoaW5iKHFiYXNlICsgNykgJiAweDFmKQorCQlvdXRiKDEsIHFiYXNlICsgMyk7CS8qIGNsZWFyIGZpZm8gKi8KKwl3aGlsZSAoaW5iKHFiYXNlICsgNSkpOwkvKiBjbGVhciBpbnRzICovCisJUkVHMTsKKwlvdXRiKDEsIHFiYXNlICsgOCk7CS8qIHNldCBmb3IgUElPIHBzZXVkbyBETUEgKi8KKwlvdXRiKDAsIHFiYXNlICsgMHhiKTsJLyogZGlzYWJsZSBpbnRzICovCisJaW5iKHFiYXNlICsgOCk7CQkvKiBjbGVhciBpbnQgYml0cyAqLworCVJFRzA7CisJb3V0YigweDQwLCBxYmFzZSArIDB4Yik7CS8qIGVuYWJsZSBmZWF0dXJlcyAqLworCisJLyogY29uZmlndXJhYmxlcyAqLworCW91dGIocWxjZmdjLCBxYmFzZSArIDB4Yyk7CisJLyogY29uZmlnOiBubyByZXNldCBpbnRlcnJ1cHQsIChpbml0aWF0b3IpIGJ1cyBpZCAqLworCW91dGIoMHg0MCB8IHFsY2ZnOCB8IHByaXYtPnFpbml0aWQsIHFiYXNlICsgOCk7CisJb3V0YihxbGNmZzcsIHFiYXNlICsgNyk7CisJb3V0YihxbGNmZzYsIHFiYXNlICsgNik7CisJIC8qKi8gb3V0YihxbGNmZzUsIHFiYXNlICsgNSk7CS8qIHNlbGVjdCB0aW1lciAqLworCW91dGIocWxjZmc5ICYgNywgcWJhc2UgKyA5KTsJLyogcHJlc2NhbGVyICovCisvKglvdXRiKDB4OTksIHFiYXNlICsgNSk7CSovCisJb3V0YihjbWQtPmRldmljZS0+aWQsIHFiYXNlICsgNCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY21kLT5jbWRfbGVuOyBpKyspCisJCW91dGIoY21kLT5jbW5kW2ldLCBxYmFzZSArIDIpOworCisJcHJpdi0+cWxjbWQgPSBjbWQ7CisJb3V0YigweDQxLCBxYmFzZSArIDMpOwkvKiBzZWxlY3QgYW5kIHNlbmQgY29tbWFuZCAqLworfQorCisvKgorICoJUHJvY2VzcyBzY3NpIGNvbW1hbmQgLSB1c3VhbGx5IGFmdGVyIGludGVycnVwdCAKKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IHFsX3BjbWQoU2NzaV9DbW5kICogY21kKQoreworCXVuc2lnbmVkIGludCBpLCBqOworCXVuc2lnbmVkIGxvbmcgazsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OwkvKiB1bHRpbWF0ZSByZXR1cm4gcmVzdWx0ICovCisJdW5zaWduZWQgaW50IHN0YXR1czsJLyogc2NzaSByZXR1cm5lZCBzdGF0dXMgKi8KKwl1bnNpZ25lZCBpbnQgbWVzc2FnZTsJLyogc2NzaSByZXR1cm5lZCBtZXNzYWdlICovCisJdW5zaWduZWQgaW50IHBoYXNlOwkvKiByZWNvcmRlZCBzY3NpIHBoYXNlICovCisJdW5zaWduZWQgaW50IHJlcWxlbjsJLyogdG90YWwgbGVuZ3RoIG9mIHRyYW5zZmVyICovCisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3Q7CS8qIHNjYXR0ZXItZ2F0aGVyIGxpc3QgcG9pbnRlciAqLworCXVuc2lnbmVkIGludCBzZ2NvdW50OwkvKiBzZyBjb3VudGVyICovCisJY2hhciAqYnVmOworCXN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqcHJpdiA9IGdldF9wcml2X2J5X2NtZChjbWQpOworCWludCBxYmFzZSA9IHByaXYtPnFiYXNlOworCWludCBpbnRfdHlwZSA9IHByaXYtPmludF90eXBlOworCisJcnRyYygxKQorCWogPSBpbmIocWJhc2UgKyA2KTsKKwlpID0gaW5iKHFiYXNlICsgNSk7CisJaWYgKGkgPT0gMHgyMCkgeworCQlyZXR1cm4gKERJRF9OT19DT05ORUNUIDw8IDE2KTsKKwl9CisJaSB8PSBpbmIocWJhc2UgKyA1KTsJLyogdGhlIDB4MTAgYml0IGNhbiBiZSBzZXQgYWZ0ZXIgdGhlIDB4MDggKi8KKwlpZiAoaSAhPSAweDE4KSB7CisJCXByaW50ayhLRVJOX0VSUiAiUWw6QmFkIEludGVycnVwdCBzdGF0dXM6JTAyeFxuIiwgaSk7CisJCXFsX3phcChwcml2KTsKKwkJcmV0dXJuIChESURfQkFEX0lOVFIgPDwgMTYpOworCX0KKwlqICY9IDc7CQkJLyogaiA9IGluYiggcWJhc2UgKyA3ICkgPj4gNTsgKi8KKworCS8qIGNvcnJlY3Qgc3RhdHVzIGlzIHN1cHBvc2VkIHRvIGJlIHN0ZXAgNCAqLworCS8qIGl0IHNvbWV0aW1lcyByZXR1cm5zIHN0ZXAgMyBidXQgd2l0aCAwIGJ5dGVzIGxlZnQgdG8gc2VuZCAqLworCS8qIFdlIGNhbiB0cnkgc3R1ZmZpbmcgdGhlIEZJRk8gd2l0aCB0aGUgbWF4IGVhY2ggdGltZSwgYnV0IHdlIHdpbGwgZ2V0IGEKKwkgICBzZXF1ZW5jZSBvZiAzIGlmIGFueSBieXRlcyBhcmUgbGVmdCAoYnV0IHdlIGRvIGZsdXNoIHRoZSBGSUZPIGFueXdheSAqLworCisJaWYgKGogIT0gMyAmJiBqICE9IDQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJRbDpCYWQgc2VxdWVuY2UgZm9yIGNvbW1hbmQgJWQsIGludCAlMDJYLCBjbWRsZWZ0ID0gJWRcbiIsCisJCSAgICAgaiwgaSwgaW5iKHFiYXNlICsgNykgJiAweDFmKTsKKwkJcWxfemFwKHByaXYpOworCQlyZXR1cm4gKERJRF9FUlJPUiA8PCAxNik7CisJfQorCXJlc3VsdCA9IERJRF9PSzsKKwlpZiAoaW5iKHFiYXNlICsgNykgJiAweDFmKQkvKiBpZiBzb21lIGJ5dGVzIGluIGZpZm8gKi8KKwkJb3V0YigxLCBxYmFzZSArIDMpOwkvKiBjbGVhciBmaWZvICovCisJLyogbm90ZSB0aGF0IHJlcXVlc3RfYnVmZmxlbiBpcyB0aGUgdG90YWwgeGZlciBzaXplIHdoZW4gc2cgaXMgdXNlZCAqLworCXJlcWxlbiA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCS8qIG5vdGUgdGhhdCBpdCB3b24ndCB3b3JrIGlmIHRyYW5zZmVycyA+IDE2TSBhcmUgcmVxdWVzdGVkICovCisJaWYgKHJlcWxlbiAmJiAhKChwaGFzZSA9IGluYihxYmFzZSArIDQpKSAmIDYpKSB7CS8qIGRhdGEgcGhhc2UgKi8KKwkJcnRyYygyKQorCQlvdXRiKHJlcWxlbiwgcWJhc2UpOwkvKiBsb3ctbWlkIHhmZXIgY250ICovCisJCW91dGIocmVxbGVuID4+IDgsIHFiYXNlICsgMSk7CS8qIGxvdy1taWQgeGZlciBjbnQgKi8KKwkJb3V0YihyZXFsZW4gPj4gMTYsIHFiYXNlICsgMHhlKTsJLyogaGlnaCB4ZmVyIGNudCAqLworCQlvdXRiKDB4OTAsIHFiYXNlICsgMyk7CS8qIGNvbW1hbmQgZG8geGZlciAqLworCQkvKiBQSU8gcHNldWRvIERNQSB0byBidWZmZXIgb3Igc2dsaXN0ICovCisJCVJFRzE7CisJCWlmICghY21kLT51c2Vfc2cpCisJCQlxbF9wZG1hKHByaXYsIHBoYXNlLCBjbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCWNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwkJZWxzZSB7CisJCQlzZ2NvdW50ID0gY21kLT51c2Vfc2c7CisJCQlzZ2xpc3QgPSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCQkJd2hpbGUgKHNnY291bnQtLSkgeworCQkJCWlmIChwcml2LT5xYWJvcnQpIHsKKwkJCQkJUkVHMDsKKwkJCQkJcmV0dXJuICgocHJpdi0+cWFib3J0ID09IDEgPworCQkJCQkJRElEX0FCT1JUIDogRElEX1JFU0VUKSA8PCAxNik7CisJCQkJfQorCQkJCWJ1ZiA9IHBhZ2VfYWRkcmVzcyhzZ2xpc3QtPnBhZ2UpICsgc2dsaXN0LT5vZmZzZXQ7CisJCQkJaWYgKHFsX3BkbWEocHJpdiwgcGhhc2UsIGJ1Ziwgc2dsaXN0LT5sZW5ndGgpKQorCQkJCQlicmVhazsKKwkJCQlzZ2xpc3QrKzsKKwkJCX0KKwkJfQorCQlSRUcwOworCQlydHJjKDIpCisJCS8qCisJCSAqCVdhaXQgZm9yIGlycSAoc3BsaXQgaW50byBzZWNvbmQgc3RhdGUgb2YgaXJxIGhhbmRsZXIKKwkJICoJaWYgdGhpcyBjYW4gdGFrZSB0aW1lKSAKKwkJICovCisJCWlmICgoayA9IHFsX3dhaShwcml2KSkpCisJCQlyZXR1cm4gKGsgPDwgMTYpOworCQlrID0gaW5iKHFiYXNlICsgNSk7CS8qIHNob3VsZCBiZSAweDEwLCBidXMgc2VydmljZSAqLworCX0KKworCS8qCisJICoJRW50ZXIgU3RhdHVzIChhbmQgTWVzc2FnZSBJbikgUGhhc2UgCisJICovCisJIAorCWsgPSBqaWZmaWVzICsgV0FUQ0hET0c7CisKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgaykgJiYgIXByaXYtPnFhYm9ydCAmJgorCQkJCQkJIShpbmIocWJhc2UgKyA0KSAmIDYpKQorCQljcHVfcmVsYXgoKTsJLyogd2FpdCBmb3Igc3RhdHVzIHBoYXNlICovCisKKwlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBrKSkgeworCQlxbF96YXAocHJpdik7CisJCXJldHVybiAoRElEX1RJTUVfT1VUIDw8IDE2KTsKKwl9CisKKwkvKiBGSVhNRTogdGltZW91dCA/PyAqLworCXdoaWxlIChpbmIocWJhc2UgKyA1KSkKKwkJY3B1X3JlbGF4KCk7CS8qIGNsZWFyIHBlbmRpbmcgaW50cyAqLworCisJaWYgKHByaXYtPnFhYm9ydCkKKwkJcmV0dXJuICgocHJpdi0+cWFib3J0ID09IDEgPyBESURfQUJPUlQgOiBESURfUkVTRVQpIDw8IDE2KTsKKworCW91dGIoMHgxMSwgcWJhc2UgKyAzKTsJLyogZ2V0IHN0YXR1cyBhbmQgbWVzc2FnZSAqLworCWlmICgoayA9IHFsX3dhaShwcml2KSkpCisJCXJldHVybiAoayA8PCAxNik7CisJaSA9IGluYihxYmFzZSArIDUpOwkvKiBnZXQgY2hpcCBpcnEgc3RhdCAqLworCWogPSBpbmIocWJhc2UgKyA3KSAmIDB4MWY7CS8qIGFuZCBieXRlcyByZWMnZCAqLworCXN0YXR1cyA9IGluYihxYmFzZSArIDIpOworCW1lc3NhZ2UgPSBpbmIocWJhc2UgKyAyKTsKKworCS8qCisJICoJU2hvdWxkIGdldCBmdW5jdGlvbiBjb21wbGV0ZSBpbnQgaWYgU3RhdHVzIGFuZCBtZXNzYWdlLCBlbHNlIAorCSAqCWJ1cyBzZXJ2IGlmIG9ubHkgc3RhdHVzIAorCSAqLworCWlmICghKChpID09IDggJiYgaiA9PSAyKSB8fCAoaSA9PSAweDEwICYmIGogPT0gMSkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUWw6RXJyb3IgZHVyaW5nIHN0YXR1cyBwaGFzZSwgaW50PSUwMlgsICVkIGJ5dGVzIHJlY2RcbiIsIGksIGopOworCQlyZXN1bHQgPSBESURfRVJST1I7CisJfQorCW91dGIoMHgxMiwgcWJhc2UgKyAzKTsJLyogZG9uZSwgZGlzY29ubmVjdCAqLworCXJ0cmMoMSkKKwlpZiAoKGsgPSBxbF93YWkocHJpdikpKQorCQlyZXR1cm4gKGsgPDwgMTYpOworCisJLyoKKwkgKglTaG91bGQgZ2V0IGJ1cyBzZXJ2aWNlIGludGVycnVwdCBhbmQgZGlzY29ubmVjdCBpbnRlcnJ1cHQgCisJICovCisJIAorCWkgPSBpbmIocWJhc2UgKyA1KTsJLyogc2hvdWxkIGJlIGJ1cyBzZXJ2aWNlICovCisJd2hpbGUgKCFwcml2LT5xYWJvcnQgJiYgKChpICYgMHgyMCkgIT0gMHgyMCkpIHsKKwkJYmFycmllcigpOworCQljcHVfcmVsYXgoKTsKKwkJaSB8PSBpbmIocWJhc2UgKyA1KTsKKwl9CisJcnRyYygwKQorCisJaWYgKHByaXYtPnFhYm9ydCkKKwkJcmV0dXJuICgocHJpdi0+cWFib3J0ID09IDEgPyBESURfQUJPUlQgOiBESURfUkVTRVQpIDw8IDE2KTsKKwkJCisJcmV0dXJuIChyZXN1bHQgPDwgMTYpIHwgKG1lc3NhZ2UgPDwgOCkgfCAoc3RhdHVzICYgU1RBVFVTX01BU0spOworfQorCisvKgorICoJSW50ZXJydXB0IGhhbmRsZXIgCisgKi8KKworc3RhdGljIHZvaWQgcWxfaWhhbmRsKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJU2NzaV9DbW5kICppY21kOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSAoc3RydWN0IFNjc2lfSG9zdCAqKWRldl9pZDsKKwlzdHJ1Y3QgcWxvZ2ljZmFzNDA4X3ByaXYgKnByaXYgPSBnZXRfcHJpdl9ieV9ob3N0KGhvc3QpOworCWludCBxYmFzZSA9IHByaXYtPnFiYXNlOworCVJFRzA7CisKKwlpZiAoIShpbmIocWJhc2UgKyA0KSAmIDB4ODApKQkvKiBmYWxzZSBhbGFybT8gKi8KKwkJcmV0dXJuOworCisJaWYgKHByaXYtPnFsY21kID09IE5VTEwpIHsJLyogbm8gY29tbWFuZCB0byBwcm9jZXNzPyAqLworCQlpbnQgaTsKKwkJaSA9IDE2OworCQl3aGlsZSAoaS0tICYmIGluYihxYmFzZSArIDUpKTsJLyogbWF5YmUgYWxzbyBxbF96YXAoKSAqLworCQlyZXR1cm47CisJfQorCWljbWQgPSBwcml2LT5xbGNtZDsKKwlpY21kLT5yZXN1bHQgPSBxbF9wY21kKGljbWQpOworCXByaXYtPnFsY21kID0gTlVMTDsKKwkvKgorCSAqCUlmIHJlc3VsdCBpcyBDSEVDSyBDT05ESVRJT04gZG9uZSBjYWxscyBxY29tbWFuZCB0byByZXF1ZXN0IAorCSAqCXNlbnNlIAorCSAqLworCShpY21kLT5zY3NpX2RvbmUpIChpY21kKTsKK30KKworaXJxcmV0dXJuX3QgcWxvZ2ljZmFzNDA4X2loYW5kbChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGRldl9pZDsKKworCXNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXFsX2loYW5kbChpcnEsIGRldl9pZCwgcmVncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKglRdWV1ZWQgY29tbWFuZAorICovCisKK2ludCBxbG9naWNmYXM0MDhfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqIGNtZCwgdm9pZCAoKmRvbmUpIChTY3NpX0NtbmQgKikpCit7CisJc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICpwcml2ID0gZ2V0X3ByaXZfYnlfY21kKGNtZCk7CisJaWYgKGNtZC0+ZGV2aWNlLT5pZCA9PSBwcml2LT5xaW5pdGlkKSB7CisJCWNtZC0+cmVzdWx0ID0gRElEX0JBRF9UQVJHRVQgPDwgMTY7CisJCWRvbmUoY21kKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY21kLT5zY3NpX2RvbmUgPSBkb25lOworCS8qIHdhaXQgZm9yIHRoZSBsYXN0IGNvbW1hbmQncyBpbnRlcnJ1cHQgdG8gZmluaXNoICovCisJd2hpbGUgKHByaXYtPnFsY21kICE9IE5VTEwpIHsKKwkJYmFycmllcigpOworCQljcHVfcmVsYXgoKTsKKwl9CisJcWxfaWNtZChjbWQpOworCXJldHVybiAwOworfQorCisvKiAKKyAqCVJldHVybiBiaW9zIHBhcmFtZXRlcnMgCisgKi8KKworaW50IHFsb2dpY2ZhczQwOF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICogZGlzaywKKwkJICAgICAgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsCisJCQlzZWN0b3JfdCBjYXBhY2l0eSwgaW50IGlwW10pCit7CisvKiBUaGlzIHNob3VsZCBtaW1pYyB0aGUgRE9TIFFsb2dpYyBkcml2ZXIncyBiZWhhdmlvciBleGFjdGx5ICovCisJaXBbMF0gPSAweDQwOworCWlwWzFdID0gMHgyMDsKKwlpcFsyXSA9ICh1bnNpZ25lZCBsb25nKSBjYXBhY2l0eSAvIChpcFswXSAqIGlwWzFdKTsKKwlpZiAoaXBbMl0gPiAxMDI0KSB7CisJCWlwWzBdID0gMHhmZjsKKwkJaXBbMV0gPSAweDNmOworCQlpcFsyXSA9ICh1bnNpZ25lZCBsb25nKSBjYXBhY2l0eSAvIChpcFswXSAqIGlwWzFdKTsKKyNpZiAwCisJCWlmIChpcFsyXSA+IDEwMjMpCisJCQlpcFsyXSA9IDEwMjM7CisjZW5kaWYKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglBYm9ydCBhIGNvbW1hbmQgaW4gcHJvZ3Jlc3MKKyAqLworIAoraW50IHFsb2dpY2ZhczQwOF9hYm9ydChTY3NpX0NtbmQgKiBjbWQpCit7CisJc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICpwcml2ID0gZ2V0X3ByaXZfYnlfY21kKGNtZCk7CisJcHJpdi0+cWFib3J0ID0gMTsKKwlxbF96YXAocHJpdik7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qIAorICoJUmVzZXQgU0NTSSBidXMKKyAqCUZJWE1FOiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCBjbWQgPSBOVUxMIGRpcmVjdGx5IGJ5CisgKgl0aGUgUENNQ0lBIHFsb2dpY19zdHViIGNvZGUuIFRoaXMgd2FudHMgZml4aW5nCisgKi8KKworaW50IHFsb2dpY2ZhczQwOF9idXNfcmVzZXQoU2NzaV9DbW5kICogY21kKQoreworCXN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqcHJpdiA9IGdldF9wcml2X2J5X2NtZChjbWQpOworCXByaXYtPnFhYm9ydCA9IDI7CisJcWxfemFwKHByaXYpOworCXJldHVybiBTVUNDRVNTOworfQorCisvKiAKKyAqCVJlc2V0IFNDU0kgaG9zdCBjb250cm9sbGVyCisgKi8KKworaW50IHFsb2dpY2ZhczQwOF9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqIGNtZCkKK3sKKwlyZXR1cm4gRkFJTEVEOworfQorCisvKiAKKyAqCVJlc2V0IFNDU0kgZGV2aWNlCisgKi8KKworaW50IHFsb2dpY2ZhczQwOF9kZXZpY2VfcmVzZXQoU2NzaV9DbW5kICogY21kKQoreworCXJldHVybiBGQUlMRUQ7Cit9CisKKy8qCisgKglSZXR1cm4gaW5mbyBzdHJpbmcKKyAqLworCitjb25zdCBjaGFyICpxbG9naWNmYXM0MDhfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqcHJpdiA9IGdldF9wcml2X2J5X2hvc3QoaG9zdCk7CisJcmV0dXJuIHByaXYtPnFpbmZvOworfQorCisvKgorICoJR2V0IHR5cGUgb2YgY2hpcAorICovCisKK2ludCBxbG9naWNmYXM0MDhfZ2V0X2NoaXBfdHlwZShpbnQgcWJhc2UsIGludCBpbnRfdHlwZSkKK3sKKwlSRUcxOworCXJldHVybiBpbmIocWJhc2UgKyAweGUpICYgMHhmODsKK30KKworLyoKKyAqCVBlcmZvcm0gaW5pdGlhbGl6YXRpb24gdGFza3MKKyAqLworCit2b2lkIHFsb2dpY2ZhczQwOF9zZXR1cChpbnQgcWJhc2UsIGludCBpZCwgaW50IGludF90eXBlKQoreworCW91dGIoMSwgcWJhc2UgKyA4KTsJLyogc2V0IGZvciBQSU8gcHNldWRvIERNQSAqLworCVJFRzA7CisJb3V0YigweDQwIHwgcWxjZmc4IHwgaWQsIHFiYXNlICsgOCk7CS8qIChpbmkpIGJ1cyBpZCwgZGlzYWJsZSBzY3NpIHJzdCAqLworCW91dGIocWxjZmc1LCBxYmFzZSArIDUpOwkvKiBzZWxlY3QgdGltZXIgKi8KKwlvdXRiKHFsY2ZnOSwgcWJhc2UgKyA5KTsJLyogcHJlc2NhbGVyICovCisKKyNpZiBRTF9SRVNFVF9BVF9TVEFSVAorCW91dGIoMywgcWJhc2UgKyAzKTsKKworCVJFRzE7CisJLyogRklYTUU6IHRpbWVvdXQgKi8KKwl3aGlsZSAoaW5iKHFiYXNlICsgMHhmKSAmIDQpCisJCWNwdV9yZWxheCgpOworCisJUkVHMDsKKyNlbmRpZgorfQorCisvKgorICoJQ2hlY2tzIGlmIHRoaXMgaXMgYSBRTG9naWMgRkFTIDQwOAorICovCisKK2ludCBxbG9naWNmYXM0MDhfZGV0ZWN0KGludCBxYmFzZSwgaW50IGludF90eXBlKQoreworICAgICAgICBSRUcxOworCXJldHVybiAoKChpbmIocWJhc2UgKyAweGUpIF4gaW5iKHFiYXNlICsgMHhlKSkgPT0gNykgJiYKKwkgICAgICAgKChpbmIocWJhc2UgKyAweGUpIF4gaW5iKHFiYXNlICsgMHhlKSkgPT0gNykpOwkJCit9CisKKy8qCisgKglEaXNhYmxlIGludGVycnVwdHMKKyAqLworCit2b2lkIHFsb2dpY2ZhczQwOF9kaXNhYmxlX2ludHMoc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICpwcml2KQoreworCWludCBxYmFzZSA9IHByaXYtPnFiYXNlOworCWludCBpbnRfdHlwZSA9IHByaXYtPmludF90eXBlOworCisJUkVHMTsKKwlvdXRiKDAsIHFiYXNlICsgMHhiKTsJLyogZGlzYWJsZSBpbnRzICovCit9CisKKy8qCisgKglJbml0IGFuZCBleGl0IGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgX19pbml0IHFsb2dpY2ZhczQwOF9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBxbG9naWNmYXM0MDhfZXhpdCh2b2lkKQoreworCit9CisKK01PRFVMRV9BVVRIT1IoIlRvbSBaZXJ1Y2hhLCBNaWNoYWVsIEdyaWZmaXRoIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgdGhlIFFsb2dpYyBGQVMgU0NTSSBjb250cm9sbGVycyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX2luaXQocWxvZ2ljZmFzNDA4X2luaXQpOworbW9kdWxlX2V4aXQocWxvZ2ljZmFzNDA4X2V4aXQpOworCitFWFBPUlRfU1lNQk9MKHFsb2dpY2ZhczQwOF9pbmZvKTsKK0VYUE9SVF9TWU1CT0wocWxvZ2ljZmFzNDA4X3F1ZXVlY29tbWFuZCk7CitFWFBPUlRfU1lNQk9MKHFsb2dpY2ZhczQwOF9hYm9ydCk7CitFWFBPUlRfU1lNQk9MKHFsb2dpY2ZhczQwOF9idXNfcmVzZXQpOworRVhQT1JUX1NZTUJPTChxbG9naWNmYXM0MDhfZGV2aWNlX3Jlc2V0KTsKK0VYUE9SVF9TWU1CT0wocWxvZ2ljZmFzNDA4X2hvc3RfcmVzZXQpOworRVhQT1JUX1NZTUJPTChxbG9naWNmYXM0MDhfYmlvc3BhcmFtKTsKK0VYUE9SVF9TWU1CT0wocWxvZ2ljZmFzNDA4X2loYW5kbCk7CitFWFBPUlRfU1lNQk9MKHFsb2dpY2ZhczQwOF9nZXRfY2hpcF90eXBlKTsKK0VYUE9SVF9TWU1CT0wocWxvZ2ljZmFzNDA4X3NldHVwKTsKK0VYUE9SVF9TWU1CT0wocWxvZ2ljZmFzNDA4X2RldGVjdCk7CitFWFBPUlRfU1lNQk9MKHFsb2dpY2ZhczQwOF9kaXNhYmxlX2ludHMpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxvZ2ljZmFzNDA4LmggYi9kcml2ZXJzL3Njc2kvcWxvZ2ljZmFzNDA4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAxY2JkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbG9naWNmYXM0MDguaApAQCAtMCwwICsxLDEyMCBAQAorLyogdG8gYmUgdXNlZCBieSBxbG9naWNmYXMgYW5kIHFsb2dpY19jcyAqLworI2lmbmRlZiBfX1FMT0dJQ0ZBUzQwOF9ICisjZGVmaW5lIF9fUUxPR0lDRkFTNDA4X0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvbmZpZ3VyYXRpb24gKi8KKworLyogU2V0IHRoZSBmb2xsb3dpbmcgdG8gbWF4IG91dCB0aGUgc3BlZWQgb2YgdGhlIFBJTyBQc2V1ZG9ETUEgdHJhbnNmZXJzLAorICAgYWdhaW4sIDAgdGVuZHMgdG8gYmUgc2xvd2VyLCBidXQgbW9yZSBzdGFibGUuICAqLworCisjZGVmaW5lIFFMX1RVUkJPX1BETUEgMQorCisvKiBUaGlzIHNob3VsZCBiZSAxIHRvIGVuYWJsZSBwYXJpdHkgZGV0ZWN0aW9uICovCisKKyNkZWZpbmUgUUxfRU5BQkxFX1BBUklUWSAxCisKKy8qIFRoaXMgd2lsbCByZXNldCBhbGwgZGV2aWNlcyB3aGVuIHRoZSBkcml2ZXIgaXMgaW5pdGlhbGl6ZWQgKGR1cmluZyBib290dXApLgorICAgVGhlIG90aGVyIGxpbnV4IGRyaXZlcnMgZG9uJ3QgZG8gdGhpcywgYnV0IHRoZSBET1MgZHJpdmVycyBkbywgYW5kIGFmdGVyCisgICB1c2luZyBET1Mgb3Igc29tZSBraW5kIG9mIGNyYXNoIG9yIGxvY2t1cCB0aGlzIHdpbGwgYnJpbmcgdGhpbmdzIGJhY2sKKyAgIHdpdGhvdXQgcmVxdWlyaW5nIGEgY29sZCBib290LiAgSXQgZG9lcyB0YWtlIHNvbWUgdGltZSB0byByZWNvdmVyIGZyb20gYQorICAgcmVzZXQsIHNvIGl0IGlzIHNsb3dlciwgYW5kIEkgaGF2ZSBzZWVuIHRpbWVvdXRzIHNvIHRoYXQgZGV2aWNlcyB3ZXJlbid0CisgICByZWNvZ25pemVkIHdoZW4gdGhpcyB3YXMgc2V0LiAqLworCisjZGVmaW5lIFFMX1JFU0VUX0FUX1NUQVJUIDAKKworLyogY3J5c3RhbCBmcmVxdWVuY3kgaW4gbWVnYWhlcnR6IChmb3Igb2Zmc2V0IDUgYW5kIDkpCisgICBQbGVhc2Ugc2V0IHRoaXMgZm9yIHlvdXIgY2FyZC4gIE1vc3QgUWxvZ2ljIGNhcmRzIGFyZSA0MCBNaHouICBUaGUKKyAgIENvbnRyb2wgQ29uY2VwdHMgSVNBIChub3QgVkxCKSBpcyAyNCBNaHogKi8KKworI2RlZmluZSBYVEFMRlJFUQk0MAorCisvKioqKioqKioqKi8KKy8qIERBTkdFUiEgbW9kaWZ5IHRoZXNlIGF0IHlvdXIgb3duIHJpc2sgKi8KKy8qIFNMT1dDQUJMRSBjYW4gdXN1YWxseSBiZSByZXNldCB0byB6ZXJvIGlmIHlvdSBoYXZlIGEgY2xlYW4gc2V0dXAgYW5kCisgICBwcm9wZXIgdGVybWluYXRpb24uICBUaGUgcmVzdCBhcmUgZm9yIHN5bmNocm9ub3VzIHRyYW5zZmVycyBhbmQgb3RoZXIKKyAgIGFkdmFuY2VkIGZlYXR1cmVzIGlmIHlvdXIgZGV2aWNlIGNhbiB0cmFuc2ZlciBmYXN0ZXIgdGhhbiA1TWIvc2VjLgorICAgSWYgeW91IGFyZSByZWFsbHkgY3VyaW91cywgZW1haWwgbWUgZm9yIGEgcXVpY2sgaG93dG8gdW50aWwgSSBoYXZlCisgICBzb21ldGhpbmcgb2ZmaWNpYWwgKi8KKy8qKioqKioqKioqLworCisvKioqKiovCisvKiBjb25maWcgcmVnaXN0ZXIgMSAob2Zmc2V0IDgpIG9wdGlvbnMgKi8KKy8qIFRoaXMgbmVlZHMgdG8gYmUgc2V0IHRvIDEgaWYgeW91ciBjYWJsaW5nIGlzIGxvbmcgb3Igbm9pc3kgKi8KKyNkZWZpbmUgU0xPV0NBQkxFIDEKKworLyoqKioqLworLyogb2Zmc2V0IDB4YyAqLworLyogVGhpcyB3aWxsIHNldCBmYXN0ICgxME1oeikgc3luY2hyb25vdXMgdGltaW5nIHdoZW4gc2V0IHRvIDEKKyAgIEZvciB0aGlzIHRvIGhhdmUgYW4gZWZmZWN0LCBGQVNUQ0xLIG11c3QgYWxzbyBiZSAxICovCisjZGVmaW5lIEZBU1RTQ1NJIDAKKworLyogVGhpcyB3aGVuIHNldCB0byAxIHdpbGwgc2V0IGEgZmFzdGVyIHN5bmMgdHJhbnNmZXIgcmF0ZSAqLworI2RlZmluZSBGQVNUQ0xLIDAJLyooWFRBTEZSRVE+MjU/MTowKSovCisKKy8qKioqKi8KKy8qIG9mZnNldCA2ICovCisvKiBUaGlzIGlzIHRoZSBzeW5jIHRyYW5zZmVyIGRpdmlzb3IsIFhUQUxGUkVRL1ggd2lsbCBiZSB0aGUgbWF4aW11bQorICAgYWNoaWV2YWJsZSBkYXRhIHJhdGUgKGFzc3VtaW5nIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0gaXMgY2FwYWJsZQorICAgYW5kIHNldCBwcm9wZXJseSkgKi8KKyNkZWZpbmUgU1lOQ1hGUlBEIDUJLyooWFRBTEZSRVEvNSkqLworCisvKioqKiovCisvKiBvZmZzZXQgNyAqLworLyogVGhpcyBpcyB0aGUgY291bnQgb2YgaG93IG1hbnkgc3luY2hyb25vdXMgdHJhbnNmZXJzIGNhbiB0YWtlIHBsYWNlCisJaS5lLiBob3cgbWFueSByZXFzIGNhbiBvY2N1ciBiZWZvcmUgYW4gYWNrIGlzIGdpdmVuLgorCVRoZSBtYXhpbXVtIHZhbHVlIGZvciB0aGlzIGlzIDE1LCB0aGUgdXBwZXIgYml0cyBjYW4gbW9kaWZ5CisJUkVRL0FDSyBhc3NlcnRpb24gYW5kIGRlYXNzZXJ0aW9uIGR1cmluZyBzeW5jaHJvbm91cyB0cmFuc2ZlcnMKKwlJZiB0aGlzIGlzIDAsIHRoZSBidXMgd2lsbCBvbmx5IHRyYW5zZmVyIGFzeW5jaHJvbm91c2x5ICovCisjZGVmaW5lIFNZTkNPRkZTVCAwCisvKiBmb3IgdGhlIGN1cmlvdXMsIGJpdHMgNyY2IGNvbnRyb2wgdGhlIGRlYXNzZXJ0aW9uIGRlbGF5IGluIDEvMiBjeWNsZXMKKwlvZiB0aGUgNDBNaHogY2xvY2suIElmIEZBU1RDTEsgaXMgMSwgc3BlY2lmeWluZyAwMSAoMS8yKSB3aWxsCisJY2F1c2UgdGhlIGRlYXNzZXJ0aW9uIHRvIGJlIGVhcmx5IGJ5IDEvMiBjbG9jay4gIEJpdHMgNSY0IGNvbnRyb2wKKwl0aGUgYXNzZXJ0aW9uIGRlbGF5LCBhbHNvIGluIDEvMiBjbG9ja3MgKEZBU1RDTEsgaXMgaWdub3JlZCBoZXJlKS4gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2IHsKKwkgaW50CQlxYmFzZTsJCS8qIFBvcnQgKi8KKwkgaW50CQlxaW5pdGlkOwkvKiBpbml0aWF0b3IgSUQgKi8KKwkgaW50CQlxYWJvcnQ7CQkvKiBGbGFnIHRvIGNhdXNlIGFuIGFib3J0ICovCisJIGludAkJcWxpcnE7CQkvKiBJUlEgYmVpbmcgdXNlZCAqLworCSBpbnQJCWludF90eXBlOwkvKiB0eXBlIG9mIGlycSwgMiBmb3IgSVNBIGJvYXJkLCAwIGZvciBQQ01DSUEgKi8KKwkgY2hhcgkJcWluZm9bODBdOwkvKiBkZXNjcmlwdGlvbiAqLworCSBTY3NpX0NtbmQgCSpxbGNtZDsJCS8qIGN1cnJlbnQgY29tbWFuZCBiZWluZyBwcm9jZXNzZWQgKi8KKwkgc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CS8qIHBvaW50ZXIgYmFjayB0byBob3N0ICovCisJIHN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqbmV4dDsgLyogbmV4dCBwcml2YXRlIHN0cnVjdCAqLworfTsKKworLyogVGhlIHFsb2dpYyBjYXJkIHVzZXMgdHdvIHJlZ2lzdGVyIG1hcHMgLSBUaGVzZSBtYWNyb3Mgc2VsZWN0IHdoaWNoIG9uZSAqLworI2RlZmluZSBSRUcwICggb3V0YiggaW5iKCBxYmFzZSArIDB4ZCApICYgMHg3ZiAsIHFiYXNlICsgMHhkICksIG91dGIoIDQgLCBxYmFzZSArIDB4ZCApKQorI2RlZmluZSBSRUcxICggb3V0YiggaW5iKCBxYmFzZSArIDB4ZCApIHwgMHg4MCAsIHFiYXNlICsgMHhkICksIG91dGIoIDB4YjQgfCBpbnRfdHlwZSwgcWJhc2UgKyAweGQgKSkKKworLyogZm9sbG93aW5nIGlzIHdhdGNoZG9nIHRpbWVvdXQgaW4gbWljcm9zZWNvbmRzICovCisjZGVmaW5lIFdBVENIRE9HIDUwMDAwMDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIHRoZSBmb2xsb3dpbmcgd2lsbCBzZXQgdGhlIG1vbml0b3IgYm9yZGVyIGNvbG9yICh1c2VmdWwgdG8gZmluZAorICAgd2hlcmUgc29tZXRoaW5nIGNyYXNoZWQgb3IgZ2V0cyBzdHVjayBhdCBhbmQgYXMgYSBzaW1wbGUgcHJvZmlsZXIpICovCisKKyNkZWZpbmUgcnRyYyhpKSB7fQorCisjZGVmaW5lIGdldF9wcml2X2J5X2NtZCh4KSAoc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICopJigoeCktPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF0pCisjZGVmaW5lIGdldF9wcml2X2J5X2hvc3QoeCkgKHN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqKSYoKHgpLT5ob3N0ZGF0YVswXSkKKworaXJxcmV0dXJuX3QgcWxvZ2ljZmFzNDA4X2loYW5kbChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2ludCBxbG9naWNmYXM0MDhfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqIGNtZCwgdm9pZCAoKmRvbmUpIChTY3NpX0NtbmQgKikpOworaW50IHFsb2dpY2ZhczQwOF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICogZGlzaywKKwkJICAgICAgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsCisJCQlzZWN0b3JfdCBjYXBhY2l0eSwgaW50IGlwW10pOworaW50IHFsb2dpY2ZhczQwOF9hYm9ydChTY3NpX0NtbmQgKiBjbWQpOworaW50IHFsb2dpY2ZhczQwOF9idXNfcmVzZXQoU2NzaV9DbW5kICogY21kKTsKK2ludCBxbG9naWNmYXM0MDhfaG9zdF9yZXNldChTY3NpX0NtbmQgKiBjbWQpOworaW50IHFsb2dpY2ZhczQwOF9kZXZpY2VfcmVzZXQoU2NzaV9DbW5kICogY21kKTsKK2NvbnN0IGNoYXIgKnFsb2dpY2ZhczQwOF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpOworaW50IHFsb2dpY2ZhczQwOF9nZXRfY2hpcF90eXBlKGludCBxYmFzZSwgaW50IGludF90eXBlKTsKK3ZvaWQgcWxvZ2ljZmFzNDA4X3NldHVwKGludCBxYmFzZSwgaW50IGlkLCBpbnQgaW50X3R5cGUpOworaW50IHFsb2dpY2ZhczQwOF9kZXRlY3QoaW50IHFiYXNlLCBpbnQgaW50X3R5cGUpOwordm9pZCBxbG9naWNmYXM0MDhfZGlzYWJsZV9pbnRzKHN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqcHJpdik7CisjZW5kaWYJLyogX19RTE9HSUNGQVM0MDhfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxvZ2ljZmMuYyBiL2RyaXZlcnMvc2NzaS9xbG9naWNmYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YzExNzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljZmMuYwpAQCAtMCwwICsxLDIyMjcgQEAKKy8qCisgKiBRTG9naWMgSVNQMngwMCBTQ1NJLUZDUAorICogV3JpdHRlbiBieSBFcmlrIEguIE1vZSwgZWhtQGNyaXMuY29tCisgKiBDb3B5cmlnaHQgMTk5NSwgRXJpayBILiBNb2UKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyogUmVuYW1lZCBhbmQgdXBkYXRlZCB0byAxLjMueCBieSBNaWNoYWVsIEdyaWZmaXRoIDxncmlmQGNzLnVjci5lZHU+ICovCisKKy8qIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIHRoZSBpc3AxMDIwIGRyaXZlciB3aGljaCB3YXMgbW9kaWZpZWQgYnkKKyAqIENocmlzIExvdmVsYW5kIDxjd2xAaW9sLnVuaC5lZHU+IHRvIHN1cHBvcnQgdGhlIGlzcDIxMDAgYW5kIGlzcDIyMDAKKyAqCisgKiBCaWcgZW5kaWFuIHN1cHBvcnQgYW5kIGR5bmFtaWMgRE1BIG1hcHBpbmcgYWRkZWQKKyAqIGJ5IEpha3ViIEplbGluZWsgPGpha3ViQHJlZGhhdC5jb20+LgorICoKKyAqIENvbnZlcnNpb24gdG8gZmluYWwgcGNpNjQgRE1BIGludGVyZmFjZXMKKyAqIGJ5IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AcmVkaGF0LmNvbT4uCisgKi8KKworLyoKKyAqICREYXRlOiAxOTk1LzA5LzIyIDAyOjIzOjE1ICQKKyAqICRSZXZpc2lvbjogMC41ICQKKyAqCisgKiAkTG9nOiBpc3AxMDIwLmMsdiAkCisgKiBSZXZpc2lvbiAwLjUgIDE5OTUvMDkvMjIgIDAyOjIzOjE1ICByb290CisgKiBkbyBhdXRvIHJlcXVlc3Qgc2Vuc2UKKyAqCisgKiBSZXZpc2lvbiAwLjQgIDE5OTUvMDgvMDcgIDA0OjQ0OjMzICByb290CisgKiBzdXBwbHkgZmlybXdhcmUgd2l0aCBkcml2ZXIuCisgKiBudW1lcm91cyBidWcgZml4ZXMvZ2VuZXJhbCBjbGVhbnVwIG9mIGNvZGUuCisgKgorICogUmV2aXNpb24gMC4zICAxOTk1LzA3LzE2ICAxNjoxNTozOSAgcm9vdAorICogYWRkZWQgcmVzZXQvYWJvcnQgY29kZS4KKyAqCisgKiBSZXZpc2lvbiAwLjIgIDE5OTUvMDYvMjkgIDAzOjE0OjE5ICByb290CisgKiBmaXhlZCBiaW9zcGFyYW0uCisgKiBhZGRlZCBxdWV1ZSBwcm90b2NvbC4KKyAqCisgKiBSZXZpc2lvbiAwLjEgIDE5OTUvMDYvMjUgIDAxOjU1OjQ1ICByb290CisgKiBJbml0aWFsIHJlbGVhc2UuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2RlZmluZSBwY2k2NF9kbWFfaGkzMihhKSAoKHUzMikgKDB4ZmZmZmZmZmYgJiAoKCh1NjQpKGEpKT4+MzIpKSkKKyNkZWZpbmUgcGNpNjRfZG1hX2xvMzIoYSkgKCh1MzIpICgweGZmZmZmZmZmICYgKCgodTY0KShhKSkpKSkKKyNkZWZpbmUgcGNpNjRfZG1hX2J1aWxkKGhpLGxvKSBcCisJKChkbWFfYWRkcl90KSgoKHU2NCkobG8pKXwoKCh1NjQpKGhpKSk8PDMyKSkpCisKKy8qCisgKiBXaXRoIHRoZSBxbG9naWMgaW50ZXJmYWNlLCBldmVyeSBxdWV1ZSBzbG90IGNhbiBob2xkIGEgU0NTSQorICogY29tbWFuZCB3aXRoIHVwIHRvIDIgc2NhdHRlci9nYXRoZXIgZW50cmllcy4gIElmIHdlIG5lZWQgbW9yZQorICogdGhhbiAyIGVudHJpZXMsIGNvbnRpbnVhdGlvbiBlbnRyaWVzIGNhbiBiZSB1c2VkIHRoYXQgaG9sZAorICogYW5vdGhlciA1IGVudHJpZXMgZWFjaC4gIFVubGlrZSBmb3Igb3RoZXIgZHJpdmVycywgdGhpcyBtZWFucworICogdGhhdCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2NhdHRlci9nYXRoZXIgZW50cmllcyB3ZSBjYW4KKyAqIHN1cHBvcnQgYXQgYW55IGdpdmVuIHRpbWUgaXMgYSBmdW5jdGlvbiBvZiB0aGUgbnVtYmVyIG9mIHF1ZXVlCisgKiBzbG90cyBhdmFpbGFibGUuICBUaGF0IGlzLCBob3N0LT5jYW5fcXVldWUgYW5kIGhvc3QtPnNnX3RhYmxlc2l6ZQorICogYXJlIGR5bmFtaWMgYW5kIF9ub3RfIGluZGVwZW5kZW50LiAgVGhpcyBhbGwgd29ya3MgZmluZSBiZWNhdXNlCisgKiByZXF1ZXN0cyBhcmUgcXVldWVkIHNlcmlhbGx5IGFuZCB0aGUgc2NhdHRlci9nYXRoZXIgbGltaXQgaXMKKyAqIGRldGVybWluZWQgZm9yIGVhY2ggcXVldWUgcmVxdWVzdCBhbmV3LgorICovCisKKyNkZWZpbmUgREFUQVNFR1NfUEVSX0NPTU1BTkQgMgorI2RlZmluZSBEQVRBU0VHU19QRVJfQ09OVCA1CisKKyNkZWZpbmUgUUxPR0lDRkNfUkVRX1FVRVVFX0xFTiAyNTUgICAgIC8qIG11c3QgYmUgcG93ZXIgb2YgdHdvIC0gMSAqLworI2RlZmluZSBRTE9HSUNGQ19NQVhfU0cocWwpCShEQVRBU0VHU19QRVJfQ09NTUFORCArICgoKHFsKSA+IDApID8gREFUQVNFR1NfUEVSX0NPTlQqKChxbCkgLSAxKSA6IDApKQorI2RlZmluZSBRTE9HSUNGQ19DTURfUEVSX0xVTiAgICA4CisKKy8qIENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qIFNldCB0aGUgZm9sbG93aW5nIG1hY3JvIHRvIDEgdG8gcmVsb2FkIHRoZSBJU1AyeDAwJ3MgZmlybXdhcmUuICBUaGlzIGlzCisgICB2ZXJzaW9uIDEuMTcuMzAgb2YgdGhlIGlzcDIxMDAncyBmaXJtd2FyZSBhbmQgdmVyc2lvbiAyLjAwLjQwIG9mIHRoZSAKKyAgIGlzcDIyMDAncyBmaXJtd2FyZS4gCisqLworCisjZGVmaW5lIFVTRV9OVlJBTV9ERUZBVUxUUyAgICAgIDEKKworI2RlZmluZSBJU1AyeDAwX1BPUlREQiAgICAgICAgICAxCisKKy8qIFNldCB0aGUgZm9sbG93aW5nIHRvIDEgdG8gaW5jbHVkZSBmYWJyaWMgc3VwcG9ydCwgZmFicmljIHN1cHBvcnQgaXMgCisgKiBjdXJyZW50bHkgbm90IGFzIHdlbGwgdGVzdGVkIGFzIHRoZSBvdGhlciBhc3BlY3RzIG9mIHRoZSBkcml2ZXIgKi8KKworI2RlZmluZSBJU1AyeDAwX0ZBQlJJQyAgICAgICAgICAxCisKKy8qICBNYWNyb3MgdXNlZCBmb3IgZGVidWdnaW5nICovCisjZGVmaW5lIERFQlVHX0lTUDJ4MDAJCTAKKyNkZWZpbmUgREVCVUdfSVNQMngwMF9JTlQJMAorI2RlZmluZSBERUJVR19JU1AyeDAwX0lOVFIJMAorI2RlZmluZSBERUJVR19JU1AyeDAwX1NFVFVQCTAKKyNkZWZpbmUgREVCVUdfSVNQMngwMF9GQUJSSUMgICAgMAorI2RlZmluZSBUUkFDRV9JU1AgCQkwIAorCisKKyNkZWZpbmUgREVGQVVMVF9MT09QX0NPVU5UCTEwMDAwMDAwMDAKKworI2RlZmluZSBJU1BfVElNRU9VVCAoMipIWikKKy8qIEVuZCBDb25maWd1cmF0aW9uIHNlY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2lmIFRSQUNFX0lTUAorCisjZGVmaW5lIFRSQUNFX0JVRl9MRU4JKDMyKjEwMjQpCisKK3N0cnVjdCB7CisJdV9sb25nIG5leHQ7CisJc3RydWN0IHsKKwkJdV9sb25nIHRpbWU7CisJCXVfaW50IGluZGV4OworCQl1X2ludCBhZGRyOworCQl1X2NoYXIgKm5hbWU7CisJfSBidWZbVFJBQ0VfQlVGX0xFTl07Cit9IHRyYWNlOworCisjZGVmaW5lIFRSQUNFKHcsIGksIGEpCQkJCQkJXAorewkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkJCQlcCisJCQkJCQkJCVwKKwlzYXZlX2ZsYWdzKGZsYWdzKTsJCQkJCVwKKwljbGkoKTsJCQkJCQkJXAorCXRyYWNlLmJ1Zlt0cmFjZS5uZXh0XS5uYW1lICA9ICh3KTsJCQlcCisJdHJhY2UuYnVmW3RyYWNlLm5leHRdLnRpbWUgID0gamlmZmllczsJCQlcCisJdHJhY2UuYnVmW3RyYWNlLm5leHRdLmluZGV4ID0gKGkpOwkJCVwKKwl0cmFjZS5idWZbdHJhY2UubmV4dF0uYWRkciAgPSAobG9uZykgKGEpOwkJXAorCXRyYWNlLm5leHQgPSAodHJhY2UubmV4dCArIDEpICYgKFRSQUNFX0JVRl9MRU4gLSAxKTsJXAorCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwkJCQkJXAorfQorCisjZWxzZQorI2RlZmluZSBUUkFDRSh3LCBpLCBhKQorI2VuZGlmCisKKyNpZiBERUJVR19JU1AyeDAwX0ZBQlJJQworI2RlZmluZSBERUJVR19GQUJSSUMoeCkJeAorI2Vsc2UKKyNkZWZpbmUgREVCVUdfRkFCUklDKHgpCisjZW5kaWYJCQkJLyogREVCVUdfSVNQMngwMF9GQUJSSUMgKi8KKworCisjaWYgREVCVUdfSVNQMngwMAorI2RlZmluZSBFTlRFUih4KQlwcmludGsoImlzcDJ4MDAgOiBlbnRlcmluZyAlcygpXG4iLCB4KTsKKyNkZWZpbmUgTEVBVkUoeCkJcHJpbnRrKCJpc3AyeDAwIDogbGVhdmluZyAlcygpXG4iLCB4KTsKKyNkZWZpbmUgREVCVUcoeCkJeAorI2Vsc2UKKyNkZWZpbmUgRU5URVIoeCkKKyNkZWZpbmUgTEVBVkUoeCkKKyNkZWZpbmUgREVCVUcoeCkKKyNlbmRpZgkJCQkvKiBERUJVR19JU1AyeDAwICovCisKKyNpZiBERUJVR19JU1AyeDAwX0lOVFIKKyNkZWZpbmUgRU5URVJfSU5UUih4KQlwcmludGsoImlzcDJ4MDAgOiBlbnRlcmluZyAlcygpXG4iLCB4KTsKKyNkZWZpbmUgTEVBVkVfSU5UUih4KQlwcmludGsoImlzcDJ4MDAgOiBsZWF2aW5nICVzKClcbiIsIHgpOworI2RlZmluZSBERUJVR19JTlRSKHgpCXgKKyNlbHNlCisjZGVmaW5lIEVOVEVSX0lOVFIoeCkKKyNkZWZpbmUgTEVBVkVfSU5UUih4KQorI2RlZmluZSBERUJVR19JTlRSKHgpCisjZW5kaWYJCQkJLyogREVCVUcgSVNQMngwMF9JTlRSICovCisKKworI2RlZmluZSBJU1AyMTAwX1JFVl9JRDEJICAgICAgIDEKKyNkZWZpbmUgSVNQMjEwMF9SRVZfSUQzICAgICAgICAzCisjZGVmaW5lIElTUDIyMDBfUkVWX0lENSAgICAgICAgNQorCisvKiBob3N0IGNvbmZpZ3VyYXRpb24gYW5kIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIEhPU1RfSENDUgkweGMwCS8qIGhvc3QgY29tbWFuZCBhbmQgY29udHJvbCAqLworCisvKiBwY2kgYnVzIGludGVyZmFjZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRkxBU0hfQklPU19BRERSCTB4MDAKKyNkZWZpbmUgRkxBU0hfQklPU19EQVRBCTB4MDIKKyNkZWZpbmUgSVNQX0NUUkxfU1RBVFVTCTB4MDYJLyogY29uZmlndXJhdGlvbiByZWdpc3RlciAjMSAqLworI2RlZmluZSBQQ0lfSU5URVJfQ1RMCTB4MDgJLyogcGNpIGludGVycnVwdCBjb250cm9sICovCisjZGVmaW5lIFBDSV9JTlRFUl9TVFMJMHgwYQkvKiBwY2kgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBQQ0lfU0VNQVBIT1JFCTB4MGMJLyogcGNpIHNlbWFwaG9yZSAqLworI2RlZmluZSBQQ0lfTlZSQU0JMHgwZQkvKiBwY2kgbnZyYW0gaW50ZXJmYWNlICovCisKKy8qIG1haWxib3ggcmVnaXN0ZXJzICovCisjZGVmaW5lIE1CT1gwCQkweDEwCS8qIG1haWxib3ggMCAqLworI2RlZmluZSBNQk9YMQkJMHgxMgkvKiBtYWlsYm94IDEgKi8KKyNkZWZpbmUgTUJPWDIJCTB4MTQJLyogbWFpbGJveCAyICovCisjZGVmaW5lIE1CT1gzCQkweDE2CS8qIG1haWxib3ggMyAqLworI2RlZmluZSBNQk9YNAkJMHgxOAkvKiBtYWlsYm94IDQgKi8KKyNkZWZpbmUgTUJPWDUJCTB4MWEJLyogbWFpbGJveCA1ICovCisjZGVmaW5lIE1CT1g2CQkweDFjCS8qIG1haWxib3ggNiAqLworI2RlZmluZSBNQk9YNwkJMHgxZQkvKiBtYWlsYm94IDcgKi8KKworLyogbWFpbGJveCBjb21tYW5kIGNvbXBsZXRlIHN0YXR1cyBjb2RlcyAqLworI2RlZmluZSBNQk9YX0NPTU1BTkRfQ09NUExFVEUJCTB4NDAwMAorI2RlZmluZSBJTlZBTElEX0NPTU1BTkQJCQkweDQwMDEKKyNkZWZpbmUgSE9TVF9JTlRFUkZBQ0VfRVJST1IJCTB4NDAwMgorI2RlZmluZSBURVNUX0ZBSUxFRAkJCTB4NDAwMworI2RlZmluZSBDT01NQU5EX0VSUk9SCQkJMHg0MDA1CisjZGVmaW5lIENPTU1BTkRfUEFSQU1fRVJST1IJCTB4NDAwNgorI2RlZmluZSBQT1JUX0lEX1VTRUQgICAgICAgICAgICAgICAgICAgIDB4NDAwNworI2RlZmluZSBMT09QX0lEX1VTRUQgICAgICAgICAgICAgICAgICAgIDB4NDAwOAorI2RlZmluZSBBTExfSURTX1VTRUQgICAgICAgICAgICAgICAgICAgIDB4NDAwOQorCisvKiBhc3luYyBldmVudCBzdGF0dXMgY29kZXMgKi8KKyNkZWZpbmUgUkVTRVRfREVURUNURUQgIAkJMHg4MDAxCisjZGVmaW5lIFNZU1RFTV9FUlJPUgkJCTB4ODAwMgorI2RlZmluZSBSRVFVRVNUX1RSQU5TRkVSX0VSUk9SCQkweDgwMDMKKyNkZWZpbmUgUkVTUE9OU0VfVFJBTlNGRVJfRVJST1IJCTB4ODAwNAorI2RlZmluZSBSRVFVRVNUX1FVRVVFX1dBS0VVUAkJMHg4MDA1CisjZGVmaW5lIExJUF9PQ0NVUlJFRCAgICAgICAgICAgICAgICAgICAgIDB4ODAxMAorI2RlZmluZSBMT09QX1VQICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAxMQorI2RlZmluZSBMT09QX0RPV04gICAgICAgICAgICAgICAgICAgICAgIDB4ODAxMgorI2RlZmluZSBMSVBfUkVDRUlWRUQgICAgICAgICAgICAgICAgICAgIDB4ODAxMworI2RlZmluZSBQT1JUX0RCX0NIQU5HRUQgICAgICAgICAgICAgICAgIDB4ODAxNAorI2RlZmluZSBDSEFOR0VfTk9USUZJQ0FUSU9OICAgICAgICAgICAgIDB4ODAxNQorI2RlZmluZSBTQ1NJX0NPTU1BTkRfQ09NUExFVEUgICAgICAgICAgIDB4ODAyMAorI2RlZmluZSBQT0lOVF9UT19QT0lOVF9VUCAgICAgICAgICAgICAgIDB4ODAzMAorI2RlZmluZSBDT05ORUNUSU9OX01PREUgICAgICAgICAgICAgICAgIDB4ODAzNgorCitzdHJ1Y3QgRW50cnlfaGVhZGVyIHsKKwl1X2NoYXIgZW50cnlfdHlwZTsKKwl1X2NoYXIgZW50cnlfY250OworCXVfY2hhciBzeXNfZGVmXzE7CisJdV9jaGFyIGZsYWdzOworfTsKKworLyogZW50cnkgaGVhZGVyIHR5cGUgY29tbWFuZHMgKi8KKyNkZWZpbmUgRU5UUllfQ09NTUFORAkJMHgxOQorI2RlZmluZSBFTlRSWV9DT05USU5VQVRJT04JMHgwYQorCisjZGVmaW5lIEVOVFJZX1NUQVRVUwkJMHgwMworI2RlZmluZSBFTlRSWV9NQVJLRVIJCTB4MDQKKworCisvKiBlbnRyeSBoZWFkZXIgZmxhZyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBFRkxBR19CVVNZCQkyCisjZGVmaW5lIEVGTEFHX0JBRF9IRUFERVIJNAorI2RlZmluZSBFRkxBR19CQURfUEFZTE9BRAk4CisKK3N0cnVjdCBkYXRhc2VnIHsKKwl1X2ludCBkX2Jhc2U7CisJdV9pbnQgZF9iYXNlX2hpOworCXVfaW50IGRfY291bnQ7Cit9OworCitzdHJ1Y3QgQ29tbWFuZF9FbnRyeSB7CisJc3RydWN0IEVudHJ5X2hlYWRlciBoZHI7CisJdV9pbnQgaGFuZGxlOworCXVfY2hhciB0YXJnZXRfbHVuOworCXVfY2hhciB0YXJnZXRfaWQ7CisJdV9zaG9ydCBleHBhbmRlZF9sdW47CisJdV9zaG9ydCBjb250cm9sX2ZsYWdzOworCXVfc2hvcnQgcnN2ZDI7CisJdV9zaG9ydCB0aW1lX291dDsKKwl1X3Nob3J0IHNlZ21lbnRfY250OworCXVfY2hhciBjZGJbMTZdOworCXVfaW50IHRvdGFsX2J5dGVfY250OworCXN0cnVjdCBkYXRhc2VnIGRhdGFzZWdbREFUQVNFR1NfUEVSX0NPTU1BTkRdOworfTsKKworLyogY29tbWFuZCBlbnRyeSBjb250cm9sIGZsYWcgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQ0ZMQUdfTk9ESVNDCQkweDAxCisjZGVmaW5lIENGTEFHX0hFQURfVEFHCQkweDAyCisjZGVmaW5lIENGTEFHX09SREVSRURfVEFHCTB4MDQKKyNkZWZpbmUgQ0ZMQUdfU0lNUExFX1RBRwkweDA4CisjZGVmaW5lIENGTEFHX1RBUl9SVE4JCTB4MTAKKyNkZWZpbmUgQ0ZMQUdfUkVBRAkJMHgyMAorI2RlZmluZSBDRkxBR19XUklURQkJMHg0MAorCitzdHJ1Y3QgQ29udGludWF0aW9uX0VudHJ5IHsKKwlzdHJ1Y3QgRW50cnlfaGVhZGVyIGhkcjsKKwlzdHJ1Y3QgZGF0YXNlZyBkYXRhc2VnW0RBVEFTRUdTX1BFUl9DT05UXTsKK307CisKK3N0cnVjdCBNYXJrZXJfRW50cnkgeworCXN0cnVjdCBFbnRyeV9oZWFkZXIgaGRyOworCXVfaW50IHJlc2VydmVkOworCXVfY2hhciB0YXJnZXRfbHVuOworCXVfY2hhciB0YXJnZXRfaWQ7CisJdV9jaGFyIG1vZGlmaWVyOworCXVfY2hhciBleHBhbmRlZF9sdW47CisJdV9jaGFyIHJzdmRzWzUyXTsKK307CisKKy8qIG1hcmtlciBlbnRyeSBtb2RpZmllciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTWU5DX0RFVklDRQkwCisjZGVmaW5lIFNZTkNfVEFSR0VUCTEKKyNkZWZpbmUgU1lOQ19BTEwJMgorCitzdHJ1Y3QgU3RhdHVzX0VudHJ5IHsKKwlzdHJ1Y3QgRW50cnlfaGVhZGVyIGhkcjsKKwl1X2ludCBoYW5kbGU7CisJdV9zaG9ydCBzY3NpX3N0YXR1czsKKwl1X3Nob3J0IGNvbXBsZXRpb25fc3RhdHVzOworCXVfc2hvcnQgc3RhdGVfZmxhZ3M7CisJdV9zaG9ydCBzdGF0dXNfZmxhZ3M7CisJdV9zaG9ydCByZXNfaW5mb19sZW47CisJdV9zaG9ydCByZXFfc2Vuc2VfbGVuOworCXVfaW50IHJlc2lkdWFsOworCXVfY2hhciByZXNfaW5mb1s4XTsKKwl1X2NoYXIgcmVxX3NlbnNlX2RhdGFbMzJdOworfTsKKworLyogc3RhdHVzIGVudHJ5IGNvbXBsZXRpb24gc3RhdHVzIGRlZmluaXRpb25zICovCisjZGVmaW5lIENTX0NPTVBMRVRFCQkJMHgwMDAwCisjZGVmaW5lIENTX0RNQV9FUlJPUgkJCTB4MDAwMgorI2RlZmluZSBDU19SRVNFVF9PQ0NVUlJFRAkJMHgwMDA0CisjZGVmaW5lIENTX0FCT1JURUQJCQkweDAwMDUKKyNkZWZpbmUgQ1NfVElNRU9VVAkJCTB4MDAwNgorI2RlZmluZSBDU19EQVRBX09WRVJSVU4JCQkweDAwMDcKKyNkZWZpbmUgQ1NfREFUQV9VTkRFUlJVTgkJMHgwMDE1CisjZGVmaW5lIENTX1FVRVVFX0ZVTEwJCQkweDAwMWMKKyNkZWZpbmUgQ1NfUE9SVF9VTkFWQUlMQUJMRSAgICAgICAgICAgICAweDAwMjgKKyNkZWZpbmUgQ1NfUE9SVF9MT0dHRURfT1VUICAgICAgICAgICAgICAweDAwMjkKKyNkZWZpbmUgQ1NfUE9SVF9DT05GSUdfQ0hBTkdFRAkJMHgwMDJhCisKKy8qIHN0YXR1cyBlbnRyeSBzdGF0ZSBmbGFnIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNGX1NFTlRfQ0RCCQkJMHgwNDAwCisjZGVmaW5lIFNGX1RSQU5TRkVSUkVEX0RBVEEJCTB4MDgwMAorI2RlZmluZSBTRl9HT1RfU1RBVFVTCQkJMHgxMDAwCisKKy8qIHN0YXR1cyBlbnRyeSBzdGF0dXMgZmxhZyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTVEZfQlVTX1JFU0VUCQkJMHgwMDA4CisjZGVmaW5lIFNURl9ERVZJQ0VfUkVTRVQJCTB4MDAxMAorI2RlZmluZSBTVEZfQUJPUlRFRAkJCTB4MDAyMAorI2RlZmluZSBTVEZfVElNRU9VVAkJCTB4MDA0MAorCisvKiBpbnRlcnJ1cHQgY29udHJvbCBjb21tYW5kcyAqLworI2RlZmluZSBJU1BfRU5fSU5UCQkJMHg4MDAwCisjZGVmaW5lIElTUF9FTl9SSVNDCQkJMHgwMDA4CisKKy8qIGhvc3QgY29udHJvbCBjb21tYW5kcyAqLworI2RlZmluZSBIQ0NSX05PUAkJCTB4MDAwMAorI2RlZmluZSBIQ0NSX1JFU0VUCQkJMHgxMDAwCisjZGVmaW5lIEhDQ1JfUEFVU0UJCQkweDIwMDAKKyNkZWZpbmUgSENDUl9SRUxFQVNFCQkJMHgzMDAwCisjZGVmaW5lIEhDQ1JfU0lOR0xFX1NURVAJCTB4NDAwMAorI2RlZmluZSBIQ0NSX1NFVF9IT1NUX0lOVFIJCTB4NTAwMAorI2RlZmluZSBIQ0NSX0NMRUFSX0hPU1RfSU5UUgkJMHg2MDAwCisjZGVmaW5lIEhDQ1JfQ0xFQVJfUklTQ19JTlRSCQkweDcwMDAKKyNkZWZpbmUgSENDUl9CUF9FTkFCTEUJCQkweDgwMDAKKyNkZWZpbmUgSENDUl9CSU9TX0RJU0FCTEUJCTB4OTAwMAorI2RlZmluZSBIQ0NSX1RFU1RfTU9ERQkJCTB4ZjAwMAorCisjZGVmaW5lIFJJU0NfQlVTWQkJCTB4MDAwNAorCisvKiBtYWlsYm94IGNvbW1hbmRzICovCisjZGVmaW5lIE1CT1hfTk9fT1AJCQkweDAwMDAKKyNkZWZpbmUgTUJPWF9MT0FEX1JBTQkJCTB4MDAwMQorI2RlZmluZSBNQk9YX0VYRUNfRklSTVdBUkUJCTB4MDAwMgorI2RlZmluZSBNQk9YX0RVTVBfUkFNCQkJMHgwMDAzCisjZGVmaW5lIE1CT1hfV1JJVEVfUkFNX1dPUkQJCTB4MDAwNAorI2RlZmluZSBNQk9YX1JFQURfUkFNX1dPUkQJCTB4MDAwNQorI2RlZmluZSBNQk9YX01BSUxCT1hfUkVHX1RFU1QJCTB4MDAwNgorI2RlZmluZSBNQk9YX1ZFUklGWV9DSEVDS1NVTQkJMHgwMDA3CisjZGVmaW5lIE1CT1hfQUJPVVRfRklSTVdBUkUJCTB4MDAwOAorI2RlZmluZSBNQk9YX0xPQURfUklTQ19SQU0gICAgICAgICAgICAgIDB4MDAwOQorI2RlZmluZSBNQk9YX0RVTVBfUklTQ19SQU0gICAgICAgICAgICAgIDB4MDAwYQorI2RlZmluZSBNQk9YX0NIRUNLX0ZJUk1XQVJFCQkweDAwMGUKKyNkZWZpbmUgTUJPWF9JTklUX1JFUV9RVUVVRQkJMHgwMDEwCisjZGVmaW5lIE1CT1hfSU5JVF9SRVNfUVVFVUUJCTB4MDAxMQorI2RlZmluZSBNQk9YX0VYRUNVVEVfSU9DQgkJMHgwMDEyCisjZGVmaW5lIE1CT1hfV0FLRV9VUAkJCTB4MDAxMworI2RlZmluZSBNQk9YX1NUT1BfRklSTVdBUkUJCTB4MDAxNAorI2RlZmluZSBNQk9YX0FCT1JUX0lPQ0IJCQkweDAwMTUKKyNkZWZpbmUgTUJPWF9BQk9SVF9ERVZJQ0UJCTB4MDAxNgorI2RlZmluZSBNQk9YX0FCT1JUX1RBUkdFVAkJMHgwMDE3CisjZGVmaW5lIE1CT1hfQlVTX1JFU0VUCQkJMHgwMDE4CisjZGVmaW5lIE1CT1hfU1RPUF9RVUVVRQkJCTB4MDAxOQorI2RlZmluZSBNQk9YX1NUQVJUX1FVRVVFCQkweDAwMWEKKyNkZWZpbmUgTUJPWF9TSU5HTEVfU1RFUF9RVUVVRQkJMHgwMDFiCisjZGVmaW5lIE1CT1hfQUJPUlRfUVVFVUUJCTB4MDAxYworI2RlZmluZSBNQk9YX0dFVF9ERVZfUVVFVUVfU1RBVFVTCTB4MDAxZAorI2RlZmluZSBNQk9YX0dFVF9GSVJNV0FSRV9TVEFUVVMJMHgwMDFmCisjZGVmaW5lIE1CT1hfR0VUX0lOSVRfU0NTSV9JRAkJMHgwMDIwCisjZGVmaW5lIE1CT1hfR0VUX1JFVFJZX0NPVU5UCQkweDAwMjIKKyNkZWZpbmUgTUJPWF9HRVRfVEFSR0VUX1BBUkFNUwkJMHgwMDI4CisjZGVmaW5lIE1CT1hfR0VUX0RFVl9RVUVVRV9QQVJBTVMJMHgwMDI5CisjZGVmaW5lIE1CT1hfU0VUX1JFVFJZX0NPVU5UCQkweDAwMzIKKyNkZWZpbmUgTUJPWF9TRVRfVEFSR0VUX1BBUkFNUwkJMHgwMDM4CisjZGVmaW5lIE1CT1hfU0VUX0RFVl9RVUVVRV9QQVJBTVMJMHgwMDM5CisjZGVmaW5lIE1CT1hfRVhFQ1VURV9JT0NCNjQgICAgICAgICAgICAgMHgwMDU0CisjZGVmaW5lIE1CT1hfSU5JVF9GSVJNV0FSRSAgICAgICAgICAgICAgMHgwMDYwCisjZGVmaW5lIE1CT1hfR0VUX0lOSVRfQ0IgICAgICAgICAgICAgICAgMHgwMDYxCisjZGVmaW5lIE1CT1hfSU5JVF9MSVAJCQkweDAwNjIKKyNkZWZpbmUgTUJPWF9HRVRfUE9TX01BUCAgICAgICAgICAgICAgICAweDAwNjMKKyNkZWZpbmUgTUJPWF9HRVRfUE9SVF9EQiAgICAgICAgICAgICAgICAweDAwNjQKKyNkZWZpbmUgTUJPWF9DTEVBUl9BQ0EgICAgICAgICAgICAgICAgICAweDAwNjUKKyNkZWZpbmUgTUJPWF9UQVJHRVRfUkVTRVQgICAgICAgICAgICAgICAweDAwNjYKKyNkZWZpbmUgTUJPWF9DTEVBUl9UQVNLX1NFVCAgICAgICAgICAgICAweDAwNjcKKyNkZWZpbmUgTUJPWF9BQk9SVF9UQVNLX1NFVCAgICAgICAgICAgICAweDAwNjgKKyNkZWZpbmUgTUJPWF9HRVRfRklSTVdBUkVfU1RBVEUgICAgICAgICAweDAwNjkKKyNkZWZpbmUgTUJPWF9HRVRfUE9SVF9OQU1FICAgICAgICAgICAgICAweDAwNmEKKyNkZWZpbmUgTUJPWF9TRU5EX1NOUyAgICAgICAgICAgICAgICAgICAweDAwNmUKKyNkZWZpbmUgTUJPWF9QT1JUX0xPR0lOICAgICAgICAgICAgICAgICAweDAwNmYKKyNkZWZpbmUgTUJPWF9TRU5EX0NIQU5HRV9SRVFVRVNUICAgICAgICAweDAwNzAKKyNkZWZpbmUgTUJPWF9QT1JUX0xPR09VVCAgICAgICAgICAgICAgICAweDAwNzEKKworLyoKKyAqCUZpcm13YXJlIGlmIG5lZWRlZCAobm90ZSB0aGlzIGlzIGEgaGFjaywgaXQgYmVsb25ncyBpbiBhIHNlcGFyYXRlCisgKgltb2R1bGUuCisgKi8KKyAKKyNpZmRlZiBDT05GSUdfU0NTSV9RTE9HSUNfRkNfRklSTVdBUkUKKyNpbmNsdWRlICJxbG9naWNmY19hc20uYyIKKyNlbHNlCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmlzY19jb2RlX2FkZHIwMSA9IDB4MTAwMCA7CisjZW5kaWYKKworLyogRWFjaCBlbGVtZW50IGluIG1ib3hfcGFyYW0gaXMgYW4gOCBiaXQgYml0bWFwIHdoZXJlIGVhY2ggYml0IGluZGljYXRlcworICAgaWYgdGhhdCBtYm94IHNob3VsZCBiZSBjb3BpZWQgYXMgaW5wdXQuICBGb3IgZXhhbXBsZSAweDIgd291bGQgbWVhbgorICAgb25seSBjb3B5IG1ib3gxLiAqLworCitzdGF0aWMgY29uc3QgdV9jaGFyIG1ib3hfcGFyYW1bXSA9Cit7CisJMHgwMSwJCQkvKiBNQk9YX05PX09QICovCisJMHgxZiwJCQkvKiBNQk9YX0xPQURfUkFNICovCisJMHgwMywJCQkvKiBNQk9YX0VYRUNfRklSTVdBUkUgKi8KKwkweDFmLAkJCS8qIE1CT1hfRFVNUF9SQU0gKi8KKwkweDA3LAkJCS8qIE1CT1hfV1JJVEVfUkFNX1dPUkQgKi8KKwkweDAzLAkJCS8qIE1CT1hfUkVBRF9SQU1fV09SRCAqLworCTB4ZmYsCQkJLyogTUJPWF9NQUlMQk9YX1JFR19URVNUICovCisJMHgwMywJCQkvKiBNQk9YX1ZFUklGWV9DSEVDS1NVTSAqLworCTB4MDEsCQkJLyogTUJPWF9BQk9VVF9GSVJNV0FSRSAqLworCTB4ZmYsCQkJLyogTUJPWF9MT0FEX1JJU0NfUkFNICovCisJMHhmZiwJCQkvKiBNQk9YX0RVTVBfUklTQ19SQU0gKi8KKwkweDAwLAkJCS8qIDB4MDAwYiAqLworCTB4MDAsCQkJLyogMHgwMDBjICovCisJMHgwMCwJCQkvKiAweDAwMGQgKi8KKwkweDAxLAkJCS8qIE1CT1hfQ0hFQ0tfRklSTVdBUkUgKi8KKwkweDAwLAkJCS8qIDB4MDAwZiAqLworCTB4MWYsCQkJLyogTUJPWF9JTklUX1JFUV9RVUVVRSAqLworCTB4MmYsCQkJLyogTUJPWF9JTklUX1JFU19RVUVVRSAqLworCTB4MGYsCQkJLyogTUJPWF9FWEVDVVRFX0lPQ0IgKi8KKwkweDAzLAkJCS8qIE1CT1hfV0FLRV9VUCAqLworCTB4MDEsCQkJLyogTUJPWF9TVE9QX0ZJUk1XQVJFICovCisJMHgwZiwJCQkvKiBNQk9YX0FCT1JUX0lPQ0IgKi8KKwkweDAzLAkJCS8qIE1CT1hfQUJPUlRfREVWSUNFICovCisJMHgwNywJCQkvKiBNQk9YX0FCT1JUX1RBUkdFVCAqLworCTB4MDMsCQkJLyogTUJPWF9CVVNfUkVTRVQgKi8KKwkweDAzLAkJCS8qIE1CT1hfU1RPUF9RVUVVRSAqLworCTB4MDMsCQkJLyogTUJPWF9TVEFSVF9RVUVVRSAqLworCTB4MDMsCQkJLyogTUJPWF9TSU5HTEVfU1RFUF9RVUVVRSAqLworCTB4MDMsCQkJLyogTUJPWF9BQk9SVF9RVUVVRSAqLworCTB4MDMsCQkJLyogTUJPWF9HRVRfREVWX1FVRVVFX1NUQVRVUyAqLworCTB4MDAsCQkJLyogMHgwMDFlICovCisJMHgwMSwJCQkvKiBNQk9YX0dFVF9GSVJNV0FSRV9TVEFUVVMgKi8KKwkweDAxLAkJCS8qIE1CT1hfR0VUX0lOSVRfU0NTSV9JRCAqLworCTB4MDAsCQkJLyogMHgwMDIxICovCisJMHgwMSwJCQkvKiBNQk9YX0dFVF9SRVRSWV9DT1VOVCAqLworCTB4MDAsCQkJLyogMHgwMDIzICovCisJMHgwMCwJCQkvKiAweDAwMjQgKi8KKwkweDAwLAkJCS8qIDB4MDAyNSAqLworCTB4MDAsCQkJLyogMHgwMDI2ICovCisJMHgwMCwJCQkvKiAweDAwMjcgKi8KKwkweDAzLAkJCS8qIE1CT1hfR0VUX1RBUkdFVF9QQVJBTVMgKi8KKwkweDAzLAkJCS8qIE1CT1hfR0VUX0RFVl9RVUVVRV9QQVJBTVMgKi8KKwkweDAwLAkJCS8qIDB4MDAyYSAqLworCTB4MDAsCQkJLyogMHgwMDJiICovCisJMHgwMCwJCQkvKiAweDAwMmMgKi8KKwkweDAwLAkJCS8qIDB4MDAyZCAqLworCTB4MDAsCQkJLyogMHgwMDJlICovCisJMHgwMCwJCQkvKiAweDAwMmYgKi8KKwkweDAwLAkJCS8qIDB4MDAzMCAqLworCTB4MDAsCQkJLyogMHgwMDMxICovCisJMHgwNywJCQkvKiBNQk9YX1NFVF9SRVRSWV9DT1VOVCAqLworCTB4MDAsCQkJLyogMHgwMDMzICovCisJMHgwMCwJCQkvKiAweDAwMzQgKi8KKwkweDAwLAkJCS8qIDB4MDAzNSAqLworCTB4MDAsCQkJLyogMHgwMDM2ICovCisJMHgwMCwJCQkvKiAweDAwMzcgKi8KKwkweDBmLAkJCS8qIE1CT1hfU0VUX1RBUkdFVF9QQVJBTVMgKi8KKwkweDBmLAkJCS8qIE1CT1hfU0VUX0RFVl9RVUVVRV9QQVJBTVMgKi8KKwkweDAwLAkJCS8qIDB4MDAzYSAqLworCTB4MDAsCQkJLyogMHgwMDNiICovCisJMHgwMCwJCQkvKiAweDAwM2MgKi8KKwkweDAwLAkJCS8qIDB4MDAzZCAqLworCTB4MDAsCQkJLyogMHgwMDNlICovCisJMHgwMCwJCQkvKiAweDAwM2YgKi8KKwkweDAwLAkJCS8qIDB4MDA0MCAqLworCTB4MDAsCQkJLyogMHgwMDQxICovCisJMHgwMCwJCQkvKiAweDAwNDIgKi8KKwkweDAwLAkJCS8qIDB4MDA0MyAqLworCTB4MDAsCQkJLyogMHgwMDQ0ICovCisJMHgwMCwJCQkvKiAweDAwNDUgKi8KKwkweDAwLAkJCS8qIDB4MDA0NiAqLworCTB4MDAsCQkJLyogMHgwMDQ3ICovCisJMHgwMCwJCQkvKiAweDAwNDggKi8KKwkweDAwLAkJCS8qIDB4MDA0OSAqLworCTB4MDAsCQkJLyogMHgwMDRhICovCisJMHgwMCwJCQkvKiAweDAwNGIgKi8KKwkweDAwLAkJCS8qIDB4MDA0YyAqLworCTB4MDAsCQkJLyogMHgwMDRkICovCisJMHgwMCwJCQkvKiAweDAwNGUgKi8KKwkweDAwLAkJCS8qIDB4MDA0ZiAqLworCTB4MDAsCQkJLyogMHgwMDUwICovCisJMHgwMCwJCQkvKiAweDAwNTEgKi8KKwkweDAwLAkJCS8qIDB4MDA1MiAqLworCTB4MDAsCQkJLyogMHgwMDUzICovCisJMHhjZiwJCQkvKiBNQk9YX0VYRUNVVEVfSU9DQjY0ICovCisJMHgwMCwJCQkvKiAweDAwNTUgKi8KKwkweDAwLAkJCS8qIDB4MDA1NiAqLworCTB4MDAsCQkJLyogMHgwMDU3ICovCisJMHgwMCwJCQkvKiAweDAwNTggKi8KKwkweDAwLAkJCS8qIDB4MDA1OSAqLworCTB4MDAsCQkJLyogMHgwMDVhICovCisJMHgwMCwJCQkvKiAweDAwNWIgKi8KKwkweDAwLAkJCS8qIDB4MDA1YyAqLworCTB4MDAsCQkJLyogMHgwMDVkICovCisJMHgwMCwJCQkvKiAweDAwNWUgKi8KKwkweDAwLAkJCS8qIDB4MDA1ZiAqLworCTB4ZmYsCQkJLyogTUJPWF9JTklUX0ZJUk1XQVJFICovCisJMHhjZCwJCQkvKiBNQk9YX0dFVF9JTklUX0NCICovCisJMHgwMSwJCQkvKiBNQk9YX0lOSVRfTElQICovCisJMHhjZCwJCQkvKiBNQk9YX0dFVF9QT1NfTUFQICovCisJMHhjZiwJCQkvKiBNQk9YX0dFVF9QT1JUX0RCICovCisJMHgwMywJCQkvKiBNQk9YX0NMRUFSX0FDQSAqLworCTB4MDMsCQkJLyogTUJPWF9UQVJHRVRfUkVTRVQgKi8KKwkweDAzLAkJCS8qIE1CT1hfQ0xFQVJfVEFTS19TRVQgKi8KKwkweDAzLAkJCS8qIE1CT1hfQUJPUlRfVEFTS19TRVQgKi8KKwkweDAxLAkJCS8qIE1CT1hfR0VUX0ZJUk1XQVJFX1NUQVRFICovCisJMHgwMywJCQkvKiBNQk9YX0dFVF9QT1JUX05BTUUgKi8KKwkweDAwLAkJCS8qIDB4MDA2YiAqLworCTB4MDAsCQkJLyogMHgwMDZjICovCisJMHgwMCwJCQkvKiAweDAwNmQgKi8KKwkweGNmLAkJCS8qIE1CT1hfU0VORF9TTlMgKi8KKwkweDBmLAkJCS8qIE1CT1hfUE9SVF9MT0dJTiAqLworCTB4MDMsCQkJLyogTUJPWF9TRU5EX0NIQU5HRV9SRVFVRVNUICovCisJMHgwMywJCQkvKiBNQk9YX1BPUlRfTE9HT1VUICovCit9OworCisjZGVmaW5lIE1BWF9NQk9YX0NPTU1BTkQJKHNpemVvZihtYm94X3BhcmFtKS9zaXplb2YodV9zaG9ydCkpCisKKworc3RydWN0IGlkX25hbWVfbWFwIHsKKwl1NjQgd3duOworCXVfY2hhciBsb29wX2lkOworfTsKKworc3RydWN0IHNuc19jYiB7CisJdV9zaG9ydCBsZW47CisJdV9zaG9ydCByZXMxOworCXVfaW50IHJlc3BvbnNlX2xvdzsKKwl1X2ludCByZXNwb25zZV9oaWdoOworCXVfc2hvcnQgc3ViX2xlbjsKKwl1X3Nob3J0IHJlczI7CisJdV9jaGFyIGRhdGFbNDRdOworfTsKKworLyogYWRkcmVzcyBvZiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdCBpcyBwYXNzZWQgdG8gYWRhcHRlciB0byBpbml0aWFsaXplIHRoaW5ncworICovCitzdHJ1Y3QgaW5pdF9jYiB7CisJdV9jaGFyIHZlcnNpb247CisJdV9jaGFyIHJlc2V2ZXJkMVsxXTsKKwl1X3Nob3J0IGZpcm1fb3B0czsKKwl1X3Nob3J0IG1heF9mcmFtZV9sZW47CisJdV9zaG9ydCBtYXhfaW9jYjsKKwl1X3Nob3J0IGV4ZWNfdGhyb3R0bGU7CisJdV9jaGFyIHJldHJ5X2NudDsKKwl1X2NoYXIgcmV0cnlfZGVsYXk7CisJdV9zaG9ydCBub2RlX25hbWVbNF07CisJdV9zaG9ydCBoYXJkX2FkZHI7CisJdV9jaGFyIHJlc2VydmVkMlsxMF07CisJdV9zaG9ydCByZXFfcXVldWVfb3V0OworCXVfc2hvcnQgcmVzX3F1ZXVlX2luOworCXVfc2hvcnQgcmVxX3F1ZXVlX2xlbjsKKwl1X3Nob3J0IHJlc19xdWV1ZV9sZW47CisJdV9pbnQgcmVxX3F1ZXVlX2FkZHJfbG87CisJdV9pbnQgcmVxX3F1ZXVlX2FkZHJfaGlnaDsKKwl1X2ludCByZXNfcXVldWVfYWRkcl9sbzsKKwl1X2ludCByZXNfcXVldWVfYWRkcl9oaWdoOworICAgICAgICAvKiB0aGUgcmVzdCBvZiB0aGlzIHN0cnVjdHVyZSBvbmx5IGFwcGxpZXMgdG8gdGhlIGlzcDIyMDAgKi8KKyAgICAgICAgdV9zaG9ydCBsdW5fZW5hYmxlczsKKyAgICAgICAgdV9jaGFyIGNtZF9yZXNvdXJjZV9jbnQ7CisgICAgICAgIHVfY2hhciBub3RpZnlfcmVzb3VyY2VfY250OworICAgICAgICB1X3Nob3J0IHRpbWVvdXQ7CisgICAgICAgIHVfc2hvcnQgcmVzZXJ2ZWQzOworICAgICAgICB1X3Nob3J0IGFkZF9maXJtX29wdHM7CisgICAgICAgIHVfY2hhciByZXNfYWNjdW1fdGltZXI7CisgICAgICAgIHVfY2hhciBpcnFfZGVsYXlfdGltZXI7CisgICAgICAgIHVfc2hvcnQgc3BlY2lhbF9vcHRpb25zOworICAgICAgICB1X3Nob3J0IHJlc2VydmVkNFsxM107Cit9OworCisvKgorICogVGhlIHJlc3VsdCBxdWV1ZSBjYW4gYmUgcXVpdGUgYSBiaXQgc21hbGxlciBzaW5jZSBjb250aW51YXRpb24gZW50cmllcworICogZG8gbm90IHNob3cgdXAgdGhlcmU6CisgKi8KKyNkZWZpbmUgUkVTX1FVRVVFX0xFTgkJKChRTE9HSUNGQ19SRVFfUVVFVUVfTEVOICsgMSkgLyA4IC0gMSkKKyNkZWZpbmUgUVVFVUVfRU5UUllfTEVOCQk2NAorCisjaWYgSVNQMngwMF9GQUJSSUMKKyNkZWZpbmUgUUxPR0lDRkNfTUFYX0lEICAgIDB4ZmYKKyNlbHNlCisjZGVmaW5lIFFMT0dJQ0ZDX01BWF9JRCAgICAweDdkCisjZW5kaWYKKworI2RlZmluZSBRTE9HSUNGQ19NQVhfTFVOCTEyOAorI2RlZmluZSBRTE9HSUNGQ19NQVhfTE9PUF9JRAkweDdkCisKKy8qIHRoZSBmb2xsb3dpbmcgY29ubmVjdGlvbiBvcHRpb25zIG9ubHkgYXBwbHkgdG8gdGhlIDIyMDAuICBpIGhhdmUgb25seQorICogaGFkIHN1Y2Nlc3Mgd2l0aCBMT09QX09OTFkgYW5kIFAyUF9PTkxZLgorICovCisKKyNkZWZpbmUgTE9PUF9PTkxZICAgICAgICAgICAgICAwCisjZGVmaW5lIFAyUF9PTkxZICAgICAgICAgICAgICAgMQorI2RlZmluZSBMT09QX1BSRUZFUkVEICAgICAgICAgIDIKKyNkZWZpbmUgUDJQX1BSRUZFUkVEICAgICAgICAgICAzCisKKyNkZWZpbmUgQ09OTkVDVElPTl9QUkVGRVJFTkNFICBMT09QX09OTFkKKworLyogYWRhcHRlcl9zdGF0ZSB2YWx1ZXMgKi8KKyNkZWZpbmUgQVNfRklSTVdBUkVfREVBRCAgICAgIC0xCisjZGVmaW5lIEFTX0xPT1BfRE9XTiAgICAgICAgICAgMAorI2RlZmluZSBBU19MT09QX0dPT0QgICAgICAgICAgIDEKKyNkZWZpbmUgQVNfUkVET19GQUJSSUNfUE9SVERCICAyCisjZGVmaW5lIEFTX1JFRE9fTE9PUF9QT1JUREIgICAgNAorCisjZGVmaW5lIFJFU19TSVpFCSgoUkVTX1FVRVVFX0xFTiArIDEpKlFVRVVFX0VOVFJZX0xFTikKKyNkZWZpbmUgUkVRX1NJWkUJKChRTE9HSUNGQ19SRVFfUVVFVUVfTEVOICsgMSkqUVVFVUVfRU5UUllfTEVOKQorCitzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSB7CisJdV9jaGFyIHJldmlzaW9uOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCS8qIHJlc3VsdCBhbmQgcmVxdWVzdCBxdWV1ZXMgKHNoYXJlZCB3aXRoIGlzcDJ4MDApOiAqLworCXVfaW50IHJlcV9pbl9wdHI7CS8qIGluZGV4IG9mIG5leHQgcmVxdWVzdCBzbG90ICovCisJdV9pbnQgcmVzX291dF9wdHI7CS8qIGluZGV4IG9mIG5leHQgcmVzdWx0IHNsb3QgKi8KKworCS8qIHRoaXMgaXMgaGVyZSBzbyB0aGUgcXVldWVzIGFyZSBuaWNlbHkgYWxpZ25lZCAqLworCWxvbmcgc2VuZF9tYXJrZXI7CS8qIGRvIHdlIG5lZWQgdG8gc2VuZCBhIG1hcmtlcj8gKi8KKworCWNoYXIgKiByZXM7CisJY2hhciAqIHJlcTsKKwlzdHJ1Y3QgaW5pdF9jYiBjb250cm9sX2Jsb2NrOworCWludCBhZGFwdGVyX3N0YXRlOworCXVuc2lnbmVkIGxvbmcgaW50IHRhZ19hZ2VzW1FMT0dJQ0ZDX01BWF9JRCArIDFdOworCVNjc2lfQ21uZCAqaGFuZGxlX3B0cnNbUUxPR0lDRkNfUkVRX1FVRVVFX0xFTiArIDFdOworCXVuc2lnbmVkIGxvbmcgaGFuZGxlX3NlcmlhbHNbUUxPR0lDRkNfUkVRX1FVRVVFX0xFTiArIDFdOworCXN0cnVjdCBpZF9uYW1lX21hcCBwb3J0X2RiW1FMT0dJQ0ZDX01BWF9JRCArIDFdOworCXVfY2hhciBtYm94X2RvbmU7CisJdTY0IHd3bjsKKwl1X2ludCBwb3J0X2lkOworCXVfY2hhciBxdWV1ZWQ7CisJdV9jaGFyIGhvc3RfaWQ7CisgICAgICAgIHN0cnVjdCB0aW1lcl9saXN0IGV4cGxvcmVfdGltZXI7CisJc3RydWN0IGlkX25hbWVfbWFwIHRlbXBtYXBbUUxPR0lDRkNfTUFYX0lEICsgMV07Cit9OworCisKKy8qIHF1ZXVlIGxlbmd0aCdzIF9tdXN0XyBiZSBwb3dlciBvZiB0d286ICovCisjZGVmaW5lIFFVRVVFX0RFUFRIKGluLCBvdXQsIHFsKQkoKGluIC0gb3V0KSAmIChxbCkpCisjZGVmaW5lIFJFUV9RVUVVRV9ERVBUSChpbiwgb3V0KQlRVUVVRV9ERVBUSChpbiwgb3V0LCAJCSAgICAgXAorCQkJCQkJICAgIFFMT0dJQ0ZDX1JFUV9RVUVVRV9MRU4pCisjZGVmaW5lIFJFU19RVUVVRV9ERVBUSChpbiwgb3V0KQlRVUVVRV9ERVBUSChpbiwgb3V0LCBSRVNfUVVFVUVfTEVOKQorCitzdGF0aWMgdm9pZCBpc3AyeDAwX2VuYWJsZV9pcnFzKHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgdm9pZCBpc3AyeDAwX2Rpc2FibGVfaXJxcyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIGludCBpc3AyeDAwX2luaXQoc3RydWN0IFNjc2lfSG9zdCAqKTsKK3N0YXRpYyBpbnQgaXNwMngwMF9yZXNldF9oYXJkd2FyZShzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIGludCBpc3AyeDAwX21ib3hfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICosIHVfc2hvcnRbXSk7CitzdGF0aWMgaW50IGlzcDJ4MDBfcmV0dXJuX3N0YXR1cyhTY3NpX0NtbmQgKiwgc3RydWN0IFN0YXR1c19FbnRyeSAqKTsKK3N0YXRpYyB2b2lkIGlzcDJ4MDBfaW50cl9oYW5kbGVyKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBkb19pc3AyeDAwX2ludHJfaGFuZGxlcihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgaW50IGlzcDJ4MDBfbWFrZV9wb3J0ZGIoc3RydWN0IFNjc2lfSG9zdCAqKTsKKworI2lmIElTUDJ4MDBfRkFCUklDCitzdGF0aWMgaW50IGlzcDJ4MDBfaW5pdF9mYWJyaWMoc3RydWN0IFNjc2lfSG9zdCAqLCBzdHJ1Y3QgaWRfbmFtZV9tYXAgKiwgaW50KTsKKyNlbmRpZgorCisjaWYgVVNFX05WUkFNX0RFRkFVTFRTCitzdGF0aWMgaW50IGlzcDJ4MDBfZ2V0X252cmFtX2RlZmF1bHRzKHN0cnVjdCBTY3NpX0hvc3QgKiwgc3RydWN0IGluaXRfY2IgKik7CitzdGF0aWMgdV9zaG9ydCBpc3AyeDAwX3JlYWRfbnZyYW1fd29yZChzdHJ1Y3QgU2NzaV9Ib3N0ICosIHVfc2hvcnQpOworI2VuZGlmCisKKyNpZiBERUJVR19JU1AyeDAwCitzdGF0aWMgdm9pZCBpc3AyeDAwX3ByaW50X3Njc2lfY21kKFNjc2lfQ21uZCAqKTsKKyNlbmRpZgorCisjaWYgREVCVUdfSVNQMngwMF9JTlRSCitzdGF0aWMgdm9pZCBpc3AyeDAwX3ByaW50X3N0YXR1c19lbnRyeShzdHJ1Y3QgU3RhdHVzX0VudHJ5ICopOworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc3AyeDAwX2VuYWJsZV9pcnFzKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJb3V0dyhJU1BfRU5fSU5UIHwgSVNQX0VOX1JJU0MsIGhvc3QtPmlvX3BvcnQgKyBQQ0lfSU5URVJfQ1RMKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgaXNwMngwMF9kaXNhYmxlX2lycXMoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlvdXR3KDB4MCwgaG9zdC0+aW9fcG9ydCArIFBDSV9JTlRFUl9DVEwpOworfQorCisKK3N0YXRpYyBpbnQgaXNwMngwMF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICogdG1wdCkKK3sKKwlpbnQgaG9zdHMgPSAwOworCXVuc2lnbmVkIGxvbmcgd2FpdF90aW1lOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBOVUxMOworCXN0cnVjdCBpc3AyeDAwX2hvc3RkYXRhICpob3N0ZGF0YTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWRzWzJdOworCWRtYV9hZGRyX3QgYnVzYWRkcjsKKwlpbnQgaTsKKworCisJRU5URVIoImlzcDJ4MDBfZGV0ZWN0Iik7CisKKyAgICAgICAJZGV2aWNlX2lkc1swXSA9IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIxMDA7CisJZGV2aWNlX2lkc1sxXSA9IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIyMDA7CisKKwl0bXB0LT5wcm9jX25hbWUgPSAiaXNwMngwMCI7CisKKwlmb3IgKGk9MDsgaTwyOyBpKyspeworCQlwZGV2ID0gTlVMTDsKKwkgICAgICAgIHdoaWxlICgocGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX1FMT0dJQywgZGV2aWNlX2lkc1tpXSwgcGRldikpKSB7CisJCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCQkJY29udGludWU7CisKKwkJCS8qIFRyeSB0byBjb25maWd1cmUgRE1BIGF0dHJpYnV0ZXMuICovCisJCQlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpICYmCisJCQkgICAgcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmVUxMKSkKKwkJCQkJY29udGludWU7CisKKwkJICAgICAgICBob3N0ID0gc2NzaV9yZWdpc3Rlcih0bXB0LCBzaXplb2Yoc3RydWN0IGlzcDJ4MDBfaG9zdGRhdGEpKTsKKwkJCWlmICghaG9zdCkgeworCQkJICAgICAgICBwcmludGsoInFsb2dpY2ZjJWQgOiBjb3VsZCBub3QgcmVnaXN0ZXIgaG9zdC5cbiIsIGhvc3RzKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyAJCQlzY3NpX3NldF9kZXZpY2UoaG9zdCwgJnBkZXYtPmRldik7CisJCQlob3N0LT5tYXhfaWQgPSBRTE9HSUNGQ19NQVhfSUQgKyAxOworCQkJaG9zdC0+bWF4X2x1biA9IFFMT0dJQ0ZDX01BWF9MVU47CisJCQlob3N0ZGF0YSA9IChzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YTsKKworCQkJbWVtc2V0KGhvc3RkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGlzcDJ4MDBfaG9zdGRhdGEpKTsKKwkJCWhvc3RkYXRhLT5wY2lfZGV2ID0gcGRldjsKKwkJCWhvc3RkYXRhLT5yZXMgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBSRVNfU0laRSArIFJFUV9TSVpFLCAmYnVzYWRkcik7CisKKwkJCWlmICghaG9zdGRhdGEtPnJlcyl7CisJCQkgICAgICAgIHByaW50aygicWxvZ2ljZmMlZCA6IGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHF1ZXVlLlxuIiwgaG9zdHMpOworCQkJICAgICAgICBzY3NpX3VucmVnaXN0ZXIoaG9zdCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlob3N0ZGF0YS0+cmVxID0gaG9zdGRhdGEtPnJlcyArIChSRVNfUVVFVUVfTEVOICsgMSkqUVVFVUVfRU5UUllfTEVOOworCQkJaG9zdGRhdGEtPnF1ZXVlZCA9IDA7CisJCQkvKiBzZXQgdXAgdGhlIGNvbnRyb2wgYmxvY2sgKi8KKwkJCWhvc3RkYXRhLT5jb250cm9sX2Jsb2NrLnZlcnNpb24gPSAweDE7CisJCQlob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5maXJtX29wdHMgPSBjcHVfdG9fbGUxNigweDgwMGUpOworCQkJaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2subWF4X2ZyYW1lX2xlbiA9IGNwdV90b19sZTE2KDIwNDgpOworCQkJaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2subWF4X2lvY2IgPSBjcHVfdG9fbGUxNihRTE9HSUNGQ19SRVFfUVVFVUVfTEVOKTsKKwkJCWhvc3RkYXRhLT5jb250cm9sX2Jsb2NrLmV4ZWNfdGhyb3R0bGUgPSBjcHVfdG9fbGUxNihRTE9HSUNGQ19DTURfUEVSX0xVTik7CisJCQlob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5yZXRyeV9kZWxheSA9IDU7CisJCQlob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5yZXRyeV9jbnQgPSAxOworCQkJaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2subm9kZV9uYW1lWzBdID0gY3B1X3RvX2xlMTYoMHgwMDIwKTsKKwkJCWhvc3RkYXRhLT5jb250cm9sX2Jsb2NrLm5vZGVfbmFtZVsxXSA9IGNwdV90b19sZTE2KDB4RTAwMCk7CisJCQlob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5ub2RlX25hbWVbMl0gPSBjcHVfdG9fbGUxNigweDAwOEIpOworCQkJaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2subm9kZV9uYW1lWzNdID0gY3B1X3RvX2xlMTYoMHgwMDAwKTsKKwkJCWhvc3RkYXRhLT5jb250cm9sX2Jsb2NrLmhhcmRfYWRkciA9IGNwdV90b19sZTE2KDB4MDAwMyk7CisJCQlob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5yZXFfcXVldWVfbGVuID0gY3B1X3RvX2xlMTYoUUxPR0lDRkNfUkVRX1FVRVVFX0xFTiArIDEpOworCQkJaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2sucmVzX3F1ZXVlX2xlbiA9IGNwdV90b19sZTE2KFJFU19RVUVVRV9MRU4gKyAxKTsKKwkJCWhvc3RkYXRhLT5jb250cm9sX2Jsb2NrLnJlc19xdWV1ZV9hZGRyX2xvID0gY3B1X3RvX2xlMzIocGNpNjRfZG1hX2xvMzIoYnVzYWRkcikpOworCQkJaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2sucmVzX3F1ZXVlX2FkZHJfaGlnaCA9IGNwdV90b19sZTMyKHBjaTY0X2RtYV9oaTMyKGJ1c2FkZHIpKTsKKwkJCWhvc3RkYXRhLT5jb250cm9sX2Jsb2NrLnJlcV9xdWV1ZV9hZGRyX2xvID0gY3B1X3RvX2xlMzIocGNpNjRfZG1hX2xvMzIoYnVzYWRkciArIFJFU19TSVpFKSk7CisJCQlob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5yZXFfcXVldWVfYWRkcl9oaWdoID0gY3B1X3RvX2xlMzIocGNpNjRfZG1hX2hpMzIoYnVzYWRkciArIFJFU19TSVpFKSk7CisKKworCQkJaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2suYWRkX2Zpcm1fb3B0cyB8PSBjcHVfdG9fbGUxNihDT05ORUNUSU9OX1BSRUZFUkVOQ0U8PDQpOworCQkJaG9zdGRhdGEtPmFkYXB0ZXJfc3RhdGUgPSBBU19MT09QX0RPV047CisJCQlob3N0ZGF0YS0+ZXhwbG9yZV90aW1lci5kYXRhID0gMTsKKwkJCWhvc3RkYXRhLT5ob3N0X2lkID0gaG9zdHM7CisKKwkJCWlmIChpc3AyeDAwX2luaXQoaG9zdCkgfHwgaXNwMngwMF9yZXNldF9oYXJkd2FyZShob3N0KSkgeworCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQgKHBkZXYsIFJFU19TSVpFICsgUkVRX1NJWkUsIGhvc3RkYXRhLT5yZXMsIGJ1c2FkZHIpOworCQkJICAgICAgICBzY3NpX3VucmVnaXN0ZXIoaG9zdCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlob3N0LT50aGlzX2lkID0gMDsKKworCQkJaWYgKHJlcXVlc3RfaXJxKGhvc3QtPmlycSwgZG9faXNwMngwMF9pbnRyX2hhbmRsZXIsIFNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLCAicWxvZ2ljZmMiLCBob3N0KSkgeworCQkJICAgICAgICBwcmludGsoInFsb2dpY2ZjJWQgOiBpbnRlcnJ1cHQgJWQgYWxyZWFkeSBpbiB1c2VcbiIsCisJCQkJICAgICAgIGhvc3RkYXRhLT5ob3N0X2lkLCBob3N0LT5pcnEpOworCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQgKHBkZXYsIFJFU19TSVpFICsgUkVRX1NJWkUsIGhvc3RkYXRhLT5yZXMsIGJ1c2FkZHIpOworCQkJCXNjc2lfdW5yZWdpc3Rlcihob3N0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcmVxdWVzdF9yZWdpb24oaG9zdC0+aW9fcG9ydCwgMHhmZiwgInFsb2dpY2ZjIikpIHsKKwkJCSAgICAgICAgcHJpbnRrKCJxbG9naWNmYyVkIDogaS9vIHJlZ2lvbiAweCVseC0weCVseCBhbHJlYWR5ICIKKwkJCQkgICAgICAgImluIHVzZVxuIiwKKwkJCQkgICAgICAgaG9zdGRhdGEtPmhvc3RfaWQsIGhvc3QtPmlvX3BvcnQsIGhvc3QtPmlvX3BvcnQgKyAweGZmKTsKKwkJCQlmcmVlX2lycShob3N0LT5pcnEsIGhvc3QpOworCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQgKHBkZXYsIFJFU19TSVpFICsgUkVRX1NJWkUsIGhvc3RkYXRhLT5yZXMsIGJ1c2FkZHIpOworCQkJCXNjc2lfdW5yZWdpc3Rlcihob3N0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJb3V0dygweDAsIGhvc3QtPmlvX3BvcnQgKyBQQ0lfU0VNQVBIT1JFKTsKKwkJCW91dHcoSENDUl9DTEVBUl9SSVNDX0lOVFIsIGhvc3QtPmlvX3BvcnQgKyBIT1NUX0hDQ1IpOworCQkJaXNwMngwMF9lbmFibGVfaXJxcyhob3N0KTsKKwkJCS8qIHdhaXQgZm9yIHRoZSBsb29wIHRvIGNvbWUgdXAgKi8KKwkJCWZvciAod2FpdF90aW1lID0gamlmZmllcyArIDEwICogSFo7IHRpbWVfYmVmb3JlKGppZmZpZXMsIHdhaXRfdGltZSkgJiYgaG9zdGRhdGEtPmFkYXB0ZXJfc3RhdGUgPT0gQVNfTE9PUF9ET1dOOykgeworCQkJICAgICAgICBiYXJyaWVyKCk7CisJCQkJY3B1X3JlbGF4KCk7CisJCQl9CisJCQlpZiAoaG9zdGRhdGEtPmFkYXB0ZXJfc3RhdGUgPT0gQVNfTE9PUF9ET1dOKSB7CisJCQkgICAgICAgIHByaW50aygicWxvZ2ljZmMlZCA6IGxpbmsgaXMgbm90IHVwXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCk7CisJCQl9CisJCQlob3N0cysrOworCQkJaG9zdGRhdGEtPmV4cGxvcmVfdGltZXIuZGF0YSA9IDA7CisJCX0KKwl9CisKKworCS8qIHRoaXMgYnVzeSBsb29wIHNob3VsZCBub3QgYmUgbmVlZGVkIGJ1dCB0aGUgaXNwMngwMCBzZWVtcyB0byBuZWVkIAorCSAgIHNvbWUgdGltZSBiZWZvcmUgcmVjb2duaXppbmcgaXQgaXMgYXR0YWNoZWQgdG8gYSBmYWJyaWMgKi8KKworI2lmIElTUDJ4MDBfRkFCUklDCisJaWYgKGhvc3RzKSB7CisJCWZvciAod2FpdF90aW1lID0gamlmZmllcyArIDUgKiBIWjsgdGltZV9iZWZvcmUoamlmZmllcywgd2FpdF90aW1lKTspIHsKKwkJCWJhcnJpZXIoKTsKKwkJCWNwdV9yZWxheCgpOworCQl9CisJfQorI2VuZGlmCisKKwlMRUFWRSgiaXNwMngwMF9kZXRlY3QiKTsKKworCXJldHVybiBob3N0czsKK30KKworCitzdGF0aWMgaW50IGlzcDJ4MDBfbWFrZV9wb3J0ZGIoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKworCXNob3J0IHBhcmFtWzhdOworCWludCBpLCBqOworCXN0cnVjdCBpc3AyeDAwX2hvc3RkYXRhICpob3N0ZGF0YTsKKworCWlzcDJ4MDBfZGlzYWJsZV9pcnFzKGhvc3QpOworCisJaG9zdGRhdGEgPSAoc3RydWN0IGlzcDJ4MDBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGE7CisJbWVtc2V0KGhvc3RkYXRhLT50ZW1wbWFwLCAwLCBzaXplb2YoaG9zdGRhdGEtPnRlbXBtYXApKTsKKworI2lmIElTUDJ4MDBfRkFCUklDCisJZm9yIChpID0gMHg4MTsgaSA8IFFMT0dJQ0ZDX01BWF9JRDsgaSsrKSB7CisJCXBhcmFtWzBdID0gTUJPWF9QT1JUX0xPR09VVDsKKwkJcGFyYW1bMV0gPSBpIDw8IDg7CisJCXBhcmFtWzJdID0gMDsKKwkJcGFyYW1bM10gPSAwOworCisJCWlzcDJ4MDBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCQlpZiAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisKKwkJCURFQlVHX0ZBQlJJQyhwcmludGsoInFsb2dpY2ZjJWQgOiBsb2dvdXQgZmFpbGVkICV4ICAleFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsIGksIHBhcmFtWzBdKSk7CisJCX0KKwl9CisjZW5kaWYKKworCisJcGFyYW1bMF0gPSBNQk9YX0dFVF9JTklUX1NDU0lfSUQ7CisKKwlpc3AyeDAwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisKKwlpZiAocGFyYW1bMF0gPT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCWhvc3RkYXRhLT5wb3J0X2lkID0gKCh1X2ludCkgcGFyYW1bM10pIDw8IDE2OworCQlob3N0ZGF0YS0+cG9ydF9pZCB8PSBwYXJhbVsyXTsKKwkJaG9zdGRhdGEtPnRlbXBtYXBbMF0ubG9vcF9pZCA9IHBhcmFtWzFdOworCQlob3N0ZGF0YS0+dGVtcG1hcFswXS53d24gPSBob3N0ZGF0YS0+d3duOworCX0KKwllbHNlIHsKKwkgICAgICAgIHByaW50aygicWxvZ2ljZmMlZCA6IGVycm9yIGdldHRpbmcgc2NzaSBpZC5cbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwl9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PVFMT0dJQ0ZDX01BWF9JRDsgaSsrKQorICAgICAgICAgICAgICAgIGhvc3RkYXRhLT50ZW1wbWFwW2ldLmxvb3BfaWQgPSBob3N0ZGF0YS0+dGVtcG1hcFswXS5sb29wX2lkOworICAgCisgICAgICAgIGZvciAoaSA9IDAsIGogPSAxOyBpIDw9IFFMT0dJQ0ZDX01BWF9MT09QX0lEOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwYXJhbVswXSA9IE1CT1hfR0VUX1BPUlRfTkFNRTsKKwkJcGFyYW1bMV0gPSAoaSA8PCA4KSAmIDB4ZmYwMDsKKworCQlpc3AyeDAwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisKKwkJaWYgKHBhcmFtWzBdID09IE1CT1hfQ09NTUFORF9DT01QTEVURSkgeworCQkJaG9zdGRhdGEtPnRlbXBtYXBbal0ubG9vcF9pZCA9IGk7CisJCQlob3N0ZGF0YS0+dGVtcG1hcFtqXS53d24gPSAoKHU2NCkgKHBhcmFtWzJdICYgMHhmZikpIDw8IDU2OworCQkJaG9zdGRhdGEtPnRlbXBtYXBbal0ud3duIHw9ICgodTY0KSAoKHBhcmFtWzJdID4+IDgpICYgMHhmZikpIDw8IDQ4OworCQkJaG9zdGRhdGEtPnRlbXBtYXBbal0ud3duIHw9ICgodTY0KSAocGFyYW1bM10gJiAweGZmKSkgPDwgNDA7CisJCQlob3N0ZGF0YS0+dGVtcG1hcFtqXS53d24gfD0gKCh1NjQpICgocGFyYW1bM10gPj4gOCkgJiAweGZmKSkgPDwgMzI7CisJCQlob3N0ZGF0YS0+dGVtcG1hcFtqXS53d24gfD0gKCh1NjQpIChwYXJhbVs2XSAmIDB4ZmYpKSA8PCAyNDsKKwkJCWhvc3RkYXRhLT50ZW1wbWFwW2pdLnd3biB8PSAoKHU2NCkgKChwYXJhbVs2XSA+PiA4KSAmIDB4ZmYpKSA8PCAxNjsKKwkJCWhvc3RkYXRhLT50ZW1wbWFwW2pdLnd3biB8PSAoKHU2NCkgKHBhcmFtWzddICYgMHhmZikpIDw8IDg7CisJCQlob3N0ZGF0YS0+dGVtcG1hcFtqXS53d24gfD0gKCh1NjQpICgocGFyYW1bN10gPj4gOCkgJiAweGZmKSk7CisKKwkJCWorKzsKKworCQl9CisJfQorCisKKyNpZiBJU1AyeDAwX0ZBQlJJQworCWlzcDJ4MDBfaW5pdF9mYWJyaWMoaG9zdCwgaG9zdGRhdGEtPnRlbXBtYXAsIGopOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDw9IFFMT0dJQ0ZDX01BWF9JRDsgaSsrKSB7CisJCWlmIChob3N0ZGF0YS0+dGVtcG1hcFtpXS53d24gIT0gaG9zdGRhdGEtPnBvcnRfZGJbaV0ud3duKSB7CisJCQlmb3IgKGogPSAwOyBqIDw9IFFMT0dJQ0ZDX01BWF9JRDsgaisrKSB7CisJCQkJaWYgKGhvc3RkYXRhLT50ZW1wbWFwW2pdLnd3biA9PSBob3N0ZGF0YS0+cG9ydF9kYltpXS53d24pIHsKKwkJCQkJaG9zdGRhdGEtPnBvcnRfZGJbaV0ubG9vcF9pZCA9IGhvc3RkYXRhLT50ZW1wbWFwW2pdLmxvb3BfaWQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChqID09IFFMT0dJQ0ZDX01BWF9JRCArIDEpCisJCQkJaG9zdGRhdGEtPnBvcnRfZGJbaV0ubG9vcF9pZCA9IGhvc3RkYXRhLT50ZW1wbWFwWzBdLmxvb3BfaWQ7CisKKwkJCWZvciAoaiA9IDA7IGogPD0gUUxPR0lDRkNfTUFYX0lEOyBqKyspIHsKKwkJCQlpZiAoaG9zdGRhdGEtPnBvcnRfZGJbal0ud3duID09IGhvc3RkYXRhLT50ZW1wbWFwW2ldLnd3biB8fCAhaG9zdGRhdGEtPnBvcnRfZGJbal0ud3duKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChqID09IFFMT0dJQ0ZDX01BWF9JRCArIDEpCisJCQkJcHJpbnRrKCJxbG9naWNmYyVkIDogVG9vIG1hbnkgc2NzaSBkZXZpY2VzLCBubyBtb3JlIHJvb20gaW4gcG9ydCBtYXAuXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCk7CisJCQlpZiAoIWhvc3RkYXRhLT5wb3J0X2RiW2pdLnd3bikgeworCQkJCWhvc3RkYXRhLT5wb3J0X2RiW2pdLmxvb3BfaWQgPSBob3N0ZGF0YS0+dGVtcG1hcFtpXS5sb29wX2lkOworCQkJCWhvc3RkYXRhLT5wb3J0X2RiW2pdLnd3biA9IGhvc3RkYXRhLT50ZW1wbWFwW2ldLnd3bjsKKwkJCX0KKwkJfSBlbHNlCisJCQlob3N0ZGF0YS0+cG9ydF9kYltpXS5sb29wX2lkID0gaG9zdGRhdGEtPnRlbXBtYXBbaV0ubG9vcF9pZDsKKworCX0KKworCWlzcDJ4MDBfZW5hYmxlX2lycXMoaG9zdCk7CisKKwlyZXR1cm4gMDsKK30KKworCisjaWYgSVNQMngwMF9GQUJSSUMKKworI2RlZmluZSBGQUJSSUNfUE9SVCAgICAgICAgICAweDdlCisjZGVmaW5lIEZBQlJJQ19DT05UUk9MTEVSICAgIDB4N2YKKyNkZWZpbmUgRkFCUklDX1NOUyAgICAgICAgICAgMHg4MAorCitpbnQgaXNwMngwMF9pbml0X2ZhYnJpYyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBzdHJ1Y3QgaWRfbmFtZV9tYXAgKnBvcnRfZGIsIGludCBjdXJfc2NzaV9pZCkKK3sKKworCXVfc2hvcnQgcGFyYW1bOF07CisJdTY0IHd3bjsKKwlpbnQgZG9uZSA9IDA7CisJdV9zaG9ydCBsb29wX2lkID0gMHg4MTsKKwl1X3Nob3J0IHNjc2lfaWQgPSBjdXJfc2NzaV9pZDsKKwl1X2ludCBwb3J0X2lkOworCXN0cnVjdCBzbnNfY2IgKnJlcTsKKwl1X2NoYXIgKnNuc19yZXNwb25zZTsKKwlkbWFfYWRkcl90IGJ1c2FkZHI7CisJc3RydWN0IGlzcDJ4MDBfaG9zdGRhdGEgKmhvc3RkYXRhOworCisJaG9zdGRhdGEgPSAoc3RydWN0IGlzcDJ4MDBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGE7CisJCisJREVCVUdfRkFCUklDKHByaW50aygicWxvZ2ljZmMlZCA6IENoZWNraW5nIGZvciBhIGZhYnJpYy5cbiIsIGhvc3RkYXRhLT5ob3N0X2lkKSk7CisJcGFyYW1bMF0gPSBNQk9YX0dFVF9QT1JUX05BTUU7CisJcGFyYW1bMV0gPSAodTE2KUZBQlJJQ19QT1JUIDw8IDg7CisKKwlpc3AyeDAwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisKKwlpZiAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCURFQlVHX0ZBQlJJQyhwcmludGsoInFsb2dpY2ZjJWQgOiBmYWJyaWMgY2hlY2sgcmVzdWx0ICV4XG4iLCBob3N0ZGF0YS0+aG9zdF9pZCwgcGFyYW1bMF0pKTsKKwkJcmV0dXJuIDA7CisJfQorCXByaW50aygicWxvZ2ljZmMlZCA6IEZhYnJpYyBmb3VuZC5cbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKworCXJlcSA9IChzdHJ1Y3Qgc25zX2NiICopcGNpX2FsbG9jX2NvbnNpc3RlbnQoaG9zdGRhdGEtPnBjaV9kZXYsIHNpemVvZigqcmVxKSArIDYwOCwgJmJ1c2FkZHIpOworCQorCWlmICghcmVxKXsKKwkJcHJpbnRrKCJxbG9naWNmYyVkIDogQ291bGQgbm90IGFsbG9jYXRlIERNQSByZXNvdXJjZXMgZm9yIGZhYnJpYyBpbml0aWFsaXphdGlvblxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCQlyZXR1cm4gMDsKKwl9CisJc25zX3Jlc3BvbnNlID0gKHVfY2hhciAqKShyZXEgKyAxKTsKKworCWlmIChob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSAmIEFTX1JFRE9fTE9PUF9QT1JUREIpeworCSAgICAgICAgbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsKKwkKKwkJcmVxLT5sZW4gPSBjcHVfdG9fbGUxNig4KTsKKwkJcmVxLT5yZXNwb25zZV9sb3cgPSBjcHVfdG9fbGUzMihwY2k2NF9kbWFfbG8zMihidXNhZGRyICsgc2l6ZW9mKCpyZXEpKSk7CisJCXJlcS0+cmVzcG9uc2VfaGlnaCA9IGNwdV90b19sZTMyKHBjaTY0X2RtYV9oaTMyKGJ1c2FkZHIgKyBzaXplb2YoKnJlcSkpKTsKKwkJcmVxLT5zdWJfbGVuID0gY3B1X3RvX2xlMTYoMjIpOworCQlyZXEtPmRhdGFbMF0gPSAweDE3OworCQlyZXEtPmRhdGFbMV0gPSAweDAyOworCQlyZXEtPmRhdGFbOF0gPSAodV9jaGFyKSAoaG9zdGRhdGEtPnBvcnRfaWQgJiAweGZmKTsKKwkJcmVxLT5kYXRhWzldID0gKHVfY2hhcikgKGhvc3RkYXRhLT5wb3J0X2lkID4+IDggJiAweGZmKTsKKwkJcmVxLT5kYXRhWzEwXSA9ICh1X2NoYXIpIChob3N0ZGF0YS0+cG9ydF9pZCA+PiAxNiAmIDB4ZmYpOworCQlyZXEtPmRhdGFbMTNdID0gMHgwMTsKKwkJcGFyYW1bMF0gPSBNQk9YX1NFTkRfU05TOworCQlwYXJhbVsxXSA9IDMwOworCQlwYXJhbVsyXSA9IHBjaTY0X2RtYV9sbzMyKGJ1c2FkZHIpID4+IDE2OworCQlwYXJhbVszXSA9IHBjaTY0X2RtYV9sbzMyKGJ1c2FkZHIpOworCQlwYXJhbVs2XSA9IHBjaTY0X2RtYV9oaTMyKGJ1c2FkZHIpID4+IDE2OworCQlwYXJhbVs3XSA9IHBjaTY0X2RtYV9oaTMyKGJ1c2FkZHIpOworCisJCWlzcDJ4MDBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKwkKKwkJaWYgKHBhcmFtWzBdICE9IE1CT1hfQ09NTUFORF9DT01QTEVURSkKKwkJICAgICAgICBwcmludGsoInFsb2dpY2ZjJWQgOiBlcnJvciBzZW5kaW5nIFJGQy00XG4iLCBob3N0ZGF0YS0+aG9zdF9pZCk7CisJfQorCisJcG9ydF9pZCA9IGhvc3RkYXRhLT5wb3J0X2lkOworCXdoaWxlICghZG9uZSkgeworCQltZW1zZXQocmVxLCAwLCBzaXplb2YoKnJlcSkpOworCisJCXJlcS0+bGVuID0gY3B1X3RvX2xlMTYoMzA0KTsKKwkJcmVxLT5yZXNwb25zZV9sb3cgPSBjcHVfdG9fbGUzMihwY2k2NF9kbWFfbG8zMihidXNhZGRyICsgc2l6ZW9mKCpyZXEpKSk7CisJCXJlcS0+cmVzcG9uc2VfaGlnaCA9IGNwdV90b19sZTMyKHBjaTY0X2RtYV9oaTMyKGJ1c2FkZHIgKyBzaXplb2YoKnJlcSkpKTsKKwkJcmVxLT5zdWJfbGVuID0gY3B1X3RvX2xlMTYoNik7CisJCXJlcS0+ZGF0YVswXSA9IDB4MDA7CisJCXJlcS0+ZGF0YVsxXSA9IDB4MDE7CisJCXJlcS0+ZGF0YVs4XSA9ICh1X2NoYXIpIChwb3J0X2lkICYgMHhmZik7CisJCXJlcS0+ZGF0YVs5XSA9ICh1X2NoYXIpIChwb3J0X2lkID4+IDggJiAweGZmKTsKKwkJcmVxLT5kYXRhWzEwXSA9ICh1X2NoYXIpIChwb3J0X2lkID4+IDE2ICYgMHhmZik7CisKKwkJcGFyYW1bMF0gPSBNQk9YX1NFTkRfU05TOworCQlwYXJhbVsxXSA9IDE0OworCQlwYXJhbVsyXSA9IHBjaTY0X2RtYV9sbzMyKGJ1c2FkZHIpID4+IDE2OworCQlwYXJhbVszXSA9IHBjaTY0X2RtYV9sbzMyKGJ1c2FkZHIpOworCQlwYXJhbVs2XSA9IHBjaTY0X2RtYV9oaTMyKGJ1c2FkZHIpID4+IDE2OworCQlwYXJhbVs3XSA9IHBjaTY0X2RtYV9oaTMyKGJ1c2FkZHIpOworCisJCWlzcDJ4MDBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCQlpZiAocGFyYW1bMF0gPT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCQlERUJVR19GQUJSSUMocHJpbnRrKCJxbG9naWNmYyVkIDogZm91bmQgbm9kZSAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiLCBob3N0ZGF0YS0+aG9zdF9pZCwgc25zX3Jlc3BvbnNlWzIwXSwgc25zX3Jlc3BvbnNlWzIxXSwgc25zX3Jlc3BvbnNlWzIyXSwgc25zX3Jlc3BvbnNlWzIzXSwgc25zX3Jlc3BvbnNlWzI0XSwgc25zX3Jlc3BvbnNlWzI1XSwgc25zX3Jlc3BvbnNlWzI2XSwgc25zX3Jlc3BvbnNlWzI3XSkpOworCQkJREVCVUdfRkFCUklDKHByaW50aygiICBwb3J0IGlkOiAlMDJ4JTAyeCUwMnhcbiIsIHNuc19yZXNwb25zZVsxN10sIHNuc19yZXNwb25zZVsxOF0sIHNuc19yZXNwb25zZVsxOV0pKTsKKwkJCXBvcnRfaWQgPSAoKHVfaW50KSBzbnNfcmVzcG9uc2VbMTddKSA8PCAxNjsKKwkJCXBvcnRfaWQgfD0gKCh1X2ludCkgc25zX3Jlc3BvbnNlWzE4XSkgPDwgODsKKwkJCXBvcnRfaWQgfD0gKCh1X2ludCkgc25zX3Jlc3BvbnNlWzE5XSk7CisJCQl3d24gPSAoKHU2NCkgc25zX3Jlc3BvbnNlWzIwXSkgPDwgNTY7CisJCQl3d24gfD0gKCh1NjQpIHNuc19yZXNwb25zZVsyMV0pIDw8IDQ4OworCQkJd3duIHw9ICgodTY0KSBzbnNfcmVzcG9uc2VbMjJdKSA8PCA0MDsKKwkJCXd3biB8PSAoKHU2NCkgc25zX3Jlc3BvbnNlWzIzXSkgPDwgMzI7CisJCQl3d24gfD0gKCh1NjQpIHNuc19yZXNwb25zZVsyNF0pIDw8IDI0OworCQkJd3duIHw9ICgodTY0KSBzbnNfcmVzcG9uc2VbMjVdKSA8PCAxNjsKKwkJCXd3biB8PSAoKHU2NCkgc25zX3Jlc3BvbnNlWzI2XSkgPDwgODsKKwkJCXd3biB8PSAoKHU2NCkgc25zX3Jlc3BvbnNlWzI3XSk7CisJCQlpZiAoaG9zdGRhdGEtPnBvcnRfaWQgPj4gOCAhPSBwb3J0X2lkID4+IDgpIHsKKwkJCQlERUJVR19GQUJSSUMocHJpbnRrKCJxbG9naWNmYyVkIDogYWRkaW5nIGEgZmFicmljIHBvcnQ6ICV4XG4iLCBob3N0ZGF0YS0+aG9zdF9pZCwgcG9ydF9pZCkpOworCQkJCXBhcmFtWzBdID0gTUJPWF9QT1JUX0xPR0lOOworCQkJCXBhcmFtWzFdID0gbG9vcF9pZCA8PCA4OworCQkJCXBhcmFtWzJdID0gKHVfc2hvcnQpIChwb3J0X2lkID4+IDE2KTsKKwkJCQlwYXJhbVszXSA9ICh1X3Nob3J0KSAocG9ydF9pZCk7CisKKwkJCQlpc3AyeDAwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisKKwkJCQlpZiAocGFyYW1bMF0gPT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCQkJCXBvcnRfZGJbc2NzaV9pZF0ud3duID0gd3duOworCQkJCQlwb3J0X2RiW3Njc2lfaWRdLmxvb3BfaWQgPSBsb29wX2lkOworCQkJCQlsb29wX2lkKys7CisJCQkJCXNjc2lfaWQrKzsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGsoInFsb2dpY2ZjJWQgOiBFcnJvciBwZXJmb3JtaW5nIHBvcnQgbG9naW4gJXhcbiIsIGhvc3RkYXRhLT5ob3N0X2lkLCBwYXJhbVswXSk7CisJCQkJCURFQlVHX0ZBQlJJQyhwcmludGsoInFsb2dpY2ZjJWQgOiBsb29wX2lkOiAleFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsIGxvb3BfaWQpKTsKKwkJCQkJcGFyYW1bMF0gPSBNQk9YX1BPUlRfTE9HT1VUOworCQkJCQlwYXJhbVsxXSA9IGxvb3BfaWQgPDwgODsKKwkJCQkJcGFyYW1bMl0gPSAwOworCQkJCQlwYXJhbVszXSA9IDA7CisKKwkJCQkJaXNwMngwMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCQkJCQkKKwkJCQl9CisKKwkJCX0KKwkJCWlmIChob3N0ZGF0YS0+cG9ydF9pZCA9PSBwb3J0X2lkKQorCQkJCWRvbmUgPSAxOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCJxbG9naWNmYyVkIDogR2V0IEFsbCBOZXh0IGZhaWxlZCAleC5cbiIsIGhvc3RkYXRhLT5ob3N0X2lkLCBwYXJhbVswXSk7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhvc3RkYXRhLT5wY2lfZGV2LCBzaXplb2YoKnJlcSkgKyA2MDgsIHJlcSwgYnVzYWRkcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXBjaV9mcmVlX2NvbnNpc3RlbnQoaG9zdGRhdGEtPnBjaV9kZXYsIHNpemVvZigqcmVxKSArIDYwOCwgcmVxLCBidXNhZGRyKTsKKwlyZXR1cm4gMTsKK30KKworI2VuZGlmCQkJCS8qIElTUDJ4MDBfRkFCUklDICovCisKKworc3RhdGljIGludCBpc3AyeDAwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisJZG1hX2FkZHJfdCBidXNhZGRyOworCisJRU5URVIoImlzcDJ4MDBfcmVsZWFzZSIpOworCisJaG9zdGRhdGEgPSAoc3RydWN0IGlzcDJ4MDBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGE7CisKKwlvdXR3KDB4MCwgaG9zdC0+aW9fcG9ydCArIFBDSV9JTlRFUl9DVEwpOworCWZyZWVfaXJxKGhvc3QtPmlycSwgaG9zdCk7CisKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCAweGZmKTsKKworCWJ1c2FkZHIgPSBwY2k2NF9kbWFfYnVpbGQobGUzMl90b19jcHUoaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2sucmVzX3F1ZXVlX2FkZHJfaGlnaCksCisJCQkJICBsZTMyX3RvX2NwdShob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5yZXNfcXVldWVfYWRkcl9sbykpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQoaG9zdGRhdGEtPnBjaV9kZXYsIFJFU19TSVpFICsgUkVRX1NJWkUsIGhvc3RkYXRhLT5yZXMsIGJ1c2FkZHIpOworCisJTEVBVkUoImlzcDJ4MDBfcmVsZWFzZSIpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmlzcDJ4MDBfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0YXRpYyBjaGFyIGJ1Zls4MF07CisJc3RydWN0IGlzcDJ4MDBfaG9zdGRhdGEgKmhvc3RkYXRhOworCUVOVEVSKCJpc3AyeDAwX2luZm8iKTsKKworCWhvc3RkYXRhID0gKHN0cnVjdCBpc3AyeDAwX2hvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhOworCXNwcmludGYoYnVmLAorCQkiUUxvZ2ljIElTUCUwNHggU0NTSSBvbiBQQ0kgYnVzICUwMnggZGV2aWNlICUwMnggaXJxICVkIGJhc2UgMHglbHgiLAorCQlob3N0ZGF0YS0+cGNpX2Rldi0+ZGV2aWNlLCBob3N0ZGF0YS0+cGNpX2Rldi0+YnVzLT5udW1iZXIsIGhvc3RkYXRhLT5wY2lfZGV2LT5kZXZmbiwgaG9zdC0+aXJxLAorCQlob3N0LT5pb19wb3J0KTsKKworCisJTEVBVkUoImlzcDJ4MDBfaW5mbyIpOworCisJcmV0dXJuIGJ1ZjsKK30KKworCisvKgorICogVGhlIG1pZGRsZSBTQ1NJIGxheWVyIGVuc3VyZXMgdGhhdCBxdWV1ZWNvbW1hbmQgbmV2ZXIgZ2V0cyBpbnZva2VkCisgKiBjb25jdXJyZW50bHkgd2l0aCBpdHNlbGYgb3IgdGhlIGludGVycnVwdCBoYW5kbGVyICh0aG91Z2ggdGhlCisgKiBpbnRlcnJ1cHQgaGFuZGxlciBtYXkgY2FsbCB0aGlzIHJvdXRpbmUgYXMgcGFydCBvZgorICogcmVxdWVzdC1jb21wbGV0aW9uIGhhbmRsaW5nKS4KKyAqLworc3RhdGljIGludCBpc3AyeDAwX3F1ZXVlY29tbWFuZChTY3NpX0NtbmQgKiBDbW5kLCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSkKK3sKKwlpbnQgaSwgc2dfY291bnQsIG4sIG51bV9mcmVlOworCXVfaW50IGluX3B0ciwgb3V0X3B0cjsKKwlzdHJ1Y3QgZGF0YXNlZyAqZHM7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlzdHJ1Y3QgQ29tbWFuZF9FbnRyeSAqY21kOworCXN0cnVjdCBDb250aW51YXRpb25fRW50cnkgKmNvbnQ7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisKKwlFTlRFUigiaXNwMngwMF9xdWV1ZWNvbW1hbmQiKTsKKworCWhvc3QgPSBDbW5kLT5kZXZpY2UtPmhvc3Q7CisJaG9zdGRhdGEgPSAoc3RydWN0IGlzcDJ4MDBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGE7CisJQ21uZC0+c2NzaV9kb25lID0gZG9uZTsKKworCURFQlVHKGlzcDJ4MDBfcHJpbnRfc2NzaV9jbWQoQ21uZCkpOworCisJaWYgKGhvc3RkYXRhLT5hZGFwdGVyX3N0YXRlICYgQVNfUkVET19GQUJSSUNfUE9SVERCIHx8IGhvc3RkYXRhLT5hZGFwdGVyX3N0YXRlICYgQVNfUkVET19MT09QX1BPUlREQikgeworCQlpc3AyeDAwX21ha2VfcG9ydGRiKGhvc3QpOworCQlob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSA9IEFTX0xPT1BfR09PRDsKKwkJcHJpbnRrKCJxbG9naWNmYyVkIDogUG9ydCBEYXRhYmFzZVxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCQlmb3IgKGkgPSAwOyBob3N0ZGF0YS0+cG9ydF9kYltpXS53d24gIT0gMDsgaSsrKSB7CisJCQlwcmludGsoInd3bjogJTA4eCUwOHggIHNjc2lfaWQ6ICV4ICBsb29wX2lkOiAiLCAodV9pbnQpIChob3N0ZGF0YS0+cG9ydF9kYltpXS53d24gPj4gMzIpLCAodV9pbnQpIGhvc3RkYXRhLT5wb3J0X2RiW2ldLnd3biwgaSk7CisJCQlpZiAoaG9zdGRhdGEtPnBvcnRfZGJbaV0ubG9vcF9pZCAhPSBob3N0ZGF0YS0+cG9ydF9kYlswXS5sb29wX2lkIHx8IGkgPT0gMCkKKwkJCSAgICAgICAgcHJpbnRrKCIleCIsIGhvc3RkYXRhLT5wb3J0X2RiW2ldLmxvb3BfaWQpOworCQkJZWxzZQorCQkJICAgICAgICBwcmludGsoIk5vdCBBdmFpbGFibGUiKTsKKwkJCXByaW50aygiXG4iKTsKKwkJfQorCX0KKwlpZiAoaG9zdGRhdGEtPmFkYXB0ZXJfc3RhdGUgPT0gQVNfRklSTVdBUkVfREVBRCkgeworCQlwcmludGsoInFsb2dpY2ZjJWQgOiBUaGUgZmlybXdhcmUgaXMgZGVhZCwganVzdCByZXR1cm4uXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCk7CisJCWhvc3QtPm1heF9pZCA9IDA7CisJCXJldHVybiAwOworCX0KKworCW91dF9wdHIgPSBpbncoaG9zdC0+aW9fcG9ydCArIE1CT1g0KTsKKwlpbl9wdHIgPSBob3N0ZGF0YS0+cmVxX2luX3B0cjsKKworCURFQlVHKHByaW50aygicWxvZ2ljZmMlZCA6IHJlcXVlc3QgcXVldWUgZGVwdGggJWRcbiIsIGhvc3RkYXRhLT5ob3N0X2lkLAorCQkgICAgIFJFUV9RVUVVRV9ERVBUSChpbl9wdHIsIG91dF9wdHIpKSk7CisKKwljbWQgPSAoc3RydWN0IENvbW1hbmRfRW50cnkgKikgJmhvc3RkYXRhLT5yZXFbaW5fcHRyKlFVRVVFX0VOVFJZX0xFTl07CisJaW5fcHRyID0gKGluX3B0ciArIDEpICYgUUxPR0lDRkNfUkVRX1FVRVVFX0xFTjsKKwlpZiAoaW5fcHRyID09IG91dF9wdHIpIHsKKwkJREVCVUcocHJpbnRrKCJxbG9naWNmYyVkIDogcmVxdWVzdCBxdWV1ZSBvdmVyZmxvd1xuIiwgaG9zdGRhdGEtPmhvc3RfaWQpKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChob3N0ZGF0YS0+c2VuZF9tYXJrZXIpIHsKKwkJc3RydWN0IE1hcmtlcl9FbnRyeSAqbWFya2VyOworCisJCVRSQUNFKCJxdWV1ZSBtYXJrZXIiLCBpbl9wdHIsIDApOworCisJCURFQlVHKHByaW50aygicWxvZ2ljZmMlZCA6IGFkZGluZyBtYXJrZXIgZW50cnlcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKSk7CisJCW1hcmtlciA9IChzdHJ1Y3QgTWFya2VyX0VudHJ5ICopIGNtZDsKKwkJbWVtc2V0KG1hcmtlciwgMCwgc2l6ZW9mKHN0cnVjdCBNYXJrZXJfRW50cnkpKTsKKworCQltYXJrZXItPmhkci5lbnRyeV90eXBlID0gRU5UUllfTUFSS0VSOworCQltYXJrZXItPmhkci5lbnRyeV9jbnQgPSAxOworCQltYXJrZXItPm1vZGlmaWVyID0gU1lOQ19BTEw7CisKKwkJaG9zdGRhdGEtPnNlbmRfbWFya2VyID0gMDsKKworCQlpZiAoKChpbl9wdHIgKyAxKSAmIFFMT0dJQ0ZDX1JFUV9RVUVVRV9MRU4pID09IG91dF9wdHIpIHsKKwkJCW91dHcoaW5fcHRyLCBob3N0LT5pb19wb3J0ICsgTUJPWDQpOworCQkJaG9zdGRhdGEtPnJlcV9pbl9wdHIgPSBpbl9wdHI7CisJCQlERUJVRyhwcmludGsoInFsb2dpY2ZjJWQgOiByZXF1ZXN0IHF1ZXVlIG92ZXJmbG93XG4iLCBob3N0ZGF0YS0+aG9zdF9pZCkpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJY21kID0gKHN0cnVjdCBDb21tYW5kX0VudHJ5ICopICZob3N0ZGF0YS0+cmVxW2luX3B0cipRVUVVRV9FTlRSWV9MRU5dOworCQlpbl9wdHIgPSAoaW5fcHRyICsgMSkgJiBRTE9HSUNGQ19SRVFfUVVFVUVfTEVOOworCX0KKwlUUkFDRSgicXVldWUgY29tbWFuZCIsIGluX3B0ciwgQ21uZCk7CisKKwltZW1zZXQoY21kLCAwLCBzaXplb2Yoc3RydWN0IENvbW1hbmRfRW50cnkpKTsKKworCS8qIGZpbmQgYSBmcmVlIGhhbmRsZSBtYXBwaW5nIHNsb3QgKi8KKwlmb3IgKGkgPSBpbl9wdHI7IGkgIT0gKGluX3B0ciAtIDEpICYmIGhvc3RkYXRhLT5oYW5kbGVfcHRyc1tpXTsgaSA9ICgoaSArIDEpICUgKFFMT0dJQ0ZDX1JFUV9RVUVVRV9MRU4gKyAxKSkpOworCisJaWYgKCFob3N0ZGF0YS0+aGFuZGxlX3B0cnNbaV0pIHsKKwkJY21kLT5oYW5kbGUgPSBjcHVfdG9fbGUzMihpKTsKKwkJaG9zdGRhdGEtPmhhbmRsZV9wdHJzW2ldID0gQ21uZDsKKwkJaG9zdGRhdGEtPmhhbmRsZV9zZXJpYWxzW2ldID0gQ21uZC0+c2VyaWFsX251bWJlcjsKKwl9IGVsc2UgeworCQlwcmludGsoInFsb2dpY2ZjJWQgOiBubyBoYW5kbGUgc2xvdHMsIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCk7CisJCXByaW50aygiaG9zdGRhdGEtPnF1ZXVlZCBpcyAleCwgaW5fcHRyOiAleFxuIiwgaG9zdGRhdGEtPnF1ZXVlZCwgaW5fcHRyKTsKKwkJZm9yIChpID0gMDsgaSA8PSBRTE9HSUNGQ19SRVFfUVVFVUVfTEVOOyBpKyspeworCQkJaWYgKCFob3N0ZGF0YS0+aGFuZGxlX3B0cnNbaV0peworCQkJCXByaW50aygic2xvdCAlZCBoYXMgJXBcbiIsIGksIGhvc3RkYXRhLT5oYW5kbGVfcHRyc1tpXSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJY21kLT5oZHIuZW50cnlfdHlwZSA9IEVOVFJZX0NPTU1BTkQ7CisJY21kLT5oZHIuZW50cnlfY250ID0gMTsKKwljbWQtPnRhcmdldF9sdW4gPSBDbW5kLT5kZXZpY2UtPmx1bjsKKwljbWQtPmV4cGFuZGVkX2x1biA9IGNwdV90b19sZTE2KENtbmQtPmRldmljZS0+bHVuKTsKKyNpZiBJU1AyeDAwX1BPUlREQgorCWNtZC0+dGFyZ2V0X2lkID0gaG9zdGRhdGEtPnBvcnRfZGJbQ21uZC0+ZGV2aWNlLT5pZF0ubG9vcF9pZDsKKyNlbHNlCisJY21kLT50YXJnZXRfaWQgPSBDbW5kLT50YXJnZXQ7CisjZW5kaWYKKwljbWQtPnRvdGFsX2J5dGVfY250ID0gY3B1X3RvX2xlMzIoQ21uZC0+cmVxdWVzdF9idWZmbGVuKTsKKwljbWQtPnRpbWVfb3V0ID0gMDsKKwltZW1jcHkoY21kLT5jZGIsIENtbmQtPmNtbmQsIENtbmQtPmNtZF9sZW4pOworCisJaWYgKENtbmQtPnVzZV9zZykgeworCQlzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgQ21uZC0+cmVxdWVzdF9idWZmZXI7CisJCXNnX2NvdW50ID0gcGNpX21hcF9zZyhob3N0ZGF0YS0+cGNpX2Rldiwgc2csIENtbmQtPnVzZV9zZywgc2NzaV90b19wY2lfZG1hX2RpcihDbW5kLT5zY19kYXRhX2RpcmVjdGlvbikpOworCQljbWQtPnNlZ21lbnRfY250ID0gY3B1X3RvX2xlMTYoc2dfY291bnQpOworCQlkcyA9IGNtZC0+ZGF0YXNlZzsKKwkJLyogZmlsbCBpbiBmaXJzdCB0d28gc2cgZW50cmllczogKi8KKwkJbiA9IHNnX2NvdW50OworCQlpZiAobiA+IERBVEFTRUdTX1BFUl9DT01NQU5EKQorCQkJbiA9IERBVEFTRUdTX1BFUl9DT01NQU5EOworCisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCWRzW2ldLmRfYmFzZSA9IGNwdV90b19sZTMyKHBjaTY0X2RtYV9sbzMyKHNnX2RtYV9hZGRyZXNzKHNnKSkpOworCQkJZHNbaV0uZF9iYXNlX2hpID0gY3B1X3RvX2xlMzIocGNpNjRfZG1hX2hpMzIoc2dfZG1hX2FkZHJlc3Moc2cpKSk7CisJCQlkc1tpXS5kX2NvdW50ID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzZykpOworCQkJKytzZzsKKwkJfQorCQlzZ19jb3VudCAtPSBEQVRBU0VHU19QRVJfQ09NTUFORDsKKworCQl3aGlsZSAoc2dfY291bnQgPiAwKSB7CisJCQkrK2NtZC0+aGRyLmVudHJ5X2NudDsKKwkJCWNvbnQgPSAoc3RydWN0IENvbnRpbnVhdGlvbl9FbnRyeSAqKQorCQkJICAgICZob3N0ZGF0YS0+cmVxW2luX3B0cipRVUVVRV9FTlRSWV9MRU5dOworCQkJbWVtc2V0KGNvbnQsIDAsIHNpemVvZihzdHJ1Y3QgQ29udGludWF0aW9uX0VudHJ5KSk7CisJCQlpbl9wdHIgPSAoaW5fcHRyICsgMSkgJiBRTE9HSUNGQ19SRVFfUVVFVUVfTEVOOworCQkJaWYgKGluX3B0ciA9PSBvdXRfcHRyKSB7CisJCQkJREVCVUcocHJpbnRrKCJxbG9naWNmYyVkIDogdW5leHBlY3RlZCByZXF1ZXN0IHF1ZXVlIG92ZXJmbG93XG4iLCBob3N0ZGF0YS0+aG9zdF9pZCkpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJVFJBQ0UoInF1ZXVlIGNvbnRpbnVhdGlvbiIsIGluX3B0ciwgMCk7CisJCQljb250LT5oZHIuZW50cnlfdHlwZSA9IEVOVFJZX0NPTlRJTlVBVElPTjsKKwkJCWRzID0gY29udC0+ZGF0YXNlZzsKKwkJCW4gPSBzZ19jb3VudDsKKwkJCWlmIChuID4gREFUQVNFR1NfUEVSX0NPTlQpCisJCQkJbiA9IERBVEFTRUdTX1BFUl9DT05UOworCQkJZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworCQkJCWRzW2ldLmRfYmFzZSA9IGNwdV90b19sZTMyKHBjaTY0X2RtYV9sbzMyKHNnX2RtYV9hZGRyZXNzKHNnKSkpOworCQkJCWRzW2ldLmRfYmFzZV9oaSA9IGNwdV90b19sZTMyKHBjaTY0X2RtYV9oaTMyKHNnX2RtYV9hZGRyZXNzKHNnKSkpOworCQkJCWRzW2ldLmRfY291bnQgPSBjcHVfdG9fbGUzMihzZ19kbWFfbGVuKHNnKSk7CisJCQkJKytzZzsKKwkJCX0KKwkJCXNnX2NvdW50IC09IG47CisJCX0KKwl9IGVsc2UgaWYgKENtbmQtPnJlcXVlc3RfYnVmZmxlbiAmJiBDbW5kLT5zY19kYXRhX2RpcmVjdGlvbiAhPSBQQ0lfRE1BX05PTkUpIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoQ21uZC0+cmVxdWVzdF9idWZmZXIpOworCQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IG9mZnNldF9pbl9wYWdlKENtbmQtPnJlcXVlc3RfYnVmZmVyKTsKKwkJZG1hX2FkZHJfdCBidXNhZGRyID0gcGNpX21hcF9wYWdlKGhvc3RkYXRhLT5wY2lfZGV2LAorCQkJCQkJICBwYWdlLCBvZmZzZXQsCisJCQkJCQkgIENtbmQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkJCSAgc2NzaV90b19wY2lfZG1hX2RpcihDbW5kLT5zY19kYXRhX2RpcmVjdGlvbikpOworCQlDbW5kLT5TQ3AuZG1hX2hhbmRsZSA9IGJ1c2FkZHI7CisKKwkJY21kLT5kYXRhc2VnWzBdLmRfYmFzZSA9IGNwdV90b19sZTMyKHBjaTY0X2RtYV9sbzMyKGJ1c2FkZHIpKTsKKwkJY21kLT5kYXRhc2VnWzBdLmRfYmFzZV9oaSA9IGNwdV90b19sZTMyKHBjaTY0X2RtYV9oaTMyKGJ1c2FkZHIpKTsKKwkJY21kLT5kYXRhc2VnWzBdLmRfY291bnQgPSBjcHVfdG9fbGUzMihDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCQljbWQtPnNlZ21lbnRfY250ID0gY3B1X3RvX2xlMTYoMSk7CisJfSBlbHNlIHsKKwkJY21kLT5kYXRhc2VnWzBdLmRfYmFzZSA9IDA7CisJCWNtZC0+ZGF0YXNlZ1swXS5kX2Jhc2VfaGkgPSAwOworCQljbWQtPnNlZ21lbnRfY250ID0gY3B1X3RvX2xlMTYoMSk7IC8qIFNob3VsZG4ndCB0aGlzIGJlIDA/ICovCisJfQorCisJaWYgKENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uID09IFNDU0lfREFUQV9XUklURSkKKwkJY21kLT5jb250cm9sX2ZsYWdzID0gY3B1X3RvX2xlMTYoQ0ZMQUdfV1JJVEUpOworCWVsc2UgCisJCWNtZC0+Y29udHJvbF9mbGFncyA9IGNwdV90b19sZTE2KENGTEFHX1JFQUQpOworCisJaWYgKENtbmQtPmRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCkgeworCQlpZiAoKGppZmZpZXMgLSBob3N0ZGF0YS0+dGFnX2FnZXNbQ21uZC0+ZGV2aWNlLT5pZF0pID4gKDIgKiBJU1BfVElNRU9VVCkpIHsKKwkJCWNtZC0+Y29udHJvbF9mbGFncyB8PSBjcHVfdG9fbGUxNihDRkxBR19PUkRFUkVEX1RBRyk7CisJCQlob3N0ZGF0YS0+dGFnX2FnZXNbQ21uZC0+ZGV2aWNlLT5pZF0gPSBqaWZmaWVzOworCQl9IGVsc2UKKwkJCXN3aXRjaCAoQ21uZC0+dGFnKSB7CisJCQljYXNlIEhFQURfT0ZfUVVFVUVfVEFHOgorCQkJCWNtZC0+Y29udHJvbF9mbGFncyB8PSBjcHVfdG9fbGUxNihDRkxBR19IRUFEX1RBRyk7CisJCQkJYnJlYWs7CisJCQljYXNlIE9SREVSRURfUVVFVUVfVEFHOgorCQkJCWNtZC0+Y29udHJvbF9mbGFncyB8PSBjcHVfdG9fbGUxNihDRkxBR19PUkRFUkVEX1RBRyk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWNtZC0+Y29udHJvbF9mbGFncyB8PSBjcHVfdG9fbGUxNihDRkxBR19TSU1QTEVfVEFHKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwkvKgorCSAqIFRFU1RfVU5JVF9SRUFEWSBjb21tYW5kcyBmcm9tIHNjc2lfc2NhbiB3aWxsIGZhaWwgZHVlIHRvICJvdmVybGFwcGVkCisJICogY29tbWFuZHMgYXR0ZW1wdGVkIiB1bmxlc3Mgd2Ugc2V0dXAgYXQgbGVhc3QgYSBzaW1wbGUgcXVldWUgKG1pZGxheWVyIAorCSAqIHdpbGwgZW1iZWxpc2ggdGhpcyBvbmNlIGl0IGNhbiBkbyBhbiBJTlFVSVJZIGNvbW1hbmQgdG8gdGhlIGRldmljZSkKKwkgKi8KKwllbHNlCisJCWNtZC0+Y29udHJvbF9mbGFncyB8PSBjcHVfdG9fbGUxNihDRkxBR19TSU1QTEVfVEFHKTsKKwlvdXR3KGluX3B0ciwgaG9zdC0+aW9fcG9ydCArIE1CT1g0KTsKKwlob3N0ZGF0YS0+cmVxX2luX3B0ciA9IGluX3B0cjsKKworCWhvc3RkYXRhLT5xdWV1ZWQrKzsKKworCW51bV9mcmVlID0gUUxPR0lDRkNfUkVRX1FVRVVFX0xFTiAtIFJFUV9RVUVVRV9ERVBUSChpbl9wdHIsIG91dF9wdHIpOworCW51bV9mcmVlID0gKG51bV9mcmVlID4gMikgPyBudW1fZnJlZSAtIDIgOiAwOworICAgICAgIGhvc3QtPmNhbl9xdWV1ZSA9IGhvc3QtPmhvc3RfYnVzeSArIG51bV9mcmVlOworCWlmIChob3N0LT5jYW5fcXVldWUgPiBRTE9HSUNGQ19SRVFfUVVFVUVfTEVOKQorCQlob3N0LT5jYW5fcXVldWUgPSBRTE9HSUNGQ19SRVFfUVVFVUVfTEVOOworCWhvc3QtPnNnX3RhYmxlc2l6ZSA9IFFMT0dJQ0ZDX01BWF9TRyhudW1fZnJlZSk7CisKKwlMRUFWRSgiaXNwMngwMF9xdWV1ZWNvbW1hbmQiKTsKKworCXJldHVybiAwOworfQorCisKKy8qIHdlIGhhdmUgcmVjZWl2ZWQgYW4gZXZlbnQsIHN1Y2ggYXMgYSBsaXAgb3IgYW4gUlNDTiwgd2hpY2ggbWF5IG1lYW4gdGhhdAorICogb3VyIHBvcnQgZGF0YWJhc2UgaXMgaW5jb3JyZWN0IHNvIHRoZSBwb3J0IGRhdGFiYXNlIG11c3QgYmUgcmVjcmVhdGVkLgorICovCitzdGF0aWMgdm9pZCByZWRvX3BvcnRfZGIodW5zaWduZWQgbG9uZyBhcmcpCit7CisKKyAgICAgICAgc3RydWN0IFNjc2lfSG9zdCAqIGhvc3QgPSAoc3RydWN0IFNjc2lfSG9zdCAqKSBhcmc7CisJc3RydWN0IGlzcDJ4MDBfaG9zdGRhdGEgKiBob3N0ZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJaG9zdGRhdGEgPSAoc3RydWN0IGlzcDJ4MDBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGE7CisJaG9zdGRhdGEtPmV4cGxvcmVfdGltZXIuZGF0YSA9IDA7CisJZGVsX3RpbWVyKCZob3N0ZGF0YS0+ZXhwbG9yZV90aW1lcik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCWlmIChob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSAmIEFTX1JFRE9fRkFCUklDX1BPUlREQiB8fCBob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSAmIEFTX1JFRE9fTE9PUF9QT1JUREIpIHsKKwkJaXNwMngwMF9tYWtlX3BvcnRkYihob3N0KTsKKwkJcHJpbnRrKCJxbG9naWNmYyVkIDogUG9ydCBEYXRhYmFzZVxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCQlmb3IgKGkgPSAwOyBob3N0ZGF0YS0+cG9ydF9kYltpXS53d24gIT0gMDsgaSsrKSB7CisJCQlwcmludGsoInd3bjogJTA4eCUwOHggIHNjc2lfaWQ6ICV4ICBsb29wX2lkOiAiLCAodV9pbnQpIChob3N0ZGF0YS0+cG9ydF9kYltpXS53d24gPj4gMzIpLCAodV9pbnQpIGhvc3RkYXRhLT5wb3J0X2RiW2ldLnd3biwgaSk7CisJCQlpZiAoaG9zdGRhdGEtPnBvcnRfZGJbaV0ubG9vcF9pZCAhPSBob3N0ZGF0YS0+cG9ydF9kYlswXS5sb29wX2lkIHx8IGkgPT0gMCkKKwkJCSAgICAgICAgcHJpbnRrKCIleCIsIGhvc3RkYXRhLT5wb3J0X2RiW2ldLmxvb3BfaWQpOworCQkJZWxzZQorCQkJICAgICAgICBwcmludGsoIk5vdCBBdmFpbGFibGUiKTsKKwkJCXByaW50aygiXG4iKTsKKwkJfQorCQkKKwkgICAgICAgIGZvciAoaSA9IDA7IGkgPCBRTE9HSUNGQ19SRVFfUVVFVUVfTEVOOyBpKyspeyAKKwkJICAgICAgICBpZiAoaG9zdGRhdGEtPmhhbmRsZV9wdHJzW2ldICYmIChob3N0ZGF0YS0+cG9ydF9kYltob3N0ZGF0YS0+aGFuZGxlX3B0cnNbaV0tPmRldmljZS0+aWRdLmxvb3BfaWQgPiBRTE9HSUNGQ19NQVhfTE9PUF9JRCB8fCBob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSAmIEFTX1JFRE9fTE9PUF9QT1JUREIpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvc3RkYXRhLT5wb3J0X2RiW2hvc3RkYXRhLT5oYW5kbGVfcHRyc1tpXS0+ZGV2aWNlLT5pZF0ubG9vcF9pZCAhPSBob3N0ZGF0YS0+cG9ydF9kYlswXS5sb29wX2lkKXsKKwkJCQkJU2NzaV9DbW5kICpDbW5kID0gaG9zdGRhdGEtPmhhbmRsZV9wdHJzW2ldOworCisJCQkJCSBpZiAoQ21uZC0+dXNlX3NnKQorCQkJCQkJIHBjaV91bm1hcF9zZyhob3N0ZGF0YS0+cGNpX2RldiwKKwkJCQkJCQkgICAgICAoc3RydWN0IHNjYXR0ZXJsaXN0ICopQ21uZC0+YnVmZmVyLAorCQkJCQkJCSAgICAgIENtbmQtPnVzZV9zZywKKwkJCQkJCQkgICAgICBzY3NpX3RvX3BjaV9kbWFfZGlyKENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisJCQkJCSBlbHNlIGlmIChDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4gJiYKKwkJCQkJCSAgQ21uZC0+c2NfZGF0YV9kaXJlY3Rpb24gIT0gUENJX0RNQV9OT05FKSB7CisJCQkJCQkgcGNpX3VubWFwX3BhZ2UoaG9zdGRhdGEtPnBjaV9kZXYsCisJCQkJCQkJCUNtbmQtPlNDcC5kbWFfaGFuZGxlLAorCQkJCQkJCQlDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCQkJCXNjc2lfdG9fcGNpX2RtYV9kaXIoQ21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKwkJCQkJIH0KKworCQkJCQkgaG9zdGRhdGEtPmhhbmRsZV9wdHJzW2ldLT5yZXN1bHQgPSBESURfU09GVF9FUlJPUiA8PCAxNjsKKworCQkJCQkgaWYgKGhvc3RkYXRhLT5oYW5kbGVfcHRyc1tpXS0+c2NzaV9kb25lKXsKKwkJCQkJICAgKCpob3N0ZGF0YS0+aGFuZGxlX3B0cnNbaV0tPnNjc2lfZG9uZSkgKGhvc3RkYXRhLT5oYW5kbGVfcHRyc1tpXSk7CisJCQkJCSB9CisJCQkJCSBlbHNlIHByaW50aygicWxvZ2ljZmMlZCA6IGRvbmUgaXMgbnVsbD9cbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwkJCQkJIGhvc3RkYXRhLT5oYW5kbGVfcHRyc1tpXSA9IE5VTEw7CisJCQkJCSBob3N0ZGF0YS0+aGFuZGxlX3NlcmlhbHNbaV0gPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJaG9zdGRhdGEtPmFkYXB0ZXJfc3RhdGUgPSBBU19MT09QX0dPT0Q7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworfQorCisjZGVmaW5lIEFTWU5DX0VWRU5UX0lOVEVSUlVQVAkweDAxCisKK2lycXJldHVybl90IGRvX2lzcDJ4MDBfaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGRldl9pZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJaXNwMngwMF9pbnRyX2hhbmRsZXIoaXJxLCBkZXZfaWQsIHJlZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3ZvaWQgaXNwMngwMF9pbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlTY3NpX0NtbmQgKkNtbmQ7CisJc3RydWN0IFN0YXR1c19FbnRyeSAqc3RzOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBkZXZfaWQ7CisJc3RydWN0IGlzcDJ4MDBfaG9zdGRhdGEgKmhvc3RkYXRhOworCXVfaW50IGluX3B0ciwgb3V0X3B0ciwgaGFuZGxlLCBudW1fZnJlZTsKKwl1X3Nob3J0IHN0YXR1czsKKworCUVOVEVSX0lOVFIoImlzcDJ4MDBfaW50cl9oYW5kbGVyIik7CisKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YTsKKworCURFQlVHX0lOVFIocHJpbnRrKCJxbG9naWNmYyVkIDogaW50ZXJydXB0IG9uIGxpbmUgJWRcbiIsIGhvc3RkYXRhLT5ob3N0X2lkLCBpcnEpKTsKKworCWlmICghKGludyhob3N0LT5pb19wb3J0ICsgUENJX0lOVEVSX1NUUykgJiAweDA4KSkgeworCQkvKiBzcHVyaW91cyBpbnRlcnJ1cHRzIGNhbiBoYXBwZW4gbGVnYWxseSAqLworCQlERUJVR19JTlRSKHByaW50aygicWxvZ2ljZmMlZCA6IGdvdCBzcHVyaW91cyBpbnRlcnJ1cHRcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKSk7CisJCXJldHVybjsKKwl9CisJaW5fcHRyID0gaW53KGhvc3QtPmlvX3BvcnQgKyBNQk9YNSk7CisJb3V0X3B0ciA9IGhvc3RkYXRhLT5yZXNfb3V0X3B0cjsKKworCWlmICgoaW53KGhvc3QtPmlvX3BvcnQgKyBQQ0lfU0VNQVBIT1JFKSAmIEFTWU5DX0VWRU5UX0lOVEVSUlVQVCkpIHsKKwkJc3RhdHVzID0gaW53KGhvc3QtPmlvX3BvcnQgKyBNQk9YMCk7CisKKwkJREVCVUdfSU5UUihwcmludGsoInFsb2dpY2ZjJWQgOiBtYm94IGNvbXBsZXRpb24gc3RhdHVzOiAleFxuIiwKKwkJCQkgIGhvc3RkYXRhLT5ob3N0X2lkLCBzdGF0dXMpKTsKKworCQlzd2l0Y2ggKHN0YXR1cykgeworCQljYXNlIExPT1BfVVA6CisJCWNhc2UgUE9JTlRfVE9fUE9JTlRfVVA6CisJCSAgICAgICAgcHJpbnRrKCJxbG9naWNmYyVkIDogTGluayBpcyBVcFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCQkJaG9zdGRhdGEtPmFkYXB0ZXJfc3RhdGUgPSBBU19SRURPX0ZBQlJJQ19QT1JUREIgfCBBU19SRURPX0xPT1BfUE9SVERCOworCQkJYnJlYWs7CisJCWNhc2UgTE9PUF9ET1dOOgorCQkgICAgICAgIHByaW50aygicWxvZ2ljZmMlZCA6IExpbmsgaXMgRG93blxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCQkJaG9zdGRhdGEtPmFkYXB0ZXJfc3RhdGUgPSBBU19MT09QX0RPV047CisJCQlicmVhazsKKwkJY2FzZSBDT05ORUNUSU9OX01PREU6CisJCSAgICAgICAgcHJpbnRrKCJyZWNlaXZlZCBDT05ORUNUSU9OX01PREUgaXJxICV4XG4iLCBpbncoaG9zdC0+aW9fcG9ydCArIE1CT1gxKSk7CisJCQlicmVhazsKKwkJY2FzZSBDSEFOR0VfTk9USUZJQ0FUSU9OOgorCQkgICAgICAgIHByaW50aygicWxvZ2ljZmMlZCA6IFJTQ04gUmVjZWl2ZWRcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwkJCWlmIChob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSA9PSBBU19MT09QX0dPT0QpCisJCQkJaG9zdGRhdGEtPmFkYXB0ZXJfc3RhdGUgPSBBU19SRURPX0ZBQlJJQ19QT1JUREI7CisJCQlicmVhazsJCSAgICAgICAgCisJCWNhc2UgTElQX09DQ1VSUkVEOgorCQljYXNlIExJUF9SRUNFSVZFRDoKKwkJICAgICAgICBwcmludGsoInFsb2dpY2ZjJWQgOiBMb29wIFJlaW5pdGlhbGl6ZWRcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwkJCWlmIChob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSA9PSBBU19MT09QX0dPT0QpCisJCQkJaG9zdGRhdGEtPmFkYXB0ZXJfc3RhdGUgPSBBU19SRURPX0xPT1BfUE9SVERCOworCQkJYnJlYWs7CisJCWNhc2UgU1lTVEVNX0VSUk9SOgorCQkJcHJpbnRrKCJxbG9naWNmYyVkIDogVGhlIGZpcm13YXJlIGp1c3QgY2hva2VkLlxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCQkJaG9zdGRhdGEtPmFkYXB0ZXJfc3RhdGUgPSBBU19GSVJNV0FSRV9ERUFEOworCQkJYnJlYWs7CisJCWNhc2UgU0NTSV9DT01NQU5EX0NPTVBMRVRFOgorCQkJaGFuZGxlID0gaW53KGhvc3QtPmlvX3BvcnQgKyBNQk9YMSkgfCAoaW53KGhvc3QtPmlvX3BvcnQgKyBNQk9YMikgPDwgMTYpOworCQkJQ21uZCA9IGhvc3RkYXRhLT5oYW5kbGVfcHRyc1toYW5kbGVdOworCQkJaG9zdGRhdGEtPmhhbmRsZV9wdHJzW2hhbmRsZV0gPSBOVUxMOworCQkJaG9zdGRhdGEtPmhhbmRsZV9zZXJpYWxzW2hhbmRsZV0gPSAwOworCQkJaG9zdGRhdGEtPnF1ZXVlZC0tOworCQkJaWYgKENtbmQgIT0gTlVMTCkgeworCQkJCWlmIChDbW5kLT51c2Vfc2cpCisJCQkJCXBjaV91bm1hcF9zZyhob3N0ZGF0YS0+cGNpX2RldiwKKwkJCQkJCSAgICAgKHN0cnVjdCBzY2F0dGVybGlzdCAqKUNtbmQtPmJ1ZmZlciwKKwkJCQkJCSAgICAgQ21uZC0+dXNlX3NnLAorCQkJCQkJICAgICBzY3NpX3RvX3BjaV9kbWFfZGlyKENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisJCQkJZWxzZSBpZiAoQ21uZC0+cmVxdWVzdF9idWZmbGVuICYmCisJCQkJCSBDbW5kLT5zY19kYXRhX2RpcmVjdGlvbiAhPSBQQ0lfRE1BX05PTkUpCisJCQkJCXBjaV91bm1hcF9wYWdlKGhvc3RkYXRhLT5wY2lfZGV2LAorCQkJCQkJICAgICAgIENtbmQtPlNDcC5kbWFfaGFuZGxlLAorCQkJCQkJICAgICAgIENtbmQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkJCSAgICAgICBzY3NpX3RvX3BjaV9kbWFfZGlyKENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisJCQkJQ21uZC0+cmVzdWx0ID0gMHgwOworCQkJCSgqQ21uZC0+c2NzaV9kb25lKSAoQ21uZCk7CisJCQl9IGVsc2UKKwkJCQlwcmludGsoInFsb2dpY2ZjJWQuYyA6IGdvdCBhIG51bGwgdmFsdWUgb3V0IG9mIGhhbmRsZV9wdHJzLCB0aGlzIHN1Y2tzXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCk7CisJCQlicmVhazsKKwkJY2FzZSBNQk9YX0NPTU1BTkRfQ09NUExFVEU6CisJCWNhc2UgSU5WQUxJRF9DT01NQU5EOgorCQljYXNlIEhPU1RfSU5URVJGQUNFX0VSUk9SOgorCQljYXNlIFRFU1RfRkFJTEVEOgorCQljYXNlIENPTU1BTkRfRVJST1I6CisJCWNhc2UgQ09NTUFORF9QQVJBTV9FUlJPUjoKKwkJY2FzZSBQT1JUX0lEX1VTRUQ6CisJCWNhc2UgTE9PUF9JRF9VU0VEOgorCQljYXNlIEFMTF9JRFNfVVNFRDoKKwkJCWhvc3RkYXRhLT5tYm94X2RvbmUgPSAxOworCQkJb3V0dyhIQ0NSX0NMRUFSX1JJU0NfSU5UUiwgaG9zdC0+aW9fcG9ydCArIEhPU1RfSENDUik7CisJCQlyZXR1cm47CisJCWRlZmF1bHQ6CisJCQlwcmludGsoInFsb2dpY2ZjJWQgOiBnb3QgYW4gdW5rbm93biBzdGF0dXM/ICV4XG4iLCBob3N0ZGF0YS0+aG9zdF9pZCwgc3RhdHVzKTsKKwkJfQorCQlpZiAoKGhvc3RkYXRhLT5hZGFwdGVyX3N0YXRlICYgQVNfUkVET19MT09QX1BPUlREQiB8fCBob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSAmIEFTX1JFRE9fRkFCUklDX1BPUlREQikgJiYgaG9zdGRhdGEtPmV4cGxvcmVfdGltZXIuZGF0YSA9PSAwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RkYXRhLT5leHBsb3JlX3RpbWVyLmZ1bmN0aW9uID0gcmVkb19wb3J0X2RiOworCQkJaG9zdGRhdGEtPmV4cGxvcmVfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWhvc3Q7CisJCQlob3N0ZGF0YS0+ZXhwbG9yZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIChIWi80KTsKKwkJCWluaXRfdGltZXIoJmhvc3RkYXRhLT5leHBsb3JlX3RpbWVyKTsKKwkJCWFkZF90aW1lcigmaG9zdGRhdGEtPmV4cGxvcmVfdGltZXIpOworCQl9CisJCW91dHcoMHgwLCBob3N0LT5pb19wb3J0ICsgUENJX1NFTUFQSE9SRSk7CisJfSBlbHNlIHsKKwkJREVCVUdfSU5UUihwcmludGsoInFsb2dpY2ZjJWQgOiByZXNwb25zZSBxdWV1ZSB1cGRhdGVcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKSk7CisJCURFQlVHX0lOVFIocHJpbnRrKCJxbG9naWNmYyVkIDogcmVzcG9uc2UgcXVldWUgZGVwdGggJWRcbiIsIGhvc3RkYXRhLT5ob3N0X2lkLCBSRVNfUVVFVUVfREVQVEgoaW5fcHRyLCBvdXRfcHRyKSkpOworCisJCXdoaWxlIChvdXRfcHRyICE9IGluX3B0cikgeworCQkJdW5zaWduZWQgbGVfaGFuZDsKKwkJCXN0cyA9IChzdHJ1Y3QgU3RhdHVzX0VudHJ5ICopICZob3N0ZGF0YS0+cmVzW291dF9wdHIqUVVFVUVfRU5UUllfTEVOXTsKKwkJCW91dF9wdHIgPSAob3V0X3B0ciArIDEpICYgUkVTX1FVRVVFX0xFTjsKKyAgICAgICAgICAgICAgICAgCisJCQlUUkFDRSgiZG9uZSIsIG91dF9wdHIsIENtbmQpOworCQkJREVCVUdfSU5UUihpc3AyeDAwX3ByaW50X3N0YXR1c19lbnRyeShzdHMpKTsKKwkJCWxlX2hhbmQgPSBsZTMyX3RvX2NwdShzdHMtPmhhbmRsZSk7CisJCQlpZiAoc3RzLT5oZHIuZW50cnlfdHlwZSA9PSBFTlRSWV9TVEFUVVMgJiYgKENtbmQgPSBob3N0ZGF0YS0+aGFuZGxlX3B0cnNbbGVfaGFuZF0pKSB7CisJCQkJQ21uZC0+cmVzdWx0ID0gaXNwMngwMF9yZXR1cm5fc3RhdHVzKENtbmQsIHN0cyk7CisJCQkJaG9zdGRhdGEtPnF1ZXVlZC0tOworCisJCQkJaWYgKENtbmQtPnVzZV9zZykKKwkJCQkJcGNpX3VubWFwX3NnKGhvc3RkYXRhLT5wY2lfZGV2LAorCQkJCQkJICAgICAoc3RydWN0IHNjYXR0ZXJsaXN0ICopQ21uZC0+YnVmZmVyLCBDbW5kLT51c2Vfc2csCisJCQkJCQkgICAgIHNjc2lfdG9fcGNpX2RtYV9kaXIoQ21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKwkJCQllbHNlIGlmIChDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4gJiYgQ21uZC0+c2NfZGF0YV9kaXJlY3Rpb24gIT0gUENJX0RNQV9OT05FKQorCQkJCQlwY2lfdW5tYXBfcGFnZShob3N0ZGF0YS0+cGNpX2RldiwKKwkJCQkJCSAgICAgICBDbW5kLT5TQ3AuZG1hX2hhbmRsZSwKKwkJCQkJCSAgICAgICBDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCQkgICAgICAgc2NzaV90b19wY2lfZG1hX2RpcihDbW5kLT5zY19kYXRhX2RpcmVjdGlvbikpOworCisJCQkJLyogCisJCQkJICogaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWUgd2UgZG8gbm90CisJCQkJICogY2FsbCBzY3NpX2RvbmUuICBpZiB0aGUgc3RhdHVzIGlzIENTX0FCT1JURUQKKwkJCQkgKiB3ZSBkb24ndCBoYXZlIHRvIGNhbGwgZG9uZSBiZWNhdXNlIHRoZSB1cHBlcgorCQkJCSAqIGxldmVsIHNob3VsZCBhbHJlYWR5IGtub3cgaXRzIGFib3J0ZWQuCisJCQkJICovCisJCQkJaWYgKGhvc3RkYXRhLT5oYW5kbGVfc2VyaWFsc1tsZV9oYW5kXSAhPSBDbW5kLT5zZXJpYWxfbnVtYmVyIAorCQkJCSAgICB8fCBsZTE2X3RvX2NwdShzdHMtPmNvbXBsZXRpb25fc3RhdHVzKSA9PSBDU19BQk9SVEVEKXsKKwkJCQkJaG9zdGRhdGEtPmhhbmRsZV9zZXJpYWxzW2xlX2hhbmRdID0gMDsKKwkJCQkJaG9zdGRhdGEtPmhhbmRsZV9wdHJzW2xlX2hhbmRdID0gTlVMTDsKKwkJCQkJb3V0dyhvdXRfcHRyLCBob3N0LT5pb19wb3J0ICsgTUJPWDUpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBpZiB3ZSBnZXQgYmFjayBhbiBlcnJvciBpbmRpY2F0aW5nIHRoZSBwb3J0CisJCQkJICogaXMgbm90IHRoZXJlIG9yIGlmIHRoZSBsaW5rIGlzIGRvd24gYW5kIAorCQkJCSAqIHRoaXMgaXMgYSBkZXZpY2UgdGhhdCB1c2VkIHRvIGJlIHRoZXJlIAorCQkJCSAqIGFsbG93IHRoZSBjb21tYW5kIHRvIHRpbWVvdXQuCisJCQkJICogdGhlIGRldmljZSBtYXkgd2VsbCBiZSBiYWNrIGluIGEgY291cGxlIG9mCisJCQkJICogc2Vjb25kcy4KKwkJCQkgKi8KKwkJCQlpZiAoKGhvc3RkYXRhLT5hZGFwdGVyX3N0YXRlID09IEFTX0xPT1BfRE9XTiB8fCBzdHMtPmNvbXBsZXRpb25fc3RhdHVzID09IGNwdV90b19sZTE2KENTX1BPUlRfVU5BVkFJTEFCTEUpIHx8IHN0cy0+Y29tcGxldGlvbl9zdGF0dXMgPT0gY3B1X3RvX2xlMTYoQ1NfUE9SVF9MT0dHRURfT1VUKSB8fCBzdHMtPmNvbXBsZXRpb25fc3RhdHVzID09IGNwdV90b19sZTE2KENTX1BPUlRfQ09ORklHX0NIQU5HRUQpKSAmJiBob3N0ZGF0YS0+cG9ydF9kYltDbW5kLT5kZXZpY2UtPmlkXS53d24peworCQkJCQlvdXR3KG91dF9wdHIsIGhvc3QtPmlvX3BvcnQgKyBNQk9YNSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJb3V0dyhvdXRfcHRyLCBob3N0LT5pb19wb3J0ICsgTUJPWDUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlob3N0ZGF0YS0+aGFuZGxlX3B0cnNbbGVfaGFuZF0gPSBOVUxMOworCisJCQlpZiAoc3RzLT5jb21wbGV0aW9uX3N0YXR1cyA9PSBjcHVfdG9fbGUxNihDU19SRVNFVF9PQ0NVUlJFRCkKKwkJCSAgICB8fCAoc3RzLT5zdGF0dXNfZmxhZ3MgJiBjcHVfdG9fbGUxNihTVEZfQlVTX1JFU0VUKSkpCisJCQkJaG9zdGRhdGEtPnNlbmRfbWFya2VyID0gMTsKKworCQkJaWYgKGxlMTZfdG9fY3B1KHN0cy0+c2NzaV9zdGF0dXMpICYgMHgwMjAwKQorCQkJCW1lbWNweShDbW5kLT5zZW5zZV9idWZmZXIsIHN0cy0+cmVxX3NlbnNlX2RhdGEsCisJCQkJICAgICAgIHNpemVvZihDbW5kLT5zZW5zZV9idWZmZXIpKTsKKworCQkJb3V0dyhvdXRfcHRyLCBob3N0LT5pb19wb3J0ICsgTUJPWDUpOworCisJCQlpZiAoQ21uZC0+c2NzaV9kb25lICE9IE5VTEwpIHsKKwkJCQkoKkNtbmQtPnNjc2lfZG9uZSkgKENtbmQpOworCQkJfSBlbHNlCisJCQkJcHJpbnRrKCJxbG9naWNmYyVkIDogT3VjaCwgc2NzaSBkb25lIGlzIE5VTExcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwkJfQorCQlob3N0ZGF0YS0+cmVzX291dF9wdHIgPSBvdXRfcHRyOworCX0KKworCisJb3V0X3B0ciA9IGludyhob3N0LT5pb19wb3J0ICsgTUJPWDQpOworCWluX3B0ciA9IGhvc3RkYXRhLT5yZXFfaW5fcHRyOworCisJbnVtX2ZyZWUgPSBRTE9HSUNGQ19SRVFfUVVFVUVfTEVOIC0gUkVRX1FVRVVFX0RFUFRIKGluX3B0ciwgb3V0X3B0cik7CisJbnVtX2ZyZWUgPSAobnVtX2ZyZWUgPiAyKSA/IG51bV9mcmVlIC0gMiA6IDA7CisgICAgICAgaG9zdC0+Y2FuX3F1ZXVlID0gaG9zdC0+aG9zdF9idXN5ICsgbnVtX2ZyZWU7CisJaWYgKGhvc3QtPmNhbl9xdWV1ZSA+IFFMT0dJQ0ZDX1JFUV9RVUVVRV9MRU4pCisJCWhvc3QtPmNhbl9xdWV1ZSA9IFFMT0dJQ0ZDX1JFUV9RVUVVRV9MRU47CisJaG9zdC0+c2dfdGFibGVzaXplID0gUUxPR0lDRkNfTUFYX1NHKG51bV9mcmVlKTsKKworCW91dHcoSENDUl9DTEVBUl9SSVNDX0lOVFIsIGhvc3QtPmlvX3BvcnQgKyBIT1NUX0hDQ1IpOworCUxFQVZFX0lOVFIoImlzcDJ4MDBfaW50cl9oYW5kbGVyIik7Cit9CisKKworc3RhdGljIGludCBpc3AyeDAwX3JldHVybl9zdGF0dXMoU2NzaV9DbW5kICpDbW5kLCBzdHJ1Y3QgU3RhdHVzX0VudHJ5ICpzdHMpCit7CisJaW50IGhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworI2lmIERFQlVHX0lTUDJ4MDBfSU5UUgorCXN0YXRpYyBjaGFyICpyZWFzb25bXSA9CisJeworCQkiRElEX09LIiwKKwkJIkRJRF9OT19DT05ORUNUIiwKKwkJIkRJRF9CVVNfQlVTWSIsCisJCSJESURfVElNRV9PVVQiLAorCQkiRElEX0JBRF9UQVJHRVQiLAorCQkiRElEX0FCT1JUIiwKKwkJIkRJRF9QQVJJVFkiLAorCQkiRElEX0VSUk9SIiwKKwkJIkRJRF9SRVNFVCIsCisJCSJESURfQkFEX0lOVFIiCisJfTsKKyNlbmRpZgkJCQkvKiBERUJVR19JU1AyeDAwX0lOVFIgKi8KKworCUVOVEVSKCJpc3AyeDAwX3JldHVybl9zdGF0dXMiKTsKKworCURFQlVHKHByaW50aygicWxvZ2ljZmMgOiBjb21wbGV0aW9uIHN0YXR1cyA9IDB4JTA0eFxuIiwKKwkJICAgICBsZTE2X3RvX2NwdShzdHMtPmNvbXBsZXRpb25fc3RhdHVzKSkpOworCisJc3dpdGNoIChsZTE2X3RvX2NwdShzdHMtPmNvbXBsZXRpb25fc3RhdHVzKSkgeworCWNhc2UgQ1NfQ09NUExFVEU6CisJCWhvc3Rfc3RhdHVzID0gRElEX09LOworCQlicmVhazsKKwljYXNlIENTX0RNQV9FUlJPUjoKKwkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJCWJyZWFrOworCWNhc2UgQ1NfUkVTRVRfT0NDVVJSRUQ6CisJCWhvc3Rfc3RhdHVzID0gRElEX1JFU0VUOworCQlicmVhazsKKwljYXNlIENTX0FCT1JURUQ6CisJCWhvc3Rfc3RhdHVzID0gRElEX0FCT1JUOworCQlicmVhazsKKwljYXNlIENTX1RJTUVPVVQ6CisJCWhvc3Rfc3RhdHVzID0gRElEX1RJTUVfT1VUOworCQlicmVhazsKKwljYXNlIENTX0RBVEFfT1ZFUlJVTjoKKwkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJCWJyZWFrOworCWNhc2UgQ1NfREFUQV9VTkRFUlJVTjoKKwkgICAgICAgIGlmIChDbW5kLT51bmRlcmZsb3cgPD0gKENtbmQtPnJlcXVlc3RfYnVmZmxlbiAtIGxlMzJfdG9fY3B1KHN0cy0+cmVzaWR1YWwpKSkKKwkJICAgICAgICBob3N0X3N0YXR1cyA9IERJRF9PSzsKKwkJZWxzZQorCQkgICAgICAgIGhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCQlicmVhazsKKwljYXNlIENTX1BPUlRfVU5BVkFJTEFCTEU6CisJY2FzZSBDU19QT1JUX0xPR0dFRF9PVVQ6CisJY2FzZSBDU19QT1JUX0NPTkZJR19DSEFOR0VEOgorCQlob3N0X3N0YXR1cyA9IERJRF9CQURfVEFSR0VUOworCQlicmVhazsKKwljYXNlIENTX1FVRVVFX0ZVTEw6CisJCWhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoInFsb2dpY2ZjIDogdW5rbm93biBjb21wbGV0aW9uIHN0YXR1cyAweCUwNHhcbiIsCisJCSAgICAgICBsZTE2X3RvX2NwdShzdHMtPmNvbXBsZXRpb25fc3RhdHVzKSk7CisJCWhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCQlicmVhazsKKwl9CisKKwlERUJVR19JTlRSKHByaW50aygicWxvZ2ljZmMgOiBob3N0IHN0YXR1cyAoJXMpIHNjc2kgc3RhdHVzICV4XG4iLAorCQkJICByZWFzb25baG9zdF9zdGF0dXNdLCBsZTE2X3RvX2NwdShzdHMtPnNjc2lfc3RhdHVzKSkpOworCisJTEVBVkUoImlzcDJ4MDBfcmV0dXJuX3N0YXR1cyIpOworCisJcmV0dXJuIChsZTE2X3RvX2NwdShzdHMtPnNjc2lfc3RhdHVzKSAmIFNUQVRVU19NQVNLKSB8IChob3N0X3N0YXR1cyA8PCAxNik7Cit9CisKKworc3RhdGljIGludCBpc3AyeDAwX2Fib3J0KFNjc2lfQ21uZCAqIENtbmQpCit7CisJdV9zaG9ydCBwYXJhbVs4XTsKKwlpbnQgaTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXN0cnVjdCBpc3AyeDAwX2hvc3RkYXRhICpob3N0ZGF0YTsKKwlpbnQgcmV0dXJuX3N0YXR1cyA9IFNVQ0NFU1M7CisKKwlFTlRFUigiaXNwMngwMF9hYm9ydCIpOworCisJaG9zdCA9IENtbmQtPmRldmljZS0+aG9zdDsKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YTsKKworCWZvciAoaSA9IDA7IGkgPCBRTE9HSUNGQ19SRVFfUVVFVUVfTEVOOyBpKyspCisJCWlmIChob3N0ZGF0YS0+aGFuZGxlX3B0cnNbaV0gPT0gQ21uZCkKKwkJCWJyZWFrOworCisJaWYgKGkgPT0gUUxPR0lDRkNfUkVRX1FVRVVFX0xFTil7CisJCXJldHVybiBTVUNDRVNTOworCX0KKworCWlzcDJ4MDBfZGlzYWJsZV9pcnFzKGhvc3QpOworCisJcGFyYW1bMF0gPSBNQk9YX0FCT1JUX0lPQ0I7CisjaWYgSVNQMngwMF9QT1JUREIKKwlwYXJhbVsxXSA9ICgoKHVfc2hvcnQpIGhvc3RkYXRhLT5wb3J0X2RiW0NtbmQtPmRldmljZS0+aWRdLmxvb3BfaWQpIDw8IDgpIHwgQ21uZC0+ZGV2aWNlLT5sdW47CisjZWxzZQorCXBhcmFtWzFdID0gKCgodV9zaG9ydCkgQ21uZC0+dGFyZ2V0KSA8PCA4KSB8IENtbmQtPmx1bjsKKyNlbmRpZgorCXBhcmFtWzJdID0gaSAmIDB4ZmZmZjsKKwlwYXJhbVszXSA9IGkgPj4gMTY7CisKKwlpc3AyeDAwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisKKwlpZiAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCXByaW50aygicWxvZ2ljZmMlZCA6IHNjc2kgYWJvcnQgZmFpbHVyZTogJXhcbiIsIGhvc3RkYXRhLT5ob3N0X2lkLCBwYXJhbVswXSk7CisJCWlmIChwYXJhbVswXSA9PSAweDQwMDUpCisJCQlDbW5kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCWlmIChwYXJhbVswXSA9PSAweDQwMDYpCisJCQlDbW5kLT5yZXN1bHQgPSBESURfQkFEX1RBUkdFVCA8PCAxNjsKKwkJcmV0dXJuX3N0YXR1cyA9IEZBSUxFRDsKKwl9CisKKwlpZiAocmV0dXJuX3N0YXR1cyAhPSBTVUNDRVNTKXsKKwkJcGFyYW1bMF0gPSBNQk9YX0dFVF9GSVJNV0FSRV9TVEFURTsKKwkJaXNwMngwMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCQlwcmludGsoInFsb2dpY2ZjJWQgOiBhYm9ydCBmYWlsZWRcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwkJcHJpbnRrKCJxbG9naWNmYyVkIDogZmlybXdhcmUgc3RhdHVzIGlzICV4ICV4XG4iLCBob3N0ZGF0YS0+aG9zdF9pZCwgcGFyYW1bMF0sIHBhcmFtWzFdKTsKKwl9CisKKwlpc3AyeDAwX2VuYWJsZV9pcnFzKGhvc3QpOworCisJTEVBVkUoImlzcDJ4MDBfYWJvcnQiKTsKKworCXJldHVybiByZXR1cm5fc3RhdHVzOworfQorCisKK3N0YXRpYyBpbnQgaXNwMngwMF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpuLAorCQlzZWN0b3JfdCBjYXBhY2l0eSwgaW50IGlwW10pCit7CisJaW50IHNpemUgPSBjYXBhY2l0eTsKKworCUVOVEVSKCJpc3AyeDAwX2Jpb3NwYXJhbSIpOworCisJaXBbMF0gPSA2NDsKKwlpcFsxXSA9IDMyOworCWlwWzJdID0gc2l6ZSA+PiAxMTsKKwlpZiAoaXBbMl0gPiAxMDI0KSB7CisJCWlwWzBdID0gMjU1OworCQlpcFsxXSA9IDYzOworCQlpcFsyXSA9IHNpemUgLyAoaXBbMF0gKiBpcFsxXSk7CisJfQorCUxFQVZFKCJpc3AyeDAwX2Jpb3NwYXJhbSIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNwMngwMF9yZXNldF9oYXJkd2FyZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXVfc2hvcnQgcGFyYW1bOF07CisJc3RydWN0IGlzcDJ4MDBfaG9zdGRhdGEgKmhvc3RkYXRhOworCWludCBsb29wX2NvdW50OworCWRtYV9hZGRyX3QgYnVzYWRkcjsKKworCUVOVEVSKCJpc3AyeDAwX3Jlc2V0X2hhcmR3YXJlIik7CisKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YTsKKworCS8qCisJICoJVGhpcyBjYW5ub3QgYmUgcmlnaHQgLSBQQ0kgd3JpdGVzIGFyZSBwb3N0ZWQKKwkgKgkoYXBwYXJlbnRseSB0aGlzIGlzIGhhcmR3YXJlIGRlc2lnbiBmbGF3IG5vdCBzb2Z0d2FyZSA/KQorCSAqLworCSAKKwlvdXR3KDB4MDEsIGhvc3QtPmlvX3BvcnQgKyBJU1BfQ1RSTF9TVEFUVVMpOworCXVkZWxheSgxMDApOworCW91dHcoSENDUl9SRVNFVCwgaG9zdC0+aW9fcG9ydCArIEhPU1RfSENDUik7CisJdWRlbGF5KDEwMCk7CisJb3V0dyhIQ0NSX1JFTEVBU0UsIGhvc3QtPmlvX3BvcnQgKyBIT1NUX0hDQ1IpOworCW91dHcoSENDUl9CSU9TX0RJU0FCTEUsIGhvc3QtPmlvX3BvcnQgKyBIT1NUX0hDQ1IpOworCisJbG9vcF9jb3VudCA9IERFRkFVTFRfTE9PUF9DT1VOVDsKKwl3aGlsZSAoLS1sb29wX2NvdW50ICYmIGludyhob3N0LT5pb19wb3J0ICsgSE9TVF9IQ0NSKSA9PSBSSVNDX0JVU1kpIHsKKwkJYmFycmllcigpOworCQljcHVfcmVsYXgoKTsKKwl9CisJaWYgKCFsb29wX2NvdW50KQorCQlwcmludGsoInFsb2dpY2ZjJWQgOiByZXNldF9oYXJkd2FyZSBsb29wIHRpbWVvdXRcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKworCisKKyNpZiBERUJVR19JU1AyeDAwCisJcHJpbnRrKCJxbG9naWNmYyVkIDogbWJveCAwIDB4JTA0eCBcbiIsIGhvc3RkYXRhLT5ob3N0X2lkLCAgaW53KGhvc3QtPmlvX3BvcnQgKyBNQk9YMCkpOworCXByaW50aygicWxvZ2ljZmMlZCA6IG1ib3ggMSAweCUwNHggXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCwgIGludyhob3N0LT5pb19wb3J0ICsgTUJPWDEpKTsKKwlwcmludGsoInFsb2dpY2ZjJWQgOiBtYm94IDIgMHglMDR4IFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsICBpbncoaG9zdC0+aW9fcG9ydCArIE1CT1gyKSk7CisJcHJpbnRrKCJxbG9naWNmYyVkIDogbWJveCAzIDB4JTA0eCBcbiIsIGhvc3RkYXRhLT5ob3N0X2lkLCAgaW53KGhvc3QtPmlvX3BvcnQgKyBNQk9YMykpOworCXByaW50aygicWxvZ2ljZmMlZCA6IG1ib3ggNCAweCUwNHggXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCwgIGludyhob3N0LT5pb19wb3J0ICsgTUJPWDQpKTsKKwlwcmludGsoInFsb2dpY2ZjJWQgOiBtYm94IDUgMHglMDR4IFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsICBpbncoaG9zdC0+aW9fcG9ydCArIE1CT1g1KSk7CisJcHJpbnRrKCJxbG9naWNmYyVkIDogbWJveCA2IDB4JTA0eCBcbiIsIGhvc3RkYXRhLT5ob3N0X2lkLCAgaW53KGhvc3QtPmlvX3BvcnQgKyBNQk9YNikpOworCXByaW50aygicWxvZ2ljZmMlZCA6IG1ib3ggNyAweCUwNHggXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCwgIGludyhob3N0LT5pb19wb3J0ICsgTUJPWDcpKTsKKyNlbmRpZgkJCQkvKiBERUJVR19JU1AyeDAwICovCisKKwlERUJVRyhwcmludGsoInFsb2dpY2ZjJWQgOiB2ZXJpZnlpbmcgY2hlY2tzdW1cbiIsIGhvc3RkYXRhLT5ob3N0X2lkKSk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19TQ1NJX1FMT0dJQ19GQ19GSVJNV0FSRSkKKwl7CisJCWludCBpOworCQl1bnNpZ25lZCBzaG9ydCAqIHJpc2NfY29kZSA9IE5VTEw7CisJCXVuc2lnbmVkIHNob3J0IHJpc2NfY29kZV9sZW4gPSAwOworCQlpZiAoaG9zdGRhdGEtPnBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMTAwKXsKKwkJICAgICAgICByaXNjX2NvZGUgPSByaXNjX2NvZGUyMTAwOworCQkJcmlzY19jb2RlX2xlbiA9IHJpc2NfY29kZV9sZW5ndGgyMTAwOworCQl9CisJCWVsc2UgaWYgKGhvc3RkYXRhLT5wY2lfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjIwMCl7CisJCSAgICAgICAgcmlzY19jb2RlID0gcmlzY19jb2RlMjIwMDsKKwkJCXJpc2NfY29kZV9sZW4gPSByaXNjX2NvZGVfbGVuZ3RoMjIwMDsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCByaXNjX2NvZGVfbGVuOyBpKyspIHsKKwkJCXBhcmFtWzBdID0gTUJPWF9XUklURV9SQU1fV09SRDsKKwkJCXBhcmFtWzFdID0gcmlzY19jb2RlX2FkZHIwMSArIGk7CisJCQlwYXJhbVsyXSA9IHJpc2NfY29kZVtpXTsKKworCQkJaXNwMngwMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCisJCQlpZiAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCQkJcHJpbnRrKCJxbG9naWNmYyVkIDogZmlybXdhcmUgbG9hZCBmYWlsdXJlXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisjZW5kaWYJCQkJLyogUkVMT0FEX0ZJUk1XQVJFICovCisKKwlwYXJhbVswXSA9IE1CT1hfVkVSSUZZX0NIRUNLU1VNOworCXBhcmFtWzFdID0gcmlzY19jb2RlX2FkZHIwMTsKKworCWlzcDJ4MDBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJcHJpbnRrKCJxbG9naWNmYyVkIDogcmFtIGNoZWNrc3VtIGZhaWx1cmVcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwkJcmV0dXJuIDE7CisJfQorCURFQlVHKHByaW50aygicWxvZ2ljZmMlZCA6IGV4ZWN1dGluZyBmaXJtd2FyZVxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpKTsKKworCXBhcmFtWzBdID0gTUJPWF9FWEVDX0ZJUk1XQVJFOworCXBhcmFtWzFdID0gcmlzY19jb2RlX2FkZHIwMTsKKworCWlzcDJ4MDBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCXBhcmFtWzBdID0gTUJPWF9BQk9VVF9GSVJNV0FSRTsKKworCWlzcDJ4MDBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJcHJpbnRrKCJxbG9naWNmYyVkIDogYWJvdXQgZmlybXdhcmUgZmFpbHVyZVxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCQlyZXR1cm4gMTsKKwl9CisJREVCVUcocHJpbnRrKCJxbG9naWNmYyVkIDogZmlybXdhcmUgbWFqb3IgcmV2aXNpb24gJWRcbiIsIGhvc3RkYXRhLT5ob3N0X2lkLCAgcGFyYW1bMV0pKTsKKwlERUJVRyhwcmludGsoInFsb2dpY2ZjJWQgOiBmaXJtd2FyZSBtaW5vciByZXZpc2lvbiAlZFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsICBwYXJhbVsyXSkpOworCisjaWZkZWYgVVNFX05WUkFNX0RFRkFVTFRTCisKKwlpZiAoaXNwMngwMF9nZXRfbnZyYW1fZGVmYXVsdHMoaG9zdCwgJmhvc3RkYXRhLT5jb250cm9sX2Jsb2NrKSAhPSAwKSB7CisJCXByaW50aygicWxvZ2ljZmMlZCA6IENvdWxkIG5vdCByZWFkIGZyb20gTlZSQU1cbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwl9CisjZW5kaWYKKworCWhvc3RkYXRhLT53d24gPSAodTY0KSAoY3B1X3RvX2xlMTYoaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2subm9kZV9uYW1lWzBdKSkgPDwgNTY7CisJaG9zdGRhdGEtPnd3biB8PSAodTY0KSAoY3B1X3RvX2xlMTYoaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2subm9kZV9uYW1lWzBdKSAmIDB4ZmYwMCkgPDwgNDg7CisJaG9zdGRhdGEtPnd3biB8PSAodTY0KSAoY3B1X3RvX2xlMTYoaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2subm9kZV9uYW1lWzFdKSAmIDB4ZmYwMCkgPDwgMjQ7CisJaG9zdGRhdGEtPnd3biB8PSAodTY0KSAoY3B1X3RvX2xlMTYoaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2subm9kZV9uYW1lWzFdKSAmIDB4MDBmZikgPDwgNDg7CisJaG9zdGRhdGEtPnd3biB8PSAodTY0KSAoY3B1X3RvX2xlMTYoaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2subm9kZV9uYW1lWzJdKSAmIDB4MDBmZikgPDwgMjQ7CisJaG9zdGRhdGEtPnd3biB8PSAodTY0KSAoY3B1X3RvX2xlMTYoaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2subm9kZV9uYW1lWzJdKSAmIDB4ZmYwMCkgPDwgODsKKwlob3N0ZGF0YS0+d3duIHw9ICh1NjQpIChjcHVfdG9fbGUxNihob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5ub2RlX25hbWVbM10pICYgMHgwMGZmKSA8PCA4OworCWhvc3RkYXRhLT53d24gfD0gKHU2NCkgKGNwdV90b19sZTE2KGhvc3RkYXRhLT5jb250cm9sX2Jsb2NrLm5vZGVfbmFtZVszXSkgJiAweGZmMDApID4+IDg7CisKKwkvKiBGSVhNRTogSWYgdGhlIERNQSB0cmFuc2ZlciBnb2VzIG9uZSB3YXkgb25seSwgdGhpcyBzaG91bGQgdXNlCisJICogICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UgYW5kIGJlbG93IGFzIHdlbGwuCisJICovCisJYnVzYWRkciA9IHBjaV9tYXBfcGFnZShob3N0ZGF0YS0+cGNpX2RldiwKKwkJCSAgICAgICB2aXJ0X3RvX3BhZ2UoJmhvc3RkYXRhLT5jb250cm9sX2Jsb2NrKSwKKwkJCSAgICAgICBvZmZzZXRfaW5fcGFnZSgmaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2spLAorCQkJICAgICAgIHNpemVvZihob3N0ZGF0YS0+Y29udHJvbF9ibG9jayksCisJCQkgICAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKworCXBhcmFtWzBdID0gTUJPWF9JTklUX0ZJUk1XQVJFOworCXBhcmFtWzJdID0gKHVfc2hvcnQpIChwY2k2NF9kbWFfbG8zMihidXNhZGRyKSA+PiAxNik7CisJcGFyYW1bM10gPSAodV9zaG9ydCkgKHBjaTY0X2RtYV9sbzMyKGJ1c2FkZHIpICYgMHhmZmZmKTsKKwlwYXJhbVs0XSA9IDA7CisJcGFyYW1bNV0gPSAwOworCXBhcmFtWzZdID0gKHVfc2hvcnQpIChwY2k2NF9kbWFfaGkzMihidXNhZGRyKSA+PiAxNik7CisJcGFyYW1bN10gPSAodV9zaG9ydCkgKHBjaTY0X2RtYV9oaTMyKGJ1c2FkZHIpICYgMHhmZmZmKTsKKwlpc3AyeDAwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisJaWYgKHBhcmFtWzBdICE9IE1CT1hfQ09NTUFORF9DT01QTEVURSkgeworCQlwcmludGsoInFsb2dpY2ZjJWQuYzogT3VjaCAweCUwNHhcbiIsIGhvc3RkYXRhLT5ob3N0X2lkLCAgcGFyYW1bMF0pOworCQlwY2lfdW5tYXBfcGFnZShob3N0ZGF0YS0+cGNpX2RldiwgYnVzYWRkciwKKwkJCSAgICAgICBzaXplb2YoaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2spLAorCQkJICAgICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCXJldHVybiAxOworCX0KKwlwYXJhbVswXSA9IE1CT1hfR0VUX0ZJUk1XQVJFX1NUQVRFOworCWlzcDJ4MDBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKwlpZiAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCXByaW50aygicWxvZ2ljZmMlZC5jOiAweCUwNHhcbiIsIGhvc3RkYXRhLT5ob3N0X2lkLCAgcGFyYW1bMF0pOworCQlwY2lfdW5tYXBfcGFnZShob3N0ZGF0YS0+cGNpX2RldiwgYnVzYWRkciwKKwkJCSAgICAgICBzaXplb2YoaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2spLAorCQkJICAgICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCXJldHVybiAxOworCX0KKworCXBjaV91bm1hcF9wYWdlKGhvc3RkYXRhLT5wY2lfZGV2LCBidXNhZGRyLAorCQkgICAgICAgc2l6ZW9mKGhvc3RkYXRhLT5jb250cm9sX2Jsb2NrKSwKKwkJICAgICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJTEVBVkUoImlzcDJ4MDBfcmVzZXRfaGFyZHdhcmUiKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgVVNFX05WUkFNX0RFRkFVTFRTCisKK3N0YXRpYyBpbnQgaXNwMngwMF9nZXRfbnZyYW1fZGVmYXVsdHMoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgc3RydWN0IGluaXRfY2IgKmNvbnRyb2xfYmxvY2spCit7CisKKwl1X3Nob3J0IHZhbHVlOworCWlmIChpc3AyeDAwX3JlYWRfbnZyYW1fd29yZChob3N0LCAwKSAhPSAweDUzNDkpCisJCXJldHVybiAxOworCisJdmFsdWUgPSBpc3AyeDAwX3JlYWRfbnZyYW1fd29yZChob3N0LCA4KTsKKwljb250cm9sX2Jsb2NrLT5ub2RlX25hbWVbMF0gPSBjcHVfdG9fbGUxNihpc3AyeDAwX3JlYWRfbnZyYW1fd29yZChob3N0LCA5KSk7CisJY29udHJvbF9ibG9jay0+bm9kZV9uYW1lWzFdID0gY3B1X3RvX2xlMTYoaXNwMngwMF9yZWFkX252cmFtX3dvcmQoaG9zdCwgMTApKTsKKwljb250cm9sX2Jsb2NrLT5ub2RlX25hbWVbMl0gPSBjcHVfdG9fbGUxNihpc3AyeDAwX3JlYWRfbnZyYW1fd29yZChob3N0LCAxMSkpOworCWNvbnRyb2xfYmxvY2stPm5vZGVfbmFtZVszXSA9IGNwdV90b19sZTE2KGlzcDJ4MDBfcmVhZF9udnJhbV93b3JkKGhvc3QsIDEyKSk7CisJY29udHJvbF9ibG9jay0+aGFyZF9hZGRyID0gY3B1X3RvX2xlMTYoaXNwMngwMF9yZWFkX252cmFtX3dvcmQoaG9zdCwgMTMpKTsKKworCXJldHVybiAwOworCit9CisKKyNlbmRpZgorCitzdGF0aWMgaW50IGlzcDJ4MDBfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaCkKK3sKKwl1X2xvbmcgaW9fYmFzZTsKKwlzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisJdV9jaGFyIHJldmlzaW9uOworCXVfaW50IGlycTsKKwl1X3Nob3J0IGNvbW1hbmQ7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisKKworCUVOVEVSKCJpc3AyeDAwX2luaXQiKTsKKworCWhvc3RkYXRhID0gKHN0cnVjdCBpc3AyeDAwX2hvc3RkYXRhICopIHNoLT5ob3N0ZGF0YTsKKwlwZGV2ID0gaG9zdGRhdGEtPnBjaV9kZXY7CisKKwlpZiAocGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZjb21tYW5kKQorCSAgfHwgcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmcmV2aXNpb24pKSB7CisJCXByaW50aygicWxvZ2ljZmMlZCA6IGVycm9yIHJlYWRpbmcgUENJIGNvbmZpZ3VyYXRpb25cbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwkJcmV0dXJuIDE7CisJfQorCWlvX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJaXJxID0gcGRldi0+aXJxOworCisKKwlpZiAocGRldi0+dmVuZG9yICE9IFBDSV9WRU5ET1JfSURfUUxPR0lDKSB7CisJCXByaW50aygicWxvZ2ljZmMlZCA6IDB4JTA0eCBpcyBub3QgUUxvZ2ljIHZlbmRvciBJRFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsIAorCQkgICAgICAgcGRldi0+dmVuZG9yKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChwZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjEwMCAmJiBwZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjIwMCkgeworCQlwcmludGsoInFsb2dpY2ZjJWQgOiAweCUwNHggZG9lcyBub3QgbWF0Y2ggSVNQMjEwMCBvciBJU1AyMjAwIGRldmljZSBpZFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsIAorCQkgICAgICAgcGRldi0+ZGV2aWNlKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICghKGNvbW1hbmQgJiBQQ0lfQ09NTUFORF9JTykgfHwKKwkgICAgIShwZGV2LT5yZXNvdXJjZVswXS5mbGFncyAmIElPUkVTT1VSQ0VfSU8pKSB7CisJCXByaW50aygicWxvZ2ljZmMlZCA6IGkvbyBtYXBwaW5nIGlzIGRpc2FibGVkXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCk7CisJCXJldHVybiAxOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCWlmIChyZXZpc2lvbiAhPSBJU1AyMTAwX1JFVl9JRDEgJiYgcmV2aXNpb24gIT0gSVNQMjEwMF9SRVZfSUQzICYmIHJldmlzaW9uICE9IElTUDIyMDBfUkVWX0lENSkKKwkJcHJpbnRrKCJxbG9naWNmYyVkIDogbmV3IGlzcDJ4MDAgcmV2aXNpb24gSUQgKCVkKVxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsICByZXZpc2lvbik7CisKKworCWhvc3RkYXRhLT5yZXZpc2lvbiA9IHJldmlzaW9uOworCisJc2gtPmlycSA9IGlycTsKKwlzaC0+aW9fcG9ydCA9IGlvX2Jhc2U7CisKKwlMRUFWRSgiaXNwMngwMF9pbml0Iik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIFVTRV9OVlJBTV9ERUZBVUxUUworCisjZGVmaW5lIE5WUkFNX0RFTEFZKCkgdWRlbGF5KDEwKQkvKiAxMCBtaWNyb3NlY29uZCBkZWxheSAqLworCisKK3Vfc2hvcnQgaXNwMngwMF9yZWFkX252cmFtX3dvcmQoc3RydWN0IFNjc2lfSG9zdCAqIGhvc3QsIHVfc2hvcnQgYnl0ZSkKK3sKKwlpbnQgaTsKKwl1X3Nob3J0IHZhbHVlLCBvdXRwdXQsIGlucHV0OworCisJb3V0dygweDIsIGhvc3QtPmlvX3BvcnQgKyBQQ0lfTlZSQU0pOworCU5WUkFNX0RFTEFZKCk7CisJb3V0dygweDMsIGhvc3QtPmlvX3BvcnQgKyBQQ0lfTlZSQU0pOworCU5WUkFNX0RFTEFZKCk7CisKKwlieXRlICY9IDB4ZmY7CisJYnl0ZSB8PSAweDA2MDA7CisJZm9yIChpID0gMTA7IGkgPj0gMDsgaS0tKSB7CisJCW91dHB1dCA9ICgoYnl0ZSA+PiBpKSAmIDB4MSkgPyAweDQgOiAweDA7CisJCW91dHcob3V0cHV0IHwgMHgyLCBob3N0LT5pb19wb3J0ICsgUENJX05WUkFNKTsKKwkJTlZSQU1fREVMQVkoKTsKKwkJb3V0dyhvdXRwdXQgfCAweDMsIGhvc3QtPmlvX3BvcnQgKyBQQ0lfTlZSQU0pOworCQlOVlJBTV9ERUxBWSgpOworCQlvdXR3KG91dHB1dCB8IDB4MiwgaG9zdC0+aW9fcG9ydCArIFBDSV9OVlJBTSk7CisJCU5WUkFNX0RFTEFZKCk7CisJfQorCisJZm9yIChpID0gMHhmLCB2YWx1ZSA9IDA7IGkgPj0gMDsgaS0tKSB7CisJCXZhbHVlIDw8PSAxOworCQlvdXR3KDB4MywgaG9zdC0+aW9fcG9ydCArIFBDSV9OVlJBTSk7CisJCU5WUkFNX0RFTEFZKCk7CisJCWlucHV0ID0gaW53KGhvc3QtPmlvX3BvcnQgKyBQQ0lfTlZSQU0pOworCQlOVlJBTV9ERUxBWSgpOworCQlvdXR3KDB4MiwgaG9zdC0+aW9fcG9ydCArIFBDSV9OVlJBTSk7CisJCU5WUkFNX0RFTEFZKCk7CisJCWlmIChpbnB1dCAmIDB4OCkKKwkJCXZhbHVlIHw9IDE7CisJfQorCisJb3V0dygweDAsIGhvc3QtPmlvX3BvcnQgKyBQQ0lfTlZSQU0pOworCU5WUkFNX0RFTEFZKCk7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKworI2VuZGlmCQkJCS8qIFVTRV9OVlJBTV9ERUZBVUxUUyAqLworCisKKworLyoKKyAqIGN1cnJlbnRseSwgdGhpcyBpcyBvbmx5IGNhbGxlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gb3IgYWJvcnQvcmVzZXQsCisgKiBhdCB3aGljaCB0aW1lcyBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwgc28gcG9sbGluZyBpcyBPSywgSSBndWVzcy4uLgorICovCitzdGF0aWMgaW50IGlzcDJ4MDBfbWJveF9jb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHVfc2hvcnQgcGFyYW1bXSkKK3sKKwlpbnQgbG9vcF9jb3VudDsKKwlzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IGlzcDJ4MDBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGE7CisKKwlpZiAobWJveF9wYXJhbVtwYXJhbVswXV0gPT0gMCB8fCBob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSA9PSBBU19GSVJNV0FSRV9ERUFEKQorCQlyZXR1cm4gMTsKKworCWxvb3BfY291bnQgPSBERUZBVUxUX0xPT1BfQ09VTlQ7CisJd2hpbGUgKC0tbG9vcF9jb3VudCAmJiBpbncoaG9zdC0+aW9fcG9ydCArIEhPU1RfSENDUikgJiAweDAwODApIHsKKwkJYmFycmllcigpOworCQljcHVfcmVsYXgoKTsKKwl9CisJaWYgKCFsb29wX2NvdW50KSB7CisJCXByaW50aygicWxvZ2ljZmMlZCA6IG1ib3hfY29tbWFuZCBsb29wIHRpbWVvdXQgIzFcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwkJcGFyYW1bMF0gPSAweDQwMDY7CisJCWhvc3RkYXRhLT5hZGFwdGVyX3N0YXRlID0gQVNfRklSTVdBUkVfREVBRDsKKwkJcmV0dXJuIDE7CisJfQorCWhvc3RkYXRhLT5tYm94X2RvbmUgPSAwOworCisJaWYgKG1ib3hfcGFyYW1bcGFyYW1bMF1dID09IDApCisJCXByaW50aygicWxvZ2ljZmMlZCA6IGludmFsaWQgbWJveCBjb21tYW5kXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCk7CisKKwlpZiAobWJveF9wYXJhbVtwYXJhbVswXV0gJiAweDgwKQorCQlvdXR3KHBhcmFtWzddLCBob3N0LT5pb19wb3J0ICsgTUJPWDcpOworCWlmIChtYm94X3BhcmFtW3BhcmFtWzBdXSAmIDB4NDApCisJCW91dHcocGFyYW1bNl0sIGhvc3QtPmlvX3BvcnQgKyBNQk9YNik7CisJaWYgKG1ib3hfcGFyYW1bcGFyYW1bMF1dICYgMHgyMCkKKwkJb3V0dyhwYXJhbVs1XSwgaG9zdC0+aW9fcG9ydCArIE1CT1g1KTsKKwlpZiAobWJveF9wYXJhbVtwYXJhbVswXV0gJiAweDEwKQorCQlvdXR3KHBhcmFtWzRdLCBob3N0LT5pb19wb3J0ICsgTUJPWDQpOworCWlmIChtYm94X3BhcmFtW3BhcmFtWzBdXSAmIDB4MDgpCisJCW91dHcocGFyYW1bM10sIGhvc3QtPmlvX3BvcnQgKyBNQk9YMyk7CisJaWYgKG1ib3hfcGFyYW1bcGFyYW1bMF1dICYgMHgwNCkKKwkJb3V0dyhwYXJhbVsyXSwgaG9zdC0+aW9fcG9ydCArIE1CT1gyKTsKKwlpZiAobWJveF9wYXJhbVtwYXJhbVswXV0gJiAweDAyKQorCQlvdXR3KHBhcmFtWzFdLCBob3N0LT5pb19wb3J0ICsgTUJPWDEpOworCWlmIChtYm94X3BhcmFtW3BhcmFtWzBdXSAmIDB4MDEpCisJCW91dHcocGFyYW1bMF0sIGhvc3QtPmlvX3BvcnQgKyBNQk9YMCk7CisKKworCW91dHcoSENDUl9TRVRfSE9TVF9JTlRSLCBob3N0LT5pb19wb3J0ICsgSE9TVF9IQ0NSKTsKKworCXdoaWxlICgxKSB7CisJCWxvb3BfY291bnQgPSBERUZBVUxUX0xPT1BfQ09VTlQ7CisJCXdoaWxlICgtLWxvb3BfY291bnQgJiYgIShpbncoaG9zdC0+aW9fcG9ydCArIFBDSV9JTlRFUl9TVFMpICYgMHgwOCkpIHsgCisJCQliYXJyaWVyKCk7CisJCQljcHVfcmVsYXgoKTsKKwkJfQorCisJCWlmICghbG9vcF9jb3VudCkgeworCQkJaG9zdGRhdGEtPmFkYXB0ZXJfc3RhdGUgPSBBU19GSVJNV0FSRV9ERUFEOworCQkJcHJpbnRrKCJxbG9naWNmYyVkIDogbWJveF9jb21tYW5kIGxvb3AgdGltZW91dCAjMlxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCQkJYnJlYWs7CisJCX0KKwkJaXNwMngwMF9pbnRyX2hhbmRsZXIoaG9zdC0+aXJxLCBob3N0LCBOVUxMKTsKKworCQlpZiAoaG9zdGRhdGEtPm1ib3hfZG9uZSA9PSAxKQorCQkJYnJlYWs7CisKKwl9CisKKwlsb29wX2NvdW50ID0gREVGQVVMVF9MT09QX0NPVU5UOworCXdoaWxlICgtLWxvb3BfY291bnQgJiYgaW53KGhvc3QtPmlvX3BvcnQgKyBNQk9YMCkgPT0gMHgwNCkgeworCQliYXJyaWVyKCk7CisJCWNwdV9yZWxheCgpOworCX0KKwlpZiAoIWxvb3BfY291bnQpCisJCXByaW50aygicWxvZ2ljZmMlZCA6IG1ib3hfY29tbWFuZCBsb29wIHRpbWVvdXQgIzNcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKworCXBhcmFtWzddID0gaW53KGhvc3QtPmlvX3BvcnQgKyBNQk9YNyk7CisJcGFyYW1bNl0gPSBpbncoaG9zdC0+aW9fcG9ydCArIE1CT1g2KTsKKwlwYXJhbVs1XSA9IGludyhob3N0LT5pb19wb3J0ICsgTUJPWDUpOworCXBhcmFtWzRdID0gaW53KGhvc3QtPmlvX3BvcnQgKyBNQk9YNCk7CisJcGFyYW1bM10gPSBpbncoaG9zdC0+aW9fcG9ydCArIE1CT1gzKTsKKwlwYXJhbVsyXSA9IGludyhob3N0LT5pb19wb3J0ICsgTUJPWDIpOworCXBhcmFtWzFdID0gaW53KGhvc3QtPmlvX3BvcnQgKyBNQk9YMSk7CisJcGFyYW1bMF0gPSBpbncoaG9zdC0+aW9fcG9ydCArIE1CT1gwKTsKKworCisJb3V0dygweDAsIGhvc3QtPmlvX3BvcnQgKyBQQ0lfU0VNQVBIT1JFKTsKKworCWlmIChpbncoaG9zdC0+aW9fcG9ydCArIEhPU1RfSENDUikgJiAweDAwODApIHsKKwkJaG9zdGRhdGEtPmFkYXB0ZXJfc3RhdGUgPSBBU19GSVJNV0FSRV9ERUFEOworCQlwcmludGsoInFsb2dpY2ZjJWQgOiBtYm94IG9wIGlzIHN0aWxsIHBlbmRpbmdcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZiBERUJVR19JU1AyeDAwX0lOVFIKKwordm9pZCBpc3AyeDAwX3ByaW50X3N0YXR1c19lbnRyeShzdHJ1Y3QgU3RhdHVzX0VudHJ5ICpzdGF0dXMpCit7CisJcHJpbnRrKCJxbG9naWNmYyA6IGVudHJ5IGNvdW50ID0gMHglMDJ4LCB0eXBlID0gMHglMDJ4LCBmbGFncyA9IDB4JTAyeFxuIiwgCisJc3RhdHVzLT5oZHIuZW50cnlfY250LCBzdGF0dXMtPmhkci5lbnRyeV90eXBlLCBzdGF0dXMtPmhkci5mbGFncyk7CisJcHJpbnRrKCJxbG9naWNmYyA6IHNjc2kgc3RhdHVzID0gMHglMDR4LCBjb21wbGV0aW9uIHN0YXR1cyA9IDB4JTA0eFxuIiwKKwkgICAgICAgbGUxNl90b19jcHUoc3RhdHVzLT5zY3NpX3N0YXR1cyksIGxlMTZfdG9fY3B1KHN0YXR1cy0+Y29tcGxldGlvbl9zdGF0dXMpKTsKKwlwcmludGsoInFsb2dpY2ZjIDogc3RhdGUgZmxhZ3MgPSAweCUwNHgsIHN0YXR1cyBmbGFncyA9IDB4JTA0eFxuIiwgCisJICAgICAgIGxlMTZfdG9fY3B1KHN0YXR1cy0+c3RhdGVfZmxhZ3MpLCBsZTE2X3RvX2NwdShzdGF0dXMtPnN0YXR1c19mbGFncykpOworCXByaW50aygicWxvZ2ljZmMgOiByZXNwb25zZSBpbmZvIGxlbmd0aCA9IDB4JTA0eCwgcmVxdWVzdCBzZW5zZSBsZW5ndGggPSAweCUwNHhcbiIsCisJICAgICAgIGxlMTZfdG9fY3B1KHN0YXR1cy0+cmVzX2luZm9fbGVuKSwgbGUxNl90b19jcHUoc3RhdHVzLT5yZXFfc2Vuc2VfbGVuKSk7CisJcHJpbnRrKCJxbG9naWNmYyA6IHJlc2lkdWFsIHRyYW5zZmVyIGxlbmd0aCA9IDB4JTA4eCwgcmVzcG9uc2UgPSAweCUwMnhcbiIsIGxlMzJfdG9fY3B1KHN0YXR1cy0+cmVzaWR1YWwpLCBzdGF0dXMtPnJlc19pbmZvWzNdKTsKKworfQorCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgLyogREVCVUdfSVNQMngwMF9JTlRSICovCisKKworI2lmIERFQlVHX0lTUDJ4MDAKKwordm9pZCBpc3AyeDAwX3ByaW50X3Njc2lfY21kKFNjc2lfQ21uZCAqIGNtZCkKK3sKKwlpbnQgaTsKKworCXByaW50aygicWxvZ2ljZmMgOiB0YXJnZXQgPSAweCUwMngsIGx1biA9IDB4JTAyeCwgY21kX2xlbiA9IDB4JTAyeFxuIiwgCisJICAgICAgIGNtZC0+dGFyZ2V0LCBjbWQtPmx1biwgY21kLT5jbWRfbGVuKTsKKwlwcmludGsoInFsb2dpY2ZjIDogY29tbWFuZCA9ICIpOworCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNtZF9sZW47IGkrKykKKwkJcHJpbnRrKCIweCUwMnggIiwgY21kLT5jbW5kW2ldKTsKKwlwcmludGsoIlxuIik7Cit9CisKKyNlbmRpZgkJCQkvKiBERUJVR19JU1AyeDAwICovCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisgICAgICAgIC5kZXRlY3QgICAgICAgICAgICAgICAgID0gaXNwMngwMF9kZXRlY3QsCisgICAgICAgIC5yZWxlYXNlICAgICAgICAgICAgICAgID0gaXNwMngwMF9yZWxlYXNlLAorICAgICAgICAuaW5mbyAgICAgICAgICAgICAgICAgICA9IGlzcDJ4MDBfaW5mbywKKyAgICAgICAgLnF1ZXVlY29tbWFuZCAgICAgICAgICAgPSBpc3AyeDAwX3F1ZXVlY29tbWFuZCwKKyAgICAgICAgLmVoX2Fib3J0X2hhbmRsZXIgICAgICAgPSBpc3AyeDAwX2Fib3J0LAorICAgICAgICAuYmlvc19wYXJhbSAgICAgICAgICAgICA9IGlzcDJ4MDBfYmlvc3BhcmFtLAorICAgICAgICAuY2FuX3F1ZXVlICAgICAgICAgICAgICA9IFFMT0dJQ0ZDX1JFUV9RVUVVRV9MRU4sCisgICAgICAgIC50aGlzX2lkICAgICAgICAgICAgICAgID0gLTEsCisgICAgICAgIC5zZ190YWJsZXNpemUgICAgICAgICAgID0gUUxPR0lDRkNfTUFYX1NHKFFMT0dJQ0ZDX1JFUV9RVUVVRV9MRU4pLAorCS5jbWRfcGVyX2x1bgkJPSBRTE9HSUNGQ19DTURfUEVSX0xVTiwKKyAgICAgICAgLnVzZV9jbHVzdGVyaW5nICAgICAgICAgPSBFTkFCTEVfQ0xVU1RFUklORywKK307CisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbG9naWNmY19hc20uYyBiL2RyaXZlcnMvc2NzaS9xbG9naWNmY19hc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWQ0NTEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Fsb2dpY2ZjX2FzbS5jCkBAIC0wLDAgKzEsOTc1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCQkJCQkqCisgKiAJIC0tLSBJU1AyMTAwIEZhYnJpYyBJbml0aWF0b3IvVGFyZ2V0IEZpcm13YXJlIC0tLSAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgIHdpdGggZXhwYW5kZWQgTFVOIGFkZHJlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgIGFuZCBGY1RhcGUgKEZDUC0yKSBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqCQkJCQkJCQkJKgorICoJCQkJCQkJCQkqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIENvcHlyaWdodCAoQykgMjAwMCBhbmQgMjAwMSBRbG9naWMgQ29ycG9yYXRpb24gCisgICh3d3cucWxvZ2ljLmNvbSkKKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRmlybXdhcmUgVmVyc2lvbiAxLjE5LjE2ICgxMDozNiBOb3YgMDIsIDIwMDApCisgKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHJpc2NfY29kZV9hZGRyMDEgPSAweDEwMDAgOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmlzY19jb2RlX2xlbmd0aDIxMDAgPSAweDkyNjA7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmlzY19jb2RlMjEwMFtdID0geworCTB4MDA3OCwgMHgxMDJkLCAweDAwMDAsIDB4OTI2MCwgMHgwMDAwLCAweDAwMDEsIDB4MDAxMywgMHgwMDEwLAorCTB4MDAxNywgMHgyMDQzLCAweDRmNTAsIDB4NTk1MiwgMHg0OTQ3LCAweDQ4NTQsIDB4MjAzMSwgMHgzOTM5LAorCTB4MzkyMCwgMHg1MTRjLCAweDRmNDcsIDB4NDk0MywgMHgyMDQzLCAweDRmNTIsIDB4NTA0ZiwgMHg1MjQxLAorCTB4NTQ0OSwgMHg0ZjRlLCAweDIwNDksIDB4NTM1MCwgMHgzMjMxLCAweDMwMzAsIDB4MjA0NiwgMHg2OTcyLAorCTB4NmQ3NywgMHg2MTcyLCAweDY1MjAsIDB4MjA1NiwgMHg2NTcyLCAweDczNjksIDB4NmY2ZSwgMHgyMDMwLAorCTB4MzEyZSwgMHgzMTM5LCAweDIwMjAsIDB4MjAyMCwgMHgyNDAwLCAweDIwOTEsIDB4MjAwMCwgMHgyMGMxLAorCTB4MDAyMSwgMHgyMDM5LCAweGZmZmYsIDB4MjAxOSwgMHhhYWFhLCAweDI3NjAsIDB4MjA2OSwgMHg3ZmZmLAorCTB4MjBjMSwgMHgwMDIwLCAweDJjMmMsIDB4MmQzNCwgMHgyNzYyLCAweDIzNmEsIDB4MmMyNCwgMHgyZDA0LAorCTB4MjY2YSwgMHgyNTYyLCAweGE0MDYsIDB4MDBjMCwgMHgxMDUyLCAweDIwYzEsIDB4MDAyMSwgMHgyYzJjLAorCTB4MjM2MiwgMHgyYzA0LCAweDI1NjIsIDB4YTMwNiwgMHgwMDQwLCAweDEwNTIsIDB4MjBjMSwgMHgwMDIwLAorCTB4MjAzOSwgMHg4ZmZmLCAweDIwYTEsIDB4YWEwMCwgMHgyNzA4LCAweDgxMGQsIDB4ODEwZCwgMHg4MTBkLAorCTB4ODEwZCwgMHhhMThjLCAweDAwMGYsIDB4MjAwMSwgMHgwMDBhLCAweGExMTIsIDB4YTAwZSwgMHgyMWE4LAorCTB4NDFhNCwgMHgzNDAwLCAweDgyMTEsIDB4MDBjMCwgMHgxMDVmLCAweDI3MDgsIDB4MzQwMCwgMHhhMTAyLAorCTB4MDA0MCwgMHgxMDZmLCAweDAwNDgsIDB4MTA2ZiwgMHgyMGE4LCAweGEwMGUsIDB4NDFhNCwgMHgyMGExLAorCTB4YTI2MCwgMHgyMDA5LCAweDAwMDAsIDB4MjBhOSwgMHgwN2EwLCAweDQxYTQsIDB4MzQwMCwgMHgyMGM5LAorCTB4YTdmZiwgMHgyMDU5LCAweDAwMDAsIDB4MmI3OCwgMHg3ODIzLCAweDAwMDQsIDB4MjA4OSwgMHgyNTVkLAorCTB4MjA1MSwgMHhhMzAwLCAweDJhNzAsIDB4Nzc1ZSwgMHhhNzg2LCAweDhmZmYsIDB4MDA0MCwgMHgxMDkyLAorCTB4NzA1YiwgMHhjYTAwLCAweDcwNTcsIDB4YzlmMSwgMHg3MDYzLCAweDAyMDAsIDB4NzA2NywgMHgwMjAwLAorCTB4MDA3OCwgMHgxMDlhLCAweDcwNTcsIDB4YmEwMSwgMHg3MDYzLCAweDAxMDAsIDB4NzA2NywgMHgwMTAwLAorCTB4NzA1YiwgMHhiYTAwLCAweDEwNzgsIDB4MTJkZiwgMHgxMDc4LCAweDEzYzAsIDB4MTA3OCwgMHgxNTY5LAorCTB4MTA3OCwgMHgxY2E0LCAweDEwNzgsIDB4NDIyOSwgMHgxMDc4LCAweDc0Y2YsIDB4MTA3OCwgMHgxMzRiLAorCTB4MTA3OCwgMHgyYTNmLCAweDEwNzgsIDB4NGRhMiwgMHgxMDc4LCAweDQ4YjIsIDB4MTA3OCwgMHg1N2RmLAorCTB4MTA3OCwgMHgyMWY3LCAweDEwNzgsIDB4NWFiZiwgMHgxMDc4LCAweDUzNjksIDB4MTA3OCwgMHgyMTBkLAorCTB4MTA3OCwgMHgyMWQ0LCAweDIwOTEsIDB4MzAwOSwgMHg3ODIzLCAweDAwMDAsIDB4MDA5MCwgMHgxMGNmLAorCTB4NzgyMCwgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHgxMGNmLCAweDc4MjMsIDB4NDAwMCwgMHgwMDY4LAorCTB4MTBjNywgMHg3ODFiLCAweDAwMDEsIDB4MjA5MSwgMHg1MDAwLCAweDIwOTEsIDB4NDA4MCwgMHgyYTcwLAorCTB4NzAwMywgMHgwMDAwLCAweDIwMDEsIDB4MDE3ZiwgMHgyMDAzLCAweDAwMDAsIDB4MmE3MCwgMHg3MDAwLAorCTB4YTA4ZSwgMHgwMDAzLCAweDAwYzAsIDB4MTBlZiwgMHgxMDc4LCAweDM1YmMsIDB4MTA3OCwgMHgyYTY3LAorCTB4MTA3OCwgMHg0ZGYyLCAweDEwNzgsIDB4NGE3NSwgMHgyMDA5LCAweDAxMDAsIDB4MjEwNCwgMHhhMDgyLAorCTB4MDAwMiwgMHgwMDQ4LCAweDEwZjMsIDB4MTA3OCwgMHg1N2ZiLCAweDAwNzgsIDB4MTBkNiwgMHgxMDc5LAorCTB4MTBmNywgMHgwMDc4LCAweDEwZGMsIDB4MTA3OCwgMHg2ZmE5LCAweDAwNzgsIDB4MTBlYiwgMHgxMTAxLAorCTB4MTEwMiwgMHgxMWJlLCAweDEwZmYsIDB4MTI0NiwgMHgxMmRjLCAweDEyZGQsIDB4MTJkZSwgMHgxMDc4LAorCTB4MTMyOCwgMHgwMDdjLCAweDEyN2UsIDB4MGY3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NzAwMCwgMHhhMDg2LAorCTB4MDAwMSwgMHgwMGMwLCAweDExOTgsIDB4MTA3OCwgMHgzYTQzLCAweDIwNzksIDB4MDEwMCwgMHg3ODQ0LAorCTB4YTAwNSwgMHgwMGMwLCAweDExOTgsIDB4MjAxMSwgMHg0MTI5LCAweDEwNzgsIDB4NThkNCwgMHgxMDc4LAorCTB4MWFiMSwgMHg3ODBmLCAweDAwZmYsIDB4Nzg0MCwgMHhhMDg0LCAweGZmZmIsIDB4Nzg0MiwgMHgyMDExLAorCTB4ODAxMCwgMHg3M2MwLCAweDEwNzgsIDB4MzU3OSwgMHgyMDAxLCAweGZmZmYsIDB4MTA3OCwgMHg1OTc1LAorCTB4NzIzOCwgMHhjMjg0LCAweDcyM2EsIDB4MjAwMSwgMHhhMzBjLCAweDIwMTQsIDB4YzJhYywgMHgyMjAyLAorCTB4MTA3OCwgMHg2ZGI1LCAweDIwMTEsIDB4MDAwNCwgMHgxMDc4LCAweDhhNTksIDB4MTA3OCwgMHg0N2NlLAorCTB4MTA3OCwgMHg0MjExLCAweDAwNDAsIDB4MTE0NCwgMHg3MDgzLCAweDAwMDEsIDB4NzBiYiwgMHgwMDAwLAorCTB4MTA3OCwgMHgzYmY1LCAweDAwNzgsIDB4MTE5OCwgMHgxMDc4LCAweDQ4OTcsIDB4MDA0MCwgMHgxMTRkLAorCTB4N2EwYywgMHhjMmI0LCAweDdhMGUsIDB4MDA3OCwgMHgxMTU5LCAweDEwNzgsIDB4OGRkZiwgMHg3MGM4LAorCTB4ZDA5YywgMHgwMGMwLCAweDExNTksIDB4NzA5NCwgMHhhMDA1LCAweDAwNDAsIDB4MTE1OSwgMHgxMDc4LAorCTB4NDFmNSwgMHg3MGQzLCAweDAwMDAsIDB4NzBjZiwgMHgwMDAwLCAweDcyYzgsIDB4MjA3OSwgMHhhMzUxLAorCTB4NzgwNCwgMHhkMGFjLCAweDAwNDAsIDB4MTE2NSwgMHhjMjk1LCAweDcyY2EsIDB4YTI5NiwgMHgwMDA0LAorCTB4MDA0MCwgMHgxMTg2LCAweDIwMTEsIDB4MDAwMSwgMHgxMDc4LCAweDhhNTksIDB4NzA4ZiwgMHgwMDAwLAorCTB4NzA5MywgMHhmZmZmLCAweDcwMDMsIDB4MDAwMiwgMHgwZjdmLCAweDEwNzgsIDB4MjYwZCwgMHgyMDExLAorCTB4MDAwNSwgMHgxMDc4LCAweDZlZjIsIDB4MTA3OCwgMHg2MTA5LCAweDBjN2UsIDB4MjA2MSwgMHgwMTAwLAorCTB4NjBlMywgMHgwMDA4LCAweDBjN2YsIDB4MTI3ZiwgMHgwMDc4LCAweDExOWEsIDB4NzA4ZiwgMHgwMDAwLAorCTB4NzA5MywgMHhmZmZmLCAweDcwMDMsIDB4MDAwMiwgMHgyMDExLCAweDAwMDUsIDB4MTA3OCwgMHg2ZWYyLAorCTB4MTA3OCwgMHg2MTA5LCAweDBjN2UsIDB4MjA2MSwgMHgwMTAwLCAweDYwZTMsIDB4MDAwOCwgMHgwYzdmLAorCTB4MGY3ZiwgMHgxMjdmLCAweDAwN2MsIDB4MGM3ZSwgMHgyMGE5LCAweDAwODIsIDB4MjAwOSwgMHgwMDdlLAorCTB4MDE3ZSwgMHgwMjdlLCAweDAzN2UsIDB4MjExMCwgMHgwMjdlLCAweDIwMTksIDB4MDAyOSwgMHgxMDc4LAorCTB4NzFlMCwgMHgwMjdmLCAweDEwNzgsIDB4YTE5MCwgMHgwMzdmLCAweDAyN2YsIDB4MDE3ZiwgMHgxMDc4LAorCTB4MjkyMSwgMHg4MTA4LCAweDAwZjAsIDB4MTFhMCwgMHgwYzdmLCAweDcwNmIsIDB4MDAwMCwgMHg3MDZjLAorCTB4YTA4NCwgMHgwMGZmLCAweDcwNmUsIDB4NzA5NywgMHgwMDAwLCAweDAwN2MsIDB4MTI3ZSwgMHgyMDkxLAorCTB4ODAwMCwgMHg3MDAwLCAweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDEyNDQsIDB4NzA5MCwgMHhhMDg2LAorCTB4ZmZmZiwgMHgwMDQwLCAweDExZDEsIDB4MTA3OCwgMHgyNjBkLCAweDEwNzgsIDB4NjEwOSwgMHgwMDc4LAorCTB4MTI0NCwgMHg3MGM4LCAweGQwOWMsIDB4MDA0MCwgMHgxMWZkLCAweGQwODQsIDB4MDA0MCwgMHgxMWZkLAorCTB4MGY3ZSwgMHgyMDc5LCAweDAxMDAsIDB4NzkwYywgMHhjMWI1LCAweDc5MGUsIDB4MGY3ZiwgMHhkMDhjLAorCTB4MDA0MCwgMHgxMWZkLCAweDcwY2MsIDB4YTA4NiwgMHhmZmZmLCAweDAwNDAsIDB4MTFmOSwgMHgxMDc4LAorCTB4Mjc4YSwgMHgxMDc4LCAweDYxMDksIDB4NzBjOCwgMHhkMDk0LCAweDAwYzAsIDB4MTI0NCwgMHgyMDExLAorCTB4MDAwMSwgMHgyMDE5LCAweDAwMDAsIDB4MTA3OCwgMHgyN2MyLCAweDEwNzgsIDB4NjEwOSwgMHgwMDc4LAorCTB4MTI0NCwgMHg3MGQwLCAweGEwMDUsIDB4MDBjMCwgMHgxMjQ0LCAweDcwOGMsIDB4YTAwNSwgMHgwMGMwLAorCTB4MTI0NCwgMHgxMDc4LCAweDQ4OTcsIDB4MDBjMCwgMHgxMjQ0LCAweDIwMDEsIDB4YTM1MiwgMHgyMDA0LAorCTB4ZDBhYywgMHgwMDQwLCAweDEyMjcsIDB4MTU3ZSwgMHgwYzdlLCAweDIwYTksIDB4MDA3ZiwgMHgyMDA5LAorCTB4MDAwMCwgMHgwMTdlLCAweDEwNzgsIDB4NDUwMSwgMHgwMGMwLCAweDEyMWEsIDB4NjAwMCwgMHhkMGVjLAorCTB4MDBjMCwgMHgxMjIyLCAweDAxN2YsIDB4ODEwOCwgMHgwMGYwLCAweDEyMTEsIDB4MGM3ZiwgMHgxNTdmLAorCTB4MDA3OCwgMHgxMjI3LCAweDAxN2YsIDB4MGM3ZiwgMHgxNTdmLCAweDAwNzgsIDB4MTI0NCwgMHg3MDAzLAorCTB4MDAwMywgMHg3MDkzLCAweGZmZmYsIDB4MjAwMSwgMHgwMDAwLCAweDEwNzgsIDB4MjQ4MCwgMHgxMDc4LAorCTB4MzVmNywgMHgyMDAxLCAweGE1YWMsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDUsIDB4MDBjMCwgMHgxMjNjLAorCTB4MjAxMSwgMHgwMDAwLCAweDEwNzgsIDB4NmVmMiwgMHgyMDExLCAweDAwMDAsIDB4MTA3OCwgMHg2ZWZjLAorCTB4MTA3OCwgMHg2MTA5LCAweDEwNzgsIDB4NjFkMywgMHgxMjdmLCAweDAwN2MsIDB4MDE3ZSwgMHgwZjdlLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3OSwgMHgwMTAwLCAweDIwMDksIDB4MDBmNywgMHgxMDc4LAorCTB4NDFkZSwgMHg3OTQwLCAweGExOGMsIDB4MDAxMCwgMHg3OTQyLCAweDc5MjQsIDB4ZDFiNCwgMHgwMDQwLAorCTB4MTI1YiwgMHg3ODI3LCAweDAwNDAsIDB4ZDE5YywgMHgwMDQwLCAweDEyNjAsIDB4NzgyNywgMHgwMDA4LAorCTB4MDA3ZSwgMHgwMzdlLCAweDE1N2UsIDB4YTAwNiwgMHgxMDc4LCAweDU5NzUsIDB4NzkwMCwgMHhhMThhLAorCTB4MDAwMywgMHgwMDUwLCAweDEyODksIDB4Nzk1NCwgMHhkMWFjLCAweDAwYzAsIDB4MTI4OSwgMHgyMDA5LAorCTB4MDBmOCwgMHgxMDc4LCAweDQxZGUsIDB4Nzg0MywgMHgwMDkwLCAweDc4NDMsIDB4MDAxMCwgMHgyMGE5LAorCTB4MDljNCwgMHg3ODIwLCAweGQwOWMsIDB4MDBjMCwgMHgxMjgxLCAweDc4MjQsIDB4ZDBhYywgMHgwMGMwLAorCTB4MTJjYSwgMHgwMGYwLCAweDEyNzksIDB4MjAwMSwgMHgwMDAxLCAweDEwNzgsIDB4MjQ4MCwgMHgwMDc4LAorCTB4MTJkNSwgMHg3ODUzLCAweDAwMDAsIDB4NzgyZiwgMHgwMDIwLCAweDIwYTksIDB4MDA1MCwgMHgwMGUwLAorCTB4MTI4ZiwgMHgyMDkxLCAweDYwMDAsIDB4MDBmMCwgMHgxMjhmLCAweDc4NTMsIDB4MDQwMCwgMHg3ODJmLAorCTB4MDAwMCwgMHgyMDA5LCAweDAwZjgsIDB4MTA3OCwgMHg0MWRlLCAweDIwYTksIDB4MDAwZSwgMHgwMDA1LAorCTB4MDBmMCwgMHgxMjlmLCAweDc4NTMsIDB4MTQwMCwgMHg3ODQzLCAweDAwOTAsIDB4Nzg0MywgMHgwMDEwLAorCTB4MjAxOSwgMHg2MWE4LCAweDc4NTQsIDB4MDAwNSwgMHgwMDA1LCAweGQwOGMsIDB4MDA0MCwgMHgxMmI0LAorCTB4NzgyNCwgMHhkMGFjLCAweDAwYzAsIDB4MTJjYSwgMHg4MzE5LCAweDAwYzAsIDB4MTJhYSwgMHgyMDA5LAorCTB4YTMzMSwgMHgyMTA0LCAweDgwMDAsIDB4MjAwYSwgMHhhMDg0LCAweGZmZjAsIDB4MDA0MCwgMHgxMmM0LAorCTB4MjAwYiwgMHgwMDAwLCAweDEwNzgsIDB4MjUxZSwgMHgyMDAxLCAweDAwMDEsIDB4MTA3OCwgMHgyNDgwLAorCTB4MDA3OCwgMHgxMmQzLCAweDIwMDEsIDB4YTMzMSwgMHgyMDAzLCAweDAwMDAsIDB4NzgyOCwgMHhjMDlkLAorCTB4NzgyYSwgMHg3ODI3LCAweDAwNDgsIDB4Nzg1MywgMHgwNDAwLCAweDE1N2YsIDB4MDM3ZiwgMHgwMDdmLAorCTB4MTI3ZiwgMHgwZjdmLCAweDAxN2YsIDB4MDA3YywgMHgwMDdjLCAweDAwN2MsIDB4MDA3YywgMHgyYTcwLAorCTB4MjAwOSwgMHgwMTAwLCAweDIxMDQsIDB4YTA4MiwgMHgwMDAyLCAweDAwNDgsIDB4MTJlYiwgMHg3MDRmLAorCTB4ZmZmZiwgMHgwMDc4LCAweDEyZWQsIDB4NzA0ZiwgMHgwMDAwLCAweDcwNTMsIDB4ZmZmZiwgMHg3MDZiLAorCTB4MDAwMCwgMHg3MDZmLCAweDAwMDAsIDB4MTA3OCwgMHg4ZGRmLCAweDIwNjEsIDB4YTU4YywgMHg2MDAzLAorCTB4MDkwOSwgMHg2MDA3LCAweDAwMDAsIDB4NjAwYiwgMHg4ODAwLCAweDYwMGYsIDB4MDIwMCwgMHg2MDEzLAorCTB4MDBmZiwgMHg2MDE3LCAweDAwMDMsIDB4NjAxYiwgMHgwMDAwLCAweDYwMWYsIDB4MDdkMCwgMHgyMDYxLAorCTB4YTU5NCwgMHg2MDAzLCAweDgwMDAsIDB4NjAwNywgMHgwMDAwLCAweDYwMGIsIDB4MDAwMCwgMHg2MDBmLAorCTB4MDIwMCwgMHg2MDEzLCAweDAwZmYsIDB4NjAxNywgMHgwMDAwLCAweDYwMWIsIDB4MDAwMSwgMHg2MDFmLAorCTB4MDAwMCwgMHgyMDYxLCAweGE1YTMsIDB4NjAwMywgMHg1MTRjLCAweDYwMDcsIDB4NGY0NywgMHg2MDBiLAorCTB4NDk0MywgMHg2MDBmLCAweDIwMjAsIDB4MjAwMSwgMHhhMzI1LCAweDIwMDMsIDB4MDAwMCwgMHgwMDdjLAorCTB4MjA5MSwgMHg4MDAwLCAweDAwNjgsIDB4MTMyYSwgMHgwMDdlLCAweDAxN2UsIDB4MjA3OSwgMHgwMDAwLAorCTB4NzgxOCwgMHhkMDg0LCAweDAwYzAsIDB4MTMzMCwgMHgwMTdmLCAweDc5MmUsIDB4MDA3ZiwgMHg3ODJhLAorCTB4MDA3ZiwgMHg3ODI2LCAweDM5MDAsIDB4NzgzYSwgMHg3ODIzLCAweDgwMDIsIDB4NzgxYiwgMHgwMDAxLAorCTB4MjA5MSwgMHg1MDAwLCAweDIwOTEsIDB4NDA4MCwgMHgyMDc5LCAweGEzMDAsIDB4NzgwMywgMHgwMDA1LAorCTB4MDA3OCwgMHgxMzQ4LCAweDAwN2MsIDB4MjA3MSwgMHhhMzAwLCAweDcxNTgsIDB4NzEyZSwgMHgyMDIxLAorCTB4MDAwMSwgMHhhMTkwLCAweDAwMmQsIDB4YTI5OCwgMHgwMDJkLCAweDAwNDgsIDB4MTM2MSwgMHg3MDVjLAorCTB4YTMwMiwgMHgwMGM4LCAweDEzNjEsIDB4MjIwYSwgMHgyMjA4LCAweDIzMTAsIDB4ODQyMCwgMHgwMDc4LAorCTB4MTM1MywgMHgyMDBiLCAweDAwMDAsIDB4NzRhNiwgMHg3NGFhLCAweDAwN2MsIDB4MGU3ZSwgMHgxMjdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YTMwMCwgMHg3MGE4LCAweGEwZWEsIDB4MDAxMCwgMHgwMGM4LAorCTB4MTM3NCwgMHhhMDZlLCAweDAwNzgsIDB4MTM3ZSwgMHg4MDAxLCAweDcwYWEsIDB4NzAyYywgMHgyMDY4LAorCTB4MmQwNCwgMHg3MDJlLCAweDIwNmIsIDB4MDAwMCwgMHg2ODA3LCAweDAwMDAsIDB4MTI3ZiwgMHgwZTdmLAorCTB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YTMwMCwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg3MGE4LAorCTB4ODAwMSwgMHgwMGM4LCAweDEzOGUsIDB4YTA2ZSwgMHgwMDc4LCAweDEzOTcsIDB4NzBhYSwgMHg3MDJjLAorCTB4MjA2OCwgMHgyZDA0LCAweDcwMmUsIDB4MjA2YiwgMHgwMDAwLCAweDY4MDcsIDB4MDAwMCwgMHgxMjdmLAorCTB4MGU3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhMzAwLAorCTB4NzAyYywgMHgyMDZhLCAweDJkMDAsIDB4NzAyZSwgMHg3MGE4LCAweDgwMDAsIDB4NzBhYSwgMHgxMjdmLAorCTB4MGU3ZiwgMHgwMDdjLCAweDhkZmYsIDB4MDA0MCwgMHgxM2I2LCAweDY4MDQsIDB4NjgwNywgMHgwMDAwLAorCTB4MDA3ZSwgMHgxMDc4LCAweDEzOWEsIDB4MGQ3ZiwgMHgwMDc4LCAweDEzYWEsIDB4MDA3YywgMHgwZTdlLAorCTB4MjA3MSwgMHhhMzAwLCAweDcwYTgsIDB4YTA4YSwgMHgwMDEwLCAweGEwMGQsIDB4MGU3ZiwgMHgwMDdjLAorCTB4MGU3ZSwgMHgyMDcxLCAweGE1ZDAsIDB4NzAwNywgMHgwMDAwLCAweDcwMWIsIDB4MDAwMCwgMHg3MDFmLAorCTB4MDAwMCwgMHgyMDcxLCAweDAwMDAsIDB4NzAxMCwgMHhhMDg1LCAweDgwMDQsIDB4NzAxMiwgMHgwZTdmLAorCTB4MDA3YywgMHgwZTdlLCAweDIyNzAsIDB4NzAwYiwgMHgwMDAwLCAweDIwNzEsIDB4YTVkMCwgMHg3MDE4LAorCTB4YTA4OCwgMHhhNWQ5LCAweDIyMGEsIDB4ODAwMCwgMHhhMDg0LCAweDAwMDcsIDB4NzAxYSwgMHg3MDA0LAorCTB4YTAwNSwgMHgwMGMwLCAweDEzZTksIDB4MGY3ZSwgMHgyMDc5LCAweDAwMTAsIDB4MTA3OCwgMHgxM2ZhLAorCTB4MGY3ZiwgMHgwZTdmLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGE1ZDAsIDB4NzAwNCwgMHhhMDA1LAorCTB4MDBjMCwgMHgxM2Y4LCAweDBmN2UsIDB4MjA3OSwgMHgwMDEwLCAweDEwNzgsIDB4MTNmYSwgMHgwZjdmLAorCTB4MGU3ZiwgMHgwMDdjLCAweDcwMDAsIDB4MDA3OSwgMHgxM2ZkLCAweDE0MDEsIDB4MTQ2YiwgMHgxNDg4LAorCTB4MTQ4OCwgMHg3MDE4LCAweDcxMWMsIDB4YTEwNiwgMHgwMGMwLCAweDE0MDksIDB4NzAwNywgMHgwMDAwLAorCTB4MDA3YywgMHgwZDdlLCAweGExODAsIDB4YTVkOSwgMHgyMDA0LCAweDcwMGEsIDB4MjA2OCwgMHg4MTA4LAorCTB4YTE4YywgMHgwMDA3LCAweDcxMWUsIDB4NzgwMywgMHgwMDI2LCAweDY4MjQsIDB4NzgzMiwgMHg2ODI4LAorCTB4NzgzNiwgMHg2ODJjLCAweDc4M2EsIDB4NjgzMCwgMHg3ODNlLCAweDY4MTAsIDB4NzAwZSwgMHg2ODBjLAorCTB4NzAxNiwgMHg2ODA0LCAweDBkN2YsIDB4ZDA4NCwgMHgwMDQwLCAweDE0MmIsIDB4NzAwNywgMHgwMDAxLAorCTB4MTA3OCwgMHgxNDMwLCAweDAwN2MsIDB4NzAwNywgMHgwMDAyLCAweDEwNzgsIDB4MTQ0NiwgMHgwMDdjLAorCTB4MDE3ZSwgMHgwMjdlLCAweDcxMGMsIDB4MjAxMSwgMHgwMDQwLCAweGExODIsIDB4MDA0MCwgMHgwMGM4LAorCTB4MTQzYiwgMHgyMTEwLCAweGEwMDYsIDB4NzAwZSwgMHg3MjEyLCAweDgyMDMsIDB4NzgyMiwgMHg3ODAzLAorCTB4MDAyMCwgMHg3ODAzLCAweDAwNDEsIDB4MDI3ZiwgMHgwMTdmLCAweDAwN2MsIDB4MDE3ZSwgMHgwMjdlLAorCTB4MTM3ZSwgMHgxNDdlLCAweDE1N2UsIDB4NzAxNCwgMHgyMDk4LCAweDIwYTEsIDB4MDAxNCwgMHg3ODAzLAorCTB4MDAyNiwgMHg3MTBjLCAweDIwMTEsIDB4MDA0MCwgMHhhMTgyLCAweDAwNDAsIDB4MDBjOCwgMHgxNDVhLAorCTB4MjExMCwgMHhhMDA2LCAweDcwMGUsIDB4MjJhOCwgMHg1M2E2LCAweDgyMDMsIDB4NzgyMiwgMHg3ODAzLAorCTB4MDAyMCwgMHgzMzAwLCAweDcwMTYsIDB4NzgwMywgMHgwMDAxLCAweDE1N2YsIDB4MTQ3ZiwgMHgxMzdmLAorCTB4MDI3ZiwgMHgwMTdmLCAweDAwN2MsIDB4MTM3ZSwgMHgxNDdlLCAweDE1N2UsIDB4MjA5OSwgMHhhM2Y5LAorCTB4MjBhMSwgMHgwMDE4LCAweDIwYTksIDB4MDAwOCwgMHg1M2EzLCAweDc4MDMsIDB4MDAyMCwgMHgxMjdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDc4MDMsIDB4MDA0MSwgMHg3MDA3LCAweDAwMDMsIDB4NzAwMCwgMHhjMDg0LAorCTB4NzAwMiwgMHg3MDBiLCAweGEzZjQsIDB4MTI3ZiwgMHgxNTdmLCAweDE0N2YsIDB4MTM3ZiwgMHgwMDdjLAorCTB4MTM3ZSwgMHgxNDdlLCAweDE1N2UsIDB4MjAwMSwgMHhhNDI4LCAweDIwOWMsIDB4MjBhMSwgMHgwMDE0LAorCTB4NzgwMywgMHgwMDI2LCAweDIwMDEsIDB4YTQyOSwgMHgyMGFjLCAweDUzYTYsIDB4MjA5OSwgMHhhNDJhLAorCTB4MjBhMSwgMHgwMDE4LCAweDIwYTksIDB4MDAwOCwgMHg1M2EzLCAweDc4MDMsIDB4MDAyMCwgMHgxMjdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDc4MDMsIDB4MDAwMSwgMHg3MDA3LCAweDAwMDQsIDB4NzAwMCwgMHhjMDhjLAorCTB4NzAwMiwgMHg3MDBiLCAweGE0MjUsIDB4MTI3ZiwgMHgxNTdmLCAweDE0N2YsIDB4MTM3ZiwgMHgwMDdjLAorCTB4MDE3ZSwgMHgwZTdlLCAweDIwNzEsIDB4YTVkMCwgMHgwZjdlLCAweDIwNzksIDB4MDAxMCwgMHg3OTA0LAorCTB4NzgwMywgMHgwMDAyLCAweGQxZmMsIDB4MDA0MCwgMHgxNGMyLCAweGExOGMsIDB4MDcwMCwgMHg3MDA0LAorCTB4MTA3OSwgMHgxNGM2LCAweDBmN2YsIDB4MGU3ZiwgMHgwMTdmLCAweDAwN2MsIDB4MTNmYSwgMHgxNGNlLAorCTB4MTRmYiwgMHgxNTIzLCAweDE1NTYsIDB4MTRjYywgMHgwMDc4LCAweDE0Y2MsIDB4YTE4YywgMHgwNzAwLAorCTB4MDBjMCwgMHgxNGY0LCAweDEzN2UsIDB4MTQ3ZSwgMHgxNTdlLCAweDcwMTQsIDB4MjBhMCwgMHgyMDk5LAorCTB4MDAxNCwgMHg3ODAzLCAweDAwNDAsIDB4NzAxMCwgMHgyMGE4LCAweDUzYTUsIDB4MzQwMCwgMHg3MDE2LAorCTB4MTU3ZiwgMHgxNDdmLCAweDEzN2YsIDB4NzAwYywgMHhhMDA1LCAweDAwNDAsIDB4MTUxMCwgMHgxMDc4LAorCTB4MTQzMCwgMHgwMDdjLCAweDcwMDgsIDB4YTA4MCwgMHgwMDAyLCAweDIwMDMsIDB4MDEwMCwgMHg3MDA3LAorCTB4MDAwMCwgMHgxMDc4LCAweDEzZmEsIDB4MDA3YywgMHg3MDA4LCAweGEwODAsIDB4MDAwMiwgMHgyMDAzLAorCTB4MDIwMCwgMHgwMDc4LCAweDE0ZWYsIDB4YTE4YywgMHgwNzAwLCAweDAwYzAsIDB4MTUwNiwgMHg3MDBjLAorCTB4YTAwNSwgMHgwMDQwLCAweDE1MTAsIDB4MTA3OCwgMHgxNDQ2LCAweDAwN2MsIDB4NzAwOCwgMHhhMDgwLAorCTB4MDAwMiwgMHgyMDAzLCAweDAyMDAsIDB4NzAwNywgMHgwMDAwLCAweDEwNzgsIDB4MTNmYSwgMHgwMDdjLAorCTB4MGQ3ZSwgMHg3MDA4LCAweDIwNjgsIDB4NzgzMCwgMHg2ODI2LCAweDc4MzQsIDB4NjgyYSwgMHg3ODM4LAorCTB4NjgyZSwgMHg3ODNjLCAweDY4MzIsIDB4NjgwYiwgMHgwMTAwLCAweDBkN2YsIDB4NzAwNywgMHgwMDAwLAorCTB4MTA3OCwgMHgxM2ZhLCAweDAwN2MsIDB4YTE4YywgMHgwNzAwLCAweDAwYzAsIDB4MTU1MCwgMHgxMzdlLAorCTB4MTQ3ZSwgMHgxNTdlLCAweDIwMDEsIDB4YTNmNywgMHgyMDA0LCAweGEwODAsIDB4MDAwZCwgMHgyMGEwLAorCTB4MjA5OSwgMHgwMDE0LCAweDc4MDMsIDB4MDA0MCwgMHgyMGE5LCAweDAwMjAsIDB4NTNhNSwgMHgyMDAxLAorCTB4YTNmOSwgMHgyMDA0LCAweGQwYmMsIDB4MDA0MCwgMHgxNTQ2LCAweDIwMDEsIDB4YTQwMiwgMHgyMDA0LAorCTB4YTA4MCwgMHgwMDBkLCAweDIwYTAsIDB4MjBhOSwgMHgwMDIwLCAweDUzYTUsIDB4MTU3ZiwgMHgxNDdmLAorCTB4MTM3ZiwgMHg3MDA3LCAweDAwMDAsIDB4MTA3OCwgMHg0ZTliLCAweDEwNzgsIDB4MTNmYSwgMHgwMDdjLAorCTB4MjAxMSwgMHg4MDAzLCAweDEwNzgsIDB4MzU3OSwgMHgwMDc4LCAweDE1NTQsIDB4YTE4YywgMHgwNzAwLAorCTB4MDBjMCwgMHgxNTYzLCAweDIwMDEsIDB4YTQyNywgMHgyMDAzLCAweDAxMDAsIDB4NzAwNywgMHgwMDAwLAorCTB4MTA3OCwgMHgxM2ZhLCAweDAwN2MsIDB4MjAxMSwgMHg4MDA0LCAweDEwNzgsIDB4MzU3OSwgMHgwMDc4LAorCTB4MTU2NywgMHgxMjdlLCAweDIwOTEsIDB4MjEwMCwgMHgyMDc5LCAweDAwMzAsIDB4MjA3MSwgMHhhNWUxLAorCTB4NzgwMywgMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwgMHg3MDBmLCAweGE1ZTcsIDB4NzAxMywgMHhhNWU3LAorCTB4NzgwZiwgMHgwMDc2LCAweDc4MDMsIDB4MDAwNCwgMHgxMjdmLCAweDAwN2MsIDB4NjkzNCwgMHhhMTg0LAorCTB4MDAwNywgMHgwMDc5LCAweDE1ODMsIDB4MTU4YiwgMHgxNWQxLCAweDE1OGIsIDB4MTU4YiwgMHgxNThiLAorCTB4MTViNiwgMHgxNTlhLCAweDE1OGYsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsIDB4MTVlYiwgMHg2ODRjLAorCTB4ZDBiYywgMHgwMDQwLCAweDE1OGIsIDB4Njg2MCwgMHg2ODJlLCAweDY4NWMsIDB4NjgyYSwgMHg2ODU4LAorCTB4MDA3OCwgMHgxNWQ5LCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMWUsIDB4MDBjMCwgMHgxNThiLAorCTB4Njg0YywgMHhkMGJjLCAweDAwNDAsIDB4MTU4YiwgMHg2ODYwLCAweDY4MmUsIDB4Njg1YywgMHg2ODJhLAorCTB4NjgwNCwgMHg2ODFhLCAweGEwODAsIDB4MDAwZCwgMHgyMDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLAorCTB4MjAxNSwgMHgyMDA0LCAweDY4MzIsIDB4Njg1OCwgMHgwMDc4LCAweDE1ZTEsIDB4YTE4YywgMHgwMGZmLAorCTB4YTE4NiwgMHgwMDE1LCAweDAwYzAsIDB4MTU4YiwgMHg2ODRjLCAweGQwYWMsIDB4MDA0MCwgMHgxNThiLAorCTB4NjgwNCwgMHg2ODFhLCAweGEwODAsIDB4MDAwZCwgMHgyMDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLAorCTB4MjAxNSwgMHgyMDA0LCAweDY4MzIsIDB4YTAwNiwgMHg2ODJlLCAweDY4MmEsIDB4Njg1OCwgMHgwMDc4LAorCTB4MTVlMSwgMHg2ODRjLCAweGQwYWMsIDB4MDA0MCwgMHgxNThiLCAweGEwMDYsIDB4NjgyZSwgMHg2ODJhLAorCTB4Njg1OCwgMHhhMThjLCAweDAwMGYsIDB4YTE4OCwgMHgyMDE1LCAweDIxMGMsIDB4NjkzMiwgMHgyZDA4LAorCTB4NjkxYSwgMHg2ODI2LCAweDY4NGMsIDB4YzBkZCwgMHg2ODRlLCAweGEwMDYsIDB4NjgwYSwgMHg2OTdjLAorCTB4NjkxMiwgMHg2OTgwLCAweDY5MTYsIDB4MDA3YywgMHgyMGUxLCAweDAwMDcsIDB4MjBlMSwgMHgyMDAwLAorCTB4MjAwMSwgMHgwMjBhLCAweDIwMDQsIDB4ODJmZiwgMHgwMDQwLCAweDE2MGUsIDB4YTI4MCwgMHgwMDA0LAorCTB4MGQ3ZSwgMHgyMDZjLCAweDY4NGMsIDB4ZDBkYywgMHgwMGMwLCAweDE2MGEsIDB4MTA3OCwgMHgxNTdlLAorCTB4MDA0MCwgMHgxNjBhLCAweDBkN2YsIDB4YTI4MCwgMHgwMDAwLCAweDIwMDMsIDB4MDAwMiwgMHhhMDE2LAorCTB4MDA3OCwgMHgxNjBlLCAweDY4MDgsIDB4ODAwMCwgMHg2ODBhLCAweDBkN2YsIDB4MTI3ZSwgMHgwNDdlLAorCTB4MDM3ZSwgMHgwMjdlLCAweDIwOTEsIDB4MjEwMCwgMHgwMjdmLCAweDAzN2YsIDB4MDQ3ZiwgMHg3MDAwLAorCTB4YTAwNSwgMHgwMGMwLCAweDE2MjIsIDB4NzIwNiwgMHgyMDAxLCAweDE2NDMsIDB4MDA3ZSwgMHgyMjYwLAorCTB4MDA3OCwgMHgxN2JlLCAweDcxMGMsIDB4MjIwYSwgMHg4MTA4LCAweDIzMGEsIDB4ODEwOCwgMHgyNDBhLAorCTB4ODEwOCwgMHhhMTgyLCAweGE2MDIsIDB4MDA0OCwgMHgxNjJmLCAweDIwMDksIDB4YTVlNywgMHg3MTBlLAorCTB4NzAxMCwgMHhhMTAyLCAweGEwODIsIDB4MDAwOSwgMHgwMDQwLCAweDE2M2EsIDB4YTA4MCwgMHgwMDFiLAorCTB4MDBjMCwgMHgxNjNkLCAweDIwMDksIDB4MDEzOCwgMHgyMDBhLCAweDcwMDAsIDB4YTAwNSwgMHgwMGMwLAorCTB4MTY0MywgMHgxMDc4LCAweDE3OWYsIDB4MTI3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MDI3ZSwgMHgwMzdlLAorCTB4MGM3ZSwgMHgwMDdlLCAweDIwOTEsIDB4MjEwMCwgMHgwMDdmLCAweDA0N2YsIDB4MDM3ZiwgMHgwMjdmLAorCTB4MGQ3ZSwgMHgwYzdlLCAweDI0NjAsIDB4NjExMCwgMHgyMTY4LCAweDZhNjIsIDB4NmI1ZSwgMHhhMDA1LAorCTB4MDA0MCwgMHgxNmNmLCAweDY4MDgsIDB4YTAwNSwgMHgwMDQwLCAweDE3M2MsIDB4NzAwMCwgMHhhMDA1LAorCTB4MDBjMCwgMHgxNjY0LCAweDAwNzgsIDB4MTZjNCwgMHg3MDBjLCAweDcxMTAsIDB4YTEwNiwgMHgwMGMwLAorCTB4MTc0NSwgMHg3MDA0LCAweGE0MDYsIDB4MDBjMCwgMHgxNmM0LCAweDIwMDEsIDB4MDAwNSwgMHgyMDA0LAorCTB4ZDA4YywgMHgwMDQwLCAweDE2ODEsIDB4MDQ3ZSwgMHgxMDc4LCAweDE4ZTIsIDB4MDQ3ZiwgMHgyNDYwLAorCTB4NjAxMCwgMHhhMDgwLCAweDAwMDIsIDB4MjAwNCwgMHhhMDA1LCAweDAwNDAsIDB4MTczYywgMHgwMDc4LAorCTB4MTY1ZSwgMHgyMDAxLCAweDAyMDcsIDB4MjAwNCwgMHhkMDljLCAweDAwYzAsIDB4MTY2ZCwgMHg3ODA0LAorCTB4YTA4NCwgMHg2MDAwLCAweDAwNDAsIDB4MTY5MiwgMHhhMDg2LCAweDYwMDAsIDB4MDA0MCwgMHgxNjkyLAorCTB4MDA3OCwgMHgxNjZkLCAweDcxMDAsIDB4YTE4NiwgMHgwMDAyLCAweDAwYzAsIDB4MTZiMiwgMHgwZTdlLAorCTB4MmI2OCwgMHg2ODE4LCAweDIwNjAsIDB4MTA3OCwgMHgxZmVhLCAweDI4MDQsIDB4YWM3MCwgMHg2MDM0LAorCTB4ZDA5YywgMHgwMGMwLCAweDE2YTcsIDB4NzEwOCwgMHg3MjBjLCAweDAwNzgsIDB4MTZhOSwgMHg3MTEwLAorCTB4NzIxNCwgMHg2ODEwLCAweGExMDAsIDB4NjgxMiwgMHg2ODE0LCAweGEyMDEsIDB4NjgxNiwgMHgwZTdmLAorCTB4MDA3OCwgMHgxNmI2LCAweGExODYsIDB4MDAwMSwgMHgwMGMwLCAweDE2YmUsIDB4NzgyMCwgMHg2OTEwLAorCTB4YTEwMCwgMHg2ODEyLCAweDc4MjQsIDB4NjkxNCwgMHhhMTAxLCAweDY4MTYsIDB4NzgwMywgMHgwMDA0LAorCTB4NzAwMywgMHgwMDAwLCAweDcwMDQsIDB4MjA2MCwgMHg2MTAwLCAweGExOGUsIDB4MDAwNCwgMHgwMGMwLAorCTB4MTc0NSwgMHgyMDA5LCAweDAwNDgsIDB4MTA3OCwgMHg3NTZjLCAweDAwNzgsIDB4MTc0NSwgMHg2ODA4LAorCTB4YTAwNSwgMHgwMDQwLCAweDE3M2MsIDB4NzAwMCwgMHhhMDA1LCAweDAwYzAsIDB4MTZkOSwgMHgwMDc4LAorCTB4MTczYywgMHg3MDBjLCAweDcxMTAsIDB4YTEwNiwgMHgwMGMwLCAweDE2ZTIsIDB4NzAwNCwgMHhhNDA2LAorCTB4MDBjMCwgMHgxNzNjLCAweDIwMDEsIDB4MDAwNSwgMHgyMDA0LCAweGQwOGMsIDB4MDA0MCwgMHgxNmY2LAorCTB4MDQ3ZSwgMHgxMDc4LCAweDE4ZTIsIDB4MDQ3ZiwgMHgyNDYwLCAweDYwMTAsIDB4YTA4MCwgMHgwMDAyLAorCTB4MjAwNCwgMHhhMDA1LCAweDAwNDAsIDB4MTczYywgMHgwMDc4LCAweDE2ZDMsIDB4MjAwMSwgMHgwMjA3LAorCTB4MjAwNCwgMHhkMDljLCAweDAwYzAsIDB4MTZlMiwgMHgyMDAxLCAweDAwMDUsIDB4MjAwNCwgMHhkMDhjLAorCTB4MDBjMCwgMHgxNmU4LCAweDc4MDQsIDB4YTA4NCwgMHg2MDAwLCAweDAwNDAsIDB4MTcwZCwgMHhhMDg2LAorCTB4NjAwMCwgMHgwMDQwLCAweDE3MGQsIDB4MDA3OCwgMHgxNmUyLCAweDcwMDcsIDB4MDAwMCwgMHhhMDE2LAorCTB4MjIxOCwgMHg3MDAwLCAweGEwOGUsIDB4MDAwMSwgMHgwMDQwLCAweDE3MmUsIDB4YTA4ZSwgMHgwMDAyLAorCTB4MDBjMCwgMHgxNzNjLCAweDBjN2UsIDB4MGU3ZSwgMHg2ODE4LCAweDIwNjAsIDB4MTA3OCwgMHgxZmVhLAorCTB4MjgwNCwgMHhhYzcwLCAweDYwMzQsIDB4ZDA5YywgMHgwMGMwLCAweDE3MmEsIDB4NzMwOCwgMHg3MjBjLAorCTB4MDA3OCwgMHgxNzJjLCAweDczMTAsIDB4NzIxNCwgMHgwZTdmLCAweDBjN2YsIDB4NzgyMCwgMHhhMzE4LAorCTB4NzgyNCwgMHhhMjExLCAweDY4MTAsIDB4YTMwMCwgMHg2ODEyLCAweDY4MTQsIDB4YTIwMSwgMHg2ODE2LAorCTB4NzgwMywgMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwgMHg2MTAwLCAweGExOGUsIDB4MDAwNCwgMHgwMGMwLAorCTB4MTc0NSwgMHgyMDA5LCAweDAwNDgsIDB4MTA3OCwgMHg3NTZjLCAweDBjN2YsIDB4MGQ3ZiwgMHgxMjdmLAorCTB4MDA3YywgMHgwZjdlLCAweDBlN2UsIDB4MDI3ZSwgMHgwMzdlLCAweDA0N2UsIDB4MTA3OCwgMHgxYWY3LAorCTB4MDI3ZSwgMHgyMDcxLCAweGE1ZTEsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwgMHgxNzkwLAorCTB4NzAwNCwgMHhhYzA2LCAweDAwYzAsIDB4MTc4MSwgMHgyMDc5LCAweDAwMzAsIDB4NzAwMCwgMHhhMDg2LAorCTB4MDAwMywgMHgwMDQwLCAweDE3ODEsIDB4NzgwNCwgMHhkMGZjLCAweDAwYzAsIDB4MTc3ZCwgMHgyMDAxLAorCTB4MDIwNywgMHgyMDA0LCAweGQwOWMsIDB4MDBjMCwgMHgxNzYzLCAweDc4MDMsIDB4MDAwNCwgMHg3ODA0LAorCTB4ZDBhYywgMHgwMGMwLCAweDE3NmYsIDB4NzgwMywgMHgwMDAyLCAweDc4MDMsIDB4MDAwOSwgMHg3MDAzLAorCTB4MDAwMywgMHg3MDA3LCAweDAwMDAsIDB4MDA3OCwgMHgxNzgxLCAweDEwNzgsIDB4MThlMiwgMHgwMDc4LAorCTB4MTc1MywgMHgxNTdlLCAweDIwYTksIDB4MDAwOSwgMHgyMDA5LCAweGE1ZTcsIDB4MjEwNCwgMHhhYzA2LAorCTB4MDBjMCwgMHgxNzhiLCAweDIwMGEsIDB4YTE4OCwgMHgwMDAzLCAweDAwZjAsIDB4MTc4NiwgMHgxNTdmLAorCTB4MDI3ZiwgMHgyMDAxLCAweDAxNWQsIDB4MjAxYywgMHg4MzFhLCAweDIzMDIsIDB4MjAwMSwgMHgwMTM4LAorCTB4MjIwMiwgMHgwNDdmLCAweDAzN2YsIDB4MDI3ZiwgMHgwZTdmLCAweDBmN2YsIDB4MDA3YywgMHg3MDBjLAorCTB4NzExMCwgMHhhMTA2LCAweDAwYzAsIDB4MTdhNywgMHg3MDAzLCAweDAwMDAsIDB4MDA3YywgMHgyMTA0LAorCTB4NzAwNiwgMHgyMDYwLCAweDgxMDgsIDB4MjExYywgMHg4MTA4LCAweDIxMjQsIDB4ODEwOCwgMHhhMTgyLAorCTB4YTYwMiwgMHgwMDQ4LCAweDE3YjUsIDB4MjAwOSwgMHhhNWU3LCAweDcxMTIsIDB4NzAwYywgMHhhMTA2LAorCTB4MDBjMCwgMHgxN2JlLCAweDIwMDEsIDB4MDEzOCwgMHgyMDAzLCAweDAwMDgsIDB4OGNmZiwgMHgwMGMwLAorCTB4MTdjNSwgMHgxMDc4LCAweDFiMjIsIDB4MDA3OCwgMHgxODIzLCAweDYwMTAsIDB4MjA2OCwgMHgyZDU4LAorCTB4NjgyOCwgMHhhNDA2LCAweDAwYzAsIDB4MTdkMCwgMHg2ODJjLCAweGEzMDYsIDB4MDA0MCwgMHgxN2ZlLAorCTB4NjAxYywgMHhhMDg2LCAweDAwMDgsIDB4MDA0MCwgMHgxN2ZlLCAweDYwMjQsIDB4ZDBmNCwgMHgwMGMwLAorCTB4MTdmYSwgMHhkMGQ0LCAweDAwNDAsIDB4MTdmNiwgMHg2MDM4LCAweGE0MDIsIDB4NjAzNCwgMHhhMzAzLAorCTB4MDA0MCwgMHgxN2U0LCAweDAwYzgsIDB4MTdmNiwgMHg2NDNhLCAweDYzMzYsIDB4NmMyYSwgMHg2YjJlLAorCTB4MDQ3ZSwgMHgwMzdlLCAweDI0MDAsIDB4NmM3YywgMHhhNDAyLCAweDY4MTIsIDB4MjMwMCwgMHg2YjgwLAorCTB4YTMwMywgMHg2ODE2LCAweDAzN2YsIDB4MDQ3ZiwgMHgwMDc4LCAweDE3ZmEsIDB4MTA3OCwgMHg4ZDhlLAorCTB4MDA0MCwgMHgxN2MxLCAweDEwNzgsIDB4MjAzNSwgMHgwMGMwLCAweDE3YzEsIDB4MGM3ZSwgMHg3MDA0LAorCTB4MjA2MCwgMHg2MDI0LCAweGMwZDQsIDB4NjAyNiwgMHgwYzdmLCAweDY4NGMsIDB4ZDBmNCwgMHgwMDQwLAorCTB4MTgwZiwgMHg2ODE3LCAweGZmZmYsIDB4NjgxMywgMHhmZmZmLCAweDAwNzgsIDB4MTdjMSwgMHg2ODI0LAorCTB4MjA1MCwgMHg2ODE4LCAweDIwNjAsIDB4NjgzMCwgMHgyMDQwLCAweDYwMzQsIDB4YTBjYywgMHgwMDBmLAorCTB4MjAwOSwgMHgwMDExLCAweDEwNzgsIDB4MTgyNCwgMHgwMDQwLCAweDE4MjIsIDB4MjAwOSwgMHgwMDAxLAorCTB4MTA3OCwgMHgxODI0LCAweDJkNTgsIDB4MDA3YywgMHg4YWZmLCAweDAwNDAsIDB4MThiYiwgMHhhMDNlLAorCTB4MjczMCwgMHg2ODUwLCAweGQwZmMsIDB4MDBjMCwgMHgxODQ2LCAweGQwZjQsIDB4MDBjMCwgMHgxODU2LAorCTB4MGQ3ZSwgMHgyODA0LCAweGFjNjgsIDB4MjkwMCwgMHgwMDc5LCAweDE4MzYsIDB4MTg5ZCwgMHgxODVkLAorCTB4MTg1ZCwgMHgxODlkLCAweDE4OWQsIDB4MTg5NSwgMHgxODlkLCAweDE4NWQsIDB4MTg5ZCwgMHgxODYzLAorCTB4MTg2MywgMHgxODlkLCAweDE4OWQsIDB4MTg5ZCwgMHgxODhjLCAweDE4NjMsIDB4YzBmYywgMHg2ODUyLAorCTB4NmI2YywgMHg2YTcwLCAweDZkMWMsIDB4NmMyMCwgMHgwZDdlLCAweGQ5OWMsIDB4MDA0MCwgMHgxOGEwLAorCTB4MjgwNCwgMHhhYzY4LCAweDZmMDgsIDB4NmUwYywgMHgwMDc4LCAweDE4YTAsIDB4YzBmNCwgMHg2ODUyLAorCTB4NmI2YywgMHg2YTcwLCAweDBkN2UsIDB4MDA3OCwgMHgxOGE3LCAweDZiMDgsIDB4NmEwYywgMHg2ZDAwLAorCTB4NmMwNCwgMHgwMDc4LCAweDE4YTAsIDB4N2IwYywgMHhkM2JjLCAweDAwNDAsIDB4MTg4NCwgMHg3MDA0LAorCTB4MGU3ZSwgMHgyMDcwLCAweDcwMWMsIDB4MGU3ZiwgMHhhMDg2LCAweDAwMDgsIDB4MDBjMCwgMHgxODg0LAorCTB4N2IwOCwgMHhhMzljLCAweDBmZmYsIDB4MmQyMCwgMHgwZDdmLCAweDBkN2UsIDB4NmExNCwgMHg4MmZmLAorCTB4MDBjMCwgMHgxODdmLCAweDY4MTAsIDB4YTMwMiwgMHgwMDQ4LCAweDE4N2YsIDB4NmIxMCwgMHgyMDExLAorCTB4MDAwMCwgMHgyNDY4LCAweDAwNzgsIDB4MTg4NiwgMHg2YjEwLCAweDZhMTQsIDB4NmQwMCwgMHg2YzA0LAorCTB4NmYwOCwgMHg2ZTBjLCAweDAwNzgsIDB4MThhMCwgMHgwZDdmLCAweDBkN2UsIDB4NjgzNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg2LCAweDAwMWUsIDB4MDBjMCwgMHgxODlkLCAweDBkN2YsIDB4MTA3OCwgMHgxZmQxLAorCTB4MDBjMCwgMHgxODI0LCAweGEwMGUsIDB4MDA3OCwgMHgxOGJiLCAweDBkN2YsIDB4MTA3OCwgMHgxMzI4LAorCTB4N2IyMiwgMHg3YTI2LCAweDdkMzIsIDB4N2MzNiwgMHg3ZjNhLCAweDdlM2UsIDB4NzkwMiwgMHg3MDAwLAorCTB4ODAwMCwgMHg3MDAyLCAweDBkN2YsIDB4NjgyOCwgMHhhMzAwLCAweDY4MmEsIDB4NjgyYywgMHhhMjAxLAorCTB4NjgyZSwgMHgyMzAwLCAweDZiMTAsIDB4YTMwMiwgMHg2ODEyLCAweDIyMDAsIDB4NmExNCwgMHhhMjAzLAorCTB4NjgxNiwgMHgxMDc4LCAweDFmZDEsIDB4MDA3YywgMHgxMDc4LCAweDEzMjgsIDB4MTA3OCwgMHgxYzUyLAorCTB4NzAwNCwgMHgyMDYwLCAweDBkN2UsIDB4NjAxMCwgMHgyMDY4LCAweDcwMDMsIDB4MDAwMCwgMHgxMDc4LAorCTB4MWFjNiwgMHgxMDc4LCAweDhhNDQsIDB4MDA0MCwgMHgxOGRiLCAweDY4MDgsIDB4ODAwMSwgMHg2ODBhLAorCTB4Njk3YywgMHg2OTEyLCAweDY5ODAsIDB4NjkxNiwgMHg2ODJiLCAweGZmZmYsIDB4NjgyZiwgMHhmZmZmLAorCTB4Njg1MCwgMHhjMGJkLCAweDY4NTIsIDB4MGQ3ZiwgMHgxMDc4LCAweDg3NTgsIDB4MDA3OCwgMHgxYWFkLAorCTB4MTA3OCwgMHgxMzI4LCAweDEyN2UsIDB4MjA5MSwgMHgyMTAwLCAweDAwN2UsIDB4MDE3ZSwgMHgyYjY4LAorCTB4NjgxOCwgMHgyMDYwLCAweDc5MDQsIDB4NzgwMywgMHgwMDAyLCAweGExODQsIDB4MDcwMCwgMHgwMGMwLAorCTB4MThiZSwgMHhhMTg0LCAweDAwMDMsIDB4YTA4NiwgMHgwMDAzLCAweDAwNDAsIDB4MThlMCwgMHg3MDAwLAorCTB4MDA3OSwgMHgxOGZhLCAweDE5MDIsIDB4MTkwNCwgMHgxYTA2LCAweDFhODQsIDB4MWE5YiwgMHgxOTAyLAorCTB4MTkwMiwgMHgxOTAyLCAweDEwNzgsIDB4MTMyOCwgMHg4MDAxLCAweDcwMDIsIDB4YTE4NCwgMHgwODgwLAorCTB4MDBjMCwgMHgxOTE5LCAweDhhZmYsIDB4MDA0MCwgMHgxOTliLCAweDIwMDksIDB4MDAwMSwgMHgxMDc4LAorCTB4MTgyNCwgMHgwMDQwLCAweDFhYWQsIDB4MjAwOSwgMHgwMDAxLCAweDEwNzgsIDB4MTgyNCwgMHgwMDc4LAorCTB4MWFhZCwgMHg3ODAzLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLCAweGQxYmMsIDB4MDBjMCwgMHgxOTc5LAorCTB4MDI3ZSwgMHgwMzdlLCAweDc4MDgsIDB4ZDBlYywgMHgwMGMwLCAweDE5MzAsIDB4N2MyMCwgMHg3ZDI0LAorCTB4N2UzMCwgMHg3ZjM0LCAweDc4MDMsIDB4MDAwOSwgMHg3MDAzLCAweDAwMDQsIDB4MDA3OCwgMHgxOTMyLAorCTB4MTA3OCwgMHgxYjlmLCAweDZiMjgsIDB4NmEyYywgMHgyNDAwLCAweDY4NmUsIDB4YTMxYSwgMHgyNTAwLAorCTB4Njg3MiwgMHhhMjEzLCAweDZiMmEsIDB4NmEyZSwgMHgwYzdlLCAweDcwMDQsIDB4MjA2MCwgMHg2MDI0LAorCTB4ZDBmNCwgMHgwMGMwLCAweDE5NDUsIDB4NjMzYSwgMHg2MjM2LCAweDBjN2YsIDB4MjQwMCwgMHg2OTEwLAorCTB4YTEwMCwgMHg2ODEyLCAweDI1MDAsIDB4NjkxNCwgMHhhMTAxLCAweDY4MTYsIDB4MDM3ZiwgMHgwMjdmLAorCTB4MjYwMCwgMHg2ODFlLCAweDI3MDAsIDB4NjgyMiwgMHgxMDc4LCAweDFmZWEsIDB4MmEwMCwgMHg2ODI2LAorCTB4MmMwMCwgMHg2ODFhLCAweDI4MDAsIDB4NjgzMiwgMHg2ODUwLCAweGMwZmQsIDB4Njg1MiwgMHg2ODA4LAorCTB4ODAwMSwgMHg2ODBhLCAweDAwYzAsIDB4MTk2ZSwgMHg2ODRjLCAweGQwZTQsIDB4MDA0MCwgMHgxOTZlLAorCTB4NzAwNCwgMHgyMDYwLCAweDIwMDksIDB4MDA0OCwgMHgxMDc4LCAweDc1NmMsIDB4NzAwMCwgMHhhMDg2LAorCTB4MDAwNCwgMHgwMDQwLCAweDFhYWQsIDB4NzAwMywgMHgwMDAwLCAweDEwNzgsIDB4MTc5ZiwgMHgwMDc4LAorCTB4MWFhZCwgMHgwNTdlLCAweDdkMGMsIDB4ZDViYywgMHgwMGMwLCAweDE5ODAsIDB4MTA3OCwgMHhhMjBjLAorCTB4MDU3ZiwgMHgxMDc4LCAweDFhYzYsIDB4MGY3ZSwgMHg3MDA0LCAweDIwNzgsIDB4MTA3OCwgMHg0ODkzLAorCTB4MDA0MCwgMHgxOThkLCAweDc4MjQsIDB4YzBmNSwgMHg3ODI2LCAweDBmN2YsIDB4NjgyYiwgMHhmZmZmLAorCTB4NjgyZiwgMHhmZmZmLCAweDY4MDgsIDB4ODAwMSwgMHg2ODBhLCAweDY5N2MsIDB4NjkxMiwgMHg2OTgwLAorCTB4NjkxNiwgMHgwMDc4LCAweDFhYWQsIDB4NzAwNCwgMHgwYzdlLCAweDIwNjAsIDB4NjAyNCwgMHgwYzdmLAorCTB4ZDBmNCwgMHgwMDQwLCAweDE5YTgsIDB4NjgwOCwgMHg4MDAxLCAweDY4MGEsIDB4MDA3OCwgMHgxYWFkLAorCTB4Njg0YywgMHhjMGY1LCAweDY4NGUsIDB4NzgxNCwgMHhhMDA1LCAweDAwYzAsIDB4MTljMCwgMHg3MDAzLAorCTB4MDAwMCwgMHg2ODA4LCAweDgwMDEsIDB4NjgwYSwgMHgwMGMwLCAweDE5YmMsIDB4NzAwNCwgMHgyMDYwLAorCTB4MjAwOSwgMHgwMDQ4LCAweDEwNzgsIDB4NzU2YywgMHgxMDc4LCAweDE3OWYsIDB4MDA3OCwgMHgxYWFkLAorCTB4NzgxNCwgMHg2OTEwLCAweGExMDIsIDB4NjgxMiwgMHg2OTE0LCAweGExODMsIDB4MDAwMCwgMHg2ODE2LAorCTB4NzgxNCwgMHg3OTA4LCAweGExOGMsIDB4MGZmZiwgMHhhMTg4LCAweDAwMDcsIDB4ODExNCwgMHg4MjE0LAorCTB4ODIxNCwgMHhhMTBhLCAweDgxMDQsIDB4ODAwNCwgMHg4MDA0LCAweGEyMGEsIDB4ODEwYiwgMHg4MTBiLAorCTB4ODEwYiwgMHgxMDc4LCAweDFiNGQsIDB4NzgwMywgMHgwMDA0LCAweDc4MGYsIDB4ZmZmZiwgMHg3ODAzLAorCTB4MDAwMSwgMHg3ODA0LCAweGQwZmMsIDB4MDA0MCwgMHgxOWUxLCAweDc4MDMsIDB4MDAwMiwgMHg3ODAzLAorCTB4MDAwNCwgMHg3ODBmLCAweDAwNzYsIDB4NzAwNCwgMHg3MDA3LCAweDAwMDAsIDB4MjA2MCwgMHgyMDA5LAorCTB4MDA0OCwgMHgxMDc4LCAweDc1NmMsIDB4MTA3OCwgMHgxYjgxLCAweDAwNDAsIDB4MTliYywgMHg3OTA4LAorCTB4ZDFlYywgMHgwMGMwLCAweDE5ZmYsIDB4MjAwOSwgMHgwMDA5LCAweDAwNzgsIDB4MWEwMSwgMHgyMDA5LAorCTB4MDAxOSwgMHg3OTAyLCAweDcwMDMsIDB4MDAwMywgMHgwMDc4LCAweDFhYWQsIDB4ODAwMSwgMHg3MDAyLAorCTB4ZDE5NCwgMHgwMDQwLCAweDFhMTgsIDB4NzgwNCwgMHhkMGZjLCAweDAwYzAsIDB4MThlYSwgMHg4YWZmLAorCTB4MDA0MCwgMHgxYWFkLCAweDIwMDksIDB4MDAwMSwgMHgxMDc4LCAweDE4MjQsIDB4MDA3OCwgMHgxYWFkLAorCTB4YTE4NCwgMHgwODgwLCAweDAwYzAsIDB4MWEyNSwgMHg4YWZmLCAweDAwNDAsIDB4MWFhZCwgMHgyMDA5LAorCTB4MDAwMSwgMHgxMDc4LCAweDE4MjQsIDB4MDA3OCwgMHgxYWFkLCAweDc4MDMsIDB4MDAwNCwgMHg3MDAzLAorCTB4MDAwMCwgMHhkMWJjLCAweDAwYzAsIDB4MWE2NSwgMHgwMjdlLCAweDAzN2UsIDB4NzgwOCwgMHhkMGVjLAorCTB4MDBjMCwgMHgxYTM4LCAweDc4MDMsIDB4MDAwOSwgMHg3MDAzLCAweDAwMDQsIDB4MDA3OCwgMHgxYTNhLAorCTB4MTA3OCwgMHgxYjlmLCAweDZiMjgsIDB4NmEyYywgMHgxMDc4LCAweDFmZWEsIDB4MGQ3ZSwgMHgwZjdlLAorCTB4MmQ3OCwgMHgyODA0LCAweGFjNjgsIDB4NjAzNCwgMHhkMDljLCAweDAwYzAsIDB4MWE1NSwgMHg2ODA4LAorCTB4MjAwOCwgMHhhMzFhLCAweDY4MGMsIDB4YTIxMywgMHg3ODEwLCAweGExMDAsIDB4NzgxMiwgMHg2OTBjLAorCTB4NzgxNCwgMHhhMTAxLCAweDc4MTYsIDB4MDA3OCwgMHgxYTYxLCAweDY4MTAsIDB4MjAwOCwgMHhhMzFhLAorCTB4NjgxNCwgMHhhMjEzLCAweDc4MTAsIDB4YTEwMCwgMHg3ODEyLCAweDY5MTQsIDB4NzgxNCwgMHhhMTAxLAorCTB4NzgxNiwgMHgwZjdmLCAweDBkN2YsIDB4MDA3OCwgMHgxOTM0LCAweDA1N2UsIDB4N2QwYywgMHgxMDc4LAorCTB4YTIwYywgMHgwNTdmLCAweDEwNzgsIDB4MWFjNiwgMHgwZjdlLCAweDcwMDQsIDB4MjA3OCwgMHgxMDc4LAorCTB4NDg5MywgMHgwMDQwLCAweDFhNzYsIDB4NzgyNCwgMHhjMGY1LCAweDc4MjYsIDB4MGY3ZiwgMHg2ODJiLAorCTB4ZmZmZiwgMHg2ODJmLCAweGZmZmYsIDB4NjgwOCwgMHg4MDAxLCAweDY4MGEsIDB4Njk3YywgMHg2OTEyLAorCTB4Njk4MCwgMHg2OTE2LCAweDAwNzgsIDB4MWFhZCwgMHg3ODAzLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLAorCTB4NzAwNCwgMHhhMDBkLCAweDAwNDAsIDB4MWE5NywgMHg2ODA4LCAweDgwMDEsIDB4NjgwYSwgMHgwMGMwLAorCTB4MWE5NywgMHg3MDA0LCAweDIwNjAsIDB4MjAwOSwgMHgwMDQ4LCAweDEwNzgsIDB4NzU2YywgMHgxMDc4LAorCTB4MTc5ZiwgMHgwMDc4LCAweDFhYWQsIDB4NzgwMywgMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwgMHg3MDA0LAorCTB4MjA2MCwgMHg2MDEwLCAweGEwMDUsIDB4MDA0MCwgMHgxYTk3LCAweDIwNjgsIDB4NjgwOCwgMHg4MDAwLAorCTB4NjgwYSwgMHg2YzI4LCAweDZiMmMsIDB4MTA3OCwgMHgxN2JlLCAweDAxN2YsIDB4MDA3ZiwgMHgxMjdmLAorCTB4MDA3YywgMHgxMjdlLCAweDIwOTEsIDB4MjEwMCwgMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMGMwLAorCTB4MWFjNCwgMHg3MDBjLCAweDcxMTAsIDB4YTEwNiwgMHgwMDQwLCAweDFhYzQsIDB4MjBlMSwgMHg5MDI4LAorCTB4NzAwZiwgMHhhNWU3LCAweDcwMTMsIDB4YTVlNywgMHgxMjdmLCAweDAwN2MsIDB4MGM3ZSwgMHgxMDc4LAorCTB4MWFmNywgMHgyMGUxLCAweDkwMjgsIDB4NzAwYywgMHg3MTEwLCAweGExMDYsIDB4MDA0MCwgMHgxYWVkLAorCTB4MjEwNCwgMHhhMDA1LCAweDAwNDAsIDB4MWFkYSwgMHgyMDYwLCAweDYwMTAsIDB4MjA2MCwgMHg2MDA4LAorCTB4ODAwMSwgMHg2MDBhLCAweGExODgsIDB4MDAwMywgMHhhMTgyLCAweGE2MDIsIDB4MDA0OCwgMHgxYWUyLAorCTB4MjAwOSwgMHhhNWU3LCAweDcxMTIsIDB4NzAwYywgMHhhMTA2LCAweDAwYzAsIDB4MWFjYiwgMHgyMDAxLAorCTB4MDEzOCwgMHgyMDAzLCAweDAwMDgsIDB4MDA3OCwgMHgxYWNiLCAweDIwMDEsIDB4MDE1ZCwgMHgyMDBjLAorCTB4ODEwYSwgMHgyMTAyLCAweDIwMDEsIDB4MDEzOCwgMHgyMjAyLCAweDBjN2YsIDB4MDA3YywgMHgyMDAxLAorCTB4MDEzOCwgMHgyMDE0LCAweDIwMDMsIDB4MDAwMCwgMHgyMDIxLCAweGIwMTUsIDB4MjAwMSwgMHgwMTQxLAorCTB4MjAxYywgMHhkM2RjLCAweDAwYzAsIDB4MWIxNCwgMHgyMDAxLCAweDAxMDksIDB4MjAxYywgMHhhMzljLAorCTB4MDA0OCwgMHgwMGMwLCAweDFiMTQsIDB4MjAwMSwgMHgwMTExLCAweDIwMWMsIDB4ODNmZiwgMHgwMGMwLAorCTB4MWIxNCwgMHg4NDIxLCAweDAwYzAsIDB4MWFmZSwgMHgwMDdjLCAweDIwMTEsIDB4MDIwMSwgMHgyMDA5LAorCTB4MDAzYywgMHgyMjA0LCAweGEwMDUsIDB4MDBjMCwgMHgxYjIxLCAweDgxMDksIDB4MDBjMCwgMHgxYjE5LAorCTB4MDA3YywgMHgwMDdjLCAweDEwNzgsIDB4MWIxNSwgMHgwMDQwLCAweDFiNGEsIDB4NzkwOCwgMHhkMWVjLAorCTB4MDBjMCwgMHgxYjNhLCAweDEwNzgsIDB4MWI4MSwgMHgwMDQwLCAweDFiM2EsIDB4NzgwMywgMHgwMDA5LAorCTB4NzkwNCwgMHhkMWZjLCAweDAwNDAsIDB4MWIzMCwgMHg3ODAzLCAweDAwMDYsIDB4MTA3OCwgMHgxYjE1LAorCTB4MDA0MCwgMHgxYjRhLCAweDc4MGMsIDB4ZDBhNCwgMHgwMGMwLCAweDFiNGEsIDB4NzAwNywgMHgwMDAwLAorCTB4MTA3OCwgMHgxYjgxLCAweDAwNDAsIDB4MWI0YywgMHg3ODAzLCAweDAwMTksIDB4NzAwMywgMHgwMDAzLAorCTB4MDA3OCwgMHgxYjRjLCAweDEwNzgsIDB4MWFjNiwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHgwMjAwLAorCTB4NzgwOCwgMHhhMDg0LCAweGYwMDAsIDB4YTEwZCwgMHgxMDc4LCAweDFhZjcsIDB4MjAxOSwgMHg1MDAwLAorCTB4ODMxOSwgMHgwMDQwLCAweDFiNmIsIDB4MjAwMSwgMHhhNjAyLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAwLAorCTB4MDA0MCwgMHgxYjZiLCAweDIwMDEsIDB4MDAyMSwgMHhkMGZjLCAweDAwNDAsIDB4MWI1OCwgMHgxMDc4LAorCTB4MWU1ZCwgMHgwMDc4LCAweDFiNTYsIDB4MjBlMSwgMHg3MDAwLCAweDczMjQsIDB4NzQyMCwgMHg3MDI4LAorCTB4NzAyOCwgMHg3NDI2LCAweDcwMzcsIDB4MDAwMSwgMHg4MTBmLCAweDcxMmUsIDB4NzAyZiwgMHgwMTAwLAorCTB4NzAzNywgMHgwMDA4LCAweDczMjYsIDB4NzQyMiwgMHgyMDAxLCAweDAxMzgsIDB4MjIwMiwgMHgwZTdmLAorCTB4MDA3YywgMHg3OTA4LCAweGExOGMsIDB4MGZmZiwgMHhhMTgyLCAweDAwMDksIDB4MDA0OCwgMHgxYjhjLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwNzgsIDB4MWI5ZSwgMHgyMDAxLCAweDAyMGEsIDB4ODFmZiwgMHgwMDQwLAorCTB4MWI5NywgMHgyMGUxLCAweDYwMDAsIDB4MjAwYywgMHgyMDBjLCAweDIwMGMsIDB4MjAwYywgMHgyMGUxLAorCTB4NzAwMCwgMHgyMDBjLCAweDIwMGMsIDB4NzAwMywgMHgwMDAwLCAweGEwMDYsIDB4MDA3YywgMHg3YzIwLAorCTB4N2QyNCwgMHg3ZTMwLCAweDdmMzQsIDB4NzAwYywgMHg3MTEwLCAweGExMDYsIDB4MDA0MCwgMHgxYzI0LAorCTB4NzAwNCwgMHgwMTdlLCAweDIxMGMsIDB4YTEwNiwgMHgwMTdmLCAweDAwNDAsIDB4MWMyNCwgMHgwZDdlLAorCTB4MGM3ZSwgMHgyMTZjLCAweDJkMDAsIDB4YTAwNSwgMHgwMDQwLCAweDFjMjIsIDB4NjgyNCwgMHhkMGQ0LAorCTB4MDBjMCwgMHgxYzIyLCAweDY4MTAsIDB4MjA2OCwgMHg2ODUwLCAweGQwZmMsIDB4MDA0MCwgMHgxYmVjLAorCTB4ODEwOCwgMHgyMTA0LCAweDZiMmMsIDB4YTMwNiwgMHgwMGMwLCAweDFjMjIsIDB4ODEwOCwgMHgyMTA0LAorCTB4NmEyOCwgMHhhMjA2LCAweDAwYzAsIDB4MWMyMiwgMHg2ODUwLCAweGMwZmMsIDB4YzBmNSwgMHg2ODUyLAorCTB4Njg2YywgMHg3ODIyLCAweDY4NzAsIDB4NzgyNiwgMHg2ODFjLCAweDc4MzIsIDB4NjgyMCwgMHg3ODM2LAorCTB4NjgxOCwgMHgyMDYwLCAweDYwMzQsIDB4ZDA5YywgMHgwMDQwLCAweDFiZTcsIDB4NjgzMCwgMHgyMDA0LAorCTB4YWM2OCwgMHg2ODA4LCAweDc4M2EsIDB4NjgwYywgMHg3ODNlLCAweDAwNzgsIDB4MWMyMCwgMHhhMDA2LAorCTB4NzgzYSwgMHg3ODNlLCAweDAwNzgsIDB4MWMyMCwgMHg4MTA4LCAweDIxMDQsIDB4YTAwNSwgMHgwMGMwLAorCTB4MWMyMiwgMHg4MTA4LCAweDIxMDQsIDB4YTAwNSwgMHgwMGMwLCAweDFjMjIsIDB4Njg1MCwgMHhjMGY1LAorCTB4Njg1MiwgMHg2ODMwLCAweDIwMDQsIDB4NjkxOCwgMHhhMTYwLCAweGExODAsIDB4MDAwZCwgMHgyMDA0LAorCTB4ZDA5YywgMHgwMGMwLCAweDFjMTIsIDB4NjAwOCwgMHg3ODIyLCAweDY4NmUsIDB4NjAwYywgMHg3ODI2LAorCTB4Njg3MiwgMHg2MDAwLCAweDc4MzIsIDB4NjAwNCwgMHg3ODM2LCAweGEwMDYsIDB4NzgzYSwgMHg3ODNlLAorCTB4MDA3OCwgMHgxYzIwLCAweDYwMTAsIDB4NzgyMiwgMHg2ODZlLCAweDYwMTQsIDB4NzgyNiwgMHg2ODcyLAorCTB4NjAwMCwgMHg3ODMyLCAweDYwMDQsIDB4NzgzNiwgMHg2MDA4LCAweDc4M2EsIDB4NjAwYywgMHg3ODNlLAorCTB4NzgwMywgMHgwMDExLCAweDBjN2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDBmN2UsIDB4MGU3ZSwgMHgwMTdlLAorCTB4MDI3ZSwgMHgyMDcxLCAweGE1ZTEsIDB4MjA3OSwgMHgwMDMwLCAweDIwMTEsIDB4MDA1MCwgMHg3MDAwLAorCTB4YTA4NiwgMHgwMDAwLCAweDAwNDAsIDB4MWM0ZCwgMHg4MjExLCAweDAwNDAsIDB4MWM0YiwgMHgyMDAxLAorCTB4MDAwNSwgMHgyMDA0LCAweGQwOGMsIDB4MDA0MCwgMHgxYzM0LCAweDc5MDQsIDB4YTE4YywgMHgwNzgwLAorCTB4MDE3ZSwgMHgxMDc4LCAweDE4ZTIsIDB4MDE3ZiwgMHg4MWZmLCAweDAwYzAsIDB4MWM0YiwgMHgyMDExLAorCTB4MDA1MCwgMHgwMDc4LCAweDFjMmYsIDB4YTA4NSwgMHgwMDAxLCAweDAyN2YsIDB4MDE3ZiwgMHgwZTdmLAorCTB4MGY3ZiwgMHgwMDdjLCAweDc4MDMsIDB4MDAwNCwgMHgyMDA5LCAweDAwNjQsIDB4NzgwNCwgMHhkMGFjLAorCTB4MDA0MCwgMHgxY2EzLCAweDgxMDksIDB4MDBjMCwgMHgxYzU2LCAweDIwMDksIDB4MDEwMCwgMHgyMTBjLAorCTB4YTE4YSwgMHgwMDAzLCAweDEwNDgsIDB4MTMyOCwgMHgxMDc4LCAweDFmNzUsIDB4MGU3ZSwgMHgwZjdlLAorCTB4MjA3MSwgMHhhNWQwLCAweDIwNzksIDB4MDAxMCwgMHg3MDA0LCAweGEwODYsIDB4MDAwMCwgMHgwMDQwLAorCTB4MWM5YiwgMHg3ODAwLCAweDAwN2UsIDB4NzgyMCwgMHgwMDdlLCAweDc4MzAsIDB4MDA3ZSwgMHg3ODM0LAorCTB4MDA3ZSwgMHg3ODM4LCAweDAwN2UsIDB4NzgzYywgMHgwMDdlLCAweDc4MDMsIDB4MDAwNCwgMHg3ODIzLAorCTB4MDAwMCwgMHgwMDA1LCAweDAwMDUsIDB4MjA3OSwgMHgwMDMwLCAweDc4MDQsIDB4ZDBhYywgMHgxMGMwLAorCTB4MTMyOCwgMHgyMDc5LCAweDAwMTAsIDB4MDA3ZiwgMHg3ODNlLCAweDAwN2YsIDB4NzgzYSwgMHgwMDdmLAorCTB4NzgzNiwgMHgwMDdmLCAweDc4MzIsIDB4MDA3ZiwgMHg3ODIyLCAweDAwN2YsIDB4NzgwMiwgMHgwZjdmLAorCTB4MGU3ZiwgMHgwMDc4LCAweDFjYTEsIDB4MGY3ZiwgMHgwZTdmLCAweDc4MDQsIDB4ZDBhYywgMHgxMGMwLAorCTB4MTMyOCwgMHgxMDc4LCAweDYxZDMsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YTYwMiwgMHg3MDAzLAorCTB4MDAwMCwgMHgwZTdmLCAweDAwN2MsIDB4MGQ3ZSwgMHhhMjgwLCAweDAwMDQsIDB4MjA2YywgMHg2OTRjLAorCTB4ZDFkYywgMHgwMGMwLCAweDFkMjYsIDB4NjkzNCwgMHhhMTg0LCAweDAwMDcsIDB4MDA3OSwgMHgxY2I4LAorCTB4MWNjMCwgMHgxZDExLCAweDFjYzAsIDB4MWNjMCwgMHgxY2MwLCAweDFjZjYsIDB4MWNkMywgMHgxY2MyLAorCTB4MTA3OCwgMHgxMzI4LCAweDY4NGMsIDB4ZDBiNCwgMHgwMDQwLCAweDFlMzQsIDB4Njg2MCwgMHg2ODJlLAorCTB4NjgxNiwgMHg2ODVjLCAweDY4MmEsIDB4NjgxMiwgMHg2ODdjLCAweDY4MGEsIDB4Njg4MCwgMHg2ODBlLAorCTB4Njk1OCwgMHgwMDc4LCAweDFkMTksIDB4NjgzNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDFlLAorCTB4MDBjMCwgMHgxY2MwLCAweDY4NGMsIDB4ZDBiNCwgMHgwMDQwLCAweDFlMzQsIDB4Njg2MCwgMHg2ODJlLAorCTB4NjgxNiwgMHg2ODVjLCAweDY4MmEsIDB4NjgxMiwgMHg2ODdjLCAweDY4MGEsIDB4Njg4MCwgMHg2ODBlLAorCTB4NjgwNCwgMHg2ODFhLCAweGEwODAsIDB4MDAwZCwgMHgyMDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLAorCTB4MjAxNSwgMHgyMDA0LCAweDY4MzIsIDB4Njk1OCwgMHgwMDc4LCAweDFkMjIsIDB4YTE4YywgMHgwMGZmLAorCTB4YTE4NiwgMHgwMDE1LCAweDAwYzAsIDB4MWQyNiwgMHg2ODRjLCAweGQwYjQsIDB4MDA0MCwgMHgxZTM0LAorCTB4NjgwNCwgMHg2ODFhLCAweGEwODAsIDB4MDAwZCwgMHgyMDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLAorCTB4MjAxNSwgMHgyMDA0LCAweDY4MzIsIDB4Njk1OCwgMHhhMDA2LCAweDY4MmUsIDB4NjgyYSwgMHgwMDc4LAorCTB4MWQyMiwgMHg2ODRjLCAweGQwYjQsIDB4MDA0MCwgMHgxOGJjLCAweDY5NTgsIDB4YTAwNiwgMHg2ODJlLAorCTB4NjgyYSwgMHgyZDAwLCAweDY4MWEsIDB4NjgzNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHgyMDE1LAorCTB4MjAwNCwgMHg2ODMyLCAweDY5MjYsIDB4Njg0YywgMHhjMGRkLCAweDY4NGUsIDB4MGQ3ZiwgMHgwMDdjLAorCTB4MGY3ZSwgMHgyMDc5LCAweDAwMjAsIDB4NzgwNCwgMHhkMGZjLCAweDEwYzAsIDB4MWU1ZCwgMHgwZTdlLAorCTB4MGQ3ZSwgMHgyMDcxLCAweGE2MDIsIDB4NzAwMCwgMHhhMDA1LCAweDAwYzAsIDB4MWRhYiwgMHgwYzdlLAorCTB4NzIwNiwgMHhhMjgwLCAweDAwMDQsIDB4MjA1YywgMHg3MDA0LCAweDIwNjgsIDB4NzgwMywgMHgwMDA0LAorCTB4NjgxOCwgMHgwZDdlLCAweDIwNjgsIDB4Njg2YywgMHg3ODEyLCAweDY4OTAsIDB4MGY3ZSwgMHgyMGUxLAorCTB4OTA0MCwgMHgyMDc5LCAweDAyMDAsIDB4NzgxYSwgMHgyMDc5LCAweDAxMDAsIDB4ODAwNCwgMHg3OGQ2LAorCTB4MGY3ZiwgMHgwZDdmLCAweDJiNjgsIDB4NjgyNCwgMHgyMDUwLCAweDY4MTgsIDB4MjA2MCwgMHg2ODMwLAorCTB4MjA0MCwgMHg2MDM0LCAweGEwY2MsIDB4MDAwZiwgMHg2OTA4LCAweDIwMDEsIDB4MDRmZCwgMHgyMDA0LAorCTB4YTA4NiwgMHgwMDA3LCAweDAwNDAsIDB4MWQ2ZCwgMHhhMTg0LCAweDAwMDcsIDB4MDA0MCwgMHgxZDZkLAorCTB4MDE3ZSwgMHgyMDA5LCAweDAwMDgsIDB4YTEwMiwgMHgwMTdmLCAweGExMDgsIDB4NzkxYSwgMHg3MTE2LAorCTB4NzAxZSwgMHg2ODBjLCAweGEwODEsIDB4MDAwMCwgMHg3ODFlLCAweDcwMWEsIDB4YTAwNiwgMHg3MDBlLAorCTB4NzAxMiwgMHg3MDA0LCAweDY5MmMsIDB4NjgxNCwgMHhhMTA2LCAweDAwYzAsIDB4MWQ4NCwgMHg2OTI4LAorCTB4NjgxMCwgMHhhMTA2LCAweDAwNDAsIDB4MWQ5MSwgMHgwMzdlLCAweDA0N2UsIDB4NmIxNCwgMHg2YzEwLAorCTB4MTA3OCwgMHgyMDM1LCAweDA0N2YsIDB4MDM3ZiwgMHgwMDQwLCAweDFkOTEsIDB4MGM3ZiwgMHgwMDc4LAorCTB4MWRhYiwgMHg4YWZmLCAweDAwYzAsIDB4MWQ5OSwgMHgwYzdmLCAweGEwODUsIDB4MDAwMSwgMHgwMDc4LAorCTB4MWRhYiwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDc5LCAweDAwMjAsIDB4MjAwOSwgMHgwMDAxLAorCTB4MTA3OCwgMHgxZGFmLCAweDAwNDAsIDB4MWRhOCwgMHgyMDA5LCAweDAwMDEsIDB4MTA3OCwgMHgxZGFmLAorCTB4MTI3ZiwgMHgwYzdmLCAweGEwMDYsIDB4MGQ3ZiwgMHgwZTdmLCAweDBmN2YsIDB4MDA3YywgMHgwNzdlLAorCTB4MDY3ZSwgMHgwNTdlLCAweDA0N2UsIDB4MDM3ZSwgMHgwMjdlLCAweDhhZmYsIDB4MDA0MCwgMHgxZTJkLAorCTB4NzAwYywgMHg3MjE0LCAweGEyM2EsIDB4NzAxMCwgMHg3MjE4LCAweGEyMDMsIDB4MDA0OCwgMHgxZTJjLAorCTB4YTcwNSwgMHgwMDQwLCAweDFlMmMsIDB4YTAzZSwgMHgyNzMwLCAweDY4NTAsIDB4ZDBmYywgMHgwMGMwLAorCTB4MWRkZiwgMHgwZDdlLCAweDI4MDQsIDB4YWM2OCwgMHgyOTAwLCAweDAwNzksIDB4MWRjZiwgMHgxZTBlLAorCTB4MWRlZiwgMHgxZGVmLCAweDFlMGUsIDB4MWUwZSwgMHgxZTA2LCAweDFlMGUsIDB4MWRlZiwgMHgxZTBlLAorCTB4MWRmNSwgMHgxZGY1LCAweDFlMGUsIDB4MWUwZSwgMHgxZTBlLCAweDFkZmQsIDB4MWRmNSwgMHhjMGZjLAorCTB4Njg1MiwgMHg2YjZjLCAweDZhNzAsIDB4NmQxYywgMHg2YzIwLCAweGQ5OWMsIDB4MDA0MCwgMHgxZTEyLAorCTB4MGQ3ZSwgMHgyODA0LCAweGFjNjgsIDB4NmYwOCwgMHg2ZTBjLCAweDAwNzgsIDB4MWUxMSwgMHg2YjA4LAorCTB4NmEwYywgMHg2ZDAwLCAweDZjMDQsIDB4MDA3OCwgMHgxZTExLCAweDZiMTAsIDB4NmExNCwgMHg2ZDAwLAorCTB4NmMwNCwgMHg2ZjA4LCAweDZlMGMsIDB4MDA3OCwgMHgxZTExLCAweDBkN2YsIDB4MGQ3ZSwgMHg2ODM0LAorCTB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAxZSwgMHgwMGMwLCAweDFlMGUsIDB4MGQ3ZiwgMHgxMDc4LAorCTB4MWZkMSwgMHgwMGMwLCAweDFkYjUsIDB4YTAwZSwgMHgwMDc4LCAweDFlMmQsIDB4MGQ3ZiwgMHgxMDc4LAorCTB4MTMyOCwgMHgwZDdmLCAweDdiMjIsIDB4N2EyNiwgMHg3ZDMyLCAweDdjMzYsIDB4N2YzYSwgMHg3ZTNlLAorCTB4NzkwMiwgMHg3MDAwLCAweDgwMDAsIDB4NzAwMiwgMHg2ODI4LCAweGEzMDAsIDB4NjgyYSwgMHg2ODJjLAorCTB4YTIwMSwgMHg2ODJlLCAweDcwMGMsIDB4YTMwMCwgMHg3MDBlLCAweDcwMTAsIDB4YTIwMSwgMHg3MDEyLAorCTB4MTA3OCwgMHgxZmQxLCAweDAwNzgsIDB4MWUyZCwgMHhhMDA2LCAweDAyN2YsIDB4MDM3ZiwgMHgwNDdmLAorCTB4MDU3ZiwgMHgwNjdmLCAweDA3N2YsIDB4MDA3YywgMHgxMDc4LCAweDEzMjgsIDB4MDI3ZSwgMHgyMDAxLAorCTB4MDEwNSwgMHgyMDAzLCAweDAwMTAsIDB4MjBlMSwgMHg5MDQwLCAweDc4MDMsIDB4MDAwNCwgMHg3MDAzLAorCTB4MDAwMCwgMHg3MDA0LCAweDIwNjAsIDB4MGQ3ZSwgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4YTQ0LAorCTB4MDA0MCwgMHgxZTRkLCAweDY4NTAsIDB4YzBiZCwgMHg2ODUyLCAweDBkN2YsIDB4MTA3OCwgMHg4NzU4LAorCTB4MjBlMSwgMHg5MDQwLCAweDEwNzgsIDB4NzE5YSwgMHgyMDExLCAweDAwMDAsIDB4MTA3OCwgMHg2ZWZjLAorCTB4MTA3OCwgMHg2MWQzLCAweDAyN2YsIDB4MDA3OCwgMHgxZjI5LCAweDEyN2UsIDB4MjA5MSwgMHgyMjAwLAorCTB4MDA3ZSwgMHgwMTdlLCAweDBmN2UsIDB4MGU3ZSwgMHgwZDdlLCAweDBjN2UsIDB4MjA3OSwgMHgwMDIwLAorCTB4MjA3MSwgMHhhNjAyLCAweDJiNjgsIDB4NjgxOCwgMHgyMDYwLCAweDc5MDQsIDB4NzgwMywgMHgwMDAyLAorCTB4YTE4NCwgMHgwNzAwLCAweDAwYzAsIDB4MWUzNiwgMHg3MDAwLCAweDAwNzksIDB4MWU3NywgMHgxZjI5LAorCTB4MWU3YiwgMHgxZWY2LCAweDFmMjcsIDB4ODAwMSwgMHg3MDAyLCAweGQxOWMsIDB4MDBjMCwgMHgxZThmLAorCTB4OGFmZiwgMHgwMDQwLCAweDFlYWUsIDB4MjAwOSwgMHgwMDAxLCAweDEwNzgsIDB4MWRhZiwgMHgwMDQwLAorCTB4MWYyOSwgMHgyMDA5LCAweDAwMDEsIDB4MTA3OCwgMHgxZGFmLCAweDAwNzgsIDB4MWYyOSwgMHg3ODAzLAorCTB4MDAwNCwgMHhkMTk0LCAweDAwNDAsIDB4MWU5ZiwgMHg2ODUwLCAweGMwZmMsIDB4Njg1MiwgMHg4YWZmLAorCTB4MDBjMCwgMHgxZWE0LCAweDY4NGMsIDB4YzBmNSwgMHg2ODRlLCAweDAwNzgsIDB4MWVhNCwgMHgxMDc4LAorCTB4MWZlYSwgMHg2ODUwLCAweGMwZmQsIDB4Njg1MiwgMHgyYTAwLCAweDY4MjYsIDB4MmMwMCwgMHg2ODFhLAorCTB4MjgwMCwgMHg2ODMyLCAweDcwMDMsIDB4MDAwMCwgMHgwMDc4LCAweDFmMjksIDB4NzExYywgMHg4MWZmLAorCTB4MDA0MCwgMHgxZWM0LCAweDc5MTgsIDB4NzkyMiwgMHg3ODI3LCAweDAwMDAsIDB4NzgwMywgMHgwMDAxLAorCTB4NzAwMCwgMHg4MDAwLCAweDcwMDIsIDB4NzAwYywgMHhhMTAwLCAweDcwMGUsIDB4NzAxMCwgMHhhMDgxLAorCTB4MDAwMCwgMHg3MDEyLCAweDAwNzgsIDB4MWYyOSwgMHgwZjdlLCAweDAyN2UsIDB4NzgxYywgMHgwMDdlLAorCTB4NzgxOCwgMHgwMDdlLCAweDIwNzksIDB4MDEwMCwgMHg3YTE0LCAweGEyODQsIDB4MDAwNCwgMHhhMDg1LAorCTB4MDAxMiwgMHg3ODE2LCAweDAzN2UsIDB4MjAxOSwgMHgxMDAwLCAweDgzMTksIDB4MTA0MCwgMHgxMzI4LAorCTB4NzgyMCwgMHhkMGJjLCAweDAwYzAsIDB4MWVkNSwgMHgwMzdmLCAweDc5YzgsIDB4MDA3ZiwgMHhhMTAyLAorCTB4MDE3ZiwgMHgwMDdlLCAweDAxN2UsIDB4NzljNCwgMHgwMDdmLCAweGExMDMsIDB4NzhjNiwgMHgwMDdmLAorCTB4NzhjYSwgMHhhMjg0LCAweDAwMDQsIDB4YTA4NSwgMHgwMDEyLCAweDc4MTYsIDB4MDI3ZiwgMHgwZjdmLAorCTB4NzgwMywgMHgwMDA4LCAweDcwMDMsIDB4MDAwMCwgMHgwMDc4LCAweDFmMjksIDB4ODAwMSwgMHg3MDAyLAorCTB4ZDE5NCwgMHgwMDQwLCAweDFmMGIsIDB4NzgwNCwgMHhkMGZjLCAweDAwYzAsIDB4MWU2ZCwgMHhkMTljLAorCTB4MDBjMCwgMHgxZjI1LCAweDhhZmYsIDB4MDA0MCwgMHgxZjI5LCAweDIwMDksIDB4MDAwMSwgMHgxMDc4LAorCTB4MWRhZiwgMHgwMDc4LCAweDFmMjksIDB4MDI3ZSwgMHgwMzdlLCAweDZiMjgsIDB4NmEyYywgMHgxMDc4LAorCTB4MWZlYSwgMHgwZDdlLCAweDI4MDQsIDB4YWM2OCwgMHg2MDM0LCAweGQwOWMsIDB4MDBjMCwgMHgxZjFlLAorCTB4NjgwOCwgMHhhMzFhLCAweDY4MGMsIDB4YTIxMywgMHgwMDc4LCAweDFmMjIsIDB4NjgxMCwgMHhhMzFhLAorCTB4NjgxNCwgMHhhMjEzLCAweDBkN2YsIDB4MDA3OCwgMHgxZTlmLCAweDAwNzgsIDB4MWU5ZiwgMHgxMDc4LAorCTB4MTMyOCwgMHgwYzdmLCAweDBkN2YsIDB4MGU3ZiwgMHgwZjdmLCAweDAxN2YsIDB4MDA3ZiwgMHgxMjdmLAorCTB4MDA3YywgMHgwZjdlLCAweDBlN2UsIDB4MjA3MSwgMHhhNjAyLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAwLAorCTB4MDA0MCwgMHgxZjcyLCAweDIwNzksIDB4MDAyMCwgMHgwMTdlLCAweDIwMDksIDB4MDIwNywgMHgyMTBjLAorCTB4ZDE5NCwgMHgwMDQwLCAweDFmNGYsIDB4MjAwOSwgMHgwMjBjLCAweDIxMGMsIDB4YTE4NCwgMHgwMDAzLAorCTB4MDA0MCwgMHgxZjRmLCAweDIwZTEsIDB4OTA0MCwgMHgyMDAxLCAweDAyMGMsIDB4MjEwMiwgMHgyMDA5LAorCTB4MDIwNiwgMHgyMTA0LCAweDIwMDksIDB4MDIwMywgMHgyMTBjLCAweGExMDYsIDB4MDBjMCwgMHgxZjVhLAorCTB4MjBlMSwgMHg5MDQwLCAweDc4MDQsIDB4ZDBmYywgMHgwMDQwLCAweDFmM2QsIDB4MTA3OCwgMHgxZTVkLAorCTB4NzAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDBjMCwgMHgxZjNkLCAweDAxN2YsIDB4NzgwMywgMHgwMDA0LAorCTB4NzgwNCwgMHhkMGFjLCAweDAwYzAsIDB4MWY2OCwgMHgyMGUxLCAweDkwNDAsIDB4NzgwMywgMHgwMDAyLAorCTB4NzAwMywgMHgwMDAwLCAweDBlN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDAyN2UsIDB4MGM3ZSwgMHgwZDdlLAorCTB4MGU3ZSwgMHgwZjdlLCAweDIwNzEsIDB4YTYwMiwgMHgyMDc5LCAweDAwMjAsIDB4NzAwMCwgMHhhMDg2LAorCTB4MDAwMCwgMHgwMDQwLCAweDFmYWUsIDB4NzAwNCwgMHgyMDYwLCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LAorCTB4OGE0NCwgMHgwMDQwLCAweDFmOTgsIDB4Njg1MCwgMHhjMGI1LCAweDY4NTIsIDB4NjgwYywgMHg3YTFjLAorCTB4YTIwNiwgMHgwMGMwLCAweDFmOTgsIDB4NjgwOCwgMHg3YTE4LCAweGEyMDYsIDB4MDA0MCwgMHgxZmI0LAorCTB4MjAwMSwgMHgwMTA1LCAweDIwMDMsIDB4MDAxMCwgMHgyMGUxLCAweDkwNDAsIDB4NzgwMywgMHgwMDA0LAorCTB4NzAwMywgMHgwMDAwLCAweDcwMDQsIDB4MjA2MCwgMHgxMDc4LCAweDg3NTgsIDB4MjBlMSwgMHg5MDQwLAorCTB4MTA3OCwgMHg3MTlhLCAweDIwMTEsIDB4MDAwMCwgMHgxMDc4LCAweDZlZmMsIDB4MGY3ZiwgMHgwZTdmLAorCTB4MGQ3ZiwgMHgwYzdmLCAweDAyN2YsIDB4MDA3YywgMHg2ODEwLCAweDZhMTQsIDB4YTIwNSwgMHgwMGMwLAorCTB4MWY5OCwgMHg2ODRjLCAweGMwZGMsIDB4Njg0ZSwgMHgyYzEwLCAweDEwNzgsIDB4MWNhYiwgMHgyMDAxLAorCTB4MDEwNSwgMHgyMDAzLCAweDAwMTAsIDB4MjBlMSwgMHg5MDQwLCAweDc4MDMsIDB4MDAwNCwgMHg3MDAzLAorCTB4MDAwMCwgMHgyMDY5LCAweGE1YWIsIDB4NjgzMywgMHgwMDAwLCAweDY4M2YsIDB4MDAwMCwgMHgwMDc4LAorCTB4MWZhZSwgMHg4ODQwLCAweDI4MDQsIDB4YTAwNSwgMHgwMGMwLCAweDFmZTUsIDB4NjAwNCwgMHhhMDA1LAorCTB4MDA0MCwgMHgxZmU3LCAweDY4MWEsIDB4MjA2MCwgMHg2MDM0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLAorCTB4MjAxNSwgMHgyMDQ0LCAweDg4ZmYsIDB4MTA0MCwgMHgxMzI4LCAweDhhNTEsIDB4MDA3YywgMHgyMDUxLAorCTB4MDAwMCwgMHgwMDdjLCAweDhhNTAsIDB4ODg0MSwgMHgyODA0LCAweGEwMDUsIDB4MDBjMCwgMHgyMDA0LAorCTB4MmMwMCwgMHhhZDA2LCAweDAwNDAsIDB4MWZmOSwgMHg2MDAwLCAweGEwMDUsIDB4MDBjMCwgMHgxZmY5LAorCTB4MmQwMCwgMHgyMDYwLCAweDY4MWEsIDB4NjAzNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHgyMDI1LAorCTB4MjA0NCwgMHg4OGZmLCAweDEwNDAsIDB4MTMyOCwgMHgwMDdjLCAweDAwMDAsIDB4MDAxMSwgMHgwMDE1LAorCTB4MDAxOSwgMHgwMDFkLCAweDAwMjEsIDB4MDAyNSwgMHgwMDI5LCAweDAwMDAsIDB4MDAwZiwgMHgwMDE1LAorCTB4MDAxYiwgMHgwMDIxLCAweDAwMjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjAwYSwgMHgyMDA2LAorCTB4MDAwMCwgMHgwMDAwLCAweDIwMTQsIDB4MDAwMCwgMHgyMDBhLCAweDAwMDAsIDB4MjAxMSwgMHgyMDBlLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjAxNCwgMHgyMDExLCAweDAwMDAsIDB4MjAwYywgMHgyMDBjLAorCTB4MDAwMCwgMHgwMDAwLCAweDIwMTQsIDB4MDAwMCwgMHgyMDBjLCAweDAwMDAsIDB4MjAxMiwgMHgyMDEyLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjAxNCwgMHgyMDEyLCAweDBhN2UsIDB4MDk3ZSwgMHgwODdlLAorCTB4NmIyZSwgMHg2YzJhLCAweDY4NTgsIDB4YTA1NSwgMHgwMDQwLCAweDIwZDgsIDB4MmQ2MCwgMHg2MDM0LAorCTB4YTBjYywgMHgwMDBmLCAweGE5YzAsIDB4MjAxNSwgMHhhOTg2LCAweDAwMDcsIDB4MDA0MCwgMHgyMDUwLAorCTB4YTk4NiwgMHgwMDBlLCAweDAwNDAsIDB4MjA1MCwgMHhhOTg2LCAweDAwMGYsIDB4MDBjMCwgMHgyMDU0LAorCTB4NjA1YywgMHhhNDIyLCAweDYwNjAsIDB4YTMxYSwgMHgyODA0LCAweGEwNDUsIDB4MDBjMCwgMHgyMDYyLAorCTB4MDA1MCwgMHgyMDVjLCAweDAwNzgsIDB4MjBkOCwgMHg2MDA0LCAweGEwNjUsIDB4MDA0MCwgMHgyMGQ4LAorCTB4MDA3OCwgMHgyMDNmLCAweDI4MDQsIDB4YTAwNSwgMHgwMDQwLCAweDIwODAsIDB4YWM2OCwgMHhkOTljLAorCTB4MDBjMCwgMHgyMDcwLCAweDY4MDgsIDB4YTQyMiwgMHg2ODBjLCAweGEzMWIsIDB4MDA3OCwgMHgyMDc0LAorCTB4NjgxMCwgMHhhNDIyLCAweDY4MTQsIDB4YTMxYiwgMHgwMDQ4LCAweDIwOWYsIDB4MjMwMCwgMHhhNDA1LAorCTB4MDA0MCwgMHgyMDg2LCAweDhhNTEsIDB4MDA0MCwgMHgyMGQ4LCAweDg4NDAsIDB4MDA3OCwgMHgyMDYyLAorCTB4NjAwNCwgMHhhMDY1LCAweDAwNDAsIDB4MjBkOCwgMHgwMDc4LCAweDIwM2YsIDB4OGE1MSwgMHgwMDQwLAorCTB4MjBkOCwgMHg4ODQwLCAweDI4MDQsIDB4YTAwNSwgMHgwMGMwLCAweDIwOTksIDB4NjAwNCwgMHhhMDY1LAorCTB4MDA0MCwgMHgyMGQ4LCAweDYwMzQsIDB4YTBjYywgMHgwMDBmLCAweGE5YzAsIDB4MjAxNSwgMHgyODA0LAorCTB4MjA0MCwgMHgyYjY4LCAweDY4NTAsIDB4YzBmYywgMHg2ODUyLCAweDAwNzgsIDB4MjBjYywgMHg4NDIyLAorCTB4ODQyMCwgMHg4MzFhLCAweGEzOTksIDB4MDAwMCwgMHgwZDdlLCAweDJiNjgsIDB4NmM2ZSwgMHg2YjcyLAorCTB4MGQ3ZiwgMHhkOTljLCAweDAwYzAsIDB4MjBiYSwgMHg2OTA4LCAweDI0MDAsIDB4YTEyMiwgMHg2OTBjLAorCTB4MjMwMCwgMHhhMTFiLCAweDEwNDgsIDB4MTMyOCwgMHg2ODAwLCAweGE0MjAsIDB4NjgwNCwgMHhhMzE5LAorCTB4MDA3OCwgMHgyMGM2LCAweDY5MTAsIDB4MjQwMCwgMHhhMTIyLCAweDY5MTQsIDB4MjMwMCwgMHhhMTFiLAorCTB4MTA0OCwgMHgxMzI4LCAweDY4MDAsIDB4YTQyMCwgMHg2ODA0LCAweGEzMTksIDB4MmI2OCwgMHg2YzFlLAorCTB4NmIyMiwgMHg2ODUwLCAweGMwZmQsIDB4Njg1MiwgMHgyYzAwLCAweDY4MWEsIDB4MjgwMCwgMHg2ODMyLAorCTB4MmEwMCwgMHg2ODI2LCAweDAwN2YsIDB4MDA3ZiwgMHgwMDdmLCAweGEwMDYsIDB4MDA3OCwgMHgyMGRkLAorCTB4MDg3ZiwgMHgwOTdmLCAweDBhN2YsIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsIDB4MjAwMSwgMHgwMDA1LAorCTB4MjAwNCwgMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHgyMGU1LCAweDIwZWQsIDB4MjBlZSwgMHgyMGYxLAorCTB4MjBmNCwgMHgyMGY5LCAweDIwZmMsIDB4MjEwMSwgMHgyMTA2LCAweDAwN2MsIDB4MTA3OCwgMHgxZTVkLAorCTB4MDA3YywgMHgxMDc4LCAweDE4ZTIsIDB4MDA3YywgMHgxMDc4LCAweDE4ZTIsIDB4MTA3OCwgMHgxZTVkLAorCTB4MDA3YywgMHgxMDc4LCAweDE0YjAsIDB4MDA3YywgMHgxMDc4LCAweDFlNWQsIDB4MTA3OCwgMHgxNGIwLAorCTB4MDA3YywgMHgxMDc4LCAweDE4ZTIsIDB4MTA3OCwgMHgxNGIwLCAweDAwN2MsIDB4MTA3OCwgMHgxOGUyLAorCTB4MTA3OCwgMHgxZTVkLCAweDEwNzgsIDB4MTRiMCwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHgyMzAwLAorCTB4MjA3OSwgMHgwMjAwLCAweDIwNzEsIDB4YTg4MCwgMHgyMDY5LCAweGEzMDAsIDB4MjAwOSwgMHgwMDA0LAorCTB4NzkxMiwgMHg3ODE3LCAweDAwMDQsIDB4MTA3OCwgMHgyNGI1LCAweDc4MWIsIDB4MDAwMiwgMHgyMGUxLAorCTB4ODcwMCwgMHgxMjdmLCAweDAwN2MsIDB4MTI3ZSwgMHgyMDkxLCAweDIzMDAsIDB4NzgxYywgMHhhMDg0LAorCTB4MDAwNywgMHgwMDc5LCAweDIxMmIsIDB4MjE0ZiwgMHgyMTMzLCAweDIxMzcsIDB4MjEzYiwgMHgyMTQxLAorCTB4MjE0NSwgMHgyMTQ5LCAweDIxNGQsIDB4MTA3OCwgMHg1MzcyLCAweDAwNzgsIDB4MjE0ZiwgMHgxMDc4LAorCTB4NTNiMywgMHgwMDc4LCAweDIxNGYsIDB4MTA3OCwgMHg1MzcyLCAweDEwNzgsIDB4NTNiMywgMHgwMDc4LAorCTB4MjE0ZiwgMHgxMDc4LCAweDIxNTEsIDB4MDA3OCwgMHgyMTRmLCAweDEwNzgsIDB4MjE1MSwgMHgwMDc4LAorCTB4MjE0ZiwgMHgxMDc4LCAweDIxNTEsIDB4MDA3OCwgMHgyMTRmLCAweDEwNzgsIDB4MjE1MSwgMHgxMjdmLAorCTB4MDA3YywgMHgwMDdlLCAweDAxN2UsIDB4MDI3ZSwgMHg3OTMwLCAweGExODQsIDB4MDAwMywgMHgwMDQwLAorCTB4MjE1ZCwgMHgyMGUxLCAweDkwNDAsIDB4MDA3OCwgMHgyMTg2LCAweGExODQsIDB4MDAzMCwgMHgwMDQwLAorCTB4MjE2ZSwgMHg2YTAwLCAweGEyODYsIDB4MDAwMywgMHgwMGMwLCAweDIxNjgsIDB4MDA3OCwgMHgyMTZhLAorCTB4MTA3OCwgMHg0MTcxLCAweDIwZTEsIDB4OTAxMCwgMHgwMDc4LCAweDIxODYsIDB4YTE4NCwgMHgwMGMwLAorCTB4MDA0MCwgMHgyMTgwLCAweDBlN2UsIDB4MDM3ZSwgMHgwNDdlLCAweDA1N2UsIDB4MjA3MSwgMHhhNWUxLAorCTB4MTA3OCwgMHgxYWM2LCAweDA1N2YsIDB4MDQ3ZiwgMHgwMzdmLCAweDBlN2YsIDB4MDA3OCwgMHgyMTg2LAorCTB4YTE4NCwgMHgwMzAwLCAweDAwNDAsIDB4MjE4NiwgMHgyMGUxLCAweDkwMjAsIDB4NzkzMiwgMHgwMjdmLAorCTB4MDE3ZiwgMHgwMDdmLCAweDAwN2MsIDB4MDE3ZSwgMHgwZTdlLCAweDBmN2UsIDB4MjA3MSwgMHhhMzAwLAorCTB4NzEyOCwgMHgyMDAxLCAweGE1OGYsIDB4MjEwMiwgMHgyMDAxLCAweGE1OTcsIDB4MjEwMiwgMHhhMTgyLAorCTB4MDIxMSwgMHgwMGM4LCAweDIxOWYsIDB4MjAwOSwgMHgwMDA4LCAweDAwNzgsIDB4MjFjOSwgMHhhMTgyLAorCTB4MDI1OSwgMHgwMGM4LCAweDIxYTcsIDB4MjAwOSwgMHgwMDA3LCAweDAwNzgsIDB4MjFjOSwgMHhhMTgyLAorCTB4MDJjMSwgMHgwMGM4LCAweDIxYWYsIDB4MjAwOSwgMHgwMDA2LCAweDAwNzgsIDB4MjFjOSwgMHhhMTgyLAorCTB4MDM0OSwgMHgwMGM4LCAweDIxYjcsIDB4MjAwOSwgMHgwMDA1LCAweDAwNzgsIDB4MjFjOSwgMHhhMTgyLAorCTB4MDQyMSwgMHgwMGM4LCAweDIxYmYsIDB4MjAwOSwgMHgwMDA0LCAweDAwNzgsIDB4MjFjOSwgMHhhMTgyLAorCTB4MDU4MSwgMHgwMGM4LCAweDIxYzcsIDB4MjAwOSwgMHgwMDAzLCAweDAwNzgsIDB4MjFjOSwgMHgyMDA5LAorCTB4MDAwMiwgMHgyMDc5LCAweDAyMDAsIDB4NzkxMiwgMHg3ODE3LCAweDAwMDQsIDB4MTA3OCwgMHgyNGI1LAorCTB4MGY3ZiwgMHgwZTdmLCAweDAxN2YsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsIDB4MjIwMCwgMHgyMDYxLAorCTB4MDEwMCwgMHgyMDcxLCAweGEzMDAsIDB4NjAyNCwgMHg2MDI2LCAweDYwNTMsIDB4MDAzMCwgMHg2MDMzLAorCTB4MDBlZiwgMHg2MGU3LCAweDAwMDAsIDB4NjBlYiwgMHgwMGVmLCAweDYwZTMsIDB4MDAwOCwgMHg2MDRiLAorCTB4ZjdmNywgMHg2MDQzLCAweDAwMDAsIDB4NjAyZiwgMHgwMDgwLCAweDYwMmYsIDB4MDAwMCwgMHg2MDA3LAorCTB4MGVhZiwgMHg2MDBmLCAweDAwZmYsIDB4NjAyYiwgMHgwMDJmLCAweDEyN2YsIDB4MDA3YywgMHgyMDAxLAorCTB4YTMyZiwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHhhMzJlLCAweDIwMDMsIDB4MDAwMSwgMHgwMDdjLAorCTB4MTI3ZSwgMHgyMDkxLCAweDIyMDAsIDB4MDA3ZSwgMHgwMTdlLCAweDAyN2UsIDB4NjEyNCwgMHhhMTg0LAorCTB4MDAyYywgMHgwMGMwLCAweDIyMGYsIDB4YTE4NCwgMHgwMDA3LCAweDAwNzksIDB4MjIxNSwgMHhhMTk1LAorCTB4MDAwNCwgMHhhMjg0LCAweDAwMDcsIDB4MDA3OSwgMHgyMjE1LCAweDIyNDEsIDB4MjIxZCwgMHgyMjIxLAorCTB4MjIyNSwgMHgyMjJiLCAweDIyMmYsIDB4MjIzNSwgMHgyMjNiLCAweDEwNzgsIDB4NWFkMiwgMHgwMDc4LAorCTB4MjI0MSwgMHgxMDc4LCAweDViYzEsIDB4MDA3OCwgMHgyMjQxLCAweDEwNzgsIDB4NWJjMSwgMHgxMDc4LAorCTB4NWFkMiwgMHgwMDc4LCAweDIyNDEsIDB4MTA3OCwgMHgyMjQ2LCAweDAwNzgsIDB4MjI0MSwgMHgxMDc4LAorCTB4NWFkMiwgMHgxMDc4LCAweDIyNDYsIDB4MDA3OCwgMHgyMjQxLCAweDEwNzgsIDB4NWJjMSwgMHgxMDc4LAorCTB4MjI0NiwgMHgwMDc4LCAweDIyNDEsIDB4MTA3OCwgMHg1YmMxLCAweDEwNzgsIDB4NWFkMiwgMHgxMDc4LAorCTB4MjI0NiwgMHgwMjdmLCAweDAxN2YsIDB4MDA3ZiwgMHgxMjdmLCAweDAwN2MsIDB4NjEyNCwgMHhkMWFjLAorCTB4MDA0MCwgMHgyMzQyLCAweDAxN2UsIDB4MDQ3ZSwgMHgwYzdlLCAweDY0NGMsIDB4YTQ4NiwgMHhmMGYwLAorCTB4MDBjMCwgMHgyMjU5LCAweDIwNjEsIDB4MDEwMCwgMHg2NDRhLCAweDYwNDMsIDB4MDA5MCwgMHg2MDQzLAorCTB4MDAxMCwgMHg3NGMyLCAweGE0OGMsIDB4ZmYwMCwgMHg3MDM0LCAweGQwODQsIDB4MDA0MCwgMHgyMjcxLAorCTB4YTE4NiwgMHhmODAwLCAweDAwYzAsIDB4MjI3MSwgMHg3MDM4LCAweGQwODQsIDB4MDBjMCwgMHgyMjcxLAorCTB4YzA4NSwgMHg3MDNhLCAweDAzN2UsIDB4MjQxOCwgMHgyMDExLCAweDgwMTYsIDB4MTA3OCwgMHgzNTc5LAorCTB4MDM3ZiwgMHhhMTk2LCAweGZmMDAsIDB4MDA0MCwgMHgyMmIzLCAweDYwMzAsIDB4YTA4NCwgMHgwMGZmLAorCTB4ODEwZiwgMHhhMTE2LCAweDAwNDAsIDB4MjJiMywgMHg3MTMwLCAweGQxODQsIDB4MDBjMCwgMHgyMmIzLAorCTB4MjAxMSwgMHhhMzUyLCAweDIyMTQsIDB4ZDJlYywgMHgwMDQwLCAweDIyOGUsIDB4YzE4ZCwgMHg3MTMyLAorCTB4MjAxMSwgMHhhMzUyLCAweDIyMTQsIDB4ZDJhYywgMHgwMGMwLCAweDIyYjMsIDB4NjI0MCwgMHhhMjk0LAorCTB4MDAxMCwgMHgwMDQwLCAweDIyOWEsIDB4NjI0OCwgMHhhMjk0LCAweGZmMDAsIDB4YTI5NiwgMHhmZjAwLAorCTB4MDA0MCwgMHgyMmIzLCAweDcwMzAsIDB4ZDA4YywgMHgwMDQwLCAweDIzMDUsIDB4NzAzNCwgMHhkMDhjLAorCTB4MDBjMCwgMHgyMmFhLCAweDIwMDEsIDB4YTMwYywgMHgyMDBjLCAweGQxYWMsIDB4MDBjMCwgMHgyMzA1LAorCTB4YzFhZCwgMHgyMTAyLCAweDAzN2UsIDB4NzNjMCwgMHgyMDExLCAweDgwMTMsIDB4MTA3OCwgMHgzNTc5LAorCTB4MDM3ZiwgMHgwMDc4LCAweDIzMDUsIDB4NzAzNCwgMHhkMDhjLCAweDAwYzAsIDB4MjJiZiwgMHgyMDAxLAorCTB4YTMwYywgMHgyMDBjLCAweGQxYWMsIDB4MDBjMCwgMHgyMzA1LCAweGMxYWQsIDB4MjEwMiwgMHgwMzdlLAorCTB4NzNjMCwgMHgyMDExLCAweDgwMTMsIDB4MTA3OCwgMHgzNTc5LCAweDAzN2YsIDB4NzEzMCwgMHhjMTg1LAorCTB4NzEzMiwgMHgyMDExLCAweGEzNTIsIDB4MjIwYywgMHhkMWE0LCAweDAwNDAsIDB4MjJlOSwgMHgwMTdlLAorCTB4MjAwOSwgMHgwMDAxLCAweDIwMTEsIDB4MDEwMCwgMHgxMDc4LCAweDVhNmQsIDB4MjAxOSwgMHgwMDBlLAorCTB4MTA3OCwgMHg5ZTNiLCAweGE0ODQsIDB4MDBmZiwgMHhhMDgwLCAweDI5M2YsIDB4MjAwYywgMHhhMThjLAorCTB4ZmYwMCwgMHg4MTBmLCAweDgxMjcsIDB4YTAwNiwgMHgyMDA5LCAweDAwMGUsIDB4MTA3OCwgMHg5ZWMwLAorCTB4MDE3ZiwgMHhkMWFjLCAweDAwYzAsIDB4MjJmNiwgMHgwMTdlLCAweDIwMDksIDB4MDAwMCwgMHgyMDE5LAorCTB4MDAwNCwgMHgxMDc4LCAweDI3ZTIsIDB4MDE3ZiwgMHgwMDc4LCAweDIzMDUsIDB4MTU3ZSwgMHgyMGE5LAorCTB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsIDB4MTA3OCwgMHg0NTAxLCAweDAwYzAsIDB4MjMwMSwgMHgxMDc4LAorCTB4NDIzNSwgMHg4MTA4LCAweDAwZjAsIDB4MjJmYiwgMHgxNTdmLCAweDBjN2YsIDB4MDQ3ZiwgMHgwZjdlLAorCTB4MjA3OSwgMHhhNWJlLCAweDc4M2MsIDB4YTA4NiwgMHgwMDAwLCAweDAwNDAsIDB4MjMxNywgMHg2MDI3LAorCTB4MDAwNCwgMHg3ODNmLCAweDAwMDAsIDB4MjA3OSwgMHgwMTQwLCAweDc4MDMsIDB4MDAwMCwgMHgwZjdmLAorCTB4MjAxMSwgMHgwMDAzLCAweDEwNzgsIDB4NmVmMiwgMHgyMDExLCAweDAwMDIsIDB4MTA3OCwgMHg2ZWZjLAorCTB4MTA3OCwgMHg2ZGRhLCAweDEwNzgsIDB4NTk1YSwgMHgwMzdlLCAweDIwMTksIDB4MDAwMCwgMHgxMDc4LAorCTB4NmU2YywgMHgwMzdmLCAweDYwZTMsIDB4MDAwMCwgMHgwMTdmLCAweDIwMDEsIDB4YTMwMCwgMHgyMDE0LAorCTB4YTI5NiwgMHgwMDA0LCAweDAwYzAsIDB4MjMzYSwgMHhkMTljLCAweDAwYzAsIDB4MjMzYSwgMHg2MjI4LAorCTB4YzI5ZCwgMHg2MjJhLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLCAweGEzMjEsIDB4MjAwMywgMHgwMDAwLAorCTB4NjAyNywgMHgwMDIwLCAweGQxOTQsIDB4MDA0MCwgMHgyNDI2LCAweDBmN2UsIDB4MjA3OSwgMHhhNWJlLAorCTB4NzgzYywgMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHgyMzY2LCAweDAxN2UsIDB4NjAyNywgMHgwMDA0LAorCTB4NzgzZiwgMHgwMDAwLCAweDIwNzksIDB4MDE0MCwgMHg3ODAzLCAweDEwMDAsIDB4NzgwMywgMHgwMDAwLAorCTB4MjA3OSwgMHhhNWFiLCAweDc4MDcsIDB4MDAwMCwgMHg3ODMzLCAweDAwMDAsIDB4MTA3OCwgMHg2MTA5LAorCTB4MTA3OCwgMHg2MWQzLCAweDAxN2YsIDB4MGY3ZiwgMHgwMDc4LCAweDI0MjYsIDB4MGY3ZiwgMHgwMTdlLAorCTB4MzkwMCwgMHhhMDgyLCAweGE2Y2QsIDB4MDBjOCwgMHgyMzcxLCAweDAxN2UsIDB4MTA3OCwgMHg3MjhhLAorCTB4MDE3ZiwgMHg2MjIwLCAweGQyYjQsIDB4MDA0MCwgMHgyM2RjLCAweDEwNzgsIDB4NTk1YSwgMHgxMDc4LAorCTB4NmM0MSwgMHg2MDI3LCAweDAwMDQsIDB4MGY3ZSwgMHgyMDE5LCAweGE1YjQsIDB4MjMwNCwgMHhhMDdkLAorCTB4MDA0MCwgMHgyM2IyLCAweDc4MDQsIDB4YTA4NiwgMHgwMDMyLCAweDAwYzAsIDB4MjNiMiwgMHgwZDdlLAorCTB4MGM3ZSwgMHgwZTdlLCAweDIwNjksIDB4MDE0MCwgMHg2MThjLCAweDYyODgsIDB4NzgxOCwgMHg2MDhlLAorCTB4NzgwOCwgMHg2MDhhLCAweDYwNDMsIDB4MDAwMiwgMHgyMDAxLCAweDAwMDMsIDB4ODAwMSwgMHgwMGMwLAorCTB4MjM5NiwgMHg2MDQzLCAweDAwMDAsIDB4NjgwMywgMHgxMDAwLCAweDY4MDMsIDB4MDAwMCwgMHg2MThlLAorCTB4NjI4YSwgMHgxMDc4LCAweDYwMTAsIDB4MTA3OCwgMHg2MTA5LCAweDc4MTAsIDB4MjA3MCwgMHg3MDM3LAorCTB4MDEwMywgMHgyZjYwLCAweDEwNzgsIDB4NzUzZCwgMHgwZTdmLCAweDBjN2YsIDB4MGQ3ZiwgMHgwZjdmLAorCTB4MDE3ZiwgMHgwMDdjLCAweDBmN2YsIDB4MGQ3ZSwgMHgyMDY5LCAweDAxNDAsIDB4NjgwNCwgMHhhMDg0LAorCTB4NDAwMCwgMHgwMDQwLCAweDIzYmYsIDB4NjgwMywgMHgxMDAwLCAweDY4MDMsIDB4MDAwMCwgMHgwZDdmLAorCTB4MGM3ZSwgMHgyMDYxLCAweGE1YWIsIDB4NjAyOCwgMHhhMDlhLCAweDAwYzgsIDB4MDBjOCwgMHgyM2NmLAorCTB4ODAwMCwgMHg2MDJhLCAweDBjN2YsIDB4MTA3OCwgMHg2YzMzLCAweDAwNzgsIDB4MjQyNSwgMHgyMDE5LAorCTB4YTViNCwgMHgyMzA0LCAweGEwNjUsIDB4MDA0MCwgMHgyM2Q5LCAweDIwMDksIDB4MDAyNywgMHgxMDc4LAorCTB4NzU2YywgMHgwYzdmLCAweDAwNzgsIDB4MjQyNSwgMHhkMmJjLCAweDAwNDAsIDB4MjQyNSwgMHgxMDc4LAorCTB4NTk2NywgMHg2MDE3LCAweDAwMTAsIDB4NjAyNywgMHgwMDA0LCAweDBkN2UsIDB4MjA2OSwgMHgwMTQwLAorCTB4NjgwNCwgMHhhMDg0LCAweDQwMDAsIDB4MDA0MCwgMHgyM2YxLCAweDY4MDMsIDB4MTAwMCwgMHg2ODAzLAorCTB4MDAwMCwgMHgwZDdmLCAweDBjN2UsIDB4MjA2MSwgMHhhNWFiLCAweDYwNDQsIDB4YTA5YSwgMHgwMGM4LAorCTB4MDBjOCwgMHgyNDE0LCAweDgwMDAsIDB4NjA0NiwgMHg2MDNjLCAweDBjN2YsIDB4YTAwNSwgMHgwMDQwLAorCTB4MjQyNSwgMHgyMDA5LCAweDA3ZDAsIDB4MTA3OCwgMHg1OTVmLCAweGEwODAsIDB4MDAwNywgMHgyMDA0LAorCTB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4MjQxMCwgMHg2MDE3LCAweDAwMTIsIDB4MDA3OCwgMHgyNDI1LAorCTB4NjAxNywgMHgwMDE2LCAweDAwNzgsIDB4MjQyNSwgMHgwMzdlLCAweDIwMTksIDB4MDAwMSwgMHgxMDc4LAorCTB4NmU2YywgMHgwMzdmLCAweDIwMTksIDB4YTViYSwgMHgyMzA0LCAweGEwNjUsIDB4MDA0MCwgMHgyNDI0LAorCTB4MjAwOSwgMHgwMDRmLCAweDEwNzgsIDB4NzU2YywgMHgwYzdmLCAweDAxN2YsIDB4ZDE5YywgMHgwMDQwLAorCTB4MjQ3YywgMHg3MDM0LCAweGQwYWMsIDB4MDBjMCwgMHgyNDU3LCAweDAxN2UsIDB4MTU3ZSwgMHg2MDI3LAorCTB4MDAwOCwgMHg2MDJmLCAweDAwMjAsIDB4MjBhOSwgMHgwMDBhLCAweDAwZjAsIDB4MjQzNSwgMHg2MDJmLAorCTB4MDAwMCwgMHg2MTUwLCAweGExODUsIDB4MTQwMCwgMHg2MDUyLCAweDIwYTksIDB4MDMyMCwgMHgwMGUwLAorCTB4MjQzZiwgMHgyMDkxLCAweDYwMDAsIDB4NjAyMCwgMHhkMDljLCAweDAwYzAsIDB4MjQ0ZSwgMHgxNTdmLAorCTB4NjE1MiwgMHgwMTdmLCAweDYwMjcsIDB4MDAwOCwgMHgwMDc4LCAweDI0N2MsIDB4MTA3OCwgMHgyNTBkLAorCTB4MDBmMCwgMHgyNDNmLCAweDE1N2YsIDB4NjE1MiwgMHgwMTdmLCAweDYwMjcsIDB4MDAwOCwgMHgwMTdlLAorCTB4NjAyOCwgMHhjMDljLCAweDYwMmEsIDB4MjAxMSwgMHgwMDAzLCAweDEwNzgsIDB4NmVmMiwgMHgyMDExLAorCTB4MDAwMiwgMHgxMDc4LCAweDZlZmMsIDB4MTA3OCwgMHg2ZGRhLCAweDEwNzgsIDB4NTk1YSwgMHgwMzdlLAorCTB4MjAxOSwgMHgwMDAwLCAweDEwNzgsIDB4NmU2YywgMHgwMzdmLCAweDYwZTMsIDB4MDAwMCwgMHgxMDc4LAorCTB4YTIyYSwgMHgxMDc4LCAweGEyNDgsIDB4MjAwMSwgMHhhMzAwLCAweDIwMDMsIDB4MDAwNCwgMHg2MDI3LAorCTB4MDAwOCwgMHgxMDc4LCAweDEyNDYsIDB4MDE3ZiwgMHhhMThjLCAweGZmZDAsIDB4NjEyNiwgMHgwMDdjLAorCTB4MDA3ZSwgMHgwMTdlLCAweDAyN2UsIDB4MGU3ZSwgMHgwZjdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA3MSwgMHhhMzAwLCAweDcxYjgsIDB4NzBiYSwgMHhhMTE2LCAweDAwNDAsIDB4MjRhZSwgMHg4MWZmLAorCTB4MDA0MCwgMHgyNDk4LCAweDIwMTEsIDB4ODAxMSwgMHgxMDc4LCAweDM1NzksIDB4MDA3OCwgMHgyNGFlLAorCTB4MjAxMSwgMHg4MDEyLCAweDEwNzgsIDB4MzU3OSwgMHgyMDAxLCAweGEzNzEsIDB4MjAwNCwgMHhkMGZjLAorCTB4MDBjMCwgMHgyNGFlLCAweDAzN2UsIDB4MGM3ZSwgMHgyMDYxLCAweDAxMDAsIDB4MjAxOSwgMHgwMDI4LAorCTB4MjAwOSwgMHgwMDAwLCAweDEwNzgsIDB4MjdlMiwgMHgwYzdmLCAweDAzN2YsIDB4MTI3ZiwgMHgwZjdmLAorCTB4MGU3ZiwgMHgwMjdmLCAweDAxN2YsIDB4MDA3ZiwgMHgwMDdjLCAweDBjN2UsIDB4MGY3ZSwgMHgwMDdlLAorCTB4MDI3ZSwgMHgyMDYxLCAweDAxMDAsIDB4YTE5MCwgMHgyNGQxLCAweDIyMDQsIDB4NjBmMiwgMHgyMDExLAorCTB4MjRkZSwgMHg2MDAwLCAweGEwODIsIDB4MDAwMywgMHgwMGM4LCAweDI0Y2EsIDB4MjAwMSwgMHgwMGZmLAorCTB4MDA3OCwgMHgyNGNiLCAweDIyMDQsIDB4NjBlZSwgMHgwMjdmLCAweDAwN2YsIDB4MGY3ZiwgMHgwYzdmLAorCTB4MDA3YywgMHgwODQwLCAweDA4NDAsIDB4MDg0MCwgMHgwNTgwLCAweDA0MjAsIDB4MDM0OCwgMHgwMmMwLAorCTB4MDI1OCwgMHgwMjEwLCAweDAxYTgsIDB4MDFhOCwgMHgwMWE4LCAweDAxYTgsIDB4MDE0MCwgMHgwMGY4LAorCTB4MDBkMCwgMHgwMGIwLCAweDAwYTAsIDB4MjAyOCwgMHhhMThjLCAweDAwZmYsIDB4MjEzMCwgMHhhMDk0LAorCTB4ZmYwMCwgMHgwMGMwLCAweDI0ZWUsIDB4ODFmZiwgMHgwMDQwLCAweDI0ZjIsIDB4MTA3OCwgMHg1NjIzLAorCTB4MDA3OCwgMHgyNGY5LCAweGEwODAsIDB4MjkzZiwgMHgyMDBjLCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLAorCTB4YTAwNiwgMHgwMDdjLCAweGEwODAsIDB4MjkzZiwgMHgyMDBjLCAweGExOGMsIDB4MDBmZiwgMHgwMDdjLAorCTB4MGM3ZSwgMHgyMDYxLCAweGEzMDAsIDB4NjAzMCwgMHgwMDQwLCAweDI1MDksIDB4YzA5ZCwgMHgwMDc4LAorCTB4MjUwYSwgMHhjMDljLCAweDYwMzIsIDB4MGM3ZiwgMHgwMDdjLCAweDAwN2UsIDB4MTU3ZSwgMHgwZjdlLAorCTB4MjA3OSwgMHgwMTAwLCAweDIwYTksIDB4MDAwYSwgMHg3ODU0LCAweGQwOGMsIDB4MDBjMCwgMHgyNTFhLAorCTB4MDBmMCwgMHgyNTE0LCAweDBmN2YsIDB4MTU3ZiwgMHgwMDdmLCAweDAwN2MsIDB4MGM3ZSwgMHgwMDdlLAorCTB4MjA2MSwgMHgwMTAwLCAweDYwMzAsIDB4MDA3ZSwgMHg2MDQ4LCAweDAwN2UsIDB4NjBlNCwgMHgwMDdlLAorCTB4NjBlOCwgMHgwMDdlLCAweDYwNTAsIDB4MDA3ZSwgMHg2MGYwLCAweDAwN2UsIDB4NjBlYywgMHgwMDdlLAorCTB4NjAwYywgMHgwMDdlLCAweDYwMDQsIDB4MDA3ZSwgMHg2MDI4LCAweDAwN2UsIDB4NjBlMCwgMHgwMDdlLAorCTB4NjAyZiwgMHgwMTAwLCAweDYwMmYsIDB4MDAwMCwgMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LAorCTB4NjAyZiwgMHgwMDQwLCAweDYwMmYsIDB4MDAwMCwgMHgwMDdmLCAweDYwZTIsIDB4MDA3ZiwgMHg2MDJhLAorCTB4MDA3ZiwgMHg2MDA2LCAweDAwN2YsIDB4NjAwZSwgMHgwMDdmLCAweDYwZWUsIDB4MDA3ZiwgMHg2MGYyLAorCTB4MDA3ZiwgMHg2MDUyLCAweDAwN2YsIDB4NjBlYSwgMHgwMDdmLCAweDYwZTYsIDB4MDA3ZiwgMHg2MDRhLAorCTB4MDA3ZiwgMHg2MDMyLCAweDAwN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDI1N2QsIDB4MjU4MSwgMHgyNTg1LAorCTB4MjU4YiwgMHgyNTkxLCAweDI1OTcsIDB4MjU5ZCwgMHgyNWE1LCAweDI1YWQsIDB4MjViMywgMHgyNWI5LAorCTB4MjVjMSwgMHgyNWM5LCAweDI1ZDEsIDB4MjVkOSwgMHgyNWUzLCAweDI1ZWQsIDB4MjVlZCwgMHgyNWVkLAorCTB4MjVlZCwgMHgyNWVkLCAweDI1ZWQsIDB4MjVlZCwgMHgyNWVkLCAweDI1ZWQsIDB4MjVlZCwgMHgyNWVkLAorCTB4MjVlZCwgMHgyNWVkLCAweDI1ZWQsIDB4MjVlZCwgMHgyNWVkLCAweDEwN2UsIDB4MDA3ZSwgMHgwMDc4LAorCTB4MjYwNiwgMHgxMDdlLCAweDAwN2UsIDB4MDA3OCwgMHgyNjA2LCAweDEwN2UsIDB4MDA3ZSwgMHgxMDc4LAorCTB4MjIwMCwgMHgwMDc4LCAweDI2MDYsIDB4MTA3ZSwgMHgwMDdlLCAweDEwNzgsIDB4MjIwMCwgMHgwMDc4LAorCTB4MjYwNiwgMHgxMDdlLCAweDAwN2UsIDB4MTA3OCwgMHgyMGRlLCAweDAwNzgsIDB4MjYwNiwgMHgxMDdlLAorCTB4MDA3ZSwgMHgxMDc4LCAweDIwZGUsIDB4MDA3OCwgMHgyNjA2LCAweDEwN2UsIDB4MDA3ZSwgMHgxMDc4LAorCTB4MjIwMCwgMHgxMDc4LCAweDIwZGUsIDB4MDA3OCwgMHgyNjA2LCAweDEwN2UsIDB4MDA3ZSwgMHgxMDc4LAorCTB4MjIwMCwgMHgxMDc4LCAweDIwZGUsIDB4MDA3OCwgMHgyNjA2LCAweDEwN2UsIDB4MDA3ZSwgMHgxMDc4LAorCTB4MjEyMywgMHgwMDc4LCAweDI2MDYsIDB4MTA3ZSwgMHgwMDdlLCAweDEwNzgsIDB4MjEyMywgMHgwMDc4LAorCTB4MjYwNiwgMHgxMDdlLCAweDAwN2UsIDB4MTA3OCwgMHgyMjAwLCAweDEwNzgsIDB4MjEyMywgMHgwMDc4LAorCTB4MjYwNiwgMHgxMDdlLCAweDAwN2UsIDB4MTA3OCwgMHgyMjAwLCAweDEwNzgsIDB4MjEyMywgMHgwMDc4LAorCTB4MjYwNiwgMHgxMDdlLCAweDAwN2UsIDB4MTA3OCwgMHgyMGRlLCAweDEwNzgsIDB4MjEyMywgMHgwMDc4LAorCTB4MjYwNiwgMHgxMDdlLCAweDAwN2UsIDB4MTA3OCwgMHgyMGRlLCAweDEwNzgsIDB4MjEyMywgMHgwMDc4LAorCTB4MjYwNiwgMHgxMDdlLCAweDAwN2UsIDB4MTA3OCwgMHgyMjAwLCAweDEwNzgsIDB4MjBkZSwgMHgxMDc4LAorCTB4MjEyMywgMHgwMDc4LCAweDI2MDYsIDB4MTA3ZSwgMHgwMDdlLCAweDEwNzgsIDB4MjIwMCwgMHgxMDc4LAorCTB4MjBkZSwgMHgxMDc4LCAweDIxMjMsIDB4MDA3OCwgMHgyNjA2LCAweDAwMDUsIDB4MDA3OCwgMHgyNWVkLAorCTB4YjA4NCwgMHgwMDNjLCAweDgwMDQsIDB4ODAwNCwgMHgwMDc5LCAweDI1ZjYsIDB4MjYwNiwgMHgyNTgzLAorCTB4MjU4NywgMHgyNThkLCAweDI1OTMsIDB4MjU5OSwgMHgyNTlmLCAweDI1YTcsIDB4MjVhZiwgMHgyNWI1LAorCTB4MjViYiwgMHgyNWMzLCAweDI1Y2IsIDB4MjVkMywgMHgyNWRiLCAweDI1ZTUsIDB4MDAwOCwgMHgyNWYwLAorCTB4MDA3ZiwgMHgxMDdmLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDBjN2UsIDB4MDI3ZSwgMHgwNDdlLAorCTB4MjAyMSwgMHgwMDAwLCAweDEwNzgsIDB4NDg5NywgMHgwMGMwLCAweDI3MDUsIDB4NzBjOCwgMHhkMDljLAorCTB4MDA0MCwgMHgyNjI0LCAweGQwODQsIDB4MDBjMCwgMHgyNjI0LCAweGQwYmMsIDB4MDBjMCwgMHgyNzA1LAorCTB4MTA3OCwgMHgyNzA5LCAweDAwNzgsIDB4MjcwNSwgMHhkMDk0LCAweDAwNDAsIDB4MjYyYiwgMHg3MDkzLAorCTB4ZmZmZiwgMHgwMDc4LCAweDI3MDUsIDB4MjAwMSwgMHgwMTBjLCAweDIwM2MsIDB4NzI4MCwgMHhkMjg0LAorCTB4MDA0MCwgMHgyNjk0LCAweGQyOGMsIDB4MDBjMCwgMHgyNjk0LCAweDAzN2UsIDB4NzM5MCwgMHhhMzhlLAorCTB4ZmZmZiwgMHgwMDQwLCAweDI2M2UsIDB4ODNmZiwgMHgwMGMwLCAweDI2NDAsIDB4MjAxOSwgMHgwMDAxLAorCTB4ODMxNCwgMHhhMmUwLCAweGE5YzAsIDB4MmMwNCwgMHhhMzhjLCAweDAwMDEsIDB4MDA0MCwgMHgyNjRkLAorCTB4YTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4MDA3OCwgMHgyNjRmLCAweGEwODQsIDB4MDBmZiwgMHhhNzBlLAorCTB4MDA0MCwgMHgyNjg5LCAweGEwOGUsIDB4MDAwMCwgMHgwMDQwLCAweDI2ODksIDB4YTA4ZSwgMHgwMGZmLAorCTB4MDBjMCwgMHgyNjY2LCAweDcyMzAsIDB4ZDI4NCwgMHgwMGMwLCAweDI2OGYsIDB4NzI4MCwgMHhjMjhkLAorCTB4NzI4MiwgMHg3MDkzLCAweGZmZmYsIDB4MDM3ZiwgMHgwMDc4LCAweDI2OTQsIDB4MjAwOSwgMHgwMDAwLAorCTB4MTA3OCwgMHgyNGUzLCAweDEwNzgsIDB4NDQ5OSwgMHgwMGMwLCAweDI2OGMsIDB4NjAwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHgyNjgzLCAweDcwMzAsIDB4ZDA4YywgMHgwMDQwLAorCTB4MjY3ZCwgMHg2MDAwLCAweGQwYmMsIDB4MDA0MCwgMHgyNjgzLCAweDEwNzgsIDB4MjcxZiwgMHgwMDQwLAorCTB4MjY4YywgMHgwMDc4LCAweDI2ODksIDB4MTA3OCwgMHgyODU3LCAweDEwNzgsIDB4Mjc0YywgMHgwMDQwLAorCTB4MjY4YywgMHg4MzE4LCAweDAwNzgsIDB4MjY0MCwgMHg3MzkyLCAweDAwNzgsIDB4MjY5MSwgMHg3MDkzLAorCTB4ZmZmZiwgMHgwMzdmLCAweDAwNzgsIDB4MjcwNSwgMHhhNzgwLCAweDI5M2YsIDB4MjAzYywgMHhhN2JjLAorCTB4ZmYwMCwgMHg4NzNmLCAweDIwNDEsIDB4MDA3ZSwgMHg3MDkwLCAweGEwOTYsIDB4ZmZmZiwgMHgwMGMwLAorCTB4MjZhNiwgMHgyMDA5LCAweDAwMDAsIDB4MjhhOCwgMHgwMDc4LCAweDI2YjIsIDB4YTgxMiwgMHgwMDQ4LAorCTB4MjZhZSwgMHgyMDA4LCAweGE4MDIsIDB4MjBhOCwgMHgwMDc4LCAweDI2YjIsIDB4NzA5MywgMHhmZmZmLAorCTB4MDA3OCwgMHgyNzA1LCAweDI3MDAsIDB4MTU3ZSwgMHgwMTdlLCAweGExMDYsIDB4MDA0MCwgMHgyNmY5LAorCTB4YzQ4NCwgMHgxMDc4LCAweDQ1MDEsIDB4MDA0MCwgMHgyNmMzLCAweDEwNzgsIDB4NDQ5OSwgMHgwMGMwLAorCTB4MjcwMiwgMHgwMDc4LCAweDI2YzQsIDB4YzQ4NSwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LAorCTB4MDAwNiwgMHgwMGMwLCAweDI2ZDMsIDB4NzAzMCwgMHhkMDhjLCAweDAwNDAsIDB4MjZmMSwgMHg2MDAwLAorCTB4ZDBiYywgMHgwMGMwLCAweDI2ZjEsIDB4NzI4MCwgMHhkMjhjLCAweDAwNDAsIDB4MjZlOSwgMHg2MDA0LAorCTB4YTA4NCwgMHgwMGZmLCAweGEwODIsIDB4MDAwNiwgMHgwMDQ4LCAweDI2ZjksIDB4ZDQ4NCwgMHgwMGMwLAorCTB4MjZlNSwgMHgxMDc4LCAweDQ0YmMsIDB4MDA3OCwgMHgyNmU3LCAweDEwNzgsIDB4MjkyMSwgMHgwMDc4LAorCTB4MjZmOSwgMHgxMDc4LCAweDI4NTcsIDB4MTA3OCwgMHgyNzRjLCAweDAwNDAsIDB4MjcwMiwgMHgwMDc4LAorCTB4MjZmOSwgMHgxMDc4LCAweDI4ZWMsIDB4MDA0MCwgMHgyNmY5LCAweDEwNzgsIDB4MjcxZiwgMHgwMDQwLAorCTB4MjcwMiwgMHgwMTdmLCAweDgxMDgsIDB4MTU3ZiwgMHgwMGYwLCAweDI2YjIsIDB4NzA5MywgMHhmZmZmLAorCTB4MDA3OCwgMHgyNzA1LCAweDAxN2YsIDB4MTU3ZiwgMHg3MTkyLCAweDA0N2YsIDB4MDI3ZiwgMHgwYzdmLAorCTB4MDA3YywgMHgwYzdlLCAweDAxN2UsIDB4NzA5MywgMHgwMDAwLCAweDIwMDksIDB4MDA3ZSwgMHgxMDc4LAorCTB4NDQ5OSwgMHgwMGMwLCAweDI3MWMsIDB4MTA3OCwgMHgyODU3LCAweDEwNzgsIDB4Mjc0YywgMHgwMDQwLAorCTB4MjcxYywgMHg3MGM4LCAweGMwYmQsIDB4NzBjYSwgMHgwMTdmLCAweDBjN2YsIDB4MDA3YywgMHgwMTdlLAorCTB4MDc3ZSwgMHgwZDdlLCAweDBjN2UsIDB4MmM2OCwgMHgyMDAxLCAweGEzNTYsIDB4MjAwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHg2ODQyLCAweDEwNzgsIDB4NzRkNywgMHgwMDQwLCAweDI3NDcsIDB4MmQwMCwgMHg2MDFhLAorCTB4NjAxZiwgMHgwMDAxLCAweDIwMDEsIDB4MDAwMCwgMHgxMDc4LCAweDQ0MmIsIDB4MjAwMSwgMHgwMDAwLAorCTB4MTA3OCwgMHg0NDNmLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDcwOGMsIDB4ODAwMCwgMHg3MDhlLAorCTB4MTI3ZiwgMHgyMDA5LCAweDAwMDQsIDB4MTA3OCwgMHg3NTZjLCAweGEwODUsIDB4MDAwMSwgMHgwYzdmLAorCTB4MGQ3ZiwgMHgwNzdmLCAweDAxN2YsIDB4MDA3YywgMHgwMTdlLCAweDA3N2UsIDB4MGQ3ZSwgMHgwYzdlLAorCTB4MmM2OCwgMHgyMDAxLCAweGEzNTYsIDB4MjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4Njg0MiwgMHgxMDc4LAorCTB4NzRkNywgMHgwMDQwLCAweDI3ODUsIDB4MmQwMCwgMHg2MDFhLCAweDY4MDAsIDB4YzBjNCwgMHg2ODAyLAorCTB4NjhhMCwgMHhhMDg2LCAweDAwN2UsIDB4MDA0MCwgMHgyNzZlLCAweDY4MDQsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4Mjc2ZSwgMHgxMDc4LCAweDI4MTMsIDB4NjAxZiwgMHgwMDAxLAorCTB4MjAwMSwgMHgwMDAwLCAweDEwNzgsIDB4NDQyYiwgMHgyMDAxLCAweDAwMDIsIDB4MTA3OCwgMHg0NDNmLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NzA4YywgMHg4MDAwLCAweDcwOGUsIDB4MTI3ZiwgMHgyMDA5LAorCTB4MDAwMiwgMHgxMDc4LCAweDc1NmMsIDB4YTA4NSwgMHgwMDAxLCAweDBjN2YsIDB4MGQ3ZiwgMHgwNzdmLAorCTB4MDE3ZiwgMHgwMDdjLCAweDBjN2UsIDB4MDI3ZSwgMHgyMDA5LCAweDAwODAsIDB4MTA3OCwgMHg0NDk5LAorCTB4MDBjMCwgMHgyNzk4LCAweDEwNzgsIDB4Mjc5YiwgMHgwMDQwLCAweDI3OTgsIDB4NzBjZiwgMHhmZmZmLAorCTB4MDI3ZiwgMHgwYzdmLCAweDAwN2MsIDB4MDE3ZSwgMHgwNzdlLCAweDBkN2UsIDB4MGM3ZSwgMHgyYzY4LAorCTB4MTA3OCwgMHg3NGQ3LCAweDAwNDAsIDB4MjdiZCwgMHgyZDAwLCAweDYwMWEsIDB4NjAxZiwgMHgwMDAxLAorCTB4MjAwMSwgMHgwMDAwLCAweDEwNzgsIDB4NDQyYiwgMHgyMDAxLCAweDAwMDIsIDB4MTA3OCwgMHg0NDNmLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NzBkMCwgMHg4MDAwLCAweDcwZDIsIDB4MTI3ZiwgMHgyMDA5LAorCTB4MDAwMiwgMHgxMDc4LCAweDc1NmMsIDB4YTA4NSwgMHgwMDAxLCAweDBjN2YsIDB4MGQ3ZiwgMHgwNzdmLAorCTB4MDE3ZiwgMHgwMDdjLCAweDBjN2UsIDB4MGQ3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDA5LAorCTB4MDA3ZiwgMHgxMDc4LCAweDQ0OTksIDB4MDBjMCwgMHgyN2RlLCAweDJjNjgsIDB4MTA3OCwgMHg3NGQ3LAorCTB4MDA0MCwgMHgyN2RlLCAweDJkMDAsIDB4NjAxYSwgMHg2MzEyLCAweDYwMWYsIDB4MDAwMSwgMHg2MjBhLAorCTB4MjAwOSwgMHgwMDIyLCAweDEwNzgsIDB4NzU2YywgMHhhMDg1LCAweDAwMDEsIDB4MTI3ZiwgMHgwZDdmLAorCTB4MGM3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MGM3ZSwgMHgwNjdlLCAweDAzN2UsIDB4MDI3ZSwgMHgxMDc4LAorCTB4NWQ2MCwgMHgxMDc4LCAweDVkMDIsIDB4MTA3OCwgMHg3ZGRmLCAweDIxMzAsIDB4ODFmZiwgMHgwMDQwLAorCTB4MjdmNywgMHgyMGE5LCAweDAwN2UsIDB4MjAwOSwgMHgwMDAwLCAweDAwNzgsIDB4MjdmYiwgMHgyMGE5LAorCTB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsIDB4MDE3ZSwgMHgxMDc4LCAweDQ1MDEsIDB4MDBjMCwgMHgyODA0LAorCTB4MTA3OCwgMHg0NzFiLCAweDEwNzgsIDB4NDIzNSwgMHgwMTdmLCAweDgxMDgsIDB4MDBmMCwgMHgyN2ZiLAorCTB4ODZmZiwgMHgwMGMwLCAweDI4MGQsIDB4MTA3OCwgMHgxMTliLCAweDAyN2YsIDB4MDM3ZiwgMHgwNjdmLAorCTB4MGM3ZiwgMHgwZTdmLCAweDAwN2MsIDB4MGU3ZSwgMHgwYzdlLCAweDAzN2UsIDB4MDI3ZSwgMHgwMTdlLAorCTB4NjIxOCwgMHgyMjcwLCAweDcyYTAsIDB4MDI3ZSwgMHgyMDE5LCAweDAwMjksIDB4MTA3OCwgMHg1ZDUzLAorCTB4MDc3ZSwgMHgyMDM5LCAweDAwMDAsIDB4MTA3OCwgMHg1Yzc4LCAweDJjMDgsIDB4MTA3OCwgMHg5YzM4LAorCTB4MDc3ZiwgMHgwMTdmLCAweDJlNjAsIDB4MTA3OCwgMHg0NzFiLCAweDYyMTAsIDB4NjMxNCwgMHgxMDc4LAorCTB4NDIzNSwgMHg2MjEyLCAweDYzMTYsIDB4MDE3ZiwgMHgwMjdmLCAweDAzN2YsIDB4MGM3ZiwgMHgwZTdmLAorCTB4MDA3YywgMHgwZTdlLCAweDAwN2UsIDB4NjAxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhkMGJjLAorCTB4MDBjMCwgMHgyODRkLCAweDIwNzEsIDB4YTMwMCwgMHg3MDhjLCAweGEwMDUsIDB4MDA0MCwgMHgyODRhLAorCTB4ODAwMSwgMHg3MDhlLCAweDAwN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDIwNzEsIDB4YTMwMCwgMHg3MGQwLAorCTB4YTAwNSwgMHgwMDQwLCAweDI4NGEsIDB4ODAwMSwgMHg3MGQyLCAweDAwNzgsIDB4Mjg0YSwgMHg2MDAwLAorCTB4YzA4YywgMHg2MDAyLCAweDAwN2MsIDB4MGY3ZSwgMHgwZTdlLCAweDBjN2UsIDB4MDM3ZSwgMHgwMjdlLAorCTB4MDE3ZSwgMHgxNTdlLCAweDIxNzgsIDB4ODFmZiwgMHgwMGMwLCAweDI4NmEsIDB4MjBhOSwgMHgwMDAxLAorCTB4MDA3OCwgMHgyODg1LCAweDIwMDEsIDB4YTM1MiwgMHgyMDA0LCAweGQwYzQsIDB4MDA0MCwgMHgyODgxLAorCTB4ZDBhNCwgMHgwMDQwLCAweDI4ODEsIDB4MDQ3ZSwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDI0LAorCTB4YTRhNCwgMHgwMGZmLCAweDg0MjcsIDB4YTAwNiwgMHgyMDA5LCAweDAwMmQsIDB4MTA3OCwgMHg5ZWMwLAorCTB4MDQ3ZiwgMHgyMGE5LCAweDAwZmYsIDB4MjAxMSwgMHgwMDAwLCAweDAyN2UsIDB4YTI4ZSwgMHgwMDdlLAorCTB4MDA0MCwgMHgyOGM5LCAweGEyOGUsIDB4MDA3ZiwgMHgwMDQwLCAweDI4YzksIDB4YTI4ZSwgMHgwMDgwLAorCTB4MDA0MCwgMHgyOGM5LCAweGEyODgsIDB4YTQzNCwgMHgyMTBjLCAweDgxZmYsIDB4MDA0MCwgMHgyOGM5LAorCTB4OGZmZiwgMHgxMDQwLCAweDI4ZDUsIDB4MGM3ZSwgMHgyMTYwLCAweDIwMDEsIDB4MDAwMSwgMHgxMDc4LAorCTB4NDhhMiwgMHgwYzdmLCAweDIwMTksIDB4MDAyOSwgMHgxMDc4LCAweDVkNTMsIDB4MDc3ZSwgMHgyMDM5LAorCTB4MDAwMCwgMHgxMDc4LCAweDVjNzgsIDB4MGM3ZSwgMHgwMjdlLCAweDIxNjAsIDB4NjIwNCwgMHhhMjk0LAorCTB4MDBmZiwgMHhhMjg2LCAweDAwMDYsIDB4MDBjMCwgMHgyOGI5LCAweDYwMDcsIDB4MDQwNCwgMHgwMDc4LAorCTB4MjhiZSwgMHgyMDAxLCAweDAwMDQsIDB4ODAwNywgMHhhMjE1LCAweDYyMDYsIDB4MDI3ZiwgMHgwYzdmLAorCTB4MDE3ZSwgMHgyYzA4LCAweDEwNzgsIDB4OWMzOCwgMHgwMTdmLCAweDA3N2YsIDB4MjE2MCwgMHgxMDc4LAorCTB4NDcxYiwgMHgwMjdmLCAweDgyMTAsIDB4MDBmMCwgMHgyODg1LCAweDE1N2YsIDB4MDE3ZiwgMHgwMjdmLAorCTB4MDM3ZiwgMHgwYzdmLCAweDBlN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDA0N2UsIDB4MDI3ZSwgMHgwMTdlLAorCTB4MjAwMSwgMHhhMzUyLCAweDIwMDQsIDB4ZDBjNCwgMHgwMDQwLCAweDI4ZTgsIDB4ZDBhNCwgMHgwMDQwLAorCTB4MjhlOCwgMHhhMDA2LCAweDIyMjAsIDB4ODQyNywgMHgyMDA5LCAweDAwMjksIDB4MTA3OCwgMHg5ZWMwLAorCTB4MDE3ZiwgMHgwMjdmLCAweDA0N2YsIDB4MDA3YywgMHgwMTdlLCAweDAyN2UsIDB4MDM3ZSwgMHgwYzdlLAorCTB4NzI4MCwgMHg4MmZmLCAweDAwNDAsIDB4MjkxYSwgMHhhMjkwLCAweGEzNTIsIDB4MjIxNCwgMHhkMmFjLAorCTB4MDBjMCwgMHgyOTFhLCAweDIxMDAsIDB4MTA3OCwgMHgyNGZhLCAweDgxZmYsIDB4MDA0MCwgMHgyOTFjLAorCTB4MjAxOSwgMHgwMDAxLCAweDgzMTQsIDB4YTJlMCwgMHhhOWMwLCAweDJjMDQsIDB4ZDM4NCwgMHgwMDQwLAorCTB4MjkwZSwgMHhhMDg0LCAweGZmMDAsIDB4ODAwNywgMHgwMDc4LCAweDI5MTAsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTExNiwgMHgwMDQwLCAweDI5MWMsIDB4YTA5NiwgMHgwMGZmLCAweDAwNDAsIDB4MjkxYSwgMHg4MzE4LAorCTB4MDA3OCwgMHgyOTAyLCAweGEwODUsIDB4MDAwMSwgMHgwYzdmLCAweDAzN2YsIDB4MDI3ZiwgMHgwMTdmLAorCTB4MDA3YywgMHgwMTdlLCAweDBjN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4YTE4MCwgMHhhNDM0LAorCTB4MjAwNCwgMHhhMDY1LCAweDAwNDAsIDB4MjkzYiwgMHgwMTdlLCAweDBjN2UsIDB4MTA3OCwgMHg4ZWMwLAorCTB4MDE3ZiwgMHgxMDQwLCAweDEzMjgsIDB4NjExYSwgMHgxMDc4LCAweDI4MTMsIDB4MTA3OCwgMHg3NTNkLAorCTB4MDE3ZiwgMHgxMDc4LCAweDQ0YmMsIDB4MTI3ZiwgMHgwYzdmLCAweDAxN2YsIDB4MDA3YywgMHg3ZWVmLAorCTB4N2RlOCwgMHg3Y2U0LCAweDgwZTIsIDB4N2JlMSwgMHg4MGUwLCAweDgwZGMsIDB4ODBkYSwgMHg3YWQ5LAorCTB4ODBkNiwgMHg4MGQ1LCAweDgwZDQsIDB4ODBkMywgMHg4MGQyLCAweDgwZDEsIDB4NzljZSwgMHg3OGNkLAorCTB4ODBjYywgMHg4MGNiLCAweDgwY2EsIDB4ODBjOSwgMHg4MGM3LCAweDgwYzYsIDB4NzdjNSwgMHg3NmMzLAorCTB4ODBiYywgMHg4MGJhLCAweDc1YjksIDB4ODBiNiwgMHg3NGI1LCAweDczYjQsIDB4NzJiMywgMHg4MGIyLAorCTB4ODBiMSwgMHg4MGFlLCAweDcxYWQsIDB4ODBhYywgMHg3MGFiLCAweDZmYWEsIDB4NmVhOSwgMHg4MGE3LAorCTB4NmRhNiwgMHg2Y2E1LCAweDZiYTMsIDB4NmE5ZiwgMHg2OTllLCAweDY4OWQsIDB4ODA5YiwgMHg4MDk4LAorCTB4Njc5NywgMHg2NjkwLCAweDY1OGYsIDB4NjQ4OCwgMHg2Mzg0LCAweDYyODIsIDB4ODA4MSwgMHg4MDgwLAorCTB4NjE3YywgMHg2MDdhLCAweDgwNzksIDB4NWY3NiwgMHg4MDc1LCAweDgwNzQsIDB4ODA3MywgMHg4MDcyLAorCTB4ODA3MSwgMHg4MDZlLCAweDVlNmQsIDB4ODA2YywgMHg1ZDZiLCAweDVjNmEsIDB4NWI2OSwgMHg4MDY3LAorCTB4NWE2NiwgMHg1OTY1LCAweDU4NjMsIDB4NTc1YywgMHg1NjVhLCAweDU1NTksIDB4ODA1NiwgMHg4MDU1LAorCTB4NTQ1NCwgMHg1MzUzLCAweDUyNTIsIDB4NTE1MSwgMHg1MDRlLCAweDRmNGQsIDB4ODA0YywgMHg4MDRiLAorCTB4NGU0YSwgMHg0ZDQ5LCAweDgwNDcsIDB4NGM0NiwgMHg4MDQ1LCAweDgwNDMsIDB4ODAzYywgMHg4MDNhLAorCTB4ODAzOSwgMHg4MDM2LCAweDRiMzUsIDB4ODAzNCwgMHg0YTMzLCAweDQ5MzIsIDB4NDgzMSwgMHg4MDJlLAorCTB4NDcyZCwgMHg0NjJjLCAweDQ1MmIsIDB4NDQyYSwgMHg0MzI5LCAweDQyMjcsIDB4ODAyNiwgMHg4MDI1LAorCTB4NDEyMywgMHg0MDFmLCAweDNmMWUsIDB4M2UxZCwgMHgzZDFiLCAweDNjMTgsIDB4ODAxNywgMHg4MDEwLAorCTB4M2IwZiwgMHgzYTA4LCAweDgwMDQsIDB4MzkwMiwgMHg4MDAxLCAweDgwMDAsIDB4ODAwMCwgMHgzODAwLAorCTB4MzcwMCwgMHgzNjAwLCAweDgwMDAsIDB4MzUwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgzNDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MzMwMCwgMHgzMjAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MzEwMCwgMHgzMDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDJmMDAsIDB4ODAwMCwgMHgyZTAwLCAweDJkMDAsIDB4MmMwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDJiMDAsIDB4ODAwMCwgMHgyYTAwLCAweDI5MDAsIDB4MjgwMCwgMHg4MDAwLAorCTB4MjcwMCwgMHgyNjAwLCAweDI1MDAsIDB4MjQwMCwgMHgyMzAwLCAweDIyMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4MjEwMCwgMHgyMDAwLCAweDFmMDAsIDB4MWUwMCwgMHgxZDAwLCAweDFjMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4MWIwMCwgMHgxYTAwLCAweDgwMDAsIDB4MTkwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDE4MDAsIDB4ODAwMCwgMHgxNzAwLCAweDE2MDAsIDB4MTUwMCwgMHg4MDAwLAorCTB4MTQwMCwgMHgxMzAwLCAweDEyMDAsIDB4MTEwMCwgMHgxMDAwLCAweDBmMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4MGUwMCwgMHgwZDAwLCAweDBjMDAsIDB4MGIwMCwgMHgwYTAwLCAweDA5MDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4MDgwMCwgMHgwNzAwLCAweDgwMDAsIDB4MDYwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgwNTAwLAorCTB4MDQwMCwgMHgwMzAwLCAweDgwMDAsIDB4MDIwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgwMTAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MDAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgyMDcxLAorCTB4YTM4MSwgMHg3MDAzLCAweDAwMDIsIDB4YTAwNiwgMHg3MDEyLCAweDcwMTYsIDB4NzAzYSwgMHg3MDNlLAorCTB4NzAzMywgMHhhMzkxLCAweDcwMzcsIDB4YTM5MSwgMHg3MDA3LCAweDAwMDEsIDB4MjA2MSwgMHhhM2QxLAorCTB4NjAwMywgMHgwMDAyLCAweDAwN2MsIDB4MDA5MCwgMHgyYTY2LCAweDAwNjgsIDB4MmE2NiwgMHgyMDcxLAorCTB4YTM4MSwgMHgyYjc4LCAweDc4MTgsIDB4ZDA4NCwgMHgwMGMwLCAweDJhNjYsIDB4MmE2MCwgMHg3ODIwLAorCTB4YTA4ZSwgMHgwMDY5LCAweDAwYzAsIDB4MmI1NiwgMHgwMDc5LCAweDJhZWEsIDB4MDA3YywgMHgyMDcxLAorCTB4YTM4MSwgMHg3MDA0LCAweDAwNzksIDB4MmE2YywgMHgyYTcwLCAweDJhNzEsIDB4MmE3YiwgMHgyYThkLAorCTB4MDA3YywgMHgwMDkwLCAweDJhN2EsIDB4MDA2OCwgMHgyYTdhLCAweDJiNzgsIDB4NzgxOCwgMHhkMDg0LAorCTB4MDA0MCwgMHgyYTk5LCAweDAwN2MsIDB4MmI3OCwgMHgyMDYxLCAweGEzZDEsIDB4NjAwOCwgMHhhMDhlLAorCTB4MDEwMCwgMHgwMDQwLCAweDJhODgsIDB4YTA4NiwgMHgwMjAwLCAweDAwNDAsIDB4MmI0ZSwgMHgwMDdjLAorCTB4NzAxNCwgMHgyMDY4LCAweDJhNjAsIDB4NzAxOCwgMHgwMDdhLCAweDcwMTAsIDB4MjA2OCwgMHg2ODM0LAorCTB4YTA4NiwgMHgwMTAzLCAweDAwNDAsIDB4MmE5NSwgMHgwMDdjLCAweDJhNjAsIDB4MmI3OCwgMHg3MDE4LAorCTB4MDA3YSwgMHgyYTYwLCAweDc4MjAsIDB4YTA4YSwgMHgwMDQwLCAweDAwYzgsIDB4MmFhMiwgMHg2MWI4LAorCTB4MDA3OSwgMHgyYWFhLCAweDIxMDAsIDB4YTA4YSwgMHgwMDNmLCAweDAwYzgsIDB4MmI0YSwgMHg2MWI4LAorCTB4MDA3OSwgMHgyYWVhLCAweDJiMmMsIDB4MmI1ZSwgMHgyYjY2LCAweDJiNmEsIDB4MmI3MiwgMHgyYjc4LAorCTB4MmI3YywgMHgyYjg4LCAweDJiOGMsIDB4MmI5NiwgMHgyYjlhLCAweDJiNGEsIDB4MmI0YSwgMHgyYjRhLAorCTB4MmI5ZSwgMHgyYjRhLCAweDJiYWUsIDB4MmJjNSwgMHgyYmRjLCAweDJjNTgsIDB4MmM1ZCwgMHgyYzhhLAorCTB4MmNlNCwgMHgyY2Y1LCAweDJkMTMsIDB4MmQ1NCwgMHgyZDVlLCAweDJkNmIsIDB4MmQ3ZSwgMHgyZDlkLAorCTB4MmRhNiwgMHgyZGUzLCAweDJkZTksIDB4MmI0YSwgMHgyZTA1LCAweDJiNGEsIDB4MmI0YSwgMHgyYjRhLAorCTB4MmI0YSwgMHgyYjRhLCAweDJlMGMsIDB4MmUxNiwgMHgyYjRhLCAweDJiNGEsIDB4MmI0YSwgMHgyYjRhLAorCTB4MmI0YSwgMHgyYjRhLCAweDJiNGEsIDB4MmI0YSwgMHgyZTFlLCAweDJiNGEsIDB4MmI0YSwgMHgyYjRhLAorCTB4MmI0YSwgMHgyYjRhLCAweDJlMzAsIDB4MmU0NywgMHgyYjRhLCAweDJiNGEsIDB4MmI0YSwgMHgyYjRhLAorCTB4MmI0YSwgMHgyYjRhLCAweDJlNTksIDB4MmViMCwgMHgyZjBlLCAweDJmMWYsIDB4MmI0YSwgMHgyYjRhLAorCTB4MmI0YSwgMHgzOGYxLCAweDJiNGEsIDB4MmI0YSwgMHgyYjRhLCAweDJiNGEsIDB4MmI0YSwgMHgyYjRhLAorCTB4MmI0YSwgMHgyYjRhLCAweDJiOTYsIDB4MmI5YSwgMHgyZjM2LCAweDJiNGEsIDB4MmY0MywgMHgzOTdkLAorCTB4MzlkYSwgMHgyYjRhLCAweDJiNGEsIDB4MmI0YSwgMHgyYjRhLCAweDJiNGEsIDB4MmI0YSwgMHgyYjRhLAorCTB4MmI0YSwgMHgyYjRhLCAweDJmOTAsIDB4MzBjNSwgMHgzMGUxLCAweDMwZWQsIDB4MzE1MCwgMHgzMWE5LAorCTB4MzFiNCwgMHgzMWYzLCAweDMyMDIsIDB4MzIxMSwgMHgzMjE0LCAweDJmNDcsIDB4MzIzOCwgMHgzMjg0LAorCTB4MzI5MSwgMHgzM2EyLCAweDM0Y2QsIDB4MzRmNywgMHgzNjA0LCAweDM2MTQsIDB4MzYyMSwgMHgzNjViLAorCTB4MzcyYSwgMHgyYjRhLCAweDJiNGEsIDB4MmI0YSwgMHgyYjRhLCAweDM3OTIsIDB4MzdhZSwgMHgzODI4LAorCTB4MzhlMiwgMHg3MTNjLCAweDAwNzgsIDB4MmIyYywgMHgyMDIxLCAweDQwMDAsIDB4MTA3OCwgMHgzNTUzLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MDA2OCwgMHgyYjM5LCAweDc4MTgsIDB4ZDA4NCwgMHgwMDQwLAorCTB4MmIzYywgMHgxMjdmLCAweDAwNzgsIDB4MmIzMCwgMHg3YzIyLCAweDc5MjYsIDB4N2EyYSwgMHg3YjJlLAorCTB4NzgxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHg3MDA3LCAweDAwMDEsIDB4MjA5MSwgMHg1MDAwLAorCTB4MTI3ZiwgMHgwMDdjLCAweDIwMjEsIDB4NDAwMSwgMHgwMDc4LCAweDJiMmUsIDB4MjAyMSwgMHg0MDAyLAorCTB4MDA3OCwgMHgyYjJlLCAweDIwMjEsIDB4NDAwMywgMHgwMDc4LCAweDJiMmUsIDB4MjAyMSwgMHg0MDA1LAorCTB4MDA3OCwgMHgyYjJlLCAweDIwMjEsIDB4NDAwNiwgMHgwMDc4LCAweDJiMmUsIDB4YTAyZSwgMHgyNTIwLAorCTB4N2IyOCwgMHg3YTJjLCAweDc4MjQsIDB4NzkzMCwgMHgwMDc4LCAweDM1NjIsIDB4NzgyMywgMHgwMDA0LAorCTB4NzgyNCwgMHgwMDdhLCAweGEwMmUsIDB4MjUyMCwgMHg3YjI4LCAweDdhMmMsIDB4NzgyNCwgMHg3OTMwLAorCTB4MDA3OCwgMHgzNTY2LCAweDc5MjQsIDB4NzgyOCwgMHgyMTE0LCAweDIwMGEsIDB4MDA3OCwgMHgyYjJjLAorCTB4NzkyNCwgMHgyMTE0LCAweDAwNzgsIDB4MmIyYywgMHgyMDk5LCAweDAwMDksIDB4MjBhMSwgMHgwMDA5LAorCTB4MjBhOSwgMHgwMDA3LCAweDUzYTMsIDB4NzkyNCwgMHg3YTI4LCAweDdiMmMsIDB4MDA3OCwgMHgyYjJjLAorCTB4NzgyNCwgMHgyMDYwLCAweDAwNzgsIDB4MmJhMCwgMHgyMDA5LCAweDAwMDEsIDB4MjAxMSwgMHgwMDEzLAorCTB4MjAxOSwgMHgwMDEwLCAweDc4M2IsIDB4MDAxNywgMHgwMDc4LCAweDJiMmMsIDB4N2QzOCwgMHg3YzNjLAorCTB4MDA3OCwgMHgyYjYwLCAweDdkMzgsIDB4N2MzYywgMHgwMDc4LCAweDJiNmMsIDB4MjA2MSwgMHgxMDAwLAorCTB4NjEwYywgMHhhMDA2LCAweDJjMTQsIDB4YTIwMCwgMHg4YzYwLCAweDgxMDksIDB4MDBjMCwgMHgyYmEyLAorCTB4MjAxMCwgMHhhMDA1LCAweDAwNDAsIDB4MmIyYywgMHgwMDc4LCAweDJiNTIsIDB4MjA2OSwgMHhhMzUxLAorCTB4NzgyNCwgMHg3OTMwLCAweGExMWEsIDB4MDBjOCwgMHgyYjVhLCAweDgwMTksIDB4MDA0MCwgMHgyYjVhLAorCTB4Njg0YSwgMHg2OTQyLCAweDc4MmMsIDB4Njg1MiwgMHg3ODI4LCAweDY4NTYsIDB4YTAwNiwgMHg2ODVhLAorCTB4Njg1ZSwgMHgxMDc4LCAweDRkYmQsIDB4MDA3OCwgMHgyYjJjLCAweDIwNjksIDB4YTM1MSwgMHg3ODI0LAorCTB4NzkzNCwgMHhhMTFhLCAweDAwYzgsIDB4MmI1YSwgMHg4MDE5LCAweDAwNDAsIDB4MmI1YSwgMHg2ODRlLAorCTB4Njk0NiwgMHg3ODJjLCAweDY4NjIsIDB4NzgyOCwgMHg2ODY2LCAweGEwMDYsIDB4Njg2YSwgMHg2ODZlLAorCTB4MTA3OCwgMHg0OTRkLCAweDAwNzgsIDB4MmIyYywgMHhhMDJlLCAweDI1MjAsIDB4ODFmZiwgMHgwMGMwLAorCTB4MmI1NiwgMHg3OTI0LCAweDdiMjgsIDB4N2EyYywgMHgyMGE5LCAweDAwMDUsIDB4MjBhMSwgMHhhMzg4LAorCTB4NDFhMSwgMHgxMDc4LCAweDM1MTgsIDB4MDA0MCwgMHgyYjU2LCAweDIwMDksIDB4MDAyMCwgMHgxMDc4LAorCTB4MzU2MiwgMHg3MDFiLCAweDJiZjQsIDB4MDA3YywgMHg2ODM0LCAweDIwMDgsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA5NiwgMHgwMDExLCAweDAwNDAsIDB4MmMwMCwgMHhhMDk2LCAweDAwMTksIDB4MDBjMCwgMHgyYjU2LAorCTB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4MDA0MCwgMHgyYjU2LCAweDcxMGUsIDB4NzAwYywgMHg4MDAxLAorCTB4MDA0MCwgMHgyYzMxLCAweDcwMGUsIDB4MTA3OCwgMHgzNTE4LCAweDAwNDAsIDB4MmI1NiwgMHgyMDA5LAorCTB4MDAyMCwgMHgyMDYxLCAweGEzZDEsIDB4NjIyNCwgMHg2MzI4LCAweDY0MmMsIDB4NjUzMCwgMHhhMjkwLAorCTB4MDA0MCwgMHhhMzk5LCAweDAwMDAsIDB4YTRhMSwgMHgwMDAwLCAweGE1YTksIDB4MDAwMCwgMHgxMDc4LAorCTB4MzU2MiwgMHg3MDFiLCAweDJjMjQsIDB4MDA3YywgMHg2ODM0LCAweGEwODQsIDB4MDBmZiwgMHhhMDk2LAorCTB4MDAwMiwgMHgwMDQwLCAweDJjMmYsIDB4YTA5NiwgMHgwMDBhLCAweDAwYzAsIDB4MmI1NiwgMHgwMDc4LAorCTB4MmMwNiwgMHg3MDEwLCAweDIwNjgsIDB4NjgzOCwgMHhjMGZkLCAweDY4M2EsIDB4MTA3OCwgMHg0MzZlLAorCTB4MDBjMCwgMHgyYzNmLCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDJjNDEsIDB4MDA3YywgMHgxMDc4LAorCTB4NGE2MCwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMGE5LCAweDAwMDUsIDB4MjA5OSwgMHhhMzg4LAorCTB4NTMwYSwgMHgyMTAwLCAweGEyMTAsIDB4YTM5OSwgMHgwMDAwLCAweGE0YTEsIDB4MDAwMCwgMHhhNWE5LAorCTB4MDAwMCwgMHhhZDgwLCAweDAwMGQsIDB4MjAwOSwgMHgwMDIwLCAweDEyN2YsIDB4MDA3OCwgMHgzNTY2LAorCTB4NjFhMCwgMHg3ODI0LCAweDYwYTIsIDB4MDA3OCwgMHgyYjJjLCAweDIwOTEsIDB4ODAwMCwgMHg3ODIzLAorCTB4NDAwMCwgMHg3ODI3LCAweDQ5NTMsIDB4NzgyYiwgMHg1MDIwLCAweDc4MmYsIDB4MjAyMCwgMHgyMDA5LAorCTB4MDE3ZiwgMHgyMTA0LCAweDc4MzIsIDB4M2YwMCwgMHg3ODM2LCAweDIwNjEsIDB4MDEwMCwgMHg2MjAwLAorCTB4MjA2MSwgMHgwMjAwLCAweDYwM2MsIDB4ODAwNywgMHhhMjA1LCAweDc4M2EsIDB4MjAwOSwgMHgwNGZkLAorCTB4MjEwNCwgMHg3ODNlLCAweDc4MWIsIDB4MDAwMSwgMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwgMHg0MDgwLAorCTB4MjA3MSwgMHgwMDEwLCAweDIwYzEsIDB4MDBmMCwgMHhhMDhhLCAweDAwMDMsIDB4MDBjOCwgMHgwNDI3LAorCTB4MDA3OCwgMHgwNDIzLCAweDgxZmYsIDB4MDBjMCwgMHgyYjU2LCAweDc5MjQsIDB4ODEwZiwgMHhhMThjLAorCTB4MDBmZiwgMHgxMDc4LCAweDQ1MDEsIDB4MDBjMCwgMHgyYjVhLCAweDdlMzgsIDB4YTY4NCwgMHgzZmZmLAorCTB4YTA4MiwgMHg0MDAwLCAweDAwNDgsIDB4MmM5ZSwgMHgwMDc4LCAweDJiNWEsIDB4N2MyOCwgMHg3ZDJjLAorCTB4MTA3OCwgMHg0NmQ2LCAweGQyOGMsIDB4MDBjMCwgMHgyY2E5LCAweDEwNzgsIDB4NDY2YSwgMHgwMDc4LAorCTB4MmNhYiwgMHgxMDc4LCAweDQ2YTQsIDB4MDBjMCwgMHgyY2Q1LCAweDIwNjEsIDB4YWEwMCwgMHgxMjdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAwLCAweDAwNDAsIDB4MmNjMywgMHg2MDEwLAorCTB4YTA2ZCwgMHgwMDQwLCAweDJjYzMsIDB4NjgzYywgMHhhNDA2LCAweDAwYzAsIDB4MmNjMywgMHg2ODQwLAorCTB4YTUwNiwgMHgwMDQwLCAweDJjY2UsIDB4MTI3ZiwgMHhhY2UwLCAweDAwMTAsIDB4MjAwMSwgMHhhMzE1LAorCTB4MjAwNCwgMHhhYzAyLCAweDAwYzgsIDB4MmI1NiwgMHgwMDc4LCAweDJjYWYsIDB4MTA3OCwgMHg4NzU4LAorCTB4MTI3ZiwgMHgwMDQwLCAweDJiNTYsIDB4MDA3OCwgMHgyYjJjLCAweGEwMGUsIDB4MjAwMSwgMHgwMDA1LAorCTB4MTA3OCwgMHg0YTYwLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4OGNjMCwgMHgxMDc4LAorCTB4NDk4MiwgMHgxMjdmLCAweDAwNzgsIDB4MmIyYywgMHg4MWZmLCAweDAwYzAsIDB4MmI1NiwgMHgxMDc4LAorCTB4MzUzMCwgMHgwMDQwLCAweDJiNWEsIDB4MTA3OCwgMHg0NWE3LCAweDAwNDAsIDB4MmI1NiwgMHgxMDc4LAorCTB4NDZlNCwgMHgwMDQwLCAweDJiNTYsIDB4MDA3OCwgMHgyYjJjLCAweDgxZmYsIDB4MDBjMCwgMHgyYjU2LAorCTB4MTA3OCwgMHgzNTQyLCAweDAwNDAsIDB4MmI1YSwgMHgxMDc4LCAweDQ3NWYsIDB4MDA0MCwgMHgyYjU2LAorCTB4MjAxOSwgMHgwMDA1LCAweDEwNzgsIDB4NDcwNSwgMHgwMDQwLCAweDJiNTYsIDB4NzgyOCwgMHhhMDhhLAorCTB4MTAwMCwgMHgwMGM4LCAweDJiNWEsIDB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4YTEwOCwgMHgxMDc4LAorCTB4NThlMSwgMHgwMDc4LCAweDJiMmMsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4ODFmZiwgMHgwMDQwLAorCTB4MmQxZCwgMHgyMDA5LCAweDAwMDEsIDB4MDA3OCwgMHgyZDRlLCAweDIwMjksIDB4MDBmZiwgMHg2NDRjLAorCTB4MjQwMCwgMHhhNTA2LCAweDAwNDAsIDB4MmQ0OCwgMHgyNTA4LCAweDEwNzgsIDB4NDUwMSwgMHgwMGMwLAorCTB4MmQ0OCwgMHgxMDc4LCAweDQ3NWYsIDB4MDBjMCwgMHgyZDMzLCAweDIwMDksIDB4MDAwMiwgMHg2MmE4LAorCTB4MjUxOCwgMHgwMDc4LCAweDJkNGUsIDB4MjAxOSwgMHgwMDA0LCAweDEwNzgsIDB4NDcwNSwgMHgwMGMwLAorCTB4MmQzZCwgMHgyMDA5LCAweDAwMDYsIDB4MDA3OCwgMHgyZDRlLCAweDc4MjQsIDB4YTA4YSwgMHgxMDAwLAorCTB4MDBjOCwgMHgyZDUxLCAweDgwMDMsIDB4ODAwYiwgMHg4MTBiLCAweGExMDgsIDB4MTA3OCwgMHg1OGUxLAorCTB4ODUyOSwgMHgwMGM4LCAweDJkMjAsIDB4MTI3ZiwgMHgwMDc4LCAweDJiMmMsIDB4MTI3ZiwgMHgwMDc4LAorCTB4MmI1NiwgMHgxMjdmLCAweDAwNzgsIDB4MmI1YSwgMHgxMDc4LCAweDM1MzAsIDB4MDA0MCwgMHgyYjVhLAorCTB4MTA3OCwgMHg0NjFiLCAweDEwNzgsIDB4NDZkNiwgMHgwMDc4LCAweDJiMmMsIDB4ODFmZiwgMHgwMGMwLAorCTB4MmI1NiwgMHgxMDc4LCAweDM1MzAsIDB4MDA0MCwgMHgyYjVhLCAweDEwNzgsIDB4NDYwYSwgMHgxMDc4LAorCTB4NDZkNiwgMHgwMDc4LCAweDJiMmMsIDB4ODFmZiwgMHgwMGMwLCAweDJiNTYsIDB4MTA3OCwgMHgzNTMwLAorCTB4MDA0MCwgMHgyYjVhLCAweDEwNzgsIDB4NDZhNywgMHgwMDQwLCAweDJiNTYsIDB4MTA3OCwgMHg0M2MxLAorCTB4MTA3OCwgMHg0NjYzLCAweDEwNzgsIDB4NDZkNiwgMHgwMDc4LCAweDJiMmMsIDB4MTA3OCwgMHgzNTMwLAorCTB4MDA0MCwgMHgyYjVhLCAweDEwNzgsIDB4NDVhNywgMHgwMDQwLCAweDJiNTYsIDB4NjJhMCwgMHgyMDE5LAorCTB4MDAwNSwgMHgwYzdlLCAweDEwNzgsIDB4NDcxYiwgMHgwYzdmLCAweDEwNzgsIDB4NWQ1MywgMHgwNzdlLAorCTB4MjAzOSwgMHgwMDAwLCAweDEwNzgsIDB4NWM3OCwgMHgyMDA5LCAweDAwMDAsIDB4MTA3OCwgMHg5YzM4LAorCTB4MDc3ZiwgMHgxMDc4LCAweDQ2ZDYsIDB4MDA3OCwgMHgyYjJjLCAweDEwNzgsIDB4MzUzMCwgMHgwMDQwLAorCTB4MmI1YSwgMHgxMDc4LCAweDQ2ZDYsIDB4MjIwOCwgMHgwMDc4LCAweDJiMmMsIDB4MTU3ZSwgMHgwZDdlLAorCTB4MGU3ZSwgMHgyMDY5LCAweGE0MTMsIDB4NjgxMCwgMHg2OTE0LCAweGExMGEsIDB4MDBjOCwgMHgyZGIyLAorCTB4MjAwOSwgMHgwMDAwLCAweDY4MTYsIDB4MjAxMSwgMHgwMDAwLCAweDIwMTksIDB4MDAwMCwgMHgyMGE5LAorCTB4MDBmZiwgMHgyMDY5LCAweGE0MzQsIDB4MmQwNCwgMHhhMDc1LCAweDAwNDAsIDB4MmRjNywgMHg3MDRjLAorCTB4MTA3OCwgMHgyZGQxLCAweGEyMTAsIDB4NzA4MCwgMHgxMDc4LCAweDJkZDEsIDB4YTMxOCwgMHg4ZDY4LAorCTB4MDBmMCwgMHgyZGJiLCAweDIzMDAsIDB4YTIxOCwgMHgwZTdmLCAweDBkN2YsIDB4MTU3ZiwgMHgwMDc4LAorCTB4MmIyYywgMHgwZjdlLCAweDAxN2UsIDB4YTA3ZCwgMHgwMDQwLCAweDJkZTAsIDB4MjAwMSwgMHgwMDAwLAorCTB4ODAwMCwgMHgyZjBjLCAweDgxZmYsIDB4MDA0MCwgMHgyZGUwLCAweDIxNzgsIDB4MDA3OCwgMHgyZGQ4LAorCTB4MDE3ZiwgMHgwZjdmLCAweDAwN2MsIDB4MjA2OSwgMHhhNDEzLCAweDY5MTAsIDB4NjJhNCwgMHgwMDc4LAorCTB4MmIyYywgMHg4MWZmLCAweDAwYzAsIDB4MmI1NiwgMHg2MTRjLCAweGExOTAsIDB4MjkzZiwgMHgyMjE0LAorCTB4YTI5NCwgMHgwMGZmLCAweDYwNmMsIDB4YTA4NCwgMHhmZjAwLCAweGEyMTUsIDB4NjM2OCwgMHg2N2M4LAorCTB4ZDc5YywgMHgwMDQwLCAweDJkZmYsIDB4MjAzMSwgMHgwMDAxLCAweDAwNzgsIDB4MmUwMSwgMHgyMDMxLAorCTB4MDAwMCwgMHg3ZTNhLCAweDdmM2UsIDB4MDA3OCwgMHgyYjJjLCAweDYxM2MsIDB4NjI0MCwgMHgyMDE5LAorCTB4YTVhMCwgMHgyMzFjLCAweDAwNzgsIDB4MmIyYywgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MTM0LAorCTB4YTAwNiwgMHgyMDEwLCAweDIwMTgsIDB4MTI3ZiwgMHgwMDc4LCAweDJiMmMsIDB4MTA3OCwgMHgzNTQyLAorCTB4MDA0MCwgMHgyYjVhLCAweDYyNDQsIDB4NjMzOCwgMHgwMDc4LCAweDJiMmMsIDB4NjEzYywgMHg2MjQwLAorCTB4NzgyNCwgMHg2MDNlLCAweDdiMjgsIDB4NjM0MiwgMHgyMDY5LCAweGEzNTEsIDB4ODMxZiwgMHhhMzA1LAorCTB4NjgxNiwgMHg3ODJjLCAweDIwNjksIDB4YTVhMCwgMHgyZDFjLCAweDIwNmEsIDB4MDA3OCwgMHgyYjJjLAorCTB4MDE3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg3ODI0LCAweDYwMzYsIDB4ZDA5NCwgMHgwMDQwLAorCTB4MmU0MywgMHg3ODI4LCAweGEwODUsIDB4MDAwMSwgMHgyMDA5LCAweGE1YTksIDB4MjAwYSwgMHgyMDAxLAorCTB4ZmZmZiwgMHgxMDc4LCAweDU5NzUsIDB4MTI3ZiwgMHgwMTdmLCAweDAwNzgsIDB4MmIyYywgMHgxMDc4LAorCTB4MzU0MiwgMHgwMDQwLCAweDJiNWEsIDB4NzgyOCwgMHhhMDBkLCAweDAwNDAsIDB4MmI1YSwgMHg3ODJjLAorCTB4YTAwNSwgMHgwMDQwLCAweDJiNWEsIDB4NjI0NCwgMHg2MTQ2LCAweDYzMzgsIDB4NjAzYSwgMHgwMDc4LAorCTB4MmIyYywgMHgyMDAxLCAweGEzMDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHgyYjU2LAorCTB4MGM3ZSwgMHgyMDYxLCAweDAxMDAsIDB4NzkyNCwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHhhMTk2LAorCTB4MDBmZiwgMHgwMGMwLCAweDJlNzAsIDB4NjAzMCwgMHhhMDg1LCAweGZmMDAsIDB4MDA3OCwgMHgyZTdmLAorCTB4YTE4MiwgMHgwMDdmLCAweDAwYzgsIDB4MmVhOSwgMHhhMTg4LCAweDI5M2YsIDB4MjEwYywgMHhhMThjLAorCTB4MDBmZiwgMHg2MDMwLCAweGExMTYsIDB4MDA0MCwgMHgyZWE5LCAweDgxMGYsIDB4YTEwNSwgMHgxMjdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDAwN2UsIDB4MTA3OCwgMHg3NGQ3LCAweDAwN2YsIDB4MDA0MCwgMHgyZWE1LAorCTB4NjAxYSwgMHg2MDBiLCAweGJjMDksIDB4NjAxZiwgMHgwMDAxLCAweDEwNzgsIDB4MzUxOCwgMHgwMDQwLAorCTB4MmVhYywgMHg2ODM3LCAweDAwMDAsIDB4NzAwNywgMHgwMDAzLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LAorCTB4YzBmZCwgMHg2ODNhLCAweDcwMWIsIDB4MmYwNywgMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDMyLAorCTB4MTA3OCwgMHg3NTZjLCAweDEyN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDEyN2YsIDB4MGM3ZiwgMHgwMDc4LAorCTB4MmI1NiwgMHgwYzdmLCAweDAwNzgsIDB4MmI1YSwgMHgxMDc4LCAweDc1M2QsIDB4MDA3OCwgMHgyZWE1LAorCTB4MjAwMSwgMHhhMzAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsIDB4MmI1NiwgMHgwYzdlLAorCTB4MjA2MSwgMHgwMTAwLCAweDc5MjQsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4YTE5NiwgMHgwMGZmLAorCTB4MDBjMCwgMHgyZWM3LCAweDYwMzAsIDB4YTA4NSwgMHhmZjAwLCAweDAwNzgsIDB4MmVkNiwgMHhhMTgyLAorCTB4MDA3ZiwgMHgwMGM4LCAweDJmMDAsIDB4YTE4OCwgMHgyOTNmLCAweDIxMGMsIDB4YTE4YywgMHgwMGZmLAorCTB4NjAzMCwgMHhhMTE2LCAweDAwNDAsIDB4MmYwMCwgMHg4MTBmLCAweGExMDUsIDB4MTI3ZSwgMHgyMDkxLAorCTB4ODAwMCwgMHgwMDdlLCAweDEwNzgsIDB4NzRkNywgMHgwMDdmLCAweDAwNDAsIDB4MmVmYywgMHg2MDFhLAorCTB4NjAwYiwgMHhiYzA1LCAweDYwMWYsIDB4MDAwMSwgMHgxMDc4LCAweDM1MTgsIDB4MDA0MCwgMHgyZjAzLAorCTB4NjgzNywgMHgwMDAwLCAweDcwMDcsIDB4MDAwMywgMHg2ODMzLCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLAorCTB4NjgzYSwgMHg3MDFiLCAweDJmMDcsIDB4MmQwMCwgMHg2MDEyLCAweDIwMDksIDB4MDAzMiwgMHgxMDc4LAorCTB4NzU2YywgMHgxMjdmLCAweDBjN2YsIDB4MDA3YywgMHgxMjdmLCAweDBjN2YsIDB4MDA3OCwgMHgyYjU2LAorCTB4MGM3ZiwgMHgwMDc4LCAweDJiNWEsIDB4MTA3OCwgMHg3NTNkLCAweDAwNzgsIDB4MmVmYywgMHg2ODMwLAorCTB4YTA4NiwgMHgwMTAwLCAweDAwNDAsIDB4MmI1NiwgMHgwMDc4LCAweDJiMmMsIDB4MjA2MSwgMHhhNjJkLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjAwMCwgMHhkMDg0LCAweDAwNDAsIDB4MmYxYywgMHg2MTA0LAorCTB4NjIwOCwgMHgxMjdmLCAweDAwNzgsIDB4MmIyYywgMHgxMjdmLCAweDAwNzgsIDB4MmI1YSwgMHg4MWZmLAorCTB4MDBjMCwgMHgyYjU2LCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYyNDQsIDB4NjA2MCwgMHhhMjAyLAorCTB4MDA0OCwgMHgyZjMzLCAweGEwODUsIDB4MDAwMSwgMHgxMDc4LCAweDI1MDAsIDB4MTA3OCwgMHgzYmY1LAorCTB4MTI3ZiwgMHgwMDc4LCAweDJiMmMsIDB4MTI3ZiwgMHgwMDc4LCAweDJiNWEsIDB4MTI3ZSwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMGE5LCAweDAwMTEsIDB4MjAwMSwgMHhhMzQwLCAweDIwYTAsIDB4YTAwNiwgMHg0MGE0LAorCTB4MTI3ZiwgMHgwMDc4LCAweDJiMmMsIDB4N2QzOCwgMHg3YzNjLCAweDAwNzgsIDB4MmJkZSwgMHg3ODI0LAorCTB4YTA5YywgMHgwMGZmLCAweGEzOWEsIDB4MDAwMywgMHgwMGM4LCAweDJiNTYsIDB4NjI0YywgMHhhMDg0LAorCTB4ZmYwMCwgMHg4MDA3LCAweGEyMDYsIDB4MDBjMCwgMHgyZjVmLCAweDIwMDEsIDB4YTM0MCwgMHgyMDA5LAorCTB4MDAwYywgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDAwNzgsIDB4MzU2NiwgMHg4MWZmLAorCTB4MDBjMCwgMHgyYjU2LCAweDEwNzgsIDB4MzU0MiwgMHgwMDQwLCAweDJiNWEsIDB4NjAwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHgyYjU2LCAweDBjN2UsIDB4MTA3OCwgMHgzNTE4LAorCTB4MGM3ZiwgMHgwMDQwLCAweDJiNTYsIDB4NjgzNywgMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLAorCTB4MTA3OCwgMHg4Yjg1LCAweDAwNDAsIDB4MmI1NiwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgyZjgxLAorCTB4MDA3YywgMHg2ODMwLCAweGEwODYsIDB4MDEwMCwgMHgwMDQwLCAweDJiNTYsIDB4YWQ4MCwgMHgwMDBlLAorCTB4MjAwOSwgMHgwMDBjLCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MDA3OCwgMHgzNTY2LAorCTB4MTA3OCwgMHgzNTE4LCAweDAwNDAsIDB4MmI1NiwgMHgxMDc4LCAweDQyMWEsIDB4MjAwOSwgMHgwMDFjLAorCTB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgxMDc4LCAweDM1NjIsIDB4NzAxYiwgMHgyZmExLAorCTB4MDA3YywgMHhhZGU4LCAweDAwMGQsIDB4NjgwMCwgMHhhMDA1LCAweDAwNDAsIDB4MmI1YSwgMHg2ODA0LAorCTB4ZDBhYywgMHgwMDQwLCAweDJmYWUsIDB4ZDBhNCwgMHgwMDQwLCAweDJiNWEsIDB4ZDA5NCwgMHgwMDQwLAorCTB4MmZiOSwgMHgwYzdlLCAweDIwNjEsIDB4MDEwMCwgMHg2MTA0LCAweGExOGMsIDB4ZmZkZiwgMHg2MTA2LAorCTB4MGM3ZiwgMHhkMDhjLCAweDAwNDAsIDB4MmZjNCwgMHgwYzdlLCAweDIwNjEsIDB4MDEwMCwgMHg2MTA0LAorCTB4YTE4ZCwgMHgwMDEwLCAweDYxMDYsIDB4MGM3ZiwgMHgyMDA5LCAweDAxMDAsIDB4MjEwYywgMHhhMThhLAorCTB4MDAwMiwgMHgwMDQ4LCAweDJmZDksIDB4ZDA4NCwgMHgwMDQwLCAweDJmZDksIDB4NmEyOCwgMHhhMjhhLAorCTB4MDA3ZiwgMHgwMGM4LCAweDJiNWEsIDB4YTI4OCwgMHgyOTNmLCAweDIxMGMsIDB4YTE4YywgMHgwMGZmLAorCTB4NjE1MiwgMHhkMGRjLCAweDAwNDAsIDB4MmZlMiwgMHg2ODI4LCAweGEwOGEsIDB4MDA3ZiwgMHgwMGM4LAorCTB4MmI1YSwgMHg2MDRlLCAweDY4MDgsIDB4YTA4YSwgMHgwMTAwLCAweDAwNDgsIDB4MmI1YSwgMHhhMDhhLAorCTB4MDg0MSwgMHgwMGM4LCAweDJiNWEsIDB4YTA4NCwgMHgwMDA3LCAweDAwYzAsIDB4MmI1YSwgMHg2ODBjLAorCTB4YTAwNSwgMHgwMDQwLCAweDJiNWEsIDB4NjgxMCwgMHhhMDA1LCAweDAwNDAsIDB4MmI1YSwgMHg2ODQ4LAorCTB4Njk0MCwgMHhhMTBhLCAweDAwYzgsIDB4MmI1YSwgMHg4MDAxLCAweDAwNDAsIDB4MmI1YSwgMHg2ODRjLAorCTB4Njk0NCwgMHhhMTBhLCAweDAwYzgsIDB4MmI1YSwgMHg4MDAxLCAweDAwNDAsIDB4MmI1YSwgMHg2ODA0LAorCTB4ZDBmYywgMHgwMDQwLCAweDMwMzgsIDB4MTA3OCwgMHgzNTE4LCAweDAwNDAsIDB4MmI1NiwgMHgyMDA5LAorCTB4MDAxNCwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweGEyOTAsIDB4MDAzOCwgMHhhMzk5LAorCTB4MDAwMCwgMHgxMDc4LCAweDM1NjIsIDB4NzAxYiwgMHgzMDFlLCAweDAwN2MsIDB4YWRlOCwgMHgwMDBkLAorCTB4MjBhOSwgMHgwMDE0LCAweDJkOTgsIDB4MjA2OSwgMHhhMzZkLCAweDJkYTAsIDB4NTNhMywgMHg3MDEwLAorCTB4YTBlOCwgMHgwMDBkLCAweDIwMDEsIDB4YTM3MSwgMHgyMDBjLCAweGQxZTQsIDB4MDA0MCwgMHgzMDM4LAorCTB4MGM3ZSwgMHgyMDYxLCAweDAxMDAsIDB4NjAwNCwgMHhhMDg1LCAweDBiMDAsIDB4NjAwNiwgMHgwYzdmLAorCTB4MjBhOSwgMHgwMDFjLCAweDJkOTgsIDB4MjA2OSwgMHhhMzUxLCAweDJkYTAsIDB4NTNhMywgMHg2ODE0LAorCTB4YTA4YywgMHgwMGZmLCAweDYxM2UsIDB4ODAwNywgMHhhMDg0LCAweDAwZmYsIDB4NjA0MiwgMHgxMDc4LAorCTB4NGRiZCwgMHgxMDc4LCAweDQ4ZGQsIDB4MTA3OCwgMHg0OTRkLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAwLAorCTB4MDBjMCwgMHgzMGMzLCAweDY4MDgsIDB4NjAyYSwgMHgxMDc4LCAweDIxOGIsIDB4NjgxOCwgMHg2OTFjLAorCTB4NmEyMCwgMHg2YjI0LCAweDgwMDcsIDB4ODEwZiwgMHg4MjE3LCAweDgzMWYsIDB4NjAxNiwgMHg2MTFhLAorCTB4NjIxZSwgMHg2MzIyLCAweDZjMDQsIDB4ZDRmNCwgMHgwMDQwLCAweDMwNzAsIDB4NjgzMCwgMHg2OTM0LAorCTB4NmEzOCwgMHg2YjNjLCAweDgwMDcsIDB4ODEwZiwgMHg4MjE3LCAweDgzMWYsIDB4MDA3OCwgMHgzMDcyLAorCTB4YTA4NCwgMHhmMGZmLCAweDYwMDYsIDB4NjEwYSwgMHg2MjBlLCAweDYzMTIsIDB4MTA3OCwgMHg1OWE4LAorCTB4NjkwNCwgMHhkMWZjLCAweDAwNDAsIDB4MzBhNSwgMHgwYzdlLCAweDIwMDksIDB4MDAwMCwgMHgyMGE5LAorCTB4MDAwMSwgMHg2YjcwLCAweGQzODQsIDB4MDA0MCwgMHgzMGEyLCAweDAwNzgsIDB4MzA4YywgMHg4MzlkLAorCTB4MDBjOCwgMHgzMGEyLCAweDM1MDgsIDB4ODEwOSwgMHgxMDc4LCAweDUzNjQsIDB4Njg3OCwgMHg2MDE2LAorCTB4Njg3NCwgMHgyMDA4LCAweGEwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDYwMGEsIDB4YTE4NCwgMHgwMGZmLAorCTB4NjAwNiwgMHg4MTA4LCAweDAwYzAsIDB4MzBhMCwgMHg2MDAzLCAweDAwMDMsIDB4MDA3OCwgMHgzMGEyLAorCTB4NjAwMywgMHgwMDAxLCAweDAwZjAsIDB4MzA4NywgMHgwYzdmLCAweDBjN2UsIDB4MjA2MSwgMHgwMTAwLAorCTB4NjAyZiwgMHgwMDQwLCAweDYwMmYsIDB4MDAwMCwgMHgwYzdmLCAweDEwNzgsIDB4Mzc4NCwgMHgwMDQwLAorCTB4MzBiMywgMHgxMDc4LCAweDI1MDAsIDB4NjBiYywgMHhhMDA1LCAweDAwNDAsIDB4MzBiZiwgMHg2MDAzLAorCTB4MDAwMSwgMHgyMDkxLCAweDMwMWQsIDB4MTA3OCwgMHg0MTcxLCAweDAwNzgsIDB4MzBjMywgMHg2MDAzLAorCTB4MDAwNCwgMHgyMDkxLCAweDMwMWQsIDB4MDA3OCwgMHgyYjJjLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAwLAorCTB4MDA0MCwgMHgyYjU2LCAweDIwNjksIDB4YTM1MSwgMHg3ODMwLCAweDY4NDIsIDB4NzgzNCwgMHg2ODQ2LAorCTB4NjgwNCwgMHhkMGZjLCAweDAwNDAsIDB4MzBkOCwgMHgyMDA5LCAweDAwMzAsIDB4MDA3OCwgMHgzMGRhLAorCTB4MjAwOSwgMHgwMDFjLCAweDJkMDAsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgwMDc4LAorCTB4MzU2NiwgMHhhMDA2LCAweDEwNzgsIDB4MjUwMCwgMHg4MWZmLCAweDAwYzAsIDB4MmI1NiwgMHgxMDc4LAorCTB4NDIxYSwgMHgxMDc4LCAweDQxNzEsIDB4MDA3OCwgMHgyYjJjLCAweDgxZmYsIDB4MDBjMCwgMHgyYjU2LAorCTB4NjE4MCwgMHg4MWZmLCAweDAwNDAsIDB4MzEwNywgMHg3MDNmLCAweDAwMDAsIDB4MjAwMSwgMHhhOWMwLAorCTB4MjAwOSwgMHgwMDQwLCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MTI3ZSwgMHgyMDkxLAorCTB4ODAwMCwgMHgxMDc4LCAweDM1NjYsIDB4NzAxYiwgMHgyYjI5LCAweDEyN2YsIDB4MDA3YywgMHg3MDNmLAorCTB4MDAwMSwgMHgwZDdlLCAweDIwNjksIDB4YTljMCwgMHgyMGE5LCAweDAwNDAsIDB4MjBhMSwgMHhhOWMwLAorCTB4MjAxOSwgMHhmZmZmLCAweDQzYTQsIDB4NjU0YywgMHhhNTg4LCAweDI5M2YsIDB4MjEwYywgMHhhMThjLAorCTB4MDBmZiwgMHgyMTZhLCAweGEwMGUsIDB4MjAxMSwgMHgwMDAyLCAweDIxMDAsIDB4YTUwNiwgMHgwMDQwLAorCTB4MzEzOSwgMHgxMDc4LCAweDQ1MDEsIDB4MDBjMCwgMHgzMTM5LCAweDYwMTQsIDB4ODIxYywgMHgwMDQ4LAorCTB4MzEzMSwgMHhhMzk4LCAweGE5YzAsIDB4YTA4NSwgMHhmZjAwLCAweDgwMDcsIDB4MjAxYSwgMHgwMDc4LAorCTB4MzEzOCwgMHhhMzk4LCAweGE5YzAsIDB4MjMyNCwgMHhhNGE0LCAweGZmMDAsIDB4YTQwNSwgMHgyMDFhLAorCTB4ODIxMCwgMHg4MTA4LCAweGExODIsIDB4MDA4MCwgMHgwMGM4LCAweDMxNDAsIDB4MDA3OCwgMHgzMTFkLAorCTB4ODIwMSwgMHg4MDA3LCAweDJkMGMsIDB4YTEwNSwgMHgyMDZhLCAweDBkN2YsIDB4MjBhOSwgMHgwMDQwLAorCTB4MjBhMSwgMHhhOWMwLCAweDIwOTksIDB4YTljMCwgMHgxMDc4LCAweDQxYmUsIDB4MDA3OCwgMHgzMGY2LAorCTB4MTA3OCwgMHgzNTQyLCAweDAwNDAsIDB4MmI1YSwgMHgwYzdlLCAweDEwNzgsIDB4MzUxOCwgMHgwYzdmLAorCTB4MDBjMCwgMHgzMTVlLCAweDIwMDksIDB4MDAwMiwgMHgwMDc4LCAweDJiNTYsIDB4MjAwMSwgMHhhMzUyLAorCTB4MjAwNCwgMHhkMGI0LCAweDAwNDAsIDB4MzE4NSwgMHg2MDAwLCAweGQwOGMsIDB4MDBjMCwgMHgzMTg1LAorCTB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4MzE4NSwgMHg2ODM3LAorCTB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHgxMDc4LCAweDhiZDksIDB4MDBjMCwgMHgzMTdjLAorCTB4MjAwOSwgMHgwMDAzLCAweDAwNzgsIDB4MmI1NiwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgzMTgxLAorCTB4MDA3YywgMHgxMDc4LCAweDM1NDIsIDB4MDA0MCwgMHgyYjVhLCAweDIwYTksIDB4MDAyYiwgMHgyYzk4LAorCTB4YWRlOCwgMHgwMDAyLCAweDJkYTAsIDB4NTNhMywgMHgyMGE5LCAweDAwMDQsIDB4YWM4MCwgMHgwMDA2LAorCTB4MjA5OCwgMHhhZDgwLCAweDAwMDYsIDB4MjBhMCwgMHgxMDc4LCAweDQxYmUsIDB4MjBhOSwgMHgwMDA0LAorCTB4YWM4MCwgMHgwMDBhLCAweDIwOTgsIDB4YWQ4MCwgMHgwMDBhLCAweDIwYTAsIDB4MTA3OCwgMHg0MWJlLAorCTB4MmQwMCwgMHgyMDA5LCAweDAwMmIsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgwMDc4LAorCTB4MzU2NiwgMHg4MWZmLCAweDAwYzAsIDB4MmI1NiwgMHgxMDc4LCAweDM1MzAsIDB4MDA0MCwgMHgyYjVhLAorCTB4MTA3OCwgMHg0NmVmLCAweDAwNzgsIDB4MmIyYywgMHg4MWZmLCAweDAwYzAsIDB4MmI1NiwgMHg3ODI4LAorCTB4YTA4YSwgMHgxMDAwLCAweDAwYzgsIDB4MmI1YSwgMHgxMDc4LCAweDM1NDIsIDB4MDA0MCwgMHgyYjVhLAorCTB4MTA3OCwgMHg0NzVmLCAweDAwNDAsIDB4MmI1NiwgMHgyMDE5LCAweDAwMDQsIDB4MTA3OCwgMHg0NzA1LAorCTB4NzkyNCwgMHg4MTBmLCAweDdhMjgsIDB4MTA3OCwgMHgzMWNmLCAweDAwNzgsIDB4MmIyYywgMHhhMTg2LAorCTB4MDBmZiwgMHgwMDQwLCAweDMxZDcsIDB4MTA3OCwgMHgzMWU3LCAweDAwNzgsIDB4MzFlNiwgMHgyMDI5LAorCTB4MDA3ZSwgMHgyMDYxLCAweGEzMDAsIDB4NjQ0YywgMHgyNDAwLCAweGE1MDYsIDB4MDA0MCwgMHgzMWUzLAorCTB4MjUwOCwgMHgxMDc4LCAweDMxZTcsIDB4ODUyOSwgMHgwMGM4LCAweDMxZGMsIDB4MDA3YywgMHgxMDc4LAorCTB4NDUwMSwgMHgwMGMwLCAweDMxZjIsIDB4MjIwMCwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHhhMTA4LAorCTB4MTA3OCwgMHg1OGUxLCAweDAwN2MsIDB4ODFmZiwgMHgwMGMwLCAweDJiNTYsIDB4MTA3OCwgMHgzNTMwLAorCTB4MDA0MCwgMHgyYjVhLCAweDEwNzgsIDB4NDVhNywgMHgwMDQwLCAweDJiNTYsIDB4MTA3OCwgMHg0NmZhLAorCTB4MDA3OCwgMHgyYjJjLCAweDgxZmYsIDB4MDBjMCwgMHgyYjU2LCAweDEwNzgsIDB4MzUzMCwgMHgwMDQwLAorCTB4MmI1YSwgMHgxMDc4LCAweDQ1YTcsIDB4MDA0MCwgMHgyYjU2LCAweDEwNzgsIDB4NDZlNCwgMHgwMDc4LAorCTB4MmIyYywgMHg2MTAwLCAweDAwNzgsIDB4MmIyYywgMHgxMDc4LCAweDM1NDIsIDB4MDA0MCwgMHgyYjVhLAorCTB4MjAwMSwgMHhhMzAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsIDB4MmI1NiwgMHgwZDdlLAorCTB4YWNlOCwgMHgwMDBhLCAweDc5MjQsIDB4ZDE4NCwgMHgwMDQwLCAweDMyMjgsIDB4YWNlOCwgMHgwMDA2LAorCTB4NjgwYywgMHg4MDA3LCAweDc4M2UsIDB4NjgwOCwgMHg4MDA3LCAweDc4M2EsIDB4NmIwNCwgMHg4MzFmLAorCTB4NmEwMCwgMHg4MjE3LCAweDBkN2YsIDB4NjEwMCwgMHhhMThjLCAweDAyMDAsIDB4MDA3OCwgMHgyYjJjLAorCTB4YTAwNiwgMHgxMDc4LCAweDI1MDAsIDB4NzgyNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMGZmLAorCTB4MDA0MCwgMHgzMjQ1LCAweDgxZmYsIDB4MDBjMCwgMHgyYjU2LCAweDEwNzgsIDB4NDIxYSwgMHg3ODI4LAorCTB4YTA4YSwgMHgxMDAwLCAweDAwYzgsIDB4MmI1YSwgMHg3OTI0LCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLAorCTB4YTE4NiwgMHgwMGZmLCAweDAwNDAsIDB4MzI1YiwgMHhhMTgyLCAweDAwN2YsIDB4MDBjOCwgMHgyYjVhLAorCTB4MjEwMCwgMHgxMDc4LCAweDI0ZmEsIDB4MDI3ZSwgMHgwYzdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA2MSwgMHhhNWJlLCAweDYwMWIsIDB4MDAwMCwgMHg2MDFmLCAweDAwMDAsIDB4MjA2MSwgMHgwMTAwLAorCTB4NjAzMCwgMHhhMDg0LCAweDAwZmYsIDB4ODEwZiwgMHhhMTA1LCAweDYwNGEsIDB4NjA0MywgMHgwMDkwLAorCTB4NjA0MywgMHgwMDEwLCAweDIwMDksIDB4MDAyZCwgMHgyMDExLCAweDQxOTYsIDB4MTA3OCwgMHg1OTZjLAorCTB4NzkyNCwgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHg3YTI4LCAweDEwNzgsIDB4MzFjZiwgMHgxMjdmLAorCTB4MGM3ZiwgMHgwMjdmLCAweDAwNzgsIDB4MmIyYywgMHg3OTI0LCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLAorCTB4MGM3ZSwgMHgxMDc4LCAweDQ0OTksIDB4MmMwOCwgMHgwYzdmLCAweDAwYzAsIDB4MmI1YSwgMHgwMDc4LAorCTB4MmIyYywgMHg4MWZmLCAweDAwNDAsIDB4MzI5OCwgMHgyMDA5LCAweDAwMDEsIDB4MDA3OCwgMHgyYjU2LAorCTB4NjBjOCwgMHhkMDljLCAweDAwYzAsIDB4MzJhMCwgMHgyMDA5LCAweDAwMDUsIDB4MDA3OCwgMHgyYjU2LAorCTB4MTA3OCwgMHgzNTE4LCAweDAwYzAsIDB4MzJhOCwgMHgyMDA5LCAweDAwMDIsIDB4MDA3OCwgMHgyYjU2LAorCTB4NzkyNCwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDEwNzgsIDB4MzU2MiwgMHg3MDFiLAorCTB4MzJiMiwgMHgwMDdjLCAweDIwMDksIDB4MDA4MCwgMHgxMDc4LCAweDQ1MDEsIDB4MDBjMCwgMHgzMmJmLAorCTB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDAwNDAsIDB4MzJjMywgMHgyMDIxLAorCTB4NDAwYSwgMHgwMDc4LCAweDJiMmUsIDB4MGQ3ZSwgMHhhZGU4LCAweDAwMGQsIDB4NjkwMCwgMHg2YTA4LAorCTB4NmIwYywgMHg2YzEwLCAweDZkMTQsIDB4NmUxOCwgMHg2ODIwLCAweGEwYmUsIDB4MDEwMCwgMHgwMDQwLAorCTB4MzMzNiwgMHhhMGJlLCAweDAxMTIsIDB4MDA0MCwgMHgzMzM2LCAweGEwYmUsIDB4MDExMywgMHgwMDQwLAorCTB4MzMzNiwgMHhhMGJlLCAweDAxMTQsIDB4MDA0MCwgMHgzMzM2LCAweGEwYmUsIDB4MDExNywgMHgwMDQwLAorCTB4MzMzNiwgMHhhMGJlLCAweDAxMWEsIDB4MDA0MCwgMHgzMzM2LCAweGEwYmUsIDB4MDEyMSwgMHgwMDQwLAorCTB4MzMyYywgMHhhMGJlLCAweDAxMzEsIDB4MDA0MCwgMHgzMzJjLCAweGEwYmUsIDB4MDE3MSwgMHgwMDQwLAorCTB4MzMzNiwgMHhhMGJlLCAweDAxNzMsIDB4MDA0MCwgMHgzMzM2LCAweGEwYmUsIDB4MDFhMSwgMHgwMGMwLAorCTB4MzJmZSwgMHg2ODMwLCAweDgwMDcsIDB4NjgzMiwgMHgwMDc4LCAweDMzM2MsIDB4YTBiZSwgMHgwMjEyLAorCTB4MDA0MCwgMHgzMzMyLCAweGEwYmUsIDB4MDIxMywgMHgwMDQwLCAweDMzMzIsIDB4YTBiZSwgMHgwMjE0LAorCTB4MDA0MCwgMHgzMzI0LCAweGEwYmUsIDB4MDIxNywgMHgwMDQwLCAweDMzMWUsIDB4YTBiZSwgMHgwMjFhLAorCTB4MDBjMCwgMHgzMzE3LCAweDY4MzgsIDB4ODAwNywgMHg2ODNhLCAweDAwNzgsIDB4MzMzNiwgMHhhMGJlLAorCTB4MDMwMCwgMHgwMDQwLCAweDMzMzYsIDB4MGQ3ZiwgMHgwMDc4LCAweDJiNWEsIDB4YWQ4MCwgMHgwMDEwLAorCTB4MjBhOSwgMHgwMDA3LCAweDEwNzgsIDB4MzM3ZSwgMHhhZDgwLCAweDAwMGUsIDB4MjBhOSwgMHgwMDAxLAorCTB4MTA3OCwgMHgzMzdlLCAweDAwNzgsIDB4MzMzNiwgMHhhZDgwLCAweDAwMGMsIDB4MTA3OCwgMHgzMzhjLAorCTB4MDA3OCwgMHgzMzNjLCAweGFkODAsIDB4MDAwZSwgMHgxMDc4LCAweDMzOGMsIDB4YWQ4MCwgMHgwMDBjLAorCTB4MjBhOSwgMHgwMDAxLCAweDEwNzgsIDB4MzM3ZSwgMHgwYzdlLCAweDEwNzgsIDB4MzUxOCwgMHgwMDQwLAorCTB4MzM2ZiwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHg2ODM3LCAweDAxMTksIDB4Njg1MywgMHgwMDAwLAorCTB4Njg0ZiwgMHgwMDIwLCAweDY4NWIsIDB4MDAwMSwgMHg4MTBiLCAweDY5N2UsIDB4Njg4MywgMHgwMDAwLAorCTB4NmE4NiwgMHg2YjhhLCAweDZjOGUsIDB4NmQ5MiwgMHg2OTk2LCAweDY4OWIsIDB4MDAwMCwgMHgwYzdmLAorCTB4MGQ3ZiwgMHg2ODM3LCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLCAweDY4M2EsIDB4NjgyMywgMHgwMDAwLAorCTB4NjgwNCwgMHgyMDY4LCAweDEwNzgsIDB4OGJhMSwgMHgwMGMwLCAweDMzNmEsIDB4MjAwOSwgMHgwMDAzLAorCTB4MDA3OCwgMHgyYjU2LCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDMzNzUsIDB4MDA3YywgMHgwYzdmLAorCTB4MGQ3ZiwgMHgyMDA5LCAweDAwMDIsIDB4MDA3OCwgMHgyYjU2LCAweDY4MjAsIDB4YTA4NiwgMHg4MDAxLAorCTB4MDBjMCwgMHgyYjJjLCAweDIwMDksIDB4MDAwNCwgMHgwMDc4LCAweDJiNTYsIDB4MDE3ZSwgMHgyMDA4LAorCTB4MjA0NCwgMHg4MDAwLCAweDIwNGMsIDB4ODAwMCwgMHgyOTBhLCAweDgxMDgsIDB4MjgwYSwgMHg4MTA4LAorCTB4MDBmMCwgMHgzMzgwLCAweDAxN2YsIDB4MDA3YywgMHgwMTdlLCAweDBhN2UsIDB4MGI3ZSwgMHgyMDA4LAorCTB4MjA0NCwgMHg4MDAwLCAweDIwNGMsIDB4ODAwMCwgMHgyMDU0LCAweDgwMDAsIDB4MjA1YywgMHgyYjBhLAorCTB4ODEwOCwgMHgyYTBhLCAweDgxMDgsIDB4MjkwYSwgMHg4MTA4LCAweDI4MGEsIDB4MGI3ZiwgMHgwYTdmLAorCTB4MDE3ZiwgMHgwMDdjLCAweDgxZmYsIDB4MDA0MCwgMHgzM2E5LCAweDIwMDksIDB4MDAwMSwgMHgwMDc4LAorCTB4MmI1NiwgMHg3OTI0LCAweDIxNDAsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE4MiwgMHgwMDgwLAorCTB4MDA0OCwgMHgyYjVhLCAweGExODIsIDB4MDBmZiwgMHgwMGM4LCAweDJiNWEsIDB4N2EyYywgMHg3YjI4LAorCTB4NjA2OCwgMHhhMzA2LCAweDAwYzAsIDB4MzNjNCwgMHg2MDZjLCAweGEyNGUsIDB4MDA0MCwgMHgyYjVhLAorCTB4YTljYywgMHhmZjAwLCAweDAwNDAsIDB4MmI1YSwgMHgwYzdlLCAweDEwNzgsIDB4MzQ2ZCwgMHgyYzY4LAorCTB4MGM3ZiwgMHgwMDQwLCAweDMzZmMsIDB4YTBjNiwgMHg0MDAwLCAweDAwYzAsIDB4MzNlMiwgMHgwYzdlLAorCTB4MDA3ZSwgMHgyZDYwLCAweDIwMDksIDB4MDAwMCwgMHgxMDc4LCAweDQ3Y2IsIDB4MDBjMCwgMHgzM2Q5LAorCTB4YzE4NSwgMHg2MDAwLCAweGQwYmMsIDB4MDA0MCwgMHgzM2RlLCAweGMxOGQsIDB4MDA3ZiwgMHgwYzdmLAorCTB4MDA3OCwgMHgzM2Y5LCAweGEwYzYsIDB4NDAwNywgMHgwMGMwLCAweDMzZTksIDB4MjQwOCwgMHgwMDc4LAorCTB4MzNmOSwgMHhhMGM2LCAweDQwMDgsIDB4MDBjMCwgMHgzM2YxLCAweDI3MDgsIDB4MjYxMCwgMHgwMDc4LAorCTB4MzNmOSwgMHhhMGM2LCAweDQwMDksIDB4MDBjMCwgMHgzM2Y3LCAweDAwNzgsIDB4MzNmOSwgMHgyMDAxLAorCTB4NDAwNiwgMHgyMDIwLCAweDAwNzgsIDB4MmIyZSwgMHgyZDAwLCAweDcwMjIsIDB4MDE3ZSwgMHgwYjdlLAorCTB4MGM3ZSwgMHgwZTdlLCAweDJjNzAsIDB4MTA3OCwgMHg3NGQ3LCAweDAwNDAsIDB4MzQ0MiwgMHgyZDAwLAorCTB4NjAxYSwgMHgyMDAxLCAweGEzNTYsIDB4MjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4Njg0MiwgMHgyZTU4LAorCTB4MGU3ZiwgMHgwZTdlLCAweDBjN2UsIDB4MTA3OCwgMHgzNTE4LCAweDBjN2YsIDB4MmI3MCwgMHgwMGMwLAorCTB4MzQyMywgMHgxMDc4LCAweDc1M2QsIDB4MGU3ZiwgMHgwYzdmLCAweDBiN2YsIDB4MDE3ZiwgMHgyMDA5LAorCTB4MDAwMiwgMHgwMDc4LCAweDJiNTYsIDB4NjgzNywgMHgwMDAwLCAweDJkMDAsIDB4NjAxMiwgMHg2ODMzLAorCTB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LAorCTB4MjgxMywgMHgxMjdmLCAweDYwMWYsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDAsIDB4MTA3OCwgMHg0NDJiLAorCTB4MjAwMSwgMHgwMDAyLCAweDEwNzgsIDB4NDQzZiwgMHgyMDA5LCAweDAwMDIsIDB4MTA3OCwgMHg3NTZjLAorCTB4YTA4NSwgMHgwMDAxLCAweDBlN2YsIDB4MGM3ZiwgMHgwYjdmLCAweDAxN2YsIDB4MDBjMCwgMHgzNDRjLAorCTB4MjAwOSwgMHgwMDAzLCAweDAwNzgsIDB4MmI1NiwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgzNDUxLAorCTB4MDA3YywgMHg2ODMwLCAweGEwODYsIDB4MDEwMCwgMHg3MDIwLCAweDIwNjAsIDB4MDBjMCwgMHgzNDVmLAorCTB4MjAwOSwgMHgwMDA0LCAweDYyMDQsIDB4YTI5NCwgMHgwMGZmLCAweDAwNzgsIDB4MmI1NiwgMHgyMDA5LAorCTB4MDAwMCwgMHgxMDc4LCAweDQ3Y2IsIDB4MDBjMCwgMHgzNDY2LCAweGMxODUsIDB4NjAwMCwgMHhkMGJjLAorCTB4MDA0MCwgMHgzNDZiLCAweGMxOGQsIDB4MDA3OCwgMHgyYjJjLCAweDBlN2UsIDB4MGQ3ZSwgMHgyMDI5LAorCTB4MDAwMCwgMHgyMDIxLCAweDAwODAsIDB4MjBhOSwgMHgwMDdmLCAweDIwNzEsIDB4YTRiNCwgMHgyZTA0LAorCTB4YTAwNSwgMHgwMGMwLCAweDM0ODIsIDB4MjEwMCwgMHhhNDA2LCAweDAwYzAsIDB4MzRiMywgMHgyNDI4LAorCTB4MDA3OCwgMHgzNGIzLCAweDIwNjgsIDB4NmYxMCwgMHgyNzAwLCAweGEzMDYsIDB4MDBjMCwgMHgzNGE0LAorCTB4NmUxNCwgMHgyNjAwLCAweGEyMDYsIDB4MDBjMCwgMHgzNGE0LCAweDI0MDAsIDB4YTEwNiwgMHgwMGMwLAorCTB4MzRhMCwgMHgyZDYwLCAweGQ4ODQsIDB4MDA0MCwgMHgzNGM4LCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4MzRjOCwgMHgyMDAxLCAweDQwMDAsIDB4MDA3OCwgMHgzNGM5LAorCTB4MjAwMSwgMHg0MDA3LCAweDAwNzgsIDB4MzRjOSwgMHgyNDAwLCAweGExMDYsIDB4MDBjMCwgMHgzNGIzLAorCTB4NmUxNCwgMHg4N2ZmLCAweDAwYzAsIDB4MzRhZiwgMHg4NmZmLCAweDAwNDAsIDB4MzQ3ZiwgMHgyMDAxLAorCTB4NDAwOCwgMHgwMDc4LCAweDM0YzksIDB4ODQyMCwgMHg4ZTcwLCAweDAwZjAsIDB4MzQ3NywgMHg4NWZmLAorCTB4MDBjMCwgMHgzNGMyLCAweDIwMDEsIDB4NDAwOSwgMHgwMDc4LCAweDM0YzksIDB4MjAwMSwgMHgwMDAxLAorCTB4MDA3OCwgMHgzNGM5LCAweDEwNzgsIDB4NDQ5OSwgMHgwMGMwLCAweDM0YmUsIDB4NjMxMiwgMHg2MjE2LAorCTB4YTAwNiwgMHhhMDA1LCAweDBkN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDgxZmYsIDB4MDBjMCwgMHgyYjU2LAorCTB4MTA3OCwgMHgzNTE4LCAweDAwNDAsIDB4MmI1NiwgMHg2ODM3LCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLAorCTB4NjgzYSwgMHg3ODI0LCAweGEwMDUsIDB4MDA0MCwgMHgyYjVhLCAweGEwOTYsIDB4MDBmZiwgMHgwMDQwLAorCTB4MzRlNSwgMHhhMDkyLCAweDAwMDQsIDB4MDBjOCwgMHgyYjVhLCAweDIwMTAsIDB4MmQxOCwgMHgxMDc4LAorCTB4MjdjMiwgMHgwMDQwLCAweDJiNTYsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsIDB4MzRmMCwgMHgwMDdjLAorCTB4NjgzMCwgMHhhMDg2LCAweDAxMDAsIDB4MDA0MCwgMHgyYjU2LCAweDAwNzgsIDB4MmIyYywgMHg3OTI0LAorCTB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE4MiwgMHgwMDgwLCAweDAwNDgsIDB4MmI1YSwgMHhhMTgyLAorCTB4MDBmZiwgMHgwMGM4LCAweDJiNWEsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg4YTg5LAorCTB4MDBjMCwgMHgzNTE1LCAweGExOTAsIDB4YTQzNCwgMHgyMjA0LCAweGEwNjUsIDB4MDA0MCwgMHgzNTE1LAorCTB4MTA3OCwgMHg0MjM1LCAweDEyN2YsIDB4MDA3OCwgMHgyYjJjLCAweDEyN2YsIDB4MDA3OCwgMHgyYjU2LAorCTB4MTA3OCwgMHgxMzgxLCAweDAwNDAsIDB4MzUyZiwgMHhhMDA2LCAweDY4MDIsIDB4NzAxMCwgMHhhMDA1LAorCTB4MDBjMCwgMHgzNTI3LCAweDJkMDAsIDB4NzAxMiwgMHg3MDE2LCAweDAwNzgsIDB4MzUyZCwgMHg3MDE0LAorCTB4NjgwMiwgMHgyMDYwLCAweDJkMDAsIDB4NjAwNiwgMHg3MDE2LCAweGFkODAsIDB4MDAwZCwgMHgwMDdjLAorCTB4NzkyNCwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHgxMDc4LCAweDQ1MDEsIDB4MDBjMCwgMHgzNTNmLAorCTB4N2UyOCwgMHhhNjg0LCAweDNmZmYsIDB4YTA4MiwgMHg0MDAwLCAweDAwNDgsIDB4MzU0MCwgMHhhMDY2LAorCTB4OGNmZiwgMHgwMDdjLCAweDdlMjQsIDB4ODYwZiwgMHhhMThjLCAweDAwZmYsIDB4MTA3OCwgMHg0NTAxLAorCTB4MDBjMCwgMHgzNTUwLCAweGE2YjQsIDB4MDBmZiwgMHhhNjgyLCAweDQwMDAsIDB4MDA0OCwgMHgzNTUxLAorCTB4YTA2NiwgMHg4Y2ZmLCAweDAwN2MsIDB4MDE3ZSwgMHg3MTEwLCAweDgxZmYsIDB4MDA0MCwgMHgzNTVlLAorCTB4MjE2OCwgMHg2OTA0LCAweDEwNzgsIDB4MTM5YSwgMHgwMDc4LCAweDM1NTUsIDB4NzExMiwgMHg3MTE2LAorCTB4MDE3ZiwgMHgwMDdjLCAweDIwMzEsIDB4MDAwMSwgMHgwMDc4LCAweDM1NjgsIDB4MjAzMSwgMHgwMDAwLAorCTB4MjA2MSwgMHhhM2QxLCAweDY2MDYsIDB4NjExMiwgMHg2MDBlLCAweDYyMjYsIDB4NjMyYSwgMHg2NDJlLAorCTB4NjUzMiwgMHgyYzEwLCAweDEwNzgsIDB4MTNkMSwgMHg3MDA3LCAweDAwMDIsIDB4NzAxYiwgMHgyYjJjLAorCTB4MDA3YywgMHgwZjdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzksIDB4MDAwMCwgMHgyMDAxLAorCTB4YTM4ZiwgMHgyMDA0LCAweGEwMDUsIDB4MDBjMCwgMHgzNTk0LCAweDAwNjgsIDB4MzU5NCwgMHg3ODE4LAorCTB4ZDA4NCwgMHgwMGMwLCAweDM1OTQsIDB4N2EyMiwgMHg3YjI2LCAweDdjMmEsIDB4NzgxYiwgMHgwMDAxLAorCTB4MjA5MSwgMHg0MDgwLCAweDAwNzgsIDB4MzViOSwgMHgwMTdlLCAweDBjN2UsIDB4MGU3ZSwgMHgyMDcxLAorCTB4YTM4MSwgMHg3MTM4LCAweGExODIsIDB4MDAwOCwgMHgwMDQ4LCAweDM1YTIsIDB4NzAzMCwgMHgyMDYwLAorCTB4MDA3OCwgMHgzNWIzLCAweDcwMzAsIDB4YTBlMCwgMHgwMDA4LCAweGFjODIsIDB4YTNkMSwgMHgwMDQ4LAorCTB4MzVhYiwgMHgyMDYxLCAweGEzOTEsIDB4MmMwMCwgMHg3MDMyLCAweDgxZmYsIDB4MDBjMCwgMHgzNWIxLAorCTB4NzAzNiwgMHg4MTA4LCAweDcxM2EsIDB4MjI2MiwgMHg2MzA2LCAweDY0MGEsIDB4MGU3ZiwgMHgwYzdmLAorCTB4MDE3ZiwgMHgxMjdmLCAweDBmN2YsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YTM4MSwgMHg3MDM4LAorCTB4YTAwNSwgMHgwMDQwLCAweDM1ZjUsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MDA2OCwgMHgzNWY0LAorCTB4MGY3ZSwgMHgyMDc5LCAweDAwMDAsIDB4NzgxOCwgMHhkMDg0LCAweDAwYzAsIDB4MzVmMywgMHgwYzdlLAorCTB4NzAzNCwgMHgyMDYwLCAweDJjMDQsIDB4NzgyMiwgMHg2MDA0LCAweDc4MjYsIDB4NjAwOCwgMHg3ODJhLAorCTB4NzgxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHg3MDM4LCAweDgwMDEsIDB4NzAzYSwgMHhhMDA1LAorCTB4MDBjMCwgMHgzNWU5LCAweDcwMzMsIDB4YTM5MSwgMHg3MDM3LCAweGEzOTEsIDB4MGM3ZiwgMHgwMDc4LAorCTB4MzVmMywgMHhhYzgwLCAweDAwMDgsIDB4YTBmYSwgMHhhM2QxLCAweDAwNDgsIDB4MzVmMSwgMHgyMDAxLAorCTB4YTM5MSwgMHg3MDM2LCAweDBjN2YsIDB4MGY3ZiwgMHgxMjdmLCAweDBlN2YsIDB4MDA3YywgMHgwMjdlLAorCTB4MjAwMSwgMHhhMzUyLCAweDIwMDQsIDB4ZDBjNCwgMHgwMDQwLCAweDM2MDIsIDB4MjAxMSwgMHg4MDE0LAorCTB4MTA3OCwgMHgzNTc5LCAweDAyN2YsIDB4MDA3YywgMHg4MWZmLCAweDAwYzAsIDB4MmI1NiwgMHgxMjdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDYwMzAsIDB4YzA4ZCwgMHhjMDg1LCAweGMwYWMsIDB4NjAzMiwgMHgxMDc4LAorCTB4NDE3MSwgMHgxMjdmLCAweDAwNzgsIDB4MmIyYywgMHg3ODI0LCAweDIwMDgsIDB4YTE4YywgMHhmZmZkLAorCTB4MDBjMCwgMHgzNjFmLCAweDYxZDQsIDB4YTEwZCwgMHg2MWQ2LCAweDAwNzgsIDB4MmIyYywgMHgwMDc4LAorCTB4MmI1YSwgMHg4MWZmLCAweDAwYzAsIDB4MmI1NiwgMHg2MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMGMwLAorCTB4MmI1NiwgMHgyMDAxLCAweGEzNTIsIDB4MjAwNCwgMHhkMGFjLCAweDAwYzAsIDB4MmI1NiwgMHgxMDc4LAorCTB4MzU0MiwgMHgwMDQwLCAweDJiNWEsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LAorCTB4MDBjMCwgMHgzNjNlLCAweDc4MjgsIDB4YTAwNSwgMHgwMDQwLCAweDJiMmMsIDB4MGM3ZSwgMHgxMDc4LAorCTB4MzUxOCwgMHgwYzdmLCAweDAwNDAsIDB4MmI1NiwgMHg2ODM3LCAweDAwMDAsIDB4NjgzMywgMHgwMDAwLAorCTB4NjgzOCwgMHhjMGZkLCAweDY4M2EsIDB4MTA3OCwgMHg4YzRkLCAweDAwNDAsIDB4MmI1NiwgMHg3MDA3LAorCTB4MDAwMywgMHg3MDFiLCAweDM2NTQsIDB4MDA3YywgMHg2ODMwLCAweGEwODYsIDB4MDEwMCwgMHgwMDQwLAorCTB4MmI1NiwgMHgwMDc4LCAweDJiMmMsIDB4MjAwMSwgMHhhMzAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLAorCTB4MDBjMCwgMHgyYjU2LCAweDdmMjQsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgxMDc4LAorCTB4MzUxOCwgMHgwMDQwLCAweDJiNTYsIDB4MjAwOSwgMHgwMDAwLCAweDIwMzEsIDB4MDAwMCwgMHg3MDIzLAorCTB4MDAwMCwgMHg3MDJmLCAweDAwMDAsIDB4YWQ4MCwgMHgwMDA1LCAweDcwMjYsIDB4MjBhMCwgMHgxMDc4LAorCTB4NDUwMSwgMHgwMGMwLCAweDM2ZDgsIDB4NjAwNCwgMHhhMGM0LCAweDAwZmYsIDB4YThjNiwgMHgwMDA2LAorCTB4MDA0MCwgMHgzNjg4LCAweGEwYzQsIDB4ZmYwMCwgMHhhOGM2LCAweDA2MDAsIDB4MDBjMCwgMHgzNmQ4LAorCTB4MjAwMSwgMHhhMzUyLCAweDIwMDQsIDB4ZDBhYywgMHgwMGMwLCAweDM2OTUsIDB4MTA3OCwgMHg0N2NiLAorCTB4MDBjMCwgMHgzNjk1LCAweGQ3OWMsIDB4MDA0MCwgMHgzNmQ4LCAweGQ3OTQsIDB4MDBjMCwgMHgzNjliLAorCTB4ZDc4NCwgMHgwMDQwLCAweDM2YTcsIDB4YWM4MCwgMHgwMDA2LCAweDIwOTgsIDB4MzQwMCwgMHgyMGE5LAorCTB4MDAwNCwgMHg1M2EzLCAweDEwNzgsIDB4MzM4YywgMHhkNzk0LCAweDAwNDAsIDB4MzZiMCwgMHhhYzgwLAorCTB4MDAwYSwgMHgyMDk4LCAweDM0MDAsIDB4MjBhOSwgMHgwMDA0LCAweDUzYTMsIDB4MTA3OCwgMHgzMzhjLAorCTB4MjFhMiwgMHhkNzk0LCAweDAwNDAsIDB4MzZkMCwgMHhhYzgwLCAweDAwMDAsIDB4MjA5OCwgMHg5NGEwLAorCTB4MjBhOSwgMHgwMDAyLCAweDUzYTMsIDB4YWM4MCwgMHgwMDAzLCAweDIwYTYsIDB4OTRhMCwgMHhhYzgwLAorCTB4MDAwNCwgMHgyMDk4LCAweDM0MDAsIDB4MjBhOSwgMHgwMDAyLCAweDUzYTMsIDB4MTA3OCwgMHgzMzdlLAorCTB4YWM4MCwgMHgwMDI2LCAweDIwOTgsIDB4MjBhOSwgMHgwMDAyLCAweDUzYTMsIDB4MDA3OCwgMHgzNmQxLAorCTB4OTRhMCwgMHhkNzk0LCAweDAwNDAsIDB4MzZkNiwgMHhhNmIwLCAweDAwMGIsIDB4YTZiMCwgMHgwMDA1LAorCTB4ODEwOCwgMHhkNzhjLCAweDAwNDAsIDB4MzZlMiwgMHhhMTg2LCAweDAxMDAsIDB4MDA0MCwgMHgzNmYzLAorCTB4MDA3OCwgMHgzNmU2LCAweGExODYsIDB4MDA3ZSwgMHgwMDQwLCAweDM2ZjMsIDB4ZDc5NCwgMHgwMDQwLAorCTB4MzZlZCwgMHhhNjg2LCAweDAwMjAsIDB4MDA3OCwgMHgzNmVmLCAweGE2ODYsIDB4MDAyOCwgMHgwMDQwLAorCTB4MzZmYywgMHgwMDc4LCAweDM2NzcsIDB4ODZmZiwgMHgwMGMwLCAweDM2ZmEsIDB4NzEyMCwgMHg4MTBiLAorCTB4MDA3OCwgMHgyYjJjLCAweDcwMmYsIDB4MDAwMSwgMHg3MTFlLCAweDcwMjAsIDB4YTYwMCwgMHg3MDIyLAorCTB4NzcyYSwgMHgyMDYxLCAweGEzZDEsIDB4NjAwNywgMHgwMDAwLCAweDY2MTIsIDB4NzAyNCwgMHg2MDBlLAorCTB4NjIyNiwgMHg2MzJhLCAweDY0MmUsIDB4NjUzMiwgMHgyYzEwLCAweDEwNzgsIDB4MTNkMSwgMHg3MDA3LAorCTB4MDAwMiwgMHg3MDFiLCAweDM3MTQsIDB4MDA3YywgMHg3MDJjLCAweGEwMDUsIDB4MDBjMCwgMHgzNzI2LAorCTB4NzExYywgMHg3MDI0LCAweDIwYTAsIDB4NzcyOCwgMHgyMDMxLCAweDAwMDAsIDB4MjA2MSwgMHhhM2QxLAorCTB4NjIyNCwgMHg2MzI4LCAweDY0MmMsIDB4NjUzMCwgMHgwMDc4LCAweDM2NzcsIDB4NzEyMCwgMHg4MTBiLAorCTB4MDA3OCwgMHgyYjJjLCAweDIwMjksIDB4MDA3ZSwgMHg3OTI0LCAweDdhMjgsIDB4N2IyYywgMHg3YzM4LAorCTB4YTE4NCwgMHhmZjAwLCAweDgwMDcsIDB4YTBlMiwgMHgwMDIwLCAweDAwNDgsIDB4MmI1YSwgMHhhNTAyLAorCTB4MDA0OCwgMHgyYjVhLCAweGExODQsIDB4MDBmZiwgMHhhMGUyLCAweDAwMjAsIDB4MDA0OCwgMHgyYjVhLAorCTB4YTUwMiwgMHgwMDQ4LCAweDJiNWEsIDB4YTI4NCwgMHhmZjAwLCAweDgwMDcsIDB4YTBlMiwgMHgwMDIwLAorCTB4MDA0OCwgMHgyYjVhLCAweGE1MDIsIDB4MDA0OCwgMHgyYjVhLCAweGEyODQsIDB4MDBmZiwgMHhhMGUyLAorCTB4MDAyMCwgMHgwMDQ4LCAweDJiNWEsIDB4YTUwMiwgMHgwMDQ4LCAweDJiNWEsIDB4YTM4NCwgMHhmZjAwLAorCTB4ODAwNywgMHhhMGUyLCAweDAwMjAsIDB4MDA0OCwgMHgyYjVhLCAweGE1MDIsIDB4MDA0OCwgMHgyYjVhLAorCTB4YTM4NCwgMHgwMGZmLCAweGEwZTIsIDB4MDAyMCwgMHgwMDQ4LCAweDJiNWEsIDB4YTUwMiwgMHgwMDQ4LAorCTB4MmI1YSwgMHhhNDg0LCAweGZmMDAsIDB4ODAwNywgMHhhMGUyLCAweDAwMjAsIDB4MDA0OCwgMHgyYjVhLAorCTB4YTUwMiwgMHgwMDQ4LCAweDJiNWEsIDB4YTQ4NCwgMHgwMGZmLCAweGEwZTIsIDB4MDAyMCwgMHgwMDQ4LAorCTB4MmI1YSwgMHhhNTAyLCAweDAwNDgsIDB4MmI1YSwgMHgyMDYxLCAweGE1YTMsIDB4NjEwMiwgMHg2MjA2LAorCTB4NjMwYSwgMHg2NDBlLCAweDAwNzgsIDB4MmIyYywgMHgwMDdlLCAweDIwMDEsIDB4YTM1MiwgMHgyMDA0LAorCTB4ZDBjYywgMHgwMDdmLCAweDAwN2MsIDB4MDA3ZSwgMHgyMDAxLCAweGEzNzEsIDB4MjAwNCwgMHhkMGJjLAorCTB4MDA3ZiwgMHgwMDdjLCAweDYxNjAsIDB4N2EyNCwgMHg2MzAwLCAweDgyZmYsIDB4MDBjMCwgMHgzNzliLAorCTB4NzkyNiwgMHgwMDc4LCAweDJiMmMsIDB4ODNmZiwgMHgwMGMwLCAweDJiNWEsIDB4MjAwMSwgMHhmZmYwLAorCTB4YTIwMCwgMHgwMGM4LCAweDJiNWEsIDB4MjAxOSwgMHhmZmZmLCAweDYwNjQsIDB4YTMwMiwgMHhhMjAwLAorCTB4MDA0OCwgMHgyYjVhLCAweDc5MjYsIDB4NjI2MiwgMHgwMDc4LCAweDJiMmMsIDB4MjAwMSwgMHhhMzAwLAorCTB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHgyYjU2LCAweDdjMjgsIDB4N2QyNCwgMHg3ZTM4LAorCTB4N2YyYywgMHgxMDc4LCAweDM1MTgsIDB4MDA0MCwgMHgyYjU2LCAweDIwMDksIDB4MDAwMCwgMHgyMDE5LAorCTB4MDAwMCwgMHg3MDIzLCAweDAwMDAsIDB4NzAyZiwgMHgwMDAwLCAweGFkODAsIDB4MDAwMywgMHg3MDI2LAorCTB4MjBhMCwgMHhhMWUwLCAweGE0MzQsIDB4MmM2NCwgMHg4Y2ZmLCAweDAwNDAsIDB4MzdlOCwgMHg2MDA0LAorCTB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgwMDQwLCAweDM3ZGQsIDB4NjAwNCwgMHhhMDg0LAorCTB4ZmYwMCwgMHhhMDg2LCAweDA2MDAsIDB4MDBjMCwgMHgzN2U4LCAweDYwMTQsIDB4MjBhMiwgMHg5NGEwLAorCTB4NjAxMCwgMHg4MDA3LCAweGExMDUsIDB4ODAwNywgMHgyMGEyLCAweDk0YTAsIDB4YTM5OCwgMHgwMDAyLAorCTB4ODEwOCwgMHhhMTgyLCAweDAwZmYsIDB4MDA0MCwgMHgzN2YzLCAweGEzODYsIDB4MDAyYSwgMHgwMDQwLAorCTB4MzdmYywgMHgwMDc4LCAweDM3YzksIDB4ODNmZiwgMHgwMGMwLCAweDM3ZmEsIDB4NzEyMCwgMHg4MTBjLAorCTB4MDA3OCwgMHgyYjJjLCAweDcwMmYsIDB4MDAwMSwgMHg3MTFlLCAweDcwMjAsIDB4YTMwMCwgMHg3MDIyLAorCTB4MjA2MSwgMHhhM2QxLCAweDYwMDcsIDB4MDAwMCwgMHg2MzEyLCAweDcwMjQsIDB4NjAwZSwgMHg2NDI2LAorCTB4NjUyYSwgMHg2NjJlLCAweDY3MzIsIDB4MmMxMCwgMHgxMDc4LCAweDEzZDEsIDB4NzAwNywgMHgwMDAyLAorCTB4NzAxYiwgMHgzODEzLCAweDAwN2MsIDB4NzAyYywgMHhhMDA1LCAweDAwYzAsIDB4MzgyNCwgMHg3MTFjLAorCTB4NzAyNCwgMHgyMGEwLCAweDIwMTksIDB4MDAwMCwgMHgyMDYxLCAweGEzZDEsIDB4NjQyNCwgMHg2NTI4LAorCTB4NjYyYywgMHg2NzMwLCAweDAwNzgsIDB4MzdjOSwgMHg3MTIwLCAweDgxMGMsIDB4MDA3OCwgMHgyYjJjLAorCTB4ODFmZiwgMHgwMGMwLCAweDJiNTYsIDB4NjBjOCwgMHhkMDljLCAweDAwNDAsIDB4MmI1NiwgMHgxMDc4LAorCTB4MzUxOCwgMHgwMDQwLCAweDJiNTYsIDB4NzkyNCwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LAorCTB4MTA3OCwgMHgzNTYyLCAweDcwMWIsIDB4MzgzZCwgMHgwMDdjLCAweDBkN2UsIDB4YWRlOCwgMHgwMDBkLAorCTB4NjgyOCwgMHhhMGJlLCAweDcwMDAsIDB4MDA0MCwgMHgzODUwLCAweGEwYmUsIDB4NzEwMCwgMHgwMDQwLAorCTB4Mzg1MCwgMHhhMGJlLCAweDcyMDAsIDB4MDA0MCwgMHgzODUwLCAweDBkN2YsIDB4MDA3OCwgMHgyYjVhLAorCTB4NjgyMCwgMHg2OTI0LCAweDEwNzgsIDB4MjRlMywgMHgwMGMwLCAweDM4N2IsIDB4MTA3OCwgMHg0NDk5LAorCTB4MDBjMCwgMHgzODdiLCAweDcxMjIsIDB4NjYxMiwgMHg2NTE2LCAweDZlMTgsIDB4MGM3ZSwgMHgxMDc4LAorCTB4MzUxOCwgMHgwMDQwLCAweDM4N2IsIDB4MTA3OCwgMHgzNTE4LCAweDAwNDAsIDB4Mzg3YiwgMHgwYzdmLAorCTB4MGQ3ZiwgMHg2ODM3LCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLCAweDY4M2EsIDB4NjgyMywgMHgwMDAwLAorCTB4NjgwNCwgMHgyMDY4LCAweDEwNzgsIDB4OGJiZCwgMHgwMDQwLCAweDJiNTYsIDB4NzAwNywgMHgwMDAzLAorCTB4NzAxYiwgMHgzODdlLCAweDAwN2MsIDB4MGQ3ZiwgMHgwMDc4LCAweDJiNTYsIDB4NzEyMCwgMHgxMDc4LAorCTB4MjkyMSwgMHg2ODIwLCAweGEwODYsIDB4ODAwMSwgMHgwMDQwLCAweDJiNTYsIDB4MmQwMCwgMHg3MDFlLAorCTB4NjgwNCwgMHhhMDgwLCAweDAwMDIsIDB4MDA3ZSwgMHgyMGE5LCAweDAwMmEsIDB4MjA5OCwgMHgyMGEwLAorCTB4MTA3OCwgMHg0MWJlLCAweDAwN2YsIDB4YWRlOCwgMHgwMDBkLCAweDZhMDgsIDB4NmIwYywgMHg2YzEwLAorCTB4NmQxNCwgMHgyMDYxLCAweGEzZDEsIDB4NjAwNywgMHgwMDAwLCAweDZlMDAsIDB4NmYyOCwgMHhhN2M2LAorCTB4NzAwMCwgMHgwMGMwLCAweDM4YTUsIDB4MDA3OCwgMHgzOGE5LCAweGE3YzYsIDB4NzEwMCwgMHgwMGMwLAorCTB4MzhiMSwgMHhhNmMyLCAweDAwMDQsIDB4MDA0OCwgMHgyYjVhLCAweDIwMDksIDB4MDAwNCwgMHgwMDc4LAorCTB4MzU2NiwgMHhhN2M2LCAweDcyMDAsIDB4MDBjMCwgMHgyYjVhLCAweGE2YzIsIDB4MDA1NCwgMHgwMDQ4LAorCTB4MmI1YSwgMHg2MDBlLCAweDYwMTMsIDB4MDAyYSwgMHg2MjI2LCAweDYzMmEsIDB4NjQyZSwgMHg2NTMyLAorCTB4MmMxMCwgMHgxMDc4LCAweDEzZDEsIDB4NzAwNywgMHgwMDAyLCAweDcwMWIsIDB4MzhjOCwgMHgwMDdjLAorCTB4NzAxYywgMHgyMDY4LCAweDY4MDQsIDB4YTA4MCwgMHgwMDAxLCAweDIwMDQsIDB4YTA4MCwgMHgwMDAyLAorCTB4MDA3ZSwgMHgyMGE5LCAweDAwMmEsIDB4MjA5OCwgMHgyMGEwLCAweDEwNzgsIDB4NDFiZSwgMHgwMDdmLAorCTB4MjAwOSwgMHgwMDJhLCAweDIwNjEsIDB4YTNkMSwgMHg2MjI0LCAweDYzMjgsIDB4NjQyYywgMHg2NTMwLAorCTB4MDA3OCwgMHgzNTY2LCAweDgxZmYsIDB4MDBjMCwgMHgyYjU2LCAweDEwNzgsIDB4MzUzMCwgMHgwMDQwLAorCTB4MmI1YSwgMHgxMDc4LCAweDQ1YTcsIDB4MDA0MCwgMHgyYjU2LCAweDEwNzgsIDB4NDcxMCwgMHgwMDc4LAorCTB4MmIyYywgMHg3ODI0LCAweGQwODQsIDB4MDA0MCwgMHgzMTUwLCAweDEwNzgsIDB4MzU0MiwgMHgwMDQwLAorCTB4MmI1YSwgMHgwYzdlLCAweDEwNzgsIDB4MzUxOCwgMHgwYzdmLCAweDAwYzAsIDB4MzkwMywgMHgyMDA5LAorCTB4MDAwMiwgMHgwMDc4LCAweDJiNTYsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LAorCTB4MDA0MCwgMHgzOTEwLCAweGEwOGUsIDB4MDAwNCwgMHgwMDQwLCAweDM5MTAsIDB4YTA4ZSwgMHgwMDA1LAorCTB4MDBjMCwgMHgzOTM0LCAweDIwMDEsIDB4YTM1MiwgMHgyMDA0LCAweGQwYjQsIDB4MDA0MCwgMHgzMTg1LAorCTB4NjAwMCwgMHhkMDhjLCAweDAwYzAsIDB4MzE4NSwgMHg2ODM3LCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLAorCTB4NjgzYSwgMHgxMDc4LCAweDhiZDksIDB4MDBjMCwgMHgzOTI5LCAweDIwMDksIDB4MDAwMywgMHgwMDc4LAorCTB4MmI1NiwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgzOTJlLCAweDAwN2MsIDB4MTA3OCwgMHgzNTQyLAorCTB4MDA0MCwgMHgyYjVhLCAweDAwNzgsIDB4MzE4NSwgMHgyMDA5LCAweGEzMmUsIDB4MjEwYywgMHg4MWZmLAorCTB4MDA0MCwgMHgzOTNlLCAweDIwMDksIDB4MDAwMSwgMHgwMDc4LCAweDJiNTYsIDB4MjAwMSwgMHhhMzAwLAorCTB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MDA0MCwgMHgzOTQ5LCAweDIwMDksIDB4MDAwNywgMHgwMDc4LAorCTB4MmI1NiwgMHgyMDAxLCAweGEzNTIsIDB4MjAwNCwgMHhkMGFjLCAweDAwNDAsIDB4Mzk1MywgMHgyMDA5LAorCTB4MDAwOCwgMHgwMDc4LCAweDJiNTYsIDB4NjA5YywgMHhkMGE0LCAweDAwYzAsIDB4Mzk1YSwgMHhkMGFjLAorCTB4MDBjMCwgMHgzMTg1LCAweDY4MzcsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLAorCTB4NjgzYSwgMHgxMDc4LCAweDhjNGQsIDB4MDBjMCwgMHgzOTY5LCAweDIwMDksIDB4MDAwMywgMHgwMDc4LAorCTB4MmI1NiwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgzOTZlLCAweDAwN2MsIDB4NjgzMCwgMHhhMDg2LAorCTB4MDEwMCwgMHgwMGMwLCAweDM5NzcsIDB4MjAwOSwgMHgwMDA0LCAweDAwNzgsIDB4MmI1NiwgMHgxMDc4LAorCTB4MzU0MiwgMHgwMDQwLCAweDJiNWEsIDB4MDA3OCwgMHgzOTEyLCAweDgxZmYsIDB4MjAwOSwgMHgwMDAxLAorCTB4MDBjMCwgMHgyYjU2LCAweDYwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDIwMDksIDB4MDAwNywgMHgwMGMwLAorCTB4MmI1NiwgMHgyMDAxLCAweGEzNTIsIDB4MjAwNCwgMHhkMGFjLCAweDIwMDksIDB4MDAwOCwgMHgwMGMwLAorCTB4MmI1NiwgMHgxMDc4LCAweDM1NDIsIDB4MDA0MCwgMHgyYjVhLCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4NiwgMHgwMDA2LCAweDIwMDksIDB4MDAwOSwgMHgwMGMwLCAweDJiNTYsIDB4MGM3ZSwgMHgxMDc4LAorCTB4MzUxOCwgMHgwYzdmLCAweDIwMDksIDB4MDAwMiwgMHgwMDQwLCAweDJiNTYsIDB4NjgzNywgMHgwMDAwLAorCTB4NjgzMywgMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDc5MjgsIDB4YTE5NCwgMHhmZjAwLAorCTB4YTE4YywgMHgwMGZmLCAweGEwMDYsIDB4ODJmZiwgMHgwMGMwLCAweDM5YmMsIDB4YzBlZCwgMHg2OTUyLAorCTB4NzkyYywgMHg2OTU2LCAweDAwNzgsIDB4MzljNSwgMHhhMjhlLCAweDAxMDAsIDB4MDBjMCwgMHgyYjVhLAorCTB4YzBlNSwgMHg2ODUzLCAweDAwMDAsIDB4Njg1NywgMHgwMDAwLCAweDY4M2UsIDB4MTA3OCwgMHg4ZGY2LAorCTB4MjAwOSwgMHgwMDAzLCAweDAwNDAsIDB4MmI1NiwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgzOWQxLAorCTB4MDA3YywgMHg2ODMwLCAweGEwODYsIDB4MDEwMCwgMHgyMDA5LCAweDAwMDQsIDB4MDA0MCwgMHgyYjU2LAorCTB4MDA3OCwgMHgyYjJjLCAweDgxZmYsIDB4MjAwOSwgMHgwMDAxLCAweDAwYzAsIDB4MmI1NiwgMHg2MDAwLAorCTB4YTA4NiwgMHgwMDAzLCAweDIwMDksIDB4MDAwNywgMHgwMGMwLCAweDJiNTYsIDB4MTA3OCwgMHgzNTQyLAorCTB4MDA0MCwgMHgyYjVhLCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgyMDA5LAorCTB4MDAwOSwgMHgwMGMwLCAweDJiNTYsIDB4MGM3ZSwgMHgxMDc4LCAweDM1MTgsIDB4MGM3ZiwgMHgyMDA5LAorCTB4MDAwMiwgMHgwMDQwLCAweDJiNTYsIDB4YWQ4MCwgMHgwMDBmLCAweDIwMDksIDB4MDAwOCwgMHg3YTJjLAorCTB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MTA3OCwgMHgzNTYyLCAweDcwMWIsIDB4M2EwOCwgMHgwMDdjLAorCTB4MGQ3ZSwgMHhhZGU4LCAweDAwMGYsIDB4NjgwMCwgMHhhMDg2LCAweDA1MDAsIDB4MDBjMCwgMHgzYTFiLAorCTB4NjgwNCwgMHhhMDA1LCAweDAwYzAsIDB4M2ExYiwgMHg2ODA4LCAweGEwODQsIDB4ZmYwMCwgMHgwMGMwLAorCTB4M2ExYiwgMHgwMDc4LCAweDNhMWUsIDB4MGQ3ZiwgMHgwMGMwLCAweDJiNWEsIDB4MGQ3ZiwgMHg2ODM3LAorCTB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLCAweDY4M2EsIDB4MGM3ZSwgMHgxMDc4LAorCTB4MzU0MiwgMHgwMGMwLCAweDNhMmUsIDB4MGM3ZiwgMHgwMDc4LCAweDJiNWEsIDB4MTA3OCwgMHg4ZTUyLAorCTB4MjAwOSwgMHgwMDAzLCAweDBjN2YsIDB4MDA0MCwgMHgyYjU2LCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLAorCTB4M2EzYSwgMHgwMDdjLCAweDY4MzAsIDB4YTA4NiwgMHgwMTAwLCAweDIwMDksIDB4MDAwNCwgMHgwMDQwLAorCTB4MmI1NiwgMHgwMDc4LCAweDJiMmMsIDB4MTI3ZSwgMHgwYzdlLCAweDBlN2UsIDB4MjA2MSwgMHgwMTAwLAorCTB4MjA3MSwgMHhhMzAwLCAweDYwNDQsIDB4ZDBhNCwgMHgwMGMwLCAweDNhNmMsIDB4ZDA4NCwgMHgwMDQwLAorCTB4M2E1NSwgMHgxMDc4LCAweDNiY2MsIDB4MDA3OCwgMHgzYTY4LCAweGQwOGMsIDB4MDA0MCwgMHgzYTVjLAorCTB4MTA3OCwgMHgzYWUzLCAweDAwNzgsIDB4M2E2OCwgMHhkMDk0LCAweDAwNDAsIDB4M2E2MywgMHgxMDc4LAorCTB4M2FiNywgMHgwMDc4LCAweDNhNjgsIDB4ZDA5YywgMHgwMDQwLCAweDNhNjgsIDB4MTA3OCwgMHgzYTc2LAorCTB4MGU3ZiwgMHgwYzdmLCAweDEyN2YsIDB4MDA3YywgMHgwMTdlLCAweDYxMjgsIDB4ZDE5YywgMHgwMGMwLAorCTB4M2E3MywgMHhjMTlkLCAweDYxMmEsIDB4MDE3ZiwgMHgwMDc4LCAweDNhNjgsIDB4NjI0YywgMHhhMjg2LAorCTB4ZjBmMCwgMHgwMGMwLCAweDNhODcsIDB4NjA0OCwgMHhhMDg2LCAweGYwZjAsIDB4MDA0MCwgMHgzYTg3LAorCTB4NjI0YSwgMHg2MDQzLCAweDAwOTAsIDB4NjA0MywgMHgwMDEwLCAweDAwNzgsIDB4M2FiNiwgMHhhMjk0LAorCTB4ZmYwMCwgMHhhMjk2LCAweGY3MDAsIDB4MDA0MCwgMHgzYTljLCAweDcxMzQsIDB4ZDFhNCwgMHgwMGMwLAorCTB4M2E5YywgMHg2MjQwLCAweGEyOTQsIDB4MDAxMCwgMHgwMDQwLCAweDNhOWMsIDB4MjAwOSwgMHgwMGY3LAorCTB4MTA3OCwgMHg0MWRlLCAweDAwNzgsIDB4M2FiNiwgMHg2MDQzLCAweDAwNDAsIDB4NjA0MywgMHgwMDAwLAorCTB4NzA3MywgMHgwMDAwLCAweDcwOGIsIDB4MDAwMSwgMHg3MGFmLCAweDAwMDAsIDB4NzBjYiwgMHgwMDAwLAorCTB4MjAwOSwgMHhhOWMwLCAweDIwMGIsIDB4MDAwMCwgMHg3MDgzLCAweDAwMDAsIDB4NzA3NywgMHgwMDBmLAorCTB4MjAwOSwgMHgwMDBmLCAweDIwMTEsIDB4NDEyMiwgMHgxMDc4LCAweDU5NmMsIDB4MDA3YywgMHgxNTdlLAorCTB4NzA3NCwgMHhhMDA1LCAweDAwYzAsIDB4M2FlMSwgMHgyMDExLCAweDQxMjIsIDB4MTA3OCwgMHg1OGQ0LAorCTB4NjA0MCwgMHhhMDk0LCAweDAwMTAsIDB4YTI4NSwgMHgwMDIwLCAweDYwNDIsIDB4MjBhOSwgMHgwMGM4LAorCTB4NjA0NCwgMHhkMDhjLCAweDAwYzAsIDB4M2FkYSwgMHgwMGYwLCAweDNhYzgsIDB4NjI0MiwgMHg3MDg3LAorCTB4MDAwMCwgMHg2MDQwLCAweGEwOTQsIDB4MDAxMCwgMHhhMjg1LCAweDAwODAsIDB4NjA0MiwgMHg2MjQyLAorCTB4MDA3OCwgMHgzYWUxLCAweDYyNDIsIDB4NzA4NywgMHgwMDAwLCAweDcwN2IsIDB4MDAwMCwgMHgwMDc4LAorCTB4M2FlMSwgMHgxNTdmLCAweDAwN2MsIDB4NzA3OCwgMHhhMDhhLCAweDAwMDMsIDB4MDBjOCwgMHgzYWVjLAorCTB4MTA3OSwgMHgzYWVmLCAweDAwNzgsIDB4M2FlZSwgMHgxMDc4LCAweDEzMjgsIDB4MDA3YywgMHgzYWYyLAorCTB4M2I0MSwgMHgzYmNiLCAweDBmN2UsIDB4NzA3YiwgMHgwMDAxLCAweDIwZTEsIDB4YTAwMCwgMHgyMGUxLAorCTB4ODcwMCwgMHgxMDc4LCAweDIxOGIsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMDc5LAorCTB4YTgwMCwgMHgyMDdiLCAweDIyMDAsIDB4NzgwNywgMHgwMGVmLCAweDc4MGIsIDB4MDAwMCwgMHg3ODBmLAorCTB4MDBlZiwgMHg3ODEzLCAweDAxMzgsIDB4NzgxNywgMHgwMDAwLCAweDc4MWIsIDB4MDAwMCwgMHg3ODFmLAorCTB4MDAwMCwgMHg3ODIzLCAweGZmZmYsIDB4NzgyNywgMHhmZmZmLCAweDc4MmIsIDB4MDAwMCwgMHg3ODJmLAorCTB4MDAwMCwgMHgyMDc5LCAweGE4MGMsIDB4MjA3YiwgMHgxMTAxLCAweDc4MDcsIDB4MDAwMCwgMHgyMDk5LAorCTB4YTMwNSwgMHgyMGExLCAweGE4MGUsIDB4MjBhOSwgMHgwMDA0LCAweDUzYTMsIDB4MjA3OSwgMHhhODEyLAorCTB4MjA3YiwgMHgwMDAwLCAweDc4MDcsIDB4MDAwMCwgMHgyMDk5LCAweGE4MDAsIDB4MjBhMSwgMHgwMjBiLAorCTB4MjBhOSwgMHgwMDE0LCAweDUzYTYsIDB4NjBjMywgMHgwMDBjLCAweDYwMGYsIDB4MDAwMCwgMHgxMDc4LAorCTB4NDE1OCwgMHgwZjdmLCAweDcwN2YsIDB4MDAwMCwgMHg2MDQzLCAweDAwMDgsIDB4NjA0MywgMHgwMDAwLAorCTB4MDA3YywgMHgwZDdlLCAweDcwN2MsIDB4NzA3ZiwgMHgwMDAwLCAweGEwMjUsIDB4MDA0MCwgMHgzYmI1LAorCTB4NjAyMCwgMHhkMGI0LCAweDAwYzAsIDB4M2JiMywgMHg3MTg4LCAweDgxZmYsIDB4MDA0MCwgMHgzYmEyLAorCTB4YTQ4NiwgMHgwMDBjLCAweDAwYzAsIDB4M2JhZCwgMHhhNDgwLCAweDAwMTgsIDB4ODAwNCwgMHgyMGE4LAorCTB4MjAxMSwgMHhhODgwLCAweDIwMTksIDB4YTgwMCwgMHgyMjBjLCAweDIzMDQsIDB4YTEwNiwgMHgwMGMwLAorCTB4M2I3OSwgMHg4MjEwLCAweDgzMTgsIDB4MDBmMCwgMHgzYjVjLCAweDYwNDMsIDB4MDAwNCwgMHg2MDhiLAorCTB4YmM5NCwgMHg2MDhmLCAweGYwZjAsIDB4NjA0MywgMHgwMDA2LCAweDcwN2IsIDB4MDAwMiwgMHg3MDg3LAorCTB4MDAwMiwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwgMHg0MTI5LCAweDEwNzgsIDB4NTk2YywgMHgwMDc4LAorCTB4M2JiMywgMHgyMDY5LCAweGE4ODAsIDB4NjkzMCwgMHhhMThlLCAweDExMDEsIDB4MDBjMCwgMHgzYmFkLAorCTB4NjgzNCwgMHhhMDA1LCAweDAwYzAsIDB4M2JhZCwgMHg2OTAwLCAweGExOGMsIDB4MDBmZiwgMHgwMGMwLAorCTB4M2I4ZCwgMHg2ODA0LCAweGEwMDUsIDB4MDA0MCwgMHgzYmEyLCAweDIwMTEsIDB4YTg4ZSwgMHgyMDE5LAorCTB4YTMwNSwgMHgyMGE5LCAweDAwMDQsIDB4MjIwYywgMHgyMzA0LCAweGExMDIsIDB4MDA0OCwgMHgzYmEwLAorCTB4MDBjMCwgMHgzYmFkLCAweDgyMTAsIDB4ODMxOCwgMHgwMGYwLCAweDNiOTMsIDB4MDA3OCwgMHgzYmFkLAorCTB4NzA4YiwgMHgwMDAwLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4MjA5OSwgMHhhODgwLAorCTB4MjBhMSwgMHgwMjBiLCAweDIwYTksIDB4MDAxNCwgMHg1M2E2LCAweDYwNDMsIDB4MDAwOCwgMHg2MDQzLAorCTB4MDAwMCwgMHgwMDc4LCAweDNiYjUsIDB4MGQ3ZiwgMHgwMDdjLCAweDYwMjAsIDB4ZDBiNCwgMHgwMGMwLAorCTB4M2JiMywgMHg2MGMzLCAweDAwMGMsIDB4MjAxMSwgMHhhNWI1LCAweDIwMTMsIDB4MDAwMCwgMHg3MDdmLAorCTB4MDAwMCwgMHgyMGUxLCAweDkwODAsIDB4NjBhMywgMHgwMDU2LCAweDYwYTcsIDB4OTU3NSwgMHgxMDc4LAorCTB4NmMzOCwgMHgwMDc4LCAweDNiYjMsIDB4MDA3YywgMHg3MDg0LCAweGEwOGEsIDB4MDAxZCwgMHgwMGM4LAorCTB4M2JkNSwgMHgxMDc5LCAweDNiZDgsIDB4MDA3OCwgMHgzYmQ3LCAweDEwNzgsIDB4MTMyOCwgMHgwMDdjLAorCTB4M2MwMiwgMHgzYzExLCAweDNjNDAsIDB4M2M1OSwgMHgzYzg1LCAweDNjYjEsIDB4M2NkZCwgMHgzZDEzLAorCTB4M2QzZiwgMHgzZDY3LCAweDNkYWEsIDB4M2RkNCwgMHgzZGY2LCAweDNlMGMsIDB4M2UzMiwgMHgzZTQ1LAorCTB4M2U0ZSwgMHgzZTdlLCAweDNlYWEsIDB4M2VkNiwgMHgzZjAyLCAweDNmMzgsIDB4M2Y3ZCwgMHgzZmFjLAorCTB4M2ZjZSwgMHg0MDEwLCAweDQwMzYsIDB4NDA0ZiwgMHg0MDUwLCAweDBjN2UsIDB4MjA2MSwgMHhhMzAwLAorCTB4NjAwMywgMHgwMDA3LCAweDIwNjEsIDB4MDEwMCwgMHg2MDA0LCAweGEwODQsIDB4ZmZmOSwgMHg2MDA2LAorCTB4MGM3ZiwgMHgwMDdjLCAweDYwOGIsIDB4YmM5NCwgMHg2MDhmLCAweGYwZjAsIDB4NjA0MywgMHgwMDAyLAorCTB4NzA4NywgMHgwMDAxLCAweDIwMDksIDB4MDdkMCwgMHgyMDExLCAweDQxMjksIDB4MTA3OCwgMHg1OTZjLAorCTB4MDA3YywgMHgwZjdlLCAweDcwN2MsIDB4YTA4NiwgMHgwMDE0LCAweDAwYzAsIDB4M2MzZSwgMHg2MDQzLAorCTB4MDAwMCwgMHg2MDIwLCAweGQwYjQsIDB4MDBjMCwgMHgzYzNlLCAweDIwNzksIDB4YTg4MCwgMHg3YTMwLAorCTB4YTI5NiwgMHgxMTAyLCAweDAwYzAsIDB4M2MzYywgMHg3ODM0LCAweGEwMDUsIDB4MDBjMCwgMHgzYzNjLAorCTB4N2EzOCwgMHhkMmZjLCAweDAwNDAsIDB4M2MzMiwgMHg3MGFjLCAweGEwMDUsIDB4MDBjMCwgMHgzYzMyLAorCTB4NzBhZiwgMHgwMDAxLCAweDIwMTEsIDB4NDEyOSwgMHgxMDc4LCAweDU4ZDQsIDB4NzA4NywgMHgwMDEwLAorCTB4MTA3OCwgMHgzZTRlLCAweDAwNzgsIDB4M2MzZSwgMHgxMDc4LCAweDQxNzEsIDB4MGY3ZiwgMHgwMDdjLAorCTB4NzA4NywgMHgwMDAzLCAweDYwNDMsIDB4MDAwNCwgMHgyMDExLCAweDQxMjksIDB4MTA3OCwgMHg1OGQ0LAorCTB4MTA3OCwgMHg0MWM2LCAweDIwYTMsIDB4MTEwMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhOSwgMHgwMDBhLAorCTB4MjBhMywgMHgwMDAwLCAweDAwZjAsIDB4M2M1MCwgMHg2MGMzLCAweDAwMTQsIDB4MTA3OCwgMHg0MTU4LAorCTB4MDA3YywgMHgwZjdlLCAweDcwN2MsIDB4YTAwNSwgMHgwMDQwLCAweDNjODMsIDB4MjAxMSwgMHg0MTI5LAorCTB4MTA3OCwgMHg1OGQ0LCAweGEwODYsIDB4MDAxNCwgMHgwMGMwLCAweDNjODEsIDB4MjA3OSwgMHhhODgwLAorCTB4N2EzMCwgMHhhMjk2LCAweDExMDIsIDB4MDBjMCwgMHgzYzgxLCAweDc4MzQsIDB4YTAwNSwgMHgwMGMwLAorCTB4M2M4MSwgMHg3YTM4LCAweGQyZmMsIDB4MDA0MCwgMHgzYzdiLCAweDcwYWMsIDB4YTAwNSwgMHgwMGMwLAorCTB4M2M3YiwgMHg3MGFmLCAweDAwMDEsIDB4NzA4NywgMHgwMDA0LCAweDEwNzgsIDB4M2M4NSwgMHgwMDc4LAorCTB4M2M4MywgMHgxMDc4LCAweDQxNzEsIDB4MGY3ZiwgMHgwMDdjLCAweDcwODcsIDB4MDAwNSwgMHgxMDc4LAorCTB4NDFjNiwgMHgyMGEzLCAweDExMDMsIDB4MjBhMywgMHgwMDAwLCAweDM0MzAsIDB4MjAxMSwgMHhhODhlLAorCTB4MTA3OCwgMHg0MjExLCAweDAwYzAsIDB4M2NhMywgMHg3MDcwLCAweGEwMDUsIDB4MDBjMCwgMHgzY2EzLAorCTB4NzE0YywgMHhhMTg2LCAweGZmZmYsIDB4MDA0MCwgMHgzY2EzLCAweDEwNzgsIDB4NDBlYSwgMHgwMDQwLAorCTB4M2NhMywgMHgxMDc4LCAweDQxZjUsIDB4MjBhOSwgMHgwMDA4LCAweDIyOTgsIDB4MjZhMCwgMHg1M2E2LAorCTB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTQsIDB4MTA3OCwgMHg0MTU4LAorCTB4MDA3YywgMHgwZjdlLCAweDcwN2MsIDB4YTAwNSwgMHgwMDQwLCAweDNjZGIsIDB4MjAxMSwgMHg0MTI5LAorCTB4MTA3OCwgMHg1OGQ0LCAweGEwODYsIDB4MDAxNCwgMHgwMGMwLCAweDNjZDksIDB4MjA3OSwgMHhhODgwLAorCTB4N2EzMCwgMHhhMjk2LCAweDExMDMsIDB4MDBjMCwgMHgzY2Q5LCAweDc4MzQsIDB4YTAwNSwgMHgwMGMwLAorCTB4M2NkOSwgMHg3YTM4LCAweGQyZmMsIDB4MDA0MCwgMHgzY2QzLCAweDcwYWMsIDB4YTAwNSwgMHgwMGMwLAorCTB4M2NkMywgMHg3MGFmLCAweDAwMDEsIDB4NzA4NywgMHgwMDA2LCAweDEwNzgsIDB4M2NkZCwgMHgwMDc4LAorCTB4M2NkYiwgMHgxMDc4LCAweDQxNzEsIDB4MGY3ZiwgMHgwMDdjLCAweDcwODcsIDB4MDAwNywgMHgxMDc4LAorCTB4NDFjNiwgMHgyMGEzLCAweDExMDQsIDB4MjBhMywgMHgwMDAwLCAweDM0MzAsIDB4MjAxMSwgMHhhODhlLAorCTB4MTA3OCwgMHg0MjExLCAweDAwYzAsIDB4M2QwNSwgMHg3MDcwLCAweGEwMDUsIDB4MDBjMCwgMHgzZDA1LAorCTB4NzE1MCwgMHhhMTg2LCAweGZmZmYsIDB4MDA0MCwgMHgzZDA1LCAweGExODAsIDB4MjkzZiwgMHgyMDBjLAorCTB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MTA3OCwgMHg0MGVhLCAweDAwNDAsIDB4M2QwNSwgMHgxMDc4LAorCTB4Mzc4YiwgMHgwMDQwLCAweDNkMDUsIDB4MTA3OCwgMHgyNTAwLCAweDIwYTksIDB4MDAwOCwgMHgyMjk4LAorCTB4MjZhMCwgMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LAorCTB4MTA3OCwgMHg0MTU4LCAweDAwN2MsIDB4MGY3ZSwgMHg3MDdjLCAweGEwMDUsIDB4MDA0MCwgMHgzZDNkLAorCTB4MjAxMSwgMHg0MTI5LCAweDEwNzgsIDB4NThkNCwgMHhhMDg2LCAweDAwMTQsIDB4MDBjMCwgMHgzZDNiLAorCTB4MjA3OSwgMHhhODgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTA0LCAweDAwYzAsIDB4M2QzYiwgMHg3ODM0LAorCTB4YTAwNSwgMHgwMGMwLCAweDNkM2IsIDB4N2EzOCwgMHhkMmZjLCAweDAwNDAsIDB4M2QzNSwgMHg3MGFjLAorCTB4YTAwNSwgMHgwMGMwLCAweDNkMzUsIDB4NzBhZiwgMHgwMDAxLCAweDcwODcsIDB4MDAwOCwgMHgxMDc4LAorCTB4M2QzZiwgMHgwMDc4LCAweDNkM2QsIDB4MTA3OCwgMHg0MTcxLCAweDBmN2YsIDB4MDA3YywgMHg3MDg3LAorCTB4MDAwOSwgMHgxMDc4LCAweDQxYzYsIDB4MjBhMywgMHgxMTA1LCAweDIwYTMsIDB4MDEwMCwgMHgzNDMwLAorCTB4MTA3OCwgMHg0MjExLCAweDAwYzAsIDB4M2Q1OCwgMHg3MDcwLCAweGEwMDUsIDB4MDBjMCwgMHgzZDU4LAorCTB4MTA3OCwgMHg0MDUxLCAweDAwYzAsIDB4M2Q2MiwgMHhhMDg1LCAweDAwMDEsIDB4MTA3OCwgMHgyNTAwLAorCTB4MjBhOSwgMHgwMDA4LCAweDIwOTksIDB4YTg4ZSwgMHgyNmEwLCAweDUzYTYsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAxNCwgMHgxMDc4LCAweDQxNTgsIDB4MDA3YywgMHgwZjdlLAorCTB4NzA3YywgMHhhMDA1LCAweDAwNDAsIDB4M2RhOCwgMHgyMDExLCAweDQxMjksIDB4MTA3OCwgMHg1OGQ0LAorCTB4YTA4NiwgMHgwMDE0LCAweDAwYzAsIDB4M2RhNiwgMHgyMDc5LCAweGE4ODAsIDB4N2EzMCwgMHhhMjk2LAorCTB4MTEwNSwgMHgwMGMwLCAweDNkYTYsIDB4NzgzNCwgMHgyMDExLCAweDAxMDAsIDB4YTIxZSwgMHgwMGMwLAorCTB4M2Q5MSwgMHg3YTM4LCAweGQyZmMsIDB4MDA0MCwgMHgzZDhiLCAweDcwYWMsIDB4YTAwNSwgMHgwMGMwLAorCTB4M2Q4YiwgMHg3MGFmLCAweDAwMDEsIDB4NzA4NywgMHgwMDBhLCAweDEwNzgsIDB4M2RhYSwgMHgwMDc4LAorCTB4M2RhOCwgMHhhMDA1LCAweDAwYzAsIDB4M2RhNiwgMHg3YTM4LCAweGQyZmMsIDB4MDA0MCwgMHgzZDllLAorCTB4NzBhYywgMHhhMDA1LCAweDAwYzAsIDB4M2Q5ZSwgMHg3MGFmLCAweDAwMDEsIDB4NzA4MywgMHgwMDAwLAorCTB4NzA4NywgMHgwMDBlLCAweDEwNzgsIDB4M2UzMiwgMHgwMDc4LCAweDNkYTgsIDB4MTA3OCwgMHg0MTcxLAorCTB4MGY3ZiwgMHgwMDdjLCAweDcwODcsIDB4MDAwYiwgMHgyMDExLCAweGE4MGUsIDB4MjJhMCwgMHgyMGE5LAorCTB4MDA0MCwgMHgyMDE5LCAweGZmZmYsIDB4NDNhNCwgMHgyMGE5LCAweDAwMDIsIDB4MjAwOSwgMHgwMDAwLAorCTB4NDFhNCwgMHgxMDc4LCAweDQxYzYsIDB4MjBhMywgMHgxMTA2LCAweDIwYTMsIDB4MDAwMCwgMHgxMDc4LAorCTB4NDIxMSwgMHgwMDQwLCAweDNkYzcsIDB4MjAxMywgMHgwMDAwLCAweDAwNzgsIDB4M2RjYiwgMHg2MDMwLAorCTB4YTA4NSwgMHgwMTAwLCAweDIwMTIsIDB4MjI5OCwgMHgyMGE5LCAweDAwNDIsIDB4NTNhNiwgMHg2MGMzLAorCTB4MDA4NCwgMHgxMDc4LCAweDQxNTgsIDB4MDA3YywgMHgwZjdlLCAweDcwN2MsIDB4YTAwNSwgMHgwMDQwLAorCTB4M2RmNCwgMHgyMDExLCAweDQxMjksIDB4MTA3OCwgMHg1OGQ0LCAweGEwODYsIDB4MDA4NCwgMHgwMGMwLAorCTB4M2RmMiwgMHgyMDc5LCAweGE4ODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDYsIDB4MDBjMCwgMHgzZGYyLAorCTB4NzgzNCwgMHhhMDA1LCAweDAwYzAsIDB4M2RmMiwgMHg3MDg3LCAweDAwMGMsIDB4MTA3OCwgMHgzZGY2LAorCTB4MDA3OCwgMHgzZGY0LCAweDEwNzgsIDB4NDE3MSwgMHgwZjdmLCAweDAwN2MsIDB4NzA4NywgMHgwMDBkLAorCTB4MTA3OCwgMHg0MWM2LCAweDIwYTMsIDB4MTEwNywgMHgyMGEzLCAweDAwMDAsIDB4MjA5OSwgMHhhODhlLAorCTB4MjBhOSwgMHgwMDQwLCAweDUzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLAorCTB4MDA4NCwgMHgxMDc4LCAweDQxNTgsIDB4MDA3YywgMHgwZjdlLCAweDcwN2MsIDB4YTAwNSwgMHgwMDQwLAorCTB4M2UzMCwgMHgyMDExLCAweDQxMjksIDB4MTA3OCwgMHg1OGQ0LCAweGEwODYsIDB4MDA4NCwgMHgwMGMwLAorCTB4M2UyZSwgMHgyMDc5LCAweGE4ODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDcsIDB4MDBjMCwgMHgzZTJlLAorCTB4NzgzNCwgMHhhMDA1LCAweDAwYzAsIDB4M2UyZSwgMHg3MDgzLCAweDAwMDEsIDB4MTA3OCwgMHg0MWI4LAorCTB4NzA4NywgMHgwMDBlLCAweDEwNzgsIDB4M2UzMiwgMHgwMDc4LCAweDNlMzAsIDB4MTA3OCwgMHg0MTcxLAorCTB4MGY3ZiwgMHgwMDdjLCAweDcwODcsIDB4MDAwZiwgMHg3MDdmLCAweDAwMDAsIDB4NjA4YiwgMHhiYzg1LAorCTB4NjA4ZiwgMHhiNWI1LCAweDYwNDMsIDB4MDAwNSwgMHg2MDQzLCAweDAwMDQsIDB4MjAwOSwgMHgwN2QwLAorCTB4MjAxMSwgMHg0MTI5LCAweDEwNzgsIDB4NThjNywgMHgwMDdjLCAweDcwN2MsIDB4YTAwNSwgMHgwMDQwLAorCTB4M2U0ZCwgMHgyMDExLCAweDQxMjksIDB4MTA3OCwgMHg1OGQ0LCAweDAwN2MsIDB4NzA4NywgMHgwMDExLAorCTB4MTA3OCwgMHg0MjExLCAweDAwYzAsIDB4M2U2NywgMHg3MTY4LCAweDgxZmYsIDB4MDA0MCwgMHgzZTY3LAorCTB4MjAwOSwgMHgwMDAwLCAweDcwNmMsIDB4YTA4NCwgMHgwMGZmLCAweDEwNzgsIDB4MjRlMywgMHhhMTg2LAorCTB4MDA4MCwgMHgwMDQwLCAweDNlNjcsIDB4MjAxMSwgMHhhODhlLCAweDEwNzgsIDB4NDBlYSwgMHgyMGUxLAorCTB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4MjA5OSwgMHhhODgwLCAweDIwYTEsIDB4MDIwYiwgMHg3NDdjLAorCTB4YTQ4MCwgMHgwMDE4LCAweGEwODAsIDB4MDAwNywgMHhhMDg0LCAweDAzZjgsIDB4ODAwNCwgMHgyMGE4LAorCTB4NTNhNiwgMHg2MGMzLCAweDAwMTQsIDB4MTA3OCwgMHg0MTU4LCAweDAwN2MsIDB4MGY3ZSwgMHg3MDdjLAorCTB4YTAwNSwgMHgwMDQwLCAweDNlYTgsIDB4MjAxMSwgMHg0MTI5LCAweDEwNzgsIDB4NThkNCwgMHhhMDg2LAorCTB4MDAxNCwgMHgwMGMwLCAweDNlYTYsIDB4MjA3OSwgMHhhODgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTAzLAorCTB4MDBjMCwgMHgzZWE2LCAweDc4MzQsIDB4YTAwNSwgMHgwMGMwLCAweDNlYTYsIDB4N2EzOCwgMHhkMmZjLAorCTB4MDA0MCwgMHgzZWEwLCAweDcwYWMsIDB4YTAwNSwgMHgwMGMwLCAweDNlYTAsIDB4NzBhZiwgMHgwMDAxLAorCTB4NzA4NywgMHgwMDEyLCAweDEwNzgsIDB4M2VhYSwgMHgwMDc4LCAweDNlYTgsIDB4MTA3OCwgMHg0MTcxLAorCTB4MGY3ZiwgMHgwMDdjLCAweDcwODcsIDB4MDAxMywgMHgxMDc4LCAweDQxZDIsIDB4MjBhMywgMHgxMTAzLAorCTB4MjBhMywgMHgwMDAwLCAweDM0MzAsIDB4MjAxMSwgMHhhODhlLCAweDEwNzgsIDB4NDIxMSwgMHgwMGMwLAorCTB4M2VjOCwgMHg3MDcwLCAweGEwMDUsIDB4MDBjMCwgMHgzZWM4LCAweDcxNGMsIDB4YTE4NiwgMHhmZmZmLAorCTB4MDA0MCwgMHgzZWM4LCAweDEwNzgsIDB4NDBlYSwgMHgwMDQwLCAweDNlYzgsIDB4MTA3OCwgMHg0MWY1LAorCTB4MjBhOSwgMHgwMDA4LCAweDIyOTgsIDB4MjZhMCwgMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHg2MGMzLCAweDAwMTQsIDB4MTA3OCwgMHg0MTU4LCAweDAwN2MsIDB4MGY3ZSwgMHg3MDdjLAorCTB4YTAwNSwgMHgwMDQwLCAweDNmMDAsIDB4MjAxMSwgMHg0MTI5LCAweDEwNzgsIDB4NThkNCwgMHhhMDg2LAorCTB4MDAxNCwgMHgwMGMwLCAweDNlZmUsIDB4MjA3OSwgMHhhODgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTA0LAorCTB4MDBjMCwgMHgzZWZlLCAweDc4MzQsIDB4YTAwNSwgMHgwMGMwLCAweDNlZmUsIDB4N2EzOCwgMHhkMmZjLAorCTB4MDA0MCwgMHgzZWY4LCAweDcwYWMsIDB4YTAwNSwgMHgwMGMwLCAweDNlZjgsIDB4NzBhZiwgMHgwMDAxLAorCTB4NzA4NywgMHgwMDE0LCAweDEwNzgsIDB4M2YwMiwgMHgwMDc4LCAweDNmMDAsIDB4MTA3OCwgMHg0MTcxLAorCTB4MGY3ZiwgMHgwMDdjLCAweDcwODcsIDB4MDAxNSwgMHgxMDc4LCAweDQxZDIsIDB4MjBhMywgMHgxMTA0LAorCTB4MjBhMywgMHgwMDAwLCAweDM0MzAsIDB4MjAxMSwgMHhhODhlLCAweDEwNzgsIDB4NDIxMSwgMHgwMGMwLAorCTB4M2YyYSwgMHg3MDcwLCAweGEwMDUsIDB4MDBjMCwgMHgzZjJhLCAweDcxNTAsIDB4YTE4NiwgMHhmZmZmLAorCTB4MDA0MCwgMHgzZjJhLCAweGExODAsIDB4MjkzZiwgMHgyMDBjLCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLAorCTB4MTA3OCwgMHg0MGVhLCAweDAwNDAsIDB4M2YyYSwgMHgxMDc4LCAweDM3OGIsIDB4MDA0MCwgMHgzZjJhLAorCTB4MTA3OCwgMHgyNTAwLCAweDIwYTksIDB4MDAwOCwgMHgyMjk4LCAweDI2YTAsIDB4NTNhNiwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LCAweDEwNzgsIDB4NDE1OCwgMHgwMDdjLAorCTB4MGY3ZSwgMHg3MDdjLCAweGEwMDUsIDB4MDA0MCwgMHgzZjdiLCAweDIwMTEsIDB4NDEyOSwgMHgxMDc4LAorCTB4NThkNCwgMHhhMDg2LCAweDAwMTQsIDB4MDBjMCwgMHgzZjc5LCAweDIwNzksIDB4YTg4MCwgMHg3YTMwLAorCTB4YTI5NiwgMHgxMTA1LCAweDAwYzAsIDB4M2Y3OSwgMHg3ODM0LCAweDIwMTEsIDB4MDEwMCwgMHhhMjFlLAorCTB4MDBjMCwgMHgzZjVlLCAweDdhMzgsIDB4ZDJmYywgMHgwMDQwLCAweDNmNWMsIDB4NzBhYywgMHhhMDA1LAorCTB4MDBjMCwgMHgzZjVjLCAweDcwYWYsIDB4MDAwMSwgMHgwMDc4LCAweDNmNmQsIDB4YTAwNSwgMHgwMGMwLAorCTB4M2Y3OSwgMHg3YTM4LCAweGQyZmMsIDB4MDA0MCwgMHgzZjZiLCAweDcwYWMsIDB4YTAwNSwgMHgwMGMwLAorCTB4M2Y2YiwgMHg3MGFmLCAweDAwMDEsIDB4NzA4MywgMHgwMDAwLCAweDdhMzgsIDB4ZDJmNCwgMHgwMDQwLAorCTB4M2Y3MywgMHg3MGNiLCAweDAwMDgsIDB4NzA4NywgMHgwMDE2LCAweDEwNzgsIDB4M2Y3ZCwgMHgwMDc4LAorCTB4M2Y3YiwgMHgxMDc4LCAweDQxNzEsIDB4MGY3ZiwgMHgwMDdjLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLAorCTB4NDAwMCwgMHgyMDk5LCAweGE4ODAsIDB4MjBhMSwgMHgwMjBiLCAweDIwYTksIDB4MDAwZSwgMHg1M2E2LAorCTB4MzQzMCwgMHgyMDExLCAweGE4OGUsIDB4NzA4NywgMHgwMDE3LCAweDEwNzgsIDB4NDIxMSwgMHgwMGMwLAorCTB4M2Y5ZCwgMHg3MDcwLCAweGEwMDUsIDB4MDBjMCwgMHgzZjlkLCAweDEwNzgsIDB4NDA1MSwgMHgwMGMwLAorCTB4M2ZhNywgMHhhMDg1LCAweDAwMDEsIDB4MTA3OCwgMHgyNTAwLCAweDIwYTksIDB4MDAwOCwgMHgyMDk5LAorCTB4YTg4ZSwgMHgyNmEwLCAweDUzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLAorCTB4MDAxNCwgMHgxMDc4LCAweDQxNTgsIDB4MDA3YywgMHgwZjdlLCAweDcwN2MsIDB4YTAwNSwgMHgwMDQwLAorCTB4M2ZjYywgMHgyMDExLCAweDQxMjksIDB4MTA3OCwgMHg1OGQ0LCAweGEwODYsIDB4MDA4NCwgMHgwMGMwLAorCTB4M2ZjYSwgMHgyMDc5LCAweGE4ODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDYsIDB4MDBjMCwgMHgzZmNhLAorCTB4NzgzNCwgMHhhMDA1LCAweDAwYzAsIDB4M2ZjYSwgMHg3MDg3LCAweDAwMTgsIDB4MTA3OCwgMHgzZmNlLAorCTB4MDA3OCwgMHgzZmNjLCAweDEwNzgsIDB4NDE3MSwgMHgwZjdmLCAweDAwN2MsIDB4NzA4NywgMHgwMDE5LAorCTB4MTA3OCwgMHg0MWQyLCAweDIwYTMsIDB4MTEwNiwgMHgyMGEzLCAweDAwMDAsIDB4MzQzMCwgMHgyMDk5LAorCTB4YTg4ZSwgMHgyMDM5LCAweGE4MGUsIDB4MjdhMCwgMHgyMGE5LCAweDAwNDAsIDB4NTNhMywgMHgxMDc4LAorCTB4NDIxMSwgMHgwMGMwLCAweDQwMDIsIDB4MjcyOCwgMHgyNTE0LCAweDgyMDcsIDB4YTA4NCwgMHgwMGZmLAorCTB4ODAwMCwgMHgyMDE4LCAweGEyOTQsIDB4MDBmZiwgMHg4MDA3LCAweGEyMDUsIDB4MjAyYSwgMHg2MDMwLAorCTB4MjMxMCwgMHg4MjE0LCAweGEyYTAsIDB4YTgwZSwgMHgyNDE0LCAweGEzOGMsIDB4MDAwMSwgMHgwMDQwLAorCTB4M2ZmZCwgMHhhMjk0LCAweGZmMDAsIDB4MDA3OCwgMHg0MDAwLCAweGEyOTQsIDB4MDBmZiwgMHg4MDA3LAorCTB4YTIxNSwgMHgyMjIyLCAweDI3OTgsIDB4MjZhMCwgMHgyMGE5LCAweDAwNDAsIDB4NTNhNiwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDg0LCAweDEwNzgsIDB4NDE1OCwgMHgwMDdjLAorCTB4MGY3ZSwgMHg3MDdjLCAweGEwMDUsIDB4MDA0MCwgMHg0MDM0LCAweDIwMTEsIDB4NDEyOSwgMHgxMDc4LAorCTB4NThkNCwgMHhhMDg2LCAweDAwODQsIDB4MDBjMCwgMHg0MDMyLCAweDIwNzksIDB4YTg4MCwgMHg3YTMwLAorCTB4YTI5NiwgMHgxMTA3LCAweDAwYzAsIDB4NDAzMiwgMHg3ODM0LCAweGEwMDUsIDB4MDBjMCwgMHg0MDMyLAorCTB4NzA4MywgMHgwMDAxLCAweDEwNzgsIDB4NDFiOCwgMHg3MDg3LCAweDAwMWEsIDB4MTA3OCwgMHg0MDM2LAorCTB4MDA3OCwgMHg0MDM0LCAweDEwNzgsIDB4NDE3MSwgMHgwZjdmLCAweDAwN2MsIDB4NzA4NywgMHgwMDFiLAorCTB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMDk5LCAweGE4ODAsIDB4MjBhMSwgMHgwMjBiLAorCTB4NzQ3YywgMHhhNDgwLCAweDAwMTgsIDB4YTA4MCwgMHgwMDA3LCAweGEwODQsIDB4MDNmOCwgMHg4MDA0LAorCTB4MjBhOCwgMHg1M2E2LCAweDYwYzMsIDB4MDA4NCwgMHgxMDc4LCAweDQxNTgsIDB4MDA3YywgMHgwMDdjLAorCTB4MDA3YywgMHgwODdlLCAweDA5N2UsIDB4MjAyOSwgMHhhMzUyLCAweDI1MmMsIDB4MjBhOSwgMHgwMDA4LAorCTB4MjA0MSwgMHhhODBlLCAweDI4YTAsIDB4MjA5OSwgMHhhODhlLCAweDUzYTMsIDB4MjBhOSwgMHgwMDA4LAorCTB4MjAxMSwgMHgwMDA3LCAweGQ1ZDQsIDB4MDA0MCwgMHg0MDY3LCAweDIwMTEsIDB4MDAwMCwgMHgyODAwLAorCTB4YTIwMCwgMHgyMDBjLCAweGExYTYsIDB4ZmZmZiwgMHgwMGMwLCAweDQwNzksIDB4ZDVkNCwgMHgwMDQwLAorCTB4NDA3NCwgMHg4MjEwLCAweDAwNzgsIDB4NDA3NSwgMHg4MjExLCAweDAwZjAsIDB4NDA2NywgMHgwMDc4LAorCTB4NDBlMSwgMHg4MmZmLCAweDAwYzAsIDB4NDA4YiwgMHhkNWQ0LCAweDAwNDAsIDB4NDA4NSwgMHhhMWE2LAorCTB4M2ZmZiwgMHgwMDQwLCAweDQwNzEsIDB4MDA3OCwgMHg0MDg5LCAweGExYTYsIDB4M2ZmZiwgMHgwMDQwLAorCTB4NDBlMSwgMHhhMThkLCAweGMwMDAsIDB4MjBhOSwgMHgwMDEwLCAweDIwMTksIDB4MDAwMSwgMHhkNWQ0LAorCTB4MDA0MCwgMHg0MDk0LCAweDIwMTksIDB4MDAxMCwgMHgyMTIwLCAweGQ1ZDQsIDB4MDA0MCwgMHg0MDliLAorCTB4ODQyMywgMHgwMDc4LCAweDQwOWMsIDB4ODQyNCwgMHgwMGM4LCAweDQwYTksIDB4ZDVkNCwgMHgwMDQwLAorCTB4NDBhNCwgMHg4MzE5LCAweDAwNzgsIDB4NDBhNSwgMHg4MzE4LCAweDAwZjAsIDB4NDA5NSwgMHgwMDc4LAorCTB4NDBlMSwgMHgyM2E4LCAweDIwMjEsIDB4MDAwMSwgMHg4NDI2LCAweDg0MjUsIDB4MDBmMCwgMHg0MGFkLAorCTB4MjMyOCwgMHg4NTI5LCAweGEyYmUsIDB4MDAwNywgMHgwMDQwLCAweDQwYzEsIDB4MDA3ZSwgMHgyMDM5LAorCTB4MDAwNywgMHgyMjAwLCAweGE3M2EsIDB4MDA3ZiwgMHgyN2E4LCAweGE1YTgsIDB4MDAxMCwgMHgwMGYwLAorCTB4NDBiZCwgMHg3NTRlLCAweGE1YzgsIDB4MjkzZiwgMHgyOTJjLCAweGE1YWMsIDB4MDBmZiwgMHg2NTMyLAorCTB4NjBlNywgMHgwMDAwLCAweDY1ZWEsIDB4NzA2YiwgMHgwMDAwLCAweDc1NmUsIDB4MjAxOCwgMHgyMzA0LAorCTB4YTQwNSwgMHgyMDFhLCAweDcwNzMsIDB4MDAwMSwgMHgyNmEwLCAweDI4OTgsIDB4MjBhOSwgMHgwMDA4LAorCTB4NTNhNiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweGEwODUsIDB4MDAwMSwgMHgwMDc4LAorCTB4NDBlNywgMHhhMDA2LCAweDAwNzgsIDB4NDBlNywgMHhhMDA2LCAweDEwNzgsIDB4MTMyOCwgMHgwOTdmLAorCTB4MDg3ZiwgMHgwMDdjLCAweDIxMTgsIDB4MjAyMSwgMHgwMDAwLCAweDIwMDEsIDB4MDAwNywgMHhhMzlhLAorCTB4MDAxMCwgMHgwMDQ4LCAweDQwZjcsIDB4ODQyMCwgMHg4MDAxLCAweDAwNzgsIDB4NDBlZiwgMHgyMTE4LAorCTB4ODRmZiwgMHgwMDQwLCAweDQxMDAsIDB4YTM5YSwgMHgwMDEwLCAweDg0MjEsIDB4MDBjMCwgMHg0MGZiLAorCTB4MjAyMSwgMHgwMDAxLCAweDgzZmYsIDB4MDA0MCwgMHg0MTA5LCAweDg0MjMsIDB4ODMxOSwgMHgwMGMwLAorCTB4NDEwNSwgMHhhMjM4LCAweDI3MDQsIDB4YTQyYywgMHgwMGMwLCAweDQxMjEsIDB4YTQwNSwgMHgyMDNhLAorCTB4NzE0ZSwgMHhhMWEwLCAweDI5M2YsIDB4MjQyYywgMHhhNWFjLCAweDAwZmYsIDB4NjUzMiwgMHg2MGU3LAorCTB4MDAwMCwgMHg2NWVhLCAweDcwNmIsIDB4MDAwMCwgMHg3NTZlLCAweDcwNzMsIDB4MDAwMSwgMHhhMDg0LAorCTB4MDAwMCwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhMzAwLCAweDcwNzcsIDB4MDAwMCwgMHgwZTdmLAorCTB4MDA3YywgMHgwZTdlLCAweDBmN2UsIDB4MjAwMSwgMHgwMDAyLCAweDEwNzgsIDB4NTk3NSwgMHgyMDc5LAorCTB4MDEwMCwgMHgyMDcxLCAweDAxNDAsIDB4MTA3OCwgMHg2YzQxLCAweDcwMDQsIDB4YTA4NCwgMHg0MDAwLAorCTB4MDA0MCwgMHg0MTNlLCAweDcwMDMsIDB4MTAwMCwgMHg3MDAzLCAweDAwMDAsIDB4MTI3ZSwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDcxLCAweGEzMjEsIDB4MjA3MywgMHgwMDAwLCAweDc4NDAsIDB4MDI3ZSwgMHgwMTdlLAorCTB4MjAwOSwgMHgwMGY3LCAweDEwNzgsIDB4NDFkZSwgMHgwMTdmLCAweGEwOTQsIDB4MDAxMCwgMHhhMjg1LAorCTB4MDA4MCwgMHg3ODQyLCAweDdhNDIsIDB4MDI3ZiwgMHgxMjdmLCAweDBmN2YsIDB4MGU3ZiwgMHgwMDdjLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjAxMSwgMHhhNWI1LCAweDIwMTMsIDB4MDAwMCwgMHg3MDdmLAorCTB4MDAwMCwgMHgxMjdmLCAweDIwZTEsIDB4OTA4MCwgMHg2MGEzLCAweDAwNTYsIDB4NjBhNywgMHg5NTc1LAorCTB4MTA3OCwgMHg2YzM4LCAweDIwMDksIDB4MDdkMCwgMHgyMDExLCAweDQxMjksIDB4MTA3OCwgMHg1OTZjLAorCTB4MDA3YywgMHgwMTdlLCAweDAyN2UsIDB4MGM3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDA5LAorCTB4MDBmNywgMHgxMDc4LCAweDQxZGUsIDB4MjA2MSwgMHhhNWJlLCAweDYwMWIsIDB4MDAwMCwgMHg2MDFmLAorCTB4MDAwMCwgMHgyMDYxLCAweGEzMDAsIDB4NjAwMywgMHgwMDAxLCAweDIwNjEsIDB4MDEwMCwgMHg2MDQzLAorCTB4MDA5MCwgMHg2MDQzLCAweDAwMTAsIDB4MjAwOSwgMHgwMDJkLCAweDIwMTEsIDB4NDE5NiwgMHgxMDc4LAorCTB4NThjNywgMHgxMjdmLCAweDBjN2YsIDB4MDI3ZiwgMHgwMTdmLCAweDAwN2MsIDB4MGU3ZSwgMHgwMDdlLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjAwMSwgMHgwMDAxLCAweDEwNzgsIDB4NTk3NSwgMHgyMDcxLAorCTB4MDEwMCwgMHgxMDc4LCAweDZjNDEsIDB4MjA3MSwgMHgwMTQwLCAweDcwMDQsIDB4YTA4NCwgMHg0MDAwLAorCTB4MDA0MCwgMHg0MWFlLCAweDcwMDMsIDB4MTAwMCwgMHg3MDAzLCAweDAwMDAsIDB4MjAwMSwgMHgwMDAxLAorCTB4MTA3OCwgMHgyNDgwLCAweDEwNzgsIDB4NDE3MSwgMHgxMjdmLCAweDAwN2YsIDB4MGU3ZiwgMHgwMDdjLAorCTB4MjBhOSwgMHgwMDQwLCAweDIwYTEsIDB4YTljMCwgMHgyMDk5LCAweGE4OGUsIDB4MzMwNCwgMHg4MDA3LAorCTB4MjBhMiwgMHg5Mzk4LCAweDk0YTAsIDB4MDBmMCwgMHg0MWJlLCAweDAwN2MsIDB4MjBlMSwgMHg5MDgwLAorCTB4MjBlMSwgMHg0MDAwLCAweDIwOTksIDB4YTgwMCwgMHgyMGExLCAweDAyMGIsIDB4MjBhOSwgMHgwMDBjLAorCTB4NTNhNiwgMHgwMDdjLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4MjA5OSwgMHhhODgwLAorCTB4MjBhMSwgMHgwMjBiLCAweDIwYTksIDB4MDAwYywgMHg1M2E2LCAweDAwN2MsIDB4MGM3ZSwgMHgwMDdlLAorCTB4MjA2MSwgMHgwMTAwLCAweDgxMGYsIDB4MjAwMSwgMHhhMzJlLCAweDIwMDQsIDB4YTAwNSwgMHgwMGMwLAorCTB4NDFlZiwgMHg2MDMwLCAweGEwODQsIDB4MDBmZiwgMHhhMTA1LCAweDAwNzgsIDB4NDFmMSwgMHhhMTg1LAorCTB4MDBmNywgMHg2MDRhLCAweDAwN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDAxN2UsIDB4MDQ3ZSwgMHgyMDAxLAorCTB4YTM1MiwgMHgyMDA0LCAweGQwYTQsIDB4MDA0MCwgMHg0MjA4LCAweGEwMDYsIDB4MjAyMCwgMHgyMDA5LAorCTB4MDAyYSwgMHgxMDc4LCAweDllYzAsIDB4MjAwMSwgMHhhMzBjLCAweDIwMGMsIDB4YzE5NSwgMHgyMTAyLAorCTB4MjAxOSwgMHgwMDJhLCAweDIwMDksIDB4MDAwMCwgMHgxMDc4LCAweDI3ZTIsIDB4MDQ3ZiwgMHgwMTdmLAorCTB4MDA3YywgMHgwMDdlLCAweDIwMDEsIDB4YTMwYywgMHgyMDA0LCAweGQwOWMsIDB4MDA0MCwgMHg0MjE4LAorCTB4MDA3ZiwgMHgwMDdjLCAweDAwN2UsIDB4MDE3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDAxLAorCTB4MDEwMSwgMHgyMDBjLCAweGExOGQsIDB4MDAwNiwgMHgyMTAyLCAweDEyN2YsIDB4MDE3ZiwgMHgwMDdmLAorCTB4MDA3YywgMHgxNTdlLCAweDIwYTksIDB4MDBmZiwgMHgyMDA5LCAweGE0MzQsIDB4YTAwNiwgMHgyMDBhLAorCTB4ODEwOCwgMHgwMGYwLCAweDQyMmYsIDB4MTU3ZiwgMHgwMDdjLCAweDBkN2UsIDB4MDM3ZSwgMHgxNTdlLAorCTB4MTM3ZSwgMHgxNDdlLCAweDIwNjksIDB4YTM1MSwgMHhhMDA2LCAweDYwMDIsIDB4NjAwNywgMHgwNzA3LAorCTB4NjAwYSwgMHg2MDBlLCAweDYwMTIsIDB4YTE5OCwgMHgyOTNmLCAweDIzMWMsIDB4YTM5YywgMHgwMGZmLAorCTB4NjMxNiwgMHgyMGE5LCAweDAwMDQsIDB4YWM5OCwgMHgwMDA2LCAweDIzYTAsIDB4NDBhNCwgMHgyMGE5LAorCTB4MDAwNCwgMHhhYzk4LCAweDAwMGEsIDB4MjNhMCwgMHg0MGE0LCAweDYwM2UsIDB4NjA0MiwgMHg2MDRlLAorCTB4NjA1MiwgMHg2MDU2LCAweDYwNWEsIDB4NjA1ZSwgMHg2MDYyLCAweDYwNjYsIDB4NjA2YSwgMHg2MDZlLAorCTB4NjA3MiwgMHg2MDc2LCAweDYwN2EsIDB4NjA3ZSwgMHg2MDgyLCAweDYwODYsIDB4NjA4YSwgMHg2MDhlLAorCTB4NjA5MiwgMHg2MDk2LCAweDYwOWEsIDB4NjA5ZSwgMHg2MGFlLCAweDYxYTIsIDB4MGQ3ZSwgMHg2MGE0LAorCTB4YTA2ZCwgMHgwMDQwLCAweDQyNzUsIDB4MTA3OCwgMHgxMzlhLCAweDYwYTcsIDB4MDAwMCwgMHg2MGE4LAorCTB4YTA2ZCwgMHgwMDQwLCAweDQyN2QsIDB4MTA3OCwgMHgxMzlhLCAweDYwYWIsIDB4MDAwMCwgMHgwZDdmLAorCTB4YTAwNiwgMHg2MDRhLCAweDY4MTAsIDB4NjAzYSwgMHg2ODBjLCAweDYwNDYsIDB4NjgxNCwgMHhhMDg0LAorCTB4MDBmZiwgMHg2MDQyLCAweDE0N2YsIDB4MTM3ZiwgMHgxNTdmLCAweDAzN2YsIDB4MGQ3ZiwgMHgwMDdjLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4Njk0NCwgMHg2ZTQ4LCAweGE2ODQsIDB4M2ZmZiwgMHhhMDgyLAorCTB4NDAwMCwgMHgwMGM4LCAweDQzNjEsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE4MiwgMHgwMGZmLAorCTB4MDBjOCwgMHg0MzY3LCAweDIwMDEsIDB4YTMwYywgMHgyMDA0LCAweGEwODQsIDB4MDAwMywgMHgwMDQwLAorCTB4NDJjMiwgMHgyMDAxLCAweGEzMGMsIDB4MjAwNCwgMHhkMDg0LCAweDAwYzAsIDB4NDM0MiwgMHhhMTg4LAorCTB4YTQzNCwgMHgyMTA0LCAweGEwNjUsIDB4MDA0MCwgMHg0MzQyLCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4ZSwgMHgwMDA2LCAweDAwYzAsIDB4NDM0MiwgMHg2MDAwLCAweGQwYzQsIDB4MDA0MCwgMHg0MzQyLAorCTB4MDA3OCwgMHg0MmNmLCAweGExODgsIDB4YTQzNCwgMHgyMTA0LCAweGEwNjUsIDB4MDA0MCwgMHg0MzI2LAorCTB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4ZSwgMHgwMDA2LCAweDAwYzAsIDB4NDMyYywgMHg2MGE0LAorCTB4YTAwZCwgMHgwMDQwLCAweDQyZDcsIDB4MTA3OCwgMHg0NzQ5LCAweDAwNDAsIDB4NDMyMCwgMHg2MGE4LAorCTB4YTAwZCwgMHgwMDQwLCAweDQyZjEsIDB4MTA3OCwgMHg0NzlhLCAweDAwYzAsIDB4NDJmMSwgMHg2OTRjLAorCTB4ZDFmYywgMHgwMGMwLCAweDQyZTcsIDB4MTA3OCwgMHg0NDFjLCAweDAwNzgsIDB4NDMxYiwgMHgxMDc4LAorCTB4NDNkNiwgMHg2OTRjLCAweGQxZWMsIDB4MDBjMCwgMHg0MzFiLCAweDEwNzgsIDB4NDYwYSwgMHgwMDc4LAorCTB4NDMxYiwgMHg2OTRjLCAweGExODQsIDB4YTAwMCwgMHgwMDQwLCAweDQzMGIsIDB4ZDFlYywgMHgwMDQwLAorCTB4NDMwNCwgMHhkMWZjLCAweDAwNDAsIDB4NDMwMCwgMHgxMDc4LCAweDQ2MWIsIDB4MDA3OCwgMHg0MzA3LAorCTB4MTA3OCwgMHg0NjFiLCAweDAwNzgsIDB4NDMwYiwgMHhkMWZjLCAweDAwNDAsIDB4NDMwYiwgMHgxMDc4LAorCTB4NDNkNiwgMHgwMDc4LCAweDQzMWIsIDB4NjA1MCwgMHhhMDBkLCAweDAwNDAsIDB4NDMxNiwgMHgyZDAwLAorCTB4MjAwYSwgMHg2ODAzLCAweDAwMDAsIDB4NjA1MiwgMHgwMDc4LCAweDQzMWIsIDB4MmQwMCwgMHg2MDUyLAorCTB4NjA0ZSwgMHg2ODAzLCAweDAwMDAsIDB4MTA3OCwgMHg1YzE3LCAweGEwMDYsIDB4MTI3ZiwgMHgwMDdjLAorCTB4MjAwMSwgMHgwMDA1LCAweDIwMDksIDB4MDAwMCwgMHgwMDc4LCAweDQzNmIsIDB4MjAwMSwgMHgwMDI4LAorCTB4MjAwOSwgMHgwMDAwLCAweDAwNzgsIDB4NDM2YiwgMHhhMDgyLCAweDAwMDYsIDB4MDBjOCwgMHg0MzQyLAorCTB4NjBhMCwgMHhkMGJjLCAweDAwYzAsIDB4NDMzZSwgMHg2MTAwLCAweGQxZmMsIDB4MDA0MCwgMHg0MmNmLAorCTB4MjAwMSwgMHgwMDI5LCAweDIwMDksIDB4MTAwMCwgMHgwMDc4LCAweDQzNmIsIDB4MjAwMSwgMHgwMDI4LAorCTB4MDA3OCwgMHg0MzVkLCAweDIwMDksIDB4YTMwYywgMHgyMTBjLCAweGQxOGMsIDB4MDA0MCwgMHg0MzRjLAorCTB4MjAwMSwgMHgwMDA0LCAweDAwNzgsIDB4NDM1ZCwgMHhkMTg0LCAweDAwNDAsIDB4NDM1MywgMHgyMDAxLAorCTB4MDAwNCwgMHgwMDc4LCAweDQzNWQsIDB4MjAwMSwgMHgwMDI5LCAweDYxMDAsIDB4ZDFmYywgMHgwMDQwLAorCTB4NDM1ZCwgMHgyMDA5LCAweDEwMDAsIDB4MDA3OCwgMHg0MzZiLCAweDIwMDksIDB4MDAwMCwgMHgwMDc4LAorCTB4NDM2YiwgMHgyMDAxLCAweDAwMjksIDB4MjAwOSwgMHgwMDAwLCAweDAwNzgsIDB4NDM2YiwgMHgyMDAxLAorCTB4MDAyOSwgMHgyMDA5LCAweDAwMDAsIDB4YTAwNSwgMHgxMjdmLCAweDAwN2MsIDB4Njk0NCwgMHg2ZTQ4LAorCTB4YTY4NCwgMHgzZmZmLCAweGEwODIsIDB4NDAwMCwgMHgwMGM4LCAweDQzYmIsIDB4YTE4YywgMHhmZjAwLAorCTB4ODEwZiwgMHhhMTgyLCAweDAwZmYsIDB4MDBjOCwgMHg0M2ExLCAweGExODgsIDB4YTQzNCwgMHgyMTA0LAorCTB4YTA2NSwgMHgwMDQwLCAweDQzYTEsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4ZSwgMHgwMDA2LAorCTB4MDBjMCwgMHg0M2E3LCAweDY4NGMsIDB4ZDBlYywgMHgwMDQwLCAweDQzOTQsIDB4MTA3OCwgMHg0NjFiLAorCTB4MTA3OCwgMHg0M2Q2LCAweDAwNzgsIDB4NDM5YywgMHgxMDc4LCAweDQzZDYsIDB4Njg0YywgMHhkMGZjLAorCTB4MDA0MCwgMHg0MzljLCAweDEwNzgsIDB4NDYwYSwgMHgxMDc4LCAweDQ2NjMsIDB4YTAwNiwgMHgwMDc4LAorCTB4NDNiZiwgMHgyMDAxLCAweDAwMjgsIDB4MjAwOSwgMHgwMDAwLCAweDAwNzgsIDB4NDNiZiwgMHhhMDgyLAorCTB4MDAwNiwgMHgwMGM4LCAweDQzYjUsIDB4NjEwMCwgMHhkMWZjLCAweDAwNDAsIDB4NDM4YSwgMHgyMDAxLAorCTB4MDAyOSwgMHgyMDA5LCAweDEwMDAsIDB4MDA3OCwgMHg0M2JmLCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LAorCTB4MDAwMCwgMHgwMDc4LCAweDQzYmYsIDB4MjAwMSwgMHgwMDI5LCAweDIwMDksIDB4MDAwMCwgMHhhMDA1LAorCTB4MDA3YywgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MDUwLCAweGEwMGQsIDB4MDA0MCwgMHg0M2NmLAorCTB4MmQwMCwgMHgyMDBhLCAweDY4MDMsIDB4MDAwMCwgMHg2MDUyLCAweDEyN2YsIDB4MDA3YywgMHgyZDAwLAorCTB4NjA1MiwgMHg2MDRlLCAweDY4MDMsIDB4MDAwMCwgMHgwMDc4LCAweDQzY2QsIDB4MTI3ZSwgMHgyMDkxLAorCTB4ODAwMCwgMHg2MDRjLCAweGEwMDUsIDB4MDA0MCwgMHg0M2VjLCAweDBlN2UsIDB4MjA3MSwgMHhhNWFiLAorCTB4NzAwNCwgMHhhMDg2LCAweDAwMDIsIDB4MDA0MCwgMHg0M2YzLCAweDBlN2YsIDB4NjA0YywgMHg2ODAyLAorCTB4MmQwMCwgMHg2MDRlLCAweDEyN2YsIDB4MDA3YywgMHgyZDAwLCAweDYwNTIsIDB4NjA0ZSwgMHg2ODAzLAorCTB4MDAwMCwgMHgwMDc4LCAweDQzZWEsIDB4NzAxYywgMHhhYzA2LCAweDAwYzAsIDB4NDNlNSwgMHg2MDRjLAorCTB4MjA3MCwgMHg3MDAwLCAweDY4MDIsIDB4MmQwMCwgMHg3MDAyLCAweDBlN2YsIDB4MTI3ZiwgMHgwMDdjLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjA0YywgMHhhMDZkLCAweDAwNDAsIDB4NDQwZSwgMHg2ODAwLAorCTB4YTAwNSwgMHgwMGMwLCAweDQ0MGMsIDB4NjA1MiwgMHg2MDRlLCAweGFkMDUsIDB4MTI3ZiwgMHgwMDdjLAorCTB4NjA0YywgMHhhMDZkLCAweDAwNDAsIDB4NDQxYiwgMHg2ODAwLCAweGEwMDUsIDB4MDBjMCwgMHg0NDE5LAorCTB4NjA1MiwgMHg2MDRlLCAweGFkMDUsIDB4MDA3YywgMHg2ODAzLCAweDAwMDAsIDB4NjA4NCwgMHhhMDBkLAorCTB4MDA0MCwgMHg0NDI2LCAweDJkMDAsIDB4MjAwYSwgMHg2MDg2LCAweDAwN2MsIDB4MmQwMCwgMHg2MDg2LAorCTB4NjA4MiwgMHgwMDc4LCAweDQ0MjUsIDB4MTI3ZSwgMHgwYzdlLCAweDAyN2UsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjIxOCwgMHgyMjYwLCAweDYyMDAsIDB4YTAwNSwgMHgwMDQwLCAweDQ0MzksIDB4YzI4NSwgMHgwMDc4LAorCTB4NDQzYSwgMHhjMjg0LCAweDYyMDIsIDB4MDI3ZiwgMHgwYzdmLCAweDEyN2YsIDB4MDA3YywgMHgxMjdlLAorCTB4MGM3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjIxOCwgMHgyMjYwLCAweDYyMDQsIDB4MDA3ZSwgMHhhMDg2LAorCTB4MDAwNiwgMHgwMGMwLCAweDQ0NWUsIDB4NjA5YywgMHhkMGFjLCAweDAwNDAsIDB4NDQ1ZSwgMHgyMDAxLAorCTB4YTM1MiwgMHgyMDA0LCAweGQwYTQsIDB4MDA0MCwgMHg0NDVlLCAweGEyODQsIDB4ZmYwMCwgMHg4MDA3LAorCTB4YTA4NiwgMHgwMDA3LCAweDAwYzAsIDB4NDQ1ZSwgMHgyMDExLCAweDA2MDAsIDB4MDA3ZiwgMHhhMjk0LAorCTB4ZmYwMCwgMHhhMjE1LCAweDYyMDYsIDB4MDA3ZSwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHg0NDZlLAorCTB4NjI5MCwgMHg4MmZmLCAweDAwYzAsIDB4NDQ2ZSwgMHgxMDc4LCAweDEzMjgsIDB4MDA3ZiwgMHgwYzdmLAorCTB4MTI3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MGM3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjIxOCwgMHgyMjYwLAorCTB4NjIwNCwgMHgwMDdlLCAweGEwODYsIDB4MDAwNiwgMHgwMGMwLCAweDQ0OTAsIDB4NjA5YywgMHhkMGE0LAorCTB4MDA0MCwgMHg0NDkwLCAweDIwMDEsIDB4YTM1MiwgMHgyMDA0LCAweGQwYWMsIDB4MDBjMCwgMHg0NDkwLAorCTB4YTI4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNywgMHgwMGMwLCAweDQ0OTAsIDB4MjAxMSwgMHgwMDA2LAorCTB4MDA3ZiwgMHhhMjk0LCAweDAwZmYsIDB4ODAwNywgMHhhMjE1LCAweDYyMDYsIDB4MGM3ZiwgMHgxMjdmLAorCTB4MDA3YywgMHgwMjdlLCAweGExODIsIDB4MDBmZiwgMHgwMDQ4LCAweDQ0YTIsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDA3OCwgMHg0NGJhLCAweGExOTAsIDB4YTQzNCwgMHgyMjA0LCAweGEwNjUsIDB4MDBjMCwgMHg0NGI5LAorCTB4MDE3ZSwgMHgwZDdlLCAweDEwNzgsIDB4MTM2NiwgMHgyZDYwLCAweDBkN2YsIDB4MDE3ZiwgMHgwMDQwLAorCTB4NDQ5ZSwgMHgyYzAwLCAweDIwMTIsIDB4NjBhNywgMHgwMDAwLCAweDYwYWIsIDB4MDAwMCwgMHgxMDc4LAorCTB4NDIzNSwgMHhhMDA2LCAweDAyN2YsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwMjdlLAorCTB4YTE4MiwgMHgwMGZmLCAweDAwNDgsIDB4NDRjOCwgMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwgMHg0NGZlLAorCTB4MGQ3ZSwgMHhhMTkwLCAweGE0MzQsIDB4MjIwNCwgMHhhMDZkLCAweDAwNDAsIDB4NDRmYywgMHgyMDEzLAorCTB4MDAwMCwgMHgwZDdlLCAweDBjN2UsIDB4MmQ2MCwgMHg2MGE0LCAweGEwNmQsIDB4MDA0MCwgMHg0NGRhLAorCTB4MTA3OCwgMHgxMzlhLCAweDYwYTgsIDB4YTA2ZCwgMHgwMDQwLCAweDQ0ZTAsIDB4MTA3OCwgMHgxMzlhLAorCTB4MGM3ZiwgMHgwZDdmLCAweDBkN2UsIDB4MGM3ZSwgMHg2OGFjLCAweDIwNjAsIDB4OGNmZiwgMHgwMDQwLAorCTB4NDRmOCwgMHg2MDBjLCAweDAwN2UsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsIDB4OGE0NCwgMHgwMDQwLAorCTB4NDRmMywgMHgxMDc4LCAweDEzYWEsIDB4MTA3OCwgMHg3NTNkLCAweDBjN2YsIDB4MDA3OCwgMHg0NGU2LAorCTB4MGM3ZiwgMHgwZDdmLCAweDEwNzgsIDB4MTM5YSwgMHgwZDdmLCAweGEwMDYsIDB4MDI3ZiwgMHgxMjdmLAorCTB4MDA3YywgMHgwMTdlLCAweGExODIsIDB4MDBmZiwgMHgwMDQ4LCAweDQ1MGEsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDA3OCwgMHg0NTExLCAweGExODgsIDB4YTQzNCwgMHgyMTA0LCAweGEwNjUsIDB4MDA0MCwgMHg0NTA2LAorCTB4YTAwNiwgMHgwMTdmLCAweDAwN2MsIDB4MGQ3ZSwgMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHg2MDBiLAorCTB4MDAwMCwgMHg2MDBmLCAweDAwMDAsIDB4NjAwMCwgMHhjMDhjLCAweDYwMDIsIDB4MjA2OSwgMHhhODhlLAorCTB4NjgwOCwgMHg2MDVlLCAweDY4MTAsIDB4NjA2MiwgMHg2MTM4LCAweGExMGEsIDB4MDA0OCwgMHg0NTI5LAorCTB4NjAzYSwgMHg2ODE0LCAweDYwNjYsIDB4MjA5OSwgMHhhODk2LCAweGFjODgsIDB4MDAwYSwgMHgyMWEwLAorCTB4MjBhOSwgMHgwMDA0LCAweDUzYTMsIDB4MjA5OSwgMHhhODlhLCAweGFjODgsIDB4MDAwNiwgMHgyMWEwLAorCTB4MjBhOSwgMHgwMDA0LCAweDUzYTMsIDB4MjA2OSwgMHhhOGFlLCAweDY4MDgsIDB4NjA2YSwgMHg2OTBjLAorCTB4NjE2ZSwgMHg2ODEwLCAweDYwNzIsIDB4NjgxOCwgMHg2MDc2LCAweGExODIsIDB4MDIxMSwgMHgwMGM4LAorCTB4NDU0ZCwgMHgyMDA5LCAweDAwMDgsIDB4MDA3OCwgMHg0NTc3LCAweGExODIsIDB4MDI1OSwgMHgwMGM4LAorCTB4NDU1NSwgMHgyMDA5LCAweDAwMDcsIDB4MDA3OCwgMHg0NTc3LCAweGExODIsIDB4MDJjMSwgMHgwMGM4LAorCTB4NDU1ZCwgMHgyMDA5LCAweDAwMDYsIDB4MDA3OCwgMHg0NTc3LCAweGExODIsIDB4MDM0OSwgMHgwMGM4LAorCTB4NDU2NSwgMHgyMDA5LCAweDAwMDUsIDB4MDA3OCwgMHg0NTc3LCAweGExODIsIDB4MDQyMSwgMHgwMGM4LAorCTB4NDU2ZCwgMHgyMDA5LCAweDAwMDQsIDB4MDA3OCwgMHg0NTc3LCAweGExODIsIDB4MDU4MSwgMHgwMGM4LAorCTB4NDU3NSwgMHgyMDA5LCAweDAwMDMsIDB4MDA3OCwgMHg0NTc3LCAweDIwMDksIDB4MDAwMiwgMHg2MTkyLAorCTB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDAxN2UsIDB4MDI3ZSwgMHgwZTdlLAorCTB4MjA3MSwgMHhhODhkLCAweDJlMDQsIDB4Njg5NiwgMHgyMDcxLCAweGE4OGUsIDB4NzAwNCwgMHg2ODlhLAorCTB4NzAxYywgMHg2ODllLCAweDZhMDAsIDB4MjAwOSwgMHhhMzcxLCAweDIxMGMsIDB4ZDBiYywgMHgwMDQwLAorCTB4NDU5NywgMHhkMWVjLCAweDAwNDAsIDB4NDU5NywgMHhjMmFkLCAweDAwNzgsIDB4NDU5OCwgMHhjMmFjLAorCTB4ZDBjNCwgMHgwMDQwLCAweDQ1YTEsIDB4ZDFlNCwgMHgwMDQwLCAweDQ1YTEsIDB4YzJiZCwgMHgwMDc4LAorCTB4NDVhMiwgMHhjMmJjLCAweDZhMDIsIDB4MGU3ZiwgMHgwMjdmLCAweDAxN2YsIDB4MDA3YywgMHgwZDdlLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjBhNCwgMHhhMDZkLCAweDAwNDAsIDB4NDVjYiwgMHg2OTAwLAorCTB4ODFmZiwgMHgwMGMwLCAweDQ1ZGYsIDB4NmEwNCwgMHhhMjgyLCAweDAwMTAsIDB4MDBjOCwgMHg0NWU0LAorCTB4YWQ4OCwgMHgwMDA0LCAweDIwYTksIDB4MDAxMCwgMHgyMTA0LCAweGEwODYsIDB4ZmZmZiwgMHgwMDQwLAorCTB4NDVjNiwgMHg4MTA4LCAweDAwZjAsIDB4NDViYywgMHgxMDc4LCAweDEzMjgsIDB4MjYwYSwgMHg4MjEwLAorCTB4NmEwNiwgMHgwMDc4LCAweDQ1ZGYsIDB4MTA3OCwgMHgxMzgxLCAweDAwNDAsIDB4NDVlNCwgMHgyZDAwLAorCTB4NjBhNiwgMHg2ODAzLCAweDAwMDAsIDB4YWQ4OCwgMHgwMDA0LCAweDIwYTksIDB4MDAxMCwgMHgyMDBiLAorCTB4ZmZmZiwgMHg4MTA4LCAweDAwZjAsIDB4NDVkNywgMHg2ODA3LCAweDAwMDEsIDB4NmUxMiwgMHhhMDg1LAorCTB4MDAwMSwgMHgxMjdmLCAweDBkN2YsIDB4MDA3YywgMHhhMDA2LCAweDAwNzgsIDB4NDVlMSwgMHgxMjdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDBkN2UsIDB4NjBhNCwgMHhhMDBkLCAweDAwNDAsIDB4NDYwNywgMHgyMTY4LAorCTB4NjgwMCwgMHhhMDA1LCAweDAwYzAsIDB4NDYwMywgMHgxMDc4LCAweDQ3NDksIDB4MDBjMCwgMHg0NjA3LAorCTB4MjAwYiwgMHhmZmZmLCAweDY4MDQsIDB4YTA4YSwgMHgwMDAyLCAweDAwNDgsIDB4NDYwMywgMHg4MDAxLAorCTB4NjgwNiwgMHgwMDc4LCAweDQ2MDcsIDB4MTA3OCwgMHgxMzlhLCAweDYwYTcsIDB4MDAwMCwgMHgwZDdmLAorCTB4MTI3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4NDdhZiwgMHgwMDc4LAorCTB4NDYxMywgMHgxMDc4LCAweDQzYzEsIDB4MTA3OCwgMHg0NmE3LCAweDAwYzAsIDB4NDYxMSwgMHgxMDc4LAorCTB4NDY2MywgMHgxMjdmLCAweDAwN2MsIDB4MGQ3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MGE4LAorCTB4YTA2ZCwgMHgwMDQwLCAweDQ2M2YsIDB4Njk1MCwgMHg4MWZmLCAweDAwYzAsIDB4NDY1MywgMHg2YTU0LAorCTB4YTI4MiwgMHgwMDEwLCAweDAwYzgsIDB4NDY2MCwgMHhhZDg4LCAweDAwMTgsIDB4MjBhOSwgMHgwMDEwLAorCTB4MjEwNCwgMHhhMDg2LCAweGZmZmYsIDB4MDA0MCwgMHg0NjNhLCAweDgxMDgsIDB4MDBmMCwgMHg0NjMwLAorCTB4MTA3OCwgMHgxMzI4LCAweDI2MGEsIDB4ODIxMCwgMHg2YTU2LCAweDAwNzgsIDB4NDY1MywgMHgxMDc4LAorCTB4MTM4MSwgMHgwMDQwLCAweDQ2NjAsIDB4MmQwMCwgMHg2MGFhLCAweDY4NTMsIDB4MDAwMCwgMHhhZDg4LAorCTB4MDAxOCwgMHgyMGE5LCAweDAwMTAsIDB4MjAwYiwgMHhmZmZmLCAweDgxMDgsIDB4MDBmMCwgMHg0NjRiLAorCTB4Njg1NywgMHgwMDAxLCAweDZlNjIsIDB4MDA3OCwgMHg0NjU3LCAweDEwNzgsIDB4NDQxYywgMHgxMDc4LAorCTB4NDY2ZCwgMHgwMGMwLCAweDQ2NTUsIDB4YTA4NSwgMHgwMDAxLCAweDEyN2YsIDB4MGQ3ZiwgMHgwMDdjLAorCTB4YTAwNiwgMHgwMDc4LCAweDQ2NWQsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg1YzE3LAorCTB4MTI3ZiwgMHgwMDdjLCAweGEwMWUsIDB4MDA3OCwgMHg0NjZmLCAweDIwMTksIDB4MDAwMSwgMHhhMDBlLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjA0YywgMHgyMDY4LCAweDYwMDAsIDB4ZDBkYywgMHgwMGMwLAorCTB4NDY4ZCwgMHg4ZGZmLCAweDAwNDAsIDB4NDZhMiwgMHg4M2ZmLCAweDAwNDAsIDB4NDY4NSwgMHg2ODQ4LAorCTB4YTYwNiwgMHgwMDQwLCAweDQ2OTIsIDB4MDA3OCwgMHg0NjhkLCAweDY4M2MsIDB4YTQwNiwgMHgwMGMwLAorCTB4NDY4ZCwgMHg2ODQwLCAweGE1MDYsIDB4MDA0MCwgMHg0NjkyLCAweDJkMDgsIDB4NjgwMCwgMHgyMDY4LAorCTB4MDA3OCwgMHg0Njc5LCAweDZhMDAsIDB4NjA0YywgMHhhZDA2LCAweDAwYzAsIDB4NDY5YSwgMHg2MjRlLAorCTB4MDA3OCwgMHg0NjlkLCAweGExODAsIDB4MDAwMCwgMHgyMjAyLCAweDgyZmYsIDB4MDBjMCwgMHg0NmEyLAorCTB4NjE1MiwgMHg4ZGZmLCAweDEyN2YsIDB4MDA3YywgMHhhMDFlLCAweDAwNzgsIDB4NDZhOSwgMHgyMDE5LAorCTB4MDAwMSwgMHhhMDBlLCAweDYwODAsIDB4MjA2OCwgMHg4ZGZmLCAweDAwNDAsIDB4NDZkNSwgMHg4M2ZmLAorCTB4MDA0MCwgMHg0NmI4LCAweDY4NDgsIDB4YTYwNiwgMHgwMDQwLCAweDQ2YzUsIDB4MDA3OCwgMHg0NmMwLAorCTB4NjgzYywgMHhhNDA2LCAweDAwYzAsIDB4NDZjMCwgMHg2ODQwLCAweGE1MDYsIDB4MDA0MCwgMHg0NmM1LAorCTB4MmQwOCwgMHg2ODAwLCAweDIwNjgsIDB4MDA3OCwgMHg0NmFjLCAweDZhMDAsIDB4NjA4MCwgMHhhZDA2LAorCTB4MDBjMCwgMHg0NmNkLCAweDYyODIsIDB4MDA3OCwgMHg0NmQwLCAweGExODAsIDB4MDAwMCwgMHgyMjAyLAorCTB4ODJmZiwgMHgwMGMwLCAweDQ2ZDUsIDB4NjE4NiwgMHg4ZGZmLCAweDAwN2MsIDB4YTAxNiwgMHgxMDc4LAorCTB4NDc0MiwgMHgwMGMwLCAweDQ2ZGQsIDB4MjAxMSwgMHgwMDAxLCAweDEwNzgsIDB4NDc5MywgMHgwMGMwLAorCTB4NDZlMywgMHhhMjk1LCAweDAwMDIsIDB4MDA3YywgMHgxMDc4LCAweDQ3Y2IsIDB4MDA0MCwgMHg0NmVjLAorCTB4MTA3OCwgMHg4YjEyLCAweDAwNzgsIDB4NDZlZSwgMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHgxMDc4LAorCTB4NDdjYiwgMHgwMDQwLCAweDQ2ZjcsIDB4MTA3OCwgMHg4YWFhLCAweDAwNzgsIDB4NDZmOSwgMHhhMDg1LAorCTB4MDAwMSwgMHgwMDdjLCAweDEwNzgsIDB4NDdjYiwgMHgwMDQwLCAweDQ3MDIsIDB4MTA3OCwgMHg4YWY0LAorCTB4MDA3OCwgMHg0NzA0LCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweDEwNzgsIDB4NDdjYiwgMHgwMDQwLAorCTB4NDcwZCwgMHgxMDc4LCAweDhhYzYsIDB4MDA3OCwgMHg0NzBmLCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLAorCTB4MTA3OCwgMHg0N2NiLCAweDAwNDAsIDB4NDcxOCwgMHgxMDc4LCAweDhiMzAsIDB4MDA3OCwgMHg0NzFhLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwN2MsIDB4MTI3ZSwgMHgwMDdlLCAweDBkN2UsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjA4MCwgMHhhMDZkLCAweDAwNDAsIDB4NDczYSwgMHg2ODAwLCAweDAwN2UsIDB4NjgzNywgMHgwMTAzLAorCTB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsIDB4MTA3OCwgMHg4Y2I4LCAweDAwN2UsIDB4NjAwMCwgMHhkMGZjLAorCTB4MDA0MCwgMHg0NzM0LCAweDEwNzgsIDB4YTE4YywgMHgwMDdmLCAweDEwNzgsIDB4NDk4MiwgMHgwMDdmLAorCTB4MDA3OCwgMHg0NzIxLCAweDYwODMsIDB4MDAwMCwgMHg2MDg3LCAweDAwMDAsIDB4MGQ3ZiwgMHgwMDdmLAorCTB4MTI3ZiwgMHgwMDdjLCAweDYwYTQsIDB4YTAwZCwgMHgwMGMwLCAweDQ3NDksIDB4YTA4NSwgMHgwMDAxLAorCTB4MDA3YywgMHgwZTdlLCAweDIxNzAsIDB4NzAwMCwgMHhhMDA1LCAweDAwYzAsIDB4NDc1YywgMHgyMGE5LAorCTB4MDAxMCwgMHhhZTg4LCAweDAwMDQsIDB4MjEwNCwgMHhhNjA2LCAweDAwNDAsIDB4NDc1YywgMHg4MTA4LAorCTB4MDBmMCwgMHg0NzUzLCAweGEwODUsIDB4MDAwMSwgMHhhMDA2LCAweDBlN2YsIDB4MDA3YywgMHgwZDdlLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjBhNCwgMHhhMDZkLCAweDAwYzAsIDB4NDc2ZCwgMHgxMDc4LAorCTB4MTM4MSwgMHgwMDQwLCAweDQ3N2YsIDB4MmQwMCwgMHg2MGE2LCAweDY4MDMsIDB4MDAwMSwgMHg2ODA3LAorCTB4MDAwMCwgMHhhZDg4LCAweDAwMDQsIDB4MjBhOSwgMHgwMDEwLCAweDIwMGIsIDB4ZmZmZiwgMHg4MTA4LAorCTB4MDBmMCwgMHg0Nzc1LCAweGEwODUsIDB4MDAwMSwgMHgxMjdmLCAweDBkN2YsIDB4MDA3YywgMHhhMDA2LAorCTB4MDA3OCwgMHg0NzdjLCAweDBkN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjBhNCwgMHhhMDZkLAorCTB4MDA0MCwgMHg0NzkwLCAweDYwYTcsIDB4MDAwMCwgMHgxMDc4LCAweDEzOWEsIDB4YTA4NSwgMHgwMDAxLAorCTB4MTI3ZiwgMHgwZDdmLCAweDAwN2MsIDB4NjBhOCwgMHhhMDBkLCAweDAwYzAsIDB4NDc5YSwgMHhhMDg1LAorCTB4MDAwMSwgMHgwMDdjLCAweDBlN2UsIDB4MjE3MCwgMHg3MDUwLCAweGEwMDUsIDB4MDBjMCwgMHg0N2FkLAorCTB4MjBhOSwgMHgwMDEwLCAweGFlODgsIDB4MDAxOCwgMHgyMTA0LCAweGE2MDYsIDB4MDA0MCwgMHg0N2FkLAorCTB4ODEwOCwgMHgwMGYwLCAweDQ3YTQsIDB4YTA4NSwgMHgwMDAxLCAweDBlN2YsIDB4MDA3YywgMHgxMjdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4NDc5MywgMHgwMGMwLCAweDQ3YzksIDB4MjAwYiwgMHhmZmZmLAorCTB4MGQ3ZSwgMHg2MGE4LCAweDIwNjgsIDB4Njg1NCwgMHhhMDhhLCAweDAwMDIsIDB4MDA0OCwgMHg0N2M0LAorCTB4ODAwMSwgMHg2ODU2LCAweDAwNzgsIDB4NDdjOCwgMHgxMDc4LCAweDEzOWEsIDB4NjBhYiwgMHgwMDAwLAorCTB4MGQ3ZiwgMHgxMjdmLCAweDAwN2MsIDB4NjA5YywgMHhkMGE0LCAweDAwN2MsIDB4MGY3ZSwgMHg3MWFjLAorCTB4ODFmZiwgMHgwMGMwLCAweDQ3ZTksIDB4NzFjOCwgMHhkMTljLCAweDAwNDAsIDB4NDdlOSwgMHgyMDAxLAorCTB4MDA3ZSwgMHhhMDgwLCAweGE0MzQsIDB4MjAwNCwgMHhhMDdkLCAweDAwNDAsIDB4NDdlOSwgMHg3ODA0LAorCTB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgwMGMwLCAweDQ3ZTksIDB4NzgwMCwgMHhjMGVkLAorCTB4NzgwMiwgMHgyMDc5LCAweGEzNTEsIDB4NzgwNCwgMHhkMGE0LCAweDAwNDAsIDB4NDgwZiwgMHgxNTdlLAorCTB4MGM3ZSwgMHgyMGE5LCAweDAwN2YsIDB4MjAwOSwgMHgwMDAwLCAweDAxN2UsIDB4MTA3OCwgMHg0NTAxLAorCTB4MDBjMCwgMHg0ODA5LCAweDYwMDQsIDB4YTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4YTA5NiwgMHgwMDA0LAorCTB4MDA0MCwgMHg0ODA2LCAweGEwODYsIDB4MDAwNiwgMHgwMGMwLCAweDQ4MDksIDB4NjAwMCwgMHhjMGVkLAorCTB4NjAwMiwgMHgwMTdmLCAweDgxMDgsIDB4MDBmMCwgMHg0N2Y1LCAweDBjN2YsIDB4MTU3ZiwgMHgxMDc4LAorCTB4NDg5NywgMHgwMDQwLCAweDQ4MTgsIDB4MjAwMSwgMHhhNTlmLCAweDIwMGMsIDB4MDA3OCwgMHg0ODIwLAorCTB4MjA3OSwgMHhhMzUxLCAweDc4MDQsIDB4ZDBhNCwgMHgwMDQwLCAweDQ4MjQsIDB4MjAwOSwgMHgwN2QwLAorCTB4MjAxMSwgMHg0ODI2LCAweDEwNzgsIDB4NTk2YywgMHgwZjdmLCAweDAwN2MsIDB4MjAxMSwgMHg0ODI2LAorCTB4MTA3OCwgMHg1OGQ0LCAweDEwNzgsIDB4NDg5NywgMHgwMDQwLCAweDQ4NGUsIDB4MjAwMSwgMHhhNGIyLAorCTB4MjAwNCwgMHhhMDgwLCAweDAwMDAsIDB4MjAwYywgMHhjMWVjLCAweDIxMDIsIDB4MjAwMSwgMHhhMzUyLAorCTB4MjAwNCwgMHhkMGE0LCAweDAwNDAsIDB4NDg0MiwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwgMHg0ODI2LAorCTB4MTA3OCwgMHg1OTZjLCAweDBlN2UsIDB4MjA3MSwgMHhhMzAwLCAweDcwNmIsIDB4MDAwMCwgMHg3MDZmLAorCTB4MDAwMCwgMHgxMDc4LCAweDI2MGQsIDB4MGU3ZiwgMHgwMDc4LCAweDQ4ODYsIDB4MTU3ZSwgMHgwYzdlLAorCTB4MjBhOSwgMHgwMDdmLCAweDIwMDksIDB4MDAwMCwgMHgwMTdlLCAweDEwNzgsIDB4NDUwMSwgMHgwMGMwLAorCTB4NDg4MCwgMHg2MDAwLCAweGQwZWMsIDB4MDA0MCwgMHg0ODgwLCAweDA0N2UsIDB4NjJhMCwgMHhhMjk0LAorCTB4MDBmZiwgMHg4MjI3LCAweGEwMDYsIDB4MjAwOSwgMHgwMDI5LCAweDEwNzgsIDB4OWVjMCwgMHg2MDAwLAorCTB4YzBlNSwgMHhjMGVjLCAweDYwMDIsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NSwgMHgwNzAwLAorCTB4NjAwNiwgMHgyMDE5LCAweDAwMjksIDB4MTA3OCwgMHg1ZDUzLCAweDA3N2UsIDB4MjAzOSwgMHgwMDAwLAorCTB4MTA3OCwgMHg1Yzc4LCAweDIwMDksIDB4MDAwMCwgMHgxMDc4LCAweDljMzgsIDB4MDc3ZiwgMHgwNDdmLAorCTB4MDE3ZiwgMHg4MTA4LCAweDAwZjAsIDB4NDg1NCwgMHgwYzdmLCAweDE1N2YsIDB4MDA3YywgMHgwYzdlLAorCTB4NjAxOCwgMHgyMDYwLCAweDYwMDAsIDB4YzBlYywgMHg2MDAyLCAweDBjN2YsIDB4MDA3YywgMHg3ODE4LAorCTB4MjAwNCwgMHhkMGFjLCAweDAwN2MsIDB4NzgxOCwgMHgyMDA0LCAweGQwYmMsIDB4MDA3YywgMHgwZjdlLAorCTB4MjAwMSwgMHhhNGIyLCAweDIwMDQsIDB4YTA3ZCwgMHgwMDQwLCAweDQ4YTAsIDB4NzgwMCwgMHhkMGVjLAorCTB4MGY3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MDI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjIwMCwgMHhhMDA1LAorCTB4MDA0MCwgMHg0OGFkLCAweGMyZmQsIDB4MDA3OCwgMHg0OGFlLCAweGMyZmMsIDB4NjIwMiwgMHgwMjdmLAorCTB4MTI3ZiwgMHgwMDdjLCAweDIwNzEsIDB4YTQxMywgMHg3MDAzLCAweDAwMDEsIDB4NzAwNywgMHgwMDAwLAorCTB4NzAxMywgMHgwMDAwLCAweDcwMTcsIDB4MDAwMCwgMHg3MDFiLCAweDAwMDAsIDB4NzAxZiwgMHgwMDAwLAorCTB4NzAwYiwgMHgwMDAwLCAweDcwNGIsIDB4MDAwMSwgMHg3MDRmLCAweDAwMDAsIDB4NzA1YiwgMHgwMDIwLAorCTB4NzA1ZiwgMHgwMDQwLCAweDcwN2YsIDB4MDAwMCwgMHgyMDcxLCAweGE1N2MsIDB4NzAwMywgMHhhNDEzLAorCTB4NzAwNywgMHgwMDAwLCAweDcwMGIsIDB4MDAwMCwgMHg3MDBmLCAweGE1NWMsIDB4NzAxMywgMHgwMDIwLAorCTB4NzAxNywgMHgwMDQwLCAweDcwMzcsIDB4MDAwMCwgMHgwMDdjLCAweDAxN2UsIDB4MGU3ZSwgMHgyMDcxLAorCTB4YTUzNCwgMHhhMDBlLCAweDcxODYsIDB4NzE4YSwgMHg3MDk3LCAweDAwMDEsIDB4MjAwMSwgMHhhMzUyLAorCTB4MjAwNCwgMHhkMGZjLCAweDAwYzAsIDB4NDhmNywgMHgyMDAxLCAweGEzNTIsIDB4MjAwNCwgMHhhMDBlLAorCTB4ZDA5YywgMHgwMDQwLCAweDQ4ZjQsIDB4ODEwOCwgMHg3MTAyLCAweDAwNzgsIDB4NDk0YSwgMHgyMDAxLAorCTB4YTM3MSwgMHgyMDBjLCAweGExODQsIDB4MDAwZiwgMHgyMDA5LCAweGEzNzIsIDB4MjEwYywgMHgwMDc5LAorCTB4NDkwMSwgMHg0OGVjLCAweDQ5MjIsIDB4NDkyYSwgMHg0OTM1LCAweDQ5M2IsIDB4NDhlYywgMHg0OGVjLAorCTB4NDhlYywgMHg0OTExLCAweDQ4ZWMsIDB4NDhlYywgMHg0OGVjLCAweDQ4ZWMsIDB4NDhlYywgMHg0OGVjLAorCTB4NDhlYywgMHg3MDAzLCAweDAwMDQsIDB4MTM3ZSwgMHgxNDdlLCAweDE1N2UsIDB4MjA5OSwgMHhhMzc1LAorCTB4MjBhMSwgMHhhNTg1LCAweDIwYTksIDB4MDAwNCwgMHg1M2EzLCAweDE1N2YsIDB4MTQ3ZiwgMHgxMzdmLAorCTB4MDA3OCwgMHg0OTRhLCAweDcwOGYsIDB4MDAwNSwgMHg3MDA3LCAweDAxMjIsIDB4MjAwMSwgMHgwMDAyLAorCTB4MDA3OCwgMHg0OTMwLCAweDcwOGYsIDB4MDAwMiwgMHg3MDA3LCAweDAxMjEsIDB4MjAwMSwgMHgwMDAzLAorCTB4NzAwMiwgMHg3MDk3LCAweDAwMDEsIDB4MDA3OCwgMHg0OTQ3LCAweDcwMDcsIDB4MDEyMiwgMHgyMDAxLAorCTB4MDAwMiwgMHgwMDc4LCAweDQ5M2YsIDB4NzAwNywgMHgwMTIxLCAweDIwMDEsIDB4MDAwMywgMHg3MDAyLAorCTB4YTAwNiwgMHg3MDk2LCAweDcwOGUsIDB4YTE4NCwgMHhmZjAwLCAweDgwMDcsIDB4NzA5YSwgMHhhMTg0LAorCTB4MDBmZiwgMHg3MDkyLCAweDBlN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhNDEzLAorCTB4Njg0YywgMHhhMDA1LCAweDAwYzAsIDB4NDk1YiwgMHg3MDI4LCAweGMwODUsIDB4NzAyYSwgMHhhMDg1LAorCTB4MDAwMSwgMHgwMDc4LCAweDQ5ODAsIDB4NmE2MCwgMHg3MjM2LCAweDZiNjQsIDB4NzMzYSwgMHg2ODY4LAorCTB4NzAzZSwgMHg3MDc2LCAweDY4NmMsIDB4NzA0MiwgMHg3MDdhLCAweDY4NGMsIDB4NzAyZSwgMHg2ODQ0LAorCTB4NzAzMiwgMHgyMDA5LCAweDAwMGQsIDB4MjAwYSwgMHg3MDBiLCAweDAwMDAsIDB4ODAwNywgMHg4MDA2LAorCTB4ODAwNiwgMHhhMDhjLCAweDAwM2YsIDB4YTA4NCwgMHhmZmMwLCAweGEyMTAsIDB4MjEwMCwgMHhhMzE5LAorCTB4NzI2ZSwgMHg3MzcyLCAweDcwMjgsIDB4YzA4NCwgMHg3MDJhLCAweDcwMDcsIDB4MDAwMSwgMHhhMDA2LAorCTB4MGU3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MDI3ZSwgMHg2ODM4LCAweGQwZmMsIDB4MDBjMCwgMHg0OWQ4LAorCTB4NjgwNCwgMHhhMDBkLCAweDAwNDAsIDB4NDk5ZSwgMHgwZDdlLCAweDIwNzEsIDB4YTMwMCwgMHhhMDE2LAorCTB4NzAyYywgMHgyMTY4LCAweDY5MDQsIDB4MjA2YSwgMHg4MjEwLCAweDJkMDAsIDB4ODFmZiwgMHgwMGMwLAorCTB4NDk5MSwgMHg3MDJlLCAweDcwYTgsIDB4YTIwMCwgMHg3MGFhLCAweDBkN2YsIDB4MjA3MSwgMHhhNDEzLAorCTB4NzAxYywgMHhhMDA1LCAweDAwYzAsIDB4NDllYSwgMHgwMDY4LCAweDQ5ZTgsIDB4MjA3MSwgMHhhNTM0LAorCTB4NzIwMCwgMHg4MmZmLCAweDAwNDAsIDB4NDllOCwgMHg2OTM0LCAweGExODYsIDB4MDEwMywgMHgwMGMwLAorCTB4NDlmYiwgMHg2OTQ4LCAweDY4NDQsIDB4YTEwNSwgMHgwMGMwLCAweDQ5ZGIsIDB4MjAwOSwgMHg4MDIwLAorCTB4MjIwMCwgMHgwMDc5LCAweDQ5YmIsIDB4NDllOCwgMHg0OWMwLCAweDRhMTgsIDB4NGEyNiwgMHg0OWU4LAorCTB4MjA3MSwgMHgwMDAwLCAweDcwMTgsIDB4ZDA4NCwgMHgwMGMwLCAweDQ5ZTgsIDB4NzEyMiwgMHg2ODNjLAorCTB4NzAyNiwgMHg2ODQwLCAweDcwMmEsIDB4NzAxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgyMDcxLAorCTB4YTMwMCwgMHg3MDJjLCAweDIwNmEsIDB4MmQwMCwgMHg3MDJlLCAweDcwYTgsIDB4ODAwMCwgMHg3MGFhLAorCTB4MDI3ZiwgMHgwZTdmLCAweDAwN2MsIDB4Njg0NCwgMHhhMDg2LCAweDAxMDAsIDB4MDBjMCwgMHg0OWU4LAorCTB4Njg2OCwgMHhhMDA1LCAweDAwYzAsIDB4NDllOCwgMHgyMDA5LCAweDgwMjAsIDB4MDA3OCwgMHg0OWI4LAorCTB4MjA3MSwgMHhhNDEzLCAweDJkMDgsIDB4MjA2YiwgMHgwMDAwLCAweDcwMTAsIDB4ODAwMCwgMHg3MDEyLAorCTB4NzAxOCwgMHhhMDZkLCAweDcxMWEsIDB4MDA0MCwgMHg0OWY4LCAweDY5MDIsIDB4MDA3OCwgMHg0OWY5LAorCTB4NzExZSwgMHgwMDc4LCAweDQ5ZDgsIDB4YTE4YywgMHgwMGZmLCAweGExODYsIDB4MDAxNywgMHgwMDQwLAorCTB4NGEwOSwgMHhhMTg2LCAweDAwMWUsIDB4MDA0MCwgMHg0YTA5LCAweGExOGUsIDB4MDAxZiwgMHgwMGMwLAorCTB4NDllOCwgMHg2ODRjLCAweGQwY2MsIDB4MDA0MCwgMHg0OWU4LCAweDY4NTAsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4NiwgMHgwMDAxLCAweDAwYzAsIDB4NDllOCwgMHgyMDA5LCAweDgwMjEsIDB4MDA3OCwgMHg0OWI4LAorCTB4NzA4NCwgMHg4MDA4LCAweGEwOTIsIDB4MDAxZSwgMHgwMGM4LCAweDQ5ZTgsIDB4NzE4NiwgMHhhZTkwLAorCTB4MDAwMywgMHhhMjEwLCAweDY4M2MsIDB4MjAxMiwgMHgwMDc4LCAweDRhMzYsIDB4NzA4NCwgMHg4MDA4LAorCTB4YTA5MiwgMHgwMDBmLCAweDAwYzgsIDB4NDllOCwgMHg3MTg2LCAweGFlOTAsIDB4MDAwMywgMHg4MDAzLAorCTB4YTIxMCwgMHg2ODNjLCAweDIwMTIsIDB4ODIxMCwgMHg2ODQwLCAweDIwMTIsIDB4NzA4OCwgMHhhMTBhLAorCTB4MDA0OCwgMHg0OWNmLCAweDcxOGMsIDB4NzA4NCwgMHhhMTBhLCAweDAwNDgsIDB4NDljZiwgMHgyMDcxLAorCTB4MDAwMCwgMHg3MDE4LCAweGQwODQsIDB4MDBjMCwgMHg0OWNmLCAweDIwNzEsIDB4YTUzNCwgMHg3MDAwLAorCTB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4NGE1NiwgMHgxMDc4LCAweDRjZDIsIDB4MjA3MSwgMHgwMDAwLAorCTB4NzAxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgwMDc4LCAweDQ5Y2YsIDB4MTA3OCwgMHg0Y2ZkLAorCTB4MjA3MSwgMHgwMDAwLCAweDcwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MDA3OCwgMHg0OWNmLAorCTB4MDA3ZSwgMHg2ODRjLCAweDAwN2UsIDB4NjgzNywgMHgwMTAzLCAweDIwYTksIDB4MDAxYywgMHhhZDgwLAorCTB4MDAxMSwgMHgyMGEwLCAweDIwMDEsIDB4MDAwMCwgMHg0MGE0LCAweDAwN2YsIDB4YTA4NCwgMHgwMGZmLAorCTB4Njg0ZSwgMHgwMDdmLCAweDY4NGEsIDB4Njk1MiwgMHgwMDdjLCAweDIwNzEsIDB4YTQxMywgMHg3MDA0LAorCTB4MDA3OSwgMHg0YTdhLCAweDRhODQsIDB4NGE5NSwgMHg0Y2EzLCAweDRjYTQsIDB4NGNjYiwgMHg0Y2QxLAorCTB4NGE4NSwgMHg0YzkxLCAweDRjMzIsIDB4NGNiNCwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDA2OCwgMHg0YTk0LCAweDIwMDksIDB4MDAwZCwgMHg3MDMwLCAweDIwMGEsIDB4MjA5MSwgMHg0MDgwLAorCTB4NzAwNywgMHgwMDAxLCAweDcwMGIsIDB4MDAwMCwgMHgxMjdmLCAweDIwNjksIDB4YTViZSwgMHg2ODQ0LAorCTB4YTAwNSwgMHgwMDUwLCAweDRhYmQsIDB4MDBjMCwgMHg0YWJkLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA2OSwgMHgwMDAwLCAweDY5MzQsIDB4MjAwMSwgMHhhNDFmLCAweDIwMDQsIDB4YTEwYSwgMHgwMDQwLAorCTB4NGFiOCwgMHgwMDY4LCAweDRhYmMsIDB4MjA2OSwgMHgwMDAwLCAweDY4MTgsIDB4ZDA4NCwgMHgwMGMwLAorCTB4NGFiYywgMHgyMDA5LCAweDgwNDAsIDB4NjkyMiwgMHg2ODFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLAorCTB4MjA2OSwgMHhhNWJlLCAweDY4NDcsIDB4ZmZmZiwgMHgxMjdmLCAweDIwNjksIDB4YTMwMCwgMHg2ODQ0LAorCTB4Njk2MCwgMHhhMTAyLCAweDIwNjksIDB4YTUzNCwgMHg2ODhhLCAweDY5ODQsIDB4NzAxYywgMHhhMDZkLAorCTB4MDA0MCwgMHg0YWNmLCAweDgxZmYsIDB4MDA0MCwgMHg0YjE3LCAweDAwNzgsIDB4NGFlNSwgMHg4MWZmLAorCTB4MDA0MCwgMHg0YmU5LCAweDIwNzEsIDB4YTUzNCwgMHg3MTg0LCAweDcwODgsIDB4YTEwYSwgMHgwMGM4LAorCTB4NGFlNSwgMHg3MTkwLCAweDIwNzEsIDB4YTViZSwgMHg3MDQwLCAweGEwMDUsIDB4MDA0MCwgMHg0YWU1LAorCTB4MDBkMCwgMHg0YmU5LCAweDcxNDIsIDB4MDA3OCwgMHg0YmU5LCAweDIwNzEsIDB4YTUzNCwgMHg3MThjLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NzA4NCwgMHhhMTBhLCAweDAwNDgsIDB4NGMwNiwgMHgwMDY4LAorCTB4NGI5YiwgMHgyMDcxLCAweDAwMDAsIDB4NzAxOCwgMHhkMDg0LCAweDAwYzAsIDB4NGI5YiwgMHgyMDAxLAorCTB4ZmZmZiwgMHgyMDcxLCAweGE1YmUsIDB4NzA0MiwgMHgyMDcxLCAweGE1MzQsIDB4NzAwMCwgMHhhMDg2LAorCTB4MDAwMiwgMHgwMGMwLCAweDRiMGQsIDB4MTA3OCwgMHg0Y2QyLCAweDIwNzEsIDB4MDAwMCwgMHg3MDFiLAorCTB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MDA3OCwgMHg0YjliLCAweDEwNzgsIDB4NGNmZCwgMHgyMDcxLAorCTB4MDAwMCwgMHg3MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDAwNzgsIDB4NGI5YiwgMHgyMDcxLAorCTB4YTUzNCwgMHg3MDAwLCAweGEwMDUsIDB4MDA0MCwgMHg0YmM4LCAweDY5MzQsIDB4YTE4NiwgMHgwMTAzLAorCTB4MDBjMCwgMHg0YjllLCAweDY4NGMsIDB4ZDBiYywgMHgwMGMwLCAweDRiYzgsIDB4Njk0OCwgMHg2ODQ0LAorCTB4YTEwNSwgMHgwMGMwLCAweDRiYmIsIDB4MjAwOSwgMHg4MDIwLCAweDIwNzEsIDB4YTUzNCwgMHg3MDAwLAorCTB4MDA3OSwgMHg0YjMyLCAweDRiYzgsIDB4NGI4MCwgMHg0YjU4LCAweDRiNmEsIDB4NGIzNywgMHgxMzdlLAorCTB4MTQ3ZSwgMHgxNTdlLCAweDIwOTksIDB4YTM3NSwgMHgyMGExLCAweGE1ODUsIDB4MjBhOSwgMHgwMDA0LAorCTB4NTNhMywgMHgxNTdmLCAweDE0N2YsIDB4MTM3ZiwgMHgyMDcxLCAweGE1N2MsIDB4YWQ4MCwgMHgwMDBmLAorCTB4NzAwZSwgMHg3MDEzLCAweDAwMDIsIDB4NzAwNywgMHgwMDAyLCAweDcwMGIsIDB4MDAwMCwgMHgyZTEwLAorCTB4MTA3OCwgMHgxM2QxLCAweDIwNzEsIDB4YTQxMywgMHg3MDA3LCAweDAwMDksIDB4MDA3OCwgMHg0YmU5LAorCTB4NzA4NCwgMHg4MDA4LCAweGEwOTIsIDB4MDAxZSwgMHgwMGM4LCAweDRiZTksIDB4YWU5MCwgMHgwMDAzLAorCTB4YTIxMCwgMHg2ODNjLCAweDIwMTIsIDB4NzE4NiwgMHgyMDcxLCAweGE0MTMsIDB4MTA3OCwgMHg0ZDViLAorCTB4MDA3OCwgMHg0YmU5LCAweDcwODQsIDB4ODAwOCwgMHhhMDkyLCAweDAwMGYsIDB4MDBjOCwgMHg0YmU5LAorCTB4YWU5MCwgMHgwMDAzLCAweDgwMDMsIDB4YTIxMCwgMHg2ODNjLCAweDIwMTIsIDB4ODIxMCwgMHg2ODQwLAorCTB4MjAxMiwgMHg3MTg2LCAweDIwNzEsIDB4YTQxMywgMHgxMDc4LCAweDRkNWIsIDB4MDA3OCwgMHg0YmU5LAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MDA2OCwgMHg0YjliLCAweDIwNzEsIDB4MDAwMCwgMHg3MDE4LAorCTB4ZDA4NCwgMHgwMGMwLCAweDRiOWIsIDB4NzEyMiwgMHg2ODNjLCAweDcwMjYsIDB4Njg0MCwgMHg3MDJhLAorCTB4NzAxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgxMjdmLCAweDIwNzEsIDB4YTQxMywgMHgxMDc4LAorCTB4NGQ1YiwgMHgwMDc4LCAweDRiZTksIDB4MTI3ZiwgMHgwMDc4LCAweDRiZTksIDB4YTE4YywgMHgwMGZmLAorCTB4YTE4NiwgMHgwMDE3LCAweDAwNDAsIDB4NGJhYywgMHhhMTg2LCAweDAwMWUsIDB4MDA0MCwgMHg0YmFjLAorCTB4YTE4ZSwgMHgwMDFmLCAweDAwYzAsIDB4NGJjOCwgMHg2ODRjLCAweGQwY2MsIDB4MDA0MCwgMHg0YmM4LAorCTB4Njg1MCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDAxLCAweDAwYzAsIDB4NGJjOCwgMHgyMDA5LAorCTB4ODAyMSwgMHgwMDc4LCAweDRiMmQsIDB4Njg0NCwgMHhhMDg2LCAweDAxMDAsIDB4MDBjMCwgMHg0YmM4LAorCTB4Njg2OCwgMHhhMDA1LCAweDAwYzAsIDB4NGJjOCwgMHgyMDA5LCAweDgwMjAsIDB4MDA3OCwgMHg0YjJkLAorCTB4MjA3MSwgMHhhNDEzLCAweDEwNzgsIDB4NGQ2ZiwgMHgwMDQwLCAweDRiZTksIDB4MjA3MSwgMHhhNDEzLAorCTB4NzAwZiwgMHgwMDAxLCAweDY5MzQsIDB4YTE4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwMywgMHgwMGMwLAorCTB4NGJlMCwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHg4MTAxLCAweDAwNDAsIDB4NGJlMCwgMHg3MTBlLAorCTB4NzAwNywgMHgwMDAzLCAweDEwNzgsIDB4NGQ4ZiwgMHg3MDUwLCAweGEwODYsIDB4MDEwMCwgMHgwMDQwLAorCTB4NGNhNCwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGE0MTMsIDB4NzAwOCwgMHhhMDg2LAorCTB4MDAwMSwgMHgwMGMwLCAweDRjMDQsIDB4MDA2OCwgMHg0YzA0LCAweDIwMDksIDB4MDAwZCwgMHg3MDMwLAorCTB4MjAwYSwgMHgyMDkxLCAweDQwODAsIDB4NzAwYiwgMHgwMDAwLCAweDcwMDQsIDB4YTA4NiwgMHgwMDA2LAorCTB4MDBjMCwgMHg0YzA0LCAweDcwMDcsIDB4MDAwMSwgMHgxMjdmLCAweDAwN2MsIDB4MjA3MSwgMHhhNDEzLAorCTB4MTA3OCwgMHg0ZDZmLCAweDAwNDAsIDB4NGMyZiwgMHgyMDcxLCAweGE1MzQsIDB4NzA4NCwgMHg3MDBhLAorCTB4MjBhOSwgMHgwMDIwLCAweDIwOTksIDB4YTUzNSwgMHgyMGExLCAweGE1NWMsIDB4NTNhMywgMHg3MDg3LAorCTB4MDAwMCwgMHgyMDcxLCAweGE0MTMsIDB4MjA2OSwgMHhhNTdjLCAweDcwNmMsIDB4NjgyNiwgMHg3MDcwLAorCTB4NjgyYSwgMHg3MDc0LCAweDY4MmUsIDB4NzA3OCwgMHg2ODMyLCAweDJkMTAsIDB4MTA3OCwgMHgxM2QxLAorCTB4NzAwNywgMHgwMDA4LCAweDIwMDEsIDB4ZmZmZiwgMHgyMDcxLCAweGE1YmUsIDB4NzA0MiwgMHgxMjdmLAorCTB4MDA3OCwgMHg0YmU5LCAweDIwNjksIDB4YTU3YywgMHg2ODA4LCAweGEwOGUsIDB4MDAwMCwgMHgwMDQwLAorCTB4NGM5MCwgMHhhMDhlLCAweDAyMDAsIDB4MDA0MCwgMHg0YzhlLCAweGEwOGUsIDB4MDEwMCwgMHgwMGMwLAorCTB4NGM5MCwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwMDY4LCAweDRjOGIsIDB4MjA2OSwgMHgwMDAwLAorCTB4NjgxOCwgMHhkMDg0LCAweDAwYzAsIDB4NGM4YiwgMHg3MDJjLCAweDcxMzAsIDB4ODEwOCwgMHhhMTAyLAorCTB4MDA0OCwgMHg0YzU5LCAweGEwMGUsIDB4NzAzNCwgMHg3MDZlLCAweDcwMzgsIDB4NzA3MiwgMHgwMDc4LAorCTB4NGM2MywgMHg3MDZjLCAweGEwODAsIDB4MDA0MCwgMHg3MDZlLCAweDAwYzgsIDB4NGM2MywgMHg3MDcwLAorCTB4YTA4MSwgMHgwMDAwLCAweDcwNzIsIDB4NzEzMiwgMHg2OTM2LCAweDcwMGIsIDB4MDAwMCwgMHgyMDAxLAorCTB4YTU1OSwgMHgyMDA0LCAweGEwMDUsIDB4MDBjMCwgMHg0YzgyLCAweDY5MzQsIDB4MjA2OSwgMHhhNTM0LAorCTB4Njg5YywgMHg2OTllLCAweDIwNjksIDB4YTViZSwgMHhhMTAyLCAweDAwYzAsIDB4NGM3YiwgMHg2ODQ0LAorCTB4YTAwNSwgMHgwMGQwLCAweDRjODksIDB4MjAwMSwgMHhhNTVhLCAweDIwMGMsIDB4ODEwZCwgMHg2OTQ2LAorCTB4MDA3OCwgMHg0Yzg5LCAweDIwMDksIDB4ODA0MCwgMHg2OTIyLCAweDY4MWIsIDB4MDAwMSwgMHgyMDkxLAorCTB4NDA4MCwgMHg3MDA3LCAweDAwMDEsIDB4MTI3ZiwgMHgwMDc4LCAweDRjOTAsIDB4NzAwNywgMHgwMDA1LAorCTB4MDA3YywgMHg3MDFjLCAweGEwNmQsIDB4MDA0MCwgMHg0Y2EyLCAweDEwNzgsIDB4NGQ2ZiwgMHgwMDQwLAorCTB4NGNhMiwgMHg3MDA3LCAweDAwMDMsIDB4MTA3OCwgMHg0ZDhmLCAweDcwNTAsIDB4YTA4NiwgMHgwMTAwLAorCTB4MDA0MCwgMHg0Y2E0LCAweDAwN2MsIDB4MDA3YywgMHg3MDUwLCAweGEwOWUsIDB4MDEwMCwgMHgwMGMwLAorCTB4NGNhZCwgMHg3MDA3LCAweDAwMDQsIDB4MDA3OCwgMHg0Y2NiLCAweGEwODYsIDB4MDIwMCwgMHgwMGMwLAorCTB4NGNiMywgMHg3MDA3LCAweDAwMDUsIDB4MDA3YywgMHgyMDAxLCAweGE1N2UsIDB4MjAwNCwgMHhhMDhlLAorCTB4MDEwMCwgMHgwMGMwLCAweDRjYzAsIDB4NzAwNywgMHgwMDAxLCAweDEwNzgsIDB4NGQ1YiwgMHgwMDdjLAorCTB4YTA4ZSwgMHgwMDAwLCAweDAwNDAsIDB4NGNiZiwgMHhhMDhlLCAweDAyMDAsIDB4MDBjMCwgMHg0Y2JmLAorCTB4NzAwNywgMHgwMDA1LCAweDAwN2MsIDB4MTA3OCwgMHg0ZDI1LCAweDcwMDYsIDB4MTA3OCwgMHg0ZDViLAorCTB4MDA3YywgMHgwMDdjLCAweDBlN2UsIDB4MTU3ZSwgMHgyMDcxLCAweGE1MzQsIDB4NzE4NCwgMHg4MWZmLAorCTB4MDA0MCwgMHg0Y2ZhLCAweGEwMDYsIDB4NzA4NiwgMHhhZTgwLCAweDAwMDMsIDB4MjA3MSwgMHgwMDAwLAorCTB4MjFhOCwgMHgyMDE0LCAweDcyMjYsIDB4ODAwMCwgMHgwMDcwLCAweDRjZjcsIDB4MjAxNCwgMHg3MjJhLAorCTB4ODAwMCwgMHgwMDcwLCAweDRjZjcsIDB4MjAxNCwgMHg3MjJlLCAweDgwMDAsIDB4MDA3MCwgMHg0Y2Y3LAorCTB4MjAxNCwgMHg3MjNhLCAweDgwMDAsIDB4MDA3MCwgMHg0Y2Y3LCAweDIwMTQsIDB4NzIzZSwgMHhhMTgwLAorCTB4ODAzMCwgMHg3MDIyLCAweDE1N2YsIDB4MGU3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MTU3ZSwgMHgyMDcxLAorCTB4YTUzNCwgMHg3MTg0LCAweDgxZmYsIDB4MDA0MCwgMHg0ZDIyLCAweGEwMDYsIDB4NzA4NiwgMHhhZTgwLAorCTB4MDAwMywgMHgyMDcxLCAweDAwMDAsIDB4MjFhOCwgMHgyMDE0LCAweDcyMjYsIDB4ODAwMCwgMHgyMDE0LAorCTB4NzIyYSwgMHg4MDAwLCAweDAwNzAsIDB4NGQxYiwgMHgyMDE0LCAweDcyM2EsIDB4ODAwMCwgMHgyMDE0LAorCTB4NzIzZSwgMHgwMDc4LCAweDRkMWYsIDB4MjAwMSwgMHg4MDIwLCAweDAwNzgsIDB4NGQyMSwgMHgyMDAxLAorCTB4ODA0MiwgMHg3MDIyLCAweDE1N2YsIDB4MGU3ZiwgMHgwMDdjLCAweDcwMmMsIDB4NzEzMCwgMHg4MTA4LAorCTB4YTEwMiwgMHgwMDQ4LCAweDRkMzIsIDB4YTAwZSwgMHg3MDM0LCAweDcwNmUsIDB4NzAzOCwgMHg3MDcyLAorCTB4MDA3OCwgMHg0ZDNjLCAweDcwNmMsIDB4YTA4MCwgMHgwMDQwLCAweDcwNmUsIDB4MDBjOCwgMHg0ZDNjLAorCTB4NzA3MCwgMHhhMDgxLCAweDAwMDAsIDB4NzA3MiwgMHg3MTMyLCAweDcwMGMsIDB4ODAwMSwgMHg3MDBlLAorCTB4MDBjMCwgMHg0ZDUyLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDAwNjgsIDB4NGQ1NSwgMHgyMDAxLAorCTB4MDAwZCwgMHgyMTAyLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwMDEsIDB4NzAwYiwgMHgwMDAwLAorCTB4MTI3ZiwgMHgwMDdjLCAweDIwMDEsIDB4MDAwNywgMHgwMDdjLCAweDIwMDEsIDB4MDAwNiwgMHg3MDBiLAorCTB4MDAwMSwgMHgxMjdmLCAweDAwN2MsIDB4NzAxYywgMHhhMDZkLCAweDAwNDAsIDB4NGQ2ZSwgMHgxMjdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDcwMTAsIDB4ODAwMSwgMHg3MDEyLCAweDJkMDQsIDB4NzAxZSwgMHhhMDA1LAorCTB4MDBjMCwgMHg0ZDZiLCAweDcwMWEsIDB4MTI3ZiwgMHgxMDc4LCAweDEzOWEsIDB4MDA3YywgMHgyMDE5LAorCTB4MDAwZCwgMHgyMzA0LCAweDIzMGMsIDB4YTEwZSwgMHgwMDQwLCAweDRkN2UsIDB4MjMwNCwgMHgyMzBjLAorCTB4YTEwZSwgMHgwMDQwLCAweDRkN2UsIDB4YTAwNiwgMHgwMDc4LCAweDRkOGUsIDB4NzMyYywgMHg4MzE5LAorCTB4NzEzMCwgMHhhMTAyLCAweDAwYzAsIDB4NGQ4OCwgMHgyMzAwLCAweGEwMDUsIDB4MDA3OCwgMHg0ZDhlLAorCTB4MDA0OCwgMHg0ZDhkLCAweGEzMDIsIDB4MDA3OCwgMHg0ZDhlLCAweDgwMDIsIDB4MDA3YywgMHgyZDAwLAorCTB4NzAyNiwgMHhhMDgwLCAweDAwMGQsIDB4NzA1NiwgMHg3MDUzLCAweDAwMDAsIDB4MTI3ZSwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDA5LCAweGE1ZDAsIDB4MjEwNCwgMHhjMDhkLCAweDIwMGEsIDB4MTI3ZiwgMHgxMDc4LAorCTB4MTNlYiwgMHgwMDdjLCAweDIwNzEsIDB4YTNlMSwgMHg3MDAzLCAweDAwMDAsIDB4NzAwNywgMHgwMDAwLAorCTB4NzAwZiwgMHgwMDAwLCAweDcwMmIsIDB4MDAwMSwgMHg3MDRmLCAweDAwMDAsIDB4NzA1MywgMHgwMDAxLAorCTB4NzA1ZiwgMHgwMDIwLCAweDcwNjMsIDB4MDA0MCwgMHg3MDgzLCAweDAwMDAsIDB4NzA4YiwgMHgwMDAwLAorCTB4NzA4ZiwgMHgwMDAxLCAweDcwYmYsIDB4MDAwMCwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhM2UxLAorCTB4Njg0OCwgMHhhMDA1LCAweDAwYzAsIDB4NGRjYiwgMHg3MDI4LCAweGMwODUsIDB4NzAyYSwgMHhhMDg1LAorCTB4MDAwMSwgMHgwMDc4LCAweDRkZjAsIDB4NmE1MCwgMHg3MjM2LCAweDZiNTQsIDB4NzMzYSwgMHg2ODU4LAorCTB4NzAzZSwgMHg3MDdhLCAweDY4NWMsIDB4NzA0MiwgMHg3MDdlLCAweDY4NDgsIDB4NzAyZSwgMHg2ODQwLAorCTB4NzAzMiwgMHgyMDA5LCAweDAwMGMsIDB4MjAwYSwgMHg4MDA3LCAweDgwMDYsIDB4ODAwNiwgMHhhMDhjLAorCTB4MDAzZiwgMHhhMDg0LCAweGZmYzAsIDB4YTIxMCwgMHgyMTAwLCAweGEzMTksIDB4NzI3MiwgMHg3Mzc2LAorCTB4NzAyOCwgMHhjMDg0LCAweDcwMmEsIDB4NzAwNywgMHgwMDAxLCAweDcwMGYsIDB4MDAwMCwgMHhhMDA2LAorCTB4MGU3ZiwgMHgwMDdjLCAweDJiNzgsIDB4MjA3MSwgMHhhM2UxLCAweDcwMDQsIDB4MTA3OSwgMHg0ZTUwLAorCTB4NzAwYywgMHgwMDc5LCAweDRkZmIsIDB4NGUwMCwgMHg0ZGY1LCAweDRkZjUsIDB4NGRmNSwgMHg0ZGY1LAorCTB4MDA3YywgMHg3MDBjLCAweDAwNzksIDB4NGUwNCwgMHg0ZTA5LCAweDRlNGUsIDB4NGU0ZSwgMHg0ZTRmLAorCTB4NGU0ZiwgMHg3ODMwLCAweDc5MzAsIDB4YTEwNiwgMHgwMDQwLCAweDRlMTMsIDB4NzgzMCwgMHg3OTMwLAorCTB4YTEwNiwgMHgwMGMwLCAweDRlMzksIDB4NzAzMCwgMHhhMTBhLCAweDAwNDAsIDB4NGUzOSwgMHgwMGM4LAorCTB4NGUxYiwgMHg3MTJjLCAweGExMGEsIDB4YTE4YSwgMHgwMDAyLCAweDAwYzgsIDB4NGUzYSwgMHgxMDc4LAorCTB4MTM2NiwgMHgwMDQwLCAweDRlMzksIDB4MmQwMCwgMHg3MDVhLCAweDcwNjMsIDB4MDA0MCwgMHgyMDAxLAorCTB4MDAwMywgMHg3MDU3LCAweDAwMDAsIDB4MTI3ZSwgMHgwMDdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDA5LAorCTB4YTVkMCwgMHgyMTA0LCAweGMwODUsIDB4MjAwYSwgMHgwMDdmLCAweDcwMGUsIDB4MTI3ZiwgMHgxMDc4LAorCTB4MTNlYiwgMHgwMDdjLCAweDEwNzgsIDB4MTM2NiwgMHgwMDQwLCAweDRlMzksIDB4MmQwMCwgMHg3MDVhLAorCTB4MTA3OCwgMHgxMzY2LCAweDAwYzAsIDB4NGU0NiwgMHgwMDc4LCAweDRlMjUsIDB4MmQwMCwgMHg3MDg2LAorCTB4NzA2MywgMHgwMDgwLCAweDIwMDEsIDB4MDAwNCwgMHgwMDc4LCAweDRlMjksIDB4MDA3YywgMHgwMDdjLAorCTB4NGU2MSwgMHg0ZTYyLCAweDRlOTksIDB4NGU5YSwgMHg0ZTRlLCAweDRlZDAsIDB4NGVkNSwgMHg0ZjBjLAorCTB4NGYwZCwgMHg0ZjI4LCAweDRmMjksIDB4NGYyYSwgMHg0ZjJiLCAweDRmMmMsIDB4NGYyZCwgMHg0ZmFkLAorCTB4NGZkNywgMHgwMDdjLCAweDcwMGMsIDB4MDA3OSwgMHg0ZTY1LCAweDRlNmEsIDB4NGU2ZCwgMHg0ZTdkLAorCTB4NGU5OCwgMHg0ZTk4LCAweDEwNzgsIDB4NGUwMSwgMHgwMDdjLCAweDEyN2UsIDB4ODAwMSwgMHg3MDBlLAorCTB4NzA1OCwgMHgwMDdlLCAweDEwNzgsIDB4NTM0OCwgMHgwMDQwLCAweDRlN2EsIDB4MjA5MSwgMHg4MDAwLAorCTB4MTA3OCwgMHg0ZTAxLCAweDBkN2YsIDB4MDA3OCwgMHg0ZTg2LCAweDEyN2UsIDB4ODAwMSwgMHg3MDBlLAorCTB4MTA3OCwgMHg1MzQ4LCAweDcwNTgsIDB4MjA2OCwgMHg3MDg0LCAweDcwNWEsIDB4NjgwMywgMHgwMDAwLAorCTB4NjgwNywgMHgwMDAwLCAweDY4MzQsIDB4YTA4NCwgMHgwMGZmLCAweGEwOGEsIDB4MDAyMCwgMHgwMGM4LAorCTB4NGU5NSwgMHgxMDc5LCAweDRlYjAsIDB4MTI3ZiwgMHgwMDdjLCAweDEyN2YsIDB4MTA3OCwgMHg0ZjJlLAorCTB4MDA3YywgMHgwMDdjLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGEzZTEsIDB4NzAwYywgMHgwMDc5LAorCTB4NGVhMSwgMHg0ZWE2LCAweDRlYTYsIDB4NGVhNiwgMHg0ZWE4LCAweDRlYWMsIDB4MGU3ZiwgMHgwMDdjLAorCTB4NzAwZiwgMHgwMDAxLCAweDAwNzgsIDB4NGVhZSwgMHg3MDBmLCAweDAwMDIsIDB4MGU3ZiwgMHgwMDdjLAorCTB4NGYyZSwgMHg0ZjJlLCAweDRmNGEsIDB4NGYyZSwgMHg1MDgwLCAweDRmMmUsIDB4NGYyZSwgMHg0ZjJlLAorCTB4NGYyZSwgMHg0ZjJlLCAweDRmNGEsIDB4NTBjYSwgMHg1MTE3LCAweDUxNzAsIDB4NTE4NiwgMHg0ZjJlLAorCTB4NGYyZSwgMHg0ZjY2LCAweDRmNGEsIDB4NGYyZSwgMHg0ZjJlLCAweDRmODcsIDB4NTI0NSwgMHg1MjYzLAorCTB4NGYyZSwgMHg0ZjY2LCAweDRmMmUsIDB4NGYyZSwgMHg0ZjJlLCAweDRmMmUsIDB4NGY3YywgMHg1MjYzLAorCTB4NzAyMCwgMHgyMDY4LCAweDEwNzgsIDB4MTM5YSwgMHgwMDdjLCAweDcwMGMsIDB4MDA3OSwgMHg0ZWQ4LAorCTB4NGVkZCwgMHg0ZWUwLCAweDRlZjAsIDB4NGYwYiwgMHg0ZjBiLCAweDEwNzgsIDB4NGUwMSwgMHgwMDdjLAorCTB4MTI3ZSwgMHg4MDAxLCAweDcwMGUsIDB4NzA1OCwgMHgwMDdlLCAweDEwNzgsIDB4NTM0OCwgMHgwMDQwLAorCTB4NGVlZCwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg0ZTAxLCAweDBkN2YsIDB4MDA3OCwgMHg0ZWY5LAorCTB4MTI3ZSwgMHg4MDAxLCAweDcwMGUsIDB4MTA3OCwgMHg1MzQ4LCAweDcwNTgsIDB4MjA2OCwgMHg3MDg0LAorCTB4NzA1YSwgMHg2ODAzLCAweDAwMDAsIDB4NjgwNywgMHgwMDAwLCAweDY4MzQsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4YSwgMHgwMDFhLCAweDAwYzgsIDB4NGYwOCwgMHgxMDc5LCAweDRmMGUsIDB4MTI3ZiwgMHgwMDdjLAorCTB4MTI3ZiwgMHgxMDc4LCAweDRmMmUsIDB4MDA3YywgMHgwMDdjLCAweDAwN2MsIDB4NGYyZSwgMHg0ZjRhLAorCTB4NTA2YSwgMHg0ZjJlLCAweDRmNGEsIDB4NGYyZSwgMHg0ZjRhLCAweDRmNGEsIDB4NGYyZSwgMHg0ZjRhLAorCTB4NTA2YSwgMHg0ZjRhLCAweDRmNGEsIDB4NGY0YSwgMHg0ZjRhLCAweDRmNGEsIDB4NGYyZSwgMHg0ZjRhLAorCTB4NTA2YSwgMHg0ZjJlLCAweDRmMmUsIDB4NGY0YSwgMHg0ZjJlLCAweDRmMmUsIDB4NGYyZSwgMHg0ZjRhLAorCTB4MDA3YywgMHgwMDdjLCAweDAwN2MsIDB4MDA3YywgMHgwMDdjLCAweDAwN2MsIDB4NzAwNywgMHgwMDAxLAorCTB4NjgzOCwgMHhhMDg0LCAweDAwZmYsIDB4YzBkNSwgMHg2ODNhLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLAorCTB4MTA3OCwgMHg0OTgyLCAweDEyN2YsIDB4MDA3YywgMHg3MDA3LCAweDAwMDEsIDB4NjgzOCwgMHhhMDg0LAorCTB4MDBmZiwgMHhjMGU1LCAweDY4M2EsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg0OTgyLAorCTB4MTI3ZiwgMHgwMDdjLCAweDcwMDcsIDB4MDAwMSwgMHg2ODM4LCAweGEwODQsIDB4MDBmZiwgMHhjMGVkLAorCTB4NjgzYSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDQ5ODIsIDB4MTI3ZiwgMHgwMDdjLAorCTB4NzAwNywgMHgwMDAxLCAweDY4MzgsIDB4YTA4NCwgMHgwMGZmLCAweGMwZGQsIDB4NjgzYSwgMHgxMjdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4NDk4MiwgMHgxMjdmLCAweDAwN2MsIDB4NjgzNCwgMHg4MDA3LAorCTB4YTA4NCwgMHgwMGZmLCAweDAwNDAsIDB4NGYzYywgMHg4MDAxLCAweDAwYzAsIDB4NGY3MywgMHg3MDA3LAorCTB4MDAwMSwgMHgwMDc4LCAweDUwNDksIDB4NzAwNywgMHgwMDA2LCAweDcwMTIsIDB4MmQwMCwgMHg3MDE2LAorCTB4NzAxYSwgMHg3MDRiLCAweDUwNDksIDB4MDA3YywgMHg2ODRjLCAweGEwODQsIDB4MDBjMCwgMHhhMDg2LAorCTB4MDBjMCwgMHgwMGMwLCAweDRmODcsIDB4NzAwNywgMHgwMDAxLCAweDAwNzgsIDB4NTI4MCwgMHgyZDAwLAorCTB4NzAxNiwgMHg3MDFhLCAweDIwYTksIDB4MDAwNCwgMHhhMDgwLCAweDAwMjQsIDB4MjA5OCwgMHgyMGExLAorCTB4YTQwYywgMHg1M2EzLCAweDY4NTgsIDB4NzAxMiwgMHhhMDgyLCAweDA0MDEsIDB4MDBjOCwgMHg0ZjU4LAorCTB4Njg4NCwgMHhhMDhhLCAweDAwMDIsIDB4MDBjOCwgMHg0ZjU4LCAweDgyZmYsIDB4MDBjMCwgMHg0ZmE5LAorCTB4Njg4OCwgMHg2OThjLCAweGExMDUsIDB4MDA0MCwgMHg0ZmE5LCAweDIwMDEsIDB4NTAxOSwgMHgwMDc4LAorCTB4NGZhYywgMHhhMjgwLCAweDUwMGYsIDB4MjAwNCwgMHg3MGM2LCAweDcwMTAsIDB4YTAxNSwgMHgwMDQwLAorCTB4NGZmNywgMHgxMDc4LCAweDEzNjYsIDB4MDBjMCwgMHg0ZmI4LCAweDcwMDcsIDB4MDAwZiwgMHgwMDdjLAorCTB4MmQwMCwgMHg3MDIyLCAweDcwYzQsIDB4MjA2MCwgMHg2MDAwLCAweDY4MzYsIDB4NjAwNCwgMHhhZDAwLAorCTB4NzA5NiwgMHg2MDA4LCAweGEyMGEsIDB4MDBjOCwgMHg0ZmM3LCAweGEwMGUsIDB4MjIwMCwgMHg3MTEyLAorCTB4NjIwYywgMHg4MDAzLCAweDgwMGIsIDB4YTI5NiwgMHgwMDA0LCAweDAwNDAsIDB4NGZkMCwgMHhhMTA4LAorCTB4NzE5YSwgMHg4MTBiLCAweDcxOWUsIDB4YWU5MCwgMHgwMDIyLCAweDEwNzgsIDB4MTNkMSwgMHg3MDkwLAorCTB4YTA4ZSwgMHgwMTAwLCAweDAwNDAsIDB4NGZlYiwgMHhhMDg2LCAweDAyMDAsIDB4MDA0MCwgMHg0ZmUzLAorCTB4NzAwNywgMHgwMDEwLCAweDAwN2MsIDB4NzAyMCwgMHgyMDY4LCAweDEwNzgsIDB4MTM5YSwgMHg3MDE0LAorCTB4MjA2OCwgMHgwMDc4LCAweDRmNTgsIDB4NzAyMCwgMHgyMDY4LCAweDcwMTgsIDB4NjgwMiwgMHg2ODA3LAorCTB4MDAwMCwgMHgyZDA4LCAweDIwNjgsIDB4NjkwNiwgMHg3MTFhLCAweDAwNzgsIDB4NGZhZCwgMHg3MDE0LAorCTB4MjA2OCwgMHg3MDA3LCAweDAwMDEsIDB4Njg4NCwgMHhhMDA1LCAweDAwYzAsIDB4NTAwNiwgMHg2ODg4LAorCTB4Njk4YywgMHhhMTA1LCAweDAwNDAsIDB4NTAwNiwgMHgxMDc4LCAweDUwMWQsIDB4NjgzNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg2LCAweDAwMWUsIDB4MDA0MCwgMHg1MjgwLCAweDAwNzgsIDB4NTA0OSwgMHg1MDExLAorCTB4NTAxNSwgMHgwMDAyLCAweDAwMTEsIDB4MDAwNywgMHgwMDA0LCAweDAwMGEsIDB4MDAwZiwgMHgwMDA1LAorCTB4MDAwNiwgMHgwMDBhLCAweDAwMTEsIDB4MDAwNSwgMHgwMDA0LCAweDBmN2UsIDB4MGU3ZSwgMHgwYzdlLAorCTB4MDc3ZSwgMHgwNjdlLCAweDZmODgsIDB4NmU4YywgMHg2ODA0LCAweDIwNjAsIDB4YWNmMCwgMHgwMDIxLAorCTB4YWNmOCwgMHgwMDI3LCAweDIwMDksIDB4MDAwNSwgMHg3MDBjLCAweDc4MTYsIDB4NzAwOCwgMHg3ODEyLAorCTB4NzAwNCwgMHg3ODA2LCAweDcwMDAsIDB4NzgwMiwgMHg3ZTBlLCAweDdmMGEsIDB4ODEwOSwgMHgwMDQwLAorCTB4NTAzZiwgMHhhZWYyLCAweDAwMDQsIDB4YWZmYSwgMHgwMDA2LCAweDAwNzgsIDB4NTAyYywgMHg2MDA0LAorCTB4YTA2NSwgMHgwMGMwLCAweDUwMjYsIDB4MDY3ZiwgMHgwNzdmLCAweDBjN2YsIDB4MGU3ZiwgMHgwZjdmLAorCTB4MDA3YywgMHgyMDA5LCAweGEzMmUsIDB4MjEwYywgMHg4MWZmLCAweDAwYzAsIDB4NTA2NCwgMHg2ODM4LAorCTB4YTA4NCwgMHgwMGZmLCAweDY4M2EsIDB4MTA3OCwgMHg0MjkwLCAweDAwYzAsIDB4NTA1OCwgMHgwMDdjLAorCTB4MTA3OCwgMHg0YTYwLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4OGNiOCwgMHgxMDc4LAorCTB4NDk4MiwgMHgxMjdmLCAweDAwNzgsIDB4NTA1NywgMHgyMDAxLCAweDAwMjgsIDB4MjAwOSwgMHgwMDAwLAorCTB4MDA3OCwgMHg1MDU4LCAweDcwMTgsIDB4NjgwMiwgMHgyZDA4LCAweDIwNjgsIDB4NjkwNiwgMHg3MTFhLAorCTB4NzAxMCwgMHg4MDAxLCAweDcwMTIsIDB4MDA0MCwgMHg1MDc5LCAweDcwMDcsIDB4MDAwNiwgMHgwMDc4LAorCTB4NTA3ZiwgMHg3MDE0LCAweDIwNjgsIDB4NzAwNywgMHgwMDAxLCAweDcwNDgsIDB4MTA3YSwgMHgwMDdjLAorCTB4NzAwNywgMHgwMDAxLCAweDY5NDQsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4Njg0OCwgMHhhMDg0LAorCTB4MDBmZiwgMHgyMGE5LCAweDAwMDEsIDB4YTA5NiwgMHgwMDAxLCAweDAwNDAsIDB4NTBhOSwgMHgyMDA5LAorCTB4MDAwMCwgMHgyMGE5LCAweDAwZmYsIDB4YTA5NiwgMHgwMDAyLCAweDAwNDAsIDB4NTBhOSwgMHhhMDA1LAorCTB4MDBjMCwgMHg1MGJjLCAweDY5NDQsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4MTA3OCwgMHg0NTAxLAorCTB4MDBjMCwgMHg1MGJjLCAweDA2N2UsIDB4NmU1MCwgMHgxMDc4LCAweDQ1ZTcsIDB4MDY3ZiwgMHgwMDc4LAorCTB4NTBiYywgMHgwNDdlLCAweDIwMTEsIDB4YTMwYywgMHgyMjI0LCAweGM0ODQsIDB4YzQ4YywgMHgyNDEyLAorCTB4MDQ3ZiwgMHgwYzdlLCAweDEwNzgsIDB4NDUwMSwgMHgwMGMwLCAweDUwYjgsIDB4MTA3OCwgMHg0NzgyLAorCTB4ODEwOCwgMHgwMGYwLCAweDUwYjIsIDB4MGM3ZiwgMHg2ODRjLCAweGQwODQsIDB4MDBjMCwgMHg1MGMzLAorCTB4MTA3OCwgMHgxMzlhLCAweDAwN2MsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg0OTgyLAorCTB4MTI3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDcwMDcsIDB4MDAwMSwgMHgyMDAxLAorCTB4YTM1MiwgMHgyMDA0LCAweGQwYTQsIDB4MDA0MCwgMHg1MTBlLCAweDIwNjEsIDB4YTYyZCwgMHg2MTAwLAorCTB4ZDE4NCwgMHgwMDQwLCAweDUwZWUsIDB4Njg1OCwgMHhhMDg0LCAweDAwZmYsIDB4MDBjMCwgMHg1MTExLAorCTB4NjAwMCwgMHhkMDg0LCAweDAwNDAsIDB4NTEwZSwgMHg2MDA0LCAweGEwMDUsIDB4MDBjMCwgMHg1MTE0LAorCTB4NjAwMywgMHgwMDAwLCAweDYwMGIsIDB4MDAwMCwgMHgwMDc4LCAweDUxMGIsIDB4MjAxMSwgMHgwMDAxLAorCTB4Njg2MCwgMHhhMDA1LCAweDAwYzAsIDB4NTBmNiwgMHgyMDAxLCAweDAwMWUsIDB4ODAwMCwgMHg2MDE2LAorCTB4Njg1OCwgMHhhMDg0LCAweDAwZmYsIDB4MDA0MCwgMHg1MTBlLCAweDYwMDYsIDB4Njg1OCwgMHg4MDA3LAorCTB4YTA4NCwgMHgwMGZmLCAweDAwNDAsIDB4NTEwZSwgMHg2MDBhLCAweDY4NTgsIDB4ODAwMCwgMHgwMGMwLAorCTB4NTEwYSwgMHhjMjhkLCAweDYyMDIsIDB4MTI3ZiwgMHgwMDc4LCAweDUzMzcsIDB4MTI3ZiwgMHgwMDc4LAorCTB4NTMyZiwgMHgxMjdmLCAweDAwNzgsIDB4NTMyNywgMHgxMjdmLCAweDAwNzgsIDB4NTMyYiwgMHgxMjdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDcwMDcsIDB4MDAwMSwgMHgyMDAxLCAweGEzNTIsIDB4MjAwNCwgMHhkMGE0LAorCTB4MDA0MCwgMHg1MTZkLCAweDIwNjEsIDB4YTYyZCwgMHg2MDAwLCAweGQwODQsIDB4MDA0MCwgMHg1MTZkLAorCTB4NjIwNCwgMHg2MzA4LCAweGQwOGMsIDB4MDBjMCwgMHg1MTVmLCAweDZjNDgsIDB4YTQ4NCwgMHgwMDAzLAorCTB4MDA0MCwgMHg1MTQ1LCAweDY5NTgsIDB4YTE4YywgMHgwMGZmLCAweDgwMDEsIDB4MDBjMCwgMHg1MTNlLAorCTB4MjEwMCwgMHhhMjEwLCAweDAwNDgsIDB4NTE2YSwgMHgwMDc4LCAweDUxNDUsIDB4ODAwMSwgMHgwMGMwLAorCTB4NTE2YSwgMHgyMTAwLCAweGEyMTIsIDB4MDA0OCwgMHg1MTZhLCAweGE0ODQsIDB4MDAwYywgMHgwMDQwLAorCTB4NTE1ZiwgMHg2OTU4LCAweDgxMGYsIDB4YTE4YywgMHgwMGZmLCAweGEwODIsIDB4MDAwNCwgMHgwMGMwLAorCTB4NTE1NywgMHgyMTAwLCAweGEzMTgsIDB4MDA0OCwgMHg1MTZhLCAweDAwNzgsIDB4NTE1ZiwgMHhhMDgyLAorCTB4MDAwNCwgMHgwMGMwLCAweDUxNmEsIDB4MjEwMCwgMHhhMzFhLCAweDAwNDgsIDB4NTE2YSwgMHg2ODYwLAorCTB4YTAwNSwgMHgwMDQwLCAweDUxNjUsIDB4ODAwMCwgMHg2MDE2LCAweDYyMDYsIDB4NjMwYSwgMHgxMjdmLAorCTB4MDA3OCwgMHg1MzM3LCAweDEyN2YsIDB4MDA3OCwgMHg1MzMzLCAweDEyN2YsIDB4MDA3OCwgMHg1MzJmLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweDIwNjEsIDB4YTYyZCwgMHg2MzAwLAorCTB4ZDM4YywgMHgwMGMwLCAweDUxODAsIDB4NjMwOCwgMHg4MzE4LCAweDAwNDgsIDB4NTE4MywgMHg2MzBhLAorCTB4MTI3ZiwgMHgwMDc4LCAweDUzNDUsIDB4MTI3ZiwgMHgwMDc4LCAweDUzMzMsIDB4MTI3ZSwgMHgwYzdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDcwMDcsIDB4MDAwMSwgMHg2ODRjLCAweGQwYWMsIDB4MDA0MCwgMHg1MTlhLAorCTB4MGM3ZSwgMHgyMDYxLCAweGE2MmQsIDB4NjAwMCwgMHhhMDg0LCAweGZjZmYsIDB4NjAwMiwgMHgwYzdmLAorCTB4MDA3OCwgMHg1MWM5LCAweDY4NTgsIDB4YTAwNSwgMHgwMDQwLCAweDUxZTAsIDB4Njg1YywgMHhhMDY1LAorCTB4MDA0MCwgMHg1MWRjLCAweDIwMDEsIDB4YTMyZSwgMHgyMDA0LCAweGEwMDUsIDB4MDA0MCwgMHg1MWFjLAorCTB4MTA3OCwgMHg4YzAxLCAweDAwNzgsIDB4NTFiYSwgMHg2MDEzLCAweDA0MDAsIDB4NjAzNywgMHgwMDAwLAorCTB4Njk0YywgMHhkMWE0LCAweDAwNDAsIDB4NTFiNiwgMHg2OTUwLCAweDYxMzYsIDB4MjAwOSwgMHgwMDQxLAorCTB4MTA3OCwgMHg3NTZjLCAweDY5NTgsIDB4YTE4YywgMHhmZjAwLCAweGExODYsIDB4MjAwMCwgMHgwMGMwLAorCTB4NTFjOSwgMHgwMjdlLCAweDIwMDksIDB4MDAwMCwgMHgyMDExLCAweGZkZmYsIDB4MTA3OCwgMHg1YTZkLAorCTB4MDI3ZiwgMHg2ODRjLCAweGQwYzQsIDB4MDA0MCwgMHg1MWQ4LCAweDIwNjEsIDB4YTYyZCwgMHg2MDAwLAorCTB4ZDA4YywgMHgwMGMwLCAweDUxZDgsIDB4NjAwOCwgMHg4MDAwLCAweDAwNDgsIDB4NTFkYywgMHg2MDBhLAorCTB4MGM3ZiwgMHgxMjdmLCAweDAwNzgsIDB4NTMzNywgMHgwYzdmLCAweDEyN2YsIDB4MDA3OCwgMHg1MzJmLAorCTB4Njk1NCwgMHhhMTg2LCAweDAwNDUsIDB4MDA0MCwgMHg1MjEzLCAweGExODYsIDB4MDAyYSwgMHgwMGMwLAorCTB4NTFmMCwgMHgyMDAxLCAweGEzMGMsIDB4MjAwYywgMHhjMTk0LCAweDIxMDIsIDB4MDA3OCwgMHg1MWM5LAorCTB4YTE4NiwgMHgwMDIwLCAweDAwNDAsIDB4NTIwOSwgMHhhMTg2LCAweDAwMjksIDB4MDA0MCwgMHg1MWZjLAorCTB4YTE4NiwgMHgwMDJkLCAweDAwYzAsIDB4NTFkYywgMHg2OTQ0LCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLAorCTB4MTA3OCwgMHg0NTAxLCAweDAwYzAsIDB4NTFjOSwgMHg2MDAwLCAweGMwZTQsIDB4NjAwMiwgMHgwMDc4LAorCTB4NTFjOSwgMHg2ODVjLCAweGEwNjUsIDB4MDA0MCwgMHg1MWRjLCAweDIwMDEsIDB4YTVhMSwgMHgyMDA0LAorCTB4NjAxNiwgMHgwMDc4LCAweDUxYzksIDB4Njg1YywgMHhhMDY1LCAweDAwNDAsIDB4NTFkYywgMHgwZTdlLAorCTB4Njg2MCwgMHhhMDc1LCAweDIwMDEsIDB4YTMyZSwgMHgyMDA0LCAweGEwMDUsIDB4MDA0MCwgMHg1MjJiLAorCTB4MTA3OCwgMHg4YzAxLCAweDhlZmYsIDB4MDA0MCwgMHg1MjI4LCAweDJlNjAsIDB4MTA3OCwgMHg4YzAxLAorCTB4MGU3ZiwgMHgwMDc4LCAweDUxYzksIDB4NjAyNCwgMHhjMGRjLCAweGMwZDUsIDB4NjAyNiwgMHgyZTYwLAorCTB4NjAwNywgMHgwMDNhLCAweDY4NzAsIDB4YTAwNSwgMHgwMDQwLCAweDUyM2MsIDB4NjAwNywgMHgwMDNiLAorCTB4Njg3NCwgMHg2MDJhLCAweDY4NzgsIDB4NjAxMiwgMHg2MDAzLCAweDAwMDEsIDB4MTA3OCwgMHg1YmY4LAorCTB4MTA3OCwgMHg2MTA5LCAweDBlN2YsIDB4MDA3OCwgMHg1MWM5LCAweDIwNjEsIDB4YTYyZCwgMHg2MDAwLAorCTB4ZDA4NCwgMHgwMDQwLCAweDUyNWYsIDB4ZDA4YywgMHgwMGMwLCAweDUzNDUsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjIwNCwgMHg4MjEwLCAweDAwNDgsIDB4NTI1OSwgMHg2MjA2LCAweDIwOTEsIDB4ODAwMSwgMHgwMDc4LAorCTB4NTM0NSwgMHgyMDkxLCAweDgwMDEsIDB4Njg1MywgMHgwMDE2LCAweDAwNzgsIDB4NTMzZSwgMHg2ODUzLAorCTB4MDAwNywgMHgwMDc4LCAweDUzM2UsIDB4NjgzNCwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHgwMGMwLAorCTB4NTI2ZCwgMHgxMDc4LCAweDRmM2MsIDB4MDA3OCwgMHg1MjdmLCAweDIwMzAsIDB4ODAwMSwgMHgwMGMwLAorCTB4NTI3NywgMHg3MDA3LCAweDAwMDEsIDB4MTA3OCwgMHg1MjgwLCAweDAwNzgsIDB4NTI3ZiwgMHg3MDA3LAorCTB4MDAwNiwgMHg3MDEyLCAweDJkMDAsIDB4NzAxNiwgMHg3MDFhLCAweDcwNGIsIDB4NTI4MCwgMHgwMDdjLAorCTB4MGU3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDA5LCAweGEzMmUsIDB4MjEwYywgMHg4MWZmLAorCTB4MDBjMCwgMHg1MzBiLCAweDIwMDksIDB4YTMwYywgMHgyMTBjLCAweGQxOTQsIDB4MDBjMCwgMHg1MzE1LAorCTB4Njg0OCwgMHgyMDcwLCAweGFlODIsIDB4YWEwMCwgMHgwMDQ4LCAweDUyZmIsIDB4MjAwMSwgMHhhMzE1LAorCTB4MjAwNCwgMHhhZTAyLCAweDAwYzgsIDB4NTJmYiwgMHgyMDYxLCAweGE2MmQsIDB4NjEwMCwgMHhhMTg0LAorCTB4MDMwMSwgMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHg1MmRlLCAweDcxMWMsIDB4YTE4NiwgMHgwMDA2LAorCTB4MDBjMCwgMHg1MmU2LCAweDcwMTgsIDB4YTAwNSwgMHgwMDQwLCAweDUzMGIsIDB4MjAwNCwgMHhkMGU0LAorCTB4MDBjMCwgMHg1MzBmLCAweDcwMjQsIDB4ZDBkYywgMHgwMGMwLCAweDUzMTksIDB4Njg1MywgMHgwMDAwLAorCTB4NjgwMywgMHgwMDAwLCAweDJkMDgsIDB4NzAxMCwgMHhhMDA1LCAweDAwYzAsIDB4NTJjYSwgMHg3MTEyLAorCTB4Njg0YywgMHhkMGY0LCAweDAwYzAsIDB4NTMxZCwgMHgyZTYwLCAweDEwNzgsIDB4NTliNiwgMHgxMjdmLAorCTB4MGU3ZiwgMHgwMDdjLCAweDIwNjgsIDB4NjgwMCwgMHhhMDA1LCAweDAwYzAsIDB4NTJjYSwgMHg2OTAyLAorCTB4MjE2OCwgMHg2ODRjLCAweGQwZjQsIDB4MDBjMCwgMHg1MzFkLCAweDEyN2YsIDB4MGU3ZiwgMHgwMDdjLAorCTB4MTI3ZiwgMHgwZTdmLCAweDY4NTMsIDB4MDAwNiwgMHgwMDc4LCAweDUzM2UsIDB4ZDE4NCwgMHgwMDQwLAorCTB4NTJkOCwgMHhkMWM0LCAweDAwYzAsIDB4NTJmZiwgMHgwMDc4LCAweDUzMDMsIDB4Njk0NCwgMHhhMThjLAorCTB4ZmYwMCwgMHg4MTBmLCAweDEwNzgsIDB4NDUwMSwgMHgwMGMwLCAweDUzMGYsIDB4NjAwMCwgMHhkMGU0LAorCTB4MDBjMCwgMHg1MzBmLCAweDcxMWMsIDB4YTE4NiwgMHgwMDA3LCAweDAwYzAsIDB4NTJmYiwgMHg2ODUzLAorCTB4MDAwMiwgMHgwMDc4LCAweDUzMTEsIDB4Njg1MywgMHgwMDA4LCAweDAwNzgsIDB4NTMxMSwgMHg2ODUzLAorCTB4MDAwZSwgMHgwMDc4LCAweDUzMTEsIDB4Njg1MywgMHgwMDE3LCAweDAwNzgsIDB4NTMxMSwgMHg2ODUzLAorCTB4MDAzNSwgMHgwMDc4LCAweDUzMTEsIDB4Njg1MywgMHgwMDI4LCAweDAwNzgsIDB4NTMxMSwgMHg2ODUzLAorCTB4MDAyOSwgMHgxMjdmLCAweDBlN2YsIDB4MDA3OCwgMHg1MzNlLCAweDY4NTMsIDB4MDAyYSwgMHgwMDc4LAorCTB4NTMxMSwgMHg2ODUzLCAweDAwNDUsIDB4MDA3OCwgMHg1MzExLCAweDJlNjAsIDB4MjAxOSwgMHgwMDAyLAorCTB4NjAxNywgMHgwMDE0LCAweDEwNzgsIDB4OWE2YSwgMHgxMjdmLCAweDBlN2YsIDB4MDA3YywgMHgyMDA5LAorCTB4MDAzZSwgMHgwMDc4LCAweDUzMzksIDB4MjAwOSwgMHgwMDA0LCAweDAwNzgsIDB4NTMzOSwgMHgyMDA5LAorCTB4MDAwNiwgMHgwMDc4LCAweDUzMzksIDB4MjAwOSwgMHgwMDE2LCAweDAwNzgsIDB4NTMzOSwgMHgyMDA5LAorCTB4MDAwMSwgMHg2ODU0LCAweGEwODQsIDB4ZmYwMCwgMHhhMTA1LCAweDY4NTYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MTA3OCwgMHg0OTgyLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDEwNzgsIDB4MTM5YSwgMHgwMDdjLAorCTB4NzAyYywgMHg3MTMwLCAweDgxMDgsIDB4YTEwMiwgMHgwMDQ4LCAweDUzNTUsIDB4YTAwZSwgMHg3MDM0LAorCTB4NzA3MiwgMHg3MDM4LCAweDcwNzYsIDB4MDA3OCwgMHg1MzYxLCAweDcwNzAsIDB4YTA4MCwgMHgwMDQwLAorCTB4NzA3MiwgMHgwMGM4LCAweDUzNjEsIDB4NzA3NCwgMHhhMDgxLCAweDAwMDAsIDB4NzA3NiwgMHhhMDg1LAorCTB4MDAwMSwgMHg3OTMyLCAweDcxMzIsIDB4MDA3YywgMHgwZDdlLCAweDEwNzgsIDB4NTlhZCwgMHgwZDdmLAorCTB4MDA3YywgMHgwZDdlLCAweDIwMTEsIDB4MDAwNCwgMHgyMjA0LCAweGEwODUsIDB4ODAwMiwgMHgyMDEyLAorCTB4MGQ3ZiwgMHgwMDdjLCAweDIwZTEsIDB4MDAwMiwgMHgzZDA4LCAweDIwZTEsIDB4MjAwMCwgMHgzZDAwLAorCTB4YTA4NCwgMHg3MDAwLCAweDAwNDAsIDB4NTM4MCwgMHhhMDg2LCAweDEwMDAsIDB4MDBjMCwgMHg1M2FjLAorCTB4MjBlMSwgMHgwMDAwLCAweDNkMDAsIDB4YTA5NCwgMHhmZjAwLCAweDgyMTcsIDB4YTA4NCwgMHhmMDAwLAorCTB4YTA4NiwgMHgzMDAwLCAweDAwYzAsIDB4NTM5MCwgMHgxMDc4LCAweDU1NzAsIDB4MDA3OCwgMHg1M2E3LAorCTB4MjBlMSwgMHgwMDA0LCAweDNkNjAsIDB4ZDFiYywgMHgwMGMwLCAweDUzOTcsIDB4M2U2MCwgMHhhYzg0LAorCTB4MDAwZiwgMHgwMGMwLCAweDUzYWMsIDB4YWM4MiwgMHhhYTAwLCAweDAwNDgsIDB4NTNhYywgMHg2ODU0LAorCTB4YWMwMiwgMHgwMGM4LCAweDUzYWMsIDB4MjAwOSwgMHgwMDQ3LCAweDEwNzgsIDB4NzU2YywgMHg3YTFjLAorCTB4ZDI4NCwgMHgwMGMwLCAweDUzNzIsIDB4MDA3YywgMHhhMDE2LCAweDEwNzgsIDB4MTVlYywgMHgwMDc4LAorCTB4NTNhNywgMHgwMDc4LCAweDUzYWMsIDB4NzgxYywgMHhkMDhjLCAweDAwNDAsIDB4NTNkYiwgMHgxNTdlLAorCTB4MTM3ZSwgMHgxNDdlLCAweDIwZTEsIDB4MzAwMCwgMHgzZDIwLCAweDNlMjgsIDB4YTU4NCwgMHgwMDc2LAorCTB4MDBjMCwgMHg1M2YxLCAweGE0ODQsIDB4NzAwMCwgMHhhMDg2LCAweDEwMDAsIDB4MDBjMCwgMHg1M2UwLAorCTB4MTA3OCwgMHg1NDBjLCAweDAwNDAsIDB4NTNmMSwgMHgyMGUxLCAweDMwMDAsIDB4NzgyOCwgMHg3ODI4LAorCTB4MTA3OCwgMHg1NDJhLCAweDE0N2YsIDB4MTM3ZiwgMHgxNTdmLCAweDIwMDksIDB4YTViMywgMHgyMTA0LAorCTB4YTAwNSwgMHgwMGMwLCAweDUzZGMsIDB4MDA3YywgMHgxMDc4LCAweDYxMDksIDB4MDA3OCwgMHg1M2RiLAorCTB4YTQ4NCwgMHg3MDAwLCAweDAwYzAsIDB4NTNmMSwgMHgxMDc4LCAweDU0MGMsIDB4MDA0MCwgMHg1NDAzLAorCTB4NzAwMCwgMHhhMDg0LCAweGZmMDAsIDB4YTA4NiwgMHg4MTAwLCAweDAwNDAsIDB4NTNjYywgMHgwMDc4LAorCTB4NTQwMywgMHgxMDc4LCAweGExZWUsIDB4ZDVhNCwgMHgwMDQwLCAweDUzZmYsIDB4MTA3OCwgMHgxYWY3LAorCTB4MjBlMSwgMHg5MDEwLCAweDIwMDEsIDB4MDEzOCwgMHgyMjAyLCAweDAwNzgsIDB4NTQwNywgMHgxMDc4LAorCTB4NTQwYywgMHg2ODdmLCAweDAwMDAsIDB4MjBlMSwgMHgzMDAwLCAweDc4MjgsIDB4NzgyOCwgMHgxNDdmLAorCTB4MTM3ZiwgMHgxNTdmLCAweDAwNzgsIDB4NTNkYiwgMHhhNDg0LCAweDAxZmYsIDB4Njg3ZSwgMHhhMDA1LAorCTB4MDA0MCwgMHg1NDFlLCAweGEwODAsIDB4MDAxZiwgMHhhMDg0LCAweDAzZjgsIDB4ODBhYywgMHgyMGUxLAorCTB4MTAwMCwgMHgyZWEwLCAweDIwOTksIDB4MDIwYSwgMHg1M2E1LCAweDAwN2MsIDB4MjBhOSwgMHgwMDBjLAorCTB4MjBlMSwgMHgxMDAwLCAweDJlYTAsIDB4MjA5OSwgMHgwMjBhLCAweDUzYTUsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDA3OCwgMHg1NDFkLCAweDcwMDAsIDB4YTA4NCwgMHhmZjAwLCAweGEwOGMsIDB4ZjAwMCwgMHg4MDA3LAorCTB4YTE5NiwgMHgwMDAwLCAweDAwYzAsIDB4NTQzNywgMHgwMDc4LCAweDU2N2MsIDB4MDA3YywgMHhhMTk2LAorCTB4MjAwMCwgMHgwMGMwLCAweDU0NDgsIDB4NjkwMCwgMHhhMThlLCAweDAwMDEsIDB4MDBjMCwgMHg1NDQ0LAorCTB4MTA3OCwgMHgzYTQzLCAweDAwNzgsIDB4NTQzNiwgMHgxMDc4LCAweDU0NTAsIDB4MDA3OCwgMHg1NDM2LAorCTB4YTE5NiwgMHg4MDAwLCAweDAwYzAsIDB4NTQzNiwgMHgxMDc4LCAweDU3MGMsIDB4MDA3OCwgMHg1NDM2LAorCTB4MGM3ZSwgMHg3MTEwLCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweGExOTYsIDB4MDAwMSwgMHgwMDQwLAorCTB4NTQ1ZCwgMHhhMTk2LCAweDAwMjMsIDB4MDBjMCwgMHg1NTY4LCAweGEwOGUsIDB4MDAyMywgMHgwMGMwLAorCTB4NTQ5MiwgMHgxMDc4LCAweDU3YjIsIDB4MDA0MCwgMHg1NTY4LCAweDcxMjQsIDB4NjEwYSwgMHg3MDMwLAorCTB4YTA4ZSwgMHgwMjAwLCAweDAwYzAsIDB4NTQ3NiwgMHg3MDM0LCAweGEwMDUsIDB4MDBjMCwgMHg1NTY4LAorCTB4MjAwOSwgMHgwMDE1LCAweDEwNzgsIDB4NzU2YywgMHgwMDc4LCAweDU1NjgsIDB4YTA4ZSwgMHgwMjE0LAorCTB4MDA0MCwgMHg1NDdlLCAweGEwOGUsIDB4MDIxMCwgMHgwMGMwLCAweDU0ODQsIDB4MjAwOSwgMHgwMDE1LAorCTB4MTA3OCwgMHg3NTZjLCAweDAwNzgsIDB4NTU2OCwgMHhhMDhlLCAweDAxMDAsIDB4MDBjMCwgMHg1NTY4LAorCTB4NzAzNCwgMHhhMDA1LCAweDAwYzAsIDB4NTU2OCwgMHgyMDA5LCAweDAwMTYsIDB4MTA3OCwgMHg3NTZjLAorCTB4MDA3OCwgMHg1NTY4LCAweGEwOGUsIDB4MDAyMiwgMHgwMGMwLCAweDU1NjgsIDB4NzAzMCwgMHhhMDhlLAorCTB4MDMwMCwgMHgwMGMwLCAweDU0YTMsIDB4NzAzNCwgMHhhMDA1LCAweDAwYzAsIDB4NTU2OCwgMHgyMDA5LAorCTB4MDAxNywgMHgwMDc4LCAweDU1MzQsIDB4YTA4ZSwgMHgwNTAwLCAweDAwYzAsIDB4NTRhZiwgMHg3MDM0LAorCTB4YTAwNSwgMHgwMGMwLCAweDU1NjgsIDB4MjAwOSwgMHgwMDE4LCAweDAwNzgsIDB4NTUzNCwgMHhhMDhlLAorCTB4MjAxMCwgMHgwMGMwLCAweDU0YjcsIDB4MjAwOSwgMHgwMDE5LCAweDAwNzgsIDB4NTUzNCwgMHhhMDhlLAorCTB4MjExMCwgMHgwMGMwLCAweDU0YmYsIDB4MjAwOSwgMHgwMDFhLCAweDAwNzgsIDB4NTUzNCwgMHhhMDhlLAorCTB4NTIwMCwgMHgwMGMwLCAweDU0Y2IsIDB4NzAzNCwgMHhhMDA1LCAweDAwYzAsIDB4NTU2OCwgMHgyMDA5LAorCTB4MDAxYiwgMHgwMDc4LCAweDU1MzQsIDB4YTA4ZSwgMHg1MDAwLCAweDAwYzAsIDB4NTRkNywgMHg3MDM0LAorCTB4YTAwNSwgMHgwMGMwLCAweDU1NjgsIDB4MjAwOSwgMHgwMDFjLCAweDAwNzgsIDB4NTUzNCwgMHhhMDhlLAorCTB4MTMwMCwgMHgwMGMwLCAweDU0ZGYsIDB4MjAwOSwgMHgwMDM0LCAweDAwNzgsIDB4NTUzNCwgMHhhMDhlLAorCTB4MTIwMCwgMHgwMGMwLCAweDU0ZWIsIDB4NzAzNCwgMHhhMDA1LCAweDAwYzAsIDB4NTU2OCwgMHgyMDA5LAorCTB4MDAyNCwgMHgwMDc4LCAweDU1MzQsIDB4YTA4YywgMHhmZjAwLCAweGExOGUsIDB4MjQwMCwgMHgwMGMwLAorCTB4NTRmNSwgMHgyMDA5LCAweDAwMmQsIDB4MDA3OCwgMHg1NTM0LCAweGEwOGMsIDB4ZmYwMCwgMHhhMThlLAorCTB4NTMwMCwgMHgwMGMwLCAweDU0ZmYsIDB4MjAwOSwgMHgwMDJhLCAweDAwNzgsIDB4NTUzNCwgMHhhMDhlLAorCTB4MGYwMCwgMHgwMGMwLCAweDU1MDcsIDB4MjAwOSwgMHgwMDIwLCAweDAwNzgsIDB4NTUzNCwgMHhhMDhlLAorCTB4NTMwMCwgMHgwMGMwLCAweDU1MGQsIDB4MDA3OCwgMHg1NTJhLCAweGEwOGUsIDB4NjEwNCwgMHgwMGMwLAorCTB4NTUyYSwgMHgyMDExLCAweGE4OGQsIDB4ODIwOCwgMHgyMjA0LCAweGEwODIsIDB4MDAwNCwgMHgyMGE4LAorCTB4OTVhYywgMHg5NWFjLCAweDIwMTEsIDB4ODAxNSwgMHgyMTFjLCAweDgxMDgsIDB4MDQ3ZSwgMHgyMTI0LAorCTB4MTA3OCwgMHgzNTc5LCAweDA0N2YsIDB4ODEwOCwgMHgwMGYwLCAweDU1MWEsIDB4MjAwOSwgMHgwMDIzLAorCTB4MDA3OCwgMHg1NTM0LCAweGEwOGUsIDB4NjAwMCwgMHgwMGMwLCAweDU1MzIsIDB4MjAwOSwgMHgwMDNmLAorCTB4MDA3OCwgMHg1NTM0LCAweDIwMDksIDB4MDAxZCwgMHgwMTdlLCAweDIwMTEsIDB4YTg4MywgMHgyMjA0LAorCTB4ODIxMSwgMHgyMjBjLCAweDEwNzgsIDB4MjRlMywgMHgwMGMwLCAweDU1NmEsIDB4MTA3OCwgMHg0NDk5LAorCTB4MDBjMCwgMHg1NTZhLCAweDY2MTIsIDB4NjUxNiwgMHg4NmZmLCAweDAwNDAsIDB4NTU1YSwgMHgwMTdmLAorCTB4MDE3ZSwgMHhhMTg2LCAweDAwMTcsIDB4MDBjMCwgMHg1NTVhLCAweDY4NjgsIDB4YTYwNiwgMHgwMGMwLAorCTB4NTU1YSwgMHg2ODZjLCAweGE1MDYsIDB4YTA4NCwgMHhmZjAwLCAweDAwYzAsIDB4NTU1YSwgMHg2MDAwLAorCTB4YzBmNSwgMHg2MDAyLCAweDBjN2UsIDB4MTA3OCwgMHg3NGQ3LCAweDAwNDAsIDB4NTU2ZCwgMHgwMTdmLAorCTB4NjExYSwgMHg2MDFmLCAweDAwMDQsIDB4NzEyMCwgMHg2MTBhLCAweDAxN2YsIDB4MTA3OCwgMHg3NTZjLAorCTB4MGM3ZiwgMHgwMDdjLCAweDAxN2YsIDB4MDA3OCwgMHg1NTY4LCAweDBjN2YsIDB4MDA3OCwgMHg1NTZhLAorCTB4MGM3ZSwgMHgxMDc4LCAweDU1ZDQsIDB4MDBjMCwgMHg1NWQyLCAweGExODQsIDB4ZmYwMCwgMHg4MDA3LAorCTB4YTA4NiwgMHgwMDA4LCAweDAwYzAsIDB4NTVkMiwgMHhhMjhlLCAweDAwMzMsIDB4MDBjMCwgMHg1NWEzLAorCTB4MTA3OCwgMHg1N2IyLCAweDAwNDAsIDB4NTVkMiwgMHg3MTI0LCAweDYxMGEsIDB4NzAzMCwgMHhhMDhlLAorCTB4MDIwMCwgMHgwMGMwLCAweDU1OTUsIDB4NzAzNCwgMHhhMDA1LCAweDAwYzAsIDB4NTVkMiwgMHgyMDA5LAorCTB4MDAxNSwgMHgxMDc4LCAweDc1NmMsIDB4MDA3OCwgMHg1NWQyLCAweGEwOGUsIDB4MDEwMCwgMHgwMGMwLAorCTB4NTVkMiwgMHg3MDM0LCAweGEwMDUsIDB4MDBjMCwgMHg1NWQyLCAweDIwMDksIDB4MDAxNiwgMHgxMDc4LAorCTB4NzU2YywgMHgwMDc4LCAweDU1ZDIsIDB4YTI4ZSwgMHgwMDMyLCAweDAwYzAsIDB4NTVkMiwgMHg3MDMwLAorCTB4YTA4ZSwgMHgxNDAwLCAweDAwYzAsIDB4NTVkMiwgMHgyMDA5LCAweDAwMzgsIDB4MDE3ZSwgMHgyMDExLAorCTB4YTg4MywgMHgyMjA0LCAweDgyMTEsIDB4MjIwYywgMHgxMDc4LCAweDI0ZTMsIDB4MDBjMCwgMHg1NWQxLAorCTB4MTA3OCwgMHg0NDk5LCAweDAwYzAsIDB4NTVkMSwgMHg2NjEyLCAweDY1MTYsIDB4MGM3ZSwgMHgxMDc4LAorCTB4NzRkNywgMHgwMDQwLCAweDU1ZDAsIDB4MDE3ZiwgMHg2MTFhLCAweDYwMWYsIDB4MDAwNCwgMHg3MTIwLAorCTB4NjEwYSwgMHgwMTdmLCAweDEwNzgsIDB4NzU2YywgMHgxMDc4LCAweDYxMDksIDB4MDA3OCwgMHg1NWQyLAorCTB4MGM3ZiwgMHgwMTdmLCAweDBjN2YsIDB4MDA3YywgMHgwZjdlLCAweDBkN2UsIDB4MDI3ZSwgMHgwMTdlLAorCTB4MTM3ZSwgMHgxNDdlLCAweDE1N2UsIDB4M2MwMCwgMHgwMDdlLCAweDIwNzksIDB4MDAzMCwgMHgyMDY5LAorCTB4MDIwMCwgMHgxMDc4LCAweDFjMjUsIDB4MDBjMCwgMHg1NjE1LCAweDEwNzgsIDB4MWIxNSwgMHgwMDQwLAorCTB4NTYxZiwgMHg3OTA4LCAweGExOGMsIDB4MWZmZiwgMHhhMTgyLCAweDAwMTEsIDB4MDBjOCwgMHg1NjFmLAorCTB4MjBhOSwgMHgwMDBjLCAweDIwZTEsIDB4MDAwMCwgMHgyZWEwLCAweDIwOTksIDB4MDIwYSwgMHg1M2E1LAorCTB4MjBlMSwgMHgyMDAwLCAweDIwMDEsIDB4MDIwYSwgMHgyMDA0LCAweDdhMGMsIDB4NzgwOCwgMHhhMDgwLAorCTB4MDAwNywgMHhhMDg0LCAweDFmZjgsIDB4YTA4YSwgMHgwMTQwLCAweDEwYzgsIDB4MTMyOCwgMHg4MGFjLAorCTB4MjBlMSwgMHg2MDAwLCAweDIwOTksIDB4MDIwYSwgMHg1M2E1LCAweDIwZTEsIDB4NzAwMCwgMHg2ODI4LAorCTB4NjgyOCwgMHg3ODAzLCAweDAwMDQsIDB4YTI5NCwgMHgwMDcwLCAweDAwN2YsIDB4MjBlMCwgMHgxNTdmLAorCTB4MTQ3ZiwgMHgxMzdmLCAweDAxN2YsIDB4MDI3ZiwgMHgwZDdmLCAweDBmN2YsIDB4MDA3YywgMHhhMDg1LAorCTB4MDAwMSwgMHgwMDc4LCAweDU2MTUsIDB4MDQ3ZSwgMHgwZTdlLCAweDBkN2UsIDB4MjAyOCwgMHgyMTMwLAorCTB4YTY5NiwgMHgwMGZmLCAweDAwYzAsIDB4NTY0NCwgMHhhNTk2LCAweGZmZmQsIDB4MDBjMCwgMHg1NjM0LAorCTB4MjAwOSwgMHgwMDdmLCAweDAwNzgsIDB4NTY3NywgMHhhNTk2LCAweGZmZmUsIDB4MDBjMCwgMHg1NjNjLAorCTB4MjAwOSwgMHgwMDdlLCAweDAwNzgsIDB4NTY3NywgMHhhNTk2LCAweGZmZmMsIDB4MDBjMCwgMHg1NjQ0LAorCTB4MjAwOSwgMHgwMDgwLCAweDAwNzgsIDB4NTY3NywgMHgyMDExLCAweDAwMDAsIDB4MjAyMSwgMHgwMDgxLAorCTB4MjBhOSwgMHgwMDdlLCAweDIwNzEsIDB4YTRiNSwgMHgyZTFjLCAweDgzZmYsIDB4MDBjMCwgMHg1NjU2LAorCTB4ODJmZiwgMHgwMGMwLCAweDU2NmIsIDB4MjQxMCwgMHgwMDc4LCAweDU2NmIsIDB4MjM2OCwgMHg2ZjEwLAorCTB4MDA3ZSwgMHgyMTAwLCAweGE3MDYsIDB4MDA3ZiwgMHg2YjE0LCAweDAwYzAsIDB4NTY2NSwgMHhhMzQ2LAorCTB4MDBjMCwgMHg1NjY1LCAweDI0MDgsIDB4MDA3OCwgMHg1Njc3LCAweDg3ZmYsIDB4MDBjMCwgMHg1NjZiLAorCTB4ODNmZiwgMHgwMDQwLCAweDU2NTAsIDB4ODQyMCwgMHg4ZTcwLCAweDAwZjAsIDB4NTY0YywgMHg4MmZmLAorCTB4MDBjMCwgMHg1Njc2LCAweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDU2NzgsIDB4MjIwOCwgMHhhMDA2LAorCTB4MGQ3ZiwgMHgwZTdmLCAweDA0N2YsIDB4MDA3YywgMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHg1NjgxLAorCTB4MDA3YywgMHg1Njg5LCAweDU2ODksIDB4NTY4OSwgMHg1N2M4LCAweDU2ODksIDB4NTY4YSwgMHg1NmEzLAorCTB4NTZmMywgMHgwMDdjLCAweDcxMTAsIDB4ZDFiYywgMHgwMDQwLCAweDU2YTIsIDB4NzEyMCwgMHgyMTYwLAorCTB4YWM4YywgMHgwMDBmLCAweDAwYzAsIDB4NTZhMiwgMHhhYzhhLCAweGFhMDAsIDB4MDA0OCwgMHg1NmEyLAorCTB4Njg1NCwgMHhhYzAyLCAweDAwYzgsIDB4NTZhMiwgMHg3MTI0LCAweDYxMGEsIDB4MjAwOSwgMHgwMDQ2LAorCTB4MTA3OCwgMHg3NTZjLCAweDAwN2MsIDB4MGM3ZSwgMHg3MTEwLCAweGQxYmMsIDB4MDBjMCwgMHg1NmYxLAorCTB4MjAxMSwgMHhhODgzLCAweDIyMDQsIDB4ODIxMSwgMHgyMjBjLCAweDEwNzgsIDB4MjRlMywgMHgwMGMwLAorCTB4NTZmMSwgMHgxMDc4LCAweDQ0OTksIDB4MDBjMCwgMHg1NmYxLCAweDY2MTIsIDB4NjUxNiwgMHg2MDAwLAorCTB4ZDBlYywgMHgwMGMwLCAweDU2ZjEsIDB4NjIwNCwgMHhhMjk0LCAweGZmMDAsIDB4ODIxNywgMHhhMjg2LAorCTB4MDAwNiwgMHgwMGMwLCAweDU2ZDYsIDB4MGM3ZSwgMHgxMDc4LCAweDc0ZDcsIDB4MDE3ZiwgMHgwMDQwLAorCTB4NTZmMSwgMHg2MTFhLCAweDYwMWYsIDB4MDAwNiwgMHg3MTIwLCAweDYxMGEsIDB4NzEzMCwgMHg2MTIyLAorCTB4MjAwOSwgMHgwMDQ0LCAweDEwNzgsIDB4NzU2YywgMHgwMDc4LCAweDU2ZjEsIDB4MGM3ZSwgMHgxMDc4LAorCTB4NzRkNywgMHgwMTdmLCAweDAwNDAsIDB4NTZmMSwgMHg2MTFhLCAweDYwMWYsIDB4MDAwNCwgMHg3MTIwLAorCTB4NjEwYSwgMHhhMjg2LCAweDAwMDQsIDB4MDBjMCwgMHg1NmU5LCAweDYwMDcsIDB4MDAwNSwgMHgwMDc4LAorCTB4NTZlYiwgMHg2MDA3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsIDB4NWM0NSwgMHgxMDc4LAorCTB4NjEwOSwgMHgwYzdmLCAweDAwN2MsIDB4NzExMCwgMHhkMWJjLCAweDAwNDAsIDB4NTcwYiwgMHg3MDIwLAorCTB4MjA2MCwgMHhhYzg0LCAweDAwMGYsIDB4MDBjMCwgMHg1NzBiLCAweGFjODIsIDB4YWEwMCwgMHgwMDQ4LAorCTB4NTcwYiwgMHg2ODU0LCAweGFjMDIsIDB4MDBjOCwgMHg1NzBiLCAweDcxMjQsIDB4NjEwYSwgMHgyMDA5LAorCTB4MDA0NSwgMHgxMDc4LCAweDc1NmMsIDB4MDA3YywgMHg3MTEwLCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLAorCTB4YTE4ZSwgMHgwMDAwLCAweDAwYzAsIDB4NTcxYywgMHhhMDg0LCAweDAwMGYsIDB4YTA4YSwgMHgwMDA2LAorCTB4MDBjOCwgMHg1NzFjLCAweDEwNzksIDB4NTcxZCwgMHgwMDdjLCAweDU3MjMsIDB4NTcyNCwgMHg1NzIzLAorCTB4NTcyMywgMHg1Nzk0LCAweDU3YTMsIDB4MDA3YywgMHg3MTEwLCAweGQxYmMsIDB4MDA0MCwgMHg1NzJjLAorCTB4NzAyYywgMHhkMDg0LCAweDAwNDAsIDB4NTc5MywgMHg3MDBjLCAweDcxMDgsIDB4MTA3OCwgMHgyNGUzLAorCTB4MDBjMCwgMHg1NzkzLCAweDEwNzgsIDB4NDQ5OSwgMHgwMGMwLCAweDU3OTMsIDB4NjYxMiwgMHg2NTE2LAorCTB4NjIwNCwgMHg3MTEwLCAweGQxYmMsIDB4MDA0MCwgMHg1NzVlLCAweGEyOGMsIDB4MDBmZiwgMHhhMTg2LAorCTB4MDAwNCwgMHgwMDQwLCAweDU3NDcsIDB4YTE4NiwgMHgwMDA2LCAweDAwYzAsIDB4NTc4NCwgMHgwYzdlLAorCTB4MTA3OCwgMHg1N2IyLCAweDBjN2YsIDB4MDA0MCwgMHg1NzkzLCAweDBjN2UsIDB4MTA3OCwgMHg3NGQ3LAorCTB4MDE3ZiwgMHgwMDQwLCAweDU3OTMsIDB4NjExYSwgMHg2MDFmLCAweDAwMDIsIDB4NzEyMCwgMHg2MTBhLAorCTB4MjAwOSwgMHgwMDg4LCAweDEwNzgsIDB4NzU2YywgMHgwMDc4LCAweDU3OTMsIDB4YTI4YywgMHgwMGZmLAorCTB4YTE4NiwgMHgwMDA2LCAweDAwNDAsIDB4NTc3MywgMHhhMTg2LCAweDAwMDQsIDB4MDA0MCwgMHg1NzczLAorCTB4YTI5NCwgMHhmZjAwLCAweDgyMTcsIDB4YTI4NiwgMHgwMDA0LCAweDAwNDAsIDB4NTc3MywgMHhhMjg2LAorCTB4MDAwNiwgMHgwMGMwLCAweDU3ODQsIDB4MGM3ZSwgMHgxMDc4LCAweDc0ZDcsIDB4MDE3ZiwgMHgwMDQwLAorCTB4NTc5MywgMHg2MTFhLCAweDYwMWYsIDB4MDAwNSwgMHg3MTIwLCAweDYxMGEsIDB4MjAwOSwgMHgwMDg4LAorCTB4MTA3OCwgMHg3NTZjLCAweDAwNzgsIDB4NTc5MywgMHgwYzdlLCAweDEwNzgsIDB4NzRkNywgMHgwMTdmLAorCTB4MDA0MCwgMHg1NzkzLCAweDYxMWEsIDB4NjAxZiwgMHgwMDA0LCAweDcxMjAsIDB4NjEwYSwgMHgyMDA5LAorCTB4MDAwMSwgMHgxMDc4LCAweDc1NmMsIDB4MDA3YywgMHg3MTEwLCAweGQxYmMsIDB4MDA0MCwgMHg1N2EyLAorCTB4MTA3OCwgMHg1N2IyLCAweDAwNDAsIDB4NTdhMiwgMHg3MTI0LCAweDYxMGEsIDB4MjAwOSwgMHgwMDg5LAorCTB4MTA3OCwgMHg3NTZjLCAweDAwN2MsIDB4NzExMCwgMHhkMWJjLCAweDAwNDAsIDB4NTdiMSwgMHgxMDc4LAorCTB4NTdiMiwgMHgwMDQwLCAweDU3YjEsIDB4NzEyNCwgMHg2MTBhLCAweDIwMDksIDB4MDA4YSwgMHgxMDc4LAorCTB4NzU2YywgMHgwMDdjLCAweDcwMjAsIDB4MjA2MCwgMHhhYzg0LCAweDAwMGYsIDB4MDBjMCwgMHg1N2M1LAorCTB4YWM4MiwgMHhhYTAwLCAweDAwNDgsIDB4NTdjNSwgMHgyMDAxLCAweGEzMTUsIDB4MjAwNCwgMHhhYzAyLAorCTB4MDBjOCwgMHg1N2M1LCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHg1N2M0LAorCTB4NzExMCwgMHhkMWJjLCAweDAwYzAsIDB4NTdkZSwgMHg3MDI0LCAweDIwNjAsIDB4YWM4NCwgMHgwMDBmLAorCTB4MDBjMCwgMHg1N2RlLCAweGFjODIsIDB4YWEwMCwgMHgwMDQ4LCAweDU3ZGUsIDB4Njg1NCwgMHhhYzAyLAorCTB4MDBjOCwgMHg1N2RlLCAweDIwMDksIDB4MDA1MSwgMHgxMDc4LCAweDc1NmMsIDB4MDA3YywgMHgyMDcxLAorCTB4YTViZSwgMHg3MDAzLCAweDAwMDMsIDB4NzAwZiwgMHgwMzYxLCAweGEwMDYsIDB4NzAxYSwgMHg3MDEyLAorCTB4NzAxNywgMHhhYTAwLCAweDcwMDcsIDB4MDAwMCwgMHg3MDI2LCAweDcwMmIsIDB4NmM0ZSwgMHg3MDMyLAorCTB4NzAzNywgMHg2Y2EwLCAweDcwM2IsIDB4MDAwMiwgMHg3MDNmLCAweDAwMDAsIDB4NzA0MywgMHhmZmZmLAorCTB4NzA0NywgMHhmZmZmLCAweDAwN2MsIDB4MjA3MSwgMHhhNWJlLCAweDAwZTAsIDB4NThjMSwgMHgyMDkxLAorCTB4NjAwMCwgMHg3MDBjLCAweDgwMDEsIDB4NzAwZSwgMHgwMGMwLCAweDU4NzMsIDB4NzAwZiwgMHgwMzYxLAorCTB4NzAwNywgMHgwMDAxLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDcxMzgsIDB4ODEwOSwgMHg3MTNhLAorCTB4MDBjMCwgMHg1ODcxLCAweDcwM2IsIDB4MDAwMiwgMHgyMDA5LCAweDAxMDAsIDB4MjEwNCwgMHhhMDgyLAorCTB4MDAwMywgMHgwMGM4LCAweDU4NzEsIDB4NzAzYywgMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHg1ODRlLAorCTB4MGQ3ZSwgMHgyMDY5LCAweDAxNDAsIDB4NjgwNCwgMHhhMDg0LCAweDQwMDAsIDB4MDA0MCwgMHg1ODJjLAorCTB4NjgwMywgMHgxMDAwLCAweDAwNzgsIDB4NTgzMywgMHg2ODA0LCAweGEwODQsIDB4MTAwMCwgMHgwMDQwLAorCTB4NTgzMywgMHg2ODAzLCAweDAxMDAsIDB4NjgwMywgMHgwMDAwLCAweDcwM2YsIDB4MDAwMCwgMHgyMDY5LAorCTB4YTVhYiwgMHg2ODA0LCAweGEwODIsIDB4MDAwNiwgMHgwMGMwLCAweDU4NDAsIDB4NjgwNywgMHgwMDAwLAorCTB4NjgzMCwgMHhhMDgyLCAweDAwMDMsIDB4MDBjMCwgMHg1ODQ3LCAweDY4MzMsIDB4MDAwMCwgMHgxMDc4LAorCTB4NjEwOSwgMHgxMDc4LCAweDYxZDMsIDB4MGQ3ZiwgMHgwMDc4LCAweDU4NzEsIDB4MGQ3ZSwgMHgyMDY5LAorCTB4YTMwMCwgMHg2OTQ0LCAweDY4NjAsIDB4YTEwMiwgMHgwMGM4LCAweDU4NzAsIDB4MjA2OSwgMHhhNWFiLAorCTB4NjgwNCwgMHhhMDg2LCAweDAwMDAsIDB4MDBjMCwgMHg1ODcwLCAweDY4MzAsIDB4YTA4NiwgMHgwMDAwLAorCTB4MDBjMCwgMHg1ODcwLCAweDcwM2YsIDB4MDAwMSwgMHg2ODA3LCAweDAwMDYsIDB4NjgzMywgMHgwMDAzLAorCTB4MjA2OSwgMHgwMTAwLCAweDY4MzAsIDB4Njg5ZSwgMHgyMDY5LCAweDAxNDAsIDB4NjgwMywgMHgwNjAwLAorCTB4MGQ3ZiwgMHgwMDc4LCAweDU4NzYsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NzAyNCwgMHhhMDBkLAorCTB4MDA0MCwgMHg1ODhlLCAweDcwMjAsIDB4ODAwMSwgMHg3MDIyLCAweDAwYzAsIDB4NTg4ZSwgMHg3MDIzLAorCTB4MDAwOSwgMHg4MTA5LCAweDcxMjYsIDB4YTE4NiwgMHgwM2U4LCAweDAwYzAsIDB4NTg4OSwgMHg3MDI4LAorCTB4MTA3YSwgMHg4MWZmLCAweDAwYzAsIDB4NTg4ZSwgMHg3MDI4LCAweDEwN2EsIDB4NzAzMCwgMHhhMDBkLAorCTB4MDA0MCwgMHg1ODlmLCAweDcwMmMsIDB4ODAwMSwgMHg3MDJlLCAweDAwYzAsIDB4NTg5ZiwgMHg3MDJmLAorCTB4MDAwOSwgMHg4MTA5LCAweDcxMzIsIDB4MDBjMCwgMHg1ODlmLCAweDcwMzQsIDB4MTA3YSwgMHg3MDQwLAorCTB4YTAwNSwgMHgwMDQwLCAweDU4YTcsIDB4MDA1MCwgMHg1OGE3LCAweDgwMDEsIDB4NzA0MiwgMHg3MDQ0LAorCTB4YTAwNSwgMHgwMDQwLCAweDU4YWYsIDB4MDA1MCwgMHg1OGFmLCAweDgwMDEsIDB4NzA0NiwgMHg3MDE4LAorCTB4YTAwZCwgMHgwMDQwLCAweDU4YzAsIDB4NzAwOCwgMHg4MDAxLCAweDcwMGEsIDB4MDBjMCwgMHg1OGMwLAorCTB4NzAwYiwgMHgwMDA5LCAweDgxMDksIDB4NzExYSwgMHgwMGMwLCAweDU4YzAsIDB4NzAxYywgMHgxMDdhLAorCTB4MTI3ZiwgMHg3MDA0LCAweDAwNzksIDB4NThjNCwgMHg1OGViLCAweDU4ZWMsIDB4NTkwOCwgMHgwZTdlLAorCTB4MjA3MSwgMHhhNWJlLCAweDcwMTgsIDB4YTAwNSwgMHgwMGMwLCAweDU4ZDIsIDB4NzExYSwgMHg3MjFlLAorCTB4NzAwYiwgMHgwMDA5LCAweDBlN2YsIDB4MDA3YywgMHgwZTdlLCAweDAwN2UsIDB4MjA3MSwgMHhhNWJlLAorCTB4NzAxYywgMHhhMjA2LCAweDAwYzAsIDB4NThkZSwgMHg3MDFhLCAweDcwMWUsIDB4MDA3ZiwgMHgwZTdmLAorCTB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YTViZSwgMHg2MDg4LCAweGExMDIsIDB4MDA0OCwgMHg1OGU5LAorCTB4NjE4YSwgMHgwZTdmLCAweDAwN2MsIDB4MDA3YywgMHg3MTEwLCAweDEwNzgsIDB4NDUwMSwgMHgwMGMwLAorCTB4NThmZSwgMHg2MDg4LCAweDgwMDEsIDB4MDA0OCwgMHg1OGZlLCAweDYwOGEsIDB4MDBjMCwgMHg1OGZlLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg2MTA5LCAweDEyN2YsIDB4ODEwOCwgMHhhMTgyLAorCTB4MDBmZiwgMHgwMDQ4LCAweDU5MDYsIDB4YTAwZSwgMHg3MDA3LCAweDAwMDIsIDB4NzExMiwgMHgwMDdjLAorCTB4NzAxNCwgMHgyMDYwLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYwM2MsIDB4YTAwNSwgMHgwMDQwLAorCTB4NTkxNywgMHg4MDAxLCAweDYwM2UsIDB4MDBjMCwgMHg1OTE3LCAweDEwNzgsIDB4OGNkNywgMHg2MDE0LAorCTB4YTAwNSwgMHgwMDQwLCAweDU5NDEsIDB4ODAwMSwgMHg2MDE2LCAweDAwYzAsIDB4NTk0MSwgMHg2MTFjLAorCTB4YTE4NiwgMHgwMDAzLCAweDAwNDAsIDB4NTkyOCwgMHhhMTg2LCAweDAwMDYsIDB4MDBjMCwgMHg1OTNmLAorCTB4NjAxMCwgMHgyMDY4LCAweDY4NTQsIDB4YTA4YSwgMHgxOTlhLCAweDAwNDgsIDB4NTkzZiwgMHhhMDgyLAorCTB4MTk5OSwgMHg2ODU2LCAweGEwOGEsIDB4MTk5YSwgMHgwMDQ4LCAweDU5MzgsIDB4MjAwMSwgMHgxOTk5LAorCTB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4YTEwOCwgMHg2MTE2LCAweDAwNzgsIDB4NTk0MSwgMHgxMDc4LAorCTB4ODgxMCwgMHgxMjdmLCAweGFjODgsIDB4MDAxMCwgMHg3MTE2LCAweDIwMDEsIDB4Y2EwMCwgMHhhMTAyLAorCTB4MDA0OCwgMHg1OTRlLCAweDcwMTcsIDB4YWEwMCwgMHg3MDA3LCAweDAwMDAsIDB4MDA3YywgMHgwZTdlLAorCTB4MjA3MSwgMHhhNWJlLCAweDcwMjcsIDB4MDdkMCwgMHg3MDIzLCAweDAwMDksIDB4NzAzYiwgMHgwMDAyLAorCTB4MGU3ZiwgMHgwMDdjLCAweDIwMDEsIDB4YTVjNywgMHgyMDAzLCAweDAwMDAsIDB4MDA3YywgMHgwZTdlLAorCTB4MjA3MSwgMHhhNWJlLCAweDcxMzIsIDB4NzAyZiwgMHgwMDA5LCAweDBlN2YsIDB4MDA3YywgMHgyMDExLAorCTB4YTVjYSwgMHgyMDEzLCAweDAwMDAsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YTViZSwgMHg3MTFhLAorCTB4NzIxZSwgMHg3MDBiLCAweDAwMDksIDB4MGU3ZiwgMHgwMDdjLCAweDAyN2UsIDB4MGU3ZSwgMHgwZjdlLAorCTB4MjA3OSwgMHhhMzAwLCAweDdhMzQsIDB4ZDI5NCwgMHgwMDQwLCAweDU5YTQsIDB4MjA3MSwgMHhhNWFhLAorCTB4MmUxNCwgMHhhMGZlLCAweDAwMDAsIDB4MDA0MCwgMHg1OTkxLCAweGEwZmUsIDB4MDAwMSwgMHgwMDQwLAorCTB4NTk5NSwgMHhhMGZlLCAweDAwMDIsIDB4MDBjMCwgMHg1OWEwLCAweGEyOTIsIDB4MDA4NSwgMHgwMDc4LAorCTB4NTk5NywgMHhhMjkyLCAweDAwMDUsIDB4MDA3OCwgMHg1OTk3LCAweGEyOTIsIDB4MDAwMiwgMHgyMjcyLAorCTB4MDA0MCwgMHg1OTljLCAweDAwYzgsIDB4NTlhNCwgMHgyMDExLCAweDgwMzcsIDB4MTA3OCwgMHgzNTc5LAorCTB4MjAxMSwgMHhhNWE5LCAweDIyMDQsIDB4MjA3MiwgMHgwZjdmLCAweDBlN2YsIDB4MDI3ZiwgMHgwMDdjLAorCTB4MGM3ZSwgMHgyMDYxLCAweGE2MmQsIDB4MGM3ZiwgMHgwMDdjLCAweGExODQsIDB4MDAwZiwgMHg4MDAzLAorCTB4ODAwMywgMHg4MDAzLCAweGEwODAsIDB4YTYyZCwgMHgyMDYwLCAweDAwN2MsIDB4Njg1NCwgMHhhMDhhLAorCTB4MTk5YSwgMHgwMDQ4LCAweDU5YmQsIDB4MjAwMSwgMHgxOTk5LCAweGEwMDUsIDB4MDBjMCwgMHg1OWNjLAorCTB4MGM3ZSwgMHgyMDYxLCAweGE2MmQsIDB4NjAxNCwgMHgwYzdmLCAweGEwMDUsIDB4MDBjMCwgMHg1OWQxLAorCTB4MjAwMSwgMHgwMDFlLCAweDAwNzgsIDB4NTlkMSwgMHhhMDhlLCAweGZmZmYsIDB4MDBjMCwgMHg1OWQxLAorCTB4YTAwNiwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHhhMTA4LCAweDYxMTYsIDB4Njg0YywgMHhhMDhjLAorCTB4MDBjMCwgMHhhMThlLCAweDAwYzAsIDB4MDA0MCwgMHg1YTI0LCAweGQwYjQsIDB4MDBjMCwgMHg1OWU4LAorCTB4ZDBiYywgMHgwMGMwLCAweDVhMTQsIDB4MjAwOSwgMHgwMDA2LCAweDEwNzgsIDB4NWE0MywgMHgwMDdjLAorCTB4ZDBmYywgMHgwMDQwLCAweDU5ZjMsIDB4YTA4NCwgMHgwMDAzLCAweDAwNDAsIDB4NTlmMywgMHhhMDg2LAorCTB4MDAwMywgMHgwMGMwLCAweDVhM2MsIDB4NjAyNCwgMHhkMGQ0LCAweDAwNDAsIDB4NTlmZCwgMHhjMGQ0LAorCTB4NjAyNiwgMHg2ODYwLCAweDYwMmEsIDB4Njg1YywgMHg2MDJlLCAweDIwMDksIDB4YTM3MywgMHgyMTA0LAorCTB4ZDA4NCwgMHgwMDQwLCAweDVhMGYsIDB4NjExOCwgMHhhMTg4LCAweDAwMjcsIDB4MjEwNCwgMHhkMDhjLAorCTB4MDBjMCwgMHg1YTBmLCAweDIwMDksIDB4MDA0MiwgMHgxMDc4LCAweDc1NmMsIDB4MDA3YywgMHgyMDA5LAorCTB4MDA0MywgMHgxMDc4LCAweDc1NmMsIDB4MDA3YywgMHhkMGZjLCAweDAwNDAsIDB4NWExZiwgMHhhMDg0LAorCTB4MDAwMywgMHgwMDQwLCAweDVhMWYsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsIDB4NWEzYywgMHgyMDA5LAorCTB4MDA0MiwgMHgxMDc4LCAweDc1NmMsIDB4MDA3YywgMHhkMGZjLCAweDAwNDAsIDB4NWEzMiwgMHhhMDg0LAorCTB4MDAwMywgMHhhMDhlLCAweDAwMDIsIDB4MDA0MCwgMHg1YTM2LCAweDIwMDksIDB4MDA0MSwgMHgxMDc4LAorCTB4NzU2YywgMHgwMDdjLCAweDEwNzgsIDB4NWE0MSwgMHgwMDc4LCAweDVhMzEsIDB4MjAwOSwgMHgwMDQzLAorCTB4MTA3OCwgMHg3NTZjLCAweDAwNzgsIDB4NWEzMSwgMHgyMDA5LCAweDAwMDQsIDB4MTA3OCwgMHg1YTQzLAorCTB4MDA3YywgMHgyMDA5LCAweDAwMDEsIDB4MGQ3ZSwgMHg2MDEwLCAweGEwZWMsIDB4ZjAwMCwgMHgwMDQwLAorCTB4NWE2YiwgMHgyMDY4LCAweDY5NTIsIDB4NjgwMCwgMHg2MDEyLCAweGExODYsIDB4MDAwMSwgMHgwMGMwLAorCTB4NWE2NSwgMHg2OTRjLCAweGExOGMsIDB4ODEwMCwgMHhhMThlLCAweDgxMDAsIDB4MDBjMCwgMHg1YTY1LAorCTB4MGM3ZSwgMHgyMDYxLCAweGE2MmQsIDB4NjIwMCwgMHhkMjhjLCAweDAwYzAsIDB4NWE2NCwgMHg2MjA0LAorCTB4ODIxMCwgMHgwMDQ4LCAweDVhNjQsIDB4NjIwNiwgMHgwYzdmLCAweDEwNzgsIDB4NDk4MiwgMHg2MDEwLAorCTB4YTA2ZCwgMHgxMGMwLCAweDU5YjYsIDB4MGQ3ZiwgMHgwMDdjLCAweDE1N2UsIDB4MGM3ZSwgMHgyMDYxLAorCTB4YTYyZCwgMHg2MDAwLCAweDgxZmYsIDB4MDA0MCwgMHg1YTc4LCAweGEyMDUsIDB4MDA3OCwgMHg1YTc5LAorCTB4YTIwNCwgMHg2MDAyLCAweDBjN2YsIDB4MTU3ZiwgMHgwMDdjLCAweDY4MDAsIDB4ZDA4YywgMHgwMGMwLAorCTB4NWE4OSwgMHg2ODA4LCAweGEwMDUsIDB4MDA0MCwgMHg1YTg5LCAweDgwMDEsIDB4NjgwYSwgMHhhMDg1LAorCTB4MDAwMSwgMHgwMDdjLCAweDIwYTksIDB4MDAxMCwgMHhhMDA2LCAweDgwMDQsIDB4ODA4NiwgMHg4MThlLAorCTB4MDBjOCwgMHg1YTkzLCAweGEyMDAsIDB4MDBmMCwgMHg1YThlLCAweDgwODYsIDB4ODE4ZSwgMHgwMDdjLAorCTB4MTU3ZSwgMHgyMGE5LCAweDAwMTAsIDB4YTAwNSwgMHgwMDQwLCAweDVhYjksIDB4YTExYSwgMHgwMGM4LAorCTB4NWFiOSwgMHg4MjEzLCAweDgxOGQsIDB4MDA0OCwgMHg1YWFjLCAweGExMWEsIDB4MDBjOCwgMHg1YWFkLAorCTB4MDBmMCwgMHg1YWExLCAweDAwNzgsIDB4NWFiMSwgMHhhMTFhLCAweDIzMDgsIDB4ODIxMCwgMHgwMGYwLAorCTB4NWFhMSwgMHgwMDdlLCAweDMyMDAsIDB4YTA4NCwgMHhmN2ZmLCAweDIwODAsIDB4MDA3ZiwgMHgxNTdmLAorCTB4MDA3YywgMHgwMDdlLCAweDMyMDAsIDB4YTA4NSwgMHgwODAwLCAweDAwNzgsIDB4NWFiNSwgMHgxMjdlLAorCTB4MjA5MSwgMHgyMjAwLCAweDIwNzksIDB4YTVhYiwgMHgxMjdmLCAweDBkN2UsIDB4MjA2OSwgMHhhNWFiLAorCTB4NjgwMywgMHgwMDA1LCAweDIwNjksIDB4MDAwNCwgMHgyZDA0LCAweGEwODUsIDB4ODAwMSwgMHgyMDZhLAorCTB4MGQ3ZiwgMHgwMDdjLCAweDBjN2UsIDB4NjAyNywgMHgwMDAxLCAweDc4MDQsIDB4YTA4NCwgMHgwMDA3LAorCTB4MDA3OSwgMHg1YWRhLCAweDVhZTQsIDB4NWIwOSwgMHg1YjY0LCAweDVhZWEsIDB4NWIwOSwgMHg1YWU0LAorCTB4NWFlMiwgMHg1YWUyLCAweDEwNzgsIDB4MTMyOCwgMHgxMDc4LCAweDU5NWEsIDB4MTA3OCwgMHg2MTA5LAorCTB4MGM3ZiwgMHgwMDdjLCAweDYyYzAsIDB4ODJmZiwgMHgwMGMwLCAweDVhZjAsIDB4MGM3ZiwgMHgwMDdjLAorCTB4MjAxMSwgMHg0MTI5LCAweDEwNzgsIDB4NThkNCwgMHg3ODI4LCAweGEwOTIsIDB4MDBjOCwgMHgwMGM4LAorCTB4NWFmZiwgMHg4MDAwLCAweDc4MmEsIDB4MTA3OCwgMHg0MTY4LCAweDAwNzgsIDB4NWFlZSwgMHgxMDc4LAorCTB4NDEyOSwgMHg3ODA3LCAweDAwMDMsIDB4NzgyNywgMHgwMDAwLCAweDc4MmIsIDB4MDAwMCwgMHgwMDc4LAorCTB4NWFlZSwgMHgxMDc4LCAweDU5NWEsIDB4M2MwMCwgMHgwMDdlLCAweDIwMTEsIDB4MDIwOSwgMHgyMGUxLAorCTB4NDAwMCwgMHgyMjE0LCAweDAwN2YsIDB4MjBlMCwgMHg4MmZmLCAweDAwNDAsIDB4NWIyNywgMHg2MmMwLAorCTB4ODJmZiwgMHgwMGMwLCAweDViMjcsIDB4NzgyYiwgMHgwMDAwLCAweDc4MjQsIDB4YTA2NSwgMHgxMDQwLAorCTB4MTMyOCwgMHgyMDA5LCAweDAwMTMsIDB4MTA3OCwgMHg3NTZjLCAweDBjN2YsIDB4MDA3YywgMHgzOTAwLAorCTB4YTA4MiwgMHhhNmNkLCAweDAwYzgsIDB4NWIyZSwgMHgxMDc4LCAweDcyOGEsIDB4MGM3ZSwgMHg3ODI0LAorCTB4YTA2NSwgMHgxMDQwLCAweDEzMjgsIDB4NzgwNCwgMHhhMDg2LCAweDAwMDQsIDB4MDA0MCwgMHg1YmE5LAorCTB4NzgyOCwgMHhhMDkyLCAweDI3MTAsIDB4MDBjOCwgMHg1YjQ0LCAweDgwMDAsIDB4NzgyYSwgMHgwYzdmLAorCTB4MTA3OCwgMHg2YzMzLCAweDAwNzgsIDB4NWIyNSwgMHg2MTA0LCAweGExODYsIDB4MDAwMywgMHgwMGMwLAorCTB4NWI1YiwgMHgwZTdlLCAweDIwNzEsIDB4YTMwMCwgMHg3MGQ0LCAweDBlN2YsIDB4ZDA4YywgMHgwMDQwLAorCTB4NWI1YiwgMHgwYzdlLCAweDBlN2UsIDB4MjA2MSwgMHgwMTAwLCAweDIwNzEsIDB4YTMwMCwgMHgxMDc4LAorCTB4NDE3MSwgMHgwZTdmLCAweDBjN2YsIDB4MTA3OCwgMHhhMjQxLCAweDIwMDksIDB4MDAxNCwgMHgxMDc4LAorCTB4NzU2YywgMHgwYzdmLCAweDAwNzgsIDB4NWIyNSwgMHgyMDAxLCAweGE1YzcsIDB4MjAwMywgMHgwMDAwLAorCTB4NjJjMCwgMHg4MmZmLCAweDAwYzAsIDB4NWI3OCwgMHg3ODJiLCAweDAwMDAsIDB4NzgyNCwgMHhhMDY1LAorCTB4MTA0MCwgMHgxMzI4LCAweDIwMDksIDB4MDAxMywgMHgxMDc4LCAweDc1YzMsIDB4MGM3ZiwgMHgwMDdjLAorCTB4MGM3ZSwgMHgwZDdlLCAweDM5MDAsIDB4YTA4MiwgMHhhNmNkLCAweDAwYzgsIDB4NWI4MSwgMHgxMDc4LAorCTB4NzI4YSwgMHg3ODI0LCAweGEwMDUsIDB4MTA0MCwgMHgxMzI4LCAweDc4MWMsIDB4YTA2ZCwgMHgxMDQwLAorCTB4MTMyOCwgMHg2ODAwLCAweGMwZGMsIDB4NjgwMiwgMHg3OTI0LCAweDIxNjAsIDB4MTA3OCwgMHg3NTNkLAorCTB4NjkzYywgMHg4MWZmLCAweDEwNDAsIDB4MTMyOCwgMHg4MTA5LCAweDY5M2UsIDB4Njg1NCwgMHhhMDE1LAorCTB4MDA0MCwgMHg1YjlkLCAweDdhMWUsIDB4MDA3OCwgMHg1YjlmLCAweDc5MTgsIDB4NzkxZSwgMHg3ODA3LAorCTB4MDAwMCwgMHg3ODI3LCAweDAwMDAsIDB4MGQ3ZiwgMHgwYzdmLCAweDEwNzgsIDB4NjEwOSwgMHgwMDc4LAorCTB4NWI3NiwgMHg2MTA0LCAweGExODYsIDB4MDAwMiwgMHgwMDQwLCAweDViYjQsIDB4YTE4NiwgMHgwMDA0LAorCTB4MDA0MCwgMHg1YmI0LCAweDAwNzgsIDB4NWIzOCwgMHg3ODA4LCAweGFjMDYsIDB4MDA0MCwgMHg1YjM4LAorCTB4MTA3OCwgMHg2MDEwLCAweDEwNzgsIDB4NWM0NSwgMHgwYzdmLCAweDEwNzgsIDB4NjEwOSwgMHgwMDc4LAorCTB4NWIyNSwgMHgwYzdlLCAweDYwMjcsIDB4MDAwMiwgMHg2MmM4LCAweDgyZmYsIDB4MDBjMCwgMHg1YmRiLAorCTB4NjJjNCwgMHg4MmZmLCAweDAwYzAsIDB4NWJkYiwgMHg3OTNjLCAweGExZTUsIDB4MDAwMCwgMHgwMDQwLAorCTB4NWJkNSwgMHgyMDA5LCAweDAwNDksIDB4MTA3OCwgMHg3NTZjLCAweDIwMTEsIDB4YTVjYSwgMHgyMDEzLAorCTB4MDAwMCwgMHgwYzdmLCAweDAwN2MsIDB4MzkwOCwgMHhhMTkyLCAweGE2Y2QsIDB4MDBjOCwgMHg1YmUyLAorCTB4MTA3OCwgMHg3MjhhLCAweDYwMTcsIDB4MDAxMCwgMHg3OTNjLCAweDgxZmYsIDB4MDA0MCwgMHg1YmQ1LAorCTB4NzkzYywgMHhhMTg4LCAweDAwMDcsIDB4MjEwYywgMHhhMThlLCAweDAwMDYsIDB4MDBjMCwgMHg1YmY0LAorCTB4NjAxNywgMHgwMDEyLCAweDAwNzgsIDB4NWJkOSwgMHg2MDE3LCAweDAwMTYsIDB4MDA3OCwgMHg1YmQ5LAorCTB4MDA3ZSwgMHgwMTdlLCAweDBjN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjAwZiwgMHgwMDAwLAorCTB4MmMwOCwgMHgyMDYxLCAweGE1YWIsIDB4NjAyMCwgMHg4MDAwLCAweDYwMjIsIDB4NjAxMCwgMHhhMDA1LAorCTB4MDA0MCwgMHg1YzEzLCAweGEwODAsIDB4MDAwMywgMHgyMTAyLCAweDYxMTIsIDB4MTI3ZiwgMHgwYzdmLAorCTB4MDE3ZiwgMHgwMDdmLCAweDAwN2MsIDB4NjExNiwgMHg2MTEyLCAweDAwNzgsIDB4NWMwZSwgMHgwZDdlLAorCTB4MjA2OSwgMHhhNWFiLCAweDYwMDAsIDB4ZDBkNCwgMHgwMDQwLCAweDVjMmMsIDB4NjgyMCwgMHg4MDAwLAorCTB4NjgyMiwgMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHg1YzI3LCAweDJjMDAsIDB4NjgxZSwgMHg2ODA0LAorCTB4YTA4NCwgMHgwMDA3LCAweDAwNzksIDB4NjExMSwgMHhjMGQ1LCAweDYwMDIsIDB4NjgxOCwgMHhhMDA1LAorCTB4MDA0MCwgMHg1YzNlLCAweDYwNTYsIDB4NjA1YiwgMHgwMDAwLCAweDAwN2UsIDB4MmMwMCwgMHg2ODFhLAorCTB4MGQ3ZiwgMHg2ODVhLCAweDIwNjksIDB4YTVhYiwgMHgwMDc4LCAweDVjMWUsIDB4NjA1NiwgMHg2MDVhLAorCTB4MmMwMCwgMHg2ODFhLCAweDY4MWUsIDB4MDA3OCwgMHg1YzFlLCAweDAwN2UsIDB4MDE3ZSwgMHgwYzdlLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjAwZiwgMHgwMDAwLCAweDJjMDgsIDB4MjA2MSwgMHhhNWFiLAorCTB4NjAyMCwgMHg4MDAwLCAweDYwMjIsIDB4NjAwOCwgMHhhMDA1LCAweDAwNDAsIDB4NWM2MCwgMHhhMDgwLAorCTB4MDAwMywgMHgyMTAyLCAweDYxMGEsIDB4MTI3ZiwgMHgwYzdmLCAweDAxN2YsIDB4MDA3ZiwgMHgwMDdjLAorCTB4NjEwZSwgMHg2MTBhLCAweDAwNzgsIDB4NWM1YiwgMHgwYzdlLCAweDYwMGYsIDB4MDAwMCwgMHgyYzA4LAorCTB4MjA2MSwgMHhhNWFiLCAweDYwMzQsIDB4YTAwNSwgMHgwMDQwLCAweDVjNzQsIDB4YTA4MCwgMHgwMDAzLAorCTB4MjEwMiwgMHg2MTM2LCAweDBjN2YsIDB4MDA3YywgMHg2MTNhLCAweDYxMzYsIDB4MDA3OCwgMHg1YzcyLAorCTB4MGY3ZSwgMHgwZTdlLCAweDBkN2UsIDB4MGM3ZSwgMHgwNjdlLCAweDAyN2UsIDB4MDE3ZSwgMHgwMDdlLAorCTB4MTI3ZSwgMHgyMDcxLCAweGE1YWIsIDB4NzYzOCwgMHgyNjYwLCAweDI2NzgsIDB4MjA5MSwgMHg4MDAwLAorCTB4OGNmZiwgMHgwMDQwLCAweDVjZWQsIDB4NjAxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMjA2LAorCTB4MDBjMCwgMHg1Y2U4LCAweDg3ZmYsIDB4MDA0MCwgMHg1Yzk5LCAweDYwMjAsIDB4YTEwNiwgMHgwMGMwLAorCTB4NWNlOCwgMHg3MDNjLCAweGFjMDYsIDB4MDBjMCwgMHg1Y2FiLCAweDAzN2UsIDB4MjAxOSwgMHgwMDAxLAorCTB4MTA3OCwgMHg2ZTZjLCAweDcwMzMsIDB4MDAwMCwgMHg3MDNmLCAweDAwMDAsIDB4NzA0MywgMHgwMDAwLAorCTB4NzA0NywgMHgwMDAwLCAweDAzN2YsIDB4NzAzOCwgMHhhYzM2LCAweDAwYzAsIDB4NWNiMSwgMHg2NjBjLAorCTB4NzYzYSwgMHg3MDM0LCAweGFjMzYsIDB4MDBjMCwgMHg1Y2JmLCAweDJjMDAsIDB4YWYzNiwgMHgwMDQwLAorCTB4NWNiZCwgMHgyZjAwLCAweDcwMzYsIDB4MDA3OCwgMHg1Y2JmLCAweDcwMzcsIDB4MDAwMCwgMHg2NjBjLAorCTB4MDY3ZSwgMHgyYzAwLCAweGFmMDYsIDB4MDA0MCwgMHg1Y2M4LCAweDdlMGUsIDB4MDA3OCwgMHg1Y2M5LAorCTB4MjY3OCwgMHg2MDBmLCAweDAwMDAsIDB4MTA3OCwgMHg4YTQ0LCAweDAwNDAsIDB4NWNlMywgMHg2MDEwLAorCTB4MjA2OCwgMHg2MDFjLCAweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweDVjZjcsIDB4NjgzNywgMHgwMTAzLAorCTB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsIDB4MTA3OCwgMHg4Y2I4LCAweDEwNzgsIDB4YTE4MSwgMHgxMDc4LAorCTB4NDk4MiwgMHgxMDc4LCAweDhiZjQsIDB4MTA3OCwgMHg4YzAxLCAweDBjN2YsIDB4MDA3OCwgMHg1Yzg4LAorCTB4MmM3OCwgMHg2MDBjLCAweDIwNjAsIDB4MDA3OCwgMHg1Yzg4LCAweDEyN2YsIDB4MDA3ZiwgMHgwMTdmLAorCTB4MDI3ZiwgMHgwNjdmLCAweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDBmN2YsIDB4MDA3YywgMHg2MDFjLAorCTB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4NWNkNiwgMHgxMDc4LCAweGExODEsIDB4MTA3OCwgMHg5ZTcwLAorCTB4MDA3OCwgMHg1Y2UzLCAweDAwN2UsIDB4MDY3ZSwgMHgwYzdlLCAweDBkN2UsIDB4MGY3ZSwgMHgyMDMxLAorCTB4MDAwMCwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDc5LCAweGE1YWIsIDB4NzgzOCwgMHhhMDY1LAorCTB4MDA0MCwgMHg1ZDQxLCAweDYwMGMsIDB4MDA3ZSwgMHg2MDBmLCAweDAwMDAsIDB4NzgzYywgMHhhYzA2LAorCTB4MDBjMCwgMHg1ZDI4LCAweDAzN2UsIDB4MjAxOSwgMHgwMDAxLCAweDEwNzgsIDB4NmU2YywgMHg3ODMzLAorCTB4MDAwMCwgMHg3ODNmLCAweDAwMDAsIDB4Nzg0MywgMHgwMDAwLCAweDc4NDcsIDB4MDAwMCwgMHgwMzdmLAorCTB4MTA3OCwgMHg4YTQ0LCAweDAwNDAsIDB4NWQzYywgMHg2MDEwLCAweDIwNjgsIDB4NjAxYywgMHhhMDg2LAorCTB4MDAwMywgMHgwMGMwLCAweDVkNGEsIDB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLAorCTB4MTA3OCwgMHg0OTgyLCAweDEwNzgsIDB4OGJmNCwgMHgxMDc4LCAweDhjMDEsIDB4MDA3ZiwgMHgwMDc4LAorCTB4NWQwZiwgMHg3ZTNhLCAweDdlMzYsIDB4MTI3ZiwgMHgwZjdmLCAweDBkN2YsIDB4MGM3ZiwgMHgwNjdmLAorCTB4MDA3ZiwgMHgwMDdjLCAweDYwMWMsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4NWQzMywgMHgxMDc4LAorCTB4OWU3MCwgMHgwMDc4LCAweDVkM2MsIDB4MDE3ZSwgMHgwMjdlLCAweDA4N2UsIDB4MjA0MSwgMHgwMDAwLAorCTB4MTA3OCwgMHg1ZDZkLCAweDEwNzgsIDB4NWUyMSwgMHgwODdmLCAweDAyN2YsIDB4MDE3ZiwgMHgwMDdjLAorCTB4MGY3ZSwgMHgxMjdlLCAweDIwNzksIDB4YTVhYiwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg1ZWJjLAorCTB4MTA3OCwgMHg1ZjMyLCAweDEyN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDBmN2UsIDB4MGU3ZSwgMHgwZDdlLAorCTB4MGM3ZSwgMHgwNjdlLCAweDAxN2UsIDB4MDA3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLAorCTB4YTVhYiwgMHg3NjE0LCAweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLCAweDAwNDAsIDB4NWUwMSwgMHg2MDE4LAorCTB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4YTIwNiwgMHgwMGMwLCAweDVkZmMsIDB4ODhmZiwgMHgwMDQwLAorCTB4NWQ4ZCwgMHg2MDIwLCAweGExMDYsIDB4MDBjMCwgMHg1ZGZjLCAweDcwMjQsIDB4YWMwNiwgMHgwMGMwLAorCTB4NWRiZCwgMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwgMHhhMDA1LCAweDAwNDAsIDB4NWRiOCwgMHgxMDc4LAorCTB4NTk1YSwgMHgxMDc4LCAweDZjNDEsIDB4NjhjMywgMHgwMDAwLCAweDEwNzgsIDB4NzE4OCwgMHg3MDI3LAorCTB4MDAwMCwgMHgwMzdlLCAweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweGEzODQsIDB4MTAwMCwgMHgwMDQwLAorCTB4NWRhZCwgMHg2ODAzLCAweDAxMDAsIDB4NjgwMywgMHgwMDAwLCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LAorCTB4ZDA4NCwgMHgwMDQwLCAweDVkYjUsIDB4NjgyNywgMHgwMDAxLCAweDAzN2YsIDB4MDA3OCwgMHg1ZGJkLAorCTB4NjAwMywgMHgwMDA5LCAweDYzMGEsIDB4MDA3OCwgMHg1ZGZjLCAweDcwMTQsIDB4YWMzNiwgMHgwMGMwLAorCTB4NWRjMywgMHg2NjBjLCAweDc2MTYsIDB4NzAxMCwgMHhhYzM2LCAweDAwYzAsIDB4NWRkMSwgMHgyYzAwLAorCTB4YWYzNiwgMHgwMDQwLCAweDVkY2YsIDB4MmYwMCwgMHg3MDEyLCAweDAwNzgsIDB4NWRkMSwgMHg3MDEzLAorCTB4MDAwMCwgMHg2NjBjLCAweDA2N2UsIDB4MmMwMCwgMHhhZjA2LCAweDAwNDAsIDB4NWRkYSwgMHg3ZTBlLAorCTB4MDA3OCwgMHg1ZGRiLCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LAorCTB4OGE0NCwgMHgwMDQwLCAweDVkZjUsIDB4NjAxYywgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHg1ZTBhLAorCTB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLCAweDEwNzgsIDB4OGNiOCwgMHgxMDc4LAorCTB4YTE4MSwgMHgxMDc4LCAweDQ5ODIsIDB4MTA3OCwgMHg4YmY0LCAweDEwNzgsIDB4OGMwMSwgMHgxMDc4LAorCTB4NzA0NSwgMHgwYzdmLCAweDAwNzgsIDB4NWQ3YywgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwMDc4LAorCTB4NWQ3YywgMHgxMjdmLCAweDAwN2YsIDB4MDE3ZiwgMHgwNjdmLCAweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLAorCTB4MGY3ZiwgMHgwMDdjLCAweDYwMWMsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4NWUxNSwgMHgxMDc4LAorCTB4YTE4MSwgMHgxMDc4LCAweDllNzAsIDB4MDA3OCwgMHg1ZGY1LCAweDYwMWMsIDB4YTA4NiwgMHgwMDAyLAorCTB4MDBjMCwgMHg1ZGY1LCAweDYwMDQsIDB4YTA4NiwgMHgwMDg1LCAweDAwNDAsIDB4NWRlOCwgMHgwMDc4LAorCTB4NWRmNSwgMHgwYzdlLCAweDAwN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4YTI4MCwgMHhhNDM0LAorCTB4MjAwNCwgMHhhMDY1LCAweDAwNDAsIDB4NWViOCwgMHgwZjdlLCAweDBlN2UsIDB4MGQ3ZSwgMHgwNjdlLAorCTB4MjA3MSwgMHhhNWFiLCAweDY2NTQsIDB4NzAxOCwgMHhhYzA2LCAweDAwYzAsIDB4NWUzOCwgMHg3NjFhLAorCTB4NzAxYywgMHhhYzA2LCAweDAwYzAsIDB4NWU0NCwgMHg4NmZmLCAweDAwYzAsIDB4NWU0MywgMHg3MDE4LAorCTB4NzAxZSwgMHgwMDc4LCAweDVlNDQsIDB4NzYxZSwgMHg2MDU4LCAweGEwN2QsIDB4MDA0MCwgMHg1ZTQ5LAorCTB4N2U1NiwgMHhhNmVkLCAweDAwMDAsIDB4MDA0MCwgMHg1ZTRmLCAweDJmMDAsIDB4Njg1YSwgMHg2MDU3LAorCTB4MDAwMCwgMHg2MDViLCAweDAwMDAsIDB4NjAwMCwgMHhjMGQ0LCAweGMwZGMsIDB4NjAwMiwgMHgxMDc4LAorCTB4NDQxMCwgMHgwMDQwLCAweDVlYjQsIDB4NzYyNCwgMHg4NmZmLCAweDAwNDAsIDB4NWVhMiwgMHhhNjgwLAorCTB4MDAwNCwgMHgyMDA0LCAweGFkMDYsIDB4MDBjMCwgMHg1ZWEyLCAweDBkN2UsIDB4MjA2OSwgMHgwMTAwLAorCTB4NjhjMCwgMHhhMDA1LCAweDAwNDAsIDB4NWU5OSwgMHgxMDc4LCAweDU5NWEsIDB4MTA3OCwgMHg2YzQxLAorCTB4NjhjMywgMHgwMDAwLCAweDEwNzgsIDB4NzE4OCwgMHg3MDI3LCAweDAwMDAsIDB4MDM3ZSwgMHgyMDY5LAorCTB4MDE0MCwgMHg2YjA0LCAweGEzODQsIDB4MTAwMCwgMHgwMDQwLCAweDVlODIsIDB4NjgwMywgMHgwMTAwLAorCTB4NjgwMywgMHgwMDAwLCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDA0MCwgMHg1ZThhLAorCTB4NjgyNywgMHgwMDAxLCAweDAzN2YsIDB4MGQ3ZiwgMHgwYzdlLCAweDYwM2MsIDB4YTAwNSwgMHgwMDQwLAorCTB4NWU5MywgMHg4MDAxLCAweDYwM2UsIDB4MjY2MCwgMHgxMDc4LCAweDhjMDEsIDB4MGM3ZiwgMHgwMDc4LAorCTB4NWVhMiwgMHgwZDdmLCAweDBjN2UsIDB4MjY2MCwgMHg2MDAzLCAweDAwMDksIDB4NjMwYSwgMHgwYzdmLAorCTB4MDA3OCwgMHg1ZTU3LCAweDhkZmYsIDB4MDA0MCwgMHg1ZWIwLCAweDY4MzcsIDB4MDEwMywgMHg2YjRhLAorCTB4Njg0NywgMHgwMDAwLCAweDEwNzgsIDB4OGNiOCwgMHgxMDc4LCAweGExODEsIDB4MTA3OCwgMHg0OTgyLAorCTB4MTA3OCwgMHg3MDQ1LCAweDAwNzgsIDB4NWU1NywgMHgwNjdmLCAweDBkN2YsIDB4MGU3ZiwgMHgwZjdmLAorCTB4MTI3ZiwgMHgwMDdmLCAweDBjN2YsIDB4MDA3YywgMHgwMDdlLCAweDA2N2UsIDB4MGM3ZSwgMHgwZDdlLAorCTB4MjAzMSwgMHgwMDAwLCAweDc4MTQsIDB4YTA2NSwgMHgwMDQwLCAweDVmMTYsIDB4NjAwYywgMHgwMDdlLAorCTB4NjAwZiwgMHgwMDAwLCAweDc4MjQsIDB4YWMwNiwgMHgwMGMwLCAweDVlZmIsIDB4MjA2OSwgMHgwMTAwLAorCTB4NjhjMCwgMHhhMDA1LCAweDAwNDAsIDB4NWVmNSwgMHgxMDc4LCAweDU5NWEsIDB4MTA3OCwgMHg2YzQxLAorCTB4NjhjMywgMHgwMDAwLCAweDEwNzgsIDB4NzE4OCwgMHg3ODI3LCAweDAwMDAsIDB4MDM3ZSwgMHgyMDY5LAorCTB4MDE0MCwgMHg2YjA0LCAweGEzODQsIDB4MTAwMCwgMHgwMDQwLCAweDVlZWEsIDB4NjgwMywgMHgwMTAwLAorCTB4NjgwMywgMHgwMDAwLCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDA0MCwgMHg1ZWYyLAorCTB4NjgyNywgMHgwMDAxLCAweDAzN2YsIDB4MDA3OCwgMHg1ZWZiLCAweDYwMDMsIDB4MDAwOSwgMHg2MzBhLAorCTB4MmMzMCwgMHgwMDc4LCAweDVmMTMsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsIDB4OGE0NCwgMHgwMDQwLAorCTB4NWYwZiwgMHg2MDFjLCAweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweDVmMWQsIDB4NjgzNywgMHgwMTAzLAorCTB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsIDB4MTA3OCwgMHg0OTgyLCAweDEwNzgsIDB4OGJmNCwgMHgxMDc4LAorCTB4OGMwMSwgMHgxMDc4LCAweDcwNDUsIDB4MDA3ZiwgMHgwMDc4LCAweDVlYzMsIDB4N2UxNiwgMHg3ZTEyLAorCTB4MGQ3ZiwgMHgwYzdmLCAweDA2N2YsIDB4MDA3ZiwgMHgwMDdjLCAweDYwMWMsIDB4YTA4NiwgMHgwMDA2LAorCTB4MDBjMCwgMHg1ZjI2LCAweDEwNzgsIDB4OWU3MCwgMHgwMDc4LCAweDVmMGYsIDB4NjAxYywgMHhhMDg2LAorCTB4MDAwMiwgMHgwMGMwLCAweDVmMGYsIDB4NjAwNCwgMHhhMDg2LCAweDAwODUsIDB4MDA0MCwgMHg1ZjA2LAorCTB4MDA3OCwgMHg1ZjBmLCAweDAwN2UsIDB4MDY3ZSwgMHgwYzdlLCAweDBkN2UsIDB4NzgxOCwgMHhhMDY1LAorCTB4MDA0MCwgMHg1ZmEwLCAweDYwNTQsIDB4MDA3ZSwgMHg2MDU3LCAweDAwMDAsIDB4NjA1YiwgMHgwMDAwLAorCTB4NjAwMCwgMHhjMGQ0LCAweGMwZGMsIDB4NjAwMiwgMHgxMDc4LCAweDQ0MTAsIDB4MDA0MCwgMHg1ZjlkLAorCTB4N2UyNCwgMHg4NmZmLCAweDAwNDAsIDB4NWY4ZiwgMHhhNjgwLCAweDAwMDQsIDB4MjAwNCwgMHhhZDA2LAorCTB4MDBjMCwgMHg1ZjhmLCAweDBkN2UsIDB4MjA2OSwgMHgwMTAwLCAweDY4YzAsIDB4YTAwNSwgMHgwMDQwLAorCTB4NWY4NiwgMHgxMDc4LCAweDU5NWEsIDB4MTA3OCwgMHg2YzQxLCAweDY4YzMsIDB4MDAwMCwgMHgxMDc4LAorCTB4NzE4OCwgMHg3ODI3LCAweDAwMDAsIDB4MDM3ZSwgMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHhhMzg0LAorCTB4MTAwMCwgMHgwMDQwLCAweDVmNmYsIDB4NjgwMywgMHgwMTAwLCAweDY4MDMsIDB4MDAwMCwgMHgyMDY5LAorCTB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDA0MCwgMHg1Zjc3LCAweDY4MjcsIDB4MDAwMSwgMHgwMzdmLAorCTB4MGQ3ZiwgMHgwYzdlLCAweDYwM2MsIDB4YTAwNSwgMHgwMDQwLCAweDVmODAsIDB4ODAwMSwgMHg2MDNlLAorCTB4MjY2MCwgMHgxMDc4LCAweDhjMDEsIDB4MGM3ZiwgMHgwMDc4LCAweDVmOGYsIDB4MGQ3ZiwgMHgwYzdlLAorCTB4MjY2MCwgMHg2MDAzLCAweDAwMDksIDB4NjMwYSwgMHgwYzdmLCAweDAwNzgsIDB4NWY0NCwgMHg4ZGZmLAorCTB4MDA0MCwgMHg1Zjk5LCAweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgxMDc4LAorCTB4NDk4MiwgMHgxMDc4LCAweDcwNDUsIDB4MDA3OCwgMHg1ZjQ0LCAweDAwN2YsIDB4MDA3OCwgMHg1ZjM3LAorCTB4NzgxZSwgMHg3ODFhLCAweDBkN2YsIDB4MGM3ZiwgMHgwNjdmLCAweDAwN2YsIDB4MDA3YywgMHgwZTdlLAorCTB4MGQ3ZSwgMHgwNjdlLCAweDYwMDAsIDB4ZDBkYywgMHgwMDQwLCAweDVmYzQsIDB4NjA0YywgMHhhMDZkLAorCTB4MDA0MCwgMHg1ZmM0LCAweDY4NDgsIDB4YTYwNiwgMHgwMGMwLCAweDVmYzQsIDB4MjA3MSwgMHhhNWFiLAorCTB4NzAyNCwgMHhhMDM1LCAweDAwNDAsIDB4NWZjNCwgMHhhMDgwLCAweDAwMDQsIDB4MjAwNCwgMHhhZDA2LAorCTB4MDBjMCwgMHg1ZmM0LCAweDEwNzgsIDB4NWZjOCwgMHgwNjdmLCAweDBkN2YsIDB4MGU3ZiwgMHgwMDdjLAorCTB4MGY3ZSwgMHgyMDc5LCAweDAxMDAsIDB4NzhjMCwgMHhhMDA1LCAweDAwYzAsIDB4NWZkNywgMHgwYzdlLAorCTB4MjY2MCwgMHg2MDAzLCAweDAwMDksIDB4NjMwYSwgMHgwYzdmLCAweDAwNzgsIDB4NjAwZSwgMHgxMDc4LAorCTB4NmM0MSwgMHg3OGMzLCAweDAwMDAsIDB4MTA3OCwgMHg3MTg4LCAweDcwMjcsIDB4MDAwMCwgMHgwMzdlLAorCTB4MjA3OSwgMHgwMTQwLCAweDdiMDQsIDB4YTM4NCwgMHgxMDAwLCAweDAwNDAsIDB4NWZlYiwgMHg3ODAzLAorCTB4MDEwMCwgMHg3ODAzLCAweDAwMDAsIDB4MjA3OSwgMHgwMTAwLCAweDc4MjQsIDB4ZDA4NCwgMHgwMDQwLAorCTB4NWZmMywgMHg3ODI3LCAweDAwMDEsIDB4MTA3OCwgMHg3MTg4LCAweDAzN2YsIDB4MTA3OCwgMHg0NDEwLAorCTB4MGM3ZSwgMHg2MDNjLCAweGEwMDUsIDB4MDA0MCwgMHg1ZmZmLCAweDgwMDEsIDB4NjAzZSwgMHgyNjYwLAorCTB4MTA3OCwgMHg3NTNkLCAweDBjN2YsIDB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLAorCTB4MTA3OCwgMHg4Y2I4LCAweDEwNzgsIDB4NDk4MiwgMHgxMDc4LCAweDcwNDUsIDB4MGY3ZiwgMHgwMDdjLAorCTB4MGU3ZSwgMHgwYzdlLCAweDIwNzEsIDB4YTVhYiwgMHg3MDA0LCAweGEwODQsIDB4MDAwNywgMHgwMDc5LAorCTB4NjAxOSwgMHg2MDIzLCAweDYwMjYsIDB4NjAzZiwgMHg2MDViLCAweDYwYTAsIDB4NjAyMywgMHg2MDIzLAorCTB4NjAyMSwgMHgxMDc4LCAweDEzMjgsIDB4MGM3ZiwgMHgwZTdmLCAweDAwN2MsIDB4NzAyNCwgMHhhMDY1LAorCTB4MDA0MCwgMHg2MDM0LCAweDcwMjAsIDB4ODAwMSwgMHg3MDIyLCAweDYwMGMsIDB4YTAxNSwgMHgwMDQwLAorCTB4NjAzYiwgMHg3MjE2LCAweDYwMGYsIDB4MDAwMCwgMHg3MDA3LCAweDAwMDAsIDB4NzAyNywgMHgwMDAwLAorCTB4MGM3ZiwgMHgwZTdmLCAweDAwN2MsIDB4NzIxNiwgMHg3MjEyLCAweDAwNzgsIDB4NjAzNCwgMHg2MDE4LAorCTB4MjA2MCwgMHgxMDc4LCAweDQ0MTAsIDB4NjAwMCwgMHhjMGRjLCAweDYwMDIsIDB4NzAyMCwgMHg4MDAxLAorCTB4NzAyMiwgMHgwMDQwLCAweDYwNTAsIDB4NjA1NCwgMHhhMDE1LCAweDAwNDAsIDB4NjA1NywgMHg3MjFlLAorCTB4NzAwNywgMHgwMDAwLCAweDcwMjcsIDB4MDAwMCwgMHgwYzdmLCAweDBlN2YsIDB4MDA3YywgMHg3MjE4LAorCTB4NzIxZSwgMHgwMDc4LCAweDYwNTAsIDB4NzAyNCwgMHhhMDY1LCAweDAwNDAsIDB4NjA5ZCwgMHg3MDBjLAorCTB4YWMwNiwgMHgwMGMwLCAweDYwNzIsIDB4MTA3OCwgMHg3MDQ1LCAweDYwMGMsIDB4YTAxNSwgMHgwMDQwLAorCTB4NjA2ZSwgMHg3MjBlLCAweDYwMGYsIDB4MDAwMCwgMHgwMDc4LCAweDYwOWIsIDB4NzIwZSwgMHg3MjBhLAorCTB4MDA3OCwgMHg2MDliLCAweDcwMTQsIDB4YWMwNiwgMHgwMGMwLCAweDYwODUsIDB4MTA3OCwgMHg3MDQ1LAorCTB4NjAwYywgMHhhMDE1LCAweDAwNDAsIDB4NjA4MSwgMHg3MjE2LCAweDYwMGYsIDB4MDAwMCwgMHgwMDc4LAorCTB4NjA5YiwgMHg3MjE2LCAweDcyMTIsIDB4MDA3OCwgMHg2MDliLCAweDYwMTgsIDB4MjA2MCwgMHgxMDc4LAorCTB4NDQxMCwgMHg2MDAwLCAweGMwZGMsIDB4NjAwMiwgMHgxMDc4LCAweDcwNDUsIDB4NzAxYywgMHhhMDY1LAorCTB4MDA0MCwgMHg2MDliLCAweDYwNTQsIDB4YTAxNSwgMHgwMDQwLCAweDYwOTksIDB4NzIxZSwgMHgwMDc4LAorCTB4NjA5YiwgMHg3MjE4LCAweDcyMWUsIDB4NzAyNywgMHgwMDAwLCAweDBjN2YsIDB4MGU3ZiwgMHgwMDdjLAorCTB4NzAyNCwgMHhhMDY1LCAweDAwNDAsIDB4NjBhZCwgMHgxMDc4LCAweDcwNDUsIDB4NjAwYywgMHhhMDE1LAorCTB4MDA0MCwgMHg2MGI0LCAweDcyMGUsIDB4NjAwZiwgMHgwMDAwLCAweDEwNzgsIDB4NzE4OCwgMHg3MDI3LAorCTB4MDAwMCwgMHgwYzdmLCAweDBlN2YsIDB4MDA3YywgMHg3MjBlLCAweDcyMGEsIDB4MDA3OCwgMHg2MGFkLAorCTB4MGQ3ZSwgMHgyMDY5LCAweGE1YWIsIDB4NjgzMCwgMHhhMDg0LCAweDAwMDMsIDB4MDA3OSwgMHg2MGMwLAorCTB4NjBjNiwgMHg2MGM4LCAweDYwZWUsIDB4NjBjNiwgMHgxMDc4LCAweDEzMjgsIDB4MGQ3ZiwgMHgwMDdjLAorCTB4MGM3ZSwgMHg2ODQwLCAweGEwODYsIDB4MDAwMSwgMHgwMDQwLCAweDYwZTQsIDB4NjgzYywgMHhhMDY1LAorCTB4MDA0MCwgMHg2MGQ5LCAweDYwMGMsIDB4YTAxNSwgMHgwMDQwLCAweDYwZTAsIDB4NmEzYSwgMHg2MDBmLAorCTB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4NjgzZiwgMHgwMDAwLCAweDBjN2YsIDB4MGQ3ZiwgMHgwMDdjLAorCTB4NjgzYSwgMHg2ODM2LCAweDAwNzgsIDB4NjBkOSwgMHg2ODQzLCAweDAwMDAsIDB4NjgzOCwgMHhhMDY1LAorCTB4MDA0MCwgMHg2MGQ5LCAweDYwMDMsIDB4MDAwMywgMHgwMDc4LCAweDYwZDksIDB4MGM3ZSwgMHg2ODQzLAorCTB4MDAwMCwgMHg2ODQ3LCAweDAwMDAsIDB4NjgzYywgMHhhMDY1LCAweDAwNDAsIDB4NjEwNiwgMHg2MDBjLAorCTB4YTAxNSwgMHgwMDQwLCAweDYxMDIsIDB4NmEzYSwgMHg2MDBmLCAweDAwMDAsIDB4NjgzZiwgMHgwMDAwLAorCTB4MDA3OCwgMHg2MTA2LCAweDY4M2YsIDB4MDAwMCwgMHg2ODNhLCAweDY4MzYsIDB4MGM3ZiwgMHgwZDdmLAorCTB4MDA3YywgMHgwZDdlLCAweDIwNjksIDB4YTVhYiwgMHg2ODA0LCAweGEwODQsIDB4MDAwNywgMHgwMDc5LAorCTB4NjExMSwgMHg2MTFiLCAweDYxYzIsIDB4NjFjMiwgMHg2MWMyLCAweDYxYzIsIDB4NjFjNCwgMHg2MWMyLAorCTB4NjExOSwgMHgxMDc4LCAweDEzMjgsIDB4NjgyMCwgMHhhMDA1LCAweDAwYzAsIDB4NjEyMSwgMHgwZDdmLAorCTB4MDA3YywgMHgwYzdlLCAweDY4MGMsIDB4YTA2NSwgMHgwMDQwLCAweDYxMzAsIDB4NjgwNywgMHgwMDA0LAorCTB4NjgyNiwgMHg2ODJiLCAweDAwMDAsIDB4MTA3OCwgMHg2MjBhLCAweDBjN2YsIDB4MGQ3ZiwgMHgwMDdjLAorCTB4NjgxNCwgMHhhMDY1LCAweDAwNDAsIDB4NjEzZSwgMHg2ODA3LCAweDAwMDEsIDB4NjgyNiwgMHg2ODJiLAorCTB4MDAwMCwgMHgxMDc4LCAweDYyMGEsIDB4MGM3ZiwgMHgwZDdmLCAweDAwN2MsIDB4MGU3ZSwgMHgwMzdlLAorCTB4NmExYywgMHhhMmY1LCAweDAwMDAsIDB4MDA0MCwgMHg2MWJkLCAweDcwNGMsIDB4YTAwZCwgMHgwMDQwLAorCTB4NjE0ZCwgMHg3MDg4LCAweGEwMDUsIDB4MDA0MCwgMHg2MTY1LCAweDcwNTQsIDB4YTA3NSwgMHgwMDQwLAorCTB4NjE1NiwgMHhhMjBlLCAweDAwNDAsIDB4NjFiZCwgMHgwMDc4LCAweDYxNWIsIDB4NjgxOCwgMHhhMjBlLAorCTB4MDA0MCwgMHg2MWJkLCAweDIwNzAsIDB4NzA0YywgMHhhMDBkLCAweDAwNDAsIDB4NjE0ZCwgMHg3MDg4LAorCTB4YTAwNSwgMHgwMGMwLCAweDYxNGQsIDB4MmUwMCwgMHg2ODFlLCAweDczM2MsIDB4NzAzOCwgMHhhMzAyLAorCTB4MDBjOCwgMHg2MTRkLCAweDEwNzgsIDB4NzUwYywgMHgwMDQwLCAweDYxYmQsIDB4ODMxOCwgMHg3MzNlLAorCTB4NjExMiwgMHgyZTEwLCAweDYyMWEsIDB4YTE4MCwgMHgwMDE0LCAweDIwMDQsIDB4YTA4NCwgMHgwMGZmLAorCTB4NjAzMiwgMHhhMTgwLCAweDAwMTQsIDB4MjAwMywgMHgwMDAwLCAweGExODAsIDB4MDAxNSwgMHgyMDA0LAorCTB4YTA4YSwgMHgxOTlhLCAweDAwNDgsIDB4NjE4NiwgMHgyMDAxLCAweDE5OTksIDB4ODAwMywgMHg4MDFiLAorCTB4ODMxYiwgMHhhMzE4LCAweDYzMTYsIDB4MDM3ZiwgMHgwZjdlLCAweDJjNzgsIDB4NzFhMCwgMHhkMWJjLAorCTB4MDA0MCwgMHg2MTlmLCAweDcxMDAsIDB4ZDFmNCwgMHgwMDQwLCAweDYxOWIsIDB4NzExNCwgMHhhMThjLAorCTB4MDBmZiwgMHgwMDc4LCAweDYxYTQsIDB4MjAwOSwgMHgwMDAwLCAweDAwNzgsIDB4NjFhNCwgMHhhMWUwLAorCTB4MjkzZiwgMHgyYzBjLCAweGExOGMsIDB4MDBmZiwgMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwgMHgxMDc4LAorCTB4Njc5YiwgMHg3MzAwLCAweGMzZGQsIDB4NzMwMiwgMHg2ODA3LCAweDAwMDIsIDB4MmYxOCwgMHg2YjI2LAorCTB4NjgyYiwgMHgwMDAwLCAweDc4MWYsIDB4MDAwMywgMHg3ODAzLCAweDAwMDEsIDB4NzgwNywgMHgwMDQwLAorCTB4MGY3ZiwgMHgwZTdmLCAweDBjN2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDAzN2YsIDB4MGU3ZiwgMHgwYzdmLAorCTB4MDA3OCwgMHg2MWJiLCAweDBkN2YsIDB4MDA3YywgMHgwYzdlLCAweDY4MGMsIDB4YTA2NSwgMHgwMDQwLAorCTB4NjFkMCwgMHg2ODA3LCAweDAwMDQsIDB4NjgyNiwgMHg2ODJiLCAweDAwMDAsIDB4MTA3OCwgMHg2MjBhLAorCTB4MGM3ZiwgMHgwZDdmLCAweDAwN2MsIDB4MGY3ZSwgMHgwZDdlLCAweDIwNjksIDB4YTVhYiwgMHg2ODMwLAorCTB4YTA4NiwgMHgwMDAwLCAweDAwYzAsIDB4NjFmMSwgMHg2ODM4LCAweGEwN2QsIDB4MDA0MCwgMHg2MWYxLAorCTB4NjgzMywgMHgwMDAxLCAweDY4M2UsIDB4Njg0NywgMHgwMDAwLCAweDEyN2UsIDB4MGY3ZSwgMHgyMDkxLAorCTB4MjIwMCwgMHgwMjdmLCAweDEwNzgsIDB4MWQyOCwgMHgwMGMwLCAweDYxZjQsIDB4MTI3ZiwgMHgxMDc4LAorCTB4NmFlNSwgMHgwZDdmLCAweDBmN2YsIDB4MDA3YywgMHgxMjdmLCAweDY4NDMsIDB4MDAwMCwgMHg3ODAzLAorCTB4MDAwMiwgMHg3ODBjLCAweGEwMTUsIDB4MDA0MCwgMHg2MjA2LCAweDZhM2EsIDB4NzgwZiwgMHgwMDAwLAorCTB4NjgzMywgMHgwMDAwLCAweDY4M2YsIDB4MDAwMCwgMHgwMDc4LCAweDYxZjEsIDB4NjgzYSwgMHg2ODM2LAorCTB4MDA3OCwgMHg2MjAwLCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLCAweDEwNzksIDB4NjIxMCwgMHgwMDdjLAorCTB4NjIxOSwgMHg2MjFlLCAweDY2M2YsIDB4Njc1OCwgMHg2MjFlLCAweDY2M2YsIDB4Njc1OCwgMHg2MjE5LAorCTB4NjIxZSwgMHgxMDc4LCAweDYwMTAsIDB4MTA3OCwgMHg2MTA5LCAweDAwN2MsIDB4MTU3ZSwgMHgxMzdlLAorCTB4MTQ3ZSwgMHgwYzdlLCAweDBmN2UsIDB4NjAwNCwgMHhhMDhhLCAweDAwNDQsIDB4MTBjOCwgMHgxMzI4LAorCTB4NjExOCwgMHgyMTc4LCAweDc5YTAsIDB4ZDFiYywgMHgwMDQwLCAweDYyM2IsIDB4NzkwMCwgMHhkMWY0LAorCTB4MDA0MCwgMHg2MjM3LCAweDc5MTQsIDB4YTE4YywgMHgwMGZmLCAweDAwNzgsIDB4NjI0MCwgMHgyMDA5LAorCTB4MDAwMCwgMHgwMDc4LCAweDYyNDAsIDB4YTFmOCwgMHgyOTNmLCAweDJmMGMsIDB4YTE4YywgMHgwMGZmLAorCTB4MmM3OCwgMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwgMHhhMDhhLCAweDAwNDAsIDB4MDBjOCwgMHg2MjkyLAorCTB4MTA3OSwgMHg2MjUwLCAweDBmN2YsIDB4MGM3ZiwgMHgxNDdmLCAweDEzN2YsIDB4MTU3ZiwgMHgwMDdjLAorCTB4NjJmOCwgMHg2MzQwLCAweDYzNjgsIDB4NjQwMywgMHg2NDMzLCAweDY0M2IsIDB4NjQ2MiwgMHg2NDczLAorCTB4NjQ4NCwgMHg2NDhjLCAweDY0YTQsIDB4NjQ4YywgMHg2NTBmLCAweDY0NzMsIDB4NjUzMCwgMHg2NTM4LAorCTB4NjQ4NCwgMHg2NTM4LCAweDY1NDksIDB4NjI5MCwgMHg2MjkwLCAweDYyOTAsIDB4NjI5MCwgMHg2MjkwLAorCTB4NjI5MCwgMHg2MjkwLCAweDYyOTAsIDB4NjI5MCwgMHg2MjkwLCAweDYyOTAsIDB4NmQwNSwgMHg2ZDJhLAorCTB4NmQzZiwgMHg2ZDYyLCAweDZkODMsIDB4NjQ2MiwgMHg2MjkwLCAweDY0NjIsIDB4NjQ4YywgMHg2MjkwLAorCTB4NjM2OCwgMHg2NDAzLCAweDYyOTAsIDB4NzJhYywgMHg2NDhjLCAweDYyOTAsIDB4NzJjYywgMHg2NDhjLAorCTB4NjI5MCwgMHg2MjkwLCAweDYyZjMsIDB4NjJhMSwgMHg2MjkwLCAweDcyZjEsIDB4NzM2OCwgMHg3NDUwLAorCTB4NjI5MCwgMHg3NDYxLCAweDY0NWMsIDB4NzQ3ZCwgMHg2MjkwLCAweDZkOTgsIDB4NjI5MCwgMHg2MjkwLAorCTB4MTA3OCwgMHgxMzI4LCAweDIxMDAsIDB4MTA3OSwgMHg2MjliLCAweDBmN2YsIDB4MGM3ZiwgMHgxNDdmLAorCTB4MTM3ZiwgMHgxNTdmLCAweDAwN2MsIDB4NjI5ZiwgMHg2MjlmLCAweDYyOWYsIDB4NjJkNSwgMHgxMDc4LAorCTB4MTMyOCwgMHgwZDdlLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY1NjcsIDB4NzgxMCwgMHgyMDY4LAorCTB4MjBhMywgMHgyNDE0LCAweDIwYTMsIDB4MDAxOCwgMHgyMGEzLCAweDA4MDAsIDB4NjgzYywgMHgyMGEyLAorCTB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4Njg1MCwgMHgyMGEyLCAweDY4NTQsIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4NjBjMywgMHgwMDE4LCAweDEwNzgsIDB4NmMyZCwgMHgwZDdmLCAweDAwN2MsIDB4MGQ3ZSwgMHg3ODE4LAorCTB4MjA2OCwgMHg2OGEwLCAweGEwODIsIDB4MDA3ZSwgMHgwMDQ4LCAweDYyZDIsIDB4YTA4NSwgMHgwMDAxLAorCTB4MGQ3ZiwgMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHg2MmQwLCAweDBkN2UsIDB4MjBhMSwgMHgwMjBiLAorCTB4MTA3OCwgMHg2NTY3LCAweDIwYTMsIDB4MDUwMCwgMHgyMGEzLCAweDAwMDAsIDB4NzgxMCwgMHhhMGU4LAorCTB4MDAwZiwgMHg2ODA4LCAweDIwYTIsIDB4NjgwYywgMHgyMGEyLCAweDY4MTAsIDB4MjBhMiwgMHg2ODE0LAorCTB4MjBhMiwgMHg2ODE4LCAweDIwYTIsIDB4NjgxYywgMHgyMGEyLCAweDYwYzMsIDB4MDAxMCwgMHgxMDc4LAorCTB4NmMyZCwgMHgwZDdmLCAweDAwN2MsIDB4NjAzMCwgMHg2MDlhLCAweDEwNzgsIDB4NmMyZCwgMHgwMDdjLAorCTB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjU2NywgMHgyMGEzLCAweDUyMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4MGQ3ZSwgMHgyMDY5LCAweGEzNTEsIDB4NjgwNCwgMHhkMDg0LCAweDAwNDAsIDB4NjMxMiwgMHg2ODI4LAorCTB4MjBhMywgMHgwMDAwLCAweDAxN2UsIDB4MTA3OCwgMHgyNGZhLCAweDIxYTIsIDB4MDE3ZiwgMHgwZDdmLAorCTB4MDA3OCwgMHg2MzE3LCAweDBkN2YsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGE5LAorCTB4MDAwNCwgMHgyMDk5LCAweGEzMDUsIDB4NTNhNiwgMHgyMGE5LCAweDAwMDQsIDB4MjA5OSwgMHhhMzAxLAorCTB4NTNhNiwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEwODIsIDB4MDA3ZiwgMHgwMDQ4LAorCTB4NjMzMSwgMHgyMDAxLCAweGEzMWEsIDB4MjBhNiwgMHgyMDAxLCAweGEzMWIsIDB4MjBhNiwgMHgwMDc4LAorCTB4NjMzNywgMHgyMGEzLCAweDAwMDAsIDB4NjAzMCwgMHhhMDg0LCAweDAwZmYsIDB4MjBhMiwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDFjLCAweDEwNzgsIDB4NmMyZCwgMHgwMDdjLAorCTB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjU2NywgMHgyMGEzLCAweDA1MDAsIDB4MjBhMywgMHgwMDAwLAorCTB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMDgyLCAweDAwN2YsIDB4MDA0OCwgMHg2MzU4LAorCTB4MjAwMSwgMHhhMzFhLCAweDIwYTYsIDB4MjAwMSwgMHhhMzFiLCAweDIwYTYsIDB4MDA3OCwgMHg2MzVlLAorCTB4MjBhMywgMHgwMDAwLCAweDYwMzAsIDB4YTA4NCwgMHgwMGZmLCAweDIwYTIsIDB4MjBhOSwgMHgwMDA0LAorCTB4MjA5OSwgMHhhMzA1LCAweDUzYTYsIDB4NjBjMywgMHgwMDEwLCAweDEwNzgsIDB4NmMyZCwgMHgwMDdjLAorCTB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjU2NywgMHgwYzdlLCAweDc4MTgsIDB4MjA2MCwgMHgyMDAxLAorCTB4MDAwMCwgMHgxMDc4LCAweDQ4YTIsIDB4MGM3ZiwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LAorCTB4YTA4NiwgMHgwMDdlLCAweDAwYzAsIDB4NjM4MywgMHgyMGEzLCAweDA0MDAsIDB4NjIwYywgMHhjMmI0LAorCTB4NjIwZSwgMHgwMDc4LCAweDYzODUsIDB4MjBhMywgMHgwMzAwLCAweDIwYTMsIDB4MDAwMCwgMHg3ODE4LAorCTB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4YTA4NiwgMHgwMDdlLCAweDAwYzAsIDB4NjNkMiwgMHgyMDk5LAorCTB4YTU4YywgMHgzM2E2LCAweDkzOTgsIDB4MzNhNiwgMHg5Mzk4LCAweDMzMDQsIDB4YTA4NCwgMHgzZmZmLAorCTB4MjBhMiwgMHg5Mzk4LCAweDMzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksIDB4YTMwNSwgMHg1M2E2LAorCTB4MjBhOSwgMHgwMDA0LCAweDIwOTksIDB4YTMwMSwgMHg1M2E2LCAweDIwYTksIDB4MDAxMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgwMGYwLCAweDYzYWYsIDB4MjA5OSwgMHhhNTk0LCAweDMzMDQsIDB4YzBkZCwgMHgyMGEyLAorCTB4MjAwMSwgMHhhMzcxLCAweDIwMDQsIDB4ZDBlNCwgMHgwMDQwLCAweDYzY2EsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAwLCAweDkzOTgsIDB4OTM5OCwgMHg5Mzk4LCAweDMzYTYsIDB4MjBhOSwgMHgwMDA0LAorCTB4MDA3OCwgMHg2M2NjLCAweDIwYTksIDB4MDAwNywgMHgyMGEzLCAweDAwMDAsIDB4MDBmMCwgMHg2M2NjLAorCTB4MDA3OCwgMHg2M2YyLCAweDIwOTksIDB4YTU4YywgMHgyMGE5LCAweDAwMDgsIDB4NTNhNiwgMHgyMGE5LAorCTB4MDAwNCwgMHgyMDk5LCAweGEzMDUsIDB4NTNhNiwgMHgyMGE5LCAweDAwMDQsIDB4MjA5OSwgMHhhMzAxLAorCTB4NTNhNiwgMHgyMGE5LCAweDAwMDgsIDB4MjBhMywgMHgwMDAwLCAweDAwZjAsIDB4NjNlMywgMHgyMGE5LAorCTB4MDAwOCwgMHgyMGEzLCAweDAwMDAsIDB4MDBmMCwgMHg2M2U5LCAweDIwOTksIDB4YTU5NCwgMHgyMGE5LAorCTB4MDAwOCwgMHg1M2E2LCAweDIwYTksIDB4MDAwOCwgMHgyMGEzLCAweDAwMDAsIDB4MDBmMCwgMHg2M2Y0LAorCTB4MjBhOSwgMHgwMDBhLCAweDIwYTMsIDB4MDAwMCwgMHgwMGYwLCAweDYzZmEsIDB4NjBjMywgMHgwMDc0LAorCTB4MTA3OCwgMHg2YzJkLCAweDAwN2MsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjU2NywgMHgyMGEzLAorCTB4MjAxMCwgMHgyMGEzLCAweDAwMTQsIDB4MjBhMywgMHgwODAwLCAweDIwYTMsIDB4MjAwMCwgMHhhMDA2LAorCTB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDBmN2UsIDB4MjA3OSwgMHhhMzUxLAorCTB4NzkwNCwgMHgwZjdmLCAweGQxYWMsIDB4MDBjMCwgMHg2NDFmLCAweGEwODUsIDB4MDAyMCwgMHhkMWE0LAorCTB4MDA0MCwgMHg2NDI0LCAweGEwODUsIDB4MDAxMCwgMHhhMDg1LCAweDAwMDIsIDB4MGQ3ZSwgMHgwMDc4LAorCTB4NjRlZCwgMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LAorCTB4MTA3OCwgMHg2YzJkLCAweDAwN2MsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjU2NywgMHgyMGEzLAorCTB4NTAwMCwgMHgwMDc4LCAweDYzODUsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjU2NywgMHgyMGEzLAorCTB4MjExMCwgMHgyMGEzLCAweDAwMTQsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLAorCTB4MDAxNCwgMHgxMDc4LCAweDZjMmQsIDB4MDA3YywgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NWVmLAorCTB4MDA3OCwgMHg2NDY2LCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY1ZjgsIDB4MjBhMywgMHgwMjAwLAorCTB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDA0LAorCTB4MTA3OCwgMHg2YzJkLCAweDAwN2MsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjVmOCwgMHgyMGEzLAorCTB4MDEwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAzLCAweDIwYTMsIDB4MmEwMCwgMHg2MGMzLAorCTB4MDAwOCwgMHgxMDc4LCAweDZjMmQsIDB4MDA3YywgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NWY4LAorCTB4MjBhMywgMHgwMjAwLCAweDAwNzgsIDB4NjM4NSwgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NWY4LAorCTB4MjBhMywgMHgwMTAwLCAweDIwYTMsIDB4MDAwMCwgMHg3ODI4LCAweGEwMDUsIDB4MDA0MCwgMHg2NDliLAorCTB4MjBhMiwgMHgwMDc4LCAweDY0OWQsIDB4MjBhMywgMHgwMDAzLCAweDc4MTAsIDB4MjBhMiwgMHg2MGMzLAorCTB4MDAwOCwgMHgxMDc4LCAweDZjMmQsIDB4MDA3YywgMHgwZDdlLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LAorCTB4NjVmOCwgMHgyMGEzLCAweDAyMTAsIDB4MjBhMywgMHgwMDE0LCAweDIwYTMsIDB4MDgwMCwgMHg3ODE4LAorCTB4MjA2OCwgMHg2ODk0LCAweGEwODYsIDB4MDAxNCwgMHgwMGMwLCAweDY0Y2EsIDB4Njk5OCwgMHhhMTg0LAorCTB4YzAwMCwgMHgwMGMwLCAweDY0YzYsIDB4ZDFlYywgMHgwMDQwLCAweDY0YzIsIDB4MjBhMywgMHgyMTAwLAorCTB4MDA3OCwgMHg2NGNjLCAweDIwYTMsIDB4MDEwMCwgMHgwMDc4LCAweDY0Y2MsIDB4MjBhMywgMHgwNDAwLAorCTB4MDA3OCwgMHg2NGNjLCAweDIwYTMsIDB4MDcwMCwgMHhhMDA2LCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLAorCTB4MjBhMiwgMHgyMGEyLCAweDBmN2UsIDB4MjA3OSwgMHhhMzUxLCAweDc5MDQsIDB4MGY3ZiwgMHhkMWFjLAorCTB4MDBjMCwgMHg2NGRjLCAweGEwODUsIDB4MDAyMCwgMHhkMWE0LCAweDAwNDAsIDB4NjRlMSwgMHhhMDg1LAorCTB4MDAxMCwgMHgyMDA5LCAweGEzNzMsIDB4MjEwYywgMHhkMTg0LCAweDAwNDAsIDB4NjRlYiwgMHg2OTljLAorCTB4ZDE4YywgMHgwMDQwLCAweDY0ZWQsIDB4YTA4NSwgMHgwMDAyLCAweDAyN2UsIDB4MjAwOSwgMHhhMzcxLAorCTB4MjEwYywgMHhkMWU0LCAweDAwNDAsIDB4NjRmYiwgMHhjMGM1LCAweGEwOTQsIDB4MDAzMCwgMHhhMjk2LAorCTB4MDAxMCwgMHgwMDQwLCAweDY1MDUsIDB4ZDFlYywgMHgwMDQwLCAweDY1MDUsIDB4YTA5NCwgMHgwMDMwLAorCTB4YTI5NiwgMHgwMDEwLCAweDAwNDAsIDB4NjUwNSwgMHhjMGJkLCAweDAyN2YsIDB4MjBhMiwgMHgyMGEyLAorCTB4MjBhMiwgMHg2MGMzLCAweDAwMTQsIDB4MTA3OCwgMHg2YzJkLCAweDBkN2YsIDB4MDA3YywgMHgyMGExLAorCTB4MDIwYiwgMHgxMDc4LCAweDY1ZjgsIDB4MjBhMywgMHgwMjEwLCAweDIwYTMsIDB4MDAxNCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LCAweDEwNzgsIDB4NmMyZCwgMHgwMDdjLAorCTB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjVmOCwgMHgyMGEzLCAweDAyMDAsIDB4MDA3OCwgMHg2MmZlLAorCTB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjVmOCwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAzLCAweDIwYTMsIDB4MmEwMCwgMHg2MGMzLCAweDAwMDgsIDB4MTA3OCwgMHg2YzJkLAorCTB4MDA3YywgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LAorCTB4NjVmOCwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwYiwgMHgyMGEzLAorCTB4MDAwMCwgMHg2MGMzLCAweDAwMDgsIDB4MTA3OCwgMHg2YzJkLCAweDAwN2MsIDB4MDI3ZSwgMHgwMzdlLAorCTB4MDQ3ZSwgMHgyMDE5LCAweDMyMDAsIDB4MjAyMSwgMHgwODAwLCAweDAwNzgsIDB4NjU2ZSwgMHgwMjdlLAorCTB4MDM3ZSwgMHgwNDdlLCAweDIwMTksIDB4MjIwMCwgMHgyMDIxLCAweDAxMDAsIDB4MjBlMSwgMHg5MDgwLAorCTB4MjBlMSwgMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMTQsIDB4YTI4NiwgMHgwMDdlLAorCTB4MDBjMCwgMHg2NTgxLCAweGEzODUsIDB4MDBmZiwgMHgyMGEyLCAweDIwYTMsIDB4ZmZmZSwgMHgwMDc4LAorCTB4NjViNiwgMHhhMjg2LCAweDAwN2YsIDB4MDBjMCwgMHg2NThkLCAweDBkN2UsIDB4YTM4NSwgMHgwMGZmLAorCTB4MjBhMiwgMHgyMGEzLCAweGZmZmQsIDB4MDA3OCwgMHg2NWE0LCAweGQyYmMsIDB4MDA0MCwgMHg2NWFjLAorCTB4YTI4NiwgMHgwMDgwLCAweDBkN2UsIDB4MDBjMCwgMHg2NTljLCAweGEzODUsIDB4MDBmZiwgMHgyMGEyLAorCTB4MjBhMywgMHhmZmZjLCAweDAwNzgsIDB4NjVhNCwgMHhhMmU4LCAweGE0MzQsIDB4MmQ2YywgMHg2ODEwLAorCTB4YTMwNSwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGEzMWEsIDB4MmRhNiwgMHg4ZDY4LAorCTB4MmRhNiwgMHgwZDdmLCAweDAwNzgsIDB4NjViYSwgMHgwZDdlLCAweGEyZTgsIDB4YTQzNCwgMHgyZDZjLAorCTB4NjgxMCwgMHhhMzA1LCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDBkN2YsIDB4MjBhMywgMHgwMDAwLAorCTB4NjIzMCwgMHgyMmEyLCAweGE0ODUsIDB4MDAyOSwgMHgyMGEyLCAweDA0N2YsIDB4MDM3ZiwgMHgyMGEzLAorCTB4MDAwMCwgMHgxMDc4LCAweDZjMWMsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsIDB4MmZhMiwgMHgyMGEzLAorCTB4ZmZmZiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDAyN2YsIDB4MDA3YywgMHgwMjdlLAorCTB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMGEzLCAweDAyZmYsIDB4MjAxMSwgMHhmZmZjLAorCTB4MjJhMiwgMHgwZDdlLCAweDIwNjksIDB4YTMxYSwgMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwZDdmLAorCTB4MjBhMywgMHgyMDI5LCAweDIwYTMsIDB4MDAwMCwgMHgwMDc4LCAweDY1YzEsIDB4MjBhMywgMHgwMTAwLAorCTB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4ZmMwMiwgMHgyMGEzLCAweDAwMDAsIDB4MDA3YywgMHgwMjdlLAorCTB4MDM3ZSwgMHgwNDdlLCAweDIwMTksIDB4MzMwMCwgMHgyMDIxLCAweDA4MDAsIDB4MDA3OCwgMHg2NWZmLAorCTB4MDI3ZSwgMHgwMzdlLCAweDA0N2UsIDB4MjAxOSwgMHgyMzAwLCAweDIwMjEsIDB4MDEwMCwgMHgyMGUxLAorCTB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMDkyLAorCTB4MDA3ZSwgMHgwMDQ4LCAweDY2MWMsIDB4MGQ3ZSwgMHhhMGU4LCAweGE0MzQsIDB4MmQ2YywgMHg2ODEwLAorCTB4YTMwNSwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGEzMWEsIDB4MmRhNiwgMHg4ZDY4LAorCTB4MmRhNiwgMHgwZDdmLCAweDAwNzgsIDB4NjYyYSwgMHgwZDdlLCAweGEwZTgsIDB4YTQzNCwgMHgyZDZjLAorCTB4NjgxMCwgMHhhMzA1LCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDBkN2YsIDB4MjBhMywgMHgwMDAwLAorCTB4NjIzMCwgMHgyMmEyLCAweGE0ODUsIDB4MDA5OCwgMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwgMHgwNDdmLAorCTB4MDM3ZiwgMHgxMDc4LCAweDZjMWMsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsIDB4N2EwOCwgMHgyMmEyLAorCTB4MmZhMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDAyN2YsIDB4MDA3YywgMHgwYzdlLAorCTB4MGY3ZSwgMHg2MDA0LCAweGEwOGEsIDB4MDA4NSwgMHgxMDQ4LCAweDEzMjgsIDB4YTA4YSwgMHgwMDhjLAorCTB4MTBjOCwgMHgxMzI4LCAweDYxMTgsIDB4MjE3OCwgMHg3OWEwLCAweGQxYmMsIDB4MDA0MCwgMHg2NjVkLAorCTB4NzkwMCwgMHhkMWY0LCAweDAwNDAsIDB4NjY1OSwgMHg3OTE0LCAweGExOGMsIDB4MDBmZiwgMHgwMDc4LAorCTB4NjY2MiwgMHgyMDA5LCAweDAwMDAsIDB4MDA3OCwgMHg2NjYyLCAweGExZjgsIDB4MjkzZiwgMHgyZjBjLAorCTB4YTE4YywgMHgwMGZmLCAweDJjNzgsIDB4MjA2MSwgMHgwMTAwLCAweDYxOWEsIDB4YTA4MiwgMHgwMDg1LAorCTB4MTA3OSwgMHg2NjZkLCAweDBmN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDY2NzYsIDB4NjY4MSwgMHg2NjljLAorCTB4NjY3NCwgMHg2Njc0LCAweDY2NzQsIDB4NjY3NiwgMHgxMDc4LCAweDEzMjgsIDB4MTQ3ZSwgMHgyMGExLAorCTB4MDIwYiwgMHgxMDc4LCAweDY2YWYsIDB4NjBjMywgMHgwMDAwLCAweDEwNzgsIDB4NmMyZCwgMHgxNDdmLAorCTB4MDA3YywgMHgxNDdlLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY2ZTMsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAwLCAweDc4MDgsIDB4MjBhMiwgMHg3ODEwLCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHhmZmZmLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDBjLAorCTB4MTA3OCwgMHg2YzJkLCAweDE0N2YsIDB4MDA3YywgMHgxNDdlLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LAorCTB4NjcyNCwgMHgyMGEzLCAweDAwMDMsIDB4MjBhMywgMHgwMzAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHg2MGMzLCAweDAwMDQsIDB4MTA3OCwgMHg2YzJkLCAweDE0N2YsIDB4MDA3YywgMHgwMjdlLAorCTB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LAorCTB4YTA5MiwgMHgwMDdlLCAweDAwNDgsIDB4NjZjZSwgMHgwZDdlLCAweGEwZTgsIDB4YTQzNCwgMHgyZDZjLAorCTB4NjgxMCwgMHhhMDg1LCAweDgxMDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MjA2OSwgMHhhMzFhLAorCTB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MGQ3ZiwgMHgwMDc4LCAweDY2ZGQsIDB4MGQ3ZSwgMHhhMGU4LAorCTB4YTQzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHg4MTAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLAorCTB4MGQ3ZiwgMHgyMGEzLCAweDAwMDAsIDB4NjIzMCwgMHgyMmEyLCAweDIwYTMsIDB4MDAwOSwgMHgyMGEzLAorCTB4MDAwMCwgMHgwMDc4LCAweDY1YzEsIDB4MDI3ZSwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLAorCTB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMDkyLCAweDAwN2UsIDB4MDA0OCwgMHg2NzAyLAorCTB4MGQ3ZSwgMHhhMGU4LCAweGE0MzQsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4ODQwMCwgMHgyMGEyLAorCTB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YTMxYSwgMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwZDdmLAorCTB4MDA3OCwgMHg2NzExLCAweDBkN2UsIDB4YTBlOCwgMHhhNDM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LAorCTB4ODQwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgwZDdmLCAweDIwYTMsIDB4MDAwMCwgMHg2MjMwLAorCTB4MjJhMiwgMHgyMGEzLCAweDAwOTksIDB4MjBhMywgMHgwMDAwLCAweDEwNzgsIDB4NmMxYywgMHgyMmEyLAorCTB4MjBhMywgMHgwMDAwLCAweDdhMDgsIDB4MjJhMiwgMHg3YTEwLCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAwLCAweDAyN2YsIDB4MDA3YywgMHgwMjdlLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLAorCTB4NDAwMCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEwOTIsIDB4MDA3ZSwgMHgwMDQ4LAorCTB4Njc0MywgMHgwZDdlLCAweGEwZTgsIDB4YTQzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHg4NTAwLAorCTB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MjA2OSwgMHhhMzFhLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LAorCTB4MGQ3ZiwgMHgwMDc4LCAweDY3NTIsIDB4MGQ3ZSwgMHhhMGU4LCAweGE0MzQsIDB4MmQ2YywgMHg2ODEwLAorCTB4YTA4NSwgMHg4NTAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDBkN2YsIDB4MjBhMywgMHgwMDAwLAorCTB4NjIzMCwgMHgyMmEyLCAweDIwYTMsIDB4MDA5OSwgMHgyMGEzLCAweDAwMDAsIDB4MDA3OCwgMHg2NzE1LAorCTB4MGM3ZSwgMHgwZjdlLCAweDJjNzgsIDB4NzgwNCwgMHhhMDhhLCAweDAwNDAsIDB4MTA0OCwgMHgxMzI4LAorCTB4YTA4YSwgMHgwMDUzLCAweDEwYzgsIDB4MTMyOCwgMHg3OTE4LCAweDIxNjAsIDB4NjFhMCwgMHhkMWJjLAorCTB4MDA0MCwgMHg2Nzc3LCAweDYxMDAsIDB4ZDFmNCwgMHgwMDQwLCAweDY3NzMsIDB4NjExNCwgMHhhMThjLAorCTB4MDBmZiwgMHgwMDc4LCAweDY3N2MsIDB4MjAwOSwgMHgwMDAwLCAweDAwNzgsIDB4Njc3YywgMHhhMWUwLAorCTB4MjkzZiwgMHgyYzBjLCAweGExOGMsIDB4MDBmZiwgMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwgMHhhMDgyLAorCTB4MDA0MCwgMHgxMDc5LCAweDY3ODYsIDB4MGY3ZiwgMHgwYzdmLCAweDAwN2MsIDB4Njc5YiwgMHg2OGE5LAorCTB4Njg0YSwgMHg2YTU5LCAweDY3OTksIDB4Njc5OSwgMHg2Nzk5LCAweDY3OTksIDB4Njc5OSwgMHg2Nzk5LAorCTB4Njc5OSwgMHg2ZjVlLCAweDZmNmYsIDB4NmY4MCwgMHg2ZjkxLCAweDY3OTksIDB4NzQ4ZSwgMHg2Nzk5LAorCTB4NmY0ZCwgMHgxMDc4LCAweDEzMjgsIDB4MGQ3ZSwgMHgxNTdlLCAweDE0N2UsIDB4NzgwYiwgMHhmZmZmLAorCTB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjgwNiwgMHg3OTEwLCAweDIxNjgsIDB4Njk0OCwgMHg3OTIyLAorCTB4MjFhMiwgMHhhMDE2LCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDY5NGMsIDB4YTE4NCwgMHgwMDBmLAorCTB4MDBjMCwgMHg2N2I2LCAweDIwMDEsIDB4MDAwNSwgMHgwMDc4LCAweDY3YzAsIDB4ZDE4NCwgMHgwMDQwLAorCTB4NjdiZCwgMHgyMDAxLCAweDAwMDQsIDB4MDA3OCwgMHg2N2MwLCAweGEwODQsIDB4MDAwNiwgMHg4MDA0LAorCTB4MDE3ZSwgMHgyMDA4LCAweDc4MzAsIDB4YTA4NCwgMHgwMGZmLCAweDgwMDcsIDB4YTEwNSwgMHgwMTdmLAorCTB4MjBhMiwgMHhkMWFjLCAweDAwNDAsIDB4NjdkMCwgMHgyMGEzLCAweDAwMDIsIDB4MDA3OCwgMHg2N2RjLAorCTB4ZDFiNCwgMHgwMDQwLCAweDY3ZDcsIDB4MjBhMywgMHgwMDAxLCAweDAwNzgsIDB4NjdkYywgMHgyMGEzLAorCTB4MDAwMCwgMHgyMjMwLCAweDAwNzgsIDB4NjdkZSwgMHg2YTgwLCAweDZlN2MsIDB4MjBhOSwgMHgwMDA4LAorCTB4YWQ4MCwgMHgwMDE3LCAweDIwMGMsIDB4ODEwZiwgMHgyMWEyLCAweDgwMDAsIDB4MDBmMCwgMHg2N2UyLAorCTB4MjJhMiwgMHgyNmEyLCAweDYwYzMsIDB4MDAyMCwgMHgyMGUxLCAweDkwODAsIDB4NjAxNCwgMHhhMDg0LAorCTB4MDAwNCwgMHhhMDg1LCAweDAwMDksIDB4NjAxNiwgMHgyMDAxLCAweGE1YzcsIDB4MjAwMywgMHgwN2QwLAorCTB4MjAwMSwgMHhhNWM2LCAweDIwMDMsIDB4MDAwOSwgMHgyMDAxLCAweGE1Y2MsIDB4MjAwMywgMHgwMDAyLAorCTB4MTA3OCwgMHgxNTdlLCAweDE0N2YsIDB4MTU3ZiwgMHgwZDdmLCAweDAwN2MsIDB4MjBlMSwgMHg5MDgwLAorCTB4MjBlMSwgMHg0MDAwLCAweDdhMTgsIDB4YTI4MCwgMHgwMDIzLCAweDIwMTQsIDB4ODIxMCwgMHhhMjk0LAorCTB4MDBmZiwgMHgyMjAyLCAweDgyMTcsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhkMGJjLAorCTB4MDA0MCwgMHg2ODJjLCAweDBkN2UsIDB4YTBlOCwgMHhhNDM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LAorCTB4MDYwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGEzMWEsIDB4MmRhNiwgMHg4ZDY4LAorCTB4MmRhNiwgMHgwZDdmLCAweDAwNzgsIDB4NjgzYiwgMHgwZDdlLCAweGEwZTgsIDB4YTQzNCwgMHgyZDZjLAorCTB4NjgxMCwgMHhhMDg1LCAweDA2MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MGQ3ZiwgMHgyMGEzLAorCTB4MDAwMCwgMHg2MTMwLCAweDIxYTIsIDB4MjBhMywgMHgwODI5LCAweDIwYTMsIDB4MDAwMCwgMHgyMmEyLAorCTB4MjBhMywgMHgwMDAwLCAweDJmYTIsIDB4MjBhMywgMHhmZmZmLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgwMDdjLCAweDBkN2UsIDB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4MjBhMSwgMHgwMjBiLAorCTB4MTA3OCwgMHg2ODZhLCAweDc4MTAsIDB4MjA2OCwgMHg2ODYwLCAweDIwYTIsIDB4Njg1YywgMHgyMGEyLAorCTB4Njg4MCwgMHgyMGEyLCAweDY4N2MsIDB4MjBhMiwgMHhhMDA2LCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLAorCTB4MjBhMiwgMHg2MGMzLCAweDAwMGMsIDB4MTA3OCwgMHg2YzJkLCAweDE0N2YsIDB4MTM3ZiwgMHgxNTdmLAorCTB4MGQ3ZiwgMHgwMDdjLCAweDAyN2UsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LAorCTB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4ZDBiYywgMHgwMDQwLCAweDY4ODgsIDB4MGQ3ZSwgMHhhMGU4LAorCTB4YTQzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwNTAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLAorCTB4MjA2OSwgMHhhMzFhLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDBkN2YsIDB4MDA3OCwgMHg2ODk3LAorCTB4MGQ3ZSwgMHhhMGU4LCAweGE0MzQsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDUwMCwgMHgyMGEyLAorCTB4NjgxNCwgMHgyMGEyLCAweDBkN2YsIDB4MjBhMywgMHgwMDAwLCAweDYyMzAsIDB4MjJhMiwgMHgyMGEzLAorCTB4MDg4OSwgMHgyMGEzLCAweDAwMDAsIDB4MTA3OCwgMHg2YzFjLCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4N2EwOCwgMHgyMmEyLCAweDJmYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgwMjdmLAorCTB4MDA3YywgMHgwZDdlLCAweDE1N2UsIDB4MTM3ZSwgMHgxNDdlLCAweDc4MTAsIDB4YTA2ZCwgMHgxMDc4LAorCTB4NDg4ZiwgMHgwMDQwLCAweDY4YmQsIDB4Njg0YywgMHhhMDg0LCAweDIwMjAsIDB4YTA4NiwgMHgyMDIwLAorCTB4MDBjMCwgMHg2OGJkLCAweDc4MjQsIDB4YzBjZCwgMHg3ODI2LCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LAorCTB4NmExMiwgMHhhMDE2LCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHg3ODEwLAorCTB4YTA4NCwgMHhmMDAwLCAweDAwYzAsIDB4NjhkNCwgMHg3ODEwLCAweGEwODQsIDB4MDcwMCwgMHg4MDA3LAorCTB4MTA3OSwgMHg2OGRjLCAweDAwNzgsIDB4NjhkNywgMHhhMDA2LCAweDEwNzksIDB4NjhkYywgMHgxNDdmLAorCTB4MTM3ZiwgMHgxNTdmLCAweDBkN2YsIDB4MDA3YywgMHg2OGU2LCAweDY5N2UsIDB4Njk4OSwgMHg2OWIzLAorCTB4NjljNywgMHg2OWUzLCAweDY5ZWUsIDB4NjhlNCwgMHgxMDc4LCAweDEzMjgsIDB4MDE3ZSwgMHgwMzdlLAorCTB4Njk0YywgMHhhMThjLCAweDAwMDMsIDB4MDA0MCwgMHg2OGYxLCAweGExODYsIDB4MDAwMywgMHgwMGMwLAorCTB4NjkwMCwgMHg2Yjc4LCAweDc4MjQsIDB4ZDBjYywgMHgwMDQwLCAweDY4ZjcsIDB4YzNlNSwgMHgyM2EyLAorCTB4Njg2OCwgMHgyMGEyLCAweDY4NjQsIDB4MjBhMiwgMHgwMzdmLCAweDAxN2YsIDB4MDA3OCwgMHg2OWJlLAorCTB4YTE4NiwgMHgwMDAxLCAweDEwYzAsIDB4MTMyOCwgMHg2Yjc4LCAweDc4MjQsIDB4ZDBjYywgMHgwMDQwLAorCTB4NjkwYSwgMHhjM2U1LCAweDIzYTIsIDB4Njg2OCwgMHgyMGEyLCAweDY4NjQsIDB4MjBhMiwgMHgyMmEyLAorCTB4Njg3NCwgMHgyMGEyLCAweDIyYTIsIDB4Njg3YywgMHgyMGEyLCAweDIwMDksIDB4MDAxOCwgMHhhMzg0LAorCTB4MDMwMCwgMHgwMDQwLCAweDY5NzgsIDB4ZDNjNCwgMHgwMDQwLCAweDY5MjAsIDB4Njg3YywgMHhhMTA4LAorCTB4ZDNjYywgMHgwMDQwLCAweDY5MjUsIDB4Njg3NCwgMHhhMTA4LCAweDE1N2UsIDB4MjBhOSwgMHgwMDBkLAorCTB4YWQ4MCwgMHgwMDIwLCAweDIwMWMsIDB4ODMxZiwgMHgyM2EyLCAweDgwMDAsIDB4MDBmMCwgMHg2OTJhLAorCTB4MTU3ZiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHhhMTg0LCAweDAwMDMsIDB4MDA0MCwgMHg2OTc4LAorCTB4MjBhMSwgMHgwMjBiLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4MDA3ZSwgMHg3ODE4LAorCTB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4ZDBiYywgMHgwMDQwLCAweDY5NTgsIDB4MGQ3ZSwgMHhhMGU4LAorCTB4YTQzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwNzAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLAorCTB4MjA2OSwgMHhhMzFhLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDBkN2YsIDB4MDA3OCwgMHg2OTY3LAorCTB4MGQ3ZSwgMHhhMGU4LCAweGE0MzQsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDcwMCwgMHgyMGEyLAorCTB4NjgxNCwgMHgyMGEyLCAweDBkN2YsIDB4MjBhMywgMHgwMDAwLCAweDYyMzAsIDB4MjJhMiwgMHgwMDdmLAorCTB4N2IyNCwgMHhkM2NjLCAweDAwNDAsIDB4Njk3MCwgMHgyMGEzLCAweDA4ODksIDB4MDA3OCwgMHg2OTcyLAorCTB4MjBhMywgMHgwODk4LCAweDIwYTIsIDB4MTA3OCwgMHg2YzFjLCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4NjFjMiwgMHgwMzdmLCAweDAxN2YsIDB4MTA3OCwgMHg2YzJkLCAweDAwN2MsIDB4MjAxMSwgMHgwMDA4LAorCTB4NzgyNCwgMHhkMGNjLCAweDAwNDAsIDB4Njk4NSwgMHhjMmU1LCAweDIyYTIsIDB4YTAxNiwgMHgwMDc4LAorCTB4NjliYywgMHgyMDExLCAweDAzMDIsIDB4NzgyNCwgMHhkMGNjLCAweDAwNDAsIDB4Njk5MCwgMHhjMmU1LAorCTB4MjJhMiwgMHhhMDE2LCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIwYTMsIDB4MDAxMiwgMHgyMmEyLAorCTB4MjBhMywgMHgwMDA4LCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjBhMywgMHg3MDAwLAorCTB4MjBhMywgMHgwNTAwLCAweDIyYTIsIDB4MjBhMywgMHgwMDBhLCAweDIyYTIsIDB4MjJhMiwgMHgyMGEzLAorCTB4MjUwMCwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4NjBjMywgMHgwMDMyLAorCTB4MTA3OCwgMHg2YzJkLCAweDAwN2MsIDB4MjAxMSwgMHgwMDI4LCAweDc4MjQsIDB4ZDBjYywgMHgwMDQwLAorCTB4NjliYSwgMHhjMmU1LCAweDIyYTIsIDB4YTAxNiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLAorCTB4MjJhMiwgMHgyMmEyLCAweDYwYzMsIDB4MDAxOCwgMHgxMDc4LCAweDZjMmQsIDB4MDA3YywgMHgyMDExLAorCTB4MDEwMCwgMHg3ODI0LCAweGQwY2MsIDB4MDA0MCwgMHg2OWNlLCAweGMyZTUsIDB4MjJhMiwgMHhhMDE2LAorCTB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIwYTMsIDB4MDAwOCwgMHgyMmEyLAorCTB4NzgzNCwgMHhhMDg0LCAweDAwZmYsIDB4MjBhMiwgMHgyMmEyLCAweDIyYTIsIDB4NjBjMywgMHgwMDIwLAorCTB4MTA3OCwgMHg2YzJkLCAweDAwN2MsIDB4MjAxMSwgMHgwMDA4LCAweDc4MjQsIDB4ZDBjYywgMHgwMDQwLAorCTB4NjllYSwgMHhjMmU1LCAweDIyYTIsIDB4YTAxNiwgMHgwMDc4LCAweDY5YmMsIDB4MDM3ZSwgMHg3YjEwLAorCTB4YTM4NCwgMHhmZjAwLCAweDc4MTIsIDB4YTM4NCwgMHgwMGZmLCAweDgwMDEsIDB4MDBjMCwgMHg2YTAxLAorCTB4NzgyNCwgMHhkMGNjLCAweDAwNDAsIDB4NjlmZCwgMHhjMmU1LCAweDIyYTIsIDB4MDM3ZiwgMHgwMDc4LAorCTB4NjliYywgMHgwNDdlLCAweDIwMjEsIDB4MDgwMCwgMHgwMDdlLCAweDc4MjQsIDB4ZDBjYywgMHgwMDdmLAorCTB4MDA0MCwgMHg2YTBiLCAweGM0ZTUsIDB4MjRhMiwgMHgwNDdmLCAweDIyYTIsIDB4MjBhMiwgMHgwMzdmLAorCTB4MDA3OCwgMHg2OWJlLCAweDAyN2UsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LAorCTB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4ZDBiYywgMHgwMDQwLCAweDZhMzAsIDB4MGQ3ZSwgMHhhMGU4LAorCTB4YTQzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwNzAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLAorCTB4MjA2OSwgMHhhMzFhLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDBkN2YsIDB4MDA3OCwgMHg2YTNmLAorCTB4MGQ3ZSwgMHhhMGU4LCAweGE0MzQsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDcwMCwgMHgyMGEyLAorCTB4NjgxNCwgMHgyMGEyLCAweDBkN2YsIDB4MjBhMywgMHgwMDAwLCAweDYyMzAsIDB4MjJhMiwgMHg3ODI0LAorCTB4ZDBjYywgMHgwMDQwLCAweDZhNDcsIDB4MjBhMywgMHgwODg5LCAweDAwNzgsIDB4NmE0OSwgMHgyMGEzLAorCTB4MDg5OCwgMHgyMGEzLCAweDAwMDAsIDB4MTA3OCwgMHg2YzFjLCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4N2EwOCwgMHgyMmEyLCAweDJmYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgwMjdmLAorCTB4MDA3YywgMHgwZDdlLCAweDE1N2UsIDB4MTM3ZSwgMHgxNDdlLCAweDAxN2UsIDB4MDM3ZSwgMHg3ODEwLAorCTB4YTA4NCwgMHgwNzAwLCAweDgwMDcsIDB4MTA3OSwgMHg2YTZjLCAweDAzN2YsIDB4MDE3ZiwgMHgxNDdmLAorCTB4MTM3ZiwgMHgxNTdmLCAweDBkN2YsIDB4MDA3YywgMHg2YTc0LCAweDZhNzQsIDB4NmE3NiwgMHg2YTc0LAorCTB4NmE3NCwgMHg2YTc0LCAweDZhOWIsIDB4NmE3NCwgMHgxMDc4LCAweDEzMjgsIDB4NzkxMCwgMHhhMThjLAorCTB4ZjhmZiwgMHhhMThkLCAweDA2MDAsIDB4NzkxMiwgMHgyMGExLCAweDAyMGIsIDB4MjAwOSwgMHgwMDAzLAorCTB4MTA3OCwgMHg2YWE1LCAweDBkN2UsIDB4MjA2OSwgMHhhMzUxLCAweDY4MDQsIDB4ZDBiYywgMHgwMDQwLAorCTB4NmE5MCwgMHg2ODJjLCAweGEwODQsIDB4MDBmZiwgMHg4MDA3LCAweDIwYTIsIDB4MDA3OCwgMHg2YTkyLAorCTB4MjBhMywgMHgzZjAwLCAweDBkN2YsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4NjBjMywgMHgwMDAxLAorCTB4MTA3OCwgMHg2YzJkLCAweDAwN2MsIDB4MjBhMSwgMHgwMjBiLCAweDIwMDksIDB4MDAwMywgMHgxMDc4LAorCTB4NmFhNSwgMHgyMGEzLCAweDdmMDAsIDB4MDA3OCwgMHg2YTkzLCAweDAyN2UsIDB4MjBlMSwgMHg5MDgwLAorCTB4MjBlMSwgMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4ZDBiYywgMHgwMDQwLAorCTB4NmFjMywgMHgwZDdlLCAweGEwZTgsIDB4YTQzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwMTAwLAorCTB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MjA2OSwgMHhhMzFhLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LAorCTB4MGQ3ZiwgMHgwMDc4LCAweDZhZDIsIDB4MGQ3ZSwgMHhhMGU4LCAweGE0MzQsIDB4MmQ2YywgMHg2ODEwLAorCTB4YTA4NSwgMHgwMTAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDBkN2YsIDB4MjBhMywgMHgwMDAwLAorCTB4NjIzMCwgMHgyMmEyLCAweDIwYTMsIDB4MDg4OCwgMHhhMThkLCAweDAwMDgsIDB4MjFhMiwgMHgxMDc4LAorCTB4NmMxYywgMHgyMmEyLCAweDIwYTMsIDB4MDAwMCwgMHg3YTA4LCAweDIyYTIsIDB4MmZhMiwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MDI3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MGQ3ZSwgMHgwYzdlLAorCTB4MDU3ZSwgMHgwNDdlLCAweDAzN2UsIDB4MjA2MSwgMHgwMTAwLCAweDIwNzEsIDB4YTMwMCwgMHg2MTMwLAorCTB4NzgxOCwgMHgyMDY4LCAweDY4YTAsIDB4MjAyOCwgMHhkMGJjLCAweDAwYzAsIDB4NmFmYywgMHg2OTEwLAorCTB4NmExNCwgMHg2NDMwLCAweDAwNzgsIDB4NmIwMCwgMHg2OTEwLCAweDZhMTQsIDB4NzM2OCwgMHg3NDZjLAorCTB4NzgxYywgMHhhMDg2LCAweDAwMDYsIDB4MDA0MCwgMHg2YjVmLCAweGQ1YmMsIDB4MDA0MCwgMHg2YjEwLAorCTB4YTE4NSwgMHgwMTAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MzZhLCAweDY0NmUsIDB4MDA3OCwgMHg2YjE3LAorCTB4YTE4NSwgMHgwMTAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MDZiLCAweDAwMDAsIDB4NjQ2ZSwgMHg2MDczLAorCTB4MDgwOSwgMHg2MDc3LCAweDAwMDgsIDB4Njg4YywgMHg4MDAwLCAweGEwODQsIDB4MDBmZiwgMHg2ODhlLAorCTB4ODAwNywgMHg2MDdhLCAweDYwN2YsIDB4MDAwMCwgMHgyZjAwLCAweDYwODIsIDB4NzgwOCwgMHg2MDg2LAorCTB4NzgxMCwgMHgyMDcwLCAweDcwMTQsIDB4NjA4YSwgMHg3MDEwLCAweDYwOGUsIDB4NzAwYywgMHg2MGM2LAorCTB4NzAwOCwgMHg2MGNhLCAweDY4NmMsIDB4NjBjZSwgMHg2MGFiLCAweDAwMzYsIDB4NjBhZiwgMHg5NWQ1LAorCTB4NjBkNywgMHgwMDAwLCAweGE1ODIsIDB4MDA4MCwgMHgwMDQ4LCAweDZiNDksIDB4NmEwMCwgMHhkMmY0LAorCTB4MDA0MCwgMHg2YjQ3LCAweDZhMTQsIDB4YTI5NCwgMHgwMGZmLCAweDAwNzgsIDB4NmI0OSwgMHgyMDExLAorCTB4MDAwMCwgMHg2MjllLCAweDYwMTcsIDB4MDAxNiwgMHgyMDA5LCAweDA3ZDAsIDB4NjBjNCwgMHhhMDg0LAorCTB4ZmZmMCwgMHhhMDA1LCAweDAwNDAsIDB4NmI1NiwgMHgyMDA5LCAweDFiNTgsIDB4MTA3OCwgMHg1OTVmLAorCTB4MDM3ZiwgMHgwNDdmLCAweDA1N2YsIDB4MGM3ZiwgMHgwZDdmLCAweDBlN2YsIDB4MDA3YywgMHg3ODEwLAorCTB4MjA3MCwgMHg3MDRjLCAweGEwODQsIDB4MDAwMywgMHhhMDg2LCAweDAwMDIsIDB4MDA0MCwgMHg2YmI3LAorCTB4ZDViYywgMHgwMDQwLCAweDZiNzMsIDB4YTE4NSwgMHgwMTAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MzZhLAorCTB4NjQ2ZSwgMHgwMDc4LCAweDZiN2EsIDB4YTE4NSwgMHgwMTAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MDZiLAorCTB4MDAwMCwgMHg2NDZlLCAweDYwNzMsIDB4MDg4MCwgMHg2MDc3LCAweDAwMDgsIDB4Njg4YywgMHg4MDAwLAorCTB4YTA4NCwgMHgwMGZmLCAweDY4OGUsIDB4ODAwNywgMHg2MDdhLCAweDYwN2YsIDB4MDAwMCwgMHgyZjAwLAorCTB4NjA4NiwgMHg3ODA4LCAweDYwODIsIDB4NzA2MCwgMHg2MDhhLCAweDcwNWMsIDB4NjA4ZSwgMHg3MDgwLAorCTB4NjBjNiwgMHg3MDdjLCAweDYwY2EsIDB4NzA3YywgMHg3OTJjLCAweGExMDgsIDB4NzkyZSwgMHg3MDgwLAorCTB4NzkyOCwgMHhhMTA5LCAweDc5MmEsIDB4Njg2YywgMHg2MGNlLCAweDYwYWIsIDB4MDAzNiwgMHg2MGFmLAorCTB4OTVkNSwgMHg2MGQ3LCAweDAwMDAsIDB4YTU4MiwgMHgwMDgwLCAweDAwNDgsIDB4NmJiMiwgMHg2YTAwLAorCTB4ZDJmNCwgMHgwMDQwLCAweDZiYjAsIDB4NmExNCwgMHhhMjk0LCAweDAwZmYsIDB4MDA3OCwgMHg2YmIyLAorCTB4MjAxMSwgMHgwMDAwLCAweDYyOWUsIDB4NjAxNywgMHgwMDEyLCAweDAwNzgsIDB4NmI0YywgMHhkNWJjLAorCTB4MDA0MCwgMHg2YmMyLCAweGExODUsIDB4MDcwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjM2YSwgMHg2NDZlLAorCTB4MDA3OCwgMHg2YmM5LCAweGExODUsIDB4MDcwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjA2YiwgMHgwMDAwLAorCTB4NjQ2ZSwgMHgxMDc4LCAweDQ4OGYsIDB4MDA0MCwgMHg2YmRmLCAweDBkN2UsIDB4NzgxMCwgMHhhMDZkLAorCTB4Njg0YywgMHgwZDdmLCAweGEwODQsIDB4MjAyMCwgMHhhMDg2LCAweDIwMjAsIDB4MDBjMCwgMHg2YmRmLAorCTB4NzgyNCwgMHhjMGNkLCAweDc4MjYsIDB4NjA3MywgMHgwODg5LCAweDAwNzgsIDB4NmJlMSwgMHg2MDczLAorCTB4MDg5OCwgMHg2MDc3LCAweDAwMDAsIDB4Njg4YywgMHg4MDAwLCAweGEwODQsIDB4MDBmZiwgMHg2ODhlLAorCTB4ODAwNywgMHg2MDdhLCAweDYwN2YsIDB4MDAwMCwgMHgyZjAwLCAweDYwODYsIDB4NzgwOCwgMHg2MDgyLAorCTB4NzAxNCwgMHg2MDhhLCAweDcwMTAsIDB4NjA4ZSwgMHg3MDBjLCAweDYwYzYsIDB4NzAwOCwgMHg2MGNhLAorCTB4Njg2YywgMHg2MGNlLCAweDYwYWIsIDB4MDAzNiwgMHg2MGFmLCAweDk1ZDUsIDB4NjBkNywgMHgwMDAwLAorCTB4YTU4MiwgMHgwMDgwLCAweDAwNDgsIDB4NmMwZiwgMHg2YTAwLCAweGQyZjQsIDB4MDA0MCwgMHg2YzBkLAorCTB4NmExNCwgMHhhMjk0LCAweDAwZmYsIDB4MDA3OCwgMHg2YzBmLCAweDIwMTEsIDB4MDAwMCwgMHg2MjllLAorCTB4NzgyNCwgMHhkMGNjLCAweDAwNDAsIDB4NmMxOCwgMHg2MDE3LCAweDAwMTYsIDB4MDA3OCwgMHg2YjRjLAorCTB4NjAxNywgMHgwMDEyLCAweDAwNzgsIDB4NmI0YywgMHg3YTE4LCAweGEyODAsIDB4MDAyMywgMHgyMDE0LAorCTB4ODIxMCwgMHhhMjk0LCAweDAwZmYsIDB4MjIwMiwgMHg4MjE3LCAweDAwN2MsIDB4MGQ3ZSwgMHgyMDY5LAorCTB4YTVhYiwgMHg2ODQzLCAweDAwMDEsIDB4MGQ3ZiwgMHgwMDdjLCAweDIwZTEsIDB4OTA4MCwgMHg2MGEzLAorCTB4MDA1NiwgMHg2MGE3LCAweDk1NzUsIDB4MTA3OCwgMHg2YzM4LCAweDEwNzgsIDB4NTk0ZiwgMHgwMDdjLAorCTB4MDA3ZSwgMHg2MDE0LCAweGEwODQsIDB4MDAwNCwgMHhhMDg1LCAweDAwMDksIDB4NjAxNiwgMHgwMDdmLAorCTB4MDA3YywgMHgwMDdlLCAweDBjN2UsIDB4MjA2MSwgMHgwMTAwLCAweDYwMTQsIDB4YTA4NCwgMHgwMDA0LAorCTB4YTA4NSwgMHgwMDA4LCAweDYwMTYsIDB4MGM3ZiwgMHgwMDdmLCAweDAwN2MsIDB4MGM3ZSwgMHgwZDdlLAorCTB4MDE3ZSwgMHgwMjdlLCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4NjkwNCwgMHhhMTk0LAorCTB4NDAwMCwgMHgwMDQwLCAweDZjODksIDB4MTA3OCwgMHg2YzQxLCAweDY4MDMsIDB4MTAwMCwgMHg2ODAzLAorCTB4MDAwMCwgMHgwYzdlLCAweDIwNjEsIDB4YTVhYiwgMHg2MTI4LCAweGExOTIsIDB4MDBjOCwgMHgwMGM4LAorCTB4NmM3NiwgMHg4MTA4LCAweDYxMmEsIDB4NjEyNCwgMHgwYzdmLCAweDgxZmYsIDB4MDA0MCwgMHg2Yzg0LAorCTB4MTA3OCwgMHg1OTRmLCAweDEwNzgsIDB4NmMzOCwgMHgwMDc4LCAweDZjODQsIDB4NjEyNCwgMHhhMWU1LAorCTB4MDAwMCwgMHgwMDQwLCAweDZjODEsIDB4MTA3OCwgMHhhMjQxLCAweDIwMDksIDB4MDAxNCwgMHgxMDc4LAorCTB4NzU2YywgMHgwYzdmLCAweDAwNzgsIDB4NmM4NCwgMHgwMjdmLCAweDAxN2YsIDB4MGQ3ZiwgMHgwYzdmLAorCTB4MDA3YywgMHgyMDAxLCAweGE1YzcsIDB4MjAwNCwgMHhhMDA1LCAweDAwYzAsIDB4NmM4NCwgMHgwYzdlLAorCTB4MjA2MSwgMHhhNWFiLCAweDYxMjgsIDB4YTE5MiwgMHgwMDAzLCAweDAwYzgsIDB4NmM3NiwgMHg4MTA4LAorCTB4NjEyYSwgMHgwYzdmLCAweDEwNzgsIDB4NTk0ZiwgMHgxMDc4LCAweDQxNzEsIDB4MDA3OCwgMHg2Yzg0LAorCTB4MGM3ZSwgMHgwZDdlLCAweDBlN2UsIDB4MDE3ZSwgMHgwMjdlLCAweDEwNzgsIDB4NTk2NywgMHgyMDcxLAorCTB4YTVhYiwgMHg3MTNjLCAweDgxZmYsIDB4MDA0MCwgMHg2Y2NhLCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LAorCTB4MDE0MCwgMHg2OTA0LCAweGExOTQsIDB4NDAwMCwgMHgwMDQwLCAweDZjZDAsIDB4NjgwMywgMHgxMDAwLAorCTB4NjgwMywgMHgwMDAwLCAweDAzN2UsIDB4MjAxOSwgMHgwMDAxLCAweDEwNzgsIDB4NmU2YywgMHgwMzdmLAorCTB4NzEzYywgMHgyMTYwLCAweDEwNzgsIDB4YTI0MSwgMHgyMDA5LCAweDAwNGEsIDB4MTA3OCwgMHg3NTZjLAorCTB4MDA3OCwgMHg2Y2NhLCAweDAyN2YsIDB4MDE3ZiwgMHgwZTdmLCAweDBkN2YsIDB4MGM3ZiwgMHgwMDdjLAorCTB4MDA3OCwgMHg2Y2JhLCAweDBlN2UsIDB4MGQ3ZSwgMHgwYzdlLCAweDA2N2UsIDB4MDU3ZSwgMHgwNDdlLAorCTB4MDA3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MDE4LCAweDIwNjgsIDB4NmNhMCwgMHgyMDcxLAorCTB4YTVhYiwgMHg3MDE4LCAweDIwNjgsIDB4OGRmZiwgMHgwMDQwLCAweDZjZmMsIDB4NjhhMCwgMHhhNDA2LAorCTB4MDA0MCwgMHg2Y2VlLCAweDY4NTQsIDB4MjA2OCwgMHgwMDc4LCAweDZjZTMsIDB4NjAxMCwgMHgyMDYwLAorCTB4NjQzYywgMHg2NTQwLCAweDZlNDgsIDB4MmQ2MCwgMHgxMDc4LCAweDQ2NmEsIDB4MDA0MCwgMHg2Y2ZjLAorCTB4MTA3OCwgMHg3MDQ1LCAweGEwODUsIDB4MDAwMSwgMHgxMjdmLCAweDAwN2YsIDB4MDQ3ZiwgMHgwNTdmLAorCTB4MDY3ZiwgMHgwYzdmLCAweDBkN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LAorCTB4NjU2NywgMHgyMGEzLCAweDEyMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg3ODFjLAorCTB4YTA4NiwgMHgwMDA0LCAweDAwYzAsIDB4NmQxNywgMHg2MDk4LCAweDAwNzgsIDB4NmQxOCwgMHg2MDMwLAorCTB4MjBhMiwgMHg3ODM0LCAweDIwYTIsIDB4NzgzOCwgMHgyMGEyLCAweDIwYTksIDB4MDAxMCwgMHhhMDA2LAorCTB4MjBhMiwgMHgwMGYwLCAweDZkMjAsIDB4MjBhMiwgMHgyMGEyLCAweDYwYzMsIDB4MDAyYywgMHgxMDc4LAorCTB4NmMyZCwgMHgwMDdjLCAweDE1N2UsIDB4MTQ3ZSwgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NTY3LAorCTB4MjBhMywgMHgwZjAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NzgwOCwgMHgyMGEyLAorCTB4NjBjMywgMHgwMDA4LCAweDEwNzgsIDB4NmMyZCwgMHgxNDdmLCAweDE1N2YsIDB4MDA3YywgMHgxNTdlLAorCTB4MTQ3ZSwgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NWY4LCAweDIwYTMsIDB4MDIwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGE5LCAweDAwMDYsIDB4MjAxMSwgMHhhMzQwLCAweDIwMTksIDB4YTM0MSwgMHgyM2E2LAorCTB4MjJhNiwgMHhhMzk4LCAweDAwMDIsIDB4YTI5MCwgMHgwMDAyLCAweDAwZjAsIDB4NmQ0ZiwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDFjLCAweDEwNzgsIDB4NmMyZCwgMHgxNDdmLAorCTB4MTU3ZiwgMHgwMDdjLCAweDE1N2UsIDB4MTQ3ZSwgMHgwMTdlLCAweDAyN2UsIDB4MjBhMSwgMHgwMjBiLAorCTB4MTA3OCwgMHg2NWNmLCAweDEwNzgsIDB4NjVlNiwgMHg3ODEwLCAweGEwODAsIDB4MDAwMCwgMHgyMDA0LAorCTB4YTA4MCwgMHgwMDE1LCAweDIwOTgsIDB4NzgwOCwgMHhhMDg4LCAweDAwMDIsIDB4MjFhOCwgMHg1M2E2LAorCTB4YTA4MCwgMHgwMDA0LCAweDgwMDMsIDB4NjBjMiwgMHgxMDc4LCAweDZjMmQsIDB4MDI3ZiwgMHgwMTdmLAorCTB4MTQ3ZiwgMHgxNTdmLCAweDAwN2MsIDB4MTU3ZSwgMHgxNDdlLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LAorCTB4NjU2NywgMHgyMGEzLCAweDYyMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg3ODA4LAorCTB4MjBhMiwgMHg2MGMzLCAweDAwMDgsIDB4MTA3OCwgMHg2YzJkLCAweDE0N2YsIDB4MTU3ZiwgMHgwMDdjLAorCTB4MTU3ZSwgMHgxNDdlLCAweDAxN2UsIDB4MDI3ZSwgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NTY3LAorCTB4NzgxMCwgMHhhMDgwLCAweDAwMDAsIDB4MjAwNCwgMHhhMDgwLCAweDAwMTcsIDB4MjA5OCwgMHg3ODA4LAorCTB4YTA4OCwgMHgwMDAyLCAweDIxYTgsIDB4NTNhNiwgMHg4MDAzLCAweDYwYzIsIDB4MTA3OCwgMHg2YzJkLAorCTB4MDI3ZiwgMHgwMTdmLCAweDE0N2YsIDB4MTU3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MGM3ZSwgMHgwMDdlLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhNWFiLCAweDcwMGMsIDB4MjA2MCwgMHg4Y2ZmLAorCTB4MDA0MCwgMHg2ZGQxLCAweDEwNzgsIDB4OGMzYiwgMHgwMGMwLCAweDZkYzgsIDB4MTA3OCwgMHg3YTA1LAorCTB4NjAwYywgMHgwMDdlLCAweDEwNzgsIDB4NzUzZCwgMHgxMDc4LCAweDcwNDUsIDB4MGM3ZiwgMHgwMDc4LAorCTB4NmRiZiwgMHg3MDBmLCAweDAwMDAsIDB4NzAwYiwgMHgwMDAwLCAweDEyN2YsIDB4MDA3ZiwgMHgwYzdmLAorCTB4MGU3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MTU3ZSwgMHgwZjdlLCAweDBlN2UsIDB4MGQ3ZSwgMHgwYzdlLAorCTB4MDI3ZSwgMHgwMTdlLCAweDAwN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksIDB4MDEwMCwgMHgyMDc5LAorCTB4MDE0MCwgMHgyMDcxLCAweGE1YWIsIDB4NzAyNCwgMHgyMDYwLCAweDhjZmYsIDB4MDA0MCwgMHg2ZTJhLAorCTB4MTA3OCwgMHg2YzQxLCAweDY4YzMsIDB4MDAwMCwgMHgxMDc4LCAweDU5NWEsIDB4MjAwOSwgMHgwMDEzLAorCTB4MTA3OCwgMHg3NTZjLCAweDIwYTksIDB4MDFmNCwgMHg2ODI0LCAweGQwOTQsIDB4MDA0MCwgMHg2ZTBkLAorCTB4NjgyNywgMHgwMDA0LCAweDc4MDQsIDB4YTA4NCwgMHg0MDAwLCAweDAwNDAsIDB4NmUxZiwgMHg3ODAzLAorCTB4MTAwMCwgMHg3ODAzLCAweDAwMDAsIDB4MDA3OCwgMHg2ZTFmLCAweGQwODQsIDB4MDA0MCwgMHg2ZTE0LAorCTB4NjgyNywgMHgwMDAxLCAweDAwNzgsIDB4NmUxNiwgMHgwMGYwLCAweDZkZmMsIDB4NzgwNCwgMHhhMDg0LAorCTB4MTAwMCwgMHgwMDQwLCAweDZlMWYsIDB4NzgwMywgMHgwMTAwLCAweDc4MDMsIDB4MDAwMCwgMHg2ODI0LAorCTB4MDA3ZiwgMHgwMTdmLCAweDAyN2YsIDB4MGM3ZiwgMHgwZDdmLCAweDBlN2YsIDB4MGY3ZiwgMHgxNTdmLAorCTB4MTI3ZiwgMHgwMDdjLCAweDIwMDEsIDB4YTMwMCwgMHgyMDA0LCAweGEwOTYsIDB4MDAwMSwgMHgwMDQwLAorCTB4NmU2MiwgMHhhMDk2LCAweDAwMDQsIDB4MDA0MCwgMHg2ZTYyLCAweDY4MTcsIDB4MDAwOCwgMHg2OGMzLAorCTB4MDAwMCwgMHgyMDExLCAweDQxMjksIDB4MTA3OCwgMHg1OGQ0LCAweDIwYTksIDB4MDFmNCwgMHg2ODI0LAorCTB4ZDA5NCwgMHgwMDQwLCAweDZlNTAsIDB4NjgyNywgMHgwMDA0LCAweDc4MDQsIDB4YTA4NCwgMHg0MDAwLAorCTB4MDA0MCwgMHg2ZTYyLCAweDc4MDMsIDB4MTAwMCwgMHg3ODAzLCAweDAwMDAsIDB4MDA3OCwgMHg2ZTYyLAorCTB4ZDA4NCwgMHgwMDQwLCAweDZlNTcsIDB4NjgyNywgMHgwMDAxLCAweDAwNzgsIDB4NmU1OSwgMHgwMGYwLAorCTB4NmUzZiwgMHg3ODA0LCAweGEwODQsIDB4MTAwMCwgMHgwMDQwLCAweDZlNjIsIDB4NzgwMywgMHgwMTAwLAorCTB4NzgwMywgMHgwMDAwLCAweDAwN2YsIDB4MDE3ZiwgMHgwMjdmLCAweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLAorCTB4MGY3ZiwgMHgxNTdmLCAweDEyN2YsIDB4MDA3YywgMHgxMjdlLCAweDE1N2UsIDB4MGY3ZSwgMHgwZTdlLAorCTB4MGQ3ZSwgMHgwYzdlLCAweDAyN2UsIDB4MDE3ZSwgMHgwMDdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDY5LAorCTB4MDEwMCwgMHgyMDc5LCAweDAxNDAsIDB4MjA3MSwgMHhhNWFiLCAweDcwM2MsIDB4MjA2MCwgMHg4Y2ZmLAorCTB4MDA0MCwgMHg2ZWU4LCAweDY4MTcsIDB4MDAxMCwgMHgyMDA5LCAweDAwZmEsIDB4ODEwOSwgMHgwMGMwLAorCTB4NmU4NiwgMHg2OGM3LCAweDAwMDAsIDB4NjhjYiwgMHgwMDA4LCAweDEwNzgsIDB4NTk2NywgMHgxMDc4LAorCTB4MWYzMSwgMHgwNDdlLCAweDA1N2UsIDB4MjAwOSwgMHgwMTdmLCAweDIxMmMsIDB4MjAwYiwgMHgwMGE1LAorCTB4MjAyMSwgMHgwMTY5LCAweDI0MDQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODYsIDB4MDAwNCwgMHgwMGMwLAorCTB4NmViNywgMHg2OGM3LCAweDAwMDAsIDB4NjhjYiwgMHgwMDA4LCAweDBlN2UsIDB4MGY3ZSwgMHgyMDc5LAorCTB4MDAyMCwgMHgyMDcxLCAweGE2MDIsIDB4NjgxNCwgMHhhMDg0LCAweDAwMDQsIDB4YTA4NSwgMHgwMDEyLAorCTB4NjgxNiwgMHg3ODAzLCAweDAwMDgsIDB4NzAwMywgMHgwMDAwLCAweDBmN2YsIDB4MGU3ZiwgMHgyNTBhLAorCTB4MDU3ZiwgMHgwNDdmLCAweGEzOWQsIDB4MDAwMCwgMHgwMGMwLCAweDZlYzIsIDB4MjAwOSwgMHgwMDQ5LAorCTB4MTA3OCwgMHg3NTZjLCAweDIwYTksIDB4MDNlOCwgMHg2ODI0LCAweGQwOTQsIDB4MDA0MCwgMHg2ZWQ1LAorCTB4NjgyNywgMHgwMDA0LCAweDc4MDQsIDB4YTA4NCwgMHg0MDAwLCAweDAwNDAsIDB4NmVlNywgMHg3ODAzLAorCTB4MTAwMCwgMHg3ODAzLCAweDAwMDAsIDB4MDA3OCwgMHg2ZWU3LCAweGQwOGMsIDB4MDA0MCwgMHg2ZWRjLAorCTB4NjgyNywgMHgwMDAyLCAweDAwNzgsIDB4NmVkZSwgMHgwMGYwLCAweDZlYzQsIDB4NzgwNCwgMHhhMDg0LAorCTB4MTAwMCwgMHgwMDQwLCAweDZlZTcsIDB4NzgwMywgMHgwMTAwLCAweDc4MDMsIDB4MDAwMCwgMHg2ODI0LAorCTB4MDA3ZiwgMHgwMTdmLCAweDAyN2YsIDB4MGM3ZiwgMHgwZDdmLCAweDBlN2YsIDB4MGY3ZiwgMHgxNTdmLAorCTB4MTI3ZiwgMHgwMDdjLCAweDBkN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA2OSwgMHhhNWFiLAorCTB4NmEwNiwgMHgxMjdmLCAweDBkN2YsIDB4MDA3YywgMHgwZDdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA2OSwgMHhhNWFiLCAweDZhMzIsIDB4MTI3ZiwgMHgwZDdmLCAweDAwN2MsIDB4MGY3ZSwgMHgwZTdlLAorCTB4MGM3ZSwgMHgwNjdlLCAweDAwN2UsIDB4MTI3ZSwgMHgyMDcxLCAweGE1YWIsIDB4NzYxNCwgMHgyNjYwLAorCTB4MjY3OCwgMHgyMDkxLCAweDgwMDAsIDB4OGNmZiwgMHgwMDQwLCAweDZmNDYsIDB4NjAxYywgMHhhMjA2LAorCTB4MDBjMCwgMHg2ZjQxLCAweDcwMTQsIDB4YWMzNiwgMHgwMGMwLCAweDZmMjAsIDB4NjYwYywgMHg3NjE2LAorCTB4NzAxMCwgMHhhYzM2LCAweDAwYzAsIDB4NmYyZSwgMHgyYzAwLCAweGFmMzYsIDB4MDA0MCwgMHg2ZjJjLAorCTB4MmYwMCwgMHg3MDEyLCAweDAwNzgsIDB4NmYyZSwgMHg3MDEzLCAweDAwMDAsIDB4NjYwYywgMHgwNjdlLAorCTB4MmMwMCwgMHhhZjA2LCAweDAwNDAsIDB4NmYzNywgMHg3ZTBlLCAweDAwNzgsIDB4NmYzOCwgMHgyNjc4LAorCTB4NjAwZiwgMHgwMDAwLCAweDEwNzgsIDB4OGMwMSwgMHgxMDc4LCAweDcwNDUsIDB4MGM3ZiwgMHgwMDc4LAorCTB4NmYxMywgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwMDc4LCAweDZmMTMsIDB4MTI3ZiwgMHgwMDdmLAorCTB4MDY3ZiwgMHgwYzdmLCAweDBlN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDE1N2UsIDB4MTQ3ZSwgMHgyMGExLAorCTB4MDIwYiwgMHgxMDc4LCAweDY4MDYsIDB4NzgxMCwgMHgyMGEyLCAweGEwMDYsIDB4MjBhMiwgMHgyMGEyLAorCTB4MjBhMiwgMHgyMGEyLCAweDIwYTMsIDB4MTAwMCwgMHgwMDc4LCAweDZmYTAsIDB4MTU3ZSwgMHgxNDdlLAorCTB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjgwNiwgMHg3ODEwLCAweDIwYTIsIDB4YTAwNiwgMHgyMGEyLAorCTB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMywgMHg0MDAwLCAweDAwNzgsIDB4NmZhMCwgMHgxNTdlLAorCTB4MTQ3ZSwgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2ODA2LCAweDc4MTAsIDB4MjBhMiwgMHhhMDA2LAorCTB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEzLCAweDIwMDAsIDB4MDA3OCwgMHg2ZmEwLAorCTB4MTU3ZSwgMHgxNDdlLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY4MDYsIDB4NzgxMCwgMHgyMGEyLAorCTB4YTAwNiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTMsIDB4MDQwMCwgMHgwMDc4LAorCTB4NmZhMCwgMHgxNTdlLCAweDE0N2UsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjgwNiwgMHg3ODEwLAorCTB4MjBhMiwgMHhhMDA2LCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMywgMHgwMjAwLAorCTB4MTA3OCwgMHg3MDUwLCAweDYwYzMsIDB4MDAyMCwgMHgxMDc4LCAweDZjMmQsIDB4MTQ3ZiwgMHgxNTdmLAorCTB4MDA3YywgMHgxMjdlLCAweDBjN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjEsIDB4MDEwMCwgMHg2MTIwLAorCTB4ZDFiNCwgMHgwMGMwLCAweDZmYjgsIDB4ZDFiYywgMHgwMGMwLCAweDcwMDIsIDB4MDA3OCwgMHg3MDQyLAorCTB4MjAwOSwgMHgwMTdmLCAweDIwMGIsIDB4MDBhMSwgMHgxNTdlLCAweDAwN2UsIDB4MGQ3ZSwgMHgyMDY5LAorCTB4MDE0MCwgMHgyMGE5LCAweDAwMWUsIDB4MjAwOSwgMHgwMTY5LCAweDY4MDQsIDB4YTA4NCwgMHg0MDAwLAorCTB4MDA0MCwgMHg2ZmY5LCAweDYwMjAsIDB4ZDBiNCwgMHgwMDQwLCAweDZmZjksIDB4NjAyNCwgMHhkMDk0LAorCTB4MDBjMCwgMHg2ZmY5LCAweDIxMDQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODYsIDB4MDAwNCwgMHgwMGMwLAorCTB4NmZmOSwgMHgwMGYwLCAweDZmYzUsIDB4MDI3ZSwgMHg2MTk4LCAweGExOGMsIDB4MDBmZiwgMHg4MTA3LAorCTB4NjEzMCwgMHhhMThjLCAweDAwZmYsIDB4YTEwZCwgMHg2MDg4LCAweDYyOGMsIDB4NjE4ZSwgMHg2MDhiLAorCTB4YmM5MSwgMHg2MDQzLCAweDAwMDEsIDB4NjA0MywgMHgwMDAwLCAweDYwOGEsIDB4NjI4ZSwgMHg2MDI0LAorCTB4ZDA5NCwgMHgwMGMwLCAweDZmZjgsIDB4NmEwNCwgMHhhMjk0LCAweDQwMDAsIDB4MDBjMCwgMHg2ZmVmLAorCTB4MDI3ZiwgMHgwZDdmLCAweDAwN2YsIDB4MTU3ZiwgMHgyMDA5LCAweDAxN2YsIDB4MjAwYiwgMHgwMDAwLAorCTB4MDA3OCwgMHg3MDQyLCAweDIwMDksIDB4MDE3ZiwgMHgyMDBiLCAweDAwYTEsIDB4MTU3ZSwgMHgwMDdlLAorCTB4MGQ3ZSwgMHgyMDY5LCAweDAxNDAsIDB4MjBhOSwgMHgwMDFlLCAweDIwMDksIDB4MDE2OSwgMHg2ODA0LAorCTB4YTA4NCwgMHg0MDAwLCAweDAwNDAsIDB4NzAzYiwgMHg2MDIwLCAweGQwYmMsIDB4MDA0MCwgMHg3MDNiLAorCTB4MjEwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4NiwgMHgwMDA0LCAweDAwYzAsIDB4NzAzYiwgMHgwMGYwLAorCTB4NzAwZiwgMHgwMjdlLCAweDYxNjQsIDB4YTE4YywgMHgwMGZmLCAweDgxMDcsIDB4NjEzMCwgMHhhMThjLAorCTB4MDBmZiwgMHhhMTBkLCAweDYwODgsIDB4NjI4YywgMHg2MDhiLCAweGJjOTEsIDB4NjE4ZSwgMHg2MDQzLAorCTB4MDAwMSwgMHg2MDQzLCAweDAwMDAsIDB4NjA4YSwgMHg2MjhlLCAweDZhMDQsIDB4YTI5NCwgMHg0MDAwLAorCTB4MDBjMCwgMHg3MDM1LCAweDAyN2YsIDB4MGQ3ZiwgMHgwMDdmLCAweDE1N2YsIDB4MjAwOSwgMHgwMTdmLAorCTB4MjAwYiwgMHgwMDAwLCAweDBjN2YsIDB4MTI3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhNWFiLAorCTB4NzAyMCwgMHhhMDA1LCAweDAwNDAsIDB4NzA0ZSwgMHg4MDAxLCAweDcwMjIsIDB4MGU3ZiwgMHgwMDdjLAorCTB4MjBhOSwgMHgwMDA4LCAweDIwYTIsIDB4MDBmMCwgMHg3MDUyLCAweDIwYTIsIDB4MjBhMiwgMHgwMDdjLAorCTB4MGY3ZSwgMHgwZTdlLCAweDBkN2UsIDB4MGM3ZSwgMHgwNzdlLCAweDA2N2UsIDB4MDA3ZSwgMHgxMjdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YTVhYiwgMHg3NjE0LCAweDI2NjAsIDB4MjY3OCwgMHgyMDM5LAorCTB4MDAwMSwgMHg4N2ZmLCAweDAwNDAsIDB4NzBmNCwgMHg4Y2ZmLCAweDAwNDAsIDB4NzBmNCwgMHg2MDFjLAorCTB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4NzBlZiwgMHg4OGZmLCAweDAwNDAsIDB4NzA3ZiwgMHgyODAwLAorCTB4YWMwNiwgMHgwMGMwLCAweDcwZWYsIDB4MjAzOSwgMHgwMDAwLCAweDAwNzgsIDB4NzA4YSwgMHg2MDE4LAorCTB4YTIwNiwgMHgwMGMwLCAweDcwZWYsIDB4ODVmZiwgMHgwMDQwLCAweDcwOGEsIDB4NjAyMCwgMHhhMTA2LAorCTB4MDBjMCwgMHg3MGVmLCAweDcwMjQsIDB4YWMwNiwgMHgwMGMwLCAweDcwYmEsIDB4MjA2OSwgMHgwMTAwLAorCTB4NjhjMCwgMHhhMDA1LCAweDAwNDAsIDB4NzBiNSwgMHgxMDc4LCAweDU5NWEsIDB4NjgxNywgMHgwMDA4LAorCTB4NjhjMywgMHgwMDAwLCAweDEwNzgsIDB4NzE4OCwgMHg3MDI3LCAweDAwMDAsIDB4MDM3ZSwgMHgyMDY5LAorCTB4MDE0MCwgMHg2YjA0LCAweGEzODQsIDB4MTAwMCwgMHgwMDQwLCAweDcwYWEsIDB4NjgwMywgMHgwMTAwLAorCTB4NjgwMywgMHgwMDAwLCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDA0MCwgMHg3MGIyLAorCTB4NjgyNywgMHgwMDAxLCAweDAzN2YsIDB4MDA3OCwgMHg3MGJhLCAweDYwMDMsIDB4MDAwOSwgMHg2MzBhLAorCTB4MDA3OCwgMHg3MGVmLCAweDcwMTQsIDB4YWMzNiwgMHgwMGMwLCAweDcwYzAsIDB4NjYwYywgMHg3NjE2LAorCTB4NzAxMCwgMHhhYzM2LCAweDAwYzAsIDB4NzBjZSwgMHgyYzAwLCAweGFmMzYsIDB4MDA0MCwgMHg3MGNjLAorCTB4MmYwMCwgMHg3MDEyLCAweDAwNzgsIDB4NzBjZSwgMHg3MDEzLCAweDAwMDAsIDB4NjYwYywgMHgwNjdlLAorCTB4MmMwMCwgMHhhZjA2LCAweDAwNDAsIDB4NzBkNywgMHg3ZTBlLCAweDAwNzgsIDB4NzBkOCwgMHgyNjc4LAorCTB4ODlmZiwgMHgwMGMwLCAweDcwZTcsIDB4NjAwZiwgMHgwMDAwLCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LAorCTB4OGE0NCwgMHgwMDQwLCAweDcwZTUsIDB4MTA3OCwgMHg5ZTcwLCAweDEwNzgsIDB4OGMwMSwgMHgxMDc4LAorCTB4NzA0NSwgMHg4OGZmLCAweDAwYzAsIDB4NzBmZSwgMHgwYzdmLCAweDAwNzgsIDB4NzA2OSwgMHgyYzc4LAorCTB4NjAwYywgMHgyMDYwLCAweDAwNzgsIDB4NzA2OSwgMHhhMDA2LCAweDEyN2YsIDB4MDA3ZiwgMHgwNjdmLAorCTB4MDc3ZiwgMHgwYzdmLCAweDBkN2YsIDB4MGU3ZiwgMHgwZjdmLCAweDAwN2MsIDB4NjAxNywgMHgwMDAwLAorCTB4MGM3ZiwgMHhhOGM1LCAweDAwMDEsIDB4MDA3OCwgMHg3MGY1LCAweDBmN2UsIDB4MGU3ZSwgMHgwZDdlLAorCTB4MGM3ZSwgMHgwNjdlLCAweDAyN2UsIDB4MDA3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLAorCTB4YTVhYiwgMHg3NjM4LCAweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLCAweDAwNDAsIDB4NzE3NywgMHg2MDFjLAorCTB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4NzE3MiwgMHg4N2ZmLCAweDAwNDAsIDB4NzEyNSwgMHgyNzAwLAorCTB4YWMwNiwgMHgwMGMwLCAweDcxNzIsIDB4MDA3OCwgMHg3MTMwLCAweDYwMTgsIDB4YTIwNiwgMHgwMGMwLAorCTB4NzE3MiwgMHg4NWZmLCAweDAwNDAsIDB4NzEzMCwgMHg2MDIwLCAweGExMDYsIDB4MDBjMCwgMHg3MTcyLAorCTB4NzAzYywgMHhhYzA2LCAweDAwYzAsIDB4NzE0MiwgMHgwMzdlLCAweDIwMTksIDB4MDAwMSwgMHgxMDc4LAorCTB4NmU2YywgMHg3MDMzLCAweDAwMDAsIDB4NzAzZiwgMHgwMDAwLCAweDcwNDMsIDB4MDAwMCwgMHg3MDQ3LAorCTB4MDAwMCwgMHgwMzdmLCAweDcwMzgsIDB4YWMzNiwgMHgwMGMwLCAweDcxNDgsIDB4NjYwYywgMHg3NjNhLAorCTB4NzAzNCwgMHhhYzM2LCAweDAwYzAsIDB4NzE1NiwgMHgyYzAwLCAweGFmMzYsIDB4MDA0MCwgMHg3MTU0LAorCTB4MmYwMCwgMHg3MDM2LCAweDAwNzgsIDB4NzE1NiwgMHg3MDM3LCAweDAwMDAsIDB4NjYwYywgMHgwNjdlLAorCTB4MmMwMCwgMHhhZjA2LCAweDAwNDAsIDB4NzE1ZiwgMHg3ZTBlLCAweDAwNzgsIDB4NzE2MCwgMHgyNjc4LAorCTB4NjAwZiwgMHgwMDAwLCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LCAweDhhNDQsIDB4MDA0MCwgMHg3MTZhLAorCTB4MTA3OCwgMHg5ZTcwLCAweDEwNzgsIDB4OGMwMSwgMHg4N2ZmLCAweDAwYzAsIDB4NzE4MSwgMHgwYzdmLAorCTB4MDA3OCwgMHg3MTE0LCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDAwNzgsIDB4NzExNCwgMHhhMDA2LAorCTB4MTI3ZiwgMHgwMDdmLCAweDAyN2YsIDB4MDY3ZiwgMHgwYzdmLCAweDBkN2YsIDB4MGU3ZiwgMHgwZjdmLAorCTB4MDA3YywgMHg2MDE3LCAweDAwMDAsIDB4MGM3ZiwgMHhhN2JkLCAweDAwMDEsIDB4MDA3OCwgMHg3MTc4LAorCTB4MGU3ZSwgMHgyMDcxLCAweGE1YWIsIDB4MjAwMSwgMHhhMzAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAyLAorCTB4MDBjMCwgMHg3MTk2LCAweDcwMDcsIDB4MDAwNSwgMHgwMDc4LCAweDcxOTgsIDB4NzAwNywgMHgwMDAwLAorCTB4MGU3ZiwgMHgwMDdjLCAweDBmN2UsIDB4MGU3ZSwgMHgwYzdlLCAweDA2N2UsIDB4MDI3ZSwgMHgwMDdlLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhNWFiLCAweDJjMTAsIDB4NzYzOCwgMHgyNjYwLAorCTB4MjY3OCwgMHg4Y2ZmLCAweDAwNDAsIDB4NzFkOCwgMHgyMjAwLCAweGFjMDYsIDB4MDBjMCwgMHg3MWQzLAorCTB4NzAzOCwgMHhhYzM2LCAweDAwYzAsIDB4NzFiNiwgMHg2NjBjLCAweDc2M2EsIDB4NzAzNCwgMHhhYzM2LAorCTB4MDBjMCwgMHg3MWM0LCAweDJjMDAsIDB4YWYzNiwgMHgwMDQwLCAweDcxYzIsIDB4MmYwMCwgMHg3MDM2LAorCTB4MDA3OCwgMHg3MWM0LCAweDcwMzcsIDB4MDAwMCwgMHg2NjBjLCAweDJjMDAsIDB4YWYwNiwgMHgwMDQwLAorCTB4NzFjYywgMHg3ZTBlLCAweDAwNzgsIDB4NzFjZCwgMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwgMHhhMDg1LAorCTB4MDAwMSwgMHgwMDc4LCAweDcxZDgsIDB4MmM3OCwgMHg2MDBjLCAweDIwNjAsIDB4MDA3OCwgMHg3MWE5LAorCTB4MTI3ZiwgMHgwMDdmLCAweDAyN2YsIDB4MDY3ZiwgMHgwYzdmLCAweDBlN2YsIDB4MGY3ZiwgMHgwMDdjLAorCTB4MGY3ZSwgMHgwZTdlLCAweDBkN2UsIDB4MGM3ZSwgMHgwNjdlLCAweDAwN2UsIDB4MTI3ZSwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDcxLCAweGE1YWIsIDB4NzYwYywgMHgyNjYwLCAweDI2NzgsIDB4OGNmZiwgMHgwMDQwLAorCTB4NzI3OSwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEyMDYsIDB4MDBjMCwgMHg3Mjc0LAorCTB4NzAyNCwgMHhhYzA2LCAweDAwYzAsIDB4NzIxZiwgMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwgMHhhMDA1LAorCTB4MDA0MCwgMHg3MjRkLCAweDEwNzgsIDB4NmM0MSwgMHg2OGMzLCAweDAwMDAsIDB4MTA3OCwgMHg3MTg4LAorCTB4NzAyNywgMHgwMDAwLCAweDAzN2UsIDB4MjA2OSwgMHgwMTQwLCAweDZiMDQsIDB4YTM4NCwgMHgxMDAwLAorCTB4MDA0MCwgMHg3MjE2LCAweDY4MDMsIDB4MDEwMCwgMHg2ODAzLCAweDAwMDAsIDB4MjA2OSwgMHgwMTAwLAorCTB4NjgyNCwgMHhkMDg0LCAweDAwNDAsIDB4NzIxZSwgMHg2ODI3LCAweDAwMDEsIDB4MDM3ZiwgMHg3MDBjLAorCTB4YWMzNiwgMHgwMGMwLCAweDcyMjUsIDB4NjYwYywgMHg3NjBlLCAweDcwMDgsIDB4YWMzNiwgMHgwMGMwLAorCTB4NzIzMywgMHgyYzAwLCAweGFmMzYsIDB4MDA0MCwgMHg3MjMxLCAweDJmMDAsIDB4NzAwYSwgMHgwMDc4LAorCTB4NzIzMywgMHg3MDBiLCAweDAwMDAsIDB4NjYwYywgMHgwNjdlLCAweDJjMDAsIDB4YWYwNiwgMHgwMDQwLAorCTB4NzIzYywgMHg3ZTBlLCAweDAwNzgsIDB4NzIzZCwgMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwgMHgxMDc4LAorCTB4OGMyNywgMHgwMGMwLCAweDcyNTEsIDB4MTA3OCwgMHgyODM5LCAweDEwNzgsIDB4OGMzYiwgMHgwMGMwLAorCTB4NzI2ZCwgMHgxMDc4LCAweDdhMDUsIDB4MDA3OCwgMHg3MjZkLCAweDEwNzgsIDB4NzE4OCwgMHgwMDc4LAorCTB4NzIxZiwgMHgxMDc4LCAweDhjM2IsIDB4MDBjMCwgMHg3MjU5LCAweDEwNzgsIDB4N2EwNSwgMHgwMDc4LAorCTB4NzI2ZCwgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4YTQ0LCAweDAwNDAsIDB4NzI2ZCwgMHg2MDFjLAorCTB4YTA4NiwgMHgwMDAzLCAweDAwYzAsIDB4NzI4MSwgMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LAorCTB4MDAwMCwgMHgxMDc4LCAweDQ5ODIsIDB4MTA3OCwgMHg4YmY0LCAweDEwNzgsIDB4OGMwMSwgMHgxMDc4LAorCTB4NzA0NSwgMHgwYzdmLCAweDAwNzgsIDB4NzFlZSwgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwMDc4LAorCTB4NzFlZSwgMHgxMjdmLCAweDAwN2YsIDB4MDY3ZiwgMHgwYzdmLCAweDBkN2YsIDB4MGU3ZiwgMHgwZjdmLAorCTB4MDA3YywgMHg2MDFjLCAweGEwODYsIDB4MDAwNiwgMHgwMGMwLCAweDcyNmQsIDB4MTA3OCwgMHg5ZTcwLAorCTB4MDA3OCwgMHg3MjZkLCAweDAzN2UsIDB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4MzkwOCwgMHhhMDA2LAorCTB4YTE5MCwgMHgwMDIwLCAweDIyMWMsIDB4YTM5ZSwgMHgyNjBjLCAweDAwYzAsIDB4NzI5YiwgMHg4MjEwLAorCTB4ODAwMCwgMHgwMDc4LCAweDcyOTIsIDB4YTAwNSwgMHgwMDQwLCAweDcyYTcsIDB4MjBhOSwgMHgwMDIwLAorCTB4MjE5OCwgMHg4MjExLCAweGEyODIsIDB4MDAyMCwgMHgyMGM4LCAweDIwYTAsIDB4NTNhMywgMHgxNDdmLAorCTB4MTM3ZiwgMHgxNTdmLCAweDAzN2YsIDB4MDA3YywgMHgwZDdlLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LAorCTB4NjVmOCwgMHgyMGEzLCAweDAyMDAsIDB4MjBhMywgMHgwMDE0LCAweDYwYzMsIDB4MDAxNCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjA5OSwgMHhhNWEzLCAweDIwYTksIDB4MDAwNCwgMHg1M2E2LAorCTB4MjBhMywgMHgwMDA0LCAweDIwYTMsIDB4Nzg3OCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4MTA3OCwgMHg2YzJkLCAweDBkN2YsIDB4MDA3YywgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NWY4LAorCTB4MjBhMywgMHgwMjE0LCAweDIwYTMsIDB4MDAxOCwgMHgyMGEzLCAweDA4MDAsIDB4NzgxMCwgMHhhMDg0LAorCTB4ZmYwMCwgMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAwLCAweDc4MTAsIDB4YTA4NCwgMHgwMGZmLCAweDIwYTIsIDB4NzgyOCwgMHgyMGEyLAorCTB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTgsIDB4MTA3OCwgMHg2YzJkLAorCTB4MDA3YywgMHgwZDdlLCAweDAxN2UsIDB4MmY2OCwgMHgyMDA5LCAweDAwMzUsIDB4MTA3OCwgMHg4ZWY1LAorCTB4MDBjMCwgMHg3MzYxLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY1NjcsIDB4MjBhMywgMHgxMzAwLAorCTB4MjBhMywgMHgwMDAwLCAweDc4MjgsIDB4MjA2OCwgMHg2ODFjLCAweGEwODYsIDB4MDAwMywgMHgwMDQwLAorCTB4NzMzZCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDE0LCAweGEyODYsIDB4MDA3ZSwgMHgwMGMwLAorCTB4NzMxNywgMHgyMGEzLCAweDAwZmYsIDB4MjBhMywgMHhmZmZlLCAweDAwNzgsIDB4NzM1MiwgMHhhMjg2LAorCTB4MDA3ZiwgMHgwMGMwLCAweDczMjEsIDB4MjBhMywgMHgwMGZmLCAweDIwYTMsIDB4ZmZmZCwgMHgwMDc4LAorCTB4NzM1MiwgMHhkMmJjLCAweDAwNDAsIDB4NzMzNywgMHhhMjg2LCAweDAwODAsIDB4MDBjMCwgMHg3MzJlLAorCTB4MjBhMywgMHgwMGZmLCAweDIwYTMsIDB4ZmZmYywgMHgwMDc4LCAweDczNTIsIDB4YTJlOCwgMHhhNDM0LAorCTB4MmQ2YywgMHg2ODEwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDAwNzgsIDB4NzM1MiwgMHgyMGEzLAorCTB4MDAwMCwgMHg2MDk4LCAweDIwYTIsIDB4MDA3OCwgMHg3MzUyLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LAorCTB4MjAwNCwgMHhhMDgyLCAweDAwN2UsIDB4MDA0OCwgMHg3MzRlLCAweDBkN2UsIDB4MjA2OSwgMHhhMzFhLAorCTB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MGQ3ZiwgMHgwMDc4LCAweDczNTIsIDB4MjBhMywgMHgwMDAwLAorCTB4NjAzMCwgMHgyMGEyLCAweDc4MzQsIDB4MjBhMiwgMHg3ODM4LCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAwYywgMHgxMDc4LCAweDZjMmQsIDB4MDE3ZiwgMHgwZDdmLAorCTB4MDA3YywgMHg3ODE3LCAweDAwMDEsIDB4NzgwMywgMHgwMDA2LCAweDAxN2YsIDB4MGQ3ZiwgMHgwMDdjLAorCTB4MGQ3ZSwgMHgwMjdlLCAweDc5MjgsIDB4MjE2OCwgMHg2OTFjLCAweGExODYsIDB4MDAwNiwgMHgwMDQwLAorCTB4NzM4YSwgMHhhMTg2LCAweDAwMDMsIDB4MDA0MCwgMHg3M2U1LCAweGExODYsIDB4MDAwNSwgMHgwMDQwLAorCTB4NzNjOCwgMHhhMTg2LCAweDAwMDQsIDB4MDA0MCwgMHg3M2I4LCAweGExODYsIDB4MDAwOCwgMHgwMDQwLAorCTB4NzNkMiwgMHg3ODA3LCAweDAwMzcsIDB4NzgxMywgMHgxNzAwLCAweDEwNzgsIDB4NzQ1MCwgMHgwMjdmLAorCTB4MGQ3ZiwgMHgwMDdjLCAweDEwNzgsIDB4NzQwZCwgMHgyMDA5LCAweDQwMDAsIDB4NjgwMCwgMHgwMDc5LAorCTB4NzM5MSwgMHg3M2E0LCAweDczYjIsIDB4NzNhNiwgMHg3M2IyLCAweDczYWQsIDB4NzNhNCwgMHg3M2E0LAorCTB4NzNiMiwgMHg3M2IyLCAweDczYjIsIDB4NzNiMiwgMHg3M2E0LCAweDczYTQsIDB4NzNhNCwgMHg3M2E0LAorCTB4NzNhNCwgMHg3M2IyLCAweDczYTQsIDB4NzNiMiwgMHgxMDc4LCAweDEzMjgsIDB4NjgyNCwgMHhkMGU0LAorCTB4MDA0MCwgMHg3M2FkLCAweGQwY2MsIDB4MDA0MCwgMHg3M2IwLCAweGEwMGUsIDB4MDA3OCwgMHg3M2IyLAorCTB4MjAwOSwgMHgyMDAwLCAweDY4MjgsIDB4MjBhMiwgMHg2ODJjLCAweDIwYTIsIDB4MDA3OCwgMHg3NDAzLAorCTB4MTA3OCwgMHg3NDBkLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjAwOSwgMHg0MDAwLAorCTB4NmEwMCwgMHhhMjg2LCAweDAwMDIsIDB4MDBjMCwgMHg3M2M2LCAweGEwMGUsIDB4MDA3OCwgMHg3NDAzLAorCTB4MTA3OCwgMHg3NDBkLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjAwOSwgMHg0MDAwLAorCTB4MDA3OCwgMHg3NDAzLCAweDEwNzgsIDB4NzQwZCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4MjAwOSwgMHg0MDAwLCAweGEyODYsIDB4MDAwNSwgMHgwMDQwLCAweDczZTIsIDB4YTI4NiwgMHgwMDAyLAorCTB4MDBjMCwgMHg3M2UzLCAweGEwMGUsIDB4MDA3OCwgMHg3NDAzLCAweDEwNzgsIDB4NzQwZCwgMHg2ODEwLAorCTB4MjA2OCwgMHg2OTdjLCAweDY4MTAsIDB4YTExMiwgMHg2OTgwLCAweDY4MTQsIDB4YTEwMywgMHgyMGEyLAorCTB4MjJhMiwgMHg3OTI4LCAweGExODAsIDB4MDAwMCwgMHgyMDA0LCAweGEwOGUsIDB4MDAwMiwgMHgwMDQwLAorCTB4NzQwMSwgMHhhMDhlLCAweDAwMDQsIDB4MDA0MCwgMHg3NDAxLCAweDIwMDksIDB4NDAwMCwgMHgwMDc4LAorCTB4NzQwMywgMHgyMDA5LCAweDAwMDAsIDB4MjFhMiwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE4LAorCTB4MTA3OCwgMHg2YzJkLCAweDAyN2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDAzN2UsIDB4MDQ3ZSwgMHgwNTdlLAorCTB4MDY3ZSwgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NWY4LCAweGEwMDYsIDB4MjBhMywgMHgwMjAwLAorCTB4MjBhMiwgMHg3OTM0LCAweDIxYTIsIDB4NzkzOCwgMHgyMWEyLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LAorCTB4MjAwNCwgMHhhMDkyLCAweDAwN2UsIDB4MDA0OCwgMHg3NDMzLCAweDBkN2UsIDB4MjA2OSwgMHhhMzFhLAorCTB4MmQyYywgMHg4ZDY4LCAweDJkMzQsIDB4YTBlOCwgMHhhNDM0LCAweDJkNmMsIDB4NmIxMCwgMHg2YzE0LAorCTB4MGQ3ZiwgMHgwMDc4LCAweDc0MzksIDB4MjAxOSwgMHgwMDAwLCAweDY0OTgsIDB4MjAyOSwgMHgwMDAwLAorCTB4NjYzMCwgMHg3ODI4LCAweGEwODAsIDB4MDAwNywgMHgyMDA0LCAweGEwODYsIDB4MDAwMywgMHgwMGMwLAorCTB4NzQ0NywgMHgyNWEyLCAweDI2YTIsIDB4MjNhMiwgMHgyNGEyLCAweDAwNzgsIDB4NzQ0YiwgMHgyM2EyLAorCTB4MjRhMiwgMHgyNWEyLCAweDI2YTIsIDB4MDY3ZiwgMHgwNTdmLCAweDA0N2YsIDB4MDM3ZiwgMHgwMDdjLAorCTB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjVmOCwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDA5LCAweDc4MTAsIDB4MjBhMiwgMHg2MGMzLCAweDAwMDgsIDB4MTA3OCwgMHg2YzJkLAorCTB4MDA3YywgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NTVlLCAweDIwYTMsIDB4MTQwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHg3ODM0LCAweDIwYTIsIDB4NzgzOCwgMHgyMGEyLCAweDc4MjgsIDB4MjBhMiwgMHg3ODJjLAorCTB4MjBhMiwgMHg3ODMwLCAweGEwODQsIDB4MDBmZiwgMHg4MDA3LCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4NjBjMywgMHgwMDEwLCAweDEwNzgsIDB4NmMyZCwgMHgwMDdjLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LAorCTB4NjVlZiwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MjgsIDB4MjBhMiwgMHg3ODEwLAorCTB4MjBhMiwgMHg2MGMzLCAweDAwMDgsIDB4MTA3OCwgMHg2YzJkLCAweDAwN2MsIDB4MTQ3ZSwgMHgyMGExLAorCTB4MDIwYiwgMHgxMDc4LCAweDc0OTksIDB4NjBjMywgMHgwMDAwLCAweDEwNzgsIDB4NmMyZCwgMHgxNDdmLAorCTB4MDA3YywgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LAorCTB4MjAwNCwgMHhkMGJjLCAweDAwNDAsIDB4NzRiNiwgMHgwZDdlLCAweGEwZTgsIDB4YTQzNCwgMHgyZDZjLAorCTB4NjgxMCwgMHhhMDg1LCAweDAzMDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MjA2OSwgMHhhMzFhLAorCTB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MGQ3ZiwgMHgwMDc4LCAweDc0YmUsIDB4MjBhMywgMHgwMzAwLAorCTB4NjI5OCwgMHgyMmEyLCAweDIwYTMsIDB4MDAwMCwgMHg2MjMwLCAweDIyYTIsIDB4MjBhMywgMHgwODE5LAorCTB4MjBhMywgMHgwMDAwLCAweDEwNzgsIDB4NmMxYywgMHgyMmEyLCAweDIwYTMsIDB4MDAwMCwgMHgyZmEyLAorCTB4N2EwOCwgMHgyMmEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MDA3YywgMHgyMDYxLAorCTB4YWEwMCwgMHgyYTcwLCAweDcwNjAsIDB4NzA0NiwgMHg3MDRiLCAweGFhMDAsIDB4MDA3YywgMHgwZTdlLAorCTB4MTI3ZSwgMHgyMDcxLCAweGEzMDAsIDB4MjA5MSwgMHg4MDAwLCAweDc1NDQsIDB4YTU4MiwgMHgwMDEwLAorCTB4MDA0OCwgMHg3NTA5LCAweDcwNDgsIDB4MjA2MCwgMHg2MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwMDQwLAorCTB4NzRmNSwgMHhhY2UwLCAweDAwMTAsIDB4NzA1NCwgMHhhYzAyLCAweDAwYzgsIDB4NzRmMSwgMHgwMDc4LAorCTB4NzRlNCwgMHgyMDYxLCAweGFhMDAsIDB4MDA3OCwgMHg3NGU0LCAweDYwMDMsIDB4MDAwOCwgMHg4NTI5LAorCTB4NzU0NiwgMHhhY2E4LCAweDAwMTAsIDB4NzA1NCwgMHhhNTAyLCAweDAwYzgsIDB4NzUwNSwgMHg3NTRhLAorCTB4YTA4NSwgMHgwMDAxLCAweDEyN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDcwNGIsIDB4YWEwMCwgMHgwMDc4LAorCTB4NzUwMCwgMHhhMDA2LCAweDAwNzgsIDB4NzUwMiwgMHgwZTdlLCAweDIwNzEsIDB4YTMwMCwgMHg3NTQ0LAorCTB4YTU4MiwgMHgwMDEwLCAweDAwNDgsIDB4NzUzYSwgMHg3MDQ4LCAweDIwNjAsIDB4NjAwMCwgMHhhMDg2LAorCTB4MDAwMCwgMHgwMDQwLCAweDc1MjcsIDB4YWNlMCwgMHgwMDEwLCAweDcwNTQsIDB4YWMwMiwgMHgwMGM4LAorCTB4NzUyMywgMHgwMDc4LCAweDc1MTYsIDB4MjA2MSwgMHhhYTAwLCAweDAwNzgsIDB4NzUxNiwgMHg2MDAzLAorCTB4MDAwOCwgMHg4NTI5LCAweDc1NDYsIDB4YWNhOCwgMHgwMDEwLCAweDcwNTQsIDB4YTUwMiwgMHgwMGM4LAorCTB4NzUzNiwgMHg3NTRhLCAweGEwODUsIDB4MDAwMSwgMHgwZTdmLCAweDAwN2MsIDB4NzA0YiwgMHhhYTAwLAorCTB4MDA3OCwgMHg3NTMyLCAweGEwMDYsIDB4MDA3OCwgMHg3NTM0LCAweGFjODIsIDB4YWEwMCwgMHgxMDQ4LAorCTB4MTMyOCwgMHgyMDAxLCAweGEzMTUsIDB4MjAwNCwgMHhhYzAyLCAweDEwYzgsIDB4MTMyOCwgMHhhMDA2LAorCTB4NjAwNiwgMHg2MDBhLCAweDYwMGUsIDB4NjAxMiwgMHg2MDE2LCAweDYwMWEsIDB4NjAxZiwgMHgwMDAwLAorCTB4NjAwMywgMHgwMDAwLCAweDYwMjIsIDB4NjAyNiwgMHg2MDJhLCAweDYwMmUsIDB4NjAzMiwgMHg2MDM2LAorCTB4NjAzYSwgMHg2MDNlLCAweDIwNjEsIDB4YTMwMCwgMHg2MDQ0LCAweDgwMDAsIDB4NjA0NiwgMHhhMDg2LAorCTB4MDAwMSwgMHgwMDQwLCAweDc1NjQsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LAorCTB4NjEwOSwgMHgxMjdmLCAweDAwNzgsIDB4NzU2MywgMHg2MDFjLCAweGEwODQsIDB4MDAwZiwgMHgwMDc5LAorCTB4NzU3MSwgMHg3NTdhLCAweDc1OGIsIDB4NzVhNywgMHg3NWMzLCAweDhmMmQsIDB4OGY0OSwgMHg4ZjY1LAorCTB4NzU3YSwgMHg3NThiLCAweGExODYsIDB4MDAxMywgMHgwMGMwLCAweDc1ODMsIDB4MTA3OCwgMHg2MDEwLAorCTB4MTA3OCwgMHg2MTA5LCAweDAwN2MsIDB4YTE4ZSwgMHgwMDQ3LCAweDAwYzAsIDB4NzU4YSwgMHhhMDE2LAorCTB4MTA3OCwgMHgxNWVjLCAweDAwN2MsIDB4MDY3ZSwgMHg2MDAwLCAweGEwYjIsIDB4MDAxMCwgMHgxMGM4LAorCTB4MTMyOCwgMHgxMDc5LCAweDc1OTUsIDB4MDY3ZiwgMHgwMDdjLCAweDc1YTUsIDB4Nzg5MSwgMHg3YTM0LAorCTB4NzVhNSwgMHg3YWI4LCAweDc1ZGYsIDB4NzVhNSwgMHg3NWE1LCAweDc4MjMsIDB4N2U2ZCwgMHg3NWE1LAorCTB4NzVhNSwgMHg3NWE1LCAweDc1YTUsIDB4NzVhNSwgMHg3NWE1LCAweDEwNzgsIDB4MTMyOCwgMHgwNjdlLAorCTB4NjAwMCwgMHhhMGIyLCAweDAwMTAsIDB4MTBjOCwgMHgxMzI4LCAweDEwNzksIDB4NzViMSwgMHgwNjdmLAorCTB4MDA3YywgMHg3NWMxLCAweDg1MjIsIDB4NzVjMSwgMHg3NWMxLCAweDc1YzEsIDB4NzVjMSwgMHg3NWMxLAorCTB4NzVjMSwgMHg4NGM1LCAweDg2YTgsIDB4NzVjMSwgMHg4NTUyLCAweDg1ZDgsIDB4ODU1MiwgMHg4NWQ4LAorCTB4NzVjMSwgMHgxMDc4LCAweDEzMjgsIDB4MDY3ZSwgMHg2MDAwLCAweGEwYjIsIDB4MDAxMCwgMHgxMGM4LAorCTB4MTMyOCwgMHgxMDc5LCAweDc1Y2QsIDB4MDY3ZiwgMHgwMDdjLCAweDc1ZGQsIDB4N2ViNCwgMHg3ZjgxLAorCTB4ODBjNiwgMHg4MjQyLCAweDc1ZGQsIDB4NzVkZCwgMHg3NWRkLCAweDdlOGQsIDB4ODQ2ZCwgMHg4NDcxLAorCTB4NzVkZCwgMHg3NWRkLCAweDc1ZGQsIDB4NzVkZCwgMHg4NGExLCAweDEwNzgsIDB4MTMyOCwgMHhhMWI2LAorCTB4MDAxNSwgMHgwMGMwLCAweDc1ZTcsIDB4MTA3OCwgMHg3NTNkLCAweDAwNzgsIDB4NzVlZCwgMHhhMWI2LAorCTB4MDAxNiwgMHgxMGMwLCAweDEzMjgsIDB4MTA3OCwgMHg3NTNkLCAweDAwN2MsIDB4MjBhOSwgMHgwMDBlLAorCTB4MmU5OCwgMHg2MDEwLCAweDIwYTAsIDB4NTNhMywgMHgyMGE5LCAweDAwMDYsIDB4MzMxMCwgMHgzNDIwLAorCTB4OTM5OCwgMHg5NGEwLCAweDMzMTgsIDB4MzQyOCwgMHgyMjJlLCAweDIzMjYsIDB4YTI5MCwgMHgwMDAyLAorCTB4YTVhOCwgMHgwMDAyLCAweGEzOTgsIDB4MDAwMiwgMHhhNGEwLCAweDAwMDIsIDB4MDBmMCwgMHg3NWZjLAorCTB4MGU3ZSwgMHgxMDc4LCAweDhhNDQsIDB4MDA0MCwgMHg3NjEzLCAweDYwMTAsIDB4MjA3MCwgMHg3MDA3LAorCTB4MDAwMCwgMHg3MDM3LCAweDAxMDMsIDB4MGU3ZiwgMHgxMDc4LCAweDc1M2QsIDB4MDA3YywgMHgwZDdlLAorCTB4MDM3ZSwgMHg3MzMwLCAweGEzODYsIDB4MDIwMCwgMHgwMGMwLCAweDc2MjQsIDB4NjAxOCwgMHgyMDY4LAorCTB4NjgxMywgMHgwMGZmLCAweDY4MTcsIDB4ZmZmZCwgMHg2MDEwLCAweGEwMDUsIDB4MDA0MCwgMHg3NjJlLAorCTB4MjA2OCwgMHg2ODA3LCAweDAwMDAsIDB4NjgzNywgMHgwMTAzLCAweDZiMzIsIDB4MTA3OCwgMHg3NTNkLAorCTB4MDM3ZiwgMHgwZDdmLCAweDAwN2MsIDB4MDE3ZSwgMHgyMGE5LCAweDAwMmEsIDB4YWU4MCwgMHgwMDBjLAorCTB4MjA5OCwgMHg2MDEwLCAweGEwODAsIDB4MDAwMiwgMHgyMGEwLCAweDUzYTMsIDB4MjBhOSwgMHgwMDJhLAorCTB4NjAxMCwgMHhhMDgwLCAweDAwMDEsIDB4MjAwNCwgMHhhMDgwLCAweDAwMDIsIDB4MjBhMCwgMHg1M2EzLAorCTB4MGU3ZSwgMHg2MDEwLCAweDIwMDQsIDB4MjA3MCwgMHg3MDM3LCAweDAxMDMsIDB4MGU3ZiwgMHgxMDc4LAorCTB4NzUzZCwgMHgwMTdmLCAweDAwN2MsIDB4MGU3ZSwgMHgwZDdlLCAweDYwM2YsIDB4MDAwMCwgMHgyYzY4LAorCTB4MDE3ZSwgMHgyMDA5LCAweDAwMzUsIDB4MTA3OCwgMHg4ZWY1LCAweDAxN2YsIDB4MDBjMCwgMHg3NjZmLAorCTB4MDI3ZSwgMHg2MjI4LCAweDIyNjgsIDB4MDI3ZiwgMHgyMDcxLCAweGE4OGMsIDB4NmIxYywgMHhhMzg2LAorCTB4MDAwMywgMHgwMDQwLCAweDc2NzMsIDB4YTM4NiwgMHgwMDA2LCAweDAwNDAsIDB4NzY3NywgMHgxMDc4LAorCTB4NzUzZCwgMHgwMDc4LCAweDc2NzksIDB4MTA3OCwgMHg3NjdjLCAweDAwNzgsIDB4NzY3OSwgMHgxMDc4LAorCTB4NzcxZSwgMHgwZDdmLCAweDBlN2YsIDB4MDA3YywgMHgwZjdlLCAweDY4MTAsIDB4MjA3OCwgMHhhMTg2LAorCTB4MDAxNSwgMHgwMDQwLCAweDc3MDUsIDB4YTE4ZSwgMHgwMDE2LCAweDAwYzAsIDB4NzcxYywgMHg3MDBjLAorCTB4YTA4NCwgMHhmZjAwLCAweGEwODYsIDB4MTcwMCwgMHgwMGMwLCAweDc2ZTAsIDB4OGZmZiwgMHgwMDQwLAorCTB4NzcxYSwgMHg2ODA4LCAweGEwODYsIDB4ZmZmZiwgMHgwMGMwLCAweDc3MDksIDB4Nzg0YywgMHhhMDg0LAorCTB4MDA2MCwgMHhhMDg2LCAweDAwMjAsIDB4MDBjMCwgMHg3NmE3LCAweDc5N2MsIDB4NzgxMCwgMHhhMTA2LAorCTB4MDBjMCwgMHg3NzA5LCAweDc5ODAsIDB4NzgxNCwgMHhhMTA2LCAweDAwYzAsIDB4NzcwOSwgMHgxMDc4LAorCTB4OGJmNCwgMHg2ODMwLCAweDc4NTIsIDB4Nzg0YywgMHhjMGRjLCAweGMwZjQsIDB4YzBkNCwgMHg3ODRlLAorCTB4MDI3ZSwgMHhhMDBlLCAweDZhMTQsIDB4MjAwMSwgMHgwMDBhLCAweDEwNzgsIDB4NWE5OCwgMHg3ODU0LAorCTB4YTIwYSwgMHgwMDQ4LCAweDc2YmMsIDB4ODAxMSwgMHg3YTU2LCAweDgyZmYsIDB4MDI3ZiwgMHgwMGMwLAorCTB4NzZjOCwgMHgwYzdlLCAweDJkNjAsIDB4MTA3OCwgMHg4ODMyLCAweDBjN2YsIDB4MDA3OCwgMHg3NzFhLAorCTB4MGM3ZSwgMHgwZDdlLCAweDJmNjgsIDB4NjgzOCwgMHhkMGZjLCAweDAwYzAsIDB4NzZkMywgMHgxMDc4LAorCTB4NDI5MCwgMHgwMDc4LCAweDc2ZDUsIDB4MTA3OCwgMHg0MzZlLCAweDBkN2YsIDB4MGM3ZiwgMHgwMGMwLAorCTB4NzcwOSwgMHgwYzdlLCAweDJkNjAsIDB4MTA3OCwgMHg3NTNkLCAweDBjN2YsIDB4MDA3OCwgMHg3NzFhLAorCTB4NzAwOCwgMHhhMDg2LCAweDAwMGIsIDB4MDBjMCwgMHg3NmZhLCAweDYwMTgsIDB4MjAwYywgMHhjMWJjLAorCTB4MjEwMiwgMHgwYzdlLCAweDJkNjAsIDB4Nzg1MywgMHgwMDAzLCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLAorCTB4MDAwYiwgMHg2MDFmLCAweDAwMDIsIDB4MTA3OCwgMHg1YmY4LCAweDEwNzgsIDB4NjEwOSwgMHgwYzdmLAorCTB4MDA3OCwgMHg3NzFhLCAweDcwMGMsIDB4YTA4NiwgMHgyYTAwLCAweDAwYzAsIDB4NzcwOSwgMHgyMDAxLAorCTB4YTVhMiwgMHgyMDA0LCAweDY4M2UsIDB4MDA3OCwgMHg3NzFhLCAweDEwNzgsIDB4NzczOSwgMHgwMDc4LAorCTB4NzcxYywgMHg4ZmZmLCAweDEwNDAsIDB4MTMyOCwgMHgwYzdlLCAweDBkN2UsIDB4MmQ2MCwgMHgyZjY4LAorCTB4Njg0YiwgMHgwMDAzLCAweDEwNzgsIDB4ODcyNiwgMHgxMDc4LCAweDhiZjQsIDB4MTA3OCwgMHg4YzAxLAorCTB4MGQ3ZiwgMHgwYzdmLCAweDEwNzgsIDB4NzUzZCwgMHgwZjdmLCAweDAwN2MsIDB4YTE4NiwgMHgwMDE1LAorCTB4MDBjMCwgMHg3NzI4LCAweDIwMDEsIDB4YTVhMiwgMHgyMDA0LCAweDY4M2UsIDB4MDA3OCwgMHg3NzM2LAorCTB4YTE4ZSwgMHgwMDE2LCAweDAwYzAsIDB4NzczOCwgMHgwYzdlLCAweDJkMDAsIDB4MjA2MCwgMHgxMDc4LAorCTB4YTEzNCwgMHgxMDc4LCAweDVhNDEsIDB4MTA3OCwgMHg3NTNkLCAweDBjN2YsIDB4MTA3OCwgMHg3NTNkLAorCTB4MDA3YywgMHgwMjdlLCAweDAzN2UsIDB4MDQ3ZSwgMHg3MjI4LCAweDdjODAsIDB4N2I3YywgMHhkMmY0LAorCTB4MDA0MCwgMHg3NzQ4LCAweDIwMDEsIDB4YTVhMiwgMHgyMDA0LCAweDY4M2UsIDB4MDA3OCwgMHg3N2FjLAorCTB4MGM3ZSwgMHgyZDYwLCAweDEwNzgsIDB4ODc0YSwgMHgwYzdmLCAweDY4MDQsIDB4YTA4NiwgMHgwMDUwLAorCTB4MDBjMCwgMHg3NzYwLCAweDBjN2UsIDB4MmQwMCwgMHgyMDYwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDA1MCwgMHgxMDc4LCAweDViZjgsIDB4MTA3OCwgMHg2MTA5LCAweDBjN2YsIDB4MDA3OCwgMHg3N2FjLAorCTB4NjgwMCwgMHhhMDg2LCAweDAwMGYsIDB4MDA0MCwgMHg3NzgyLCAweDhmZmYsIDB4MTA0MCwgMHgxMzI4LAorCTB4NjgyNCwgMHhkMGRjLCAweDAwYzAsIDB4Nzc4MiwgMHg2ODAwLCAweGEwODYsIDB4MDAwNCwgMHgwMGMwLAorCTB4Nzc4NywgMHg3ODRjLCAweGQwYWMsIDB4MDA0MCwgMHg3Nzg3LCAweDc4NGMsIDB4YzBkYywgMHhjMGY0LAorCTB4Nzg0ZSwgMHg3ODUwLCAweGMwZjQsIDB4YzBmYywgMHg3ODUyLCAweDIwMDEsIDB4MDAwMSwgMHg2ODJlLAorCTB4MDA3OCwgMHg3N2E2LCAweDIwMDEsIDB4MDAwNywgMHg2ODJlLCAweDAwNzgsIDB4NzdhNiwgMHg3ODRjLAorCTB4ZDBiNCwgMHgwMGMwLCAweDc3OTQsIDB4ZDBhYywgMHgwMDQwLCAweDc3ODIsIDB4Nzg0YywgMHhkMGY0LAorCTB4MDBjMCwgMHg3NzgyLCAweDAwNzgsIDB4Nzc3NSwgMHhkMmVjLCAweDAwYzAsIDB4Nzc4MiwgMHg3MDI0LAorCTB4YTMwNiwgMHgwMGMwLCAweDc3OWYsIDB4NzAyMCwgMHhhNDA2LCAweDAwNDAsIDB4Nzc4MiwgMHg3MDIwLAorCTB4NjgzNiwgMHg3MDI0LCAweDY4M2EsIDB4MjAwMSwgMHgwMDA1LCAweDY4MmUsIDB4MTA3OCwgMHg4ZDJiLAorCTB4MTA3OCwgMHg2MTA5LCAweDAwNzgsIDB4NzdhZSwgMHgxMDc4LCAweDc1M2QsIDB4MDQ3ZiwgMHgwMzdmLAorCTB4MDI3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MGQ3ZSwgMHgwMjdlLCAweDYwMzQsIDB4MjA2OCwgMHg2YTFjLAorCTB4YTI4NiwgMHgwMDA3LCAweDAwNDAsIDB4NzgwNiwgMHhhMjg2LCAweDAwMDIsIDB4MDA0MCwgMHg3ODA2LAorCTB4YTI4NiwgMHgwMDAwLCAweDAwNDAsIDB4NzgwNiwgMHg2ODA4LCAweDYzMzgsIDB4YTMwNiwgMHgwMGMwLAorCTB4NzgwNiwgMHgyMDcxLCAweGE4OGMsIDB4YTE4NiwgMHgwMDE1LCAweDAwNDAsIDB4NzgwMCwgMHhhMThlLAorCTB4MDAxNiwgMHgwMGMwLCAweDc3ZTgsIDB4NjAzMCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDAxLAorCTB4MDBjMCwgMHg3N2U4LCAweDcwMGMsIDB4YTA4NiwgMHgyYTAwLCAweDAwYzAsIDB4NzdlOCwgMHg2MDM0LAorCTB4YTA4MCwgMHgwMDA5LCAweDIwMGMsIDB4YzFkZCwgMHhjMWY1LCAweDIxMDIsIDB4MDA3OCwgMHg3ODAwLAorCTB4MGM3ZSwgMHg2MDM0LCAweDIwNjAsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsIDB4OGE0NCwgMHgxMDQwLAorCTB4MTMyOCwgMHg2ODUzLCAweDAwMDMsIDB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDFmLAorCTB4MDAwMiwgMHgxMDc4LCAweDViZjgsIDB4MTA3OCwgMHg2MTA5LCAweDBjN2YsIDB4MDA3OCwgMHg3ODA2LAorCTB4NjAzNCwgMHgyMDY4LCAweDIwMDEsIDB4YTVhMiwgMHgyMDA0LCAweDY4M2UsIDB4MTA3OCwgMHg3NTNkLAorCTB4MDI3ZiwgMHgwZDdmLCAweDBlN2YsIDB4MDA3YywgMHgwZDdlLCAweDIwYTksIDB4MDAwZSwgMHgyZTk4LAorCTB4NjAxMCwgMHgyMGEwLCAweDUzYTMsIDB4YTFiNiwgMHgwMDE1LCAweDAwYzAsIDB4NzgyMCwgMHg2MDE4LAorCTB4MjA2OCwgMHg3MDM4LCAweDY4MGEsIDB4NzAzYywgMHg2ODBlLCAweDY4MDAsIDB4YzA4ZCwgMHg2ODAyLAorCTB4MGQ3ZiwgMHgwMDc4LCAweDc2MDgsIDB4MjEwMCwgMHhhMWIyLCAweDAwNDQsIDB4MTBjOCwgMHgxMzI4LAorCTB4YTFiMiwgMHgwMDQwLCAweDAwYzgsIDB4Nzg4OCwgMHgwMDc5LCAweDc4MmUsIDB4Nzg3YywgMHg3ODcwLAorCTB4Nzg3YywgMHg3ODdjLCAweDc4N2MsIDB4Nzg3YywgMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLAorCTB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLAorCTB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLAorCTB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLCAweDc4N2MsIDB4Nzg2ZSwgMHg3ODdjLAorCTB4Nzg3YywgMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsIDB4Nzg3YywgMHg3ODZlLAorCTB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLAorCTB4Nzg3YywgMHg3ODdjLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLAorCTB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsIDB4Nzg3YywgMHg3ODZlLCAweDc4NmUsIDB4MTA3OCwgMHgxMzI4LAorCTB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MTA3OCwgMHg1YzQ1LCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLAorCTB4MTA3OCwgMHg2MTA5LCAweDEyN2YsIDB4MDA3YywgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgxMDc4LAorCTB4NWM0NSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDYxMDksIDB4MTI3ZiwgMHgwMDdjLAorCTB4MjYwMCwgMHgwMDc5LCAweDc4OGIsIDB4Nzg4ZiwgMHg3ODhmLCAweDc4OGYsIDB4Nzg3YywgMHgxMDc4LAorCTB4MTMyOCwgMHg2MDA0LCAweGEwYjIsIDB4MDA0NCwgMHgxMGM4LCAweDEzMjgsIDB4YTFiNiwgMHgwMDEzLAorCTB4MDBjMCwgMHg3OGExLCAweGEwYjIsIDB4MDA0MCwgMHgwMGM4LCAweDc5ZmIsIDB4MjAwOCwgMHgwMDc5LAorCTB4Nzk0MSwgMHhhMWI2LCAweDAwMjcsIDB4MDBjMCwgMHg3OGZlLCAweDEwNzgsIDB4NjAxMCwgMHg2MDA0LAorCTB4MTA3OCwgMHg4YzI3LCAweDAwNDAsIDB4NzhiZSwgMHgxMDc4LCAweDhjM2IsIDB4MDA0MCwgMHg3OGY2LAorCTB4YTA4ZSwgMHgwMDIxLCAweDAwNDAsIDB4NzhmYSwgMHhhMDhlLCAweDAwMjIsIDB4MDA0MCwgMHg3OGY2LAorCTB4YTA4ZSwgMHgwMDNkLCAweDAwNDAsIDB4NzhmYSwgMHgwMDc4LCAweDc4ZjEsIDB4MTA3OCwgMHgyODM5LAorCTB4MjAwMSwgMHgwMDA3LCAweDEwNzgsIDB4NDQzZiwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDBjLAorCTB4MTA3OCwgMHg3YTA1LCAweGExODYsIDB4MDA3ZSwgMHgwMGMwLCAweDc4ZDMsIDB4MjAwMSwgMHhhMzMyLAorCTB4MjAxNCwgMHhjMjg1LCAweDIyMDIsIDB4MDE3ZSwgMHgwMjdlLCAweDAzN2UsIDB4MjExMCwgMHgyMDE5LAorCTB4MDAyOCwgMHgxMDc4LCAweDVkNTMsIDB4MDc3ZSwgMHgyMDM5LCAweDAwMDAsIDB4MTA3OCwgMHg1Yzc4LAorCTB4MGM3ZSwgMHg2MDE4LCAweGEwNjUsIDB4MDA0MCwgMHg3OGU3LCAweDEwNzgsIDB4NDcxYiwgMHgwYzdmLAorCTB4MmMwOCwgMHgxMDc4LCAweDljMzgsIDB4MDc3ZiwgMHgwMzdmLCAweDAyN2YsIDB4MDE3ZiwgMHgxMDc4LAorCTB4NDRiYywgMHgxMDc4LCAweDc1M2QsIDB4MTA3OCwgMHg2MTA5LCAweDAwN2MsIDB4MTA3OCwgMHg3YTA1LAorCTB4MDA3OCwgMHg3OGYxLCAweDEwNzgsIDB4N2EyOCwgMHgwMDc4LCAweDc4ZjEsIDB4YTE4NiwgMHgwMDE0LAorCTB4MDBjMCwgMHg3OGY1LCAweDEwNzgsIDB4NjAxMCwgMHgxMDc4LCAweDI4MTMsIDB4MTA3OCwgMHg4YzI3LAorCTB4MDBjMCwgMHg3OTFkLCAweDEwNzgsIDB4MjgzOSwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDBjLAorCTB4MTA3OCwgMHg3YTA1LCAweGExODYsIDB4MDA3ZSwgMHgwMGMwLCAweDc5MWIsIDB4MjAwMSwgMHhhMzMyLAorCTB4MjAwYywgMHhjMTg1LCAweDIxMDIsIDB4MDA3OCwgMHg3OGYxLCAweDEwNzgsIDB4OGMzYiwgMHgwMGMwLAorCTB4NzkyNSwgMHgxMDc4LCAweDdhMDUsIDB4MDA3OCwgMHg3OGYxLCAweDYwMDQsIDB4YTA4ZSwgMHgwMDMyLAorCTB4MDBjMCwgMHg3OTM2LCAweDBlN2UsIDB4MGY3ZSwgMHgyMDcxLCAweGEzODEsIDB4MjA3OSwgMHgwMDAwLAorCTB4MTA3OCwgMHgyYjU2LCAweDBmN2YsIDB4MGU3ZiwgMHgwMDc4LCAweDc4ZjEsIDB4NjAwNCwgMHhhMDhlLAorCTB4MDAyMSwgMHgwMDQwLCAweDc5MjEsIDB4YTA4ZSwgMHgwMDIyLCAweDEwNDAsIDB4N2EwNSwgMHgwMDc4LAorCTB4NzhmMSwgMHg3OTgzLCAweDc5ODUsIDB4Nzk4OSwgMHg3OThkLCAweDc5OTEsIDB4Nzk5NSwgMHg3OTgxLAorCTB4Nzk4MSwgMHg3OTgxLCAweDc5ODEsIDB4Nzk4MSwgMHg3OTgxLCAweDc5ODEsIDB4Nzk4MSwgMHg3OTgxLAorCTB4Nzk4MSwgMHg3OTgxLCAweDc5ODEsIDB4Nzk4MSwgMHg3OTgxLCAweDc5ODEsIDB4Nzk4MSwgMHg3OTgxLAorCTB4Nzk4MSwgMHg3OTgxLCAweDc5ODEsIDB4Nzk4MSwgMHg3OTgxLCAweDc5ODEsIDB4Nzk4MSwgMHg3OTk5LAorCTB4NzlhYiwgMHg3OTgxLCAweDc5YWQsIDB4NzlhYiwgMHg3OTgxLCAweDc5ODEsIDB4Nzk4MSwgMHg3OTgxLAorCTB4Nzk4MSwgMHg3OWFiLCAweDc5YWIsIDB4Nzk4MSwgMHg3OTgxLCAweDc5ODEsIDB4Nzk4MSwgMHg3OTgxLAorCTB4Nzk4MSwgMHg3OTgxLCAweDc5ODEsIDB4NzlkZSwgMHg3OWFiLCAweDc5ODEsIDB4NzlhNSwgMHg3OTgxLAorCTB4Nzk4MSwgMHg3OTgxLCAweDc5YTcsIDB4Nzk4MSwgMHg3OTgxLCAweDc5ODEsIDB4NzlhYiwgMHg3OTgxLAorCTB4Nzk4MSwgMHgxMDc4LCAweDEzMjgsIDB4MDA3OCwgMHg3OWFiLCAweDIwMDEsIDB4MDAwYiwgMHgwMDc4LAorCTB4NzliOCwgMHgyMDAxLCAweDAwMDMsIDB4MDA3OCwgMHg3OWI4LCAweDIwMDEsIDB4MDAwNSwgMHgwMDc4LAorCTB4NzliOCwgMHgyMDAxLCAweDAwMDEsIDB4MDA3OCwgMHg3OWI4LCAweDIwMDEsIDB4MDAwOSwgMHgwMDc4LAorCTB4NzliOCwgMHgxMDc4LCAweDYwMTAsIDB4NjAwMywgMHgwMDA1LCAweDIwMDEsIDB4YTVhMiwgMHgyMDA0LAorCTB4NjAzZSwgMHgxMDc4LCAweDYxMDksIDB4MDA3OCwgMHg3OWI3LCAweDAwNzgsIDB4NzlhYiwgMHgwMDc4LAorCTB4NzlhYiwgMHgxMDc4LCAweDQ0M2YsIDB4MDA3OCwgMHg3OWYwLCAweDEwNzgsIDB4NjAxMCwgMHg2MDAzLAorCTB4MDAwNCwgMHgyMDAxLCAweGE1YTAsIDB4MjAwNCwgMHg2MDE2LCAweDEwNzgsIDB4NjEwOSwgMHgwMDdjLAorCTB4MTA3OCwgMHg0NDNmLCAweDEwNzgsIDB4NjAxMCwgMHgyMDAxLCAweGE1YTIsIDB4MjAwNCwgMHg2MDNlLAorCTB4NjAwMywgMHgwMDAyLCAweDAzN2UsIDB4MjAxOSwgMHhhMzVjLCAweDIzMDQsIDB4YTA4NCwgMHhmZjAwLAorCTB4MDBjMCwgMHg3OWNmLCAweDIwMTksIDB4YTVhMCwgMHgyMzFjLCAweDAwNzgsIDB4NzlkOCwgMHg4MDA3LAorCTB4YTA5YSwgMHgwMDA0LCAweDAwNDgsIDB4NzljYSwgMHg4MDAzLCAweDgwMWIsIDB4ODMxYiwgMHhhMzE4LAorCTB4NjMxNiwgMHgwMzdmLCAweDEwNzgsIDB4NjEwOSwgMHgwMDc4LCAweDc5YjcsIDB4MGU3ZSwgMHgwZjdlLAorCTB4MjA3MSwgMHhhMzgxLCAweDIwNzksIDB4MDAwMCwgMHgxMDc4LCAweDJiNTYsIDB4MGY3ZiwgMHgwZTdmLAorCTB4MTA3OCwgMHg2MDEwLCAweDEwNzgsIDB4NzUzZCwgMHgxMDc4LCAweDYxMDksIDB4MDA3OCwgMHg3OWI3LAorCTB4MTA3OCwgMHg2MDEwLCAweDYwMDMsIDB4MDAwMiwgMHgyMDAxLCAweGE1YTAsIDB4MjAwNCwgMHg2MDE2LAorCTB4MTA3OCwgMHg2MTA5LCAweDAwN2MsIDB4MjYwMCwgMHgyMDA4LCAweDAwNzksIDB4NzlmZiwgMHg3YTAzLAorCTB4N2EwMywgMHg3YTAzLCAweDc5ZjAsIDB4MTA3OCwgMHgxMzI4LCAweDBlN2UsIDB4MTA3OCwgMHg4YTQ0LAorCTB4MDA0MCwgMHg3YTIxLCAweDYwMTAsIDB4MjA3MCwgMHg3MDM4LCAweGQwZmMsIDB4MDA0MCwgMHg3YTIxLAorCTB4NzAwNywgMHgwMDAwLCAweDAxN2UsIDB4NjAwNCwgMHhhMDhlLCAweDAwMjEsIDB4MDA0MCwgMHg3YTIzLAorCTB4YTA4ZSwgMHgwMDNkLCAweDAwNDAsIDB4N2EyMywgMHgwMTdmLCAweDcwMzcsIDB4MDEwMywgMHg3MDMzLAorCTB4MDEwMCwgMHgwZTdmLCAweDAwN2MsIDB4MDE3ZiwgMHgxMDc4LCAweDdhMjgsIDB4MDA3OCwgMHg3YTIxLAorCTB4MGU3ZSwgMHhhY2YwLCAweDAwMDQsIDB4MmU3NCwgMHg3MDAwLCAweDIwNzAsIDB4NzAzNywgMHgwMTAzLAorCTB4NzAyMywgMHg4MDAxLCAweDBlN2YsIDB4MDA3YywgMHgwZDdlLCAweDY2MTgsIDB4MjY2OCwgMHg2ODA0LAorCTB4YTA4NCwgMHgwMGZmLCAweDBkN2YsIDB4YTBiMiwgMHgwMDBjLCAweDEwYzgsIDB4MTMyOCwgMHg2NjA0LAorCTB4YTZiNiwgMHgwMDQzLCAweDAwYzAsIDB4N2E0OCwgMHgxMDc4LCAweDhlNmQsIDB4MDA3OCwgMHg3YWE3LAorCTB4NjYwNCwgMHhhNmI2LCAweDAwMzMsIDB4MDBjMCwgMHg3YTUxLCAweDEwNzgsIDB4OGUxMSwgMHgwMDc4LAorCTB4N2FhNywgMHg2NjA0LCAweGE2YjYsIDB4MDAyOCwgMHgwMGMwLCAweDdhNWEsIDB4MTA3OCwgMHg4YzZhLAorCTB4MDA3OCwgMHg3YWE3LCAweDY2MDQsIDB4YTZiNiwgMHgwMDI5LCAweDAwYzAsIDB4N2E2MywgMHgxMDc4LAorCTB4OGM4NCwgMHgwMDc4LCAweDdhYTcsIDB4NjYwNCwgMHhhNmI2LCAweDAwMWYsIDB4MDBjMCwgMHg3YTZjLAorCTB4MTA3OCwgMHg3NWVlLCAweDAwNzgsIDB4N2FhNywgMHg2NjA0LCAweGE2YjYsIDB4MDAwMCwgMHgwMGMwLAorCTB4N2E3NSwgMHgxMDc4LCAweDc4MGMsIDB4MDA3OCwgMHg3YWE3LCAweDY2MDQsIDB4YTZiNiwgMHgwMDIyLAorCTB4MDBjMCwgMHg3YTdlLCAweDEwNzgsIDB4NzYxNywgMHgwMDc4LCAweDdhYTcsIDB4NjYwNCwgMHhhNmI2LAorCTB4MDAzNSwgMHgwMGMwLCAweDdhODcsIDB4MTA3OCwgMHg3NjUzLCAweDAwNzgsIDB4N2FhNywgMHg2NjA0LAorCTB4YTZiNiwgMHgwMDM5LCAweDAwYzAsIDB4N2E5MCwgMHgxMDc4LCAweDc3YjIsIDB4MDA3OCwgMHg3YWE3LAorCTB4NjYwNCwgMHhhNmI2LCAweDAwM2QsIDB4MDBjMCwgMHg3YTk5LCAweDEwNzgsIDB4NzYzMywgMHgwMDc4LAorCTB4N2FhNywgMHhhMWI2LCAweDAwMTUsIDB4MDBjMCwgMHg3YWExLCAweDEwNzksIDB4N2FhYywgMHgwMDc4LAorCTB4N2FhNywgMHhhMWI2LCAweDAwMTYsIDB4MDBjMCwgMHg3YWE4LCAweDEwNzksIDB4N2JmZCwgMHgwMDdjLAorCTB4MTA3OCwgMHg3NTgzLCAweDAwNzgsIDB4N2FhNywgMHg3YWQwLCAweDdhZDMsIDB4N2FkMCwgMHg3YjFlLAorCTB4N2FkMCwgMHg3YjkxLCAweDdjMDksIDB4N2FkMCwgMHg3YWQwLCAweDdiZDUsIDB4N2FkMCwgMHg3YmViLAorCTB4YTFiNiwgMHgwMDQ4LCAweDAwNDAsIDB4N2FjNCwgMHgyMGUxLCAweDAwMDUsIDB4M2QxOCwgMHgzZTIwLAorCTB4MmMxMCwgMHgxMDc4LCAweDE1ZWMsIDB4MDA3YywgMHgwZTdlLCAweGFjZjAsIDB4MDAwNCwgMHgyZTc0LAorCTB4NzAwMCwgMHgyMDcwLCAweDcwMzcsIDB4MDEwMywgMHgwZTdmLCAweDEwNzgsIDB4NzUzZCwgMHgwMDdjLAorCTB4MDAwNSwgMHgwMDA1LCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGEzMDAsIDB4NzA3YywgMHhhMDg2LAorCTB4MDA3NCwgMHgwMGMwLCAweDdiMDcsIDB4MTA3OCwgMHg5YzBjLCAweDAwYzAsIDB4N2FmOSwgMHgwZDdlLAorCTB4NjAxOCwgMHgyMDY4LCAweDcwMzAsIDB4ZDA4YywgMHgwMDQwLCAweDdhZWMsIDB4NjgwMCwgMHhkMGJjLAorCTB4MDA0MCwgMHg3YWVjLCAweGMwYzUsIDB4NjgwMiwgMHgxMDc4LCAweDdiMGIsIDB4MGQ3ZiwgMHgyMDAxLAorCTB4MDAwNiwgMHgxMDc4LCAweDQ0M2YsIDB4MTA3OCwgMHgyODM5LCAweDEwNzgsIDB4NzUzZCwgMHgwMDc4LAorCTB4N2IwOSwgMHgyMDAxLCAweDAwMGEsIDB4MTA3OCwgMHg0NDNmLCAweDEwNzgsIDB4MjgzOSwgMHg2MDAzLAorCTB4MDAwMSwgMHg2MDA3LCAweDAwMDEsIDB4MTA3OCwgMHg1YzQ1LCAweDAwNzgsIDB4N2IwOSwgMHgxMDc4LAorCTB4N2I4MSwgMHgwZTdmLCAweDAwN2MsIDB4NjgwMCwgMHhkMDg0LCAweDAwNDAsIDB4N2IxZCwgMHgyMDAxLAorCTB4MDAwMCwgMHgxMDc4LCAweDQ0MmIsIDB4MjA2OSwgMHhhMzUxLCAweDY4MDQsIDB4ZDBhNCwgMHgwMDQwLAorCTB4N2IxZCwgMHgyMDAxLCAweDAwMDYsIDB4MTA3OCwgMHg0NDcyLCAweDAwN2MsIDB4MGQ3ZSwgMHgyMDExLAorCTB4YTMxZiwgMHgyMjA0LCAweGEwODYsIDB4MDA3NCwgMHgwMGMwLCAweDdiN2QsIDB4NjAxOCwgMHgyMDY4LAorCTB4NmFhMCwgMHhhMjg2LCAweDAwN2UsIDB4MDBjMCwgMHg3YjMxLCAweDEwNzgsIDB4N2QxNywgMHgwMDc4LAorCTB4N2I3ZiwgMHgxMDc4LCAweDdkMGQsIDB4NjAxOCwgMHgyMDY4LCAweGEwODAsIDB4MDAyOCwgMHgyMDE0LAorCTB4YTI4NiwgMHgwMDgwLCAweDAwYzAsIDB4N2I1NSwgMHg2ODEzLCAweDAwZmYsIDB4NjgxNywgMHhmZmZjLAorCTB4NjAxMCwgMHhhMDA1LCAweDAwNDAsIDB4N2I0YiwgMHgyMDY4LCAweDY4MDcsIDB4MDAwMCwgMHg2ODM3LAorCTB4MDEwMywgMHg2ODMzLCAweDAyMDAsIDB4MjAwMSwgMHgwMDA2LCAweDEwNzgsIDB4NDQzZiwgMHgxMDc4LAorCTB4MjgzOSwgMHgxMDc4LCAweDc1M2QsIDB4MDA3OCwgMHg3YjdmLCAweDBlN2UsIDB4MjA3MSwgMHhhMzMyLAorCTB4MmUwNCwgMHhkMDljLCAweDAwNDAsIDB4N2I3MCwgMHgyMDcxLCAweGE4ODAsIDB4NzEwOCwgMHg3MjBjLAorCTB4YTE4YywgMHgwMGZmLCAweDAwYzAsIDB4N2I2OCwgMHhhMjg0LCAweGZmMDAsIDB4MDA0MCwgMHg3YjcwLAorCTB4NjAxOCwgMHgyMDcwLCAweDcwYTAsIDB4ZDBiYywgMHgwMGMwLCAweDdiNzAsIDB4NzExMiwgMHg3MjE2LAorCTB4MGU3ZiwgMHgyMDAxLCAweDAwMDQsIDB4MTA3OCwgMHg0NDNmLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDAwMywgMHgxMDc4LCAweDVjNDUsIDB4MDA3OCwgMHg3YjdmLCAweDEwNzgsIDB4N2I4MSwgMHgwZDdmLAorCTB4MDA3YywgMHgyMDAxLCAweGEzMDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MDA0MCwgMHg3YjhjLAorCTB4MjAwMSwgMHgwMDA3LCAweDEwNzgsIDB4NDQzZiwgMHgxMDc4LCAweDI4MzksIDB4MTA3OCwgMHg3NTNkLAorCTB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YTMwMCwgMHg3MDdjLCAweGEwODYsIDB4MDAxNCwgMHgwMGMwLAorCTB4N2JjZiwgMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweDdiYTQsIDB4NjAxMCwgMHhhMDA1LAorCTB4MDBjMCwgMHg3YmE0LCAweDEwNzgsIDB4MzVmNywgMHgwZDdlLCAweDYwMTgsIDB4MjA2OCwgMHgxMDc4LAorCTB4NDU3ZCwgMHgxMDc4LCAweDdiMGIsIDB4MGQ3ZiwgMHgxMDc4LCAweDdkYmEsIDB4MDBjMCwgMHg3YmNmLAorCTB4MGQ3ZSwgMHg2MDE4LCAweDIwNjgsIDB4Njg5MCwgMHgwZDdmLCAweGEwMDUsIDB4MDA0MCwgMHg3YmNmLAorCTB4MjAwMSwgMHgwMDA2LCAweDEwNzgsIDB4NDQzZiwgMHgwZTdlLCAweDYwMTAsIDB4YTAwNSwgMHgwMDQwLAorCTB4N2JjOCwgMHgyMDcwLCAweDcwMDcsIDB4MDAwMCwgMHg3MDM3LCAweDAxMDMsIDB4NzAzMywgMHgwMjAwLAorCTB4MGU3ZiwgMHgxMDc4LCAweDI4MzksIDB4MTA3OCwgMHg3NTNkLCAweDAwNzgsIDB4N2JkMywgMHgxMDc4LAorCTB4N2EwNSwgMHgxMDc4LCAweDdiODEsIDB4MGU3ZiwgMHgwMDdjLCAweDIwMTEsIDB4YTMxZiwgMHgyMjA0LAorCTB4YTA4NiwgMHgwMDE0LCAweDAwYzAsIDB4N2JlOCwgMHgyMDAxLCAweDAwMDIsIDB4MTA3OCwgMHg0NDNmLAorCTB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHgxMDc4LCAweDVjNDUsIDB4MDA3OCwgMHg3YmVhLAorCTB4MTA3OCwgMHg3YjgxLCAweDAwN2MsIDB4MjAxMSwgMHhhMzFmLCAweDIyMDQsIDB4YTA4NiwgMHgwMDA0LAorCTB4MDBjMCwgMHg3YmZhLCAweDIwMDEsIDB4MDAwNywgMHgxMDc4LCAweDQ0M2YsIDB4MTA3OCwgMHg3NTNkLAorCTB4MDA3OCwgMHg3YmZjLCAweDEwNzgsIDB4N2I4MSwgMHgwMDdjLCAweDdhZDAsIDB4N2MxMSwgMHg3YWQwLAorCTB4N2M0ZSwgMHg3YWQwLCAweDdjYzAsIDB4N2MwOSwgMHg3YWQwLCAweDdhZDAsIDB4N2NkNSwgMHg3YWQwLAorCTB4N2NlOCwgMHg2NjA0LCAweGE2YjYsIDB4MDAxZSwgMHgwMGMwLCAweDdjMTAsIDB4MTA3OCwgMHg3NTNkLAorCTB4MDA3YywgMHgwZDdlLCAweDBjN2UsIDB4MTA3OCwgMHg3Y2ZiLCAweDAwYzAsIDB4N2MyNywgMHgyMDAxLAorCTB4MDAwMCwgMHgxMDc4LCAweDQ0MmIsIDB4MjAwMSwgMHgwMDAyLCAweDEwNzgsIDB4NDQzZiwgMHg2MDAzLAorCTB4MDAwMSwgMHg2MDA3LCAweDAwMDIsIDB4MTA3OCwgMHg1YzQ1LCAweDAwNzgsIDB4N2M0YiwgMHgyMDA5LAorCTB4YTg4ZSwgMHgyMTA0LCAweGEwODYsIDB4MDAwOSwgMHgwMGMwLCAweDdjM2MsIDB4NjAxOCwgMHgyMDY4LAorCTB4Njg0MCwgMHhhMDg0LCAweDAwZmYsIDB4YTAwNSwgMHgwMDQwLCAweDdjNDksIDB4ODAwMSwgMHg2ODQyLAorCTB4NjAxNywgMHgwMDBhLCAweDAwNzgsIDB4N2M0YiwgMHgyMDA5LCAweGE4OGYsIDB4MjEwNCwgMHhhMDg0LAorCTB4ZmYwMCwgMHhhMDg2LCAweDE5MDAsIDB4MDBjMCwgMHg3YzQ5LCAweDEwNzgsIDB4NzUzZCwgMHgwMDc4LAorCTB4N2M0YiwgMHgxMDc4LCAweDdiODEsIDB4MGM3ZiwgMHgwZDdmLCAweDAwN2MsIDB4MTA3OCwgMHg3ZDBhLAorCTB4MDBjMCwgMHg3YzYyLCAweDIwMDEsIDB4MDAwMCwgMHgxMDc4LCAweDQ0MmIsIDB4MjAwMSwgMHgwMDAyLAorCTB4MTA3OCwgMHg0NDNmLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDIsIDB4MTA3OCwgMHg1YzQ1LAorCTB4MDA3OCwgMHg3YzhlLCAweDEwNzgsIDB4N2EwNSwgMHgyMDA5LCAweGE4OGUsIDB4MjEzNCwgMHhhNmI0LAorCTB4MDBmZiwgMHhhNjg2LCAweDAwMDUsIDB4MDA0MCwgMHg3YzhmLCAweGE2ODYsIDB4MDAwYiwgMHgwMDQwLAorCTB4N2M4YywgMHgyMDA5LCAweGE4OGYsIDB4MjEwNCwgMHhhMDg0LCAweGZmMDAsIDB4MDBjMCwgMHg3YzdjLAorCTB4YTY4NiwgMHgwMDA5LCAweDAwNDAsIDB4N2M4ZiwgMHhhMDg2LCAweDE5MDAsIDB4MDBjMCwgMHg3YzhjLAorCTB4YTY4NiwgMHgwMDA5LCAweDAwNDAsIDB4N2M4ZiwgMHgyMDAxLCAweDAwMDQsIDB4MTA3OCwgMHg0NDNmLAorCTB4MTA3OCwgMHg3NTNkLCAweDAwNzgsIDB4N2M4ZSwgMHgxMDc4LCAweDdiODEsIDB4MDA3YywgMHgwZDdlLAorCTB4NjAxMCwgMHgyMDY4LCAweDEwNzgsIDB4OGE0NCwgMHgwMDQwLCAweDdjOWQsIDB4NjgzOCwgMHhkMGZjLAorCTB4MDA0MCwgMHg3YzlkLCAweDBkN2YsIDB4MDA3OCwgMHg3YzhjLCAweDYwMTgsIDB4MjA2OCwgMHg2ODQwLAorCTB4YTA4NCwgMHgwMGZmLCAweGEwMDUsIDB4MDA0MCwgMHg3Y2FlLCAweDgwMDEsIDB4Njg0MiwgMHg2MDE3LAorCTB4MDAwYSwgMHg2MDA3LCAweDAwMTYsIDB4MGQ3ZiwgMHgwMDc4LCAweDdjOGUsIDB4NjhhMCwgMHhhMDg2LAorCTB4MDA3ZSwgMHgwMGMwLCAweDdjYmIsIDB4MGU3ZSwgMHgyMDcxLCAweGEzMDAsIDB4MTA3OCwgMHg0MWY1LAorCTB4MGU3ZiwgMHgwMDc4LCAweDdjYmQsIDB4MTA3OCwgMHgyODEzLCAweDBkN2YsIDB4MDA3OCwgMHg3YzhjLAorCTB4MTA3OCwgMHg3ZDBhLCAweDAwYzAsIDB4N2NkMCwgMHgyMDAxLCAweDAwMDQsIDB4MTA3OCwgMHg0NDNmLAorCTB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMywgMHgxMDc4LCAweDVjNDUsIDB4MDA3OCwgMHg3Y2Q0LAorCTB4MTA3OCwgMHg3YTA1LCAweDEwNzgsIDB4N2I4MSwgMHgwMDdjLCAweDEwNzgsIDB4N2QwYSwgMHgwMGMwLAorCTB4N2NlNSwgMHgyMDAxLCAweDAwMDgsIDB4MTA3OCwgMHg0NDNmLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDAwNSwgMHgxMDc4LCAweDVjNDUsIDB4MDA3OCwgMHg3Y2U3LCAweDEwNzgsIDB4N2I4MSwgMHgwMDdjLAorCTB4MTA3OCwgMHg3ZDBhLCAweDAwYzAsIDB4N2NmOCwgMHgyMDAxLCAweDAwMGEsIDB4MTA3OCwgMHg0NDNmLAorCTB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHgxMDc4LCAweDVjNDUsIDB4MDA3OCwgMHg3Y2ZhLAorCTB4MTA3OCwgMHg3YjgxLCAweDAwN2MsIDB4MjAwOSwgMHhhODhlLCAweDIxMDQsIDB4YTA4NiwgMHgwMDAzLAorCTB4MDBjMCwgMHg3ZDA5LCAweDIwMDksIDB4YTg4ZiwgMHgyMTA0LCAweGEwODQsIDB4ZmYwMCwgMHhhMDg2LAorCTB4MmEwMCwgMHgwMDdjLCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweDBjN2UsIDB4MDE3ZSwgMHhhYzg4LAorCTB4MDAwNiwgMHgyMTY0LCAweDEwNzgsIDB4NDUxMywgMHgwMTdmLCAweDBjN2YsIDB4MDA3YywgMHgwZjdlLAorCTB4MGU3ZSwgMHgwZDdlLCAweDAzN2UsIDB4MDE3ZSwgMHg2MDE4LCAweDIwNjgsIDB4MjA3MSwgMHhhMzMyLAorCTB4MmUwNCwgMHhhMDg1LCAweDAwMDMsIDB4MjA3MiwgMHgxMDc4LCAweDdkOGIsIDB4MDA0MCwgMHg3ZDUwLAorCTB4MjAwMSwgMHhhMzUyLCAweDIwMDQsIDB4ZDBhNCwgMHgwMDQwLCAweDdkMzksIDB4YTAwNiwgMHgyMDIwLAorCTB4MjAwOSwgMHgwMDJhLCAweDEwNzgsIDB4OWVjMCwgMHgyMDAxLCAweGEzMGMsIDB4MjAwYywgMHhjMTk1LAorCTB4MjEwMiwgMHgyMDE5LCAweDAwMmEsIDB4MjAwOSwgMHgwMDAxLCAweDEwNzgsIDB4MjdlMiwgMHgyMDcxLAorCTB4YTMwMCwgMHgxMDc4LCAweDI2MGQsIDB4MGM3ZSwgMHgxNTdlLCAweDIwYTksIDB4MDA4MSwgMHgyMDA5LAorCTB4MDA3ZiwgMHgxMDc4LCAweDI5MjEsIDB4ODEwOCwgMHgwMGYwLCAweDdkNDksIDB4MTU3ZiwgMHgwYzdmLAorCTB4MTA3OCwgMHg3ZDBkLCAweDY4MTMsIDB4MDBmZiwgMHg2ODE3LCAweGZmZmUsIDB4MjA3MSwgMHhhODgwLAorCTB4MjA3OSwgMHgwMTAwLCAweDJlMDQsIDB4YTA4NCwgMHgwMGZmLCAweDIwNjksIDB4YTMxYSwgMHgyMDZhLAorCTB4NzhlNiwgMHgwMDdlLCAweDhlNzAsIDB4MmUwNCwgMHgyMDY5LCAweGEzMWIsIDB4MjA2YSwgMHg3OGVhLAorCTB4YTA4NCwgMHhmZjAwLCAweDAxN2YsIDB4YTEwNSwgMHgyMDA5LCAweGEzMjUsIDB4MjAwYSwgMHgyMDY5LAorCTB4YTg4ZSwgMHgyMDcxLCAweGE1OWMsIDB4NjgxMCwgMHgyMDcyLCAweDY4MTQsIDB4NzAwNiwgMHg2ODE4LAorCTB4NzAwYSwgMHg2ODFjLCAweDcwMGUsIDB4MTA3OCwgMHg4ZGE5LCAweDIwMDEsIDB4MDAwNiwgMHgxMDc4LAorCTB4NDQzZiwgMHgxMDc4LCAweDI4MzksIDB4MTA3OCwgMHg3NTNkLCAweDAxN2YsIDB4MDM3ZiwgMHgwZDdmLAorCTB4MGU3ZiwgMHgwZjdmLCAweDAwN2MsIDB4MDI3ZSwgMHgwMzdlLCAweDBlN2UsIDB4MTU3ZSwgMHgyMDE5LAorCTB4YTMyNSwgMHgyMzFjLCAweDgzZmYsIDB4MDA0MCwgMHg3ZGI1LCAweDIwNzEsIDB4YTg4MCwgMHgyZTE0LAorCTB4YTI5NCwgMHgwMGZmLCAweDcwMDQsIDB4YTA4NCwgMHhmZjAwLCAweGEyMDUsIDB4YTMwNiwgMHgwMGMwLAorCTB4N2RiNSwgMHgyMDExLCAweGE4OTYsIDB4YWQ5OCwgMHgwMDBhLCAweDIwYTksIDB4MDAwNCwgMHgxMDc4LAorCTB4N2U1NSwgMHgwMGMwLCAweDdkYjUsIDB4MjAxMSwgMHhhODlhLCAweGFkOTgsIDB4MDAwNiwgMHgyMGE5LAorCTB4MDAwNCwgMHgxMDc4LCAweDdlNTUsIDB4MDBjMCwgMHg3ZGI1LCAweDE1N2YsIDB4MGU3ZiwgMHgwMzdmLAorCTB4MDI3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhODhjLCAweDcwMDQsIDB4YTA4NiwgMHgwMDE0LAorCTB4MDBjMCwgMHg3ZGRkLCAweDcwMDgsIDB4YTA4NiwgMHgwODAwLCAweDAwYzAsIDB4N2RkZCwgMHg3MDBjLAorCTB4ZDBlYywgMHgwMDQwLCAweDdkZGIsIDB4YTA4NCwgMHgwZjAwLCAweGEwODYsIDB4MDEwMCwgMHgwMGMwLAorCTB4N2RkYiwgMHg3MDI0LCAweGQwYTQsIDB4MDBjMCwgMHg3ZGQ4LCAweGQwYWMsIDB4MDA0MCwgMHg3ZGRiLAorCTB4YTAwNiwgMHgwMDc4LCAweDdkZGQsIDB4YTA4NSwgMHgwMDAxLCAweDBlN2YsIDB4MDA3YywgMHgwZTdlLAorCTB4MGQ3ZSwgMHgwYzdlLCAweDA3N2UsIDB4MDU3ZSwgMHgwNDdlLCAweDAyN2UsIDB4MDA3ZSwgMHgxMjdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDIwMjksIDB4YTViNCwgMHgyNTJjLCAweDIwMjEsIDB4YTViYSwgMHgyNDI0LAorCTB4MjA2MSwgMHhhYTAwLCAweDIwNzEsIDB4YTMwMCwgMHg3MjQ0LCAweDcwNjAsIDB4YTIwMiwgMHgwMGM4LAorCTB4N2U0MywgMHgxMDc4LCAweDllZTUsIDB4MDA0MCwgMHg3ZTNiLCAweDY3MWMsIDB4YTc4NiwgMHgwMDAxLAorCTB4MDA0MCwgMHg3ZTNiLCAweGE3ODYsIDB4MDAwNywgMHgwMDQwLCAweDdlM2IsIDB4MjUwMCwgMHhhYzA2LAorCTB4MDA0MCwgMHg3ZTNiLCAweDI0MDAsIDB4YWMwNiwgMHgwMDQwLCAweDdlM2IsIDB4MGM3ZSwgMHg2MDAwLAorCTB4YTA4NiwgMHgwMDA0LCAweDAwYzAsIDB4N2UxNiwgMHgxMDc4LCAweDE3NDksIDB4YTc4NiwgMHgwMDA4LAorCTB4MDBjMCwgMHg3ZTI1LCAweDEwNzgsIDB4OGMzYiwgMHgwMGMwLCAweDdlMjUsIDB4MGM3ZiwgMHgxMDc4LAorCTB4N2EwNSwgMHgxMDc4LCAweDhjMDEsIDB4MDA3OCwgMHg3ZTNiLCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LAorCTB4OGE0NCwgMHgwMDQwLCAweDdlMzgsIDB4YTc4NiwgMHgwMDAzLCAweDAwYzAsIDB4N2U0ZCwgMHg2ODM3LAorCTB4MDEwMywgMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgxMDc4LCAweDQ5ODIsIDB4MTA3OCwgMHg4YmY0LAorCTB4MTA3OCwgMHg4YzAxLCAweDBjN2YsIDB4YWNlMCwgMHgwMDEwLCAweDcwNTQsIDB4YWMwMiwgMHgwMGM4LAorCTB4N2U0MywgMHgwMDc4LCAweDdkZjQsIDB4MTI3ZiwgMHgwMDdmLCAweDAyN2YsIDB4MDQ3ZiwgMHgwNTdmLAorCTB4MDc3ZiwgMHgwYzdmLCAweDBkN2YsIDB4MGU3ZiwgMHgwMDdjLCAweGE3ODYsIDB4MDAwNiwgMHgwMGMwLAorCTB4N2UyZiwgMHgxMDc4LCAweDllNzAsIDB4MDA3OCwgMHg3ZTM4LCAweDIyMGMsIDB4MjMwNCwgMHhhMTA2LAorCTB4MDBjMCwgMHg3ZTYwLCAweDgyMTAsIDB4ODMxOCwgMHgwMGYwLCAweDdlNTUsIDB4YTAwNiwgMHgwMDdjLAorCTB4MjMwNCwgMHhhMTAyLCAweDAwNDgsIDB4N2U2OCwgMHgyMDAxLCAweDAwMDEsIDB4MDA3OCwgMHg3ZTZhLAorCTB4MjAwMSwgMHgwMDAwLCAweGExOGQsIDB4MDAwMSwgMHgwMDdjLCAweDYwMDQsIDB4YTA4YSwgMHgwMDQ0LAorCTB4MTBjOCwgMHgxMzI4LCAweDEwNzgsIDB4OGMyNywgMHgwMDQwLCAweDdlN2MsIDB4MTA3OCwgMHg4YzNiLAorCTB4MDA0MCwgMHg3ZTg5LCAweDAwNzgsIDB4N2U4MiwgMHgxMDc4LCAweDI4MzksIDB4MTA3OCwgMHg4YzNiLAorCTB4MDA0MCwgMHg3ZTg5LCAweDEwNzgsIDB4NjAxMCwgMHgxMDc4LCAweDc1M2QsIDB4MTA3OCwgMHg2MTA5LAorCTB4MDA3YywgMHgxMDc4LCAweDdhMDUsIDB4MDA3OCwgMHg3ZTgyLCAweGExODIsIDB4MDA0MCwgMHgwMDc5LAorCTB4N2U5MSwgMHg3ZWE0LCAweDdlYTQsIDB4N2VhNCwgMHg3ZWE0LCAweDdlYTQsIDB4N2VhNCwgMHg3ZWE0LAorCTB4N2VhNCwgMHg3ZWE0LCAweDdlYTQsIDB4N2VhNCwgMHg3ZWE2LCAweDdlYTYsIDB4N2VhNiwgMHg3ZWE2LAorCTB4N2VhNCwgMHg3ZWE0LCAweDdlYTQsIDB4N2VhNiwgMHgxMDc4LCAweDEzMjgsIDB4NjAwYiwgMHhmZmZmLAorCTB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MTA3OCwgMHg1YmY4LCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLAorCTB4MTA3OCwgMHg2MTA5LCAweDEyN2YsIDB4MDA3YywgMHhhMTg2LCAweDAwMTMsIDB4MDBjMCwgMHg3ZWJkLAorCTB4NjAwNCwgMHhhMDgyLCAweDAwNDAsIDB4MDA3OSwgMHg3ZjQ4LCAweGExODYsIDB4MDAyNywgMHgwMGMwLAorCTB4N2VkZiwgMHgxMDc4LCAweDYwMTAsIDB4MTA3OCwgMHgyODEzLCAweDBkN2UsIDB4NjExMCwgMHgyMTY4LAorCTB4MTA3OCwgMHg4YTQ0LCAweDAwNDAsIDB4N2VkOSwgMHg2ODM3LCAweDAxMDMsIDB4Njg0YiwgMHgwMDI5LAorCTB4Njg0NywgMHgwMDAwLCAweDY5NGMsIDB4YzFjNSwgMHg2OTRlLCAweDEwNzgsIDB4NDk4MiwgMHgxMDc4LAorCTB4OGJmNCwgMHgwZDdmLCAweDEwNzgsIDB4NzUzZCwgMHgxMDc4LCAweDYxMDksIDB4MDA3YywgMHhhMTg2LAorCTB4MDAxNCwgMHgwMGMwLCAweDdlZTgsIDB4NjAwNCwgMHhhMDgyLCAweDAwNDAsIDB4MDA3OSwgMHg3ZjEwLAorCTB4YTE4NiwgMHgwMDQ2LCAweDAwNDAsIDB4N2VmNCwgMHhhMTg2LCAweDAwNDUsIDB4MDA0MCwgMHg3ZWY0LAorCTB4YTE4NiwgMHgwMDQ3LCAweDEwYzAsIDB4MTMyOCwgMHgyMDAxLCAweDAxMDksIDB4MjAwNCwgMHhkMDg0LAorCTB4MDA0MCwgMHg3ZjBkLCAweDEyN2UsIDB4MjA5MSwgMHgyMjAwLCAweDAwN2UsIDB4MDE3ZSwgMHgwMjdlLAorCTB4MTA3OCwgMHg1YWQyLCAweDAyN2YsIDB4MDE3ZiwgMHgwMDdmLCAweDEyN2YsIDB4NjAwMCwgMHhhMDg2LAorCTB4MDAwMiwgMHgwMGMwLCAweDdmMGQsIDB4MDA3OCwgMHg3ZjgxLCAweDEwNzgsIDB4NzU4MywgMHgwMDdjLAorCTB4N2YyNSwgMHg3ZjIzLCAweDdmMjMsIDB4N2YyMywgMHg3ZjIzLCAweDdmMjMsIDB4N2YyMywgMHg3ZjIzLAorCTB4N2YyMywgMHg3ZjIzLCAweDdmMjMsIDB4N2Y0MSwgMHg3ZjQxLCAweDdmNDEsIDB4N2Y0MSwgMHg3ZjIzLAorCTB4N2Y0MSwgMHg3ZjIzLCAweDdmNDEsIDB4MTA3OCwgMHgxMzI4LCAweDEwNzgsIDB4NjAxMCwgMHgwZDdlLAorCTB4NjExMCwgMHgyMTY4LCAweDEwNzgsIDB4OGE0NCwgMHgwMDQwLCAweDdmM2IsIDB4NjgzNywgMHgwMTAzLAorCTB4Njg0YiwgMHgwMDA2LCAweDY4NDcsIDB4MDAwMCwgMHg2ODUwLCAweGMwZWMsIDB4Njg1MiwgMHgxMDc4LAorCTB4NDk4MiwgMHgxMDc4LCAweDhiZjQsIDB4MGQ3ZiwgMHgxMDc4LCAweDc1M2QsIDB4MTA3OCwgMHg2MTA5LAorCTB4MDA3YywgMHgxMDc4LCAweDYwMTAsIDB4MTA3OCwgMHg3NTNkLCAweDEwNzgsIDB4NjEwOSwgMHgwMDdjLAorCTB4N2Y1ZCwgMHg3ZjViLCAweDdmNWIsIDB4N2Y1YiwgMHg3ZjViLCAweDdmNWIsIDB4N2Y1YiwgMHg3ZjViLAorCTB4N2Y1YiwgMHg3ZjViLCAweDdmNWIsIDB4N2Y2ZiwgMHg3ZjZmLCAweDdmNmYsIDB4N2Y2ZiwgMHg3ZjViLAorCTB4N2Y3YSwgMHg3ZjViLCAweDdmNmYsIDB4MTA3OCwgMHgxMzI4LCAweDEwNzgsIDB4NjAxMCwgMHgyMDAxLAorCTB4YTVhMiwgMHgyMDA0LCAweDYwM2UsIDB4NjAwMywgMHgwMDAyLCAweDEwNzgsIDB4NjEwOSwgMHg2MDEwLAorCTB4YTA4OCwgMHgwMDEzLCAweDIxMDQsIDB4YTA4NSwgMHgwNDAwLCAweDIwMGEsIDB4MDA3YywgMHgxMDc4LAorCTB4NjAxMCwgMHgyMDAxLCAweGE1YTIsIDB4MjAwNCwgMHg2MDNlLCAweDYwMDMsIDB4MDAwZiwgMHgxMDc4LAorCTB4NjEwOSwgMHgwMDdjLCAweDEwNzgsIDB4NjAxMCwgMHgxMDc4LCAweDc1M2QsIDB4MTA3OCwgMHg2MTA5LAorCTB4MDA3YywgMHhhMTgyLCAweDAwNDAsIDB4MDA3OSwgMHg3Zjg1LCAweDdmOTgsIDB4N2Y5OCwgMHg3Zjk4LAorCTB4N2Y5OCwgMHg3Zjk4LCAweDdmOWEsIDB4ODA5NSwgMHg4MGI3LCAweDdmOTgsIDB4N2Y5OCwgMHg3Zjk4LAorCTB4N2Y5OCwgMHg3Zjk4LCAweDdmOTgsIDB4N2Y5OCwgMHg3Zjk4LCAweDdmOTgsIDB4N2Y5OCwgMHg3Zjk4LAorCTB4MTA3OCwgMHgxMzI4LCAweDBlN2UsIDB4MGQ3ZSwgMHg2MDNmLCAweDAwMDAsIDB4MjA3MSwgMHhhODgwLAorCTB4NzEyNCwgMHg2MTBhLCAweDIwNzEsIDB4YTg4YywgMHg2MTEwLCAweDIxNjgsIDB4NzYxNCwgMHhhNmI0LAorCTB4MGZmZiwgMHg4NmZmLCAweDAwNDAsIDB4ODA1OCwgMHhhNjhjLCAweDBjMDAsIDB4MDA0MCwgMHg3ZmQxLAorCTB4MGY3ZSwgMHgyYzc4LCAweDEwNzgsIDB4NDg5MywgMHgwZjdmLCAweDAwNDAsIDB4N2ZjZCwgMHg2ODRjLAorCTB4ZDBhYywgMHgwMDQwLCAweDdmY2QsIDB4NjAyNCwgMHhkMGRjLCAweDAwYzAsIDB4N2ZjZCwgMHg2ODUwLAorCTB4ZDBiYywgMHgwMGMwLCAweDdmY2QsIDB4NzMxOCwgMHg2ODE0LCAweGEzMDYsIDB4MDBjMCwgMHg4MDZmLAorCTB4NzMxYywgMHg2ODEwLCAweGEzMDYsIDB4MDBjMCwgMHg4MDZmLCAweDczMTgsIDB4NmI2MiwgMHg3MzFjLAorCTB4NmI1ZSwgMHhhNjhjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDAyLCAweDAwNDAsIDB4ODAwNCwgMHhhMTg2LAorCTB4MDAyOCwgMHgwMGMwLCAweDdmZTEsIDB4MTA3OCwgMHg4YzE1LCAweDY4NGIsIDB4MDAxYywgMHgwMDc4LAorCTB4ODAwNiwgMHhkNmRjLCAweDAwNDAsIDB4N2ZmZCwgMHg2ODRiLCAweDAwMTUsIDB4Njg0YywgMHhkMGFjLAorCTB4MDA0MCwgMHg3ZmZiLCAweDY5MTQsIDB4NmExMCwgMHgyMTAwLCAweGEyMDUsIDB4MDA0MCwgMHg3ZmZiLAorCTB4NzAxOCwgMHhhMTA2LCAweDAwYzAsIDB4N2ZmOCwgMHg3MDFjLCAweGEyMDYsIDB4MDA0MCwgMHg3ZmZiLAorCTB4Njk2MiwgMHg2YTVlLCAweGM2ZGMsIDB4MDA3OCwgMHg4MDA2LCAweGQ2ZDQsIDB4MDA0MCwgMHg4MDA0LAorCTB4Njg0YiwgMHgwMDA3LCAweDAwNzgsIDB4ODAwNiwgMHg2ODRiLCAweDAwMDAsIDB4NjgzNywgMHgwMTAzLAorCTB4NmU0NiwgMHhhMDFlLCAweGQ2YzQsIDB4MDA0MCwgMHg4MDJmLCAweGE2ODYsIDB4MDEwMCwgMHgwMGMwLAorCTB4ODAxYSwgMHgyMDAxLCAweGE4OTksIDB4MjAwNCwgMHhhMDA1LCAweDAwYzAsIDB4ODAxYSwgMHhjNmM0LAorCTB4MDA3OCwgMHg3ZmE5LCAweDczMjgsIDB4NzMyYywgMHg2YjU2LCAweDgzZmYsIDB4MDA0MCwgMHg4MDJmLAorCTB4YTM4YSwgMHgwMDA5LCAweDAwNDgsIDB4ODAyNiwgMHgyMDE5LCAweDAwMDgsIDB4MDM3ZSwgMHgyMzA4LAorCTB4MjAxOSwgMHhhODk4LCAweGFkOTAsIDB4MDAxOSwgMHgxMDc4LCAweDg3MzksIDB4MDM3ZiwgMHhkNmNjLAorCTB4MDA0MCwgMHg4MDg1LCAweDcxMjQsIDB4Njk1YSwgMHg4MWZmLCAweDAwNDAsIDB4ODA4NSwgMHhhMTkyLAorCTB4MDAyMSwgMHgwMGM4LCAweDgwNDYsIDB4MjA3MSwgMHhhODk4LCAweDgzMWMsIDB4MjMwMCwgMHhhZTE4LAorCTB4YWQ5MCwgMHgwMDFkLCAweDEwNzgsIDB4ODczOSwgMHgwMDc4LCAweDgwODUsIDB4NjgzOCwgMHhkMGZjLAorCTB4MDA0MCwgMHg4MDRmLCAweDIwMDksIDB4MDAyMCwgMHg2OTVhLCAweDAwNzgsIDB4ODAzYiwgMHgwZjdlLAorCTB4MmQ3OCwgMHgxMDc4LCAweDg2ZDEsIDB4MGY3ZiwgMHgxMDc4LCAweDg3MjYsIDB4MDA3OCwgMHg4MDg3LAorCTB4MGY3ZSwgMHgyYzc4LCAweDEwNzgsIDB4NDg5MywgMHgwZjdmLCAweDAwNDAsIDB4ODA3NSwgMHg2ODRjLAorCTB4ZDBhYywgMHgwMDQwLCAweDgwNzUsIDB4NjAyNCwgMHhkMGRjLCAweDAwYzAsIDB4ODA3NSwgMHg2ODUwLAorCTB4ZDBiYywgMHgwMGMwLCAweDgwNzUsIDB4Njg0YywgMHhkMGY0LCAweDAwYzAsIDB4ODA3NSwgMHgxMDc4LAorCTB4OGNmYSwgMHgwZDdmLCAweDBlN2YsIDB4MDA3OCwgMHg4MDk0LCAweDY4NGIsIDB4MDAwMCwgMHg2ODM3LAorCTB4MDEwMywgMHg2ZTQ2LCAweDY4NGMsIDB4ZDBhYywgMHgwMDQwLCAweDgwODUsIDB4NjgxMCwgMHg2OTE0LAorCTB4YTExNSwgMHgwMDQwLCAweDgwODUsIDB4MTA3OCwgMHg4MjMzLCAweDEwNzgsIDB4NDk4MiwgMHg2MjE4LAorCTB4MjI2OCwgMHg2YTNjLCAweDgyMTEsIDB4NmEzZSwgMHgxMDc4LCAweDhjYzQsIDB4MGQ3ZiwgMHgwZTdmLAorCTB4MDBjMCwgMHg4MDk0LCAweDEwNzgsIDB4NzUzZCwgMHgwMDdjLCAweDBmN2UsIDB4NjAwMywgMHgwMDAzLAorCTB4MjA3OSwgMHhhODhjLCAweDdjMDQsIDB4N2IwMCwgMHg3ZTBjLCAweDdkMDgsIDB4NjAxMCwgMHgyMDc4LAorCTB4Nzg0YywgMHhkMGFjLCAweDAwNDAsIDB4ODBhOCwgMHg2MDAzLCAweDAwMDIsIDB4MGY3ZiwgMHgwMDdjLAorCTB4N2MxMiwgMHg3YjE2LCAweDdlMGEsIDB4N2QwZSwgMHgwZjdmLCAweDYwM2YsIDB4MDAwMCwgMHgyYzEwLAorCTB4MTA3OCwgMHgxY2FiLCAweDEwNzgsIDB4NWM2NCwgMHgxMDc4LCAweDYxZDMsIDB4MDA3YywgMHgyMDAxLAorCTB4YTVhMiwgMHgyMDA0LCAweDYwM2UsIDB4NjAwMywgMHgwMDA0LCAweDYxMTAsIDB4MjBlMSwgMHgwMDA1LAorCTB4M2QxOCwgMHgzZTIwLCAweDJjMTAsIDB4MTA3OCwgMHgxNWVjLCAweDAwN2MsIDB4YTE4MiwgMHgwMDQwLAorCTB4MDA3OSwgMHg4MGNhLCAweDgwZGQsIDB4ODBkZCwgMHg4MGRkLCAweDgwZGQsIDB4ODBkZCwgMHg4MGRmLAorCTB4ODE4MiwgMHg4MGRkLCAweDgwZGQsIDB4ODE5OCwgMHg4MjA5LCAweDgwZGQsIDB4ODBkZCwgMHg4MGRkLAorCTB4ODBkZCwgMHg4MjE4LCAweDgwZGQsIDB4ODBkZCwgMHg4MGRkLCAweDEwNzgsIDB4MTMyOCwgMHgwNzdlLAorCTB4MGY3ZSwgMHgwZTdlLCAweDBkN2UsIDB4MjA3MSwgMHhhODhjLCAweDYxMTAsIDB4MjE3OCwgMHg3NjE0LAorCTB4YTZiNCwgMHgwZmZmLCAweDdlNDYsIDB4N2Y0YywgMHhjN2U1LCAweDdmNGUsIDB4NjIxOCwgMHgyMjY4LAorCTB4NmEzYywgMHg4MjExLCAweDZhM2UsIDB4ODZmZiwgMHgwMDQwLCAweDgxN2QsIDB4YTY5NCwgMHhmZjAwLAorCTB4YTI4NCwgMHgwYzAwLCAweDAwNDAsIDB4ODEwMCwgMHg3MDE4LCAweDc4NjIsIDB4NzAxYywgMHg3ODVlLAorCTB4YTI4NCwgMHgwMzAwLCAweDAwNDAsIDB4ODE3ZCwgMHgxMDc4LCAweDEzODEsIDB4MTA0MCwgMHgxMzI4LAorCTB4MmQwMCwgMHg3ODRhLCAweDdmNGMsIDB4YzdjZCwgMHg3ZjRlLCAweDY4MzcsIDB4MDEwMywgMHg3ODM4LAorCTB4NjgzYSwgMHg3ODNjLCAweDY4M2UsIDB4Nzg0MCwgMHg2ODQyLCAweDZlNDYsIDB4YTY4YywgMHgwYzAwLAorCTB4MDA0MCwgMHg4MTFlLCAweDczMTgsIDB4NmI2MiwgMHg3MzFjLCAweDZiNWUsIDB4YTY4YywgMHgwMGZmLAorCTB4YTE4NiwgMHgwMDAyLCAweDAwNDAsIDB4ODEzYSwgMHhhMTg2LCAweDAwMjgsIDB4MDBjMCwgMHg4MTJjLAorCTB4Njg0YiwgMHgwMDFjLCAweDAwNzgsIDB4ODEzYywgMHhkNmRjLCAweDAwNDAsIDB4ODEzMywgMHg2ODRiLAorCTB4MDAxNSwgMHgwMDc4LCAweDgxM2MsIDB4ZDZkNCwgMHgwMDQwLCAweDgxM2EsIDB4Njg0YiwgMHgwMDA3LAorCTB4MDA3OCwgMHg4MTNjLCAweDY4NGIsIDB4MDAwMCwgMHg2ZjRlLCAweDc4NTAsIDB4Njg1MiwgMHg3ODU0LAorCTB4Njg1NiwgMHhhMDFlLCAweGQ2YzQsIDB4MDA0MCwgMHg4MTVhLCAweDczMjgsIDB4NzMyYywgMHg2YjU2LAorCTB4ODNmZiwgMHgwMDQwLCAweDgxNWEsIDB4YTM4YSwgMHgwMDA5LCAweDAwNDgsIDB4ODE1MSwgMHgyMDE5LAorCTB4MDAwOCwgMHgwMzdlLCAweDIzMDgsIDB4MjAxOSwgMHhhODk4LCAweGFkOTAsIDB4MDAxOSwgMHgxMDc4LAorCTB4ODczOSwgMHgwMzdmLCAweGQ2Y2MsIDB4MDA0MCwgMHg4MTdkLCAweDcxMjQsIDB4Njk1YSwgMHg4MWZmLAorCTB4MDA0MCwgMHg4MTdkLCAweGExOTIsIDB4MDAyMSwgMHgwMGM4LCAweDgxNzEsIDB4MjA3MSwgMHhhODk4LAorCTB4ODMxYywgMHgyMzAwLCAweGFlMTgsIDB4YWQ5MCwgMHgwMDFkLCAweDEwNzgsIDB4ODczOSwgMHgwMDc4LAorCTB4ODE3ZCwgMHg3ODM4LCAweGQwZmMsIDB4MDA0MCwgMHg4MTdhLCAweDIwMDksIDB4MDAyMCwgMHg2OTVhLAorCTB4MDA3OCwgMHg4MTY2LCAweDJkNzgsIDB4MTA3OCwgMHg4NmQxLCAweDBkN2YsIDB4MGU3ZiwgMHgwZjdmLAorCTB4MDc3ZiwgMHgwMDdjLCAweDBmN2UsIDB4NjAwMywgMHgwMDAzLCAweDIwNzksIDB4YTg4YywgMHg3YzA0LAorCTB4N2IwMCwgMHg3ZTBjLCAweDdkMDgsIDB4NjAxMCwgMHgyMDc4LCAweDdjMTIsIDB4N2IxNiwgMHg3ZTBhLAorCTB4N2QwZSwgMHgwZjdmLCAweDJjMTAsIDB4MTA3OCwgMHgxY2FiLCAweDEwNzgsIDB4NmMyNiwgMHgwMDdjLAorCTB4MGQ3ZSwgMHgwZjdlLCAweDJjNzgsIDB4MTA3OCwgMHg0ODkzLCAweDBmN2YsIDB4MDA0MCwgMHg4MWE0LAorCTB4MjAwMSwgMHhhNWEyLCAweDIwMDQsIDB4NjAzZSwgMHg2MDAzLCAweDAwMDIsIDB4MTA3OCwgMHg2MGI4LAorCTB4MTA3OCwgMHg2MWQzLCAweDYxMTAsIDB4MjE2OCwgMHg2OTRjLCAweGQxZTQsIDB4MDA0MCwgMHg4MjA3LAorCTB4ZDFjYywgMHgwMDQwLCAweDgxZGUsIDB4Njk0OCwgMHg2ODM4LCAweGQwZmMsIDB4MDA0MCwgMHg4MWQ2LAorCTB4MDE3ZSwgMHg2ODRjLCAweDAwN2UsIDB4Njg1MCwgMHgwMDdlLCAweGFkOTAsIDB4MDAwZCwgMHhhMTk4LAorCTB4MDAwZCwgMHgyMDA5LCAweDAwMjAsIDB4MTU3ZSwgMHgyMWE4LCAweDIzMDQsIDB4MjAxMiwgMHg4MzE4LAorCTB4ODIxMCwgMHgwMGYwLCAweDgxYzUsIDB4MTU3ZiwgMHgwMDdmLCAweDY4NTIsIDB4MDA3ZiwgMHg2ODRlLAorCTB4MDE3ZiwgMHgyMTY4LCAweDEwNzgsIDB4MTNhYSwgMHgwMDc4LCAweDgyMDEsIDB4MDE3ZSwgMHgxMDc4LAorCTB4MTNhYSwgMHgwZDdmLCAweDEwNzgsIDB4ODcyNiwgMHgwMDc4LCAweDgyMDEsIDB4NjgzNywgMHgwMTAzLAorCTB4Njk0NCwgMHhhMTg0LCAweDAwZmYsIDB4YTBiNiwgMHgwMDAyLCAweDAwNDAsIDB4ODFmZCwgMHhhMDg2LAorCTB4MDAyOCwgMHgwMGMwLCAweDgxZWYsIDB4Njg0YiwgMHgwMDFjLCAweDAwNzgsIDB4ODFmZiwgMHhkMWRjLAorCTB4MDA0MCwgMHg4MWY2LCAweDY4NGIsIDB4MDAxNSwgMHgwMDc4LCAweDgxZmYsIDB4ZDFkNCwgMHgwMDQwLAorCTB4ODFmZCwgMHg2ODRiLCAweDAwMDcsIDB4MDA3OCwgMHg4MWZmLCAweDY4NGIsIDB4MDAwMCwgMHgxMDc4LAorCTB4NDk4MiwgMHgxMDc4LCAweDhjYzQsIDB4MDBjMCwgMHg4MjA3LCAweDEwNzgsIDB4NzUzZCwgMHgwZDdmLAorCTB4MDA3YywgMHgyMDE5LCAweDAwMDEsIDB4MTA3OCwgMHg2ZTZjLCAweDYwMDMsIDB4MDAwMiwgMHgyMDAxLAorCTB4YTVhMiwgMHgyMDA0LCAweDYwM2UsIDB4MTA3OCwgMHg2MGI4LCAweDEwNzgsIDB4NjFkMywgMHgwMDdjLAorCTB4MTA3OCwgMHg2MGI4LCAweDEwNzgsIDB4MjgxMywgMHgwZDdlLCAweDYxMTAsIDB4MjE2OCwgMHgxMDc4LAorCTB4OGE0NCwgMHgwMDQwLCAweDgyMmQsIDB4NjgzNywgMHgwMTAzLCAweDY4NGIsIDB4MDAyOSwgMHg2ODQ3LAorCTB4MDAwMCwgMHgxMDc4LCAweDQ5ODIsIDB4MTA3OCwgMHg4YmY0LCAweDBkN2YsIDB4MTA3OCwgMHg3NTNkLAorCTB4MTA3OCwgMHg2MWQzLCAweDAwN2MsIDB4Njg0YiwgMHgwMDE1LCAweGQxZmMsIDB4MDA0MCwgMHg4MjNmLAorCTB4Njg0YiwgMHgwMDA3LCAweDgwMDIsIDB4ODAwMCwgMHg4MTBhLCAweGExODksIDB4MDAwMCwgMHg2OTYyLAorCTB4Njg1ZSwgMHgwMDdjLCAweGExODIsIDB4MDA0MCwgMHgwMDc5LCAweDgyNDYsIDB4ODI1OSwgMHg4MjU5LAorCTB4ODI1OSwgMHg4MjU5LCAweDgyNTksIDB4ODI1YiwgMHg4MjU5LCAweDgzMzMsIDB4ODMzZiwgMHg4MjU5LAorCTB4ODI1OSwgMHg4MjU5LCAweDgyNTksIDB4ODI1OSwgMHg4MjU5LCAweDgyNTksIDB4ODI1OSwgMHg4MjU5LAorCTB4ODI1OSwgMHgxMDc4LCAweDEzMjgsIDB4MDc3ZSwgMHgwZjdlLCAweDBlN2UsIDB4MGQ3ZSwgMHgyMDcxLAorCTB4YTg4YywgMHg2MTEwLCAweDIxNzgsIDB4NzYxNCwgMHhhNmI0LCAweDBmZmYsIDB4MGY3ZSwgMHgyYzc4LAorCTB4MTA3OCwgMHg0ODkzLCAweDBmN2YsIDB4MDA0MCwgMHg4MjdlLCAweGE2ODQsIDB4MDBmZiwgMHgwMGMwLAorCTB4ODI3ZSwgMHg2MDI0LCAweGQwZjQsIDB4MDBjMCwgMHg4MjdhLCAweDc4MDgsIDB4YTA4NiwgMHgwMDAwLAorCTB4MDBjMCwgMHg4MjdlLCAweDEwNzgsIDB4OGNmYSwgMHgwMDc4LCAweDgzMmUsIDB4N2U0NiwgMHg3ZjRjLAorCTB4YzdlNSwgMHg3ZjRlLCAweDYyMTgsIDB4MjI2OCwgMHg2YTNjLCAweDgyMTEsIDB4NmEzZSwgMHg4NmZmLAorCTB4MDA0MCwgMHg4MzIzLCAweGE2OTQsIDB4ZmYwMCwgMHhhMjg0LCAweDBjMDAsIDB4MDA0MCwgMHg4Mjk0LAorCTB4NzAxOCwgMHg3ODYyLCAweDcwMWMsIDB4Nzg1ZSwgMHhhMjg0LCAweDAzMDAsIDB4MDA0MCwgMHg4MzIwLAorCTB4YTY4NiwgMHgwMTAwLCAweDAwYzAsIDB4ODJhNiwgMHgyMDAxLCAweGE4OTksIDB4MjAwNCwgMHhhMDA1LAorCTB4MDBjMCwgMHg4MmE2LCAweGM2YzQsIDB4N2U0NiwgMHgwMDc4LCAweDgyODcsIDB4MTA3OCwgMHgxMzgxLAorCTB4MTA0MCwgMHgxMzI4LCAweDJkMDAsIDB4Nzg0YSwgMHg3ZjRjLCAweGE3YmQsIDB4MDIwMCwgMHg3ZjRlLAorCTB4NjgzNywgMHgwMTAzLCAweDc4MzgsIDB4NjgzYSwgMHg3ODNjLCAweDY4M2UsIDB4Nzg0MCwgMHg2ODQyLAorCTB4NmU0NiwgMHhhNjhjLCAweDBjMDAsIDB4MDA0MCwgMHg4MmMxLCAweDczMTgsIDB4NmI2MiwgMHg3MzFjLAorCTB4NmI1ZSwgMHhhNjhjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDAyLCAweDAwNDAsIDB4ODJkZCwgMHhhMTg2LAorCTB4MDAyOCwgMHgwMGMwLCAweDgyY2YsIDB4Njg0YiwgMHgwMDFjLCAweDAwNzgsIDB4ODJkZiwgMHhkNmRjLAorCTB4MDA0MCwgMHg4MmQ2LCAweDY4NGIsIDB4MDAxNSwgMHgwMDc4LCAweDgyZGYsIDB4ZDZkNCwgMHgwMDQwLAorCTB4ODJkZCwgMHg2ODRiLCAweDAwMDcsIDB4MDA3OCwgMHg4MmRmLCAweDY4NGIsIDB4MDAwMCwgMHg2ZjRlLAorCTB4Nzg1MCwgMHg2ODUyLCAweDc4NTQsIDB4Njg1NiwgMHhhMDFlLCAweGQ2YzQsIDB4MDA0MCwgMHg4MmZkLAorCTB4NzMyOCwgMHg3MzJjLCAweDZiNTYsIDB4ODNmZiwgMHgwMDQwLCAweDgyZmQsIDB4YTM4YSwgMHgwMDA5LAorCTB4MDA0OCwgMHg4MmY0LCAweDIwMTksIDB4MDAwOCwgMHgwMzdlLCAweDIzMDgsIDB4MjAxOSwgMHhhODk4LAorCTB4YWQ5MCwgMHgwMDE5LCAweDEwNzgsIDB4ODczOSwgMHgwMzdmLCAweGQ2Y2MsIDB4MDA0MCwgMHg4MzIwLAorCTB4NzEyNCwgMHg2OTVhLCAweDgxZmYsIDB4MDA0MCwgMHg4MzIwLCAweGExOTIsIDB4MDAyMSwgMHgwMGM4LAorCTB4ODMxNCwgMHgyMDcxLCAweGE4OTgsIDB4ODMxYywgMHgyMzAwLCAweGFlMTgsIDB4YWQ5MCwgMHgwMDFkLAorCTB4MTA3OCwgMHg4NzM5LCAweDAwNzgsIDB4ODMyMCwgMHg3ODM4LCAweGQwZmMsIDB4MDA0MCwgMHg4MzFkLAorCTB4MjAwOSwgMHgwMDIwLCAweDY5NWEsIDB4MDA3OCwgMHg4MzA5LCAweDJkNzgsIDB4MTA3OCwgMHg4NmQxLAorCTB4ZDZkYywgMHgwMGMwLCAweDgzMjYsIDB4YTAwNiwgMHgwMDc4LCAweDgzMmMsIDB4MjAwMSwgMHgwMDAxLAorCTB4MjA3MSwgMHhhODhjLCAweDcyMTgsIDB4NzMxYywgMHgxMDc4LCAweDE2NDUsIDB4MGQ3ZiwgMHgwZTdmLAorCTB4MGY3ZiwgMHgwNzdmLCAweDAwN2MsIDB4MjAwMSwgMHhhNWEyLCAweDIwMDQsIDB4NjAzZSwgMHgyMGUxLAorCTB4MDAwNSwgMHgzZDE4LCAweDNlMjAsIDB4MmMxMCwgMHgxMDc4LCAweDE1ZWMsIDB4MDA3YywgMHgyMDAxLAorCTB4YTVhMiwgMHgyMDA0LCAweDYwM2UsIDB4MGQ3ZSwgMHg2MDAzLCAweDAwMDIsIDB4NjExMCwgMHgyMTY4LAorCTB4Njk0YywgMHhkMWU0LCAweDAwNDAsIDB4ODQ2YiwgMHg2MDNmLCAweDAwMDAsIDB4MGY3ZSwgMHgyYzc4LAorCTB4MTA3OCwgMHg0ODkzLCAweDBmN2YsIDB4MDA0MCwgMHg4Mzg1LCAweDY4MTQsIDB4NjkxMCwgMHhhMTE1LAorCTB4MDA0MCwgMHg4Mzg1LCAweDZhNjAsIDB4YTIwNiwgMHgwMGMwLCAweDgzNjIsIDB4Njg1YywgMHhhMTA2LAorCTB4MDA0MCwgMHg4Mzg1LCAweDY4NGMsIDB4YzBlNCwgMHg2ODRlLCAweDY4NDcsIDB4MDAwMCwgMHg2ODYzLAorCTB4MDAwMCwgMHg2ODVmLCAweDAwMDAsIDB4NjAyNCwgMHhkMGY0LCAweDAwYzAsIDB4ODM3YSwgMHg2OTdjLAorCTB4NjgxMCwgMHhhMTAyLCAweDYwM2EsIDB4Njk4MCwgMHg2ODE0LCAweGExMDMsIDB4NjAzNiwgMHg2MDI0LAorCTB4YzBmNSwgMHg2MDI2LCAweDBkN2UsIDB4NjAxOCwgMHgyMDY4LCAweDY4M2MsIDB4ODAwMCwgMHg2ODNlLAorCTB4MGQ3ZiwgMHgxMDc4LCAweDhjZmEsIDB4MDA3OCwgMHg4NDZiLCAweDY5NGMsIDB4ZDFjYywgMHgwMDQwLAorCTB4ODQzMCwgMHg2OTQ4LCAweDY4MzgsIDB4ZDBmYywgMHgwMDQwLCAweDgzZWEsIDB4MDE3ZSwgMHg2ODRjLAorCTB4MDA3ZSwgMHg2ODUwLCAweDAwN2UsIDB4MGY3ZSwgMHgyMTc4LCAweDc5NDQsIDB4YTE4NCwgMHgwMGZmLAorCTB4YTBiNiwgMHgwMDAyLCAweDAwNDAsIDB4ODNiZiwgMHhhMDg2LCAweDAwMjgsIDB4MDBjMCwgMHg4M2E2LAorCTB4Njg0YiwgMHgwMDFjLCAweDc4NGIsIDB4MDAxYywgMHgwMDc4LCAweDgzY2EsIDB4ZDFkYywgMHgwMDQwLAorCTB4ODNiNiwgMHg2ODRiLCAweDAwMTUsIDB4Nzg0YiwgMHgwMDE1LCAweDEwNzgsIDB4OGVhNSwgMHgwMDQwLAorCTB4ODNiNCwgMHg3OTQ0LCAweGMxZGMsIDB4Nzk0NiwgMHgwMDc4LCAweDgzY2EsIDB4ZDFkNCwgMHgwMDQwLAorCTB4ODNiZiwgMHg2ODRiLCAweDAwMDcsIDB4Nzg0YiwgMHgwMDA3LCAweDAwNzgsIDB4ODNjYSwgMHg2ODRjLAorCTB4ZDBhYywgMHgwMDQwLCAweDgzY2EsIDB4NjgxMCwgMHg2OTE0LCAweGExMTUsIDB4MDA0MCwgMHg4M2NhLAorCTB4MTA3OCwgMHg4MjMzLCAweDY4NDgsIDB4Nzg0YSwgMHg2ODYwLCAweDc4NjIsIDB4Njg1YywgMHg3ODVlLAorCTB4YWQ5MCwgMHgwMDBkLCAweGFmOTgsIDB4MDAwZCwgMHgyMDA5LCAweDAwMjAsIDB4MTU3ZSwgMHgyMWE4LAorCTB4MjMwNCwgMHgyMDEyLCAweDgzMTgsIDB4ODIxMCwgMHgwMGYwLCAweDgzZDgsIDB4MTU3ZiwgMHgwZjdmLAorCTB4MDA3ZiwgMHg2ODUyLCAweDAwN2YsIDB4Njg0ZSwgMHgwMTdmLCAweDIxNjgsIDB4MTA3OCwgMHgxM2FhLAorCTB4MDA3OCwgMHg4NDY1LCAweDAxN2UsIDB4MGY3ZSwgMHgyMTc4LCAweDc5NDQsIDB4YTE4NCwgMHgwMGZmLAorCTB4YTBiNiwgMHgwMDAyLCAweDAwNDAsIDB4ODQxNywgMHhhMDg2LCAweDAwMjgsIDB4MDBjMCwgMHg4M2ZlLAorCTB4Njg0YiwgMHgwMDFjLCAweDc4NGIsIDB4MDAxYywgMHgwMDc4LCAweDg0MjIsIDB4ZDFkYywgMHgwMDQwLAorCTB4ODQwZSwgMHg2ODRiLCAweDAwMTUsIDB4Nzg0YiwgMHgwMDE1LCAweDEwNzgsIDB4OGVhNSwgMHgwMDQwLAorCTB4ODQwYywgMHg3OTQ0LCAweGMxZGMsIDB4Nzk0NiwgMHgwMDc4LCAweDg0MjIsIDB4ZDFkNCwgMHgwMDQwLAorCTB4ODQxNywgMHg2ODRiLCAweDAwMDcsIDB4Nzg0YiwgMHgwMDA3LCAweDAwNzgsIDB4ODQyMiwgMHg2ODRjLAorCTB4ZDBhYywgMHgwMDQwLCAweDg0MjIsIDB4NjgxMCwgMHg2OTE0LCAweGExMTUsIDB4MDA0MCwgMHg4NDIyLAorCTB4MTA3OCwgMHg4MjMzLCAweDY4NjAsIDB4Nzg2MiwgMHg2ODVjLCAweDc4NWUsIDB4Njg0YywgMHg3ODRlLAorCTB4MGY3ZiwgMHgxMDc4LCAweDEzYWEsIDB4MGQ3ZiwgMHgxMDc4LCAweDg3MjYsIDB4MDA3OCwgMHg4NDY1LAorCTB4NjgzNywgMHgwMTAzLCAweDY5NDQsIDB4YTE4NCwgMHgwMGZmLCAweGEwYjYsIDB4MDAwMiwgMHgwMDQwLAorCTB4ODQ1NiwgMHhhMDg2LCAweDAwMjgsIDB4MDBjMCwgMHg4NDQxLCAweDY4NGIsIDB4MDAxYywgMHgwMDc4LAorCTB4ODQ2MywgMHhkMWRjLCAweDAwNDAsIDB4ODQ0ZiwgMHg2ODRiLCAweDAwMTUsIDB4MTA3OCwgMHg4ZWE1LAorCTB4MDA0MCwgMHg4NDRkLCAweDY5NDQsIDB4YzFkYywgMHg2OTQ2LCAweDAwNzgsIDB4ODQ2MywgMHhkMWQ0LAorCTB4MDA0MCwgMHg4NDU2LCAweDY4NGIsIDB4MDAwNywgMHgwMDc4LCAweDg0NjMsIDB4Njg0YiwgMHgwMDAwLAorCTB4Njg0YywgMHhkMGFjLCAweDAwNDAsIDB4ODQ2MywgMHg2ODEwLCAweDY5MTQsIDB4YTExNSwgMHgwMDQwLAorCTB4ODQ2MywgMHgxMDc4LCAweDgyMzMsIDB4MTA3OCwgMHg0OTgyLCAweDEwNzgsIDB4OGNjNCwgMHgwMGMwLAorCTB4ODQ2YiwgMHgxMDc4LCAweDc1M2QsIDB4MGQ3ZiwgMHgwMDdjLCAweDEwNzgsIDB4NjAxMCwgMHgwMDc4LAorCTB4ODQ3MywgMHgxMDc4LCAweDYwYjgsIDB4MTA3OCwgMHg4YTQ0LCAweDAwNDAsIDB4ODQ5MiwgMHgwZDdlLAorCTB4NjExMCwgMHgyMTY4LCAweDY4MzcsIDB4MDEwMywgMHgyMDA5LCAweGEzMGMsIDB4MjEwYywgMHhkMThjLAorCTB4MDBjMCwgMHg4NDlkLCAweGQxODQsIDB4MDBjMCwgMHg4NDk5LCAweDYxMDgsIDB4Njk0YSwgMHhhMThlLAorCTB4MDAyOSwgMHgwMGMwLCAweDg0OGQsIDB4MTA3OCwgMHhhMTgxLCAweDY4NDcsIDB4MDAwMCwgMHgxMDc4LAorCTB4NDk4MiwgMHgwZDdmLCAweDEwNzgsIDB4NzUzZCwgMHgxMDc4LCAweDYxMDksIDB4MTA3OCwgMHg2MWQzLAorCTB4MDA3YywgMHg2ODRiLCAweDAwMDQsIDB4MDA3OCwgMHg4NDhkLCAweDY4NGIsIDB4MDAwNCwgMHgwMDc4LAorCTB4ODQ4ZCwgMHhhMTgyLCAweDAwNDAsIDB4MDA3OSwgMHg4NGE1LCAweDg0YjgsIDB4ODRiOCwgMHg4NGI4LAorCTB4ODRiOCwgMHg4NGI4LCAweDg0YmEsIDB4ODRiOCwgMHg4NGJkLCAweDg0YjgsIDB4ODRiOCwgMHg4NGI4LAorCTB4ODRiOCwgMHg4NGI4LCAweDg0YjgsIDB4ODRiOCwgMHg4NGI4LCAweDg0YjgsIDB4ODRiOCwgMHg4NGI4LAorCTB4MTA3OCwgMHgxMzI4LCAweDEwNzgsIDB4NzUzZCwgMHgwMDdjLCAweDAwN2UsIDB4MDI3ZSwgMHhhMDE2LAorCTB4MTA3OCwgMHgxNWVjLCAweDAyN2YsIDB4MDA3ZiwgMHgwMDdjLCAweGExODIsIDB4MDA4NSwgMHgwMDc5LAorCTB4ODRjOSwgMHg4NGQyLCAweDg0ZDAsIDB4ODRkMCwgMHg4NGRlLCAweDg0ZDAsIDB4ODRkMCwgMHg4NGQwLAorCTB4MTA3OCwgMHgxMzI4LCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDEwNzgsIDB4NWJmOCwgMHgxMjdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4NjEwOSwgMHgxMjdmLCAweDAwN2MsIDB4MDI3ZSwgMHgwNTdlLAorCTB4MGQ3ZSwgMHgwZTdlLCAweDIwNzEsIDB4YTg4MCwgMHg3MjI0LCAweDYyMTIsIDB4NzIyMCwgMHgxMDc4LAorCTB4OGEzMCwgMHgwMDQwLCAweDg1MDMsIDB4MjI2OCwgMHg2ODAwLCAweGEwODYsIDB4MDAwMCwgMHgwMDQwLAorCTB4ODUwMywgMHg2MDE4LCAweDZkMTgsIDB4YTUyZSwgMHgwMGMwLCAweDg1MDMsIDB4MGM3ZSwgMHgyZDYwLAorCTB4MTA3OCwgMHg4NzRhLCAweDBjN2YsIDB4MDA0MCwgMHg4NTAzLCAweDY4MDMsIDB4MDAwMiwgMHg2MDA3LAorCTB4MDA4NiwgMHgwMDc4LCAweDg1MDUsIDB4NjAwNywgMHgwMDg3LCAweDYwMDMsIDB4MDAwMSwgMHgxMDc4LAorCTB4NWJmOCwgMHgxMDc4LCAweDYxMDksIDB4MGY3ZSwgMHgyMjc4LCAweDEwNzgsIDB4NDg5MywgMHgwZjdmLAorCTB4MDA0MCwgMHg4NTFkLCAweDY4MjQsIDB4ZDBlYywgMHgwMDQwLCAweDg1MWQsIDB4MGM3ZSwgMHgyMjYwLAorCTB4NjAzZiwgMHgwMDAwLCAweDEwNzgsIDB4OGNmYSwgMHgwYzdmLCAweDBlN2YsIDB4MGQ3ZiwgMHgwNTdmLAorCTB4MDI3ZiwgMHgwMDdjLCAweGExODYsIDB4MDAxMywgMHgwMGMwLCAweDg1MzMsIDB4NjAwNCwgMHhhMDhhLAorCTB4MDA4NSwgMHgxMDQ4LCAweDEzMjgsIDB4YTA4YSwgMHgwMDhjLCAweDEwYzgsIDB4MTMyOCwgMHhhMDgyLAorCTB4MDA4NSwgMHgwMDc5LCAweDg1NDIsIDB4YTE4NiwgMHgwMDI3LCAweDAwNDAsIDB4ODUzYiwgMHhhMTg2LAorCTB4MDAxNCwgMHgxMGMwLCAweDEzMjgsIDB4MTA3OCwgMHg2MDEwLCAweDEwNzgsIDB4OGMwMSwgMHgxMDc4LAorCTB4NjEwOSwgMHgwMDdjLCAweDg1NDksIDB4ODU0YiwgMHg4NTRiLCAweDg1NDksIDB4ODU0OSwgMHg4NTQ5LAorCTB4ODU0OSwgMHgxMDc4LCAweDEzMjgsIDB4MTA3OCwgMHg2MDEwLCAweDEwNzgsIDB4OGMwMSwgMHgxMDc4LAorCTB4NjEwOSwgMHgwMDdjLCAweGExODYsIDB4MDAxMywgMHgwMGMwLCAweDg1NWMsIDB4NjAwNCwgMHhhMDgyLAorCTB4MDA4NSwgMHgyMDA4LCAweDAwNzgsIDB4ODU5NywgMHhhMTg2LCAweDAwMjcsIDB4MDBjMCwgMHg4NTdmLAorCTB4MTA3OCwgMHg2MDEwLCAweDEwNzgsIDB4MjgxMywgMHgwZDdlLCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LAorCTB4OGE0NCwgMHgwMDQwLCAweDg1NzUsIDB4NjgzNywgMHgwMTAzLCAweDY4NDcsIDB4MDAwMCwgMHg2ODRiLAorCTB4MDAyOSwgMHgxMDc4LCAweDQ5ODIsIDB4MTA3OCwgMHg4YmY0LCAweDBkN2YsIDB4MTA3OCwgMHg3NTNkLAorCTB4MTA3OCwgMHg2MTA5LCAweDAwN2MsIDB4MTA3OCwgMHg3NTgzLCAweDAwNzgsIDB4ODU3YSwgMHhhMTg2LAorCTB4MDAxNCwgMHgwMGMwLCAweDg1N2IsIDB4MTA3OCwgMHg2MDEwLCAweDBkN2UsIDB4NjAxMCwgMHgyMDY4LAorCTB4MTA3OCwgMHg4YTQ0LCAweDAwNDAsIDB4ODU3NSwgMHg2ODM3LCAweDAxMDMsIDB4Njg0NywgMHgwMDAwLAorCTB4Njg0YiwgMHgwMDA2LCAweDY4NTAsIDB4YzBlYywgMHg2ODUyLCAweDAwNzgsIDB4ODU3MSwgMHgwMDc5LAorCTB4ODU5OSwgMHg4NWEyLCAweDg1YTAsIDB4ODVhMCwgMHg4NWEwLCAweDg1YTAsIDB4ODVhMCwgMHg4NWJkLAorCTB4MTA3OCwgMHgxMzI4LCAweDEwNzgsIDB4NjAxMCwgMHg2MDMwLCAweGEwOGMsIDB4ZmYwMCwgMHg4MTBmLAorCTB4YTE4NiwgMHgwMDM5LCAweDAwNDAsIDB4ODViMCwgMHhhMTg2LCAweDAwMzUsIDB4MDBjMCwgMHg4NWI0LAorCTB4MjAwMSwgMHhhNWEwLCAweDAwNzgsIDB4ODViNiwgMHgyMDAxLCAweGE1YTEsIDB4MjAwNCwgMHg2MDE2LAorCTB4NjAwMywgMHgwMDBjLCAweDEwNzgsIDB4NjEwOSwgMHgwMDdjLCAweDEwNzgsIDB4NjAxMCwgMHg2MDMwLAorCTB4YTA4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE4NiwgMHgwMDM5LCAweDAwNDAsIDB4ODVjYiwgMHhhMTg2LAorCTB4MDAzNSwgMHgwMGMwLCAweDg1Y2YsIDB4MjAwMSwgMHhhNWEwLCAweDAwNzgsIDB4ODVkMSwgMHgyMDAxLAorCTB4YTVhMSwgMHgyMDA0LCAweDYwMTYsIDB4NjAwMywgMHgwMDBlLCAweDEwNzgsIDB4NjEwOSwgMHgwMDdjLAorCTB4YTE4MiwgMHgwMDhjLCAweDAwYzgsIDB4ODVlMiwgMHhhMTgyLCAweDAwODUsIDB4MDA0OCwgMHg4NWUyLAorCTB4MDA3OSwgMHg4NWU1LCAweDEwNzgsIDB4NzU4MywgMHgwMDdjLCAweDg1ZWMsIDB4ODVlYywgMHg4NWVjLAorCTB4ODVlYywgMHg4NWVlLCAweDg2NDMsIDB4ODVlYywgMHgxMDc4LCAweDEzMjgsIDB4MGY3ZSwgMHgyYzc4LAorCTB4MTA3OCwgMHg0ODkzLCAweDBmN2YsIDB4MDA0MCwgMHg4NjAxLCAweDYwMzAsIDB4YTA4YywgMHhmZjAwLAorCTB4ODEwZiwgMHhhMTg2LCAweDAwMzksIDB4MDA0MCwgMHg4NjVhLCAweGExODYsIDB4MDAzNSwgMHgwMDQwLAorCTB4ODY1YSwgMHgwZDdlLCAweDEwNzgsIDB4OGJmNCwgMHgxMDc4LCAweDhhNDQsIDB4MDA0MCwgMHg4NjI1LAorCTB4NjAxMCwgMHgyMDY4LCAweDY4MzcsIDB4MDEwMywgMHg2ODUwLCAweGQwYjQsIDB4MDA0MCwgMHg4NjE2LAorCTB4Njg0YiwgMHgwMDA2LCAweGMwZWMsIDB4Njg1MiwgMHgwMDc4LCAweDg2MjEsIDB4ZDBiYywgMHgwMDQwLAorCTB4ODYxZCwgMHg2ODRiLCAweDAwMDIsIDB4MDA3OCwgMHg4NjIxLCAweDY4NGIsIDB4MDAwNSwgMHgxMDc4LAorCTB4OGNjMCwgMHg2ODQ3LCAweDAwMDAsIDB4MTA3OCwgMHg0OTgyLCAweDJjNjgsIDB4MTA3OCwgMHg3NGQ3LAorCTB4MDA0MCwgMHg4NjNlLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMWUsIDB4MjAwOSwgMHhhODhlLAorCTB4MjEwYywgMHg2MTM2LCAweDIwMDksIDB4YTg4ZiwgMHgyMTBjLCAweDYxM2EsIDB4NjkxOCwgMHg2MTFhLAorCTB4NjkyMCwgMHg2MTIyLCAweDYwMWYsIDB4MDAwMSwgMHgxMDc4LCAweDViZjgsIDB4MmQ2MCwgMHgxMDc4LAorCTB4NzUzZCwgMHgwZDdmLCAweDAwN2MsIDB4MGY3ZSwgMHgyYzc4LCAweDEwNzgsIDB4NDg5MywgMHgwZjdmLAorCTB4MDA0MCwgMHg4NjgwLCAweDYwMzAsIDB4YTA4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE4NiwgMHgwMDM1LAorCTB4MDA0MCwgMHg4NjVhLCAweGExODYsIDB4MDAxZSwgMHgwMDQwLCAweDg2NWEsIDB4YTE4NiwgMHgwMDM5LAorCTB4MDBjMCwgMHg4NjgwLCAweDBkN2UsIDB4MmM2OCwgMHgxMDc4LCAweDhlZjUsIDB4MDBjMCwgMHg4NmE0LAorCTB4MTA3OCwgMHg3NGQ3LCAweDAwNDAsIDB4ODY3ZCwgMHg2MTA2LCAweDYwMDMsIDB4MDAwMSwgMHg2MDFmLAorCTB4MDAwMSwgMHg2OTE4LCAweDYxMWEsIDB4NjkyOCwgMHg2MTJhLCAweDY5MmMsIDB4NjEyZSwgMHg2OTMwLAorCTB4YTE4YywgMHgwMGZmLCAweDYxMzIsIDB4NjkzNCwgMHg2MTM2LCAweDY5MzgsIDB4NjEzYSwgMHg2OTIwLAorCTB4NjEyMiwgMHgxMDc4LCAweDViZjgsIDB4MTA3OCwgMHg2MTA5LCAweDJkNjAsIDB4MDA3OCwgMHg4NmE0LAorCTB4MGQ3ZSwgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4YTQ0LCAweDAwNDAsIDB4ODZhNCwgMHg2ODM3LAorCTB4MDEwMywgMHg2ODUwLCAweGQwYjQsIDB4MDA0MCwgMHg4NjkzLCAweGMwZWMsIDB4Njg1MiwgMHg2ODRiLAorCTB4MDAwNiwgMHgwMDc4LCAweDg2OWUsIDB4ZDBiYywgMHgwMDQwLCAweDg2OWEsIDB4Njg0YiwgMHgwMDAyLAorCTB4MDA3OCwgMHg4NjllLCAweDY4NGIsIDB4MDAwNSwgMHgxMDc4LCAweDhjYzAsIDB4Njg0NywgMHgwMDAwLAorCTB4MTA3OCwgMHg0OTgyLCAweDEwNzgsIDB4OGJmNCwgMHgwZDdmLCAweDEwNzgsIDB4NzUzZCwgMHgwMDdjLAorCTB4MDE3ZSwgMHgwZDdlLCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LCAweDhhNDQsIDB4MDA0MCwgMHg4NmI4LAorCTB4NjgzNywgMHgwMTAzLCAweDY4NGIsIDB4MDAyOCwgMHg2ODQ3LCAweDAwMDAsIDB4MTA3OCwgMHg0OTgyLAorCTB4MGQ3ZiwgMHgwMTdmLCAweGExODYsIDB4MDAxMywgMHgwMDQwLCAweDg2Y2EsIDB4YTE4NiwgMHgwMDE0LAorCTB4MDA0MCwgMHg4NmNhLCAweGExODYsIDB4MDAyNywgMHgwMDQwLCAweDg2Y2EsIDB4MTA3OCwgMHg3NTgzLAorCTB4MDA3OCwgMHg4NmQwLCAweDEwNzgsIDB4NjAxMCwgMHgxMDc4LCAweDhjMDEsIDB4MTA3OCwgMHg2MTA5LAorCTB4MDA3YywgMHgwNTdlLCAweDA2N2UsIDB4MGQ3ZSwgMHgwZjdlLCAweDIwMjksIDB4MDAwMSwgMHhhMTgyLAorCTB4MDEwMSwgMHgwMGM4LCAweDg2ZGQsIDB4MDA3OCwgMHg4NmRmLCAweDIwMDksIDB4MDEwMCwgMHgyMTMwLAorCTB4MjA2OSwgMHhhODk4LCAweDgzMWMsIDB4MjMwMCwgMHhhZDE4LCAweDIwMDksIDB4MDAyMCwgMHhhZjkwLAorCTB4MDAxZCwgMHgxMDc4LCAweDg3MzksIDB4YTZiMiwgMHgwMDIwLCAweDc4MDQsIDB4YTA2ZCwgMHgwMDQwLAorCTB4ODZmMywgMHgxMDc4LCAweDEzYWEsIDB4MTA3OCwgMHgxMzgxLCAweDAwNDAsIDB4ODcxZCwgMHg4NTI4LAorCTB4NjgzNywgMHgwMTEwLCAweDY4M2IsIDB4MDAwMCwgMHgyZDIwLCAweDdjMDYsIDB4YTY4YSwgMHgwMDNkLAorCTB4MDBjOCwgMHg4NzA5LCAweDI2MDgsIDB4YWQ5MCwgMHgwMDBmLCAweDEwNzgsIDB4ODczOSwgMHgwMDc4LAorCTB4ODcxZCwgMHhhNmIyLCAweDAwM2MsIDB4MjAwOSwgMHgwMDNjLCAweDJkNzgsIDB4YWQ5MCwgMHgwMDBmLAorCTB4MTA3OCwgMHg4NzM5LCAweDAwNzgsIDB4ODZmMywgMHgwZjdmLCAweDg1MmYsIDB4YTVhZCwgMHgwMDAzLAorCTB4N2QzNiwgMHhhNWFjLCAweDAwMDAsIDB4MDA3OCwgMHg4NzIyLCAweDBmN2YsIDB4ODUyZiwgMHhhNWFkLAorCTB4MDAwMywgMHg3ZDM2LCAweDBkN2YsIDB4MDY3ZiwgMHgwNTdmLCAweDAwN2MsIDB4MGY3ZSwgMHg4ZGZmLAorCTB4MDA0MCwgMHg4NzM3LCAweDY4MDQsIDB4YTA3ZCwgMHgwMDQwLCAweDg3MzUsIDB4NjgwNywgMHgwMDAwLAorCTB4MTA3OCwgMHg0OTgyLCAweDJmNjgsIDB4MDA3OCwgMHg4NzJhLCAweDEwNzgsIDB4NDk4MiwgMHgwZjdmLAorCTB4MDA3YywgMHgxNTdlLCAweGExODQsIDB4MDAwMSwgMHgwMDQwLCAweDg3M2YsIDB4ODEwOCwgMHg4MTBjLAorCTB4MjFhOCwgMHgyMzA0LCAweDgwMDcsIDB4MjAxMiwgMHg4MzE4LCAweDgyMTAsIDB4MDBmMCwgMHg4NzQxLAorCTB4MTU3ZiwgMHgwMDdjLCAweDA2N2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjAzMSwgMHgwMDAxLAorCTB4NjAxYywgMHhhMDg0LCAweDAwMGYsIDB4MTA3OSwgMHg4NzY2LCAweDEyN2YsIDB4MDY3ZiwgMHgwMDdjLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MDY3ZSwgMHgyMDMxLCAweDAwMDAsIDB4NjAxYywgMHhhMDg0LAorCTB4MDAwZiwgMHgxMDc5LCAweDg3NjYsIDB4MDY3ZiwgMHgxMjdmLCAweDAwN2MsIDB4ODc4MCwgMHg4NzZlLAorCTB4ODc3YiwgMHg4NzljLCAweDg3NmUsIDB4ODc3YiwgMHg4NzljLCAweDg3N2IsIDB4MTA3OCwgMHgxMzI4LAorCTB4MDM3ZSwgMHgyMDE5LCAweDAwMTAsIDB4MTA3OCwgMHg5YTZhLCAweDYwMWYsIDB4MDAwNiwgMHg2MDAzLAorCTB4MDAwNywgMHgwMzdmLCAweDAwN2MsIDB4YTAwNiwgMHgwMDdjLCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLAorCTB4MGQ3ZSwgMHg4NmZmLCAweDAwYzAsIDB4ODc5NywgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4YTQ0LAorCTB4MDA0MCwgMHg4Nzk5LCAweGEwMGUsIDB4MjAwMSwgMHgwMDA1LCAweDEwNzgsIDB4NGE2MCwgMHgxMDc4LAorCTB4OGNjMCwgMHgxMDc4LCAweDQ5ODIsIDB4MTA3OCwgMHg3NTNkLCAweGEwODUsIDB4MDAwMSwgMHgwZDdmLAorCTB4MDA3YywgMHhhMDA2LCAweDAwNzgsIDB4ODc5NywgMHg2MDAwLCAweGEwOGEsIDB4MDAxMCwgMHgxMGM4LAorCTB4MTMyOCwgMHgxMDc5LCAweDg3YTQsIDB4MDA3YywgMHg4N2I0LCAweDg3ZDQsIDB4ODdiNiwgMHg4N2Y3LAorCTB4ODdkMCwgMHg4N2I0LCAweDg3N2IsIDB4ODc4MCwgMHg4NzgwLCAweDg3N2IsIDB4ODc3YiwgMHg4NzdiLAorCTB4ODc3YiwgMHg4NzdiLCAweDg3N2IsIDB4ODc3YiwgMHgxMDc4LCAweDEzMjgsIDB4ODZmZiwgMHgwMGMwLAorCTB4ODdjZCwgMHgwZDdlLCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LCAweDhhNDQsIDB4MDA0MCwgMHg4N2MyLAorCTB4MTA3OCwgMHg4Y2MwLCAweDBkN2YsIDB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDFmLAorCTB4MDAwMiwgMHgxMDc4LCAweDViZjgsIDB4MTA3OCwgMHg2MTA5LCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLAorCTB4MTA3OCwgMHgxNzQ5LCAweDAwNzgsIDB4ODdiNiwgMHgwZTdlLCAweDIwNzEsIDB4YTVhYiwgMHg3MDI0LAorCTB4YWMwNiwgMHgwMGMwLCAweDg3ZGQsIDB4MTA3OCwgMHg2ZGRhLCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLAorCTB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4ODdlZiwgMHgwODdlLCAweDA5N2UsIDB4MjA0OSwgMHgwMDAxLAorCTB4MmM0MCwgMHgxMDc4LCAweDcwNTgsIDB4MDk3ZiwgMHgwODdmLCAweDAwNzgsIDB4ODdmMSwgMHgxMDc4LAorCTB4NmNkMiwgMHgwZTdmLCAweDAwYzAsIDB4ODdiNiwgMHgxMDc4LCAweDg3N2IsIDB4MDA3YywgMHgwMzdlLAorCTB4MGU3ZSwgMHgyMDcxLCAweGE1YWIsIDB4NzAzYywgMHhhYzA2LCAweDAwYzAsIDB4ODgwNywgMHgyMDE5LAorCTB4MDAwMCwgMHgxMDc4LCAweDZlNmMsIDB4MGU3ZiwgMHgwMzdmLCAweDAwNzgsIDB4ODdiNiwgMHgxMDc4LAorCTB4NzE5YSwgMHgwZTdmLCAweDAzN2YsIDB4MDBjMCwgMHg4N2I2LCAweDEwNzgsIDB4ODc3YiwgMHgwMDdjLAorCTB4MGM3ZSwgMHg2MDFjLCAweGEwODQsIDB4MDAwZiwgMHgxMDc5LCAweDg4MTgsIDB4MGM3ZiwgMHgwMDdjLAorCTB4ODgyNywgMHg4ODk1LCAweDg5Y2QsIDB4ODgzMiwgMHg4YzAxLCAweDg4MjcsIDB4OWE1YiwgMHg3NTNkLAorCTB4ODg5NSwgMHgxMDc4LCAweDhjM2IsIDB4MDBjMCwgMHg4ODI3LCAweDEwNzgsIDB4N2EwNSwgMHgwMDdjLAorCTB4MTA3OCwgMHg2MDEwLCAweDEwNzgsIDB4NjEwOSwgMHgxMDc4LCAweDc1M2QsIDB4MDA3YywgMHg2MDE3LAorCTB4MDAwMSwgMHgwMDdjLCAweDYwMTAsIDB4YTA4MCwgMHgwMDE5LCAweDJjMDIsIDB4NjAwMCwgMHhhMDhhLAorCTB4MDAxMCwgMHgxMGM4LCAweDEzMjgsIDB4MTA3OSwgMHg4ODNlLCAweDAwN2MsIDB4ODg0ZSwgMHg4ODUwLAorCTB4ODg3MiwgMHg4ODg0LCAweDg4OTEsIDB4ODg0ZSwgMHg4ODI3LCAweDg4MjcsIDB4ODgyNywgMHg4ODg0LAorCTB4ODg4NCwgMHg4ODRlLCAweDg4NGUsIDB4ODg0ZSwgMHg4ODRlLCAweDg4OGUsIDB4MTA3OCwgMHgxMzI4LAorCTB4MGU3ZSwgMHg2MDEwLCAweDIwNzAsIDB4NzA1MCwgMHhjMGI1LCAweDcwNTIsIDB4MjA3MSwgMHhhNWFiLAorCTB4NzAyNCwgMHhhYzA2LCAweDAwNDAsIDB4ODg2ZSwgMHgxMDc4LCAweDZjZDIsIDB4NjAwNywgMHgwMDg1LAorCTB4NjAwMywgMHgwMDBiLCAweDYwMWYsIDB4MDAwMiwgMHgyMDAxLCAweGE1YTEsIDB4MjAwNCwgMHg2MDE2LAorCTB4MTA3OCwgMHg1YmY4LCAweDEwNzgsIDB4NjEwOSwgMHgwZTdmLCAweDAwN2MsIDB4NjAxNywgMHgwMDAxLAorCTB4MDA3OCwgMHg4ODZjLCAweDBkN2UsIDB4NjAxMCwgMHgyMDY4LCAweDY4NTAsIDB4YzBiNSwgMHg2ODUyLAorCTB4MGQ3ZiwgMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMWYsIDB4MDAwMiwgMHgxMDc4LAorCTB4NWJmOCwgMHgxMDc4LCAweDYxMDksIDB4MDA3YywgMHgwZDdlLCAweDYwMTcsIDB4MDAwMSwgMHg2MDEwLAorCTB4MjA2OCwgMHg2ODUwLCAweGMwYjUsIDB4Njg1MiwgMHgwZDdmLCAweDAwN2MsIDB4MTA3OCwgMHg3NTNkLAorCTB4MDA3YywgMHgxMDc4LCAweDE3NDksIDB4MDA3OCwgMHg4ODcyLCAweDYwMDAsIDB4YTA4YSwgMHgwMDEwLAorCTB4MTBjOCwgMHgxMzI4LCAweDEwNzksIDB4ODg5ZCwgMHgwMDdjLCAweDg4YWQsIDB4ODgyZiwgMHg4OGFmLAorCTB4ODhhZCwgMHg4OGFmLCAweDg4YWYsIDB4ODgyOCwgMHg4OGFkLCAweDg4MjEsIDB4ODgyMSwgMHg4OGFkLAorCTB4ODhhZCwgMHg4OGFkLCAweDg4YWQsIDB4ODhhZCwgMHg4OGFkLCAweDEwNzgsIDB4MTMyOCwgMHgwZDdlLAorCTB4NjAxOCwgMHgyMDY4LCAweDY4MDQsIDB4YTA4NCwgMHgwMGZmLCAweDBkN2YsIDB4YTA4YSwgMHgwMDBjLAorCTB4MTBjOCwgMHgxMzI4LCAweDEwNzksIDB4ODhiZCwgMHgwMDdjLCAweDg4YzksIDB4ODk3MSwgMHg4OGNiLAorCTB4ODkwYiwgMHg4OGNiLCAweDg5MGIsIDB4ODhjYiwgMHg4OGQ4LCAweDg4YzksIDB4ODkwYiwgMHg4OGM5LAorCTB4ODhmNSwgMHgxMDc4LCAweDEzMjgsIDB4NjAwNCwgMHhhMDhlLCAweDAwMTYsIDB4MDA0MCwgMHg4OTA2LAorCTB4YTA4ZSwgMHgwMDA0LCAweDAwNDAsIDB4ODkwNiwgMHhhMDhlLCAweDAwMDIsIDB4MDA0MCwgMHg4OTA2LAorCTB4NjAwNCwgMHgxMDc4LCAweDhjM2IsIDB4MDA0MCwgMHg4OThjLCAweGEwOGUsIDB4MDAyMSwgMHgwMDQwLAorCTB4ODk5MCwgMHhhMDhlLCAweDAwMjIsIDB4MDA0MCwgMHg4OThjLCAweGEwOGUsIDB4MDAzZCwgMHgwMDQwLAorCTB4ODk5MCwgMHhhMDhlLCAweDAwMzksIDB4MDA0MCwgMHg4OTk0LCAweGEwOGUsIDB4MDAzNSwgMHgwMDQwLAorCTB4ODk5NCwgMHhhMDhlLCAweDAwMWUsIDB4MDA0MCwgMHg4OTA4LCAweGEwOGUsIDB4MDAwMSwgMHgwMGMwLAorCTB4ODkwNCwgMHgwZDdlLCAweDYwMTgsIDB4MjA2OCwgMHg2ODA0LCAweGEwODQsIDB4MDBmZiwgMHgwZDdmLAorCTB4YTA4NiwgMHgwMDA2LCAweDAwNDAsIDB4ODkwNiwgMHgxMDc4LCAweDI4MTMsIDB4MTA3OCwgMHg3YTA1LAorCTB4MTA3OCwgMHg4YzAxLCAweDAwN2MsIDB4MGM3ZSwgMHgwZDdlLCAweDYxMDQsIDB4YTE4NiwgMHgwMDE2LAorCTB4MDA0MCwgMHg4OTYxLCAweGExODYsIDB4MDAwMiwgMHgwMGMwLCAweDg5MzQsIDB4NjAxOCwgMHgyMDY4LAorCTB4NjhhMCwgMHhkMGJjLCAweDAwYzAsIDB4ODliOCwgMHg2ODQwLCAweGEwODQsIDB4MDBmZiwgMHhhMDA1LAorCTB4MDA0MCwgMHg4OTM0LCAweDgwMDEsIDB4Njg0MiwgMHg2MDEzLCAweDAwMDAsIDB4NjAxZiwgMHgwMDA3LAorCTB4NjAxNywgMHgwMzk4LCAweDEwNzgsIDB4NzRkNywgMHgwMDQwLCAweDg5MzQsIDB4MmQwMCwgMHg2MDFhLAorCTB4NjAxZiwgMHgwMDAxLCAweDAwNzgsIDB4ODk2MSwgMHgwZDdmLCAweDBjN2YsIDB4NjAwNCwgMHhhMDhlLAorCTB4MDAwMiwgMHgwMGMwLCAweDg5NTIsIDB4NjAxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMDg2LAorCTB4MDA3ZSwgMHgwMGMwLCAweDg5NTIsIDB4MjAwOSwgMHhhMzMyLCAweDIxMDQsIDB4YzA4NSwgMHgyMDBhLAorCTB4MGU3ZSwgMHgyMDcxLCAweGEzMDAsIDB4MTA3OCwgMHg0MWY1LCAweDBlN2YsIDB4MTA3OCwgMHg3YTA1LAorCTB4MDA3OCwgMHg4OTU2LCAweDEwNzgsIDB4N2EwNSwgMHgxMDc4LCAweDI4MTMsIDB4MGU3ZSwgMHgxMjdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4MjgzOSwgMHgxMjdmLCAweDBlN2YsIDB4MTA3OCwgMHg4YzAxLAorCTB4MDA3YywgMHgyMDAxLCAweDAwMDIsIDB4MTA3OCwgMHg0NDNmLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDAwMiwgMHgxMDc4LCAweDVjNDUsIDB4MTA3OCwgMHg2MTA5LCAweDBkN2YsIDB4MGM3ZiwgMHgwMDc4LAorCTB4ODk2MCwgMHgwYzdlLCAweDBkN2UsIDB4NjEwNCwgMHhhMTg2LCAweDAwMTYsIDB4MDA0MCwgMHg4OTYxLAorCTB4NjAxOCwgMHgyMDY4LCAweDY4NDAsIDB4YTA4NCwgMHgwMGZmLCAweGEwMDUsIDB4MDA0MCwgMHg4OTM0LAorCTB4ODAwMSwgMHg2ODQyLCAweDYwMDMsIDB4MDAwMSwgMHgxMDc4LCAweDVjNDUsIDB4MTA3OCwgMHg2MTA5LAorCTB4MGQ3ZiwgMHgwYzdmLCAweDAwNzgsIDB4ODk2MCwgMHgxMDc4LCAweDdhMDUsIDB4MDA3OCwgMHg4OTA4LAorCTB4MTA3OCwgMHg3YTI4LCAweDAwNzgsIDB4ODkwOCwgMHgwZDdlLCAweDJjNjgsIDB4NjEwNCwgMHgxMDc4LAorCTB4OGVmNSwgMHgwZDdmLCAweDAwNDAsIDB4ODlhMCwgMHgxMDc4LCAweDc1M2QsIDB4MDA3OCwgMHg4OWI3LAorCTB4NjAwNCwgMHg4MDA3LCAweDYxMzAsIDB4YTE4YywgMHgwMGZmLCAweGExMDUsIDB4NjAzMiwgMHg2MDA3LAorCTB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAxZiwgMHgwMDAyLCAweDYwMzgsIDB4NjAwYSwgMHgyMDAxLAorCTB4YTVhMSwgMHgyMDA0LCAweDYwMTYsIDB4MTA3OCwgMHg1YmY4LCAweDEwNzgsIDB4NjEwOSwgMHgwMDdjLAorCTB4MGQ3ZiwgMHgwYzdmLCAweDEwNzgsIDB4N2EwNSwgMHgxMDc4LCAweDI4MTMsIDB4MGU3ZSwgMHgxMjdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4MjgzOSwgMHg2MDEzLCAweDAwMDAsIDB4NjAxZiwgMHgwMDA3LAorCTB4NjAxNywgMHgwMzk4LCAweDEyN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDYwMDAsIDB4YTA4YSwgMHgwMDEwLAorCTB4MTBjOCwgMHgxMzI4LCAweDEwNzksIDB4ODlkNSwgMHgwMDdjLCAweDg5ZTUsIDB4ODllNSwgMHg4OWU1LAorCTB4ODllNSwgMHg4OWU1LCAweDg5ZTUsIDB4ODllNSwgMHg4OWU1LCAweDg5ZTUsIDB4ODgyNywgMHg4OWU1LAorCTB4ODgyZiwgMHg4OWU3LCAweDg4MmYsIDB4ODlmNSwgMHg4OWU1LCAweDEwNzgsIDB4MTMyOCwgMHg2MDA0LAorCTB4YTA4NiwgMHgwMDhiLCAweDAwNDAsIDB4ODlmNSwgMHg2MDA3LCAweDAwOGIsIDB4NjAwMywgMHgwMDBkLAorCTB4MTA3OCwgMHg1YmY4LCAweDEwNzgsIDB4NjEwOSwgMHgwMDdjLCAweDEwNzgsIDB4OGJmNCwgMHgxMDc4LAorCTB4OGE0NCwgMHgwMDQwLCAweDhhMmQsIDB4MTA3OCwgMHgyODEzLCAweDBkN2UsIDB4MTA3OCwgMHg4YTQ0LAorCTB4MDA0MCwgMHg4YTBmLCAweDYwMTAsIDB4MjA2OCwgMHg2ODM3LCAweDAxMDMsIDB4Njg0YiwgMHgwMDA2LAorCTB4Njg0NywgMHgwMDAwLCAweDY4NTAsIDB4YzBlZCwgMHg2ODUyLCAweDEwNzgsIDB4NDk4MiwgMHgyYzY4LAorCTB4MTA3OCwgMHg3NGQ3LCAweDAwNDAsIDB4OGExZCwgMHg2ODE4LCAweDYwMWEsIDB4MGM3ZSwgMHgyZDYwLAorCTB4MTA3OCwgMHg4YzAxLCAweDBjN2YsIDB4MDA3OCwgMHg4YTFlLCAweDJkNjAsIDB4MGQ3ZiwgMHg2MDEzLAorCTB4MDAwMCwgMHg2MDFmLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHgxMDc4LAorCTB4NWM0NSwgMHgxMDc4LCAweDYxMDksIDB4MDA3OCwgMHg4YTJmLCAweDEwNzgsIDB4OGMwMSwgMHgwMDdjLAorCTB4YTI4NCwgMHgwMDBmLCAweDAwYzAsIDB4OGE0MSwgMHhhMjgyLCAweGFhMDAsIDB4MDA0OCwgMHg4YTQxLAorCTB4MjAwMSwgMHhhMzE1LCAweDIwMDQsIDB4YTIwMiwgMHgwMGM4LCAweDhhNDEsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDA3YywgMHhhMDA2LCAweDAwNzgsIDB4OGE0MCwgMHgwMjdlLCAweDBlN2UsIDB4MjA3MSwgMHhhMzAwLAorCTB4NjIxMCwgMHg3MDU4LCAweGEyMDIsIDB4MDA0OCwgMHg4YTU2LCAweDcwNWMsIDB4YTIwMiwgMHgwMGM4LAorCTB4OGE1NiwgMHhhMDg1LCAweDAwMDEsIDB4MGU3ZiwgMHgwMjdmLCAweDAwN2MsIDB4YTAwNiwgMHgwMDc4LAorCTB4OGE1MywgMHgwZTdlLCAweDBjN2UsIDB4MDM3ZSwgMHgwMDdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA2MSwgMHhhYTAwLCAweDIwNzEsIDB4YTMwMCwgMHg3MzQ0LCAweDcwNjAsIDB4YTMwMiwgMHgwMGM4LAorCTB4OGE4MywgMHg2MDFjLCAweGEyMDYsIDB4MDBjMCwgMHg4YTdiLCAweDEwNzgsIDB4OGQ2NiwgMHgwMDQwLAorCTB4OGE3YiwgMHgxMDc4LCAweDhjM2IsIDB4MDBjMCwgMHg4YTc3LCAweDEwNzgsIDB4N2EwNSwgMHgwYzdlLAorCTB4MTA3OCwgMHg3NTNkLCAweDBjN2YsIDB4YWNlMCwgMHgwMDEwLCAweDcwNTQsIDB4YWMwMiwgMHgwMGM4LAorCTB4OGE4MywgMHgwMDc4LCAweDhhNjQsIDB4MTI3ZiwgMHgwMDdmLCAweDAzN2YsIDB4MGM3ZiwgMHgwZTdmLAorCTB4MDA3YywgMHgwZTdlLCAweDBjN2UsIDB4MDE3ZSwgMHhhMTg4LCAweGE0MzQsIDB4MjEwYywgMHg4MWZmLAorCTB4MDA0MCwgMHg4YWExLCAweDIwNjEsIDB4YWEwMCwgMHgyMDcxLCAweGEzMDAsIDB4MDE3ZSwgMHgxMDc4LAorCTB4NzRkNywgMHgwMTdmLCAweDAwNDAsIDB4OGFhNCwgMHg2MTFhLCAweDEwNzgsIDB4MjgxMywgMHgxMDc4LAorCTB4NzUzZCwgMHhhMDA2LCAweDAwNzgsIDB4OGFhNiwgMHhhMDg1LCAweDAwMDEsIDB4MDE3ZiwgMHgwYzdmLAorCTB4MGU3ZiwgMHgwMDdjLCAweDBjN2UsIDB4MDU3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwYzdlLAorCTB4MTA3OCwgMHg3NGQ3LCAweDA1N2YsIDB4MDA0MCwgMHg4YWMzLCAweDY2MTIsIDB4NjUxYSwgMHg2MDFmLAorCTB4MDAwMywgMHgyMDA5LCAweDAwNGIsIDB4MTA3OCwgMHg3NTZjLCAweGEwODUsIDB4MDAwMSwgMHgxMjdmLAorCTB4MDU3ZiwgMHgwYzdmLCAweDAwN2MsIDB4YTAwNiwgMHgwMDc4LCAweDhhYmYsIDB4MGM3ZSwgMHgwNTdlLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjJhMCwgMHgwYzdlLCAweDEwNzgsIDB4NzRkNywgMHgwNTdmLAorCTB4MDA0MCwgMHg4YWYxLCAweDYwMTMsIDB4MDAwMCwgMHg2NTFhLCAweDYwMWYsIDB4MDAwMywgMHgwYzdlLAorCTB4MjU2MCwgMHgxMDc4LCAweDQ3MWIsIDB4MGM3ZiwgMHgxMDc4LCAweDVkNTMsIDB4MDc3ZSwgMHgyMDM5LAorCTB4MDAwMCwgMHgxMDc4LCAweDVjNzgsIDB4MmMwOCwgMHgxMDc4LCAweDljMzgsIDB4MDc3ZiwgMHgyMDA5LAorCTB4MDA0YywgMHgxMDc4LCAweDc1NmMsIDB4YTA4NSwgMHgwMDAxLCAweDEyN2YsIDB4MDU3ZiwgMHgwYzdmLAorCTB4MDA3YywgMHhhMDA2LCAweDAwNzgsIDB4OGFlZCwgMHgwZjdlLCAweDBjN2UsIDB4MDQ3ZSwgMHgwYzdlLAorCTB4MTA3OCwgMHg3NGQ3LCAweDJjNzgsIDB4MGM3ZiwgMHgwMDQwLCAweDhiMGUsIDB4N2UxMiwgMHgyYzAwLAorCTB4NzgxYSwgMHg3ODFmLCAweDAwMDMsIDB4MjAyMSwgMHgwMDA1LCAweDEwNzgsIDB4OGI0ZSwgMHgyZjYwLAorCTB4MjAwOSwgMHgwMDRkLCAweDEwNzgsIDB4NzU2YywgMHhhMDg1LCAweDAwMDEsIDB4MDQ3ZiwgMHgwYzdmLAorCTB4MGY3ZiwgMHgwMDdjLCAweDBmN2UsIDB4MGM3ZSwgMHgwNDdlLCAweDBjN2UsIDB4MTA3OCwgMHg3NGQ3LAorCTB4MmM3OCwgMHgwYzdmLCAweDAwNDAsIDB4OGIyYywgMHg3ZTEyLCAweDJjMDAsIDB4NzgxYSwgMHg3ODFmLAorCTB4MDAwMywgMHgyMDIxLCAweDAwMDUsIDB4MTA3OCwgMHg4YjRlLCAweDJmNjAsIDB4MjAwOSwgMHgwMDRlLAorCTB4MTA3OCwgMHg3NTZjLCAweGEwODUsIDB4MDAwMSwgMHgwNDdmLCAweDBjN2YsIDB4MGY3ZiwgMHgwMDdjLAorCTB4MGY3ZSwgMHgwYzdlLCAweDA0N2UsIDB4MGM3ZSwgMHgxMDc4LCAweDc0ZDcsIDB4MmM3OCwgMHgwYzdmLAorCTB4MDA0MCwgMHg4YjRhLCAweDdlMTIsIDB4MmMwMCwgMHg3ODFhLCAweDc4MWYsIDB4MDAwMywgMHgyMDIxLAorCTB4MDAwNCwgMHgxMDc4LCAweDhiNGUsIDB4MmY2MCwgMHgyMDA5LCAweDAwNTIsIDB4MTA3OCwgMHg3NTZjLAorCTB4YTA4NSwgMHgwMDAxLCAweDA0N2YsIDB4MGM3ZiwgMHgwZjdmLCAweDAwN2MsIDB4MDk3ZSwgMHgwNzdlLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg0NmE3LCAweDAwNDAsIDB4OGI1YiwgMHgyMDAxLAorCTB4OGI1MywgMHgwMDc4LCAweDhiNjEsIDB4MTA3OCwgMHg0NjZkLCAweDAwNDAsIDB4OGI2YSwgMHgyMDAxLAorCTB4OGI1YiwgMHgwMDdlLCAweGEwMGUsIDB4MjQwMCwgMHgxMDc4LCAweDRhNjAsIDB4MTA3OCwgMHg0OTgyLAorCTB4MDA3ZiwgMHgwMDdhLCAweDI0MTgsIDB4MTA3OCwgMHg1ZmE3LCAweDYyYTAsIDB4MDg3ZSwgMHgyMDQxLAorCTB4MDAwMSwgMHgyMDM5LCAweDAwMDEsIDB4MjYwOCwgMHgxMDc4LCAweDVkNmQsIDB4MDg3ZiwgMHgxMDc4LAorCTB4NWM3OCwgMHgyZjA4LCAweDI2NDgsIDB4MTA3OCwgMHg5YzM4LCAweDYxM2MsIDB4ODFmZiwgMHgxMDQwLAorCTB4NWUyMSwgMHgxMjdmLCAweDA3N2YsIDB4MDk3ZiwgMHgwMDdjLCAweDBjN2UsIDB4MTI3ZSwgMHgyMDkxLAorCTB4ODAwMCwgMHgwYzdlLCAweDEwNzgsIDB4NzRkNywgMHgwMTdmLCAweDAwNDAsIDB4OGI5ZSwgMHg2NjBhLAorCTB4NjExYSwgMHg2MDFmLCAweDAwMDEsIDB4MmQwMCwgMHg2MDEyLCAweDIwMDksIDB4MDAxZiwgMHgxMDc4LAorCTB4NzU2YywgMHhhMDg1LCAweDAwMDEsIDB4MTI3ZiwgMHgwYzdmLCAweDAwN2MsIDB4YTAwNiwgMHgwMDc4LAorCTB4OGI5YiwgMHgwYzdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDBjN2UsIDB4MTA3OCwgMHg3NGQ3LAorCTB4MDE3ZiwgMHgwMDQwLCAweDhiYmEsIDB4NjYwYSwgMHg2MTFhLCAweDYwMWYsIDB4MDAwOCwgMHgyZDAwLAorCTB4NjAxMiwgMHgyMDA5LCAweDAwMjEsIDB4MTA3OCwgMHg3NTZjLCAweGEwODUsIDB4MDAwMSwgMHgxMjdmLAorCTB4MGM3ZiwgMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHg4YmI3LCAweDBjN2UsIDB4MTI3ZSwgMHgyMDkxLAorCTB4ODAwMCwgMHgwYzdlLCAweDEwNzgsIDB4NzRkNywgMHgwMTdmLCAweDAwNDAsIDB4OGJkNiwgMHg2NjBhLAorCTB4NjExYSwgMHg2MDFmLCAweDAwMDEsIDB4MmQwMCwgMHg2MDEyLCAweDIwMDksIDB4MDAzZCwgMHgxMDc4LAorCTB4NzU2YywgMHhhMDg1LCAweDAwMDEsIDB4MTI3ZiwgMHgwYzdmLCAweDAwN2MsIDB4YTAwNiwgMHgwMDc4LAorCTB4OGJkMywgMHgwYzdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDBjN2UsIDB4MTA3OCwgMHg3NGQ3LAorCTB4MDE3ZiwgMHgwMDQwLCAweDhiZjEsIDB4NjExYSwgMHg2MDFmLCAweDAwMDEsIDB4MmQwMCwgMHg2MDEyLAorCTB4MjAwOSwgMHgwMDAwLCAweDEwNzgsIDB4NzU2YywgMHhhMDg1LCAweDAwMDEsIDB4MTI3ZiwgMHgwYzdmLAorCTB4MDA3YywgMHhhMDA2LCAweDAwNzgsIDB4OGJlZSwgMHgwMjdlLCAweDBkN2UsIDB4NjIxOCwgMHgyMjY4LAorCTB4NmEzYywgMHg4MmZmLCAweDAwNDAsIDB4OGJmZSwgMHg4MjExLCAweDZhM2UsIDB4MGQ3ZiwgMHgwMjdmLAorCTB4MDA3YywgMHgwMDdlLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAwLCAweDAwNDAsIDB4OGMxMywgMHg2MDEzLAorCTB4MDAwMCwgMHg2MDFmLCAweDAwMDcsIDB4MjAwMSwgMHhhNWExLCAweDIwMDQsIDB4NjAxNiwgMHgxMDc4LAorCTB4YTEzNCwgMHg2MDNmLCAweDAwMDAsIDB4MDA3ZiwgMHgwMDdjLCAweDA2N2UsIDB4MGM3ZSwgMHgwZDdlLAorCTB4MjAzMSwgMHhhMzUyLCAweDI2MzQsIDB4ZDZlNCwgMHgwMDQwLCAweDhjMjMsIDB4NjYxOCwgMHgyNjYwLAorCTB4NmU0OCwgMHgxMDc4LCAweDQ2MWIsIDB4MGQ3ZiwgMHgwYzdmLCAweDA2N2YsIDB4MDA3YywgMHgwMDdlLAorCTB4MDE3ZSwgMHg2MDA0LCAweGEwOGUsIDB4MDAwMiwgMHgwMDQwLCAweDhjMzgsIDB4YTA4ZSwgMHgwMDAzLAorCTB4MDA0MCwgMHg4YzM4LCAweGEwOGUsIDB4MDAwNCwgMHgwMDQwLCAweDhjMzgsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDE3ZiwgMHgwMDdmLCAweDAwN2MsIDB4MDA3ZSwgMHgwZDdlLCAweDYwMTAsIDB4YTA2ZCwgMHgwMDQwLAorCTB4OGM0OCwgMHg2ODM4LCAweGQwZmMsIDB4MDA0MCwgMHg4YzQ4LCAweGEwMDYsIDB4MDA3OCwgMHg4YzRhLAorCTB4YTA4NSwgMHgwMDAxLCAweDBkN2YsIDB4MDA3ZiwgMHgwMDdjLCAweDBjN2UsIDB4MTI3ZSwgMHgyMDkxLAorCTB4ODAwMCwgMHgwYzdlLCAweDEwNzgsIDB4NzRkNywgMHgwMTdmLCAweDAwNDAsIDB4OGM2NywgMHg2MTFhLAorCTB4NjAxZiwgMHgwMDAxLCAweDJkMDAsIDB4NjAxMiwgMHgxMDc4LCAweDI4MTMsIDB4MjAwOSwgMHgwMDI4LAorCTB4MTA3OCwgMHg3NTZjLCAweGEwODUsIDB4MDAwMSwgMHgxMjdmLCAweDBjN2YsIDB4MDA3YywgMHhhMDA2LAorCTB4MDA3OCwgMHg4YzY0LCAweGExODYsIDB4MDAxNSwgMHgwMGMwLCAweDhjN2YsIDB4MjAxMSwgMHhhMzFmLAorCTB4MjIwNCwgMHhhMDg2LCAweDAwNzQsIDB4MDBjMCwgMHg4YzdmLCAweDEwNzgsIDB4N2QwZCwgMHg2MDAzLAorCTB4MDAwMSwgMHg2MDA3LCAweDAwMjksIDB4MTA3OCwgMHg1YzQ1LCAweDAwNzgsIDB4OGM4MywgMHgxMDc4LAorCTB4N2EwNSwgMHgxMDc4LCAweDc1M2QsIDB4MDA3YywgMHhhMTg2LCAweDAwMTYsIDB4MDBjMCwgMHg4YzhlLAorCTB4MjAwMSwgMHgwMDA0LCAweDEwNzgsIDB4NDQzZiwgMHgwMDc4LCAweDhjYWYsIDB4YTE4NiwgMHgwMDE1LAorCTB4MDBjMCwgMHg4Y2IzLCAweDIwMTEsIDB4YTMxZiwgMHgyMjA0LCAweGEwODYsIDB4MDAxNCwgMHgwMGMwLAorCTB4OGNiMywgMHgwZDdlLCAweDYwMTgsIDB4MjA2OCwgMHgxMDc4LCAweDQ1N2QsIDB4MGQ3ZiwgMHgxMDc4LAorCTB4N2RiYSwgMHgwMGMwLCAweDhjYjMsIDB4MGQ3ZSwgMHg2MDE4LCAweDIwNjgsIDB4Njg5MCwgMHgwZDdmLAorCTB4YTAwNSwgMHgwMDQwLCAweDhjYjMsIDB4MjAwMSwgMHgwMDA2LCAweDEwNzgsIDB4NDQzZiwgMHgxMDc4LAorCTB4NzYwOCwgMHgwMDc4LCAweDhjYjcsIDB4MTA3OCwgMHg3YTA1LCAweDEwNzgsIDB4NzUzZCwgMHgwMDdjLAorCTB4Njg0OCwgMHhhMDg2LCAweDAwMDUsIDB4MDBjMCwgMHg4Y2JmLCAweDEwNzgsIDB4OGNjMCwgMHgwMDdjLAorCTB4Njg1MCwgMHhjMGFkLCAweDY4NTIsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YTg4YywgMHg3MDE0LAorCTB4ZDBlNCwgMHgwMDQwLCAweDhjZDUsIDB4NjAxMywgMHgwMDAwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDA1MCwgMHgxMDc4LCAweDViZjgsIDB4MTA3OCwgMHg2MTA5LCAweDBlN2YsIDB4MDA3YywgMHgwYzdlLAorCTB4MGY3ZSwgMHgyYzc4LCAweDEwNzgsIDB4NDg5MywgMHgwZjdmLCAweDAwNDAsIDB4OGNlNCwgMHg2MDFjLAorCTB4YTA4NCwgMHgwMDBmLCAweDEwNzksIDB4OGNlNiwgMHgwYzdmLCAweDAwN2MsIDB4ODgyNywgMHg4Y2YxLAorCTB4OGNmNCwgMHg4Y2Y3LCAweDlmMDAsIDB4OWYxYywgMHg5ZjFmLCAweDg4MjcsIDB4ODgyNywgMHgxMDc4LAorCTB4MTMyOCwgMHgwMDA1LCAweDAwMDUsIDB4MDA3YywgMHgwMDA1LCAweDAwMDUsIDB4MDA3YywgMHgxMDc4LAorCTB4OGNmYSwgMHgwMDdjLCAweDBmN2UsIDB4MmM3OCwgMHgxMDc4LCAweDQ4OTMsIDB4MDA0MCwgMHg4ZDI5LAorCTB4MTA3OCwgMHg3NGQ3LCAweDAwYzAsIDB4OGQwYSwgMHgyMDAxLCAweGE1YTIsIDB4MjAwNCwgMHg3ODNlLAorCTB4MDA3OCwgMHg4ZDI5LCAweDc4MTgsIDB4NjAxYSwgMHg3ODFjLCAweGEwODYsIDB4MDAwMywgMHgwMDQwLAorCTB4OGQxNywgMHg3ODA4LCAweDYwMzYsIDB4MmYwMCwgMHg2MDNhLCAweDAwNzgsIDB4OGQxYiwgMHg3ODA4LAorCTB4NjAzYSwgMHgyZjAwLCAweDYwMzYsIDB4NjAyYSwgMHg2MDFmLCAweDAwMDEsIDB4NjAwNywgMHgwMDM1LAorCTB4NjAwMywgMHgwMDAxLCAweDc5MjAsIDB4NjEyMiwgMHgxMDc4LCAweDViZjgsIDB4MTA3OCwgMHg2MTA5LAorCTB4MmY2MCwgMHgwZjdmLCAweDAwN2MsIDB4MDE3ZSwgMHgwZjdlLCAweDY4MmMsIDB4NjAzMiwgMHhhMDhlLAorCTB4MDAwMSwgMHgwMDQwLCAweDhkM2MsIDB4YTA4NiwgMHgwMDA1LCAweDAwNDAsIDB4OGQ0MCwgMHhhMDA2LAorCTB4NjAyYSwgMHg2MDJlLCAweDAwNzgsIDB4OGQ1MSwgMHg2ODI0LCAweGMwZjQsIDB4YzBkNSwgMHg2ODI2LAorCTB4NjgxMCwgMHgyMDc4LCAweDc4N2MsIDB4NjkzOCwgMHhhMTAyLCAweDc4ODAsIDB4NjkzNCwgMHhhMTAzLAorCTB4MDBjOCwgMHg4ZDM3LCAweDY4MzQsIDB4NjAyYSwgMHg2ODM4LCAweGEwODQsIDB4ZmZmYywgMHg2ODNhLAorCTB4NjAyZSwgMHgyZDAwLCAweDYwMzYsIDB4NjgwOCwgMHg2MDNhLCAweDY5MTgsIDB4NjExYSwgMHg2OTIwLAorCTB4NjEyMiwgMHg2MDFmLCAweDAwMDEsIDB4NjAwNywgMHgwMDM5LCAweDYwMDMsIDB4MDAwMSwgMHgxMDc4LAorCTB4NWJmOCwgMHg2ODAzLCAweDAwMDIsIDB4MGY3ZiwgMHgwMTdmLCAweDAwN2MsIDB4MDA3ZSwgMHgwMTdlLAorCTB4NjAwNCwgMHhhMDhlLCAweDAwMzQsIDB4MDA0MCwgMHg4ZDhiLCAweGEwOGUsIDB4MDAzNSwgMHgwMDQwLAorCTB4OGQ4YiwgMHhhMDhlLCAweDAwMzYsIDB4MDA0MCwgMHg4ZDhiLCAweGEwOGUsIDB4MDAzNywgMHgwMDQwLAorCTB4OGQ4YiwgMHhhMDhlLCAweDAwMzgsIDB4MDA0MCwgMHg4ZDhiLCAweGEwOGUsIDB4MDAzOSwgMHgwMDQwLAorCTB4OGQ4YiwgMHhhMDhlLCAweDAwM2EsIDB4MDA0MCwgMHg4ZDhiLCAweGEwOGUsIDB4MDAzYiwgMHgwMDQwLAorCTB4OGQ4YiwgMHhhMDg1LCAweDAwMDEsIDB4MDE3ZiwgMHgwMDdmLCAweDAwN2MsIDB4MGY3ZSwgMHgyYzc4LAorCTB4MTA3OCwgMHg0ODkzLCAweDAwYzAsIDB4OGQ5OCwgMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwgMHg4ZGE3LAorCTB4NjAyNCwgMHhkMGY0LCAweDAwYzAsIDB4OGRhNiwgMHhjMGY1LCAweDYwMjYsIDB4NjAxMCwgMHgyMDc4LAorCTB4NzgyOCwgMHg2MDNhLCAweDc4MmMsIDB4NjAzNiwgMHgxMDc4LCAweDE3NDksIDB4YTAwNiwgMHgwZjdmLAorCTB4MDA3YywgMHgwMDdlLCAweDAxN2UsIDB4MDI3ZSwgMHgwMzdlLCAweDBlN2UsIDB4MjAwMSwgMHhhNTljLAorCTB4MjAwYywgMHg4MDAwLCAweDIwMTQsIDB4MjAwMSwgMHgwMDMyLCAweDEwNzgsIDB4NWE5OCwgMHgyMDAxLAorCTB4YTVhMCwgMHg4MmZmLCAweDAwYzAsIDB4OGRiZSwgMHgyMDExLCAweDAwMDIsIDB4MjIwMiwgMHgyMDAxLAorCTB4YTU5ZSwgMHgyMDBjLCAweDgwMDAsIDB4MjAxNCwgMHgyMDcxLCAweGE1OGMsIDB4NzExYSwgMHg3MjFlLAorCTB4MjAwMSwgMHgwMDY0LCAweDEwNzgsIDB4NWE5OCwgMHgyMDAxLCAweGE1YTEsIDB4ODJmZiwgMHgwMGMwLAorCTB4OGRkMywgMHgyMDExLCAweDAwMDIsIDB4MjIwMiwgMHgyMDA5LCAweGE1YTIsIDB4YTI4MCwgMHgwMDBhLAorCTB4MjAwYSwgMHgwZTdmLCAweDAzN2YsIDB4MDI3ZiwgMHgwMTdmLCAweDAwN2YsIDB4MDA3YywgMHgwMDdlLAorCTB4MGU3ZSwgMHgyMDAxLCAweGE1YTAsIDB4MjAwMywgMHgwMDI4LCAweDIwMDEsIDB4YTVhMSwgMHgyMDAzLAorCTB4MDAxNCwgMHgyMDcxLCAweGE1OGMsIDB4NzAxYiwgMHgwMDAwLCAweDcwMWYsIDB4MDdkMCwgMHgyMDAxLAorCTB4YTVhMiwgMHgyMDAzLCAweDAwMWUsIDB4MGU3ZiwgMHgwMDdmLCAweDAwN2MsIDB4MGM3ZSwgMHgxMjdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDBjN2UsIDB4MTA3OCwgMHg3NGQ3LCAweDAxN2YsIDB4MDA0MCwgMHg4ZTBlLAorCTB4NjExYSwgMHg2MDFmLCAweDAwMDEsIDB4MmQwMCwgMHg2MDEyLCAweDIwMDksIDB4MDAzMywgMHgxMDc4LAorCTB4NzU2YywgMHhhMDg1LCAweDAwMDEsIDB4MTI3ZiwgMHgwYzdmLCAweDAwN2MsIDB4YTAwNiwgMHgwMDc4LAorCTB4OGUwYiwgMHgwZDdlLCAweDBlN2UsIDB4MGY3ZSwgMHgyMDcxLCAweGEzMDAsIDB4YTE4NiwgMHgwMDE1LAorCTB4MDBjMCwgMHg4ZTQwLCAweDcwN2MsIDB4YTA4NiwgMHgwMDE4LCAweDAwYzAsIDB4OGU0MCwgMHg2MDEwLAorCTB4MjA2OCwgMHg2YTNjLCAweGQyZTQsIDB4MDBjMCwgMHg4ZTM0LCAweDJjNzgsIDB4MTA3OCwgMHg2MmM2LAorCTB4MDA0MCwgMHg4ZTQ4LCAweDcwNjgsIDB4NmE1MCwgMHhhMjA2LCAweDAwYzAsIDB4OGUzYywgMHg3MDZjLAorCTB4NmE1NCwgMHhhMjA2LCAweDAwYzAsIDB4OGUzYywgMHg2MjE4LCAweGEyOTAsIDB4MDAyOCwgMHgyMjE0LAorCTB4MjAwOSwgMHgwMDAwLCAweDEwNzgsIDB4Mjg1YiwgMHgxMDc4LCAweDc2MDgsIDB4MDA3OCwgMHg4ZTQ0LAorCTB4MTA3OCwgMHg3YTA1LCAweDEwNzgsIDB4NzUzZCwgMHgwZjdmLCAweDBlN2YsIDB4MGQ3ZiwgMHgwMDdjLAorCTB4NzA0YywgMHhhMDgwLCAweDI5M2YsIDB4MjAwNCwgMHg2YTU0LCAweGEyMDYsIDB4MDA0MCwgMHg4ZTM0LAorCTB4MDA3OCwgMHg4ZTNjLCAweDBjN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MGM3ZSwgMHgxMDc4LAorCTB4NzRkNywgMHgwMTdmLCAweDAwNDAsIDB4OGU2YSwgMHg2MTFhLCAweDYwMWYsIDB4MDAwMSwgMHgyZDAwLAorCTB4NjAxMiwgMHgyMDA5LCAweDAwNDMsIDB4MTA3OCwgMHg3NTZjLCAweGEwODUsIDB4MDAwMSwgMHgxMjdmLAorCTB4MGM3ZiwgMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHg4ZTY3LCAweDBkN2UsIDB4MGU3ZSwgMHgwZjdlLAorCTB4MjA3MSwgMHhhMzAwLCAweGExODYsIDB4MDAxNSwgMHgwMGMwLCAweDhlOTMsIDB4NzA3YywgMHhhMDg2LAorCTB4MDAwNCwgMHgwMGMwLCAweDhlOTMsIDB4NjAxMCwgMHhhMGU4LCAweDAwMGYsIDB4MmM3OCwgMHgxMDc4LAorCTB4NjJjNiwgMHgwMDQwLCAweDhlOWIsIDB4NzA2OCwgMHg2YTA4LCAweGEyMDYsIDB4MDBjMCwgMHg4ZThmLAorCTB4NzA2YywgMHg2YTBjLCAweGEyMDYsIDB4MDBjMCwgMHg4ZThmLCAweDEwNzgsIDB4MjgxMywgMHgxMDc4LAorCTB4NzYwOCwgMHgwMDc4LCAweDhlOTcsIDB4MTA3OCwgMHg3YTA1LCAweDEwNzgsIDB4NzUzZCwgMHgwZjdmLAorCTB4MGU3ZiwgMHgwZDdmLCAweDAwN2MsIDB4NzA0YywgMHhhMDgwLCAweDI5M2YsIDB4MjAwNCwgMHg2YTBjLAorCTB4YTIwNiwgMHgwMDQwLCAweDhlOGQsIDB4MDA3OCwgMHg4ZThmLCAweDAxN2UsIDB4MDI3ZSwgMHg2ODRjLAorCTB4ZDBhYywgMHgwMDQwLCAweDhlYmQsIDB4NjkxNCwgMHg2YTEwLCAweDIxMDAsIDB4YTIwNSwgMHgwMDQwLAorCTB4OGViZCwgMHg2ODYwLCAweGExMDYsIDB4MDBjMCwgMHg4ZWI5LCAweDY4NWMsIDB4YTIwNiwgMHgwMDQwLAorCTB4OGViZCwgMHg2OTYyLCAweDZhNWUsIDB4YTA4NSwgMHgwMDAxLCAweDAyN2YsIDB4MDE3ZiwgMHgwMDdjLAorCTB4MGU3ZSwgMHgxMjdlLCAweDIwNzEsIDB4YTMwMCwgMHgyMDkxLCAweDgwMDAsIDB4NzU0NCwgMHhhNTgyLAorCTB4MDAwMSwgMHgwMDQ4LCAweDhlZjIsIDB4NzA0OCwgMHgyMDYwLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAwLAorCTB4MDA0MCwgMHg4ZWRlLCAweGFjZTAsIDB4MDAxMCwgMHg3MDU0LCAweGFjMDIsIDB4MDBjOCwgMHg4ZWRhLAorCTB4MDA3OCwgMHg4ZWNkLCAweDIwNjEsIDB4YWEwMCwgMHgwMDc4LCAweDhlY2QsIDB4NjAwMywgMHgwMDA4LAorCTB4ODUyOSwgMHg3NTQ2LCAweGFjYTgsIDB4MDAxMCwgMHg3MDU0LCAweGE1MDIsIDB4MDBjOCwgMHg4ZWVlLAorCTB4NzU0YSwgMHhhMDg1LCAweDAwMDEsIDB4MTI3ZiwgMHgwZTdmLCAweDAwN2MsIDB4NzA0YiwgMHhhYTAwLAorCTB4MDA3OCwgMHg4ZWU5LCAweGEwMDYsIDB4MDA3OCwgMHg4ZWViLCAweDBjN2UsIDB4MDI3ZSwgMHgwMTdlLAorCTB4YTE4NiwgMHgwMDM1LCAweDAwNDAsIDB4OGVmZiwgMHg2YTM0LCAweDAwNzgsIDB4OGYwMCwgMHg2YTI4LAorCTB4MTA3OCwgMHg4YTMwLCAweDAwNDAsIDB4OGYyOSwgMHgyMjYwLCAweDYxMWMsIDB4YTE4NiwgMHgwMDAzLAorCTB4MDA0MCwgMHg4ZjBlLCAweGExODYsIDB4MDAwNiwgMHgwMGMwLCAweDhmMjUsIDB4NjgzNCwgMHhhMjA2LAorCTB4MDA0MCwgMHg4ZjFkLCAweDY4MzgsIDB4YTIwNiwgMHgwMGMwLCAweDhmMjUsIDB4NjEwOCwgMHg2ODM0LAorCTB4YTEwNiwgMHgwMGMwLCAweDhmMjUsIDB4MDA3OCwgMHg4ZjIyLCAweDYwMDgsIDB4NjkzOCwgMHhhMTA2LAorCTB4MDBjMCwgMHg4ZjI1LCAweDYwMTgsIDB4NjkxOCwgMHhhMTA2LCAweDAxN2YsIDB4MDI3ZiwgMHgwYzdmLAorCTB4MDA3YywgMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwgMHg4ZjI1LCAweDA2N2UsIDB4NjAwMCwgMHhhMGIyLAorCTB4MDAxMCwgMHgxMGM4LCAweDEzMjgsIDB4MTA3OSwgMHg4ZjM3LCAweDA2N2YsIDB4MDA3YywgMHg4ZjQ3LAorCTB4OTNiYiwgMHg5NGQzLCAweDhmNDcsIDB4OGY0NywgMHg4ZjQ3LCAweDhmNDcsIDB4OGY0NywgMHg4ZjgxLAorCTB4OTU1ZSwgMHg4ZjQ3LCAweDhmNDcsIDB4OGY0NywgMHg4ZjQ3LCAweDhmNDcsIDB4OGY0NywgMHgxMDc4LAorCTB4MTMyOCwgMHgwNjdlLCAweDYwMDAsIDB4YTBiMiwgMHgwMDEwLCAweDEwYzgsIDB4MTMyOCwgMHgxMDc5LAorCTB4OGY1MywgMHgwNjdmLCAweDAwN2MsIDB4OGY2MywgMHg5OWY2LCAweDhmNjMsIDB4OGY2MywgMHg4ZjYzLAorCTB4OGY2MywgMHg4ZjYzLCAweDhmNjMsIDB4OTliNCwgMHg5YTQ0LCAweDhmNjMsIDB4YTA1MywgMHhhMDg3LAorCTB4YTA1MywgMHhhMDg3LCAweDhmNjMsIDB4MTA3OCwgMHgxMzI4LCAweDA2N2UsIDB4NjAwMCwgMHhhMGIyLAorCTB4MDAxMCwgMHgxMGM4LCAweDEzMjgsIDB4MTA3OSwgMHg4ZjZmLCAweDA2N2YsIDB4MDA3YywgMHg4ZjdmLAorCTB4OTY5ZiwgMHg5NzZhLCAweDk3OTgsIDB4OTgxMywgMHg4ZjdmLCAweDk5MTksIDB4OThjMSwgMHg5NTZhLAorCTB4OTk4OCwgMHg5OTllLCAweDhmN2YsIDB4OGY3ZiwgMHg4ZjdmLCAweDhmN2YsIDB4OGY3ZiwgMHgxMDc4LAorCTB4MTMyOCwgMHhhMWIyLCAweDAwNDQsIDB4MTBjOCwgMHgxMzI4LCAweDIxMDAsIDB4MDA3OSwgMHg4Zjg4LAorCTB4OGZjOCwgMHg5MTlhLCAweDhmYzgsIDB4OGZjOCwgMHg4ZmM4LCAweDkxYTIsIDB4OGZjOCwgMHg4ZmM4LAorCTB4OGZjOCwgMHg4ZmM4LCAweDhmYzgsIDB4OGZjOCwgMHg4ZmM4LCAweDhmYzgsIDB4OGZjOCwgMHg4ZmM4LAorCTB4OGZjOCwgMHg4ZmM4LCAweDhmYzgsIDB4OGZjOCwgMHg4ZmM4LCAweDhmYzgsIDB4OGZjOCwgMHg4ZmNhLAorCTB4OTAyZCwgMHg5MDM4LCAweDkwODEsIDB4OTA5YywgMHg5MTFiLCAweDkxOGIsIDB4OGZjOCwgMHg4ZmM4LAorCTB4OTFhNiwgMHg4ZmM4LCAweDhmYzgsIDB4OTFiNSwgMHg5MWJjLCAweDhmYzgsIDB4OGZjOCwgMHg4ZmM4LAorCTB4OGZjOCwgMHg4ZmM4LCAweDkxZWEsIDB4OGZjOCwgMHg4ZmM4LCAweDkxZjUsIDB4OGZjOCwgMHg4ZmM4LAorCTB4OGZjOCwgMHg4ZmM4LCAweDhmYzgsIDB4OGZjOCwgMHg5MjBhLCAweDhmYzgsIDB4OGZjOCwgMHg4ZmM4LAorCTB4OTI5MSwgMHg4ZmM4LCAweDhmYzgsIDB4OGZjOCwgMHg4ZmM4LCAweDhmYzgsIDB4OGZjOCwgMHg5MzA1LAorCTB4MTA3OCwgMHgxMzI4LCAweDEwNzgsIDB4NDg5NywgMHgwMGMwLCAweDhmZDcsIDB4MjAwMSwgMHhhMzMyLAorCTB4MjAwNCwgMHhhMDg0LCAweDAwMDksIDB4YTA4NiwgMHgwMDA4LCAweDAwYzAsIDB4OGZkZiwgMHg2MDA3LAorCTB4MDAwOSwgMHg2MDJiLCAweDAwMDksIDB4NjAxMywgMHgwMDAwLCAweDAwNzgsIDB4OTE5NSwgMHgxMDc4LAorCTB4NDg4NywgMHgwZTdlLCAweDBjN2UsIDB4MDM3ZSwgMHgwMjdlLCAweDAxN2UsIDB4NjIxOCwgMHgyMjcwLAorCTB4NzJhMCwgMHgwMjdlLCAweDIwMTksIDB4MDAyOSwgMHgxMDc4LCAweDVkNTMsIDB4MDc3ZSwgMHgyMDM5LAorCTB4MDAwMCwgMHgxMDc4LCAweDVjNzgsIDB4MmMwOCwgMHgxMDc4LCAweDljMzgsIDB4MDc3ZiwgMHgwMTdmLAorCTB4MmU2MCwgMHgxMDc4LCAweDQ3MWIsIDB4MDE3ZiwgMHgwMjdmLCAweDAzN2YsIDB4MGM3ZiwgMHgwZTdmLAorCTB4NjYxOCwgMHgwYzdlLCAweDI2NjAsIDB4MTA3OCwgMHg0NTEzLCAweDBjN2YsIDB4YTZiMCwgMHgwMDAxLAorCTB4MjYzNCwgMHhhNjg0LCAweDAwZmYsIDB4YTA4MiwgMHgwMDA2LCAweDAwNDgsIDB4OTAxZiwgMHgxMDc4LAorCTB4OWI2YywgMHgwMGMwLCAweDkwN2IsIDB4MTA3OCwgMHg5YWZkLCAweDAwYzAsIDB4OTAxYiwgMHg2MDA3LAorCTB4MDAwOCwgMHgwMDc4LCAweDkxOTUsIDB4NjAwNywgMHgwMDA5LCAweDAwNzgsIDB4OTE5NSwgMHgxMDc4LAorCTB4OWQ0NSwgMHgwMDQwLCAweDkwMjksIDB4MTA3OCwgMHg5YjZjLCAweDAwNDAsIDB4OTAxMywgMHgwMDc4LAorCTB4OTA3YiwgMHg2MDEzLCAweDE5MDAsIDB4MDA3OCwgMHg5MDFiLCAweDYxMDYsIDB4MTA3OCwgMHg5YWE4LAorCTB4NjAwNywgMHgwMDA2LCAweDAwNzgsIDB4OTE5NSwgMHg2MDA3LCAweDAwMDcsIDB4MDA3OCwgMHg5MTk1LAorCTB4MTA3OCwgMHhhMGJmLCAweDAwYzAsIDB4OTM0MCwgMHgwZDdlLCAweDY2MTgsIDB4MjY2OCwgMHg2ZTA0LAorCTB4YTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4YTY4NiwgMHgwMDA2LCAweDAwNDAsIDB4OTA1ZCwgMHhhNjg2LAorCTB4MDAwNCwgMHgwMDQwLCAweDkwNWQsIDB4NmUwNCwgMHhhNmI0LCAweDAwZmYsIDB4YTY4NiwgMHgwMDA2LAorCTB4MDA0MCwgMHg5MDVkLCAweGE2ODYsIDB4MDAwNCwgMHgwMDQwLCAweDkwNWQsIDB4YTY4NiwgMHgwMDA1LAorCTB4MDA0MCwgMHg5MDVkLCAweDBkN2YsIDB4MDA3OCwgMHg5MDdiLCAweDEwNzgsIDB4OWJkMiwgMHgwMGMwLAorCTB4OTA3NiwgMHhhNjg2LCAweDAwMDYsIDB4MDBjMCwgMHg5MDZmLCAweDAyN2UsIDB4NjIxOCwgMHhhMjkwLAorCTB4MDAyOCwgMHgyMjE0LCAweDIwMDksIDB4MDAwMCwgMHgxMDc4LCAweDI4NWIsIDB4MDI3ZiwgMHgxMDc4LAorCTB4NDU3ZCwgMHg2MDA3LCAweDAwMGEsIDB4MGQ3ZiwgMHgwMDc4LCAweDkxOTUsIDB4NjAwNywgMHgwMDBiLAorCTB4MGQ3ZiwgMHgwMDc4LCAweDkxOTUsIDB4MTA3OCwgMHgyODEzLCAweDYwMDcsIDB4MDAwMSwgMHgwMDc4LAorCTB4OTE5NSwgMHgxMDc4LCAweGEwYmYsIDB4MDBjMCwgMHg5MzQwLCAweDY2MTgsIDB4MGQ3ZSwgMHgyNjY4LAorCTB4NmUwNCwgMHgwZDdmLCAweGE2ODYsIDB4MDcwNywgMHgwMDQwLCAweDkwN2IsIDB4MDI3ZSwgMHg2MjE4LAorCTB4YTI5MCwgMHgwMDI4LCAweDIyMTQsIDB4MjAwOSwgMHgwMDAwLCAweDEwNzgsIDB4Mjg1YiwgMHgwMjdmLAorCTB4NjAwNywgMHgwMDBjLCAweDAwNzgsIDB4OTE5NSwgMHgxMDc4LCAweDQ4OTcsIDB4MDBjMCwgMHg5MGE5LAorCTB4MjAwMSwgMHhhMzMyLCAweDIwMDQsIDB4YTA4NCwgMHgwMDA5LCAweGEwODYsIDB4MDAwOCwgMHgwMGMwLAorCTB4OTBiMSwgMHg2MDA3LCAweDAwMDksIDB4NjAyYiwgMHgwMDA5LCAweDYwMTMsIDB4MDAwMCwgMHgwMDc4LAorCTB4OTE5NSwgMHgxMDc4LCAweDQ4ODcsIDB4NjYxOCwgMHhhNmIwLCAweDAwMDEsIDB4MjYzNCwgMHhhNjg0LAorCTB4MDBmZiwgMHhhMDgyLCAweDAwMDYsIDB4MDA0OCwgMHg5MGY1LCAweGE2YjQsIDB4ZmYwMCwgMHg4NjM3LAorCTB4YTY4NiwgMHgwMDA0LCAweDAwNDAsIDB4OTBjOCwgMHhhNjg2LCAweDAwMDYsIDB4MDBjMCwgMHg5MDdiLAorCTB4MTA3OCwgMHg5YmUxLCAweDAwYzAsIDB4OTBkMCwgMHg2MDA3LCAweDAwMGUsIDB4MDA3OCwgMHg5MTk1LAorCTB4MDQ3ZSwgMHg2NDE4LCAweGE0YTAsIDB4MDAyOCwgMHgyNDI0LCAweGE0YTQsIDB4MDBmZiwgMHg4NDI3LAorCTB4MDQ3ZSwgMHgxMDc4LCAweDI4MTMsIDB4MDQ3ZiwgMHgwMTdlLCAweGEwMDYsIDB4MjAwOSwgMHhhMzUyLAorCTB4MjEwYywgMHhkMWE0LCAweDAwNDAsIDB4OTBlZiwgMHgyMDA5LCAweDAwMjksIDB4MTA3OCwgMHg5ZWMwLAorCTB4NjAxOCwgMHgwZDdlLCAweDIwNjgsIDB4NjgwMCwgMHhjMGU1LCAweDY4MDIsIDB4MGQ3ZiwgMHgwMTdmLAorCTB4MDQ3ZiwgMHg2MDA3LCAweDAwMDEsIDB4MDA3OCwgMHg5MTk1LCAweDIwMDEsIDB4MDAwMSwgMHgxMDc4LAorCTB4NDQyYiwgMHgxNTdlLCAweDAxN2UsIDB4MDI3ZSwgMHgwMzdlLCAweDIwYTksIDB4MDAwNCwgMHgyMDE5LAorCTB4YTMwNSwgMHgyMDExLCAweGE4OTAsIDB4MTA3OCwgMHg3ZTU1LCAweDAzN2YsIDB4MDI3ZiwgMHgwMTdmLAorCTB4MTU3ZiwgMHhhMDA1LCAweDAwNDAsIDB4OTExNSwgMHhhNmI0LCAweGZmMDAsIDB4ODYzNywgMHhhNjg2LAorCTB4MDAwNiwgMHgwMDQwLCAweDkwYzgsIDB4MDA3OCwgMHg5MDdiLCAweDYwMTMsIDB4MTkwMCwgMHg2MDA3LAorCTB4MDAwOSwgMHgwMDc4LCAweDkxOTUsIDB4MTA3OCwgMHg0ODk3LCAweDAwYzAsIDB4OTEyOCwgMHgyMDAxLAorCTB4YTMzMiwgMHgyMDA0LCAweGEwODQsIDB4MDAwOSwgMHhhMDg2LCAweDAwMDgsIDB4MDBjMCwgMHg5MTMwLAorCTB4NjAwNywgMHgwMDA5LCAweDYwMmIsIDB4MDAwOSwgMHg2MDEzLCAweDAwMDAsIDB4MDA3OCwgMHg5MTk1LAorCTB4MTA3OCwgMHg0ODg3LCAweDY2MTgsIDB4YTZiMCwgMHgwMDAxLCAweDI2MzQsIDB4YTY4NCwgMHgwMGZmLAorCTB4YTA4MiwgMHgwMDA2LCAweDAwNDgsIDB4OTE3OCwgMHhhNmI0LCAweGZmMDAsIDB4ODYzNywgMHhhNjg2LAorCTB4MDAwNCwgMHgwMDQwLCAweDkxNDcsIDB4YTY4NiwgMHgwMDA2LCAweDAwYzAsIDB4OTA3YiwgMHgxMDc4LAorCTB4OWMwYywgMHgwMGMwLCAweDkxNTMsIDB4MTA3OCwgMHg5YWZkLCAweDAwYzAsIDB4OTE1MywgMHg2MDA3LAorCTB4MDAxMCwgMHgwMDc4LCAweDkxOTUsIDB4MDQ3ZSwgMHg2NDE4LCAweGE0YTAsIDB4MDAyOCwgMHgyNDI0LAorCTB4YTRhNCwgMHgwMGZmLCAweDg0MjcsIDB4MDQ3ZSwgMHgxMDc4LCAweDI4MTMsIDB4MDQ3ZiwgMHgwMTdlLAorCTB4YTAwNiwgMHgyMDA5LCAweGEzNTIsIDB4MjEwYywgMHhkMWE0LCAweDAwNDAsIDB4OTE3MiwgMHgyMDA5LAorCTB4MDAyOSwgMHgxMDc4LCAweDllYzAsIDB4NjAxOCwgMHgwZDdlLCAweDIwNjgsIDB4NjgwMCwgMHhjMGU1LAorCTB4NjgwMiwgMHgwZDdmLCAweDAxN2YsIDB4MDQ3ZiwgMHg2MDA3LCAweDAwMDEsIDB4MDA3OCwgMHg5MTk1LAorCTB4MTA3OCwgMHg5ZDQ1LCAweDAwNDAsIDB4OTE4NSwgMHhhNmI0LCAweGZmMDAsIDB4ODYzNywgMHhhNjg2LAorCTB4MDAwNiwgMHgwMDQwLCAweDkxNDcsIDB4MDA3OCwgMHg5MDdiLCAweDYwMTMsIDB4MTkwMCwgMHg2MDA3LAorCTB4MDAwOSwgMHgwMDc4LCAweDkxOTUsIDB4MTA3OCwgMHhhMGJmLCAweDAwYzAsIDB4OTM0MCwgMHgxMDc4LAorCTB4OTM0MywgMHgwMGMwLCAweDkwN2IsIDB4NjAwNywgMHgwMDEyLCAweDYwMDMsIDB4MDAwMSwgMHgxMDc4LAorCTB4NWM0NSwgMHgwMDdjLCAweDYwMDcsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4MTA3OCwgMHg1YzQ1LAorCTB4MDA3OCwgMHg5MTk5LCAweDYwMDcsIDB4MDAwNSwgMHgwMDc4LCAweDkxOWMsIDB4MTA3OCwgMHhhMGJmLAorCTB4MDBjMCwgMHg5MzQwLCAweDEwNzgsIDB4OTM0MywgMHgwMGMwLCAweDkwN2IsIDB4NjAwNywgMHgwMDIwLAorCTB4NjAwMywgMHgwMDAxLCAweDEwNzgsIDB4NWM0NSwgMHgwMDdjLCAweDYwMDcsIDB4MDAyMywgMHg2MDAzLAorCTB4MDAwMSwgMHgxMDc4LCAweDVjNDUsIDB4MDA3YywgMHgxMDc4LCAweGEwYmYsIDB4MDBjMCwgMHg5MzQwLAorCTB4MTA3OCwgMHg5MzQzLCAweDAwYzAsIDB4OTA3YiwgMHgwMTdlLCAweDAyN2UsIDB4MjAxMSwgMHhhODkwLAorCTB4MjIxNCwgMHgyYzA4LCAweDEwNzgsIDB4OWU4YywgMHgwMGMwLCAweDkxZGUsIDB4MjE2MCwgMHg2MDA3LAorCTB4MDAyNiwgMHg2MDEzLCAweDE3MDAsIDB4MjAxMSwgMHhhODg5LCAweDIyMTQsIDB4YTI5NiwgMHhmZmZmLAorCTB4MDBjMCwgMHg5MWUzLCAweDYwMDcsIDB4MDAyNSwgMHgwMDc4LCAweDkxZTMsIDB4MTA3OCwgMHg3NTNkLAorCTB4MjE2MCwgMHg2MDA3LCAweDAwMjUsIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsIDB4NWM0NSwgMHgwMjdmLAorCTB4MDE3ZiwgMHgwMDdjLCAweDYxMDYsIDB4MTA3OCwgMHg5MzYzLCAweDYwMDcsIDB4MDAyYiwgMHgwMDc4LAorCTB4OTE5NSwgMHg2MDA3LCAweDAwMmMsIDB4MDA3OCwgMHg5MTk1LCAweDEwNzgsIDB4YTBiZiwgMHgwMGMwLAorCTB4OTM0MCwgMHgxMDc4LCAweDkzNDMsIDB4MDBjMCwgMHg5MDdiLCAweDYxMDYsIDB4MTA3OCwgMHg5MzY4LAorCTB4MDBjMCwgMHg5MjA2LCAweDYwMDcsIDB4MDAyZSwgMHgwMDc4LCAweDkxOTUsIDB4NjAwNywgMHgwMDJmLAorCTB4MDA3OCwgMHg5MTk1LCAweDBlN2UsIDB4MGQ3ZSwgMHgwYzdlLCAweDYwMTgsIDB4YTA4MCwgMHgwMDAxLAorCTB4MjAwYywgMHhhMTg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDAwNDAsIDB4OTIyMywgMHhhMTg0LAorCTB4ZmYwMCwgMHg4MDA3LCAweGEwODYsIDB4MDAwNiwgMHgwMDQwLCAweDkyMjMsIDB4MGM3ZiwgMHgwZDdmLAorCTB4MGU3ZiwgMHgwMDc4LCAweDkxOWEsIDB4MjAwMSwgMHhhMzcxLCAweDIwMDQsIDB4ZDBlNCwgMHgwMDQwLAorCTB4OTI4ZCwgMHgyMDcxLCAweGE4OGMsIDB4NzAxMCwgMHg2MDM2LCAweDcwMTQsIDB4NjAzYSwgMHg3MTA4LAorCTB4NzIwYywgMHgyMDAxLCAweGEzNTIsIDB4MjAwNCwgMHhkMGE0LCAweDAwNDAsIDB4OTI0MSwgMHg2MDE4LAorCTB4MjA2OCwgMHg2ODEwLCAweGExMDYsIDB4MDBjMCwgMHg5MjQxLCAweDY4MTQsIDB4YTIwNiwgMHgwMDQwLAorCTB4OTI2NSwgMHgyMDAxLCAweGEzNTIsIDB4MjAwNCwgMHhkMGFjLCAweDAwYzAsIDB4OTI4MSwgMHgyMDY5LAorCTB4YTMwMCwgMHg2ODZjLCAweGEyMDYsIDB4MDBjMCwgMHg5MjgxLCAweDY4NjgsIDB4YTEwNiwgMHgwMGMwLAorCTB4OTI4MSwgMHg3MjEwLCAweDEwNzgsIDB4OGEzMCwgMHgwMDQwLCAweDkyODcsIDB4MTA3OCwgMHg5ZjMxLAorCTB4MDA0MCwgMHg5Mjg3LCAweDYyMmEsIDB4NjAwNywgMHgwMDM2LCAweDYwMDMsIDB4MDAwMSwgMHgxMDc4LAorCTB4NWJmOCwgMHgwYzdmLCAweDBkN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDcyMTQsIDB4YTI4NiwgMHhmZmZmLAorCTB4MDA0MCwgMHg5Mjc3LCAweDEwNzgsIDB4OGEzMCwgMHgwMDQwLCAweDkyODcsIDB4YTI4MCwgMHgwMDAyLAorCTB4MjAwNCwgMHg3MTEwLCAweGExMDYsIDB4MDBjMCwgMHg5Mjg3LCAweDAwNzgsIDB4OTI1MiwgMHg3MjEwLAorCTB4MmMwOCwgMHgxMDc4LCAweDllOGMsIDB4MmMxMCwgMHgyMTYwLCAweDAwNDAsIDB4OTI4NywgMHgwMDc4LAorCTB4OTI1MiwgMHg2MDA3LCAweDAwMzcsIDB4NjAxMywgMHgxNTAwLCAweDAwNzgsIDB4OTI1ZCwgMHg2MDA3LAorCTB4MDAzNywgMHg2MDEzLCAweDE3MDAsIDB4MDA3OCwgMHg5MjVkLCAweDYwMDcsIDB4MDAxMiwgMHgwMDc4LAorCTB4OTI1ZCwgMHg2MDE4LCAweGEwODAsIDB4MDAwMSwgMHgyMDA0LCAweGEwODQsIDB4ZmYwMCwgMHg4MDA3LAorCTB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4OTE5YSwgMHgwZTdlLCAweDBkN2UsIDB4MGM3ZSwgMHgyMDAxLAorCTB4YTM3MSwgMHgyMDA0LCAweGQwZTQsIDB4MDA0MCwgMHg5MmZkLCAweDIwNjksIDB4YTMwMCwgMHgyMDcxLAorCTB4YTg4YywgMHg3MDA4LCAweDYwMzYsIDB4NzIwYywgMHg2MjNhLCAweGEyODYsIDB4ZmZmZiwgMHgwMGMwLAorCTB4OTJiYSwgMHg3MjA4LCAweDBjN2UsIDB4MmMwOCwgMHgxMDc4LCAweDllOGMsIDB4MmMxMCwgMHgwYzdmLAorCTB4MDA0MCwgMHg5MmYxLCAweDEwNzgsIDB4OGEzMCwgMHgwMDQwLCAweDkyZjEsIDB4MGM3ZSwgMHgwMjdlLAorCTB4MjI2MCwgMHgxMDc4LCAweDg3NGEsIDB4MDI3ZiwgMHgwYzdmLCAweDcxMTgsIDB4YTE4YywgMHhmZjAwLAorCTB4ODEwZiwgMHhhMTg2LCAweDAwMDEsIDB4MDA0MCwgMHg5MmRiLCAweGExODYsIDB4MDAwNSwgMHgwMDQwLAorCTB4OTJkNSwgMHhhMTg2LCAweDAwMDcsIDB4MDBjMCwgMHg5MmU1LCAweGEyODAsIDB4MDAwNCwgMHgyMDA0LAorCTB4YTAwNSwgMHgwMDQwLCAweDkyZTUsIDB4MDU3ZSwgMHg3NTEwLCAweDc2MTQsIDB4MTA3OCwgMHg5ZjQ2LAorCTB4MDU3ZiwgMHgwYzdmLCAweDBkN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDYwMDcsIDB4MDAzYiwgMHg2MDJiLAorCTB4MDAwOSwgMHg2MDEzLCAweDJhMDAsIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsIDB4NWJmOCwgMHgwMDc4LAorCTB4OTJlMSwgMHg2MDA3LCAweDAwM2IsIDB4NjAyYiwgMHgwMDA5LCAweDYwMTMsIDB4MTcwMCwgMHg2MDAzLAorCTB4MDAwMSwgMHgxMDc4LCAweDViZjgsIDB4MDA3OCwgMHg5MmUxLCAweDYwMDcsIDB4MDAzYiwgMHg2MDJiLAorCTB4MDAwYiwgMHg2MDEzLCAweDAwMDAsIDB4MDA3OCwgMHg5MjVkLCAweDBlN2UsIDB4MDI3ZSwgMHgxMDc4LAorCTB4NDg5NywgMHgwMDQwLCAweDkzM2EsIDB4MTA3OCwgMHg0ODg3LCAweDEwNzgsIDB4YTE0OCwgMHgwMGMwLAorCTB4OTMzOCwgMHgyMDcxLCAweGEzMDAsIDB4NzBjOCwgMHhjMDg1LCAweDcwY2EsIDB4MGY3ZSwgMHgyMDc5LAorCTB4MDEwMCwgMHg3Mjk0LCAweGEyODQsIDB4MDBmZiwgMHg3MDZhLCAweDc4ZTYsIDB4YTI4NCwgMHhmZjAwLAorCTB4NzI2YywgMHhhMjA1LCAweDcwNmUsIDB4NzhlYSwgMHgwZjdmLCAweDcwZDMsIDB4MDAwMCwgMHgyMDAxLAorCTB4YTM1MiwgMHgyMDA0LCAweGQwYTQsIDB4MDA0MCwgMHg5MzMxLCAweDIwMTEsIDB4YTVjNCwgMHgyMDEzLAorCTB4MDdkMCwgMHhkMGFjLCAweDAwYzAsIDB4OTMzYSwgMHgxMDc4LCAweDI2MGQsIDB4MDA3OCwgMHg5MzNhLAorCTB4MTA3OCwgMHhhMTc4LCAweDAyN2YsIDB4MGU3ZiwgMHgxMDc4LCAweDc1M2QsIDB4MDA3OCwgMHg5MTk5LAorCTB4MTA3OCwgMHg3NTNkLCAweDAwN2MsIDB4MGQ3ZSwgMHgwNjdlLCAweDY2MTgsIDB4MjY2OCwgMHg2ZTA0LAorCTB4YTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4YTY4NiwgMHgwMDA2LCAweDAwNDAsIDB4OTM2MCwgMHhhNjg2LAorCTB4MDAwNCwgMHgwMDQwLCAweDkzNjAsIDB4NmUwNCwgMHhhNmI0LCAweDAwZmYsIDB4YTY4NiwgMHgwMDA2LAorCTB4MDA0MCwgMHg5MzYwLCAweGE2ODYsIDB4MDAwNCwgMHgwMDQwLCAweDkzNjAsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDY3ZiwgMHgwZDdmLCAweDAwN2MsIDB4MGQ3ZSwgMHgxMDc4LCAweDkzOTcsIDB4MGQ3ZiwgMHgwMDdjLAorCTB4MGQ3ZSwgMHgxMDc4LCAweDkzYTYsIDB4MDBjMCwgMHg5MzkwLCAweDY4MGMsIDB4YTA4YywgMHhmZjAwLAorCTB4NjgyMCwgMHhhMDg0LCAweDAwZmYsIDB4YTExNSwgMHg2MjEyLCAweDY4MjQsIDB4NjAyYSwgMHhkMWU0LAorCTB4MDA0MCwgMHg5MzdlLCAweDIwMDksIDB4MDAwMSwgMHgwMDc4LCAweDkzOGMsIDB4ZDFlYywgMHgwMDQwLAorCTB4OTM5MCwgMHg2OTIwLCAweGExOGMsIDB4MDBmZiwgMHg2ODI0LCAweDEwNzgsIDB4MjRlMywgMHgwMGMwLAorCTB4OTM5MCwgMHgyMTEwLCAweDIwMDksIDB4MDAwMCwgMHgxMDc4LCAweDI4NWIsIDB4MDA3OCwgMHg5Mzk0LAorCTB4YTA4NSwgMHgwMDAxLCAweDAwNzgsIDB4OTM5NSwgMHhhMDA2LCAweDBkN2YsIDB4MDA3YywgMHgyMDY5LAorCTB4YTg4ZCwgMHg2ODAwLCAweGEwODIsIDB4MDAxMCwgMHgwMGM4LCAweDkzYTQsIDB4NjAxMywgMHgwMDAwLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwNzgsIDB4OTNhNSwgMHhhMDA2LCAweDAwN2MsIDB4NjAxMywgMHgwMDAwLAorCTB4MjA2OSwgMHhhODhjLCAweDY4MDgsIDB4YTA4NCwgMHhmZjAwLCAweGEwODYsIDB4MDgwMCwgMHgwMGMwLAorCTB4OTNiYSwgMHg2ODAwLCAweGEwODQsIDB4MDBmZiwgMHhhMDhlLCAweDAwMTQsIDB4MDA0MCwgMHg5M2JhLAorCTB4YTA4ZSwgMHgwMDEwLCAweDAwN2MsIDB4NjAwNCwgMHhhMGIyLCAweDAwNDQsIDB4MTBjOCwgMHgxMzI4LAorCTB4YTFiNiwgMHgwMDEzLCAweDAwYzAsIDB4OTNjNywgMHgyMDA4LCAweDAwNzksIDB4OTNkYSwgMHhhMWI2LAorCTB4MDAyNywgMHgwMDQwLCAweDkzY2YsIDB4YTFiNiwgMHgwMDE0LCAweDEwYzAsIDB4MTMyOCwgMHgyMDAxLAorCTB4MDAwNywgMHgxMDc4LCAweDQ0NzIsIDB4MTA3OCwgMHg2MDEwLCAweDEwNzgsIDB4OGMwMSwgMHgxMDc4LAorCTB4NjEwOSwgMHgwMDdjLCAweDk0MWEsIDB4OTQxYywgMHg5NDFhLCAweDk0MWEsIDB4OTQxYSwgMHg5NDFjLAorCTB4OTQyNCwgMHg5NGFlLCAweDk0NzEsIDB4OTRhZSwgMHg5NDg1LCAweDk0YWUsIDB4OTQyNCwgMHg5NGFlLAorCTB4OTRhNiwgMHg5NGFlLCAweDk0YTYsIDB4OTRhZSwgMHg5NGFlLCAweDk0MWEsIDB4OTQxYSwgMHg5NDFhLAorCTB4OTQxYSwgMHg5NDFhLCAweDk0MWEsIDB4OTQxYSwgMHg5NDFhLCAweDk0MWEsIDB4OTQxYSwgMHg5NDFhLAorCTB4OTQxYywgMHg5NDFhLCAweDk0YWUsIDB4OTQxYSwgMHg5NDFhLCAweDk0YWUsIDB4OTQxYSwgMHg5NGFlLAorCTB4OTRhZSwgMHg5NDFhLCAweDk0MWEsIDB4OTQxYSwgMHg5NDFhLCAweDk0YWUsIDB4OTRhZSwgMHg5NDFhLAorCTB4OTRhZSwgMHg5NGFlLCAweDk0MWEsIDB4OTQxYSwgMHg5NDFhLCAweDk0MWEsIDB4OTQxYSwgMHg5NDFjLAorCTB4OTRhZSwgMHg5NGFlLCAweDk0MWEsIDB4OTQxYSwgMHg5NGFlLCAweDk0YWUsIDB4OTQxYSwgMHg5NDFhLAorCTB4OTQxYSwgMHg5NDFhLCAweDEwNzgsIDB4MTMyOCwgMHgxMDc4LCAweDYwMTAsIDB4NjAwMywgMHgwMDAyLAorCTB4MTA3OCwgMHg2MTA5LCAweDAwNzgsIDB4OTRiNCwgMHgwZjdlLCAweDIwNzksIDB4YTM1MSwgMHg3ODA0LAorCTB4MGY3ZiwgMHhkMGFjLCAweDAwYzAsIDB4OTRhZSwgMHgyMDAxLCAweDAwMDAsIDB4MTA3OCwgMHg0NDJiLAorCTB4NjAxOCwgMHhhMDgwLCAweDAwMDQsIDB4MjAwNCwgMHhhMDg2LCAweDAwZmYsIDB4MDA0MCwgMHg5NGFlLAorCTB4MGM3ZSwgMHg2MDE4LCAweDIwNjAsIDB4NjAwMCwgMHhkMGY0LCAweDAwYzAsIDB4OTQ0OCwgMHg2MDEwLAorCTB4YTAwNSwgMHgwMDQwLCAweDk0NDgsIDB4MGM3ZiwgMHgxMDc4LCAweDM1ZjcsIDB4MDA3OCwgMHg5NGFlLAorCTB4MGM3ZiwgMHgyMDAxLCAweGEzMDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHg5NDU3LAorCTB4MGY3ZSwgMHgyMDc5LCAweGEzMDAsIDB4Nzg4YywgMHg4MDAwLCAweDc4OGUsIDB4MGY3ZiwgMHgyMDAxLAorCTB4MDAwMiwgMHgxMDc4LCAweDQ0M2YsIDB4MTA3OCwgMHg2MDEwLCAweDYwMWYsIDB4MDAwMSwgMHg2MDAzLAorCTB4MDAwMSwgMHg2MDA3LCAweDAwMDIsIDB4MTA3OCwgMHg1YzQ1LCAweDEwNzgsIDB4NjEwOSwgMHgwYzdlLAorCTB4NjExOCwgMHgyMTYwLCAweDIwMDksIDB4MDAwMSwgMHgxMDc4LCAweDU4ZTEsIDB4MGM3ZiwgMHgwMDc4LAorCTB4OTRiNCwgMHg2NjE4LCAweDBkN2UsIDB4MjY2OCwgMHg2ZTA0LCAweDBkN2YsIDB4YTZiNCwgMHhmZjAwLAorCTB4ODYzNywgMHhhNjg2LCAweDAwMDYsIDB4MDA0MCwgMHg5NGFlLCAweGE2ODYsIDB4MDAwNCwgMHgwMDQwLAorCTB4OTRhZSwgMHgyMDAxLCAweDAwMDQsIDB4MDA3OCwgMHg5NGFjLCAweDIwMDEsIDB4YTMwMCwgMHgyMDA0LAorCTB4YTA4NiwgMHgwMDAzLCAweDAwYzAsIDB4OTQ4ZSwgMHgxMDc4LCAweDM1ZjcsIDB4MjAwMSwgMHgwMDA2LAorCTB4MTA3OCwgMHg5NGI1LCAweDY2MTgsIDB4MGQ3ZSwgMHgyNjY4LCAweDZlMDQsIDB4MGQ3ZiwgMHhhNmI0LAorCTB4ZmYwMCwgMHg4NjM3LCAweGE2ODYsIDB4MDAwNiwgMHgwMDQwLCAweDk0YWUsIDB4MjAwMSwgMHgwMDA2LAorCTB4MDA3OCwgMHg5NGFjLCAweDIwMDEsIDB4MDAwNCwgMHgwMDc4LCAweDk0YWMsIDB4MjAwMSwgMHgwMDA2LAorCTB4MTA3OCwgMHg5NGI1LCAweDAwNzgsIDB4OTRhZSwgMHgxMDc4LCAweDQ0NzIsIDB4MTA3OCwgMHg2MDEwLAorCTB4MTA3OCwgMHg3NTNkLCAweDEwNzgsIDB4NjEwOSwgMHgwMDdjLCAweDAxN2UsIDB4MGQ3ZSwgMHg2MTE4LAorCTB4MjE2OCwgMHg2OTAwLCAweGQxODQsIDB4MDA0MCwgMHg5NGQwLCAweDYxMDQsIDB4YTE4ZSwgMHgwMDBhLAorCTB4MDBjMCwgMHg5NGM4LCAweDY5OWMsIDB4ZDFhNCwgMHgwMGMwLCAweDk0YzgsIDB4MjAwMSwgMHgwMDA3LAorCTB4MTA3OCwgMHg0NDNmLCAweDIwMDEsIDB4MDAwMCwgMHgxMDc4LCAweDQ0MmIsIDB4MTA3OCwgMHgyODM5LAorCTB4MGQ3ZiwgMHgwMTdmLCAweDAwN2MsIDB4MGQ3ZSwgMHg2NjE4LCAweDI2NjgsIDB4NjgwNCwgMHhhMDg0LAorCTB4ZmYwMCwgMHg4MDA3LCAweDBkN2YsIDB4YTBiMiwgMHgwMDBjLCAweDEwYzgsIDB4MTMyOCwgMHhhMWI2LAorCTB4MDAxNSwgMHgwMGMwLCAweDk0ZTcsIDB4MTA3OSwgMHg5NGVlLCAweDAwNzgsIDB4OTRlZCwgMHhhMWI2LAorCTB4MDAxNiwgMHgxMGMwLCAweDEzMjgsIDB4MTA3OSwgMHg5NGZhLCAweDAwN2MsIDB4N2FkMCwgMHg3YWQwLAorCTB4N2FkMCwgMHg3YWQwLCAweDdhZDAsIDB4N2FkMCwgMHg5NTQ3LCAweDk1MDYsIDB4N2FkMCwgMHg3YWQwLAorCTB4N2FkMCwgMHg3YWQwLCAweDdhZDAsIDB4N2FkMCwgMHg3YWQwLCAweDdhZDAsIDB4N2FkMCwgMHg3YWQwLAorCTB4OTU0NywgMHg5NTRmLCAweDdhZDAsIDB4N2FkMCwgMHg3YWQwLCAweDdhZDAsIDB4MGY3ZSwgMHgyMDc5LAorCTB4YTM1MSwgMHg3ODA0LCAweGQwYWMsIDB4MDBjMCwgMHg5NTJkLCAweDYwMTgsIDB4YTA3ZCwgMHgwMDQwLAorCTB4OTUyZCwgMHg3ODAwLCAweGQwZjQsIDB4MDBjMCwgMHg5NTE5LCAweDc4MTAsIDB4YTAwNSwgMHgwMGMwLAorCTB4OTUyZCwgMHgyMDAxLCAweDAwMDAsIDB4MTA3OCwgMHg0NDJiLCAweDIwMDEsIDB4MDAwMiwgMHgxMDc4LAorCTB4NDQzZiwgMHg2MDFmLCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMiwgMHgxMDc4LAorCTB4NWM0NSwgMHgxMDc4LCAweDYxMDksIDB4MDA3OCwgMHg5NTQ1LCAweDIwMTEsIDB4YTg4MywgMHgyMjA0LAorCTB4ODIxMSwgMHgyMjBjLCAweDEwNzgsIDB4MjRlMywgMHgwMGMwLCAweDk1NDUsIDB4MGM3ZSwgMHgxMDc4LAorCTB4NDUwMSwgMHgwMDQwLCAweDk1NDAsIDB4MGM3ZiwgMHgxMDc4LCAweDc1M2QsIDB4MDA3OCwgMHg5NTQ1LAorCTB4MTA3OCwgMHg0MjM1LCAweDBjN2YsIDB4MTA3OCwgMHg3NTNkLCAweDBmN2YsIDB4MDA3YywgMHg2NjA0LAorCTB4YTZiNiwgMHgwMDFlLCAweDAwYzAsIDB4OTU0ZSwgMHgxMDc4LCAweDc1M2QsIDB4MDA3YywgMHgxMDc4LAorCTB4N2QwYSwgMHgwMGMwLCAweDk1NWIsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHgxMDc4LAorCTB4NWM0NSwgMHgwMDc4LCAweDk1NWQsIDB4MTA3OCwgMHg3NTNkLCAweDAwN2MsIDB4NjAwNCwgMHhhMDhhLAorCTB4MDA0NCwgMHgxMGM4LCAweDEzMjgsIDB4MTA3OCwgMHg2MDEwLCAweDEwNzgsIDB4OGMwMSwgMHgxMDc4LAorCTB4NjEwOSwgMHgwMDdjLCAweGExODIsIDB4MDA0MCwgMHgwMDc5LCAweDk1NmUsIDB4OTU4MSwgMHg5NTgxLAorCTB4OTU4MSwgMHg5NTgxLCAweDk1ODMsIDB4OTU4MSwgMHg5NTgxLCAweDk1ODEsIDB4OTU4MSwgMHg5NTgxLAorCTB4OTU4MSwgMHg5NTgxLCAweDk1ODEsIDB4OTU4MSwgMHg5NTgxLCAweDk1ODEsIDB4OTU4MSwgMHg5NTgxLAorCTB4OTU4MSwgMHgxMDc4LCAweDEzMjgsIDB4MGQ3ZSwgMHgwZTdlLCAweDBmN2UsIDB4MTU3ZSwgMHgwNDdlLAorCTB4MDI3ZSwgMHg2MjE4LCAweGEyODAsIDB4MDAyYiwgMHgyMDA0LCAweGEwMDUsIDB4MDA0MCwgMHg5NTk0LAorCTB4MjAyMSwgMHgwMDAwLCAweDEwNzgsIDB4YTExMSwgMHg2MTA2LCAweDIwNzEsIDB4YTg4MCwgMHg3NDQ0LAorCTB4YTRhNCwgMHhmZjAwLCAweDAwNDAsIDB4OTVlYiwgMHhhNDg2LCAweDIwMDAsIDB4MDBjMCwgMHg5NWE2LAorCTB4MjAwOSwgMHgwMDAxLCAweDIwMTEsIDB4MDIwMCwgMHgxMDc4LCAweDVhNmQsIDB4MTA3OCwgMHgxMzgxLAorCTB4MTA0MCwgMHgxMzI4LCAweDYwMDMsIDB4MDAwNywgMHgyZDAwLCAweDY4MzcsIDB4MDEwZCwgMHg2ODAzLAorCTB4MDAwMCwgMHg2ODNiLCAweDAwMDAsIDB4NmM1YSwgMHgyYzAwLCAweDY4NWUsIDB4NjAwOCwgMHg2OGIyLAorCTB4NjAxOCwgMHgyMDc4LCAweDc4YTAsIDB4ODAwNywgMHg3MTMwLCAweDY5NGEsIDB4MDE3ZSwgMHhhMDg0LAorCTB4ZmYwMCwgMHg2ODQ2LCAweDY4NGYsIDB4MDAwMCwgMHg2ODU3LCAweDAwMzYsIDB4MTA3OCwgMHg0OTgyLAorCTB4MDE3ZiwgMHhhNDg2LCAweDIwMDAsIDB4MDBjMCwgMHg5NWQzLCAweDIwMTksIDB4MDAxNywgMHgxMDc4LAorCTB4OWUzYiwgMHgwMDc4LCAweDk2NDUsIDB4YTQ4NiwgMHgwNDAwLCAweDAwYzAsIDB4OTVkZCwgMHgyMDE5LAorCTB4MDAwMiwgMHgxMDc4LCAweDlkZWMsIDB4MDA3OCwgMHg5NjQ1LCAweGE0ODYsIDB4MDIwMCwgMHgwMGMwLAorCTB4OTVlMywgMHgxMDc4LCAweDlkZDEsIDB4YTQ4NiwgMHgxMDAwLCAweDAwYzAsIDB4OTVlOSwgMHgxMDc4LAorCTB4OWUyMCwgMHgwMDc4LCAweDk2NDUsIDB4MjA2OSwgMHhhNjJkLCAweDZhMDAsIDB4ZDI4NCwgMHgwMDQwLAorCTB4OTY5YiwgMHhhMjg0LCAweDAzMDAsIDB4MDBjMCwgMHg5NjkzLCAweDY4MDQsIDB4YTAwNSwgMHgwMDQwLAorCTB4OTY4MywgMHgyZDc4LCAweDYwMDMsIDB4MDAwNywgMHgxMDc4LCAweDEzNjYsIDB4MDA0MCwgMHg5NjRjLAorCTB4NzgwMCwgMHhkMDhjLCAweDAwYzAsIDB4OTYwNywgMHg3ODA0LCAweDgwMDEsIDB4NzgwNiwgMHg2MDEzLAorCTB4MDAwMCwgMHg2ODAzLCAweDAwMDAsIDB4NjgzNywgMHgwMTE2LCAweDY4M2IsIDB4MDAwMCwgMHg2MDA4LAorCTB4NjhiMiwgMHgyYzAwLCAweDY4NGEsIDB4NjAxOCwgMHgyMDc4LCAweDc4YTAsIDB4ODAwNywgMHg3MTMwLAorCTB4Njk4NiwgMHg2ODQ2LCAweDY4NTMsIDB4MDAzZCwgMHg3MjQ0LCAweGEyOTQsIDB4MDAwMywgMHhhMjg2LAorCTB4MDAwMiwgMHgwMGMwLCAweDk2MjcsIDB4Njg0ZiwgMHgwMDQwLCAweDAwNzgsIDB4OTYzMSwgMHhhMjg2LAorCTB4MDAwMSwgMHgwMGMwLCAweDk2MmYsIDB4Njg0ZiwgMHgwMDgwLCAweDAwNzgsIDB4OTYzMSwgMHg2ODRmLAorCTB4MDAwMCwgMHgyMGE5LCAweDAwMGEsIDB4MjAwMSwgMHhhODkwLCAweGFkOTAsIDB4MDAxNSwgMHgyMDBjLAorCTB4ODEwZiwgMHgyMTEyLCAweDgwMDAsIDB4ODIxMCwgMHgwMGYwLCAweDk2MzcsIDB4MjAwYywgMHg2OTgyLAorCTB4ODAwMCwgMHgyMDBjLCAweDY5N2UsIDB4MTA3OCwgMHg0OTgyLCAweDAyN2YsIDB4MDQ3ZiwgMHgxNTdmLAorCTB4MGY3ZiwgMHgwZTdmLCAweDBkN2YsIDB4MDA3YywgMHg2MDEzLCAweDAxMDAsIDB4NjAwMywgMHgwMDAxLAorCTB4NjAwNywgMHgwMDQxLCAweDEwNzgsIDB4NWJmOCwgMHgxMDc4LCAweDYxMDksIDB4MDA3OCwgMHg5NjQ1LAorCTB4MjA2OSwgMHhhODkyLCAweDJkMDQsIDB4YTA4NCwgMHhmZjAwLCAweGEwODYsIDB4MTIwMCwgMHgwMGMwLAorCTB4OTY3NywgMHgyMDY5LCAweGE4ODAsIDB4Njg2YywgMHhhMDg0LCAweDAwZmYsIDB4MDE3ZSwgMHg2MTEwLAorCTB4YTE4YywgMHgwNzAwLCAweGExMGQsIDB4NjExMiwgMHgwMTdmLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDA0MywgMHgxMDc4LCAweDViZjgsIDB4MTA3OCwgMHg2MTA5LCAweDAwNzgsIDB4OTY0NSwgMHg2MDEzLAorCTB4MDIwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDQxLCAweDEwNzgsIDB4NWJmOCwgMHgxMDc4LAorCTB4NjEwOSwgMHgwMDc4LCAweDk2NDUsIDB4NjAxMywgMHgwMzAwLCAweDAwNzgsIDB4OTY4OSwgMHg2MDEzLAorCTB4MDEwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDQxLCAweDEwNzgsIDB4NWJmOCwgMHgxMDc4LAorCTB4NjEwOSwgMHgwMDc4LCAweDk2NDUsIDB4NjAxMywgMHgwNTAwLCAweDAwNzgsIDB4OTY4OSwgMHg2MDEzLAorCTB4MDYwMCwgMHgwMDc4LCAweDk2NTgsIDB4NjAxMywgMHgwMjAwLCAweDAwNzgsIDB4OTY1OCwgMHhhMTg2LAorCTB4MDAxMywgMHgwMGMwLCAweDk2YjEsIDB4NjAwNCwgMHhhMDhhLCAweDAwNDAsIDB4MTA0OCwgMHgxMzI4LAorCTB4YTA4YSwgMHgwMDUzLCAweDEwYzgsIDB4MTMyOCwgMHhhMDgyLCAweDAwNDAsIDB4MjAwOCwgMHgwMDc5LAorCTB4OTcyNSwgMHhhMTg2LCAweDAwNTEsIDB4MDA0MCwgMHg5NmJlLCAweGExODYsIDB4MDA0NywgMHgwMGMwLAorCTB4OTZkNywgMHg2MDA0LCAweGEwODYsIDB4MDA0MSwgMHgwMDQwLCAweDk2ZTUsIDB4MjAwMSwgMHgwMTA5LAorCTB4MjAwNCwgMHhkMDg0LCAweDAwNDAsIDB4OTZlNSwgMHgxMjdlLCAweDIwOTEsIDB4MjIwMCwgMHgwMDdlLAorCTB4MDE3ZSwgMHgwMjdlLCAweDEwNzgsIDB4NWFkMiwgMHgwMjdmLCAweDAxN2YsIDB4MDA3ZiwgMHgxMjdmLAorCTB4NjAwMCwgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHg5NmU1LCAweDAwNzgsIDB4OTc2YSwgMHhhMTg2LAorCTB4MDAyNywgMHgwMDQwLCAweDk2ZGYsIDB4YTE4NiwgMHgwMDE0LCAweDEwYzAsIDB4MTMyOCwgMHg2MDA0LAorCTB4YTA4MiwgMHgwMDQwLCAweDIwMDgsIDB4MDA3OSwgMHg5NmU4LCAweDEwNzgsIDB4NzU4MywgMHgwMDdjLAorCTB4OTZmYiwgMHg5NmZkLCAweDk2ZmQsIDB4OTZmYiwgMHg5NmZiLCAweDk2ZmIsIDB4OTZmYiwgMHg5NmZiLAorCTB4OTZmYiwgMHg5NmZiLCAweDk2ZmIsIDB4OTZmYiwgMHg5NmZiLCAweDk2ZmIsIDB4OTZmYiwgMHg5NmZiLAorCTB4OTZmYiwgMHg5NmZiLCAweDk2ZmIsIDB4MTA3OCwgMHgxMzI4LCAweDEwNzgsIDB4NjAxMCwgMHgxMDc4LAorCTB4NjEwOSwgMHgwMzdlLCAweDBkN2UsIDB4NjAxMCwgMHhhMDZkLCAweDAwNDAsIDB4OTcyMiwgMHhhZDg0LAorCTB4ZjAwMCwgMHgwMDQwLCAweDk3MjIsIDB4NjAwMywgMHgwMDAyLCAweDYwMTgsIDB4MjAwNCwgMHhkMGJjLAorCTB4MDBjMCwgMHg5NzIyLCAweDIwMTksIDB4MDAwNCwgMHgxMDc4LCAweDllNzAsIDB4NjAxMywgMHgwMDAwLAorCTB4NjAxNCwgMHhhMDA1LCAweDAwYzAsIDB4OTcyMCwgMHgyMDAxLCAweGE1YTEsIDB4MjAwNCwgMHg2MDE2LAorCTB4NjAwMywgMHgwMDA3LCAweDBkN2YsIDB4MDM3ZiwgMHgwMDdjLCAweDk3MzgsIDB4OTc1NywgMHg5NzQxLAorCTB4OTc2NCwgMHg5NzM4LCAweDk3MzgsIDB4OTczOCwgMHg5NzM4LCAweDk3MzgsIDB4OTczOCwgMHg5NzM4LAorCTB4OTczOCwgMHg5NzM4LCAweDk3MzgsIDB4OTczOCwgMHg5NzM4LCAweDk3MzgsIDB4OTczOCwgMHg5NzM4LAorCTB4MTA3OCwgMHgxMzI4LCAweDYwMTAsIDB4YTA4OCwgMHgwMDEzLCAweDIxMDQsIDB4YTA4NSwgMHgwNDAwLAorCTB4MjAwYSwgMHgxMDc4LCAweDYwMTAsIDB4NjAxMCwgMHhhMDgwLCAweDAwMTMsIDB4MjAwNCwgMHhkMGI0LAorCTB4MDA0MCwgMHg5NzUyLCAweDYwMDMsIDB4MDAwNywgMHgyMDA5LCAweDAwNDMsIDB4MTA3OCwgMHg3NTZjLAorCTB4MDA3OCwgMHg5NzU0LCAweDYwMDMsIDB4MDAwMiwgMHgxMDc4LCAweDYxMDksIDB4MDA3YywgMHgxMDc4LAorCTB4NjAxMCwgMHgxMDc4LCAweGEwYzYsIDB4MDBjMCwgMHg5NzYxLCAweDEwNzgsIDB4NWE0MSwgMHgxMDc4LAorCTB4NzUzZCwgMHgxMDc4LCAweDYxMDksIDB4MDA3YywgMHgxMDc4LCAweDYwMTAsIDB4MjAwOSwgMHgwMDQxLAorCTB4MDA3OCwgMHg5OGMxLCAweGExODIsIDB4MDA0MCwgMHgwMDc5LCAweDk3NmUsIDB4OTc4MSwgMHg5NzgzLAorCTB4OTc4MSwgMHg5NzgxLCAweDk3ODEsIDB4OTc4MSwgMHg5NzgxLCAweDk3ODQsIDB4OTc4MSwgMHg5NzgxLAorCTB4OTc4MSwgMHg5NzgxLCAweDk3ODEsIDB4OTc4MSwgMHg5NzgxLCAweDk3ODEsIDB4OTc4MSwgMHg5NzhmLAorCTB4OTc4MSwgMHgxMDc4LCAweDEzMjgsIDB4MDA3YywgMHg2MDAzLCAweDAwMDQsIDB4NjExMCwgMHgyMGUxLAorCTB4MDAwNSwgMHgzZDE4LCAweDNlMjAsIDB4MmMxMCwgMHgxMDc4LCAweDE1ZWMsIDB4MDA3YywgMHgwZDdlLAorCTB4MTA3OCwgMHg1YTQxLCAweDBkN2YsIDB4MTA3OCwgMHhhMTM0LCAweDEwNzgsIDB4NzUzZCwgMHgwMDdjLAorCTB4YTE4MiwgMHgwMDQwLCAweDAwNzksIDB4OTc5YywgMHg5N2FmLCAweDk3YWYsIDB4OTdhZiwgMHg5N2FmLAorCTB4OTdhZiwgMHg5N2FmLCAweDk3YWYsIDB4OTdiMSwgMHg5N2FmLCAweDk3YjQsIDB4OTdkZiwgMHg5N2FmLAorCTB4OTdhZiwgMHg5N2FmLCAweDk3YWYsIDB4OTdkZiwgMHg5N2FmLCAweDk3YWYsIDB4OTdhZiwgMHgxMDc4LAorCTB4MTMyOCwgMHgxMDc4LCAweDc1ODMsIDB4MDA3YywgMHgxMDc4LCAweDYwYjgsIDB4MTA3OCwgMHg2MWQzLAorCTB4NjAxMCwgMHgwZDdlLCAweDIwNjgsIDB4Njg0YywgMHhkMGZjLCAweDAwNDAsIDB4OTdjYSwgMHhhMDhjLAorCTB4MDAwMywgMHhhMThlLCAweDAwMDIsIDB4MDA0MCwgMHg5N2QyLCAweDIwMDksIDB4MDA0MSwgMHgwZDdmLAorCTB4MDA3OCwgMHg5OGMxLCAweDYwMDMsIDB4MDAwNywgMHg2MDE3LCAweDAwMDAsIDB4MTA3OCwgMHg1YTQxLAorCTB4MGQ3ZiwgMHgwMDdjLCAweDEwNzgsIDB4YTBjNiwgMHgwMDQwLCAweDk3ZDgsIDB4MGQ3ZiwgMHgwMDdjLAorCTB4MTA3OCwgMHg1YTQxLCAweDEwNzgsIDB4NzUzZCwgMHgwZDdmLCAweDAwNzgsIDB4OTdkMSwgMHgwMzdlLAorCTB4MTA3OCwgMHg2MGI4LCAweDEwNzgsIDB4NjFkMywgMHg2MDEwLCAweDBkN2UsIDB4MjA2OCwgMHg2MDE4LAorCTB4MjAwNCwgMHhkMGJjLCAweDAwNDAsIDB4OTdmZiwgMHg2ODRjLCAweGEwODQsIDB4MDAwMywgMHhhMDg2LAorCTB4MDAwMiwgMHgwMDQwLCAweDk3ZmIsIDB4Njg3YywgMHg2MzJjLCAweGEzMWEsIDB4NjMyZSwgMHg2ODgwLAorCTB4NjMyOCwgMHhhMzFiLCAweDYzMmEsIDB4NjAwMywgMHgwMDAyLCAweDAwNzgsIDB4OTgxMCwgMHgyMDE5LAorCTB4MDAwNCwgMHgxMDc4LCAweDllNzAsIDB4NjAxNCwgMHhhMDA1LCAweDAwYzAsIDB4OTgwYywgMHgyMDAxLAorCTB4YTVhMSwgMHgyMDA0LCAweDgwMDMsIDB4NjAxNiwgMHg2MDEzLCAweDAwMDAsIDB4NjAwMywgMHgwMDA3LAorCTB4MGQ3ZiwgMHgwMzdmLCAweDAwN2MsIDB4YTE4NiwgMHgwMDEzLCAweDAwYzAsIDB4OTgyMSwgMHg2MDA0LAorCTB4YTA4NiwgMHgwMDQyLCAweDEwYzAsIDB4MTMyOCwgMHgxMDc4LCAweDYwMTAsIDB4MTA3OCwgMHg2MTA5LAorCTB4MDA3YywgMHhhMTg2LCAweDAwMjcsIDB4MDA0MCwgMHg5ODI5LCAweGExODYsIDB4MDAxNCwgMHgwMGMwLAorCTB4OTgzOSwgMHg2MDA0LCAweGEwODYsIDB4MDA0MiwgMHgxMGMwLCAweDEzMjgsIDB4MjAwMSwgMHgwMDA3LAorCTB4MTA3OCwgMHg0NDcyLCAweDEwNzgsIDB4NjAxMCwgMHgxMDc4LCAweDhjMDEsIDB4MTA3OCwgMHg2MTA5LAorCTB4MDA3YywgMHhhMTgyLCAweDAwNDAsIDB4MDA3OSwgMHg5ODNkLCAweDk4NTAsIDB4OTg1MCwgMHg5ODUwLAorCTB4OTg1MCwgMHg5ODUwLCAweDk4NTAsIDB4OTg1MCwgMHg5ODUyLCAweDk4NWUsIDB4OTg1MCwgMHg5ODUwLAorCTB4OTg1MCwgMHg5ODUwLCAweDk4NTAsIDB4OTg1MCwgMHg5ODUwLCAweDk4NTAsIDB4OTg1MCwgMHg5ODUwLAorCTB4MTA3OCwgMHgxMzI4LCAweDAzN2UsIDB4MDQ3ZSwgMHgyMGUxLCAweDAwMDUsIDB4M2QxOCwgMHgzZTIwLAorCTB4MmMxMCwgMHgxMDc4LCAweDE1ZWMsIDB4MDQ3ZiwgMHgwMzdmLCAweDAwN2MsIDB4NjAxMCwgMHgwZDdlLAorCTB4MjA2OCwgMHg2ODEwLCAweDZhMTQsIDB4NjExOCwgMHgyMTBjLCAweGQxYmMsIDB4MDA0MCwgMHg5ODdkLAorCTB4NjEyNCwgMHhkMWY0LCAweDAwYzAsIDB4OTg3ZCwgMHgwMDdlLCAweDA0N2UsIDB4MDU3ZSwgMHg2YzdjLAorCTB4YTQyMiwgMHg2ZDgwLCAweDIyMDAsIDB4YTUyYiwgMHg2MDJjLCAweGE0MjAsIDB4NjQyZSwgMHg2MDI4LAorCTB4YTUyOSwgMHg2NTJhLCAweDA1N2YsIDB4MDQ3ZiwgMHgwMDdmLCAweGEyMGQsIDB4MDBjMCwgMHg5ODkxLAorCTB4Njg0YywgMHhkMGZjLCAweDAwNDAsIDB4OTg4OSwgMHgyMDA5LCAweDAwNDEsIDB4MGQ3ZiwgMHgwMDc4LAorCTB4OThjMSwgMHg2MDAzLCAweDAwMDcsIDB4NjAxNywgMHgwMDAwLCAweDEwNzgsIDB4NWE0MSwgMHgwZDdmLAorCTB4MDA3YywgMHgwMDdlLCAweDBmN2UsIDB4MmM3OCwgMHgxMDc4LCAweDQ4OTMsIDB4MGY3ZiwgMHgwMDdmLAorCTB4MDA0MCwgMHg5ODllLCAweDYwMDMsIDB4MDAwMiwgMHgwZDdmLCAweDAwN2MsIDB4MjAwOSwgMHhhMzBkLAorCTB4MjEwYywgMHhkMTljLCAweDAwNDAsIDB4OThhOCwgMHg2MDAzLCAweDAwMDcsIDB4MDA3OCwgMHg5OGFhLAorCTB4NjAwMywgMHgwMDA2LCAweDEwNzgsIDB4OThiMCwgMHgxMDc4LCAweDVhNDMsIDB4MGQ3ZiwgMHgwMDdjLAorCTB4ZDJmYywgMHgwMDQwLCAweDk4YmMsIDB4ODAwMiwgMHg4MDAwLCAweDgyMTIsIDB4YTI5MSwgMHgwMDAwLAorCTB4MjAwOSwgMHgwMDA5LCAweDAwNzgsIDB4OThiZSwgMHgyMDA5LCAweDAwMTUsIDB4NmE2YSwgMHg2ODY2LAorCTB4MDA3YywgMHhhMTgyLCAweDAwNDAsIDB4MDA0OCwgMHg5OGM3LCAweDAwNzksIDB4OThkNCwgMHhhMTg2LAorCTB4MDAxMywgMHgwMDQwLCAweDk4Y2YsIDB4YTE4NiwgMHgwMDE0LCAweDEwYzAsIDB4MTMyOCwgMHg2MDI0LAorCTB4ZDBkYywgMHgxMDQwLCAweDEzMjgsIDB4MDA3YywgMHg5OGU3LCAweDk4ZWUsIDB4OThmYSwgMHg5OTA2LAorCTB4OThlNywgMHg5OGU3LCAweDk4ZTcsIDB4OTkxNSwgMHg5OGU3LCAweDk4ZTksIDB4OThlOSwgMHg5OGU3LAorCTB4OThlNywgMHg5OGU3LCAweDk4ZTcsIDB4OThlNywgMHg5OGU3LCAweDk4ZTcsIDB4OThlNywgMHgxMDc4LAorCTB4MTMyOCwgMHg2MDI0LCAweGQwZGMsIDB4MTA0MCwgMHgxMzI4LCAweDAwN2MsIDB4NjAwMywgMHgwMDAxLAorCTB4NjEwNiwgMHgxMDc4LCAweDViZjgsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg2MTA5LAorCTB4MTI3ZiwgMHgwMDdjLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDEwNzgsIDB4NWJmOCwgMHgxMjdlLAorCTB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4NjEwOSwgMHgxMjdmLCAweDAwN2MsIDB4NjAwMywgMHgwMDAzLAorCTB4NjEwNiwgMHgyYzEwLCAweDEwNzgsIDB4MWNhYiwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LAorCTB4NWM2NCwgMHgxMDc4LCAweDYxZDMsIDB4MTI3ZiwgMHgwMDdjLCAweGEwMTYsIDB4MTA3OCwgMHgxNWVjLAorCTB4MDA3YywgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwMzdlLCAweDBkN2UsIDB4YTE4MiwgMHgwMDQwLAorCTB4MTA3OSwgMHg5OTI2LCAweDBkN2YsIDB4MDM3ZiwgMHgxMjdmLCAweDAwN2MsIDB4OTkzNiwgMHg5OTM4LAorCTB4OTk0ZCwgMHg5OTZjLCAweDk5MzYsIDB4OTkzNiwgMHg5OTM2LCAweDk5ODQsIDB4OTkzNiwgMHg5OTM2LAorCTB4OTkzNiwgMHg5OTM2LCAweDk5MzYsIDB4OTkzNiwgMHg5OTM2LCAweDk5MzYsIDB4MTA3OCwgMHgxMzI4LAorCTB4NjAxMCwgMHgyMDY4LCAweDY4NGMsIDB4ZDBmYywgMHgwMDQwLCAweDk5NjIsIDB4YTA5YywgMHgwMDAzLAorCTB4YTM5ZSwgMHgwMDAzLCAweDAwNDAsIDB4OTk2MiwgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgxMDc4LAorCTB4NWJmOCwgMHgxMDc4LCAweDYxMDksIDB4MDA3OCwgMHg5OTg3LCAweDYwMTAsIDB4MjA2OCwgMHg2ODRjLAorCTB4ZDBmYywgMHgwMDQwLCAweDk5NjIsIDB4YTA5YywgMHgwMDAzLCAweGEzOWUsIDB4MDAwMywgMHgwMDQwLAorCTB4OTk2MiwgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgxMDc4LCAweDViZjgsIDB4MTA3OCwgMHg2MTA5LAorCTB4MDA3OCwgMHg5OTg3LCAweDYwMTMsIDB4MDAwMCwgMHg2MDE3LCAweDAwMDAsIDB4MjAxOSwgMHgwMDA0LAorCTB4MTA3OCwgMHg5ZTcwLCAweDAwNzgsIDB4OTk4NywgMHg2MDEwLCAweDIwNjgsIDB4Njg0YywgMHhkMGZjLAorCTB4MDA0MCwgMHg5OTYyLCAweGEwOWMsIDB4MDAwMywgMHhhMzllLCAweDAwMDMsIDB4MDA0MCwgMHg5OTYyLAorCTB4NjAwMywgMHgwMDAzLCAweDYxMDYsIDB4MmMxMCwgMHgxMDc4LCAweDFjYWIsIDB4MTA3OCwgMHg1YzY0LAorCTB4MTA3OCwgMHg2MWQzLCAweDAwNzgsIDB4OTk4NywgMHhhMDE2LCAweDEwNzgsIDB4MTVlYywgMHgwMDdjLAorCTB4MTA3OCwgMHg2MDEwLCAweDYxMTAsIDB4ODFmZiwgMHgwMDQwLCAweDk5OTksIDB4MGQ3ZSwgMHgyMTY4LAorCTB4MTA3OCwgMHhhMTgxLCAweDAzN2UsIDB4MjAxOSwgMHgwMDI5LCAweDEwNzgsIDB4OWU3MCwgMHgwMzdmLAorCTB4MGQ3ZiwgMHgxMDc4LCAweDhjMDEsIDB4MTA3OCwgMHg2MTA5LCAweDAwN2MsIDB4MTA3OCwgMHg2MGI4LAorCTB4NjExMCwgMHg4MWZmLCAweDAwNDAsIDB4OTlhZiwgMHgwZDdlLCAweDIxNjgsIDB4MTA3OCwgMHhhMTgxLAorCTB4MDM3ZSwgMHgyMDE5LCAweDAwMjksIDB4MTA3OCwgMHg5ZTcwLCAweDAzN2YsIDB4MGQ3ZiwgMHgxMDc4LAorCTB4OGMwMSwgMHgxMDc4LCAweDYxZDMsIDB4MDA3YywgMHhhMTgyLCAweDAwODUsIDB4MDA3OSwgMHg5OWI4LAorCTB4OTljMSwgMHg5OWJmLCAweDk5YmYsIDB4OTljZCwgMHg5OWJmLCAweDk5YmYsIDB4OTliZiwgMHgxMDc4LAorCTB4MTMyOCwgMHg2MDAzLCAweDAwMGIsIDB4NjEwNiwgMHgxMDc4LCAweDViZjgsIDB4MTI3ZSwgMHgyMDkxLAorCTB4ODAwMCwgMHgxMDc4LCAweDYxMDksIDB4MTI3ZiwgMHgwMDdjLCAweDAyN2UsIDB4MGU3ZSwgMHgxMDc4LAorCTB4YTBiZiwgMHgwMDQwLCAweDk5ZDcsIDB4MTA3OCwgMHg3NTNkLCAweDAwNzgsIDB4OTlmMywgMHgyMDcxLAorCTB4YTg4MCwgMHg3MjI0LCAweDYyMTIsIDB4NzIyMCwgMHgxMDc4LCAweDlkMTAsIDB4MDA0MCwgMHg5OWU0LAorCTB4NjAwNywgMHgwMDg2LCAweDAwNzgsIDB4OTllZCwgMHg2MDA3LCAweDAwODcsIDB4NzIyNCwgMHhhMjk2LAorCTB4ZmZmZiwgMHgwMGMwLCAweDk5ZWQsIDB4NjAwNywgMHgwMDg2LCAweDYwMDMsIDB4MDAwMSwgMHgxMDc4LAorCTB4NWJmOCwgMHgxMDc4LCAweDYxMDksIDB4MGU3ZiwgMHgwMjdmLCAweDAwN2MsIDB4YTE4NiwgMHgwMDEzLAorCTB4MDBjMCwgMHg5YTA3LCAweDYwMDQsIDB4YTA4YSwgMHgwMDg1LCAweDEwNDgsIDB4MTMyOCwgMHhhMDhhLAorCTB4MDA4YywgMHgxMGM4LCAweDEzMjgsIDB4YTA4MiwgMHgwMDg1LCAweDAwNzksIDB4OWExZSwgMHhhMTg2LAorCTB4MDAyNywgMHgwMDQwLCAweDlhMTMsIDB4YTE4NiwgMHgwMDE0LCAweDAwNDAsIDB4OWExMywgMHgxMDc4LAorCTB4NzU4MywgMHgwMDc4LCAweDlhMWQsIDB4MjAwMSwgMHgwMDA3LCAweDEwNzgsIDB4NDQ3MiwgMHgxMDc4LAorCTB4NjAxMCwgMHgxMDc4LCAweDhjMDEsIDB4MTA3OCwgMHg2MTA5LCAweDAwN2MsIDB4OWEyNSwgMHg5YTI3LAorCTB4OWEyNywgMHg5YTI1LCAweDlhMjUsIDB4OWEyNSwgMHg5YTI1LCAweDEwNzgsIDB4MTMyOCwgMHgxMDc4LAorCTB4NjAxMCwgMHgxMDc4LCAweDhjMDEsIDB4MTA3OCwgMHg2MTA5LCAweDAwN2MsIDB4YTE4MiwgMHgwMDg1LAorCTB4MTA0OCwgMHgxMzI4LCAweGExODIsIDB4MDA4YywgMHgxMGM4LCAweDEzMjgsIDB4YTE4MiwgMHgwMDg1LAorCTB4MDA3OSwgMHg5YTNhLCAweDlhNDEsIDB4OWE0MSwgMHg5YTQxLCAweDlhNDMsIDB4OWE0MSwgMHg5YTQxLAorCTB4OWE0MSwgMHgxMDc4LCAweDEzMjgsIDB4MDA3YywgMHhhMTg2LCAweDAwMTMsIDB4MDA0MCwgMHg5YTU0LAorCTB4YTE4NiwgMHgwMDE0LCAweDAwNDAsIDB4OWE1NCwgMHhhMTg2LCAweDAwMjcsIDB4MDA0MCwgMHg5YTU0LAorCTB4MTA3OCwgMHg3NTgzLCAweDAwNzgsIDB4OWE1YSwgMHgxMDc4LCAweDYwMTAsIDB4MTA3OCwgMHg4YzAxLAorCTB4MTA3OCwgMHg2MTA5LCAweDAwN2MsIDB4MDM3ZSwgMHgxMDc4LCAweGExMzQsIDB4NjAzZiwgMHgwMDAwLAorCTB4MjAxOSwgMHgwMDBiLCAweDEwNzgsIDB4OWE2YSwgMHg2MDFmLCAweDAwMDYsIDB4NjAwMywgMHgwMDA3LAorCTB4MDM3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MDM3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MDg3ZSwgMHgyYzQwLAorCTB4MDk3ZSwgMHgyMDQ5LCAweDAwMDAsIDB4MTA3OCwgMHg3MDU4LCAweDA5N2YsIDB4MDg3ZiwgMHgwMGMwLAorCTB4OWFhNSwgMHgwNzdlLCAweDJjMzgsIDB4MTA3OCwgMHg3MTA1LCAweDA3N2YsIDB4MDBjMCwgMHg5YWE1LAorCTB4NjAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwgMHg5YWE1LCAweDYwMWMsIDB4YTA4NiwgMHgwMDA3LAorCTB4MDA0MCwgMHg5YWE1LCAweDBkN2UsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDQsIDB4MDBjMCwgMHg5YTk2LAorCTB4MTA3OCwgMHhhMTM0LCAweDYwMWYsIDB4MDAwNywgMHgxMDc4LCAweDE3NDksIDB4NjAxMCwgMHgyMDY4LAorCTB4MTA3OCwgMHg4YTQ0LCAweDAwNDAsIDB4OWE5ZSwgMHgxMDc4LCAweDllNzAsIDB4MGQ3ZiwgMHg2MDEzLAorCTB4MDAwMCwgMHgxMDc4LCAweGExMzQsIDB4NjAxZiwgMHgwMDA3LCAweDAzN2YsIDB4MTI3ZiwgMHgwMDdjLAorCTB4MGY3ZSwgMHgwYzdlLCAweDAzN2UsIDB4MTU3ZSwgMHgyMDc5LCAweGE4ODAsIDB4NzkzOCwgMHg3ODNjLAorCTB4MTA3OCwgMHgyNGUzLCAweDAwYzAsIDB4OWFmNiwgMHgwMTdlLCAweDBjN2UsIDB4MTA3OCwgMHg0NTAxLAorCTB4MDBjMCwgMHg5YWY2LCAweDIwMTEsIDB4YTg5MCwgMHhhYzk4LCAweDAwMGEsIDB4MjBhOSwgMHgwMDA0LAorCTB4MTA3OCwgMHg3ZTU1LCAweDAwYzAsIDB4OWFmNiwgMHgwMTdmLCAweDAyN2YsIDB4MDI3ZSwgMHgwMTdlLAorCTB4MjAxOSwgMHgwMDI5LCAweDEwNzgsIDB4NzFlMCwgMHgxMDc4LCAweDVkNTMsIDB4MDc3ZSwgMHgyMDM5LAorCTB4MDAwMCwgMHgxMDc4LCAweDVjNzgsIDB4MDc3ZiwgMHgwMTdmLCAweDA3N2UsIDB4MjAzOSwgMHgwMDAwLAorCTB4MTA3OCwgMHg5YzM4LCAweDA3N2YsIDB4MTA3OCwgMHg0NzFiLCAweDAyN2UsIDB4NjIwNCwgMHhhMjk0LAorCTB4ZmYwMCwgMHg4MjE3LCAweGEyODYsIDB4MDAwNiwgMHgwMDQwLCAweDlhZWEsIDB4YTI4NiwgMHgwMDA0LAorCTB4MDBjMCwgMHg5YWVkLCAweDYyYTAsIDB4MTA3OCwgMHgyOGQ1LCAweDAyN2YsIDB4MDE3ZiwgMHgxMDc4LAorCTB4NDIzNSwgMHg2NjEyLCAweDY1MTYsIDB4YTAwNiwgMHgwMDc4LCAweDlhZjgsIDB4MGM3ZiwgMHgwMTdmLAorCTB4MTU3ZiwgMHgwMzdmLCAweDBjN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDBjN2UsIDB4MGQ3ZSwgMHgwZTdlLAorCTB4MDE3ZSwgMHgyMDA5LCAweGEzMWYsIDB4MjEwNCwgMHhhMDg2LCAweDAwNzQsIDB4MDBjMCwgMHg5YjYwLAorCTB4MjA2OSwgMHhhODhlLCAweDY5MGMsIDB4YTE4MiwgMHgwMTAwLCAweDAwNDgsIDB4OWI1MCwgMHg2OTA4LAorCTB4YTE4NCwgMHg4MDAwLCAweDAwNDAsIDB4OWI1YywgMHg2MDE4LCAweDIwNzAsIDB4NzAxMCwgMHhhMDg0LAorCTB4MDBmZiwgMHgwMDQwLCAweDliMWYsIDB4NzAwMCwgMHhkMGY0LCAweDAwNDAsIDB4OWIyMywgMHhhMTg0LAorCTB4MDgwMCwgMHgwMDQwLCAweDliNWMsIDB4NjkxMCwgMHhhMThhLCAweDAwMDEsIDB4MDA0OCwgMHg5YjU0LAorCTB4NjkxNCwgMHgyMDY5LCAweGE4YWUsIDB4NjkwNCwgMHg4MWZmLCAweDAwYzAsIDB4OWI0OCwgMHg2OTBjLAorCTB4YTE4MiwgMHgwMTAwLCAweDAwNDgsIDB4OWI1MCwgMHg2OTA4LCAweDgxZmYsIDB4MDBjMCwgMHg5YjRjLAorCTB4NjkxMCwgMHhhMThhLCAweDAwMDEsIDB4MDA0OCwgMHg5YjU0LCAweDY5MTgsIDB4YTE4YSwgMHgwMDAxLAorCTB4MDA0OCwgMHg5YjVjLCAweDAwNzgsIDB4OWI2NiwgMHg2MDEzLCAweDAxMDAsIDB4MDA3OCwgMHg5YjYyLAorCTB4NjAxMywgMHgwMzAwLCAweDAwNzgsIDB4OWI2MiwgMHg2MDEzLCAweDA1MDAsIDB4MDA3OCwgMHg5YjYyLAorCTB4NjAxMywgMHgwNzAwLCAweDAwNzgsIDB4OWI2MiwgMHg2MDEzLCAweDA5MDAsIDB4MDA3OCwgMHg5YjYyLAorCTB4NjAxMywgMHgwYjAwLCAweDAwNzgsIDB4OWI2MiwgMHg2MDEzLCAweDBmMDAsIDB4MDA3OCwgMHg5YjYyLAorCTB4NjAxMywgMHgyZDAwLCAweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDliNjcsIDB4YTAwNiwgMHgwMTdmLAorCTB4MGU3ZiwgMHgwZDdmLCAweDBjN2YsIDB4MDA3YywgMHgwYzdlLCAweDBkN2UsIDB4MDI3ZSwgMHgwMzdlLAorCTB4MTU3ZSwgMHg2MjE4LCAweDIyNjgsIDB4NmIwNCwgMHhhMzk0LCAweDAwZmYsIDB4YTI4NiwgMHgwMDA2LAorCTB4MDA0MCwgMHg5YjkwLCAweGEyODYsIDB4MDAwNCwgMHgwMDQwLCAweDliOTAsIDB4YTM5NCwgMHhmZjAwLAorCTB4ODIxNywgMHhhMjg2LCAweDAwMDYsIDB4MDA0MCwgMHg5YjkwLCAweGEyODYsIDB4MDAwNCwgMHgwMDQwLAorCTB4OWI5MCwgMHgwYzdlLCAweDJkNjAsIDB4MTA3OCwgMHg0NTEzLCAweDBjN2YsIDB4MDA3OCwgMHg5YmNiLAorCTB4MjAxMSwgMHhhODk2LCAweGFkOTgsIDB4MDAwYSwgMHgyMGE5LCAweDAwMDQsIDB4MTA3OCwgMHg3ZTU1LAorCTB4MDBjMCwgMHg5YmNjLCAweDIwMTEsIDB4YTg5YSwgMHhhZDk4LCAweDAwMDYsIDB4MjBhOSwgMHgwMDA0LAorCTB4MTA3OCwgMHg3ZTU1LCAweDAwYzAsIDB4OWJjYywgMHgwNDdlLCAweDAxN2UsIDB4NmFhMCwgMHhhMjk0LAorCTB4MDBmZiwgMHg4MjI3LCAweGEwMDYsIDB4MjAwOSwgMHhhMzUyLCAweDIxMGMsIDB4ZDFhNCwgMHgwMDQwLAorCTB4OWJiOCwgMHgyMDA5LCAweDAwMjksIDB4MTA3OCwgMHg5ZWMwLCAweDY4MDAsIDB4YzBlNSwgMHg2ODAyLAorCTB4MjAxOSwgMHgwMDI5LCAweDEwNzgsIDB4NWQ1MywgMHgwNzdlLCAweDIwMzksIDB4MDAwMCwgMHgxMDc4LAorCTB4NWM3OCwgMHgyYzA4LCAweDEwNzgsIDB4OWMzOCwgMHgwNzdmLCAweDIwMDEsIDB4MDAwNywgMHgxMDc4LAorCTB4NDQ3MiwgMHgwMTdmLCAweDA0N2YsIDB4YTAwNiwgMHgxNTdmLCAweDAzN2YsIDB4MDI3ZiwgMHgwZDdmLAorCTB4MGM3ZiwgMHgwMDdjLCAweDBkN2UsIDB4MjA2OSwgMHhhODhlLCAweDY4MDAsIDB4YTA4NiwgMHgwODAwLAorCTB4MDA0MCwgMHg5YmRlLCAweDYwMTMsIDB4MDAwMCwgMHgwMDc4LCAweDliZGYsIDB4YTAwNiwgMHgwZDdmLAorCTB4MDA3YywgMHgwYzdlLCAweDBmN2UsIDB4MDE3ZSwgMHgwMjdlLCAweDAzN2UsIDB4MTU3ZSwgMHgyMDc5LAorCTB4YTg4YywgMHg3OTMwLCAweDc4MzQsIDB4MTA3OCwgMHgyNGUzLCAweDAwYzAsIDB4OWMwNSwgMHgxMDc4LAorCTB4NDUwMSwgMHgwMGMwLCAweDljMDUsIDB4MjAxMSwgMHhhODkwLCAweGFjOTgsIDB4MDAwYSwgMHgyMGE5LAorCTB4MDAwNCwgMHgxMDc4LCAweDdlNTUsIDB4MDBjMCwgMHg5YzA1LCAweDIwMTEsIDB4YTg5NCwgMHhhYzk4LAorCTB4MDAwNiwgMHgyMGE5LCAweDAwMDQsIDB4MTA3OCwgMHg3ZTU1LCAweDE1N2YsIDB4MDM3ZiwgMHgwMjdmLAorCTB4MDE3ZiwgMHgwZjdmLCAweDBjN2YsIDB4MDA3YywgMHgwYzdlLCAweDAwN2UsIDB4MDE3ZSwgMHgwMjdlLAorCTB4MDM3ZSwgMHgxNTdlLCAweDIwMTEsIDB4YTg4MywgMHgyMjA0LCAweDgyMTEsIDB4MjIwYywgMHgxMDc4LAorCTB4MjRlMywgMHgwMGMwLCAweDljMzEsIDB4MTA3OCwgMHg0NTAxLCAweDAwYzAsIDB4OWMzMSwgMHgyMDExLAorCTB4YTg5NiwgMHhhYzk4LCAweDAwMGEsIDB4MjBhOSwgMHgwMDA0LCAweDEwNzgsIDB4N2U1NSwgMHgwMGMwLAorCTB4OWMzMSwgMHgyMDExLCAweGE4OWEsIDB4YWM5OCwgMHgwMDA2LCAweDIwYTksIDB4MDAwNCwgMHgxMDc4LAorCTB4N2U1NSwgMHgxNTdmLCAweDAzN2YsIDB4MDI3ZiwgMHgwMTdmLCAweDAwN2YsIDB4MGM3ZiwgMHgwMDdjLAorCTB4MGU3ZSwgMHgwYzdlLCAweDA4N2UsIDB4MDc3ZSwgMHgwNjdlLCAweDA1N2UsIDB4MDQ3ZSwgMHgwMjdlLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4Mjc0MCwgMHgyMDI5LCAweGE1YjQsIDB4MjUyYywgMHgyMDIxLAorCTB4YTViYSwgMHgyNDI0LCAweDIwNjEsIDB4YWEwMCwgMHgyMDcxLCAweGEzMDAsIDB4NzY0NCwgMHg3MDYwLAorCTB4ODFmZiwgMHgwMDQwLCAweDljNTksIDB4ODAwMSwgMHhhNjAyLCAweDAwYzgsIDB4OWNjMywgMHgwMDc4LAorCTB4OWM1YywgMHhhNjA2LCAweDAwNDAsIDB4OWNjMywgMHgyMTAwLCAweGFjMDYsIDB4MDA0MCwgMHg5Y2I5LAorCTB4MTA3OCwgMHg5ZWU1LCAweDAwNDAsIDB4OWNiOSwgMHg2NzFjLCAweGE3ODYsIDB4MDAwMSwgMHgwMDQwLAorCTB4OWNkZSwgMHhhNzg2LCAweDAwMDQsIDB4MDA0MCwgMHg5Y2RlLCAweGE3ODYsIDB4MDAwNywgMHgwMDQwLAorCTB4OWNiOSwgMHgyNTAwLCAweGFjMDYsIDB4MDA0MCwgMHg5Y2I5LCAweDI0MDAsIDB4YWMwNiwgMHgwMDQwLAorCTB4OWNiOSwgMHgxMDc4LCAweDllZjksIDB4MDBjMCwgMHg5Y2I5LCAweDg4ZmYsIDB4MDA0MCwgMHg5Yzg0LAorCTB4NjAyMCwgMHhhOTA2LCAweDAwYzAsIDB4OWNiOSwgMHgwZDdlLCAweDYwMDAsIDB4YTA4NiwgMHgwMDA0LAorCTB4MDBjMCwgMHg5YzhlLCAweDAxN2UsIDB4MTA3OCwgMHgxNzQ5LCAweDAxN2YsIDB4YTc4NiwgMHgwMDA4LAorCTB4MDBjMCwgMHg5YzlkLCAweDEwNzgsIDB4OGMzYiwgMHgwMGMwLCAweDljOWQsIDB4MTA3OCwgMHg3YTA1LAorCTB4MGQ3ZiwgMHgxMDc4LCAweDhjMDEsIDB4MDA3OCwgMHg5Y2I5LCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LAorCTB4OGE0NCwgMHgwMDQwLCAweDljYjYsIDB4YTc4NiwgMHgwMDAzLCAweDAwYzAsIDB4OWNjZCwgMHg2ODM3LAorCTB4MDEwMywgMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgxMDc4LCAweGExODEsIDB4MDE3ZSwgMHgxMDc4LAorCTB4OGNiOCwgMHgxMDc4LCAweDQ5ODIsIDB4MDE3ZiwgMHgxMDc4LCAweDhiZjQsIDB4MGQ3ZiwgMHgxMDc4LAorCTB4OGMwMSwgMHhhY2UwLCAweDAwMTAsIDB4MjAwMSwgMHhhMzE1LCAweDIwMDQsIDB4YWMwMiwgMHgwMGM4LAorCTB4OWNjMywgMHgwMDc4LCAweDljNGMsIDB4MTI3ZiwgMHgwMjdmLCAweDA0N2YsIDB4MDU3ZiwgMHgwNjdmLAorCTB4MDc3ZiwgMHgwODdmLCAweDBjN2YsIDB4MGU3ZiwgMHgwMDdjLCAweGE3ODYsIDB4MDAwNiwgMHgwMGMwLAorCTB4OWNhNywgMHhhMzg2LCAweDAwMDUsIDB4MDA0MCwgMHg5Y2RiLCAweDEwNzgsIDB4YTE4MSwgMHgxMDc4LAorCTB4OWU3MCwgMHgwMDc4LCAweDljYjYsIDB4MGQ3ZiwgMHgwMDc4LCAweDljYjksIDB4MTA3OCwgMHg5ZWY5LAorCTB4MDBjMCwgMHg5Y2I5LCAweDgxZmYsIDB4MDA0MCwgMHg5Y2I5LCAweGExODAsIDB4MDAwMSwgMHgyMDA0LAorCTB4YTA4NiwgMHgwMDE4LCAweDAwNDAsIDB4OWNmMywgMHhhMTgwLCAweDAwMDEsIDB4MjAwNCwgMHhhMDg2LAorCTB4MDAyZCwgMHgwMGMwLCAweDljYjksIDB4NjAwMCwgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHg5Y2I5LAorCTB4MTA3OCwgMHg4YzI3LCAweDAwNDAsIDB4OWQwNCwgMHgxMDc4LCAweDhjM2IsIDB4MDBjMCwgMHg5Y2I5LAorCTB4MTA3OCwgMHg3YTA1LCAweDAwNzgsIDB4OWQwYywgMHgxMDc4LCAweDI4MzksIDB4MTA3OCwgMHg4YzNiLAorCTB4MDBjMCwgMHg5ZDBjLCAweDEwNzgsIDB4N2EwNSwgMHgxMDc4LCAweDhjMDEsIDB4MDA3OCwgMHg5Y2I5LAorCTB4MGM3ZSwgMHgwZTdlLCAweDAxN2UsIDB4MmMwOCwgMHgyMTcwLCAweDEwNzgsIDB4OWU4YywgMHgwMTdmLAorCTB4MDA0MCwgMHg5ZDFmLCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLCAweDEwNzksIDB4OWQyMiwgMHgwZTdmLAorCTB4MGM3ZiwgMHgwMDdjLCAweDlkMmEsIDB4OWQyYSwgMHg5ZDJhLCAweDlkMmEsIDB4OWQyYSwgMHg5ZDJhLAorCTB4OWQyYywgMHg5ZDJhLCAweGEwMDYsIDB4MDA3YywgMHgwNDdlLCAweDAxN2UsIDB4NzAxOCwgMHhhMDgwLAorCTB4MDAyOCwgMHgyMDI0LCAweGE0YTQsIDB4MDBmZiwgMHg4NDI3LCAweDJjMDAsIDB4MjAwOSwgMHgwMDIwLAorCTB4MTA3OCwgMHg5ZWMwLCAweDAxN2YsIDB4MDQ3ZiwgMHgwMzdlLCAweDIwMTksIDB4MDAwMiwgMHgxMDc4LAorCTB4OWE2YSwgMHgwMzdmLCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweDIwMDEsIDB4MDAwMSwgMHgxMDc4LAorCTB4NDQyYiwgMHgxNTdlLCAweDAxN2UsIDB4MDI3ZSwgMHgwMzdlLCAweDIwYTksIDB4MDAwNCwgMHgyMDE5LAorCTB4YTMwNSwgMHgyMDExLCAweGE4OTYsIDB4MTA3OCwgMHg3ZTU1LCAweDAzN2YsIDB4MDI3ZiwgMHgwMTdmLAorCTB4MTU3ZiwgMHhhMDA1LCAweDAwN2MsIDB4MGY3ZSwgMHgwZTdlLCAweDBjN2UsIDB4MDg3ZSwgMHgwNzdlLAorCTB4MDY3ZSwgMHgwMjdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDI3NDAsIDB4MjA2MSwgMHhhYTAwLAorCTB4MjA3OSwgMHgwMDAxLCAweDhmZmYsIDB4MDA0MCwgMHg5ZGMzLCAweDIwNzEsIDB4YTMwMCwgMHg3NjQ0LAorCTB4NzA2MCwgMHg4MDAxLCAweGE2MDIsIDB4MDBjOCwgMHg5ZGMzLCAweDg4ZmYsIDB4MDA0MCwgMHg5ZDdlLAorCTB4MjgwMCwgMHhhYzA2LCAweDAwYzAsIDB4OWRiOSwgMHgyMDc5LCAweDAwMDAsIDB4MTA3OCwgMHg5ZWU1LAorCTB4MDA0MCwgMHg5ZGI5LCAweDI0MDAsIDB4YWMwNiwgMHgwMDQwLCAweDlkYjksIDB4NjcxYywgMHhhNzg2LAorCTB4MDAwNiwgMHgwMGMwLCAweDlkYjksIDB4YTc4NiwgMHgwMDA3LCAweDAwNDAsIDB4OWRiOSwgMHg4OGZmLAorCTB4MDBjMCwgMHg5ZDlkLCAweDYwMTgsIDB4YTIwNiwgMHgwMGMwLCAweDlkYjksIDB4ODVmZiwgMHgwMDQwLAorCTB4OWQ5ZCwgMHg2MDIwLCAweGExMDYsIDB4MDBjMCwgMHg5ZGI5LCAweDBkN2UsIDB4NjAwMCwgMHhhMDg2LAorCTB4MDAwNCwgMHgwMGMwLCAweDlkYTksIDB4MTA3OCwgMHhhMTM0LCAweDYwMWYsIDB4MDAwNywgMHgxMDc4LAorCTB4MTc0OSwgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4YTQ0LCAweDAwNDAsIDB4OWRiMywgMHgwNDdlLAorCTB4MTA3OCwgMHg5ZTcwLCAweDA0N2YsIDB4MGQ3ZiwgMHgxMDc4LCAweDhjMDEsIDB4ODhmZiwgMHgwMGMwLAorCTB4OWRjZCwgMHhhY2UwLCAweDAwMTAsIDB4MjAwMSwgMHhhMzE1LCAweDIwMDQsIDB4YWMwMiwgMHgwMGM4LAorCTB4OWRjMywgMHgwMDc4LCAweDlkNmEsIDB4YTAwNiwgMHgxMjdmLCAweDAyN2YsIDB4MDY3ZiwgMHgwNzdmLAorCTB4MDg3ZiwgMHgwYzdmLCAweDBlN2YsIDB4MGY3ZiwgMHgwMDdjLCAweGE4YzUsIDB4MDAwMSwgMHgwMDc4LAorCTB4OWRjNCwgMHgwNzdlLCAweDA1N2UsIDB4MDg3ZSwgMHgyMDQxLCAweDAwMDAsIDB4MjAyOSwgMHgwMDAxLAorCTB4MmMyMCwgMHgyMDE5LCAweDAwMDIsIDB4NjIxOCwgMHgwOTdlLCAweDIwNDksIDB4MDAwMCwgMHgxMDc4LAorCTB4NzA1OCwgMHgwOTdmLCAweDA4N2YsIDB4MjAzOSwgMHgwMDAwLCAweDEwNzgsIDB4NzEwNSwgMHgxMDc4LAorCTB4OWQ1YiwgMHgwNTdmLCAweDA3N2YsIDB4MDA3YywgMHgwMjdlLCAweDA0N2UsIDB4MDU3ZSwgMHgwNzdlLAorCTB4MGM3ZSwgMHgxNTdlLCAweDJjMjAsIDB4MjEyOCwgMHgyMGE5LCAweDAwN2YsIDB4MjAwOSwgMHgwMDAwLAorCTB4MDE3ZSwgMHgwMzdlLCAweDEwNzgsIDB4NDUwMSwgMHgwMGMwLCAweDllMTQsIDB4MmMxMCwgMHgwNTdlLAorCTB4MDg3ZSwgMHgyMDQxLCAweDAwMDAsIDB4MjUwOCwgMHgyMDI5LCAweDAwMDEsIDB4MDk3ZSwgMHgyMDQ5LAorCTB4MDAwMCwgMHgxMDc4LCAweDcwNTgsIDB4MDk3ZiwgMHgwODdmLCAweDIwMzksIDB4MDAwMCwgMHgxMDc4LAorCTB4NzEwNSwgMHgxMDc4LCAweDlkNWIsIDB4MDU3ZiwgMHgwMzdmLCAweDAxN2YsIDB4ODEwOCwgMHgwMGYwLAorCTB4OWRmOCwgMHgxNTdmLCAweDBjN2YsIDB4MDc3ZiwgMHgwNTdmLCAweDA0N2YsIDB4MDI3ZiwgMHgwMDdjLAorCTB4MDc3ZSwgMHgwNTdlLCAweDYyMTgsIDB4MDg3ZSwgMHgyMDQxLCAweDAwMDAsIDB4MjAyOSwgMHgwMDAxLAorCTB4MjAxOSwgMHgwMDQ4LCAweDA5N2UsIDB4MjA0OSwgMHgwMDAwLCAweDEwNzgsIDB4NzA1OCwgMHgwOTdmLAorCTB4MDg3ZiwgMHgyMDM5LCAweDAwMDAsIDB4MTA3OCwgMHg3MTA1LCAweDJjMjAsIDB4MTA3OCwgMHg5ZDViLAorCTB4MDU3ZiwgMHgwNzdmLCAweDAwN2MsIDB4MDI3ZSwgMHgwNDdlLCAweDA1N2UsIDB4MDc3ZSwgMHgwYzdlLAorCTB4MTU3ZSwgMHgyYzIwLCAweDIwYTksIDB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsIDB4MDE3ZSwgMHgwMzdlLAorCTB4MTA3OCwgMHg0NTAxLCAweDAwYzAsIDB4OWU2NCwgMHgyYzEwLCAweDA4N2UsIDB4MjA0MSwgMHgwMDAwLAorCTB4MjgyOCwgMHgwNDdlLCAweDIwMjEsIDB4MDAwMSwgMHgxMDc4LCAweGExMTEsIDB4MDQ3ZiwgMHgwOTdlLAorCTB4MjA0OSwgMHgwMDAwLCAweDEwNzgsIDB4NzA1OCwgMHgwOTdmLCAweDA4N2YsIDB4MjAzOSwgMHgwMDAwLAorCTB4MTA3OCwgMHg3MTA1LCAweDEwNzgsIDB4OWQ1YiwgMHgwMzdmLCAweDAxN2YsIDB4ODEwOCwgMHgwMGYwLAorCTB4OWU0NiwgMHgxNTdmLCAweDBjN2YsIDB4MDc3ZiwgMHgwNTdmLCAweDA0N2YsIDB4MDI3ZiwgMHgwMDdjLAorCTB4MDE3ZSwgMHgwZjdlLCAweGFkODIsIDB4Y2EwMCwgMHgwMDQ4LCAweDllODksIDB4YWQ4MiwgMHhmZmZmLAorCTB4MDBjOCwgMHg5ZTg5LCAweDY4MDAsIDB4YTA3ZCwgMHgwMDQwLCAweDllODYsIDB4NjgwMywgMHgwMDAwLAorCTB4NmI1MiwgMHgxMDc4LCAweDQ5ODIsIDB4MmY2OCwgMHgwMDc4LCAweDllN2EsIDB4NmI1MiwgMHgxMDc4LAorCTB4NDk4MiwgMHgwZjdmLCAweDAxN2YsIDB4MDA3YywgMHgwZTdlLCAweDA0N2UsIDB4MDM3ZSwgMHgyMDYxLAorCTB4YWEwMCwgMHgyMDcxLCAweGEzMDAsIDB4NzQ0NCwgMHg3MDYwLCAweDgwMDEsIDB4YTQwMiwgMHgwMGM4LAorCTB4OWViYiwgMHgyMTAwLCAweGFjMDYsIDB4MDA0MCwgMHg5ZWFkLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAwLAorCTB4MDA0MCwgMHg5ZWFkLCAweDYwMDgsIDB4YTIwNiwgMHgwMGMwLCAweDllYWQsIDB4NjAxOCwgMHhhMWEwLAorCTB4MDAwNiwgMHgyNDI0LCAweGE0MDYsIDB4MDA0MCwgMHg5ZWI3LCAweGFjZTAsIDB4MDAxMCwgMHgyMDAxLAorCTB4YTMxNSwgMHgyMDA0LCAweGFjMDIsIDB4MDBjOCwgMHg5ZWJiLCAweDAwNzgsIDB4OWU5MSwgMHhhMDg1LAorCTB4MDAwMSwgMHgwMDc4LCAweDllYmMsIDB4YTAwNiwgMHgwMzdmLCAweDA0N2YsIDB4MGU3ZiwgMHgwMDdjLAorCTB4MGQ3ZSwgMHgwMDdlLCAweDEwNzgsIDB4MTM4MSwgMHgwMDdmLCAweDEwNDAsIDB4MTMyOCwgMHg2ODM3LAorCTB4MDEwZCwgMHg2ODVlLCAweDAyN2UsIDB4MjAxMCwgMHgxMDc4LCAweDhhMzAsIDB4MjAwMSwgMHgwMDAwLAorCTB4MDA0MCwgMHg5ZWQ2LCAweDIyMDAsIDB4YTA4MCwgMHgwMDA4LCAweDIwMDQsIDB4MDI3ZiwgMHg2ODRhLAorCTB4Njk1NiwgMHg2YzQ2LCAweDY4NGYsIDB4MDAwMCwgMHhhMDA2LCAweDY4YjIsIDB4NjgwMiwgMHg2ODNhLAorCTB4Njg1YSwgMHgxMDc4LCAweDQ5ODIsIDB4MGQ3ZiwgMHgwMDdjLCAweDY3MDAsIDB4YTc4NiwgMHgwMDAwLAorCTB4MDA0MCwgMHg5ZWY4LCAweGE3ODYsIDB4MDAwMSwgMHgwMDQwLCAweDllZjgsIDB4YTc4NiwgMHgwMDBhLAorCTB4MDA0MCwgMHg5ZWY4LCAweGE3ODYsIDB4MDAwOSwgMHgwMDQwLCAweDllZjgsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDA3YywgMHgwZTdlLCAweDYwMTgsIDB4MjA3MCwgMHg3MGEwLCAweGEyMDYsIDB4MGU3ZiwgMHgwMDdjLAorCTB4MDE3ZSwgMHg2MDA0LCAweGEwOGUsIDB4MDAxZSwgMHgwMGMwLCAweDlmMWEsIDB4ODAwNywgMHg2MTMwLAorCTB4YTE4YywgMHgwMGZmLCAweGExMDUsIDB4NjAzMiwgMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLAorCTB4NjAxZiwgMHgwMDA1LCAweDIwMDEsIDB4YTVhMSwgMHgyMDA0LCAweDYwMTYsIDB4MTA3OCwgMHg1YmY4LAorCTB4MTA3OCwgMHg2MTA5LCAweDAxN2YsIDB4MDA3YywgMHgwMDA1LCAweDAwMDUsIDB4MDA3YywgMHg2MDI0LAorCTB4ZDBlNCwgMHgwMDQwLCAweDlmMzAsIDB4ZDBjYywgMHgwMDQwLCAweDlmMmEsIDB4MTA3OCwgMHg4Y2ZhLAorCTB4MDA3OCwgMHg5ZjMwLCAweDEwNzgsIDB4YTEzNCwgMHgxMDc4LCAweDVhNDEsIDB4MTA3OCwgMHg3NTNkLAorCTB4MDA3YywgMHhhMjgwLCAweDAwMDcsIDB4MjAwNCwgMHhhMDg0LCAweDAwMGYsIDB4MDA3OSwgMHg5ZjM4LAorCTB4OWY0MSwgMHg5ZjQxLCAweDlmNDEsIDB4OWY0MywgMHg5ZjQxLCAweDlmNDMsIDB4OWY0MywgMHg5ZjQxLAorCTB4OWY0MywgMHhhMDA2LCAweDAwN2MsIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsIDB4YTI4MCwgMHgwMDA3LAorCTB4MjAwNCwgMHhhMDg0LCAweDAwMGYsIDB4MDA3OSwgMHg5ZjRkLCAweDlmNTYsIDB4OWY1NiwgMHg5ZjU2LAorCTB4OWY1NiwgMHg5ZjU2LCAweDlmNTYsIDB4OWY2MSwgMHg5ZjU2LCAweDlmNTYsIDB4NjAwNywgMHgwMDNiLAorCTB4NjAyYiwgMHgwMDA5LCAweDYwMTMsIDB4MmEwMCwgMHg2MDAzLCAweDAwMDEsIDB4MTA3OCwgMHg1YmY4LAorCTB4MDA3YywgMHgwYzdlLCAweDIyNjAsIDB4MTA3OCwgMHhhMTM0LCAweDYwM2YsIDB4MDAwMCwgMHg2MDI0LAorCTB4YzBmNCwgMHhjMGNjLCAweDYwMjYsIDB4MGM3ZiwgMHgwZDdlLCAweDIyNjgsIDB4YTE4NiwgMHgwMDA3LAorCTB4MDBjMCwgMHg5ZmMyLCAweDY4MTAsIDB4YTAwNSwgMHgwMDQwLCAweDlmN2YsIDB4YTA4MCwgMHgwMDEzLAorCTB4MjAwNCwgMHhkMGZjLCAweDAwYzAsIDB4OWY3ZiwgMHgwZDdmLCAweDAwNzgsIDB4OWY1NiwgMHg2MDA3LAorCTB4MDAzYSwgMHg2MDAzLCAweDAwMDEsIDB4MTA3OCwgMHg1YmY4LCAweDEwNzgsIDB4NjEwOSwgMHgwYzdlLAorCTB4MmQ2MCwgMHg2MTAwLCAweGExODYsIDB4MDAwMiwgMHgwMGMwLCAweGEwNTAsIDB4NjAxMCwgMHhhMDA1LAorCTB4MDBjMCwgMHg5Zjk5LCAweDYwMDAsIDB4YTA4NiwgMHgwMDA3LCAweDEwYzAsIDB4MTMyOCwgMHgwMDc4LAorCTB4YTA1MCwgMHhhMDhjLCAweGYwMDAsIDB4MDBjMCwgMHg5ZmE1LCAweDAwNzgsIDB4OWZhNSwgMHgyMDY4LAorCTB4NjgwMCwgMHhhMDA1LCAweDAwYzAsIDB4OWY5ZiwgMHgyZDAwLCAweGEwODAsIDB4MDAxMywgMHgyMDA0LAorCTB4YTA4NCwgMHgwMDAzLCAweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDlmYmUsIDB4NjAxMCwgMHgyMDY4LAorCTB4Njg0YywgMHhjMGRjLCAweGMwZjQsIDB4Njg0ZSwgMHg2ODUwLCAweGMwZjQsIDB4YzBmYywgMHg2ODUyLAorCTB4MjAwOSwgMHgwMDQzLCAweDEwNzgsIDB4OThjMSwgMHgwMDc4LCAweGEwNTAsIDB4MjAwOSwgMHgwMDQxLAorCTB4MDA3OCwgMHhhMDRhLCAweGExODYsIDB4MDAwNSwgMHgwMGMwLCAweGEwMDksIDB4NjgxMCwgMHhhMDgwLAorCTB4MDAxMywgMHgyMDA0LCAweGQwYmMsIDB4MDBjMCwgMHg5ZmQwLCAweDBkN2YsIDB4MDA3OCwgMHg5ZjU2LAorCTB4ZDBiNCwgMHgwMDQwLCAweDlmZDgsIDB4ZDBmYywgMHgxMDQwLCAweDEzMjgsIDB4MDA3OCwgMHg5ZjcyLAorCTB4NjAwNywgMHgwMDNhLCAweDYwMDMsIDB4MDAwMSwgMHgxMDc4LCAweDViZjgsIDB4MTA3OCwgMHg2MTA5LAorCTB4MGM3ZSwgMHgyZDYwLCAweDYxMDAsIDB4YTE4NiwgMHgwMDAyLCAweDAwNDAsIDB4OWZlYiwgMHhhMTg2LAorCTB4MDAwNCwgMHgwMGMwLCAweGEwNTAsIDB4MjA3MSwgMHhhNWUxLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLAorCTB4MDBjMCwgMHg5ZmY4LCAweDcwMDQsIDB4YWMwNiwgMHgwMGMwLCAweDlmZjgsIDB4NzAwMywgMHgwMDAwLAorCTB4NjgxMCwgMHhhMDgwLCAweDAwMTMsIDB4MjAwYywgMHhjMWY0LCAweGMxZGMsIDB4MjEwMiwgMHg4MDAwLAorCTB4MjAwYywgMHhjMWY0LCAweGMxZmMsIDB4YzFiYywgMHgyMTAyLCAweDIwMDksIDB4MDA0MiwgMHgwMDc4LAorCTB4YTA0YSwgMHgwMzdlLCAweDBkN2UsIDB4MGQ3ZSwgMHgxMDc4LCAweDEzODEsIDB4MDM3ZiwgMHgxMDQwLAorCTB4MTMyOCwgMHg2ODM3LCAweDAxMGQsIDB4NjgwMywgMHgwMDAwLCAweDY4M2IsIDB4MDAwMCwgMHg2ODViLAorCTB4MDAwMCwgMHg2YjVlLCAweDY4NTcsIDB4MDA0NSwgMHgyYzAwLCAweDY4NjIsIDB4NjAzNCwgMHg2ODcyLAorCTB4MjM2MCwgMHg2MDI0LCAweGMwZGQsIDB4NjAyNiwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LAorCTB4YTA4NCwgMHgwMGZmLCAweDgwMDcsIDB4NjMyMCwgMHg2YjRhLCAweDY4NDYsIDB4Njg0ZiwgMHgwMDAwLAorCTB4NmQ2YSwgMHg2ZTY2LCAweDY4NmYsIDB4MDAwMSwgMHgxMDc4LCAweDQ5ODIsIDB4MjAxOSwgMHgwMDQ1LAorCTB4NjAwOCwgMHgyMDY4LCAweDEwNzgsIDB4OWE2YSwgMHgyZDAwLCAweDYwMGEsIDB4NjAxZiwgMHgwMDA2LAorCTB4NjAwMywgMHgwMDA3LCAweDYwMTcsIDB4MDAwMCwgMHg2MDNmLCAweDAwMDAsIDB4MGQ3ZiwgMHgwMzdmLAorCTB4MDA3OCwgMHhhMDUxLCAweDYwM2YsIDB4MDAwMCwgMHg2MDAzLCAweDAwMDcsIDB4MTA3OCwgMHg5OGMxLAorCTB4MGM3ZiwgMHgwZDdmLCAweDAwN2MsIDB4YTE4NiwgMHgwMDEzLCAweDAwYzAsIDB4YTA1ZCwgMHg2MDA0LAorCTB4YTA4MiwgMHgwMDg1LCAweDIwMDgsIDB4MDA3OSwgMHhhMDc3LCAweGExODYsIDB4MDAyNywgMHgwMGMwLAorCTB4YTA3MCwgMHgxMDc4LCAweDYwMTAsIDB4MDM3ZSwgMHgwZDdlLCAweDYwMTAsIDB4MjA2OCwgMHgyMDE5LAorCTB4MDAwNCwgMHgxMDc4LCAweDllNzAsIDB4MGQ3ZiwgMHgwMzdmLCAweDEwNzgsIDB4NjEwOSwgMHgwMDdjLAorCTB4YTE4NiwgMHgwMDE0LCAweDAwNDAsIDB4YTA2MSwgMHgxMDc4LCAweDc1ODMsIDB4MDA3YywgMHhhMDgwLAorCTB4YTA3ZSwgMHhhMDdlLCAweGEwN2UsIDB4YTA3ZSwgMHhhMDdlLCAweGEwODAsIDB4MTA3OCwgMHgxMzI4LAorCTB4MTA3OCwgMHg2MDEwLCAweDYwMDMsIDB4MDAwYywgMHgxMDc4LCAweDYxMDksIDB4MDA3YywgMHhhMTgyLAorCTB4MDA4YywgMHgwMGM4LCAweGEwOTEsIDB4YTE4MiwgMHgwMDg1LCAweDAwNDgsIDB4YTA5MSwgMHgwMDc5LAorCTB4YTA5NCwgMHgxMDc4LCAweDc1ODMsIDB4MDA3YywgMHhhMDliLCAweGEwOWIsIDB4YTA5YiwgMHhhMDliLAorCTB4YTA5ZCwgMHhhMGJjLCAweGEwOWIsIDB4MTA3OCwgMHgxMzI4LCAweDBkN2UsIDB4MmM2OCwgMHgxMDc4LAorCTB4NzRkNywgMHgwMDQwLCAweGEwYjcsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAxZSwgMHgyMDA5LAorCTB4YTg4ZSwgMHgyMTBjLCAweDYxMzYsIDB4MjAwOSwgMHhhODhmLCAweDIxMGMsIDB4NjEzYSwgMHg2MDBiLAorCTB4ZmZmZiwgMHg2OTE4LCAweDYxMWEsIDB4NjAxZiwgMHgwMDA0LCAweDEwNzgsIDB4NWJmOCwgMHgyZDYwLAorCTB4MTA3OCwgMHg3NTNkLCAweDBkN2YsIDB4MDA3YywgMHgxMDc4LCAweDc1M2QsIDB4MDA3YywgMHgwZTdlLAorCTB4NjAxOCwgMHgyMDcwLCAweDcwMDAsIDB4ZDBlYywgMHgwZTdmLCAweDAwN2MsIDB4NjAxMCwgMHhhMDgwLAorCTB4MDAxMywgMHgyMDBjLCAweGQxZWMsIDB4MDA0MCwgMHhhMTEwLCAweDIwMDEsIDB4YTM3MSwgMHgyMDA0LAorCTB4ZDBlYywgMHgwMDQwLCAweGExMTAsIDB4NjAwMywgMHgwMDAyLCAweDYwMjQsIDB4YzBlNSwgMHg2MDI2LAorCTB4ZDFhYywgMHgwMDQwLCAweGEwZWUsIDB4MGY3ZSwgMHgyYzc4LCAweDEwNzgsIDB4NDg4ZiwgMHgwZjdmLAorCTB4MDA0MCwgMHhhMGVlLCAweDIwMDEsIDB4YTVhMiwgMHgyMDA0LCAweDYwM2UsIDB4MjAwOSwgMHhhMzcxLAorCTB4MjEwYywgMHhkMWY0LCAweDAwYzAsIDB4YTEwZSwgMHgwMDc4LCAweGExMDAsIDB4MjAwOSwgMHhhMzcxLAorCTB4MjEwYywgMHhkMWY0LCAweDAwNDAsIDB4YTBmYSwgMHg2MDI0LCAweGMwZTQsIDB4NjAyNiwgMHhhMDA2LAorCTB4MDA3OCwgMHhhMTEwLCAweDIwMDEsIDB4YTVhMiwgMHgyMDBjLCAweDgxMDMsIDB4YTEwMCwgMHg2MDNlLAorCTB4NjAxOCwgMHhhMDg4LCAweDAwMmIsIDB4MjEwNCwgMHhhMDA1LCAweDAwNDAsIDB4YTEwYiwgMHhhMDg4LAorCTB4MDAwMywgMHgwMDc4LCAweGExMDMsIDB4MmMwYSwgMHg2MDBmLCAweDAwMDAsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDA3YywgMHgwMTdlLCAweDBjN2UsIDB4MGU3ZSwgMHg2MTIwLCAweGEyZjAsIDB4MDAyYiwgMHgyZTA0LAorCTB4MjA2MCwgMHg4Y2ZmLCAweDAwNDAsIDB4YTEzMCwgMHg4NGZmLCAweDAwYzAsIDB4YTEyMywgMHg2MDIwLAorCTB4YTEwNiwgMHgwMGMwLCAweGExMmIsIDB4NjAwYywgMHgyMDcyLCAweDEwNzgsIDB4NWE0MSwgMHgxMDc4LAorCTB4NzUzZCwgMHgwMDc4LCAweGExMmQsIDB4YWNmMCwgMHgwMDAzLCAweDJlNjQsIDB4MDA3OCwgMHhhMTE5LAorCTB4MGU3ZiwgMHgwYzdmLCAweDAxN2YsIDB4MDA3YywgMHgwZDdlLCAweDYwMTgsIDB4YTBlOCwgMHgwMDJiLAorCTB4MmQwNCwgMHhhMDA1LCAweDAwNDAsIDB4YTE0NiwgMHhhYzA2LCAweDAwNDAsIDB4YTE0NCwgMHgyZDA0LAorCTB4YTBlOCwgMHgwMDAzLCAweDAwNzgsIDB4YTEzOCwgMHg2MDBjLCAweDIwNmEsIDB4MGQ3ZiwgMHgwMDdjLAorCTB4MDI3ZSwgMHgwMzdlLCAweDE1N2UsIDB4MjAxMSwgMHhhMzI1LCAweDIyMDQsIDB4YTA4NCwgMHgwMGZmLAorCTB4MjAxOSwgMHhhODhlLCAweDIzMzQsIDB4YTYzNiwgMHgwMGMwLCAweGExNzQsIDB4ODMxOCwgMHgyMzM0LAorCTB4MjIwNCwgMHhhMDg0LCAweGZmMDAsIDB4YTYzNiwgMHgwMGMwLCAweGExNzQsIDB4MjAxMSwgMHhhODkwLAorCTB4NjAxOCwgMHhhMDk4LCAweDAwMGEsIDB4MjBhOSwgMHgwMDA0LCAweDEwNzgsIDB4N2U1NSwgMHgwMGMwLAorCTB4YTE3NCwgMHgyMDExLCAweGE4OTQsIDB4NjAxOCwgMHhhMDk4LCAweDAwMDYsIDB4MjBhOSwgMHgwMDA0LAorCTB4MTA3OCwgMHg3ZTU1LCAweDAwYzAsIDB4YTE3NCwgMHgxNTdmLCAweDAzN2YsIDB4MDI3ZiwgMHgwMDdjLAorCTB4MGU3ZSwgMHgyMDcxLCAweGEzMDAsIDB4MTA3OCwgMHg0MWY1LCAweDEwNzgsIDB4MjYwZCwgMHgwZTdmLAorCTB4MDA3YywgMHgwZTdlLCAweDYwMTgsIDB4MjA3MCwgMHg3MDAwLCAweGQwZmMsIDB4MDA0MCwgMHhhMThhLAorCTB4MTA3OCwgMHhhMThjLCAweDBlN2YsIDB4MDA3YywgMHg2ODUwLCAweGMwZTUsIDB4Njg1MiwgMHgwMDdjLAorCTB4MGU3ZSwgMHgwYzdlLCAweDA3N2UsIDB4MDY3ZSwgMHgwNTdlLCAweDA0N2UsIDB4MDI3ZSwgMHgwMTdlLAorCTB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjAyOSwgMHhhNWI0LCAweDI1MmMsIDB4MjAyMSwgMHhhNWJhLAorCTB4MjQyNCwgMHgyMDYxLCAweGFhMDAsIDB4MjA3MSwgMHhhMzAwLCAweDc2NDQsIDB4NzA2MCwgMHhhNjA2LAorCTB4MDA0MCwgMHhhMWU0LCAweDY3MWMsIDB4YTc4NiwgMHgwMDAxLCAweDAwNDAsIDB4YTFiMywgMHhhNzg2LAorCTB4MDAwOCwgMHgwMGMwLCAweGExZGEsIDB4MjUwMCwgMHhhYzA2LCAweDAwNDAsIDB4YTFkYSwgMHgyNDAwLAorCTB4YWMwNiwgMHgwMDQwLCAweGExZGEsIDB4MTA3OCwgMHg5ZWU1LCAweDAwNDAsIDB4YTFkYSwgMHgxMDc4LAorCTB4OWVmOSwgMHgwMGMwLCAweGExZGEsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDQsIDB4MDBjMCwgMHhhMWNjLAorCTB4MDE3ZSwgMHgxMDc4LCAweDE3NDksIDB4MDE3ZiwgMHgxMDc4LCAweDhjMjcsIDB4MDBjMCwgMHhhMWQyLAorCTB4MTA3OCwgMHgyODM5LCAweDEwNzgsIDB4OGMzYiwgMHgwMGMwLCAweGExZDgsIDB4MTA3OCwgMHg3YTA1LAorCTB4MTA3OCwgMHg4YzAxLCAweGFjZTAsIDB4MDAxMCwgMHgyMDAxLCAweGEzMTUsIDB4MjAwNCwgMHhhYzAyLAorCTB4MDBjOCwgMHhhMWU0LCAweDAwNzgsIDB4YTFhMywgMHgxMjdmLCAweDAxN2YsIDB4MDI3ZiwgMHgwNDdmLAorCTB4MDU3ZiwgMHgwNjdmLCAweDA3N2YsIDB4MGM3ZiwgMHgwZTdmLCAweDAwN2MsIDB4MTI3ZSwgMHgwMDdlLAorCTB4MGU3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhMzQwLCAweGQ1YTQsIDB4MDA0MCwgMHhhMWZiLAorCTB4NzAzNCwgMHg4MDAwLCAweDcwMzYsIDB4ZDViNCwgMHgwMDQwLCAweGEyMDEsIDB4NzAzMCwgMHg4MDAwLAorCTB4NzAzMiwgMHhkNWFjLCAweDAwNDAsIDB4YTIwOCwgMHgyMDcxLCAweGEzNGEsIDB4MTA3OCwgMHhhMjM3LAorCTB4MGU3ZiwgMHgwMDdmLCAweDEyN2YsIDB4MDA3YywgMHgxMjdlLCAweDAwN2UsIDB4MGU3ZSwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDcxLCAweGEzNDAsIDB4ZDVhNCwgMHgwMDQwLCAweGEyMTksIDB4NzAzNCwgMHg4MDAwLAorCTB4NzAzNiwgMHhkNWI0LCAweDAwNDAsIDB4YTIxZiwgMHg3MDMwLCAweDgwMDAsIDB4NzAzMiwgMHhkNWFjLAorCTB4MDA0MCwgMHhhMjI2LCAweDIwNzEsIDB4YTM0YSwgMHgxMDc4LCAweGEyMzcsIDB4MGU3ZiwgMHgwMDdmLAorCTB4MTI3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MDA3ZSwgMHgwZTdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLAorCTB4YTM0MiwgMHgxMDc4LCAweGEyMzcsIDB4MGU3ZiwgMHgwMDdmLCAweDEyN2YsIDB4MDA3YywgMHgyZTA0LAorCTB4ODAwMCwgMHgyMDcyLCAweDAwYzgsIDB4YTI0MCwgMHg4ZTcwLCAweDJlMDQsIDB4ODAwMCwgMHgyMDcyLAorCTB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YTM0MCwgMHgxMDc4LCAweGEyMzcsIDB4MGU3ZiwgMHgwMDdjLAorCTB4MGU3ZSwgMHgyMDcxLCAweGEzNDQsIDB4MTA3OCwgMHhhMjM3LCAweDBlN2YsIDB4MDA3YywgMHgwMDAxLAorCTB4MDAwMiwgMHgwMDA0LCAweDAwMDgsIDB4MDAxMCwgMHgwMDIwLCAweDAwNDAsIDB4MDA4MCwgMHgwMTAwLAorCTB4MDIwMCwgMHgwNDAwLCAweDA4MDAsIDB4MTAwMCwgMHgyMDAwLCAweDQwMDAsIDB4ODAwMCwgMHg2Mjg2Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQkJCQkJCSoKKyAqICAgICAgICAgICAgICAgLS0tIElTUDIyMDAgSW5pdGlhdG9yL1RhcmdldCBGaXJtd2FyZSAtLS0gICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgIHdpdGggRmFicmljIChQdWJsaWMgTG9vcCksIFBvaW50LXBvaW50LCBhbmQgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgIGV4cGFuZGVkIExVTiBhZGRyZXNzaW5nIGZvciBGQ1RBUEUgICAgICAgICAgICAgICAgICAgICAgICoKKyAqCQkJCQkJCQkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBDb3B5cmlnaHQgKEMpIDIwMDAgYW5kIDIxMDAgUWxvZ2ljIENvcnBvcmF0aW9uIAorICAod3d3LnFsb2dpYy5jb20pCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUZpcm13YXJlIFZlcnNpb24gMi4wMS4yNyAoMTE6MDcgRGVjIDE4LCAyMDAwKQorICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfbGVuZ3RoMjIwMCA9IDB4OWNiZjsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGUyMjAwW10gPSB7IAorCTB4MDQ3MCwgMHgwMDAwLCAweDAwMDAsIDB4OWNiZiwgMHgwMDAwLCAweDAwMDIsIDB4MDAwMSwgMHgwMDFiLAorCTB4MDAxNywgMHgyMDQzLCAweDRmNTAsIDB4NTk1MiwgMHg0OTQ3LCAweDQ4NTQsIDB4MjAzMSwgMHgzOTM5LAorCTB4MzkyMCwgMHg1MTRjLCAweDRmNDcsIDB4NDk0MywgMHgyMDQzLCAweDRmNTIsIDB4NTA0ZiwgMHg1MjQxLAorCTB4NTQ0OSwgMHg0ZjRlLCAweDIwNDksIDB4NTM1MCwgMHgzMjMyLCAweDMwMzAsIDB4MjA0NiwgMHg2OTcyLAorCTB4NmQ3NywgMHg2MTcyLCAweDY1MjAsIDB4MjA1NiwgMHg2NTcyLCAweDczNjksIDB4NmY2ZSwgMHgyMDMwLAorCTB4MzIyZSwgMHgzMDMxLCAweDJlMzIsIDB4MzcyMCwgMHgyMDIwLCAweDIwMjAsIDB4MjQwMCwgMHgyMGMxLAorCTB4MDAwNSwgMHgyMDAxLCAweDAxN2YsIDB4MjAwMywgMHgwMDAwLCAweDIwYzksIDB4YjFmZiwgMHgyMDkxLAorCTB4MjAwMCwgMHgyMDU5LCAweDAwMDAsIDB4MmI3OCwgMHg3ODIzLCAweDAwMDQsIDB4MjA4OSwgMHgyN2I1LAorCTB4MjA1MSwgMHhhZDAwLCAweDJhNzAsIDB4MjAyOSwgMHhlNDAwLCAweDIwMzEsIDB4ZmZmZiwgMHgyMDM5LAorCTB4ZTNlOSwgMHgyMDIxLCAweDAyMDAsIDB4MDgwNCwgMHgxNDQ5LCAweDIwYTEsIDB4YWNiZiwgMHhhMDBlLAorCTB4MjBhOSwgMHgwNzQxLCAweDQxYTQsIDB4MzQwMCwgMHg3NTVlLCAweDc2NjIsIDB4Nzc1YSwgMHg3NDY2LAorCTB4NzQ2YSwgMHgyMGExLCAweGI0MDAsIDB4NzE2MCwgMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwgMHg4MTBkLAorCTB4YTE4YywgMHgwMDBmLCAweDIwMDEsIDB4MDAwYiwgMHhhMTEyLCAweGEwMGUsIDB4MjFhOCwgMHg0MWE0LAorCTB4MzQwMCwgMHg4MjExLCAweDFkZDgsIDB4NzE2MCwgMHgzNDAwLCAweGExMDIsIDB4MDEyMCwgMHgwMjE4LAorCTB4MjBhOCwgMHhhMDBlLCAweDQxYTQsIDB4MzgwMCwgMHhkMDhjLCAweDAxZDgsIDB4MjAwOSwgMHhhZDAwLAorCTB4ODEwZCwgMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwgMHhhMThjLCAweDAwMGYsIDB4MjAwMSwgMHgwMDAxLAorCTB4YTExMiwgMHgyMGExLCAweDEwMDAsIDB4YTAwZSwgMHgyMWE4LCAweDQxYTQsIDB4ODIxMSwgMHgxZGUwLAorCTB4MjAwOSwgMHhhZDAwLCAweDM0MDAsIDB4YTEwMiwgMHgwMTIwLCAweDAyMTgsIDB4MjBhOCwgMHhhMDBlLAorCTB4NDFhNCwgMHgwODBjLCAweDEzZmMsIDB4MDgwYywgMHgxNjEzLCAweDA4MGMsIDB4MTdhYywgMHgwODBjLAorCTB4MWU2NywgMHgwODBjLCAweDQ5MmUsIDB4MDgwYywgMHg4MDFhLCAweDA4MGMsIDB4MTU5YywgMHgwODBjLAorCTB4MmNlNiwgMHgwODBjLCAweDVhMDEsIDB4MDgwYywgMHg1MDQ1LCAweDA4MGMsIDB4NjQ4NywgMHgwODBjLAorCTB4MjM2YSwgMHgwODBjLCAweDY2ODYsIDB4MDgwYywgMHg1ZmFlLCAweDA4MGMsIDB4MjI2YiwgMHgwODBjLAorCTB4MjMzOCwgMHgyMDkxLCAweDMwMDksIDB4NzgyMywgMHgwMDAwLCAweDEwMDQsIDB4MTBjNSwgMHg3ODIwLAorCTB4YTA4NiwgMHgwMDAyLCAweDExNTAsIDB4NzgyMywgMHg0MDAwLCAweDBlMDQsIDB4MTBiZCwgMHg3ODFiLAorCTB4MDAwMSwgMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwgMHg0MDgwLCAweDJhNzAsIDB4NzAwMywgMHgwMDAwLAorCTB4MmE3MCwgMHg3MDAwLCAweGEwOGUsIDB4MDAwMywgMHgxMTU4LCAweDA4MGMsIDB4M2M5OCwgMHgwODBjLAorCTB4MmQwZCwgMHgwODBjLCAweDVhNGYsIDB4MDgwYywgMHg1MWY0LCAweDA4MGMsIDB4NjRhMiwgMHgwYzgwLAorCTB4MDAwYiwgMHgwYzk4LCAweDEwZTQsIDB4MTBlNSwgMHgxMjAzLCAweDEwZTIsIDB4MTJjYywgMHgxM2Y5LAorCTB4MTNmYSwgMHgxM2ZiLCAweDA4MGMsIDB4MTRmNiwgMHgwMDA1LCAweDAxMjYsIDB4MDBmNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg3MDAwLCAweGEwODYsIDB4MDAwMSwgMHgxOTA0LCAweDExZDEsIDB4MDgwYywgMHgxNTY5LAorCTB4MDgwYywgMHg1NzRmLCAweDAxNTAsIDB4MDgwYywgMHg1Nzc1LCAweDE1ODAsIDB4MjA3OSwgMHgwMTAwLAorCTB4NzgyOCwgMHhhMDg1LCAweDE4MDAsIDB4NzgyYSwgMHgwNDQ4LCAweDA4MGMsIDB4NTY5YSwgMHg3MDAwLAorCTB4YTA4NiwgMHgwMDAxLCAweDE5MDQsIDB4MTFkMSwgMHg3MDg4LCAweGEwODYsIDB4MDAyOCwgMHgxOTA0LAorCTB4MTFkMSwgMHgyMDc5LCAweDAxMDAsIDB4NzgyNywgMHhmZmZmLCAweDdhMjgsIDB4YTI5NSwgMHgxZTJmLAorCTB4N2EyYSwgMHgyMDExLCAweDU2NmUsIDB4MDgwYywgMHg2NTBkLCAweDIwMTEsIDB4NTY3YiwgMHgwODBjLAorCTB4NjUwZCwgMHgyMDExLCAweDQ4MWIsIDB4MDgwYywgMHg2NTBkLCAweDIwMTEsIDB4ODAzMCwgMHgyMDE5LAorCTB4MDAwMCwgMHg3MDg3LCAweDAwMDAsIDB4MDgwYywgMHgxZDBmLCAweDAwZTgsIDB4MDgwYywgMHg0MWQxLAorCTB4MjA3OSwgMHgwMTAwLCAweDc4NDQsIDB4YTAwNSwgMHgxOTA0LCAweDExZDEsIDB4MjAxMSwgMHg0ODFiLAorCTB4MDgwYywgMHg2NTBkLCAweDIwMTEsIDB4NTY3YiwgMHgwODBjLCAweDY1MGQsIDB4MDgwYywgMHgxZDBmLAorCTB4MjAwMSwgMHhhZjhjLCAweDIwMDQsIDB4NzgwZSwgMHg3ODQwLCAweGEwODQsIDB4ZmZmYiwgMHg3ODQyLAorCTB4MjAxMSwgMHg4MDEwLCAweDczYzgsIDB4MDgwYywgMHgzYzVjLCAweDcyMzgsIDB4YzI4NCwgMHg3MjNhLAorCTB4MjAwMSwgMHhhZDBjLCAweDIwMGMsIDB4YzFhYywgMHgyMTAyLCAweDA4MGMsIDB4NzliZCwgMHgyMDExLAorCTB4MDAwNCwgMHgwODBjLCAweDk1OWMsIDB4MDgwYywgMHg0ZjcxLCAweDA4MGMsIDB4NTc0ZiwgMHgwMTU4LAorCTB4MDgwYywgMHg0OTE3LCAweDAxNDAsIDB4NzA4NywgMHgwMDAxLCAweDcwYzMsIDB4MDAwMCwgMHgwODBjLAorCTB4NDM2ZSwgMHgwODA0LCAweDExZDEsIDB4MDgwYywgMHg1MDJkLCAweDAxMjAsIDB4N2EwYywgMHhjMmI0LAorCTB4N2EwZSwgMHgwMDUwLCAweDA4MGMsIDB4OTkzNywgMHg3MGQwLCAweGQwOWMsIDB4MTEyOCwgMHg3MDljLAorCTB4YTAwNSwgMHgwMTEwLCAweDA4MGMsIDB4NDhmNSwgMHg3MGRiLCAweDAwMDAsIDB4NzBkNywgMHgwMDAwLAorCTB4NzJkMCwgMHgwODBjLCAweDU3NGYsIDB4MTE3OCwgMHgyMDExLCAweDAwMDAsIDB4MDAxNiwgMHgwODBjLAorCTB4Mjc0NCwgMHgyMDE5LCAweGFmOGUsIDB4MjExYSwgMHgwMDFlLCAweDcwNGYsIDB4ZmZmZiwgMHg3MDUzLAorCTB4MDBlZiwgMHg3MDczLCAweDAwMDAsIDB4MjA3OSwgMHhhZDUxLCAweDc4MDQsIDB4ZDBhYywgMHgwMTA4LAorCTB4YzI5NSwgMHg3MmQyLCAweDA4MGMsIDB4NTc0ZiwgMHgwMTE4LCAweGEyOTYsIDB4MDAwNCwgMHgwNTA4LAorCTB4MjAxMSwgMHgwMDAxLCAweDA4MGMsIDB4OTU5YywgMHg3MDk3LCAweDAwMDAsIDB4NzA5YiwgMHhmZmZmLAorCTB4NzAwMywgMHgwMDAyLCAweDAwZmUsIDB4MDgwYywgMHgyOGZhLCAweDIwMTEsIDB4MDAwNSwgMHgwODBjLAorCTB4N2FkZiwgMHgwODBjLCAweDZjNTAsIDB4MDgwYywgMHg1NzRmLCAweDAxNDgsIDB4MDBjNiwgMHgyMDYxLAorCTB4MDEwMCwgMHgwMDE2LCAweDA4MGMsIDB4Mjc0NCwgMHg2MWUyLCAweDAwMWUsIDB4MDBjZSwgMHgwMTJlLAorCTB4MDBkMCwgMHg3MDk3LCAweDAwMDAsIDB4NzA5YiwgMHhmZmZmLCAweDcwMDMsIDB4MDAwMiwgMHgyMDExLAorCTB4MDAwNSwgMHgwODBjLCAweDdhZGYsIDB4MDgwYywgMHg2YzUwLCAweDA4MGMsIDB4NTc0ZiwgMHgwMTQ4LAorCTB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4MDAxNiwgMHgwODBjLCAweDI3NDQsIDB4NjFlMiwgMHgwMDFlLAorCTB4MDBjZSwgMHgwMGZlLCAweDAxMmUsIDB4MDAwNSwgMHgwMGM2LCAweDA4MGMsIDB4NTc0ZiwgMHgxMTE4LAorCTB4MjBhOSwgMHgwMTAwLCAweDAwMTAsIDB4MjBhOSwgMHgwMDgyLCAweDA4MGMsIDB4NTc0ZiwgMHgxMTE4LAorCTB4MjAwOSwgMHgwMDAwLCAweDAwMTAsIDB4MjAwOSwgMHgwMDdlLCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LAorCTB4MjExMCwgMHgwMDI2LCAweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweDdjZjQsIDB4MDAyZSwgMHgwODBjLAorCTB4YWMwNywgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwODBjLCAweDJiYzksIDB4ODEwOCwgMHgxZjA0LAorCTB4MTFlNSwgMHgwMGNlLCAweDcwNmYsIDB4MDAwMCwgMHg3MDcwLCAweGEwODQsIDB4MDBmZiwgMHg3MDcyLAorCTB4NzA5ZiwgMHgwMDAwLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAwMCwgMHhhMDg2LAorCTB4MDAwMiwgMHgxOTA0LCAweDEyY2EsIDB4NzA5OCwgMHhhMDg2LCAweGZmZmYsIDB4MDEzMCwgMHgwODBjLAorCTB4MjhmYSwgMHgwODBjLCAweDZjNTAsIDB4MDgwNCwgMHgxMmNhLCAweDcwZDAsIDB4ZDBhYywgMHgxMTEwLAorCTB4ZDA5YywgMHgwNTQwLCAweGQwODQsIDB4MDUzMCwgMHgwMDA2LCAweDAwMTYsIDB4MjAwMSwgMHgwMTAzLAorCTB4MjAwOSwgMHhhZjhjLCAweDIxMGMsIDB4MjEwMiwgMHgwMDFlLCAweDAwMGUsIDB4ZDA4YywgMHgwMWQwLAorCTB4NzBkNCwgMHhhMDg2LCAweGZmZmYsIDB4MDE5MCwgMHgwODBjLCAweDJhNTYsIDB4MDgwYywgMHg2YzUwLAorCTB4NzBkMCwgMHhkMDk0LCAweDE5MDQsIDB4MTJjYSwgMHgyMDExLCAweDAwMDEsIDB4MjAxOSwgMHgwMDAwLAorCTB4MDgwYywgMHgyYThjLCAweDA4MGMsIDB4NmM1MCwgMHgwODA0LCAweDEyY2EsIDB4NzBkOCwgMHhhMDA1LAorCTB4MTkwNCwgMHgxMmNhLCAweDcwOTQsIDB4YTAwNSwgMHgxOTA0LCAweDEyY2EsIDB4NzBkMCwgMHhkMGE0LAorCTB4MDExOCwgMHhkMGI0LCAweDA5MDQsIDB4MTJjYSwgMHgwODBjLCAweDUwMmQsIDB4MTkwNCwgMHgxMmNhLAorCTB4MjAwMSwgMHhhZDUyLCAweDIwMDQsIDB4ZDBhYywgMHgwMWM4LCAweDAxNTYsIDB4MDBjNiwgMHgyMGE5LAorCTB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsIDB4MDAxNiwgMHgwODBjLCAweDRjZGMsIDB4MTExOCwgMHg2MDAwLAorCTB4ZDBlYywgMHgxMTM4LCAweDAwMWUsIDB4ODEwOCwgMHgxZjA0LCAweDEyNWIsIDB4MDBjZSwgMHgwMTVlLAorCTB4MDAyOCwgMHgwMDFlLCAweDAwY2UsIDB4MDE1ZSwgMHgwODA0LCAweDEyY2EsIDB4MDAwNiwgMHgwMDE2LAorCTB4MjAwMSwgMHgwMTAzLCAweDIwMDksIDB4YWY4YywgMHgyMTBjLCAweDIxMDIsIDB4MDAxZSwgMHgwMDBlLAorCTB4YTAwNiwgMHgyMDA5LCAweDA3MDAsIDB4MjBhOSwgMHgwMDAyLCAweDIwYTEsIDB4YWZiNSwgMHg0MGExLAorCTB4NzA2YywgMHg4MDA3LCAweDcxNzAsIDB4ODEwZiwgMHgyMGE5LCAweDAwMDIsIDB4NDBhMSwgMHgyMDA5LAorCTB4MDAwMCwgMHgwODBjLCAweDE0ZGMsIDB4MjAwMSwgMHgwMDAwLCAweDgxMGYsIDB4MjBhOSwgMHgwMDAyLAorCTB4NDBhMSwgMHhhMDA2LCAweDIwMDksIDB4MDIwMCwgMHgyMGE5LCAweDAwMDIsIDB4MjBhMSwgMHhhZmM1LAorCTB4NDBhMSwgMHg3MDMwLCAweGMwOGMsIDB4NzAzMiwgMHg3MDAzLCAweDAwMDMsIDB4NzA5YiwgMHhmZmZmLAorCTB4MDgwYywgMHgxNTYyLCAweGEwMDYsIDB4MDgwYywgMHgyNjFlLCAweDA4MGMsIDB4M2NjZSwgMHgwMGY2LAorCTB4MjA3OSwgMHgwMTAwLCAweDA4MGMsIDB4NTc3NSwgMHgwMTUwLCAweDA4MGMsIDB4NTc0ZiwgMHg3ODI4LAorCTB4MDExOCwgMHhhMDg0LCAweGUxZmYsIDB4MDAxMCwgMHhhMDg0LCAweGZmZGYsIDB4NzgyYSwgMHgwMGZlLAorCTB4MjAwMSwgMHhhZmM4LCAweDIwMDQsIDB4YTA4NiwgMHgwMDA1LCAweDExMjAsIDB4MjAxMSwgMHgwMDAwLAorCTB4MDgwYywgMHg3YWRmLCAweDIwMTEsIDB4MDAwMCwgMHgwODBjLCAweDdhZTksIDB4MDgwYywgMHg2YzUwLAorCTB4MDgwYywgMHg2ZDBkLCAweDAxMmUsIDB4MDAwNSwgMHgwMDE2LCAweDAwNDYsIDB4MDBmNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzksIDB4MDEwMCwgMHgyMDA5LCAweGFkMzMsIDB4MjEwNCwgMHhhMDA1LAorCTB4MTExMCwgMHgwODBjLCAweDI3NzAsIDB4MjAwOSwgMHgwMGY3LCAweDA4MGMsIDB4NDhkZSwgMHg3OTQwLAorCTB4YTE4YywgMHgwMDEwLCAweDc5NDIsIDB4NzkyNCwgMHhkMWI0LCAweDAxMTAsIDB4NzgyNywgMHgwMDQwLAorCTB4ZDE5YywgMHgwMTEwLCAweDc4MjcsIDB4MDAwOCwgMHgwMDA2LCAweDAwMzYsIDB4MDE1NiwgMHg3OTU0LAorCTB4ZDFhYywgMHgxOTA0LCAweDEzM2EsIDB4MDgwYywgMHg1NzYxLCAweDAxNTgsIDB4MDgwYywgMHg1Nzc1LAorCTB4MTEyOCwgMHgyMDAxLCAweGFmOWQsIDB4MjAwMywgMHgwMDAwLCAweDAwNzAsIDB4MDgwYywgMHg1NzU3LAorCTB4MGRjMCwgMHgyMDAxLCAweGFmOWQsIDB4MjAwMywgMHhhYWFhLCAweDIwMDEsIDB4YWY5ZSwgMHgyMDAzLAorCTB4MDAwMSwgMHgwODBjLCAweDU2OWEsIDB4MDA1OCwgMHgwODBjLCAweDU3NGYsIDB4MDE0MCwgMHgyMDA5LAorCTB4MDBmOCwgMHgwODBjLCAweDQ4ZGUsIDB4Nzg0MywgMHgwMDkwLCAweDc4NDMsIDB4MDAxMCwgMHgyMGE5LAorCTB4MDljNCwgMHg3ODIwLCAweGQwOWMsIDB4MTEzOCwgMHgwODBjLCAweDU3NGYsIDB4MDEzOCwgMHg3ODI0LAorCTB4ZDBhYywgMHgxOTA0LCAweDEzZTAsIDB4MWYwNCwgMHgxMzE5LCAweDAwNzAsIDB4NzgyNCwgMHgwODBjLAorCTB4NTc2YiwgMHgwMTE4LCAweGQwYWMsIDB4MTkwNCwgMHgxM2UwLCAweGEwODQsIDB4MTgwMCwgMHgwZDk4LAorCTB4NzAwMywgMHgwMDAxLCAweDA4MDQsIDB4MTNlMCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyNjFlLAorCTB4MDgwNCwgMHgxM2VmLCAweDc4NTAsIDB4YTA4NCwgMHgwMTgwLCAweDc4NTIsIDB4NzgyZiwgMHgwMDIwLAorCTB4MjBhOSwgMHgwMDQ2LCAweDFkMDQsIDB4MTM0MiwgMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwgMHgxMzQyLAorCTB4Nzg1MCwgMHhhMDg0LCAweDAxODAsIDB4YTA4NSwgMHgwNDAwLCAweDc4NTIsIDB4NzgyZiwgMHgwMDAwLAorCTB4MDgwYywgMHg1NzYxLCAweDAxNTgsIDB4MDgwYywgMHg1Nzc1LCAweDExMjgsIDB4MjAwMSwgMHhhZjlkLAorCTB4MjAwMywgMHgwMDAwLCAweDAwNzAsIDB4MDgwYywgMHg1NzU3LCAweDBkYzAsIDB4MjAwMSwgMHhhZjlkLAorCTB4MjAwMywgMHhhYWFhLCAweDIwMDEsIDB4YWY5ZSwgMHgyMDAzLCAweDAwMDEsIDB4MDgwYywgMHg1NjlhLAorCTB4MDAyMCwgMHgyMDA5LCAweDAwZjgsIDB4MDgwYywgMHg0OGRlLCAweDIwYTksIDB4MDAwZSwgMHhlMDAwLAorCTB4MWYwNCwgMHgxMzZmLCAweDc4NTAsIDB4YTA4NCwgMHgwMTgwLCAweGEwODUsIDB4MTQwMCwgMHg3ODUyLAorCTB4MDgwYywgMHg1NzRmLCAweDAxMjAsIDB4Nzg0MywgMHgwMDkwLCAweDc4NDMsIDB4MDAxMCwgMHgyMDIxLAorCTB4ZTY3OCwgMHgyMDE5LCAweGVhNjAsIDB4NzgyMCwgMHhkMDljLCAweDE1NTgsIDB4MDgwYywgMHg1NzRmLAorCTB4MDViOCwgMHg3ODI0LCAweGQwYWMsIDB4MTkwNCwgMHgxM2UwLCAweDA4MGMsIDB4NTc3NSwgMHgxNTA4LAorCTB4MDA0NiwgMHgyMDIxLCAweDAxOTAsIDB4ODQyMSwgMHgxZGYwLCAweDAwNGUsIDB4ODQyMSwgMHgxMWM4LAorCTB4NzgyNywgMHgwMDQ4LCAweDIwYTksIDB4MDFmNCwgMHgxZDA0LCAweDEzOWMsIDB4MjA5MSwgMHg2MDAwLAorCTB4MWYwNCwgMHgxMzljLCAweDc4MjQsIDB4YTA4NCwgMHgwMDY4LCAweDE1YTgsIDB4MjAwMSwgMHhhZjlkLAorCTB4MjAwMywgMHhhYWFhLCAweDIwMDEsIDB4YWY5ZSwgMHgyMDAzLCAweDAwMDEsIDB4NzAwMywgMHgwMDAxLAorCTB4MDQ3OCwgMHg4MzE5LCAweDE5ODAsIDB4MjAwOSwgMHhhZDMzLCAweDIxMDQsIDB4ODAwMCwgMHgyMDBhLAorCTB4YTA4NCwgMHhmZmYwLCAweDAxMjAsIDB4MjAwYiwgMHgwMDAwLCAweDA4MGMsIDB4Mjc3MCwgMHgwMGQ4LAorCTB4MDgwYywgMHg1NzYxLCAweDExNDAsIDB4YTRhMiwgMHgwMDY0LCAweDExMjgsIDB4MDgwYywgMHg1NzI2LAorCTB4NzAwMywgMHgwMDAxLCAweDAwYTgsIDB4NzgyNywgMHgxODAwLCAweGUwMDAsIDB4ZTAwMCwgMHg3ODI0LAorCTB4MDgwYywgMHg1NzZiLCAweDAxMTAsIDB4ZDBhYywgMHgxMTU4LCAweGEwODQsIDB4MTgwMCwgMHgwOWM4LAorCTB4NzAwMywgMHgwMDAxLCAweDAwMjgsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjYxZSwgMHgwMDQ4LAorCTB4MjAwMSwgMHhhZDMzLCAweDIwMDMsIDB4MDAwMCwgMHg3ODI3LCAweDAwNDgsIDB4NzgyOCwgMHhjMDlkLAorCTB4NzgyYSwgMHg3ODUwLCAweGEwODQsIDB4MDE4MCwgMHhhMDg1LCAweDA0MDAsIDB4Nzg1MiwgMHgwMTVlLAorCTB4MDAzZSwgMHgwMDBlLCAweDA4MGMsIDB4MTUzOSwgMHgwMTJlLCAweDAwZmUsIDB4MDA0ZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHgyYTcwLCAweDIwMDEsIDB4YWY5ZCwgMHgyMDAzLAorCTB4MDAwMCwgMHg3MDg3LCAweDAwMDAsIDB4MjAwOSwgMHgwMTAwLCAweDIxMDQsIDB4YTA4MiwgMHgwMDAyLAorCTB4MDIxOCwgMHg3MDRmLCAweGZmZmYsIDB4MDAxMCwgMHg3MDRmLCAweDAwMDAsIDB4NzA1NywgMHhmZmZmLAorCTB4NzA2ZiwgMHgwMDAwLCAweDcwNzMsIDB4MDAwMCwgMHgwODBjLCAweDk5MzcsIDB4MjA2MSwgMHhhZjhkLAorCTB4NjAwMywgMHgwOTA5LCAweDYwMDcsIDB4MDAwMCwgMHg2MDBiLCAweDg4MDAsIDB4NjAwZiwgMHgwMjAwLAorCTB4NjAxMywgMHgwMGZmLCAweDYwMTcsIDB4MDAwMywgMHg2MDFiLCAweDAwMDAsIDB4NjAxZiwgMHgwN2QwLAorCTB4MjA2MSwgMHhhZjk1LCAweDYwMDMsIDB4ODAwMCwgMHg2MDA3LCAweDAwMDAsIDB4NjAwYiwgMHgwMDAwLAorCTB4NjAwZiwgMHgwMjAwLCAweDYwMTMsIDB4MDBmZiwgMHg2MDE3LCAweDAwMDAsIDB4NjAxYiwgMHgwMDAxLAorCTB4NjAxZiwgMHgwMDAwLCAweDIwNjEsIDB4YWZhNiwgMHg2MDAzLCAweDUxNGMsIDB4NjAwNywgMHg0ZjQ3LAorCTB4NjAwYiwgMHg0OTQzLCAweDYwMGYsIDB4MjAyMCwgMHgyMDAxLCAweGFkMjcsIDB4MjAwMywgMHgwMDAwLAorCTB4MDAwNSwgMHgwNGEwLCAweDIwMTEsIDB4MDAwMCwgMHg4MWZmLCAweDA1NzAsIDB4YTE4NiwgMHgwMDAxLAorCTB4MTE0OCwgMHgyMDMxLCAweDhmZmYsIDB4MjAzOSwgMHhjYzAxLCAweDIwMjEsIDB4MDEwMCwgMHgyMDI5LAorCTB4Y2MwMCwgMHgwMGU4LCAweGExODYsIDB4MDAwMiwgMHgxMTE4LCAweDIwMTEsIDB4MDAwMCwgMHgwMGI4LAorCTB4YTE4NiwgMHgwMDA1LCAweDExMTgsIDB4MjAxMSwgMHgwMDAxLCAweDAwODgsIDB4YTE4NiwgMHgwMDA5LAorCTB4MTExOCwgMHgyMDExLCAweDAwMDIsIDB4MDA1OCwgMHhhMTg2LCAweDAwMGEsIDB4MTExOCwgMHgyMDExLAorCTB4MDAwMiwgMHgwMDI4LCAweGExODYsIDB4MDA1NSwgMHgxMTEwLCAweDIwMTEsIDB4MDAwMywgMHgzODAwLAorCTB4YTA4NCwgMHhmZmZjLCAweGEyMDUsIDB4MjBjMCwgMHgwODA0LCAweDEwNGQsIDB4YTAwZSwgMHgyMDExLAorCTB4MDAwMywgMHgyMDE5LCAweDE0ODUsIDB4MDgwNCwgMHgxNGQ2LCAweDIwMTksIDB4YWFhYSwgMHgyMDYxLAorCTB4ZmZmZiwgMHgyYzE0LCAweDIzNjIsIDB4ZTAwMCwgMHhlMDAwLCAweDJjMDQsIDB4YTMwNiwgMHgyMjYyLAorCTB4MTExMCwgMHhjMWI1LCAweGMxYTUsIDB4MjAxMSwgMHgwMDAwLCAweDIwMTksIDB4MTQ5OCwgMHgwNGYwLAorCTB4MjAxOSwgMHhhYWFhLCAweDIwNjEsIDB4ZmZmZiwgMHgyYzE0LCAweDIzNjIsIDB4ZTAwMCwgMHhlMDAwLAorCTB4MmMxYywgMHgyMDYxLCAweDdmZmYsIDB4ZTAwMCwgMHhlMDAwLCAweDJjMDQsIDB4MjA2MSwgMHhmZmZmLAorCTB4MjI2MiwgMHhhMzA2LCAweDAxMTAsIDB4YzE4ZCwgMHgwMDA4LCAweGMxODUsIDB4MjAxMSwgMHgwMDAyLAorCTB4MjAxOSwgMHgxNGIzLCAweDA0MTgsIDB4MjA2MSwgMHhmZmZmLCAweDIwMTksIDB4YWFhYSwgMHgyYzE0LAorCTB4MjM2MiwgMHhlMDAwLCAweGUwMDAsIDB4MmMwNCwgMHgyMjYyLCAweGEzMDYsIDB4MTE4MCwgMHgyYzE0LAorCTB4MjM2MiwgMHhlMDAwLCAweGUwMDAsIDB4MmMxYywgMHgyMDYxLCAweDdmZmYsIDB4MmMwNCwgMHgyMDYxLAorCTB4ZmZmZiwgMHgyMjYyLCAweGEzMDYsIDB4MTExMCwgMHhjMTk1LCAweDAwMDgsIDB4YzE5ZCwgMHgyMDExLAorCTB4MDAwMSwgMHgyMDE5LCAweDE0ZDQsIDB4MDAxMCwgMHgwODA0LCAweDE0NGEsIDB4MzgwMCwgMHhhMDg0LAorCTB4ZmZmYywgMHhhMjA1LCAweDIwYzAsIDB4MDgzNywgMHgyMDExLCAweDAwMDAsIDB4MDgwYywgMHg0Y2RjLAorCTB4MTE3OCwgMHg2MDA0LCAweGEwYzQsIDB4MDBmZiwgMHhhOGM2LCAweDAwMDYsIDB4MDEyOCwgMHhhMGM0LAorCTB4ZmYwMCwgMHhhOGM2LCAweDA2MDAsIDB4MTEyMCwgMHhhMTg2LCAweDAwODAsIDB4MDEwOCwgMHg4MjEwLAorCTB4ODEwOCwgMHhhMTg2LCAweDAxMDAsIDB4MWQ1MCwgMHgyMjA4LCAweDAwMDUsIDB4MjA5MSwgMHg4MDAwLAorCTB4MGUwNCwgMHgxNGY4LCAweDAwMDYsIDB4MDAxNiwgMHgyMDc5LCAweDAwMDAsIDB4NzgxOCwgMHhkMDg0LAorCTB4MWRlOCwgMHgwMDFlLCAweDc5MmUsIDB4MDAwZSwgMHg3ODJhLCAweDAwMGUsIDB4NzgyNiwgMHgzOTAwLAorCTB4NzgzYSwgMHg3ODIzLCAweDgwMDIsIDB4NzgxYiwgMHgwMDAxLCAweDIwOTEsIDB4NTAwMCwgMHgwMTI2LAorCTB4MDE1NiwgMHgwMTQ2LCAweDIwYTksIDB4MDAxMCwgMHgyMGExLCAweGIwYzgsIDB4MjA5MSwgMHgyMDAwLAorCTB4NDBhMSwgMHgyMGE5LCAweDAwMTAsIDB4MjA5MSwgMHgyMjAwLCAweDQwYTEsIDB4MjBhOSwgMHgwMDEwLAorCTB4MjA5MSwgMHgyNDAwLCAweDQwYTEsIDB4MjBhOSwgMHgwMDEwLCAweDIwOTEsIDB4MjYwMCwgMHg0MGExLAorCTB4MjBhOSwgMHgwMDEwLCAweDIwOTEsIDB4MjgwMCwgMHg0MGExLCAweDAxNGUsIDB4MDE1ZSwgMHgwMTJlLAorCTB4MjA3OSwgMHhhZDAwLCAweDc4MDMsIDB4MDAwNSwgMHgyMDkxLCAweDQwODAsIDB4MDRjOSwgMHgwY2Y4LAorCTB4MDAwNSwgMHgwMDA2LCAweDA4MGMsIDB4MTU4NCwgMHgxNTE4LCAweDAwZjYsIDB4MjA3OSwgMHhhZDIzLAorCTB4MmYwNCwgMHg4MDAwLCAweDIwN2EsIDB4YTA4MiwgMHgwMDBmLCAweDAyNTgsIDB4YTAwNiwgMHgyMDdhLAorCTB4MjA3OSwgMHhhZDI1LCAweDJmMDQsIDB4YTA4NCwgMHgwMDAxLCAweGEwODYsIDB4MDAwMSwgMHgyMDdhLAorCTB4MDA3MCwgMHgyMDc5LCAweGFkMjUsIDB4MmY3YywgMHg4ZmZmLCAweDExMjgsIDB4MjAwMSwgMHgwYzAzLAorCTB4MjAwMywgMHgwMDQwLCAweDAwMjAsIDB4MjAwMSwgMHgwYzAzLCAweDIwMDMsIDB4MDBjMCwgMHgwMGZlLAorCTB4MDAwZSwgMHgwMDA1LCAweDA0MDksIDB4MTEyMCwgMHgyMDAxLCAweDBjMDMsIDB4MjAwMywgMHgwMDgwLAorCTB4MDAwNSwgMHgwMGQxLCAweDExMjAsIDB4MjAwMSwgMHgwYzAzLCAweDIwMDMsIDB4MDA0MCwgMHgwMDA1LAorCTB4MDAwNiwgMHgwMDkxLCAweDExNzgsIDB4MjAwMSwgMHgwYzAzLCAweDIwMDMsIDB4MDA0MCwgMHgyMDA5LAorCTB4MGZmZiwgMHgwMGExLCAweDIwMDEsIDB4MGMwMywgMHgyMDAzLCAweDAwODAsIDB4MjAwOSwgMHgwZmZmLAorCTB4MDA2OSwgMHgwYzg4LCAweDAwMGUsIDB4MDAwNSwgMHgwMGM2LCAweDIwNjEsIDB4MGMwMCwgMHgyYzA0LAorCTB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDBhYSwgMHgwMGNlLCAweDAwMDUsIDB4MDE1NiwgMHgwMTI2LAorCTB4YTE4YywgMHgwZmZmLCAweDIxYTgsIDB4MWQwNCwgMHgxNTkzLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LAorCTB4MTU5MywgMHgwMTJlLCAweDAxNWUsIDB4MDAwNSwgMHgyMDcxLCAweGFkMDAsIDB4NzE1YywgMHg3MTJlLAorCTB4MjAyMSwgMHgwMDAxLCAweGExOTAsIDB4MDAzMCwgMHhhMjk4LCAweDAwMzAsIDB4MDI0MCwgMHg3MDYwLAorCTB4YTMwMiwgMHgxMjI4LCAweDIyMGEsIDB4MjIwOCwgMHgyMzEwLCAweDg0MjAsIDB4MGNhOCwgMHgzODAwLAorCTB4ZDA4YywgMHgwMTQ4LCAweDcwNjAsIDB4YTA4NiwgMHhhZDAwLCAweDAxMjgsIDB4NzA2MywgMHhhZDAwLAorCTB4MjAxMSwgMHgxMDAwLCAweDBjNDgsIDB4MjAwYiwgMHgwMDAwLCAweDc0YWUsIDB4NzRiMiwgMHgwMDA1LAorCTB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGFkMDAsIDB4NzBiMCwgMHhhMGVhLAorCTB4MDAxMCwgMHgwMjY4LCAweDgwMDEsIDB4NzBiMiwgMHg3MDJjLCAweDIwNjgsIDB4MmQwNCwgMHg3MDJlLAorCTB4MjA2YiwgMHgwMDAwLCAweDY4MDcsIDB4MDAwMCwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHhhMDZlLAorCTB4MGNkOCwgMHgwMGU2LCAweDIwNzEsIDB4YWQwMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MGIwLAorCTB4ODAwMSwgMHgwMjYwLCAweDcwYjIsIDB4NzAyYywgMHgyMDY4LCAweDJkMDQsIDB4NzAyZSwgMHgyMDZiLAorCTB4MDAwMCwgMHg2ODA3LCAweDAwMDAsIDB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4YTA2ZSwgMHgwY2Q4LAorCTB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGFkMDAsIDB4NzAyYywgMHgyMDZhLAorCTB4MmQwMCwgMHg3MDJlLCAweDcwYjAsIDB4ODAwMCwgMHg3MGIyLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LAorCTB4OGRmZiwgMHgwMTM4LCAweDY4MDQsIDB4NjgwNywgMHgwMDAwLCAweDAwMDYsIDB4MGM0OSwgMHgwMGRlLAorCTB4MGNiOCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhhZDAwLCAweDcwYjAsIDB4YTA4YSwgMHgwMDEwLAorCTB4YTAwZCwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweGFmZWMsIDB4NzAwNywgMHgwMDAwLAorCTB4NzAxYiwgMHgwMDAwLCAweDcwMWYsIDB4MDAwMCwgMHgyMDcxLCAweDAwMDAsIDB4NzAxMCwgMHhhMDg1LAorCTB4ODAwNCwgMHg3MDEyLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDIyNzAsIDB4NzAwYiwgMHgwMDAwLAorCTB4MjA3MSwgMHhhZmVjLCAweDcwMTgsIDB4YTA4OCwgMHhhZmY1LCAweDIyMGEsIDB4ODAwMCwgMHhhMDg0LAorCTB4MDAwNywgMHg3MDFhLCAweDcwMDQsIDB4YTAwNSwgMHgxMTI4LCAweDAwZjYsIDB4MjA3OSwgMHgwMDEwLAorCTB4MDA4MSwgMHgwMGZlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4YWZlYywgMHg3MDA0LAorCTB4YTAwNSwgMHgxMTI4LCAweDAwZjYsIDB4MjA3OSwgMHgwMDEwLCAweDAwMTksIDB4MDBmZSwgMHgwMGVlLAorCTB4MDAwNSwgMHg3MDAwLCAweDAwMDIsIDB4MTY0ZiwgMHgxNmIzLCAweDE2ZDAsIDB4MTZkMCwgMHg3MDE4LAorCTB4NzExYywgMHhhMTA2LCAweDExMTgsIDB4NzAwNywgMHgwMDAwLCAweDAwMDUsIDB4MDBkNiwgMHhhMTgwLAorCTB4YWZmNSwgMHgyMDA0LCAweDcwMGEsIDB4MjA2OCwgMHg4MTA4LCAweGExOGMsIDB4MDAwNywgMHg3MTFlLAorCTB4NzgwMywgMHgwMDI2LCAweDY4MjQsIDB4NzgzMiwgMHg2ODI4LCAweDc4MzYsIDB4NjgyYywgMHg3ODNhLAorCTB4NjgzMCwgMHg3ODNlLCAweDY4MTAsIDB4NzAwZSwgMHg2ODBjLCAweDcwMTYsIDB4NjgwNCwgMHgwMGRlLAorCTB4ZDA4NCwgMHgwMTIwLCAweDcwMDcsIDB4MDAwMSwgMHgwMDI5LCAweDAwMDUsIDB4NzAwNywgMHgwMDAyLAorCTB4MDBiMSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHg3MTBjLCAweDIwMTEsIDB4MDA0MCwgMHhhMTgyLAorCTB4MDA0MCwgMHgxMjEwLCAweDIxMTAsIDB4YTAwNiwgMHg3MDBlLCAweDcyMTIsIDB4ODIwMywgMHg3ODIyLAorCTB4NzgwMywgMHgwMDIwLCAweDc4MDMsIDB4MDA0MSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMDE2LAorCTB4MDAyNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHg3MDE0LCAweDIwOTgsIDB4MjBhMSwgMHgwMDE0LAorCTB4NzgwMywgMHgwMDI2LCAweDcxMGMsIDB4MjAxMSwgMHgwMDQwLCAweGExODIsIDB4MDA0MCwgMHgxMjEwLAorCTB4MjExMCwgMHhhMDA2LCAweDcwMGUsIDB4MjJhOCwgMHg1M2E2LCAweDgyMDMsIDB4NzgyMiwgMHg3ODAzLAorCTB4MDAyMCwgMHgzMzAwLCAweDcwMTYsIDB4NzgwMywgMHgwMDAxLCAweDAxNWUsIDB4MDE0ZSwgMHgwMTNlLAorCTB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MjA5OSwgMHhhZGY5LAorCTB4MjBhMSwgMHgwMDE4LCAweDIwYTksIDB4MDAwOCwgMHg1M2EzLCAweDc4MDMsIDB4MDAyMCwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDc4MDMsIDB4MDA0MSwgMHg3MDA3LCAweDAwMDMsIDB4NzAwMCwgMHhjMDg0LAorCTB4NzAwMiwgMHg3MDBiLCAweGFkZjQsIDB4MDEyZSwgMHgwMTVlLCAweDAxNGUsIDB4MDEzZSwgMHgwMDA1LAorCTB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MjAwMSwgMHhhZTI4LCAweDIwOWMsIDB4MjBhMSwgMHgwMDE0LAorCTB4NzgwMywgMHgwMDI2LCAweDIwMDEsIDB4YWUyOSwgMHgyMGFjLCAweDUzYTYsIDB4MjA5OSwgMHhhZTJhLAorCTB4MjBhMSwgMHgwMDE4LCAweDIwYTksIDB4MDAwOCwgMHg1M2EzLCAweDc4MDMsIDB4MDAyMCwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDc4MDMsIDB4MDAwMSwgMHg3MDA3LCAweDAwMDQsIDB4NzAwMCwgMHhjMDhjLAorCTB4NzAwMiwgMHg3MDBiLCAweGFlMjUsIDB4MDEyZSwgMHgwMTVlLCAweDAxNGUsIDB4MDEzZSwgMHgwMDA1LAorCTB4MDAxNiwgMHgwMGU2LCAweDIwNzEsIDB4YWZlYywgMHgwMGY2LCAweDIwNzksIDB4MDAxMCwgMHg3OTA0LAorCTB4NzgwMywgMHgwMDAyLCAweGQxZmMsIDB4MDEyMCwgMHhhMThjLCAweDA3MDAsIDB4NzAwNCwgMHgwMDIzLAorCTB4MDBmZSwgMHgwMGVlLCAweDAwMWUsIDB4MDAwNSwgMHgxNjQ5LCAweDE3MTMsIDB4MTc0MSwgMHgxNzZiLAorCTB4MTc5YiwgMHgxNzEyLCAweDBjZjgsIDB4YTE4YywgMHgwNzAwLCAweDE1MjgsIDB4MDEzNiwgMHgwMTQ2LAorCTB4MDE1NiwgMHg3MDE0LCAweDIwYTAsIDB4MjA5OSwgMHgwMDE0LCAweDc4MDMsIDB4MDA0MCwgMHg3MDEwLAorCTB4MjBhOCwgMHg1M2E1LCAweDM0MDAsIDB4NzAxNiwgMHgwMTVlLCAweDAxNGUsIDB4MDEzZSwgMHg3MDBjLAorCTB4YTAwNSwgMHgwNTcwLCAweDc4MzAsIDB4NzgzMiwgMHg3ODM0LCAweDc4MzYsIDB4MDgwYywgMHgxNjdhLAorCTB4MDAwNSwgMHg3MDA4LCAweGEwODAsIDB4MDAwMiwgMHgyMDAzLCAweDAxMDAsIDB4NzAwNywgMHgwMDAwLAorCTB4MDgwYywgMHgxNjQ5LCAweDAwMDUsIDB4NzAwOCwgMHhhMDgwLCAweDAwMDIsIDB4MjAwMywgMHgwMjAwLAorCTB4MGNhOCwgMHhhMThjLCAweDA3MDAsIDB4MTE1MCwgMHg3MDBjLCAweGEwMDUsIDB4MDE4OCwgMHg3ODMwLAorCTB4NzgzMiwgMHg3ODM0LCAweDc4MzYsIDB4MDgwYywgMHgxNjhmLCAweDAwMDUsIDB4NzAwOCwgMHhhMDgwLAorCTB4MDAwMiwgMHgyMDAzLCAweDAyMDAsIDB4NzAwNywgMHgwMDAwLCAweDA4MGMsIDB4MTY0OSwgMHgwMDA1LAorCTB4MDBkNiwgMHg3MDA4LCAweDIwNjgsIDB4NzgzMCwgMHg2ODI2LCAweDc4MzQsIDB4NjgyYSwgMHg3ODM4LAorCTB4NjgyZSwgMHg3ODNjLCAweDY4MzIsIDB4NjgwYiwgMHgwMTAwLCAweDAwZGUsIDB4NzAwNywgMHgwMDAwLAorCTB4MDgwYywgMHgxNjQ5LCAweDAwMDUsIDB4YTE4YywgMHgwNzAwLCAweDE1NDAsIDB4MDEzNiwgMHgwMTQ2LAorCTB4MDE1NiwgMHgyMDAxLCAweGFkZjcsIDB4MjAwNCwgMHhhMDgwLCAweDAwMGQsIDB4MjBhMCwgMHgyMDk5LAorCTB4MDAxNCwgMHg3ODAzLCAweDAwNDAsIDB4MjBhOSwgMHgwMDIwLCAweDUzYTUsIDB4MjAwMSwgMHhhZGY5LAorCTB4MjAwNCwgMHhkMGJjLCAweDAxNDgsIDB4MjAwMSwgMHhhZTAyLCAweDIwMDQsIDB4YTA4MCwgMHgwMDBkLAorCTB4MjBhMCwgMHgyMGE5LCAweDAwMjAsIDB4NTNhNSwgMHgwMTVlLCAweDAxNGUsIDB4MDEzZSwgMHg3MDA3LAorCTB4MDAwMCwgMHgwODBjLCAweDVhZTYsIDB4MDgwYywgMHgxNjQ5LCAweDAwMDUsIDB4MjAxMSwgMHg4MDAzLAorCTB4MDgwYywgMHgzYzVjLCAweDBjZjgsIDB4YTE4YywgMHgwNzAwLCAweDExNDgsIDB4MjAwMSwgMHhhZTI3LAorCTB4MjAwMywgMHgwMTAwLCAweDcwMDcsIDB4MDAwMCwgMHgwODBjLCAweDE2NDksIDB4MDAwNSwgMHgyMDExLAorCTB4ODAwNCwgMHgwODBjLCAweDNjNWMsIDB4MGNmOCwgMHgwMTI2LCAweDIwOTEsIDB4MjIwMCwgMHgyMDc5LAorCTB4MDAzMCwgMHgyMDcxLCAweGFmZmQsIDB4NzAwMywgMHgwMDAwLCAweDcwMGYsIDB4YjAwMywgMHg3MDEzLAorCTB4YjAwMywgMHg3ODBmLCAweDAwZjYsIDB4NzgwMywgMHgwMDA0LCAweDAxMmUsIDB4MDAwNSwgMHg2OTM0LAorCTB4YTE4NCwgMHgwMDA3LCAweDAwMDIsIDB4MTdjYiwgMHgxODA5LCAweDE3Y2IsIDB4MTdjYiwgMHgxN2NiLAorCTB4MTdmMSwgMHgxN2Q4LCAweDE3Y2YsIDB4YTA4NSwgMHgwMDAxLCAweDA4MDQsIDB4MTgyMywgMHg2ODRjLAorCTB4ZDBiYywgMHgwZGM4LCAweDY4NjAsIDB4NjgyZSwgMHg2ODVjLCAweDY4MmEsIDB4Njg1OCwgMHgwNGM4LAorCTB4YTE4YywgMHgwMGZmLCAweGExODYsIDB4MDAxZSwgMHgxZDcwLCAweDY4NGMsIDB4ZDBiYywgMHgwZDU4LAorCTB4Njg2MCwgMHg2ODJlLCAweDY4NWMsIDB4NjgyYSwgMHg2ODA0LCAweDY4MWEsIDB4YTA4MCwgMHgwMDBkLAorCTB4MjAwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHgyMTg2LCAweDIwMDUsIDB4NjgzMiwgMHg2ODU4LAorCTB4MDQ0MCwgMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDE1LCAweDE5YTgsIDB4Njg0YywgMHhkMGFjLAorCTB4MDk5MCwgMHg2ODA0LCAweDY4MWEsIDB4YTA4MCwgMHgwMDBkLCAweDIwMDQsIDB4YTA4NCwgMHgwMDBmLAorCTB4YTA4MCwgMHgyMTg2LCAweDIwMDUsIDB4NjgzMiwgMHhhMDA2LCAweDY4MmUsIDB4NjgyYSwgMHg2ODU4LAorCTB4MDA4MCwgMHg2ODRjLCAweGQwYWMsIDB4MDkwNCwgMHgxN2NiLCAweGEwMDYsIDB4NjgyZSwgMHg2ODJhLAorCTB4Njg1OCwgMHhhMThjLCAweDAwMGYsIDB4YTE4OCwgMHgyMTg2LCAweDIxMGQsIDB4NjkzMiwgMHgyZDA4LAorCTB4NjkxYSwgMHg2ODI2LCAweDY4NGMsIDB4YzBkZCwgMHg2ODRlLCAweGEwMDYsIDB4NjgwYSwgMHg2OTdjLAorCTB4NjkxMiwgMHg2OTgwLCAweDY5MTYsIDB4MDAwNSwgMHgyMGUxLCAweDAwMDcsIDB4MjBlMSwgMHgyMDAwLAorCTB4MjAwMSwgMHgwMjBhLCAweDIwMDQsIDB4ODJmZiwgMHgwMWE4LCAweGEyODAsIDB4MDAwNCwgMHgwMGQ2LAorCTB4MjA2YywgMHg2ODRjLCAweGQwZGMsIDB4MTE1MCwgMHgwODBjLCAweDE3YmYsIDB4MDEzOCwgMHgwMGRlLAorCTB4YTI4MCwgMHgwMDAwLCAweDIwMDMsIDB4MDAwMiwgMHhhMDE2LCAweDAwMjAsIDB4NjgwOCwgMHg4MDAwLAorCTB4NjgwYSwgMHgwMGRlLCAweDAxMjYsIDB4MDA0NiwgMHgwMDM2LCAweDAwMjYsIDB4MjA5MSwgMHgyMjAwLAorCTB4MDAyZSwgMHgwMDNlLCAweDAwNGUsIDB4NzAwMCwgMHhhMDA1LCAweDAxZDAsIDB4NzEwYywgMHgyMjBhLAorCTB4ODEwOCwgMHgyMzBhLCAweDgxMDgsIDB4MjQwYSwgMHg4MTA4LCAweGExODIsIDB4YjAxZSwgMHgwMjEwLAorCTB4MjAwOSwgMHhiMDAzLCAweDcxMGUsIDB4NzAxMCwgMHhhMTAyLCAweGEwODIsIDB4MDAwOSwgMHgwMTE4LAorCTB4YTA4MCwgMHgwMDFiLCAweDExMTgsIDB4MjAwOSwgMHgwMTM4LCAweDIwMGEsIDB4MDEyZSwgMHgwMDA1LAorCTB4NzIwNiwgMHgyMDAxLCAweDE4NjYsIDB4MDAwNiwgMHgyMjYwLCAweDA4MDQsIDB4MTk3YSwgMHgwMTI2LAorCTB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4MDAwNiwgMHgyMDkxLCAweDIyMDAsIDB4MDAwZSwgMHgwMDRlLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwZDYsIDB4MDBjNiwgMHgyNDYwLCAweDYxMTAsIDB4MjE2OCwgMHg2YTYyLAorCTB4NmI1ZSwgMHhhMDA1LCAweDA5MDQsIDB4MThjOCwgMHg2ODA4LCAweGEwMDUsIDB4MDkwNCwgMHgxOGZmLAorCTB4NzAwMCwgMHhhMDA1LCAweDExMDgsIDB4MDQ4OCwgMHg3MDBjLCAweDcxMTAsIDB4YTEwNiwgMHgxOTA0LAorCTB4MTkwNywgMHg3MDA0LCAweGE0MDYsIDB4MTU0OCwgMHgyMDAxLCAweDAwMDUsIDB4MjAwNCwgMHhkMDhjLAorCTB4MDE2OCwgMHgwMDQ2LCAweDA4MGMsIDB4MWE2YywgMHgwMDRlLCAweDI0NjAsIDB4NjAxMCwgMHhhMDgwLAorCTB4MDAwMiwgMHgyMDA0LCAweGEwMDUsIDB4MDkwNCwgMHgxOGZmLCAweDBjMTAsIDB4MjAwMSwgMHgwMjA3LAorCTB4MjAwNCwgMHhkMDljLCAweDFkNDgsIDB4NzgwNCwgMHhhMDg0LCAweDYwMDAsIDB4MDEyMCwgMHhhMDg2LAorCTB4NjAwMCwgMHgwMTA4LCAweDBjMDgsIDB4NzgxOCwgMHg2ODEyLCAweDc4MWMsIDB4NjgxNiwgMHg3ODAzLAorCTB4MDAwNCwgMHg3MDAzLCAweDAwMDAsIDB4NzAwNCwgMHgyMDYwLCAweDYxMDAsIDB4YTE4ZSwgMHgwMDA0LAorCTB4MTkwNCwgMHgxOTA3LCAweDIwMDksIDB4MDA0OCwgMHgwODBjLCAweDgwYTcsIDB4MDgwNCwgMHgxOTA3LAorCTB4NjgwOCwgMHhhMDA1LCAweDA1YTAsIDB4NzAwMCwgMHhhMDA1LCAweDA1ODgsIDB4NzAwYywgMHg3MTEwLAorCTB4YTEwNiwgMHgxMTE4LCAweDcwMDQsIDB4YTQwNiwgMHgxNTUwLCAweDIwMDEsIDB4MDAwNSwgMHgyMDA0LAorCTB4ZDA4YywgMHgwMTYwLCAweDAwNDYsIDB4MDgwYywgMHgxYTZjLCAweDAwNGUsIDB4MjQ2MCwgMHg2MDEwLAorCTB4YTA4MCwgMHgwMDAyLCAweDIwMDQsIDB4YTAwNSwgMHgwMWQwLCAweDBjMjgsIDB4MjAwMSwgMHgwMjA3LAorCTB4MjAwNCwgMHhkMDljLCAweDFkNTAsIDB4MjAwMSwgMHgwMDA1LCAweDIwMDQsIDB4ZDA4YywgMHgxZDUwLAorCTB4NzgwNCwgMHhhMDg0LCAweDYwMDAsIDB4MDExOCwgMHhhMDg2LCAweDYwMDAsIDB4MTlmMCwgMHg3ODE4LAorCTB4NjgxMiwgMHg3ODFjLCAweDY4MTYsIDB4NzgwMywgMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwgMHg2MTAwLAorCTB4YTE4ZSwgMHgwMDA0LCAweDExMjAsIDB4MjAwOSwgMHgwMDQ4LCAweDA4MGMsIDB4ODBhNywgMHgwMGNlLAorCTB4MDBkZSwgMHgwMTJlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LAorCTB4MDA1NiwgMHgwODBjLCAweDFkODYsIDB4MDAyNiwgMHgwMDU2LCAweDIwNzEsIDB4YWZmZCwgMHg3MDAwLAorCTB4YTA4NiwgMHgwMDAwLCAweDA1ODAsIDB4NzAwNCwgMHhhYzA2LCAweDExZjgsIDB4MjA3OSwgMHgwMDMwLAorCTB4NzAwMCwgMHhhMDg2LCAweDAwMDMsIDB4MDFjOCwgMHg3ODA0LCAweGQwZmMsIDB4MTE5OCwgMHgyMDAxLAorCTB4MDIwNywgMHgyMDA0LCAweGQwOWMsIDB4MWRjMCwgMHg3ODAzLCAweDAwMDQsIDB4NzgwNCwgMHhkMGFjLAorCTB4MWRlOCwgMHg3ODAzLCAweDAwMDIsIDB4NzgwMywgMHgwMDA5LCAweDcwMDMsIDB4MDAwMywgMHg3MDA3LAorCTB4MDAwMCwgMHgwMDE4LCAweDA4MGMsIDB4MWE2YywgMHgwOGQwLCAweDAxNTYsIDB4MjBhOSwgMHgwMDA5LAorCTB4MjAwOSwgMHhiMDAzLCAweDIxMDQsIDB4YWMwNiwgMHgxMTA4LCAweDIwMGEsIDB4YTE4OCwgMHgwMDAzLAorCTB4MWYwNCwgMHgxOTQyLCAweDAxNWUsIDB4MDA1ZSwgMHgwMDJlLCAweDIwMDEsIDB4MDE1ZCwgMHgyMDFjLAorCTB4ODMxYSwgMHgyMzAyLCAweDIwMDEsIDB4MDE2MCwgMHgyNTAyLCAweDIwMDEsIDB4MDEzOCwgMHgyMjAyLAorCTB4MDA1ZSwgMHgwMDRlLCAweDAwM2UsIDB4MDAyZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHg3MDBjLAorCTB4NzExMCwgMHhhMTA2LCAweDA5MDQsIDB4MTlkZCwgMHgyMTA0LCAweDcwMDYsIDB4MjA2MCwgMHg4MTA4LAorCTB4MjExYywgMHg4MTA4LCAweDIxMjQsIDB4ODEwOCwgMHhhMTgyLCAweGIwMWUsIDB4MDIxMCwgMHgyMDA5LAorCTB4YjAwMywgMHg3MTEyLCAweDcwMGMsIDB4YTEwNiwgMHgxMTI4LCAweDA4MGMsIDB4Mjc0NCwgMHgyMDAxLAorCTB4MDEzOCwgMHgyMTAyLCAweDhjZmYsIDB4MDU4OCwgMHg2MDEwLCAweDIwNjgsIDB4MmQ1OCwgMHg2ODI4LAorCTB4YTQwNiwgMHgxNTgwLCAweDY4MmMsIDB4YTMwNiwgMHgxNTY4LCAweDcwMDQsIDB4MjA2MCwgMHg2MDIwLAorCTB4YzBkNCwgMHg2MDIyLCAweDY4NGMsIDB4ZDBmNCwgMHgwMTI4LCAweDY4MTcsIDB4ZmZmZiwgMHg2ODEzLAorCTB4ZmZmZiwgMHgwMGQ4LCAweDY4NTAsIDB4ZDBmNCwgMHgxMTMwLCAweDc4MDMsIDB4MDAwNCwgMHg2ODEwLAorCTB4NzgxYSwgMHg2ODE0LCAweDc4MWUsIDB4NjgyNCwgMHgyMDUwLCAweDY4MTgsIDB4MjA2MCwgMHg2ODMwLAorCTB4MjA0MCwgMHg2MDM0LCAweGEwY2MsIDB4MDAwZiwgMHgyMDA5LCAweDAwMTEsIDB4MDRjOSwgMHgwMTE4LAorCTB4MjAwOSwgMHgwMDAxLCAweDA0YTksIDB4MmQ1OCwgMHgwMDA1LCAweDA4MGMsIDB4MWNlZCwgMHgwOTA0LAorCTB4MTk1ZiwgMHgwY2QwLCAweDYwMjAsIDB4ZDBkNCwgMHgwMWI4LCAweDYwMzgsIDB4YTQwMiwgMHg2MDM0LAorCTB4YTMwMywgMHgwMTA4LCAweDEyODgsIDB4NjQzYSwgMHg2MzM2LCAweDZjMmEsIDB4NmIyZSwgMHgwMDQ2LAorCTB4MDAzNiwgMHgyNDAwLCAweDZjN2MsIDB4YTQwMiwgMHg2ODEyLCAweDIzMDAsIDB4NmI4MCwgMHhhMzAzLAorCTB4NjgxNiwgMHgwMDNlLCAweDAwNGUsIDB4MDAxOCwgMHgwODBjLCAweDk4Y2IsIDB4MDlmMCwgMHg2MDFjLAorCTB4YTA4ZSwgMHgwMDA4LCAweDA5MDQsIDB4MTk4NSwgMHhhMDhlLCAweDAwMGEsIDB4MDkwNCwgMHgxOTg1LAorCTB4MDgwYywgMHgyMWE2LCAweDE5OTAsIDB4MDgwNCwgMHgxOTg1LCAweDcwMDMsIDB4MDAwMCwgMHgwMDA1LAorCTB4OGFmZiwgMHgwOTA0LCAweDFhNDYsIDB4YTAzZSwgMHgyNzMwLCAweDY4NTAsIDB4ZDBmYywgMHgxMWI4LAorCTB4ZDBmNCwgMHgxNTI4LCAweDAwZDYsIDB4MjgwNSwgMHhhYzY4LCAweDI5MDAsIDB4MDAwMiwgMHgxYTMwLAorCTB4MWExNSwgMHgxYTE1LCAweDFhMzAsIDB4MWEzMCwgMHgxYTI5LCAweDFhMzAsIDB4MWExNSwgMHgxYTMwLAorCTB4MWExYSwgMHgxYTFhLCAweDFhMzAsIDB4MWEzMCwgMHgxYTMwLCAweDFhMjEsIDB4MWExYSwgMHg3ODAzLAorCTB4MDAwNCwgMHhjMGZjLCAweDY4NTIsIDB4NmI2YywgMHg2YTcwLCAweDZkMWMsIDB4NmMyMCwgMHgwMGQ2LAorCTB4ZDk5YywgMHgwNTQ4LCAweDI4MDUsIDB4YWM2OCwgMHg2ZjA4LCAweDZlMGMsIDB4MDQyMCwgMHhjMGY0LAorCTB4Njg1MiwgMHg2YjZjLCAweDZhNzAsIDB4MDBkNiwgMHgwNDI4LCAweDZiMDgsIDB4NmEwYywgMHg2ZDAwLAorCTB4NmMwNCwgMHgwMGM4LCAweDZiMTAsIDB4NmExNCwgMHg2ZDAwLCAweDZjMDQsIDB4NmYwOCwgMHg2ZTBjLAorCTB4MDA5MCwgMHgwMGRlLCAweDAwZDYsIDB4NjgzNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDFlLAorCTB4MTEzOCwgMHgwMGRlLCAweDA4MGMsIDB4MjE0OCwgMHgxOTA0LCAweDE5ZTAsIDB4YTAwZSwgMHgwMGIwLAorCTB4MDBkZSwgMHgwODBjLCAweDE0ZjYsIDB4N2IyMiwgMHg3YTI2LCAweDdkMzIsIDB4N2MzNiwgMHg3ZjNhLAorCTB4N2UzZSwgMHg3OTAyLCAweDcwMDAsIDB4ODAwMCwgMHg3MDAyLCAweDAwZGUsIDB4NjgyOCwgMHhhMzAwLAorCTB4NjgyYSwgMHg2ODJjLCAweGEyMDEsIDB4NjgyZSwgMHgwODBjLCAweDIxNDgsIDB4MDAwNSwgMHgwODBjLAorCTB4MTRmNiwgMHgwODBjLCAweDFlMWEsIDB4NzAwNCwgMHgyMDYwLCAweDAwZDYsIDB4NjAxMCwgMHgyMDY4LAorCTB4NzAwMywgMHgwMDAwLCAweDA4MGMsIDB4MWQyMiwgMHgwODBjLCAweDk1OTYsIDB4MDE3MCwgMHg2ODA4LAorCTB4ODAwMSwgMHg2ODBhLCAweDY5N2MsIDB4NjkxMiwgMHg2OTgwLCAweDY5MTYsIDB4NjgyYiwgMHhmZmZmLAorCTB4NjgyZiwgMHhmZmZmLCAweDY4NTAsIDB4YzBiZCwgMHg2ODUyLCAweDAwZGUsIDB4MDgwYywgMHg5MjljLAorCTB4MDgwNCwgMHgxYzVlLCAweDA4MGMsIDB4MTRmNiwgMHgwMTI2LCAweDIwOTEsIDB4MjIwMCwgMHgwMDA2LAorCTB4MDAxNiwgMHgyYjY4LCAweDY4MTgsIDB4MjA2MCwgMHg3OTA0LCAweDc4MDMsIDB4MDAwMiwgMHhhMTg0LAorCTB4MDcwMCwgMHgxOTc4LCAweGExODQsIDB4MDAwMywgMHhhMDg2LCAweDAwMDMsIDB4MGQ1OCwgMHg3MDAwLAorCTB4MDAwMiwgMHgxYTg5LCAweDFhOGYsIDB4MWI5MiwgMHgxYzM5LCAweDFjNGQsIDB4MWE4OSwgMHgxYTg5LAorCTB4MWE4OSwgMHg3ODA0LCAweGQwOWMsIDB4MTkwNCwgMHgxYzVlLCAweDA4MGMsIDB4MTRmNiwgMHg4MDAxLAorCTB4NzAwMiwgMHhhMTg0LCAweDA4ODAsIDB4MTE5MCwgMHhkMTljLCAweDE5MDQsIDB4MWIyMCwgMHg4YWZmLAorCTB4MDkwNCwgMHgxYjIwLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLCAweDE5ZTAsIDB4MDkwNCwgMHgxYzVlLAorCTB4MjAwOSwgMHgwMDAxLCAweDA4MGMsIDB4MTllMCwgMHgwODA0LCAweDFjNWUsIDB4NzgwMywgMHgwMDA0LAorCTB4NzAwMywgMHgwMDAwLCAweGQxYmMsIDB4MTkwNCwgMHgxYjAwLCAweDAwMjYsIDB4MDAzNiwgMHg3YzIwLAorCTB4N2QyNCwgMHg3ZTMwLCAweDdmMzQsIDB4NzgxOCwgMHg2ODEyLCAweDc4MWMsIDB4NjgxNiwgMHgyMDAxLAorCTB4MDIwMSwgMHgyMDA0LCAweGEwMDUsIDB4MDE0MCwgMHg3ODA4LCAweGQwZWMsIDB4MTEyOCwgMHg3ODAzLAorCTB4MDAwOSwgMHg3MDAzLCAweDAwMDQsIDB4MDAxMCwgMHgwODBjLCAweDFjNjIsIDB4NmIyOCwgMHg2YTJjLAorCTB4MjQwMCwgMHg2ODZlLCAweGEzMWEsIDB4MjUwMCwgMHg2ODcyLCAweGEyMTMsIDB4NmIyYSwgMHg2YTJlLAorCTB4MDBjNiwgMHg3MDA0LCAweDIwNjAsIDB4NjAyMCwgMHhkMGY0LCAweDExMTAsIDB4NjMzYSwgMHg2MjM2LAorCTB4MDBjZSwgMHgwMDNlLCAweDAwMmUsIDB4NmUxZSwgMHg2ZjIyLCAweDA4MGMsIDB4MjE1ZSwgMHgyYTAwLAorCTB4NjgyNiwgMHgyYzAwLCAweDY4MWEsIDB4MjgwMCwgMHg2ODMyLCAweDY4NTAsIDB4YzBmZCwgMHg2ODUyLAorCTB4NjgwOCwgMHg4MDAxLCAweDY4MGEsIDB4MTE0OCwgMHg2ODRjLCAweGQwZTQsIDB4MDEzMCwgMHg3MDA0LAorCTB4MjA2MCwgMHgyMDA5LCAweDAwNDgsIDB4MDgwYywgMHg4MGE3LCAweDcwMDAsIDB4YTA4NiwgMHgwMDA0LAorCTB4MDkwNCwgMHgxYzVlLCAweDcwMDMsIDB4MDAwMCwgMHgwODBjLCAweDE5NWYsIDB4MDgwNCwgMHgxYzVlLAorCTB4MDA1NiwgMHg3ZDBjLCAweGQ1YmMsIDB4MTExMCwgMHgwODBjLCAweGFjNzMsIDB4MDA1ZSwgMHgwODBjLAorCTB4MWQyMiwgMHgwMGY2LCAweDcwMDQsIDB4MjA3OCwgMHgwODBjLCAweDUwMjksIDB4MDExOCwgMHg3ODIwLAorCTB4YzBmNSwgMHg3ODIyLCAweDAwZmUsIDB4NjgyYiwgMHhmZmZmLCAweDY4MmYsIDB4ZmZmZiwgMHg2ODA4LAorCTB4ODAwMSwgMHg2ODBhLCAweDY5N2MsIDB4NzkxYSwgMHg2OTgwLCAweDc5MWUsIDB4MDgwNCwgMHgxYzVlLAorCTB4NzAwNCwgMHgwMGM2LCAweDIwNjAsIDB4NjAyMCwgMHgwMGNlLCAweGQwZjQsIDB4MDEyOCwgMHg2ODA4LAorCTB4ODAwMSwgMHg2ODBhLCAweDA4MDQsIDB4MWM1ZSwgMHg3ODE4LCAweDY4MTIsIDB4N2ExYywgMHg2YTE2LAorCTB4ZDE5YywgMHgwMTYwLCAweGEyMDUsIDB4MDE1MCwgMHg3MDA0LCAweGEwODAsIDB4MDAwNywgMHgyMDA0LAorCTB4YTA4NCwgMHhmZmZkLCAweGEwODYsIDB4MDAwOCwgMHgxOTA0LCAweDFhYTYsIDB4Njg0YywgMHhjMGY1LAorCTB4Njg0ZSwgMHg3ODE0LCAweGEwMDUsIDB4MTE4MCwgMHg3MDAzLCAweDAwMDAsIDB4NjgwOCwgMHg4MDAxLAorCTB4NjgwYSwgMHgxMTMwLCAweDcwMDQsIDB4MjA2MCwgMHgyMDA5LCAweDAwNDgsIDB4MDgwYywgMHg4MGE3LAorCTB4MDgwYywgMHgxOTVmLCAweDA4MDQsIDB4MWM1ZSwgMHg3ODE4LCAweDY4MTIsIDB4NzgxYywgMHg2ODE2LAorCTB4NzgxNCwgMHg3OTA4LCAweGExOGMsIDB4MGZmZiwgMHhhMTg4LCAweDAwMDcsIDB4ODExNCwgMHg4MjE0LAorCTB4ODIxNCwgMHhhMTBhLCAweDgxMDQsIDB4ODAwNCwgMHg4MDA0LCAweGEyMGEsIDB4ODEwYiwgMHg4MTBiLAorCTB4ODEwYiwgMHgwODBjLCAweDFkYTUsIDB4NzgwMywgMHgwMDA0LCAweDc4MGYsIDB4ZmZmZiwgMHg3ODAzLAorCTB4MDAwMSwgMHg3ODA0LCAweGQwZmMsIDB4MGRlOCwgMHg3ODAzLCAweDAwMDIsIDB4NzgwMywgMHgwMDA0LAorCTB4NzgwZiwgMHgwMGY2LCAweDcwMDQsIDB4NzAwNywgMHgwMDAwLCAweDIwNjAsIDB4MjAwOSwgMHgwMDQ4LAorCTB4MDgwYywgMHg4MGE3LCAweDA4MGMsIDB4MWRkNywgMHgwOTU4LCAweDc5MDgsIDB4ZDFlYywgMHgxMTE4LAorCTB4MjAwOSwgMHgwMDA5LCAweDAwMTAsIDB4MjAwOSwgMHgwMDE5LCAweDc5MDIsIDB4NzAwMywgMHgwMDAzLAorCTB4MDgwNCwgMHgxYzVlLCAweDgwMDEsIDB4NzAwMiwgMHhkMTk0LCAweDAxYTgsIDB4NzgwNCwgMHhkMGZjLAorCTB4MTkwNCwgMHgxYzJjLCAweGQwOWMsIDB4MDEzMCwgMHg3ODA0LCAweGQwZmMsIDB4MTkwNCwgMHgxYTc0LAorCTB4ZDA5YywgMHgxMWE4LCAweDhhZmYsIDB4MDkwNCwgMHgxYzVlLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLAorCTB4MTllMCwgMHgwODA0LCAweDFjNWUsIDB4YTE4NCwgMHgwODg4LCAweDExNDgsIDB4OGFmZiwgMHgwOTA0LAorCTB4MWM1ZSwgMHgyMDA5LCAweDAwMDEsIDB4MDgwYywgMHgxOWUwLCAweDA4MDQsIDB4MWM1ZSwgMHg3ODE4LAorCTB4NjgxMiwgMHg3YTFjLCAweDZhMTYsIDB4YTIwNSwgMHgwOTA0LCAweDFiM2UsIDB4NzgwMywgMHgwMDA0LAorCTB4NzAwMywgMHgwMDAwLCAweGQxYmMsIDB4MTkwNCwgMHgxYzBmLCAweDY4MzQsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4NiwgMHgwMDI5LCAweDExMTgsIDB4ZDE5YywgMHgxOTA0LCAweDFiM2UsIDB4MDAyNiwgMHgwMDM2LAorCTB4N2MyMCwgMHg3ZDI0LCAweDdlMzAsIDB4N2YzNCwgMHg3ODE4LCAweDY4MTIsIDB4NzgxYywgMHg2ODE2LAorCTB4MjAwMSwgMHgwMjAxLCAweDIwMDQsIDB4YTAwNSwgMHgwMTQwLCAweDc4MDgsIDB4ZDBlYywgMHgxMTI4LAorCTB4NzgwMywgMHgwMDA5LCAweDcwMDMsIDB4MDAwNCwgMHgwMDIwLCAweDAwMTYsIDB4MDgwYywgMHgxYzYyLAorCTB4MDAxZSwgMHg2YjI4LCAweDZhMmMsIDB4MDgwYywgMHgyMTVlLCAweDAwZDYsIDB4MjgwNSwgMHhhYzY4LAorCTB4NjAzNCwgMHhkMDljLCAweDExMjgsIDB4NjgwOCwgMHhhMzFhLCAweDY4MGMsIDB4YTIxMywgMHgwMDIwLAorCTB4NjgxMCwgMHhhMzFhLCAweDY4MTQsIDB4YTIxMywgMHgwMGRlLCAweGQxOTQsIDB4MDkwNCwgMHgxYWM4LAorCTB4MmEwMCwgMHg2ODI2LCAweDJjMDAsIDB4NjgxYSwgMHgyODAwLCAweDY4MzIsIDB4NjgwOCwgMHg4MDAxLAorCTB4NjgwYSwgMHg2YjJhLCAweDZhMmUsIDB4MDAzZSwgMHgwMDJlLCAweDA4MDQsIDB4MWI1MCwgMHgwMDU2LAorCTB4N2QwYywgMHgwODBjLCAweGFjNzMsIDB4MDA1ZSwgMHgwODBjLCAweDFkMjIsIDB4MDBmNiwgMHg3MDA0LAorCTB4MjA3OCwgMHgwODBjLCAweDUwMjksIDB4MDExOCwgMHg3ODIwLCAweGMwZjUsIDB4NzgyMiwgMHgwMGZlLAorCTB4NjgyYiwgMHhmZmZmLCAweDY4MmYsIDB4ZmZmZiwgMHg2ODA4LCAweDgwMDEsIDB4NjgwYSwgMHg2OTdjLAorCTB4NzkxYSwgMHg2OTgwLCAweDc5MWUsIDB4MDQ5MCwgMHg3ODA0LCAweGQwOWMsIDB4MDkwNCwgMHgxYTc0LAorCTB4N2MyMCwgMHg3ODI0LCAweGE0MDUsIDB4MTkwNCwgMHgxYTc0LCAweDc4MDMsIDB4MDAwMiwgMHgwODA0LAorCTB4MWJiNywgMHg3ODAzLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLCAweDcwMDQsIDB4YTAwZCwgMHgwMTUwLAorCTB4NjgwOCwgMHg4MDAxLCAweDY4MGEsIDB4MTEzMCwgMHg3MDA0LCAweDIwNjAsIDB4MjAwOSwgMHgwMDQ4LAorCTB4MDgwYywgMHg4MGE3LCAweDA4MGMsIDB4MTk1ZiwgMHgwMDg4LCAweDc4MDMsIDB4MDAwNCwgMHg3MDAzLAorCTB4MDAwMCwgMHg3MDA0LCAweDIwNjAsIDB4NjAxMCwgMHhhMDA1LCAweDBkYTAsIDB4MjA2OCwgMHg2ODA4LAorCTB4ODAwMCwgMHg2ODBhLCAweDZjMjgsIDB4NmIyYywgMHgwODBjLCAweDE5N2EsIDB4MDAxZSwgMHgwMDBlLAorCTB4MDEyZSwgMHgwMDA1LCAweDcwMGMsIDB4NzExMCwgMHhhMTA2LCAweDA5MDQsIDB4MWNlMSwgMHg3MDA0LAorCTB4MDAxNiwgMHgyMTBjLCAweGExMDYsIDB4MDAxZSwgMHgwOTA0LCAweDFjZTEsIDB4MDBkNiwgMHgwMGM2LAorCTB4MjE2YywgMHgyZDAwLCAweGEwMDUsIDB4MDkwNCwgMHgxY2RmLCAweDY4MjAsIDB4ZDBkNCwgMHgxOTA0LAorCTB4MWNkZiwgMHg2ODEwLCAweDIwNjgsIDB4Njg1MCwgMHhkMGZjLCAweDA1NTgsIDB4ODEwOCwgMHgyMTA0LAorCTB4NmIyYywgMHhhMzA2LCAweDE5MDQsIDB4MWNkZiwgMHg4MTA4LCAweDIxMDQsIDB4NmEyOCwgMHhhMjA2LAorCTB4MTkwNCwgMHgxY2RmLCAweDY4NTAsIDB4YzBmYywgMHhjMGY1LCAweDY4NTIsIDB4Njg2YywgMHg3ODIyLAorCTB4Njg3MCwgMHg3ODI2LCAweDY4MWMsIDB4NzgzMiwgMHg2ODIwLCAweDc4MzYsIDB4NjgxOCwgMHgyMDYwLAorCTB4NjAzNCwgMHhkMDljLCAweDAxNTAsIDB4NjgzMCwgMHgyMDA1LCAweDAwZDYsIDB4YWM2OCwgMHg2ODA4LAorCTB4NzgzYSwgMHg2ODBjLCAweDc4M2UsIDB4MDBkZSwgMHgwNGEwLCAweGEwMDYsIDB4NzgzYSwgMHg3ODNlLAorCTB4MDQ4MCwgMHg4MTA4LCAweDIxMDQsIDB4YTAwNSwgMHgxNTkwLCAweDgxMDgsIDB4MjEwNCwgMHhhMDA1LAorCTB4MTU3MCwgMHg2ODUwLCAweGMwZjUsIDB4Njg1MiwgMHg2ODMwLCAweDIwMDUsIDB4NjkxOCwgMHhhMTYwLAorCTB4YTE4MCwgMHgwMDBkLCAweDIwMDQsIDB4ZDA5YywgMHgxMTcwLCAweDYwMDgsIDB4NzgyMiwgMHg2ODZlLAorCTB4NjAwYywgMHg3ODI2LCAweDY4NzIsIDB4NjAwMCwgMHg3ODMyLCAweDYwMDQsIDB4NzgzNiwgMHhhMDA2LAorCTB4NzgzYSwgMHg3ODNlLCAweDAwNzAsIDB4NjAxMCwgMHg3ODIyLCAweDY4NmUsIDB4NjAxNCwgMHg3ODI2LAorCTB4Njg3MiwgMHg2MDAwLCAweDc4MzIsIDB4NjAwNCwgMHg3ODM2LCAweDYwMDgsIDB4NzgzYSwgMHg2MDBjLAorCTB4NzgzZSwgMHg2ODEwLCAweDc4MWEsIDB4NjgxNCwgMHg3ODFlLCAweDc4MDMsIDB4MDAxMSwgMHgwMGNlLAorCTB4MDBkZSwgMHgwMDA1LCAweDIwMTEsIDB4MDIwMSwgMHgyMDA5LCAweDAwM2MsIDB4MjIwNCwgMHhhMDA1LAorCTB4MTExOCwgMHg4MTA5LCAweDFkZDgsIDB4MDAwNSwgMHgwMDA1LCAweDBjYTEsIDB4MDFlMCwgMHg3OTA4LAorCTB4ZDFlYywgMHgxMTYwLCAweDA4MGMsIDB4MWRkNywgMHgwMTQ4LCAweDc4MDMsIDB4MDAwOSwgMHg3OTA0LAorCTB4ZDFmYywgMHgwZGU4LCAweDc4MDMsIDB4MDAwNiwgMHgwYzI5LCAweDAxNjgsIDB4NzgwYywgMHhkMGE0LAorCTB4MTE1MCwgMHg3MDA3LCAweDAwMDAsIDB4MDgwYywgMHgxZGQ3LCAweDAxNDAsIDB4NzgwMywgMHgwMDE5LAorCTB4NzAwMywgMHgwMDAzLCAweDAwMTgsIDB4MDBiMSwgMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMTI2LAorCTB4MjA5MSwgMHgyMjAwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDExNTAsIDB4NzAwYywgMHg3MTEwLAorCTB4YTEwNiwgMHgwMTMwLCAweDIwZTEsIDB4OTAyOCwgMHg3MDBmLCAweGIwMDMsIDB4NzAxMywgMHhiMDAzLAorCTB4MDEyZSwgMHgwMDA1LCAweDAwYzYsIDB4MDgwYywgMHg1NzRmLCAweDE1NTAsIDB4MjAwMSwgMHgwMTYwLAorCTB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MDEzOCwgMHgyMDAzLCAweDAwMDAsIDB4MjAxMSwgMHgwMGM4LAorCTB4ZTAwMCwgMHhlMDAwLCAweDgyMTEsIDB4MWRlMCwgMHgwODBjLCAweDFkN2UsIDB4NzAwYywgMHg3MTEwLAorCTB4YTEwNiwgMHgwMTkwLCAweDIxMDQsIDB4YTAwNSwgMHgwMTMwLCAweDIwNjAsIDB4NjAxMCwgMHgyMDYwLAorCTB4NjAwOCwgMHg4MDAxLCAweDYwMGEsIDB4YTE4OCwgMHgwMDAzLCAweGExODIsIDB4YjAxZSwgMHgwMjEwLAorCTB4MjAwOSwgMHhiMDAzLCAweDcxMTIsIDB4MGM1MCwgMHgwODBjLCAweDU3ZDEsIDB4MDBjZSwgMHgwMDA1LAorCTB4MDRhOSwgMHgyMGUxLCAweDkwMjgsIDB4NzAwYywgMHg3MTEwLCAweGExMDYsIDB4MDFkMCwgMHgyMTA0LAorCTB4YTAwNSwgMHgwMTMwLCAweDIwNjAsIDB4NjAxMCwgMHgyMDYwLCAweDYwMDgsIDB4ODAwMSwgMHg2MDBhLAorCTB4YTE4OCwgMHgwMDAzLCAweGExODIsIDB4YjAxZSwgMHgwMjEwLCAweDIwMDksIDB4YjAwMywgMHg3MTEyLAorCTB4NzAwYywgMHhhMTA2LCAweDFkNDAsIDB4MDgwYywgMHgyNzQ0LCAweDIwMDEsIDB4MDEzOCwgMHgyMTAyLAorCTB4MGMxMCwgMHgyMDAxLCAweDAxNWQsIDB4MjAwYywgMHg4MTBhLCAweDIxMDIsIDB4MjAwMSwgMHgwMTYwLAorCTB4MjUwMiwgMHgyMDAxLCAweDAxMzgsIDB4MjIwMiwgMHgwMGNlLCAweDAwMDUsIDB4MjBlMSwgMHg5MDI4LAorCTB4MjAwMSwgMHgwMTVkLCAweDIwMGMsIDB4ODEwYSwgMHgyMTAyLCAweDAwMDUsIDB4MjAwMSwgMHgwMTM4LAorCTB4MjAxNCwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgwMTYwLCAweDIwMmMsIDB4MjAwMywgMHgwMDAwLAorCTB4MjAyMSwgMHhiMDE1LCAweDIwMDEsIDB4MDE0MSwgMHgyMDFjLCAweGQzZGMsIDB4MTE2OCwgMHgyMDAxLAorCTB4MDEwOSwgMHgyMDFjLCAweGEzOWMsIDB4MDA0OCwgMHgxMTM4LCAweDIwMDEsIDB4MDExMSwgMHgyMDFjLAorCTB4ODNmZiwgMHgxMTEwLCAweDg0MjEsIDB4MWQ3MCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgwMjAwLAorCTB4NzgwOCwgMHhhMDg0LCAweGYwMDAsIDB4YTEwZCwgMHgwOGM5LCAweDIwMTksIDB4NTAwMCwgMHg4MzE5LAorCTB4MDE2OCwgMHgyMDAxLCAweGIwMWUsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDAsIDB4MDEzOCwgMHgyMDAxLAorCTB4MDAyMSwgMHhkMGZjLCAweDBkYTAsIDB4MDgwYywgMHgxZmY0LCAweDBjNzgsIDB4MjBlMSwgMHg3MDAwLAorCTB4NzMyNCwgMHg3NDIwLCAweDcwMjgsIDB4NzAyOCwgMHg3NDI2LCAweDcwMzcsIDB4MDAwMSwgMHg4MTBmLAorCTB4NzEyZSwgMHg3MDJmLCAweDAxMDAsIDB4NzAzNywgMHgwMDA4LCAweDczMjYsIDB4NzQyMiwgMHgyMDAxLAorCTB4MDE2MCwgMHgyNTAyLCAweDIwMDEsIDB4MDEzOCwgMHgyMjAyLCAweDAwZWUsIDB4MDAwNSwgMHg3OTA4LAorCTB4YTE4YywgMHgwZmZmLCAweGExODIsIDB4MDAwOSwgMHgwMjE4LCAweGEwODUsIDB4MDAwMSwgMHgwMDg4LAorCTB4MjAwMSwgMHgwMjBhLCAweDgxZmYsIDB4MDEzMCwgMHgyMGUxLCAweDYwMDAsIDB4MjAwYywgMHgyMDBjLAorCTB4MjAwYywgMHgyMDBjLCAweDIwZTEsIDB4NzAwMCwgMHgyMDBjLCAweDIwMGMsIDB4NzAwMywgMHgwMDAwLAorCTB4YTAwNiwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMDE2LCAweDAwMjYsIDB4MjA3MSwgMHhhZmZkLAorCTB4MjA3OSwgMHgwMDMwLCAweDIwMTEsIDB4MDA1MCwgMHg3MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwMWE4LAorCTB4ODIxMSwgMHgwMTg4LCAweDIwMDEsIDB4MDAwNSwgMHgyMDA0LCAweGQwOGMsIDB4MGRjOCwgMHg3OTA0LAorCTB4YTE4YywgMHgwNzgwLCAweDAwMTYsIDB4MDgwYywgMHgxYTZjLCAweDAwMWUsIDB4ODFmZiwgMHgxMTE4LAorCTB4MjAxMSwgMHgwMDUwLCAweDBjNDgsIDB4YTA4NSwgMHgwMDAxLCAweDAwMmUsIDB4MDAxZSwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMDA1LCAweDc4MDMsIDB4MDAwNCwgMHgyMDA5LCAweDAwNjQsIDB4NzgwNCwgMHhkMGFjLAorCTB4MDkwNCwgMHgxZTY2LCAweDgxMDksIDB4MWRkMCwgMHgyMDA5LCAweDAxMDAsIDB4MjEwYywgMHhhMThhLAorCTB4MDAwMywgMHgwYTBjLCAweDE0ZjYsIDB4MDgwYywgMHgyMGYyLCAweDAwZTYsIDB4MDBmNiwgMHgyMDcxLAorCTB4YWZlYywgMHgyMDc5LCAweDAwMTAsIDB4NzAwNCwgMHhhMDg2LCAweDAwMDAsIDB4MDUzOCwgMHg3ODAwLAorCTB4MDAwNiwgMHg3ODIwLCAweDAwMDYsIDB4NzgzMCwgMHgwMDA2LCAweDc4MzQsIDB4MDAwNiwgMHg3ODM4LAorCTB4MDAwNiwgMHg3ODNjLCAweDAwMDYsIDB4NzgwMywgMHgwMDA0LCAweGUwMDAsIDB4ZTAwMCwgMHgyMDc5LAorCTB4MDAzMCwgMHg3ODA0LCAweGQwYWMsIDB4MTkwYywgMHgxNGY2LCAweDIwNzksIDB4MDAxMCwgMHgwMDBlLAorCTB4NzgzZSwgMHgwMDBlLCAweDc4M2EsIDB4MDAwZSwgMHg3ODM2LCAweDAwMGUsIDB4NzgzMiwgMHgwMDBlLAorCTB4NzgyMiwgMHgwMDBlLCAweDc4MDIsIDB4MDBmZSwgMHgwMGVlLCAweDAwMzAsIDB4MDBmZSwgMHgwMGVlLAorCTB4NzgwNCwgMHhkMGFjLCAweDE5MGMsIDB4MTRmNiwgMHgwODBjLCAweDZkMGQsIDB4MDAwNSwgMHgwMGU2LAorCTB4MjA3MSwgMHhiMDFlLCAweDcwMDMsIDB4MDAwMCwgMHgwMGVlLCAweDAwMDUsIDB4MDBkNiwgMHhhMjgwLAorCTB4MDAwNCwgMHgyMDZjLCAweDY5NGMsIDB4ZDFkYywgMHgxOTA0LCAweDFlZTQsIDB4NjkzNCwgMHhhMTg0LAorCTB4MDAwNywgMHgwMDAyLCAweDFlODIsIDB4MWVjZiwgMHgxZTgyLCAweDFlODIsIDB4MWU4MiwgMHgxZWI2LAorCTB4MWU5NSwgMHgxZTg0LCAweDA4MGMsIDB4MTRmNiwgMHg2ODRjLCAweGQwYjQsIDB4MDkwNCwgMHgxZmNjLAorCTB4Njg2MCwgMHg2ODJlLCAweDY4MTYsIDB4Njg1YywgMHg2ODJhLCAweDY4MTIsIDB4Njg3YywgMHg2ODBhLAorCTB4Njg4MCwgMHg2ODBlLCAweDY5NTgsIDB4MDgwNCwgMHgxZWQ3LCAweDY4MzQsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4NiwgMHgwMDFlLCAweDFkMzgsIDB4Njg0YywgMHhkMGI0LCAweDA5MDQsIDB4MWZjYywgMHg2ODYwLAorCTB4NjgyZSwgMHg2ODE2LCAweDY4NWMsIDB4NjgyYSwgMHg2ODEyLCAweDY4N2MsIDB4NjgwYSwgMHg2ODgwLAorCTB4NjgwZSwgMHg2ODA0LCAweDY4MWEsIDB4YTA4MCwgMHgwMDBkLCAweDIwMDQsIDB4YTA4NCwgMHgwMDBmLAorCTB4YTA4MCwgMHgyMTg2LCAweDIwMDUsIDB4NjgzMiwgMHg2OTU4LCAweDA0NTAsIDB4YTE4YywgMHgwMGZmLAorCTB4YTE4NiwgMHgwMDE1LCAweDE1NDgsIDB4Njg0YywgMHhkMGI0LCAweDA5MDQsIDB4MWZjYywgMHg2ODA0LAorCTB4NjgxYSwgMHhhMDgwLCAweDAwMGQsIDB4MjAwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHgyMTg2LAorCTB4MjAwNSwgMHg2ODMyLCAweDY5NTgsIDB4YTAwNiwgMHg2ODJlLCAweDY4MmEsIDB4MDA4OCwgMHg2ODRjLAorCTB4ZDBiNCwgMHgwOTA0LCAweDFhNDcsIDB4Njk1OCwgMHhhMDA2LCAweDY4MmUsIDB4NjgyYSwgMHgyZDAwLAorCTB4NjgxYSwgMHg2ODM0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDIxODYsIDB4MjAwNSwgMHg2ODMyLAorCTB4NjkyNiwgMHg2ODRjLCAweGMwZGQsIDB4Njg0ZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LAorCTB4MDAyMCwgMHg3ODA0LCAweGQwZmMsIDB4MTkwYywgMHgxZmY0LCAweDAwZTYsIDB4MDBkNiwgMHgyMDcxLAorCTB4YjAxZSwgMHg3MDAwLCAweGEwMDUsIDB4MTkwNCwgMHgxZjRjLCAweDAwYzYsIDB4NzIwNiwgMHhhMjgwLAorCTB4MDAwNCwgMHgyMDVjLCAweDcwMDQsIDB4MjA2OCwgMHg3ODAzLCAweDAwMDQsIDB4NjgxOCwgMHgwMGQ2LAorCTB4MjA2OCwgMHg2ODZjLCAweDc4MTIsIDB4Njg5MCwgMHgwMGY2LCAweDIwZTEsIDB4OTA0MCwgMHgyMDc5LAorCTB4MDIwMCwgMHg3ODFhLCAweDIwNzksIDB4MDEwMCwgMHg4MDA0LCAweDc4ZDYsIDB4MDBmZSwgMHgwMGRlLAorCTB4MmI2OCwgMHg2ODI0LCAweDIwNTAsIDB4NjgxOCwgMHgyMDYwLCAweDY4MzAsIDB4MjA0MCwgMHg2MDM0LAorCTB4YTBjYywgMHgwMDBmLCAweDY5MDgsIDB4NzkxYSwgMHg3MTE2LCAweDY4MGMsIDB4NzgxZSwgMHg3MDFhLAorCTB4YTAwNiwgMHg3MDBlLCAweDcwMTIsIDB4NzAwNCwgMHg2OTJjLCAweDY4MTQsIDB4YTEwNiwgMHgxMTIwLAorCTB4NjkyOCwgMHg2ODEwLCAweGExMDYsIDB4MDE1OCwgMHgwMDM2LCAweDAwNDYsIDB4NmIxNCwgMHg2YzEwLAorCTB4MDgwYywgMHgyMWE2LCAweDAwNGUsIDB4MDAzZSwgMHgwMTEwLCAweDAwY2UsIDB4MDBhOCwgMHg4YWZmLAorCTB4MTEyMCwgMHgwMGNlLCAweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA3OSwgMHgwMDIwLCAweDIwMDksIDB4MDAwMSwgMHgwMDU5LCAweDAxMTgsIDB4MjAwOSwgMHgwMDAxLAorCTB4MDAzOSwgMHgwMTJlLCAweDAwY2UsIDB4YTAwNiwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LAorCTB4MDA3NiwgMHgwMDY2LCAweDAwNTYsIDB4MDA0NiwgMHgwMDM2LCAweDAwMjYsIDB4OGFmZiwgMHgwOTA0LAorCTB4MWZjNSwgMHg3MDBjLCAweDcyMTQsIDB4YTIzYSwgMHg3MDEwLCAweDcyMTgsIDB4YTIwMywgMHgwYTA0LAorCTB4MWZjNCwgMHhhNzA1LCAweDA5MDQsIDB4MWZjNCwgMHhhMDNlLCAweDI3MzAsIDB4Njg1MCwgMHhkMGZjLAorCTB4MTFhOCwgMHgwMGQ2LCAweDI4MDUsIDB4YWM2OCwgMHgyOTAwLCAweDAwMDIsIDB4MWZhNywgMHgxZjhjLAorCTB4MWY4YywgMHgxZmE3LCAweDFmYTcsIDB4MWZhMCwgMHgxZmE3LCAweDFmOGMsIDB4MWZhNywgMHgxZjkxLAorCTB4MWY5MSwgMHgxZmE3LCAweDFmYTcsIDB4MWZhNywgMHgxZjk4LCAweDFmOTEsIDB4YzBmYywgMHg2ODUyLAorCTB4NmI2YywgMHg2YTcwLCAweDZkMWMsIDB4NmMyMCwgMHhkOTljLCAweDA1MjgsIDB4MDBkNiwgMHgyODA1LAorCTB4YWM2OCwgMHg2ZjA4LCAweDZlMGMsIDB4MDBmMCwgMHg2YjA4LCAweDZhMGMsIDB4NmQwMCwgMHg2YzA0LAorCTB4MDBjOCwgMHg2YjEwLCAweDZhMTQsIDB4NmQwMCwgMHg2YzA0LCAweDZmMDgsIDB4NmUwYywgMHgwMDkwLAorCTB4MDBkZSwgMHgwMGQ2LCAweDY4MzQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAxZSwgMHgxMTM4LAorCTB4MDBkZSwgMHgwODBjLCAweDIxNDgsIDB4MTkwNCwgMHgxZjU2LCAweGEwMGUsIDB4MDBmMCwgMHgwMGRlLAorCTB4MDgwYywgMHgxNGY2LCAweDAwZGUsIDB4N2IyMiwgMHg3YTI2LCAweDdkMzIsIDB4N2MzNiwgMHg3ZjNhLAorCTB4N2UzZSwgMHg3OTAyLCAweDcwMDAsIDB4ODAwMCwgMHg3MDAyLCAweDY4MjgsIDB4YTMwMCwgMHg2ODJhLAorCTB4NjgyYywgMHhhMjAxLCAweDY4MmUsIDB4NzAwYywgMHhhMzAwLCAweDcwMGUsIDB4NzAxMCwgMHhhMjAxLAorCTB4NzAxMiwgMHgwODBjLCAweDIxNDgsIDB4MDAwOCwgMHhhMDA2LCAweDAwMmUsIDB4MDAzZSwgMHgwMDRlLAorCTB4MDA1ZSwgMHgwMDZlLCAweDAwN2UsIDB4MDAwNSwgMHgwODBjLCAweDE0ZjYsIDB4MDAyNiwgMHgyMDAxLAorCTB4MDEwNSwgMHgyMDAzLCAweDAwMTAsIDB4MjBlMSwgMHg5MDQwLCAweDc4MDMsIDB4MDAwNCwgMHg3MDAzLAorCTB4MDAwMCwgMHg3MDA0LCAweDIwNjAsIDB4MDBkNiwgMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5NTk2LAorCTB4MDExOCwgMHg2ODUwLCAweGMwYmQsIDB4Njg1MiwgMHgwMGRlLCAweDA4MGMsIDB4OTI5YywgMHgyMGUxLAorCTB4OTA0MCwgMHgwODBjLCAweDdjYjgsIDB4MjAxMSwgMHgwMDAwLCAweDA4MGMsIDB4N2FlOSwgMHgwODBjLAorCTB4NmQwZCwgMHgwMDJlLCAweDA4MDQsIDB4MjBhZCwgMHgwMTI2LCAweDIwOTEsIDB4MjQwMCwgMHgwMDA2LAorCTB4MDAxNiwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDIwNzksIDB4MDAyMCwgMHgyMDcxLAorCTB4YjAxZSwgMHgyYjY4LCAweDY4MTgsIDB4MjA2MCwgMHg3OTA0LCAweDc4MDMsIDB4MDAwMiwgMHhhMTg0LAorCTB4MDcwMCwgMHgxOTIwLCAweDcwMDAsIDB4MDAwMiwgMHgyMGFkLCAweDIwMTAsIDB4MjA4MCwgMHgyMGFiLAorCTB4ODAwMSwgMHg3MDAyLCAweGQxOWMsIDB4MTE3MCwgMHg4YWZmLCAweDA1ZDAsIDB4MjAwOSwgMHgwMDAxLAorCTB4MDgwYywgMHgxZjUwLCAweDA5MDQsIDB4MjBhZCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwYywgMHgxZjUwLAorCTB4MDgwNCwgMHgyMGFkLCAweDc4MDMsIDB4MDAwNCwgMHhkMTk0LCAweDAxNDgsIDB4Njg1MCwgMHhjMGZjLAorCTB4Njg1MiwgMHg4YWZmLCAweDExZDgsIDB4Njg0YywgMHhjMGY1LCAweDY4NGUsIDB4MDBiOCwgMHgwMDI2LAorCTB4MDAzNiwgMHg2YjI4LCAweDZhMmMsIDB4NzgyMCwgMHg2ODZlLCAweGEzMWEsIDB4NzgyNCwgMHg2ODcyLAorCTB4YTIxMywgMHg3ODMwLCAweDY4MWUsIDB4NzgzNCwgMHg2ODIyLCAweDZiMmEsIDB4NmEyZSwgMHgwMDNlLAorCTB4MDAyZSwgMHgwODBjLCAweDIxNWUsIDB4Njg1MCwgMHhjMGZkLCAweDY4NTIsIDB4MmEwMCwgMHg2ODI2LAorCTB4MmMwMCwgMHg2ODFhLCAweDI4MDAsIDB4NjgzMiwgMHg3MDAzLCAweDAwMDAsIDB4MDgwNCwgMHgyMGFkLAorCTB4MDBmNiwgMHgwMDI2LCAweDc4MWMsIDB4MDAwNiwgMHg3ODE4LCAweDAwMDYsIDB4MjA3OSwgMHgwMTAwLAorCTB4N2ExNCwgMHhhMjg0LCAweDAxODQsIDB4YTA4NSwgMHgwMDEyLCAweDc4MTYsIDB4MDAzNiwgMHgyMDE5LAorCTB4MTAwMCwgMHg4MzE5LCAweDA5MGMsIDB4MTRmNiwgMHg3ODIwLCAweGQwYmMsIDB4MWRkMCwgMHgwMDNlLAorCTB4NzljOCwgMHgwMDBlLCAweGExMDIsIDB4MDAxZSwgMHgwMDA2LCAweDAwMTYsIDB4NzljNCwgMHgwMDBlLAorCTB4YTEwMywgMHg3OGM2LCAweDAwMGUsIDB4NzhjYSwgMHhhMjg0LCAweDAxODQsIDB4YTA4NSwgMHgwMDEyLAorCTB4NzgxNiwgMHgwMDJlLCAweDAwZmUsIDB4NzgwMywgMHgwMDA4LCAweDcwMDMsIDB4MDAwMCwgMHgwNDY4LAorCTB4ODAwMSwgMHg3MDAyLCAweGQxOTQsIDB4MDE2OCwgMHg3ODA0LCAweGQwZmMsIDB4MTkwNCwgMHgyMDA0LAorCTB4ZDE5YywgMHgxMWY4LCAweDhhZmYsIDB4MDUwOCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwYywgMHgxZjUwLAorCTB4MDBlMCwgMHgwMDI2LCAweDAwMzYsIDB4NmIyOCwgMHg2YTJjLCAweDA4MGMsIDB4MjE1ZSwgMHgwMGQ2LAorCTB4MjgwNSwgMHhhYzY4LCAweDYwMzQsIDB4ZDA5YywgMHgxMTI4LCAweDY4MDgsIDB4YTMxYSwgMHg2ODBjLAorCTB4YTIxMywgMHgwMDIwLCAweDY4MTAsIDB4YTMxYSwgMHg2ODE0LCAweGEyMTMsIDB4MDBkZSwgMHgwODA0LAorCTB4MjAzMywgMHgwODA0LCAweDIwMmYsIDB4MDgwYywgMHgxNGY2LCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMDFlLCAweDAwMGUsIDB4MDEyZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgyMDcxLAorCTB4YjAxZSwgMHg3MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwNTkwLCAweDIwNzksIDB4MDAyMCwgMHgwMDE2LAorCTB4MjAwOSwgMHgwMjA3LCAweDIxMGMsIDB4ZDE5NCwgMHgwMTU4LCAweDIwMDksIDB4MDIwYywgMHgyMTBjLAorCTB4YTE4NCwgMHgwMDAzLCAweDAxMjgsIDB4MjBlMSwgMHg5MDQwLCAweDIwMDEsIDB4MDIwYywgMHgyMTAyLAorCTB4MjAwOSwgMHgwMjA2LCAweDIxMDQsIDB4MjAwOSwgMHgwMjAzLCAweDIxMGMsIDB4YTEwNiwgMHgxMTEwLAorCTB4MjBlMSwgMHg5MDQwLCAweDc4MDQsIDB4ZDBmYywgMHgwZDE4LCAweDA4MGMsIDB4MWZmNCwgMHg3MDAwLAorCTB4YTA4NiwgMHgwMDAwLCAweDE5ZTgsIDB4MDAxZSwgMHg3ODAzLCAweDAwMDQsIDB4NzgwNCwgMHhkMGFjLAorCTB4MWRlOCwgMHgyMGUxLCAweDkwNDAsIDB4NzgwMywgMHgwMDAyLCAweDcwMDMsIDB4MDAwMCwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMDA1LCAweDAwMjYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgyMDcxLAorCTB4YjAxZSwgMHgyMDc5LCAweDAwMjAsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDU0MCwgMHg3MDA0LAorCTB4MjA2MCwgMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5NTk2LCAweDAxNTgsIDB4Njg1MCwgMHhjMGI1LAorCTB4Njg1MiwgMHg2ODBjLCAweDdhMWMsIDB4YTIwNiwgMHgxMTIwLCAweDY4MDgsIDB4N2ExOCwgMHhhMjA2LAorCTB4MDFlMCwgMHgyMDAxLCAweDAxMDUsIDB4MjAwMywgMHgwMDEwLCAweDIwZTEsIDB4OTA0MCwgMHg3ODAzLAorCTB4MDAwNCwgMHg3MDAzLCAweDAwMDAsIDB4NzAwNCwgMHgyMDYwLCAweDA4MGMsIDB4OTI5YywgMHgyMGUxLAorCTB4OTA0MCwgMHgwODBjLCAweDdjYjgsIDB4MjAxMSwgMHgwMDAwLCAweDA4MGMsIDB4N2FlOSwgMHgwMGZlLAorCTB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAyZSwgMHgwMDA1LCAweDY4MTAsIDB4NmExNCwgMHhhMjA1LAorCTB4MWQwMCwgMHg2ODRjLCAweGMwZGMsIDB4Njg0ZSwgMHgyYzEwLCAweDA4MGMsIDB4MWU2ZSwgMHgyMDAxLAorCTB4MDEwNSwgMHgyMDAzLCAweDAwMTAsIDB4MjBlMSwgMHg5MDQwLCAweDc4MDMsIDB4MDAwNCwgMHg3MDAzLAorCTB4MDAwMCwgMHgyMDY5LCAweGFmYzcsIDB4NjgzMywgMHgwMDAwLCAweDY4M2YsIDB4MDAwMCwgMHgwOGY4LAorCTB4ODg0MCwgMHgyODA1LCAweGEwMDUsIDB4MTE3MCwgMHg2MDA0LCAweGEwMDUsIDB4MDE2OCwgMHg2ODFhLAorCTB4MjA2MCwgMHg2MDM0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDIxODYsIDB4MjA0NSwgMHg4OGZmLAorCTB4MDkwYywgMHgxNGY2LCAweDhhNTEsIDB4MDAwNSwgMHgyMDUwLCAweDAwMDUsIDB4OGE1MCwgMHg4ODQxLAorCTB4MjgwNSwgMHhhMDA1LCAweDExOTAsIDB4MmMwMCwgMHhhZDA2LCAweDAxMjAsIDB4NjAwMCwgMHhhMDA1LAorCTB4MTEwOCwgMHgyZDAwLCAweDIwNjAsIDB4NjgxYSwgMHg2MDM0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLAorCTB4MjE5NiwgMHgyMDQ1LCAweDg4ZmYsIDB4MDkwYywgMHgxNGY2LCAweDAwMDUsIDB4MDAwMCwgMHgwMDExLAorCTB4MDAxNSwgMHgwMDE5LCAweDAwMWQsIDB4MDAyMSwgMHgwMDI1LCAweDAwMjksIDB4MDAwMCwgMHgwMDBmLAorCTB4MDAxNSwgMHgwMDFiLCAweDAwMjEsIDB4MDAyNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTdiLAorCTB4MjE3NywgMHgwMDAwLCAweDAwMDAsIDB4MjE4NSwgMHgwMDAwLCAweDIxN2IsIDB4MDAwMCwgMHgyMTgyLAorCTB4MjE3ZiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTg1LCAweDIxODIsIDB4MDAwMCwgMHgyMTdkLAorCTB4MjE3ZCwgMHgwMDAwLCAweDAwMDAsIDB4MjE4NSwgMHgwMDAwLCAweDIxN2QsIDB4MDAwMCwgMHgyMTgzLAorCTB4MjE4MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTg1LCAweDIxODMsIDB4MDBhNiwgMHgwMDk2LAorCTB4MDA4NiwgMHg2YjJlLCAweDZjMmEsIDB4Njg1OCwgMHhhMDU1LCAweDA5MDQsIDB4MjIzNywgMHgyZDYwLAorCTB4NjAzNCwgMHhhMGNjLCAweDAwMGYsIDB4YTljMCwgMHgyMTg2LCAweGE5ODYsIDB4MDAwNywgMHgwMTMwLAorCTB4YTk4NiwgMHgwMDBlLCAweDAxMTgsIDB4YTk4NiwgMHgwMDBmLCAweDExMjAsIDB4NjA1YywgMHhhNDIyLAorCTB4NjA2MCwgMHhhMzFhLCAweDI4MDUsIDB4YTA0NSwgMHgxMTQwLCAweDAzMTAsIDB4MDgwNCwgMHgyMjM3LAorCTB4NjAwNCwgMHhhMDY1LCAweDA5MDQsIDB4MjIzNywgMHgwYzE4LCAweDI4MDUsIDB4YTAwNSwgMHgwMWE4LAorCTB4YWM2OCwgMHhkOTljLCAweDExMjgsIDB4NjgwOCwgMHhhNDIyLCAweDY4MGMsIDB4YTMxYiwgMHgwMDIwLAorCTB4NjgxMCwgMHhhNDIyLCAweDY4MTQsIDB4YTMxYiwgMHgwNjIwLCAweDIzMDAsIDB4YTQwNSwgMHgwMTUwLAorCTB4OGE1MSwgMHgwOTA0LCAweDIyMzcsIDB4ODg0MCwgMHgwYzQwLCAweDYwMDQsIDB4YTA2NSwgMHgwOTA0LAorCTB4MjIzNywgMHgwODMwLCAweDhhNTEsIDB4MDkwNCwgMHgyMjM3LCAweDg4NDAsIDB4MjgwNSwgMHhhMDA1LAorCTB4MTE1OCwgMHg2MDA0LCAweGEwNjUsIDB4MDkwNCwgMHgyMjM3LCAweDYwMzQsIDB4YTBjYywgMHgwMDBmLAorCTB4YTljMCwgMHgyMTg2LCAweDI4MDUsIDB4MjA0MCwgMHgyYjY4LCAweDY4NTAsIDB4YzBmYywgMHg2ODUyLAorCTB4MDQ1OCwgMHg4NDIyLCAweDg0MjAsIDB4ODMxYSwgMHhhMzk5LCAweDAwMDAsIDB4MDBkNiwgMHgyYjY4LAorCTB4NmM2ZSwgMHg2YjcyLCAweDAwZGUsIDB4ZDk5YywgMHgxMTY4LCAweDY5MDgsIDB4MjQwMCwgMHhhMTIyLAorCTB4NjkwYywgMHgyMzAwLCAweGExMWIsIDB4MGEwYywgMHgxNGY2LCAweDY4MDAsIDB4YTQyMCwgMHg2ODA0LAorCTB4YTMxOSwgMHgwMDYwLCAweDY5MTAsIDB4MjQwMCwgMHhhMTIyLCAweDY5MTQsIDB4MjMwMCwgMHhhMTFiLAorCTB4MGEwYywgMHgxNGY2LCAweDY4MDAsIDB4YTQyMCwgMHg2ODA0LCAweGEzMTksIDB4MmI2OCwgMHg2YzFlLAorCTB4NmIyMiwgMHg2ODUwLCAweGMwZmQsIDB4Njg1MiwgMHgyYzAwLCAweDY4MWEsIDB4MjgwMCwgMHg2ODMyLAorCTB4MmEwMCwgMHg2ODI2LCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweGEwMDYsIDB4MDAyOCwgMHgwMDhlLAorCTB4MDA5ZSwgMHgwMGFlLCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LCAweDIwMDEsIDB4MDAwNSwgMHgyMDA0LAorCTB4YTA4NCwgMHgwMDA3LCAweDAwMDIsIDB4MjI0YiwgMHgyMjRjLCAweDIyNGYsIDB4MjI1MiwgMHgyMjU3LAorCTB4MjI1YSwgMHgyMjVmLCAweDIyNjQsIDB4MDAwNSwgMHgwODBjLCAweDFmZjQsIDB4MDAwNSwgMHgwODBjLAorCTB4MWE2YywgMHgwMDA1LCAweDA4MGMsIDB4MWE2YywgMHgwODBjLCAweDFmZjQsIDB4MDAwNSwgMHgwODBjLAorCTB4MTZmOCwgMHgwMDA1LCAweDA4MGMsIDB4MWZmNCwgMHgwODBjLCAweDE2ZjgsIDB4MDAwNSwgMHgwODBjLAorCTB4MWE2YywgMHgwODBjLCAweDE2ZjgsIDB4MDAwNSwgMHgwODBjLCAweDFhNmMsIDB4MDgwYywgMHgxZmY0LAorCTB4MDgwYywgMHgxNmY4LCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDI2MDAsIDB4MjA3OSwgMHgwMjAwLAorCTB4MjA3MSwgMHhiMjgwLCAweDIwNjksIDB4YWQwMCwgMHgyMDA5LCAweDAwMDQsIDB4NzkxMiwgMHg3ODE3LAorCTB4MDAwNCwgMHgwODBjLCAweDI2NTEsIDB4NzgxYiwgMHgwMDAyLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLAorCTB4NDAwMCwgMHgyMGE5LCAweDAwODAsIDB4NzgyZiwgMHgwMDAwLCAweDFmMDQsIDB4MjI4MywgMHgyMGUxLAorCTB4OTA4MCwgMHg3ODNiLCAweDAwMWYsIDB4MjBlMSwgMHg4NzAwLCAweDAxMmUsIDB4MDAwNSwgMHgwMTI2LAorCTB4MjA5MSwgMHgyNjAwLCAweDc4MWMsIDB4ZDBhNCwgMHgxOTBjLCAweDIzMzUsIDB4YTA4NCwgMHgwMDA3LAorCTB4MDAwMiwgMHgyMmIzLCAweDIyYTEsIDB4MjJhNCwgMHgyMmE3LCAweDIyYWMsIDB4MjJhZSwgMHgyMmIwLAorCTB4MjJiMiwgMHgwODBjLCAweDVmYjcsIDB4MDA3OCwgMHgwODBjLCAweDVmZjAsIDB4MDA2MCwgMHgwODBjLAorCTB4NWZiNywgMHgwODBjLCAweDVmZjAsIDB4MDAzOCwgMHgwMDQxLCAweDAwMjgsIDB4MDAzMSwgMHgwMDE4LAorCTB4MDAyMSwgMHgwMDA4LCAweDAwMTEsIDB4MDEyZSwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LAorCTB4NzkzMCwgMHhhMTg0LCAweDAwMDMsIDB4MDExOCwgMHgyMGUxLCAweDkwNDAsIDB4MDRhMCwgMHhhMTg0LAorCTB4MDAzMCwgMHgwMWUwLCAweDZhMDAsIDB4YTI4NiwgMHgwMDAzLCAweDExMDgsIDB4MDBhMCwgMHgwODBjLAorCTB4NTc0ZiwgMHgxMTc4LCAweDIwMDEsIDB4YWY5ZSwgMHgyMDAzLCAweDAwMDEsIDB4MjAwMSwgMHhhZDAwLAorCTB4MjAwMywgMHgwMDAxLCAweGEwODUsIDB4MDAwMSwgMHgwODBjLCAweDU3OTMsIDB4MDgwYywgMHg1NjlhLAorCTB4MDAxMCwgMHgwODBjLCAweDQ4NWUsIDB4MjBlMSwgMHg5MDEwLCAweDAwYTgsIDB4YTE4NCwgMHgwMGMwLAorCTB4MDE2OCwgMHgwMGU2LCAweDAwMzYsIDB4MDA0NiwgMHgwMDU2LCAweDIwNzEsIDB4YWZmZCwgMHgwODBjLAorCTB4MWQyMiwgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwgMHgwMGVlLCAweDAwMjgsIDB4YTE4NCwgMHgwMzAwLAorCTB4MDExMCwgMHgyMGUxLCAweDkwMjAsIDB4NzkzMiwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDAxNiwgMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwgMHhhZDAwLCAweDcxMjgsIDB4MjAwMSwgMHhhZjkwLAorCTB4MjEwMiwgMHgyMDAxLCAweGFmOTgsIDB4MjEwMiwgMHhhMTgyLCAweDAyMTEsIDB4MTIxOCwgMHgyMDA5LAorCTB4MDAwOCwgMHgwNDAwLCAweGExODIsIDB4MDI1OSwgMHgxMjE4LCAweDIwMDksIDB4MDAwNywgMHgwMGQwLAorCTB4YTE4MiwgMHgwMmMxLCAweDEyMTgsIDB4MjAwOSwgMHgwMDA2LCAweDAwYTAsIDB4YTE4MiwgMHgwMzQ5LAorCTB4MTIxOCwgMHgyMDA5LCAweDAwMDUsIDB4MDA3MCwgMHhhMTgyLCAweDA0MjEsIDB4MTIxOCwgMHgyMDA5LAorCTB4MDAwNCwgMHgwMDQwLCAweGExODIsIDB4MDU4MSwgMHgxMjE4LCAweDIwMDksIDB4MDAwMywgMHgwMDEwLAorCTB4MjAwOSwgMHgwMDAyLCAweDIwNzksIDB4MDIwMCwgMHg3OTEyLCAweDc4MTcsIDB4MDAwNCwgMHgwODBjLAorCTB4MjY1MSwgMHgwMGZlLCAweDAwZWUsIDB4MDAxZSwgMHgwMDA1LCAweDc5MzgsIDB4MDgwYywgMHgxNGY2LAorCTB4MDEyNiwgMHgyMDkxLCAweDI4MDAsIDB4MjA2MSwgMHgwMTAwLCAweDIwNzEsIDB4YWQwMCwgMHg2MDI0LAorCTB4NjAyNiwgMHg2MDUzLCAweDAwMzAsIDB4MDgwYywgMHgyNjkwLCAweDYwNTAsIDB4YTA4NCwgMHhmZTdmLAorCTB4NjA1MiwgMHgyMDA5LCAweDAwZWYsIDB4NjEzMiwgMHg2MTM2LCAweDA4MGMsIDB4MjZhMCwgMHg2MGU3LAorCTB4MDAwMCwgMHg2MWVhLCAweDYwZTMsIDB4MDAwOCwgMHg2MDRiLCAweGY3ZjcsIDB4NjA0MywgMHgwMDAwLAorCTB4NjAyZiwgMHgwMDgwLCAweDYwMmYsIDB4MDAwMCwgMHg2MDA3LCAweDBlOWYsIDB4NjAxYiwgMHgwMDFlLAorCTB4NjAwZiwgMHgwMGZmLCAweDIwMDEsIDB4YWY4YywgMHgyMDAzLCAweDAwZmYsIDB4NjAyYiwgMHgwMDJmLAorCTB4MDEyZSwgMHgwMDA1LCAweDIwMDEsIDB4YWQzMSwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHhhZDMwLAorCTB4MjAwMywgMHgwMDAxLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDI4MDAsIDB4MDAwNiwgMHgwMDE2LAorCTB4MDAyNiwgMHg2MTI0LCAweGExODQsIDB4MWUyYywgMHgxMTE4LCAweGExODQsIDB4MDAwNywgMHgwMDJhLAorCTB4YTE5NSwgMHgwMDA0LCAweGEyODQsIDB4MDAwNywgMHgwMDAyLCAweDIzYTcsIDB4MjM4ZCwgMHgyMzkwLAorCTB4MjM5MywgMHgyMzk4LCAweDIzOWEsIDB4MjM5ZSwgMHgyM2EyLCAweDA4MGMsIDB4NjY5OSwgMHgwMGI4LAorCTB4MDgwYywgMHg2Nzc0LCAweDAwYTAsIDB4MDgwYywgMHg2Nzc0LCAweDA4MGMsIDB4NjY5OSwgMHgwMDc4LAorCTB4MDA5OSwgMHgwMDY4LCAweDA4MGMsIDB4NjY5OSwgMHgwMDc5LCAweDAwNDgsIDB4MDgwYywgMHg2Nzc0LAorCTB4MDA1OSwgMHgwMDI4LCAweDA4MGMsIDB4Njc3NCwgMHgwODBjLCAweDY2OTksIDB4MDAyOSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwMDBlLCAweDAxMmUsIDB4MDAwNSwgMHg2MTI0LCAweGQxOWMsIDB4MTkwNCwgMHgyNWJmLAorCTB4MDgwYywgMHg1NzRmLCAweDA1NzgsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDMsIDB4MDE5OCwgMHg2MDI0LAorCTB4YTA4NCwgMHgxODAwLCAweDAxNzgsIDB4MDgwYywgMHg1Nzc1LCAweDAxMTgsIDB4MDgwYywgMHg1NzYxLAorCTB4MTE0OCwgMHg2MDI3LCAweDAwMjAsIDB4NjA0MywgMHgwMDAwLCAweDIwMDEsIDB4YWY5ZCwgMHgyMDAzLAorCTB4YWFhYSwgMHgwNDU4LCAweDA4MGMsIDB4NTc3NSwgMHgxNWQwLCAweDYwMjQsIDB4YTA4NCwgMHgxODAwLAorCTB4MTEwOCwgMHgwNGE4LCAweDIwMDEsIDB4YWY5ZCwgMHgyMDAzLCAweGFhYWEsIDB4MjAwMSwgMHhhZjllLAorCTB4MjAwMywgMHgwMDAxLCAweDIwMDEsIDB4YWQwMCwgMHgyMDAzLCAweDAwMDEsIDB4MDgwYywgMHg1NjlhLAorCTB4MDgwNCwgMHgyNWJmLCAweGQxYWMsIDB4MTUxOCwgMHg2MDI0LCAweGQwZGMsIDB4MTE3MCwgMHhkMGU0LAorCTB4MTE4OCwgMHhkMGQ0LCAweDExYTAsIDB4ZDBjYywgMHgwMTMwLCAweDcwODgsIDB4YTA4NiwgMHgwMDI4LAorCTB4MTExMCwgMHgwODBjLCAweDU4ZGEsIDB4MDgwNCwgMHgyNWJmLCAweDIwMDEsIDB4YWY5ZSwgMHgyMDAzLAorCTB4MDAwMCwgMHgwMDQ4LCAweDIwMDEsIDB4YWY5ZSwgMHgyMDAzLCAweDAwMDIsIDB4MDAyMCwgMHgwODBjLAorCTB4NTg0ZCwgMHgwODA0LCAweDI1YmYsIDB4MDgwYywgMHg1OTdhLCAweDA4MDQsIDB4MjViZiwgMHhkMWFjLAorCTB4MDkwNCwgMHgyNTA3LCAweDA4MGMsIDB4NTc0ZiwgMHgxMWQ4LCAweDYwMjcsIDB4MDAyMCwgMHgwMDA2LAorCTB4MDAyNiwgMHgwMDM2LCAweDA4MGMsIDB4NTc2YiwgMHgxMTcwLCAweDIwMDEsIDB4YWY5ZSwgMHgyMDAzLAorCTB4MDAwMSwgMHgyMDAxLCAweGFkMDAsIDB4MjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NTY5YSwgMHgwMDNlLAorCTB4MDAyZSwgMHgwMDBlLCAweDAwMDUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMGUsIDB4MDgwYywgMHg1NzI2LAorCTB4MDAxNiwgMHgwMDQ2LCAweDAwYzYsIDB4NjQ0YywgMHhhNDg2LCAweGYwZjAsIDB4MTEzOCwgMHgyMDYxLAorCTB4MDEwMCwgMHg2NDRhLCAweDYwNDMsIDB4MDA5MCwgMHg2MDQzLCAweDAwMTAsIDB4NzRjYSwgMHhhNDhjLAorCTB4ZmYwMCwgMHg3MDM0LCAweGQwODQsIDB4MDE3OCwgMHhhMTg2LCAweGY4MDAsIDB4MTE2MCwgMHg3MDM4LAorCTB4ZDA4NCwgMHgxMTQ4LCAweGMwODUsIDB4NzAzYSwgMHgwMDM2LCAweDI0MTgsIDB4MjAxMSwgMHg4MDE2LAorCTB4MDgwYywgMHgzYzVjLCAweDAwM2UsIDB4YTE5NiwgMHhmZjAwLCAweDA1YjgsIDB4NzA1MCwgMHhhMDg0LAorCTB4MDBmZiwgMHg4MTBmLCAweGExMTYsIDB4MDU4OCwgMHg3MTMwLCAweGQxODQsIDB4MTU3MCwgMHgyMDExLAorCTB4YWQ1MiwgMHgyMjE0LCAweGQyZWMsIDB4MDEzOCwgMHhjMThkLCAweDcxMzIsIDB4MjAxMSwgMHhhZDUyLAorCTB4MjIxNCwgMHhkMmFjLCAweDE1MTAsIDB4NjI0MCwgMHhhMjk0LCAweDAwMTAsIDB4MDEzMCwgMHg2MjQ4LAorCTB4YTI5NCwgMHhmZjAwLCAweGEyOTYsIDB4ZmYwMCwgMHgwMWMwLCAweDcwMzAsIDB4ZDA4YywgMHgwOTA0LAorCTB4MjRkMiwgMHg3MDM0LCAweGQwOGMsIDB4MTE0MCwgMHgyMDAxLCAweGFkMGMsIDB4MjAwYywgMHhkMWFjLAorCTB4MTkwNCwgMHgyNGQyLCAweGMxYWQsIDB4MjEwMiwgMHgwMDM2LCAweDczYzgsIDB4MjAxMSwgMHg4MDEzLAorCTB4MDgwYywgMHgzYzVjLCAweDAwM2UsIDB4MDgwNCwgMHgyNGQyLCAweDcwMzQsIDB4ZDA4YywgMHgxMTQwLAorCTB4MjAwMSwgMHhhZDBjLCAweDIwMGMsIDB4ZDFhYywgMHgxOTA0LCAweDI0ZDIsIDB4YzFhZCwgMHgyMTAyLAorCTB4MDAzNiwgMHg3M2M4LCAweDIwMTEsIDB4ODAxMywgMHgwODBjLCAweDNjNWMsIDB4MDAzZSwgMHg3MTMwLAorCTB4YzE4NSwgMHg3MTMyLCAweDIwMTEsIDB4YWQ1MiwgMHgyMjBjLCAweGQxYTQsIDB4MDFkMCwgMHgwMDE2LAorCTB4MjAwOSwgMHgwMDAxLCAweDIwMTEsIDB4MDEwMCwgMHgwODBjLCAweDY2M2YsIDB4MjAxOSwgMHgwMDBlLAorCTB4MDgwYywgMHhhOGViLCAweGE0ODQsIDB4MDBmZiwgMHhhMDgwLCAweDJiZTYsIDB4MjAwZCwgMHhhMThjLAorCTB4ZmYwMCwgMHg4MTBmLCAweDgxMjcsIDB4YTAwNiwgMHgyMDA5LCAweDAwMGUsIDB4MDgwYywgMHhhOTZjLAorCTB4MDAxZSwgMHhkMWFjLCAweDExNDgsIDB4MDAxNiwgMHgyMDA5LCAweDAwMDAsIDB4MjAxOSwgMHgwMDA0LAorCTB4MDgwYywgMHgyYWFjLCAweDAwMWUsIDB4MDA3MCwgMHgwMTU2LCAweDIwYTksIDB4MDA3ZiwgMHgyMDA5LAorCTB4MDAwMCwgMHgwODBjLCAweDRjZGMsIDB4MTExMCwgMHgwODBjLCAweDQ5M2EsIDB4ODEwOCwgMHgxZjA0LAorCTB4MjRjOSwgMHgwMTVlLCAweDAwY2UsIDB4MDA0ZSwgMHgyMDExLCAweDAwMDMsIDB4MDgwYywgMHg3YWRmLAorCTB4MjAxMSwgMHgwMDAyLCAweDA4MGMsIDB4N2FlOSwgMHgwODBjLCAweDc5ZTEsIDB4MDgwYywgMHg2NTgxLAorCTB4MDAzNiwgMHgyMDE5LCAweDAwMDAsIDB4MDgwYywgMHg3YTY0LCAweDAwM2UsIDB4NjBlMywgMHgwMDAwLAorCTB4MDAxZSwgMHgyMDAxLCAweGFkMDAsIDB4MjAxNCwgMHhhMjk2LCAweDAwMDQsIDB4MTEyOCwgMHhkMTljLAorCTB4MTExOCwgMHg2MjI4LCAweGMyOWQsIDB4NjIyYSwgMHgyMDAzLCAweDAwMDEsIDB4MjAwMSwgMHhhZDIyLAorCTB4MjAwMywgMHgwMDAwLCAweDYwMjcsIDB4MDAyMCwgMHgwODBjLCAweDU3NzUsIDB4MTE0MCwgMHgwMDE2LAorCTB4MjAwOSwgMHgwN2QwLCAweDIwMTEsIDB4NTY3YiwgMHgwODBjLCAweDY1OTMsIDB4MDAxZSwgMHhkMTk0LAorCTB4MDkwNCwgMHgyNWJmLCAweDAwMTYsIDB4NjIyMCwgMHhkMmI0LCAweDA5MDQsIDB4MjU3MCwgMHgwODBjLAorCTB4NjU4MSwgMHgwODBjLCAweDc4MzQsIDB4NjAyNywgMHgwMDA0LCAweDAwZjYsIDB4MjAxOSwgMHhhZmQwLAorCTB4MjMwNCwgMHhhMDdkLCAweDA1NzAsIDB4NzgwNCwgMHhhMDg2LCAweDAwMzIsIDB4MTU1MCwgMHgwMGQ2LAorCTB4MDBjNiwgMHgwMGU2LCAweDIwNjksIDB4MDE0MCwgMHg2MThjLCAweDYyODgsIDB4NzgxOCwgMHg2MDhlLAorCTB4NzgwOCwgMHg2MDhhLCAweDYwNDMsIDB4MDAwMiwgMHgyMDAxLCAweDAwMDMsIDB4ODAwMSwgMHgxZGYwLAorCTB4NjA0MywgMHgwMDAwLCAweDY4MDMsIDB4MTAwMCwgMHg2ODAzLCAweDAwMDAsIDB4NjE4ZSwgMHg2MjhhLAorCTB4MDgwYywgMHg2YjczLCAweDA4MGMsIDB4NmM1MCwgMHg3ODEwLCAweDIwNzAsIDB4NzAzNywgMHgwMTAzLAorCTB4MmY2MCwgMHgwODBjLCAweDgwNzgsIDB4MDBlZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBmZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwMGZlLCAweDAwZDYsIDB4MjA2OSwgMHgwMTQwLCAweDY4MDQsIDB4YTA4NCwgMHg0MDAwLAorCTB4MDEyMCwgMHg2ODAzLCAweDEwMDAsIDB4NjgwMywgMHgwMDAwLCAweDAwZGUsIDB4MDBjNiwgMHgyMDYxLAorCTB4YWZjNywgMHg2MDI4LCAweGEwOWEsIDB4MDBjOCwgMHgxMjM4LCAweDgwMDAsIDB4NjAyYSwgMHgwMGNlLAorCTB4MDgwYywgMHg3ODI3LCAweDA4MDQsIDB4MjViZSwgMHgyMDE5LCAweGFmZDAsIDB4MjMwNCwgMHhhMDY1LAorCTB4MDEyMCwgMHgyMDA5LCAweDAwMjcsIDB4MDgwYywgMHg4MGE3LCAweDAwY2UsIDB4MDgwNCwgMHgyNWJlLAorCTB4ZDJiYywgMHgwOTA0LCAweDI1YmUsIDB4MDgwYywgMHg2NThlLCAweDYwMTQsIDB4YTA4NCwgMHgwMTg0LAorCTB4YTA4NSwgMHgwMDEwLCAweDYwMTYsIDB4NjAyNywgMHgwMDA0LCAweDAwZDYsIDB4MjA2OSwgMHgwMTQwLAorCTB4NjgwNCwgMHhhMDg0LCAweDQwMDAsIDB4MDEyMCwgMHg2ODAzLCAweDEwMDAsIDB4NjgwMywgMHgwMDAwLAorCTB4MDBkZSwgMHgwMGM2LCAweDIwNjEsIDB4YWZjNywgMHg2MDQ0LCAweGEwOWEsIDB4MDBjOCwgMHgxMmYwLAorCTB4ODAwMCwgMHg2MDQ2LCAweDYwM2MsIDB4MDBjZSwgMHhhMDA1LCAweDA1NDAsIDB4MjAwOSwgMHgwN2QwLAorCTB4MDgwYywgMHg2NTg2LCAweGEwODAsIDB4MDAwNywgMHgyMDA0LCAweGEwODYsIDB4MDAwNiwgMHgxMTM4LAorCTB4NjExNCwgMHhhMThjLCAweDAxODQsIDB4YTE4ZCwgMHgwMDEyLCAweDYxMTYsIDB4MDBiOCwgMHg2MTE0LAorCTB4YTE4YywgMHgwMTg0LCAweGExOGQsIDB4MDAxNiwgMHg2MTE2LCAweDAwODAsIDB4MDAzNiwgMHgyMDE5LAorCTB4MDAwMSwgMHgwODBjLCAweDdhNjQsIDB4MDAzZSwgMHgyMDE5LCAweGFmZDYsIDB4MjMwNCwgMHhhMDY1LAorCTB4MDEyMCwgMHgyMDA5LCAweDAwNGYsIDB4MDgwYywgMHg4MGE3LCAweDAwY2UsIDB4MDAxZSwgMHhkMTljLAorCTB4MDkwNCwgMHgyNjFhLCAweDcwMzQsIDB4ZDBhYywgMHgxNTYwLCAweDAwMTYsIDB4MDE1NiwgMHg2MDI3LAorCTB4MDAwOCwgMHg2MDJmLCAweDAwMjAsIDB4MjBhOSwgMHgwMDA2LCAweDFkMDQsIDB4MjVjZCwgMHgyMDkxLAorCTB4NjAwMCwgMHgxZjA0LCAweDI1Y2QsIDB4NjAyZiwgMHgwMDAwLCAweDYxNTAsIDB4YTE4NSwgMHgxNDAwLAorCTB4NjA1MiwgMHgyMGE5LCAweDAzNjYsIDB4MWQwNCwgMHgyNWRiLCAweDIwOTEsIDB4NjAwMCwgMHg2MDIwLAorCTB4ZDA5YywgMHgxMTMwLCAweDAxNWUsIDB4NjE1MiwgMHgwMDFlLCAweDYwMjcsIDB4MDAwOCwgMHgwNDkwLAorCTB4MDgwYywgMHgyNzYwLCAweDFmMDQsIDB4MjVkYiwgMHgwMTVlLCAweDYxNTIsIDB4MDAxZSwgMHg2MDI3LAorCTB4MDAwOCwgMHgwMDE2LCAweDYwMjgsIDB4YzA5YywgMHg2MDJhLCAweDIwMTEsIDB4MDAwMywgMHgwODBjLAorCTB4N2FkZiwgMHgyMDExLCAweDAwMDIsIDB4MDgwYywgMHg3YWU5LCAweDA4MGMsIDB4NzllMSwgMHgwODBjLAorCTB4NjU4MSwgMHgwMDM2LCAweDIwMTksIDB4MDAwMCwgMHgwODBjLCAweDdhNjQsIDB4MDAzZSwgMHg2MGUzLAorCTB4MDAwMCwgMHgwODBjLCAweGFjOGQsIDB4MDgwYywgMHhhY2E4LCAweGEwODUsIDB4MDAwMSwgMHgwODBjLAorCTB4NTc5MywgMHgyMDAxLCAweGFkMDAsIDB4MjAwMywgMHgwMDA0LCAweDYwMjcsIDB4MDAwOCwgMHgwODBjLAorCTB4MTJjYywgMHgwMDFlLCAweGExOGMsIDB4ZmZkMCwgMHg2MTI2LCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LAorCTB4MDAyNiwgMHgwMGU2LCAweDAwZjYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhZDAwLAorCTB4NzFjMCwgMHg3MGMyLCAweGExMTYsIDB4MDFmMCwgMHg4MWZmLCAweDAxMjgsIDB4MjAxMSwgMHg4MDExLAorCTB4MDgwYywgMHgzYzVjLCAweDAwYjgsIDB4MjAxMSwgMHg4MDEyLCAweDA4MGMsIDB4M2M1YywgMHgyMDAxLAorCTB4YWQ3MSwgMHgyMDA0LCAweGQwZmMsIDB4MTE3MCwgMHgwMDM2LCAweDAwYzYsIDB4MDgwYywgMHgyNmViLAorCTB4MjA2MSwgMHgwMTAwLCAweDIwMTksIDB4MDAyOCwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHgyYWFjLAorCTB4MDBjZSwgMHgwMDNlLCAweDAxMmUsIDB4MDBmZSwgMHgwMGVlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLAorCTB4MDAwNSwgMHgwMGM2LCAweDAwZjYsIDB4MDAwNiwgMHgwMDI2LCAweDIwNjEsIDB4MDEwMCwgMHhhMTkwLAorCTB4MjY2NCwgMHgyMjA1LCAweDYwZjIsIDB4MjAxMSwgMHgyNjcxLCAweDIyMDUsIDB4NjBlZSwgMHgwMDJlLAorCTB4MDAwZSwgMHgwMGZlLCAweDAwY2UsIDB4MDAwNSwgMHgwODQwLCAweDA4NDAsIDB4MDg0MCwgMHgwNTgwLAorCTB4MDQyMCwgMHgwMzQ4LCAweDAyYzAsIDB4MDI1OCwgMHgwMjEwLCAweDAxYTgsIDB4MDFhOCwgMHgwMWE4LAorCTB4MDFhOCwgMHgwMTQwLCAweDAwZjgsIDB4MDBkMCwgMHgwMGIwLCAweDAwYTAsIDB4MjAyOCwgMHhhMThjLAorCTB4MDBmZiwgMHgyMTMwLCAweGEwOTQsIDB4ZmYwMCwgMHgxMTEwLCAweDgxZmYsIDB4MDExOCwgMHgwODBjLAorCTB4NjI3OCwgMHgwMDM4LCAweGEwODAsIDB4MmJlNiwgMHgyMDBkLCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLAorCTB4YTAwNiwgMHgwMDA1LCAweGEwODAsIDB4MmJlNiwgMHgyMDBkLCAweGExOGMsIDB4MDBmZiwgMHgwMDA1LAorCTB4MDBkNiwgMHgyMDY5LCAweDAxNDAsIDB4MjAwMSwgMHhhZDE0LCAweDIwMDMsIDB4MDBlZiwgMHgyMGE5LAorCTB4MDAxMCwgMHhhMDA2LCAweDY4NTIsIDB4Njg1NiwgMHgxZjA0LCAweDI2OWIsIDB4MDBkZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgwMGQ2LCAweDAwMjYsIDB4MjA2OSwgMHgwMTQwLCAweDIwMDEsIDB4YWQxNCwgMHgyMTAyLAorCTB4ODExNCwgMHg4MjE0LCAweDgyMTQsIDB4ODIxNCwgMHgyMGE5LCAweDAwMTAsIDB4Njg1MywgMHgwMDAwLAorCTB4YTAwNiwgMHg4MmZmLCAweDExMjgsIDB4YTE4NCwgMHgwMDBmLCAweGEwODAsIDB4YWNhZSwgMHgyMDA1LAorCTB4Njg1NiwgMHg4MjExLCAweDFmMDQsIDB4MjZiMCwgMHgwMDJlLCAweDAwZGUsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDBjNiwgMHgyMDYxLCAweGFkMDAsIDB4NjAzMCwgMHgwMTEwLCAweGMwOWQsIDB4MDAwOCwgMHhjMDljLAorCTB4NjAzMiwgMHgwMGNlLCAweDAwMDUsIDB4MDE1NiwgMHgwMGQ2LCAweDAwMjYsIDB4MDAxNiwgMHgwMDA2LAorCTB4MjA2OSwgMHgwMTQwLCAweDY5ODAsIDB4YTExNiwgMHgwMTgwLCAweGExMTIsIDB4MTIzMCwgMHg4MjEyLAorCTB4ODIxMCwgMHgyMmE4LCAweDIwMDEsIDB4MDQwMiwgMHgwMDE4LCAweDIyYTgsIDB4MjAwMSwgMHgwNDA0LAorCTB4NjgwZSwgMHgxZjA0LCAweDI2ZTAsIDB4NjgwZiwgMHgwMDAwLCAweDAwMGUsIDB4MDAxZSwgMHgwMDJlLAorCTB4MDBkZSwgMHgwMTVlLCAweDAwMDUsIDB4MjAwMSwgMHhhZDUyLCAweDIwMDQsIDB4ZDBjNCwgMHgwMTUwLAorCTB4ZDBhNCwgMHgwMTQwLCAweGEwMDYsIDB4MDA0NiwgMHgyMDIwLCAweDIwMDksIDB4MDAyZSwgMHgwODBjLAorCTB4YTk2YywgMHgwMDRlLCAweDAwMDUsIDB4MDBmNiwgMHgwMDE2LCAweDAwMjYsIDB4MjA3OSwgMHgwMTQwLAorCTB4NzhjNCwgMHhkMGRjLCAweDA1NDgsIDB4YTA4NCwgMHgwNzAwLCAweGEwOGUsIDB4MDMwMCwgMHgxNTIwLAorCTB4MjAxMSwgMHgwMDAwLCAweDIwMDksIDB4MDAwMiwgMHgyMzAwLCAweGEwODAsIDB4MDAyMCwgMHgyMDE4LAorCTB4MjMwMCwgMHgwODBjLCAweDY2NjUsIDB4MjAxMSwgMHgwMDMwLCAweDIyMDAsIDB4ODAwNywgMHhhMDg1LAorCTB4MDA0YywgMHg3OGMyLCAweDIwMDksIDB4MDIwNCwgMHgyMTBjLCAweDIyMDAsIDB4YTEwMCwgMHgyMDA5LAorCTB4MDEzOCwgMHgyMDBhLCAweDA4MGMsIDB4NTc0ZiwgMHgxMTE4LCAweDIwMDksIDB4YWY4ZSwgMHgyMDBhLAorCTB4MDAyZSwgMHgwMDFlLCAweDAwZmUsIDB4MDAwNSwgMHg3OGMzLCAweDAwMDAsIDB4MGNjOCwgMHgwMTI2LAorCTB4MjA5MSwgMHgyODAwLCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDIwMDEsIDB4MDE3MCwgMHgyMDBjLAorCTB4ODAwMCwgMHgyMDE0LCAweGExODQsIDB4MDAwMywgMHgwMTEwLCAweDA4MDQsIDB4MWE2YSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwMDBlLCAweDAxMmUsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LAorCTB4YTA4MiwgMHgwMDA1LCAweDAwMGUsIDB4MDI2OCwgMHgyMDAxLCAweDAxNzAsIDB4MjAwYywgMHhhMThjLAorCTB4MDBmZiwgMHhhMThlLCAweDAwNGMsIDB4MTEyOCwgMHgyMDBjLCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLAorCTB4MDAxMCwgMHgyMDA5LCAweDAwMDAsIDB4MjAwMSwgMHgwMjA0LCAweDIwMDQsIDB4YTEwOCwgMHgwMDA1LAorCTB4MDAwNiwgMHgwMTU2LCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDIwYTksIDB4MDAwYSwgMHg3ODU0LAorCTB4ZDA4YywgMHgxMTEwLCAweDFmMDQsIDB4Mjc2NywgMHgwMGZlLCAweDAxNWUsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDAxNiwgMHgwMGM2LCAweDAwMDYsIDB4MjA2MSwgMHgwMTAwLCAweDYwMzAsIDB4MDAwNiwgMHg2MDQ4LAorCTB4MDAwNiwgMHg2MGU0LCAweDAwMDYsIDB4NjBlOCwgMHgwMDA2LCAweDYwNTAsIDB4MDAwNiwgMHg2MGYwLAorCTB4MDAwNiwgMHg2MGVjLCAweDAwMDYsIDB4NjAwYywgMHgwMDA2LCAweDYwMDQsIDB4MDAwNiwgMHg2MDI4LAorCTB4MDAwNiwgMHg2MGUwLCAweDAwMDYsIDB4NjAyZiwgMHgwMTAwLCAweDYwMmYsIDB4MDAwMCwgMHhlMDAwLAorCTB4ZTAwMCwgMHhlMDAwLCAweGUwMDAsIDB4NjAyZiwgMHgwMDQwLCAweDYwMmYsIDB4MDAwMCwgMHgwMDBlLAorCTB4NjBlMiwgMHgwMDBlLCAweDYwMmEsIDB4MDAwZSwgMHg2MDA2LCAweDAwMGUsIDB4NjAwZSwgMHgwMDBlLAorCTB4NjBlZSwgMHgwMDBlLCAweDYwZjIsIDB4MDAwZSwgMHg2MDUyLCAweDAwMGUsIDB4NjBlYSwgMHgwMDBlLAorCTB4NjBlNiwgMHgwMDBlLCAweDYwNGEsIDB4MDAwZSwgMHg2MDMyLCAweDYwMzYsIDB4MjAwOCwgMHgwODBjLAorCTB4MjZhMCwgMHgwMDBlLCAweDAwY2UsIDB4MDAxZSwgMHgwMDA1LCAweDI4NDUsIDB4Mjg0OSwgMHgyODRkLAorCTB4Mjg1MywgMHgyODU5LCAweDI4NWYsIDB4Mjg2NSwgMHgyODZkLCAweDI4NzUsIDB4Mjg3YiwgMHgyODgxLAorCTB4Mjg4OSwgMHgyODkxLCAweDI4OTksIDB4MjhhMSwgMHgyOGFiLCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LAorCTB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LAorCTB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LAorCTB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LAorCTB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LAorCTB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LAorCTB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjcsIDB4MjhiNywgMHgyOGJjLAorCTB4MjhiYywgMHgyOGMzLCAweDI4YzMsIDB4MjhjYSwgMHgyOGNhLCAweDI4ZDMsIDB4MjhkMywgMHgyOGRhLAorCTB4MjhkYSwgMHgyOGUzLCAweDI4ZTMsIDB4MjhlYywgMHgyOGVjLCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LAorCTB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LAorCTB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LAorCTB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LAorCTB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LAorCTB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LAorCTB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LAorCTB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LAorCTB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDAxMDYsIDB4MDAwNiwgMHgwODA0LAorCTB4MjhmNywgMHgwMTA2LCAweDAwMDYsIDB4MDgwNCwgMHgyOGY3LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLAorCTB4MjM3MywgMHgwODA0LCAweDI4ZjcsIDB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjM3MywgMHgwODA0LAorCTB4MjhmNywgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyMjNkLCAweDA4MDQsIDB4MjhmNywgMHgwMTA2LAorCTB4MDAwNiwgMHgwODBjLCAweDIyM2QsIDB4MDgwNCwgMHgyOGY3LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLAorCTB4MjM3MywgMHgwODBjLCAweDIyM2QsIDB4MDgwNCwgMHgyOGY3LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLAorCTB4MjM3MywgMHgwODBjLCAweDIyM2QsIDB4MDgwNCwgMHgyOGY3LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLAorCTB4MjI4ZiwgMHgwODA0LCAweDI4ZjcsIDB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjI4ZiwgMHgwODA0LAorCTB4MjhmNywgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyMzczLCAweDA4MGMsIDB4MjI4ZiwgMHgwODA0LAorCTB4MjhmNywgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyMzczLCAweDA4MGMsIDB4MjI4ZiwgMHgwODA0LAorCTB4MjhmNywgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyMjNkLCAweDA4MGMsIDB4MjI4ZiwgMHgwODA0LAorCTB4MjhmNywgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyMjNkLCAweDA4MGMsIDB4MjI4ZiwgMHgwODA0LAorCTB4MjhmNywgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyMzczLCAweDA4MGMsIDB4MjIzZCwgMHgwODBjLAorCTB4MjI4ZiwgMHgwODA0LCAweDI4ZjcsIDB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjM3MywgMHgwODBjLAorCTB4MjIzZCwgMHgwODBjLCAweDIyOGYsIDB4MDgwNCwgMHgyOGY3LCAweGUwMDAsIDB4MGNmMCwgMHgwMTA2LAorCTB4MDAwNiwgMHgwODBjLCAweDI3MmYsIDB4MDRkOCwgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyNzJmLAorCTB4MDgwYywgMHgyMzczLCAweDA0YTAsIDB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjcyZiwgMHgwODBjLAorCTB4MjIzZCwgMHgwNDY4LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDI3MmYsIDB4MDgwYywgMHgyMzczLAorCTB4MDgwYywgMHgyMjNkLCAweDA0MjAsIDB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjcyZiwgMHgwODBjLAorCTB4MjI4ZiwgMHgwMGU4LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDI3MmYsIDB4MDgwYywgMHgyMzczLAorCTB4MDgwYywgMHgyMjhmLCAweDAwYTAsIDB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjcyZiwgMHgwODBjLAorCTB4MjIzZCwgMHgwODBjLCAweDIyOGYsIDB4MDA1OCwgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyNzJmLAorCTB4MDgwYywgMHgyMzczLCAweDA4MGMsIDB4MjIzZCwgMHgwODBjLCAweDIyOGYsIDB4MDAwMCwgMHgwMDBlLAorCTB4MDEwZSwgMHgwMDBkLCAweDAwYzYsIDB4MDAyNiwgMHgwMDQ2LCAweDIwMjEsIDB4MDAwMCwgMHgwODBjLAorCTB4NTAyZCwgMHgxOTA0LCAweDI5ZDQsIDB4NzJkMCwgMHgyMDAxLCAweGFmOWQsIDB4MjAwNCwgMHhhMDA1LAorCTB4MTExMCwgMHhkMjljLCAweDAxNDgsIDB4ZDI4NCwgMHgxMTM4LCAweGQyYmMsIDB4MTkwNCwgMHgyOWQ0LAorCTB4MDgwYywgMHgyOWQ4LCAweDA4MDQsIDB4MjlkNCwgMHgwODBjLCAweDU3NGYsIDB4MTEyMCwgMHg3MDliLAorCTB4ZmZmZiwgMHgwODA0LCAweDI5ZDQsIDB4ZDI5NCwgMHgwMTIwLCAweDcwOWIsIDB4ZmZmZiwgMHgwODA0LAorCTB4MjlkNCwgMHgyMDAxLCAweGFkMTQsIDB4MjAzYywgMHg3Mjg0LCAweGQyODQsIDB4MDkwNCwgMHgyOTc2LAorCTB4ZDI4YywgMHgxOTA0LCAweDI5NzYsIDB4MDAzNiwgMHg3Mzk4LCAweGEzOGUsIDB4ZmZmZiwgMHgxMTEwLAorCTB4MjAxOSwgMHgwMDAxLCAweDgzMTQsIDB4YTJlMCwgMHhiM2MwLCAweDJjMDQsIDB4YTM4YywgMHgwMDAxLAorCTB4MDEyMCwgMHhhMDg0LCAweGZmMDAsIDB4ODAwNywgMHgwMDEwLCAweGEwODQsIDB4MDBmZiwgMHhhNzBlLAorCTB4MDU2MCwgMHhhMDhlLCAweDAwMDAsIDB4MDU0OCwgMHhhMDhlLCAweDAwZmYsIDB4MTE1MCwgMHg3MjMwLAorCTB4ZDI4NCwgMHgxNTM4LCAweDcyODQsIDB4YzI4ZCwgMHg3Mjg2LCAweDcwOWIsIDB4ZmZmZiwgMHgwMDNlLAorCTB4MDQyOCwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHgyNjc2LCAweDA4MGMsIDB4NGM4MCwgMHgxMWI4LAorCTB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDExNTAsIDB4NzAzMCwgMHhkMDhjLAorCTB4MDExOCwgMHg2MDAwLCAweGQwYmMsIDB4MDEyMCwgMHgwODBjLCAweDI5ZWIsIDB4MDE0MCwgMHgwMDI4LAorCTB4MDgwYywgMHgyYjFhLCAweDA4MGMsIDB4MmExOSwgMHgwMTEwLCAweDgzMTgsIDB4MDgxOCwgMHg3MzlhLAorCTB4MDAxMCwgMHg3MDliLCAweGZmZmYsIDB4MDAzZSwgMHgwODA0LCAweDI5ZDQsIDB4YTc4MCwgMHgyYmU2LAorCTB4MjAzZCwgMHhhN2JjLCAweGZmMDAsIDB4ODczZiwgMHgyMDQxLCAweDAwN2UsIDB4NzA5OCwgMHhhMDk2LAorCTB4ZmZmZiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMCwgMHgyOGE4LCAweDAwNTAsIDB4YTgxMiwgMHgwMjIwLAorCTB4MjAwOCwgMHhhODAyLCAweDIwYTgsIDB4MDAyMCwgMHg3MDliLCAweGZmZmYsIDB4MDgwNCwgMHgyOWQ0LAorCTB4MjcwMCwgMHgwMTU2LCAweDAwMTYsIDB4YTEwNiwgMHgwNWEwLCAweGM0ODQsIDB4MDgwYywgMHg0Y2RjLAorCTB4MDEyMCwgMHgwODBjLCAweDRjODAsIDB4MTVhOCwgMHgwMDA4LCAweGM0ODUsIDB4NjAwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MTEzMCwgMHg3MDMwLCAweGQwOGMsIDB4MDFlOCwgMHg2MDAwLAorCTB4ZDBiYywgMHgxMWQwLCAweDcyODQsIDB4ZDI4YywgMHgwMTg4LCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4MiwgMHgwMDA2LCAweDAyYjAsIDB4ZDQ4NCwgMHgxMTE4LCAweDA4MGMsIDB4NGM5ZiwgMHgwMDI4LAorCTB4MDgwYywgMHgyYjljLCAweDAxNzAsIDB4MDgwYywgMHgyYmM5LCAweDAwNTgsIDB4MDgwYywgMHgyYjFhLAorCTB4MDgwYywgMHgyYTE5LCAweDAxNzAsIDB4MDAyOCwgMHgwODBjLCAweDJiOWMsIDB4MDExMCwgMHgwNDE5LAorCTB4MDE0MCwgMHgwMDFlLCAweDgxMDgsIDB4MDE1ZSwgMHgxZjA0LCAweDI5OTAsIDB4NzA5YiwgMHhmZmZmLAorCTB4MDAxOCwgMHgwMDFlLCAweDAxNWUsIDB4NzE5YSwgMHgwMDRlLCAweDAwMmUsIDB4MDBjZSwgMHgwMDA1LAorCTB4MDBjNiwgMHgwMDE2LCAweDcwOWIsIDB4MDAwMCwgMHgyMDA5LCAweDAwN2UsIDB4MDgwYywgMHg0YzgwLAorCTB4MTEzOCwgMHgwODBjLCAweDJiMWEsIDB4MDRhOSwgMHgwMTE4LCAweDcwZDAsIDB4YzBiZCwgMHg3MGQyLAorCTB4MDAxZSwgMHgwMGNlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDc2LCAweDAwZDYsIDB4MDBjNiwgMHgyYzY4LAorCTB4MjAwMSwgMHhhZDU2LCAweDIwMDQsIDB4YTA4NCwgMHgwMGZmLCAweDY4NDIsIDB4MDgwYywgMHg5ODA3LAorCTB4MDFkOCwgMHgyZDAwLCAweDYwMWEsIDB4MDgwYywgMHg5OTU2LCAweDYwMWYsIDB4MDAwMSwgMHgyMDAxLAorCTB4MDAwMCwgMHgwODBjLCAweDRjMWUsIDB4MjAwMSwgMHgwMDAwLCAweDA4MGMsIDB4NGMzMCwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDcwOTQsIDB4ODAwMCwgMHg3MDk2LCAweDAxMmUsIDB4MjAwOSwgMHgwMDA0LAorCTB4MDgwYywgMHg4MGE3LCAweGEwODUsIDB4MDAwMSwgMHgwMGNlLCAweDAwZGUsIDB4MDA3ZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwMDE2LCAweDAwNzYsIDB4MDBkNiwgMHgwMGM2LCAweDJjNjgsIDB4MjAwMSwgMHhhZDU2LAorCTB4MjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4Njg0MiwgMHgwODBjLCAweDk4MDcsIDB4MDU1MCwgMHgyZDAwLAorCTB4NjAxYSwgMHg2ODAwLCAweGMwYzQsIDB4NjgwMiwgMHg2OGEwLCAweGEwODYsIDB4MDA3ZSwgMHgwMTQwLAorCTB4NjgwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDExMTAsIDB4MDgwYywgMHgyYWQ5LAorCTB4MDgwYywgMHg5OTU2LCAweDYwMWYsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHg0YzFlLAorCTB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NGMzMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDk0LAorCTB4ODAwMCwgMHg3MDk2LCAweDAxMmUsIDB4MjAwOSwgMHgwMDAyLCAweDA4MGMsIDB4ODBhNywgMHhhMDg1LAorCTB4MDAwMSwgMHgwMGNlLCAweDAwZGUsIDB4MDA3ZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBjNiwgMHgwMDI2LAorCTB4MjAwOSwgMHgwMDgwLCAweDA4MGMsIDB4NGM4MCwgMHgxMTIwLCAweDAwMzEsIDB4MDExMCwgMHg3MGQ3LAorCTB4ZmZmZiwgMHgwMDJlLCAweDAwY2UsIDB4MDAwNSwgMHgwMDE2LCAweDAwNzYsIDB4MDBkNiwgMHgwMGM2LAorCTB4MmM2OCwgMHgwODBjLCAweDgwMjIsIDB4MDFkOCwgMHgyZDAwLCAweDYwMWEsIDB4MDgwYywgMHg5OTU2LAorCTB4NjAxZiwgMHgwMDAxLCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLCAweDRjMWUsIDB4MjAwMSwgMHgwMDAyLAorCTB4MDgwYywgMHg0YzMwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwZDgsIDB4ODAwMCwgMHg3MGRhLAorCTB4MDEyZSwgMHgyMDA5LCAweDAwMDIsIDB4MDgwYywgMHg4MGE3LCAweGEwODUsIDB4MDAwMSwgMHgwMGNlLAorCTB4MDBkZSwgMHgwMDdlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGM2LCAweDAwZDYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDA5LCAweDAwN2YsIDB4MDgwYywgMHg0YzgwLCAweDExOTAsIDB4MmM2OCwgMHgwODBjLAorCTB4ODAyMiwgMHgwMTcwLCAweDJkMDAsIDB4NjAxYSwgMHg2MzEyLCAweDYwMWYsIDB4MDAwMSwgMHg2MjBhLAorCTB4MDgwYywgMHg5OTU2LCAweDIwMDksIDB4MDAyMiwgMHgwODBjLCAweDgwYTcsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDEyZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGU2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDM2LAorCTB4MDAyNiwgMHgwODBjLCAweDY4ZjMsIDB4MDgwYywgMHg2ODlkLCAweDA4MGMsIDB4OGExNSwgMHgyMTMwLAorCTB4ODFmZiwgMHgwMTI4LCAweDIwYTksIDB4MDA3ZSwgMHgyMDA5LCAweDAwMDAsIDB4MDAyMCwgMHgyMGE5LAorCTB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsIDB4MDAxNiwgMHgwODBjLCAweDRjZGMsIDB4MTEyMCwgMHgwODBjLAorCTB4NGVjZiwgMHgwODBjLCAweDQ5M2EsIDB4MDAxZSwgMHg4MTA4LCAweDFmMDQsIDB4MmFjMywgMHg4NmZmLAorCTB4MTExMCwgMHgwODBjLCAweDExZDQsIDB4MDAyZSwgMHgwMDNlLCAweDAwNmUsIDB4MDBjZSwgMHgwMGVlLAorCTB4MDAwNSwgMHgwMGU2LCAweDAwYzYsIDB4MDAzNiwgMHgwMDI2LCAweDAwMTYsIDB4NjIxOCwgMHgyMjcwLAorCTB4NzJhMCwgMHgwMDI2LCAweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweDY4ZTcsIDB4MDA3NiwgMHgyMDM5LAorCTB4MDAwMCwgMHgwODBjLCAweDY4MWQsIDB4MmMwOCwgMHgwODBjLCAweGE3MTIsIDB4MDA3ZSwgMHgwMDFlLAorCTB4MmU2MCwgMHgwODBjLCAweDRlY2YsIDB4NjIxMCwgMHg2MzE0LCAweDA4MGMsIDB4NDkzYSwgMHg2MjEyLAorCTB4NjMxNiwgMHgwMDFlLCAweDAwMmUsIDB4MDAzZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MDAwNiwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEwODYsIDB4MDA4MCwgMHgwMTUwLAorCTB4MjA3MSwgMHhhZDAwLCAweDcwOTQsIDB4YTAwNSwgMHgwMTEwLCAweDgwMDEsIDB4NzA5NiwgMHgwMDBlLAorCTB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4YWQwMCwgMHg3MGQ4LCAweGEwMDUsIDB4MGRjMCwgMHg4MDAxLAorCTB4NzBkYSwgMHgwY2E4LCAweDYwMDAsIDB4YzA4YywgMHg2MDAyLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDBjNiwgMHgwMDM2LCAweDAwMjYsIDB4MDAxNiwgMHgwMTU2LCAweDIxNzgsIDB4ODFmZiwgMHgxMTE4LAorCTB4MjBhOSwgMHgwMDAxLCAweDAwOTgsIDB4MjAwMSwgMHhhZDUyLCAweDIwMDQsIDB4ZDBjNCwgMHgwMTUwLAorCTB4ZDBhNCwgMHgwMTQwLCAweGEwMDYsIDB4MDA0NiwgMHgyMDIwLCAweDIwMDksIDB4MDAyZCwgMHgwODBjLAorCTB4YTk2YywgMHgwMDRlLCAweDIwYTksIDB4MDBmZiwgMHgyMDExLCAweDAwMDAsIDB4MDAyNiwgMHhhMjhlLAorCTB4MDA3ZSwgMHgwNWM4LCAweGEyOGUsIDB4MDA3ZiwgMHgwNWIwLCAweGEyOGUsIDB4MDA4MCwgMHgwNTk4LAorCTB4YTI4OCwgMHhhZTM0LCAweDIxMGMsIDB4ODFmZiwgMHgwNTcwLCAweDhmZmYsIDB4MDVjMSwgMHgwMGM2LAorCTB4MjE2MCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHg1MDM3LCAweDAwY2UsIDB4MjAxOSwgMHgwMDI5LAorCTB4MDgwYywgMHg2OGU3LCAweDAwNzYsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsIDB4NjgxZCwgMHgwMGM2LAorCTB4MDAyNiwgMHgyMTYwLCAweDYyMDQsIDB4YTI5NCwgMHgwMGZmLCAweGEyODYsIDB4MDAwNiwgMHgxMTE4LAorCTB4NjAwNywgMHgwNDA0LCAweDAwMjgsIDB4MjAwMSwgMHgwMDA0LCAweDgwMDcsIDB4YTIxNSwgMHg2MjA2LAorCTB4MDAyZSwgMHgwMGNlLCAweDAwMTYsIDB4MmMwOCwgMHgwODBjLCAweGE3MTIsIDB4MDAxZSwgMHgwMDdlLAorCTB4MjE2MCwgMHgwODBjLCAweDRlY2YsIDB4MDAyZSwgMHg4MjEwLCAweDFmMDQsIDB4MmIzZSwgMHgwMTVlLAorCTB4MDAxZSwgMHgwMDJlLCAweDAwM2UsIDB4MDBjZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwMDQ2LAorCTB4MDAyNiwgMHgwMDE2LCAweDIwMDEsIDB4YWQ1MiwgMHgyMDA0LCAweGQwYzQsIDB4MDE0OCwgMHhkMGE0LAorCTB4MDEzOCwgMHhhMDA2LCAweDIyMjAsIDB4ODQyNywgMHgyMDA5LCAweDAwMjksIDB4MDgwYywgMHhhOTZjLAorCTB4MDAxZSwgMHgwMDJlLCAweDAwNGUsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMGM2LAorCTB4NzI4NCwgMHg4MmZmLCAweDAxZjgsIDB4MjAxMSwgMHhhZDUyLCAweDIyMTQsIDB4ZDJhYywgMHgxMWQwLAorCTB4MjEwMCwgMHgwODBjLCAweDI2OGEsIDB4ODFmZiwgMHgwMWI4LCAweDIwMTksIDB4MDAwMSwgMHg4MzE0LAorCTB4YTJlMCwgMHhiM2MwLCAweDJjMDQsIDB4ZDM4NCwgMHgwMTIwLCAweGEwODQsIDB4ZmYwMCwgMHg4MDA3LAorCTB4MDAxMCwgMHhhMDg0LCAweDAwZmYsIDB4YTExNiwgMHgwMTM4LCAweGEwOTYsIDB4MDBmZiwgMHgwMTEwLAorCTB4ODMxOCwgMHgwYzY4LCAweGEwODUsIDB4MDAwMSwgMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwMDE2LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YTE4MCwgMHhhZTM0LAorCTB4MjAwNCwgMHhhMDY1LCAweDAxNzgsIDB4MDAxNiwgMHgwMGM2LCAweDA4MGMsIDB4OTgwNywgMHgwMDFlLAorCTB4MDkwYywgMHgxNGY2LCAweDYxMWEsIDB4MDgwYywgMHgyYWQ5LCAweDA4MGMsIDB4ODA3OCwgMHgwMDFlLAorCTB4MDgwYywgMHg0YzlmLCAweDAxMmUsIDB4MDBjZSwgMHgwMDFlLCAweDAwMDUsIDB4N2VlZiwgMHg3ZGU4LAorCTB4N2NlNCwgMHg4MGUyLCAweDdiZTEsIDB4ODBlMCwgMHg4MGRjLCAweDgwZGEsIDB4N2FkOSwgMHg4MGQ2LAorCTB4ODBkNSwgMHg4MGQ0LCAweDgwZDMsIDB4ODBkMiwgMHg4MGQxLCAweDc5Y2UsIDB4NzhjZCwgMHg4MGNjLAorCTB4ODBjYiwgMHg4MGNhLCAweDgwYzksIDB4ODBjNywgMHg4MGM2LCAweDc3YzUsIDB4NzZjMywgMHg4MGJjLAorCTB4ODBiYSwgMHg3NWI5LCAweDgwYjYsIDB4NzRiNSwgMHg3M2I0LCAweDcyYjMsIDB4ODBiMiwgMHg4MGIxLAorCTB4ODBhZSwgMHg3MWFkLCAweDgwYWMsIDB4NzBhYiwgMHg2ZmFhLCAweDZlYTksIDB4ODBhNywgMHg2ZGE2LAorCTB4NmNhNSwgMHg2YmEzLCAweDZhOWYsIDB4Njk5ZSwgMHg2ODlkLCAweDgwOWIsIDB4ODA5OCwgMHg2Nzk3LAorCTB4NjY5MCwgMHg2NThmLCAweDY0ODgsIDB4NjM4NCwgMHg2MjgyLCAweDgwODEsIDB4ODA4MCwgMHg2MTdjLAorCTB4NjA3YSwgMHg4MDc5LCAweDVmNzYsIDB4ODA3NSwgMHg4MDc0LCAweDgwNzMsIDB4ODA3MiwgMHg4MDcxLAorCTB4ODA2ZSwgMHg1ZTZkLCAweDgwNmMsIDB4NWQ2YiwgMHg1YzZhLCAweDViNjksIDB4ODA2NywgMHg1YTY2LAorCTB4NTk2NSwgMHg1ODYzLCAweDU3NWMsIDB4NTY1YSwgMHg1NTU5LCAweDgwNTYsIDB4ODA1NSwgMHg1NDU0LAorCTB4NTM1MywgMHg1MjUyLCAweDUxNTEsIDB4NTA0ZSwgMHg0ZjRkLCAweDgwNGMsIDB4ODA0YiwgMHg0ZTRhLAorCTB4NGQ0OSwgMHg4MDQ3LCAweDRjNDYsIDB4ODA0NSwgMHg4MDQzLCAweDgwM2MsIDB4ODAzYSwgMHg4MDM5LAorCTB4ODAzNiwgMHg0YjM1LCAweDgwMzQsIDB4NGEzMywgMHg0OTMyLCAweDQ4MzEsIDB4ODAyZSwgMHg0NzJkLAorCTB4NDYyYywgMHg0NTJiLCAweDQ0MmEsIDB4NDMyOSwgMHg0MjI3LCAweDgwMjYsIDB4ODAyNSwgMHg0MTIzLAorCTB4NDAxZiwgMHgzZjFlLCAweDNlMWQsIDB4M2QxYiwgMHgzYzE4LCAweDgwMTcsIDB4ODAxMCwgMHgzYjBmLAorCTB4M2EwOCwgMHg4MDA0LCAweDM5MDIsIDB4ODAwMSwgMHg4MDAwLCAweDgwMDAsIDB4MzgwMCwgMHgzNzAwLAorCTB4MzYwMCwgMHg4MDAwLCAweDM1MDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MzQwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDMzMDAsIDB4MzIwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDMxMDAsIDB4MzAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHgyZjAwLCAweDgwMDAsIDB4MmUwMCwgMHgyZDAwLCAweDJjMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHgyYjAwLCAweDgwMDAsIDB4MmEwMCwgMHgyOTAwLCAweDI4MDAsIDB4ODAwMCwgMHgyNzAwLAorCTB4MjYwMCwgMHgyNTAwLCAweDI0MDAsIDB4MjMwMCwgMHgyMjAwLCAweDgwMDAsIDB4ODAwMCwgMHgyMTAwLAorCTB4MjAwMCwgMHgxZjAwLCAweDFlMDAsIDB4MWQwMCwgMHgxYzAwLCAweDgwMDAsIDB4ODAwMCwgMHgxYjAwLAorCTB4MWEwMCwgMHg4MDAwLCAweDE5MDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHgxODAwLCAweDgwMDAsIDB4MTcwMCwgMHgxNjAwLCAweDE1MDAsIDB4ODAwMCwgMHgxNDAwLAorCTB4MTMwMCwgMHgxMjAwLCAweDExMDAsIDB4MTAwMCwgMHgwZjAwLCAweDgwMDAsIDB4ODAwMCwgMHgwZTAwLAorCTB4MGQwMCwgMHgwYzAwLCAweDBiMDAsIDB4MGEwMCwgMHgwOTAwLCAweDgwMDAsIDB4ODAwMCwgMHgwODAwLAorCTB4MDcwMCwgMHg4MDAwLCAweDA2MDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MDUwMCwgMHgwNDAwLAorCTB4MDMwMCwgMHg4MDAwLCAweDAyMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MDEwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDAwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MjA3MSwgMHhhZDgxLAorCTB4NzAwMywgMHgwMDAyLCAweGEwMDYsIDB4NzAxMiwgMHg3MDE2LCAweDcwM2EsIDB4NzAzZSwgMHg3MDMzLAorCTB4YWQ5MSwgMHg3MDM3LCAweGFkOTEsIDB4NzAwNywgMHgwMDAxLCAweDIwNjEsIDB4YWRkMSwgMHg2MDAzLAorCTB4MDAwMiwgMHgwMDA1LCAweDEwMDQsIDB4MmQwYywgMHgwZTA0LCAweDJkMGMsIDB4MjA3MSwgMHhhZDgxLAorCTB4MmI3OCwgMHg3ODE4LCAweGQwODQsIDB4MTE0MCwgMHgyYTYwLCAweDc4MjAsIDB4YTA4ZSwgMHgwMDY5LAorCTB4MTkwNCwgMHgyZGYxLCAweDA4MDQsIDB4MmQ4YSwgMHgwMDA1LCAweDIwNzEsIDB4YWQ4MSwgMHg3MDA0LAorCTB4MDAwMiwgMHgyZDE1LCAweDJkMTYsIDB4MmQxZiwgMHgyZDMwLCAweDAwMDUsIDB4MTAwNCwgMHgyZDFlLAorCTB4MGUwNCwgMHgyZDFlLCAweDJiNzgsIDB4NzgxOCwgMHhkMDg0LCAweDAxZTgsIDB4MDAwNSwgMHgyYjc4LAorCTB4MjA2MSwgMHhhZGQxLCAweDYwMDgsIDB4YTA4ZSwgMHgwMTAwLCAweDAxMjgsIDB4YTA4NiwgMHgwMjAwLAorCTB4MDkwNCwgMHgyZGViLCAweDAwMDUsIDB4NzAxNCwgMHgyMDY4LCAweDJhNjAsIDB4NzAxOCwgMHgwODA3LAorCTB4NzAxMCwgMHgyMDY4LCAweDY4MzQsIDB4YTA4NiwgMHgwMTAzLCAweDAxMDgsIDB4MDAwNSwgMHgyYTYwLAorCTB4MmI3OCwgMHg3MDE4LCAweDA4MDcsIDB4MmE2MCwgMHg3ODIwLCAweGEwOGEsIDB4MDA0MCwgMHgxMjEwLAorCTB4NjFjMCwgMHgwMDQyLCAweDIxMDAsIDB4YTA4YSwgMHgwMDNmLCAweDFhMDQsIDB4MmRlOCwgMHg2MWMwLAorCTB4MDgwNCwgMHgyZDhhLCAweDJkY2MsIDB4MmRmNywgMHgyZGZmLCAweDJlMDMsIDB4MmUwYiwgMHgyZTExLAorCTB4MmUxNSwgMHgyZTIxLCAweDJlMjQsIDB4MmUyZSwgMHgyZTMxLCAweDJkZTgsIDB4MmRlOCwgMHgyZGU4LAorCTB4MmUzNCwgMHgyZGU4LCAweDJlNDMsIDB4MmU1YSwgMHgyZTcxLCAweDJlZTgsIDB4MmVlZCwgMHgyZjE2LAorCTB4MmY2NywgMHgyZjc4LCAweDJmOTYsIDB4MmZjZCwgMHgyZmQ3LCAweDJmZTQsIDB4MmZmNywgMHgzMDE4LAorCTB4MzAyMSwgMHgzMDU3LCAweDMwNWQsIDB4MmRlOCwgMHgzMDg2LCAweDJkZTgsIDB4MmRlOCwgMHgyZGU4LAorCTB4MmRlOCwgMHgyZGU4LCAweDMwOGQsIDB4MzA5NywgMHgyZGU4LCAweDJkZTgsIDB4MmRlOCwgMHgyZGU4LAorCTB4MmRlOCwgMHgyZGU4LCAweDJkZTgsIDB4MmRlOCwgMHgzMDlmLCAweDJkZTgsIDB4MmRlOCwgMHgyZGU4LAorCTB4MmRlOCwgMHgyZGU4LCAweDMwYjEsIDB4MzBiOSwgMHgyZGU4LCAweDJkZTgsIDB4MmRlOCwgMHgyZGU4LAorCTB4MmRlOCwgMHgyZGU4LCAweDAwMDIsIDB4MzBjYiwgMHgzMTFmLCAweDMxN2EsIDB4MzE4YSwgMHgyZGU4LAorCTB4MzFhNCwgMHgzNWNiLCAweDNmYmIsIDB4MmRlOCwgMHgyZGU4LCAweDJkZTgsIDB4MmRlOCwgMHgyZGU4LAorCTB4MmRlOCwgMHgyZGU4LCAweDJkZTgsIDB4MmUyZSwgMHgyZTMxLCAweDM1Y2QsIDB4MmRlOCwgMHgzNWRhLAorCTB4NDAzYywgMHg0MDk3LCAweDQwZmIsIDB4MmRlOCwgMHg0MTVhLCAweDQxODAsIDB4NDE5ZiwgMHgyZGU4LAorCTB4MmRlOCwgMHgyZGU4LCAweDJkZTgsIDB4MzVkZSwgMHgzNzZiLCAweDM3ODUsIDB4MzdhMywgMHgzODA0LAorCTB4Mzg1OCwgMHgzODYzLCAweDM4OWEsIDB4MzhhOSwgMHgzOGI4LCAweDM4YmIsIDB4MzhkZSwgMHgzOTI4LAorCTB4Mzk4ZSwgMHgzOTliLCAweDNhOWMsIDB4M2JiMywgMHgzYmRjLCAweDNjZGEsIDB4M2NmYywgMHgzZDA4LAorCTB4M2Q0MSwgMHgzZTA1LCAweDJkZTgsIDB4MmRlOCwgMHgyZGU4LCAweDJkZTgsIDB4M2U2ZCwgMHgzZTg4LAorCTB4M2VmYSwgMHgzZmFjLCAweDcxM2MsIDB4MDAwMCwgMHgyMDIxLCAweDQwMDAsIDB4MDgwYywgMHgzYzM5LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MGUwNCwgMHgyZGQ4LCAweDc4MTgsIDB4ZDA4NCwgMHgwMTEwLAorCTB4MDEyZSwgMHgwY2IwLCAweDdjMjIsIDB4NzkyNiwgMHg3YTJhLCAweDdiMmUsIDB4NzgxYiwgMHgwMDAxLAorCTB4MjA5MSwgMHg0MDgwLCAweDcwMDcsIDB4MDAwMSwgMHgyMDkxLCAweDUwMDAsIDB4MDEyZSwgMHgwMDA1LAorCTB4MjAyMSwgMHg0MDAxLCAweDBjMTgsIDB4MjAyMSwgMHg0MDAyLCAweDBjMDAsIDB4MjAyMSwgMHg0MDAzLAorCTB4MDhlOCwgMHgyMDIxLCAweDQwMDUsIDB4MDhkMCwgMHgyMDIxLCAweDQwMDYsIDB4MDhiOCwgMHhhMDJlLAorCTB4MjUyMCwgMHg3YjI4LCAweDdhMmMsIDB4NzgyNCwgMHg3OTMwLCAweDA4MDQsIDB4M2M0NiwgMHg3ODIzLAorCTB4MDAwNCwgMHg3ODI0LCAweDA4MDcsIDB4YTAyZSwgMHgyNTIwLCAweDdiMjgsIDB4N2EyYywgMHg3ODI0LAorCTB4NzkzMCwgMHgwODA0LCAweDNjNDksIDB4NzkyNCwgMHg3ODI4LCAweDIxMTQsIDB4MjAwYSwgMHgwODA0LAorCTB4MmRjYywgMHg3OTI0LCAweDIxMTQsIDB4MDgwNCwgMHgyZGNjLCAweDIwOTksIDB4MDAwOSwgMHgyMGExLAorCTB4MDAwOSwgMHgyMGE5LCAweDAwMDcsIDB4NTNhMywgMHg3OTI0LCAweDdhMjgsIDB4N2IyYywgMHgwODA0LAorCTB4MmRjYywgMHg3ODI0LCAweDIwNjAsIDB4MDA5MCwgMHgyMDA5LCAweDAwMDIsIDB4MjAxMSwgMHgwMDAxLAorCTB4MjAxOSwgMHgwMDFiLCAweDc4M2IsIDB4MDAxNywgMHgwODA0LCAweDJkY2MsIDB4N2QzOCwgMHg3YzNjLAorCTB4MDg0MCwgMHg3ZDM4LCAweDdjM2MsIDB4MDg4OCwgMHgyMDYxLCAweDEwMDAsIDB4ZTEwYywgMHhhMDA2LAorCTB4MmMxNSwgMHhhMjAwLCAweDhjNjAsIDB4ODEwOSwgMHgxZGQ4LCAweDIwMTAsIDB4YTAwNSwgMHgwOTA0LAorCTB4MmRjYywgMHgwODA0LCAweDJkZWUsIDB4MjA2OSwgMHhhZDUxLCAweDc4MjQsIDB4NzkzMCwgMHhhMTFhLAorCTB4MWEwNCwgMHgyZGY0LCAweDgwMTksIDB4MDkwNCwgMHgyZGY0LCAweDY4NGEsIDB4Njk0MiwgMHg3ODJjLAorCTB4Njg1MiwgMHg3ODI4LCAweDY4NTYsIDB4YTAwNiwgMHg2ODVhLCAweDY4NWUsIDB4MDgwYywgMHg1YTFjLAorCTB4MDgwNCwgMHgyZGNjLCAweDIwNjksIDB4YWQ1MSwgMHg3ODI0LCAweDc5MzQsIDB4YTExYSwgMHgxYTA0LAorCTB4MmRmNCwgMHg4MDE5LCAweDA5MDQsIDB4MmRmNCwgMHg2ODRlLCAweDY5NDYsIDB4NzgyYywgMHg2ODYyLAorCTB4NzgyOCwgMHg2ODY2LCAweGEwMDYsIDB4Njg2YSwgMHg2ODZlLCAweDA4MGMsIDB4NTBkOSwgMHgwODA0LAorCTB4MmRjYywgMHhhMDJlLCAweDI1MjAsIDB4ODFmZiwgMHgxOTA0LCAweDJkZjEsIDB4NzkyNCwgMHg3YjI4LAorCTB4N2EyYywgMHgyMGE5LCAweDAwMDUsIDB4MjBhMSwgMHhhZDg4LCAweDQxYTEsIDB4MDgwYywgMHgzYzA1LAorCTB4MDkwNCwgMHgyZGYxLCAweDIwMDksIDB4MDAyMCwgMHgwODBjLCAweDNjNDYsIDB4NzAxYiwgMHgyZTg5LAorCTB4MDAwNSwgMHg2ODM0LCAweDIwMDgsIDB4YTA4NCwgMHgwMGZmLCAweGEwOTYsIDB4MDAxMSwgMHgwMTIwLAorCTB4YTA5NiwgMHgwMDE5LCAweDE5MDQsIDB4MmRmMSwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHgwOTA0LAorCTB4MmRmMSwgMHg3MTBlLCAweDcwMGMsIDB4ODAwMSwgMHgwNTI4LCAweDcwMGUsIDB4MDgwYywgMHgzYzA1LAorCTB4MDkwNCwgMHgyZGYxLCAweDIwMDksIDB4MDAyMCwgMHgyMDYxLCAweGFkZDEsIDB4NjIyNCwgMHg2MzI4LAorCTB4NjQyYywgMHg2NTMwLCAweGEyOTAsIDB4MDA0MCwgMHhhMzk5LCAweDAwMDAsIDB4YTRhMSwgMHgwMDAwLAorCTB4YTVhOSwgMHgwMDAwLCAweDA4MGMsIDB4M2M0NiwgMHg3MDFiLCAweDJlYjcsIDB4MDAwNSwgMHg2ODM0LAorCTB4YTA4NCwgMHgwMGZmLCAweGEwOTYsIDB4MDAwMiwgMHgwMTIwLCAweGEwOTYsIDB4MDAwYSwgMHgxOTA0LAorCTB4MmRmMSwgMHgwOGMwLCAweDcwMTAsIDB4MjA2OCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHgwODBjLAorCTB4NGI3YywgMHgxMTI4LCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDJlZDEsIDB4MDAwNSwgMHgwODBjLAorCTB4NTFkZiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMGE5LCAweDAwMDUsIDB4MjA5OSwgMHhhZDg4LAorCTB4NTMwYSwgMHgyMTAwLCAweGEyMTAsIDB4YTM5OSwgMHgwMDAwLCAweGE0YTEsIDB4MDAwMCwgMHhhNWE5LAorCTB4MDAwMCwgMHhhZDgwLCAweDAwMGQsIDB4MjAwOSwgMHgwMDIwLCAweDAxMmUsIDB4MDgwNCwgMHgzYzQ5LAorCTB4NjFhOCwgMHg3ODI0LCAweDYwYWEsIDB4MDgwNCwgMHgyZGNjLCAweDIwOTEsIDB4ODAwMCwgMHg3ODIzLAorCTB4NDAwMCwgMHg3ODI3LCAweDQ5NTMsIDB4NzgyYiwgMHg1MDIwLCAweDc4MmYsIDB4MjAyMCwgMHgyMDA5LAorCTB4MDE3ZiwgMHgyMTA0LCAweDc4MzIsIDB4M2YwMCwgMHg3ODM2LCAweDIwNjEsIDB4MDEwMCwgMHg2MjAwLAorCTB4MjA2MSwgMHgwMjAwLCAweDYwM2MsIDB4ODAwNywgMHhhMjA1LCAweDc4M2EsIDB4MjAwOSwgMHgwNGZkLAorCTB4MjEwNCwgMHg3ODNlLCAweDc4MWIsIDB4MDAwMSwgMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwgMHg0MDgwLAorCTB4MjA3MSwgMHgwMDEwLCAweDIwYzEsIDB4MDBmMCwgMHgwODA0LCAweDA0MjcsIDB4ODFmZiwgMHgxOTA0LAorCTB4MmRmMSwgMHg3OTI0LCAweDgxMGYsIDB4YTE4YywgMHgwMGZmLCAweDA4MGMsIDB4NGNkYywgMHgxOTA0LAorCTB4MmRmNCwgMHg3ZTM4LCAweGE2ODQsIDB4M2ZmZiwgMHhhMDgyLCAweDQwMDAsIDB4MDIxMCwgMHgwODA0LAorCTB4MmRmNCwgMHg3YzI4LCAweDdkMmMsIDB4MDgwYywgMHg0ZTk2LCAweGQyOGMsIDB4MTExOCwgMHgwODBjLAorCTB4NGU0MSwgMHgwMDEwLCAweDA4MGMsIDB4NGU2ZiwgMHgxNTE4LCAweDIwNjEsIDB4YjQwMCwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAwLCAweDAxNDgsIDB4NjAxMCwgMHhhMDZkLAorCTB4MDEzMCwgMHg2ODNjLCAweGE0MDYsIDB4MTExOCwgMHg2ODQwLCAweGE1MDYsIDB4MDE1MCwgMHgwMTJlLAorCTB4YWNlMCwgMHgwMDE4LCAweDIwMDEsIDB4YWQxNiwgMHgyMDA0LCAweGFjMDIsIDB4MWEwNCwgMHgyZGYxLAorCTB4MGMzMCwgMHgwODBjLCAweDkyOWMsIDB4MDEyZSwgMHgwOTA0LCAweDJkZjEsIDB4MDgwNCwgMHgyZGNjLAorCTB4YTAwZSwgMHgyMDAxLCAweDAwMDUsIDB4MDgwYywgMHg1MWRmLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg5ODAzLCAweDA4MGMsIDB4NTEwYywgMHgwMTJlLCAweDA4MDQsIDB4MmRjYywgMHg4MWZmLAorCTB4MTkwNCwgMHgyZGYxLCAweDA4MGMsIDB4M2MxYSwgMHgwOTA0LCAweDJkZjQsIDB4MDgwYywgMHg0ZDk2LAorCTB4MDkwNCwgMHgyZGYxLCAweDA4MGMsIDB4NGVhMiwgMHgwOTA0LCAweDJkZjEsIDB4MDgwNCwgMHgyZGNjLAorCTB4ODFmZiwgMHgxOTA0LCAweDJkZjEsIDB4MDgwYywgMHgzYzJhLCAweDA5MDQsIDB4MmRmNCwgMHgwODBjLAorCTB4NGYwZCwgMHgwOTA0LCAweDJkZjEsIDB4MjAxOSwgMHgwMDA1LCAweDA4MGMsIDB4NGViZCwgMHgwOTA0LAorCTB4MmRmMSwgMHg3ODI4LCAweGEwOGEsIDB4MTAwMCwgMHgxYTA0LCAweDJkZjQsIDB4ODAwMywgMHg4MDBiLAorCTB4ODEwYiwgMHhhMTA4LCAweDA4MGMsIDB4NjUxOSwgMHgwODA0LCAweDJkY2MsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg4MWZmLCAweDAxMTgsIDB4MjAwOSwgMHgwMDAxLCAweDA0NDgsIDB4MjAyOSwgMHgwMGZmLAorCTB4NjQ0YywgMHgyNDAwLCAweGE1MDYsIDB4MDFmMCwgMHgyNTA4LCAweDA4MGMsIDB4NGNkYywgMHgxMWQwLAorCTB4MDgwYywgMHg0ZjBkLCAweDExMjgsIDB4MjAwOSwgMHgwMDAyLCAweDYyYjAsIDB4MjUxOCwgMHgwMGI4LAorCTB4MjAxOSwgMHgwMDA0LCAweDA4MGMsIDB4NGViZCwgMHgxMTE4LCAweDIwMDksIDB4MDAwNiwgMHgwMDc4LAorCTB4NzgyNCwgMHhhMDhhLCAweDEwMDAsIDB4MTI3MCwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHhhMTA4LAorCTB4MDgwYywgMHg2NTE5LCAweDg1MjksIDB4MWFlOCwgMHgwMTJlLCAweDA4MDQsIDB4MmRjYywgMHgwMTJlLAorCTB4MDgwNCwgMHgyZGYxLCAweDAxMmUsIDB4MDgwNCwgMHgyZGY0LCAweDA4MGMsIDB4M2MxYSwgMHgwOTA0LAorCTB4MmRmNCwgMHgwODBjLCAweDRkZmMsIDB4MDgwYywgMHg0ZTk2LCAweDA4MDQsIDB4MmRjYywgMHg4MWZmLAorCTB4MTkwNCwgMHgyZGYxLCAweDA4MGMsIDB4M2MxYSwgMHgwOTA0LCAweDJkZjQsIDB4MDgwYywgMHg0ZGVkLAorCTB4MDgwYywgMHg0ZTk2LCAweDA4MDQsIDB4MmRjYywgMHg4MWZmLCAweDE5MDQsIDB4MmRmMSwgMHgwODBjLAorCTB4M2MxYSwgMHgwOTA0LCAweDJkZjQsIDB4MDgwYywgMHg0ZTcxLCAweDA5MDQsIDB4MmRmMSwgMHgwODBjLAorCTB4NGJjMCwgMHgwODBjLCAweDRlM2EsIDB4MDgwYywgMHg0ZTk2LCAweDA4MDQsIDB4MmRjYywgMHgwODBjLAorCTB4M2MxYSwgMHgwOTA0LCAweDJkZjQsIDB4MDgwYywgMHg0ZDk2LCAweDA5MDQsIDB4MmRmMSwgMHg2MmEwLAorCTB4MjAxOSwgMHgwMDA1LCAweDAwYzYsIDB4MDgwYywgMHg0ZWNmLCAweDIwNjEsIDB4MDAwMCwgMHgwODBjLAorCTB4NjhlNywgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweDY4MWQsIDB4MjAwOSwgMHgwMDAwLAorCTB4MDgwYywgMHhhNzEyLCAweDAwN2UsIDB4MDBjZSwgMHgwODBjLCAweDRlOTYsIDB4MDgwNCwgMHgyZGNjLAorCTB4MDgwYywgMHgzYzFhLCAweDA5MDQsIDB4MmRmNCwgMHgwODBjLCAweDRlOTYsIDB4MjIwOCwgMHgwODA0LAorCTB4MmRjYywgMHgwMTU2LCAweDAwZDYsIDB4MDBlNiwgMHgyMDY5LCAweGFlMTMsIDB4NjgxMCwgMHg2OTE0LAorCTB4YTEwYSwgMHgxMjEwLCAweDIwMDksIDB4MDAwMCwgMHg2ODE2LCAweDIwMTEsIDB4MDAwMCwgMHgyMDE5LAorCTB4MDAwMCwgMHgyMGE5LCAweDAwN2UsIDB4MjA2OSwgMHhhZTM0LCAweDJkMDQsIDB4YTA3NSwgMHgwMTMwLAorCTB4NzA0YywgMHgwMDcxLCAweGEyMTAsIDB4NzA4MCwgMHgwMDU5LCAweGEzMTgsIDB4OGQ2OCwgMHgxZjA0LAorCTB4MzAzNSwgMHgyMzAwLCAweGEyMTgsIDB4MDBlZSwgMHgwMGRlLCAweDAxNWUsIDB4MDgwNCwgMHgyZGNjLAorCTB4MDBmNiwgMHgwMDE2LCAweGEwN2QsIDB4MDE0MCwgMHgyMDAxLCAweDAwMDAsIDB4ODAwMCwgMHgyZjBjLAorCTB4ODFmZiwgMHgwMTEwLCAweDIxNzgsIDB4MGNkMCwgMHgwMDFlLCAweDAwZmUsIDB4MDAwNSwgMHgyMDY5LAorCTB4YWUxMywgMHg2OTEwLCAweDYyYWMsIDB4MDgwNCwgMHgyZGNjLCAweDgxZmYsIDB4MTkwNCwgMHgyZGYxLAorCTB4NjE0YywgMHhhMTkwLCAweDJiZTYsIDB4MjIxNSwgMHhhMjk0LCAweDAwZmYsIDB4NjM2YywgMHg4M2ZmLAorCTB4MDEwOCwgMHg2MjcwLCAweDY3ZDAsIDB4ZDc5YywgMHgwMTE4LCAweDIwMzEsIDB4MDAwMSwgMHgwMDkwLAorCTB4ZDdhYywgMHgwMTE4LCAweDIwMzEsIDB4MDAwMywgMHgwMDY4LCAweGQ3YTQsIDB4MDExOCwgMHgyMDMxLAorCTB4MDAwMiwgMHgwMDQwLCAweDA4MGMsIDB4NTc0ZiwgMHgxMTE4LCAweDIwMzEsIDB4MDAwNCwgMHgwMDEwLAorCTB4MjAzMSwgMHgwMDAwLCAweDdlM2EsIDB4N2YzZSwgMHgwODA0LCAweDJkY2MsIDB4NjEzYywgMHg2MjQwLAorCTB4MjAxOSwgMHhhZmEzLCAweDIzMWMsIDB4MDgwNCwgMHgyZGNjLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjEzNCwgMHhhMDA2LCAweDIwMTAsIDB4MjAxOCwgMHgwMTJlLCAweDA4MDQsIDB4MmRjYywgMHgwODBjLAorCTB4M2MyYSwgMHgwOTA0LCAweDJkZjQsIDB4NjI0NCwgMHg2MzM4LCAweDA4MDQsIDB4MmRjYywgMHg2MTNjLAorCTB4NjI0MCwgMHg3ODI0LCAweDYwM2UsIDB4N2IyOCwgMHg2MzQyLCAweDIwNjksIDB4YWQ1MSwgMHg4MzFmLAorCTB4YTMwNSwgMHg2ODE2LCAweDc4MmMsIDB4MjA2OSwgMHhhZmEzLCAweDJkMWMsIDB4MjA2YSwgMHgwODA0LAorCTB4MmRjYywgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3ODI0LCAweDYwMzYsIDB4MDEyZSwgMHgwODA0LAorCTB4MmRjYywgMHgwODBjLCAweDNjMmEsIDB4MDkwNCwgMHgyZGY0LCAweDc4MjgsIDB4YTAwZCwgMHgwOTA0LAorCTB4MmRmNCwgMHg3ODJjLCAweGEwMDUsIDB4MDkwNCwgMHgyZGY0LCAweDYyNDQsIDB4NjE0NiwgMHg2MzM4LAorCTB4NjAzYSwgMHgwODA0LCAweDJkY2MsIDB4MjAwMSwgMHhhZDAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLAorCTB4MTkwNCwgMHgyZGYxLCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDc5MjQsIDB4ODEwZiwgMHhhMThjLAorCTB4MDBmZiwgMHhhMTk2LCAweDAwZmYsIDB4MTEzMCwgMHgyMDAxLCAweGFkMTQsIDB4MjAwNCwgMHhhMDg1LAorCTB4ZmYwMCwgMHgwMDc4LCAweGExODIsIDB4MDA3ZiwgMHgxNmEwLCAweGExODgsIDB4MmJlNiwgMHgyMTBkLAorCTB4YTE4YywgMHgwMGZmLCAweDIwMDEsIDB4YWQxNCwgMHgyMDA0LCAweGExMTYsIDB4MDU1MCwgMHg4MTBmLAorCTB4YTEwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDA2LCAweDA4MGMsIDB4ODAyMiwgMHgwMDBlLAorCTB4MDFlMCwgMHg2MDFhLCAweDYwMGIsIDB4YmMwOSwgMHg2MDFmLCAweDAwMDEsIDB4MDgwYywgMHgzYzA1LAorCTB4MDFkOCwgMHg2ODM3LCAweDAwMDAsIDB4NzAwNywgMHgwMDAzLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LAorCTB4YzBmZCwgMHg2ODNhLCAweDcwMWIsIDB4MzE3MywgMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDMyLAorCTB4MDgwYywgMHg4MGE3LCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweDAxMmUsIDB4MDBjZSwgMHgwODA0LAorCTB4MmRmMSwgMHgwMGNlLCAweDA4MDQsIDB4MmRmNCwgMHgwODBjLCAweDgwNzgsIDB4MGNiMCwgMHgyMDAxLAorCTB4YWQwMCwgMHgyMDA0LCAweGEwODYsIDB4MDAwMywgMHgxOTA0LCAweDJkZjEsIDB4MDBjNiwgMHgyMDYxLAorCTB4MDEwMCwgMHg3OTI0LCAweDgxMGYsIDB4YTE4YywgMHgwMGZmLCAweGExOTYsIDB4MDBmZiwgMHgxMTMwLAorCTB4MjAwMSwgMHhhZDE0LCAweDIwMDQsIDB4YTA4NSwgMHhmZjAwLCAweDAwNzgsIDB4YTE4MiwgMHgwMDdmLAorCTB4MTZhMCwgMHhhMTg4LCAweDJiZTYsIDB4MjEwZCwgMHhhMThjLCAweDAwZmYsIDB4MjAwMSwgMHhhZDE0LAorCTB4MjAwNCwgMHhhMTE2LCAweDA1NTAsIDB4ODEwZiwgMHhhMTA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDAwNiwgMHgwODBjLCAweDgwMjIsIDB4MDAwZSwgMHgwMWUwLCAweDYwMWEsIDB4NjAwYiwgMHhiYzA1LAorCTB4NjAxZiwgMHgwMDAxLCAweDA4MGMsIDB4M2MwNSwgMHgwMWQ4LCAweDY4MzcsIDB4MDAwMCwgMHg3MDA3LAorCTB4MDAwMywgMHg2ODMzLCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLCAweDY4M2EsIDB4NzAxYiwgMHgzMTczLAorCTB4MmQwMCwgMHg2MDEyLCAweDIwMDksIDB4MDAzMiwgMHgwODBjLCAweDgwYTcsIDB4MDEyZSwgMHgwMGNlLAorCTB4MDAwNSwgMHgwMTJlLCAweDAwY2UsIDB4MDgwNCwgMHgyZGYxLCAweDAwY2UsIDB4MDgwNCwgMHgyZGY0LAorCTB4MDgwYywgMHg4MDc4LCAweDBjYjAsIDB4NjgzMCwgMHhhMDg2LCAweDAxMDAsIDB4MDkwNCwgMHgyZGYxLAorCTB4MDgwNCwgMHgyZGNjLCAweDIwNjEsIDB4YjA0OCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDAwLAorCTB4ZDA4NCwgMHgwMTI4LCAweDYxMDQsIDB4NjIwOCwgMHgwMTJlLCAweDA4MDQsIDB4MmRjYywgMHgwMTJlLAorCTB4MDgwNCwgMHgyZGY0LCAweDgxZmYsIDB4MTkwNCwgMHgyZGYxLCAweDA4MGMsIDB4NTc0ZiwgMHgwOTA0LAorCTB4MmRmMSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MjQ0LCAweDYwNjQsIDB4YTIwMiwgMHgwMjQ4LAorCTB4YTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4MjZjMCwgMHgwODBjLCAweDQzNmUsIDB4MDEyZSwgMHgwODA0LAorCTB4MmRjYywgMHgwMTJlLCAweDA4MDQsIDB4MmRmNCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3ODI0LAorCTB4YTA4NCwgMHgwMDA3LCAweDAwMDIsIDB4MzFiNiwgMHgzMWJmLCAweDMxYzYsIDB4MzFiMywgMHgzMWIzLAorCTB4MzFiMywgMHgzMWIzLCAweDMxYjMsIDB4MDEyZSwgMHgwODA0LCAweDJkZjQsIDB4MjAwOSwgMHgwMTE0LAorCTB4MjEwNCwgMHhhMDg1LCAweDA4MDAsIDB4MjAwYSwgMHgwODBjLCAweDMzMmYsIDB4MDA3MCwgMHgyMDA5LAorCTB4MDEwYiwgMHgyMDBiLCAweDAwMTAsIDB4MDgwYywgMHgzMzJmLCAweDAwMzgsIDB4ODFmZiwgMHgwMTI4LAorCTB4MDEyZSwgMHgyMDIxLCAweDQwMGIsIDB4MDgwNCwgMHgyZGNlLCAweDAwODYsIDB4MDA5NiwgMHgwMGE2LAorCTB4MDBiNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDIwMDksIDB4MDEwMSwgMHgyMTBjLAorCTB4MDAxNiwgMHgyMDAxLCAweDAxMzgsIDB4MjAwYywgMHgyMDAzLCAweDAwMDEsIDB4MDAxNiwgMHgyMDAxLAorCTB4MDA3YSwgMHgyMDM0LCAweDIwMDEsIDB4MDA3YiwgMHgyMDJjLCAweGEwMDYsIDB4MjA0OCwgMHgyMDUwLAorCTB4MjA1OCwgMHgwODBjLCAweDM1NzAsIDB4MDgwYywgMHgzNGRhLCAweGEwM2UsIDB4MjcyMCwgMHgwMGY2LAorCTB4MDBlNiwgMHgwMGM2LCAweDJkNjAsIDB4MjA3MSwgMHhiMDFlLCAweDIwNzksIDB4MDAyMCwgMHgwMGQ2LAorCTB4MjA2OSwgMHgwMDAwLCAweDY4MjQsIDB4ZDBiNCwgMHgwMTQwLCAweDIwMDEsIDB4MDA3ZCwgMHgyMDA0LAorCTB4NzgzZSwgMHgyMDAxLCAweDAwN2MsIDB4MjAwNCwgMHg3ODNhLCAweDAwZGUsIDB4MjAxMSwgMHgwMDAxLAorCTB4MDgwYywgMHgzNDg2LCAweDA4MGMsIDB4MzQ4NiwgMHgwMGNlLCAweDAwZWUsIDB4MDBmZSwgMHgwODBjLAorCTB4MzNkNSwgMHgwODBjLCAweDM0YWUsIDB4MDgwYywgMHgzNDJiLCAweDA4MGMsIDB4MzM5NCwgMHgwODBjLAorCTB4MzNjNSwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHg3ODI0LCAweGQwOTQsIDB4MDUzMCwgMHg3ODE0LAorCTB4YTA4NCwgMHgwMTg0LCAweGEwODUsIDB4MDAxMCwgMHg3ODE2LCAweDIwNzksIDB4MDE0MCwgMHgwODBjLAorCTB4MzMwZCwgMHgxMTEwLCAweDAwZmUsIDB4MDQzMCwgMHg3ODA0LCAweGQwZGMsIDB4MGRjMCwgMHgyMDc5LAorCTB4MDEwMCwgMHg3ODI3LCAweDAwODYsIDB4NzgxNCwgMHhhMDg0LCAweDAxODQsIDB4YTA4NSwgMHgwMDMyLAorCTB4NzgxNiwgMHgwODBjLCAweDMzMGQsIDB4MTExMCwgMHgwMGZlLCAweDAwYTAsIDB4NzgyNCwgMHhkMGJjLAorCTB4MGRjMCwgMHg3ODI3LCAweDAwODAsIDB4YTAyNiwgMHg3YzE2LCAweDc4MjQsIDB4ZDBhYywgMHgwMTMwLAorCTB4OGI1OCwgMHgwODBjLCAweDMzMTcsIDB4MDBmZSwgMHgwODA0LCAweDMyZDcsIDB4MDBmZSwgMHgwODBjLAorCTB4MzMwZCwgMHgxMTUwLCAweDg5NDgsIDB4MjAwMSwgMHgwMDdhLCAweDI2MDIsIDB4MjAwMSwgMHgwMDdiLAorCTB4MjUwMiwgMHgwODBjLCAweDMzMTcsIDB4MDA4OCwgMHg4N2ZmLCAweDAxNDAsIDB4MjAwMSwgMHgwMjAxLAorCTB4MjAwNCwgMHhhMDA1LCAweDE5MDQsIDB4MzIxMSwgMHg4NzM5LCAweDAwMzgsIDB4MjAwMSwgMHhhZmZkLAorCTB4MjAwNCwgMHhhMDg2LCAweDAwMDAsIDB4MTkwNCwgMHgzMjExLCAweDIwMDEsIDB4MDAzMywgMHgyMDAzLAorCTB4MDBmNiwgMHg4NjMxLCAweDEyMDgsIDB4ODUyOSwgMHgyNTAwLCAweGE2MDUsIDB4MDkwNCwgMHgzMmQ3LAorCTB4NzgyNCwgMHhkMGJjLCAweDAxMjgsIDB4MjkwMCwgMHhhYTA1LCAweGFiMDUsIDB4MTkwNCwgMHgzMmQ3LAorCTB4NjAzMywgMHgwMDBkLCAweDIwMDEsIDB4MDAzMCwgMHgyMDAzLCAweDAwMDQsIDB4NzgyNCwgMHhkMGFjLAorCTB4MTE0OCwgMHgyMDAxLCAweGFmZmQsIDB4MjAwMywgMHgwMDAzLCAweDIwMDEsIDB4MDAzMCwgMHgyMDAzLAorCTB4MDAwOSwgMHgwMDQwLCAweDYwMjcsIDB4MDAwMSwgMHgyMDAxLCAweDAwNzUsIDB4MjAwNCwgMHhhMDA1LAorCTB4MDEwOCwgMHg2MDI2LCAweDJjMDAsIDB4NjAxYSwgMHgyMGUxLCAweDkwNDAsIDB4MmQwMCwgMHg2ODFhLAorCTB4NjgzMywgMHgwMDBkLCAweDc4MjQsIDB4ZDBhNCwgMHgxMTgwLCAweDY4MjcsIDB4MDAwMCwgMHgwMGM2LAorCTB4MjBhOSwgMHgwMDA0LCAweDIwNjEsIDB4MDAyMCwgMHg2MDAzLCAweDAwMDgsIDB4MjAwMSwgMHgwMjAzLAorCTB4MjAwNCwgMHgxZjA0LCAweDMyYWMsIDB4MDBjZSwgMHgwMDQwLCAweDY4MjcsIDB4MDAwMSwgMHgyMDAxLAorCTB4MDA3NCwgMHgyMDA0LCAweGEwMDUsIDB4MDEwOCwgMHg2ODI2LCAweDAwZjYsIDB4MDBjNiwgMHgyMDc5LAorCTB4MDEwMCwgMHgyMDYxLCAweDAwMjAsIDB4NzgyNywgMHgwMDAyLCAweDIwMDEsIDB4MDA3MiwgMHgyMDA0LAorCTB4YTA4NCwgMHhmZmY4LCAweDYwMWEsIDB4MDAwNiwgMHgyMDAxLCAweDAwNzMsIDB4MjAwNCwgMHg2MDFlLAorCTB4NzhjNiwgMHgwMDBlLCAweDc4Y2EsIDB4MDBjZSwgMHgwMGZlLCAweDA4MDQsIDB4MzFlZiwgMHgyMDYxLAorCTB4MDEwMCwgMHg2MDI3LCAweDAwMDIsIDB4MDAxZSwgMHg2MWUyLCAweDAwMWUsIDB4NjEwNiwgMHg3ODI0LAorCTB4YTA4NCwgMHgwMDAzLCAweGEwODYsIDB4MDAwMiwgMHgwMTg4LCAweDIwZTEsIDB4OTAyOCwgMHg2MDUwLAorCTB4YTA4NCwgMHhmN2VmLCAweDYwNTIsIDB4NjAyZiwgMHgwMDAwLCAweDYwMmMsIDB4YzBhYywgMHg2MDJlLAorCTB4NjA0YiwgMHhmN2Y3LCAweDYwNDMsIDB4MDA5MCwgMHg2MDQzLCAweDAwMTAsIDB4MjkwOCwgMHgyYTEwLAorCTB4MmIxOCwgMHgyYjAwLCAweGFhMDUsIDB4YTkwNSwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLAorCTB4MDBiZSwgMHgwMGFlLCAweDAwOWUsIDB4MDA4ZSwgMHgxMTE4LCAweDAxMmUsIDB4MDgwNCwgMHgyZGNjLAorCTB4MDEyZSwgMHgyMDIxLCAweDQwMGMsIDB4MDgwNCwgMHgyZGNlLCAweGEwODUsIDB4MDAwMSwgMHgxZDA0LAorCTB4MzMxNiwgMHgyMDkxLCAweDYwMDAsIDB4ODQyMCwgMHhhNDg2LCAweDAwNjQsIDB4MDAwNSwgMHgyMDAxLAorCTB4MDEwNSwgMHgyMDAzLCAweDAwMTAsIDB4MjAwMSwgMHgwMDMwLCAweDIwMDMsIDB4MDAwNCwgMHgyMDAxLAorCTB4MDAyMCwgMHgyMDAzLCAweDAwMDQsIDB4MjAwMSwgMHhhZmZkLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLAorCTB4YjAxZSwgMHgyMDAzLCAweDAwMDAsIDB4MjBlMSwgMHhmMDAwLCAweGEwMjYsIDB4MDAwNSwgMHgwMGY2LAorCTB4MjA3OSwgMHgwMTAwLCAweDIwMDEsIDB4YWQxNCwgMHgyMDBjLCAweDc5MzIsIDB4NzkzNiwgMHgwODBjLAorCTB4MjZhMCwgMHg3ODUwLCAweGEwODQsIDB4MDk4MCwgMHhhMDg1LCAweDAwMzAsIDB4Nzg1MiwgMHgyMDE5LAorCTB4MDFmNCwgMHg4MzE5LCAweDFkZjAsIDB4YTA4NCwgMHgwOTgwLCAweDc4NTIsIDB4NzgyYywgMHhjMGFkLAorCTB4NzgyZSwgMHgyMGE5LCAweDAwNDYsIDB4MWQwNCwgMHgzMzRiLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LAorCTB4MzM0YiwgMHg3ODUwLCAweGEwODUsIDB4MDQwMCwgMHg3ODUyLCAweDIwMDEsIDB4MDAwOSwgMHgyMDA0LAorCTB4YTA4NCwgMHgwMDAzLCAweGEwODYsIDB4MDAwMSwgMHgxMTE4LCAweDc4MmMsIDB4YzBhYywgMHg3ODJlLAorCTB4Nzg0YiwgMHhmN2Y3LCAweDc4NDMsIDB4MDA5MCwgMHg3ODQzLCAweDAwMTAsIDB4MjBhOSwgMHgwMDBlLAorCTB4ZTAwMCwgMHgxZjA0LCAweDMzNjgsIDB4Nzg1MCwgMHhhMDg1LCAweDE0MDAsIDB4Nzg1MiwgMHgyMDE5LAorCTB4NjFhOCwgMHg3ODU0LCAweGUwMDAsIDB4ZTAwMCwgMHhkMDhjLCAweDExMTAsIDB4ODMxOSwgMHgxZGM4LAorCTB4NzgyNywgMHgwMDQ4LCAweDc4NTAsIDB4YTA4NSwgMHgwNDAwLCAweDc4NTIsIDB4Nzg0MywgMHgwMDQwLAorCTB4MjAxOSwgMHgwMWY0LCAweGUwMDAsIDB4ZTAwMCwgMHg4MzE5LCAweDFkZTAsIDB4MjAwMSwgMHgwMTQwLAorCTB4MjAwMywgMHgwMTAwLCAweDc4MjcsIDB4MDAyMCwgMHg3ODQzLCAweDAwMDAsIDB4MjAwMywgMHgwMDAwLAorCTB4NzgyNywgMHgwMDQ4LCAweDAwZmUsIDB4MDAwNSwgMHg3ODI0LCAweGQwYWMsIDB4MTFjOCwgMHgwMGY2LAorCTB4MDBlNiwgMHgyMDcxLCAweGFmZmQsIDB4MjA3OSwgMHgwMDMwLCAweDIwMDEsIDB4MDIwMSwgMHgyMDA0LAorCTB4YTAwNSwgMHgwMTYwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAwLCAweDExNDAsIDB4MDA1MSwgMHhkMGJjLAorCTB4MDEwOCwgMHg4NzM4LCAweDcwMDMsIDB4MDAwMywgMHg3ODAzLCAweDAwMTksIDB4MDBlZSwgMHgwMGZlLAorCTB4MDAwNSwgMHg3ODBjLCAweGEwOGMsIDB4MDA3MCwgMHgwMTc4LCAweDIwMDksIDB4MDA3YSwgMHgyNjBhLAorCTB4MjAwOSwgMHgwMDdiLCAweDI1MGEsIDB4ZDBiNCwgMHgwMTA4LCAweDhhNTAsIDB4ZDBhYywgMHgwMTA4LAorCTB4ODk0OCwgMHhkMGE0LCAweDAxMDgsIDB4OGI1OCwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMjAwLAorCTB4NzgxYywgMHhkMDg0LCAweDAxNDAsIDB4MjBlMSwgMHgwMDA3LCAweDIwZTEsIDB4MjAwMCwgMHgyMDAxLAorCTB4MDIwYSwgMHgyMDA0LCAweDBjYTgsIDB4MDBmZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgwMTAwLAorCTB4MjAwOSwgMHhhZDE0LCAweDIxMGMsIDB4NzE2ZSwgMHg3MDYzLCAweDAxMDAsIDB4NzE2NiwgMHg3MTllLAorCTB4NzA2YiwgMHgwMDAwLCAweDcwNzMsIDB4MDgwOSwgMHg3MDc3LCAweDAwMDgsIDB4NzA3OCwgMHhhMDgwLAorCTB4MDEwMCwgMHg3MDdhLCAweDcwODAsIDB4ODAwMCwgMHg3MDgyLCAweDcwODcsIDB4YWFhYSwgMHhhMDA2LAorCTB4NzA4YSwgMHg3MDhlLCAweDcwN2UsIDB4NzBkNiwgMHg3MGFiLCAweDAwMzYsIDB4NzBhZiwgMHg5NWQ1LAorCTB4NzAyNywgMHgwMDgwLCAweDcwMTQsIDB4YTA4NCwgMHgwMTg0LCAweGEwODUsIDB4MDAzMiwgMHg3MDE2LAorCTB4MDgwYywgMHgzNGFlLCAweDA4MGMsIDB4MzMwZCwgMHgxMTEwLCAweDg0MjEsIDB4MDAyOCwgMHg3MDI0LAorCTB4ZDBiYywgMHgwZGIwLCAweDcwMjcsIDB4MDA4MCwgMHgwMGY2LCAweDAwZTYsIDB4MjA3MSwgMHhhZmZkLAorCTB4MjA3OSwgMHgwMDMwLCAweDAwZDYsIDB4MjA2OSwgMHgwMDAwLCAweDY4MjQsIDB4ZDBiNCwgMHgwMTIwLAorCTB4NjgzYywgMHg3ODNlLCAweDY4MzgsIDB4NzgzYSwgMHgwMGRlLCAweDIwMTEsIDB4MDAxMSwgMHgwODBjLAorCTB4MzQ4NiwgMHgyMDExLCAweDAwMDEsIDB4MDgwYywgMHgzNDg2LCAweDAwZWUsIDB4MDBmZSwgMHg3MDE3LAorCTB4MDAwMCwgMHgwMGVlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDIwNzEsIDB4YWZmZCwgMHgyMDc5LAorCTB4MDAzMCwgMHg3OTA0LCAweGQxZmMsIDB4MDkwNCwgMHgzNDgzLCAweDc4MDMsIDB4MDAwMiwgMHhhMDI2LAorCTB4ZDE5YywgMHgxOTA0LCAweDM0N2YsIDB4NzAwMCwgMHgwMDAyLCAweDM0ODMsIDB4MzQ0MSwgMHgzNDY1LAorCTB4MzQ3ZiwgMHhkMWJjLCAweDExNTAsIDB4ZDFkYywgMHgxMTUwLCAweDgwMDEsIDB4NzAwMiwgMHgyMDExLAorCTB4MDAwMSwgMHgwNGUxLCAweDA1YzAsIDB4MDRkMSwgMHgwNGIwLCAweDc4MGYsIDB4MDAwMCwgMHg3ODIwLAorCTB4NzkyNCwgMHg3ODAzLCAweDAwMDQsIDB4NzgyMiwgMHg3OTI2LCAweDIwMDEsIDB4MDIwMSwgMHgyMDBjLAorCTB4ODFmZiwgMHgwZGU4LCAweDA4MGMsIDB4MzNiMSwgMHgyMDA5LCAweDAwMDEsIDB4NzgwOCwgMHhkMGVjLAorCTB4MDExMCwgMHgyMDA5LCAweDAwMTEsIDB4NzkwMiwgMHgwMGYwLCAweDgwMDEsIDB4NzAwMiwgMHhhMTg0LAorCTB4MDg4MCwgMHgxMTM4LCAweDc4MDQsIDB4ZDBmYywgMHgxOTQwLCAweDIwMTEsIDB4MDAwMSwgMHgwMGIxLAorCTB4MDA5MCwgMHg2MDMwLCAweGEwOTIsIDB4MDAwNCwgMHhhMDg2LCAweDAwMDksIDB4MTEyMCwgMHg2MDAwLAorCTB4NjAxYSwgMHgyMDExLCAweDAwMjUsIDB4NjIzMiwgMHhkMWRjLCAweDE5ODgsIDB4MDg3MCwgMHg3ODAzLAorCTB4MDAwNCwgMHg3MDAzLCAweDAwMDAsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4NjAyNCwgMHhhMDA1LAorCTB4MDUyMCwgMHg4MDAxLCAweDYwMjYsIDB4NjAxOCwgMHg2MTMwLCAweGExNDAsIDB4MjgwNCwgMHg3ODMyLAorCTB4ODg0MCwgMHgyODA0LCAweDc4MzYsIDB4ODg0MCwgMHgyODA0LCAweDc4MjIsIDB4ODg0MCwgMHgyODA0LAorCTB4NzgyNiwgMHg4ODQwLCAweDdhMDIsIDB4NzAwMCwgMHg4MDAwLCAweDcwMDIsIDB4NjAxOCwgMHhhODAyLAorCTB4YTA4YSwgMHgwMDI5LCAweDExMzgsIDB4NjAxOCwgMHhhMDgwLCAweDAwMDEsIDB4MjAwNCwgMHg2MDFhLAorCTB4MjAwMSwgMHgwMDBkLCAweDYwMzIsIDB4YTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDBjNiwgMHgyMDcxLCAweGIwMWUsIDB4MjA3OSwgMHgwMDIwLCAweDc5MDQsIDB4ZDFmYywgMHgwMWYwLAorCTB4NzgwMywgMHgwMDAyLCAweDJkNjAsIDB4YTAyNiwgMHg3MDAwLCAweDAwMDIsIDB4MzRkNiwgMHgzNGMxLAorCTB4MzRjZCwgMHg4MDAxLCAweDcwMDIsIDB4ZDE5YywgMHgxMTg4LCAweDIwMTEsIDB4MDAwMSwgMHgwODBjLAorCTB4MzQ4NiwgMHgwMTYwLCAweDA4MGMsIDB4MzQ4NiwgMHgwMDQ4LCAweDgwMDEsIDB4NzAwMiwgMHg3ODA0LAorCTB4ZDBmYywgMHgxZDMwLCAweDIwMTEsIDB4MDAwMSwgMHgwODBjLCAweDM0ODYsIDB4MDBjZSwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMGM2LCAweDIwNjEsIDB4MDIwMCwgMHg2MDFiLAorCTB4MDAwNCwgMHgyMDYxLCAweDAxMDAsIDB4NjBjZiwgMHgwNDAwLCAweDYwMDQsIDB4YzBhYywgMHhhMDg1LAorCTB4MDIwMCwgMHg2MDA2LCAweDIwMDEsIDB4MDA3NCwgMHgyMDA0LCAweGEwMDUsIDB4MDFmOCwgMHgyMDM4LAorCTB4MjAwMSwgMHgwMDc2LCAweDIwMjQsIDB4MjAwMSwgMHgwMDc3LCAweDIwMWMsIDB4MDgwYywgMHgzYzA1LAorCTB4NjgzMywgMHgwMDBkLCAweDZmMjYsIDB4MmQwMCwgMHg2ODFhLCAweGE3OGEsIDB4MDAwNywgMHgwMjIwLAorCTB4MjEzOCwgMHgyMDA5LCAweDAwMDcsIDB4MDAxMCwgMHgyNzA4LCAweGEwM2UsIDB4NjgxOCwgMHhhMDgwLAorCTB4MDAwZCwgMHgwNGExLCAweDFkOTAsIDB4MmQwMCwgMHg2ODFhLCAweDAwODgsIDB4MDgwYywgMHgzYzA1LAorCTB4NjgzMywgMHgwMDBkLCAweDIwNzAsIDB4NjgyNywgMHgwMDAxLCAweDJkMDAsIDB4NjgxYSwgMHgyMDAxLAorCTB4MDA3NiwgMHgyMDA0LCAweDIwNzIsIDB4MjAwMSwgMHgwMDc3LCAweDIwMDQsIDB4NzAwNiwgMHgyMDYxLAorCTB4MDAyMCwgMHgyMDc5LCAweDAxMDAsIDB4NjAxMywgMHgwNDAwLCAweDIwZTEsIDB4OTA0MCwgMHgyMDAxLAorCTB4MDA3MiwgMHgyMDA0LCAweGEwODQsIDB4ZmZmOCwgMHg3MDBhLCAweDYwMWEsIDB4MDAwNiwgMHgyMDAxLAorCTB4MDA3MywgMHgyMDA0LCAweDcwMGUsIDB4NjAxZSwgMHg3OGM2LCAweDAwMGUsIDB4NzhjYSwgMHhhMDA2LAorCTB4NjAzYSwgMHg2MDNlLCAweDAwY2UsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLAorCTB4MDAxMCwgMHgyMGEwLCAweDIwOTksIDB4MDAxNCwgMHg3MDAzLCAweDAwMjYsIDB4NzQzMiwgMHg3MzM2LAorCTB4YTAwNiwgMHg3MDNhLCAweDcwM2UsIDB4ODEwYiwgMHg4MTBiLCAweDIxYTgsIDB4ODEwYiwgMHg3MTIyLAorCTB4NzAwMywgMHgwMDQxLCAweDcwMDQsIDB4ZDBmYywgMHgwZGU4LCAweDcwMDMsIDB4MDAwMiwgMHg3MDAzLAorCTB4MDA0MCwgMHg1M2E1LCAweDc0MzAsIDB4NzMzNCwgMHg4N2ZmLCAweDAxODAsIDB4MDBjNiwgMHgwMGQ2LAorCTB4MmQ2MCwgMHgwMGM2LCAweDA4MGMsIDB4M2MwNSwgMHgwMGNlLCAweDYwMTgsIDB4MjA3MCwgMHgyZDAwLAorCTB4NzAwNiwgMHg2MDFhLCAweDAwZGUsIDB4MDBjZSwgMHhhMDg1LCAweDAwMDEsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgyMDAxLCAweDAwNzUsIDB4MjAwNCwgMHhhMDA1LCAweDA1MDgsIDB4MjAzOCwgMHgyMDAxLAorCTB4MDA3OCwgMHgyMDI0LCAweDIwMDEsIDB4MDA3OSwgMHgyMDFjLCAweDA4MGMsIDB4M2MwNSwgMHgyZDYwLAorCTB4NjgzMywgMHgwMDBkLCAweDZmMjYsIDB4MmQwMCwgMHg2ODFhLCAweGE3OGEsIDB4MDAwNywgMHgwMjIwLAorCTB4MjEzOCwgMHgyMDA5LCAweDAwMDcsIDB4MDAxMCwgMHgyNzA4LCAweGEwM2UsIDB4NjgxOCwgMHhhMDgwLAorCTB4MDAwZCwgMHgwODBjLCAweDM1M2UsIDB4MWQ4OCwgMHgyZDAwLCAweDY4MWEsIDB4MDBlMCwgMHgwODBjLAorCTB4M2MwNSwgMHgyZDYwLCAweDYwMzMsIDB4MDAwZCwgMHgyMDcwLCAweDYwMjcsIDB4MDAwMSwgMHgyYzAwLAorCTB4NjAxYSwgMHgyMDAxLCAweDAwNzgsIDB4MjAwNCwgMHgyMDcyLCAweDIwMDEsIDB4MDA3OSwgMHgyMDA0LAorCTB4NzAwNiwgMHgyMDAxLCAweDAwNzIsIDB4MjAwNCwgMHhhMDg0LCAweGZmZjgsIDB4NzAwYSwgMHgyMDAxLAorCTB4MDA3MywgMHgyMDA0LCAweDcwMGUsIDB4MjAwMSwgMHgwMDMwLCAweDIwMDMsIDB4MDAwNCwgMHg3ODI0LAorCTB4ZDBhYywgMHgxMTc4LCAweDIwMDEsIDB4MDEwMSwgMHgyMDBjLCAweGMxZWQsIDB4MjEwMiwgMHg2MDI3LAorCTB4MDAwMCwgMHgyMDAxLCAweGFmZmQsIDB4MjAwMywgMHgwMDAzLCAweDIwMDEsIDB4MDAzMCwgMHgyMDAzLAorCTB4MDAwOSwgMHgwMGVlLCAweDAwMDUsIDB4MDgwNCwgMHgyZGNjLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjBhOSwgMHgwMDExLCAweDIwMDEsIDB4YWQ0MCwgMHgyMGEwLCAweGEwMDYsIDB4NDBhNCwgMHgwMTJlLAorCTB4MDgwNCwgMHgyZGNjLCAweDdkMzgsIDB4N2MzYywgMHgwODA0LCAweDJlNzMsIDB4MDgwYywgMHgzYzA1LAorCTB4MDkwNCwgMHgyZGYxLCAweDA4MGMsIDB4NTc0ZiwgMHgwMTEwLCAweDA4MGMsIDB4NDkxZiwgMHgyMDA5LAorCTB4MDAxYywgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDA4MGMsIDB4M2M0NiwgMHg3MDFiLAorCTB4MzVmMiwgMHgwMDA1LCAweGFkZTgsIDB4MDAwZCwgMHg2ODAwLCAweGEwMDUsIDB4MDkwNCwgMHgyZGY0LAorCTB4NjgwNCwgMHhkMGFjLCAweDAxMTgsIDB4ZDBhNCwgMHgwOTA0LCAweDJkZjQsIDB4ZDA5NCwgMHgwMGM2LAorCTB4MjA2MSwgMHgwMTAwLCAweDYxMDQsIDB4MDEzOCwgMHg2MjAwLCAweGEyOTIsIDB4MDAwNSwgMHgwMjE4LAorCTB4YTE4YywgMHhmZmRmLCAweDAwMTAsIDB4YTE4ZCwgMHgwMDIwLCAweDYxMDYsIDB4MDBjZSwgMHhkMDhjLAorCTB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4NjEwNCwgMHgwMTE4LCAweGExOGQsIDB4MDAxMCwgMHgwMDEwLAorCTB4YTE4YywgMHhmZmVmLCAweDYxMDYsIDB4MDBjZSwgMHgyMDA5LCAweDAxMDAsIDB4MjEwYywgMHhhMThhLAorCTB4MDAwMiwgMHgwMjY4LCAweGQwODQsIDB4MDE1OCwgMHg2YTI4LCAweGEyOGEsIDB4MDA3ZiwgMHgxYTA0LAorCTB4MmRmNCwgMHhhMjg4LCAweDJiZTYsIDB4MjEwZCwgMHhhMThjLCAweDAwZmYsIDB4NjE1NiwgMHhkMGRjLAorCTB4MDEzMCwgMHg2ODI4LCAweGEwOGEsIDB4MDA3ZiwgMHgxYTA0LCAweDJkZjQsIDB4NjA0ZSwgMHg2ODA4LAorCTB4YTA4YSwgMHgwMTAwLCAweDBhMDQsIDB4MmRmNCwgMHhhMDhhLCAweDA4NDEsIDB4MWEwNCwgMHgyZGY0LAorCTB4YTA4NCwgMHgwMDA3LCAweDE5MDQsIDB4MmRmNCwgMHg2ODBjLCAweGEwMDUsIDB4MDkwNCwgMHgyZGY0LAorCTB4NjgxMCwgMHhhMDA1LCAweDA5MDQsIDB4MmRmNCwgMHg2ODQ4LCAweDY5NDAsIDB4YTEwYSwgMHgxYTA0LAorCTB4MmRmNCwgMHg4MDAxLCAweDA5MDQsIDB4MmRmNCwgMHg2ODRjLCAweDY5NDQsIDB4YTEwYSwgMHgxYTA0LAorCTB4MmRmNCwgMHg4MDAxLCAweDA5MDQsIDB4MmRmNCwgMHg2ODA0LCAweGQwZmMsIDB4MDU2MCwgMHgwODBjLAorCTB4M2MwNSwgMHgwOTA0LCAweDJkZjEsIDB4MjAwOSwgMHgwMDE0LCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLAorCTB4N2QzOCwgMHhhMjkwLCAweDAwMzgsIDB4YTM5OSwgMHgwMDAwLCAweDA4MGMsIDB4M2M0NiwgMHg3MDFiLAorCTB4MzY3MiwgMHgwMDA1LCAweGFkZTgsIDB4MDAwZCwgMHgyMGE5LCAweDAwMTQsIDB4MmQ5OCwgMHgyMDY5LAorCTB4YWQ2ZCwgMHgyZGEwLCAweDUzYTMsIDB4NzAxMCwgMHhhMGU4LCAweDAwMGQsIDB4MjAwMSwgMHhhZDcxLAorCTB4MjAwYywgMHhkMWU0LCAweDAxNDAsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4NjAwNCwgMHhhMDg1LAorCTB4MGIwMCwgMHg2MDA2LCAweDAwY2UsIDB4MjBhOSwgMHgwMDFjLCAweDJkOTgsIDB4MjA2OSwgMHhhZDUxLAorCTB4MmRhMCwgMHg1M2EzLCAweDY4MTQsIDB4YTA4YywgMHgwMGZmLCAweDYxM2UsIDB4ODAwNywgMHhhMDg0LAorCTB4MDBmZiwgMHg2MDQyLCAweDA4MGMsIDB4NWExYywgMHgwODBjLCAweDUwNzAsIDB4MDgwYywgMHg1MGQ5LAorCTB4NjAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MTkwNCwgMHgzNzU1LCAweDY4MDgsIDB4NjAyYSwgMHgwODBjLAorCTB4MjJmOCwgMHgwMDA2LCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweGEwODIsIDB4MDAwNSwgMHgwMDBlLAorCTB4MDI2OCwgMHgyMDA5LCAweDAxNzAsIDB4MjAwYiwgMHgwMDgwLCAweGUwMDAsIDB4ZTAwMCwgMHgyMDBiLAorCTB4MDAwMCwgMHgwMDM2LCAweDZiMDgsIDB4MDgwYywgMHgyNmZiLCAweDAwM2UsIDB4NjgxOCwgMHg2OTFjLAorCTB4NmEyMCwgMHg2YjI0LCAweDgwMDcsIDB4ODEwZiwgMHg4MjE3LCAweDgzMWYsIDB4NjAxNiwgMHg2MTFhLAorCTB4NjIxZSwgMHg2MzIyLCAweDZjMDQsIDB4ZDRmNCwgMHgwMTQ4LCAweDY4MzAsIDB4NjkzNCwgMHg2YTM4LAorCTB4NmIzYywgMHg4MDA3LCAweDgxMGYsIDB4ODIxNywgMHg4MzFmLCAweDAwMTAsIDB4YTA4NCwgMHhmMGZmLAorCTB4NjAwNiwgMHg2MTBhLCAweDYyMGUsIDB4NjMxMiwgMHg4MDA3LCAweDgxMGYsIDB4ODIxNywgMHg4MzFmLAorCTB4MjBhOSwgMHgwMDA0LCAweDIwYTEsIDB4YWZhZCwgMHg0MGExLCAweDA4MGMsIDB4NjU5YywgMHg2OTA0LAorCTB4ZDFmYywgMHgwNTIwLCAweDAwYzYsIDB4MjAwOSwgMHgwMDAwLCAweDIwYTksIDB4MDAwMSwgMHg2YjcwLAorCTB4ZDM4NCwgMHgwMWM4LCAweDAwMjAsIDB4ODM5ZCwgMHgxMmIwLCAweDM1MDgsIDB4ODEwOSwgMHgwODBjLAorCTB4NWZhOSwgMHg2ODc4LCAweDYwMTYsIDB4Njg3NCwgMHgyMDA4LCAweGEwODQsIDB4ZmYwMCwgMHg4MDA3LAorCTB4NjAwYSwgMHhhMTg0LCAweDAwZmYsIDB4NjAwNiwgMHg4MTA4LCAweDExMTgsIDB4NjAwMywgMHgwMDAzLAorCTB4MDAxMCwgMHg2MDAzLCAweDAwMDEsIDB4MWYwNCwgMHgzNmYzLCAweDAwY2UsIDB4MjA2OSwgMHhhZDUxLAorCTB4MjAwMSwgMHhhZjlkLCAweDZhODAsIDB4YTI5NCwgMHgwMDMwLCAweGEyOGUsIDB4MDAwMCwgMHgwMTcwLAorCTB4YTI4ZSwgMHgwMDEwLCAweDAxMTgsIDB4YTI4ZSwgMHgwMDIwLCAweDAxNDAsIDB4MjAwMywgMHhhYWFhLAorCTB4MDgwYywgMHgyNzQ0LCAweDIwMDEsIDB4YWY4ZSwgMHgyMTAyLCAweDAwMDgsIDB4MjEwMiwgMHgwMGM2LAorCTB4MjA2MSwgMHgwMTAwLCAweDYwMmYsIDB4MDA0MCwgMHg2MDJmLCAweDAwMDAsIDB4MDBjZSwgMHgwODBjLAorCTB4NTc0ZiwgMHgwMTI4LCAweDA4MGMsIDB4M2U1ZiwgMHgwMTEwLCAweDA4MGMsIDB4MjZjMCwgMHg2MGM0LAorCTB4YTAwNSwgMHgwMWIwLCAweDYwMDMsIDB4MDAwMSwgMHgyMDA5LCAweDM3M2YsIDB4MDBjMCwgMHgwODBjLAorCTB4NTc0ZiwgMHgxMTU4LCAweDIwMTEsIDB4NTY2ZSwgMHgwODBjLCAweDY1MGQsIDB4MjAwMSwgMHhhZjllLAorCTB4MjAwMywgMHgwMDAwLCAweDA4MGMsIDB4NTY5YSwgMHgwMDQwLCAweDA4MGMsIDB4NDg1ZSwgMHgwMDI4LAorCTB4NjAwMywgMHgwMDA0LCAweDIwMDksIDB4Mzc1NSwgMHgwMDEwLCAweDA4MDQsIDB4MmRjYywgMHgyMDAxLAorCTB4MDEwMCwgMHgyMDA0LCAweGEwODIsIDB4MDAwNSwgMHgwMjU4LCAweDIwMDEsIDB4MDE3MCwgMHgyMDA0LAorCTB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDA0YywgMHgxMTE4LCAweDIwOTEsIDB4MzA5ZCwgMHgwODE3LAorCTB4MjA5MSwgMHgzMDFkLCAweDA4MTcsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDkwNCwgMHgyZGYxLAorCTB4MjA2OSwgMHhhZDUxLCAweDc4MzAsIDB4Njg0MiwgMHg3ODM0LCAweDY4NDYsIDB4NjgwNCwgMHhkMGZjLAorCTB4MDExOCwgMHgyMDA5LCAweDAwMzAsIDB4MDAxMCwgMHgyMDA5LCAweDAwMWMsIDB4MmQwMCwgMHg3YTJjLAorCTB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MDgwNCwgMHgzYzQ5LCAweGEwMDYsIDB4MDgwYywgMHgyNmMwLAorCTB4ODFmZiwgMHgxOTA0LCAweDJkZjEsIDB4MDgwYywgMHg1NzRmLCAweDExNzgsIDB4MjAwMSwgMHhhZjllLAorCTB4MjAwMywgMHgwMDAxLCAweDIwMDEsIDB4YWQwMCwgMHgyMDAzLCAweDAwMDEsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDgwYywgMHg1NzkzLCAweDA4MGMsIDB4NTY5YSwgMHgwMDIwLCAweDA4MGMsIDB4NDkxZiwgMHgwODBjLAorCTB4NDg1ZSwgMHgwODA0LCAweDJkY2MsIDB4ODFmZiwgMHgxOTA0LCAweDJkZjEsIDB4MDgwYywgMHg1NzRmLAorCTB4MTExMCwgMHgwODA0LCAweDJkZjEsIDB4NjE4NCwgMHg4MWZmLCAweDAxOTgsIDB4NzAzZiwgMHgwMDAwLAorCTB4MjAwMSwgMHhiM2MwLCAweDIwMDksIDB4MDA0MCwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHgzYzQ5LCAweDcwMWIsIDB4MmRjYSwgMHgwMTJlLAorCTB4MDAwNSwgMHg3MDNmLCAweDAwMDEsIDB4MDBkNiwgMHgyMDY5LCAweGIzYzAsIDB4MjBhOSwgMHgwMDQwLAorCTB4MjBhMSwgMHhiM2MwLCAweDIwMTksIDB4ZmZmZiwgMHg0M2E0LCAweDY1NGMsIDB4YTU4OCwgMHgyYmU2LAorCTB4MjEwZCwgMHhhMThjLCAweDAwZmYsIDB4MjE2YSwgMHhhMDBlLCAweDIwMTEsIDB4MDAwMiwgMHgyMTAwLAorCTB4YTUwNiwgMHgwMWE4LCAweDA4MGMsIDB4NGNkYywgMHgxMTkwLCAweDYwMTQsIDB4ODIxYywgMHgwMjM4LAorCTB4YTM5OCwgMHhiM2MwLCAweGEwODUsIDB4ZmYwMCwgMHg4MDA3LCAweDIwMWEsIDB4MDAzOCwgMHhhMzk4LAorCTB4YjNjMCwgMHgyMzI0LCAweGE0YTQsIDB4ZmYwMCwgMHhhNDA1LCAweDIwMWEsIDB4ODIxMCwgMHg4MTA4LAorCTB4YTE4MiwgMHgwMDgwLCAweDEyMDgsIDB4MGMxOCwgMHg4MjAxLCAweDgwMDcsIDB4MmQwYywgMHhhMTA1LAorCTB4MjA2YSwgMHgwMGRlLCAweDIwYTksIDB4MDA0MCwgMHgyMGExLCAweGIzYzAsIDB4MjA5OSwgMHhiM2MwLAorCTB4MDgwYywgMHg0OGJlLCAweDA4MDQsIDB4MzdiMCwgMHgwODBjLCAweDNjMmEsIDB4MDkwNCwgMHgyZGY0LAorCTB4MDBjNiwgMHgwODBjLCAweDNjMDUsIDB4MDBjZSwgMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LAorCTB4MmRmMSwgMHgyMDAxLCAweGFkNTIsIDB4MjAwNCwgMHhkMGI0LCAweDAxZjAsIDB4NjAwMCwgMHhkMDhjLAorCTB4MTFkOCwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MTFhOCwgMHg2ODM3LAorCTB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHgwODBjLCAweDk3MGIsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDAwMywgMHgwODA0LCAweDJkZjEsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsIDB4MzgzMCwgMHgwMDA1LAorCTB4MDgwYywgMHgzYzJhLCAweDA5MDQsIDB4MmRmNCwgMHgyMGE5LCAweDAwMmIsIDB4MmM5OCwgMHhhZGU4LAorCTB4MDAwMiwgMHgyZGEwLCAweDUzYTMsIDB4MjBhOSwgMHgwMDA0LCAweGFjODAsIDB4MDAwNiwgMHgyMDk4LAorCTB4YWQ4MCwgMHgwMDA2LCAweDIwYTAsIDB4MDgwYywgMHg0OGJlLCAweDIwYTksIDB4MDAwNCwgMHhhYzgwLAorCTB4MDAwYSwgMHgyMDk4LCAweGFkODAsIDB4MDAwYSwgMHgyMGEwLCAweDA4MGMsIDB4NDhiZSwgMHgyZDAwLAorCTB4MjAwOSwgMHgwMDJiLCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MDgwNCwgMHgzYzQ5LAorCTB4ODFmZiwgMHgxOTA0LCAweDJkZjEsIDB4MDgwYywgMHgzYzFhLCAweDA5MDQsIDB4MmRmNCwgMHgwODBjLAorCTB4NGVhYiwgMHgwODA0LCAweDJkY2MsIDB4ODFmZiwgMHgxOTA0LCAweDJkZjEsIDB4NzgyOCwgMHhhMDhhLAorCTB4MTAwMCwgMHgxYTA0LCAweDJkZjQsIDB4MDgwYywgMHgzYzJhLCAweDA5MDQsIDB4MmRmNCwgMHgwODBjLAorCTB4NGYwZCwgMHgwOTA0LCAweDJkZjEsIDB4MjAxOSwgMHgwMDA0LCAweDA4MGMsIDB4NGViZCwgMHg3OTI0LAorCTB4ODEwZiwgMHg3YTI4LCAweDAwMTEsIDB4MDgwNCwgMHgyZGNjLCAweGExODYsIDB4MDBmZiwgMHgwMTEwLAorCTB4MDA3MSwgMHgwMDYwLCAweDIwMjksIDB4MDA3ZSwgMHgyMDYxLCAweGFkMDAsIDB4NjQ0YywgMHgyNDAwLAorCTB4YTUwNiwgMHgwMTEwLCAweDI1MDgsIDB4MDAxOSwgMHg4NTI5LCAweDFlYzgsIDB4MDAwNSwgMHgwODBjLAorCTB4NGNkYywgMHgxMTM4LCAweDIyMDAsIDB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4YTEwOCwgMHgwODBjLAorCTB4NjUxOSwgMHgwMDA1LCAweDgxZmYsIDB4MTkwNCwgMHgyZGYxLCAweDA4MGMsIDB4M2MxYSwgMHgwOTA0LAorCTB4MmRmNCwgMHgwODBjLCAweDRkOTYsIDB4MDkwNCwgMHgyZGYxLCAweDA4MGMsIDB4NGViNCwgMHgwODA0LAorCTB4MmRjYywgMHg4MWZmLCAweDE5MDQsIDB4MmRmMSwgMHgwODBjLCAweDNjMWEsIDB4MDkwNCwgMHgyZGY0LAorCTB4MDgwYywgMHg0ZDk2LCAweDA5MDQsIDB4MmRmMSwgMHgwODBjLCAweDRlYTIsIDB4MDgwNCwgMHgyZGNjLAorCTB4NjEwMCwgMHgwODA0LCAweDJkY2MsIDB4MDgwYywgMHgzYzJhLCAweDA5MDQsIDB4MmRmNCwgMHgyMDAxLAorCTB4YWQwMCwgMHgyMDA0LCAweGEwODYsIDB4MDAwMywgMHgxOTA0LCAweDJkZjEsIDB4MDBkNiwgMHhhY2U4LAorCTB4MDAwYSwgMHg3OTI0LCAweGQxODQsIDB4MDExMCwgMHhhY2U4LCAweDAwMDYsIDB4NjgwYywgMHg4MDA3LAorCTB4NzgzZSwgMHg2ODA4LCAweDgwMDcsIDB4NzgzYSwgMHg2YjA0LCAweDgzMWYsIDB4NmEwMCwgMHg4MjE3LAorCTB4MDBkZSwgMHg2MTAwLCAweGExOGMsIDB4MDIwMCwgMHgwODA0LCAweDJkY2MsIDB4NzgyNCwgMHhhMDljLAorCTB4MDBmZiwgMHhhMzlhLCAweDAwMDMsIDB4MWEwNCwgMHgyZGYxLCAweDYyNGMsIDB4YTI5NCwgMHgwMGZmLAorCTB4YTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4YTIwNiwgMHgxMTUwLCAweDIwMDEsIDB4YWQ0MCwgMHgyMDA5LAorCTB4MDAwYywgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDA4MDQsIDB4M2M0OSwgMHg4MWZmLAorCTB4MTkwNCwgMHgyZGYxLCAweDA4MGMsIDB4M2MyYSwgMHgwOTA0LCAweDJkZjQsIDB4NjAwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MTkwNCwgMHgyZGYxLCAweDAwYzYsIDB4MDgwYywgMHgzYzA1LAorCTB4MDBjZSwgMHgwOTA0LCAweDJkZjEsIDB4NjgzNywgMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLAorCTB4MDgwYywgMHg5NmI3LCAweDA5MDQsIDB4MmRmMSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgzOTE5LAorCTB4MDAwNSwgMHg2ODMwLCAweGEwODYsIDB4MDEwMCwgMHgwOTA0LCAweDJkZjEsIDB4YWQ4MCwgMHgwMDBlLAorCTB4MjAwOSwgMHgwMDBjLCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MDgwNCwgMHgzYzQ5LAorCTB4YTAwNiwgMHgwODBjLCAweDI2YzAsIDB4NzgyNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMGZmLAorCTB4MDExOCwgMHg4MWZmLCAweDE5MDQsIDB4MmRmMSwgMHgwODBjLCAweDU3NGYsIDB4MDExMCwgMHgwODBjLAorCTB4NDkxZiwgMHg3ODI4LCAweGEwOGEsIDB4MTAwMCwgMHgxYTA0LCAweDJkZjQsIDB4NzkyNCwgMHhhMThjLAorCTB4ZmYwMCwgMHg4MTBmLCAweGExODYsIDB4MDBmZiwgMHgwMTM4LCAweGExODIsIDB4MDA3ZiwgMHgxYTA0LAorCTB4MmRmNCwgMHgyMTAwLCAweDA4MGMsIDB4MjY4YSwgMHgwMDI2LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDYxLCAweGFmZGEsIDB4NjAxYiwgMHgwMDAwLCAweDYwMWYsIDB4MDAwMCwgMHgwODBjLAorCTB4NTc0ZiwgMHgxMTc4LCAweDIwMDEsIDB4YWY5ZSwgMHgyMDAzLCAweDAwMDEsIDB4MjAwMSwgMHhhZDAwLAorCTB4MjAwMywgMHgwMDAxLCAweGEwODUsIDB4MDAwMSwgMHgwODBjLCAweDU3OTMsIDB4MDgwYywgMHg1NjlhLAorCTB4MDBhMCwgMHgyMDYxLCAweDAxMDAsIDB4MjAwMSwgMHhhZDE0LCAweDIwMDQsIDB4YTA4NCwgMHgwMGZmLAorCTB4ODEwZiwgMHhhMTA1LCAweDYwNGEsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHgyMDA5LAorCTB4MDAyZCwgMHgyMDExLCAweDQ4ODMsIDB4MDgwYywgMHg2NTkzLCAweDc5MjQsIDB4YTE4YywgMHhmZjAwLAorCTB4ODEwZiwgMHgwODBjLCAweDU3NGYsIDB4MTExMCwgMHgyMDA5LCAweDAwZmYsIDB4N2EyOCwgMHgwODBjLAorCTB4Mzg3ZCwgMHgwMTJlLCAweDAwY2UsIDB4MDAyZSwgMHgwODA0LCAweDJkY2MsIDB4NzkyNCwgMHhhMThjLAorCTB4ZmYwMCwgMHg4MTBmLCAweDAwYzYsIDB4MDgwYywgMHg0YzgwLCAweDJjMDgsIDB4MDBjZSwgMHgxOTA0LAorCTB4MmRmNCwgMHgwODA0LCAweDJkY2MsIDB4ODFmZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwMSwgMHgwODA0LAorCTB4MmRmMSwgMHg2MGQwLCAweGQwYWMsIDB4MTEzMCwgMHhkMDljLCAweDExMjAsIDB4MjAwOSwgMHgwMDA1LAorCTB4MDgwNCwgMHgyZGYxLCAweDA4MGMsIDB4M2MwNSwgMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LAorCTB4MmRmMSwgMHg3OTI0LCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MDgwYywgMHgzYzQ2LAorCTB4NzAxYiwgMHgzOWJiLCAweDAwMDUsIDB4MjAwOSwgMHgwMDgwLCAweDA4MGMsIDB4NGNkYywgMHgxMTMwLAorCTB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDAxMjAsIDB4MjAyMSwgMHg0MDBhLAorCTB4MDgwNCwgMHgyZGNlLCAweDAwZDYsIDB4YWRlOCwgMHgwMDBkLCAweDY5MDAsIDB4NmEwOCwgMHg2YjBjLAorCTB4NmMxMCwgMHg2ZDE0LCAweDZlMTgsIDB4NjgyMCwgMHhhMGJlLCAweDAxMDAsIDB4MDkwNCwgMHgzYTMyLAorCTB4YTBiZSwgMHgwMTEyLCAweDA5MDQsIDB4M2EzMiwgMHhhMGJlLCAweDAxMTMsIDB4MDkwNCwgMHgzYTMyLAorCTB4YTBiZSwgMHgwMTE0LCAweDA5MDQsIDB4M2EzMiwgMHhhMGJlLCAweDAxMTcsIDB4MDkwNCwgMHgzYTMyLAorCTB4YTBiZSwgMHgwMTFhLCAweDA5MDQsIDB4M2EzMiwgMHhhMGJlLCAweDAxMWMsIDB4MDkwNCwgMHgzYTMyLAorCTB4YTBiZSwgMHgwMTIxLCAweDA1YjAsIDB4YTBiZSwgMHgwMTMxLCAweDA1OTgsIDB4YTBiZSwgMHgwMTcxLAorCTB4MDVjOCwgMHhhMGJlLCAweDAxNzMsIDB4MDViMCwgMHhhMGJlLCAweDAxYTEsIDB4MTEyMCwgMHg2ODMwLAorCTB4ODAwNywgMHg2ODMyLCAweDA0YTgsIDB4YTBiZSwgMHgwMjEyLCAweDA1NDAsIDB4YTBiZSwgMHgwMjEzLAorCTB4MDUyOCwgMHhhMGJlLCAweDAyMTQsIDB4MDFiMCwgMHhhMGJlLCAweDAyMTcsIDB4MDE2OCwgMHhhMGJlLAorCTB4MDIxYSwgMHgxMTIwLCAweDY4MzgsIDB4ODAwNywgMHg2ODNhLCAweDAwZTAsIDB4YTBiZSwgMHgwMzAwLAorCTB4MDFjOCwgMHgwMGRlLCAweDA4MDQsIDB4MmRmNCwgMHhhZDgwLCAweDAwMTAsIDB4MjBhOSwgMHgwMDA3LAorCTB4MDgwYywgMHgzYTc4LCAweGFkODAsIDB4MDAwZSwgMHgyMGE5LCAweDAwMDEsIDB4MDgwYywgMHgzYTc4LAorCTB4MDA0OCwgMHhhZDgwLCAweDAwMGMsIDB4MDgwYywgMHgzYTg2LCAweDAwNTAsIDB4YWQ4MCwgMHgwMDBlLAorCTB4MDgwYywgMHgzYTg2LCAweGFkODAsIDB4MDAwYywgMHgyMGE5LCAweDAwMDEsIDB4MDgwYywgMHgzYTc4LAorCTB4MDBjNiwgMHgwODBjLCAweDNjMDUsIDB4MDU2OCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHg2ODM3LAorCTB4MDExOSwgMHg2ODUzLCAweDAwMDAsIDB4Njg0ZiwgMHgwMDIwLCAweDY4NWIsIDB4MDAwMSwgMHg4MTBiLAorCTB4Njk3ZSwgMHg2ODgzLCAweDAwMDAsIDB4NmE4NiwgMHg2YjhhLCAweDZjOGUsIDB4NmQ5MiwgMHg2OTk2LAorCTB4Njg5YiwgMHgwMDAwLCAweDAwY2UsIDB4MDBkZSwgMHg2ODM3LCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLAorCTB4NjgzYSwgMHg2ODIzLCAweDAwMDAsIDB4NjgwNCwgMHgyMDY4LCAweDA4MGMsIDB4OTZkMywgMHgxMTIwLAorCTB4MjAwOSwgMHgwMDAzLCAweDA4MDQsIDB4MmRmMSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgzYTZmLAorCTB4MDAwNSwgMHgwMGNlLCAweDAwZGUsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MmRmMSwgMHg2ODIwLAorCTB4YTA4NiwgMHg4MDAxLCAweDE5MDQsIDB4MmRjYywgMHgyMDA5LCAweDAwMDQsIDB4MDgwNCwgMHgyZGYxLAorCTB4MDAxNiwgMHgyMDA4LCAweDIwNDQsIDB4ODAwMCwgMHgyMDRjLCAweDgwMDAsIDB4MjkwYSwgMHg4MTA4LAorCTB4MjgwYSwgMHg4MTA4LCAweDFmMDQsIDB4M2E3YSwgMHgwMDFlLCAweDAwMDUsIDB4MDAxNiwgMHgwMGE2LAorCTB4MDBiNiwgMHgyMDA4LCAweDIwNDQsIDB4ODAwMCwgMHgyMDRjLCAweDgwMDAsIDB4MjA1NCwgMHg4MDAwLAorCTB4MjA1YywgMHgyYjBhLCAweDgxMDgsIDB4MmEwYSwgMHg4MTA4LCAweDI5MGEsIDB4ODEwOCwgMHgyODBhLAorCTB4MDBiZSwgMHgwMGFlLCAweDAwMWUsIDB4MDAwNSwgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLAorCTB4MDgwNCwgMHgyZGYxLCAweDc5MjQsIDB4MjE0MCwgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHg2MGQwLAorCTB4ZDBhYywgMHgxMTIwLCAweGExODIsIDB4MDA4MCwgMHgwYTA0LCAweDJkZjQsIDB4YTE4MiwgMHgwMGZmLAorCTB4MWEwNCwgMHgyZGY0LCAweDdhMmMsIDB4N2IyOCwgMHg2MDZjLCAweGEzMDYsIDB4MTE0MCwgMHg2MDcwLAorCTB4YTI0ZSwgMHgwOTA0LCAweDJkZjQsIDB4YTljYywgMHhmZjAwLCAweDA5MDQsIDB4MmRmNCwgMHgwMGM2LAorCTB4MDgwYywgMHgzYjU4LCAweDJjNjgsIDB4MDBjZSwgMHgwNTM4LCAweGEwYzYsIDB4NDAwMCwgMHgxMTgwLAorCTB4MDBjNiwgMHgwMDA2LCAweDJkNjAsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4NGY2ZSwgMHgxMTA4LAorCTB4YzE4NSwgMHg2MDAwLCAweGQwYmMsIDB4MDEwOCwgMHhjMThkLCAweDAwMGUsIDB4MDBjZSwgMHgwMDg4LAorCTB4YTBjNiwgMHg0MDA3LCAweDExMTAsIDB4MjQwOCwgMHgwMDYwLCAweGEwYzYsIDB4NDAwOCwgMHgxMTE4LAorCTB4MjcwOCwgMHgyNjEwLCAweDAwMzAsIDB4YTBjNiwgMHg0MDA5LCAweDExMDgsIDB4MDAxMCwgMHgyMDAxLAorCTB4NDAwNiwgMHgyMDIwLCAweDA4MDQsIDB4MmRjZSwgMHgyZDAwLCAweDcwMjIsIDB4MDAxNiwgMHgwMGI2LAorCTB4MDBjNiwgMHgwMGU2LCAweDJjNzAsIDB4MDgwYywgMHg4MDIyLCAweDA1ZDgsIDB4MmQwMCwgMHg2MDFhLAorCTB4MDgwYywgMHg5OTU2LCAweDJlNTgsIDB4MDBlZSwgMHgwMGU2LCAweDAwYzYsIDB4MDgwYywgMHgzYzA1LAorCTB4MDBjZSwgMHgyYjcwLCAweDExNTAsIDB4MDgwYywgMHg4MDc4LCAweDAwZWUsIDB4MDBjZSwgMHgwMGJlLAorCTB4MDAxZSwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgyZGYxLCAweDY4MzcsIDB4MDAwMCwgMHg2ODNiLAorCTB4MDAwMCwgMHgyZDAwLCAweDYwMTIsIDB4NjgzMywgMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHhkODhjLAorCTB4MDEwOCwgMHhjMGY1LCAweDY4M2EsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHgyYWQ5LAorCTB4MDEyZSwgMHg2MDFmLCAweDAwMDEsIDB4MjAwMSwgMHgwMDAwLCAweDA4MGMsIDB4NGMxZSwgMHgyMDAxLAorCTB4MDAwMiwgMHgwODBjLCAweDRjMzAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MGMsIDB4ODBhNywgMHhhMDg1LAorCTB4MDAwMSwgMHgwMGVlLCAweDAwY2UsIDB4MDBiZSwgMHgwMDFlLCAweDExMjAsIDB4MjAwOSwgMHgwMDAzLAorCTB4MDgwNCwgMHgyZGYxLCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDNiM2YsIDB4MDAwNSwgMHg2ODMwLAorCTB4YTA4NiwgMHgwMTAwLCAweDcwMjAsIDB4MjA2MCwgMHgxMTM4LCAweDIwMDksIDB4MDAwNCwgMHg2MjA0LAorCTB4YTI5NCwgMHgwMGZmLCAweDA4MDQsIDB4MmRmMSwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHg0ZjZlLAorCTB4MTEwOCwgMHhjMTg1LCAweDYwMDAsIDB4ZDBiYywgMHgwMTA4LCAweGMxOGQsIDB4MDgwNCwgMHgyZGNjLAorCTB4MDBlNiwgMHgwMGQ2LCAweDIwMjksIDB4MDAwMCwgMHgyMDAxLCAweGFkMzQsIDB4MjAwNCwgMHhkMGFjLAorCTB4MDEzOCwgMHgyMDIxLCAweDAwMDAsIDB4MjBhOSwgMHgwMGZmLCAweDIwNzEsIDB4YWUzNCwgMHgwMDMwLAorCTB4MjAyMSwgMHgwMDgwLCAweDIwYTksIDB4MDA3ZiwgMHgyMDcxLCAweGFlYjQsIDB4MmUwNCwgMHhhMDA1LAorCTB4MTEzMCwgMHgyMTAwLCAweGE0MDYsIDB4MTU0OCwgMHgyNDI4LCAweGM1ZmQsIDB4MDQzMCwgMHgyMDY4LAorCTB4NmYxMCwgMHgyNzAwLCAweGEzMDYsIDB4MTFiMCwgMHg2ZTE0LCAweDI2MDAsIDB4YTIwNiwgMHgxMTkwLAorCTB4MjQwMCwgMHhhMTA2LCAweDExNjAsIDB4MmQ2MCwgMHhkODg0LCAweDA1NDAsIDB4NjAwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MTUxMCwgMHgyMDAxLCAweDQwMDAsIDB4MDQwMCwgMHgyMDAxLAorCTB4NDAwNywgMHgwMGU4LCAweDI0MDAsIDB4YTEwNiwgMHgxMTQwLCAweDZlMTQsIDB4ODdmZiwgMHgxMTEwLAorCTB4ODZmZiwgMHgwOWQwLCAweDIwMDEsIDB4NDAwOCwgMHgwMDkwLCAweDg0MjAsIDB4OGU3MCwgMHgxZjA0LAorCTB4M2I2ZSwgMHg4NWZmLCAweDExMzAsIDB4MjAwMSwgMHg0MDA5LCAweDAwNDgsIDB4MjAwMSwgMHgwMDAxLAorCTB4MDAzMCwgMHgwODBjLCAweDRjODAsIDB4MWRkMCwgMHg2MzEyLCAweDYyMTYsIDB4YTAwNiwgMHhhMDA1LAorCTB4MDBkZSwgMHgwMGVlLCAweDAwMDUsIDB4ODFmZiwgMHgxOTA0LCAweDJkZjEsIDB4MDgwYywgMHgzYzA1LAorCTB4MDkwNCwgMHgyZGYxLCAweDY4MzcsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHg3ODI0LAorCTB4YTAwNSwgMHgwOTA0LCAweDJkZjQsIDB4YTA5NiwgMHgwMGZmLCAweDAxMjAsIDB4YTA5MiwgMHgwMDA0LAorCTB4MWEwNCwgMHgyZGY0LCAweDIwMTAsIDB4MmQxOCwgMHgwODBjLCAweDJhOGMsIDB4MDkwNCwgMHgyZGYxLAorCTB4NzAwNywgMHgwMDAzLCAweDcwMWIsIDB4M2JkNSwgMHgwMDA1LCAweDY4MzAsIDB4YTA4NiwgMHgwMTAwLAorCTB4MDkwNCwgMHgyZGYxLCAweDA4MDQsIDB4MmRjYywgMHg3OTI0LCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLAorCTB4NjBkMCwgMHhkMGFjLCAweDExMjAsIDB4YTE4MiwgMHgwMDgwLCAweDBhMDQsIDB4MmRmNCwgMHhhMTgyLAorCTB4MDBmZiwgMHgxYTA0LCAweDJkZjQsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg5NWM2LAorCTB4MTE4OCwgMHhhMTkwLCAweGFlMzQsIDB4MjIwNCwgMHhhMDY1LCAweDAxNjAsIDB4MDgwYywgMHg0OTNhLAorCTB4MjAwMSwgMHhhZDM0LCAweDIwMDQsIDB4ZDBhYywgMHgwMTEwLCAweDYwMTcsIDB4MDAwMCwgMHgwMTJlLAorCTB4MDgwNCwgMHgyZGNjLCAweDAxMmUsIDB4MDgwNCwgMHgyZGYxLCAweDA4MGMsIDB4MTVkOSwgMHgwMTg4LAorCTB4YTAwNiwgMHg2ODAyLCAweDcwMTAsIDB4YTAwNSwgMHgxMTIwLCAweDJkMDAsIDB4NzAxMiwgMHg3MDE2LAorCTB4MDAzMCwgMHg3MDE0LCAweDY4MDIsIDB4MjA2MCwgMHgyZDAwLCAweDYwMDYsIDB4NzAxNiwgMHhhZDgwLAorCTB4MDAwZCwgMHgwMDA1LCAweDc5MjQsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4MDgwYywgMHg0Y2RjLAorCTB4MTEzMCwgMHg3ZTI4LCAweGE2ODQsIDB4M2ZmZiwgMHhhMDgyLCAweDQwMDAsIDB4MDIwOCwgMHhhMDY2LAorCTB4OGNmZiwgMHgwMDA1LCAweDdlMjQsIDB4ODYwZiwgMHhhMThjLCAweDAwZmYsIDB4MDgwYywgMHg0Y2RjLAorCTB4MTEyOCwgMHhhNmI0LCAweDAwZmYsIDB4YTY4MiwgMHg0MDAwLCAweDAyMDgsIDB4YTA2NiwgMHg4Y2ZmLAorCTB4MDAwNSwgMHgwMDE2LCAweDcxMTAsIDB4ODFmZiwgMHgwMTI4LCAweDIxNjgsIDB4NjkwNCwgMHgwODBjLAorCTB4MTVmMCwgMHgwY2M4LCAweDcxMTIsIDB4NzExNiwgMHgwMDFlLCAweDAwMDUsIDB4MjAzMSwgMHgwMDAxLAorCTB4MDAxMCwgMHgyMDMxLCAweDAwMDAsIDB4MjA2MSwgMHhhZGQxLCAweDY2MDYsIDB4NjExMiwgMHg2MDBlLAorCTB4NjIyNiwgMHg2MzJhLCAweDY0MmUsIDB4NjUzMiwgMHgyYzEwLCAweDA4MGMsIDB4MTYyNCwgMHg3MDA3LAorCTB4MDAwMiwgMHg3MDFiLCAweDJkY2MsIDB4MDAwNSwgMHgwMGY2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA3OSwgMHgwMDAwLCAweDIwMDEsIDB4YWQ4ZiwgMHgyMDA0LCAweGEwMDUsIDB4MTE2OCwgMHgwZTA0LAorCTB4M2M3NCwgMHg3ODE4LCAweGQwODQsIDB4MTE0MCwgMHg3YTIyLCAweDdiMjYsIDB4N2MyYSwgMHg3ODFiLAorCTB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MDQwOCwgMHgwMDE2LCAweDAwYzYsIDB4MDBlNiwgMHgyMDcxLAorCTB4YWQ4MSwgMHg3MTM4LCAweGExODIsIDB4MDAxMCwgMHgwMjE4LCAweDcwMzAsIDB4MjA2MCwgMHgwMDc4LAorCTB4NzAzMCwgMHhhMGUwLCAweDAwMDQsIDB4YWM4MiwgMHhhZGQxLCAweDAyMTAsIDB4MjA2MSwgMHhhZDkxLAorCTB4MmMwMCwgMHg3MDMyLCAweDgxZmYsIDB4MTEwOCwgMHg3MDM2LCAweDgxMDgsIDB4NzEzYSwgMHgyMjYyLAorCTB4NjMwNiwgMHg2NDBhLCAweDAwZWUsIDB4MDBjZSwgMHgwMDFlLCAweDAxMmUsIDB4MDBmZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgyMDcxLCAweGFkODEsIDB4NzAzOCwgMHhhMDA1LCAweDA1NzAsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwZTA0LCAweDNjY2IsIDB4MDBmNiwgMHgyMDc5LCAweDAwMDAsIDB4NzgxOCwgMHhkMDg0LAorCTB4MTUwOCwgMHgwMGM2LCAweDcwMzQsIDB4MjA2MCwgMHgyYzA0LCAweDc4MjIsIDB4NjAwNCwgMHg3ODI2LAorCTB4NjAwOCwgMHg3ODJhLCAweDc4MWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4NzAzOCwgMHg4MDAxLAorCTB4NzAzYSwgMHhhMDA1LCAweDExMzAsIDB4NzAzMywgMHhhZDkxLCAweDcwMzcsIDB4YWQ5MSwgMHgwMGNlLAorCTB4MDA0OCwgMHhhYzgwLCAweDAwMDQsIDB4YTBmYSwgMHhhZGQxLCAweDAyMTAsIDB4MjAwMSwgMHhhZDkxLAorCTB4NzAzNiwgMHgwMGNlLCAweDAwZmUsIDB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4MDAyNiwgMHgyMDAxLAorCTB4YWQ1MiwgMHgyMDA0LCAweGQwYzQsIDB4MDEyMCwgMHgyMDExLCAweDgwMTQsIDB4MDgwYywgMHgzYzVjLAorCTB4MDAyZSwgMHgwMDA1LCAweDgxZmYsIDB4MTkwNCwgMHgyZGYxLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjAzMCwgMHhjMDhkLCAweGMwODUsIDB4YzBhYywgMHg2MDMyLCAweDA4MGMsIDB4NTc0ZiwgMHgxMTc4LAorCTB4MjAwMSwgMHhhZjllLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLCAweGFkMDAsIDB4MjAwMywgMHgwMDAxLAorCTB4YTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4NTc5MywgMHgwODBjLCAweDU2OWEsIDB4MDAxMCwgMHgwODBjLAorCTB4NDg1ZSwgMHgwMTJlLCAweDA4MDQsIDB4MmRjYywgMHg3ODI0LCAweDIwMDgsIDB4YTE4YywgMHhmZmZkLAorCTB4MTEyOCwgMHg2MWRjLCAweGExMGQsIDB4NjFkZSwgMHgwODA0LCAweDJkY2MsIDB4MDgwNCwgMHgyZGY0LAorCTB4ODFmZiwgMHgxOTA0LCAweDJkZjEsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDMsIDB4MTkwNCwgMHgyZGYxLAorCTB4MjAwMSwgMHhhZDUyLCAweDIwMDQsIDB4ZDBhYywgMHgxOTA0LCAweDJkZjEsIDB4MDgwYywgMHgzYzJhLAorCTB4MDkwNCwgMHgyZGY0LCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgxMTIwLAorCTB4NzgyOCwgMHhhMDA1LCAweDA5MDQsIDB4MmRjYywgMHgwMGM2LCAweDA4MGMsIDB4M2MwNSwgMHgwMGNlLAorCTB4MDkwNCwgMHgyZGYxLCAweDY4MzcsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLAorCTB4NjgzYSwgMHgwODBjLCAweDk3OWMsIDB4MDkwNCwgMHgyZGYxLCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLAorCTB4M2QzYSwgMHgwMDA1LCAweDY4MzAsIDB4YTA4NiwgMHgwMTAwLCAweDA5MDQsIDB4MmRmMSwgMHgwODA0LAorCTB4MmRjYywgMHgyMDAxLCAweGFkMDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MTkwNCwgMHgyZGYxLAorCTB4N2YyNCwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDA4MGMsIDB4M2MwNSwgMHgwOTA0LAorCTB4MmRmMSwgMHgyMDA5LCAweDAwMDAsIDB4MjAzMSwgMHgwMDAwLCAweDcwMjMsIDB4MDAwMCwgMHg3MDJmLAorCTB4MDAwMCwgMHhhZDgwLCAweDAwMDUsIDB4NzAyNiwgMHgyMGEwLCAweDA4MGMsIDB4NGNkYywgMHgxOTA0LAorCTB4M2RiNCwgMHg2MDA0LCAweGEwYzQsIDB4MDBmZiwgMHhhOGM2LCAweDAwMDYsIDB4MDEzMCwgMHhhMGM0LAorCTB4ZmYwMCwgMHhhOGM2LCAweDA2MDAsIDB4MTkwNCwgMHgzZGI0LCAweDIwMDEsIDB4YWQ1MiwgMHgyMDA0LAorCTB4ZDBhYywgMHgxMTI4LCAweDA4MGMsIDB4NGY2ZSwgMHgxMTEwLCAweGQ3OWMsIDB4MDVlOCwgMHhkNzk0LAorCTB4MTExMCwgMHhkNzg0LCAweDAxNTgsIDB4YWM4MCwgMHgwMDA2LCAweDIwOTgsIDB4MzQwMCwgMHgyMGE5LAorCTB4MDAwNCwgMHg1M2EzLCAweDA4MGMsIDB4M2E4NiwgMHhkNzk0LCAweDAxNDgsIDB4YWM4MCwgMHgwMDBhLAorCTB4MjA5OCwgMHgzNDAwLCAweDIwYTksIDB4MDAwNCwgMHg1M2EzLCAweDA4MGMsIDB4M2E4NiwgMHgyMWEyLAorCTB4ZDc5NCwgMHgwMWQ4LCAweGFjODAsIDB4MDAwMCwgMHgyMDk4LCAweDk0YTAsIDB4MjBhOSwgMHgwMDAyLAorCTB4NTNhMywgMHhhYzgwLCAweDAwMDMsIDB4MjBhNiwgMHg5NGEwLCAweGFjODAsIDB4MDAwNCwgMHgyMDk4LAorCTB4MzQwMCwgMHgyMGE5LCAweDAwMDIsIDB4NTNhMywgMHgwODBjLCAweDNhNzgsIDB4YWM4MCwgMHgwMDI2LAorCTB4MjA5OCwgMHgyMGE5LCAweDAwMDIsIDB4NTNhMywgMHgwMDA4LCAweDk0YTAsIDB4ZDc5NCwgMHgwMTEwLAorCTB4YTZiMCwgMHgwMDBiLCAweGE2YjAsIDB4MDAwNSwgMHg4MTA4LCAweDIwMDEsIDB4YWQzNCwgMHgyMDA0LAorCTB4ZDBhYywgMHgwMTE4LCAweGExODYsIDB4MDEwMCwgMHgwMDQwLCAweGQ3OGMsIDB4MDEyMCwgMHhhMTg2LAorCTB4MDEwMCwgMHgwMTcwLCAweDAwMTgsIDB4YTE4NiwgMHgwMDdlLCAweDAxNTAsIDB4ZDc5NCwgMHgwMTE4LAorCTB4YTY4NiwgMHgwMDIwLCAweDAwMTAsIDB4YTY4NiwgMHgwMDI4LCAweDAxNTAsIDB4MDgwNCwgMHgzZDVkLAorCTB4ODZmZiwgMHgxMTIwLCAweDcxMjAsIDB4ODEwYiwgMHgwODA0LCAweDJkY2MsIDB4NzAyZiwgMHgwMDAxLAorCTB4NzExZSwgMHg3MDIwLCAweGE2MDAsIDB4NzAyMiwgMHg3NzJhLCAweDIwNjEsIDB4YWRkMSwgMHg2MDA3LAorCTB4MDAwMCwgMHg2NjEyLCAweDcwMjQsIDB4NjAwZSwgMHg2MjI2LCAweDYzMmEsIDB4NjQyZSwgMHg2NTMyLAorCTB4MmMxMCwgMHgwODBjLCAweDE2MjQsIDB4NzAwNywgMHgwMDAyLCAweDcwMWIsIDB4M2RmMCwgMHgwMDA1LAorCTB4NzAyYywgMHhhMDA1LCAweDExNzAsIDB4NzExYywgMHg3MDI0LCAweDIwYTAsIDB4NzcyOCwgMHgyMDMxLAorCTB4MDAwMCwgMHgyMDYxLCAweGFkZDEsIDB4NjIyNCwgMHg2MzI4LCAweDY0MmMsIDB4NjUzMCwgMHgwODA0LAorCTB4M2Q1ZCwgMHg3MTIwLCAweDgxMGIsIDB4MDgwNCwgMHgyZGNjLCAweDIwMjksIDB4MDA3ZSwgMHg3OTI0LAorCTB4N2EyOCwgMHg3YjJjLCAweDdjMzgsIDB4YTE4NCwgMHhmZjAwLCAweDgwMDcsIDB4YTBlMiwgMHgwMDIwLAorCTB4MGEwNCwgMHgyZGY0LCAweGE1MDIsIDB4MGEwNCwgMHgyZGY0LCAweGExODQsIDB4MDBmZiwgMHhhMGUyLAorCTB4MDAyMCwgMHgwYTA0LCAweDJkZjQsIDB4YTUwMiwgMHgwYTA0LCAweDJkZjQsIDB4YTI4NCwgMHhmZjAwLAorCTB4ODAwNywgMHhhMGUyLCAweDAwMjAsIDB4MGEwNCwgMHgyZGY0LCAweGE1MDIsIDB4MGEwNCwgMHgyZGY0LAorCTB4YTI4NCwgMHgwMGZmLCAweGEwZTIsIDB4MDAyMCwgMHgwYTA0LCAweDJkZjQsIDB4YTUwMiwgMHgwYTA0LAorCTB4MmRmNCwgMHhhMzg0LCAweGZmMDAsIDB4ODAwNywgMHhhMGUyLCAweDAwMjAsIDB4MGEwNCwgMHgyZGY0LAorCTB4YTUwMiwgMHgwYTA0LCAweDJkZjQsIDB4YTM4NCwgMHgwMGZmLCAweGEwZTIsIDB4MDAyMCwgMHgwYTA0LAorCTB4MmRmNCwgMHhhNTAyLCAweDBhMDQsIDB4MmRmNCwgMHhhNDg0LCAweGZmMDAsIDB4ODAwNywgMHhhMGUyLAorCTB4MDAyMCwgMHgwYTA0LCAweDJkZjQsIDB4YTUwMiwgMHgwYTA0LCAweDJkZjQsIDB4YTQ4NCwgMHgwMGZmLAorCTB4YTBlMiwgMHgwMDIwLCAweDBhMDQsIDB4MmRmNCwgMHhhNTAyLCAweDBhMDQsIDB4MmRmNCwgMHgyMDYxLAorCTB4YWZhNiwgMHg2MTAyLCAweDYyMDYsIDB4NjMwYSwgMHg2NDBlLCAweDA4MDQsIDB4MmRjYywgMHgwMDA2LAorCTB4MjAwMSwgMHhhZDUyLCAweDIwMDQsIDB4ZDBjYywgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLAorCTB4YWQ3MSwgMHgyMDA0LCAweGQwYmMsIDB4MDAwZSwgMHgwMDA1LCAweDYxNjQsIDB4N2EyNCwgMHg2MzAwLAorCTB4ODJmZiwgMHgxMTE4LCAweDc5MjYsIDB4MDgwNCwgMHgyZGNjLCAweDgzZmYsIDB4MTkwNCwgMHgyZGY0LAorCTB4MjAwMSwgMHhmZmYwLCAweGEyMDAsIDB4MWEwNCwgMHgyZGY0LCAweDIwMTksIDB4ZmZmZiwgMHg2MDY4LAorCTB4YTMwMiwgMHhhMjAwLCAweDBhMDQsIDB4MmRmNCwgMHg3OTI2LCAweDYyNjYsIDB4MDgwNCwgMHgyZGNjLAorCTB4MjAwMSwgMHhhZDAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLCAweDE5MDQsIDB4MmRmMSwgMHg3YzI4LAorCTB4N2QyNCwgMHg3ZTM4LCAweDdmMmMsIDB4MDgwYywgMHgzYzA1LCAweDA5MDQsIDB4MmRmMSwgMHgyMDA5LAorCTB4MDAwMCwgMHgyMDE5LCAweDAwMDAsIDB4NzAyMywgMHgwMDAwLCAweDcwMmYsIDB4MDAwMCwgMHhhZDgwLAorCTB4MDAwMywgMHg3MDI2LCAweDIwYTAsIDB4YTFlMCwgMHhhZTM0LCAweDJjNjQsIDB4OGNmZiwgMHgwMWI4LAorCTB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDAxMzAsIDB4NjAwNCwgMHhhMDg0LAorCTB4ZmYwMCwgMHhhMDg2LCAweDA2MDAsIDB4MTE1OCwgMHg2MDE0LCAweDIwYTIsIDB4OTRhMCwgMHg2MDEwLAorCTB4ODAwNywgMHhhMTA1LCAweDgwMDcsIDB4MjBhMiwgMHg5NGEwLCAweGEzOTgsIDB4MDAwMiwgMHg4MTA4LAorCTB4YTE4MiwgMHgwMGZmLCAweDAxMjAsIDB4YTM4NiwgMHgwMDJhLCAweDAxNDgsIDB4MDhlMCwgMHg4M2ZmLAorCTB4MTEyMCwgMHg3MTIwLCAweDgxMGMsIDB4MDgwNCwgMHgyZGNjLCAweDcwMmYsIDB4MDAwMSwgMHg3MTFlLAorCTB4NzAyMCwgMHhhMzAwLCAweDcwMjIsIDB4MjA2MSwgMHhhZGQxLCAweDYwMDcsIDB4MDAwMCwgMHg2MzEyLAorCTB4NzAyNCwgMHg2MDBlLCAweDY0MjYsIDB4NjUyYSwgMHg2NjJlLCAweDY3MzIsIDB4MmMxMCwgMHgwODBjLAorCTB4MTYyNCwgMHg3MDA3LCAweDAwMDIsIDB4NzAxYiwgMHgzZWU2LCAweDAwMDUsIDB4NzAyYywgMHhhMDA1LAorCTB4MTE2OCwgMHg3MTFjLCAweDcwMjQsIDB4MjBhMCwgMHgyMDE5LCAweDAwMDAsIDB4MjA2MSwgMHhhZGQxLAorCTB4NjQyNCwgMHg2NTI4LCAweDY2MmMsIDB4NjczMCwgMHgwODA0LCAweDNlYTMsIDB4NzEyMCwgMHg4MTBjLAorCTB4MDgwNCwgMHgyZGNjLCAweDgxZmYsIDB4MTkwNCwgMHgyZGYxLCAweDYwZDAsIDB4ZDBhYywgMHgxMTE4LAorCTB4ZDA5YywgMHgwOTA0LCAweDJkZjEsIDB4MDgwYywgMHgzYzA1LCAweDA5MDQsIDB4MmRmMSwgMHg3OTI0LAorCTB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgwODBjLCAweDNjNDYsIDB4NzAxYiwgMHgzZjExLAorCTB4MDAwNSwgMHgwMGQ2LCAweGFkZTgsIDB4MDAwZCwgMHg2ODI4LCAweGEwYmUsIDB4NzAwMCwgMHgwMTQ4LAorCTB4YTBiZSwgMHg3MTAwLCAweDAxMzAsIDB4YTBiZSwgMHg3MjAwLCAweDAxMTgsIDB4MDBkZSwgMHgwODA0LAorCTB4MmRmNCwgMHg2ODIwLCAweDY5MjQsIDB4MDgwYywgMHgyNjc2LCAweDE1MTAsIDB4MDgwYywgMHg0YzgwLAorCTB4MTFmOCwgMHg3MTIyLCAweDY2MTIsIDB4NjUxNiwgMHg2ZTE4LCAweDAwYzYsIDB4MDgwYywgMHgzYzA1LAorCTB4MDFiOCwgMHgwODBjLCAweDNjMDUsIDB4MDFhMCwgMHgwMGNlLCAweDAwZGUsIDB4NjgzNywgMHgwMDAwLAorCTB4NjgzOCwgMHhjMGZkLCAweDY4M2EsIDB4NjgyMywgMHgwMDAwLCAweDY4MDQsIDB4MjA2OCwgMHgwODBjLAorCTB4OTZlZiwgMHgwOTA0LCAweDJkZjEsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsIDB4M2Y0YiwgMHgwMDA1LAorCTB4MDBkZSwgMHgwODA0LCAweDJkZjEsIDB4NzEyMCwgMHgwODBjLCAweDJiYzksIDB4NjgyMCwgMHhhMDg2LAorCTB4ODAwMSwgMHgwOTA0LCAweDJkZjEsIDB4MmQwMCwgMHg3MDFlLCAweDY4MDQsIDB4YTA4MCwgMHgwMDAyLAorCTB4MDAwNiwgMHgyMGE5LCAweDAwMmEsIDB4MjA5OCwgMHgyMGEwLCAweDA4MGMsIDB4NDhiZSwgMHgwMDBlLAorCTB4YWRlOCwgMHgwMDBkLCAweDZhMDgsIDB4NmIwYywgMHg2YzEwLCAweDZkMTQsIDB4MjA2MSwgMHhhZGQxLAorCTB4NjAwNywgMHgwMDAwLCAweDZlMDAsIDB4NmYyOCwgMHhhN2M2LCAweDcwMDAsIDB4MTEwOCwgMHgwMDE4LAorCTB4YTdjNiwgMHg3MTAwLCAweDExNDAsIDB4YTZjMiwgMHgwMDA0LCAweDBhMDQsIDB4MmRmNCwgMHgyMDA5LAorCTB4MDAwNCwgMHgwODA0LCAweDNjNDksIDB4YTdjNiwgMHg3MjAwLCAweDE5MDQsIDB4MmRmNCwgMHhhNmMyLAorCTB4MDA1NCwgMHgwYTA0LCAweDJkZjQsIDB4NjAwZSwgMHg2MDEzLCAweDAwMmEsIDB4NjIyNiwgMHg2MzJhLAorCTB4NjQyZSwgMHg2NTMyLCAweDJjMTAsIDB4MDgwYywgMHgxNjI0LCAweDcwMDcsIDB4MDAwMiwgMHg3MDFiLAorCTB4M2Y5MiwgMHgwMDA1LCAweDcwMWMsIDB4MjA2OCwgMHg2ODA0LCAweGEwODAsIDB4MDAwMSwgMHgyMDA0LAorCTB4YTA4MCwgMHgwMDAyLCAweDAwMDYsIDB4MjBhOSwgMHgwMDJhLCAweDIwOTgsIDB4MjBhMCwgMHgwODBjLAorCTB4NDhiZSwgMHgwMDBlLCAweDIwMDksIDB4MDAyYSwgMHgyMDYxLCAweGFkZDEsIDB4NjIyNCwgMHg2MzI4LAorCTB4NjQyYywgMHg2NTMwLCAweDA4MDQsIDB4M2M0OSwgMHg4MWZmLCAweDE5MDQsIDB4MmRmMSwgMHgwODBjLAorCTB4M2MxYSwgMHgwOTA0LCAweDJkZjQsIDB4MDgwYywgMHg0ZDk2LCAweDA5MDQsIDB4MmRmMSwgMHgwODBjLAorCTB4NGVjNiwgMHgwODA0LCAweDJkY2MsIDB4NzgyNCwgMHhkMDg0LCAweDA5MDQsIDB4MzgwNCwgMHgwODBjLAorCTB4M2MyYSwgMHgwOTA0LCAweDJkZjQsIDB4MDBjNiwgMHgwODBjLCAweDNjMDUsIDB4MDBjZSwgMHgxMTIwLAorCTB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MmRmMSwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LAorCTB4MDAwNiwgMHgwMTI4LCAweGEwOGUsIDB4MDAwNCwgMHgwMTEwLCAweGEwOGUsIDB4MDAwNSwgMHgxNTA4LAorCTB4MjAwMSwgMHhhZDUyLCAweDIwMDQsIDB4ZDBiNCwgMHgwOTA0LCAweDM4MzQsIDB4NjAwMCwgMHhkMDhjLAorCTB4MTkwNCwgMHgzODM0LCAweDY4MzcsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHgwODBjLAorCTB4OTcwYiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMywgMHgwODA0LCAweDJkZjEsIDB4NzAwNywgMHgwMDAzLAorCTB4NzAxYiwgMHgzZmYzLCAweDAwMDUsIDB4MDgwYywgMHgzYzJhLCAweDA5MDQsIDB4MmRmNCwgMHgwODA0LAorCTB4MzgzNCwgMHgyMDA5LCAweGFkMzAsIDB4MjEwYywgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLAorCTB4MDgwNCwgMHgyZGYxLCAweDIwMDEsIDB4YWQwMCwgMHgyMDA0LCAweGEwODYsIDB4MDAwMywgMHgwMTIwLAorCTB4MjAwOSwgMHgwMDA3LCAweDA4MDQsIDB4MmRmMSwgMHgyMDAxLCAweGFkNTIsIDB4MjAwNCwgMHhkMGFjLAorCTB4MDEyMCwgMHgyMDA5LCAweDAwMDgsIDB4MDgwNCwgMHgyZGYxLCAweDYwOWMsIDB4ZDBhNCwgMHgxMTE4LAorCTB4ZDBhYywgMHgxOTA0LCAweDM4MzQsIDB4NjgzNywgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LAorCTB4YzBmZCwgMHg2ODNhLCAweDA4MGMsIDB4OTc5YywgMHgxMTIwLCAweDIwMDksIDB4MDAwMywgMHgwODA0LAorCTB4MmRmMSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHg0MDJlLCAweDAwMDUsIDB4NjgzMCwgMHhhMDg2LAorCTB4MDEwMCwgMHgxMTIwLCAweDIwMDksIDB4MDAwNCwgMHgwODA0LCAweDJkZjEsIDB4MDgwYywgMHgzYzJhLAorCTB4MDkwNCwgMHgyZGY0LCAweDA4MDQsIDB4M2ZkOCwgMHg4MWZmLCAweDIwMDksIDB4MDAwMSwgMHgxOTA0LAorCTB4MmRmMSwgMHg2MDAwLCAweGEwODYsIDB4MDAwMywgMHgyMDA5LCAweDAwMDcsIDB4MTkwNCwgMHgyZGYxLAorCTB4MjAwMSwgMHhhZDUyLCAweDIwMDQsIDB4ZDBhYywgMHgyMDA5LCAweDAwMDgsIDB4MTkwNCwgMHgyZGYxLAorCTB4MDgwYywgMHgzYzJhLCAweDA5MDQsIDB4MmRmNCwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LAorCTB4MDAwNiwgMHgyMDA5LCAweDAwMDksIDB4MTkwNCwgMHgyZGYxLCAweDAwYzYsIDB4MDgwYywgMHgzYzA1LAorCTB4MDBjZSwgMHgyMDA5LCAweDAwMDIsIDB4MDkwNCwgMHgyZGYxLCAweDY4MzcsIDB4MDAwMCwgMHg2ODMzLAorCTB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHg3OTI4LCAweGExOTQsIDB4ZmYwMCwgMHhhMThjLAorCTB4MDBmZiwgMHhhMDA2LCAweDgyZmYsIDB4MTEyOCwgMHhjMGVkLCAweDY5NTIsIDB4NzkyYywgMHg2OTU2LAorCTB4MDA0OCwgMHhhMjhlLCAweDAxMDAsIDB4MTkwNCwgMHgyZGY0LCAweGMwZTUsIDB4Njg1MywgMHgwMDAwLAorCTB4Njg1NywgMHgwMDAwLCAweDY4M2UsIDB4MDgwYywgMHg5OTU3LCAweDIwMDksIDB4MDAwMywgMHgwOTA0LAorCTB4MmRmMSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHg0MDhlLCAweDAwMDUsIDB4NjgzMCwgMHhhMDg2LAorCTB4MDEwMCwgMHgyMDA5LCAweDAwMDQsIDB4MDkwNCwgMHgyZGYxLCAweDA4MDQsIDB4MmRjYywgMHg4MWZmLAorCTB4MjAwOSwgMHgwMDAxLCAweDE5MDQsIDB4MmRmMSwgMHg2MDAwLCAweGEwODYsIDB4MDAwMywgMHgyMDA5LAorCTB4MDAwNywgMHgxOTA0LCAweDJkZjEsIDB4MDgwYywgMHgzYzJhLCAweDA5MDQsIDB4MmRmNCwgMHg2MDA0LAorCTB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgyMDA5LCAweDAwMDksIDB4MTkwNCwgMHgyZGYxLAorCTB4MDBjNiwgMHgwODBjLCAweDNjMDUsIDB4MDBjZSwgMHgyMDA5LCAweDAwMDIsIDB4MDkwNCwgMHgyZGYxLAorCTB4YWQ4MCwgMHgwMDBmLCAweDIwMDksIDB4MDAwOCwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LAorCTB4MDgwYywgMHgzYzQ2LCAweDcwMWIsIDB4NDBjNSwgMHgwMDA1LCAweDAwZDYsIDB4YWRlOCwgMHgwMDBmLAorCTB4NjgwMCwgMHhhMDg2LCAweDA1MDAsIDB4MTE0MCwgMHg2ODA0LCAweGEwMDUsIDB4MTEyOCwgMHg2ODA4LAorCTB4YTA4NCwgMHhmZjAwLCAweDExMDgsIDB4MDAxOCwgMHgwMGRlLCAweDE5MDQsIDB4MmRmNCwgMHgwMGRlLAorCTB4NjgzNywgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHgwMGM2LAorCTB4MDgwYywgMHgzYzJhLCAweDExMTgsIDB4MDBjZSwgMHgwODA0LCAweDJkZjQsIDB4MDgwYywgMHg5OWE2LAorCTB4MjAwOSwgMHgwMDAzLCAweDAwY2UsIDB4MDkwNCwgMHgyZGYxLCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLAorCTB4NDBmMiwgMHgwMDA1LCAweDY4MzAsIDB4YTA4NiwgMHgwMTAwLCAweDIwMDksIDB4MDAwNCwgMHgwOTA0LAorCTB4MmRmMSwgMHgwODA0LCAweDJkY2MsIDB4ODFmZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwMSwgMHgwODA0LAorCTB4MmRmMSwgMHg2MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMTIwLCAweDIwMDksIDB4MDAwNywgMHgwODA0LAorCTB4MmRmMSwgMHg3ZTI0LCAweDg2MGYsIDB4YTE4YywgMHgwMGZmLCAweGE2YjQsIDB4MDBmZiwgMHgwODBjLAorCTB4NGNkYywgMHgxOTA0LCAweDJkZjQsIDB4YTE4NiwgMHgwMDdmLCAweDAxNTAsIDB4NjAwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDksIDB4MDgwNCwgMHgyZGYxLAorCTB4MDBjNiwgMHgwODBjLCAweDNjMDUsIDB4MDBjZSwgMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LAorCTB4MmRmMSwgMHg2ODM3LCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLCAweDY4M2EsIDB4MDgwYywgMHg5NzI2LAorCTB4MTEyMCwgMHgyMDA5LCAweDAwMDMsIDB4MDgwNCwgMHgyZGYxLCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLAorCTB4NDEzYSwgMHgwMDA1LCAweDY4MDgsIDB4ODAwNywgMHhhMDg2LCAweDAxMDAsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDAwNCwgMHgwODA0LCAweDJkZjEsIDB4NjhiMCwgMHg2ODM2LCAweDY4MTAsIDB4ODAwNywgMHhhMDg0LAorCTB4MDBmZiwgMHg4MDhlLCAweDY4MTQsIDB4ODAwNywgMHhhMDg0LCAweDAwZmYsIDB4ODA4NiwgMHhhMDgwLAorCTB4MDAwMiwgMHhhMTA4LCAweGFkODAsIDB4MDAwNCwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LAorCTB4MDgwNCwgMHgzYzQ5LCAweDA4MGMsIDB4M2MwNSwgMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LAorCTB4MmRmMSwgMHg3OTI0LCAweGExOTQsIDB4ZmYwMCwgMHhhMThjLCAweDAwZmYsIDB4ODIxNywgMHg4MmZmLAorCTB4MDExMCwgMHgwODA0LCAweDJkZjQsIDB4MjAwOSwgMHgwMDFhLCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLAorCTB4N2QzOCwgMHgwODBjLCAweDNjNDYsIDB4NzAxYiwgMHg0MTc2LCAweDAwMDUsIDB4YWQ4MCwgMHgwMDBkLAorCTB4MjA5OCwgMHgyMGE5LCAweDAwMWEsIDB4MjBhMSwgMHhhZmFkLCAweDUzYTMsIDB4MDgwNCwgMHgyZGNjLAorCTB4MDgwYywgMHgzYzA1LCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MmRmMSwgMHg3OTI0LAorCTB4YTE5NCwgMHhmZjAwLCAweGExOGMsIDB4MDBmZiwgMHg4MjE3LCAweDgyZmYsIDB4MDExMCwgMHgwODA0LAorCTB4MmRmNCwgMHgyMDk5LCAweGFmYWQsIDB4MjBhMCwgMHgyMGE5LCAweDAwMWEsIDB4NTNhMywgMHgyMDA5LAorCTB4MDAxYSwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDA4MDQsIDB4M2M0OSwgMHg3ODI0LAorCTB4YTA4YSwgMHgxMDAwLCAweDFhMDQsIDB4MmRmNCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg4MDAzLAorCTB4ODAwYiwgMHg4MTBiLCAweGExMDgsIDB4MDBjNiwgMHgyMDYxLCAweGFmZGEsIDB4NjE0MiwgMHgwMGNlLAorCTB4MDEyZSwgMHgwODA0LCAweDJkY2MsIDB4MDBjNiwgMHgwODBjLCAweDU3NGYsIDB4MTE4OCwgMHgyMDAxLAorCTB4YWY5ZSwgMHgyMDAzLCAweDAwMDEsIDB4MjAwMSwgMHhhZDAwLCAweDIwMDMsIDB4MDAwMSwgMHhhMDg1LAorCTB4MDAwMSwgMHgwODBjLCAweDU3OTMsIDB4MDgwYywgMHg1NjlhLCAweDA4MGMsIDB4MTRmNiwgMHgwMDM4LAorCTB4MjA2MSwgMHhhZDAwLCAweDYwMzAsIDB4YzA5ZCwgMHg2MDMyLCAweDA4MGMsIDB4NDg1ZSwgMHgwMGNlLAorCTB4MDAwNSwgMHgwMTI2LCAweDAwYzYsIDB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHhhZDAwLAorCTB4NjA0NCwgMHhkMGE0LCAweDExYjAsIDB4ZDA4NCwgMHgwMTE4LCAweDA4MGMsIDB4NDM0OCwgMHgwMDY4LAorCTB4ZDA4YywgMHgwMTE4LCAweDA4MGMsIDB4NDI2OSwgMHgwMDQwLCAweGQwOTQsIDB4MDExOCwgMHgwODBjLAorCTB4NDIzYSwgMHgwMDE4LCAweGQwOWMsIDB4MDEwOCwgMHgwMDYxLCAweDAwZWUsIDB4MDBjZSwgMHgwMTJlLAorCTB4MDAwNSwgMHgwMDE2LCAweDYxMjgsIDB4ZDE5YywgMHgxMTEwLCAweGMxOWQsIDB4NjEyYSwgMHgwMDFlLAorCTB4MGNhMCwgMHg2MjRjLCAweGEyODYsIDB4ZjBmMCwgMHgxMTUwLCAweDYwNDgsIDB4YTA4NiwgMHhmMGYwLAorCTB4MDEzMCwgMHg2MjRhLCAweDYwNDMsIDB4MDA5MCwgMHg2MDQzLCAweDAwMTAsIDB4MDQ5MCwgMHhhMjk0LAorCTB4ZmYwMCwgMHhhMjk2LCAweGY3MDAsIDB4MDE3OCwgMHg3MTM0LCAweGQxYTQsIDB4MTE2MCwgMHg2MjQwLAorCTB4YTI5NSwgMHgwMTAwLCAweDYyNDIsIDB4YTI5NCwgMHgwMDEwLCAweDAxMjgsIDB4MjAwOSwgMHgwMGY3LAorCTB4MDgwYywgMHg0OGRlLCAweDAwZjAsIDB4NjA0MCwgMHhhMDg0LCAweDAwMTAsIDB4YTA4NSwgMHgwMDQwLAorCTB4NjA0MiwgMHg2MDQzLCAweDAwMDAsIDB4NzA3NywgMHgwMDAwLCAweDcwOTMsIDB4MDAwMSwgMHg3MGI3LAorCTB4MDAwMCwgMHg3MGQzLCAweDAwMDAsIDB4MjAwOSwgMHhiM2MwLCAweDIwMGIsIDB4MDAwMCwgMHg3MDg3LAorCTB4MDAwMCwgMHg3MDdiLCAweDAwMGEsIDB4MjAwOSwgMHgwMDBhLCAweDIwMTEsIDB4NDgxNCwgMHgwODBjLAorCTB4NjU5MywgMHgwMDA1LCAweDAxNTYsIDB4MjAwMSwgMHhhZDczLCAweDIwMDQsIDB4ZDA4YywgMHgwMTEwLAorCTB4NzA0ZiwgMHhmZmZmLCAweDcwNzgsIDB4YTAwNSwgMHgxNTEwLCAweDIwMTEsIDB4NDgxNCwgMHgwODBjLAorCTB4NjUwZCwgMHg2MDQwLCAweGEwOTQsIDB4MDAxMCwgMHhhMjg1LCAweDAwMjAsIDB4NjA0MiwgMHgyMGE5LAorCTB4MDBjOCwgMHg2MDQ0LCAweGQwOGMsIDB4MTE2OCwgMHgxZjA0LCAweDQyNTEsIDB4NjI0MiwgMHg3MDhiLAorCTB4MDAwMCwgMHg2MDQwLCAweGEwOTQsIDB4MDAxMCwgMHhhMjg1LCAweDAwODAsIDB4NjA0MiwgMHg2MjQyLAorCTB4MDAzMCwgMHg2MjQyLCAweDcwOGIsIDB4MDAwMCwgMHg3MDdmLCAweDAwMDAsIDB4MDAwMCwgMHgwMTVlLAorCTB4MDAwNSwgMHg3MDdjLCAweGEwOGEsIDB4MDAwMywgMHgxMjEwLCAweDAwMjMsIDB4MDAxMCwgMHgwODBjLAorCTB4MTRmNiwgMHgwMDA1LCAweDQyNzUsIDB4NDJjNSwgMHg0MzQ3LCAweDAwZjYsIDB4NzA3ZiwgMHgwMDAxLAorCTB4MjBlMSwgMHhhMDAwLCAweGUwMDAsIDB4MjBlMSwgMHg4NzAwLCAweDA4MGMsIDB4MjJmOCwgMHgyMGUxLAorCTB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4MjA3OSwgMHhiMjAwLCAweDIwN2IsIDB4MjIwMCwgMHg3ODA3LAorCTB4MDBlZiwgMHg3ODBiLCAweDAwMDAsIDB4NzgwZiwgMHgwMGVmLCAweDc4MTMsIDB4MDEzOCwgMHg3ODE3LAorCTB4MDAwMCwgMHg3ODFiLCAweDAwMDAsIDB4NzgxZiwgMHgwMDAwLCAweDc4MjMsIDB4ZmZmZiwgMHg3ODI3LAorCTB4ZmZmZiwgMHg3ODJiLCAweDAwMDAsIDB4NzgyZiwgMHgwMDAwLCAweDIwNzksIDB4YjIwYywgMHgyMDdiLAorCTB4MTEwMSwgMHg3ODA3LCAweDAwMDAsIDB4MjA5OSwgMHhhZDA1LCAweDIwYTEsIDB4YjIwZSwgMHgyMGE5LAorCTB4MDAwNCwgMHg1M2EzLCAweDIwNzksIDB4YjIxMiwgMHgyMDdiLCAweDAwMDAsIDB4NzgwNywgMHgwMDAwLAorCTB4MjA5OSwgMHhiMjAwLCAweDIwYTEsIDB4MDIwYiwgMHgyMGE5LCAweDAwMTQsIDB4NTNhNiwgMHg2MGMzLAorCTB4MDAwYywgMHg2MDBmLCAweDAwMDAsIDB4MDgwYywgMHg0ODQ1LCAweDAwZmUsIDB4NzA4MywgMHgwMDAwLAorCTB4NjA0MywgMHgwMDA4LCAweDYwNDMsIDB4MDAwMCwgMHgwMDA1LCAweDAwZDYsIDB4NzA4MCwgMHg3MDgzLAorCTB4MDAwMCwgMHhhMDI1LCAweDA5MDQsIDB4NDMyZiwgMHg2MDIwLCAweGQwYjQsIDB4MTkwNCwgMHg0MzJkLAorCTB4NzE5MCwgMHg4MWZmLCAweDA5MDQsIDB4NDMxZCwgMHhhNDg2LCAweDAwMGMsIDB4MTkwNCwgMHg0MzI4LAorCTB4YTQ4MCwgMHgwMDE4LCAweDgwMDQsIDB4MjBhOCwgMHgyMDExLCAweGIyODAsIDB4MjAxOSwgMHhiMjAwLAorCTB4MjIwYywgMHgyMzA0LCAweGExMDYsIDB4MTFiOCwgMHg4MjEwLCAweDgzMTgsIDB4MWYwNCwgMHg0MmUwLAorCTB4NjA0MywgMHgwMDA0LCAweDYwOGIsIDB4YmM5NCwgMHg2MDhmLCAweGYwZjAsIDB4NjA0MywgMHgwMDA2LAorCTB4NzA3ZiwgMHgwMDAyLCAweDcwOGIsIDB4MDAwMiwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwgMHg0ODFiLAorCTB4MDgwYywgMHg2NTkzLCAweDA0OTAsIDB4MjA2OSwgMHhiMjgwLCAweDY5MzAsIDB4YTE4ZSwgMHgxMTAxLAorCTB4MTUzOCwgMHg2ODM0LCAweGEwMDUsIDB4MTUyMCwgMHg2OTAwLCAweGExOGMsIDB4MDBmZiwgMHgxMTE4LAorCTB4NjgwNCwgMHhhMDA1LCAweDAxOTAsIDB4MjAxMSwgMHhiMjhlLCAweDIwMTksIDB4YWQwNSwgMHgyMGE5LAorCTB4MDAwNCwgMHgyMjBjLCAweDIzMDQsIDB4YTEwMiwgMHgwMjMwLCAweDExOTAsIDB4ODIxMCwgMHg4MzE4LAorCTB4MWYwNCwgMHg0MzExLCAweDAwNjgsIDB4NzA5MywgMHgwMDAwLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLAorCTB4NDAwMCwgMHgyMDk5LCAweGIyODAsIDB4MjBhMSwgMHgwMjBiLCAweDIwYTksIDB4MDAxNCwgMHg1M2E2LAorCTB4NjA0MywgMHgwMDA4LCAweDYwNDMsIDB4MDAwMCwgMHgwMDEwLCAweDAwZGUsIDB4MDAwNSwgMHg2MDQwLAorCTB4YTA4NSwgMHgwMTAwLCAweDYwNDIsIDB4NjAyMCwgMHhkMGI0LCAweDFkYjgsIDB4NjBjMywgMHgwMDBjLAorCTB4MjAxMSwgMHhhZmQxLCAweDIwMTMsIDB4MDAwMCwgMHg3MDgzLCAweDAwMDAsIDB4MjBlMSwgMHg5MDgwLAorCTB4NjBhMywgMHgwMDU2LCAweDYwYTcsIDB4OTU3NSwgMHgwODBjLCAweDc4MmIsIDB4MGMzMCwgMHgwMDA1LAorCTB4NzA4OCwgMHhhMDhhLCAweDAwMWQsIDB4MTIxMCwgMHgwMDIzLCAweDAwMTAsIDB4MDgwYywgMHgxNGY2LAorCTB4MDAwNSwgMHg0MzdiLCAweDQzOGEsIDB4NDNiMiwgMHg0M2NiLCAweDQzZWYsIDB4NDQxNywgMHg0NDNiLAorCTB4NDQ2YywgMHg0NDkwLCAweDQ0YjgsIDB4NDRlZiwgMHg0NTE3LCAweDQ1MzMsIDB4NDU0OSwgMHg0NTY5LAorCTB4NDU3YywgMHg0NTg0LCAweDQ1YjEsIDB4NDVkNSwgMHg0NWZkLCAweDQ2MjEsIDB4NDY1MiwgMHg0NjhmLAorCTB4NDZiZSwgMHg0NmRhLCAweDQ3MTksIDB4NDczOSwgMHg0NzUyLCAweDQ3NTMsIDB4MDBjNiwgMHgyMDYxLAorCTB4YWQwMCwgMHg2MDAzLCAweDAwMDcsIDB4MjA2MSwgMHgwMTAwLCAweDYwMDQsIDB4YTA4NCwgMHhmZmY5LAorCTB4NjAwNiwgMHgwMGNlLCAweDAwMDUsIDB4NjA4YiwgMHhiYzk0LCAweDYwOGYsIDB4ZjBmMCwgMHg2MDQzLAorCTB4MDAwMiwgMHg3MDhiLCAweDAwMDEsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsIDB4NDgxYiwgMHgwODBjLAorCTB4NjU5MywgMHgwMDA1LCAweDAwZjYsIDB4NzA4MCwgMHhhMDg2LCAweDAwMTQsIDB4MTUwOCwgMHg2MDQzLAorCTB4MDAwMCwgMHg2MDIwLCAweGQwYjQsIDB4MTFlMCwgMHgyMDc5LCAweGIyODAsIDB4N2EzMCwgMHhhMjk2LAorCTB4MTEwMiwgMHgxMWEwLCAweDc4MzQsIDB4YTAwNSwgMHgxMTg4LCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LAorCTB4NzBiNCwgMHhhMDA1LCAweDExMTAsIDB4NzBiNywgMHgwMDAxLCAweDIwMTEsIDB4NDgxYiwgMHgwODBjLAorCTB4NjUwZCwgMHg3MDhiLCAweDAwMTAsIDB4MDgwYywgMHg0NTg0LCAweDAwMTAsIDB4MDgwYywgMHg0ODVlLAorCTB4MDBmZSwgMHgwMDA1LCAweDcwOGIsIDB4MDAwMywgMHg2MDQzLCAweDAwMDQsIDB4MjAxMSwgMHg0ODFiLAorCTB4MDgwYywgMHg2NTBkLCAweDA4MGMsIDB4NDhjNiwgMHgyMGEzLCAweDExMDIsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhOSwgMHgwMDBhLCAweDIwYTMsIDB4MDAwMCwgMHgxZjA0LCAweDQzYzIsIDB4NjBjMywgMHgwMDE0LAorCTB4MDgwYywgMHg0ODQ1LCAweDAwMDUsIDB4MDBmNiwgMHg3MDgwLCAweGEwMDUsIDB4MDFmMCwgMHgyMDExLAorCTB4NDgxYiwgMHgwODBjLCAweDY1MGQsIDB4YTA4NiwgMHgwMDE0LCAweDExYTgsIDB4MjA3OSwgMHhiMjgwLAorCTB4N2EzMCwgMHhhMjk2LCAweDExMDIsIDB4MTE3OCwgMHg3ODM0LCAweGEwMDUsIDB4MTE2MCwgMHg3YTM4LAorCTB4ZDJmYywgMHgwMTI4LCAweDcwYjQsIDB4YTAwNSwgMHgxMTEwLCAweDcwYjcsIDB4MDAwMSwgMHg3MDhiLAorCTB4MDAwNCwgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg0ODVlLCAweDAwZmUsIDB4MDAwNSwgMHg3MDhiLAorCTB4MDAwNSwgMHgwODBjLCAweDQ4YzYsIDB4MjBhMywgMHgxMTAzLCAweDIwYTMsIDB4MDAwMCwgMHgzNDMwLAorCTB4MjAxMSwgMHhiMjhlLCAweDA4MGMsIDB4NDkxNywgMHgxMTYwLCAweDcwNzQsIDB4YTAwNSwgMHgxMTQ4LAorCTB4NzE0YywgMHhhMTg2LCAweGZmZmYsIDB4MDEyOCwgMHgwODBjLCAweDQ3ZGYsIDB4MDExMCwgMHgwODBjLAorCTB4NDhmNSwgMHgyMGE5LCAweDAwMDgsIDB4MjI5OCwgMHgyNmEwLCAweDUzYTYsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAxNCwgMHgwODBjLCAweDQ4NDUsIDB4MDAwNSwgMHgwMGY2LAorCTB4NzA4MCwgMHhhMDA1LCAweDAxZjAsIDB4MjAxMSwgMHg0ODFiLCAweDA4MGMsIDB4NjUwZCwgMHhhMDg2LAorCTB4MDAxNCwgMHgxMWE4LCAweDIwNzksIDB4YjI4MCwgMHg3YTMwLCAweGEyOTYsIDB4MTEwMywgMHgxMTc4LAorCTB4NzgzNCwgMHhhMDA1LCAweDExNjAsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBiNCwgMHhhMDA1LAorCTB4MTExMCwgMHg3MGI3LCAweDAwMDEsIDB4NzA4YiwgMHgwMDA2LCAweDAwMjksIDB4MDAxMCwgMHgwODBjLAorCTB4NDg1ZSwgMHgwMGZlLCAweDAwMDUsIDB4NzA4YiwgMHgwMDA3LCAweDA4MGMsIDB4NDhjNiwgMHgyMGEzLAorCTB4MTEwNCwgMHgyMGEzLCAweDAwMDAsIDB4MzQzMCwgMHgyMDExLCAweGIyOGUsIDB4MDgwYywgMHg0OTE3LAorCTB4MTFhOCwgMHg3MDc0LCAweGEwMDUsIDB4MTE5MCwgMHg3MTU0LCAweGExODYsIDB4ZmZmZiwgMHgwMTcwLAorCTB4YTE4MCwgMHgyYmU2LCAweDIwMGQsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MDgwYywgMHg0N2RmLAorCTB4MDEyOCwgMHgwODBjLCAweDNlNjYsIDB4MDExMCwgMHgwODBjLCAweDI2YzAsIDB4MjBhOSwgMHgwMDA4LAorCTB4MjI5OCwgMHgyNmEwLCAweDUzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLAorCTB4MDAxNCwgMHgwODBjLCAweDQ4NDUsIDB4MDAwNSwgMHgwMGY2LCAweDcwODAsIDB4YTAwNSwgMHgwMWYwLAorCTB4MjAxMSwgMHg0ODFiLCAweDA4MGMsIDB4NjUwZCwgMHhhMDg2LCAweDAwMTQsIDB4MTFhOCwgMHgyMDc5LAorCTB4YjI4MCwgMHg3YTMwLCAweGEyOTYsIDB4MTEwNCwgMHgxMTc4LCAweDc4MzQsIDB4YTAwNSwgMHgxMTYwLAorCTB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBiNCwgMHhhMDA1LCAweDExMTAsIDB4NzBiNywgMHgwMDAxLAorCTB4NzA4YiwgMHgwMDA4LCAweDAwMjksIDB4MDAxMCwgMHgwODBjLCAweDQ4NWUsIDB4MDBmZSwgMHgwMDA1LAorCTB4NzA4YiwgMHgwMDA5LCAweDA4MGMsIDB4NDhjNiwgMHgyMGEzLCAweDExMDUsIDB4MjBhMywgMHgwMTAwLAorCTB4MzQzMCwgMHgwODBjLCAweDQ5MTcsIDB4MTE1MCwgMHg3MDc0LCAweGEwMDUsIDB4MTEzOCwgMHgwODBjLAorCTB4NDc1NCwgMHgxMTcwLCAweGEwODUsIDB4MDAwMSwgMHgwODBjLCAweDI2YzAsIDB4MjBhOSwgMHgwMDA4LAorCTB4MjA5OSwgMHhiMjhlLCAweDI2YTAsIDB4NTNhNiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NDg0NSwgMHgwMDEwLCAweDA4MGMsIDB4NDM2ZSwgMHgwMDA1LAorCTB4MDBmNiwgMHg3MDgwLCAweGEwMDUsIDB4MDU4OCwgMHgyMDExLCAweDQ4MWIsIDB4MDgwYywgMHg2NTBkLAorCTB4YTA4NiwgMHgwMDE0LCAweDE1NDAsIDB4MjA3OSwgMHhiMjgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTA1LAorCTB4MTUxMCwgMHg3ODM0LCAweDIwMTEsIDB4MDEwMCwgMHhhMjFlLCAweDExNjAsIDB4N2EzOCwgMHhkMmZjLAorCTB4MDEyOCwgMHg3MGI0LCAweGEwMDUsIDB4MTExMCwgMHg3MGI3LCAweDAwMDEsIDB4NzA4YiwgMHgwMDBhLAorCTB4MDBiMSwgMHgwMDk4LCAweGEwMDUsIDB4MTE3OCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGI0LAorCTB4YTAwNSwgMHgxMTEwLCAweDcwYjcsIDB4MDAwMSwgMHg3MDg3LCAweDAwMDAsIDB4NzA4YiwgMHgwMDBlLAorCTB4MDgwYywgMHg0NTY5LCAweDAwMTAsIDB4MDgwYywgMHg0ODVlLCAweDAwZmUsIDB4MDAwNSwgMHg3MDhiLAorCTB4MDAwYiwgMHgyMDExLCAweGIyMGUsIDB4MjJhMCwgMHgyMGE5LCAweDAwNDAsIDB4MjAxOSwgMHhmZmZmLAorCTB4NDNhNCwgMHgyMGE5LCAweDAwMDIsIDB4MjAwOSwgMHgwMDAwLCAweDQxYTQsIDB4MDgwYywgMHg0OGM2LAorCTB4MjBhMywgMHgxMTA2LCAweDIwYTMsIDB4MDAwMCwgMHgwODBjLCAweDQ5MTcsIDB4MDExOCwgMHgyMDEzLAorCTB4MDAwMCwgMHgwMDIwLCAweDcwNTAsIDB4YTA4NSwgMHgwMTAwLCAweDIwMTIsIDB4MjI5OCwgMHgyMGE5LAorCTB4MDA0MiwgMHg1M2E2LCAweDYwYzMsIDB4MDA4NCwgMHgwODBjLCAweDQ4NDUsIDB4MDAwNSwgMHgwMGY2LAorCTB4NzA4MCwgMHhhMDA1LCAweDAxYjAsIDB4MjAxMSwgMHg0ODFiLCAweDA4MGMsIDB4NjUwZCwgMHhhMDg2LAorCTB4MDA4NCwgMHgxMTY4LCAweDIwNzksIDB4YjI4MCwgMHg3YTMwLCAweGEyOTYsIDB4MTEwNiwgMHgxMTM4LAorCTB4NzgzNCwgMHhhMDA1LCAweDExMjAsIDB4NzA4YiwgMHgwMDBjLCAweDAwMjksIDB4MDAxMCwgMHgwODBjLAorCTB4NDg1ZSwgMHgwMGZlLCAweDAwMDUsIDB4NzA4YiwgMHgwMDBkLCAweDA4MGMsIDB4NDhjNiwgMHgyMGEzLAorCTB4MTEwNywgMHgyMGEzLCAweDAwMDAsIDB4MjA5OSwgMHhiMjhlLCAweDIwYTksIDB4MDA0MCwgMHg1M2E2LAorCTB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwODQsIDB4MDgwYywgMHg0ODQ1LAorCTB4MDAwNSwgMHgwMGY2LCAweDcwODAsIDB4YTAwNSwgMHgwMWQwLCAweDIwMTEsIDB4NDgxYiwgMHgwODBjLAorCTB4NjUwZCwgMHhhMDg2LCAweDAwODQsIDB4MTE4OCwgMHgyMDc5LCAweGIyODAsIDB4N2EzMCwgMHhhMjk2LAorCTB4MTEwNywgMHgxMTU4LCAweDc4MzQsIDB4YTAwNSwgMHgxMTQwLCAweDcwODcsIDB4MDAwMSwgMHgwODBjLAorCTB4NDhiOCwgMHg3MDhiLCAweDAwMGUsIDB4MDAyOSwgMHgwMDEwLCAweDA4MGMsIDB4NDg1ZSwgMHgwMGZlLAorCTB4MDAwNSwgMHg3MDhiLCAweDAwMGYsIDB4NzA4MywgMHgwMDAwLCAweDYwOGIsIDB4YmM4NSwgMHg2MDhmLAorCTB4YjViNSwgMHg2MDQzLCAweDAwMDUsIDB4NjA0MywgMHgwMDA0LCAweDIwMDksIDB4MDdkMCwgMHgyMDExLAorCTB4NDgxYiwgMHgwODBjLCAweDY1MDEsIDB4MDAwNSwgMHg3MDgwLCAweGEwMDUsIDB4MDEyMCwgMHgyMDExLAorCTB4NDgxYiwgMHgwODBjLCAweDY1MGQsIDB4MDAwNSwgMHg3MDhiLCAweDAwMTEsIDB4MDgwYywgMHg0OTE3LAorCTB4MTE4OCwgMHg3MTZjLCAweDgxZmYsIDB4MDE3MCwgMHgyMDA5LCAweDAwMDAsIDB4NzA3MCwgMHhhMDg0LAorCTB4MDBmZiwgMHgwODBjLCAweDI2NzYsIDB4YTE4NiwgMHgwMDgwLCAweDAxMjAsIDB4MjAxMSwgMHhiMjhlLAorCTB4MDgwYywgMHg0N2RmLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4MjA5OSwgMHhiMjgwLAorCTB4MjBhMSwgMHgwMjBiLCAweDc0ODAsIDB4YTQ4MCwgMHgwMDE4LCAweGEwODAsIDB4MDAwNywgMHhhMDg0LAorCTB4MDNmOCwgMHg4MDA0LCAweDIwYTgsIDB4NTNhNiwgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg0ODQ1LAorCTB4MDAwNSwgMHgwMGY2LCAweDcwODAsIDB4YTAwNSwgMHgwMWYwLCAweDIwMTEsIDB4NDgxYiwgMHgwODBjLAorCTB4NjUwZCwgMHhhMDg2LCAweDAwMTQsIDB4MTFhOCwgMHgyMDc5LCAweGIyODAsIDB4N2EzMCwgMHhhMjk2LAorCTB4MTEwMywgMHgxMTc4LCAweDc4MzQsIDB4YTAwNSwgMHgxMTYwLCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LAorCTB4NzBiNCwgMHhhMDA1LCAweDExMTAsIDB4NzBiNywgMHgwMDAxLCAweDcwOGIsIDB4MDAxMiwgMHgwMDI5LAorCTB4MDAxMCwgMHgwODBjLCAweDQ4NWUsIDB4MDBmZSwgMHgwMDA1LCAweDcwOGIsIDB4MDAxMywgMHgwODBjLAorCTB4NDhkMiwgMHgyMGEzLCAweDExMDMsIDB4MjBhMywgMHgwMDAwLCAweDM0MzAsIDB4MjAxMSwgMHhiMjhlLAorCTB4MDgwYywgMHg0OTE3LCAweDExNjAsIDB4NzA3NCwgMHhhMDA1LCAweDExNDgsIDB4NzE0YywgMHhhMTg2LAorCTB4ZmZmZiwgMHgwMTI4LCAweDA4MGMsIDB4NDdkZiwgMHgwMTEwLCAweDA4MGMsIDB4NDhmNSwgMHgyMGE5LAorCTB4MDAwOCwgMHgyMjk4LCAweDI2YTAsIDB4NTNhNiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NDg0NSwgMHgwMDA1LCAweDAwZjYsIDB4NzA4MCwgMHhhMDA1LAorCTB4MDFmMCwgMHgyMDExLCAweDQ4MWIsIDB4MDgwYywgMHg2NTBkLCAweGEwODYsIDB4MDAxNCwgMHgxMWE4LAorCTB4MjA3OSwgMHhiMjgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTA0LCAweDExNzgsIDB4NzgzNCwgMHhhMDA1LAorCTB4MTE2MCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGI0LCAweGEwMDUsIDB4MTExMCwgMHg3MGI3LAorCTB4MDAwMSwgMHg3MDhiLCAweDAwMTQsIDB4MDAyOSwgMHgwMDEwLCAweDA4MGMsIDB4NDg1ZSwgMHgwMGZlLAorCTB4MDAwNSwgMHg3MDhiLCAweDAwMTUsIDB4MDgwYywgMHg0OGQyLCAweDIwYTMsIDB4MTEwNCwgMHgyMGEzLAorCTB4MDAwMCwgMHgzNDMwLCAweDIwMTEsIDB4YjI4ZSwgMHgwODBjLCAweDQ5MTcsIDB4MTFhOCwgMHg3MDc0LAorCTB4YTAwNSwgMHgxMTkwLCAweDcxNTQsIDB4YTE4NiwgMHhmZmZmLCAweDAxNzAsIDB4YTE4MCwgMHgyYmU2LAorCTB4MjAwZCwgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHgwODBjLCAweDQ3ZGYsIDB4MDEyOCwgMHgwODBjLAorCTB4M2U2NiwgMHgwMTEwLCAweDA4MGMsIDB4MjZjMCwgMHgyMGE5LCAweDAwMDgsIDB4MjI5OCwgMHgyNmEwLAorCTB4NTNhNiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAxNCwgMHgwODBjLAorCTB4NDg0NSwgMHgwMDA1LCAweDAwZjYsIDB4NzA4MCwgMHhhMDA1LCAweDA1YjgsIDB4MjAxMSwgMHg0ODFiLAorCTB4MDgwYywgMHg2NTBkLCAweGEwODYsIDB4MDAxNCwgMHgxNTcwLCAweDIwNzksIDB4YjI4MCwgMHg3YTMwLAorCTB4YTI5NiwgMHgxMTA1LCAweDE1NDAsIDB4NzgzNCwgMHgyMDExLCAweDAxMDAsIDB4YTIxZSwgMHgxMTQ4LAorCTB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBiNCwgMHhhMDA1LCAweDExMTAsIDB4NzBiNywgMHgwMDAxLAorCTB4MDA2MCwgMHhhMDA1LCAweDExYzAsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBiNCwgMHhhMDA1LAorCTB4MTExMCwgMHg3MGI3LCAweDAwMDEsIDB4NzA4NywgMHgwMDAwLCAweDdhMzgsIDB4ZDJmNCwgMHgwMTM4LAorCTB4MjAwMSwgMHhhZDczLCAweDIwMDQsIDB4ZDBhNCwgMHgxMTEwLCAweDcwZDMsIDB4MDAwOCwgMHg3MDhiLAorCTB4MDAxNiwgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg0ODVlLCAweDAwZmUsIDB4MDAwNSwgMHgyMGUxLAorCTB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4MjA5OSwgMHhiMjgwLCAweDIwYTEsIDB4MDIwYiwgMHgyMGE5LAorCTB4MDAwZSwgMHg1M2E2LCAweDM0MzAsIDB4MjAxMSwgMHhiMjhlLCAweDcwOGIsIDB4MDAxNywgMHgwODBjLAorCTB4NDkxNywgMHgxMTUwLCAweDcwNzQsIDB4YTAwNSwgMHgxMTM4LCAweDA4MGMsIDB4NDc1NCwgMHgxMTcwLAorCTB4YTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4MjZjMCwgMHgyMGE5LCAweDAwMDgsIDB4MjA5OSwgMHhiMjhlLAorCTB4MjZhMCwgMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LAorCTB4MDgwYywgMHg0ODQ1LCAweDAwMTAsIDB4MDgwYywgMHg0MzZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDgwLAorCTB4YTAwNSwgMHgwMWIwLCAweDIwMTEsIDB4NDgxYiwgMHgwODBjLCAweDY1MGQsIDB4YTA4NiwgMHgwMDg0LAorCTB4MTE2OCwgMHgyMDc5LCAweGIyODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDYsIDB4MTEzOCwgMHg3ODM0LAorCTB4YTAwNSwgMHgxMTIwLCAweDcwOGIsIDB4MDAxOCwgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg0ODVlLAorCTB4MDBmZSwgMHgwMDA1LCAweDcwOGIsIDB4MDAxOSwgMHgwODBjLCAweDQ4ZDIsIDB4MjBhMywgMHgxMTA2LAorCTB4MjBhMywgMHgwMDAwLCAweDM0MzAsIDB4MjA5OSwgMHhiMjhlLCAweDIwMzksIDB4YjIwZSwgMHgyN2EwLAorCTB4MjBhOSwgMHgwMDQwLCAweDUzYTMsIDB4MDgwYywgMHg0OTE3LCAweDExZTgsIDB4MjcyOCwgMHgyNTE0LAorCTB4ODIwNywgMHhhMDg0LCAweDAwZmYsIDB4ODAwMCwgMHgyMDE4LCAweGEyOTQsIDB4MDBmZiwgMHg4MDA3LAorCTB4YTIwNSwgMHgyMDJhLCAweDcwNTAsIDB4MjMxMCwgMHg4MjE0LCAweGEyYTAsIDB4YjIwZSwgMHgyNDE0LAorCTB4YTM4YywgMHgwMDAxLCAweDAxMTgsIDB4YTI5NCwgMHhmZjAwLCAweDAwMTgsIDB4YTI5NCwgMHgwMGZmLAorCTB4ODAwNywgMHhhMjE1LCAweDIyMjIsIDB4Mjc5OCwgMHgyNmEwLCAweDIwYTksIDB4MDA0MCwgMHg1M2E2LAorCTB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwODQsIDB4MDgwYywgMHg0ODQ1LAorCTB4MDAwNSwgMHgwMGY2LCAweDcwODAsIDB4YTAwNSwgMHgwMWQwLCAweDIwMTEsIDB4NDgxYiwgMHgwODBjLAorCTB4NjUwZCwgMHhhMDg2LCAweDAwODQsIDB4MTE4OCwgMHgyMDc5LCAweGIyODAsIDB4N2EzMCwgMHhhMjk2LAorCTB4MTEwNywgMHgxMTU4LCAweDc4MzQsIDB4YTAwNSwgMHgxMTQwLCAweDcwODcsIDB4MDAwMSwgMHgwODBjLAorCTB4NDhiOCwgMHg3MDhiLCAweDAwMWEsIDB4MDAyOSwgMHgwMDEwLCAweDA4MGMsIDB4NDg1ZSwgMHgwMGZlLAorCTB4MDAwNSwgMHg3MDhiLCAweDAwMWIsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMDk5LAorCTB4YjI4MCwgMHgyMGExLCAweDAyMGIsIDB4NzQ4MCwgMHhhNDgwLCAweDAwMTgsIDB4YTA4MCwgMHgwMDA3LAorCTB4YTA4NCwgMHgwM2Y4LCAweDgwMDQsIDB4MjBhOCwgMHg1M2E2LCAweDYwYzMsIDB4MDA4NCwgMHgwODBjLAorCTB4NDg0NSwgMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHgwMDg2LCAweDAwOTYsIDB4MjAyOSwgMHhhZDUyLAorCTB4MjUyYywgMHgyMGE5LCAweDAwMDgsIDB4MjA0MSwgMHhiMjBlLCAweDI4YTAsIDB4MjA5OSwgMHhiMjhlLAorCTB4NTNhMywgMHgyMGE5LCAweDAwMDgsIDB4MjAxMSwgMHgwMDA3LCAweGQ1ZDQsIDB4MDExMCwgMHgyMDExLAorCTB4MDAwMCwgMHgyODAwLCAweGEyMDAsIDB4MjAwYywgMHhhMWE2LCAweGZmZmYsIDB4MTE0OCwgMHhkNWQ0LAorCTB4MDExMCwgMHg4MjEwLCAweDAwMDgsIDB4ODIxMSwgMHgxZjA0LCAweDQ3NjksIDB4MDgwNCwgMHg0N2Q3LAorCTB4ODJmZiwgMHgxMTYwLCAweGQ1ZDQsIDB4MDEyMCwgMHhhMWE2LCAweDNmZmYsIDB4MGQ5MCwgMHgwMDIwLAorCTB4YTFhNiwgMHgzZmZmLCAweDA5MDQsIDB4NDdkNywgMHhhMThkLCAweGMwMDAsIDB4MjBhOSwgMHgwMDEwLAorCTB4MjAxOSwgMHgwMDAxLCAweGQ1ZDQsIDB4MDExMCwgMHgyMDE5LCAweDAwMTAsIDB4MjEyMCwgMHhkNWQ0LAorCTB4MDExMCwgMHg4NDIzLCAweDAwMDgsIDB4ODQyNCwgMHgxMjQwLCAweGQ1ZDQsIDB4MDExMCwgMHg4MzE5LAorCTB4MDAwOCwgMHg4MzE4LCAweDFmMDQsIDB4NDc4ZiwgMHgwNGQwLCAweDIzYTgsIDB4MjAyMSwgMHgwMDAxLAorCTB4ODQyNiwgMHg4NDI1LCAweDFmMDQsIDB4NDdhMSwgMHgyMzI4LCAweDg1MjksIDB4YTJiZSwgMHgwMDA3LAorCTB4MDE1OCwgMHgwMDA2LCAweDIwMzksIDB4MDAwNywgMHgyMjAwLCAweGE3M2EsIDB4MDAwZSwgMHgyN2E4LAorCTB4YTVhOCwgMHgwMDEwLCAweDFmMDQsIDB4NDdiMCwgMHg3NTRlLCAweGE1YzgsIDB4MmJlNiwgMHgyOTJkLAorCTB4YTVhYywgMHgwMGZmLCAweDc1NzIsIDB4NjUzMiwgMHg2NTM2LCAweDAwMTYsIDB4MjUwOCwgMHgwODBjLAorCTB4MjZhMCwgMHgwMDFlLCAweDYwZTcsIDB4MDAwMCwgMHg2NWVhLCAweDIwMTgsIDB4MjMwNCwgMHhhNDA1LAorCTB4MjAxYSwgMHg3MDc3LCAweDAwMDEsIDB4MjZhMCwgMHgyODk4LCAweDIwYTksIDB4MDAwOCwgMHg1M2E2LAorCTB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHhhMDg1LCAweDAwMDEsIDB4MDAyOCwgMHhhMDA2LAorCTB4MDAxOCwgMHhhMDA2LCAweDA4MGMsIDB4MTRmNiwgMHgwMDllLCAweDAwOGUsIDB4MDAwNSwgMHgyMTE4LAorCTB4MjAyMSwgMHgwMDAwLCAweDIwMDEsIDB4MDAwNywgMHhhMzlhLCAweDAwMTAsIDB4MDIxOCwgMHg4NDIwLAorCTB4ODAwMSwgMHgwY2QwLCAweDIxMTgsIDB4ODRmZiwgMHgwMTIwLCAweGEzOWEsIDB4MDAxMCwgMHg4NDIxLAorCTB4MWRlMCwgMHgyMDIxLCAweDAwMDEsIDB4ODNmZiwgMHgwMTE4LCAweDg0MjMsIDB4ODMxOSwgMHgxZGU4LAorCTB4YTIzOCwgMHgyNzA0LCAweGE0MmMsIDB4MTFiOCwgMHhhNDA1LCAweDIwM2EsIDB4NzE0ZSwgMHhhMWEwLAorCTB4MmJlNiwgMHgyNDJkLCAweGE1YWMsIDB4MDBmZiwgMHg3NTcyLCAweDY1MzIsIDB4NjUzNiwgMHgwMDE2LAorCTB4MjUwOCwgMHgwODBjLCAweDI2YTAsIDB4MDAxZSwgMHg2MGU3LCAweDAwMDAsIDB4NjVlYSwgMHg3MDc3LAorCTB4MDAwMSwgMHhhMDg0LCAweDAwMDAsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4YWQwMCwgMHg3MDdiLAorCTB4MDAwMCwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHgyMDcxLAorCTB4MDE0MCwgMHgwODBjLCAweDc4MzQsIDB4NzAwNCwgMHhhMDg0LCAweDQwMDAsIDB4MDEyMCwgMHg3MDAzLAorCTB4MTAwMCwgMHg3MDAzLCAweDAwMDAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhZDIyLAorCTB4MjA3MywgMHgwMDAwLCAweDc4NDAsIDB4MDAyNiwgMHgwMDE2LCAweDIwMDksIDB4MDBmNywgMHgwODBjLAorCTB4NDhkZSwgMHgwMDFlLCAweGEwOTQsIDB4MDAxMCwgMHhhMjg1LCAweDAwODAsIDB4Nzg0MiwgMHg3YTQyLAorCTB4MDAyZSwgMHgwMTJlLCAweDAwZmUsIDB4MDBlZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjAxMSwgMHhhZmQxLCAweDIwMTMsIDB4MDAwMCwgMHg3MDgzLCAweDAwMDAsIDB4MDEyZSwgMHgyMGUxLAorCTB4OTA4MCwgMHg2MGEzLCAweDAwNTYsIDB4NjBhNywgMHg5NTc1LCAweDA4MGMsIDB4NzgyYiwgMHgyMDA5LAorCTB4MDdkMCwgMHgyMDExLCAweDQ4MWIsIDB4MDgwYywgMHg2NTkzLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LAorCTB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDA5LCAweDAwZjcsIDB4MDgwYywgMHg0OGRlLAorCTB4MjA2MSwgMHhhZmRhLCAweDYwMWIsIDB4MDAwMCwgMHg2MDFmLCAweDAwMDAsIDB4MjA2MSwgMHhhZDAwLAorCTB4NjAwMywgMHgwMDAxLCAweDIwNjEsIDB4MDEwMCwgMHg2MDQzLCAweDAwOTAsIDB4NjA0MywgMHgwMDEwLAorCTB4MjAwOSwgMHgwMDJkLCAweDIwMTEsIDB4NDg4MywgMHgwODBjLCAweDY1MDEsIDB4MDEyZSwgMHgwMGNlLAorCTB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBlNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA3MSwgMHgwMTAwLCAweDA4MGMsIDB4NzgzNCwgMHgyMDcxLCAweDAxNDAsIDB4NzAwNCwgMHhhMDg0LAorCTB4NDAwMCwgMHgwMTIwLCAweDcwMDMsIDB4MTAwMCwgMHg3MDAzLCAweDAwMDAsIDB4MDgwYywgMHg1NzU3LAorCTB4MDFhOCwgMHgwODBjLCAweDU3NzUsIDB4MTE5MCwgMHgyMDAxLCAweGFmOWQsIDB4MjAwMywgMHhhYWFhLAorCTB4MDAxNiwgMHgwODBjLCAweDI3NDQsIDB4MjAwMSwgMHhhZjhlLCAweDIxMDIsIDB4MDAxZSwgMHgyMDAxLAorCTB4YWY5ZSwgMHgyMDAzLCAweDAwMDAsIDB4MDgwYywgMHg1NjlhLCAweDAwMzAsIDB4MjAwMSwgMHgwMDAxLAorCTB4MDgwYywgMHgyNjFlLCAweDA4MGMsIDB4NDg1ZSwgMHgwMTJlLCAweDAwMGUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MjBhOSwgMHgwMDQwLCAweDIwYTEsIDB4YjNjMCwgMHgyMDk5LCAweGIyOGUsIDB4MzMwNCwgMHg4MDA3LAorCTB4MjBhMiwgMHg5Mzk4LCAweDk0YTAsIDB4MWYwNCwgMHg0OGJlLCAweDAwMDUsIDB4MjBlMSwgMHg5MDgwLAorCTB4MjBlMSwgMHg0MDAwLCAweDIwOTksIDB4YjIwMCwgMHgyMGExLCAweDAyMGIsIDB4MjBhOSwgMHgwMDBjLAorCTB4NTNhNiwgMHgwMDA1LCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4MjA5OSwgMHhiMjgwLAorCTB4MjBhMSwgMHgwMjBiLCAweDIwYTksIDB4MDAwYywgMHg1M2E2LCAweDAwMDUsIDB4MDBjNiwgMHgwMDA2LAorCTB4MjA2MSwgMHgwMTAwLCAweDgxMGYsIDB4MjAwMSwgMHhhZDMwLCAweDIwMDQsIDB4YTAwNSwgMHgxMTM4LAorCTB4MjAwMSwgMHhhZDE0LCAweDIwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGExMDUsIDB4MDAxMCwgMHhhMTg1LAorCTB4MDBmNywgMHg2MDRhLCAweDAwMGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwMTYsIDB4MDA0NiwgMHgyMDAxLAorCTB4YWQ1MiwgMHgyMDA0LCAweGQwYTQsIDB4MDE1OCwgMHhhMDA2LCAweDIwMjAsIDB4MjAwOSwgMHgwMDJhLAorCTB4MDgwYywgMHhhOTZjLCAweDIwMDEsIDB4YWQwYywgMHgyMDBjLCAweGMxOTUsIDB4MjEwMiwgMHgyMDE5LAorCTB4MDAyYSwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHgyYWFjLCAweDAwNGUsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDgwYywgMHg0ODVlLCAweDcwOGIsIDB4MDAwMCwgMHg3MDgzLCAweDAwMDAsIDB4MDAwNSwgMHgwMDA2LAorCTB4MjAwMSwgMHhhZDBjLCAweDIwMDQsIDB4ZDA5YywgMHgwMTAwLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LAorCTB4MDAxNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDAxLCAweDAxMDEsIDB4MjAwYywgMHhhMThkLAorCTB4MDAwNiwgMHgyMTAyLCAweDAxMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDE1NiwgMHgyMGE5LAorCTB4MDBmZiwgMHgyMDA5LCAweGFlMzQsIDB4YTAwNiwgMHgyMDBhLCAweDgxMDgsIDB4MWYwNCwgMHg0OTM0LAorCTB4MDE1ZSwgMHgwMDA1LCAweDAwZDYsIDB4MDAzNiwgMHgwMTU2LCAweDAxMzYsIDB4MDE0NiwgMHgyMDY5LAorCTB4YWQ1MSwgMHhhMDA2LCAweDYwMDIsIDB4NjAwNywgMHgwNzA3LCAweDYwMGEsIDB4NjAwZSwgMHg2MDEyLAorCTB4YTE5OCwgMHgyYmU2LCAweDIzMWQsIDB4YTM5YywgMHgwMGZmLCAweDYzMTYsIDB4MjBhOSwgMHgwMDA0LAorCTB4YWM5OCwgMHgwMDA2LCAweDIzYTAsIDB4NDBhNCwgMHgyMGE5LCAweDAwMDQsIDB4YWM5OCwgMHgwMDBhLAorCTB4MjNhMCwgMHg0MGE0LCAweDYwM2UsIDB4NjA0MiwgMHg2MDRlLCAweDYwNTIsIDB4NjA1NiwgMHg2MDVhLAorCTB4NjA1ZSwgMHg2MDYyLCAweDYwNjYsIDB4NjA2YSwgMHg2MDZlLCAweDYwNzIsIDB4NjA3NiwgMHg2MDdhLAorCTB4NjA3ZSwgMHg2MDgyLCAweDYwODYsIDB4NjA4YSwgMHg2MDhlLCAweDYwOTIsIDB4NjA5NiwgMHg2MDlhLAorCTB4NjA5ZSwgMHg2MGFlLCAweDYxYTIsIDB4MDBkNiwgMHg2MGE0LCAweGEwNmQsIDB4MDExMCwgMHgwODBjLAorCTB4MTVmMCwgMHg2MGE3LCAweDAwMDAsIDB4NjBhOCwgMHhhMDZkLCAweDAxMTAsIDB4MDgwYywgMHgxNWYwLAorCTB4NjBhYiwgMHgwMDAwLCAweDAwZGUsIDB4YTAwNiwgMHg2MDRhLCAweDY4MTAsIDB4NjAzYSwgMHg2ODBjLAorCTB4NjA0NiwgMHg2ODE0LCAweGEwODQsIDB4MDBmZiwgMHg2MDQyLCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLAorCTB4MDAzZSwgMHgwMGRlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4Njk0NCwgMHg2ZTQ4LAorCTB4YTY4NCwgMHgzZmZmLCAweGEwODIsIDB4NDAwMCwgMHgxYTA0LCAweDRhNDksIDB4YTE4YywgMHhmZjAwLAorCTB4ODEwZiwgMHhhMTgyLCAweDAwZmYsIDB4MWEwNCwgMHg0YTRlLCAweDIwMDEsIDB4YWQwYywgMHgyMDA0LAorCTB4YTA4NCwgMHgwMDAzLCAweDAxYzAsIDB4MjAwMSwgMHhhZDBjLCAweDIwMDQsIDB4ZDA4NCwgMHgxOTA0LAorCTB4NGEzMSwgMHhhMTg4LCAweGFlMzQsIDB4MjEwNCwgMHhhMDY1LCAweDA5MDQsIDB4NGEzMSwgMHg2MDA0LAorCTB4YTA4NCwgMHgwMGZmLCAweGEwOGUsIDB4MDAwNiwgMHgxOTA0LCAweDRhMzEsIDB4NjAwMCwgMHhkMGM0LAorCTB4MDkwNCwgMHg0YTMxLCAweDAwNjgsIDB4YTE4OCwgMHhhZTM0LCAweDIxMDQsIDB4YTA2NSwgMHgwOTA0LAorCTB4NGExNSwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDhlLCAweDAwMDYsIDB4MTkwNCwgMHg0YTFhLAorCTB4NjBhNCwgMHhhMDBkLCAweDAxMTgsIDB4MDgwYywgMHg0ZWY5LCAweDA1ZDAsIDB4NjBhOCwgMHhhMDBkLAorCTB4MDE4OCwgMHgwODBjLCAweDRmNDMsIDB4MTE3MCwgMHg2OTRjLCAweGQxZmMsIDB4MTExOCwgMHgwODBjLAorCTB4NGMxMSwgMHgwNDQ4LCAweDA4MGMsIDB4NGJkMywgMHg2OTRjLCAweGQxZWMsIDB4MTUyMCwgMHgwODBjLAorCTB4NGRlZCwgMHgwNDA4LCAweDY5NGMsIDB4YTE4NCwgMHhhMDAwLCAweDAxNzgsIDB4ZDFlYywgMHgwMTQwLAorCTB4ZDFmYywgMHgwMTE4LCAweDA4MGMsIDB4NGRmYywgMHgwMDI4LCAweDA4MGMsIDB4NGRmYywgMHgwMDI4LAorCTB4ZDFmYywgMHgwMTE4LCAweDA4MGMsIDB4NGJkMywgMHgwMDcwLCAweDYwNTAsIDB4YTAwZCwgMHgwMTMwLAorCTB4MmQwMCwgMHgyMDBhLCAweDY4MDMsIDB4MDAwMCwgMHg2MDUyLCAweDAwMjgsIDB4MmQwMCwgMHg2MDUyLAorCTB4NjA0ZSwgMHg2ODAzLCAweDAwMDAsIDB4MDgwYywgMHg2N2M1LCAweGEwMDYsIDB4MDEyZSwgMHgwMDA1LAorCTB4MjAwMSwgMHgwMDA1LCAweDIwMDksIDB4MDAwMCwgMHgwNGU4LCAweDIwMDEsIDB4MDAyOCwgMHgyMDA5LAorCTB4MDAwMCwgMHgwNGMwLCAweGEwODIsIDB4MDAwNiwgMHgxMmEwLCAweDIwMDEsIDB4YWQzNCwgMHgyMDA0LAorCTB4ZDBhYywgMHgxMTYwLCAweDYwYTAsIDB4ZDBiYywgMHgxMTQ4LCAweDYxMDAsIDB4ZDFmYywgMHgwOTA0LAorCTB4NDlkMCwgMHgyMDAxLCAweDAwMjksIDB4MjAwOSwgMHgxMDAwLCAweDA0MjAsIDB4MjAwMSwgMHgwMDI4LAorCTB4MDBhOCwgMHgyMDA5LCAweGFkMGMsIDB4MjEwYywgMHhkMThjLCAweDAxMTgsIDB4MjAwMSwgMHgwMDA0LAorCTB4MDA2OCwgMHhkMTg0LCAweDAxMTgsIDB4MjAwMSwgMHgwMDA0LCAweDAwNDAsIDB4MjAwMSwgMHgwMDI5LAorCTB4NjEwMCwgMHhkMWZjLCAweDAxMTgsIDB4MjAwOSwgMHgxMDAwLCAweDAwNjAsIDB4MjAwOSwgMHgwMDAwLAorCTB4MDA0OCwgMHgyMDAxLCAweDAwMjksIDB4MjAwOSwgMHgwMDAwLCAweDAwMjAsIDB4MjAwMSwgMHgwMDI5LAorCTB4MjAwOSwgMHgwMDAwLCAweGEwMDUsIDB4MDEyZSwgMHgwMDA1LCAweDAwZTYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg2ODQ0LCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLCAweDIwMDgsIDB4YTE4MiwgMHgwMGZmLAorCTB4MWEwNCwgMHg0YWE4LCAweGExODgsIDB4YWUzNCwgMHgyMTA0LCAweGEwNjUsIDB4MDFjMCwgMHg2MDA0LAorCTB4YTA4NCwgMHgwMGZmLCAweGEwOGUsIDB4MDAwNiwgMHgxMWE4LCAweDJjNzAsIDB4MDgwYywgMHg4MDIyLAorCTB4MDVlOCwgMHgyZTAwLCAweDYwMWEsIDB4MmQwMCwgMHg2MDEyLCAweDYwMGIsIDB4ZmZmZiwgMHg2MDFmLAorCTB4MDAwYSwgMHgyMDA5LCAweDAwMDMsIDB4MDgwYywgMHg4MGE3LCAweGEwMDYsIDB4MDQ2MCwgMHgyMDAxLAorCTB4MDAyOCwgMHgwNDQwLCAweGEwODIsIDB4MDAwNiwgMHgxMjk4LCAweDIwMDEsIDB4YWQzNCwgMHgyMDA0LAorCTB4ZDBhYywgMHgxMTU4LCAweDYwYTAsIDB4ZDBiYywgMHgxMTQwLCAweDYxMDAsIDB4ZDFmYywgMHgwOWU4LAorCTB4MjAwMSwgMHgwMDI5LCAweDIwMDksIDB4MTAwMCwgMHgwMGE4LCAweDIwMDEsIDB4MDAyOCwgMHgwMDkwLAorCTB4MjAwOSwgMHhhZDBjLCAweDIxMGMsIDB4ZDE4YywgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDUwLAorCTB4ZDE4NCwgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDI4LCAweDIwMDEsIDB4MDAyOSwgMHgwMDEwLAorCTB4MjAwMSwgMHgwMDI5LCAweGEwMDUsIDB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4MjAwMSwgMHgwMDJjLAorCTB4MGNjOCwgMHgwMGY2LCAweDAwZTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAxMSwgMHgwMDAwLAorCTB4MjA3OSwgMHhhZDAwLCAweDY5NDQsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE4MiwgMHgwMGZmLAorCTB4MWEwNCwgMHg0Yjc3LCAweDIwMDEsIDB4YWQwYywgMHgyMDA0LCAweGEwODQsIDB4MDAwMywgMHgxOTA0LAorCTB4NGI2NSwgMHgwODBjLCAweDRjZGMsIDB4MTE4MCwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDgyLAorCTB4MDAwNiwgMHgxMjUwLCAweDIwMDEsIDB4YWQzNCwgMHgyMDA0LCAweGQwYWMsIDB4MTkwNCwgMHg0YjYwLAorCTB4NjBhMCwgMHhkMGJjLCAweDE5MDQsIDB4NGI2MCwgMHg2ODY0LCAweGEwYzYsIDB4MDA2ZiwgMHgwMTE4LAorCTB4MjAwOCwgMHgwODA0LCAweDRiMjgsIDB4Njk2OCwgMHgyMTQwLCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLAorCTB4NzhkMCwgMHhkMGFjLCAweDExMTgsIDB4YTE4MiwgMHgwMDgwLCAweDA2ZDAsIDB4YTE4MiwgMHgwMGZmLAorCTB4MTZiOCwgMHg2YTcwLCAweDZiNmMsIDB4Nzg2YywgMHhhMzA2LCAweDExNjAsIDB4Nzg3MCwgMHhhMjRlLAorCTB4MTExOCwgMHgyMjA4LCAweDIzMTAsIDB4MDQ2MCwgMHhhOWNjLCAweGZmMDAsIDB4MTExOCwgMHgyMjA4LAorCTB4MjMxMCwgMHgwNDMwLCAweDA4MGMsIDB4M2I1OCwgMHgyYzcwLCAweDA1NTAsIDB4MjAwOSwgMHgwMDAwLAorCTB4MjAxMSwgMHgwMDAwLCAweGEwYzYsIDB4NDAwMCwgMHgxMTYwLCAweDAwMDYsIDB4MmU2MCwgMHgwODBjLAorCTB4NGY2ZSwgMHgxMTA4LCAweGMxODUsIDB4NzAwMCwgMHhkMGJjLCAweDAxMDgsIDB4YzE4ZCwgMHgwMDBlLAorCTB4MDA4OCwgMHhhMGM2LCAweDQwMDcsIDB4MTExMCwgMHgyNDA4LCAweDAwNjAsIDB4YTBjNiwgMHg0MDA4LAorCTB4MTExOCwgMHgyNzA4LCAweDI2MTAsIDB4MDAzMCwgMHhhMGM2LCAweDQwMDksIDB4MTEwOCwgMHgwMDEwLAorCTB4MjAwMSwgMHg0MDA2LCAweDY4NjYsIDB4Njk2YSwgMHg2YTZlLCAweDIwMDEsIDB4MDAzMCwgMHgwNDU4LAorCTB4MDgwYywgMHg4MDIyLCAweDExMzgsIDB4MjAwMSwgMHg0MDA1LCAweDIwMDksIDB4MDAwMywgMHgyMDExLAorCTB4MDAwMCwgMHgwYzgwLCAweDJlMDAsIDB4NjAxYSwgMHgwODBjLCAweDk5NTYsIDB4MmQwMCwgMHg2MDEyLAorCTB4NjAxZiwgMHgwMDAxLCAweGEwMDYsIDB4ZDg4YywgMHgwMTEwLCAweDIwMDEsIDB4NDAwMCwgMHg2ODNhLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHgyYWQ5LCAweDAxMmUsIDB4MjAwMSwgMHgwMDAwLAorCTB4MDgwYywgMHg0YzFlLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDRjMzAsIDB4MjAwOSwgMHgwMDAyLAorCTB4MDgwYywgMHg4MGE3LCAweGEwMDYsIDB4YTAwNSwgMHgwMTJlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LAorCTB4MjAwMSwgMHgwMDI4LCAweDIwMDksIDB4MDAwMCwgMHgwY2IwLCAweDIwMDksIDB4YWQwYywgMHgyMTBjLAorCTB4ZDE4YywgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDM4LCAweGQxODQsIDB4MDExOCwgMHgyMDAxLAorCTB4MDAwNCwgMHgwMDEwLCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LCAweDAwMDAsIDB4MGMyMCwgMHgyMDAxLAorCTB4MDAyOSwgMHgyMDA5LCAweDAwMDAsIDB4MDhmOCwgMHg2OTQ0LCAweDZlNDgsIDB4YTY4NCwgMHgzZmZmLAorCTB4YTA4MiwgMHg0MDAwLCAweDE2YjgsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE4MiwgMHgwMGZmLAorCTB4MTJlMCwgMHhhMTg4LCAweGFlMzQsIDB4MjEwNCwgMHhhMDY1LCAweDAxYjgsIDB4NjAwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDhlLCAweDAwMDYsIDB4MTFiMCwgMHg2ODRjLCAweGQwZWMsIDB4MDEyMCwgMHgwODBjLAorCTB4NGRmYywgMHgwNGM5LCAweDAwMzAsIDB4MDRiOSwgMHg2ODRjLCAweGQwZmMsIDB4MDExMCwgMHgwODBjLAorCTB4NGRlZCwgMHgwODBjLCAweDRlM2EsIDB4YTAwNiwgMHgwMGM4LCAweDIwMDEsIDB4MDAyOCwgMHgyMDA5LAorCTB4MDAwMCwgMHgwMGEwLCAweGEwODIsIDB4MDAwNiwgMHgxMjQwLCAweDYxMDAsIDB4ZDFmYywgMHgwZDIwLAorCTB4MjAwMSwgMHgwMDI5LCAweDIwMDksIDB4MTAwMCwgMHgwMDQ4LCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LAorCTB4MDAwMCwgMHgwMDIwLCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LCAweDAwMDAsIDB4YTAwNSwgMHgwMDA1LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjA1MCwgMHhhMDBkLCAweDAxMzgsIDB4MmQwMCwgMHgyMDBhLAorCTB4NjgwMywgMHgwMDAwLCAweDYwNTIsIDB4MDEyZSwgMHgwMDA1LCAweDJkMDAsIDB4NjA1MiwgMHg2MDRlLAorCTB4NjgwMywgMHgwMDAwLCAweDBjYzAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjA0YywgMHhhMDA1LAorCTB4MDE3MCwgMHgwMGU2LCAweDIwNzEsIDB4YWZjNywgMHg3MDA0LCAweGEwODYsIDB4MDAwMiwgMHgwMTY4LAorCTB4MDBlZSwgMHg2MDRjLCAweDY4MDIsIDB4MmQwMCwgMHg2MDRlLCAweDAxMmUsIDB4MDAwNSwgMHgyZDAwLAorCTB4NjA1MiwgMHg2MDRlLCAweDY4MDMsIDB4MDAwMCwgMHgwY2MwLCAweDcwMWMsIDB4YWMwNiwgMHgxZDgwLAorCTB4NjA0YywgMHgyMDcwLCAweDcwMDAsIDB4NjgwMiwgMHgyZDAwLCAweDcwMDIsIDB4MDBlZSwgMHgwMTJlLAorCTB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDRjLCAweGEwNmQsIDB4MDEzMCwgMHg2ODAwLAorCTB4YTAwNSwgMHgxMTA4LCAweDYwNTIsIDB4NjA0ZSwgMHhhZDA1LCAweDAxMmUsIDB4MDAwNSwgMHg2MDRjLAorCTB4YTA2ZCwgMHgwMTMwLCAweDY4MDAsIDB4YTAwNSwgMHgxMTA4LCAweDYwNTIsIDB4NjA0ZSwgMHhhZDA1LAorCTB4MDAwNSwgMHg2ODAzLCAweDAwMDAsIDB4NjA4NCwgMHhhMDBkLCAweDAxMjAsIDB4MmQwMCwgMHgyMDBhLAorCTB4NjA4NiwgMHgwMDA1LCAweDJkMDAsIDB4NjA4NiwgMHg2MDgyLCAweDBjZDgsIDB4MDEyNiwgMHgwMGM2LAorCTB4MDAyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjIxOCwgMHgyMjYwLCAweDYyMDAsIDB4YTAwNSwgMHgwMTEwLAorCTB4YzI4NSwgMHgwMDA4LCAweGMyODQsIDB4NjIwMiwgMHgwMDJlLCAweDAwY2UsIDB4MDEyZSwgMHgwMDA1LAorCTB4MDEyNiwgMHgwMGM2LCAweDIwOTEsIDB4ODAwMCwgMHg2MjE4LCAweDIyNjAsIDB4NjIwNCwgMHgwMDA2LAorCTB4YTA4NiwgMHgwMDA2LCAweDExODAsIDB4NjA5YywgMHhkMGFjLCAweDAxNjgsIDB4MjAwMSwgMHhhZDUyLAorCTB4MjAwNCwgMHhkMGE0LCAweDAxNDAsIDB4YTI4NCwgMHhmZjAwLCAweDgwMDcsIDB4YTA4NiwgMHgwMDA3LAorCTB4MTExMCwgMHgyMDExLCAweDA2MDAsIDB4MDAwZSwgMHhhMjk0LCAweGZmMDAsIDB4YTIxNSwgMHg2MjA2LAorCTB4MDAwNiwgMHhhMDg2LCAweDAwMDYsIDB4MTEyOCwgMHg2MjkwLCAweDgyZmYsIDB4MTExMCwgMHgwODBjLAorCTB4MTRmNiwgMHgwMDBlLCAweDAwY2UsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MDBjNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg2MjE4LCAweDIyNjAsIDB4NjIwNCwgMHgwMDA2LCAweGEwODYsIDB4MDAwNiwgMHgxMTc4LAorCTB4NjA5YywgMHhkMGE0LCAweDAxNjAsIDB4MjAwMSwgMHhhZDUyLCAweDIwMDQsIDB4ZDBhYywgMHgxMTM4LAorCTB4YTI4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNywgMHgxMTEwLCAweDIwMTEsIDB4MDAwNiwgMHgwMDBlLAorCTB4YTI5NCwgMHgwMGZmLCAweDgwMDcsIDB4YTIxNSwgMHg2MjA2LCAweDAwY2UsIDB4MDEyZSwgMHgwMDA1LAorCTB4MDAyNiwgMHhhMTgyLCAweDAwZmYsIDB4MDIxOCwgMHhhMDg1LCAweDAwMDEsIDB4MDBiMCwgMHhhMTkwLAorCTB4YWUzNCwgMHgyMjA0LCAweGEwNjUsIDB4MTE4MCwgMHgwMDE2LCAweDAwZDYsIDB4MDgwYywgMHgxNWMwLAorCTB4MmQ2MCwgMHgwMGRlLCAweDAwMWUsIDB4MGQ4MCwgMHgyYzAwLCAweDIwMTIsIDB4NjBhNywgMHgwMDAwLAorCTB4NjBhYiwgMHgwMDAwLCAweDA4MGMsIDB4NDkzYSwgMHhhMDA2LCAweDAwMmUsIDB4MDAwNSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDAwMjYsIDB4YTE4MiwgMHgwMGZmLCAweDAyMTgsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDQ4MCwgMHgwMGQ2LCAweGExOTAsIDB4YWUzNCwgMHgyMjA0LCAweGEwNmQsIDB4MDU0MCwgMHgyMDEzLAorCTB4MDAwMCwgMHgwMGQ2LCAweDAwYzYsIDB4MmQ2MCwgMHg2MGE0LCAweGEwNmQsIDB4MDExMCwgMHgwODBjLAorCTB4MTVmMCwgMHg2MGE4LCAweGEwNmQsIDB4MDExMCwgMHgwODBjLCAweDE1ZjAsIDB4MDBjZSwgMHgwMGRlLAorCTB4MDBkNiwgMHgwMGM2LCAweDY4YWMsIDB4MjA2MCwgMHg4Y2ZmLCAweDAxNjgsIDB4NjAwYywgMHgwMDA2LAorCTB4NjAxMCwgMHgyMDY4LCAweDA4MGMsIDB4OTU5NiwgMHgwMTEwLCAweDA4MGMsIDB4MTYwMCwgMHgwODBjLAorCTB4ODA3OCwgMHgwMGNlLCAweDBjODgsIDB4MDBjZSwgMHgwMGRlLCAweDA4MGMsIDB4MTVmMCwgMHgwMGRlLAorCTB4YTAwNiwgMHgwMDJlLCAweDAxMmUsIDB4MDAwNSwgMHgwMDE2LCAweGExODIsIDB4MDBmZiwgMHgwMjE4LAorCTB4YTA4NSwgMHgwMDAxLCAweDAwMzAsIDB4YTE4OCwgMHhhZTM0LCAweDIxMDQsIDB4YTA2NSwgMHgwZGMwLAorCTB4YTAwNiwgMHgwMDFlLCAweDAwMDUsIDB4MDBkNiwgMHgwMTU2LCAweDAxMzYsIDB4MDE0NiwgMHg2MDBiLAorCTB4MDAwMCwgMHg2MDBmLCAweDAwMDAsIDB4NjAwMCwgMHhjMDhjLCAweDYwMDIsIDB4MDgwYywgMHg1NzRmLAorCTB4MTUzOCwgMHg2MGEwLCAweGEwODYsIDB4MDA3ZSwgMHgyMDY5LCAweGIyOTAsIDB4MDEzMCwgMHgyMDAxLAorCTB4YWQzNCwgMHgyMDA0LCAweGQwYWMsIDB4MTFlMCwgMHgwMDk4LCAweDJkMDQsIDB4ZDBlNCwgMHgwMWMwLAorCTB4MDBkNiwgMHgyMDY5LCAweGIyOGUsIDB4MDBjNiwgMHgyMDYxLCAweGFmOWYsIDB4NjgxMCwgMHgyMDYyLAorCTB4NjgxNCwgMHg2MDA2LCAweDY4MTgsIDB4NjAwYSwgMHg2ODFjLCAweDYwMGUsIDB4MDBjZSwgMHgwMGRlLAorCTB4OGQ2OSwgMHgyZDA0LCAweDIwNjksIDB4MDE0MCwgMHg2ODg2LCAweDIwNjksIDB4YWQwMCwgMHg2OGEyLAorCTB4MjA2OSwgMHhiMjhlLCAweDY4MDgsIDB4NjA1ZSwgMHg2ODEwLCAweDYwNjIsIDB4NjEzOCwgMHhhMTBhLAorCTB4MDIwOCwgMHg2MDNhLCAweDY4MTQsIDB4NjA2NiwgMHgyMDk5LCAweGIyOTYsIDB4YWM4OCwgMHgwMDBhLAorCTB4MjFhMCwgMHgyMGE5LCAweDAwMDQsIDB4NTNhMywgMHgyMDk5LCAweGIyOWEsIDB4YWM4OCwgMHgwMDA2LAorCTB4MjFhMCwgMHgyMGE5LCAweDAwMDQsIDB4NTNhMywgMHgyMDY5LCAweGIyYWUsIDB4NjgwOCwgMHg2MDZhLAorCTB4NjkwYywgMHg2MTZlLCAweDY4MTAsIDB4NjA3MiwgMHg2ODE4LCAweDYwNzYsIDB4YTE4MiwgMHgwMjExLAorCTB4MTIxOCwgMHgyMDA5LCAweDAwMDgsIDB4MDQwMCwgMHhhMTgyLCAweDAyNTksIDB4MTIxOCwgMHgyMDA5LAorCTB4MDAwNywgMHgwMGQwLCAweGExODIsIDB4MDJjMSwgMHgxMjE4LCAweDIwMDksIDB4MDAwNiwgMHgwMGEwLAorCTB4YTE4MiwgMHgwMzQ5LCAweDEyMTgsIDB4MjAwOSwgMHgwMDA1LCAweDAwNzAsIDB4YTE4MiwgMHgwNDIxLAorCTB4MTIxOCwgMHgyMDA5LCAweDAwMDQsIDB4MDA0MCwgMHhhMTgyLCAweDA1ODEsIDB4MTIxOCwgMHgyMDA5LAorCTB4MDAwMywgMHgwMDEwLCAweDIwMDksIDB4MDAwMiwgMHg2MTkyLCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLAorCTB4MDBkZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwMGU2LCAweDIwNzEsIDB4YjI4ZCwgMHgyZTA0LAorCTB4Njg5NiwgMHgyMDcxLCAweGIyOGUsIDB4NzAwNCwgMHg2ODlhLCAweDcwMWMsIDB4Njg5ZSwgMHg2YTAwLAorCTB4MjAwOSwgMHhhZDcxLCAweDIxMGMsIDB4ZDBiYywgMHgwMTIwLCAweGQxZWMsIDB4MDExMCwgMHhjMmFkLAorCTB4MDAwOCwgMHhjMmFjLCAweGQwYzQsIDB4MDEyMCwgMHhkMWU0LCAweDAxMTAsIDB4YzJiZCwgMHgwMDA4LAorCTB4YzJiYywgMHg2YTAyLCAweDAwZWUsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBkNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDYwYTQsIDB4YTA2ZCwgMHgwMWMwLCAweDY5MDAsIDB4ODFmZiwgMHgxNTQwLAorCTB4NmEwNCwgMHhhMjgyLCAweDAwMTAsIDB4MTY0OCwgMHhhZDg4LCAweDAwMDQsIDB4MjBhOSwgMHgwMDEwLAorCTB4MjEwNCwgMHhhMDg2LCAweGZmZmYsIDB4MDEyOCwgMHg4MTA4LCAweDFmMDQsIDB4NGRhOCwgMHgwODBjLAorCTB4MTRmNiwgMHgyNjBhLCAweDgyMTAsIDB4NmEwNiwgMHgwMDk4LCAweDA4MGMsIDB4MTVkOSwgMHgwMWE4LAorCTB4MmQwMCwgMHg2MGE2LCAweDY4MDMsIDB4MDAwMCwgMHhhZDg4LCAweDAwMDQsIDB4MjBhOSwgMHgwMDEwLAorCTB4MjAwYiwgMHhmZmZmLCAweDgxMDgsIDB4MWYwNCwgMHg0ZGMwLCAweDY4MDcsIDB4MDAwMSwgMHg2ZTEyLAorCTB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBkZSwgMHgwMDA1LCAweGEwMDYsIDB4MGNkOCwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDAwZDYsIDB4NjBhNCwgMHhhMDBkLCAweDAxYTAsIDB4MjE2OCwgMHg2ODAwLAorCTB4YTAwNSwgMHgxMTYwLCAweDA4MGMsIDB4NGVmOSwgMHgxMTY4LCAweDIwMGIsIDB4ZmZmZiwgMHg2ODA0LAorCTB4YTA4YSwgMHgwMDAyLCAweDAyMTgsIDB4ODAwMSwgMHg2ODA2LCAweDAwMjAsIDB4MDgwYywgMHgxNWYwLAorCTB4NjBhNywgMHgwMDAwLCAweDAwZGUsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg0ZjU2LCAweDAwMTAsIDB4MDgwYywgMHg0YmMwLCAweDA4MGMsIDB4NGU3MSwgMHgxZGQ4LAorCTB4MDgwYywgMHg0ZTNhLCAweDAxMmUsIDB4MDAwNSwgMHgwMGQ2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjBhOCwgMHhhMDZkLCAweDAxYzAsIDB4Njk1MCwgMHg4MWZmLCAweDE1NDAsIDB4NmE1NCwgMHhhMjgyLAorCTB4MDAxMCwgMHgxNjcwLCAweGFkODgsIDB4MDAxOCwgMHgyMGE5LCAweDAwMTAsIDB4MjEwNCwgMHhhMDg2LAorCTB4ZmZmZiwgMHgwMTI4LCAweDgxMDgsIDB4MWYwNCwgMHg0ZTBlLCAweDA4MGMsIDB4MTRmNiwgMHgyNjBhLAorCTB4ODIxMCwgMHg2YTU2LCAweDAwOTgsIDB4MDgwYywgMHgxNWQ5LCAweDAxZDAsIDB4MmQwMCwgMHg2MGFhLAorCTB4Njg1MywgMHgwMDAwLCAweGFkODgsIDB4MDAxOCwgMHgyMGE5LCAweDAwMTAsIDB4MjAwYiwgMHhmZmZmLAorCTB4ODEwOCwgMHgxZjA0LCAweDRlMjYsIDB4Njg1NywgMHgwMDAxLCAweDZlNjIsIDB4MDAxMCwgMHgwODBjLAorCTB4NGMxMSwgMHgwMDg5LCAweDFkZTAsIDB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBkZSwgMHgwMDA1LAorCTB4YTAwNiwgMHgwY2Q4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NjdjNSwgMHgwMTJlLAorCTB4MDAwNSwgMHhhMDFlLCAweDAwMTAsIDB4MjAxOSwgMHgwMDAxLCAweGEwMGUsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg2MDRjLCAweDIwNjgsIDB4NjAwMCwgMHhkMGRjLCAweDExNzAsIDB4OGRmZiwgMHgwMWU4LAorCTB4ODNmZiwgMHgwMTIwLCAweDY4NDgsIDB4YTYwNiwgMHgwMTU4LCAweDAwMzAsIDB4NjgzYywgMHhhNDA2LAorCTB4MTExOCwgMHg2ODQwLCAweGE1MDYsIDB4MDEyMCwgMHgyZDA4LCAweDY4MDAsIDB4MjA2OCwgMHgwYzcwLAorCTB4NmEwMCwgMHg2MDRjLCAweGFkMDYsIDB4MTExMCwgMHg2MjRlLCAweDAwMTgsIDB4YTE4MCwgMHgwMDAwLAorCTB4MjIwMiwgMHg4MmZmLCAweDExMTAsIDB4NjE1MiwgMHg4ZGZmLCAweDAxMmUsIDB4MDAwNSwgMHhhMDFlLAorCTB4MDAxMCwgMHgyMDE5LCAweDAwMDEsIDB4YTAwZSwgMHg2MDgwLCAweDIwNjgsIDB4OGRmZiwgMHgwMWU4LAorCTB4ODNmZiwgMHgwMTIwLCAweDY4NDgsIDB4YTYwNiwgMHgwMTU4LCAweDAwMzAsIDB4NjgzYywgMHhhNDA2LAorCTB4MTExOCwgMHg2ODQwLCAweGE1MDYsIDB4MDEyMCwgMHgyZDA4LCAweDY4MDAsIDB4MjA2OCwgMHgwYzcwLAorCTB4NmEwMCwgMHg2MDgwLCAweGFkMDYsIDB4MTExMCwgMHg2MjgyLCAweDAwMTgsIDB4YTE4MCwgMHgwMDAwLAorCTB4MjIwMiwgMHg4MmZmLCAweDExMTAsIDB4NjE4NiwgMHg4ZGZmLCAweDAwMDUsIDB4YTAxNiwgMHgwODBjLAorCTB4NGVmMywgMHgxMTEwLCAweDIwMTEsIDB4MDAwMSwgMHgwODBjLCAweDRmM2QsIDB4MTExMCwgMHhhMjk1LAorCTB4MDAwMiwgMHgwMDA1LCAweDA4MGMsIDB4NGY2ZSwgMHgwMTE4LCAweDA4MGMsIDB4OTY0YiwgMHgwMDEwLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDgwYywgMHg0ZjZlLCAweDAxMTgsIDB4MDgwYywgMHg5NWU0LAorCTB4MDAxMCwgMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwODBjLCAweDRmNmUsIDB4MDExOCwgMHgwODBjLAorCTB4OTYyZSwgMHgwMDEwLCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LCAweDA4MGMsIDB4NGY2ZSwgMHgwMTE4LAorCTB4MDgwYywgMHg5NjAwLCAweDAwMTAsIDB4YTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDgwYywgMHg0ZjZlLAorCTB4MDExOCwgMHgwODBjLCAweDk2NjcsIDB4MDAxMCwgMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMTI2LAorCTB4MDAwNiwgMHgwMGQ2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDgwLCAweGEwNmQsIDB4MDFhMCwgMHg2ODAwLAorCTB4MDAwNiwgMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsIDB4MDgwYywgMHg5N2ZkLAorCTB4MDAwNiwgMHg2MDAwLCAweGQwZmMsIDB4MDExMCwgMHgwODBjLCAweGFjMDMsIDB4MDAwZSwgMHgwODBjLAorCTB4NTEwYywgMHgwMDBlLCAweDBjNTAsIDB4NjA4MywgMHgwMDAwLCAweDYwODcsIDB4MDAwMCwgMHgwMGRlLAorCTB4MDAwZSwgMHgwMTJlLCAweDAwMDUsIDB4NjBhNCwgMHhhMDBkLCAweDExMTgsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDAwNSwgMHgwMGU2LCAweDIxNzAsIDB4NzAwMCwgMHhhMDA1LCAweDExNjAsIDB4MjBhOSwgMHgwMDEwLAorCTB4YWU4OCwgMHgwMDA0LCAweDIxMDQsIDB4YTYwNiwgMHgwMTI4LCAweDgxMDgsIDB4MWYwNCwgMHg0ZjAyLAorCTB4YTA4NSwgMHgwMDAxLCAweGEwMDYsIDB4MDBlZSwgMHgwMDA1LCAweDAwZDYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg2MGE0LCAweGEwNmQsIDB4MTEyOCwgMHgwODBjLCAweDE1ZDksIDB4MDFhMCwgMHgyZDAwLAorCTB4NjBhNiwgMHg2ODAzLCAweDAwMDEsIDB4NjgwNywgMHgwMDAwLCAweGFkODgsIDB4MDAwNCwgMHgyMGE5LAorCTB4MDAxMCwgMHgyMDBiLCAweGZmZmYsIDB4ODEwOCwgMHgxZjA0LCAweDRmMjEsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDEyZSwgMHgwMGRlLCAweDAwMDUsIDB4YTAwNiwgMHgwY2Q4LCAweDAwZDYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg2MGE0LCAweGEwNmQsIDB4MDEzMCwgMHg2MGE3LCAweDAwMDAsIDB4MDgwYywgMHgxNWYwLAorCTB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBkZSwgMHgwMDA1LCAweDYwYTgsIDB4YTAwZCwgMHgxMTE4LAorCTB4YTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDBlNiwgMHgyMTcwLCAweDcwNTAsIDB4YTAwNSwgMHgxMTYwLAorCTB4MjBhOSwgMHgwMDEwLCAweGFlODgsIDB4MDAxOCwgMHgyMTA0LCAweGE2MDYsIDB4MDEyOCwgMHg4MTA4LAorCTB4MWYwNCwgMHg0ZjRjLCAweGEwODUsIDB4MDAwMSwgMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwYzE5LCAweDExODgsIDB4MjAwYiwgMHhmZmZmLCAweDAwZDYsIDB4NjBhOCwgMHgyMDY4LAorCTB4Njg1NCwgMHhhMDhhLCAweDAwMDIsIDB4MDIxOCwgMHg4MDAxLCAweDY4NTYsIDB4MDAyMCwgMHgwODBjLAorCTB4MTVmMCwgMHg2MGFiLCAweDAwMDAsIDB4MDBkZSwgMHgwMTJlLCAweDAwMDUsIDB4NjA5YywgMHhkMGE0LAorCTB4MDAwNSwgMHgwMGY2LCAweDA4MGMsIDB4NTc0ZiwgMHgwMWIwLCAweDcxYjQsIDB4ODFmZiwgMHgxMTk4LAorCTB4NzFkMCwgMHhkMTljLCAweDAxODAsIDB4MjAwMSwgMHgwMDdlLCAweGEwODAsIDB4YWUzNCwgMHgyMDA0LAorCTB4YTA3ZCwgMHgwMTQ4LCAweDc4MDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgxMTE4LAorCTB4NzgwMCwgMHhjMGVkLCAweDc4MDIsIDB4MjA3OSwgMHhhZDUxLCAweDc4MDQsIDB4ZDBhNCwgMHgwMWU4LAorCTB4MDE1NiwgMHgwMGM2LCAweDIwYTksIDB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsIDB4MDAxNiwgMHgwODBjLAorCTB4NGNkYywgMHgxMTY4LCAweDYwMDQsIDB4YTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4YTA5NiwgMHgwMDA0LAorCTB4MDExOCwgMHhhMDg2LCAweDAwMDYsIDB4MTExOCwgMHg2MDAwLCAweGMwZWQsIDB4NjAwMiwgMHgwMDFlLAorCTB4ODEwOCwgMHgxZjA0LCAweDRmOTYsIDB4MDBjZSwgMHgwMTVlLCAweDA4MGMsIDB4NTAyZCwgMHgwMTIwLAorCTB4MjAwMSwgMHhhZmEyLCAweDIwMGMsIDB4MDAzOCwgMHgyMDc5LCAweGFkNTEsIDB4NzgwNCwgMHhkMGE0LAorCTB4MDEzMCwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwgMHg0ZmMxLCAweDA4MGMsIDB4NjU5MywgMHgwMGZlLAorCTB4MDAwNSwgMHgyMDExLCAweDRmYzEsIDB4MDgwYywgMHg2NTBkLCAweDA4MGMsIDB4NTAyZCwgMHgwMWYwLAorCTB4MjAwMSwgMHhhZWIyLCAweDIwMDQsIDB4YTA4MCwgMHgwMDAwLCAweDIwMGMsIDB4YzFlYywgMHgyMTAyLAorCTB4MjAwMSwgMHhhZDUyLCAweDIwMDQsIDB4ZDBhNCwgMHgwMTMwLCAweDIwMDksIDB4MDdkMCwgMHgyMDExLAorCTB4NGZjMSwgMHgwODBjLCAweDY1OTMsIDB4MDBlNiwgMHgyMDcxLCAweGFkMDAsIDB4NzA2ZiwgMHgwMDAwLAorCTB4NzA3MywgMHgwMDAwLCAweDA4MGMsIDB4MjhmYSwgMHgwMGVlLCAweDA0YjAsIDB4MDE1NiwgMHgwMGM2LAorCTB4MjBhOSwgMHgwMDdmLCAweDIwMDksIDB4MDAwMCwgMHgwMDE2LCAweDA4MGMsIDB4NGNkYywgMHgxNTMwLAorCTB4NjAwMCwgMHhkMGVjLCAweDA1MTgsIDB4MDA0NiwgMHg2MmEwLCAweGEyOTQsIDB4MDBmZiwgMHg4MjI3LAorCTB4YTAwNiwgMHgyMDA5LCAweDAwMjksIDB4MDgwYywgMHhhOTZjLCAweDYwMDAsIDB4YzBlNSwgMHhjMGVjLAorCTB4NjAwMiwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg1LCAweDA3MDAsIDB4NjAwNiwgMHgyMDE5LAorCTB4MDAyOSwgMHgwODBjLCAweDY4ZTcsIDB4MDA3NiwgMHgyMDM5LCAweDAwMDAsIDB4MDgwYywgMHg2ODFkLAorCTB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4YTcxMiwgMHgwMDdlLCAweDAwNGUsIDB4MDAxZSwgMHg4MTA4LAorCTB4MWYwNCwgMHg0ZmVjLCAweDAwY2UsIDB4MDE1ZSwgMHgwMDA1LCAweDAwYzYsIDB4NjAxOCwgMHgyMDYwLAorCTB4NjAwMCwgMHhjMGVjLCAweDYwMDIsIDB4MDBjZSwgMHgwMDA1LCAweDc4MTgsIDB4MjAwNCwgMHhkMGFjLAorCTB4MDAwNSwgMHg3ODE4LCAweDIwMDQsIDB4ZDBiYywgMHgwMDA1LCAweDAwZjYsIDB4MjAwMSwgMHhhZWIyLAorCTB4MjAwNCwgMHhhMDdkLCAweDAxMTAsIDB4NzgwMCwgMHhkMGVjLCAweDAwZmUsIDB4MDAwNSwgMHgwMTI2LAorCTB4MDAyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjIwMCwgMHhhMDA1LCAweDAxMTAsIDB4YzJmZCwgMHgwMDA4LAorCTB4YzJmYywgMHg2MjAyLCAweDAwMmUsIDB4MDEyZSwgMHgwMDA1LCAweDIwNzEsIDB4YWUxMywgMHg3MDAzLAorCTB4MDAwMSwgMHg3MDA3LCAweDAwMDAsIDB4NzAxMywgMHgwMDAwLCAweDcwMTcsIDB4MDAwMCwgMHg3MDFiLAorCTB4MDAwMCwgMHg3MDFmLCAweDAwMDAsIDB4NzAwYiwgMHgwMDAwLCAweDcwNGIsIDB4MDAwMSwgMHg3MDRmLAorCTB4MDAwMCwgMHg3MDViLCAweDAwMjAsIDB4NzA1ZiwgMHgwMDQwLCAweDcwN2YsIDB4MDAwMCwgMHgyMDcxLAorCTB4YWY3YywgMHg3MDAzLCAweGFlMTMsIDB4NzAwNywgMHgwMDAwLCAweDcwMGIsIDB4MDAwMCwgMHg3MDBmLAorCTB4YWY1YywgMHg3MDEzLCAweDAwMjAsIDB4NzAxNywgMHgwMDQwLCAweDcwMzcsIDB4MDAwMCwgMHgwMDA1LAorCTB4MDAxNiwgMHgwMGU2LCAweDIwNzEsIDB4YWYzNCwgMHhhMDBlLCAweDcxODYsIDB4NzE4YSwgMHg3MDk3LAorCTB4MDAwMSwgMHgyMDAxLCAweGFkNTIsIDB4MjAwNCwgMHhkMGZjLCAweDExNTAsIDB4MjAwMSwgMHhhZDUyLAorCTB4MjAwNCwgMHhhMDBlLCAweGQwOWMsIDB4MDEwOCwgMHg4MTA4LCAweDcxMDIsIDB4MDgwNCwgMHg1MGQ2LAorCTB4MjAwMSwgMHhhZDcxLCAweDIwMGMsIDB4YTE4NCwgMHgwMDBmLCAweDIwMDksIDB4YWQ3MiwgMHgyMTBjLAorCTB4MDAwMiwgMHg1MDdlLCAweDUwYjEsIDB4NTBiOCwgMHg1MGMyLCAweDUwYzcsIDB4NTA3ZSwgMHg1MDdlLAorCTB4NTA3ZSwgMHg1MGExLCAweDUwN2UsIDB4NTA3ZSwgMHg1MDdlLCAweDUwN2UsIDB4NTA3ZSwgMHg1MDdlLAorCTB4NTA3ZSwgMHg3MDAzLCAweDAwMDQsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MjA5OSwgMHhhZDc1LAorCTB4MjBhMSwgMHhhZjg1LCAweDIwYTksIDB4MDAwNCwgMHg1M2EzLCAweDAxNWUsIDB4MDE0ZSwgMHgwMTNlLAorCTB4MDQyOCwgMHg3MDhmLCAweDAwMDUsIDB4NzAwNywgMHgwMTIyLCAweDIwMDEsIDB4MDAwMiwgMHgwMDMwLAorCTB4NzA4ZiwgMHgwMDAyLCAweDcwMDcsIDB4MDEyMSwgMHgyMDAxLCAweDAwMDMsIDB4NzAwMiwgMHg3MDk3LAorCTB4MDAwMSwgMHgwMDg4LCAweDcwMDcsIDB4MDEyMiwgMHgyMDAxLCAweDAwMDIsIDB4MDAyMCwgMHg3MDA3LAorCTB4MDEyMSwgMHgyMDAxLCAweDAwMDMsIDB4NzAwMiwgMHhhMDA2LCAweDcwOTYsIDB4NzA4ZSwgMHhhMTg0LAorCTB4ZmYwMCwgMHg4MDA3LCAweDcwOWEsIDB4YTE4NCwgMHgwMGZmLCAweDcwOTIsIDB4MDBlZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4YWUxMywgMHg2ODRjLCAweGEwMDUsIDB4MTEzMCwgMHg3MDI4LAorCTB4YzA4NSwgMHg3MDJhLCAweGEwODUsIDB4MDAwMSwgMHgwNDI4LCAweDZhNjAsIDB4NzIzNiwgMHg2YjY0LAorCTB4NzMzYSwgMHg2ODY4LCAweDcwM2UsIDB4NzA3NiwgMHg2ODZjLCAweDcwNDIsIDB4NzA3YSwgMHg2ODRjLAorCTB4NzAyZSwgMHg2ODQ0LCAweDcwMzIsIDB4MjAwOSwgMHgwMDBkLCAweDIwMGEsIDB4NzAwYiwgMHgwMDAwLAorCTB4ODAwNywgMHg4MDA2LCAweDgwMDYsIDB4YTA4YywgMHgwMDNmLCAweGEwODQsIDB4ZmZjMCwgMHhhMjEwLAorCTB4MjEwMCwgMHhhMzE5LCAweDcyNmUsIDB4NzM3MiwgMHg3MDI4LCAweGMwODQsIDB4NzAyYSwgMHg3MDA3LAorCTB4MDAwMSwgMHhhMDA2LCAweDAwZWUsIDB4MDAwNSwgMHgwMTU2LCAweDAwZTYsIDB4MDAyNiwgMHg2ODM4LAorCTB4ZDBmYywgMHgxOTA0LCAweDUxNjUsIDB4NjgwNCwgMHhhMDBkLCAweDAxODgsIDB4MDBkNiwgMHgyMDcxLAorCTB4YWQwMCwgMHhhMDE2LCAweDcwMmMsIDB4MjE2OCwgMHg2OTA0LCAweDIwNmEsIDB4ODIxMCwgMHgyZDAwLAorCTB4ODFmZiwgMHgxZGM4LCAweDcwMmUsIDB4NzBiMCwgMHhhMjAwLCAweDcwYjIsIDB4MDBkZSwgMHgyMDcxLAorCTB4YWUxMywgMHg3MDFjLCAweGEwMDUsIDB4MTkwNCwgMHg1MTc1LCAweDIwYTksIDB4MDAzMiwgMHgwZjA0LAorCTB4NTE3MywgMHgwZTA0LCAweDUxMmYsIDB4MjA3MSwgMHhhZjM0LCAweDcyMDAsIDB4ODJmZiwgMHgwNWQ4LAorCTB4NjkzNCwgMHhhMTg2LCAweDAxMDMsIDB4MTkwNCwgMHg1MTgzLCAweDY5NDgsIDB4Njg0NCwgMHhhMTA1LAorCTB4MTU0MCwgMHgyMDA5LCAweDgwMjAsIDB4MjIwMCwgMHgwMDAyLCAweDUxNzMsIDB4NTE0YSwgMHg1MTliLAorCTB4NTFhNywgMHg1MTczLCAweDIwNzEsIDB4MDAwMCwgMHgyMGE5LCAweDAwMzIsIDB4MGYwNCwgMHg1MTczLAorCTB4NzAxOCwgMHhkMDg0LCAweDFkZDgsIDB4NzEyMiwgMHg2ODNjLCAweDcwMjYsIDB4Njg0MCwgMHg3MDJhLAorCTB4NzAxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgyMDcxLCAweGFkMDAsIDB4NzAyYywgMHgyMDZhLAorCTB4MmQwMCwgMHg3MDJlLCAweDcwYjAsIDB4ODAwMCwgMHg3MGIyLCAweDAwMmUsIDB4MDBlZSwgMHgwMTVlLAorCTB4MDAwNSwgMHg2ODQ0LCAweGEwODYsIDB4MDEwMCwgMHgxMTMwLCAweDY4NjgsIDB4YTAwNSwgMHgxMTE4LAorCTB4MjAwOSwgMHg4MDIwLCAweDA4ODAsIDB4MjA3MSwgMHhhZTEzLCAweDJkMDgsIDB4MjA2YiwgMHgwMDAwLAorCTB4NzAxMCwgMHg4MDAwLCAweDcwMTIsIDB4NzAxOCwgMHhhMDZkLCAweDcxMWEsIDB4MDExMCwgMHg2OTAyLAorCTB4MDAwOCwgMHg3MTFlLCAweDBjMTAsIDB4YTE4YywgMHgwMGZmLCAweGExODYsIDB4MDAxNywgMHgwMTMwLAorCTB4YTE4NiwgMHgwMDFlLCAweDAxMTgsIDB4YTE4ZSwgMHgwMDFmLCAweDFkMjgsIDB4Njg0YywgMHhkMGNjLAorCTB4MGQxMCwgMHg2ODUwLCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDEsIDB4MTllMCwgMHgyMDA5LAorCTB4ODAyMSwgMHgwODA0LCAweDUxNDMsIDB4NzA4NCwgMHg4MDA4LCAweGEwOTIsIDB4MDAxZSwgMHgxYTk4LAorCTB4NzE4NiwgMHhhZTkwLCAweDAwMDMsIDB4YTIxMCwgMHg2ODNjLCAweDIwMTIsIDB4MDA3OCwgMHg3MDg0LAorCTB4ODAwOCwgMHhhMDkyLCAweDAwMGYsIDB4MWEzOCwgMHg3MTg2LCAweGFlOTAsIDB4MDAwMywgMHg4MDAzLAorCTB4YTIxMCwgMHg2ODNjLCAweDIwMTIsIDB4ODIxMCwgMHg2ODQwLCAweDIwMTIsIDB4NzA4OCwgMHhhMTBhLAorCTB4MGEwNCwgMHg1MTVjLCAweDcxOGMsIDB4NzA4NCwgMHhhMTBhLCAweDBhMDQsIDB4NTE1YywgMHgyMDcxLAorCTB4MDAwMCwgMHg3MDE4LCAweGQwODQsIDB4MTkwNCwgMHg1MTVjLCAweDIwNzEsIDB4YWYzNCwgMHg3MDAwLAorCTB4YTA4NiwgMHgwMDAyLCAweDExNTAsIDB4MDgwYywgMHg1NDI2LCAweDIwNzEsIDB4MDAwMCwgMHg3MDFiLAorCTB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MDgwNCwgMHg1MTVjLCAweDA4MGMsIDB4NTQ1MCwgMHgyMDcxLAorCTB4MDAwMCwgMHg3MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDA4MDQsIDB4NTE1YywgMHgwMDA2LAorCTB4Njg0YywgMHgwMDA2LCAweDY4MzcsIDB4MDEwMywgMHgyMGE5LCAweDAwMWMsIDB4YWQ4MCwgMHgwMDExLAorCTB4MjBhMCwgMHgyMDAxLCAweDAwMDAsIDB4NDBhNCwgMHgwMDBlLCAweGEwODQsIDB4MDBmZiwgMHg2ODRlLAorCTB4MDAwZSwgMHg2ODRhLCAweDY5NTIsIDB4MDAwNSwgMHgyMDcxLCAweGFlMTMsIDB4NzAwNCwgMHgwMDAyLAorCTB4NTIwMiwgMHg1MjEzLCAweDU0MTEsIDB4NTQxMiwgMHg1NDFmLCAweDU0MjUsIDB4NTIwMywgMHg1NDAyLAorCTB4NTM5OCwgMHg1M2VlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MGUwNCwgMHg1MjEyLAorCTB4MjAwOSwgMHgwMDBkLCAweDcwMzAsIDB4MjAwYSwgMHgyMDkxLCAweDQwODAsIDB4NzAwNywgMHgwMDAxLAorCTB4NzAwYiwgMHgwMDAwLCAweDAxMmUsIDB4MjA2OSwgMHhhZmRhLCAweDY4M2MsIDB4YTAwNSwgMHgwM2Y4LAorCTB4MTFmMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDY5LCAweDAwMDAsIDB4NjkzNCwgMHgyMDAxLAorCTB4YWUxZiwgMHgyMDA0LCAweGExMGEsIDB4MDE3MCwgMHgwZTA0LCAweDUyMzYsIDB4MjA2OSwgMHgwMDAwLAorCTB4NjgxOCwgMHhkMDg0LCAweDExNTgsIDB4MjAwOSwgMHg4MDQwLCAweDY5MjIsIDB4NjgxYiwgMHgwMDAxLAorCTB4MjA5MSwgMHg0MDgwLCAweDIwNjksIDB4YWZkYSwgMHg2ODNmLCAweGZmZmYsIDB4MDEyZSwgMHgyMDY5LAorCTB4YWQwMCwgMHg2ODQ0LCAweDY5NjQsIDB4YTEwMiwgMHgyMDY5LCAweGFmMzQsIDB4Njg4YSwgMHg2OTg0LAorCTB4NzAxYywgMHhhMDZkLCAweDAxMjAsIDB4ODFmZiwgMHgwOTA0LCAweDUyOGMsIDB4MDBhMCwgMHg4MWZmLAorCTB4MDkwNCwgMHg1MzUyLCAweDIwNzEsIDB4YWYzNCwgMHg3MTg0LCAweDcwODgsIDB4YTEwYSwgMHgxMjU4LAorCTB4NzE5MCwgMHgyMDcxLCAweGFmZGEsIDB4NzAzOCwgMHhhMDA1LCAweDAxMjgsIDB4MWIwNCwgMHg1MzUyLAorCTB4NzEzYSwgMHgwODA0LCAweDUzNTIsIDB4MjA3MSwgMHhhZjM0LCAweDcxOGMsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg3MDg0LCAweGExMGEsIDB4MGEwNCwgMHg1MzZkLCAweDBlMDQsIDB4NTMwZSwgMHgyMDcxLAorCTB4MDAwMCwgMHg3MDE4LCAweGQwODQsIDB4MTkwNCwgMHg1MzBlLCAweDIwMDEsIDB4ZmZmZiwgMHgyMDcxLAorCTB4YWZkYSwgMHg3MDNhLCAweDIwNzEsIDB4YWYzNCwgMHg3MDAwLCAweGEwODYsIDB4MDAwMiwgMHgxMTUwLAorCTB4MDgwYywgMHg1NDI2LCAweDIwNzEsIDB4MDAwMCwgMHg3MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLAorCTB4MDgwNCwgMHg1MzBlLCAweDA4MGMsIDB4NTQ1MCwgMHgyMDcxLCAweDAwMDAsIDB4NzAxYiwgMHgwMDAxLAorCTB4MjA5MSwgMHg0MDgwLCAweDA4MDQsIDB4NTMwZSwgMHgyMDcxLCAweGFmMzQsIDB4NzAwMCwgMHhhMDA1LAorCTB4MDkwNCwgMHg1MzM0LCAweDY5MzQsIDB4YTE4NiwgMHgwMTAzLCAweDE5MDQsIDB4NTMxMSwgMHg2ODRjLAorCTB4ZDBiYywgMHgxOTA0LCAweDUzMzQsIDB4Njk0OCwgMHg2ODQ0LCAweGExMDUsIDB4MTkwNCwgMHg1MzI5LAorCTB4MjAwOSwgMHg4MDIwLCAweDIwNzEsIDB4YWYzNCwgMHg3MDAwLCAweDAwMDIsIDB4NTMzNCwgMHg1MmY0LAorCTB4NTJjYywgMHg1MmRlLCAweDUyYWIsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MjA5OSwgMHhhZDc1LAorCTB4MjBhMSwgMHhhZjg1LCAweDIwYTksIDB4MDAwNCwgMHg1M2EzLCAweDAxNWUsIDB4MDE0ZSwgMHgwMTNlLAorCTB4MjA3MSwgMHhhZjdjLCAweGFkODAsIDB4MDAwZiwgMHg3MDBlLCAweDcwMTMsIDB4MDAwMiwgMHg3MDA3LAorCTB4MDAwMiwgMHg3MDBiLCAweDAwMDAsIDB4MmUxMCwgMHgwODBjLCAweDE2MjQsIDB4MjA3MSwgMHhhZTEzLAorCTB4NzAwNywgMHgwMDA5LCAweDA4MDQsIDB4NTM1MiwgMHg3MDg0LCAweDgwMDgsIDB4YTA5MiwgMHgwMDFlLAorCTB4MWEwNCwgMHg1MzUyLCAweGFlOTAsIDB4MDAwMywgMHhhMjEwLCAweDY4M2MsIDB4MjAxMiwgMHg3MTg2LAorCTB4MjA3MSwgMHhhZTEzLCAweDA4MGMsIDB4NTRhNywgMHgwODA0LCAweDUzNTIsIDB4NzA4NCwgMHg4MDA4LAorCTB4YTA5MiwgMHgwMDBmLCAweDFhMDQsIDB4NTM1MiwgMHhhZTkwLCAweDAwMDMsIDB4ODAwMywgMHhhMjEwLAorCTB4NjgzYywgMHgyMDEyLCAweDgyMTAsIDB4Njg0MCwgMHgyMDEyLCAweDcxODYsIDB4MjA3MSwgMHhhZTEzLAorCTB4MDgwYywgMHg1NGE3LCAweDA4MDQsIDB4NTM1MiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwZTA0LAorCTB4NTMwZSwgMHgyMDcxLCAweDAwMDAsIDB4NzAxOCwgMHhkMDg0LCAweDExODAsIDB4NzEyMiwgMHg2ODNjLAorCTB4NzAyNiwgMHg2ODQwLCAweDcwMmEsIDB4NzAxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgwMTJlLAorCTB4MjA3MSwgMHhhZTEzLCAweDA4MGMsIDB4NTRhNywgMHgwODA0LCAweDUzNTIsIDB4MDEyZSwgMHgwODA0LAorCTB4NTM1MiwgMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDE3LCAweDAxMzAsIDB4YTE4NiwgMHgwMDFlLAorCTB4MDExOCwgMHhhMThlLCAweDAwMWYsIDB4MTFjMCwgMHg2ODRjLCAweGQwY2MsIDB4MDFhOCwgMHg2ODUwLAorCTB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwMSwgMHgxMTc4LCAweDIwMDksIDB4ODAyMSwgMHgwODA0LAorCTB4NTJhMiwgMHg2ODQ0LCAweGEwODYsIDB4MDEwMCwgMHgxMTM4LCAweDY4NjgsIDB4YTAwNSwgMHgxMTIwLAorCTB4MjAwOSwgMHg4MDIwLCAweDA4MDQsIDB4NTJhMiwgMHgyMDcxLCAweGFlMTMsIDB4MDgwYywgMHg1NGI5LAorCTB4MDFjOCwgMHgyMDcxLCAweGFlMTMsIDB4NzAwZiwgMHgwMDAxLCAweDY5MzQsIDB4YTE4NCwgMHgwMGZmLAorCTB4YTA4NiwgMHgwMDAzLCAweDExMzAsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4ODEwMSwgMHgwMTA4LAorCTB4NzEwZSwgMHg3MDA3LCAweDAwMDMsIDB4MDgwYywgMHg1NGQyLCAweDcwNTAsIDB4YTA4NiwgMHgwMTAwLAorCTB4MDkwNCwgMHg1NDEyLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YWUxMywgMHg3MDA4LAorCTB4YTA4NiwgMHgwMDAxLCAweDExODAsIDB4MGUwNCwgMHg1MzZiLCAweDIwMDksIDB4MDAwZCwgMHg3MDMwLAorCTB4MjAwYSwgMHgyMDkxLCAweDQwODAsIDB4NzAwYiwgMHgwMDAwLCAweDcwMDQsIDB4YTA4NiwgMHgwMDA2LAorCTB4MTExMCwgMHg3MDA3LCAweDAwMDEsIDB4MDEyZSwgMHgwMDA1LCAweDIwNzEsIDB4YWUxMywgMHgwODBjLAorCTB4NTRiOSwgMHgwNTE4LCAweDIwNzEsIDB4YWYzNCwgMHg3MDg0LCAweDcwMGEsIDB4MjBhOSwgMHgwMDIwLAorCTB4MjA5OSwgMHhhZjM1LCAweDIwYTEsIDB4YWY1YywgMHg1M2EzLCAweDcwODcsIDB4MDAwMCwgMHgyMDcxLAorCTB4YWUxMywgMHgyMDY5LCAweGFmN2MsIDB4NzA2YywgMHg2ODI2LCAweDcwNzAsIDB4NjgyYSwgMHg3MDc0LAorCTB4NjgyZSwgMHg3MDc4LCAweDY4MzIsIDB4MmQxMCwgMHgwODBjLCAweDE2MjQsIDB4NzAwNywgMHgwMDA4LAorCTB4MjAwMSwgMHhmZmZmLCAweDIwNzEsIDB4YWZkYSwgMHg3MDNhLCAweDAxMmUsIDB4MDgwNCwgMHg1MzUyLAorCTB4MjA2OSwgMHhhZjdjLCAweDY4MDgsIDB4YTA4ZSwgMHgwMDAwLCAweDA5MDQsIDB4NTNlZCwgMHhhMDhlLAorCTB4MDIwMCwgMHgwOTA0LCAweDUzZWIsIDB4YTA4ZSwgMHgwMTAwLCAweDE5MDQsIDB4NTNlZCwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDBlMDQsIDB4NTNlOSwgMHgyMDY5LCAweDAwMDAsIDB4NjgxOCwgMHhkMDg0LAorCTB4MTVjMCwgMHg3MDJjLCAweDcxMzAsIDB4ODEwOCwgMHhhMTAyLCAweDAyMzAsIDB4YTAwZSwgMHg3MDM0LAorCTB4NzA2ZSwgMHg3MDM4LCAweDcwNzIsIDB4MDA0OCwgMHg3MDZjLCAweGEwODAsIDB4MDA0MCwgMHg3MDZlLAorCTB4MTIyMCwgMHg3MDcwLCAweGEwODEsIDB4MDAwMCwgMHg3MDcyLCAweDcxMzIsIDB4NjkzNiwgMHg3MDBiLAorCTB4MDAwMCwgMHgyMDAxLCAweGFmNTksIDB4MjAwNCwgMHhhMDA1LCAweDExOTAsIDB4NjkzNCwgMHgyMDY5LAorCTB4YWYzNCwgMHg2ODljLCAweDY5OWUsIDB4MjA2OSwgMHhhZmRhLCAweGExMDIsIDB4MTExOCwgMHg2ODNjLAorCTB4YTAwNSwgMHgxMzY4LCAweDIwMDEsIDB4YWY1YSwgMHgyMDBjLCAweDgxMGQsIDB4NjkzZSwgMHgwMDM4LAorCTB4MjAwOSwgMHg4MDQwLCAweDY5MjIsIDB4NjgxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHg3MDA3LAorCTB4MDAwMSwgMHgwMTJlLCAweDAwMTAsIDB4NzAwNywgMHgwMDA1LCAweDAwMDUsIDB4MjAwMSwgMHhhZjdlLAorCTB4MjAwNCwgMHhhMDhlLCAweDAxMDAsIDB4MTEyOCwgMHg3MDA3LCAweDAwMDEsIDB4MDgwYywgMHg1NGE3LAorCTB4MDAwNSwgMHhhMDhlLCAweDAwMDAsIDB4MGRlMCwgMHhhMDhlLCAweDAyMDAsIDB4MWRjOCwgMHg3MDA3LAorCTB4MDAwNSwgMHgwMDA1LCAweDcwMWMsIDB4YTA2ZCwgMHgwMTU4LCAweDA4MGMsIDB4NTRiOSwgMHgwMTQwLAorCTB4NzAwNywgMHgwMDAzLCAweDA4MGMsIDB4NTRkMiwgMHg3MDUwLCAweGEwODYsIDB4MDEwMCwgMHgwMTEwLAorCTB4MDAwNSwgMHgwMDA1LCAweDcwNTAsIDB4YTA5ZSwgMHgwMTAwLCAweDExMTgsIDB4NzAwNywgMHgwMDA0LAorCTB4MDAzMCwgMHhhMDg2LCAweDAyMDAsIDB4MTExMCwgMHg3MDA3LCAweDAwMDUsIDB4MDAwNSwgMHgwODBjLAorCTB4NTQ3NSwgMHg3MDA2LCAweDA4MGMsIDB4NTRhNywgMHgwMDA1LCAweDAwMDUsIDB4MDBlNiwgMHgwMTU2LAorCTB4MjA3MSwgMHhhZjM0LCAweDcxODQsIDB4ODFmZiwgMHgwNTAwLCAweGEwMDYsIDB4NzA4NiwgMHhhZTgwLAorCTB4MDAwMywgMHgyMDcxLCAweDAwMDAsIDB4MjFhOCwgMHgyMDE0LCAweDcyMjYsIDB4ODAwMCwgMHgwZjA0LAorCTB4NTQ0YSwgMHgyMDE0LCAweDcyMmEsIDB4ODAwMCwgMHgwZjA0LCAweDU0NGEsIDB4MjAxNCwgMHg3MjJlLAorCTB4ODAwMCwgMHgwZjA0LCAweDU0NGEsIDB4MjAxNCwgMHg3MjNhLCAweDgwMDAsIDB4MGYwNCwgMHg1NDRhLAorCTB4MjAxNCwgMHg3MjNlLCAweGExODAsIDB4ODAzMCwgMHg3MDIyLCAweDAxNWUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgwMTU2LCAweDIwNzEsIDB4YWYzNCwgMHg3MTg0LCAweDgxZmYsIDB4MDFkOCwgMHhhMDA2LAorCTB4NzA4NiwgMHhhZTgwLCAweDAwMDMsIDB4MjA3MSwgMHgwMDAwLCAweDIxYTgsIDB4MjAxNCwgMHg3MjI2LAorCTB4ODAwMCwgMHgyMDE0LCAweDcyMmEsIDB4ODAwMCwgMHgwZjA0LCAweDU0NmMsIDB4MjAxNCwgMHg3MjNhLAorCTB4ODAwMCwgMHgyMDE0LCAweDcyM2UsIDB4MDAxOCwgMHgyMDAxLCAweDgwMjAsIDB4MDAxMCwgMHgyMDAxLAorCTB4ODA0MiwgMHg3MDIyLCAweDAxNWUsIDB4MDBlZSwgMHgwMDA1LCAweDcwMmMsIDB4NzEzMCwgMHg4MTA4LAorCTB4YTEwMiwgMHgwMjMwLCAweGEwMGUsIDB4NzAzNCwgMHg3MDZlLCAweDcwMzgsIDB4NzA3MiwgMHgwMDQ4LAorCTB4NzA2YywgMHhhMDgwLCAweDAwNDAsIDB4NzA2ZSwgMHgxMjIwLCAweDcwNzAsIDB4YTA4MSwgMHgwMDAwLAorCTB4NzA3MiwgMHg3MTMyLCAweDcwMGMsIDB4ODAwMSwgMHg3MDBlLCAweDExODAsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwZTA0LCAweDU0YTEsIDB4MjAwMSwgMHgwMDBkLCAweDIxMDIsIDB4MjA5MSwgMHg0MDgwLAorCTB4MjAwMSwgMHgwMDAxLCAweDcwMGIsIDB4MDAwMCwgMHgwMTJlLCAweDAwMDUsIDB4MjAwMSwgMHgwMDA3LAorCTB4MDAwNSwgMHgyMDAxLCAweDAwMDYsIDB4NzAwYiwgMHgwMDAxLCAweDAxMmUsIDB4MDAwNSwgMHg3MDFjLAorCTB4YTA2ZCwgMHgwMTcwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwMTAsIDB4ODAwMSwgMHg3MDEyLAorCTB4MmQwNCwgMHg3MDFlLCAweGEwMDUsIDB4MTEwOCwgMHg3MDFhLCAweDAxMmUsIDB4MDgwYywgMHgxNWYwLAorCTB4MDAwNSwgMHgyMDE5LCAweDAwMGQsIDB4MjMwNCwgMHgyMzBjLCAweGExMGUsIDB4MDEzMCwgMHgyMzA0LAorCTB4MjMwYywgMHhhMTBlLCAweDAxMTAsIDB4YTAwNiwgMHgwMDYwLCAweDczMmMsIDB4ODMxOSwgMHg3MTMwLAorCTB4YTEwMiwgMHgxMTE4LCAweDIzMDAsIDB4YTAwNSwgMHgwMDIwLCAweDAyMTAsIDB4YTMwMiwgMHgwMDA4LAorCTB4ODAwMiwgMHgwMDA1LCAweDJkMDAsIDB4NzAyNiwgMHhhMDgwLCAweDAwMGQsIDB4NzA1NiwgMHg3MDUzLAorCTB4MDAwMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDA5LCAweGFmZWMsIDB4MjEwNCwgMHhjMDhkLAorCTB4MjAwYSwgMHgwMTJlLCAweDA4MGMsIDB4MTYzYywgMHgwMDA1LCAweDcwODgsIDB4YTA4YSwgMHgwMDI5LAorCTB4MTIyMCwgMHhhMDgyLCAweDAwMWQsIDB4MDAzMywgMHgwMDEwLCAweDA4MGMsIDB4MTRmNiwgMHg2MDI3LAorCTB4MWUwMCwgMHgwMDA1LCAweDU1YzEsIDB4NTU1YiwgMHg1NTcxLCAweDU1OTUsIDB4NTViNCwgMHg1NWU2LAorCTB4NTVmOCwgMHg1NTcxLCAweDU1ZDIsIDB4NTRmZiwgMHg1NTJkLCAweDU0ZmUsIDB4MDAwNSwgMHgwMGQ2LAorCTB4MjA2OSwgMHgwMjAwLCAweDY4MDQsIDB4YTAwNSwgMHgxMTgwLCAweDY4MDgsIDB4YTAwNSwgMHgxNTE4LAorCTB4NzA4YiwgMHgwMDI4LCAweDIwNjksIDB4YWZhYywgMHgyZDA0LCAweDcwMDIsIDB4MDgwYywgMHg1ODRkLAorCTB4NjAyOCwgMHhhMDg1LCAweDA2MDAsIDB4NjAyYSwgMHgwMGIwLCAweDcwOGIsIDB4MDAyOCwgMHgyMDY5LAorCTB4YWZhYywgMHgyZDA0LCAweDcwMDIsIDB4NjAyOCwgMHhhMDg1LCAweDA2MDAsIDB4NjAyYSwgMHgwMGU2LAorCTB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MjA3MSwgMHhhZmZkLCAweDA4MGMsIDB4MWQyMiwgMHgwMDVlLAorCTB4MDA0ZSwgMHgwMDNlLCAweDAwZWUsIDB4MDBkZSwgMHgwMDA1LCAweDAwZDYsIDB4MjA2OSwgMHgwMjAwLAorCTB4NjgwNCwgMHhhMDA1LCAweDExODAsIDB4NjgwOCwgMHhhMDA1LCAweDE1MTgsIDB4NzA4YiwgMHgwMDI4LAorCTB4MjA2OSwgMHhhZmFjLCAweDJkMDQsIDB4NzAwMiwgMHgwODBjLCAweDU4ZGEsIDB4NjAyOCwgMHhhMDg1LAorCTB4MDYwMCwgMHg2MDJhLCAweDAwYjAsIDB4NzA4YiwgMHgwMDI4LCAweDIwNjksIDB4YWZhYywgMHgyZDA0LAorCTB4NzAwMiwgMHg2MDI4LCAweGEwODUsIDB4MDYwMCwgMHg2MDJhLCAweDAwZTYsIDB4MDAzNiwgMHgwMDQ2LAorCTB4MDA1NiwgMHgyMDcxLCAweGFmZmQsIDB4MDgwYywgMHgxZDIyLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDNlLAorCTB4MDBlZSwgMHgwMGRlLCAweDAwMDUsIDB4NjgwMywgMHgwMDkwLCAweDYxMjQsIDB4ZDFlNCwgMHgxMTgwLAorCTB4MDgwYywgMHg1NjYzLCAweGQxZDQsIDB4MTE1MCwgMHhkMWRjLCAweDExMjgsIDB4ZDFjYywgMHgwMTQwLAorCTB4NzA4YiwgMHgwMDIwLCAweDAwMjgsIDB4NzA4YiwgMHgwMDFkLCAweDAwMTAsIDB4NzA4YiwgMHgwMDFmLAorCTB4MDAwNSwgMHg2ODAzLCAweDAwODgsIDB4NjEyNCwgMHhkMWNjLCAweDExYzgsIDB4ZDFkYywgMHgxMWEwLAorCTB4ZDFlNCwgMHgxMTc4LCAweGExODQsIDB4MWUwMCwgMHgxMWI4LCAweDYwZTMsIDB4MDAwMSwgMHg2MDBjLAorCTB4YzBiNCwgMHg2MDBlLCAweDA4MGMsIDB4NTc3ZiwgMHg2ODAzLCAweDAwODAsIDB4NzA4YiwgMHgwMDI4LAorCTB4MDA1OCwgMHg3MDhiLCAweDAwMWUsIDB4MDA0MCwgMHg3MDhiLCAweDAwMWQsIDB4MDAyOCwgMHg3MDhiLAorCTB4MDAyMCwgMHgwMDEwLCAweDcwOGIsIDB4MDAxZiwgMHgwMDA1LCAweDYwZTMsIDB4MDAwMSwgMHg2MDBjLAorCTB4YzBiNCwgMHg2MDBlLCAweDA4MGMsIDB4NTc3ZiwgMHg2ODAzLCAweDAwODAsIDB4NjEyNCwgMHhkMWQ0LAorCTB4MTE4MCwgMHhkMWRjLCAweDExNTgsIDB4ZDFlNCwgMHgxMTMwLCAweGExODQsIDB4MWUwMCwgMHgxMTU4LAorCTB4NzA4YiwgMHgwMDI4LCAweDAwNDAsIDB4NzA4YiwgMHgwMDFlLCAweDAwMjgsIDB4NzA4YiwgMHgwMDFkLAorCTB4MDAxMCwgMHg3MDhiLCAweDAwMWYsIDB4MDAwNSwgMHg2ODAzLCAweDAwYTAsIDB4NjEyNCwgMHhkMWRjLAorCTB4MTEyOCwgMHhkMWU0LCAweDAxMjgsIDB4NzA4YiwgMHgwMDFlLCAweDAwMTAsIDB4NzA4YiwgMHgwMDFkLAorCTB4MDAwNSwgMHgwODBjLCAweDU2OGQsIDB4NjEyNCwgMHhkMWRjLCAweDExNTgsIDB4MDgwYywgMHg1NjYzLAorCTB4ZDFkNCwgMHgxMTI4LCAweGQxZTQsIDB4MDEyOCwgMHg3MDhiLCAweDAwMWUsIDB4MDAxMCwgMHg3MDhiLAorCTB4MDAxZiwgMHgwMDA1LCAweDY4MDMsIDB4MDBhMCwgMHg2MTI0LCAweGQxZDQsIDB4MTE2MCwgMHhkMWNjLAorCTB4MTE1MCwgMHhkMWRjLCAweDExMjgsIDB4ZDFlNCwgMHgwMTQwLCAweDcwOGIsIDB4MDAxZSwgMHgwMDI4LAorCTB4NzA4YiwgMHgwMDFkLCAweDAwMTAsIDB4NzA4YiwgMHgwMDIxLCAweDAwMDUsIDB4MDgwYywgMHg1NjhkLAorCTB4NjEyNCwgMHhkMWQ0LCAweDExNTAsIDB4ZDFkYywgMHgxMTI4LCAweGQxZTQsIDB4MDE0MCwgMHg3MDhiLAorCTB4MDAxZSwgMHgwMDI4LCAweDcwOGIsIDB4MDAxZCwgMHgwMDEwLCAweDcwOGIsIDB4MDAxZiwgMHgwMDA1LAorCTB4NjgwMywgMHgwMDkwLCAweDYxMjQsIDB4ZDFkNCwgMHgxMTc4LCAweGQxY2MsIDB4MTE1MCwgMHhkMWRjLAorCTB4MTEyOCwgMHhkMWU0LCAweDAxNTgsIDB4NzA4YiwgMHgwMDFlLCAweDAwNDAsIDB4NzA4YiwgMHgwMDFkLAorCTB4MDAyOCwgMHg3MDhiLCAweDAwMjAsIDB4MDAxMCwgMHg3MDhiLCAweDAwMWYsIDB4MDAwNSwgMHgwMDE2LAorCTB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDEyNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLAorCTB4MjA3MSwgMHhhZDAwLCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDU3NGYsIDB4MTFlOCwgMHgyMDAxLAorCTB4YWQwYywgMHgyMDBjLCAweGQxYjQsIDB4MDFjMCwgMHhjMWI0LCAweDIxMDIsIDB4NjAyNywgMHgwMjAwLAorCTB4ZTAwMCwgMHhlMDAwLCAweDYwMjQsIDB4ZDBjYywgMHgwMTU4LCAweDY4MDMsIDB4MDBhMCwgMHgyMDAxLAorCTB4YWY5ZSwgMHgyMDAzLCAweDAwMDEsIDB4MjAwMSwgMHhhZDAwLCAweDIwMDMsIDB4MDAwMSwgMHgwNDI4LAorCTB4NjAyOCwgMHhjMGNkLCAweDYwMmEsIDB4MDQwOCwgMHgwODBjLCAweDU3NmIsIDB4MDE1MCwgMHgwODBjLAorCTB4NTc2MSwgMHgxMTM4LCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI2MWUsIDB4MDgwYywgMHg1NzI2LAorCTB4MDBhMCwgMHgwODBjLCAweDU2OGEsIDB4MDE3OCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyNjFlLAorCTB4NzA4OCwgMHhhMDg2LCAweDAwMWUsIDB4MDEyMCwgMHg3MDg4LCAweGEwODYsIDB4MDAyMiwgMHgxMTE4LAorCTB4NzA4YiwgMHgwMDI1LCAweDAwMTAsIDB4NzA4YiwgMHgwMDIxLCAweDAxMmUsIDB4MDBlZSwgMHgwMGRlLAorCTB4MDBjZSwgMHgwMDFlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDIwMDksIDB4MDA2NCwgMHgyMDExLAorCTB4NTY2ZSwgMHgwODBjLCAweDY1MDEsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGY2LAorCTB4MDAxNiwgMHgwODBjLCAweDc4MzQsIDB4MjA3MSwgMHhhZDAwLCAweDA4MGMsIDB4NTYwZiwgMHgwMDFlLAorCTB4MDBmZSwgMHgwMGVlLCAweDAwMDUsIDB4MjAwMSwgMHhhZDAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDA0LAorCTB4MDE0MCwgMHgyMDAxLCAweGFmOWQsIDB4MjAwMywgMHhhYWFhLCAweDIwMDEsIDB4YWY5ZSwgMHgyMDAzLAorCTB4MDAwMCwgMHgwMDA1LCAweDYwMjAsIDB4ZDA5YywgMHgwMDA1LCAweDY4MDMsIDB4MDBjMCwgMHgwMTU2LAorCTB4MjBhOSwgMHgwMDJkLCAweDFkMDQsIDB4NTY5MiwgMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwgMHg1NjkyLAorCTB4MDE1ZSwgMHgwMDA1LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LAorCTB4MDE0MCwgMHgyMDcxLCAweGFkMDAsIDB4MjAwMSwgMHhhZjllLCAweDIwMGMsIDB4YTE4NiwgMHgwMDAwLAorCTB4MDE1OCwgMHhhMTg2LCAweDAwMDEsIDB4MDE1OCwgMHhhMTg2LCAweDAwMDIsIDB4MDE1OCwgMHhhMTg2LAorCTB4MDAwMywgMHgwMTU4LCAweDA4MDQsIDB4NTcxNCwgMHg3MDhiLCAweDAwMjIsIDB4MDA0MCwgMHg3MDhiLAorCTB4MDAyMSwgMHgwMDI4LCAweDcwOGIsIDB4MDAyMywgMHgwMDIwLCAweDcwOGIsIDB4MDAyNCwgMHg2MDQzLAorCTB4MDAwMCwgMHg2MGUzLCAweDAwMDAsIDB4Njg4NywgMHgwMDAxLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLAorCTB4MjZjYiwgMHgwMDI2LCAweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweDdhZGYsIDB4MjAxMSwgMHgwMDAyLAorCTB4MDgwYywgMHg3YWU5LCAweDAwMmUsIDB4NzAwMCwgMHhhMDhlLCAweDAwMDQsIDB4MDExOCwgMHg2MDJiLAorCTB4MDAyOCwgMHgwMDEwLCAweDYwMmIsIDB4MDAyMCwgMHgwMTU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjBhOSwgMHgwMDA1LCAweDYwMjQsIDB4ZDBhYywgMHgwMTE4LCAweDAxMmUsIDB4MDE1ZSwgMHgwNGQwLAorCTB4NjgwMCwgMHhhMDg0LCAweDAwYTAsIDB4YzBiZCwgMHg2ODAyLCAweDY5MDQsIDB4ZDFkNCwgMHgxMTMwLAorCTB4NjgwMywgMHgwMTAwLCAweDFmMDQsIDB4NTZlMiwgMHgwODBjLCAweDU3YTAsIDB4MDEyZSwgMHgwMTVlLAorCTB4MDgwYywgMHg1NzYxLCAweDAxYTgsIDB4NjA0NCwgMHhhMDA1LCAweDAxNjgsIDB4NjA1MCwgMHgwMDA2LAorCTB4YTA4NSwgMHgwMDIwLCAweDYwNTIsIDB4MDgwYywgMHg1N2EwLCAweGEwMDYsIDB4ODAwMSwgMHgxZGYwLAorCTB4MDAwZSwgMHg2MDUyLCAweDAwMjgsIDB4NjgwNCwgMHhkMGQ0LCAweDExMTAsIDB4MDgwYywgMHg1N2EwLAorCTB4MjAwMSwgMHhhZjllLCAweDIwMDMsIDB4MDAwNCwgMHgwODBjLCAweDU0ZTUsIDB4MDgwYywgMHg1NzYxLAorCTB4MDE0OCwgMHg2ODA0LCAweGQwZDQsIDB4MTEzMCwgMHhkMGRjLCAweDExMDAsIDB4MjAwMSwgMHhhZjllLAorCTB4MjAwMywgMHgwMDAwLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LAorCTB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLCAweDIwNzEsIDB4YWQwMCwgMHgyMDAxLAorCTB4YWY5ZCwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHhhZjhlLCAweDIwMDMsIDB4MDAwMCwgMHg3MDhiLAorCTB4MDAwMCwgMHg2MGUzLCAweDAwMDAsIDB4Njg4NywgMHgwMDAwLCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLAorCTB4MjZjYiwgMHg2ODAzLCAweDAwMDAsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHg2MDI3LAorCTB4ZmZmZiwgMHg2MDJiLCAweDE4MmYsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMDA2LAorCTB4MjAwMSwgMHhhZjlkLCAweDIwMDQsIDB4YTA4NiwgMHhhYWFhLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LAorCTB4MjAwMSwgMHhhZDcxLCAweDIwMDQsIDB4YTA4NCwgMHgwMDMwLCAweGEwODYsIDB4MDAwMCwgMHgwMDBlLAorCTB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4YWQ3MSwgMHgyMDA0LCAweGEwODQsIDB4MDAzMCwgMHhhMDg2LAorCTB4MDAzMCwgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweGFkNzEsIDB4MjAwNCwgMHhhMDg0LAorCTB4MDAzMCwgMHhhMDg2LCAweDAwMTAsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHhhZDcxLAorCTB4MjAwNCwgMHhhMDg0LCAweDAwMzAsIDB4YTA4NiwgMHgwMDIwLCAweDAwMGUsIDB4MDAwNSwgMHgyMDAxLAorCTB4YWQwYywgMHgyMDA0LCAweGQwYTQsIDB4MDE3MCwgMHgwODBjLCAweDI2ZWIsIDB4MDAzNiwgMHgwMDE2LAorCTB4MjAwOSwgMHgwMDAwLCAweDIwMTksIDB4MDAyOCwgMHgwODBjLCAweDJhYWMsIDB4MDAxZSwgMHgwMDNlLAorCTB4YTAwNiwgMHgwMDA5LCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweGFkMGMsIDB4MmUwNCwgMHgwMTE4LAorCTB4YTA4NSwgMHgwMDEwLCAweDAwMTAsIDB4YTA4NCwgMHhmZmVmLCAweDIwNzIsIDB4MDBlZSwgMHgwMDA1LAorCTB4NjA1MCwgMHgwMDA2LCAweDYwZjAsIDB4MDAwNiwgMHg2MGVjLCAweDAwMDYsIDB4NjAwYywgMHgwMDA2LAorCTB4NjAwNCwgMHgwMDA2LCAweDYwMjgsIDB4MDAwNiwgMHg2MDJmLCAweDAxMDAsIDB4NjAyZiwgMHgwMDAwLAorCTB4NjAyZiwgMHgwMDQwLCAweDYwMmYsIDB4MDAwMCwgMHgwMDBlLCAweDYwMmEsIDB4MDAwZSwgMHg2MDA2LAorCTB4MDAwZSwgMHg2MDBlLCAweDAwMGUsIDB4NjBlZSwgMHgwMDBlLCAweDYwZjIsIDB4NjBlMywgMHgwMDAwLAorCTB4Njg4NywgMHgwMDAxLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI2Y2IsIDB4NjgwMCwgMHhhMDg0LAorCTB4MDBhMCwgMHhjMGJkLCAweDY4MDIsIDB4NjgwMywgMHgwMGEwLCAweDAwMGUsIDB4NjA1MiwgMHg2MDUwLAorCTB4MDAwNSwgMHgwMTU2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LAorCTB4MjA2MSwgMHgwMTAwLCAweDIwNjksIDB4MDE0MCwgMHgyMDcxLCAweGFkMDAsIDB4NjAyMCwgMHhhMDg0LAorCTB4MDA4MCwgMHgwMTM4LCAweDIwMDEsIDB4YWQwYywgMHgyMDBjLCAweGMxYmQsIDB4MjEwMiwgMHgwODA0LAorCTB4NTg0NSwgMHgyMDAxLCAweGFkMGMsIDB4MjAwYywgMHhjMWJjLCAweDIxMDIsIDB4NjAyOCwgMHhhMDg0LAorCTB4ZTFmZiwgMHg2MDJhLCAweDYwMjcsIDB4MDIwMCwgMHg2ODAzLCAweDAwOTAsIDB4MjBhOSwgMHgwMzg0LAorCTB4NjAyNCwgMHhkMGNjLCAweDE1MTgsIDB4MWQwNCwgMHg1N2Y4LCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LAorCTB4NTdmOCwgMHgyMDExLCAweDAwMDMsIDB4MDgwYywgMHg3YWRmLCAweDIwMTEsIDB4MDAwMiwgMHgwODBjLAorCTB4N2FlOSwgMHgwODBjLCAweDc5ZTEsIDB4MDgwYywgMHg2NTgxLCAweDIwMTksIDB4MDAwMCwgMHgwODBjLAorCTB4N2E2NCwgMHg2ODAzLCAweDAwYTAsIDB4MjAwMSwgMHhhZjllLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLAorCTB4YWQwMCwgMHgyMDAzLCAweDAwMDEsIDB4YTA4NSwgMHgwMDAxLCAweDA0MzgsIDB4NjBlMywgMHgwMDAwLAorCTB4MjAwMSwgMHhhZjhlLCAweDIwMDQsIDB4MDgwYywgMHgyNmNiLCAweDYwZTIsIDB4NjgwMywgMHgwMDgwLAorCTB4MjBhOSwgMHgwMzg0LCAweDYwMjcsIDB4MWUwMCwgMHgyMDA5LCAweDFlMDAsIDB4ZTAwMCwgMHg2MDI0LAorCTB4YTEwYywgMHgwMTM4LCAweDFkMDQsIDB4NTgyYSwgMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwgMHg1ODJhLAorCTB4MDg0MCwgMHg2MDI4LCAweGEwODUsIDB4MWUwMCwgMHg2MDJhLCAweDcwYTAsIDB4YTAwNSwgMHgxMTE4LAorCTB4Njg4NywgMHgwMDAxLCAweDAwMDgsIDB4Njg4NiwgMHhhMDA2LCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDE1ZSwgMHgwMDA1LCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LAorCTB4MDAzNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHhhZDAwLAorCTB4MjA2OSwgMHgwMTQwLCAweDYwMjAsIDB4YTA4NCwgMHgwMGMwLCAweDAxMjAsIDB4Njg4NCwgMHhhMDA1LAorCTB4MTkwNCwgMHg1OGExLCAweDY4MDMsIDB4MDA4OCwgMHg2MGUzLCAweDAwMDAsIDB4Njg4NywgMHgwMDAwLAorCTB4MjAwMSwgMHgwMDAwLCAweDA4MGMsIDB4MjZjYiwgMHgyMDY5LCAweDAyMDAsIDB4NjgwNCwgMHhhMDA1LAorCTB4MTExOCwgMHg2ODA4LCAweGEwMDUsIDB4MDFjMCwgMHg2MDI4LCAweGEwODQsIDB4ZmJmZiwgMHg2MDJhLAorCTB4NjAyNywgMHgwNDAwLCAweDIwNjksIDB4YWZhYywgMHg3MDAwLCAweDIwNmEsIDB4NzA4YiwgMHgwMDI2LAorCTB4NzAwMywgMHgwMDAxLCAweDIwYTksIDB4MDAwMiwgMHgxZDA0LCAweDU4ODQsIDB4MjA5MSwgMHg2MDAwLAorCTB4MWYwNCwgMHg1ODg0LCAweDA4MDQsIDB4NThkMiwgMHgyMDY5LCAweDAxNDAsIDB4MjBhOSwgMHgwMzg0LAorCTB4NjAyNywgMHgxZTAwLCAweDIwMDksIDB4MWUwMCwgMHhlMDAwLCAweDYwMjQsIDB4YTEwYywgMHgwNTMwLAorCTB4YTA4NCwgMHgxYTAwLCAweDE1MTgsIDB4MWQwNCwgMHg1ODkwLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LAorCTB4NTg5MCwgMHgyMDExLCAweDAwMDMsIDB4MDgwYywgMHg3YWRmLCAweDIwMTEsIDB4MDAwMiwgMHgwODBjLAorCTB4N2FlOSwgMHgwODBjLCAweDc5ZTEsIDB4MDgwYywgMHg2NTgxLCAweDIwMTksIDB4MDAwMCwgMHgwODBjLAorCTB4N2E2NCwgMHg2ODAzLCAweDAwYTAsIDB4MjAwMSwgMHhhZjllLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLAorCTB4YWQwMCwgMHgyMDAzLCAweDAwMDEsIDB4YTA4NSwgMHgwMDAxLCAweDAwYTAsIDB4NjgwMywgMHgwMDgwLAorCTB4MjA2OSwgMHgwMTQwLCAweDYwZTMsIDB4MDAwMCwgMHg3MGEwLCAweGEwMDUsIDB4MTExOCwgMHg2ODg3LAorCTB4MDAwMSwgMHgwMDA4LCAweDY4ODYsIDB4MjAwMSwgMHhhZjhlLCAweDIwMDQsIDB4MDgwYywgMHgyNmNiLAorCTB4NjBlMiwgMHhhMDA2LCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDE1ZSwgMHgwMDA1LCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwgMHgwMGQ2LAorCTB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHhhZDAwLCAweDYwMjAsIDB4YTA4NCwgMHgwMGMwLAorCTB4MDFmMCwgMHgyMDExLCAweDAwMDMsIDB4MDgwYywgMHg3YWRmLCAweDIwMTEsIDB4MDAwMiwgMHgwODBjLAorCTB4N2FlOSwgMHgwODBjLCAweDc5ZTEsIDB4MDgwYywgMHg2NTgxLCAweDIwMTksIDB4MDAwMCwgMHgwODBjLAorCTB4N2E2NCwgMHgyMDY5LCAweDAxNDAsIDB4NjgwMywgMHgwMGEwLCAweDIwMDEsIDB4YWY5ZSwgMHgyMDAzLAorCTB4MDAwMSwgMHgyMDAxLCAweGFkMDAsIDB4MjAwMywgMHgwMDAxLCAweDA4MDQsIDB4NTk3MiwgMHgyMDAxLAorCTB4YWQwYywgMHgyMDBjLCAweGQxYjQsIDB4MTE1MCwgMHhjMWI1LCAweDIxMDIsIDB4MDgwYywgMHg1NjYzLAorCTB4MjA2OSwgMHgwMTQwLCAweDY4MDMsIDB4MDA4MCwgMHg2MGUzLCAweDAwMDAsIDB4MjA2OSwgMHgwMjAwLAorCTB4NjgwNCwgMHhhMDA1LCAweDExMTgsIDB4NjgwOCwgMHhhMDA1LCAweDAxYjgsIDB4NjAyOCwgMHhhMDg0LAorCTB4ZmRmZiwgMHg2MDJhLCAweDYwMjcsIDB4MDIwMCwgMHgyMDY5LCAweGFmYWMsIDB4NzAwMCwgMHgyMDZhLAorCTB4NzA4YiwgMHgwMDI3LCAweDcwMDMsIDB4MDAwMSwgMHgyMGE5LCAweDAwMDIsIDB4MWQwNCwgMHg1OTJlLAorCTB4MjA5MSwgMHg2MDAwLCAweDFmMDQsIDB4NTkyZSwgMHgwNGU4LCAweDYwMjcsIDB4MWUwMCwgMHgyMDA5LAorCTB4MWUwMCwgMHhlMDAwLCAweDYwMjQsIDB4YTEwYywgMHgwMWM4LCAweGEwODQsIDB4MWMwMCwgMHgxMWIwLAorCTB4MWQwNCwgMHg1OTM1LCAweDAwMDYsIDB4MDAxNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwODBjLAorCTB4NjRhMiwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDFlLCAweDAwMGUsIDB4MDBlNiwgMHgyMDcxLAorCTB4YWZkYSwgMHg3MDE4LCAweDAwZWUsIDB4YTAwNSwgMHgxZDAwLCAweDAxZTAsIDB4MDAyNiwgMHgyMDExLAorCTB4NTY2ZSwgMHgwODBjLCAweDY1MGQsIDB4MDAyZSwgMHgyMDY5LCAweDAxNDAsIDB4NjBlMywgMHgwMDAwLAorCTB4NzBhMCwgMHhhMDA1LCAweDExMTgsIDB4Njg4NywgMHgwMDAxLCAweDAwMDgsIDB4Njg4NiwgMHgyMDAxLAorCTB4YWY4ZSwgMHgyMDA0LCAweDA4MGMsIDB4MjZjYiwgMHg2MGUyLCAweDIwMDEsIDB4YWQwYywgMHgyMDBjLAorCTB4YzFiNCwgMHgyMTAyLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDE1ZSwgMHgwMDA1LCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDA0NiwgMHgwMGM2LAorCTB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHhhZDAwLCAweDcxMzAsIDB4ZDE4NCwgMHgxMTgwLAorCTB4MjAxMSwgMHhhZDUyLCAweDIyMTQsIDB4ZDJlYywgMHgwMTM4LCAweGMxOGQsIDB4NzEzMiwgMHgyMDExLAorCTB4YWQ1MiwgMHgyMjE0LCAweGQyYWMsIDB4MTEyMCwgMHg3MDMwLCAweGQwOGMsIDB4MDkwNCwgMHg1OWRmLAorCTB4NzEzMCwgMHhjMTg1LCAweDcxMzIsIDB4MjAxMSwgMHhhZDUyLCAweDIyMGMsIDB4ZDFhNCwgMHgwNTMwLAorCTB4MDAxNiwgMHgyMDA5LCAweDAwMDEsIDB4MjAxMSwgMHgwMTAwLCAweDA4MGMsIDB4NjYzZiwgMHgyMDE5LAorCTB4MDAwZSwgMHgwODBjLCAweGE4ZWIsIDB4MDE1NiwgMHgyMGE5LCAweDAwN2YsIDB4MjAwOSwgMHgwMDAwLAorCTB4YTE4NiwgMHgwMDdlLCAweDAxNzAsIDB4YTE4NiwgMHgwMDgwLCAweDAxNTgsIDB4MDgwYywgMHg0Y2RjLAorCTB4MTE0MCwgMHg4MTI3LCAweGEwMDYsIDB4MDAxNiwgMHgyMDA5LCAweDAwMGUsIDB4MDgwYywgMHhhOTZjLAorCTB4MDAxZSwgMHg4MTA4LCAweDFmMDQsIDB4NTliMCwgMHgwMTVlLCAweDAwMWUsIDB4ZDFhYywgMHgxMTQ4LAorCTB4MDAxNiwgMHgyMDA5LCAweDAwMDAsIDB4MjAxOSwgMHgwMDA0LCAweDA4MGMsIDB4MmFhYywgMHgwMDFlLAorCTB4MDA3MCwgMHgwMTU2LCAweDIwYTksIDB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHg0Y2RjLAorCTB4MTExMCwgMHgwODBjLCAweDQ5M2EsIDB4ODEwOCwgMHgxZjA0LCAweDU5ZDYsIDB4MDE1ZSwgMHgyMDExLAorCTB4MDAwMywgMHgwODBjLCAweDdhZGYsIDB4MjAxMSwgMHgwMDAyLCAweDA4MGMsIDB4N2FlOSwgMHgwODBjLAorCTB4NzllMSwgMHgwODBjLCAweDY1ODEsIDB4MDAzNiwgMHgyMDE5LCAweDAwMDAsIDB4MDgwYywgMHg3YTY0LAorCTB4MDAzZSwgMHg2MGUzLCAweDAwMDAsIDB4MjAwMSwgMHhhZDAwLCAweDIwMDMsIDB4MDAwMSwgMHgwODBjLAorCTB4NTY5YSwgMHgwMGVlLCAweDAwY2UsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMTVlLAorCTB4MDAwNSwgMHgyMDcxLCAweGFkZTEsIDB4NzAwMywgMHgwMDAwLCAweDcwMDcsIDB4MDAwMCwgMHg3MDBmLAorCTB4MDAwMCwgMHg3MDJiLCAweDAwMDEsIDB4NzA0ZiwgMHgwMDAwLCAweDcwNTMsIDB4MDAwMSwgMHg3MDVmLAorCTB4MDAyMCwgMHg3MDYzLCAweDAwNDAsIDB4NzA4MywgMHgwMDAwLCAweDcwOGIsIDB4MDAwMCwgMHg3MDhmLAorCTB4MDAwMSwgMHg3MGJmLCAweDAwMDAsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4YWRlMSwgMHg2ODQ4LAorCTB4YTAwNSwgMHgxMTMwLCAweDcwMjgsIDB4YzA4NSwgMHg3MDJhLCAweGEwODUsIDB4MDAwMSwgMHgwNDI4LAorCTB4NmE1MCwgMHg3MjM2LCAweDZiNTQsIDB4NzMzYSwgMHg2ODU4LCAweDcwM2UsIDB4NzA3YSwgMHg2ODVjLAorCTB4NzA0MiwgMHg3MDdlLCAweDY4NDgsIDB4NzAyZSwgMHg2ODQwLCAweDcwMzIsIDB4MjAwOSwgMHgwMDBjLAorCTB4MjAwYSwgMHg4MDA3LCAweDgwMDYsIDB4ODAwNiwgMHhhMDhjLCAweDAwM2YsIDB4YTA4NCwgMHhmZmMwLAorCTB4YTIxMCwgMHgyMTAwLCAweGEzMTksIDB4NzI3MiwgMHg3Mzc2LCAweDcwMjgsIDB4YzA4NCwgMHg3MDJhLAorCTB4NzAwNywgMHgwMDAxLCAweDcwMGYsIDB4MDAwMCwgMHhhMDA2LCAweDAwZWUsIDB4MDAwNSwgMHgyYjc4LAorCTB4MjA3MSwgMHhhZGUxLCAweDcwMDQsIDB4MDA0MywgMHg3MDBjLCAweDAwMDIsIDB4NWE1YiwgMHg1YTUyLAorCTB4NWE1MiwgMHg1YTUyLCAweDVhNTIsIDB4MDAwNSwgMHg1YWIxLCAweDVhYjIsIDB4NWFlNCwgMHg1YWU1LAorCTB4NWFhZiwgMHg1YjMzLCAweDViMzgsIDB4NWI2OSwgMHg1YjZhLCAweDViODUsIDB4NWI4NiwgMHg1Yjg3LAorCTB4NWI4OCwgMHg1Yjg5LCAweDViOGEsIDB4NWM0MCwgMHg1YzY3LCAweDcwMGMsIDB4MDAwMiwgMHg1YTc0LAorCTB4NWFhZiwgMHg1YWFmLCAweDVhYjAsIDB4NWFiMCwgMHg3ODMwLCAweDc5MzAsIDB4YTEwNiwgMHgwMTIwLAorCTB4NzgzMCwgMHg3OTMwLCAweGExMDYsIDB4MTUxMCwgMHg3MDMwLCAweGExMGEsIDB4MDFmOCwgMHgxMjEwLAorCTB4NzEyYywgMHhhMTBhLCAweGExOGEsIDB4MDAwMiwgMHgxMmQwLCAweDA4MGMsIDB4MTVjMCwgMHgwMWIwLAorCTB4MmQwMCwgMHg3MDVhLCAweDcwNjMsIDB4MDA0MCwgMHgyMDAxLCAweDAwMDMsIDB4NzA1NywgMHgwMDAwLAorCTB4MDEyNiwgMHgwMDA2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDA5LCAweGFmZWMsIDB4MjEwNCwgMHhjMDg1LAorCTB4MjAwYSwgMHgwMDBlLCAweDcwMGUsIDB4MDEyZSwgMHgwODBjLCAweDE2M2MsIDB4MDAwNSwgMHgwODBjLAorCTB4MTVjMCwgMHgwZGUwLCAweDJkMDAsIDB4NzA1YSwgMHgwODBjLCAweDE1YzAsIDB4MTEwOCwgMHgwYzEwLAorCTB4MmQwMCwgMHg3MDg2LCAweDcwNjMsIDB4MDA4MCwgMHgyMDAxLCAweDAwMDQsIDB4MDhmOCwgMHgwMDA1LAorCTB4MDAwNSwgMHgwMDA1LCAweDcwMGMsIDB4MDAwMiwgMHg1YWI5LCAweDVhYmMsIDB4NWFjYSwgMHg1YWUzLAorCTB4NWFlMywgMHgwODBjLCAweDVhNmQsIDB4MDAwNSwgMHgwMTI2LCAweDgwMDEsIDB4NzAwZSwgMHg3MDU4LAorCTB4MDAwNiwgMHgwODBjLCAweDVmOTAsIDB4MDEyMCwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg1YTZkLAorCTB4MDBkZSwgMHgwMDQ4LCAweDAxMjYsIDB4ODAwMSwgMHg3MDBlLCAweDA4MGMsIDB4NWY5MCwgMHg3MDU4LAorCTB4MjA2OCwgMHg3MDg0LCAweDcwNWEsIDB4NjgwMywgMHgwMDAwLCAweDY4MDcsIDB4MDAwMCwgMHg2ODM0LAorCTB4YTA4NCwgMHgwMGZmLCAweGEwOGEsIDB4MDAzYSwgMHgxMjE4LCAweDAwZGIsIDB4MDEyZSwgMHgwMDA1LAorCTB4MDEyZSwgMHgwODBjLCAweDViOGIsIDB4MDAwNSwgMHgwMDA1LCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLAorCTB4YWRlMSwgMHg3MDBjLCAweDAwMDIsIDB4NWFmMCwgMHg1YWYwLCAweDVhZjAsIDB4NWFmMiwgMHg1YWY1LAorCTB4MDBlZSwgMHgwMDA1LCAweDcwMGYsIDB4MDAwMSwgMHgwMDEwLCAweDcwMGYsIDB4MDAwMiwgMHgwMGVlLAorCTB4MDAwNSwgMHg1YjhiLCAweDViOGIsIDB4NWJhNywgMHg1YjhiLCAweDVkMjIsIDB4NWI4YiwgMHg1YjhiLAorCTB4NWI4YiwgMHg1YjhiLCAweDViOGIsIDB4NWJhNywgMHg1ZDY0LCAweDVkYTcsIDB4NWRmMCwgMHg1ZTA0LAorCTB4NWI4YiwgMHg1YjhiLCAweDViYzMsIDB4NWJhNywgMHg1YjhiLCAweDViOGIsIDB4NWMxZCwgMHg1ZWFkLAorCTB4NWVjOCwgMHg1YjhiLCAweDViYzMsIDB4NWI4YiwgMHg1YjhiLCAweDViOGIsIDB4NWI4YiwgMHg1YzEzLAorCTB4NWVjOCwgMHg1YjhiLCAweDViOGIsIDB4NWI4YiwgMHg1YjhiLCAweDViOGIsIDB4NWI4YiwgMHg1YjhiLAorCTB4NWI4YiwgMHg1YjhiLCAweDViZDcsIDB4NWI4YiwgMHg1YjhiLCAweDViOGIsIDB4NWI4YiwgMHg1YjhiLAorCTB4NWI4YiwgMHg1YjhiLCAweDViOGIsIDB4NWI4YiwgMHg1YjhiLCAweDViOGIsIDB4NWI4YiwgMHg1YjhiLAorCTB4NWI4YiwgMHg1YjhiLCAweDViZWMsIDB4NzAyMCwgMHgyMDY4LCAweDA4MGMsIDB4MTVmMCwgMHgwMDA1LAorCTB4NzAwYywgMHgwMDAyLCAweDViM2YsIDB4NWI0MiwgMHg1YjUwLCAweDViNjgsIDB4NWI2OCwgMHgwODBjLAorCTB4NWE2ZCwgMHgwMDA1LCAweDAxMjYsIDB4ODAwMSwgMHg3MDBlLCAweDcwNTgsIDB4MDAwNiwgMHgwODBjLAorCTB4NWY5MCwgMHgwMTIwLCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDVhNmQsIDB4MDBkZSwgMHgwMDQ4LAorCTB4MDEyNiwgMHg4MDAxLCAweDcwMGUsIDB4MDgwYywgMHg1ZjkwLCAweDcwNTgsIDB4MjA2OCwgMHg3MDg0LAorCTB4NzA1YSwgMHg2ODAzLCAweDAwMDAsIDB4NjgwNywgMHgwMDAwLCAweDY4MzQsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4YSwgMHgwMDFhLCAweDEyMTgsIDB4MDAzYiwgMHgwMTJlLCAweDAwMDUsIDB4MDEyZSwgMHgwNDE5LAorCTB4MDAwNSwgMHgwMDA1LCAweDAwMDUsIDB4NWI4YiwgMHg1YmE3LCAweDVkMGUsIDB4NWI4YiwgMHg1YmE3LAorCTB4NWI4YiwgMHg1YmE3LCAweDViYTcsIDB4NWI4YiwgMHg1YmE3LCAweDVkMGUsIDB4NWJhNywgMHg1YmE3LAorCTB4NWJhNywgMHg1YmE3LCAweDViYTcsIDB4NWI4YiwgMHg1YmE3LCAweDVkMGUsIDB4NWI4YiwgMHg1YjhiLAorCTB4NWJhNywgMHg1YjhiLCAweDViOGIsIDB4NWI4YiwgMHg1YmE3LCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LAorCTB4MDAwNSwgMHgwMDA1LCAweDAwMDUsIDB4NzAwNywgMHgwMDAxLCAweDY4MzgsIDB4YTA4NCwgMHgwMGZmLAorCTB4YzBkNSwgMHg2ODNhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NTEwYywgMHgwMTJlLAorCTB4MDAwNSwgMHg3MDA3LCAweDAwMDEsIDB4NjgzOCwgMHhhMDg0LCAweDAwZmYsIDB4YzBlNSwgMHg2ODNhLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg1MTBjLCAweDAxMmUsIDB4MDAwNSwgMHg3MDA3LAorCTB4MDAwMSwgMHg2ODM4LCAweGEwODQsIDB4MDBmZiwgMHhjMGVkLCAweDY4M2EsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDUxMGMsIDB4MDEyZSwgMHgwMDA1LCAweDcwMDcsIDB4MDAwMSwgMHg2ODM4LAorCTB4YTA4NCwgMHgwMGZmLCAweGMwZGQsIDB4NjgzYSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLAorCTB4NTEwYywgMHgwMTJlLCAweDAwMDUsIDB4NjgzNCwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHgwOTg4LAorCTB4ODAwMSwgMHgxMTIwLCAweDcwMDcsIDB4MDAwMSwgMHgwODA0LCAweDVjZDAsIDB4NzAwNywgMHgwMDA2LAorCTB4NzAxMiwgMHgyZDAwLCAweDcwMTYsIDB4NzAxYSwgMHg3MDRiLCAweDVjZDAsIDB4MDAwNSwgMHg2ODM0LAorCTB4ODAwNywgMHhhMDg0LCAweDAwZmYsIDB4MDkwNCwgMHg1Yjk5LCAweDgwMDEsIDB4MTEyMCwgMHg3MDA3LAorCTB4MDAwMSwgMHgwODA0LCAweDVjZWQsIDB4NzAwNywgMHgwMDA2LCAweDcwMTIsIDB4MmQwMCwgMHg3MDE2LAorCTB4NzAxYSwgMHg3MDRiLCAweDVjZWQsIDB4MDAwNSwgMHg2ODM0LCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4NiwgMHgwMDAxLCAweDE5MDQsIDB4NWI5OSwgMHg3MDA3LCAweDAwMDEsIDB4MjAwOSwgMHhhZDMwLAorCTB4MjEwYywgMHg4MWZmLCAweDExYTgsIDB4NjgzOCwgMHhhMDg0LCAweDAwZmYsIDB4NjgzYSwgMHg2ODUzLAorCTB4MDAwMCwgMHgwODBjLCAweDRhYjEsIDB4MTEwOCwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjgzNywgMHgwMTM5LCAweDY4NGEsIDB4Njk1MiwgMHgwODBjLCAweDUxMGMsIDB4MDEyZSwgMHgwY2EwLAorCTB4MjAwMSwgMHgwMDI4LCAweDBjOTAsIDB4Njg0YywgMHhhMDg0LCAweDAwYzAsIDB4YTA4NiwgMHgwMGMwLAorCTB4MTEyMCwgMHg3MDA3LCAweDAwMDEsIDB4MDgwNCwgMHg1ZWUwLCAweDJkMDAsIDB4NzAxNiwgMHg3MDFhLAorCTB4MjBhOSwgMHgwMDA0LCAweGEwODAsIDB4MDAyNCwgMHgyMDk4LCAweDIwYTEsIDB4YWUwYywgMHg1M2EzLAorCTB4Njg1OCwgMHg3MDEyLCAweGEwODIsIDB4MDQwMSwgMHgxYTA0LCAweDViYjUsIDB4NmE4NCwgMHhhMjhhLAorCTB4MDAwMiwgMHgxYTA0LCAweDViYjUsIDB4ODJmZiwgMHgxMTM4LCAweDY4ODgsIDB4Njk4YywgMHhhMTA1LAorCTB4MDExOCwgMHgyMDAxLCAweDVjYTMsIDB4MDAxOCwgMHhhMjgwLCAweDVjOTksIDB4MjAwNSwgMHg3MGM2LAorCTB4NzAxMCwgMHhhMDE1LCAweDA5MDQsIDB4NWM4NSwgMHgwODBjLCAweDE1YzAsIDB4MTExOCwgMHg3MDA3LAorCTB4MDAwZiwgMHgwMDA1LCAweDJkMDAsIDB4NzAyMiwgMHg3MGM0LCAweDIwNjAsIDB4MmMwNSwgMHg2ODM2LAorCTB4ZTAwNCwgMHhhZDAwLCAweDcwOTYsIDB4ZTAwOCwgMHhhMjBhLCAweDEyMTAsIDB4YTAwZSwgMHgyMjAwLAorCTB4NzExMiwgMHhlMjBjLCAweDgwMDMsIDB4ODAwYiwgMHhhMjk2LCAweDAwMDQsIDB4MDEwOCwgMHhhMTA4LAorCTB4NzE5YSwgMHg4MTBiLCAweDcxOWUsIDB4YWU5MCwgMHgwMDIyLCAweDA4MGMsIDB4MTYyNCwgMHg3MDkwLAorCTB4YTA4ZSwgMHgwMTAwLCAweDAxNzAsIDB4YTA4NiwgMHgwMjAwLCAweDAxMTgsIDB4NzAwNywgMHgwMDEwLAorCTB4MDAwNSwgMHg3MDIwLCAweDIwNjgsIDB4MDgwYywgMHgxNWYwLCAweDcwMTQsIDB4MjA2OCwgMHgwODA0LAorCTB4NWJiNSwgMHg3MDIwLCAweDIwNjgsIDB4NzAxOCwgMHg2ODAyLCAweDY4MDcsIDB4MDAwMCwgMHgyZDA4LAorCTB4MjA2OCwgMHg2OTA2LCAweDcxMWEsIDB4MDgwNCwgMHg1YzQwLCAweDcwMTQsIDB4MjA2OCwgMHg3MDA3LAorCTB4MDAwMSwgMHg2ODg0LCAweGEwMDUsIDB4MTEyOCwgMHg2ODg4LCAweDY5OGMsIDB4YTEwNSwgMHgwMTA4LAorCTB4MDBiMSwgMHg2ODM0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMWUsIDB4MDkwNCwgMHg1ZWUwLAorCTB4MDRiOCwgMHg1YzliLCAweDVjOWYsIDB4MDAwMiwgMHgwMDExLCAweDAwMDcsIDB4MDAwNCwgMHgwMDBhLAorCTB4MDAwZiwgMHgwMDA1LCAweDAwMDYsIDB4MDAwYSwgMHgwMDExLCAweDAwMDUsIDB4MDAwNCwgMHgwMGY2LAorCTB4MDBlNiwgMHgwMGM2LCAweDAwNzYsIDB4MDA2NiwgMHg2Zjg4LCAweDZlOGMsIDB4NjgwNCwgMHgyMDYwLAorCTB4YWNmMCwgMHgwMDIxLCAweGFjZjgsIDB4MDAyNywgMHgyMDA5LCAweDAwMDUsIDB4NzAwYywgMHg3ODE2LAorCTB4NzAwOCwgMHg3ODEyLCAweDcwMDQsIDB4NzgwNiwgMHg3MDAwLCAweDc4MDIsIDB4N2UwZSwgMHg3ZjBhLAorCTB4ODEwOSwgMHgwMTI4LCAweGFlZjIsIDB4MDAwNCwgMHhhZmZhLCAweDAwMDYsIDB4MGM3OCwgMHg2MDA0LAorCTB4YTA2NSwgMHgxZDMwLCAweDAwNmUsIDB4MDA3ZSwgMHgwMGNlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LAorCTB4MjAwOSwgMHhhZDMwLCAweDIxMGMsIDB4ODFmZiwgMHgxMTk4LCAweDY4MzgsIDB4YTA4NCwgMHgwMGZmLAorCTB4NjgzYSwgMHgwODBjLCAweDQ5OTMsIDB4MTEwOCwgMHgwMDA1LCAweDA4MGMsIDB4NTFkZiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4OTdmZCwgMHgwODBjLCAweDUxMGMsIDB4MDEyZSwgMHgwY2EwLAorCTB4MjAwMSwgMHgwMDI4LCAweDIwMDksIDB4MDAwMCwgMHgwYzgwLCAweDIwMDksIDB4YWQzMCwgMHgyMTBjLAorCTB4ODFmZiwgMHgxMWIwLCAweDY4NTgsIDB4YTAwNSwgMHgwMWIwLCAweDY4MzgsIDB4YTA4NCwgMHgwMGZmLAorCTB4NjgzYSwgMHg2ODUzLCAweDAwMDAsIDB4MDgwYywgMHg0YTU1LCAweDExMDgsIDB4MDAwNSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NTFkZiwgMHgwODBjLCAweDUxMGMsIDB4MDEyZSwgMHgwY2IwLAorCTB4MjAwMSwgMHgwMDI4LCAweDBjYTAsIDB4MjAwMSwgMHgwMDAwLCAweDBjODgsIDB4NzAxOCwgMHg2ODAyLAorCTB4MmQwOCwgMHgyMDY4LCAweDY5MDYsIDB4NzExYSwgMHg3MDEwLCAweDgwMDEsIDB4NzAxMiwgMHgwMTE4LAorCTB4NzAwNywgMHgwMDA2LCAweDAwMzAsIDB4NzAxNCwgMHgyMDY4LCAweDcwMDcsIDB4MDAwMSwgMHg3MDQ4LAorCTB4MDgwZiwgMHgwMDA1LCAweDcwMDcsIDB4MDAwMSwgMHg2OTQ0LCAweDgxMGYsIDB4YTE4YywgMHgwMGZmLAorCTB4Njg0OCwgMHhhMDg0LCAweDAwZmYsIDB4MjBhOSwgMHgwMDAxLCAweGEwOTYsIDB4MDAwMSwgMHgwMWIwLAorCTB4MjAwOSwgMHgwMDAwLCAweDIwYTksIDB4MDBmZiwgMHhhMDk2LCAweDAwMDIsIDB4MDE3OCwgMHhhMDA1LAorCTB4MTFmMCwgMHg2OTQ0LCAweDgxMGYsIDB4YTE4YywgMHgwMGZmLCAweDA4MGMsIDB4NGNkYywgMHgxMWI4LAorCTB4MDA2NiwgMHg2ZTUwLCAweDA4MGMsIDB4NGRjZiwgMHgwMDZlLCAweDAwODgsIDB4MDA0NiwgMHgyMDExLAorCTB4YWQwYywgMHgyMjI0LCAweGM0ODQsIDB4MjQxMiwgMHgwMDRlLCAweDAwYzYsIDB4MDgwYywgMHg0Y2RjLAorCTB4MTExMCwgMHgwODBjLCAweDRmMmQsIDB4ODEwOCwgMHgxZjA0LCAweDVkNGUsIDB4MDBjZSwgMHg2ODRjLAorCTB4ZDA4NCwgMHgxMTE4LCAweDA4MGMsIDB4MTVmMCwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg1MTBjLCAweDAxMmUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDA3LAorCTB4MDAwMSwgMHgyMDAxLCAweGFkNTIsIDB4MjAwNCwgMHhkMGE0LCAweDA1ODAsIDB4MjA2MSwgMHhiMDQ4LAorCTB4NjEwMCwgMHhkMTg0LCAweDAxNzgsIDB4Njg1OCwgMHhhMDg0LCAweDAwZmYsIDB4MTU1MCwgMHg2MDAwLAorCTB4ZDA4NCwgMHgwNTIwLCAweDYwMDQsIDB4YTAwNSwgMHgxNTM4LCAweDYwMDMsIDB4MDAwMCwgMHg2MDBiLAorCTB4MDAwMCwgMHgwMGM4LCAweDIwMTEsIDB4MDAwMSwgMHg2ODYwLCAweGEwMDUsIDB4MTExMCwgMHgyMDAxLAorCTB4MDAxZSwgMHg4MDAwLCAweDYwMTYsIDB4Njg1OCwgMHhhMDg0LCAweDAwZmYsIDB4MDE3OCwgMHg2MDA2LAorCTB4Njg1OCwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHgwMTQ4LCAweDYwMGEsIDB4Njg1OCwgMHg4MDAwLAorCTB4MTEwOCwgMHhjMjhkLCAweDYyMDIsIDB4MDEyZSwgMHgwODA0LCAweDVmN2YsIDB4MDEyZSwgMHgwODA0LAorCTB4NWY3OSwgMHgwMTJlLCAweDA4MDQsIDB4NWY3MywgMHgwMTJlLCAweDA4MDQsIDB4NWY3NiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDcwMDcsIDB4MDAwMSwgMHgyMDAxLCAweGFkNTIsIDB4MjAwNCwgMHhkMGE0LAorCTB4MDVlMCwgMHgyMDYxLCAweGIwNDgsIDB4NjAwMCwgMHhkMDg0LCAweDA1YjgsIDB4NjIwNCwgMHg2MzA4LAorCTB4ZDA4YywgMHgxNTMwLCAweDZjNDgsIDB4YTQ4NCwgMHgwMDAzLCAweDAxNzAsIDB4Njk1OCwgMHhhMThjLAorCTB4MDBmZiwgMHg4MDAxLCAweDExMjAsIDB4MjEwMCwgMHhhMjEwLCAweDA2MjAsIDB4MDAyOCwgMHg4MDAxLAorCTB4MTUwOCwgMHgyMTAwLCAweGEyMTIsIDB4MDJmMCwgMHhhNDg0LCAweDAwMGMsIDB4MDE4OCwgMHg2OTU4LAorCTB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4YTA4MiwgMHgwMDA0LCAweDExMjAsIDB4MjEwMCwgMHhhMzE4LAorCTB4MDI4OCwgMHgwMDMwLCAweGEwODIsIDB4MDAwNCwgMHgxMTY4LCAweDIxMDAsIDB4YTMxYSwgMHgwMjUwLAorCTB4Njg2MCwgMHhhMDA1LCAweDAxMTAsIDB4ODAwMCwgMHg2MDE2LCAweDYyMDYsIDB4NjMwYSwgMHgwMTJlLAorCTB4MDgwNCwgMHg1ZjdmLCAweDAxMmUsIDB4MDgwNCwgMHg1ZjdjLCAweDAxMmUsIDB4MDgwNCwgMHg1Zjc5LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweDIwNjEsIDB4YjA0OCwgMHg2MzAwLAorCTB4ZDM4YywgMHgxMTIwLCAweDYzMDgsIDB4ODMxOCwgMHgwMjIwLCAweDYzMGEsIDB4MDEyZSwgMHgwODA0LAorCTB4NWY4ZCwgMHgwMTJlLCAweDA4MDQsIDB4NWY3YywgMHgwMTI2LCAweDAwYzYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NzAwNywgMHgwMDAxLCAweDY4NGMsIDB4ZDBhYywgMHgwMTQ4LCAweDAwYzYsIDB4MjA2MSwgMHhiMDQ4LAorCTB4NjAwMCwgMHhhMDg0LCAweGZjZmYsIDB4NjAwMiwgMHgwMGNlLCAweDA0NDgsIDB4Njg1OCwgMHhhMDA1LAorCTB4MDVkMCwgMHg2ODVjLCAweGEwNjUsIDB4MDU5OCwgMHgyMDAxLCAweGFkMzAsIDB4MjAwNCwgMHhhMDA1LAorCTB4MDExOCwgMHgwODBjLCAweDk3NGUsIDB4MDA2OCwgMHg2MDEzLCAweDA0MDAsIDB4NjA1NywgMHgwMDAwLAorCTB4Njk0YywgMHhkMWE0LCAweDAxMTAsIDB4Njk1MCwgMHg2MTU2LCAweDIwMDksIDB4MDA0MSwgMHgwODBjLAorCTB4ODBhNywgMHg2OTU4LCAweGExOGMsIDB4ZmYwMCwgMHhhMTg2LCAweDIwMDAsIDB4MTE0MCwgMHgwMDI2LAorCTB4MjAwOSwgMHgwMDAwLCAweDIwMTEsIDB4ZmRmZiwgMHgwODBjLCAweDY2M2YsIDB4MDAyZSwgMHg2ODRjLAorCTB4ZDBjNCwgMHgwMTQ4LCAweDIwNjEsIDB4YjA0OCwgMHg2MDAwLCAweGQwOGMsIDB4MTEyMCwgMHg2MDA4LAorCTB4ODAwMCwgMHgwMjA4LCAweDYwMGEsIDB4MDBjZSwgMHgwMTJlLCAweDA4MDQsIDB4NWY3ZiwgMHgwMGNlLAorCTB4MDEyZSwgMHgwODA0LCAweDVmNzksIDB4Njk1NCwgMHhhMTg2LCAweDAwMmUsIDB4MGQ0MCwgMHhhMTg2LAorCTB4MDAyZCwgMHgwZDI4LCAweGExODYsIDB4MDA0NSwgMHgwNTEwLCAweGExODYsIDB4MDAyYSwgMHgxMTMwLAorCTB4MjAwMSwgMHhhZDBjLCAweDIwMGMsIDB4YzE5NCwgMHgyMTAyLCAweDA4YzgsIDB4YTE4NiwgMHgwMDIwLAorCTB4MDE3MCwgMHhhMTg2LCAweDAwMjksIDB4MWQxOCwgMHg2OTQ0LCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLAorCTB4MDgwYywgMHg0Y2RjLCAweDE5NjAsIDB4NjAwMCwgMHhjMGU0LCAweDYwMDIsIDB4MDg0MCwgMHg2ODVjLAorCTB4YTA2NSwgMHgwOWE4LCAweDIwMDEsIDB4YWZhMywgMHgyMDA0LCAweDYwMTYsIDB4MDgwMCwgMHg2ODVjLAorCTB4YTA2NSwgMHgwOTY4LCAweDAwZTYsIDB4Njg2MCwgMHhhMDc1LCAweDIwMDEsIDB4YWQzMCwgMHgyMDA0LAorCTB4YTAwNSwgMHgwMTUwLCAweDA4MGMsIDB4OTc0ZSwgMHg4ZWZmLCAweDAxMTgsIDB4MmU2MCwgMHgwODBjLAorCTB4OTc0ZSwgMHgwMGVlLCAweDA4MDQsIDB4NWUzZiwgMHg2MDIwLCAweGMwZGMsIDB4YzBkNSwgMHg2MDIyLAorCTB4MmU2MCwgMHg2MDA3LCAweDAwM2EsIDB4Njg3MCwgMHhhMDA1LCAweDAxMzAsIDB4NjAwNywgMHgwMDNiLAorCTB4Njg3NCwgMHg2MDJhLCAweDY4NzgsIDB4NjAxMiwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2N2E4LAorCTB4MDgwYywgMHg2YzUwLCAweDAwZWUsIDB4MDgwNCwgMHg1ZTNmLCAweDIwNjEsIDB4YjA0OCwgMHg2MDAwLAorCTB4ZDA4NCwgMHgwMTkwLCAweGQwOGMsIDB4MTkwNCwgMHg1ZjhkLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjIwNCwgMHg4MjEwLCAweDAyMjAsIDB4NjIwNiwgMHgwMTJlLCAweDA4MDQsIDB4NWY4ZCwgMHgwMTJlLAorCTB4Njg1MywgMHgwMDE2LCAweDA4MDQsIDB4NWY4NiwgMHg2ODUzLCAweDAwMDcsIDB4MDgwNCwgMHg1Zjg2LAorCTB4NjgzNCwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHgxMTE4LCAweDA4MGMsIDB4NWI5OSwgMHgwMDc4LAorCTB4MjAzMCwgMHg4MDAxLCAweDExMjAsIDB4NzAwNywgMHgwMDAxLCAweDAwNTEsIDB4MDA0MCwgMHg3MDA3LAorCTB4MDAwNiwgMHg3MDEyLCAweDJkMDAsIDB4NzAxNiwgMHg3MDFhLCAweDcwNGIsIDB4NWVlMCwgMHgwMDA1LAorCTB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDA5LCAweGFkMzAsIDB4MjEwYywgMHg4MWZmLAorCTB4MTkwNCwgMHg1ZjViLCAweDIwMDksIDB4YWQwYywgMHgyMTBjLCAweGQxOTQsIDB4MTkwNCwgMHg1ZjYzLAorCTB4Njg0OCwgMHgyMDcwLCAweGFlODIsIDB4YjQwMCwgMHgwYTA0LCAweDVmNGYsIDB4MjAwMSwgMHhhZDE2LAorCTB4MjAwNCwgMHhhZTAyLCAweDFhMDQsIDB4NWY0ZiwgMHgyMDYxLCAweGIwNDgsIDB4NjEwMCwgMHhhMTg0LAorCTB4MDMwMSwgMHhhMDg2LCAweDAwMDEsIDB4MTVhOCwgMHg3MTFjLCAweGExODYsIDB4MDAwNiwgMHgxNWIwLAorCTB4NzAxOCwgMHhhMDA1LCAweDA5MDQsIDB4NWY1YiwgMHgyMDA0LCAweGQwZTQsIDB4MTkwNCwgMHg1ZjVlLAorCTB4NzAyMCwgMHhkMGRjLCAweDE5MDQsIDB4NWY2NiwgMHg2ODUzLCAweDAwMDAsIDB4NjgwMywgMHgwMDAwLAorCTB4MmQwOCwgMHg3MDEwLCAweGEwMDUsIDB4MTE1OCwgMHg3MTEyLCAweDY4NGMsIDB4ZDBmNCwgMHgxOTA0LAorCTB4NWY2OSwgMHgyZTYwLCAweDA4MGMsIDB4NjVhYSwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDY4LAorCTB4NjgwMCwgMHhhMDA1LCAweDFkZTAsIDB4NjkwMiwgMHgyMTY4LCAweDY4NGMsIDB4ZDBmNCwgMHgxNWM4LAorCTB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4MDEyZSwgMHgwMGVlLCAweDY4NTMsIDB4MDAwNiwgMHgwODA0LAorCTB4NWY4NiwgMHhkMTg0LCAweDBkYzAsIDB4ZDFjNCwgMHgxMWE4LCAweDAwYjgsIDB4Njk0NCwgMHhhMThjLAorCTB4ZmYwMCwgMHg4MTBmLCAweDA4MGMsIDB4NGNkYywgMHgxMWM4LCAweDYwMDAsIDB4ZDBlNCwgMHgxMWIwLAorCTB4NzExYywgMHhhMTg2LCAweDAwMDcsIDB4MTExOCwgMHg2ODUzLCAweDAwMDIsIDB4MDA4OCwgMHg2ODUzLAorCTB4MDAwOCwgMHgwMDcwLCAweDY4NTMsIDB4MDAwZSwgMHgwMDU4LCAweDY4NTMsIDB4MDAxNywgMHgwMDQwLAorCTB4Njg1MywgMHgwMDM1LCAweDAwMjgsIDB4Njg1MywgMHgwMDI4LCAweDAwMTAsIDB4Njg1MywgMHgwMDI5LAorCTB4MDEyZSwgMHgwMGVlLCAweDA0MTgsIDB4Njg1MywgMHgwMDJhLCAweDBjZDAsIDB4Njg1MywgMHgwMDQ1LAorCTB4MGNiOCwgMHgyZTYwLCAweDIwMTksIDB4MDAwMiwgMHg2MDE3LCAweDAwMTQsIDB4MDgwYywgMHhhNTY2LAorCTB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4MjAwOSwgMHgwMDNlLCAweDAwNTgsIDB4MjAwOSwgMHgwMDA0LAorCTB4MDA0MCwgMHgyMDA5LCAweDAwMDYsIDB4MDAyOCwgMHgyMDA5LCAweDAwMTYsIDB4MDAxMCwgMHgyMDA5LAorCTB4MDAwMSwgMHg2ODU0LCAweGEwODQsIDB4ZmYwMCwgMHhhMTA1LCAweDY4NTYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDUxMGMsIDB4MDEyZSwgMHgwMDA1LCAweDA4MGMsIDB4MTVmMCwgMHgwMDA1LAorCTB4NzAyYywgMHg3MTMwLCAweDgxMDgsIDB4YTEwMiwgMHgwMjMwLCAweGEwMGUsIDB4NzAzNCwgMHg3MDcyLAorCTB4NzAzOCwgMHg3MDc2LCAweDAwNTgsIDB4NzA3MCwgMHhhMDgwLCAweDAwNDAsIDB4NzA3MiwgMHgxMjMwLAorCTB4NzA3NCwgMHhhMDgxLCAweDAwMDAsIDB4NzA3NiwgMHhhMDg1LCAweDAwMDEsIDB4NzkzMiwgMHg3MTMyLAorCTB4MDAwNSwgMHgwMGQ2LCAweDA4MGMsIDB4NjVhMSwgMHgwMGRlLCAweDAwMDUsIDB4MDBkNiwgMHgyMDExLAorCTB4MDAwNCwgMHgyMjA0LCAweGEwODUsIDB4ODAwMiwgMHgyMDEyLCAweDAwZGUsIDB4MDAwNSwgMHgyMGUxLAorCTB4MDAwMiwgMHgzZDA4LCAweDIwZTEsIDB4MjAwMCwgMHgzZDAwLCAweGEwODQsIDB4NzAwMCwgMHgwMTE4LAorCTB4YTA4NiwgMHgxMDAwLCAweDE1NDAsIDB4MjBlMSwgMHgwMDAwLCAweDNkMDAsIDB4YTA5NCwgMHhmZjAwLAorCTB4ODIxNywgMHhhMDg0LCAweGYwMDAsIDB4YTA4NiwgMHgzMDAwLCAweDExMTgsIDB4MDgwYywgMHg2MWM2LAorCTB4MDBiMCwgMHgyMGUxLCAweDAwMDQsIDB4M2Q2MCwgMHhkMWJjLCAweDExMDgsIDB4M2U2MCwgMHhhYzg0LAorCTB4MDAwNywgMHgxMTg4LCAweGFjODIsIDB4YjQwMCwgMHgwMjcwLCAweDY4NTgsIDB4YWMwMiwgMHgxMjU4LAorCTB4NjEyMCwgMHhkMWY0LCAweDExNjAsIDB4MjAwOSwgMHgwMDQ3LCAweDA4MGMsIDB4ODBhNywgMHg3YTFjLAorCTB4ZDI4NCwgMHgxOTY4LCAweDAwMDUsIDB4YTAxNiwgMHgwODBjLCAweDE4MjQsIDB4MGNjMCwgMHgwY2Q4LAorCTB4NzgxYywgMHhkMDhjLCAweDA1MDAsIDB4MDE1NiwgMHgwMTM2LCAweDAxNDYsIDB4MjBlMSwgMHgzMDAwLAorCTB4M2QyMCwgMHgzZTI4LCAweGE1ODQsIDB4MDA3NiwgMHgxNTMwLCAweGE0ODQsIDB4NzAwMCwgMHhhMDg2LAorCTB4MTAwMCwgMHgxMWE4LCAweDA4MGMsIDB4NjA0ZSwgMHgwMWYwLCAweDIwZTEsIDB4MzAwMCwgMHg3ODI4LAorCTB4NzgyOCwgMHgwODBjLCAweDYwNmEsIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsIDB4MjAwOSwgMHhhZmNmLAorCTB4MjEwNCwgMHhhMDA1LCAweDExMDgsIDB4MDAwNSwgMHgwODBjLCAweDZjNTAsIDB4MGNlMCwgMHhhNDg0LAorCTB4NzAwMCwgMHgxNTE4LCAweDA0OTksIDB4MDFiOCwgMHg3MDAwLCAweGEwODQsIDB4ZmYwMCwgMHhhMDg2LAorCTB4ODEwMCwgMHgwZDE4LCAweDAwODAsIDB4ZDVhNCwgMHgwMTU4LCAweDA4MGMsIDB4MWQ4NiwgMHgyMGUxLAorCTB4OTAxMCwgMHgyMDAxLCAweDAxNjAsIDB4MjUwMiwgMHgyMDAxLCAweDAxMzgsIDB4MjIwMiwgMHgwMDQ4LAorCTB4MDBlOSwgMHg2ODgzLCAweDAwMDAsIDB4MDgwYywgMHhhYzU5LCAweDIwZTEsIDB4MzAwMCwgMHg3ODI4LAorCTB4NzgyOCwgMHgwMTRlLCAweDAxM2UsIDB4MDE1ZSwgMHgwOGIwLCAweDAwODEsIDB4MTEzMCwgMHg3MDAwLAorCTB4YTA4NCwgMHhmZjAwLCAweGEwODYsIDB4ODEwMCwgMHgxZDcwLCAweDA4MGMsIDB4YWM1OSwgMHgyMGUxLAorCTB4MzAwMCwgMHg3ODI4LCAweDc4MjgsIDB4MDgwYywgMHg2NDJkLCAweDBjNTgsIDB4YTQ4NCwgMHgwMWZmLAorCTB4Njg4MiwgMHhhMDA1LCAweDAxNjAsIDB4YTA4MCwgMHgwMDFmLCAweGEwODQsIDB4MDNmOCwgMHg4MGFjLAorCTB4MjBlMSwgMHgxMDAwLCAweDJlYTAsIDB4MjA5OSwgMHgwMjBhLCAweDUzYTUsIDB4MDAwNSwgMHgyMGE5LAorCTB4MDAwYywgMHgyMGUxLCAweDEwMDAsIDB4MmVhMCwgMHgyMDk5LCAweDAyMGEsIDB4NTNhNSwgMHhhMDg1LAorCTB4MDAwMSwgMHgwY2EwLCAweDcwMDAsIDB4YTA4NCwgMHhmZjAwLCAweGEwOGMsIDB4ZjAwMCwgMHg4MDA3LAorCTB4YTE5NiwgMHgwMDAwLCAweDExMTgsIDB4MDgwNCwgMHg2MmNmLCAweDAwMDUsIDB4YTE5NiwgMHgyMDAwLAorCTB4MTE0OCwgMHg2OTAwLCAweGExOGUsIDB4MDAwMSwgMHgxMTE4LCAweDA4MGMsIDB4NDFkMSwgMHgwY2E4LAorCTB4MDAzOSwgMHgwYzk4LCAweGExOTYsIDB4ODAwMCwgMHgxZDgwLCAweDA4MGMsIDB4NjM3MiwgMHgwYzY4LAorCTB4MDBjNiwgMHg2YTgwLCAweDgyZmYsIDB4MDkwNCwgMHg2MWMwLCAweDcxMTAsIDB4YTE4YywgMHhmZjAwLAorCTB4ODEwZiwgMHhhMTk2LCAweDAwMDEsIDB4MDEyMCwgMHhhMTk2LCAweDAwMjMsIDB4MTkwNCwgMHg2MWMwLAorCTB4YTA4ZSwgMHgwMDIzLCAweDE1NzAsIDB4MDgwYywgMHg2NDA4LCAweDA5MDQsIDB4NjFjMCwgMHg3MTI0LAorCTB4NjEwYSwgMHg3MDMwLCAweGEwOGUsIDB4MDIwMCwgMHgxMTUwLCAweDcwMzQsIDB4YTAwNSwgMHgxOTA0LAorCTB4NjFjMCwgMHgyMDA5LCAweDAwMTUsIDB4MDgwYywgMHg4MGE3LCAweDA4MDQsIDB4NjFjMCwgMHhhMDhlLAorCTB4MDIxNCwgMHgwMTE4LCAweGEwOGUsIDB4MDIxMCwgMHgxMTMwLCAweDIwMDksIDB4MDAxNSwgMHgwODBjLAorCTB4ODBhNywgMHgwODA0LCAweDYxYzAsIDB4YTA4ZSwgMHgwMTAwLCAweDE5MDQsIDB4NjFjMCwgMHg3MDM0LAorCTB4YTAwNSwgMHgxOTA0LCAweDYxYzAsIDB4MjAwOSwgMHgwMDE2LCAweDA4MGMsIDB4ODBhNywgMHgwODA0LAorCTB4NjFjMCwgMHhhMDhlLCAweDAwMjIsIDB4MTkwNCwgMHg2MWMwLCAweDcwMzAsIDB4YTA4ZSwgMHgwMzAwLAorCTB4MTU4MCwgMHg2OGQwLCAweGQwYTQsIDB4MDUyOCwgMHhjMGI1LCAweDY4ZDIsIDB4NzEwMCwgMHhhMThjLAorCTB4MDBmZiwgMHg2OTZlLCAweDcwMDQsIDB4Njg3MiwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHg3OWU2LAorCTB4NzhlYSwgMHgwMDA2LCAweGEwODQsIDB4MDBmZiwgMHgwMDE2LCAweDIwMDgsIDB4MDgwYywgMHgyNmEwLAorCTB4NzkzMiwgMHg3OTM2LCAweDAwMWUsIDB4MDAwZSwgMHgwMGZlLCAweDA4MGMsIDB4MjY3NiwgMHg2OTRlLAorCTB4NzAzYywgMHgwMGU2LCAweDIwNzEsIDB4MDE0MCwgMHg3MDg2LCAweDIwNzEsIDB4YWQwMCwgMHg3MGEyLAorCTB4MDBlZSwgMHg3MDM0LCAweGEwMDUsIDB4MTkwNCwgMHg2MWMwLCAweDIwMDksIDB4MDAxNywgMHgwODA0LAorCTB4NjE5MywgMHhhMDhlLCAweDA0MDAsIDB4MTE1OCwgMHg3MDM0LCAweGEwMDUsIDB4MTkwNCwgMHg2MWMwLAorCTB4NjhkMCwgMHhjMGE1LCAweDY4ZDIsIDB4MjAwOSwgMHgwMDMwLCAweDA4MDQsIDB4NjE5MywgMHhhMDhlLAorCTB4MDUwMCwgMHgxMTQwLCAweDcwMzQsIDB4YTAwNSwgMHgxOTA0LCAweDYxYzAsIDB4MjAwOSwgMHgwMDE4LAorCTB4MDgwNCwgMHg2MTkzLCAweGEwOGUsIDB4MjAxMCwgMHgxMTIwLCAweDIwMDksIDB4MDAxOSwgMHgwODA0LAorCTB4NjE5MywgMHhhMDhlLCAweDIxMTAsIDB4MTEyMCwgMHgyMDA5LCAweDAwMWEsIDB4MDgwNCwgMHg2MTkzLAorCTB4YTA4ZSwgMHg1MjAwLCAweDExNDAsIDB4NzAzNCwgMHhhMDA1LCAweDE5MDQsIDB4NjFjMCwgMHgyMDA5LAorCTB4MDAxYiwgMHgwODA0LCAweDYxOTMsIDB4YTA4ZSwgMHg1MDAwLCAweDExNDAsIDB4NzAzNCwgMHhhMDA1LAorCTB4MTkwNCwgMHg2MWMwLCAweDIwMDksIDB4MDAxYywgMHgwODA0LCAweDYxOTMsIDB4YTA4ZSwgMHgxMzAwLAorCTB4MTEyMCwgMHgyMDA5LCAweDAwMzQsIDB4MDgwNCwgMHg2MTkzLCAweGEwOGUsIDB4MTIwMCwgMHgxMTQwLAorCTB4NzAzNCwgMHhhMDA1LCAweDE5MDQsIDB4NjFjMCwgMHgyMDA5LCAweDAwMjQsIDB4MDgwNCwgMHg2MTkzLAorCTB4YTA4YywgMHhmZjAwLCAweGExOGUsIDB4MjQwMCwgMHgxMTE4LCAweDIwMDksIDB4MDAyZCwgMHgwNGQ4LAorCTB4YTA4YywgMHhmZjAwLCAweGExOGUsIDB4NTMwMCwgMHgxMTE4LCAweDIwMDksIDB4MDAyYSwgMHgwNDk4LAorCTB4YTA4ZSwgMHgwZjAwLCAweDExMTgsIDB4MjAwOSwgMHgwMDIwLCAweDA0NjgsIDB4YTA4ZSwgMHg1MzAwLAorCTB4MTEwOCwgMHgwMGQ4LCAweGEwOGUsIDB4NjEwNCwgMHgxMWMwLCAweDIwMTEsIDB4YjI4ZCwgMHg4MjA4LAorCTB4MjIwNCwgMHhhMDgyLCAweDAwMDQsIDB4MjBhOCwgMHg5NWFjLCAweDk1YWMsIDB4MjAxMSwgMHg4MDE1LAorCTB4MjExYywgMHg4MTA4LCAweDAwNDYsIDB4MjEyNCwgMHgwODBjLCAweDNjNWMsIDB4MDA0ZSwgMHg4MTA4LAorCTB4MWYwNCwgMHg2MTc2LCAweDIwMDksIDB4MDAyMywgMHgwMDcwLCAweGEwOGUsIDB4NjAwMCwgMHgxMTE4LAorCTB4MjAwOSwgMHgwMDNmLCAweDAwNDAsIDB4YTA4ZSwgMHg3ODAwLCAweDExMTgsIDB4MjAwOSwgMHgwMDQ1LAorCTB4MDAxMCwgMHgyMDA5LCAweDAwMWQsIDB4MDAxNiwgMHgyMDExLCAweGIyODMsIDB4MjIwNCwgMHg4MjExLAorCTB4MjIwYywgMHgwODBjLCAweDI2NzYsIDB4MTUzMCwgMHgwODBjLCAweDRjODAsIDB4MTUxOCwgMHg2NjEyLAorCTB4NjUxNiwgMHg4NmZmLCAweDAxODAsIDB4MDAxZSwgMHgwMDE2LCAweGExODYsIDB4MDAxNywgMHgxMTU4LAorCTB4Njg2YywgMHhhNjA2LCAweDExNDAsIDB4Njg3MCwgMHhhNTA2LCAweGEwODQsIDB4ZmYwMCwgMHgxMTE4LAorCTB4NjAwMCwgMHhjMGY1LCAweDYwMDIsIDB4MDBjNiwgMHgwODBjLCAweDgwMjIsIDB4MDE2OCwgMHgwMDFlLAorCTB4NjExYSwgMHg2MDFmLCAweDAwMDQsIDB4NzEyMCwgMHg2MTBhLCAweDAwMWUsIDB4MDgwYywgMHg4MGE3LAorCTB4MDBjZSwgMHgwMDA1LCAweDAwMWUsIDB4MGNlMCwgMHgwMGNlLCAweDBjZTAsIDB4MDBjNiwgMHgwMDQ2LAorCTB4MDgwYywgMHg2MjIxLCAweDE5MDQsIDB4NjIxZSwgMHhhMTg0LCAweGZmMDAsIDB4ODAwNywgMHhhMDg2LAorCTB4MDAwOCwgMHgxOTA0LCAweDYyMWUsIDB4YTI4ZSwgMHgwMDMzLCAweDExZTgsIDB4MDgwYywgMHg2NDA4LAorCTB4MDkwNCwgMHg2MjFlLCAweDcxMjQsIDB4NjEwYSwgMHg3MDMwLCAweGEwOGUsIDB4MDIwMCwgMHgxMTQwLAorCTB4NzAzNCwgMHhhMDA1LCAweDE1ZDgsIDB4MjAwOSwgMHgwMDE1LCAweDA4MGMsIDB4ODBhNywgMHgwNGIwLAorCTB4YTA4ZSwgMHgwMTAwLCAweDE1OTgsIDB4NzAzNCwgMHhhMDA1LCAweDE1ODAsIDB4MjAwOSwgMHgwMDE2LAorCTB4MDgwYywgMHg4MGE3LCAweDA0NTgsIDB4YTI4ZSwgMHgwMDMyLCAweDE1NDAsIDB4NzAzMCwgMHhhMDhlLAorCTB4MTQwMCwgMHgxNTIwLCAweDIwMDksIDB4MDAzOCwgMHgwMDE2LCAweDIwMTEsIDB4YjI4MywgMHgyMjA0LAorCTB4ODIxMSwgMHgyMjBjLCAweDA4MGMsIDB4MjY3NiwgMHgxMWMwLCAweDA4MGMsIDB4NGM4MCwgMHgxMWE4LAorCTB4NjYxMiwgMHg2NTE2LCAweDAwYzYsIDB4MDgwYywgMHg4MDIyLCAweDAxNzAsIDB4MDAxZSwgMHg2MTFhLAorCTB4MDgwYywgMHg5OTU2LCAweDYwMWYsIDB4MDAwNCwgMHg3MTIwLCAweDYxMGEsIDB4MDAxZSwgMHgwODBjLAorCTB4ODBhNywgMHgwODBjLCAweDZjNTAsIDB4MDAxMCwgMHgwMGNlLCAweDAwMWUsIDB4MDA0ZSwgMHgwMGNlLAorCTB4MDAwNSwgMHgwMGY2LCAweDAwZDYsIDB4MDAyNiwgMHgwMDE2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LAorCTB4M2MwMCwgMHgwMDA2LCAweDIwNzksIDB4MDAzMCwgMHgyMDY5LCAweDAyMDAsIDB4MDgwYywgMHgxZGYyLAorCTB4MTU5MCwgMHgwODBjLCAweDFjZTIsIDB4MDVjOCwgMHgwNGQ5LCAweDExMzAsIDB4NzkwOCwgMHhhMThjLAorCTB4MWZmZiwgMHhhMTgyLCAweDAwMTEsIDB4MTY4OCwgMHgyMGE5LCAweDAwMGMsIDB4MjBlMSwgMHgwMDAwLAorCTB4MmVhMCwgMHgyMDk5LCAweDAyMGEsIDB4NTNhNSwgMHgyMGUxLCAweDIwMDAsIDB4MjAwMSwgMHgwMjBhLAorCTB4MjAwNCwgMHg3YTBjLCAweDc4MDgsIDB4YTA4MCwgMHgwMDA3LCAweGEwODQsIDB4MWZmOCwgMHgwNDAxLAorCTB4MTEyMCwgMHhhMDhhLCAweDAxNDAsIDB4MWEwYywgMHgxNGY2LCAweDgwYWMsIDB4MjBlMSwgMHg2MDAwLAorCTB4MjA5OSwgMHgwMjBhLCAweDUzYTUsIDB4MjBlMSwgMHg3MDAwLCAweDY4MjgsIDB4NjgyOCwgMHg3ODAzLAorCTB4MDAwNCwgMHhhMjk0LCAweDAwNzAsIDB4MDAwZSwgMHgyMGUwLCAweDAxNWUsIDB4MDE0ZSwgMHgwMTNlLAorCTB4MDAxZSwgMHgwMDJlLCAweDAwZGUsIDB4MDBmZSwgMHgwMDA1LCAweGEwODUsIDB4MDAwMSwgMHgwYzk4LAorCTB4MDAwNiwgMHgyMDAxLCAweDAxMTEsIDB4MjAwNCwgMHhhMDg0LCAweDAwMDMsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDA0NiwgMHgwMGU2LCAweDAwZDYsIDB4MjAyOCwgMHgyMTMwLCAweGE2OTYsIDB4MDBmZiwgMHgxMTk4LAorCTB4YTU5NiwgMHhmZmZkLCAweDExMjAsIDB4MjAwOSwgMHgwMDdmLCAweDA4MDQsIDB4NjJjYSwgMHhhNTk2LAorCTB4ZmZmZSwgMHgxMTE4LCAweDIwMDksIDB4MDA3ZSwgMHgwNGU4LCAweGE1OTYsIDB4ZmZmYywgMHgxMTE4LAorCTB4MjAwOSwgMHgwMDgwLCAweDA0YjgsIDB4MjAxMSwgMHgwMDAwLCAweDIwMTksIDB4YWQzNCwgMHgyMzFjLAorCTB4ZDNhYywgMHgwMTM4LCAweDIwMjEsIDB4MDAwMCwgMHgyMGE5LCAweDAwZmYsIDB4MjA3MSwgMHhhZTM0LAorCTB4MDAzMCwgMHgyMDIxLCAweDAwODEsIDB4MjBhOSwgMHgwMDdlLCAweDIwNzEsIDB4YWViNSwgMHgyZTFjLAorCTB4ODNmZiwgMHgxMTI4LCAweDgyZmYsIDB4MTE5OCwgMHgyNDEwLCAweGMyZmQsIDB4MDA4MCwgMHgyMzY4LAorCTB4NmYxMCwgMHgwMDA2LCAweDIxMDAsIDB4YTcwNiwgMHgwMDBlLCAweDZiMTQsIDB4MTEyMCwgMHhhMzQ2LAorCTB4MTExMCwgMHgyNDA4LCAweDAwNzgsIDB4ODdmZiwgMHgxMTEwLCAweDgzZmYsIDB4MGQ1OCwgMHg4NDIwLAorCTB4OGU3MCwgMHgxZjA0LCAweDYyYTcsIDB4ODJmZiwgMHgxMTE4LCAweGEwODUsIDB4MDAwMSwgMHgwMDE4LAorCTB4YzJmYywgMHgyMjA4LCAweGEwMDYsIDB4MDBkZSwgMHgwMGVlLCAweDAwNGUsIDB4MDAwNSwgMHhhMDg0LAorCTB4MDAwNywgMHgwMDBhLCAweDAwMDUsIDB4NjJkYiwgMHg2MmRiLCAweDYyZGIsIDB4NjQxYSwgMHg2MmRiLAorCTB4NjJkYywgMHg2MmYxLCAweDYzNWQsIDB4MDAwNSwgMHg3MTEwLCAweGQxYmMsIDB4MDE4OCwgMHg3MTIwLAorCTB4MjE2MCwgMHhhYzhjLCAweDAwMDcsIDB4MTE2MCwgMHhhYzhhLCAweGI0MDAsIDB4MDI0OCwgMHg2ODU4LAorCTB4YWMwMiwgMHgxMjMwLCAweDcxMjQsIDB4NjEwYSwgMHgyMDA5LCAweDAwNDYsIDB4MDgwYywgMHg4MGE3LAorCTB4MDAwNSwgMHgwMGM2LCAweDcxMTAsIDB4ZDFiYywgMHgxOTA0LCAweDYzNDQsIDB4MjAxMSwgMHhiMjgzLAorCTB4MjIwNCwgMHg4MjExLCAweDIyMGMsIDB4MDgwYywgMHgyNjc2LCAweDE5MDQsIDB4NjM0NCwgMHgwODBjLAorCTB4NGM4MCwgMHgxOTA0LCAweDYzNDQsIDB4NjYxMiwgMHg2NTE2LCAweDYwMDAsIDB4ZDBlYywgMHgxNWUwLAorCTB4NjIwNCwgMHhhMjk0LCAweGZmMDAsIDB4ODIxNywgMHhhMjg2LCAweDAwMDYsIDB4MDE2MCwgMHgwODBjLAorCTB4NTc0ZiwgMHgxMWQwLCAweDYyMDQsIDB4YTI5NCwgMHgwMGZmLCAweGEyODYsIDB4MDAwNiwgMHgxMWEwLAorCTB4YTI5NSwgMHgwNjAwLCAweDYyMDYsIDB4MDBjNiwgMHgwODBjLCAweDgwMjIsIDB4MDAxZSwgMHgwNTMwLAorCTB4NjExYSwgMHg2MDFmLCAweDAwMDYsIDB4NzEyMCwgMHg2MTBhLCAweDcxMzAsIDB4NjE1MiwgMHgyMDA5LAorCTB4MDA0NCwgMHgwODBjLCAweDgwYTcsIDB4MDBjMCwgMHgwMGM2LCAweDA4MGMsIDB4ODAyMiwgMHgwMDFlLAorCTB4MDE5OCwgMHg2MTFhLCAweDYwMWYsIDB4MDAwNCwgMHg3MTIwLCAweDYxMGEsIDB4YTI4NiwgMHgwMDA0LAorCTB4MTExOCwgMHg2MDA3LCAweDAwMDUsIDB4MDAxMCwgMHg2MDA3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLAorCTB4MDgwYywgMHg2N2VlLCAweDA4MGMsIDB4NmM1MCwgMHgwMGNlLCAweDAwMDUsIDB4MDBjNiwgMHgwODBjLAorCTB4OTgwNywgMHgwMDFlLCAweDBkYzgsIDB4NjExYSwgMHg2MDFmLCAweDAwMDYsIDB4NzEyMCwgMHg2MTBhLAorCTB4NzEzMCwgMHg2MTUyLCAweDYwMTMsIDB4MDMwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDQxLAorCTB4MDgwYywgMHg2N2E4LCAweDA4MGMsIDB4NmM1MCwgMHgwYzM4LCAweDcxMTAsIDB4ZDFiYywgMHgwMTg4LAorCTB4NzAyMCwgMHgyMDYwLCAweGFjODQsIDB4MDAwNywgMHgxMTYwLCAweGFjODIsIDB4YjQwMCwgMHgwMjQ4LAorCTB4Njg1OCwgMHhhYzAyLCAweDEyMzAsIDB4NzEyNCwgMHg2MTBhLCAweDIwMDksIDB4MDA0NSwgMHgwODBjLAorCTB4ODBhNywgMHgwMDA1LCAweDcxMTAsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE4ZSwgMHgwMDAwLAorCTB4MTEzMCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4YSwgMHgwMDA2LCAweDEyMDgsIDB4MDAwYiwgMHgwMDA1LAorCTB4NjM4NiwgMHg2Mzg3LCAweDYzODYsIDB4NjM4NiwgMHg2M2YwLCAweDYzZmMsIDB4MDAwNSwgMHg3MTEwLAorCTB4ZDFiYywgMHgwMTIwLCAweDcwMmMsIDB4ZDA4NCwgMHgwOTA0LCAweDYzZWYsIDB4NzAwYywgMHg3MTA4LAorCTB4MDgwYywgMHgyNjc2LCAweDE5MDQsIDB4NjNlZiwgMHgwODBjLCAweDRjODAsIDB4MTkwNCwgMHg2M2VmLAorCTB4NjYxMiwgMHg2NTE2LCAweDYyMDQsIDB4NzExMCwgMHhkMWJjLCAweDAxZjgsIDB4YTI4YywgMHgwMGZmLAorCTB4YTE4NiwgMHgwMDA0LCAweDAxMTgsIDB4YTE4NiwgMHgwMDA2LCAweDE1YzgsIDB4MDBjNiwgMHgwODBjLAorCTB4NjQwOCwgMHgwMGNlLCAweDA5MDQsIDB4NjNlZiwgMHgwMGM2LCAweDA4MGMsIDB4ODAyMiwgMHgwMDFlLAorCTB4MDVmMCwgMHg2MTFhLCAweDA4MGMsIDB4OTk1NiwgMHg2MDFmLCAweDAwMDIsIDB4NzEyMCwgMHg2MTBhLAorCTB4MjAwOSwgMHgwMDg4LCAweDA4MGMsIDB4ODBhNywgMHgwNDkwLCAweGEyOGMsIDB4MDBmZiwgMHhhMTg2LAorCTB4MDAwNiwgMHgwMTYwLCAweGExODYsIDB4MDAwNCwgMHgwMTQ4LCAweGEyOTQsIDB4ZmYwMCwgMHg4MjE3LAorCTB4YTI4NiwgMHgwMDA0LCAweDAxMTgsIDB4YTI4NiwgMHgwMDA2LCAweDExODgsIDB4MDBjNiwgMHgwODBjLAorCTB4ODAyMiwgMHgwMDFlLCAweDAxZTAsIDB4NjExYSwgMHgwODBjLCAweDk5NTYsIDB4NjAxZiwgMHgwMDA1LAorCTB4NzEyMCwgMHg2MTBhLCAweDIwMDksIDB4MDA4OCwgMHgwODBjLCAweDgwYTcsIDB4MDA4MCwgMHgwMGM2LAorCTB4MDgwYywgMHg4MDIyLCAweDAwMWUsIDB4MDE1OCwgMHg2MTFhLCAweDA4MGMsIDB4OTk1NiwgMHg2MDFmLAorCTB4MDAwNCwgMHg3MTIwLCAweDYxMGEsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsIDB4ODBhNywgMHgwMDA1LAorCTB4NzExMCwgMHhkMWJjLCAweDAxNDAsIDB4MDBhMSwgMHgwMTMwLCAweDcxMjQsIDB4NjEwYSwgMHgyMDA5LAorCTB4MDA4OSwgMHgwODBjLCAweDgwYTcsIDB4MDAwNSwgMHg3MTEwLCAweGQxYmMsIDB4MDE0MCwgMHgwMDQxLAorCTB4MDEzMCwgMHg3MTI0LCAweDYxMGEsIDB4MjAwOSwgMHgwMDhhLCAweDA4MGMsIDB4ODBhNywgMHgwMDA1LAorCTB4NzAyMCwgMHgyMDYwLCAweGFjODQsIDB4MDAwNywgMHgxMTU4LCAweGFjODIsIDB4YjQwMCwgMHgwMjQwLAorCTB4MjAwMSwgMHhhZDE2LCAweDIwMDQsIDB4YWMwMiwgMHgxMjE4LCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LAorCTB4YTAwNiwgMHgwY2U4LCAweDcxMTAsIDB4ZDFiYywgMHgxMTc4LCAweDcwMjQsIDB4MjA2MCwgMHhhYzg0LAorCTB4MDAwNywgMHgxMTUwLCAweGFjODIsIDB4YjQwMCwgMHgwMjM4LCAweDY4NTgsIDB4YWMwMiwgMHgxMjIwLAorCTB4MjAwOSwgMHgwMDUxLCAweDA4MGMsIDB4ODBhNywgMHgwMDA1LCAweDIwMzEsIDB4MDEwNSwgMHgwMDY5LAorCTB4MDAwNSwgMHgyMDMxLCAweDAyMDYsIDB4MDA0OSwgMHgwMDA1LCAweDIwMzEsIDB4MDIwNywgMHgwMDI5LAorCTB4MDAwNSwgMHgyMDMxLCAweDAyMTMsIDB4MDAwOSwgMHgwMDA1LCAweDAwYzYsIDB4MDBkNiwgMHgwMGY2LAorCTB4NzAwMCwgMHhhMDg0LCAweGYwMDAsIDB4YTA4NiwgMHhjMDAwLCAweDA1YjAsIDB4MDgwYywgMHg4MDIyLAorCTB4MDU5OCwgMHgwMDY2LCAweDAwYzYsIDB4MDA0NiwgMHgyMDExLCAweGIyODMsIDB4MjIwNCwgMHg4MjExLAorCTB4MjIwYywgMHgwODBjLCAweDI2NzYsIDB4MTU4MCwgMHgwODBjLCAweDRjODAsIDB4MTU2OCwgMHg2NjEyLAorCTB4NjUxNiwgMHgyYzAwLCAweDAwNGUsIDB4MDBjZSwgMHg2MDFhLCAweDA4MGMsIDB4OTk1NiwgMHgwODBjLAorCTB4MTVkOSwgMHgwMWYwLCAweDJkMDAsIDB4NjA1NiwgMHg2ODAzLCAweDAwMDAsIDB4NjgzNywgMHgwMDAwLAorCTB4NmMzYSwgMHhhZGY4LCAweDAwMGYsIDB4MjBhOSwgMHgwMDBlLCAweDJmYTAsIDB4MmU5OCwgMHg1M2EzLAorCTB4MDA2ZSwgMHg2NjEyLCAweDYwMDcsIDB4MDAzZSwgMHg2MDFmLCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLAorCTB4MDgwYywgMHg2N2VlLCAweDA4MGMsIDB4NmM1MCwgMHgwMGZlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LAorCTB4MDgwYywgMHg4MDc4LCAweDAwNmUsIDB4MGNjMCwgMHgwMDRlLCAweDAwY2UsIDB4MGNjOCwgMHgyMDcxLAorCTB4YWZkYSwgMHg3MDAzLCAweDAwMDMsIDB4NzAwZiwgMHgwMzYxLCAweGEwMDYsIDB4NzAxYSwgMHg3MDEyLAorCTB4NzAxNywgMHhiNDAwLCAweDcwMDcsIDB4MDAwMCwgMHg3MDI2LCAweDcwMmIsIDB4Nzg0MSwgMHg3MDMyLAorCTB4NzAzNywgMHg3ODlkLCAweDcwM2IsIDB4ZmZmZiwgMHg3MDNmLCAweGZmZmYsIDB4NzA0MiwgMHg3MDQ3LAorCTB4NDFiMywgMHgwMDA1LCAweDIwNzEsIDB4YWZkYSwgMHgxZDA0LCAweDY0ZmMsIDB4MjA5MSwgMHg2MDAwLAorCTB4NzAwYywgMHg4MDAxLCAweDcwMGUsIDB4MTE4MCwgMHg3MDBmLCAweDAzNjEsIDB4NzAwNywgMHgwMDAxLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzA0MCwgMHhhMDBkLCAweDAxNDgsIDB4ODEwOSwgMHg3MTQyLAorCTB4MTEzMCwgMHg3MDQ0LCAweDA4MGYsIDB4MDAxOCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDI0LAorCTB4YTAwZCwgMHgwMTg4LCAweDcwMjAsIDB4ODAwMSwgMHg3MDIyLCAweDExNjgsIDB4NzAyMywgMHgwMDA5LAorCTB4ODEwOSwgMHg3MTI2LCAweGExODYsIDB4MDNlOCwgMHgxMTEwLCAweDcwMjgsIDB4MDgwZiwgMHg4MWZmLAorCTB4MTExMCwgMHg3MDI4LCAweDA4MGYsIDB4NzAzMCwgMHhhMDBkLCAweDAxNTgsIDB4NzAyYywgMHg4MDAxLAorCTB4NzAyZSwgMHgxMTM4LCAweDcwMmYsIDB4MDAwOSwgMHg4MTA5LCAweDcxMzIsIDB4MTExMCwgMHg3MDM0LAorCTB4MDgwZiwgMHg3MDM4LCAweGEwMDUsIDB4MDExOCwgMHgwMzEwLCAweDgwMDEsIDB4NzAzYSwgMHg3MDNjLAorCTB4YTAwNSwgMHgwMTE4LCAweDAzMTAsIDB4ODAwMSwgMHg3MDNlLCAweDcwMTgsIDB4YTAwZCwgMHgwMTU4LAorCTB4NzAwOCwgMHg4MDAxLCAweDcwMGEsIDB4MTEzOCwgMHg3MDBiLCAweDAwMDksIDB4ODEwOSwgMHg3MTFhLAorCTB4MTExMCwgMHg3MDFjLCAweDA4MGYsIDB4MDEyZSwgMHg3MDA0LCAweDAwMDIsIDB4NjUyMiwgMHg2NTIzLAorCTB4NjUzYiwgMHgwMGU2LCAweDIwNzEsIDB4YWZkYSwgMHg3MDE4LCAweGEwMDUsIDB4MTEyMCwgMHg3MTFhLAorCTB4NzIxZSwgMHg3MDBiLCAweDAwMDksIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MDAwNiwgMHgyMDcxLAorCTB4YWZkYSwgMHg3MDFjLCAweGEyMDYsIDB4MTExMCwgMHg3MDFhLCAweDcwMWUsIDB4MDAwZSwgMHgwMGVlLAorCTB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4YWZkYSwgMHg2MDg4LCAweGExMDIsIDB4MDIwOCwgMHg2MThhLAorCTB4MDBlZSwgMHgwMDA1LCAweDAwMDUsIDB4NzExMCwgMHgwODBjLCAweDRjZGMsIDB4MTE1OCwgMHg2MDg4LAorCTB4ODAwMSwgMHgwMjQwLCAweDYwOGEsIDB4MTEzMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLAorCTB4NmM1MCwgMHgwMTJlLCAweDgxMDgsIDB4YTE4MiwgMHgwMGZmLCAweDAyMTgsIDB4YTAwZSwgMHg3MDA3LAorCTB4MDAwMiwgMHg3MTEyLCAweDAwMDUsIDB4NzAxNCwgMHgyMDYwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjAzYywgMHhhMDA1LCAweDAxMjgsIDB4ODAwMSwgMHg2MDNlLCAweDExMTAsIDB4MDgwYywgMHg5ODQ2LAorCTB4NjAxNCwgMHhhMDA1LCAweDA1MDAsIDB4ODAwMSwgMHg2MDE2LCAweDExZTgsIDB4NjExYywgMHhhMTg2LAorCTB4MDAwMywgMHgwMTE4LCAweGExODYsIDB4MDAwNiwgMHgxMWEwLCAweDYwMTAsIDB4MjA2OCwgMHg2ODU0LAorCTB4YTA4YSwgMHgxOTlhLCAweDAyNzAsIDB4YTA4MiwgMHgxOTk5LCAweDY4NTYsIDB4YTA4YSwgMHgxOTlhLAorCTB4MDIxMCwgMHgyMDAxLCAweDE5OTksIDB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4YTEwOCwgMHg2MTE2LAorCTB4MDAxMCwgMHgwODBjLCAweDkzNTAsIDB4MDEyZSwgMHhhYzg4LCAweDAwMTgsIDB4NzExNiwgMHgyMDAxLAorCTB4ZTQwMCwgMHhhMTAyLCAweDAyMjAsIDB4NzAxNywgMHhiNDAwLCAweDcwMDcsIDB4MDAwMCwgMHgwMDA1LAorCTB4MDBlNiwgMHgyMDcxLCAweGFmZGEsIDB4NzAyNywgMHgwN2QwLCAweDcwMjMsIDB4MDAwOSwgMHgwMGVlLAorCTB4MDAwNSwgMHgyMDAxLCAweGFmZTMsIDB4MjAwMywgMHgwMDAwLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLAorCTB4YWZkYSwgMHg3MTMyLCAweDcwMmYsIDB4MDAwOSwgMHgwMGVlLCAweDAwMDUsIDB4MjAxMSwgMHhhZmU2LAorCTB4MjAxMywgMHgwMDAwLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweGFmZGEsIDB4NzExYSwgMHg3MjFlLAorCTB4NzAwYiwgMHgwMDA5LCAweDAwZWUsIDB4MDAwNSwgMHgwMGM2LCAweDIwNjEsIDB4YjA0OCwgMHgwMGNlLAorCTB4MDAwNSwgMHhhMTg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTA4MCwgMHhiMDQ4LAorCTB4MjA2MCwgMHgwMDA1LCAweDY4NTQsIDB4YTA4YSwgMHgxOTlhLCAweDAyMTAsIDB4MjAwMSwgMHgxOTk5LAorCTB4YTAwNSwgMHgxMTUwLCAweDAwYzYsIDB4MjA2MSwgMHhiMDQ4LCAweDYwMTQsIDB4MDBjZSwgMHhhMDA1LAorCTB4MTEzOCwgMHgyMDAxLCAweDAwMWUsIDB4MDAyMCwgMHhhMDhlLCAweGZmZmYsIDB4MTEwOCwgMHhhMDA2LAorCTB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4YTEwOCwgMHg2MTE2LCAweDY4NGMsIDB4YTA4YywgMHgwMGMwLAorCTB4YTE4ZSwgMHgwMGMwLCAweDA1YjAsIDB4ZDBiNCwgMHgxMTM4LCAweGQwYmMsIDB4MTUyOCwgMHgyMDA5LAorCTB4MDAwNiwgMHgwODBjLCAweDY2MWEsIDB4MDAwNSwgMHhkMGZjLCAweDAxMzAsIDB4YTA4NCwgMHgwMDAzLAorCTB4MDExOCwgMHhhMDg2LCAweDAwMDMsIDB4MTVjMCwgMHg2MDIwLCAweGQwZDQsIDB4MDEzMCwgMHhjMGQ0LAorCTB4NjAyMiwgMHg2ODYwLCAweDYwMmEsIDB4Njg1YywgMHg2MDJlLCAweDIwMDksIDB4YWQ3MywgMHgyMTA0LAorCTB4ZDA4NCwgMHgwMTI4LCAweDIwMDksIDB4MDA0MiwgMHgwODBjLCAweDgwYTcsIDB4MDAwNSwgMHgyMDA5LAorCTB4MDA0MywgMHgwODBjLCAweDgwYTcsIDB4MDAwNSwgMHhkMGZjLCAweDAxMzAsIDB4YTA4NCwgMHgwMDAzLAorCTB4MDExOCwgMHhhMDg2LCAweDAwMDMsIDB4MTFjMCwgMHgyMDA5LCAweDAwNDIsIDB4MDgwYywgMHg4MGE3LAorCTB4MDAwNSwgMHhkMGZjLCAweDAxNTAsIDB4YTA4NCwgMHgwMDAzLCAweGEwOGUsIDB4MDAwMiwgMHgwMTM4LAorCTB4MjAwOSwgMHgwMDQxLCAweDA4MGMsIDB4ODBhNywgMHgwMDA1LCAweDAwNTEsIDB4MGNlOCwgMHgyMDA5LAorCTB4MDA0MywgMHgwODBjLCAweDgwYTcsIDB4MGNjMCwgMHgyMDA5LCAweDAwMDQsIDB4MDAxOSwgMHgwMDA1LAorCTB4MjAwOSwgMHgwMDAxLCAweDAwZDYsIDB4NjAxMCwgMHhhMGVjLCAweGYwMDAsIDB4MDFmMCwgMHgyMDY4LAorCTB4Njk1MiwgMHg2ODAwLCAweDYwMTIsIDB4YTE4NiwgMHgwMDAxLCAweDExODgsIDB4Njk0YywgMHhhMThjLAorCTB4ODEwMCwgMHhhMThlLCAweDgxMDAsIDB4MTE1OCwgMHgwMGM2LCAweDIwNjEsIDB4YjA0OCwgMHg2MjAwLAorCTB4ZDI4YywgMHgxMTIwLCAweDYyMDQsIDB4ODIxMCwgMHgwMjA4LCAweDYyMDYsIDB4MDBjZSwgMHgwODBjLAorCTB4NTEwYywgMHg2MDEwLCAweGEwNmQsIDB4MTkwYywgMHg2NWFhLCAweDAwZGUsIDB4MDAwNSwgMHgwMTU2LAorCTB4MDBjNiwgMHgyMDYxLCAweGIwNDgsIDB4NjAwMCwgMHg4MWZmLCAweDAxMTAsIDB4YTIwNSwgMHgwMDA4LAorCTB4YTIwNCwgMHg2MDAyLCAweDAwY2UsIDB4MDE1ZSwgMHgwMDA1LCAweDY4MDAsIDB4ZDA4YywgMHgxMTM4LAorCTB4NjgwOCwgMHhhMDA1LCAweDAxMjAsIDB4ODAwMSwgMHg2ODBhLCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LAorCTB4MjBhOSwgMHgwMDEwLCAweGEwMDYsIDB4ODAwNCwgMHg4MDg2LCAweDgxOGUsIDB4MTIwOCwgMHhhMjAwLAorCTB4MWYwNCwgMHg2NjVjLCAweDgwODYsIDB4ODE4ZSwgMHgwMDA1LCAweDAxNTYsIDB4MjBhOSwgMHgwMDEwLAorCTB4YTAwNSwgMHgwMWI4LCAweGExMWEsIDB4MTJhOCwgMHg4MjEzLCAweDgxOGQsIDB4MDIyOCwgMHhhMTFhLAorCTB4MTIyMCwgMHgxZjA0LCAweDY2NmMsIDB4MDAyOCwgMHhhMTFhLCAweDIzMDgsIDB4ODIxMCwgMHgxZjA0LAorCTB4NjY2YywgMHgwMDA2LCAweDMyMDAsIDB4YTA4NCwgMHhlZmZmLCAweDIwODAsIDB4MDAwZSwgMHgwMTVlLAorCTB4MDAwNSwgMHgwMDA2LCAweDMyMDAsIDB4YTA4NSwgMHgxMDAwLCAweDBjYjgsIDB4MDEyNiwgMHgyMDkxLAorCTB4MjgwMCwgMHgyMDc5LCAweGFmYzcsIDB4MDEyZSwgMHgwMGQ2LCAweDIwNjksIDB4YWZjNywgMHg2ODAzLAorCTB4MDAwNSwgMHgyMDY5LCAweDAwMDQsIDB4MmQwNCwgMHhhMDg1LCAweDgwMDEsIDB4MjA2YSwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMGM2LCAweDYwMjcsIDB4MDAwMSwgMHg3ODA0LCAweGEwODQsIDB4MDAwNywgMHgwMDAyLAorCTB4NjZhYSwgMHg2NmNiLCAweDY3MWUsIDB4NjZiMCwgMHg2NmNiLCAweDY2YWEsIDB4NjZhOCwgMHg2NmE4LAorCTB4MDgwYywgMHgxNGY2LCAweDA4MGMsIDB4NjU4MSwgMHgwODBjLCAweDZjNTAsIDB4MDBjZSwgMHgwMDA1LAorCTB4NjJjMCwgMHg4MmZmLCAweDExMTAsIDB4MDBjZSwgMHgwMDA1LCAweDIwMTEsIDB4NDgxYiwgMHgwODBjLAorCTB4NjUwZCwgMHg3ODI4LCAweGEwOTIsIDB4MDBjOCwgMHgxMjI4LCAweDgwMDAsIDB4NzgyYSwgMHgwODBjLAorCTB4NDg1NSwgMHgwYzg4LCAweDA4MGMsIDB4NDgxYiwgMHg3ODA3LCAweDAwMDMsIDB4NzgyNywgMHgwMDAwLAorCTB4NzgyYiwgMHgwMDAwLCAweDBjNDAsIDB4MDgwYywgMHg2NTgxLCAweDNjMDAsIDB4MDAwNiwgMHgyMDExLAorCTB4MDIwOSwgMHgyMGUxLCAweDQwMDAsIDB4MjIxNCwgMHgwMDBlLCAweDIwZTAsIDB4ODJmZiwgMHgwMTc4LAorCTB4NjJjMCwgMHg4MmZmLCAweDExNjAsIDB4NzgyYiwgMHgwMDAwLCAweDc4MjQsIDB4YTA2NSwgMHgwOTBjLAorCTB4MTRmNiwgMHgyMDA5LCAweDAwMTMsIDB4MDgwYywgMHg4MGE3LCAweDAwY2UsIDB4MDAwNSwgMHgzOTAwLAorCTB4YTA4MiwgMHhiMGU4LCAweDEyMTAsIDB4MDgwYywgMHg3ZDhkLCAweDAwYzYsIDB4NzgyNCwgMHhhMDY1LAorCTB4MDkwYywgMHgxNGY2LCAweDc4MDQsIDB4YTA4NiwgMHgwMDA0LCAweDA5MDQsIDB4Njc1ZSwgMHg3ODI4LAorCTB4YTA5MiwgMHgyNzEwLCAweDEyMzAsIDB4ODAwMCwgMHg3ODJhLCAweDAwY2UsIDB4MDgwYywgMHg3ODI3LAorCTB4MGMyMCwgMHg2MTA0LCAweGExODYsIDB4MDAwMywgMHgxMTg4LCAweDAwZTYsIDB4MjA3MSwgMHhhZDAwLAorCTB4NzBkYywgMHgwMGVlLCAweGQwOGMsIDB4MDE1MCwgMHgwMGM2LCAweDAwZTYsIDB4MjA2MSwgMHgwMTAwLAorCTB4MjA3MSwgMHhhZDAwLCAweDA4MGMsIDB4NDg1ZSwgMHgwMGVlLCAweDAwY2UsIDB4MDgwYywgMHhhY2EyLAorCTB4MjAwOSwgMHgwMDE0LCAweDA4MGMsIDB4ODBhNywgMHgwMGNlLCAweDA4MzgsIDB4MjAwMSwgMHhhZmUzLAorCTB4MjAwMywgMHgwMDAwLCAweDYyYzAsIDB4ODJmZiwgMHgxMTYwLCAweDc4MmIsIDB4MDAwMCwgMHg3ODI0LAorCTB4YTA2NSwgMHgwOTBjLCAweDE0ZjYsIDB4MjAwOSwgMHgwMDEzLCAweDA4MGMsIDB4ODBmYiwgMHgwMGNlLAorCTB4MDAwNSwgMHgwMGM2LCAweDAwZDYsIDB4MzkwMCwgMHhhMDgyLCAweGIwZTgsIDB4MTIxMCwgMHgwODBjLAorCTB4N2Q4ZCwgMHg3ODI0LCAweGEwMDUsIDB4MDkwYywgMHgxNGY2LCAweDc4MWMsIDB4YTA2ZCwgMHgwOTBjLAorCTB4MTRmNiwgMHg2ODAwLCAweGMwZGMsIDB4NjgwMiwgMHg3OTI0LCAweDIxNjAsIDB4MDgwYywgMHg4MDc4LAorCTB4NjkzYywgMHg4MWZmLCAweDA5MGMsIDB4MTRmNiwgMHg4MTA5LCAweDY5M2UsIDB4Njg1NCwgMHhhMDE1LAorCTB4MDExMCwgMHg3YTFlLCAweDAwMTAsIDB4NzkxOCwgMHg3OTFlLCAweDc4MDcsIDB4MDAwMCwgMHg3ODI3LAorCTB4MDAwMCwgMHgwMGRlLCAweDAwY2UsIDB4MDgwYywgMHg2YzUwLCAweDA4ODgsIDB4NjEwNCwgMHhhMTg2LAorCTB4MDAwMiwgMHgwMTI4LCAweGExODYsIDB4MDAwNCwgMHgwMTEwLCAweDA4MDQsIDB4NjZmNywgMHg3ODA4LAorCTB4YWMwNiwgMHgwOTA0LCAweDY2ZjcsIDB4MDgwYywgMHg2YjczLCAweDA4MGMsIDB4NjdlZSwgMHgwMGNlLAorCTB4MDgwYywgMHg2YzUwLCAweDA4MDQsIDB4NjZlNSwgMHgwMGM2LCAweDYwMjcsIDB4MDAwMiwgMHg2MmM4LAorCTB4NjBjNCwgMHhhMjA1LCAweDExNzgsIDB4NzkzYywgMHhhMWU1LCAweDAwMDAsIDB4MDEzMCwgMHgyMDA5LAorCTB4MDA0OSwgMHgwODBjLCAweDgwYTcsIDB4MDBjZSwgMHgwMDA1LCAweDIwMTEsIDB4YWZlNiwgMHgyMDEzLAorCTB4MDAwMCwgMHgwY2M4LCAweDM5MDgsIDB4YTE5MiwgMHhiMGU4LCAweDEyMTAsIDB4MDgwYywgMHg3ZDhkLAorCTB4NzkzYywgMHg4MWZmLCAweDBkOTAsIDB4NzkzYywgMHhhMTg4LCAweDAwMDcsIDB4MjEwYywgMHhhMThlLAorCTB4MDAwNiwgMHgxMTM4LCAweDYwMTQsIDB4YTA4NCwgMHgwMTg0LCAweGEwODUsIDB4MDAxMiwgMHg2MDE2LAorCTB4MGMxMCwgMHg2MDE0LCAweGEwODQsIDB4MDE4NCwgMHhhMDg1LCAweDAwMTYsIDB4NjAxNiwgMHgwOGQ4LAorCTB4MDAwNiwgMHgwMDE2LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjAwZiwgMHgwMDAwLAorCTB4MmMwOCwgMHgyMDYxLCAweGFmYzcsIDB4NjAyMCwgMHg4MDAwLCAweDYwMjIsIDB4NjAxMCwgMHhhMDA1LAorCTB4MDE0OCwgMHhhMDgwLCAweDAwMDMsIDB4MjEwMiwgMHg2MTEyLCAweDAxMmUsIDB4MDBjZSwgMHgwMDFlLAorCTB4MDAwZSwgMHgwMDA1LCAweDYxMTYsIDB4NjExMiwgMHgwY2MwLCAweDAwZDYsIDB4MjA2OSwgMHhhZmM3LAorCTB4NjAwMCwgMHhkMGQ0LCAweDAxNjgsIDB4NjgyMCwgMHg4MDAwLCAweDY4MjIsIDB4YTA4NiwgMHgwMDAxLAorCTB4MTExMCwgMHgyYzAwLCAweDY4MWUsIDB4NjgwNCwgMHhhMDg0LCAweDAwMDcsIDB4MDgwNCwgMHg2YzU2LAorCTB4YzBkNSwgMHg2MDAyLCAweDY4MTgsIDB4YTAwNSwgMHgwMTU4LCAweDYwNTYsIDB4NjA1YiwgMHgwMDAwLAorCTB4MDAwNiwgMHgyYzAwLCAweDY4MWEsIDB4MDBkZSwgMHg2ODVhLCAweDIwNjksIDB4YWZjNywgMHgwYzE4LAorCTB4NjA1NiwgMHg2MDVhLCAweDJjMDAsIDB4NjgxYSwgMHg2ODFlLCAweDA4ZTgsIDB4MDAwNiwgMHgwMDE2LAorCTB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDBmLCAweDAwMDAsIDB4MmMwOCwgMHgyMDYxLAorCTB4YWZjNywgMHg2MDIwLCAweDgwMDAsIDB4NjAyMiwgMHg2MDA4LCAweGEwMDUsIDB4MDE0OCwgMHhhMDgwLAorCTB4MDAwMywgMHgyMTAyLCAweDYxMGEsIDB4MDEyZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LAorCTB4NjEwZSwgMHg2MTBhLCAweDBjYzAsIDB4MDBjNiwgMHg2MDBmLCAweDAwMDAsIDB4MmMwOCwgMHgyMDYxLAorCTB4YWZjNywgMHg2MDM0LCAweGEwMDUsIDB4MDEzMCwgMHhhMDgwLCAweDAwMDMsIDB4MjEwMiwgMHg2MTM2LAorCTB4MDBjZSwgMHgwMDA1LCAweDYxM2EsIDB4NjEzNiwgMHgwY2Q4LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LAorCTB4MDBjNiwgMHgwMDc2LCAweDAwNjYsIDB4MDAyNiwgMHgwMDE2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDcxLAorCTB4YWZjNywgMHg3NjM4LCAweDI2NjAsIDB4MjY3OCwgMHgyMDkxLCAweDgwMDAsIDB4OGNmZiwgMHgwOTA0LAorCTB4Njg4OSwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEyMDYsIDB4MTkwNCwgMHg2ODg0LAorCTB4ODdmZiwgMHgwMTIwLCAweDYwNTAsIDB4YTEwNiwgMHgxOTA0LCAweDY4ODQsIDB4NzAzYywgMHhhYzA2LAorCTB4MTE3MCwgMHgwMDM2LCAweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweDdhNjQsIDB4NzAzMywgMHgwMDAwLAorCTB4NzAzZiwgMHgwMDAwLCAweDcwNDMsIDB4MDAwMCwgMHg3MDQ3LCAweDAwMDAsIDB4MDAzZSwgMHg3MDM4LAorCTB4YWMzNiwgMHgxMTEwLCAweDY2MGMsIDB4NzYzYSwgMHg3MDM0LCAweGFjMzYsIDB4MTE0MCwgMHgyYzAwLAorCTB4YWYzNiwgMHgwMTE4LCAweDJmMDAsIDB4NzAzNiwgMHgwMDEwLCAweDcwMzcsIDB4MDAwMCwgMHg2NjBjLAorCTB4MDA2NiwgMHgyYzAwLCAweGFmMDYsIDB4MDExMCwgMHg3ZTBlLCAweDAwMDgsIDB4MjY3OCwgMHg2MDBmLAorCTB4MDAwMCwgMHgwODBjLCAweDk1OTYsIDB4MDE5OCwgMHg2MDEwLCAweDIwNjgsIDB4NjAxYywgMHhhMDg2LAorCTB4MDAwMywgMHgxNTEwLCAweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgwODBjLAorCTB4OTdmZCwgMHgwODBjLCAweGFiZmEsIDB4MDgwYywgMHg1MTBjLCAweDA4MGMsIDB4OTc0MiwgMHgwODBjLAorCTB4OTc0ZSwgMHgwMGNlLCAweDA4MDQsIDB4NjgyZSwgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwODA0LAorCTB4NjgyZSwgMHgwMTJlLCAweDAwMGUsIDB4MDAxZSwgMHgwMDJlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMGNlLAorCTB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHg2MDFjLCAweGEwODYsIDB4MDAwNiwgMHgxOWQwLAorCTB4MDgwYywgMHhhYmZhLCAweDA4MGMsIDB4YTkxZiwgMHgwYzEwLCAweDAwMDYsIDB4MDA2NiwgMHgwMGM2LAorCTB4MDBkNiwgMHgwMGY2LCAweDIwMzEsIDB4MDAwMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDc5LAorCTB4YWZjNywgMHg3ODM4LCAweGEwNjUsIDB4MDU1OCwgMHg2MDBjLCAweDAwMDYsIDB4NjAwZiwgMHgwMDAwLAorCTB4NzgzYywgMHhhYzA2LCAweDExNzAsIDB4MDAzNiwgMHgyMDE5LCAweDAwMDEsIDB4MDgwYywgMHg3YTY0LAorCTB4NzgzMywgMHgwMDAwLCAweDc4M2YsIDB4MDAwMCwgMHg3ODQzLCAweDAwMDAsIDB4Nzg0NywgMHgwMDAwLAorCTB4MDAzZSwgMHgwODBjLCAweDk1OTYsIDB4MDE3OCwgMHg2MDEwLCAweDIwNjgsIDB4NjAxYywgMHhhMDg2LAorCTB4MDAwMywgMHgxMWIwLCAweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgwODBjLAorCTB4NTEwYywgMHgwODBjLCAweDk3NDIsIDB4MDgwYywgMHg5NzRlLCAweDAwMGUsIDB4MDg5OCwgMHg3ZTNhLAorCTB4N2UzNiwgMHgwMTJlLCAweDAwZmUsIDB4MDBkZSwgMHgwMGNlLCAweDAwNmUsIDB4MDAwZSwgMHgwMDA1LAorCTB4NjAxYywgMHhhMDg2LCAweDAwMDYsIDB4MWQzMCwgMHgwODBjLCAweGE5MWYsIDB4MGM2MCwgMHgwMDE2LAorCTB4MDAyNiwgMHgwMDg2LCAweDIwNDEsIDB4MDAwMCwgMHgwMDk5LCAweDA4MGMsIDB4NjlhOSwgMHgwMDhlLAorCTB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBmNiwgMHgwMTI2LCAweDIwNzksIDB4YWZjNywgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDZhMzYsIDB4MDgwYywgMHg2YWE4LCAweDAxMmUsIDB4MDBmZSwgMHgwMDA1LAorCTB4MDBmNiwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgwMDY2LCAweDAwMTYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YWZjNywgMHg3NjE0LCAweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLAorCTB4MDkwNCwgMHg2OTg1LCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4YTIwNiwgMHgxOTA0LAorCTB4Njk4MCwgMHg4OGZmLCAweDAxMjAsIDB4NjA1MCwgMHhhMTA2LCAweDE5MDQsIDB4Njk4MCwgMHg3MDI0LAorCTB4YWMwNiwgMHgxNTM4LCAweDIwNjksIDB4MDEwMCwgMHg2OGMwLCAweGEwMDUsIDB4MDFmMCwgMHgwODBjLAorCTB4NjU4MSwgMHgwODBjLCAweDc4MzQsIDB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4N2NhOCwgMHg3MDI3LAorCTB4MDAwMCwgMHgwMDM2LCAweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweGEzODQsIDB4MTAwMCwgMHgwMTIwLAorCTB4NjgwMywgMHgwMTAwLCAweDY4MDMsIDB4MDAwMCwgMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwgMHhkMDg0LAorCTB4MDExMCwgMHg2ODI3LCAweDAwMDEsIDB4MDAzZSwgMHgwMDIwLCAweDYwMDMsIDB4MDAwOSwgMHg2MzBhLAorCTB4MDRiOCwgMHg3MDE0LCAweGFjMzYsIDB4MTExMCwgMHg2NjBjLCAweDc2MTYsIDB4NzAxMCwgMHhhYzM2LAorCTB4MTE0MCwgMHgyYzAwLCAweGFmMzYsIDB4MDExOCwgMHgyZjAwLCAweDcwMTIsIDB4MDAxMCwgMHg3MDEzLAorCTB4MDAwMCwgMHg2NjBjLCAweDAwNjYsIDB4MmMwMCwgMHhhZjA2LCAweDAxMTAsIDB4N2UwZSwgMHgwMDA4LAorCTB4MjY3OCwgMHg2MDBmLCAweDAwMDAsIDB4NjAxMCwgMHgyMDY4LCAweDA4MGMsIDB4OTU5NiwgMHgwMTg4LAorCTB4NjAxYywgMHhhMDg2LCAweDAwMDMsIDB4MTUxMCwgMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LAorCTB4MDAwMCwgMHgwODBjLCAweDk3ZmQsIDB4MDgwYywgMHhhYmZhLCAweDA4MGMsIDB4NTEwYywgMHgwODBjLAorCTB4OTc0MiwgMHgwODBjLCAweDk3NGUsIDB4MDgwYywgMHg3Yjg4LCAweDAwY2UsIDB4MDgwNCwgMHg2OTBmLAorCTB4MmM3OCwgMHg2MDBjLCAweDIwNjAsIDB4MDgwNCwgMHg2OTBmLCAweDAxMmUsIDB4MDAwZSwgMHgwMDFlLAorCTB4MDA2ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4NjAxYywgMHhhMDg2LAorCTB4MDAwNiwgMHgxMTI4LCAweDA4MGMsIDB4YWJmYSwgMHgwODBjLCAweGE5MWYsIDB4MGMxMCwgMHg2MDFjLAorCTB4YTA4NiwgMHgwMDAyLCAweDExMjgsIDB4NjAwNCwgMHhhMDg2LCAweDAwODUsIDB4MDk2OCwgMHgwOGM4LAorCTB4NjAxYywgMHhhMDg2LCAweDAwMDUsIDB4MTlhOCwgMHg2MDA0LCAweGEwODYsIDB4MDA4NSwgMHgwZDUwLAorCTB4MDg4MCwgMHgwMGM2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YTI4MCwgMHhhZTM0LAorCTB4MjAwNCwgMHhhMDY1LCAweDA5MDQsIDB4NmEzMiwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMDY2LAorCTB4MjA3MSwgMHhhZmM3LCAweDY2NTQsIDB4NzAxOCwgMHhhYzA2LCAweDExMDgsIDB4NzYxYSwgMHg3MDFjLAorCTB4YWMwNiwgMHgxMTMwLCAweDg2ZmYsIDB4MTExOCwgMHg3MDE4LCAweDcwMWUsIDB4MDAwOCwgMHg3NjFlLAorCTB4NjA1OCwgMHhhMDdkLCAweDAxMDgsIDB4N2U1NiwgMHhhNmVkLCAweDAwMDAsIDB4MDExMCwgMHgyZjAwLAorCTB4Njg1YSwgMHg2MDU3LCAweDAwMDAsIDB4NjA1YiwgMHgwMDAwLCAweDYwMDAsIDB4YzBkNCwgMHhjMGRjLAorCTB4NjAwMiwgMHgwODBjLCAweDRjMDcsIDB4MDkwNCwgMHg2YTJlLCAweDc2MjQsIDB4ODZmZiwgMHgwNWU4LAorCTB4YTY4MCwgMHgwMDA0LCAweDIwMDQsIDB4YWQwNiwgMHgxNWMwLCAweDAwZDYsIDB4MjA2OSwgMHgwMTAwLAorCTB4NjhjMCwgMHhhMDA1LCAweDA1NDgsIDB4MDgwYywgMHg2NTgxLCAweDA4MGMsIDB4NzgzNCwgMHg2OGMzLAorCTB4MDAwMCwgMHgwODBjLCAweDdjYTgsIDB4NzAyNywgMHgwMDAwLCAweDAwMzYsIDB4MjA2OSwgMHgwMTQwLAorCTB4NmIwNCwgMHhhMzg0LCAweDEwMDAsIDB4MDEyMCwgMHg2ODAzLCAweDAxMDAsIDB4NjgwMywgMHgwMDAwLAorCTB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwgMHgwMTEwLCAweDY4MjcsIDB4MDAwMSwgMHgwMDNlLAorCTB4MDBkZSwgMHgwMGM2LCAweDYwM2MsIDB4YTAwNSwgMHgwMTEwLCAweDgwMDEsIDB4NjAzZSwgMHgyNjYwLAorCTB4MDgwYywgMHg5NzRlLCAweDAwY2UsIDB4MDA0OCwgMHgwMGRlLCAweDAwYzYsIDB4MjY2MCwgMHg2MDAzLAorCTB4MDAwOSwgMHg2MzBhLCAweDAwY2UsIDB4MDgwNCwgMHg2OWQ5LCAweDhkZmYsIDB4MDE1OCwgMHg2ODM3LAorCTB4MDEwMywgMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgwODBjLCAweDk3ZmQsIDB4MDgwYywgMHhhYmZhLAorCTB4MDgwYywgMHg1MTBjLCAweDA4MGMsIDB4N2I4OCwgMHgwODA0LCAweDY5ZDksIDB4MDA2ZSwgMHgwMGRlLAorCTB4MDBlZSwgMHgwMGZlLCAweDAxMmUsIDB4MDAwZSwgMHgwMGNlLCAweDAwMDUsIDB4MDAwNiwgMHgwMDY2LAorCTB4MDBjNiwgMHgwMGQ2LCAweDIwMzEsIDB4MDAwMCwgMHg3ODE0LCAweGEwNjUsIDB4MDkwNCwgMHg2YTg4LAorCTB4NjAwYywgMHgwMDA2LCAweDYwMGYsIDB4MDAwMCwgMHg3ODI0LCAweGFjMDYsIDB4MTU0MCwgMHgyMDY5LAorCTB4MDEwMCwgMHg2OGMwLCAweGEwMDUsIDB4MDFmMCwgMHgwODBjLCAweDY1ODEsIDB4MDgwYywgMHg3ODM0LAorCTB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4N2NhOCwgMHg3ODI3LCAweDAwMDAsIDB4MDAzNiwgMHgyMDY5LAorCTB4MDE0MCwgMHg2YjA0LCAweGEzODQsIDB4MTAwMCwgMHgwMTIwLCAweDY4MDMsIDB4MDEwMCwgMHg2ODAzLAorCTB4MDAwMCwgMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwgMHhkMDg0LCAweDAxMTAsIDB4NjgyNywgMHgwMDAxLAorCTB4MDAzZSwgMHgwMDI4LCAweDYwMDMsIDB4MDAwOSwgMHg2MzBhLCAweDJjMzAsIDB4MDBiMCwgMHg2MDEwLAorCTB4MjA2OCwgMHgwODBjLCAweDk1OTYsIDB4MDE2OCwgMHg2MDFjLCAweGEwODYsIDB4MDAwMywgMHgxMWI4LAorCTB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLCAweDA4MGMsIDB4NTEwYywgMHgwODBjLAorCTB4OTc0MiwgMHgwODBjLCAweDk3NGUsIDB4MDgwYywgMHg3Yjg4LCAweDAwMGUsIDB4MDgwNCwgMHg2YTNkLAorCTB4N2UxNiwgMHg3ZTEyLCAweDAwZGUsIDB4MDBjZSwgMHgwMDZlLCAweDAwMGUsIDB4MDAwNSwgMHg2MDFjLAorCTB4YTA4NiwgMHgwMDA2LCAweDExMTgsIDB4MDgwYywgMHhhOTFmLCAweDBjNTgsIDB4NjAxYywgMHhhMDg2LAorCTB4MDAwMiwgMHgxMTI4LCAweDYwMDQsIDB4YTA4NiwgMHgwMDg1LCAweDA5ZDAsIDB4MGMxMCwgMHg2MDFjLAorCTB4YTA4NiwgMHgwMDA1LCAweDE5ZjAsIDB4NjAwNCwgMHhhMDg2LCAweDAwODUsIDB4MGQ2MCwgMHgwOGM4LAorCTB4MDAwNiwgMHgwMDY2LCAweDAwYzYsIDB4MDBkNiwgMHg3ODE4LCAweGEwNjUsIDB4MDkwNCwgMHg2YjBlLAorCTB4NjA1NCwgMHgwMDA2LCAweDYwNTcsIDB4MDAwMCwgMHg2MDViLCAweDAwMDAsIDB4NjAwMCwgMHhjMGQ0LAorCTB4YzBkYywgMHg2MDAyLCAweDA4MGMsIDB4NGMwNywgMHgwOTA0LCAweDZiMGIsIDB4N2UyNCwgMHg4NmZmLAorCTB4MDVlOCwgMHhhNjgwLCAweDAwMDQsIDB4MjAwNCwgMHhhZDA2LCAweDE1YzAsIDB4MDBkNiwgMHgyMDY5LAorCTB4MDEwMCwgMHg2OGMwLCAweGEwMDUsIDB4MDU0OCwgMHgwODBjLCAweDY1ODEsIDB4MDgwYywgMHg3ODM0LAorCTB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4N2NhOCwgMHg3ODI3LCAweDAwMDAsIDB4MDAzNiwgMHgyMDY5LAorCTB4MDE0MCwgMHg2YjA0LCAweGEzODQsIDB4MTAwMCwgMHgwMTIwLCAweDY4MDMsIDB4MDEwMCwgMHg2ODAzLAorCTB4MDAwMCwgMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwgMHhkMDg0LCAweDAxMTAsIDB4NjgyNywgMHgwMDAxLAorCTB4MDAzZSwgMHgwMGRlLCAweDAwYzYsIDB4NjAzYywgMHhhMDA1LCAweDAxMTAsIDB4ODAwMSwgMHg2MDNlLAorCTB4MjY2MCwgMHgwODBjLCAweDk3NGUsIDB4MDBjZSwgMHgwMDQ4LCAweDAwZGUsIDB4MDBjNiwgMHgyNjYwLAorCTB4NjAwMywgMHgwMDA5LCAweDYzMGEsIDB4MDBjZSwgMHgwODA0LCAweDZhYmEsIDB4OGRmZiwgMHgwMTM4LAorCTB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLCAweDA4MGMsIDB4NTEwYywgMHgwODBjLAorCTB4N2I4OCwgMHgwODA0LCAweDZhYmEsIDB4MDAwZSwgMHgwODA0LCAweDZhYWQsIDB4NzgxZSwgMHg3ODFhLAorCTB4MDBkZSwgMHgwMGNlLCAweDAwNmUsIDB4MDAwZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBkNiwgMHgwMDY2LAorCTB4NjAwMCwgMHhkMGRjLCAweDAxODgsIDB4NjA0YywgMHhhMDZkLCAweDAxNzAsIDB4Njg0OCwgMHhhNjA2LAorCTB4MTE1OCwgMHgyMDcxLCAweGFmYzcsIDB4NzAyNCwgMHhhMDM1LCAweDAxMzAsIDB4YTA4MCwgMHgwMDA0LAorCTB4MjAwNCwgMHhhZDA2LCAweDExMDgsIDB4MDAyMSwgMHgwMDZlLCAweDAwZGUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4NzhjMCwgMHhhMDA1LCAweDExMzgsIDB4MDBjNiwgMHgyNjYwLAorCTB4NjAwMywgMHgwMDA5LCAweDYzMGEsIDB4MDBjZSwgMHgwNGEwLCAweDA4MGMsIDB4NzgzNCwgMHg3OGMzLAorCTB4MDAwMCwgMHgwODBjLCAweDdjYTgsIDB4NzAyNywgMHgwMDAwLCAweDAwMzYsIDB4MjA3OSwgMHgwMTQwLAorCTB4N2IwNCwgMHhhMzg0LCAweDEwMDAsIDB4MDEyMCwgMHg3ODAzLCAweDAxMDAsIDB4NzgwMywgMHgwMDAwLAorCTB4MjA3OSwgMHgwMTAwLCAweDc4MjQsIDB4ZDA4NCwgMHgwMTEwLCAweDc4MjcsIDB4MDAwMSwgMHgwODBjLAorCTB4N2NhOCwgMHgwMDNlLCAweDA4MGMsIDB4NGMwNywgMHgwMGM2LCAweDYwM2MsIDB4YTAwNSwgMHgwMTEwLAorCTB4ODAwMSwgMHg2MDNlLCAweDI2NjAsIDB4MDgwYywgMHg4MDc4LCAweDAwY2UsIDB4NjgzNywgMHgwMTAzLAorCTB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsIDB4MDgwYywgMHg5N2ZkLCAweDA4MGMsIDB4NTEwYywgMHgwODBjLAorCTB4N2I4OCwgMHgwMGZlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGM2LCAweDIwNzEsIDB4YWZjNywgMHg3MDA0LAorCTB4YTA4NCwgMHgwMDA3LCAweDAwMDIsIDB4NmI4NSwgMHg2Yjg4LCAweDZiOWUsIDB4NmJiNywgMHg2YmYwLAorCTB4NmI4NSwgMHg2YjgzLCAweDZiODMsIDB4MDgwYywgMHgxNGY2LCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LAorCTB4NzAyNCwgMHhhMDY1LCAweDAxNDgsIDB4NzAyMCwgMHg4MDAxLCAweDcwMjIsIDB4NjAwYywgMHhhMDE1LAorCTB4MDE1MCwgMHg3MjE2LCAweDYwMGYsIDB4MDAwMCwgMHg3MDA3LCAweDAwMDAsIDB4NzAyNywgMHgwMDAwLAorCTB4MDBjZSwgMHgwMGVlLCAweDAwMDUsIDB4NzIxNiwgMHg3MjEyLCAweDBjYjAsIDB4NjAxOCwgMHgyMDYwLAorCTB4MDgwYywgMHg0YzA3LCAweDYwMDAsIDB4YzBkYywgMHg2MDAyLCAweDcwMjAsIDB4ODAwMSwgMHg3MDIyLAorCTB4MDEyMCwgMHg2MDU0LCAweGEwMTUsIDB4MDE0MCwgMHg3MjFlLCAweDcwMDcsIDB4MDAwMCwgMHg3MDI3LAorCTB4MDAwMCwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHg3MjE4LCAweDcyMWUsIDB4MGNiMCwgMHg3MDI0LAorCTB4YTA2NSwgMHgwNTk4LCAweDcwMGMsIDB4YWMwNiwgMHgxMTYwLCAweDA4MGMsIDB4N2I4OCwgMHg2MDBjLAorCTB4YTAxNSwgMHgwMTIwLCAweDcyMGUsIDB4NjAwZiwgMHgwMDAwLCAweDA0MjgsIDB4NzIwZSwgMHg3MjBhLAorCTB4MDQxMCwgMHg3MDE0LCAweGFjMDYsIDB4MTE2MCwgMHgwODBjLCAweDdiODgsIDB4NjAwYywgMHhhMDE1LAorCTB4MDEyMCwgMHg3MjE2LCAweDYwMGYsIDB4MDAwMCwgMHgwMGIwLCAweDcyMTYsIDB4NzIxMiwgMHgwMDk4LAorCTB4NjAxOCwgMHgyMDYwLCAweDA4MGMsIDB4NGMwNywgMHg2MDAwLCAweGMwZGMsIDB4NjAwMiwgMHgwODBjLAorCTB4N2I4OCwgMHg3MDFjLCAweGEwNjUsIDB4MDEzOCwgMHg2MDU0LCAweGEwMTUsIDB4MDExMCwgMHg3MjFlLAorCTB4MDAxMCwgMHg3MjE4LCAweDcyMWUsIDB4NzAyNywgMHgwMDAwLCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LAorCTB4NzAyNCwgMHhhMDY1LCAweDAxNDAsIDB4MDgwYywgMHg3Yjg4LCAweDYwMGMsIDB4YTAxNSwgMHgwMTUwLAorCTB4NzIwZSwgMHg2MDBmLCAweDAwMDAsIDB4MDgwYywgMHg3Y2E4LCAweDcwMjcsIDB4MDAwMCwgMHgwMGNlLAorCTB4MDBlZSwgMHgwMDA1LCAweDcyMGUsIDB4NzIwYSwgMHgwY2IwLCAweDAwZDYsIDB4MjA2OSwgMHhhZmM3LAorCTB4NjgzMCwgMHhhMDg0LCAweDAwMDMsIDB4MDAwMiwgMHg2YzEyLCAweDZjMTQsIDB4NmMzOCwgMHg2YzEwLAorCTB4MDgwYywgMHgxNGY2LCAweDAwZGUsIDB4MDAwNSwgMHgwMGM2LCAweDY4NDAsIDB4YTA4NiwgMHgwMDAxLAorCTB4MDFiOCwgMHg2ODNjLCAweGEwNjUsIDB4MDEzMCwgMHg2MDBjLCAweGEwMTUsIDB4MDE3MCwgMHg2YTNhLAorCTB4NjAwZiwgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHg2ODNmLCAweDAwMDAsIDB4MjAxMSwgMHhhZmU2LAorCTB4MjAxMywgMHgwMDAwLCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweDY4M2EsIDB4NjgzNiwgMHgwYzkwLAorCTB4Njg0MywgMHgwMDAwLCAweDY4MzgsIDB4YTA2NSwgMHgwZDY4LCAweDYwMDMsIDB4MDAwMywgMHgwYzUwLAorCTB4MDBjNiwgMHg2ODQzLCAweDAwMDAsIDB4Njg0NywgMHgwMDAwLCAweDY4M2MsIDB4YTA2NSwgMHgwMTY4LAorCTB4NjAwYywgMHhhMDE1LCAweDAxMzAsIDB4NmEzYSwgMHg2MDBmLCAweDAwMDAsIDB4NjgzZiwgMHgwMDAwLAorCTB4MDAyMCwgMHg2ODNmLCAweDAwMDAsIDB4NjgzYSwgMHg2ODM2LCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LAorCTB4MDBkNiwgMHgyMDY5LCAweGFmYzcsIDB4NjgwNCwgMHhhMDg0LCAweDAwMDcsIDB4MDAwMiwgMHg2YzYxLAorCTB4NmNmZCwgMHg2Y2ZkLCAweDZjZmQsIDB4NmNmZCwgMHg2Y2ZmLCAweDZjNWYsIDB4NmM1ZiwgMHgwODBjLAorCTB4MTRmNiwgMHg2ODIwLCAweGEwMDUsIDB4MTExMCwgMHgwMGRlLCAweDAwMDUsIDB4MDBjNiwgMHg2ODBjLAorCTB4YTA2NSwgMHgwMTUwLCAweDY4MDcsIDB4MDAwNCwgMHg2ODI2LCAweDY4MmIsIDB4MDAwMCwgMHgwODBjLAorCTB4NmQ0OSwgMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwgMHg2ODE0LCAweGEwNjUsIDB4MDE1MCwgMHg2ODA3LAorCTB4MDAwMSwgMHg2ODI2LCAweDY4MmIsIDB4MDAwMCwgMHgwODBjLCAweDZkNDksIDB4MDBjZSwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMGU2LCAweDAwMzYsIDB4NmExYywgMHhhMmY1LCAweDAwMDAsIDB4MDkwNCwgMHg2Y2Y5LAorCTB4NzA0YywgMHhhMDBkLCAweDAxMTgsIDB4NzA4OCwgMHhhMDA1LCAweDAxYTAsIDB4NzA1NCwgMHhhMDc1LAorCTB4MDEyMCwgMHhhMjBlLCAweDA5MDQsIDB4NmNmOSwgMHgwMDI4LCAweDY4MTgsIDB4YTIwZSwgMHgwOTA0LAorCTB4NmNmOSwgMHgyMDcwLCAweDcwNGMsIDB4YTAwZCwgMHgwZDg4LCAweDcwODgsIDB4YTAwNSwgMHgxZDcwLAorCTB4MmUwMCwgMHg2ODFlLCAweDczM2MsIDB4NzAzOCwgMHhhMzAyLCAweDFlNDAsIDB4MDgwYywgMHg4MDRmLAorCTB4MDkwNCwgMHg2Y2Y5LCAweDgzMTgsIDB4NzMzZSwgMHg2MTEyLCAweDJlMTAsIDB4NjIxYSwgMHhhMTgwLAorCTB4MDAxNCwgMHgyMDA0LCAweGEwODQsIDB4MDBmZiwgMHg2MDVhLCAweGExODAsIDB4MDAxNCwgMHgyMDAzLAorCTB4MDAwMCwgMHhhMTgwLCAweDAwMTUsIDB4MjAwNCwgMHhhMDhhLCAweDE5OWEsIDB4MDIxMCwgMHgyMDAxLAorCTB4MTk5OSwgMHg4MDAzLCAweDgwMWIsIDB4ODMxYiwgMHhhMzE4LCAweDYzMTYsIDB4MDAzZSwgMHgwMGY2LAorCTB4MmM3OCwgMHg3MWEwLCAweDIwMDEsIDB4YWQzNCwgMHgyMDA0LCAweGQwYWMsIDB4MTExMCwgMHhkMWJjLAorCTB4MDE1MCwgMHg3MTAwLCAweGQxZjQsIDB4MDEyMCwgMHg3MTE0LCAweGExOGMsIDB4MDBmZiwgMHgwMDQwLAorCTB4MjAwOSwgMHgwMDAwLCAweDAwMjgsIDB4YTFlMCwgMHgyYmU2LCAweDJjMGQsIDB4YTE4YywgMHgwMGZmLAorCTB4MjA2MSwgMHgwMTAwLCAweDYxOWEsIDB4MDgwYywgMHg3MzZmLCAweDczMDAsIDB4YzNkZCwgMHg3MzAyLAorCTB4NjgwNywgMHgwMDAyLCAweDJmMTgsIDB4NmIyNiwgMHg2ODJiLCAweDAwMDAsIDB4NzgxZiwgMHgwMDAzLAorCTB4NzgwMywgMHgwMDAxLCAweDc4MDcsIDB4MDA0MCwgMHgwMGZlLCAweDAwZWUsIDB4MDBjZSwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMDNlLCAweDAwZWUsIDB4MDBjZSwgMHgwY2QwLCAweDAwZGUsIDB4MDAwNSwgMHgwMGM2LAorCTB4NjgwYywgMHhhMDY1LCAweDAxMzgsIDB4NjgwNywgMHgwMDA0LCAweDY4MjYsIDB4NjgyYiwgMHgwMDAwLAorCTB4MDgwYywgMHg2ZDQ5LCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBkNiwgMHgyMDY5LAorCTB4YWZjNywgMHg2ODMwLCAweGEwODYsIDB4MDAwMCwgMHgxMWMwLCAweDIwMDEsIDB4YWQwYywgMHgyMDBjLAorCTB4ZDFiYywgMHgxNTUwLCAweDY4MzgsIDB4YTA3ZCwgMHgwMTgwLCAweDY4MzMsIDB4MDAwMSwgMHg2ODNlLAorCTB4Njg0NywgMHgwMDAwLCAweDAxMjYsIDB4MDBmNiwgMHgyMDkxLCAweDI0MDAsIDB4MDAyZSwgMHgwODBjLAorCTB4MWVlNiwgMHgxMTMwLCAweDAxMmUsIDB4MDgwYywgMHg3NmE1LCAweDAwZGUsIDB4MDBmZSwgMHgwMDA1LAorCTB4MDEyZSwgMHhlMDAwLCAweDY4NDMsIDB4MDAwMCwgMHg3ODAzLCAweDAwMDIsIDB4NzgwYywgMHhhMDE1LAorCTB4MDE0MCwgMHg2YTNhLCAweDc4MGYsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4NjgzZiwgMHgwMDAwLAorCTB4MGM2MCwgMHg2ODNhLCAweDY4MzYsIDB4MGNjMCwgMHhjMWJjLCAweDIxMDIsIDB4MDgwYywgMHg1N2QxLAorCTB4MDg4OCwgMHg2MDFjLCAweGEwODQsIDB4MDAwZiwgMHgwMDBiLCAweDAwMDUsIDB4NmQ1NywgMHg2ZDVjLAorCTB4NzIxMCwgMHg3MzJjLCAweDZkNWMsIDB4NzIxMCwgMHg3MzJjLCAweDZkNTcsIDB4NmQ1YywgMHgwODBjLAorCTB4NmI3MywgMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHgwMTU2LCAweDAxMzYsIDB4MDE0NiwgMHgwMGM2LAorCTB4MDBmNiwgMHg2MDA0LCAweGEwOGEsIDB4MDA4MCwgMHgxYTBjLCAweDE0ZjYsIDB4NjExOCwgMHgyMTc4LAorCTB4NzlhMCwgMHgyMDExLCAweGFkMzQsIDB4MjIxNCwgMHhkMmFjLCAweDExMTAsIDB4ZDFiYywgMHgwMTUwLAorCTB4NzkwMCwgMHhkMWY0LCAweDAxMjAsIDB4NzkxNCwgMHhhMThjLCAweDAwZmYsIDB4MDA0MCwgMHgyMDA5LAorCTB4MDAwMCwgMHgwMDI4LCAweGExZjgsIDB4MmJlNiwgMHgyZjBkLCAweGExOGMsIDB4MDBmZiwgMHgyYzc4LAorCTB4MjA2MSwgMHgwMTAwLCAweDYxOWEsIDB4YTA4YSwgMHgwMDQwLCAweDFhMDQsIDB4NmRkMCwgMHgwMDMzLAorCTB4MDBmZSwgMHgwMGNlLCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLCAweDAwMDUsIDB4NmU3YywgMHg2ZWM3LAorCTB4NmVmNCwgMHg2ZmMxLCAweDZmZWYsIDB4NmZmNywgMHg3MDFkLCAweDcwMmUsIDB4NzAzZiwgMHg3MDQ3LAorCTB4NzA1ZCwgMHg3MDQ3LCAweDcwYjcsIDB4NzAyZSwgMHg3MGQ4LCAweDcwZTAsIDB4NzAzZiwgMHg3MGUwLAorCTB4NzBmMSwgMHg2ZGNlLCAweDZkY2UsIDB4NmRjZSwgMHg2ZGNlLCAweDZkY2UsIDB4NmRjZSwgMHg2ZGNlLAorCTB4NmRjZSwgMHg2ZGNlLCAweDZkY2UsIDB4NmRjZSwgMHg3OTBkLCAweDc5MzIsIDB4Nzk0NywgMHg3OTZhLAorCTB4Nzk4YiwgMHg3MDFkLCAweDZkY2UsIDB4NzAxZCwgMHg3MDQ3LCAweDZkY2UsIDB4NmVmNCwgMHg2ZmMxLAorCTB4NmRjZSwgMHg3ZGFhLCAweDcwNDcsIDB4NmRjZSwgMHg3ZGNhLCAweDcwNDcsIDB4NmRjZSwgMHg3MDNmLAorCTB4NmU3NSwgMHg2ZGUwLCAweDZkY2UsIDB4N2RlZiwgMHg3ZTY0LCAweDdmM2IsIDB4NmRjZSwgMHg3ZjRjLAorCTB4NzAxOCwgMHg3ZjY4LCAweDZkY2UsIDB4NzlhMCwgMHg3ZmMzLCAweDZkY2UsIDB4MDgwYywgMHgxNGY2LAorCTB4MjEwMCwgMHgwMDMzLCAweDAwZmUsIDB4MDBjZSwgMHgwMTRlLCAweDAxM2UsIDB4MDE1ZSwgMHgwMDA1LAorCTB4NmRkZSwgMHg2ZGRlLCAweDZkZGUsIDB4NmUxNCwgMHg2ZTMyLCAweDZlNDgsIDB4MDgwYywgMHgxNGY2LAorCTB4MDBkNiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3MTBlLCAweDc4MTAsIDB4MjA2OCwgMHgyMGEzLAorCTB4MjQxNCwgMHgyMGEzLCAweDAwMTgsIDB4MjBhMywgMHgwODAwLCAweDY4M2MsIDB4MjBhMiwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2ODUwLAorCTB4MjBhMiwgMHg2ODU0LCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLAorCTB4MDAxOCwgMHgwODBjLCAweDc4MjEsIDB4MDBkZSwgMHgwMDA1LCAweDAwZDYsIDB4NzgxOCwgMHgyMDY4LAorCTB4NjhhMCwgMHgyMDY5LCAweGFkMDAsIDB4NmFkMCwgMHhkMmFjLCAweDExMTAsIDB4ZDBiYywgMHgwMTEwLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwZGUsIDB4MDAwNSwgMHgwMGQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLAorCTB4NzEwZSwgMHgyMGEzLCAweDA1MDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MTAsIDB4YTBlOCwgMHgwMDBmLAorCTB4NjgwOCwgMHgyMGEyLCAweDY4MGMsIDB4MjBhMiwgMHg2ODEwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLAorCTB4NjgxOCwgMHgyMGEyLCAweDY4MWMsIDB4MjBhMiwgMHg2MGMzLCAweDAwMTAsIDB4MDgwYywgMHg3ODIxLAorCTB4MDBkZSwgMHgwMDA1LCAweDAxNTYsIDB4MDE0NiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3MTBlLAorCTB4MjBhMywgMHg3ODAwLCAweDIwYTMsIDB4MDAwMCwgMHg3ODA4LCAweDgwMDcsIDB4MjBhMiwgMHgyMGEzLAorCTB4MDAwMCwgMHg2MGMzLCAweDAwMDgsIDB4MDgwYywgMHg3ODIxLCAweDAxNGUsIDB4MDE1ZSwgMHgwMDA1LAorCTB4MDE1NiwgMHgwMTQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDcxYWEsIDB4MjBhMywgMHgwMjAwLAorCTB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4ZGYxMCwgMHgyMGEzLCAweDAwMzQsIDB4MjA5OSwgMHhhZDA1LAorCTB4MjBhOSwgMHgwMDA0LCAweDUzYTYsIDB4MjA5OSwgMHhhZDAxLCAweDIwYTksIDB4MDAwNCwgMHg1M2E2LAorCTB4MjA5OSwgMHhhZmFkLCAweDIwYTksIDB4MDAxYSwgMHgzMzA0LCAweDgwMDcsIDB4MjBhMiwgMHg5Mzk4LAorCTB4MWYwNCwgMHg2ZTY0LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDRjLAorCTB4MDgwYywgMHg3ODIxLCAweDAxNGUsIDB4MDE1ZSwgMHgwMDA1LCAweDIwMDEsIDB4YWQxNCwgMHgyMDA0LAorCTB4NjA5YSwgMHgwODBjLCAweDc4MjEsIDB4MDAwNSwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3MTBlLAorCTB4MjBhMywgMHg1MjAwLCAweDIwYTMsIDB4MDAwMCwgMHgwMGQ2LCAweDIwNjksIDB4YWQ1MSwgMHg2ODA0LAorCTB4ZDA4NCwgMHgwMTUwLCAweDY4MjgsIDB4MjBhMywgMHgwMDAwLCAweDAwMTYsIDB4MDgwYywgMHgyNjhhLAorCTB4MjFhMiwgMHgwMDFlLCAweDAwZGUsIDB4MDAyOCwgMHgwMGRlLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGE5LCAweDAwMDQsIDB4MjA5OSwgMHhhZDA1LCAweDUzYTYsIDB4MjBhOSwgMHgwMDA0LAorCTB4MjA5OSwgMHhhZDAxLCAweDUzYTYsIDB4MjAwMSwgMHhhZDM0LCAweDIwMDQsIDB4ZDBhYywgMHgxMTM4LAorCTB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMDgyLCAweDAwN2YsIDB4MDIzOCwgMHgyMDAxLAorCTB4YWQxYiwgMHgyMGE2LCAweDIwMDEsIDB4YWQxYywgMHgyMGE2LCAweDAwNDAsIDB4MjBhMywgMHgwMDAwLAorCTB4MjAwMSwgMHhhZDE0LCAweDIwMDQsIDB4YTA4NCwgMHgwMGZmLCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAxYywgMHgwODBjLCAweDc4MjEsIDB4MDAwNSwgMHgyMGExLAorCTB4MDIwYiwgMHgwODBjLCAweDcxMGUsIDB4MjBhMywgMHgwNTAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMDAxLAorCTB4YWQzNCwgMHgyMDA0LCAweGQwYWMsIDB4MTEzOCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LAorCTB4YTA4MiwgMHgwMDdmLCAweDAyMzgsIDB4MjAwMSwgMHhhZDFiLCAweDIwYTYsIDB4MjAwMSwgMHhhZDFjLAorCTB4MjBhNiwgMHgwMDQwLCAweDIwYTMsIDB4MDAwMCwgMHgyMDAxLCAweGFkMTQsIDB4MjAwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHgyMGEyLCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LCAweGFkMDUsIDB4NTNhNiwgMHg2MGMzLAorCTB4MDAxMCwgMHgwODBjLCAweDc4MjEsIDB4MDAwNSwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3MTBlLAorCTB4MDBjNiwgMHg3ODE4LCAweDIwNjAsIDB4MjAwMSwgMHgwMDAwLCAweDA4MGMsIDB4NTAzNywgMHgwMGNlLAorCTB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMDg2LCAweDAwN2UsIDB4MTEzMCwgMHgyMGEzLAorCTB4MDQwMCwgMHg2MjBjLCAweGMyYjQsIDB4NjIwZSwgMHgwMDEwLCAweDIwYTMsIDB4MDMwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEwODYsIDB4MDA3ZSwgMHgxOTA0LAorCTB4NmY4MywgMHgyMDAxLCAweGFkMzQsIDB4MjAwNCwgMHhkMGE0LCAweDAxYzgsIDB4MjA5OSwgMHhhZjhkLAorCTB4MzNhNiwgMHg5Mzk4LCAweDIwYTMsIDB4MDAwMCwgMHg5Mzk4LCAweDMzMDQsIDB4YTA4NCwgMHgyMDAwLAorCTB4MjBhMiwgMHg5Mzk4LCAweDMzYTYsIDB4OTM5OCwgMHgyMGEzLCAweDAwMDAsIDB4OTM5OCwgMHgyMDAxLAorCTB4MjcxMCwgMHgyMGEyLCAweDkzOTgsIDB4MzNhNiwgMHg5Mzk4LCAweDMzYTYsIDB4MDBkMCwgMHgyMDk5LAorCTB4YWY4ZCwgMHgzM2E2LCAweDkzOTgsIDB4MzNhNiwgMHg5Mzk4LCAweDMzMDQsIDB4MDgwYywgMHg1NzRmLAorCTB4MTExOCwgMHhhMDg0LCAweDM3ZmYsIDB4MDAxMCwgMHhhMDg0LCAweDNmZmYsIDB4MjBhMiwgMHg5Mzk4LAorCTB4MzNhNiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGE5LCAweDAwMDQsIDB4MjA5OSwgMHhhZDA1LCAweDUzYTYsIDB4MjBhOSwgMHgwMDA0LAorCTB4MjA5OSwgMHhhZDAxLCAweDUzYTYsIDB4MjBhOSwgMHgwMDA4LCAweDIwYTMsIDB4MDAwMCwgMHgxZjA0LAorCTB4NmY1ZCwgMHgyMGE5LCAweDAwMDgsIDB4MjBhMywgMHgwMDAwLCAweDFmMDQsIDB4NmY2MywgMHgyMDk5LAorCTB4YWY5NSwgMHgzMzA0LCAweGMwZGQsIDB4MjBhMiwgMHgyMDAxLCAweGFkNzEsIDB4MjAwNCwgMHhkMGU0LAorCTB4MDE1OCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDkzOTgsIDB4OTM5OCwgMHg5Mzk4LAorCTB4MzNhNiwgMHgyMGE5LCAweDAwMDQsIDB4MDAxMCwgMHgyMGE5LCAweDAwMDcsIDB4MjBhMywgMHgwMDAwLAorCTB4MWYwNCwgMHg2ZjdlLCAweDA0NjgsIDB4MjAwMSwgMHhhZDM0LCAweDIwMDQsIDB4ZDBhNCwgMHgwMTQwLAorCTB4MjAwMSwgMHhhZjhlLCAweDIwMDQsIDB4NjBlMywgMHgwMDAwLCAweDA4MGMsIDB4MjZjYiwgMHg2MGUyLAorCTB4MjA5OSwgMHhhZjhkLCAweDIwYTksIDB4MDAwOCwgMHg1M2E2LCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LAorCTB4YWQwNSwgMHg1M2E2LCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LCAweGFkMDEsIDB4NTNhNiwgMHgyMGE5LAorCTB4MDAwOCwgMHgyMGEzLCAweDAwMDAsIDB4MWYwNCwgMHg2ZmExLCAweDIwYTksIDB4MDAwOCwgMHgyMGEzLAorCTB4MDAwMCwgMHgxZjA0LCAweDZmYTcsIDB4MjA5OSwgMHhhZjk1LCAweDIwYTksIDB4MDAwOCwgMHg1M2E2LAorCTB4MjBhOSwgMHgwMDA4LCAweDIwYTMsIDB4MDAwMCwgMHgxZjA0LCAweDZmYjIsIDB4MjBhOSwgMHgwMDBhLAorCTB4MjBhMywgMHgwMDAwLCAweDFmMDQsIDB4NmZiOCwgMHg2MGMzLCAweDAwNzQsIDB4MDgwYywgMHg3ODIxLAorCTB4MDAwNSwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3MTBlLCAweDIwYTMsIDB4MjAxMCwgMHgyMGEzLAorCTB4MDAxNCwgMHgyMGEzLCAweDA4MDAsIDB4MjBhMywgMHgyMDAwLCAweGEwMDYsIDB4MjBhMiwgMHgyMGEyLAorCTB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MDBmNiwgMHgyMDc5LCAweGFkNTEsIDB4NzkwNCwgMHgwMGZlLAorCTB4ZDFhYywgMHgxMTEwLCAweGEwODUsIDB4MDAyMCwgMHhkMWE0LCAweDAxMTAsIDB4YTA4NSwgMHgwMDEwLAorCTB4YTA4NSwgMHgwMDAyLCAweDAwZDYsIDB4MDgwNCwgMHg3MDk5LCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAxNCwgMHgwODBjLCAweDc4MjEsIDB4MDAwNSwgMHgyMGExLAorCTB4MDIwYiwgMHgwODBjLCAweDcxMGUsIDB4MjBhMywgMHg1MDAwLCAweDA4MDQsIDB4NmYwZiwgMHgyMGExLAorCTB4MDIwYiwgMHgwODBjLCAweDcxMGUsIDB4MjBhMywgMHgyMTEwLCAweDIwYTMsIDB4MDAxNCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NzgyMSwgMHgwMDA1LAorCTB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzFhMiwgMHgwMDIwLCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLAorCTB4NzFhYSwgMHgyMGEzLCAweDAyMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHg2MGMzLCAweDAwMDQsIDB4MDgwYywgMHg3ODIxLCAweDAwMDUsIDB4MjBhMSwgMHgwMjBiLAorCTB4MDgwYywgMHg3MWFhLCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAzLAorCTB4MjBhMywgMHgyYTAwLCAweDYwYzMsIDB4MDAwOCwgMHgwODBjLCAweDc4MjEsIDB4MDAwNSwgMHgyMGExLAorCTB4MDIwYiwgMHgwODBjLCAweDcxYWEsIDB4MjBhMywgMHgwMjAwLCAweDA4MDQsIDB4NmYwZiwgMHgyMGExLAorCTB4MDIwYiwgMHgwODBjLCAweDcxYWEsIDB4MjBhMywgMHgwMTAwLCAweDIwYTMsIDB4MDAwMCwgMHg3ODI4LAorCTB4YTAwNSwgMHgwMTEwLCAweDIwYTIsIDB4MDAxMCwgMHgyMGEzLCAweDAwMDMsIDB4NzgxMCwgMHgyMGEyLAorCTB4NjBjMywgMHgwMDA4LCAweDA4MGMsIDB4NzgyMSwgMHgwMDA1LCAweDAwZDYsIDB4MjBhMSwgMHgwMjBiLAorCTB4MDgwYywgMHg3MWFhLCAweDIwYTMsIDB4MDIxMCwgMHgyMGEzLCAweDAwMTQsIDB4MjBhMywgMHgwODAwLAorCTB4NzgxOCwgMHgyMDY4LCAweDY4OTQsIDB4YTA4NiwgMHgwMDE0LCAweDExNzgsIDB4Njk5OCwgMHhhMTg0LAorCTB4YzAwMCwgMHgxMTQwLCAweGQxZWMsIDB4MDExOCwgMHgyMGEzLCAweDIxMDAsIDB4MDA0MCwgMHgyMGEzLAorCTB4MDEwMCwgMHgwMDI4LCAweDIwYTMsIDB4MDQwMCwgMHgwMDEwLCAweDIwYTMsIDB4MDcwMCwgMHhhMDA2LAorCTB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDAwZjYsIDB4MjA3OSwgMHhhZDUxLAorCTB4NzkwNCwgMHgwMGZlLCAweGQxYWMsIDB4MTExMCwgMHhhMDg1LCAweDAwMjAsIDB4ZDFhNCwgMHgwMTEwLAorCTB4YTA4NSwgMHgwMDEwLCAweDIwMDksIDB4YWQ3MywgMHgyMTBjLCAweGQxODQsIDB4MTExMCwgMHhhMDg1LAorCTB4MDAwMiwgMHgwMDI2LCAweDIwMDksIDB4YWQ3MSwgMHgyMTBjLCAweGQxZTQsIDB4MDEzMCwgMHhjMGM1LAorCTB4YTA5NCwgMHgwMDMwLCAweGEyOTYsIDB4MDAxMCwgMHgwMTQwLCAweGQxZWMsIDB4MDEzMCwgMHhhMDk0LAorCTB4MDAzMCwgMHhhMjk2LCAweDAwMTAsIDB4MDEwOCwgMHhjMGJkLCAweDAwMmUsIDB4MjBhMiwgMHgyMGEyLAorCTB4MjBhMiwgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg3ODIxLCAweDAwZGUsIDB4MDAwNSwgMHgyMGExLAorCTB4MDIwYiwgMHgwODBjLCAweDcxYWEsIDB4MjBhMywgMHgwMjEwLCAweDIwYTMsIDB4MDAxNCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NzgyMSwgMHgwMDA1LAorCTB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzFhYSwgMHgyMGEzLCAweDAyMDAsIDB4MDgwNCwgMHg2ZTgyLAorCTB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzFhYSwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAzLCAweDIwYTMsIDB4MmEwMCwgMHg2MGMzLCAweDAwMDgsIDB4MDgwYywgMHg3ODIxLAorCTB4MDAwNSwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLAorCTB4NzFhYSwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwYiwgMHgyMGEzLAorCTB4MDAwMCwgMHg2MGMzLCAweDAwMDgsIDB4MDgwYywgMHg3ODIxLCAweDAwMDUsIDB4MDAyNiwgMHgwMDM2LAorCTB4MDA0NiwgMHgyMDE5LCAweDMyMDAsIDB4MjAyMSwgMHgwODAwLCAweDAwMzgsIDB4MDAyNiwgMHgwMDM2LAorCTB4MDA0NiwgMHgyMDE5LCAweDIyMDAsIDB4MjAyMSwgMHgwMTAwLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLAorCTB4NDAwMCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDE0LCAweGEyODYsIDB4MDA3ZSwgMHgxMWEwLAorCTB4YTM4NSwgMHgwMGZmLCAweDIwYTIsIDB4MjBhMywgMHhmZmZlLCAweDIwYTMsIDB4MDAwMCwgMHgyMDExLAorCTB4YWQxNCwgMHgyMjE0LCAweDIwMDEsIDB4YWY5ZCwgMHgyMDA0LCAweGEwMDUsIDB4MDExOCwgMHgyMDExLAorCTB4YWQxYywgMHgyMjE0LCAweDIyYTIsIDB4MDRkMCwgMHhhMjg2LCAweDAwN2YsIDB4MTEzOCwgMHgwMGQ2LAorCTB4YTM4NSwgMHgwMGZmLCAweDIwYTIsIDB4MjBhMywgMHhmZmZkLCAweDAwYzgsIDB4MjAwMSwgMHhhZDM0LAorCTB4MjAwNCwgMHhkMGFjLCAweDExMTAsIDB4ZDJiYywgMHgwMWM4LCAweGEyODYsIDB4MDA4MCwgMHgwMGQ2LAorCTB4MTEzMCwgMHhhMzg1LCAweDAwZmYsIDB4MjBhMiwgMHgyMGEzLCAweGZmZmMsIDB4MDA0MCwgMHhhMmU4LAorCTB4YWUzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTMwNSwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LAorCTB4YWQxYiwgMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwMGRlLCAweDAwODAsIDB4MDBkNiwgMHhhMmU4LAorCTB4YWUzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTMwNSwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgwMGRlLAorCTB4MjBhMywgMHgwMDAwLCAweDIwMTEsIDB4YWQxNCwgMHgyMjE0LCAweDIyYTIsIDB4YTQ4NSwgMHgwMDI5LAorCTB4MjBhMiwgMHgwMDRlLCAweDAwM2UsIDB4MjBhMywgMHgwMDAwLCAweDA4MGMsIDB4NzgxMCwgMHgyMmEyLAorCTB4MjBhMywgMHgwMDAwLCAweDJmYTIsIDB4MjBhMywgMHhmZmZmLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgwMDJlLCAweDAwMDUsIDB4MDAyNiwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLAorCTB4MjBhMywgMHgwMmZmLCAweDIwMTEsIDB4ZmZmYywgMHgyMmEyLCAweDAwZDYsIDB4MjA2OSwgMHhhZDFiLAorCTB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MDBkZSwgMHgyMGEzLCAweDIwMjksIDB4MjBhMywgMHgwMDAwLAorCTB4MDhlMCwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4ZmMwMiwgMHgyMGEzLAorCTB4MDAwMCwgMHgwMDA1LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LCAweDIwMTksIDB4MzMwMCwgMHgyMDIxLAorCTB4MDgwMCwgMHgwMDM4LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LCAweDIwMTksIDB4MjMwMCwgMHgyMDIxLAorCTB4MDEwMCwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LAorCTB4MjAwNCwgMHgyMDExLCAweGFkMzQsIDB4MjIxNCwgMHhkMmFjLCAweDExMTgsIDB4YTA5MiwgMHgwMDdlLAorCTB4MDJkOCwgMHgwMGQ2LCAweGEwZTgsIDB4YWUzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTMwNSwgMHgyMGEyLAorCTB4NjgxNCwgMHgyMGEyLCAweDY4MTAsIDB4YTAwNSwgMHgxMTQwLCAweDY4MTQsIDB4YTAwNSwgMHgxMTI4LAorCTB4MjBhMywgMHgwMGZmLCAweDIwYTMsIDB4ZmZmZSwgMHgwMDI4LCAweDIwNjksIDB4YWQxYiwgMHgyZGE2LAorCTB4OGQ2OCwgMHgyZGE2LCAweDAwZGUsIDB4MDA4MCwgMHgwMGQ2LCAweGEwZTgsIDB4YWUzNCwgMHgyZDZjLAorCTB4NjgxMCwgMHhhMzA1LCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDAwZGUsIDB4MjBhMywgMHgwMDAwLAorCTB4MjAxMSwgMHhhZDE0LCAweDIyMTQsIDB4MjJhMiwgMHhhNDg1LCAweDAwOTgsIDB4MjBhMiwgMHgyMGEzLAorCTB4MDAwMCwgMHgwMDRlLCAweDAwM2UsIDB4MDgwYywgMHg3ODEwLCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4N2EwOCwgMHgyMmEyLCAweDJmYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgwMDJlLAorCTB4MDAwNSwgMHgwODBjLCAweDc4MTAsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsIDB4N2EwOCwgMHgyMmEyLAorCTB4NzgxMCwgMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MDAyZSwgMHgwMDA1LAorCTB4MDBjNiwgMHgwMGY2LCAweDYwMDQsIDB4YTA4YSwgMHgwMDg1LCAweDBhMGMsIDB4MTRmNiwgMHhhMDhhLAorCTB4MDA4YywgMHgxYTBjLCAweDE0ZjYsIDB4NjExOCwgMHgyMTc4LCAweDc5YTAsIDB4MjAxMSwgMHhhZDM0LAorCTB4MjIxNCwgMHhkMmFjLCAweDExMTAsIDB4ZDFiYywgMHgwMTUwLCAweDc5MDAsIDB4ZDFmNCwgMHgwMTIwLAorCTB4NzkxNCwgMHhhMThjLCAweDAwZmYsIDB4MDA0MCwgMHgyMDA5LCAweDAwMDAsIDB4MDAyOCwgMHhhMWY4LAorCTB4MmJlNiwgMHgyZjBkLCAweGExOGMsIDB4MDBmZiwgMHgyYzc4LCAweDIwNjEsIDB4MDEwMCwgMHg2MTlhLAorCTB4YTA4MiwgMHgwMDg1LCAweDAwMWIsIDB4MDBmZSwgMHgwMGNlLCAweDAwMDUsIDB4NzI0NywgMHg3MjUxLAorCTB4NzI2YywgMHg3MjQ1LCAweDcyNDUsIDB4NzI0NSwgMHg3MjQ3LCAweDA4MGMsIDB4MTRmNiwgMHgwMTQ2LAorCTB4MjBhMSwgMHgwMjBiLCAweDA0YTEsIDB4NjBjMywgMHgwMDAwLCAweDA4MGMsIDB4NzgyMSwgMHgwMTRlLAorCTB4MDAwNSwgMHgwMTQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDcyYjgsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAwLCAweDc4MDgsIDB4MjBhMiwgMHg3ODEwLCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHhmZmZmLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDBjLAorCTB4MDgwYywgMHg3ODIxLCAweDAxNGUsIDB4MDAwNSwgMHgwMTQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLAorCTB4NzJmMiwgMHgyMGEzLCAweDAwMDMsIDB4MjBhMywgMHgwMzAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHg2MGMzLCAweDAwMDQsIDB4MDgwYywgMHg3ODIxLCAweDAxNGUsIDB4MDAwNSwgMHgwMDI2LAorCTB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LAorCTB4MjAxMSwgMHhhZDM0LCAweDIyMTQsIDB4ZDJhYywgMHgxMTE4LCAweGEwOTIsIDB4MDA3ZSwgMHgwMjg4LAorCTB4MDBkNiwgMHhhMGU4LCAweGFlMzQsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4ODEwMCwgMHgyMGEyLAorCTB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YWQxYiwgMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwMGRlLAorCTB4MDA4OCwgMHgwMGQ2LCAweGEwZTgsIDB4YWUzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHg4MTAwLAorCTB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MDBkZSwgMHgyMGEzLCAweDAwMDAsIDB4MjAxMSwgMHhhZDE0LAorCTB4MjIxNCwgMHgyMmEyLCAweDIwYTMsIDB4MDAwOSwgMHgyMGEzLCAweDAwMDAsIDB4MDgwNCwgMHg3MTc1LAorCTB4MDAyNiwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LAorCTB4MjAwNCwgMHgyMDExLCAweGFkMzQsIDB4MjIxNCwgMHhkMmFjLCAweDExMTgsIDB4YTA5MiwgMHgwMDdlLAorCTB4MDI4OCwgMHgwMGQ2LCAweGEwZTgsIDB4YWUzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHg4NDAwLAorCTB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MjA2OSwgMHhhZDFiLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LAorCTB4MDBkZSwgMHgwMDg4LCAweDAwZDYsIDB4YTBlOCwgMHhhZTM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LAorCTB4ODQwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgwMGRlLCAweDIwYTMsIDB4MDAwMCwgMHgyMDExLAorCTB4YWQxNCwgMHgyMjE0LCAweDIyYTIsIDB4MjAwMSwgMHgwMDk5LCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4MDgwNCwgMHg3MjAxLCAweDAwMjYsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LAorCTB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4MjAxMSwgMHhhZDM0LCAweDIyMTQsIDB4ZDJhYywgMHgxMTE4LAorCTB4YTA5MiwgMHgwMDdlLCAweDAyODgsIDB4MDBkNiwgMHhhMGU4LCAweGFlMzQsIDB4MmQ2YywgMHg2ODEwLAorCTB4YTA4NSwgMHg4NTAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YWQxYiwgMHgyZGE2LAorCTB4OGQ2OCwgMHgyZGE2LCAweDAwZGUsIDB4MDA4OCwgMHgwMGQ2LCAweGEwZTgsIDB4YWUzNCwgMHgyZDZjLAorCTB4NjgxMCwgMHhhMDg1LCAweDg1MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MDBkZSwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMDExLCAweGFkMTQsIDB4MjIxNCwgMHgyMmEyLCAweDIwMDEsIDB4MDA5OSwgMHgyMGEyLAorCTB4MjBhMywgMHgwMDAwLCAweDA4MDQsIDB4NzIwMSwgMHgwMGM2LCAweDAwZjYsIDB4MmM3OCwgMHg3ODA0LAorCTB4YTA4YSwgMHgwMDQwLCAweDBhMGMsIDB4MTRmNiwgMHhhMDhhLCAweDAwNTMsIDB4MWEwYywgMHgxNGY2LAorCTB4NzkxOCwgMHgyMTYwLCAweDYxYTAsIDB4MjAxMSwgMHhhZDM0LCAweDIyMTQsIDB4ZDJhYywgMHgxMTEwLAorCTB4ZDFiYywgMHgwMTUwLCAweDYxMDAsIDB4ZDFmNCwgMHgwMTIwLCAweDYxMTQsIDB4YTE4YywgMHgwMGZmLAorCTB4MDA0MCwgMHgyMDA5LCAweDAwMDAsIDB4MDAyOCwgMHhhMWUwLCAweDJiZTYsIDB4MmMwZCwgMHhhMThjLAorCTB4MDBmZiwgMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwgMHhhMDgyLCAweDAwNDAsIDB4MDAxYiwgMHgwMGZlLAorCTB4MDBjZSwgMHgwMDA1LCAweDczNmYsIDB4NzQ3YiwgMHg3NDE4LCAweDc2MWEsIDB4NzM2ZCwgMHg3MzZkLAorCTB4NzM2ZCwgMHg3MzZkLCAweDczNmQsIDB4NzM2ZCwgMHg3MzZkLCAweDdiNDEsIDB4N2I1MSwgMHg3YjYxLAorCTB4N2I3MSwgMHg3MzZkLCAweDdmNzksIDB4NzM2ZCwgMHg3YjMwLCAweDA4MGMsIDB4MTRmNiwgMHgwMGQ2LAorCTB4MDE1NiwgMHgwMTQ2LCAweDc4MGIsIDB4ZmZmZiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3M2NmLAorCTB4NzkxMCwgMHgyMTY4LCAweDY5NDgsIDB4Nzk1MiwgMHgyMWEyLCAweGEwMTYsIDB4MjJhMiwgMHgyMmEyLAorCTB4MjJhMiwgMHg2OTRjLCAweGExODQsIDB4MDAwZiwgMHgxMTE4LCAweDIwMDEsIDB4MDAwNSwgMHgwMDQwLAorCTB4ZDE4NCwgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDE4LCAweGEwODQsIDB4MDAwNiwgMHg4MDA0LAorCTB4MDAxNiwgMHgyMDA4LCAweDc4NTgsIDB4YTA4NCwgMHgwMGZmLCAweDgwMDcsIDB4YTEwNSwgMHgwMDFlLAorCTB4MjBhMiwgMHhkMWFjLCAweDAxMTgsIDB4MjBhMywgMHgwMDAyLCAweDAwNDgsIDB4ZDFiNCwgMHgwMTE4LAorCTB4MjBhMywgMHgwMDAxLCAweDAwMjAsIDB4MjBhMywgMHgwMDAwLCAweDIyMzAsIDB4MDAxMCwgMHg2YTgwLAorCTB4NmU3YywgMHgyMGE5LCAweDAwMDgsIDB4MDEzNiwgMHhhZDg4LCAweDAwMTcsIDB4MjE5OCwgMHgyMGExLAorCTB4MDIxYiwgMHg1M2E2LCAweDAxM2UsIDB4MjBhMSwgMHgwMjBiLCAweDIyYTIsIDB4MjZhMiwgMHg2MGMzLAorCTB4MDAyMCwgMHgyMGUxLCAweDkwODAsIDB4NjAxNCwgMHhhMDg0LCAweDAwMDQsIDB4YTA4NSwgMHgwMDA5LAorCTB4NjAxNiwgMHgyMDAxLCAweGFmZTMsIDB4MjAwMywgMHgwN2QwLCAweDIwMDEsIDB4YWZlMiwgMHgyMDAzLAorCTB4MDAwOSwgMHgwODBjLCAweDE3YmYsIDB4MDE0ZSwgMHgwMTVlLCAweDAwZGUsIDB4MDAwNSwgMHgyMGUxLAorCTB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4N2ExOCwgMHhhMjgwLCAweDAwMjMsIDB4MjAxNCwgMHg4MjEwLAorCTB4YTI5NCwgMHgwMGZmLCAweDIyMDIsIDB4ODIxNywgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LAorCTB4MjAxOSwgMHhhZDM0LCAweDIzMWMsIDB4ZDNhYywgMHgxMTEwLCAweGQwYmMsIDB4MDE4OCwgMHgwMGQ2LAorCTB4YTBlOCwgMHhhZTM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDA2MDAsIDB4MjBhMiwgMHg2ODE0LAorCTB4MjBhMiwgMHgyMDY5LCAweGFkMWIsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MDBkZSwgMHgwMDg4LAorCTB4MDBkNiwgMHhhMGU4LCAweGFlMzQsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDYwMCwgMHgyMGEyLAorCTB4NjgxNCwgMHgyMGEyLCAweDAwZGUsIDB4MjBhMywgMHgwMDAwLCAweDIwMDksIDB4YWQxNCwgMHgyMTBjLAorCTB4MjFhMiwgMHgyMGEzLCAweDA4MjksIDB4MjBhMywgMHgwMDAwLCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4MmZhMiwgMHgyMGEzLCAweGZmZmYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgwMDA1LAorCTB4MDBkNiwgMHgwMTU2LCAweDAxMzYsIDB4MDE0NiwgMHgyMGExLCAweDAyMGIsIDB4MDBjMSwgMHg3ODEwLAorCTB4MjA2OCwgMHg2ODYwLCAweDIwYTIsIDB4Njg1YywgMHgyMGEyLCAweDY4ODAsIDB4MjBhMiwgMHg2ODdjLAorCTB4MjBhMiwgMHhhMDA2LCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4NjBjMywgMHgwMDBjLAorCTB4MDgwYywgMHg3ODIxLCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLCAweDAwZGUsIDB4MDAwNSwgMHgwMDI2LAorCTB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LAorCTB4MjAxMSwgMHhhZDM0LCAweDIyMTQsIDB4ZDJhYywgMHgxMTEwLCAweGQwYmMsIDB4MDE4OCwgMHgwMGQ2LAorCTB4YTBlOCwgMHhhZTM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDA1MDAsIDB4MjBhMiwgMHg2ODE0LAorCTB4MjBhMiwgMHgyMDY5LCAweGFkMWIsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MDBkZSwgMHgwMDg4LAorCTB4MDBkNiwgMHhhMGU4LCAweGFlMzQsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDUwMCwgMHgyMGEyLAorCTB4NjgxNCwgMHgyMGEyLCAweDAwZGUsIDB4MjBhMywgMHgwMDAwLCAweDIwMTEsIDB4YWQxNCwgMHgyMjE0LAorCTB4MjJhMiwgMHgyMGEzLCAweDA4ODksIDB4MjBhMywgMHgwMDAwLCAweDA4MGMsIDB4NzgxMCwgMHgyMmEyLAorCTB4MjBhMywgMHgwMDAwLCAweDdhMDgsIDB4MjJhMiwgMHgyZmEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgwMDJlLCAweDAwMDUsIDB4MDBkNiwgMHgwMTU2LCAweDAxMzYsIDB4MDE0NiwgMHg3ODEwLAorCTB4YTA2ZCwgMHgwODBjLCAweDUwMjUsIDB4MDE0OCwgMHg2ODRjLCAweGEwODQsIDB4MjAyMCwgMHhhMDg2LAorCTB4MjAyMCwgMHgxMTE4LCAweDc4MjAsIDB4YzBjZCwgMHg3ODIyLCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLAorCTB4NzVkMCwgMHhhMDE2LCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHg3ODEwLAorCTB4YTA4NCwgMHhmMDAwLCAweDExMzAsIDB4NzgxMCwgMHhhMDg0LCAweDA3MDAsIDB4ODAwNywgMHgwMDQzLAorCTB4MDAxMCwgMHhhMDA2LCAweDAwMmIsIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsIDB4MDBkZSwgMHgwMDA1LAorCTB4NzRiMiwgMHg3NTQ3LCAweDc1NTAsIDB4NzU3OSwgMHg3NThjLCAweDc1YTcsIDB4NzViMCwgMHg3NGIwLAorCTB4MDgwYywgMHgxNGY2LCAweDAwMTYsIDB4MDAzNiwgMHg2OTRjLCAweGExOGMsIDB4MDAwMywgMHgwMTE4LAorCTB4YTE4NiwgMHgwMDAzLCAweDExNzAsIDB4NmI3OCwgMHg3ODIwLCAweGQwY2MsIDB4MDEwOCwgMHhjM2U1LAorCTB4MjNhMiwgMHg2ODY4LCAweDIwYTIsIDB4Njg2NCwgMHgyMGEyLCAweDAwM2UsIDB4MDAxZSwgMHgwODA0LAorCTB4NzU4MywgMHhhMTg2LCAweDAwMDEsIDB4MTkwYywgMHgxNGY2LCAweDZiNzgsIDB4NzgyMCwgMHhkMGNjLAorCTB4MDEwOCwgMHhjM2U1LCAweDIzYTIsIDB4Njg2OCwgMHgyMGEyLCAweDY4NjQsIDB4MjBhMiwgMHgyMmEyLAorCTB4Njg3NCwgMHgyMGEyLCAweDIyYTIsIDB4Njg3YywgMHgyMGEyLCAweDIwMDksIDB4MDAxOCwgMHhhMzg0LAorCTB4MDMwMCwgMHgwOTA0LCAweDc1NDEsIDB4ZDNjNCwgMHgwMTEwLCAweDY4N2MsIDB4YTEwOCwgMHhkM2NjLAorCTB4MDExMCwgMHg2ODc0LCAweGExMDgsIDB4MDE1NiwgMHgyMGE5LCAweDAwMGQsIDB4YWQ4MCwgMHgwMDIwLAorCTB4MjAxYywgMHg4MzFmLCAweDIzYTIsIDB4ODAwMCwgMHgxZjA0LCAweDc0ZjAsIDB4MDE1ZSwgMHgyMmEyLAorCTB4MjJhMiwgMHgyMmEyLCAweGExODQsIDB4MDAwMywgMHgwOTA0LCAweDc1NDEsIDB4MjBhMSwgMHgwMjBiLAorCTB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgwMDA2LCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LAorCTB4MjAwNCwgMHgyMDExLCAweGFkMzQsIDB4MjIxNCwgMHhkMmFjLCAweDExMTAsIDB4ZDBiYywgMHgwMTg4LAorCTB4MDBkNiwgMHhhMGU4LCAweGFlMzQsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDcwMCwgMHgyMGEyLAorCTB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YWQxYiwgMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwMGRlLAorCTB4MDA4OCwgMHgwMGQ2LCAweGEwZTgsIDB4YWUzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwNzAwLAorCTB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MDBkZSwgMHgyMGEzLCAweDAwMDAsIDB4MjAxMSwgMHhhZDE0LAorCTB4MjIxNCwgMHgyMmEyLCAweDAwMGUsIDB4N2IyMCwgMHhkM2NjLCAweDAxMTgsIDB4MjBhMywgMHgwODg5LAorCTB4MDAxMCwgMHgyMGEzLCAweDA4OTgsIDB4MjBhMiwgMHgwODBjLCAweDc4MTAsIDB4MjJhMiwgMHgyMGEzLAorCTB4MDAwMCwgMHg2MWMyLCAweDAwM2UsIDB4MDAxZSwgMHgwODBjLCAweDc4MjEsIDB4MDAwNSwgMHgyMDExLAorCTB4MDAwOCwgMHg3ODIwLCAweGQwY2MsIDB4MDEwOCwgMHhjMmU1LCAweDIyYTIsIDB4YTAxNiwgMHgwNDg4LAorCTB4MjAxMSwgMHgwMzAyLCAweDc4MjAsIDB4ZDBjYywgMHgwMTA4LCAweGMyZTUsIDB4MjJhMiwgMHhhMDE2LAorCTB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjBhMywgMHgwMDEyLCAweDIyYTIsIDB4MjBhMywgMHgwMDA4LAorCTB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMGEzLCAweDcwMDAsIDB4MjBhMywgMHgwNTAwLAorCTB4MjJhMiwgMHgyMGEzLCAweDAwMGEsIDB4MjJhMiwgMHgyMmEyLCAweDIwYTMsIDB4MjUwMCwgMHgyMmEyLAorCTB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHg2MGMzLCAweDAwMzIsIDB4MDgwYywgMHg3ODIxLAorCTB4MDAwNSwgMHgyMDExLCAweDAwMjgsIDB4NzgyMCwgMHhkMGNjLCAweDAxMDgsIDB4YzJlNSwgMHgyMmEyLAorCTB4YTAxNiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHg2MGMzLAorCTB4MDAxOCwgMHgwODBjLCAweDc4MjEsIDB4MDAwNSwgMHgyMDExLCAweDAxMDAsIDB4NzgyMCwgMHhkMGNjLAorCTB4MDEwOCwgMHhjMmU1LCAweDIyYTIsIDB4YTAxNiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLAorCTB4MjJhMiwgMHgyMGEzLCAweDAwMDgsIDB4MjJhMiwgMHg3ODU0LCAweGEwODQsIDB4MDBmZiwgMHgyMGEyLAorCTB4MjJhMiwgMHgyMmEyLCAweDYwYzMsIDB4MDAyMCwgMHgwODBjLCAweDc4MjEsIDB4MDAwNSwgMHgyMDExLAorCTB4MDAwOCwgMHg3ODIwLCAweGQwY2MsIDB4MDEwOCwgMHhjMmU1LCAweDIyYTIsIDB4YTAxNiwgMHgwODg4LAorCTB4MDAzNiwgMHg3YjEwLCAweGEzODQsIDB4ZmYwMCwgMHg3ODEyLCAweGEzODQsIDB4MDBmZiwgMHg4MDAxLAorCTB4MTEzOCwgMHg3ODIwLCAweGQwY2MsIDB4MDEwOCwgMHhjMmU1LCAweDIyYTIsIDB4MDAzZSwgMHgwODA4LAorCTB4MDA0NiwgMHgyMDIxLCAweDA4MDAsIDB4MDAwNiwgMHg3ODIwLCAweGQwY2MsIDB4MDAwZSwgMHgwMTA4LAorCTB4YzRlNSwgMHgyNGEyLCAweDAwNGUsIDB4MjJhMiwgMHgyMGEyLCAweDAwM2UsIDB4MDgwNCwgMHg3NTgzLAorCTB4MDAyNiwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LAorCTB4MjAwNCwgMHgyMDExLCAweGFkMzQsIDB4MjIxNCwgMHhkMmFjLCAweDExMTAsIDB4ZDBiYywgMHgwMTg4LAorCTB4MDBkNiwgMHhhMGU4LCAweGFlMzQsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDcwMCwgMHgyMGEyLAorCTB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YWQxYiwgMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwMGRlLAorCTB4MDA4OCwgMHgwMGQ2LCAweGEwZTgsIDB4YWUzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwNzAwLAorCTB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MDBkZSwgMHgyMGEzLCAweDAwMDAsIDB4MjAxMSwgMHhhZDE0LAorCTB4MjIxNCwgMHgyMmEyLCAweDc4MjAsIDB4ZDBjYywgMHgwMTE4LCAweDIwYTMsIDB4MDg4OSwgMHgwMDEwLAorCTB4MjBhMywgMHgwODk4LCAweDIwYTMsIDB4MDAwMCwgMHgwODBjLCAweDc4MTAsIDB4MjJhMiwgMHgyMGEzLAorCTB4MDAwMCwgMHg3YTA4LCAweDIyYTIsIDB4MmZhMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4MDAyZSwgMHgwMDA1LCAweDAwZDYsIDB4MDE1NiwgMHgwMTM2LCAweDAxNDYsIDB4MDAxNiwgMHgwMDM2LAorCTB4NzgxMCwgMHhhMDg0LCAweDA3MDAsIDB4ODAwNywgMHgwMDNiLCAweDAwM2UsIDB4MDAxZSwgMHgwMTRlLAorCTB4MDEzZSwgMHgwMTVlLCAweDAwZGUsIDB4MDAwNSwgMHg3NjM0LCAweDc2MzQsIDB4NzYzNiwgMHg3NjM0LAorCTB4NzYzNCwgMHg3NjM0LCAweDc2NTgsIDB4NzYzNCwgMHgwODBjLCAweDE0ZjYsIDB4NzkxMCwgMHhhMThjLAorCTB4ZjhmZiwgMHhhMThkLCAweDA2MDAsIDB4NzkxMiwgMHgyMGExLCAweDAyMGIsIDB4MjAwOSwgMHgwMDAzLAorCTB4MDBmOSwgMHgwMGQ2LCAweDIwNjksIDB4YWQ1MSwgMHg2ODA0LCAweGQwYmMsIDB4MDEzMCwgMHg2ODJjLAorCTB4YTA4NCwgMHgwMGZmLCAweDgwMDcsIDB4MjBhMiwgMHgwMDEwLCAweDIwYTMsIDB4M2YwMCwgMHgwMGRlLAorCTB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4NjBjMywgMHgwMDAxLCAweDA4MGMsIDB4NzgyMSwgMHgwMDA1LAorCTB4MjBhMSwgMHgwMjBiLCAweDIwMDksIDB4MDAwMywgMHgwMDE5LCAweDIwYTMsIDB4N2YwMCwgMHgwYzgwLAorCTB4MDAyNiwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LAorCTB4MjAwNCwgMHgyMDExLCAweGFkMzQsIDB4MjIxNCwgMHhkMmFjLCAweDExMTAsIDB4ZDBiYywgMHgwMTg4LAorCTB4MDBkNiwgMHhhMGU4LCAweGFlMzQsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDEwMCwgMHgyMGEyLAorCTB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YWQxYiwgMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwMGRlLAorCTB4MDA4OCwgMHgwMGQ2LCAweGEwZTgsIDB4YWUzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwMTAwLAorCTB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MDBkZSwgMHgyMGEzLCAweDAwMDAsIDB4MjAxMSwgMHhhZDE0LAorCTB4MjIxNCwgMHgyMmEyLCAweDIwYTMsIDB4MDg4OCwgMHhhMThkLCAweDAwMDgsIDB4MjFhMiwgMHgwODBjLAorCTB4NzgxMCwgMHgyMmEyLCAweDIwYTMsIDB4MDAwMCwgMHg3YTA4LCAweDIyYTIsIDB4MmZhMiwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MDAyZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LAorCTB4MDA1NiwgMHgwMDQ2LCAweDAwMzYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNzEsIDB4YWQwMCwgMHg3MTUwLAorCTB4NzgxOCwgMHgyMDY4LCAweDY4YTAsIDB4MjAyOCwgMHg3NmQwLCAweGQ2YWMsIDB4MTEzMCwgMHhkMGJjLAorCTB4MTEyMCwgMHg2OTEwLCAweDZhMTQsIDB4NzQ1MCwgMHgwMDIwLCAweDY5MTAsIDB4NmExNCwgMHg3MzZjLAorCTB4NzQ3MCwgMHg3ODFjLCAweGEwYmUsIDB4MDAwNiwgMHgwOTA0LCAweDc3NWIsIDB4YTBiZSwgMHgwMDBhLAorCTB4MTVlOCwgMHhhMTg1LCAweDAyMDAsIDB4NjA2MiwgMHg2MjY2LCAweDYzNmEsIDB4NjQ2ZSwgMHg2MDczLAorCTB4MjAyOSwgMHg2MDc3LCAweDAwMDAsIDB4Njg4YywgMHg4MDAwLCAweGEwODQsIDB4MDBmZiwgMHg2ODhlLAorCTB4ODAwNywgMHg2MDdhLCAweDYwN2YsIDB4MDAwMCwgMHgyZjAwLCAweDYwODIsIDB4NzgwOCwgMHg2MDg2LAorCTB4NzgxMCwgMHgyMDcwLCAweDcwMTQsIDB4NjA4YSwgMHg3MDEwLCAweDYwOGUsIDB4NzAwYywgMHg2MGM2LAorCTB4NzAwOCwgMHg2MGNhLCAweDY4NmMsIDB4NjBjZSwgMHg2MGFmLCAweDk1ZDUsIDB4NjBkNywgMHgwMDAwLAorCTB4NjA5ZiwgMHgwMDAwLCAweDA4MGMsIDB4ODAxNCwgMHgyMDA5LCAweDA3ZDAsIDB4NjBjNCwgMHhhMDg0LAorCTB4ZmZmMCwgMHhhMDA1LCAweDAxMTAsIDB4MjAwOSwgMHgxYjU4LCAweDA4MGMsIDB4NjU4NiwgMHgwMDNlLAorCTB4MDA0ZSwgMHgwMDVlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwMDUsIDB4NzBkMCwgMHhkMGFjLAorCTB4MTExMCwgMHhkNWJjLCAweDAxMzgsIDB4YTE4NSwgMHgwMTAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MzZhLAorCTB4NjQ2ZSwgMHgwMDM4LCAweGExODUsIDB4MDEwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjA2YiwgMHgwMDAwLAorCTB4NjQ2ZSwgMHg2MDczLCAweDA4MDksIDB4NjA3NywgMHgwMDA4LCAweDY4OGMsIDB4ODAwMCwgMHhhMDg0LAorCTB4MDBmZiwgMHg2ODhlLCAweDgwMDcsIDB4NjA3YSwgMHg2MDdmLCAweDAwMDAsIDB4MmYwMCwgMHg2MDgyLAorCTB4NzgwOCwgMHg2MDg2LCAweDc4MTAsIDB4MjA3MCwgMHg3MDE0LCAweDYwOGEsIDB4NzAxMCwgMHg2MDhlLAorCTB4NzAwYywgMHg2MGM2LCAweDcwMDgsIDB4NjBjYSwgMHg2ODZjLCAweDYwY2UsIDB4NjBhZiwgMHg5NWQ1LAorCTB4NjBkNywgMHgwMDAwLCAweGE1ODIsIDB4MDA4MCwgMHgwMjQ4LCAweDZhMDAsIDB4ZDJmNCwgMHgwMTIwLAorCTB4NmExNCwgMHhhMjk0LCAweDAwZmYsIDB4MDAxMCwgMHgyMDExLCAweDAwMDAsIDB4NjI5ZSwgMHgwODBjLAorCTB4ODAxNCwgMHgyMDA5LCAweDA3ZDAsIDB4NjBjNCwgMHhhMDg0LCAweGZmZjAsIDB4YTAwNSwgMHgwMTEwLAorCTB4MjAwOSwgMHgxYjU4LCAweDA4MGMsIDB4NjU4NiwgMHgwMDNlLCAweDAwNGUsIDB4MDA1ZSwgMHgwMGNlLAorCTB4MDBkZSwgMHgwMGVlLCAweDAwMDUsIDB4NzgxMCwgMHgyMDcwLCAweDcwNGMsIDB4YTA4NCwgMHgwMDAzLAorCTB4YTA4NiwgMHgwMDAyLCAweDA5MDQsIDB4NzdiMSwgMHgyMDAxLCAweGFkMzQsIDB4MjAwNCwgMHhkMGFjLAorCTB4MTExMCwgMHhkNWJjLCAweDAxMzgsIDB4YTE4NSwgMHgwMTAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MzZhLAorCTB4NjQ2ZSwgMHgwMDM4LCAweGExODUsIDB4MDEwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjA2YiwgMHgwMDAwLAorCTB4NjQ2ZSwgMHg2MDczLCAweDA4ODAsIDB4NjA3NywgMHgwMDA4LCAweDY4OGMsIDB4ODAwMCwgMHhhMDg0LAorCTB4MDBmZiwgMHg2ODhlLCAweDgwMDcsIDB4NjA3YSwgMHg3ODM0LCAweDYwN2UsIDB4MmYwMCwgMHg2MDg2LAorCTB4NzgwOCwgMHg2MDgyLCAweDcwNjAsIDB4NjA4YSwgMHg3MDVjLCAweDYwOGUsIDB4NzA4MCwgMHg2MGM2LAorCTB4NzA3YywgMHg2MGNhLCAweDcwN2MsIDB4NzkyYywgMHhhMTA4LCAweDc5MmUsIDB4NzA4MCwgMHg3OTI4LAorCTB4YTEwOSwgMHg3OTJhLCAweDY4NmMsIDB4NjBjZSwgMHg2MGFmLCAweDk1ZDUsIDB4NjBkNywgMHgwMDAwLAorCTB4YTU4MiwgMHgwMDgwLCAweDAyNDgsIDB4NmEwMCwgMHhkMmY0LCAweDAxMjAsIDB4NmExNCwgMHhhMjk0LAorCTB4MDBmZiwgMHgwMDEwLCAweDIwMTEsIDB4MDAwMCwgMHg2MjllLCAweDA4MGMsIDB4ODAxMSwgMHgwODA0LAorCTB4Nzc0OSwgMHgyMDAxLCAweGFkMzQsIDB4MjAwNCwgMHhkMGFjLCAweDExMTAsIDB4ZDViYywgMHgwMTM4LAorCTB4YTE4NSwgMHgwNzAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MzZhLCAweDY0NmUsIDB4MDAzOCwgMHhhMTg1LAorCTB4MDcwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjA2YiwgMHgwMDAwLCAweDY0NmUsIDB4MDgwYywgMHg1MDI1LAorCTB4MDE4MCwgMHgwMGQ2LCAweDc4MTAsIDB4YTA2ZCwgMHg2ODRjLCAweDAwZGUsIDB4YTA4NCwgMHgyMDIwLAorCTB4YTA4NiwgMHgyMDIwLCAweDExMzAsIDB4NzgyMCwgMHhjMGNkLCAweDc4MjIsIDB4NjA3MywgMHgwODg5LAorCTB4MDAxMCwgMHg2MDczLCAweDA4OTgsIDB4NjA3NywgMHgwMDAwLCAweDY4OGMsIDB4ODAwMCwgMHhhMDg0LAorCTB4MDBmZiwgMHg2ODhlLCAweDgwMDcsIDB4NjA3YSwgMHg2MDdmLCAweDAwMDAsIDB4MmYwMCwgMHg2MDg2LAorCTB4NzgwOCwgMHg2MDgyLCAweDcwMTQsIDB4NjA4YSwgMHg3MDEwLCAweDYwOGUsIDB4NzAwYywgMHg2MGM2LAorCTB4NzAwOCwgMHg2MGNhLCAweDY4NmMsIDB4NjBjZSwgMHg2MGFmLCAweDk1ZDUsIDB4NjBkNywgMHgwMDAwLAorCTB4YTU4MiwgMHgwMDgwLCAweDAyNDgsIDB4NmEwMCwgMHhkMmY0LCAweDAxMjAsIDB4NmExNCwgMHhhMjk0LAorCTB4MDBmZiwgMHgwMDEwLCAweDIwMTEsIDB4MDAwMCwgMHg2MjllLCAweDc4MjAsIDB4ZDBjYywgMHgwMTIwLAorCTB4MDgwYywgMHg4MDE0LCAweDA4MDQsIDB4Nzc0OSwgMHgwODBjLCAweDgwMTEsIDB4MDgwNCwgMHg3NzQ5LAorCTB4N2ExOCwgMHhhMjgwLCAweDAwMjMsIDB4MjAxNCwgMHg4MjEwLCAweGEyOTQsIDB4MDBmZiwgMHgyMjAyLAorCTB4ODIxNywgMHgwMDA1LCAweDAwZDYsIDB4MjA2OSwgMHhhZmM3LCAweDY4NDMsIDB4MDAwMSwgMHgwMGRlLAorCTB4MDAwNSwgMHgyMGUxLCAweDkwODAsIDB4NjBhMywgMHgwMDU2LCAweDYwYTcsIDB4OTU3NSwgMHgwMDE5LAorCTB4MDgwYywgMHg2NTc4LCAweDAwMDUsIDB4MDAwNiwgMHg2MDE0LCAweGEwODQsIDB4MDAwNCwgMHhhMDg1LAorCTB4MDAwOSwgMHg2MDE2LCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLAorCTB4NjAxNCwgMHhhMDg0LCAweDAwMDQsIDB4YTA4NSwgMHgwMDA4LCAweDYwMTYsIDB4MDBjZSwgMHgwMDBlLAorCTB4MDAwNSwgMHgwMGM2LCAweDAwZDYsIDB4MDAxNiwgMHgwMDI2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LAorCTB4MDE0MCwgMHgwODBjLCAweDU3NGYsIDB4MTE3OCwgMHgyMDAxLCAweGFmZTMsIDB4MjAwNCwgMHhhMDA1LAorCTB4MTU5OCwgMHgwODBjLCAweDU3ZDEsIDB4MTExOCwgMHgwODBjLCAweDY1NzgsIDB4MDQ2OCwgMHgwMGM2LAorCTB4MjA2MSwgMHhhZmM3LCAweDAwZDgsIDB4NjkwNCwgMHhhMTk0LCAweDQwMDAsIDB4MDU1MCwgMHgwOGExLAorCTB4NjgwMywgMHgxMDAwLCAweDY4MDMsIDB4MDAwMCwgMHgwMGM2LCAweDIwNjEsIDB4YWZjNywgMHg2MTI4LAorCTB4YTE5MiwgMHgwMGM4LCAweDEyNTgsIDB4ODEwOCwgMHg2MTJhLCAweDYxMjQsIDB4MDBjZSwgMHg4MWZmLAorCTB4MDE5OCwgMHgwODBjLCAweDY1NzgsIDB4MDgwYywgMHg3ODJiLCAweDAwNzAsIDB4NjEyNCwgMHhhMWU1LAorCTB4MDAwMCwgMHgwMTQwLCAweDA4MGMsIDB4YWNhMiwgMHgyMDA5LCAweDAwMTQsIDB4MDgwYywgMHg4MGE3LAorCTB4MDgwYywgMHg2NTgxLCAweDAwY2UsIDB4MDAwMCwgMHgwMDJlLCAweDAwMWUsIDB4MDBkZSwgMHgwMGNlLAorCTB4MDAwNSwgMHgyMDAxLCAweGFmZTMsIDB4MjAwNCwgMHhhMDA1LCAweDFkYjAsIDB4MDBjNiwgMHgyMDYxLAorCTB4YWZjNywgMHg2MTI4LCAweGExOTIsIDB4MDAwMywgMHgxZTA4LCAweDgxMDgsIDB4NjEyYSwgMHgwMGNlLAorCTB4MDgwYywgMHg2NTc4LCAweDA4MGMsIDB4NDg1ZSwgMHgwYzM4LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LAorCTB4MDAxNiwgMHgwMDI2LCAweDA4MGMsIDB4NjU4ZSwgMHgyMDcxLCAweGFmYzcsIDB4NzEzYywgMHg4MWZmLAorCTB4MDU3MCwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLCAweDA4MGMsIDB4NTc0ZiwgMHgxMTg4LAorCTB4MDAzNiwgMHgyMDE5LCAweDAwMDEsIDB4MDgwYywgMHg3YTY0LCAweDAwM2UsIDB4NzEzYywgMHgyMTYwLAorCTB4MDgwYywgMHhhY2EyLCAweDIwMDksIDB4MDA0YSwgMHgwODBjLCAweDgwYTcsIDB4MDgwYywgMHg1N2QxLAorCTB4MDBiMCwgMHg2OTA0LCAweGExOTQsIDB4NDAwMCwgMHgwMWMwLCAweDY4MDMsIDB4MTAwMCwgMHg2ODAzLAorCTB4MDAwMCwgMHgwMDM2LCAweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweDdhNjQsIDB4MDAzZSwgMHg3MTNjLAorCTB4MjE2MCwgMHgwODBjLCAweGFjYTIsIDB4MjAwOSwgMHgwMDRhLCAweDA4MGMsIDB4ODBhNywgMHgwMDJlLAorCTB4MDAxZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDBjNTgsIDB4MDBlNiwgMHgwMGQ2LAorCTB4MDBjNiwgMHgwMDY2LCAweDAwNTYsIDB4MDA0NiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjAxOCwgMHgyMDY4LCAweDZjYTAsIDB4MjA3MSwgMHhhZmM3LCAweDcwMTgsIDB4MjA2OCwgMHg4ZGZmLAorCTB4MDE5OCwgMHg2OGEwLCAweGE0MDYsIDB4MDExOCwgMHg2ODU0LCAweDIwNjgsIDB4MGNjMCwgMHg2MDEwLAorCTB4MjA2MCwgMHg2NDNjLCAweDY1NDAsIDB4NmU0OCwgMHgyZDYwLCAweDA4MGMsIDB4NGU0MSwgMHgwMTIwLAorCTB4MDgwYywgMHg3Yjg4LCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwMGUsIDB4MDA0ZSwgMHgwMDVlLAorCTB4MDA2ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMDA1LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLAorCTB4NzEwZSwgMHgyMGEzLCAweDEyMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg3ODFjLAorCTB4YTA4NiwgMHgwMDA0LCAweDExMTAsIDB4NjA5OCwgMHgwMDE4LCAweDIwMDEsIDB4YWQxNCwgMHgyMDA0LAorCTB4MjBhMiwgMHg3ODM0LCAweDIwYTIsIDB4NzgzOCwgMHgyMGEyLCAweDIwYTksIDB4MDAxMCwgMHhhMDA2LAorCTB4MjBhMiwgMHgxZjA0LCAweDc5MjgsIDB4MjBhMiwgMHgyMGEyLCAweDYwYzMsIDB4MDAyYywgMHgwODBjLAorCTB4NzgyMSwgMHgwMDA1LCAweDAxNTYsIDB4MDE0NiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3MTBlLAorCTB4MjBhMywgMHgwZjAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NzgwOCwgMHgyMGEyLAorCTB4NjBjMywgMHgwMDA4LCAweDA4MGMsIDB4NzgyMSwgMHgwMTRlLCAweDAxNWUsIDB4MDAwNSwgMHgwMTU2LAorCTB4MDE0NiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3MWFhLCAweDIwYTMsIDB4MDIwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGE5LCAweDAwMDYsIDB4MjAxMSwgMHhhZDQwLCAweDIwMTksIDB4YWQ0MSwgMHgyM2E2LAorCTB4MjJhNiwgMHhhMzk4LCAweDAwMDIsIDB4YTI5MCwgMHgwMDAyLCAweDFmMDQsIDB4Nzk1NywgMHgyMGEzLAorCTB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDFjLCAweDA4MGMsIDB4NzgyMSwgMHgwMTRlLAorCTB4MDE1ZSwgMHgwMDA1LCAweDAxNTYsIDB4MDE0NiwgMHgwMDE2LCAweDAwMjYsIDB4MjBhMSwgMHgwMjBiLAorCTB4MDgwYywgMHg3MTgzLCAweDA4MGMsIDB4NzE5OSwgMHg3ODEwLCAweGEwODAsIDB4MDAwMCwgMHgyMDA0LAorCTB4YTA4MCwgMHgwMDE1LCAweDIwOTgsIDB4NzgwOCwgMHhhMDg4LCAweDAwMDIsIDB4MjFhOCwgMHg1M2E2LAorCTB4YTA4MCwgMHgwMDA0LCAweDgwMDMsIDB4NjBjMiwgMHgwODBjLCAweDc4MjEsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDE0ZSwgMHgwMTVlLCAweDAwMDUsIDB4MDE1NiwgMHgwMTQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLAorCTB4NzEwZSwgMHgyMGEzLCAweDYyMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg3ODA4LAorCTB4MjBhMiwgMHg2MGMzLCAweDAwMDgsIDB4MDgwYywgMHg3ODIxLCAweDAxNGUsIDB4MDE1ZSwgMHgwMDA1LAorCTB4MDE1NiwgMHgwMTQ2LCAweDAwMTYsIDB4MDAyNiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3MTBlLAorCTB4NzgxMCwgMHhhMDgwLCAweDAwMDAsIDB4MjAwNCwgMHhhMDgwLCAweDAwMTcsIDB4MjA5OCwgMHg3ODA4LAorCTB4YTA4OCwgMHgwMDAyLCAweDIxYTgsIDB4NTNhNiwgMHg4MDAzLCAweDYwYzIsIDB4MDgwYywgMHg3ODIxLAorCTB4MDAyZSwgMHgwMDFlLCAweDAxNGUsIDB4MDE1ZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMDA2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhZmM3LCAweDcwMGMsIDB4MjA2MCwgMHg4Y2ZmLAorCTB4MDE3OCwgMHgwODBjLCAweDk3ODksIDB4MTExMCwgMHgwODBjLCAweDg1ZjMsIDB4NjAwYywgMHgwMDA2LAorCTB4MDgwYywgMHg5OTRlLCAweDA4MGMsIDB4ODA3OCwgMHgwODBjLCAweDdiODgsIDB4MDBjZSwgMHgwYzc4LAorCTB4NzAwZiwgMHgwMDAwLCAweDcwMGIsIDB4MDAwMCwgMHgwMTJlLCAweDAwMGUsIDB4MDBjZSwgMHgwMGVlLAorCTB4MDAwNSwgMHgwMTI2LCAweDAxNTYsIDB4MDBmNiwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgwMDI2LAorCTB4MDAxNiwgMHgwMDA2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDY5LCAweDAxMDAsIDB4MjA3OSwgMHgwMTQwLAorCTB4MjA3MSwgMHhhZmM3LCAweDcwMjQsIDB4MjA2MCwgMHg4Y2ZmLCAweDA1YTAsIDB4MDgwYywgMHg3ODM0LAorCTB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4NjU4MSwgMHgyMDA5LCAweDAwMTMsIDB4MDgwYywgMHg4MGE3LAorCTB4MjBhOSwgMHgwMWY0LCAweDY4MjQsIDB4ZDA5NCwgMHgwMTU4LCAweDY4MjcsIDB4MDAwNCwgMHg3ODA0LAorCTB4YTA4NCwgMHg0MDAwLCAweDAxYTAsIDB4NzgwMywgMHgxMDAwLCAweDc4MDMsIDB4MDAwMCwgMHgwMDc4LAorCTB4ZDA4NCwgMHgwMTE4LCAweDY4MjcsIDB4MDAwMSwgMHgwMDEwLCAweDFmMDQsIDB4N2EwMiwgMHg3ODA0LAorCTB4YTA4NCwgMHgxMDAwLCAweDAxMjAsIDB4NzgwMywgMHgwMTAwLCAweDc4MDMsIDB4MDAwMCwgMHg2ODI0LAorCTB4MDAwZSwgMHgwMDFlLCAweDAwMmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMTVlLAorCTB4MDEyZSwgMHgwMDA1LCAweDIwMDEsIDB4YWQwMCwgMHgyMDA0LCAweGEwOTYsIDB4MDAwMSwgMHgwNTUwLAorCTB4YTA5NiwgMHgwMDA0LCAweDA1MzgsIDB4NjgxNywgMHgwMDA4LCAweDY4YzMsIDB4MDAwMCwgMHgyMDExLAorCTB4NDgxYiwgMHgwODBjLCAweDY1MGQsIDB4MjBhOSwgMHgwMWY0LCAweDY4MjQsIDB4ZDA5NCwgMHgwMTU4LAorCTB4NjgyNywgMHgwMDA0LCAweDc4MDQsIDB4YTA4NCwgMHg0MDAwLCAweDAxYTAsIDB4NzgwMywgMHgxMDAwLAorCTB4NzgwMywgMHgwMDAwLCAweDAwNzgsIDB4ZDA4NCwgMHgwMTE4LCAweDY4MjcsIDB4MDAwMSwgMHgwMDEwLAorCTB4MWYwNCwgMHg3YTNkLCAweDc4MDQsIDB4YTA4NCwgMHgxMDAwLCAweDAxMjAsIDB4NzgwMywgMHgwMTAwLAorCTB4NzgwMywgMHgwMDAwLCAweDAwMGUsIDB4MDAxZSwgMHgwMDJlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMTVlLCAweDAxMmUsIDB4MDAwNSwgMHgwMTI2LCAweDAxNTYsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDBkNiwgMHgwMGM2LCAweDAwMjYsIDB4MDAxNiwgMHgwMDA2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDY5LAorCTB4MDEwMCwgMHgyMDc5LCAweDAxNDAsIDB4MjA3MSwgMHhhZmM3LCAweDcwM2MsIDB4MjA2MCwgMHg4Y2ZmLAorCTB4MDkwNCwgMHg3YWQ1LCAweDY4MTcsIDB4MDAxMCwgMHgyMDA5LCAweDAwZmEsIDB4ODEwOSwgMHgxZGYwLAorCTB4NjhjNywgMHgwMDAwLCAweDY4Y2IsIDB4MDAwOCwgMHgwODBjLCAweDY1OGUsIDB4MDgwYywgMHgyMGI1LAorCTB4MDA0NiwgMHgyMDA5LCAweDAxN2YsIDB4MjAwYiwgMHgwMGE1LCAweDIwMjEsIDB4MDE2OSwgMHgyNDA0LAorCTB4YTA4NCwgMHgwMDBmLCAweGEwODYsIDB4MDAwNCwgMHgxMWIwLCAweDY4YzcsIDB4MDAwMCwgMHg2OGNiLAorCTB4MDAwOCwgMHgwMGU2LCAweDAwZjYsIDB4MjA3OSwgMHgwMDIwLCAweDIwNzEsIDB4YjAxZSwgMHg2ODE0LAorCTB4YTA4NCwgMHgwMTg0LCAweGEwODUsIDB4MDAxMiwgMHg2ODE2LCAweDc4MDMsIDB4MDAwOCwgMHg3MDAzLAorCTB4MDAwMCwgMHgwMGZlLCAweDAwZWUsIDB4MjAwYiwgMHgwMDAwLCAweDAwNGUsIDB4YTM5ZCwgMHgwMDAwLAorCTB4MTEyMCwgMHgyMDA5LCAweDAwNDksIDB4MDgwYywgMHg4MGE3LCAweDIwYTksIDB4MDNlOCwgMHg2ODI0LAorCTB4ZDA5NCwgMHgwMTU4LCAweDY4MjcsIDB4MDAwNCwgMHg3ODA0LCAweGEwODQsIDB4NDAwMCwgMHgwMWEwLAorCTB4NzgwMywgMHgxMDAwLCAweDc4MDMsIDB4MDAwMCwgMHgwMDc4LCAweGQwOGMsIDB4MDExOCwgMHg2ODI3LAorCTB4MDAwMiwgMHgwMDEwLCAweDFmMDQsIDB4N2FiNywgMHg3ODA0LCAweGEwODQsIDB4MTAwMCwgMHgwMTIwLAorCTB4NzgwMywgMHgwMTAwLCAweDc4MDMsIDB4MDAwMCwgMHg2ODI0LCAweDAwMGUsIDB4MDAxZSwgMHgwMDJlLAorCTB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMTVlLCAweDAxMmUsIDB4MDAwNSwgMHgwMGQ2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA2OSwgMHhhZmM3LCAweDZhMDYsIDB4MDEyZSwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMGQ2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksIDB4YWZjNywgMHg2YTMyLAorCTB4MDEyZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDA2LAorCTB4MDEyNiwgMHgyMDcxLCAweGFmYzcsIDB4NzYxNCwgMHgyNjYwLCAweDI2NzgsIDB4MjA5MSwgMHg4MDAwLAorCTB4OGNmZiwgMHgwNTM4LCAweDYwMWMsIDB4YTIwNiwgMHgxNTAwLCAweDcwMTQsIDB4YWMzNiwgMHgxMTEwLAorCTB4NjYwYywgMHg3NjE2LCAweDcwMTAsIDB4YWMzNiwgMHgxMTQwLCAweDJjMDAsIDB4YWYzNiwgMHgwMTE4LAorCTB4MmYwMCwgMHg3MDEyLCAweDAwMTAsIDB4NzAxMywgMHgwMDAwLCAweDY2MGMsIDB4MDA2NiwgMHgyYzAwLAorCTB4YWYwNiwgMHgwMTEwLCAweDdlMGUsIDB4MDAwOCwgMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwgMHgwODBjLAorCTB4OTc0ZSwgMHgwODBjLCAweDdiODgsIDB4MDBjZSwgMHgwOGQ4LCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLAorCTB4MDhiOCwgMHgwMTJlLCAweDAwMGUsIDB4MDA2ZSwgMHgwMGNlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LAorCTB4MDE1NiwgMHgwMTQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDczY2YsIDB4NzgxMCwgMHgyMGEyLAorCTB4YTAwNiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTMsIDB4MTAwMCwgMHgwODA0LAorCTB4N2I4MCwgMHgwMTU2LCAweDAxNDYsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzNjZiwgMHg3ODEwLAorCTB4MjBhMiwgMHhhMDA2LCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMywgMHg0MDAwLAorCTB4MDQ3OCwgMHgwMTU2LCAweDAxNDYsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzNjZiwgMHg3ODEwLAorCTB4MjBhMiwgMHhhMDA2LCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMywgMHgyMDAwLAorCTB4MDBmOCwgMHgwMTU2LCAweDAxNDYsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzNjZiwgMHg3ODEwLAorCTB4MjBhMiwgMHhhMDA2LCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMywgMHgwNDAwLAorCTB4MDA3OCwgMHgwMTU2LCAweDAxNDYsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzNjZiwgMHg3ODEwLAorCTB4MjBhMiwgMHhhMDA2LCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMywgMHgwMjAwLAorCTB4MDA4OSwgMHg2MGMzLCAweDAwMjAsIDB4MDgwYywgMHg3ODIxLCAweDAxNGUsIDB4MDE1ZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgyMDcxLCAweGFmYzcsIDB4NzAyMCwgMHhhMDA1LCAweDAxMTAsIDB4ODAwMSwgMHg3MDIyLAorCTB4MDBlZSwgMHgwMDA1LCAweDIwYTksIDB4MDAwOCwgMHgyMGEyLCAweDFmMDQsIDB4N2I5NCwgMHgyMGEyLAorCTB4MjBhMiwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDA3NiwgMHgwMDY2LAorCTB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGFmYzcsIDB4NzYxNCwgMHgyNjYwLAorCTB4MjY3OCwgMHgyMDM5LCAweDAwMDEsIDB4ODdmZiwgMHgwOTA0LCAweDdjMjQsIDB4OGNmZiwgMHgwOTA0LAorCTB4N2MyNCwgMHg2MDFjLCAweGEwODYsIDB4MDAwNiwgMHgxOTA0LCAweDdjMWYsIDB4ODhmZiwgMHgwMTM4LAorCTB4MjgwMCwgMHhhYzA2LCAweDE5MDQsIDB4N2MxZiwgMHgyMDM5LCAweDAwMDAsIDB4MDA1MCwgMHg2MDE4LAorCTB4YTIwNiwgMHgxOTA0LCAweDdjMWYsIDB4ODVmZiwgMHgwMTIwLCAweDYwNTAsIDB4YTEwNiwgMHgxOTA0LAorCTB4N2MxZiwgMHg3MDI0LCAweGFjMDYsIDB4MTUzOCwgMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwgMHhhMDA1LAorCTB4MDFmMCwgMHgwODBjLCAweDY1ODEsIDB4NjgxNywgMHgwMDA4LCAweDY4YzMsIDB4MDAwMCwgMHgwODBjLAorCTB4N2NhOCwgMHg3MDI3LCAweDAwMDAsIDB4MDAzNiwgMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHhhMzg0LAorCTB4MTAwMCwgMHgwMTIwLCAweDY4MDMsIDB4MDEwMCwgMHg2ODAzLCAweDAwMDAsIDB4MjA2OSwgMHgwMTAwLAorCTB4NjgyNCwgMHhkMDg0LCAweDAxMTAsIDB4NjgyNywgMHgwMDAxLCAweDAwM2UsIDB4MDAyMCwgMHg2MDAzLAorCTB4MDAwOSwgMHg2MzBhLCAweDA0NjAsIDB4NzAxNCwgMHhhYzM2LCAweDExMTAsIDB4NjYwYywgMHg3NjE2LAorCTB4NzAxMCwgMHhhYzM2LCAweDExNDAsIDB4MmMwMCwgMHhhZjM2LCAweDAxMTgsIDB4MmYwMCwgMHg3MDEyLAorCTB4MDAxMCwgMHg3MDEzLCAweDAwMDAsIDB4NjYwYywgMHgwMDY2LCAweDJjMDAsIDB4YWYwNiwgMHgwMTEwLAorCTB4N2UwZSwgMHgwMDA4LCAweDI2NzgsIDB4ODlmZiwgMHgxMTU4LCAweDYwMGYsIDB4MDAwMCwgMHg2MDEwLAorCTB4MjA2OCwgMHgwODBjLCAweDk1OTYsIDB4MDExMCwgMHgwODBjLCAweGE5MWYsIDB4MDgwYywgMHg5NzRlLAorCTB4MDgwYywgMHg3Yjg4LCAweDg4ZmYsIDB4MTE5MCwgMHgwMGNlLCAweDA4MDQsIDB4N2JhYiwgMHgyYzc4LAorCTB4NjAwYywgMHgyMDYwLCAweDA4MDQsIDB4N2JhYiwgMHhhMDA2LCAweDAxMmUsIDB4MDAwZSwgMHgwMDZlLAorCTB4MDA3ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4NjAxNywgMHgwMDAwLAorCTB4MDBjZSwgMHhhOGM1LCAweDAwMDEsIDB4MGM4OCwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LAorCTB4MDA2NiwgMHgwMDI2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhZmM3LAorCTB4NzYzOCwgMHgyNjYwLCAweDI2NzgsIDB4OGNmZiwgMHgwOTA0LCAweDdjOTgsIDB4NjAxYywgMHhhMDg2LAorCTB4MDAwNiwgMHgxOTA0LCAweDdjOTMsIDB4ODdmZiwgMHgwMTI4LCAweDI3MDAsIDB4YWMwNiwgMHgxOTA0LAorCTB4N2M5MywgMHgwMDQwLCAweDYwMTgsIDB4YTIwNiwgMHgxNWYwLCAweDg1ZmYsIDB4MDExOCwgMHg2MDUwLAorCTB4YTEwNiwgMHgxNWM4LCAweDcwM2MsIDB4YWMwNiwgMHgxMTcwLCAweDAwMzYsIDB4MjAxOSwgMHgwMDAxLAorCTB4MDgwYywgMHg3YTY0LCAweDcwMzMsIDB4MDAwMCwgMHg3MDNmLCAweDAwMDAsIDB4NzA0MywgMHgwMDAwLAorCTB4NzA0NywgMHgwMDAwLCAweDAwM2UsIDB4NzAzOCwgMHhhYzM2LCAweDExMTAsIDB4NjYwYywgMHg3NjNhLAorCTB4NzAzNCwgMHhhYzM2LCAweDExNDAsIDB4MmMwMCwgMHhhZjM2LCAweDAxMTgsIDB4MmYwMCwgMHg3MDM2LAorCTB4MDAxMCwgMHg3MDM3LCAweDAwMDAsIDB4NjYwYywgMHgwMDY2LCAweDJjMDAsIDB4YWYwNiwgMHgwMTEwLAorCTB4N2UwZSwgMHgwMDA4LCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLAorCTB4OTU5NiwgMHgwMTEwLCAweDA4MGMsIDB4YTkxZiwgMHgwODBjLCAweDk3NGUsIDB4ODdmZiwgMHgxMTkwLAorCTB4MDBjZSwgMHgwODA0LCAweDdjNDMsIDB4MmM3OCwgMHg2MDBjLCAweDIwNjAsIDB4MDgwNCwgMHg3YzQzLAorCTB4YTAwNiwgMHgwMTJlLCAweDAwMGUsIDB4MDAyZSwgMHgwMDZlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMDA1LCAweDYwMTcsIDB4MDAwMCwgMHgwMGNlLCAweGE3YmQsIDB4MDAwMSwgMHgwYzg4LAorCTB4MDBlNiwgMHgyMDcxLCAweGFmYzcsIDB4MjAwMSwgMHhhZDAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAyLAorCTB4MTExOCwgMHg3MDA3LCAweDAwMDUsIDB4MDAxMCwgMHg3MDA3LCAweDAwMDAsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDBmNiwgMHgwMGU2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDI2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDcxLCAweGFmYzcsIDB4MmMxMCwgMHg3NjM4LCAweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLAorCTB4MDUxOCwgMHgyMjAwLCAweGFjMDYsIDB4MTFlMCwgMHg3MDM4LCAweGFjMzYsIDB4MTExMCwgMHg2NjBjLAorCTB4NzYzYSwgMHg3MDM0LCAweGFjMzYsIDB4MTE0MCwgMHgyYzAwLCAweGFmMzYsIDB4MDExOCwgMHgyZjAwLAorCTB4NzAzNiwgMHgwMDEwLCAweDcwMzcsIDB4MDAwMCwgMHg2NjBjLCAweDJjMDAsIDB4YWYwNiwgMHgwMTEwLAorCTB4N2UwZSwgMHgwMDA4LCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLCAweGEwODUsIDB4MDAwMSwgMHgwMDIwLAorCTB4MmM3OCwgMHg2MDBjLCAweDIwNjAsIDB4MDhkOCwgMHgwMTJlLCAweDAwMGUsIDB4MDAyZSwgMHgwMDZlLAorCTB4MDBjZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LAorCTB4MDA2NiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YWZjNywgMHg3NjBjLAorCTB4MjY2MCwgMHgyNjc4LCAweDhjZmYsIDB4MDkwNCwgMHg3ZDdlLCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LAorCTB4MjAwNCwgMHhhMjA2LCAweDE5MDQsIDB4N2Q3OSwgMHg3MDI0LCAweGFjMDYsIDB4MTUwOCwgMHgyMDY5LAorCTB4MDEwMCwgMHg2OGMwLCAweGEwMDUsIDB4MDkwNCwgMHg3ZDU1LCAweDA4MGMsIDB4NzgzNCwgMHg2OGMzLAorCTB4MDAwMCwgMHgwODBjLCAweDdjYTgsIDB4NzAyNywgMHgwMDAwLCAweDAwMzYsIDB4MjA2OSwgMHgwMTQwLAorCTB4NmIwNCwgMHhhMzg0LCAweDEwMDAsIDB4MDEyMCwgMHg2ODAzLCAweDAxMDAsIDB4NjgwMywgMHgwMDAwLAorCTB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwgMHgwMTEwLCAweDY4MjcsIDB4MDAwMSwgMHgwMDNlLAorCTB4NzAwYywgMHhhYzM2LCAweDExMTAsIDB4NjYwYywgMHg3NjBlLCAweDcwMDgsIDB4YWMzNiwgMHgxMTQwLAorCTB4MmMwMCwgMHhhZjM2LCAweDAxMTgsIDB4MmYwMCwgMHg3MDBhLCAweDAwMTAsIDB4NzAwYiwgMHgwMDAwLAorCTB4NjYwYywgMHgwMDY2LCAweDJjMDAsIDB4YWYwNiwgMHgwMTEwLCAweDdlMGUsIDB4MDAwOCwgMHgyNjc4LAorCTB4NjAwZiwgMHgwMDAwLCAweDA4MGMsIDB4OTc3OCwgMHgxMTU4LCAweDA4MGMsIDB4MmFmZiwgMHgwODBjLAorCTB4OTc4OSwgMHgxMWYwLCAweDA4MGMsIDB4ODVmMywgMHgwMGQ4LCAweDA4MGMsIDB4N2NhOCwgMHgwOGMwLAorCTB4MDgwYywgMHg5Nzg5LCAweDExMTgsIDB4MDgwYywgMHg4NWYzLCAweDAwOTAsIDB4NjAxMCwgMHgyMDY4LAorCTB4MDgwYywgMHg5NTk2LCAweDAxNjgsIDB4NjAxYywgMHhhMDg2LCAweDAwMDMsIDB4MTFmOCwgMHg2ODM3LAorCTB4MDEwMywgMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgwODBjLCAweDUxMGMsIDB4MDgwYywgMHg5NzQyLAorCTB4MDgwYywgMHg5OTRlLCAweDA4MGMsIDB4OTc0ZSwgMHgwODBjLCAweDdiODgsIDB4MDBjZSwgMHgwODA0LAorCTB4N2QwMiwgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwODA0LCAweDdkMDIsIDB4MDEyZSwgMHgwMDBlLAorCTB4MDA2ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4NjAxYywgMHhhMDg2LAorCTB4MDAwNiwgMHgxZDMwLCAweDA4MGMsIDB4YTkxZiwgMHgwYzE4LCAweDAwMzYsIDB4MDE1NiwgMHgwMTM2LAorCTB4MDE0NiwgMHgzOTA4LCAweGEwMDYsIDB4YTE5MCwgMHgwMDIwLCAweDIyMWMsIDB4YTM5ZSwgMHgyOGY5LAorCTB4MTExOCwgMHg4MjEwLCAweDgwMDAsIDB4MGNjOCwgMHhhMDA1LCAweDAxMzgsIDB4MjBhOSwgMHgwMDIwLAorCTB4MjE5OCwgMHhhMTEwLCAweDIyYTAsIDB4MjJjOCwgMHg1M2EzLCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLAorCTB4MDAzZSwgMHgwMDA1LCAweDAwZDYsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzFhYSwgMHgyMGEzLAorCTB4MDIwMCwgMHgyMGEzLCAweDAwMTQsIDB4NjBjMywgMHgwMDE0LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMDk5LCAweGFmYTYsIDB4MjBhOSwgMHgwMDA0LCAweDUzYTYsIDB4MjBhMywgMHgwMDA0LAorCTB4MjBhMywgMHg3ODc4LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MDgwYywgMHg3ODIxLAorCTB4MDBkZSwgMHgwMDA1LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDcxYWEsIDB4MjBhMywgMHgwMjE0LAorCTB4MjBhMywgMHgwMDE4LCAweDIwYTMsIDB4MDgwMCwgMHg3ODEwLCAweGEwODQsIDB4ZmYwMCwgMHgyMGEyLAorCTB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4NzgxMCwgMHhhMDg0LCAweDAwZmYsIDB4MjBhMiwgMHg3ODI4LCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAxOCwgMHgwODBjLCAweDc4MjEsIDB4MDAwNSwgMHgwMGQ2LAorCTB4MDAxNiwgMHgyZjY4LCAweDIwMDksIDB4MDAzNSwgMHgwODBjLCAweDlhMzQsIDB4MTkwNCwgMHg3ZTVkLAorCTB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzEwZSwgMHgyMGEzLCAweDEzMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4NzgyOCwgMHgyMDY4LCAweDY4MWMsIDB4YTA4NiwgMHgwMDAzLCAweDA1ODAsIDB4NzgxOCwgMHhhMDgwLAorCTB4MDAyOCwgMHgyMDE0LCAweDIwMDEsIDB4YWQzNCwgMHgyMDA0LCAweGQwYWMsIDB4MTFkMCwgMHhhMjg2LAorCTB4MDA3ZSwgMHgxMTI4LCAweDIwYTMsIDB4MDBmZiwgMHgyMGEzLCAweGZmZmUsIDB4MDRiOCwgMHhhMjg2LAorCTB4MDA3ZiwgMHgxMTI4LCAweDIwYTMsIDB4MDBmZiwgMHgyMGEzLCAweGZmZmQsIDB4MDQ3OCwgMHhkMmJjLAorCTB4MDE4MCwgMHhhMjg2LCAweDAwODAsIDB4MTEyOCwgMHgyMGEzLCAweDAwZmYsIDB4MjBhMywgMHhmZmZjLAorCTB4MDQyOCwgMHhhMmU4LCAweGFlMzQsIDB4MmQ2YywgMHg2ODEwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLAorCTB4MDBlOCwgMHgyMGEzLCAweDAwMDAsIDB4NjA5OCwgMHgyMGEyLCAweDAwYzAsIDB4MjAwMSwgMHhhZDM0LAorCTB4MjAwNCwgMHhkMGFjLCAweDExMzgsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMDgyLAorCTB4MDA3ZSwgMHgwMjQwLCAweDAwZDYsIDB4MjA2OSwgMHhhZDFiLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LAorCTB4MDBkZSwgMHgwMDIwLCAweDIwYTMsIDB4MDAwMCwgMHg2MDM0LCAweDIwYTIsIDB4NzgzNCwgMHgyMGEyLAorCTB4NzgzOCwgMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDBjLAorCTB4MDgwYywgMHg3ODIxLCAweDAwMWUsIDB4MDBkZSwgMHgwMDA1LCAweDc4MTcsIDB4MDAwMSwgMHg3ODAzLAorCTB4MDAwNiwgMHgwMDFlLCAweDAwZGUsIDB4MDAwNSwgMHgwMGQ2LCAweDAwMjYsIDB4NzkyOCwgMHgyMTY4LAorCTB4NjkxYywgMHhhMTg2LCAweDAwMDYsIDB4MDFjMCwgMHhhMTg2LCAweDAwMDMsIDB4MDkwNCwgMHg3ZWQzLAorCTB4YTE4NiwgMHgwMDA1LCAweDA5MDQsIDB4N2ViYywgMHhhMTg2LCAweDAwMDQsIDB4MDViOCwgMHhhMTg2LAorCTB4MDAwOCwgMHgwOTA0LCAweDdlYzQsIDB4NzgwNywgMHgwMDM3LCAweDc4MTMsIDB4MTcwMCwgMHgwODBjLAorCTB4N2YzYiwgMHgwMDJlLCAweDAwZGUsIDB4MDAwNSwgMHgwODBjLCAweDdlZjcsIDB4MjAwOSwgMHg0MDAwLAorCTB4NjgwMCwgMHgwMDAyLCAweDdlOWQsIDB4N2VhOCwgMHg3ZTlmLCAweDdlYTgsIDB4N2VhNCwgMHg3ZTlkLAorCTB4N2U5ZCwgMHg3ZWE4LCAweDdlYTgsIDB4N2VhOCwgMHg3ZWE4LCAweDdlOWQsIDB4N2U5ZCwgMHg3ZTlkLAorCTB4N2U5ZCwgMHg3ZTlkLCAweDdlYTgsIDB4N2U5ZCwgMHg3ZWE4LCAweDA4MGMsIDB4MTRmNiwgMHg2ODIwLAorCTB4ZDBlNCwgMHgwMTEwLCAweGQwY2MsIDB4MDExMCwgMHhhMDBlLCAweDAwMTAsIDB4MjAwOSwgMHgyMDAwLAorCTB4NjgyOCwgMHgyMGEyLCAweDY4MmMsIDB4MjBhMiwgMHgwODA0LCAweDdlZWQsIDB4MDgwYywgMHg3ZWY3LAorCTB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMDA5LCAweDQwMDAsIDB4NmEwMCwgMHhhMjg2LAorCTB4MDAwMiwgMHgxMTA4LCAweGEwMGUsIDB4MDQ4OCwgMHgwNGQxLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMDA5LCAweDQwMDAsIDB4MDQ0OCwgMHgwNDkxLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLAorCTB4MDAwMCwgMHgyMDA5LCAweDQwMDAsIDB4YTI4NiwgMHgwMDA1LCAweDAxMTgsIDB4YTI4NiwgMHgwMDAyLAorCTB4MTEwOCwgMHhhMDBlLCAweDAwZDAsIDB4MDQxOSwgMHg2ODEwLCAweDIwNjgsIDB4Njk3YywgMHg2ODEwLAorCTB4YTExMiwgMHg2OTgwLCAweDY4MTQsIDB4YTEwMywgMHgyMGEyLCAweDIyYTIsIDB4NzkyOCwgMHhhMTgwLAorCTB4MDAwMCwgMHgyMDA0LCAweGEwOGUsIDB4MDAwMiwgMHgwMTMwLCAweGEwOGUsIDB4MDAwNCwgMHgwMTE4LAorCTB4MjAwOSwgMHg0MDAwLCAweDAwMTAsIDB4MjAwOSwgMHgwMDAwLCAweDIxYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4NjBjMywgMHgwMDE4LCAweDA4MGMsIDB4NzgyMSwgMHgwMDJlLCAweDAwZGUsIDB4MDAwNSwgMHgwMDM2LAorCTB4MDA0NiwgMHgwMDU2LCAweDAwNjYsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzFhYSwgMHhhMDA2LAorCTB4MjBhMywgMHgwMjAwLCAweDIwYTIsIDB4NzkzNCwgMHgyMWEyLCAweDc5MzgsIDB4MjFhMiwgMHg3ODE4LAorCTB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4MjAxMSwgMHhhZDM0LCAweDIyMTQsIDB4ZDJhYywgMHgxMTE4LAorCTB4YTA5MiwgMHgwMDdlLCAweDAyNjgsIDB4MDBkNiwgMHgyMDY5LCAweGFkMWIsIDB4MmQyYywgMHg4ZDY4LAorCTB4MmQzNCwgMHhhMGU4LCAweGFlMzQsIDB4MmQ2YywgMHg2YjEwLCAweDZjMTQsIDB4MDBkZSwgMHgwMDMwLAorCTB4MjAxOSwgMHgwMDAwLCAweDY0OTgsIDB4MjAyOSwgMHgwMDAwLCAweDY2MzQsIDB4NzgyOCwgMHhhMDgwLAorCTB4MDAwNywgMHgyMDA0LCAweGEwODYsIDB4MDAwMywgMHgxMTI4LCAweDI1YTIsIDB4MjZhMiwgMHgyM2EyLAorCTB4MjRhMiwgMHgwMDIwLCAweDIzYTIsIDB4MjRhMiwgMHgyNWEyLCAweDI2YTIsIDB4MDA2ZSwgMHgwMDVlLAorCTB4MDA0ZSwgMHgwMDNlLCAweDAwMDUsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzFhYSwgMHgyMGEzLAorCTB4MDEwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDA5LCAweDc4MTAsIDB4MjBhMiwgMHg2MGMzLAorCTB4MDAwOCwgMHgwODBjLCAweDc4MjEsIDB4MDAwNSwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3MTA2LAorCTB4MjBhMywgMHgxNDAwLCAweDIwYTMsIDB4MDAwMCwgMHg3ODM0LCAweDIwYTIsIDB4NzgzOCwgMHgyMGEyLAorCTB4NzgyOCwgMHgyMGEyLCAweDc4MmMsIDB4MjBhMiwgMHg3ODMwLCAweGEwODQsIDB4MDBmZiwgMHg4MDA3LAorCTB4MjBhMiwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDEwLCAweDA4MGMsIDB4NzgyMSwgMHgwMDA1LAorCTB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzFhMiwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLAorCTB4NzgyOCwgMHgyMGEyLCAweDc4MTAsIDB4MjBhMiwgMHg2MGMzLCAweDAwMDgsIDB4MDgwYywgMHg3ODIxLAorCTB4MDAwNSwgMHgwMTQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwMDMxLCAweDYwYzMsIDB4MDAwMCwgMHgwODBjLAorCTB4NzgyMSwgMHgwMTRlLCAweDAwMDUsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LAorCTB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4MjAxMSwgMHhhZDM0LCAweDIyMTQsIDB4ZDJhYywgMHgxMTEwLAorCTB4ZDBiYywgMHgwMTg4LCAweDAwZDYsIDB4YTBlOCwgMHhhZTM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LAorCTB4MDMwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGFkMWIsIDB4MmRhNiwgMHg4ZDY4LAorCTB4MmRhNiwgMHgwMGRlLCAweDAwNzgsIDB4MDBkNiwgMHhhMGU4LCAweGFlMzQsIDB4MmQ2YywgMHg2ODEwLAorCTB4YTA4NSwgMHgwMzAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDAwZGUsIDB4MjBhMywgMHgwMDAwLAorCTB4NjIzNCwgMHgyMmEyLCAweDIwYTMsIDB4MDgxOSwgMHgyMGEzLCAweDAwMDAsIDB4MDgwYywgMHg3ODEwLAorCTB4MjJhMiwgMHgyMGEzLCAweDAwMDAsIDB4MmZhMiwgMHg3YTA4LCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLAorCTB4MjBhMywgMHgwMDAwLCAweDAwMDUsIDB4MjBhMSwgMHgwMjBiLCAweDAwNzksIDB4NzkxMCwgMHgyMWEyLAorCTB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAwMCwgMHgyMGUxLCAweDkwODAsIDB4NjBhNywgMHg5NTc1LAorCTB4MDgwYywgMHg3ODJiLCAweDA4MGMsIDB4NjU3OCwgMHgwMDA1LCAweDAxNTYsIDB4MDEzNiwgMHgwMDM2LAorCTB4MDBkNiwgMHgwMGU2LCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4Nzg1NCwgMHgyMDY4LAorCTB4YWRmMCwgMHgwMDBmLCAweDcyMTAsIDB4YTI5NiwgMHgwMGMwLCAweGEyOTQsIDB4ZmZmZCwgMHg3MjEyLAorCTB4NzIxNCwgMHhhMjk0LCAweDAzMDAsIDB4NzIxNiwgMHg3MTAwLCAweGExOTQsIDB4MDBmZiwgMHg3MzA4LAorCTB4YTM4NCwgMHgwMGZmLCAweGEwOGQsIDB4YzIwMCwgMHg3MTAyLCAweGEzODQsIDB4ZmYwMCwgMHhhMjE1LAorCTB4NzIwYSwgMHg3MDA0LCAweDcyMGMsIDB4NzAwZSwgMHg3MjA2LCAweDIwYTksIDB4MDAwYSwgMHgyZTk4LAorCTB4NTNhNiwgMHg2MGEzLCAweDAwMzUsIDB4NmEzOCwgMHhhMjk0LCAweDcwMDAsIDB4YTI4NiwgMHgzMDAwLAorCTB4MDExMCwgMHg2MGEzLCAweDAwMzcsIDB4MDBlZSwgMHgwMGRlLCAweDAwM2UsIDB4MDEzZSwgMHgwMTVlLAorCTB4MDAwNSwgMHgyMDA5LCAweDAwOTIsIDB4MDAxMCwgMHgyMDA5LCAweDAwOTYsIDB4NjBhYiwgMHgwMDM2LAorCTB4NjExNiwgMHgwMDA1LCAweDIwNjEsIDB4YjQwMCwgMHgyYTcwLCAweDcwNjQsIDB4NzA0NiwgMHg3MDRiLAorCTB4YjQwMCwgMHgwMDA1LCAweDAwZTYsIDB4MDEyNiwgMHgyMDcxLCAweGFkMDAsIDB4MjA5MSwgMHg4MDAwLAorCTB4NzU0NCwgMHhhNTgyLCAweDAwMTAsIDB4MDYwOCwgMHg3MDQ4LCAweDIwNjAsIDB4NjAwMCwgMHhhMDg2LAorCTB4MDAwMCwgMHgwMTQ4LCAweGFjZTAsIDB4MDAxOCwgMHg3MDU4LCAweGFjMDIsIDB4MTIwOCwgMHgwY2IwLAorCTB4MjA2MSwgMHhiNDAwLCAweDBjOTgsIDB4NjAwMywgMHgwMDA4LCAweDg1MjksIDB4NzU0NiwgMHhhY2E4LAorCTB4MDAxOCwgMHg3MDU4LCAweGE1MDIsIDB4MTIzMCwgMHg3NTRhLCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLAorCTB4MDBlZSwgMHgwMDA1LCAweDcwNGIsIDB4YjQwMCwgMHgwY2MwLCAweGEwMDYsIDB4MGNjMCwgMHgwMGU2LAorCTB4MjA3MSwgMHhhZDAwLCAweDc1NDQsIDB4YTU4MiwgMHgwMDEwLCAweDA2MDAsIDB4NzA0OCwgMHgyMDYwLAorCTB4NjAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDE0OCwgMHhhY2UwLCAweDAwMTgsIDB4NzA1OCwgMHhhYzAyLAorCTB4MTIwOCwgMHgwY2IwLCAweDIwNjEsIDB4YjQwMCwgMHgwYzk4LCAweDYwMDMsIDB4MDAwOCwgMHg4NTI5LAorCTB4NzU0NiwgMHhhY2E4LCAweDAwMTgsIDB4NzA1OCwgMHhhNTAyLCAweDEyMjgsIDB4NzU0YSwgMHhhMDg1LAorCTB4MDAwMSwgMHgwMGVlLCAweDAwMDUsIDB4NzA0YiwgMHhiNDAwLCAweDBjYzgsIDB4YTAwNiwgMHgwY2M4LAorCTB4YWM4MiwgMHhiNDAwLCAweDBhMGMsIDB4MTRmNiwgMHgyMDAxLCAweGFkMTYsIDB4MjAwNCwgMHhhYzAyLAorCTB4MWEwYywgMHgxNGY2LCAweGEwMDYsIDB4NjAwNiwgMHg2MDBhLCAweDYwMGUsIDB4NjAxMiwgMHg2MDE2LAorCTB4NjAxYSwgMHg2MDFmLCAweDAwMDAsIDB4NjAwMywgMHgwMDAwLCAweDYwNTIsIDB4NjA1NiwgMHg2MDIyLAorCTB4NjAyNiwgMHg2MDJhLCAweDYwMmUsIDB4NjAzMiwgMHg2MDM2LCAweDYwM2EsIDB4NjAzZSwgMHgyMDYxLAorCTB4YWQwMCwgMHg2MDQ0LCAweDgwMDAsIDB4NjA0NiwgMHhhMDg2LCAweDAwMDEsIDB4MDEwOCwgMHgwMDA1LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2YzUwLCAweDAxMmUsIDB4MGNjMCwgMHg2MDFjLAorCTB4YTA4NCwgMHgwMDBmLCAweDAwMDIsIDB4ODBiNiwgMHg4MGM1LCAweDgwZTAsIDB4ODBmYiwgMHg5YTYxLAorCTB4OWE3YywgMHg5YTk3LCAweDgwYjYsIDB4ODBjNSwgMHg4MGI2LCAweDgxMTYsIDB4YTE4NiwgMHgwMDEzLAorCTB4MTEyOCwgMHgwODBjLCAweDZiNzMsIDB4MDgwYywgMHg2YzUwLCAweDAwMDUsIDB4YTE4ZSwgMHgwMDQ3LAorCTB4MTExOCwgMHhhMDE2LCAweDA4MGMsIDB4MTgyNCwgMHgwMDA1LCAweDAwNjYsIDB4NjAwMCwgMHhhMGIyLAorCTB4MDAxMCwgMHgxYTBjLCAweDE0ZjYsIDB4MDAxMywgMHgwMDZlLCAweDAwMDUsIDB4ODBkZSwgMHg4NDc4LAorCTB4ODYyZCwgMHg4MGRlLCAweDg2YTIsIDB4ODFjZiwgMHg4MGRlLCAweDgwZGUsIDB4ODQwYSwgMHg4YTkxLAorCTB4ODBkZSwgMHg4MGRlLCAweDgwZGUsIDB4ODBkZSwgMHg4MGRlLCAweDgwZGUsIDB4MDgwYywgMHgxNGY2LAorCTB4MDA2NiwgMHg2MDAwLCAweGEwYjIsIDB4MDAxMCwgMHgxYTBjLCAweDE0ZjYsIDB4MDAxMywgMHgwMDZlLAorCTB4MDAwNSwgMHg4MGY5LCAweDkwOWEsIDB4ODBmOSwgMHg4MGY5LCAweDgwZjksIDB4ODBmOSwgMHg4MGY5LAorCTB4ODBmOSwgMHg5MDQ1LCAweDkyMDAsIDB4ODBmOSwgMHg5MGM3LCAweDkxM2UsIDB4OTBjNywgMHg5MTNlLAorCTB4ODBmOSwgMHgwODBjLCAweDE0ZjYsIDB4MDA2NiwgMHg2MDAwLCAweGEwYjIsIDB4MDAxMCwgMHgxYTBjLAorCTB4MTRmNiwgMHgwMDEzLCAweDAwNmUsIDB4MDAwNSwgMHg4MTE0LCAweDhhZDIsIDB4OGI5OCwgMHg4Y2I4LAorCTB4OGUxMiwgMHg4MTE0LCAweDgxMTQsIDB4ODExNCwgMHg4YWFjLCAweDhmZjUsIDB4OGZmOCwgMHg4MTE0LAorCTB4ODExNCwgMHg4MTE0LCAweDgxMTQsIDB4OTAyMiwgMHgwODBjLCAweDE0ZjYsIDB4MDA2NiwgMHg2MDAwLAorCTB4YTBiMiwgMHgwMDEwLCAweDFhMGMsIDB4MTRmNiwgMHgwMDEzLCAweDAwNmUsIDB4MDAwNSwgMHg4MTJmLAorCTB4ODEyZiwgMHg4MTJmLCAweDgxNTIsIDB4ODFhNSwgMHg4MTJmLCAweDgxMmYsIDB4ODEyZiwgMHg4MTMxLAorCTB4ODEyZiwgMHg4MTJmLCAweDgxMmYsIDB4ODEyZiwgMHg4MTJmLCAweDgxMmYsIDB4ODEyZiwgMHgwODBjLAorCTB4MTRmNiwgMHhhMTg2LCAweDAwMDMsIDB4MTkwYywgMHgxNGY2LCAweDAwZDYsIDB4NjAwMywgMHgwMDAzLAorCTB4NjEwNiwgMHg2MDEwLCAweDIwNjgsIDB4Njg0ZiwgMHgwMDQwLCAweDY4N2MsIDB4NjgwYSwgMHg2ODgwLAorCTB4NjgwZSwgMHg2ODEzLCAweDAwMDAsIDB4NjgxNywgMHgwMDAwLCAweDAwZGUsIDB4MmMxMCwgMHgwODBjLAorCTB4MWU2ZSwgMHgwODBjLCAweDY4MGIsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2ZDBkLAorCTB4MDEyZSwgMHgwMDA1LCAweGExODIsIDB4MDA0NywgMHgwMDAyLCAweDgxNWUsIDB4ODE1ZSwgMHg4MTYwLAorCTB4ODE3ZiwgMHg4MTVlLCAweDgxNWUsIDB4ODE1ZSwgMHg4MTVlLCAweDgxOTEsIDB4MDgwYywgMHgxNGY2LAorCTB4MDBkNiwgMHgwMDE2LCAweDA4MGMsIDB4NmMwNSwgMHgwODBjLCAweDZkMGQsIDB4NjAwMywgMHgwMDA0LAorCTB4NjExMCwgMHgyMTY4LCAweDY4NTQsIDB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4YTEwOCwgMHg2MTE2LAorCTB4Njg0ZiwgMHgwMDIwLCAweDY4NWMsIDB4Njg1YSwgMHg2ODc0LCAweDY4N2UsIDB4Njg3OCwgMHg2ODgyLAorCTB4Njg5NywgMHgwMDAwLCAweDY4OWIsIDB4MDAwMCwgMHgwMDFlLCAweDAwZGUsIDB4MDAwNSwgMHgwODBjLAorCTB4NmMwNSwgMHgwMGQ2LCAweDYxMTAsIDB4MjE2OCwgMHgwODBjLCAweDk1OTYsIDB4MDEyMCwgMHg2ODRiLAorCTB4MDAwNiwgMHgwODBjLCAweDUxMGMsIDB4MDBkZSwgMHgwODBjLCAweDgwNzgsIDB4MDgwYywgMHg2ZDBkLAorCTB4MDAwNSwgMHgwODBjLCAweDZjMDUsIDB4MDgwYywgMHgyYWQ5LCAweDAwZDYsIDB4NjExMCwgMHgyMTY4LAorCTB4MDgwYywgMHg5NTk2LCAweDAxMjAsIDB4Njg0YiwgMHgwMDI5LCAweDA4MGMsIDB4NTEwYywgMHgwMGRlLAorCTB4MDgwYywgMHg4MDc4LCAweDA4MGMsIDB4NmQwZCwgMHgwMDA1LCAweGExODIsIDB4MDA0NywgMHgwMDAyLAorCTB4ODFiMywgMHg4MWMyLCAweDgxYjEsIDB4ODFiMSwgMHg4MWIxLCAweDgxYjEsIDB4ODFiMSwgMHg4MWIxLAorCTB4ODFiMSwgMHgwODBjLCAweDE0ZjYsIDB4MDBkNiwgMHg2MDEwLCAweDIwNjgsIDB4Njg0YywgMHhjMGY0LAorCTB4Njg0ZSwgMHgwMGRlLCAweDIwZTEsIDB4MDAwNSwgMHgzZDE4LCAweDNlMjAsIDB4MmMxMCwgMHgwODBjLAorCTB4MTgyNCwgMHgwMDA1LCAweDAwZDYsIDB4NjExMCwgMHgyMTY4LCAweDY4NGIsIDB4MDAwMCwgMHg2ODUzLAorCTB4MDAwMCwgMHgwODBjLCAweDUxMGMsIDB4MDBkZSwgMHgwODBjLCAweDgwNzgsIDB4MDAwNSwgMHhhMWI2LAorCTB4MDAxNSwgMHgxMTE4LCAweDA4MGMsIDB4ODA3OCwgMHgwMDMwLCAweGExYjYsIDB4MDAxNiwgMHgxOTBjLAorCTB4MTRmNiwgMHgwODBjLCAweDgwNzgsIDB4MDAwNSwgMHgyMGE5LCAweDAwMGUsIDB4MmU5OCwgMHg2MDEwLAorCTB4MjBhMCwgMHg1M2EzLCAweDIwYTksIDB4MDAwNiwgMHgzMzEwLCAweDM0MjAsIDB4OTM5OCwgMHg5NGEwLAorCTB4MzMxOCwgMHgzNDI4LCAweDIyMmUsIDB4MjMyNiwgMHhhMjkwLCAweDAwMDIsIDB4YTVhOCwgMHgwMDAyLAorCTB4YTM5OCwgMHgwMDAyLCAweGE0YTAsIDB4MDAwMiwgMHgxZjA0LCAweDgxZWEsIDB4MDBlNiwgMHgwODBjLAorCTB4OTU5NiwgMHgwMTMwLCAweDYwMTAsIDB4MjA3MCwgMHg3MDA3LCAweDAwMDAsIDB4NzAzNywgMHgwMTAzLAorCTB4MDBlZSwgMHgwODBjLCAweDgwNzgsIDB4MDAwNSwgMHgwMGQ2LCAweDAwMzYsIDB4NzMzMCwgMHhhMzg2LAorCTB4MDIwMCwgMHgxMTMwLCAweDYwMTgsIDB4MjA2OCwgMHg2ODEzLCAweDAwZmYsIDB4NjgxNywgMHhmZmZkLAorCTB4NjAxMCwgMHhhMDA1LCAweDAxMzAsIDB4MjA2OCwgMHg2ODA3LCAweDAwMDAsIDB4NjgzNywgMHgwMTAzLAorCTB4NmIzMiwgMHgwODBjLCAweDgwNzgsIDB4MDAzZSwgMHgwMGRlLCAweDAwMDUsIDB4MDAxNiwgMHgyMGE5LAorCTB4MDAyYSwgMHhhZTgwLCAweDAwMGMsIDB4MjA5OCwgMHg2MDEwLCAweGEwODAsIDB4MDAwMiwgMHgyMGEwLAorCTB4NTNhMywgMHgyMGE5LCAweDAwMmEsIDB4NjAxMCwgMHhhMDgwLCAweDAwMDEsIDB4MjAwNCwgMHhhMDgwLAorCTB4MDAwMiwgMHgyMGEwLCAweDUzYTMsIDB4MDBlNiwgMHg2MDEwLCAweDIwMDQsIDB4MjA3MCwgMHg3MDM3LAorCTB4MDEwMywgMHgwMGVlLCAweDA4MGMsIDB4ODA3OCwgMHgwMDFlLCAweDAwMDUsIDB4MDAxNiwgMHgyMDA5LAorCTB4MDAwMCwgMHg3MDMwLCAweGEwODYsIDB4MDEwMCwgMHgwMTQwLCAweDcwMzgsIDB4YTA4NCwgMHgwMGZmLAorCTB4ODA4ZSwgMHg3MDNjLCAweGEwODQsIDB4MDBmZiwgMHg4MDg2LCAweGEwODAsIDB4MDAwNCwgMHhhMTA4LAorCTB4MjFhOCwgMHhhZTgwLCAweDAwMGMsIDB4MjA5OCwgMHg2MDEwLCAweGEwODAsIDB4MDAwMiwgMHgyMGEwLAorCTB4MDgwYywgMHg0OGJlLCAweDAwZTYsIDB4MDgwYywgMHg5NTk2LCAweDAxNDAsIDB4NjAxMCwgMHgyMDcwLAorCTB4NzAwNywgMHgwMDAwLCAweDcwMzQsIDB4NzBiMiwgMHg3MDM3LCAweDAxMDMsIDB4MDBlZSwgMHgwODBjLAorCTB4ODA3OCwgMHgwMDFlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGQ2LCAweDYwM2YsIDB4MDAwMCwgMHgyYzY4LAorCTB4MDAxNiwgMHgyMDA5LCAweDAwMzUsIDB4MDgwYywgMHg5YTM0LCAweDAwMWUsIDB4MTE2OCwgMHgwMDI2LAorCTB4NjIyOCwgMHgyMjY4LCAweDAwMmUsIDB4MjA3MSwgMHhiMjhjLCAweDZiMWMsIDB4YTM4NiwgMHgwMDAzLAorCTB4MDEzMCwgMHhhMzg2LCAweDAwMDYsIDB4MDEyOCwgMHgwODBjLCAweDgwNzgsIDB4MDAyMCwgMHgwMDMxLAorCTB4MDAxMCwgMHgwODBjLCAweDgzMjMsIDB4MDBkZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBmNiwgMHg2ODEwLAorCTB4MjA3OCwgMHhhMTg2LCAweDAwMTUsIDB4MDkwNCwgMHg4MzBjLCAweGExOGUsIDB4MDAxNiwgMHgxOTA0LAorCTB4ODMyMSwgMHg3MDBjLCAweGEwODQsIDB4ZmYwMCwgMHhhMDg2LCAweDE3MDAsIDB4MTkwNCwgMHg4MmViLAorCTB4OGZmZiwgMHgwOTA0LCAweDgzMWYsIDB4NjgwOCwgMHhhMDg2LCAweGZmZmYsIDB4MTkwNCwgMHg4MzBlLAorCTB4Nzg0YywgMHhhMDg0LCAweDAwNjAsIDB4YTA4NiwgMHgwMDIwLCAweDExNTAsIDB4Nzk3YywgMHg3ODEwLAorCTB4YTEwNiwgMHgxOTA0LCAweDgzMGUsIDB4Nzk4MCwgMHg3ODE0LCAweGExMDYsIDB4MTkwNCwgMHg4MzBlLAorCTB4MDgwYywgMHg5NzQyLCAweDY4NTgsIDB4Nzg1MiwgMHg3ODRjLCAweGMwZGMsIDB4YzBmNCwgMHhjMGQ0LAorCTB4Nzg0ZSwgMHgwMDI2LCAweGEwMGUsIDB4NmExNCwgMHgyMDAxLCAweDAwMGEsIDB4MDgwYywgMHg2NjY1LAorCTB4Nzg1NCwgMHhhMjBhLCAweDAyMDgsIDB4ODAxMSwgMHg3YTU2LCAweDgyZmYsIDB4MDAyZSwgMHgxMTM4LAorCTB4MDBjNiwgMHgyZDYwLCAweDA4MGMsIDB4OTM3NCwgMHgwMGNlLCAweDA4MDQsIDB4ODMxZiwgMHgwMGM2LAorCTB4MDBkNiwgMHgyZjY4LCAweDY4MzgsIDB4ZDBmYywgMHgxMTE4LCAweDA4MGMsIDB4NDk5MywgMHgwMDEwLAorCTB4MDgwYywgMHg0YjdjLCAweDAwZGUsIDB4MDBjZSwgMHgxNTQ4LCAweDAwYzYsIDB4MmQ2MCwgMHgwODBjLAorCTB4ODA3OCwgMHgwMGNlLCAweDA0YTAsIDB4NzAwOCwgMHhhMDg2LCAweDAwMGIsIDB4MTFhMCwgMHg2MDE4LAorCTB4MjAwYywgMHhjMWJjLCAweDIxMDIsIDB4MDBjNiwgMHgyZDYwLCAweDc4NTMsIDB4MDAwMywgMHg2MDA3LAorCTB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAxZiwgMHgwMDAyLCAweDA4MGMsIDB4NjdhOCwgMHgwODBjLAorCTB4NmM1MCwgMHgwMGNlLCAweDAwZTAsIDB4NzAwYywgMHhhMDg2LCAweDJhMDAsIDB4MTEzOCwgMHgyMDAxLAorCTB4YWZhNSwgMHgyMDA0LCAweDY4M2UsIDB4MDA5OCwgMHgwNDcxLCAweDAwOTgsIDB4OGZmZiwgMHgwOTBjLAorCTB4MTRmNiwgMHgwMGM2LCAweDAwZDYsIDB4MmQ2MCwgMHgyZjY4LCAweDY4NGIsIDB4MDAwMywgMHgwODBjLAorCTB4OTI2ZiwgMHgwODBjLCAweDk3NDIsIDB4MDgwYywgMHg5NzRlLCAweDAwZGUsIDB4MDBjZSwgMHgwODBjLAorCTB4ODA3OCwgMHgwMGZlLCAweDAwMDUsIDB4YTE4NiwgMHgwMDE1LCAweDExMjgsIDB4MjAwMSwgMHhhZmE1LAorCTB4MjAwNCwgMHg2ODNlLCAweDAwNjgsIDB4YTE4ZSwgMHgwMDE2LCAweDExNjAsIDB4MDBjNiwgMHgyZDAwLAorCTB4MjA2MCwgMHgwODBjLCAweGFiYjQsIDB4MDgwYywgMHg2NjE4LCAweDA4MGMsIDB4ODA3OCwgMHgwMGNlLAorCTB4MDgwYywgMHg4MDc4LCAweDAwMDUsIDB4MDAyNiwgMHgwMDM2LCAweDAwNDYsIDB4NzIyOCwgMHg3YzgwLAorCTB4N2I3YywgMHhkMmY0LCAweDAxMzAsIDB4MjAwMSwgMHhhZmE1LCAweDIwMDQsIDB4NjgzZSwgMHgwODA0LAorCTB4ODM5ZCwgMHgwMGM2LCAweDJkNjAsIDB4MDgwYywgMHg5MjhmLCAweDAwY2UsIDB4NjgwNCwgMHhhMDg2LAorCTB4MDA1MCwgMHgxMTY4LCAweDAwYzYsIDB4MmQwMCwgMHgyMDYwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDA1MCwgMHgwODBjLCAweDY3YTgsIDB4MDgwYywgMHg2YzUwLCAweDAwY2UsIDB4MDRmMCwgMHg2ODAwLAorCTB4YTA4NiwgMHgwMDBmLCAweDAxYzgsIDB4OGZmZiwgMHgwOTBjLCAweDE0ZjYsIDB4NjgyMCwgMHhkMGRjLAorCTB4MTE5OCwgMHg2ODAwLCAweGEwODYsIDB4MDAwNCwgMHgxMTk4LCAweDc4NGMsIDB4ZDBhYywgMHgwMTgwLAorCTB4Nzg0YywgMHhjMGRjLCAweGMwZjQsIDB4Nzg0ZSwgMHg3ODUwLCAweGMwZjQsIDB4YzBmYywgMHg3ODUyLAorCTB4MjAwMSwgMHgwMDAxLCAweDY4MmUsIDB4MDBlMCwgMHgyMDAxLCAweDAwMDcsIDB4NjgyZSwgMHgwMGMwLAorCTB4Nzg0YywgMHhkMGI0LCAweDExMzAsIDB4ZDBhYywgMHgwZGI4LCAweDc4NGMsIDB4ZDBmNCwgMHgxZGEwLAorCTB4MGMzOCwgMHhkMmVjLCAweDFkODgsIDB4NzAyNCwgMHhhMzA2LCAweDExMTgsIDB4NzAyMCwgMHhhNDA2LAorCTB4MGQ1OCwgMHg3MDIwLCAweDY4MzYsIDB4NzAyNCwgMHg2ODNhLCAweDIwMDEsIDB4MDAwNSwgMHg2ODJlLAorCTB4MDgwYywgMHg5ODk0LCAweDA4MGMsIDB4NmM1MCwgMHgwMDEwLCAweDA4MGMsIDB4ODA3OCwgMHgwMDRlLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGQ2LCAweDAwMjYsIDB4NjAzNCwgMHgyMDY4LAorCTB4NmExYywgMHhhMjg2LCAweDAwMDcsIDB4MDkwNCwgMHg4M2VlLCAweGEyODYsIDB4MDAwMiwgMHgwNWYwLAorCTB4YTI4NiwgMHgwMDAwLCAweDA1ZDgsIDB4NjgwOCwgMHg2MzM4LCAweGEzMDYsIDB4MTViOCwgMHgyMDcxLAorCTB4YjI4YywgMHhhMTg2LCAweDAwMTUsIDB4MDU2MCwgMHhhMThlLCAweDAwMTYsIDB4MTE5MCwgMHg2MDMwLAorCTB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwMSwgMHgxMTYwLCAweDcwMGMsIDB4YTA4NiwgMHgyYTAwLAorCTB4MTE0MCwgMHg2MDM0LCAweGEwODAsIDB4MDAwOCwgMHgyMDBjLCAweGMxZGQsIDB4YzFmNSwgMHgyMTAyLAorCTB4MDBiOCwgMHgwMGM2LCAweDYwMzQsIDB4MjA2MCwgMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5NTk2LAorCTB4MDkwYywgMHgxNGY2LCAweDY4NTMsIDB4MDAwMywgMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLAorCTB4NjAxZiwgMHgwMDAyLCAweDA4MGMsIDB4NjdhOCwgMHgwODBjLCAweDZjNTAsIDB4MDBjZSwgMHgwMDMwLAorCTB4NjAzNCwgMHgyMDcwLCAweDIwMDEsIDB4YWZhNSwgMHgyMDA0LCAweDcwM2UsIDB4MDgwYywgMHg4MDc4LAorCTB4MDAyZSwgMHgwMGRlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGQ2LCAweDIwYTksIDB4MDAwZSwgMHgyZTk4LAorCTB4NjAxMCwgMHgyMGEwLCAweDUzYTMsIDB4YTFiNiwgMHgwMDE1LCAweDExNDgsIDB4NjAxOCwgMHgyMDY4LAorCTB4NzAzOCwgMHg2ODBhLCAweDcwM2MsIDB4NjgwZSwgMHg2ODAwLCAweGMwOGQsIDB4NjgwMiwgMHgwMGRlLAorCTB4MDgwNCwgMHg4MWY2LCAweDIxMDAsIDB4YTFiMiwgMHgwMDgwLCAweDFhMGMsIDB4MTRmNiwgMHhhMWIyLAorCTB4MDA0MCwgMHgxYTA0LCAweDg0NmUsIDB4MDAwMiwgMHg4NDYyLCAweDg0NTYsIDB4ODQ2MiwgMHg4NDYyLAorCTB4ODQ2MiwgMHg4NDYyLCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LAorCTB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LAorCTB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LAorCTB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsIDB4ODQ2MiwgMHg4NDU0LCAweDg0NjIsIDB4ODQ2MiwgMHg4NDU0LAorCTB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDYyLCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LAorCTB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsIDB4ODQ2MiwgMHg4NDYyLAorCTB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LAorCTB4ODQ1NCwgMHg4NDYyLCAweDg0NTQsIDB4ODQ1NCwgMHgwODBjLCAweDE0ZjYsIDB4NjAwMywgMHgwMDAxLAorCTB4NjEwNiwgMHgwODBjLCAweDY3ZWUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2YzUwLAorCTB4MDEyZSwgMHgwMDA1LCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDA4MGMsIDB4NjdlZSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NmM1MCwgMHgwMTJlLCAweDAwMDUsIDB4MjYwMCwgMHgwMDAyLAorCTB4ODQ2MiwgMHg4NDc2LCAweDg0NzYsIDB4ODQ2MiwgMHg4NDYyLCAweDg0NzYsIDB4MDgwYywgMHgxNGY2LAorCTB4NjAwNCwgMHhhMGIyLCAweDAwODAsIDB4MWEwYywgMHgxNGY2LCAweGExYjYsIDB4MDAxMywgMHgwOTA0LAorCTB4ODUxOCwgMHhhMWI2LCAweDAwMjcsIDB4MTkwNCwgMHg4NGRlLCAweDA4MGMsIDB4NmI3MywgMHg2MDA0LAorCTB4MDgwYywgMHg5Nzc4LCAweDAxODgsIDB4MDgwYywgMHg5Nzg5LCAweDA5MDQsIDB4ODRkOCwgMHhhMDhlLAorCTB4MDAyMSwgMHgwOTA0LCAweDg0ZGIsIDB4YTA4ZSwgMHgwMDIyLCAweDA5MDQsIDB4ODRkOCwgMHhhMDhlLAorCTB4MDAzZCwgMHgwOTA0LCAweDg0ZGIsIDB4MDRhOCwgMHgwODBjLCAweDJhZmYsIDB4MjAwMSwgMHgwMDA3LAorCTB4MDgwYywgMHg0YzMwLCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMGMsIDB4MDgwYywgMHg4NWYzLAorCTB4YTE4NiwgMHgwMDdlLCAweDExNDgsIDB4MjAwMSwgMHhhZDM0LCAweDIwMTQsIDB4YzI4NSwgMHgwODBjLAorCTB4NTc0ZiwgMHgxMTA4LCAweGMyYWQsIDB4MjIwMiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgyMTEwLAorCTB4MjAxOSwgMHgwMDI4LCAweDA4MGMsIDB4NjhlNywgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgwODBjLAorCTB4NjgxZCwgMHgwMGM2LCAweDYwMTgsIDB4YTA2NSwgMHgwMTEwLCAweDA4MGMsIDB4NGVjZiwgMHgwMGNlLAorCTB4MmMwOCwgMHgwODBjLCAweGE3MTIsIDB4MDA3ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwODBjLAorCTB4NGM5ZiwgMHgwODBjLCAweDk5NGUsIDB4MDgwYywgMHg4MDc4LCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LAorCTB4MDgwYywgMHg4NWYzLCAweDBjYjAsIDB4MDgwYywgMHg4NjIxLCAweDBjOTgsIDB4YTE4NiwgMHgwMDE0LAorCTB4MWRiMCwgMHgwODBjLCAweDZiNzMsIDB4MDgwYywgMHgyYWQ5LCAweDA4MGMsIDB4OTc3OCwgMHgxMTg4LAorCTB4MDgwYywgMHgyYWZmLCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMGMsIDB4MDgwYywgMHg4NWYzLAorCTB4YTE4NiwgMHgwMDdlLCAweDExMjgsIDB4MjAwMSwgMHhhZDM0LCAweDIwMGMsIDB4YzE4NSwgMHgyMTAyLAorCTB4MDhjMCwgMHgwODBjLCAweDk3ODksIDB4MTExOCwgMHgwODBjLCAweDg1ZjMsIDB4MDg5MCwgMHg2MDA0LAorCTB4YTA4ZSwgMHgwMDMyLCAweDExNTgsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzEsIDB4YWQ4MSwgMHgyMDc5LAorCTB4MDAwMCwgMHgwODBjLCAweDJkZjEsIDB4MDBmZSwgMHgwMGVlLCAweDA4MTgsIDB4NjAwNCwgMHhhMDhlLAorCTB4MDAyMSwgMHgwZDUwLCAweGEwOGUsIDB4MDAyMiwgMHgwOTBjLCAweDg1ZjMsIDB4MDgwNCwgMHg4NGQxLAorCTB4YTBiMiwgMHgwMDQwLCAweDFhMDQsIDB4ODVkYiwgMHgyMDA4LCAweDAwMDIsIDB4ODU2MCwgMHg4NTYxLAorCTB4ODU2NCwgMHg4NTY3LCAweDg1NmEsIDB4ODU2ZCwgMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTVlLAorCTB4ODU1ZSwgMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTVlLAorCTB4ODU1ZSwgMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTVlLAorCTB4ODU1ZSwgMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTcwLCAweDg1N2YsIDB4ODU1ZSwgMHg4NTgxLAorCTB4ODU3ZiwgMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTVlLCAweDg1NWUsIDB4ODU3ZiwgMHg4NTdmLAorCTB4ODU1ZSwgMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTVlLAorCTB4ODViYiwgMHg4NTdmLCAweDg1NWUsIDB4ODU3YiwgMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTdjLAorCTB4ODU1ZSwgMHg4NTVlLCAweDg1NWUsIDB4ODU3ZiwgMHg4NWIyLCAweDg1NWUsIDB4MDgwYywgMHgxNGY2LAorCTB4MDBmMCwgMHgyMDAxLCAweDAwMGIsIDB4MDQ2MCwgMHgyMDAxLCAweDAwMDMsIDB4MDQ0OCwgMHgyMDAxLAorCTB4MDAwNSwgMHgwNDMwLCAweDIwMDEsIDB4MDAwMSwgMHgwNDE4LCAweDIwMDEsIDB4MDAwOSwgMHgwNDAwLAorCTB4MDgwYywgMHg2YjczLCAweDYwMDMsIDB4MDAwNSwgMHgyMDAxLCAweGFmYTUsIDB4MjAwNCwgMHg2MDNlLAorCTB4MDgwYywgMHg2YzUwLCAweDAwYTAsIDB4MDAxOCwgMHgwMDEwLCAweDA4MGMsIDB4NGMzMCwgMHgwODA0LAorCTB4ODVjYywgMHgwODBjLCAweDZiNzMsIDB4MjAwMSwgMHhhZmEzLCAweDIwMDQsIDB4NjAxNiwgMHgyMDAxLAorCTB4YWZhNSwgMHgyMDA0LCAweDYwM2UsIDB4NjAwMywgMHgwMDA0LCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LAorCTB4MDgwYywgMHg0YzMwLCAweDA4MGMsIDB4NmI3MywgMHg2MDAzLCAweDAwMDIsIDB4MjAwMSwgMHhhZmE1LAorCTB4MjAwNCwgMHg2MDNlLCAweDAwMzYsIDB4MjAxOSwgMHhhZDVjLCAweDIzMDQsIDB4YTA4NCwgMHhmZjAwLAorCTB4MTEyMCwgMHgyMDAxLCAweGFmYTMsIDB4MjAxYywgMHgwMDQwLCAweDgwMDcsIDB4YTA5YSwgMHgwMDA0LAorCTB4MGVjMCwgMHg4MDAzLCAweDgwMWIsIDB4ODMxYiwgMHhhMzE4LCAweDYzMTYsIDB4MDAzZSwgMHgwODBjLAorCTB4NmM1MCwgMHgwOGU4LCAweDA4MGMsIDB4NmI3MywgMHgwODBjLCAweDk5NGUsIDB4MDgwYywgMHg4MDc4LAorCTB4MDgwYywgMHg2YzUwLCAweDA4YTAsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzEsIDB4YWQ4MSwgMHgyMDc5LAorCTB4MDAwMCwgMHgwODBjLCAweDJkZjEsIDB4MDBmZSwgMHgwMGVlLCAweDA4MGMsIDB4NmI3MywgMHgwODBjLAorCTB4ODA3OCwgMHgwODBjLCAweDZjNTAsIDB4MDgxOCwgMHgwODBjLCAweDZiNzMsIDB4MjAwMSwgMHhhZmE1LAorCTB4MjAwNCwgMHg2MDNlLCAweDYwMDMsIDB4MDAwMiwgMHgyMDAxLCAweGFmYTMsIDB4MjAwNCwgMHg2MDE2LAorCTB4MDgwYywgMHg2YzUwLCAweDAwMDUsIDB4MjYwMCwgMHgyMDA4LCAweDAwMDIsIDB4ODVlNiwgMHg4NWU0LAorCTB4ODVlNCwgMHg4NWNjLCAweDg1Y2MsIDB4ODVlNCwgMHgwODBjLCAweDE0ZjYsIDB4MDgwYywgMHg2YjczLAorCTB4MDBkNiwgMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHgxNWYwLCAweDAwZGUsIDB4MDgwYywgMHg4MDc4LAorCTB4MDgwYywgMHg2YzUwLCAweDAwMDUsIDB4MDBlNiwgMHgwMDI2LCAweDAwMTYsIDB4MDgwYywgMHg5NTk2LAorCTB4MDUwOCwgMHg2MDEwLCAweDIwNzAsIDB4NzAzNCwgMHhhMDg2LCAweDAxMzksIDB4MTE0OCwgMHgyMDAxLAorCTB4MDAzMCwgMHgyMDA5LCAweDAwMDAsIDB4MjAxMSwgMHg0MDA1LCAweDA4MGMsIDB4OWEwNSwgMHgwMDkwLAorCTB4NzAzOCwgMHhkMGZjLCAweDAxNzgsIDB4NzAwNywgMHgwMDAwLCAweDAwMTYsIDB4NjAwNCwgMHhhMDhlLAorCTB4MDAyMSwgMHgwMTYwLCAweGEwOGUsIDB4MDAzZCwgMHgwMTQ4LCAweDAwMWUsIDB4NzAzNywgMHgwMTAzLAorCTB4NzAzMywgMHgwMTAwLCAweDAwMWUsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4MDAxZSwgMHgwMDA5LAorCTB4MGNjOCwgMHgwMGU2LCAweGFjZjAsIDB4MDAwNCwgMHgyZTc0LCAweDcwMDAsIDB4MjA3MCwgMHg3MDM3LAorCTB4MDEwMywgMHg3MDIzLCAweDgwMDEsIDB4MDBlZSwgMHgwMDA1LCAweDAwZDYsIDB4NjYxOCwgMHgyNjY4LAorCTB4NjgwNCwgMHhhMDg0LCAweDAwZmYsIDB4MDBkZSwgMHhhMGIyLCAweDAwMGMsIDB4MWEwYywgMHgxNGY2LAorCTB4NjYwNCwgMHhhNmI2LCAweDAwNDMsIDB4MTEyMCwgMHgwODBjLCAweDk5YzEsIDB4MDgwNCwgMHg4NjkyLAorCTB4NjYwNCwgMHhhNmI2LCAweDAwMzMsIDB4MTEyMCwgMHgwODBjLCAweDk5NzEsIDB4MDgwNCwgMHg4NjkyLAorCTB4NjYwNCwgMHhhNmI2LCAweDAwMjgsIDB4MTEyMCwgMHgwODBjLCAweDk3YjksIDB4MDgwNCwgMHg4NjkyLAorCTB4NjYwNCwgMHhhNmI2LCAweDAwMjksIDB4MTExOCwgMHgwODBjLCAweDk3ZDAsIDB4MDRkOCwgMHg2NjA0LAorCTB4YTZiNiwgMHgwMDFmLCAweDExMTgsIDB4MDgwYywgMHg4MWRjLCAweDA0YTAsIDB4NjYwNCwgMHhhNmI2LAorCTB4MDAwMCwgMHgxMTE4LCAweDA4MGMsIDB4ODNmNCwgMHgwNDY4LCAweDY2MDQsIDB4YTZiNiwgMHgwMDIyLAorCTB4MTExOCwgMHgwODBjLCAweDgyMDQsIDB4MDQzMCwgMHg2NjA0LCAweGE2YjYsIDB4MDAzNSwgMHgxMTE4LAorCTB4MDgwYywgMHg4MjZiLCAweDAwZjgsIDB4NjYwNCwgMHhhNmI2LCAweDAwMzksIDB4MTExOCwgMHgwODBjLAorCTB4ODNhMywgMHgwMGMwLCAweDY2MDQsIDB4YTZiNiwgMHgwMDNkLCAweDExMTgsIDB4MDgwYywgMHg4MjFlLAorCTB4MDA4OCwgMHg2NjA0LCAweGE2YjYsIDB4MDA0NCwgMHgxMTE4LCAweDA4MGMsIDB4ODIzZSwgMHgwMDUwLAorCTB4YTFiNiwgMHgwMDE1LCAweDExMTAsIDB4MDA1MywgMHgwMDI4LCAweGExYjYsIDB4MDAxNiwgMHgxMTE4LAorCTB4MDgwNCwgMHg4ODNmLCAweDAwMDUsIDB4MDgwYywgMHg4MGJlLCAweDBjZTAsIDB4ODZiOSwgMHg4NmJjLAorCTB4ODZiOSwgMHg4NmZlLCAweDg2YjksIDB4ODdjYywgMHg4ODRkLCAweDg2YjksIDB4ODZiOSwgMHg4ODFiLAorCTB4ODZiOSwgMHg4ODJmLCAweGExYjYsIDB4MDA0OCwgMHgwMTQwLCAweDIwZTEsIDB4MDAwNSwgMHgzZDE4LAorCTB4M2UyMCwgMHgyYzEwLCAweDA4MGMsIDB4MTgyNCwgMHgwMDA1LCAweDAwZTYsIDB4YWNmMCwgMHgwMDA0LAorCTB4MmU3NCwgMHg3MDAwLCAweDIwNzAsIDB4NzAzNywgMHgwMTAzLCAweDAwZWUsIDB4MDgwYywgMHg4MDc4LAorCTB4MDAwNSwgMHhlMDAwLCAweGUwMDAsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4YWQwMCwgMHg3MDgwLAorCTB4YTA4NiwgMHgwMDc0LCAweDE1MzAsIDB4MDgwYywgMHhhNmU5LCAweDExYjAsIDB4MDBkNiwgMHg2MDE4LAorCTB4MjA2OCwgMHg3MDMwLCAweGQwOGMsIDB4MDEyOCwgMHg2ODAwLCAweGQwYmMsIDB4MDExMCwgMHhjMGM1LAorCTB4NjgwMiwgMHgwMGQ5LCAweDAwZGUsIDB4MjAwMSwgMHgwMDA2LCAweDA4MGMsIDB4NGMzMCwgMHgwODBjLAorCTB4MmFmZiwgMHgwODBjLCAweDgwNzgsIDB4MDA3OCwgMHgyMDAxLCAweDAwMGEsIDB4MDgwYywgMHg0YzMwLAorCTB4MDgwYywgMHgyYWZmLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDEsIDB4MDgwYywgMHg2N2VlLAorCTB4MDAxMCwgMHgwODBjLCAweDg3YmQsIDB4MDBlZSwgMHgwMDA1LCAweDY4MDAsIDB4ZDA4NCwgMHgwMTY4LAorCTB4MjAwMSwgMHgwMDAwLCAweDA4MGMsIDB4NGMxZSwgMHgyMDY5LCAweGFkNTEsIDB4NjgwNCwgMHhkMGE0LAorCTB4MDEyMCwgMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg0YzVkLCAweDAwMDUsIDB4MDBkNiwgMHgyMDExLAorCTB4YWQyMCwgMHgyMjA0LCAweGEwODYsIDB4MDA3NCwgMHgxOTA0LCAweDg3YmEsIDB4NjAxOCwgMHgyMDY4LAorCTB4NmFhMCwgMHhhMjg2LCAweDAwN2UsIDB4MTEyMCwgMHgwODBjLCAweDg5NGQsIDB4MDgwNCwgMHg4NzVlLAorCTB4MDgwYywgMHg4OTQzLCAweDYwMTgsIDB4MjA2OCwgMHhhMDgwLCAweDAwMjgsIDB4MjAxNCwgMHhhMjg2LAorCTB4MDA4MCwgMHgxMWMwLCAweDY4MTMsIDB4MDBmZiwgMHg2ODE3LCAweGZmZmMsIDB4NjAxMCwgMHhhMDA1LAorCTB4MDEzOCwgMHgyMDY4LCAweDY4MDcsIDB4MDAwMCwgMHg2ODM3LCAweDAxMDMsIDB4NjgzMywgMHgwMjAwLAorCTB4MjAwMSwgMHgwMDA2LCAweDA4MGMsIDB4NGMzMCwgMHgwODBjLCAweDJhZmYsIDB4MDgwYywgMHg4MDc4LAorCTB4MDgwNCwgMHg4N2JiLCAweDAwZTYsIDB4MjA3MSwgMHhhZDM0LCAweDJlMDQsIDB4ZDA5YywgMHgwMTg4LAorCTB4MjA3MSwgMHhiMjgwLCAweDcxMDgsIDB4NzIwYywgMHhhMThjLCAweDAwZmYsIDB4MTExOCwgMHhhMjg0LAorCTB4ZmYwMCwgMHgwMTM4LCAweDYwMTgsIDB4MjA3MCwgMHg3MGEwLCAweGQwYmMsIDB4MTExMCwgMHg3MTEyLAorCTB4NzIxNiwgMHgwMGVlLCAweDYwMTAsIDB4YTAwNSwgMHgwMTI4LCAweDIwNjgsIDB4NjgzOCwgMHhkMGY0LAorCTB4MDEwOCwgMHgwODgwLCAweDIwMDEsIDB4MDAwNCwgMHgwODBjLCAweDRjMzAsIDB4NjAwMywgMHgwMDAxLAorCTB4NjAwNywgMHgwMDAzLCAweDA4MGMsIDB4NjdlZSwgMHgwODA0LCAweDg3YmIsIDB4Njg1YywgMHhkMGU0LAorCTB4MDFkMCwgMHgwODBjLCAweDk5MDMsIDB4MDgwYywgMHg1NzRmLCAweDAxMTAsIDB4ZDBkYywgMHgxOTAwLAorCTB4MjAxMSwgMHhhZDM0LCAweDIyMDQsIDB4YzBhZCwgMHgyMDEyLCAweDIwMDEsIDB4YWY4ZSwgMHgyMDA0LAorCTB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4NzhlMywgMHgwMDAwLCAweDA4MGMsIDB4MjZjYiwgMHg3OGUyLAorCTB4MDBmZSwgMHgwODA0LCAweDg3MjgsIDB4MDgwYywgMHg5OTM3LCAweDIwMTEsIDB4YWQzNCwgMHgyMjA0LAorCTB4YzBhNSwgMHgyMDEyLCAweDAwMDYsIDB4MDgwYywgMHhhODAxLCAweDAwMGUsIDB4MTkwNCwgMHg4NzI4LAorCTB4YzBiNSwgMHgyMDEyLCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLCAweDRjMWUsIDB4MDBjNiwgMHgyMDA5LAorCTB4MDBlZiwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHg3OWVhLCAweDc5MzIsIDB4NzkzNiwgMHgwMGZlLAorCTB4MDgwYywgMHgyNmEwLCAweDAwZjYsIDB4MjA3OSwgMHhhZDAwLCAweDc5NzIsIDB4MjEwMCwgMHgyMDA5LAorCTB4MDAwMCwgMHgwODBjLCAweDI2NzYsIDB4Nzk0ZSwgMHgwMGZlLCAweDgxMDgsIDB4MDgwYywgMHg0YzgwLAorCTB4MmMwMCwgMHgwMGNlLCAweDE5MDQsIDB4ODcyOCwgMHg2MDFhLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLAorCTB4NGMzMCwgMHg2MDFmLCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMiwgMHgwODBjLAorCTB4NjdlZSwgMHgwMDA4LCAweDAwMTEsIDB4MDBkZSwgMHgwMDA1LCAweDIwMDEsIDB4YWQwMCwgMHgyMDA0LAorCTB4YTA4NiwgMHgwMDAzLCAweDAxMjAsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NGMzMCwgMHgwODBjLAorCTB4MmFmZiwgMHgwODBjLCAweDgwNzgsIDB4MDAwNSwgMHgwMGU2LCAweDAwMjYsIDB4MDAxNiwgMHgyMDcxLAorCTB4YWQwMCwgMHg3MDgwLCAweGEwODYsIDB4MDAxNCwgMHgxNWYwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLAorCTB4MTEyOCwgMHg2MDEwLCAweGEwMDUsIDB4MTExMCwgMHgwODBjLCAweDNjY2UsIDB4MDBkNiwgMHg2MDE4LAorCTB4MjA2OCwgMHgwODBjLCAweDRkNzIsIDB4MDgwYywgMHg4NmVkLCAweDAwZGUsIDB4MDgwYywgMHg4OWY3LAorCTB4MTU1MCwgMHgwMGQ2LCAweDYwMTgsIDB4MjA2OCwgMHg2ODkwLCAweDAwZGUsIDB4YTAwNSwgMHgwNTE4LAorCTB4MjAwMSwgMHgwMDA2LCAweDA4MGMsIDB4NGMzMCwgMHgwMGU2LCAweDYwMTAsIDB4YTA3NSwgMHgwMWE4LAorCTB4NzAzNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDM5LCAweDExNDgsIDB4MjAwMSwgMHgwMDAwLAorCTB4MjAwOSwgMHgwMDAwLCAweDIwMTEsIDB4NDAwMCwgMHgwODBjLCAweDlhMDUsIDB4MDAzMCwgMHg3MDA3LAorCTB4MDAwMCwgMHg3MDM3LCAweDAxMDMsIDB4NzAzMywgMHgwMjAwLCAweDAwZWUsIDB4MDgwYywgMHgyYWZmLAorCTB4MDgwYywgMHg4MDc4LCAweDAwMjAsIDB4MDgwYywgMHg4NWYzLCAweDA4MGMsIDB4ODdiZCwgMHgwMDFlLAorCTB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4MjAxMSwgMHhhZDIwLCAweDIyMDQsIDB4YTA4NiwgMHgwMDE0LAorCTB4MTE1OCwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg0YzMwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDAwMSwgMHgwODBjLCAweDY3ZWUsIDB4MDAxMCwgMHgwODBjLCAweDg3YmQsIDB4MDAwNSwgMHgyMDExLAorCTB4YWQyMCwgMHgyMjA0LCAweGEwODYsIDB4MDAwNCwgMHgxMTM4LCAweDIwMDEsIDB4MDAwNywgMHgwODBjLAorCTB4NGMzMCwgMHgwODBjLCAweDgwNzgsIDB4MDAxMCwgMHgwODBjLCAweDg3YmQsIDB4MDAwNSwgMHgwMDBiLAorCTB4MDAwNSwgMHg4NmI5LCAweDg4NTQsIDB4ODZiOSwgMHg4ODhhLCAweDg2YjksIDB4ODhmZiwgMHg4ODRkLAorCTB4ODZiOSwgMHg4NmI5LCAweDg5MTIsIDB4ODZiOSwgMHg4OTIyLCAweDY2MDQsIDB4YTZiNiwgMHgwMDFlLAorCTB4MTExMCwgMHgwODBjLCAweDgwNzgsIDB4MDAwNSwgMHgwMGQ2LCAweDAwYzYsIDB4MDgwYywgMHg4OTMyLAorCTB4MTE3OCwgMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHg0YzFlLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLAorCTB4NGMzMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAyLCAweDA4MGMsIDB4NjdlZSwgMHgwMGY4LAorCTB4MjAwOSwgMHhiMjhlLCAweDIxMDQsIDB4YTA4NiwgMHgwMDA5LCAweDExNjAsIDB4NjAxOCwgMHgyMDY4LAorCTB4Njg0MCwgMHhhMDg0LCAweDAwZmYsIDB4YTAwNSwgMHgwMTgwLCAweDgwMDEsIDB4Njg0MiwgMHg2MDE3LAorCTB4MDAwYSwgMHgwMDY4LCAweDIwMDksIDB4YjI4ZiwgMHgyMTA0LCAweGEwODQsIDB4ZmYwMCwgMHhhMDg2LAorCTB4MTkwMCwgMHgxMTE4LCAweDA4MGMsIDB4ODA3OCwgMHgwMDEwLCAweDA4MGMsIDB4ODdiZCwgMHgwMGNlLAorCTB4MDBkZSwgMHgwMDA1LCAweDA4MGMsIDB4ODk0MCwgMHgwMGQ2LCAweDIwNjksIDB4YWY5ZCwgMHgyZDA0LAorCTB4YTAwNSwgMHgwMTY4LCAweDYwMTgsIDB4MjA2OCwgMHg2OGEwLCAweGEwODYsIDB4MDA3ZSwgMHgxMTM4LAorCTB4MjA2OSwgMHhhZDFjLCAweDJkMDQsIDB4ODAwMCwgMHgyMDZhLCAweDAwZGUsIDB4MDAxMCwgMHgwMGRlLAorCTB4MDA3OCwgMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHg0YzFlLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLAorCTB4NGMzMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAyLCAweDA4MGMsIDB4NjdlZSwgMHgwNDI4LAorCTB4MDgwYywgMHg4NWYzLCAweDIwMDksIDB4YjI4ZSwgMHgyMTM0LCAweGE2YjQsIDB4MDBmZiwgMHhhNjg2LAorCTB4MDAwNSwgMHgwMWUwLCAweGE2ODYsIDB4MDAwYiwgMHgwMWIwLCAweDIwMDksIDB4YjI4ZiwgMHgyMTA0LAorCTB4YTA4NCwgMHhmZjAwLCAweDExMTgsIDB4YTY4NiwgMHgwMDA5LCAweDAxODAsIDB4YTA4NiwgMHgxOTAwLAorCTB4MTE1MCwgMHhhNjg2LCAweDAwMDksIDB4MDE1MCwgMHgyMDAxLCAweDAwMDQsIDB4MDgwYywgMHg0YzMwLAorCTB4MDgwYywgMHg4MDc4LCAweDAwMTAsIDB4MDgwYywgMHg4N2JkLCAweDAwMDUsIDB4MDBkNiwgMHg2MDEwLAorCTB4MjA2OCwgMHgwODBjLCAweDk1OTYsIDB4MDEyOCwgMHg2ODM4LCAweGQwZmMsIDB4MDExMCwgMHgwMGRlLAorCTB4MGM5MCwgMHg2MDE4LCAweDIwNjgsIDB4Njg0MCwgMHhhMDg0LCAweDAwZmYsIDB4YTAwNSwgMHgwMTQwLAorCTB4ODAwMSwgMHg2ODQyLCAweDYwMTcsIDB4MDAwYSwgMHg2MDA3LCAweDAwMTYsIDB4MDBkZSwgMHgwYzI4LAorCTB4NjhhMCwgMHhhMDg2LCAweDAwN2UsIDB4MTEzOCwgMHgwMGU2LCAweDIwNzEsIDB4YWQwMCwgMHgwODBjLAorCTB4NDhmNSwgMHgwMGVlLCAweDAwMTAsIDB4MDgwYywgMHgyYWQ5LCAweDAwZGUsIDB4MDhhMCwgMHgwODBjLAorCTB4ODk0MCwgMHgxMTU4LCAweDIwMDEsIDB4MDAwNCwgMHgwODBjLCAweDRjMzAsIDB4NjAwMywgMHgwMDAxLAorCTB4NjAwNywgMHgwMDAzLCAweDA4MGMsIDB4NjdlZSwgMHgwMDIwLCAweDA4MGMsIDB4ODVmMywgMHgwODBjLAorCTB4ODdiZCwgMHgwMDA1LCAweDA0NjksIDB4MTE1OCwgMHgyMDAxLCAweDAwMDgsIDB4MDgwYywgMHg0YzMwLAorCTB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwNSwgMHgwODBjLCAweDY3ZWUsIDB4MDAxMCwgMHgwODBjLAorCTB4ODdiZCwgMHgwMDA1LCAweDAwZTksIDB4MTE1OCwgMHgyMDAxLCAweDAwMGEsIDB4MDgwYywgMHg0YzMwLAorCTB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHgwODBjLCAweDY3ZWUsIDB4MDAxMCwgMHgwODBjLAorCTB4ODdiZCwgMHgwMDA1LCAweDIwMDksIDB4YjI4ZSwgMHgyMTA0LCAweGEwODYsIDB4MDAwMywgMHgxMTM4LAorCTB4MjAwOSwgMHhiMjhmLCAweDIxMDQsIDB4YTA4NCwgMHhmZjAwLCAweGEwODYsIDB4MmEwMCwgMHgwMDA1LAorCTB4YTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDBjNiwgMHgwMDE2LCAweGFjODgsIDB4MDAwNiwgMHgyMTY0LAorCTB4MDgwYywgMHg0Y2ViLCAweDAwMWUsIDB4MDBjZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LAorCTB4MDAzNiwgMHgwMDE2LCAweDYwMTgsIDB4MjA2OCwgMHgyMDcxLCAweGFkMzQsIDB4MmUwNCwgMHhhMDg1LAorCTB4MDAwMywgMHgyMDcyLCAweDA4MGMsIDB4ODljYywgMHgwNTM4LCAweDIwMDEsIDB4YWQ1MiwgMHgyMDA0LAorCTB4ZDBhNCwgMHgwMTU4LCAweGEwMDYsIDB4MjAyMCwgMHgyMDA5LCAweDAwMmEsIDB4MDgwYywgMHhhOTZjLAorCTB4MjAwMSwgMHhhZDBjLCAweDIwMGMsIDB4YzE5NSwgMHgyMTAyLCAweDIwMTksIDB4MDAyYSwgMHgyMDA5LAorCTB4MDAwMSwgMHgwODBjLCAweDJhYWMsIDB4MjA3MSwgMHhhZDAwLCAweDA4MGMsIDB4MjhmYSwgMHgwMGM2LAorCTB4MDE1NiwgMHgyMGE5LCAweDAwODEsIDB4MjAwOSwgMHgwMDdmLCAweDA4MGMsIDB4MmJjOSwgMHg4MTA4LAorCTB4MWYwNCwgMHg4OTdkLCAweDAxNWUsIDB4MDBjZSwgMHgwODBjLCAweDg5NDMsIDB4NjgxMywgMHgwMGZmLAorCTB4NjgxNywgMHhmZmZlLCAweDIwNzEsIDB4YjI4MCwgMHgyMDc5LCAweDAxMDAsIDB4MmUwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHgyMDY5LCAweGFkMWIsIDB4MjA2YSwgMHg3OGU2LCAweDAwMDYsIDB4OGU3MCwgMHgyZTA0LAorCTB4MjA2OSwgMHhhZDFjLCAweDIwNmEsIDB4NzhlYSwgMHg3ODMyLCAweDc4MzYsIDB4MjAxMCwgMHhhMDg0LAorCTB4ZmYwMCwgMHgwMDFlLCAweGExMDUsIDB4MjAwOSwgMHhhZDI3LCAweDIwMGEsIDB4MjIwMCwgMHhhMDg0LAorCTB4MDBmZiwgMHgyMDA4LCAweDA4MGMsIDB4MjZhMCwgMHgwODBjLCAweDU3NGYsIDB4MDE3MCwgMHgyMDY5LAorCTB4YjI4ZSwgMHgyMDcxLCAweGFmOWYsIDB4NjgxMCwgMHgyMDcyLCAweDY4MTQsIDB4NzAwNiwgMHg2ODE4LAorCTB4NzAwYSwgMHg2ODFjLCAweDcwMGUsIDB4MDgwYywgMHg5OTAzLCAweDAwNDAsIDB4MjAwMSwgMHgwMDA2LAorCTB4MDgwYywgMHg0YzMwLCAweDA4MGMsIDB4MmFmZiwgMHgwODBjLCAweDgwNzgsIDB4MDAxZSwgMHgwMDNlLAorCTB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwMDI2LCAweDAwMzYsIDB4MDBlNiwgMHgwMTU2LAorCTB4MjAxOSwgMHhhZDI3LCAweDIzMWMsIDB4ODNmZiwgMHgwMWU4LCAweDIwNzEsIDB4YjI4MCwgMHgyZTE0LAorCTB4YTI5NCwgMHgwMGZmLCAweDcwMDQsIDB4YTA4NCwgMHhmZjAwLCAweGEyMDUsIDB4YTMwNiwgMHgxMTkwLAorCTB4MjAxMSwgMHhiMjk2LCAweGFkOTgsIDB4MDAwYSwgMHgyMGE5LCAweDAwMDQsIDB4MDgwYywgMHg4YTdjLAorCTB4MTE0OCwgMHgyMDExLCAweGIyOWEsIDB4YWQ5OCwgMHgwMDA2LCAweDIwYTksIDB4MDAwNCwgMHgwODBjLAorCTB4OGE3YywgMHgxMTAwLCAweDAxNWUsIDB4MDBlZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MjA3MSwgMHhiMjhjLCAweDcwMDQsIDB4YTA4NiwgMHgwMDE0LCAweDExYTgsIDB4NzAwOCwgMHhhMDg2LAorCTB4MDgwMCwgMHgxMTg4LCAweDcwMGMsIDB4ZDBlYywgMHgwMTYwLCAweGEwODQsIDB4MGYwMCwgMHhhMDg2LAorCTB4MDEwMCwgMHgxMTM4LCAweDcwMjQsIDB4ZDBhNCwgMHgxMTEwLCAweGQwYWMsIDB4MDExMCwgMHhhMDA2LAorCTB4MDAxMCwgMHhhMDg1LCAweDAwMDEsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LAorCTB4MDA3NiwgMHgwMDU2LCAweDAwNDYsIDB4MDAyNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjAyOSwgMHhhZmQwLCAweDI1MmMsIDB4MjAyMSwgMHhhZmQ2LCAweDI0MjQsIDB4MjA2MSwgMHhiNDAwLAorCTB4MjA3MSwgMHhhZDAwLCAweDcyNDQsIDB4NzA2NCwgMHhhMjAyLCAweDE2ZjAsIDB4MDgwYywgMHhhOTkwLAorCTB4MDVhMCwgMHg2NzFjLCAweGE3ODYsIDB4MDAwMSwgMHgwNTgwLCAweGE3ODYsIDB4MDAwNywgMHgwNTY4LAorCTB4MjUwMCwgMHhhYzA2LCAweDA1NTAsIDB4MjQwMCwgMHhhYzA2LCAweDA1MzgsIDB4MDBjNiwgMHg2MDAwLAorCTB4YTA4NiwgMHgwMDA0LCAweDExMTAsIDB4MDgwYywgMHgxOTBiLCAweGE3ODYsIDB4MDAwOCwgMHgxMTQ4LAorCTB4MDgwYywgMHg5Nzg5LCAweDExMzAsIDB4MDBjZSwgMHgwODBjLCAweDg1ZjMsIDB4MDgwYywgMHg5NzRlLAorCTB4MDBhMCwgMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5NTk2LCAweDAxNjAsIDB4YTc4NiwgMHgwMDAzLAorCTB4MTFlOCwgMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsIDB4MDgwYywgMHg1MTBjLAorCTB4MDgwYywgMHg5NzQyLCAweDA4MGMsIDB4OTc0ZSwgMHgwMGNlLCAweGFjZTAsIDB4MDAxOCwgMHg3MDU4LAorCTB4YWMwMiwgMHgxMjEwLCAweDA4MDQsIDB4OGEyYSwgMHgwMTJlLCAweDAwMGUsIDB4MDAyZSwgMHgwMDRlLAorCTB4MDA1ZSwgMHgwMDdlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwMDUsIDB4YTc4NiwgMHgwMDA2LAorCTB4MWQwMCwgMHgwODBjLCAweGE5MWYsIDB4MGMzMCwgMHgyMjBjLCAweDIzMDQsIDB4YTEwNiwgMHgxMTMwLAorCTB4ODIxMCwgMHg4MzE4LCAweDFmMDQsIDB4OGE3YywgMHhhMDA2LCAweDAwMDUsIDB4MjMwNCwgMHhhMTAyLAorCTB4MDIxOCwgMHgyMDAxLCAweDAwMDEsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDAsIDB4YTE4ZCwgMHgwMDAxLAorCTB4MDAwNSwgMHg2MDA0LCAweGEwOGEsIDB4MDA4MCwgMHgxYTBjLCAweDE0ZjYsIDB4MDgwYywgMHg5Nzc4LAorCTB4MDEyMCwgMHgwODBjLCAweDk3ODksIDB4MDE2OCwgMHgwMDI4LCAweDA4MGMsIDB4MmFmZiwgMHgwODBjLAorCTB4OTc4OSwgMHgwMTM4LCAweDA4MGMsIDB4NmI3MywgMHgwODBjLCAweDgwNzgsIDB4MDgwYywgMHg2YzUwLAorCTB4MDAwNSwgMHgwODBjLCAweDg1ZjMsIDB4MGNiMCwgMHhhMTgyLCAweDAwNDAsIDB4MDAwMiwgMHg4YWMyLAorCTB4OGFjMiwgMHg4YWMyLCAweDhhYzIsIDB4OGFjMiwgMHg4YWMyLCAweDhhYzIsIDB4OGFjMiwgMHg4YWMyLAorCTB4OGFjMiwgMHg4YWMyLCAweDhhYzQsIDB4OGFjNCwgMHg4YWM0LCAweDhhYzQsIDB4OGFjMiwgMHg4YWMyLAorCTB4OGFjMiwgMHg4YWM0LCAweDA4MGMsIDB4MTRmNiwgMHg2MDBiLCAweGZmZmYsIDB4NjAwMywgMHgwMDAxLAorCTB4NjEwNiwgMHgwODBjLCAweDY3YTgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2YzUwLAorCTB4MDEyZSwgMHgwMDA1LCAweGExODYsIDB4MDAxMywgMHgxMTI4LCAweDYwMDQsIDB4YTA4MiwgMHgwMDQwLAorCTB4MDgwNCwgMHg4YjVlLCAweGExODYsIDB4MDAyNywgMHgxMWU4LCAweDA4MGMsIDB4NmI3MywgMHgwODBjLAorCTB4MmFkOSwgMHgwMGQ2LCAweDYxMTAsIDB4MjE2OCwgMHgwODBjLCAweDk1OTYsIDB4MDE2OCwgMHg2ODM3LAorCTB4MDEwMywgMHg2ODRiLCAweDAwMjksIDB4Njg0NywgMHgwMDAwLCAweDY5NGMsIDB4YzFjNSwgMHg2OTRlLAorCTB4MDgwYywgMHg1MTBjLCAweDA4MGMsIDB4OTc0MiwgMHgwMGRlLCAweDA4MGMsIDB4ODA3OCwgMHgwODBjLAorCTB4NmM1MCwgMHgwMDA1LCAweGExODYsIDB4MDAxNCwgMHgxMTIwLCAweDYwMDQsIDB4YTA4MiwgMHgwMDQwLAorCTB4MDQyOCwgMHhhMTg2LCAweDAwNDYsIDB4MDEzOCwgMHhhMTg2LCAweDAwNDUsIDB4MDEyMCwgMHhhMTg2LAorCTB4MDA0NywgMHgxOTBjLCAweDE0ZjYsIDB4MjAwMSwgMHgwMTA5LCAweDIwMDQsIDB4ZDA4NCwgMHgwMTk4LAorCTB4MDEyNiwgMHgyMDkxLCAweDI4MDAsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDgwYywgMHg2Njk5LAorCTB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDEyZSwgMHhlMDAwLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAyLAorCTB4MTExMCwgMHgwODA0LCAweDhiOTgsIDB4MDgwYywgMHg4MGJlLCAweDAwMDUsIDB4MDAwMiwgMHg4YjNjLAorCTB4OGIzYSwgMHg4YjNhLCAweDhiM2EsIDB4OGIzYSwgMHg4YjNhLCAweDhiM2EsIDB4OGIzYSwgMHg4YjNhLAorCTB4OGIzYSwgMHg4YjNhLCAweDhiNTcsIDB4OGI1NywgMHg4YjU3LCAweDhiNTcsIDB4OGIzYSwgMHg4YjU3LAorCTB4OGIzYSwgMHg4YjU3LCAweDA4MGMsIDB4MTRmNiwgMHgwODBjLCAweDZiNzMsIDB4MDBkNiwgMHg2MTEwLAorCTB4MjE2OCwgMHgwODBjLCAweDk1OTYsIDB4MDE2OCwgMHg2ODM3LCAweDAxMDMsIDB4Njg0YiwgMHgwMDA2LAorCTB4Njg0NywgMHgwMDAwLCAweDY4NTAsIDB4YzBlYywgMHg2ODUyLCAweDA4MGMsIDB4NTEwYywgMHgwODBjLAorCTB4OTc0MiwgMHgwMGRlLCAweDA4MGMsIDB4ODA3OCwgMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHgwODBjLAorCTB4NmI3MywgMHgwODBjLCAweDgwNzgsIDB4MDgwYywgMHg2YzUwLCAweDAwMDUsIDB4MDAwMiwgMHg4Yjc0LAorCTB4OGI3MiwgMHg4YjcyLCAweDhiNzIsIDB4OGI3MiwgMHg4YjcyLCAweDhiNzIsIDB4OGI3MiwgMHg4YjcyLAorCTB4OGI3MiwgMHg4YjcyLCAweDhiODYsIDB4OGI4NiwgMHg4Yjg2LCAweDhiODYsIDB4OGI3MiwgMHg4YjkxLAorCTB4OGI3MiwgMHg4Yjg2LCAweDA4MGMsIDB4MTRmNiwgMHgwODBjLCAweDZiNzMsIDB4MjAwMSwgMHhhZmE1LAorCTB4MjAwNCwgMHg2MDNlLCAweDYwMDMsIDB4MDAwMiwgMHgwODBjLCAweDZjNTAsIDB4NjAxMCwgMHhhMDg4LAorCTB4MDAxMywgMHgyMTA0LCAweGEwODUsIDB4MDQwMCwgMHgyMDBhLCAweDAwMDUsIDB4MDgwYywgMHg2YjczLAorCTB4MjAwMSwgMHhhZmE1LCAweDIwMDQsIDB4NjAzZSwgMHg2MDAzLCAweDAwMGYsIDB4MDgwYywgMHg2YzUwLAorCTB4MDAwNSwgMHgwODBjLCAweDZiNzMsIDB4MDgwYywgMHg4MDc4LCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LAorCTB4YTE4MiwgMHgwMDQwLCAweDAwMDIsIDB4OGJhZSwgMHg4YmFlLCAweDhiYWUsIDB4OGJhZSwgMHg4YmFlLAorCTB4OGJiMCwgMHg4Yzg4LCAweDhjYTksIDB4OGJhZSwgMHg4YmFlLCAweDhiYWUsIDB4OGJhZSwgMHg4YmFlLAorCTB4OGJhZSwgMHg4YmFlLCAweDhiYWUsIDB4OGJhZSwgMHg4YmFlLCAweDhiYWUsIDB4MDgwYywgMHgxNGY2LAorCTB4MDBlNiwgMHgwMGQ2LCAweDYwM2YsIDB4MDAwMCwgMHgyMDcxLCAweGIyODAsIDB4NzEyNCwgMHg2MTBhLAorCTB4MjA3MSwgMHhiMjhjLCAweDYxMTAsIDB4MjE2OCwgMHg3NjE0LCAweGE2YjQsIDB4MGZmZiwgMHg4NmZmLAorCTB4MDkwNCwgMHg4YzU0LCAweGE2OGMsIDB4MGMwMCwgMHgwMWU4LCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLAorCTB4NTAyOSwgMHgwMGZlLCAweDAxOTgsIDB4Njg0YywgMHhkMGFjLCAweDAxODAsIDB4NjAyMCwgMHhkMGRjLAorCTB4MTE2OCwgMHg2ODUwLCAweGQwYmMsIDB4MTE1MCwgMHg3MzE4LCAweDY4MTQsIDB4YTMwNiwgMHgxOTA0LAorCTB4OGM2NiwgMHg3MzFjLCAweDY4MTAsIDB4YTMwNiwgMHgxOTA0LCAweDhjNjYsIDB4NzMxOCwgMHg2YjYyLAorCTB4NzMxYywgMHg2YjVlLCAweGE2OGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMDIsIDB4MDUxOCwgMHhhMTg2LAorCTB4MDAyOCwgMHgxMTI4LCAweDA4MGMsIDB4OTc2NywgMHg2ODRiLCAweDAwMWMsIDB4MDBlOCwgMHhkNmRjLAorCTB4MDFhMCwgMHg2ODRiLCAweDAwMTUsIDB4Njg0YywgMHhkMGFjLCAweDAxNzAsIDB4NjkxNCwgMHg2YTEwLAorCTB4MjEwMCwgMHhhMjA1LCAweDAxNDgsIDB4NzAxOCwgMHhhMTA2LCAweDExMTgsIDB4NzAxYywgMHhhMjA2LAorCTB4MDExOCwgMHg2OTYyLCAweDZhNWUsIDB4YzZkYywgMHgwMDM4LCAweGQ2ZDQsIDB4MDExOCwgMHg2ODRiLAorCTB4MDAwNywgMHgwMDEwLCAweDY4NGIsIDB4MDAwMCwgMHg2ODM3LCAweDAxMDMsIDB4NmU0NiwgMHhhMDFlLAorCTB4ZDZjNCwgMHgwMWYwLCAweGE2ODYsIDB4MDEwMCwgMHgxMTQwLCAweDIwMDEsIDB4YjI5OSwgMHgyMDA0LAorCTB4YTAwNSwgMHgxMTE4LCAweGM2YzQsIDB4MDgwNCwgMHg4YmJmLCAweDczMjgsIDB4NzMyYywgMHg2YjU2LAorCTB4ODNmZiwgMHgwMTcwLCAweGEzOGEsIDB4MDAwOSwgMHgwMjEwLCAweDIwMTksIDB4MDAwOCwgMHgwMDM2LAorCTB4MjMwOCwgMHgyMDE5LCAweGIyOTgsIDB4YWQ5MCwgMHgwMDE5LCAweDA4MGMsIDB4OTI3ZiwgMHgwMDNlLAorCTB4ZDZjYywgMHgwOTA0LCAweDhjNzksIDB4NzEyNCwgMHg2OTVhLCAweDgxZmYsIDB4MDkwNCwgMHg4Yzc5LAorCTB4YTE5MiwgMHgwMDIxLCAweDEyNTAsIDB4MjA3MSwgMHhiMjk4LCAweDgzMWMsIDB4MjMwMCwgMHhhZTE4LAorCTB4YWQ5MCwgMHgwMDFkLCAweDA4MGMsIDB4OTI3ZiwgMHgwNGEwLCAweDY4MzgsIDB4ZDBmYywgMHgwMTIwLAorCTB4MjAwOSwgMHgwMDIwLCAweDY5NWEsIDB4MGM3OCwgMHgwMGY2LCAweDJkNzgsIDB4MDgwYywgMHg5MjI0LAorCTB4MDBmZSwgMHgwODBjLCAweDkyNmYsIDB4MDQzOCwgMHgwMGY2LCAweDJjNzgsIDB4MDgwYywgMHg1MDI5LAorCTB4MDBmZSwgMHgwMTg4LCAweDY4NGMsIDB4ZDBhYywgMHgwMTcwLCAweDYwMjAsIDB4ZDBkYywgMHgxMTU4LAorCTB4Njg1MCwgMHhkMGJjLCAweDExNDAsIDB4Njg0YywgMHhkMGY0LCAweDExMjgsIDB4MDgwYywgMHg5ODY2LAorCTB4MDBkZSwgMHgwMGVlLCAweDAwZTAsIDB4Njg0YiwgMHgwMDAwLCAweDY4MzcsIDB4MDEwMywgMHg2ZTQ2LAorCTB4Njg0YywgMHhkMGFjLCAweDAxMzAsIDB4NjgxMCwgMHg2OTE0LCAweGExMTUsIDB4MDExMCwgMHgwODBjLAorCTB4OGUwNCwgMHgwODBjLCAweDUxMGMsIDB4NjIxOCwgMHgyMjY4LCAweDZhM2MsIDB4ODIxMSwgMHg2YTNlLAorCTB4MDgwYywgMHg5ODM0LCAweDAwZGUsIDB4MDBlZSwgMHgxMTEwLCAweDA4MGMsIDB4ODA3OCwgMHgwMDA1LAorCTB4MDBmNiwgMHg2MDAzLCAweDAwMDMsIDB4MjA3OSwgMHhiMjhjLCAweDdjMDQsIDB4N2IwMCwgMHg3ZTBjLAorCTB4N2QwOCwgMHg2MDEwLCAweDIwNzgsIDB4Nzg0YywgMHhkMGFjLCAweDAxMjAsIDB4NjAwMywgMHgwMDAyLAorCTB4MDBmZSwgMHgwMDA1LCAweDdjMTIsIDB4N2IxNiwgMHg3ZTBhLCAweDdkMGUsIDB4MDBmZSwgMHg2MDNmLAorCTB4MDAwMCwgMHgyYzEwLCAweDA4MGMsIDB4MWU2ZSwgMHgwODBjLCAweDY4MGIsIDB4MDgwYywgMHg2ZDBkLAorCTB4MDAwNSwgMHgyMDAxLCAweGFmYTUsIDB4MjAwNCwgMHg2MDNlLCAweDYwMDMsIDB4MDAwNCwgMHg2MTEwLAorCTB4MjBlMSwgMHgwMDA1LCAweDNkMTgsIDB4M2UyMCwgMHgyYzEwLCAweDA4MGMsIDB4MTgyNCwgMHgwMDA1LAorCTB4YTE4MiwgMHgwMDQwLCAweDAwMDIsIDB4OGNjZSwgMHg4Y2NlLCAweDhjY2UsIDB4OGNjZSwgMHg4Y2NlLAorCTB4OGNkMCwgMHg4ZDYxLCAweDhjY2UsIDB4OGNjZSwgMHg4ZDc3LCAweDhkZGIsIDB4OGNjZSwgMHg4Y2NlLAorCTB4OGNjZSwgMHg4Y2NlLCAweDhkZWEsIDB4OGNjZSwgMHg4Y2NlLCAweDhjY2UsIDB4MDgwYywgMHgxNGY2LAorCTB4MDA3NiwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgyMDcxLCAweGIyOGMsIDB4NjExMCwgMHgyMTc4LAorCTB4NzYxNCwgMHhhNmI0LCAweDBmZmYsIDB4N2U0NiwgMHg3ZjRjLCAweGM3ZTUsIDB4N2Y0ZSwgMHg2MjE4LAorCTB4MjI2OCwgMHg2YTNjLCAweDgyMTEsIDB4NmEzZSwgMHg4NmZmLCAweDA5MDQsIDB4OGQ1YywgMHhhNjk0LAorCTB4ZmYwMCwgMHhhMjg0LCAweDBjMDAsIDB4MDEyMCwgMHg3MDE4LCAweDc4NjIsIDB4NzAxYywgMHg3ODVlLAorCTB4YTI4NCwgMHgwMzAwLCAweDA5MDQsIDB4OGQ1YywgMHgwODBjLCAweDE1ZDksIDB4MDkwYywgMHgxNGY2LAorCTB4MmQwMCwgMHg3ODRhLCAweDdmNGMsIDB4YzdjZCwgMHg3ZjRlLCAweDY4MzcsIDB4MDEwMywgMHg3ODM4LAorCTB4NjgzYSwgMHg3ODNjLCAweDY4M2UsIDB4Nzg0MCwgMHg2ODQyLCAweDZlNDYsIDB4YTY4YywgMHgwYzAwLAorCTB4MDEyMCwgMHg3MzE4LCAweDZiNjIsIDB4NzMxYywgMHg2YjVlLCAweGE2OGMsIDB4MDBmZiwgMHhhMTg2LAorCTB4MDAwMiwgMHgwMTgwLCAweGExODYsIDB4MDAyOCwgMHgxMTE4LCAweDY4NGIsIDB4MDAxYywgMHgwMDYwLAorCTB4ZDZkYywgMHgwMTE4LCAweDY4NGIsIDB4MDAxNSwgMHgwMDM4LCAweGQ2ZDQsIDB4MDExOCwgMHg2ODRiLAorCTB4MDAwNywgMHgwMDEwLCAweDY4NGIsIDB4MDAwMCwgMHg2ZjRlLCAweDc4NTAsIDB4Njg1MiwgMHg3ODU0LAorCTB4Njg1NiwgMHhhMDFlLCAweGQ2YzQsIDB4MDE5OCwgMHg3MzI4LCAweDczMmMsIDB4NmI1NiwgMHg4M2ZmLAorCTB4MDE3MCwgMHhhMzhhLCAweDAwMDksIDB4MDIxMCwgMHgyMDE5LCAweDAwMDgsIDB4MDAzNiwgMHgyMzA4LAorCTB4MjAxOSwgMHhiMjk4LCAweGFkOTAsIDB4MDAxOSwgMHgwODBjLCAweDkyN2YsIDB4MDAzZSwgMHhkNmNjLAorCTB4MDFkOCwgMHg3MTI0LCAweDY5NWEsIDB4ODFmZiwgMHgwMWI4LCAweGExOTIsIDB4MDAyMSwgMHgxMjUwLAorCTB4MjA3MSwgMHhiMjk4LCAweDgzMWMsIDB4MjMwMCwgMHhhZTE4LCAweGFkOTAsIDB4MDAxZCwgMHgwODBjLAorCTB4OTI3ZiwgMHgwMDUwLCAweDc4MzgsIDB4ZDBmYywgMHgwMTIwLCAweDIwMDksIDB4MDAyMCwgMHg2OTVhLAorCTB4MGM3OCwgMHgyZDc4LCAweDA4MGMsIDB4OTIyNCwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDdlLAorCTB4MDAwNSwgMHgwMGY2LCAweDYwMDMsIDB4MDAwMywgMHgyMDc5LCAweGIyOGMsIDB4N2MwNCwgMHg3YjAwLAorCTB4N2UwYywgMHg3ZDA4LCAweDYwMTAsIDB4MjA3OCwgMHg3YzEyLCAweDdiMTYsIDB4N2UwYSwgMHg3ZDBlLAorCTB4MDBmZSwgMHgyYzEwLCAweDA4MGMsIDB4MWU2ZSwgMHgwODBjLCAweDc4MWEsIDB4MDAwNSwgMHgwMGQ2LAorCTB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4NTAyOSwgMHgwMGZlLCAweDAxMjAsIDB4MjAwMSwgMHhhZmE1LAorCTB4MjAwNCwgMHg2MDNlLCAweDYwMDMsIDB4MDAwMiwgMHgwODBjLCAweDZjMDUsIDB4MDgwYywgMHg2ZDBkLAorCTB4NjExMCwgMHgyMTY4LCAweDY5NGMsIDB4ZDFlNCwgMHgwOTA0LCAweDhkZDksIDB4ZDFjYywgMHgwNTQwLAorCTB4Njk0OCwgMHg2ODM4LCAweGQwZmMsIDB4MDFlOCwgMHgwMDE2LCAweDY4NGMsIDB4MDAwNiwgMHg2ODUwLAorCTB4MDAwNiwgMHhhZDkwLCAweDAwMGQsIDB4YTE5OCwgMHgwMDBkLCAweDIwMDksIDB4MDAyMCwgMHgwMTU2LAorCTB4MjFhOCwgMHgyMzA0LCAweDIwMTIsIDB4ODMxOCwgMHg4MjEwLCAweDFmMDQsIDB4OGRhMSwgMHgwMTVlLAorCTB4MDAwZSwgMHg2ODUyLCAweDAwMGUsIDB4Njg0ZSwgMHgwMDFlLCAweDIxNjgsIDB4MDgwYywgMHgxNjAwLAorCTB4MDQxOCwgMHgwMDE2LCAweDA4MGMsIDB4MTYwMCwgMHgwMGRlLCAweDA4MGMsIDB4OTI2ZiwgMHgwMGUwLAorCTB4NjgzNywgMHgwMTAzLCAweDY5NDQsIDB4YTE4NCwgMHgwMGZmLCAweGEwYjYsIDB4MDAwMiwgMHgwMTgwLAorCTB4YTA4NiwgMHgwMDI4LCAweDExMTgsIDB4Njg0YiwgMHgwMDFjLCAweDAwNjAsIDB4ZDFkYywgMHgwMTE4LAorCTB4Njg0YiwgMHgwMDE1LCAweDAwMzgsIDB4ZDFkNCwgMHgwMTE4LCAweDY4NGIsIDB4MDAwNywgMHgwMDEwLAorCTB4Njg0YiwgMHgwMDAwLCAweDA4MGMsIDB4NTEwYywgMHgwODBjLCAweDk4MzQsIDB4MTExMCwgMHgwODBjLAorCTB4ODA3OCwgMHgwMGRlLCAweDAwMDUsIDB4MjAxOSwgMHgwMDAxLCAweDA4MGMsIDB4N2E2NCwgMHg2MDAzLAorCTB4MDAwMiwgMHgyMDAxLCAweGFmYTUsIDB4MjAwNCwgMHg2MDNlLCAweDA4MGMsIDB4NmMwNSwgMHgwODBjLAorCTB4NmQwZCwgMHgwMDA1LCAweDA4MGMsIDB4NmMwNSwgMHgwODBjLCAweDJhZDksIDB4MDBkNiwgMHg2MTEwLAorCTB4MjE2OCwgMHgwODBjLCAweDk1OTYsIDB4MDE1MCwgMHg2ODM3LCAweDAxMDMsIDB4Njg0YiwgMHgwMDI5LAorCTB4Njg0NywgMHgwMDAwLCAweDA4MGMsIDB4NTEwYywgMHgwODBjLCAweDk3NDIsIDB4MDBkZSwgMHgwODBjLAorCTB4ODA3OCwgMHgwODBjLCAweDZkMGQsIDB4MDAwNSwgMHg2ODRiLCAweDAwMTUsIDB4ZDFmYywgMHgwMTM4LAorCTB4Njg0YiwgMHgwMDA3LCAweDgwMDIsIDB4ODAwMCwgMHg4MTBhLCAweGExODksIDB4MDAwMCwgMHg2OTYyLAorCTB4Njg1ZSwgMHgwMDA1LCAweGExODIsIDB4MDA0MCwgMHgwMDAyLCAweDhlMjgsIDB4OGUyOCwgMHg4ZTI4LAorCTB4OGUyOCwgMHg4ZTI4LCAweDhlMmEsIDB4OGUyOCwgMHg4ZWUzLCAweDhlZWYsIDB4OGUyOCwgMHg4ZTI4LAorCTB4OGUyOCwgMHg4ZTI4LCAweDhlMjgsIDB4OGUyOCwgMHg4ZTI4LCAweDhlMjgsIDB4OGUyOCwgMHg4ZTI4LAorCTB4MDgwYywgMHgxNGY2LCAweDAwNzYsIDB4MDBmNiwgMHgwMGU2LCAweDAwZDYsIDB4MjA3MSwgMHhiMjhjLAorCTB4NjExMCwgMHgyMTc4LCAweDc2MTQsIDB4YTZiNCwgMHgwZmZmLCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLAorCTB4NTAyOSwgMHgwMGZlLCAweDAxNTAsIDB4YTY4NCwgMHgwMGZmLCAweDExMzgsIDB4NjAyMCwgMHhkMGY0LAorCTB4MDEyMCwgMHgwODBjLCAweDk4NjYsIDB4MDgwNCwgMHg4ZWRlLCAweDdlNDYsIDB4N2Y0YywgMHhjN2U1LAorCTB4N2Y0ZSwgMHg2MjE4LCAweDIyNjgsIDB4NmEzYywgMHg4MjExLCAweDZhM2UsIDB4ODZmZiwgMHgwOTA0LAorCTB4OGVkNCwgMHhhNjk0LCAweGZmMDAsIDB4YTI4NCwgMHgwYzAwLCAweDAxMjAsIDB4NzAxOCwgMHg3ODYyLAorCTB4NzAxYywgMHg3ODVlLCAweGEyODQsIDB4MDMwMCwgMHgwOTA0LCAweDhlZDIsIDB4YTY4NiwgMHgwMTAwLAorCTB4MTE0MCwgMHgyMDAxLCAweGIyOTksIDB4MjAwNCwgMHhhMDA1LCAweDExMTgsIDB4YzZjNCwgMHg3ZTQ2LAorCTB4MGMyOCwgMHgwODBjLCAweDE1ZDksIDB4MDkwYywgMHgxNGY2LCAweDJkMDAsIDB4Nzg0YSwgMHg3ZjRjLAorCTB4YTdiZCwgMHgwMjAwLCAweDdmNGUsIDB4NjgzNywgMHgwMTAzLCAweDc4MzgsIDB4NjgzYSwgMHg3ODNjLAorCTB4NjgzZSwgMHg3ODQwLCAweDY4NDIsIDB4NmU0NiwgMHhhNjhjLCAweDBjMDAsIDB4MDEyMCwgMHg3MzE4LAorCTB4NmI2MiwgMHg3MzFjLCAweDZiNWUsIDB4YTY4YywgMHgwMGZmLCAweGExODYsIDB4MDAwMiwgMHgwMTgwLAorCTB4YTE4NiwgMHgwMDI4LCAweDExMTgsIDB4Njg0YiwgMHgwMDFjLCAweDAwNjAsIDB4ZDZkYywgMHgwMTE4LAorCTB4Njg0YiwgMHgwMDE1LCAweDAwMzgsIDB4ZDZkNCwgMHgwMTE4LCAweDY4NGIsIDB4MDAwNywgMHgwMDEwLAorCTB4Njg0YiwgMHgwMDAwLCAweDZmNGUsIDB4Nzg1MCwgMHg2ODUyLCAweDc4NTQsIDB4Njg1NiwgMHhhMDFlLAorCTB4ZDZjNCwgMHgwMTk4LCAweDczMjgsIDB4NzMyYywgMHg2YjU2LCAweDgzZmYsIDB4MDE3MCwgMHhhMzhhLAorCTB4MDAwOSwgMHgwMjEwLCAweDIwMTksIDB4MDAwOCwgMHgwMDM2LCAweDIzMDgsIDB4MjAxOSwgMHhiMjk4LAorCTB4YWQ5MCwgMHgwMDE5LCAweDA4MGMsIDB4OTI3ZiwgMHgwMDNlLCAweGQ2Y2MsIDB4MDFkOCwgMHg3MTI0LAorCTB4Njk1YSwgMHg4MWZmLCAweDAxYjgsIDB4YTE5MiwgMHgwMDIxLCAweDEyNTAsIDB4MjA3MSwgMHhiMjk4LAorCTB4ODMxYywgMHgyMzAwLCAweGFlMTgsIDB4YWQ5MCwgMHgwMDFkLCAweDA4MGMsIDB4OTI3ZiwgMHgwMDUwLAorCTB4NzgzOCwgMHhkMGZjLCAweDAxMjAsIDB4MjAwOSwgMHgwMDIwLCAweDY5NWEsIDB4MGM3OCwgMHgyZDc4LAorCTB4MDgwYywgMHg5MjI0LCAweGQ2ZGMsIDB4MTExMCwgMHhhMDA2LCAweDAwMzAsIDB4MjAwMSwgMHgwMDAxLAorCTB4MjA3MSwgMHhiMjhjLCAweDcyMTgsIDB4NzMxYywgMHgwODBjLCAweDE4NmYsIDB4MDBkZSwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMDdlLCAweDAwMDUsIDB4MjAwMSwgMHhhZmE1LCAweDIwMDQsIDB4NjAzZSwgMHgyMGUxLAorCTB4MDAwNSwgMHgzZDE4LCAweDNlMjAsIDB4MmMxMCwgMHgwODBjLCAweDE4MjQsIDB4MDAwNSwgMHgyMDAxLAorCTB4YWZhNSwgMHgyMDA0LCAweDYwM2UsIDB4MDBkNiwgMHg2MDAzLCAweDAwMDIsIDB4NjExMCwgMHgyMTY4LAorCTB4Njk0YywgMHhkMWU0LCAweDA5MDQsIDB4OGZmMywgMHg2MDNmLCAweDAwMDAsIDB4MDBmNiwgMHgyYzc4LAorCTB4MDgwYywgMHg1MDI5LCAweDAwZmUsIDB4MDU0OCwgMHg2ODE0LCAweDY5MTAsIDB4YTExNSwgMHgwNTI4LAorCTB4NmE2MCwgMHhhMjA2LCAweDExMTgsIDB4Njg1YywgMHhhMTA2LCAweDAxZjgsIDB4Njg0YywgMHhjMGU0LAorCTB4Njg0ZSwgMHg2ODQ3LCAweDAwMDAsIDB4Njg2MywgMHgwMDAwLCAweDY4NWYsIDB4MDAwMCwgMHg2OTdjLAorCTB4NjgxMCwgMHhhMTAyLCAweDYwM2EsIDB4Njk4MCwgMHg2ODE0LCAweGExMDMsIDB4NjAzNiwgMHg2MDIwLAorCTB4YzBmNSwgMHg2MDIyLCAweDAwZDYsIDB4NjAxOCwgMHgyMDY4LCAweDY4M2MsIDB4ODAwMCwgMHg2ODNlLAorCTB4MDBkZSwgMHgwODBjLCAweDk4NjYsIDB4MDgwNCwgMHg4ZmYzLCAweDY5NGMsIDB4ZDFjYywgMHgwOTA0LAorCTB4OGZjMywgMHg2OTQ4LCAweDY4MzgsIDB4ZDBmYywgMHgwOTA0LCAweDhmODgsIDB4MDAxNiwgMHg2ODRjLAorCTB4MDAwNiwgMHg2ODUwLCAweDAwMDYsIDB4MDBmNiwgMHgyMTc4LCAweDc5NDQsIDB4YTE4NCwgMHgwMGZmLAorCTB4YTBiNiwgMHgwMDAyLCAweDAxZTAsIDB4YTA4NiwgMHgwMDI4LCAweDExMjgsIDB4Njg0YiwgMHgwMDFjLAorCTB4Nzg0YiwgMHgwMDFjLCAweDAwZTgsIDB4ZDFkYywgMHgwMTU4LCAweDY4NGIsIDB4MDAxNSwgMHg3ODRiLAorCTB4MDAxNSwgMHgwODBjLCAweDk5ZWUsIDB4MDExOCwgMHg3OTQ0LCAweGMxZGMsIDB4Nzk0NiwgMHgwMDgwLAorCTB4ZDFkNCwgMHgwMTI4LCAweDY4NGIsIDB4MDAwNywgMHg3ODRiLCAweDAwMDcsIDB4MDA0OCwgMHg2ODRjLAorCTB4ZDBhYywgMHgwMTMwLCAweDY4MTAsIDB4NjkxNCwgMHhhMTE1LCAweDAxMTAsIDB4MDgwYywgMHg4ZTA0LAorCTB4Njg0OCwgMHg3ODRhLCAweDY4NjAsIDB4Nzg2MiwgMHg2ODVjLCAweDc4NWUsIDB4YWQ5MCwgMHgwMDBkLAorCTB4YWY5OCwgMHgwMDBkLCAweDIwMDksIDB4MDAyMCwgMHgwMTU2LCAweDIxYTgsIDB4MjMwNCwgMHgyMDEyLAorCTB4ODMxOCwgMHg4MjEwLCAweDFmMDQsIDB4OGY3NiwgMHgwMTVlLCAweDAwZmUsIDB4MDAwZSwgMHg2ODUyLAorCTB4MDAwZSwgMHg2ODRlLCAweDAwMWUsIDB4MjE2OCwgMHgwODBjLCAweDE2MDAsIDB4MDgwNCwgMHg4ZmVlLAorCTB4MDAxNiwgMHgwMGY2LCAweDIxNzgsIDB4Nzk0NCwgMHhhMTg0LCAweDAwZmYsIDB4YTBiNiwgMHgwMDAyLAorCTB4MDFlMCwgMHhhMDg2LCAweDAwMjgsIDB4MTEyOCwgMHg2ODRiLCAweDAwMWMsIDB4Nzg0YiwgMHgwMDFjLAorCTB4MDBlOCwgMHhkMWRjLCAweDAxNTgsIDB4Njg0YiwgMHgwMDE1LCAweDc4NGIsIDB4MDAxNSwgMHgwODBjLAorCTB4OTllZSwgMHgwMTE4LCAweDc5NDQsIDB4YzFkYywgMHg3OTQ2LCAweDAwODAsIDB4ZDFkNCwgMHgwMTI4LAorCTB4Njg0YiwgMHgwMDA3LCAweDc4NGIsIDB4MDAwNywgMHgwMDQ4LCAweDY4NGMsIDB4ZDBhYywgMHgwMTMwLAorCTB4NjgxMCwgMHg2OTE0LCAweGExMTUsIDB4MDExMCwgMHgwODBjLCAweDhlMDQsIDB4Njg2MCwgMHg3ODYyLAorCTB4Njg1YywgMHg3ODVlLCAweDY4NGMsIDB4Nzg0ZSwgMHgwMGZlLCAweDA4MGMsIDB4MTYwMCwgMHgwMGRlLAorCTB4MDgwYywgMHg5MjZmLCAweDA0NTgsIDB4NjgzNywgMHgwMTAzLCAweDY5NDQsIDB4YTE4NCwgMHgwMGZmLAorCTB4YTBiNiwgMHgwMDAyLCAweDAxYjAsIDB4YTA4NiwgMHgwMDI4LCAweDExMTgsIDB4Njg0YiwgMHgwMDFjLAorCTB4MDBkOCwgMHhkMWRjLCAweDAxNDgsIDB4Njg0YiwgMHgwMDE1LCAweDA4MGMsIDB4OTllZSwgMHgwMTE4LAorCTB4Njk0NCwgMHhjMWRjLCAweDY5NDYsIDB4MDA4MCwgMHhkMWQ0LCAweDAxMTgsIDB4Njg0YiwgMHgwMDA3LAorCTB4MDA1OCwgMHg2ODRiLCAweDAwMDAsIDB4Njg0YywgMHhkMGFjLCAweDAxMzAsIDB4NjgxMCwgMHg2OTE0LAorCTB4YTExNSwgMHgwMTEwLCAweDA4MGMsIDB4OGUwNCwgMHgwODBjLCAweDUxMGMsIDB4MDgwYywgMHg5ODM0LAorCTB4MTExMCwgMHgwODBjLCAweDgwNzgsIDB4MDBkZSwgMHgwMDA1LCAweDA4MGMsIDB4NmI3MywgMHgwMDEwLAorCTB4MDgwYywgMHg2YzA1LCAweDA4MGMsIDB4OTU5NiwgMHgwMWMwLCAweDAwZDYsIDB4NjExMCwgMHgyMTY4LAorCTB4NjgzNywgMHgwMTAzLCAweDIwMDksIDB4YWQwYywgMHgyMTBjLCAweGQxOGMsIDB4MTFjMCwgMHhkMTg0LAorCTB4MTE5OCwgMHg2MTA4LCAweDY5NGEsIDB4YTE4ZSwgMHgwMDI5LCAweDExMTAsIDB4MDgwYywgMHhhYmZhLAorCTB4Njg0NywgMHgwMDAwLCAweDA4MGMsIDB4NTEwYywgMHgwMGRlLCAweDA4MGMsIDB4ODA3OCwgMHgwODBjLAorCTB4NmM1MCwgMHgwODBjLCAweDZkMGQsIDB4MDAwNSwgMHg2ODRiLCAweDAwMDQsIDB4MGM4OCwgMHg2ODRiLAorCTB4MDAwNCwgMHgwYzcwLCAweGExODIsIDB4MDA0MCwgMHgwMDAyLCAweDkwMzgsIDB4OTAzOCwgMHg5MDM4LAorCTB4OTAzOCwgMHg5MDM4LCAweDkwM2EsIDB4OTAzOCwgMHg5MDNkLCAweDkwMzgsIDB4OTAzOCwgMHg5MDM4LAorCTB4OTAzOCwgMHg5MDM4LCAweDkwMzgsIDB4OTAzOCwgMHg5MDM4LCAweDkwMzgsIDB4OTAzOCwgMHg5MDM4LAorCTB4MDgwYywgMHgxNGY2LCAweDA4MGMsIDB4ODA3OCwgMHgwMDA1LCAweDAwMDYsIDB4MDAyNiwgMHhhMDE2LAorCTB4MDgwYywgMHgxODI0LCAweDAwMmUsIDB4MDAwZSwgMHgwMDA1LCAweGExODIsIDB4MDA4NSwgMHgwMDAyLAorCTB4OTA1MSwgMHg5MDRmLCAweDkwNGYsIDB4OTA1ZCwgMHg5MDRmLCAweDkwNGYsIDB4OTA0ZiwgMHgwODBjLAorCTB4MTRmNiwgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgwODBjLCAweDY3YTgsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDZjNTAsIDB4MDEyZSwgMHgwMDA1LCAweDAwMjYsIDB4MDA1NiwgMHgwMGQ2LAorCTB4MDBlNiwgMHgyMDcxLCAweGIyODAsIDB4NzIyNCwgMHg2MjEyLCAweDcyMjAsIDB4MDgwYywgMHg5NTg2LAorCTB4MDFhMCwgMHgyMjY4LCAweDY4MDAsIDB4YTA4NiwgMHgwMDAwLCAweDAxNzgsIDB4NjAxOCwgMHg2ZDE4LAorCTB4YTUyZSwgMHgxMTU4LCAweDAwYzYsIDB4MmQ2MCwgMHgwODBjLCAweDkyOGYsIDB4MDBjZSwgMHgwMTI4LAorCTB4NjgwMywgMHgwMDAyLCAweDYwMDcsIDB4MDA4NiwgMHgwMDEwLCAweDYwMDcsIDB4MDA4NywgMHg2MDAzLAorCTB4MDAwMSwgMHgwODBjLCAweDY3YTgsIDB4MDgwYywgMHg2YzUwLCAweDAwZjYsIDB4MjI3OCwgMHgwODBjLAorCTB4NTAyOSwgMHgwMGZlLCAweDAxNTAsIDB4NjgyMCwgMHhkMGVjLCAweDAxMzgsIDB4MDBjNiwgMHgyMjYwLAorCTB4NjAzZiwgMHgwMDAwLCAweDA4MGMsIDB4OTg2NiwgMHgwMGNlLCAweDAwZWUsIDB4MDBkZSwgMHgwMDVlLAorCTB4MDAyZSwgMHgwMDA1LCAweGExODYsIDB4MDAxMywgMHgxMTYwLCAweDYwMDQsIDB4YTA4YSwgMHgwMDg1LAorCTB4MGEwYywgMHgxNGY2LCAweGEwOGEsIDB4MDA4YywgMHgxYTBjLCAweDE0ZjYsIDB4YTA4MiwgMHgwMDg1LAorCTB4MDA3MiwgMHhhMTg2LCAweDAwMjcsIDB4MDEyMCwgMHhhMTg2LCAweDAwMTQsIDB4MTkwYywgMHgxNGY2LAorCTB4MDgwYywgMHg2YjczLCAweDA4MGMsIDB4OTc0ZSwgMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHg5MGJlLAorCTB4OTBjMCwgMHg5MGMwLCAweDkwYmUsIDB4OTBiZSwgMHg5MGJlLCAweDkwYmUsIDB4MDgwYywgMHgxNGY2LAorCTB4MDgwYywgMHg2YjczLCAweDA4MGMsIDB4OTc0ZSwgMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHhhMTg2LAorCTB4MDAxMywgMHgxMTI4LCAweDYwMDQsIDB4YTA4MiwgMHgwMDg1LCAweDIwMDgsIDB4MDRhOCwgMHhhMTg2LAorCTB4MDAyNywgMHgxMWU4LCAweDA4MGMsIDB4NmI3MywgMHgwODBjLCAweDJhZDksIDB4MDBkNiwgMHg2MDEwLAorCTB4MjA2OCwgMHgwODBjLCAweDk1OTYsIDB4MDE1MCwgMHg2ODM3LCAweDAxMDMsIDB4Njg0NywgMHgwMDAwLAorCTB4Njg0YiwgMHgwMDI5LCAweDA4MGMsIDB4NTEwYywgMHgwODBjLCAweDk3NDIsIDB4MDBkZSwgMHgwODBjLAorCTB4ODA3OCwgMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHgwODBjLCAweDgwYmUsIDB4MGNlMCwgMHhhMTg2LAorCTB4MDAxNCwgMHgxZGQwLCAweDA4MGMsIDB4NmI3MywgMHgwMGQ2LCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLAorCTB4OTU5NiwgMHgwZDYwLCAweDY4MzcsIDB4MDEwMywgMHg2ODQ3LCAweDAwMDAsIDB4Njg0YiwgMHgwMDA2LAorCTB4Njg1MCwgMHhjMGVjLCAweDY4NTIsIDB4MDhmMCwgMHgwMDAyLCAweDkxMGUsIDB4OTEwYywgMHg5MTBjLAorCTB4OTEwYywgMHg5MTBjLCAweDkxMGMsIDB4OTEyNiwgMHgwODBjLCAweDE0ZjYsIDB4MDgwYywgMHg2YjczLAorCTB4NjAzMCwgMHhhMDhjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTg2LCAweDAwMzksIDB4MDExOCwgMHhhMTg2LAorCTB4MDAzNSwgMHgxMTE4LCAweDIwMDEsIDB4YWZhMywgMHgwMDEwLCAweDIwMDEsIDB4YWZhNCwgMHgyMDA0LAorCTB4NjAxNiwgMHg2MDAzLCAweDAwMGMsIDB4MDgwYywgMHg2YzUwLCAweDAwMDUsIDB4MDgwYywgMHg2YjczLAorCTB4NjAzMCwgMHhhMDhjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTg2LCAweDAwMzksIDB4MDExOCwgMHhhMTg2LAorCTB4MDAzNSwgMHgxMTE4LCAweDIwMDEsIDB4YWZhMywgMHgwMDEwLCAweDIwMDEsIDB4YWZhNCwgMHgyMDA0LAorCTB4NjAxNiwgMHg2MDAzLCAweDAwMGUsIDB4MDgwYywgMHg2YzUwLCAweDAwMDUsIDB4YTE4MiwgMHgwMDhjLAorCTB4MTIyMCwgMHhhMTgyLCAweDAwODUsIDB4MDIwOCwgMHgwMDFhLCAweDA4MGMsIDB4ODBiZSwgMHgwMDA1LAorCTB4OTE0ZiwgMHg5MTRmLCAweDkxNGYsIDB4OTE0ZiwgMHg5MTUxLCAweDkxYTQsIDB4OTE0ZiwgMHgwODBjLAorCTB4MTRmNiwgMHgwMGQ2LCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweDUwMjksIDB4MDBmZSwgMHgwMTY4LAorCTB4NjAzMCwgMHhhMDhjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTg2LCAweDAwMzksIDB4MDExOCwgMHhhMTg2LAorCTB4MDAzNSwgMHgxMTE4LCAweDAwZGUsIDB4MDgwNCwgMHg5MWI3LCAweDA4MGMsIDB4OTc0MiwgMHgwODBjLAorCTB4OTU5NiwgMHgwMWM4LCAweDYwMTAsIDB4MjA2OCwgMHg2ODM3LCAweDAxMDMsIDB4Njg1MCwgMHhkMGI0LAorCTB4MDEyOCwgMHg2ODRiLCAweDAwMDYsIDB4YzBlYywgMHg2ODUyLCAweDAwNDgsIDB4ZDBiYywgMHgwMTE4LAorCTB4Njg0YiwgMHgwMDAyLCAweDAwMjAsIDB4Njg0YiwgMHgwMDA1LCAweDA4MGMsIDB4OTgwMywgMHg2ODQ3LAorCTB4MDAwMCwgMHgwODBjLCAweDUxMGMsIDB4MmM2OCwgMHgwODBjLCAweDgwMjIsIDB4MDFjMCwgMHg2MDAzLAorCTB4MDAwMSwgMHg2MDA3LCAweDAwMWUsIDB4NjAwYiwgMHhmZmZmLCAweDIwMDksIDB4YjI4ZSwgMHgyMTBjLAorCTB4NjEzNiwgMHgyMDA5LCAweGIyOGYsIDB4MjEwYywgMHg2MTNhLCAweDY5MTgsIDB4NjExYSwgMHgwODBjLAorCTB4OTk1NiwgMHg2OTUwLCAweDYxNTIsIDB4NjAxZiwgMHgwMDAxLCAweDA4MGMsIDB4NjdhOCwgMHgyZDYwLAorCTB4MDgwYywgMHg4MDc4LCAweDAwZGUsIDB4MDAwNSwgMHgwMGY2LCAweDJjNzgsIDB4MDgwYywgMHg1MDI5LAorCTB4MDBmZSwgMHgwNTk4LCAweDYwMzAsIDB4YTA4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE4NiwgMHgwMDM1LAorCTB4MDEzMCwgMHhhMTg2LCAweDAwMWUsIDB4MDExOCwgMHhhMTg2LCAweDAwMzksIDB4MTUzMCwgMHgwMGQ2LAorCTB4MmM2OCwgMHgwODBjLCAweDlhMzQsIDB4MTkwNCwgMHg5MWZjLCAweDA4MGMsIDB4ODAyMiwgMHgwMWQ4LAorCTB4NjEwNiwgMHg2MDAzLCAweDAwMDEsIDB4NjAxZiwgMHgwMDAxLCAweDY5MTgsIDB4NjExYSwgMHg2OTI4LAorCTB4NjEyYSwgMHg2OTJjLCAweDYxMmUsIDB4NjkzMCwgMHhhMThjLCAweDAwZmYsIDB4NjEzMiwgMHg2OTM0LAorCTB4NjEzNiwgMHg2OTM4LCAweDYxM2EsIDB4Njk1MCwgMHg2MTUyLCAweDA4MGMsIDB4OTk1NiwgMHgwODBjLAorCTB4NjdhOCwgMHgwODBjLCAweDZjNTAsIDB4MmQ2MCwgMHgwMGY4LCAweDAwZDYsIDB4NjAxMCwgMHgyMDY4LAorCTB4MDgwYywgMHg5NTk2LCAweDAxYzgsIDB4NjgzNywgMHgwMTAzLCAweDY4NTAsIDB4ZDBiNCwgMHgwMTI4LAorCTB4YzBlYywgMHg2ODUyLCAweDY4NGIsIDB4MDAwNiwgMHgwMDQ4LCAweGQwYmMsIDB4MDExOCwgMHg2ODRiLAorCTB4MDAwMiwgMHgwMDIwLCAweDY4NGIsIDB4MDAwNSwgMHgwODBjLCAweDk4MDMsIDB4Njg0NywgMHgwMDAwLAorCTB4MDgwYywgMHg1MTBjLCAweDA4MGMsIDB4OTc0MiwgMHgwMGRlLCAweDA4MGMsIDB4ODA3OCwgMHgwMDA1LAorCTB4MDAxNiwgMHgwMGQ2LCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLCAweDk1OTYsIDB4MDE0MCwgMHg2ODM3LAorCTB4MDEwMywgMHg2ODRiLCAweDAwMjgsIDB4Njg0NywgMHgwMDAwLCAweDA4MGMsIDB4NTEwYywgMHgwMGRlLAorCTB4MDAxZSwgMHhhMTg2LCAweDAwMTMsIDB4MDE0OCwgMHhhMTg2LCAweDAwMTQsIDB4MDEzMCwgMHhhMTg2LAorCTB4MDAyNywgMHgwMTE4LCAweDA4MGMsIDB4ODBiZSwgMHgwMDMwLCAweDA4MGMsIDB4NmI3MywgMHgwODBjLAorCTB4OTc0ZSwgMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHgwMDU2LCAweDAwNjYsIDB4MDBkNiwgMHgwMGY2LAorCTB4MjAyOSwgMHgwMDAxLCAweGExODIsIDB4MDEwMSwgMHgxMjA4LCAweDAwMTAsIDB4MjAwOSwgMHgwMTAwLAorCTB4MjEzMCwgMHgyMDY5LCAweGIyOTgsIDB4ODMxYywgMHgyMzAwLCAweGFkMTgsIDB4MjAwOSwgMHgwMDIwLAorCTB4YWY5MCwgMHgwMDFkLCAweDA4MGMsIDB4OTI3ZiwgMHhhNmIyLCAweDAwMjAsIDB4NzgwNCwgMHhhMDZkLAorCTB4MDExMCwgMHgwODBjLCAweDE2MDAsIDB4MDgwYywgMHgxNWQ5LCAweDA1MDAsIDB4ODUyOCwgMHg2ODM3LAorCTB4MDExMCwgMHg2ODNiLCAweDAwMDAsIDB4MmQyMCwgMHg3YzA2LCAweGE2OGEsIDB4MDAzZCwgMHgxMjI4LAorCTB4MjYwOCwgMHhhZDkwLCAweDAwMGYsIDB4MDQ1OSwgMHgwMDg4LCAweGE2YjIsIDB4MDAzYywgMHgyMDA5LAorCTB4MDAzYywgMHgyZDc4LCAweGFkOTAsIDB4MDAwZiwgMHgwNDExLCAweDBjMjgsIDB4MDBmZSwgMHg4NTJmLAorCTB4YTVhZCwgMHgwMDAzLCAweDdkMzYsIDB4YTVhYywgMHgwMDAwLCAweDAwMjgsIDB4MDBmZSwgMHg4NTJmLAorCTB4YTVhZCwgMHgwMDAzLCAweDdkMzYsIDB4MDBkZSwgMHgwMDZlLCAweDAwNWUsIDB4MDAwNSwgMHgwMGY2LAorCTB4OGRmZiwgMHgwMTU4LCAweDY4MDQsIDB4YTA3ZCwgMHgwMTMwLCAweDY4MDcsIDB4MDAwMCwgMHgwODBjLAorCTB4NTEwYywgMHgyZjY4LCAweDBjYjgsIDB4MDgwYywgMHg1MTBjLCAweDAwZmUsIDB4MDAwNSwgMHgwMTU2LAorCTB4YTE4NCwgMHgwMDAxLCAweDAxMDgsIDB4ODEwOCwgMHg4MTBjLCAweDIxYTgsIDB4MjMwNCwgMHg4MDA3LAorCTB4MjAxMiwgMHg4MzE4LCAweDgyMTAsIDB4MWYwNCwgMHg5Mjg2LCAweDAxNWUsIDB4MDAwNSwgMHgwMDY2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAzMSwgMHgwMDAxLCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLAorCTB4MDA4MywgMHgwMTJlLCAweDAwNmUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDY2LAorCTB4MjAzMSwgMHgwMDAwLCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLCAweDAwMWIsIDB4MDA2ZSwgMHgwMTJlLAorCTB4MDAwNSwgMHg5MmMzLCAweDkyYzMsIDB4OTJiZSwgMHg5MmU1LCAweDkyYjEsIDB4OTJiZSwgMHg5MmU1LAorCTB4OTJiZSwgMHgwODBjLCAweDE0ZjYsIDB4MDAzNiwgMHgyMDE5LCAweDAwMTAsIDB4MDgwYywgMHhhNTY2LAorCTB4NjAxZiwgMHgwMDA2LCAweDYwMDMsIDB4MDAwNywgMHgwMDNlLCAweDAwMDUsIDB4YTAwNiwgMHgwMDA1LAorCTB4YTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDBkNiwgMHg4NmZmLCAweDExZDgsIDB4NjAxMCwgMHgyMDY4LAorCTB4MDgwYywgMHg5NTk2LCAweDAxYzAsIDB4NjgzNCwgMHhhMDg2LCAweDAxMzksIDB4MTEyOCwgMHg2ODRiLAorCTB4MDAwNSwgMHg2ODUzLCAweDAwMDAsIDB4MDAyOCwgMHhhMDBlLCAweDIwMDEsIDB4MDAwNSwgMHgwODBjLAorCTB4NTFkZiwgMHgwODBjLCAweDk4MDMsIDB4MDgwYywgMHg1MTBjLCAweDA4MGMsIDB4ODA3OCwgMHhhMDg1LAorCTB4MDAwMSwgMHgwMGRlLCAweDAwMDUsIDB4YTAwNiwgMHgwY2UwLCAweDYwMDAsIDB4YTA4YSwgMHgwMDEwLAorCTB4MWEwYywgMHgxNGY2LCAweDAwMGIsIDB4MDAwNSwgMHg5MmZjLCAweDkzMTksIDB4OTJmZSwgMHg5MzM4LAorCTB4OTMxNiwgMHg5MmZjLCAweDkyYmUsIDB4OTJjMywgMHg5MmMzLCAweDkyYmUsIDB4OTJiZSwgMHg5MmJlLAorCTB4OTJiZSwgMHg5MmJlLCAweDkyYmUsIDB4OTJiZSwgMHgwODBjLCAweDE0ZjYsIDB4ODZmZiwgMHgxMTk4LAorCTB4MDBkNiwgMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5NTk2LCAweDAxMTAsIDB4MDgwYywgMHg5ODAzLAorCTB4MDBkZSwgMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMWYsIDB4MDAwMiwgMHgwODBjLAorCTB4NjdhOCwgMHgwODBjLCAweDZjNTAsIDB4YTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDgwYywgMHgxOTBiLAorCTB4MGMyOCwgMHgwMGU2LCAweDIwNzEsIDB4YWZjNywgMHg3MDI0LCAweGFjMDYsIDB4MTExMCwgMHgwODBjLAorCTB4NzllMSwgMHg2MDFjLCAweGEwODQsIDB4MDAwZiwgMHhhMDg2LCAweDAwMDYsIDB4MTE1MCwgMHgwMDg2LAorCTB4MDA5NiwgMHgyMDQ5LCAweDAwMDEsIDB4MmM0MCwgMHgwODBjLCAweDdiOWEsIDB4MDA5ZSwgMHgwMDhlLAorCTB4MDAxMCwgMHgwODBjLCAweDc4ZGUsIDB4MDBlZSwgMHgxOTQ4LCAweDA4MGMsIDB4OTJiZSwgMHgwMDA1LAorCTB4MDAzNiwgMHgwMGU2LCAweDIwNzEsIDB4YWZjNywgMHg3MDNjLCAweGFjMDYsIDB4MTE0MCwgMHgyMDE5LAorCTB4MDAwMCwgMHgwODBjLCAweDdhNjQsIDB4MDBlZSwgMHgwMDNlLCAweDA4MDQsIDB4OTJmZSwgMHgwODBjLAorCTB4N2NiOCwgMHgwMGVlLCAweDAwM2UsIDB4MTkwNCwgMHg5MmZlLCAweDA4MGMsIDB4OTJiZSwgMHgwMDA1LAorCTB4MDBjNiwgMHg2MDFjLCAweGEwODQsIDB4MDAwZiwgMHgwMDEzLCAweDAwY2UsIDB4MDAwNSwgMHg5MzY5LAorCTB4OTNkMywgMHg5NTAxLCAweDkzNzQsIDB4OTc0ZSwgMHg5MzY5LCAweGE1NTgsIDB4ODA3OCwgMHg5M2QzLAorCTB4OTM2MiwgMHg5NTVmLCAweDA4MGMsIDB4MTRmNiwgMHgwODBjLCAweDk3ODksIDB4MTExMCwgMHgwODBjLAorCTB4ODVmMywgMHgwMDA1LCAweDA4MGMsIDB4NmI3MywgMHgwODBjLCAweDZjNTAsIDB4MDgwYywgMHg4MDc4LAorCTB4MDAwNSwgMHg2MDE3LCAweDAwMDEsIDB4MDAwNSwgMHg2MDEwLCAweGEwODAsIDB4MDAxOSwgMHgyYzAyLAorCTB4NjAwMCwgMHhhMDhhLCAweDAwMTAsIDB4MWEwYywgMHgxNGY2LCAweDAwMGIsIDB4MDAwNSwgMHg5MzhmLAorCTB4OTM5MSwgMHg5M2IxLCAweDkzYzMsIDB4OTNkMCwgMHg5MzhmLCAweDkzNjksIDB4OTM2OSwgMHg5MzY5LAorCTB4OTNjMywgMHg5M2MzLCAweDkzOGYsIDB4OTM4ZiwgMHg5MzhmLCAweDkzOGYsIDB4OTNjZCwgMHgwODBjLAorCTB4MTRmNiwgMHgwMGU2LCAweDYwMTAsIDB4MjA3MCwgMHg3MDUwLCAweGMwYjUsIDB4NzA1MiwgMHgyMDcxLAorCTB4YWZjNywgMHg3MDI0LCAweGFjMDYsIDB4MDE5MCwgMHgwODBjLCAweDc4ZGUsIDB4NjAwNywgMHgwMDg1LAorCTB4NjAwMywgMHgwMDBiLCAweDYwMWYsIDB4MDAwMiwgMHgyMDAxLCAweGFmYTQsIDB4MjAwNCwgMHg2MDE2LAorCTB4MDgwYywgMHg2N2E4LCAweDA4MGMsIDB4NmM1MCwgMHgwMGVlLCAweDAwMDUsIDB4NjAxNywgMHgwMDAxLAorCTB4MGNkOCwgMHgwMGQ2LCAweDYwMTAsIDB4MjA2OCwgMHg2ODUwLCAweGMwYjUsIDB4Njg1MiwgMHgwMGRlLAorCTB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDFmLCAweDAwMDIsIDB4MDgwYywgMHg2N2E4LAorCTB4MDgwYywgMHg2YzUwLCAweDAwMDUsIDB4MDBkNiwgMHg2MDE3LCAweDAwMDEsIDB4NjAxMCwgMHgyMDY4LAorCTB4Njg1MCwgMHhjMGI1LCAweDY4NTIsIDB4MDBkZSwgMHgwMDA1LCAweDA4MGMsIDB4ODA3OCwgMHgwMDA1LAorCTB4MDgwYywgMHgxOTBiLCAweDA4ZjAsIDB4NjAwMCwgMHhhMDhhLCAweDAwMTAsIDB4MWEwYywgMHgxNGY2LAorCTB4MDAwYiwgMHgwMDA1LCAweDkzZWEsIDB4OTM3MSwgMHg5M2VjLCAweDkzZWEsIDB4OTNlYywgMHg5M2VjLAorCTB4OTM2YSwgMHg5M2VhLCAweDkzNjQsIDB4OTM2NCwgMHg5M2VhLCAweDkzZWEsIDB4OTNlYSwgMHg5M2VhLAorCTB4OTNlYSwgMHg5M2VhLCAweDA4MGMsIDB4MTRmNiwgMHgwMGQ2LCAweDYwMTgsIDB4MjA2OCwgMHg2ODA0LAorCTB4YTA4NCwgMHgwMGZmLCAweDAwZGUsIDB4YTA4YSwgMHgwMDBjLCAweDFhMGMsIDB4MTRmNiwgMHgwMDBiLAorCTB4MDAwNSwgMHg5NDA1LCAweDk0YTcsIDB4OTQwNywgMHg5NDQxLCAweDk0MDcsIDB4OTQ0MSwgMHg5NDA3LAorCTB4OTQxMSwgMHg5NDA1LCAweDk0NDEsIDB4OTQwNSwgMHg5NDJkLCAweDA4MGMsIDB4MTRmNiwgMHg2MDA0LAorCTB4YTA4ZSwgMHgwMDE2LCAweDA1ODgsIDB4YTA4ZSwgMHgwMDA0LCAweDA1NzAsIDB4YTA4ZSwgMHgwMDAyLAorCTB4MDU1OCwgMHg2MDA0LCAweDA4MGMsIDB4OTc4OSwgMHgwOTA0LCAweDk0YzAsIDB4YTA4ZSwgMHgwMDIxLAorCTB4MDkwNCwgMHg5NGM0LCAweGEwOGUsIDB4MDAyMiwgMHgwOTA0LCAweDk0YzAsIDB4YTA4ZSwgMHgwMDNkLAorCTB4MDkwNCwgMHg5NGM0LCAweGEwOGUsIDB4MDAzOSwgMHgwOTA0LCAweDk0YzgsIDB4YTA4ZSwgMHgwMDM1LAorCTB4MDkwNCwgMHg5NGM4LCAweGEwOGUsIDB4MDAxZSwgMHgwMTg4LCAweGEwOGUsIDB4MDAwMSwgMHgxMTUwLAorCTB4MDBkNiwgMHg2MDE4LCAweDIwNjgsIDB4NjgwNCwgMHhhMDg0LCAweDAwZmYsIDB4MDBkZSwgMHhhMDg2LAorCTB4MDAwNiwgMHgwMTEwLCAweDA4MGMsIDB4MmFkOSwgMHgwODBjLCAweDg1ZjMsIDB4MDgwYywgMHg5NzRlLAorCTB4MDAwNSwgMHgwMGM2LCAweDAwZDYsIDB4NjEwNCwgMHhhMTg2LCAweDAwMTYsIDB4MDkwNCwgMHg5NDk4LAorCTB4YTE4NiwgMHgwMDAyLCAweDE1MTgsIDB4NjAxOCwgMHgyMDY4LCAweDIwMDEsIDB4YWQzNCwgMHgyMDA0LAorCTB4ZDBhYywgMHgxOTA0LCAweDk0ZWEsIDB4NjhhMCwgMHhkMGJjLCAweDE5MDQsIDB4OTRlYSwgMHg2ODQwLAorCTB4YTA4NCwgMHgwMGZmLCAweGEwMDUsIDB4MDE5MCwgMHg4MDAxLCAweDY4NDIsIDB4NjAxMywgMHgwMDAwLAorCTB4NjAxZiwgMHgwMDA3LCAweDYwMTcsIDB4MDM5OCwgMHg2MDNmLCAweDAwMDAsIDB4MDgwYywgMHg4MDIyLAorCTB4MDEyOCwgMHgyZDAwLCAweDYwMWEsIDB4NjAxZiwgMHgwMDAxLCAweDA0NTAsIDB4MDBkZSwgMHgwMGNlLAorCTB4NjAwNCwgMHhhMDhlLCAweDAwMDIsIDB4MTFhOCwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LAorCTB4YTA4NiwgMHgwMDdlLCAweDExNzAsIDB4MjAwOSwgMHhhZDM0LCAweDIxMDQsIDB4YzA4NSwgMHgyMDBhLAorCTB4MDBlNiwgMHgyMDcxLCAweGFkMDAsIDB4MDgwYywgMHg0OGY1LCAweDAwZWUsIDB4MDgwYywgMHg4NWYzLAorCTB4MDAyMCwgMHgwODBjLCAweDg1ZjMsIDB4MDgwYywgMHgyYWQ5LCAweDAwZTYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDJhZmYsIDB4MDEyZSwgMHgwMGVlLCAweDA4MGMsIDB4OTc0ZSwgMHgwMDA1LAorCTB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NGMzMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAyLAorCTB4MDgwYywgMHg2N2VlLCAweDA4MGMsIDB4NmM1MCwgMHgwMGRlLCAweDAwY2UsIDB4MGM4MCwgMHgwMGM2LAorCTB4MDBkNiwgMHg2MTA0LCAweGExODYsIDB4MDAxNiwgMHgwZDU4LCAweDYwMTgsIDB4MjA2OCwgMHg2ODQwLAorCTB4YTA4NCwgMHgwMGZmLCAweGEwMDUsIDB4MDkwNCwgMHg5NDZlLCAweDgwMDEsIDB4Njg0MiwgMHg2MDAzLAorCTB4MDAwMSwgMHgwODBjLCAweDY3ZWUsIDB4MDgwYywgMHg2YzUwLCAweDAwZGUsIDB4MDBjZSwgMHgwOGI4LAorCTB4MDgwYywgMHg4NWYzLCAweDA4MDQsIDB4OTQzZSwgMHgwODBjLCAweDg2MjEsIDB4MDgwNCwgMHg5NDNlLAorCTB4MDBkNiwgMHgyYzY4LCAweDYxMDQsIDB4MDgwYywgMHg5YTM0LCAweDAwZGUsIDB4MDExOCwgMHgwODBjLAorCTB4ODA3OCwgMHgwMGI4LCAweDYwMDQsIDB4ODAwNywgMHg2MTMwLCAweGExOGMsIDB4MDBmZiwgMHhhMTA1LAorCTB4NjAzMiwgMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMWYsIDB4MDAwMiwgMHg2MDM4LAorCTB4NjAwYSwgMHgyMDAxLCAweGFmYTQsIDB4MjAwNCwgMHg2MDE2LCAweDA4MGMsIDB4NjdhOCwgMHgwODBjLAorCTB4NmM1MCwgMHgwMDA1LCAweDAwZGUsIDB4MDBjZSwgMHgwODBjLCAweDg1ZjMsIDB4MDgwYywgMHgyYWQ5LAorCTB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDJhZmYsIDB4NjAxMywgMHgwMDAwLAorCTB4NjAxZiwgMHgwMDA3LCAweDYwMTcsIDB4MDM5OCwgMHg2MDNmLCAweDAwMDAsIDB4MDEyZSwgMHgwMGVlLAorCTB4MDAwNSwgMHg2MDAwLCAweGEwOGEsIDB4MDAxMCwgMHgxYTBjLCAweDE0ZjYsIDB4MDAwYiwgMHgwMDA1LAorCTB4OTUxOCwgMHg5NTE4LCAweDk1MTgsIDB4OTUxOCwgMHg5NTE4LCAweDk1MTgsIDB4OTUxOCwgMHg5NTE4LAorCTB4OTUxOCwgMHg5MzY5LCAweDk1MTgsIDB4OTM3MSwgMHg5NTFhLCAweDkzNzEsIDB4OTUyNywgMHg5NTE4LAorCTB4MDgwYywgMHgxNGY2LCAweDYwMDQsIDB4YTA4NiwgMHgwMDhiLCAweDAxNDgsIDB4NjAwNywgMHgwMDhiLAorCTB4NjAwMywgMHgwMDBkLCAweDA4MGMsIDB4NjdhOCwgMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHgwODBjLAorCTB4OTc0MiwgMHgwODBjLCAweDk1OTYsIDB4MDU4MCwgMHgwODBjLCAweDJhZDksIDB4MDBkNiwgMHgwODBjLAorCTB4OTU5NiwgMHgwMTY4LCAweDYwMTAsIDB4MjA2OCwgMHg2ODM3LCAweDAxMDMsIDB4Njg0YiwgMHgwMDA2LAorCTB4Njg0NywgMHgwMDAwLCAweDY4NTAsIDB4YzBlZCwgMHg2ODUyLCAweDA4MGMsIDB4NTEwYywgMHgyYzY4LAorCTB4MDgwYywgMHg4MDIyLCAweDAxNTAsIDB4NjgxOCwgMHg2MDFhLCAweDA4MGMsIDB4OTk1NiwgMHgwMGM2LAorCTB4MmQ2MCwgMHgwODBjLCAweDk3NGUsIDB4MDBjZSwgMHgwMDA4LCAweDJkNjAsIDB4MDBkZSwgMHg2MDEzLAorCTB4MDAwMCwgMHg2MDFmLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLAorCTB4NjdlZSwgMHgwODBjLCAweDZjNTAsIDB4MDAxMCwgMHgwODBjLCAweDk3NGUsIDB4MDAwNSwgMHg2MDAwLAorCTB4YTA4YSwgMHgwMDEwLCAweDFhMGMsIDB4MTRmNiwgMHgwMDBiLCAweDAwMDUsIDB4OTU3NiwgMHg5NTc2LAorCTB4OTU3NiwgMHg5NTc4LCAweDk1NzksIDB4OTU3NiwgMHg5NTc2LCAweDk1NzYsIDB4OTU3NiwgMHg5NTc2LAorCTB4OTU3NiwgMHg5NTc2LCAweDk1NzYsIDB4OTU3NiwgMHg5NTc2LCAweDk1NzYsIDB4MDgwYywgMHgxNGY2LAorCTB4MDAwNSwgMHgwODBjLCAweDdjYjgsIDB4MTkwYywgMHgxNGY2LCAweDYxMTAsIDB4MjE2OCwgMHg2ODRiLAorCTB4MDAwNiwgMHgwODBjLCAweDUxMGMsIDB4MDgwYywgMHg4MDc4LCAweDAwMDUsIDB4YTI4NCwgMHgwMDA3LAorCTB4MTE1OCwgMHhhMjgyLCAweGI0MDAsIDB4MDI0MCwgMHgyMDAxLCAweGFkMTYsIDB4MjAwNCwgMHhhMjAyLAorCTB4MTIxOCwgMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHhhMDA2LCAweDBjZTgsIDB4MDAyNiwgMHg2MjEwLAorCTB4YTI5NCwgMHhmMDAwLCAweDAwMmUsIDB4MDAwNSwgMHgwMGU2LCAweDAwYzYsIDB4MDAzNiwgMHgwMDA2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA2MSwgMHhiNDAwLCAweDIwNzEsIDB4YWQwMCwgMHg3MzQ0LAorCTB4NzA2NCwgMHhhMzAyLCAweDEyYTgsIDB4NjAxYywgMHhhMjA2LCAweDExNjAsIDB4MDgwYywgMHg5OGUzLAorCTB4MDE0OCwgMHgwODBjLCAweDk3ODksIDB4MTExMCwgMHgwODBjLCAweDg1ZjMsIDB4MDBjNiwgMHgwODBjLAorCTB4ODA3OCwgMHgwMGNlLCAweGFjZTAsIDB4MDAxOCwgMHg3MDU4LCAweGFjMDIsIDB4MTIwOCwgMHgwYzM4LAorCTB4MDEyZSwgMHgwMDBlLCAweDAwM2UsIDB4MDBjZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGM2LAorCTB4MDAxNiwgMHhhMTg4LCAweGFlMzQsIDB4MjEwYywgMHg4MWZmLCAweDAxNzAsIDB4MjA2MSwgMHhiNDAwLAorCTB4MjA3MSwgMHhhZDAwLCAweDAwMTYsIDB4MDgwYywgMHg4MDIyLCAweDAwMWUsIDB4MDEzOCwgMHg2MTFhLAorCTB4MDgwYywgMHgyYWQ5LCAweDA4MGMsIDB4ODA3OCwgMHhhMDA2LCAweDAwMTAsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDAxZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGM2LCAweDAwNTYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwMGM2LCAweDA4MGMsIDB4ODAyMiwgMHgwMDVlLCAweDAxODAsIDB4NjYxMiwgMHg2NTFhLAorCTB4MDgwYywgMHg5OTU2LCAweDYwMWYsIDB4MDAwMywgMHgyMDA5LCAweDAwNGIsIDB4MDgwYywgMHg4MGE3LAorCTB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDA1ZSwgMHgwMGNlLCAweDAwMDUsIDB4YTAwNiwgMHgwY2QwLAorCTB4MDBjNiwgMHgwMDU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYyYTAsIDB4MDBjNiwgMHgwODBjLAorCTB4ODAyMiwgMHgwMDVlLCAweDA1MDgsIDB4NjAxMywgMHgwMDAwLCAweDY1MWEsIDB4MDgwYywgMHg5OTU2LAorCTB4NjAxZiwgMHgwMDAzLCAweDAwYzYsIDB4MjU2MCwgMHgwODBjLCAweDRlY2YsIDB4MDBjZSwgMHgwODBjLAorCTB4NjhlNywgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweDY4MWQsIDB4MmMwOCwgMHgwODBjLAorCTB4YTcxMiwgMHgwMDdlLCAweDIwMDksIDB4MDA0YywgMHgwODBjLCAweDgwYTcsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDEyZSwgMHgwMDVlLCAweDAwY2UsIDB4MDAwNSwgMHhhMDA2LCAweDBjZDAsIDB4MDBmNiwgMHgwMGM2LAorCTB4MDA0NiwgMHgwMGM2LCAweDA4MGMsIDB4ODAyMiwgMHgyYzc4LCAweDAwY2UsIDB4MDE4MCwgMHg3ZTEyLAorCTB4MmMwMCwgMHg3ODFhLCAweDc4MWYsIDB4MDAwMywgMHgyMDIxLCAweDAwMDUsIDB4MDgwYywgMHg5NjgzLAorCTB4MmY2MCwgMHgyMDA5LCAweDAwNGQsIDB4MDgwYywgMHg4MGE3LCAweGEwODUsIDB4MDAwMSwgMHgwMDRlLAorCTB4MDBjZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGM2LCAweDAwNDYsIDB4MDBjNiwgMHgwODBjLAorCTB4ODAyMiwgMHgyYzc4LCAweDAwY2UsIDB4MDE3OCwgMHg3ZTEyLCAweDJjMDAsIDB4NzgxYSwgMHg3ODFmLAorCTB4MDAwMywgMHgyMDIxLCAweDAwMDUsIDB4MDQzOSwgMHgyZjYwLCAweDIwMDksIDB4MDA0ZSwgMHgwODBjLAorCTB4ODBhNywgMHhhMDg1LCAweDAwMDEsIDB4MDA0ZSwgMHgwMGNlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LAorCTB4MDBjNiwgMHgwMDQ2LCAweDAwYzYsIDB4MDgwYywgMHg4MDIyLCAweDJjNzgsIDB4MDBjZSwgMHgwMTc4LAorCTB4N2UxMiwgMHgyYzAwLCAweDc4MWEsIDB4NzgxZiwgMHgwMDAzLCAweDIwMjEsIDB4MDAwNCwgMHgwMDU5LAorCTB4MmY2MCwgMHgyMDA5LCAweDAwNTIsIDB4MDgwYywgMHg4MGE3LCAweGEwODUsIDB4MDAwMSwgMHgwMDRlLAorCTB4MDBjZSwgMHgwMGZlLCAweDAwMDUsIDB4MDA5NiwgMHgwMDc2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg0ZTcxLCAweDAxMTgsIDB4MjAwMSwgMHg5Njg4LCAweDAwMjgsIDB4MDgwYywgMHg0ZTQzLAorCTB4MDE1OCwgMHgyMDAxLCAweDk2OGUsIDB4MDAwNiwgMHhhMDBlLCAweDI0MDAsIDB4MDgwYywgMHg1MWRmLAorCTB4MDgwYywgMHg1MTBjLCAweDAwMGUsIDB4MDgwNywgMHgyNDE4LCAweDA4MGMsIDB4NmIxNSwgMHg2MmEwLAorCTB4MDA4NiwgMHgyMDQxLCAweDAwMDEsIDB4MjAzOSwgMHgwMDAxLCAweDI2MDgsIDB4MDgwYywgMHg2OTAwLAorCTB4MDA4ZSwgMHgwODBjLCAweDY4MWQsIDB4MmYwOCwgMHgyNjQ4LCAweDA4MGMsIDB4YTcxMiwgMHg2MTNjLAorCTB4ODFmZiwgMHgwOTBjLCAweDY5YTksIDB4MDEyZSwgMHgwMDdlLCAweDAwOWUsIDB4MDAwNSwgMHgwMGM2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDBjNiwgMHgwODBjLCAweDgwMjIsIDB4MDAxZSwgMHgwMTg4LAorCTB4NjYwYSwgMHg2MTFhLCAweDA4MGMsIDB4OTk1NiwgMHg2MDFmLCAweDAwMDEsIDB4MmQwMCwgMHg2MDEyLAorCTB4MjAwOSwgMHgwMDFmLCAweDA4MGMsIDB4ODBhNywgMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGNlLAorCTB4MDAwNSwgMHhhMDA2LCAweDBjZDgsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGM2LAorCTB4MDgwYywgMHg4MDIyLCAweDAwMWUsIDB4MDE4OCwgMHg2NjBhLCAweDYxMWEsIDB4MDgwYywgMHg5OTU2LAorCTB4NjAxZiwgMHgwMDA4LCAweDJkMDAsIDB4NjAxMiwgMHgyMDA5LCAweDAwMjEsIDB4MDgwYywgMHg4MGE3LAorCTB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweGEwMDYsIDB4MGNkOCwgMHgwMGM2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDBjNiwgMHgwODBjLCAweDgwMjIsIDB4MDAxZSwgMHgwMTg4LAorCTB4NjYwYSwgMHg2MTFhLCAweDA4MGMsIDB4OTk1NiwgMHg2MDFmLCAweDAwMDEsIDB4MmQwMCwgMHg2MDEyLAorCTB4MjAwOSwgMHgwMDNkLCAweDA4MGMsIDB4ODBhNywgMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGNlLAorCTB4MDAwNSwgMHhhMDA2LCAweDBjZDgsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGM2LAorCTB4MDgwYywgMHg5ODA3LCAweDAwMWUsIDB4MDE4MCwgMHg2MTFhLCAweDA4MGMsIDB4OTk1NiwgMHg2MDFmLAorCTB4MDAwMSwgMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4ODBhNywgMHhhMDg1LAorCTB4MDAwMSwgMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwgMHhhMDA2LCAweDBjZDgsIDB4MDBjNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDAwYzYsIDB4MDgwYywgMHg4MDIyLCAweDAwMWUsIDB4MDE4OCwgMHg2NjBhLAorCTB4NjExYSwgMHgwODBjLCAweDk5NTYsIDB4NjAxZiwgMHgwMDAxLCAweDJkMDAsIDB4NjAxMiwgMHgyMDA5LAorCTB4MDA0NCwgMHgwODBjLCAweDgwYTcsIDB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LAorCTB4YTAwNiwgMHgwY2Q4LCAweDAwMjYsIDB4MDBkNiwgMHg2MjE4LCAweDIyNjgsIDB4NmEzYywgMHg4MmZmLAorCTB4MDExMCwgMHg4MjExLCAweDZhM2UsIDB4MDBkZSwgMHgwMDJlLCAweDAwMDUsIDB4MDAwNiwgMHg2MDAwLAorCTB4YTA4NiwgMHgwMDAwLCAweDAxOTAsIDB4NjAxMywgMHgwMDAwLCAweDYwMWYsIDB4MDAwNywgMHgyMDAxLAorCTB4YWZhMywgMHgyMDA0LCAweDAwMDYsIDB4YTA4MiwgMHgwMDUxLCAweDAwMGUsIDB4MDIwOCwgMHg4MDA0LAorCTB4NjAxNiwgMHgwODBjLCAweGFiYjQsIDB4NjAzZiwgMHgwMDAwLCAweDAwMGUsIDB4MDAwNSwgMHgwMDY2LAorCTB4MDBjNiwgMHgwMGQ2LCAweDIwMzEsIDB4YWQ1MiwgMHgyNjM0LCAweGQ2ZTQsIDB4MDEyOCwgMHg2NjE4LAorCTB4MjY2MCwgMHg2ZTQ4LCAweDA4MGMsIDB4NGRmYywgMHgwMGRlLCAweDAwY2UsIDB4MDA2ZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgwMDE2LCAweDYwMDQsIDB4YTA4ZSwgMHgwMDAyLCAweDAxNDAsIDB4YTA4ZSwgMHgwMDAzLAorCTB4MDEyOCwgMHhhMDhlLCAweDAwMDQsIDB4MDExMCwgMHhhMDg1LCAweDAwMDEsIDB4MDAxZSwgMHgwMDBlLAorCTB4MDAwNSwgMHgwMDA2LCAweDAwZDYsIDB4NjAxMCwgMHhhMDZkLCAweDAxNDgsIDB4NjgzNCwgMHhhMDg2LAorCTB4MDEzOSwgMHgwMTM4LCAweDY4MzgsIDB4ZDBmYywgMHgwMTEwLCAweGEwMDYsIDB4MDAxMCwgMHhhMDg1LAorCTB4MDAwMSwgMHgwMGRlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDBjNiwgMHgwODBjLCAweDgwMjIsIDB4MDAxZSwgMHgwMTkwLCAweDYxMWEsIDB4MDgwYywgMHg5OTU2LAorCTB4NjAxZiwgMHgwMDAxLCAweDJkMDAsIDB4NjAxMiwgMHgwODBjLCAweDJhZDksIDB4MjAwOSwgMHgwMDI4LAorCTB4MDgwYywgMHg4MGE3LCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwgMHhhMDA2LAorCTB4MGNkOCwgMHhhMTg2LCAweDAwMTUsIDB4MTE3OCwgMHgyMDExLCAweGFkMjAsIDB4MjIwNCwgMHhhMDg2LAorCTB4MDA3NCwgMHgxMTQ4LCAweDA4MGMsIDB4ODk0MywgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDI5LAorCTB4MDgwYywgMHg2N2VlLCAweDAwMjAsIDB4MDgwYywgMHg4NWYzLCAweDA4MGMsIDB4ODA3OCwgMHgwMDA1LAorCTB4YTE4NiwgMHgwMDE2LCAweDExMjgsIDB4MjAwMSwgMHgwMDA0LCAweDA4MGMsIDB4NGMzMCwgMHgwMGU4LAorCTB4YTE4NiwgMHgwMDE1LCAweDExZTgsIDB4MjAxMSwgMHhhZDIwLCAweDIyMDQsIDB4YTA4NiwgMHgwMDE0LAorCTB4MTFiOCwgMHgwMGQ2LCAweDYwMTgsIDB4MjA2OCwgMHgwODBjLCAweDRkNzIsIDB4MDBkZSwgMHgwODBjLAorCTB4ODlmNywgMHgxMTcwLCAweDAwZDYsIDB4NjAxOCwgMHgyMDY4LCAweDY4OTAsIDB4MDBkZSwgMHhhMDA1LAorCTB4MDEzOCwgMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg0YzMwLCAweDA4MGMsIDB4ODFmNiwgMHgwMDIwLAorCTB4MDgwYywgMHg4NWYzLCAweDA4MGMsIDB4ODA3OCwgMHgwMDA1LCAweDY4NDgsIDB4YTA4NiwgMHgwMDA1LAorCTB4MTEwOCwgMHgwMDA5LCAweDAwMDUsIDB4Njg1MCwgMHhjMGFkLCAweDY4NTIsIDB4MDAwNSwgMHgwMGU2LAorCTB4MDEyNiwgMHgyMDcxLCAweGFkMDAsIDB4MjA5MSwgMHg4MDAwLCAweDc1NDQsIDB4YTU4MiwgMHgwMDAxLAorCTB4MDYwOCwgMHg3MDQ4LCAweDIwNjAsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDE0OCwgMHhhY2UwLAorCTB4MDAxOCwgMHg3MDU4LCAweGFjMDIsIDB4MTIwOCwgMHgwY2IwLCAweDIwNjEsIDB4YjQwMCwgMHgwYzk4LAorCTB4NjAwMywgMHgwMDA4LCAweDg1MjksIDB4NzU0NiwgMHhhY2E4LCAweDAwMTgsIDB4NzA1OCwgMHhhNTAyLAorCTB4MTIzMCwgMHg3NTRhLCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHg3MDRiLAorCTB4YjQwMCwgMHgwY2MwLCAweGEwMDYsIDB4MGNjMCwgMHgwMGU2LCAweDIwNzEsIDB4YjI4YywgMHg3MDE0LAorCTB4ZDBlNCwgMHgwMTUwLCAweDYwMTMsIDB4MDAwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDUwLAorCTB4MDgwYywgMHg2N2E4LCAweDA4MGMsIDB4NmM1MCwgMHgwMGVlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGY2LAorCTB4MmM3OCwgMHgwODBjLCAweDUwMjksIDB4MDBmZSwgMHgwMTIwLCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLAorCTB4MDAxMywgMHgwMGNlLCAweDAwMDUsIDB4OTM2OSwgMHg5ODVlLCAweDk4NjEsIDB4OTg2NCwgMHhhOWE3LAorCTB4YTljMiwgMHhhOWM1LCAweDkzNjksIDB4OTM2OSwgMHgwODBjLCAweDE0ZjYsIDB4ZTAwMCwgMHhlMDAwLAorCTB4MDAwNSwgMHhlMDAwLCAweGUwMDAsIDB4MDAwNSwgMHgwMDA5LCAweDAwMDUsIDB4MDBmNiwgMHgyYzc4LAorCTB4MDgwYywgMHg1MDI5LCAweDA1MzgsIDB4MDgwYywgMHg4MDIyLCAweDExMjgsIDB4MjAwMSwgMHhhZmE1LAorCTB4MjAwNCwgMHg3ODNlLCAweDAwZjgsIDB4NzgxOCwgMHg2MDFhLCAweDA4MGMsIDB4OTk1NiwgMHg3ODFjLAorCTB4YTA4NiwgMHgwMDAzLCAweDAxMjgsIDB4NzgwOCwgMHg2MDM2LCAweDJmMDAsIDB4NjAzYSwgMHgwMDIwLAorCTB4NzgwOCwgMHg2MDNhLCAweDJmMDAsIDB4NjAzNiwgMHg2MDJhLCAweDYwMWYsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDAzNSwgMHg2MDAzLCAweDAwMDEsIDB4Nzk1MCwgMHg2MTUyLCAweDA4MGMsIDB4NjdhOCwgMHgwODBjLAorCTB4NmM1MCwgMHgyZjYwLCAweDAwZmUsIDB4MDAwNSwgMHgwMDE2LCAweDAwZjYsIDB4NjgyYywgMHg2MDMyLAorCTB4YTA4ZSwgMHgwMDAxLCAweDAxMzgsIDB4YTA4NiwgMHgwMDA1LCAweDAxNDAsIDB4YTAwNiwgMHg2MDJhLAorCTB4NjAyZSwgMHgwMGEwLCAweDY4MjAsIDB4YzBmNCwgMHhjMGQ1LCAweDY4MjIsIDB4NjgxMCwgMHgyMDc4LAorCTB4Nzg3YywgMHg2OTM4LCAweGExMDIsIDB4Nzg4MCwgMHg2OTM0LCAweGExMDMsIDB4MWU3OCwgMHg2ODM0LAorCTB4NjAyYSwgMHg2ODM4LCAweGEwODQsIDB4ZmZmYywgMHg2ODNhLCAweDYwMmUsIDB4MmQwMCwgMHg2MDM2LAorCTB4NjgwOCwgMHg2MDNhLCAweDY5MTgsIDB4NjExYSwgMHg2OTUwLCAweDYxNTIsIDB4NjAxZiwgMHgwMDAxLAorCTB4NjAwNywgMHgwMDM5LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDY3YTgsIDB4NjgwMywgMHgwMDAyLAorCTB4MDBmZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4NTAyOSwgMHgxMTE4LAorCTB4YTA4NSwgMHgwMDAxLCAweDAwNzAsIDB4NjAyMCwgMHhkMGY0LCAweDExNTAsIDB4YzBmNSwgMHg2MDIyLAorCTB4NjAxMCwgMHgyMDc4LCAweDc4MjgsIDB4NjAzYSwgMHg3ODJjLCAweDYwMzYsIDB4MDgwYywgMHgxOTBiLAorCTB4YTAwNiwgMHgwMGZlLCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDYwMDQsIDB4YTA4ZSwgMHgwMDM0LAorCTB4MDFiOCwgMHhhMDhlLCAweDAwMzUsIDB4MDFhMCwgMHhhMDhlLCAweDAwMzYsIDB4MDE4OCwgMHhhMDhlLAorCTB4MDAzNywgMHgwMTcwLCAweGEwOGUsIDB4MDAzOCwgMHgwMTU4LCAweGEwOGUsIDB4MDAzOSwgMHgwMTQwLAorCTB4YTA4ZSwgMHgwMDNhLCAweDAxMjgsIDB4YTA4ZSwgMHgwMDNiLCAweDAxMTAsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMGU2LAorCTB4MjAwMSwgMHhhZjlmLCAweDIwMGMsIDB4ODAwMCwgMHgyMDE0LCAweDIwMDEsIDB4MDAzMiwgMHgwODBjLAorCTB4NjY2NSwgMHgyMDAxLCAweGFmYTMsIDB4ODJmZiwgMHgxMTEwLCAweDIwMTEsIDB4MDAwMiwgMHgyMjAyLAorCTB4MjAwMSwgMHhhZmExLCAweDIwMGMsIDB4ODAwMCwgMHgyMDE0LCAweDIwNzEsIDB4YWY4ZCwgMHg3MTFhLAorCTB4NzIxZSwgMHgyMDAxLCAweDAwNjQsIDB4MDgwYywgMHg2NjY1LCAweDIwMDEsIDB4YWZhNCwgMHg4MmZmLAorCTB4MTExMCwgMHgyMDExLCAweDAwMDIsIDB4MjIwMiwgMHgyMDA5LCAweGFmYTUsIDB4YTI4MCwgMHgwMDBhLAorCTB4MjAwYSwgMHgwMGVlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LAorCTB4MDBlNiwgMHgyMDAxLCAweGFmYTMsIDB4MjAwMywgMHgwMDI4LCAweDIwMDEsIDB4YWZhNCwgMHgyMDAzLAorCTB4MDAxNCwgMHgyMDcxLCAweGFmOGQsIDB4NzAxYiwgMHgwMDAwLCAweDcwMWYsIDB4MDdkMCwgMHgyMDAxLAorCTB4YWZhNSwgMHgyMDAzLCAweDAwMWUsIDB4MDBlZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBkNiwgMHg2MDU0LAorCTB4YTA2ZCwgMHgwMTEwLCAweDA4MGMsIDB4MTVmMCwgMHgwMGRlLCAweDAwMDUsIDB4MDAwNSwgMHgwMGM2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDBjNiwgMHgwODBjLCAweDgwMjIsIDB4MDAxZSwgMHgwMTc4LAorCTB4NjExYSwgMHgwY2ExLCAweDYwMWYsIDB4MDAwMSwgMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDMzLAorCTB4MDgwYywgMHg4MGE3LCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwgMHhhMDA2LAorCTB4MGNkOCwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgyMDcxLCAweGFkMDAsIDB4YTE4NiwgMHgwMDE1LAorCTB4MTUwMCwgMHg3MDgwLCAweGEwODYsIDB4MDAxOCwgMHgxMWUwLCAweDYwMTAsIDB4MjA2OCwgMHg2YTNjLAorCTB4ZDJlNCwgMHgxMTYwLCAweDJjNzgsIDB4MDgwYywgMHg2ZTA1LCAweDAxZDgsIDB4NzA2YywgMHg2YTUwLAorCTB4YTIwNiwgMHgxMTYwLCAweDcwNzAsIDB4NmE1NCwgMHhhMjA2LCAweDExNDAsIDB4NjIxOCwgMHhhMjkwLAorCTB4MDAyOCwgMHgyMjE0LCAweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweDJiMWUsIDB4MDgwYywgMHg4MWY2LAorCTB4MDAyMCwgMHgwODBjLCAweDg1ZjMsIDB4MDgwYywgMHg4MDc4LCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLAorCTB4MDAwNSwgMHg3MDUwLCAweDZhNTQsIDB4YTIwNiwgMHgwZDQ4LCAweDBjODAsIDB4MDBjNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDAwYzYsIDB4MDgwYywgMHg4MDIyLCAweDAwMWUsIDB4MDE4MCwgMHg2MTFhLAorCTB4MDgwYywgMHg5OTU2LCAweDYwMWYsIDB4MDAwMSwgMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDQzLAorCTB4MDgwYywgMHg4MGE3LCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwgMHhhMDA2LAorCTB4MGNkOCwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgyMDcxLCAweGFkMDAsIDB4YTE4NiwgMHgwMDE1LAorCTB4MTFjMCwgMHg3MDgwLCAweGEwODYsIDB4MDAwNCwgMHgxMWEwLCAweDYwMTAsIDB4YTBlOCwgMHgwMDBmLAorCTB4MmM3OCwgMHgwODBjLCAweDZlMDUsIDB4MDFhOCwgMHg3MDZjLCAweDZhMDgsIDB4YTIwNiwgMHgxMTMwLAorCTB4NzA3MCwgMHg2YTBjLCAweGEyMDYsIDB4MTExMCwgMHgwODBjLCAweDJhZDksIDB4MDgwYywgMHg4MWY2LAorCTB4MDAyMCwgMHgwODBjLCAweDg1ZjMsIDB4MDgwYywgMHg4MDc4LCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLAorCTB4MDAwNSwgMHg3MDUwLCAweDZhMGMsIDB4YTIwNiwgMHgwZDc4LCAweDBjODAsIDB4MDAxNiwgMHgwMDI2LAorCTB4Njg0YywgMHhkMGFjLCAweDAxNzgsIDB4NjkxNCwgMHg2YTEwLCAweDIxMDAsIDB4YTIwNSwgMHgwMTUwLAorCTB4Njg2MCwgMHhhMTA2LCAweDExMTgsIDB4Njg1YywgMHhhMjA2LCAweDAxMjAsIDB4Njk2MiwgMHg2YTVlLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwZDYsIDB4MDAzNiwgMHg2MzEwLAorCTB4MjM2OCwgMHg2ODRhLCAweDY5NTIsIDB4YTI5ZSwgMHg0MDAwLCAweDExODgsIDB4MDBjNiwgMHg2MzE4LAorCTB4MjM2MCwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHg0ZjZlLCAweDExMDgsIDB4YzE4NSwgMHg2MDAwLAorCTB4ZDBiYywgMHgwMTA4LCAweGMxOGQsIDB4NmE2NiwgMHg2OTZhLCAweDAwY2UsIDB4MDA4MCwgMHg2YTY2LAorCTB4MzkxOCwgMHhhMzk4LCAweDAwMDYsIDB4MjMxYywgMHg2ODZiLCAweDAwMDQsIDB4NmI3MiwgMHgwMGM2LAorCTB4NjMxOCwgMHgyMzYwLCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweDY4NmUsIDB4MDBjZSwgMHgwODBjLAorCTB4NTEwYywgMHgwMDNlLCAweDAwZGUsIDB4MDAwNSwgMHgwMGM2LCAweDAwMjYsIDB4MDAxNiwgMHhhMTg2LAorCTB4MDAzNSwgMHgwMTEwLCAweDZhMzQsIDB4MDAwOCwgMHg2YTI4LCAweDA4MGMsIDB4OTU4NiwgMHgwMWYwLAorCTB4MjI2MCwgMHg2MTFjLCAweGExODYsIDB4MDAwMywgMHgwMTE4LCAweGExODYsIDB4MDAwNiwgMHgxMTkwLAorCTB4NjgzNCwgMHhhMjA2LCAweDAxNDAsIDB4NjgzOCwgMHhhMjA2LCAweDExNjAsIDB4NjEwOCwgMHg2ODM0LAorCTB4YTEwNiwgMHgxMTQwLCAweDAwMjAsIDB4NjAwOCwgMHg2OTM4LCAweGExMDYsIDB4MTExOCwgMHg2MDE4LAorCTB4NjkxOCwgMHhhMTA2LCAweDAwMWUsIDB4MDAyZSwgMHgwMGNlLCAweDAwMDUsIDB4YTA4NSwgMHgwMDAxLAorCTB4MGNjOCwgMHgwMDY2LCAweDYwMDAsIDB4YTBiMiwgMHgwMDEwLCAweDFhMGMsIDB4MTRmNiwgMHgwMDEzLAorCTB4MDA2ZSwgMHgwMDA1LCAweDlhN2EsIDB4OWVmZiwgMHhhMDI3LCAweDlhN2EsIDB4OWE3YSwgMHg5YTdhLAorCTB4OWE3YSwgMHg5YTdhLCAweDlhYjIsIDB4YTBhMywgMHg5YTdhLCAweDlhN2EsIDB4OWE3YSwgMHg5YTdhLAorCTB4OWE3YSwgMHg5YTdhLCAweDA4MGMsIDB4MTRmNiwgMHgwMDY2LCAweDYwMDAsIDB4YTBiMiwgMHgwMDEwLAorCTB4MWEwYywgMHgxNGY2LCAweDAwMTMsIDB4MDA2ZSwgMHgwMDA1LCAweDlhOTUsIDB4YTRmZCwgMHg5YTk1LAorCTB4OWE5NSwgMHg5YTk1LCAweDlhOTUsIDB4OWE5NSwgMHg5YTk1LCAweGE0YzEsIDB4YTU0NSwgMHg5YTk1LAorCTB4YWFlYSwgMHhhYjFhLCAweGFhZWEsIDB4YWIxYSwgMHg5YTk1LCAweDA4MGMsIDB4MTRmNiwgMHgwMDY2LAorCTB4NjAwMCwgMHhhMGIyLCAweDAwMTAsIDB4MWEwYywgMHgxNGY2LCAweDAwMTMsIDB4MDA2ZSwgMHgwMDA1LAorCTB4OWFiMCwgMHhhMWQ4LCAweGEyOTUsIDB4YTJjMiwgMHhhMzQ2LCAweDlhYjAsIDB4YTQzMywgMHhhM2RlLAorCTB4YTBhZiwgMHhhNDk3LCAweGE0YWMsIDB4OWFiMCwgMHg5YWIwLCAweDlhYjAsIDB4OWFiMCwgMHg5YWIwLAorCTB4MDgwYywgMHgxNGY2LCAweGExYjIsIDB4MDA4MCwgMHgxYTBjLCAweDE0ZjYsIDB4MjEwMCwgMHhhMWIyLAorCTB4MDA0MCwgMHgxYTA0LCAweDllNzksIDB4MDAwMiwgMHg5YWZjLCAweDljYWIsIDB4OWFmYywgMHg5YWZjLAorCTB4OWFmYywgMHg5Y2IyLCAweDlhZmMsIDB4OWFmYywgMHg5YWZjLCAweDlhZmMsIDB4OWFmYywgMHg5YWZjLAorCTB4OWFmYywgMHg5YWZjLCAweDlhZmMsIDB4OWFmYywgMHg5YWZjLCAweDlhZmMsIDB4OWFmYywgMHg5YWZjLAorCTB4OWFmYywgMHg5YWZjLCAweDlhZmMsIDB4OWFmZSwgMHg5YjVhLCAweDliNjUsIDB4OWJhNiwgMHg5YmMwLAorCTB4OWMzZSwgMHg5YzljLCAweDlhZmMsIDB4OWFmYywgMHg5Y2I1LCAweDlhZmMsIDB4OWFmYywgMHg5Y2M0LAorCTB4OWNjYiwgMHg5YWZjLCAweDlhZmMsIDB4OWFmYywgMHg5YWZjLCAweDlhZmMsIDB4OWQ0MiwgMHg5YWZjLAorCTB4OWFmYywgMHg5ZDRkLCAweDlhZmMsIDB4OWFmYywgMHg5ZDE4LCAweDlhZmMsIDB4OWFmYywgMHg5YWZjLAorCTB4OWQ2MSwgMHg5YWZjLCAweDlhZmMsIDB4OWFmYywgMHg5ZGQ1LCAweDlhZmMsIDB4OWFmYywgMHg5YWZjLAorCTB4OWFmYywgMHg5YWZjLCAweDlhZmMsIDB4OWU0MCwgMHgwODBjLCAweDE0ZjYsIDB4MDgwYywgMHg1MDJkLAorCTB4MTE0MCwgMHgyMDAxLCAweGFkMzQsIDB4MjAwNCwgMHhhMDg0LCAweDAwMDksIDB4YTA4NiwgMHgwMDA4LAorCTB4MTE0MCwgMHg2MDA3LCAweDAwMDksIDB4NjAyYiwgMHgwMDA5LCAweDYwMTMsIDB4MDAwMCwgMHgwODA0LAorCTB4OWNhNiwgMHgwODBjLCAweDUwMWQsIDB4MDBlNiwgMHgwMGM2LCAweDAwMzYsIDB4MDAyNiwgMHgwMDE2LAorCTB4NjIxOCwgMHgyMjcwLCAweDcyYTAsIDB4MDAyNiwgMHgyMDE5LCAweDAwMjksIDB4MDgwYywgMHg2OGU3LAorCTB4MDA3NiwgMHgyMDM5LCAweDAwMDAsIDB4MDgwYywgMHg2ODFkLCAweDJjMDgsIDB4MDgwYywgMHhhNzEyLAorCTB4MDA3ZSwgMHgwMDFlLCAweDJlNjAsIDB4MDgwYywgMHg0ZWNmLCAweDAwMWUsIDB4MDAyZSwgMHgwMDNlLAorCTB4MDBjZSwgMHgwMGVlLCAweDY2MTgsIDB4MDBjNiwgMHgyNjYwLCAweDA4MGMsIDB4NGNlYiwgMHgwMGNlLAorCTB4YTZiMCwgMHgwMDAxLCAweDI2MzQsIDB4YTY4NCwgMHgwMGZmLCAweGEwODIsIDB4MDAwNiwgMHgwMjc4LAorCTB4MDgwYywgMHhhNjU2LCAweDE5MDQsIDB4OWJhMCwgMHgwODBjLCAweGE1ZjYsIDB4MTEyMCwgMHg2MDA3LAorCTB4MDAwOCwgMHgwODA0LCAweDljYTYsIDB4NjAwNywgMHgwMDA5LCAweDA4MDQsIDB4OWNhNiwgMHgwODBjLAorCTB4YTgwMSwgMHgwMTI4LCAweDA4MGMsIDB4YTY1NiwgMHgwZDc4LCAweDA4MDQsIDB4OWJhMCwgMHg2MDEzLAorCTB4MTkwMCwgMHgwYzg4LCAweDYxMDYsIDB4MDgwYywgMHhhNWE2LCAweDYwMDcsIDB4MDAwNiwgMHgwODA0LAorCTB4OWNhNiwgMHg2MDA3LCAweDAwMDcsIDB4MDgwNCwgMHg5Y2E2LCAweDA4MGMsIDB4YWI0ZSwgMHgxOTA0LAorCTB4OWU3NiwgMHgwMGQ2LCAweDY2MTgsIDB4MjY2OCwgMHg2ZTA0LCAweGE2YjQsIDB4ZmYwMCwgMHg4NjM3LAorCTB4YTY4NiwgMHgwMDA2LCAweDAxODgsIDB4YTY4NiwgMHgwMDA0LCAweDAxNzAsIDB4NmUwNCwgMHhhNmI0LAorCTB4MDBmZiwgMHhhNjg2LCAweDAwMDYsIDB4MDE0MCwgMHhhNjg2LCAweDAwMDQsIDB4MDEyOCwgMHhhNjg2LAorCTB4MDAwNSwgMHgwMTEwLCAweDAwZGUsIDB4MDBlMCwgMHgwODBjLCAweGE2YjQsIDB4MTFhMCwgMHhhNjg2LAorCTB4MDAwNiwgMHgxMTUwLCAweDAwMjYsIDB4NjIxOCwgMHhhMjkwLCAweDAwMjgsIDB4MjIxNCwgMHgyMDA5LAorCTB4MDAwMCwgMHgwODBjLCAweDJiMWUsIDB4MDAyZSwgMHgwODBjLCAweDRkNzIsIDB4NjAwNywgMHgwMDBhLAorCTB4MDBkZSwgMHgwODA0LCAweDljYTYsIDB4NjAwNywgMHgwMDBiLCAweDAwZGUsIDB4MDgwNCwgMHg5Y2E2LAorCTB4MDgwYywgMHgyYWQ5LCAweDYwMDcsIDB4MDAwMSwgMHgwODA0LCAweDljYTYsIDB4MDgwYywgMHhhYjRlLAorCTB4MTkwNCwgMHg5ZTc2LCAweDY2MTgsIDB4MDBkNiwgMHgyNjY4LCAweDZlMDQsIDB4MDBkZSwgMHhhNjg2LAorCTB4MDcwNywgMHgwZDcwLCAweDAwMjYsIDB4NjIxOCwgMHhhMjkwLCAweDAwMjgsIDB4MjIxNCwgMHgyMDA5LAorCTB4MDAwMCwgMHgwODBjLCAweDJiMWUsIDB4MDAyZSwgMHg2MDA3LCAweDAwMGMsIDB4MDgwNCwgMHg5Y2E2LAorCTB4MDgwYywgMHg1MDJkLCAweDExNDAsIDB4MjAwMSwgMHhhZDM0LCAweDIwMDQsIDB4YTA4NCwgMHgwMDA5LAorCTB4YTA4NiwgMHgwMDA4LCAweDExMTAsIDB4MDgwNCwgMHg5YjA5LCAweDA4MGMsIDB4NTAxZCwgMHg2NjE4LAorCTB4YTZiMCwgMHgwMDAxLCAweDI2MzQsIDB4YTY4NCwgMHgwMGZmLCAweGEwODIsIDB4MDAwNiwgMHgwNmU4LAorCTB4MTEzOCwgMHgwMDI2LCAweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDRjNWQsIDB4MDAyZSwgMHgwMDUwLAorCTB4YTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4YTY4NiwgMHgwMDA0LCAweDAxMjAsIDB4YTY4NiwgMHgwMDA2LAorCTB4MTkwNCwgMHg5YmEwLCAweDA4MGMsIDB4YTZjMSwgMHgxMTIwLCAweDYwMDcsIDB4MDAwZSwgMHgwODA0LAorCTB4OWNhNiwgMHgwMDQ2LCAweDY0MTgsIDB4YTRhMCwgMHgwMDI4LCAweDI0MjQsIDB4YTRhNCwgMHgwMGZmLAorCTB4ODQyNywgMHgwMDQ2LCAweDA4MGMsIDB4MmFkOSwgMHgwMDRlLCAweDAwMTYsIDB4YTAwNiwgMHgyMDA5LAorCTB4YWQ1MiwgMHgyMTBjLCAweGQxYTQsIDB4MDE1OCwgMHgyMDA5LCAweDAwMjksIDB4MDgwYywgMHhhOTZjLAorCTB4NjAxOCwgMHgwMGQ2LCAweDIwNjgsIDB4NjgwMCwgMHhjMGU1LCAweDY4MDIsIDB4MDBkZSwgMHgwMDFlLAorCTB4MDA0ZSwgMHg2MDA3LCAweDAwMDEsIDB4MDgwNCwgMHg5Y2E2LCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLAorCTB4NGMxZSwgMHgwMTU2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDIwYTksIDB4MDAwNCwgMHgyMDE5LAorCTB4YWQwNSwgMHgyMDExLCAweGIyOTAsIDB4MDgwYywgMHg4YTdjLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDE1ZSwgMHhhMDA1LCAweDAxNjgsIDB4YTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4YTY4MiwgMHgwMDA0LAorCTB4MGEwNCwgMHg5YmEwLCAweGE2ODIsIDB4MDAwNywgMHgwYTA0LCAweDliZWEsIDB4MDgwNCwgMHg5YmEwLAorCTB4NjAxMywgMHgxOTAwLCAweDYwMDcsIDB4MDAwOSwgMHgwODA0LCAweDljYTYsIDB4MDgwYywgMHg1MDJkLAorCTB4MTE0MCwgMHgyMDAxLCAweGFkMzQsIDB4MjAwNCwgMHhhMDg0LCAweDAwMDksIDB4YTA4NiwgMHgwMDA4LAorCTB4MTExMCwgMHgwODA0LCAweDliMDksIDB4MDgwYywgMHg1MDFkLCAweDY2MTgsIDB4YTZiMCwgMHgwMDAxLAorCTB4MjYzNCwgMHhhNjg0LCAweDAwZmYsIDB4YTA4MiwgMHgwMDA2LCAweDA2YjAsIDB4YTZiNCwgMHhmZjAwLAorCTB4ODYzNywgMHhhNjg2LCAweDAwMDQsIDB4MDEyMCwgMHhhNjg2LCAweDAwMDYsIDB4MTkwNCwgMHg5YmEwLAorCTB4MDgwYywgMHhhNmU5LCAweDExMzAsIDB4MDgwYywgMHhhNWY2LCAweDExMTgsIDB4NjAwNywgMHgwMDEwLAorCTB4MDRlOCwgMHgwMDQ2LCAweDY0MTgsIDB4YTRhMCwgMHgwMDI4LCAweDI0MjQsIDB4YTRhNCwgMHgwMGZmLAorCTB4ODQyNywgMHgwMDQ2LCAweDA4MGMsIDB4MmFkOSwgMHgwMDRlLCAweDAwMTYsIDB4YTAwNiwgMHgyMDA5LAorCTB4YWQ1MiwgMHgyMTBjLCAweGQxYTQsIDB4MDE1OCwgMHgyMDA5LCAweDAwMjksIDB4MDgwYywgMHhhOTZjLAorCTB4NjAxOCwgMHgwMGQ2LCAweDIwNjgsIDB4NjgwMCwgMHhjMGU1LCAweDY4MDIsIDB4MDBkZSwgMHgwMDFlLAorCTB4MDA0ZSwgMHg2MDA3LCAweDAwMDEsIDB4MDBkMCwgMHgwODBjLCAweGE4MDEsIDB4MDE0MCwgMHhhNmI0LAorCTB4ZmYwMCwgMHg4NjM3LCAweGE2ODYsIDB4MDAwNiwgMHgwOTU4LCAweDA4MDQsIDB4OWJhMCwgMHg2MDEzLAorCTB4MTkwMCwgMHg2MDA3LCAweDAwMDksIDB4MDA1MCwgMHgwODBjLCAweGFiNGUsIDB4MTkwNCwgMHg5ZTc2LAorCTB4MDgwYywgMHg5ZTk4LCAweDE5MDQsIDB4OWJhMCwgMHg2MDA3LCAweDAwMTIsIDB4NjAwMywgMHgwMDAxLAorCTB4MDgwYywgMHg2N2VlLCAweDAwMDUsIDB4NjAwNywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLAorCTB4NjdlZSwgMHgwY2MwLCAweDYwMDcsIDB4MDAwNSwgMHgwY2MwLCAweDA4MGMsIDB4YWI0ZSwgMHgxOTA0LAorCTB4OWU3NiwgMHgwODBjLCAweDllOTgsIDB4MTkwNCwgMHg5YmEwLCAweDYwMDcsIDB4MDAyMCwgMHg2MDAzLAorCTB4MDAwMSwgMHgwODBjLCAweDY3ZWUsIDB4MDAwNSwgMHg2MDA3LCAweDAwMjMsIDB4NjAwMywgMHgwMDAxLAorCTB4MDgwYywgMHg2N2VlLCAweDAwMDUsIDB4MDgwYywgMHhhYjRlLCAweDE5MDQsIDB4OWU3NiwgMHgwODBjLAorCTB4OWU5OCwgMHgxOTA0LCAweDliYTAsIDB4MDAxNiwgMHgwMDI2LCAweDIwMTEsIDB4YjI5MSwgMHgyMjE0LAorCTB4YTI4NiwgMHhmZmZmLCAweDAxOTAsIDB4MmMwOCwgMHgwODBjLCAweDk1ODYsIDB4MDFkOCwgMHgyMjYwLAorCTB4MjAxMSwgMHhiMjkwLCAweDIyMTQsIDB4NjAwOCwgMHhhMjA2LCAweDExYTAsIDB4NjAxOCwgMHhhMTkwLAorCTB4MDAwNiwgMHgyMjE0LCAweGEyMDYsIDB4MDFlMCwgMHgwMDY4LCAweDIwMTEsIDB4YjI5MCwgMHgyMjE0LAorCTB4MmMwOCwgMHgwODBjLCAweGE5NDAsIDB4MTFhMCwgMHgyMDExLCAweGIyOTEsIDB4MjIxNCwgMHhhMjg2LAorCTB4ZmZmZiwgMHgwMWEwLCAweDIxNjAsIDB4NjAwNywgMHgwMDI2LCAweDYwMTMsIDB4MTcwMCwgMHgyMDExLAorCTB4YjI4OSwgMHgyMjE0LCAweGEyOTYsIDB4ZmZmZiwgMHgxMTYwLCAweDYwMDcsIDB4MDAyNSwgMHgwMDQ4LAorCTB4NjAxYywgMHhhMDg2LCAweDAwMDcsIDB4MWQ3MCwgMHgwODBjLCAweDgwNzgsIDB4MjE2MCwgMHg2MDA3LAorCTB4MDAyNSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2N2VlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LAorCTB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4NGMxZSwgMHgwMTU2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LAorCTB4MjBhOSwgMHgwMDA0LCAweDIwMTksIDB4YWQwNSwgMHgyMDExLCAweGIyOTYsIDB4MDgwYywgMHg4YTdjLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDE1ZSwgMHgwMTIwLCAweDYwMDcsIDB4MDAzMSwgMHgwODA0LAorCTB4OWNhNiwgMHgwODBjLCAweDg3YmQsIDB4MDgwYywgMHg1NzRmLCAweDExNTgsIDB4MDAwNiwgMHgwMDI2LAorCTB4MDAzNiwgMHgwODBjLCAweDU3NmIsIDB4MDExMCwgMHgwODBjLCAweDU3MjYsIDB4MDAzZSwgMHgwMDJlLAorCTB4MDAwZSwgMHgwMDA1LCAweDYxMDYsIDB4MDgwYywgMHg5ZWI0LCAweDYwMDcsIDB4MDAyYiwgMHgwODA0LAorCTB4OWNhNiwgMHg2MDA3LCAweDAwMmMsIDB4MDgwNCwgMHg5Y2E2LCAweDA4MGMsIDB4YWI0ZSwgMHgxOTA0LAorCTB4OWU3NiwgMHgwODBjLCAweDllOTgsIDB4MTkwNCwgMHg5YmEwLCAweDYxMDYsIDB4MDgwYywgMHg5ZWI4LAorCTB4MTEyMCwgMHg2MDA3LCAweDAwMmUsIDB4MDgwNCwgMHg5Y2E2LCAweDYwMDcsIDB4MDAyZiwgMHgwODA0LAorCTB4OWNhNiwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHg2MDE4LCAweGEwODAsIDB4MDAwMSwgMHgyMDBjLAorCTB4YTE4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgwMTU4LCAweGExODQsIDB4ZmYwMCwgMHg4MDA3LAorCTB4YTA4NiwgMHgwMDA2LCAweDAxMjgsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDgwNCwgMHg5Y2FiLAorCTB4MjAwMSwgMHhhZDcxLCAweDIwMDQsIDB4ZDBlNCwgMHgwOTA0LCAweDlkZDIsIDB4MjA3MSwgMHhiMjhjLAorCTB4NzAxMCwgMHg2MDM2LCAweDcwMTQsIDB4NjAzYSwgMHg3MTA4LCAweDcyMGMsIDB4MjAwMSwgMHhhZDUyLAorCTB4MjAwNCwgMHhkMGE0LCAweDAxNDAsIDB4NjAxOCwgMHgyMDY4LCAweDY4MTAsIDB4YTEwNiwgMHgxMTE4LAorCTB4NjgxNCwgMHhhMjA2LCAweDAxZjgsIDB4MjAwMSwgMHhhZDUyLCAweDIwMDQsIDB4ZDBhYywgMHgxNTgwLAorCTB4MjA2OSwgMHhhZDAwLCAweDY4NzAsIDB4YTIwNiwgMHgxNTU4LCAweDY4NmMsIDB4YTEwNiwgMHgxNTQwLAorCTB4NzIxMCwgMHgwODBjLCAweDk1ODYsIDB4MDU0OCwgMHgwODBjLCAweGE5ZDQsIDB4MDUzMCwgMHg2MjJhLAorCTB4NjAwNywgMHgwMDM2LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDY3YTgsIDB4MDBjZSwgMHgwMGRlLAorCTB4MDBlZSwgMHgwMDA1LCAweDcyMTQsIDB4YTI4NiwgMHhmZmZmLCAweDAxNTAsIDB4MDgwYywgMHg5NTg2LAorCTB4MDFhMCwgMHhhMjgwLCAweDAwMDIsIDB4MjAwNCwgMHg3MTEwLCAweGExMDYsIDB4MTE3MCwgMHgwYzA4LAorCTB4NzIxMCwgMHgyYzA4LCAweDA4MGMsIDB4YTk0MCwgMHgyYzEwLCAweDIxNjAsIDB4MDEzMCwgMHgwOGM4LAorCTB4NjAwNywgMHgwMDM3LCAweDYwMTMsIDB4MTUwMCwgMHgwOGU4LCAweDYwMDcsIDB4MDAzNywgMHg2MDEzLAorCTB4MTcwMCwgMHgwOGMwLCAweDYwMDcsIDB4MDAxMiwgMHgwOGE4LCAweDYwMTgsIDB4YTA4MCwgMHgwMDAxLAorCTB4MjAwNCwgMHhhMDg0LCAweGZmMDAsIDB4ODAwNywgMHhhMDg2LCAweDAwMDYsIDB4MTkwNCwgMHg5Y2FiLAorCTB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MjAwMSwgMHhhZDcxLCAweDIwMDQsIDB4ZDBlNCwgMHgwOTA0LAorCTB4OWUzOCwgMHgyMDY5LCAweGFkMDAsIDB4MjA3MSwgMHhiMjhjLCAweDcwMDgsIDB4NjAzNiwgMHg3MjBjLAorCTB4NjIzYSwgMHhhMjg2LCAweGZmZmYsIDB4MTE0MCwgMHg3MjA4LCAweDAwYzYsIDB4MmMwOCwgMHgwODBjLAorCTB4YTk0MCwgMHgyYzEwLCAweDAwY2UsIDB4MDU4OCwgMHgwODBjLCAweDk1ODYsIDB4MDU3MCwgMHgwMGM2LAorCTB4MDAyNiwgMHgyMjYwLCAweDA4MGMsIDB4OTI4ZiwgMHgwMDJlLCAweDAwY2UsIDB4NzExOCwgMHhhMThjLAorCTB4ZmYwMCwgMHg4MTBmLCAweGExODYsIDB4MDAwMSwgMHgwMTU4LCAweGExODYsIDB4MDAwNSwgMHgwMTE4LAorCTB4YTE4NiwgMHgwMDA3LCAweDExNzgsIDB4YTI4MCwgMHgwMDA0LCAweDIwMDQsIDB4YTAwNSwgMHgwMTUwLAorCTB4MDA1NiwgMHg3NTEwLCAweDc2MTQsIDB4MDgwYywgMHhhOWViLCAweDAwNWUsIDB4MDBjZSwgMHgwMGRlLAorCTB4MDBlZSwgMHgwMDA1LCAweDYwMDcsIDB4MDAzYiwgMHg2MDJiLCAweDAwMDksIDB4NjAxMywgMHgyYTAwLAorCTB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NjdhOCwgMHgwYzg4LCAweDYwMDcsIDB4MDAzYiwgMHg2MDJiLAorCTB4MDAwOSwgMHg2MDEzLCAweDE3MDAsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NjdhOCwgMHgwYzMwLAorCTB4NjAwNywgMHgwMDNiLCAweDYwMmIsIDB4MDAwYiwgMHg2MDEzLCAweDAwMDAsIDB4MDgwNCwgMHg5ZGFhLAorCTB4MDBlNiwgMHgwMDI2LCAweDA4MGMsIDB4NTAyZCwgMHgwNTU4LCAweDA4MGMsIDB4NTAxZCwgMHgwODBjLAorCTB4YWJjNSwgMHgxNTIwLCAweDIwNzEsIDB4YWQwMCwgMHg3MGQwLCAweGMwODUsIDB4NzBkMiwgMHgwMGY2LAorCTB4MjA3OSwgMHgwMTAwLCAweDcyOWMsIDB4YTI4NCwgMHgwMGZmLCAweDcwNmUsIDB4NzhlNiwgMHhhMjg0LAorCTB4ZmYwMCwgMHg3MjcwLCAweGEyMDUsIDB4NzA3MiwgMHg3OGVhLCAweDAwZmUsIDB4NzBkYiwgMHgwMDAwLAorCTB4MjAwMSwgMHhhZDUyLCAweDIwMDQsIDB4ZDBhNCwgMHgwMTIwLCAweDIwMTEsIDB4YWZlMCwgMHgyMDEzLAorCTB4MDdkMCwgMHhkMGFjLCAweDExMjgsIDB4MDgwYywgMHgyOGZhLCAweDAwMTAsIDB4MDgwYywgMHhhYmYxLAorCTB4MDAyZSwgMHgwMGVlLCAweDA4MGMsIDB4ODA3OCwgMHgwODA0LCAweDljYWEsIDB4MDgwYywgMHg4MDc4LAorCTB4MDAwNSwgMHgyNjAwLCAweDAwMDIsIDB4OWU4MSwgMHg5ZTgxLCAweDllODEsIDB4OWU4MSwgMHg5ZTgxLAorCTB4OWU4MywgMHgwODBjLCAweDE0ZjYsIDB4MDgwYywgMHhhYjRlLCAweDFkODAsIDB4MDA4OSwgMHgxMTM4LAorCTB4NjAwNywgMHgwMDQ1LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDY3ZWUsIDB4MDAwNSwgMHgwODBjLAorCTB4MmFkOSwgMHg2MDA3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NjdlZSwgMHgwMDA1LAorCTB4MDBkNiwgMHgwMDY2LCAweDY2MTgsIDB4MjY2OCwgMHg2ZTA0LCAweGE2YjQsIDB4ZmYwMCwgMHg4NjM3LAorCTB4YTY4NiwgMHgwMDA2LCAweDAxNzAsIDB4YTY4NiwgMHgwMDA0LCAweDAxNTgsIDB4NmUwNCwgMHhhNmI0LAorCTB4MDBmZiwgMHhhNjg2LCAweDAwMDYsIDB4MDEyOCwgMHhhNjg2LCAweDAwMDQsIDB4MDExMCwgMHhhMDg1LAorCTB4MDAwMSwgMHgwMDZlLCAweDAwZGUsIDB4MDAwNSwgMHgwMGQ2LCAweDA0NDksIDB4MDBkZSwgMHgwMDA1LAorCTB4MDBkNiwgMHgwNDkxLCAweDExZjAsIDB4NjgwYywgMHhhMDhjLCAweGZmMDAsIDB4NjgyMCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMTE1LCAweDYyMTIsIDB4NjgyNCwgMHg2MDJhLCAweGQxZTQsIDB4MDExOCwgMHgyMDA5LAorCTB4MDAwMSwgMHgwMDYwLCAweGQxZWMsIDB4MDE2OCwgMHg2OTIwLCAweGExOGMsIDB4MDBmZiwgMHg2ODI0LAorCTB4MDgwYywgMHgyNjc2LCAweDExMzAsIDB4MjExMCwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHgyYjFlLAorCTB4MDAxOCwgMHhhMDg1LCAweDAwMDEsIDB4MDAwOCwgMHhhMDA2LCAweDAwZGUsIDB4MDAwNSwgMHgyMDY5LAorCTB4YjI4ZCwgMHg2ODAwLCAweGEwODIsIDB4MDAxMCwgMHgxMjI4LCAweDYwMTMsIDB4MDAwMCwgMHhhMDg1LAorCTB4MDAwMSwgMHgwMDA4LCAweGEwMDYsIDB4MDAwNSwgMHg2MDEzLCAweDAwMDAsIDB4MjA2OSwgMHhiMjhjLAorCTB4NjgwOCwgMHhhMDg0LCAweGZmMDAsIDB4YTA4NiwgMHgwODAwLCAweDExNDAsIDB4NjgwMCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMDhlLCAweDAwMTQsIDB4MDExMCwgMHhhMDhlLCAweDAwMTAsIDB4MDAwNSwgMHg2MDA0LAorCTB4YTBiMiwgMHgwMDgwLCAweDFhMGMsIDB4MTRmNiwgMHhhMWI2LCAweDAwMTMsIDB4MTEzMCwgMHgyMDA4LAorCTB4YTFiMiwgMHgwMDQwLCAweDFhMDQsIDB4OWZmYiwgMHgwMDkyLCAweGExYjYsIDB4MDAyNywgMHgwMTIwLAorCTB4YTFiNiwgMHgwMDE0LCAweDE5MGMsIDB4MTRmNiwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg0YzVkLAorCTB4MDgwYywgMHg2YjczLCAweDA4MGMsIDB4OTc0ZSwgMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHg5ZjVmLAorCTB4OWY2MSwgMHg5ZjVmLCAweDlmNWYsIDB4OWY1ZiwgMHg5ZjYxLCAweDlmNmYsIDB4OWZmNCwgMHg5ZmJmLAorCTB4OWZmNCwgMHg5ZmQwLCAweDlmZjQsIDB4OWY2ZiwgMHg5ZmY0LCAweDlmZWMsIDB4OWZmNCwgMHg5ZmVjLAorCTB4OWZmNCwgMHg5ZmY0LCAweDlmNWYsIDB4OWY1ZiwgMHg5ZjVmLCAweDlmNWYsIDB4OWY1ZiwgMHg5ZjVmLAorCTB4OWY1ZiwgMHg5ZjVmLCAweDlmNWYsIDB4OWY1ZiwgMHg5ZjVmLCAweDlmNjEsIDB4OWY1ZiwgMHg5ZmY0LAorCTB4OWY1ZiwgMHg5ZjVmLCAweDlmZjQsIDB4OWY1ZiwgMHg5ZmYxLCAweDlmZjQsIDB4OWY1ZiwgMHg5ZjVmLAorCTB4OWY1ZiwgMHg5ZjVmLCAweDlmZjQsIDB4OWZmNCwgMHg5ZjVmLCAweDlmZjQsIDB4OWZmNCwgMHg5ZjVmLAorCTB4OWY2OSwgMHg5ZjVmLCAweDlmNWYsIDB4OWY1ZiwgMHg5ZjVmLCAweDlmZjAsIDB4OWZmNCwgMHg5ZjVmLAorCTB4OWY1ZiwgMHg5ZmY0LCAweDlmZjQsIDB4OWY1ZiwgMHg5ZjVmLCAweDlmNWYsIDB4OWY1ZiwgMHgwODBjLAorCTB4MTRmNiwgMHgwODBjLCAweDZiNzMsIDB4NjAwMywgMHgwMDAyLCAweDA4MGMsIDB4NmM1MCwgMHgwODA0LAorCTB4OWZmYSwgMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHg0YzFlLCAweDA4MDQsIDB4OWZmNCwgMHgwMGY2LAorCTB4MjA3OSwgMHhhZDUxLCAweDc4MDQsIDB4MDBmZSwgMHhkMGFjLCAweDE5MDQsIDB4OWZmNCwgMHgyMDAxLAorCTB4MDAwMCwgMHgwODBjLCAweDRjMWUsIDB4NjAxOCwgMHhhMDgwLCAweDAwMDQsIDB4MjAwNCwgMHhhMDg2LAorCTB4MDBmZiwgMHgxMTQwLCAweDAwZjYsIDB4MjA3OSwgMHhhZDAwLCAweDc4OTQsIDB4ODAwMCwgMHg3ODk2LAorCTB4MDBmZSwgMHgwMGUwLCAweDAwYzYsIDB4NjAxOCwgMHgyMDYwLCAweDYwMDAsIDB4ZDBmNCwgMHgxMTQwLAorCTB4NjAxMCwgMHhhMDA1LCAweDAxMjgsIDB4MDBjZSwgMHgwODBjLCAweDNjY2UsIDB4MDgwNCwgMHg5ZmY0LAorCTB4MDBjZSwgMHgyMDAxLCAweGFkMDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDIsIDB4MTEzOCwgMHgwMGY2LAorCTB4MjA3OSwgMHhhZDAwLCAweDc4OTQsIDB4ODAwMCwgMHg3ODk2LCAweDAwZmUsIDB4MjAwMSwgMHgwMDAyLAorCTB4MDgwYywgMHg0YzMwLCAweDA4MGMsIDB4NmI3MywgMHg2MDFmLCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLAorCTB4NjAwNywgMHgwMDAyLCAweDA4MGMsIDB4NjdlZSwgMHgwODBjLCAweDZjNTAsIDB4MDBjNiwgMHg2MTE4LAorCTB4MjE2MCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwYywgMHg2NTE5LCAweDAwY2UsIDB4MDRkOCwgMHg2NjE4LAorCTB4MDBkNiwgMHgyNjY4LCAweDZlMDQsIDB4MDBkZSwgMHhhNmI0LCAweGZmMDAsIDB4ODYzNywgMHhhNjg2LAorCTB4MDAwNiwgMHgwNTUwLCAweGE2ODYsIDB4MDAwNCwgMHgwNTM4LCAweDIwMDEsIDB4MDAwNCwgMHgwNDEwLAorCTB4MjAwMSwgMHhhZDAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLCAweDExMTAsIDB4MDgwYywgMHgzY2NlLAorCTB4MjAwMSwgMHgwMDA2LCAweDA0ODksIDB4NjYxOCwgMHgwMGQ2LCAweDI2NjgsIDB4NmUwNCwgMHgwMGRlLAorCTB4YTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4YTY4NiwgMHgwMDA2LCAweDAxNzAsIDB4MjAwMSwgMHgwMDA2LAorCTB4MDA0OCwgMHgyMDAxLCAweDAwMDQsIDB4MDAzMCwgMHgyMDAxLCAweDAwMDYsIDB4MDBlOSwgMHgwMDIwLAorCTB4MDAxOCwgMHgwMDEwLCAweDA4MGMsIDB4NGM1ZCwgMHgwODBjLCAweDZiNzMsIDB4MDgwYywgMHg4MDc4LAorCTB4MDgwYywgMHg2YzUwLCAweDAwMDUsIDB4MjYwMCwgMHgwMDAyLCAweGEwMDMsIDB4YTAwMywgMHhhMDAzLAorCTB4YTAwMywgMHhhMDAzLCAweGEwMDUsIDB4MDgwYywgMHgxNGY2LCAweDA4MGMsIDB4NmI3MywgMHgwODBjLAorCTB4ODA3OCwgMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHgwMDE2LCAweDAwZDYsIDB4NjExOCwgMHgyMTY4LAorCTB4NjkwMCwgMHhkMTg0LCAweDAxODgsIDB4NjEwNCwgMHhhMThlLCAweDAwMGEsIDB4MTEyOCwgMHg2OTljLAorCTB4ZDFhNCwgMHgxMTEwLCAweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDRjMzAsIDB4MjAwMSwgMHgwMDAwLAorCTB4MDgwYywgMHg0YzFlLCAweDA4MGMsIDB4MmFmZiwgMHgwMGRlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGQ2LAorCTB4NjYxOCwgMHgyNjY4LCAweDY4MDQsIDB4YTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4MDBkZSwgMHhhMGIyLAorCTB4MDAwYywgMHgxYTBjLCAweDE0ZjYsIDB4YTFiNiwgMHgwMDE1LCAweDExMTAsIDB4MDAzYiwgMHgwMDI4LAorCTB4YTFiNiwgMHgwMDE2LCAweDE5MGMsIDB4MTRmNiwgMHgwMDZiLCAweDAwMDUsIDB4ODZiOSwgMHg4NmI5LAorCTB4ODZiOSwgMHg4NmI5LCAweDg2YjksIDB4ODZiOSwgMHhhMDhmLCAweGEwNTYsIDB4ODZiOSwgMHg4NmI5LAorCTB4ODZiOSwgMHg4NmI5LCAweDg2YjksIDB4ODZiOSwgMHg4NmI5LCAweDg2YjksIDB4ODZiOSwgMHg4NmI5LAorCTB4YTA4ZiwgMHhhMDk2LCAweDg2YjksIDB4ODZiOSwgMHg4NmI5LCAweDg2YjksIDB4MDBmNiwgMHgyMDc5LAorCTB4YWQ1MSwgMHg3ODA0LCAweGQwYWMsIDB4MTFlMCwgMHg2MDE4LCAweGEwN2QsIDB4MDFjOCwgMHg3ODAwLAorCTB4ZDBmNCwgMHgxMTE4LCAweDc4MTAsIDB4YTAwNSwgMHgxMTk4LCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLAorCTB4NGMxZSwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg0YzMwLCAweDYwMWYsIDB4MDAwMSwgMHg2MDAzLAorCTB4MDAwMSwgMHg2MDA3LCAweDAwMDIsIDB4MDgwYywgMHg2N2VlLCAweDA4MGMsIDB4NmM1MCwgMHgwMGE4LAorCTB4MjAxMSwgMHhiMjgzLCAweDIyMDQsIDB4ODIxMSwgMHgyMjBjLCAweDA4MGMsIDB4MjY3NiwgMHgxMTY4LAorCTB4MDBjNiwgMHgwODBjLCAweDRjZGMsIDB4MDEyMCwgMHgwMGNlLCAweDA4MGMsIDB4ODA3OCwgMHgwMDI4LAorCTB4MDgwYywgMHg0OTNhLCAweDAwY2UsIDB4MDgwYywgMHg4MDc4LCAweDAwZmUsIDB4MDAwNSwgMHg2NjA0LAorCTB4YTZiNiwgMHgwMDFlLCAweDExMTAsIDB4MDgwYywgMHg4MDc4LCAweDAwMDUsIDB4MDgwYywgMHg4OTQwLAorCTB4MTEzOCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDA4MGMsIDB4NjdlZSwgMHgwMDEwLAorCTB4MDgwYywgMHg4MDc4LCAweDAwMDUsIDB4NjAwNCwgMHhhMDhhLCAweDAwODAsIDB4MWEwYywgMHgxNGY2LAorCTB4MDgwYywgMHg2YjczLCAweDA4MGMsIDB4OTc0ZSwgMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHhhMTgyLAorCTB4MDA0MCwgMHgwMDAyLCAweGEwYzUsIDB4YTBjNSwgMHhhMGM1LCAweGEwYzUsIDB4YTBjNywgMHhhMGM1LAorCTB4YTBjNSwgMHhhMGM1LCAweGEwYzUsIDB4YTBjNSwgMHhhMGM1LCAweGEwYzUsIDB4YTBjNSwgMHhhMGM1LAorCTB4YTBjNSwgMHhhMGM1LCAweGEwYzUsIDB4YTBjNSwgMHhhMGM1LCAweDA4MGMsIDB4MTRmNiwgMHgwMGQ2LAorCTB4MDBlNiwgMHgwMGY2LCAweDAxNTYsIDB4MDA0NiwgMHgwMDI2LCAweDYyMTgsIDB4YTI4MCwgMHgwMDJiLAorCTB4MjAwNCwgMHhhMDA1LCAweDAxMjAsIDB4MjAyMSwgMHgwMDAwLCAweDA4MGMsIDB4YWI5NiwgMHg2MTA2LAorCTB4MjA3MSwgMHhiMjgwLCAweDc0NDQsIDB4YTRhNCwgMHhmZjAwLCAweDA5MDQsIDB4YTEyOSwgMHhhNDg2LAorCTB4MjAwMCwgMHgxMTMwLCAweDIwMDksIDB4MDAwMSwgMHgyMDExLCAweDAyMDAsIDB4MDgwYywgMHg2NjNmLAorCTB4MDgwYywgMHgxNWQ5LCAweDA5MGMsIDB4MTRmNiwgMHg2MDAzLCAweDAwMDcsIDB4MmQwMCwgMHg2ODM3LAorCTB4MDEwZCwgMHg2ODAzLCAweDAwMDAsIDB4NjgzYiwgMHgwMDAwLCAweDZjNWEsIDB4MmMwMCwgMHg2ODVlLAorCTB4NjAwOCwgMHg2OGIyLCAweDYwMTgsIDB4MjA3OCwgMHg3OGEwLCAweDgwMDcsIDB4NzEzMCwgMHg2OTRhLAorCTB4MDAxNiwgMHhhMDg0LCAweGZmMDAsIDB4Njg0NiwgMHg2ODRmLCAweDAwMDAsIDB4Njg1NywgMHgwMDM2LAorCTB4MDgwYywgMHg1MTBjLCAweDAwMWUsIDB4YTQ4NiwgMHgyMDAwLCAweDExMzAsIDB4MjAxOSwgMHgwMDE3LAorCTB4MDgwYywgMHhhOGViLCAweDA4MDQsIDB4YTE4NiwgMHhhNDg2LCAweDA0MDAsIDB4MTEzMCwgMHgyMDE5LAorCTB4MDAwMiwgMHgwODBjLCAweGE4OWQsIDB4MDgwNCwgMHhhMTg2LCAweGE0ODYsIDB4MDIwMCwgMHgxMTEwLAorCTB4MDgwYywgMHhhODgyLCAweGE0ODYsIDB4MTAwMCwgMHgxMTEwLCAweDA4MGMsIDB4YThkMCwgMHgwODA0LAorCTB4YTE4NiwgMHgyMDY5LCAweGIwNDgsIDB4NmEwMCwgMHhkMjg0LCAweDA5MDQsIDB4YTFkNSwgMHhhMjg0LAorCTB4MDMwMCwgMHgxOTA0LCAweGExY2YsIDB4NjgwNCwgMHhhMDA1LCAweDA5MDQsIDB4YTFjMCwgMHgyZDc4LAorCTB4NjAwMywgMHgwMDA3LCAweDA4MGMsIDB4MTVjMCwgMHgwOTA0LCAweGExOGQsIDB4NzgwMCwgMHhkMDhjLAorCTB4MTExOCwgMHg3ODA0LCAweDgwMDEsIDB4NzgwNiwgMHg2MDEzLCAweDAwMDAsIDB4NjgwMywgMHgwMDAwLAorCTB4NjgzNywgMHgwMTE2LCAweDY4M2IsIDB4MDAwMCwgMHg2MDA4LCAweDY4YjIsIDB4MmMwMCwgMHg2ODRhLAorCTB4NjAxOCwgMHgyMDc4LCAweDc4YTAsIDB4ODAwNywgMHg3MTMwLCAweDY5ODYsIDB4Njg0NiwgMHg3OTI4LAorCTB4Njk4YSwgMHg3OTJjLCAweDY5OGUsIDB4NzkzMCwgMHg2OTkyLCAweDc5MzQsIDB4Njk5NiwgMHg2ODUzLAorCTB4MDAzZCwgMHg3MjQ0LCAweGEyOTQsIDB4MDAwMywgMHhhMjg2LCAweDAwMDIsIDB4MTExOCwgMHg2ODRmLAorCTB4MDA0MCwgMHgwMDQwLCAweGEyODYsIDB4MDAwMSwgMHgxMTE4LCAweDY4NGYsIDB4MDA4MCwgMHgwMDEwLAorCTB4Njg0ZiwgMHgwMDAwLCAweDIwYTksIDB4MDAwYSwgMHgyMDAxLCAweGIyOTAsIDB4YWQ5MCwgMHgwMDE1LAorCTB4MjAwYywgMHg4MTBmLCAweDIxMTIsIDB4ODAwMCwgMHg4MjEwLCAweDFmMDQsIDB4YTE3OCwgMHgyMDBjLAorCTB4Njk4MiwgMHg4MDAwLCAweDIwMGMsIDB4Njk3ZSwgMHgwODBjLCAweDUxMGMsIDB4MDAyZSwgMHgwMDRlLAorCTB4MDE1ZSwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMDA1LCAweDYwMTMsIDB4MDEwMCwgMHg2MDAzLAorCTB4MDAwMSwgMHg2MDA3LCAweDAwNDEsIDB4MDgwYywgMHg2N2E4LCAweDA4MGMsIDB4NmM1MCwgMHgwYzcwLAorCTB4MjA2OSwgMHhiMjkyLCAweDJkMDQsIDB4YTA4NCwgMHhmZjAwLCAweGEwODYsIDB4MTIwMCwgMHgxMWE4LAorCTB4MjA2OSwgMHhiMjgwLCAweDY4NmMsIDB4YTA4NCwgMHgwMGZmLCAweDAwMTYsIDB4NjExMCwgMHhhMThjLAorCTB4MDcwMCwgMHhhMTBkLCAweDYxMTIsIDB4MDAxZSwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDQzLAorCTB4MDgwYywgMHg2N2E4LCAweDA4MGMsIDB4NmM1MCwgMHgwODg4LCAweDYwMTMsIDB4MDIwMCwgMHg2MDAzLAorCTB4MDAwMSwgMHg2MDA3LCAweDAwNDEsIDB4MDgwYywgMHg2N2E4LCAweDA4MGMsIDB4NmM1MCwgMHgwODMwLAorCTB4NjAxMywgMHgwMzAwLCAweDAwMTAsIDB4NjAxMywgMHgwMTAwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDA0MSwgMHgwODBjLCAweDY3YTgsIDB4MDgwYywgMHg2YzUwLCAweDA4MDQsIDB4YTE4NiwgMHg2MDEzLAorCTB4MDUwMCwgMHgwYzk4LCAweDYwMTMsIDB4MDYwMCwgMHgwODE4LCAweDYwMTMsIDB4MDIwMCwgMHgwODAwLAorCTB4YTE4NiwgMHgwMDEzLCAweDExNzAsIDB4NjAwNCwgMHhhMDhhLCAweDAwNDAsIDB4MGEwYywgMHgxNGY2LAorCTB4YTA4YSwgMHgwMDUzLCAweDFhMGMsIDB4MTRmNiwgMHhhMDgyLCAweDAwNDAsIDB4MjAwOCwgMHgwODA0LAorCTB4YTI1MiwgMHhhMTg2LCAweDAwNTEsIDB4MDEzOCwgMHhhMTg2LCAweDAwNDcsIDB4MTFkOCwgMHg2MDA0LAorCTB4YTA4NiwgMHgwMDQxLCAweDA1MTgsIDB4MjAwMSwgMHgwMTA5LCAweDIwMDQsIDB4ZDA4NCwgMHgwMWYwLAorCTB4MDEyNiwgMHgyMDkxLCAweDI4MDAsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDgwYywgMHg2Njk5LAorCTB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDEyZSwgMHg2MDAwLCAweGEwODYsIDB4MDAwMiwgMHgxMTcwLAorCTB4MDgwNCwgMHhhMjk1LCAweGExODYsIDB4MDAyNywgMHgwMTIwLCAweGExODYsIDB4MDAxNCwgMHgxOTBjLAorCTB4MTRmNiwgMHg2MDA0LCAweGEwODIsIDB4MDA0MCwgMHgyMDA4LCAweDAwMWEsIDB4MDgwYywgMHg4MGJlLAorCTB4MDAwNSwgMHhhMjJjLCAweGEyMmUsIDB4YTIyZSwgMHhhMjJjLCAweGEyMmMsIDB4YTIyYywgMHhhMjJjLAorCTB4YTIyYywgMHhhMjJjLCAweGEyMmMsIDB4YTIyYywgMHhhMjJjLCAweGEyMmMsIDB4YTIyYywgMHhhMjJjLAorCTB4YTIyYywgMHhhMjJjLCAweGEyMmMsIDB4YTIyYywgMHgwODBjLCAweDE0ZjYsIDB4MDgwYywgMHg2YjczLAorCTB4MDgwYywgMHg2YzUwLCAweDAwMzYsIDB4MDBkNiwgMHg2MDEwLCAweGEwNmQsIDB4MDFjMCwgMHhhZDg0LAorCTB4ZjAwMCwgMHgwMWE4LCAweDYwMDMsIDB4MDAwMiwgMHg2MDE4LCAweDIwMDQsIDB4ZDBiYywgMHgxMTc4LAorCTB4MjAxOSwgMHgwMDA0LCAweDA4MGMsIDB4YTkxZiwgMHg2MDEzLCAweDAwMDAsIDB4NjAxNCwgMHhhMDA1LAorCTB4MTEyMCwgMHgyMDAxLCAweGFmYTQsIDB4MjAwNCwgMHg2MDE2LCAweDYwMDMsIDB4MDAwNywgMHgwMGRlLAorCTB4MDAzZSwgMHgwMDA1LCAweDAwMDIsIDB4YTI2NiwgMHhhMjgzLCAweGEyNmYsIDB4YTI4ZiwgMHhhMjY2LAorCTB4YTI2NiwgMHhhMjY2LCAweGEyNjYsIDB4YTI2NiwgMHhhMjY2LCAweGEyNjYsIDB4YTI2NiwgMHhhMjY2LAorCTB4YTI2NiwgMHhhMjY2LCAweGEyNjYsIDB4YTI2NiwgMHhhMjY2LCAweGEyNjYsIDB4MDgwYywgMHgxNGY2LAorCTB4NjAxMCwgMHhhMDg4LCAweDAwMTMsIDB4MjEwNCwgMHhhMDg1LCAweDA0MDAsIDB4MjAwYSwgMHgwODBjLAorCTB4NmI3MywgMHg2MDEwLCAweGEwODAsIDB4MDAxMywgMHgyMDA0LCAweGQwYjQsIDB4MDEzOCwgMHg2MDAzLAorCTB4MDAwNywgMHgyMDA5LCAweDAwNDMsIDB4MDgwYywgMHg4MGE3LCAweDAwMTAsIDB4NjAwMywgMHgwMDAyLAorCTB4MDgwYywgMHg2YzUwLCAweDAwMDUsIDB4MDgwYywgMHg2YjczLCAweDA4MGMsIDB4YWI1NSwgMHgxMTIwLAorCTB4MDgwYywgMHg2NjE4LCAweDA4MGMsIDB4ODA3OCwgMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHgwODBjLAorCTB4NmI3MywgMHgyMDA5LCAweDAwNDEsIDB4MDgwNCwgMHhhM2RlLCAweGExODIsIDB4MDA0MCwgMHgwMDAyLAorCTB4YTJhYiwgMHhhMmFkLCAweGEyYWIsIDB4YTJhYiwgMHhhMmFiLCAweGEyYWIsIDB4YTJhYiwgMHhhMmFlLAorCTB4YTJhYiwgMHhhMmFiLCAweGEyYWIsIDB4YTJhYiwgMHhhMmFiLCAweGEyYWIsIDB4YTJhYiwgMHhhMmFiLAorCTB4YTJhYiwgMHhhMmI5LCAweGEyYWIsIDB4MDgwYywgMHgxNGY2LCAweDAwMDUsIDB4NjAwMywgMHgwMDA0LAorCTB4NjExMCwgMHgyMGUxLCAweDAwMDUsIDB4M2QxOCwgMHgzZTIwLCAweDJjMTAsIDB4MDgwYywgMHgxODI0LAorCTB4MDAwNSwgMHgwMGQ2LCAweDA4MGMsIDB4NjYxOCwgMHgwMGRlLCAweDA4MGMsIDB4YWJiNCwgMHgwODBjLAorCTB4ODA3OCwgMHgwMDA1LCAweGExODIsIDB4MDA0MCwgMHgwMDAyLCAweGEyZDgsIDB4YTJkOCwgMHhhMmQ4LAorCTB4YTJkOCwgMHhhMmQ4LCAweGEyZDgsIDB4YTJkOCwgMHhhMmRhLCAweGEyZDgsIDB4YTJkZCwgMHhhMzE2LAorCTB4YTJkOCwgMHhhMmQ4LCAweGEyZDgsIDB4YTJkOCwgMHhhMzE2LCAweGEyZDgsIDB4YTJkOCwgMHhhMmQ4LAorCTB4MDgwYywgMHgxNGY2LCAweDA4MGMsIDB4ODBiZSwgMHgwMDA1LCAweDIwMDEsIDB4YWQ3MSwgMHgyMDA0LAorCTB4ZDBlNCwgMHgwMTU4LCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweGEwODIsIDB4MDAwNSwgMHgwMjI4LAorCTB4MjAwMSwgMHgwMTFmLCAweDIwMDQsIDB4NjAzNiwgMHgwMDEwLCAweDYwMzcsIDB4MDAwMCwgMHgwODBjLAorCTB4NmMwNSwgMHgwODBjLCAweDZkMGQsIDB4NjAxMCwgMHgwMGQ2LCAweDIwNjgsIDB4Njg0YywgMHhkMGZjLAorCTB4MDE1MCwgMHhhMDhjLCAweDAwMDMsIDB4YTE4ZSwgMHgwMDAyLCAweDAxNjgsIDB4MjAwOSwgMHgwMDQxLAorCTB4MDBkZSwgMHgwODA0LCAweGEzZGUsIDB4NjAwMywgMHgwMDA3LCAweDYwMTcsIDB4MDAwMCwgMHgwODBjLAorCTB4NjYxOCwgMHgwMGRlLCAweDAwMDUsIDB4MDgwYywgMHhhYjU1LCAweDAxMTAsIDB4MDBkZSwgMHgwMDA1LAorCTB4MDgwYywgMHg2NjE4LCAweDA4MGMsIDB4ODA3OCwgMHgwMGRlLCAweDBjYTAsIDB4MDAzNiwgMHgwODBjLAorCTB4NmMwNSwgMHgwODBjLCAweDZkMGQsIDB4NjAxMCwgMHgwMGQ2LCAweDIwNjgsIDB4NjAxOCwgMHgyMDA0LAorCTB4ZDBiYywgMHgwMTg4LCAweDY4NGMsIDB4YTA4NCwgMHgwMDAzLCAweGEwODYsIDB4MDAwMiwgMHgwMTQwLAorCTB4Njg3YywgMHg2MzJjLCAweGEzMWEsIDB4NjMyZSwgMHg2ODgwLCAweDYzMjgsIDB4YTMxYiwgMHg2MzJhLAorCTB4NjAwMywgMHgwMDAyLCAweDAwODAsIDB4MjAxOSwgMHgwMDA0LCAweDA4MGMsIDB4YTkxZiwgMHg2MDE0LAorCTB4YTAwNSwgMHgxMTI4LCAweDIwMDEsIDB4YWZhNCwgMHgyMDA0LCAweDgwMDMsIDB4NjAxNiwgMHg2MDEzLAorCTB4MDAwMCwgMHg2MDAzLCAweDAwMDcsIDB4MDBkZSwgMHgwMDNlLCAweDAwMDUsIDB4YTE4NiwgMHgwMDEzLAorCTB4MTE1MCwgMHg2MDA0LCAweGEwODYsIDB4MDA0MiwgMHgxOTBjLCAweDE0ZjYsIDB4MDgwYywgMHg2YjczLAorCTB4MDgwYywgMHg2YzUwLCAweDAwMDUsIDB4YTE4NiwgMHgwMDI3LCAweDAxMTgsIDB4YTE4NiwgMHgwMDE0LAorCTB4MTE4MCwgMHg2MDA0LCAweGEwODYsIDB4MDA0MiwgMHgxOTBjLCAweDE0ZjYsIDB4MjAwMSwgMHgwMDA3LAorCTB4MDgwYywgMHg0YzVkLCAweDA4MGMsIDB4NmI3MywgMHgwODBjLCAweDk3NGUsIDB4MDgwYywgMHg2YzUwLAorCTB4MDAwNSwgMHhhMTgyLCAweDAwNDAsIDB4MDAwMiwgMHhhMzdmLCAweGEzN2YsIDB4YTM3ZiwgMHhhMzdmLAorCTB4YTM3ZiwgMHhhMzdmLCAweGEzN2YsIDB4YTM4MSwgMHhhMzhkLCAweGEzN2YsIDB4YTM3ZiwgMHhhMzdmLAorCTB4YTM3ZiwgMHhhMzdmLCAweGEzN2YsIDB4YTM3ZiwgMHhhMzdmLCAweGEzN2YsIDB4YTM3ZiwgMHgwODBjLAorCTB4MTRmNiwgMHgwMDM2LCAweDAwNDYsIDB4MjBlMSwgMHgwMDA1LCAweDNkMTgsIDB4M2UyMCwgMHgyYzEwLAorCTB4MDgwYywgMHgxODI0LCAweDAwNGUsIDB4MDAzZSwgMHgwMDA1LCAweDYwMTAsIDB4MDBkNiwgMHgyMDY4LAorCTB4NjgxMCwgMHg2YTE0LCAweDAwMDYsIDB4MDA0NiwgMHgwMDU2LCAweDZjN2MsIDB4YTQyMiwgMHg2ZDgwLAorCTB4MjIwMCwgMHhhNTJiLCAweDYwMmMsIDB4YTQyMCwgMHg2NDJlLCAweDYwMjgsIDB4YTUyOSwgMHg2NTJhLAorCTB4MDA1ZSwgMHgwMDRlLCAweDAwMGUsIDB4YTIwZCwgMHgxMTc4LCAweDY4NGMsIDB4ZDBmYywgMHgwMTIwLAorCTB4MjAwOSwgMHgwMDQxLCAweDAwZGUsIDB4MDQ5MCwgMHg2MDAzLCAweDAwMDcsIDB4NjAxNywgMHgwMDAwLAorCTB4MDgwYywgMHg2NjE4LCAweDAwZGUsIDB4MDAwNSwgMHgwMDA2LCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLAorCTB4NTAyOSwgMHgwMGZlLCAweDAwMGUsIDB4MDEyMCwgMHg2MDAzLCAweDAwMDIsIDB4MDBkZSwgMHgwMDA1LAorCTB4MjAwOSwgMHhhZDBkLCAweDIxMGMsIDB4ZDE5YywgMHgwMTE4LCAweDYwMDMsIDB4MDAwNywgMHgwMDEwLAorCTB4NjAwMywgMHgwMDA2LCAweDAwMjEsIDB4MDgwYywgMHg2NjFhLCAweDAwZGUsIDB4MDAwNSwgMHhkMmZjLAorCTB4MDE0MCwgMHg4MDAyLCAweDgwMDAsIDB4ODIxMiwgMHhhMjkxLCAweDAwMDAsIDB4MjAwOSwgMHgwMDA5LAorCTB4MDAxMCwgMHgyMDA5LCAweDAwMTUsIDB4NmE2YSwgMHg2ODY2LCAweDAwMDUsIDB4YTE4MiwgMHgwMDQwLAorCTB4MDIwOCwgMHgwMDYyLCAweGExODYsIDB4MDAxMywgMHgwMTIwLCAweGExODYsIDB4MDAxNCwgMHgxOTBjLAorCTB4MTRmNiwgMHg2MDIwLCAweGQwZGMsIDB4MDkwYywgMHgxNGY2LCAweDAwMDUsIDB4YTQwMSwgMHhhNDA4LAorCTB4YTQxNCwgMHhhNDIwLCAweGE0MDEsIDB4YTQwMSwgMHhhNDAxLCAweGE0MmYsIDB4YTQwMSwgMHhhNDAzLAorCTB4YTQwMywgMHhhNDAxLCAweGE0MDEsIDB4YTQwMSwgMHhhNDAxLCAweGE0MDMsIDB4YTQwMSwgMHhhNDAzLAorCTB4YTQwMSwgMHgwODBjLCAweDE0ZjYsIDB4NjAyMCwgMHhkMGRjLCAweDA5MGMsIDB4MTRmNiwgMHgwMDA1LAorCTB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MDgwYywgMHg2N2E4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg2YzUwLCAweDAxMmUsIDB4MDAwNSwgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgwODBjLAorCTB4NjdhOCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDZjNTAsIDB4MDEyZSwgMHgwMDA1LAorCTB4NjAwMywgMHgwMDAzLCAweDYxMDYsIDB4MmMxMCwgMHgwODBjLCAweDFlNmUsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDY4MGIsIDB4MDgwYywgMHg2ZDBkLCAweDAxMmUsIDB4MDAwNSwgMHhhMDE2LAorCTB4MDgwYywgMHgxODI0LCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDAzNiwgMHgwMGQ2LAorCTB4YTE4MiwgMHgwMDQwLCAweDAwMjMsIDB4MDBkZSwgMHgwMDNlLCAweDAxMmUsIDB4MDAwNSwgMHhhNDRmLAorCTB4YTQ1MSwgMHhhNDYzLCAweGE0N2UsIDB4YTQ0ZiwgMHhhNDRmLCAweGE0NGYsIDB4YTQ5MywgMHhhNDRmLAorCTB4YTQ0ZiwgMHhhNDRmLCAweGE0NGYsIDB4YTQ0ZiwgMHhhNDRmLCAweGE0NGYsIDB4YTQ0ZiwgMHgwODBjLAorCTB4MTRmNiwgMHg2MDEwLCAweDIwNjgsIDB4Njg0YywgMHhkMGZjLCAweDAxZjgsIDB4YTA5YywgMHgwMDAzLAorCTB4YTM5ZSwgMHgwMDAzLCAweDAxZDAsIDB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MDgwYywgMHg2N2E4LAorCTB4MDgwYywgMHg2YzUwLCAweDA0OTgsIDB4NjAxMCwgMHgyMDY4LCAweDY4NGMsIDB4ZDBmYywgMHgwMTY4LAorCTB4YTA5YywgMHgwMDAzLCAweGEzOWUsIDB4MDAwMywgMHgwMTQwLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LAorCTB4MDgwYywgMHg2N2E4LCAweDA4MGMsIDB4NmM1MCwgMHgwNDA4LCAweDYwMTMsIDB4MDAwMCwgMHg2MDE3LAorCTB4MDAwMCwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywgMHhhOTFmLCAweDAwYzAsIDB4NjAxMCwgMHgyMDY4LAorCTB4Njg0YywgMHhkMGZjLCAweDBkOTAsIDB4YTA5YywgMHgwMDAzLCAweGEzOWUsIDB4MDAwMywgMHgwZDY4LAorCTB4NjAwMywgMHgwMDAzLCAweDYxMDYsIDB4MmMxMCwgMHgwODBjLCAweDFlNmUsIDB4MDgwYywgMHg2ODBiLAorCTB4MDgwYywgMHg2ZDBkLCAweDAwMTgsIDB4YTAxNiwgMHgwODBjLCAweDE4MjQsIDB4MDAwNSwgMHgwODBjLAorCTB4NmI3MywgMHg2MTEwLCAweDgxZmYsIDB4MDE1OCwgMHgwMGQ2LCAweDIxNjgsIDB4MDgwYywgMHhhYmZhLAorCTB4MDAzNiwgMHgyMDE5LCAweDAwMjksIDB4MDgwYywgMHhhOTFmLCAweDAwM2UsIDB4MDBkZSwgMHgwODBjLAorCTB4OTc0ZSwgMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHgwODBjLCAweDZjMDUsIDB4NjExMCwgMHg4MWZmLAorCTB4MDE1OCwgMHgwMGQ2LCAweDIxNjgsIDB4MDgwYywgMHhhYmZhLCAweDAwMzYsIDB4MjAxOSwgMHgwMDI5LAorCTB4MDgwYywgMHhhOTFmLCAweDAwM2UsIDB4MDBkZSwgMHgwODBjLCAweDk3NGUsIDB4MDgwYywgMHg2ZDBkLAorCTB4MDAwNSwgMHhhMTgyLCAweDAwODUsIDB4MDAwMiwgMHhhNGNkLCAweGE0Y2IsIDB4YTRjYiwgMHhhNGQ5LAorCTB4YTRjYiwgMHhhNGNiLCAweGE0Y2IsIDB4MDgwYywgMHgxNGY2LCAweDYwMDMsIDB4MDAwYiwgMHg2MTA2LAorCTB4MDgwYywgMHg2N2E4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NmM1MCwgMHgwMTJlLAorCTB4MDAwNSwgMHgwMDI2LCAweDAwZTYsIDB4MDgwYywgMHhhYjRlLCAweDAxMTgsIDB4MDgwYywgMHg4MDc4LAorCTB4MDBjOCwgMHgyMDcxLCAweGIyODAsIDB4NzIyNCwgMHg2MjEyLCAweDcyMjAsIDB4MDgwYywgMHhhN2NlLAorCTB4MDExOCwgMHg2MDA3LCAweDAwODYsIDB4MDA0MCwgMHg2MDA3LCAweDAwODcsIDB4NzIyNCwgMHhhMjk2LAorCTB4ZmZmZiwgMHgxMTEwLCAweDYwMDcsIDB4MDA4NiwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2N2E4LAorCTB4MDgwYywgMHg2YzUwLCAweDAwZWUsIDB4MDAyZSwgMHgwMDA1LCAweGExODYsIDB4MDAxMywgMHgxMTYwLAorCTB4NjAwNCwgMHhhMDhhLCAweDAwODUsIDB4MGEwYywgMHgxNGY2LCAweGEwOGEsIDB4MDA4YywgMHgxYTBjLAorCTB4MTRmNiwgMHhhMDgyLCAweDAwODUsIDB4MDBhMiwgMHhhMTg2LCAweDAwMjcsIDB4MDEzMCwgMHhhMTg2LAorCTB4MDAxNCwgMHgwMTE4LCAweDA4MGMsIDB4ODBiZSwgMHgwMDUwLCAweDIwMDEsIDB4MDAwNywgMHgwODBjLAorCTB4NGM1ZCwgMHgwODBjLCAweDZiNzMsIDB4MDgwYywgMHg5NzRlLCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LAorCTB4YTUyNywgMHhhNTI5LCAweGE1MjksIDB4YTUyNywgMHhhNTI3LCAweGE1MjcsIDB4YTUyNywgMHgwODBjLAorCTB4MTRmNiwgMHgwODBjLCAweDZiNzMsIDB4MDgwYywgMHg5NzRlLCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LAorCTB4YTE4MiwgMHgwMDg1LCAweDBhMGMsIDB4MTRmNiwgMHhhMTgyLCAweDAwOGMsIDB4MWEwYywgMHgxNGY2LAorCTB4YTE4MiwgMHgwMDg1LCAweDAwMDIsIDB4YTU0MiwgMHhhNTQyLCAweGE1NDIsIDB4YTU0NCwgMHhhNTQyLAorCTB4YTU0MiwgMHhhNTQyLCAweDA4MGMsIDB4MTRmNiwgMHgwMDA1LCAweGExODYsIDB4MDAxMywgMHgwMTQ4LAorCTB4YTE4NiwgMHgwMDE0LCAweDAxMzAsIDB4YTE4NiwgMHgwMDI3LCAweDAxMTgsIDB4MDgwYywgMHg4MGJlLAorCTB4MDAzMCwgMHgwODBjLCAweDZiNzMsIDB4MDgwYywgMHg5NzRlLCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LAorCTB4MDAzNiwgMHgwODBjLCAweGFiYjQsIDB4NjAzZiwgMHgwMDAwLCAweDIwMTksIDB4MDAwYiwgMHgwMDMxLAorCTB4NjAxZiwgMHgwMDA2LCAweDYwMDMsIDB4MDAwNywgMHgwMDNlLCAweDAwMDUsIDB4MDEyNiwgMHgwMDM2LAorCTB4MjA5MSwgMHg4MDAwLCAweDAwODYsIDB4MmM0MCwgMHgwMDk2LCAweDIwNDksIDB4MDAwMCwgMHgwODBjLAorCTB4N2I5YSwgMHgwMDllLCAweDAwOGUsIDB4MTU3OCwgMHgwMDc2LCAweDJjMzgsIDB4MDgwYywgMHg3YzM0LAorCTB4MDA3ZSwgMHgxNTQ4LCAweDYwMDAsIDB4YTA4NiwgMHgwMDAwLCAweDA1MjgsIDB4NjAxYywgMHhhMDg2LAorCTB4MDAwNywgMHgwNTA4LCAweDAwZDYsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDQsIDB4MTE1MCwgMHgwODBjLAorCTB4YWJiNCwgMHg2MDFmLCAweDAwMDcsIDB4MjAwMSwgMHhhZmEzLCAweDIwMDQsIDB4NjAxNiwgMHgwODBjLAorCTB4MTkwYiwgMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5NTk2LCAweDAxMTAsIDB4MDgwYywgMHhhOTFmLAorCTB4MDBkZSwgMHg2MDEzLCAweDAwMDAsIDB4MDgwYywgMHhhYmI0LCAweDYwMWYsIDB4MDAwNywgMHgyMDAxLAorCTB4YWZhMywgMHgyMDA0LCAweDYwMTYsIDB4MDAzZSwgMHgwMTJlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGM2LAorCTB4MDAzNiwgMHgwMTU2LCAweDIwNzksIDB4YjI4MCwgMHg3OTM4LCAweDc4M2MsIDB4MDgwYywgMHgyNjc2LAorCTB4MTkwNCwgMHhhNWYxLCAweDAwMTYsIDB4MDBjNiwgMHgwODBjLCAweDRjZGMsIDB4MTVjMCwgMHgyMDExLAorCTB4YjI5MCwgMHhhYzk4LCAweDAwMGEsIDB4MjBhOSwgMHgwMDA0LCAweDA4MGMsIDB4OGE3YywgMHgxNTc4LAorCTB4MDAxZSwgMHgwMDJlLCAweDAwMjYsIDB4MDAxNiwgMHgyMDE5LCAweDAwMjksIDB4MDgwYywgMHg3Y2Y0LAorCTB4MDgwYywgMHg2OGU3LCAweDAwNzYsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsIDB4NjgxZCwgMHgwMDdlLAorCTB4MDAxZSwgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweGE3MTIsIDB4MDA3ZSwgMHgwODBjLAorCTB4NGVjZiwgMHgwMDI2LCAweDYyMDQsIDB4YTI5NCwgMHhmZjAwLCAweDgyMTcsIDB4YTI4NiwgMHgwMDA2LAorCTB4MDExOCwgMHhhMjg2LCAweDAwMDQsIDB4MTExOCwgMHg2MmEwLCAweDA4MGMsIDB4MmI4NywgMHgwMDJlLAorCTB4MDAxZSwgMHgwODBjLCAweDQ5M2EsIDB4NjYxMiwgMHg2NTE2LCAweGEwMDYsIDB4MDAxMCwgMHgwMGNlLAorCTB4MDAxZSwgMHgwMTVlLCAweDAwM2UsIDB4MDBjZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LAorCTB4MDBlNiwgMHgwMDE2LCAweDIwMDksIDB4YWQyMCwgMHgyMTA0LCAweGEwODYsIDB4MDA3NCwgMHgxOTA0LAorCTB4YTY0YiwgMHgyMDY5LCAweGIyOGUsIDB4NjkwYywgMHhhMTgyLCAweDAxMDAsIDB4MDZjMCwgMHg2OTA4LAorCTB4YTE4NCwgMHg4MDAwLCAweDA1ZTgsIDB4MjAwMSwgMHhhZjlkLCAweDIwMDQsIDB4YTAwNSwgMHgxMTYwLAorCTB4NjAxOCwgMHgyMDcwLCAweDcwMTAsIDB4YTA4NCwgMHgwMGZmLCAweDAxMTgsIDB4NzAwMCwgMHhkMGY0LAorCTB4MDExOCwgMHhhMTg0LCAweDA4MDAsIDB4MDU2MCwgMHg2OTEwLCAweGExOGEsIDB4MDAwMSwgMHgwNjEwLAorCTB4NjkxNCwgMHgyMDY5LCAweGIyYWUsIDB4NjkwNCwgMHg4MWZmLCAweDExOTgsIDB4NjkwYywgMHhhMTgyLAorCTB4MDEwMCwgMHgwMmE4LCAweDY5MDgsIDB4ODFmZiwgMHgxMTc4LCAweDY5MTAsIDB4YTE4YSwgMHgwMDAxLAorCTB4MDI4OCwgMHg2OTE4LCAweGExOGEsIDB4MDAwMSwgMHgwMjk4LCAweDAwZDAsIDB4NjAxMywgMHgwMTAwLAorCTB4MDBhMCwgMHg2MDEzLCAweDAzMDAsIDB4MDA4OCwgMHg2MDEzLCAweDA1MDAsIDB4MDA3MCwgMHg2MDEzLAorCTB4MDcwMCwgMHgwMDU4LCAweDYwMTMsIDB4MDkwMCwgMHgwMDQwLCAweDYwMTMsIDB4MGIwMCwgMHgwMDI4LAorCTB4NjAxMywgMHgwZjAwLCAweDAwMTAsIDB4NjAxMywgMHgyZDAwLCAweGEwODUsIDB4MDAwMSwgMHgwMDA4LAorCTB4YTAwNiwgMHgwMDFlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LAorCTB4MDAyNiwgMHgwMDM2LCAweDAxNTYsIDB4NjIxOCwgMHgyMjY4LCAweDZiMDQsIDB4YTM5NCwgMHgwMGZmLAorCTB4YTI4NiwgMHgwMDA2LCAweDAxOTAsIDB4YTI4NiwgMHgwMDA0LCAweDAxNzgsIDB4YTM5NCwgMHhmZjAwLAorCTB4ODIxNywgMHhhMjg2LCAweDAwMDYsIDB4MDE0OCwgMHhhMjg2LCAweDAwMDQsIDB4MDEzMCwgMHgwMGM2LAorCTB4MmQ2MCwgMHgwODBjLCAweDRjZWIsIDB4MDBjZSwgMHgwNGMwLCAweDIwMTEsIDB4YjI5NiwgMHhhZDk4LAorCTB4MDAwYSwgMHgyMGE5LCAweDAwMDQsIDB4MDgwYywgMHg4YTdjLCAweDE1ODAsIDB4MjAxMSwgMHhiMjlhLAorCTB4YWQ5OCwgMHgwMDA2LCAweDIwYTksIDB4MDAwNCwgMHgwODBjLCAweDhhN2MsIDB4MTUzOCwgMHgwMDQ2LAorCTB4MDAxNiwgMHg2YWEwLCAweGEyOTQsIDB4MDBmZiwgMHg4MjI3LCAweGEwMDYsIDB4MjAwOSwgMHhhZDUyLAorCTB4MjEwYywgMHhkMWE0LCAweDAxMzgsIDB4MjAwOSwgMHgwMDI5LCAweDA4MGMsIDB4YTk2YywgMHg2ODAwLAorCTB4YzBlNSwgMHg2ODAyLCAweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweDY4ZTcsIDB4MDA3NiwgMHgyMDM5LAorCTB4MDAwMCwgMHgwODBjLCAweDY4MWQsIDB4MmMwOCwgMHgwODBjLCAweGE3MTIsIDB4MDA3ZSwgMHgyMDAxLAorCTB4MDAwNywgMHgwODBjLCAweDRjNWQsIDB4MDAxZSwgMHgwMDRlLCAweGEwMDYsIDB4MDE1ZSwgMHgwMDNlLAorCTB4MDAyZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGQ2LCAweDIwNjksIDB4YjI4ZSwgMHg2ODAwLAorCTB4YTA4NiwgMHgwODAwLCAweDAxMTgsIDB4NjAxMywgMHgwMDAwLCAweDAwMDgsIDB4YTAwNiwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMGM2LCAweDAwZjYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDE1NiwgMHgyMDc5LAorCTB4YjI4YywgMHg3OTMwLCAweDc4MzQsIDB4MDgwYywgMHgyNjc2LCAweDExYTAsIDB4MDgwYywgMHg0Y2RjLAorCTB4MTE4OCwgMHgyMDExLCAweGIyOTAsIDB4YWM5OCwgMHgwMDBhLCAweDIwYTksIDB4MDAwNCwgMHgwODBjLAorCTB4OGE3YywgMHgxMTQwLCAweDIwMTEsIDB4YjI5NCwgMHhhYzk4LCAweDAwMDYsIDB4MjBhOSwgMHgwMDA0LAorCTB4MDgwYywgMHg4YTdjLCAweDAxNWUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDBmZSwgMHgwMGNlLAorCTB4MDAwNSwgMHgwMGM2LCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDE1NiwgMHgyMDExLAorCTB4YjI4MywgMHgyMjA0LCAweDgyMTEsIDB4MjIwYywgMHgwODBjLCAweDI2NzYsIDB4MTFhMCwgMHgwODBjLAorCTB4NGNkYywgMHgxMTg4LCAweDIwMTEsIDB4YjI5NiwgMHhhYzk4LCAweDAwMGEsIDB4MjBhOSwgMHgwMDA0LAorCTB4MDgwYywgMHg4YTdjLCAweDExNDAsIDB4MjAxMSwgMHhiMjlhLCAweGFjOTgsIDB4MDAwNiwgMHgyMGE5LAorCTB4MDAwNCwgMHgwODBjLCAweDhhN2MsIDB4MDE1ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLAorCTB4MDBjZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMDg2LCAweDAwNzYsIDB4MDA2NiwgMHgwMDU2LAorCTB4MDA0NiwgMHgwMDI2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDI3NDAsIDB4MjAyOSwgMHhhZmQwLAorCTB4MjUyYywgMHgyMDIxLCAweGFmZDYsIDB4MjQyNCwgMHgyMDYxLCAweGI0MDAsIDB4MjA3MSwgMHhhZDAwLAorCTB4NzY0NCwgMHg3MDY0LCAweDgxZmYsIDB4MDEyOCwgMHg4MDAxLCAweGE2MDIsIDB4MWEwNCwgMHhhNzhlLAorCTB4MDAxOCwgMHhhNjA2LCAweDA5MDQsIDB4YTc4ZSwgMHgyMTAwLCAweGFjMDYsIDB4MDkwNCwgMHhhNzg1LAorCTB4MDgwYywgMHhhOTkwLCAweDA5MDQsIDB4YTc4NSwgMHg2NzFjLCAweGE3ODYsIDB4MDAwMSwgMHgwOTA0LAorCTB4YTdhNSwgMHhhNzg2LCAweDAwMDQsIDB4MDkwNCwgMHhhN2E1LCAweGE3ODYsIDB4MDAwNywgMHgwNWU4LAorCTB4MjUwMCwgMHhhYzA2LCAweDA1ZDAsIDB4MjQwMCwgMHhhYzA2LCAweDA1YjgsIDB4MDgwYywgMHhhOWEwLAorCTB4MTVhMCwgMHg4OGZmLCAweDAxMTgsIDB4NjA1MCwgMHhhOTA2LCAweDE1NzgsIDB4MDBkNiwgMHg2MDAwLAorCTB4YTA4NiwgMHgwMDA0LCAweDExMjAsIDB4MDAxNiwgMHgwODBjLCAweDE5MGIsIDB4MDAxZSwgMHhhNzg2LAorCTB4MDAwOCwgMHgxMTQ4LCAweDA4MGMsIDB4OTc4OSwgMHgxMTMwLCAweDA4MGMsIDB4ODVmMywgMHgwMGRlLAorCTB4MDgwYywgMHg5NzRlLCAweDAwZDAsIDB4NjAxMCwgMHgyMDY4LCAweDA4MGMsIDB4OTU5NiwgMHgwMTkwLAorCTB4YTc4NiwgMHgwMDAzLCAweDE1MjgsIDB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLAorCTB4MDgwYywgMHhhYmZhLCAweDAwMTYsIDB4MDgwYywgMHg5N2ZkLCAweDA4MGMsIDB4NTEwYywgMHgwMDFlLAorCTB4MDgwYywgMHg5NzQyLCAweDAwZGUsIDB4MDgwYywgMHg5NzRlLCAweGFjZTAsIDB4MDAxOCwgMHgyMDAxLAorCTB4YWQxNiwgMHgyMDA0LCAweGFjMDIsIDB4MTIxMCwgMHgwODA0LCAweGE3MjYsIDB4MDEyZSwgMHgwMDJlLAorCTB4MDA0ZSwgMHgwMDVlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMDhlLCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LAorCTB4YTc4NiwgMHgwMDA2LCAweDE5YzAsIDB4YTM4NiwgMHgwMDA1LCAweDAxMjgsIDB4MDgwYywgMHhhYmZhLAorCTB4MDgwYywgMHhhOTFmLCAweDA4ZjgsIDB4MDBkZSwgMHgwYzAwLCAweDA4MGMsIDB4YTlhMCwgMHgxOWU4LAorCTB4ODFmZiwgMHgwOWQ4LCAweGExODAsIDB4MDAwMSwgMHgyMDA0LCAweGEwODYsIDB4MDAxOCwgMHgwMTMwLAorCTB4YTE4MCwgMHgwMDAxLCAweDIwMDQsIDB4YTA4NiwgMHgwMDJkLCAweDE5NzgsIDB4NjAwMCwgMHhhMDg2LAorCTB4MDAwMiwgMHgxOTU4LCAweDA4MGMsIDB4OTc3OCwgMHgwMTMwLCAweDA4MGMsIDB4OTc4OSwgMHgxOTI4LAorCTB4MDgwYywgMHg4NWYzLCAweDAwMzgsIDB4MDgwYywgMHgyYWZmLCAweDA4MGMsIDB4OTc4OSwgMHgxMTEwLAorCTB4MDgwYywgMHg4NWYzLCAweDA4MGMsIDB4OTc0ZSwgMHgwODA0LCAweGE3ODUsIDB4MDBjNiwgMHgwMGU2LAorCTB4MDAxNiwgMHgyYzA4LCAweDIxNzAsIDB4MDgwYywgMHhhOTQwLCAweDAwMWUsIDB4MDEyMCwgMHg2MDFjLAorCTB4YTA4NCwgMHgwMDBmLCAweDAwMWIsIDB4MDBlZSwgMHgwMGNlLCAweDAwMDUsIDB4YTdlNiwgMHhhN2U2LAorCTB4YTdlNiwgMHhhN2U2LCAweGE3ZTYsIDB4YTdlNiwgMHhhN2U4LCAweGE3ZTYsIDB4YTAwNiwgMHgwMDA1LAorCTB4MDA0NiwgMHgwMDE2LCAweDcwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMjQsIDB4YTRhNCwgMHgwMGZmLAorCTB4ODQyNywgMHgyYzAwLCAweDIwMDksIDB4MDAyMCwgMHgwODBjLCAweGE5NmMsIDB4MDAxZSwgMHgwMDRlLAorCTB4MDAzNiwgMHgyMDE5LCAweDAwMDIsIDB4MDgwYywgMHhhNTY2LCAweDAwM2UsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDAwNSwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHg0YzFlLCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LAorCTB4MDAzNiwgMHgyMGE5LCAweDAwMDQsIDB4MjAxOSwgMHhhZDA1LCAweDIwMTEsIDB4YjI5NiwgMHgwODBjLAorCTB4OGE3YywgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMTVlLCAweGEwMDUsIDB4MDAwNSwgMHgwMGY2LAorCTB4MDBlNiwgMHgwMGM2LCAweDAwODYsIDB4MDA3NiwgMHgwMDY2LCAweDAwMjYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyNzQwLCAweDIwNjEsIDB4YjQwMCwgMHgyMDc5LCAweDAwMDEsIDB4OGZmZiwgMHgwOTA0LAorCTB4YTg3NSwgMHgyMDcxLCAweGFkMDAsIDB4NzY0NCwgMHg3MDY0LCAweDgwMDEsIDB4YTYwMiwgMHgxYTA0LAorCTB4YTg3NSwgMHg4OGZmLCAweDAxMjgsIDB4MjgwMCwgMHhhYzA2LCAweDE1YjAsIDB4MjA3OSwgMHgwMDAwLAorCTB4MDgwYywgMHhhOTkwLCAweDA1ODgsIDB4MjQwMCwgMHhhYzA2LCAweDA1NzAsIDB4NjcxYywgMHhhNzg2LAorCTB4MDAwNiwgMHgxNTUwLCAweGE3ODYsIDB4MDAwNywgMHgwNTM4LCAweDg4ZmYsIDB4MTE0MCwgMHg2MDE4LAorCTB4YTIwNiwgMHgxNTEwLCAweDg1ZmYsIDB4MDExOCwgMHg2MDUwLCAweGExMDYsIDB4MTFlOCwgMHgwMGQ2LAorCTB4NjAwMCwgMHhhMDg2LCAweDAwMDQsIDB4MTE1MCwgMHgwODBjLCAweGFiYjQsIDB4NjAxZiwgMHgwMDA3LAorCTB4MjAwMSwgMHhhZmEzLCAweDIwMDQsIDB4NjAxNiwgMHgwODBjLCAweDE5MGIsIDB4NjAxMCwgMHgyMDY4LAorCTB4MDgwYywgMHg5NTk2LCAweDAxMjAsIDB4MDA0NiwgMHgwODBjLCAweGE5MWYsIDB4MDA0ZSwgMHgwMGRlLAorCTB4MDgwYywgMHg5NzRlLCAweDg4ZmYsIDB4MTE5OCwgMHhhY2UwLCAweDAwMTgsIDB4MjAwMSwgMHhhZDE2LAorCTB4MjAwNCwgMHhhYzAyLCAweDEyMTAsIDB4MDgwNCwgMHhhODI2LCAweGEwMDYsIDB4MDEyZSwgMHgwMDJlLAorCTB4MDA2ZSwgMHgwMDdlLCAweDAwOGUsIDB4MDBjZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHhhOGM1LAorCTB4MDAwMSwgMHgwY2EwLCAweDAwNzYsIDB4MDA1NiwgMHgwMDg2LCAweDIwNDEsIDB4MDAwMCwgMHgyMDI5LAorCTB4MDAwMSwgMHgyYzIwLCAweDIwMTksIDB4MDAwMiwgMHg2MjE4LCAweDAwOTYsIDB4MjA0OSwgMHgwMDAwLAorCTB4MDgwYywgMHg3YjlhLCAweDAwOWUsIDB4MDA4ZSwgMHgyMDM5LCAweDAwMDAsIDB4MDgwYywgMHg3YzM0LAorCTB4MDgwYywgMHhhODE3LCAweDAwNWUsIDB4MDA3ZSwgMHgwMDA1LCAweDAwMjYsIDB4MDA0NiwgMHgwMDU2LAorCTB4MDA3NiwgMHgwMGM2LCAweDAxNTYsIDB4MmMyMCwgMHgyMTI4LCAweDIwYTksIDB4MDA3ZiwgMHgyMDA5LAorCTB4MDAwMCwgMHgwMDE2LCAweDAwMzYsIDB4MDgwYywgMHg0Y2RjLCAweDExYjAsIDB4MmMxMCwgMHgwMDU2LAorCTB4MDA4NiwgMHgyMDQxLCAweDAwMDAsIDB4MjUwOCwgMHgyMDI5LCAweDAwMDEsIDB4MDA5NiwgMHgyMDQ5LAorCTB4MDAwMCwgMHgwODBjLCAweDdiOWEsIDB4MDA5ZSwgMHgwMDhlLCAweDIwMzksIDB4MDAwMCwgMHgwODBjLAorCTB4N2MzNCwgMHgwODBjLCAweGE4MTcsIDB4MDA1ZSwgMHgwMDNlLCAweDAwMWUsIDB4ODEwOCwgMHgxZjA0LAorCTB4YThhOSwgMHgwMTVlLCAweDAwY2UsIDB4MDA3ZSwgMHgwMDVlLCAweDAwNGUsIDB4MDAyZSwgMHgwMDA1LAorCTB4MDA3NiwgMHgwMDU2LCAweDYyMTgsIDB4MDA4NiwgMHgyMDQxLCAweDAwMDAsIDB4MjAyOSwgMHgwMDAxLAorCTB4MjAxOSwgMHgwMDQ4LCAweDAwOTYsIDB4MjA0OSwgMHgwMDAwLCAweDA4MGMsIDB4N2I5YSwgMHgwMDllLAorCTB4MDA4ZSwgMHgyMDM5LCAweDAwMDAsIDB4MDgwYywgMHg3YzM0LCAweDJjMjAsIDB4MDgwYywgMHhhODE3LAorCTB4MDA1ZSwgMHgwMDdlLCAweDAwMDUsIDB4MDAyNiwgMHgwMDQ2LCAweDAwNTYsIDB4MDA3NiwgMHgwMGM2LAorCTB4MDE1NiwgMHgyYzIwLCAweDIwYTksIDB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsIDB4MDAxNiwgMHgwMDM2LAorCTB4MDgwYywgMHg0Y2RjLCAweDExYzAsIDB4MmMxMCwgMHgwMDg2LCAweDIwNDEsIDB4MDAwMCwgMHgyODI4LAorCTB4MDA0NiwgMHgyMDIxLCAweDAwMDEsIDB4MDgwYywgMHhhYjk2LCAweDAwNGUsIDB4MDA5NiwgMHgyMDQ5LAorCTB4MDAwMCwgMHgwODBjLCAweDdiOWEsIDB4MDA5ZSwgMHgwMDhlLCAweDIwMzksIDB4MDAwMCwgMHgwODBjLAorCTB4N2MzNCwgMHgwODBjLCAweGE4MTcsIDB4MDAzZSwgMHgwMDFlLCAweDgxMDgsIDB4MWYwNCwgMHhhOGY2LAorCTB4MDE1ZSwgMHgwMGNlLCAweDAwN2UsIDB4MDA1ZSwgMHgwMDRlLCAweDAwMmUsIDB4MDAwNSwgMHgwMDE2LAorCTB4MDBmNiwgMHgzODAwLCAweGQwOGMsIDB4MDEzMCwgMHhhZDgyLCAweDEwMDAsIDB4MDJiMCwgMHhhZDgyLAorCTB4YWQwMCwgMHgwMjMwLCAweGFkODIsIDB4ZTQwMCwgMHgwMjgwLCAweGFkODIsIDB4ZmZmZiwgMHgxMjY4LAorCTB4NjgwMCwgMHhhMDdkLCAweDAxMzgsIDB4NjgwMywgMHgwMDAwLCAweDZiNTIsIDB4MDgwYywgMHg1MTBjLAorCTB4MmY2OCwgMHgwY2IwLCAweDZiNTIsIDB4MDgwYywgMHg1MTBjLCAweDAwZmUsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgwMDQ2LCAweDAwMzYsIDB4MjA2MSwgMHhiNDAwLCAweDIwNzEsIDB4YWQwMCwgMHg3NDQ0LAorCTB4NzA2NCwgMHg4MDAxLCAweGE0MDIsIDB4MTJkOCwgMHgyMTAwLCAweGFjMDYsIDB4MDE2OCwgMHg2MDAwLAorCTB4YTA4NiwgMHgwMDAwLCAweDAxNDgsIDB4NjAwOCwgMHhhMjA2LCAweDExMzAsIDB4NjAxOCwgMHhhMWEwLAorCTB4MDAwNiwgMHgyNDI0LCAweGE0MDYsIDB4MDE0MCwgMHhhY2UwLCAweDAwMTgsIDB4MjAwMSwgMHhhZDE2LAorCTB4MjAwNCwgMHhhYzAyLCAweDEyMjAsIDB4MGMwOCwgMHhhMDg1LCAweDAwMDEsIDB4MDAwOCwgMHhhMDA2LAorCTB4MDAzZSwgMHgwMDRlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGQ2LCAweDAwMDYsIDB4MDgwYywgMHgxNWQ5LAorCTB4MDAwZSwgMHgwOTBjLCAweDE0ZjYsIDB4NjgzNywgMHgwMTBkLCAweDY4NWUsIDB4MDAyNiwgMHgyMDEwLAorCTB4MDgwYywgMHg5NTg2LCAweDIwMDEsIDB4MDAwMCwgMHgwMTIwLCAweDIyMDAsIDB4YTA4MCwgMHgwMDE0LAorCTB4MjAwNCwgMHgwMDJlLCAweDY4NGEsIDB4Njk1NiwgMHg2YzQ2LCAweDY4NGYsIDB4MDAwMCwgMHhhMDA2LAorCTB4NjhiMiwgMHg2ODAyLCAweDY4M2EsIDB4Njg1YSwgMHgwODBjLCAweDUxMGMsIDB4MDBkZSwgMHgwMDA1LAorCTB4NjcwMCwgMHhhNzg2LCAweDAwMDAsIDB4MDE1OCwgMHhhNzg2LCAweDAwMDEsIDB4MDE0MCwgMHhhNzg2LAorCTB4MDAwYSwgMHgwMTI4LCAweGE3ODYsIDB4MDAwOSwgMHgwMTEwLCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LAorCTB4MDBlNiwgMHg2MDE4LCAweDIwNzAsIDB4NzBhMCwgMHhhMjA2LCAweDAwZWUsIDB4MDAwNSwgMHgwMDE2LAorCTB4NjAwNCwgMHhhMDhlLCAweDAwMWUsIDB4MTFhMCwgMHg4MDA3LCAweDYxMzAsIDB4YTE4YywgMHgwMGZmLAorCTB4YTEwNSwgMHg2MDMyLCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAxZiwgMHgwMDA1LAorCTB4MjAwMSwgMHhhZmE0LCAweDIwMDQsIDB4NjAxNiwgMHgwODBjLCAweDY3YTgsIDB4MDgwYywgMHg2YzUwLAorCTB4MDAxZSwgMHgwMDA1LCAweGUwMDAsIDB4ZTAwMCwgMHgwMDA1LCAweDYwMjAsIDB4ZDBlNCwgMHgwMTU4LAorCTB4ZDBjYywgMHgwMTE4LCAweDA4MGMsIDB4OTg2NiwgMHgwMDMwLCAweDA4MGMsIDB4YWJiNCwgMHgwODBjLAorCTB4NjYxOCwgMHgwODBjLCAweDgwNzgsIDB4MDAwNSwgMHhhMjgwLCAweDAwMDcsIDB4MjAwNCwgMHhhMDg0LAorCTB4MDAwZiwgMHgwMDAyLCAweGE5ZTMsIDB4YTllMywgMHhhOWUzLCAweGE5ZTgsIDB4YTllMywgMHhhOWU1LAorCTB4YTllNSwgMHhhOWUzLCAweGE5ZTUsIDB4YTAwNiwgMHgwMDA1LCAweDAwYzYsIDB4MjI2MCwgMHgwMGNlLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4YTI4MCwgMHgwMDA3LCAweDIwMDQsIDB4YTA4NCwgMHgwMDBmLAorCTB4MDAwMiwgMHhhOWZhLCAweGE5ZmEsIDB4YTlmYSwgMHhhOWZhLCAweGE5ZmEsIDB4YTlmYSwgMHhhYTA1LAorCTB4YTlmYSwgMHhhOWZhLCAweDYwMDcsIDB4MDAzYiwgMHg2MDJiLCAweDAwMDksIDB4NjAxMywgMHgyYTAwLAorCTB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NjdhOCwgMHgwMDA1LCAweDAwYzYsIDB4MjI2MCwgMHgwODBjLAorCTB4YWJiNCwgMHg2MDNmLCAweDAwMDAsIDB4NjAyMCwgMHhjMGY0LCAweGMwY2MsIDB4NjAyMiwgMHg2MDM3LAorCTB4MDAwMCwgMHgwMGNlLCAweDAwZDYsIDB4MjI2OCwgMHhhMTg2LCAweDAwMDcsIDB4MTkwNCwgMHhhYTYwLAorCTB4NjgxMCwgMHhhMDA1LCAweDAxMzgsIDB4YTA4MCwgMHgwMDEzLCAweDIwMDQsIDB4ZDBmYywgMHgxMTEwLAorCTB4MDBkZSwgMHgwOGMwLCAweDYwMDcsIDB4MDAzYSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2N2E4LAorCTB4MDgwYywgMHg2YzUwLCAweDAwYzYsIDB4MmQ2MCwgMHg2MTAwLCAweGExODYsIDB4MDAwMiwgMHgxOTA0LAorCTB4YWFlNywgMHg2MDEwLCAweGEwMDUsIDB4MTEzOCwgMHg2MDAwLCAweGEwODYsIDB4MDAwNywgMHgxOTBjLAorCTB4MTRmNiwgMHgwODA0LCAweGFhZTcsIDB4YTA4YywgMHhmMDAwLCAweDExMzAsIDB4MDAyOCwgMHgyMDY4LAorCTB4NjgwMCwgMHhhMDA1LCAweDFkZTAsIDB4MmQwMCwgMHhhMDgwLCAweDAwMTMsIDB4MjAwNCwgMHhhMDg0LAorCTB4MDAwMywgMHhhMDg2LCAweDAwMDIsIDB4MTE4MCwgMHg2MDEwLCAweDIwNjgsIDB4Njg0YywgMHhjMGRjLAorCTB4YzBmNCwgMHg2ODRlLCAweDY4NTAsIDB4YzBmNCwgMHhjMGZjLCAweDY4NTIsIDB4MjAwOSwgMHgwMDQzLAorCTB4MDgwYywgMHhhM2RlLCAweDA4MDQsIDB4YWFlNywgMHgyMDA5LCAweDAwNDEsIDB4MDgwNCwgMHhhYWUxLAorCTB4YTE4NiwgMHgwMDA1LCAweDE1ZjAsIDB4NjgxMCwgMHhhMDgwLCAweDAwMTMsIDB4MjAwNCwgMHhkMGJjLAorCTB4MTExOCwgMHgwMGRlLCAweDA4MDQsIDB4YTlmYSwgMHhkMGI0LCAweDAxMjgsIDB4ZDBmYywgMHgwOTBjLAorCTB4MTRmNiwgMHgwODA0LCAweGFhMTgsIDB4NjAwNywgMHgwMDNhLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLAorCTB4NjdhOCwgMHgwODBjLCAweDZjNTAsIDB4MDBjNiwgMHgyZDYwLCAweDYxMDAsIDB4YTE4NiwgMHgwMDAyLAorCTB4MDEyMCwgMHhhMTg2LCAweDAwMDQsIDB4MTkwNCwgMHhhYWU3LCAweDIwNzEsIDB4YWZmZCwgMHg3MDAwLAorCTB4YTA4NiwgMHgwMDAzLCAweDExMjgsIDB4NzAwNCwgMHhhYzA2LCAweDExMTAsIDB4NzAwMywgMHgwMDAwLAorCTB4NjgxMCwgMHhhMDgwLCAweDAwMTMsIDB4MjAwYywgMHhjMWY0LCAweGMxZGMsIDB4MjEwMiwgMHg4MDAwLAorCTB4MjAwYywgMHhjMWY0LCAweGMxZmMsIDB4YzFiYywgMHgyMTAyLCAweDIwMDksIDB4MDA0MiwgMHgwODA0LAorCTB4YWFlMSwgMHgwMDM2LCAweDAwZDYsIDB4MDBkNiwgMHgwODBjLCAweDE1ZDksIDB4MDAzZSwgMHgwOTBjLAorCTB4MTRmNiwgMHg2ODM3LCAweDAxMGQsIDB4NjgwMywgMHgwMDAwLCAweDY4M2IsIDB4MDAwMCwgMHg2ODViLAorCTB4MDAwMCwgMHg2YjVlLCAweDY4NTcsIDB4MDA0NSwgMHgyYzAwLCAweDY4NjIsIDB4NjAzNCwgMHg2ODcyLAorCTB4MjM2MCwgMHg2MDIwLCAweGMwZGQsIDB4NjAyMiwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LAorCTB4YTA4NCwgMHgwMGZmLCAweDgwMDcsIDB4NjM1MCwgMHg2YjRhLCAweDY4NDYsIDB4Njg0ZiwgMHgwMDAwLAorCTB4NmQ2YSwgMHg2ZTY2LCAweDY4NmYsIDB4MDAwMSwgMHgwODBjLCAweDUxMGMsIDB4MjAxOSwgMHgwMDQ1LAorCTB4NjAwOCwgMHgyMDY4LCAweDA4MGMsIDB4YTU2NiwgMHgyZDAwLCAweDYwMGEsIDB4NjAxZiwgMHgwMDA2LAorCTB4NjAwMywgMHgwMDA3LCAweDYwMTcsIDB4MDAwMCwgMHg2MDNmLCAweDAwMDAsIDB4MDBkZSwgMHgwMDNlLAorCTB4MDAzOCwgMHg2MDNmLCAweDAwMDAsIDB4NjAwMywgMHgwMDA3LCAweDA4MGMsIDB4YTNkZSwgMHgwMGNlLAorCTB4MDBkZSwgMHgwMDA1LCAweGExODYsIDB4MDAxMywgMHgxMTI4LCAweDYwMDQsIDB4YTA4MiwgMHgwMDg1LAorCTB4MjAwOCwgMHgwMGMyLCAweGExODYsIDB4MDAyNywgMHgxMTc4LCAweDA4MGMsIDB4NmI3MywgMHgwMDM2LAorCTB4MDBkNiwgMHg2MDEwLCAweDIwNjgsIDB4MjAxOSwgMHgwMDA0LCAweDA4MGMsIDB4YTkxZiwgMHgwMGRlLAorCTB4MDAzZSwgMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHhhMTg2LCAweDAwMTQsIDB4MGQ3MCwgMHgwODBjLAorCTB4ODBiZSwgMHgwMDA1LCAweGFiMTMsIDB4YWIxMSwgMHhhYjExLCAweGFiMTEsIDB4YWIxMSwgMHhhYjExLAorCTB4YWIxMywgMHgwODBjLCAweDE0ZjYsIDB4MDgwYywgMHg2YjczLCAweDYwMDMsIDB4MDAwYywgMHgwODBjLAorCTB4NmM1MCwgMHgwMDA1LCAweGExODIsIDB4MDA4YywgMHgxMjIwLCAweGExODIsIDB4MDA4NSwgMHgwMjA4LAorCTB4MDAxYSwgMHgwODBjLCAweDgwYmUsIDB4MDAwNSwgMHhhYjJiLCAweGFiMmIsIDB4YWIyYiwgMHhhYjJiLAorCTB4YWIyZCwgMHhhYjRiLCAweGFiMmIsIDB4MDgwYywgMHgxNGY2LCAweDAwZDYsIDB4MmM2OCwgMHgwODBjLAorCTB4ODAyMiwgMHgwMWEwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMWUsIDB4MjAwOSwgMHhiMjhlLAorCTB4MjEwYywgMHg2MTM2LCAweDIwMDksIDB4YjI4ZiwgMHgyMTBjLCAweDYxM2EsIDB4NjAwYiwgMHhmZmZmLAorCTB4NjkxOCwgMHg2MTFhLCAweDYwMWYsIDB4MDAwNCwgMHgwODBjLCAweDY3YTgsIDB4MmQ2MCwgMHgwODBjLAorCTB4ODA3OCwgMHgwMGRlLCAweDAwMDUsIDB4MDgwYywgMHg4MDc4LCAweDAwMDUsIDB4MDBlNiwgMHg2MDE4LAorCTB4MjA3MCwgMHg3MDAwLCAweGQwZWMsIDB4MDBlZSwgMHgwMDA1LCAweDYwMTAsIDB4YTA4MCwgMHgwMDEzLAorCTB4MjAwYywgMHhkMWVjLCAweDA1ZDAsIDB4MjAwMSwgMHhhZDcxLCAweDIwMDQsIDB4ZDBlYywgMHgwNWE4LAorCTB4NjAwMywgMHgwMDAyLCAweDYwMjAsIDB4YzBlNSwgMHg2MDIyLCAweGQxYWMsIDB4MDE4MCwgMHgwMGY2LAorCTB4MmM3OCwgMHgwODBjLCAweDUwMjUsIDB4MDBmZSwgMHgwMTUwLCAweDIwMDEsIDB4YWZhNSwgMHgyMDA0LAorCTB4NjAzZSwgMHgyMDA5LCAweGFkNzEsIDB4MjEwYywgMHhkMWY0LCAweDExZTgsIDB4MDA4MCwgMHgyMDA5LAorCTB4YWQ3MSwgMHgyMTBjLCAweGQxZjQsIDB4MDEyOCwgMHg2MDIwLCAweGMwZTQsIDB4NjAyMiwgMHhhMDA2LAorCTB4MDBhMCwgMHgyMDAxLCAweGFmYTUsIDB4MjAwYywgMHg4MTAzLCAweGExMDAsIDB4NjAzZSwgMHg2MDE4LAorCTB4YTA4OCwgMHgwMDJiLCAweDIxMDQsIDB4YTAwNSwgMHgwMTE4LCAweGEwODgsIDB4MDAwMywgMHgwY2QwLAorCTB4MmMwYSwgMHg2MDBmLCAweDAwMDAsIDB4YTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDAxNiwgMHgwMGM2LAorCTB4MDBlNiwgMHg2MTUwLCAweGEyZjAsIDB4MDAyYiwgMHgyZTA0LCAweDIwNjAsIDB4OGNmZiwgMHgwMTgwLAorCTB4ODRmZiwgMHgxMTE4LCAweDYwNTAsIDB4YTEwNiwgMHgxMTM4LCAweDYwMGMsIDB4MjA3MiwgMHgwODBjLAorCTB4NjYxOCwgMHgwODBjLCAweDgwNzgsIDB4MDAxMCwgMHhhY2YwLCAweDAwMDMsIDB4MmU2NCwgMHgwYzcwLAorCTB4MDBlZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGQ2LCAweDYwMTgsIDB4YTBlOCwgMHgwMDJiLAorCTB4MmQwNCwgMHhhMDA1LCAweDAxNDAsIDB4YWMwNiwgMHgwMTIwLCAweDJkMDQsIDB4YTBlOCwgMHgwMDAzLAorCTB4MGNiOCwgMHg2MDBjLCAweDIwNmEsIDB4MDBkZSwgMHgwMDA1LCAweDAwMjYsIDB4MDAzNiwgMHgwMTU2LAorCTB4MjAxMSwgMHhhZDI3LCAweDIyMDQsIDB4YTA4NCwgMHgwMGZmLCAweDIwMTksIDB4YjI4ZSwgMHgyMzM0LAorCTB4YTYzNiwgMHgxMWQ4LCAweDgzMTgsIDB4MjMzNCwgMHgyMjA0LCAweGEwODQsIDB4ZmYwMCwgMHhhNjM2LAorCTB4MTFhMCwgMHgyMDExLCAweGIyOTAsIDB4NjAxOCwgMHhhMDk4LCAweDAwMGEsIDB4MjBhOSwgMHgwMDA0LAorCTB4MDgwYywgMHg4YTdjLCAweDExNTAsIDB4MjAxMSwgMHhiMjk0LCAweDYwMTgsIDB4YTA5OCwgMHgwMDA2LAorCTB4MjBhOSwgMHgwMDA0LCAweDA4MGMsIDB4OGE3YywgMHgxMTAwLCAweDAxNWUsIDB4MDAzZSwgMHgwMDJlLAorCTB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4YWQwMCwgMHgwODBjLCAweDQ4ZjUsIDB4MDgwYywgMHgyOGZhLAorCTB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4NjAxOCwgMHgyMDcwLCAweDcwMDAsIDB4ZDBmYywgMHgwMTA4LAorCTB4MDAxMSwgMHgwMGVlLCAweDAwMDUsIDB4Njg1MCwgMHhjMGU1LCAweDY4NTIsIDB4MDAwNSwgMHgwMGU2LAorCTB4MDBjNiwgMHgwMDc2LCAweDAwNjYsIDB4MDA1NiwgMHgwMDQ2LCAweDAwMjYsIDB4MDAxNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwMjksIDB4YWZkMCwgMHgyNTJjLCAweDIwMjEsIDB4YWZkNiwgMHgyNDI0LAorCTB4MjA2MSwgMHhiNDAwLCAweDIwNzEsIDB4YWQwMCwgMHg3NjQ0LCAweDcwNjQsIDB4YTYwNiwgMHgwNTc4LAorCTB4NjcxYywgMHhhNzg2LCAweDAwMDEsIDB4MDExOCwgMHhhNzg2LCAweDAwMDgsIDB4MTUwMCwgMHgyNTAwLAorCTB4YWMwNiwgMHgwMWU4LCAweDI0MDAsIDB4YWMwNiwgMHgwMWQwLCAweDA4MGMsIDB4YTk5MCwgMHgwMWI4LAorCTB4MDgwYywgMHhhOWEwLCAweDExYTAsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDQsIDB4MTEyMCwgMHgwMDE2LAorCTB4MDgwYywgMHgxOTBiLCAweDAwMWUsIDB4MDgwYywgMHg5Nzc4LCAweDExMTAsIDB4MDgwYywgMHgyYWZmLAorCTB4MDgwYywgMHg5Nzg5LCAweDExMTAsIDB4MDgwYywgMHg4NWYzLCAweDA4MGMsIDB4OTc0ZSwgMHhhY2UwLAorCTB4MDAxOCwgMHgyMDAxLCAweGFkMTYsIDB4MjAwNCwgMHhhYzAyLCAweDEyMDgsIDB4MDg1OCwgMHgwMTJlLAorCTB4MDAxZSwgMHgwMDJlLCAweDAwNGUsIDB4MDA1ZSwgMHgwMDZlLCAweDAwN2UsIDB4MDBjZSwgMHgwMGVlLAorCTB4MDAwNSwgMHgwMTI2LCAweDAwMDYsIDB4MDBlNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhZDQwLAorCTB4ZDVhNCwgMHgwMTE4LCAweDcwMzQsIDB4ODAwMCwgMHg3MDM2LCAweGQ1YjQsIDB4MDExOCwgMHg3MDMwLAorCTB4ODAwMCwgMHg3MDMyLCAweGQ1YWMsIDB4MDExOCwgMHgyMDcxLCAweGFkNGEsIDB4MDQ1MSwgMHgwMGVlLAorCTB4MDAwZSwgMHgwMTJlLCAweDAwMDUsIDB4MDEyNiwgMHgwMDA2LCAweDAwZTYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA3MSwgMHhhZDQwLCAweGQ1YTQsIDB4MDExOCwgMHg3MDM0LCAweDgwMDAsIDB4NzAzNiwgMHhkNWI0LAorCTB4MDExOCwgMHg3MDMwLCAweDgwMDAsIDB4NzAzMiwgMHhkNWFjLCAweDAxMTgsIDB4MjA3MSwgMHhhZDRhLAorCTB4MDA4MSwgMHgwMGVlLCAweDAwMGUsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MDAwNiwgMHgwMGU2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YWQ0MiwgMHgwMDIxLCAweDAwZWUsIDB4MDAwZSwgMHgwMTJlLAorCTB4MDAwNSwgMHgyZTA0LCAweDgwMDAsIDB4MjA3MiwgMHgxMjIwLCAweDhlNzAsIDB4MmUwNCwgMHg4MDAwLAorCTB4MjA3MiwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhhZDQwLCAweDBjOTksIDB4MDBlZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgyMDcxLCAweGFkNDQsIDB4MGM2OSwgMHgwMGVlLCAweDAwMDUsIDB4MDAwMSwgMHgwMDAyLAorCTB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsIDB4MDEwMCwgMHgwMjAwLAorCTB4MDQwMCwgMHgwODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwLCAweDgwMDAsIDB4ODUyOQorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Fsb2dpY2lzcC5jIGIvZHJpdmVycy9zY3NpL3Fsb2dpY2lzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZDU5N2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljaXNwLmMKQEAgLTAsMCArMSwxOTM1IEBACisvKgorICogUUxvZ2ljIElTUDEwMjAgSW50ZWxsaWdlbnQgU0NTSSBQcm9jZXNzb3IgRHJpdmVyIChQQ0kpCisgKiBXcml0dGVuIGJ5IEVyaWsgSC4gTW9lLCBlaG1AY3Jpcy5jb20KKyAqIENvcHlyaWdodCAxOTk1LCBFcmlrIEguIE1vZQorICogQ29weXJpZ2h0IDE5OTYsIDE5OTcgIE1pY2hhZWwgQS4gR3JpZmZpdGggPGdyaWZAYWNtLm9yZz4KKyAqIENvcHlyaWdodCAyMDAwLCBKYXlzb24gQy4gVmFudHV5bCA8dmFudHV5bEBjc2Muc21zdS5lZHU+CisgKiAgICAgICAgICAgICBhbmQgQnJ5b24gVy4gUm9jaGUgICAgPGJyeW9uQGNzYy5zbXN1LmVkdT4KKyAqCisgKiA2NC1iaXQgYWRkcmVzc2luZyBhZGRlZCBieSBLYW5vaiBTYXJjYXIgPGthbm9qQHNnaS5jb20+CisgKiAJCQkgICBhbmQgTGVvIERhZ3VtICAgIDxkYWd1bUBzZ2kuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisvKgorICogV2l0aCB0aGUgcWxvZ2ljIGludGVyZmFjZSwgZXZlcnkgcXVldWUgc2xvdCBjYW4gaG9sZCBhIFNDU0kKKyAqIGNvbW1hbmQgd2l0aCB1cCB0byA0IHNjYXR0ZXIvZ2F0aGVyIGVudHJpZXMuICBJZiB3ZSBuZWVkIG1vcmUKKyAqIHRoYW4gNCBlbnRyaWVzLCBjb250aW51YXRpb24gZW50cmllcyBjYW4gYmUgdXNlZCB0aGF0IGhvbGQKKyAqIGFub3RoZXIgNyBlbnRyaWVzIGVhY2guICBVbmxpa2UgZm9yIG90aGVyIGRyaXZlcnMsIHRoaXMgbWVhbnMKKyAqIHRoYXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNjYXR0ZXIvZ2F0aGVyIGVudHJpZXMgd2UgY2FuCisgKiBzdXBwb3J0IGF0IGFueSBnaXZlbiB0aW1lIGlzIGEgZnVuY3Rpb24gb2YgdGhlIG51bWJlciBvZiBxdWV1ZQorICogc2xvdHMgYXZhaWxhYmxlLiAgVGhhdCBpcywgaG9zdC0+Y2FuX3F1ZXVlIGFuZCBob3N0LT5zZ190YWJsZXNpemUKKyAqIGFyZSBkeW5hbWljIGFuZCBfbm90XyBpbmRlcGVuZGVudC4gIFRoaXMgYWxsIHdvcmtzIGZpbmUgYmVjYXVzZQorICogcmVxdWVzdHMgYXJlIHF1ZXVlZCBzZXJpYWxseSBhbmQgdGhlIHNjYXR0ZXIvZ2F0aGVyIGxpbWl0IGlzCisgKiBkZXRlcm1pbmVkIGZvciBlYWNoIHF1ZXVlIHJlcXVlc3QgYW5ldy4KKyAqLworI2RlZmluZSBRTE9HSUNJU1BfUkVRX1FVRVVFX0xFTgk2MwkvKiBtdXN0IGJlIHBvd2VyIG9mIHR3byAtIDEgKi8KKyNkZWZpbmUgUUxPR0lDSVNQX01BWF9TRyhxbCkJKDQgKyAoKHFsKSA+IDApID8gNyooKHFsKSAtIDEpIDogMCkKKworLyogQ29uZmlndXJhdGlvbiBzZWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTZXQgdGhlIGZvbGxvd2luZyBtYWNybyB0byAxIHRvIHJlbG9hZCB0aGUgSVNQMTAyMCdzIGZpcm13YXJlLiAgVGhpcyBpcworICAgdGhlIGxhdGVzdCBmaXJtd2FyZSBwcm92aWRlZCBieSBRTG9naWMuICBUaGlzIG1heSBiZSBhbiBlYXJsaWVyL2xhdGVyCisgICByZXZpc2lvbiB0aGFuIHN1cHBsaWVkIGJ5IHlvdXIgYm9hcmQuICovCisKKyNkZWZpbmUgUkVMT0FEX0ZJUk1XQVJFCQkxCisKKy8qIFNldCB0aGUgZm9sbG93aW5nIG1hY3JvIHRvIDEgdG8gcmVsb2FkIHRoZSBJU1AxMDIwJ3MgZGVmYXVsdHMgZnJvbSBudnJhbS4KKyAgIElmIHlvdSBhcmUgbm90IHN1cmUgb2YgeW91ciBzZXR0aW5ncywgbGVhdmUgdGhpcyBhbG9uZSwgdGhlIGRyaXZlciB3aWxsCisgICB1c2UgYSBzZXQgb2YgJ3NhZmUnIGRlZmF1bHRzICovCisKKyNkZWZpbmUgVVNFX05WUkFNX0RFRkFVTFRTCTAKKworLyogIE1hY3JvcyB1c2VkIGZvciBkZWJ1Z2dpbmcgKi8KKworI2RlZmluZSBERUJVR19JU1AxMDIwCQkwCisjZGVmaW5lIERFQlVHX0lTUDEwMjBfSU5UUgkwCisjZGVmaW5lIERFQlVHX0lTUDEwMjBfU0VUVVAJMAorI2RlZmluZSBUUkFDRV9JU1AJCTAKKworI2RlZmluZSBERUZBVUxUX0xPT1BfQ09VTlQJMTAwMDAwMAorCisvKiBFbmQgQ29uZmlndXJhdGlvbiBzZWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2lmIFRSQUNFX0lTUAorCisjIGRlZmluZSBUUkFDRV9CVUZfTEVOCSgzMioxMDI0KQorCitzdHJ1Y3QgeworCXVfbG9uZwkJbmV4dDsKKwlzdHJ1Y3QgeworCQl1X2xvbmcJCXRpbWU7CisJCXVfaW50CQlpbmRleDsKKwkJdV9pbnQJCWFkZHI7CisJCXVfY2hhciAqCW5hbWU7CisJfSBidWZbVFJBQ0VfQlVGX0xFTl07Cit9IHRyYWNlOworCisjZGVmaW5lIFRSQUNFKHcsIGksIGEpCQkJCQkJXAorewkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkJCQlcCisJCQkJCQkJCVwKKwl0cmFjZS5idWZbdHJhY2UubmV4dF0ubmFtZSAgPSAodyk7CQkJXAorCXRyYWNlLmJ1Zlt0cmFjZS5uZXh0XS50aW1lICA9IGppZmZpZXM7CQkJXAorCXRyYWNlLmJ1Zlt0cmFjZS5uZXh0XS5pbmRleCA9IChpKTsJCQlcCisJdHJhY2UuYnVmW3RyYWNlLm5leHRdLmFkZHIgID0gKGxvbmcpIChhKTsJCVwKKwl0cmFjZS5uZXh0ID0gKHRyYWNlLm5leHQgKyAxKSAmIChUUkFDRV9CVUZfTEVOIC0gMSk7CVwKK30KKworI2Vsc2UKKyMgZGVmaW5lIFRSQUNFKHcsIGksIGEpCisjZW5kaWYKKworI2lmIERFQlVHX0lTUDEwMjAKKyNkZWZpbmUgRU5URVIoeCkJcHJpbnRrKCJpc3AxMDIwIDogZW50ZXJpbmcgJXMoKVxuIiwgeCk7CisjZGVmaW5lIExFQVZFKHgpCXByaW50aygiaXNwMTAyMCA6IGxlYXZpbmcgJXMoKVxuIiwgeCk7CisjZGVmaW5lIERFQlVHKHgpCXgKKyNlbHNlCisjZGVmaW5lIEVOVEVSKHgpCisjZGVmaW5lIExFQVZFKHgpCisjZGVmaW5lIERFQlVHKHgpCisjZW5kaWYgLyogREVCVUdfSVNQMTAyMCAqLworCisjaWYgREVCVUdfSVNQMTAyMF9JTlRSCisjZGVmaW5lIEVOVEVSX0lOVFIoeCkJcHJpbnRrKCJpc3AxMDIwIDogZW50ZXJpbmcgJXMoKVxuIiwgeCk7CisjZGVmaW5lIExFQVZFX0lOVFIoeCkJcHJpbnRrKCJpc3AxMDIwIDogbGVhdmluZyAlcygpXG4iLCB4KTsKKyNkZWZpbmUgREVCVUdfSU5UUih4KQl4CisjZWxzZQorI2RlZmluZSBFTlRFUl9JTlRSKHgpCisjZGVmaW5lIExFQVZFX0lOVFIoeCkKKyNkZWZpbmUgREVCVUdfSU5UUih4KQorI2VuZGlmIC8qIERFQlVHIElTUDEwMjBfSU5UUiAqLworCisjZGVmaW5lIElTUDEwMjBfUkVWX0lECTEKKworI2RlZmluZSBNQVhfVEFSR0VUUwkxNgorI2RlZmluZSBNQVhfTFVOUwk4CisKKy8qIGhvc3QgY29uZmlndXJhdGlvbiBhbmQgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSE9TVF9IQ0NSCTB4YzAJLyogaG9zdCBjb21tYW5kIGFuZCBjb250cm9sICovCisKKy8qIHBjaSBidXMgaW50ZXJmYWNlIHJlZ2lzdGVycyAqLworI2RlZmluZSBQQ0lfSURfTE9XCTB4MDAJLyogdmVuZG9yIGlkICovCisjZGVmaW5lIFBDSV9JRF9ISUdICTB4MDIJLyogZGV2aWNlIGlkICovCisjZGVmaW5lIElTUF9DRkcwCTB4MDQJLyogY29uZmlndXJhdGlvbiByZWdpc3RlciAjMCAqLworI2RlZmluZSAgSVNQX0NGRzBfSFdNU0sgIDB4MDAwZgkvKiBIYXJkd2FyZSByZXZpc2lvbiBtYXNrICovCisjZGVmaW5lICBJU1BfQ0ZHMF8xMDIwCSAweDAwMDEgLyogSVNQMTAyMCAqLworI2RlZmluZSAgSVNQX0NGRzBfMTAyMEEJIDB4MDAwMiAvKiBJU1AxMDIwQSAqLworI2RlZmluZSAgSVNQX0NGRzBfMTA0MAkgMHgwMDAzIC8qIElTUDEwNDAgKi8KKyNkZWZpbmUgIElTUF9DRkcwXzEwNDBBCSAweDAwMDQgLyogSVNQMTA0MEEgKi8KKyNkZWZpbmUgIElTUF9DRkcwXzEwNDBCCSAweDAwMDUgLyogSVNQMTA0MEIgKi8KKyNkZWZpbmUgIElTUF9DRkcwXzEwNDBDCSAweDAwMDYgLyogSVNQMTA0MEMgKi8KKyNkZWZpbmUgSVNQX0NGRzEJMHgwNgkvKiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICMxICovCisjZGVmaW5lICBJU1BfQ0ZHMV9GMTI4CSAweDAwNDAJLyogMTI4LWJ5dGUgRklGTyB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgIElTUF9DRkcxX0Y2NAkgMHgwMDMwCS8qIDEyOC1ieXRlIEZJRk8gdGhyZXNob2xkICovCisjZGVmaW5lICBJU1BfQ0ZHMV9GMzIJIDB4MDAyMAkvKiAxMjgtYnl0ZSBGSUZPIHRocmVzaG9sZCAqLworI2RlZmluZSAgSVNQX0NGRzFfRjE2CSAweDAwMTAJLyogMTI4LWJ5dGUgRklGTyB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgIElTUF9DRkcxX0JFTkFCCSAweDAwMDQJLyogR2xvYmFsIEJ1cyBidXJzdCBlbmFibGUgKi8KKyNkZWZpbmUgIElTUF9DRkcxX1NYUAkgMHgwMDAxCS8qIFNYUCByZWdpc3RlciBzZWxlY3QgKi8KKyNkZWZpbmUgUENJX0lOVEZfQ1RMCTB4MDgJLyogcGNpIGludGVyZmFjZSBjb250cm9sICovCisjZGVmaW5lIFBDSV9JTlRGX1NUUwkweDBhCS8qIHBjaSBpbnRlcmZhY2Ugc3RhdHVzICovCisjZGVmaW5lIFBDSV9TRU1BUEhPUkUJMHgwYwkvKiBwY2kgc2VtYXBob3JlICovCisjZGVmaW5lIFBDSV9OVlJBTQkweDBlCS8qIHBjaSBudnJhbSBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgQ0RNQV9DT05GCTB4MjAJLyogQ29tbWFuZCBETUEgQ29uZmlnICovCisjZGVmaW5lIERETUFfQ09ORgkweDQwCS8qIERhdGEgRE1BIENvbmZpZyAqLworI2RlZmluZSAgRE1BX0NPTkZfU0VOQUIJIDB4MDAwOAkvKiBTWFAgdG8gRE1BIERhdGEgZW5hYmxlICovCisjZGVmaW5lICBETUFfQ09ORl9SSVJRCSAweDAwMDQJLyogUklTQyBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lICBETUFfQ09ORl9CRU5BQgkgMHgwMDAyCS8qIEJ1cyBidXJzdCBlbmFibGUgKi8KKyNkZWZpbmUgIERNQV9DT05GX0RJUgkgMHgwMDAxCS8qIERNQSBkaXJlY3Rpb24gKDA9Zmlmby0+aG9zdCAxPWhvc3QtPmZpZm8pICovCisKKy8qIG1haWxib3ggcmVnaXN0ZXJzICovCisjZGVmaW5lIE1CT1gwCQkweDcwCS8qIG1haWxib3ggMCAqLworI2RlZmluZSBNQk9YMQkJMHg3MgkvKiBtYWlsYm94IDEgKi8KKyNkZWZpbmUgTUJPWDIJCTB4NzQJLyogbWFpbGJveCAyICovCisjZGVmaW5lIE1CT1gzCQkweDc2CS8qIG1haWxib3ggMyAqLworI2RlZmluZSBNQk9YNAkJMHg3OAkvKiBtYWlsYm94IDQgKi8KKyNkZWZpbmUgTUJPWDUJCTB4N2EJLyogbWFpbGJveCA1ICovCisjZGVmaW5lIE1CT1g2ICAgICAgICAgICAweDdjICAgIC8qIG1haWxib3ggNiAqLworI2RlZmluZSBNQk9YNyAgICAgICAgICAgMHg3ZSAgICAvKiBtYWlsYm94IDcgKi8KKworLyogbWFpbGJveCBjb21tYW5kIGNvbXBsZXRlIHN0YXR1cyBjb2RlcyAqLworI2RlZmluZSBNQk9YX0NPTU1BTkRfQ09NUExFVEUJCTB4NDAwMAorI2RlZmluZSBJTlZBTElEX0NPTU1BTkQJCQkweDQwMDEKKyNkZWZpbmUgSE9TVF9JTlRFUkZBQ0VfRVJST1IJCTB4NDAwMgorI2RlZmluZSBURVNUX0ZBSUxFRAkJCTB4NDAwMworI2RlZmluZSBDT01NQU5EX0VSUk9SCQkJMHg0MDA1CisjZGVmaW5lIENPTU1BTkRfUEFSQU1fRVJST1IJCTB4NDAwNgorCisvKiBhc3luYyBldmVudCBzdGF0dXMgY29kZXMgKi8KKyNkZWZpbmUgQVNZTkNfU0NTSV9CVVNfUkVTRVQJCTB4ODAwMQorI2RlZmluZSBTWVNURU1fRVJST1IJCQkweDgwMDIKKyNkZWZpbmUgUkVRVUVTVF9UUkFOU0ZFUl9FUlJPUgkJMHg4MDAzCisjZGVmaW5lIFJFU1BPTlNFX1RSQU5TRkVSX0VSUk9SCQkweDgwMDQKKyNkZWZpbmUgUkVRVUVTVF9RVUVVRV9XQUtFVVAJCTB4ODAwNQorI2RlZmluZSBFWEVDVVRJT05fVElNRU9VVF9SRVNFVAkJMHg4MDA2CisKKyNpZmRlZiBDT05GSUdfUUxfSVNQX0E2NAorI2RlZmluZSBJT0NCX1NFR1MgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ09OVElOVUFUSU9OX1NFR1MgICAgICAgICAgICAgICA1CisjZGVmaW5lIE1BWF9DT05USU5VQVRJT05fRU5UUklFUyAgICAgICAgMjU0CisjZWxzZQorI2RlZmluZSBJT0NCX1NFR1MgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQ09OVElOVUFUSU9OX1NFR1MgICAgICAgICAgICAgICA3CisjZW5kaWYgLyogQ09ORklHX1FMX0lTUF9BNjQgKi8KKworc3RydWN0IEVudHJ5X2hlYWRlciB7CisJdV9jaGFyCWVudHJ5X3R5cGU7CisJdV9jaGFyCWVudHJ5X2NudDsKKwl1X2NoYXIJc3lzX2RlZl8xOworCXVfY2hhcglmbGFnczsKK307CisKKy8qIGVudHJ5IGhlYWRlciB0eXBlIGNvbW1hbmRzICovCisjaWZkZWYgQ09ORklHX1FMX0lTUF9BNjQKKyNkZWZpbmUgRU5UUllfQ09NTUFORCAgICAgICAgICAgOQorI2RlZmluZSBFTlRSWV9DT05USU5VQVRJT04gICAgICAweGEKKyNlbHNlCisjZGVmaW5lIEVOVFJZX0NPTU1BTkQJCTEKKyNkZWZpbmUgRU5UUllfQ09OVElOVUFUSU9OCTIKKyNlbmRpZiAvKiBDT05GSUdfUUxfSVNQX0E2NCAqLworCisjZGVmaW5lIEVOVFJZX1NUQVRVUwkJMworI2RlZmluZSBFTlRSWV9NQVJLRVIJCTQKKyNkZWZpbmUgRU5UUllfRVhURU5ERURfQ09NTUFORAk1CisKKy8qIGVudHJ5IGhlYWRlciBmbGFnIGRlZmluaXRpb25zICovCisjZGVmaW5lIEVGTEFHX0NPTlRJTlVBVElPTgkxCisjZGVmaW5lIEVGTEFHX0JVU1kJCTIKKyNkZWZpbmUgRUZMQUdfQkFEX0hFQURFUgk0CisjZGVmaW5lIEVGTEFHX0JBRF9QQVlMT0FECTgKKworc3RydWN0IGRhdGFzZWcgeworCXVfaW50CQkJZF9iYXNlOworI2lmZGVmIENPTkZJR19RTF9JU1BfQTY0CisJdV9pbnQgICAgICAgICAgICAgICAgICAgZF9iYXNlX2hpOworI2VuZGlmCisJdV9pbnQJCQlkX2NvdW50OworfTsKKworc3RydWN0IENvbW1hbmRfRW50cnkgeworCXN0cnVjdCBFbnRyeV9oZWFkZXIJaGRyOworCXVfaW50CQkJaGFuZGxlOworCXVfY2hhcgkJCXRhcmdldF9sdW47CisJdV9jaGFyCQkJdGFyZ2V0X2lkOworCXVfc2hvcnQJCQljZGJfbGVuZ3RoOworCXVfc2hvcnQJCQljb250cm9sX2ZsYWdzOworCXVfc2hvcnQJCQlyc3ZkOworCXVfc2hvcnQJCQl0aW1lX291dDsKKwl1X3Nob3J0CQkJc2VnbWVudF9jbnQ7CisJdV9jaGFyCQkJY2RiWzEyXTsKKyNpZmRlZiBDT05GSUdfUUxfSVNQX0E2NAorCXVfaW50ICAgICAgICAgICAgICAgICAgIHJzdmQxOworCXVfaW50ICAgICAgICAgICAgICAgICAgIHJzdmQyOworI2VuZGlmCisJc3RydWN0IGRhdGFzZWcJCWRhdGFzZWdbSU9DQl9TRUdTXTsKK307CisKKy8qIGNvbW1hbmQgZW50cnkgY29udHJvbCBmbGFnIGRlZmluaXRpb25zICovCisjZGVmaW5lIENGTEFHX05PRElTQwkJMHgwMQorI2RlZmluZSBDRkxBR19IRUFEX1RBRwkJMHgwMgorI2RlZmluZSBDRkxBR19PUkRFUkVEX1RBRwkweDA0CisjZGVmaW5lIENGTEFHX1NJTVBMRV9UQUcJMHgwOAorI2RlZmluZSBDRkxBR19UQVJfUlROCQkweDEwCisjZGVmaW5lIENGTEFHX1JFQUQJCTB4MjAKKyNkZWZpbmUgQ0ZMQUdfV1JJVEUJCTB4NDAKKworc3RydWN0IEV4dF9Db21tYW5kX0VudHJ5IHsKKwlzdHJ1Y3QgRW50cnlfaGVhZGVyCWhkcjsKKwl1X2ludAkJCWhhbmRsZTsKKwl1X2NoYXIJCQl0YXJnZXRfbHVuOworCXVfY2hhcgkJCXRhcmdldF9pZDsKKwl1X3Nob3J0CQkJY2RiX2xlbmd0aDsKKwl1X3Nob3J0CQkJY29udHJvbF9mbGFnczsKKwl1X3Nob3J0CQkJcnN2ZDsKKwl1X3Nob3J0CQkJdGltZV9vdXQ7CisJdV9zaG9ydAkJCXNlZ21lbnRfY250OworCXVfY2hhcgkJCWNkYls0NF07Cit9OworCitzdHJ1Y3QgQ29udGludWF0aW9uX0VudHJ5IHsKKwlzdHJ1Y3QgRW50cnlfaGVhZGVyCWhkcjsKKyNpZm5kZWYgQ09ORklHX1FMX0lTUF9BNjQKKwl1X2ludAkJCXJlc2VydmVkOworI2VuZGlmCisJc3RydWN0IGRhdGFzZWcJCWRhdGFzZWdbQ09OVElOVUFUSU9OX1NFR1NdOworfTsKKworc3RydWN0IE1hcmtlcl9FbnRyeSB7CisJc3RydWN0IEVudHJ5X2hlYWRlcgloZHI7CisJdV9pbnQJCQlyZXNlcnZlZDsKKwl1X2NoYXIJCQl0YXJnZXRfbHVuOworCXVfY2hhcgkJCXRhcmdldF9pZDsKKwl1X2NoYXIJCQltb2RpZmllcjsKKwl1X2NoYXIJCQlyc3ZkOworCXVfY2hhcgkJCXJzdmRzWzUyXTsKK307CisKKy8qIG1hcmtlciBlbnRyeSBtb2RpZmllciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTWU5DX0RFVklDRQkwCisjZGVmaW5lIFNZTkNfVEFSR0VUCTEKKyNkZWZpbmUgU1lOQ19BTEwJMgorCitzdHJ1Y3QgU3RhdHVzX0VudHJ5IHsKKwlzdHJ1Y3QgRW50cnlfaGVhZGVyCWhkcjsKKwl1X2ludAkJCWhhbmRsZTsKKwl1X3Nob3J0CQkJc2NzaV9zdGF0dXM7CisJdV9zaG9ydAkJCWNvbXBsZXRpb25fc3RhdHVzOworCXVfc2hvcnQJCQlzdGF0ZV9mbGFnczsKKwl1X3Nob3J0CQkJc3RhdHVzX2ZsYWdzOworCXVfc2hvcnQJCQl0aW1lOworCXVfc2hvcnQJCQlyZXFfc2Vuc2VfbGVuOworCXVfaW50CQkJcmVzaWR1YWw7CisJdV9jaGFyCQkJcnN2ZFs4XTsKKwl1X2NoYXIJCQlyZXFfc2Vuc2VfZGF0YVszMl07Cit9OworCisvKiBzdGF0dXMgZW50cnkgY29tcGxldGlvbiBzdGF0dXMgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQ1NfQ09NUExFVEUJCQkweDAwMDAKKyNkZWZpbmUgQ1NfSU5DT01QTEVURQkJCTB4MDAwMQorI2RlZmluZSBDU19ETUFfRVJST1IJCQkweDAwMDIKKyNkZWZpbmUgQ1NfVFJBTlNQT1JUX0VSUk9SCQkweDAwMDMKKyNkZWZpbmUgQ1NfUkVTRVRfT0NDVVJSRUQJCTB4MDAwNAorI2RlZmluZSBDU19BQk9SVEVECQkJMHgwMDA1CisjZGVmaW5lIENTX1RJTUVPVVQJCQkweDAwMDYKKyNkZWZpbmUgQ1NfREFUQV9PVkVSUlVOCQkJMHgwMDA3CisjZGVmaW5lIENTX0NPTU1BTkRfT1ZFUlJVTgkJMHgwMDA4CisjZGVmaW5lIENTX1NUQVRVU19PVkVSUlVOCQkweDAwMDkKKyNkZWZpbmUgQ1NfQkFEX01FU1NBR0UJCQkweDAwMGEKKyNkZWZpbmUgQ1NfTk9fTUVTU0FHRV9PVVQJCTB4MDAwYgorI2RlZmluZSBDU19FWFRfSURfRkFJTEVECQkweDAwMGMKKyNkZWZpbmUgQ1NfSURFX01TR19GQUlMRUQJCTB4MDAwZAorI2RlZmluZSBDU19BQk9SVF9NU0dfRkFJTEVECQkweDAwMGUKKyNkZWZpbmUgQ1NfUkVKRUNUX01TR19GQUlMRUQJCTB4MDAwZgorI2RlZmluZSBDU19OT1BfTVNHX0ZBSUxFRAkJMHgwMDEwCisjZGVmaW5lIENTX1BBUklUWV9FUlJPUl9NU0dfRkFJTEVECTB4MDAxMQorI2RlZmluZSBDU19ERVZJQ0VfUkVTRVRfTVNHX0ZBSUxFRAkweDAwMTIKKyNkZWZpbmUgQ1NfSURfTVNHX0ZBSUxFRAkJMHgwMDEzCisjZGVmaW5lIENTX1VORVhQX0JVU19GUkVFCQkweDAwMTQKKyNkZWZpbmUgQ1NfREFUQV9VTkRFUlJVTgkJMHgwMDE1CisKKy8qIHN0YXR1cyBlbnRyeSBzdGF0ZSBmbGFnIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNGX0dPVF9CVVMJCQkweDAxMDAKKyNkZWZpbmUgU0ZfR09UX1RBUkdFVAkJCTB4MDIwMAorI2RlZmluZSBTRl9TRU5UX0NEQgkJCTB4MDQwMAorI2RlZmluZSBTRl9UUkFOU0ZFUlJFRF9EQVRBCQkweDA4MDAKKyNkZWZpbmUgU0ZfR09UX1NUQVRVUwkJCTB4MTAwMAorI2RlZmluZSBTRl9HT1RfU0VOU0UJCQkweDIwMDAKKworLyogc3RhdHVzIGVudHJ5IHN0YXR1cyBmbGFnIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNURl9ESVNDT05ORUNUCQkJMHgwMDAxCisjZGVmaW5lIFNURl9TWU5DSFJPTk9VUwkJCTB4MDAwMgorI2RlZmluZSBTVEZfUEFSSVRZX0VSUk9SCQkweDAwMDQKKyNkZWZpbmUgU1RGX0JVU19SRVNFVAkJCTB4MDAwOAorI2RlZmluZSBTVEZfREVWSUNFX1JFU0VUCQkweDAwMTAKKyNkZWZpbmUgU1RGX0FCT1JURUQJCQkweDAwMjAKKyNkZWZpbmUgU1RGX1RJTUVPVVQJCQkweDAwNDAKKyNkZWZpbmUgU1RGX05FR09USUFUSU9OCQkJMHgwMDgwCisKKy8qIGludGVyZmFjZSBjb250cm9sIGNvbW1hbmRzICovCisjZGVmaW5lIElTUF9SRVNFVAkJCTB4MDAwMQorI2RlZmluZSBJU1BfRU5fSU5UCQkJMHgwMDAyCisjZGVmaW5lIElTUF9FTl9SSVNDCQkJMHgwMDA0CisKKy8qIGhvc3QgY29udHJvbCBjb21tYW5kcyAqLworI2RlZmluZSBIQ0NSX05PUAkJCTB4MDAwMAorI2RlZmluZSBIQ0NSX1JFU0VUCQkJMHgxMDAwCisjZGVmaW5lIEhDQ1JfUEFVU0UJCQkweDIwMDAKKyNkZWZpbmUgSENDUl9SRUxFQVNFCQkJMHgzMDAwCisjZGVmaW5lIEhDQ1JfU0lOR0xFX1NURVAJCTB4NDAwMAorI2RlZmluZSBIQ0NSX1NFVF9IT1NUX0lOVFIJCTB4NTAwMAorI2RlZmluZSBIQ0NSX0NMRUFSX0hPU1RfSU5UUgkJMHg2MDAwCisjZGVmaW5lIEhDQ1JfQ0xFQVJfUklTQ19JTlRSCQkweDcwMDAKKyNkZWZpbmUgSENDUl9CUF9FTkFCTEUJCQkweDgwMDAKKyNkZWZpbmUgSENDUl9CSU9TX0RJU0FCTEUJCTB4OTAwMAorI2RlZmluZSBIQ0NSX1RFU1RfTU9ERQkJCTB4ZjAwMAorCisjZGVmaW5lIFJJU0NfQlVTWQkJCTB4MDAwNAorCisvKiBtYWlsYm94IGNvbW1hbmRzICovCisjZGVmaW5lIE1CT1hfTk9fT1AJCQkweDAwMDAKKyNkZWZpbmUgTUJPWF9MT0FEX1JBTQkJCTB4MDAwMQorI2RlZmluZSBNQk9YX0VYRUNfRklSTVdBUkUJCTB4MDAwMgorI2RlZmluZSBNQk9YX0RVTVBfUkFNCQkJMHgwMDAzCisjZGVmaW5lIE1CT1hfV1JJVEVfUkFNX1dPUkQJCTB4MDAwNAorI2RlZmluZSBNQk9YX1JFQURfUkFNX1dPUkQJCTB4MDAwNQorI2RlZmluZSBNQk9YX01BSUxCT1hfUkVHX1RFU1QJCTB4MDAwNgorI2RlZmluZSBNQk9YX1ZFUklGWV9DSEVDS1NVTQkJMHgwMDA3CisjZGVmaW5lIE1CT1hfQUJPVVRfRklSTVdBUkUJCTB4MDAwOAorI2RlZmluZSBNQk9YX0NIRUNLX0ZJUk1XQVJFCQkweDAwMGUKKyNkZWZpbmUgTUJPWF9JTklUX1JFUV9RVUVVRQkJMHgwMDEwCisjZGVmaW5lIE1CT1hfSU5JVF9SRVNfUVVFVUUJCTB4MDAxMQorI2RlZmluZSBNQk9YX0VYRUNVVEVfSU9DQgkJMHgwMDEyCisjZGVmaW5lIE1CT1hfV0FLRV9VUAkJCTB4MDAxMworI2RlZmluZSBNQk9YX1NUT1BfRklSTVdBUkUJCTB4MDAxNAorI2RlZmluZSBNQk9YX0FCT1JUCQkJMHgwMDE1CisjZGVmaW5lIE1CT1hfQUJPUlRfREVWSUNFCQkweDAwMTYKKyNkZWZpbmUgTUJPWF9BQk9SVF9UQVJHRVQJCTB4MDAxNworI2RlZmluZSBNQk9YX0JVU19SRVNFVAkJCTB4MDAxOAorI2RlZmluZSBNQk9YX1NUT1BfUVVFVUUJCQkweDAwMTkKKyNkZWZpbmUgTUJPWF9TVEFSVF9RVUVVRQkJMHgwMDFhCisjZGVmaW5lIE1CT1hfU0lOR0xFX1NURVBfUVVFVUUJCTB4MDAxYgorI2RlZmluZSBNQk9YX0FCT1JUX1FVRVVFCQkweDAwMWMKKyNkZWZpbmUgTUJPWF9HRVRfREVWX1FVRVVFX1NUQVRVUwkweDAwMWQKKyNkZWZpbmUgTUJPWF9HRVRfRklSTVdBUkVfU1RBVFVTCTB4MDAxZgorI2RlZmluZSBNQk9YX0dFVF9JTklUX1NDU0lfSUQJCTB4MDAyMAorI2RlZmluZSBNQk9YX0dFVF9TRUxFQ1RfVElNRU9VVAkJMHgwMDIxCisjZGVmaW5lIE1CT1hfR0VUX1JFVFJZX0NPVU5UCQkweDAwMjIKKyNkZWZpbmUgTUJPWF9HRVRfVEFHX0FHRV9MSU1JVAkJMHgwMDIzCisjZGVmaW5lIE1CT1hfR0VUX0NMT0NLX1JBVEUJCTB4MDAyNAorI2RlZmluZSBNQk9YX0dFVF9BQ1RfTkVHX1NUQVRFCQkweDAwMjUKKyNkZWZpbmUgTUJPWF9HRVRfQVNZTkNfREFUQV9TRVRVUF9USU1FCTB4MDAyNgorI2RlZmluZSBNQk9YX0dFVF9QQ0lfUEFSQU1TCQkweDAwMjcKKyNkZWZpbmUgTUJPWF9HRVRfVEFSR0VUX1BBUkFNUwkJMHgwMDI4CisjZGVmaW5lIE1CT1hfR0VUX0RFVl9RVUVVRV9QQVJBTVMJMHgwMDI5CisjZGVmaW5lIE1CT1hfU0VUX0lOSVRfU0NTSV9JRAkJMHgwMDMwCisjZGVmaW5lIE1CT1hfU0VUX1NFTEVDVF9USU1FT1VUCQkweDAwMzEKKyNkZWZpbmUgTUJPWF9TRVRfUkVUUllfQ09VTlQJCTB4MDAzMgorI2RlZmluZSBNQk9YX1NFVF9UQUdfQUdFX0xJTUlUCQkweDAwMzMKKyNkZWZpbmUgTUJPWF9TRVRfQ0xPQ0tfUkFURQkJMHgwMDM0CisjZGVmaW5lIE1CT1hfU0VUX0FDVElWRV9ORUdfU1RBVEUJMHgwMDM1CisjZGVmaW5lIE1CT1hfU0VUX0FTWU5DX0RBVEFfU0VUVVBfVElNRQkweDAwMzYKKyNkZWZpbmUgTUJPWF9TRVRfUENJX0NPTlRST0xfUEFSQU1TCTB4MDAzNworI2RlZmluZSBNQk9YX1NFVF9UQVJHRVRfUEFSQU1TCQkweDAwMzgKKyNkZWZpbmUgTUJPWF9TRVRfREVWX1FVRVVFX1BBUkFNUwkweDAwMzkKKyNkZWZpbmUgTUJPWF9SRVRVUk5fQklPU19CTE9DS19BRERSCTB4MDA0MAorI2RlZmluZSBNQk9YX1dSSVRFX0ZPVVJfUkFNX1dPUkRTCTB4MDA0MQorI2RlZmluZSBNQk9YX0VYRUNfQklPU19JT0NCCQkweDAwNDIKKworI2lmZGVmIENPTkZJR19RTF9JU1BfQTY0CisjZGVmaW5lIE1CT1hfQ01EX0lOSVRfUkVRVUVTVF9RVUVVRV82NCAgICAgIDB4MDA1MgorI2RlZmluZSBNQk9YX0NNRF9JTklUX1JFU1BPTlNFX1FVRVVFXzY0ICAgICAweDAwNTMKKyNlbmRpZiAvKiBDT05GSUdfUUxfSVNQX0E2NCAqLworCisjaW5jbHVkZSAicWxvZ2ljaXNwX2FzbS5jIgorCisjZGVmaW5lIFBBQ0tCKGEsIGIpCQkJKCgoYSk8PDQpfChiKSkKKworc3RhdGljIGNvbnN0IHVfY2hhciBtYm94X3BhcmFtW10gPSB7CisJUEFDS0IoMSwgMSksCS8qIE1CT1hfTk9fT1AgKi8KKwlQQUNLQig1LCA1KSwJLyogTUJPWF9MT0FEX1JBTSAqLworCVBBQ0tCKDIsIDApLAkvKiBNQk9YX0VYRUNfRklSTVdBUkUgKi8KKwlQQUNLQig1LCA1KSwJLyogTUJPWF9EVU1QX1JBTSAqLworCVBBQ0tCKDMsIDMpLAkvKiBNQk9YX1dSSVRFX1JBTV9XT1JEICovCisJUEFDS0IoMiwgMyksCS8qIE1CT1hfUkVBRF9SQU1fV09SRCAqLworCVBBQ0tCKDYsIDYpLAkvKiBNQk9YX01BSUxCT1hfUkVHX1RFU1QgKi8KKwlQQUNLQigyLCAzKSwJLyogTUJPWF9WRVJJRllfQ0hFQ0tTVU0JKi8KKwlQQUNLQigxLCAzKSwJLyogTUJPWF9BQk9VVF9GSVJNV0FSRSAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwMDkgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDBhICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAwYiAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwMGMgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDBkICovCisJUEFDS0IoMSwgMiksCS8qIE1CT1hfQ0hFQ0tfRklSTVdBUkUgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDBmICovCisJUEFDS0IoNSwgNSksCS8qIE1CT1hfSU5JVF9SRVFfUVVFVUUgKi8KKwlQQUNLQig2LCA2KSwJLyogTUJPWF9JTklUX1JFU19RVUVVRSAqLworCVBBQ0tCKDQsIDQpLAkvKiBNQk9YX0VYRUNVVEVfSU9DQiAqLworCVBBQ0tCKDIsIDIpLAkvKiBNQk9YX1dBS0VfVVAJKi8KKwlQQUNLQigxLCA2KSwJLyogTUJPWF9TVE9QX0ZJUk1XQVJFICovCisJUEFDS0IoNCwgNCksCS8qIE1CT1hfQUJPUlQgKi8KKwlQQUNLQigyLCAyKSwJLyogTUJPWF9BQk9SVF9ERVZJQ0UgKi8KKwlQQUNLQigzLCAzKSwJLyogTUJPWF9BQk9SVF9UQVJHRVQgKi8KKwlQQUNLQigyLCAyKSwJLyogTUJPWF9CVVNfUkVTRVQgKi8KKwlQQUNLQigyLCAzKSwJLyogTUJPWF9TVE9QX1FVRVVFICovCisJUEFDS0IoMiwgMyksCS8qIE1CT1hfU1RBUlRfUVVFVUUgKi8KKwlQQUNLQigyLCAzKSwJLyogTUJPWF9TSU5HTEVfU1RFUF9RVUVVRSAqLworCVBBQ0tCKDIsIDMpLAkvKiBNQk9YX0FCT1JUX1FVRVVFICovCisJUEFDS0IoMiwgNCksCS8qIE1CT1hfR0VUX0RFVl9RVUVVRV9TVEFUVVMgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDFlICovCisJUEFDS0IoMSwgMyksCS8qIE1CT1hfR0VUX0ZJUk1XQVJFX1NUQVRVUyAqLworCVBBQ0tCKDEsIDIpLAkvKiBNQk9YX0dFVF9JTklUX1NDU0lfSUQgKi8KKwlQQUNLQigxLCAyKSwJLyogTUJPWF9HRVRfU0VMRUNUX1RJTUVPVVQgKi8KKwlQQUNLQigxLCAzKSwJLyogTUJPWF9HRVRfUkVUUllfQ09VTlQJKi8KKwlQQUNLQigxLCAyKSwJLyogTUJPWF9HRVRfVEFHX0FHRV9MSU1JVCAqLworCVBBQ0tCKDEsIDIpLAkvKiBNQk9YX0dFVF9DTE9DS19SQVRFICovCisJUEFDS0IoMSwgMiksCS8qIE1CT1hfR0VUX0FDVF9ORUdfU1RBVEUgKi8KKwlQQUNLQigxLCAyKSwJLyogTUJPWF9HRVRfQVNZTkNfREFUQV9TRVRVUF9USU1FICovCisJUEFDS0IoMSwgMyksCS8qIE1CT1hfR0VUX1BDSV9QQVJBTVMgKi8KKwlQQUNLQigyLCA0KSwJLyogTUJPWF9HRVRfVEFSR0VUX1BBUkFNUyAqLworCVBBQ0tCKDIsIDQpLAkvKiBNQk9YX0dFVF9ERVZfUVVFVUVfUEFSQU1TICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAyYSAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwMmIgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDJjICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAyZCAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwMmUgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDJmICovCisJUEFDS0IoMiwgMiksCS8qIE1CT1hfU0VUX0lOSVRfU0NTSV9JRCAqLworCVBBQ0tCKDIsIDIpLAkvKiBNQk9YX1NFVF9TRUxFQ1RfVElNRU9VVCAqLworCVBBQ0tCKDMsIDMpLAkvKiBNQk9YX1NFVF9SRVRSWV9DT1VOVAkqLworCVBBQ0tCKDIsIDIpLAkvKiBNQk9YX1NFVF9UQUdfQUdFX0xJTUlUICovCisJUEFDS0IoMiwgMiksCS8qIE1CT1hfU0VUX0NMT0NLX1JBVEUgKi8KKwlQQUNLQigyLCAyKSwJLyogTUJPWF9TRVRfQUNUSVZFX05FR19TVEFURSAqLworCVBBQ0tCKDIsIDIpLAkvKiBNQk9YX1NFVF9BU1lOQ19EQVRBX1NFVFVQX1RJTUUgKi8KKwlQQUNLQigzLCAzKSwJLyogTUJPWF9TRVRfUENJX0NPTlRST0xfUEFSQU1TICovCisJUEFDS0IoNCwgNCksCS8qIE1CT1hfU0VUX1RBUkdFVF9QQVJBTVMgKi8KKwlQQUNLQig0LCA0KSwJLyogTUJPWF9TRVRfREVWX1FVRVVFX1BBUkFNUyAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwM2EgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDNiICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAzYyAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwM2QgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDNlICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAzZiAqLworCVBBQ0tCKDEsIDIpLAkvKiBNQk9YX1JFVFVSTl9CSU9TX0JMT0NLX0FERFIgKi8KKwlQQUNLQig2LCAxKSwJLyogTUJPWF9XUklURV9GT1VSX1JBTV9XT1JEUyAqLworCVBBQ0tCKDIsIDMpCS8qIE1CT1hfRVhFQ19CSU9TX0lPQ0IgKi8KKyNpZmRlZiBDT05GSUdfUUxfSVNQX0E2NAorCSxQQUNLQigwLCAwKSwJLyogMHgwMDQzICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDA0NCAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwNDUgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDQ2ICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDA0NyAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwNDggKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDQ5ICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDA0YSAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwNGIgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDRjICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDA0ZCAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwNGUgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDRmICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDA1MCAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwNTEgKi8KKwlQQUNLQig4LCA4KSwJLyogTUJPWF9DTURfSU5JVF9SRVFVRVNUX1FVRVVFXzY0ICgweDAwNTIpICovCisJUEFDS0IoOCwgOCkJLyogTUJPWF9DTURfSU5JVF9SRVNQT05TRV9RVUVVRV82NCAoMHgwMDUzKSAqLworI2VuZGlmIC8qIENPTkZJR19RTF9JU1BfQTY0ICovCit9OworCisjZGVmaW5lIE1BWF9NQk9YX0NPTU1BTkQJKHNpemVvZihtYm94X3BhcmFtKS9zaXplb2YodV9zaG9ydCkpCisKK3N0cnVjdCBob3N0X3BhcmFtIHsKKwl1X3Nob3J0CQlmaWZvX3RocmVzaG9sZDsKKwl1X3Nob3J0CQlob3N0X2FkYXB0ZXJfZW5hYmxlOworCXVfc2hvcnQJCWluaXRpYXRvcl9zY3NpX2lkOworCXVfc2hvcnQJCWJ1c19yZXNldF9kZWxheTsKKwl1X3Nob3J0CQlyZXRyeV9jb3VudDsKKwl1X3Nob3J0CQlyZXRyeV9kZWxheTsKKwl1X3Nob3J0CQlhc3luY19kYXRhX3NldHVwX3RpbWU7CisJdV9zaG9ydAkJcmVxX2Fja19hY3RpdmVfbmVnYXRpb247CisJdV9zaG9ydAkJZGF0YV9saW5lX2FjdGl2ZV9uZWdhdGlvbjsKKwl1X3Nob3J0CQlkYXRhX2RtYV9idXJzdF9lbmFibGU7CisJdV9zaG9ydAkJY29tbWFuZF9kbWFfYnVyc3RfZW5hYmxlOworCXVfc2hvcnQJCXRhZ19hZ2luZzsKKwl1X3Nob3J0CQlzZWxlY3Rpb25fdGltZW91dDsKKwl1X3Nob3J0CQltYXhfcXVldWVfZGVwdGg7Cit9OworCisvKgorICogRGV2aWNlIEZsYWdzOgorICoKKyAqIEJpdCAgTmFtZQorICogLS0tLS0tLS0tCisgKiAgNyAgIERpc2Nvbm5lY3QgUHJpdmlsZWdlCisgKiAgNiAgIFBhcml0eSBDaGVja2luZworICogIDUgICBXaWRlIERhdGEgVHJhbnNmZXJzCisgKiAgNCAgIFN5bmNocm9ub3VzIERhdGEgVHJhbnNmZXJzCisgKiAgMyAgIFRhZ2dlZCBRdWV1aW5nCisgKiAgMiAgIEF1dG9tYXRpYyBSZXF1ZXN0IFNlbnNlCisgKiAgMSAgIFN0b3AgUXVldWUgb24gQ2hlY2sgQ29uZGl0aW9uCisgKiAgMCAgIFJlbmVnb3RpYXRlIG9uIEVycm9yCisgKi8KKworc3RydWN0IGRldl9wYXJhbSB7CisJdV9zaG9ydAkJZGV2aWNlX2ZsYWdzOworCXVfc2hvcnQJCWV4ZWN1dGlvbl90aHJvdHRsZTsKKwl1X3Nob3J0CQlzeW5jaHJvbm91c19wZXJpb2Q7CisJdV9zaG9ydAkJc3luY2hyb25vdXNfb2Zmc2V0OworCXVfc2hvcnQJCWRldmljZV9lbmFibGU7CisJdV9zaG9ydAkJcmVzZXJ2ZWQ7IC8qIHBhZCAqLworfTsKKworLyoKKyAqIFRoZSByZXN1bHQgcXVldWUgY2FuIGJlIHF1aXRlIGEgYml0IHNtYWxsZXIgc2luY2UgY29udGludWF0aW9uIGVudHJpZXMKKyAqIGRvIG5vdCBzaG93IHVwIHRoZXJlOgorICovCisjZGVmaW5lIFJFU19RVUVVRV9MRU4JCSgoUUxPR0lDSVNQX1JFUV9RVUVVRV9MRU4gKyAxKSAvIDggLSAxKQorI2RlZmluZSBRVUVVRV9FTlRSWV9MRU4JCTY0CisjZGVmaW5lIFFTSVpFKGVudHJpZXMpICAoKChlbnRyaWVzKSArIDEpICogUVVFVUVfRU5UUllfTEVOKQorCitzdHJ1Y3QgaXNwX3F1ZXVlX2VudHJ5IHsKKwljaGFyIF9fb3BhcXVlW1FVRVVFX0VOVFJZX0xFTl07Cit9OworCitzdHJ1Y3QgaXNwMTAyMF9ob3N0ZGF0YSB7CisJdm9pZCBfX2lvbWVtICptZW1hZGRyOworCXVfY2hhcglyZXZpc2lvbjsKKwlzdHJ1Y3QJaG9zdF9wYXJhbSBob3N0X3BhcmFtOworCXN0cnVjdAlkZXZfcGFyYW0gZGV2X3BhcmFtW01BWF9UQVJHRVRTXTsKKwlzdHJ1Y3QJcGNpX2RldiAqcGNpX2RldjsKKwkKKwlzdHJ1Y3QgaXNwX3F1ZXVlX2VudHJ5ICpyZXNfY3B1OyAvKiBDUFUtc2lkZSBhZGRyZXNzIG9mIHJlc3BvbnNlIHF1ZXVlLiAqLworCXN0cnVjdCBpc3BfcXVldWVfZW50cnkgKnJlcV9jcHU7IC8qIENQVS1zaXplIGFkZHJlc3Mgb2YgcmVxdWVzdCBxdWV1ZS4gKi8KKworCS8qIHJlc3VsdCBhbmQgcmVxdWVzdCBxdWV1ZXMgKHNoYXJlZCB3aXRoIGlzcDEwMjApOiAqLworCXVfaW50CXJlcV9pbl9wdHI7CQkvKiBpbmRleCBvZiBuZXh0IHJlcXVlc3Qgc2xvdCAqLworCXVfaW50CXJlc19vdXRfcHRyOwkJLyogaW5kZXggb2YgbmV4dCByZXN1bHQgc2xvdCAqLworCisJLyogdGhpcyBpcyBoZXJlIHNvIHRoZSBxdWV1ZXMgYXJlIG5pY2VseSBhbGlnbmVkICovCisJbG9uZwlzZW5kX21hcmtlcjsJCS8qIGRvIHdlIG5lZWQgdG8gc2VuZCBhIG1hcmtlcj8gKi8KKworCS8qIFRoZSBjbWQtPmhhbmRsZSBoYXMgYSBmaXhlZCBzaXplLCBhbmQgaXMgb25seSAzMi1iaXRzLiAgV2UKKwkgKiBuZWVkIHRvIHRha2UgY2FyZSB0byBoYW5kbGUgNjQtYml0IHN5c3RlbXMgY29ycmVjdGx5IHRodXMgd2hhdAorCSAqIHdlIGFjdHVhbGx5IHBsYWNlIGluIGNtZC0+aGFuZGxlIGlzIGFuIGluZGV4IHRvIHRoZSBmb2xsb3dpbmcKKwkgKiB0YWJsZS4gIEt1ZG9zIHRvIE1hdHQgSmFjb2IgZm9yIHRoZSB0ZWNobmlxdWUuICAtRGF2ZU0KKwkgKi8KKwlTY3NpX0NtbmQgKmNtZF9zbG90c1tRTE9HSUNJU1BfUkVRX1FVRVVFX0xFTiArIDFdOworCisJZG1hX2FkZHJfdCByZXNfZG1hOwkvKiBQQ0kgc2lkZSB2aWV3IG9mIHJlc3BvbnNlIHF1ZXVlICovCisJZG1hX2FkZHJfdCByZXFfZG1hOwkvKiBQQ0kgc2lkZSB2aWV3IG9mIHJlcXVlc3QgcXVldWUgKi8KK307CisKKy8qIHF1ZXVlIGxlbmd0aCdzIF9tdXN0XyBiZSBwb3dlciBvZiB0d286ICovCisjZGVmaW5lIFFVRVVFX0RFUFRIKGluLCBvdXQsIHFsKQkoKGluIC0gb3V0KSAmIChxbCkpCisjZGVmaW5lIFJFUV9RVUVVRV9ERVBUSChpbiwgb3V0KQlRVUVVRV9ERVBUSChpbiwgb3V0LCAJCSAgICAgXAorCQkJCQkJICAgIFFMT0dJQ0lTUF9SRVFfUVVFVUVfTEVOKQorI2RlZmluZSBSRVNfUVVFVUVfREVQVEgoaW4sIG91dCkJUVVFVUVfREVQVEgoaW4sIG91dCwgUkVTX1FVRVVFX0xFTikKKworc3RhdGljIHZvaWQJaXNwMTAyMF9lbmFibGVfaXJxcyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIHZvaWQJaXNwMTAyMF9kaXNhYmxlX2lycXMoc3RydWN0IFNjc2lfSG9zdCAqKTsKK3N0YXRpYyBpbnQJaXNwMTAyMF9pbml0KHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgaW50CWlzcDEwMjBfcmVzZXRfaGFyZHdhcmUoc3RydWN0IFNjc2lfSG9zdCAqKTsKK3N0YXRpYyBpbnQJaXNwMTAyMF9zZXRfZGVmYXVsdHMoc3RydWN0IFNjc2lfSG9zdCAqKTsKK3N0YXRpYyBpbnQJaXNwMTAyMF9sb2FkX3BhcmFtZXRlcnMoc3RydWN0IFNjc2lfSG9zdCAqKTsKK3N0YXRpYyBpbnQJaXNwMTAyMF9tYm94X2NvbW1hbmQoc3RydWN0IFNjc2lfSG9zdCAqLCB1X3Nob3J0IFtdKTsgCitzdGF0aWMgaW50CWlzcDEwMjBfcmV0dXJuX3N0YXR1cyhzdHJ1Y3QgU3RhdHVzX0VudHJ5ICopOworc3RhdGljIHZvaWQJaXNwMTAyMF9pbnRyX2hhbmRsZXIoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIGlycXJldHVybl90IGRvX2lzcDEwMjBfaW50cl9oYW5kbGVyKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKKworI2lmIFVTRV9OVlJBTV9ERUZBVUxUUworc3RhdGljIGludAlpc3AxMDIwX2dldF9kZWZhdWx0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIGludAlpc3AxMDIwX3ZlcmlmeV9udnJhbShzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIHVfc2hvcnQJaXNwMTAyMF9yZWFkX252cmFtX3dvcmQoc3RydWN0IFNjc2lfSG9zdCAqLCB1X3Nob3J0KTsKKyNlbmRpZgorCisjaWYgREVCVUdfSVNQMTAyMAorc3RhdGljIHZvaWQJaXNwMTAyMF9wcmludF9zY3NpX2NtZChTY3NpX0NtbmQgKik7CisjZW5kaWYKKyNpZiBERUJVR19JU1AxMDIwX0lOVFIKK3N0YXRpYyB2b2lkCWlzcDEwMjBfcHJpbnRfc3RhdHVzX2VudHJ5KHN0cnVjdCBTdGF0dXNfRW50cnkgKik7CisjZW5kaWYKKworLyogbWVtYWRkciBzaG91bGQgYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgbWVtbWFwcGVkIHBvcnQgaS9vIGlzIGJlaW5nIHVzZWQKKyAqIG5vbi1udWxsIG1lbWFkZHIgPT0gbW1hcCdkCisgKiBKViA3LUphbi0yMDAwCisgKi8KK3N0YXRpYyBpbmxpbmUgdV9zaG9ydCBpc3BfaW53KHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGxvbmcgb2Zmc2V0KQoreworCXN0cnVjdCBpc3AxMDIwX2hvc3RkYXRhICpoID0gKHN0cnVjdCBpc3AxMDIwX2hvc3RkYXRhICopaG9zdC0+aG9zdGRhdGE7CisJaWYgKGgtPm1lbWFkZHIpCisJCXJldHVybiByZWFkdyhoLT5tZW1hZGRyICsgb2Zmc2V0KTsKKwllbHNlCisJCXJldHVybiBpbncoaG9zdC0+aW9fcG9ydCArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc3Bfb3V0dyh1X3Nob3J0IHZhbCwgc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgbG9uZyBvZmZzZXQpCit7CisJc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEgKmggPSAoc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEgKilob3N0LT5ob3N0ZGF0YTsKKwlpZiAoaC0+bWVtYWRkcikKKwkJd3JpdGV3KHZhbCwgaC0+bWVtYWRkciArIG9mZnNldCk7CisJZWxzZQorCQlvdXR3KHZhbCwgaG9zdC0+aW9fcG9ydCArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc3AxMDIwX2VuYWJsZV9pcnFzKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJaXNwX291dHcoSVNQX0VOX0lOVHxJU1BfRU5fUklTQywgaG9zdCwgUENJX0lOVEZfQ1RMKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgaXNwMTAyMF9kaXNhYmxlX2lycXMoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlpc3Bfb3V0dygweDAsIGhvc3QsIFBDSV9JTlRGX0NUTCk7Cit9CisKKworc3RhdGljIGludCBpc3AxMDIwX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnRtcHQpCit7CisJaW50IGhvc3RzID0gMDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXN0cnVjdCBpc3AxMDIwX2hvc3RkYXRhICpob3N0ZGF0YTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisKKwlFTlRFUigiaXNwMTAyMF9kZXRlY3QiKTsKKworCXRtcHQtPnByb2NfbmFtZSA9ICJpc3AxMDIwIjsKKworCXdoaWxlICgocGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX1FMT0dJQywgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTAyMCwgcGRldikpKQorCXsKKwkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQkJY29udGludWU7CisKKwkJaG9zdCA9IHNjc2lfcmVnaXN0ZXIodG1wdCwgc2l6ZW9mKHN0cnVjdCBpc3AxMDIwX2hvc3RkYXRhKSk7CisJCWlmICghaG9zdCkKKwkJCWNvbnRpbnVlOworCisJCWhvc3RkYXRhID0gKHN0cnVjdCBpc3AxMDIwX2hvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhOworCisJCW1lbXNldChob3N0ZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBpc3AxMDIwX2hvc3RkYXRhKSk7CisKKwkJaG9zdGRhdGEtPnBjaV9kZXYgPSBwZGV2OworCQlzY3NpX3NldF9kZXZpY2UoaG9zdCwgJnBkZXYtPmRldik7CisKKwkJaWYgKGlzcDEwMjBfaW5pdChob3N0KSkKKwkJCWdvdG8gZmFpbF9hbmRfdW5yZWdpc3RlcjsKKworCQlpZiAoaXNwMTAyMF9yZXNldF9oYXJkd2FyZShob3N0KQorI2lmIFVTRV9OVlJBTV9ERUZBVUxUUworCQkgICAgfHwgaXNwMTAyMF9nZXRfZGVmYXVsdHMoaG9zdCkKKyNlbHNlCisJCSAgICB8fCBpc3AxMDIwX3NldF9kZWZhdWx0cyhob3N0KQorI2VuZGlmIC8qIFVTRV9OVlJBTV9ERUZBVUxUUyAqLworCQkgICAgfHwgaXNwMTAyMF9sb2FkX3BhcmFtZXRlcnMoaG9zdCkpIHsKKwkJCWdvdG8gZmFpbF91bmluaXQ7CisJCX0KKworCQlob3N0LT50aGlzX2lkID0gaG9zdGRhdGEtPmhvc3RfcGFyYW0uaW5pdGlhdG9yX3Njc2lfaWQ7CisJCWhvc3QtPm1heF9zZWN0b3JzID0gNjQ7CisKKwkJaWYgKHJlcXVlc3RfaXJxKGhvc3QtPmlycSwgZG9faXNwMTAyMF9pbnRyX2hhbmRsZXIsIFNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLAorCQkJCSJxbG9naWNpc3AiLCBob3N0KSkKKwkJeworCQkJcHJpbnRrKCJxbG9naWNpc3AgOiBpbnRlcnJ1cHQgJWQgYWxyZWFkeSBpbiB1c2VcbiIsCisJCQkgICAgICAgaG9zdC0+aXJxKTsKKwkJCWdvdG8gZmFpbF91bmluaXQ7CisJCX0KKworCQlpc3Bfb3V0dygweDAsIGhvc3QsIFBDSV9TRU1BUEhPUkUpOworCQlpc3Bfb3V0dyhIQ0NSX0NMRUFSX1JJU0NfSU5UUiwgaG9zdCwgSE9TVF9IQ0NSKTsKKwkJaXNwMTAyMF9lbmFibGVfaXJxcyhob3N0KTsKKworCQlob3N0cysrOworCQljb250aW51ZTsKKworCWZhaWxfdW5pbml0OgorCQlpb3VubWFwKGhvc3RkYXRhLT5tZW1hZGRyKTsKKwkJcmVsZWFzZV9yZWdpb24oaG9zdC0+aW9fcG9ydCwgMHhmZik7CisJZmFpbF9hbmRfdW5yZWdpc3RlcjoKKwkJaWYgKGhvc3RkYXRhLT5yZXNfY3B1KQorCQkJcGNpX2ZyZWVfY29uc2lzdGVudChob3N0ZGF0YS0+cGNpX2RldiwKKwkJCQkJICAgIFFTSVpFKFJFU19RVUVVRV9MRU4pLAorCQkJCQkgICAgaG9zdGRhdGEtPnJlc19jcHUsCisJCQkJCSAgICBob3N0ZGF0YS0+cmVzX2RtYSk7CisJCWlmIChob3N0ZGF0YS0+cmVxX2NwdSkKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaG9zdGRhdGEtPnBjaV9kZXYsCisJCQkJCSAgICBRU0laRShRTE9HSUNJU1BfUkVRX1FVRVVFX0xFTiksCisJCQkJCSAgICBob3N0ZGF0YS0+cmVxX2NwdSwKKwkJCQkJICAgIGhvc3RkYXRhLT5yZXFfZG1hKTsKKwkJc2NzaV91bnJlZ2lzdGVyKGhvc3QpOworCX0KKworCUxFQVZFKCJpc3AxMDIwX2RldGVjdCIpOworCisJcmV0dXJuIGhvc3RzOworfQorCisKK3N0YXRpYyBpbnQgaXNwMTAyMF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEgKmhvc3RkYXRhOworCisJRU5URVIoImlzcDEwMjBfcmVsZWFzZSIpOworCisJaG9zdGRhdGEgPSAoc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGE7CisKKwlpc3Bfb3V0dygweDAsIGhvc3QsIFBDSV9JTlRGX0NUTCk7CisJZnJlZV9pcnEoaG9zdC0+aXJxLCBob3N0KTsKKworCWlvdW5tYXAoaG9zdGRhdGEtPm1lbWFkZHIpOworCisJcmVsZWFzZV9yZWdpb24oaG9zdC0+aW9fcG9ydCwgMHhmZik7CisKKwlMRUFWRSgiaXNwMTAyMF9yZWxlYXNlIik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqaXNwMTAyMF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RhdGljIGNoYXIgYnVmWzgwXTsKKwlzdHJ1Y3QgaXNwMTAyMF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisKKwlFTlRFUigiaXNwMTAyMF9pbmZvIik7CisKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgaXNwMTAyMF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YTsKKwlzcHJpbnRmKGJ1ZiwKKwkJIlFMb2dpYyBJU1AxMDIwIFNDU0kgb24gUENJIGJ1cyAlMDJ4IGRldmljZSAlMDJ4IGlycSAlZCAlcyBiYXNlIDB4JWx4IiwKKwkJaG9zdGRhdGEtPnBjaV9kZXYtPmJ1cy0+bnVtYmVyLCBob3N0ZGF0YS0+cGNpX2Rldi0+ZGV2Zm4sIGhvc3QtPmlycSwKKwkJKGhvc3RkYXRhLT5tZW1hZGRyID8gIk1FTSIgOiAiSS9PIiksCisJCShob3N0ZGF0YS0+bWVtYWRkciA/ICh1bnNpZ25lZCBsb25nKWhvc3RkYXRhLT5tZW1hZGRyIDogaG9zdC0+aW9fcG9ydCkpOworCisJTEVBVkUoImlzcDEwMjBfaW5mbyIpOworCisJcmV0dXJuIGJ1ZjsKK30KKworCisvKgorICogVGhlIG1pZGRsZSBTQ1NJIGxheWVyIGVuc3VyZXMgdGhhdCBxdWV1ZWNvbW1hbmQgbmV2ZXIgZ2V0cyBpbnZva2VkCisgKiBjb25jdXJyZW50bHkgd2l0aCBpdHNlbGYgb3IgdGhlIGludGVycnVwdCBoYW5kbGVyICh0aG91Z2ggdGhlCisgKiBpbnRlcnJ1cHQgaGFuZGxlciBtYXkgY2FsbCB0aGlzIHJvdXRpbmUgYXMgcGFydCBvZgorICogcmVxdWVzdC1jb21wbGV0aW9uIGhhbmRsaW5nKS4KKyAqLworc3RhdGljIGludCBpc3AxMDIwX3F1ZXVlY29tbWFuZChTY3NpX0NtbmQgKkNtbmQsIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpCit7CisJaW50IGksIG4sIG51bV9mcmVlOworCXVfaW50IGluX3B0ciwgb3V0X3B0cjsKKwlzdHJ1Y3QgZGF0YXNlZyAqIGRzOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJc3RydWN0IENvbW1hbmRfRW50cnkgKmNtZDsKKwlzdHJ1Y3QgQ29udGludWF0aW9uX0VudHJ5ICpjb250OworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEgKmhvc3RkYXRhOworCWRtYV9hZGRyX3QJZG1hX2FkZHI7CisKKwlFTlRFUigiaXNwMTAyMF9xdWV1ZWNvbW1hbmQiKTsKKworCWhvc3QgPSBDbW5kLT5kZXZpY2UtPmhvc3Q7CisJaG9zdGRhdGEgPSAoc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGE7CisJQ21uZC0+c2NzaV9kb25lID0gZG9uZTsKKworCURFQlVHKGlzcDEwMjBfcHJpbnRfc2NzaV9jbWQoQ21uZCkpOworCisJb3V0X3B0ciA9IGlzcF9pbncoaG9zdCwgKyBNQk9YNCk7CisJaW5fcHRyICA9IGhvc3RkYXRhLT5yZXFfaW5fcHRyOworCisJREVCVUcocHJpbnRrKCJxbG9naWNpc3AgOiByZXF1ZXN0IHF1ZXVlIGRlcHRoICVkXG4iLAorCQkgICAgIFJFUV9RVUVVRV9ERVBUSChpbl9wdHIsIG91dF9wdHIpKSk7CisKKwljbWQgPSAoc3RydWN0IENvbW1hbmRfRW50cnkgKikgJmhvc3RkYXRhLT5yZXFfY3B1W2luX3B0cl07CisJaW5fcHRyID0gKGluX3B0ciArIDEpICYgUUxPR0lDSVNQX1JFUV9RVUVVRV9MRU47CisJaWYgKGluX3B0ciA9PSBvdXRfcHRyKSB7CisJCXByaW50aygicWxvZ2ljaXNwIDogcmVxdWVzdCBxdWV1ZSBvdmVyZmxvd1xuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChob3N0ZGF0YS0+c2VuZF9tYXJrZXIpIHsKKwkJc3RydWN0IE1hcmtlcl9FbnRyeSAqbWFya2VyOworCisJCVRSQUNFKCJxdWV1ZSBtYXJrZXIiLCBpbl9wdHIsIDApOworCisJCURFQlVHKHByaW50aygicWxvZ2ljaXNwIDogYWRkaW5nIG1hcmtlciBlbnRyeVxuIikpOworCQltYXJrZXIgPSAoc3RydWN0IE1hcmtlcl9FbnRyeSAqKSBjbWQ7CisJCW1lbXNldChtYXJrZXIsIDAsIHNpemVvZihzdHJ1Y3QgTWFya2VyX0VudHJ5KSk7CisKKwkJbWFya2VyLT5oZHIuZW50cnlfdHlwZSA9IEVOVFJZX01BUktFUjsKKwkJbWFya2VyLT5oZHIuZW50cnlfY250ID0gMTsKKwkJbWFya2VyLT5tb2RpZmllciA9IFNZTkNfQUxMOworCisJCWhvc3RkYXRhLT5zZW5kX21hcmtlciA9IDA7CisKKwkJaWYgKCgoaW5fcHRyICsgMSkgJiBRTE9HSUNJU1BfUkVRX1FVRVVFX0xFTikgPT0gb3V0X3B0cikgeworCQkJaXNwX291dHcoaW5fcHRyLCBob3N0LCBNQk9YNCk7CisJCQlob3N0ZGF0YS0+cmVxX2luX3B0ciA9IGluX3B0cjsKKwkJCXByaW50aygicWxvZ2ljaXNwIDogcmVxdWVzdCBxdWV1ZSBvdmVyZmxvd1xuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQljbWQgPSAoc3RydWN0IENvbW1hbmRfRW50cnkgKikgJmhvc3RkYXRhLT5yZXFfY3B1W2luX3B0cl07CisJCWluX3B0ciA9IChpbl9wdHIgKyAxKSAmIFFMT0dJQ0lTUF9SRVFfUVVFVUVfTEVOOworCX0KKworCVRSQUNFKCJxdWV1ZSBjb21tYW5kIiwgaW5fcHRyLCBDbW5kKTsKKworCW1lbXNldChjbWQsIDAsIHNpemVvZihzdHJ1Y3QgQ29tbWFuZF9FbnRyeSkpOworCisJY21kLT5oZHIuZW50cnlfdHlwZSA9IEVOVFJZX0NPTU1BTkQ7CisJY21kLT5oZHIuZW50cnlfY250ID0gMTsKKworCWNtZC0+dGFyZ2V0X2x1biA9IENtbmQtPmRldmljZS0+bHVuOworCWNtZC0+dGFyZ2V0X2lkID0gQ21uZC0+ZGV2aWNlLT5pZDsKKwljbWQtPmNkYl9sZW5ndGggPSBjcHVfdG9fbGUxNihDbW5kLT5jbWRfbGVuKTsKKwljbWQtPmNvbnRyb2xfZmxhZ3MgPSBjcHVfdG9fbGUxNihDRkxBR19SRUFEIHwgQ0ZMQUdfV1JJVEUpOworCWNtZC0+dGltZV9vdXQgPSBjcHVfdG9fbGUxNigzMCk7CisKKwltZW1jcHkoY21kLT5jZGIsIENtbmQtPmNtbmQsIENtbmQtPmNtZF9sZW4pOworCisJaWYgKENtbmQtPnVzZV9zZykgeworCQlpbnQgc2dfY291bnQ7CisKKwkJc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIENtbmQtPnJlcXVlc3RfYnVmZmVyOworCQlkcyA9IGNtZC0+ZGF0YXNlZzsKKworCQlzZ19jb3VudCA9IHBjaV9tYXBfc2coaG9zdGRhdGEtPnBjaV9kZXYsIHNnLCBDbW5kLT51c2Vfc2csCisJCQkJICAgICAgc2NzaV90b19wY2lfZG1hX2RpcihDbW5kLT5zY19kYXRhX2RpcmVjdGlvbikpOworCisJCWNtZC0+c2VnbWVudF9jbnQgPSBjcHVfdG9fbGUxNihzZ19jb3VudCk7CisKKwkJLyogZmlsbCBpbiBmaXJzdCBmb3VyIHNnIGVudHJpZXM6ICovCisJCW4gPSBzZ19jb3VudDsKKwkJaWYgKG4gPiBJT0NCX1NFR1MpCisJCQluID0gSU9DQl9TRUdTOworCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQlkbWFfYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJCWRzW2ldLmRfYmFzZSAgPSBjcHVfdG9fbGUzMigodTMyKSBkbWFfYWRkcik7CisjaWZkZWYgQ09ORklHX1FMX0lTUF9BNjQKKwkJCWRzW2ldLmRfYmFzZV9oaSA9IGNwdV90b19sZTMyKCh1MzIpIChkbWFfYWRkcj4+MzIpKTsKKyNlbmRpZiAvKiBDT05GSUdfUUxfSVNQX0E2NCAqLworCQkJZHNbaV0uZF9jb3VudCA9IGNwdV90b19sZTMyKHNnX2RtYV9sZW4oc2cpKTsKKwkJCSsrc2c7CisJCX0KKwkJc2dfY291bnQgLT0gSU9DQl9TRUdTOworCisJCXdoaWxlIChzZ19jb3VudCA+IDApIHsKKwkJCSsrY21kLT5oZHIuZW50cnlfY250OworCQkJY29udCA9IChzdHJ1Y3QgQ29udGludWF0aW9uX0VudHJ5ICopCisJCQkJJmhvc3RkYXRhLT5yZXFfY3B1W2luX3B0cl07CisJCQlpbl9wdHIgPSAoaW5fcHRyICsgMSkgJiBRTE9HSUNJU1BfUkVRX1FVRVVFX0xFTjsKKwkJCWlmIChpbl9wdHIgPT0gb3V0X3B0cikgeworCQkJCXByaW50aygiaXNwMTAyMDogdW5leHBlY3RlZCByZXF1ZXN0IHF1ZXVlICIKKwkJCQkgICAgICAgIm92ZXJmbG93XG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCVRSQUNFKCJxdWV1ZSBjb250aW51YXRpb24iLCBpbl9wdHIsIDApOworCQkJY29udC0+aGRyLmVudHJ5X3R5cGUgPSBFTlRSWV9DT05USU5VQVRJT047CisJCQljb250LT5oZHIuZW50cnlfY250ICA9IDA7CisJCQljb250LT5oZHIuc3lzX2RlZl8xICA9IDA7CisJCQljb250LT5oZHIuZmxhZ3MgICAgICA9IDA7CisjaWZuZGVmIENPTkZJR19RTF9JU1BfQTY0CisJCQljb250LT5yZXNlcnZlZCA9IDA7CisjZW5kaWYKKwkJCWRzID0gY29udC0+ZGF0YXNlZzsKKwkJCW4gPSBzZ19jb3VudDsKKwkJCWlmIChuID4gQ09OVElOVUFUSU9OX1NFR1MpCisJCQkJbiA9IENPTlRJTlVBVElPTl9TRUdTOworCQkJZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworCQkJCWRtYV9hZGRyID0gc2dfZG1hX2FkZHJlc3Moc2cpOworCQkJCWRzW2ldLmRfYmFzZSA9IGNwdV90b19sZTMyKCh1MzIpIGRtYV9hZGRyKTsKKyNpZmRlZiBDT05GSUdfUUxfSVNQX0E2NAorCQkJCWRzW2ldLmRfYmFzZV9oaSA9IGNwdV90b19sZTMyKCh1MzIpKGRtYV9hZGRyPj4zMikpOworI2VuZGlmIC8qIENPTkZJR19RTF9JU1BfQTY0ICovCisJCQkJZHNbaV0uZF9jb3VudCA9IGNwdV90b19sZTMyKHNnX2RtYV9sZW4oc2cpKTsKKwkJCQkrK3NnOworCQkJfQorCQkJc2dfY291bnQgLT0gbjsKKwkJfQorCX0gZWxzZSBpZiAoQ21uZC0+cmVxdWVzdF9idWZmbGVuKSB7CisJCS8qQ21uZC0+U0NwLnB0ciA9IChjaGFyICopKHVuc2lnbmVkIGxvbmcpKi8KKwkJZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShob3N0ZGF0YS0+cGNpX2RldiwKKwkJCQkgICAgICAgQ21uZC0+cmVxdWVzdF9idWZmZXIsCisJCQkJICAgICAgIENtbmQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkgICAgICAgc2NzaV90b19wY2lfZG1hX2RpcihDbW5kLT5zY19kYXRhX2RpcmVjdGlvbikpOworCQlDbW5kLT5TQ3AucHRyID0gKGNoYXIgKikodW5zaWduZWQgbG9uZykgZG1hX2FkZHI7CisKKwkJY21kLT5kYXRhc2VnWzBdLmRfYmFzZSA9CisJCQljcHVfdG9fbGUzMigodTMyKSBkbWFfYWRkcik7CisjaWZkZWYgQ09ORklHX1FMX0lTUF9BNjQKKwkJY21kLT5kYXRhc2VnWzBdLmRfYmFzZV9oaSA9CisJCQljcHVfdG9fbGUzMigodTMyKSAoZG1hX2FkZHI+PjMyKSk7CisjZW5kaWYgLyogQ09ORklHX1FMX0lTUF9BNjQgKi8KKwkJY21kLT5kYXRhc2VnWzBdLmRfY291bnQgPQorCQkJY3B1X3RvX2xlMzIoKHUzMilDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCQljbWQtPnNlZ21lbnRfY250ID0gY3B1X3RvX2xlMTYoMSk7CisJfSBlbHNlIHsKKwkJY21kLT5kYXRhc2VnWzBdLmRfYmFzZSA9IDA7CisjaWZkZWYgQ09ORklHX1FMX0lTUF9BNjQKKwkJY21kLT5kYXRhc2VnWzBdLmRfYmFzZV9oaSA9IDA7CisjZW5kaWYgLyogQ09ORklHX1FMX0lTUF9BNjQgKi8KKwkJY21kLT5kYXRhc2VnWzBdLmRfY291bnQgPSAwOworCQljbWQtPnNlZ21lbnRfY250ID0gY3B1X3RvX2xlMTYoMSk7IC8qIFNob3VsZG4ndCB0aGlzIGJlIDA/ICovCisJfQorCisJLyogQ29tbWl0dGVkLCByZWNvcmQgU2NzaV9DbWQgc28gd2UgY2FuIGZpbmQgaXQgbGF0ZXIuICovCisJY21kLT5oYW5kbGUgPSBpbl9wdHI7CisJaG9zdGRhdGEtPmNtZF9zbG90c1tpbl9wdHJdID0gQ21uZDsKKworCWlzcF9vdXR3KGluX3B0ciwgaG9zdCwgTUJPWDQpOworCWhvc3RkYXRhLT5yZXFfaW5fcHRyID0gaW5fcHRyOworCisJbnVtX2ZyZWUgPSBRTE9HSUNJU1BfUkVRX1FVRVVFX0xFTiAtIFJFUV9RVUVVRV9ERVBUSChpbl9wdHIsIG91dF9wdHIpOworCWhvc3QtPmNhbl9xdWV1ZSA9IGhvc3QtPmhvc3RfYnVzeSArIG51bV9mcmVlOworCWhvc3QtPnNnX3RhYmxlc2l6ZSA9IFFMT0dJQ0lTUF9NQVhfU0cobnVtX2ZyZWUpOworCisJTEVBVkUoImlzcDEwMjBfcXVldWVjb21tYW5kIik7CisKKwlyZXR1cm4gMDsKK30KKworCisjZGVmaW5lIEFTWU5DX0VWRU5UX0lOVEVSUlVQVAkweDAxCisKK2lycXJldHVybl90IGRvX2lzcDEwMjBfaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGRldl9pZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJaXNwMTAyMF9pbnRyX2hhbmRsZXIoaXJxLCBkZXZfaWQsIHJlZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3ZvaWQgaXNwMTAyMF9pbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlTY3NpX0NtbmQgKkNtbmQ7CisJc3RydWN0IFN0YXR1c19FbnRyeSAqc3RzOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBkZXZfaWQ7CisJc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEgKmhvc3RkYXRhOworCXVfaW50IGluX3B0ciwgb3V0X3B0cjsKKwl1X3Nob3J0IHN0YXR1czsKKworCUVOVEVSX0lOVFIoImlzcDEwMjBfaW50cl9oYW5kbGVyIik7CisKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgaXNwMTAyMF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YTsKKworCURFQlVHX0lOVFIocHJpbnRrKCJxbG9naWNpc3AgOiBpbnRlcnJ1cHQgb24gbGluZSAlZFxuIiwgaXJxKSk7CisKKwlpZiAoIShpc3BfaW53KGhvc3QsIFBDSV9JTlRGX1NUUykgJiAweDA0KSkgeworCQkvKiBzcHVyaW91cyBpbnRlcnJ1cHRzIGNhbiBoYXBwZW4gbGVnYWxseSAqLworCQlERUJVR19JTlRSKHByaW50aygicWxvZ2ljaXNwOiBnb3Qgc3B1cmlvdXMgaW50ZXJydXB0XG4iKSk7CisJCXJldHVybjsKKwl9CisJaW5fcHRyID0gaXNwX2ludyhob3N0LCBNQk9YNSk7CisJaXNwX291dHcoSENDUl9DTEVBUl9SSVNDX0lOVFIsIGhvc3QsIEhPU1RfSENDUik7CisKKwlpZiAoKGlzcF9pbncoaG9zdCwgUENJX1NFTUFQSE9SRSkgJiBBU1lOQ19FVkVOVF9JTlRFUlJVUFQpKSB7CisJCXN0YXR1cyA9IGlzcF9pbncoaG9zdCwgTUJPWDApOworCisJCURFQlVHX0lOVFIocHJpbnRrKCJxbG9naWNpc3AgOiBtYm94IGNvbXBsZXRpb24gc3RhdHVzOiAleFxuIiwKKwkJCQkgIHN0YXR1cykpOworCisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCSAgICAgIGNhc2UgQVNZTkNfU0NTSV9CVVNfUkVTRVQ6CisJCSAgICAgIGNhc2UgRVhFQ1VUSU9OX1RJTUVPVVRfUkVTRVQ6CisJCQlob3N0ZGF0YS0+c2VuZF9tYXJrZXIgPSAxOworCQkJYnJlYWs7CisJCSAgICAgIGNhc2UgSU5WQUxJRF9DT01NQU5EOgorCQkgICAgICBjYXNlIEhPU1RfSU5URVJGQUNFX0VSUk9SOgorCQkgICAgICBjYXNlIENPTU1BTkRfRVJST1I6CisJCSAgICAgIGNhc2UgQ09NTUFORF9QQVJBTV9FUlJPUjoKKwkJCXByaW50aygicWxvZ2ljaXNwIDogYmFkIG1haWxib3ggcmV0dXJuIHN0YXR1c1xuIik7CisJCQlicmVhazsKKwkJfQorCQlpc3Bfb3V0dygweDAsIGhvc3QsIFBDSV9TRU1BUEhPUkUpOworCX0KKwlvdXRfcHRyID0gaG9zdGRhdGEtPnJlc19vdXRfcHRyOworCisJREVCVUdfSU5UUihwcmludGsoInFsb2dpY2lzcCA6IHJlc3BvbnNlIHF1ZXVlIHVwZGF0ZVxuIikpOworCURFQlVHX0lOVFIocHJpbnRrKCJxbG9naWNpc3AgOiByZXNwb25zZSBxdWV1ZSBkZXB0aCAlZFxuIiwKKwkJCSAgUVVFVUVfREVQVEgoaW5fcHRyLCBvdXRfcHRyLCBSRVNfUVVFVUVfTEVOKSkpOworCisJd2hpbGUgKG91dF9wdHIgIT0gaW5fcHRyKSB7CisJCXVfaW50IGNtZF9zbG90OworCisJCXN0cyA9IChzdHJ1Y3QgU3RhdHVzX0VudHJ5ICopICZob3N0ZGF0YS0+cmVzX2NwdVtvdXRfcHRyXTsKKwkJb3V0X3B0ciA9IChvdXRfcHRyICsgMSkgJiBSRVNfUVVFVUVfTEVOOworCisJCWNtZF9zbG90ID0gc3RzLT5oYW5kbGU7CisJCUNtbmQgPSBob3N0ZGF0YS0+Y21kX3Nsb3RzW2NtZF9zbG90XTsKKwkJaG9zdGRhdGEtPmNtZF9zbG90c1tjbWRfc2xvdF0gPSBOVUxMOworCisJCVRSQUNFKCJkb25lIiwgb3V0X3B0ciwgQ21uZCk7CisKKwkJaWYgKGxlMTZfdG9fY3B1KHN0cy0+Y29tcGxldGlvbl9zdGF0dXMpID09IENTX1JFU0VUX09DQ1VSUkVECisJCSAgICB8fCBsZTE2X3RvX2NwdShzdHMtPmNvbXBsZXRpb25fc3RhdHVzKSA9PSBDU19BQk9SVEVECisJCSAgICB8fCAobGUxNl90b19jcHUoc3RzLT5zdGF0dXNfZmxhZ3MpICYgU1RGX0JVU19SRVNFVCkpCisJCQlob3N0ZGF0YS0+c2VuZF9tYXJrZXIgPSAxOworCisJCWlmIChsZTE2X3RvX2NwdShzdHMtPnN0YXRlX2ZsYWdzKSAmIFNGX0dPVF9TRU5TRSkKKwkJCW1lbWNweShDbW5kLT5zZW5zZV9idWZmZXIsIHN0cy0+cmVxX3NlbnNlX2RhdGEsCisJCQkgICAgICAgc2l6ZW9mKENtbmQtPnNlbnNlX2J1ZmZlcikpOworCisJCURFQlVHX0lOVFIoaXNwMTAyMF9wcmludF9zdGF0dXNfZW50cnkoc3RzKSk7CisKKwkJaWYgKHN0cy0+aGRyLmVudHJ5X3R5cGUgPT0gRU5UUllfU1RBVFVTKQorCQkJQ21uZC0+cmVzdWx0ID0gaXNwMTAyMF9yZXR1cm5fc3RhdHVzKHN0cyk7CisJCWVsc2UKKwkJCUNtbmQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKworCQlpZiAoQ21uZC0+dXNlX3NnKQorCQkJcGNpX3VubWFwX3NnKGhvc3RkYXRhLT5wY2lfZGV2LAorCQkJCSAgICAgKHN0cnVjdCBzY2F0dGVybGlzdCAqKUNtbmQtPmJ1ZmZlciwKKwkJCQkgICAgIENtbmQtPnVzZV9zZywKKwkJCQkgICAgIHNjc2lfdG9fcGNpX2RtYV9kaXIoQ21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKwkJZWxzZSBpZiAoQ21uZC0+cmVxdWVzdF9idWZmbGVuKQorCQkJcGNpX3VubWFwX3NpbmdsZShob3N0ZGF0YS0+cGNpX2RldiwKKyNpZmRlZiBDT05GSUdfUUxfSVNQX0E2NAorCQkJCQkgKGRtYV9hZGRyX3QpKChsb25nKUNtbmQtPlNDcC5wdHIpLAorI2Vsc2UKKwkJCQkJICh1MzIpKChsb25nKUNtbmQtPlNDcC5wdHIpLAorI2VuZGlmCisJCQkJCSBDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCSBzY3NpX3RvX3BjaV9kbWFfZGlyKENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisKKwkJaXNwX291dHcob3V0X3B0ciwgaG9zdCwgTUJPWDUpOworCQkoKkNtbmQtPnNjc2lfZG9uZSkoQ21uZCk7CisJfQorCWhvc3RkYXRhLT5yZXNfb3V0X3B0ciA9IG91dF9wdHI7CisKKwlMRUFWRV9JTlRSKCJpc3AxMDIwX2ludHJfaGFuZGxlciIpOworfQorCisKK3N0YXRpYyBpbnQgaXNwMTAyMF9yZXR1cm5fc3RhdHVzKHN0cnVjdCBTdGF0dXNfRW50cnkgKnN0cykKK3sKKwlpbnQgaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisjaWYgREVCVUdfSVNQMTAyMF9JTlRSCisJc3RhdGljIGNoYXIgKnJlYXNvbltdID0geworCQkiRElEX09LIiwKKwkJIkRJRF9OT19DT05ORUNUIiwKKwkJIkRJRF9CVVNfQlVTWSIsCisJCSJESURfVElNRV9PVVQiLAorCQkiRElEX0JBRF9UQVJHRVQiLAorCQkiRElEX0FCT1JUIiwKKwkJIkRJRF9QQVJJVFkiLAorCQkiRElEX0VSUk9SIiwKKwkJIkRJRF9SRVNFVCIsCisJCSJESURfQkFEX0lOVFIiCisJfTsKKyNlbmRpZiAvKiBERUJVR19JU1AxMDIwX0lOVFIgKi8KKworCUVOVEVSKCJpc3AxMDIwX3JldHVybl9zdGF0dXMiKTsKKworCURFQlVHKHByaW50aygicWxvZ2ljaXNwIDogY29tcGxldGlvbiBzdGF0dXMgPSAweCUwNHhcbiIsCisJCSAgICAgbGUxNl90b19jcHUoc3RzLT5jb21wbGV0aW9uX3N0YXR1cykpKTsKKworCXN3aXRjaChsZTE2X3RvX2NwdShzdHMtPmNvbXBsZXRpb25fc3RhdHVzKSkgeworCSAgICAgIGNhc2UgQ1NfQ09NUExFVEU6CisJCWhvc3Rfc3RhdHVzID0gRElEX09LOworCQlicmVhazsKKwkgICAgICBjYXNlIENTX0lOQ09NUExFVEU6CisJCWlmICghKGxlMTZfdG9fY3B1KHN0cy0+c3RhdGVfZmxhZ3MpICYgU0ZfR09UX0JVUykpCisJCQlob3N0X3N0YXR1cyA9IERJRF9OT19DT05ORUNUOworCQllbHNlIGlmICghKGxlMTZfdG9fY3B1KHN0cy0+c3RhdGVfZmxhZ3MpICYgU0ZfR09UX1RBUkdFVCkpCisJCQlob3N0X3N0YXR1cyA9IERJRF9CQURfVEFSR0VUOworCQllbHNlIGlmICghKGxlMTZfdG9fY3B1KHN0cy0+c3RhdGVfZmxhZ3MpICYgU0ZfU0VOVF9DREIpKQorCQkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJCWVsc2UgaWYgKCEobGUxNl90b19jcHUoc3RzLT5zdGF0ZV9mbGFncykgJiBTRl9UUkFOU0ZFUlJFRF9EQVRBKSkKKwkJCWhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCQllbHNlIGlmICghKGxlMTZfdG9fY3B1KHN0cy0+c3RhdGVfZmxhZ3MpICYgU0ZfR09UX1NUQVRVUykpCisJCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJZWxzZSBpZiAoIShsZTE2X3RvX2NwdShzdHMtPnN0YXRlX2ZsYWdzKSAmIFNGX0dPVF9TRU5TRSkpCisJCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBDU19ETUFfRVJST1I6CisJICAgICAgY2FzZSBDU19UUkFOU1BPUlRfRVJST1I6CisJCWhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCQlicmVhazsKKwkgICAgICBjYXNlIENTX1JFU0VUX09DQ1VSUkVEOgorCQlob3N0X3N0YXR1cyA9IERJRF9SRVNFVDsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBDU19BQk9SVEVEOgorCQlob3N0X3N0YXR1cyA9IERJRF9BQk9SVDsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBDU19USU1FT1VUOgorCQlob3N0X3N0YXR1cyA9IERJRF9USU1FX09VVDsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBDU19EQVRBX09WRVJSVU46CisJICAgICAgY2FzZSBDU19DT01NQU5EX09WRVJSVU46CisJICAgICAgY2FzZSBDU19TVEFUVVNfT1ZFUlJVTjoKKwkgICAgICBjYXNlIENTX0JBRF9NRVNTQUdFOgorCSAgICAgIGNhc2UgQ1NfTk9fTUVTU0FHRV9PVVQ6CisJICAgICAgY2FzZSBDU19FWFRfSURfRkFJTEVEOgorCSAgICAgIGNhc2UgQ1NfSURFX01TR19GQUlMRUQ6CisJICAgICAgY2FzZSBDU19BQk9SVF9NU0dfRkFJTEVEOgorCSAgICAgIGNhc2UgQ1NfTk9QX01TR19GQUlMRUQ6CisJICAgICAgY2FzZSBDU19QQVJJVFlfRVJST1JfTVNHX0ZBSUxFRDoKKwkgICAgICBjYXNlIENTX0RFVklDRV9SRVNFVF9NU0dfRkFJTEVEOgorCSAgICAgIGNhc2UgQ1NfSURfTVNHX0ZBSUxFRDoKKwkgICAgICBjYXNlIENTX1VORVhQX0JVU19GUkVFOgorCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBDU19EQVRBX1VOREVSUlVOOgorCQlob3N0X3N0YXR1cyA9IERJRF9PSzsKKwkJYnJlYWs7CisJICAgICAgZGVmYXVsdDoKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiB1bmtub3duIGNvbXBsZXRpb24gc3RhdHVzIDB4JTA0eFxuIiwKKwkJICAgICAgIGxlMTZfdG9fY3B1KHN0cy0+Y29tcGxldGlvbl9zdGF0dXMpKTsKKwkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJCWJyZWFrOworCX0KKworCURFQlVHX0lOVFIocHJpbnRrKCJxbG9naWNpc3AgOiBob3N0IHN0YXR1cyAoJXMpIHNjc2kgc3RhdHVzICV4XG4iLAorCQkJICByZWFzb25baG9zdF9zdGF0dXNdLCBsZTE2X3RvX2NwdShzdHMtPnNjc2lfc3RhdHVzKSkpOworCisJTEVBVkUoImlzcDEwMjBfcmV0dXJuX3N0YXR1cyIpOworCisJcmV0dXJuIChsZTE2X3RvX2NwdShzdHMtPnNjc2lfc3RhdHVzKSAmIFNUQVRVU19NQVNLKSB8IChob3N0X3N0YXR1cyA8PCAxNik7Cit9CisKKworc3RhdGljIGludCBpc3AxMDIwX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKm4sCisJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgaXBbXSkKK3sKKwlpbnQgc2l6ZSA9IGNhcGFjaXR5OworCisJRU5URVIoImlzcDEwMjBfYmlvc3BhcmFtIik7CisKKwlpcFswXSA9IDY0OworCWlwWzFdID0gMzI7CisJaXBbMl0gPSBzaXplID4+IDExOworCWlmIChpcFsyXSA+IDEwMjQpIHsKKwkJaXBbMF0gPSAyNTU7CisJCWlwWzFdID0gNjM7CisJCWlwWzJdID0gc2l6ZSAvIChpcFswXSAqIGlwWzFdKTsKKyNpZiAwCisJCWlmIChpcFsyXSA+IDEwMjMpCisJCQlpcFsyXSA9IDEwMjM7CisjZW5kaWYJCQkKKwl9CisKKwlMRUFWRSgiaXNwMTAyMF9iaW9zcGFyYW0iKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaXNwMTAyMF9yZXNldF9oYXJkd2FyZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXVfc2hvcnQgcGFyYW1bNl07CisJaW50IGxvb3BfY291bnQ7CisKKwlFTlRFUigiaXNwMTAyMF9yZXNldF9oYXJkd2FyZSIpOworCisJaXNwX291dHcoSVNQX1JFU0VULCBob3N0LCBQQ0lfSU5URl9DVEwpOworCXVkZWxheSgxMDApOworCWlzcF9vdXR3KEhDQ1JfUkVTRVQsIGhvc3QsIEhPU1RfSENDUik7CisJdWRlbGF5KDEwMCk7CisJaXNwX291dHcoSENDUl9SRUxFQVNFLCBob3N0LCBIT1NUX0hDQ1IpOworCWlzcF9vdXR3KEhDQ1JfQklPU19ESVNBQkxFLCBob3N0LCBIT1NUX0hDQ1IpOworCisJbG9vcF9jb3VudCA9IERFRkFVTFRfTE9PUF9DT1VOVDsKKwl3aGlsZSAoLS1sb29wX2NvdW50ICYmIGlzcF9pbncoaG9zdCwgSE9TVF9IQ0NSKSA9PSBSSVNDX0JVU1kpIHsKKwkJYmFycmllcigpOworCQljcHVfcmVsYXgoKTsKKwl9CisJaWYgKCFsb29wX2NvdW50KQorCQlwcmludGsoInFsb2dpY2lzcDogcmVzZXRfaGFyZHdhcmUgbG9vcCB0aW1lb3V0XG4iKTsKKworCWlzcF9vdXR3KDAsIGhvc3QsIElTUF9DRkcxKTsKKworI2lmIERFQlVHX0lTUDEwMjAKKwlwcmludGsoInFsb2dpY2lzcCA6IG1ib3ggMCAweCUwNHggXG4iLCBpc3BfaW53KGhvc3QsIE1CT1gwKSk7CisJcHJpbnRrKCJxbG9naWNpc3AgOiBtYm94IDEgMHglMDR4IFxuIiwgaXNwX2ludyhob3N0LCBNQk9YMSkpOworCXByaW50aygicWxvZ2ljaXNwIDogbWJveCAyIDB4JTA0eCBcbiIsIGlzcF9pbncoaG9zdCwgTUJPWDIpKTsKKwlwcmludGsoInFsb2dpY2lzcCA6IG1ib3ggMyAweCUwNHggXG4iLCBpc3BfaW53KGhvc3QsIE1CT1gzKSk7CisJcHJpbnRrKCJxbG9naWNpc3AgOiBtYm94IDQgMHglMDR4IFxuIiwgaXNwX2ludyhob3N0LCBNQk9YNCkpOworCXByaW50aygicWxvZ2ljaXNwIDogbWJveCA1IDB4JTA0eCBcbiIsIGlzcF9pbncoaG9zdCwgTUJPWDUpKTsKKyNlbmRpZiAvKiBERUJVR19JU1AxMDIwICovCisKKwlwYXJhbVswXSA9IE1CT1hfTk9fT1A7CisJaXNwMTAyMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiBOT1AgdGVzdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlERUJVRyhwcmludGsoInFsb2dpY2lzcCA6IGxvYWRpbmcgcmlzYyByYW1cbiIpKTsKKworI2lmIFJFTE9BRF9GSVJNV0FSRQorCWZvciAobG9vcF9jb3VudCA9IDA7IGxvb3BfY291bnQgPCByaXNjX2NvZGVfbGVuZ3RoMDE7IGxvb3BfY291bnQrKykgeworCQlwYXJhbVswXSA9IE1CT1hfV1JJVEVfUkFNX1dPUkQ7CisJCXBhcmFtWzFdID0gcmlzY19jb2RlX2FkZHIwMSArIGxvb3BfY291bnQ7CisJCXBhcmFtWzJdID0gcmlzY19jb2RlMDFbbG9vcF9jb3VudF07CisJCWlzcDEwMjBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKwkJaWYgKHBhcmFtWzBdICE9IE1CT1hfQ09NTUFORF9DT01QTEVURSkgeworCQkJcHJpbnRrKCJxbG9naWNpc3AgOiBmaXJtd2FyZSBsb2FkIGZhaWx1cmUgYXQgJWRcbiIsCisJCQkgICAgbG9vcF9jb3VudCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKyNlbmRpZiAvKiBSRUxPQURfRklSTVdBUkUgKi8KKworCURFQlVHKHByaW50aygicWxvZ2ljaXNwIDogdmVyaWZ5aW5nIGNoZWNrc3VtXG4iKSk7CisKKwlwYXJhbVswXSA9IE1CT1hfVkVSSUZZX0NIRUNLU1VNOworCXBhcmFtWzFdID0gcmlzY19jb2RlX2FkZHIwMTsKKworCWlzcDEwMjBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiByYW0gY2hlY2tzdW0gZmFpbHVyZVxuIik7CisJCXJldHVybiAxOworCX0KKworCURFQlVHKHByaW50aygicWxvZ2ljaXNwIDogZXhlY3V0aW5nIGZpcm13YXJlXG4iKSk7CisKKwlwYXJhbVswXSA9IE1CT1hfRVhFQ19GSVJNV0FSRTsKKwlwYXJhbVsxXSA9IHJpc2NfY29kZV9hZGRyMDE7CisKKwlpc3AxMDIwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisKKwlwYXJhbVswXSA9IE1CT1hfQUJPVVRfRklSTVdBUkU7CisKKwlpc3AxMDIwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisKKwlpZiAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCXByaW50aygicWxvZ2ljaXNwIDogYWJvdXQgZmlybXdhcmUgZmFpbHVyZVxuIik7CisJCXJldHVybiAxOworCX0KKworCURFQlVHKHByaW50aygicWxvZ2ljaXNwIDogZmlybXdhcmUgbWFqb3IgcmV2aXNpb24gJWRcbiIsIHBhcmFtWzFdKSk7CisJREVCVUcocHJpbnRrKCJxbG9naWNpc3AgOiBmaXJtd2FyZSBtaW5vciByZXZpc2lvbiAlZFxuIiwgcGFyYW1bMl0pKTsKKworCUxFQVZFKCJpc3AxMDIwX3Jlc2V0X2hhcmR3YXJlIik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGlzcDEwMjBfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaCkKK3sKKwl1X2xvbmcgaW9fYmFzZSwgbWVtX2Jhc2UsIGlvX2ZsYWdzLCBtZW1fZmxhZ3M7CisJc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEgKmhvc3RkYXRhOworCXVfY2hhciByZXZpc2lvbjsKKwl1X2ludCBpcnE7CisJdV9zaG9ydCBjb21tYW5kOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJRU5URVIoImlzcDEwMjBfaW5pdCIpOworCisJaG9zdGRhdGEgPSAoc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEgKikgc2gtPmhvc3RkYXRhOworCXBkZXYgPSBob3N0ZGF0YS0+cGNpX2RldjsKKworCWlmIChwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmNvbW1hbmQpCisJICAgIHx8IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJnJldmlzaW9uKSkKKwl7CisJCXByaW50aygicWxvZ2ljaXNwIDogZXJyb3IgcmVhZGluZyBQQ0kgY29uZmlndXJhdGlvblxuIik7CisJCXJldHVybiAxOworCX0KKworCWlvX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJbWVtX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJaW9fZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCk7CisJbWVtX2ZsYWdzID0gcGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDEpOworCWlycSA9IHBkZXYtPmlycTsKKworCWlmIChwZGV2LT52ZW5kb3IgIT0gUENJX1ZFTkRPUl9JRF9RTE9HSUMpIHsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiAweCUwNHggaXMgbm90IFFMb2dpYyB2ZW5kb3IgSURcbiIsCisJCSAgICAgICBwZGV2LT52ZW5kb3IpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAocGRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEwMjApIHsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiAweCUwNHggZG9lcyBub3QgbWF0Y2ggSVNQMTAyMCBkZXZpY2UgaWRcbiIsCisJCSAgICAgICBwZGV2LT5kZXZpY2UpOworCQlyZXR1cm4gMTsKKwl9CisKKyNpZmRlZiBfX2FscGhhX18KKwkvKiBGb3JjZSBBTFBIQSB0byB1c2UgYnVzIEkvTyBhbmQgbm90IGJ1cyBNRU0uCisJICAgVGhpcyBpcyB0byBhdm9pZCBoYXZpbmcgdG8gdXNlIEhBRV9NRU0gcmVnaXN0ZXJzLAorCSAgIHdoaWNoIGlzIGJyb2tlbiBvbiBzb21lIHBsYXRmb3JtcyBhbmQgd2l0aCBTTVAuICAqLworCWNvbW1hbmQgJj0gflBDSV9DT01NQU5EX01FTU9SWTsgCisjZW5kaWYKKworCXNoLT5pb19wb3J0ID0gaW9fYmFzZTsKKworCWlmICghcmVxdWVzdF9yZWdpb24oc2gtPmlvX3BvcnQsIDB4ZmYsICJxbG9naWNpc3AiKSkgeworCQlwcmludGsoInFsb2dpY2lzcCA6IGkvbyByZWdpb24gMHglbHgtMHglbHggYWxyZWFkeSAiCisJCSAgICAgICAiaW4gdXNlXG4iLAorCQkgICAgICAgc2gtPmlvX3BvcnQsIHNoLT5pb19wb3J0ICsgMHhmZik7CisJCXJldHVybiAxOworCX0KKworIAlpZiAoKGNvbW1hbmQgJiBQQ0lfQ09NTUFORF9NRU1PUlkpICYmCisgCSAgICAoKG1lbV9mbGFncyAmIDEpID09IDApKSB7CisgCQlob3N0ZGF0YS0+bWVtYWRkciA9IGlvcmVtYXAobWVtX2Jhc2UsIFBBR0VfU0laRSk7CisJCWlmICghaG9zdGRhdGEtPm1lbWFkZHIpIHsKKyAJCQlwcmludGsoInFsb2dpY2lzcCA6IGkvbyByZW1hcHBpbmcgZmFpbGVkLlxuIik7CisJCQlnb3RvIG91dF9yZWxlYXNlOworCQl9CisgCX0gZWxzZSB7CisJCWlmIChjb21tYW5kICYgUENJX0NPTU1BTkRfSU8gJiYgKGlvX2ZsYWdzICYgMykgIT0gMSkgeworCQkJcHJpbnRrKCJxbG9naWNpc3AgOiBpL28gbWFwcGluZyBpcyBkaXNhYmxlZFxuIik7CisJCQlnb3RvIG91dF9yZWxlYXNlOworIAkJfQorIAkJaG9zdGRhdGEtPm1lbWFkZHIgPSBOVUxMOyAvKiB6ZXJvIHRvIHNpZ25pZnkgbm8gaS9vIG1hcHBpbmcgKi8KKyAJCW1lbV9iYXNlID0gMDsKKwl9CisKKwlpZiAocmV2aXNpb24gIT0gSVNQMTAyMF9SRVZfSUQpCisJCXByaW50aygicWxvZ2ljaXNwIDogbmV3IGlzcDEwMjAgcmV2aXNpb24gSUQgKCVkKVxuIiwgcmV2aXNpb24pOworCisJaWYgKGlzcF9pbncoc2gsICBQQ0lfSURfTE9XKSAhPSBQQ0lfVkVORE9SX0lEX1FMT0dJQworCSAgICB8fCBpc3BfaW53KHNoLCBQQ0lfSURfSElHSCkgIT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTAyMCkKKwl7CisJCXByaW50aygicWxvZ2ljaXNwIDogY2FuJ3QgZGVjb2RlICVzIGFkZHJlc3Mgc3BhY2UgMHglbHhcbiIsCisJCSAgICAgICAoaW9fYmFzZSA/ICJJL08iIDogIk1FTSIpLAorCQkgICAgICAgKGlvX2Jhc2UgPyBpb19iYXNlIDogbWVtX2Jhc2UpKTsKKwkJZ290byBvdXRfdW5tYXA7CisJfQorCisJaG9zdGRhdGEtPnJldmlzaW9uID0gcmV2aXNpb247CisKKwlzaC0+aXJxID0gaXJxOworCXNoLT5tYXhfaWQgPSBNQVhfVEFSR0VUUzsKKwlzaC0+bWF4X2x1biA9IE1BWF9MVU5TOworCisJaG9zdGRhdGEtPnJlc19jcHUgPSBwY2lfYWxsb2NfY29uc2lzdGVudChob3N0ZGF0YS0+cGNpX2RldiwKKwkJCQkJCSBRU0laRShSRVNfUVVFVUVfTEVOKSwKKwkJCQkJCSAmaG9zdGRhdGEtPnJlc19kbWEpOworCWlmIChob3N0ZGF0YS0+cmVzX2NwdSA9PSBOVUxMKSB7CisJCXByaW50aygicWxvZ2ljaXNwIDogY2FuJ3QgYWxsb2NhdGUgcmVzcG9uc2UgcXVldWVcbiIpOworCQlnb3RvIG91dF91bm1hcDsKKwl9CisKKwlob3N0ZGF0YS0+cmVxX2NwdSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGhvc3RkYXRhLT5wY2lfZGV2LAorCQkJCQkJIFFTSVpFKFFMT0dJQ0lTUF9SRVFfUVVFVUVfTEVOKSwKKwkJCQkJCSAmaG9zdGRhdGEtPnJlcV9kbWEpOworCWlmIChob3N0ZGF0YS0+cmVxX2NwdSA9PSBOVUxMKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaG9zdGRhdGEtPnBjaV9kZXYsCisJCQkJICAgIFFTSVpFKFJFU19RVUVVRV9MRU4pLAorCQkJCSAgICBob3N0ZGF0YS0+cmVzX2NwdSwKKwkJCQkgICAgaG9zdGRhdGEtPnJlc19kbWEpOworCQlwcmludGsoInFsb2dpY2lzcCA6IGNhbid0IGFsbG9jYXRlIHJlcXVlc3QgcXVldWVcbiIpOworCQlnb3RvIG91dF91bm1hcDsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCUxFQVZFKCJpc3AxMDIwX2luaXQiKTsKKworCXJldHVybiAwOworCitvdXRfdW5tYXA6CisJaW91bm1hcChob3N0ZGF0YS0+bWVtYWRkcik7CitvdXRfcmVsZWFzZToKKwlyZWxlYXNlX3JlZ2lvbihzaC0+aW9fcG9ydCwgMHhmZik7CisJcmV0dXJuIDE7Cit9CisKKworI2lmIFVTRV9OVlJBTV9ERUZBVUxUUworCitzdGF0aWMgaW50IGlzcDEwMjBfZ2V0X2RlZmF1bHRzKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJaW50IGk7CisJdV9zaG9ydCB2YWx1ZTsKKwlzdHJ1Y3QgaXNwMTAyMF9ob3N0ZGF0YSAqaG9zdGRhdGEgPQorCQkoc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGE7CisKKwlFTlRFUigiaXNwMTAyMF9nZXRfZGVmYXVsdHMiKTsKKworCWlmICghaXNwMTAyMF92ZXJpZnlfbnZyYW0oaG9zdCkpIHsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiBudnJhbSBjaGVja3N1bSBmYWlsdXJlXG4iKTsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiBhdHRlbXB0aW5nIHRvIHVzZSBkZWZhdWx0IHBhcmFtZXRlcnNcbiIpOworCQlyZXR1cm4gaXNwMTAyMF9zZXRfZGVmYXVsdHMoaG9zdCk7CisJfQorCisJdmFsdWUgPSBpc3AxMDIwX3JlYWRfbnZyYW1fd29yZChob3N0LCAyKTsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS5maWZvX3RocmVzaG9sZCA9ICh2YWx1ZSA+PiA4KSAmIDB4MDM7CisJaG9zdGRhdGEtPmhvc3RfcGFyYW0uaG9zdF9hZGFwdGVyX2VuYWJsZSA9ICh2YWx1ZSA+PiAxMSkgJiAweDAxOworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLmluaXRpYXRvcl9zY3NpX2lkID0gKHZhbHVlID4+IDEyKSAmIDB4MGY7CisKKwl2YWx1ZSA9IGlzcDEwMjBfcmVhZF9udnJhbV93b3JkKGhvc3QsIDMpOworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLmJ1c19yZXNldF9kZWxheSA9IHZhbHVlICYgMHhmZjsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS5yZXRyeV9jb3VudCA9IHZhbHVlID4+IDg7CisKKwl2YWx1ZSA9IGlzcDEwMjBfcmVhZF9udnJhbV93b3JkKGhvc3QsIDQpOworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLnJldHJ5X2RlbGF5ID0gdmFsdWUgJiAweGZmOworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLmFzeW5jX2RhdGFfc2V0dXBfdGltZSA9ICh2YWx1ZSA+PiA4KSAmIDB4MGY7CisJaG9zdGRhdGEtPmhvc3RfcGFyYW0ucmVxX2Fja19hY3RpdmVfbmVnYXRpb24gPSAodmFsdWUgPj4gMTIpICYgMHgwMTsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS5kYXRhX2xpbmVfYWN0aXZlX25lZ2F0aW9uID0gKHZhbHVlID4+IDEzKSAmIDB4MDE7CisJaG9zdGRhdGEtPmhvc3RfcGFyYW0uZGF0YV9kbWFfYnVyc3RfZW5hYmxlID0gKHZhbHVlID4+IDE0KSAmIDB4MDE7CisJaG9zdGRhdGEtPmhvc3RfcGFyYW0uY29tbWFuZF9kbWFfYnVyc3RfZW5hYmxlID0gKHZhbHVlID4+IDE1KTsKKworCXZhbHVlID0gaXNwMTAyMF9yZWFkX252cmFtX3dvcmQoaG9zdCwgNSk7CisJaG9zdGRhdGEtPmhvc3RfcGFyYW0udGFnX2FnaW5nID0gdmFsdWUgJiAweGZmOworCisJdmFsdWUgPSBpc3AxMDIwX3JlYWRfbnZyYW1fd29yZChob3N0LCA2KTsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS5zZWxlY3Rpb25fdGltZW91dCA9IHZhbHVlICYgMHhmZmZmOworCisJdmFsdWUgPSBpc3AxMDIwX3JlYWRfbnZyYW1fd29yZChob3N0LCA3KTsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS5tYXhfcXVldWVfZGVwdGggPSB2YWx1ZSAmIDB4ZmZmZjsKKworI2lmIERFQlVHX0lTUDEwMjBfU0VUVVAKKwlwcmludGsoInFsb2dpY2lzcCA6IGZpZm8gdGhyZXNob2xkPSVkXG4iLAorCSAgICAgICBob3N0ZGF0YS0+aG9zdF9wYXJhbS5maWZvX3RocmVzaG9sZCk7CisJcHJpbnRrKCJxbG9naWNpc3AgOiBpbml0aWF0b3Igc2NzaSBpZD0lZFxuIiwKKwkgICAgICAgaG9zdGRhdGEtPmhvc3RfcGFyYW0uaW5pdGlhdG9yX3Njc2lfaWQpOworCXByaW50aygicWxvZ2ljaXNwIDogYnVzIHJlc2V0IGRlbGF5PSVkXG4iLAorCSAgICAgICBob3N0ZGF0YS0+aG9zdF9wYXJhbS5idXNfcmVzZXRfZGVsYXkpOworCXByaW50aygicWxvZ2ljaXNwIDogcmV0cnkgY291bnQ9JWRcbiIsCisJICAgICAgIGhvc3RkYXRhLT5ob3N0X3BhcmFtLnJldHJ5X2NvdW50KTsKKwlwcmludGsoInFsb2dpY2lzcCA6IHJldHJ5IGRlbGF5PSVkXG4iLAorCSAgICAgICBob3N0ZGF0YS0+aG9zdF9wYXJhbS5yZXRyeV9kZWxheSk7CisJcHJpbnRrKCJxbG9naWNpc3AgOiBhc3luYyBkYXRhIHNldHVwIHRpbWU9JWRcbiIsCisJICAgICAgIGhvc3RkYXRhLT5ob3N0X3BhcmFtLmFzeW5jX2RhdGFfc2V0dXBfdGltZSk7CisJcHJpbnRrKCJxbG9naWNpc3AgOiByZXEvYWNrIGFjdGl2ZSBuZWdhdGlvbj0lZFxuIiwKKwkgICAgICAgaG9zdGRhdGEtPmhvc3RfcGFyYW0ucmVxX2Fja19hY3RpdmVfbmVnYXRpb24pOworCXByaW50aygicWxvZ2ljaXNwIDogZGF0YSBsaW5lIGFjdGl2ZSBuZWdhdGlvbj0lZFxuIiwKKwkgICAgICAgaG9zdGRhdGEtPmhvc3RfcGFyYW0uZGF0YV9saW5lX2FjdGl2ZV9uZWdhdGlvbik7CisJcHJpbnRrKCJxbG9naWNpc3AgOiBkYXRhIERNQSBidXJzdCBlbmFibGU9JWRcbiIsCisJICAgICAgIGhvc3RkYXRhLT5ob3N0X3BhcmFtLmRhdGFfZG1hX2J1cnN0X2VuYWJsZSk7CisJcHJpbnRrKCJxbG9naWNpc3AgOiBjb21tYW5kIERNQSBidXJzdCBlbmFibGU9JWRcbiIsCisJICAgICAgIGhvc3RkYXRhLT5ob3N0X3BhcmFtLmNvbW1hbmRfZG1hX2J1cnN0X2VuYWJsZSk7CisJcHJpbnRrKCJxbG9naWNpc3AgOiB0YWcgYWdlIGxpbWl0PSVkXG4iLAorCSAgICAgICBob3N0ZGF0YS0+aG9zdF9wYXJhbS50YWdfYWdpbmcpOworCXByaW50aygicWxvZ2ljaXNwIDogc2VsZWN0aW9uIHRpbWVvdXQgbGltaXQ9JWRcbiIsCisJICAgICAgIGhvc3RkYXRhLT5ob3N0X3BhcmFtLnNlbGVjdGlvbl90aW1lb3V0KTsKKwlwcmludGsoInFsb2dpY2lzcCA6IG1heCBxdWV1ZSBkZXB0aD0lZFxuIiwKKwkgICAgICAgaG9zdGRhdGEtPmhvc3RfcGFyYW0ubWF4X3F1ZXVlX2RlcHRoKTsKKyNlbmRpZiAvKiBERUJVR19JU1AxMDIwX1NFVFVQICovCisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1RBUkdFVFM7IGkrKykgeworCisJCXZhbHVlID0gaXNwMTAyMF9yZWFkX252cmFtX3dvcmQoaG9zdCwgMTQgKyBpICogMyk7CisJCWhvc3RkYXRhLT5kZXZfcGFyYW1baV0uZGV2aWNlX2ZsYWdzID0gdmFsdWUgJiAweGZmOworCQlob3N0ZGF0YS0+ZGV2X3BhcmFtW2ldLmV4ZWN1dGlvbl90aHJvdHRsZSA9IHZhbHVlID4+IDg7CisKKwkJdmFsdWUgPSBpc3AxMDIwX3JlYWRfbnZyYW1fd29yZChob3N0LCAxNSArIGkgKiAzKTsKKwkJaG9zdGRhdGEtPmRldl9wYXJhbVtpXS5zeW5jaHJvbm91c19wZXJpb2QgPSB2YWx1ZSAmIDB4ZmY7CisJCWhvc3RkYXRhLT5kZXZfcGFyYW1baV0uc3luY2hyb25vdXNfb2Zmc2V0ID0gKHZhbHVlID4+IDgpICYgMHgwZjsKKwkJaG9zdGRhdGEtPmRldl9wYXJhbVtpXS5kZXZpY2VfZW5hYmxlID0gKHZhbHVlID4+IDEyKSAmIDB4MDE7CisKKyNpZiBERUJVR19JU1AxMDIwX1NFVFVQCisJCXByaW50aygicWxvZ2ljaXNwIDogdGFyZ2V0IDB4JTAyeFxuIiwgaSk7CisJCXByaW50aygicWxvZ2ljaXNwIDogICAgIGRldmljZSBmbGFncz0weCUwMnhcbiIsCisJCSAgICAgICBob3N0ZGF0YS0+ZGV2X3BhcmFtW2ldLmRldmljZV9mbGFncyk7CisJCXByaW50aygicWxvZ2ljaXNwIDogICAgIGV4ZWN1dGlvbiB0aHJvdHRsZT0lZFxuIiwKKwkJICAgICAgIGhvc3RkYXRhLT5kZXZfcGFyYW1baV0uZXhlY3V0aW9uX3Rocm90dGxlKTsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiAgICAgc3luY2hyb25vdXMgcGVyaW9kPSVkXG4iLAorCQkgICAgICAgaG9zdGRhdGEtPmRldl9wYXJhbVtpXS5zeW5jaHJvbm91c19wZXJpb2QpOworCQlwcmludGsoInFsb2dpY2lzcCA6ICAgICBzeW5jaHJvbm91cyBvZmZzZXQ9JWRcbiIsCisJCSAgICAgICBob3N0ZGF0YS0+ZGV2X3BhcmFtW2ldLnN5bmNocm9ub3VzX29mZnNldCk7CisJCXByaW50aygicWxvZ2ljaXNwIDogICAgIGRldmljZSBlbmFibGU9JWRcbiIsCisJCSAgICAgICBob3N0ZGF0YS0+ZGV2X3BhcmFtW2ldLmRldmljZV9lbmFibGUpOworI2VuZGlmIC8qIERFQlVHX0lTUDEwMjBfU0VUVVAgKi8KKwl9CisKKwlMRUFWRSgiaXNwMTAyMF9nZXRfZGVmYXVsdHMiKTsKKworCXJldHVybiAwOworfQorCisKKyNkZWZpbmUgSVNQMTAyMF9OVlJBTV9MRU4JMHg0MAorI2RlZmluZSBJU1AxMDIwX05WUkFNX1NJRzEJMHg1MzQ5CisjZGVmaW5lIElTUDEwMjBfTlZSQU1fU0lHMgkweDIwNTAKKworc3RhdGljIGludCBpc3AxMDIwX3ZlcmlmeV9udnJhbShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCWludAlpOworCXVfc2hvcnQgdmFsdWU7CisJdV9jaGFyIGNoZWNrc3VtID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBJU1AxMDIwX05WUkFNX0xFTjsgaSsrKSB7CisJCXZhbHVlID0gaXNwMTAyMF9yZWFkX252cmFtX3dvcmQoaG9zdCwgaSk7CisKKwkJc3dpdGNoIChpKSB7CisJCSAgICAgIGNhc2UgMDoKKwkJCWlmICh2YWx1ZSAhPSBJU1AxMDIwX05WUkFNX1NJRzEpIHJldHVybiAwOworCQkJYnJlYWs7CisJCSAgICAgIGNhc2UgMToKKwkJCWlmICh2YWx1ZSAhPSBJU1AxMDIwX05WUkFNX1NJRzIpIHJldHVybiAwOworCQkJYnJlYWs7CisJCSAgICAgIGNhc2UgMjoKKwkJCWlmICgodmFsdWUgJiAweGZmKSAhPSAweDAyKSByZXR1cm4gMDsKKwkJCWJyZWFrOworCQl9CisJCWNoZWNrc3VtICs9IHZhbHVlICYgMHhmZjsKKwkJY2hlY2tzdW0gKz0gdmFsdWUgPj4gODsKKwl9CisKKwlyZXR1cm4gKGNoZWNrc3VtID09IDApOworfQorCisjZGVmaW5lIE5WUkFNX0RFTEFZKCkgdWRlbGF5KDIpIC8qIDIgbWljcm9zZWNvbmQgZGVsYXkgKi8KKworCit1X3Nob3J0IGlzcDEwMjBfcmVhZF9udnJhbV93b3JkKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHVfc2hvcnQgYnl0ZSkKK3sKKwlpbnQgaTsKKwl1X3Nob3J0IHZhbHVlLCBvdXRwdXQsIGlucHV0OworCisJYnl0ZSAmPSAweDNmOyBieXRlIHw9IDB4MDE4MDsKKworCWZvciAoaSA9IDg7IGkgPj0gMDsgaS0tKSB7CisJCW91dHB1dCA9ICgoYnl0ZSA+PiBpKSAmIDB4MSkgPyAweDQgOiAweDA7CisJCWlzcF9vdXR3KG91dHB1dCB8IDB4MiwgaG9zdCwgUENJX05WUkFNKTsgTlZSQU1fREVMQVkoKTsKKwkJaXNwX291dHcob3V0cHV0IHwgMHgzLCBob3N0LCBQQ0lfTlZSQU0pOyBOVlJBTV9ERUxBWSgpOworCQlpc3Bfb3V0dyhvdXRwdXQgfCAweDIsIGhvc3QsIFBDSV9OVlJBTSk7IE5WUkFNX0RFTEFZKCk7CisJfQorCisJZm9yIChpID0gMHhmLCB2YWx1ZSA9IDA7IGkgPj0gMDsgaS0tKSB7CisJCXZhbHVlIDw8PSAxOworCQlpc3Bfb3V0dygweDMsIGhvc3QsIFBDSV9OVlJBTSk7IE5WUkFNX0RFTEFZKCk7CisJCWlucHV0ID0gaXNwX2ludyhob3N0LCBQQ0lfTlZSQU0pOyBOVlJBTV9ERUxBWSgpOworCQlpc3Bfb3V0dygweDIsIGhvc3QsIFBDSV9OVlJBTSk7IE5WUkFNX0RFTEFZKCk7CisJCWlmIChpbnB1dCAmIDB4OCkgdmFsdWUgfD0gMTsKKwl9CisKKwlpc3Bfb3V0dygweDAsIGhvc3QsIFBDSV9OVlJBTSk7IE5WUkFNX0RFTEFZKCk7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKyNlbmRpZiAvKiBVU0VfTlZSQU1fREVGQVVMVFMgKi8KKworCitzdGF0aWMgaW50IGlzcDEwMjBfc2V0X2RlZmF1bHRzKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEgKmhvc3RkYXRhID0KKwkJKHN0cnVjdCBpc3AxMDIwX2hvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhOworCWludCBpOworCisJRU5URVIoImlzcDEwMjBfc2V0X2RlZmF1bHRzIik7CisKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS5maWZvX3RocmVzaG9sZCA9IDI7CisJaG9zdGRhdGEtPmhvc3RfcGFyYW0uaG9zdF9hZGFwdGVyX2VuYWJsZSA9IDE7CisJaG9zdGRhdGEtPmhvc3RfcGFyYW0uaW5pdGlhdG9yX3Njc2lfaWQgPSA3OworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLmJ1c19yZXNldF9kZWxheSA9IDM7CisJaG9zdGRhdGEtPmhvc3RfcGFyYW0ucmV0cnlfY291bnQgPSAwOworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLnJldHJ5X2RlbGF5ID0gMTsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS5hc3luY19kYXRhX3NldHVwX3RpbWUgPSA2OworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLnJlcV9hY2tfYWN0aXZlX25lZ2F0aW9uID0gMTsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS5kYXRhX2xpbmVfYWN0aXZlX25lZ2F0aW9uID0gMTsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS5kYXRhX2RtYV9idXJzdF9lbmFibGUgPSAxOworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLmNvbW1hbmRfZG1hX2J1cnN0X2VuYWJsZSA9IDE7CisJaG9zdGRhdGEtPmhvc3RfcGFyYW0udGFnX2FnaW5nID0gODsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS5zZWxlY3Rpb25fdGltZW91dCA9IDI1MDsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS5tYXhfcXVldWVfZGVwdGggPSAyNTY7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1RBUkdFVFM7IGkrKykgeworCQlob3N0ZGF0YS0+ZGV2X3BhcmFtW2ldLmRldmljZV9mbGFncyA9IDB4ZmQ7CisJCWhvc3RkYXRhLT5kZXZfcGFyYW1baV0uZXhlY3V0aW9uX3Rocm90dGxlID0gMTY7CisJCWhvc3RkYXRhLT5kZXZfcGFyYW1baV0uc3luY2hyb25vdXNfcGVyaW9kID0gMjU7CisJCWhvc3RkYXRhLT5kZXZfcGFyYW1baV0uc3luY2hyb25vdXNfb2Zmc2V0ID0gMTI7CisJCWhvc3RkYXRhLT5kZXZfcGFyYW1baV0uZGV2aWNlX2VuYWJsZSA9IDE7CisJfQorCisJTEVBVkUoImlzcDEwMjBfc2V0X2RlZmF1bHRzIik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGlzcDEwMjBfbG9hZF9wYXJhbWV0ZXJzKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJaW50IGksIGs7CisjaWZkZWYgQ09ORklHX1FMX0lTUF9BNjQKKwl1X2xvbmcgcXVldWVfYWRkcjsKKwl1X3Nob3J0IHBhcmFtWzhdOworI2Vsc2UKKwl1X2ludCBxdWV1ZV9hZGRyOworCXVfc2hvcnQgcGFyYW1bNl07CisjZW5kaWYKKwl1X3Nob3J0IGlzcF9jZmcxLCBod3JldjsKKwlzdHJ1Y3QgaXNwMTAyMF9ob3N0ZGF0YSAqaG9zdGRhdGEgPQorCQkoc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGE7CisKKwlFTlRFUigiaXNwMTAyMF9sb2FkX3BhcmFtZXRlcnMiKTsKKworCWh3cmV2ID0gaXNwX2ludyhob3N0LCBJU1BfQ0ZHMCkgJiBJU1BfQ0ZHMF9IV01TSzsKKwlpc3BfY2ZnMSA9IElTUF9DRkcxX0Y2NCB8IElTUF9DRkcxX0JFTkFCOworCWlmIChod3JldiA9PSBJU1BfQ0ZHMF8xMDQwQSkgeworCQkvKiBCdXN0ZWQgZmlmbywgc2F5cyBtamFjb2IuICovCisJCWlzcF9jZmcxICY9IElTUF9DRkcxX0JFTkFCOworCX0KKworCWlzcF9vdXR3KGlzcF9pbncoaG9zdCwgSVNQX0NGRzEpIHwgaXNwX2NmZzEsIGhvc3QsIElTUF9DRkcxKTsKKwlpc3Bfb3V0dyhpc3BfaW53KGhvc3QsIENETUFfQ09ORikgfCBETUFfQ09ORl9CRU5BQiwgaG9zdCwgQ0RNQV9DT05GKTsKKwlpc3Bfb3V0dyhpc3BfaW53KGhvc3QsIERETUFfQ09ORikgfCBETUFfQ09ORl9CRU5BQiwgaG9zdCwgRERNQV9DT05GKTsKKworCXBhcmFtWzBdID0gTUJPWF9TRVRfSU5JVF9TQ1NJX0lEOworCXBhcmFtWzFdID0gaG9zdGRhdGEtPmhvc3RfcGFyYW0uaW5pdGlhdG9yX3Njc2lfaWQ7CisKKwlpc3AxMDIwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisKKwlpZiAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCXByaW50aygicWxvZ2ljaXNwIDogc2V0IGluaXRpYXRvciBpZCBmYWlsdXJlXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcGFyYW1bMF0gPSBNQk9YX1NFVF9SRVRSWV9DT1VOVDsKKwlwYXJhbVsxXSA9IGhvc3RkYXRhLT5ob3N0X3BhcmFtLnJldHJ5X2NvdW50OworCXBhcmFtWzJdID0gaG9zdGRhdGEtPmhvc3RfcGFyYW0ucmV0cnlfZGVsYXk7CisKKwlpc3AxMDIwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisKKwlpZiAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCXByaW50aygicWxvZ2ljaXNwIDogc2V0IHJldHJ5IGNvdW50IGZhaWx1cmVcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlwYXJhbVswXSA9IE1CT1hfU0VUX0FTWU5DX0RBVEFfU0VUVVBfVElNRTsKKwlwYXJhbVsxXSA9IGhvc3RkYXRhLT5ob3N0X3BhcmFtLmFzeW5jX2RhdGFfc2V0dXBfdGltZTsKKworCWlzcDEwMjBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiBhc3luYyBkYXRhIHNldHVwIHRpbWUgZmFpbHVyZVxuIik7CisJCXJldHVybiAxOworCX0KKworCXBhcmFtWzBdID0gTUJPWF9TRVRfQUNUSVZFX05FR19TVEFURTsKKwlwYXJhbVsxXSA9IChob3N0ZGF0YS0+aG9zdF9wYXJhbS5yZXFfYWNrX2FjdGl2ZV9uZWdhdGlvbiA8PCA0KQorCQl8IChob3N0ZGF0YS0+aG9zdF9wYXJhbS5kYXRhX2xpbmVfYWN0aXZlX25lZ2F0aW9uIDw8IDUpOworCisJaXNwMTAyMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCisJaWYgKHBhcmFtWzBdICE9IE1CT1hfQ09NTUFORF9DT01QTEVURSkgeworCQlwcmludGsoInFsb2dpY2lzcCA6IHNldCBhY3RpdmUgbmVnYXRpb24gc3RhdGUgZmFpbHVyZVxuIik7CisJCXJldHVybiAxOworCX0KKworCXBhcmFtWzBdID0gTUJPWF9TRVRfUENJX0NPTlRST0xfUEFSQU1TOworCXBhcmFtWzFdID0gaG9zdGRhdGEtPmhvc3RfcGFyYW0uZGF0YV9kbWFfYnVyc3RfZW5hYmxlIDw8IDE7CisJcGFyYW1bMl0gPSBob3N0ZGF0YS0+aG9zdF9wYXJhbS5jb21tYW5kX2RtYV9idXJzdF9lbmFibGUgPDwgMTsKKworCWlzcDEwMjBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiBzZXQgcGNpIGNvbnRyb2wgcGFyYW1ldGVyIGZhaWx1cmVcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlwYXJhbVswXSA9IE1CT1hfU0VUX1RBR19BR0VfTElNSVQ7CisJcGFyYW1bMV0gPSBob3N0ZGF0YS0+aG9zdF9wYXJhbS50YWdfYWdpbmc7CisKKwlpc3AxMDIwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisKKwlpZiAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCXByaW50aygicWxvZ2ljaXNwIDogc2V0IHRhZyBhZ2UgbGltaXQgZmFpbHVyZVxuIik7CisJCXJldHVybiAxOworCX0KKworCXBhcmFtWzBdID0gTUJPWF9TRVRfU0VMRUNUX1RJTUVPVVQ7CisJcGFyYW1bMV0gPSBob3N0ZGF0YS0+aG9zdF9wYXJhbS5zZWxlY3Rpb25fdGltZW91dDsKKworCWlzcDEwMjBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiBzZXQgc2VsZWN0aW9uIHRpbWVvdXQgZmFpbHVyZVxuIik7CisJCXJldHVybiAxOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNQVhfVEFSR0VUUzsgaSsrKSB7CisKKwkJaWYgKCFob3N0ZGF0YS0+ZGV2X3BhcmFtW2ldLmRldmljZV9lbmFibGUpCisJCQljb250aW51ZTsKKworCQlwYXJhbVswXSA9IE1CT1hfU0VUX1RBUkdFVF9QQVJBTVM7CisJCXBhcmFtWzFdID0gaSA8PCA4OworCQlwYXJhbVsyXSA9IGhvc3RkYXRhLT5kZXZfcGFyYW1baV0uZGV2aWNlX2ZsYWdzIDw8IDg7CisJCXBhcmFtWzNdID0gKGhvc3RkYXRhLT5kZXZfcGFyYW1baV0uc3luY2hyb25vdXNfb2Zmc2V0IDw8IDgpCisJCQl8IGhvc3RkYXRhLT5kZXZfcGFyYW1baV0uc3luY2hyb25vdXNfcGVyaW9kOworCisJCWlzcDEwMjBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCQlpZiAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCQlwcmludGsoInFsb2dpY2lzcCA6IHNldCB0YXJnZXQgcGFyYW1ldGVyIGZhaWx1cmVcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlmb3IgKGsgPSAwOyBrIDwgTUFYX0xVTlM7IGsrKykgeworCisJCQlwYXJhbVswXSA9IE1CT1hfU0VUX0RFVl9RVUVVRV9QQVJBTVM7CisJCQlwYXJhbVsxXSA9IChpIDw8IDgpIHwgazsKKwkJCXBhcmFtWzJdID0gaG9zdGRhdGEtPmhvc3RfcGFyYW0ubWF4X3F1ZXVlX2RlcHRoOworCQkJcGFyYW1bM10gPSBob3N0ZGF0YS0+ZGV2X3BhcmFtW2ldLmV4ZWN1dGlvbl90aHJvdHRsZTsKKworCQkJaXNwMTAyMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCisJCQlpZiAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCQkJcHJpbnRrKCJxbG9naWNpc3AgOiBzZXQgZGV2aWNlIHF1ZXVlICIKKwkJCQkgICAgICAgInBhcmFtZXRlciBmYWlsdXJlXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKworCXF1ZXVlX2FkZHIgPSBob3N0ZGF0YS0+cmVzX2RtYTsKKyNpZmRlZiBDT05GSUdfUUxfSVNQX0E2NAorCXBhcmFtWzBdID0gTUJPWF9DTURfSU5JVF9SRVNQT05TRV9RVUVVRV82NDsKKyNlbHNlCisJcGFyYW1bMF0gPSBNQk9YX0lOSVRfUkVTX1FVRVVFOworI2VuZGlmCisJcGFyYW1bMV0gPSBSRVNfUVVFVUVfTEVOICsgMTsKKwlwYXJhbVsyXSA9ICh1X3Nob3J0KSAocXVldWVfYWRkciA+PiAxNik7CisJcGFyYW1bM10gPSAodV9zaG9ydCkgKHF1ZXVlX2FkZHIgJiAweGZmZmYpOworCXBhcmFtWzRdID0gMDsKKwlwYXJhbVs1XSA9IDA7CisjaWZkZWYgQ09ORklHX1FMX0lTUF9BNjQKKwlwYXJhbVs2XSA9ICh1X3Nob3J0KSAocXVldWVfYWRkciA+PiA0OCk7CisJcGFyYW1bN10gPSAodV9zaG9ydCkgKHF1ZXVlX2FkZHIgPj4gMzIpOworI2VuZGlmCisKKwlpc3AxMDIwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisKKwlpZiAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCXByaW50aygicWxvZ2ljaXNwIDogc2V0IHJlc3BvbnNlIHF1ZXVlIGZhaWx1cmVcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlxdWV1ZV9hZGRyID0gaG9zdGRhdGEtPnJlcV9kbWE7CisjaWZkZWYgQ09ORklHX1FMX0lTUF9BNjQKKwlwYXJhbVswXSA9IE1CT1hfQ01EX0lOSVRfUkVRVUVTVF9RVUVVRV82NDsKKyNlbHNlCisJcGFyYW1bMF0gPSBNQk9YX0lOSVRfUkVRX1FVRVVFOworI2VuZGlmCisJcGFyYW1bMV0gPSBRTE9HSUNJU1BfUkVRX1FVRVVFX0xFTiArIDE7CisJcGFyYW1bMl0gPSAodV9zaG9ydCkgKHF1ZXVlX2FkZHIgPj4gMTYpOworCXBhcmFtWzNdID0gKHVfc2hvcnQpIChxdWV1ZV9hZGRyICYgMHhmZmZmKTsKKwlwYXJhbVs0XSA9IDA7CisKKyNpZmRlZiBDT05GSUdfUUxfSVNQX0E2NAorCXBhcmFtWzVdID0gMDsKKwlwYXJhbVs2XSA9ICh1X3Nob3J0KSAocXVldWVfYWRkciA+PiA0OCk7CisJcGFyYW1bN10gPSAodV9zaG9ydCkgKHF1ZXVlX2FkZHIgPj4gMzIpOworI2VuZGlmCisKKwlpc3AxMDIwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisKKwlpZiAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCXByaW50aygicWxvZ2ljaXNwIDogc2V0IHJlcXVlc3QgcXVldWUgZmFpbHVyZVxuIik7CisJCXJldHVybiAxOworCX0KKworCUxFQVZFKCJpc3AxMDIwX2xvYWRfcGFyYW1ldGVycyIpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIGN1cnJlbnRseSwgdGhpcyBpcyBvbmx5IGNhbGxlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gb3IgYWJvcnQvcmVzZXQsCisgKiBhdCB3aGljaCB0aW1lcyBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwgc28gcG9sbGluZyBpcyBPSywgSSBndWVzcy4uLgorICovCitzdGF0aWMgaW50IGlzcDEwMjBfbWJveF9jb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHVfc2hvcnQgcGFyYW1bXSkKK3sKKwlpbnQgbG9vcF9jb3VudDsKKworCWlmIChtYm94X3BhcmFtW3BhcmFtWzBdXSA9PSAwKQorCQlyZXR1cm4gMTsKKworCWxvb3BfY291bnQgPSBERUZBVUxUX0xPT1BfQ09VTlQ7CisJd2hpbGUgKC0tbG9vcF9jb3VudCAmJiBpc3BfaW53KGhvc3QsIEhPU1RfSENDUikgJiAweDAwODApIHsKKwkJYmFycmllcigpOworCQljcHVfcmVsYXgoKTsKKwl9CisJaWYgKCFsb29wX2NvdW50KQorCQlwcmludGsoInFsb2dpY2lzcDogbWJveF9jb21tYW5kIGxvb3AgdGltZW91dCAjMVxuIik7CisKKwlzd2l0Y2gobWJveF9wYXJhbVtwYXJhbVswXV0gPj4gNCkgeworCSAgICAgIGNhc2UgODogaXNwX291dHcocGFyYW1bN10sIGhvc3QsIE1CT1g3KTsKKwkgICAgICBjYXNlIDc6IGlzcF9vdXR3KHBhcmFtWzZdLCBob3N0LCBNQk9YNik7CisJICAgICAgY2FzZSA2OiBpc3Bfb3V0dyhwYXJhbVs1XSwgaG9zdCwgTUJPWDUpOworCSAgICAgIGNhc2UgNTogaXNwX291dHcocGFyYW1bNF0sIGhvc3QsIE1CT1g0KTsKKwkgICAgICBjYXNlIDQ6IGlzcF9vdXR3KHBhcmFtWzNdLCBob3N0LCBNQk9YMyk7CisJICAgICAgY2FzZSAzOiBpc3Bfb3V0dyhwYXJhbVsyXSwgaG9zdCwgTUJPWDIpOworCSAgICAgIGNhc2UgMjogaXNwX291dHcocGFyYW1bMV0sIGhvc3QsIE1CT1gxKTsKKwkgICAgICBjYXNlIDE6IGlzcF9vdXR3KHBhcmFtWzBdLCBob3N0LCBNQk9YMCk7CisJfQorCisJaXNwX291dHcoMHgwLCBob3N0LCBQQ0lfU0VNQVBIT1JFKTsKKwlpc3Bfb3V0dyhIQ0NSX0NMRUFSX1JJU0NfSU5UUiwgaG9zdCwgSE9TVF9IQ0NSKTsKKwlpc3Bfb3V0dyhIQ0NSX1NFVF9IT1NUX0lOVFIsIGhvc3QsIEhPU1RfSENDUik7CisKKwlsb29wX2NvdW50ID0gREVGQVVMVF9MT09QX0NPVU5UOworCXdoaWxlICgtLWxvb3BfY291bnQgJiYgIShpc3BfaW53KGhvc3QsIFBDSV9JTlRGX1NUUykgJiAweDA0KSkgeworCQliYXJyaWVyKCk7CisJCWNwdV9yZWxheCgpOworCX0KKwlpZiAoIWxvb3BfY291bnQpCisJCXByaW50aygicWxvZ2ljaXNwOiBtYm94X2NvbW1hbmQgbG9vcCB0aW1lb3V0ICMyXG4iKTsKKworCWxvb3BfY291bnQgPSBERUZBVUxUX0xPT1BfQ09VTlQ7CisJd2hpbGUgKC0tbG9vcF9jb3VudCAmJiBpc3BfaW53KGhvc3QsIE1CT1gwKSA9PSAweDA0KSB7CisJCWJhcnJpZXIoKTsKKwkJY3B1X3JlbGF4KCk7CisJfQorCWlmICghbG9vcF9jb3VudCkKKwkJcHJpbnRrKCJxbG9naWNpc3A6IG1ib3hfY29tbWFuZCBsb29wIHRpbWVvdXQgIzNcbiIpOworCisJc3dpdGNoKG1ib3hfcGFyYW1bcGFyYW1bMF1dICYgMHhmKSB7CisJICAgICAgY2FzZSA4OiBwYXJhbVs3XSA9IGlzcF9pbncoaG9zdCwgTUJPWDcpOworCSAgICAgIGNhc2UgNzogcGFyYW1bNl0gPSBpc3BfaW53KGhvc3QsIE1CT1g2KTsKKwkgICAgICBjYXNlIDY6IHBhcmFtWzVdID0gaXNwX2ludyhob3N0LCBNQk9YNSk7CisJICAgICAgY2FzZSA1OiBwYXJhbVs0XSA9IGlzcF9pbncoaG9zdCwgTUJPWDQpOworCSAgICAgIGNhc2UgNDogcGFyYW1bM10gPSBpc3BfaW53KGhvc3QsIE1CT1gzKTsKKwkgICAgICBjYXNlIDM6IHBhcmFtWzJdID0gaXNwX2ludyhob3N0LCBNQk9YMik7CisJICAgICAgY2FzZSAyOiBwYXJhbVsxXSA9IGlzcF9pbncoaG9zdCwgTUJPWDEpOworCSAgICAgIGNhc2UgMTogcGFyYW1bMF0gPSBpc3BfaW53KGhvc3QsIE1CT1gwKTsKKwl9CisKKwlpc3Bfb3V0dygweDAsIGhvc3QsIFBDSV9TRU1BUEhPUkUpOworCWlzcF9vdXR3KEhDQ1JfQ0xFQVJfUklTQ19JTlRSLCBob3N0LCBIT1NUX0hDQ1IpOworCisJcmV0dXJuIDA7Cit9CisKKworI2lmIERFQlVHX0lTUDEwMjBfSU5UUgorCit2b2lkIGlzcDEwMjBfcHJpbnRfc3RhdHVzX2VudHJ5KHN0cnVjdCBTdGF0dXNfRW50cnkgKnN0YXR1cykKK3sKKwlpbnQgaTsKKworCXByaW50aygicWxvZ2ljaXNwIDogZW50cnkgY291bnQgPSAweCUwMngsIHR5cGUgPSAweCUwMngsIGZsYWdzID0gMHglMDJ4XG4iLAorCSAgICAgICBzdGF0dXMtPmhkci5lbnRyeV9jbnQsIHN0YXR1cy0+aGRyLmVudHJ5X3R5cGUsIHN0YXR1cy0+aGRyLmZsYWdzKTsKKwlwcmludGsoInFsb2dpY2lzcCA6IHNjc2kgc3RhdHVzID0gMHglMDR4LCBjb21wbGV0aW9uIHN0YXR1cyA9IDB4JTA0eFxuIiwKKwkgICAgICAgbGUxNl90b19jcHUoc3RhdHVzLT5zY3NpX3N0YXR1cyksIGxlMTZfdG9fY3B1KHN0YXR1cy0+Y29tcGxldGlvbl9zdGF0dXMpKTsKKwlwcmludGsoInFsb2dpY2lzcCA6IHN0YXRlIGZsYWdzID0gMHglMDR4LCBzdGF0dXMgZmxhZ3MgPSAweCUwNHhcbiIsCisJICAgICAgIGxlMTZfdG9fY3B1KHN0YXR1cy0+c3RhdGVfZmxhZ3MpLCBsZTE2X3RvX2NwdShzdGF0dXMtPnN0YXR1c19mbGFncykpOworCXByaW50aygicWxvZ2ljaXNwIDogdGltZSA9IDB4JTA0eCwgcmVxdWVzdCBzZW5zZSBsZW5ndGggPSAweCUwNHhcbiIsCisJICAgICAgIGxlMTZfdG9fY3B1KHN0YXR1cy0+dGltZSksIGxlMTZfdG9fY3B1KHN0YXR1cy0+cmVxX3NlbnNlX2xlbikpOworCXByaW50aygicWxvZ2ljaXNwIDogcmVzaWR1YWwgdHJhbnNmZXIgbGVuZ3RoID0gMHglMDh4XG4iLAorCSAgICAgICBsZTMyX3RvX2NwdShzdGF0dXMtPnJlc2lkdWFsKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGUxNl90b19jcHUoc3RhdHVzLT5yZXFfc2Vuc2VfbGVuKTsgaSsrKQorCQlwcmludGsoInFsb2dpY2lzcCA6IHNlbnNlIGRhdGEgPSAweCUwMnhcbiIsIHN0YXR1cy0+cmVxX3NlbnNlX2RhdGFbaV0pOworfQorCisjZW5kaWYgLyogREVCVUdfSVNQMTAyMF9JTlRSICovCisKKworI2lmIERFQlVHX0lTUDEwMjAKKwordm9pZCBpc3AxMDIwX3ByaW50X3Njc2lfY21kKFNjc2lfQ21uZCAqY21kKQoreworCWludCBpOworCisJcHJpbnRrKCJxbG9naWNpc3AgOiB0YXJnZXQgPSAweCUwMngsIGx1biA9IDB4JTAyeCwgY21kX2xlbiA9IDB4JTAyeFxuIiwKKwkgICAgICAgY21kLT50YXJnZXQsIGNtZC0+bHVuLCBjbWQtPmNtZF9sZW4pOworCXByaW50aygicWxvZ2ljaXNwIDogY29tbWFuZCA9ICIpOworCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNtZF9sZW47IGkrKykKKwkJcHJpbnRrKCIweCUwMnggIiwgY21kLT5jbW5kW2ldKTsKKwlwcmludGsoIlxuIik7Cit9CisKKyNlbmRpZiAvKiBERUJVR19JU1AxMDIwICovCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLmRldGVjdAkJCT0gaXNwMTAyMF9kZXRlY3QsCisJLnJlbGVhc2UJCT0gaXNwMTAyMF9yZWxlYXNlLAorCS5pbmZvCQkJPSBpc3AxMDIwX2luZm8sCQorCS5xdWV1ZWNvbW1hbmQJCT0gaXNwMTAyMF9xdWV1ZWNvbW1hbmQsCisJLmJpb3NfcGFyYW0JCT0gaXNwMTAyMF9iaW9zcGFyYW0sCisJLmNhbl9xdWV1ZQkJPSBRTE9HSUNJU1BfUkVRX1FVRVVFX0xFTiwKKwkudGhpc19pZAkJPSAtMSwKKwkuc2dfdGFibGVzaXplCQk9IFFMT0dJQ0lTUF9NQVhfU0coUUxPR0lDSVNQX1JFUV9RVUVVRV9MRU4pLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxvZ2ljaXNwX2FzbS5jIGIvZHJpdmVycy9zY3NpL3Fsb2dpY2lzcF9hc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWE0YmVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Fsb2dpY2lzcF9hc20uYwpAQCAtMCwwICsxLDIwMzQgQEAKKy8qCisgKiAgICAgIEZpcm13YXJlIFZlcnNpb24gNy42My4wMCAoMTI6MDcgSmFuIDI3LCAxOTk5KQorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgcmlzY19jb2RlX3ZlcnNpb24gPSA3KjEwMjQrNjM7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfYWRkcjAxID0gMHgxMDAwIDsKKworI2lmIFJFTE9BRF9GSVJNV0FSRQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgcmlzY19jb2RlMDFbXSA9IHsKKwkweDAwNzgsIDB4MTAzYSwgMHgwMDAwLCAweDNmMTQsIDB4MDAwMCwgMHgyMDQzLCAweDRmNTAsIDB4NTk1MiwKKwkweDQ5NDcsIDB4NDg1NCwgMHgyMDMxLCAweDM5MzksIDB4MzUyMCwgMHg1MTRjLCAweDRmNDcsIDB4NDk0MywKKwkweDIwNDMsIDB4NGY1MiwgMHg1MDRmLCAweDUyNDEsIDB4NTQ0OSwgMHg0ZjRlLCAweDIwNDksIDB4NTM1MCwKKwkweDMxMzAsIDB4MzIzMCwgMHgyMDQ5LCAweDJmNTQsIDB4MjA0NiwgMHg2OTcyLCAweDZkNzcsIDB4NjE3MiwKKwkweDY1MjAsIDB4MjA1NiwgMHg2NTcyLCAweDczNjksIDB4NmY2ZSwgMHgyMDMwLCAweDM3MmUsIDB4MzYzMywKKwkweDIwMjAsIDB4MjA0MywgMHg3NTczLCAweDc0NmYsIDB4NmQ2NSwgMHg3MjIwLCAweDRlNmYsIDB4MmUyMCwKKwkweDMwMzAsIDB4MjA1MCwgMHg3MjZmLCAweDY0NzUsIDB4NjM3NCwgMHgyMDRlLCAweDZmMmUsIDB4MjAyMCwKKwkweDMwMzEsIDB4MjAyNCwgMHgyMDAxLCAweDA0ZmQsIDB4MjAwNCwgMHhhMDgyLCAweDAwMDUsIDB4MDA0OCwKKwkweDEwNDUsIDB4MDAzOCwgMHgxMDRiLCAweDAwNzgsIDB4MTA0NywgMHgwMDI4LCAweDEwNGIsIDB4MjBiOSwKKwkweDEyMTIsIDB4MDA3OCwgMHgxMDRkLCAweDIwYjksIDB4MjIyMiwgMHgyMGMxLCAweDAwMDgsIDB4MjA3MSwKKwkweDAwMTAsIDB4NzBjMywgMHgwMDA0LCAweDIwYzksIDB4NzZmZiwgMHgyMDg5LCAweDExODYsIDB4NzBjNywKKwkweDQ5NTMsIDB4NzBjYiwgMHg1MDIwLCAweDcwY2YsIDB4MjAyMCwgMHg3MGQzLCAweDAwMDcsIDB4M2YwMCwKKwkweDcwZDYsIDB4MjBjMSwgMHgwMDA4LCAweDIwMTksIDB4MDAwMCwgMHgyMDA5LCAweGZlZmYsIDB4MjEwMCwKKwkweDIwMGIsIDB4YTVhNSwgMHhhMWVjLCAweDdmZmYsIDB4MmQ2NCwgMHgyMDZiLCAweDBhMGEsIDB4YWRkYywKKwkweDNmZmYsIDB4MmI1NCwgMHgyMDViLCAweDUwNTAsIDB4MjExNCwgMHhhMjg2LCAweGE1YTUsIDB4MDA0MCwKKwkweDEwYmYsIDB4YTM4NiwgMHgwMDBmLCAweDAwNDAsIDB4MTA4NSwgMHgyYzZhLCAweDJhNWEsIDB4MjBjMSwKKwkweDAwMDAsIDB4MjAxOSwgMHgwMDBmLCAweDAwNzgsIDB4MTA2NSwgMHgyYzZhLCAweDJhNWEsIDB4MjBjMSwKKwkweDAwMDgsIDB4MjAwOSwgMHg3ZmZmLCAweDIxNDgsIDB4Mjk0NCwgMHgyMDRiLCAweDBhMGEsIDB4YTliYywKKwkweDNmZmYsIDB4MjczNCwgMHgyMDNiLCAweDUwNTAsIDB4MjExNCwgMHhhMjg2LCAweDBhMGEsIDB4MDA0MCwKKwkweDEwYTksIDB4Mjg0YSwgMHgyNjNhLCAweDIwYzEsIDB4MDAwNCwgMHgyMDA5LCAweDNmZmYsIDB4MjEzNCwKKwkweDIwMGIsIDB4NTA1MCwgMHgyMTE0LCAweGEyODYsIDB4NTA1MCwgMHgwMDQwLCAweDEwYWEsIDB4MDA3OCwKKwkweDExOGUsIDB4Mjg0YSwgMHgyNjNhLCAweDk4YzAsIDB4YTE4OCwgMHgxMDAwLCAweDIxMmMsIDB4MjAwYiwKKwkweGE1YTUsIDB4MjExNCwgMHhhMjg2LCAweGE1YTUsIDB4MDA0MCwgMHgxMGJjLCAweDI1MGEsIDB4YTE4YSwKKwkweDEwMDAsIDB4OThjMSwgMHgwMDc4LCAweDEwYzEsIDB4MjUwYSwgMHgwMDc4LCAweDEwYzEsIDB4MmM2YSwKKwkweDJhNWEsIDB4MjEzMCwgMHhhMThhLCAweDAwNDAsIDB4MjEyOCwgMHhhMWEyLCAweDUwMDAsIDB4ODQyNCwKKwkweDg0MjQsIDB4ODQyNCwgMHg4NDI0LCAweDg0MjQsIDB4ODQyNCwgMHhhMTkyLCAweDc3MDAsIDB4MjAwOSwKKwkweDAwMDAsIDB4MjAwMSwgMHgwMDMxLCAweDEwNzgsIDB4MWM5ZCwgMHgyMjE4LCAweDIwNzksIDB4NTAwMCwKKwkweDJmYTAsIDB4MjQwOCwgMHgyMDExLCAweDAwMDAsIDB4MjBhOSwgMHgwMDQwLCAweDQyYTQsIDB4ODEwOSwKKwkweDAwYzAsIDB4MTBkYywgMHg3ZWYyLCAweDg1MjgsIDB4N2RlNiwgMHg3Y2VhLCAweDdiZWUsIDB4Nzg4MywKKwkweDAwMDAsIDB4MjAzMSwgMHgwMDMwLCAweDc4Y2YsIDB4MDEwMSwgMHg3ODBiLCAweDAwMDIsIDB4NzgwZiwKKwkweDAwMDIsIDB4Nzg0ZiwgMHgwMDAzLCAweDIwNjksIDB4NTA0MCwgMHgyMDAxLCAweDA0ZmQsIDB4MjAwNCwKKwkweGEwODIsIDB4MDAwNSwgMHgwMDQ4LCAweDExMDQsIDB4MDAzOCwgMHgxMTAwLCAweDAwNzgsIDB4MTEwOCwKKwkweDY4MWIsIDB4MDAzYywgMHgwMDc4LCAweDExMGEsIDB4MDBhOCwgMHgxMTA4LCAweDY4MWIsIDB4MDAzYywKKwkweDY4MWIsIDB4MDAyOCwgMHg2ODA3LCAweDAwMDcsIDB4NjgwYiwgMHgwMGZhLCAweDY4MGYsIDB4MDAwOCwKKwkweDY4MTMsIDB4MDAwNSwgMHg2ODIzLCAweDAwMDAsIDB4NjgyNywgMHgwMDA2LCAweDY4MTcsIDB4MDAwOCwKKwkweDY4MmIsIDB4MDAwMCwgMHg2ODFmLCAweDAwMTksIDB4MjA2OSwgMHg1MjgwLCAweDIwMTEsIDB4MDAyMCwKKwkweDIwMDksIDB4MDAxMCwgMHg2ODBiLCAweDA4MGMsIDB4NjgwZiwgMHgwMDE5LCAweDY4MDMsIDB4ZmQwMCwKKwkweDY4MDcsIDB4MDAxOCwgMHg2YTFhLCAweDJkMDAsIDB4YTBlOCwgMHgwMDA4LCAweGEyOTAsIDB4MDAwNCwKKwkweDgxMDksIDB4MDBjMCwgMHgxMTIyLCAweDIwNjksIDB4NTMwMCwgMHgyMDA5LCAweDAwMDIsIDB4MjBhOSwKKwkweDAxMDAsIDB4NjgzNywgMHgwMDAwLCAweDY4MGIsIDB4MDA0MCwgMHg3YmYwLCAweGEzODYsIDB4ZmVmZiwKKwkweDAwYzAsIDB4MTE0OCwgMHg2ODE3LCAweDAxMDAsIDB4NjgxZiwgMHgwMDY0LCAweDAwNzgsIDB4MTE0YywKKwkweDY4MTcsIDB4MDA2NCwgMHg2ODFmLCAweDAwMDIsIDB4YWRlOCwgMHgwMDEwLCAweDAwNzAsIDB4MTE1MiwKKwkweDAwNzgsIDB4MTEzOSwgMHg4MTA5LCAweDAwYzAsIDB4MTEzNywgMHgxMDc4LCAweDIxZTksIDB4MTA3OCwKKwkweDQ2ZTksIDB4MTA3OCwgMHgxOTQ2LCAweDEwNzgsIDB4NGJkZiwgMHgzMjAwLCAweGEwODUsIDB4MDAwZCwKKwkweDIwOTAsIDB4NzBjMywgMHgwMDAwLCAweDAwOTAsIDB4MTE2YywgMHg3MGMwLCAweGEwODYsIDB4MDAwMiwKKwkweDAwYzAsIDB4MTE2YywgMHgxMDc4LCAweDEyODQsIDB4MTA3OCwgMHgxMTk2LCAweDc4Y2MsIDB4YTAwNSwKKwkweDAwYzAsIDB4MTE3YSwgMHgxMDc4LCAweDFjYzYsIDB4MDAxMCwgMHgxMTgwLCAweDAwNjgsIDB4MTE4MCwKKwkweDEwNzgsIDB4MjBjOCwgMHgwMDEwLCAweDExODAsIDB4MDA2OCwgMHgxMTgwLCAweDEwNzgsIDB4MWEyYiwKKwkweDAwZTAsIDB4MTE2YywgMHgxMDc4LCAweDRhNjYsIDB4MDA3OCwgMHgxMTZjLCAweDExOGUsIDB4MTE5MCwKKwkweDIzZWEsIDB4MjNlYSwgMHg0NzZhLCAweDQ3NmEsIDB4MjNlYSwgMHgyM2VhLCAweDAwNzgsIDB4MTE4ZSwKKwkweDAwNzgsIDB4MTE5MCwgMHgwMDc4LCAweDExOTIsIDB4MDA3OCwgMHgxMTk0LCAweDAwNjgsIDB4MTIwMSwKKwkweDIwNjEsIDB4MDAwMCwgMHg2MDE4LCAweGEwODQsIDB4MDAwMSwgMHgwMGMwLCAweDEyMDEsIDB4NzgxNCwKKwkweGEwMDUsIDB4MDBjMCwgMHgxMWE3LCAweDAwMTAsIDB4MTIwMiwgMHgwMDc4LCAweDEyMDEsIDB4MjAwOSwKKwkweDUwNWIsIDB4MjEwNCwgMHhhMDA1LCAweDAwYzAsIDB4MTIwMSwgMHgyMDA5LCAweDUwNjQsIDB4MjAwYiwKKwkweDAwMDAsIDB4NzkxNCwgMHhhMTg2LCAweDAwNDIsIDB4MDBjMCwgMHgxMWNjLCAweDc4MTYsIDB4MjAwOSwKKwkweDUwNjIsIDB4MjE2NCwgMHgyMDBiLCAweDAwMDAsIDB4NjAxOCwgMHg3MGM2LCAweDYwMTQsIDB4NzBjYSwKKwkweDYxMWMsIDB4YTE4YywgMHhmZjAwLCAweDYwMjAsIDB4YTA4NCwgMHgwMGZmLCAweGExMDUsIDB4NzBjZSwKKwkweDEwNzgsIDB4MTkyYiwgMHgwMDc4LCAweDExZmYsIDB4NzgxNCwgMHhhMDg2LCAweDAwMTgsIDB4MDBjMCwKKwkweDExZDMsIDB4MTA3OCwgMHgxNjVhLCAweDc4MTcsIDB4MDAwMCwgMHgyMDA5LCAweDUwNjIsIDB4MjEwNCwKKwkweGEwNjUsIDB4MDA0MCwgMHgxMWVmLCAweDBjN2UsIDB4NjA5YywgMHgyMDYwLCAweDEwNzgsIDB4MTk5NiwKKwkweDBjN2YsIDB4NjA5ZiwgMHgwMDAwLCAweDEwNzgsIDB4MTczMCwgMHgyMDA5LCAweDAwMGMsIDB4NjAwNywKKwkweDAxMDMsIDB4MTA3OCwgMHgxOTA3LCAweDAwYzAsIDB4MTFmYiwgMHgxMDc4LCAweDE5MmIsIDB4MjAwOSwKKwkweDUwNjIsIDB4MjAwYiwgMHgwMDAwLCAweDIwMDksIDB4NTA1YywgMHgyMTA0LCAweDIwMGIsIDB4MDAwMCwKKwkweGEwMDUsIDB4MDA0MCwgMHgxMWZmLCAweDIwMDEsIDB4NDAwNSwgMHgwMDc4LCAweDEyODYsIDB4MDA3OCwKKwkweDEyODQsIDB4MDA3YywgMHg3MGMzLCAweDAwMDAsIDB4NzBjNywgMHgwMDAwLCAweDcwY2IsIDB4MDAwMCwKKwkweDcwY2YsIDB4MDAwMCwgMHg3MGMwLCAweGEwYmMsIDB4ZmZjMCwgMHgwMGMwLCAweDEyNTIsIDB4MjAzOCwKKwkweDAwNzksIDB4MTIxMiwgMHgxMjg0LCAweDEyZTUsIDB4MTJhOSwgMHgxMmZlLCAweDEzMGQsIDB4MTMxMywKKwkweDEyYTAsIDB4MTc0OCwgMHgxMzE3LCAweDEyOTgsIDB4MTJhZCwgMHgxMmFmLCAweDEyYjEsIDB4MTJiMywKKwkweDE3NGQsIDB4MTI5OCwgMHgxMzI5LCAweDEzNjAsIDB4MTY3MiwgMHgxNzQyLCAweDEyYjUsIDB4MTU5MSwKKwkweDE1YWQsIDB4MTVjOSwgMHgxNWY0LCAweDE1NGEsIDB4MTU1OCwgMHgxNTZjLCAweDE1ODAsIDB4MTNkZiwKKwkweDEyOTgsIDB4MTM4ZCwgMHgxMzkzLCAweDEzOTgsIDB4MTM5ZCwgMHgxM2EzLCAweDEzYTgsIDB4MTNhZCwKKwkweDEzYjIsIDB4MTNiNywgMHgxM2JiLCAweDEzZDAsIDB4MTNkYywgMHgxMjk4LCAweDEyOTgsIDB4MTI5OCwKKwkweDEyOTgsIDB4MTNlYiwgMHgxM2Y0LCAweDE0MDMsIDB4MTQyOSwgMHgxNDMzLCAweDE0M2EsIDB4MTQ4MCwKKwkweDE0OGYsIDB4MTQ5ZSwgMHgxNGIwLCAweDE1MmEsIDB4MTUzYSwgMHgxMjk4LCAweDEyOTgsIDB4MTI5OCwKKwkweDEyOTgsIDB4MTUzZiwgMHhhMGJjLCAweGZmYTAsIDB4MDBjMCwgMHgxMjk4LCAweDIwMzgsIDB4YTA4NCwKKwkweDAwMWYsIDB4MDA3OSwgMHgxMjViLCAweDE3ODYsIDB4MTc4OSwgMHgxNzk5LCAweDEyOTgsIDB4MTI5OCwKKwkweDE4ZDgsIDB4MThmNSwgMHgxMjk4LCAweDEyOTgsIDB4MTI5OCwgMHgxOGY5LCAweDE5MDEsIDB4MTI5OCwKKwkweDEyOTgsIDB4MTI5OCwgMHgxMjk4LCAweDEyZGIsIDB4MTJmNCwgMHgxMzFmLCAweDEzNTYsIDB4MTY2OCwKKwkweDE3NjQsIDB4MTc3OCwgMHgxMjk4LCAweDE4MjksIDB4MTI5OCwgMHgxOGI0LCAweDE4YmUsIDB4MThjMiwKKwkweDE4ZDAsIDB4MTI5OCwgMHgxMjk4LCAweDcyY2EsIDB4NzFjNiwgMHgyMDAxLCAweDQwMDYsIDB4MDA3OCwKKwkweDEyODYsIDB4NzNjZSwgMHg3MmNhLCAweDcxYzYsIDB4MjAwMSwgMHg0MDAwLCAweDcwYzIsIDB4MDA2OCwKKwkweDEyODcsIDB4MjA2MSwgMHgwMDAwLCAweDYwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDUwMDAsIDB4MDBlMCwKKwkweDEyOGYsIDB4MDBlMCwgMHgxMjkxLCAweDAwNjgsIDB4MTI5MSwgMHgyMDkxLCAweDQwODAsIDB4MDA3YywKKwkweDcwYzMsIDB4NDAwMSwgMHgwMDc4LCAweDEyODcsIDB4NzBjMywgMHg0MDA2LCAweDAwNzgsIDB4MTI4NywKKwkweDIwOTksIDB4MDA0MSwgMHgyMGExLCAweDAwNDEsIDB4MjBhOSwgMHgwMDA1LCAweDUzYTMsIDB4MDA3OCwKKwkweDEyODQsIDB4NzBjNCwgMHg3MGMzLCAweDAwMDQsIDB4MDA3YSwgMHgwMDc4LCAweDEyODQsIDB4MDA3OCwKKwkweDEyODQsIDB4MDA3OCwgMHgxMjg0LCAweDAwNzgsIDB4MTI4NCwgMHgyMDkxLCAweDgwMDAsIDB4NzBjMywKKwkweDAwMDAsIDB4NzBjNywgMHg0OTUzLCAweDcwY2IsIDB4NTAyMCwgMHg3MGNmLCAweDIwMjAsIDB4NzBkMywKKwkweDAwMDcsIDB4M2YwMCwgMHg3MGQ2LCAweDIwNzksIDB4MDAwMCwgMHg3ODFiLCAweDAwMDEsIDB4MjAzMSwKKwkweDAwMzAsIDB4MjA1OSwgMHgxMDAwLCAweDIwMjksIDB4MDQ1NywgMHgyMDUxLCAweDA0NzAsIDB4MjA2MSwKKwkweDA0NzIsIDB4MjBiOSwgMHhmZmZmLCAweDIwYzEsIDB4MDAwMCwgMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwKKwkweDQwODAsIDB4MDA3OCwgMHgwNDU1LCAweDEwNzgsIDB4MWIzNiwgMHgwMGMwLCAweDEyOWMsIDB4NzVkOCwKKwkweDc0ZGMsIDB4NzVkYSwgMHg3NGRlLCAweDAwNzgsIDB4MTJlOCwgMHgyMDI5LCAweDAwMDAsIDB4MjUyMCwKKwkweDcxZDAsIDB4NzNjOCwgMHg3MmNjLCAweDcwYzQsIDB4MTA3OCwgMHgxYTcwLCAweDAwNDAsIDB4MTI4NCwKKwkweDcwYzMsIDB4NDAwMiwgMHgwMDc4LCAweDEyODQsIDB4MTA3OCwgMHgxYjM2LCAweDAwYzAsIDB4MTI5YywKKwkweDc1ZDgsIDB4NzRkYywgMHg3NWRhLCAweDc0ZGUsIDB4MDA3OCwgMHgxMzAxLCAweDIwMjksIDB4MDAwMCwKKwkweDI1MjAsIDB4NzFkMCwgMHg3M2M4LCAweDcyY2MsIDB4NzBjNCwgMHgxMDc4LCAweDFhZDAsIDB4MDA0MCwKKwkweDEyODQsIDB4NzBjMywgMHg0MDAyLCAweDAwNzgsIDB4MTI4NCwgMHg3MWM0LCAweDcwYzgsIDB4MjExNCwKKwkweDIwMGEsIDB4MDA3OCwgMHgxMjgyLCAweDcxYzQsIDB4MjExNCwgMHgwMDc4LCAweDEyODIsIDB4NzBjNywKKwkweDAwMDcsIDB4NzBjYiwgMHgwMDNmLCAweDcwY2YsIDB4MDAwMCwgMHgwMDc4LCAweDEyODQsIDB4MTA3OCwKKwkweDFiMzYsIDB4MDBjMCwgMHgxMjljLCAweDc1ZDgsIDB4NzZkYywgMHg3NWRhLCAweDc2ZGUsIDB4MDA3OCwKKwkweDEzMmMsIDB4MjAyOSwgMHgwMDAwLCAweDI1MzAsIDB4NzBjNCwgMHg3MmM4LCAweDczY2MsIDB4NzRkMCwKKwkweDcwYzYsIDB4NzJjYSwgMHg3M2NlLCAweDc0ZDIsIDB4YTAwNSwgMHgwMDQwLCAweDEzNTAsIDB4ODAwMSwKKwkweDc4OTIsIDB4YTA4NCwgMHhmYzAwLCAweDAwNDAsIDB4MTM0NSwgMHg3OGNjLCAweGEwODUsIDB4MDAwMSwKKwkweDc4Y2UsIDB4MjAwMSwgMHg0MDA1LCAweDAwNzgsIDB4MTI4NiwgMHg3YTlhLCAweDdiOWUsIDB4N2RhMiwKKwkweDdlYTYsIDB4N2M5NiwgMHg3OGNjLCAweGEwODQsIDB4ZmZmYywgMHg3OGNlLCAweDAwNzgsIDB4MTM1NCwKKwkweDc4Y2MsIDB4YTA4NSwgMHgwMDAxLCAweDc4Y2UsIDB4MDA3OCwgMHgxMjg0LCAweDEwNzgsIDB4MWIzNiwKKwkweDAwYzAsIDB4MTI5YywgMHg3NWQ4LCAweDc2ZGMsIDB4NzVkYSwgMHg3NmRlLCAweDAwNzgsIDB4MTM2MywKKwkweDIwMjksIDB4MDAwMCwgMHgyNTMwLCAweDcwYzQsIDB4NzJjOCwgMHg3M2NjLCAweDc0ZDQsIDB4NzBjNiwKKwkweDcyY2EsIDB4NzNjZSwgMHg3NGQ2LCAweGEwMDUsIDB4MDA0MCwgMHgxMzg3LCAweDgwMDEsIDB4NzhhZSwKKwkweGEwODQsIDB4ZmMwMCwgMHgwMDQwLCAweDEzN2MsIDB4NzhjYywgMHhhMDg1LCAweDAxMDAsIDB4NzhjZSwKKwkweDIwMDEsIDB4NDAwNSwgMHgwMDc4LCAweDEyODYsIDB4N2FiNiwgMHg3YmJhLCAweDdkYmUsIDB4N2VjMiwKKwkweDdjYjIsIDB4NzhjYywgMHhhMDg0LCAweGZjZmYsIDB4NzhjZSwgMHgwMDc4LCAweDEzOGIsIDB4NzhjYywKKwkweGEwODUsIDB4MDEwMCwgMHg3OGNlLCAweDAwNzgsIDB4MTI4NCwgMHgyMDA5LCAweDUwNjEsIDB4MjEwYywKKwkweDdhZWMsIDB4MDA3OCwgMHgxMjgyLCAweDIwMDksIDB4NTA0MSwgMHgyMTBjLCAweDAwNzgsIDB4MTI4MywKKwkweDIwMDksIDB4NTA0MiwgMHgyMTBjLCAweDAwNzgsIDB4MTI4MywgMHgyMDYxLCAweDUwNDAsIDB4NjEwYywKKwkweDYyMTAsIDB4MDA3OCwgMHgxMjgyLCAweDIwMDksIDB4NTA0NSwgMHgyMTBjLCAweDAwNzgsIDB4MTI4MywKKwkweDIwMDksIDB4NTA0NiwgMHgyMTBjLCAweDAwNzgsIDB4MTI4MywgMHgyMDA5LCAweDUwNDgsIDB4MjEwYywKKwkweDAwNzgsIDB4MTI4MywgMHgyMDA5LCAweDUwNDksIDB4MjEwYywgMHgwMDc4LCAweDEyODMsIDB4NzkwOCwKKwkweDdhMGMsIDB4MDA3OCwgMHgxMjgyLCAweDcxYzQsIDB4ODEwNywgMHhhMDg0LCAweDAwMGYsIDB4ODAwMywKKwkweDgwMDMsIDB4ODAwMywgMHhhMGU4LCAweDUyODAsIDB4NmEwMCwgMHg2ODA0LCAweGEwODQsIDB4MDAwOCwKKwkweDAwNDAsIDB4MTNjZCwgMHg2YjA4LCAweDAwNzgsIDB4MTNjZSwgMHg2YjBjLCAweDAwNzgsIDB4MTI4MSwKKwkweDc3YzQsIDB4MTA3OCwgMHgxOTU2LCAweDIwOTEsIDB4ODAwMCwgMHg2YjFjLCAweDZhMTQsIDB4MjA5MSwKKwkweDgwMDEsIDB4MjcwOCwgMHgwMDc4LCAweDEyODEsIDB4Nzk0YywgMHgwMDc4LCAweDEyODMsIDB4NzdjNCwKKwkweDEwNzgsIDB4MTk1NiwgMHgyMDkxLCAweDgwMDAsIDB4NjkwOCwgMHg2YTE4LCAweDZiMTAsIDB4MjA5MSwKKwkweDgwMDEsIDB4MDA3OCwgMHgxMjgxLCAweDcxYzQsIDB4YTE4MiwgMHgwMDEwLCAweDAwYzgsIDB4MTI3YywKKwkweDEwNzgsIDB4MjJjMSwgMHgwMDc4LCAweDEyODEsIDB4NzFjNCwgMHhhMTgyLCAweDAwMTAsIDB4MDBjOCwKKwkweDEyN2MsIDB4MjAxMSwgMHg1MDQxLCAweDIyMDQsIDB4MDA3ZSwgMHgyMTEyLCAweDEwNzgsIDB4MjI3YSwKKwkweDAxN2YsIDB4MDA3OCwgMHgxMjgzLCAweDcxYzQsIDB4MjAxMSwgMHgxNDIxLCAweDIwYTksIDB4MDAwOCwKKwkweDIyMDQsIDB4YTEwNiwgMHgwMDQwLCAweDE0MTMsIDB4ODIxMCwgMHgwMDcwLCAweDE0MTEsIDB4MDA3OCwKKwkweDE0MDgsIDB4MDA3OCwgMHgxMjdjLCAweGEyOTIsIDB4MTQyMSwgMHgwMjdlLCAweDIwMTEsIDB4NTA0MiwKKwkweDIyMDQsIDB4MjExMiwgMHgwMTdmLCAweDAwN2UsIDB4MTA3OCwgMHgyMjg2LCAweDAxN2YsIDB4MDA3OCwKKwkweDEyODMsIDB4MDNlOCwgMHgwMGZhLCAweDAxZjQsIDB4MDJlZSwgMHgwMDY0LCAweDAwMTksIDB4MDAzMiwKKwkweDAwNGIsIDB4MjA2MSwgMHg1MDQwLCAweDYxMGMsIDB4NjIxMCwgMHg3MGM0LCAweDYwMGUsIDB4NzBjOCwKKwkweDYwMTIsIDB4MDA3OCwgMHgxMjgyLCAweDIwNjEsIDB4NTA0MCwgMHg2MTE0LCAweDcwYzQsIDB4NjAxNiwKKwkweDAwNzgsIDB4MTI4MywgMHgyMDYxLCAweDUwNDAsIDB4NzFjNCwgMHgyMDExLCAweDAwMDQsIDB4NjAxZiwKKwkweDAwMTksIDB4MjAxOSwgMHgxMjEyLCAweGExODYsIDB4MDAyOCwgMHgwMDQwLCAweDE0NWIsIDB4MjAxMSwKKwkweDAwMDUsIDB4NjAxZiwgMHgwMDE5LCAweDIwMTksIDB4MTIxMiwgMHhhMTg2LCAweDAwMzIsIDB4MDA0MCwKKwkweDE0NWIsIDB4MjAxMSwgMHgwMDA2LCAweDYwMWYsIDB4MDAwYywgMHgyMDE5LCAweDIyMjIsIDB4YTE4NiwKKwkweDAwM2MsIDB4MDBjMCwgMHgxMjdjLCAweDYwMTgsIDB4MDA3ZSwgMHg2MTFhLCAweDc4MDAsIDB4YTA4NCwKKwkweDAwMDEsIDB4MDBjMCwgMHgxNDc2LCAweDIwMDEsIDB4MDRmZCwgMHgyMDA0LCAweGEwODIsIDB4MDAwNSwKKwkweDAwNDgsIDB4MTQ2ZSwgMHgwMDM4LCAweDE0NzIsIDB4MDA3OCwgMHgxNDc2LCAweDAwMjgsIDB4MTQ3MiwKKwkweDAwNzgsIDB4MTQ3NiwgMHgyMDE5LCAweDIyMjIsIDB4MDA3OCwgMHgxNDc4LCAweDIwMTksIDB4MTIxMiwKKwkweDIzYjgsIDB4MTA3OCwgMHgyMjk3LCAweDEwNzgsIDB4NGJkZiwgMHgwMTdmLCAweDAwNzgsIDB4MTI4MywKKwkweDcxYzQsIDB4YTE4NCwgMHhmZmNmLCAweDAwYzAsIDB4MTI3YywgMHgyMDExLCAweDUwNDgsIDB4MjIwNCwKKwkweDIxMTIsIDB4MDA3ZSwgMHgxMDc4LCAweDIyYjksIDB4MDE3ZiwgMHgwMDc4LCAweDEyODMsIDB4NzFjNCwKKwkweGExODIsIDB4MDAxMCwgMHgwMGM4LCAweDEyN2MsIDB4MjAxMSwgMHg1MDQ5LCAweDIyMDQsIDB4MDA3ZSwKKwkweDIxMTIsIDB4MTA3OCwgMHgyMmE4LCAweDAxN2YsIDB4MDA3OCwgMHgxMjgzLCAweDcxYzQsIDB4NzJjOCwKKwkweGExODQsIDB4ZmZmZCwgMHgwMGMwLCAweDEyN2IsIDB4YTI4NCwgMHhmZmZkLCAweDAwYzAsIDB4MTI3YiwKKwkweDIxMDAsIDB4NzkwOCwgMHg3ODBhLCAweDIyMDAsIDB4N2EwYywgMHg3ODBlLCAweDAwNzgsIDB4MTI4MiwKKwkweDcxYzQsIDB4ODEwNywgMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTBlOCwKKwkweDUyODAsIDB4MjAxOSwgMHgwMDAwLCAweDcyYzgsIDB4YTI4NCwgMHgwMDgwLCAweDAwNDAsIDB4MTRjNiwKKwkweDZjMTQsIDB4ODRmZiwgMHgwMGMwLCAweDE0YzYsIDB4NjgxNywgMHgwMDQwLCAweGEyODQsIDB4MDA0MCwKKwkweDAwNDAsIDB4MTRkMCwgMHg2YzEwLCAweDg0ZmYsIDB4MDBjMCwgMHgxNGQwLCAweDY4MTMsIDB4MDAwMSwKKwkweDY4MDAsIDB4MDA3ZSwgMHhhMjI2LCAweDAwNDAsIDB4MTRmMywgMHg2YTAyLCAweGE0ODQsIDB4MjAwMCwKKwkweDAwNDAsIDB4MTRkYywgMHhhMzlkLCAweDAwMTAsIDB4YTQ4NCwgMHgxMDAwLCAweDAwNDAsIDB4MTRlMiwKKwkweGEzOWQsIDB4MDAwOCwgMHhhNDg0LCAweDQwMDAsIDB4MDA0MCwgMHgxNGYzLCAweDgxMGYsIDB4YTI4NCwKKwkweDQwMDAsIDB4MDA0MCwgMHgxNGVmLCAweDEwNzgsIDB4MjJkYiwgMHgwMDc4LCAweDE0ZjMsIDB4MTA3OCwKKwkweDIyY2QsIDB4MDA3OCwgMHgxNGYzLCAweDcyY2MsIDB4NjgwOCwgMHhhMjA2LCAweDAwNDAsIDB4MTUyMiwKKwkweGEyYTQsIDB4MDBmZiwgMHgyMDYxLCAweDUwNDAsIDB4NjExOCwgMHhhMTg2LCAweDAwMjgsIDB4MDA0MCwKKwkweDE1MDksIDB4YTE4NiwgMHgwMDMyLCAweDAwNDAsIDB4MTUwZiwgMHhhMTg2LCAweDAwM2MsIDB4MDA0MCwKKwkweDE1MTUsIDB4YTQ4MiwgMHgwMDY0LCAweDAwNDgsIDB4MTUxZiwgMHgwMDc4LCAweDE1MTksIDB4YTQ4MiwKKwkweDAwNTAsIDB4MDA0OCwgMHgxNTFmLCAweDAwNzgsIDB4MTUxOSwgMHhhNDgyLCAweDAwNDMsIDB4MDA0OCwKKwkweDE1MWYsIDB4NzFjNCwgMHg3MWM2LCAweDAyN2YsIDB4NzJjYSwgMHgwMDc4LCAweDEyN2QsIDB4NmEwYSwKKwkweGEzOWQsIDB4MDAwYSwgMHg2ODA0LCAweGEzMDUsIDB4NjgwNiwgMHgwMjdmLCAweDZiMGMsIDB4NzFjNCwKKwkweDAwNzgsIDB4MTI4MSwgMHg3N2M0LCAweDEwNzgsIDB4MTk1NiwgMHgyMDkxLCAweDgwMDAsIDB4NmExNCwKKwkweDZiMWMsIDB4MjA5MSwgMHg4MDAxLCAweDcwYzgsIDB4NjgxNiwgMHg3MGNjLCAweDY4MWUsIDB4MjcwOCwKKwkweDAwNzgsIDB4MTI4MSwgMHg3MGM0LCAweDc5NGMsIDB4Nzg0ZSwgMHgwMDc4LCAweDEyODMsIDB4NzFjNCwKKwkweDcyYzgsIDB4NzNjYywgMHhhMTgyLCAweDAwMTAsIDB4MDBjOCwgMHgxMjdjLCAweDEwNzgsIDB4MjJlOSwKKwkweDAwNzgsIDB4MTI4MSwgMHg3N2M0LCAweDEwNzgsIDB4MTk1NiwgMHgyMDkxLCAweDgwMDAsIDB4NmEwOCwKKwkweGEyOTUsIDB4MDAwMiwgMHg2YTBhLCAweDIwOTEsIDB4ODAwMSwgMHgyNzA4LCAweDAwNzgsIDB4MTI4MiwKKwkweDc3YzQsIDB4MTA3OCwgMHgxOTU2LCAweDIwOTEsIDB4ODAwMCwgMHg2YTA4LCAweGEyOTQsIDB4ZmZmOSwKKwkweDZhMGEsIDB4NjgwNCwgMHhhMDA1LCAweDAwNDAsIDB4MTU2NywgMHgxMDc4LCAweDIxYjEsIDB4MjA5MSwKKwkweDgwMDEsIDB4MjcwOCwgMHgwMDc4LCAweDEyODIsIDB4NzdjNCwgMHgxMDc4LCAweDE5NTYsIDB4MjA5MSwKKwkweDgwMDAsIDB4NmEwOCwgMHhhMjk1LCAweDAwMDQsIDB4NmEwYSwgMHg2ODA0LCAweGEwMDUsIDB4MDA0MCwKKwkweDE1N2IsIDB4MTA3OCwgMHgyMWIxLCAweDIwOTEsIDB4ODAwMSwgMHgyNzA4LCAweDAwNzgsIDB4MTI4MiwKKwkweDc3YzQsIDB4MjA0MSwgMHgwMDAxLCAweDIwNDksIDB4MDAwNSwgMHgyMDUxLCAweDAwMjAsIDB4MjA5MSwKKwkweDgwMDAsIDB4MTA3OCwgMHgxOTYzLCAweDIwOTEsIDB4ODAwMSwgMHgyNzA4LCAweDZhMDgsIDB4MDA3OCwKKwkweDEyODIsIDB4NzdjNCwgMHg3MmM4LCAweDczY2MsIDB4NzdjNiwgMHg3MmNhLCAweDczY2UsIDB4MTA3OCwKKwkweDE5YzQsIDB4MDBjMCwgMHgxNWE5LCAweDY4MTgsIDB4YTAwNSwgMHgwMDQwLCAweDE1YTksIDB4MjcwOCwKKwkweDEwNzgsIDB4MjJmOSwgMHgwMGMwLCAweDE1YTksIDB4NzgxNywgMHgwMDE1LCAweDIwOTEsIDB4ODAwMSwKKwkweDAwN2MsIDB4MjA5MSwgMHg4MDAxLCAweDAwNzgsIDB4MTI4NCwgMHg3N2M0LCAweDc3YzYsIDB4MjA0MSwKKwkweDAwMjEsIDB4MjA0OSwgMHgwMDA1LCAweDIwNTEsIDB4MDAyMCwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwKKwkweDE5NjMsIDB4MjA2MSwgMHg1MDQwLCAweDYwNmYsIDB4MDAwMywgMHg2NzgyLCAweDYwOTMsIDB4MDAwZiwKKwkweDYwNzMsIDB4MDAwMCwgMHg3ODE3LCAweDAwMTYsIDB4MTA3OCwgMHgyMWIxLCAweDIwOTEsIDB4ODAwMSwKKwkweDAwN2MsIDB4NzdjOCwgMHg3N2NhLCAweDc3YzQsIDB4NzdjNiwgMHhhN2JjLCAweGZmMDAsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA2MSwgMHg1MDQwLCAweDYwNmYsIDB4MDAwMiwgMHg2MDczLCAweDAwMDAsIDB4Njc4MiwKKwkweDYwOTMsIDB4MDAwZiwgMHg3ODE3LCAweDAwMTcsIDB4MTA3OCwgMHgyMWIxLCAweDIwOTEsIDB4ODAwMSwKKwkweDIwNDEsIDB4MDAyMSwgMHgyMDQ5LCAweDAwMDQsIDB4MjA1MSwgMHgwMDEwLCAweDIwOTEsIDB4ODAwMCwKKwkweDEwNzgsIDB4MTk2MywgMHg3MGM4LCAweDY4MzYsIDB4ODczOCwgMHhhNzg0LCAweDAwMWYsIDB4MDBjMCwKKwkweDE1ZTgsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4NzhjYywgMHhhMDg0LCAweDAwMDMsIDB4MDBjMCwKKwkweDE2MTgsIDB4MjAzOSwgMHgwMDAwLCAweDIwNDEsIDB4MDAyMSwgMHgyMDQ5LCAweDAwMDQsIDB4MjA1MSwKKwkweDAwMDgsIDB4MTA3OCwgMHgxOTU2LCAweDIwOTEsIDB4ODAwMCwgMHg2ODA4LCAweGE4MGQsIDB4NjkwYSwKKwkweDIwOTEsIDB4ODAwMSwgMHg4NzM4LCAweGE3ODQsIDB4MDAxZiwgMHgwMGMwLCAweDE2MDEsIDB4YTdiYywKKwkweGZmMDAsIDB4ODczZiwgMHg4NzM4LCAweDg3M2YsIDB4YTc4NCwgMHgwZjAwLCAweDAwYzAsIDB4MTYwMSwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDY5LCAweDAxMDAsIDB4NjgzMCwgMHhhMDg0LCAweDAwNDAsIDB4MDA0MCwKKwkweDE2NDEsIDB4Njg0YiwgMHgwMDA0LCAweDIwYTksIDB4MDAxNCwgMHg2ODQ4LCAweGEwODQsIDB4MDAwNCwKKwkweDAwNDAsIDB4MTYyZSwgMHgwMDcwLCAweDE2MmUsIDB4MDA3OCwgMHgxNjI1LCAweDY4NGIsIDB4MDAwOSwKKwkweDIwYTksIDB4MDAxNCwgMHg2ODQ4LCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLCAweDE2M2IsIDB4MDA3MCwKKwkweDE2M2IsIDB4MDA3OCwgMHgxNjMyLCAweDIwYTksIDB4MDBmYSwgMHgwMDcwLCAweDE2NDEsIDB4MDA3OCwKKwkweDE2M2QsIDB4MjA3OSwgMHg1MDAwLCAweDc4MTcsIDB4MDAxOCwgMHgyMDYxLCAweDUwNDAsIDB4NjA2ZiwKKwkweDAwMDEsIDB4NjA3MywgMHgwMDAwLCAweDYwOTMsIDB4MDAwZiwgMHg3OGNjLCAweGEwODUsIDB4MDAwMiwKKwkweDc4Y2UsIDB4NjgwOCwgMHhhMDg0LCAweGZmZmQsIDB4NjgwYSwgMHg2ODFiLCAweDAwNDgsIDB4MjA5MSwKKwkweDgwMDEsIDB4MDA3YywgMHg3OGNjLCAweGEwODQsIDB4ZmZmZCwgMHg3OGNlLCAweGEwODQsIDB4MDAwMSwKKwkweDAwYzAsIDB4MTY2NCwgMHgxMDc4LCAweDFhMGUsIDB4NzFjNCwgMHg3MWM2LCAweDc5NGEsIDB4MDA3YywKKwkweDEwNzgsIDB4MWIzNiwgMHgwMGMwLCAweDEyOWMsIDB4NzVkOCwgMHg3NGRjLCAweDc1ZGEsIDB4NzRkZSwKKwkweDAwNzgsIDB4MTY3NSwgMHgyMDI5LCAweDAwMDAsIDB4MjUyMCwgMHg3MWM0LCAweDczYzgsIDB4NzJjYywKKwkweDcxYzYsIDB4NzNjYSwgMHg3MmNlLCAweDIwNzksIDB4NTAwMCwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwKKwkweDE5MTEsIDB4MjA5MSwgMHg4MDAxLCAweDAwNDAsIDB4MTcyYywgMHgyMGE5LCAweDAwMDUsIDB4MjBhMSwKKwkweDUwMTgsIDB4MjA5MSwgMHg4MDAwLCAweDQxYTEsIDB4MjA5MSwgMHg4MDAxLCAweDIwMDksIDB4MDAyMCwKKwkweDEwNzgsIDB4MTkwYywgMHgwMDQwLCAweDE2OTgsIDB4MTA3OCwgMHgxOTJiLCAweDAwNzgsIDB4MTcyYywKKwkweDYwMDQsIDB4YTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4ODAwOSwgMHgwMDQwLCAweDE2ZmIsIDB4MGM3ZSwKKwkweDJjNjgsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4MTkxMSwgMHgyMDkxLCAweDgwMDEsIDB4MDA0MCwKKwkweDE2Y2MsIDB4MmMwMCwgMHg2ODllLCAweDgxMDksIDB4MDBjMCwgMHgxNmEwLCAweDYwOWYsIDB4MDAwMCwKKwkweDBjN2YsIDB4MGM3ZSwgMHg3MjE4LCAweDczMWMsIDB4NzQyMCwgMHg3NTI0LCAweDJjNjgsIDB4Njg5YywKKwkweGEwNjUsIDB4MDA0MCwgMHgxNmZhLCAweDIwMDksIDB4MDAyMCwgMHgxMDc4LCAweDE5MGMsIDB4MDBjMCwKKwkweDE2ZTMsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4MTZjYywKKwkweDJkMDAsIDB4NjAwMiwgMHgwMDc4LCAweDE2YjIsIDB4MGM3ZiwgMHgwYzdlLCAweDYwOWMsIDB4MjA2MCwKKwkweDEwNzgsIDB4MTk5NiwgMHgwYzdmLCAweDYwOWYsIDB4MDAwMCwgMHgxMDc4LCAweDE3MzAsIDB4MjAwOSwKKwkweDAwMGMsIDB4NjAwOCwgMHhhMDg1LCAweDAyMDAsIDB4NjAwYSwgMHgxMDc4LCAweDE5MDcsIDB4MTA3OCwKKwkweDE5MmIsIDB4MDA3OCwgMHgxNzJjLCAweDBjN2YsIDB4MGM3ZSwgMHg2MDljLCAweDIwNjAsIDB4MTA3OCwKKwkweDE5OTYsIDB4MGM3ZiwgMHg2MDlmLCAweDAwMDAsIDB4MTA3OCwgMHgxNzMwLCAweDIwMDksIDB4MDAwYywKKwkweDYwMDcsIDB4MDEwMywgMHg2MDFiLCAweDAwMDMsIDB4MTA3OCwgMHgxOTA3LCAweDEwNzgsIDB4MTkyYiwKKwkweDAwNzgsIDB4MTcyYywgMHgwYzdmLCAweDc0YzQsIDB4NzNjOCwgMHg3MmNjLCAweDYwMTQsIDB4MjA5MSwKKwkweDgwMDAsIDB4NzgxNywgMHgwMDEyLCAweDBlN2UsIDB4MjA3MSwgMHg1MDQwLCAweDcwNmYsIDB4MDAwNSwKKwkweDcwNzMsIDB4MDAwMCwgMHg3Mzc2LCAweDcyN2EsIDB4NzQ3ZSwgMHg3MDgyLCAweDcwODcsIDB4MDAwMCwKKwkweDJjMDAsIDB4NzA4YSwgMHg3MDhmLCAweDAwMDAsIDB4YTAyZSwgMHgyNTMwLCAweDYxMWMsIDB4NjFhMiwKKwkweGExODQsIDB4MDA2MCwgMHgwMDQwLCAweDE3MWUsIDB4MTA3OCwgMHg0NjdmLCAweDBlN2YsIDB4NjU5NiwKKwkweDY1YTYsIDB4NjY5YSwgMHg2NmFhLCAweDYwYWYsIDB4MDAwMCwgMHg2MGIzLCAweDAwMDAsIDB4MTA3OCwKKwkweDIxYjEsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4NzBjMywgMHg0MDA1LCAweDAwNzgsIDB4MTI4NywKKwkweDIwYTksIDB4MDAwNSwgMHgyMDk5LCAweDUwMTgsIDB4MjA5MSwgMHg4MDAwLCAweDUzMGEsIDB4MjA5MSwKKwkweDgwMDEsIDB4MjEwMCwgMHhhMjEwLCAweGEzOTksIDB4MDAwMCwgMHhhNGExLCAweDAwMDAsIDB4YTVhOSwKKwkweDAwMDAsIDB4MDA3YywgMHg3MWM0LCAweDcwYzcsIDB4MDAwMCwgMHg3OTA2LCAweDAwNzgsIDB4MTI4NCwKKwkweDcxYzQsIDB4NzFjNiwgMHgyMTY4LCAweDAwNzgsIDB4MTc0ZiwgMHgyMDY5LCAweDEwMDAsIDB4NjkwYywKKwkweGEwMTYsIDB4MmQwNCwgMHhhMjEwLCAweDhkNjgsIDB4ODEwOSwgMHgwMGMwLCAweDE3NTEsIDB4YTI4NSwKKwkweDAwMDAsIDB4MDBjMCwgMHgxNzVmLCAweDcwYzMsIDB4NDAwMCwgMHgwMDc4LCAweDE3NjEsIDB4NzBjMywKKwkweDQwMDMsIDB4NzBjYSwgMHgwMDc4LCAweDEyODcsIDB4MjAxMSwgMHg1MDY3LCAweDIyMGMsIDB4NzBjNCwKKwkweDgwMDMsIDB4MDA0OCwgMHgxNzcxLCAweDEwNzgsIDB4M2I0OSwgMHhhMTg0LCAweDdmZmYsIDB4MDA3OCwKKwkweDE3NzUsIDB4MTA3OCwgMHgzYjNjLCAweGExODUsIDB4ODAwMCwgMHgyMDEyLCAweDAwNzgsIDB4MTI4MywKKwkweDcxYzQsIDB4MTA3OCwgMHgzYjMzLCAweDYxMDAsIDB4MjAwMSwgMHg1MDY3LCAweDIwMDQsIDB4YTA4NCwKKwkweDgwMDAsIDB4YTEwZCwgMHg2MjA0LCAweDYzMDgsIDB4MDA3OCwgMHgxMjgxLCAweDc5ZTQsIDB4MDA3OCwKKwkweDEyODMsIDB4NzFjNCwgMHg3MWM2LCAweDIxOTgsIDB4MjBhMSwgMHgwMDQyLCAweDIwYTksIDB4MDAwNCwKKwkweDUzYTMsIDB4MjFhMCwgMHgyMDk5LCAweDAwNDIsIDB4MjBhOSwgMHgwMDA0LCAweDUzYTMsIDB4MDA3OCwKKwkweDEyODQsIDB4NzBjNCwgMHgyMDY4LCAweDIwNzksIDB4NTAwMCwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwKKwkweDE5MTEsIDB4MjA5MSwgMHg4MDAxLCAweDAwNDAsIDB4MTgyNSwgMHg2MDA3LCAweDAwMDEsIDB4NjAwYiwKKwkweDAwMDAsIDB4NjAyYiwgMHgwMDAwLCAweDYwMWIsIDB4MDAwNiwgMHg2YTEwLCAweGEyOGMsIDB4MDAwZiwKKwkweGEyODQsIDB4MDBmMCwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGExMDUsIDB4NjAxNiwKKwkweGEyODQsIDB4MDgwMCwgMHgwMDQwLCAweDE3YzAsIDB4NjAxYiwgMHgwMDBhLCAweDAwNzgsIDB4MTdjNiwKKwkweGEyODQsIDB4MTAwMCwgMHgwMDQwLCAweDE3YzYsIDB4NjAxYiwgMHgwMDBjLCAweGEyODQsIDB4MDMwMCwKKwkweDAwNDAsIDB4MTdjZiwgMHg2MDJiLCAweDAwMDEsIDB4ODAwNCwgMHg4MDA0LCAweDgwMDQsIDB4YTA4NSwKKwkweDAwMDEsIDB4NjAxZSwgMHg2MDIzLCAweDAwMDAsIDB4NjAyNywgMHgwMDAwLCAweGEyODQsIDB4MDQwMCwKKwkweDAwNDAsIDB4MTdkYywgMHg2MDJiLCAweDAwMDAsIDB4MjBhOSwgMHgwMDA2LCAweGFjODAsIDB4MDAwYiwKKwkweDIwYTAsIDB4YWQ4MCwgMHgwMDA1LCAweDIwOTgsIDB4NTNhMywgMHhhMjg0LCAweDAzMDAsIDB4MDBjMCwKKwkweDE3ZjEsIDB4NjA0NiwgMHg2MDRhLCAweDYwNGUsIDB4NjA1MiwgMHg2MDk2LCAweDYwOWEsIDB4MDA3OCwKKwkweDE3ZmIsIDB4NjgwMCwgMHg2MDQ2LCAweDY4MDQsIDB4NjA0YSwgMHg2ZTA4LCAweDY2NGUsIDB4NmQwYywKKwkweDY1NTIsIDB4NjU5NiwgMHg2NjlhLCAweDYwMTQsIDB4MjA5MSwgMHg4MDAwLCAweDc4MTcsIDB4MDA0MiwKKwkweDJjMDgsIDB4MjA2MSwgMHg1MDQwLCAweDYwNmYsIDB4MDAwNSwgMHg2MDczLCAweDAwMDAsIDB4NjA3NywKKwkweDAwMDAsIDB4NjA3YiwgMHgwMDAwLCAweDYwN2YsIDB4MDAwMCwgMHg2MDgyLCAweDYxOGEsIDB4YTI4NCwKKwkweDA0MDAsIDB4NjA4ZSwgMHgyMDkxLCAweDgwMDEsIDB4MGU3ZSwgMHgyMDcxLCAweDAwMjAsIDB4NzAwNywKKwkweDAwMGEsIDB4NzAwNywgMHgwMDAyLCAweDcwMDMsIDB4MDAwMCwgMHgwZTdmLCAweDIwOTEsIDB4ODAwMCwKKwkweDEwNzgsIDB4MjFiMSwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHg3MGMzLCAweDQwMDUsIDB4MDA3OCwKKwkweDEyODcsIDB4MGM3ZSwgMHgwZDdlLCAweDBlN2UsIDB4MGY3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwKKwkweDUwNDAsIDB4MjA3OSwgMHgwMTAwLCAweDIwNjEsIDB4MDAxMCwgMHg3MGEwLCAweGEwNmQsIDB4MDA0MCwKKwkweDE4YWEsIDB4NmEwNCwgMHhhMjk0LCAweDAwZmYsIDB4YTI4NiwgMHgwMDA3LCAweDAwNDAsIDB4MTg0NCwKKwkweGEyODYsIDB4MDAwZiwgMHgwMGMwLCAweDE4YWEsIDB4NjkxYywgMHhhMTg0LCAweDAwODAsIDB4MDBjMCwKKwkweDE4YWEsIDB4NjgyNCwgMHhhMThjLCAweGZmMDAsIDB4YTA4NSwgMHgwMDE5LCAweDY4MjYsIDB4NzFiMCwKKwkweDgxZmYsIDB4MDA0MCwgMHgxODY1LCAweDBkN2UsIDB4MjA2OSwgMHgwMDIwLCAweDY5MDgsIDB4NjgwOCwKKwkweGExMDYsIDB4MDBjMCwgMHgxODU2LCAweDY5MGMsIDB4NjgwYywgMHhhMTA2LCAweDAwYzAsIDB4MTg1YiwKKwkweGExODQsIDB4MDBmZiwgMHgwMGMwLCAweDE4NWIsIDB4MGQ3ZiwgMHg3OGI4LCAweGEwODQsIDB4ODAxZiwKKwkweDAwYzAsIDB4MTg2NSwgMHg3ODQ4LCAweGEwODUsIDB4MDAwYywgMHg3ODRhLCAweDcxYjAsIDB4ODFmZiwKKwkweDAwNDAsIDB4MTg4OCwgMHg3MGIzLCAweDAwMDAsIDB4MGQ3ZSwgMHgyMDY5LCAweDAwMjAsIDB4NjgwNywKKwkweDAwMDgsIDB4NjgwNCwgMHhhMDg0LCAweDAwMDgsIDB4MDBjMCwgMHgxODc5LCAweDY4MDcsIDB4MDAwOCwKKwkweDY4MDQsIDB4YTA4NCwgMHgwMDA4LCAweDAwYzAsIDB4MTg4MCwgMHg2ODA3LCAweDAwMDIsIDB4MGQ3ZiwKKwkweDYxYzQsIDB4NjJjOCwgMHg2M2NjLCAweDYxYzYsIDB4NjJjYSwgMHg2M2NlLCAweDBlN2UsIDB4MjA3MSwKKwkweDUwMDAsIDB4NzI2NiwgMHg3MzZhLCAweGFlODAsIDB4MDAxOSwgMHgwZTdmLCAweDEwNzgsIDB4NDU5OCwKKwkweDc4YTMsIDB4MDAwMCwgMHg3ODU4LCAweGEwODQsIDB4ZWRmZiwgMHg3ODVhLCAweDcwYjQsIDB4YTA4MCwKKwkweDAwZGEsIDB4NzgxYSwgMHgwZjdmLCAweDBlN2YsIDB4MGQ3ZiwgMHgwYzdmLCAweDIwOTEsIDB4ODAwMSwKKwkweDAwNzgsIDB4MTI4NCwgMHgwZjdmLCAweDBlN2YsIDB4MGQ3ZiwgMHgwYzdmLCAweDIwOTEsIDB4ODAwMSwKKwkweDIwMDEsIDB4NDAwNSwgMHgwMDc4LCAweDEyODYsIDB4Nzk4MCwgMHg3MWM2LCAweDcxYzQsIDB4YTE4MiwKKwkweDAwMDMsIDB4MDBjOCwgMHgxMjdjLCAweDc5ODIsIDB4MDA3OCwgMHgxMjg0LCAweDc5ODAsIDB4NzFjNiwKKwkweDAwNzgsIDB4MTI4NCwgMHg3OTc0LCAweDcxYzYsIDB4NzFjNCwgMHg3OTc2LCAweDc5NzgsIDB4NzFjYSwKKwkweDcxYzgsIDB4Nzk3YSwgMHg3OTdjLCAweDcxY2UsIDB4NzFjYywgMHg3OTdlLCAweDAwNzgsIDB4MTI4NCwKKwkweDc5NzQsIDB4NzFjNiwgMHg3OTc4LCAweDcxY2EsIDB4Nzk3YywgMHg3MWNlLCAweDAwNzgsIDB4MTI4NCwKKwkweDc5MDAsIDB4NzFjNiwgMHg3MWM0LCAweDc5MDIsIDB4MjAwMSwgMHgwNGZkLCAweDIwMDQsIDB4YTA4MiwKKwkweDAwMDUsIDB4MDA0OCwgMHgxOGU3LCAweDAwMzgsIDB4MThlOSwgMHgwMDc4LCAweDE4ZjMsIDB4MDBhOCwKKwkweDE4ZjMsIDB4YTE4YywgMHgwMDAxLCAweDAwYzAsIDB4MThmMSwgMHgyMGI5LCAweDIyMjIsIDB4MDA3OCwKKwkweDE4ZjMsIDB4MjBiOSwgMHgxMjEyLCAweDAwNzgsIDB4MTI4NCwgMHg3OTAwLCAweDcxYzYsIDB4MDA3OCwKKwkweDEyODQsIDB4MjAwOSwgMHg1MDc0LCAweDIxMDQsIDB4NzBjNiwgMHg3MGM0LCAweDIwMGEsIDB4MDA3OCwKKwkweDEyODQsIDB4MjAwOSwgMHg1MDc0LCAweDIxMDQsIDB4NzBjNiwgMHgwMDc4LCAweDEyODQsIDB4YWM4MCwKKwkweDAwMDEsIDB4MTA3OCwgMHgxYWYyLCAweDAwN2MsIDB4YWM4MCwgMHgwMDAxLCAweDEwNzgsIDB4MWE5MiwKKwkweDAwN2MsIDB4Nzg1MCwgMHhhMDY1LCAweDAwNDAsIDB4MTkxOSwgMHgyYzA0LCAweDc4NTIsIDB4MjA2MywKKwkweDAwMDAsIDB4MDA3YywgMHgwZjdlLCAweDIwNzksIDB4NTAwMCwgMHg3ODUwLCAweGEwNmQsIDB4MDA0MCwKKwkweDE5MjksIDB4MmQwNCwgMHg3ODUyLCAweDY4MDMsIDB4MDAwMCwgMHg2ODA3LCAweDAwMDAsIDB4NjgwYiwKKwkweDAwMDAsIDB4MGY3ZiwgMHgwMDdjLCAweDIwOTEsIDB4ODAwMCwgMHgwZjdlLCAweDIwNzksIDB4NTAwMCwKKwkweDc4NTAsIDB4MjA2MiwgMHgyYzAwLCAweGEwMDUsIDB4MDBjMCwgMHgxOTM4LCAweDEwNzgsIDB4MjNjYSwKKwkweDc4NTIsIDB4MGY3ZiwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHgwZjdlLCAweDIwNzksIDB4NTAwMCwKKwkweDc4NTAsIDB4MjA2YSwgMHgyZDAwLCAweDc4NTIsIDB4MGY3ZiwgMHgwMDdjLCAweDIwMTEsIDB4NzcwMCwKKwkweDdhNTIsIDB4N2JlYywgMHg4MzE5LCAweDAwNDAsIDB4MTk1MywgMHhhMjgwLCAweDAwMzEsIDB4MjAxMiwKKwkweDIwMTAsIDB4MDA3OCwgMHgxOTRhLCAweDIwMTMsIDB4MDAwMCwgMHgwMDdjLCAweGE3ODQsIDB4MGYwMCwKKwkweDgwMGIsIDB4YTc4NCwgMHgwMDFmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTEwNSwKKwkweGEwZTgsIDB4NTMwMCwgMHgwMDdjLCAweDEwNzgsIDB4MTk1NiwgMHgyOTAwLCAweDY4MmEsIDB4MmEwMCwKKwkweDY4MmUsIDB4NjgwOCwgMHhhMDg0LCAweGZmZWYsIDB4YTgwZCwgMHg2OTBhLCAweDIwMDksIDB4NTA1MiwKKwkweDIxMGMsIDB4NjgwNCwgMHhhMDA1LCAweDAwNDAsIDB4MTk5NSwgMHhhMTE2LCAweDAwYzAsIDB4MTk4MCwKKwkweDIwNjAsIDB4NjAwMCwgMHg2ODA2LCAweDAxN2UsIDB4MjAwYiwgMHgwMDAwLCAweDAwNzgsIDB4MTk4MywKKwkweDIwMDksIDB4MDAwMCwgMHgwMTdlLCAweDY4MDQsIDB4YTA2NSwgMHgwMDQwLCAweDE5OTIsIDB4NjAwMCwKKwkweDY4MDYsIDB4MTA3OCwgMHgxOWEzLCAweDEwNzgsIDB4MWM0MiwgMHg2ODEwLCAweDgwMDEsIDB4NjgxMiwKKwkweDAwYzAsIDB4MTk4MywgMHgwMTdmLCAweDY5MDIsIDB4NjkwNiwgMHgwMDdjLCAweGEwNjUsIDB4MDA0MCwKKwkweDE5YTIsIDB4NjA5YywgMHg2MDlmLCAweDAwMDAsIDB4MjAwOCwgMHgxMDc4LCAweDE5MmIsIDB4MjEwMCwKKwkweDAwNzgsIDB4MTk5NiwgMHgwMDdjLCAweDYwMDcsIDB4MDEwMywgMHg2MDhmLCAweDAwMDAsIDB4MjBhOSwKKwkweDAwMWMsIDB4YWM4MCwgMHgwMDA1LCAweDIwYTAsIDB4MjAwMSwgMHgwMDAwLCAweDQwYTQsIDB4NjgyOCwKKwkweDYwMWEsIDB4NjgyYywgMHg2MDIyLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweDUwNDAsIDB4NzA0YywKKwkweGEwOGMsIDB4MDIwMCwgMHgwMGMwLCAweDE5YzIsIDB4YTA4OCwgMHg1MDgwLCAweDJkMGEsIDB4ODAwMCwKKwkweDcwNGUsIDB4YTAwNiwgMHgwZTdmLCAweDAwN2MsIDB4MTA3OCwgMHgxOTU2LCAweDIwOTEsIDB4ODAwMCwKKwkweDY4MDQsIDB4NzgxZSwgMHhhMDY1LCAweDAwNDAsIDB4MWEwZCwgMHgwMDc4LCAweDE5ZDUsIDB4MmMwMCwKKwkweDc4MWUsIDB4NjAwMCwgMHhhMDY1LCAweDAwNDAsIDB4MWEwZCwgMHg2MDBjLCAweGEzMDYsIDB4MDBjMCwKKwkweDE5Y2YsIDB4NjAxMCwgMHhhMjA2LCAweDAwYzAsIDB4MTljZiwgMHgyYzI4LCAweDIwMDEsIDB4NTA1MiwKKwkweDIwMDQsIDB4YWMwNiwgMHgwMGMwLCAweDE5ZTYsIDB4MDA3OCwgMHgxYTBiLCAweDY4MDQsIDB4YWMwNiwKKwkweDAwYzAsIDB4MTlmMywgMHg2MDAwLCAweGEwNjUsIDB4NjgwNiwgMHgwMGMwLCAweDE5ZmQsIDB4NjgwMywKKwkweDAwMDAsIDB4MDA3OCwgMHgxOWZkLCAweDY0MDAsIDB4NzgxYywgMHgyMDYwLCAweDY0MDIsIDB4YTQ4NiwKKwkweDAwMDAsIDB4MDBjMCwgMHgxOWZkLCAweDJjMDAsIDB4NjgwMiwgMHgyNTYwLCAweDEwNzgsIDB4MTlhMywKKwkweDYwMWIsIDB4MDAwNSwgMHg2MDIzLCAweDAwMjAsIDB4MTA3OCwgMHgxYzQyLCAweDY4MTAsIDB4ODAwMSwKKwkweDEwNTAsIDB4MjNjYSwgMHg2ODEyLCAweGEwODUsIDB4ZmZmZiwgMHgwMDdjLCAweDIwMzksIDB4MDAwMCwKKwkweDIwNDEsIDB4MDAyMSwgMHgyMDQ5LCAweDAwMDQsIDB4MjA1MSwgMHgwMDA4LCAweDIwOTEsIDB4ODAwMCwKKwkweDEwNzgsIDB4MTk2MywgMHg4NzM4LCAweGE3ODQsIDB4MDAxZiwgMHgwMGMwLCAweDFhMTgsIDB4YTdiYywKKwkweGZmMDAsIDB4ODczZiwgMHg4NzM4LCAweDg3M2YsIDB4YTc4NCwgMHgwZjAwLCAweDAwYzAsIDB4MWExOCwKKwkweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDIwNjEsIDB4MDAwMCwgMHg2MDE4LCAweGEwODQsIDB4MDAwMSwKKwkweDAwYzAsIDB4MWEzYywgMHgyMDkxLCAweDgwMDAsIDB4NzhlMCwgMHg3OGUzLCAweDAwMDAsIDB4MjA5MSwKKwkweDgwMDEsIDB4YTAwNSwgMHgwMGMwLCAweDFhM2QsIDB4MDA3YywgMHhhMDhjLCAweGZmZjAsIDB4MDA0MCwKKwkweDFhNDMsIDB4MTA3OCwgMHgyM2NhLCAweDAwNzksIDB4MWE0NSwgMHgxYTU1LCAweDFhNTgsIDB4MWE1ZSwKKwkweDFhNjIsIDB4MWE1NiwgMHgxYTY2LCAweDFhNmMsIDB4MWE1NiwgMHgxYTU2LCAweDFjMGMsIDB4MWMzMCwKKwkweDFjMzQsIDB4MWE1NiwgMHgxYTU2LCAweDFhNTYsIDB4MWE1NiwgMHgwMDdjLCAweDEwNzgsIDB4MjNjYSwKKwkweDEwNzgsIDB4MWEwZSwgMHgyMDAxLCAweDgwMDEsIDB4MDA3OCwgMHgxYzNhLCAweDIwMDEsIDB4ODAwMywKKwkweDAwNzgsIDB4MWMzYSwgMHgyMDAxLCAweDgwMDQsIDB4MDA3OCwgMHgxYzNhLCAweDEwNzgsIDB4MWEwZSwKKwkweDIwMDEsIDB4ODAwNiwgMHgwMDc4LCAweDFjM2EsIDB4MjAwMSwgMHg4MDA3LCAweDAwNzgsIDB4MWMzYSwKKwkweDIwMzAsIDB4MjEzOCwgMHhhNzgyLCAweDAwMjEsIDB4MDA0OCwgMHgxYTc4LCAweDIwMDksIDB4MDAyMCwKKwkweDI2MDAsIDB4MTA3OCwgMHgxYTkyLCAweDAwYzAsIDB4MWE5MSwgMHhhN2JhLCAweDAwMjAsIDB4MDA0OCwKKwkweDFhOTAsIDB4MDA0MCwgMHgxYTkwLCAweDI3MDgsIDB4YTZiMCwgMHgwMDIwLCAweGEyOTAsIDB4MDA0MCwKKwkweGEzOTksIDB4MDAwMCwgMHhhNGExLCAweDAwMDAsIDB4YTVhOSwgMHgwMDAwLCAweDAwNzgsIDB4MWE3MiwKKwkweGEwMDYsIDB4MDA3YywgMHg4MWZmLCAweDAwNDAsIDB4MWFjZCwgMHgyMDk5LCAweDAwMzAsIDB4MjBhMCwKKwkweDcwMGMsIDB4YTA4NCwgMHgwMGZmLCAweDAwNDAsIDB4MWFhNCwgMHg3MDA3LCAweDAwMDQsIDB4NzAwNCwKKwkweGEwODQsIDB4MDAwNCwgMHgwMGMwLCAweDFhOWYsIDB4MjFhOCwgMHg3MDE3LCAweDAwMDAsIDB4ODEwYiwKKwkweDcxMTIsIDB4NzIxYSwgMHg3MzFlLCAweDc0MjIsIDB4NzUyNiwgMHg3ODBjLCAweGEwODUsIDB4MDAwMSwKKwkweDcwMDIsIDB4NzAwNywgMHgwMDAxLCAweDIwMDEsIDB4MDRmZCwgMHgyMDA0LCAweGEwODIsIDB4MDAwNSwKKwkweDAwYzgsIDB4MWFjMSwgMHgyMDA5LCAweDAwMjIsIDB4MjEwNCwgMHhhMDg0LCAweDQwMDAsIDB4MDBjMCwKKwkweDFhYjMsIDB4NzAwOCwgMHg4MDBiLCAweDAwYzgsIDB4MWFiMywgMHg3MDA3LCAweDAwMDIsIDB4YTA4YywKKwkweDAxZTAsIDB4MDBjMCwgMHgxYWNkLCAweDUzYTUsIDB4YTAwNiwgMHg3MDAzLCAweDAwMDAsIDB4MDA3YywKKwkweDIwMzAsIDB4MjEzOCwgMHhhNzgyLCAweDAwMjEsIDB4MDA0OCwgMHgxYWQ4LCAweDIwMDksIDB4MDAyMCwKKwkweDI2MDAsIDB4MTA3OCwgMHgxYWYyLCAweDAwYzAsIDB4MWFmMSwgMHhhN2JhLCAweDAwMjAsIDB4MDA0OCwKKwkweDFhZjAsIDB4MDA0MCwgMHgxYWYwLCAweDI3MDgsIDB4YTZiMCwgMHgwMDIwLCAweGEyOTAsIDB4MDA0MCwKKwkweGEzOTksIDB4MDAwMCwgMHhhNGExLCAweDAwMDAsIDB4YTVhOSwgMHgwMDAwLCAweDAwNzgsIDB4MWFkMiwKKwkweGEwMDYsIDB4MDA3YywgMHg4MWZmLCAweDAwNDAsIDB4MWIzMywgMHgyMDk4LCAweDIwYTEsIDB4MDAzMCwKKwkweDcwMGMsIDB4YTA4NCwgMHgwMGZmLCAweDAwNDAsIDB4MWIwNCwgMHg3MDA3LCAweDAwMDQsIDB4NzAwNCwKKwkweGEwODQsIDB4MDAwNCwgMHgwMGMwLCAweDFhZmYsIDB4MjFhOCwgMHg3MDE3LCAweDAwMDAsIDB4ODEwYiwKKwkweDcxMTIsIDB4NzIxYSwgMHg3MzFlLCAweDc0MjIsIDB4NzUyNiwgMHg3ODBjLCAweGEwODUsIDB4MDAwMCwKKwkweDcwMDIsIDB4NTNhNiwgMHg3MDA3LCAweDAwMDEsIDB4MjAwMSwgMHgwNGZkLCAweDIwMDQsIDB4YTA4MiwKKwkweDAwMDUsIDB4MDBjOCwgMHgxYjIyLCAweDIwMDksIDB4MDAyMiwgMHgyMTA0LCAweGEwODQsIDB4NDAwMCwKKwkweDAwYzAsIDB4MWIxNCwgMHg3MDEwLCAweGEwODQsIDB4ZjAwMCwgMHgwMDQwLCAweDFiMmIsIDB4NzAwNywKKwkweDAwMDgsIDB4MDA3OCwgMHgxYjJmLCAweDcxMDgsIDB4ODEwMywgMHgwMGM4LCAweDFiMTQsIDB4NzAwNywKKwkweDAwMDIsIDB4YTE4NCwgMHgwMWUwLCAweDcwMDMsIDB4MDAwMCwgMHgwMDdjLCAweDIwMDEsIDB4MDRmZCwKKwkweDIwMDQsIDB4YTA4MiwgMHgwMDA0LCAweDAwYzgsIDB4MWIzZiwgMHgwMDc4LCAweDFiNDIsIDB4YTAwNiwKKwkweDAwNzgsIDB4MWI0NCwgMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4NTAwMCwKKwkweDJkMDgsIDB4NzA1OCwgMHg2ODAyLCAweGEwMDUsIDB4MDBjMCwgMHgxYjRmLCAweDcxNWUsIDB4NzE1YSwKKwkweDBlN2YsIDB4MDA3YywgMHgyYzA4LCAweDc4NTgsIDB4NjAwMiwgMHhhMDA1LCAweDAwYzAsIDB4MWI1OSwKKwkweDc5NWUsIDB4Nzk1YSwgMHgwMDdjLCAweDIwOTEsIDB4ODAwMCwgMHg2MDAzLCAweDAwMDAsIDB4MmMwOCwKKwkweDc4NWMsIDB4YTA2NSwgMHgwMGMwLCAweDFiNjcsIDB4Nzk1YSwgMHgwMDc4LCAweDFiNjgsIDB4NjEwMiwKKwkweDc5NWUsIDB4MjA5MSwgMHg4MDAxLCAweDEwNzgsIDB4MjFjZSwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwKKwkweDUwMDAsIDB4NzA1OCwgMHhhMDZkLCAweDAwNDAsIDB4MWI3YywgMHg2ODAwLCAweDcwNWEsIDB4YTAwNSwKKwkweDAwYzAsIDB4MWI3YiwgMHg3MDVlLCAweDhkZmYsIDB4MGU3ZiwgMHgwMDdjLCAweDBkN2UsIDB4MGM3ZSwKKwkweDBmN2UsIDB4MjA3OSwgMHg1MDAwLCAweGFmODAsIDB4MDAxNiwgMHgyMDYwLCAweDYwMDAsIDB4YTAwNSwKKwkweDAwNDAsIDB4MWJhYywgMHgyMDY4LCAweDY4MTQsIDB4YTMwNiwgMHgwMGMwLCAweDFiOTUsIDB4NjgyOCwKKwkweGEwODQsIDB4MDBmZiwgMHhhNDA2LCAweDAwNDAsIDB4MWI5OCwgMHgyZDYwLCAweDAwNzgsIDB4MWI4NiwKKwkweDY4MDAsIDB4YTAwNSwgMHg2MDAyLCAweDAwYzAsIDB4MWJhNCwgMHhhZjgwLCAweDAwMTYsIDB4YWMwNiwKKwkweDAwNDAsIDB4MWJhMywgMHgyYzAwLCAweDc4NWUsIDB4MGQ3ZSwgMHg2ODljLCAweGEwMDUsIDB4MDA0MCwKKwkweDFiYWIsIDB4MTA3OCwgMHgxOTk2LCAweDAwN2YsIDB4MGY3ZiwgMHgwYzdmLCAweDBkN2YsIDB4YTAwNSwKKwkweDAwN2MsIDB4MGQ3ZSwgMHgwYzdlLCAweDBmN2UsIDB4MjA3OSwgMHg1MDAwLCAweGFmODAsIDB4MDAxNiwKKwkweDIwNjAsIDB4NjAwMCwgMHhhMDA1LCAweDAwNDAsIDB4MWJkYiwgMHgyMDY4LCAweDY4MTQsIDB4YTA4NCwKKwkweDAwZmYsIDB4YTMwNiwgMHgwMDQwLCAweDFiYzcsIDB4MmQ2MCwgMHgwMDc4LCAweDFiYjksIDB4NjgwMCwKKwkweGEwMDUsIDB4NjAwMiwgMHgwMGMwLCAweDFiZDMsIDB4YWY4MCwgMHgwMDE2LCAweGFjMDYsIDB4MDA0MCwKKwkweDFiZDIsIDB4MmMwMCwgMHg3ODVlLCAweDBkN2UsIDB4Njg5YywgMHhhMDA1LCAweDAwNDAsIDB4MWJkYSwKKwkweDEwNzgsIDB4MTk5NiwgMHgwMDdmLCAweDBmN2YsIDB4MGM3ZiwgMHgwZDdmLCAweGEwMDUsIDB4MDA3YywKKwkweDBkN2UsIDB4MGM3ZSwgMHgwZjdlLCAweDIwNzksIDB4NTAwMCwgMHhhZjgwLCAweDAwMTYsIDB4MjA2MCwKKwkweDYwMDAsIDB4YTA2ZCwgMHgwMDQwLCAweDFjMDcsIDB4NjgxNCwgMHhhMzA2LCAweDAwNDAsIDB4MWJmMywKKwkweDJkNjAsIDB4MDA3OCwgMHgxYmU4LCAweDY4MDAsIDB4YTAwNSwgMHg2MDAyLCAweDAwYzAsIDB4MWJmZiwKKwkweGFmODAsIDB4MDAxNiwgMHhhYzA2LCAweDAwNDAsIDB4MWJmZSwgMHgyYzAwLCAweDc4NWUsIDB4MGQ3ZSwKKwkweDY4OWMsIDB4YTAwNSwgMHgwMDQwLCAweDFjMDYsIDB4MTA3OCwgMHgxOTk2LCAweDAwN2YsIDB4MGY3ZiwKKwkweDBjN2YsIDB4MGQ3ZiwgMHhhMDA1LCAweDAwN2MsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksIDB4NTA0MCwKKwkweDY4MDAsIDB4YTA4NiwgMHgwMDAwLCAweDAwNDAsIDB4MWMxYSwgMHgyMDkxLCAweDgwMDEsIDB4NzhlMywKKwkweDAwMDksIDB4MDA3YywgMHg2ODgwLCAweGEwYmMsIDB4ZmYwMCwgMHgyMDQxLCAweDAwMjEsIDB4MjA0OSwKKwkweDAwMDQsIDB4MjA1MSwgMHgwMDEwLCAweDEwNzgsIDB4MTk2MywgMHg4NzM4LCAweGE3ODQsIDB4MDAxZiwKKwkweDAwYzAsIDB4MWMyMywgMHgyMDkxLCAweDgwMDEsIDB4MjAwMSwgMHg4MDBhLCAweDAwNzgsIDB4MWMzYSwKKwkweDIwMDEsIDB4ODAwYywgMHgwMDc4LCAweDFjM2EsIDB4MTA3OCwgMHgxYTBlLCAweDIwMDEsIDB4ODAwZCwKKwkweDAwNzgsIDB4MWMzYSwgMHg3MGMyLCAweDIwNjEsIDB4MDAwMCwgMHg2MDFiLCAweDAwMDEsIDB4MjA5MSwKKwkweDQwODAsIDB4MDA3YywgMHg2MDA0LCAweDJjMDgsIDB4MjA2MywgMHgwMDAwLCAweDc4ODQsIDB4ODAwMCwKKwkweDc4ODYsIDB4Nzg4OCwgMHhhMDA1LCAweDc5OGEsIDB4MDA0MCwgMHgxYzUxLCAweDJjMDIsIDB4MDA3OCwKKwkweDFjNTIsIDB4Nzk4ZSwgMHgwMDdjLCAweDY4MDcsIDB4MDEwMywgMHgwYzdlLCAweDIwNjEsIDB4NTAwMCwKKwkweDJkMDgsIDB4MjA2YiwgMHgwMDAwLCAweDYwODQsIDB4ODAwMCwgMHg2MDg2LCAweDYwODgsIDB4YTAwNSwKKwkweDYxOGEsIDB4MDA0MCwgMHgxYzY2LCAweDJkMDIsIDB4MDA3OCwgMHgxYzY3LCAweDYxOGUsIDB4MGM3ZiwKKwkweDAwN2MsIDB4MTA3OCwgMHgxYzdhLCAweDAwNDAsIDB4MWM3OSwgMHgwYzdlLCAweDYwOWMsIDB4YTA2NSwKKwkweDAwNDAsIDB4MWM3NCwgMHgxMDc4LCAweDE5OTYsIDB4MGM3ZiwgMHg2MDlmLCAweDAwMDAsIDB4MTA3OCwKKwkweDE5MmIsIDB4MDA3YywgMHg3ODhjLCAweGEwNjUsIDB4MDA0MCwgMHgxYzhjLCAweDIwOTEsIDB4ODAwMCwKKwkweDc4ODQsIDB4ODAwMSwgMHg3ODg2LCAweDJjMDQsIDB4Nzg4ZSwgMHhhMDA1LCAweDAwYzAsIDB4MWM4YSwKKwkweDc4OGEsIDB4ODAwMCwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHgyMGE5LCAweDAwMTAsIDB4YTAwNiwKKwkweDgwMDQsIDB4ODA4NiwgMHg4MThlLCAweDAwYzgsIDB4MWM5NiwgMHhhMjAwLCAweDAwNzAsIDB4MWM5YSwKKwkweDAwNzgsIDB4MWM5MSwgMHg4MDg2LCAweDgxOGUsIDB4MDA3YywgMHgxNTdlLCAweDIwYTksIDB4MDAxMCwKKwkweGEwMDUsIDB4MDA0MCwgMHgxY2MwLCAweGExMWEsIDB4MDBjOCwgMHgxY2MwLCAweDgyMTMsIDB4ODE4ZCwKKwkweDAwNDgsIDB4MWNiMSwgMHhhMTFhLCAweDAwYzgsIDB4MWNiMiwgMHgwMDcwLCAweDFjYjgsIDB4MDA3OCwKKwkweDFjYTYsIDB4YTExYSwgMHgyMzA4LCAweDgyMTAsIDB4MDA3MCwgMHgxY2I4LCAweDAwNzgsIDB4MWNhNiwKKwkweDAwN2UsIDB4MzIwMCwgMHhhMDg0LCAweGY3ZmYsIDB4MjA4MCwgMHgwMDdmLCAweDE1N2YsIDB4MDA3YywKKwkweDAwN2UsIDB4MzIwMCwgMHhhMDg1LCAweDA4MDAsIDB4MDA3OCwgMHgxY2JjLCAweDc5OTQsIDB4NzBkMCwKKwkweGExMDYsIDB4MDA0MCwgMHgxZDM0LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDAwMjAsIDB4NzAwNCwKKwkweGEwMDUsIDB4MDBjMCwgMHgxZDM0LCAweDcwMDgsIDB4NzIwOCwgMHhhMjA2LCAweDAwYzAsIDB4MWQzNCwKKwkweGEyODYsIDB4MDAwOCwgMHgwMGMwLCAweDFkMzQsIDB4MjA3MSwgMHgwMDEwLCAweDEwNzgsIDB4MTkxMSwKKwkweDAwNDAsIDB4MWQzNCwgMHg3YTljLCAweDdiOTgsIDB4N2NhNCwgMHg3ZGEwLCAweGExODQsIDB4ZmYwMCwKKwkweDAwNDAsIDB4MWQwMiwgMHgyMDMxLCAweDAwMDAsIDB4ODEwYiwgMHg4NmI1LCAweDgxMGIsIDB4ODZiNSwKKwkweDgxMGIsIDB4ODZiNSwgMHg4MTBiLCAweDg2YjUsIDB4ODEwYiwgMHg4NmI1LCAweDgxMGIsIDB4ODZiNSwKKwkweDIxMDAsIDB4YTIxMCwgMHgyNjAwLCAweGEzMTksIDB4YTRhMSwgMHgwMDAwLCAweGE1YTksIDB4MDAwMCwKKwkweDAwNzgsIDB4MWQwYywgMHg4MTA3LCAweDgwMDQsIDB4ODAwNCwgMHhhMjEwLCAweGEzOTksIDB4MDAwMCwKKwkweGE0YTEsIDB4MDAwMCwgMHhhNWE5LCAweDAwMDAsIDB4MjAwOSwgMHgwMDIwLCAweDEwNzgsIDB4MTkwYywKKwkweDIwOTEsIDB4ODAwMSwgMHgwMDQwLCAweDFkMmIsIDB4MTA3OCwgMHgxOTJiLCAweDc4YTgsIDB4ODAwMCwKKwkweDc4YWEsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4MWQzNCwgMHgyMDkxLCAweDgwMDAsIDB4NzhlMywKKwkweDAwMDIsIDB4NzhhYiwgMHgwMDAwLCAweDc4Y2MsIDB4YTA4NSwgMHgwMDAzLCAweDc4Y2UsIDB4MjA5MSwKKwkweDgwMDEsIDB4MDA3OCwgMHgxZDM0LCAweDc4YWIsIDB4MDAwMCwgMHgxMDc4LCAweDIwOGIsIDB4NjAwNCwKKwkweGEwODQsIDB4MDAwZiwgMHgwMDc5LCAweDFkMzksIDB4MjA3MSwgMHgwMDEwLCAweDIwOTEsIDB4ODAwMSwKKwkweDAwN2MsIDB4MWQ0OSwgMHgxZDZiLCAweDFkOTEsIDB4MWQ0OSwgMHgxZGFlLCAweDFkNTgsIDB4MWYwZCwKKwkweDFmMjgsIDB4MWQ0OSwgMHgxZDY1LCAweDFkOGIsIDB4MWRmNiwgMHgxZTYzLCAweDFlYjMsIDB4MWVjNSwKKwkweDFmMjQsIDB4MjAzOSwgMHgwNDAwLCAweDc4ZGMsIDB4YTcwNSwgMHg3OGRlLCAweDYwMDgsIDB4YTcwNSwKKwkweDYwMGEsIDB4MTA3OCwgMHgxZmE2LCAweDYwOWMsIDB4NzhkYSwgMHgxMDc4LCAweDIwNzMsIDB4MDA3YywKKwkweDc4ZGMsIDB4YTA4NCwgMHgwMTAwLCAweDAwNDAsIDB4MWQ1ZiwgMHgwMDc4LCAweDFkNDksIDB4NjAxYywKKwkweGEwODUsIDB4MDA4MCwgMHg2MDFlLCAweDAwNzgsIDB4MWQ3MiwgMHgxMDc4LCAweDFiMzYsIDB4MDBjMCwKKwkweDFkNDksIDB4MTA3OCwgMHgyMGE1LCAweDc4ZGMsIDB4YTA4NCwgMHgwMTAwLCAweDAwNDAsIDB4MWQ3MiwKKwkweDAwNzgsIDB4MWQ0OSwgMHg3OGRmLCAweDAwMDAsIDB4NjAwNCwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwKKwkweDc4ZDIsIDB4ODAwMSwgMHg2MDlmLCAweDAwMDAsIDB4MDA0MCwgMHgxZDg4LCAweDEwNzgsIDB4MWZhNiwKKwkweDAwNDAsIDB4MWQ4OCwgMHg3OGRjLCAweGEwODUsIDB4MDEwMCwgMHg3OGRlLCAweDAwNzgsIDB4MWQ4YSwKKwkweDEwNzgsIDB4MWZjYSwgMHgwMDdjLCAweDEwNzgsIDB4MWIzNiwgMHgwMGMwLCAweDFkNDksIDB4MTA3OCwKKwkweDIwYTEsIDB4NzhkYywgMHhhMDhjLCAweDBlMDAsIDB4MDBjMCwgMHgxZDlhLCAweGEwODQsIDB4MDEwMCwKKwkweDAwYzAsIDB4MWQ5YywgMHgwMDc4LCAweDFkNDksIDB4MTA3OCwgMHgxZmE2LCAweDAwYzAsIDB4MWRhZCwKKwkweDYxMDQsIDB4YTE4YywgMHgwMGZmLCAweGExODYsIDB4MDAwNywgMHgwMDQwLCAweDFmNjMsIDB4YTE4NiwKKwkweDAwMGYsIDB4MDA0MCwgMHgxZjYzLCAweDEwNzgsIDB4MWZjYSwgMHgwMDdjLCAweDc4ZGMsIDB4YTA4NCwKKwkweDAxMDAsIDB4MDA0MCwgMHgxZGI1LCAweDAwNzgsIDB4MWQ0OSwgMHg3OGRmLCAweDAwMDAsIDB4NjcxNCwKKwkweDIwMTEsIDB4MDAwMSwgMHgyMGE5LCAweDAwMDEsIDB4NjAxOCwgMHhhMDg0LCAweDAwZmYsIDB4YTAwNSwKKwkweDAwNDAsIDB4MWRkOCwgMHgyMDExLCAweDAwMDEsIDB4YTdiYywgMHhmZjAwLCAweDIwYTksIDB4MDAyMCwKKwkweGEwOGUsIDB4MDAwMSwgMHgwMDQwLCAweDFkZDgsIDB4MjAzOSwgMHgwMDAwLCAweDIwMTEsIDB4MDAwMiwKKwkweDIwYTksIDB4MDEwMCwgMHhhMDhlLCAweDAwMDIsIDB4MDA0MCwgMHgxZGQ4LCAweDAwNzgsIDB4MWRmMywKKwkweDEwNzgsIDB4MTk1NiwgMHgyMDkxLCAweDgwMDAsIDB4NjgyYiwgMHgwMDAwLCAweDY4MmYsIDB4MDAwMCwKKwkweDY4MDgsIDB4YTA4NCwgMHhmZmRlLCAweDY4MGEsIDB4YWRlOCwgMHgwMDEwLCAweDIwOTEsIDB4ODAwMSwKKwkweDAwNzAsIDB4MWRlYywgMHgwMDc4LCAweDFkZGEsIDB4ODIxMSwgMHgwMDQwLCAweDFkZjMsIDB4MjBhOSwKKwkweDAxMDAsIDB4MDA3OCwgMHgxZGRhLCAweDEwNzgsIDB4MTkyYiwgMHgwMDdjLCAweDIwMDEsIDB4NTA2NywKKwkweDIwMDQsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4MWY4YiwgMHg2MTE0LCAweDEwNzgsIDB4MjBjMiwKKwkweDY5MDAsIDB4YTE4NCwgMHgwMDAxLCAweDAwNDAsIDB4MWUxNywgMHg2MDI4LCAweGEwODQsIDB4MDBmZiwKKwkweDAwYzAsIDB4MWY4MywgMHg2ODAwLCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLCAweDFmOGIsIDB4NjgwMywKKwkweDAwMDAsIDB4NjgwYiwgMHgwMDAwLCAweDY4MDcsIDB4MDAwMCwgMHgwMDc4LCAweDFmOTMsIDB4MjAxMSwKKwkweDAwMDEsIDB4NjAyMCwgMHhhMDg0LCAweDQwMDAsIDB4MDA0MCwgMHgxZTIwLCAweGEyOTUsIDB4MDAwMiwKKwkweDYwMjAsIDB4YTA4NCwgMHgwMTAwLCAweDAwNDAsIDB4MWUyNywgMHhhMjk1LCAweDAwMDgsIDB4NjAxYywKKwkweGEwODQsIDB4MDAwMiwgMHgwMDQwLCAweDFlMmUsIDB4YTI5NSwgMHgwMDA0LCAweDYwMmMsIDB4YTA4YywKKwkweDAwZmYsIDB4YTE4MiwgMHgwMDAyLCAweDAwNDgsIDB4MWY4ZiwgMHhhMTgyLCAweDAwMWIsIDB4MDBjOCwKKwkweDFmOGYsIDB4MDA0MCwgMHgxZjhmLCAweDY5MGUsIDB4NjAyYywgMHg4MDA3LCAweGEwOGMsIDB4MDBmZiwKKwkweGExODIsIDB4MDAwMiwgMHgwMDQ4LCAweDFmOGYsIDB4YTE4MiwgMHgwMDFiLCAweDAwYzgsIDB4MWY4ZiwKKwkweDAwNDAsIDB4MWY4ZiwgMHg2OTEyLCAweDYwMzAsIDB4YTAwNSwgMHgwMGMwLCAweDFlNTEsIDB4MjAwMSwKKwkweDAwMWUsIDB4ODAwMCwgMHg2ODE2LCAweDYwMjgsIDB4YTA4NCwgMHgwMGZmLCAweDAwNDAsIDB4MWY4YiwKKwkweDY4MDYsIDB4NjAyOCwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHgwMDQwLCAweDFmOGIsIDB4NjgwYSwKKwkweDZhMDIsIDB4MDA3OCwgMHgxZjkzLCAweDIwMDEsIDB4NTA2NywgMHgyMDA0LCAweGEwODQsIDB4ODAwMCwKKwkweDAwNDAsIDB4MWY4YiwgMHg2MTE0LCAweDEwNzgsIDB4MjBjMiwgMHgyMDkxLCAweDgwMDAsIDB4NmEwNCwKKwkweDZiMDgsIDB4NjQxOCwgMHhhNDg0LCAweDAwMDMsIDB4MDA0MCwgMHgxZTg5LCAweDYxMjgsIDB4YTE4YywKKwkweDAwZmYsIDB4ODAwMSwgMHgwMGMwLCAweDFlODIsIDB4MjEwMCwgMHhhMjEwLCAweDAwNDgsIDB4MWVhZiwKKwkweDAwNzgsIDB4MWU4OSwgMHg4MDAxLCAweDAwYzAsIDB4MWVhZiwgMHgyMTAwLCAweGEyMTIsIDB4MDA0OCwKKwkweDFlYWYsIDB4YTQ4NCwgMHgwMDBjLCAweDAwNDAsIDB4MWVhMywgMHg2MTI4LCAweDgxMGYsIDB4YTE4YywKKwkweDAwZmYsIDB4YTA4MiwgMHgwMDA0LCAweDAwYzAsIDB4MWU5YiwgMHgyMTAwLCAweGEzMTgsIDB4MDA0OCwKKwkweDFlYWYsIDB4MDA3OCwgMHgxZWEzLCAweGEwODIsIDB4MDAwNCwgMHgwMGMwLCAweDFlYWYsIDB4MjEwMCwKKwkweGEzMWEsIDB4MDA0OCwgMHgxZWFmLCAweDYwMzAsIDB4YTAwNSwgMHgwMDQwLCAweDFlYTksIDB4ODAwMCwKKwkweDY4MTYsIDB4NmEwNiwgMHg2YjBhLCAweDIwOTEsIDB4ODAwMSwgMHgwMDc4LCAweDFmOTMsIDB4MjA5MSwKKwkweDgwMDEsIDB4MDA3OCwgMHgxZjhmLCAweDYxMTQsIDB4MTA3OCwgMHgyMGMyLCAweDIwOTEsIDB4ODAwMCwKKwkweDZiMDgsIDB4ODMxOCwgMHgwMDQ4LCAweDFlYzEsIDB4NmIwYSwgMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwKKwkweDFmYTIsIDB4MjA5MSwgMHg4MDAxLCAweDAwNzgsIDB4MWY4ZiwgMHg2MDI0LCAweDgwMDcsIDB4YTA4NCwKKwkweDAwZmYsIDB4MDA0MCwgMHgxZWUzLCAweGEwODYsIDB4MDA4MCwgMHgwMGMwLCAweDFmMGIsIDB4MjBhOSwKKwkweDAwMDgsIDB4MjA2OSwgMHg3NDEwLCAweDIwOTEsIDB4ODAwMCwgMHg2ODAwLCAweGEwODQsIDB4ZmNmZiwKKwkweDY4MDIsIDB4YWRlOCwgMHgwMDA4LCAweDAwNzAsIDB4MWVkZiwgMHgwMDc4LCAweDFlZDUsIDB4MjA5MSwKKwkweDgwMDEsIDB4MDA3OCwgMHgxZjkzLCAweDYwMjgsIDB4YTAxNSwgMHgwMDQwLCAweDFmMGIsIDB4NjExNCwKKwkweDEwNzgsIDB4MjBjMiwgMHgwZDdlLCAweGFkZTgsIDB4MDAwNywgMHgyMDkxLCAweDgwMDAsIDB4NjgwMCwKKwkweGEwMGQsIDB4MDA0MCwgMHgxZjA4LCAweGEyMDYsIDB4MDA0MCwgMHgxZWY5LCAweDIxNjgsIDB4MDA3OCwKKwkweDFlZWYsIDB4MGM3ZSwgMHgyMTYwLCAweDYwMDAsIDB4NjgwMiwgMHgxMDc4LCAweDE5MmIsIDB4MGM3ZiwKKwkweDBkN2YsIDB4NjgwOCwgMHg4MDAwLCAweDY4MGEsIDB4MjA5MSwgMHg4MDAxLCAweDAwNzgsIDB4MWZhMiwKKwkweDIwOTEsIDB4ODAwMSwgMHgwZDdmLCAweDAwNzgsIDB4MWY4YiwgMHg2MTE0LCAweDEwNzgsIDB4MjBjMiwKKwkweDY4MDAsIDB4YTA4NCwgMHgwMDAxLCAweDAwNDAsIDB4MWY3YiwgMHgyMDkxLCAweDgwMDAsIDB4NmEwNCwKKwkweDgyMTAsIDB4MDA0OCwgMHgxZjIwLCAweDZhMDYsIDB4MjA5MSwgMHg4MDAxLCAweDAwNzgsIDB4MWZhMiwKKwkweDIwOTEsIDB4ODAwMSwgMHgwMDc4LCAweDFmOGYsIDB4MTA3OCwgMHgxYjM2LCAweDAwYzAsIDB4MWQ0OSwKKwkweDYxMTQsIDB4MTA3OCwgMHgyMGMyLCAweDYwYmUsIDB4NjkwMCwgMHhhMTg0LCAweDAwMDgsIDB4MDA0MCwKKwkweDFmMzUsIDB4NjAyMCwgMHhhMDg1LCAweDAxMDAsIDB4NjAyMiwgMHhhMTg0LCAweDAwMDEsIDB4MDA0MCwKKwkweDFmOGIsIDB4YTE4NCwgMHgwMTAwLCAweDAwYzAsIDB4MWY3NywgMHhhMTg0LCAweDAyMDAsIDB4MDBjMCwKKwkweDFmNzMsIDB4NjgxYywgMHhhMDA1LCAweDAwYzAsIDB4MWY3ZiwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwKKwkweGEwODYsIDB4MDAwZiwgMHgwMGMwLCAweDFmNGUsIDB4MTA3OCwgMHgyMGE1LCAweDc4ZGYsIDB4MDAwMCwKKwkweDYwMDQsIDB4ODAwNywgMHhhMDg0LCAweDAwZmYsIDB4NzhkMiwgMHg4MDAxLCAweDYwOWYsIDB4MDAwMCwKKwkweDAwNDAsIDB4MWY2MywgMHgxMDc4LCAweDFmYTYsIDB4MDA0MCwgMHgxZjYzLCAweDc4ZGMsIDB4YTA4NSwKKwkweDAxMDAsIDB4NzhkZSwgMHgwMDdjLCAweDc4ZDcsIDB4MDAwMCwgMHg3OGRiLCAweDAwMDAsIDB4NjAyNCwKKwkweGEwODQsIDB4ZmYwMCwgMHg2MDI2LCAweDEwNzgsIDB4MzlhYSwgMHgwMDQwLCAweDFjYzYsIDB4MTA3OCwKKwkweDFiNWIsIDB4MDA3OCwgMHgxY2M2LCAweDIwMDksIDB4MDAxNywgMHgwMDc4LCAweDFmOTUsIDB4MjAwOSwKKwkweDAwMGUsIDB4MDA3OCwgMHgxZjk1LCAweDIwMDksIDB4MDAwNywgMHgwMDc4LCAweDFmOTUsIDB4MjAwOSwKKwkweDAwMzUsIDB4MDA3OCwgMHgxZjk1LCAweDIwMDksIDB4MDAzZSwgMHgwMDc4LCAweDFmOTUsIDB4MjAwOSwKKwkweDAwMDQsIDB4MDA3OCwgMHgxZjk1LCAweDIwMDksIDB4MDAwNiwgMHgwMDc4LCAweDFmOTUsIDB4MjAwOSwKKwkweDAwMTYsIDB4MDA3OCwgMHgxZjk1LCAweDIwMDksIDB4MDAwMSwgMHg2MDI0LCAweGEwODQsIDB4ZmYwMCwKKwkweGExMDUsIDB4NjAyNiwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHgxYzQyLCAweDIwOTEsIDB4ODAwMSwKKwkweDAwNzgsIDB4MWNjNiwgMHgxMDc4LCAweDE5MmIsIDB4MDA3OCwgMHgxY2M2LCAweDc4ZDQsIDB4YTA2ZCwKKwkweDAwYzAsIDB4MWZiMSwgMHgyYzAwLCAweDc4ZDYsIDB4NzhkYSwgMHg2MDlmLCAweDAwMDAsIDB4MDA3OCwKKwkweDFmYmQsIDB4MmMwMCwgMHg2ODllLCAweDYwOWYsIDB4MDAwMCwgMHg3OGQ2LCAweDJkMDAsIDB4NjAwMiwKKwkweDc4ZDgsIDB4YWQwNiwgMHgwMGMwLCAweDFmYmQsIDB4NjAwMiwgMHg3OGQwLCAweDgwMDEsIDB4NzhkMiwKKwkweDAwYzAsIDB4MWZjOSwgMHg3OGRjLCAweGEwODQsIDB4ZmVmZiwgMHg3OGRlLCAweDc4ZDgsIDB4MjA2MCwKKwkweGEwMDYsIDB4MDA3YywgMHhhMDJlLCAweDI1MzAsIDB4NjExYywgMHg2MWEyLCAweGExODQsIDB4ZTFmZiwKKwkweDYwMWUsIDB4YTE4NCwgMHgwMDYwLCAweDAwNDAsIDB4MWZkOSwgMHgwZTdlLCAweDEwNzgsIDB4NDY3ZiwKKwkweDBlN2YsIDB4NjU5NiwgMHg2NWE2LCAweDY2OWEsIDB4NjZhYSwgMHg2MGFmLCAweDAwMDAsIDB4NjBiMywKKwkweDAwMDAsIDB4NjcxNCwgMHgxMDc4LCAweDE5NTYsIDB4MjA5MSwgMHg4MDAwLCAweDYwYTAsIDB4YTA4NCwKKwkweDgwMDAsIDB4MDBjMCwgMHgyMDAwLCAweDY4MDgsIDB4YTA4NCwgMHgwMDAxLCAweDAwNDAsIDB4MjAwMCwKKwkweDIwOTEsIDB4ODAwMSwgMHgxMDc4LCAweDE5YTMsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4MWM0MiwKKwkweDIwOTEsIDB4ODAwMSwgMHg3OGQ3LCAweDAwMDAsIDB4NzhkYiwgMHgwMDAwLCAweDAwNzgsIDB4MjA3MiwKKwkweDYwMjQsIDB4YTA5NiwgMHgwMDAxLCAweDAwYzAsIDB4MjAwNywgMHg4MDAwLCAweDYwMjYsIDB4NmExMCwKKwkweDY4MTQsIDB4MjA5MSwgMHg4MDAxLCAweGEyMDIsIDB4MDA0OCwgMHgyMDE2LCAweDAwNDAsIDB4MjAxNiwKKwkweDIwMzksIDB4MDIwMCwgMHgxMDc4LCAweDIwNzMsIDB4MDA3OCwgMHgyMDcyLCAweDJjMDgsIDB4MjA5MSwKKwkweDgwMDAsIDB4NjBhMCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyMDQzLCAweDY4MDAsIDB4YTA2NSwKKwkweDAwNDAsIDB4MjA0OCwgMHg2YTA0LCAweDBlN2UsIDB4MjA3MSwgMHg1MDQwLCAweDcwMDAsIDB4YTA4NCwKKwkweDAwMDEsIDB4MDA0MCwgMHgyMDNkLCAweDcwNDgsIDB4YTIwNiwgMHgwMGMwLCAweDIwM2QsIDB4NmIwNCwKKwkweDIzMWMsIDB4MjE2MCwgMHg2MzAyLCAweDIzMDAsIDB4YTAwNSwgMHgwMGMwLCAweDIwMzgsIDB4NjkwMiwKKwkweDIyNjAsIDB4NjEwMiwgMHgwZTdmLCAweDAwNzgsIDB4MjA0ZiwgMHgyMTYwLCAweDYyMDIsIDB4NjkwNiwKKwkweDBlN2YsIDB4MDA3OCwgMHgyMDRmLCAweDY4MDAsIDB4YTA2NSwgMHgwMDQwLCAweDIwNDgsIDB4NjEwMiwKKwkweDY5MDIsIDB4MDBjMCwgMHgyMDRjLCAweDY5MDYsIDB4MjE2MCwgMHg2MDAzLCAweDAwMDAsIDB4MjE2MCwKKwkweDYwYTAsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4MjA1OSwgMHg2ODA4LCAweGEwODQsIDB4ZmZmYywKKwkweDY4MGEsIDB4NjgxMCwgMHg4MDAwLCAweDY4MTIsIDB4MjA5MSwgMHg4MDAxLCAweDY4MDgsIDB4YTA4YywKKwkweDAwNDAsIDB4MDA0MCwgMHgyMDY4LCAweGEwODYsIDB4MDA0MCwgMHg2ODBhLCAweDEwNzgsIDB4MTliNCwKKwkweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDIxYjEsIDB4MjA5MSwgMHg4MDAxLCAweDc4ZGIsIDB4MDAwMCwKKwkweDc4ZDcsIDB4MDAwMCwgMHgwMDdjLCAweDYwMDgsIDB4YTcwNSwgMHg2MDBhLCAweDIwOTEsIDB4ODAwMCwKKwkweDEwNzgsIDB4MWM0MiwgMHgyMDkxLCAweDgwMDEsIDB4NzhkOCwgMHhhMDY1LCAweDAwNDAsIDB4MjA4NiwKKwkweDYwOWMsIDB4NzhkYSwgMHg2MDlmLCAweDAwMDAsIDB4MDA3OCwgMHgyMDc2LCAweDc4ZDcsIDB4MDAwMCwKKwkweDc4ZGIsIDB4MDAwMCwgMHgwMDdjLCAweDc5OTAsIDB4Nzg5NCwgMHg4MDAwLCAweGExMGEsIDB4MDBjOCwKKwkweDIwOTIsIDB4YTAwNiwgMHg3ODk2LCAweDcwZDIsIDB4NzgwNCwgMHhhMDA1LCAweDAwNDAsIDB4MjBhMCwKKwkweDgwMDEsIDB4NzgwNiwgMHgwMGMwLCAweDIwYTAsIDB4MDA2OCwgMHgyMGEwLCAweDIwOTEsIDB4NDA4MCwKKwkweDAwN2MsIDB4MjAzOSwgMHgyMGI5LCAweDAwNzgsIDB4MjBhNywgMHgyMDM5LCAweDIwYmYsIDB4MjcwNCwKKwkweGEwMDUsIDB4MDA0MCwgMHgyMGI4LCAweGFjMDAsIDB4MjA2OCwgMHg2YjA4LCAweDZjMGMsIDB4NjkxMCwKKwkweDZhMTQsIDB4NjkwYSwgMHg2YTBlLCAweDZiMTIsIDB4NmMxNiwgMHg4NzM4LCAweDAwNzgsIDB4MjBhNywKKwkweDAwN2MsIDB4MDAwMywgMHgwMDA5LCAweDAwMGYsIDB4MDAxNSwgMHgwMDFiLCAweDAwMDAsIDB4MDAxNSwKKwkweDAwMWIsIDB4MDAwMCwgMHgwYzdlLCAweDEwNzgsIDB4M2IzMywgMHgyYzY4LCAweDBjN2YsIDB4MDA3YywKKwkweDAwMTAsIDB4MjEzOSwgMHgwMDY4LCAweDIxMzksIDB4MjAyOSwgMHgwMDAwLCAweDc4Y2IsIDB4MDAwMCwKKwkweDc4OGMsIDB4YTA2NSwgMHgwMDQwLCAweDIxMzIsIDB4MjAwOSwgMHg1MDc0LCAweDIxMDQsIDB4YTA4NCwKKwkweDAwMDEsIDB4MDA0MCwgMHgyMTAwLCAweDYwMDQsIDB4YTA4NiwgMHgwMTAzLCAweDAwYzAsIDB4MjEwMCwKKwkweDYwMTgsIDB4YTAwNSwgMHgwMGMwLCAweDIxMDAsIDB4NjAxNCwgMHhhMDA1LCAweDAwYzAsIDB4MjEwMCwKKwkweDBkN2UsIDB4MjA2OSwgMHgwMDAwLCAweDY4MTgsIDB4YTA4NCwgMHgwMDAxLCAweDAwYzAsIDB4MjBmZiwKKwkweDYwMGMsIDB4NzBjNiwgMHg2MDEwLCAweDcwY2EsIDB4NzBjMywgMHg4MDIwLCAweDY4MWIsIDB4MDAwMSwKKwkweDIwOTEsIDB4NDA4MCwgMHgwZDdmLCAweDEwNzgsIDB4MWM2OSwgMHgwMDc4LCAweDIxMzcsIDB4MGQ3ZiwKKwkweDEwNzgsIDB4MjEzYSwgMHgwMDQwLCAweDIxMzIsIDB4NjIwNCwgMHhhMjk0LCAweDAwZmYsIDB4YTI5NiwKKwkweDAwMDMsIDB4MDA0MCwgMHgyMTEyLCAweDYyMDQsIDB4YTI5NiwgMHgwMTEwLCAweDAwYzAsIDB4MjEyMCwKKwkweDc4Y2IsIDB4MDAwMSwgMHg2MjA0LCAweGEyOTQsIDB4ZmYwMCwgMHg4MjE3LCAweDgyMTEsIDB4MDA0MCwKKwkweDIxMjAsIDB4ODVmZiwgMHgwMGMwLCAweDIxMzIsIDB4ODIxMCwgMHhhMjAyLCAweDAwYzgsIDB4MjEzMiwKKwkweDA1N2UsIDB4MTA3OCwgMHgyMTQ5LCAweDA1N2YsIDB4MDA0MCwgMHgyMTJkLCAweDc4ZTAsIDB4YTA4NiwKKwkweDAwMDMsIDB4MDA0MCwgMHgyMTMyLCAweDAwNzgsIDB4MjEyMCwgMHg4NTI4LCAweDc4YzgsIDB4YTAwNSwKKwkweDAwNDAsIDB4MjBkMCwgMHg4NWZmLCAweDAwNDAsIDB4MjEzOSwgMHgyMDkxLCAweDQwODAsIDB4NzhiMCwKKwkweDcwZDYsIDB4MDA3YywgMHg3YmFjLCAweDc5YjAsIDB4NzBkNCwgMHhhMTAyLCAweDAwYzAsIDB4MjE0MywKKwkweDIzMDAsIDB4YTAwNSwgMHgwMDdjLCAweDAwNDgsIDB4MjE0NywgMHhhMzAyLCAweDAwN2MsIDB4ODAwMiwKKwkweDAwN2MsIDB4MjAwMSwgMHgwNGZkLCAweDIwMDQsIDB4YTA4MiwgMHgwMDA1LCAweDAwYzgsIDB4MjE2MywKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDAwMjAsIDB4NzAwNCwgMHhhMDA1LCAweDAwYzAsIDB4MjE5OCwKKwkweDcwMDgsIDB4NzIwOCwgMHhhMjA2LCAweDAwYzAsIDB4MjE5OCwgMHhhMjg2LCAweDAwMDgsIDB4MDBjMCwKKwkweDIxOTgsIDB4MjA3MSwgMHgwMDEwLCAweDEwNzgsIDB4MjE5ZCwgMHgyMDA5LCAweDAwMjAsIDB4NjAwNCwKKwkweGEwODYsIDB4MDEwMywgMHgwMGMwLCAweDIxNzIsIDB4NjAyOCwgMHhhMDA1LCAweDAwYzAsIDB4MjE3MiwKKwkweDIwMDksIDB4MDAwYywgMHgxMDc4LCAweDE5MDcsIDB4MDA0MCwgMHgyMThiLCAweDc4YzQsIDB4ODAwMCwKKwkweDc4YzYsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4MjE5OCwgMHgyMDkxLCAweDgwMDAsIDB4NzhlMywKKwkweDAwMDMsIDB4NzhjNywgMHgwMDAwLCAweDc4Y2MsIDB4YTA4NSwgMHgwMzAwLCAweDc4Y2UsIDB4MjA5MSwKKwkweDgwMDEsIDB4MDA3OCwgMHgyMTk4LCAweDc4YzcsIDB4MDAwMCwgMHgxMDc4LCAweDFjNjksIDB4NzlhYywKKwkweDc4YjAsIDB4ODAwMCwgMHhhMTBhLCAweDAwYzgsIDB4MjE5NiwgMHhhMDA2LCAweDc4YjIsIDB4YTAwNiwKKwkweDIwNzEsIDB4MDAxMCwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHg4MTA3LCAweDgwMDQsIDB4ODAwNCwKKwkweDdhYjgsIDB4N2JiNCwgMHg3Y2MwLCAweDdkYmMsIDB4YTIxMCwgMHhhMzk5LCAweDAwMDAsIDB4YTRhMSwKKwkweDAwMDAsIDB4YTVhOSwgMHgwMDAwLCAweDAwN2MsIDB4MjAwOSwgMHg1MDViLCAweDIwOTEsIDB4ODAwMCwKKwkweDIwMGEsIDB4MGY3ZSwgMHgwZTdlLCAweDIwNzEsIDB4NTA0MCwgMHg3MDAwLCAweGEwODYsIDB4MDAwMCwKKwkweDAwYzAsIDB4MjFjYiwgMHgyMDA5LCAweDUwMTIsIDB4MjEwNCwgMHhhMDA1LCAweDAwYzAsIDB4MjFjYiwKKwkweDIwNzksIDB4MDEwMCwgMHg3ODMwLCAweGEwODQsIDB4MDBjMCwgMHgwMGMwLCAweDIxY2IsIDB4MDAxOCwKKwkweDIxY2IsIDB4NzgxYiwgMHgwMDRiLCAweDBlN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDBmN2UsIDB4MGU3ZSwKKwkweDIwNzEsIDB4NTA0MCwgMHgyMDkxLCAweDgwMDAsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDBjMCwKKwkweDIxZTQsIDB4MjA3OSwgMHgwMTAwLCAweDc4MzAsIDB4YTA4NCwgMHgwMGMwLCAweDAwYzAsIDB4MjFlNCwKKwkweDAwMTgsIDB4MjFlNCwgMHg3ODFiLCAweDAwNGQsIDB4MjA5MSwgMHg4MDAxLCAweDBlN2YsIDB4MGY3ZiwKKwkweDAwN2MsIDB4MTI3ZSwgMHgyMDkxLCAweDIzMDAsIDB4MjA3MSwgMHg1MDQwLCAweDIwNzksIDB4MDEwMCwKKwkweDc4NGIsIDB4MDAwZiwgMHgwMDk4LCAweDIxZjcsIDB4NzgzOCwgMHgwMDc4LCAweDIxZjAsIDB4MjBhOSwKKwkweDAwNDAsIDB4NzgwMCwgMHhhMDgyLCAweDAwMDQsIDB4MDA0OCwgMHgyMjAwLCAweDIwYTksIDB4MDA2MCwKKwkweDc4OWIsIDB4MDAwMCwgMHg3OGFmLCAweDAwMDAsIDB4NzhhZiwgMHgwMDAwLCAweDAwNzAsIDB4MjIwYSwKKwkweDAwNzgsIDB4MjIwMiwgMHg3ODAwLCAweGEwODIsIDB4MDAwNCwgMHgwMDQ4LCAweDIyMTksIDB4NzBiNywKKwkweDAwOWIsIDB4MjAxOSwgMHg0ZGE0LCAweDEwNzgsIDB4MjI1NSwgMHg3MDJmLCAweDgwMDEsIDB4MDA3OCwKKwkweDIyMjUsIDB4NzBiNywgMHgwMDAwLCAweDIwMTksIDB4NGMxYywgMHgxMDc4LCAweDIyNTUsIDB4MjAxOSwKKwkweDRjNWIsIDB4MTA3OCwgMHgyMjU1LCAweDcwMmYsIDB4ODAwMCwgMHg3MDAzLCAweDAwMDAsIDB4MTA3OCwKKwkweDIzNWUsIDB4NzAwNCwgMHhhMDg0LCAweDAwMGYsIDB4MDE3ZSwgMHgyMDA5LCAweDA0ZmQsIDB4MjEwYywKKwkweGExOGEsIDB4MDAwNSwgMHgwMDQ4LCAweDIyM2EsIDB4MDAzOCwgMHgyMjQwLCAweGEwODUsIDB4NjI4MCwKKwkweDAwNzgsIDB4MjI0MiwgMHgwMDI4LCAweDIyNDAsIDB4YTA4NSwgMHg2MjgwLCAweDAwNzgsIDB4MjI0MiwKKwkweGEwODUsIDB4NjJjMCwgMHgwMTdmLCAweDc4MDYsIDB4NzgwZiwgMHhiMjA0LCAweDc4NDMsIDB4MDBkOCwKKwkweDc4NTMsIDB4MDA4MCwgMHg3ODBiLCAweDAwMDgsIDB4NzA0NywgMHgwMDA4LCAweDcwNTMsIDB4NTA3ZiwKKwkweDcwNGYsIDB4MDAwMCwgMHgxMjdmLCAweDIwMDAsIDB4MDA3YywgMHgxMzdlLCAweDE0N2UsIDB4MTU3ZSwKKwkweDA0N2UsIDB4MjBhMSwgMHgwMTJiLCAweDIzMDQsIDB4YTAwNSwgMHg3ODlhLCAweDAwNDAsIDB4MjI3NSwKKwkweDgzMTgsIDB4MjMyNCwgMHg4MzE4LCAweDIzOTgsIDB4MjRhOCwgMHhhNDg0LCAweGZmMDAsIDB4MDA0MCwKKwkweDIyNmQsIDB4YTQ4MiwgMHgwMTAwLCAweDIwYTksIDB4MDEwMCwgMHgyMDIwLCAweDUzYTYsIDB4YTAwNSwKKwkweDAwYzAsIDB4MjI2NCwgMHgzMzE4LCAweDAwNzgsIDB4MjI1YiwgMHgwNDdmLCAweDE1N2YsIDB4MTQ3ZiwKKwkweDEzN2YsIDB4MDA3YywgMHhhMThjLCAweDAwMGYsIDB4MjAxMSwgMHgwMTAxLCAweDIyMDQsIDB4YTA4NCwKKwkweGZmZjAsIDB4YTEwNSwgMHgyMDEyLCAweDEwNzgsIDB4MjM1ZSwgMHgwMDdjLCAweDIwMTEsIDB4MDEwMSwKKwkweDIwYTksIDB4MDAwOSwgMHg4MTBiLCAweDAwNzAsIDB4MjI4ZiwgMHgwMDc4LCAweDIyOGEsIDB4YTE4YywKKwkweDBlMDAsIDB4MjIwNCwgMHhhMDg0LCAweGYxZmYsIDB4YTEwNSwgMHgyMDEyLCAweDAwN2MsIDB4MjAwOSwKKwkweDAxMDEsIDB4MjBhOSwgMHgwMDA1LCAweDgyMTMsIDB4MDA3MCwgMHgyMmEwLCAweDAwNzgsIDB4MjI5YiwKKwkweGEyOTQsIDB4MDBlMCwgMHgyMTA0LCAweGEwODQsIDB4ZmYxZiwgMHhhMjA1LCAweDIwMGEsIDB4MDA3YywKKwkweDIwMTEsIDB4MDEwMSwgMHgyMGE5LCAweDAwMGMsIDB4ODEwYiwgMHgwMDcwLCAweDIyYjEsIDB4MDA3OCwKKwkweDIyYWMsIDB4YTE4YywgMHhmMDAwLCAweDIyMDQsIDB4YTA4NCwgMHgwZmZmLCAweGExMDUsIDB4MjAxMiwKKwkweDAwN2MsIDB4MjAxMSwgMHgwMTAyLCAweDIyMDQsIDB4YTA4NCwgMHhmZmNmLCAweGExMDUsIDB4MjAxMiwKKwkweDAwN2MsIDB4ODEwMywgMHg4MDAzLCAweGEwODAsIDB4MDAyMCwgMHgwYzdlLCAweDIwNjEsIDB4MDEwMCwKKwkweDYwOWEsIDB4NjJhYywgMHg2M2FjLCAweDBjN2YsIDB4MDA3YywgMHg4MTAzLCAweDgwMDMsIDB4YTA4MCwKKwkweDAwMjIsIDB4MGM3ZSwgMHgyMDYxLCAweDAxMDAsIDB4NjA5YSwgMHg2MGE0LCAweGEwODQsIDB4ZmZkZiwKKwkweDYwYWUsIDB4MGM3ZiwgMHgwMDdjLCAweDgxMDMsIDB4ODAwMywgMHhhMDgwLCAweDAwMjIsIDB4MGM3ZSwKKwkweDIwNjEsIDB4MDEwMCwgMHg2MDlhLCAweDYwYTQsIDB4YTA4NSwgMHgwMDIwLCAweDYwYWUsIDB4MGM3ZiwKKwkweDAwN2MsIDB4ODEwMywgMHg4MDAzLCAweGEwODAsIDB4MDAyMCwgMHgwYzdlLCAweDIwNjEsIDB4MDEwMCwKKwkweDYwOWEsIDB4NjBhNCwgMHg2MmFlLCAweDIwMTAsIDB4NjBhNCwgMHg2M2FlLCAweDIwMTgsIDB4MGM3ZiwKKwkweDAwN2MsIDB4MjA5MSwgMHg4MDAwLCAweDBjN2UsIDB4MGU3ZSwgMHg2ODE4LCAweGEwMDUsIDB4MDA0MCwKKwkweDIzM2MsIDB4MjA2MSwgMHg3NDAwLCAweDEwNzgsIDB4MjM0NCwgMHgwMDQwLCAweDIzMjgsIDB4MjBhOSwKKwkweDAwMDAsIDB4MjA2MSwgMHg3MzAwLCAweDBjN2UsIDB4MTA3OCwgMHgyMzQ0LCAweDAwNDAsIDB4MjMxOCwKKwkweDBjN2YsIDB4OGM2MCwgMHgwMDcwLCAweDIzMTYsIDB4MDA3OCwgMHgyMzBiLCAweDAwNzgsIDB4MjMzYywKKwkweDAwN2YsIDB4YTA4MiwgMHg3MzAwLCAweDIwNzEsIDB4NTA0MCwgMHg3MDg2LCAweDcxODIsIDB4MjAwMSwKKwkweDAwMDQsIDB4NzA2ZSwgMHg3MDkzLCAweDAwMGYsIDB4MTA3OCwgMHgyMWFjLCAweDAwNzgsIDB4MjMzOCwKKwkweDYwYzAsIDB4YTAwNSwgMHgwMGMwLCAweDIzM2MsIDB4MjA3MSwgMHg1MDQwLCAweDcxODIsIDB4MmMwMCwKKwkweDcwOGEsIDB4MjAwMSwgMHgwMDA2LCAweDcwNmUsIDB4NzA5MywgMHgwMDBmLCAweDEwNzgsIDB4MjFhYywKKwkweDIwMDEsIDB4MDAwMCwgMHgwMDc4LCAweDIzM2UsIDB4MjAwMSwgMHgwMDAxLCAweDIwOTEsIDB4ODAwMSwKKwkweGEwMDUsIDB4MGU3ZiwgMHgwYzdmLCAweDAwN2MsIDB4MmMwNCwgMHhhMDA1LCAweDAwNDAsIDB4MjM1YiwKKwkweDIwNjAsIDB4NjAwYywgMHhhMzA2LCAweDAwYzAsIDB4MjM1OCwgMHg2MDEwLCAweGEyMDYsIDB4MDBjMCwKKwkweDIzNTgsIDB4NjAxNCwgMHhhMTA2LCAweDAwYzAsIDB4MjM1OCwgMHhhMDA2LCAweDAwNzgsIDB4MjM1ZCwKKwkweDYwMDAsIDB4MDA3OCwgMHgyMzQ1LCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweDIwMTEsIDB4NTA0MSwKKwkweDIyMGMsIDB4YTE4YywgMHgwMDBmLCAweDIwMTEsIDB4MDEzYiwgMHgyMjA0LCAweGEwODQsIDB4MDEwMCwKKwkweDAwNDAsIDB4MjM3NCwgMHgyMDIxLCAweGZmMDQsIDB4MjEyMiwgMHg4MTBiLCAweDgxMGIsIDB4ODEwYiwKKwkweDgxMGIsIDB4YTE4ZCwgMHgwZjAwLCAweDIxMDQsIDB4MDA3YywgMHgwZTdlLCAweDY4ZTQsIDB4YTA4YywKKwkweDAwMjAsIDB4MDA0MCwgMHgyM2M4LCAweGEwODQsIDB4MDAwNiwgMHgwMGMwLCAweDIzYzgsIDB4NjAxNCwKKwkweDgwMDcsIDB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGEwZjAsIDB4NTI4MCwKKwkweDcwMDQsIDB4YTA4NCwgMHgwMDBhLCAweDAwYzAsIDB4MjNjOCwgMHg3MTA4LCAweGExOTQsIDB4ZmYwMCwKKwkweDAwNDAsIDB4MjNjOCwgMHhhMThjLCAweDAwZmYsIDB4MjAwMSwgMHgwMDBjLCAweGExMDYsIDB4MDA0MCwKKwkweDIzYWYsIDB4MjAwMSwgMHgwMDEyLCAweGExMDYsIDB4MDA0MCwgMHgyM2IzLCAweDIwMDEsIDB4MDAxNCwKKwkweGExMDYsIDB4MDA0MCwgMHgyM2I3LCAweDIwMDEsIDB4MDAxOSwgMHhhMTA2LCAweDAwNDAsIDB4MjNiYiwKKwkweDIwMDEsIDB4MDAzMiwgMHhhMTA2LCAweDAwNDAsIDB4MjNiZiwgMHgwMDc4LCAweDIzYzMsIDB4MjAwOSwKKwkweDAwMTIsIDB4MDA3OCwgMHgyM2M1LCAweDIwMDksIDB4MDAxNCwgMHgwMDc4LCAweDIzYzUsIDB4MjAwOSwKKwkweDAwMTksIDB4MDA3OCwgMHgyM2M1LCAweDIwMDksIDB4MDAyMCwgMHgwMDc4LCAweDIzYzUsIDB4MjAwOSwKKwkweDAwM2YsIDB4MDA3OCwgMHgyM2M1LCAweDIwMTEsIDB4MDAwMCwgMHgyMTAwLCAweGEyMDUsIDB4NzAwYSwKKwkweDBlN2YsIDB4MDA3YywgMHgwMDY4LCAweDIzY2EsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MDAwMCwKKwkweDAwN2UsIDB4NzAxOCwgMHhhMDg0LCAweDAwMDEsIDB4MDBjMCwgMHgyM2QxLCAweDAwN2YsIDB4MjA3MSwKKwkweDAwMTAsIDB4NzBjYSwgMHgwMDdmLCAweDcwYzYsIDB4NzBjMywgMHg4MDAyLCAweDcwZGIsIDB4MDczZiwKKwkweDcwZGYsIDB4MDAwMCwgMHgyMDcxLCAweDAwMDAsIDB4NzAxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwKKwkweDAwNzgsIDB4MjNlOCwgMHgxMDdlLCAweDAwN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDIzMDAsIDB4N2YzYywKKwkweDdlNTgsIDB4N2MzMCwgMHg3ZDM4LCAweDc3YzIsIDB4NzRjNiwgMHg3NmNhLCAweDc1Y2UsIDB4YTU5NCwKKwkweDAwM2YsIDB4YTQ5YywgMHgwMDAzLCAweGE0ODQsIDB4MDAwZiwgMHgwMDc5LCAweDIzZmYsIDB4MjQxMSwKKwkweDI0MTEsIDB4MjQxMSwgMHgyNzRiLCAweDM5MDcsIDB4MjQwZiwgMHgyNDQwLCAweDI0NGEsIDB4MjQwZiwKKwkweDI0MGYsIDB4MjQwZiwgMHgyNDBmLCAweDI0MGYsIDB4MjQwZiwgMHgyNDBmLCAweDI0MGYsIDB4MTA3OCwKKwkweDIzY2EsIDB4ODUwNywgMHhhMDg0LCAweDAwMWYsIDB4MDA3OSwgMHgyNDE2LCAweDI0NTQsIDB4Mjc0YiwKKwkweDI5MDUsIDB4MmEwMiwgMHgyYTJhLCAweDJjYzMsIDB4MmY2ZSwgMHgyZmIxLCAweDJmZmMsIDB4MzA4MSwKKwkweDMxMzksIDB4MzFlMiwgMHgyNDQwLCAweDI4MjcsIDB4MmY0MywgMHgyNDM2LCAweDNjNzgsIDB4M2M5OCwKKwkweDNlNWUsIDB4M2U2YSwgMHgzZjNmLCAweDI0MzYsIDB4MjQzNiwgMHg0MDEyLCAweDQwMTYsIDB4M2M3NiwKKwkweDI0MzYsIDB4M2RjOSwgMHgyNDM2LCAweDNiNTYsIDB4MjQ0YSwgMHgyNDM2LCAweDEwNzgsIDB4MjNjYSwKKwkweDAwMTgsIDB4MjNlZiwgMHgxMjdmLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdmLCAweDEwN2YsIDB4MDA3YywKKwkweDIwMTksIDB4NGNmZCwgMHgxMDc4LCAweDIyNTUsIDB4NzAyZiwgMHgwMDAxLCAweDc4MWIsIDB4MDA0ZiwKKwkweDAwNzgsIDB4MjQzOCwgMHgyMDE5LCAweDRjNWIsIDB4MTA3OCwgMHgyMjU1LCAweDcwMmYsIDB4ODAwMCwKKwkweDc4MWIsIDB4MDBkNSwgMHgwMDc4LCAweDI0MzgsIDB4NzI0MiwgMHgyMDA5LCAweDUwMGYsIDB4MjAwYiwKKwkweDAwMDAsIDB4YTU4NCwgMHgwMDAxLCAweDAwYzAsIDB4M2I2YSwgMHgwMDQwLCAweDI0NzEsIDB4MTA3OCwKKwkweDIzY2EsIDB4NzAwMywgMHgwMDAwLCAweDcwNGIsIDB4MDAwMCwgMHg3MDQzLCAweDAwMDAsIDB4NzAzNywKKwkweDAwMDAsIDB4MTA3OCwgMHgzOGRlLCAweDAwMTgsIDB4MjNlZiwgMHgyMDA5LCAweDUwMGYsIDB4MjAwYiwKKwkweDAwMDAsIDB4NzA2OCwgMHhhMDA1LCAweDAwYzAsIDB4MjUzYywgMHg3MDZjLCAweGEwODQsIDB4MDAwNywKKwkweDAwNzksIDB4MjQ3YSwgMHgyNTczLCAweDI0ODIsIDB4MjQ4ZSwgMHgyNGFiLCAweDI0Y2QsIDB4MjUxYSwKKwkweDI0ZjMsIDB4MjQ4MiwgMHgxMDc4LCAweDM4YzYsIDB4MjAwOSwgMHgwMDQ4LCAweDEwNzgsIDB4MmUwZiwKKwkweDAwYzAsIDB4MjQ4YywgMHg3MDAzLCAweDAwMDQsIDB4MDA3OCwgMHgyNDM4LCAweDEwNzgsIDB4MzhjNiwKKwkweDAwYzAsIDB4MjRhOSwgMHg3MDgwLCAweDgwMDcsIDB4Nzg4MiwgMHg3ODliLCAweDAwMTAsIDB4NzhhYiwKKwkweDAwMGMsIDB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwMSwgMHg3ODViLCAweDAwMDQsIDB4MjAwOSwKKwkweDAwZTUsIDB4MTA3OCwgMHgyZTAzLCAweDAwYzAsIDB4MjRhOSwgMHg3MDAzLCAweDAwMDQsIDB4NzA5MywKKwkweDAwMGYsIDB4MDA3OCwgMHgyNDM4LCAweDEwNzgsIDB4MzhjNiwgMHgwMGMwLCAweDI0Y2IsIDB4NzE4MCwKKwkweDgxMDcsIDB4Nzg4MiwgMHg3ODliLCAweDAwMTAsIDB4YTE4YywgMHgwMDFmLCAweGExOGQsIDB4MDBjMCwKKwkweDc5YWEsIDB4NzhhYiwgMHgwMDA2LCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLCAweDAwMDIsIDB4Nzg1YiwKKwkweDAwMDQsIDB4MjAwOSwgMHgwMGU1LCAweDEwNzgsIDB4MmUwMywgMHgwMGMwLCAweDI0Y2IsIDB4NzAwMywKKwkweDAwMDQsIDB4NzA5MywgMHgwMDBmLCAweDAwNzgsIDB4MjQzOCwgMHgxMDc4LCAweDM4YzYsIDB4MDBjMCwKKwkweDI0ZjEsIDB4NzE4MCwgMHg4MTA3LCAweDc4ODIsIDB4Nzg5YiwgMHgwMDEwLCAweGExOGMsIDB4MDAxZiwKKwkweGExOGQsIDB4MDBjMCwgMHg3OWFhLCAweDc4YWIsIDB4MDAyMCwgMHg3MTg0LCAweDc5YWEsIDB4NzhhYiwKKwkweDAwMGQsIDB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwNCwgMHg3ODViLCAweDAwMDQsIDB4MjAwOSwKKwkweDAwZTUsIDB4MTA3OCwgMHgyZTAzLCAweDAwYzAsIDB4MjRmMSwgMHg3MDAzLCAweDAwMDQsIDB4NzA5MywKKwkweDAwMGYsIDB4MDA3OCwgMHgyNDM4LCAweDEwNzgsIDB4MzhjNiwgMHgwMGMwLCAweDI1MTgsIDB4NzE4MCwKKwkweDgxMDcsIDB4Nzg4MiwgMHg3ODliLCAweDAwMTAsIDB4YTE4YywgMHgwMDFmLCAweGExOGQsIDB4MDBjMCwKKwkweDc5YWEsIDB4NzhhYiwgMHgwMDA2LCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLCAweDAwMDIsIDB4Nzg1YiwKKwkweDAwMDQsIDB4MjAwOSwgMHgwMGU1LCAweDEwNzgsIDB4MmUwMywgMHgwMGMwLCAweDI1MTgsIDB4NzA4OCwKKwkweDcwOGIsIDB4MDAwMCwgMHgyMDY4LCAweDcwNGEsIDB4NzAwMywgMHgwMDAyLCAweDcwOTMsIDB4MDAwZiwKKwkweDAwNzgsIDB4MjQzOCwgMHgxMDc4LCAweDM4YzYsIDB4MDBjMCwgMHgyNDM4LCAweDcwODgsIDB4MjA2OCwKKwkweDZmMTQsIDB4MTA3OCwgMHgzN2JkLCAweDJjNTAsIDB4MTA3OCwgMHgzOTc4LCAweDc4OWIsIDB4MDAxMCwKKwkweDY4MTQsIDB4YTA4NCwgMHgwMDFmLCAweGEwODUsIDB4MDA4MCwgMHg3OGFhLCAweDZlMWMsIDB4MjA0MSwKKwkweDAwMDEsIDB4NzA4YywgMHhhMDg0LCAweDA0MDAsIDB4MjAwMSwgMHgwMDA0LCAweDAwNDAsIDB4MjUzYSwKKwkweDIwMDEsIDB4MDAwNiwgMHgwMDc4LCAweDI2NWIsIDB4MTA3OCwgMHgzOGM2LCAweDAwYzAsIDB4MjQzOCwKKwkweDc4OWIsIDB4MDAxMCwgMHg3MDY4LCAweDIwNjgsIDB4NmYxNCwgMHgxMDc4LCAweDM3YmQsIDB4MmM1MCwKKwkweDEwNzgsIDB4Mzk3OCwgMHg2MDA4LCAweGEwODUsIDB4MDAxMCwgMHg2MDBhLCAweDY4MjQsIDB4YTAwNSwKKwkweDAwNDAsIDB4MjU1YSwgMHhhMDgyLCAweDAwMDYsIDB4MDA0OCwgMHgyNTU4LCAweDAwNzgsIDB4MjU1YSwKKwkweDY4MjcsIDB4MDAwNSwgMHg2YjE0LCAweGEzOWMsIDB4MDAxZiwgMHhhMzlkLCAweDAwYzAsIDB4NzA1OCwKKwkweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDI1NjgsIDB4YTY4NCwgMHgwMDAxLCAweDAwNDAsIDB4MjU2YSwKKwkweGEzOWMsIDB4ZmZiZiwgMHg3YmFhLCAweDIwMzEsIDB4MDAyMCwgMHgyMDQxLCAweDAwMDEsIDB4MjAwMSwKKwkweDAwMDMsIDB4MDA3OCwgMHgyNjViLCAweDAwMTgsIDB4MjNlZiwgMHg3NDRjLCAweGE0ODUsIDB4MDAwMCwKKwkweDAwNDAsIDB4MjU4ZCwgMHhhMDgwLCAweDUwODAsIDB4MjAzMCwgMHg3MTUwLCAweDgxMDgsIDB4YTEyYSwKKwkweDAwNDgsIDB4MjU4NCwgMHgyMDA5LCAweDUwODAsIDB4MjE2NCwgMHg2NTA0LCAweDg1ZmYsIDB4MDBjMCwKKwkweDI1OWUsIDB4ODQyMSwgMHgwMGMwLCAweDI1N2UsIDB4NzE1MiwgMHg3MDAzLCAweDAwMDAsIDB4NzA0YiwKKwkweDAwMDAsIDB4NzA0MCwgMHhhMDA1LCAweDAwNDAsIDB4M2I2YSwgMHgwMDc4LCAweDI0MzgsIDB4NzY0YywKKwkweGE2YjAsIDB4NTA4MCwgMHg3MTUwLCAweDI2MDAsIDB4MDA3OCwgMHgyNTg5LCAweDcxNTIsIDB4MjU2OCwKKwkweDI1NTgsIDB4NzU0YSwgMHgyYzUwLCAweDYwMzQsIDB4YTA4NSwgMHgwMDAwLCAweDAwYzAsIDB4MjU5YiwKKwkweDY3MDgsIDB4NzczYSwgMHhhNzg0LCAweDAzM2YsIDB4MDA0MCwgMHgyNWQ0LCAweGE3ODQsIDB4MDAyMSwKKwkweDAwYzAsIDB4MjU5YiwgMHhhNzg0LCAweDAwMDIsIDB4MDA0MCwgMHgyNWJkLCAweGE3ODQsIDB4MDAwNCwKKwkweDAwNDAsIDB4MjU5YiwgMHhhN2JjLCAweGZmZmIsIDB4NjcwYSwgMHhhNzg0LCAweDAwMDgsIDB4MDBjMCwKKwkweDI1OWIsIDB4YTc4NCwgMHgwMDEwLCAweDAwYzAsIDB4MjU5YiwgMHhhNzg0LCAweDAyMDAsIDB4MDBjMCwKKwkweDI1OWIsIDB4YTc4NCwgMHgwMTAwLCAweDAwNDAsIDB4MjVkNCwgMHg2MDE4LCAweGEwMDUsIDB4MDBjMCwKKwkweDI1OWIsIDB4YTdiYywgMHhmZWZmLCAweDY3MGEsIDB4NjgyMywgMHgwMDAwLCAweDZlMWMsIDB4YTY4NCwKKwkweDAwMGUsIDB4NjExOCwgMHgwMDQwLCAweDI1ZTQsIDB4NjAxYywgMHhhMTAyLCAweDAwNDgsIDB4MjVlNywKKwkweDAwNDAsIDB4MjVlNywgMHgwMDc4LCAweDI1OTcsIDB4ODFmZiwgMHgwMGMwLCAweDI1OTcsIDB4NjhjMywKKwkweDAwMDAsIDB4YTc4NCwgMHgwMDgwLCAweDAwYzAsIDB4MjVlZiwgMHg3MDBjLCAweDYwMjIsIDB4YTdiYywKKwkweGZmN2YsIDB4NjcwYSwgMHgxMDc4LCAweDM5NzgsIDB4MDAxOCwgMHgyM2VmLCAweDc4OWIsIDB4MDAxMCwKKwkweGEwNDYsIDB4MTA3OCwgMHgzOGM2LCAweDAwYzAsIDB4MjQzOCwgMHg2YjE0LCAweGEzOWMsIDB4MDAxZiwKKwkweGEzOWQsIDB4MDBjMCwgMHg3MDU4LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDI2MGIsIDB4YTY4NCwKKwkweDAwMDEsIDB4MDA0MCwgMHgyNjBkLCAweGEzOWMsIDB4ZmZiZiwgMHhhNjg0LCAweDAwMTAsIDB4MDA0MCwKKwkweDI2MTMsIDB4YTM5ZCwgMHgwMDIwLCAweDdiYWEsIDB4ODg0MCwgMHhhNjg0LCAweDAwMGUsIDB4MDBjMCwKKwkweDI2MWUsIDB4YTdiZCwgMHgwMDEwLCAweDY3MGEsIDB4MDA3OCwgMHgyNjU5LCAweDcxNTgsIDB4YTE4YywKKwkweDA4MDAsIDB4MDA0MCwgMHgzM2Q3LCAweDIwMTEsIDB4MDAyMCwgMHhhNjg0LCAweDAwMDgsIDB4MDBjMCwKKwkweDI2MmYsIDB4ODIxMCwgMHhhNjg0LCAweDAwMDIsIDB4MDBjMCwgMHgyNjJmLCAweDgyMTAsIDB4N2FhYSwKKwkweDg4NDAsIDB4MTA3OCwgMHgzOGRlLCAweDZhMTQsIDB4NjEwYywgMHg4MTA4LCAweGExOGMsIDB4MDBmZiwKKwkweGExZTAsIDB4NzMwMCwgMHgyYzY0LCAweDhjZmYsIDB4MDA0MCwgMHgyNjUwLCAweDYwMTQsIDB4YTIwNiwKKwkweDAwYzAsIDB4MjYzYSwgMHg2MGI4LCAweDgwMDEsIDB4NjBiYSwgMHgwMGMwLCAweDI2MzUsIDB4MGM3ZSwKKwkweDJhNjAsIDB4NjAwOCwgMHhhMDg1LCAweDAxMDAsIDB4NjAwYSwgMHgwYzdmLCAweDAwNzgsIDB4MjU3MywKKwkweDEwNzgsIDB4MzhjNiwgMHgwMGMwLCAweDI0MzgsIDB4MmE2MCwgMHg2MTBlLCAweDc5YWEsIDB4ODg0MCwKKwkweDcxMzIsIDB4MjAwMSwgMHgwMDAxLCAweDAwN2UsIDB4NzE1YywgMHhhMTg0LCAweDAwMTgsIDB4MDA0MCwKKwkweDI2NzYsIDB4YTE4NCwgMHgwMDEwLCAweDAwNDAsIDB4MjY2OSwgMHgxMDc4LCAweDM1ZDYsIDB4MDBjMCwKKwkweDI2OTksIDB4YTE4NCwgMHgwMDA4LCAweDAwNDAsIDB4MjY3NiwgMHg2OWEwLCAweGExODQsIDB4MDYwMCwKKwkweDAwYzAsIDB4MjY3NiwgMHgxMDc4LCAweDM0YzcsIDB4MDA3OCwgMHgyNjk5LCAweDY5YTAsIDB4YTE4NCwKKwkweDA4MDAsIDB4MDA0MCwgMHgyNjhkLCAweDBjN2UsIDB4MDI3ZSwgMHgyOTYwLCAweDYwMDAsIDB4YTA4NSwKKwkweDIwMDAsIDB4NjAwMiwgMHg2MTA0LCAweGExOGQsIDB4MDAxMCwgMHg2MTA2LCAweDAyN2YsIDB4MGM3ZiwKKwkweDEwNzgsIDB4MzVkNiwgMHgwMGMwLCAweDI2OTksIDB4NjlhMCwgMHhhMTg0LCAweDAyMDAsIDB4MDA0MCwKKwkweDI2OTUsIDB4MTA3OCwgMHgzNTE2LCAweDAwNzgsIDB4MjY5OSwgMHhhMTg0LCAweDA0MDAsIDB4MDBjMCwKKwkweDI2NzIsIDB4NjlhMCwgMHhhMTg0LCAweDEwMDAsIDB4MDA0MCwgMHgyNmE0LCAweDY5MTQsIDB4YTE4YywKKwkweGZmMDAsIDB4ODEwZiwgMHgxMDc4LCAweDIyY2QsIDB4MDA3ZiwgMHg3MDAyLCAweGE2OGMsIDB4MDBlMCwKKwkweGE2ODQsIDB4MDA2MCwgMHgwMDQwLCAweDI2YjIsIDB4YTA4NiwgMHgwMDYwLCAweDAwYzAsIDB4MjZiMiwKKwkweGExOGQsIDB4NDAwMCwgMHg4OGZmLCAweDAwNDAsIDB4MjZiNywgMHhhMThkLCAweDAwMDQsIDB4Nzk1YSwKKwkweDY5YjYsIDB4Nzg5YiwgMHgwMDYwLCAweDI4MDAsIDB4NzhhYSwgMHg3ODliLCAweDAwNjEsIDB4NjgxOCwKKwkweGEwOGQsIDB4ODAwMCwgMHhhMDg0LCAweDdmZmYsIDB4NjkxYSwgMHhhNjhjLCAweDAwODAsIDB4MDA0MCwKKwkweDI2ZDYsIDB4NzA5NywgMHgwMDAwLCAweGEwOGEsIDB4MDAwZCwgMHgwMDUwLCAweDI2ZDQsIDB4YTA4YSwKKwkweDAwMGMsIDB4NzE5NiwgMHgyMDAxLCAweDAwMGMsIDB4ODAwYywgMHg3MTlhLCAweDc4YWEsIDB4ODAwOCwKKwkweDgxMGMsIDB4MDA0MCwgMHgzM2RkLCAweGExOGMsIDB4MDBmOCwgMHgwMGMwLCAweDMzZGQsIDB4MTU3ZSwKKwkweDEzN2UsIDB4MTQ3ZSwgMHgyMGExLCAweDAxMmIsIDB4Nzg5YiwgMHgwMDAwLCAweDgwMDAsIDB4ODBhYywKKwkweGFkODAsIDB4MDAwYiwgMHgyMDk4LCAweDUzYTYsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsIDB4NjgxNCwKKwkweDgwMDcsIDB4Nzg4MiwgMHg2ZDk0LCAweDdkZDYsIDB4N2RkZSwgMHg2ZTk4LCAweDdlZDIsIDB4N2VkYSwKKwkweDEwNzgsIDB4MzhjNiwgMHgwMGMwLCAweDI3MGQsIDB4NzAyYywgMHg4MDAzLCAweDAwNDgsIDB4MjcwNiwKKwkweDIwMTksIDB4NGM1YiwgMHgxMDc4LCAweDIyNTUsIDB4NzAyZiwgMHg4MDAwLCAweDc4MzAsIDB4YTA4NCwKKwkweDAwYzAsIDB4MDBjMCwgMHgyNzBkLCAweDAwOTgsIDB4MjcxNSwgMHg2MDA4LCAweGEwODQsIDB4ZmZlZiwKKwkweDYwMGEsIDB4MTA3OCwgMHgzOGRlLCAweDAwNzgsIDB4MjQ2MSwgMHg3MjAwLCAweGEyODQsIDB4MDAwNywKKwkweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDI3MjIsIDB4NzgxYiwgMHgwMDRmLCAweDEwNzgsIDB4MzhkZSwKKwkweDAwNzgsIDB4MjczMywgMHg2YWI0LCAweGEyOTUsIDB4MjAwMCwgMHg3YTVhLCAweDc4MWIsIDB4MDA0ZiwKKwkweDEwNzgsIDB4MzhkZSwgMHg3MjAwLCAweDI1MDAsIDB4YTYwNSwgMHgwMDQwLCAweDI3MzMsIDB4YTI4NCwKKwkweDAwMDcsIDB4MTA3OSwgMHgyNzQxLCAweGFkODAsIDB4MDAwOSwgMHg3MDM2LCAweGEyODQsIDB4MDAwNywKKwkweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDI0MzgsIDB4NjAxOCwgMHg4MDAwLCAweDYwMWEsIDB4MDA3OCwKKwkweDI0MzgsIDB4Mjc0OSwgMHg0OGY3LCAweDQ4ZjcsIDB4NDhlNiwgMHg0OGY3LCAweDI3NDksIDB4NDhlNiwKKwkweDI3NDksIDB4MTA3OCwgMHgyM2NhLCAweDEwNzgsIDB4MzhjNiwgMHgwZjdlLCAweDIwNzksIDB4NTAwMCwKKwkweDc4Y2MsIDB4MGY3ZiwgMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgyNzZmLCAweDcwNmMsIDB4YTA4NiwKKwkweDAwMDEsIDB4MDBjMCwgMHgyNzVlLCAweDcwNmUsIDB4MDA3OCwgMHgyODAyLCAweDcwNmMsIDB4YTA4NiwKKwkweDAwMDUsIDB4MDBjMCwgMHgyNzZkLCAweDcwODgsIDB4MjA2OCwgMHg2ODFiLCAweDAwMDQsIDB4NjgxNywKKwkweDAwMDAsIDB4NjgyMCwgMHhhMDg1LCAweDAwMDgsIDB4NjgyMiwgMHg3MDZmLCAweDAwMDAsIDB4MjAxMSwKKwkweDAwMDQsIDB4NzE2YywgMHhhMTg2LCAweDAwMDEsIDB4MDA0MCwgMHgyNzkwLCAweGExODYsIDB4MDAwNywKKwkweDAwYzAsIDB4Mjc4MCwgMHgyMDA5LCAweDUwMzgsIDB4MjAwYiwgMHgwMDA1LCAweDAwNzgsIDB4Mjc5MCwKKwkweDIwMDksIDB4NTAxMywgMHgyMTA0LCAweDIwMDksIDB4NTAxMiwgMHgyMDBhLCAweDIwMDksIDB4NTAzOCwKKwkweDIwMGIsIDB4MDAwMSwgMHg3MDZmLCAweDAwMDAsIDB4NzA3MywgMHgwMDAxLCAweDAwNzgsIDB4Mjc5MiwKKwkweDcwNmYsIDB4MDAwMCwgMHgxMDc4LCAweDQ2MzMsIDB4MTU3ZSwgMHgyMGE5LCAweDAwMTAsIDB4MjAzOSwKKwkweDAwMDAsIDB4MTA3OCwgMHgzNmIwLCAweGE3YjgsIDB4MDEwMCwgMHgwMDcwLCAweDI3YTEsIDB4MDA3OCwKKwkweDI3OTksIDB4MTU3ZiwgMHg3MDAwLCAweDAwNzksIDB4MjdhNSwgMHgyN2QzLCAweDI3YmEsIDB4MjdiYSwKKwkweDI3YWQsIDB4MjdkMywgMHgyN2QzLCAweDI3ZDMsIDB4MjdkMywgMHgyMDIxLCAweDUwNWEsIDB4MjQwNCwKKwkweGEwMDUsIDB4MDA0MCwgMHgyN2QzLCAweGFkMDYsIDB4MDBjMCwgMHgyN2JhLCAweDY4MDAsIDB4MjAyMiwKKwkweDAwNzgsIDB4MjdjYSwgMHg2ODIwLCAweGEwODQsIDB4MDAwMSwgMHgwMGMwLCAweDI3YzYsIDB4NmYxNCwKKwkweDEwNzgsIDB4MzdiZCwgMHgxMDc4LCAweDMzYWUsIDB4MDA3OCwgMHgyN2NhLCAweDcwNjAsIDB4MjA2MCwKKwkweDY4MDAsIDB4NjAwMiwgMHg2YTFhLCAweDY4MTcsIDB4MDAwMCwgMHg2ODIwLCAweGEwODUsIDB4MDAwOCwKKwkweDY4MjIsIDB4MTA3OCwgMHgxYzUzLCAweDIwMjEsIDB4NzQwMCwgMHgxMDc4LCAweDI4MGYsIDB4MjAyMSwKKwkweDUwNWEsIDB4MTA3OCwgMHgyODBmLCAweDE1N2UsIDB4MjBhOSwgMHgwMDAwLCAweDIwMjEsIDB4NzMwMCwKKwkweDEwNzgsIDB4MjgwZiwgMHg4NDIwLCAweDAwNzAsIDB4MjdlNywgMHgwMDc4LCAweDI3ZTAsIDB4MjA2MSwKKwkweDUzMDAsIDB4MjAyMSwgMHgwMDAyLCAweDIwYTksIDB4MDEwMCwgMHg2MDE4LCAweDYxMTAsIDB4ODFmZiwKKwkweDAwNDAsIDB4MjdmNiwgMHhhMTAyLCAweDAwNTAsIDB4MjdmNiwgMHg2MDEyLCAweDYwMWIsIDB4MDAwMCwKKwkweGFjZTAsIDB4MDAxMCwgMHgwMDcwLCAweDI3ZmUsIDB4MDA3OCwgMHgyN2VkLCAweDg0MjEsIDB4MDBjMCwKKwkweDI3ZWIsIDB4MTU3ZiwgMHg3MDljLCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDI4MDksIDB4MTA3OCwKKwkweDM5Y2MsIDB4NzAwMywgMHgwMDAwLCAweDcwNGIsIDB4MDAwMCwgMHgwMDc4LCAweDI0MzgsIDB4MDQ3ZSwKKwkweDI0MDQsIDB4YTAwNSwgMHgwMDQwLCAweDI4MjMsIDB4MjA2OCwgMHg2ODAwLCAweDAwN2UsIDB4NmExYSwKKwkweDY4MTcsIDB4MDAwMCwgMHg2ODIwLCAweGEwODUsIDB4MDAwOCwgMHg2ODIyLCAweDEwNzgsIDB4MWM1MywKKwkweDAwN2YsIDB4MDA3OCwgMHgyODExLCAweDA0N2YsIDB4MjAyMywgMHgwMDAwLCAweDAwN2MsIDB4YTI4MiwKKwkweDAwMDMsIDB4MDA1MCwgMHgyODJkLCAweDEwNzgsIDB4MjNjYSwgMHgyMzAwLCAweDAwNzksIDB4MjgzMCwKKwkweDI4MzMsIDB4MjhhNiwgMHgyOGMzLCAweGEyODIsIDB4MDAwMiwgMHgwMDQwLCAweDI4MzksIDB4MTA3OCwKKwkweDIzY2EsIDB4NzA2YywgMHg3MDZmLCAweDAwMDAsIDB4NzA5MywgMHgwMDAwLCAweDAwNzksIDB4Mjg0MCwKKwkweDI4NDgsIDB4Mjg0OCwgMHgyODRhLCAweDI4N2UsIDB4MzNlMywgMHgyODQ4LCAweDI4N2UsIDB4Mjg0OCwKKwkweDEwNzgsIDB4MjNjYSwgMHg3NzgwLCAweDEwNzgsIDB4MzZiMCwgMHg3NzgwLCAweGE3YmMsIDB4MGYwMCwKKwkweDEwNzgsIDB4MzdiZCwgMHg2MDE4LCAweGEwMDUsIDB4MDA0MCwgMHgyODc1LCAweDIwMjEsIDB4NzQwMCwKKwkweDIwMDksIDB4MDAwNCwgMHgyMDExLCAweDAwMTAsIDB4MTA3OCwgMHgyOGRlLCAweDAwNDAsIDB4Mjg3NSwKKwkweDE1N2UsIDB4MjBhOSwgMHgwMDAwLCAweDIwMjEsIDB4NzMwMCwgMHgwNDdlLCAweDIwMDksIDB4MDAwNCwKKwkweDIwMTEsIDB4MDAxMCwgMHgxMDc4LCAweDI4ZGUsIDB4MDQ3ZiwgMHgwMDQwLCAweDI4NzQsIDB4ODQyMCwKKwkweDAwNzAsIDB4Mjg3NCwgMHgwMDc4LCAweDI4NjUsIDB4MTU3ZiwgMHg4NzM4LCAweGE3ODQsIDB4MDAxZiwKKwkweDAwYzAsIDB4Mjg1MCwgMHgwMDc4LCAweDI0NjEsIDB4MDA3OCwgMHgyNDYxLCAweDc3ODAsIDB4MTA3OCwKKwkweDM3YmQsIDB4NjAxOCwgMHhhMDA1LCAweDAwNDAsIDB4MjhhNCwgMHgyMDIxLCAweDc0MDAsIDB4MjAwOSwKKwkweDAwMDUsIDB4MjAxMSwgMHgwMDIwLCAweDEwNzgsIDB4MjhkZSwgMHgwMDQwLCAweDI4YTQsIDB4MTU3ZSwKKwkweDIwYTksIDB4MDAwMCwgMHgyMDIxLCAweDczMDAsIDB4MDQ3ZSwgMHgyMDA5LCAweDAwMDUsIDB4MjAxMSwKKwkweDAwMjAsIDB4MTA3OCwgMHgyOGRlLCAweDA0N2YsIDB4MDA0MCwgMHgyOGEzLCAweDg0MjAsIDB4MDA3MCwKKwkweDI4YTMsIDB4MDA3OCwgMHgyODk0LCAweDE1N2YsIDB4MDA3OCwgMHgyNDYxLCAweDIyMDAsIDB4MDA3OSwKKwkweDI4YTksIDB4MjhhYywgMHgyOGFlLCAweDI4YWUsIDB4MTA3OCwgMHgyM2NhLCAweDIwMDksIDB4MDAxMiwKKwkweDcwNmMsIDB4YTA4NiwgMHgwMDAyLCAweDAwNDAsIDB4MjhiNywgMHgyMDA5LCAweDAwMGUsIDB4NjgxOCwKKwkweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDI4YmQsIDB4NjkxYSwgMHg3MDZmLCAweDAwMDAsIDB4NzA3MywKKwkweDAwMDEsIDB4MDA3OCwgMHgzODU0LCAweDIyMDAsIDB4MDA3OSwgMHgyOGM2LCAweDI4Y2IsIDB4MjhhZSwKKwkweDI4YzksIDB4MTA3OCwgMHgyM2NhLCAweDEwNzgsIDB4NDYzMywgMHg3MDAwLCAweGEwODYsIDB4MDAwMSwKKwkweDAwYzAsIDB4MzM3MywgMHgxMDc4LCAweDMzYzQsIDB4NjAwOCwgMHhhMDg0LCAweGZmZWYsIDB4NjAwYSwKKwkweDEwNzgsIDB4MzM2NiwgMHgwMDQwLCAweDMzNzMsIDB4MDA3OCwgMHgyNTczLCAweDI0MDQsIDB4YTAwNSwKKwkweDAwNDAsIDB4MjkwMSwgMHgyMDY4LCAweDJkMDQsIDB4MDA3ZSwgMHg2ODE0LCAweGE3MDYsIDB4MDA0MCwKKwkweDI4ZWQsIDB4MmQyMCwgMHgwMDdmLCAweDAwNzgsIDB4MjhkZiwgMHgwMDdmLCAweDIwMjIsIDB4NjkxYSwKKwkweDY4MTcsIDB4MDAwMCwgMHg2ODIwLCAweGEyMDUsIDB4NjgyMiwgMHgxMDc4LCAweDFjNTMsIDB4NjAxMCwKKwkweDgwMDEsIDB4NjAxMiwgMHg2MDA4LCAweGEwODQsIDB4ZmZlZiwgMHg2MDBhLCAweDEwNzgsIDB4MzNjNCwKKwkweDAwN2MsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsIDB4MjkwMCwgMHgyMzAwLCAweDAwNzksIDB4MjkwOCwKKwkweDI5MGQsIDB4MjkwYiwgMHgyOWE2LCAweDEwNzgsIDB4MjNjYSwgMHg3OGVjLCAweGEwODQsIDB4MDAwMSwKKwkweDAwYzAsIDB4MjkyMSwgMHg3MDAwLCAweGEwODYsIDB4MDAwNCwgMHgwMGMwLCAweDI5MTksIDB4MDA3OCwKKwkweDI5NDQsIDB4MTA3OCwgMHgzM2M0LCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLCAweDYwMGEsIDB4MDA3OCwKKwkweDMzNzMsIDB4NzhlNCwgMHhhMDA1LCAweDAwZDAsIDB4Mjk0NCwgMHgwMDE4LCAweDI0MzgsIDB4MjAwOCwKKwkweGEwODQsIDB4MDAzMCwgMHgwMGMwLCAweDI5MzAsIDB4NzgxYiwgMHgwMDRmLCAweDAwNzgsIDB4MjQzOCwKKwkweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDAwNDAsIDB4MjkyYywgMHgyMTAwLCAweGEwODQsIDB4MDAwNywKKwkweDAwNzksIDB4MjkzYSwgMHgyOTdkLCAweDI5ODgsIDB4Mjk2ZSwgMHgyOTQyLCAweDM4YjksIDB4MzhiOSwKKwkweDI5NDIsIDB4Mjk5NywgMHgxMDc4LCAweDIzY2EsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDQsIDB4MDBjMCwKKwkweDI5NWUsIDB4NzA2YywgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHgyOTU0LCAweDIwMTEsIDB4MDAwMiwKKwkweDIwMTksIDB4MDAwMCwgMHgwMDc4LCAweDI4MjcsIDB4NzA2YywgMHhhMDg2LCAweDAwMDYsIDB4MDA0MCwKKwkweDI5NGUsIDB4NzA2YywgMHhhMDg2LCAweDAwMDQsIDB4MDA0MCwgMHgyOTRlLCAweDc5ZTQsIDB4YTE4NCwKKwkweDAwMzAsIDB4MDA0MCwgMHgyOTY4LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDAwYzAsIDB4Mjk2YSwKKwkweDAwNzgsIDB4MmY0MywgMHgyMDAxLCAweDAwMDMsIDB4MDA3OCwgMHgyY2Q3LCAweDY4MTgsIDB4YTA4NCwKKwkweDgwMDAsIDB4MDA0MCwgMHgyOTc1LCAweDY4MWIsIDB4MDAxZCwgMHgxMDc4LCAweDM2OGYsIDB4NzgyYiwKKwkweDMwMDgsIDB4NzgxYiwgMHgwMDU2LCAweDAwNzgsIDB4MjQzOCwgMHg2ODE4LCAweGEwODQsIDB4ODAwMCwKKwkweDAwNDAsIDB4Mjk4NCwgMHg2ODFiLCAweDAwMWQsIDB4MTA3OCwgMHgzNjhmLCAweDAwNzgsIDB4Mzg4NCwKKwkweDY4MTgsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4Mjk4ZiwgMHg2ODFiLCAweDAwMWQsIDB4MTA3OCwKKwkweDM2OGYsIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDBkMiwgMHgwMDc4LCAweDI0MzgsIDB4NjgxOCwKKwkweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDI5OWUsIDB4NjgxYiwgMHgwMDFkLCAweDEwNzgsIDB4MzY4ZiwKKwkweDc4MmIsIDB4MzAwOCwgMHg3ODFiLCAweDAwOTMsIDB4MDA3OCwgMHgyNDM4LCAweGE1ODQsIDB4MDAwZiwKKwkweDAwYzAsIDB4MjljMywgMHg3MDAwLCAweDAwNzksIDB4MjlhZCwgMHgyNDYxLCAweDI5YjcsIDB4MjliNSwKKwkweDMzNzMsIDB4MzM3MywgMHgzMzczLCAweDMzNzMsIDB4MjliNSwgMHgxMDc4LCAweDIzY2EsIDB4MTA3OCwKKwkweDMzYzQsIDB4NjAwOCwgMHhhMDg0LCAweGZmZWYsIDB4NjAwYSwgMHgxMDc4LCAweDMzNjYsIDB4MDA0MCwKKwkweDMzNzMsIDB4MDA3OCwgMHgyNTczLCAweDc4ZTQsIDB4YTAwNSwgMHgwMGQwLCAweDI5NDQsIDB4MDAxOCwKKwkweDI5NDQsIDB4MjAwOCwgMHhhMDg0LCAweDAwMzAsIDB4MDBjMCwgMHgyOWQyLCAweDc4MWIsIDB4MDA0ZiwKKwkweDAwNzgsIDB4MjQzOCwgMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwMDQwLCAweDI5Y2UsIDB4MjEwMCwKKwkweGExODQsIDB4MDAwNywgMHgwMDc5LCAweDI5ZGMsIDB4MjllZSwgMHgyOWYyLCAweDI5ZTYsIDB4MjllNCwKKwkweDM4YjksIDB4MzhiOSwgMHgyOWU0LCAweDM4YWYsIDB4MTA3OCwgMHgyM2NhLCAweDEwNzgsIDB4MzY5NywKKwkweDc4MmIsIDB4MzAwOCwgMHg3ODFiLCAweDAwNTYsIDB4MDA3OCwgMHgyNDM4LCAweDEwNzgsIDB4MzY5NywKKwkweDAwNzgsIDB4Mzg4NCwgMHgxMDc4LCAweDM2OTcsIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDBkMiwKKwkweDAwNzgsIDB4MjQzOCwgMHgxMDc4LCAweDM2OTcsIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA5MywKKwkweDAwNzgsIDB4MjQzOCwgMHgyMzAwLCAweDAwNzksIDB4MmEwNSwgMHgyYTBhLCAweDJhMDgsIDB4MmEwYywKKwkweDEwNzgsIDB4MjNjYSwgMHgwMDc4LCAweDMwODEsIDB4NjgxYiwgMHgwMDA4LCAweDc4YTMsIDB4MDAwMCwKKwkweDc5ZTQsIDB4YTE4NCwgMHgwMDMwLCAweDAwNDAsIDB4MzA4MSwgMHg3OGVjLCAweGEwODQsIDB4MDAwMywKKwkweDAwNDAsIDB4MzA4MSwgMHhhMTg0LCAweDAwMDcsIDB4MDA3OSwgMHgyYTFlLCAweDJhMjYsIDB4MjlmMiwKKwkweDI5NmUsIDB4Mzg1NCwgMHgzOGI5LCAweDM4YjksIDB4MmEyNiwgMHgzOGFmLCAweDEwNzgsIDB4Mzg2OCwKKwkweDAwNzgsIDB4MjQzOCwgMHhhMjgyLCAweDAwMDUsIDB4MDA1MCwgMHgyYTMwLCAweDEwNzgsIDB4MjNjYSwKKwkweDIzMDAsIDB4MDA3OSwgMHgyYTMzLCAweDJhMzYsIDB4MmM4NCwgMHgyYzkyLCAweDIyMDAsIDB4MDA3OSwKKwkweDJhMzksIDB4MmE1MywgMHgyYTQwLCAweDJhNTMsIDB4MmEzZSwgMHgyYzY5LCAweDEwNzgsIDB4MjNjYSwKKwkweDc4OWIsIDB4MDAxOCwgMHg3OGE4LCAweGEwODQsIDB4MDBmZiwgMHhhMDgyLCAweDAwMjAsIDB4MDA0OCwKKwkweDM2NmIsIDB4YTA4YSwgMHgwMDA0LCAweDAwYzgsIDB4MzY2YiwgMHgwMDc5LCAweDJhNGYsIDB4MzY2YiwKKwkweDM2NmIsIDB4MzY2YiwgMHgzNjE5LCAweDc4OWIsIDB4MDAxOCwgMHg3OWE4LCAweGExODQsIDB4MDA4MCwKKwkweDAwNDAsIDB4MmE2NCwgMHgwMDc4LCAweDM2NmIsIDB4NzAwMCwgMHhhMDA1LCAweDAwYzAsIDB4MmE1YSwKKwkweDIwMTEsIDB4MDAwNCwgMHgwMDc4LCAweDMxZjUsIDB4YTE4NCwgMHgwMGZmLCAweGEwOGEsIDB4MDAxMCwKKwkweDAwYzgsIDB4MzY2YiwgMHgwMDc5LCAweDJhNmMsIDB4MmE3ZSwgMHgyYTdjLCAweDJhOTYsIDB4MmE5YSwKKwkweDJiNTUsIDB4MzY2YiwgMHgzNjZiLCAweDJiNTcsIDB4MzY2YiwgMHgzNjZiLCAweDJjNjUsIDB4MmM2NSwKKwkweDM2NmIsIDB4MzY2YiwgMHgzNjZiLCAweDJjNjcsIDB4MTA3OCwgMHgyM2NhLCAweGE2ODQsIDB4MTAwMCwKKwkweDAwNDAsIDB4MmE4YiwgMHgyMDAxLCAweDA1MDAsIDB4ODAwMCwgMHg4MDAwLCAweDc4M2EsIDB4NzgxYiwKKwkweDAwOTEsIDB4MDA3OCwgMHgyNDM4LCAweDY4MTgsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4MmE5NCwKKwkweDY4MWIsIDB4MDAxZCwgMHgwMDc4LCAweDJhODIsIDB4MDA3OCwgMHgzODU0LCAweDY4MWIsIDB4MDAxZCwKKwkweDAwNzgsIDB4MzY3YiwgMHg2OTIwLCAweDY5MjIsIDB4YTY4NCwgMHgxODAwLCAweDAwYzAsIDB4MmFkYiwKKwkweDY4MjAsIDB4YTA4NCwgMHgwMDAxLCAweDAwYzAsIDB4MmFlMSwgMHg2ODE4LCAweGEwODYsIDB4MDAwOCwKKwkweDAwYzAsIDB4MmFhYywgMHg2ODFiLCAweDAwMDAsIDB4YTY4NCwgMHgwNDAwLCAweDAwNDAsIDB4MmI1MSwKKwkweGE2ODQsIDB4MDA4MCwgMHgwMDQwLCAweDJhZDcsIDB4NzA5NywgMHgwMDAwLCAweDY4MTgsIDB4YTA4NCwKKwkweDAwM2YsIDB4YTA4YSwgMHgwMDBkLCAweDAwNTAsIDB4MmFkNywgMHhhMDhhLCAweDAwMGMsIDB4NzE5NiwKKwkweDIwMDEsIDB4MDAwYywgMHg4MDBjLCAweDcxOWEsIDB4Nzg5YiwgMHgwMDYxLCAweDc4YWEsIDB4MTU3ZSwKKwkweDEzN2UsIDB4MTQ3ZSwgMHgyMGExLCAweDAxMmIsIDB4Nzg5YiwgMHgwMDAwLCAweDgwMDAsIDB4ODBhYywKKwkweGFkODAsIDB4MDAwYiwgMHgyMDk4LCAweDUzYTYsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsIDB4NzgxYiwKKwkweDAwNTgsIDB4MDA3OCwgMHgyNDM4LCAweGE2ODQsIDB4MTAwMCwgMHgwMDQwLCAweDJhZTEsIDB4MDA3OCwKKwkweDI0MzgsIDB4YTY4NCwgMHgwMDYwLCAweDAwNDAsIDB4MmI0ZCwgMHhhNjg0LCAweDA4MDAsIDB4MDA0MCwKKwkweDJiNGQsIDB4YTY4NCwgMHg4MDAwLCAweDAwYzAsIDB4MmFlZiwgMHgwMDc4LCAweDJiMDksIDB4YTZiNCwKKwkweDdmZmYsIDB4N2U1YSwgMHg2ZWI2LCAweDc4OWIsIDB4MDA3NiwgMHg3YWFjLCAweDc5YWMsIDB4NzhhYywKKwkweDgwMWIsIDB4MDBjOCwgMHgyYWZjLCAweDgwMDAsIDB4YTA4NCwgMHgwMDNmLCAweGExMDgsIDB4YTI5MSwKKwkweDAwMDAsIDB4NmI5OCwgMHgyMTAwLCAweGEzMDIsIDB4NjhiMiwgMHg2Yjk0LCAweDIyMDAsIDB4YTMwMywKKwkweDY4YWUsIDB4YTY4NCwgMHg0MDAwLCAweDAwNDAsIDB4MmIxMSwgMHhhNmI0LCAweGJmZmYsIDB4N2U1YSwKKwkweDZlYjYsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHgyYjFlLCAweDEwNzgsIDB4NDZlOSwKKwkweDEwNzgsIDB4NDhlNiwgMHg3ODFiLCAweDAwNjQsIDB4MDA3OCwgMHgyNDM4LCAweGEwMDYsIDB4MTA3OCwKKwkweDQ5ZWQsIDB4NmFiMCwgMHg2OWFjLCAweDZjOTgsIDB4NmI5NCwgMHgyMjAwLCAweGExMDUsIDB4MDA0MCwKKwkweDJiMmQsIDB4MjIwMCwgMHhhNDIyLCAweDIxMDAsIDB4YTMxYiwgMHg2Y2FhLCAweDdjZDIsIDB4N2NkYSwKKwkweDZiYTYsIDB4N2JkNiwgMHg3YmRlLCAweDIzMDAsIDB4YTQwNSwgMHgwMGMwLCAweDJiM2YsIDB4YTZiNSwKKwkweDQwMDAsIDB4N2U1YSwgMHg2ZWI2LCAweDc4MWIsIDB4MDA2NCwgMHgwMDc4LCAweDI0MzgsIDB4NzgxYiwKKwkweDAwNjQsIDB4MjIwMCwgMHhhMTE1LCAweDAwYzAsIDB4MmI0OSwgMHgxMDc4LCAweDQ4ZjcsIDB4MDA3OCwKKwkweDI0MzgsIDB4MTA3OCwgMHg0OTQyLCAweDAwNzgsIDB4MjQzOCwgMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwKKwkweDI0MzgsIDB4NzgxYiwgMHgwMDU4LCAweDAwNzgsIDB4MjQzOCwgMHgxMDc4LCAweDIzY2EsIDB4MDA3OCwKKwkweDJiYjgsIDB4NjkyMCwgMHhhMTg0LCAweDAxMDAsIDB4MDA0MCwgMHgyYjZmLCAweGExOGMsIDB4ZmVmZiwKKwkweDY5MjIsIDB4MGM3ZSwgMHg3MDU0LCAweDIwNjAsIDB4NjAwMCwgMHhhMDg0LCAweGVmZmYsIDB4NjAwMiwKKwkweDYwMDQsIDB4YTA4NCwgMHhmZmY1LCAweDYwMDYsIDB4MGM3ZiwgMHgwMDc4LCAweDJiYTcsIDB4YTE4NCwKKwkweDAyMDAsIDB4MDA0MCwgMHgyYmE3LCAweGExOGMsIDB4ZmRmZiwgMHg2OTIyLCAweDBjN2UsIDB4NzA1NCwKKwkweDIwNjAsIDB4NjAwMCwgMHhhMDg0LCAweGRmZmYsIDB4NjAwMiwgMHg2MDA0LCAweGEwODQsIDB4ZmZlZiwKKwkweDYwMDYsIDB4MjAwOCwgMHgyYzQ4LCAweDBjN2YsIDB4YTE4NCwgMHgwMDA4LCAweDAwNDAsIDB4MmJhNywKKwkweDEwNzgsIDB4MzdiOSwgMHgxMDc4LCAweDM0YzcsIDB4ODhmZiwgMHgwMDQwLCAweDJiYTcsIDB4Nzg5YiwKKwkweDAwNjAsIDB4MjgwMCwgMHg3OGFhLCAweDdlNTgsIDB4YTZiNSwgMHgwMDA0LCAweDdlNWEsIDB4YTY4NCwKKwkweDA0MDAsIDB4MDBjMCwgMHgyYmExLCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLCAweDAwNTYsIDB4MDA3OCwKKwkweDI0MzgsIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0MzgsIDB4N2U1OCwKKwkweGE2ODQsIDB4MDQwMCwgMHgwMGMwLCAweDJiYjAsIDB4NzgxYiwgMHgwMDU4LCAweDAwNzgsIDB4MjQzOCwKKwkweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0MzgsIDB4MDA3OCwgMHgzNjczLCAweDAwNzgsIDB4MzY3MywKKwkweDIwMTksIDB4MDAwMCwgMHg3OTkwLCAweGExOGMsIDB4MDAwNywgMHgwMDQwLCAweDJiYjYsIDB4Nzg5YiwKKwkweDAwMTAsIDB4NzhhOCwgMHhhMDk0LCAweDAwZmYsIDB4YTI4NiwgMHgwMDAxLCAweDAwYzAsIDB4MmJmNiwKKwkweDIzMDAsIDB4N2NhOCwgMHhhNDAwLCAweDIwMTgsIDB4YTEwMiwgMHgwMDQwLCAweDJiZWUsIDB4MDA0OCwKKwkweDJiZDMsIDB4MDA3OCwgMHgyYmYwLCAweGEzODAsIDB4MDAwMiwgMHhhMTAyLCAweDAwYzgsIDB4MmJlZSwKKwkweDY5MjAsIDB4YTE4YywgMHhmY2ZmLCAweDY5MjIsIDB4MGM3ZSwgMHg3MDU0LCAweDIwNjAsIDB4NjAwMCwKKwkweGEwODQsIDB4ZWZlZiwgMHg2MDAyLCAweDYwMDQsIDB4YTA4NCwgMHhmZmU1LCAweDYwMDYsIDB4MGM3ZiwKKwkweDdlNTgsIDB4YTZiNCwgMHhmZmZiLCAweDdlNWEsIDB4MDA3OCwgMHgyYmE4LCAweDAwNzgsIDB4MmI1OSwKKwkweDI0YTgsIDB4N2FhOCwgMHgwMGYwLCAweDJiZjAsIDB4MDA3OCwgMHgyYmMxLCAweGEyODQsIDB4MDBmMCwKKwkweGEwODYsIDB4MDAyMCwgMHgwMGMwLCAweDJjNTYsIDB4ODMxOCwgMHg4MzE4LCAweDIzMDAsIDB4YTEwMiwKKwkweDAwNDAsIDB4MmMwNiwgMHgwMDQ4LCAweDJjMDYsIDB4MDA3OCwgMHgyYzUzLCAweGEyODYsIDB4MDAyMywKKwkweDAwNDAsIDB4MmJiNiwgMHg2ODFjLCAweGEwODQsIDB4ZmZmMSwgMHg2ODFlLCAweDdlNTgsIDB4YTY4NCwKKwkweGZmZjEsIDB4YTA4NSwgMHgwMDEwLCAweDIwMzAsIDB4N2U1YSwgMHg2MDA4LCAweGEwODUsIDB4MDAxMCwKKwkweDYwMGEsIDB4MGM3ZSwgMHg3MDU0LCAweDIwNjAsIDB4NjAwNCwgMHgyMDA4LCAweDJjNDgsIDB4MGM3ZiwKKwkweGExODQsIDB4MDAxMCwgMHgwMDQwLCAweDJjMmEsIDB4MTA3OCwgMHgzN2I5LCAweDEwNzgsIDB4MzVkNiwKKwkweDAwNzgsIDB4MmMzOSwgMHgwYzdlLCAweDcwNTQsIDB4MjA2MCwgMHg2MDA0LCAweDIwMDgsIDB4MmM0OCwKKwkweDBjN2YsIDB4YTE4NCwgMHgwMDA4LCAweDAwNDAsIDB4MmJhNywgMHgxMDc4LCAweDM3YjksIDB4MTA3OCwKKwkweDM0YzcsIDB4ODhmZiwgMHgwMDQwLCAweDJiYTcsIDB4Nzg5YiwgMHgwMDYwLCAweDI4MDAsIDB4NzhhYSwKKwkweGE2YjUsIDB4MDAwNCwgMHg3ZTVhLCAweGE2ODQsIDB4MDQwMCwgMHgwMGMwLCAweDJjNGQsIDB4NzgyYiwKKwkweDMwMDgsIDB4NzgxYiwgMHgwMDU2LCAweDAwNzgsIDB4MjQzOCwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwKKwkweDAwNjUsIDB4MDA3OCwgMHgyNDM4LCAweDdhYTgsIDB4MDA3OCwgMHgyYmMxLCAweDgzMTgsIDB4MjMwMCwKKwkweGExMDIsIDB4MDA0MCwgMHgyYzVmLCAweDAwNDgsIDB4MmM1ZiwgMHgwMDc4LCAweDJiYzEsIDB4YTI4NCwKKwkweDAwODAsIDB4MDBjMCwgMHgzNjdiLCAweDAwNzgsIDB4MzY3MywgMHgwMDc4LCAweDM2N2IsIDB4MDA3OCwKKwkweDM2NmIsIDB4Nzg5YiwgMHgwMDE4LCAweDc4YTgsIDB4YTA4NCwgMHgwMGZmLCAweGEwOGUsIDB4MDAwMSwKKwkweDAwNDAsIDB4MmM3NCwgMHgxMDc4LCAweDIzY2EsIDB4N2FhOCwgMHhhMjk0LCAweDAwZmYsIDB4NzhhOCwKKwkweGEwODQsIDB4MDBmZiwgMHhhMDhhLCAweDAwMDQsIDB4MDBjOCwgMHgzNjZiLCAweDAwNzksIDB4MmM4MCwKKwkweDM2NmIsIDB4MzQxNCwgMHgzNjZiLCAweDM1NmIsIDB4YTI4MiwgMHgwMDAwLCAweDAwYzAsIDB4MmM4YSwKKwkweDEwNzgsIDB4MjNjYSwgMHgxMDc4LCAweDM2OGYsIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwKKwkweDAwNzgsIDB4MjQzOCwgMHhhMjgyLCAweDAwMDMsIDB4MDBjMCwgMHgyYzk4LCAweDEwNzgsIDB4MjNjYSwKKwkweGE0ODQsIDB4ODAwMCwgMHgwMGMwLCAweDJjYmIsIDB4NzA2YywgMHhhMDA1LCAweDAwNDAsIDB4MmNhMiwKKwkweDEwNzgsIDB4MjNjYSwgMHg2ZjE0LCAweDc3ODIsIDB4YTdiYywgMHgwZjAwLCAweDEwNzgsIDB4MzdiZCwKKwkweDYwMDgsIDB4YTA4NSwgMHgwMDIxLCAweDYwMGEsIDB4ODczOCwgMHhhNzg0LCAweDAwMWYsIDB4MDBjMCwKKwkweDJjYTYsIDB4MTA3OCwgMHgzNjkzLCAweDcwNmYsIDB4MDAwMiwgMHgyMDA5LCAweDUwMzgsIDB4MjAwYiwKKwkweDAwMDksIDB4MDA3OCwgMHgyY2JkLCAweDEwNzgsIDB4MzY5ZiwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwKKwkweDAwNjUsIDB4MDA3OCwgMHgyNDM4LCAweGEyODIsIDB4MDAwNCwgMHgwMDUwLCAweDJjYzksIDB4MTA3OCwKKwkweDIzY2EsIDB4MjMwMCwgMHgwMDc5LCAweDJjY2MsIDB4MmNjZiwgMHgyZGI4LCAweDJkZWIsIDB4YTI4NiwKKwkweDAwMDMsIDB4MDA0MCwgMHgyY2Q1LCAweDEwNzgsIDB4MjNjYSwgMHgyMDAxLCAweDAwMDAsIDB4MDA3ZSwKKwkweDY4YzAsIDB4YTAwNSwgMHgwMDQwLCAweDJjZGUsIDB4NzAwMywgMHgwMDAzLCAweDY4YTAsIDB4YTA4NCwKKwkweDIwMDAsIDB4MDA0MCwgMHgyY2U3LCAweDYwMDgsIDB4YTA4NSwgMHgwMDAyLCAweDYwMGEsIDB4MDA3ZiwKKwkweDcwM2UsIDB4NzAwMCwgMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHgyY2VlLCAweDI0NjEsIDB4MmNmOCwKKwkweDJjZjgsIDB4MmVlZCwgMHgyZjI5LCAweDI0NjEsIDB4MmYyOSwgMHgyY2Y2LCAweDEwNzgsIDB4MjNjYSwKKwkweGE2ODQsIDB4MTAwMCwgMHgwMGMwLCAweDJkMDAsIDB4MTA3OCwgMHg0NjMzLCAweDAwNDAsIDB4MmQ5MiwKKwkweDc4NjgsIDB4YTA4YywgMHgwMGZmLCAweDAwNDAsIDB4MmQ0OCwgMHhhMTg2LCAweDAwMDgsIDB4MDBjMCwKKwkweDJkMTcsIDB4MTA3OCwgMHgzM2M0LCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLCAweDYwMGEsIDB4MTA3OCwKKwkweDMzNjYsIDB4MDA0MCwgMHgyZDQ4LCAweDEwNzgsIDB4NDYzMywgMHgwMDc4LCAweDJkMmYsIDB4YTE4NiwKKwkweDAwMjgsIDB4MDBjMCwgMHgyZDQ4LCAweDEwNzgsIDB4NDYzMywgMHg2MDA4LCAweGEwODQsIDB4ZmZlZiwKKwkweDYwMGEsIDB4NjAxOCwgMHhhMDA1LCAweDAwNDAsIDB4MmQyZiwgMHg4MDAxLCAweDYwMWEsIDB4YTAwNSwKKwkweDAwNDAsIDB4MmQyZiwgMHg4MDAxLCAweGEwMDUsIDB4MDA0MCwgMHgyZDJmLCAweDYwMWUsIDB4NjgyMCwKKwkweGEwODQsIDB4MDAwMSwgMHgwMDQwLCAweDI0NjEsIDB4NjgyMCwgMHhhMDg0LCAweGZmZmUsIDB4NjgyMiwKKwkweDcwNjAsIDB4MGM3ZSwgMHgyMDYwLCAweDY4MDAsIDB4NjAwMiwgMHgwYzdmLCAweDYwMDQsIDB4NjgwMiwKKwkweGEwMDUsIDB4MmQwMCwgMHgwMGMwLCAweDJkNDUsIDB4NjAwMiwgMHg2MDA2LCAweDAwNzgsIDB4MjQ2MSwKKwkweDAxN2UsIDB4MTA3OCwgMHgyZTFjLCAweDAxN2YsIDB4YTY4NCwgMHhkZjAwLCAweDY4MWUsIDB4NjgyYiwKKwkweDAwMDAsIDB4NmYxNCwgMHg4MWZmLCAweDAwNDAsIDB4MmQ5MiwgMHhhMTg2LCAweDAwMDIsIDB4MDBjMCwKKwkweDJkOTIsIDB4YTY4NCwgMHgwODAwLCAweDAwYzAsIDB4MmQ2NSwgMHhhNjg0LCAweDAwNjAsIDB4MDA0MCwKKwkweDJkNjUsIDB4NzhkOCwgMHg3YWRjLCAweDY4MmUsIDB4NmEzMiwgMHg2ODIwLCAweGEwODQsIDB4MDgwMCwKKwkweDAwYzAsIDB4MmQ5MiwgMHg4NzE3LCAweGEyOTQsIDB4MDAwZiwgMHg4MjEzLCAweDgyMTMsIDB4ODIxMywKKwkweGEyOTAsIDB4NTI4MCwgMHhhMjkwLCAweDAwMDAsIDB4MjIxYywgMHhhMzg0LCAweDAxMDAsIDB4MDBjMCwKKwkweDJkN2IsIDB4MDA3OCwgMHgyZDgxLCAweDgyMTAsIDB4MjIwNCwgMHhhMDg1LCAweDAwMTgsIDB4MjAxMiwKKwkweDgyMTEsIDB4YTM4NCwgMHgwNDAwLCAweDAwNDAsIDB4MmQ4ZSwgMHg2OGEwLCAweGEwODQsIDB4MDEwMCwKKwkweDAwYzAsIDB4MmQ4ZSwgMHgxMDc4LCAweDJlYTAsIDB4MDA3OCwgMHgyNDYxLCAweDYwMDgsIDB4YTA4NSwKKwkweDAwMDIsIDB4NjAwYSwgMHg2OTE2LCAweDY4MTgsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4MmQ5YSwKKwkweDcwM2MsIDB4NjgxYSwgMHhhNjhjLCAweGRmMDAsIDB4NjkxZSwgMHgxMDc4LCAweDMzYjUsIDB4MTA3OCwKKwkweDMzYzQsIDB4MDBjMCwgMHgyZGE3LCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLCAweDYwMGEsIDB4NjgyMCwKKwkweGEwODQsIDB4MDAwMSwgMHgwMGMwLCAweDJkYjAsIDB4MTA3OCwgMHgzM2FlLCAweDAwNzgsIDB4MmRiNCwKKwkweDcwNjAsIDB4MjA2MCwgMHg2ODAwLCAweDYwMDIsIDB4MTA3OCwgMHgxYzUzLCAweDAwNzgsIDB4MjQ2MSwKKwkweGEyODIsIDB4MDAwNCwgMHgwMDQ4LCAweDJkYmUsIDB4MTA3OCwgMHgyM2NhLCAweDIyMDAsIDB4MDA3OSwKKwkweDJkYzEsIDB4MmRiYywgMHgyZGM1LCAweDJkZDIsIDB4MmRjNSwgMHg3MDAwLCAweGEwODYsIDB4MDAwNSwKKwkweDAwNDAsIDB4MmRjZSwgMHgxMDc4LCAweDM2OGYsIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwKKwkweDAwNzgsIDB4MjQzOCwgMHg3ODkwLCAweDgwMDcsIDB4ODAwMSwgMHhhMDg0LCAweDAwMDcsIDB4YTA4MCwKKwkweDAwMTgsIDB4Nzg5YSwgMHg3OWE4LCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMDMsIDB4MDA0MCwKKwkweDJkZTcsIDB4YTE4NiwgMHgwMDAwLCAweDAwNDAsIDB4MmRlNywgMHgwMDc4LCAweDM2NmIsIDB4NzgxYiwKKwkweDAwNjUsIDB4MDA3OCwgMHgyNDM4LCAweDY4MjAsIDB4YTA4NSwgMHgwMDA0LCAweDY4MjIsIDB4ODJmZiwKKwkweDAwYzAsIDB4MmRmNiwgMHgxMDc4LCAweDM2OGYsIDB4MDA3OCwgMHgyZGZkLCAweDgyMTEsIDB4MDA0MCwKKwkweDJkZmIsIDB4MTA3OCwgMHgyM2NhLCAweDEwNzgsIDB4MzY5ZiwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwKKwkweDAwNjUsIDB4MDA3OCwgMHgyNDM4LCAweDcwMmMsIDB4ODAwMywgMHgwMDQ4LCAweDJlMGQsIDB4MjAxOSwKKwkweDRjNWIsIDB4MTA3OCwgMHgyMjU1LCAweDcwMmYsIDB4ODAwMCwgMHgxMDc4LCAweDM4ZGUsIDB4NzgzMCwKKwkweGEwODQsIDB4MDBjMCwgMHgwMGMwLCAweDJlMTksIDB4MDAxOCwgMHgyZTE5LCAweDc5MWEsIDB4YTAwNiwKKwkweDAwN2MsIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsIDB4YTY4NCwgMHgwMDYwLCAweDAwYzAsIDB4MmUyNiwKKwkweDY4MmYsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4MDA3OCwgMHgyZTlmLCAweGE2ODQsIDB4MDgwMCwKKwkweDAwYzAsIDB4MmU0OCwgMHg2OGI0LCAweGEwODQsIDB4NDgwMCwgMHhhNjM1LCAweGE2ODQsIDB4MDgwMCwKKwkweDAwYzAsIDB4MmU0OCwgMHg2OTk4LCAweDZhOTQsIDB4NjkyZSwgMHg2YTMyLCAweDcwM2MsIDB4YTAwNSwKKwkweDAwYzAsIDB4MmU0MCwgMHgyMjAwLCAweGExMDUsIDB4MDA0MCwgMHgyZTQ3LCAweDcwM2YsIDB4MDAxNSwKKwkweDcwMDAsIDB4YTA4NiwgMHgwMDA2LCAweDAwNDAsIDB4MmU0NywgMHgxMDc4LCAweDQ2MzMsIDB4MDA3YywKKwkweGE2ODQsIDB4MDAyMCwgMHgwMDQwLCAweDJlNmEsIDB4YTY4NCwgMHg0MDAwLCAweDAwNDAsIDB4MmU1NiwKKwkweDY4MmYsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4MDA3OCwgMHgyZTQwLCAweDY4YjQsIDB4YTA4NCwKKwkweDQ4MDAsIDB4YTYzNSwgMHhhNjg0LCAweDQwMDAsIDB4MDBjMCwgMHgyZTUwLCAweDcwM2MsIDB4YTAwNSwKKwkweDAwYzAsIDB4MmU2NCwgMHg3MDNmLCAweDAwMTUsIDB4NzlkOCwgMHg3YWRjLCAweDY5MmUsIDB4NmEzMiwKKwkweDAwNzgsIDB4MmU0MCwgMHhhNjg0LCAweDQwMDAsIDB4MDA0MCwgMHgyZTc0LCAweDY4MmYsIDB4MDAwMCwKKwkweDY4MzMsIDB4MDAwMCwgMHgwMDc4LCAweDJlNDAsIDB4NjhiNCwgMHhhMDg0LCAweDQ4MDAsIDB4YTYzNSwKKwkweGE2ODQsIDB4NDAwMCwgMHgwMGMwLCAweDJlNmUsIDB4NzAzYywgMHhhMDA1LCAweDAwYzAsIDB4MmU4MiwKKwkweDcwM2YsIDB4MDAxNSwgMHg3OWQ4LCAweDdhZGMsIDB4NzhkMCwgMHg4MGZiLCAweDAwYzgsIDB4MmU4OSwKKwkweDgwMDAsIDB4YTA4NCwgMHgwMDNmLCAweGExMDgsIDB4YTI5MSwgMHgwMDAwLCAweDY5MmUsIDB4NmEzMiwKKwkweDIxMDAsIDB4YTIwNSwgMHgwMGMwLCAweDJlOTYsIDB4MDA3OCwgMHgyZTQwLCAweDcwMDAsIDB4YTA4NiwKKwkweDAwMDYsIDB4MDA0MCwgMHgyZTlmLCAweDEwNzgsIDB4NDllZCwgMHgwMDc4LCAweDJlNDAsIDB4MDA3YywKKwkweDYwMDgsIDB4YTA4NSwgMHgwMjAwLCAweDYwMGEsIDB4YTM4NCwgMHgwMjAwLCAweDAwNDAsIDB4MmVhYywKKwkweDYwMDgsIDB4YTA4NSwgMHgwMDAyLCAweDYwMGEsIDB4NjgxYiwgMHgwMDA2LCAweDY4OGYsIDB4MDAwMCwKKwkweDY4OTMsIDB4MDAwMCwgMHg2YTMwLCAweDY5MmMsIDB4NmEzZSwgMHg2OTQyLCAweDY4MmYsIDB4MDAwMywKKwkweDY4MzMsIDB4MDAwMCwgMHg2ODM3LCAweDAwMjAsIDB4Njg5NywgMHgwMDAwLCAweDY4OWIsIDB4MDAyMCwKKwkweDY4YjMsIDB4MDAwMCwgMHg2OGFmLCAweDAwMDAsIDB4NzAwMCwgMHgwMDc5LCAweDJlYzcsIDB4MjQ2MSwKKwkweDJlZDEsIDB4MmVkYSwgMHgyZWNmLCAweDJlY2YsIDB4MmVjZiwgMHgyZWNmLCAweDJlY2YsIDB4MTA3OCwKKwkweDIzY2EsIDB4NjgyMCwgMHhhMDg0LCAweDAwMDEsIDB4MDBjMCwgMHgyZWRhLCAweDEwNzgsIDB4MzNhZSwKKwkweDAwNzgsIDB4MmVlMCwgMHg3MDYwLCAweDJjNTAsIDB4MjA2MCwgMHg2ODAwLCAweDYwMDIsIDB4MmE2MCwKKwkweDIwMjEsIDB4NTA1YSwgMHgyNDA0LCAweGEwMDUsIDB4MDA0MCwgMHgyZWU5LCAweDIwMjAsIDB4MDA3OCwKKwkweDJlZTIsIDB4MmQyMiwgMHgyMDZiLCAweDAwMDAsIDB4MDA3YywgMHgxMDc4LCAweDMzYjUsIDB4MTA3OCwKKwkweDMzYzQsIDB4NjAwOCwgMHhhMDg0LCAweGZkZmYsIDB4NjAwYSwgMHg2ODJiLCAweDAwMDAsIDB4Nzg5YiwKKwkweDAwMGUsIDB4NmYxNCwgMHg2ODE3LCAweDAwMDIsIDB4MTA3OCwgMHg0YTM1LCAweGE2ODQsIDB4MDgwMCwKKwkweDAwNDAsIDB4MmYwNiwgMHg2OTFjLCAweGExOGQsIDB4MjAwMCwgMHg2OTFlLCAweDY4MTgsIDB4YTA4NCwKKwkweDgwMDAsIDB4MDA0MCwgMHgyZjE2LCAweDc4NjgsIDB4YTA4YywgMHgwMGZmLCAweDAwNDAsIDB4MmYxNCwKKwkweDY4MWIsIDB4MDAxZSwgMHgwMDc4LCAweDJmMTYsIDB4NjgxYiwgMHgwMDAwLCAweDIwMjEsIDB4NTA1YSwKKwkweDI0MDQsIDB4YWQwNiwgMHgwMDQwLCAweDJmMWQsIDB4NzQ2MCwgMHg2ODAwLCAweDIwMjIsIDB4NjhjMywKKwkweDAwMDAsIDB4NmEzYywgMHg2OTQwLCAweDZhMzIsIDB4NjkyZSwgMHgxMDc4LCAweDFjNTMsIDB4MDA3OCwKKwkweDI0NjEsIDB4MTA3OCwgMHgyZTFjLCAweDY4MmIsIDB4MDAwMCwgMHgyMDAxLCAweDAwMGUsIDB4NmYxNCwKKwkweDEwNzgsIDB4MzhlNCwgMHhhMDhjLCAweDAwZmYsIDB4NjkxNiwgMHg2ODE4LCAweGEwODQsIDB4ODAwMCwKKwkweDAwNDAsIDB4MmYzYywgMHg3MDNjLCAweDY4MWEsIDB4YTY4YywgMHhkZjAwLCAweDY5MWUsIDB4NzA2ZiwKKwkweDAwMDAsIDB4MDA3OCwgMHgyNDYxLCAweDcwMDAsIDB4YTAwNSwgMHgwMGMwLCAweDJmNDksIDB4MDA3OCwKKwkweDI0NjEsIDB4YTAwNiwgMHgxMDc4LCAweDQ2MzMsIDB4NjgxNywgMHgwMDAwLCAweDY4MWIsIDB4MDAxNCwKKwkweGE2OGMsIDB4ZGYwMCwgMHg2OTFlLCAweDY4MmIsIDB4MDAwMCwgMHg2ODIwLCAweGEwODUsIDB4MDBmZiwKKwkweDY4MjIsIDB4NzAwMCwgMHgwMDc5LCAweDJmNWMsIDB4MjQ2MSwgMHgyZjY2LCAweDJmNjYsIDB4MmY2OCwKKwkweDJmNjgsIDB4MmY2OCwgMHgyZjY4LCAweDJmNjQsIDB4MTA3OCwgMHgyM2NhLCAweDEwNzgsIDB4MzNjNCwKKwkweDYwMDgsIDB4YTA4NCwgMHhmZmVmLCAweDYwMGEsIDB4MDA3OCwgMHgzMzdlLCAweDIzMDAsIDB4MDA3OSwKKwkweDJmNzEsIDB4MmY3NCwgMHgyZjc2LCAweDJmYWYsIDB4MTA3OCwgMHgyM2NhLCAweDcwMDAsIDB4MDA3OSwKKwkweDJmNzksIDB4MjQ2MSwgMHgyZjgzLCAweDJmODMsIDB4MmY5ZSwgMHgyZjgzLCAweDJmYWIsIDB4MmY5ZSwKKwkweDJmODEsIDB4MTA3OCwgMHgyM2NhLCAweGE2ODQsIDB4MDA2MCwgMHhhMDg2LCAweDAwNjAsIDB4MDBjMCwKKwkweDJmOWEsIDB4YTZiNCwgMHhmZmRmLCAweGE2YjQsIDB4YmZmZiwgMHhhNmI1LCAweDIwMDAsIDB4N2U1YSwKKwkweDY4MWMsIDB4YTA4NCwgMHhmZmRmLCAweDY4MWUsIDB4MTA3OCwgMHg0NjMzLCAweDEwNzgsIDB4NDhmNywKKwkweDAwNzgsIDB4Mzg1NCwgMHhhNjg0LCAweDIwMDAsIDB4MDA0MCwgMHgyZjhkLCAweDY4MTgsIDB4YTA4NCwKKwkweDgwMDAsIDB4MDA0MCwgMHgyZmFiLCAweDY4MWIsIDB4MDAxNSwgMHhhNjg0LCAweDQwMDAsIDB4MDA0MCwKKwkweDJmYWIsIDB4NjgxYiwgMHgwMDA3LCAweDEwNzgsIDB4Mzg2OCwgMHgwMDc4LCAweDI0MzgsIDB4MTA3OCwKKwkweDIzY2EsIDB4MjMwMCwgMHgwMDc5LCAweDJmYjQsIDB4MmZiNywgMHgyZmI5LCAweDJmZWMsIDB4MTA3OCwKKwkweDIzY2EsIDB4NzAwMCwgMHgwMDc5LCAweDJmYmMsIDB4MjQ2MSwgMHgyZmM2LCAweDJmYzYsIDB4MmZlMSwKKwkweDJmYzYsIDB4MmZlOCwgMHgyZmUxLCAweDJmYzQsIDB4MTA3OCwgMHgyM2NhLCAweGE2ODQsIDB4MDA2MCwKKwkweGEwODYsIDB4MDA2MCwgMHgwMGMwLCAweDJmZGQsIDB4YTZiNCwgMHhmZmJmLCAweGE2YjQsIDB4YmZmZiwKKwkweGE2YjUsIDB4MjAwMCwgMHg3ZTVhLCAweDY4MWMsIDB4YTA4NCwgMHhmZmJmLCAweDY4MWUsIDB4MTA3OCwKKwkweDQ2MzMsIDB4MTA3OCwgMHg0OGY3LCAweDAwNzgsIDB4Mzg1NCwgMHhhNjg0LCAweDIwMDAsIDB4MDA0MCwKKwkweDJmZDAsIDB4NjgxOCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyZmU4LCAweDY4MWIsIDB4MDAwNywKKwkweDc4MWIsIDB4MDBkMiwgMHgwMDc4LCAweDI0MzgsIDB4NjgyMCwgMHhhMDg1LCAweDAwMDQsIDB4NjgyMiwKKwkweDEwNzgsIDB4MzgxZiwgMHhhNmI1LCAweDA4MDAsIDB4MTA3OCwgMHgzNjhmLCAweDc4MmIsIDB4MzAwOCwKKwkweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0MzgsIDB4MjMwMCwgMHgwMDc5LCAweDJmZmYsIDB4MzAwMiwKKwkweDMwMDQsIDB4MzAwNiwgMHgxMDc4LCAweDIzY2EsIDB4MDA3OCwgMHgzNjdiLCAweGE2ODQsIDB4MDQwMCwKKwkweDAwYzAsIDB4MzAyZiwgMHg3OWU0LCAweGExODQsIDB4MDAyMCwgMHgwMDQwLCAweDMwMTYsIDB4NzhlYywKKwkweGEwODQsIDB4MDAwMywgMHgwMDQwLCAweDMwMTYsIDB4NzgyYiwgMHgzMDA5LCAweDc4OWIsIDB4MDA2MCwKKwkweDc4YWIsIDB4MDAwMCwgMHhhNjg0LCAweGZmZmIsIDB4Nzg1YSwgMHg3OWU0LCAweGExODQsIDB4MDAyMCwKKwkweDAwNDAsIDB4MzAyNywgMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwMGMwLCAweDMwMmIsIDB4MjAwMSwKKwkweDAwMTQsIDB4MDA3OCwgMHgyY2Q3LCAweGExODQsIDB4MDAwNywgMHgwMDc5LCAweDMwNjcsIDB4N2E5MCwKKwkweGEyOTQsIDB4MDAwNywgMHg3ODliLCAweDAwNjAsIDB4NzlhOCwgMHg4MWZmLCAweDAwNDAsIDB4MzA2NSwKKwkweDc4OWIsIDB4MDAxMCwgMHg3YmE4LCAweGEzODQsIDB4MDAwMSwgMHgwMGMwLCAweDMwNTYsIDB4N2JhOCwKKwkweDdiYTgsIDB4YTM4NiwgMHgwMDAxLCAweDAwYzAsIDB4MzA0OSwgMHgyMDA5LCAweGZmZjcsIDB4MDA3OCwKKwkweDMwNGYsIDB4YTM4NiwgMHgwMDAzLCAweDAwYzAsIDB4MzA1NiwgMHgyMDA5LCAweGZmZWYsIDB4MGM3ZSwKKwkweDcwNTQsIDB4MjA2MCwgMHg2MDA0LCAweGExMDQsIDB4NjAwNiwgMHgwYzdmLCAweDc4OWIsIDB4MDA2MCwKKwkweDc4YWIsIDB4MDAwMCwgMHhhNjg0LCAweGZmZmIsIDB4Nzg1YSwgMHg3ODJiLCAweDMwMDksIDB4NjkyMCwKKwkweGExOGMsIDB4ZmRmZiwgMHhhMThjLCAweGZlZmYsIDB4NjkyMiwgMHgwMDc4LCAweDM4NTQsIDB4Mjk3ZCwKKwkweDI5ODgsIDB4MzA3MSwgMHgzMDc5LCAweDMwNmYsIDB4MzA2ZiwgMHgzODU0LCAweDM4NTQsIDB4MTA3OCwKKwkweDIzY2EsIDB4NjkyMCwgMHhhMThjLCAweGZkZmYsIDB4YTE4YywgMHhmZWZmLCAweDY5MjIsIDB4MDA3OCwKKwkweDM4NWUsIDB4NjkyMCwgMHhhMThjLCAweGZkZmYsIDB4YTE4YywgMHhmZWZmLCAweDY5MjIsIDB4MDA3OCwKKwkweDM4NTQsIDB4NzllNCwgMHhhMTg0LCAweDAwMzAsIDB4MDA0MCwgMHgzMDhiLCAweDc4ZWMsIDB4YTA4NCwKKwkweDAwMDMsIDB4MDBjMCwgMHgzMGIyLCAweDcwMDAsIDB4YTA4NiwgMHgwMDA0LCAweDAwYzAsIDB4MzBhNSwKKwkweDcwNmMsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4MzA5YiwgMHgyMDExLCAweDAwMDIsIDB4MjAxOSwKKwkweDAwMDAsIDB4MDA3OCwgMHgyODI3LCAweDcwNmMsIDB4YTA4NiwgMHgwMDA2LCAweDAwNDAsIDB4MzA5NSwKKwkweDcwNmMsIDB4YTA4NiwgMHgwMDA0LCAweDAwNDAsIDB4MzA5NSwgMHg3MDAwLCAweGEwODYsIDB4MDAwMCwKKwkweDAwNDAsIDB4MjQzOCwgMHg2ODE4LCAweGEwODUsIDB4ODAwMCwgMHg2ODFhLCAweDIwMDEsIDB4MDAxNCwKKwkweDAwNzgsIDB4MmNkNywgMHhhMTg0LCAweDAwMDcsIDB4MDA3OSwgMHgzMGI2LCAweDM4NTQsIDB4Mzg1NCwKKwkweDMwYmUsIDB4Mzg1NCwgMHgzOGI5LCAweDM4YjksIDB4Mzg1NCwgMHgzODU0LCAweGE2ODQsIDB4MDA4MCwKKwkweDAwNDAsIDB4MzBlZCwgMHg3MTk0LCAweDgxZmYsIDB4MDA0MCwgMHgzMGVkLCAweGExODIsIDB4MDAwZCwKKwkweDAwZDAsIDB4MzBjZSwgMHg3MDk3LCAweDAwMDAsIDB4MDA3OCwgMHgzMGQzLCAweGExODIsIDB4MDAwYywKKwkweDcwOTYsIDB4MjAwOSwgMHgwMDBjLCAweDc4OWIsIDB4MDA2MSwgMHg3OWFhLCAweDE1N2UsIDB4MTM3ZSwKKwkweDE0N2UsIDB4NzA5OCwgMHg4MTE0LCAweGEyMTAsIDB4NzI5YSwgMHhhMDgwLCAweDAwMGIsIDB4YWQwMCwKKwkweDIwOTgsIDB4MjBhMSwgMHgwMTJiLCAweDc4OWIsIDB4MDAwMCwgMHg4MTA4LCAweDgxYWMsIDB4NTNhNiwKKwkweDE0N2YsIDB4MTM3ZiwgMHgxNTdmLCAweDAwNzgsIDB4Mzg1ZSwgMHhhNjg0LCAweDA0MDAsIDB4MDBjMCwKKwkweDMxMmUsIDB4NjgyMCwgMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgzODVlLCAweGE2OGMsIDB4MDA2MCwKKwkweGE2ODQsIDB4MDA2MCwgMHgwMDQwLCAweDMxMDIsIDB4YTA4NiwgMHgwMDYwLCAweDAwYzAsIDB4MzEwMiwKKwkweGExOGQsIDB4NDAwMCwgMHhhMThjLCAweGZmZmIsIDB4Nzk1YSwgMHg2OWI2LCAweDc4OWIsIDB4MDA2MCwKKwkweDc4YWIsIDB4MDAwMCwgMHg3ODliLCAweDAwNjEsIDB4NjgxOCwgMHhhMDg1LCAweDgwMDAsIDB4NjgxYSwKKwkweDc4YWEsIDB4ODAwOCwgMHg4MTBjLCAweDAwNDAsIDB4MzNkZCwgMHhhMThjLCAweDAwZjgsIDB4MDBjMCwKKwkweDMzZGQsIDB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4MjBhMSwgMHgwMTJiLCAweDc4OWIsIDB4MDAwMCwKKwkweDgwMDAsIDB4ODBhYywgMHhhZDgwLCAweDAwMGIsIDB4MjA5OCwgMHg1M2E2LCAweDE0N2YsIDB4MTM3ZiwKKwkweDE1N2YsIDB4NjgxNCwgMHg4MDA3LCAweDc4ODIsIDB4MDA3OCwgMHgzODVlLCAweDY4MTgsIDB4YTA4NCwKKwkweDgwMDAsIDB4MDA0MCwgMHgzMTM1LCAweDY4MWIsIDB4MDAwOCwgMHg3ODFiLCAweDAwYzgsIDB4MDA3OCwKKwkweDI0MzgsIDB4MjMwMCwgMHgwMDc5LCAweDMxM2MsIDB4MzE0MSwgMHgzMWUwLCAweDMxM2YsIDB4MTA3OCwKKwkweDIzY2EsIDB4NzAwMCwgMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHgzMTQ2LCAweDI0NjEsIDB4MzE1MCwKKwkweDMxODUsIDB4MzE1YiwgMHgzMTRlLCAweDI0NjEsIDB4MzE0ZSwgMHgzMTRlLCAweDEwNzgsIDB4MjNjYSwKKwkweDY4MWMsIDB4YTA4NCwgMHgyMDAwLCAweDAwNDAsIDB4MzE2OSwgMHg2MDA4LCAweGEwODUsIDB4MDAwMiwKKwkweDYwMGEsIDB4MDA3OCwgMHgzMTY5LCAweDY4YzAsIDB4YTAwNSwgMHgwMGMwLCAweDMxODUsIDB4NjkyMCwKKwkweGExOGQsIDB4MDAwMSwgMHg2OTIyLCAweDY4YzMsIDB4MDAwMSwgMHg2ODAwLCAweDcwNmEsIDB4MDA3OCwKKwkweDMxN2YsIDB4NjkyMCwgMHhhMThkLCAweDAwMDEsIDB4NjkyMiwgMHg2ODAwLCAweDYwMDYsIDB4YTAwNSwKKwkweDAwYzAsIDB4MzE3MywgMHg2MDAyLCAweDY4MWMsIDB4YTA4NCwgMHgwMDBlLCAweDAwNDAsIDB4MzE3ZiwKKwkweDcwMTQsIDB4NjhiYSwgMHg3MTMwLCAweGExODgsIDB4NzMwMCwgMHgwMDc4LCAweDMxODEsIDB4MjAwOSwKKwkweDc0MDAsIDB4MjEwNCwgMHg2ODAyLCAweDJkMGEsIDB4NzE2MiwgMHg2ZWI2LCAweGE2ODQsIDB4MDA2MCwKKwkweDAwNDAsIDB4MzFkZSwgMHhhNjg0LCAweDA4MDAsIDB4MDBjMCwgMHgzMTk5LCAweGE2ODQsIDB4N2ZmZiwKKwkweDY4YjYsIDB4Njg5NCwgMHg2OGE2LCAweDY4OTgsIDB4NjhhYSwgMHgxMDc4LCAweDQ2MzMsIDB4MDA3OCwKKwkweDMxZGUsIDB4YTY4NCwgMHgwMDIwLCAweDAwNDAsIDB4MzFhZSwgMHg2OGMwLCAweGEwMDUsIDB4MDA0MCwKKwkweDMxYTUsIDB4MTA3OCwgMHg0YTM1LCAweDAwNzgsIDB4MzFhOCwgMHhhMDA2LCAweDEwNzgsIDB4NDllZCwKKwkweDc5ZDgsIDB4N2FkYywgMHg2OWFhLCAweDZhYTYsIDB4MDA3OCwgMHgzMWI0LCAweDEwNzgsIDB4MzdjYSwKKwkweDY5YWEsIDB4NmFhNiwgMHgxMDc4LCAweDQ5ZWQsIDB4YTY4NCwgMHg4MDAwLCAweDAwNDAsIDB4MzFkZSwKKwkweGE2ODQsIDB4N2ZmZiwgMHg2OGI2LCAweDIwMDEsIDB4MDA3NiwgMHgxMDc4LCAweDM4ZTQsIDB4MjAxMCwKKwkweDIwMDEsIDB4MDA3OCwgMHgxMDc4LCAweDM4ZTQsIDB4MjAwOCwgMHhhNjg0LCAweDAwMjAsIDB4MDBjMCwKKwkweDMxZDYsIDB4MjAwMSwgMHgwMDdhLCAweDEwNzgsIDB4MzhlNCwgMHg4MDFiLCAweDAwYzgsIDB4MzFkMSwKKwkweDgwMDAsIDB4YTA4NCwgMHgwMDNmLCAweGExMDgsIDB4YTI5MSwgMHgwMDAwLCAweDZiOTgsIDB4MjEwMCwKKwkweGEzMDIsIDB4NjhiMiwgMHg2Yjk0LCAweDIyMDAsIDB4YTMwMywgMHg2OGFlLCAweDAwNzgsIDB4MjQ2MSwKKwkweDAwNzgsIDB4MzY3YiwgMHg3MDM3LCAweDAwMDAsIDB4YTI4MiwgMHgwMDA2LCAweDAwNTAsIDB4MzFlYSwKKwkweDEwNzgsIDB4MjNjYSwgMHg3MDAwLCAweGEwODQsIDB4MDAwNywgMHgxMGMwLCAweDM5OGEsIDB4MjMwMCwKKwkweDAwNzksIDB4MzFmMiwgMHgzMWY1LCAweDMyMWUsIDB4MzIzMiwgMHgyMjAwLCAweDAwNzksIDB4MzFmOCwKKwkweDMyMWMsIDB4MzY3YiwgMHgzMWZlLCAweDMyMWMsIDB4MzI0ZSwgMHgzMjkwLCAweDcwMDMsIDB4MDAwNSwKKwkweDIwMDEsIDB4NzUxMCwgMHgyMDY4LCAweDcwNGEsIDB4MTU3ZSwgMHgyMGE5LCAweDAwMzEsIDB4MjAwMywKKwkweDAwMDAsIDB4ODAwMCwgMHgwMDcwLCAweDMyMGUsIDB4MDA3OCwgMHgzMjA3LCAweDE1N2YsIDB4YWQ4MCwKKwkweDAwMDksIDB4NzAzNiwgMHg2ODE3LCAweDAwMDAsIDB4NjhiNywgMHgwNzAwLCAweDY4MjMsIDB4MDgwMCwKKwkweDY4MjcsIDB4MDAwMywgMHgwMDc4LCAweDM2NmIsIDB4MTA3OCwgMHgyM2NhLCAweDcwMDMsIDB4MDAwNSwKKwkweDIwMDEsIDB4NzUxMCwgMHgyMDY4LCAweDcwNGEsIDB4YWQ4MCwgMHgwMDA5LCAweDcwMzYsIDB4MjIwMCwKKwkweDAwNzksIDB4MzIyYSwgMHgzNjdiLCAweDMyMzAsIDB4MzIzMCwgMHgzMjRlLCAweDMyMzAsIDB4MzY3YiwKKwkweDEwNzgsIDB4MjNjYSwgMHg3MDAzLCAweDAwMDUsIDB4MjAwMSwgMHg3NTEwLCAweDIwNjgsIDB4NzA0YSwKKwkweGFkODAsIDB4MDAwOSwgMHg3MDM2LCAweDIyMDAsIDB4MDA3OSwgMHgzMjNlLCAweDMyNDYsIDB4MzI0NCwKKwkweDMyNDQsIDB4MzI0NiwgMHgzMjQ0LCAweDMyNDYsIDB4MTA3OCwgMHgyM2NhLCAweDEwNzgsIDB4MzY5ZiwKKwkweDc4MmIsIDB4MzAwOCwgMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDM4LCAweDcwMDMsIDB4MDAwMiwKKwkweDdhODAsIDB4YTI5NCwgMHgwZjAwLCAweDc4OWIsIDB4MDAxOCwgMHg3Y2E4LCAweGE0ODQsIDB4MDAxZiwKKwkweGEyMTUsIDB4MjA2OSwgMHg3NDAwLCAweDJkMDQsIDB4MmQwOCwgMHg3MTYyLCAweDIwNjgsIDB4YTAwNSwKKwkweDAwNDAsIDB4MzI2OSwgMHg2ODE0LCAweGEyMDYsIDB4MDA0MCwgMHgzMjg1LCAweDY4MDAsIDB4MDA3OCwKKwkweDMyNWMsIDB4NzAwMywgMHgwMDA1LCAweDIwMDEsIDB4NzUxMCwgMHgyMDY4LCAweDcwNGEsIDB4NzAzNiwKKwkweDE1N2UsIDB4MjBhOSwgMHgwMDMxLCAweDIwMDMsIDB4MDAwMCwgMHg4MDAwLCAweDAwNzAsIDB4MzI3YSwKKwkweDAwNzgsIDB4MzI3MywgMHgxNTdmLCAweGFkODAsIDB4MDAwOSwgMHg3MDM2LCAweDZhMTYsIDB4NjhiNywKKwkweDA3MDAsIDB4NjgyMywgMHgwODAwLCAweDY4MjcsIDB4MDAwMywgMHg2ZWI0LCAweDdlNWEsIDB4NjgyMCwKKwkweGEwODQsIDB4MGMwMCwgMHgwMDQwLCAweDMyZGYsIDB4MTA3OCwgMHgzNjk3LCAweDAwNzgsIDB4MzJkZiwKKwkweDcwMDMsIDB4MDAwMiwgMHg3YTgwLCAweGEyOTQsIDB4MGYwMCwgMHg3ODliLCAweDAwMTgsIDB4N2NhOCwKKwkweGE0ODQsIDB4MDAxZiwgMHhhMjE1LCAweDc5YTgsIDB4NzlhOCwgMHhhMThjLCAweDAwZmYsIDB4YTFlOCwKKwkweDczMDAsIDB4MmQwNCwgMHgyZDA4LCAweDcxNjIsIDB4MjA2OCwgMHhhMDA1LCAweDAwNDAsIDB4MzJhZiwKKwkweDY4MTQsIDB4YTIwNiwgMHgwMDQwLCAweDMyY2EsIDB4NjgwMCwgMHgwMDc4LCAweDMyYTIsIDB4NzAwMywKKwkweDAwMDUsIDB4MjAwMSwgMHg3NTEwLCAweDIwNjgsIDB4NzA0YSwgMHgxNTdlLCAweDIwYTksIDB4MDAzMSwKKwkweDIwMDMsIDB4MDAwMCwgMHg4MDAwLCAweDAwNzAsIDB4MzJiZiwgMHgwMDc4LCAweDMyYjgsIDB4MTU3ZiwKKwkweGFkODAsIDB4MDAwOSwgMHg3MDM2LCAweDZhMTYsIDB4NjhiNywgMHgwNzAwLCAweDY4MjMsIDB4MDgwMCwKKwkweDY4MjcsIDB4MDAwMywgMHg2ZWI0LCAweDdlNWEsIDB4NjgyMCwgMHhhMDg0LCAweDBjMDAsIDB4MDA0MCwKKwkweDMyZGYsIDB4YTA4NCwgMHgwODAwLCAweDAwNDAsIDB4MzJkOSwgMHgxMDc4LCAweDM2OWIsIDB4MDA3OCwKKwkweDMyZGYsIDB4MTA3OCwgMHgzNjk3LCAweDcwOGIsIDB4MDAwMCwgMHgwMDc4LCAweDMyZGYsIDB4MDI3ZSwKKwkweDgyMDcsIDB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGEwODAsIDB4NTI4MCwKKwkweDIwNjAsIDB4NzA1NiwgMHg2MDAwLCAweDcwNWEsIDB4NjAwNCwgMHg3MDVlLCAweGE2ODQsIDB4MDA2MCwKKwkweDAwNDAsIDB4MzMzNywgMHg2Yjk4LCAweDZjOTQsIDB4NjlhYywgMHg2OGIwLCAweGExMDUsIDB4MDBjMCwKKwkweDMzMTksIDB4N2JkMiwgMHg3YmRhLCAweDdjZDYsIDB4N2NkZSwgMHhhNmI0LCAweGI3ZmYsIDB4N2U1YSwKKwkweGE2ODQsIDB4MDA2MCwgMHhhMDg2LCAweDAwNjAsIDB4MDA0MCwgMHgzMzM3LCAweDY4YzAsIDB4YTAwNSwKKwkweDAwNDAsIDB4MzMxMiwgMHg3MDAzLCAweDAwMDMsIDB4NjgyYiwgMHgwMDAwLCAweDEwNzgsIDB4NDhlNiwKKwkweDAwNzgsIDB4MzMxNCwgMHgxMDc4LCAweDQ4ZjcsIDB4YTZiNSwgMHgyMDAwLCAweDdlNWEsIDB4MDA3OCwKKwkweDMzMzcsIDB4NjhiMCwgMHhhMzFhLCAweDIxMDAsIDB4YTQyMywgMHgyNDAwLCAweGEzMDUsIDB4MDA0MCwKKwkweDMzMzcsIDB4N2JkMiwgMHg3YmRhLCAweDdjZDYsIDB4N2NkZSwgMHg2OGIwLCAweGE2YjQsIDB4YmZmZiwKKwkweDdlNWEsIDB4MDA3ZSwgMHg2OGMwLCAweGEwMDUsIDB4MDA3ZiwgMHgwMDQwLCAweDMzMzUsIDB4NzAwMywKKwkweDAwMDMsIDB4MTA3OCwgMHg0OGU2LCAweDAwNzgsIDB4MzMzNywgMHgxMDc4LCAweDQ5NDIsIDB4MDc3ZiwKKwkweDEwNzgsIDB4MzdiZCwgMHgyMDA5LCAweDAwNjUsIDB4YTY4NCwgMHgwMDA0LCAweDAwNDAsIDB4MzM1OCwKKwkweDc4ZTQsIDB4YTA4NCwgMHgwMDMwLCAweDAwNDAsIDB4MzM1MCwgMHg3OGVjLCAweGEwODQsIDB4MDAwMywKKwkweDAwNDAsIDB4MzM1MCwgMHg3ODJiLCAweDMwMDgsIDB4MjAwOSwgMHgwMDY1LCAweDAwNzgsIDB4MzM1OCwKKwkweDBmN2UsIDB4MjA3OSwgMHg1MDAwLCAweDEwNzgsIDB4NDYzMywgMHgwZjdmLCAweDAwNDAsIDB4MjQ2MSwKKwkweDc5MWEsIDB4MmQwMCwgMHg3MDRhLCAweDgyMDcsIDB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywKKwkweDgwMDMsIDB4YTA4MCwgMHg1MjgwLCAweDIwNDgsIDB4MDA3OCwgMHgyNDM4LCAweDYwMjAsIDB4YTAwNSwKKwkweDAwNDAsIDB4MzM3MiwgMHg4MDAxLCAweDYwMjIsIDB4NjAwOCwgMHhhMDg1LCAweDAwMDgsIDB4NjAwYSwKKwkweDcwMTAsIDB4NjAyNiwgMHgwMDdjLCAweGEwMDYsIDB4MTA3OCwgMHg0NjMzLCAweDY4MTcsIDB4MDAwMCwKKwkweDY4MWIsIDB4MDAwMSwgMHg2ODIzLCAweDAwNDAsIDB4NjgxZiwgMHgwMTAwLCAweDcwMDAsIDB4YTA4NCwKKwkweDAwMDcsIDB4MDA3OSwgMHgzMzgzLCAweDI0NjEsIDB4MzM4ZCwgMHgzMzhkLCAweDMzYWEsIDB4MzM5NSwKKwkweDMzOTMsIDB4MzM5NSwgMHgzMzhiLCAweDEwNzgsIDB4MjNjYSwgMHgxMDc4LCAweDMzYjUsIDB4MTA3OCwKKwkweDMzYWUsIDB4MTA3OCwgMHgxYzUzLCAweDAwNzgsIDB4MjQ2MSwgMHg3MDZjLCAweDcwNmYsIDB4MDAwMCwKKwkweDcwOTMsIDB4MDAwMCwgMHgwMDc5LCAweDMzOWMsIDB4MzNhNiwgMHgzM2E2LCAweDMzYTQsIDB4MzNhNCwKKwkweDMzYTQsIDB4MzNhNiwgMHgzM2E0LCAweDMzYTYsIDB4MDA3OSwgMHgyODQwLCAweDcwNmYsIDB4MDAwMCwKKwkweDAwNzgsIDB4MjQ2MSwgMHg2ODFiLCAweDAwMDAsIDB4MDA3OCwgMHgyZWVkLCAweDY4MDAsIDB4YTAwNSwKKwkweDAwYzAsIDB4MzNiMywgMHg2MDAyLCAweDYwMDYsIDB4MDA3YywgMHg2MDEwLCAweGEwMDUsIDB4MDA0MCwKKwkweDMzYmUsIDB4ODAwMSwgMHgwMGQwLCAweDMzYmUsIDB4MTA3OCwgMHgyM2NhLCAweDYwMTIsIDB4NjAwOCwKKwkweGEwODQsIDB4ZmZlZiwgMHg2MDBhLCAweDAwN2MsIDB4NjAxOCwgMHhhMDA1LCAweDAwNDAsIDB4MzNjYSwKKwkweDgwMDEsIDB4NjAxYSwgMHgwMDdjLCAweDEwNzgsIDB4MzhkZSwgMHg2ODFiLCAweDAwMTgsIDB4MDA3OCwKKwkweDM0MDEsIDB4MTA3OCwgMHgzOGRlLCAweDY4MWIsIDB4MDAxOSwgMHgwMDc4LCAweDM0MDEsIDB4MTA3OCwKKwkweDM4ZGUsIDB4NjgxYiwgMHgwMDFhLCAweDAwNzgsIDB4MzQwMSwgMHgxMDc4LCAweDM4ZGUsIDB4NjgxYiwKKwkweDAwMDMsIDB4MDA3OCwgMHgzNDAxLCAweDc3ODAsIDB4MTA3OCwgMHgzN2JkLCAweDcxODQsIDB4YTE4YywKKwkweDAwZmYsIDB4YTFlOCwgMHg3MzAwLCAweDJkMDQsIDB4MmQwOCwgMHgyMDY4LCAweGEwMDUsIDB4MDBjMCwKKwkweDMzZjMsIDB4MDA3OCwgMHgyNDYxLCAweDY4MTQsIDB4NzI4MCwgMHhhMjA2LCAweDAwNDAsIDB4MzNmYiwKKwkweDY4MDAsIDB4MDA3OCwgMHgzM2VjLCAweDY4MDAsIDB4MjAwYSwgMHg2ODFiLCAweDAwMDUsIDB4NzA4YiwKKwkweDAwMDAsIDB4MTA3OCwgMHgzM2I1LCAweDY4MjAsIDB4YTA4NCwgMHgwMDAxLCAweDAwYzAsIDB4MzQwYSwKKwkweDEwNzgsIDB4MzNhZSwgMHgxMDc4LCAweDMzYzQsIDB4NjgxZiwgMHgwMDAwLCAweDY4MjMsIDB4MDAyMCwKKwkweDEwNzgsIDB4MWM1MywgMHgwMDc4LCAweDI0NjEsIDB4YTI4MiwgMHgwMDAzLCAweDAwYzAsIDB4MzY2YiwKKwkweDdkYTgsIDB4YTVhYywgMHgwMGZmLCAweDdjYTgsIDB4YTRhNCwgMHgwMGZmLCAweDY5MjAsIDB4YTE4ZCwKKwkweDAwODAsIDB4NjkyMiwgMHhhMTg0LCAweDAxMDAsIDB4MDA0MCwgMHgzNDc4LCAweGExOGMsIDB4ZmVmZiwKKwkweDY5MjIsIDB4YTRhNCwgMHgwMGZmLCAweDAwNDAsIDB4MzQ2MiwgMHhhNDgyLCAweDAwMGMsIDB4MDA0OCwKKwkweDM0MzUsIDB4MDA0MCwgMHgzNDM1LCAweDIwMjEsIDB4MDAwYywgMHg4NTJiLCAweDg1MmIsIDB4MTA3OCwKKwkweDM3MmUsIDB4MDA0MCwgMHgzNDNmLCAweDEwNzgsIDB4MzUzMSwgMHgwMDc4LCAweDM0NmIsIDB4MTA3OCwKKwkweDM2ZTksIDB4MGM3ZSwgMHgyOTYwLCAweDYwMDQsIDB4YTA4NCwgMHhmZmY1LCAweDYwMDYsIDB4MTA3OCwKKwkweDM1NTgsIDB4MGM3ZiwgMHg2OTIwLCAweGExOGQsIDB4MDEwMCwgMHg2OTIyLCAweDdlNTgsIDB4YTZiNSwKKwkweDAwMDQsIDB4N2U1YSwgMHhhNjg0LCAweDA0MDAsIDB4MDBjMCwgMHgzNDVjLCAweDc4MmIsIDB4MzAwOCwKKwkweDc4MWIsIDB4MDA1NiwgMHgwMDc4LCAweDI0MzgsIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwKKwkweDAwNzgsIDB4MjQzOCwgMHgwYzdlLCAweDI5NjAsIDB4NjAwNCwgMHhhMDg0LCAweGZmZjUsIDB4NjAwNiwKKwkweDEwNzgsIDB4MzU1OCwgMHgwYzdmLCAweDdlNTgsIDB4YTY4NCwgMHgwNDAwLCAweDAwYzAsIDB4MzQ3NCwKKwkweDc4MWIsIDB4MDA1OCwgMHgwMDc4LCAweDI0MzgsIDB4NzgxYiwgMHgwMDY1LCAweDAwNzgsIDB4MjQzOCwKKwkweDBjN2UsIDB4NzA1NCwgMHgyMDYwLCAweDYxMDAsIDB4YTE4YywgMHgxMDAwLCAweDAwNDAsIDB4MzRiOCwKKwkweDYyMDgsIDB4ODIxNywgMHhhMjk0LCAweDAwZmYsIDB4YTI4MiwgMHgwMDBjLCAweDAwNDgsIDB4MzQ4YywKKwkweDAwNDAsIDB4MzQ4YywgMHgyMDExLCAweDAwMGMsIDB4MjQwMCwgMHhhMjAyLCAweDAwYzgsIDB4MzQ5MSwKKwkweDIyMjAsIDB4NjIwOCwgMHhhMjk0LCAweDAwZmYsIDB4NzAxOCwgMHhhMDg2LCAweDAwMjgsIDB4MDBjMCwKKwkweDM0YTEsIDB4YTI4MiwgMHgwMDE5LCAweDAwYzgsIDB4MzRhNywgMHgyMDExLCAweDAwMTksIDB4MDA3OCwKKwkweDM0YTcsIDB4YTI4MiwgMHgwMDBjLCAweDAwYzgsIDB4MzRhNywgMHgyMDExLCAweDAwMGMsIDB4MjIwMCwKKwkweGE1MDIsIDB4MDBjOCwgMHgzNGFjLCAweDIyMjgsIDB4MTA3OCwgMHgzNmVkLCAweDg1MmIsIDB4ODUyYiwKKwkweDEwNzgsIDB4MzcyZSwgMHgwMDQwLCAweDM0YjgsIDB4MTA3OCwgMHgzNTMxLCAweDAwNzgsIDB4MzRiYywKKwkweDEwNzgsIDB4MzZlOSwgMHgxMDc4LCAweDM1NTgsIDB4Nzg1OCwgMHhhMDg1LCAweDAwMDQsIDB4Nzg1YSwKKwkweDBjN2YsIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0MzgsIDB4MGM3ZSwKKwkweDI5NjAsIDB4NjAwMCwgMHhhMDg0LCAweDEwMDAsIDB4MDBjMCwgMHgzNGRmLCAweDYwMTAsIDB4YTA4NCwKKwkweDAwMGYsIDB4MDBjMCwgMHgzNGQ5LCAweDYxMDQsIDB4YTE4YywgMHhmZmY1LCAweDYxMDYsIDB4MGM3ZiwKKwkweDAwN2MsIDB4MjAxMSwgMHgwMDMyLCAweDIwMTksIDB4MDAwMCwgMHgwMDc4LCAweDM1MDYsIDB4NjhhMCwKKwkweGEwODQsIDB4MDIwMCwgMHgwMGMwLCAweDM0ZDksIDB4NjIwOCwgMHhhMjk0LCAweDAwZmYsIDB4NzAxOCwKKwkweGEwODYsIDB4MDAyOCwgMHgwMGMwLCAweDM0ZjQsIDB4YTI4MiwgMHgwMDE5LCAweDAwYzgsIDB4MzRmYSwKKwkweDIwMTEsIDB4MDAxOSwgMHgwMDc4LCAweDM0ZmEsIDB4YTI4MiwgMHgwMDBjLCAweDAwYzgsIDB4MzRmYSwKKwkweDIwMTEsIDB4MDAwYywgMHg2MzA4LCAweDgzMWYsIDB4YTM5YywgMHgwMGZmLCAweGEzODIsIDB4MDAwYywKKwkweDAwNDgsIDB4MzUwNiwgMHgwMDQwLCAweDM1MDYsIDB4MjAxOSwgMHgwMDBjLCAweDc4YWIsIDB4MDAwMSwKKwkweDc4YWIsIDB4MDAwMywgMHg3OGFiLCAweDAwMDEsIDB4N2FhYSwgMHg3YmFhLCAweGE4YzAsIDB4MDAwNSwKKwkweDY4MjAsIDB4YTA4NSwgMHgwMTAwLCAweDY4MjIsIDB4MGM3ZiwgMHgwMDdjLCAweDBjN2UsIDB4Mjk2MCwKKwkweGExOGMsIDB4ZmZmNSwgMHg2MTA2LCAweDIwMTEsIDB4MDAzMiwgMHgyMDE5LCAweDAwMDAsIDB4MDA3OCwKKwkweDM1MjEsIDB4NzhhYiwgMHgwMDAxLCAweDc4YWIsIDB4MDAwMywgMHg3OGFiLCAweDAwMDEsIDB4N2FhYSwKKwkweDdiYWEsIDB4YThjMCwgMHgwMDA1LCAweDY4MjAsIDB4YTA4NSwgMHgwMTAwLCAweDY4MjIsIDB4MGM3ZiwKKwkweDAwN2MsIDB4MGM3ZSwgMHg3MTU0LCAweDIxNjAsIDB4MTA3OCwgMHgzNTM4LCAweDBjN2YsIDB4MDA3YywKKwkweDIwMDgsIDB4YTA4NCwgMHhmZmYwLCAweGE0MjUsIDB4N2M4NiwgMHg2MDE4LCAweDc4OWEsIDB4N2NhZSwKKwkweDY0MTIsIDB4NzhhNCwgMHhhMDg0LCAweGZmZjgsIDB4YTE4YywgMHgwMDA3LCAweGExMDUsIDB4NzhhNiwKKwkweDYwMTYsIDB4Nzg4YSwgMHhhNGE0LCAweDAwMGYsIDB4ODQyNywgMHg4MjA0LCAweDgwMDQsIDB4YTA4NCwKKwkweDAwZmYsIDB4YTQwNSwgMHg2MDBlLCAweDYwMDQsIDB4YTA4NCwgMHhmZmY1LCAweDYwMDYsIDB4MDA3YywKKwkweDBjN2UsIDB4NzA1NCwgMHgyMDYwLCAweDEwNzgsIDB4MzU1ZiwgMHgwYzdmLCAweDAwN2MsIDB4NjAxOCwKKwkweDc4OWEsIDB4NzhhNCwgMHhhMDg0LCAweGZmZjAsIDB4NzhhNiwgMHg2MDEyLCAweDc4ODQsIDB4YTA4NCwKKwkweGZmZjAsIDB4Nzg4NiwgMHgwMDdjLCAweGEyODIsIDB4MDAwMiwgMHgwMGMwLCAweDM2NmIsIDB4N2FhOCwKKwkweDY5MjAsIDB4YTE4ZCwgMHgwMDgwLCAweDY5MjIsIDB4YTE4NCwgMHgwMjAwLCAweDAwNDAsIDB4MzViNCwKKwkweGExOGMsIDB4ZmRmZiwgMHg2OTIyLCAweGEyOTQsIDB4MDBmZiwgMHhhMjgyLCAweDAwMDIsIDB4MDBjOCwKKwkweDM2NmIsIDB4MTA3OCwgMHgzNWZkLCAweDEwNzgsIDB4MzU1OCwgMHhhOTgwLCAweDAwMDEsIDB4MjAwYywKKwkweDEwNzgsIDB4MzdiOSwgMHgxMDc4LCAweDM0YzcsIDB4ODhmZiwgMHgwMDQwLCAweDM1YTcsIDB4Nzg5YiwKKwkweDAwNjAsIDB4MjgwMCwgMHg3OGFhLCAweDdlNTgsIDB4YTZiNSwgMHgwMDA0LCAweDdlNWEsIDB4YTY4NCwKKwkweDA0MDAsIDB4MDBjMCwgMHgzNWExLCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLCAweDAwNTYsIDB4MDA3OCwKKwkweDI0MzgsIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0MzgsIDB4N2U1OCwKKwkweGE2ODQsIDB4MDQwMCwgMHgwMGMwLCAweDM1YjAsIDB4NzgxYiwgMHgwMDU4LCAweDAwNzgsIDB4MjQzOCwKKwkweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0MzgsIDB4YTI4MiwgMHgwMDAyLCAweDAwYzgsIDB4MzViYywKKwkweGEyODQsIDB4MDAwMSwgMHgwMDQwLCAweDM1YzYsIDB4NzE1NCwgMHhhMTg4LCAweDAwMDAsIDB4MjEwYywKKwkweGExOGMsIDB4MjAwMCwgMHgwMGMwLCAweDM1YzYsIDB4MjAxMSwgMHgwMDAwLCAweDEwNzgsIDB4MzZkYiwKKwkweDEwNzgsIDB4MzVmZCwgMHgxMDc4LCAweDM1NTgsIDB4Nzg1OCwgMHhhMDg1LCAweDAwMDQsIDB4Nzg1YSwKKwkweDc4MmIsIDB4MzAwOCwgMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDM4LCAweDBjN2UsIDB4MDI3ZSwKKwkweDI5NjAsIDB4NjAwMCwgMHgyMDExLCAweDAwMDEsIDB4YTA4NCwgMHgyMDAwLCAweDAwYzAsIDB4MzVlZCwKKwkweDYwMTQsIDB4YTA4NCwgMHgwMDQwLCAweDAwYzAsIDB4MzVlYiwgMHhhMThjLCAweGZmZWYsIDB4NjEwNiwKKwkweGEwMDYsIDB4MDA3OCwgMHgzNWZhLCAweDIwMTEsIDB4MDAwMCwgMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwKKwkweDAwMDIsIDB4NzhhYiwgMHgwMDAzLCAweDdhYWEsIDB4YThjMCwgMHgwMDA0LCAweDY4MjAsIDB4YTA4NSwKKwkweDAyMDAsIDB4NjgyMiwgMHgwMjdmLCAweDBjN2YsIDB4MDA3YywgMHgwYzdlLCAweDcwNTQsIDB4MjA2MCwKKwkweDEwNzgsIDB4MzYwNCwgMHgwYzdmLCAweDAwN2MsIDB4ODJmZiwgMHgwMDQwLCAweDM2MDksIDB4MjAxMSwKKwkweDAwNDAsIDB4NjAxOCwgMHhhMDgwLCAweDAwMDIsIDB4Nzg5YSwgMHg3OGE0LCAweGEwODQsIDB4ZmZiZiwKKwkweGEyMDUsIDB4NzhhNiwgMHg3ODhhLCAweDYwMTYsIDB4NjAwNCwgMHhhMDg0LCAweGZmZWYsIDB4NjAwNiwKKwkweDAwN2MsIDB4MDA3ZSwgMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMDQwLCAweDM2MjIsIDB4MDA3ZiwKKwkweDAwNzgsIDB4MzYyNSwgMHgwMDdmLCAweDAwNzgsIDB4MzY2NywgMHhhNjg0LCAweDAwMjAsIDB4MDA0MCwKKwkweDM2NjcsIDB4Nzg4OCwgMHhhMDg0LCAweDAwNDAsIDB4MDA0MCwgMHgzNjY3LCAweDdiYjgsIDB4YTM4NCwKKwkweDAwM2YsIDB4ODMxYiwgMHgwMGM4LCAweDM2MzUsIDB4ODAwMCwgMHhhMDA1LCAweDAwNDAsIDB4MzY0YiwKKwkweDgzMWIsIDB4MDBjOCwgMHgzNjNlLCAweDgwMDEsIDB4MDA0MCwgMHgzNjYzLCAweGE2ODQsIDB4NDAwMCwKKwkweDAwNDAsIDB4MzY0YiwgMHg3OGI4LCAweDgwMWIsIDB4MDBjOCwgMHgzNjQ3LCAweDgwMDAsIDB4YTA4NCwKKwkweDAwM2YsIDB4MDBjMCwgMHgzNjYzLCAweGE2YjQsIDB4YmZmZiwgMHg3ZTVhLCAweDc5ZDgsIDB4N2FkYywKKwkweDIwMDEsIDB4MDAwMSwgMHhhMTA4LCAweDAwYzgsIDB4MzY1NywgMHhhMjkxLCAweDAwMDAsIDB4NzlkMiwKKwkweDc5ZGEsIDB4N2FkNiwgMHg3YWRlLCAweDEwNzgsIDB4NDllZCwgMHg3ODFiLCAweDAwNjQsIDB4MTA3OCwKKwkweDQ4NzIsIDB4MDA3OCwgMHgyNDM4LCAweDc4MWIsIDB4MDA2NCwgMHgwMDc4LCAweDI0MzgsIDB4NzgxYiwKKwkweDAwNjUsIDB4MDA3OCwgMHgyNDM4LCAweDEwNzgsIDB4MzZhMywgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwKKwkweDAwNjUsIDB4MDA3OCwgMHgyNDM4LCAweDEwNzgsIDB4MzY4ZiwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwKKwkweDAwNjUsIDB4MDA3OCwgMHgyNDM4LCAweDY4MjcsIDB4MDAwMiwgMHgxMDc4LCAweDM2OTcsIDB4NzhlNCwKKwkweGEwODQsIDB4MDAzMCwgMHgwMDQwLCAweDI0NjEsIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MDA0MCwKKwkweDI0NjEsIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0MzgsIDB4MjAwMSwKKwkweDAwMDUsIDB4MDA3OCwgMHgzNmE1LCAweDIwMDEsIDB4MDAwYywgMHgwMDc4LCAweDM2YTUsIDB4MjAwMSwKKwkweDAwMDYsIDB4MDA3OCwgMHgzNmE1LCAweDIwMDEsIDB4MDAwZCwgMHgwMDc4LCAweDM2YTUsIDB4MjAwMSwKKwkweDAwMDksIDB4MDA3OCwgMHgzNmE1LCAweDIwMDEsIDB4MDAwNywgMHg3ODliLCAweDAwMTAsIDB4NzhhYSwKKwkweDc4OWIsIDB4MDA2MCwgMHg3OGFiLCAweDAwMDEsIDB4YTZiNSwgMHgwMDA0LCAweDdlNWEsIDB4MDA3YywKKwkweDA3N2UsIDB4ODczZiwgMHhhN2JjLCAweDAwMGYsIDB4ODczYiwgMHg4NzNiLCAweDg3MDMsIDB4YTBlMCwKKwkweDUyODAsIDB4YTdiOCwgMHgwMDIwLCAweDdmOWEsIDB4NzlhNCwgMHhhMTg0LCAweDAwMGYsIDB4MDA0MCwKKwkweDM2YzksIDB4YTE4NCwgMHhmZmYwLCAweDc4YTYsIDB4NjAxMiwgMHg2MDA0LCAweGEwODUsIDB4MDAwOCwKKwkweDYwMDYsIDB4ODczOCwgMHg4NzM4LCAweDdmOWEsIDB4NzlhNCwgMHhhMTg0LCAweDAwNDAsIDB4MDA0MCwKKwkweDM2ZDksIDB4YTE4NCwgMHhmZmJmLCAweDc4YTYsIDB4NjAxNiwgMHg2MDA0LCAweGEwODUsIDB4MDAxMCwKKwkweDYwMDYsIDB4MDc3ZiwgMHgwMDdjLCAweDc4OWIsIDB4MDAxMCwgMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwKKwkweDAwMDIsIDB4NzhhYiwgMHgwMDAzLCAweDdhYWEsIDB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwNCwKKwkweDAwN2MsIDB4MjAyMSwgMHgwMDAwLCAweDIwMjksIDB4MDAzMiwgMHg3ODliLCAweDAwMTAsIDB4NzhhYiwKKwkweDAwMDEsIDB4NzhhYiwgMHgwMDAzLCAweDc4YWIsIDB4MDAwMSwgMHg3ZGFhLCAweDdjYWEsIDB4Nzg5YiwKKwkweDAwNjAsIDB4NzhhYiwgMHgwMDA1LCAweDAwN2MsIDB4MTU3ZSwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwKKwkweDgwMDMsIDB4ODAwMywgMHhhMDgwLCAweDAwMjAsIDB4Nzg5YSwgMHg3OWE0LCAweGExOGMsIDB4ZmZmMCwKKwkweDIwMDEsIDB4NTA0NiwgMHgyMDA0LCAweGEwODIsIDB4MDAyOCwgMHgwMDQwLCAweDM3MTcsIDB4MjAyMSwKKwkweDM3YTAsIDB4MjAxOSwgMHgwMDE0LCAweDIwYTksIDB4MDAwYywgMHgwMDc4LCAweDM3MWQsIDB4MjAyMSwKKwkweDM3YWMsIDB4MjAxOSwgMHgwMDE5LCAweDIwYTksIDB4MDAwZCwgMHgyMDExLCAweDAwNjQsIDB4MjQwNCwKKwkweGEwODQsIDB4ZmZmMCwgMHhhMTA2LCAweDAwNDAsIDB4MzcyYywgMHg4NDIwLCAweDIzMDAsIDB4YTIxMCwKKwkweDAwNzAsIDB4MzcyYywgMHgwMDc4LCAweDM3MWYsIDB4MTU3ZiwgMHgwMDdjLCAweDE1N2UsIDB4MjAwOSwKKwkweDUwNDYsIDB4MjEwYywgMHhhMTgyLCAweDAwMzIsIDB4MDA0OCwgMHgzNzQyLCAweDAwNDAsIDB4Mzc0NiwKKwkweDIwMDksIDB4Mzc5MiwgMHgyMDE5LCAweDAwMTEsIDB4MjBhOSwgMHgwMDBlLCAweDIwMTEsIDB4MDAzMiwKKwkweDAwNzgsIDB4Mzc1OCwgMHhhMTgyLCAweDAwMjgsIDB4MDA0MCwgMHgzNzUwLCAweDIwMDksIDB4MzdhMCwKKwkweDIwMTksIDB4MDAxNCwgMHgyMGE5LCAweDAwMGMsIDB4MjAxMSwgMHgwMDY0LCAweDAwNzgsIDB4Mzc1OCwKKwkweDIwMDksIDB4MzdhYywgMHgyMDE5LCAweDAwMTksIDB4MjBhOSwgMHgwMDBkLCAweDIwMTEsIDB4MDA2NCwKKwkweDIyMDAsIDB4YTUwMiwgMHgwMDQwLCAweDM3NjgsIDB4MDA0OCwgMHgzNzY4LCAweDgxMDgsIDB4MjMwMCwKKwkweGEyMTAsIDB4MDA3MCwgMHgzNzY1LCAweDAwNzgsIDB4Mzc1OCwgMHgxNTdmLCAweGEwMDYsIDB4MDA3YywKKwkweDE1N2YsIDB4YTU4MiwgMHgwMDY0LCAweDAwYzgsIDB4Mzc3NywgMHg3ODA4LCAweGEwODUsIDB4MDA3MCwKKwkweDc4MGEsIDB4NzA0NCwgMHhhMDg1LCAweDAwNzAsIDB4NzA0NiwgMHgwMDc4LCAweDM3NzcsIDB4NzhlYywKKwkweGEwODQsIDB4MDMwMCwgMHgwMDQwLCAweDM3N2YsIDB4MjEwNCwgMHgwMDc4LCAweDM3OTAsIDB4MjEwNCwKKwkweGEwOWUsIDB4MTEwMiwgMHgwMGMwLCAweDM3OTAsIDB4MjAwMSwgMHgwNGZkLCAweDIwMDQsIDB4YTA4MiwKKwkweDAwMDUsIDB4MDA0OCwgMHgzNzhmLCAweDIwMDEsIDB4MTIwMSwgMHgwMDc4LCAweDM3OTAsIDB4MjEwNCwKKwkweGEwMDUsIDB4MDA3YywgMHgxMTAyLCAweDMwMDIsIDB4MzIwMiwgMHg0MjAzLCAweDQ0MDMsIDB4NTQwNCwKKwkweDU2MDQsIDB4NjYwNSwgMHg2ODA1LCAweDc4MDYsIDB4N2EwNiwgMHgwYzA3LCAweDBjMDcsIDB4MGUwNywKKwkweDMyMDIsIDB4NDIwMiwgMHg1MjAyLCAweDYyMDIsIDB4NzIwMiwgMHg2NjA1LCAweDc2MDUsIDB4NzgwNSwKKwkweDdhMDUsIDB4N2MwNSwgMHg3ZTA1LCAweDdmMDUsIDB4MjIwMiwgMHgzMjAyLCAweDQyMDIsIDB4NTIwMiwKKwkweDU0MDQsIDB4NjQwNCwgMHg3NDA0LCAweDc2MDQsIDB4NzgwNCwgMHg3YTA0LCAweDdjMDQsIDB4N2UwNCwKKwkweDdmMDQsIDB4Nzg5YiwgMHgwMDEwLCAweGEwNDYsIDB4MDA3YywgMHhhNzg0LCAweDBmMDAsIDB4ODAwYiwKKwkweGE3ODQsIDB4MDAxZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGExMDUsIDB4YTBlMCwKKwkweDUzMDAsIDB4MDA3YywgMHg3OWQ4LCAweDdhZGMsIDB4NzhkMCwgMHg4MDFiLCAweDAwYzgsIDB4MzdkMSwKKwkweDgwMDAsIDB4YTA4NCwgMHgwMDNmLCAweGExMDgsIDB4YTI5MSwgMHgwMDAwLCAweDAwN2MsIDB4MGY3ZSwKKwkweDIwNzksIDB4MDEwMCwgMHgyMDA5LCAweDUwNDAsIDB4MjA5MSwgMHg4MDAwLCAweDIxMDQsIDB4MDA3OSwKKwkweDM3ZTEsIDB4MzgxNywgMHgzN2ViLCAweDM3ZWIsIDB4MzdlYiwgMHgzN2ViLCAweDM3ZWIsIDB4MzdlYiwKKwkweDM4MWIsIDB4MTA3OCwgMHgyM2NhLCAweDc4NGIsIDB4MDAwNCwgMHg3ODQ4LCAweGEwODQsIDB4MDAwNCwKKwkweDAwYzAsIDB4MzdlZCwgMHg3ODRiLCAweDAwMDgsIDB4Nzg0OCwgMHhhMDg0LCAweDAwMDgsIDB4MDBjMCwKKwkweDM3ZjQsIDB4NjhiNCwgMHhhMDg1LCAweDQwMDAsIDB4NjhiNiwgMHg3ODU4LCAweGEwODUsIDB4NDAwMCwKKwkweDc4NWEsIDB4NzgzMCwgMHhhMDg0LCAweDAwODAsIDB4MDBjMCwgMHgzODE3LCAweDAwMTgsIDB4MzgxNywKKwkweDY4MWMsIDB4YTA4NCwgMHgwMDIwLCAweDAwYzAsIDB4MzgxNSwgMHgwZTdlLCAweDIwNzEsIDB4NTA0MCwKKwkweDEwNzgsIDB4Mzg2OCwgMHgwZTdmLCAweDAwNzgsIDB4MzgxNywgMHg3ODFiLCAweDAwZDIsIDB4MjA5MSwKKwkweDgwMDEsIDB4MGY3ZiwgMHgwMDdjLCAweDEwNzgsIDB4M2E0MiwgMHgwMDc4LCAweDM4MTcsIDB4MGM3ZSwKKwkweDY4MTQsIDB4ODAwNywgMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTBlMCwKKwkweDUyODAsIDB4NjAwNCwgMHhhMDg0LCAweDAwMGEsIDB4MDBjMCwgMHgzODUyLCAweDYxMDgsIDB4YTE5NCwKKwkweGZmMDAsIDB4MDA0MCwgMHgzODUyLCAweGExOGMsIDB4MDBmZiwgMHgyMDAxLCAweDAwMTksIDB4YTEwNiwKKwkweDAwNDAsIDB4Mzg0MSwgMHgyMDAxLCAweDAwMzIsIDB4YTEwNiwgMHgwMDQwLCAweDM4NDUsIDB4MDA3OCwKKwkweDM4NDksIDB4MjAwOSwgMHgwMDIwLCAweDAwNzgsIDB4Mzg0YiwgMHgyMDA5LCAweDAwM2YsIDB4MDA3OCwKKwkweDM4NGIsIDB4MjAxMSwgMHgwMDAwLCAweDIxMDAsIDB4YTIwNSwgMHg2MDBhLCAweDYwMDQsIDB4YTA4NSwKKwkweDAwMDIsIDB4NjAwNiwgMHgwYzdmLCAweDAwN2MsIDB4NzgxYiwgMHgwMDY1LCAweDAwNzgsIDB4MjQzOCwKKwkweDc4MmIsIDB4MzAwOCwgMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDM4LCAweDc4MWIsIDB4MDA1OCwKKwkweDAwNzgsIDB4MjQzOCwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDU2LCAweDAwNzgsIDB4MjQzOCwKKwkweDIwMDksIDB4NTAyMCwgMHgyMTBjLCAweGExODYsIDB4MDAwMCwgMHgwMDQwLCAweDM4N2MsIDB4YTE4NiwKKwkweDAwMDEsIDB4MDA0MCwgMHgzODdmLCAweDIwMDksIDB4NTAzOCwgMHgyMDBiLCAweDAwMGIsIDB4NzA2ZiwKKwkweDAwMDEsIDB4NzgxYiwgMHgwMDQ4LCAweDAwN2MsIDB4NzgxYiwgMHgwMGNjLCAweDAwN2MsIDB4MjAwOSwKKwkweDUwMzgsIDB4MjAwYiwgMHgwMDBhLCAweDAwN2MsIDB4MjAwOSwgMHg1MDIwLCAweDIxMGMsIDB4YTE4NiwKKwkweDAwMDAsIDB4MDA0MCwgMHgzODlmLCAweGExODYsIDB4MDAwMSwgMHgwMDQwLCAweDM4OTksIDB4MjAwOSwKKwkweDUwMzgsIDB4MjAwYiwgMHgwMDBiLCAweDcwNmYsIDB4MDAwMSwgMHg3ODFiLCAweDAwNDgsIDB4MDA3OCwKKwkweDI0MzgsIDB4MjAwOSwgMHg1MDM4LCAweDIwMGIsIDB4MDAwYSwgMHgwMDc4LCAweDI0MzgsIDB4NzgyYiwKKwkweDMwMDgsIDB4NzgxYiwgMHgwMGNjLCAweDAwNzgsIDB4MjQzOCwgMHg3ODFiLCAweDAwZDIsIDB4MDA3OCwKKwkweDI0MzgsIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDBkMiwgMHgwMDc4LCAweDI0MzgsIDB4NzgxYiwKKwkweDAwOTMsIDB4MDA3OCwgMHgyNDM4LCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLCAweDAwOTMsIDB4MDA3OCwKKwkweDI0MzgsIDB4NjgxOCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgzOGMwLCAweDY4MWIsIDB4MDAxZCwKKwkweDcwNmYsIDB4MDAwMSwgMHg3ODFiLCAweDAwNDgsIDB4MDA3OCwgMHgyNDM4LCAweDAwN2UsIDB4NzgzMCwKKwkweGEwODQsIDB4MDBjMCwgMHgwMGMwLCAweDM4ZGMsIDB4NzgwOCwgMHhhMDg0LCAweGZmZmMsIDB4NzgwYSwKKwkweDAwMDUsIDB4MDAwNSwgMHgwMDA1LCAweDAwMDUsIDB4NzhlYywgMHhhMDg0LCAweDAwMjEsIDB4MDA0MCwKKwkweDM4ZGMsIDB4NzA0NCwgMHg3ODBhLCAweGEwMDUsIDB4MDA3ZiwgMHgwMDdjLCAweDcwNDQsIDB4YTA4NSwKKwkweDAwMDIsIDB4NzA0NiwgMHg3ODBhLCAweDAwN2MsIDB4MDA3ZSwgMHg3ODMwLCAweGEwODQsIDB4MDA0MCwKKwkweDAwYzAsIDB4MzhlNSwgMHgwMDk4LCAweDM4ZjAsIDB4MDA3ZiwgMHg3ODlhLCAweDc4YWMsIDB4MDA3YywKKwkweDc4MDgsIDB4YTA4NCwgMHhmZmZkLCAweDc4MGEsIDB4MDAwNSwgMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwKKwkweDc4ZWMsIDB4YTA4NCwgMHgwMDIxLCAweDAwNDAsIDB4MzhmZiwgMHgwMDk4LCAweDM4ZmQsIDB4MDA3ZiwKKwkweDc4OWEsIDB4NzhhYywgMHgwMDdlLCAweDcwNDQsIDB4NzgwYSwgMHgwMDdmLCAweDAwN2MsIDB4NzhlYywKKwkweGEwODQsIDB4MDAwMiwgMHgwMGMwLCAweDQ2MWQsIDB4YTc4NCwgMHgwMDdkLCAweDAwYzAsIDB4MzkxMywKKwkweDI3MDAsIDB4MTA3OCwgMHgyM2NhLCAweGE3ODQsIDB4MDAwMSwgMHgwMGMwLCAweDJmNDMsIDB4YTc4NCwKKwkweDAwNzAsIDB4MDA0MCwgMHgzOTIzLCAweDBjN2UsIDB4MmQ2MCwgMHgyZjY4LCAweDEwNzgsIDB4MjM3NSwKKwkweDJkNzgsIDB4MmM2OCwgMHgwYzdmLCAweGE3ODQsIDB4MDAwOCwgMHgwMDQwLCAweDM5MzAsIDB4Nzg0YiwKKwkweDAwMDgsIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MDA0MCwgMHgyNDYxLCAweDAwNzgsIDB4Mzg1NCwKKwkweGE3ODQsIDB4MDAwNCwgMHgwMDQwLCAweDM5NjMsIDB4NzhiOCwgMHhhMDg0LCAweDQwMDEsIDB4MDA0MCwKKwkweDM5NjMsIDB4Nzg0YiwgMHgwMDA4LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDAwNDAsIDB4MjQ2MSwKKwkweDc4ZTQsIDB4YTA4NCwgMHgwMDA3LCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDM5NjMsIDB4NzhjMCwKKwkweGEwODUsIDB4NDgwMCwgMHgyMDMwLCAweDdlNWEsIDB4NzgxYiwgMHgwMGQyLCAweDAwNzgsIDB4MjQzOCwKKwkweDc4NGIsIDB4MDAwOCwgMHg2ODE4LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDM5NWYsIDB4NjgxYiwKKwkweDAwMTUsIDB4YTY4NCwgMHg0MDAwLCAweDAwNDAsIDB4Mzk1ZiwgMHg2ODFiLCAweDAwMDcsIDB4MTA3OCwKKwkweDM4NjgsIDB4MDA3OCwgMHgyNDM4LCAweDY4MWIsIDB4MDAwMywgMHg3ODU4LCAweGEwODQsIDB4M2YwMCwKKwkweDY4MWUsIDB4NjgyZiwgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHg3ODRiLCAweDAwMDgsIDB4NzhlYywKKwkweGEwODQsIDB4MDAwMywgMHgwMDQwLCAweDI5NDQsIDB4MDAxOCwgMHgyNDM4LCAweDAwNzgsIDB4MzY3MywKKwkweDZiMTQsIDB4ODMwNywgMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTA4MCwKKwkweDUyODAsIDB4MjA2MCwgMHgyMDQ4LCAweDcwNTYsIDB4NjAwMCwgMHg3MDVhLCAweDYwMDQsIDB4NzA1ZSwKKwkweDJhNjAsIDB4MDA3YywgMHgwMDc5LCAweDM5OGMsIDB4Mzk5NCwgMHgzOTk1LCAweDM5OTQsIDB4Mzk5NywKKwkweDM5OTQsIDB4Mzk5NCwgMHgzOTk0LCAweDM5OWMsIDB4MDA3YywgMHgxMDc4LCAweDMzYzQsIDB4MTA3OCwKKwkweDQ2MzMsIDB4NzAzOCwgMHg2MDBhLCAweDAwN2MsIDB4NzBhMCwgMHhhMDA1LCAweDAwNDAsIDB4MzlhOSwKKwkweDIwNjgsIDB4MTA3OCwgMHgxYjQ1LCAweDEwNzgsIDB4NDViNSwgMHgxMDc4LCAweDQ1YmMsIDB4NzBhMywKKwkweDAwMDAsIDB4MDA3YywgMHgwZTdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDUwNDAsIDB4NzAwMCwKKwkweGEwODYsIDB4MDAwNywgMHgwMGMwLCAweDM5YzAsIDB4NjExMCwgMHg3MGJjLCAweGExMDYsIDB4MDBjMCwKKwkweDM5YzAsIDB4MGU3ZiwgMHgxMDc4LCAweDFiNTIsIDB4MTA3OCwgMHgzOWM2LCAweGEwMDYsIDB4MDA3YywKKwkweDIwOTEsIDB4ODAwMSwgMHgwZTdmLCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweDBmN2UsIDB4MGU3ZSwKKwkweDIwNzEsIDB4NTA0MCwgMHgwMDc4LCAweDIxZDksIDB4Nzg1YiwgMHgwMDAwLCAweDcwYWYsIDB4MDAwZSwKKwkweDIwMDksIDB4MDEwMCwgMHgwMTdlLCAweDcwYTAsIDB4YTA2ZCwgMHgwMDQwLCAweDM5ZGIsIDB4NzBhMywKKwkweDAwMDAsIDB4MDA3OCwgMHgzOWUxLCAweDcwYjMsIDB4MDAwMCwgMHgxMDc4LCAweDFiNmUsIDB4MDA0MCwKKwkweDM5ZTcsIDB4NzBhYywgMHg2ODI2LCAweDEwNzgsIDB4M2FjMiwgMHgwMDc4LCAweDM5ZGIsIDB4MDE3ZiwKKwkweDE1N2UsIDB4MGM3ZSwgMHgwZDdlLCAweDIwYTksIDB4MDAwOCwgMHgyMDYxLCAweDc0MTAsIDB4NjAwMCwKKwkweGExMDUsIDB4NjAwMiwgMHg2MDFjLCAweGEwNmQsIDB4MDA0MCwgMHgzOWZmLCAweDY4MDAsIDB4NjAxZSwKKwkweDEwNzgsIDB4MTkzZCwgMHg2MDA4LCAweDgwMDAsIDB4NjAwYSwgMHgwMDc4LCAweDM5ZjIsIDB4NjAxOCwKKwkweGEwNmQsIDB4MDA0MCwgMHgzYTA5LCAweDY4MDAsIDB4NjAxYSwgMHgxMDc4LCAweDE5M2QsIDB4MDA3OCwKKwkweDM5ZmYsIDB4YWNlMCwgMHgwMDA4LCAweDAwNzAsIDB4M2EwZiwgMHgwMDc4LCAweDM5ZWYsIDB4NzA5YywKKwkweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDNhMTYsIDB4MTA3OCwgMHgzYjNjLCAweDBkN2YsIDB4MGM3ZiwKKwkweDE1N2YsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsIDB4MjMwMCwgMHg2ODA0LCAweGEwODQsIDB4MDAwZiwKKwkweDAwNzksIDB4M2EyMiwgMHgzYTMyLCAweDNhMzIsIDB4M2EzMiwgMHgzYTMyLCAweDNhMzIsIDB4M2EzMiwKKwkweDNhMzQsIDB4M2EzYSwgMHgzYTMyLCAweDNhMzIsIDB4M2EzMiwgMHgzYTMyLCAweDNhMzIsIDB4M2EzYywKKwkweDNhMzIsIDB4M2EzNCwgMHgxMDc4LCAweDIzY2EsIDB4MTA3OCwgMHg0NDY2LCAweDEwNzgsIDB4MTkzZCwKKwkweDAwNzgsIDB4M2E0MCwgMHg2ODI3LCAweDAwMGIsIDB4MTA3OCwgMHg0NDY2LCAweDEwNzgsIDB4M2FjMiwKKwkweDEyN2YsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsIDB4MjMwMCwgMHgwMDk4LCAweDNhNWUsIDB4NzgzMCwKKwkweGEwODQsIDB4MDBjMCwgMHgwMGMwLCAweDNhNWUsIDB4MGQ3ZSwgMHgxMDc4LCAweDQ1YzUsIDB4MmQwMCwKKwkweDY4MmUsIDB4MjAwOSwgMHgwMDA0LCAweDIwMDEsIDB4MDAwMCwgMHg2ODI3LCAweDAwODQsIDB4MTA3OCwKKwkweDQ1N2UsIDB4MTA3OCwgMHgzYWMyLCAweDBkN2YsIDB4MDA3OCwgMHgzYTkwLCAweDc5NDgsIDB4YTE4NSwKKwkweDQwMDAsIDB4Nzg0YSwgMHgwMDk4LCAweDNhNjcsIDB4Nzk0YSwgMHgwMDc4LCAweDNhNGMsIDB4NzgyOCwKKwkweGEwODYsIDB4MTgzNCwgMHgwMGMwLCAweDNhNzAsIDB4YTE4NSwgMHgwMDA0LCAweDAwNzgsIDB4M2E3NywKKwkweDc4MjgsIDB4YTE4NiwgMHgxODE0LCAweDAwYzAsIDB4M2E2NCwgMHhhMTg1LCAweDAwMGMsIDB4Nzg0YSwKKwkweDc4OWIsIDB4MDAwZSwgMHg3OGFiLCAweDAwMDIsIDB4Nzg1OCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NSwKKwkweDA0MDAsIDB4Nzg1YSwgMHg3MGI0LCAweGEwODAsIDB4MDA5MSwgMHg3ODFhLCAweDY4MjcsIDB4MDAwMiwKKwkweDY4MjcsIDB4MDA4NCwgMHgyMDA5LCAweDAwMDQsIDB4MjAwMSwgMHgwMDAwLCAweDEwNzgsIDB4NDU3ZSwKKwkweDEyN2YsIDB4MDA3YywgMHgwZDdlLCAweDZiMTQsIDB4MTA3OCwgMHgxYmUwLCAweDAwNDAsIDB4M2E5ZiwKKwkweDIwNjgsIDB4NjgyNywgMHgwMDAyLCAweDEwNzgsIDB4M2FjMiwgMHgwMDc4LCAweDNhOTQsIDB4MGQ3ZiwKKwkweDAwN2MsIDB4MGQ3ZSwgMHg2YjE0LCAweDZjMjgsIDB4YTRhNCwgMHgwMGZmLCAweDEwNzgsIDB4MWI3ZSwKKwkweDAwNDAsIDB4M2FhZiwgMHgyMDY4LCAweDY4MjcsIDB4MDAwMiwgMHgxMDc4LCAweDNhYzIsIDB4MGQ3ZiwKKwkweDAwN2MsIDB4MGQ3ZSwgMHg2YjE0LCAweGEzOWMsIDB4MDBmZiwgMHgxMDc4LCAweDFiYjEsIDB4MDA0MCwKKwkweDNhYzAsIDB4MjA2OCwgMHg2ODI3LCAweDAwMDIsIDB4MTA3OCwgMHgzYWMyLCAweDAwNzgsIDB4M2FiNSwKKwkweDBkN2YsIDB4MDA3YywgMHgwYzdlLCAweDY5MTQsIDB4MTA3OCwgMHgzYjMzLCAweDY5MDQsIDB4YTE4YywKKwkweDAwZmYsIDB4YTE4NiwgMHgwMDA2LCAweDAwNDAsIDB4M2FkZCwgMHhhMTg2LCAweDAwMGQsIDB4MDA0MCwKKwkweDNhZmMsIDB4YTE4NiwgMHgwMDE3LCAweDAwYzAsIDB4M2FkOSwgMHgxMDc4LCAweDE5M2QsIDB4MDA3OCwKKwkweDNhZGIsIDB4MTA3OCwgMHgxYzU1LCAweDBjN2YsIDB4MDA3YywgMHg2MDA0LCAweDgwMDEsIDB4MDA0OCwKKwkweDNhZmEsIDB4NjAwNiwgMHgyMDA5LCAweDAwMDAsIDB4YTY4NCwgMHgwMDAxLCAweDAwYzAsIDB4M2FlYSwKKwkweGExOGQsIDB4ODAwMCwgMHhhNjg0LCAweDAwMDQsIDB4MDA0MCwgMHgzYWYwLCAweGExOGQsIDB4MDAwMiwKKwkweDY5MWUsIDB4NjgyMywgMHgwMDAwLCAweDcxMDQsIDB4ODEwZiwgMHg2ODE4LCAweGExMDUsIDB4NjgxYSwKKwkweDAwNzgsIDB4M2FkOSwgMHgxMDc4LCAweDIzY2EsIDB4NjAxOCwgMHhhMDA1LCAweDAwYzAsIDB4M2IwYiwKKwkweDYwMDgsIDB4ODAwMSwgMHgwMDQ4LCAweDNiMGIsIDB4NjAwYSwgMHg2MDFjLCAweDY4MDIsIDB4MmQwMCwKKwkweDYwMWUsIDB4MDA3OCwgMHgzYjIxLCAweGFjODgsIDB4MDAwNiwgMHgyMTA0LCAweGEwMDUsIDB4MDA0MCwKKwkweDNiMTQsIDB4MjAwOCwgMHgwMDc4LCAweDNiMGQsIDB4NjgwMiwgMHgyZDBhLCAweDYwMDgsIDB4ODAwMSwKKwkweDAwNDgsIDB4M2FkYiwgMHg2MDBhLCAweDYwMTgsIDB4MjA2OCwgMHg2ODAwLCAweDYwMWEsIDB4MDA3OCwKKwkweDNiMDUsIDB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4MGM3ZSwgMHgwZDdlLCAweDEwNzgsIDB4MTkxYSwKKwkweDJkYTAsIDB4MTM3ZiwgMHgyMGE5LCAweDAwMzEsIDB4NTNhMywgMHgwYzdmLCAweDE0N2YsIDB4MTM3ZiwKKwkweDE1N2YsIDB4MDA3OCwgMHgzYWQ5LCAweGExODQsIDB4MDAxZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywKKwkweGEwODAsIDB4NzQxMCwgMHgyMDYwLCAweDAwN2MsIDB4MjAxOSwgMHg1MDUxLCAweDIzMDQsIDB4YTA4NSwKKwkweDAwMDEsIDB4MjAxYSwgMHgyMDE5LCAweDAxMDIsIDB4MjMwNCwgMHhhMDg1LCAweDAwMDEsIDB4MjAxYSwKKwkweDAwN2MsIDB4MjAxOSwgMHg1MDUxLCAweDIzMDQsIDB4YTA4NCwgMHhmZmZlLCAweDIwMWEsIDB4MjAxOSwKKwkweDAxMDIsIDB4MjMwNCwgMHhhMDg0LCAweGZmZmUsIDB4MjAxYSwgMHgwMDdjLCAweDc5OTAsIDB4YTE4YywKKwkweGZmZjgsIDB4Nzk5MiwgMHg3MGI0LCAweGEwODAsIDB4MDBkOCwgMHg3ODFhLCAweDAwNzgsIDB4MjQzOCwKKwkweDcwYTMsIDB4MDAwMCwgMHg3MDAzLCAweDAwMDAsIDB4NzA0MywgMHgwMDAxLCAweDcwMzcsIDB4MDAwMCwKKwkweDAwMTgsIDB4MjNlZiwgMHgxMDc4LCAweDFiNmUsIDB4MDA0MCwgMHgzYjkxLCAweDIwMDksIDB4NTAwZiwKKwkweDIwMGIsIDB4MDAwMCwgMHg2OGJjLCAweDIwNjAsIDB4NjEwMCwgMHhhMTg0LCAweDAzMDAsIDB4MDA0MCwKKwkweDNiODUsIDB4NjgyNywgMHgwMDBlLCAweGEwODQsIDB4MDIwMCwgMHgwMDQwLCAweDNiODEsIDB4NjgyNywKKwkweDAwMTcsIDB4MTA3OCwgMHgzYWMyLCAweDAwNzgsIDB4M2I2MCwgMHg3MDAwLCAweGEwODYsIDB4MDAwNywKKwkweDAwYzAsIDB4M2JlMywgMHgyZDAwLCAweDcwYTIsIDB4YWQ4MCwgMHgwMDBmLCAweDcwMzYsIDB4MDA3OCwKKwkweDNiOTgsIDB4NzA0MCwgMHhhMDg2LCAweDAwMDEsIDB4MDA0MCwgMHgyNDcxLCAweDAwNzgsIDB4MjQzOCwKKwkweDIwMzEsIDB4MDAwMCwgMHg2OTFjLCAweGExODQsIDB4MDAwMiwgMHgwMDQwLCAweDNiYTEsIDB4YTZiNSwKKwkweDAwMDQsIDB4YTE4NCwgMHgwMGMwLCAweDgwMDMsIDB4ODAwMywgMHg4MDA3LCAweGEwODAsIDB4M2M3MiwKKwkweDIwMDQsIDB4YTYzNSwgMHg2ODIwLCAweGEwODQsIDB4MDQwMCwgMHgwMDQwLCAweDNiYjksIDB4Nzg5YiwKKwkweDAwMTgsIDB4NzhhYiwgMHgwMDAzLCAweDc4OWIsIDB4MDA4MSwgMHg3OGFiLCAweDAwMDEsIDB4YTZiNSwKKwkweDEwMDAsIDB4NjgyMCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgzYmM1LCAweGE2YjUsIDB4MDQwMCwKKwkweDc4OWIsIDB4MDAwZSwgMHg2ODI0LCAweDgwMDcsIDB4NzhhYSwgMHhhNjg0LCAweDAyMDAsIDB4MDA0MCwKKwkweDNiZGYsIDB4NjgyYywgMHg3OGQyLCAweDY4MzAsIDB4NzhkNiwgMHhhNjg0LCAweDAxMDAsIDB4MDA0MCwKKwkweDNiZGQsIDB4NjgyYywgMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgzYmRkLCAweDc4ODgsIDB4YTA4NCwKKwkweDAwNDAsIDB4MDA0MCwgMHgzYmRkLCAweGE2YjUsIDB4ODAwMCwgMHgxMDc4LCAweDQ1YWQsIDB4N2U1YSwKKwkweDZlYjYsIDB4MDA3OCwgMHg0NWU0LCAweDEwNzgsIDB4MzhjNiwgMHgwMGMwLCAweDNjNmMsIDB4NzAyYywKKwkweDgwMDQsIDB4MDA0OCwgMHgzYmYxLCAweDIwMTksIDB4NGNmZCwgMHgxMDc4LCAweDIyNTUsIDB4NzAyZiwKKwkweDAwMDEsIDB4MjAxMSwgMHgwMDAxLCAweDIwMzEsIDB4MTAwMCwgMHg3ODliLCAweDAwMTgsIDB4NjgxNCwKKwkweGEwODQsIDB4MDAxZiwgMHhhMDg1LCAweDAwODAsIDB4NzhhYSwgMHg2OTFjLCAweGExODQsIDB4MDAwMiwKKwkweDAwNDAsIDB4M2MwYSwgMHhhNmI1LCAweDAwMDQsIDB4NzhhYiwgMHgwMDIwLCAweDY4MjgsIDB4NzhhYSwKKwkweGEyOTAsIDB4MDAwMiwgMHg2ODIwLCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDNjMTgsIDB4YTZiNSwKKwkweDA0MDAsIDB4Nzg5YiwgMHgwMDBlLCAweDY4MjQsIDB4ODAwNywgMHg3OGFhLCAweDAwNzgsIDB4M2MyNiwKKwkweDY4MWMsIDB4YTA4NCwgMHg4MDAwLCAweDAwYzAsIDB4M2MyNiwgMHhhNmI1LCAweDA4MDAsIDB4NjgyMCwKKwkweGEwODQsIDB4MDEwMCwgMHgwMDQwLCAweDNjMjYsIDB4YTZiNSwgMHg0MDAwLCAweDY4MWMsIDB4YTA4NCwKKwkweDAwYzAsIDB4ODAwMywgMHg4MDAzLCAweDgwMDcsIDB4YTA4MCwgMHgzYzcyLCAweDIwMDQsIDB4YTYzNSwKKwkweGE2ODQsIDB4MDEwMCwgMHgwMDQwLCAweDNjNDAsIDB4NjgyYywgMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwKKwkweDNjNDAsIDB4Nzg4OCwgMHhhMDg0LCAweDAwNDAsIDB4MDA0MCwgMHgzYzQwLCAweGE2YjUsIDB4ODAwMCwKKwkweDc4OWIsIDB4MDA3ZSwgMHg3ZWFlLCAweDZlYjYsIDB4NjgxNCwgMHg4MDA3LCAweDc4YWEsIDB4Nzg4MiwKKwkweDdhYWEsIDB4NzgzMCwgMHhhMDg0LCAweDAwYzAsIDB4MDBjMCwgMHgzYzZjLCAweDAwMTgsIDB4M2M2YywKKwkweDcwYjQsIDB4YTA4MCwgMHgwMGRkLCAweDc4MWEsIDB4MTA3OCwgMHgzOGRlLCAweGE2ODQsIDB4MDIwMCwKKwkweDAwNDAsIDB4M2M2MCwgMHg2ODJjLCAweDc4ZDIsIDB4NjgzMCwgMHg3OGQ2LCAweDEwNzgsIDB4NDVhZCwKKwkweDJkMDAsIDB4NzBhMiwgMHg3MDRhLCAweDY4MTAsIDB4NzBiZSwgMHg3MDAzLCAweDAwMDcsIDB4YWQ4MCwKKwkweDAwMGYsIDB4NzAzNiwgMHgwMDc4LCAweDI0MzgsIDB4MTA3OCwgMHgxYjQ1LCAweDEwNzgsIDB4MzhkZSwKKwkweDAwNzgsIDB4MjQzOCwgMHgwMDAwLCAweDAzMDAsIDB4MDIwMCwgMHgwMDAwLCAweDEwNzgsIDB4MjNjYSwKKwkweDIzMDAsIDB4MDA3OSwgMHgzYzdiLCAweDNjN2UsIDB4M2M3ZSwgMHgzYzgwLCAweDEwNzgsIDB4MjNjYSwKKwkweDEwNzgsIDB4NDViYywgMHg2OTI0LCAweGExODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMGEsIDB4MDA0MCwKKwkweDNjOTIsIDB4YTE4NCwgMHhmZjAwLCAweGEwODUsIDB4MDAwYSwgMHg2ODI2LCAweDEwNzgsIDB4MWI0NSwKKwkweDAwNzgsIDB4M2I2MCwgMHgyMDAxLCAweDAwMGEsIDB4MTA3OCwgMHg0NTRjLCAweDAwNzgsIDB4M2I2MCwKKwkweGEyODIsIDB4MDAwNSwgMHgwMDUwLCAweDNjOWUsIDB4MTA3OCwgMHgyM2NhLCAweDcwMDAsIDB4YTA4NCwKKwkweDAwMDcsIDB4MTBjMCwgMHgzOThhLCAweDEwNzgsIDB4MTkxYSwgMHgwMGMwLCAweDNjYmQsIDB4YTY4NCwKKwkweDAwMDQsIDB4MDA0MCwgMHgzY2FmLCAweDIwMDEsIDB4MjgwMCwgMHgwMDc4LCAweDNjYjEsIDB4MjAwMSwKKwkweDA4MDAsIDB4NzFiNCwgMHhhMTg4LCAweDAwOTEsIDB4Nzg5YiwgMHgwMDBlLCAweDc4YWEsIDB4MjAzMSwKKwkweDA0MDAsIDB4N2U1YSwgMHg3OTFhLCAweDAwNzgsIDB4MjQzOCwgMHg2ODA3LCAweDAxMDYsIDB4NjgwYiwKKwkweDAwMDAsIDB4Njg5ZiwgMHgwMDAwLCAweDY4MjcsIDB4MDAwMCwgMHhhMzg2LCAweDAwMDIsIDB4MDBjMCwKKwkweDNjZGUsIDB4YTI4NiwgMHgwMDAyLCAweDAwYzAsIDB4M2NkZSwgMHg3OGEwLCAweGEwMDUsIDB4MDBjMCwKKwkweDNjZGUsIDB4YTQ4NCwgMHg4MDAwLCAweDAwYzAsIDB4M2NkZSwgMHg3OGU0LCAweGEwODQsIDB4MDAwOCwKKwkweDAwNDAsIDB4M2NkZSwgMHhhNmI1LCAweDAwMDgsIDB4MjAxOSwgMHgwMDAwLCAweDEwNzgsIDB4NDBkMywKKwkweDJkMDAsIDB4NzBhMiwgMHg3MDRhLCAweDcwMDMsIDB4MDAwNywgMHg3MDM3LCAweDAwMDAsIDB4NjgyNCwKKwkweGEwODQsIDB4MDA4MCwgMHgwMDQwLCAweDNjZjAsIDB4MTA3OCwgMHg0MTgwLCAweDAwNzgsIDB4MjQzOCwKKwkweDIzMDAsIDB4MDA3OSwgMHgzY2YzLCAweDNjZjYsIDB4M2Q3NywgMHgzZDk2LCAweDIyMDAsIDB4MDA3OSwKKwkweDNjZjksIDB4M2NmZSwgMHgzZDBlLCAweDNkMzQsIDB4M2Q0MCwgMHgzZDYzLCAweDIwMjksIDB4MDAwMSwKKwkweGEwMjYsIDB4MjAxMSwgMHgwMDAwLCAweDEwNzgsIDB4NDI4ZCwgMHgwMDc5LCAweDNkMDcsIDB4M2QwYywKKwkweDI0MzgsIDB4M2I2MCwgMHgzZDBjLCAweDNkMGMsIDB4MTA3OCwgMHgyM2NhLCAweDc5OTAsIDB4YTE4YywKKwkweDAwMDcsIDB4MDBjMCwgMHgzZDE1LCAweDIwMDksIDB4MDAwOCwgMHgyMDExLCAweDAwMDEsIDB4YTY4NCwKKwkweDAwMDQsIDB4MDA0MCwgMHgzZDFkLCAweDIwMTEsIDB4MDAwMywgMHgyMjIwLCAweGExMmEsIDB4MjAxMSwKKwkweDAwMDEsIDB4MTA3OCwgMHg0MjhkLCAweDAwNzksIDB4M2QyNSwgMHgzZDJhLCAweDI0MzgsIDB4M2I2MCwKKwkweDNkMzIsIDB4M2QyYywgMHgwMDc4LCAweDQ1ZWEsIDB4NzBhYiwgMHgzZDMwLCAweDAwNzgsIDB4MjQzOCwKKwkweDAwNzgsIDB4M2QyYSwgMHgxMDc4LCAweDIzY2EsIDB4YTY4NCwgMHgwMDEwLCAweDAwNDAsIDB4M2QzZSwKKwkweDEwNzgsIDB4NDE0ZiwgMHgwMDQwLCAweDNkM2UsIDB4MDA3OCwgMHgyNDM4LCAweDAwNzgsIDB4NDFiYywKKwkweDYwMDAsIDB4YTA4NCwgMHgwMDAyLCAweDAwNDAsIDB4M2Q1ZCwgMHg3MGI0LCAweGEwODAsIDB4MDBjZCwKKwkweDc4MWEsIDB4MGQ3ZSwgMHgxMDc4LCAweDQ1YzUsIDB4MmQwMCwgMHg2ODJlLCAweDY4MjcsIDB4MDAwMCwKKwkweDEwNzgsIDB4M2FjMiwgMHgwZDdmLCAweDEwNzgsIDB4MTkzZCwgMHg3MDAzLCAweDAwMDAsIDB4NzAzNywKKwkweDAwMDAsIDB4NzA0YiwgMHgwMDAwLCAweDAwNzgsIDB4M2I2MCwgMHhhNjg0LCAweDAwMDQsIDB4MDBjMCwKKwkweDNkNjMsIDB4MDA3OCwgMHg0NWVhLCAweDYwMDAsIDB4YTA4NCwgMHgwMDA0LCAweDAwYzAsIDB4M2Q3NSwKKwkweDYwMDAsIDB4YTA4NCwgMHgwMDAxLCAweDAwNDAsIDB4M2Q3NSwgMHg3MGFiLCAweDNkNzUsIDB4MjAwMSwKKwkweDAwMDcsIDB4MTA3OCwgMHg0NTQ0LCAweDAwNzgsIDB4NDVmMCwgMHgwMDc4LCAweDQ1ZWEsIDB4MjIwMCwKKwkweDAwNzksIDB4M2Q3YSwgMHgzZDdmLCAweDNkN2YsIDB4M2Q3ZiwgMHgzZDgxLCAweDNkN2YsIDB4MTA3OCwKKwkweDIzY2EsIDB4NzBhNywgMHgzZDg1LCAweDAwNzgsIDB4NDVmNiwgMHgyMDExLCAweDAwMTgsIDB4MTA3OCwKKwkweDQyODcsIDB4MDA3OSwgMHgzZDhiLCAweDNkOTAsIDB4MjQzOCwgMHgzYjYwLCAweDNkOTIsIDB4M2Q5NCwKKwkweDEwNzgsIDB4MjNjYSwgMHgxMDc4LCAweDIzY2EsIDB4MTA3OCwgMHgyM2NhLCAweDIyMDAsIDB4MDA3OSwKKwkweDNkOTksIDB4M2Q5ZSwgMHgzZGEwLCAweDNkYTAsIDB4M2Q5ZSwgMHgzZDllLCAweDEwNzgsIDB4MjNjYSwKKwkweDc4ZTQsIDB4YTA4NCwgMHgwMDA4LCAweDAwNDAsIDB4M2RiNSwgMHg3MGE3LCAweDNkYTksIDB4MDA3OCwKKwkweDQ1ZjYsIDB4MjAxMSwgMHgwMDA0LCAweDEwNzgsIDB4NDI4NywgMHgwMDc5LCAweDNkYWYsIDB4M2RiNSwKKwkweDI0MzgsIDB4M2I2MCwgMHgzZGI1LCAweDNkYmYsIDB4M2RjMywgMHg3MGFiLCAweDNkYmQsIDB4MjAwMSwKKwkweDAwMDMsIDB4MTA3OCwgMHg0NTQ0LCAweDAwNzgsIDB4NDVmMCwgMHgwMDc4LCAweDQ1ZWEsIDB4NzBhYiwKKwkweDNkYjUsIDB4MDA3OCwgMHgyNDM4LCAweDcwYWIsIDB4M2RjNywgMHgwMDc4LCAweDI0MzgsIDB4MDA3OCwKKwkweDNkYmQsIDB4YTI4MiwgMHgwMDAzLCAweDAwNTAsIDB4M2RjZiwgMHgxMDc4LCAweDIzY2EsIDB4YTM4NiwKKwkweDAwMDIsIDB4MDBjMCwgMHgzZGU4LCAweGEyODYsIDB4MDAwMiwgMHgwMGMwLCAweDNkZWUsIDB4NzhhMCwKKwkweGEwMDUsIDB4MDBjMCwgMHgzZGVlLCAweGE0ODQsIDB4ODAwMCwgMHgwMGMwLCAweDNkZWUsIDB4NzhlNCwKKwkweGEwODQsIDB4MDAwOCwgMHgwMDQwLCAweDNkZTgsIDB4YTZiNSwgMHgwMDA4LCAweDIwMTksIDB4MDAwMCwKKwkweGE2ODQsIDB4MDAwOCwgMHgwMDQwLCAweDNkZWUsIDB4MTA3OCwgMHg0MTJjLCAweDY4MTAsIDB4NzBiZSwKKwkweDcwMDMsIDB4MDAwNywgMHgyMzAwLCAweDAwNzksIDB4M2RmNSwgMHgzZGY4LCAweDNlMjUsIDB4M2UyZCwKKwkweDIyMDAsIDB4MDA3OSwgMHgzZGZiLCAweDNlMDAsIDB4M2RmZSwgMHgzZTE5LCAweDEwNzgsIDB4MjNjYSwKKwkweDc5OTAsIDB4YTFhYywgMHgwMDA3LCAweGEwMjYsIDB4MjAxMSwgMHgwMDAxLCAweDEwNzgsIDB4NDI4ZCwKKwkweDAwNzksIDB4M2UwYSwgMHgzZTBmLCAweDI0MzgsIDB4M2I2MCwgMHgzZTE3LCAweDNlMTEsIDB4MDA3OCwKKwkweDQ1ZWEsIDB4NzBhYiwgMHgzZTE1LCAweDAwNzgsIDB4MjQzOCwgMHgwMDc4LCAweDNlMGYsIDB4MTA3OCwKKwkweDIzY2EsIDB4YTY4NCwgMHgwMDEwLCAweDAwNDAsIDB4M2UyMywgMHgxMDc4LCAweDQxNGYsIDB4MDA0MCwKKwkweDNlMjMsIDB4MDA3OCwgMHgyNDM4LCAweDAwNzgsIDB4NDFiYywgMHgyMjAwLCAweDAwNzksIDB4M2UyOCwKKwkweDNlMmIsIDB4M2UyYiwgMHgzZTJiLCAweDEwNzgsIDB4MjNjYSwgMHgyMjAwLCAweDAwNzksIDB4M2UzMCwKKwkweDNlMzMsIDB4M2UzNSwgMHgzZTM1LCAweDEwNzgsIDB4MjNjYSwgMHg3OGU0LCAweGEwODQsIDB4MDAwOCwKKwkweDAwNDAsIDB4M2U0YSwgMHg3MGE3LCAweDNlM2UsIDB4MDA3OCwgMHg0NWY2LCAweDIwMTEsIDB4MDAwNCwKKwkweDEwNzgsIDB4NDI4NywgMHgwMDc5LCAweDNlNDQsIDB4M2U0YSwgMHgyNDM4LCAweDNiNjAsIDB4M2U0YSwKKwkweDNlNTQsIDB4M2U1OCwgMHg3MGFiLCAweDNlNTIsIDB4MjAwMSwgMHgwMDAzLCAweDEwNzgsIDB4NDU0NCwKKwkweDAwNzgsIDB4NDVmMCwgMHgwMDc4LCAweDQ1ZWEsIDB4NzBhYiwgMHgzZTRhLCAweDAwNzgsIDB4MjQzOCwKKwkweDcwYWIsIDB4M2U1YywgMHgwMDc4LCAweDI0MzgsIDB4MDA3OCwgMHgzZTUyLCAweDIzMDAsIDB4MDA3OSwKKwkweDNlNjEsIDB4M2U2NiwgMHgzZTY4LCAweDNlNjQsIDB4MTA3OCwgMHgyM2NhLCAweDcwYTQsIDB4MDA3YSwKKwkweDcwYTQsIDB4MDA3YSwgMHhhMjgyLCAweDAwMDIsIDB4MDA1MCwgMHgzZTcwLCAweDEwNzgsIDB4MjNjYSwKKwkweGE2ODQsIDB4MDIwMCwgMHgwMDQwLCAweDNlN2EsIDB4MTA3OCwgMHg0NWI1LCAweDEwNzgsIDB4NDI2ZiwKKwkweDEwNzgsIDB4NDViYywgMHgyMzAwLCAweDAwNzksIDB4M2U3ZCwgMHgzZTgwLCAweDNlYTQsIDB4M2YwYSwKKwkweGEyODYsIDB4MDAwMSwgMHgwMDQwLCAweDNlODYsIDB4MTA3OCwgMHgyM2NhLCAweGE2ODQsIDB4MDIwMCwKKwkweDAwNDAsIDB4M2U4ZSwgMHgxMDc4LCAweDQ1YjUsIDB4MTA3OCwgMHg0NWJjLCAweDIwMDEsIDB4MDAwMSwKKwkweDEwNzgsIDB4NDU0YywgMHg3OGI4LCAweGEwODQsIDB4YzAwMSwgMHgwMDQwLCAweDNlYTAsIDB4Nzg0OCwKKwkweGEwODUsIDB4MDAwOCwgMHg3ODRhLCAweDc4NDgsIDB4YTA4NCwgMHgwMDA4LCAweDAwYzAsIDB4M2U5YiwKKwkweDcwMDMsIDB4MDAwMCwgMHgwMDc4LCAweDNiNjAsIDB4MjIwMCwgMHgwMDc5LCAweDNlYTcsIDB4M2VhOSwKKwkweDNlZGEsIDB4NzBhNywgMHgzZWFkLCAweDAwNzgsIDB4NDVmNiwgMHgyMDExLCAweDAwMGQsIDB4MTA3OCwKKwkweDQyODcsIDB4MDA3OSwgMHgzZWIzLCAweDNlYmEsIDB4MjQzOCwgMHgzYjYwLCAweDNlYzIsIDB4M2VjYSwKKwkweDNlZDAsIDB4M2VkMiwgMHhhNmI0LCAweDAwZmYsIDB4YTZiNSwgMHgwNDAwLCAweDZlYjYsIDB4N2U1YSwKKwkweDAwNzgsIDB4NDVlNCwgMHhhNmI0LCAweDAwZmYsIDB4YTZiNSwgMHgwNDAwLCAweDZlYjYsIDB4N2U1YSwKKwkweDAwNzgsIDB4NDVlNCwgMHg3MGFiLCAweDNlY2UsIDB4MDA3OCwgMHgyNDM4LCAweDAwNzgsIDB4M2ViYSwKKwkweDEwNzgsIDB4MjNjYSwgMHg3MGFiLCAweDNlZDYsIDB4MDA3OCwgMHgyNDM4LCAweDEwNzgsIDB4NDVmYywKKwkweDAwNzgsIDB4MjQzOCwgMHg3MGE3LCAweDNlZGUsIDB4MDA3OCwgMHg0NWY2LCAweDIwMTEsIDB4MDAxMiwKKwkweDEwNzgsIDB4NDI4NywgMHgwMDc5LCAweDNlZTQsIDB4M2VlYSwgMHgyNDM4LCAweDNiNjAsIDB4M2VmNiwKKwkweDNlZmUsIDB4M2YwNCwgMHhhNmI0LCAweDAwZmYsIDB4YTZiNSwgMHgwNDAwLCAweDZlYjYsIDB4N2U1YSwKKwkweDcwYjQsIDB4YTA4MCwgMHgwMGE1LCAweDc4MWEsIDB4MDA3OCwgMHgyNDM4LCAweGE2YjQsIDB4MDBmZiwKKwkweGE2YjUsIDB4MDQwMCwgMHg2ZWI2LCAweDdlNWEsIDB4MDA3OCwgMHg0NWU0LCAweDcwYWIsIDB4M2YwMiwKKwkweDAwNzgsIDB4MjQzOCwgMHgwMDc4LCAweDNlZWEsIDB4NzBhYiwgMHgzZjA4LCAweDAwNzgsIDB4MjQzOCwKKwkweDAwNzgsIDB4M2VmNiwgMHhhMjg2LCAweDAwMDEsIDB4MDA0MCwgMHgzZjEwLCAweDEwNzgsIDB4MjNjYSwKKwkweDcwYTcsIDB4M2YxNCwgMHgwMDc4LCAweDQ1ZjYsIDB4MjAxMSwgMHgwMDE1LCAweDEwNzgsIDB4NDI4NywKKwkweDAwNzksIDB4M2YxYSwgMHgzZjFmLCAweDI0MzgsIDB4M2I2MCwgMHgzZjJkLCAweDNmMzksIDB4YTZiNCwKKwkweDAwZmYsIDB4YTZiNSwgMHgwNDAwLCAweDZlYjYsIDB4N2U1YSwgMHg3ODNiLCAweDEzMDEsIDB4NzBiNCwKKwkweGEwODAsIDB4MDBiNSwgMHg3ODFhLCAweDAwNzgsIDB4MjQzOCwgMHhhNmI0LCAweDAwZmYsIDB4YTZiNSwKKwkweDA0MDAsIDB4NmViNiwgMHg3ZTVhLCAweDcwYjQsIDB4YTA4MCwgMHgwMGE1LCAweDc4MWEsIDB4MDA3OCwKKwkweDI0MzgsIDB4NzBhYiwgMHgzZjNkLCAweDAwNzgsIDB4MjQzOCwgMHgwMDc4LCAweDNmMWYsIDB4YTI4MiwKKwkweDAwMDMsIDB4MDA1MCwgMHgzZjQ1LCAweDEwNzgsIDB4MjNjYSwgMHgyMzAwLCAweDAwNzksIDB4M2Y0OCwKKwkweDNmNGIsIDB4M2Y4MiwgMHgzZmRkLCAweGEyODYsIDB4MDAwMSwgMHgwMDQwLCAweDNmNTEsIDB4MTA3OCwKKwkweDIzY2EsIDB4NjgwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4M2Y1ZSwKKwkweDEwNzgsIDB4M2FjMiwgMHg3MDAzLCAweDAwMDAsIDB4MDA3OCwgMHgzYjYwLCAweDY4M2IsIDB4MDAwMCwKKwkweDY4MzcsIDB4MDAwMCwgMHhhNjg0LCAweDAyMDAsIDB4MDA0MCwgMHgzZjZjLCAweDEwNzgsIDB4NDViNSwKKwkweDEwNzgsIDB4NDI2ZiwgMHgxMDc4LCAweDQ1YmMsIDB4MjAwMSwgMHgwMDAxLCAweDEwNzgsIDB4NDU0YywKKwkweDc4YjgsIDB4YTA4NCwgMHhjMDAxLCAweDAwNDAsIDB4M2Y3ZSwgMHg3ODQ4LCAweGEwODUsIDB4MDAwOCwKKwkweDc4NGEsIDB4Nzg0OCwgMHhhMDg0LCAweDAwMDgsIDB4MDBjMCwgMHgzZjc5LCAweDcwMDMsIDB4MDAwMCwKKwkweDAwNzgsIDB4M2I2MCwgMHgyMjAwLCAweDAwNzksIDB4M2Y4NSwgMHgzZjg3LCAweDNmYjgsIDB4NzBhNywKKwkweDNmOGIsIDB4MDA3OCwgMHg0NWY2LCAweDIwMTEsIDB4MDAwZCwgMHgxMDc4LCAweDQyODcsIDB4MDA3OSwKKwkweDNmOTEsIDB4M2Y5OCwgMHgyNDM4LCAweDNiNjAsIDB4M2ZhMCwgMHgzZmE4LCAweDNmYWUsIDB4M2ZiMCwKKwkweGE2YjQsIDB4MDBmZiwgMHhhNmI1LCAweDA4MDAsIDB4NmViNiwgMHg3ZTVhLCAweDAwNzgsIDB4NDVlNCwKKwkweGE2YjQsIDB4MDBmZiwgMHhhNmI1LCAweDA4MDAsIDB4NmViNiwgMHg3ZTVhLCAweDAwNzgsIDB4NDVlNCwKKwkweDcwYWIsIDB4M2ZhYywgMHgwMDc4LCAweDI0MzgsIDB4MDA3OCwgMHgzZjk4LCAweDEwNzgsIDB4MjNjYSwKKwkweDcwYWIsIDB4M2ZiNCwgMHgwMDc4LCAweDI0MzgsIDB4MTA3OCwgMHg0NWZjLCAweDAwNzgsIDB4MjQzOCwKKwkweDcwYTcsIDB4M2ZiYywgMHgwMDc4LCAweDQ1ZjYsIDB4MjAxMSwgMHgwMDA1LCAweDEwNzgsIDB4NDI4NywKKwkweDAwNzksIDB4M2ZjMiwgMHgzZmM3LCAweDI0MzgsIDB4M2I2MCwgMHgzZmNmLCAweDNmZDcsIDB4YTZiNCwKKwkweDAwZmYsIDB4YTZiNSwgMHgwODAwLCAweDZlYjYsIDB4N2U1YSwgMHgwMDc4LCAweDQ1ZTQsIDB4YTZiNCwKKwkweDAwZmYsIDB4YTZiNSwgMHgwODAwLCAweDZlYjYsIDB4N2U1YSwgMHgwMDc4LCAweDQ1ZTQsIDB4NzBhYiwKKwkweDNmZGIsIDB4MDA3OCwgMHgyNDM4LCAweDAwNzgsIDB4M2ZjNywgMHhhMjg2LCAweDAwMDEsIDB4MDA0MCwKKwkweDNmZTMsIDB4MTA3OCwgMHgyM2NhLCAweDcwYTcsIDB4M2ZlNywgMHgwMDc4LCAweDQ1ZjYsIDB4MjAxMSwKKwkweDAwMDYsIDB4MTA3OCwgMHg0Mjg3LCAweDAwNzksIDB4M2ZlZCwgMHgzZmYyLCAweDI0MzgsIDB4M2I2MCwKKwkweDNmZjgsIDB4NDAwMiwgMHhhNmI1LCAweDA4MDAsIDB4NmViNiwgMHg3ZTVhLCAweDAwNzgsIDB4NDVlNCwKKwkweGE2YjQsIDB4MDBmZiwgMHhhNmI1LCAweDA4MDAsIDB4NmViNiwgMHhhNmI1LCAweDQwMDAsIDB4N2U1YSwKKwkweDAwNzgsIDB4NDVlNCwgMHg3MGFiLCAweDQwMDYsIDB4MDA3OCwgMHgyNDM4LCAweDAwNzgsIDB4M2ZmMiwKKwkweDIzMDAsIDB4MDA3OSwgMHg0MDBiLCAweDQwMTAsIDB4NDAwZSwgMHg0MDBlLCAweDEwNzgsIDB4MjNjYSwKKwkweDEwNzgsIDB4MjNjYSwgMHgyMzAwLCAweDcxYTgsIDB4YTAwNSwgMHgwMTdhLCAweDY4MTAsIDB4NzBiZSwKKwkweGEyODIsIDB4MDAwMywgMHgwMDUwLCAweDQwMWUsIDB4MTA3OCwgMHgyM2NhLCAweDIzMDAsIDB4MDA3OSwKKwkweDQwMjEsIDB4NDAyNCwgMHg0MDM3LCAweDQwNTksIDB4ODJmZiwgMHgwMGMwLCAweDQwMjksIDB4MTA3OCwKKwkweDIzY2EsIDB4YTY4NCwgMHgwMjAwLCAweDAwNDAsIDB4NDAzMSwgMHgxMDc4LCAweDQ1YjUsIDB4MTA3OCwKKwkweDQ1YmMsIDB4MjAwMSwgMHgwMDAxLCAweDEwNzgsIDB4NDU0YywgMHgwMDc4LCAweDI0MzgsIDB4YTI5NiwKKwkweDAwMDIsIDB4MDA0MCwgMHg0MDQwLCAweDgyZmYsIDB4MDA0MCwgMHg0MDQwLCAweDEwNzgsIDB4MjNjYSwKKwkweDcwYTcsIDB4NDA0NCwgMHgwMDc4LCAweDQ1ZjYsIDB4MjAxMSwgMHgwMDE4LCAweDEwNzgsIDB4NDI4NywKKwkweDAwNzksIDB4NDA0YSwgMHg0MDRmLCAweDI0MzgsIDB4M2I2MCwgMHg0MDUxLCAweDQwNTMsIDB4MDA3OCwKKwkweDQ1ZTQsIDB4MDA3OCwgMHg0NWU0LCAweDcwYWIsIDB4NDA1NywgMHgwMDc4LCAweDI0MzgsIDB4MDA3OCwKKwkweDQwNGYsIDB4MjIwMCwgMHgwMDc5LCAweDQwNWMsIDB4NDA1ZSwgMHg0MDc3LCAweDcwYTcsIDB4NDA2MiwKKwkweDAwNzgsIDB4NDVmNiwgMHgyMDExLCAweDAwMTcsIDB4MTA3OCwgMHg0Mjg3LCAweDAwNzksIDB4NDA2OCwKKwkweDQwNmQsIDB4MjQzOCwgMHgzYjYwLCAweDQwNmYsIDB4NDA3MSwgMHgwMDc4LCAweDQ1ZTQsIDB4MDA3OCwKKwkweDQ1ZTQsIDB4NzBhYiwgMHg0MDc1LCAweDAwNzgsIDB4MjQzOCwgMHgwMDc4LCAweDQwNmQsIDB4YTQ4NCwKKwkweDgwMDAsIDB4MDBjMCwgMHg0MGMxLCAweGE2ODQsIDB4MDEwMCwgMHgwMDQwLCAweDQwOGIsIDB4MTA3OCwKKwkweDQ1YjUsIDB4MTA3OCwgMHg0MjZmLCAweDEwNzgsIDB4NDViYywgMHg3ODQ4LCAweGEwODUsIDB4MDAwYywKKwkweDc4NGEsIDB4MDA3OCwgMHg0MDhmLCAweDc4ZDgsIDB4NzhkMiwgMHg3OGRjLCAweDc4ZDYsIDB4YTZiNCwKKwkweGVmZmYsIDB4N2U1YSwgMHg3MGE3LCAweDQwOTYsIDB4MDA3OCwgMHg0NWY2LCAweDIwMTEsIDB4MDAwZCwKKwkweDEwNzgsIDB4NDI4NywgMHgwMDc5LCAweDQwOWMsIDB4NDBhMywgMHgyNDM4LCAweDNiNjAsIDB4NDBhMywKKwkweDQwYjEsIDB4NDBiNywgMHg0MGI5LCAweGE2ODQsIDB4MDEwMCwgMHgwMDQwLCAweDQwYWYsIDB4MTA3OCwKKwkweDQ1NzMsIDB4NjgyYywgMHg3OGQyLCAweDY4MzAsIDB4NzhkNiwgMHgxMDc4LCAweDQ1YWQsIDB4MDA3OCwKKwkweDQ1ZTQsIDB4NzBhYiwgMHg0MGI1LCAweDAwNzgsIDB4MjQzOCwgMHgwMDc4LCAweDQwYTMsIDB4MTA3OCwKKwkweDIzY2EsIDB4NzBhYiwgMHg0MGJkLCAweDAwNzgsIDB4MjQzOCwgMHgxMDc4LCAweDQ1ZmMsIDB4MDA3OCwKKwkweDI0MzgsIDB4MTA3OCwgMHg0NWJjLCAweDcwYWIsIDB4NDBjYiwgMHgyMDAxLCAweDAwMDMsIDB4MTA3OCwKKwkweDQ1NDQsIDB4MDA3OCwgMHg0NWYwLCAweDEwNzgsIDB4NDVhZCwgMHg2ODJjLCAweDc4ZDIsIDB4NjgzMCwKKwkweDc4ZDYsIDB4MDA3OCwgMHg0NWU0LCAweDcwYjgsIDB4NjgxMiwgMHg3MGJlLCAweDgwMDAsIDB4NzBiYSwKKwkweDY4MWIsIDB4MDAwMCwgMHhhNjg0LCAweDAwMDgsIDB4MDA0MCwgMHg0MGY2LCAweDE1N2UsIDB4MTM3ZSwKKwkweDE0N2UsIDB4Nzg5MCwgMHg4MDA0LCAweDgwMDQsIDB4ODAwNCwgMHg4MDA0LCAweGEwODQsIDB4MDAwZiwKKwkweDY4MWEsIDB4ODBhYywgMHg3ODliLCAweDAwMDAsIDB4YWY4MCwgMHgwMDJiLCAweDIwOTgsIDB4YWQ4MCwKKwkweDAwMGIsIDB4MjBhMCwgMHg1M2E1LCAweDE0N2YsIDB4MTM3ZiwgMHgxNTdmLCAweGE2YzQsIDB4MGYwMCwKKwkweGE2ODQsIDB4MDAwMiwgMHgwMGMwLCAweDQxMDIsIDB4NjkyYywgMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwKKwkweDAwNzgsIDB4NDEwZiwgMHg3ODliLCAweDAwMTAsIDB4NzlhYywgMHgwMDc4LCAweDQxMGYsIDB4MDE3ZSwKKwkweDIwMDksIDB4MDAwNSwgMHgyMDAxLCAweDNkMDAsIDB4MTA3OCwgMHg0NTdlLCAweDAxN2YsIDB4YTE4NCwKKwkweDAwMWYsIDB4YTgwNSwgMHg2ODE2LCAweDEwNzgsIDB4M2IzMywgMHg2OGJlLCAweGE2ODQsIDB4MDAwNCwKKwkweDAwNDAsIDB4NDEyMCwgMHhhMThjLCAweGZmMDAsIDB4NzhhOCwgMHhhMDg0LCAweDAwZmYsIDB4YTEwNSwKKwkweDY4MmEsIDB4YTZiNCwgMHgwMGZmLCAweDYwMDAsIDB4YTA4NCwgMHgwMDA4LCAweDAwNDAsIDB4NDEyYSwKKwkweGE2YjUsIDB4NDAwMCwgMHg2ZWI2LCAweDAwN2MsIDB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4NjkxOCwKKwkweDc4OTAsIDB4ODAwNCwgMHg4MDA0LCAweDgwMDQsIDB4ODAwNCwgMHhhMDg0LCAweDAwMGYsIDB4MDA3ZSwKKwkweGExMDAsIDB4NjgxYSwgMHgwMDdmLCAweDgwMDAsIDB4ODAwNCwgMHgwMDQwLCAweDQxNGIsIDB4MjBhOCwKKwkweDgxMDQsIDB4YTA4MCwgMHgwMDBiLCAweGFkMDAsIDB4MjBhMCwgMHg3ODliLCAweDAwMDAsIDB4YWY4MCwKKwkweDAwMmIsIDB4MjA5OCwgMHg1M2E1LCAweDE0N2YsIDB4MTM3ZiwgMHgxNTdmLCAweDAwN2MsIDB4NjgyYywKKwkweGEwODQsIDB4MDAyMCwgMHgwMGMwLCAweDQxNTcsIDB4NjIwYywgMHgwMDc4LCAweDQxNTgsIDB4NjIxMCwKKwkweDZiMTgsIDB4MjMwMCwgMHhhMjAyLCAweDAwNDAsIDB4NDE3OCwgMHgyMDE4LCAweGEzODIsIDB4MDAwZSwKKwkweDAwNDgsIDB4NDE2OCwgMHgwMDQwLCAweDQxNjgsIDB4MjAxOSwgMHgwMDBlLCAweDAwNzgsIDB4NDE2YywKKwkweDc4NTgsIDB4YTA4NCwgMHhmZmVmLCAweDc4NWEsIDB4NzgzYiwgMHgxYjAxLCAweDc4OTMsIDB4MDAwMCwKKwkweDdiYTIsIDB4NzBiNCwgMHhhMDgwLCAweDAwOGUsIDB4NzgxYSwgMHhhMDg1LCAweDAwMDEsIDB4MDA3YywKKwkweDc4NTgsIDB4YTA4NCwgMHhmZmVmLCAweDc4NWEsIDB4Nzg5MywgMHgwMDAwLCAweGEwMDYsIDB4MDA3YywKKwkweDY5MDQsIDB4YTE4YywgMHgwMGZmLCAweGExOTYsIDB4MDAwNywgMHgwMDQwLCAweDQxOGQsIDB4YTE5NiwKKwkweDAwMGYsIDB4MDA0MCwgMHg0MThkLCAweDY4MDcsIDB4MDExNywgMHg2OTE0LCAweDEwNzgsIDB4M2IzMywKKwkweDYxMDAsIDB4ODEwNCwgMHgwMGM4LCAweDQxYTgsIDB4NjAxYywgMHhhMDA1LCAweDAwNDAsIDB4NDE5YywKKwkweDIwMDEsIDB4MDgwMCwgMHgwMDc4LCAweDQxYWEsIDB4MGQ3ZSwgMHg2ODI0LCAweDAwN2UsIDB4MTA3OCwKKwkweDQ1YzUsIDB4MDA3ZiwgMHg2ODI2LCAweDJkMDAsIDB4NjgyZSwgMHgxMDc4LCAweDNhYzIsIDB4MGQ3ZiwKKwkweDIwMDEsIDB4MDIwMCwgMHg2ODI2LCAweDgwMDcsIDB4Nzg5YiwgMHgwMDBlLCAweDc4YWEsIDB4NjgyMCwKKwkweGEwODUsIDB4ODAwMCwgMHg2ODIyLCAweDIwMzEsIDB4MDQwMCwgMHg2ZWI2LCAweDdlNWEsIDB4NzFiNCwKKwkweGExODgsIDB4MDA5MSwgMHg3OTFhLCAweDAwN2MsIDB4YTZjNCwgMHgwZjAwLCAweGE2ODQsIDB4MDAwMiwKKwkweDAwYzAsIDB4NDFjZiwgMHg2OTJjLCAweDgxMGQsIDB4ODEwZCwgMHg4MTBkLCAweGExODQsIDB4MDAxZiwKKwkweGE4MDUsIDB4NjgxNiwgMHgxMDc4LCAweDNiMzMsIDB4NjhiZSwgMHgwMDc4LCAweDQxZDIsIDB4NjkxNCwKKwkweDEwNzgsIDB4M2IzMywgMHg2MTAwLCAweDgxMDQsIDB4MDBjOCwgMHg0MjFjLCAweGExODQsIDB4MDMwMCwKKwkweDAwNDAsIDB4NDFkZSwgMHg2ODA3LCAweDAxMTcsIDB4MDA3OCwgMHg0MWZjLCAweDYwMDQsIDB4YTAwNSwKKwkweDAwYzAsIDB4NDIwNSwgMHg2ODA3LCAweDAxMTcsIDB4NjAxYywgMHhhMDA1LCAweDAwYzAsIDB4NDFmMiwKKwkweDBkN2UsIDB4MTA3OCwgMHg0NWM1LCAweDY4MjcsIDB4MDAzNCwgMHgyZDAwLCAweDY4MmUsIDB4MTA3OCwKKwkweDNhYzIsIDB4MGQ3ZiwgMHhhNjg0LCAweDAwMDQsIDB4MDA0MCwgMHg0MWZjLCAweDIwMzEsIDB4MDQwMCwKKwkweDIwMDEsIDB4MjgwMCwgMHgwMDc4LCAweDQyMDAsIDB4MjAzMSwgMHgwNDAwLCAweDIwMDEsIDB4MDgwMCwKKwkweDcxYjQsIDB4YTE4OCwgMHgwMDkxLCAweDAwNzgsIDB4NDI0YSwgMHg2MDE4LCAweGEwMDUsIDB4MDBjMCwKKwkweDQxZjIsIDB4NjAxYywgMHhhMDA1LCAweDAwYzAsIDB4NDFmMiwgMHg2ODlmLCAweDAwMDAsIDB4NjgyNywKKwkweDAwM2QsIDB4YTY4NCwgMHgwMDAxLCAweDAwNDAsIDB4NDI1OCwgMHhhNmI1LCAweDA4MDAsIDB4NzFiNCwKKwkweGExODgsIDB4MDBhZSwgMHgwMDc4LCAweDQyNTMsIDB4NjgwNywgMHgwMTE3LCAweDIwMzEsIDB4MDQwMCwKKwkweDY5MmMsIDB4YTE4YywgMHgwMGZmLCAweGExODYsIDB4MDAxMiwgMHgwMGMwLCAweDQyMmQsIDB4MjAwMSwKKwkweDQyNjUsIDB4MjAwOSwgMHgwMDAxLCAweDAwNzgsIDB4NDIzZSwgMHhhMTg2LCAweDAwMDMsIDB4MDBjMCwKKwkweDQyMzcsIDB4MjAwMSwgMHg0MjY2LCAweDIwMDksIDB4MDAxMiwgMHgwMDc4LCAweDQyM2UsIDB4MjAwMSwKKwkweDAyMDAsIDB4NzFiNCwgMHhhMTg4LCAweDAwOTEsIDB4MDA3OCwgMHg0MjRhLCAweDEwNzgsIDB4NDU5OCwKKwkweDc4YTMsIDB4MDAwMCwgMHg2ODFjLCAweGEwODUsIDB4MDA0MCwgMHg2ODFlLCAweDcxYjQsIDB4YTE4OCwKKwkweDAwZGEsIDB4YTAwNiwgMHg2ODI2LCAweDgwMDcsIDB4Nzg5YiwgMHgwMDBlLCAweDc4YWEsIDB4NjgyMCwKKwkweGEwODUsIDB4ODAwMCwgMHg2ODIyLCAweDZlYjYsIDB4N2U1YSwgMHg3OTFhLCAweDAwNzgsIDB4MjQzOCwKKwkweDZlYjYsIDB4MTA3OCwgMHgzYWMyLCAweDY4MTAsIDB4NzBiZSwgMHg3MDAzLCAweDAwMDcsIDB4NzBhMywKKwkweDAwMDAsIDB4NzA0YiwgMHgwMDAwLCAweDAwNzgsIDB4MjQzOCwgMHgwMDIzLCAweDAwNzAsIDB4MDAwNSwKKwkweDAwMDAsIDB4MGEwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAyNSwgMHgwMDAwLCAweDAwMDAsIDB4NjgzYiwKKwkweDAwMDAsIDB4NjgzNywgMHgwMDAwLCAweGE2ODQsIDB4MDIwMCwgMHgwMDQwLCAweDQyODYsIDB4NzhiOCwKKwkweGEwOGMsIDB4MDAxZiwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHg0MjdmLCAweDgxMDgsIDB4NzhkOCwKKwkweGExMDAsIDB4NjgzNiwgMHg3OGRjLCAweGEwODEsIDB4MDAwMCwgMHg2ODNhLCAweDAwN2MsIDB4Nzk5MCwKKwkweDgxMGYsIDB4YTVhYywgMHgwMDA3LCAweDIwMjEsIDB4MDAwMCwgMHhhNDgwLCAweDAwMTAsIDB4Nzg5YSwKKwkweDc5YTgsIDB4YTE4YywgMHgwMGZmLCAweGExODQsIDB4MDA4MCwgMHgwMGMwLCAweDQyYjUsIDB4YTE4MiwKKwkweDAwMjAsIDB4MDBjOCwgMHg0MmNmLCAweGExODIsIDB4MDAxMiwgMHgwMGM4LCAweDQ1MzYsIDB4MjEwMCwKKwkweDEwNzksIDB4NDJhMywgMHgwMDdjLCAweDQ1MzYsIDB4NDQ3ZSwgMHg0NTM2LCAweDQ1MzYsIDB4NDJkYywKKwkweDQyZGYsIDB4NDMxOSwgMHg0MzRmLCAweDQzODEsIDB4NDM4NCwgMHg0NTM2LCAweDQ1MzYsIDB4NDMzYSwKKwkweDQzYTgsIDB4NDNlMiwgMHg0NTM2LCAweDQ1MzYsIDB4NDQwOSwgMHhhMThjLCAweDAwMWYsIDB4NjgxNCwKKwkweGEwODQsIDB4MDAxZiwgMHhhMTA2LCAweDAwNDAsIDB4NDJjYywgMHg3MGI0LCAweGEwODAsIDB4MDBjZCwKKwkweDc4MWEsIDB4MjAwMSwgMHgwMDE0LCAweDEwNzgsIDB4NDU0YywgMHgxMDc4LCAweDQ1YmMsIDB4NzAwMywKKwkweDAwMDAsIDB4MjAwMSwgMHgwMDAyLCAweDAwN2MsIDB4MjAwMSwgMHgwMDAwLCAweDAwN2MsIDB4YTE4MiwKKwkweDAwMjQsIDB4MDBjOCwgMHg0NTM2LCAweGExODQsIDB4MDAwMywgMHgxMDc5LCAweDQyYTMsIDB4MDA3YywKKwkweDQ1MzYsIDB4NDUzNiwgMHg0NTM2LCAweDQ1MzYsIDB4MTA3OCwgMHg0NTM2LCAweDAwN2MsIDB4MjIwMCwKKwkweDAwNzksIDB4NDJlMiwgMHg0NDBjLCAweDQ0MGMsIDB4NDMwNiwgMHg0MzA2LCAweDQzMDYsIDB4NDMwNiwKKwkweDQzMDYsIDB4NDMwNiwgMHg0MzA2LCAweDQzMDYsIDB4NDMwNCwgMHg0MzA2LCAweDQyZmIsIDB4NDMwNiwKKwkweDQzMDYsIDB4NDMwNiwgMHg0MzA2LCAweDQzMDYsIDB4NDMwZSwgMHg0MzExLCAweDQ0MGMsIDB4NDMxMSwKKwkweDQzMDYsIDB4NDMwNiwgMHg0MzA2LCAweDBjN2UsIDB4MDc3ZSwgMHg2ZjE0LCAweDEwNzgsIDB4MzZiMCwKKwkweDA3N2YsIDB4MGM3ZiwgMHgwMDc4LCAweDQzMDYsIDB4MTA3OCwgMHg0NGQxLCAweDY4MjcsIDB4MDJiMywKKwkweDIwMDksIDB4MDAwYiwgMHgyMDAxLCAweDQ4MDAsIDB4MDA3OCwgMHg0NDQwLCAweDEwNzgsIDB4NDUyYiwKKwkweDAwN2MsIDB4NjgyNywgMHgwMDkzLCAweDIwMDksIDB4MDAwYiwgMHgyMDAxLCAweDQ4MDAsIDB4MDA3OCwKKwkweDQ0MjgsIDB4MmQ1OCwgMHg2ODA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwKKwkweDQzMjMsIDB4NjgwNywgMHgwMTE3LCAweDY4MjcsIDB4MDAwMiwgMHgxMDc4LCAweDQ1YzUsIDB4NjgyNywKKwkweDAwMzYsIDB4NjkzMiwgMHgyZDAwLCAweDY4MmUsIDB4MGQ3ZSwgMHgxMDc4LCAweDNhOTIsIDB4MTA3OCwKKwkweDQ0NjYsIDB4MmI2OCwgMHgxMDc4LCAweDNhYzIsIDB4MGQ3ZiwgMHgxMDc4LCAweDNhYzIsIDB4MjAwMSwKKwkweDAwMDIsIDB4MDA3YywgMHgxMDc4LCAweDQ0NjYsIDB4MjAwMSwgMHgwMDE3LCAweDEwNzgsIDB4NDU0YywKKwkweDcwYTMsIDB4MDAwMCwgMHgyMDA5LCAweDUwMzgsIDB4MjAwYiwgMHgwMDA2LCAweDcwYWYsIDB4MDAxNywKKwkweDIwMDksIDB4MDIwMCwgMHgxMDc4LCAweDM5ZDIsIDB4MjAwMSwgMHgwMDAxLCAweDAwN2MsIDB4MjIwMCwKKwkweDAwNzksIDB4NDM1MiwgMHg0NDBjLCAweDQ0M2QsIDB4NDQzZCwgMHg0NDNkLCAweDQzNzMsIDB4NDQ0ZCwKKwkweDQzNzksIDB4NDQ0ZCwgMHg0NDRkLCAweDQ0NTAsIDB4NDQ1MCwgMHg0NDU1LCAweDQ0NTUsIDB4NDM2YiwKKwkweDQzNmIsIDB4NDQzZCwgMHg0NDNkLCAweDQ0NGQsIDB4NDQzZCwgMHg0Mzc5LCAweDQ0MGMsIDB4NDM3OSwKKwkweDQzNzksIDB4NDM3OSwgMHg0Mzc5LCAweDY4MjcsIDB4MDA4NCwgMHgyMDA5LCAweDAwMGIsIDB4MjAwMSwKKwkweDQzMDAsIDB4MDA3OCwgMHg0NDVmLCAweDIwMDksIDB4MDAwYiwgMHgyMDAxLCAweDQzMDAsIDB4MDA3OCwKKwkweDQ0NDAsIDB4NjgyNywgMHgwMDkzLCAweDIwMDksIDB4MDAwYiwgMHgyMDAxLCAweDQzMDAsIDB4MDA3OCwKKwkweDQ0MjgsIDB4MjAwMSwgMHgwMDAwLCAweDAwN2MsIDB4MjIwMCwgMHgwMDc5LCAweDQzODcsIDB4NDQwYywKKwkweDQzYTAsIDB4NDNhMCwgMHg0M2EwLCAweDQzYTAsIDB4NDQ0ZCwgMHg0NDRkLCAweDQ0NGQsIDB4NDQ0ZCwKKwkweDQ0NGQsIDB4NDQ0ZCwgMHg0NDRkLCAweDQ0NGQsIDB4NDNhMCwgMHg0M2EwLCAweDQzYTAsIDB4NDNhMCwKKwkweDQ0NGQsIDB4NDNhMCwgMHg0M2EwLCAweDQ0NGQsIDB4NDQ0ZCwgMHg0NDRkLCAweDQ0NGQsIDB4NDQwYywKKwkweDY4MjcsIDB4MDA5MywgMHgyMDA5LCAweDAwMGIsIDB4MjAwMSwgMHg0MzAwLCAweDAwNzgsIDB4NDQyOCwKKwkweGE2ODQsIDB4MDAwNCwgMHgwMGMwLCAweDQzYmMsIDB4NjgwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwKKwkweDAwMDYsIDB4MDBjMCwgMHg0NTM2LCAweDEwNzgsIDB4NDQ2NiwgMHg2ODA3LCAweDAxMTcsIDB4MTA3OCwKKwkweDNhYzIsIDB4MjAwMSwgMHgwMDAyLCAweDAwN2MsIDB4NjAwMCwgMHhhMDg0LCAweDAwMDQsIDB4MDA0MCwKKwkweDQ1MzYsIDB4MmQ1OCwgMHg2ODA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwKKwkweDQzY2IsIDB4NjgwNywgMHgwMTE3LCAweDY4MjcsIDB4MDAwMiwgMHgxMDc4LCAweDQ1YzUsIDB4NjgyNywKKwkweDAwMzYsIDB4NjkzMiwgMHgyZDAwLCAweDY4MmUsIDB4MGQ3ZSwgMHgxMDc4LCAweDNhYTEsIDB4MTA3OCwKKwkweDQ0NjYsIDB4MmI2OCwgMHgxMDc4LCAweDNhYzIsIDB4MGQ3ZiwgMHgxMDc4LCAweDNhYzIsIDB4MjAwMSwKKwkweDAwMDIsIDB4MDA3YywgMHg2MDAwLCAweGEwODQsIDB4MDAwNCwgMHgwMDQwLCAweDQ1MzYsIDB4MmQ1OCwKKwkweDZhMDQsIDB4YTI5NCwgMHgwMGZmLCAweGEyODYsIDB4MDAwNiwgMHgwMGMwLCAweDQzZjEsIDB4NjgwNywKKwkweDAxMTcsIDB4NjgyNywgMHgwMDAyLCAweDJkNTgsIDB4MTA3OCwgMHg0NWM1LCAweDY4MjcsIDB4MDAzNiwKKwkweDY5MzIsIDB4MmQwMCwgMHg2ODJlLCAweDBkN2UsIDB4MTA3OCwgMHgzYWIxLCAweDEwNzgsIDB4NDQ2NiwKKwkweDJiNjgsIDB4MTA3OCwgMHgzYWMyLCAweDBkN2YsIDB4MTA3OCwgMHgzYWMyLCAweDIwMDEsIDB4MDAwMiwKKwkweDAwN2MsIDB4MTA3OCwgMHg0NTM2LCAweDAwN2MsIDB4NzBiNCwgMHhhMDgwLCAweDAwY2QsIDB4NzgxYSwKKwkweDIwMDEsIDB4MDAwMSwgMHgxMDc4LCAweDQ1NGMsIDB4MTA3OCwgMHg0NWJjLCAweDcwMDMsIDB4MDAwMCwKKwkweDIwMDEsIDB4MDAwMiwgMHgwMDdjLCAweDEwNzgsIDB4NDU3ZSwgMHgxMDc4LCAweDQ1YjUsIDB4MTA3OCwKKwkweDQyNmYsIDB4MTA3OCwgMHg0MTgwLCAweDEwNzgsIDB4NDViYywgMHgyMDAxLCAweDAwMDEsIDB4MDA3YywKKwkweDEwNzgsIDB4NDU3ZSwgMHgxMDc4LCAweDQ1YjUsIDB4MTA3OCwgMHg0MjZmLCAweDcwYjQsIDB4YTA4MCwKKwkweDAwY2QsIDB4NzgxYSwgMHgyMDAxLCAweDAwMTMsIDB4MTA3OCwgMHg0NTRjLCAweDEwNzgsIDB4NDViYywKKwkweDcwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDAwMDIsIDB4MDA3YywgMHgxMDc4LCAweDQ1MzYsIDB4MDA3YywKKwkweDEwNzgsIDB4NDU3ZSwgMHgxMDc4LCAweDQ1YjUsIDB4MTA3OCwgMHg0MjZmLCAweDEwNzgsIDB4NDE4MCwKKwkweDEwNzgsIDB4NDViYywgMHgyMDAxLCAweDAwMDEsIDB4MDA3YywgMHgyMDAxLCAweDAwMDMsIDB4MDA3YywKKwkweDEwNzgsIDB4NDRkMSwgMHgyMDAxLCAweDAwMDAsIDB4MDA3YywgMHgwYzdlLCAweDA3N2UsIDB4NmYxNCwKKwkweDEwNzgsIDB4MzZiMCwgMHgwNzdmLCAweDBjN2YsIDB4MjAwMSwgMHgwMDAwLCAweDAwN2MsIDB4MTA3OCwKKwkweDQ1N2UsIDB4MTA3OCwgMHg0NTM2LCAweDIwMDEsIDB4MDAwNiwgMHgwMDdjLCAweDY5MDQsIDB4YTE4YywKKwkweDAwZmYsIDB4YTE4NiwgMHgwMDA3LCAweDAwNDAsIDB4NDQ3MSwgMHhhMTg2LCAweDAwMGYsIDB4MDBjMCwKKwkweDQ0NzUsIDB4MTA3OCwgMHg0NWI1LCAweDEwNzgsIDB4NDI2ZiwgMHg3MGI0LCAweGEwODAsIDB4MDBjZCwKKwkweDc4MWEsIDB4MTA3OCwgMHg0NWJjLCAweDcwMDMsIDB4MDAwMCwgMHgwMDdjLCAweDdhYTgsIDB4YTI5NCwKKwkweDAwZmYsIDB4NzhhOCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4YSwgMHgwMDA0LCAweDAwYzgsIDB4NDUzNiwKKwkweDEwNzksIDB4NDQ4YiwgMHgwMDdjLCAweDQ1MzYsIDB4NDQ4ZiwgMHg0NTM2LCAweDQ0ZGYsIDB4YTI4MiwKKwkweDAwMDMsIDB4MDA0MCwgMHg0NDk2LCAweDEwNzgsIDB4NDUzNiwgMHgwMDdjLCAweDdkYTgsIDB4YTVhYywKKwkweDAwZmYsIDB4N2NhOCwgMHhhNGE0LCAweDAwZmYsIDB4YTQ4MiwgMHgwMDBjLCAweDAwNDgsIDB4NDRhNCwKKwkweDAwNDAsIDB4NDRhNCwgMHgyMDIxLCAweDAwMGMsIDB4NzAxYywgMHhhNTAyLCAweDAwYzgsIDB4NDRhOSwKKwkweDc1MWMsIDB4MTA3OCwgMHg0NTFjLCAweDg1MmIsIDB4ODUyYiwgMHgxMDc4LCAweDM3MmUsIDB4MDA0MCwKKwkweDQ0YjUsIDB4MTA3OCwgMHg0NGMzLCAweDAwNzgsIDB4NDRiOSwgMHgxMDc4LCAweDQ1MTgsIDB4MTA3OCwKKwkweDQ0ZDEsIDB4YTZiNSwgMHgxMDAwLCAweDdlNWEsIDB4NzBiNCwgMHhhMDgwLCAweDAwYjksIDB4NzgxYSwKKwkweDIwMDEsIDB4MDAwNCwgMHgwMDdjLCAweDBjN2UsIDB4NjkxNCwgMHg4MTBmLCAweGExOGMsIDB4MDAwZiwKKwkweDgxMGIsIDB4ODEwYiwgMHg4MTBiLCAweGExZTAsIDB4NTI4MCwgMHgxMDc4LCAweDM1MzgsIDB4MGM3ZiwKKwkweDAwN2MsIDB4MGM3ZSwgMHg2ODE0LCAweDgwMDcsIDB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywKKwkweDgwMDMsIDB4YTBlMCwgMHg1MjgwLCAweDEwNzgsIDB4MzU1ZiwgMHgwYzdmLCAweDAwN2MsIDB4YTI4MiwKKwkweDAwMDIsIDB4MDBjMCwgMHg0NTM2LCAweDdhYTgsIDB4YTI5NCwgMHgwMGZmLCAweGEyODQsIDB4ZmZmZSwKKwkweDAwNDAsIDB4NDRlYywgMHgyMDExLCAweDAwMDEsIDB4MTA3OCwgMHg0NTBhLCAweDEwNzgsIDB4NDRmYywKKwkweDEwNzgsIDB4NDRkMSwgMHhhNmI1LCAweDEwMDAsIDB4N2U1YSwgMHg3MGI0LCAweGEwODAsIDB4MDBiOSwKKwkweDc4MWEsIDB4MjAwMSwgMHgwMDA0LCAweDAwN2MsIDB4MGM3ZSwgMHg2ODE0LCAweDgwMDcsIDB4YTA4NCwKKwkweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTBlMCwgMHg1MjgwLCAweDEwNzgsIDB4MzYwNCwKKwkweDBjN2YsIDB4MDA3YywgMHg3ODliLCAweDAwMTgsIDB4NzhhYiwgMHgwMDAxLCAweDc4YWIsIDB4MDAwMiwKKwkweDc4YWIsIDB4MDAwMywgMHg3YWFhLCAweDc4OWIsIDB4MDA4MSwgMHg3OGFiLCAweDAwMDQsIDB4MDA3YywKKwkweDIwMjEsIDB4MDAwMCwgMHgyMDI5LCAweDAwMzIsIDB4Nzg5YiwgMHgwMDE4LCAweDc4YWIsIDB4MDAwMSwKKwkweDc4YWIsIDB4MDAwMywgMHg3OGFiLCAweDAwMDEsIDB4N2RhYSwgMHg3Y2FhLCAweDc4OWIsIDB4MDA4MSwKKwkweDc4YWIsIDB4MDAwNSwgMHgwMDdjLCAweDIwMDEsIDB4MDAwMywgMHgxMDc4LCAweDQ1NDQsIDB4NzBiNCwKKwkweGEwODAsIDB4MDBiOSwgMHg3ODFhLCAweDIwMDEsIDB4MDAwNSwgMHgwMDdjLCAweDIwMDEsIDB4MDAwNywKKwkweDEwNzgsIDB4NDU0NCwgMHhhNmI1LCAweDEwMDAsIDB4N2U1YSwgMHg3MGI0LCAweGEwODAsIDB4MDBiOSwKKwkweDc4MWEsIDB4MjAwMSwgMHgwMDA0LCAweDAwN2MsIDB4Nzg5YiwgMHgwMDE4LCAweDc4YWEsIDB4Nzg5YiwKKwkweDAwODEsIDB4NzhhYiwgMHgwMDAxLCAweDAwN2MsIDB4NjkwNCwgMHhhMThjLCAweDAwZmYsIDB4YTE5NiwKKwkweDAwMDcsIDB4MDA0MCwgMHg0NTVhLCAweGExOTYsIDB4MDAwZiwgMHgwMDQwLCAweDQ1NWEsIDB4MTA3OCwKKwkweDE5M2QsIDB4MDA3YywgMHg2OTI0LCAweGExOTQsIDB4MDAzZiwgMHgwMGMwLCAweDQ1NjMsIDB4YTE4YywKKwkweGZmYzAsIDB4YTEwNSwgMHg2ODI2LCAweDEwNzgsIDB4M2FjMiwgMHg2OTFjLCAweGExODQsIDB4MDEwMCwKKwkweDAwNDAsIDB4NDU3MiwgMHgxMDc4LCAweDFiN2UsIDB4NjkxNCwgMHgxMDc4LCAweDNiMzMsIDB4NjIwNCwKKwkweDgyMTAsIDB4NjIwNiwgMHgwMDdjLCAweDY5MmMsIDB4NjgzNCwgMHg2ODJlLCAweGExMTIsIDB4NjkzMCwKKwkweDY4MzgsIDB4NjgzMiwgMHhhMTFiLCAweGEyMDAsIDB4YTMwMSwgMHgwMDdjLCAweDBjN2UsIDB4YWRlMCwKKwkweDAwMTgsIDB4NjAwMywgMHgwMDcwLCAweDYxMDYsIDB4NjAwYiwgMHgwMDAwLCAweDYwMGYsIDB4MGEwMCwKKwkweDYwMTMsIDB4MDAwMCwgMHg2MDE3LCAweDAwMDAsIDB4ODAwNywgMHg2MDFhLCAweDYwMWYsIDB4MDAwMCwKKwkweDYwMjMsIDB4MDAwMCwgMHgwYzdmLCAweDY4MjQsIDB4YTA4NSwgMHgwMDgwLCAweDY4MjYsIDB4MDA3YywKKwkweDE1N2UsIDB4MTM3ZSwgMHgxNDdlLCAweDIwOTgsIDB4YWY4MCwgMHgwMDJkLCAweDIwYTAsIDB4ODFhYywKKwkweDAwNDAsIDB4NDVhMywgMHg1M2E2LCAweGExODQsIDB4MDAwMSwgMHgwMDQwLCAweDQ1YTksIDB4MzMwNCwKKwkweDc4YmUsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsIDB4MDA3YywgMHg3MGIwLCAweGEwMDUsIDB4MTBjMCwKKwkweDIzY2EsIDB4NzBiMywgMHg4MDAwLCAweDAwNzgsIDB4NDhmNywgMHg3MWIwLCAweDgxZmYsIDB4MDA0MCwKKwkweDQ1YmIsIDB4MTA3OCwgMHg0OWVkLCAweDAwN2MsIDB4NzFiMCwgMHg4MWZmLCAweDAwNDAsIDB4NDVjNCwKKwkweDcwYjMsIDB4MDAwMCwgMHgxMDc4LCAweDQ2MzMsIDB4MDA3YywgMHgwYzdlLCAweDBkN2UsIDB4MTA3OCwKKwkweDE5MWEsIDB4MGM3ZiwgMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHgyZGEwLCAweDJjOTgsIDB4MjBhOSwKKwkweDAwMzEsIDB4NTNhMywgMHgxNDdmLCAweDEzN2YsIDB4MTU3ZiwgMHg2ODA3LCAweDAxMGQsIDB4NjgwYiwKKwkweDAwMDAsIDB4NzAwNCwgMHg4MDA3LCAweDY4MWEsIDB4NjgyMywgMHgwMDAwLCAweDY4MWYsIDB4MDAwMCwKKwkweDY4OWYsIDB4MDAwMCwgMHgwYzdmLCAweDAwN2MsIDB4NzBiNCwgMHhhMDgwLCAweDAwOTEsIDB4NzgxYSwKKwkweDAwNzgsIDB4MjQzOCwgMHg3MGI0LCAweGEwODAsIDB4MDA4MSwgMHg3ODFhLCAweDAwNzgsIDB4MjQzOCwKKwkweDcwYjQsIDB4YTA4MCwgMHgwMGI5LCAweDc4MWEsIDB4MDA3OCwgMHgyNDM4LCAweDcwYjQsIDB4YTA4MCwKKwkweDAwYzMsIDB4NzgxYSwgMHgwMDc4LCAweDI0MzgsIDB4NjkwNCwgMHhhMThjLCAweDAwZmYsIDB4YTE5NiwKKwkweDAwMDcsIDB4MDA0MCwgMHg0NjA5LCAweGExOTYsIDB4MDAwZiwgMHgwMDQwLCAweDQ2MDksIDB4NjgwNywKKwkweDAxMTcsIDB4MjAwMSwgMHgwMjAwLCAweDY4MjYsIDB4ODAwNywgMHg3ODliLCAweDAwMGUsIDB4NzhhYSwKKwkweDY4MjAsIDB4YTA4NSwgMHg4MDAwLCAweDY4MjIsIDB4MjAzMSwgMHgwNDAwLCAweDZlYjYsIDB4N2U1YSwKKwkweDcxYjQsIDB4YTE4OCwgMHgwMDkxLCAweDc5MWEsIDB4MDA3YywgMHgxMDc4LCAweDQ1YmMsIDB4Nzg0OCwKKwkweGEwODUsIDB4MDAwYywgMHg3ODRhLCAweDcwYjQsIDB4YTA4MCwgMHgwMGNkLCAweDc4MWEsIDB4MjAwOSwKKwkweDAwMGIsIDB4MjAwMSwgMHg0NDAwLCAweDEwNzgsIDB4NDU3ZSwgMHgyMDAxLCAweDAwMTMsIDB4MTA3OCwKKwkweDQ1NGMsIDB4MDA3OCwgMHgzYjYwLCAweDEyN2UsIDB4MjA5MSwgMHgyMjAwLCAweDIwNDksIDB4NDYzMywKKwkweDcwMDAsIDB4NzIwNCwgMHhhMjA1LCAweDcyMGMsIDB4YTIxNSwgMHg3MDA4LCAweGEwODQsIDB4ZmZmNywKKwkweGEyMDUsIDB4MDA0MCwgMHg0NjQ1LCAweDAwNzgsIDB4NDY0YSwgMHg3MDAzLCAweDAwMDAsIDB4MTI3ZiwKKwkweDIwMDAsIDB4MDA3YywgMHg3MDAwLCAweGEwODQsIDB4MDAwMSwgMHgwMGMwLCAweDQ2NzgsIDB4NzEwOCwKKwkweDgxMDMsIDB4MDBjOCwgMHg0NjU3LCAweDEwNzgsIDB4NDc3YSwgMHgwMDc4LCAweDQ2NGYsIDB4NzAwYywKKwkweGEwOGMsIDB4MDBmZiwgMHgwMDQwLCAweDQ2NzgsIDB4NzAwNCwgMHg4MDA0LCAweDAwYzgsIDB4NDY2ZiwKKwkweDcwMTQsIDB4YTAwNSwgMHgwMGMwLCAweDQ2NmIsIDB4NzAxMCwgMHhhMDA1LCAweDAwNDAsIDB4NDY2ZiwKKwkweGExMDIsIDB4MDBjOCwgMHg0NjRmLCAweDcwMDcsIDB4MDAxMCwgMHgwMDc4LCAweDQ2NzgsIDB4OGFmZiwKKwkweDAwNDAsIDB4NDY3OCwgMHgxMDc4LCAweDQ5YzQsIDB4MDBjMCwgMHg0NjcyLCAweDAwNDAsIDB4NDY0ZiwKKwkweDEwNzgsIDB4NDcwMywgMHg3MDAzLCAweDAwMDAsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4MDE3ZSwKKwkweDYxMDQsIDB4YTE4YywgMHgwMGZmLCAweGExODYsIDB4MDAwNywgMHgwMDQwLCAweDQ2OGIsIDB4YTE4ZSwKKwkweDAwMGYsIDB4MDBjMCwgMHg0NjhlLCAweDYwNDAsIDB4MDA3OCwgMHg0NjhmLCAweDY0MjgsIDB4MDE3ZiwKKwkweDg0ZmYsIDB4MDA0MCwgMHg0NmI5LCAweDJjNzAsIDB4NzAwNCwgMHhhMGJjLCAweDAwMGYsIDB4YTdiOCwKKwkweDQ2YzksIDB4MjczYywgMHg4N2ZiLCAweDAwYzAsIDB4NDZhNywgMHgwMDQ4LCAweDQ2YTEsIDB4MTA3OCwKKwkweDIzY2EsIDB4NjA5YywgMHhhMDc1LCAweDAwNDAsIDB4NDZiOSwgMHgwMDc4LCAweDQ2OTQsIDB4MjcwNCwKKwkweGFlNjgsIDB4NjgwOCwgMHhhNjMwLCAweDY4MGMsIDB4YTUyOSwgMHg4NDIxLCAweDAwNDAsIDB4NDZiOSwKKwkweDg3MzgsIDB4MjcwNCwgMHhhMDA1LCAweDAwYzAsIDB4NDZhOCwgMHg3MDljLCAweGEwNzUsIDB4MDBjMCwKKwkweDQ2OTQsIDB4MDA3YywgMHgwMDAwLCAweDAwMDUsIDB4MDAwOSwgMHgwMDBkLCAweDAwMTEsIDB4MDAxNSwKKwkweDAwMTksIDB4MDAxZCwgMHgwMDAwLCAweDAwMDMsIDB4MDAwOSwgMHgwMDBmLCAweDAwMTUsIDB4MDAxYiwKKwkweDAwMDAsIDB4MDAwMCwgMHg0NmJlLCAweDQ2YmIsIDB4MDAwMCwgMHgwMDAwLCAweDgwMDAsIDB4MDAwMCwKKwkweDQ2YmUsIDB4MDAwMCwgMHg0NmM2LCAweDQ2YzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDQ2YzYsIDB4MDAwMCwgMHg0NmMxLCAweDQ2YzEsIDB4MDAwMCwgMHgwMDAwLCAweDgwMDAsIDB4MDAwMCwKKwkweDQ2YzEsIDB4MDAwMCwgMHg0NmM3LCAweDQ2YzcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDQ2YzcsIDB4MTI3ZSwgMHgyMDkxLCAweDIyMDAsIDB4MjA3OSwgMHg1MDAwLCAweDIwNzEsIDB4MDAxMCwKKwkweDcwMDcsIDB4MDAwYSwgMHg3MDA3LCAweDAwMDIsIDB4NzAwMywgMHgwMDAwLCAweDIwNzEsIDB4MDAyMCwKKwkweDcwMDcsIDB4MDAwYSwgMHg3MDA3LCAweDAwMDIsIDB4NzAwMywgMHgwMDAwLCAweDIwNDksIDB4MDAwMCwKKwkweDEyN2YsIDB4MjAwMCwgMHgwMDdjLCAweDIwNDksIDB4NDcwMywgMHgyMDE5LCAweDAwMDAsIDB4NzAwNCwKKwkweDgwMDQsIDB4MDBjOCwgMHg0NzU2LCAweDcwMDcsIDB4MDAxMiwgMHg3MTA4LCAweDcwMDgsIDB4YTEwNiwKKwkweDAwYzAsIDB4NDcwZCwgMHhhMTg0LCAweDAxZTAsIDB4MDA0MCwgMHg0NzE4LCAweDEwNzgsIDB4MjNjYSwKKwkweDIwMDEsIDB4MDRmZCwgMHgyMDA0LCAweGEwODIsIDB4MDAwNSwgMHgwMGM4LCAweDQ3MjMsIDB4YTE4NCwKKwkweDQwMDAsIDB4MDBjMCwgMHg0NzBkLCAweGExOWMsIDB4MzAwYywgMHhhMzg2LCAweDIwMDQsIDB4MDA0MCwKKwkweDQ3MzEsIDB4YTM4NiwgMHgwMDA4LCAweDAwNDAsIDB4NDczYywgMHhhMzg2LCAweDIwMGMsIDB4MDBjMCwKKwkweDQ3MGQsIDB4NzIwMCwgMHg4MjA0LCAweDAwNDgsIDB4NDczYywgMHg3MzBjLCAweGEzODQsIDB4MDBmZiwKKwkweDAwNDAsIDB4NDczYywgMHgxMDc4LCAweDIzY2EsIDB4NzAwNywgMHgwMDEyLCAweDcwMDAsIDB4YTA4NCwKKwkweDAwMDEsIDB4MDBjMCwgMHg0NzU2LCAweDcwMDgsIDB4YTA4NCwgMHgwMWUwLCAweDAwYzAsIDB4NDc1NiwKKwkweDczMTAsIDB4NzAxNCwgMHhhMzA1LCAweDAwNDAsIDB4NDc1NiwgMHg3MTBjLCAweGExODQsIDB4MDMwMCwKKwkweDAwYzAsIDB4NDc1NiwgMHhhMTg0LCAweDAwZmYsIDB4MDBjMCwgMHg0NzAzLCAweDcwMDcsIDB4MDAxMiwKKwkweDcwMDcsIDB4MDAwOCwgMHg3MDA0LCAweGEwODQsIDB4MDAwOCwgMHgwMGMwLCAweDQ3NWEsIDB4NzAwNywKKwkweDAwMTIsIDB4NzEwOCwgMHg4MTAzLCAweDAwNDgsIDB4NDc1ZiwgMHg3MDAzLCAweDAwMDAsIDB4MjA0OSwKKwkweDAwMDAsIDB4MDA3YywgMHgxMDdlLCAweDAwN2UsIDB4MTI3ZSwgMHgxNTdlLCAweDIwOTEsIDB4MjIwMCwKKwkweDcxMDgsIDB4MTA3OCwgMHg0NzdhLCAweDE1N2YsIDB4MTI3ZiwgMHgyMDkxLCAweDgwMDEsIDB4MDA3ZiwKKwkweDEwN2YsIDB4MDA3YywgMHg3MjA0LCAweDc1MDAsIDB4NzMwYywgMHhhMzg0LCAweDAzMDAsIDB4MDBjMCwKKwkweDQ3YTEsIDB4YTE4NCwgMHgwMWUwLCAweDAwYzAsIDB4NDdjNSwgMHg3MTA4LCAweGExODQsIDB4MDFlMCwKKwkweDAwYzAsIDB4NDdjNSwgMHgyMDAxLCAweDA0ZmQsIDB4MjAwNCwgMHhhMDgyLCAweDAwMDUsIDB4MDBjOCwKKwkweDQ3OTUsIDB4YTE4NCwgMHg0MDAwLCAweDAwYzAsIDB4NDc4NSwgMHhhMTg0LCAweDAwMDcsIDB4MDA3OSwKKwkweDQ3OTksIDB4NDdhMywgMHg0N2I1LCAweDQ3YTEsIDB4NDdiNSwgMHg0N2ExLCAweDQ4MDEsIDB4NDdhMSwKKwkweDQ3ZmYsIDB4MTA3OCwgMHgyM2NhLCAweDcwMDQsIDB4YTA4NCwgMHgwMDEwLCAweGEwODUsIDB4MDAwMiwKKwkweDcwMDYsIDB4OGFmZiwgMHgwMGMwLCAweDQ3YjAsIDB4MjA0OSwgMHgwMDAwLCAweDAwNzgsIDB4NDdiNCwKKwkweDEwNzgsIDB4NDljNCwgMHgwMGMwLCAweDQ3YjAsIDB4MDA3YywgMHg3MDA0LCAweGEwODQsIDB4MDAxMCwKKwkweGEwODUsIDB4MDAwMiwgMHg3MDA2LCAweDhhZmYsIDB4MDBjMCwgMHg0N2MwLCAweDAwNzgsIDB4NDdjNCwKKwkweDEwNzgsIDB4NDljNCwgMHgwMGMwLCAweDQ3YzAsIDB4MDA3YywgMHg3MDA3LCAweDAwMTIsIDB4NzEwOCwKKwkweDAwZTAsIDB4NDdjOCwgMHgyMDkxLCAweDYwMDAsIDB4MDBlMCwgMHg0N2NjLCAweDIwOTEsIDB4NjAwMCwKKwkweDcwMDcsIDB4MDAxMiwgMHg3MDA3LCAweDAwMDgsIDB4NzAwNCwgMHhhMDg0LCAweDAwMDgsIDB4MDBjMCwKKwkweDQ3ZDQsIDB4NzAwNywgMHgwMDEyLCAweDcxMDgsIDB4ODEwMywgMHgwMDQ4LCAweDQ3ZDksIDB4NzAwMywKKwkweDAwMDAsIDB4NzAwMCwgMHhhMDA1LCAweDAwYzAsIDB4NDdlZCwgMHg3MDA0LCAweGEwMDUsIDB4MDBjMCwKKwkweDQ3ZWQsIDB4NzAwYywgMHhhMDA1LCAweDAwNDAsIDB4NDdlZiwgMHgwMDc4LCAweDQ3ZDAsIDB4MjA0OSwKKwkweDAwMDAsIDB4MTA3OCwgMHgzN2Q3LCAweDY4MTgsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4NDdmYSwKKwkweDY4MWIsIDB4MDAwMiwgMHgwMDdjLCAweDEwNzgsIDB4MjNjYSwgMHgxMDc4LCAweDIzY2EsIDB4MTA3OCwKKwkweDQ4NWQsIDB4NzIxMCwgMHg3MTE0LCAweDcwMGMsIDB4YTA5YywgMHgwMGZmLCAweDI4MDAsIDB4YTMwMCwKKwkweGEyMTEsIDB4YTE4OSwgMHgwMDAwLCAweDEwNzgsIDB4NDg1ZCwgMHgyNzA0LCAweDJjNTgsIDB4YWM2MCwKKwkweDYzMDgsIDB4MjIwMCwgMHhhMzIyLCAweDYzMGMsIDB4MjEwMCwgMHhhMzFiLCAweDI0MDAsIDB4YTMwNSwKKwkweDAwNDAsIDB4NDgyNCwgMHgwMGM4LCAweDQ4MjQsIDB4ODQxMiwgMHg4MjEwLCAweDgzMGEsIDB4YTE4OSwKKwkweDAwMDAsIDB4MmI2MCwgMHgwMDc4LCAweDQ4MGIsIDB4MmI2MCwgMHg4YTA3LCAweDAwN2UsIDB4NjAwNCwKKwkweGEwODQsIDB4MDAwOCwgMHgwMDQwLCAweDQ4MzAsIDB4YTdiYSwgMHg0NmMzLCAweDAwNzgsIDB4NDgzMiwKKwkweGE3YmEsIDB4NDZiYiwgMHgwMDdmLCAweGE3M2QsIDB4MmMwMCwgMHg2ODg2LCAweDZmOGEsIDB4NmM5MiwKKwkweDZiOGUsIDB4NzAwNywgMHgwMDEyLCAweDEwNzgsIDB4NDcwMywgMHgwMDdjLCAweDg3MzgsIDB4MjcwNCwKKwkweGEwMDUsIDB4MDBjMCwgMHg0ODUxLCAweDYwOWMsIDB4YTAwNSwgMHgwMDQwLCAweDQ4NWEsIDB4MjA2MCwKKwkweDYwMDQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODAsIDB4NDZjOSwgMHgyMDNjLCAweDg3ZmIsIDB4MTA0MCwKKwkweDIzY2EsIDB4OGE1MSwgMHgwMDQwLCAweDQ4NTksIDB4NzAwOCwgMHhhMDg0LCAweDAwMDMsIDB4YTA4NiwKKwkweDAwMDMsIDB4MDA3YywgMHgyMDUxLCAweDAwMDAsIDB4MDA3YywgMHg4YTUwLCAweDg3MzksIDB4MjcwNCwKKwkweGEwMDQsIDB4MDBjMCwgMHg0ODcxLCAweDYwMDAsIDB4YTA2NCwgMHgwMGMwLCAweDQ4NjgsIDB4MmQ2MCwKKwkweDYwMDQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODAsIDB4NDZkOSwgMHgyMDNjLCAweDg3ZmIsIDB4MTA0MCwKKwkweDIzY2EsIDB4MDA3YywgMHgxMjdlLCAweDBkN2UsIDB4MjA5MSwgMHgyMjAwLCAweDBkN2YsIDB4Njg4NCwKKwkweDIwNjAsIDB4Njg4OCwgMHg2YjhjLCAweDZjOTAsIDB4ODA1NywgMHhhYWQ0LCAweDAwZmYsIDB4YTA4NCwKKwkweDAwZmYsIDB4MDA3ZSwgMHg2ODA0LCAweGEwODQsIDB4MDAwOCwgMHgwMDdmLCAweDAwNDAsIDB4NDg4YywKKwkweGEwYjgsIDB4NDZjMywgMHgwMDc4LCAweDQ4OGUsIDB4YTBiOCwgMHg0NmJiLCAweDdlMDgsIDB4YTZiNSwKKwkweDAwMGMsIDB4NjkwNCwgMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDA3LCAweDAwNDAsIDB4NDg5YywKKwkweGExOGUsIDB4MDAwZiwgMHgwMGMwLCAweDQ4YTUsIDB4NjgxYywgMHhhMDg0LCAweDAwNDAsIDB4MDA0MCwKKwkweDQ4YWMsIDB4YTZiNSwgMHgwMDAxLCAweDAwNzgsIDB4NDhhYywgMHg2ODFjLCAweGEwODQsIDB4MDA0MCwKKwkweDAwNDAsIDB4NDhhYywgMHhhNmI1LCAweDAwMDEsIDB4NzAwNywgMHgwMDA0LCAweDcwMDQsIDB4YTA4NCwKKwkweDAwMDQsIDB4MDBjMCwgMHg0OGFlLCAweDI0MDAsIDB4YTMwNSwgMHgwMGMwLCAweDQ4YjksIDB4MDA3OCwKKwkweDQ4ZGYsIDB4MmM1OCwgMHgyNzA0LCAweDYxMDQsIDB4YWM2MCwgMHg2MDAwLCAweGE0MDAsIDB4NzAxYSwKKwkweDYwMDQsIDB4YTMwMSwgMHg3MDFlLCAweGExODQsIDB4MDAwOCwgMHgwMDQwLCAweDQ4Y2YsIDB4NjAxMCwKKwkweGEwODEsIDB4MDAwMCwgMHg3MDIyLCAweDYwMTQsIDB4YTA4MSwgMHgwMDAwLCAweDcwMjYsIDB4NjIwOCwKKwkweDI0MDAsIDB4YTIwMiwgMHg3MDEyLCAweDYyMGMsIDB4MjMwMCwgMHhhMjAzLCAweDcwMTYsIDB4NzYwMiwKKwkweDcwMDcsIDB4MDAwMSwgMHgyYjYwLCAweDEwNzgsIDB4NDgzZSwgMHgwMDc4LCAweDQ4ZTEsIDB4MTA3OCwKKwkweDQ5YzQsIDB4MDBjMCwgMHg0OGRmLCAweDEyN2YsIDB4MjAwMCwgMHgwMDdjLCAweDEyN2UsIDB4MGQ3ZSwKKwkweDIwOTEsIDB4MjIwMCwgMHgwZDdmLCAweDcwMDcsIDB4MDAwNCwgMHg3MDA0LCAweGEwODQsIDB4MDAwNCwKKwkweDAwYzAsIDB4NDhlZCwgMHg3MDAzLCAweDAwMDgsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4MTI3ZSwKKwkweDBkN2UsIDB4MjA5MSwgMHgyMjAwLCAweDBkN2YsIDB4MjA0OSwgMHg0OGY3LCAweDcwMDcsIDB4MDAwNCwKKwkweDcwMDQsIDB4YTA4NCwgMHgwMDA0LCAweDAwYzAsIDB4NDkwMCwgMHg3ZTA4LCAweGE2YjUsIDB4MDAwYywKKwkweDY5MDQsIDB4YTE4YywgMHgwMGZmLCAweGExODYsIDB4MDAwNywgMHgwMDQwLCAweDQ5MTMsIDB4YTE4ZSwKKwkweDAwMGYsIDB4MDBjMCwgMHg0OTFlLCAweDY4MWMsIDB4YTA4NCwgMHgwMDQwLCAweDAwNDAsIDB4NDkxYSwKKwkweGE2YjUsIDB4MDAwMSwgMHg2ODQwLCAweDIwNTAsIDB4MDA3OCwgMHg0OTI3LCAweDY4MWMsIDB4YTA4NCwKKwkweDAwMjAsIDB4MDBjMCwgMHg0OTI1LCAweGE2YjUsIDB4MDAwMSwgMHg2ODI4LCAweDIwNTAsIDB4MmQ2MCwKKwkweDYwMDQsIDB4YTBiYywgMHgwMDBmLCAweGE3YjgsIDB4NDZjOSwgMHgyNzNjLCAweDg3ZmIsIDB4MDBjMCwKKwkweDQ5M2IsIDB4MDA0OCwgMHg0OTM1LCAweDEwNzgsIDB4MjNjYSwgMHg2ODljLCAweGEwNjUsIDB4MDA0MCwKKwkweDQ5M2YsIDB4MDA3OCwgMHg0OTI4LCAweDEwNzgsIDB4NDljNCwgMHgwMGMwLCAweDQ5M2IsIDB4MTI3ZiwKKwkweDIwMDAsIDB4MDA3YywgMHgxMjdlLCAweDAwN2UsIDB4MDE3ZSwgMHgwZDdlLCAweDIwOTEsIDB4MjIwMCwKKwkweDBkN2YsIDB4MDM3ZiwgMHgwNDdmLCAweDdlMDgsIDB4YTZiNSwgMHgwMDBjLCAweDY5MDQsIDB4YTE4YywKKwkweDAwZmYsIDB4YTE4NiwgMHgwMDA3LCAweDAwNDAsIDB4NDk1OSwgMHhhMThlLCAweDAwMGYsIDB4MDBjMCwKKwkweDQ5NjIsIDB4NjgxYywgMHhhMDg0LCAweDAwNDAsIDB4MDA0MCwgMHg0OTY5LCAweGE2YjUsIDB4MDAwMSwKKwkweDAwNzgsIDB4NDk2OSwgMHg2ODFjLCAweGEwODQsIDB4MDA0MCwgMHgwMDQwLCAweDQ5NjksIDB4YTZiNSwKKwkweDAwMDEsIDB4MjA0OSwgMHg0OTQyLCAweDAxN2UsIDB4NjkwNCwgMHhhMThjLCAweDAwZmYsIDB4YTE4NiwKKwkweDAwMDcsIDB4MDA0MCwgMHg0OTc3LCAweGExOGUsIDB4MDAwZiwgMHgwMGMwLCAweDQ5N2EsIDB4Njg0MCwKKwkweDAwNzgsIDB4NDk3YiwgMHg2ODI4LCAweDAxN2YsIDB4YTA1NSwgMHgwMDQwLCAweDQ5YzEsIDB4MmQ3MCwKKwkweDJlNjAsIDB4NzAwNCwgMHhhMGJjLCAweDAwMGYsIDB4YTdiOCwgMHg0NmM5LCAweDI3M2MsIDB4ODdmYiwKKwkweDAwYzAsIDB4NDk5NSwgMHgwMDQ4LCAweDQ5OGUsIDB4MTA3OCwgMHgyM2NhLCAweDcwOWMsIDB4YTA3NSwKKwkweDIwNjAsIDB4MDA0MCwgMHg0OWMxLCAweDAwNzgsIDB4NDk4MSwgMHgyNzA0LCAweGFlNjgsIDB4NjgwOCwKKwkweGE0MjIsIDB4NjgwYywgMHhhMzFiLCAweDAwNDgsIDB4NDlhZSwgMHg4YTUxLCAweDAwYzAsIDB4NDlhMiwKKwkweDEwNzgsIDB4MjNjYSwgMHg4NzM4LCAweDI3MDQsIDB4YTAwNSwgMHgwMGMwLCAweDQ5OTYsIDB4NzA5YywKKwkweGEwNzUsIDB4MjA2MCwgMHgwMDQwLCAweDQ5YzEsIDB4MDA3OCwgMHg0OTgxLCAweDg0MjIsIDB4ODQyMCwKKwkweDgzMWEsIDB4YTM5OSwgMHgwMDAwLCAweDY5MDgsIDB4MjQwMCwgMHhhMTIyLCAweDY5MGMsIDB4MjMwMCwKKwkweGExMWIsIDB4MDBjOCwgMHg0OWJkLCAweDEwNzgsIDB4MjNjYSwgMHgyMDcxLCAweDAwMjAsIDB4MDA3OCwKKwkweDQ4YWMsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4NzAwOCwgMHhhMDg0LCAweDAwMDMsIDB4YTA4NiwKKwkweDAwMDMsIDB4MDA0MCwgMHg0OWVjLCAweDI3MDQsIDB4YWMwOCwgMHgyMTA0LCAweDcwMWEsIDB4ODEwOCwKKwkweDIxMDQsIDB4NzAxZSwgMHg4MTA4LCAweDIxMDQsIDB4NzAxMiwgMHg4MTA4LCAweDIxMDQsIDB4NzAxNiwKKwkweDYwMDQsIDB4YTA4NCwgMHgwMDA4LCAweDAwNDAsIDB4NDllMywgMHg4MTA4LCAweDIxMDQsIDB4NzAyMiwKKwkweDgxMDgsIDB4MjEwNCwgMHg3MDI2LCAweDc2MDIsIDB4NzAwNCwgMHhhMDg0LCAweDAwMTAsIDB4YTA4NSwKKwkweDAwMDEsIDB4NzAwNiwgMHgxMDc4LCAweDQ4M2UsIDB4MDA3YywgMHgxMjdlLCAweDAwN2UsIDB4MGQ3ZSwKKwkweDIwOTEsIDB4MjIwMCwgMHgyMDQ5LCAweDQ5ZWQsIDB4MGQ3ZiwgMHgwODdmLCAweDcxMDgsIDB4YTE4NCwKKwkweDAwMDMsIDB4MDBjMCwgMHg0YTE3LCAweDAxN2UsIDB4NjkwNCwgMHhhMThjLCAweDAwZmYsIDB4YTE4NiwKKwkweDAwMDcsIDB4MDA0MCwgMHg0YTA3LCAweGExOGUsIDB4MDAwZiwgMHgwMGMwLCAweDRhMGEsIDB4Njg0MCwKKwkweDAwNzgsIDB4NGEwYiwgMHg2ODI4LCAweDAxN2YsIDB4YTAwNSwgMHgwMDQwLCAweDRhMjUsIDB4MDA3OCwKKwkweDQ2NGEsIDB4MDAyMCwgMHg0YTE3LCAweDEwNzgsIDB4NDgwMSwgMHgwMDc4LCAweDRhMjUsIDB4MDBhMCwKKwkweDRhMWUsIDB4NzEwOCwgMHgxMDc4LCAweDQ3N2EsIDB4MDA3OCwgMHg0OWY2LCAweDcwMDcsIDB4MDAxMCwKKwkweDAwYTAsIDB4NGEyMCwgMHg3MTA4LCAweDEwNzgsIDB4NDc3YSwgMHg3MDA4LCAweGEwODYsIDB4MDAwOCwKKwkweDAwYzAsIDB4NDlmNiwgMHg3MDAwLCAweGEwMDUsIDB4MDBjMCwgMHg0OWY2LCAweDcwMDMsIDB4MDAwMCwKKwkweDIwNDksIDB4MDAwMCwgMHgxMjdmLCAweDIwMDAsIDB4MDA3YywgMHgxMjdlLCAweDE0N2UsIDB4MTM3ZSwKKwkweDE1N2UsIDB4MGM3ZSwgMHgwZDdlLCAweDIwOTEsIDB4MjIwMCwgMHgwZDdmLCAweDIwNDksIDB4NGEzNSwKKwkweGFkODAsIDB4MDAxMSwgMHgyMGEwLCAweDIwOTksIDB4MDAzMSwgMHg3MDBjLCAweGEwODQsIDB4MDBmZiwKKwkweDY4MmEsIDB4NzAwNywgMHgwMDA4LCAweDcwMDcsIDB4MDAwMiwgMHg3MDAzLCAweDAwMDEsIDB4MDA0MCwKKwkweDRhNTQsIDB4ODAwMCwgMHg4MGFjLCAweDUzYTUsIDB4NzAwNywgMHgwMDA0LCAweDcwMDQsIDB4YTA4NCwKKwkweDAwMDQsIDB4MDBjMCwgMHg0YTU2LCAweDBjN2YsIDB4MjA0OSwgMHgwMDAwLCAweDcwMDMsIDB4MDAwMCwKKwkweDE1N2YsIDB4MTM3ZiwgMHgxNDdmLCAweDEyN2YsIDB4MjAwMCwgMHgwMDdjLCAweDIwOTEsIDB4NjAwMCwKKwkweDIwOTEsIDB4ODAwMCwgMHg3OGNjLCAweGEwMDUsIDB4MDA0MCwgMHg0YTdkLCAweDc5OTQsIDB4NzBkMCwKKwkweGExMDYsIDB4MDBjMCwgMHg0YTdkLCAweDc4MDQsIDB4YTAwNSwgMHgwMDQwLCAweDRhN2QsIDB4NzgwNywKKwkweDAwMDAsIDB4MDA2OCwgMHg0YTdkLCAweDIwOTEsIDB4NDA4MCwgMHg3ODIwLCAweDgwMDEsIDB4NzgyMiwKKwkweDAwYzAsIDB4NGFkOCwgMHg3ODI0LCAweDc4MjIsIDB4MjA2OSwgMHg1MDQwLCAweDY4MDAsIDB4YTA4NCwKKwkweDAwMDcsIDB4MDA0MCwgMHg0YTliLCAweGEwODYsIDB4MDAwMiwgMHgwMDQwLCAweDRhOWIsIDB4NjgzNCwKKwkweGEwMGQsIDB4MDA0MCwgMHg0YTliLCAweDIxMDQsIDB4YTAwNSwgMHgwMDQwLCAweDRhOWIsIDB4ODAwMSwKKwkweDIwMGEsIDB4MDA0MCwgMHg0YjgwLCAweDc4NDgsIDB4YTAwNSwgMHgwMDQwLCAweDRhYTksIDB4ODAwMSwKKwkweDc4NGEsIDB4MDBjMCwgMHg0YWE5LCAweDIwMDksIDB4MDEwMiwgMHg2ODQ0LCAweDIwMGEsIDB4MTA3OCwKKwkweDIxYjEsIDB4Njg5MCwgMHhhMDA1LCAweDAwNDAsIDB4NGFiNSwgMHg4MDAxLCAweDY4OTIsIDB4MDBjMCwKKwkweDRhYjUsIDB4Njg2ZiwgMHgwMDAwLCAweDY4NzMsIDB4MDAwMSwgMHgyMDYxLCAweDUzMDAsIDB4MjBhOSwKKwkweDAxMDAsIDB4MjAwOSwgMHgwMDAyLCAweDYwMzQsIDB4YTAwNSwgMHgwMDQwLCAweDRhY2IsIDB4ODAwMSwKKwkweDYwMzYsIDB4MDBjMCwgMHg0YWNiLCAweDYwMTAsIDB4YTAwNSwgMHgwMDQwLCAweDRhY2IsIDB4MDE3ZSwKKwkweDEwNzgsIDB4MjFiMSwgMHgwMTdmLCAweGFjZTAsIDB4MDAxMCwgMHgwMDcwLCAweDRhZDEsIDB4MDA3OCwKKwkweDRhYmIsIDB4ODEwOSwgMHgwMDQwLCAweDRhZDgsIDB4MjBhOSwgMHgwMTAwLCAweDAwNzgsIDB4NGFiYiwKKwkweDEwNzgsIDB4NGFlNSwgMHgxMDc4LCAweDRiMGEsIDB4MjAwOSwgMHg1MDUxLCAweDIxMDQsIDB4MjAwOSwKKwkweDAxMDIsIDB4MjAwYSwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHg3ODM0LCAweDgwMDEsIDB4NzgzNiwKKwkweDAwYzAsIDB4NGIwOSwgMHg3ODM4LCAweDc4MzYsIDB4MjA5MSwgMHg4MDAwLCAweDc4NDQsIDB4YTAwNSwKKwkweDAwYzAsIDB4NGFmNCwgMHgyMDAxLCAweDAxMDEsIDB4ODAwMSwgMHg3ODQ2LCAweGEwODAsIDB4NzMwMCwKKwkweDIwNDAsIDB4MjAwNCwgMHhhMDY1LCAweDAwNDAsIDB4NGIwOSwgMHg2MDI0LCAweGEwMDUsIDB4MDA0MCwKKwkweDRiMDUsIDB4ODAwMSwgMHg2MDI2LCAweDAwNDAsIDB4NGIzOSwgMHg2MDAwLCAweDJjNDAsIDB4MDA3OCwKKwkweDRhZmEsIDB4MDA3YywgMHg3ODI4LCAweDgwMDEsIDB4NzgyYSwgMHgwMGMwLCAweDRiMzgsIDB4NzgyYywKKwkweDc4MmEsIDB4NzgzMCwgMHhhMDA1LCAweDAwYzAsIDB4NGIxNywgMHgyMDAxLCAweDAyMDAsIDB4ODAwMSwKKwkweDc4MzIsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMDkwLCAweDUzMDAsIDB4YTI5OCwKKwkweDAwMDIsIDB4MjMwNCwgMHhhMDg0LCAweDAwMDgsIDB4MDA0MCwgMHg0YjM4LCAweGEyOTAsIDB4MDAwOSwKKwkweDIyMDQsIDB4YTAwNSwgMHgwMDQwLCAweDRiMzAsIDB4ODAwMSwgMHgyMDEyLCAweDAwYzAsIDB4NGIzOCwKKwkweDIzMDQsIDB4YTA4NCwgMHhmZmY3LCAweGEwODUsIDB4MDA4MCwgMHgyMDFhLCAweDEwNzgsIDB4MjFiMSwKKwkweDAwN2MsIDB4MjA2OSwgMHg1MDQwLCAweDY4MDAsIDB4YTAwNSwgMHgwMDQwLCAweDRiNDMsIDB4Njg0OCwKKwkweGFjMDYsIDB4MDA0MCwgMHg0YjgwLCAweDYwMWIsIDB4MDAwNiwgMHg2MGI0LCAweGEwODQsIDB4M2YwMCwKKwkweDYwMWUsIDB4NjAyMCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NSwgMHgwMDYwLCAweDYwMjIsIDB4NjAwMCwKKwkweDIwNDIsIDB4NjcxNCwgMHg2ZjgyLCAweDEwNzgsIDB4MTk1NiwgMHg2ODE4LCAweGEwMDUsIDB4MDA0MCwKKwkweDRiNWIsIDB4ODAwMSwgMHg2ODFhLCAweDY4MDgsIDB4YTA4NCwgMHhmZmVmLCAweDY4MGEsIDB4NjgxMCwKKwkweDgwMDEsIDB4MDBkMCwgMHg0YjY1LCAweDEwNzgsIDB4MjNjYSwgMHg2ODEyLCAweDYwMmYsIDB4MDAwMCwKKwkweDYwMzMsIDB4MDAwMCwgMHgyYzY4LCAweDEwNzgsIDB4MWM1MywgMHgyMDY5LCAweDUwNDAsIDB4Nzk0NCwKKwkweGExODQsIDB4MDEwMCwgMHgyMDAxLCAweDAwMDYsIDB4Njg2ZSwgMHgwMGMwLCAweDRiN2IsIDB4Njk4NiwKKwkweDIwMDEsIDB4MDAwNCwgMHg2ODZlLCAweDEwNzgsIDB4MjFhYywgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywKKwkweDIwNjksIDB4MDEwMCwgMHgyMDA5LCAweDUwNDAsIDB4MjEwNCwgMHhhMDg0LCAweDAwMDcsIDB4MDA0MCwKKwkweDRiZGMsIDB4YTA4NiwgMHgwMDA3LCAweDAwYzAsIDB4NGI5NiwgMHgwZDdlLCAweDIwMDksIDB4NTA1MiwKKwkweDIxNmMsIDB4MTA3OCwgMHgzYTFhLCAweDBkN2YsIDB4MDA3OCwgMHg0YmRjLCAweDIwMDksIDB4NTA1MiwKKwkweDIxNjQsIDB4MTA3OCwgMHgyMzc1LCAweDYwMWIsIDB4MDAwNiwgMHg2ODU4LCAweGEwODQsIDB4M2YwMCwKKwkweDYwMWUsIDB4NjAyMCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NSwgMHgwMDQ4LCAweDYwMjIsIDB4NjAyZiwKKwkweDAwMDAsIDB4NjAzMywgMHgwMDAwLCAweDY4MzAsIDB4YTA4NCwgMHgwMDQwLCAweDAwNDAsIDB4NGJkMCwKKwkweDY4NGIsIDB4MDAwNCwgMHgyMGE5LCAweDAwMTQsIDB4Njg0OCwgMHhhMDg0LCAweDAwMDQsIDB4MDA0MCwKKwkweDRiYmQsIDB4MDA3MCwgMHg0YmJkLCAweDAwNzgsIDB4NGJiNCwgMHg2ODRiLCAweDAwMDksIDB4MjBhOSwKKwkweDAwMTQsIDB4Njg0OCwgMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHg0YmNhLCAweDAwNzAsIDB4NGJjYSwKKwkweDAwNzgsIDB4NGJjMSwgMHgyMGE5LCAweDAwZmEsIDB4MDA3MCwgMHg0YmQwLCAweDAwNzgsIDB4NGJjYywKKwkweDY4MDgsIDB4YTA4NCwgMHhmZmZkLCAweDY4MGEsIDB4NjgxYiwgMHgwMDQ4LCAweDIwMDksIDB4NTA1YiwKKwkweDIwMGIsIDB4MDAwNywgMHg3ODRjLCAweDc4NGEsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4MjA3OSwKKwkweDUwMDAsIDB4MTA3OCwgMHg0YzBhLCAweDEwNzgsIDB4NGJlZSwgMHgxMDc4LCAweDRiZmMsIDB4NzgzMywKKwkweDAwMDAsIDB4Nzg0NywgMHgwMDAwLCAweDc4NGIsIDB4MDAwMCwgMHgwMDdjLCAweDIwMTksIDB4MDAwMywKKwkweDIwMTEsIDB4NTA0NiwgMHgyMjA0LCAweGEwODYsIDB4MDAzYywgMHgwMDQwLCAweDRiZjksIDB4MjAxOSwKKwkweDAwMDIsIDB4N2IyYSwgMHg3YjJlLCAweDAwN2MsIDB4MjAxOSwgMHgwMDM5LCAweDIwMTEsIDB4NTA0NiwKKwkweDIyMDQsIDB4YTA4NiwgMHgwMDNjLCAweDAwNDAsIDB4NGMwNywgMHgyMDE5LCAweDAwMjcsIDB4N2IzNiwKKwkweDdiM2EsIDB4MDA3YywgMHgyMDE5LCAweDM5NzEsIDB4MjAxMSwgMHg1MDQ2LCAweDIyMDQsIDB4YTA4NiwKKwkweDAwM2MsIDB4MDA0MCwgMHg0YzE1LCAweDIwMTksIDB4MjYyNiwgMHg3YjIyLCAweDdiMjYsIDB4NzgzZiwKKwkweDAwMDAsIDB4Nzg0MywgMHgwMDBhLCAweDAwN2MsIDB4MDAyMCwgMHgwMDJiLCAweDAwMDAsIDB4MDAyMCwKKwkweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwKKwkweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwKKwkweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwKKwkweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAxNCwKKwkweDAwMTQsIDB4OTg0OSwgMHgwMDE0LCAweDAwMTQsIDB4MDAxNCwgMHgwMDE0LCAweDAwMTQsIDB4MDAxNCwKKwkweDAwMTQsIDB4MDA4MCwgMHgwMDBmLCAweDAwMDAsIDB4MDIwMSwgMHgwNjA0LCAweDBjMDgsIDB4MjEyMCwKKwkweDQwMjIsIDB4Zjg4MCwgMHgwMDE4LCAweDMwMGIsIDB4YTIwMSwgMHgwMDE0LCAweGEyMDAsIDB4MDAxNCwKKwkweGEyMDAsIDB4MDIxNCwgMHgwMDAwLCAweDAwNmMsIDB4MDAwMiwgMHgwMDE0LCAweDk4ZDUsIDB4MDA5ZSwKKwkweDAwOWIsIDB4YTIwMiwgMHg4ODM4LCAweDM4MDYsIDB4ODgzOSwgMHgyMGMzLCAweDA4NjQsIDB4OTg4OSwKKwkweDI4YzEsIDB4OWNiNiwgMHhhMjAzLCAweDMwMGMsIDB4Mjg0NiwgMHg4MTYxLCAweDg0NmEsIDB4ODMwMCwKKwkweDE4NTYsIDB4ODgzYSwgMHg5ODY1LCAweDI4ZjIsIDB4OWM5NSwgMHg5ODU4LCAweDMwMGMsIDB4MjhlMSwKKwkweDljOTUsIDB4MjgwOSwgMHhhMjA2LCAweDY0YzAsIDB4NjdhMCwgMHg2ZmMwLCAweDE4MTQsIDB4ODgzYiwKKwkweDc4MmMsIDB4Nzg2ZCwgMHg5ODc5LCAweDI4MmIsIDB4YTIwNywgMHg2NGEwLCAweDY3YTAsIDB4NmZjMCwKKwkweDE4MTQsIDB4ODgzYiwgMHg3ODIyLCAweDg4M2UsIDB4OTg3ZCwgMHg4NTc2LCAweDg2NzcsIDB4MjA2YiwKKwkweDI4YzEsIDB4OWNiNiwgMHgyMDQ0LCAweDIxMDMsIDB4MjBhMiwgMHgyMDgxLCAweDk4NjUsIDB4YTIwOSwKKwkweDI5MDEsIDB4OTg5MSwgMHgwMDE0LCAweGEyMDUsIDB4YTMwMCwgMHgxODcyLCAweDg3OWEsIDB4ODgzYywKKwkweDFmZTIsIDB4YzYwMSwgMHhhMjBhLCAweDg1NmUsIDB4MDcwNCwgMHg5Yzk1LCAweDAwMTQsIDB4YTIwNCwKKwkweGEzMDAsIDB4MzAwOSwgMHgxOWUyLCAweGY4NjgsIDB4ODE3NiwgMHg4NmViLCAweDg1ZWIsIDB4ODcyZSwKKwkweDg3YTksIDB4ODgzZiwgMHgwOGU2LCAweDk4OTUsIDB4Zjg4MSwgMHg5ODkwLCAweGM4MDEsIDB4MDAxNCwKKwkweGY4YzEsIDB4MDAxNiwgMHg4NWIyLCAweDgwZjAsIDB4OTUzMiwgMHhmYjAyLCAweDFkZTIsIDB4MDAxNCwKKwkweDg1MzIsIDB4ZjI0MSwgMHgwMDE0LCAweDFkZTIsIDB4ODRhOCwgMHhkN2EwLCAweDFmZTYsIDB4MDAxNCwKKwkweGEyMDgsIDB4NjA0MywgMHg4MDA4LCAweDFkYzEsIDB4MDAxNiwgMHg4MzAwLCAweDgxNjAsIDB4ODQyYSwKKwkweGYwNDEsIDB4MzAwOCwgMHg4NGE4LCAweDExZDYsIDB4NzA0MiwgMHgyMGRkLCAweDAwMTEsIDB4MjBkNSwKKwkweDg4MjIsIDB4MDAxNiwgMHg4MDAwLCAweDI4NDcsIDB4MTAxMSwgMHg5OGM4LCAweDgwMDAsIDB4YTAwMCwKKwkweDI4MDIsIDB4MTAxMSwgMHg5OGNlLCAweDk4NjUsIDB4MjgzZSwgMHgxMDExLCAweDk4ZDIsIDB4YTIwYiwKKwkweDAwMTcsIDB4MzAwYywgMHhhMzAwLCAweDFkZTIsIDB4ZGI4MSwgMHgwMDE0LCAweDAyMTAsIDB4OThkZiwKKwkweDAwMTQsIDB4MjZlMCwgMHg4NzNhLCAweGZiMDIsIDB4MTlmMiwgMHgxZmUyLCAweDAwMTQsIDB4YTIwZCwKKwkweDM4MDYsIDB4MDIxMCwgMHg5Y2JiLCAweDA3MDQsIDB4MDAwMCwgMHgwMDZjLCAweDAwMDIsIDB4OTg0ZiwKKwkweDAwMTQsIDB4MDA5ZSwgMHgwMGEwLCAweDAwMTcsIDB4NjBmZiwgMHgzMDBjLCAweDg3MjAsIDB4YTIxMSwKKwkweDljZDAsIDB4ODc3MiwgMHg4ODM3LCAweDIxMDEsIDB4OTg3YSwgMHgxMGQyLCAweDc4ZTIsIDB4OWNkMywKKwkweDk4NTksIDB4ZDk4NCwgMHhmMGUyLCAweGYwYTEsIDB4OThjZCwgMHgwMDE0LCAweDg4MzEsIDB4ZDE2NiwKKwkweDg4MzAsIDB4ODAwZiwgMHg5NDAxLCAweGI1MjAsIDB4YzgwMiwgMHg4ODIwLCAweDk4N2EsIDB4MjMwMSwKKwkweDk4N2EsIDB4MTBkMiwgMHg3OGU0LCAweDljZDMsIDB4ODgyMSwgMHg4ODIwLCAweDk4NTksIDB4ZjEyMywKKwkweGYxNDIsIDB4ZjEwMSwgMHg5OGM2LCAweDEwZDIsIDB4NzBmNiwgMHg4ODMyLCAweDgyMDMsIDB4ODcwYywKKwkweGQ5OWUsIDB4NjAwMSwgMHgwMDE0LCAweDY4NDUsIDB4MDIxNCwgMHhhMjFiLCAweDljZDAsIDB4MjAwMSwKKwkweDk4YzUsIDB4ODIwMSwgMHgxODUyLCAweGQxODQsIDB4ZDE2MywgMHg4ODM0LCAweDgwMDEsIDB4OTg4ZCwKKwkweDMwMjcsIDB4ODRhOCwgMHgxYTU2LCAweDg4MzMsIDB4MDAxNCwgMHhhMjE4LCAweDY5ODEsIDB4OWNiYywKKwkweDZiMmEsIDB4NjkwMiwgMHgxODM0LCAweDk4OWQsIDB4MTgxNCwgMHg4MDEwLCAweDg1OTIsIDB4ODAyNiwKKwkweDg0YjksIDB4NzAyMSwgMHgwMDE0LCAweGEzMDAsIDB4NjllMSwgMHg5Y2E5LCAweDY5NGIsIDB4YTIxMywKKwkweDE0NjIsIDB4YTIxMywgMHg4MDAwLCAweDE2ZTEsIDB4OThiNSwgMHg4MDIzLCAweDE2ZTEsIDB4ODAwMSwKKwkweDEwZjEsIDB4MDAxNiwgMHg2OTY5LCAweGEyMTQsIDB4NjFjMiwgMHg4MDAyLCAweDE0ZTEsIDB4ODAwNCwKKwkweDE2ZTEsIDB4MDEwMSwgMHgzMDBhLCAweDg4MjcsIDB4MDAxNCwgMHhhMjE3LCAweDljYmMsIDB4MDAxNCwKKwkweGEzMDAsIDB4ODE4MSwgMHg4NDJhLCAweDg0YTgsIDB4MWNlNiwgMHg4ODJjLCAweDAwMTYsIDB4YTIxMiwKKwkweDljZDAsIDB4MTBkMiwgMHg3MGU0LCAweDAwMDQsIDB4ODAwNywgMHg5NDI0LCAweGNjMWEsIDB4OWNkMywKKwkweDk4YzUsIDB4ODgyNywgMHgzMDBhLCAweDAwMTMsIDB4ODAwMCwgMHg4NGE0LCAweDAwMTYsIDB4MTFjMiwKKwkweDIxMWUsIDB4ODcwZSwgMHhhMjFkLCAweDAwMTQsIDB4ODc4ZSwgMHgwMDE2LCAweGEyMWMsIDB4MTAzNSwKKwkweDk4OTEsIDB4YTIxMCwgMHhhMDAwLCAweDgwMTAsIDB4ODU5MiwgMHg4NTNiLCAweGQwNDQsIDB4ODAyMiwKKwkweDM4MDcsIDB4ODRiYiwgMHg5OGVhLCAweDgwMjEsIDB4MzgwNywgMHg4NGI5LCAweDMwMGMsIDB4ODE3ZSwKKwkweDg3MmIsIDB4ODc3MiwgMHg5ODkxLCAweDAwMDAsIDB4MDAyMCwgMHgwMDJiLCAweDAwMDAsIDB4MDAyMCwKKwkweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwKKwkweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwKKwkweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwKKwkweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAxNCwKKwkweDAwMTQsIDB4OTg0OSwgMHgwMDE0LCAweDAwMTQsIDB4OThlYSwgMHg5OGQ1LCAweDAwMTQsIDB4MDAxNCwKKwkweDAwMTQsIDB4MDA4MCwgMHgwMTNmLCAweDAwMDAsIDB4MDIwMSwgMHgwNjA0LCAweDBjMDgsIDB4MjEyMCwKKwkweDQwMjIsIDB4Zjg4MCwgMHgwMDE4LCAweDMwMGIsIDB4YTIwMSwgMHgwMDE0LCAweGEyMDAsIDB4MDAxNCwKKwkweGEyMDAsIDB4MDIxNCwgMHhhMjAyLCAweDg4MzgsIDB4MzgwNiwgMHg4ODM5LCAweDIwYzMsIDB4MDg2NCwKKwkweGE4MzMsIDB4MjhjMSwgMHg5Y2I2LCAweGEyMDMsIDB4MzAwYywgMHgyODQ2LCAweDgxNjEsIDB4ODQ2YSwKKwkweDgzMDAsIDB4MTg1NiwgMHg4ODNhLCAweGE4MDQsIDB4MjhmMiwgMHg5Yzk1LCAweGE4ZjQsIDB4MzAwYywKKwkweDI4ZTEsIDB4OWM5NSwgMHgyODA5LCAweGEyMDYsIDB4NjRjMCwgMHg2N2EwLCAweDZmYzAsIDB4MTgxNCwKKwkweDg4M2IsIDB4NzgyYywgMHg3ODZkLCAweGE4MDgsIDB4MjgyYiwgMHhhMjA3LCAweDY0YTAsIDB4NjdhMCwKKwkweDZmYzAsIDB4MTgxNCwgMHg4ODNiLCAweDc4MjIsIDB4ODgzZSwgMHhhODAyLCAweDg1NzYsIDB4ODY3NywKKwkweDIwNmIsIDB4MjhjMSwgMHg5Y2I2LCAweDIwNDQsIDB4MjEwMywgMHgyMGEyLCAweDIwODEsIDB4YThlMCwKKwkweGEyMDksIDB4MjkwMSwgMHhhODA5LCAweDAwMTQsIDB4YTIwNSwgMHhhMzAwLCAweDE4NzIsIDB4ODc5YSwKKwkweDg4M2MsIDB4MWZlMiwgMHhjNjAxLCAweGEyMGEsIDB4ODU2ZSwgMHgwNzA0LCAweDljOTUsIDB4MDAxNCwKKwkweGEyMDQsIDB4YTMwMCwgMHgzMDA5LCAweDE5ZTIsIDB4Zjg2OCwgMHg4MTc2LCAweDg2ZWIsIDB4ODVlYiwKKwkweDg3MmUsIDB4ODdhOSwgMHg4ODNmLCAweDA4ZTYsIDB4YThmMywgMHhmODgxLCAweGE4ZWMsIDB4YzgwMSwKKwkweDAwMTQsIDB4ZjhjMSwgMHgwMDE2LCAweDg1YjIsIDB4ODBmMCwgMHg5NTMyLCAweGZiMDIsIDB4MWRlMiwKKwkweDAwMTQsIDB4ODUzMiwgMHhmMjQxLCAweDAwMTQsIDB4MWRlMiwgMHg4NGE4LCAweGQ3YTAsIDB4MWZlNiwKKwkweDAwMTQsIDB4YTIwOCwgMHg2MDQzLCAweDgwMDgsIDB4MWRjMSwgMHgwMDE2LCAweDgzMDAsIDB4ODE2MCwKKwkweDg0MmEsIDB4ZjA0MSwgMHgzMDA4LCAweDg0YTgsIDB4MTFkNiwgMHg3MDQyLCAweDIwZGQsIDB4MDAxMSwKKwkweDIwZDUsIDB4ODgyMiwgMHgwMDE2LCAweDgwMDAsIDB4Mjg0NywgMHgxMDExLCAweGE4ZmMsIDB4ODAwMCwKKwkweGEwMDAsIDB4MjgwMiwgMHgxMDExLCAweGE4ZmQsIDB4YTg5MywgMHgyODNlLCAweDEwMTEsIDB4YThmZCwKKwkweGEyMGIsIDB4MDAxNywgMHgzMDBjLCAweGEzMDAsIDB4MWRlMiwgMHhkYjgxLCAweDAwMTQsIDB4MDIxMCwKKwkweGE4MDEsIDB4MDAxNCwgMHgyNmUwLCAweDg3M2EsIDB4ZmIwMiwgMHgxOWYyLCAweDFmZTIsIDB4MDAxNCwKKwkweGEyMGQsIDB4MzgwNiwgMHgwMjEwLCAweDljYmIsIDB4MDcwNCwgMHgwMDE3LCAweDYwZmYsIDB4MzAwYywKKwkweDg3MjAsIDB4YTIxMSwgMHg5ZDZiLCAweDg3NzIsIDB4ODgzNywgMHgyMTAxLCAweGE4MjEsIDB4MTBkMiwKKwkweDc4ZTIsIDB4OWQ2ZSwgMHhhOGZjLCAweGQ5ODQsIDB4ZjBlMiwgMHhmMGExLCAweGE4NmMsIDB4MDAxNCwKKwkweDg4MzEsIDB4ZDE2NiwgMHg4ODMwLCAweDgwMGYsIDB4OTQwMSwgMHhiNTIwLCAweGM4MDIsIDB4ODgyMCwKKwkweGE4MGYsIDB4MjMwMSwgMHhhODBkLCAweDEwZDIsIDB4NzhlNCwgMHg5ZDZlLCAweDg4MjEsIDB4ODgyMCwKKwkweGE4ZTYsIDB4ZjEyMywgMHhmMTQyLCAweGYxMDEsIDB4YTg0ZiwgMHgxMGQyLCAweDcwZjYsIDB4ODgzMiwKKwkweDgyMDMsIDB4ODcwYywgMHhkOTllLCAweDYwMDEsIDB4MDAxNCwgMHg2ODQ1LCAweDAyMTQsIDB4YTIxYiwKKwkweDlkNmIsIDB4MjAwMSwgMHhhODQwLCAweDgyMDEsIDB4MTg1MiwgMHhkMTg0LCAweGQxNjMsIDB4ODgzNCwKKwkweDgwMDEsIDB4YTgwMSwgMHgzMDI3LCAweDg0YTgsIDB4MWE1NiwgMHg4ODMzLCAweDAwMTQsIDB4YTIxOCwKKwkweDY5ODEsIDB4OWQ1NywgMHg2YjJhLCAweDY5MDIsIDB4MTgzNCwgMHhhODA1LCAweDE4MTQsIDB4ODAxMCwKKwkweDg1OTIsIDB4ODAyNiwgMHg4NGI5LCAweDcwMjEsIDB4MDAxNCwgMHhhMzAwLCAweDY5ZTEsIDB4OWQ0NCwKKwkweDY5NGIsIDB4YTIxMywgMHgxNDYyLCAweGEyMTMsIDB4ODAwMCwgMHgxNmUxLCAweGE4MGMsIDB4ODAyMywKKwkweDE2ZTEsIDB4ODAwMSwgMHgxMGYxLCAweDAwMTYsIDB4Njk2OSwgMHhhMjE0LCAweDYxYzIsIDB4ODAwMiwKKwkweDE0ZTEsIDB4ODAwNCwgMHgxNmUxLCAweDAxMDEsIDB4MzAwYSwgMHg4ODI3LCAweDAwMTQsIDB4YTIxNywKKwkweDlkNTcsIDB4MDAxNCwgMHhhMzAwLCAweDgxODEsIDB4ODQyYSwgMHg4NGE4LCAweDFjZTYsIDB4ODgyYywKKwkweDAwMTYsIDB4YTIxMiwgMHg5ZDZiLCAweDEwZDIsIDB4NzBlNCwgMHgwMDA0LCAweDgwMDcsIDB4OTQyNCwKKwkweGNjMWEsIDB4OWQ2ZSwgMHhhOGY4LCAweDg4MjcsIDB4MzAwYSwgMHgwMDEzLCAweDgwMDAsIDB4ODRhNCwKKwkweDAwMTYsIDB4MTFjMiwgMHgyMTFlLCAweDg3MGUsIDB4YTIxZCwgMHgwMDE0LCAweDg3OGUsIDB4MDAxNiwKKwkweGEyMWMsIDB4MTAzNSwgMHhhOGI0LCAweGEyMTAsIDB4MzgwNywgMHgzMDBjLCAweDgxN2UsIDB4ODcyYiwKKwkweDg3NzIsIDB4YThhZCwgMHgwMDAwLCAweDhlYzYKK307CisKKyNlbmRpZiAvKiBSRUxPQURfRklSTVdBUkUgKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHJpc2NfY29kZV9sZW5ndGgwMSA9IDB4M2YxNDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbG9naWNwdGkuYyBiL2RyaXZlcnMvc2NzaS9xbG9naWNwdGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTE3YWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aS5jCkBAIC0wLDAgKzEsMTU0MSBAQAorLyogcWxvZ2ljcHRpLmM6IFBlcmZvcm1hbmNlIFRlY2hub2xvZ2llcyBRbG9naWNJU1Agc2J1cyBjYXJkIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwZnMucnV0Z2Vycy5lZHUpCisgKgorICogQSBsb3Qgb2YgdGhpcyBkcml2ZXIgd2FzIGRpcmVjdGx5IHN0b2xlbiBmcm9tIEVyaWsgSC4gTW9lJ3MgUENJCisgKiBRbG9naWMgSVNQIGRyaXZlci4gIE11Y2hvIGt1ZG9zIHRvIGhpbSBmb3IgdGhpcyBjb2RlLgorICoKKyAqIEFuIGV2ZW4gYmlnZ2VyIGt1ZG9zIHRvIEpvaG4gR3JhbmEgYXQgUGVyZm9ybWFuY2UgVGVjaG5vbG9naWVzCisgKiBmb3IgcHJvdmlkaW5nIG1lIHdpdGggdGhlIGhhcmR3YXJlIHRvIHdyaXRlIHRoaXMgZHJpdmVyLCB5b3UgcnVsZQorICogSm9obiB5b3UgcmVhbGx5IGRvLgorICoKKyAqIE1heSwgMiwgMTk5NzogQWRkZWQgc3VwcG9ydCBmb3IgUUxHQyxpc3AgLS1qagorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlICJxbG9naWNwdGkuaCIKKworI2luY2x1ZGUgPGFzbS9zYnVzLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vb3BsaWIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfcmVxdWVzdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisKKworI2RlZmluZSBNQVhfVEFSR0VUUwkxNgorI2RlZmluZSBNQVhfTFVOUwk4CS8qIDMyIGZvciAxLjMxIEYvVyAqLworCisjZGVmaW5lIERFRkFVTFRfTE9PUF9DT1VOVAkxMDAwMAorCisjaW5jbHVkZSAicWxvZ2ljcHRpX2FzbS5jIgorCitzdGF0aWMgc3RydWN0IHFsb2dpY3B0aSAqcXB0aWNoYWluID0gTlVMTDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socXB0aWNoYWluX2xvY2spOworc3RhdGljIGludCBxcHRpc19ydW5uaW5nID0gMDsKKworI2RlZmluZSBQQUNLQihhLCBiKQkJCSgoKGEpPDw0KXwoYikpCisKK3N0YXRpYyBjb25zdCB1X2NoYXIgbWJveF9wYXJhbVtdID0geworCVBBQ0tCKDEsIDEpLAkvKiBNQk9YX05PX09QICovCisJUEFDS0IoNSwgNSksCS8qIE1CT1hfTE9BRF9SQU0gKi8KKwlQQUNLQigyLCAwKSwJLyogTUJPWF9FWEVDX0ZJUk1XQVJFICovCisJUEFDS0IoNSwgNSksCS8qIE1CT1hfRFVNUF9SQU0gKi8KKwlQQUNLQigzLCAzKSwJLyogTUJPWF9XUklURV9SQU1fV09SRCAqLworCVBBQ0tCKDIsIDMpLAkvKiBNQk9YX1JFQURfUkFNX1dPUkQgKi8KKwlQQUNLQig2LCA2KSwJLyogTUJPWF9NQUlMQk9YX1JFR19URVNUICovCisJUEFDS0IoMiwgMyksCS8qIE1CT1hfVkVSSUZZX0NIRUNLU1VNCSovCisJUEFDS0IoMSwgMyksCS8qIE1CT1hfQUJPVVRfRklSTVdBUkUgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDA5ICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAwYSAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwMGIgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDBjICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAwZCAqLworCVBBQ0tCKDEsIDIpLAkvKiBNQk9YX0NIRUNLX0ZJUk1XQVJFICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAwZiAqLworCVBBQ0tCKDUsIDUpLAkvKiBNQk9YX0lOSVRfUkVRX1FVRVVFICovCisJUEFDS0IoNiwgNiksCS8qIE1CT1hfSU5JVF9SRVNfUVVFVUUgKi8KKwlQQUNLQig0LCA0KSwJLyogTUJPWF9FWEVDVVRFX0lPQ0IgKi8KKwlQQUNLQigyLCAyKSwJLyogTUJPWF9XQUtFX1VQCSovCisJUEFDS0IoMSwgNiksCS8qIE1CT1hfU1RPUF9GSVJNV0FSRSAqLworCVBBQ0tCKDQsIDQpLAkvKiBNQk9YX0FCT1JUICovCisJUEFDS0IoMiwgMiksCS8qIE1CT1hfQUJPUlRfREVWSUNFICovCisJUEFDS0IoMywgMyksCS8qIE1CT1hfQUJPUlRfVEFSR0VUICovCisJUEFDS0IoMiwgMiksCS8qIE1CT1hfQlVTX1JFU0VUICovCisJUEFDS0IoMiwgMyksCS8qIE1CT1hfU1RPUF9RVUVVRSAqLworCVBBQ0tCKDIsIDMpLAkvKiBNQk9YX1NUQVJUX1FVRVVFICovCisJUEFDS0IoMiwgMyksCS8qIE1CT1hfU0lOR0xFX1NURVBfUVVFVUUgKi8KKwlQQUNLQigyLCAzKSwJLyogTUJPWF9BQk9SVF9RVUVVRSAqLworCVBBQ0tCKDIsIDQpLAkvKiBNQk9YX0dFVF9ERVZfUVVFVUVfU1RBVFVTICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAxZSAqLworCVBBQ0tCKDEsIDMpLAkvKiBNQk9YX0dFVF9GSVJNV0FSRV9TVEFUVVMgKi8KKwlQQUNLQigxLCAyKSwJLyogTUJPWF9HRVRfSU5JVF9TQ1NJX0lEICovCisJUEFDS0IoMSwgMiksCS8qIE1CT1hfR0VUX1NFTEVDVF9USU1FT1VUICovCisJUEFDS0IoMSwgMyksCS8qIE1CT1hfR0VUX1JFVFJZX0NPVU5UCSovCisJUEFDS0IoMSwgMiksCS8qIE1CT1hfR0VUX1RBR19BR0VfTElNSVQgKi8KKwlQQUNLQigxLCAyKSwJLyogTUJPWF9HRVRfQ0xPQ0tfUkFURSAqLworCVBBQ0tCKDEsIDIpLAkvKiBNQk9YX0dFVF9BQ1RfTkVHX1NUQVRFICovCisJUEFDS0IoMSwgMiksCS8qIE1CT1hfR0VUX0FTWU5DX0RBVEFfU0VUVVBfVElNRSAqLworCVBBQ0tCKDEsIDMpLAkvKiBNQk9YX0dFVF9TQlVTX1BBUkFNUyAqLworCVBBQ0tCKDIsIDQpLAkvKiBNQk9YX0dFVF9UQVJHRVRfUEFSQU1TICovCisJUEFDS0IoMiwgNCksCS8qIE1CT1hfR0VUX0RFVl9RVUVVRV9QQVJBTVMgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDJhICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAyYiAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwMmMgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDJkICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAyZSAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwMmYgKi8KKwlQQUNLQigyLCAyKSwJLyogTUJPWF9TRVRfSU5JVF9TQ1NJX0lEICovCisJUEFDS0IoMiwgMiksCS8qIE1CT1hfU0VUX1NFTEVDVF9USU1FT1VUICovCisJUEFDS0IoMywgMyksCS8qIE1CT1hfU0VUX1JFVFJZX0NPVU5UCSovCisJUEFDS0IoMiwgMiksCS8qIE1CT1hfU0VUX1RBR19BR0VfTElNSVQgKi8KKwlQQUNLQigyLCAyKSwJLyogTUJPWF9TRVRfQ0xPQ0tfUkFURSAqLworCVBBQ0tCKDIsIDIpLAkvKiBNQk9YX1NFVF9BQ1RJVkVfTkVHX1NUQVRFICovCisJUEFDS0IoMiwgMiksCS8qIE1CT1hfU0VUX0FTWU5DX0RBVEFfU0VUVVBfVElNRSAqLworCVBBQ0tCKDMsIDMpLAkvKiBNQk9YX1NFVF9TQlVTX0NPTlRST0xfUEFSQU1TICovCisJUEFDS0IoNCwgNCksCS8qIE1CT1hfU0VUX1RBUkdFVF9QQVJBTVMgKi8KKwlQQUNLQig0LCA0KSwJLyogTUJPWF9TRVRfREVWX1FVRVVFX1BBUkFNUyAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwM2EgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDNiICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAzYyAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwM2QgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDNlICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAzZiAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwNDAgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDQxICovCisJUEFDS0IoMCwgMCkJLyogMHgwMDQyICovCit9OworCisjZGVmaW5lIE1BWF9NQk9YX0NPTU1BTkQJKHNpemVvZihtYm94X3BhcmFtKS9zaXplb2YodV9zaG9ydCkpCisKKy8qIHF1ZXVlIGxlbmd0aCdzIF9tdXN0XyBiZSBwb3dlciBvZiB0d286ICovCisjZGVmaW5lIFFVRVVFX0RFUFRIKGluLCBvdXQsIHFsKQkoKGluIC0gb3V0KSAmIChxbCkpCisjZGVmaW5lIFJFUV9RVUVVRV9ERVBUSChpbiwgb3V0KQlRVUVVRV9ERVBUSChpbiwgb3V0LCAJCSAgICAgXAorCQkJCQkJICAgIFFMT0dJQ1BUSV9SRVFfUVVFVUVfTEVOKQorI2RlZmluZSBSRVNfUVVFVUVfREVQVEgoaW4sIG91dCkJUVVFVUVfREVQVEgoaW4sIG91dCwgUkVTX1FVRVVFX0xFTikKKworc3RhdGljIGlubGluZSB2b2lkIHFsb2dpY3B0aV9lbmFibGVfaXJxcyhzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpKQoreworCXNidXNfd3JpdGV3KFNCVVNfQ1RSTF9FUklSUSB8IFNCVVNfQ1RSTF9HRU5BQiwKKwkJICAgIHFwdGktPnFyZWdzICsgU0JVU19DVFJMKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHFsb2dpY3B0aV9kaXNhYmxlX2lycXMoc3RydWN0IHFsb2dpY3B0aSAqcXB0aSkKK3sKKwlzYnVzX3dyaXRldygwLCBxcHRpLT5xcmVncyArIFNCVVNfQ1RSTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc2J1c19jZmcxKHN0cnVjdCBxbG9naWNwdGkgKnFwdGkpCit7CisJdTE2IHZhbDsKKwl1OCBidXJzdHMgPSBxcHRpLT5idXJzdHM7CisKKyNpZiAwCS8qIEl0IGFwcGVhcnMgdGhhdCBhdCBsZWFzdCBQVEkgY2FyZHMgZG8gbm90IHN1cHBvcnQKKwkgKiA2NC1ieXRlIGJ1cnN0cyBhbmQgdGhhdCBzZXR0aW5nIHRoZSBCNjQgYml0IGFjdHVhbGx5CisJICogaXMgYSBub3AgYW5kIHRoZSBjaGlwIGVuZHMgdXAgdXNpbmcgdGhlIHNtYWxsZXN0IGJ1cnN0CisJICogc2l6ZS4gLURhdmVNCisJICovCisJaWYgKHNidXNfY2FuX2J1cnN0NjQocXB0aS0+c2RldikgJiYgKGJ1cnN0cyAmIERNQV9CVVJTVDY0KSkgeworCQl2YWwgPSAoU0JVU19DRkcxX0JFTkFCIHwgU0JVU19DRkcxX0I2NCk7CisJfSBlbHNlCisjZW5kaWYKKwlpZiAoYnVyc3RzICYgRE1BX0JVUlNUMzIpIHsKKwkJdmFsID0gKFNCVVNfQ0ZHMV9CRU5BQiB8IFNCVVNfQ0ZHMV9CMzIpOworCX0gZWxzZSBpZiAoYnVyc3RzICYgRE1BX0JVUlNUMTYpIHsKKwkJdmFsID0gKFNCVVNfQ0ZHMV9CRU5BQiB8IFNCVVNfQ0ZHMV9CMTYpOworCX0gZWxzZSBpZiAoYnVyc3RzICYgRE1BX0JVUlNUOCkgeworCQl2YWwgPSAoU0JVU19DRkcxX0JFTkFCIHwgU0JVU19DRkcxX0I4KTsKKwl9IGVsc2UgeworCQl2YWwgPSAwOyAvKiBObyBzYnVzIGJ1cnN0cyBmb3IgeW91Li4uICovCisJfQorCXNidXNfd3JpdGV3KHZhbCwgcXB0aS0+cXJlZ3MgKyBTQlVTX0NGRzEpOworfQorCitzdGF0aWMgaW50IHFsb2dpY3B0aV9tYm94X2NvbW1hbmQoc3RydWN0IHFsb2dpY3B0aSAqcXB0aSwgdV9zaG9ydCBwYXJhbVtdLCBpbnQgZm9yY2UpCit7CisJaW50IGxvb3BfY291bnQ7CisJdTE2IHRtcDsKKworCWlmIChtYm94X3BhcmFtW3BhcmFtWzBdXSA9PSAwKQorCQlyZXR1cm4gMTsKKworCS8qIFNldCBTQlVTIHNlbWFwaG9yZS4gKi8KKwl0bXAgPSBzYnVzX3JlYWR3KHFwdGktPnFyZWdzICsgU0JVU19TRU1BUEhPUkUpOworCXRtcCB8PSBTQlVTX1NFTUFQSE9SRV9MQ0s7CisJc2J1c193cml0ZXcodG1wLCBxcHRpLT5xcmVncyArIFNCVVNfU0VNQVBIT1JFKTsKKworCS8qIFdhaXQgZm9yIGhvc3QgSVJRIGJpdCB0byBjbGVhci4gKi8KKwlsb29wX2NvdW50ID0gREVGQVVMVF9MT09QX0NPVU5UOworCXdoaWxlICgtLWxvb3BfY291bnQgJiYgKHNidXNfcmVhZHcocXB0aS0+cXJlZ3MgKyBIQ0NUUkwpICYgSENDVFJMX0hJUlEpKSB7CisJCWJhcnJpZXIoKTsKKwkJY3B1X3JlbGF4KCk7CisJfQorCWlmICghbG9vcF9jb3VudCkKKwkJcHJpbnRrKEtFUk5fRU1FUkcgInFsb2dpY3B0aTogbWJveF9jb21tYW5kIGxvb3AgdGltZW91dCAjMVxuIik7CisKKwkvKiBXcml0ZSBtYWlsYm94IGNvbW1hbmQgcmVnaXN0ZXJzLiAqLworCXN3aXRjaCAobWJveF9wYXJhbVtwYXJhbVswXV0gPj4gNCkgeworCWNhc2UgNjogc2J1c193cml0ZXcocGFyYW1bNV0sIHFwdGktPnFyZWdzICsgTUJPWDUpOworCWNhc2UgNTogc2J1c193cml0ZXcocGFyYW1bNF0sIHFwdGktPnFyZWdzICsgTUJPWDQpOworCWNhc2UgNDogc2J1c193cml0ZXcocGFyYW1bM10sIHFwdGktPnFyZWdzICsgTUJPWDMpOworCWNhc2UgMzogc2J1c193cml0ZXcocGFyYW1bMl0sIHFwdGktPnFyZWdzICsgTUJPWDIpOworCWNhc2UgMjogc2J1c193cml0ZXcocGFyYW1bMV0sIHFwdGktPnFyZWdzICsgTUJPWDEpOworCWNhc2UgMTogc2J1c193cml0ZXcocGFyYW1bMF0sIHFwdGktPnFyZWdzICsgTUJPWDApOworCX0KKworCS8qIENsZWFyIFJJU0MgaW50ZXJydXB0LiAqLworCXRtcCA9IHNidXNfcmVhZHcocXB0aS0+cXJlZ3MgKyBIQ0NUUkwpOworCXRtcCB8PSBIQ0NUUkxfQ1JJUlE7CisJc2J1c193cml0ZXcodG1wLCBxcHRpLT5xcmVncyArIEhDQ1RSTCk7CisKKwkvKiBDbGVhciBTQlVTIHNlbWFwaG9yZS4gKi8KKwlzYnVzX3dyaXRldygwLCBxcHRpLT5xcmVncyArIFNCVVNfU0VNQVBIT1JFKTsKKworCS8qIFNldCBIT1NUIGludGVycnVwdC4gKi8KKwl0bXAgPSBzYnVzX3JlYWR3KHFwdGktPnFyZWdzICsgSENDVFJMKTsKKwl0bXAgfD0gSENDVFJMX1NISVJROworCXNidXNfd3JpdGV3KHRtcCwgcXB0aS0+cXJlZ3MgKyBIQ0NUUkwpOworCisJLyogV2FpdCBmb3IgSE9TVCBpbnRlcnJ1cHQgY2xlYXJzLiAqLworCWxvb3BfY291bnQgPSBERUZBVUxUX0xPT1BfQ09VTlQ7CisJd2hpbGUgKC0tbG9vcF9jb3VudCAmJgorCSAgICAgICAoc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIEhDQ1RSTCkgJiBIQ0NUUkxfQ1JJUlEpKQorCQl1ZGVsYXkoMjApOworCWlmICghbG9vcF9jb3VudCkKKwkJcHJpbnRrKEtFUk5fRU1FUkcgInFsb2dpY3B0aTogbWJveF9jb21tYW5kWyUwNHhdIGxvb3AgdGltZW91dCAjMlxuIiwKKwkJICAgICAgIHBhcmFtWzBdKTsKKworCS8qIFdhaXQgZm9yIFNCVVMgc2VtYXBob3JlIHRvIGdldCBzZXQuICovCisJbG9vcF9jb3VudCA9IERFRkFVTFRfTE9PUF9DT1VOVDsKKwl3aGlsZSAoLS1sb29wX2NvdW50ICYmCisJICAgICAgICEoc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIFNCVVNfU0VNQVBIT1JFKSAmIFNCVVNfU0VNQVBIT1JFX0xDSykpIHsKKwkJdWRlbGF5KDIwKTsKKworCQkvKiBXb3JrYXJvdW5kIGZvciBzb21lIGJ1Z2d5IGNoaXBzLiAqLworCQlpZiAoc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIE1CT1gwKSAmIDB4NDAwMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoIWxvb3BfY291bnQpCisJCXByaW50ayhLRVJOX0VNRVJHICJxbG9naWNwdGk6IG1ib3hfY29tbWFuZFslMDR4XSBsb29wIHRpbWVvdXQgIzNcbiIsCisJCSAgICAgICBwYXJhbVswXSk7CisKKwkvKiBXYWl0IGZvciBNQk9YIGJ1c3kgY29uZGl0aW9uIHRvIGdvIGF3YXkuICovCisJbG9vcF9jb3VudCA9IERFRkFVTFRfTE9PUF9DT1VOVDsKKwl3aGlsZSAoLS1sb29wX2NvdW50ICYmIChzYnVzX3JlYWR3KHFwdGktPnFyZWdzICsgTUJPWDApID09IDB4MDQpKQorCQl1ZGVsYXkoMjApOworCWlmICghbG9vcF9jb3VudCkKKwkJcHJpbnRrKEtFUk5fRU1FUkcgInFsb2dpY3B0aTogbWJveF9jb21tYW5kWyUwNHhdIGxvb3AgdGltZW91dCAjNFxuIiwKKwkJICAgICAgIHBhcmFtWzBdKTsKKworCS8qIFJlYWQgYmFjayBvdXRwdXQgcGFyYW1ldGVycy4gKi8KKwlzd2l0Y2ggKG1ib3hfcGFyYW1bcGFyYW1bMF1dICYgMHhmKSB7CisJY2FzZSA2OiBwYXJhbVs1XSA9IHNidXNfcmVhZHcocXB0aS0+cXJlZ3MgKyBNQk9YNSk7CisJY2FzZSA1OiBwYXJhbVs0XSA9IHNidXNfcmVhZHcocXB0aS0+cXJlZ3MgKyBNQk9YNCk7CisJY2FzZSA0OiBwYXJhbVszXSA9IHNidXNfcmVhZHcocXB0aS0+cXJlZ3MgKyBNQk9YMyk7CisJY2FzZSAzOiBwYXJhbVsyXSA9IHNidXNfcmVhZHcocXB0aS0+cXJlZ3MgKyBNQk9YMik7CisJY2FzZSAyOiBwYXJhbVsxXSA9IHNidXNfcmVhZHcocXB0aS0+cXJlZ3MgKyBNQk9YMSk7CisJY2FzZSAxOiBwYXJhbVswXSA9IHNidXNfcmVhZHcocXB0aS0+cXJlZ3MgKyBNQk9YMCk7CisJfQorCisJLyogQ2xlYXIgUklTQyBpbnRlcnJ1cHQuICovCisJdG1wID0gc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIEhDQ1RSTCk7CisJdG1wIHw9IEhDQ1RSTF9DUklSUTsKKwlzYnVzX3dyaXRldyh0bXAsIHFwdGktPnFyZWdzICsgSENDVFJMKTsKKworCS8qIFJlbGVhc2UgU0JVUyBzZW1hcGhvcmUuICovCisJdG1wID0gc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIFNCVVNfU0VNQVBIT1JFKTsKKwl0bXAgJj0gfihTQlVTX1NFTUFQSE9SRV9MQ0spOworCXNidXNfd3JpdGV3KHRtcCwgcXB0aS0+cXJlZ3MgKyBTQlVTX1NFTUFQSE9SRSk7CisKKwkvKiBXZSdyZSBkb25lLiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWxvZ2ljcHRpX3NldF9ob3N0ZGV2X2RlZmF1bHRzKHN0cnVjdCBxbG9naWNwdGkgKnFwdGkpCit7CisJaW50IGk7CisKKwlxcHRpLT5ob3N0X3BhcmFtLmluaXRpYXRvcl9zY3NpX2lkID0gcXB0aS0+c2NzaV9pZDsKKwlxcHRpLT5ob3N0X3BhcmFtLmJ1c19yZXNldF9kZWxheSA9IDM7CisJcXB0aS0+aG9zdF9wYXJhbS5yZXRyeV9jb3VudCA9IDA7CisJcXB0aS0+aG9zdF9wYXJhbS5yZXRyeV9kZWxheSA9IDU7CisJcXB0aS0+aG9zdF9wYXJhbS5hc3luY19kYXRhX3NldHVwX3RpbWUgPSAzOworCXFwdGktPmhvc3RfcGFyYW0ucmVxX2Fja19hY3RpdmVfbmVnYXRpb24gPSAxOworCXFwdGktPmhvc3RfcGFyYW0uZGF0YV9saW5lX2FjdGl2ZV9uZWdhdGlvbiA9IDE7CisJcXB0aS0+aG9zdF9wYXJhbS5kYXRhX2RtYV9idXJzdF9lbmFibGUgPSAxOworCXFwdGktPmhvc3RfcGFyYW0uY29tbWFuZF9kbWFfYnVyc3RfZW5hYmxlID0gMTsKKwlxcHRpLT5ob3N0X3BhcmFtLnRhZ19hZ2luZyA9IDg7CisJcXB0aS0+aG9zdF9wYXJhbS5zZWxlY3Rpb25fdGltZW91dCA9IDI1MDsKKwlxcHRpLT5ob3N0X3BhcmFtLm1heF9xdWV1ZV9kZXB0aCA9IDI1NjsKKworCWZvcihpID0gMDsgaSA8IE1BWF9UQVJHRVRTOyBpKyspIHsKKwkJLyoKKwkJICogZGlzY29ubmVjdCwgcGFyaXR5LCBhcnEsIHJlbmVnIG9uIHJlc2V0LCBhbmQsIG9kZGx5IGVub3VnaAorCQkgKiB0YWdzLi4udGhlIG1pZGxheWVyJ3Mgbm90aW9uIG9mIHRhZ2dlZCBzdXBwb3J0IGhhcyB0byBtYXRjaAorCQkgKiBvdXIgZGV2aWNlIHNldHRpbmdzLCBhbmQgc2luY2Ugd2UgYmFzZSB3aGV0aGVyIHdlIGVuYWJsZSBhCisJCSAqIHRhZyBvbiBhICBwZXItY21uZCBiYXNpcyB1cG9uIHdoYXQgdGhlIG1pZGxheWVyIHNleiwgd2UKKwkJICogYWN0dWFsbHkgZW5hYmxlIHRoZSBjYXBhYmlsaXR5IGhlcmUuCisJCSAqLworCQlxcHRpLT5kZXZfcGFyYW1baV0uZGV2aWNlX2ZsYWdzID0gMHhjZDsKKwkJcXB0aS0+ZGV2X3BhcmFtW2ldLmV4ZWN1dGlvbl90aHJvdHRsZSA9IDE2OworCQlpZiAocXB0aS0+dWx0cmEpIHsKKwkJCXFwdGktPmRldl9wYXJhbVtpXS5zeW5jaHJvbm91c19wZXJpb2QgPSAxMjsKKwkJCXFwdGktPmRldl9wYXJhbVtpXS5zeW5jaHJvbm91c19vZmZzZXQgPSA4OworCQl9IGVsc2UgeworCQkJcXB0aS0+ZGV2X3BhcmFtW2ldLnN5bmNocm9ub3VzX3BlcmlvZCA9IDI1OworCQkJcXB0aS0+ZGV2X3BhcmFtW2ldLnN5bmNocm9ub3VzX29mZnNldCA9IDEyOworCQl9CisJCXFwdGktPmRldl9wYXJhbVtpXS5kZXZpY2VfZW5hYmxlID0gMTsKKwl9CisJLyogdGhpcyBpcyB2ZXJ5IGltcG9ydGFudCB0byBzZXQhICovCisJcXB0aS0+c2JpdHMgPSAxIDw8IHFwdGktPnNjc2lfaWQ7Cit9CisKK3N0YXRpYyBpbnQgcWxvZ2ljcHRpX3Jlc2V0X2hhcmR3YXJlKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RydWN0IHFsb2dpY3B0aSAqcXB0aSA9IChzdHJ1Y3QgcWxvZ2ljcHRpICopIGhvc3QtPmhvc3RkYXRhOworCXVfc2hvcnQgcGFyYW1bNl07CisJdW5zaWduZWQgc2hvcnQgcmlzY19jb2RlX2FkZHI7CisJaW50IGxvb3BfY291bnQsIGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJpc2NfY29kZV9hZGRyID0gMHgxMDAwOwkvKiBhbGwgbG9hZCBhZGRyZXNzZXMgYXJlIGF0IDB4MTAwMCAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlzYnVzX3dyaXRldyhIQ0NUUkxfUEFVU0UsIHFwdGktPnFyZWdzICsgSENDVFJMKTsKKworCS8qIE9ubHkgcmVzZXQgdGhlIHNjc2kgYnVzIGlmIGl0IGlzIG5vdCBmcmVlLiAqLworCWlmIChzYnVzX3JlYWR3KHFwdGktPnFyZWdzICsgQ1BVX1BDVFJMKSAmIENQVV9QQ1RSTF9CU1kpIHsKKwkJc2J1c193cml0ZXcoQ1BVX09SSURFX1JNT0QsIHFwdGktPnFyZWdzICsgQ1BVX09SSURFKTsKKwkJc2J1c193cml0ZXcoQ1BVX0NNRF9CUkVTRVQsIHFwdGktPnFyZWdzICsgQ1BVX0NNRCk7CisJCXVkZWxheSg0MDApOworCX0KKworCXNidXNfd3JpdGV3KFNCVVNfQ1RSTF9SRVNFVCwgcXB0aS0+cXJlZ3MgKyBTQlVTX0NUUkwpOworCXNidXNfd3JpdGV3KChETUFfQ1RSTF9DQ0xFQVIgfCBETUFfQ1RSTF9DSVJRKSwgcXB0aS0+cXJlZ3MgKyBDTURfRE1BX0NUUkwpOworCXNidXNfd3JpdGV3KChETUFfQ1RSTF9DQ0xFQVIgfCBETUFfQ1RSTF9DSVJRKSwgcXB0aS0+cXJlZ3MgKyBEQVRBX0RNQV9DVFJMKTsKKworCWxvb3BfY291bnQgPSBERUZBVUxUX0xPT1BfQ09VTlQ7CisJd2hpbGUgKC0tbG9vcF9jb3VudCAmJiAoKHNidXNfcmVhZHcocXB0aS0+cXJlZ3MgKyBNQk9YMCkgJiAweGZmKSA9PSAweDA0KSkKKwkJdWRlbGF5KDIwKTsKKwlpZiAoIWxvb3BfY291bnQpCisJCXByaW50ayhLRVJOX0VNRVJHICJxbG9naWNwdGk6IHJlc2V0X2hhcmR3YXJlIGxvb3AgdGltZW91dFxuIik7CisKKwlzYnVzX3dyaXRldyhIQ0NUUkxfUEFVU0UsIHFwdGktPnFyZWdzICsgSENDVFJMKTsKKwlzZXRfc2J1c19jZmcxKHFwdGkpOworCXFsb2dpY3B0aV9lbmFibGVfaXJxcyhxcHRpKTsKKworCWlmIChzYnVzX3JlYWR3KHFwdGktPnFyZWdzICsgUklTQ19QU1IpICYgUklTQ19QU1JfVUxUUkEpIHsKKwkJcXB0aS0+dWx0cmEgPSAxOworCQlzYnVzX3dyaXRldygoUklTQ19NVFJFR19QMFVMVFJBIHwgUklTQ19NVFJFR19QMVVMVFJBKSwKKwkJCSAgICBxcHRpLT5xcmVncyArIFJJU0NfTVRSRUcpOworCX0gZWxzZSB7CisJCXFwdGktPnVsdHJhID0gMDsKKwkJc2J1c193cml0ZXcoKFJJU0NfTVRSRUdfUDBERkxUIHwgUklTQ19NVFJFR19QMURGTFQpLAorCQkJICAgIHFwdGktPnFyZWdzICsgUklTQ19NVFJFRyk7CisJfQorCisJLyogcmVzZXQgYWRhcHRlciBhbmQgcGVyLWRldmljZSBkZWZhdWx0IHZhbHVlcy4gKi8KKwkvKiBkbyBpdCBhZnRlciBmaW5kaW5nIG91dCB3aGV0aGVyIHdlJ3JlIHVsdHJhIG1vZGUgY2FwYWJsZSAqLworCXFsb2dpY3B0aV9zZXRfaG9zdGRldl9kZWZhdWx0cyhxcHRpKTsKKworCS8qIFJlbGVhc2UgdGhlIFJJU0MgcHJvY2Vzc29yLiAqLworCXNidXNfd3JpdGV3KEhDQ1RSTF9SRUwsIHFwdGktPnFyZWdzICsgSENDVFJMKTsKKworCS8qIEdldCBSSVNDIHRvIHN0YXJ0IGV4ZWN1dGluZyB0aGUgZmlybXdhcmUgY29kZS4gKi8KKwlwYXJhbVswXSA9IE1CT1hfRVhFQ19GSVJNV0FSRTsKKwlwYXJhbVsxXSA9IHJpc2NfY29kZV9hZGRyOworCWlmIChxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAxKSkgeworCQlwcmludGsoS0VSTl9FTUVSRyAicWxvZ2ljcHRpJWQ6IENhbm5vdCBleGVjdXRlIElTUCBmaXJtd2FyZS5cbiIsCisJCSAgICAgICBxcHRpLT5xcHRpX2lkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogU2V0IGluaXRpYXRvciBzY3NpIElELiAqLworCXBhcmFtWzBdID0gTUJPWF9TRVRfSU5JVF9TQ1NJX0lEOworCXBhcmFtWzFdID0gcXB0aS0+aG9zdF9wYXJhbS5pbml0aWF0b3Jfc2NzaV9pZDsKKwlpZiAocWxvZ2ljcHRpX21ib3hfY29tbWFuZChxcHRpLCBwYXJhbSwgMSkgfHwKKwkgICAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSkgeworCQlwcmludGsoS0VSTl9FTUVSRyAicWxvZ2ljcHRpJWQ6IENhbm5vdCBzZXQgaW5pdGlhdG9yIFNDU0kgSUQuXG4iLAorCQkgICAgICAgcXB0aS0+cXB0aV9pZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAxOworCX0KKworCS8qIEluaXRpYWxpemUgc3RhdGUgb2YgdGhlIHF1ZXVlcywgYm90aCBodyBhbmQgc3cuICovCisJcXB0aS0+cmVxX2luX3B0ciA9IHFwdGktPnJlc19vdXRfcHRyID0gMDsKKworCXBhcmFtWzBdID0gTUJPWF9JTklUX1JFU19RVUVVRTsKKwlwYXJhbVsxXSA9IFJFU19RVUVVRV9MRU4gKyAxOworCXBhcmFtWzJdID0gKHVfc2hvcnQpIChxcHRpLT5yZXNfZHZtYSA+PiAxNik7CisJcGFyYW1bM10gPSAodV9zaG9ydCkgKHFwdGktPnJlc19kdm1hICYgMHhmZmZmKTsKKwlwYXJhbVs0XSA9IHBhcmFtWzVdID0gMDsKKwlpZiAocWxvZ2ljcHRpX21ib3hfY29tbWFuZChxcHRpLCBwYXJhbSwgMSkpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgInFsb2dpY3B0aSVkOiBDYW5ub3QgaW5pdCByZXNwb25zZSBxdWV1ZS5cbiIsCisJCSAgICAgICBxcHRpLT5xcHRpX2lkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcGFyYW1bMF0gPSBNQk9YX0lOSVRfUkVRX1FVRVVFOworCXBhcmFtWzFdID0gUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4gKyAxOworCXBhcmFtWzJdID0gKHVfc2hvcnQpIChxcHRpLT5yZXFfZHZtYSA+PiAxNik7CisJcGFyYW1bM10gPSAodV9zaG9ydCkgKHFwdGktPnJlcV9kdm1hICYgMHhmZmZmKTsKKwlwYXJhbVs0XSA9IHBhcmFtWzVdID0gMDsKKwlpZiAocWxvZ2ljcHRpX21ib3hfY29tbWFuZChxcHRpLCBwYXJhbSwgMSkpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgInFsb2dpY3B0aSVkOiBDYW5ub3QgaW5pdCByZXF1ZXN0IHF1ZXVlLlxuIiwKKwkJICAgICAgIHFwdGktPnFwdGlfaWQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9CisKKwlwYXJhbVswXSA9IE1CT1hfU0VUX1JFVFJZX0NPVU5UOworCXBhcmFtWzFdID0gcXB0aS0+aG9zdF9wYXJhbS5yZXRyeV9jb3VudDsKKwlwYXJhbVsyXSA9IHFwdGktPmhvc3RfcGFyYW0ucmV0cnlfZGVsYXk7CisJcWxvZ2ljcHRpX21ib3hfY29tbWFuZChxcHRpLCBwYXJhbSwgMCk7CisKKwlwYXJhbVswXSA9IE1CT1hfU0VUX1RBR19BR0VfTElNSVQ7CisJcGFyYW1bMV0gPSBxcHRpLT5ob3N0X3BhcmFtLnRhZ19hZ2luZzsKKwlxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfVEFSR0VUUzsgaSsrKSB7CisJCXBhcmFtWzBdID0gTUJPWF9HRVRfREVWX1FVRVVFX1BBUkFNUzsKKwkJcGFyYW1bMV0gPSAoaSA8PCA4KTsKKwkJcWxvZ2ljcHRpX21ib3hfY29tbWFuZChxcHRpLCBwYXJhbSwgMCk7CisJfQorCisJcGFyYW1bMF0gPSBNQk9YX0dFVF9GSVJNV0FSRV9TVEFUVVM7CisJcWxvZ2ljcHRpX21ib3hfY29tbWFuZChxcHRpLCBwYXJhbSwgMCk7CisKKwlwYXJhbVswXSA9IE1CT1hfU0VUX1NFTEVDVF9USU1FT1VUOworCXBhcmFtWzFdID0gcXB0aS0+aG9zdF9wYXJhbS5zZWxlY3Rpb25fdGltZW91dDsKKwlxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfVEFSR0VUUzsgaSsrKSB7CisJCXBhcmFtWzBdID0gTUJPWF9TRVRfVEFSR0VUX1BBUkFNUzsKKwkJcGFyYW1bMV0gPSAoaSA8PCA4KTsKKwkJcGFyYW1bMl0gPSAocXB0aS0+ZGV2X3BhcmFtW2ldLmRldmljZV9mbGFncyA8PCA4KTsKKwkJLyoKKwkJICogU2luY2Ugd2UncmUgbm93IGxvYWRpbmcgMS4zMSBmL3csIGZvcmNlIG5hcnJvdy9hc3luYy4KKwkJICovCisJCXBhcmFtWzJdIHw9IDB4YzA7CisJCXBhcmFtWzNdID0gMDsJLyogbm8gb2Zmc2V0LCB3ZSBkbyBub3QgaGF2ZSBzeW5jIG1vZGUgeWV0ICovCisJCXFsb2dpY3B0aV9tYm94X2NvbW1hbmQocXB0aSwgcGFyYW0sIDApOworCX0KKworCS8qCisJICogQWx3YXlzIChzaWdoKSBkbyBhbiBpbml0aWFsIGJ1cyByZXNldCAoa2lja3MgZi93KS4KKwkgKi8KKwlwYXJhbVswXSA9IE1CT1hfQlVTX1JFU0VUOworCXBhcmFtWzFdID0gcXB0aS0+aG9zdF9wYXJhbS5idXNfcmVzZXRfZGVsYXk7CisJcWxvZ2ljcHRpX21ib3hfY29tbWFuZChxcHRpLCBwYXJhbSwgMCk7CisJcXB0aS0+c2VuZF9tYXJrZXIgPSAxOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBQVElfUkVTRVRfTElNSVQgNDAwCisKK3N0YXRpYyBpbnQgX19pbml0IHFsb2dpY3B0aV9sb2FkX2Zpcm13YXJlKHN0cnVjdCBxbG9naWNwdGkgKnFwdGkpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHFwdGktPnFob3N0OworCXVuc2lnbmVkIHNob3J0IGNzdW0gPSAwOworCXVuc2lnbmVkIHNob3J0IHBhcmFtWzZdOworCXVuc2lnbmVkIHNob3J0ICpyaXNjX2NvZGUsIHJpc2NfY29kZV9hZGRyLCByaXNjX2NvZGVfbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksIHRpbWVvdXQ7CisKKwlyaXNjX2NvZGUgPSAmc2J1c19yaXNjX2NvZGUwMVswXTsKKwlyaXNjX2NvZGVfYWRkciA9IDB4MTAwMDsJLyogYWxsIGYvdyBtb2R1bGVzIGxvYWQgYXQgMHgxMDAwICovCisJcmlzY19jb2RlX2xlbmd0aCA9IHNidXNfcmlzY19jb2RlX2xlbmd0aDAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkvKiBWZXJpZnkgdGhlIGNoZWNrc3VtIHR3aWNlLCBvbmUgYmVmb3JlIGxvYWRpbmcgaXQsIGFuZCBvbmNlCisJICogYWZ0ZXJ3YXJkcyB2aWEgdGhlIG1haWxib3ggY29tbWFuZHMuCisJICovCisJZm9yIChpID0gMDsgaSA8IHJpc2NfY29kZV9sZW5ndGg7IGkrKykKKwkJY3N1bSArPSByaXNjX2NvZGVbaV07CisJaWYgKGNzdW0pIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgInFsb2dpY3B0aSVkOiBBaWVlZSwgZmlybXdhcmUgY2hlY2tzdW0gZmFpbGVkISIsCisJCSAgICAgICBxcHRpLT5xcHRpX2lkKTsKKwkJcmV0dXJuIDE7CisJfQkJCisJc2J1c193cml0ZXcoU0JVU19DVFJMX1JFU0VULCBxcHRpLT5xcmVncyArIFNCVVNfQ1RSTCk7CisJc2J1c193cml0ZXcoKERNQV9DVFJMX0NDTEVBUiB8IERNQV9DVFJMX0NJUlEpLCBxcHRpLT5xcmVncyArIENNRF9ETUFfQ1RSTCk7CisJc2J1c193cml0ZXcoKERNQV9DVFJMX0NDTEVBUiB8IERNQV9DVFJMX0NJUlEpLCBxcHRpLT5xcmVncyArIERBVEFfRE1BX0NUUkwpOworCXRpbWVvdXQgPSBQVElfUkVTRVRfTElNSVQ7CisJd2hpbGUgKC0tdGltZW91dCAmJiAoc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIFNCVVNfQ1RSTCkgJiBTQlVTX0NUUkxfUkVTRVQpKQorCQl1ZGVsYXkoMjApOworCWlmICghdGltZW91dCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlwcmludGsoS0VSTl9FTUVSRyAicWxvZ2ljcHRpJWQ6IENhbm5vdCByZXNldCB0aGUgSVNQLiIsIHFwdGktPnFwdGlfaWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlzYnVzX3dyaXRldyhIQ0NUUkxfUkVTRVQsIHFwdGktPnFyZWdzICsgSENDVFJMKTsKKwltZGVsYXkoMSk7CisKKwlzYnVzX3dyaXRldygoU0JVU19DVFJMX0dFTkFCIHwgU0JVU19DVFJMX0VSSVJRKSwgcXB0aS0+cXJlZ3MgKyBTQlVTX0NUUkwpOworCXNldF9zYnVzX2NmZzEocXB0aSk7CisJc2J1c193cml0ZXcoMCwgcXB0aS0+cXJlZ3MgKyBTQlVTX1NFTUFQSE9SRSk7CisKKwlpZiAoc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIFJJU0NfUFNSKSAmIFJJU0NfUFNSX1VMVFJBKSB7CisJCXFwdGktPnVsdHJhID0gMTsKKwkJc2J1c193cml0ZXcoKFJJU0NfTVRSRUdfUDBVTFRSQSB8IFJJU0NfTVRSRUdfUDFVTFRSQSksCisJCQkgICAgcXB0aS0+cXJlZ3MgKyBSSVNDX01UUkVHKTsKKwl9IGVsc2UgeworCQlxcHRpLT51bHRyYSA9IDA7CisJCXNidXNfd3JpdGV3KChSSVNDX01UUkVHX1AwREZMVCB8IFJJU0NfTVRSRUdfUDFERkxUKSwKKwkJCSAgICBxcHRpLT5xcmVncyArIFJJU0NfTVRSRUcpOworCX0KKworCXNidXNfd3JpdGV3KEhDQ1RSTF9SRUwsIHFwdGktPnFyZWdzICsgSENDVFJMKTsKKworCS8qIFBpbiBsaW5lcyBhcmUgb25seSBzdGFibGUgd2hpbGUgUklTQyBpcyBwYXVzZWQuICovCisJc2J1c193cml0ZXcoSENDVFJMX1BBVVNFLCBxcHRpLT5xcmVncyArIEhDQ1RSTCk7CisJaWYgKHNidXNfcmVhZHcocXB0aS0+cXJlZ3MgKyBDUFVfUERJRkYpICYgQ1BVX1BESUZGX01PREUpCisJCXFwdGktPmRpZmZlcmVudGlhbCA9IDE7CisJZWxzZQorCQlxcHRpLT5kaWZmZXJlbnRpYWwgPSAwOworCXNidXNfd3JpdGV3KEhDQ1RSTF9SRUwsIHFwdGktPnFyZWdzICsgSENDVFJMKTsKKworCS8qIFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeS0gd2UndmUgcmVzZXQgdGhpbmdzIHNvIHdlIHNob3VsZCBiZQorCSAgIHJ1bm5pbmcgZnJvbSB0aGUgUk9NIG5vdy4uICovCisKKwlwYXJhbVswXSA9IE1CT1hfU1RPUF9GSVJNV0FSRTsKKwlwYXJhbVsxXSA9IHBhcmFtWzJdID0gcGFyYW1bM10gPSBwYXJhbVs0XSA9IHBhcmFtWzVdID0gMDsKKwlpZiAocWxvZ2ljcHRpX21ib3hfY29tbWFuZChxcHRpLCBwYXJhbSwgMSkpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgInFsb2dpY3B0aSVkOiBDYW5ub3Qgc3RvcCBmaXJtd2FyZSBmb3IgcmVsb2FkLlxuIiwKKwkJICAgICAgIHFwdGktPnFwdGlfaWQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9CQkKKworCS8qIExvYWQgaXQgdXAuLiAqLworCWZvciAoaSA9IDA7IGkgPCByaXNjX2NvZGVfbGVuZ3RoOyBpKyspIHsKKwkJcGFyYW1bMF0gPSBNQk9YX1dSSVRFX1JBTV9XT1JEOworCQlwYXJhbVsxXSA9IHJpc2NfY29kZV9hZGRyICsgaTsKKwkJcGFyYW1bMl0gPSByaXNjX2NvZGVbaV07CisJCWlmIChxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAxKSB8fAorCQkgICAgcGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCQlwcmludGsoInFsb2dpY3B0aSVkOiBGaXJtd2FyZSBkbG9hZCBmYWlsZWQsIEknbSBib2xpeGVkIVxuIiwKKwkJCSAgICAgICBxcHRpLT5xcHRpX2lkKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8qIFJlc2V0IHRoZSBJU1AgYWdhaW4uICovCisJc2J1c193cml0ZXcoSENDVFJMX1JFU0VULCBxcHRpLT5xcmVncyArIEhDQ1RSTCk7CisJbWRlbGF5KDEpOworCisJcWxvZ2ljcHRpX2VuYWJsZV9pcnFzKHFwdGkpOworCXNidXNfd3JpdGV3KDAsIHFwdGktPnFyZWdzICsgU0JVU19TRU1BUEhPUkUpOworCXNidXNfd3JpdGV3KEhDQ1RSTF9SRUwsIHFwdGktPnFyZWdzICsgSENDVFJMKTsKKworCS8qIEFzayBJU1AgdG8gdmVyaWZ5IHRoZSBjaGVja3N1bSBvZiB0aGUgbmV3IGNvZGUuICovCisJcGFyYW1bMF0gPSBNQk9YX1ZFUklGWV9DSEVDS1NVTTsKKwlwYXJhbVsxXSA9IHJpc2NfY29kZV9hZGRyOworCWlmIChxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAxKSB8fAorCSAgICAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSkgeworCQlwcmludGsoS0VSTl9FTUVSRyAicWxvZ2ljcHRpJWQ6IE5ldyBmaXJtd2FyZSBjc3VtIGZhaWx1cmUhXG4iLAorCQkgICAgICAgcXB0aS0+cXB0aV9pZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAxOworCX0KKworCS8qIFN0YXJ0IHVzaW5nIG5ld2x5IGRvd25sb2FkZWQgZmlybXdhcmUuICovCisJcGFyYW1bMF0gPSBNQk9YX0VYRUNfRklSTVdBUkU7CisJcGFyYW1bMV0gPSByaXNjX2NvZGVfYWRkcjsKKwlxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAxKTsKKworCXBhcmFtWzBdID0gTUJPWF9BQk9VVF9GSVJNV0FSRTsKKwlpZiAocWxvZ2ljcHRpX21ib3hfY29tbWFuZChxcHRpLCBwYXJhbSwgMSkgfHwKKwkgICAgKHBhcmFtWzBdICE9IE1CT1hfQ09NTUFORF9DT01QTEVURSkpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgInFsb2dpY3B0aSVkOiBBYm91dEZpcm13YXJlIGNtZCBmYWlscy5cbiIsCisJCSAgICAgICBxcHRpLT5xcHRpX2lkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogU25hZyB0aGUgbWFqb3IgYW5kIG1pbm9yIHJldmlzaW9ucyBmcm9tIHRoZSByZXN1bHQuICovCisJcXB0aS0+ZndhcmVfbWFqcmV2ID0gcGFyYW1bMV07CisJcXB0aS0+ZndhcmVfbWlucmV2ID0gcGFyYW1bMl07CisJcXB0aS0+ZndhcmVfbWljcmV2ID0gcGFyYW1bM107CisKKwkvKiBTZXQgdGhlIGNsb2NrIHJhdGUgKi8KKwlwYXJhbVswXSA9IE1CT1hfU0VUX0NMT0NLX1JBVEU7CisJcGFyYW1bMV0gPSBxcHRpLT5jbG9jazsKKwlpZiAocWxvZ2ljcHRpX21ib3hfY29tbWFuZChxcHRpLCBwYXJhbSwgMSkgfHwKKwkgICAgKHBhcmFtWzBdICE9IE1CT1hfQ09NTUFORF9DT01QTEVURSkpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgInFsb2dpY3B0aSVkOiBjb3VsZCBub3Qgc2V0IGNsb2NrIHJhdGUuXG4iLAorCQkgICAgICAgcXB0aS0+cXB0aV9pZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAxOworCX0KKworCWlmIChxcHRpLT5pc19wdGkgIT0gMCkgeworCQkvKiBMb2FkIHNjc2kgaW5pdGlhdG9yIElEIGFuZCBpbnRlcnJ1cHQgbGV2ZWwgaW50byBzYnVzIHN0YXRpYyByYW0uICovCisJCXBhcmFtWzBdID0gTUJPWF9XUklURV9SQU1fV09SRDsKKwkJcGFyYW1bMV0gPSAweGZmODA7CisJCXBhcmFtWzJdID0gKHVuc2lnbmVkIHNob3J0KSBxcHRpLT5zY3NpX2lkOworCQlxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAxKTsKKworCQlwYXJhbVswXSA9IE1CT1hfV1JJVEVfUkFNX1dPUkQ7CisJCXBhcmFtWzFdID0gMHhmZjAwOworCQlwYXJhbVsyXSA9ICh1bnNpZ25lZCBzaG9ydCkgMzsKKwkJcWxvZ2ljcHRpX21ib3hfY29tbWFuZChxcHRpLCBwYXJhbSwgMSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxbG9naWNwdGlfdmVyaWZ5X3Rtb24oc3RydWN0IHFsb2dpY3B0aSAqcXB0aSkKK3sKKwlpbnQgY3Vyc3RhdCA9IHNidXNfcmVhZGIocXB0aS0+c3JlZyk7CisKKwljdXJzdGF0ICY9IDB4ZjA7CisJaWYgKCEoY3Vyc3RhdCAmIFNSRUdfRlVTRSkgJiYgKHFwdGktPnN3c3JlZyAmIFNSRUdfRlVTRSkpCisJCXByaW50aygicWxvZ2ljcHRpJWQ6IEZ1c2UgcmV0dXJuZWQgdG8gbm9ybWFsIHN0YXRlLlxuIiwgcXB0aS0+cXB0aV9pZCk7CisJaWYgKCEoY3Vyc3RhdCAmIFNSRUdfVFBPV0VSKSAmJiAocXB0aS0+c3dzcmVnICYgU1JFR19UUE9XRVIpKQorCQlwcmludGsoInFsb2dpY3B0aSVkOiB0ZXJtcHdyIGJhY2sgdG8gbm9ybWFsIHN0YXRlLlxuIiwgcXB0aS0+cXB0aV9pZCk7CisJaWYgKGN1cnN0YXQgIT0gcXB0aS0+c3dzcmVnKSB7CisJCWludCBlcnJvciA9IDA7CisJCWlmIChjdXJzdGF0ICYgU1JFR19GVVNFKSB7CisJCQllcnJvcisrOworCQkJcHJpbnRrKCJxbG9naWNwdGklZDogRnVzZSBpcyBvcGVuIVxuIiwgcXB0aS0+cXB0aV9pZCk7CisJCX0KKwkJaWYgKGN1cnN0YXQgJiBTUkVHX1RQT1dFUikgeworCQkJZXJyb3IrKzsKKwkJCXByaW50aygicWxvZ2ljcHRpJWQ6IHRlcm1wd3IgZmFpbHVyZVxuIiwgcXB0aS0+cXB0aV9pZCk7CisJCX0KKwkJaWYgKHFwdGktPmRpZmZlcmVudGlhbCAmJgorCQkgICAgKGN1cnN0YXQgJiBTUkVHX0RTRU5TRSkgIT0gU1JFR19EU0VOU0UpIHsKKwkJCWVycm9yKys7CisJCQlwcmludGsoInFsb2dpY3B0aSVkOiBZb3UgaGF2ZSBhIHNpbmdsZSBlbmRlZCBkZXZpY2Ugb24gYSAiCisJCQkgICAgICAgImRpZmZlcmVudGlhbCBidXMhICBQbGVhc2UgZml4IVxuIiwgcXB0aS0+cXB0aV9pZCk7CisJCX0KKwkJcXB0aS0+c3dzcmVnID0gY3Vyc3RhdDsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IHFwdGlfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworc3RhdGljIHZvaWQgX19pbml0IHFwdGlfY2hhaW5fYWRkKHN0cnVjdCBxbG9naWNwdGkgKnFwdGkpCit7CisJc3Bpbl9sb2NrX2lycSgmcXB0aWNoYWluX2xvY2spOworCWlmIChxcHRpY2hhaW4gIT0gTlVMTCkgeworCQlzdHJ1Y3QgcWxvZ2ljcHRpICpxbGluayA9IHFwdGljaGFpbjsKKworCQl3aGlsZShxbGluay0+bmV4dCkKKwkJCXFsaW5rID0gcWxpbmstPm5leHQ7CisJCXFsaW5rLT5uZXh0ID0gcXB0aTsKKwl9IGVsc2UgeworCQlxcHRpY2hhaW4gPSBxcHRpOworCX0KKwlxcHRpLT5uZXh0ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnEoJnFwdGljaGFpbl9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHFwdGlfY2hhaW5fZGVsKHN0cnVjdCBxbG9naWNwdGkgKnFwdGkpCit7CisJc3Bpbl9sb2NrX2lycSgmcXB0aWNoYWluX2xvY2spOworCWlmIChxcHRpY2hhaW4gPT0gcXB0aSkgeworCQlxcHRpY2hhaW4gPSBxcHRpLT5uZXh0OworCX0gZWxzZSB7CisJCXN0cnVjdCBxbG9naWNwdGkgKnFsaW5rID0gcXB0aWNoYWluOworCQl3aGlsZShxbGluay0+bmV4dCAhPSBxcHRpKQorCQkJcWxpbmsgPSBxbGluay0+bmV4dDsKKwkJcWxpbmstPm5leHQgPSBxcHRpLT5uZXh0OworCX0KKwlxcHRpLT5uZXh0ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnEoJnFwdGljaGFpbl9sb2NrKTsKK30KKworc3RhdGljIGludCBfX2luaXQgcXB0aV9tYXBfcmVncyhzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpKQoreworCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IHFwdGktPnNkZXY7CisKKwlxcHRpLT5xcmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbMF0sIDAsCisJCQkJICAgc2Rldi0+cmVnX2FkZHJzWzBdLnJlZ19zaXplLAorCQkJCSAgICJQVEkgUWxvZ2ljL0lTUCIpOworCWlmICghcXB0aS0+cXJlZ3MpIHsKKwkJcHJpbnRrKCJQVEk6IFFsb2dpYy9JU1AgcmVnaXN0ZXJzIGFyZSB1bm1hcHBhYmxlXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAocXB0aS0+aXNfcHRpKSB7CisJCXFwdGktPnNyZWcgPSBzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzBdLCAoMTYgKiA0MDk2KSwKKwkJCQkJICBzaXplb2YodW5zaWduZWQgY2hhciksCisJCQkJCSAgIlBUSSBRbG9naWMvSVNQIHN0YXRyZWciKTsKKwkJaWYgKCFxcHRpLT5zcmVnKSB7CisJCQlwcmludGsoIlBUSTogUWxvZ2ljL0lTUCBzdGF0dXMgcmVnaXN0ZXIgaXMgdW5tYXBwYWJsZVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHFwdGlfcmVnaXN0ZXJfaXJxKHN0cnVjdCBxbG9naWNwdGkgKnFwdGkpCit7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gcXB0aS0+c2RldjsKKworCXFwdGktPnFob3N0LT5pcnEgPSBxcHRpLT5pcnEgPSBzZGV2LT5pcnFzWzBdOworCisJLyogV2UgdXNlZCB0byB0cnkgdmFyaW91cyBvdmVybHktY2xldmVyIHRoaW5ncyB0bworCSAqIHJlZHVjZSB0aGUgaW50ZXJydXB0IHByb2Nlc3Npbmcgb3ZlcmhlYWQgb24KKwkgKiBzdW40Yy9zdW40bSB3aGVuIG11bHRpcGxlIFBUSSdzIHNoYXJlZCB0aGUKKwkgKiBzYW1lIElSUS4gIEl0IHdhcyB0b28gY29tcGxleCBhbmQgbWVzc3kgdG8KKwkgKiBzYW5lbHkgbWFpbnRhaW4uCisJICovCisJaWYgKHJlcXVlc3RfaXJxKHFwdGktPmlycSwgcXB0aV9pbnRyLAorCQkJU0FfU0hJUlEsICJRbG9naWMvUFRJIiwgcXB0aSkpCisJCWdvdG8gZmFpbDsKKworCXByaW50aygicXB0aSVkOiBJUlEgJXMgIiwgcXB0aS0+cXB0aV9pZCwgX19pcnFfaXRvYShxcHRpLT5pcnEpKTsKKworCXJldHVybiAwOworCitmYWlsOgorCXByaW50aygicXB0aSVkOiBDYW5ub3QgYWNxdWlyZSBpcnEgbGluZVxuIiwgcXB0aS0+cXB0aV9pZCk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcXB0aV9nZXRfc2NzaV9pZChzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpKQoreworCXFwdGktPnNjc2lfaWQgPSBwcm9tX2dldGludGRlZmF1bHQocXB0aS0+cHJvbV9ub2RlLAorCQkJCQkgICAiaW5pdGlhdG9yLWlkIiwKKwkJCQkJICAgLTEpOworCWlmIChxcHRpLT5zY3NpX2lkID09IC0xKQorCQlxcHRpLT5zY3NpX2lkID0gcHJvbV9nZXRpbnRkZWZhdWx0KHFwdGktPnByb21fbm9kZSwKKwkJCQkJCSAgICJzY3NpLWluaXRpYXRvci1pZCIsCisJCQkJCQkgICAtMSk7CisJaWYgKHFwdGktPnNjc2lfaWQgPT0gLTEpCisJCXFwdGktPnNjc2lfaWQgPQorCQkJcHJvbV9nZXRpbnRkZWZhdWx0KHFwdGktPnNkZXYtPmJ1cy0+cHJvbV9ub2RlLAorCQkJCQkgICAic2NzaS1pbml0aWF0b3ItaWQiLCA3KTsKKwlxcHRpLT5xaG9zdC0+dGhpc19pZCA9IHFwdGktPnNjc2lfaWQ7CisJcXB0aS0+cWhvc3QtPm1heF9zZWN0b3JzID0gNjQ7CisKKwlwcmludGsoIlNDU0kgSUQgJWQgIiwgcXB0aS0+c2NzaV9pZCk7Cit9CisKK3N0YXRpYyB2b2lkIHFwdGlfZ2V0X2J1cnN0cyhzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpKQoreworCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IHFwdGktPnNkZXY7CisJdTggYnVyc3RzLCBibWFzazsKKworCWJ1cnN0cyA9IHByb21fZ2V0aW50ZGVmYXVsdChxcHRpLT5wcm9tX25vZGUsICJidXJzdC1zaXplcyIsIDB4ZmYpOworCWJtYXNrID0gcHJvbV9nZXRpbnRkZWZhdWx0KHNkZXYtPmJ1cy0+cHJvbV9ub2RlLAorCQkJCSAgICJidXJzdC1zaXplcyIsIDB4ZmYpOworCWlmIChibWFzayAhPSAweGZmKQorCQlidXJzdHMgJj0gYm1hc2s7CisJaWYgKGJ1cnN0cyA9PSAweGZmIHx8CisJICAgIChidXJzdHMgJiBETUFfQlVSU1QxNikgPT0gMCB8fAorCSAgICAoYnVyc3RzICYgRE1BX0JVUlNUMzIpID09IDApCisJCWJ1cnN0cyA9IChETUFfQlVSU1QzMiAtIDEpOworCisJcXB0aS0+YnVyc3RzID0gYnVyc3RzOworfQorCitzdGF0aWMgdm9pZCBxcHRpX2dldF9jbG9jayhzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpKQoreworCXVuc2lnbmVkIGludCBjZnJlcTsKKworCS8qIENoZWNrIGZvciB3aGF0IHRoZSBjbG9jayBpbnB1dCB0byB0aGlzIGNhcmQgaXMuCisJICogRGVmYXVsdCB0byA0ME1oei4KKwkgKi8KKwljZnJlcSA9IHByb21fZ2V0aW50ZGVmYXVsdChxcHRpLT5wcm9tX25vZGUsImNsb2NrLWZyZXF1ZW5jeSIsNDAwMDAwMDApOworCXFwdGktPmNsb2NrID0gKGNmcmVxICsgNTAwMDAwKS8xMDAwMDAwOworCWlmIChxcHRpLT5jbG9jayA9PSAwKSAvKiBidWxsc2hpdCAqLworCQlxcHRpLT5jbG9jayA9IDQwOworfQorCisvKiBUaGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcXVldWVzIG11c3QgZWFjaCBiZSBhbGlnbmVkCisgKiBvbiBhIHBhZ2UgYm91bmRhcnkuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHFwdGlfbWFwX3F1ZXVlcyhzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpKQoreworCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IHFwdGktPnNkZXY7CisKKyNkZWZpbmUgUVNJWkUoZW50cmllcykJKCgoZW50cmllcykgKyAxKSAqIFFVRVVFX0VOVFJZX0xFTikKKwlxcHRpLT5yZXNfY3B1ID0gc2J1c19hbGxvY19jb25zaXN0ZW50KHNkZXYsCisJCQkJCSAgICAgIFFTSVpFKFJFU19RVUVVRV9MRU4pLAorCQkJCQkgICAgICAmcXB0aS0+cmVzX2R2bWEpOworCWlmIChxcHRpLT5yZXNfY3B1ID09IE5VTEwgfHwKKwkgICAgcXB0aS0+cmVzX2R2bWEgPT0gMCkgeworCQlwcmludGsoIlFQVEk6IENhbm5vdCBtYXAgcmVzcG9uc2UgcXVldWUuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXFwdGktPnJlcV9jcHUgPSBzYnVzX2FsbG9jX2NvbnNpc3RlbnQoc2RldiwKKwkJCQkJICAgICAgUVNJWkUoUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4pLAorCQkJCQkgICAgICAmcXB0aS0+cmVxX2R2bWEpOworCWlmIChxcHRpLT5yZXFfY3B1ID09IE5VTEwgfHwKKwkgICAgcXB0aS0+cmVxX2R2bWEgPT0gMCkgeworCQlzYnVzX2ZyZWVfY29uc2lzdGVudChzZGV2LCBRU0laRShSRVNfUVVFVUVfTEVOKSwKKwkJCQkgICAgIHFwdGktPnJlc19jcHUsIHFwdGktPnJlc19kdm1hKTsKKwkJcHJpbnRrKCJRUFRJOiBDYW5ub3QgbWFwIHJlcXVlc3QgcXVldWUuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQocXB0aS0+cmVzX2NwdSwgMCwgUVNJWkUoUkVTX1FVRVVFX0xFTikpOworCW1lbXNldChxcHRpLT5yZXFfY3B1LCAwLCBRU0laRShRTE9HSUNQVElfUkVRX1FVRVVFX0xFTikpOworCXJldHVybiAwOworfQorCisvKiBEZXRlY3QgYWxsIFBUSSBRbG9naWMgSVNQJ3MgaW4gdGhlIG1hY2hpbmUuICovCitzdGF0aWMgaW50IF9faW5pdCBxbG9naWNwdGlfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCit7CisJc3RydWN0IHFsb2dpY3B0aSAqcXB0aTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpxcHRpX2hvc3Q7CisJc3RydWN0IHNidXNfYnVzICpzYnVzOworCXN0cnVjdCBzYnVzX2RldiAqc2RldjsKKwlpbnQgbnFwdGlzID0gMCwgbnFwdGlzX2luX3VzZSA9IDA7CisKKwl0cG50LT5wcm9jX25hbWUgPSAicWxvZ2ljcHRpIjsKKwlmb3JfZWFjaF9zYnVzKHNidXMpIHsKKwkJZm9yX2VhY2hfc2J1c2RldihzZGV2LCBzYnVzKSB7CisJCQkvKiBJcyB0aGlzIGEgcmVkIHNuYXBwZXI/ICovCisJCQlpZiAoc3RyY21wKHNkZXYtPnByb21fbmFtZSwgInB0aXNwIikgJiYKKwkJCSAgICBzdHJjbXAoc2Rldi0+cHJvbV9uYW1lLCAiUFRJLHB0aXNwIikgJiYKKwkJCSAgICBzdHJjbXAoc2Rldi0+cHJvbV9uYW1lLCAiUUxHQyxpc3AiKSAmJgorCQkJICAgIHN0cmNtcChzZGV2LT5wcm9tX25hbWUsICJTVU5XLGlzcCIpKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBTb21ldGltZXMgQW50YXJlcyBjYXJkcyBjb21lIHVwIG5vdCBjb21wbGV0ZWx5CisJCQkgKiBzZXR1cCwgYW5kIHdlIGdldCBhIHJlcG9ydCBvZiBhIHplcm8gSVJRLgorCQkJICogU2tpcCBvdmVyIHRoZW0gaW4gc3VjaCBjYXNlcyBzbyB3ZSBzdXJ2aXZlLgorCQkJICovCisJCQlpZiAoc2Rldi0+aXJxc1swXSA9PSAwKSB7CisJCQkJcHJpbnRrKCJxcHRpJWQ6IEFkYXB0ZXIgcmVwb3J0cyBubyBpbnRlcnJ1cHQsICIKKwkJCQkgICAgICAgInNraXBwaW5nIG92ZXIgdGhpcyBjYXJkLiIsIG5xcHRpcyk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIFllcCwgcmVnaXN0ZXIgYW5kIGFsbG9jYXRlIHNvZnR3YXJlIHN0YXRlLiAqLworCQkJcXB0aV9ob3N0ID0gc2NzaV9yZWdpc3Rlcih0cG50LCBzaXplb2Yoc3RydWN0IHFsb2dpY3B0aSkpOworCQkJaWYgKCFxcHRpX2hvc3QpIHsKKwkJCQlwcmludGsoIlFQVEk6IENhbm5vdCByZWdpc3RlciBQVEkgUWxvZ2ljIElTUCBTQ1NJIGhvc3QiKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXFwdGkgPSAoc3RydWN0IHFsb2dpY3B0aSAqKSBxcHRpX2hvc3QtPmhvc3RkYXRhOworCisJCQkvKiBXZSBhcmUgd2lkZSBjYXBhYmxlLCAxNiB0YXJnZXRzLiAqLworCQkJcXB0aV9ob3N0LT5tYXhfaWQgPSBNQVhfVEFSR0VUUzsKKworCQkJLyogU2V0dXAgYmFjayBwb2ludGVycyBhbmQgbWlzYy4gc3RhdGUuICovCisJCQlxcHRpLT5xaG9zdCA9IHFwdGlfaG9zdDsKKwkJCXFwdGktPnNkZXYgPSBzZGV2OworCQkJcXB0aS0+cXB0aV9pZCA9IG5xcHRpcysrOworCQkJcXB0aS0+cHJvbV9ub2RlID0gc2Rldi0+cHJvbV9ub2RlOworCQkJcHJvbV9nZXRzdHJpbmcocXB0aS0+cHJvbV9ub2RlLCAibmFtZSIsCisJCQkJICAgICAgIHFwdGktPnByb21fbmFtZSwKKwkJCQkgICAgICAgc2l6ZW9mKHFwdGktPnByb21fbmFtZSkpOworCisJCQkvKiBUaGlzIGlzIG5vdCBjb3JyZWN0LCBhY3R1YWxseS4gVGhlcmUncyBhIHN3aXRjaAorCQkJICogb24gdGhlIFBUSSBjYXJkcyB0aGF0IHB1dCB0aGVtIGludG8gImVtdWxhdGlvbiIKKwkJCSAqIG1vZGUtIGkuZS4sIHJlcG9ydCB0aGVtc2VsdmVzIGFzIFFMR0MsaXNwCisJCQkgKiBpbnN0ZWFkIG9mIFBUSSxwdGlzcC4gVGhlIG9ubHkgcmVhbCBzdWJzdGFudGl2ZQorCQkJICogZGlmZmVyZW5jZSBiZXR3ZWVuIG5vbi1wdGkgYW5kIHB0aSBjYXJkcyBpcworCQkJICogdGhlIHRtb24gcmVnaXN0ZXIuIFdoaWNoIGlzIHBvc3NpYmx5IGV2ZW4KKwkJCSAqIHRoZXJlIGZvciBRbG9naWMgY2FyZHMsIGJ1dCBub24tZnVuY3Rpb25hbC4KKwkJCSAqLworCQkJcXB0aS0+aXNfcHRpID0gKHN0cmNtcCAocXB0aS0+cHJvbV9uYW1lLCAiUUxHQyxpc3AiKSAhPSAwKTsKKworCQkJcXB0aV9jaGFpbl9hZGQocXB0aSk7CisJCQlpZiAocXB0aV9tYXBfcmVncyhxcHRpKSA8IDApCisJCQkJZ290byBmYWlsX3VubGluazsKKworCQkJaWYgKHFwdGlfcmVnaXN0ZXJfaXJxKHFwdGkpIDwgMCkKKwkJCQlnb3RvIGZhaWxfdW5tYXBfcmVnczsKKworCQkJcXB0aV9nZXRfc2NzaV9pZChxcHRpKTsKKwkJCXFwdGlfZ2V0X2J1cnN0cyhxcHRpKTsKKwkJCXFwdGlfZ2V0X2Nsb2NrKHFwdGkpOworCisJCQkvKiBDbGVhciBvdXQgc2NzaV9jbW5kIGFycmF5LiAqLworCQkJbWVtc2V0KHFwdGktPmNtZF9zbG90cywgMCwgc2l6ZW9mKHFwdGktPmNtZF9zbG90cykpOworCisJCQlpZiAocXB0aV9tYXBfcXVldWVzKHFwdGkpIDwgMCkKKwkJCQlnb3RvIGZhaWxfZnJlZV9pcnE7CisKKwkJCS8qIExvYWQgdGhlIGZpcm13YXJlLiAqLworCQkJaWYgKHFsb2dpY3B0aV9sb2FkX2Zpcm13YXJlKHFwdGkpKQorCQkJCWdvdG8gZmFpbF91bm1hcF9xdWV1ZXM7CisJCQlpZiAocXB0aS0+aXNfcHRpKSB7CisJCQkJLyogQ2hlY2sgdGhlIFBUSSBzdGF0dXMgcmVnLiAqLworCQkJCWlmIChxbG9naWNwdGlfdmVyaWZ5X3Rtb24ocXB0aSkpCisJCQkJCWdvdG8gZmFpbF91bm1hcF9xdWV1ZXM7CisJCQl9CisKKwkJCS8qIFJlc2V0IHRoZSBJU1AgYW5kIGluaXQgcmVzL3JlcSBxdWV1ZXMuICovCisJCQlpZiAocWxvZ2ljcHRpX3Jlc2V0X2hhcmR3YXJlKHFwdGlfaG9zdCkpCisJCQkJZ290byBmYWlsX3VubWFwX3F1ZXVlczsKKworCQkJcHJpbnRrKCIoRmlybXdhcmUgdiVkLiVkLiVkKSIsIHFwdGktPmZ3YXJlX21hanJldiwKKwkJCSAgICBxcHRpLT5md2FyZV9taW5yZXYsIHFwdGktPmZ3YXJlX21pY3Jldik7CisJCQl7CisJCQkJY2hhciBidWZmZXJbNjBdOworCQkJCQorCQkJCXByb21fZ2V0c3RyaW5nIChxcHRpLT5wcm9tX25vZGUsCisJCQkJCQkiaXNwLWZjb2RlIiwgYnVmZmVyLCA2MCk7CisJCQkJaWYgKGJ1ZmZlclswXSkKKwkJCQkJcHJpbnRrKCIoRmlybXdhcmUgJXMpIiwgYnVmZmVyKTsKKwkJCQlpZiAocHJvbV9nZXRib29sKHFwdGktPnByb21fbm9kZSwgImRpZmZlcmVudGlhbCIpKQorCQkJCQlxcHRpLT5kaWZmZXJlbnRpYWwgPSAxOworCQkJfQorCQkJCisJCQlwcmludGsgKCIgWyVzIFdpZGUsIHVzaW5nICVzIGludGVyZmFjZV1cbiIsCisJCQkgICAgICAgKHFwdGktPnVsdHJhID8gIlVsdHJhIiA6ICJGYXN0IiksCisJCQkgICAgICAgKHFwdGktPmRpZmZlcmVudGlhbCA/ICJkaWZmZXJlbnRpYWwiIDogInNpbmdsZSBlbmRlZCIpKTsKKworCQkJbnFwdGlzX2luX3VzZSsrOworCQkJY29udGludWU7CisKKwkJZmFpbF91bm1hcF9xdWV1ZXM6CisjZGVmaW5lIFFTSVpFKGVudHJpZXMpCSgoKGVudHJpZXMpICsgMSkgKiBRVUVVRV9FTlRSWV9MRU4pCisJCQlzYnVzX2ZyZWVfY29uc2lzdGVudChxcHRpLT5zZGV2LAorCQkJCQkgICAgIFFTSVpFKFJFU19RVUVVRV9MRU4pLAorCQkJCQkgICAgIHFwdGktPnJlc19jcHUsIHFwdGktPnJlc19kdm1hKTsKKwkJCXNidXNfZnJlZV9jb25zaXN0ZW50KHFwdGktPnNkZXYsCisJCQkJCSAgICAgUVNJWkUoUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4pLAorCQkJCQkgICAgIHFwdGktPnJlcV9jcHUsIHFwdGktPnJlcV9kdm1hKTsKKyN1bmRlZiBRU0laRQorCQlmYWlsX2ZyZWVfaXJxOgorCQkJZnJlZV9pcnEocXB0aS0+aXJxLCBxcHRpKTsKKworCQlmYWlsX3VubWFwX3JlZ3M6CisJCQlzYnVzX2lvdW5tYXAocXB0aS0+cXJlZ3MsCisJCQkJICAgICBxcHRpLT5zZGV2LT5yZWdfYWRkcnNbMF0ucmVnX3NpemUpOworCQkJaWYgKHFwdGktPmlzX3B0aSkKKwkJCQlzYnVzX2lvdW5tYXAocXB0aS0+c3JlZywgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsKKwkJZmFpbF91bmxpbms6CisJCQlxcHRpX2NoYWluX2RlbChxcHRpKTsKKwkJCXNjc2lfdW5yZWdpc3RlcihxcHRpLT5xaG9zdCk7CisJCX0KKwl9CisJaWYgKG5xcHRpcykKKwkJcHJpbnRrKCJRUFRJOiBUb3RhbCBvZiAlZCBQVEkgUWxvZ2ljL0lTUCBob3N0cyBmb3VuZCwgJWQgYWN0dWFsbHkgaW4gdXNlLlxuIiwKKwkJICAgICAgIG5xcHRpcywgbnFwdGlzX2luX3VzZSk7CisJcXB0aXNfcnVubmluZyA9IG5xcHRpc19pbl91c2U7CisJcmV0dXJuIG5xcHRpczsKK30KKworc3RhdGljIGludCBxbG9naWNwdGlfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0cnVjdCBxbG9naWNwdGkgKnFwdGkgPSAoc3RydWN0IHFsb2dpY3B0aSAqKSBob3N0LT5ob3N0ZGF0YTsKKworCS8qIFJlbW92ZSB2aXNpYmlsaXR5IGZyb20gSVJRIGhhbmRsZXJzLiAqLworCXFwdGlfY2hhaW5fZGVsKHFwdGkpOworCisJLyogU2h1dCB1cCB0aGUgY2FyZC4gKi8KKwlzYnVzX3dyaXRldygwLCBxcHRpLT5xcmVncyArIFNCVVNfQ1RSTCk7CisKKwkvKiBGcmVlIElSUSBoYW5kbGVyIGFuZCB1bm1hcCBRbG9naWMsSVNQIGFuZCBQVEkgc3RhdHVzIHJlZ3MuICovCisJZnJlZV9pcnEocXB0aS0+aXJxLCBxcHRpKTsKKworI2RlZmluZSBRU0laRShlbnRyaWVzKQkoKChlbnRyaWVzKSArIDEpICogUVVFVUVfRU5UUllfTEVOKQorCXNidXNfZnJlZV9jb25zaXN0ZW50KHFwdGktPnNkZXYsCisJCQkgICAgIFFTSVpFKFJFU19RVUVVRV9MRU4pLAorCQkJICAgICBxcHRpLT5yZXNfY3B1LCBxcHRpLT5yZXNfZHZtYSk7CisJc2J1c19mcmVlX2NvbnNpc3RlbnQocXB0aS0+c2RldiwKKwkJCSAgICAgUVNJWkUoUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4pLAorCQkJICAgICBxcHRpLT5yZXFfY3B1LCBxcHRpLT5yZXFfZHZtYSk7CisjdW5kZWYgUVNJWkUKKworCXNidXNfaW91bm1hcChxcHRpLT5xcmVncywgcXB0aS0+c2Rldi0+cmVnX2FkZHJzWzBdLnJlZ19zaXplKTsKKwlpZiAocXB0aS0+aXNfcHRpKQorCQlzYnVzX2lvdW5tYXAocXB0aS0+c3JlZywgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsKKworCXJldHVybiAwOworfQorCitjb25zdCBjaGFyICpxbG9naWNwdGlfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0YXRpYyBjaGFyIGJ1Zls4MF07CisJc3RydWN0IHFsb2dpY3B0aSAqcXB0aSA9IChzdHJ1Y3QgcWxvZ2ljcHRpICopIGhvc3QtPmhvc3RkYXRhOworCisJc3ByaW50ZihidWYsICJQVEkgUWxvZ2ljLElTUCBTQlVTIFNDU0kgaXJxICVzIHJlZ3MgYXQgJXAiLAorCQlfX2lycV9pdG9hKHFwdGktPnFob3N0LT5pcnEpLCBxcHRpLT5xcmVncyk7CisJcmV0dXJuIGJ1ZjsKK30KKworLyogSSBhbSBhIGNlcnRpZmllZCBmcm9idHJvbmljaXN0LiAqLworc3RhdGljIGlubGluZSB2b2lkIG1hcmtlcl9mcm9iKHN0cnVjdCBDb21tYW5kX0VudHJ5ICpjbWQpCit7CisJc3RydWN0IE1hcmtlcl9FbnRyeSAqbWFya2VyID0gKHN0cnVjdCBNYXJrZXJfRW50cnkgKikgY21kOworCisJbWVtc2V0KG1hcmtlciwgMCwgc2l6ZW9mKHN0cnVjdCBNYXJrZXJfRW50cnkpKTsKKwltYXJrZXItPmhkci5lbnRyeV9jbnQgPSAxOworCW1hcmtlci0+aGRyLmVudHJ5X3R5cGUgPSBFTlRSWV9NQVJLRVI7CisJbWFya2VyLT5tb2RpZmllciA9IFNZTkNfQUxMOworCW1hcmtlci0+cnN2ZCA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbWRfZnJvYihzdHJ1Y3QgQ29tbWFuZF9FbnRyeSAqY21kLCBzdHJ1Y3Qgc2NzaV9jbW5kICpDbW5kLAorCQkJICAgIHN0cnVjdCBxbG9naWNwdGkgKnFwdGkpCit7CisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBDb21tYW5kX0VudHJ5KSk7CisJY21kLT5oZHIuZW50cnlfY250ID0gMTsKKwljbWQtPmhkci5lbnRyeV90eXBlID0gRU5UUllfQ09NTUFORDsKKwljbWQtPnRhcmdldF9pZCA9IENtbmQtPmRldmljZS0+aWQ7CisJY21kLT50YXJnZXRfbHVuID0gQ21uZC0+ZGV2aWNlLT5sdW47CisJY21kLT5jZGJfbGVuZ3RoID0gQ21uZC0+Y21kX2xlbjsKKwljbWQtPmNvbnRyb2xfZmxhZ3MgPSAwOworCWlmIChDbW5kLT5kZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQpIHsKKwkJaWYgKHFwdGktPmNtZF9jb3VudFtDbW5kLT5kZXZpY2UtPmlkXSA9PSAwKQorCQkJcXB0aS0+dGFnX2FnZXNbQ21uZC0+ZGV2aWNlLT5pZF0gPSBqaWZmaWVzOworCQlpZiAoKGppZmZpZXMgLSBxcHRpLT50YWdfYWdlc1tDbW5kLT5kZXZpY2UtPmlkXSkgPiAoNSpIWikpIHsKKwkJCWNtZC0+Y29udHJvbF9mbGFncyA9IENGTEFHX09SREVSRURfVEFHOworCQkJcXB0aS0+dGFnX2FnZXNbQ21uZC0+ZGV2aWNlLT5pZF0gPSBqaWZmaWVzOworCQl9IGVsc2UKKwkJCWNtZC0+Y29udHJvbF9mbGFncyA9IENGTEFHX1NJTVBMRV9UQUc7CisJfQorCWlmICgoQ21uZC0+Y21uZFswXSA9PSBXUklURV82KSB8fAorCSAgICAoQ21uZC0+Y21uZFswXSA9PSBXUklURV8xMCkgfHwKKwkgICAgKENtbmQtPmNtbmRbMF0gPT0gV1JJVEVfMTIpKQorCQljbWQtPmNvbnRyb2xfZmxhZ3MgfD0gQ0ZMQUdfV1JJVEU7CisJZWxzZQorCQljbWQtPmNvbnRyb2xfZmxhZ3MgfD0gQ0ZMQUdfUkVBRDsKKwljbWQtPnRpbWVfb3V0ID0gMzA7CisJbWVtY3B5KGNtZC0+Y2RiLCBDbW5kLT5jbW5kLCBDbW5kLT5jbWRfbGVuKTsKK30KKworLyogRG8gaXQgdG8gaXQgYmFieS4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGxvYWRfY21kKHN0cnVjdCBzY3NpX2NtbmQgKkNtbmQsIHN0cnVjdCBDb21tYW5kX0VudHJ5ICpjbWQsCisJCQkgICBzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpLCB1X2ludCBpbl9wdHIsIHVfaW50IG91dF9wdHIpCit7CisJc3RydWN0IGRhdGFzZWcgKmRzOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJaW50IGksIG47CisKKwlpZiAoQ21uZC0+dXNlX3NnKSB7CisJCWludCBzZ19jb3VudDsKKworCQlzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgQ21uZC0+YnVmZmVyOworCQlzZ19jb3VudCA9IHNidXNfbWFwX3NnKHFwdGktPnNkZXYsIHNnLCBDbW5kLT51c2Vfc2csIENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworCQlkcyA9IGNtZC0+ZGF0YXNlZzsKKwkJY21kLT5zZWdtZW50X2NudCA9IHNnX2NvdW50OworCisJCS8qIEZpbGwgaW4gZmlyc3QgZm91ciBzZyBlbnRyaWVzOiAqLworCQluID0gc2dfY291bnQ7CisJCWlmIChuID4gNCkKKwkJCW4gPSA0OworCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrLCBzZysrKSB7CisJCQlkc1tpXS5kX2Jhc2UgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCQlkc1tpXS5kX2NvdW50ID0gc2dfZG1hX2xlbihzZyk7CisJCX0KKwkJc2dfY291bnQgLT0gNDsKKwkJd2hpbGUgKHNnX2NvdW50ID4gMCkgeworCQkJc3RydWN0IENvbnRpbnVhdGlvbl9FbnRyeSAqY29udDsKKworCQkJKytjbWQtPmhkci5lbnRyeV9jbnQ7CisJCQljb250ID0gKHN0cnVjdCBDb250aW51YXRpb25fRW50cnkgKikgJnFwdGktPnJlcV9jcHVbaW5fcHRyXTsKKwkJCWluX3B0ciA9IE5FWFRfUkVRX1BUUihpbl9wdHIpOworCQkJaWYgKGluX3B0ciA9PSBvdXRfcHRyKQorCQkJCXJldHVybiAtMTsKKworCQkJY29udC0+aGRyLmVudHJ5X3R5cGUgPSBFTlRSWV9DT05USU5VQVRJT047CisJCQljb250LT5oZHIuZW50cnlfY250ID0gMDsKKwkJCWNvbnQtPmhkci5zeXNfZGVmXzEgPSAwOworCQkJY29udC0+aGRyLmZsYWdzID0gMDsKKwkJCWNvbnQtPnJlc2VydmVkID0gMDsKKwkJCWRzID0gY29udC0+ZGF0YXNlZzsKKwkJCW4gPSBzZ19jb3VudDsKKwkJCWlmIChuID4gNykKKwkJCQluID0gNzsKKwkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyssIHNnKyspIHsKKwkJCQlkc1tpXS5kX2Jhc2UgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCQkJZHNbaV0uZF9jb3VudCA9IHNnX2RtYV9sZW4oc2cpOworCQkJfQorCQkJc2dfY291bnQgLT0gbjsKKwkJfQorCX0gZWxzZSBpZiAoQ21uZC0+cmVxdWVzdF9idWZmbGVuKSB7CisJCUNtbmQtPlNDcC5wdHIgPSAoY2hhciAqKSh1bnNpZ25lZCBsb25nKQorCQkJc2J1c19tYXBfc2luZ2xlKHFwdGktPnNkZXYsCisJCQkJCUNtbmQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCQlDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCUNtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworCQljbWQtPmRhdGFzZWdbMF0uZF9iYXNlID0gKHUzMikgKCh1bnNpZ25lZCBsb25nKUNtbmQtPlNDcC5wdHIpOworCQljbWQtPmRhdGFzZWdbMF0uZF9jb3VudCA9IENtbmQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJY21kLT5zZWdtZW50X2NudCA9IDE7CisJfSBlbHNlIHsKKwkJY21kLT5kYXRhc2VnWzBdLmRfYmFzZSA9IDA7CisJCWNtZC0+ZGF0YXNlZ1swXS5kX2NvdW50ID0gMDsKKwkJY21kLT5zZWdtZW50X2NudCA9IDE7IC8qIFNob3VsZG4ndCB0aGlzIGJlIDA/ICovCisJfQorCisJLyogQ29tbWl0dGVkLCByZWNvcmQgU2NzaV9DbWQgc28gd2UgY2FuIGZpbmQgaXQgbGF0ZXIuICovCisJY21kLT5oYW5kbGUgPSBpbl9wdHI7CisJcXB0aS0+Y21kX3Nsb3RzW2luX3B0cl0gPSBDbW5kOworCisJcXB0aS0+Y21kX2NvdW50W0NtbmQtPmRldmljZS0+aWRdKys7CisJc2J1c193cml0ZXcoaW5fcHRyLCBxcHRpLT5xcmVncyArIE1CT1g0KTsKKwlxcHRpLT5yZXFfaW5fcHRyID0gaW5fcHRyOworCisJcmV0dXJuIGluX3B0cjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9jYW5fcXVldWUoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgdV9pbnQgaW5fcHRyLCB1X2ludCBvdXRfcHRyKQoreworCS8qIFRlbXBvcmFyeSB3b3JrYXJvdW5kIHVudGlsIGJ1ZyBpcyBmb3VuZCBhbmQgZml4ZWQgKG9uZSBidWcgaGFzIGJlZW4gZm91bmQKKwkgICBhbHJlYWR5LCBidXQgZml4aW5nIGl0IG1ha2VzIHRoaW5ncyBldmVuIHdvcnNlKSAtamogKi8KKwlpbnQgbnVtX2ZyZWUgPSBRTE9HSUNQVElfUkVRX1FVRVVFX0xFTiAtIFJFUV9RVUVVRV9ERVBUSChpbl9wdHIsIG91dF9wdHIpIC0gNjQ7CisJaG9zdC0+Y2FuX3F1ZXVlID0gaG9zdC0+aG9zdF9idXN5ICsgbnVtX2ZyZWU7CisJaG9zdC0+c2dfdGFibGVzaXplID0gUUxPR0lDUFRJX01BWF9TRyhudW1fZnJlZSk7Cit9CisKKy8qCisgKiBVbnRpbCB3ZSBzY2FuIHRoZSBlbnRpcmUgYnVzIHdpdGggaW5xdWlyaWVzLCBnbyB0aHJvdWdodCB0aGlzIGZlbGxhLi4uCisgKi8KK3N0YXRpYyB2b2lkIG91cmRvbmUoc3RydWN0IHNjc2lfY21uZCAqQ21uZCkKK3sKKwlzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpID0gKHN0cnVjdCBxbG9naWNwdGkgKikgQ21uZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlpbnQgdGd0ID0gQ21uZC0+ZGV2aWNlLT5pZDsKKwl2b2lkICgqZG9uZSkgKHN0cnVjdCBzY3NpX2NtbmQgKik7CisKKwkvKiBUaGlzIGdyb3QgYWRkZWQgYnkgRGF2ZU0sIGJsYW1lIGhpbSBmb3IgdWdsaW5lc3MuCisJICogVGhlIGlzc3VlIGlzIHRoYXQgaW4gdGhlIDIuMy54IGRyaXZlciB3ZSB1c2UgdGhlCisJICogaG9zdF9zY3JpYmJsZSBwb3J0aW9uIG9mIHRoZSBzY3NpIGNvbW1hbmQgYXMgYQorCSAqIGNvbXBsZXRpb24gbGlua2VkIGxpc3QgYXQgaW50ZXJydXB0IHNlcnZpY2UgdGltZSwKKwkgKiBzbyB3ZSBoYXZlIHRvIHN0b3JlIHRoZSBkb25lIGZ1bmN0aW9uIHBvaW50ZXIgZWxzZXdoZXJlLgorCSAqLworCWRvbmUgPSAodm9pZCAoKikoc3RydWN0IHNjc2lfY21uZCAqKSkKKwkJKCgodW5zaWduZWQgbG9uZykgQ21uZC0+U0NwLk1lc3NhZ2UpCisjaWZkZWYgX19zcGFyY192OV9fCisJCSB8ICgodW5zaWduZWQgbG9uZykgQ21uZC0+U0NwLlN0YXR1cyA8PCAzMlVMKQorI2VuZGlmCisJCSApOworCisJaWYgKChxcHRpLT5zYml0cyAmICgxIDw8IHRndCkpID09IDApIHsKKwkJaW50IG9rID0gaG9zdF9ieXRlKENtbmQtPnJlc3VsdCkgPT0gRElEX09LOworCQlpZiAoQ21uZC0+Y21uZFswXSA9PSAweDEyICYmIG9rKSB7CisJCQl1bnNpZ25lZCBjaGFyICppcWQ7CisKKwkJCWlmIChDbW5kLT51c2Vfc2cgIT0gMCkKKwkJCQlCVUcoKTsKKworCQkJaXFkID0gKCh1bnNpZ25lZCBjaGFyICopQ21uZC0+YnVmZmVyKTsKKworCQkJLyogdGFncyBoYW5kbGVkIGluIG1pZGxheWVyICovCisJCQkvKiBlbmFibGUgc3luYyBtb2RlPyAqLworCQkJaWYgKGlxZFs3XSAmIDB4MTApIHsKKwkJCQlxcHRpLT5kZXZfcGFyYW1bdGd0XS5kZXZpY2VfZmxhZ3MgfD0gMHgxMDsKKwkJCX0gZWxzZSB7CisJCQkJcXB0aS0+ZGV2X3BhcmFtW3RndF0uc3luY2hyb25vdXNfb2Zmc2V0ID0gMDsKKwkJCQlxcHRpLT5kZXZfcGFyYW1bdGd0XS5zeW5jaHJvbm91c19wZXJpb2QgPSAwOworCQkJfQorCQkJLyogYXJlIHdlIHdpZGUgY2FwYWJsZT8gKi8KKwkJCWlmIChpcWRbN10gJiAweDIwKSB7CisJCQkJcXB0aS0+ZGV2X3BhcmFtW3RndF0uZGV2aWNlX2ZsYWdzIHw9IDB4MjA7CisJCQl9CisJCQlxcHRpLT5zYml0cyB8PSAoMSA8PCB0Z3QpOworCQl9IGVsc2UgaWYgKCFvaykgeworCQkJcXB0aS0+c2JpdHMgfD0gKDEgPDwgdGd0KTsKKwkJfQorCX0KKwlkb25lKENtbmQpOworfQorCitzdGF0aWMgaW50IHFsb2dpY3B0aV9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqQ21uZCwgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpOworCitzdGF0aWMgaW50IHFsb2dpY3B0aV9xdWV1ZWNvbW1hbmRfc2xvdyhzdHJ1Y3Qgc2NzaV9jbW5kICpDbW5kLAorCQkJCSAgICAgICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpID0gKHN0cnVjdCBxbG9naWNwdGkgKikgQ21uZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCS8qCisJICogZG9uZSBjaGVja2luZyB0aGlzIGhvc3QgYWRhcHRlcj8KKwkgKiBJZiBub3QsIHRoZW4gcmV3cml0ZSB0aGUgY29tbWFuZAorCSAqIHRvIGZpbmlzaCB0aHJvdWdoIG91cmRvbmUgc28gd2UKKwkgKiBjYW4gcGVlayBhdCBJbnF1aXJ5IGRhdGEgcmVzdWx0cy4KKwkgKi8KKwlpZiAocXB0aS0+c2JpdHMgJiYgcXB0aS0+c2JpdHMgIT0gMHhmZmZmKSB7CisJCS8qIFNlZSBhYm92ZSBhYm91dCBpbiBvdXJkb25lIHRoaXMgdWdsaW5lc3MuLi4gKi8KKwkJQ21uZC0+U0NwLk1lc3NhZ2UgPSAoKHVuc2lnbmVkIGxvbmcpZG9uZSkgJiAweGZmZmZmZmZmOworI2lmZGVmIENPTkZJR19TUEFSQzY0CisJCUNtbmQtPlNDcC5TdGF0dXMgPSAoKHVuc2lnbmVkIGxvbmcpZG9uZSA+PiAzMlVMKSAmIDB4ZmZmZmZmZmY7CisjZW5kaWYKKwkJcmV0dXJuIHFsb2dpY3B0aV9xdWV1ZWNvbW1hbmQoQ21uZCwgb3VyZG9uZSk7CisJfQorCisJLyoKKwkgKiBXZSd2ZSBwZWVrZWQgYXQgYWxsIHRhcmdldHMgZm9yIHRoaXMgYnVzLSB0aW1lCisJICogdG8gc2V0IHBhcmFtZXRlcnMgZm9yIGRldmljZXMgZm9yIHJlYWwgbm93LgorCSAqLworCWlmIChxcHRpLT5zYml0cyA9PSAweGZmZmYpIHsKKwkJaW50IGk7CisJCWZvcihpID0gMDsgaSA8IE1BWF9UQVJHRVRTOyBpKyspIHsKKwkJCXVfc2hvcnQgcGFyYW1bNl07CisJCQlwYXJhbVswXSA9IE1CT1hfU0VUX1RBUkdFVF9QQVJBTVM7CisJCQlwYXJhbVsxXSA9IChpIDw8IDgpOworCQkJcGFyYW1bMl0gPSAocXB0aS0+ZGV2X3BhcmFtW2ldLmRldmljZV9mbGFncyA8PCA4KTsKKwkJCWlmIChxcHRpLT5kZXZfcGFyYW1baV0uZGV2aWNlX2ZsYWdzICYgMHgxMCkgeworCQkJCXBhcmFtWzNdID0gKHFwdGktPmRldl9wYXJhbVtpXS5zeW5jaHJvbm91c19vZmZzZXQgPDwgOCkgfAorCQkJCQlxcHRpLT5kZXZfcGFyYW1baV0uc3luY2hyb25vdXNfcGVyaW9kOworCQkJfSBlbHNlIHsKKwkJCQlwYXJhbVszXSA9IDA7CisJCQl9CisJCQkodm9pZCkgcWxvZ2ljcHRpX21ib3hfY29tbWFuZChxcHRpLCBwYXJhbSwgMCk7CisJCX0KKwkJLyoKKwkJICogc2V0IHRvIHplcm8gc28gYW55IHRyYXZlcnNlIHRocm91Z2ggb3VyZG9uZQorCQkgKiBkb2Vzbid0IHN0YXJ0IHRoZSB3aG9sZSBwcm9jZXNzIGFnYWluLAorCQkgKi8KKwkJcXB0aS0+c2JpdHMgPSAwOworCX0KKworCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSdyZSBkb25lIHdpdGggYWxsIGFkYXB0ZXJzLi4uICovCisJZm9yIChxcHRpID0gcXB0aWNoYWluOyBxcHRpICE9IE5VTEw7IHFwdGkgPSBxcHRpLT5uZXh0KSB7CisJCWlmIChxcHRpLT5zYml0cykgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBjaGFpbiB3L28gZmluZGluZyBhZGFwdGVycyBzdGlsbAorCSAqIGNhcGFiaWxpdHktY29uZmlndXJpbmcsIHRoZW4gd2UncmUgZG9uZSB3aXRoIGFsbCBhZGFwdGVycworCSAqIGFuZCBjYW4gcm9jayBvbi4uCisJICovCisJaWYgKHFwdGkgPT0gTlVMTCkKKwkJQ21uZC0+ZGV2aWNlLT5ob3N0LT5ob3N0dC0+cXVldWVjb21tYW5kID0gcWxvZ2ljcHRpX3F1ZXVlY29tbWFuZDsKKworCXJldHVybiBxbG9naWNwdGlfcXVldWVjb21tYW5kKENtbmQsIGRvbmUpOworfQorCisvKgorICogVGhlIG1pZGRsZSBTQ1NJIGxheWVyIGVuc3VyZXMgdGhhdCBxdWV1ZWNvbW1hbmQgbmV2ZXIgZ2V0cyBpbnZva2VkCisgKiBjb25jdXJyZW50bHkgd2l0aCBpdHNlbGYgb3IgdGhlIGludGVycnVwdCBoYW5kbGVyICh0aG91Z2ggdGhlCisgKiBpbnRlcnJ1cHQgaGFuZGxlciBtYXkgY2FsbCB0aGlzIHJvdXRpbmUgYXMgcGFydCBvZgorICogcmVxdWVzdC1jb21wbGV0aW9uIGhhbmRsaW5nKS4KKyAqCisgKiAiVGhpcyBjb2RlIG11c3QgZmx5LiIgLWRhdmVtCisgKi8KK3N0YXRpYyBpbnQgcWxvZ2ljcHRpX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpDbW5kLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gQ21uZC0+ZGV2aWNlLT5ob3N0OworCXN0cnVjdCBxbG9naWNwdGkgKnFwdGkgPSAoc3RydWN0IHFsb2dpY3B0aSAqKSBob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgQ29tbWFuZF9FbnRyeSAqY21kOworCXVfaW50IG91dF9wdHI7CisJaW50IGluX3B0cjsKKworCUNtbmQtPnNjc2lfZG9uZSA9IGRvbmU7CisKKwlpbl9wdHIgPSBxcHRpLT5yZXFfaW5fcHRyOworCWNtZCA9IChzdHJ1Y3QgQ29tbWFuZF9FbnRyeSAqKSAmcXB0aS0+cmVxX2NwdVtpbl9wdHJdOworCW91dF9wdHIgPSBzYnVzX3JlYWR3KHFwdGktPnFyZWdzICsgTUJPWDQpOworCWluX3B0ciA9IE5FWFRfUkVRX1BUUihpbl9wdHIpOworCWlmIChpbl9wdHIgPT0gb3V0X3B0cikKKwkJZ290byB0b3NzX2NvbW1hbmQ7CisKKwlpZiAocXB0aS0+c2VuZF9tYXJrZXIpIHsKKwkJbWFya2VyX2Zyb2IoY21kKTsKKwkJcXB0aS0+c2VuZF9tYXJrZXIgPSAwOworCQlpZiAoTkVYVF9SRVFfUFRSKGluX3B0cikgPT0gb3V0X3B0cikgeworCQkJc2J1c193cml0ZXcoaW5fcHRyLCBxcHRpLT5xcmVncyArIE1CT1g0KTsKKwkJCXFwdGktPnJlcV9pbl9wdHIgPSBpbl9wdHI7CisJCQlnb3RvIHRvc3NfY29tbWFuZDsKKwkJfQorCQljbWQgPSAoc3RydWN0IENvbW1hbmRfRW50cnkgKikgJnFwdGktPnJlcV9jcHVbaW5fcHRyXTsKKwkJaW5fcHRyID0gTkVYVF9SRVFfUFRSKGluX3B0cik7CisJfQorCWNtZF9mcm9iKGNtZCwgQ21uZCwgcXB0aSk7CisJaWYgKChpbl9wdHIgPSBsb2FkX2NtZChDbW5kLCBjbWQsIHFwdGksIGluX3B0ciwgb3V0X3B0cikpID09IC0xKQorCQlnb3RvIHRvc3NfY29tbWFuZDsKKworCXVwZGF0ZV9jYW5fcXVldWUoaG9zdCwgaW5fcHRyLCBvdXRfcHRyKTsKKworCXJldHVybiAwOworCit0b3NzX2NvbW1hbmQ6CisJcHJpbnRrKEtFUk5fRU1FUkcgInFsb2dpY3B0aSVkOiByZXF1ZXN0IHF1ZXVlIG92ZXJmbG93XG4iLAorCSAgICAgICBxcHRpLT5xcHRpX2lkKTsKKworCS8qIFVuZm9ydHVuYXRlbHksIHVubGVzcyB5b3UgdXNlIHRoZSBuZXcgRUggY29kZSwgd2hpY2gKKwkgKiB3ZSBkb24ndCwgdGhlIG1pZGxheWVyIHdpbGwgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUsCisJICogd2hpY2ggaXMgaW5zYW5lLiAgV2UgcGljayB1cCB0aGUgcGllY2VzIGxpa2UgdGhpcy4KKwkgKi8KKwlDbW5kLT5yZXN1bHQgPSBESURfQlVTX0JVU1k7CisJZG9uZShDbW5kKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBxbG9naWNwdGlfcmV0dXJuX3N0YXR1cyhzdHJ1Y3QgU3RhdHVzX0VudHJ5ICpzdHMsIGludCBpZCkKK3sKKwlpbnQgaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisKKwlzd2l0Y2ggKHN0cy0+Y29tcGxldGlvbl9zdGF0dXMpIHsKKwkgICAgICBjYXNlIENTX0NPTVBMRVRFOgorCQlob3N0X3N0YXR1cyA9IERJRF9PSzsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBDU19JTkNPTVBMRVRFOgorCQlpZiAoIShzdHMtPnN0YXRlX2ZsYWdzICYgU0ZfR09UX0JVUykpCisJCQlob3N0X3N0YXR1cyA9IERJRF9OT19DT05ORUNUOworCQllbHNlIGlmICghKHN0cy0+c3RhdGVfZmxhZ3MgJiBTRl9HT1RfVEFSR0VUKSkKKwkJCWhvc3Rfc3RhdHVzID0gRElEX0JBRF9UQVJHRVQ7CisJCWVsc2UgaWYgKCEoc3RzLT5zdGF0ZV9mbGFncyAmIFNGX1NFTlRfQ0RCKSkKKwkJCWhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCQllbHNlIGlmICghKHN0cy0+c3RhdGVfZmxhZ3MgJiBTRl9UUkFOU0ZFUlJFRF9EQVRBKSkKKwkJCWhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCQllbHNlIGlmICghKHN0cy0+c3RhdGVfZmxhZ3MgJiBTRl9HT1RfU1RBVFVTKSkKKwkJCWhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCQllbHNlIGlmICghKHN0cy0+c3RhdGVfZmxhZ3MgJiBTRl9HT1RfU0VOU0UpKQorCQkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJCWJyZWFrOworCSAgICAgIGNhc2UgQ1NfRE1BX0VSUk9SOgorCSAgICAgIGNhc2UgQ1NfVFJBTlNQT1JUX0VSUk9SOgorCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBDU19SRVNFVF9PQ0NVUlJFRDoKKwkgICAgICBjYXNlIENTX0JVU19SRVNFVDoKKwkJaG9zdF9zdGF0dXMgPSBESURfUkVTRVQ7CisJCWJyZWFrOworCSAgICAgIGNhc2UgQ1NfQUJPUlRFRDoKKwkJaG9zdF9zdGF0dXMgPSBESURfQUJPUlQ7CisJCWJyZWFrOworCSAgICAgIGNhc2UgQ1NfVElNRU9VVDoKKwkJaG9zdF9zdGF0dXMgPSBESURfVElNRV9PVVQ7CisJCWJyZWFrOworCSAgICAgIGNhc2UgQ1NfREFUQV9PVkVSUlVOOgorCSAgICAgIGNhc2UgQ1NfQ09NTUFORF9PVkVSUlVOOgorCSAgICAgIGNhc2UgQ1NfU1RBVFVTX09WRVJSVU46CisJICAgICAgY2FzZSBDU19CQURfTUVTU0FHRToKKwkgICAgICBjYXNlIENTX05PX01FU1NBR0VfT1VUOgorCSAgICAgIGNhc2UgQ1NfRVhUX0lEX0ZBSUxFRDoKKwkgICAgICBjYXNlIENTX0lERV9NU0dfRkFJTEVEOgorCSAgICAgIGNhc2UgQ1NfQUJPUlRfTVNHX0ZBSUxFRDoKKwkgICAgICBjYXNlIENTX05PUF9NU0dfRkFJTEVEOgorCSAgICAgIGNhc2UgQ1NfUEFSSVRZX0VSUk9SX01TR19GQUlMRUQ6CisJICAgICAgY2FzZSBDU19ERVZJQ0VfUkVTRVRfTVNHX0ZBSUxFRDoKKwkgICAgICBjYXNlIENTX0lEX01TR19GQUlMRUQ6CisJICAgICAgY2FzZSBDU19VTkVYUF9CVVNfRlJFRToKKwkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJCWJyZWFrOworCSAgICAgIGNhc2UgQ1NfREFUQV9VTkRFUlJVTjoKKwkJaG9zdF9zdGF0dXMgPSBESURfT0s7CisJCWJyZWFrOworCSAgICAgIGRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VNRVJHICJxcHRpJWQ6IHVua25vd24gY29tcGxldGlvbiBzdGF0dXMgMHglMDR4XG4iLAorCQkgICAgICAgaWQsIHN0cy0+Y29tcGxldGlvbl9zdGF0dXMpOworCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIChzdHMtPnNjc2lfc3RhdHVzICYgU1RBVFVTX01BU0spIHwgKGhvc3Rfc3RhdHVzIDw8IDE2KTsKK30KKworc3RhdGljIHN0cnVjdCBzY3NpX2NtbmQgKnFsb2dpY3B0aV9pbnRyX2hhbmRsZXIoc3RydWN0IHFsb2dpY3B0aSAqcXB0aSkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpDbW5kLCAqZG9uZV9xdWV1ZSA9IE5VTEw7CisJc3RydWN0IFN0YXR1c19FbnRyeSAqc3RzOworCXVfaW50IGluX3B0ciwgb3V0X3B0cjsKKworCWlmICghKHNidXNfcmVhZHcocXB0aS0+cXJlZ3MgKyBTQlVTX1NUQVQpICYgU0JVU19TVEFUX1JJTlQpKQorCQlyZXR1cm4gTlVMTDsKKwkJCisJaW5fcHRyID0gc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIE1CT1g1KTsKKwlzYnVzX3dyaXRldyhIQ0NUUkxfQ1JJUlEsIHFwdGktPnFyZWdzICsgSENDVFJMKTsKKwlpZiAoc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIFNCVVNfU0VNQVBIT1JFKSAmIFNCVVNfU0VNQVBIT1JFX0xDSykgeworCQlzd2l0Y2ggKHNidXNfcmVhZHcocXB0aS0+cXJlZ3MgKyBNQk9YMCkpIHsKKwkJY2FzZSBBU1lOQ19TQ1NJX0JVU19SRVNFVDoKKwkJY2FzZSBFWEVDVVRJT05fVElNRU9VVF9SRVNFVDoKKwkJCXFwdGktPnNlbmRfbWFya2VyID0gMTsKKwkJCWJyZWFrOworCQljYXNlIElOVkFMSURfQ09NTUFORDoKKwkJY2FzZSBIT1NUX0lOVEVSRkFDRV9FUlJPUjoKKwkJY2FzZSBDT01NQU5EX0VSUk9SOgorCQljYXNlIENPTU1BTkRfUEFSQU1fRVJST1I6CisJCQlicmVhazsKKwkJfTsKKwkJc2J1c193cml0ZXcoMCwgcXB0aS0+cXJlZ3MgKyBTQlVTX1NFTUFQSE9SRSk7CisJfQorCisJLyogVGhpcyBsb29rcyBsaWtlIGEgbmV0d29yayBkcml2ZXIhICovCisJb3V0X3B0ciA9IHFwdGktPnJlc19vdXRfcHRyOworCXdoaWxlIChvdXRfcHRyICE9IGluX3B0cikgeworCQl1X2ludCBjbWRfc2xvdDsKKworCQlzdHMgPSAoc3RydWN0IFN0YXR1c19FbnRyeSAqKSAmcXB0aS0+cmVzX2NwdVtvdXRfcHRyXTsKKwkJb3V0X3B0ciA9IE5FWFRfUkVTX1BUUihvdXRfcHRyKTsKKworCQkvKiBXZSBzdG9yZSBhbiBpbmRleCBpbiB0aGUgaGFuZGxlLCBub3QgdGhlIHBvaW50ZXIgaW4KKwkJICogc29tZSBmb3JtLiAgVGhpcyBhdm9pZHMgcHJvYmxlbXMgZHVlIHRvIHRoZSBmYWN0CisJCSAqIHRoYXQgdGhlIGhhbmRsZSBwcm92aWRlZCBpcyBvbmx5IDMyLWJpdHMuIC1EYXZlTQorCQkgKi8KKwkJY21kX3Nsb3QgPSBzdHMtPmhhbmRsZTsKKwkJQ21uZCA9IHFwdGktPmNtZF9zbG90c1tjbWRfc2xvdF07CisJCXFwdGktPmNtZF9zbG90c1tjbWRfc2xvdF0gPSBOVUxMOworCisJCWlmIChzdHMtPmNvbXBsZXRpb25fc3RhdHVzID09IENTX1JFU0VUX09DQ1VSUkVEIHx8CisJCSAgICBzdHMtPmNvbXBsZXRpb25fc3RhdHVzID09IENTX0FCT1JURUQgfHwKKwkJICAgIChzdHMtPnN0YXR1c19mbGFncyAmIFNURl9CVVNfUkVTRVQpKQorCQkJcXB0aS0+c2VuZF9tYXJrZXIgPSAxOworCisJCWlmIChzdHMtPnN0YXRlX2ZsYWdzICYgU0ZfR09UX1NFTlNFKQorCQkJbWVtY3B5KENtbmQtPnNlbnNlX2J1ZmZlciwgc3RzLT5yZXFfc2Vuc2VfZGF0YSwKKwkJCSAgICAgICBzaXplb2YoQ21uZC0+c2Vuc2VfYnVmZmVyKSk7CisKKwkJaWYgKHN0cy0+aGRyLmVudHJ5X3R5cGUgPT0gRU5UUllfU1RBVFVTKQorCQkJQ21uZC0+cmVzdWx0ID0KKwkJCSAgICBxbG9naWNwdGlfcmV0dXJuX3N0YXR1cyhzdHMsIHFwdGktPnFwdGlfaWQpOworCQllbHNlCisJCQlDbW5kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisKKwkJaWYgKENtbmQtPnVzZV9zZykgeworCQkJc2J1c191bm1hcF9zZyhxcHRpLT5zZGV2LAorCQkJCSAgICAgIChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilDbW5kLT5idWZmZXIsCisJCQkJICAgICAgQ21uZC0+dXNlX3NnLAorCQkJCSAgICAgIENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJfSBlbHNlIHsKKwkJCXNidXNfdW5tYXBfc2luZ2xlKHFwdGktPnNkZXYsCisJCQkJCSAgKF9fdTMyKSgodW5zaWduZWQgbG9uZylDbW5kLT5TQ3AucHRyKSwKKwkJCQkJICBDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCSAgQ21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQl9CisJCXFwdGktPmNtZF9jb3VudFtDbW5kLT5kZXZpY2UtPmlkXS0tOworCQlzYnVzX3dyaXRldyhvdXRfcHRyLCBxcHRpLT5xcmVncyArIE1CT1g1KTsKKwkJQ21uZC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopIGRvbmVfcXVldWU7CisJCWRvbmVfcXVldWUgPSBDbW5kOworCX0KKwlxcHRpLT5yZXNfb3V0X3B0ciA9IG91dF9wdHI7CisKKwlyZXR1cm4gZG9uZV9xdWV1ZTsKK30KKworc3RhdGljIGlycXJldHVybl90IHFwdGlfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBxbG9naWNwdGkgKnFwdGkgPSBkZXZfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpkcTsKKworCXNwaW5fbG9ja19pcnFzYXZlKHFwdGktPnFob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlkcSA9IHFsb2dpY3B0aV9pbnRyX2hhbmRsZXIocXB0aSk7CisKKwlpZiAoZHEgIT0gTlVMTCkgeworCQlkbyB7CisJCQlzdHJ1Y3Qgc2NzaV9jbW5kICpuZXh0OworCisJCQluZXh0ID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgZHEtPmhvc3Rfc2NyaWJibGU7CisJCQlkcS0+c2NzaV9kb25lKGRxKTsKKwkJCWRxID0gbmV4dDsKKwkJfSB3aGlsZSAoZHEgIT0gTlVMTCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocXB0aS0+cWhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHFsb2dpY3B0aV9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpDbW5kKQoreworCXVfc2hvcnQgcGFyYW1bNl07CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IENtbmQtPmRldmljZS0+aG9zdDsKKwlzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpID0gKHN0cnVjdCBxbG9naWNwdGkgKikgaG9zdC0+aG9zdGRhdGE7CisJaW50IHJldHVybl9zdGF0dXMgPSBTVUNDRVNTOworCXUzMiBjbWRfY29va2llOworCWludCBpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAicWxvZ2ljcHRpIDogQWJvcnRpbmcgY21kIGZvciB0Z3RbJWRdIGx1blslZF1cbiIsCisJICAgICAgIChpbnQpQ21uZC0+ZGV2aWNlLT5pZCwgKGludClDbW5kLT5kZXZpY2UtPmx1bik7CisKKwlxbG9naWNwdGlfZGlzYWJsZV9pcnFzKHFwdGkpOworCisJLyogRmluZCB0aGUgMzItYml0IGNvb2tpZSB3ZSBnYXZlIHRvIHRoZSBmaXJtd2FyZSBmb3IKKwkgKiB0aGlzIGNvbW1hbmQuCisJICovCisJZm9yIChpID0gMDsgaSA8IFFMT0dJQ1BUSV9SRVFfUVVFVUVfTEVOICsgMTsgaSsrKQorCQlpZiAocXB0aS0+Y21kX3Nsb3RzW2ldID09IENtbmQpCisJCQlicmVhazsKKwljbWRfY29va2llID0gaTsKKworCXBhcmFtWzBdID0gTUJPWF9BQk9SVDsKKwlwYXJhbVsxXSA9ICgoKHVfc2hvcnQpIENtbmQtPmRldmljZS0+aWQpIDw8IDgpIHwgQ21uZC0+ZGV2aWNlLT5sdW47CisJcGFyYW1bMl0gPSBjbWRfY29va2llID4+IDE2OworCXBhcmFtWzNdID0gY21kX2Nvb2tpZSAmIDB4ZmZmZjsKKwlpZiAocWxvZ2ljcHRpX21ib3hfY29tbWFuZChxcHRpLCBwYXJhbSwgMCkgfHwKKwkgICAgKHBhcmFtWzBdICE9IE1CT1hfQ09NTUFORF9DT01QTEVURSkpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgInFsb2dpY3B0aSA6IHNjc2kgYWJvcnQgZmFpbHVyZTogJXhcbiIsIHBhcmFtWzBdKTsKKwkJcmV0dXJuX3N0YXR1cyA9IEZBSUxFRDsKKwl9CisKKwlxbG9naWNwdGlfZW5hYmxlX2lycXMocXB0aSk7CisKKwlyZXR1cm4gcmV0dXJuX3N0YXR1czsKK30KKworc3RhdGljIGludCBxbG9naWNwdGlfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqQ21uZCkKK3sKKwl1X3Nob3J0IHBhcmFtWzZdOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBDbW5kLT5kZXZpY2UtPmhvc3Q7CisJc3RydWN0IHFsb2dpY3B0aSAqcXB0aSA9IChzdHJ1Y3QgcWxvZ2ljcHRpICopIGhvc3QtPmhvc3RkYXRhOworCWludCByZXR1cm5fc3RhdHVzID0gU1VDQ0VTUzsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgInFsb2dpY3B0aSA6IFJlc2V0dGluZyBTQ1NJIGJ1cyFcbiIpOworCisJcWxvZ2ljcHRpX2Rpc2FibGVfaXJxcyhxcHRpKTsKKworCXBhcmFtWzBdID0gTUJPWF9CVVNfUkVTRVQ7CisJcGFyYW1bMV0gPSBxcHRpLT5ob3N0X3BhcmFtLmJ1c19yZXNldF9kZWxheTsKKwlpZiAocWxvZ2ljcHRpX21ib3hfY29tbWFuZChxcHRpLCBwYXJhbSwgMCkgfHwKKwkgICAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSkgeworCQlwcmludGsoS0VSTl9FTUVSRyAicWxvZ2ljaXNwIDogc2NzaSBidXMgcmVzZXQgZmFpbHVyZTogJXhcbiIsIHBhcmFtWzBdKTsKKwkJcmV0dXJuX3N0YXR1cyA9IEZBSUxFRDsKKwl9CisKKwlxbG9naWNwdGlfZW5hYmxlX2lycXMocXB0aSk7CisKKwlyZXR1cm4gcmV0dXJuX3N0YXR1czsKK30KKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5kZXRlY3QJCQk9IHFsb2dpY3B0aV9kZXRlY3QsCisJLnJlbGVhc2UJCT0gcWxvZ2ljcHRpX3JlbGVhc2UsCisJLmluZm8JCQk9IHFsb2dpY3B0aV9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gcWxvZ2ljcHRpX3F1ZXVlY29tbWFuZF9zbG93LAorCS5laF9hYm9ydF9oYW5kbGVyCT0gcWxvZ2ljcHRpX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IHFsb2dpY3B0aV9yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IFFMT0dJQ1BUSV9SRVFfUVVFVUVfTEVOLAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSBRTE9HSUNQVElfTUFYX1NHKFFMT0dJQ1BUSV9SRVFfUVVFVUVfTEVOKSwKKwkuY21kX3Blcl9sdW4JCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCit9OworCisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbG9naWNwdGkuaCBiL2RyaXZlcnMvc2NzaS9xbG9naWNwdGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QxYzA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aS5oCkBAIC0wLDAgKzEsNTA4IEBACisvKiBxbG9naWNwdGkuaDogUGVyZm9ybWFuY2UgVGVjaG5vbG9naWVzIFFsb2dpY0lTUCBzYnVzIGNhcmQgZGVmaW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwZnMucnV0Z2Vycy5lZHUpCisgKi8KKworI2lmbmRlZiBfUUxPR0lDUFRJX0gKKyNkZWZpbmUgX1FMT0dJQ1BUSV9ICisKKy8qIFFsb2dpYy9TQlVTIGNvbnRyb2xsZXIgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBTQlVTX0NGRzEJMHgwMDZVTAorI2RlZmluZSBTQlVTX0NUUkwJMHgwMDhVTAorI2RlZmluZSBTQlVTX1NUQVQJMHgwMGFVTAorI2RlZmluZSBTQlVTX1NFTUFQSE9SRQkweDAwY1VMCisjZGVmaW5lIENNRF9ETUFfQ1RSTAkweDAyMlVMCisjZGVmaW5lIERBVEFfRE1BX0NUUkwJMHgwNDJVTAorI2RlZmluZSBNQk9YMAkJMHgwODBVTAorI2RlZmluZSBNQk9YMQkJMHgwODJVTAorI2RlZmluZSBNQk9YMgkJMHgwODRVTAorI2RlZmluZSBNQk9YMwkJMHgwODZVTAorI2RlZmluZSBNQk9YNAkJMHgwODhVTAorI2RlZmluZSBNQk9YNQkJMHgwOGFVTAorI2RlZmluZSBDUFVfQ01ECQkweDIxNFVMCisjZGVmaW5lIENQVV9PUklERQkweDIyNFVMCisjZGVmaW5lIENQVV9QQ1RSTAkweDI3MlVMCisjZGVmaW5lIENQVV9QRElGRgkweDI3NlVMCisjZGVmaW5lIFJJU0NfUFNSCTB4NDIwVUwKKyNkZWZpbmUgUklTQ19NVFJFRwkweDQyRVVMCisjZGVmaW5lIEhDQ1RSTAkJMHg0NDBVTAorCisvKiBTQ1NJIHBhcmFtZXRlcnMgZm9yIHRoaXMgZHJpdmVyLiAqLworI2RlZmluZSBNQVhfVEFSR0VUUwkxNgorI2RlZmluZSBNQVhfTFVOUwk4CisKKy8qIFdpdGggdGhlIHFsb2dpYyBpbnRlcmZhY2UsIGV2ZXJ5IHF1ZXVlIHNsb3QgY2FuIGhvbGQgYSBTQ1NJCisgKiBjb21tYW5kIHdpdGggdXAgdG8gNCBzY2F0dGVyL2dhdGhlciBlbnRyaWVzLiAgSWYgd2UgbmVlZCBtb3JlCisgKiB0aGFuIDQgZW50cmllcywgY29udGludWF0aW9uIGVudHJpZXMgY2FuIGJlIHVzZWQgdGhhdCBob2xkCisgKiBhbm90aGVyIDcgZW50cmllcyBlYWNoLiAgVW5saWtlIGZvciBvdGhlciBkcml2ZXJzLCB0aGlzIG1lYW5zCisgKiB0aGF0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBzY2F0dGVyL2dhdGhlciBlbnRyaWVzIHdlIGNhbgorICogc3VwcG9ydCBhdCBhbnkgZ2l2ZW4gdGltZSBpcyBhIGZ1bmN0aW9uIG9mIHRoZSBudW1iZXIgb2YgcXVldWUKKyAqIHNsb3RzIGF2YWlsYWJsZS4gIFRoYXQgaXMsIGhvc3QtPmNhbl9xdWV1ZSBhbmQgaG9zdC0+c2dfdGFibGVzaXplCisgKiBhcmUgZHluYW1pYyBhbmQgX25vdF8gaW5kZXBlbmRlbnQuICBUaGlzIGFsbCB3b3JrcyBmaW5lIGJlY2F1c2UKKyAqIHJlcXVlc3RzIGFyZSBxdWV1ZWQgc2VyaWFsbHkgYW5kIHRoZSBzY2F0dGVyL2dhdGhlciBsaW1pdCBpcworICogZGV0ZXJtaW5lZCBmb3IgZWFjaCBxdWV1ZSByZXF1ZXN0IGFuZXcuCisgKi8KKyNkZWZpbmUgUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4JMjU1CS8qIG11c3QgYmUgcG93ZXIgb2YgdHdvIC0gMSAqLworI2RlZmluZSBRTE9HSUNQVElfTUFYX1NHKHFsKQkoNCArICgocWwpID4gMCkgPyA3KigocWwpIC0gMSkgOiAwKQorCisvKiBtYWlsYm94IGNvbW1hbmQgY29tcGxldGUgc3RhdHVzIGNvZGVzICovCisjZGVmaW5lIE1CT1hfQ09NTUFORF9DT01QTEVURQkJMHg0MDAwCisjZGVmaW5lIElOVkFMSURfQ09NTUFORAkJCTB4NDAwMQorI2RlZmluZSBIT1NUX0lOVEVSRkFDRV9FUlJPUgkJMHg0MDAyCisjZGVmaW5lIFRFU1RfRkFJTEVECQkJMHg0MDAzCisjZGVmaW5lIENPTU1BTkRfRVJST1IJCQkweDQwMDUKKyNkZWZpbmUgQ09NTUFORF9QQVJBTV9FUlJPUgkJMHg0MDA2CisKKy8qIGFzeW5jIGV2ZW50IHN0YXR1cyBjb2RlcyAqLworI2RlZmluZSBBU1lOQ19TQ1NJX0JVU19SRVNFVAkJMHg4MDAxCisjZGVmaW5lIFNZU1RFTV9FUlJPUgkJCTB4ODAwMgorI2RlZmluZSBSRVFVRVNUX1RSQU5TRkVSX0VSUk9SCQkweDgwMDMKKyNkZWZpbmUgUkVTUE9OU0VfVFJBTlNGRVJfRVJST1IJCTB4ODAwNAorI2RlZmluZSBSRVFVRVNUX1FVRVVFX1dBS0VVUAkJMHg4MDA1CisjZGVmaW5lIEVYRUNVVElPTl9USU1FT1VUX1JFU0VUCQkweDgwMDYKKworLyogQW0gSSBmdWNraW5nIHBlZGFudGljIG9yIHdoYXQ/ICovCitzdHJ1Y3QgRW50cnlfaGVhZGVyIHsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwl1OAllbnRyeV9jbnQ7CisJdTgJZW50cnlfdHlwZTsKKwl1OAlmbGFnczsKKwl1OAlzeXNfZGVmXzE7CisjZWxzZSAvKiBfX0xJVFRMRV9FTkRJQU4gKi8KKwl1OAllbnRyeV90eXBlOworCXU4CWVudHJ5X2NudDsKKwl1OAlzeXNfZGVmXzE7CisJdTgJZmxhZ3M7CisjZW5kaWYKK307CisKKy8qIGVudHJ5IGhlYWRlciB0eXBlIGNvbW1hbmRzICovCisjZGVmaW5lIEVOVFJZX0NPTU1BTkQJCTEKKyNkZWZpbmUgRU5UUllfQ09OVElOVUFUSU9OCTIKKyNkZWZpbmUgRU5UUllfU1RBVFVTCQkzCisjZGVmaW5lIEVOVFJZX01BUktFUgkJNAorI2RlZmluZSBFTlRSWV9FWFRFTkRFRF9DT01NQU5ECTUKKworLyogZW50cnkgaGVhZGVyIGZsYWcgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRUZMQUdfQ09OVElOVUFUSU9OCTEKKyNkZWZpbmUgRUZMQUdfQlVTWQkJMgorI2RlZmluZSBFRkxBR19CQURfSEVBREVSCTQKKyNkZWZpbmUgRUZMQUdfQkFEX1BBWUxPQUQJOAorCitzdHJ1Y3QgZGF0YXNlZyB7CisJdTMyCWRfYmFzZTsKKwl1MzIJZF9jb3VudDsKK307CisKK3N0cnVjdCBDb21tYW5kX0VudHJ5IHsKKwlzdHJ1Y3QgRW50cnlfaGVhZGVyCWhkcjsKKwl1MzIJCQloYW5kbGU7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJdTgJCQl0YXJnZXRfaWQ7CisJdTgJCQl0YXJnZXRfbHVuOworI2Vsc2UgLyogX19MSVRUTEVfRU5ESUFOICovCisJdTgJCQl0YXJnZXRfbHVuOworCXU4CQkJdGFyZ2V0X2lkOworI2VuZGlmCisJdTE2CQkJY2RiX2xlbmd0aDsKKwl1MTYJCQljb250cm9sX2ZsYWdzOworCXUxNgkJCXJzdmQ7CisJdTE2CQkJdGltZV9vdXQ7CisJdTE2CQkJc2VnbWVudF9jbnQ7CisJdTgJCQljZGJbMTJdOworCXN0cnVjdCBkYXRhc2VnCQlkYXRhc2VnWzRdOworfTsKKworLyogY29tbWFuZCBlbnRyeSBjb250cm9sIGZsYWcgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQ0ZMQUdfTk9ESVNDCQkweDAxCisjZGVmaW5lIENGTEFHX0hFQURfVEFHCQkweDAyCisjZGVmaW5lIENGTEFHX09SREVSRURfVEFHCTB4MDQKKyNkZWZpbmUgQ0ZMQUdfU0lNUExFX1RBRwkweDA4CisjZGVmaW5lIENGTEFHX1RBUl9SVE4JCTB4MTAKKyNkZWZpbmUgQ0ZMQUdfUkVBRAkJMHgyMAorI2RlZmluZSBDRkxBR19XUklURQkJMHg0MAorCitzdHJ1Y3QgRXh0X0NvbW1hbmRfRW50cnkgeworCXN0cnVjdCBFbnRyeV9oZWFkZXIJaGRyOworCXUzMgkJCWhhbmRsZTsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwl1OAkJCXRhcmdldF9pZDsKKwl1OAkJCXRhcmdldF9sdW47CisjZWxzZSAvKiBfX0xJVFRMRV9FTkRJQU4gKi8KKwl1OAkJCXRhcmdldF9sdW47CisJdTgJCQl0YXJnZXRfaWQ7CisjZW5kaWYKKwl1MTYJCQljZGJfbGVuZ3RoOworCXUxNgkJCWNvbnRyb2xfZmxhZ3M7CisJdTE2CQkJcnN2ZDsKKwl1MTYJCQl0aW1lX291dDsKKwl1MTYJCQlzZWdtZW50X2NudDsKKwl1OAkJCWNkYls0NF07Cit9OworCitzdHJ1Y3QgQ29udGludWF0aW9uX0VudHJ5IHsKKwlzdHJ1Y3QgRW50cnlfaGVhZGVyCWhkcjsKKwl1MzIJCQlyZXNlcnZlZDsKKwlzdHJ1Y3QgZGF0YXNlZwkJZGF0YXNlZ1s3XTsKK307CisKK3N0cnVjdCBNYXJrZXJfRW50cnkgeworCXN0cnVjdCBFbnRyeV9oZWFkZXIJaGRyOworCXUzMgkJCXJlc2VydmVkOworI2lmZGVmIF9fQklHX0VORElBTgorCXU4CQkJdGFyZ2V0X2lkOworCXU4CQkJdGFyZ2V0X2x1bjsKKyNlbHNlIC8qIF9fTElUVExFX0VORElBTiAqLworCXU4CQkJdGFyZ2V0X2x1bjsKKwl1OAkJCXRhcmdldF9pZDsKKyNlbmRpZgorI2lmZGVmIF9fQklHX0VORElBTgorCXU4CQkJcnN2ZDsKKwl1OAkJCW1vZGlmaWVyOworI2Vsc2UgLyogX19MSVRUTEVfRU5ESUFOICovCisJdTgJCQltb2RpZmllcjsKKwl1OAkJCXJzdmQ7CisjZW5kaWYKKwl1OAkJCXJzdmRzWzUyXTsKK307CisKKy8qIG1hcmtlciBlbnRyeSBtb2RpZmllciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTWU5DX0RFVklDRQkwCisjZGVmaW5lIFNZTkNfVEFSR0VUCTEKKyNkZWZpbmUgU1lOQ19BTEwJMgorCitzdHJ1Y3QgU3RhdHVzX0VudHJ5IHsKKwlzdHJ1Y3QgRW50cnlfaGVhZGVyCWhkcjsKKwl1MzIJCQloYW5kbGU7CisJdTE2CQkJc2NzaV9zdGF0dXM7CisJdTE2CQkJY29tcGxldGlvbl9zdGF0dXM7CisJdTE2CQkJc3RhdGVfZmxhZ3M7CisJdTE2CQkJc3RhdHVzX2ZsYWdzOworCXUxNgkJCXRpbWU7CisJdTE2CQkJcmVxX3NlbnNlX2xlbjsKKwl1MzIJCQlyZXNpZHVhbDsKKwl1OAkJCXJzdmRbOF07CisJdTgJCQlyZXFfc2Vuc2VfZGF0YVszMl07Cit9OworCisvKiBzdGF0dXMgZW50cnkgY29tcGxldGlvbiBzdGF0dXMgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQ1NfQ09NUExFVEUJCQkweDAwMDAKKyNkZWZpbmUgQ1NfSU5DT01QTEVURQkJCTB4MDAwMQorI2RlZmluZSBDU19ETUFfRVJST1IJCQkweDAwMDIKKyNkZWZpbmUgQ1NfVFJBTlNQT1JUX0VSUk9SCQkweDAwMDMKKyNkZWZpbmUgQ1NfUkVTRVRfT0NDVVJSRUQJCTB4MDAwNAorI2RlZmluZSBDU19BQk9SVEVECQkJMHgwMDA1CisjZGVmaW5lIENTX1RJTUVPVVQJCQkweDAwMDYKKyNkZWZpbmUgQ1NfREFUQV9PVkVSUlVOCQkJMHgwMDA3CisjZGVmaW5lIENTX0NPTU1BTkRfT1ZFUlJVTgkJMHgwMDA4CisjZGVmaW5lIENTX1NUQVRVU19PVkVSUlVOCQkweDAwMDkKKyNkZWZpbmUgQ1NfQkFEX01FU1NBR0UJCQkweDAwMGEKKyNkZWZpbmUgQ1NfTk9fTUVTU0FHRV9PVVQJCTB4MDAwYgorI2RlZmluZSBDU19FWFRfSURfRkFJTEVECQkweDAwMGMKKyNkZWZpbmUgQ1NfSURFX01TR19GQUlMRUQJCTB4MDAwZAorI2RlZmluZSBDU19BQk9SVF9NU0dfRkFJTEVECQkweDAwMGUKKyNkZWZpbmUgQ1NfUkVKRUNUX01TR19GQUlMRUQJCTB4MDAwZgorI2RlZmluZSBDU19OT1BfTVNHX0ZBSUxFRAkJMHgwMDEwCisjZGVmaW5lIENTX1BBUklUWV9FUlJPUl9NU0dfRkFJTEVECTB4MDAxMQorI2RlZmluZSBDU19ERVZJQ0VfUkVTRVRfTVNHX0ZBSUxFRAkweDAwMTIKKyNkZWZpbmUgQ1NfSURfTVNHX0ZBSUxFRAkJMHgwMDEzCisjZGVmaW5lIENTX1VORVhQX0JVU19GUkVFCQkweDAwMTQKKyNkZWZpbmUgQ1NfREFUQV9VTkRFUlJVTgkJMHgwMDE1CisjZGVmaW5lIENTX0JVU19SRVNFVAkJCTB4MDAxYworCisvKiBzdGF0dXMgZW50cnkgc3RhdGUgZmxhZyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTRl9HT1RfQlVTCQkJMHgwMTAwCisjZGVmaW5lIFNGX0dPVF9UQVJHRVQJCQkweDAyMDAKKyNkZWZpbmUgU0ZfU0VOVF9DREIJCQkweDA0MDAKKyNkZWZpbmUgU0ZfVFJBTlNGRVJSRURfREFUQQkJMHgwODAwCisjZGVmaW5lIFNGX0dPVF9TVEFUVVMJCQkweDEwMDAKKyNkZWZpbmUgU0ZfR09UX1NFTlNFCQkJMHgyMDAwCisKKy8qIHN0YXR1cyBlbnRyeSBzdGF0dXMgZmxhZyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTVEZfRElTQ09OTkVDVAkJCTB4MDAwMQorI2RlZmluZSBTVEZfU1lOQ0hST05PVVMJCQkweDAwMDIKKyNkZWZpbmUgU1RGX1BBUklUWV9FUlJPUgkJMHgwMDA0CisjZGVmaW5lIFNURl9CVVNfUkVTRVQJCQkweDAwMDgKKyNkZWZpbmUgU1RGX0RFVklDRV9SRVNFVAkJMHgwMDEwCisjZGVmaW5lIFNURl9BQk9SVEVECQkJMHgwMDIwCisjZGVmaW5lIFNURl9USU1FT1VUCQkJMHgwMDQwCisjZGVmaW5lIFNURl9ORUdPVElBVElPTgkJCTB4MDA4MAorCisvKiBtYWlsYm94IGNvbW1hbmRzICovCisjZGVmaW5lIE1CT1hfTk9fT1AJCQkweDAwMDAKKyNkZWZpbmUgTUJPWF9MT0FEX1JBTQkJCTB4MDAwMQorI2RlZmluZSBNQk9YX0VYRUNfRklSTVdBUkUJCTB4MDAwMgorI2RlZmluZSBNQk9YX0RVTVBfUkFNCQkJMHgwMDAzCisjZGVmaW5lIE1CT1hfV1JJVEVfUkFNX1dPUkQJCTB4MDAwNAorI2RlZmluZSBNQk9YX1JFQURfUkFNX1dPUkQJCTB4MDAwNQorI2RlZmluZSBNQk9YX01BSUxCT1hfUkVHX1RFU1QJCTB4MDAwNgorI2RlZmluZSBNQk9YX1ZFUklGWV9DSEVDS1NVTQkJMHgwMDA3CisjZGVmaW5lIE1CT1hfQUJPVVRfRklSTVdBUkUJCTB4MDAwOAorI2RlZmluZSBNQk9YX0NIRUNLX0ZJUk1XQVJFCQkweDAwMGUKKyNkZWZpbmUgTUJPWF9JTklUX1JFUV9RVUVVRQkJMHgwMDEwCisjZGVmaW5lIE1CT1hfSU5JVF9SRVNfUVVFVUUJCTB4MDAxMQorI2RlZmluZSBNQk9YX0VYRUNVVEVfSU9DQgkJMHgwMDEyCisjZGVmaW5lIE1CT1hfV0FLRV9VUAkJCTB4MDAxMworI2RlZmluZSBNQk9YX1NUT1BfRklSTVdBUkUJCTB4MDAxNAorI2RlZmluZSBNQk9YX0FCT1JUCQkJMHgwMDE1CisjZGVmaW5lIE1CT1hfQUJPUlRfREVWSUNFCQkweDAwMTYKKyNkZWZpbmUgTUJPWF9BQk9SVF9UQVJHRVQJCTB4MDAxNworI2RlZmluZSBNQk9YX0JVU19SRVNFVAkJCTB4MDAxOAorI2RlZmluZSBNQk9YX1NUT1BfUVVFVUUJCQkweDAwMTkKKyNkZWZpbmUgTUJPWF9TVEFSVF9RVUVVRQkJMHgwMDFhCisjZGVmaW5lIE1CT1hfU0lOR0xFX1NURVBfUVVFVUUJCTB4MDAxYgorI2RlZmluZSBNQk9YX0FCT1JUX1FVRVVFCQkweDAwMWMKKyNkZWZpbmUgTUJPWF9HRVRfREVWX1FVRVVFX1NUQVRVUwkweDAwMWQKKyNkZWZpbmUgTUJPWF9HRVRfRklSTVdBUkVfU1RBVFVTCTB4MDAxZgorI2RlZmluZSBNQk9YX0dFVF9JTklUX1NDU0lfSUQJCTB4MDAyMAorI2RlZmluZSBNQk9YX0dFVF9TRUxFQ1RfVElNRU9VVAkJMHgwMDIxCisjZGVmaW5lIE1CT1hfR0VUX1JFVFJZX0NPVU5UCQkweDAwMjIKKyNkZWZpbmUgTUJPWF9HRVRfVEFHX0FHRV9MSU1JVAkJMHgwMDIzCisjZGVmaW5lIE1CT1hfR0VUX0NMT0NLX1JBVEUJCTB4MDAyNAorI2RlZmluZSBNQk9YX0dFVF9BQ1RfTkVHX1NUQVRFCQkweDAwMjUKKyNkZWZpbmUgTUJPWF9HRVRfQVNZTkNfREFUQV9TRVRVUF9USU1FCTB4MDAyNgorI2RlZmluZSBNQk9YX0dFVF9TQlVTX1BBUkFNUwkJMHgwMDI3CisjZGVmaW5lIE1CT1hfR0VUX1RBUkdFVF9QQVJBTVMJCTB4MDAyOAorI2RlZmluZSBNQk9YX0dFVF9ERVZfUVVFVUVfUEFSQU1TCTB4MDAyOQorI2RlZmluZSBNQk9YX1NFVF9JTklUX1NDU0lfSUQJCTB4MDAzMAorI2RlZmluZSBNQk9YX1NFVF9TRUxFQ1RfVElNRU9VVAkJMHgwMDMxCisjZGVmaW5lIE1CT1hfU0VUX1JFVFJZX0NPVU5UCQkweDAwMzIKKyNkZWZpbmUgTUJPWF9TRVRfVEFHX0FHRV9MSU1JVAkJMHgwMDMzCisjZGVmaW5lIE1CT1hfU0VUX0NMT0NLX1JBVEUJCTB4MDAzNAorI2RlZmluZSBNQk9YX1NFVF9BQ1RJVkVfTkVHX1NUQVRFCTB4MDAzNQorI2RlZmluZSBNQk9YX1NFVF9BU1lOQ19EQVRBX1NFVFVQX1RJTUUJMHgwMDM2CisjZGVmaW5lIE1CT1hfU0VUX1NCVVNfQ09OVFJPTF9QQVJBTVMJMHgwMDM3CisjZGVmaW5lIE1CT1hfU0VUX1RBUkdFVF9QQVJBTVMJCTB4MDAzOAorI2RlZmluZSBNQk9YX1NFVF9ERVZfUVVFVUVfUEFSQU1TCTB4MDAzOQorCitzdHJ1Y3QgaG9zdF9wYXJhbSB7CisJdV9zaG9ydAkJaW5pdGlhdG9yX3Njc2lfaWQ7CisJdV9zaG9ydAkJYnVzX3Jlc2V0X2RlbGF5OworCXVfc2hvcnQJCXJldHJ5X2NvdW50OworCXVfc2hvcnQJCXJldHJ5X2RlbGF5OworCXVfc2hvcnQJCWFzeW5jX2RhdGFfc2V0dXBfdGltZTsKKwl1X3Nob3J0CQlyZXFfYWNrX2FjdGl2ZV9uZWdhdGlvbjsKKwl1X3Nob3J0CQlkYXRhX2xpbmVfYWN0aXZlX25lZ2F0aW9uOworCXVfc2hvcnQJCWRhdGFfZG1hX2J1cnN0X2VuYWJsZTsKKwl1X3Nob3J0CQljb21tYW5kX2RtYV9idXJzdF9lbmFibGU7CisJdV9zaG9ydAkJdGFnX2FnaW5nOworCXVfc2hvcnQJCXNlbGVjdGlvbl90aW1lb3V0OworCXVfc2hvcnQJCW1heF9xdWV1ZV9kZXB0aDsKK307CisKKy8qCisgKiBEZXZpY2UgRmxhZ3M6CisgKgorICogQml0ICBOYW1lCisgKiAtLS0tLS0tLS0KKyAqICA3ICAgRGlzY29ubmVjdCBQcml2aWxlZ2UKKyAqICA2ICAgUGFyaXR5IENoZWNraW5nCisgKiAgNSAgIFdpZGUgRGF0YSBUcmFuc2ZlcnMKKyAqICA0ICAgU3luY2hyb25vdXMgRGF0YSBUcmFuc2ZlcnMKKyAqICAzICAgVGFnZ2VkIFF1ZXVpbmcKKyAqICAyICAgQXV0b21hdGljIFJlcXVlc3QgU2Vuc2UKKyAqICAxICAgU3RvcCBRdWV1ZSBvbiBDaGVjayBDb25kaXRpb24KKyAqICAwICAgUmVuZWdvdGlhdGUgb24gRXJyb3IKKyAqLworCitzdHJ1Y3QgZGV2X3BhcmFtIHsKKwl1X3Nob3J0CQlkZXZpY2VfZmxhZ3M7CisJdV9zaG9ydAkJZXhlY3V0aW9uX3Rocm90dGxlOworCXVfc2hvcnQJCXN5bmNocm9ub3VzX3BlcmlvZDsKKwl1X3Nob3J0CQlzeW5jaHJvbm91c19vZmZzZXQ7CisJdV9zaG9ydAkJZGV2aWNlX2VuYWJsZTsKKwl1X3Nob3J0CQlyZXNlcnZlZDsgLyogcGFkICovCit9OworCisvKgorICogVGhlIHJlc3VsdCBxdWV1ZSBjYW4gYmUgcXVpdGUgYSBiaXQgc21hbGxlciBzaW5jZSBjb250aW51YXRpb24gZW50cmllcworICogZG8gbm90IHNob3cgdXAgdGhlcmU6CisgKi8KKyNkZWZpbmUgUkVTX1FVRVVFX0xFTgkJMjU1CS8qIE11c3QgYmUgcG93ZXIgb2YgdHdvIC0gMSAqLworI2RlZmluZSBRVUVVRV9FTlRSWV9MRU4JCTY0CisKKyNkZWZpbmUgTkVYVF9SRVFfUFRSKHdoZWVlKSAgICgoKHdoZWVlKSArIDEpICYgUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4pCisjZGVmaW5lIE5FWFRfUkVTX1BUUih3aGVlZSkgICAoKCh3aGVlZSkgKyAxKSAmIFJFU19RVUVVRV9MRU4pCisjZGVmaW5lIFBSRVZfUkVRX1BUUih3aGVlZSkgICAoKCh3aGVlZSkgLSAxKSAmIFFMT0dJQ1BUSV9SRVFfUVVFVUVfTEVOKQorI2RlZmluZSBQUkVWX1JFU19QVFIod2hlZWUpICAgKCgod2hlZWUpIC0gMSkgJiBSRVNfUVVFVUVfTEVOKQorCitzdHJ1Y3QgcHRpX3F1ZXVlX2VudHJ5IHsKKwljaGFyIF9fb3BhcXVlW1FVRVVFX0VOVFJZX0xFTl07Cit9OworCitzdHJ1Y3Qgc2NzaV9jbW5kOworCisvKiBTb2Z0d2FyZSBzdGF0ZSBmb3IgdGhlIGRyaXZlci4gKi8KK3N0cnVjdCBxbG9naWNwdGkgeworCS8qIFRoZXNlIGFyZSB0aGUgaG90IGVsZW1lbnRzIGluIHRoZSBjYWNoZSwgc28gdGhleSBjb21lIGZpcnN0LiAqLworCXZvaWQgX19pb21lbSAgICAgICAgICAgICAqcXJlZ3M7ICAgICAgICAgICAgICAgIC8qIEFkYXB0ZXIgcmVnaXN0ZXJzICAgICAgICAgICovCisJc3RydWN0IHB0aV9xdWV1ZV9lbnRyeSAgICpyZXNfY3B1OyAgICAgICAgICAgICAgLyogUHRyIHRvIFJFU1BPTlNFIGJ1ZnMgKENQVSkgKi8KKwlzdHJ1Y3QgcHRpX3F1ZXVlX2VudHJ5ICAgKnJlcV9jcHU7ICAgICAgICAgICAgICAvKiBQdHIgdG8gUkVRVUVTVCBidWZzIChDUFUpICAqLworCisJdV9pbnQJICAgICAgICAgICAgICAgICAgcmVxX2luX3B0cjsJCS8qIGluZGV4IG9mIG5leHQgcmVxdWVzdCBzbG90ICovCisJdV9pbnQJICAgICAgICAgICAgICAgICAgcmVzX291dF9wdHI7CQkvKiBpbmRleCBvZiBuZXh0IHJlc3VsdCBzbG90ICAqLworCWxvbmcJICAgICAgICAgICAgICAgICAgc2VuZF9tYXJrZXI7CQkvKiBtdXN0IHdlIHNlbmQgYSBtYXJrZXI/ICAgICAqLworCXN0cnVjdCBzYnVzX2RldgkJICpzZGV2OworCXVuc2lnbmVkIGxvbmcJCSAgX19wYWQ7CisKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgIGNtZF9jb3VudFtNQVhfVEFSR0VUU107CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICB0YWdfYWdlc1tNQVhfVEFSR0VUU107CisKKwkvKiBUaGUgY21kLT5oYW5kbGVyIGlzIG9ubHkgMzItYml0cywgc28gdGhhdCB0aGluZ3Mgd29yayBldmVuIG9uIG1vbnN0ZXIKKwkgKiBFeDAwMCBzcGFyYzY0IG1hY2hpbmVzIHdpdGggPjRHQiBvZiByYW0gd2UganVzdCBrZWVwIHRyYWNrIG9mIHRoZQorCSAqIHNjc2kgY29tbWFuZCBwb2ludGVycyBoZXJlLiAgVGhpcyBpcyBlc3NlbnRpYWxseSB3aGF0IE1hdHQgSmFjb2IgZG9lcy4gLURhdmVNCisJICovCisJc3RydWN0IHNjc2lfY21uZCAgICAgICAgICpjbWRfc2xvdHNbUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4gKyAxXTsKKworCS8qIFRoZSByZXN0IG9mIHRoZSBlbGVtZW50cyBhcmUgdW5pbXBvcnRhbnQgZm9yIHBlcmZvcm1hbmNlLiAqLworCXN0cnVjdCBxbG9naWNwdGkgICAgICAgICAqbmV4dDsKKwlfX3UzMiAgICAgICAgICAgICAgICAgICAgIHJlc19kdm1hOyAgICAgICAgICAgICAvKiBQdHIgdG8gUkVTUE9OU0UgYnVmcyAoRFZNQSkqLworCV9fdTMyICAgICAgICAgICAgICAgICAgICAgcmVxX2R2bWE7ICAgICAgICAgICAgIC8qIFB0ciB0byBSRVFVRVNUIGJ1ZnMgKERWTUEpICovCisJdV9jaGFyCSAgICAgICAgICAgICAgICAgIGZ3YXJlX21hanJldiwgZndhcmVfbWlucmV2LCBmd2FyZV9taWNyZXY7CisJc3RydWN0IFNjc2lfSG9zdCAgICAgICAgICpxaG9zdDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgIHFwdGlfaWQ7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICBzY3NpX2lkOworCWludCAgICAgICAgICAgICAgICAgICAgICAgcHJvbV9ub2RlOworCWNoYXIgICAgICAgICAgICAgICAgICAgICAgcHJvbV9uYW1lWzY0XTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgIGlycTsKKwljaGFyICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudGlhbCwgdWx0cmEsIGNsb2NrOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgYnVyc3RzOworCXN0cnVjdAlob3N0X3BhcmFtICAgICAgICBob3N0X3BhcmFtOworCXN0cnVjdAlkZXZfcGFyYW0gICAgICAgICBkZXZfcGFyYW1bTUFYX1RBUkdFVFNdOworCisJdm9pZCBfX2lvbWVtICAgICAgICAgICAgICAqc3JlZzsKKyNkZWZpbmUgU1JFR19UUE9XRVIgICAgICAgICAgICAgICAweDgwICAgLyogU3RhdGUgb2YgdGVybXB3ciAgICAgICAgICAgKi8KKyNkZWZpbmUgU1JFR19GVVNFICAgICAgICAgICAgICAgICAweDQwICAgLyogU3RhdGUgb2Ygb24gYm9hcmQgZnVzZSAgICAgKi8KKyNkZWZpbmUgU1JFR19QRElTQUIgICAgICAgICAgICAgICAweDIwICAgLyogRGlzYWJsZSBzdGF0ZSBmb3IgcG93ZXIgb24gKi8KKyNkZWZpbmUgU1JFR19EU0VOU0UgICAgICAgICAgICAgICAweDEwICAgLyogU2Vuc2UgZm9yIGRpZmZlcmVudGlhbCAgICAgKi8KKyNkZWZpbmUgU1JFR19JTUFTSyAgICAgICAgICAgICAgICAweDBjICAgLyogSW50ZXJydXB0IGxldmVsICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1JFR19TUE1BU0sgICAgICAgICAgICAgICAweDAzICAgLyogTWFzayBmb3Igc3dpdGNoIHBhY2sgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgIHN3c3JlZzsKKwl1bnNpZ25lZCBpbnQJCisJCWdvdGlycQk6CTEsCS8qIHRoaXMgaW5zdGFuY2UgZ290IGFuIGlycSAqLworCQlpc19wdGkJOiAJMSwJLyogTm9uLXplcm8gaWYgdGhpcyBpcyBhIFBUSSBib2FyZC4gKi8KKwkJc2JpdHMJOgkxNjsJLyogc3luY21vZGUga25vd24gYml0cyAqLworfTsKKworLyogSG93IHRvIHR3aWRkbGUgdGhlbSBiaXRzLi4uICovCisKKy8qIFNCVVMgY29uZmlnIHJlZ2lzdGVyIG9uZS4gKi8KKyNkZWZpbmUgU0JVU19DRkcxX0VQQVIgICAgICAgICAgMHgwMTAwICAgICAgLyogRW5hYmxlIHBhcml0eSBjaGVja2luZyAgICAgICAgICAgKi8KKyNkZWZpbmUgU0JVU19DRkcxX0ZNQVNLICAgICAgICAgMHgwMGYwICAgICAgLyogRm9ydGggY29kZSBjeWNsZSBtYXNrICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0JVU19DRkcxX0JFTkFCICAgICAgICAgMHgwMDA0ICAgICAgLyogQnVyc3QgZHZtYSBlbmFibGUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0JVU19DRkcxX0I2NCAgICAgICAgICAgMHgwMDAzICAgICAgLyogRW5hYmxlIDY0Ynl0ZSBidXJzdHMgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0JVU19DRkcxX0IzMiAgICAgICAgICAgMHgwMDAyICAgICAgLyogRW5hYmxlIDMyYnl0ZSBidXJzdHMgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0JVU19DRkcxX0IxNiAgICAgICAgICAgMHgwMDAxICAgICAgLyogRW5hYmxlIDE2Ynl0ZSBidXJzdHMgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0JVU19DRkcxX0I4ICAgICAgICAgICAgMHgwMDA4ICAgICAgLyogRW5hYmxlIDhieXRlIGJ1cnN0cyAgICAgICAgICAgICAgKi8KKworLyogU0JVUyBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFNCVVNfQ1RSTF9FRElSUSAgICAgICAgIDB4MDAyMCAgICAgIC8qIEVuYWJsZSBEYXRhIERWTUEgSW50ZXJydXB0cyAgICAgICovCisjZGVmaW5lIFNCVVNfQ1RSTF9FQ0lSUSAgICAgICAgIDB4MDAxMCAgICAgIC8qIEVuYWJsZSBDb21tYW5kIERWTUEgSW50ZXJydXB0cyAgICovCisjZGVmaW5lIFNCVVNfQ1RSTF9FU0lSUSAgICAgICAgIDB4MDAwOCAgICAgIC8qIEVuYWJsZSBTQ1NJIFByb2Nlc3NvciBJbnRlcnJ1cHRzICovCisjZGVmaW5lIFNCVVNfQ1RSTF9FUklSUSAgICAgICAgIDB4MDAwNCAgICAgIC8qIEVuYWJsZSBSSVNDIFByb2Nlc3NvciBJbnRlcnJ1cHRzICovCisjZGVmaW5lIFNCVVNfQ1RSTF9HRU5BQiAgICAgICAgIDB4MDAwMiAgICAgIC8qIEdsb2JhbCBJbnRlcnJ1cHQgRW5hYmxlICAgICAgICAgICovCisjZGVmaW5lIFNCVVNfQ1RSTF9SRVNFVCAgICAgICAgIDB4MDAwMSAgICAgIC8qIFNvZnQgUmVzZXQgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIFNCVVMgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFNCVVNfU1RBVF9ESU5UICAgICAgICAgIDB4MDAyMCAgICAgIC8qIERhdGEgRFZNQSBJUlEgcGVuZGluZyAgICAgICAgICAgICovCisjZGVmaW5lIFNCVVNfU1RBVF9DSU5UICAgICAgICAgIDB4MDAxMCAgICAgIC8qIENvbW1hbmQgRFZNQSBJUlEgcGVuZGluZyAgICAgICAgICovCisjZGVmaW5lIFNCVVNfU1RBVF9TSU5UICAgICAgICAgIDB4MDAwOCAgICAgIC8qIFNDU0kgUHJvY2Vzc29yIElSUSBwZW5kaW5nICAgICAgICovCisjZGVmaW5lIFNCVVNfU1RBVF9SSU5UICAgICAgICAgIDB4MDAwNCAgICAgIC8qIFJJU0MgUHJvY2Vzc29yIElSUSBwZW5kaW5nICAgICAgICovCisjZGVmaW5lIFNCVVNfU1RBVF9HSU5UICAgICAgICAgIDB4MDAwMiAgICAgIC8qIEdsb2JhbCBJUlEgcGVuZGluZyAgICAgICAgICAgICAgICovCisKKy8qIFNCVVMgc2VtYXBob3JlIHJlZ2lzdGVyICovCisjZGVmaW5lIFNCVVNfU0VNQVBIT1JFX1NUQVQgICAgIDB4MDAwMiAgICAgIC8qIFNlbWFwaG9yZSBzdGF0dXMgYml0ICAgICAgICAgICAgICovCisjZGVmaW5lIFNCVVNfU0VNQVBIT1JFX0xDSyAgICAgIDB4MDAwMSAgICAgIC8qIFNlbWFwaG9yZSBsb2NrIGJpdCAgICAgICAgICAgICAgICovCisKKy8qIERWTUEgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBETUFfQ1RSTF9DU1VTUEVORCAgICAgICAweDAwMTAgICAgICAvKiBETUEgY2hhbm5lbCBzdXNwZW5kICAgICAgICAgICAgICAqLworI2RlZmluZSBETUFfQ1RSTF9DQ0xFQVIgICAgICAgICAweDAwMDggICAgICAvKiBETUEgY2hhbm5lbCBjbGVhciBhbmQgcmVzZXQgICAgICAqLworI2RlZmluZSBETUFfQ1RSTF9GQ0xFQVIgICAgICAgICAweDAwMDQgICAgICAvKiBETUEgZmlmbyBjbGVhciAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBETUFfQ1RSTF9DSVJRICAgICAgICAgICAweDAwMDIgICAgICAvKiBETUEgaXJxIGNsZWFyICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBETUFfQ1RSTF9ETUFTVEFSVCAgICAgICAweDAwMDEgICAgICAvKiBETUEgdHJhbnNmZXIgc3RhcnQgICAgICAgICAgICAgICAqLworCisvKiBTQ1NJIHByb2Nlc3NvciBvdmVycmlkZSByZWdpc3RlciAqLworI2RlZmluZSBDUFVfT1JJREVfRVRSSUcgICAgICAgICAweDgwMDAgICAgICAvKiBFeHRlcm5hbCB0cmlnZ2VyIGVuYWJsZSAgICAgICAgICAqLworI2RlZmluZSBDUFVfT1JJREVfU1RFUCAgICAgICAgICAweDQwMDAgICAgICAvKiBTaW5nbGUgc3RlcCBtb2RlIGVuYWJsZSAgICAgICAgICAqLworI2RlZmluZSBDUFVfT1JJREVfQktQVCAgICAgICAgICAweDIwMDAgICAgICAvKiBCcmVha3BvaW50IHJlZyBlbmFibGUgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfT1JJREVfUFdSSVRFICAgICAgICAweDEwMDAgICAgICAvKiBTQ1NJIHBpbiB3cml0ZSBlbmFibGUgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfT1JJREVfT0ZPUkNFICAgICAgICAweDA4MDAgICAgICAvKiBGb3JjZSBvdXRwdXRzIG9uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfT1JJREVfTEJBQ0sgICAgICAgICAweDA0MDAgICAgICAvKiBTQ1NJIGxvb3BiYWNrIGVuYWJsZSAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfT1JJREVfUFRFU1QgICAgICAgICAweDAyMDAgICAgICAvKiBQYXJpdHkgdGVzdCBlbmFibGUgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfT1JJREVfVEVOQUIgICAgICAgICAweDAxMDAgICAgICAvKiBTQ1NJIHBpbnMgdHJpc3RhdGUgZW5hYmxlICAgICAgICAqLworI2RlZmluZSBDUFVfT1JJREVfVFBJTlMgICAgICAgICAweDAwODAgICAgICAvKiBTQ1NJIHBpbnMgZW5hYmxlICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfT1JJREVfRlJFU0VUICAgICAgICAweDAwMDggICAgICAvKiBGSUZPIHJlc2V0ICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfT1JJREVfQ1RFUk0gICAgICAgICAweDAwMDQgICAgICAvKiBDb21tYW5kIHRlcm1pbmF0ZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfT1JJREVfUlJFRyAgICAgICAgICAweDAwMDIgICAgICAvKiBSZXNldCBTQ1NJIHByb2Nlc3NvciByZWdzICAgICAgICAqLworI2RlZmluZSBDUFVfT1JJREVfUk1PRCAgICAgICAgICAweDAwMDEgICAgICAvKiBSZXNldCBTQ1NJIHByb2Nlc3NvciBtb2R1bGUgICAgICAqLworCisvKiBTQ1NJIHByb2Nlc3NvciBjb21tYW5kcyAqLworI2RlZmluZSBDUFVfQ01EX0JSRVNFVCAgICAgICAgICAweDMwMGIgICAgICAvKiBSZXNldCBTQ1NJIGJ1cyAgICAgICAgICAgICAgICAgICAqLworCisvKiBTQ1NJIHByb2Nlc3NvciBwaW4gY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBDUFVfUENUUkxfUFZBTElEICAgICAgICAweDgwMDAgICAgICAvKiBQaGFzZSBiaXRzIGFyZSB2YWxpZCAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfUENUUkxfUEhJICAgICAgICAgICAweDA0MDAgICAgICAvKiBQYXJpdHkgYml0IGhpZ2ggICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfUENUUkxfUExPICAgICAgICAgICAweDAyMDAgICAgICAvKiBQYXJpdHkgYml0IGxvdyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfUENUUkxfUkVRICAgICAgICAgICAweDAxMDAgICAgICAvKiBSRVEgYnVzIHNpZ25hbCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfUENUUkxfQUNLICAgICAgICAgICAweDAwODAgICAgICAvKiBBQ0sgYnVzIHNpZ25hbCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfUENUUkxfUlNUICAgICAgICAgICAweDAwNDAgICAgICAvKiBSU1QgYnVzIHNpZ25hbCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfUENUUkxfQlNZICAgICAgICAgICAweDAwMjAgICAgICAvKiBCU1kgYnVzIHNpZ25hbCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfUENUUkxfU0VMICAgICAgICAgICAweDAwMTAgICAgICAvKiBTRUwgYnVzIHNpZ25hbCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfUENUUkxfQVROICAgICAgICAgICAweDAwMDggICAgICAvKiBBVE4gYnVzIHNpZ25hbCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfUENUUkxfTVNHICAgICAgICAgICAweDAwMDQgICAgICAvKiBNU0cgYnVzIHNpZ25hbCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfUENUUkxfQ0QgICAgICAgICAgICAweDAwMDIgICAgICAvKiBDRCBidXMgc2lnbmFsICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfUENUUkxfSU8gICAgICAgICAgICAweDAwMDEgICAgICAvKiBJTyBidXMgc2lnbmFsICAgICAgICAgICAgICAgICAgICAqLworCisvKiBTQ1NJIHByb2Nlc3NvciBkaWZmZXJlbnRpYWwgcGlucyByZWdpc3RlciAqLworI2RlZmluZSBDUFVfUERJRkZfU0VOU0UgICAgICAgICAweDAyMDAgICAgICAvKiBEaWZmZXJlbnRpYWwgc2Vuc2UgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfUERJRkZfTU9ERSAgICAgICAgICAweDAxMDAgICAgICAvKiBEaWZmZXJlbnRpYWwgbW9kZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfUERJRkZfT0VOQUIgICAgICAgICAweDAwODAgICAgICAvKiBPdXRwdXRzIGVuYWJsZSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfUERJRkZfUE1BU0sgICAgICAgICAweDAwN2MgICAgICAvKiBEaWZmZXJlbnRpYWwgY29udHJvbCBwaW5zICAgICAgICAqLworI2RlZmluZSBDUFVfUERJRkZfVEdUICAgICAgICAgICAweDAwMDIgICAgICAvKiBUYXJnZXQgbW9kZSBlbmFibGUgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUFVfUERJRkZfSU5JVCAgICAgICAgICAweDAwMDEgICAgICAvKiBJbml0aWF0b3IgbW9kZSBlbmFibGUgICAgICAgICAgICAqLworCisvKiBSSVNDIHByb2Nlc3NvciBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUklTQ19QU1JfRlRSVUUgICAgICAgICAgMHg4MDAwICAgICAgLyogRm9yY2UgdHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUklTQ19QU1JfTENEICAgICAgICAgICAgMHg0MDAwICAgICAgLyogTG9vcCBjb3VudGVyIHNob3dzIGRvbmUgc3RhdHVzICAgKi8KKyNkZWZpbmUgUklTQ19QU1JfUklSUSAgICAgICAgICAgMHgyMDAwICAgICAgLyogUklTQyBpcnEgc3RhdHVzICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUklTQ19QU1JfVE9GTE9XICAgICAgICAgMHgxMDAwICAgICAgLyogVGltZXIgb3ZlcmZsb3cgKHJvbGxvdmVyKSAgICAgICAgKi8KKyNkZWZpbmUgUklTQ19QU1JfQU9GTE9XICAgICAgICAgMHgwODAwICAgICAgLyogQXJpdGhtZXRpYyBvdmVyZmxvdyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUklTQ19QU1JfQU1TQiAgICAgICAgICAgMHgwNDAwICAgICAgLyogQXJpdGhtZXRpYyBiaWcgZW5kaWFuICAgICAgICAgICAgKi8KKyNkZWZpbmUgUklTQ19QU1JfQUNBUlJZICAgICAgICAgMHgwMjAwICAgICAgLyogQXJpdGhtZXRpYyBjYXJyeSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUklTQ19QU1JfQVpFUk8gICAgICAgICAgMHgwMTAwICAgICAgLyogQXJpdGhtZXRpYyB6ZXJvICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUklTQ19QU1JfVUxUUkEgICAgICAgICAgMHgwMDIwICAgICAgLyogVWx0cmEgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUklTQ19QU1JfRElSUSAgICAgICAgICAgMHgwMDEwICAgICAgLyogRFZNQSBpbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUklTQ19QU1JfU0lSUSAgICAgICAgICAgMHgwMDA4ICAgICAgLyogU0NTSSBwcm9jZXNzb3IgaW50ZXJydXB0ICAgICAgICAgKi8KKyNkZWZpbmUgUklTQ19QU1JfSElSUSAgICAgICAgICAgMHgwMDA0ICAgICAgLyogSG9zdCBpbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUklTQ19QU1JfSVBFTkQgICAgICAgICAgMHgwMDAyICAgICAgLyogSW50ZXJydXB0IHBlbmRpbmcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUklTQ19QU1JfRkZBTFNFICAgICAgICAgMHgwMDAxICAgICAgLyogRm9yY2UgZmFsc2UgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogUklTQyBwcm9jZXNzb3IgbWVtb3J5IHRpbWluZyByZWdpc3RlciAqLworI2RlZmluZSBSSVNDX01UUkVHX1AxREZMVCAgICAgICAweDEyMDAgICAgICAvKiBEZWZhdWx0IHJlYWQvd3JpdGUgdGltaW5nLCBwZzEgICAqLworI2RlZmluZSBSSVNDX01UUkVHX1AwREZMVCAgICAgICAweDAwMTIgICAgICAvKiBEZWZhdWx0IHJlYWQvd3JpdGUgdGltaW5nLCBwZzAgICAqLworI2RlZmluZSBSSVNDX01UUkVHX1AxVUxUUkEgICAgICAweDIzMDAgICAgICAvKiBVbHRyYS1tb2RlIHJ3IHRpbWluZywgcGcxICAgICAgICAqLworI2RlZmluZSBSSVNDX01UUkVHX1AwVUxUUkEgICAgICAweDAwMjMgICAgICAvKiBVbHRyYS1tb2RlIHJ3IHRpbWluZywgcGcwICAgICAgICAqLworCisvKiBIb3N0IGNvbW1hbmQvY3RybCByZWdpc3RlciAqLworI2RlZmluZSBIQ0NUUkxfTk9QICAgICAgICAgICAgICAweDAwMDAgICAgICAvKiBDTUQ6IE5vIG9wZXJhdGlvbiAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQ0NUUkxfUkVTRVQgICAgICAgICAgICAweDEwMDAgICAgICAvKiBDTUQ6IFJlc2V0IFJJU0MgY3B1ICAgICAgICAgICAgICAqLworI2RlZmluZSBIQ0NUUkxfUEFVU0UgICAgICAgICAgICAweDIwMDAgICAgICAvKiBDTUQ6IFBhdXNlIFJJU0MgY3B1ICAgICAgICAgICAgICAqLworI2RlZmluZSBIQ0NUUkxfUkVMICAgICAgICAgICAgICAweDMwMDAgICAgICAvKiBDTUQ6IFJlbGVhc2UgcGF1c2VkIFJJU0MgY3B1ICAgICAqLworI2RlZmluZSBIQ0NUUkxfU1RFUCAgICAgICAgICAgICAweDQwMDAgICAgICAvKiBDTUQ6IFNpbmdsZSBzdGVwIFJJU0MgY3B1ICAgICAgICAqLworI2RlZmluZSBIQ0NUUkxfU0hJUlEgICAgICAgICAgICAweDUwMDAgICAgICAvKiBDTUQ6IFNldCBob3N0IGlycSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQ0NUUkxfQ0hJUlEgICAgICAgICAgICAweDYwMDAgICAgICAvKiBDTUQ6IENsZWFyIGhvc3QgaXJxICAgICAgICAgICAgICAqLworI2RlZmluZSBIQ0NUUkxfQ1JJUlEgICAgICAgICAgICAweDcwMDAgICAgICAvKiBDTUQ6IENsZWFyIFJJU0MgY3B1IGlycSAgICAgICAgICAqLworI2RlZmluZSBIQ0NUUkxfQktQVCAgICAgICAgICAgICAweDgwMDAgICAgICAvKiBDTUQ6IEJyZWFrcG9pbnQgZW5hYmxlcyBjaGFuZ2UgICAqLworI2RlZmluZSBIQ0NUUkxfVE1PREUgICAgICAgICAgICAweGYwMDAgICAgICAvKiBDTUQ6IEVuYWJsZSB0ZXN0IG1vZGUgICAgICAgICAgICAqLworI2RlZmluZSBIQ0NUUkxfSElSUSAgICAgICAgICAgICAweDAwODAgICAgICAvKiBIb3N0IElSUSBwZW5kaW5nICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQ0NUUkxfUlJJUCAgICAgICAgICAgICAweDAwNDAgICAgICAvKiBSSVNDIGNwdSByZXNldCBpbiBoYXBwZW5pbmcgbm93ICAqLworI2RlZmluZSBIQ0NUUkxfUlBBVVNFRCAgICAgICAgICAweDAwMjAgICAgICAvKiBSSVNDIGNwdSBpcyBwYXVzZWQgbm93ICAgICAgICAgICAqLworI2RlZmluZSBIQ0NUUkxfRUJFTkFCICAgICAgICAgICAweDAwMTAgICAgICAvKiBFeHRlcm5hbCBicmVha3BvaW50IGVuYWJsZSAgICAgICAqLworI2RlZmluZSBIQ0NUUkxfQjFFTkFCICAgICAgICAgICAweDAwMDggICAgICAvKiBCcmVha3BvaW50IDEgZW5hYmxlICAgICAgICAgICAgICAqLworI2RlZmluZSBIQ0NUUkxfQjBFTkFCICAgICAgICAgICAweDAwMDQgICAgICAvKiBCcmVha3BvaW50IDAgZW5hYmxlICAgICAgICAgICAgICAqLworCisvKiBGb3Igb3VyIGludGVycnVwdCBlbmdpbmUuICovCisjZGVmaW5lIGZvcl9lYWNoX3Fsb2dpY3B0aShxcCkgXAorICAgICAgICBmb3IoKHFwKSA9IHFwdGljaGFpbjsgKHFwKTsgKHFwKSA9IChxcCktPm5leHQpCisKKyNlbmRpZiAvKiAhKF9RTE9HSUNQVElfSCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbG9naWNwdGlfYXNtLmMgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpX2FzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NDViMzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpX2FzbS5jCkBAIC0wLDAgKzEsMTE2MCBAQAorLyogVmVyc2lvbiAxLjMxLjAwIElTUDEwMDAgSW5pdGlhdG9yIFJJU0MgZmlybXdhcmUgKi8KK3Vuc2lnbmVkIHNob3J0IHNidXNfcmlzY19jb2RlMDFbXSBfX2luaXRkYXRhID0geworCTB4MDA3OCwgMHgxMDMwLCAweDAwMDAsIDB4MjQxOSwgMHgwMDAwLCAweDEyZmYsIDB4MjA0MywgMHg0ZjUwLAorCTB4NTk1MiwgMHg0OTQ3LCAweDQ4NTQsIDB4MjAzMSwgMHgzOTM5LCAweDMxMmMsIDB4MzEzOSwgMHgzOTMyLAorCTB4MmMzMSwgMHgzOTM5LCAweDMzMmMsIDB4MzEzOSwgMHgzOTM0LCAweDIwNTEsIDB4NGM0ZiwgMHg0NzQ5LAorCTB4NDMyMCwgMHg0MzRmLCAweDUyNTAsIDB4NGY1MiwgMHg0MTU0LCAweDQ5NGYsIDB4NGUwMCwgMHgyMDQ5LAorCTB4NTM1MCwgMHgzMTMwLCAweDMwMzAsIDB4MjA0NiwgMHg2OTcyLCAweDZkNzcsIDB4NjE3MiwgMHg2NTIwLAorCTB4MjA1NiwgMHg2NTcyLCAweDczNjksIDB4NmY2ZSwgMHgyMDMwLCAweDMxMmUsIDB4MzMzMSwgMHgyMDIwLAorCTB4MjBiOSwgMHgxMjEyLCAweDIwYzEsIDB4MDAwOCwgMHgyMDcxLCAweDAwMTAsIDB4NzBjMywgMHgwMDA0LAorCTB4MjBjOSwgMHgzZmZmLCAweDIwODksIDB4MTBjOCwgMHg3MGM3LCAweDQ5NTMsIDB4NzBjYiwgMHg1MDIwLAorCTB4NzBjZiwgMHgyMDIwLCAweDcwZDMsIDB4MDAwMSwgMHgzZjAwLCAweDcwZDYsIDB4MjAzMSwgMHgwMDMwLAorCTB4MjA3OSwgMHgzNTAwLCAweDc4NjMsIDB4MDAwMCwgMHgyZmEwLCAweDIwMDksIDB4MDMyNywgMHgyMDExLAorCTB4MDAwMCwgMHgyMGE5LCAweDAwNDAsIDB4NDJhNCwgMHg4MTA5LCAweDAwYzAsIDB4MTA1MSwgMHg3ODliLAorCTB4MDEwMSwgMHg3ODBiLCAweDAwMDIsIDB4NzgwZiwgMHgwMDAyLCAweDc4NGYsIDB4MGJiOCwgMHgyMDY5LAorCTB4MzU0MCwgMHgwMGE4LCAweDEwNmEsIDB4NjgxYiwgMHgwMDNjLCAweDIwMDksIDB4MTMxMywgMHgyMWI4LAorCTB4MDA3OCwgMHgxMDZjLCAweDY4MWIsIDB4MDAyOCwgMHg2ODA3LCAweDAwMDcsIDB4NjgwYiwgMHgwMGZhLAorCTB4NjgwZiwgMHgwMDA4LCAweDY4MTMsIDB4MDAwNSwgMHg2ODFmLCAweDAwMDAsIDB4NjgyMywgMHgwMDA2LAorCTB4NjgxNywgMHgwMDA4LCAweDY4MjcsIDB4MDAwMCwgMHgyMDY5LCAweDM2MDAsIDB4MjAxMSwgMHgwMDIwLAorCTB4MjAwOSwgMHgwMDEwLCAweDY4MGIsIDB4MGMxOSwgMHg2ODBmLCAweDAwMTksIDB4NjgwMywgMHhkZDAwLAorCTB4NjgwNywgMHgwMDFhLCAweDZhMWEsIDB4MmQwMCwgMHhhMGU4LCAweDAwMDgsIDB4YTI5MCwgMHgwMDA0LAorCTB4ODEwOSwgMHgwMGMwLCAweDEwODIsIDB4MjA2OSwgMHgzNjgwLCAweDIwYTksIDB4MDA4MCwgMHg2ODM3LAorCTB4MDAwMCwgMHg2ODBiLCAweDAwNDAsIDB4NjgxNywgMHgwMTAwLCAweDY4MWYsIDB4MDA2NCwgMHhhZGU4LAorCTB4MDAxMCwgMHgwMDcwLCAweDEwYTUsIDB4MDA3OCwgMHgxMDk3LCAweDEwNzgsIDB4MWEzOCwgMHgxMDc4LAorCTB4MmYzYSwgMHgxMDc4LCAweDE2ODEsIDB4MTA3OCwgMHgzM2JhLCAweDMyMDAsIDB4YTA4NSwgMHgwMDBkLAorCTB4MjA5MCwgMHg3MGMzLCAweDAwMDAsIDB4MDA5MCwgMHgxMGJjLCAweDcwYzAsIDB4YTA4NiwgMHgwMDAyLAorCTB4MDBjMCwgMHgxMGJjLCAweDEwNzgsIDB4MTFiYSwgMHgxMDc4LCAweDEwZWMsIDB4MTA3OCwgMHgxODE3LAorCTB4MTA3OCwgMHgxOWE4LCAweDEwNzgsIDB4MzI3ZCwgMHgxMDc4LCAweDE3N2QsIDB4MDA3OCwgMHgxMGJjLAorCTB4MTBkMCwgMHgxMGQyLCAweDFiYzMsIDB4MWJjMywgMHgyZjk4LCAweDJmOTgsIDB4MWJjMywgMHgxYmMzLAorCTB4MDA3OCwgMHgxMGQwLCAweDAwNzgsIDB4MTBkMiwgMHgwMDc4LCAweDEwZDQsIDB4MDA3OCwgMHgxMGQ2LAorCTB4NzAwOCwgMHg4MDBjLCAweDAwYzgsIDB4MTBlNywgMHg3MDA3LCAweDAwMDIsIDB4YTA4YywgMHgwMDBjLAorCTB4MDBjMCwgMHgxMGU4LCAweDgwMDQsIDB4ODAwNCwgMHgwMGM4LCAweDEwZTcsIDB4MDg3YSwgMHgwOTdhLAorCTB4NzBjMywgMHg0MDAyLCAweDAwNzgsIDB4MTFiZCwgMHg3ODE0LCAweGEwMDUsIDB4MDBjMCwgMHgxMGY0LAorCTB4MDAxMCwgMHgxMTMwLCAweDAwNzgsIDB4MTEyZiwgMHgyMDA5LCAweDM1NjgsIDB4MjEwNCwgMHhhMDA1LAorCTB4MDBjMCwgMHgxMTJmLCAweDc4MTQsIDB4YTA4NiwgMHgwMDAxLCAweDAwYzAsIDB4MTEwMSwgMHgxMDc4LAorCTB4MTUzNiwgMHg3ODE3LCAweDAwMDAsIDB4MjAwOSwgMHgzNTZmLCAweDIxMDQsIDB4YTA2NSwgMHgwMDQwLAorCTB4MTExZCwgMHgyMDA5LCAweDM1NmEsIDB4MjExYywgMHg4MTA4LCAweDIxMTQsIDB4ODEwOCwgMHgyMTA0LAorCTB4YTIxMCwgMHhhMzk5LCAweDAwMDAsIDB4MjAwOSwgMHgwMDFjLCAweDYwODMsIDB4MDEwMywgMHgxMDc4LAorCTB4MTYxMSwgMHgwMGMwLCAweDExMjksIDB4MTA3OCwgMHgxNjc4LCAweDIwMDksIDB4MzU2ZiwgMHgyMDBiLAorCTB4MDAwMCwgMHgyMDA5LCAweDM1NjksIDB4MjEwNCwgMHgyMDBiLCAweDAwMDAsIDB4YTAwNSwgMHgwMDQwLAorCTB4MTEyZCwgMHgyMDAxLCAweDQwMDUsIDB4MDA3OCwgMHgxMWJjLCAweDAwNzgsIDB4MTFiYSwgMHgwMDdjLAorCTB4MjA2MSwgMHgwMDAwLCAweDYwMTgsIDB4YTA4NCwgMHgwMDAxLCAweDAwNDAsIDB4MTEzOCwgMHgwMDdjLAorCTB4NzBjMywgMHgwMDAwLCAweDcwYzcsIDB4MDAwMCwgMHg3MGNiLCAweDAwMDAsIDB4NzBjZiwgMHgwMDAwLAorCTB4NzBjMCwgMHhhMGJjLCAweGZmYzAsIDB4MDBjMCwgMHgxMTg4LCAweDIwMzgsIDB4MDA3OSwgMHgxMTQ4LAorCTB4MTFiYSwgMHgxMjA1LCAweDExZDMsIDB4MTIwNSwgMHgxMjU2LCAweDEyNTYsIDB4MTFjYSwgMHgxNTkwLAorCTB4MTI2MSwgMHgxMWM2LCAweDExZDcsIDB4MTFkOSwgMHgxMWRiLCAweDExZGQsIDB4MTU5NSwgMHgxMWM2LAorCTB4MTI2NywgMHgxMjgzLCAweDE1NDQsIDB4MTU4YSwgMHgxMWRmLCAweDE0NmIsIDB4MTQ4ZCwgMHgxNGE3LAorCTB4MTRkMCwgMHgxNDI0LCAweDE0MzIsIDB4MTQ0NiwgMHgxNDVhLCAweDEyZWYsIDB4MTFjNiwgMHgxMjlmLAorCTB4MTJhNiwgMHgxMmFiLCAweDEyYjAsIDB4MTJiNiwgMHgxMmJiLCAweDEyYzAsIDB4MTJjNSwgMHgxMmNhLAorCTB4MTJjZSwgMHgxMmUzLCAweDExYzYsIDB4MTFjNiwgMHgxMWM2LCAweDExYzYsIDB4MTFjNiwgMHgxMmZiLAorCTB4MTMwNCwgMHgxMzEzLCAweDEzMzksIDB4MTM0MywgMHgxMzRhLCAweDEzNzAsIDB4MTM3ZiwgMHgxMzhlLAorCTB4MTNhMCwgMHgxNDA5LCAweDExYzYsIDB4MTFjNiwgMHgxMWM2LCAweDExYzYsIDB4MTFjNiwgMHgxNDE5LAorCTB4YTBiYywgMHhmZmEwLCAweDAwYzAsIDB4MTFjNiwgMHgyMDM4LCAweGEwODQsIDB4MDAxZiwgMHgwMDc5LAorCTB4MTE5MSwgMHgxMWM2LCAweDExYzYsIDB4MTFjNiwgMHgxMWM2LCAweDExYzYsIDB4MTFjNiwgMHgxMWM2LAorCTB4MTFjNiwgMHgxMWM2LCAweDExYzYsIDB4MTFjNiwgMHgxMWM2LCAweDExYzYsIDB4MTFjNiwgMHgxMWM2LAorCTB4MTFjNiwgMHgxMWM2LCAweDExYzYsIDB4MTFjNiwgMHgxMWM2LCAweDExYzYsIDB4MTFjNiwgMHgxMWM2LAorCTB4MTFjNiwgMHgxMWM2LCAweDExYzYsIDB4MTVlZCwgMHgxNWY3LCAweDE1ZmIsIDB4MTYwOSwgMHgxMWM2LAorCTB4MTFjNiwgMHg3MmNhLCAweDcxYzYsIDB4MjAwMSwgMHg0MDA2LCAweDAwNzgsIDB4MTFiYywgMHg3M2NlLAorCTB4NzJjYSwgMHg3MWM2LCAweDIwMDEsIDB4NDAwMCwgMHg3MGMyLCAweDIwNjEsIDB4MDAwMCwgMHg2MDFiLAorCTB4MDAwMSwgMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwgMHg0MDgwLCAweDAwN2MsIDB4NzBjMywgMHg0MDAxLAorCTB4MDA3OCwgMHgxMWJkLCAweDIwOTksIDB4MDA0MSwgMHgyMGExLCAweDAwNDEsIDB4MjBhOSwgMHgwMDA1LAorCTB4NTNhMywgMHgwMDc4LCAweDExYmEsIDB4NzBjNCwgMHg3MGMzLCAweDAwMDQsIDB4MDA3YSwgMHgwMDc4LAorCTB4MTFiYSwgMHgwMDc4LCAweDExYmEsIDB4MDA3OCwgMHgxMWJhLCAweDAwNzgsIDB4MTFiYSwgMHgyMDkxLAorCTB4ODAwMCwgMHg3MGMzLCAweDAwMDAsIDB4NzBjNywgMHg0OTUzLCAweDcwY2IsIDB4NTAyMCwgMHg3MGNmLAorCTB4MjAyMCwgMHg3MGQzLCAweDAwMDEsIDB4M2YwMCwgMHg3MGQ2LCAweDIwNzksIDB4MDAwMCwgMHg3ODFiLAorCTB4MDAwMSwgMHgyMDMxLCAweDAwMzAsIDB4MjA1OSwgMHgxMDAwLCAweDIwMjksIDB4MDQ1NywgMHgyMDUxLAorCTB4MDQ3MCwgMHgyMDYxLCAweDA0NzIsIDB4MjBiOSwgMHhmZmZmLCAweDIwYzEsIDB4MDAwMCwgMHgyMDkxLAorCTB4NTAwMCwgMHgyMDkxLCAweDQwODAsIDB4MDA3OCwgMHgwNDU1LCAweDcxZDAsIDB4NzJjOCwgMHg3M2NjLAorCTB4NzBjNCwgMHgyMGEwLCAweDIwOTgsIDB4MjAzMSwgMHgwMDMwLCAweDgxZmYsIDB4MDA0MCwgMHgxMWJhLAorCTB4NzAwNywgMHgwMDA0LCAweDczMWEsIDB4NzIxZSwgMHgyMDUxLCAweDAwMTIsIDB4MjA0OSwgMHgxMjM0LAorCTB4MjA0MSwgMHgxMWJhLCAweDcwMDMsIDB4MDAwMiwgMHhhNzg2LCAweDAwMDEsIDB4MDBjMCwgMHgxMjI2LAorCTB4MjA0OSwgMHgxMjQyLCAweDIwNDEsIDB4MTI0ZSwgMHg3MDAzLCAweDAwMDMsIDB4NzAxNywgMHgwMDAwLAorCTB4ODEwYiwgMHg3MTEyLCAweDAwYzgsIDB4MTIyZSwgMHg3MDE3LCAweDAwMDEsIDB4NzAwNywgMHgwMDAxLAorCTB4YTc4NiwgMHgwMDAxLCAweDAwNDAsIDB4MTI0MiwgMHg3MDBjLCAweGEwODQsIDB4MDA3ZiwgMHg4MDA0LAorCTB4MjAwOSwgMHgwMDIwLCAweGExMDIsIDB4MDk0MiwgMHgwOTRhLCAweDIwYTgsIDB4MjZhMCwgMHg1M2E2LAorCTB4MDA3OCwgMHgxMGQ4LCAweDcwMGMsIDB4YTA4NCwgMHgwMDdmLCAweDAwNDAsIDB4MTI0MiwgMHg4MGFjLAorCTB4MDA0OCwgMHgxMjQyLCAweDI2OTgsIDB4NTNhNSwgMHgwMDc4LCAweDEwZDgsIDB4NzAwYywgMHhhMDg0LAorCTB4MDA3ZiwgMHg4MGFjLCAweDI2OTgsIDB4NTNhNSwgMHgwMDc4LCAweDExYmEsIDB4NzFjNCwgMHg3MGM4LAorCTB4MjExNCwgMHhhNzllLCAweDAwMDQsIDB4MDBjMCwgMHgxMjVlLCAweDIwMGEsIDB4NzJjYSwgMHgwMDc4LAorCTB4MTFiOSwgMHg3MGM3LCAweDAwMDEsIDB4NzBjYiwgMHgwMDFmLCAweDAwNzgsIDB4MTFiYSwgMHg3MGM0LAorCTB4NzJjOCwgMHg3M2NjLCAweDc0ZDAsIDB4NzBjNiwgMHg3MmNhLCAweDczY2UsIDB4NzRkMiwgMHhhMDA1LAorCTB4MDA0MCwgMHgxMjdkLCAweDgwMDEsIDB4Nzg3MiwgMHg3YTdhLCAweDdiN2UsIDB4N2M3NiwgMHg3ODk4LAorCTB4YTA4NCwgMHhmZmZjLCAweDc4OWEsIDB4MDA3OCwgMHgxMjgxLCAweDc4OTgsIDB4YTA4NSwgMHgwMDAxLAorCTB4Nzg5YSwgMHgwMDc4LCAweDExYmEsIDB4NzBjNCwgMHg3MmM4LCAweDczY2MsIDB4NzRkNCwgMHg3MGM2LAorCTB4NzJjYSwgMHg3M2NlLCAweDc0ZDYsIDB4YTAwNSwgMHgwMDQwLCAweDEyOTksIDB4ODAwMSwgMHg3ODg2LAorCTB4N2E4ZSwgMHg3YjkyLCAweDdjOGEsIDB4Nzg5OCwgMHhhMDg0LCAweGZjZmYsIDB4Nzg5YSwgMHgwMDc4LAorCTB4MTI5ZCwgMHg3ODk4LCAweGEwODUsIDB4MDEwMCwgMHg3ODlhLCAweDAwNzgsIDB4MTFiYSwgMHgyMDA5LAorCTB4MzU1OSwgMHgyMTBjLCAweDIwMTEsIDB4MDQxMCwgMHgwMDc4LCAweDExYjgsIDB4MjAwOSwgMHgzNTQxLAorCTB4MjEwYywgMHgwMDc4LCAweDExYjksIDB4MjAwOSwgMHgzNTQyLCAweDIxMGMsIDB4MDA3OCwgMHgxMWI5LAorCTB4MjA2MSwgMHgzNTQwLCAweDYxMGMsIDB4NjIxMCwgMHgwMDc4LCAweDExYjgsIDB4MjAwOSwgMHgzNTQ1LAorCTB4MjEwYywgMHgwMDc4LCAweDExYjksIDB4MjAwOSwgMHgzNTQ2LCAweDIxMGMsIDB4MDA3OCwgMHgxMWI5LAorCTB4MjAwOSwgMHgzNTQ3LCAweDIxMGMsIDB4MDA3OCwgMHgxMWI5LCAweDIwMDksIDB4MzU0OCwgMHgyMTBjLAorCTB4MDA3OCwgMHgxMWI5LCAweDc5MDgsIDB4N2EwYywgMHgwMDc4LCAweDExYjgsIDB4NzFjNCwgMHg4MTA3LAorCTB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGEwZTgsIDB4MzYwMCwgMHg2YTAwLAorCTB4NjgwNCwgMHhhMDg0LCAweDAwMDgsIDB4MDA0MCwgMHgxMmUwLCAweDZiMDgsIDB4MDA3OCwgMHgxMmUxLAorCTB4NmIwYywgMHgwMDc4LCAweDExYjcsIDB4NzdjNCwgMHgxMDc4LCAweDE2OTIsIDB4MjA5MSwgMHg4MDAwLAorCTB4NmIxYywgMHg2YTE0LCAweDIwOTEsIDB4ODAwMSwgMHgyNzA4LCAweDAwNzgsIDB4MTFiNywgMHg3N2M0LAorCTB4MTA3OCwgMHgxNjkyLCAweDIwOTEsIDB4ODAwMCwgMHg2OTA4LCAweDZhMTgsIDB4NmIxMCwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDc4LCAweDExYjcsIDB4NzFjNCwgMHhhMTgyLCAweDAwMTAsIDB4MDBjOCwgMHgxMWIyLAorCTB4MTA3OCwgMHgxYWJjLCAweDAwNzgsIDB4MTFiNywgMHg3MWM0LCAweGExODIsIDB4MDAxMCwgMHgwMGM4LAorCTB4MTFiMiwgMHgyMDExLCAweDM1NDEsIDB4MjIwNCwgMHgwMDdlLCAweDIxMTIsIDB4MTA3OCwgMHgxYTc1LAorCTB4MDE3ZiwgMHgwMDc4LCAweDExYjksIDB4NzFjNCwgMHgyMDExLCAweDEzMzEsIDB4MjBhOSwgMHgwMDA4LAorCTB4MjIwNCwgMHhhMTA2LCAweDAwNDAsIDB4MTMyMywgMHg4MjEwLCAweDAwNzAsIDB4MTMyMSwgMHgwMDc4LAorCTB4MTMxOCwgMHgwMDc4LCAweDExYjIsIDB4YTI5MiwgMHgxMzMxLCAweDAyN2UsIDB4MjAxMSwgMHgzNTQyLAorCTB4MjIwNCwgMHgyMTEyLCAweDAxN2YsIDB4MDA3ZSwgMHgxMDc4LCAweDFhODEsIDB4MDE3ZiwgMHgwMDc4LAorCTB4MTFiOSwgMHgwM2U4LCAweDAwZmEsIDB4MDFmNCwgMHgwMmVlLCAweDAwNjQsIDB4MDAxOSwgMHgwMDMyLAorCTB4MDA0YiwgMHgyMDYxLCAweDM1NDAsIDB4NjEwYywgMHg2MjEwLCAweDcwYzQsIDB4NjAwZSwgMHg3MGM4LAorCTB4NjAxMiwgMHgwMDc4LCAweDExYjgsIDB4MjA2MSwgMHgzNTQwLCAweDYxMTQsIDB4NzBjNCwgMHg2MDE2LAorCTB4MDA3OCwgMHgxMWI5LCAweDcxYzQsIDB4MjAxMSwgMHgwMDA0LCAweDIwMTksIDB4MTIxMiwgMHhhMTg2LAorCTB4MDAyOCwgMHgwMDQwLCAweDEzNjMsIDB4MjAxMSwgMHgwMDA1LCAweDIwMTksIDB4MTIxMiwgMHhhMTg2LAorCTB4MDAzMiwgMHgwMDQwLCAweDEzNjMsIDB4MjAxMSwgMHgwMDA2LCAweDIwMTksIDB4MTMxMywgMHhhMTg2LAorCTB4MDAzYywgMHgwMGMwLCAweDExYjIsIDB4MjA2MSwgMHgzNTQwLCAweDYwMTgsIDB4MDA3ZSwgMHg2MTFhLAorCTB4MjNiOCwgMHgxMDc4LCAweDFhOTIsIDB4MTA3OCwgMHgzM2JhLCAweDAxN2YsIDB4MDA3OCwgMHgxMWI5LAorCTB4NzFjNCwgMHhhMTg0LCAweGZmY2YsIDB4MDBjMCwgMHgxMWIyLCAweDIwMTEsIDB4MzU0NywgMHgyMjA0LAorCTB4MjExMiwgMHgwMDdlLCAweDEwNzgsIDB4MWFiNCwgMHgwMTdmLCAweDAwNzgsIDB4MTFiOSwgMHg3MWM0LAorCTB4YTE4MiwgMHgwMDEwLCAweDAwYzgsIDB4MTFiMiwgMHgyMDExLCAweDM1NDgsIDB4MjIwNCwgMHgwMDdlLAorCTB4MjExMiwgMHgxMDc4LCAweDFhYTMsIDB4MDE3ZiwgMHgwMDc4LCAweDExYjksIDB4NzFjNCwgMHg3MmM4LAorCTB4YTE4NCwgMHhmZmZkLCAweDAwYzAsIDB4MTFiMSwgMHhhMjg0LCAweGZmZmQsIDB4MDBjMCwgMHgxMWIxLAorCTB4MjEwMCwgMHg3OTA4LCAweDc4MGEsIDB4MjIwMCwgMHg3YTBjLCAweDc4MGUsIDB4MDA3OCwgMHgxMWI4LAorCTB4NzFjNCwgMHg4MTA3LCAweGEwODQsIDB4MDAwZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMGU4LAorCTB4MzYwMCwgMHgyMDE5LCAweDAwMDAsIDB4NzJjOCwgMHg2ODAwLCAweDAwN2UsIDB4YTIyNiwgMHgwMDQwLAorCTB4MTNjZiwgMHg2YTAyLCAweGE0ODQsIDB4MjAwMCwgMHgwMDQwLCAweDEzYjgsIDB4YTM5ZCwgMHgwMDEwLAorCTB4YTQ4NCwgMHgxMDAwLCAweDAwNDAsIDB4MTNiZSwgMHhhMzlkLCAweDAwMDgsIDB4YTQ4NCwgMHg0MDAwLAorCTB4MDA0MCwgMHgxM2NmLCAweDgxMGYsIDB4YTI4NCwgMHg0MDAwLCAweDAwNDAsIDB4MTNjYiwgMHgxMDc4LAorCTB4MWFkNiwgMHgwMDc4LCAweDEzY2YsIDB4MTA3OCwgMHgxYWM4LCAweDAwNzgsIDB4MTNjZiwgMHg3MmNjLAorCTB4ODJmZiwgMHgwMDQwLCAweDE0MDEsIDB4NjgwOCwgMHhhMjA2LCAweDAwNDAsIDB4MTQwMSwgMHhhMmE0LAorCTB4MDBmZiwgMHgyMDYxLCAweDM1NDAsIDB4NjExOCwgMHhhMTg2LCAweDAwMjgsIDB4MDA0MCwgMHgxM2U4LAorCTB4YTE4NiwgMHgwMDMyLCAweDAwNDAsIDB4MTNlZSwgMHhhMTg2LCAweDAwM2MsIDB4MDA0MCwgMHgxM2Y0LAorCTB4YTQ4MiwgMHgwMDY0LCAweDAwNDgsIDB4MTNmZSwgMHgwMDc4LCAweDEzZjgsIDB4YTQ4MiwgMHgwMDUwLAorCTB4MDA0OCwgMHgxM2ZlLCAweDAwNzgsIDB4MTNmOCwgMHhhNDgyLCAweDAwNDMsIDB4MDA0OCwgMHgxM2ZlLAorCTB4NzFjNCwgMHg3MWM2LCAweDAyN2YsIDB4NzJjYSwgMHgwMDc4LCAweDExYjMsIDB4NmEwYSwgMHhhMzlkLAorCTB4MDAwYSwgMHg2ODA0LCAweGEzMDUsIDB4NjgwNiwgMHgwMjdmLCAweDZiMGMsIDB4NzFjNCwgMHgwMDc4LAorCTB4MTFiNywgMHg3N2M0LCAweDEwNzgsIDB4MTY5MiwgMHgyMDkxLCAweDgwMDAsIDB4NmExNCwgMHg2YjFjLAorCTB4MjA5MSwgMHg4MDAxLCAweDcwYzgsIDB4NjgxNiwgMHg3MGNjLCAweDY4MWUsIDB4MjcwOCwgMHgwMDc4LAorCTB4MTFiNywgMHg3MWM0LCAweDcyYzgsIDB4NzNjYywgMHhhMTgyLCAweDAwMTAsIDB4MDBjOCwgMHgxMWIyLAorCTB4MTA3OCwgMHgxYWU0LCAweDAwNzgsIDB4MTFiNywgMHg3N2M0LCAweDEwNzgsIDB4MTY5MiwgMHgyMDkxLAorCTB4ODAwMCwgMHg2YTA4LCAweGEyOTUsIDB4MDAwMiwgMHg2YTBhLCAweDIwOTEsIDB4ODAwMSwgMHgyNzA4LAorCTB4MDA3OCwgMHgxMWI4LCAweDc3YzQsIDB4MTA3OCwgMHgxNjkyLCAweDIwOTEsIDB4ODAwMCwgMHg2YTA4LAorCTB4YTI5NCwgMHhmZmY5LCAweDZhMGEsIDB4NjgwNCwgMHhhMDA1LCAweDAwNDAsIDB4MTQ0MSwgMHgxMDc4LAorCTB4MWExOSwgMHgyMDkxLCAweDgwMDEsIDB4MjcwOCwgMHgwMDc4LCAweDExYjgsIDB4NzdjNCwgMHgxMDc4LAorCTB4MTY5MiwgMHgyMDkxLCAweDgwMDAsIDB4NmEwOCwgMHhhMjk1LCAweDAwMDQsIDB4NmEwYSwgMHg2ODA0LAorCTB4YTAwNSwgMHgwMDQwLCAweDE0NTUsIDB4MTA3OCwgMHgxYTE5LCAweDIwOTEsIDB4ODAwMSwgMHgyNzA4LAorCTB4MDA3OCwgMHgxMWI4LCAweDc3YzQsIDB4MjA0MSwgMHgwMDAxLCAweDIwNDksIDB4MDAwNSwgMHgyMDUxLAorCTB4MDAyMCwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHgxNjlmLCAweDIwOTEsIDB4ODAwMSwgMHgyNzA4LAorCTB4NmEwOCwgMHgwMDc4LCAweDExYjgsIDB4NzdjNCwgMHg3MmM4LCAweDczY2MsIDB4NzdjNiwgMHg3MmNhLAorCTB4NzNjZSwgMHgxMDc4LCAweDE3MTgsIDB4MDBjMCwgMHgxNDg5LCAweDY4MTgsIDB4YTAwNSwgMHgwMDQwLAorCTB4MTQ4MywgMHgyNzA4LCAweDEwNzgsIDB4MWFmNCwgMHgwMGMwLCAweDE0ODMsIDB4NzgxNywgMHhmZmZmLAorCTB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4MjA5MSwgMHg4MDAxLCAweDIwMDEsIDB4NDAwNSwgMHgwMDc4LAorCTB4MTFiYywgMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwgMHgxMWJhLCAweDc3YzQsIDB4NzdjNiwgMHgyMDQxLAorCTB4MDAyMSwgMHgyMDQ5LCAweDAwMDUsIDB4MjA1MSwgMHgwMDIwLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LAorCTB4MTY5ZiwgMHgyMDYxLCAweDM1NDAsIDB4NjBhMywgMHgwMDAzLCAweDY3YjYsIDB4NjBhNywgMHgwMDAwLAorCTB4NzgxNywgMHhmZmZmLCAweDIwOTEsIDB4ODAwMSwgMHgxMDc4LCAweDFhMTksIDB4MDA3YywgMHg3N2M4LAorCTB4NzdjYSwgMHg3N2M0LCAweDc3YzYsIDB4YTdiYywgMHhmZjAwLCAweDIwOTEsIDB4ODAwMCwgMHgyMDYxLAorCTB4MzU0MCwgMHg2MGEzLCAweDAwMDIsIDB4NjBhNywgMHgwMDAwLCAweDY3YjYsIDB4NzgxNywgMHhmZmZmLAorCTB4MTA3OCwgMHgxYTE5LCAweDIwOTEsIDB4ODAwMSwgMHgyMDQxLCAweDAwMjEsIDB4MjA0OSwgMHgwMDA0LAorCTB4MjA1MSwgMHgwMDEwLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDE2OWYsIDB4NzBjOCwgMHg2ODM2LAorCTB4ODczOCwgMHhhNzg0LCAweDAwMDcsIDB4MDBjMCwgMHgxNGM0LCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLAorCTB4Nzg5OCwgMHhhMDg0LCAweDAwMDMsIDB4MDBjMCwgMHgxNGY0LCAweDIwMzksIDB4MDAwMCwgMHgyMDQxLAorCTB4MDAyMSwgMHgyMDQ5LCAweDAwMDQsIDB4MjA1MSwgMHgwMDA4LCAweDEwNzgsIDB4MTY5MiwgMHgyMDkxLAorCTB4ODAwMCwgMHg2ODA4LCAweGE4MGQsIDB4NjkwYSwgMHgyMDkxLCAweDgwMDEsIDB4ODczOCwgMHhhNzg0LAorCTB4MDAwNywgMHgwMGMwLCAweDE0ZGQsIDB4YTdiYywgMHhmZjAwLCAweDg3M2YsIDB4ODczOCwgMHg4NzNmLAorCTB4YTc4NCwgMHgwZjAwLCAweDAwYzAsIDB4MTRkZCwgMHgyMDkxLCAweDgwMDAsIDB4MjA2OSwgMHgwMTAwLAorCTB4NjgzMCwgMHhhMDg0LCAweDAwNDAsIDB4MDA0MCwgMHgxNTFkLCAweDY4NGIsIDB4MDAwNCwgMHgyMGE5LAorCTB4MDAxNCwgMHg2ODQ4LCAweGEwODQsIDB4MDAwNCwgMHgwMDQwLCAweDE1MGEsIDB4MDA3MCwgMHgxNTBhLAorCTB4MDA3OCwgMHgxNTAxLCAweDY4NGIsIDB4MDAwOSwgMHgyMGE5LCAweDAwMTQsIDB4Njg0OCwgMHhhMDg0LAorCTB4MDAwMSwgMHgwMDQwLCAweDE1MTcsIDB4MDA3MCwgMHgxNTE3LCAweDAwNzgsIDB4MTUwZSwgMHgyMGE5LAorCTB4MDBmYSwgMHgwMDcwLCAweDE1MWQsIDB4MDA3OCwgMHgxNTE5LCAweDIwNzksIDB4MzUwMCwgMHg3ODE3LAorCTB4MDAwMSwgMHgyMDYxLCAweDM1NDAsIDB4NjBhMywgMHgwMDAxLCAweDYwYTcsIDB4MDAwMCwgMHg2MGMzLAorCTB4MDAwZiwgMHg3ODk4LCAweGEwODUsIDB4MDAwMiwgMHg3ODlhLCAweDY4MDgsIDB4YTA4NCwgMHhmZmZkLAorCTB4NjgwYSwgMHg2ODFiLCAweDAwNDYsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4Nzg5OCwgMHhhMDg0LAorCTB4ZmZmZCwgMHg3ODlhLCAweGEwODQsIDB4MDAwMSwgMHgwMGMwLCAweDE1NDAsIDB4MTA3OCwgMHgxNzYwLAorCTB4NzFjNCwgMHg3MWM2LCAweDc5NGEsIDB4MDA3YywgMHg3NGM0LCAweDczYzgsIDB4NzJjYywgMHg3NGM2LAorCTB4NzNjYSwgMHg3MmNlLCAweDIwNzksIDB4MzUwMCwgMHgyMDA5LCAweDAwNDAsIDB4MTA3OCwgMHgxNjZmLAorCTB4MDA0MCwgMHgxNTg2LCAweDEwNzgsIDB4MTYzZiwgMHgwMDQwLCAweDE1NWEsIDB4MTA3OCwgMHgxNjc4LAorCTB4MDA3OCwgMHgxNTg2LCAweDYwMTAsIDB4MjA5MSwgMHg4MDAxLCAweDc4MTcsIDB4ZmZmZiwgMHgyMDA5LAorCTB4MzU2OCwgMHgyMDBiLCAweDAwMDUsIDB4ODEwOCwgMHgyMDBiLCAweDAwMDAsIDB4ODEwOCwgMHgyMzBhLAorCTB4ODEwOCwgMHgyMjBhLCAweDgxMDgsIDB4MjQwYSwgMHg4MTA4LCAweDIwMGEsIDB4ODEwOCwgMHgyMDBiLAorCTB4MDAwMCwgMHg4MTA4LCAweDJjMGEsIDB4YTAyZSwgMHgyNTMwLCAweDBlN2UsIDB4MTA3OCwgMHgyZjEzLAorCTB4MGU3ZiwgMHg2NTkyLCAweDY1YTIsIDB4NjY5NiwgMHg2NmE2LCAweDYwYWIsIDB4MDAwMCwgMHg2MGFmLAorCTB4MDAwMCwgMHgyMDkxLCAweDgwMDEsIDB4MTA3OCwgMHgxYTE5LCAweDAwN2MsIDB4NzBjMywgMHg0MDA1LAorCTB4MDA3OCwgMHgxMWJkLCAweDcxYzQsIDB4NzBjNywgMHgwMDAwLCAweDc5MDYsIDB4MDA3OCwgMHgxMWJhLAorCTB4NzFjNCwgMHg3MWM2LCAweDIxNjgsIDB4MDA3OCwgMHgxNTk3LCAweDIwNjksIDB4MTAwMCwgMHg2OTBjLAorCTB4YTAxNiwgMHgyZDA0LCAweGEyMTAsIDB4OGQ2OCwgMHg4MTA5LCAweDAwYzAsIDB4MTU5OSwgMHhhMjg1LAorCTB4MDAwMCwgMHgwMGMwLCAweDE1YTcsIDB4NzBjMywgMHg0MDAwLCAweDAwNzgsIDB4MTVhOSwgMHg3MGMzLAorCTB4NDAwMywgMHg3MGNhLCAweDAwNzgsIDB4MTFiZCwgMHg3MWM0LCAweDcyYzgsIDB4NzNjYywgMHgyMTAwLAorCTB4YTE4NCwgMHhmZmZjLCAweDAwYzAsIDB4MTFjNiwgMHgyMTAwLCAweDAwNzksIDB4MTViNywgMHgxNWNlLAorCTB4MTVlMywgMHgxNWU1LCAweDE1ZTcsIDB4NzBjMywgMHg0MDAzLCAweDcxY2UsIDB4NzJkMiwgMHg3M2Q2LAorCTB4MDA3OCwgMHgxNWNhLCAweDcwYzMsIDB4NDAwMCwgMHg3MGNmLCAweDAwMDAsIDB4NzBkMywgMHgwMDAwLAorCTB4NzBkNywgMHgwMDAwLCAweDc3YzYsIDB4NzFjYSwgMHgwMDc4LCAweDExYmEsIDB4MjAzMSwgMHgxNWU5LAorCTB4MjYyNCwgMHg4NjMwLCAweDI0MTIsIDB4MjIwNCwgMHhhNDQ2LCAweDAwYzAsIDB4MTViYiwgMHhhNDg0LAorCTB4ZmZmZiwgMHgwMGMwLCAweDE1ZDAsIDB4MjAzMSwgMHgxNWU5LCAweDgyMTAsIDB4ODMxOSwgMHhhMzg0LAorCTB4ZmZmZiwgMHgwMGMwLCAweDE1ZDAsIDB4MDA3OCwgMHgxNWMyLCAweDAwNzgsIDB4MTVjMiwgMHgwMDc4LAorCTB4MTVjMiwgMHg1NTU1LCAweGFhYWEsIDB4ZmZmZiwgMHgwMDAwLCAweDc5NjAsIDB4NzFjNiwgMHg3MWM0LAorCTB4YTE4MiwgMHgwMDAzLCAweDAwYzgsIDB4MTFiMiwgMHg3OTYyLCAweDAwNzgsIDB4MTFiYSwgMHg3OTYwLAorCTB4NzFjNiwgMHgwMDc4LCAweDExYmEsIDB4Nzk1NCwgMHg3MWM2LCAweDcxYzQsIDB4Nzk1NiwgMHg3OTU4LAorCTB4NzFjYSwgMHg3MWM4LCAweDc5NWEsIDB4Nzk1YywgMHg3MWNlLCAweDcxY2MsIDB4Nzk1ZSwgMHgwMDc4LAorCTB4MTFiYSwgMHg3OTU0LCAweDcxYzYsIDB4Nzk1OCwgMHg3MWNhLCAweDc5NWMsIDB4NzFjZSwgMHgwMDc4LAorCTB4MTFiYSwgMHg3MDBjLCAweGEwODQsIDB4MDA3ZiwgMHgwMDQwLCAweDE2MWQsIDB4NzAwNywgMHgwMDA0LAorCTB4NzAwNCwgMHhhMDg0LCAweDAwMDQsIDB4MDBjMCwgMHgxNjE4LCAweDcwMTcsIDB4MDAwMCwgMHg3MTEyLAorCTB4NzIxYSwgMHg3MzFlLCAweDgxMDgsIDB4ODEwYywgMHg4MWE5LCAweDhjOTgsIDB4MjBhMSwgMHgwMDMwLAorCTB4NjA4MCwgMHgyMGEyLCAweDUzYTYsIDB4NzgwYywgMHhhMDg1LCAweDAwMDAsIDB4NzAwMiwgMHg3MDA3LAorCTB4MDAwMSwgMHg3MTA4LCAweDgxMDQsIDB4MDBjOCwgMHgxNjMxLCAweDcwMDcsIDB4MDAwMiwgMHhhMTg0LAorCTB4MDAwYywgMHg3MTBjLCAweGExODQsIDB4MDMwMCwgMHg3MDAzLCAweDAwMDAsIDB4MDA3YywgMHg3MDBjLAorCTB4YTA4NCwgMHgwMDdmLCAweDAwNDAsIDB4MTY0YiwgMHg3MDA3LCAweDAwMDQsIDB4NzAwNCwgMHhhMDg0LAorCTB4MDAwNCwgMHgwMGMwLCAweDE2NDYsIDB4NzAxNywgMHgwMDAwLCAweDcxMTIsIDB4NzIxYSwgMHg3MzFlLAorCTB4MjA5OSwgMHgwMDMwLCAweDgxMDgsIDB4ODFhYywgMHg3ODBjLCAweGEwODUsIDB4MDAwMSwgMHg3MDAyLAorCTB4NzAwNywgMHgwMDAxLCAweDcwMDgsIDB4ODAwYywgMHgwMGM4LCAweDE2NWEsIDB4NzAwNywgMHgwMDAyLAorCTB4YTA4YywgMHgwMDBjLCAweDAwYzAsIDB4MTY2YywgMHg3MTBjLCAweGExODQsIDB4MDMwMCwgMHgwMGMwLAorCTB4MTY2YywgMHgyY2EwLCAweDUzYTUsIDB4YTAwNiwgMHg3MDAzLCAweDAwMDAsIDB4MDA3YywgMHg3ODUwLAorCTB4YTA2NSwgMHgwMDQwLCAweDE2NzcsIDB4MmMwNCwgMHg3ODUyLCAweDIwNjMsIDB4MDAwMCwgMHgwMDdjLAorCTB4MGY3ZSwgMHgyMDc5LCAweDM1MDAsIDB4Nzg1MCwgMHgyMDYyLCAweDJjMDAsIDB4Nzg1MiwgMHgwZjdmLAorCTB4MDA3YywgMHgyMDExLCAweDQwMDAsIDB4N2E1MiwgMHgyMDE5LCAweDA0MTAsIDB4ODMxOSwgMHgwMDQwLAorCTB4MTY4ZiwgMHhhMjgwLCAweDAwMmYsIDB4MjAxMiwgMHgyMDEwLCAweDAwNzgsIDB4MTY4NiwgMHgyMDEzLAorCTB4MDAwMCwgMHgwMDdjLCAweGE3ODQsIDB4MGYwMCwgMHg4MDBjLCAweGE3ODQsIDB4MDAwNywgMHg4MDAzLAorCTB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTEwNSwgMHhhMGU4LCAweDM2ODAsIDB4MDA3YywgMHgxMDc4LAorCTB4MTY5MiwgMHgyOTAwLCAweDY4MmEsIDB4MmEwMCwgMHg2ODJlLCAweDY4MDgsIDB4YTA4NCwgMHhmZmVmLAorCTB4YTgwZCwgMHg2OTBhLCAweDIwMDksIDB4MzU0ZiwgMHgyMTBjLCAweDY4MDQsIDB4YTAwNSwgMHgwMDQwLAorCTB4MTZiYywgMHhhMTE2LCAweDAwYzAsIDB4MTZiYywgMHgyMDYwLCAweDYwMDAsIDB4NjgwNiwgMHgwMTdlLAorCTB4MjAwYiwgMHgwMDAwLCAweDAwNzgsIDB4MTZiZiwgMHgyMDA5LCAweDAwMDAsIDB4MDE3ZSwgMHg2ODA0LAorCTB4YTA2NSwgMHgwMDQwLCAweDE2Y2UsIDB4NjAwMCwgMHg2ODA2LCAweDEwNzgsIDB4MTZkZiwgMHgxMDc4LAorCTB4MTdjYiwgMHg2ODEwLCAweDgwMDEsIDB4NjgxMiwgMHgwMGMwLCAweDE2YmYsIDB4MDE3ZiwgMHg2OTAyLAorCTB4NjkwNiwgMHgwMDdjLCAweGEwNjUsIDB4MDA0MCwgMHgxNmRlLCAweDYwOTgsIDB4NjA5YiwgMHgwMDAwLAorCTB4MjAwOCwgMHgxMDc4LCAweDE2NzgsIDB4MjEwMCwgMHgwMDc4LCAweDE2ZDIsIDB4MDA3YywgMHg2MDAzLAorCTB4MDEwMywgMHgyMGE5LCAweDAwMWMsIDB4YWM4MCwgMHgwMDA0LCAweDIwYTAsIDB4MjAwMSwgMHgwMDAwLAorCTB4NDBhNCwgMHg2ODI4LCAweDYwMTYsIDB4NjgyYywgMHg2MDFlLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLAorCTB4MzU0MCwgMHg3MDQwLCAweGEwOGMsIDB4MDA4MCwgMHgwMGMwLCAweDE2ZmMsIDB4YTA4OCwgMHgzNTgwLAorCTB4MmQwYSwgMHg4MDAwLCAweDcwNDIsIDB4YTAwNiwgMHgwZTdmLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLAorCTB4MzU0MCwgMHgyMDA5LCAweDM1ODAsIDB4NzI0MCwgMHg4MjIxLCAweDgyMTEsIDB4MDA0OCwgMHgxNzE2LAorCTB4MjEwNCwgMHg4MTA4LCAweGFkMDYsIDB4MDBjMCwgMHgxNzA1LCAweDgxMTksIDB4MjExZSwgMHg4MTA4LAorCTB4ODMxOCwgMHg4MjExLCAweDAwYzgsIDB4MTcwZSwgMHg3NDQyLCAweGEwMDYsIDB4MGU3ZiwgMHgwMDdjLAorCTB4MTA3OCwgMHgxNjkyLCAweDIwOTEsIDB4ODAwMCwgMHg2ODA0LCAweDc4MWUsIDB4YTA2NSwgMHgwMDQwLAorCTB4MTc1ZiwgMHgwMDc4LCAweDE3MjksIDB4MmMwMCwgMHg3ODFlLCAweDYwMDAsIDB4YTA2NSwgMHgwMDQwLAorCTB4MTc1ZiwgMHg2MDBjLCAweGEzMDYsIDB4MDBjMCwgMHgxNzIzLCAweDYwMDgsIDB4YTIwNiwgMHgwMGMwLAorCTB4MTcyMywgMHgyYzI4LCAweDIwMDEsIDB4MzU0ZiwgMHgyMDA0LCAweGFjMDYsIDB4MDA0MCwgMHgxNzVmLAorCTB4NjgwNCwgMHhhYzA2LCAweDAwYzAsIDB4MTc0NiwgMHg2MDAwLCAweDIwNjAsIDB4NjgwNiwgMHhhMDA1LAorCTB4MDBjMCwgMHgxNzQ2LCAweDY4MDMsIDB4MDAwMCwgMHgwMDc4LCAweDE3NTAsIDB4NjQwMCwgMHg3ODFjLAorCTB4MjA2MCwgMHg2NDAyLCAweGE0ODYsIDB4MDAwMCwgMHgwMGMwLCAweDE3NTAsIDB4MmMwMCwgMHg2ODAyLAorCTB4MjU2MCwgMHgxMDc4LCAweDE2ZGYsIDB4NjAxNywgMHgwMDA1LCAweDYwMWYsIDB4MDAyMCwgMHgxMDc4LAorCTB4MTdjYiwgMHg2ODEwLCAweDgwMDEsIDB4NjgxMiwgMHgyMDAxLCAweGZmZmYsIDB4YTAwNSwgMHgwMDdjLAorCTB4MjAzOSwgMHgwMDAwLCAweDIwNDEsIDB4MDAyMSwgMHgyMDQ5LCAweDAwMDQsIDB4MjA1MSwgMHgwMDA4LAorCTB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4MTY5ZiwgMHg4NzM4LCAweGE3ODQsIDB4MDAwNywgMHgwMGMwLAorCTB4MTc2YSwgMHhhN2JjLCAweGZmMDAsIDB4ODczZiwgMHg4NzM4LCAweDg3M2YsIDB4YTc4NCwgMHgwZjAwLAorCTB4MDBjMCwgMHgxNzZhLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDIwNjEsIDB4MDAwMCwgMHg2MDE4LAorCTB4YTA4NCwgMHgwMDAxLCAweDAwYzAsIDB4MTc4YSwgMHg3OGFjLCAweDc4YWYsIDB4MDAwMCwgMHhhMDA1LAorCTB4MDBjMCwgMHgxNzhiLCAweDAwN2MsIDB4YTA4YywgMHhmZmYwLCAweDAwNDAsIDB4MTc5MSwgMHgxMDc4LAorCTB4MWJhNSwgMHgwMDc5LCAweDE3OTMsIDB4MTdhMywgMHgxN2E1LCAweDE3YWIsIDB4MTdhZiwgMHgxN2EzLAorCTB4MTdiMywgMHgxN2EzLCAweDE3YTMsIDB4MTdhMywgMHgxN2EzLCAweDE3YjksIDB4MTdiZCwgMHgxN2EzLAorCTB4MTdhMywgMHgxN2EzLCAweDE3YTMsIDB4MTA3OCwgMHgxYmE1LCAweDEwNzgsIDB4MTc2MCwgMHgyMDAxLAorCTB4ODAwMSwgMHgwMDc4LCAweDE3YzMsIDB4MjAwMSwgMHg4MDAzLCAweDAwNzgsIDB4MTdjMywgMHgyMDAxLAorCTB4ODAwNCwgMHgwMDc4LCAweDE3YzMsIDB4MTA3OCwgMHgxNzYwLCAweDIwMDEsIDB4ODAwNiwgMHgwMDc4LAorCTB4MTdjMywgMHgyMDAxLCAweDgwMGMsIDB4MDA3OCwgMHgxN2MzLCAweDEwNzgsIDB4MTc2MCwgMHgyMDAxLAorCTB4ODAwZCwgMHgwMDc4LCAweDE3YzMsIDB4NzBjMiwgMHgyMDYxLCAweDAwMDAsIDB4NjAxYiwgMHgwMDAxLAorCTB4MjA5MSwgMHg0MDgwLCAweDAwN2MsIDB4MmMwNCwgMHg2MDgyLCAweDJjMDgsIDB4MjA2MywgMHgwMDAwLAorCTB4Nzg2NCwgMHg4MDAwLCAweDc4NjYsIDB4Nzg2OCwgMHhhMDA1LCAweDc5NmEsIDB4MDA0MCwgMHgxN2RiLAorCTB4MmMwMiwgMHgwMDc4LCAweDE3ZGMsIDB4Nzk2ZSwgMHgwMDdjLCAweDBjN2UsIDB4MjA2MSwgMHgzNTAwLAorCTB4Njg4MywgMHgwMTAzLCAweDJkMDgsIDB4MjA2YiwgMHgwMDAwLCAweDYwNjQsIDB4ODAwMCwgMHg2MDY2LAorCTB4NjA2OCwgMHhhMDA1LCAweDYxNmEsIDB4MDA0MCwgMHgxN2YwLCAweDJkMDIsIDB4MDA3OCwgMHgxN2YxLAorCTB4NjE2ZSwgMHgwYzdmLCAweDAwN2MsIDB4MTA3OCwgMHgxODA0LCAweDAwNDAsIDB4MTgwMywgMHgwYzdlLAorCTB4NjA5OCwgMHhhMDY1LCAweDAwNDAsIDB4MTdmZSwgMHgxMDc4LCAweDE2ZDIsIDB4MGM3ZiwgMHg2MDliLAorCTB4MDAwMCwgMHgxMDc4LCAweDE2NzgsIDB4MDA3YywgMHg3ODZjLCAweGEwNjUsIDB4MDA0MCwgMHgxODE2LAorCTB4MjA5MSwgMHg4MDAwLCAweDc4NjQsIDB4ODAwMSwgMHg3ODY2LCAweDJjMDQsIDB4Nzg2ZSwgMHhhMDA1LAorCTB4MDBjMCwgMHgxODE0LCAweDc4NmEsIDB4ODAwMCwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHg3ODk4LAorCTB4YTAwNSwgMHgwMGMwLCAweDE4NjUsIDB4Nzk3NCwgMHg3MGQwLCAweDAwMDUsIDB4MDAwNSwgMHg3MmQwLAorCTB4YTIwNiwgMHgwMGMwLCAweDE4MWMsIDB4MjIwMCwgMHhhMTA2LCAweDAwYzAsIDB4MTgzMywgMHg3ODA0LAorCTB4YTAwNSwgMHgwMDQwLCAweDE4NjUsIDB4NzgwNywgMHgwMDAwLCAweDAwNjgsIDB4MTg2NSwgMHgyMDkxLAorCTB4NDA4MCwgMHgwMDc4LCAweDE4NjUsIDB4MTA3OCwgMHgxNjZmLCAweDAwNDAsIDB4MTg2NSwgMHg3YTdjLAorCTB4N2I3OCwgMHg4MTA3LCAweDgwMDQsIDB4ODAwNCwgMHhhMjEwLCAweGEzOTksIDB4MDAwMCwgMHgyMDA5LAorCTB4MDA0MCwgMHgxMDc4LCAweDE2M2YsIDB4MDA0MCwgMHgxODVjLCAweDEwNzgsIDB4MTY3OCwgMHg3ODgwLAorCTB4ODAwMCwgMHg3ODgyLCAweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDE4NjUsIDB4MjA5MSwgMHg4MDAwLAorCTB4NzhhZiwgMHgwMDAyLCAweDc4ODMsIDB4MDAwMCwgMHg3ODk4LCAweGEwODUsIDB4MDAwMywgMHg3ODlhLAorCTB4MjA5MSwgMHg4MDAxLCAweDAwNzgsIDB4MTg2NSwgMHg3ODgzLCAweDAwMDAsIDB4MTA3OCwgMHgxOTkyLAorCTB4NjAwMCwgMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHgxODY2LCAweDAwN2MsIDB4MTg2ZSwgMHgxODdkLAorCTB4MTg5ZCwgMHgxODZlLCAweDE4YWYsIDB4MTg2ZSwgMHgxODZlLCAweDE4NmUsIDB4MjAzOSwgMHgwNDAwLAorCTB4NzhhOCwgMHhhNzA1LCAweDc4YWEsIDB4NjAwNCwgMHhhNzA1LCAweDYwMDYsIDB4MTA3OCwgMHgxOGVkLAorCTB4NjAxOCwgMHg3OGE2LCAweDEwNzgsIDB4MTk3YSwgMHgwMDdjLCAweDc4YTgsIDB4YTA4NCwgMHgwMTAwLAorCTB4MDA0MCwgMHgxODg0LCAweDAwNzgsIDB4MTg2ZSwgMHg3OGFiLCAweDAwMDAsIDB4NjAwMCwgMHg4MDA3LAorCTB4YTA4NCwgMHgwMGZmLCAweDc4OWUsIDB4ODAwMSwgMHg2MDliLCAweDAwMDAsIDB4MDA0MCwgMHgxODlhLAorCTB4MTA3OCwgMHgxOGVkLCAweDAwNDAsIDB4MTg5YSwgMHg3OGE4LCAweGEwODUsIDB4MDEwMCwgMHg3OGFhLAorCTB4MDA3OCwgMHgxODljLCAweDEwNzgsIDB4MTkxMSwgMHgwMDdjLCAweDc4YTgsIDB4YTA4YywgMHgwZTAwLAorCTB4MDBjMCwgMHgxOGE2LCAweGEwODQsIDB4MDEwMCwgMHgwMGMwLCAweDE4YTgsIDB4MDA3OCwgMHgxODZlLAorCTB4MTA3OCwgMHgxOGVkLCAweDAwYzAsIDB4MThhZSwgMHgxMDc4LCAweDE5MTEsIDB4MDA3YywgMHg3OGE4LAorCTB4YTA4NCwgMHgwMTAwLCAweDAwNDAsIDB4MThiNiwgMHgwMDc4LCAweDE4NmUsIDB4NzhhYiwgMHgwMDAwLAorCTB4NjcxMCwgMHgyMGE5LCAweDAwMDEsIDB4NjAxNCwgMHhhMDg0LCAweDAwZmYsIDB4YTAwNSwgMHgwMDQwLAorCTB4MThkMywgMHhhN2JjLCAweGZmMDAsIDB4MjBhOSwgMHgwMDA4LCAweGEwOGUsIDB4MDAwMSwgMHgwMDQwLAorCTB4MThkMywgMHgyMDM5LCAweDAwMDAsIDB4MjBhOSwgMHgwMDgwLCAweGEwOGUsIDB4MDAwMiwgMHgwMDQwLAorCTB4MThkMywgMHgwMDc4LCAweDE4ZWEsIDB4MTA3OCwgMHgxNjkyLCAweDJkMDAsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjgyYiwgMHgwMDAwLCAweDY4MmYsIDB4MDAwMCwgMHg2ODA4LCAweGEwODQsIDB4ZmZkZSwgMHg2ODBhLAorCTB4MmQwMCwgMHhhMDgwLCAweDAwMTAsIDB4MjA2OCwgMHgyMDkxLCAweDgwMDEsIDB4MDA3MCwgMHgxOGVhLAorCTB4MDA3OCwgMHgxOGQ2LCAweDEwNzgsIDB4MTY3OCwgMHgwMDdjLCAweDc4YTAsIDB4YTA2ZCwgMHgwMGMwLAorCTB4MThmOCwgMHgyYzAwLCAweDc4YTIsIDB4NzhhNiwgMHg2MDliLCAweDAwMDAsIDB4MDA3OCwgMHgxOTA0LAorCTB4MmMwMCwgMHg2ODlhLCAweDYwOWIsIDB4MDAwMCwgMHg3OGEyLCAweDJkMDAsIDB4NjAwMiwgMHg3OGE0LAorCTB4YWQwNiwgMHgwMGMwLCAweDE5MDQsIDB4NjAwMiwgMHg3ODljLCAweDgwMDEsIDB4Nzg5ZSwgMHgwMGMwLAorCTB4MTkxMCwgMHg3OGE4LCAweGEwODQsIDB4MDAwMCwgMHg3OGFhLCAweDc4YTQsIDB4MjA2MCwgMHhhMDA2LAorCTB4MDA3YywgMHhhMDJlLCAweDI1MzAsIDB4NjExOCwgMHhhMTg0LCAweDAwNjAsIDB4NjE5ZSwgMHgwMDQwLAorCTB4MTkxZCwgMHgwZTdlLCAweDEwNzgsIDB4MmYxMywgMHgwZTdmLCAweDY1OTIsIDB4NjVhMiwgMHg2Njk2LAorCTB4NjZhNiwgMHg2MGFiLCAweDAwMDAsIDB4NjBhZiwgMHgwMDAwLCAweDY3MTAsIDB4MTA3OCwgMHgxNjkyLAorCTB4MjA5MSwgMHg4MDAwLCAweDY4MDgsIDB4YTA4NCwgMHgwMDAxLCAweDAwNDAsIDB4MTkzZiwgMHgyMDkxLAorCTB4ODAwMSwgMHgxMDc4LCAweDE2ZGYsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4MTdjYiwgMHgyMDkxLAorCTB4ODAwMSwgMHg3OGEzLCAweDAwMDAsIDB4NzhhNywgMHgwMDAwLCAweDAwNzgsIDB4MTk3OSwgMHg2MDIwLAorCTB4YTA5NiwgMHgwMDAxLCAweDAwYzAsIDB4MTk0NiwgMHg4MDAwLCAweDYwMjIsIDB4NmExMCwgMHg2ODE0LAorCTB4MjA5MSwgMHg4MDAxLCAweGEyMDIsIDB4MDA0OCwgMHgxOTU1LCAweDAwNDAsIDB4MTk1NSwgMHgyMDM5LAorCTB4MDIwMCwgMHgxMDc4LCAweDE5N2EsIDB4MDA3OCwgMHgxOTc5LCAweDJjMDgsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjgwMCwgMHhhMDY1LCAweDAwNDAsIDB4MTk1ZCwgMHg2MTAyLCAweDY5MDIsIDB4MDBjMCwgMHgxOTYxLAorCTB4NjkwNiwgMHgyMTYwLCAweDYwMDMsIDB4MDAwMCwgMHg2ODEwLCAweDgwMDAsIDB4NjgxMiwgMHgyMDkxLAorCTB4ODAwMSwgMHg2ODA4LCAweGEwOGMsIDB4MDA0MCwgMHgwMDQwLCAweDE5NzMsIDB4YTA4NiwgMHgwMDQwLAorCTB4NjgwYSwgMHgxMDc4LCAweDE2ZWUsIDB4MTA3OCwgMHgxYTE5LCAweDc4YTcsIDB4MDAwMCwgMHg3OGEzLAorCTB4MDAwMCwgMHgwMDdjLCAweDYwMDQsIDB4YTcwNSwgMHg2MDA2LCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LAorCTB4MTdjYiwgMHgyMDkxLCAweDgwMDEsIDB4NzhhNCwgMHhhMDY1LCAweDAwNDAsIDB4MTk4ZCwgMHg2MDk4LAorCTB4NzhhNiwgMHg2MDliLCAweDAwMDAsIDB4MDA3OCwgMHgxOTdkLCAweDc4YTMsIDB4MDAwMCwgMHg3OGE3LAorCTB4MDAwMCwgMHgwMDdjLCAweDc5NzAsIDB4Nzg3NCwgMHg4MDAwLCAweGExMGEsIDB4MDBjOCwgMHgxOTk5LAorCTB4YTAwNiwgMHg3ODc2LCAweDcwZDIsIDB4NzgwNCwgMHhhMDA1LCAweDAwNDAsIDB4MTlhNywgMHg4MDAxLAorCTB4NzgwNiwgMHgwMGMwLCAweDE5YTcsIDB4MDA2OCwgMHgxOWE3LCAweDIwOTEsIDB4NDA4MCwgMHgwMDdjLAorCTB4MDA2OCwgMHgxOWMyLCAweDIwMjksIDB4MDAwMCwgMHg3ODZjLCAweGEwNjUsIDB4MDA0MCwgMHgxOWJkLAorCTB4MTA3OCwgMHgxOWMzLCAweDAwNDAsIDB4MTliZCwgMHgwNTdlLCAweDEwNzgsIDB4MTlkOSwgMHgwNTdmLAorCTB4MDBjMCwgMHgxOWJkLCAweDg1MjgsIDB4MDA3OCwgMHgxOWFjLCAweDg1ZmYsIDB4MDA0MCwgMHgxOWMyLAorCTB4MjA5MSwgMHg0MDgwLCAweDAwN2MsIDB4N2I4NCwgMHg3OTg4LCAweDcyZDQsIDB4MDAwNSwgMHgwMDA1LAorCTB4NzBkNCwgMHhhMjA2LCAweDAwYzAsIDB4MTljNSwgMHgyMjAwLCAweGExMDIsIDB4MDBjMCwgMHgxOWQzLAorCTB4MjMwMCwgMHhhMDA1LCAweDAwN2MsIDB4MDA0OCwgMHgxOWQ3LCAweGEzMDIsIDB4MDA3YywgMHg4MDAyLAorCTB4MDA3YywgMHgxMDc4LCAweDFhMGIsIDB4MjAwOSwgMHgwMDFjLCAweDYwMjQsIDB4YTAwNSwgMHgwMDQwLAorCTB4MTllMywgMHgyMDA5LCAweDAwNDAsIDB4MTA3OCwgMHgxNjExLCAweDAwNDAsIDB4MTlmYywgMHg3ODk0LAorCTB4ODAwMCwgMHg3ODk2LCAweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDFhMGEsIDB4MjA5MSwgMHg4MDAwLAorCTB4NzhhZiwgMHgwMDAzLCAweDc4OTcsIDB4MDAwMCwgMHg3ODk4LCAweGEwODUsIDB4MDMwMCwgMHg3ODlhLAorCTB4MjA5MSwgMHg4MDAxLCAweDAwNzgsIDB4MWEwYSwgMHg3ODk3LCAweDAwMDAsIDB4MTA3OCwgMHgxN2YzLAorCTB4Nzk4NCwgMHg3ODg4LCAweDgwMDAsIDB4YTEwYSwgMHgwMGM4LCAweDFhMDcsIDB4YTAwNiwgMHg3ODhhLAorCTB4NzBkNiwgMHhhMDA2LCAweDAwN2MsIDB4ODEwNywgMHg4MDA0LCAweDgwMDQsIDB4N2E5MCwgMHg3YjhjLAorCTB4YTIxMCwgMHhhMzk5LCAweDAwMDAsIDB4MDA3YywgMHgyMDA5LCAweDM1NjgsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjAwYSwgMHgwZjdlLCAweDIwNzksIDB4MDEwMCwgMHgyMDA5LCAweDM1NDAsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjEwNCwgMHhhMDg2LCAweDAwMDAsIDB4MDBjMCwgMHgxYTM0LCAweDIwMDksIDB4MzUxMiwgMHgyMTA0LAorCTB4YTAwNSwgMHgwMGMwLCAweDFhMzQsIDB4NzgzMCwgMHhhMDg0LCAweDAwYzAsIDB4MDBjMCwgMHgxYTM0LAorCTB4MDAxOCwgMHgxYTM0LCAweDc4MWIsIDB4MDA0NCwgMHgyMDkxLCAweDgwMDEsIDB4MGY3ZiwgMHgwMDdjLAorCTB4MTI3ZSwgMHgyMDkxLCAweDIzMDAsIDB4MjA3MSwgMHgzNTQwLCAweDIwNzksIDB4MDEwMCwgMHgyMDE5LAorCTB4MmRkOCwgMHgyMGExLCAweDAxMmIsIDB4MjMwNCwgMHhhMDA1LCAweDAwNDAsIDB4MWE1MCwgMHg3ODlhLAorCTB4ODMxOCwgMHgyM2FjLCAweDgzMTgsIDB4MjM5OCwgMHg1M2E2LCAweDMzMTgsIDB4MDA3OCwgMHgxYTQzLAorCTB4Nzg5YiwgMHgwMDIwLCAweDIwYTksIDB4MDAxMCwgMHg3OGFmLCAweDAwMDAsIDB4NzhhZiwgMHgwMjIwLAorCTB4MDA3MCwgMHgxYTVjLCAweDAwNzgsIDB4MWE1NCwgMHg3MDAzLCAweDAwMDAsIDB4MTA3OCwgMHgxYjViLAorCTB4NzAwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4NSwgMHg2MjgwLCAweDc4MDYsIDB4NzgwZiwgMHg5MjAwLAorCTB4Nzg0MywgMHgwMGQ4LCAweDc4NTMsIDB4MDA4MCwgMHg3ODBiLCAweDAwMzgsIDB4NzA0NywgMHgzNTdmLAorCTB4NzA0MywgMHgwMDAwLCAweDEyN2YsIDB4MjAwMCwgMHgwMDdjLCAweGExOGMsIDB4MDAwZiwgMHgyMDExLAorCTB4MDEwMSwgMHgyMjA0LCAweGEwODQsIDB4ZmZmMCwgMHhhMTA1LCAweDIwMTIsIDB4MTA3OCwgMHgxYjViLAorCTB4MDA3YywgMHgyMDExLCAweDAxMDEsIDB4MjBhOSwgMHgwMDA5LCAweDgxMGIsIDB4MDA3MCwgMHgxYThhLAorCTB4MDA3OCwgMHgxYTg1LCAweGExOGMsIDB4MGUwMCwgMHgyMjA0LCAweGEwODQsIDB4ZjFmZiwgMHhhMTA1LAorCTB4MjAxMiwgMHgwMDdjLCAweDIwMDksIDB4MDEwMSwgMHgyMGE5LCAweDAwMDUsIDB4ODIxMywgMHgwMDcwLAorCTB4MWE5YiwgMHgwMDc4LCAweDFhOTYsIDB4YTI5NCwgMHgwMGUwLCAweDIxMDQsIDB4YTA4NCwgMHhmZjFmLAorCTB4YTIwNSwgMHgyMDBhLCAweDAwN2MsIDB4MjAxMSwgMHgwMTAxLCAweDIwYTksIDB4MDAwYywgMHg4MTBiLAorCTB4MDA3MCwgMHgxYWFjLCAweDAwNzgsIDB4MWFhNywgMHhhMThjLCAweGYwMDAsIDB4MjIwNCwgMHhhMDg0LAorCTB4MGZmZiwgMHhhMTA1LCAweDIwMTIsIDB4MDA3YywgMHgyMDExLCAweDAxMDIsIDB4MjIwNCwgMHhhMDg0LAorCTB4ZmZjZiwgMHhhMTA1LCAweDIwMTIsIDB4MDA3YywgMHg4MTAzLCAweDgwMDMsIDB4YTA4MCwgMHgwMDIwLAorCTB4MGM3ZSwgMHgyMDYxLCAweDAxMDAsIDB4NjA5YSwgMHg2MmFjLCAweDYzYWMsIDB4MGM3ZiwgMHgwMDdjLAorCTB4ODEwMywgMHg4MDAzLCAweGEwODAsIDB4MDAyMiwgMHgwYzdlLCAweDIwNjEsIDB4MDEwMCwgMHg2MDlhLAorCTB4NjBhNCwgMHhhMDg0LCAweGZmZGYsIDB4NjBhZSwgMHgwYzdmLCAweDAwN2MsIDB4ODEwMywgMHg4MDAzLAorCTB4YTA4MCwgMHgwMDIyLCAweDBjN2UsIDB4MjA2MSwgMHgwMTAwLCAweDYwOWEsIDB4NjBhNCwgMHhhMDg1LAorCTB4MDAyMCwgMHg2MGFlLCAweDBjN2YsIDB4MDA3YywgMHg4MTAzLCAweDgwMDMsIDB4YTA4MCwgMHgwMDIwLAorCTB4MGM3ZSwgMHgyMDYxLCAweDAxMDAsIDB4NjA5YSwgMHg2MGE0LCAweDYyYWUsIDB4MjAxMCwgMHg2MGE0LAorCTB4NjNhZSwgMHgyMDE4LCAweDBjN2YsIDB4MDA3YywgMHgyMDkxLCAweDgwMDAsIDB4MGM3ZSwgMHgwZTdlLAorCTB4NjgxOCwgMHhhMDA1LCAweDAwNDAsIDB4MWIzOSwgMHgyMDYxLCAweDNmODAsIDB4MTA3OCwgMHgxYjQxLAorCTB4MDA0MCwgMHgxYjI3LCAweDIwYTksIDB4MDAwMCwgMHgyMDYxLCAweDNlODAsIDB4MGM3ZSwgMHgxMDc4LAorCTB4MWI0MSwgMHgwMDQwLCAweDFiMTMsIDB4MGM3ZiwgMHg4YzYwLCAweDAwNzAsIDB4MWIxMSwgMHgwMDc4LAorCTB4MWIwNiwgMHgwMDc4LCAweDFiMzksIDB4MDA3ZiwgMHhhMDgyLCAweDNlODAsIDB4MjA3MSwgMHgzNTQwLAorCTB4NzBiYSwgMHg2MDFjLCAweGEwODUsIDB4MDgwMCwgMHg2MDFlLCAweDcxYjYsIDB4NjBhNywgMHgwMDAwLAorCTB4MjAwMSwgMHgwMDA0LCAweDcwYTIsIDB4MTA3OCwgMHgxYTE0LCAweDAwNzgsIDB4MWIzNSwgMHgyMDcxLAorCTB4MzU0MCwgMHg2MDFjLCAweGEwODUsIDB4MDgwMCwgMHg2MDFlLCAweDcxYjYsIDB4NjBhNywgMHgwMDAwLAorCTB4MjAwMSwgMHgwMDA2LCAweDcwYTIsIDB4MTA3OCwgMHgxYTE0LCAweDIwMDEsIDB4MDAwMCwgMHgwMDc4LAorCTB4MWIzYiwgMHgyMDAxLCAweDAwMDEsIDB4MjA5MSwgMHg4MDAxLCAweGEwMDUsIDB4MGU3ZiwgMHgwYzdmLAorCTB4MDA3YywgMHgyYzA0LCAweGEwMDUsIDB4MDA0MCwgMHgxYjU4LCAweDIwNjAsIDB4NjAwYywgMHhhMzA2LAorCTB4MDBjMCwgMHgxYjU1LCAweDYwMDgsIDB4YTIwNiwgMHgwMGMwLCAweDFiNTUsIDB4NjAxMCwgMHhhMTA2LAorCTB4MDBjMCwgMHgxYjU1LCAweGEwMDYsIDB4MDA3OCwgMHgxYjVhLCAweDYwMDAsIDB4MDA3OCwgMHgxYjQyLAorCTB4YTA4NSwgMHgwMDAxLCAweDAwN2MsIDB4MjAxMSwgMHgzNTQxLCAweDIyMGMsIDB4YTE4YywgMHgwMDBmLAorCTB4MjAxMSwgMHgwMTNiLCAweDIyMDQsIDB4YTA4NCwgMHgwMTAwLCAweDAwNDAsIDB4MWI2YSwgMHgyMDIxLAorCTB4ZmY4MCwgMHgyMTIyLCAweDAwN2MsIDB4MGU3ZSwgMHg2OGU0LCAweGEwOGMsIDB4MDAyMCwgMHgwMDQwLAorCTB4MWJhMywgMHhhMDg0LCAweDAwMDYsIDB4MDBjMCwgMHgxYmEzLCAweDYwMTAsIDB4ODAwNywgMHhhMDg0LAorCTB4MDAwZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMGYwLCAweDM2MDAsIDB4NzAwNCwgMHhhMDg0LAorCTB4MDAwYSwgMHgwMGMwLCAweDFiYTMsIDB4NzEwOCwgMHhhMTk0LCAweGZmMDAsIDB4MDA0MCwgMHgxYmEzLAorCTB4YTE4YywgMHgwMGZmLCAweDIwMDEsIDB4MDAxOSwgMHhhMTA2LCAweDAwNDAsIDB4MWI5NiwgMHgyMDAxLAorCTB4MDAzMiwgMHhhMTA2LCAweDAwNDAsIDB4MWI5YSwgMHgwMDc4LCAweDFiOWUsIDB4MjAwOSwgMHgwMDIwLAorCTB4MDA3OCwgMHgxYmEwLCAweDIwMDksIDB4MDAzZiwgMHgwMDc4LCAweDFiYTAsIDB4MjAxMSwgMHgwMDAwLAorCTB4MjEwMCwgMHhhMjA1LCAweDcwMGEsIDB4MGU3ZiwgMHgwMDdjLCAweDAwNjgsIDB4MWJhNSwgMHgwMDdlLAorCTB4MjA3MSwgMHgwMDAwLCAweDcwMTgsIDB4YTA4NCwgMHgwMDAxLCAweDAwYzAsIDB4MWJhYSwgMHgwMDdmLAorCTB4MmUwOCwgMHgyMDcxLCAweDAwMTAsIDB4NzBjYSwgMHgwMDdmLCAweDcwYzYsIDB4NzBjMywgMHg4MDAyLAorCTB4MjA3MSwgMHgwMDAwLCAweDcwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MDA3ZiwgMHgyMDcwLAorCTB4MDA3ZiwgMHgwMDc4LCAweDFiYzEsIDB4MTA3ZSwgMHgwMDdlLCAweDEyN2UsIDB4MjA5MSwgMHgyMzAwLAorCTB4N2YzYywgMHg3ZTU4LCAweDdjMzAsIDB4N2QzOCwgMHhhNTk0LCAweDAwM2YsIDB4YTQ4NCwgMHg0MDAwLAorCTB4MDA0MCwgMHgxYmQ4LCAweGE3ODQsIDB4MDA3YywgMHgwMGMwLCAweDJkOWMsIDB4MTA3OCwgMHgxYmE1LAorCTB4YTQ5YywgMHgwMDBmLCAweGEzODIsIDB4MDAwNCwgMHgwMDUwLCAweDFiZTAsIDB4MTA3OCwgMHgxYmE1LAorCTB4ODUwNywgMHhhMDg0LCAweDAwMGYsIDB4MDA3OSwgMHgxYmU1LCAweDFmZWEsIDB4MjA5YSwgMHgyMGMwLAorCTB4MjJlNiwgMHgyNTZiLCAweDI1YjMsIDB4MjVlYSwgMHgyNjY1LCAweDI2YmYsIDB4Mjc0NCwgMHgxYzBiLAorCTB4MWJmNSwgMHgxZTUzLCAweDFmMWQsIDB4MjU0YSwgMHgxYmY1LCAweDEwNzgsIDB4MWJhNSwgMHgwMDE4LAorCTB4MWJjOCwgMHgxMjdmLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdmLCAweDEwN2YsIDB4MDA3YywgMHg3MDAzLAorCTB4MDAwMCwgMHg3MDNmLCAweDAwMDAsIDB4NzAzMCwgMHhhMDA1LCAweDAwNDAsIDB4MWMwOSwgMHg3MDMzLAorCTB4MDAwMCwgMHgwMDE4LCAweDFiYzgsIDB4NzA1YywgMHhhMDA1LCAweDAwYzAsIDB4MWNiNiwgMHg3MGEwLAorCTB4YTA4NCwgMHgwMDA3LCAweDAwNzksIDB4MWMxNCwgMHgxY2Q2LCAweDFjMWMsIDB4MWMyYSwgMHgxYzRiLAorCTB4MWM3MSwgMHgxYzlkLCAweDFjOWIsIDB4MWMxYywgMHg3ODA4LCAweGEwODQsIDB4ZmZmZCwgMHg3ODBhLAorCTB4MjAwOSwgMHgwMDQ2LCAweDEwNzgsIDB4MjQxMiwgMHgwMGMwLCAweDFjMjgsIDB4NzAwMywgMHgwMDA0LAorCTB4MDA3OCwgMHgxYmY3LCAweDEwNzgsIDB4MmQ1ZSwgMHgwMGMwLCAweDFjNDksIDB4NzBiNCwgMHg4MDA3LAorCTB4Nzg5YiwgMHgwMDdlLCAweDc4YWEsIDB4Nzg5YiwgMHgwMDEwLCAweDc4YWIsIDB4MDAwYywgMHg3ODliLAorCTB4MDA2MCwgMHg3OGFiLCAweDAwMDEsIDB4Nzg1YiwgMHgwMDA0LCAweDIwMDksIDB4MDBmNywgMHgxMDc4LAorCTB4MjQxMCwgMHgwMGMwLCAweDFjNDksIDB4NzAwMywgMHgwMDA0LCAweDcwYzMsIDB4MDAwZiwgMHg3MDMzLAorCTB4MzU3MCwgMHgwMDc4LCAweDFiZjcsIDB4MTA3OCwgMHgyZDVlLCAweDAwYzAsIDB4MWM2ZiwgMHg3MWI0LAorCTB4ODEwNywgMHg3ODliLCAweDAwN2UsIDB4NzhhYSwgMHg3ODliLCAweDAwMTAsIDB4YTE4YywgMHgwMDA3LAorCTB4YTE4ZCwgMHgwMGMwLCAweDc5YWEsIDB4NzhhYiwgMHgwMDA2LCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLAorCTB4MDAwMiwgMHg3ODViLCAweDAwMDQsIDB4MjAwOSwgMHgwMGY3LCAweDEwNzgsIDB4MjQxMCwgMHgwMGMwLAorCTB4MWM2ZiwgMHg3MDAzLCAweDAwMDQsIDB4NzBjMywgMHgwMDBmLCAweDcwMzMsIDB4MzU3MCwgMHgwMDc4LAorCTB4MWJmNywgMHgxMDc4LCAweDJkNWUsIDB4MDBjMCwgMHgxYzk5LCAweDcxYjQsIDB4ODEwNywgMHg3ODliLAorCTB4MDA3ZSwgMHg3OGFhLCAweDc4OWIsIDB4MDAxMCwgMHhhMThjLCAweDAwMDcsIDB4YTE4ZCwgMHgwMGMwLAorCTB4NzlhYSwgMHg3OGFiLCAweDAwMjAsIDB4NzFiOCwgMHg3OWFhLCAweDc4YWIsIDB4MDAwZCwgMHg3ODliLAorCTB4MDA2MCwgMHg3OGFiLCAweDAwMDQsIDB4Nzg1YiwgMHgwMDA0LCAweDIwMDksIDB4MDBmNywgMHgxMDc4LAorCTB4MjQxMCwgMHgwMGMwLCAweDFjOTksIDB4NzAwMywgMHgwMDA0LCAweDcwYzMsIDB4MDAwZiwgMHg3MDMzLAorCTB4MzU3MCwgMHgwMDc4LCAweDFiZjcsIDB4MDA3OCwgMHgxYzRiLCAweDEwNzgsIDB4MmQ1ZSwgMHgwMGMwLAorCTB4MWJmNywgMHg3MGJjLCAweDIwNjgsIDB4Nzg5YiwgMHgwMDEwLCAweDZmMTAsIDB4MTA3OCwgMHgyY2ExLAorCTB4MmM1MCwgMHg2ODEwLCAweGEwODQsIDB4MDAwNywgMHhhMDg1LCAweDAwODAsIDB4NzhhYSwgMHg2ZTE4LAorCTB4MjA0MSwgMHgwMDAxLCAweDIwMDEsIDB4MDAwNCwgMHgwMDc4LCAweDFkZGUsIDB4MTA3OCwgMHgyZDVlLAorCTB4MDBjMCwgMHgxYmY3LCAweDc4OWIsIDB4MDAxMCwgMHg3MDVjLCAweDIwNjgsIDB4NmYxMCwgMHgxMDc4LAorCTB4MmNhMSwgMHgyYzUwLCAweDYwMDgsIDB4YTA4NSwgMHgwMDEwLCAweDYwMGEsIDB4NjgxMCwgMHhhMDg0LAorCTB4MDAwNywgMHhhMDg1LCAweDAwODAsIDB4NzhhYSwgMHgyMDMxLCAweDAwMjAsIDB4MjA0MSwgMHgwMDAxLAorCTB4MTA3OCwgMHgyZGM1LCAweDIwMDEsIDB4MDAwMywgMHgwMDc4LCAweDFkYzksIDB4MDAxOCwgMHgxYmM4LAorCTB4NzQ0MCwgMHhhNDg1LCAweDAwMDAsIDB4MDA0MCwgMHgxY2YwLCAweGEwODAsIDB4MzU4MCwgMHgyMDMwLAorCTB4NzE0NCwgMHg4MTA4LCAweGExMmEsIDB4MDA0OCwgMHgxY2U3LCAweDIwMDksIDB4MzU4MCwgMHgyMTY0LAorCTB4NjUwNCwgMHg4NWZmLCAweDAwYzAsIDB4MWNmZCwgMHg4NDIxLCAweDAwYzAsIDB4MWNlMSwgMHg3MTQ2LAorCTB4NzAwMywgMHgwMDAwLCAweDcwM2YsIDB4MDAwMCwgMHgwMDc4LCAweDFiZjcsIDB4NzY0MCwgMHhhNmIwLAorCTB4MzU4MCwgMHg3MTQ0LCAweDI2MDAsIDB4MDA3OCwgMHgxY2VjLCAweDcxNDYsIDB4MjU2OCwgMHgyNTU4LAorCTB4NzUzZSwgMHgyYzUwLCAweDYwMzQsIDB4YTA4NSwgMHgwMDAwLCAweDAwYzAsIDB4MWNmYSwgMHg2NzA4LAorCTB4NzczNiwgMHhhNzg0LCAweDAxM2YsIDB4MDA0MCwgMHgxZDJmLCAweGE3ODQsIDB4MDAyMSwgMHgwMGMwLAorCTB4MWNmYSwgMHhhNzg0LCAweDAwMDIsIDB4MDA0MCwgMHgxZDFjLCAweGE3ODQsIDB4MDAwNCwgMHgwMDQwLAorCTB4MWNmYSwgMHhhN2JjLCAweGZmZmIsIDB4NjcwYSwgMHhhNzg0LCAweDAwMDgsIDB4MDBjMCwgMHgxY2ZhLAorCTB4YTc4NCwgMHgwMDEwLCAweDAwYzAsIDB4MWNmYSwgMHhhNzg0LCAweDAxMDAsIDB4MDA0MCwgMHgxZDJmLAorCTB4NjAxOCwgMHhhMDA1LCAweDAwYzAsIDB4MWNmYSwgMHhhN2JjLCAweGZlZmYsIDB4NjcwYSwgMHg2ODFmLAorCTB4MDAwMCwgMHg2ZTE4LCAweGE2ODQsIDB4MDAwZSwgMHg2MTE4LCAweDAwNDAsIDB4MWQzZiwgMHg2MDFjLAorCTB4YTEwMiwgMHgwMDQ4LCAweDFkNDIsIDB4MDA0MCwgMHgxZDQyLCAweDAwNzgsIDB4MWNmNiwgMHg4MWZmLAorCTB4MDBjMCwgMHgxY2Y2LCAweGE3ODQsIDB4MDA4MCwgMHgwMGMwLCAweDFkNDgsIDB4NzAwYywgMHg2MDIyLAorCTB4YTdiYywgMHhmZjdmLCAweDY3MGEsIDB4NmIxMCwgMHg4MzA3LCAweGEwODQsIDB4MDAwZiwgMHg4MDAzLAorCTB4ODAwMywgMHg4MDAzLCAweGEwODAsIDB4MzYwMCwgMHgyMDYwLCAweDIwNDgsIDB4NzA0YSwgMHg2MDAwLAorCTB4NzA0ZSwgMHg2MDA0LCAweDcwNTIsIDB4MmE2MCwgMHgwMDE4LCAweDFiYzgsIDB4Nzg5YiwgMHgwMDEwLAorCTB4YTA0NiwgMHgxMDc4LCAweDJkNWUsIDB4MDBjMCwgMHgxYmY3LCAweDZiMTAsIDB4YTM5YywgMHgwMDA3LAorCTB4YTM5ZCwgMHgwMGMwLCAweDcwNGMsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4MWQ3MywgMHhhNjg0LAorCTB4MDAwMSwgMHgwMDQwLCAweDFkNzUsIDB4YTM5YywgMHhmZmJmLCAweGE2ODQsIDB4MDAxMCwgMHgwMDQwLAorCTB4MWQ3YiwgMHhhMzlkLCAweDAwMjAsIDB4N2JhYSwgMHg4ODQwLCAweGE2ODQsIDB4MDAwZSwgMHgwMGMwLAorCTB4MWQ4NiwgMHhhN2JkLCAweDAwMTAsIDB4NjcwYSwgMHgwMDc4LCAweDFkYzcsIDB4NzE0YywgMHhhMThjLAorCTB4MDgwMCwgMHgwMDQwLCAweDI5MDIsIDB4MjAxMSwgMHgwMDIxLCAweDgwMDQsIDB4ODAwNCwgMHgwMDQ4LAorCTB4MWQ5ZCwgMHgyMDExLCAweDAwMjIsIDB4ODAwNCwgMHgwMDQ4LCAweDFkOWQsIDB4MjAxMSwgMHgwMDIwLAorCTB4ODAwNCwgMHgwMDQ4LCAweDFkOWQsIDB4MDA0MCwgMHgxZGM3LCAweDdhYWEsIDB4ODg0MCwgMHgxMDc4LAorCTB4MmQ3NywgMHg2YTEwLCAweDYxMGMsIDB4ODEwOCwgMHhhMThjLCAweDAwZmYsIDB4YTFlMCwgMHgzZTgwLAorCTB4MmM2NCwgMHg4Y2ZmLCAweDAwNDAsIDB4MWRiZSwgMHg2MDEwLCAweGEyMDYsIDB4MDBjMCwgMHgxZGE4LAorCTB4NjBiNCwgMHg4MDAxLCAweDYwYjYsIDB4MDBjMCwgMHgxZGEzLCAweDBjN2UsIDB4MmE2MCwgMHg2MDA4LAorCTB4YTA4NSwgMHgwMTAwLCAweDYwMGEsIDB4MGM3ZiwgMHgwMDc4LCAweDFjZDYsIDB4MTA3OCwgMHgyZDVlLAorCTB4MDBjMCwgMHgxYmY3LCAweDJhNjAsIDB4NjEwZSwgMHg3OWFhLCAweDg4NDAsIDB4NzEyZSwgMHgyMDAxLAorCTB4MDAwMSwgMHgwMDdlLCAweDcxNTAsIDB4YTE4NCwgMHgwMDE4LCAweDAwNDAsIDB4MWRkZCwgMHhhMTg0LAorCTB4MDAxMCwgMHgwMDQwLCAweDFkZDcsIDB4MTA3OCwgMHgyYWNjLCAweDAwYzAsIDB4MWRkZCwgMHhhMTg0LAorCTB4MDAwOCwgMHgwMDQwLCAweDFkZGQsIDB4MTA3OCwgMHgyOWU2LCAweDAwN2YsIDB4NzAwMiwgMHhhNjhjLAorCTB4MDA2MCwgMHg4OGZmLCAweDAwNDAsIDB4MWRlNiwgMHhhMThkLCAweDAwMDQsIDB4Nzk1YSwgMHg2OWIyLAorCTB4Nzg5YiwgMHgwMDYwLCAweDI4MDAsIDB4NzhhYSwgMHg3ODliLCAweDAwNjEsIDB4NjgxNCwgMHhhMDg1LAorCTB4ODAwMCwgMHg2ODE2LCAweDc4YWEsIDB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4MjBhMSwgMHgwMTJjLAorCTB4Nzg5YiwgMHgwMDAwLCAweDgwMDAsIDB4ODBhYywgMHhhZDgwLCAweDAwMGEsIDB4MjA5OCwgMHg1M2E2LAorCTB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsIDB4NjgxMCwgMHg4MDA3LCAweDc4OWIsIDB4MDA3ZSwgMHg3OGFhLAorCTB4NmQ5MCwgMHg3ZGQ2LCAweDdkZGUsIDB4NmU5NCwgMHg3ZWQyLCAweDdlZGEsIDB4NzgzMCwgMHhhMDg0LAorCTB4MDBjMCwgMHgwMGMwLCAweDFlMTUsIDB4MDA5OCwgMHgxZTFkLCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLAorCTB4NjAwYSwgMHgxMDc4LCAweDJkNzcsIDB4MDA3OCwgMHgxYmZmLCAweDcyMDAsIDB4YTI4NCwgMHgwMDA3LAorCTB4YTA4NiwgMHgwMDAxLCAweDAwYzAsIDB4MWUyYSwgMHg3ODFiLCAweDAwNDksIDB4MTA3OCwgMHgyZDc3LAorCTB4MDA3OCwgMHgxZTNiLCAweDZhYjAsIDB4YTI5NSwgMHgyMDAwLCAweDdhNWEsIDB4NzgxYiwgMHgwMDQ5LAorCTB4MTA3OCwgMHgyZDc3LCAweDcyMDAsIDB4MjUwMCwgMHhhNjA1LCAweDAwNDAsIDB4MWUzYiwgMHhhMjg0LAorCTB4MDAwNywgMHgxMDc5LCAweDFlNDksIDB4YWQ4MCwgMHgwMDA4LCAweDcwMzIsIDB4YTI4NCwgMHgwMDA3LAorCTB4YTA4NiwgMHgwMDAxLCAweDAwYzAsIDB4MWU0NywgMHg2MDE4LCAweDgwMDAsIDB4NjAxYSwgMHgwMDc4LAorCTB4MWJmNywgMHgxZTUxLCAweDMwZjAsIDB4MzBmMCwgMHgzMGRmLCAweDMwZjAsIDB4MWU1MSwgMHgxZTUxLAorCTB4MWU1MSwgMHgxMDc4LCAweDFiYTUsIDB4NzgwOCwgMHhhMDg0LCAweGZmZmQsIDB4NzgwYSwgMHgwZjdlLAorCTB4MjA3OSwgMHgzNTAwLCAweDc4OTgsIDB4MGY3ZiwgMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgxZTc5LAorCTB4NzBhMCwgMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHgxZTY4LCAweDcwYTIsIDB4MDA3OCwgMHgxZjAxLAorCTB4NzBhMCwgMHhhMDg2LCAweDAwMDUsIDB4MDBjMCwgMHgxZTc3LCAweDcwYmMsIDB4MjA2OCwgMHg2ODE3LAorCTB4MDAwNCwgMHg2ODEzLCAweDAwMDAsIDB4NjgxYywgMHhhMDg1LCAweDAwMDgsIDB4NjgxZSwgMHg3MGEzLAorCTB4MDAwMCwgMHgxNTdlLCAweDIwMTEsIDB4MDAwNCwgMHg3MWEwLCAweGExODYsIDB4MDAwMSwgMHgwMDQwLAorCTB4MWU5YiwgMHhhMTg2LCAweDAwMDcsIDB4MDBjMCwgMHgxZThiLCAweDIwMDksIDB4MzUyYiwgMHgyMDBiLAorCTB4MDAwNSwgMHgwMDc4LCAweDFlOWIsIDB4MjAwOSwgMHgzNTEzLCAweDIxMDQsIDB4MjAwOSwgMHgzNTEyLAorCTB4MjAwYSwgMHgyMDA5LCAweDM1MmIsIDB4MjAwYiwgMHgwMDAxLCAweDcwYTMsIDB4MDAwMCwgMHg3MGE3LAorCTB4MDAwMSwgMHgwMDc4LCAweDFlOWQsIDB4NzBhMywgMHgwMDAwLCAweDEwNzgsIDB4MmVjNywgMHgyMGE5LAorCTB4MDAxMCwgMHgyMDM5LCAweDAwMDAsIDB4MTA3OCwgMHgyYmE2LCAweGE3YjgsIDB4MDEwMCwgMHgwMDcwLAorCTB4MWVhYiwgMHgwMDc4LCAweDFlYTMsIDB4NzAwMCwgMHgyMDIwLCAweDAwNzksIDB4MWVhZiwgMHgxZWRkLAorCTB4MWVjNiwgMHgxZWM2LCAweDFlYjksIDB4MWVkZCwgMHgxZWRkLCAweDFlYjcsIDB4MWViNywgMHgxMDc4LAorCTB4MWJhNSwgMHgyMDIxLCAweDM1NTcsIDB4MjQwNCwgMHhhMDA1LCAweDAwNDAsIDB4MWVjNiwgMHhhZDA2LAorCTB4MDBjMCwgMHgxZWM2LCAweDY4MDAsIDB4MjAyMiwgMHgwMDc4LCAweDFlZDYsIDB4NjgxYywgMHhhMDg0LAorCTB4MDAwMSwgMHgwMGMwLCAweDFlZDIsIDB4NmYxMCwgMHgxMDc4LCAweDJjYTEsIDB4MTA3OCwgMHgyOGQ5LAorCTB4MDA3OCwgMHgxZWQ2LCAweDcwNTQsIDB4MjA2MCwgMHg2ODAwLCAweDYwMDIsIDB4NmExNiwgMHg2ODFjLAorCTB4YTA4NSwgMHgwMDA4LCAweDY4MWUsIDB4MTA3OCwgMHgxN2RkLCAweDIwMjEsIDB4M2Y4MCwgMHgxMDc4LAorCTB4MWYwNywgMHgyMDIxLCAweDM1NTcsIDB4MTA3OCwgMHgxZjA3LCAweDIwYTksIDB4MDAwMCwgMHgyMDIxLAorCTB4M2U4MCwgMHgxMDc4LCAweDFmMDcsIDB4ODQyMCwgMHgwMDcwLCAweDFlZjAsIDB4MDA3OCwgMHgxZWU5LAorCTB4MjBhOSwgMHgwMDgwLCAweDIwNjEsIDB4MzY4MCwgMHg2MDE4LCAweDYxMTAsIDB4YTEwMiwgMHg2MDEyLAorCTB4NjAxYiwgMHgwMDAwLCAweGFjZTAsIDB4MDAxMCwgMHgwMDcwLCAweDFmMDAsIDB4MDA3OCwgMHgxZWY0LAorCTB4MTU3ZiwgMHg3MDAzLCAweDAwMDAsIDB4NzAzZiwgMHgwMDAwLCAweDAwNzgsIDB4MWJmNywgMHgwNDdlLAorCTB4MjQwNCwgMHhhMDA1LCAweDAwNDAsIDB4MWYxOSwgMHgyMDY4LCAweDY4MDAsIDB4MDA3ZSwgMHg2YTE2LAorCTB4NjgxYywgMHhhMDg1LCAweDAwMDgsIDB4NjgxZSwgMHgxMDc4LCAweDE3ZGQsIDB4MDA3ZiwgMHgwMDc4LAorCTB4MWYwOSwgMHgwNDdmLCAweDIwMjMsIDB4MDAwMCwgMHgwMDdjLCAweGEyODIsIDB4MDAwMywgMHgwMDUwLAorCTB4MWYyMywgMHgxMDc4LCAweDFiYTUsIDB4MjMwMCwgMHgwMDc5LCAweDFmMjYsIDB4MWYyOSwgMHgxZjljLAorCTB4MWZhYSwgMHhhMjgyLCAweDAwMDIsIDB4MDA0MCwgMHgxZjJmLCAweDEwNzgsIDB4MWJhNSwgMHg3MGEwLAorCTB4NzBhMywgMHgwMDAwLCAweDcwYzMsIDB4MDAwMCwgMHgwMDc5LCAweDFmMzYsIDB4MWYzZSwgMHgxZjNlLAorCTB4MWY0MCwgMHgxZjc0LCAweDI5MDgsIDB4MWYzZSwgMHgxZjc0LCAweDFmM2UsIDB4MTA3OCwgMHgxYmE1LAorCTB4NzdiNCwgMHgxMDc4LCAweDJiYTYsIDB4NzdiNCwgMHhhN2JjLCAweDBmMDAsIDB4MTA3OCwgMHgyY2ExLAorCTB4NjAxOCwgMHhhMDA1LCAweDAwNDAsIDB4MWY2YiwgMHgyMDIxLCAweDNmODAsIDB4MjAwOSwgMHgwMDA0LAorCTB4MjAxMSwgMHgwMDEwLCAweDEwNzgsIDB4MWZjNSwgMHgwMDQwLCAweDFmNmIsIDB4MTU3ZSwgMHgyMGE5LAorCTB4MDAwMCwgMHgyMDIxLCAweDNlODAsIDB4MDQ3ZSwgMHgyMDA5LCAweDAwMDQsIDB4MjAxMSwgMHgwMDEwLAorCTB4MTA3OCwgMHgxZmM1LCAweDA0N2YsIDB4MDA0MCwgMHgxZjZhLCAweDg0MjAsIDB4MDA3MCwgMHgxZjZhLAorCTB4MDA3OCwgMHgxZjViLCAweDE1N2YsIDB4ODczOCwgMHhhNzg0LCAweDAwMDcsIDB4MDBjMCwgMHgxZjQ2LAorCTB4MDA3OCwgMHgxYmZmLCAweDAwNzgsIDB4MWJmZiwgMHg3N2I0LCAweDEwNzgsIDB4MmNhMSwgMHg2MDE4LAorCTB4YTAwNSwgMHgwMDQwLCAweDFmOWEsIDB4MjAyMSwgMHgzZjgwLCAweDIwMDksIDB4MDAwNSwgMHgyMDExLAorCTB4MDAyMCwgMHgxMDc4LCAweDFmYzUsIDB4MDA0MCwgMHgxZjlhLCAweDE1N2UsIDB4MjBhOSwgMHgwMDAwLAorCTB4MjAyMSwgMHgzZTgwLCAweDA0N2UsIDB4MjAwOSwgMHgwMDA1LCAweDIwMTEsIDB4MDAyMCwgMHgxMDc4LAorCTB4MWZjNSwgMHgwNDdmLCAweDAwNDAsIDB4MWY5OSwgMHg4NDIwLCAweDAwNzAsIDB4MWY5OSwgMHgwMDc4LAorCTB4MWY4YSwgMHgxNTdmLCAweDAwNzgsIDB4MWJmZiwgMHgyMjAwLCAweDAwNzksIDB4MWY5ZiwgMHgxZmEyLAorCTB4MWZhNCwgMHgxZmE0LCAweDEwNzgsIDB4MWJhNSwgMHg3MGEzLCAweDAwMDAsIDB4NzBhNywgMHgwMDAxLAorCTB4MDA3OCwgMHgxYmY3LCAweDIyMDAsIDB4MDA3OSwgMHgxZmFkLCAweDFmYjIsIDB4MWZhNCwgMHgxZmIwLAorCTB4MTA3OCwgMHgxYmE1LCAweDEwNzgsIDB4MjQxZiwgMHg3MDAwLCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLAorCTB4MjhhZiwgMHgxMDc4LCAweDI4ZWYsIDB4NjAwOCwgMHhhMDg0LCAweGZmZWYsIDB4NjAwYSwgMHgxMDc4LAorCTB4MjhhMiwgMHgwMDQwLCAweDI4YWYsIDB4MDA3OCwgMHgxY2Q2LCAweDI0MDQsIDB4YTAwNSwgMHgwMDQwLAorCTB4MWZlNiwgMHgyMDY4LCAweDJkMDQsIDB4MDA3ZSwgMHg2ODEwLCAweGE3MDYsIDB4MDA0MCwgMHgxZmQ0LAorCTB4MmQyMCwgMHgwMDdmLCAweDAwNzgsIDB4MWZjNiwgMHgwMDdmLCAweDIwMjIsIDB4NjkxNiwgMHg2ODFjLAorCTB4YTIwNSwgMHg2ODFlLCAweDEwNzgsIDB4MTdkZCwgMHg2MDEwLCAweDgwMDEsIDB4NjAxMiwgMHg2MDA4LAorCTB4YTA4NCwgMHhmZmVmLCAweDYwMGEsIDB4MTA3OCwgMHgyOGVmLCAweDAwN2MsIDB4YTA4NSwgMHgwMDAxLAorCTB4MDA3OCwgMHgxZmU1LCAweDIzMDAsIDB4MDA3OSwgMHgxZmVkLCAweDFmZjIsIDB4MWZmMCwgMHgyMDM1LAorCTB4MTA3OCwgMHgxYmE1LCAweDc4ZTQsIDB4YTAwNSwgMHgwMGQwLCAweDIwMTUsIDB4MDAxOCwgMHgyMDE1LAorCTB4MjAwOCwgMHhhMDg0LCAweDAwMzAsIDB4MDBjMCwgMHgyMDAxLCAweDc4MWIsIDB4MDA0OSwgMHgwMDc4LAorCTB4MWJmNywgMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwMDQwLCAweDFmZmQsIDB4MjEwMCwgMHhhMDg0LAorCTB4MDAwNywgMHgwMDc5LCAweDIwMGIsIDB4MjAyMywgMHgyMDI5LCAweDIwMWQsIDB4MjAxMywgMHgyZDU4LAorCTB4MmQ1OCwgMHgyMDEzLCAweDIwMmYsIDB4MTA3OCwgMHgxYmE1LCAweDcwMDAsIDB4YTAwNSwgMHgwMDQwLAorCTB4MWJmZiwgMHgyMDAxLCAweDAwMDMsIDB4MDA3OCwgMHgyMmZhLCAweDEwNzgsIDB4MmI4OSwgMHg3ODFiLAorCTB4MDA1NSwgMHgwMDc4LCAweDFiZjcsIDB4MTA3OCwgMHgyYjg5LCAweDc4MWIsIDB4MDBkYywgMHgwMDc4LAorCTB4MWJmNywgMHgxMDc4LCAweDJiODksIDB4NzgxYiwgMHgwMGUzLCAweDAwNzgsIDB4MWJmNywgMHgxMDc4LAorCTB4MmI4OSwgMHg3ODFiLCAweDAwOWQsIDB4MDA3OCwgMHgxYmY3LCAweGE1ODQsIDB4MDAwZiwgMHgwMGMwLAorCTB4MjA1ZiwgMHgxMDc4LCAweDI0MWYsIDB4NzAwMCwgMHgwMDc5LCAweDIwM2UsIDB4MjA0NiwgMHgyMDUzLAorCTB4MjA0NiwgMHgyOGFmLCAweDIwNDgsIDB4MjhhZiwgMHgyMDQ2LCAweDIwNDYsIDB4MTA3OCwgMHgxYmE1LAorCTB4NzFhMCwgMHg3MGEzLCAweDAwMDAsIDB4YTE4NiwgMHgwMDA0LCAweDAwYzAsIDB4MjA1MSwgMHgwMDc4LAorCTB4MjkwOCwgMHgwMDc4LCAweDI4YWYsIDB4MTA3OCwgMHgyOGVmLCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLAorCTB4NjAwYSwgMHgxMDc4LCAweDI4YTIsIDB4MDA0MCwgMHgyOGFmLCAweDAwNzgsIDB4MWNkNiwgMHg3OGU0LAorCTB4YTAwNSwgMHgwMGQwLCAweDIwMTUsIDB4MDAxOCwgMHgyMDE1LCAweDIwMDgsIDB4YTA4NCwgMHgwMDMwLAorCTB4MDBjMCwgMHgyMDZlLCAweDc4MWIsIDB4MDA0OSwgMHgwMDc4LCAweDFiZjcsIDB4NzhlYywgMHhhMDg0LAorCTB4MDAwMywgMHgwMDQwLCAweDIwNmEsIDB4MjEwMCwgMHhhMTg0LCAweDAwMDcsIDB4MDA3OSwgMHgyMDc4LAorCTB4MjA4OCwgMHgyMDhlLCAweDIwODIsIDB4MjA4MCwgMHgyZDU4LCAweDJkNTgsIDB4MjA4MCwgMHgyZDUwLAorCTB4MTA3OCwgMHgxYmE1LCAweDEwNzgsIDB4MmI5MSwgMHg3ODFiLCAweDAwNTUsIDB4MDA3OCwgMHgxYmY3LAorCTB4MTA3OCwgMHgyYjkxLCAweDc4MWIsIDB4MDBkYywgMHgwMDc4LCAweDFiZjcsIDB4MTA3OCwgMHgyYjkxLAorCTB4NzgxYiwgMHgwMGUzLCAweDAwNzgsIDB4MWJmNywgMHgxMDc4LCAweDJiOTEsIDB4NzgxYiwgMHgwMDlkLAorCTB4MDA3OCwgMHgxYmY3LCAweDIzMDAsIDB4MDA3OSwgMHgyMDlkLCAweDIwYTIsIDB4MjBhMCwgMHgyMGE0LAorCTB4MTA3OCwgMHgxYmE1LCAweDAwNzgsIDB4MjY2NSwgMHg2ODE3LCAweDAwMDgsIDB4NzhhMywgMHgwMDAwLAorCTB4NzllNCwgMHhhMTg0LCAweDAwMzAsIDB4MDA0MCwgMHgyNjY1LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLAorCTB4MDA0MCwgMHgyNjY1LCAweGExODQsIDB4MDAwNywgMHgwMDc5LCAweDIwYjYsIDB4MjAyMywgMHgyMDI5LAorCTB4MjAxZCwgMHgyZDMwLCAweDJkNTgsIDB4MmQ1OCwgMHgyMGJlLCAweDJkNTAsIDB4MTA3OCwgMHgxYmE1LAorCTB4YTI4MiwgMHgwMDA1LCAweDAwNTAsIDB4MjBjNiwgMHgxMDc4LCAweDFiYTUsIDB4MjMwMCwgMHgwMDc5LAorCTB4MjBjOSwgMHgyMGNjLCAweDIyY2UsIDB4MjJkYSwgMHgyMjAwLCAweDAwNzksIDB4MjBjZiwgMHgyMGQ0LAorCTB4MjBkNiwgMHgyMGU5LCAweDIwZDQsIDB4MjJiMywgMHgxMDc4LCAweDFiYTUsIDB4Nzg5YiwgMHgwMDE4LAorCTB4NzhhOCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4MiwgMHgwMDIwLCAweDAwNDgsIDB4MmI2YSwgMHhhMDhhLAorCTB4MDAwNCwgMHgwMGM4LCAweDJiNmEsIDB4MDA3OSwgMHgyMGU1LCAweDJiNmEsIDB4MmI2YSwgMHgyYjZhLAorCTB4MmIwYywgMHg3ODliLCAweDAwMTgsIDB4NzlhOCwgMHhhMTg0LCAweDAwODAsIDB4MDA0MCwgMHgyMGZlLAorCTB4YTE4NCwgMHgwMDE4LCAweDAwNDAsIDB4MjBmYSwgMHgwMDc4LCAweDJiNmEsIDB4NzAwMCwgMHhhMDA1LAorCTB4MDBjMCwgMHgyMGY0LCAweDIwMTEsIDB4MDAwMywgMHgwMDc4LCAweDI3NTIsIDB4YTE4NCwgMHgwMGZmLAorCTB4YTA4YSwgMHgwMDEwLCAweDAwYzgsIDB4MmI2YSwgMHgwMDc5LCAweDIxMDYsIDB4MjExOCwgMHgyMTE2LAorCTB4MjEyZSwgMHgyMTMwLCAweDIxYzIsIDB4MmI2YSwgMHgyYjZhLCAweDIxYzQsIDB4MmI2YSwgMHgyYjZhLAorCTB4MjJhZiwgMHgyMmFmLCAweDJiNmEsIDB4MmI2YSwgMHgyYjZhLCAweDIyYjEsIDB4MTA3OCwgMHgxYmE1LAorCTB4YTY4NCwgMHgxMDAwLCAweDAwNDAsIDB4MjEyNSwgMHgyMDAxLCAweDAzMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4NzgzYSwgMHg3ODFiLCAweDAwOWEsIDB4MDA3OCwgMHgxYmY3LCAweDY4MTQsIDB4YTA4NCwgMHg4MDAwLAorCTB4MDA0MCwgMHgyMTJjLCAweDY4MTcsIDB4MDAwMywgMHgwMDc4LCAweDJkMzAsIDB4MTA3OCwgMHgxYmE1LAorCTB4NjkxYywgMHg2OTFlLCAweGE2ODQsIDB4MTgwMCwgMHgwMGMwLCAweDIxNGEsIDB4NjgxYywgMHhhMDg0LAorCTB4MDAwMSwgMHgwMGMwLCAweDIxNTIsIDB4NjgxNCwgMHhhMDg2LCAweDAwMDgsIDB4MDBjMCwgMHgyMTQyLAorCTB4NjgxNywgMHgwMDAwLCAweGE2ODQsIDB4MDQwMCwgMHgwMDQwLCAweDIxYmUsIDB4NzgxYiwgMHgwMDU4LAorCTB4MDA3OCwgMHgxYmY3LCAweGE2ODQsIDB4MTAwMCwgMHgwMDQwLCAweDIxNTIsIDB4NzgxYiwgMHgwMDU4LAorCTB4MDA3OCwgMHgxYmY3LCAweGE2ODQsIDB4MDA2MCwgMHgwMDQwLCAweDIxYmEsIDB4YTY4NCwgMHgwODAwLAorCTB4MDA0MCwgMHgyMWJhLCAweGE2ODQsIDB4ODAwMCwgMHgwMGMwLCAweDIxNjAsIDB4MDA3OCwgMHgyMTdhLAorCTB4YTZiNCwgMHg3ZmZmLCAweDdlNWEsIDB4NmViMiwgMHg3ODliLCAweDAwNzQsIDB4N2FhYywgMHg3OWFjLAorCTB4NzhhYywgMHg4MDFiLCAweDAwYzgsIDB4MjE2ZCwgMHg4MDAwLCAweGEwODQsIDB4MDAzZiwgMHhhMTA4LAorCTB4YTI5MSwgMHgwMDAwLCAweDZiOTQsIDB4MjEwMCwgMHhhMzAyLCAweDY4YWUsIDB4NmI5MCwgMHgyMjAwLAorCTB4YTMwMywgMHg2OGFhLCAweGE2ODQsIDB4NDAwMCwgMHgwMDQwLCAweDIxODIsIDB4YTZiNCwgMHhiZmZmLAorCTB4N2U1YSwgMHg2ZWIyLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsIDB4MjE4ZiwgMHgxMDc4LAorCTB4MmYzYSwgMHgxMDc4LCAweDMwZGYsIDB4NzgxYiwgMHgwMDY3LCAweDAwNzgsIDB4MWJmNywgMHhhMDA2LAorCTB4MTA3OCwgMHgzMTk0LCAweDZhYWMsIDB4NjlhOCwgMHg2Yzk0LCAweDZiOTAsIDB4MjIwMCwgMHhhMTA1LAorCTB4MDA0MCwgMHgyMTllLCAweDIyMDAsIDB4YTQyMiwgMHgyMTAwLCAweGEzMWIsIDB4N2NkMiwgMHg3YmQ2LAorCTB4MjMwMCwgMHhhNDA1LCAweDAwYzAsIDB4MjFhYywgMHhhNmI1LCAweDQwMDAsIDB4N2U1YSwgMHg2ZWIyLAorCTB4NzgxYiwgMHgwMDY3LCAweDAwNzgsIDB4MWJmNywgMHg3ODFiLCAweDAwNjcsIDB4MjIwMCwgMHhhMTE1LAorCTB4MDBjMCwgMHgyMWI2LCAweDEwNzgsIDB4MzBmMCwgMHgwMDc4LCAweDFiZjcsIDB4MTA3OCwgMHgzMTFkLAorCTB4MDA3OCwgMHgxYmY3LCAweDc4MWIsIDB4MDA2YSwgMHgwMDc4LCAweDFiZjcsIDB4NzgxYiwgMHgwMDU4LAorCTB4MDA3OCwgMHgxYmY3LCAweDEwNzgsIDB4MWJhNSwgMHgwMDc4LCAweDIyMjEsIDB4NjkxYywgMHhhMTg0LAorCTB4MDEwMCwgMHgwMDQwLCAweDIxZGMsIDB4YTE4YywgMHhmZWZmLCAweDY5MWUsIDB4MGM3ZSwgMHg3MDQ4LAorCTB4MjA2MCwgMHg2MDAwLCAweGEwODQsIDB4ZWZmZiwgMHg2MDAyLCAweDYwMDQsIDB4YTA4NCwgMHhmZmY1LAorCTB4NjAwNiwgMHgwYzdmLCAweDAwNzgsIDB4MjIxMCwgMHhhMTg0LCAweDAyMDAsIDB4MDA0MCwgMHgyMjEwLAorCTB4YTE4YywgMHhmZGZmLCAweDY5MWUsIDB4MGM3ZSwgMHg3MDQ4LCAweDIwNjAsIDB4NjAwMCwgMHhhMDg0LAorCTB4ZGZmZiwgMHg2MDAyLCAweDYwMDQsIDB4YTA4NCwgMHhmZmVmLCAweDYwMDYsIDB4MjAwOCwgMHgyYzQ4LAorCTB4MGM3ZiwgMHhhMTg0LCAweDAwMDgsIDB4MDA0MCwgMHgyMjEwLCAweDEwNzgsIDB4MmM5ZCwgMHgxMDc4LAorCTB4MjllNiwgMHg4OGZmLCAweDAwNDAsIDB4MjIxMCwgMHg3ODliLCAweDAwNjAsIDB4MjgwMCwgMHg3OGFhLAorCTB4N2U1OCwgMHhhNmI1LCAweDAwMDQsIDB4N2U1YSwgMHhhNjg0LCAweDA0MDAsIDB4MDBjMCwgMHgyMjBjLAorCTB4NzgxYiwgMHgwMDU1LCAweDAwNzgsIDB4MWJmNywgMHg3ODFiLCAweDAwNjksIDB4MDA3OCwgMHgxYmY3LAorCTB4N2U1OCwgMHhhNjg0LCAweDA0MDAsIDB4MDBjMCwgMHgyMjE5LCAweDc4MWIsIDB4MDA1OCwgMHgwMDc4LAorCTB4MWJmNywgMHg3ODFiLCAweDAwNmEsIDB4MDA3OCwgMHgxYmY3LCAweDAwNzgsIDB4MmI3MCwgMHgwMDc4LAorCTB4MmI3MCwgMHgyMDE5LCAweDAwMDAsIDB4Nzk5MCwgMHhhMThjLCAweDAwMDcsIDB4MDA0MCwgMHgyMjFmLAorCTB4Nzg5YiwgMHgwMDEwLCAweDc4YTgsIDB4YTA5NCwgMHgwMGZmLCAweGEyODYsIDB4MDAwMSwgMHgwMGMwLAorCTB4MjI0NCwgMHgyMzAwLCAweDdjYTgsIDB4YTQwMCwgMHgyMDE4LCAweGExMDIsIDB4MDA0MCwgMHgyMjNjLAorCTB4MDA0OCwgMHgyMjNjLCAweDAwNzgsIDB4MjIzZSwgMHgwMDc4LCAweDIxYzYsIDB4MjRhOCwgMHg3YWE4LAorCTB4MDBmMCwgMHgyMjNlLCAweDAwNzgsIDB4MjIyYSwgMHhhMjg0LCAweDAwZjAsIDB4YTA4NiwgMHgwMDIwLAorCTB4MDBjMCwgMHgyMmEwLCAweDgzMTgsIDB4ODMxOCwgMHgyMzAwLCAweGExMDIsIDB4MDA0MCwgMHgyMjU0LAorCTB4MDA0OCwgMHgyMjU0LCAweDAwNzgsIDB4MjI5ZCwgMHhhMjg2LCAweDAwMjMsIDB4MDA0MCwgMHgyMjFmLAorCTB4NjgxOCwgMHhhMDg0LCAweGZmZjEsIDB4NjgxYSwgMHg3ZTU4LCAweGE2ODQsIDB4ZmZmMSwgMHhhMDg1LAorCTB4MDAxMCwgMHgyMDMwLCAweDdlNWEsIDB4NjAwOCwgMHhhMDg1LCAweDAwMTAsIDB4NjAwYSwgMHgwYzdlLAorCTB4NzA0OCwgMHgyMDYwLCAweDYwMDQsIDB4MjAwOCwgMHgyYzQ4LCAweDBjN2YsIDB4YTE4NCwgMHgwMDEwLAorCTB4MDA0MCwgMHgyMjc4LCAweDEwNzgsIDB4MmM5ZCwgMHgxMDc4LCAweDJhY2MsIDB4MDA3OCwgMHgyMjg3LAorCTB4MGM3ZSwgMHg3MDQ4LCAweDIwNjAsIDB4NjAwNCwgMHgyMDA4LCAweDJjNDgsIDB4MGM3ZiwgMHhhMTg0LAorCTB4MDAwOCwgMHgwMDQwLCAweDIyMTAsIDB4MTA3OCwgMHgyYzlkLCAweDEwNzgsIDB4MjllNiwgMHg4OGZmLAorCTB4MDA0MCwgMHgyMjEwLCAweDc4OWIsIDB4MDA2MCwgMHgyODAwLCAweDc4YWEsIDB4YTZiNSwgMHgwMDA0LAorCTB4N2U1YSwgMHhhNjg0LCAweDA0MDAsIDB4MDBjMCwgMHgyMjk5LCAweDc4MWIsIDB4MDA1NSwgMHgwMDc4LAorCTB4MWJmNywgMHg3ODFiLCAweDAwNjksIDB4MDA3OCwgMHgxYmY3LCAweDdhYTgsIDB4MDA3OCwgMHgyMjJhLAorCTB4ODMxOCwgMHgyMzAwLCAweGExMDIsIDB4MDA0MCwgMHgyMmE5LCAweDAwNDgsIDB4MjJhOSwgMHgwMDc4LAorCTB4MjIyYSwgMHhhMjg0LCAweDAwODAsIDB4MDBjMCwgMHgyYjc2LCAweDAwNzgsIDB4MmI3MCwgMHgwMDc4LAorCTB4MmI3NiwgMHgwMDc4LCAweDJiNmEsIDB4Nzg5YiwgMHgwMDE4LCAweDc4YTgsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4ZSwgMHgwMDAxLCAweDAwNDAsIDB4MjJiZSwgMHgxMDc4LCAweDFiYTUsIDB4N2FhOCwgMHhhMjk0LAorCTB4MDBmZiwgMHg3OGE4LCAweGEwODQsIDB4MDBmZiwgMHhhMDhhLCAweDAwMDQsIDB4MDBjOCwgMHgyYjZhLAorCTB4MDA3OSwgMHgyMmNhLCAweDJiNmEsIDB4MjkzOSwgMHgyYjZhLCAweDJhNjcsIDB4YTI4MiwgMHgwMDAwLAorCTB4MDBjMCwgMHgyMmQ0LCAweDEwNzgsIDB4MWJhNSwgMHgxMDc4LCAweDJiODksIDB4NzgxYiwgMHgwMDY5LAorCTB4MDA3OCwgMHgxYmY3LCAweGEyODIsIDB4MDAwMywgMHgwMGMwLCAweDIyZTAsIDB4MTA3OCwgMHgxYmE1LAorCTB4MTA3OCwgMHgyYjk5LCAweDc4MWIsIDB4MDA2OSwgMHgwMDc4LCAweDFiZjcsIDB4YTI4MiwgMHgwMDA0LAorCTB4MDA1MCwgMHgyMmVjLCAweDEwNzgsIDB4MWJhNSwgMHgyMzAwLCAweDAwNzksIDB4MjJlZiwgMHgyMmYyLAorCTB4MjNjOSwgMHgyM2ZhLCAweGEyODYsIDB4MDAwMywgMHgwMDQwLCAweDIyZjgsIDB4MTA3OCwgMHgxYmE1LAorCTB4MjAwMSwgMHgwMDAwLCAweDcwM2EsIDB4NzAwMCwgMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHgyMzAwLAorCTB4MjMwOCwgMHgyMzBhLCAweDIzMGEsIDB4MjUwOCwgMHgyNTMwLCAweDI0ZDIsIDB4MjMwOCwgMHgyMzA4LAorCTB4MTA3OCwgMHgxYmE1LCAweGE2ODQsIDB4MTAwMCwgMHgwMGMwLCAweDIzMTIsIDB4MTA3OCwgMHgyZWM3LAorCTB4MDA0MCwgMHgyM2EzLCAweDc4NjgsIDB4YTA4YywgMHgwMGZmLCAweDAwNDAsIDB4MjM1YSwgMHhhMTg2LAorCTB4MDAwOCwgMHgwMGMwLCAweDIzMjksIDB4MTA3OCwgMHgyOGVmLCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLAorCTB4NjAwYSwgMHgxMDc4LCAweDI4YTIsIDB4MDA0MCwgMHgyMzVhLCAweDEwNzgsIDB4MmVjNywgMHgwMDc4LAorCTB4MjM0MSwgMHhhMTg2LCAweDAwMjgsIDB4MDBjMCwgMHgyMzVhLCAweDEwNzgsIDB4MmVjNywgMHg2MDA4LAorCTB4YTA4NCwgMHhmZmVmLCAweDYwMGEsIDB4NjAxOCwgMHhhMDA1LCAweDAwNDAsIDB4MjM0MSwgMHg4MDAxLAorCTB4NjAxYSwgMHhhMDA1LCAweDAwNDAsIDB4MjM0MSwgMHg4MDAxLCAweGEwMDUsIDB4MDA0MCwgMHgyMzQxLAorCTB4NjAxZSwgMHg2ODFjLCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLCAweDFiZmYsIDB4NjgxYywgMHhhMDg0LAorCTB4ZmZmZSwgMHg2ODFlLCAweDcwNTQsIDB4MGM3ZSwgMHgyMDYwLCAweDY4MDAsIDB4NjAwMiwgMHgwYzdmLAorCTB4NjAwNCwgMHg2ODAyLCAweGEwMDUsIDB4MmQwMCwgMHgwMGMwLCAweDIzNTcsIDB4NjAwMiwgMHg2MDA2LAorCTB4MDA3OCwgMHgxYmZmLCAweDAxN2UsIDB4MTA3OCwgMHgyNDFmLCAweDAxN2YsIDB4YTY4NCwgMHhkZjAwLAorCTB4NjgxYSwgMHg2ODI3LCAweDAwMDAsIDB4NmYxMCwgMHg4MWZmLCAweDAwNDAsIDB4MjNhMywgMHhhMTg2LAorCTB4MDAwMiwgMHgwMGMwLCAweDIzOWIsIDB4YTY4NCwgMHgwODAwLCAweDAwYzAsIDB4MjM3NywgMHhhNjg0LAorCTB4MDA2MCwgMHgwMDQwLCAweDIzNzcsIDB4NzhkOCwgMHg3YWRjLCAweDY4MmUsIDB4NmEyYSwgMHg4NzE3LAorCTB4YTI5NCwgMHgwMDBmLCAweDgyMTMsIDB4ODIxMywgMHg4MjEzLCAweGEyOTAsIDB4MzYwMCwgMHhhMjkwLAorCTB4MDAwMCwgMHgyMjFjLCAweGEzODQsIDB4MDEwMCwgMHgwMGMwLCAweDIzODgsIDB4MDA3OCwgMHgyMzhlLAorCTB4ODIxMCwgMHgyMjA0LCAweGEwODUsIDB4MDAxOCwgMHgyMDEyLCAweDgyMTEsIDB4YTM4NCwgMHgwNDAwLAorCTB4MDA0MCwgMHgyMzliLCAweDY4OWMsIDB4YTA4NCwgMHgwMTAwLCAweDAwYzAsIDB4MjM5YiwgMHgxMDc4LAorCTB4MjQ5MSwgMHgwMDc4LCAweDFiZmYsIDB4YTE4NiwgMHgwMDE4LCAweDAwNDAsIDB4MjNhMywgMHhhMTg2LAorCTB4MDAxNCwgMHgwMDQwLCAweDFiZmYsIDB4NjkxMiwgMHg2ODE0LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLAorCTB4MjNhYiwgMHg3MDM4LCAweDY4MTYsIDB4YTY4YywgMHhkZjAwLCAweDY5MWEsIDB4MTA3OCwgMHgyOGUwLAorCTB4MTA3OCwgMHgyOGVmLCAweDAwYzAsIDB4MjNiOCwgMHg2MDA4LCAweGEwODQsIDB4ZmZlZiwgMHg2MDBhLAorCTB4NjgxYywgMHhhMDg0LCAweDAwMDEsIDB4MDBjMCwgMHgyM2MxLCAweDEwNzgsIDB4MjhkOSwgMHgwMDc4LAorCTB4MjNjNSwgMHg3MDU0LCAweDIwNjAsIDB4NjgwMCwgMHg2MDAyLCAweDEwNzgsIDB4MTdkZCwgMHgwMDc4LAorCTB4MWJmZiwgMHhhMjgyLCAweDAwMDQsIDB4MDA0OCwgMHgyM2NmLCAweDEwNzgsIDB4MWJhNSwgMHgyMjAwLAorCTB4MDA3OSwgMHgyM2QyLCAweDIzZDYsIDB4MjNkOCwgMHgyM2U1LCAweDIzZDgsIDB4MTA3OCwgMHgxYmE1LAorCTB4NzAwMCwgMHhhMDg2LCAweDAwMDUsIDB4MDA0MCwgMHgyM2UxLCAweDEwNzgsIDB4MmI4OSwgMHg3ODFiLAorCTB4MDA2OSwgMHg3ODFiLCAweDAwNmEsIDB4MDA3OCwgMHgxYmY3LCAweDc4OTAsIDB4ODAwNywgMHg4MDAxLAorCTB4YTA4NCwgMHgwMDA3LCAweGEwODAsIDB4MDAxOCwgMHg3ODlhLCAweDc5YTgsIDB4YTE4YywgMHgwMGZmLAorCTB4YTE4NiwgMHgwMDAzLCAweDAwNDAsIDB4MjNmNiwgMHgwMDc4LCAweDJiNmEsIDB4NzgxYiwgMHgwMDZhLAorCTB4MDA3OCwgMHgxYmY3LCAweDY4MWMsIDB4YTA4NSwgMHgwMDA0LCAweDY4MWUsIDB4ODJmZiwgMHgwMGMwLAorCTB4MjQwNSwgMHgxMDc4LCAweDJiODksIDB4MDA3OCwgMHgyNDBjLCAweDgyMTEsIDB4MDA0MCwgMHgyNDBhLAorCTB4MTA3OCwgMHgxYmE1LCAweDEwNzgsIDB4MmI5OSwgMHg3ODFiLCAweDAwNjksIDB4MDA3OCwgMHgxYmY3LAorCTB4MTA3OCwgMHgyZDc3LCAweDc4MzAsIDB4YTA4NCwgMHgwMGMwLCAweDAwYzAsIDB4MjQxYywgMHgwMDE4LAorCTB4MjQxYywgMHg3OTFhLCAweGEwMDYsIDB4MDA3YywgMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHhhNjg0LAorCTB4MDA2MCwgMHgwMGMwLCAweDI0MjksIDB4NjgyZiwgMHgwMDAwLCAweDY4MmIsIDB4MDAwMCwgMHgwMDc4LAorCTB4MjQ5MCwgMHhhNjg0LCAweDA4MDAsIDB4MDBjMCwgMHgyNDM4LCAweDY4YjAsIDB4YTA4NCwgMHg0ODAwLAorCTB4YTYzNSwgMHhhNjg0LCAweDA4MDAsIDB4MDBjMCwgMHgyNDM4LCAweDEwNzgsIDB4MmVjNywgMHgwMDdjLAorCTB4YTY4NCwgMHgwMDIwLCAweDAwNDAsIDB4MjQ2MiwgMHg3OGQwLCAweDgwMDMsIDB4MDBjOCwgMHgyNDQ2LAorCTB4YTAwNiwgMHgxMDc4LCAweDMxOTQsIDB4NzhkNCwgMHgxMDc4LCAweDMxZjksIDB4YTY4NCwgMHg0MDAwLAorCTB4MDA0MCwgMHgyNDUwLCAweDY4MmYsIDB4MDAwMCwgMHg2ODJiLCAweDAwMDAsIDB4MDA3OCwgMHgyNDM1LAorCTB4NjhiMCwgMHhhMDg0LCAweDQ4MDAsIDB4YTYzNSwgMHhhNjg0LCAweDQwMDAsIDB4MDBjMCwgMHgyNDRhLAorCTB4NzAzOCwgMHhhMDA1LCAweDAwYzAsIDB4MjQ1YywgMHg3OWQ4LCAweDdhZGMsIDB4NjkyZSwgMHg2YTJhLAorCTB4MDA3OCwgMHgyNDM1LCAweGE2ODQsIDB4NDAwMCwgMHgwMDQwLCAweDI0NmMsIDB4NjgyZiwgMHgwMDAwLAorCTB4NjgyYiwgMHgwMDAwLCAweDAwNzgsIDB4MjQzNSwgMHg2OGIwLCAweGEwODQsIDB4NDgwMCwgMHhhNjM1LAorCTB4YTY4NCwgMHg0MDAwLCAweDAwYzAsIDB4MjQ2NiwgMHg3MDM4LCAweGEwMDUsIDB4MDBjMCwgMHgyNDdhLAorCTB4NzAzYiwgMHgwMDA3LCAweDc5ZDgsIDB4N2FkYywgMHg3OGQwLCAweDgwZjMsIDB4MDBjOCwgMHgyNDgxLAorCTB4ODAwMCwgMHhhMDg0LCAweDAwM2YsIDB4YTEwOCwgMHhhMjkxLCAweDAwMDAsIDB4NjkyZSwgMHg2YTJhLAorCTB4MjEwMCwgMHhhMjA1LCAweDAwYzAsIDB4MjQ4ZSwgMHgwMDc4LCAweDI0MzUsIDB4MTA3OCwgMHgzMTk0LAorCTB4MDA3YywgMHhhMzg0LCAweDAyMDAsIDB4MDA0MCwgMHgyNDk5LCAweDYwMDgsIDB4YTA4NSwgMHgwMDAyLAorCTB4NjAwYSwgMHg2ODE3LCAweDAwMDYsIDB4NmEyOCwgMHg2OTJjLCAweDZhM2EsIDB4NjkzZSwgMHg2ODJiLAorCTB4MDMwMCwgMHg2ODJmLCAweDAwMDAsIDB4NjgzMywgMHgyMDAwLCAweDY4OTMsIDB4MDAwMCwgMHg2ODk3LAorCTB4MDAyMCwgMHg3MDAwLCAweDAwNzksIDB4MjRhYywgMHgyNGI0LCAweDI0YjYsIDB4MjRiZiwgMHgyNGI0LAorCTB4MjRiNCwgMHgyNGI0LCAweDI0YjQsIDB4MjRiNCwgMHgxMDc4LCAweDFiYTUsIDB4NjgxYywgMHhhMDg0LAorCTB4MDAwMSwgMHgwMGMwLCAweDI0YmYsIDB4MTA3OCwgMHgyOGQ5LCAweDAwNzgsIDB4MjRjNSwgMHg3MDU0LAorCTB4MmM1MCwgMHgyMDYwLCAweDY4MDAsIDB4NjAwMiwgMHgyYTYwLCAweDIwMjEsIDB4MzU1NywgMHgyNDA0LAorCTB4YTAwNSwgMHgwMDQwLCAweDI0Y2UsIDB4MjAyMCwgMHgwMDc4LCAweDI0YzcsIDB4MmQyMiwgMHgyMDZiLAorCTB4MDAwMCwgMHgwMDdjLCAweDc3YjQsIDB4MTA3OCwgMHgyYmE2LCAweGE3YmMsIDB4MGYwMCwgMHgxMDc4LAorCTB4MmNhMSwgMHg2MDE4LCAweGEwMDUsIDB4MDA0MCwgMHgyNTAxLCAweDBkN2UsIDB4MjAwMSwgMHgzZjkwLAorCTB4MjA2OCwgMHgwZDdmLCAweDIwMjEsIDB4M2Y4MCwgMHgyMDA5LCAweDAwMDQsIDB4MjAxMSwgMHgwMDEwLAorCTB4MTA3OCwgMHgxZmM1LCAweDAwNDAsIDB4MjUwMSwgMHgxNTdlLCAweDIwYTksIDB4MDAwMCwgMHgyMDIxLAorCTB4M2U4MCwgMHgwNDdlLCAweDIwMDksIDB4MDAwNCwgMHgyMDExLCAweDAwMTAsIDB4MTA3OCwgMHgxZmM1LAorCTB4MDQ3ZiwgMHgwMDQwLCAweDI1MDAsIDB4ODQyMCwgMHgwMDcwLCAweDI1MDAsIDB4MDA3OCwgMHgyNGYxLAorCTB4MTU3ZiwgMHg4NzM4LCAweGE3ODQsIDB4MDAwNywgMHgwMGMwLCAweDI0ZDcsIDB4MDA3OCwgMHgxYmZmLAorCTB4MTA3OCwgMHgyOGUwLCAweDEwNzgsIDB4MjhlZiwgMHg2ODI3LCAweDAwMDAsIDB4Nzg5YiwgMHgwMDBlLAorCTB4NmYxMCwgMHg2ODEzLCAweDAwMDIsIDB4MTA3OCwgMHgzMWNhLCAweGE2ODQsIDB4MDgwMCwgMHgwMDQwLAorCTB4MjUxZCwgMHg2OTE4LCAweGExOGQsIDB4MjAwMCwgMHg2OTFhLCAweDY4MTQsIDB4YTA4NCwgMHg4MDAwLAorCTB4MDA0MCwgMHgyNTI0LCAweDY4MTcsIDB4MDAwMCwgMHgyMDIxLCAweDM1NTcsIDB4NjgwMCwgMHgyMDIyLAorCTB4NmEzOCwgMHg2OTNjLCAweDZhMmEsIDB4NjkyZSwgMHgxMDc4LCAweDE3ZGQsIDB4MDA3OCwgMHgxYmZmLAorCTB4MTA3OCwgMHgyNDFmLCAweDY4MjcsIDB4MDAwMCwgMHg3ODliLCAweDAwMGUsIDB4NmYxMCwgMHgxMDc4LAorCTB4MmQ3YywgMHhhMDhjLCAweDAwZmYsIDB4NjkxMiwgMHg2ODE0LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLAorCTB4MjU0MywgMHg3MDM4LCAweDY4MTYsIDB4YTY4YywgMHhkZjAwLCAweDY5MWEsIDB4NzBhMywgMHgwMDAwLAorCTB4MDA3OCwgMHgxYmZmLCAweGEwMDYsIDB4MTA3OCwgMHgyZWM3LCAweDY4MTMsIDB4MDAwMCwgMHg2ODE3LAorCTB4MDAwMSwgMHhhNjhjLCAweGRmMDAsIDB4NjkxYSwgMHg2ODI3LCAweDAwMDAsIDB4NzAwMCwgMHgwMDc5LAorCTB4MjU1OSwgMHgyNTYxLCAweDI1NjMsIDB4MjU2MywgMHgyNTY1LCAweDI1NjUsIDB4MjU2NSwgMHgyNTYxLAorCTB4MjU2MSwgMHgxMDc4LCAweDFiYTUsIDB4MTA3OCwgMHgyOGVmLCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLAorCTB4NjAwYSwgMHgwMDc4LCAweDI4YmEsIDB4MjMwMCwgMHgwMDc5LCAweDI1NmUsIDB4MjU3MSwgMHgyNTczLAorCTB4MjViMSwgMHgxMDc4LCAweDFiYTUsIDB4NzAwMCwgMHgwMDc5LCAweDI1NzYsIDB4MjU3ZSwgMHgyNTgwLAorCTB4MjU4MCwgMHgyNThiLCAweDI1ODAsIDB4MjU5MiwgMHgyNTdlLCAweDI1N2UsIDB4MTA3OCwgMHgxYmE1LAorCTB4YTY4NCwgMHgyMDAwLCAweDAwYzAsIDB4MjU4YiwgMHhhNmI1LCAweDIwMDAsIDB4N2U1YSwgMHgxMDc4LAorCTB4MzBmMCwgMHgwMDc4LCAweDJkMzAsIDB4NjgxNCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyNTkyLAorCTB4NjgxNywgMHgwMDA3LCAweDIwMDksIDB4MzUxOCwgMHgyMTBjLCAweGExODYsIDB4MDAwMCwgMHgwMDQwLAorCTB4MjVhNywgMHhhMTg2LCAweDAwMDEsIDB4MDA0MCwgMHgyNWFiLCAweDIwMDksIDB4MzUyYiwgMHgyMDBiLAorCTB4MDAwYiwgMHg3MGEzLCAweDAwMDEsIDB4NzgxYiwgMHgwMDQ2LCAweDAwNzgsIDB4MWJmNywgMHg3ODFiLAorCTB4MDBkZCwgMHgwMDc4LCAweDFiZjcsIDB4MjAwOSwgMHgzNTJiLCAweDIwMGIsIDB4MDAwYSwgMHgwMDc4LAorCTB4MWJmNywgMHgxMDc4LCAweDFiYTUsIDB4MjMwMCwgMHgwMDc5LCAweDI1YjYsIDB4MjViOSwgMHgyNWJiLAorCTB4MjVkZSwgMHgxMDc4LCAweDFiYTUsIDB4NzAwMCwgMHgwMDc5LCAweDI1YmUsIDB4MjVjNiwgMHgyNWM4LAorCTB4MjVjOCwgMHgyNWQzLCAweDI1YzgsIDB4MjVkYSwgMHgyNWM2LCAweDI1YzYsIDB4MTA3OCwgMHgxYmE1LAorCTB4YTY4NCwgMHgyMDAwLCAweDAwYzAsIDB4MjVkMywgMHhhNmI1LCAweDIwMDAsIDB4N2U1YSwgMHgxMDc4LAorCTB4MzBmMCwgMHgwMDc4LCAweDJkMzAsIDB4NjgxNCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyNWRhLAorCTB4NjgxNywgMHgwMDA3LCAweDc4MWIsIDB4MDBlNCwgMHgwMDc4LCAweDFiZjcsIDB4NjgxYywgMHhhMDg1LAorCTB4MDAwNCwgMHg2ODFlLCAweGE2YjUsIDB4MDgwMCwgMHgxMDc4LCAweDJiODksIDB4NzgxYiwgMHgwMDY5LAorCTB4MDA3OCwgMHgxYmY3LCAweDIzMDAsIDB4MDA3OSwgMHgyNWVkLCAweDI1ZjAsIDB4MjVmMiwgMHgyNWY0LAorCTB4MTA3OCwgMHgxYmE1LCAweDEwNzgsIDB4MWJhNSwgMHhhNjg0LCAweDA0MDAsIDB4MDBjMCwgMHgyNjEzLAorCTB4NzgyYiwgMHgzMDA5LCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLCAweDAwMDAsIDB4YTY4NCwgMHhmZmZiLAorCTB4Nzg1YSwgMHg3OWU0LCAweGExODQsIDB4MDAyMCwgMHgwMDQwLCAweDI2MGIsIDB4NzhlYywgMHhhMDg0LAorCTB4MDAwMywgMHgwMGMwLCAweDI2MGYsIDB4MjAwMSwgMHgwMDE0LCAweDAwNzgsIDB4MjJmYSwgMHhhMTg0LAorCTB4MDAwNywgMHgwMDc5LCAweDI2NGIsIDB4N2E5MCwgMHhhMjk0LCAweDAwMDcsIDB4Nzg5YiwgMHgwMDYwLAorCTB4NzlhOCwgMHg4MWZmLCAweDAwNDAsIDB4MjY0OSwgMHg3ODliLCAweDAwMTAsIDB4N2JhOCwgMHhhMzg0LAorCTB4MDAwMSwgMHgwMGMwLCAweDI2M2EsIDB4N2JhOCwgMHg3YmE4LCAweGEzODYsIDB4MDAwMSwgMHgwMGMwLAorCTB4MjYyZCwgMHgyMDA5LCAweGZmZjcsIDB4MDA3OCwgMHgyNjMzLCAweGEzODYsIDB4MDAwMywgMHgwMGMwLAorCTB4MjYzYSwgMHgyMDA5LCAweGZmZWYsIDB4MGM3ZSwgMHg3MDQ4LCAweDIwNjAsIDB4NjAwNCwgMHhhMTA0LAorCTB4NjAwNiwgMHgwYzdmLCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLCAweDAwMDAsIDB4YTY4NCwgMHhmZmZiLAorCTB4Nzg1YSwgMHg3ODJiLCAweDMwMDksIDB4NjkxYywgMHhhMThjLCAweGZkZmYsIDB4YTE4YywgMHhmZWZmLAorCTB4NjkxZSwgMHgwMDc4LCAweDJkMzAsIDB4MjAyMywgMHgyMDI5LCAweDI2NTUsIDB4MjY1ZCwgMHgyNjUzLAorCTB4MjY1MywgMHgyNjUzLCAweDJkMzAsIDB4MTA3OCwgMHgxYmE1LCAweDY5MWMsIDB4YTE4YywgMHhmZGZmLAorCTB4YTE4YywgMHhmZWZmLCAweDY5MWUsIDB4MDA3OCwgMHgyZDM4LCAweDY5MWMsIDB4YTE4YywgMHhmZGZmLAorCTB4YTE4YywgMHhmZWZmLCAweDY5MWUsIDB4MDA3OCwgMHgyZDMwLCAweDc5ZTQsIDB4YTE4NCwgMHgwMDMwLAorCTB4MDA0MCwgMHgyNjZmLCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDAwYzAsIDB4MjY3NywgMHg2ODE0LAorCTB4YTA4NSwgMHg4MDAwLCAweDY4MTYsIDB4MjAwMSwgMHgwMDE0LCAweDAwNzgsIDB4MjJmYSwgMHhhMTg0LAorCTB4MDAwNywgMHgwMDc5LCAweDI2N2IsIDB4MmQzMCwgMHgyZDMwLCAweDI2ODMsIDB4MmQzMCwgMHgyZDU4LAorCTB4MmQ1OCwgMHgyZDMwLCAweDJkMzAsIDB4YTY4NCwgMHgwNDAwLCAweDAwYzAsIDB4MjZiNCwgMHg2ODFjLAorCTB4YTA4NCwgMHgwMDAxLCAweDAwNDAsIDB4MmQzOCwgMHhhNjhjLCAweDIwNjAsIDB4YTE4YywgMHhmZmZiLAorCTB4Nzk1YSwgMHg2OWIyLCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLCAweDAwMDAsIDB4Nzg5YiwgMHgwMDYxLAorCTB4NjgxNCwgMHhhMDg1LCAweDgwMDAsIDB4NjgxNiwgMHg3OGFhLCAweDE1N2UsIDB4MTM3ZSwgMHgxNDdlLAorCTB4MjBhMSwgMHgwMTJjLCAweDc4OWIsIDB4MDAwMCwgMHg4MDAwLCAweDgwYWMsIDB4YWQ4MCwgMHgwMDBhLAorCTB4MjA5OCwgMHg1M2E2LCAweDE0N2YsIDB4MTM3ZiwgMHgxNTdmLCAweDY4MTAsIDB4ODAwNywgMHg3ODliLAorCTB4MDA3ZSwgMHg3OGFhLCAweDAwNzgsIDB4MmQzOCwgMHg2ODE0LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLAorCTB4MjZiYiwgMHg2ODE3LCAweDAwMDgsIDB4NzgxYiwgMHgwMGQ4LCAweDAwNzgsIDB4MWJmNywgMHgyMzAwLAorCTB4MDA3OSwgMHgyNmMyLCAweDI2YzcsIDB4Mjc0MiwgMHgyNmM1LCAweDEwNzgsIDB4MWJhNSwgMHg3MDAwLAorCTB4YTA4NCwgMHgwMDA3LCAweDAwNzksIDB4MjZjYywgMHgyNmQ0LCAweDI2ZDYsIDB4MjZmMiwgMHgyNmQ0LAorCTB4MjZkNCwgMHgyNGQyLCAweDI2ZDQsIDB4MjZkNCwgMHgxMDc4LCAweDFiYTUsIDB4NjkxYywgMHhhMThkLAorCTB4MDAwMSwgMHg2OTFlLCAweDY4MDAsIDB4NjAwNiwgMHhhMDA1LCAweDAwYzAsIDB4MjZlMCwgMHg2MDAyLAorCTB4NjgxOCwgMHhhMDg0LCAweDAwMGUsIDB4MDA0MCwgMHgyNmVjLCAweDcwMTQsIDB4NjhiNiwgMHg3MTJjLAorCTB4YTE4OCwgMHgzZTgwLCAweDAwNzgsIDB4MjZlZSwgMHgyMDA5LCAweDNmODAsIDB4MjEwNCwgMHg2ODAyLAorCTB4MmQwYSwgMHg3MTU2LCAweDZlYjIsIDB4YTY4NCwgMHgwMDYwLCAweDAwNDAsIDB4Mjc0MCwgMHhhNjg0LAorCTB4MDgwMCwgMHgwMGMwLCAweDI3MDQsIDB4YTY4NCwgMHg3ZmZmLCAweDY4YjIsIDB4Njg5MCwgMHg2ODk0LAorCTB4MTA3OCwgMHgyZWM3LCAweDAwNzgsIDB4Mjc0MCwgMHhhNjg0LCAweDAwMjAsIDB4MDA0MCwgMHgyNzE2LAorCTB4YTAwNiwgMHgxMDc4LCAweDMxOTQsIDB4NzhkMCwgMHg4MDAzLCAweDAwYzgsIDB4MjcxMiwgMHg3OGQ0LAorCTB4MTA3OCwgMHgzMWY5LCAweDc5ZDgsIDB4N2FkYywgMHgwMDc4LCAweDI3MWEsIDB4MTA3OCwgMHgyY2FlLAorCTB4MTA3OCwgMHgzMTk0LCAweGE2ODQsIDB4ODAwMCwgMHgwMDQwLCAweDI3NDAsIDB4YTY4NCwgMHg3ZmZmLAorCTB4NjhiMiwgMHg3ODliLCAweDAwNzQsIDB4MTA3OCwgMHgyZDdjLCAweDIwMTAsIDB4MTA3OCwgMHgyZDdjLAorCTB4MjAwOCwgMHhhNjg0LCAweDAwMjAsIDB4MDBjMCwgMHgyNzM4LCAweDEwNzgsIDB4MmQ3YywgMHg4MDFiLAorCTB4MDBjOCwgMHgyNzMzLCAweDgwMDAsIDB4YTA4NCwgMHgwMDNmLCAweGExMDgsIDB4YTI5MSwgMHgwMDAwLAorCTB4NmI5NCwgMHgyMTAwLCAweGEzMDIsIDB4NjhhZSwgMHg2YjkwLCAweDIyMDAsIDB4YTMwMywgMHg2OGFhLAorCTB4MDA3OCwgMHgxYmZmLCAweDAwNzgsIDB4MmI3NiwgMHg3MDMzLCAweDAwMDAsIDB4YTI4MiwgMHgwMDA1LAorCTB4MDA1MCwgMHgyNzRjLCAweDEwNzgsIDB4MWJhNSwgMHgyMzAwLCAweDAwNzksIDB4Mjc0ZiwgMHgyNzUyLAorCTB4Mjc1YywgMHgyNzdmLCAweDIyMDAsIDB4MDA3OSwgMHgyNzU1LCAweDI3NWEsIDB4MmI3NiwgMHgyNzVhLAorCTB4MjdhOCwgMHgyN2Y5LCAweDEwNzgsIDB4MWJhNSwgMHg3MDAwLCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLAorCTB4Mjc2OSwgMHgxMDc4LCAweDI4ZWYsIDB4MTA3OCwgMHgyZWM3LCAweDcwMzQsIDB4NjAwYSwgMHgwMDc4LAorCTB4Mjc2ZSwgMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMDQwLCAweDI3NjMsIDB4NzAwMywgMHgwMDA1LAorCTB4MjAwMSwgMHgzZjkwLCAweDIwNjgsIDB4NzAzZSwgMHg3MDMyLCAweDIyMDAsIDB4MDA3OSwgMHgyNzc4LAorCTB4MmI3NiwgMHgyNzdkLCAweDI3YTgsIDB4Mjc3ZCwgMHgyYjc2LCAweDEwNzgsIDB4MWJhNSwgMHg3MDAwLAorCTB4YTA4NiwgMHgwMDAxLCAweDAwYzAsIDB4Mjc4YywgMHgxMDc4LCAweDI4ZWYsIDB4MTA3OCwgMHgyZWM3LAorCTB4NzAzNCwgMHg2MDBhLCAweDAwNzgsIDB4Mjc5MSwgMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMDQwLAorCTB4Mjc4NiwgMHg3MDAzLCAweDAwMDUsIDB4MjAwMSwgMHgzZjkwLCAweDIwNjgsIDB4NzAzZSwgMHg3MDMyLAorCTB4MjIwMCwgMHgwMDc5LCAweDI3OWIsIDB4MjdhMiwgMHgyN2EwLCAweDI3YTIsIDB4MjdhMCwgMHgyN2EyLAorCTB4MTA3OCwgMHgxYmE1LCAweDEwNzgsIDB4MmI5OSwgMHg3ODFiLCAweDAwNjksIDB4MDA3OCwgMHgxYmY3LAorCTB4NzAwMCwgMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHgyN2I1LCAweDEwNzgsIDB4MjhlZiwgMHgxMDc4LAorCTB4MmVjNywgMHg3MDM0LCAweDYwMGEsIDB4MDA3OCwgMHgyN2JhLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLAorCTB4MDA0MCwgMHgyN2FmLCAweDcwMDMsIDB4MDAwMiwgMHg3YTgwLCAweGEyOTQsIDB4MGYwMCwgMHg3ODliLAorCTB4MDAxOCwgMHg3Y2E4LCAweGE0ODQsIDB4MDAwNywgMHhhMjE1LCAweDIwNjksIDB4M2Y4MCwgMHgyZDA0LAorCTB4MmQwOCwgMHg3MTU2LCAweDIwNjgsIDB4YTAwNSwgMHgwMDQwLCAweDI3ZDUsIDB4NjgxMCwgMHhhMjA2LAorCTB4MDA0MCwgMHgyN2VlLCAweDY4MDAsIDB4MDA3OCwgMHgyN2M4LCAweDcwMDMsIDB4MDAwNSwgMHgyMDAxLAorCTB4M2Y5MCwgMHgyMDY4LCAweDcwM2UsIDB4NzAzMiwgMHgxNTdlLCAweDIwYTksIDB4MDAyZiwgMHgyMDAzLAorCTB4MDAwMCwgMHg4MDAwLCAweDAwNzAsIDB4MjdlNiwgMHgwMDc4LCAweDI3ZGYsIDB4MTU3ZiwgMHg2YTEyLAorCTB4NjhiMywgMHgwNzAwLCAweDY4MWYsIDB4MDgwMCwgMHg2ODIzLCAweDAwMDMsIDB4NmViMCwgMHg3ZTVhLAorCTB4NjgxYywgMHhhMDg0LCAweDBjMDAsIDB4MDA0MCwgMHgyODRmLCAweDEwNzgsIDB4MmI5MSwgMHgwMDc4LAorCTB4Mjg0ZiwgMHg3MDAwLCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDI4MDYsIDB4MTA3OCwgMHgyOGVmLAorCTB4MTA3OCwgMHgyZWM3LCAweDcwMzQsIDB4NjAwYSwgMHgwMDc4LCAweDI4MGIsIDB4NzAwMCwgMHhhMDg2LAorCTB4MDAwMywgMHgwMDQwLCAweDI4MDAsIDB4NzAwMywgMHgwMDAyLCAweDdhODAsIDB4YTI5NCwgMHgwZjAwLAorCTB4Nzg5YiwgMHgwMDE4LCAweDdjYTgsIDB4YTQ4NCwgMHgwMDA3LCAweGEyMTUsIDB4NzlhOCwgMHg3OWE4LAorCTB4YTE4YywgMHgwMGZmLCAweGExZTgsIDB4M2U4MCwgMHgyZDA0LCAweDJkMDgsIDB4NzE1NiwgMHgyMDY4LAorCTB4YTAwNSwgMHgwMDQwLCAweDI4MmEsIDB4NjgxMCwgMHhhMjA2LCAweDAwNDAsIDB4Mjg0MywgMHg2ODAwLAorCTB4MDA3OCwgMHgyODFkLCAweDcwMDMsIDB4MDAwNSwgMHgyMDAxLCAweDNmOTAsIDB4MjA2OCwgMHg3MDNlLAorCTB4NzAzMiwgMHgxNTdlLCAweDIwYTksIDB4MDAyZiwgMHgyMDAzLCAweDAwMDAsIDB4ODAwMCwgMHgwMDcwLAorCTB4MjgzYiwgMHgwMDc4LCAweDI4MzQsIDB4MTU3ZiwgMHg2YTEyLCAweDY4YjMsIDB4MDcwMCwgMHg2ODFmLAorCTB4MDgwMCwgMHg2ODIzLCAweDAwMDMsIDB4NmViMCwgMHg3ZTVhLCAweDY4MWMsIDB4YTA4NCwgMHgwYzAwLAorCTB4MDA0MCwgMHgyODRmLCAweDEwNzgsIDB4MmI4ZCwgMHg3ZTU4LCAweDAwNzgsIDB4Mjg0ZiwgMHgwMjdlLAorCTB4ODIwNywgMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTA4MCwgMHgzNjAwLAorCTB4MjA2MCwgMHg3MDRhLCAweDYwMDAsIDB4NzA0ZSwgMHg2MDA0LCAweDcwNTIsIDB4YTY4NCwgMHgwMDYwLAorCTB4MDA0MCwgMHgyODg2LCAweDZiOTQsIDB4NmM5MCwgMHg2OWE4LCAweDY4YWMsIDB4YTEwNSwgMHgwMGMwLAorCTB4Mjg3NCwgMHg3YmQyLCAweDdiZGEsIDB4N2NkNiwgMHg3Y2RlLCAweGE2YjQsIDB4YjdmZiwgMHg3ZTVhLAorCTB4MTA3OCwgMHgzMGYwLCAweDAwNzgsIDB4Mjg4NiwgMHg2OGFjLCAweGEzMWEsIDB4MjEwMCwgMHhhNDIzLAorCTB4MjQwMCwgMHhhMzA1LCAweDAwNDAsIDB4Mjg4NiwgMHg3YmQyLCAweDdiZGEsIDB4N2NkNiwgMHg3Y2RlLAorCTB4NjhhYywgMHhhNmI0LCAweGJmZmYsIDB4N2U1YSwgMHgxMDc4LCAweDMxMWQsIDB4MDc3ZiwgMHgxMDc4LAorCTB4MmNhMSwgMHgyMDA5LCAweDAwNmEsIDB4YTY4NCwgMHgwMDA4LCAweDAwNDAsIDB4Mjg5MSwgMHgyMDA5LAorCTB4MDA2OSwgMHhhNmI1LCAweDIwMDAsIDB4N2U1YSwgMHg3OTFhLCAweDJkMDAsIDB4NzAzZSwgMHg4MjA3LAorCTB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGEwODAsIDB4MzYwMCwgMHgyMDQ4LAorCTB4MDA3OCwgMHgxYmY3LCAweDYwMjAsIDB4YTAwNSwgMHgwMDQwLCAweDI4YWUsIDB4ODAwMSwgMHg2MDIyLAorCTB4NjAwOCwgMHhhMDg1LCAweDAwMDgsIDB4NjAwYSwgMHg3MDEwLCAweDYwMjYsIDB4MDA3YywgMHhhMDA2LAorCTB4MTA3OCwgMHgyZWM3LCAweDY4MTMsIDB4MDAwMCwgMHg2ODE3LCAweDAwMDEsIDB4NjgxZiwgMHgwMDQwLAorCTB4NjgxYiwgMHgwMTAwLCAweDcwMDAsIDB4YTA4NCwgMHgwMDA3LCAweDAwNzksIDB4MjhiZiwgMHgyOGM3LAorCTB4MjhjOSwgMHgyOGM5LCAweDI4ZDUsIDB4MjhkMSwgMHgyOGM3LCAweDI4YzcsIDB4MjhjNywgMHgxMDc4LAorCTB4MWJhNSwgMHgxMDc4LCAweDI4ZTAsIDB4MTA3OCwgMHgyOGQ5LCAweDEwNzgsIDB4MTdkZCwgMHgwMDc4LAorCTB4MWJmZiwgMHg3MGEzLCAweDAwMDAsIDB4MDA3OCwgMHgxYmZmLCAweDY4MTcsIDB4MDAwMCwgMHgwMDc4LAorCTB4MjUwOCwgMHg2ODAwLCAweGEwMDUsIDB4MDBjMCwgMHgyOGRlLCAweDYwMDIsIDB4NjAwNiwgMHgwMDdjLAorCTB4NjAxMCwgMHhhMDA1LCAweDAwNDAsIDB4MjhlOSwgMHg4MDAxLCAweDAwZDAsIDB4MjhlOSwgMHgxMDc4LAorCTB4MWJhNSwgMHg2MDEyLCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLCAweDYwMGEsIDB4MDA3YywgMHg2MDE4LAorCTB4YTAwNSwgMHgwMDQwLCAweDI4ZjUsIDB4ODAwMSwgMHg2MDFhLCAweDAwN2MsIDB4MTA3OCwgMHgyZDc3LAorCTB4NjgxNywgMHgwMDE4LCAweDAwNzgsIDB4MjkyNiwgMHgxMDc4LCAweDJkNzcsIDB4NjgxNywgMHgwMDE5LAorCTB4MDA3OCwgMHgyOTI2LCAweDEwNzgsIDB4MmQ3NywgMHg2ODE3LCAweDAwMWEsIDB4MDA3OCwgMHgyOTI2LAorCTB4NzdiNCwgMHgxMDc4LCAweDJjYTEsIDB4NzFiOCwgMHhhMThjLCAweDAwZmYsIDB4YTFlOCwgMHgzZTgwLAorCTB4MmQwNCwgMHgyZDA4LCAweDIwNjgsIDB4YTAwNSwgMHgwMGMwLCAweDI5MTgsIDB4MDA3OCwgMHgxYmZmLAorCTB4NjgxMCwgMHg3MmI0LCAweGEyMDYsIDB4MDA0MCwgMHgyOTIwLCAweDY4MDAsIDB4MDA3OCwgMHgyOTExLAorCTB4NjgwMCwgMHgyMDBhLCAweDY4MTcsIDB4MDAwNSwgMHg3MGJmLCAweDAwMDAsIDB4MTA3OCwgMHgyOGUwLAorCTB4NjgxYywgMHhhMDg0LCAweDAwMDEsIDB4MDBjMCwgMHgyOTJmLCAweDEwNzgsIDB4MjhkOSwgMHgxMDc4LAorCTB4MjhlZiwgMHg2ODFiLCAweDAwMDAsIDB4NjgxZiwgMHgwMDIwLCAweDEwNzgsIDB4MTdkZCwgMHgwMDc4LAorCTB4MWJmZiwgMHhhMjgyLCAweDAwMDMsIDB4MDBjMCwgMHgyYjZhLCAweDdkYTgsIDB4YTVhYywgMHgwMGZmLAorCTB4N2VhOCwgMHhhNmI0LCAweDAwZmYsIDB4NjkxYywgMHhhMThkLCAweDAwODAsIDB4NjkxZSwgMHhhMTg0LAorCTB4MDEwMCwgMHgwMDQwLCAweDI5OTksIDB4YTE4YywgMHhmZWZmLCAweDY5MWUsIDB4YTZiNCwgMHgwMGZmLAorCTB4MDA0MCwgMHgyOTgzLCAweGE2ODIsIDB4MDAwZiwgMHgwMDQ4LCAweDI5NWEsIDB4MDA0MCwgMHgyOTVhLAorCTB4MjAzMSwgMHgwMDBmLCAweDg1MmIsIDB4ODUyYiwgMHgxMDc4LCAweDJjMjQsIDB4MDA0MCwgMHgyOTY0LAorCTB4MTA3OCwgMHgyYTMzLCAweDAwNzgsIDB4Mjk4YywgMHgxMDc4LCAweDJiZGYsIDB4MGM3ZSwgMHgyOTYwLAorCTB4NjAwNCwgMHhhMDg0LCAweGZmZjUsIDB4NjAwNiwgMHgxMDc4LCAweDJhNTcsIDB4MGM3ZiwgMHg2OTFjLAorCTB4YTE4ZCwgMHgwMTAwLCAweDY5MWUsIDB4N2U1OCwgMHhhNmI1LCAweDAwMDQsIDB4N2U1YSwgMHhhNjg0LAorCTB4MDQwMCwgMHgwMGMwLCAweDI5N2YsIDB4NzgxYiwgMHgwMDU1LCAweDAwNzgsIDB4MWJmNywgMHg3ODFiLAorCTB4MDA2OSwgMHgwMDc4LCAweDFiZjcsIDB4MGM3ZSwgMHgyOTYwLCAweDYwMDQsIDB4YTA4NCwgMHhmZmY1LAorCTB4NjAwNiwgMHgxMDc4LCAweDJhNTcsIDB4MGM3ZiwgMHg3ZTU4LCAweGE2ODQsIDB4MDQwMCwgMHgwMGMwLAorCTB4Mjk5NSwgMHg3ODFiLCAweDAwNTgsIDB4MDA3OCwgMHgxYmY3LCAweDc4MWIsIDB4MDA2YSwgMHgwMDc4LAorCTB4MWJmNywgMHgwYzdlLCAweDcwNDgsIDB4MjA2MCwgMHg2MTAwLCAweGExOGMsIDB4MTAwMCwgMHgwMDQwLAorCTB4MjlkOSwgMHg2MjA4LCAweDgyMTcsIDB4YTI5NCwgMHgwMGZmLCAweGEyODIsIDB4MDAwZiwgMHgwMDQ4LAorCTB4MjlhZCwgMHgwMDQwLCAweDI5YWQsIDB4MjAxMSwgMHgwMDBmLCAweDI2MDAsIDB4YTIwMiwgMHgwMGM4LAorCTB4MjliMiwgMHgyMjMwLCAweDYyMDgsIDB4YTI5NCwgMHgwMGZmLCAweDcwMTgsIDB4YTA4NiwgMHgwMDI4LAorCTB4MDBjMCwgMHgyOWMyLCAweGEyODIsIDB4MDAxOSwgMHgwMGM4LCAweDI5YzgsIDB4MjAxMSwgMHgwMDE5LAorCTB4MDA3OCwgMHgyOWM4LCAweGEyODIsIDB4MDAwYywgMHgwMGM4LCAweDI5YzgsIDB4MjAxMSwgMHgwMDBjLAorCTB4MjIwMCwgMHhhNTAyLCAweDAwYzgsIDB4MjljZCwgMHgyMjI4LCAweDEwNzgsIDB4MmJlMywgMHg4NTJiLAorCTB4ODUyYiwgMHgxMDc4LCAweDJjMjQsIDB4MDA0MCwgMHgyOWQ5LCAweDEwNzgsIDB4MmEzMywgMHgwMDc4LAorCTB4MjlkZCwgMHgxMDc4LCAweDJiZGYsIDB4MTA3OCwgMHgyYTU3LCAweDc4NTgsIDB4YTA4NSwgMHgwMDA0LAorCTB4Nzg1YSwgMHgwYzdmLCAweDc4MWIsIDB4MDA2OSwgMHgwMDc4LCAweDFiZjcsIDB4MGM3ZSwgMHgyOTYwLAorCTB4NjAwMCwgMHhhMDg0LCAweDEwMDAsIDB4MDBjMCwgMHgyYTAxLCAweDYwMTAsIDB4YTA4NCwgMHgwMDBmLAorCTB4MDBjMCwgMHgyOWZiLCAweGExOGMsIDB4MDAwMiwgMHgwMGMwLCAweDI5ZmIsIDB4YTE4YywgMHhmZmY1LAorCTB4NjEwNiwgMHgwYzdmLCAweDAwN2MsIDB4MjAxMSwgMHgwMDMyLCAweDIwMTksIDB4MDAwMCwgMHgwMDc4LAorCTB4MmEyMywgMHg2MjA4LCAweGEyOTQsIDB4MDBmZiwgMHg3MDE4LCAweGEwODYsIDB4MDAyOCwgMHgwMGMwLAorCTB4MmExMSwgMHhhMjgyLCAweDAwMTksIDB4MDBjOCwgMHgyYTE3LCAweDIwMTEsIDB4MDAxOSwgMHgwMDc4LAorCTB4MmExNywgMHhhMjgyLCAweDAwMGMsIDB4MDBjOCwgMHgyYTE3LCAweDIwMTEsIDB4MDAwYywgMHg2MzA4LAorCTB4ODMxZiwgMHhhMzljLCAweDAwZmYsIDB4YTM4MiwgMHgwMDBmLCAweDAwNDgsIDB4MmEyMywgMHgwMDQwLAorCTB4MmEyMywgMHgyMDE5LCAweDAwMGYsIDB4NzhhYiwgMHgwMDAxLCAweDc4YWIsIDB4MDAwMywgMHg3OGFiLAorCTB4MDAwMSwgMHg3YWFhLCAweDdiYWEsIDB4YThjMCwgMHgwMDA1LCAweDY4MWMsIDB4YTA4NSwgMHgwMTAwLAorCTB4NjgxZSwgMHgwYzdmLCAweDAwN2MsIDB4MGM3ZSwgMHg3MTQ4LCAweDIxNjAsIDB4MjAwOCwgMHhhMDg0LAorCTB4ZmZmMCwgMHhhNjM1LCAweDdlODYsIDB4NjAxOCwgMHg3ODlhLCAweDdlYWUsIDB4NjYxMiwgMHg3OGE0LAorCTB4YTA4NCwgMHhmZmY4LCAweGExOGMsIDB4MDAwNywgMHhhMTA1LCAweDc4YTYsIDB4NjAxNiwgMHg3ODhhLAorCTB4YTZiNCwgMHgwMDBmLCAweDg2MzcsIDB4ODIwNCwgMHg4MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhNjA1LAorCTB4NjAwZSwgMHg2MDA0LCAweGEwODQsIDB4ZmZmNSwgMHg2MDA2LCAweDBjN2YsIDB4MDA3YywgMHgwYzdlLAorCTB4NzA0OCwgMHgyMDYwLCAweDYwMTgsIDB4Nzg5YSwgMHg3OGE0LCAweGEwODQsIDB4ZmZmMCwgMHg3OGE2LAorCTB4NjAxMiwgMHg3ODg0LCAweGEwODQsIDB4ZmZmMCwgMHg3ODg2LCAweDBjN2YsIDB4MDA3YywgMHhhMjgyLAorCTB4MDAwMiwgMHgwMGMwLCAweDJiNmEsIDB4N2FhOCwgMHg2OTFjLCAweGExOGQsIDB4MDA4MCwgMHg2OTFlLAorCTB4YTE4NCwgMHgwMjAwLCAweDAwNDAsIDB4MmFhYywgMHhhMThjLCAweGZkZmYsIDB4NjkxZSwgMHhhMjk0LAorCTB4MDBmZiwgMHhhMjgyLCAweDAwMDIsIDB4MDBjOCwgMHgyYjZhLCAweDEwNzgsIDB4MmFmMywgMHgxMDc4LAorCTB4MmE1NywgMHhhOTgwLCAweDAwMDEsIDB4MjAwYywgMHgxMDc4LCAweDJjOWQsIDB4MTA3OCwgMHgyOWU2LAorCTB4ODhmZiwgMHgwMDQwLCAweDJhOWYsIDB4Nzg5YiwgMHgwMDYwLCAweDI4MDAsIDB4NzhhYSwgMHg3ZTU4LAorCTB4YTZiNSwgMHgwMDA0LCAweDdlNWEsIDB4YTY4NCwgMHgwNDAwLCAweDAwYzAsIDB4MmE5YiwgMHg3ODFiLAorCTB4MDA1NSwgMHgwMDc4LCAweDFiZjcsIDB4NzgxYiwgMHgwMDY5LCAweDAwNzgsIDB4MWJmNywgMHg3ZTU4LAorCTB4YTY4NCwgMHgwNDAwLCAweDAwYzAsIDB4MmFhOCwgMHg3ODFiLCAweDAwNTgsIDB4MDA3OCwgMHgxYmY3LAorCTB4NzgxYiwgMHgwMDZhLCAweDAwNzgsIDB4MWJmNywgMHhhMjgyLCAweDAwMDIsIDB4MDBjOCwgMHgyYWI0LAorCTB4YTI4NCwgMHgwMDAxLCAweDAwNDAsIDB4MmFiZSwgMHg3MTQ4LCAweGExODgsIDB4MDAwMCwgMHgyMTBjLAorCTB4YTE4YywgMHgyMDAwLCAweDAwYzAsIDB4MmFiZSwgMHgyMDExLCAweDAwMDAsIDB4MTA3OCwgMHgyYmQxLAorCTB4MTA3OCwgMHgyYWYzLCAweDEwNzgsIDB4MmE1NywgMHg3ODU4LCAweGEwODUsIDB4MDAwNCwgMHg3ODVhLAorCTB4NzgxYiwgMHgwMDY5LCAweDAwNzgsIDB4MWJmNywgMHgwYzdlLCAweDAyN2UsIDB4Mjk2MCwgMHg2MDAwLAorCTB4MjAxMSwgMHgwMDAxLCAweGEwODQsIDB4MjAwMCwgMHgwMGMwLCAweDJhZTMsIDB4NjAxNCwgMHhhMDg0LAorCTB4MDA0MCwgMHgwMGMwLCAweDJhZTEsIDB4YTE4YywgMHhmZmVmLCAweDYxMDYsIDB4YTAwNiwgMHgwMDc4LAorCTB4MmFmMCwgMHgyMDExLCAweDAwMDAsIDB4NzhhYiwgMHgwMDAxLCAweDc4YWIsIDB4MDAwMiwgMHg3OGFiLAorCTB4MDAwMywgMHg3YWFhLCAweGE4YzAsIDB4MDAwNCwgMHg2ODFjLCAweGEwODUsIDB4MDIwMCwgMHg2ODFlLAorCTB4MDI3ZiwgMHgwYzdmLCAweDAwN2MsIDB4MGM3ZSwgMHg3MDQ4LCAweDIwNjAsIDB4ODJmZiwgMHgwMDQwLAorCTB4MmFmYiwgMHgyMDExLCAweDAwNDAsIDB4NjAxOCwgMHhhMDgwLCAweDAwMDIsIDB4Nzg5YSwgMHg3OGE0LAorCTB4YTA4NCwgMHhmZmJmLCAweGEyMDUsIDB4NzhhNiwgMHg2MDE2LCAweDc4OGEsIDB4NjAwNCwgMHhhMDg0LAorCTB4ZmZlZiwgMHg2MDA2LCAweDBjN2YsIDB4MDA3YywgMHgwMDdlLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLAorCTB4MDA0MCwgMHgyYjE1LCAweDAwN2YsIDB4MDA3OCwgMHgyYjE4LCAweDAwN2YsIDB4MDA3OCwgMHgyYjY2LAorCTB4YTY4NCwgMHgwMDIwLCAweDAwNDAsIDB4MmI2NiwgMHg3ODg4LCAweGEwODQsIDB4MDA0MCwgMHgwMDQwLAorCTB4MmI2NiwgMHg3OGE4LCAweDgwMDEsIDB4MDA0MCwgMHgyYjI1LCAweDdiYjgsIDB4YTM4NCwgMHgwMDNmLAorCTB4ODMxYiwgMHgwMGM4LCAweDJiMmMsIDB4ODAwMCwgMHhhMDA1LCAweDAwNDAsIDB4MmI0ZCwgMHg4MzFiLAorCTB4MDBjOCwgMHgyYjM1LCAweDgwMDEsIDB4MDA0MCwgMHgyYjYyLCAweGEwMDYsIDB4MTA3OCwgMHgzMTk0LAorCTB4NzhiNCwgMHgxMDc4LCAweDMxZjksIDB4MDA3OCwgMHgyYjY2LCAweGE2ODQsIDB4NDAwMCwgMHgwMDQwLAorCTB4MmI0ZCwgMHg3OGI4LCAweDgwMWIsIDB4MDBjOCwgMHgyYjQ2LCAweDgwMDAsIDB4YTA4NCwgMHgwMDNmLAorCTB4MDBjMCwgMHgyYjYyLCAweGE2YjQsIDB4YmZmZiwgMHg3ZTVhLCAweDc5ZDgsIDB4N2FkYywgMHgyMDAxLAorCTB4MDAwMSwgMHhhMTA4LCAweDAwYzgsIDB4MmI1NiwgMHhhMjkxLCAweDAwMDAsIDB4NzlkMiwgMHg3OWRhLAorCTB4N2FkNiwgMHg3YWRlLCAweDEwNzgsIDB4MzE5NCwgMHg3ODFiLCAweDAwNjcsIDB4MTA3OCwgMHgzMDVlLAorCTB4MDA3OCwgMHgxYmY3LCAweDc4MWIsIDB4MDA2NywgMHgwMDc4LCAweDFiZjcsIDB4NzgxYiwgMHgwMDZhLAorCTB4MDA3OCwgMHgxYmY3LCAweDEwNzgsIDB4MmI5ZCwgMHg3ODFiLCAweDAwNjksIDB4MDA3OCwgMHgxYmY3LAorCTB4MTA3OCwgMHgyYjg5LCAweDc4MWIsIDB4MDA2OSwgMHgwMDc4LCAweDFiZjcsIDB4NjgyMywgMHgwMDAyLAorCTB4MTA3OCwgMHgyYjkxLCAweDY5MWMsIDB4YTE4ZCwgMHgwMDIwLCAweDY5MWUsIDB4NjgxNCwgMHhhMDg0LAorCTB4ODAwMCwgMHgwMDQwLCAweDJiODUsIDB4NjgxNywgMHgwMDA1LCAweDc4MWIsIDB4MDA2OSwgMHgwMDc4LAorCTB4MWJmNywgMHgyMDAxLCAweDAwMDUsIDB4MDA3OCwgMHgyYjlmLCAweDIwMDEsIDB4MDAwYywgMHgwMDc4LAorCTB4MmI5ZiwgMHgyMDAxLCAweDAwMDYsIDB4MDA3OCwgMHgyYjlmLCAweDIwMDEsIDB4MDAwZCwgMHgwMDc4LAorCTB4MmI5ZiwgMHgyMDAxLCAweDAwMDksIDB4MDA3OCwgMHgyYjlmLCAweDIwMDEsIDB4MDAwNywgMHg3ODliLAorCTB4MDA3ZiwgMHg3OGFhLCAweGE2YjUsIDB4MDAwOCwgMHg3ZTVhLCAweDAwN2MsIDB4MDc3ZSwgMHg4NzNmLAorCTB4YTdiYywgMHgwMDBmLCAweDg3M2IsIDB4ODczYiwgMHg4NzAzLCAweGEwZTAsIDB4MzYwMCwgMHhhN2I4LAorCTB4MDAyMCwgMHg3ZjlhLCAweDc5YTQsIDB4YTE4NCwgMHgwMDBmLCAweDAwNDAsIDB4MmJiZiwgMHhhMTg0LAorCTB4ZmZmMCwgMHg3OGE2LCAweDYwMTIsIDB4NjAwNCwgMHhhMDg1LCAweDAwMDgsIDB4NjAwNiwgMHg4NzM4LAorCTB4ODczOCwgMHg3ZjlhLCAweDc5YTQsIDB4YTE4NCwgMHgwMDQwLCAweDAwNDAsIDB4MmJjZiwgMHhhMTg0LAorCTB4ZmZiZiwgMHg3OGE2LCAweDYwMTYsIDB4NjAwNCwgMHhhMDg1LCAweDAwMTAsIDB4NjAwNiwgMHgwNzdmLAorCTB4MDA3YywgMHg3ODliLCAweDAwMTAsIDB4NzhhYiwgMHgwMDAxLCAweDc4YWIsIDB4MDAwMiwgMHg3OGFiLAorCTB4MDAwMywgMHg3YWFhLCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLCAweDAwMDQsIDB4MDA3YywgMHgyMDMxLAorCTB4MDAwMCwgMHgyMDI5LCAweDAwMzIsIDB4Nzg5YiwgMHgwMDEwLCAweDc4YWIsIDB4MDAwMSwgMHg3OGFiLAorCTB4MDAwMywgMHg3OGFiLCAweDAwMDEsIDB4N2RhYSwgMHg3ZWFhLCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLAorCTB4MDAwNSwgMHgwMDdjLCAweDE1N2UsIDB4ODAwNywgMHhhMDg0LCAweDAwZmYsIDB4ODAwMywgMHg4MDAzLAorCTB4YTA4MCwgMHgwMDIwLCAweDc4OWEsIDB4NzlhNCwgMHhhMThjLCAweGZmZjAsIDB4MjAwMSwgMHgzNTQ2LAorCTB4MjAwNCwgMHhhMDgyLCAweDAwMjgsIDB4MDA0MCwgMHgyYzBkLCAweDIwMjEsIDB4MmM4NCwgMHgyMDE5LAorCTB4MDAxNCwgMHgyMGE5LCAweDAwMGMsIDB4MDA3OCwgMHgyYzEzLCAweDIwMjEsIDB4MmM5MCwgMHgyMDE5LAorCTB4MDAxOSwgMHgyMGE5LCAweDAwMGQsIDB4MjAxMSwgMHgwMDY0LCAweDI0MDQsIDB4YTA4NCwgMHhmZmYwLAorCTB4YTEwNiwgMHgwMDQwLCAweDJjMjIsIDB4ODQyMCwgMHgyMzAwLCAweGEyMTAsIDB4MDA3MCwgMHgyYzIyLAorCTB4MDA3OCwgMHgyYzE1LCAweDE1N2YsIDB4MDA3YywgMHgxNTdlLCAweDIwMTEsIDB4MzU0NiwgMHgyMjE0LAorCTB4YTI4MiwgMHgwMDMyLCAweDAwNDgsIDB4MmMzOCwgMHgwMDQwLCAweDJjM2MsIDB4MjAyMSwgMHgyYzc2LAorCTB4MjAxOSwgMHgwMDExLCAweDIwYTksIDB4MDAwZSwgMHgyMDExLCAweDAwMzIsIDB4MDA3OCwgMHgyYzRjLAorCTB4YTI4MiwgMHgwMDI4LCAweDAwNDAsIDB4MmM0NCwgMHgyMDIxLCAweDJjODQsIDB4MjAxOSwgMHgwMDE0LAorCTB4MjBhOSwgMHgwMDBjLCAweDAwNzgsIDB4MmM0YSwgMHgyMDIxLCAweDJjOTAsIDB4MjAxOSwgMHgwMDE5LAorCTB4MjBhOSwgMHgwMDBkLCAweDIwMTEsIDB4MDA2NCwgMHgyMjAwLCAweGE1MDIsIDB4MDA0MCwgMHgyYzVjLAorCTB4MDA0OCwgMHgyYzVjLCAweDg0MjAsIDB4MjMwMCwgMHhhMjEwLCAweDAwNzAsIDB4MmM1OSwgMHgwMDc4LAorCTB4MmM0YywgMHgxNTdmLCAweGEwMDYsIDB4MDA3YywgMHgxNTdmLCAweGE1ODIsIDB4MDA2NCwgMHgwMGM4LAorCTB4MmM2NSwgMHg3ODA4LCAweGEwODUsIDB4MDA3MCwgMHg3ODBhLCAweDc4ZWMsIDB4YTA4NCwgMHgwMzAwLAorCTB4MDA0MCwgMHgyYzczLCAweDI0MDQsIDB4YTA5ZSwgMHgxMjAxLCAweDAwYzAsIDB4MmM3MywgMHgyMDAxLAorCTB4MjEwMSwgMHgwMDc4LCAweDJjNzQsIDB4MjQwNCwgMHhhMDA1LCAweDAwN2MsIDB4MTIwMSwgMHgzMDAyLAorCTB4MzIwMiwgMHg0MjAzLCAweDQ0MDMsIDB4NTQwNCwgMHg1NjA0LCAweDY2MDUsIDB4NjgwNSwgMHg3ODA2LAorCTB4N2EwNiwgMHgwYTA3LCAweDBjMDcsIDB4MGUwNywgMHgzMjAyLCAweDQyMDIsIDB4NTIwMiwgMHg2MjAyLAorCTB4NzIwMiwgMHg2NjA1LCAweDc2MDUsIDB4NzgwNSwgMHg3YTA1LCAweDdjMDUsIDB4N2UwNSwgMHg3ZjA1LAorCTB4MjIwMiwgMHgzMjAyLCAweDQyMDIsIDB4NTIwMiwgMHg1NDA0LCAweDY0MDQsIDB4NzQwNCwgMHg3NjA0LAorCTB4NzgwNCwgMHg3YTA0LCAweDdjMDQsIDB4N2UwNCwgMHg3ZjA0LCAweDc4OWIsIDB4MDAxMCwgMHhhMDQ2LAorCTB4MDA3YywgMHhhNzg0LCAweDBmMDAsIDB4ODAwYywgMHhhNzg0LCAweDAwMDcsIDB4ODAwMywgMHg4MDAzLAorCTB4ODAwMywgMHg4MDAzLCAweGExMDUsIDB4YTBlMCwgMHgzNjgwLCAweDAwN2MsIDB4NzlkOCwgMHg3YWRjLAorCTB4NzhkMCwgMHg4MDFiLCAweDAwYzgsIDB4MmNiNSwgMHg4MDAwLCAweGEwODQsIDB4MDAzZiwgMHhhMTA4LAorCTB4YTI5MSwgMHgwMDAwLCAweDAwN2MsIDB4MGY3ZSwgMHgyMDc5LCAweDAxMDAsIDB4MjAwOSwgMHgzNTQwLAorCTB4MjA5MSwgMHg4MDAwLCAweDIxMDQsIDB4MDA3OSwgMHgyY2M1LCAweDJjZjcsIDB4MmNjZiwgMHgyY2NmLAorCTB4MmNjZiwgMHgyY2NmLCAweDJjY2YsIDB4MmNjZCwgMHgyY2NkLCAweDEwNzgsIDB4MWJhNSwgMHg3ODRiLAorCTB4MDAwNCwgMHg3ODQ4LCAweGEwODQsIDB4MDAwNCwgMHgwMGMwLCAweDJjZDEsIDB4Nzg0YiwgMHgwMDA4LAorCTB4Nzg0OCwgMHhhMDg0LCAweDAwMDgsIDB4MDBjMCwgMHgyY2Q4LCAweDY4YjAsIDB4YTA4NSwgMHg0MDAwLAorCTB4NjhiMiwgMHg3ODU4LCAweGEwODUsIDB4NDAwMCwgMHg3ODVhLCAweDc4MzAsIDB4YTA4NCwgMHgwMDgwLAorCTB4MDBjMCwgMHgyY2Y3LCAweDAwMTgsIDB4MmNmNywgMHg2ODE4LCAweGEwODQsIDB4MDAyMCwgMHgwMGMwLAorCTB4MmNmNSwgMHg3ODFiLCAweDAwZGQsIDB4MDA3OCwgMHgyY2Y3LCAweDc4MWIsIDB4MDBlNCwgMHgyMDkxLAorCTB4ODAwMSwgMHgwZjdmLCAweDAwN2MsIDB4MGM3ZSwgMHg2ODEwLCAweDgwMDcsIDB4YTA4NCwgMHgwMDBmLAorCTB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTBlMCwgMHgzNjAwLCAweDYwMDQsIDB4YTA4NCwgMHgwMDBhLAorCTB4MDBjMCwgMHgyZDJlLCAweDYxMDgsIDB4YTE5NCwgMHhmZjAwLCAweDAwNDAsIDB4MmQyZSwgMHhhMThjLAorCTB4MDBmZiwgMHgyMDAxLCAweDAwMTksIDB4YTEwNiwgMHgwMDQwLCAweDJkMWQsIDB4MjAwMSwgMHgwMDMyLAorCTB4YTEwNiwgMHgwMDQwLCAweDJkMjEsIDB4MDA3OCwgMHgyZDI1LCAweDIwMDksIDB4MDAyMCwgMHgwMDc4LAorCTB4MmQyNywgMHgyMDA5LCAweDAwM2YsIDB4MDA3OCwgMHgyZDI3LCAweDIwMTEsIDB4MDAwMCwgMHgyMTAwLAorCTB4YTIwNSwgMHg2MDBhLCAweDYwMDQsIDB4YTA4NSwgMHgwMDAyLCAweDYwMDYsIDB4MGM3ZiwgMHgwMDdjLAorCTB4NzgxYiwgMHgwMDZhLCAweDAwNzgsIDB4MWJmNywgMHg3ODFiLCAweDAwNjksIDB4MDA3OCwgMHgxYmY3LAorCTB4NzgxYiwgMHgwMDU4LCAweDAwNzgsIDB4MWJmNywgMHg3ODFiLCAweDAwNTUsIDB4MDA3OCwgMHgxYmY3LAorCTB4NzgxYiwgMHgwMGRkLCAweDAwNzgsIDB4MWJmNywgMHg3ODFiLCAweDAwZGMsIDB4MDA3OCwgMHgxYmY3LAorCTB4NzgxYiwgMHgwMGU0LCAweDAwNzgsIDB4MWJmNywgMHg3ODFiLCAweDAwZTMsIDB4MDA3OCwgMHgxYmY3LAorCTB4NzgxYiwgMHgwMDllLCAweDAwNzgsIDB4MWJmNywgMHg3ODFiLCAweDAwOWQsIDB4MDA3OCwgMHgxYmY3LAorCTB4NzBhMywgMHgwMDAxLCAweDc4MWIsIDB4MDA0NiwgMHgwMDc4LCAweDFiZjcsIDB4MDA3ZSwgMHg3ODMwLAorCTB4YTA4NCwgMHgwMGMwLCAweDAwYzAsIDB4MmQ3NSwgMHg3ODA4LCAweGEwODQsIDB4ZmZmZCwgMHg3ODBhLAorCTB4MDAwNSwgMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHg3OGVjLCAweGEwODQsIDB4MDAyMSwgMHgwMDQwLAorCTB4MmQ3NSwgMHg3ODA4LCAweGEwODUsIDB4MDAwMiwgMHg3ODBhLCAweDAwN2YsIDB4MDA3YywgMHg3ODA4LAorCTB4YTA4NSwgMHgwMDAyLCAweDc4MGEsIDB4MDA3YywgMHg3ODMwLCAweGEwODQsIDB4MDA0MCwgMHgwMGMwLAorCTB4MmQ3YywgMHgwMDk4LCAweDJkODUsIDB4NzhhYywgMHgwMDdjLCAweDc4MDgsIDB4YTA4NCwgMHhmZmZkLAorCTB4NzgwYSwgMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDIxLAorCTB4MDA0MCwgMHgyZDk0LCAweDAwOTgsIDB4MmQ5MiwgMHg3OGFjLCAweDAwN2UsIDB4NzgwOCwgMHhhMDg1LAorCTB4MDAwMiwgMHg3ODBhLCAweDAwN2YsIDB4MDA3YywgMHhhNzg0LCAweDAwNzAsIDB4MDA0MCwgMHgyZGE4LAorCTB4MGM3ZSwgMHgyZDYwLCAweDJmNjgsIDB4MTA3OCwgMHgxYjZiLCAweDJkNzgsIDB4MmM2OCwgMHgwYzdmLAorCTB4NjgxNywgMHgwMDAzLCAweDc4NTgsIDB4YTA4NCwgMHgzZjAwLCAweDY4MWEsIDB4NjgyZiwgMHgwMDAwLAorCTB4NjgyYiwgMHgwMDAwLCAweDc4NGIsIDB4MDAwOCwgMHg3OGU0LCAweGEwMDUsIDB4MDBkMCwgMHgyMDE1LAorCTB4YTA4NCwgMHgwMDIwLCAweDAwNDAsIDB4MjAxNSwgMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwMDQwLAorCTB4MjAxNSwgMHgwMDE4LCAweDIwMTUsIDB4MDA3OCwgMHgyYjcwLCAweDBjN2UsIDB4NjgxMCwgMHg4MDA3LAorCTB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGEwODAsIDB4MzYwMCwgMHgyMDYwLAorCTB4MjA0OCwgMHg3MDRhLCAweDYwMDAsIDB4NzA0ZSwgMHg2MDA0LCAweDcwNTIsIDB4MGM3ZiwgMHgwMDdjLAorCTB4MDAyMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLAorCTB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLAorCTB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLAorCTB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLAorCTB4MDAwMCwgMHgwMDIwLCAweDAwNjIsIDB4MDAwOSwgMHgwMDE0LCAweDAwMTQsIDB4OTg0NywgMHgwMDE0LAorCTB4MDAxNCwgMHg5OGY1LCAweDk4ZTcsIDB4MDAxNCwgMHgwMDE0LCAweDAwODAsIDB4MDBiZiwgMHgwMTAwLAorCTB4MDQwMiwgMHgyMDA4LCAweGY4ODAsIDB4YTIwYSwgMHgwMDE0LCAweDMwMGIsIDB4YTIwYywgMHgwMDE0LAorCTB4YTIwMCwgMHg4ODM4LCAweDgxN2UsIDB4ODQyYSwgMHg4NGEwLCAweDM4MDYsIDB4ODgzOSwgMHgyOGMyLAorCTB4OWNjMywgMHhhODA1LCAweDA4NjQsIDB4YTgzYiwgMHgzMDA4LCAweDI4YzEsIDB4OWNjMywgMHhhMjAxLAorCTB4MzAwYywgMHgyODQ3LCAweDgxNjEsIDB4ODQ2YSwgMHg4MDAwLCAweDg0YTQsIDB4MTg1NiwgMHg4ODNhLAorCTB4YTgwOCwgMHgyOGUyLCAweDljYTAsIDB4YThmMywgMHgwODY0LCAweGE4MjksIDB4MzAwYywgMHhhODAxLAorCTB4MzAwOCwgMHgyOGUxLCAweDljYTAsIDB4MjgwZCwgMHhhMjA0LCAweDY0YzAsIDB4NjdhMCwgMHg2ZmMwLAorCTB4MTgxNCwgMHg4ODNiLCAweDcwMjMsIDB4ODU3NiwgMHg4Njc3LCAweGE4MGYsIDB4Nzg2ZSwgMHg4ODNlLAorCTB4YTgwYywgMHgyODJiLCAweGEyMDUsIDB4NjRhMCwgMHg2N2EwLCAweDZmYzAsIDB4MTgxNCwgMHg4ODNiLAorCTB4NzAyMywgMHg4NTc2LCAweDg2NzcsIDB4YTgwMSwgMHg4ODNlLCAweDIwNjksIDB4MjhjMSwgMHg5Y2MzLAorCTB4MjA0NCwgMHgyMTAzLCAweDIwYTIsIDB4MjA4MSwgMHhhOGRjLCAweGEyMDcsIDB4MDAxNCwgMHhhMjAzLAorCTB4ODAwMCwgMHg4NGE4LCAweDg1YTQsIDB4MTg3MiwgMHg4NDlhLCAweDg4M2MsIDB4MWZlMiwgMHhmNjAxLAorCTB4YTIwOCwgMHg4NTZlLCAweDg2NmYsIDB4MDcwNCwgMHgzMDA4LCAweDljYTAsIDB4MDAxNCwgMHhhMjAyLAorCTB4ODAwMCwgMHg4NWE0LCAweDMwMDksIDB4ODRhOCwgMHgxOWUyLCAweGY4NDgsIDB4ODE3NCwgMHg4NmViLAorCTB4ODVlYiwgMHg4NzJlLCAweDg3YTksIDB4ODgzZiwgMHgwOGU2LCAweGE4ZjEsIDB4Zjg2MSwgMHhhOGU4LAorCTB4ZjgwMSwgMHgwMDE0LCAweGY4ODEsIDB4MDAxNiwgMHg4NWIyLCAweDgwZjAsIDB4OTUzMiwgMHhmYWEyLAorCTB4MWRlMiwgMHgwMDE0LCAweDg1MzIsIDB4ZjIyMSwgMHgwMDE0LCAweDFkZTIsIDB4ODRhOCwgMHhkNmUwLAorCTB4MWZlNiwgMHgwMDE0LCAweGEyMDYsIDB4Njg2NSwgMHg4MTdmLCAweDg0MmEsIDB4MWRjMSwgMHg4ODIzLAorCTB4MDAxNiwgMHg2MDQyLCAweDgwMDgsIDB4YThmYSwgMHg4MDAwLCAweDg0YTQsIDB4ODE2MCwgMHg4NDJhLAorCTB4ZjAyMSwgMHgzMDA4LCAweDg0YTgsIDB4MWRjNiwgMHgyMGQ3LCAweDg4MjIsIDB4MDAxNiwgMHg4MDAwLAorCTB4Mjg0OCwgMHgxMDExLCAweGE4ZmMsIDB4MzAwOCwgMHg4MDAwLCAweGEwMDAsIDB4MjgwMiwgMHgxMDExLAorCTB4YThmZCwgMHhhODg3LCAweDMwMDgsIDB4MjgzZCwgMHgxMDExLCAweGE4ZmQsIDB4YTIwOSwgMHgwMDE3LAorCTB4MzAwYywgMHg4MDAwLCAweDg1YTQsIDB4MWRlMiwgMHhkYWMxLCAweDAwMTQsIDB4MjZlMCwgMHg4NzNhLAorCTB4ZmFhMiwgMHgxOWYyLCAweDFmZTIsIDB4MDAxNCwgMHhhMjBiLCAweDAwMTQsIDB4YTIwZCwgMHg4MTdlLAorCTB4ODQyYSwgMHg4NGEwLCAweDM4MDYsIDB4MDIxMCwgMHg5Y2NkLCAweDA3MDQsIDB4MDAwMCwgMHgxMjdlLAorCTB4MjA5MSwgMHgyMjAwLCAweDIwNDksIDB4MmVjNywgMHg3MDAwLCAweDcyMDQsIDB4YTIwNSwgMHg3MjBjLAorCTB4YTIxNSwgMHg3MDA4LCAweGEwODQsIDB4ZmZmZCwgMHhhMjA1LCAweDAwNDAsIDB4MmVkOSwgMHgwMDc4LAorCTB4MmVkZSwgMHg3MDAzLCAweDAwMDAsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4NzAwMCwgMHhhMDg0LAorCTB4MDAwMSwgMHgwMGMwLCAweDJmMGMsIDB4NzEwOCwgMHg4MTA0LCAweDAwYzgsIDB4MmVlYiwgMHgxMDc4LAorCTB4MmZhOCwgMHgwMDc4LCAweDJlZTMsIDB4NzAwYywgMHhhMDhjLCAweDAwN2YsIDB4MDA0MCwgMHgyZjBjLAorCTB4NzAwNCwgMHg4MDA0LCAweDAwYzgsIDB4MmYwMywgMHg3MDE0LCAweGEwMDUsIDB4MDBjMCwgMHgyZWZmLAorCTB4NzAxMCwgMHhhMDA1LCAweDAwNDAsIDB4MmYwMywgMHhhMTAyLCAweDAwYzgsIDB4MmVlMywgMHg3MDA3LAorCTB4MDAxMCwgMHgwMDc4LCAweDJmMGMsIDB4OGFmZiwgMHgwMDQwLCAweDJmMGMsIDB4MTA3OCwgMHgzMTZiLAorCTB4MDBjMCwgMHgyZjA2LCAweDAwNDAsIDB4MmVlMywgMHgxMDc4LCAweDJmNTYsIDB4NzAwMywgMHgwMDAwLAorCTB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4NjQyNCwgMHg4NGZmLCAweDAwNDAsIDB4MmYzMCwgMHgyYzcwLAorCTB4MjAzOSwgMHgyZjM1LCAweDI3MDQsIDB4YWU2OCwgMHg2ODBjLCAweGE2MzAsIDB4NjgwOCwgMHhhNTI5LAorCTB4ODQyMSwgMHgwMDQwLCAweDJmMzAsIDB4ODczOCwgMHgyNzA0LCAweGEwMDUsIDB4MDBjMCwgMHgyZjFiLAorCTB4NzA5OCwgMHhhMDc1LCAweDAwNDAsIDB4MmYzMCwgMHgyMDM5LCAweDJmMzIsIDB4MDA3OCwgMHgyZjFhLAorCTB4MDA3YywgMHgwMDAwLCAweDAwMDQsIDB4MDAwOCwgMHgwMDBjLCAweDAwMTAsIDB4MDAxNCwgMHgwMDE4LAorCTB4MDAxYywgMHgwMDAwLCAweDEyN2UsIDB4MjA5MSwgMHgyMjAwLCAweDIwNzksIDB4MzUwMCwgMHgyMDcxLAorCTB4MDAxMCwgMHg3MDA3LCAweDAwMGEsIDB4NzAwNywgMHgwMDAyLCAweDcwMDMsIDB4MDAwMCwgMHgyMDcxLAorCTB4MDAyMCwgMHg3MDA3LCAweDAwMGEsIDB4NzAwNywgMHgwMDAyLCAweDcwMDMsIDB4MDAwMCwgMHgyMDQ5LAorCTB4MDAwMCwgMHg3OGIzLCAweDAwMDAsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4MjA0OSwgMHgyZjU2LAorCTB4NzAwNCwgMHg4MDA0LCAweDAwYzgsIDB4MmY4MiwgMHg3MDA3LCAweDAwMTIsIDB4NzEwOCwgMHg3MDA4LAorCTB4YTEwNiwgMHgwMGMwLCAweDJmNWUsIDB4YTE4NCwgMHgwMDMwLCAweDAwNDAsIDB4MmY2YiwgMHhhMDg2LAorCTB4MDAzMCwgMHgwMGMwLCAweDJmNWUsIDB4NzAwMCwgMHhhMDg0LCAweDAwMDEsIDB4MDBjMCwgMHgyZjgyLAorCTB4NzAwOCwgMHhhMDg0LCAweDAwMGMsIDB4MDBjMCwgMHgyZjgwLCAweDcxMGMsIDB4YTE4NCwgMHgwMzAwLAorCTB4MDBjMCwgMHgyZjgwLCAweGExODQsIDB4MDA3ZiwgMHgwMGMwLCAweDJmNTYsIDB4MDA3OCwgMHgyZjgyLAorCTB4NjgxNywgMHgwMDAzLCAweDcwMDcsIDB4MDAxMiwgMHg3MDA3LCAweDAwMDgsIDB4NzAwNCwgMHhhMDg0LAorCTB4MDAwOCwgMHgwMGMwLCAweDJmODYsIDB4NzAwNywgMHgwMDEyLCAweDcxMDgsIDB4ODEwNCwgMHgwMDQ4LAorCTB4MmY4YiwgMHg3OGIzLCAweDAwMDAsIDB4NzAwMywgMHgwMDAwLCAweDIwNDksIDB4MDAwMCwgMHgwMDdjLAorCTB4MTA3ZSwgMHgwMDdlLCAweDEyN2UsIDB4MTU3ZSwgMHgyMDkxLCAweDIyMDAsIDB4NzEwOCwgMHgxMDc4LAorCTB4MmZhOCwgMHgxNTdmLCAweDEyN2YsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2YsIDB4MTA3ZiwgMHgwMDdjLAorCTB4NzIwNCwgMHgyMTE4LCAweDcxMDgsIDB4NzAwYywgMHhhMDg0LCAweDAzMDAsIDB4MDBjMCwgMHgyZmVhLAorCTB4YTE4NCwgMHgwMDBjLCAweDAwYzAsIDB4MmZlYSwgMHg4MjEzLCAweDgyMTMsIDB4ODIxMywgMHg4MjEzLAorCTB4YTI4NCwgMHgwMTAwLCAweGExMGQsIDB4ODEwYiwgMHg4MTBiLCAweDgxMGYsIDB4YTE4NCwgMHgwMDA3LAorCTB4MDA3OSwgMHgyZmMyLCAweDJmY2MsIDB4MmZkYywgMHgyZmVhLCAweDJmZGMsIDB4MmZmZSwgMHgyZmZlLAorCTB4MmZlYSwgMHgyZmZjLCAweDEwNzgsIDB4MWJhNSwgMHg3MDA3LCAweDAwMDIsIDB4OGFmZiwgMHgwMGMwLAorCTB4MmZkNSwgMHgyMDQ5LCAweDAwMDAsIDB4MDA3OCwgMHgyZmQ5LCAweDEwNzgsIDB4MzE2YiwgMHgwMGMwLAorCTB4MmZkNSwgMHg3OGIzLCAweDAwMDAsIDB4MDA3YywgMHg3MDA3LCAweDAwMDIsIDB4OGFmZiwgMHgwMGMwLAorCTB4MmZlMywgMHgwMDc4LCAweDJmZTcsIDB4MTA3OCwgMHgzMTZiLCAweDAwYzAsIDB4MmZlMywgMHg3OGIzLAorCTB4MDAwMCwgMHgwMDdjLCAweDcwMDcsIDB4MDAwMiwgMHgxMDc4LCAweDJmNTYsIDB4MTA3OCwgMHgyY2JiLAorCTB4NjgxNCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyZmY3LCAweDY4MTcsIDB4MDAwMiwgMHgwMDdjLAorCTB4MTA3OCwgMHgxYmE1LCAweDEwNzgsIDB4MWJhNSwgMHgxMDc4LCAweDMwNTAsIDB4NzIxMCwgMHg3MTE0LAorCTB4NzAwYywgMHhhMDljLCAweDAwN2YsIDB4MjgwMCwgMHhhMzAwLCAweGEyMTEsIDB4YTE4OSwgMHgwMDAwLAorCTB4NzhiMCwgMHhhMDA1LCAweDAwNDAsIDB4MzAxMCwgMHg3OGIzLCAweDAwMDAsIDB4MDA3OCwgMHgzMDMzLAorCTB4MTA3OCwgMHgzMDUwLCAweDI3MDQsIDB4MmM1OCwgMHhhYzYwLCAweDYzMGMsIDB4MjIwMCwgMHhhMzIyLAorCTB4NjMwOCwgMHgyMTAwLCAweGEzMWIsIDB4MjQwMCwgMHhhMzA1LCAweDAwNDAsIDB4MzAyOSwgMHgwMGM4LAorCTB4MzAyOSwgMHg4NDEyLCAweDgyMTAsIDB4ODMwYSwgMHhhMTg5LCAweDAwMDAsIDB4MmI2MCwgMHgwMDc4LAorCTB4MzAxMCwgMHgyYjYwLCAweDhhMDcsIDB4YTdiYSwgMHgyZjMyLCAweGE3M2QsIDB4MmMwMCwgMHg2ODgyLAorCTB4NmY4NiwgMHg2YzhlLCAweDZiOGEsIDB4NzAwNywgMHgwMDEyLCAweDEwNzgsIDB4MmY1NiwgMHgwMDdjLAorCTB4ODczOCwgMHgyNzA0LCAweGEwMDUsIDB4MDBjMCwgMHgzMDQ0LCAweDYwOTgsIDB4YTAwNSwgMHgwMDQwLAorCTB4MzA0ZCwgMHgyMDYwLCAweDIwMzksIDB4MmYzMiwgMHg4YTUxLCAweDAwNDAsIDB4MzA0YywgMHg3MDA4LAorCTB4YTA4NCwgMHgwMGMwLCAweGEwODYsIDB4MDBjMCwgMHgwMDdjLCAweDIwNTEsIDB4MDAwMCwgMHgwMDdjLAorCTB4OGE1MCwgMHg4NzM5LCAweDI3MDQsIDB4YTAwNCwgMHgwMGMwLCAweDMwNWQsIDB4MjAzOSwgMHgyZjM4LAorCTB4NjAwMCwgMHhhMDY0LCAweDAwYzAsIDB4MzA1ZCwgMHgyZDYwLCAweDAwN2MsIDB4MTI3ZSwgMHgwZDdlLAorCTB4MjA5MSwgMHgyMjAwLCAweDBkN2YsIDB4Njg4MCwgMHgyMDYwLCAweDY4ODQsIDB4NmI4OCwgMHg2YzhjLAorCTB4ODA1NywgMHhhYWQ0LCAweDAwZmYsIDB4YTA4NCwgMHgwMGZmLCAweGEwYjgsIDB4MmYzMiwgMHg3ZTA4LAorCTB4YTZiNSwgMHgwMDBjLCAweDY4MTgsIDB4YTA4NCwgMHgwMDQwLCAweDAwNDAsIDB4MzA3OSwgMHhhNmI1LAorCTB4MDAwMSwgMHgwZjdlLCAweDIwNzksIDB4MDEwMCwgMHg3ODU4LCAweDBmN2YsIDB4YTA4NCwgMHgwMDQwLAorCTB4MDA0MCwgMHgzMDg4LCAweGE2ODQsIDB4MDAwMSwgMHgwMGMwLCAweDMwODgsIDB4YTZiNSwgMHgwMDAxLAorCTB4NzAwNywgMHgwMDA0LCAweDcwMDQsIDB4YTA4NCwgMHgwMDA0LCAweDAwYzAsIDB4MzA4YSwgMHg3MDAwLAorCTB4YTAwNSwgMHgwMDQwLCAweDMwOTUsIDB4MTA3OCwgMHgxYmE1LCAweDI0MDAsIDB4YTMwNSwgMHgwMGMwLAorCTB4MzA5YiwgMHgwMDc4LCAweDMwZDgsIDB4MmM1OCwgMHgyNzA0LCAweGFjNjAsIDB4NjAwNCwgMHhhNDAwLAorCTB4MDA3ZSwgMHg3MDFhLCAweDYwMDAsIDB4YTMwMSwgMHg3MDFlLCAweDIwMDksIDB4MDRmZCwgMHgyMTA0LAorCTB4YTA4NiwgMHgwNGZkLCAweDAwN2YsIDB4MDBjMCwgMHgzMGM4LCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLAorCTB4MzBjOCwgMHhhNjg0LCAweDAwMDEsIDB4MDBjMCwgMHgzMGM4LCAweDcwMTMsIDB4MDAwMSwgMHg3MDE3LAorCTB4MDAwMCwgMHg3NjAyLCAweDcwMDcsIDB4MDAwMSwgMHg3OGIzLCAweDAwMDEsIDB4YTRhMCwgMHgwMDAxLAorCTB4YTM5OSwgMHgwMDAwLCAweDYwMDQsIDB4YTQwMCwgMHg3MDFhLCAweDYwMDAsIDB4YTMwMSwgMHg3MDFlLAorCTB4NjIwYywgMHgyNDAwLCAweGEyMDIsIDB4NzAxMiwgMHg2MjA4LCAweDIzMDAsIDB4YTIwMywgMHg3MDE2LAorCTB4NzYwMiwgMHg3MDA3LCAweDAwMDEsIDB4MmI2MCwgMHgxMDc4LCAweDMwMzgsIDB4MDA3OCwgMHgzMGRhLAorCTB4MTA3OCwgMHgzMTZiLCAweDAwYzAsIDB4MzBkOCwgMHgxMjdmLCAweDIwMDAsIDB4MDA3YywgMHgxMjdlLAorCTB4MGQ3ZSwgMHgyMDkxLCAweDIyMDAsIDB4MGQ3ZiwgMHg3MDA3LCAweDAwMDQsIDB4NzAwNCwgMHhhMDg0LAorCTB4MDAwNCwgMHgwMGMwLCAweDMwZTYsIDB4NzAwMywgMHgwMDA4LCAweDEyN2YsIDB4MjAwMCwgMHgwMDdjLAorCTB4MTI3ZSwgMHgwZDdlLCAweDIwOTEsIDB4MjIwMCwgMHgwZDdmLCAweDIwNDksIDB4MzBmMCwgMHg3MDA3LAorCTB4MDAwNCwgMHg3MDA0LCAweGEwODQsIDB4MDAwNCwgMHgwMGMwLCAweDMwZjksIDB4NzAwMCwgMHhhMDA1LAorCTB4MDA0MCwgMHgzMTA0LCAweDEwNzgsIDB4MWJhNSwgMHg3ZTA4LCAweGE2YjUsIDB4MDAwYywgMHg2ODE4LAorCTB4YTA4NCwgMHgwMDQwLCAweDAwNDAsIDB4MzEwZSwgMHhhNmI1LCAweDAwMDEsIDB4NjgyNCwgMHhhMDA1LAorCTB4MDA0MCwgMHgzMTFhLCAweDIwNTAsIDB4MjAzOSwgMHgyZjM1LCAweDJkNjAsIDB4MTA3OCwgMHgzMTZiLAorCTB4MDBjMCwgMHgzMTE2LCAweDEyN2YsIDB4MjAwMCwgMHgwMDdjLCAweDEyN2UsIDB4MDA3ZSwgMHgwMTdlLAorCTB4MGQ3ZSwgMHgyMDkxLCAweDIyMDAsIDB4MGQ3ZiwgMHgwMzdmLCAweDA0N2YsIDB4N2UwOCwgMHhhNmI1LAorCTB4MDAwYywgMHg2ODE4LCAweGEwODQsIDB4MDA0MCwgMHgwMDQwLCAweDMxMzAsIDB4YTZiNSwgMHgwMDAxLAorCTB4MjA0OSwgMHgzMTFkLCAweDY4MjQsIDB4YTA1NSwgMHgwMDQwLCAweDMxNjgsIDB4MmQ3MCwgMHgyZTYwLAorCTB4MjAzOSwgMHgyZjM1LCAweDI3MDQsIDB4YWU2OCwgMHg2ODBjLCAweGE0MjIsIDB4NjgwOCwgMHhhMzFiLAorCTB4MDA0OCwgMHgzMTU1LCAweDhhNTEsIDB4MDBjMCwgMHgzMTQ3LCAweDEwNzgsIDB4MWJhNSwgMHg4NzM4LAorCTB4MjcwNCwgMHhhMDA1LCAweDAwYzAsIDB4MzEzYiwgMHg3MDk4LCAweGEwNzUsIDB4MjA2MCwgMHgwMDQwLAorCTB4MzE2OCwgMHgyMDM5LCAweDJmMzIsIDB4MDA3OCwgMHgzMTNhLCAweDg0MjIsIDB4ODQyMCwgMHg4MzFhLAorCTB4YTM5OSwgMHgwMDAwLCAweDY5MGMsIDB4MjQwMCwgMHhhMTIyLCAweDY5MDgsIDB4MjMwMCwgMHhhMTFiLAorCTB4MDBjOCwgMHgzMTY0LCAweDEwNzgsIDB4MWJhNSwgMHgyMDcxLCAweDAwMjAsIDB4MDA3OCwgMHgzMDg4LAorCTB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4NzAwOCwgMHhhMDg0LCAweDAwYzAsIDB4YTA4NiwgMHgwMGMwLAorCTB4MDA0MCwgMHgzMTkzLCAweDI3MDQsIDB4YWMwOCwgMHgyMTA0LCAweDcwMWUsIDB4ODEwOCwgMHgyMTA0LAorCTB4NzAxYSwgMHg4MTA4LCAweDIxMDQsIDB4NzAxNiwgMHg4MTA4LCAweDIxMDQsIDB4NzAxMiwgMHgwZjdlLAorCTB4MjA3OSwgMHgwMTAwLCAweDc4NTgsIDB4MGY3ZiwgMHhhMDg0LCAweDAwNDAsIDB4MDA0MCwgMHgzMThlLAorCTB4YTY4NCwgMHgwMDAxLCAweDAwYzAsIDB4MzE4ZSwgMHhhNmI1LCAweDAwMDEsIDB4NzYwMiwgMHg3MDA3LAorCTB4MDAwMSwgMHgxMDc4LCAweDMwMzgsIDB4MDA3YywgMHgxMjdlLCAweDAwN2UsIDB4MGQ3ZSwgMHgyMDkxLAorCTB4MjIwMCwgMHgyMDQ5LCAweDMxOTQsIDB4MGQ3ZiwgMHgwODdmLCAweDcxMDgsIDB4YTE4NCwgMHgwMGMwLAorCTB4MDBjMCwgMHgzMWFhLCAweDY4MjQsIDB4YTAwNSwgMHgwMDQwLCAweDMxYmEsIDB4MDA3OCwgMHgyZWRlLAorCTB4MDA3OCwgMHgzMWJhLCAweDcxMDgsIDB4ODEwNCwgMHgwMGM4LCAweDMxYjIsIDB4MTA3OCwgMHgyZmE4LAorCTB4MDA3OCwgMHgzMTlkLCAweDcwMDcsIDB4MDAxMCwgMHg3MTA4LCAweDgxMDQsIDB4MDBjOCwgMHgzMWI0LAorCTB4MTA3OCwgMHgyZmE4LCAweDcwMDgsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4MzE5ZCwgMHg3MDAwLAorCTB4YTAwNSwgMHgwMGMwLCAweDMxOWQsIDB4NzAwMywgMHgwMDAwLCAweDIwNDksIDB4MDAwMCwgMHgxMjdmLAorCTB4MjAwMCwgMHgwMDdjLCAweDEyN2UsIDB4MTQ3ZSwgMHgxMzdlLCAweDE1N2UsIDB4MGQ3ZSwgMHgyMDkxLAorCTB4MjIwMCwgMHgwZDdmLCAweDIwNDksIDB4MzFjYSwgMHhhZDgwLCAweDAwMTAsIDB4MjBhMCwgMHgyMDk5LAorCTB4MDAzMSwgMHg3MDBjLCAweGEwODQsIDB4MDA3ZiwgMHg2ODI2LCAweDcwMDcsIDB4MDAwOCwgMHg3MDA3LAorCTB4MDAwMiwgMHg3MDAzLCAweDAwMDEsIDB4MDA0MCwgMHgzMWU4LCAweDgwMDAsIDB4ODBhYywgMHg1M2E1LAorCTB4NzAwNywgMHgwMDA0LCAweDcwMDQsIDB4YTA4NCwgMHgwMDA0LCAweDAwYzAsIDB4MzFlYSwgMHgyMDQ5LAorCTB4MDAwMCwgMHg3MDAzLCAweDAwMDAsIDB4MTU3ZiwgMHgxMzdmLCAweDE0N2YsIDB4MTI3ZiwgMHgyMDAwLAorCTB4MDA3YywgMHgxMjdlLCAweDAwN2UsIDB4MGQ3ZSwgMHgyMDkxLCAweDIyMDAsIDB4MGQ3ZiwgMHgyMDQ5LAorCTB4MzFmOSwgMHg2ODgwLCAweDIwNjAsIDB4Njg4NCwgMHg2Yjg4LCAweDZjOGMsIDB4ODA1NywgMHhhYWQ0LAorCTB4MDBmZiwgMHhhMDg0LCAweDAwZmYsIDB4YTBiOCwgMHgyZjMyLCAweDdlMDgsIDB4YTZiNSwgMHgwMDA0LAorCTB4NzAwNywgMHgwMDA0LCAweDcwMDQsIDB4YTA4NCwgMHgwMDA0LCAweDAwYzAsIDB4MzIxMiwgMHgyYzU4LAorCTB4MjcwNCwgMHhhYzYwLCAweDYwMDQsIDB4YTQwMCwgMHg3MDFhLCAweDYwMDAsIDB4YTMwMSwgMHg3MDFlLAorCTB4NzAxMywgMHgwMDAxLCAweDcwMTcsIDB4MDAwMCwgMHg3NjAyLCAweDcwMDcsIDB4MDAwMSwgMHgwMDdmLAorCTB4ODAwNywgMHgyMDA5LCAweDAwMzEsIDB4MjAwYSwgMHgwMGEwLCAweDMyMmMsIDB4NzEwOCwgMHg3MDA3LAorCTB4MDAwMiwgMHg4MTBjLCAweDAwYzgsIDB4MzIyYywgMHg4MTBjLCAweDAwNDgsIDB4MzIzOSwgMHgwMDc4LAorCTB4MmZlYSwgMHhhNGEwLCAweDAwMDEsIDB4YTM5OSwgMHgwMDAwLCAweDZiOGEsIDB4NmM4ZSwgMHg3MDA3LAorCTB4MDAwNCwgMHgyMDQ5LCAweDAwMDAsIDB4NzAwMywgMHgwMDAwLCAweDEyN2YsIDB4MjAwMCwgMHgwMDdjLAorCTB4MjBhOSwgMHgwMDEwLCAweGEwMDYsIDB4ODAwNCwgMHg4MDg2LCAweDgxOGUsIDB4MDBjOCwgMHgzMjUxLAorCTB4YTIwMCwgMHgwMGYwLCAweDMyNGMsIDB4ODA4NiwgMHg4MThlLCAweDAwN2MsIDB4MTU3ZSwgMHgyMGE5LAorCTB4MDAxMCwgMHhhMDA1LCAweDAwNDAsIDB4MzI3NywgMHhhMTFhLCAweDAwYzgsIDB4MzI3NywgMHg4MjEzLAorCTB4ODE4ZCwgMHgwMDQ4LCAweDMyNmEsIDB4YTExYSwgMHgwMGM4LCAweDMyNmIsIDB4MDBmMCwgMHgzMjVmLAorCTB4MDA3OCwgMHgzMjZmLCAweGExMWEsIDB4MjMwOCwgMHg4MjEwLCAweDAwZjAsIDB4MzI1ZiwgMHgwMDdlLAorCTB4MzIwMCwgMHhhMDg0LCAweGY3ZmYsIDB4MjA4MCwgMHgwMDdmLCAweDE1N2YsIDB4MDA3YywgMHgwMDdlLAorCTB4MzIwMCwgMHhhMDg1LCAweDA4MDAsIDB4MDA3OCwgMHgzMjczLCAweDAwZTAsIDB4MzJiZiwgMHgyMDkxLAorCTB4NjAwMCwgMHg3ODIwLCAweDgwMDEsIDB4NzgyMiwgMHgwMGMwLCAweDMyYjksIDB4NzgyNCwgMHg3ODIyLAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNjksIDB4MzU0MCwgMHg2ODAwLCAweGEwODQsIDB4MDAwNywgMHgwMDQwLAorCTB4MzJhMSwgMHhhMDg2LCAweDAwMDIsIDB4MDA0MCwgMHgzMmExLCAweDY4MzAsIDB4YTAwZCwgMHgwMDQwLAorCTB4MzJhMSwgMHgyMTA0LCAweGEwMDUsIDB4MDA0MCwgMHgzMmExLCAweDgwMDEsIDB4MjAwYSwgMHgwMDQwLAorCTB4MzM2ZiwgMHgyMDYxLCAweDM2ODAsIDB4MjBhOSwgMHgwMDgwLCAweDYwMzQsIDB4YTAwNSwgMHgwMDQwLAorCTB4MzJiMywgMHg4MDAxLCAweDYwMzYsIDB4MDBjMCwgMHgzMmIzLCAweDYwMTAsIDB4YTAwNSwgMHgwMDQwLAorCTB4MzJiMywgMHgxMDc4LCAweDFhMTksIDB4YWNlMCwgMHgwMDEwLCAweDAwNzAsIDB4MzJiOSwgMHgwMDc4LAorCTB4MzJhNSwgMHgxMDc4LCAweDMyZDQsIDB4MTA3OCwgMHgzMmMyLCAweDEwNzgsIDB4MzJmOSwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDdjLCAweDc4M2MsIDB4ODAwMSwgMHg3ODNlLCAweDAwYzAsIDB4MzJkMywgMHg3ODQwLAorCTB4NzgzZSwgMHg3ODQ4LCAweGEwMDUsIDB4MDA0MCwgMHgzMmQzLCAweDgwMDEsIDB4Nzg0YSwgMHgwMGMwLAorCTB4MzJkMywgMHgxMDc4LCAweDFhMTksIDB4MDA3YywgMHg3ODM0LCAweDgwMDEsIDB4NzgzNiwgMHgwMGMwLAorCTB4MzJmOCwgMHg3ODM4LCAweDc4MzYsIDB4MjA5MSwgMHg4MDAwLCAweDc4NDQsIDB4YTAwNSwgMHgwMGMwLAorCTB4MzJlMywgMHgyMDAxLCAweDAxMDEsIDB4ODAwMSwgMHg3ODQ2LCAweGEwODAsIDB4M2U4MCwgMHgyMDQwLAorCTB4MjAwNCwgMHhhMDY1LCAweDAwNDAsIDB4MzJmOCwgMHg2MDIwLCAweGEwMDUsIDB4MDA0MCwgMHgzMmY0LAorCTB4ODAwMSwgMHg2MDIyLCAweDAwNDAsIDB4MzMyOCwgMHg2MDAwLCAweDJjNDAsIDB4MDA3OCwgMHgzMmU5LAorCTB4MDA3YywgMHg3ODI4LCAweDgwMDEsIDB4NzgyYSwgMHgwMGMwLCAweDMzMjcsIDB4NzgyYywgMHg3ODJhLAorCTB4NzgzMCwgMHhhMDA1LCAweDAwYzAsIDB4MzMwNiwgMHgyMDAxLCAweDAwODAsIDB4ODAwMSwgMHg3ODMyLAorCTB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMDkwLCAweDM2ODAsIDB4YTI5OCwgMHgwMDAyLAorCTB4MjMwNCwgMHhhMDg0LCAweDAwMDgsIDB4MDA0MCwgMHgzMzI3LCAweGEyOTAsIDB4MDAwOSwgMHgyMjA0LAorCTB4YTAwNSwgMHgwMDQwLCAweDMzMWYsIDB4ODAwMSwgMHgyMDEyLCAweDAwYzAsIDB4MzMyNywgMHgyMzA0LAorCTB4YTA4NCwgMHhmZmY3LCAweGEwODUsIDB4MDA4MCwgMHgyMDFhLCAweDEwNzgsIDB4MWExOSwgMHgwMDdjLAorCTB4MjA2OSwgMHgzNTQwLCAweDY4MDAsIDB4YTAwNSwgMHgwMDQwLCAweDMzMzIsIDB4NjgzYywgMHhhYzA2LAorCTB4MDA0MCwgMHgzMzZmLCAweDYwMTcsIDB4MDAwNiwgMHg2MGIwLCAweGEwODQsIDB4M2YwMCwgMHg2MDFhLAorCTB4NjAxYywgMHhhMDg0LCAweDAwZmYsIDB4YTA4NSwgMHgwMDYwLCAweDYwMWUsIDB4NjAwMCwgMHgyMDQyLAorCTB4NjcxMCwgMHg2ZmI2LCAweDEwNzgsIDB4MTY5MiwgMHg2ODE4LCAweGEwMDUsIDB4MDA0MCwgMHgzMzRhLAorCTB4ODAwMSwgMHg2ODFhLCAweDY4MDgsIDB4YTA4NCwgMHhmZmVmLCAweDY4MGEsIDB4NjgxMCwgMHg4MDAxLAorCTB4MDBkMCwgMHgzMzU0LCAweDEwNzgsIDB4MWJhNSwgMHg2ODEyLCAweDYwMmYsIDB4MDAwMCwgMHg2MDJiLAorCTB4MDAwMCwgMHgyYzY4LCAweDEwNzgsIDB4MTdkZCwgMHgyMDY5LCAweDM1NDAsIDB4MjAwMSwgMHgwMDA2LAorCTB4NjhhMiwgMHg3OTQ0LCAweGExODQsIDB4MDEwMCwgMHgwMGMwLCAweDMzNmEsIDB4NjliYSwgMHgyMDAxLAorCTB4MDAwNCwgMHg2OGEyLCAweDEwNzgsIDB4MWExNCwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHgyMDA5LAorCTB4MzU0ZiwgMHgyMTY0LCAweDIwNjksIDB4MDEwMCwgMHgxMDc4LCAweDFiNmIsIDB4NjAxNywgMHgwMDA2LAorCTB4Njg1OCwgMHhhMDg0LCAweDNmMDAsIDB4NjAxYSwgMHg2MDFjLCAweGEwODQsIDB4MDBmZiwgMHhhMDg1LAorCTB4MDA0OCwgMHg2MDFlLCAweDYwMmYsIDB4MDAwMCwgMHg2MDJiLCAweDAwMDAsIDB4NjgzMCwgMHhhMDg0LAorCTB4MDA0MCwgMHgwMDQwLCAweDMzYWIsIDB4Njg0YiwgMHgwMDA0LCAweDIwYTksIDB4MDAxNCwgMHg2ODQ4LAorCTB4YTA4NCwgMHgwMDA0LCAweDAwNDAsIDB4MzM5OCwgMHgwMDcwLCAweDMzOTgsIDB4MDA3OCwgMHgzMzhmLAorCTB4Njg0YiwgMHgwMDA5LCAweDIwYTksIDB4MDAxNCwgMHg2ODQ4LCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLAorCTB4MzNhNSwgMHgwMDcwLCAweDMzYTUsIDB4MDA3OCwgMHgzMzljLCAweDIwYTksIDB4MDBmYSwgMHgwMDcwLAorCTB4MzNhYiwgMHgwMDc4LCAweDMzYTcsIDB4NjgwOCwgMHhhMDg0LCAweGZmZmQsIDB4NjgwYSwgMHg2ODFiLAorCTB4MDA0NiwgMHgyMDA5LCAweDM1NjgsIDB4MjAwYiwgMHgwMDA3LCAweDc4NGMsIDB4Nzg0YSwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDdjLCAweDIwNzksIDB4MzUwMCwgMHgxMDc4LCAweDM0MDMsIDB4MTA3OCwgMHgzM2NiLAorCTB4MTA3OCwgMHgzM2UwLCAweDEwNzgsIDB4MzNmNSwgMHg3ODMzLCAweDAwMDAsIDB4Nzg0NywgMHgwMDAwLAorCTB4Nzg0YiwgMHgwMDAwLCAweDAwN2MsIDB4MjAxOSwgMHgwMDBhLCAweDIwMTEsIDB4MzU0NiwgMHgyMjA0LAorCTB4YTA4NiwgMHgwMDMyLCAweDAwNDAsIDB4MzNkZCwgMHgyMDE5LCAweDAwMGMsIDB4MjIwNCwgMHhhMDg2LAorCTB4MDAzYywgMHgwMDQwLCAweDMzZGQsIDB4MjAxOSwgMHgwMDA4LCAweDdiMmEsIDB4N2IyZSwgMHgwMDdjLAorCTB4MjAxOSwgMHgwMDMwLCAweDIwMTEsIDB4MzU0NiwgMHgyMjA0LCAweGEwODYsIDB4MDAzMiwgMHgwMDQwLAorCTB4MzNmMiwgMHgyMDE5LCAweDAwMzksIDB4MjIwNCwgMHhhMDg2LCAweDAwM2MsIDB4MDA0MCwgMHgzM2YyLAorCTB4MjAxOSwgMHgwMDI3LCAweDdiMzYsIDB4N2IzYSwgMHgwMDdjLCAweDIwMTksIDB4MDAwZCwgMHgyMDExLAorCTB4MzU0NiwgMHgyMjA0LCAweGEwODYsIDB4MDAzYywgMHgwMDQwLCAweDM0MDAsIDB4MjAxOSwgMHgwMDBhLAorCTB4N2IzZSwgMHg3YjQyLCAweDAwN2MsIDB4MjAxOSwgMHgyZmFmLCAweDIwMTEsIDB4MzU0NiwgMHgyMjA0LAorCTB4YTA4NiwgMHgwMDMyLCAweDAwNDAsIDB4MzQxNSwgMHgyMDE5LCAweDM5NzEsIDB4MjIwNCwgMHhhMDg2LAorCTB4MDAzYywgMHgwMDQwLCAweDM0MTUsIDB4MjAxOSwgMHgyNjI2LCAweDdiMjIsIDB4N2IyNiwgMHgwMDdjLAorCTB4OTJhNworfTsKK3Vuc2lnbmVkIHNob3J0IHNidXNfcmlzY19jb2RlX2xlbmd0aDAxID0gMHgyNDE5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NhdGFfbnYuYyBiL2RyaXZlcnMvc2NzaS9zYXRhX252LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkwMDlmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zYXRhX252LmMKQEAgLTAsMCArMSw1NzAgQEAKKy8qCisgKiAgc2F0YV9udi5jIC0gTlZJRElBIG5Gb3JjZSBTQVRBCisgKgorICogIENvcHlyaWdodCAyMDA0IE5WSURJQSBDb3JwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICBDb3B5cmlnaHQgMjAwNCBBbmRyZXcgQ2hldworICoKKyAqICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBPcGVuCisgKiAgU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMSB0aGF0IGNhbiBiZSBmb3VuZCBhdAorICogIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLTEuMS50eHQgYW5kIGlzIGluY2x1ZGVkIGhlcmVpbgorICogIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpIGFzIGRpc3RyaWJ1dGVkCisgKiAgaW4gdGhlIGtlcm5lbCBzb3VyY2UgQ09QWUlORyBmaWxlLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mCisgKiAgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZSBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93CisgKiAgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgorICogIHRoZSBPU0wsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kCisgKiAgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLgorICogIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIKKyAqICB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE9TTCBvciB0aGUgR1BMLgorICoKKyAqICAwLjA2CisgKiAgICAgLSBBZGRlZCBnZW5lcmljIFNBVEEgc3VwcG9ydCBieSB1c2luZyBhIHBjaV9kZXZpY2VfaWQgdGhhdCBmaWx0ZXJzIG9uCisgKiAgICAgICB0aGUgSURFIHN0b3JhZ2UgY2xhc3MgY29kZS4KKyAqCisgKiAgMC4wMworICogICAgIC0gRml4ZWQgYSBidWcgd2hlcmUgdGhlIGhvdHBsdWcgaGFuZGxlcnMgZm9yIG5vbi1DSzgwNC9NQ1AwNCB3ZXJlIHVzaW5nCisgKiAgICAgICBtbWlvX2Jhc2UsIHdoaWNoIGlzIG9ubHkgc2V0IGZvciB0aGUgQ0s4MDQvTUNQMDQgY2FzZS4KKyAqCisgKiAgMC4wMgorICogICAgIC0gQWRkZWQgc3VwcG9ydCBmb3IgQ0s4MDQgU0FUQSBjb250cm9sbGVyLgorICoKKyAqICAwLjAxCisgKiAgICAgLSBJbml0aWFsIHJldmlzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KKworI2RlZmluZSBEUlZfTkFNRQkJCSJzYXRhX252IgorI2RlZmluZSBEUlZfVkVSU0lPTgkJCSIwLjYiCisKKyNkZWZpbmUgTlZfUE9SVFMJCQkyCisjZGVmaW5lIE5WX1BJT19NQVNLCQkJMHgxZgorI2RlZmluZSBOVl9NV0RNQV9NQVNLCQkJMHgwNworI2RlZmluZSBOVl9VRE1BX01BU0sJCQkweDdmCisjZGVmaW5lIE5WX1BPUlQwX1NDUl9SRUdfT0ZGU0VUCQkweDAwCisjZGVmaW5lIE5WX1BPUlQxX1NDUl9SRUdfT0ZGU0VUCQkweDQwCisKKyNkZWZpbmUgTlZfSU5UX1NUQVRVUwkJCTB4MTAKKyNkZWZpbmUgTlZfSU5UX1NUQVRVU19DSzgwNAkJMHg0NDAKKyNkZWZpbmUgTlZfSU5UX1NUQVRVU19QREVWX0lOVAkJMHgwMQorI2RlZmluZSBOVl9JTlRfU1RBVFVTX1BERVZfUE0JCTB4MDIKKyNkZWZpbmUgTlZfSU5UX1NUQVRVU19QREVWX0FEREVECTB4MDQKKyNkZWZpbmUgTlZfSU5UX1NUQVRVU19QREVWX1JFTU9WRUQJMHgwOAorI2RlZmluZSBOVl9JTlRfU1RBVFVTX1NERVZfSU5UCQkweDEwCisjZGVmaW5lIE5WX0lOVF9TVEFUVVNfU0RFVl9QTQkJMHgyMAorI2RlZmluZSBOVl9JTlRfU1RBVFVTX1NERVZfQURERUQJMHg0MAorI2RlZmluZSBOVl9JTlRfU1RBVFVTX1NERVZfUkVNT1ZFRAkweDgwCisjZGVmaW5lIE5WX0lOVF9TVEFUVVNfUERFVl9IT1RQTFVHCShOVl9JTlRfU1RBVFVTX1BERVZfQURERUQgfCBcCisJCQkJCU5WX0lOVF9TVEFUVVNfUERFVl9SRU1PVkVEKQorI2RlZmluZSBOVl9JTlRfU1RBVFVTX1NERVZfSE9UUExVRwkoTlZfSU5UX1NUQVRVU19TREVWX0FEREVEIHwgXAorCQkJCQlOVl9JTlRfU1RBVFVTX1NERVZfUkVNT1ZFRCkKKyNkZWZpbmUgTlZfSU5UX1NUQVRVU19IT1RQTFVHCQkoTlZfSU5UX1NUQVRVU19QREVWX0hPVFBMVUcgfCBcCisJCQkJCU5WX0lOVF9TVEFUVVNfU0RFVl9IT1RQTFVHKQorCisjZGVmaW5lIE5WX0lOVF9FTkFCTEUJCQkweDExCisjZGVmaW5lIE5WX0lOVF9FTkFCTEVfQ0s4MDQJCTB4NDQxCisjZGVmaW5lIE5WX0lOVF9FTkFCTEVfUERFVl9NQVNLCQkweDAxCisjZGVmaW5lIE5WX0lOVF9FTkFCTEVfUERFVl9QTQkJMHgwMgorI2RlZmluZSBOVl9JTlRfRU5BQkxFX1BERVZfQURERUQJMHgwNAorI2RlZmluZSBOVl9JTlRfRU5BQkxFX1BERVZfUkVNT1ZFRAkweDA4CisjZGVmaW5lIE5WX0lOVF9FTkFCTEVfU0RFVl9NQVNLCQkweDEwCisjZGVmaW5lIE5WX0lOVF9FTkFCTEVfU0RFVl9QTQkJMHgyMAorI2RlZmluZSBOVl9JTlRfRU5BQkxFX1NERVZfQURERUQJMHg0MAorI2RlZmluZSBOVl9JTlRfRU5BQkxFX1NERVZfUkVNT1ZFRAkweDgwCisjZGVmaW5lIE5WX0lOVF9FTkFCTEVfUERFVl9IT1RQTFVHCShOVl9JTlRfRU5BQkxFX1BERVZfQURERUQgfCBcCisJCQkJCU5WX0lOVF9FTkFCTEVfUERFVl9SRU1PVkVEKQorI2RlZmluZSBOVl9JTlRfRU5BQkxFX1NERVZfSE9UUExVRwkoTlZfSU5UX0VOQUJMRV9TREVWX0FEREVEIHwgXAorCQkJCQlOVl9JTlRfRU5BQkxFX1NERVZfUkVNT1ZFRCkKKyNkZWZpbmUgTlZfSU5UX0VOQUJMRV9IT1RQTFVHCQkoTlZfSU5UX0VOQUJMRV9QREVWX0hPVFBMVUcgfCBcCisJCQkJCU5WX0lOVF9FTkFCTEVfU0RFVl9IT1RQTFVHKQorCisjZGVmaW5lIE5WX0lOVF9DT05GSUcJCQkweDEyCisjZGVmaW5lIE5WX0lOVF9DT05GSUdfTUVUSEQJCTB4MDEgLy8gMCA9IElOVCwgMSA9IFNNSQorCisvLyBGb3IgUENJIGNvbmZpZyByZWdpc3RlciAyMAorI2RlZmluZSBOVl9NQ1BfU0FUQV9DRkdfMjAJCTB4NTAKKyNkZWZpbmUgTlZfTUNQX1NBVEFfQ0ZHXzIwX1NBVEFfU1BBQ0VfRU4JMHgwNAorCitzdGF0aWMgaW50IG52X2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgbnZfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCisJCQkJIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB1MzIgbnZfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpOworc3RhdGljIHZvaWQgbnZfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKTsKK3N0YXRpYyB2b2lkIG52X2hvc3Rfc3RvcCAoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpOworc3RhdGljIHZvaWQgbnZfZW5hYmxlX2hvdHBsdWcoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCk7CitzdGF0aWMgdm9pZCBudl9kaXNhYmxlX2hvdHBsdWcoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpOworc3RhdGljIHZvaWQgbnZfY2hlY2tfaG90cGx1ZyhzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCk7CitzdGF0aWMgdm9pZCBudl9lbmFibGVfaG90cGx1Z19jazgwNChzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50KTsKK3N0YXRpYyB2b2lkIG52X2Rpc2FibGVfaG90cGx1Z19jazgwNChzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCk7CitzdGF0aWMgdm9pZCBudl9jaGVja19ob3RwbHVnX2NrODA0KHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KTsKKworZW51bSBudl9ob3N0X3R5cGUKK3sKKwlHRU5FUklDLAorCU5GT1JDRTIsCisJTkZPUkNFMywKKwlDSzgwNAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG52X3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0UyU19TQVRBLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBORk9SQ0UyIH0sCisJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFM1NfU0FUQSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTkZPUkNFMyB9LAorCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTNTX1NBVEEyLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBORk9SQ0UzIH0sCisJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX0NLODA0X1NBVEEsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENLODA0IH0sCisJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX0NLODA0X1NBVEEyLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSzgwNCB9LAorCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1AwNF9TQVRBLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSzgwNCB9LAorCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1AwNF9TQVRBMiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0s4MDQgfSwKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfQU5ZX0lELAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAorCQlQQ0lfQ0xBU1NfU1RPUkFHRV9JREU8PDgsIDB4ZmZmZjAwLCBHRU5FUklDIH0sCisJeyAwLCB9IC8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworCisjZGVmaW5lIE5WX0hPU1RfRkxBR1NfU0NSX01NSU8JMHgwMDAwMDAwMQorCitzdHJ1Y3QgbnZfaG9zdF9kZXNjCit7CisJZW51bSBudl9ob3N0X3R5cGUJaG9zdF90eXBlOworCXZvaWQJCQkoKmVuYWJsZV9ob3RwbHVnKShzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50KTsKKwl2b2lkCQkJKCpkaXNhYmxlX2hvdHBsdWcpKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KTsKKwl2b2lkCQkJKCpjaGVja19ob3RwbHVnKShzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCk7CisKK307CitzdGF0aWMgc3RydWN0IG52X2hvc3RfZGVzYyBudl9kZXZpY2VfdGJsW10gPSB7CisJeworCQkuaG9zdF90eXBlCT0gR0VORVJJQywKKwkJLmVuYWJsZV9ob3RwbHVnCT0gTlVMTCwKKwkJLmRpc2FibGVfaG90cGx1Zz0gTlVMTCwKKwkJLmNoZWNrX2hvdHBsdWcJPSBOVUxMLAorCX0sCisJeworCQkuaG9zdF90eXBlCT0gTkZPUkNFMiwKKwkJLmVuYWJsZV9ob3RwbHVnCT0gbnZfZW5hYmxlX2hvdHBsdWcsCisJCS5kaXNhYmxlX2hvdHBsdWc9IG52X2Rpc2FibGVfaG90cGx1ZywKKwkJLmNoZWNrX2hvdHBsdWcJPSBudl9jaGVja19ob3RwbHVnLAorCX0sCisJeworCQkuaG9zdF90eXBlCT0gTkZPUkNFMywKKwkJLmVuYWJsZV9ob3RwbHVnCT0gbnZfZW5hYmxlX2hvdHBsdWcsCisJCS5kaXNhYmxlX2hvdHBsdWc9IG52X2Rpc2FibGVfaG90cGx1ZywKKwkJLmNoZWNrX2hvdHBsdWcJPSBudl9jaGVja19ob3RwbHVnLAorCX0sCisJewkuaG9zdF90eXBlCT0gQ0s4MDQsCisJCS5lbmFibGVfaG90cGx1Zwk9IG52X2VuYWJsZV9ob3RwbHVnX2NrODA0LAorCQkuZGlzYWJsZV9ob3RwbHVnPSBudl9kaXNhYmxlX2hvdHBsdWdfY2s4MDQsCisJCS5jaGVja19ob3RwbHVnCT0gbnZfY2hlY2tfaG90cGx1Z19jazgwNCwKKwl9LAorfTsKKworc3RydWN0IG52X2hvc3QKK3sKKwlzdHJ1Y3QgbnZfaG9zdF9kZXNjCSpob3N0X2Rlc2M7CisJdW5zaWduZWQgbG9uZwkJaG9zdF9mbGFnczsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBudl9wY2lfZHJpdmVyID0geworCS5uYW1lCQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJCT0gbnZfcGNpX3RibCwKKwkucHJvYmUJCQk9IG52X2luaXRfb25lLAorCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKK307CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgbnZfc2h0ID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSBEUlZfTkFNRSwKKwkuaW9jdGwJCQk9IGF0YV9zY3NpX2lvY3RsLAorCS5xdWV1ZWNvbW1hbmQJCT0gYXRhX3Njc2lfcXVldWVjbWQsCisJLmVoX3N0cmF0ZWd5X2hhbmRsZXIJPSBhdGFfc2NzaV9lcnJvciwKKwkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCisJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAorCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCisJLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKKwkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKKwkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKKwkucHJvY19uYW1lCQk9IERSVl9OQU1FLAorCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKKwkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkub3JkZXJlZF9mbHVzaAkJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIG52X29wcyA9IHsKKwkucG9ydF9kaXNhYmxlCQk9IGF0YV9wb3J0X2Rpc2FibGUsCisJLnRmX2xvYWQJCT0gYXRhX3RmX2xvYWQsCisJLnRmX3JlYWQJCT0gYXRhX3RmX3JlYWQsCisJLmV4ZWNfY29tbWFuZAkJPSBhdGFfZXhlY19jb21tYW5kLAorCS5jaGVja19zdGF0dXMJCT0gYXRhX2NoZWNrX3N0YXR1cywKKwkuZGV2X3NlbGVjdAkJPSBhdGFfc3RkX2Rldl9zZWxlY3QsCisJLnBoeV9yZXNldAkJPSBzYXRhX3BoeV9yZXNldCwKKwkuYm1kbWFfc2V0dXAJCT0gYXRhX2JtZG1hX3NldHVwLAorCS5ibWRtYV9zdGFydAkJPSBhdGFfYm1kbWFfc3RhcnQsCisJLmJtZG1hX3N0b3AJCT0gYXRhX2JtZG1hX3N0b3AsCisJLmJtZG1hX3N0YXR1cwkJPSBhdGFfYm1kbWFfc3RhdHVzLAorCS5xY19wcmVwCQk9IGF0YV9xY19wcmVwLAorCS5xY19pc3N1ZQkJPSBhdGFfcWNfaXNzdWVfcHJvdCwKKwkuZW5nX3RpbWVvdXQJCT0gYXRhX2VuZ190aW1lb3V0LAorCS5pcnFfaGFuZGxlcgkJPSBudl9pbnRlcnJ1cHQsCisJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAorCS5zY3JfcmVhZAkJPSBudl9zY3JfcmVhZCwKKwkuc2NyX3dyaXRlCQk9IG52X3Njcl93cml0ZSwKKwkucG9ydF9zdGFydAkJPSBhdGFfcG9ydF9zdGFydCwKKwkucG9ydF9zdG9wCQk9IGF0YV9wb3J0X3N0b3AsCisJLmhvc3Rfc3RvcAkJPSBudl9ob3N0X3N0b3AsCit9OworCisvKiBGSVhNRTogVGhlIGhhcmR3YXJlIHByb3ZpZGVzIHRoZSBuZWNlc3NhcnkgU0FUQSBQSFkgY29udHJvbHMKKyAqIHRvIHN1cHBvcnQgQVRBX0ZMQUdfU0FUQV9SRVNFVC4gIEhvd2V2ZXIsIGl0IGlzIGN1cnJlbnRseQorICogbmVjZXNzYXJ5IHRvIGRpc2FibGUgdGhhdCBmbGFnLCB0byBzb2x2ZSBtaXNkZXRlY3Rpb24gcHJvYmxlbXMuCisgKiBTZWUgaHR0cDovL2J1Z21lLm9zZGwub3JnL3Nob3dfYnVnLmNnaT9pZD0zMzUyIGZvciBtb3JlIGluZm8uCisgKgorICogVGhpcyBwcm9ibGVtIHJlYWxseSBuZWVkcyB0byBiZSBpbnZlc3RpZ2F0ZWQgZnVydGhlci4gIEJ1dCBpbiB0aGUKKyAqIG1lYW50aW1lLCB3ZSBhdm9pZCBBVEFfRkxBR19TQVRBX1JFU0VUIHRvIGdldCBwZW9wbGUgd29ya2luZy4KKyAqLworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIG52X3BvcnRfaW5mbyA9IHsKKwkuc2h0CQk9ICZudl9zaHQsCisJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwKKwkJCSAgLyogQVRBX0ZMQUdfU0FUQV9SRVNFVCB8ICovCisJCQkgIEFUQV9GTEFHX1NSU1QgfAorCQkJICBBVEFfRkxBR19OT19MRUdBQ1ksCisJLnBpb19tYXNrCT0gTlZfUElPX01BU0ssCisJLm13ZG1hX21hc2sJPSBOVl9NV0RNQV9NQVNLLAorCS51ZG1hX21hc2sJPSBOVl9VRE1BX01BU0ssCisJLnBvcnRfb3BzCT0gJm52X29wcywKK307CisKK01PRFVMRV9BVVRIT1IoIk5WSURJQSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJsb3ctbGV2ZWwgZHJpdmVyIGZvciBOVklESUEgbkZvcmNlIFNBVEEgY29udHJvbGxlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG52X3BjaV90YmwpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCitzdGF0aWMgaXJxcmV0dXJuX3QgbnZfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCisJCQkJIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0ID0gZGV2X2luc3RhbmNlOworCXN0cnVjdCBudl9ob3N0ICpob3N0ID0gaG9zdF9zZXQtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0X3NldC0+bG9jaywgZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IGhvc3Rfc2V0LT5uX3BvcnRzOyBpKyspIHsKKwkJc3RydWN0IGF0YV9wb3J0ICphcDsKKworCQlhcCA9IGhvc3Rfc2V0LT5wb3J0c1tpXTsKKwkJaWYgKGFwICYmICghKGFwLT5mbGFncyAmIEFUQV9GTEFHX1BPUlRfRElTQUJMRUQpKSkgeworCQkJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKKworCQkJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKKwkJCWlmIChxYyAmJiAoIShxYy0+dGYuY3RsICYgQVRBX05JRU4pKSkKKwkJCQloYW5kbGVkICs9IGF0YV9ob3N0X2ludHIoYXAsIHFjKTsKKwkJfQorCisJfQorCisJaWYgKGhvc3QtPmhvc3RfZGVzYy0+Y2hlY2tfaG90cGx1ZykKKwkJaG9zdC0+aG9zdF9kZXNjLT5jaGVja19ob3RwbHVnKGhvc3Rfc2V0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIHUzMiBudl9zY3JfcmVhZCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZykKK3sKKwlzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCA9IGFwLT5ob3N0X3NldDsKKwlzdHJ1Y3QgbnZfaG9zdCAqaG9zdCA9IGhvc3Rfc2V0LT5wcml2YXRlX2RhdGE7CisKKwlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpCisJCXJldHVybiAweGZmZmZmZmZmVTsKKworCWlmIChob3N0LT5ob3N0X2ZsYWdzICYgTlZfSE9TVF9GTEFHU19TQ1JfTU1JTykKKwkJcmV0dXJuIHJlYWRsKCh2b2lkKilhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKKwllbHNlCisJCXJldHVybiBpbmwoYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7Cit9CisKK3N0YXRpYyB2b2lkIG52X3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCA9IGFwLT5ob3N0X3NldDsKKwlzdHJ1Y3QgbnZfaG9zdCAqaG9zdCA9IGhvc3Rfc2V0LT5wcml2YXRlX2RhdGE7CisKKwlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpCisJCXJldHVybjsKKworCWlmIChob3N0LT5ob3N0X2ZsYWdzICYgTlZfSE9TVF9GTEFHU19TQ1JfTU1JTykKKwkJd3JpdGVsKHZhbCwgKHZvaWQqKWFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOworCWVsc2UKKwkJb3V0bCh2YWwsIGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOworfQorCitzdGF0aWMgdm9pZCBudl9ob3N0X3N0b3AgKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KQoreworCXN0cnVjdCBudl9ob3N0ICpob3N0ID0gaG9zdF9zZXQtPnByaXZhdGVfZGF0YTsKKworCS8vIERpc2FibGUgaG90cGx1ZyBldmVudCBpbnRlcnJ1cHRzLgorCWlmIChob3N0LT5ob3N0X2Rlc2MtPmRpc2FibGVfaG90cGx1ZykKKwkJaG9zdC0+aG9zdF9kZXNjLT5kaXNhYmxlX2hvdHBsdWcoaG9zdF9zZXQpOworCisJa2ZyZWUoaG9zdCk7Cit9CisKK3N0YXRpYyBpbnQgbnZfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uID0gMDsKKwlzdHJ1Y3QgbnZfaG9zdCAqaG9zdDsKKwlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpOworCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQ7CisJaW50IHBjaV9kZXZfYnVzeSA9IDA7CisJaW50IHJjOworCXUzMiBiYXI7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgaXMgYSBTQVRBIGNvbnRyb2xsZXIgYnkgY291bnRpbmcgdGhlIG51bWJlciBvZiBiYXJzCisgICAgICAgIC8vIChOVklESUEgU0FUQSBjb250cm9sbGVycyB3aWxsIGFsd2F5cyBoYXZlIHNpeCBiYXJzKS4gIE90aGVyd2lzZSwKKyAgICAgICAgLy8gaXQncyBhbiBJREUgY29udHJvbGxlciBhbmQgd2UgaWdub3JlIGl0LgorCWZvciAoYmFyPTA7IGJhcjw2OyBiYXIrKykKKwkJaWYgKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBiYXIpID09IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dDsKKworCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKHJjKSB7CisJCXBjaV9kZXZfYnVzeSA9IDE7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCX0KKworCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCisJcmMgPSAtRU5PTUVNOworCisJcHBpID0gJm52X3BvcnRfaW5mbzsKKwlwcm9iZV9lbnQgPSBhdGFfcGNpX2luaXRfbmF0aXZlX21vZGUocGRldiwgJnBwaSk7CisJaWYgKCFwcm9iZV9lbnQpCisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCisJaG9zdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBudl9ob3N0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFob3N0KQorCQlnb3RvIGVycl9vdXRfZnJlZV9lbnQ7CisKKwltZW1zZXQoaG9zdCwgMCwgc2l6ZW9mKHN0cnVjdCBudl9ob3N0KSk7CisJaG9zdC0+aG9zdF9kZXNjID0gJm52X2RldmljZV90YmxbZW50LT5kcml2ZXJfZGF0YV07CisKKwlwcm9iZV9lbnQtPnByaXZhdGVfZGF0YSA9IGhvc3Q7CisKKwlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDUpICYgSU9SRVNPVVJDRV9NRU0pCisJCWhvc3QtPmhvc3RfZmxhZ3MgfD0gTlZfSE9TVF9GTEFHU19TQ1JfTU1JTzsKKworCWlmIChob3N0LT5ob3N0X2ZsYWdzICYgTlZfSE9TVF9GTEFHU19TQ1JfTU1JTykgeworCQl1bnNpZ25lZCBsb25nIGJhc2U7CisKKwkJcHJvYmVfZW50LT5tbWlvX2Jhc2UgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA1KSwKKwkJCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDUpKTsKKwkJaWYgKHByb2JlX2VudC0+bW1pb19iYXNlID09IE5VTEwpIHsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gZXJyX291dF9mcmVlX2hvc3Q7CisJCX0KKworCQliYXNlID0gKHVuc2lnbmVkIGxvbmcpcHJvYmVfZW50LT5tbWlvX2Jhc2U7CisKKwkJcHJvYmVfZW50LT5wb3J0WzBdLnNjcl9hZGRyID0KKwkJCWJhc2UgKyBOVl9QT1JUMF9TQ1JfUkVHX09GRlNFVDsKKwkJcHJvYmVfZW50LT5wb3J0WzFdLnNjcl9hZGRyID0KKwkJCWJhc2UgKyBOVl9QT1JUMV9TQ1JfUkVHX09GRlNFVDsKKwl9IGVsc2UgeworCisJCXByb2JlX2VudC0+cG9ydFswXS5zY3JfYWRkciA9CisJCQlwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNSkgfCBOVl9QT1JUMF9TQ1JfUkVHX09GRlNFVDsKKwkJcHJvYmVfZW50LT5wb3J0WzFdLnNjcl9hZGRyID0KKwkJCXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA1KSB8IE5WX1BPUlQxX1NDUl9SRUdfT0ZGU0VUOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcmMgPSBhdGFfZGV2aWNlX2FkZChwcm9iZV9lbnQpOworCWlmIChyYyAhPSBOVl9QT1JUUykKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisKKwkvLyBFbmFibGUgaG90cGx1ZyBldmVudCBpbnRlcnJ1cHRzLgorCWlmIChob3N0LT5ob3N0X2Rlc2MtPmVuYWJsZV9ob3RwbHVnKQorCQlob3N0LT5ob3N0X2Rlc2MtPmVuYWJsZV9ob3RwbHVnKHByb2JlX2VudCk7CisKKwlrZnJlZShwcm9iZV9lbnQpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfaW91bm1hcDoKKwlpZiAoaG9zdC0+aG9zdF9mbGFncyAmIE5WX0hPU1RfRkxBR1NfU0NSX01NSU8pCisJCWlvdW5tYXAocHJvYmVfZW50LT5tbWlvX2Jhc2UpOworZXJyX291dF9mcmVlX2hvc3Q6CisJa2ZyZWUoaG9zdCk7CitlcnJfb3V0X2ZyZWVfZW50OgorCWtmcmVlKHByb2JlX2VudCk7CitlcnJfb3V0X3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXRfZGlzYWJsZToKKwlpZiAoIXBjaV9kZXZfYnVzeSkKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworZXJyX291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIG52X2VuYWJsZV9ob3RwbHVnKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQpCit7CisJdTggaW50cl9tYXNrOworCisJb3V0YihOVl9JTlRfU1RBVFVTX0hPVFBMVUcsCisJCXByb2JlX2VudC0+cG9ydFswXS5zY3JfYWRkciArIE5WX0lOVF9TVEFUVVMpOworCisJaW50cl9tYXNrID0gaW5iKHByb2JlX2VudC0+cG9ydFswXS5zY3JfYWRkciArIE5WX0lOVF9FTkFCTEUpOworCWludHJfbWFzayB8PSBOVl9JTlRfRU5BQkxFX0hPVFBMVUc7CisKKwlvdXRiKGludHJfbWFzaywgcHJvYmVfZW50LT5wb3J0WzBdLnNjcl9hZGRyICsgTlZfSU5UX0VOQUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkIG52X2Rpc2FibGVfaG90cGx1ZyhzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCkKK3sKKwl1OCBpbnRyX21hc2s7CisKKwlpbnRyX21hc2sgPSBpbmIoaG9zdF9zZXQtPnBvcnRzWzBdLT5pb2FkZHIuc2NyX2FkZHIgKyBOVl9JTlRfRU5BQkxFKTsKKworCWludHJfbWFzayAmPSB+KE5WX0lOVF9FTkFCTEVfSE9UUExVRyk7CisKKwlvdXRiKGludHJfbWFzaywgaG9zdF9zZXQtPnBvcnRzWzBdLT5pb2FkZHIuc2NyX2FkZHIgKyBOVl9JTlRfRU5BQkxFKTsKK30KKworc3RhdGljIHZvaWQgbnZfY2hlY2tfaG90cGx1ZyhzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCkKK3sKKwl1OCBpbnRyX3N0YXR1czsKKworCWludHJfc3RhdHVzID0gaW5iKGhvc3Rfc2V0LT5wb3J0c1swXS0+aW9hZGRyLnNjcl9hZGRyICsgTlZfSU5UX1NUQVRVUyk7CisKKwkvLyBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzLgorCW91dGIoMHhmZiwgaG9zdF9zZXQtPnBvcnRzWzBdLT5pb2FkZHIuc2NyX2FkZHIgKyBOVl9JTlRfU1RBVFVTKTsKKworCWlmIChpbnRyX3N0YXR1cyAmIE5WX0lOVF9TVEFUVVNfSE9UUExVRykgeworCQlpZiAoaW50cl9zdGF0dXMgJiBOVl9JTlRfU1RBVFVTX1BERVZfQURERUQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJudl9zYXRhOiAiCisJCQkJIlByaW1hcnkgZGV2aWNlIGFkZGVkXG4iKTsKKworCQlpZiAoaW50cl9zdGF0dXMgJiBOVl9JTlRfU1RBVFVTX1BERVZfUkVNT1ZFRCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm52X3NhdGE6ICIKKwkJCQkiUHJpbWFyeSBkZXZpY2UgcmVtb3ZlZFxuIik7CisKKwkJaWYgKGludHJfc3RhdHVzICYgTlZfSU5UX1NUQVRVU19TREVWX0FEREVEKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibnZfc2F0YTogIgorCQkJCSJTZWNvbmRhcnkgZGV2aWNlIGFkZGVkXG4iKTsKKworCQlpZiAoaW50cl9zdGF0dXMgJiBOVl9JTlRfU1RBVFVTX1NERVZfUkVNT1ZFRCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm52X3NhdGE6ICIKKwkJCQkiU2Vjb25kYXJ5IGRldmljZSByZW1vdmVkXG4iKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG52X2VuYWJsZV9ob3RwbHVnX2NrODA0KHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KHByb2JlX2VudC0+ZGV2KTsKKwl1OCBpbnRyX21hc2s7CisJdTggcmVndmFsOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgTlZfTUNQX1NBVEFfQ0ZHXzIwLCAmcmVndmFsKTsKKwlyZWd2YWwgfD0gTlZfTUNQX1NBVEFfQ0ZHXzIwX1NBVEFfU1BBQ0VfRU47CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIE5WX01DUF9TQVRBX0NGR18yMCwgcmVndmFsKTsKKworCXdyaXRlYihOVl9JTlRfU1RBVFVTX0hPVFBMVUcsIHByb2JlX2VudC0+bW1pb19iYXNlICsgTlZfSU5UX1NUQVRVU19DSzgwNCk7CisKKwlpbnRyX21hc2sgPSByZWFkYihwcm9iZV9lbnQtPm1taW9fYmFzZSArIE5WX0lOVF9FTkFCTEVfQ0s4MDQpOworCWludHJfbWFzayB8PSBOVl9JTlRfRU5BQkxFX0hPVFBMVUc7CisKKwl3cml0ZWIoaW50cl9tYXNrLCBwcm9iZV9lbnQtPm1taW9fYmFzZSArIE5WX0lOVF9FTkFCTEVfQ0s4MDQpOworfQorCitzdGF0aWMgdm9pZCBudl9kaXNhYmxlX2hvdHBsdWdfY2s4MDQoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGhvc3Rfc2V0LT5kZXYpOworCXU4IGludHJfbWFzazsKKwl1OCByZWd2YWw7CisKKwlpbnRyX21hc2sgPSByZWFkYihob3N0X3NldC0+bW1pb19iYXNlICsgTlZfSU5UX0VOQUJMRV9DSzgwNCk7CisKKwlpbnRyX21hc2sgJj0gfihOVl9JTlRfRU5BQkxFX0hPVFBMVUcpOworCisJd3JpdGViKGludHJfbWFzaywgaG9zdF9zZXQtPm1taW9fYmFzZSArIE5WX0lOVF9FTkFCTEVfQ0s4MDQpOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgTlZfTUNQX1NBVEFfQ0ZHXzIwLCAmcmVndmFsKTsKKwlyZWd2YWwgJj0gfk5WX01DUF9TQVRBX0NGR18yMF9TQVRBX1NQQUNFX0VOOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBOVl9NQ1BfU0FUQV9DRkdfMjAsIHJlZ3ZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIG52X2NoZWNrX2hvdHBsdWdfY2s4MDQoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpCit7CisJdTggaW50cl9zdGF0dXM7CisKKwlpbnRyX3N0YXR1cyA9IHJlYWRiKGhvc3Rfc2V0LT5tbWlvX2Jhc2UgKyBOVl9JTlRfU1RBVFVTX0NLODA0KTsKKworCS8vIENsZWFyIGludGVycnVwdCBzdGF0dXMuCisJd3JpdGViKDB4ZmYsIGhvc3Rfc2V0LT5tbWlvX2Jhc2UgKyBOVl9JTlRfU1RBVFVTX0NLODA0KTsKKworCWlmIChpbnRyX3N0YXR1cyAmIE5WX0lOVF9TVEFUVVNfSE9UUExVRykgeworCQlpZiAoaW50cl9zdGF0dXMgJiBOVl9JTlRfU1RBVFVTX1BERVZfQURERUQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJudl9zYXRhOiAiCisJCQkJIlByaW1hcnkgZGV2aWNlIGFkZGVkXG4iKTsKKworCQlpZiAoaW50cl9zdGF0dXMgJiBOVl9JTlRfU1RBVFVTX1BERVZfUkVNT1ZFRCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm52X3NhdGE6ICIKKwkJCQkiUHJpbWFyeSBkZXZpY2UgcmVtb3ZlZFxuIik7CisKKwkJaWYgKGludHJfc3RhdHVzICYgTlZfSU5UX1NUQVRVU19TREVWX0FEREVEKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibnZfc2F0YTogIgorCQkJCSJTZWNvbmRhcnkgZGV2aWNlIGFkZGVkXG4iKTsKKworCQlpZiAoaW50cl9zdGF0dXMgJiBOVl9JTlRfU1RBVFVTX1NERVZfUkVNT1ZFRCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm52X3NhdGE6ICIKKwkJCQkiU2Vjb25kYXJ5IGRldmljZSByZW1vdmVkXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG52X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZudl9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG52X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm52X3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChudl9pbml0KTsKK21vZHVsZV9leGl0KG52X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NhdGFfcHJvbWlzZS5jIGIvZHJpdmVycy9zY3NpL3NhdGFfcHJvbWlzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YTEzZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2F0YV9wcm9taXNlLmMKQEAgLTAsMCArMSw2ODIgQEAKKy8qCisgKiAgc2F0YV9wcm9taXNlLmMgLSBQcm9taXNlIFNBVEEKKyAqCisgKiAgTWFpbnRhaW5lZCBieTogIEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKyAqICAJCSAgICBQbGVhc2UgQUxXQVlTIGNvcHkgbGludXgtaWRlQHZnZXIua2VybmVsLm9yZworICoJCSAgICBvbiBlbWFpbHMuCisgKgorICogIENvcHlyaWdodCAyMDAzLTIwMDQgUmVkIEhhdCwgSW5jLgorICoKKyAqICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBPcGVuCisgKiAgU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMSB0aGF0IGNhbiBiZSBmb3VuZCBhdAorICogIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLTEuMS50eHQgYW5kIGlzIGluY2x1ZGVkIGhlcmVpbgorICogIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpIGFzIGRpc3RyaWJ1dGVkCisgKiAgaW4gdGhlIGtlcm5lbCBzb3VyY2UgQ09QWUlORyBmaWxlLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mCisgKiAgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZSBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93CisgKiAgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgorICogIHRoZSBPU0wsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kCisgKiAgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLgorICogIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIKKyAqICB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE9TTCBvciB0aGUgR1BMLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJzYXRhX3Byb21pc2UuaCIKKworI2RlZmluZSBEUlZfTkFNRQkic2F0YV9wcm9taXNlIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wMSIKKworCitlbnVtIHsKKwlQRENfUEtUX1NVQk1JVAkJPSAweDQwLCAvKiBDb21tYW5kIHBhY2tldCBwb2ludGVyIGFkZHIgKi8KKwlQRENfSU5UX1NFUU1BU0sJCT0gMHg0MCwJLyogTWFzayBvZiBhc3NlcnRlZCBTRVEgSU5UcyAqLworCVBEQ19UQkdfTU9ERQkJPSAweDQxLAkvKiBUQkcgbW9kZSAqLworCVBEQ19GTEFTSF9DVEwJCT0gMHg0NCwgLyogRmxhc2ggY29udHJvbCByZWdpc3RlciAqLworCVBEQ19QQ0lfQ1RMCQk9IDB4NDgsIC8qIFBDSSBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KKwlQRENfR0xPQkFMX0NUTAkJPSAweDQ4LCAvKiBHbG9iYWwgY29udHJvbC9zdGF0dXMgKHBlciBwb3J0KSAqLworCVBEQ19DVExTVEFUCQk9IDB4NjAsCS8qIElERSBjb250cm9sIGFuZCBzdGF0dXMgKHBlciBwb3J0KSAqLworCVBEQ19TQVRBX1BMVUdfQ1NSCT0gMHg2QywgLyogU0FUQSBQbHVnIGNvbnRyb2wvc3RhdHVzIHJlZyAqLworCVBEQ19TTEVXX0NUTAkJPSAweDQ3MCwgLyogc2xldyByYXRlIGNvbnRyb2wgcmVnICovCisKKwlQRENfRVJSX01BU0sJCT0gKDE8PDE5KSB8ICgxPDwyMCkgfCAoMTw8MjEpIHwgKDE8PDIyKSB8CisJCQkJICAoMTw8OCkgfCAoMTw8OSkgfCAoMTw8MTApLAorCisJYm9hcmRfMjAzN3gJCT0gMCwJLyogRmFzdFRyYWsgUzE1MCBUWDJwbHVzICovCisJYm9hcmRfMjAzMTkJCT0gMSwJLyogRmFzdFRyYWsgUzE1MCBUWDQgKi8KKworCVBEQ19IQVNfUEFUQQkJPSAoMSA8PCAxKSwgLyogUERDMjAzNzUgaGFzIFBBVEEgKi8KKworCVBEQ19SRVNFVAkJPSAoMSA8PCAxMSksIC8qIEhETUEgcmVzZXQgKi8KK307CisKKworc3RydWN0IHBkY19wb3J0X3ByaXYgeworCXU4CQkJKnBrdDsKKwlkbWFfYWRkcl90CQlwa3RfZG1hOworfTsKKworc3RhdGljIHUzMiBwZGNfc2F0YV9zY3JfcmVhZCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZyk7CitzdGF0aWMgdm9pZCBwZGNfc2F0YV9zY3Jfd3JpdGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpOworc3RhdGljIGludCBwZGNfYXRhX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgcGRjX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBwZGNfZW5nX3RpbWVvdXQoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgaW50IHBkY19wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgcGRjX3BvcnRfc3RvcChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIHBkY19waHlfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgdm9pZCBwZGNfcWNfcHJlcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKK3N0YXRpYyB2b2lkIHBkY190Zl9sb2FkX21taW8oc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpOworc3RhdGljIHZvaWQgcGRjX2V4ZWNfY29tbWFuZF9tbWlvKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKTsKK3N0YXRpYyB2b2lkIHBkY19pcnFfY2xlYXIoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgaW50IHBkY19xY19pc3N1ZV9wcm90KHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIHBkY19hdGFfc2h0ID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSBEUlZfTkFNRSwKKwkuaW9jdGwJCQk9IGF0YV9zY3NpX2lvY3RsLAorCS5xdWV1ZWNvbW1hbmQJCT0gYXRhX3Njc2lfcXVldWVjbWQsCisJLmVoX3N0cmF0ZWd5X2hhbmRsZXIJPSBhdGFfc2NzaV9lcnJvciwKKwkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCisJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAorCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCisJLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKKwkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKKwkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKKwkucHJvY19uYW1lCQk9IERSVl9OQU1FLAorCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKKwkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkub3JkZXJlZF9mbHVzaAkJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHBkY19hdGFfb3BzID0geworCS5wb3J0X2Rpc2FibGUJCT0gYXRhX3BvcnRfZGlzYWJsZSwKKwkudGZfbG9hZAkJPSBwZGNfdGZfbG9hZF9tbWlvLAorCS50Zl9yZWFkCQk9IGF0YV90Zl9yZWFkLAorCS5jaGVja19zdGF0dXMJCT0gYXRhX2NoZWNrX3N0YXR1cywKKwkuZXhlY19jb21tYW5kCQk9IHBkY19leGVjX2NvbW1hbmRfbW1pbywKKwkuZGV2X3NlbGVjdAkJPSBhdGFfc3RkX2Rldl9zZWxlY3QsCisJLnBoeV9yZXNldAkJPSBwZGNfcGh5X3Jlc2V0LAorCS5xY19wcmVwCQk9IHBkY19xY19wcmVwLAorCS5xY19pc3N1ZQkJPSBwZGNfcWNfaXNzdWVfcHJvdCwKKwkuZW5nX3RpbWVvdXQJCT0gcGRjX2VuZ190aW1lb3V0LAorCS5pcnFfaGFuZGxlcgkJPSBwZGNfaW50ZXJydXB0LAorCS5pcnFfY2xlYXIJCT0gcGRjX2lycV9jbGVhciwKKwkuc2NyX3JlYWQJCT0gcGRjX3NhdGFfc2NyX3JlYWQsCisJLnNjcl93cml0ZQkJPSBwZGNfc2F0YV9zY3Jfd3JpdGUsCisJLnBvcnRfc3RhcnQJCT0gcGRjX3BvcnRfc3RhcnQsCisJLnBvcnRfc3RvcAkJPSBwZGNfcG9ydF9zdG9wLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIHBkY19wb3J0X2luZm9bXSA9IHsKKwkvKiBib2FyZF8yMDM3eCAqLworCXsKKwkJLnNodAkJPSAmcGRjX2F0YV9zaHQsCisJCS5ob3N0X2ZsYWdzCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8CisJCQkJICBBVEFfRkxBR19TUlNUIHwgQVRBX0ZMQUdfTU1JTywKKwkJLnBpb19tYXNrCT0gMHgxZiwgLyogcGlvMC00ICovCisJCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KKwkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLworCQkucG9ydF9vcHMJPSAmcGRjX2F0YV9vcHMsCisJfSwKKworCS8qIGJvYXJkXzIwMzE5ICovCisJeworCQkuc2h0CQk9ICZwZGNfYXRhX3NodCwKKwkJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkgIEFUQV9GTEFHX1NSU1QgfCBBVEFfRkxBR19NTUlPLAorCQkucGlvX21hc2sJPSAweDFmLCAvKiBwaW8wLTQgKi8KKwkJLm13ZG1hX21hc2sJPSAweDA3LCAvKiBtd2RtYTAtMiAqLworCQkudWRtYV9tYXNrCT0gMHg3ZiwgLyogdWRtYTAtNiA7IEZJWE1FICovCisJCS5wb3J0X29wcwk9ICZwZGNfYXRhX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBkY19hdGFfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9QUk9NSVNFLCAweDMzNzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJICBib2FyZF8yMDM3eCB9LAorCXsgUENJX1ZFTkRPUl9JRF9QUk9NSVNFLCAweDMzNzMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJICBib2FyZF8yMDM3eCB9LAorCXsgUENJX1ZFTkRPUl9JRF9QUk9NSVNFLCAweDMzNzUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJICBib2FyZF8yMDM3eCB9LAorCXsgUENJX1ZFTkRPUl9JRF9QUk9NSVNFLCAweDMzNzYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJICBib2FyZF8yMDM3eCB9LAorCXsgUENJX1ZFTkRPUl9JRF9QUk9NSVNFLCAweDM1NzQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJICBib2FyZF8yMDM3eCB9LAorCXsgUENJX1ZFTkRPUl9JRF9QUk9NSVNFLCAweDNkNzUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJICBib2FyZF8yMDM3eCB9LAorCisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIDB4MzMxOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkXzIwMzE5IH0sCisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIDB4MzMxOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkXzIwMzE5IH0sCisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIDB4M2QxOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkXzIwMzE5IH0sCisKKwl7IH0JLyogdGVybWluYXRlIGxpc3QgKi8KK307CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBkY19hdGFfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCQk9IHBkY19hdGFfcGNpX3RibCwKKwkucHJvYmUJCQk9IHBkY19hdGFfaW5pdF9vbmUsCisJLnJlbW92ZQkJCT0gYXRhX3BjaV9yZW1vdmVfb25lLAorfTsKKworCitzdGF0aWMgaW50IHBkY19wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gYXAtPmhvc3Rfc2V0LT5kZXY7CisJc3RydWN0IHBkY19wb3J0X3ByaXYgKnBwOworCWludCByYzsKKworCXJjID0gYXRhX3BvcnRfc3RhcnQoYXApOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcHAgPSBrbWFsbG9jKHNpemVvZigqcHApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBwKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKwltZW1zZXQocHAsIDAsIHNpemVvZigqcHApKTsKKworCXBwLT5wa3QgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCAxMjgsICZwcC0+cGt0X2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcC0+cGt0KSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2tmcmVlOworCX0KKworCWFwLT5wcml2YXRlX2RhdGEgPSBwcDsKKworCXJldHVybiAwOworCitlcnJfb3V0X2tmcmVlOgorCWtmcmVlKHBwKTsKK2Vycl9vdXQ6CisJYXRhX3BvcnRfc3RvcChhcCk7CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyB2b2lkIHBkY19wb3J0X3N0b3Aoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhcC0+aG9zdF9zZXQtPmRldjsKKwlzdHJ1Y3QgcGRjX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOworCisJYXAtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCAxMjgsIHBwLT5wa3QsIHBwLT5wa3RfZG1hKTsKKwlrZnJlZShwcCk7CisJYXRhX3BvcnRfc3RvcChhcCk7Cit9CisKKworc3RhdGljIHZvaWQgcGRjX3Jlc2V0X3BvcnQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl2b2lkICptbWlvID0gKHZvaWQgKikgYXAtPmlvYWRkci5jbWRfYWRkciArIFBEQ19DVExTVEFUOworCXVuc2lnbmVkIGludCBpOworCXUzMiB0bXA7CisKKwlmb3IgKGkgPSAxMTsgaSA+IDA7IGktLSkgeworCQl0bXAgPSByZWFkbChtbWlvKTsKKwkJaWYgKHRtcCAmIFBEQ19SRVNFVCkKKwkJCWJyZWFrOworCisJCXVkZWxheSgxMDApOworCisJCXRtcCB8PSBQRENfUkVTRVQ7CisJCXdyaXRlbCh0bXAsIG1taW8pOworCX0KKworCXRtcCAmPSB+UERDX1JFU0VUOworCXdyaXRlbCh0bXAsIG1taW8pOworCXJlYWRsKG1taW8pOwkvKiBmbHVzaCAqLworfQorCitzdGF0aWMgdm9pZCBwZGNfcGh5X3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJcGRjX3Jlc2V0X3BvcnQoYXApOworCXNhdGFfcGh5X3Jlc2V0KGFwKTsKK30KKworc3RhdGljIHUzMiBwZGNfc2F0YV9zY3JfcmVhZCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZykKK3sKKwlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpCisJCXJldHVybiAweGZmZmZmZmZmVTsKKwlyZXR1cm4gcmVhZGwoKHZvaWQgKikgYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7Cit9CisKKworc3RhdGljIHZvaWQgcGRjX3NhdGFfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLAorCQkJICAgICAgIHUzMiB2YWwpCit7CisJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQorCQlyZXR1cm47CisJd3JpdGVsKHZhbCwgKHZvaWQgKikgYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7Cit9CisKK3N0YXRpYyB2b2lkIHBkY19xY19wcmVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IHBkY19wb3J0X3ByaXYgKnBwID0gcWMtPmFwLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IGk7CisKKwlWUFJJTlRLKCJFTlRFUlxuIik7CisKKwlzd2l0Y2ggKHFjLT50Zi5wcm90b2NvbCkgeworCWNhc2UgQVRBX1BST1RfRE1BOgorCQlhdGFfcWNfcHJlcChxYyk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJY2FzZSBBVEFfUFJPVF9OT0RBVEE6CisJCWkgPSBwZGNfcGt0X2hlYWRlcigmcWMtPnRmLCBxYy0+YXAtPnByZF9kbWEsCisJCQkJICAgcWMtPmRldi0+ZGV2bm8sIHBwLT5wa3QpOworCisJCWlmIChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfTEJBNDgpCisJCQlpID0gcGRjX3ByZXBfbGJhNDgoJnFjLT50ZiwgcHAtPnBrdCwgaSk7CisJCWVsc2UKKwkJCWkgPSBwZGNfcHJlcF9sYmEyOCgmcWMtPnRmLCBwcC0+cGt0LCBpKTsKKworCQlwZGNfcGt0X2Zvb3RlcigmcWMtPnRmLCBwcC0+cGt0LCBpKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBkY19lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXU4IGRydl9zdGF0OworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisKKwlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOworCWlmICghcWMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhdGEldTogQlVHOiB0aW1lb3V0IHdpdGhvdXQgY29tbWFuZFxuIiwKKwkJICAgICAgIGFwLT5pZCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGhhY2sgYWxlcnQhICBXZSBjYW5ub3QgdXNlIHRoZSBzdXBwbGllZCBjb21wbGV0aW9uCisJICogZnVuY3Rpb24gZnJvbSBpbnNpZGUgdGhlIC0+ZWhfc3RyYXRlZ3lfaGFuZGxlcigpIHRocmVhZC4KKwkgKiBsaWJhdGEgaXMgdGhlIG9ubHkgdXNlciBvZiAtPmVoX3N0cmF0ZWd5X2hhbmRsZXIoKSBpbgorCSAqIGFueSBrZXJuZWwsIHNvIHRoZSBkZWZhdWx0IHNjc2lfZG9uZSgpIGFzc3VtZXMgaXQgaXMKKwkgKiBub3QgYmVpbmcgY2FsbGVkIGZyb20gdGhlIFNDU0kgRUguCisJICovCisJcWMtPnNjc2lkb25lID0gc2NzaV9maW5pc2hfY29tbWFuZDsKKworCXN3aXRjaCAocWMtPnRmLnByb3RvY29sKSB7CisJY2FzZSBBVEFfUFJPVF9ETUE6CisJY2FzZSBBVEFfUFJPVF9OT0RBVEE6CisJCXByaW50ayhLRVJOX0VSUiAiYXRhJXU6IGNvbW1hbmQgdGltZW91dFxuIiwgYXAtPmlkKTsKKwkJYXRhX3FjX2NvbXBsZXRlKHFjLCBhdGFfd2FpdF9pZGxlKGFwKSB8IEFUQV9FUlIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRydl9zdGF0ID0gYXRhX2J1c3lfd2FpdChhcCwgQVRBX0JVU1kgfCBBVEFfRFJRLCAxMDAwKTsKKworCQlwcmludGsoS0VSTl9FUlIgImF0YSV1OiB1bmtub3duIHRpbWVvdXQsIGNtZCAweCV4IHN0YXQgMHgleFxuIiwKKwkJICAgICAgIGFwLT5pZCwgcWMtPnRmLmNvbW1hbmQsIGRydl9zdGF0KTsKKworCQlhdGFfcWNfY29tcGxldGUocWMsIGRydl9zdGF0KTsKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJRFBSSU5USygiRVhJVFxuIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBkY19ob3N0X2ludHIoIHN0cnVjdCBhdGFfcG9ydCAqYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXU4IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlZCA9IDAsIGhhdmVfZXJyID0gMDsKKwl1MzIgdG1wOworCXZvaWQgKm1taW8gPSAodm9pZCAqKSBhcC0+aW9hZGRyLmNtZF9hZGRyICsgUERDX0dMT0JBTF9DVEw7CisKKwl0bXAgPSByZWFkbChtbWlvKTsKKwlpZiAodG1wICYgUERDX0VSUl9NQVNLKSB7CisJCWhhdmVfZXJyID0gMTsKKwkJcGRjX3Jlc2V0X3BvcnQoYXApOworCX0KKworCXN3aXRjaCAocWMtPnRmLnByb3RvY29sKSB7CisJY2FzZSBBVEFfUFJPVF9ETUE6CisJY2FzZSBBVEFfUFJPVF9OT0RBVEE6CisJCXN0YXR1cyA9IGF0YV93YWl0X2lkbGUoYXApOworCQlpZiAoaGF2ZV9lcnIpCisJCQlzdGF0dXMgfD0gQVRBX0VSUjsKKwkJYXRhX3FjX2NvbXBsZXRlKHFjLCBzdGF0dXMpOworCQloYW5kbGVkID0gMTsKKwkJYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhcC0+c3RhdHMuaWRsZV9pcnErKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBoYW5kbGVkOworfQorCitzdGF0aWMgdm9pZCBwZGNfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBhcC0+aG9zdF9zZXQ7CisJdm9pZCAqbW1pbyA9IGhvc3Rfc2V0LT5tbWlvX2Jhc2U7CisKKwlyZWFkbChtbWlvICsgUERDX0lOVF9TRVFNQVNLKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHBkY19pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IGF0YV9wb3J0ICphcDsKKwl1MzIgbWFzayA9IDA7CisJdW5zaWduZWQgaW50IGksIHRtcDsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlZCA9IDA7CisJdm9pZCAqbW1pb19iYXNlOworCisJVlBSSU5USygiRU5URVJcbiIpOworCisJaWYgKCFob3N0X3NldCB8fCAhaG9zdF9zZXQtPm1taW9fYmFzZSkgeworCQlWUFJJTlRLKCJRVUlDSyBFWElUXG4iKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCW1taW9fYmFzZSA9IGhvc3Rfc2V0LT5tbWlvX2Jhc2U7CisKKwkvKiByZWFkaW5nIHNob3VsZCBhbHNvIGNsZWFyIGludGVycnVwdHMgKi8KKwltYXNrID0gcmVhZGwobW1pb19iYXNlICsgUERDX0lOVF9TRVFNQVNLKTsKKworCWlmIChtYXNrID09IDB4ZmZmZmZmZmYpIHsKKwkJVlBSSU5USygiUVVJQ0sgRVhJVCAyXG4iKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwltYXNrICY9IDB4ZmZmZjsJCS8qIG9ubHkgMTYgdGFncyBwb3NzaWJsZSAqLworCWlmICghbWFzaykgeworCQlWUFJJTlRLKCJRVUlDSyBFWElUIDNcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJc3Bpbl9sb2NrKCZob3N0X3NldC0+bG9jayk7CisKKwl3cml0ZWwobWFzaywgbW1pb19iYXNlICsgUERDX0lOVF9TRVFNQVNLKTsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0X3NldC0+bl9wb3J0czsgaSsrKSB7CisJCVZQUklOVEsoInBvcnQgJXVcbiIsIGkpOworCQlhcCA9IGhvc3Rfc2V0LT5wb3J0c1tpXTsKKwkJdG1wID0gbWFzayAmICgxIDw8IChpICsgMSkpOworCQlpZiAodG1wICYmIGFwICYmICghKGFwLT5mbGFncyAmIEFUQV9GTEFHX1BPUlRfRElTQUJMRUQpKSkgeworCQkJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKKworCQkJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKKwkJCWlmIChxYyAmJiAoIShxYy0+dGYuY3RsICYgQVRBX05JRU4pKSkKKwkJCQloYW5kbGVkICs9IHBkY19ob3N0X2ludHIoYXAsIHFjKTsKKwkJfQorCX0KKworICAgICAgICBzcGluX3VubG9jaygmaG9zdF9zZXQtPmxvY2spOworCisJVlBSSU5USygiRVhJVFxuIik7CisKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBkY19wYWNrZXRfc3RhcnQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBwZGNfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IHBvcnRfbm8gPSBhcC0+cG9ydF9ubzsKKwl1OCBzZXEgPSAodTgpIChwb3J0X25vICsgMSk7CisKKwlWUFJJTlRLKCJFTlRFUiwgYXAgJXBcbiIsIGFwKTsKKworCXdyaXRlbCgweDAwMDAwMDAxLCBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZSArIChzZXEgKiA0KSk7CisJcmVhZGwoYXAtPmhvc3Rfc2V0LT5tbWlvX2Jhc2UgKyAoc2VxICogNCkpOwkvKiBmbHVzaCAqLworCisJcHAtPnBrdFsyXSA9IHNlcTsKKwl3bWIoKTsJCQkvKiBmbHVzaCBQUkQsIHBrdCB3cml0ZXMgKi8KKwl3cml0ZWwocHAtPnBrdF9kbWEsICh2b2lkICopIGFwLT5pb2FkZHIuY21kX2FkZHIgKyBQRENfUEtUX1NVQk1JVCk7CisJcmVhZGwoKHZvaWQgKikgYXAtPmlvYWRkci5jbWRfYWRkciArIFBEQ19QS1RfU1VCTUlUKTsgLyogZmx1c2ggKi8KK30KKworc3RhdGljIGludCBwZGNfcWNfaXNzdWVfcHJvdChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN3aXRjaCAocWMtPnRmLnByb3RvY29sKSB7CisJY2FzZSBBVEFfUFJPVF9ETUE6CisJY2FzZSBBVEFfUFJPVF9OT0RBVEE6CisJCXBkY19wYWNrZXRfc3RhcnQocWMpOworCQlyZXR1cm4gMDsKKworCWNhc2UgQVRBX1BST1RfQVRBUElfRE1BOgorCQlCVUcoKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gYXRhX3FjX2lzc3VlX3Byb3QocWMpOworfQorCitzdGF0aWMgdm9pZCBwZGNfdGZfbG9hZF9tbWlvKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCVdBUk5fT04gKHRmLT5wcm90b2NvbCA9PSBBVEFfUFJPVF9ETUEgfHwKKwkJIHRmLT5wcm90b2NvbCA9PSBBVEFfUFJPVF9OT0RBVEEpOworCWF0YV90Zl9sb2FkKGFwLCB0Zik7Cit9CisKKworc3RhdGljIHZvaWQgcGRjX2V4ZWNfY29tbWFuZF9tbWlvKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCVdBUk5fT04gKHRmLT5wcm90b2NvbCA9PSBBVEFfUFJPVF9ETUEgfHwKKwkJIHRmLT5wcm90b2NvbCA9PSBBVEFfUFJPVF9OT0RBVEEpOworCWF0YV9leGVjX2NvbW1hbmQoYXAsIHRmKTsKK30KKworCitzdGF0aWMgdm9pZCBwZGNfYXRhX3NldHVwX3BvcnQoc3RydWN0IGF0YV9pb3BvcnRzICpwb3J0LCB1bnNpZ25lZCBsb25nIGJhc2UpCit7CisJcG9ydC0+Y21kX2FkZHIJCT0gYmFzZTsKKwlwb3J0LT5kYXRhX2FkZHIJCT0gYmFzZTsKKwlwb3J0LT5mZWF0dXJlX2FkZHIJPQorCXBvcnQtPmVycm9yX2FkZHIJPSBiYXNlICsgMHg0OworCXBvcnQtPm5zZWN0X2FkZHIJPSBiYXNlICsgMHg4OworCXBvcnQtPmxiYWxfYWRkcgkJPSBiYXNlICsgMHhjOworCXBvcnQtPmxiYW1fYWRkcgkJPSBiYXNlICsgMHgxMDsKKwlwb3J0LT5sYmFoX2FkZHIJCT0gYmFzZSArIDB4MTQ7CisJcG9ydC0+ZGV2aWNlX2FkZHIJPSBiYXNlICsgMHgxODsKKwlwb3J0LT5jb21tYW5kX2FkZHIJPQorCXBvcnQtPnN0YXR1c19hZGRyCT0gYmFzZSArIDB4MWM7CisJcG9ydC0+YWx0c3RhdHVzX2FkZHIJPQorCXBvcnQtPmN0bF9hZGRyCQk9IGJhc2UgKyAweDM4OworfQorCisKK3N0YXRpYyB2b2lkIHBkY19ob3N0X2luaXQodW5zaWduZWQgaW50IGNoaXBfaWQsIHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwZSkKK3sKKwl2b2lkICptbWlvID0gcGUtPm1taW9fYmFzZTsKKwl1MzIgdG1wOworCisJLyoKKwkgKiBFeGNlcHQgZm9yIHRoZSBob3RwbHVnIHN0dWZmLCB0aGlzIGlzIHZvb2RvbyBmcm9tIHRoZQorCSAqIFByb21pc2UgZHJpdmVyLiAgTGFiZWwgdGhpcyBlbnRpcmUgc2VjdGlvbgorCSAqICJUT0RPOiBmaWd1cmUgb3V0IHdoeSB3ZSBkbyB0aGlzIgorCSAqLworCisJLyogY2hhbmdlIEZJRk9fU0hEIHRvIDggZHdvcmRzLCBlbmFibGUgQk1SX0JVUlNUICovCisJdG1wID0gcmVhZGwobW1pbyArIFBEQ19GTEFTSF9DVEwpOworCXRtcCB8PSAweDEyMDAwOwkvKiBiaXQgMTYgKGZpZm8gOCBkdykgYW5kIDEzIChibXIgYnVyc3Q/KSAqLworCXdyaXRlbCh0bXAsIG1taW8gKyBQRENfRkxBU0hfQ1RMKTsKKworCS8qIGNsZWFyIHBsdWcvdW5wbHVnIGZsYWdzIGZvciBhbGwgcG9ydHMgKi8KKwl0bXAgPSByZWFkbChtbWlvICsgUERDX1NBVEFfUExVR19DU1IpOworCXdyaXRlbCh0bXAgfCAweGZmLCBtbWlvICsgUERDX1NBVEFfUExVR19DU1IpOworCisJLyogbWFzayBwbHVnL3VucGx1ZyBpbnRzICovCisJdG1wID0gcmVhZGwobW1pbyArIFBEQ19TQVRBX1BMVUdfQ1NSKTsKKwl3cml0ZWwodG1wIHwgMHhmZjAwMDAsIG1taW8gKyBQRENfU0FUQV9QTFVHX0NTUik7CisKKwkvKiByZWR1Y2UgVEJHIGNsb2NrIHRvIDEzMyBNaHouICovCisJdG1wID0gcmVhZGwobW1pbyArIFBEQ19UQkdfTU9ERSk7CisJdG1wICY9IH4weDMwMDAwOyAvKiBjbGVhciBiaXQgMTcsIDE2Ki8KKwl0bXAgfD0gMHgxMDAwMDsgIC8qIHNldCBiaXQgMTc6MTYgPSAwOjEgKi8KKwl3cml0ZWwodG1wLCBtbWlvICsgUERDX1RCR19NT0RFKTsKKworCXJlYWRsKG1taW8gKyBQRENfVEJHX01PREUpOwkvKiBmbHVzaCAqLworCW1zbGVlcCgxMCk7CisKKwkvKiBhZGp1c3Qgc2xldyByYXRlIGNvbnRyb2wgcmVnaXN0ZXIuICovCisJdG1wID0gcmVhZGwobW1pbyArIFBEQ19TTEVXX0NUTCk7CisJdG1wICY9IDB4RkZGRkYwM0Y7IC8qIGNsZWFyIGJpdCAxMSB+IDYgKi8KKwl0bXAgIHw9IDB4MDAwMDA5MDA7IC8qIHNldCBiaXQgMTEtOSA9IDEwMGIgLCBiaXQgOC02ID0gMTAwICovCisJd3JpdGVsKHRtcCwgbW1pbyArIFBEQ19TTEVXX0NUTCk7Cit9CisKK3N0YXRpYyBpbnQgcGRjX2F0YV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBiYXNlOworCXZvaWQgKm1taW9fYmFzZTsKKwl1bnNpZ25lZCBpbnQgYm9hcmRfaWR4ID0gKHVuc2lnbmVkIGludCkgZW50LT5kcml2ZXJfZGF0YTsKKwlpbnQgcGNpX2Rldl9idXN5ID0gMDsKKwlpbnQgcmM7CisKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKworCS8qCisJICogSWYgdGhpcyBkcml2ZXIgaGFwcGVucyB0byBvbmx5IGJlIHVzZWZ1bCBvbiBBcHBsZSdzIEsyLCB0aGVuCisJICogd2Ugc2hvdWxkIGNoZWNrIHRoYXQgaGVyZSBhcyBpdCBoYXMgYSBub3JtYWwgU2VydmVyd29ya3MgSUQKKwkgKi8KKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmMpIHsKKwkJcGNpX2Rldl9idXN5ID0gMTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCisJcHJvYmVfZW50ID0ga21hbGxvYyhzaXplb2YoKnByb2JlX2VudCksIEdGUF9LRVJORUwpOworCWlmIChwcm9iZV9lbnQgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCX0KKworCW1lbXNldChwcm9iZV9lbnQsIDAsIHNpemVvZigqcHJvYmVfZW50KSk7CisJcHJvYmVfZW50LT5kZXYgPSBwY2lfZGV2X3RvX2RldihwZGV2KTsKKwlJTklUX0xJU1RfSEVBRCgmcHJvYmVfZW50LT5ub2RlKTsKKworCW1taW9fYmFzZSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpLAorCQkgICAgICAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDMpKTsKKwlpZiAobW1pb19iYXNlID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZV9lbnQ7CisJfQorCWJhc2UgPSAodW5zaWduZWQgbG9uZykgbW1pb19iYXNlOworCisJcHJvYmVfZW50LT5zaHQJCT0gcGRjX3BvcnRfaW5mb1tib2FyZF9pZHhdLnNodDsKKwlwcm9iZV9lbnQtPmhvc3RfZmxhZ3MJPSBwZGNfcG9ydF9pbmZvW2JvYXJkX2lkeF0uaG9zdF9mbGFnczsKKwlwcm9iZV9lbnQtPnBpb19tYXNrCT0gcGRjX3BvcnRfaW5mb1tib2FyZF9pZHhdLnBpb19tYXNrOworCXByb2JlX2VudC0+bXdkbWFfbWFzawk9IHBkY19wb3J0X2luZm9bYm9hcmRfaWR4XS5td2RtYV9tYXNrOworCXByb2JlX2VudC0+dWRtYV9tYXNrCT0gcGRjX3BvcnRfaW5mb1tib2FyZF9pZHhdLnVkbWFfbWFzazsKKwlwcm9iZV9lbnQtPnBvcnRfb3BzCT0gcGRjX3BvcnRfaW5mb1tib2FyZF9pZHhdLnBvcnRfb3BzOworCisgICAgICAgCXByb2JlX2VudC0+aXJxID0gcGRldi0+aXJxOworICAgICAgIAlwcm9iZV9lbnQtPmlycV9mbGFncyA9IFNBX1NISVJROworCXByb2JlX2VudC0+bW1pb19iYXNlID0gbW1pb19iYXNlOworCisJcGRjX2F0YV9zZXR1cF9wb3J0KCZwcm9iZV9lbnQtPnBvcnRbMF0sIGJhc2UgKyAweDIwMCk7CisJcGRjX2F0YV9zZXR1cF9wb3J0KCZwcm9iZV9lbnQtPnBvcnRbMV0sIGJhc2UgKyAweDI4MCk7CisKKwlwcm9iZV9lbnQtPnBvcnRbMF0uc2NyX2FkZHIgPSBiYXNlICsgMHg0MDA7CisJcHJvYmVfZW50LT5wb3J0WzFdLnNjcl9hZGRyID0gYmFzZSArIDB4NTAwOworCisJLyogbm90aWNlIDQtcG9ydCBib2FyZHMgKi8KKwlzd2l0Y2ggKGJvYXJkX2lkeCkgeworCWNhc2UgYm9hcmRfMjAzMTk6CisgICAgICAgCQlwcm9iZV9lbnQtPm5fcG9ydHMgPSA0OworCisJCXBkY19hdGFfc2V0dXBfcG9ydCgmcHJvYmVfZW50LT5wb3J0WzJdLCBiYXNlICsgMHgzMDApOworCQlwZGNfYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFszXSwgYmFzZSArIDB4MzgwKTsKKworCQlwcm9iZV9lbnQtPnBvcnRbMl0uc2NyX2FkZHIgPSBiYXNlICsgMHg2MDA7CisJCXByb2JlX2VudC0+cG9ydFszXS5zY3JfYWRkciA9IGJhc2UgKyAweDcwMDsKKwkJYnJlYWs7CisJY2FzZSBib2FyZF8yMDM3eDoKKyAgICAgICAJCXByb2JlX2VudC0+bl9wb3J0cyA9IDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlicmVhazsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCS8qIGluaXRpYWxpemUgYWRhcHRlciAqLworCXBkY19ob3N0X2luaXQoYm9hcmRfaWR4LCBwcm9iZV9lbnQpOworCisJLyogRklYTUU6IGNoZWNrIGF0YV9kZXZpY2VfYWRkIHJldHVybiB2YWx1ZSAqLworCWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCk7CisJa2ZyZWUocHJvYmVfZW50KTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2ZyZWVfZW50OgorCWtmcmVlKHByb2JlX2VudCk7CitlcnJfb3V0X3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXQ6CisJaWYgKCFwY2lfZGV2X2J1c3kpCisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgcGRjX2F0YV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcGRjX2F0YV9wY2lfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgcGRjX2F0YV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwZGNfYXRhX3BjaV9kcml2ZXIpOworfQorCisKK01PRFVMRV9BVVRIT1IoIkplZmYgR2FyemlrIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlByb21pc2UgU0FUQSBUWDIvVFg0IGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwZGNfYXRhX3BjaV90YmwpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCittb2R1bGVfaW5pdChwZGNfYXRhX2luaXQpOworbW9kdWxlX2V4aXQocGRjX2F0YV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX3Byb21pc2UuaCBiL2RyaXZlcnMvc2NzaS9zYXRhX3Byb21pc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTdlOTZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfcHJvbWlzZS5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogIHNhdGFfcHJvbWlzZS5oIC0gUHJvbWlzZSBTQVRBIGNvbW1vbiBkZWZpbml0aW9ucyBhbmQgaW5saW5lIGZ1bmNzCisgKgorICogIENvcHlyaWdodCAyMDAzLTIwMDQgUmVkIEhhdCwgSW5jLgorICoKKyAqICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBPcGVuCisgKiAgU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMSB0aGF0IGNhbiBiZSBmb3VuZCBhdAorICogIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLTEuMS50eHQgYW5kIGlzIGluY2x1ZGVkIGhlcmVpbgorICogIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpIGFzIGRpc3RyaWJ1dGVkCisgKiAgaW4gdGhlIGtlcm5lbCBzb3VyY2UgQ09QWUlORyBmaWxlLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mCisgKiAgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZSBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93CisgKiAgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgorICogIHRoZSBPU0wsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kCisgKiAgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLgorICogIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIKKyAqICB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE9TTCBvciB0aGUgR1BMLgorICoKKyAqLworCisjaWZuZGVmIF9fU0FUQV9QUk9NSVNFX0hfXworI2RlZmluZSBfX1NBVEFfUFJPTUlTRV9IX18KKworI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgorCitlbnVtIHBkY19wYWNrZXRfYml0cyB7CisJUERDX1BLVF9SRUFECQk9ICgxIDw8IDIpLAorCVBEQ19QS1RfTk9EQVRBCQk9ICgxIDw8IDMpLAorCisJUERDX1BLVF9TSVpFTUFTSwk9ICgxIDw8IDcpIHwgKDEgPDwgNikgfCAoMSA8PCA1KSwKKwlQRENfUEtUX0NMRUFSX0JTWQk9ICgxIDw8IDQpLAorCVBEQ19QS1RfV0FJVF9EUkRZCT0gKDEgPDwgMykgfCAoMSA8PCA0KSwKKwlQRENfTEFTVF9SRUcJCT0gKDEgPDwgMyksCisKKwlQRENfUkVHX0RFVkNUTAkJPSAoMSA8PCAzKSB8ICgxIDw8IDIpIHwgKDEgPDwgMSksCit9OworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwZGNfcGt0X2hlYWRlcihzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiwKKwkJCQkJICBkbWFfYWRkcl90IHNnX3RhYmxlLAorCQkJCQkgIHVuc2lnbmVkIGludCBkZXZubywgdTggKmJ1ZikKK3sKKwl1OCBkZXZfcmVnOworCXUzMiAqYnVmMzIgPSAodTMyICopIGJ1ZjsKKworCS8qIHNldCBjb250cm9sIGJpdHMgKGJ5dGUgMCksIHplcm8gZGVsYXkgc2VxIGlkIChieXRlIDMpLAorCSAqIGFuZCBzZXEgaWQgKGJ5dGUgMikKKwkgKi8KKwlzd2l0Y2ggKHRmLT5wcm90b2NvbCkgeworCWNhc2UgQVRBX1BST1RfRE1BOgorCQlpZiAoISh0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpKQorCQkJYnVmMzJbMF0gPSBjcHVfdG9fbGUzMihQRENfUEtUX1JFQUQpOworCQllbHNlCisJCQlidWYzMlswXSA9IDA7CisJCWJyZWFrOworCisJY2FzZSBBVEFfUFJPVF9OT0RBVEE6CisJCWJ1ZjMyWzBdID0gY3B1X3RvX2xlMzIoUERDX1BLVF9OT0RBVEEpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCQlicmVhazsKKwl9CisKKwlidWYzMlsxXSA9IGNwdV90b19sZTMyKHNnX3RhYmxlKTsJLyogUy9HIHRhYmxlIGFkZHIgKi8KKwlidWYzMlsyXSA9IDA7CQkJCS8qIG5vIG5leHQtcGFja2V0ICovCisKKwlpZiAoZGV2bm8gPT0gMCkKKwkJZGV2X3JlZyA9IEFUQV9ERVZJQ0VfT0JTOworCWVsc2UKKwkJZGV2X3JlZyA9IEFUQV9ERVZJQ0VfT0JTIHwgQVRBX0RFVjE7CisKKwkvKiBzZWxlY3QgZGV2aWNlICovCisJYnVmWzEyXSA9ICgxIDw8IDUpIHwgUERDX1BLVF9DTEVBUl9CU1kgfCBBVEFfUkVHX0RFVklDRTsKKwlidWZbMTNdID0gZGV2X3JlZzsKKworCS8qIGRldmljZSBjb250cm9sIHJlZ2lzdGVyICovCisJYnVmWzE0XSA9ICgxIDw8IDUpIHwgUERDX1JFR19ERVZDVEw7CisJYnVmWzE1XSA9IHRmLT5jdGw7CisKKwlyZXR1cm4gMTY7IAkvKiBvZmZzZXQgb2YgbmV4dCBieXRlICovCit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBkY19wa3RfZm9vdGVyKHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmLCB1OCAqYnVmLAorCQkJCSAgdW5zaWduZWQgaW50IGkpCit7CisJaWYgKHRmLT5mbGFncyAmIEFUQV9URkxBR19ERVZJQ0UpIHsKKwkJYnVmW2krK10gPSAoMSA8PCA1KSB8IEFUQV9SRUdfREVWSUNFOworCQlidWZbaSsrXSA9IHRmLT5kZXZpY2U7CisJfQorCisJLyogYW5kIGZpbmFsbHkgdGhlIGNvbW1hbmQgaXRzZWxmOyBhbHNvIGluY2x1ZGVzIGVuZC1vZi1wa3QgbWFya2VyICovCisJYnVmW2krK10gPSAoMSA8PCA1KSB8IFBEQ19MQVNUX1JFRyB8IEFUQV9SRUdfQ01EOworCWJ1ZltpKytdID0gdGYtPmNvbW1hbmQ7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcGRjX3ByZXBfbGJhMjgoc3RydWN0IGF0YV90YXNrZmlsZSAqdGYsIHU4ICpidWYsIHVuc2lnbmVkIGludCBpKQoreworCS8qIHRoZSAiKDEgPDwgNSkiIHNob3VsZCBiZSByZWFkICIoY291bnQgPDwgNSkiICovCisKKwkvKiBBVEEgY29tbWFuZCBibG9jayByZWdpc3RlcnMgKi8KKwlidWZbaSsrXSA9ICgxIDw8IDUpIHwgQVRBX1JFR19GRUFUVVJFOworCWJ1ZltpKytdID0gdGYtPmZlYXR1cmU7CisKKwlidWZbaSsrXSA9ICgxIDw8IDUpIHwgQVRBX1JFR19OU0VDVDsKKwlidWZbaSsrXSA9IHRmLT5uc2VjdDsKKworCWJ1ZltpKytdID0gKDEgPDwgNSkgfCBBVEFfUkVHX0xCQUw7CisJYnVmW2krK10gPSB0Zi0+bGJhbDsKKworCWJ1ZltpKytdID0gKDEgPDwgNSkgfCBBVEFfUkVHX0xCQU07CisJYnVmW2krK10gPSB0Zi0+bGJhbTsKKworCWJ1ZltpKytdID0gKDEgPDwgNSkgfCBBVEFfUkVHX0xCQUg7CisJYnVmW2krK10gPSB0Zi0+bGJhaDsKKworCXJldHVybiBpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwZGNfcHJlcF9sYmE0OChzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiwgdTggKmJ1ZiwgdW5zaWduZWQgaW50IGkpCit7CisJLyogdGhlICIoMiA8PCA1KSIgc2hvdWxkIGJlIHJlYWQgIihjb3VudCA8PCA1KSIgKi8KKworCS8qIEFUQSBjb21tYW5kIGJsb2NrIHJlZ2lzdGVycyAqLworCWJ1ZltpKytdID0gKDIgPDwgNSkgfCBBVEFfUkVHX0ZFQVRVUkU7CisJYnVmW2krK10gPSB0Zi0+aG9iX2ZlYXR1cmU7CisJYnVmW2krK10gPSB0Zi0+ZmVhdHVyZTsKKworCWJ1ZltpKytdID0gKDIgPDwgNSkgfCBBVEFfUkVHX05TRUNUOworCWJ1ZltpKytdID0gdGYtPmhvYl9uc2VjdDsKKwlidWZbaSsrXSA9IHRmLT5uc2VjdDsKKworCWJ1ZltpKytdID0gKDIgPDwgNSkgfCBBVEFfUkVHX0xCQUw7CisJYnVmW2krK10gPSB0Zi0+aG9iX2xiYWw7CisJYnVmW2krK10gPSB0Zi0+bGJhbDsKKworCWJ1ZltpKytdID0gKDIgPDwgNSkgfCBBVEFfUkVHX0xCQU07CisJYnVmW2krK10gPSB0Zi0+aG9iX2xiYW07CisJYnVmW2krK10gPSB0Zi0+bGJhbTsKKworCWJ1ZltpKytdID0gKDIgPDwgNSkgfCBBVEFfUkVHX0xCQUg7CisJYnVmW2krK10gPSB0Zi0+aG9iX2xiYWg7CisJYnVmW2krK10gPSB0Zi0+bGJhaDsKKworCXJldHVybiBpOworfQorCisKKyNlbmRpZiAvKiBfX1NBVEFfUFJPTUlTRV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX3FzdG9yLmMgYi9kcml2ZXJzL3Njc2kvc2F0YV9xc3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDM2MjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2F0YV9xc3Rvci5jCkBAIC0wLDAgKzEsNzE4IEBACisvKgorICogIHNhdGFfcXN0b3IuYyAtIFBhY2lmaWMgRGlnaXRhbCBDb3Jwb3JhdGlvbiBRU3RvciBTQVRBCisgKgorICogIE1haW50YWluZWQgYnk6ICBNYXJrIExvcmQgPG1sb3JkQHBvYm94LmNvbT4KKyAqCisgKiAgQ29weXJpZ2h0IDIwMDUgUGFjaWZpYyBEaWdpdGFsIENvcnBvcmF0aW9uLgorICogIChPU0wvR1BMIGNvZGUgcmVsZWFzZSBhdXRob3JpemVkIGJ5IEphbGlsIEZhZGF2aSkuCisgKgorICogIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE9wZW4KKyAqICBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4xIHRoYXQgY2FuIGJlIGZvdW5kIGF0CisgKiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMS4xLnR4dCBhbmQgaXMgaW5jbHVkZWQgaGVyZWluCisgKiAgYnkgcmVmZXJlbmNlLgorICoKKyAqICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIikgYXMgZGlzdHJpYnV0ZWQKKyAqICBpbiB0aGUga2VybmVsIHNvdXJjZSBDT1BZSU5HIGZpbGUsIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YKKyAqICB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cKKyAqICB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiAgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCisgKiAgdGhlIE9TTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKKyAqICByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuCisgKiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91cgorICogIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUgT1NMIG9yIHRoZSBHUEwuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorCisjZGVmaW5lIERSVl9OQU1FCSJzYXRhX3FzdG9yIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4wNCIKKworZW51bSB7CisJUVNfUE9SVFMJCT0gNCwKKwlRU19NQVhfUFJECQk9IExJQkFUQV9NQVhfUFJELAorCVFTX0NQQl9PUkRFUgkJPSA2LAorCVFTX0NQQl9CWVRFUwkJPSAoMSA8PCBRU19DUEJfT1JERVIpLAorCVFTX1BSRF9CWVRFUwkJPSBRU19NQVhfUFJEICogMTYsCisJUVNfUEtUX0JZVEVTCQk9IFFTX0NQQl9CWVRFUyArIFFTX1BSRF9CWVRFUywKKworCVFTX0RNQV9CT1VOREFSWQkJPSB+MFVMLAorCisJLyogZ2xvYmFsIHJlZ2lzdGVyIG9mZnNldHMgKi8KKwlRU19IQ0ZfQ05GRzMJCT0gMHgwMDAzLCAvKiBob3N0IGNvbmZpZ3VyYXRpb24gb2Zmc2V0ICovCisJUVNfSElEX0hQSFkJCT0gMHgwMDA0LCAvKiBob3N0IHBoeXNpY2FsIGludGVyZmFjZSBpbmZvICovCisJUVNfSENUX0NUUkwJCT0gMHgwMGU0LCAvKiBnbG9iYWwgaW50ZXJydXB0IG1hc2sgb2Zmc2V0ICovCisJUVNfSFNUX1NGRgkJPSAweDAxMDAsIC8qIGhvc3Qgc3RhdHVzIGZpZm8gb2Zmc2V0ICovCisJUVNfSFZTX1NFUkQzCQk9IDB4MDM5MywgLyogUEhZIGVuYWJsZSBvZmZzZXQgKi8KKworCS8qIGdsb2JhbCBjb250cm9sIGJpdHMgKi8KKwlRU19IUEhZXzY0QklUCQk9ICgxIDw8IDEpLCAvKiA2NC1iaXQgYnVzIGRldGVjdGVkICovCisJUVNfQ05GRzNfR1NSU1QJCT0gMHgwMSwgICAgIC8qIGdsb2JhbCBjaGlwIHJlc2V0ICovCisJUVNfU0VSRDNfUEhZX0VOQQk9IDB4ZjAsICAgICAvKiBQSFkgZGV0ZWN0aW9uIEVOQWJsZSovCisKKwkvKiBwZXItY2hhbm5lbCByZWdpc3RlciBvZmZzZXRzICovCisJUVNfQ0NGX0NQQkEJCT0gMHgwNzEwLCAvKiBjaGFuIENQQiBiYXNlIGFkZHJlc3MgKi8KKwlRU19DQ0ZfQ1NFUAkJPSAweDA3MTgsIC8qIGNoYW4gQ1BCIHNlcGFyYXRpb24gZmFjdG9yICovCisJUVNfQ0ZDX0hVRlQJCT0gMHgwODAwLCAvKiBob3N0IHVwc3RyZWFtIGZpZm8gdGhyZXNob2xkICovCisJUVNfQ0ZDX0hERlQJCT0gMHgwODA0LCAvKiBob3N0IGRvd25zdHJlYW0gZmlmbyB0aHJlc2hvbGQgKi8KKwlRU19DRkNfRFVGVAkJPSAweDA4MDgsIC8qIGRldiB1cHN0cmVhbSBmaWZvIHRocmVzaG9sZCAqLworCVFTX0NGQ19EREZUCQk9IDB4MDgwYywgLyogZGV2IGRvd25zdHJlYW0gZmlmbyB0aHJlc2hvbGQgKi8KKwlRU19DQ1RfQ1RSMAkJPSAweDA5MDAsIC8qIGNoYW4gY29udHJvbC0wIG9mZnNldCAqLworCVFTX0NDVF9DVFIxCQk9IDB4MDkwMSwgLyogY2hhbiBjb250cm9sLTEgb2Zmc2V0ICovCisJUVNfQ0NUX0NGRgkJPSAweDBhMDAsIC8qIGNoYW4gY29tbWFuZCBmaWZvIG9mZnNldCAqLworCisJLyogY2hhbm5lbCBjb250cm9sIGJpdHMgKi8KKwlRU19DVFIwX1JFRwkJPSAoMSA8PCAxKSwgICAvKiByZWdpc3RlciBtb2RlICh2cy4gcGt0IG1vZGUpICovCisJUVNfQ1RSMF9DTEVSCQk9ICgxIDw8IDIpLCAgIC8qIGNsZWFyIGNoYW5uZWwgZXJyb3JzICovCisJUVNfQ1RSMV9SREVWCQk9ICgxIDw8IDEpLCAgIC8qIHNhdGEgcGh5L2NvbW1zIHJlc2V0ICovCisJUVNfQ1RSMV9SQ0hOCQk9ICgxIDw8IDQpLCAgIC8qIHJlc2V0IGNoYW5uZWwgbG9naWMgKi8KKwlRU19DQ0ZfUlVOX1BLVAkJPSAweDEwNywgICAgICAvKiBSVU4gYSBuZXcgZG1hIFBLVCAqLworCisJLyogcGt0IHN1Yi1maWVsZCBoZWFkZXJzICovCisJUVNfSENCX0hEUgkJPSAweDAxLCAgIC8qIEhvc3QgQ29udHJvbCBCbG9jayBoZWFkZXIgKi8KKwlRU19EQ0JfSERSCQk9IDB4MDIsICAgLyogRGV2aWNlIENvbnRyb2wgQmxvY2sgaGVhZGVyICovCisKKwkvKiBwa3QgSENCIGZsYWcgYml0cyAqLworCVFTX0hGX0RJUk8JCT0gKDEgPDwgMCksICAgLyogZGF0YSBESVJlY3Rpb24gT3V0ICovCisJUVNfSEZfREFUCQk9ICgxIDw8IDMpLCAgIC8qIERBVGEgcGt0ICovCisJUVNfSEZfSUVOCQk9ICgxIDw8IDQpLCAgIC8qIEludGVycnVwdCBFTmFibGUgKi8KKwlRU19IRl9WTEQJCT0gKDEgPDwgNSksICAgLyogVmFMaUQgcGt0ICovCisKKwkvKiBwa3QgRENCIGZsYWcgYml0cyAqLworCVFTX0RGX1BPUkQJCT0gKDEgPDwgMiksICAgLyogUGlvIE9SIERtYSAqLworCVFTX0RGX0VMQkEJCT0gKDEgPDwgMyksICAgLyogRXh0ZW5kZWQgTEJBIChsYmE0OCkgKi8KKworCS8qIFBDSSBkZXZpY2UgSURzICovCisJYm9hcmRfMjA2OF9pZHgJCT0gMCwJLyogUVN0b3IgNC1wb3J0IFNBVEEvUkFJRCAqLworfTsKKwordHlwZWRlZiBlbnVtIHsgcXNfc3RhdGVfaWRsZSwgcXNfc3RhdGVfcGt0LCBxc19zdGF0ZV9tbWlvIH0gcXNfc3RhdGVfdDsKKworc3RydWN0IHFzX3BvcnRfcHJpdiB7CisJdTgJCQkqcGt0OworCWRtYV9hZGRyX3QJCXBrdF9kbWE7CisJcXNfc3RhdGVfdAkJc3RhdGU7Cit9OworCitzdGF0aWMgdTMyIHFzX3Njcl9yZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKTsKK3N0YXRpYyB2b2lkIHFzX3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCk7CitzdGF0aWMgaW50IHFzX2F0YV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworc3RhdGljIGlycXJldHVybl90IHFzX2ludHIgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCBxc19wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgcXNfaG9zdF9zdG9wKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KTsKK3N0YXRpYyB2b2lkIHFzX3BvcnRfc3RvcChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIHFzX3BoeV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIHFzX3FjX3ByZXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CitzdGF0aWMgaW50IHFzX3FjX2lzc3VlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworc3RhdGljIGludCBxc19jaGVja19hdGFwaV9kbWEoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CitzdGF0aWMgdm9pZCBxc19ibWRtYV9zdG9wKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHU4IHFzX2JtZG1hX3N0YXR1cyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIHFzX2lycV9jbGVhcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIHFzX2VuZ190aW1lb3V0KHN0cnVjdCBhdGFfcG9ydCAqYXApOworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIHFzX2F0YV9zaHQgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pb2N0bAkJCT0gYXRhX3Njc2lfaW9jdGwsCisJLnF1ZXVlY29tbWFuZAkJPSBhdGFfc2NzaV9xdWV1ZWNtZCwKKwkuZWhfc3RyYXRlZ3lfaGFuZGxlcgk9IGF0YV9zY3NpX2Vycm9yLAorCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKKwkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCisJLnNnX3RhYmxlc2l6ZQkJPSBRU19NQVhfUFJELAorCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCisJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCisJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCisJLy9GSVhNRSAudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKKwkuZG1hX2JvdW5kYXJ5CQk9IFFTX0RNQV9CT1VOREFSWSwKKwkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBxc19hdGFfb3BzID0geworCS5wb3J0X2Rpc2FibGUJCT0gYXRhX3BvcnRfZGlzYWJsZSwKKwkudGZfbG9hZAkJPSBhdGFfdGZfbG9hZCwKKwkudGZfcmVhZAkJPSBhdGFfdGZfcmVhZCwKKwkuY2hlY2tfc3RhdHVzCQk9IGF0YV9jaGVja19zdGF0dXMsCisJLmNoZWNrX2F0YXBpX2RtYQk9IHFzX2NoZWNrX2F0YXBpX2RtYSwKKwkuZXhlY19jb21tYW5kCQk9IGF0YV9leGVjX2NvbW1hbmQsCisJLmRldl9zZWxlY3QJCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAorCS5waHlfcmVzZXQJCT0gcXNfcGh5X3Jlc2V0LAorCS5xY19wcmVwCQk9IHFzX3FjX3ByZXAsCisJLnFjX2lzc3VlCQk9IHFzX3FjX2lzc3VlLAorCS5lbmdfdGltZW91dAkJPSBxc19lbmdfdGltZW91dCwKKwkuaXJxX2hhbmRsZXIJCT0gcXNfaW50ciwKKwkuaXJxX2NsZWFyCQk9IHFzX2lycV9jbGVhciwKKwkuc2NyX3JlYWQJCT0gcXNfc2NyX3JlYWQsCisJLnNjcl93cml0ZQkJPSBxc19zY3Jfd3JpdGUsCisJLnBvcnRfc3RhcnQJCT0gcXNfcG9ydF9zdGFydCwKKwkucG9ydF9zdG9wCQk9IHFzX3BvcnRfc3RvcCwKKwkuaG9zdF9zdG9wCQk9IHFzX2hvc3Rfc3RvcCwKKwkuYm1kbWFfc3RvcAkJPSBxc19ibWRtYV9zdG9wLAorCS5ibWRtYV9zdGF0dXMJCT0gcXNfYm1kbWFfc3RhdHVzLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIHFzX3BvcnRfaW5mb1tdID0geworCS8qIGJvYXJkXzIwNjhfaWR4ICovCisJeworCQkuc2h0CQk9ICZxc19hdGFfc2h0LAorCQkuaG9zdF9mbGFncwk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1kgfAorCQkJCSAgQVRBX0ZMQUdfU0FUQV9SRVNFVCB8CisJCQkJICAvL0ZJWE1FIEFUQV9GTEFHX1NSU1QgfAorCQkJCSAgQVRBX0ZMQUdfTU1JTywKKwkJLnBpb19tYXNrCT0gMHgxMCwgLyogcGlvNCAqLworCQkudWRtYV9tYXNrCT0gMHg3ZiwgLyogdWRtYTAtNiAqLworCQkucG9ydF9vcHMJPSAmcXNfYXRhX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHFzX2F0YV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX1BEQywgMHgyMDY4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCSAgYm9hcmRfMjA2OF9pZHggfSwKKworCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHFzX2F0YV9wY2lfZHJpdmVyID0geworCS5uYW1lCQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJCT0gcXNfYXRhX3BjaV90YmwsCisJLnByb2JlCQkJPSBxc19hdGFfaW5pdF9vbmUsCisJLnJlbW92ZQkJCT0gYXRhX3BjaV9yZW1vdmVfb25lLAorfTsKKworc3RhdGljIGludCBxc19jaGVja19hdGFwaV9kbWEoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlyZXR1cm4gMTsJLyogQVRBUEkgRE1BIG5vdCBzdXBwb3J0ZWQgKi8KK30KKworc3RhdGljIHZvaWQgcXNfYm1kbWFfc3RvcChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCS8qIG5vdGhpbmcgKi8KK30KKworc3RhdGljIHU4IHFzX2JtZG1hX3N0YXR1cyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxc19pcnFfY2xlYXIoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwkvKiBub3RoaW5nICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxc19lbnRlcl9yZWdfbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXU4IF9faW9tZW0gKmNoYW4gPSBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZSArIChhcC0+cG9ydF9ubyAqIDB4NDAwMCk7CisKKwl3cml0ZWIoUVNfQ1RSMF9SRUcsIGNoYW4gKyBRU19DQ1RfQ1RSMCk7CisJcmVhZGIoY2hhbiArIFFTX0NDVF9DVFIwKTsgICAgICAgIC8qIGZsdXNoICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxc19yZXNldF9jaGFubmVsX2xvZ2ljKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdTggX19pb21lbSAqY2hhbiA9IGFwLT5ob3N0X3NldC0+bW1pb19iYXNlICsgKGFwLT5wb3J0X25vICogMHg0MDAwKTsKKworCXdyaXRlYihRU19DVFIxX1JDSE4sIGNoYW4gKyBRU19DQ1RfQ1RSMSk7CisJcmVhZGIoY2hhbiArIFFTX0NDVF9DVFIwKTsgICAgICAgIC8qIGZsdXNoICovCisJcXNfZW50ZXJfcmVnX21vZGUoYXApOworfQorCitzdGF0aWMgdm9pZCBxc19waHlfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgcXNfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CisKKwlwcC0+c3RhdGUgPSBxc19zdGF0ZV9pZGxlOworCXFzX3Jlc2V0X2NoYW5uZWxfbG9naWMoYXApOworCXNhdGFfcGh5X3Jlc2V0KGFwKTsKK30KKworc3RhdGljIHZvaWQgcXNfZW5nX3RpbWVvdXQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgcXNfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CisKKwlpZiAocHAtPnN0YXRlICE9IHFzX3N0YXRlX2lkbGUpIC8qIGhlYWx0aHkgcGFyYW5vaWEgKi8KKwkJcHAtPnN0YXRlID0gcXNfc3RhdGVfbW1pbzsKKwlxc19yZXNldF9jaGFubmVsX2xvZ2ljKGFwKTsKKwlhdGFfZW5nX3RpbWVvdXQoYXApOworfQorCitzdGF0aWMgdTMyIHFzX3Njcl9yZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKQoreworCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkKKwkJcmV0dXJuIH4wVTsKKwlyZXR1cm4gcmVhZGwoKHZvaWQgX19pb21lbSAqKShhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDgpKSk7Cit9CisKK3N0YXRpYyB2b2lkIHFzX3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCkKK3sKKwlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpCisJCXJldHVybjsKKwl3cml0ZWwodmFsLCAodm9pZCBfX2lvbWVtICopKGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogOCkpKTsKK30KKworc3RhdGljIHZvaWQgcXNfZmlsbF9zZyhzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBxYy0+c2c7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwlzdHJ1Y3QgcXNfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IG5lbGVtOworCXU4ICpwcmQgPSBwcC0+cGt0ICsgUVNfQ1BCX0JZVEVTOworCisJYXNzZXJ0KHNnICE9IE5VTEwpOworCWFzc2VydChxYy0+bl9lbGVtID4gMCk7CisKKwlmb3IgKG5lbGVtID0gMDsgbmVsZW0gPCBxYy0+bl9lbGVtOyBuZWxlbSsrLHNnKyspIHsKKwkJdTY0IGFkZHI7CisJCXUzMiBsZW47CisKKwkJYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJKihfX2xlNjQgKilwcmQgPSBjcHVfdG9fbGU2NChhZGRyKTsKKwkJcHJkICs9IHNpemVvZih1NjQpOworCisJCWxlbiA9IHNnX2RtYV9sZW4oc2cpOworCQkqKF9fbGUzMiAqKXByZCA9IGNwdV90b19sZTMyKGxlbik7CisJCXByZCArPSBzaXplb2YodTY0KTsKKworCQlWUFJJTlRLKCJQUkRbJXVdID0gKDB4JWxsWCwgMHglWClcbiIsIG5lbGVtLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWFkZHIsIGxlbik7CisJfQorfQorCitzdGF0aWMgdm9pZCBxc19xY19wcmVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IHFzX3BvcnRfcHJpdiAqcHAgPSBxYy0+YXAtPnByaXZhdGVfZGF0YTsKKwl1OCBkZmxhZ3MgPSBRU19ERl9QT1JELCAqYnVmID0gcHAtPnBrdDsKKwl1OCBoZmxhZ3MgPSBRU19IRl9EQVQgfCBRU19IRl9JRU4gfCBRU19IRl9WTEQ7CisJdTY0IGFkZHI7CisKKwlWUFJJTlRLKCJFTlRFUlxuIik7CisKKwlxc19lbnRlcl9yZWdfbW9kZShxYy0+YXApOworCWlmIChxYy0+dGYucHJvdG9jb2wgIT0gQVRBX1BST1RfRE1BKSB7CisJCWF0YV9xY19wcmVwKHFjKTsKKwkJcmV0dXJuOworCX0KKworCXFzX2ZpbGxfc2cocWMpOworCisJaWYgKChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpKQorCQloZmxhZ3MgfD0gUVNfSEZfRElSTzsKKwlpZiAoKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19MQkE0OCkpCisJCWRmbGFncyB8PSBRU19ERl9FTEJBOworCisJLyogaG9zdCBjb250cm9sIGJsb2NrIChIQ0IpICovCisJYnVmWyAwXSA9IFFTX0hDQl9IRFI7CisJYnVmWyAxXSA9IGhmbGFnczsKKwkqKF9fbGUzMiAqKSgmYnVmWyA0XSkgPSBjcHVfdG9fbGUzMihxYy0+bnNlY3QgKiBBVEFfU0VDVF9TSVpFKTsKKwkqKF9fbGUzMiAqKSgmYnVmWyA4XSkgPSBjcHVfdG9fbGUzMihxYy0+bl9lbGVtKTsKKwlhZGRyID0gKCh1NjQpcHAtPnBrdF9kbWEpICsgUVNfQ1BCX0JZVEVTOworCSooX19sZTY0ICopKCZidWZbMTZdKSA9IGNwdV90b19sZTY0KGFkZHIpOworCisJLyogZGV2aWNlIGNvbnRyb2wgYmxvY2sgKERDQikgKi8KKwlidWZbMjRdID0gUVNfRENCX0hEUjsKKwlidWZbMjhdID0gZGZsYWdzOworCisJLyogZnJhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlIChGSVMpICovCisJYXRhX3RmX3RvX2ZpcygmcWMtPnRmLCAmYnVmWzMyXSwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxc19wYWNrZXRfc3RhcnQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXU4IF9faW9tZW0gKmNoYW4gPSBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZSArIChhcC0+cG9ydF9ubyAqIDB4NDAwMCk7CisKKwlWUFJJTlRLKCJFTlRFUiwgYXAgJXBcbiIsIGFwKTsKKworCXdyaXRlYihRU19DVFIwX0NMRVIsIGNoYW4gKyBRU19DQ1RfQ1RSMCk7CisJd21iKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbHVzaCBQUkRzIGFuZCBwa3QgdG8gbWVtb3J5ICovCisJd3JpdGVsKFFTX0NDRl9SVU5fUEtULCBjaGFuICsgUVNfQ0NUX0NGRik7CisJcmVhZGwoY2hhbiArIFFTX0NDVF9DRkYpOyAgICAgICAgICAvKiBmbHVzaCAqLworfQorCitzdGF0aWMgaW50IHFzX3FjX2lzc3VlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IHFzX3BvcnRfcHJpdiAqcHAgPSBxYy0+YXAtPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAocWMtPnRmLnByb3RvY29sKSB7CisJY2FzZSBBVEFfUFJPVF9ETUE6CisKKwkJcHAtPnN0YXRlID0gcXNfc3RhdGVfcGt0OworCQlxc19wYWNrZXRfc3RhcnQocWMpOworCQlyZXR1cm4gMDsKKworCWNhc2UgQVRBX1BST1RfQVRBUElfRE1BOgorCQlCVUcoKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlwcC0+c3RhdGUgPSBxc19zdGF0ZV9tbWlvOworCXJldHVybiBhdGFfcWNfaXNzdWVfcHJvdChxYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHFzX2ludHJfcGt0KHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KQoreworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKKwl1OCBzRkZFOworCXU4IF9faW9tZW0gKm1taW9fYmFzZSA9IGhvc3Rfc2V0LT5tbWlvX2Jhc2U7CisKKwlkbyB7CisJCXUzMiBzZmYwID0gcmVhZGwobW1pb19iYXNlICsgUVNfSFNUX1NGRik7CisJCXUzMiBzZmYxID0gcmVhZGwobW1pb19iYXNlICsgUVNfSFNUX1NGRiArIDQpOworCQl1OCBzRVZMRCA9IChzZmYxID4+IDMwKSAmIDB4MDE7CS8qIHZhbGlkIGZsYWcgKi8KKwkJc0ZGRSAgPSBzZmYxID4+IDMxOwkJLyogZW1wdHkgZmxhZyAqLworCisJCWlmIChzRVZMRCkgeworCQkJdTggc0RTVCA9IHNmZjAgPj4gMTY7CS8qIGRldiBzdGF0dXMgKi8KKwkJCXU4IHNIU1QgPSBzZmYxICYgMHgzZjsJLyogaG9zdCBzdGF0dXMgKi8KKwkJCXVuc2lnbmVkIGludCBwb3J0X25vID0gKHNmZjEgPj4gOCkgJiAweDAzOworCQkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3Rfc2V0LT5wb3J0c1twb3J0X25vXTsKKworCQkJRFBSSU5USygiU0ZGPSUwOHglMDh4OiBzQ0hBTj0ldSBzSFNUPSVkIHNEU1Q9JTAyeFxuIiwKKwkJCQkJc2ZmMSwgc2ZmMCwgcG9ydF9ubywgc0hTVCwgc0RTVCk7CisJCQloYW5kbGVkID0gMTsKKwkJCWlmIChhcCAmJiAoIShhcC0+ZmxhZ3MgJiBBVEFfRkxBR19QT1JUX0RJU0FCTEVEKSkpIHsKKwkJCQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCQkJCXN0cnVjdCBxc19wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKwkJCQlpZiAoIXBwIHx8IHBwLT5zdGF0ZSAhPSBxc19zdGF0ZV9wa3QpCisJCQkJCWNvbnRpbnVlOworCQkJCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7CisJCQkJaWYgKHFjICYmICghKHFjLT50Zi5jdGwgJiBBVEFfTklFTikpKSB7CisJCQkJCXN3aXRjaCAoc0hTVCkgeworCQkJCQljYXNlIDA6IC8qIHN1Y2Vzc2Z1bCBDUEIgKi8KKwkJCQkJY2FzZSAzOiAvKiBkZXZpY2UgZXJyb3IgKi8KKwkJCQkJCXBwLT5zdGF0ZSA9IHFzX3N0YXRlX2lkbGU7CisJCQkJCQlxc19lbnRlcl9yZWdfbW9kZShxYy0+YXApOworCQkJCQkJYXRhX3FjX2NvbXBsZXRlKHFjLCBzRFNUKTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9IHdoaWxlICghc0ZGRSk7CisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHFzX2ludHJfbW1pbyhzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCkKK3sKKwl1bnNpZ25lZCBpbnQgaGFuZGxlZCA9IDAsIHBvcnRfbm87CisKKwlmb3IgKHBvcnRfbm8gPSAwOyBwb3J0X25vIDwgaG9zdF9zZXQtPm5fcG9ydHM7ICsrcG9ydF9ubykgeworCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwOworCQlhcCA9IGhvc3Rfc2V0LT5wb3J0c1twb3J0X25vXTsKKwkJaWYgKGFwICYmICghKGFwLT5mbGFncyAmIEFUQV9GTEFHX1BPUlRfRElTQUJMRUQpKSkgeworCQkJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKKwkJCXN0cnVjdCBxc19wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKwkJCWlmICghcHAgfHwgcHAtPnN0YXRlICE9IHFzX3N0YXRlX21taW8pCisJCQkJY29udGludWU7CisJCQlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOworCQkJaWYgKHFjICYmICghKHFjLT50Zi5jdGwgJiBBVEFfTklFTikpKSB7CisKKwkJCQkvKiBjaGVjayBtYWluIHN0YXR1cywgY2xlYXJpbmcgSU5UUlEgKi8KKwkJCQl1OCBzdGF0dXMgPSBhdGFfY2hrX3N0YXR1cyhhcCk7CisJCQkJaWYgKChzdGF0dXMgJiBBVEFfQlVTWSkpCisJCQkJCWNvbnRpbnVlOworCQkJCURQUklOVEsoImF0YSV1OiBwcm90b2NvbCAlZCAoZGV2X3N0YXQgMHglWClcbiIsCisJCQkJCWFwLT5pZCwgcWMtPnRmLnByb3RvY29sLCBzdGF0dXMpOworCQkKKwkJCQkvKiBjb21wbGV0ZSB0YXNrZmlsZSB0cmFuc2FjdGlvbiAqLworCQkJCXBwLT5zdGF0ZSA9IHFzX3N0YXRlX2lkbGU7CisJCQkJYXRhX3FjX2NvbXBsZXRlKHFjLCBzdGF0dXMpOworCQkJCWhhbmRsZWQgPSAxOworCQkJfQorCQl9CisJfQorCXJldHVybiBoYW5kbGVkOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcXNfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0ID0gZGV2X2luc3RhbmNlOworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKKworCVZQUklOVEsoIkVOVEVSXG4iKTsKKworCXNwaW5fbG9jaygmaG9zdF9zZXQtPmxvY2spOworCWhhbmRsZWQgID0gcXNfaW50cl9wa3QoaG9zdF9zZXQpIHwgcXNfaW50cl9tbWlvKGhvc3Rfc2V0KTsKKwlzcGluX3VubG9jaygmaG9zdF9zZXQtPmxvY2spOworCisJVlBSSU5USygiRVhJVFxuIik7CisKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIHZvaWQgcXNfYXRhX3NldHVwX3BvcnQoc3RydWN0IGF0YV9pb3BvcnRzICpwb3J0LCB1bnNpZ25lZCBsb25nIGJhc2UpCit7CisJcG9ydC0+Y21kX2FkZHIJCT0KKwlwb3J0LT5kYXRhX2FkZHIJCT0gYmFzZSArIDB4NDAwOworCXBvcnQtPmVycm9yX2FkZHIJPQorCXBvcnQtPmZlYXR1cmVfYWRkcgk9IGJhc2UgKyAweDQwODsgLyogaG9iX2ZlYXR1cmUgPSAweDQwOSAqLworCXBvcnQtPm5zZWN0X2FkZHIJPSBiYXNlICsgMHg0MTA7IC8qIGhvYl9uc2VjdCAgID0gMHg0MTEgKi8KKwlwb3J0LT5sYmFsX2FkZHIJCT0gYmFzZSArIDB4NDE4OyAvKiBob2JfbGJhbCAgICA9IDB4NDE5ICovCisJcG9ydC0+bGJhbV9hZGRyCQk9IGJhc2UgKyAweDQyMDsgLyogaG9iX2xiYW0gICAgPSAweDQyMSAqLworCXBvcnQtPmxiYWhfYWRkcgkJPSBiYXNlICsgMHg0Mjg7IC8qIGhvYl9sYmFoICAgID0gMHg0MjkgKi8KKwlwb3J0LT5kZXZpY2VfYWRkcgk9IGJhc2UgKyAweDQzMDsKKwlwb3J0LT5zdGF0dXNfYWRkcgk9CisJcG9ydC0+Y29tbWFuZF9hZGRyCT0gYmFzZSArIDB4NDM4OworCXBvcnQtPmFsdHN0YXR1c19hZGRyCT0KKwlwb3J0LT5jdGxfYWRkcgkJPSBiYXNlICsgMHg0NDA7CisJcG9ydC0+c2NyX2FkZHIJCT0gYmFzZSArIDB4YzAwOworfQorCitzdGF0aWMgaW50IHFzX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhcC0+aG9zdF9zZXQtPmRldjsKKwlzdHJ1Y3QgcXNfcG9ydF9wcml2ICpwcDsKKwl2b2lkIF9faW9tZW0gKm1taW9fYmFzZSA9IGFwLT5ob3N0X3NldC0+bW1pb19iYXNlOworCXZvaWQgX19pb21lbSAqY2hhbiA9IG1taW9fYmFzZSArIChhcC0+cG9ydF9ubyAqIDB4NDAwMCk7CisJdTY0IGFkZHI7CisJaW50IHJjOworCisJcmMgPSBhdGFfcG9ydF9zdGFydChhcCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJcXNfZW50ZXJfcmVnX21vZGUoYXApOworCXBwID0ga2NhbGxvYygxLCBzaXplb2YoKnBwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJcHAtPnBrdCA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIFFTX1BLVF9CWVRFUywgJnBwLT5wa3RfZG1hLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXBwLT5wa3QpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfa2ZyZWU7CisJfQorCW1lbXNldChwcC0+cGt0LCAwLCBRU19QS1RfQllURVMpOworCWFwLT5wcml2YXRlX2RhdGEgPSBwcDsKKworCWFkZHIgPSAodTY0KXBwLT5wa3RfZG1hOworCXdyaXRlbCgodTMyKSBhZGRyLCAgICAgICAgY2hhbiArIFFTX0NDRl9DUEJBKTsKKwl3cml0ZWwoKHUzMikoYWRkciA+PiAzMiksIGNoYW4gKyBRU19DQ0ZfQ1BCQSArIDQpOworCXJldHVybiAwOworCitlcnJfb3V0X2tmcmVlOgorCWtmcmVlKHBwKTsKK2Vycl9vdXQ6CisJYXRhX3BvcnRfc3RvcChhcCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBxc19wb3J0X3N0b3Aoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhcC0+aG9zdF9zZXQtPmRldjsKKwlzdHJ1Y3QgcXNfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CisKKwlpZiAocHAgIT0gTlVMTCkgeworCQlhcC0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwkJaWYgKHBwLT5wa3QgIT0gTlVMTCkKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgUVNfUEtUX0JZVEVTLCBwcC0+cGt0LAorCQkJCQkJCQlwcC0+cGt0X2RtYSk7CisJCWtmcmVlKHBwKTsKKwl9CisJYXRhX3BvcnRfc3RvcChhcCk7Cit9CisKK3N0YXRpYyB2b2lkIHFzX2hvc3Rfc3RvcChzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCkKK3sKKwl2b2lkIF9faW9tZW0gKm1taW9fYmFzZSA9IGhvc3Rfc2V0LT5tbWlvX2Jhc2U7CisKKwl3cml0ZWIoMCwgbW1pb19iYXNlICsgUVNfSENUX0NUUkwpOyAvKiBkaXNhYmxlIGhvc3QgaW50ZXJydXB0cyAqLworCXdyaXRlYihRU19DTkZHM19HU1JTVCwgbW1pb19iYXNlICsgUVNfSENGX0NORkczKTsgLyogZ2xvYmFsIHJlc2V0ICovCit9CisKK3N0YXRpYyB2b2lkIHFzX2hvc3RfaW5pdCh1bnNpZ25lZCBpbnQgY2hpcF9pZCwgc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKQoreworCXZvaWQgX19pb21lbSAqbW1pb19iYXNlID0gcGUtPm1taW9fYmFzZTsKKwl1bnNpZ25lZCBpbnQgcG9ydF9ubzsKKworCXdyaXRlYigwLCBtbWlvX2Jhc2UgKyBRU19IQ1RfQ1RSTCk7IC8qIGRpc2FibGUgaG9zdCBpbnRlcnJ1cHRzICovCisJd3JpdGViKFFTX0NORkczX0dTUlNULCBtbWlvX2Jhc2UgKyBRU19IQ0ZfQ05GRzMpOyAvKiBnbG9iYWwgcmVzZXQgKi8KKworCS8qIHJlc2V0IGVhY2ggY2hhbm5lbCBpbiB0dXJuICovCisJZm9yIChwb3J0X25vID0gMDsgcG9ydF9ubyA8IHBlLT5uX3BvcnRzOyArK3BvcnRfbm8pIHsKKwkJdTggX19pb21lbSAqY2hhbiA9IG1taW9fYmFzZSArIChwb3J0X25vICogMHg0MDAwKTsKKwkJd3JpdGViKFFTX0NUUjFfUkRFVnxRU19DVFIxX1JDSE4sIGNoYW4gKyBRU19DQ1RfQ1RSMSk7CisJCXdyaXRlYihRU19DVFIwX1JFRywgY2hhbiArIFFTX0NDVF9DVFIwKTsKKwkJcmVhZGIoY2hhbiArIFFTX0NDVF9DVFIwKTsgICAgICAgIC8qIGZsdXNoICovCisJfQorCXdyaXRlYihRU19TRVJEM19QSFlfRU5BLCBtbWlvX2Jhc2UgKyBRU19IVlNfU0VSRDMpOyAvKiBlbmFibGUgcGh5ICovCisKKwlmb3IgKHBvcnRfbm8gPSAwOyBwb3J0X25vIDwgcGUtPm5fcG9ydHM7ICsrcG9ydF9ubykgeworCQl1OCBfX2lvbWVtICpjaGFuID0gbW1pb19iYXNlICsgKHBvcnRfbm8gKiAweDQwMDApOworCQkvKiBzZXQgRklGTyBkZXB0aHMgdG8gc2FtZSBzZXR0aW5ncyBhcyBXaW5kb3dzIGRyaXZlciAqLworCQl3cml0ZXcoMzIsIGNoYW4gKyBRU19DRkNfSFVGVCk7CisJCXdyaXRldygzMiwgY2hhbiArIFFTX0NGQ19IREZUKTsKKwkJd3JpdGV3KDEwLCBjaGFuICsgUVNfQ0ZDX0RVRlQpOworCQl3cml0ZXcoIDgsIGNoYW4gKyBRU19DRkNfRERGVCk7CisJCS8qIHNldCBDUEIgc2l6ZSBpbiBieXRlcywgYXMgYSBwb3dlciBvZiB0d28gKi8KKwkJd3JpdGViKFFTX0NQQl9PUkRFUiwgICAgY2hhbiArIFFTX0NDRl9DU0VQKTsKKwl9CisJd3JpdGViKDEsIG1taW9fYmFzZSArIFFTX0hDVF9DVFJMKTsgLyogZW5hYmxlIGhvc3QgaW50ZXJydXB0cyAqLworfQorCisvKgorICogVGhlIFFTdG9yIHVuZGVyc3RhbmRzIDY0LWJpdCBidXNlcywgYW5kIHVzZXMgNjQtYml0IGZpZWxkcworICogZm9yIERNQSBwb2ludGVycyByZWdhcmRsZXNzIG9mIGJ1cyB3aWR0aC4gIFdlIGp1c3QgaGF2ZSB0bworICogbWFrZSBzdXJlIG91ciBETUEgbWFza3MgYXJlIHNldCBhcHByb3ByaWF0ZWx5IGZvciB3aGF0ZXZlcgorICogYnJpZGdlIGxpZXMgYmV0d2VlbiB1cyBhbmQgdGhlIFFTdG9yLCBhbmQgdGhlbiB0aGUgRE1BIG1hcHBpbmcKKyAqIGNvZGUgd2lsbCBlbnN1cmUgd2Ugb25seSBldmVyICJzZWUiIGFwcHJvcHJpYXRlIGJ1ZmZlciBhZGRyZXNzZXMuCisgKiBJZiB3ZSdyZSAzMi1iaXQgbGltaXRlZCBzb21ld2hlcmUsIHRoZW4gb3VyIDY0LWJpdCBmaWVsZHMgd2lsbAorICoganVzdCBlbmQgdXAgd2l0aCB6ZXJvcyBpbiB0aGUgdXBwZXIgMzItYml0cywgd2l0aG91dCBhbnkgc3BlY2lhbAorICogbG9naWMgcmVxdWlyZWQgb3V0c2lkZSBvZiB0aGlzIHJvdXRpbmUgKGJlbG93KS4KKyAqLworc3RhdGljIGludCBxc19zZXRfZG1hX21hc2tzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB2b2lkIF9faW9tZW0gKm1taW9fYmFzZSkKK3sKKwl1MzIgYnVzX2luZm8gPSByZWFkbChtbWlvX2Jhc2UgKyBRU19ISURfSFBIWSk7CisJaW50IHJjLCBoYXZlXzY0Yml0X2J1cyA9IChidXNfaW5mbyAmIFFTX0hQSFlfNjRCSVQpOworCisJaWYgKGhhdmVfNjRiaXRfYnVzICYmCisJICAgICFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkgeworCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSyk7CisJCWlmIChyYykgeworCQkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOworCQkJaWYgKHJjKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCQkJCSIoJXMpOiA2NC1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIsCisJCQkJCXBjaV9uYW1lKHBkZXYpKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkJCSIoJXMpOiAzMi1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIsCisJCQkJcGNpX25hbWUocGRldikpOworCQkJcmV0dXJuIHJjOworCQl9CisJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKKwkJCQkiKCVzKTogMzItYml0IGNvbnNpc3RlbnQgRE1BIGVuYWJsZSBmYWlsZWRcbiIsCisJCQkJcGNpX25hbWUocGRldikpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFzX2F0YV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQgPSBOVUxMOworCXZvaWQgX19pb21lbSAqbW1pb19iYXNlOworCXVuc2lnbmVkIGludCBib2FyZF9pZHggPSAodW5zaWduZWQgaW50KSBlbnQtPmRyaXZlcl9kYXRhOworCWludCByYywgcG9ydF9ubzsKKworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXQ7CisKKwlpZiAoKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCA0KSAmIElPUkVTT1VSQ0VfTUVNKSA9PSAwKSB7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJfQorCisJbW1pb19iYXNlID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNCksCisJCSAgICAgICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgNCkpOworCWlmIChtbWlvX2Jhc2UgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCX0KKworCXJjID0gcXNfc2V0X2RtYV9tYXNrcyhwZGV2LCBtbWlvX2Jhc2UpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisKKwlwcm9iZV9lbnQgPSBrbWFsbG9jKHNpemVvZigqcHJvYmVfZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByb2JlX2VudCA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCisJbWVtc2V0KHByb2JlX2VudCwgMCwgc2l6ZW9mKCpwcm9iZV9lbnQpKTsKKwlwcm9iZV9lbnQtPmRldiA9IHBjaV9kZXZfdG9fZGV2KHBkZXYpOworCUlOSVRfTElTVF9IRUFEKCZwcm9iZV9lbnQtPm5vZGUpOworCisJcHJvYmVfZW50LT5zaHQJCT0gcXNfcG9ydF9pbmZvW2JvYXJkX2lkeF0uc2h0OworCXByb2JlX2VudC0+aG9zdF9mbGFncwk9IHFzX3BvcnRfaW5mb1tib2FyZF9pZHhdLmhvc3RfZmxhZ3M7CisJcHJvYmVfZW50LT5waW9fbWFzawk9IHFzX3BvcnRfaW5mb1tib2FyZF9pZHhdLnBpb19tYXNrOworCXByb2JlX2VudC0+bXdkbWFfbWFzawk9IHFzX3BvcnRfaW5mb1tib2FyZF9pZHhdLm13ZG1hX21hc2s7CisJcHJvYmVfZW50LT51ZG1hX21hc2sJPSBxc19wb3J0X2luZm9bYm9hcmRfaWR4XS51ZG1hX21hc2s7CisJcHJvYmVfZW50LT5wb3J0X29wcwk9IHFzX3BvcnRfaW5mb1tib2FyZF9pZHhdLnBvcnRfb3BzOworCisJcHJvYmVfZW50LT5pcnEJCT0gcGRldi0+aXJxOworCXByb2JlX2VudC0+aXJxX2ZsYWdzCT0gU0FfU0hJUlE7CisJcHJvYmVfZW50LT5tbWlvX2Jhc2UJPSBtbWlvX2Jhc2U7CisJcHJvYmVfZW50LT5uX3BvcnRzCT0gUVNfUE9SVFM7CisKKwlmb3IgKHBvcnRfbm8gPSAwOyBwb3J0X25vIDwgcHJvYmVfZW50LT5uX3BvcnRzOyArK3BvcnRfbm8pIHsKKwkJdW5zaWduZWQgbG9uZyBjaGFuID0gKHVuc2lnbmVkIGxvbmcpbW1pb19iYXNlICsKKwkJCQkJCQkocG9ydF9ubyAqIDB4NDAwMCk7CisJCXFzX2F0YV9zZXR1cF9wb3J0KCZwcm9iZV9lbnQtPnBvcnRbcG9ydF9ub10sIGNoYW4pOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJLyogaW5pdGlhbGl6ZSBhZGFwdGVyICovCisJcXNfaG9zdF9pbml0KGJvYXJkX2lkeCwgcHJvYmVfZW50KTsKKworCXJjID0gYXRhX2RldmljZV9hZGQocHJvYmVfZW50KTsKKwlrZnJlZShwcm9iZV9lbnQpOworCWlmIChyYyAhPSBRU19QT1JUUykKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfaW91bm1hcDoKKwlpb3VubWFwKG1taW9fYmFzZSk7CitlcnJfb3V0X3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXQ6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfX2luaXQgcXNfYXRhX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZxc19hdGFfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBxc19hdGFfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcXNfYXRhX3BjaV9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJNYXJrIExvcmQiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUGFjaWZpYyBEaWdpdGFsIENvcnBvcmF0aW9uIFFTdG9yIFNBVEEgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHFzX2F0YV9wY2lfdGJsKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworbW9kdWxlX2luaXQocXNfYXRhX2luaXQpOworbW9kdWxlX2V4aXQocXNfYXRhX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NhdGFfc2lsLmMgYi9kcml2ZXJzL3Njc2kvc2F0YV9zaWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDQ4OWRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfc2lsLmMKQEAgLTAsMCArMSw0OTQgQEAKKy8qCisgKiAgc2F0YV9zaWwuYyAtIFNpbGljb24gSW1hZ2UgU0FUQQorICoKKyAqICBNYWludGFpbmVkIGJ5OiAgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorICogIAkJICAgIFBsZWFzZSBBTFdBWVMgY29weSBsaW51eC1pZGVAdmdlci5rZXJuZWwub3JnCisgKgkJICAgIG9uIGVtYWlscy4KKyAqCisgKiAgQ29weXJpZ2h0IDIwMDMgUmVkIEhhdCwgSW5jLgorICogIENvcHlyaWdodCAyMDAzIEJlbmphbWluIEhlcnJlbnNjaG1pZHQKKyAqCisgKiAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgT3BlbgorICogIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjEgdGhhdCBjYW4gYmUgZm91bmQgYXQKKyAqICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC0xLjEudHh0IGFuZCBpcyBpbmNsdWRlZCBoZXJlaW4KKyAqICBieSByZWZlcmVuY2UuCisgKgorICogIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCisgKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSBhcyBkaXN0cmlidXRlZAorICogIGluIHRoZSBrZXJuZWwgc291cmNlIENPUFlJTkcgZmlsZSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZgorICogIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdworICogIHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqICBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKKyAqICB0aGUgT1NMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZAorICogIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4KKyAqICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyCisgKiAgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBPU0wgb3IgdGhlIEdQTC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorCisjZGVmaW5lIERSVl9OQU1FCSJzYXRhX3NpbCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuOSIKKworZW51bSB7CisJc2lsXzMxMTIJCT0gMCwKKwlzaWxfMzExNAkJPSAxLAorCisJU0lMX0ZJRk9fUjAJCT0gMHg0MCwKKwlTSUxfRklGT19XMAkJPSAweDQxLAorCVNJTF9GSUZPX1IxCQk9IDB4NDQsCisJU0lMX0ZJRk9fVzEJCT0gMHg0NSwKKwlTSUxfRklGT19SMgkJPSAweDI0MCwKKwlTSUxfRklGT19XMgkJPSAweDI0MSwKKwlTSUxfRklGT19SMwkJPSAweDI0NCwKKwlTSUxfRklGT19XMwkJPSAweDI0NSwKKworCVNJTF9TWVNDRkcJCT0gMHg0OCwKKwlTSUxfTUFTS19JREUwX0lOVAk9ICgxIDw8IDIyKSwKKwlTSUxfTUFTS19JREUxX0lOVAk9ICgxIDw8IDIzKSwKKwlTSUxfTUFTS19JREUyX0lOVAk9ICgxIDw8IDI0KSwKKwlTSUxfTUFTS19JREUzX0lOVAk9ICgxIDw8IDI1KSwKKwlTSUxfTUFTS18yUE9SVAkJPSBTSUxfTUFTS19JREUwX0lOVCB8IFNJTF9NQVNLX0lERTFfSU5ULAorCVNJTF9NQVNLXzRQT1JUCQk9IFNJTF9NQVNLXzJQT1JUIHwKKwkJCQkgIFNJTF9NQVNLX0lERTJfSU5UIHwgU0lMX01BU0tfSURFM19JTlQsCisKKwlTSUxfSURFMl9CTURNQQkJPSAweDIwMCwKKworCVNJTF9JTlRSX1NURUVSSU5HCT0gKDEgPDwgMSksCisJU0lMX1FVSVJLX01PRDE1V1JJVEUJPSAoMSA8PCAwKSwKKwlTSUxfUVVJUktfVURNQTVNQVgJPSAoMSA8PCAxKSwKK307CisKK3N0YXRpYyBpbnQgc2lsX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgdm9pZCBzaWxfZGV2X2NvbmZpZyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KTsKK3N0YXRpYyB1MzIgc2lsX3Njcl9yZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKTsKK3N0YXRpYyB2b2lkIHNpbF9zY3Jfd3JpdGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpOworc3RhdGljIHZvaWQgc2lsX3Bvc3Rfc2V0X21vZGUgKHN0cnVjdCBhdGFfcG9ydCAqYXApOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2lsX3BjaV90YmxbXSA9IHsKKwl7IDB4MTA5NSwgMHgzMTEyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBzaWxfMzExMiB9LAorCXsgMHgxMDk1LCAweDAyNDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHNpbF8zMTEyIH0sCisJeyAweDEwOTUsIDB4MzUxMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgc2lsXzMxMTIgfSwKKwl7IDB4MTA5NSwgMHgzMTE0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBzaWxfMzExNCB9LAorCXsgMHgxMDAyLCAweDQzNmUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHNpbF8zMTEyIH0sCisJeyAweDEwMDIsIDB4NDM3OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgc2lsXzMxMTIgfSwKKwl7IH0JLyogdGVybWluYXRlIGxpc3QgKi8KK307CisKKworLyogVE9ETyBmaXJtd2FyZSB2ZXJzaW9ucyBzaG91bGQgYmUgYWRkZWQgLSBlcmljICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNpbF9kcml2ZWxpc3QgeworCWNvbnN0IGNoYXIgKiBwcm9kdWN0OworCXVuc2lnbmVkIGludCBxdWlyazsKK30gc2lsX2JsYWNrbGlzdCBbXSA9IHsKKwl7ICJTVDMyMDAxMkFTIiwJCVNJTF9RVUlSS19NT0QxNVdSSVRFIH0sCisJeyAiU1QzMzAwMTNBUyIsCQlTSUxfUVVJUktfTU9EMTVXUklURSB9LAorCXsgIlNUMzQwMDE3QVMiLAkJU0lMX1FVSVJLX01PRDE1V1JJVEUgfSwKKwl7ICJTVDM2MDAxNUFTIiwJCVNJTF9RVUlSS19NT0QxNVdSSVRFIH0sCisJeyAiU1QzODAwMTNBUyIsCQlTSUxfUVVJUktfTU9EMTVXUklURSB9LAorCXsgIlNUMzgwMDIzQVMiLAkJU0lMX1FVSVJLX01PRDE1V1JJVEUgfSwKKwl7ICJTVDMxMjAwMjNBUyIsCVNJTF9RVUlSS19NT0QxNVdSSVRFIH0sCisJeyAiU1QzMTYwMDIzQVMiLAlTSUxfUVVJUktfTU9EMTVXUklURSB9LAorCXsgIlNUMzEyMDAyNkFTIiwJU0lMX1FVSVJLX01PRDE1V1JJVEUgfSwKKwl7ICJTVDMyMDA4MjJBUyIsCVNJTF9RVUlSS19NT0QxNVdSSVRFIH0sCisJeyAiU1QzNDAwMTRBU0wiLAlTSUxfUVVJUktfTU9EMTVXUklURSB9LAorCXsgIlNUMzYwMDE0QVNMIiwJU0lMX1FVSVJLX01PRDE1V1JJVEUgfSwKKwl7ICJTVDM4MDAxMUFTTCIsCVNJTF9RVUlSS19NT0QxNVdSSVRFIH0sCisJeyAiU1QzMTIwMDIyQVNMIiwJU0lMX1FVSVJLX01PRDE1V1JJVEUgfSwKKwl7ICJTVDMxNjAwMjFBU0wiLAlTSUxfUVVJUktfTU9EMTVXUklURSB9LAorCXsgIk1heHRvciA0RDA2MEgzIiwJU0lMX1FVSVJLX1VETUE1TUFYIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc2lsX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQkJPSBzaWxfcGNpX3RibCwKKwkucHJvYmUJCQk9IHNpbF9pbml0X29uZSwKKwkucmVtb3ZlCQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCit9OworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIHNpbF9zaHQgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pb2N0bAkJCT0gYXRhX3Njc2lfaW9jdGwsCisJLnF1ZXVlY29tbWFuZAkJPSBhdGFfc2NzaV9xdWV1ZWNtZCwKKwkuZWhfc3RyYXRlZ3lfaGFuZGxlcgk9IGF0YV9zY3NpX2Vycm9yLAorCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKKwkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCisJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKKwkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAorCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAorCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAorCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAorCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCisJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAorCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5vcmRlcmVkX2ZsdXNoCQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgc2lsX29wcyA9IHsKKwkucG9ydF9kaXNhYmxlCQk9IGF0YV9wb3J0X2Rpc2FibGUsCisJLmRldl9jb25maWcJCT0gc2lsX2Rldl9jb25maWcsCisJLnRmX2xvYWQJCT0gYXRhX3RmX2xvYWQsCisJLnRmX3JlYWQJCT0gYXRhX3RmX3JlYWQsCisJLmNoZWNrX3N0YXR1cwkJPSBhdGFfY2hlY2tfc3RhdHVzLAorCS5leGVjX2NvbW1hbmQJCT0gYXRhX2V4ZWNfY29tbWFuZCwKKwkuZGV2X3NlbGVjdAkJPSBhdGFfc3RkX2Rldl9zZWxlY3QsCisJLnBoeV9yZXNldAkJPSBzYXRhX3BoeV9yZXNldCwKKwkucG9zdF9zZXRfbW9kZQkJPSBzaWxfcG9zdF9zZXRfbW9kZSwKKwkuYm1kbWFfc2V0dXAgICAgICAgICAgICA9IGF0YV9ibWRtYV9zZXR1cCwKKwkuYm1kbWFfc3RhcnQgICAgICAgICAgICA9IGF0YV9ibWRtYV9zdGFydCwKKwkuYm1kbWFfc3RvcAkJPSBhdGFfYm1kbWFfc3RvcCwKKwkuYm1kbWFfc3RhdHVzCQk9IGF0YV9ibWRtYV9zdGF0dXMsCisJLnFjX3ByZXAJCT0gYXRhX3FjX3ByZXAsCisJLnFjX2lzc3VlCQk9IGF0YV9xY19pc3N1ZV9wcm90LAorCS5lbmdfdGltZW91dAkJPSBhdGFfZW5nX3RpbWVvdXQsCisJLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCisJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAorCS5zY3JfcmVhZAkJPSBzaWxfc2NyX3JlYWQsCisJLnNjcl93cml0ZQkJPSBzaWxfc2NyX3dyaXRlLAorCS5wb3J0X3N0YXJ0CQk9IGF0YV9wb3J0X3N0YXJ0LAorCS5wb3J0X3N0b3AJCT0gYXRhX3BvcnRfc3RvcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBzaWxfcG9ydF9pbmZvW10gPSB7CisJLyogc2lsXzMxMTIgKi8KKwl7CisJCS5zaHQJCT0gJnNpbF9zaHQsCisJCS5ob3N0X2ZsYWdzCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8CisJCQkJICBBVEFfRkxBR19TUlNUIHwgQVRBX0ZMQUdfTU1JTywKKwkJLnBpb19tYXNrCT0gMHgxZiwJCQkvKiBwaW8wLTQgKi8KKwkJLm13ZG1hX21hc2sJPSAweDA3LAkJCS8qIG13ZG1hMC0yICovCisJCS51ZG1hX21hc2sJPSAweDNmLAkJCS8qIHVkbWEwLTUgKi8KKwkJLnBvcnRfb3BzCT0gJnNpbF9vcHMsCisJfSwgLyogc2lsXzMxMTQgKi8KKwl7CisJCS5zaHQJCT0gJnNpbF9zaHQsCisJCS5ob3N0X2ZsYWdzCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8CisJCQkJICBBVEFfRkxBR19TUlNUIHwgQVRBX0ZMQUdfTU1JTywKKwkJLnBpb19tYXNrCT0gMHgxZiwJCQkvKiBwaW8wLTQgKi8KKwkJLm13ZG1hX21hc2sJPSAweDA3LAkJCS8qIG13ZG1hMC0yICovCisJCS51ZG1hX21hc2sJPSAweDNmLAkJCS8qIHVkbWEwLTUgKi8KKwkJLnBvcnRfb3BzCT0gJnNpbF9vcHMsCisJfSwKK307CisKKy8qIHBlci1wb3J0IHJlZ2lzdGVyIG9mZnNldHMgKi8KKy8qIFRPRE86IHdlIGNhbiBwcm9iYWJseSBjYWxjdWxhdGUgcmF0aGVyIHRoYW4gdXNlIGEgdGFibGUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgdGY7CS8qIEFUQSB0YXNrZmlsZSByZWdpc3RlciBibG9jayAqLworCXVuc2lnbmVkIGxvbmcgY3RsOwkvKiBBVEEgY29udHJvbC9hbHRzdGF0dXMgcmVnaXN0ZXIgYmxvY2sgKi8KKwl1bnNpZ25lZCBsb25nIGJtZG1hOwkvKiBETUEgcmVnaXN0ZXIgYmxvY2sgKi8KKwl1bnNpZ25lZCBsb25nIHNjcjsJLyogU0FUQSBjb250cm9sIHJlZ2lzdGVyIGJsb2NrICovCisJdW5zaWduZWQgbG9uZyBzaWVuOwkvKiBTQVRBIEludGVycnVwdCBFbmFibGUgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBsb25nIHhmZXJfbW9kZTsvKiBkYXRhIHRyYW5zZmVyIG1vZGUgcmVnaXN0ZXIgKi8KK30gc2lsX3BvcnRbXSA9IHsKKwkvKiBwb3J0IDAgLi4uICovCisJeyAweDgwLCAweDhBLCAweDAwLCAweDEwMCwgMHgxNDgsIDB4YjQgfSwKKwl7IDB4QzAsIDB4Q0EsIDB4MDgsIDB4MTgwLCAweDFjOCwgMHhmNCB9LAorCXsgMHgyODAsIDB4MjhBLCAweDIwMCwgMHgzMDAsIDB4MzQ4LCAweDJiNCB9LAorCXsgMHgyQzAsIDB4MkNBLCAweDIwOCwgMHgzODAsIDB4M2M4LCAweDJmNCB9LAorCS8qIC4uLiBwb3J0IDMgKi8KK307CisKK01PRFVMRV9BVVRIT1IoIkplZmYgR2FyemlrIik7CitNT0RVTEVfREVTQ1JJUFRJT04oImxvdy1sZXZlbCBkcml2ZXIgZm9yIFNpbGljb24gSW1hZ2UgU0FUQSBjb250cm9sbGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2lsX3BjaV90YmwpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCitzdGF0aWMgdW5zaWduZWQgY2hhciBzaWxfZ2V0X2RldmljZV9jYWNoZV9saW5lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXU4IGNhY2hlX2xpbmUgPSAwOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsICZjYWNoZV9saW5lKTsKKwlyZXR1cm4gY2FjaGVfbGluZTsKK30KKworc3RhdGljIHZvaWQgc2lsX3Bvc3Rfc2V0X21vZGUgKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBhcC0+aG9zdF9zZXQ7CisJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKKwl2b2lkICphZGRyID0gaG9zdF9zZXQtPm1taW9fYmFzZSArIHNpbF9wb3J0W2FwLT5wb3J0X25vXS54ZmVyX21vZGU7CisJdTMyIHRtcCwgZGV2X21vZGVbMl07CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWRldiA9ICZhcC0+ZGV2aWNlW2ldOworCQlpZiAoIWF0YV9kZXZfcHJlc2VudChkZXYpKQorCQkJZGV2X21vZGVbaV0gPSAwOwkvKiBQSU8wLzEvMiAqLworCQllbHNlIGlmIChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX1BJTykKKwkJCWRldl9tb2RlW2ldID0gMTsJLyogUElPMy80ICovCisJCWVsc2UKKwkJCWRldl9tb2RlW2ldID0gMzsJLyogVURNQSAqLworCQkvKiB2YWx1ZSAyIGluZGljYXRlcyBNRE1BICovCisJfQorCisJdG1wID0gcmVhZGwoYWRkcik7CisJdG1wICY9IH4oKDE8PDUpIHwgKDE8PDQpIHwgKDE8PDEpIHwgKDE8PDApKTsKKwl0bXAgfD0gZGV2X21vZGVbMF07CisJdG1wIHw9IChkZXZfbW9kZVsxXSA8PCA0KTsKKwl3cml0ZWwodG1wLCBhZGRyKTsKKwlyZWFkbChhZGRyKTsJLyogZmx1c2ggKi8KK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNpbF9zY3JfYWRkcihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gYXAtPmlvYWRkci5zY3JfYWRkcjsKKworCXN3aXRjaCAoc2NfcmVnKSB7CisJY2FzZSBTQ1JfU1RBVFVTOgorCQlyZXR1cm4gb2Zmc2V0ICsgNDsKKwljYXNlIFNDUl9FUlJPUjoKKwkJcmV0dXJuIG9mZnNldCArIDg7CisJY2FzZSBTQ1JfQ09OVFJPTDoKKwkJcmV0dXJuIG9mZnNldDsKKwlkZWZhdWx0OgorCQkvKiBkbyBub3RoaW5nICovCisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIHNpbF9zY3JfcmVhZCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZykKK3sKKwl2b2lkICptbWlvID0gKHZvaWQgKikgc2lsX3Njcl9hZGRyKGFwLCBzY19yZWcpOworCWlmIChtbWlvKQorCQlyZXR1cm4gcmVhZGwobW1pbyk7CisJcmV0dXJuIDB4ZmZmZmZmZmZVOworfQorCitzdGF0aWMgdm9pZCBzaWxfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKQoreworCXZvaWQgKm1taW8gPSAodm9pZCAqKSBzaWxfc2NyX2FkZHIoYXAsIHNjX3JlZyk7CisJaWYgKG1taW8pCisJCXdyaXRlbCh2YWwsIG1taW8pOworfQorCisvKioKKyAqCXNpbF9kZXZfY29uZmlnIC0gQXBwbHkgZGV2aWNlL2hvc3Qtc3BlY2lmaWMgZXJyYXRhIGZpeHVwcworICoJQGFwOiBQb3J0IGNvbnRhaW5pbmcgZGV2aWNlIHRvIGJlIGV4YW1pbmVkCisgKglAZGV2OiBEZXZpY2UgdG8gYmUgZXhhbWluZWQKKyAqCisgKglBZnRlciB0aGUgSURFTlRJRlkgW1BBQ0tFVF0gREVWSUNFIHN0ZXAgaXMgY29tcGxldGUsIGFuZCBhCisgKglkZXZpY2UgaXMga25vd24gdG8gYmUgcHJlc2VudCwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCisgKglXZSBhcHBseSB0d28gZXJyYXRhIGZpeHVwcyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gU2lsaWNvbiBJbWFnZSwKKyAqCWEgU2VhZ2F0ZSBhbmQgYSBNYXh0b3IgZml4dXAuCisgKgorICoJRm9yIGNlcnRhaW4gU2VhZ2F0ZSBkZXZpY2VzLCB3ZSBtdXN0IGxpbWl0IHRoZSBtYXhpbXVtIHNlY3RvcnMKKyAqCXRvIHVuZGVyIDhLLgorICoKKyAqCUZvciBjZXJ0YWluIE1heHRvciBkZXZpY2VzLCB3ZSBtdXN0IG5vdCBwcm9ncmFtIHRoZSBkcml2ZQorICoJYmV5b25kIHVkbWE1LgorICoKKyAqCUJvdGggZml4dXBzIGFyZSB1bmZhaXJseSBwZXNzaW1pc3RpYy4gIEFzIHNvb24gYXMgSSBnZXQgbW9yZQorICoJaW5mb3JtYXRpb24gb24gdGhlc2UgZXJyYXRhLCBJIHdpbGwgY3JlYXRlIGEgbW9yZSBleGhhdXN0aXZlCisgKglsaXN0LCBhbmQgYXBwbHkgdGhlIGZpeHVwcyB0byBvbmx5IHRoZSBzcGVjaWZpYworICoJZGV2aWNlcy9ob3N0cy9maXJtd2FyZXMgdGhhdCBuZWVkIGl0LgorICoKKyAqCTIwMDQwMTExIC0gU2VhZ2F0ZSBkcml2ZXMgYWZmZWN0ZWQgYnkgdGhlIE1vZDE1V3JpdGUgYnVnIGFyZSBibGFja2xpc3RlZAorICoJVGhlIE1heHRvciBxdWlyayBpcyBpbiB0aGUgYmxhY2tsaXN0LCBidXQgSSdtIGtlZXBpbmcgdGhlIG9yaWdpbmFsCisgKglwZXNzaW1pc3RpYyBmaXggZm9yIHRoZSBmb2xsb3dpbmcgcmVhc29ucy4uLgorICoJLSBUaGVyZSBzZWVtcyB0byBiZSBsZXNzIGluZm8gb24gaXQsIG9ubHkgb25lIGRldmljZSBnbGVhbmVkIG9mZiB0aGUKKyAqCVdpbmRvd3MJZHJpdmVyLCBtYXliZSBvbmx5IG9uZSBpcyBhZmZlY3RlZC4gIE1vcmUgaW5mbyB3b3VsZCBiZSBncmVhdGx5CisgKglhcHByZWNpYXRlZC4KKyAqCS0gQnV0IHRoZW4gYWdhaW4gVURNQTUgaXMgaGFyZGx5IGFueXRoaW5nIHRvIGNvbXBsYWluIGFib3V0CisgKi8KK3N0YXRpYyB2b2lkIHNpbF9kZXZfY29uZmlnKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgaW50IG4sIHF1aXJrcyA9IDA7CisJdW5zaWduZWQgY2hhciBtb2RlbF9udW1bNDBdOworCWNvbnN0IGNoYXIgKnM7CisJdW5zaWduZWQgaW50IGxlbjsKKworCWF0YV9kZXZfaWRfc3RyaW5nKGRldi0+aWQsIG1vZGVsX251bSwgQVRBX0lEX1BST0RfT0ZTLAorCQkJICBzaXplb2YobW9kZWxfbnVtKSk7CisJcyA9ICZtb2RlbF9udW1bMF07CisJbGVuID0gc3RybmxlbihzLCBzaXplb2YobW9kZWxfbnVtKSk7CisKKwkvKiBBVEFQSSBzcGVjaWZpZXMgdGhhdCBlbXB0eSBzcGFjZSBpcyBibGFuay1maWxsZWQ7IHJlbW92ZSBibGFua3MgKi8KKwl3aGlsZSAoKGxlbiA+IDApICYmIChzW2xlbiAtIDFdID09ICcgJykpCisJCWxlbi0tOworCisJZm9yIChuID0gMDsgc2lsX2JsYWNrbGlzdFtuXS5wcm9kdWN0OyBuKyspIAorCQlpZiAoIW1lbWNtcChzaWxfYmxhY2tsaXN0W25dLnByb2R1Y3QsIHMsCisJCQkgICAgc3RybGVuKHNpbF9ibGFja2xpc3Rbbl0ucHJvZHVjdCkpKSB7CisJCQlxdWlya3MgPSBzaWxfYmxhY2tsaXN0W25dLnF1aXJrOworCQkJYnJlYWs7CisJCX0KKwkKKwkvKiBsaW1pdCByZXF1ZXN0cyB0byAxNSBzZWN0b3JzICovCisJaWYgKHF1aXJrcyAmIFNJTF9RVUlSS19NT0QxNVdSSVRFKSB7CisJCXByaW50ayhLRVJOX0lORk8gImF0YSV1KCV1KTogYXBwbHlpbmcgU2VhZ2F0ZSBlcnJhdGEgZml4XG4iLAorCQkgICAgICAgYXAtPmlkLCBkZXYtPmRldm5vKTsKKwkJYXAtPmhvc3QtPm1heF9zZWN0b3JzID0gMTU7CisJCWFwLT5ob3N0LT5ob3N0dC0+bWF4X3NlY3RvcnMgPSAxNTsKKwkJZGV2LT5mbGFncyB8PSBBVEFfREZMQUdfTE9DS19TRUNUT1JTOworCQlyZXR1cm47CisJfQorCisJLyogbGltaXQgdG8gdWRtYTUgKi8KKwlpZiAocXVpcmtzICYgU0lMX1FVSVJLX1VETUE1TUFYKSB7CisJCXByaW50ayhLRVJOX0lORk8gImF0YSV1KCV1KTogYXBwbHlpbmcgTWF4dG9yIGVycmF0YSBmaXggJXNcbiIsCisJCSAgICAgICBhcC0+aWQsIGRldi0+ZGV2bm8sIHMpOworCQlhcC0+dWRtYV9tYXNrICY9IEFUQV9VRE1BNTsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIGludCBzaWxfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwl2b2lkICptbWlvX2Jhc2U7CisJaW50IHJjOworCXVuc2lnbmVkIGludCBpOworCWludCBwY2lfZGV2X2J1c3kgPSAwOworCXUzMiB0bXAsIGlycV9tYXNrOworCXU4IGNsczsKKworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCisJLyoKKwkgKiBJZiB0aGlzIGRyaXZlciBoYXBwZW5zIHRvIG9ubHkgYmUgdXNlZnVsIG9uIEFwcGxlJ3MgSzIsIHRoZW4KKwkgKiB3ZSBzaG91bGQgY2hlY2sgdGhhdCBoZXJlIGFzIGl0IGhhcyBhIG5vcm1hbCBTZXJ2ZXJ3b3JrcyBJRAorCSAqLworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChyYykgeworCQlwY2lfZGV2X2J1c3kgPSAxOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisKKwlwcm9iZV9lbnQgPSBrbWFsbG9jKHNpemVvZigqcHJvYmVfZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByb2JlX2VudCA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJfQorCisJbWVtc2V0KHByb2JlX2VudCwgMCwgc2l6ZW9mKCpwcm9iZV9lbnQpKTsKKwlJTklUX0xJU1RfSEVBRCgmcHJvYmVfZW50LT5ub2RlKTsKKwlwcm9iZV9lbnQtPmRldiA9IHBjaV9kZXZfdG9fZGV2KHBkZXYpOworCXByb2JlX2VudC0+cG9ydF9vcHMgPSBzaWxfcG9ydF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdLnBvcnRfb3BzOworCXByb2JlX2VudC0+c2h0ID0gc2lsX3BvcnRfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXS5zaHQ7CisJcHJvYmVfZW50LT5uX3BvcnRzID0gKGVudC0+ZHJpdmVyX2RhdGEgPT0gc2lsXzMxMTQpID8gNCA6IDI7CisJcHJvYmVfZW50LT5waW9fbWFzayA9IHNpbF9wb3J0X2luZm9bZW50LT5kcml2ZXJfZGF0YV0ucGlvX21hc2s7CisJcHJvYmVfZW50LT5td2RtYV9tYXNrID0gc2lsX3BvcnRfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXS5td2RtYV9tYXNrOworCXByb2JlX2VudC0+dWRtYV9tYXNrID0gc2lsX3BvcnRfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXS51ZG1hX21hc2s7CisgICAgICAgCXByb2JlX2VudC0+aXJxID0gcGRldi0+aXJxOworICAgICAgIAlwcm9iZV9lbnQtPmlycV9mbGFncyA9IFNBX1NISVJROworCXByb2JlX2VudC0+aG9zdF9mbGFncyA9IHNpbF9wb3J0X2luZm9bZW50LT5kcml2ZXJfZGF0YV0uaG9zdF9mbGFnczsKKworCW1taW9fYmFzZSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDUpLAorCQkgICAgICAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDUpKTsKKwlpZiAobW1pb19iYXNlID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZV9lbnQ7CisJfQorCisJcHJvYmVfZW50LT5tbWlvX2Jhc2UgPSBtbWlvX2Jhc2U7CisKKwliYXNlID0gKHVuc2lnbmVkIGxvbmcpIG1taW9fYmFzZTsKKworCWZvciAoaSA9IDA7IGkgPCBwcm9iZV9lbnQtPm5fcG9ydHM7IGkrKykgeworCQlwcm9iZV9lbnQtPnBvcnRbaV0uY21kX2FkZHIgPSBiYXNlICsgc2lsX3BvcnRbaV0udGY7CisJCXByb2JlX2VudC0+cG9ydFtpXS5hbHRzdGF0dXNfYWRkciA9CisJCXByb2JlX2VudC0+cG9ydFtpXS5jdGxfYWRkciA9IGJhc2UgKyBzaWxfcG9ydFtpXS5jdGw7CisJCXByb2JlX2VudC0+cG9ydFtpXS5ibWRtYV9hZGRyID0gYmFzZSArIHNpbF9wb3J0W2ldLmJtZG1hOworCQlwcm9iZV9lbnQtPnBvcnRbaV0uc2NyX2FkZHIgPSBiYXNlICsgc2lsX3BvcnRbaV0uc2NyOworCQlhdGFfc3RkX3BvcnRzKCZwcm9iZV9lbnQtPnBvcnRbaV0pOworCX0KKworCS8qIEluaXRpYWxpemUgRklGTyBQQ0kgYnVzIGFyYml0cmF0aW9uICovCisJY2xzID0gc2lsX2dldF9kZXZpY2VfY2FjaGVfbGluZShwZGV2KTsKKwlpZiAoY2xzKSB7CisJCWNscyA+Pj0gMzsKKwkJY2xzKys7ICAvKiBjbHMgPSAobGluZV9zaXplLzgpKzEgKi8KKwkJd3JpdGViKGNscywgbW1pb19iYXNlICsgU0lMX0ZJRk9fUjApOworCQl3cml0ZWIoY2xzLCBtbWlvX2Jhc2UgKyBTSUxfRklGT19XMCk7CisJCXdyaXRlYihjbHMsIG1taW9fYmFzZSArIFNJTF9GSUZPX1IxKTsKKwkJd3JpdGViKGNscywgbW1pb19iYXNlICsgU0lMX0ZJRk9fVzIpOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICIoJXMpOiBjYWNoZSBsaW5lIHNpemUgbm90IHNldC4gIERyaXZlciBtYXkgbm90IGZ1bmN0aW9uXG4iLAorCQkJcGNpX25hbWUocGRldikpOworCisJaWYgKGVudC0+ZHJpdmVyX2RhdGEgPT0gc2lsXzMxMTQpIHsKKwkJaXJxX21hc2sgPSBTSUxfTUFTS180UE9SVDsKKworCQkvKiBmbGlwIHRoZSBtYWdpYyAibWFrZSA0IHBvcnRzIHdvcmsiIGJpdCAqLworCQl0bXAgPSByZWFkbChtbWlvX2Jhc2UgKyBTSUxfSURFMl9CTURNQSk7CisJCWlmICgodG1wICYgU0lMX0lOVFJfU1RFRVJJTkcpID09IDApCisJCQl3cml0ZWwodG1wIHwgU0lMX0lOVFJfU1RFRVJJTkcsCisJCQkgICAgICAgbW1pb19iYXNlICsgU0lMX0lERTJfQk1ETUEpOworCisJfSBlbHNlIHsKKwkJaXJxX21hc2sgPSBTSUxfTUFTS18yUE9SVDsKKwl9CisKKwkvKiBtYWtlIHN1cmUgSURFMC8xLzIvMyBpbnRlcnJ1cHRzIGFyZSBub3QgbWFza2VkICovCisJdG1wID0gcmVhZGwobW1pb19iYXNlICsgU0lMX1NZU0NGRyk7CisJaWYgKHRtcCAmIGlycV9tYXNrKSB7CisJCXRtcCAmPSB+aXJxX21hc2s7CisJCXdyaXRlbCh0bXAsIG1taW9fYmFzZSArIFNJTF9TWVNDRkcpOworCQlyZWFkbChtbWlvX2Jhc2UgKyBTSUxfU1lTQ0ZHKTsJLyogZmx1c2ggKi8KKwl9CisKKwkvKiBtYXNrIGFsbCBTQVRBIHBoeS1yZWxhdGVkIGludGVycnVwdHMgKi8KKwkvKiBUT0RPOiB1bm1hc2sgYml0IDYgKFNFcnJvciBOIGJpdCkgZm9yIGhvdHBsdWcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcHJvYmVfZW50LT5uX3BvcnRzOyBpKyspCisJCXdyaXRlbCgwLCBtbWlvX2Jhc2UgKyBzaWxfcG9ydFtpXS5zaWVuKTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJLyogRklYTUU6IGNoZWNrIGF0YV9kZXZpY2VfYWRkIHJldHVybiB2YWx1ZSAqLworCWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCk7CisJa2ZyZWUocHJvYmVfZW50KTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2ZyZWVfZW50OgorCWtmcmVlKHByb2JlX2VudCk7CitlcnJfb3V0X3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXQ6CisJaWYgKCFwY2lfZGV2X2J1c3kpCisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNpbF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmc2lsX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2lsX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnNpbF9wY2lfZHJpdmVyKTsKK30KKworCittb2R1bGVfaW5pdChzaWxfaW5pdCk7Cittb2R1bGVfZXhpdChzaWxfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV9zaXMuYyBiL2RyaXZlcnMvc2NzaS9zYXRhX3Npcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMDVkZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2F0YV9zaXMuYwpAQCAtMCwwICsxLDI4NiBAQAorLyoKKyAqICBzYXRhX3Npcy5jIC0gU2lsaWNvbiBJbnRlZ3JhdGVkIFN5c3RlbXMgU0FUQQorICoKKyAqICBNYWludGFpbmVkIGJ5OiAgVXdlIEtvemlvbGVrCisgKiAgCQkgICAgUGxlYXNlIEFMV0FZUyBjb3B5IGxpbnV4LWlkZUB2Z2VyLmtlcm5lbC5vcmcKKyAqCQkgICAgb24gZW1haWxzLgorICoKKyAqICBDb3B5cmlnaHQgMjAwNCBVd2UgS296aW9sZWsKKyAqCisgKiAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgT3BlbgorICogIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjEgdGhhdCBjYW4gYmUgZm91bmQgYXQKKyAqICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC0xLjEudHh0IGFuZCBpcyBpbmNsdWRlZCBoZXJlaW4KKyAqICBieSByZWZlcmVuY2UuCisgKgorICogIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCisgKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSBhcyBkaXN0cmlidXRlZAorICogIGluIHRoZSBrZXJuZWwgc291cmNlIENPUFlJTkcgZmlsZSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZgorICogIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdworICogIHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqICBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKKyAqICB0aGUgT1NMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZAorICogIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4KKyAqICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyCisgKiAgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBPU0wgb3IgdGhlIEdQTC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorCisjZGVmaW5lIERSVl9OQU1FCSJzYXRhX3NpcyIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNSIKKworZW51bSB7CisJc2lzXzE4MAkJCT0gMCwKKwlTSVNfU0NSX1BDSV9CQVIJCT0gNSwKKworCS8qIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworCVNJU19HRU5DVEwJCT0gMHg1NCwgLyogSURFIEdlbmVyYWwgQ29udHJvbCByZWdpc3RlciAqLworCVNJU19TQ1JfQkFTRQkJPSAweGMwLCAvKiBzYXRhMCBwaHkgU0NSIHJlZ2lzdGVycyAqLworCVNJU19TQVRBMV9PRlMJCT0gMHgxMCwgLyogb2Zmc2V0IGZyb20gc2F0YTAtPnNhdGExIHBoeSByZWdzICovCisKKwkvKiByYW5kb20gYml0cyAqLworCVNJU19GTEFHX0NGR1NDUgkJPSAoMSA8PCAzMCksIC8qIGhvc3QgZmxhZzogU0NScyB2aWEgUENJIGNmZyAqLworCisJR0VOQ1RMX0lPTUFQUEVEX1NDUgk9ICgxIDw8IDI2KSwgLyogaWYgc2V0LCBTQ1JzIGFyZSBpbiBJTyBzcGFjZSAqLworfTsKKworc3RhdGljIGludCBzaXNfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyB1MzIgc2lzX3Njcl9yZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKTsKK3N0YXRpYyB2b2lkIHNpc19zY3Jfd3JpdGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2lzX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfU0ksIDB4MTgwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBzaXNfMTgwIH0sCisJeyBQQ0lfVkVORE9SX0lEX1NJLCAweDE4MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgc2lzXzE4MCB9LAorCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc2lzX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQkJPSBzaXNfcGNpX3RibCwKKwkucHJvYmUJCQk9IHNpc19pbml0X29uZSwKKwkucmVtb3ZlCQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCit9OworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIHNpc19zaHQgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pb2N0bAkJCT0gYXRhX3Njc2lfaW9jdGwsCisJLnF1ZXVlY29tbWFuZAkJPSBhdGFfc2NzaV9xdWV1ZWNtZCwKKwkuZWhfc3RyYXRlZ3lfaGFuZGxlcgk9IGF0YV9zY3NpX2Vycm9yLAorCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKKwkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCisJLnNnX3RhYmxlc2l6ZQkJPSBBVEFfTUFYX1BSRCwKKwkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAorCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAorCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAorCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAorCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCisJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAorCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5vcmRlcmVkX2ZsdXNoCQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgc2lzX29wcyA9IHsKKwkucG9ydF9kaXNhYmxlCQk9IGF0YV9wb3J0X2Rpc2FibGUsCisJLnRmX2xvYWQJCT0gYXRhX3RmX2xvYWQsCisJLnRmX3JlYWQJCT0gYXRhX3RmX3JlYWQsCisJLmNoZWNrX3N0YXR1cwkJPSBhdGFfY2hlY2tfc3RhdHVzLAorCS5leGVjX2NvbW1hbmQJCT0gYXRhX2V4ZWNfY29tbWFuZCwKKwkuZGV2X3NlbGVjdAkJPSBhdGFfc3RkX2Rldl9zZWxlY3QsCisJLnBoeV9yZXNldAkJPSBzYXRhX3BoeV9yZXNldCwKKwkuYm1kbWFfc2V0dXAgICAgICAgICAgICA9IGF0YV9ibWRtYV9zZXR1cCwKKwkuYm1kbWFfc3RhcnQgICAgICAgICAgICA9IGF0YV9ibWRtYV9zdGFydCwKKwkuYm1kbWFfc3RvcAkJPSBhdGFfYm1kbWFfc3RvcCwKKwkuYm1kbWFfc3RhdHVzCQk9IGF0YV9ibWRtYV9zdGF0dXMsCisJLnFjX3ByZXAJCT0gYXRhX3FjX3ByZXAsCisJLnFjX2lzc3VlCQk9IGF0YV9xY19pc3N1ZV9wcm90LAorCS5lbmdfdGltZW91dAkJPSBhdGFfZW5nX3RpbWVvdXQsCisJLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCisJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAorCS5zY3JfcmVhZAkJPSBzaXNfc2NyX3JlYWQsCisJLnNjcl93cml0ZQkJPSBzaXNfc2NyX3dyaXRlLAorCS5wb3J0X3N0YXJ0CQk9IGF0YV9wb3J0X3N0YXJ0LAorCS5wb3J0X3N0b3AJCT0gYXRhX3BvcnRfc3RvcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBzaXNfcG9ydF9pbmZvID0geworCS5zaHQJCT0gJnNpc19zaHQsCisJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfU0FUQV9SRVNFVCB8CisJCQkgIEFUQV9GTEFHX05PX0xFR0FDWSwKKwkucGlvX21hc2sJPSAweDFmLAorCS5td2RtYV9tYXNrCT0gMHg3LAorCS51ZG1hX21hc2sJPSAweDdmLAorCS5wb3J0X29wcwk9ICZzaXNfb3BzLAorfTsKKworCitNT0RVTEVfQVVUSE9SKCJVd2UgS296aW9sZWsiKTsKK01PRFVMRV9ERVNDUklQVElPTigibG93LWxldmVsIGRyaXZlciBmb3IgU2lsaWNvbiBJbnRlZ3JhdGFkIFN5c3RlbXMgU0FUQSBjb250cm9sbGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2lzX3BjaV90YmwpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9zY3JfY2ZnX2FkZHIodW5zaWduZWQgaW50IHBvcnRfbm8sIHVuc2lnbmVkIGludCBzY19yZWcpCit7CisJdW5zaWduZWQgaW50IGFkZHIgPSBTSVNfU0NSX0JBU0UgKyAoNCAqIHNjX3JlZyk7CisKKwlpZiAocG9ydF9ubykKKwkJYWRkciArPSBTSVNfU0FUQTFfT0ZTOworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgdTMyIHNpc19zY3JfY2ZnX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0X3NldC0+ZGV2KTsKKwl1bnNpZ25lZCBpbnQgY2ZnX2FkZHIgPSBnZXRfc2NyX2NmZ19hZGRyKGFwLT5wb3J0X25vLCBzY19yZWcpOworCXUzMiB2YWw7CisKKwlpZiAoc2NfcmVnID09IFNDUl9FUlJPUikgLyogZG9lc24ndCBleGlzdCBpbiBQQ0kgY2ZnIHNwYWNlICovCisJCXJldHVybiAweGZmZmZmZmZmOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBjZmdfYWRkciwgJnZhbCk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgc2lzX3Njcl9jZmdfd3JpdGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY3IsIHUzMiB2YWwpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0X3NldC0+ZGV2KTsKKwl1bnNpZ25lZCBpbnQgY2ZnX2FkZHIgPSBnZXRfc2NyX2NmZ19hZGRyKGFwLT5wb3J0X25vLCBzY3IpOworCisJaWYgKHNjciA9PSBTQ1JfRVJST1IpIC8qIGRvZXNuJ3QgZXhpc3QgaW4gUENJIGNmZyBzcGFjZSAqLworCQlyZXR1cm47CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBjZmdfYWRkciwgdmFsKTsKK30KKworc3RhdGljIHUzMiBzaXNfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpCit7CisJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQorCQlyZXR1cm4gMHhmZmZmZmZmZlU7CisKKwlpZiAoYXAtPmZsYWdzICYgU0lTX0ZMQUdfQ0ZHU0NSKQorCQlyZXR1cm4gc2lzX3Njcl9jZmdfcmVhZChhcCwgc2NfcmVnKTsKKwlyZXR1cm4gaW5sKGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOworfQorCitzdGF0aWMgdm9pZCBzaXNfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKQoreworCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkKKwkJcmV0dXJuOworCisJaWYgKGFwLT5mbGFncyAmIFNJU19GTEFHX0NGR1NDUikKKwkJc2lzX3Njcl9jZmdfd3JpdGUoYXAsIHNjX3JlZywgdmFsKTsKKwllbHNlCisJCW91dGwodmFsLCBhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKK30KKworLyogbW92ZSB0byBQQ0kgbGF5ZXIsIGludGVncmF0ZSB3LyBNU0kgc3R1ZmYgKi8KK3N0YXRpYyB2b2lkIHBjaV9lbmFibGVfaW50eChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1MTYgcGNpX2NvbW1hbmQ7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jb21tYW5kKTsKKwlpZiAocGNpX2NvbW1hbmQgJiBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUpIHsKKwkJcGNpX2NvbW1hbmQgJj0gflBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBwY2lfY29tbWFuZCk7CisJfQorfQorCitzdGF0aWMgaW50IHNpc19pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCA9IE5VTEw7CisJaW50IHJjOworCXUzMiBnZW5jdGw7CisJc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaTsKKwlpbnQgcGNpX2Rldl9idXN5ID0gMDsKKworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChyYykgeworCQlwY2lfZGV2X2J1c3kgPSAxOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisKKwlwcGkgPSAmc2lzX3BvcnRfaW5mbzsKKwlwcm9iZV9lbnQgPSBhdGFfcGNpX2luaXRfbmF0aXZlX21vZGUocGRldiwgJnBwaSk7CisJaWYgKCFwcm9iZV9lbnQpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwl9CisKKwkvKiBjaGVjayBhbmQgc2VlIGlmIHRoZSBTQ1JzIGFyZSBpbiBJTyBzcGFjZSBvciBQQ0kgY2ZnIHNwYWNlICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFNJU19HRU5DVEwsICZnZW5jdGwpOworCWlmICgoZ2VuY3RsICYgR0VOQ1RMX0lPTUFQUEVEX1NDUikgPT0gMCkKKwkJcHJvYmVfZW50LT5ob3N0X2ZsYWdzIHw9IFNJU19GTEFHX0NGR1NDUjsKKwkKKwkvKiBpZiBoYXJkd2FyZSB0aGlua3MgU0NScyBhcmUgaW4gSU8gc3BhY2UsIGJ1dCB0aGVyZSBhcmUKKwkgKiBubyBJTyByZXNvdXJjZXMgYXNzaWduZWQsIGNoYW5nZSB0byBQQ0kgY2ZnIHNwYWNlLgorCSAqLworCWlmICgoIShwcm9iZV9lbnQtPmhvc3RfZmxhZ3MgJiBTSVNfRkxBR19DRkdTQ1IpKSAmJgorCSAgICAoKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBTSVNfU0NSX1BDSV9CQVIpID09IDApIHx8CisJICAgICAocGNpX3Jlc291cmNlX2xlbihwZGV2LCBTSVNfU0NSX1BDSV9CQVIpIDwgMTI4KSkpIHsKKwkJZ2VuY3RsICY9IH5HRU5DVExfSU9NQVBQRURfU0NSOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFNJU19HRU5DVEwsIGdlbmN0bCk7CisJCXByb2JlX2VudC0+aG9zdF9mbGFncyB8PSBTSVNfRkxBR19DRkdTQ1I7CisJfQorCisJaWYgKCEocHJvYmVfZW50LT5ob3N0X2ZsYWdzICYgU0lTX0ZMQUdfQ0ZHU0NSKSkgeworCQlwcm9iZV9lbnQtPnBvcnRbMF0uc2NyX2FkZHIgPQorCQkJcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIFNJU19TQ1JfUENJX0JBUik7CisJCXByb2JlX2VudC0+cG9ydFsxXS5zY3JfYWRkciA9CisJCQlwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgU0lTX1NDUl9QQ0lfQkFSKSArIDY0OworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCXBjaV9lbmFibGVfaW50eChwZGV2KTsKKworCS8qIEZJWE1FOiBjaGVjayBhdGFfZGV2aWNlX2FkZCByZXR1cm4gdmFsdWUgKi8KKwlhdGFfZGV2aWNlX2FkZChwcm9iZV9lbnQpOworCWtmcmVlKHByb2JlX2VudCk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKK2Vycl9vdXQ6CisJaWYgKCFwY2lfZGV2X2J1c3kpCisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmM7CisKK30KKworc3RhdGljIGludCBfX2luaXQgc2lzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZzaXNfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzaXNfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc2lzX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzaXNfaW5pdCk7Cittb2R1bGVfZXhpdChzaXNfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX3N2dy5jIGIvZHJpdmVycy9zY3NpL3NhdGFfc3Z3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQxYTVkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zYXRhX3N2dy5jCkBAIC0wLDAgKzEsNDgzIEBACisvKgorICogIHNhdGFfc3Z3LmMgLSBTZXJ2ZXJXb3JrcyAvIEFwcGxlIEsyIFNBVEEKKyAqCisgKiAgTWFpbnRhaW5lZCBieTogQmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPiBhbmQKKyAqCQkgICBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisgKiAgCQkgICAgUGxlYXNlIEFMV0FZUyBjb3B5IGxpbnV4LWlkZUB2Z2VyLmtlcm5lbC5vcmcKKyAqCQkgICAgb24gZW1haWxzLgorICoKKyAqICBDb3B5cmlnaHQgMjAwMyBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKgorICogIEJpdHMgZnJvbSBKZWZmIEdhcnppaywgQ29weXJpZ2h0IFJlZEhhdCwgSW5jLgorICoKKyAqICBUaGlzIGRyaXZlciBwcm9iYWJseSB3b3JrcyB3aXRoIG5vbi1BcHBsZSB2ZXJzaW9ucyBvZiB0aGUKKyAqICBCcm9hZGNvbSBjaGlwc2V0Li4uCisgKgorICogIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE9wZW4KKyAqICBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4xIHRoYXQgY2FuIGJlIGZvdW5kIGF0CisgKiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMS4xLnR4dCBhbmQgaXMgaW5jbHVkZWQgaGVyZWluCisgKiAgYnkgcmVmZXJlbmNlLgorICoKKyAqICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIikgYXMgZGlzdHJpYnV0ZWQKKyAqICBpbiB0aGUga2VybmVsIHNvdXJjZSBDT1BZSU5HIGZpbGUsIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YKKyAqICB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cKKyAqICB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiAgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCisgKiAgdGhlIE9TTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKKyAqICByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuCisgKiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91cgorICogIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUgT1NMIG9yIHRoZSBHUEwuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KKworI2lmZGVmIENPTkZJR19QUENfT0YKKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjZW5kaWYgLyogQ09ORklHX1BQQ19PRiAqLworCisjZGVmaW5lIERSVl9OQU1FCSJzYXRhX3N2dyIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMDUiCisKKy8qIFRhc2tmaWxlIHJlZ2lzdGVycyBvZmZzZXRzICovCisjZGVmaW5lIEsyX1NBVEFfVEZfQ01EX09GRlNFVAkJMHgwMAorI2RlZmluZSBLMl9TQVRBX1RGX0RBVEFfT0ZGU0VUCQkweDAwCisjZGVmaW5lIEsyX1NBVEFfVEZfRVJST1JfT0ZGU0VUCQkweDA0CisjZGVmaW5lIEsyX1NBVEFfVEZfTlNFQ1RfT0ZGU0VUCQkweDA4CisjZGVmaW5lIEsyX1NBVEFfVEZfTEJBTF9PRkZTRVQJCTB4MGMKKyNkZWZpbmUgSzJfU0FUQV9URl9MQkFNX09GRlNFVAkJMHgxMAorI2RlZmluZSBLMl9TQVRBX1RGX0xCQUhfT0ZGU0VUCQkweDE0CisjZGVmaW5lIEsyX1NBVEFfVEZfREVWSUNFX09GRlNFVAkweDE4CisjZGVmaW5lIEsyX1NBVEFfVEZfQ01EU1RBVF9PRkZTRVQgICAgICAJMHgxYworI2RlZmluZSBLMl9TQVRBX1RGX0NUTF9PRkZTRVQJCTB4MjAKKworLyogRE1BIGJhc2UgKi8KKyNkZWZpbmUgSzJfU0FUQV9ETUFfQ01EX09GRlNFVAkJMHgzMAorCisvKiBTQ1JzIGJhc2UgKi8KKyNkZWZpbmUgSzJfU0FUQV9TQ1JfU1RBVFVTX09GRlNFVAkweDQwCisjZGVmaW5lIEsyX1NBVEFfU0NSX0VSUk9SX09GRlNFVAkweDQ0CisjZGVmaW5lIEsyX1NBVEFfU0NSX0NPTlRST0xfT0ZGU0VUCTB4NDgKKworLyogT3RoZXJzICovCisjZGVmaW5lIEsyX1NBVEFfU0lDUjFfT0ZGU0VUCQkweDgwCisjZGVmaW5lIEsyX1NBVEFfU0lDUjJfT0ZGU0VUCQkweDg0CisjZGVmaW5lIEsyX1NBVEFfU0lNX09GRlNFVAkJMHg4OAorCisvKiBQb3J0IHN0cmlkZSAqLworI2RlZmluZSBLMl9TQVRBX1BPUlRfT0ZGU0VUCQkweDEwMAorCisKK3N0YXRpYyB1MzIgazJfc2F0YV9zY3JfcmVhZCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZykKK3sKKwlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpCisJCXJldHVybiAweGZmZmZmZmZmVTsKKwlyZXR1cm4gcmVhZGwoKHZvaWQgKikgYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7Cit9CisKKworc3RhdGljIHZvaWQgazJfc2F0YV9zY3Jfd3JpdGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsCisJCQkgICAgICAgdTMyIHZhbCkKK3sKKwlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpCisJCXJldHVybjsKKwl3cml0ZWwodmFsLCAodm9pZCAqKSBhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKK30KKworCitzdGF0aWMgdm9pZCBrMl9zYXRhX3RmX2xvYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpCit7CisJc3RydWN0IGF0YV9pb3BvcnRzICppb2FkZHIgPSAmYXAtPmlvYWRkcjsKKwl1bnNpZ25lZCBpbnQgaXNfYWRkciA9IHRmLT5mbGFncyAmIEFUQV9URkxBR19JU0FERFI7CisKKwlpZiAodGYtPmN0bCAhPSBhcC0+bGFzdF9jdGwpIHsKKwkJd3JpdGViKHRmLT5jdGwsIGlvYWRkci0+Y3RsX2FkZHIpOworCQlhcC0+bGFzdF9jdGwgPSB0Zi0+Y3RsOworCQlhdGFfd2FpdF9pZGxlKGFwKTsKKwl9CisJaWYgKGlzX2FkZHIgJiYgKHRmLT5mbGFncyAmIEFUQV9URkxBR19MQkE0OCkpIHsKKwkJd3JpdGV3KHRmLT5mZWF0dXJlIHwgKCgodTE2KXRmLT5ob2JfZmVhdHVyZSkgPDwgOCksIGlvYWRkci0+ZmVhdHVyZV9hZGRyKTsKKwkJd3JpdGV3KHRmLT5uc2VjdCB8ICgoKHUxNil0Zi0+aG9iX25zZWN0KSA8PCA4KSwgaW9hZGRyLT5uc2VjdF9hZGRyKTsKKwkJd3JpdGV3KHRmLT5sYmFsIHwgKCgodTE2KXRmLT5ob2JfbGJhbCkgPDwgOCksIGlvYWRkci0+bGJhbF9hZGRyKTsKKwkJd3JpdGV3KHRmLT5sYmFtIHwgKCgodTE2KXRmLT5ob2JfbGJhbSkgPDwgOCksIGlvYWRkci0+bGJhbV9hZGRyKTsKKwkJd3JpdGV3KHRmLT5sYmFoIHwgKCgodTE2KXRmLT5ob2JfbGJhaCkgPDwgOCksIGlvYWRkci0+bGJhaF9hZGRyKTsKKwl9IGVsc2UgaWYgKGlzX2FkZHIpIHsKKwkJd3JpdGV3KHRmLT5mZWF0dXJlLCBpb2FkZHItPmZlYXR1cmVfYWRkcik7CisJCXdyaXRldyh0Zi0+bnNlY3QsIGlvYWRkci0+bnNlY3RfYWRkcik7CisJCXdyaXRldyh0Zi0+bGJhbCwgaW9hZGRyLT5sYmFsX2FkZHIpOworCQl3cml0ZXcodGYtPmxiYW0sIGlvYWRkci0+bGJhbV9hZGRyKTsKKwkJd3JpdGV3KHRmLT5sYmFoLCBpb2FkZHItPmxiYWhfYWRkcik7CisJfQorCisJaWYgKHRmLT5mbGFncyAmIEFUQV9URkxBR19ERVZJQ0UpCisJCXdyaXRlYih0Zi0+ZGV2aWNlLCBpb2FkZHItPmRldmljZV9hZGRyKTsKKworCWF0YV93YWl0X2lkbGUoYXApOworfQorCisKK3N0YXRpYyB2b2lkIGsyX3NhdGFfdGZfcmVhZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwlzdHJ1Y3QgYXRhX2lvcG9ydHMgKmlvYWRkciA9ICZhcC0+aW9hZGRyOworCXUxNiBuc2VjdCwgbGJhbCwgbGJhbSwgbGJhaDsKKworCW5zZWN0ID0gdGYtPm5zZWN0ID0gcmVhZHcoaW9hZGRyLT5uc2VjdF9hZGRyKTsKKwlsYmFsID0gdGYtPmxiYWwgPSByZWFkdyhpb2FkZHItPmxiYWxfYWRkcik7CisJbGJhbSA9IHRmLT5sYmFtID0gcmVhZHcoaW9hZGRyLT5sYmFtX2FkZHIpOworCWxiYWggPSB0Zi0+bGJhaCA9IHJlYWR3KGlvYWRkci0+bGJhaF9hZGRyKTsKKwl0Zi0+ZGV2aWNlID0gcmVhZHcoaW9hZGRyLT5kZXZpY2VfYWRkcik7CisKKwlpZiAodGYtPmZsYWdzICYgQVRBX1RGTEFHX0xCQTQ4KSB7CisJCXRmLT5ob2JfZmVhdHVyZSA9IHJlYWR3KGlvYWRkci0+ZXJyb3JfYWRkcikgPj4gODsKKwkJdGYtPmhvYl9uc2VjdCA9IG5zZWN0ID4+IDg7CisJCXRmLT5ob2JfbGJhbCA9IGxiYWwgPj4gODsKKwkJdGYtPmhvYl9sYmFtID0gbGJhbSA+PiA4OworCQl0Zi0+aG9iX2xiYWggPSBsYmFoID4+IDg7CisgICAgICAgIH0KK30KKworLyoqCisgKglrMl9ibWRtYV9zZXR1cF9tbWlvIC0gU2V0IHVwIFBDSSBJREUgQk1ETUEgdHJhbnNhY3Rpb24gKE1NSU8pCisgKglAcWM6IEluZm8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgQVRBIHRyYW5zYWN0aW9uLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3N0YXRpYyB2b2lkIGsyX2JtZG1hX3NldHVwX21taW8gKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwl1bnNpZ25lZCBpbnQgcncgPSAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFKTsKKwl1OCBkbWFjdGw7CisJdm9pZCAqbW1pbyA9ICh2b2lkICopIGFwLT5pb2FkZHIuYm1kbWFfYWRkcjsKKwkvKiBsb2FkIFBSRCB0YWJsZSBhZGRyLiAqLworCW1iKCk7CS8qIG1ha2Ugc3VyZSBQUkQgdGFibGUgd3JpdGVzIGFyZSB2aXNpYmxlIHRvIGNvbnRyb2xsZXIgKi8KKwl3cml0ZWwoYXAtPnByZF9kbWEsIG1taW8gKyBBVEFfRE1BX1RBQkxFX09GUyk7CisKKwkvKiBzcGVjaWZ5IGRhdGEgZGlyZWN0aW9uLCB0cmlwbGUtY2hlY2sgc3RhcnQgYml0IGlzIGNsZWFyICovCisJZG1hY3RsID0gcmVhZGIobW1pbyArIEFUQV9ETUFfQ01EKTsKKwlkbWFjdGwgJj0gfihBVEFfRE1BX1dSIHwgQVRBX0RNQV9TVEFSVCk7CisJaWYgKCFydykKKwkJZG1hY3RsIHw9IEFUQV9ETUFfV1I7CisJd3JpdGViKGRtYWN0bCwgbW1pbyArIEFUQV9ETUFfQ01EKTsKKworCS8qIGlzc3VlIHIvdyBjb21tYW5kIGlmIHRoaXMgaXMgbm90IGEgQVRBIERNQSBjb21tYW5kKi8KKwlpZiAocWMtPnRmLnByb3RvY29sICE9IEFUQV9QUk9UX0RNQSkKKwkJYXAtPm9wcy0+ZXhlY19jb21tYW5kKGFwLCAmcWMtPnRmKTsKK30KKworLyoqCisgKglrMl9ibWRtYV9zdGFydF9tbWlvIC0gU3RhcnQgYSBQQ0kgSURFIEJNRE1BIHRyYW5zYWN0aW9uIChNTUlPKQorICoJQHFjOiBJbmZvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEFUQSB0cmFuc2FjdGlvbi4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqLworCitzdGF0aWMgdm9pZCBrMl9ibWRtYV9zdGFydF9tbWlvIChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJdm9pZCAqbW1pbyA9ICh2b2lkICopIGFwLT5pb2FkZHIuYm1kbWFfYWRkcjsKKwl1OCBkbWFjdGw7CisKKwkvKiBzdGFydCBob3N0IERNQSB0cmFuc2FjdGlvbiAqLworCWRtYWN0bCA9IHJlYWRiKG1taW8gKyBBVEFfRE1BX0NNRCk7CisJd3JpdGViKGRtYWN0bCB8IEFUQV9ETUFfU1RBUlQsIG1taW8gKyBBVEFfRE1BX0NNRCk7CisJLyogVGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiBpbiBjZXJ0YWluIFNBVEEgY29udHJvbGxlcnMgdGhhdCBjYW4gCisJICAgYmUgc2VlbiB3aGVuIHRoZSByL3cgY29tbWFuZCBpcyBnaXZlbiB0byB0aGUgY29udHJvbGxlciBiZWZvcmUgdGhlIAorCSAgIGhvc3QgRE1BIGlzIHN0YXJ0ZWQuIE9uIGEgUmVhZCBjb21tYW5kLCB0aGUgY29udHJvbGxlciB3b3VsZCBpbml0aWF0ZQorCSAgIHRoZSBjb21tYW5kIHRvIHRoZSBkcml2ZSBldmVuIGJlZm9yZSBpdCBzZWVzIHRoZSBETUEgc3RhcnQuIFdoZW4gdGhlcmUKKwkgICBhcmUgdmVyeSBmYXN0IGRyaXZlcyBjb25uZWN0ZWQgdG8gdGhlIGNvbnRyb2xsZXIsIG9yIHdoZW4gdGhlIGRhdGEgcmVxdWVzdCAKKwkgICBoaXRzIGluIHRoZSBkcml2ZSBjYWNoZSwgdGhlcmUgaXMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhlIGRyaXZlIHJldHVybnMgYSBwYXJ0CisJICAgb3IgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgZGF0YSB0byB0aGUgY29udHJvbGxlciBiZWZvcmUgdGhlIERNQSBzdGFydCBpcyBpc3N1ZWQuCisJICAgSW4gdGhpcyBjYXNlLCB0aGUgY29udHJvbGxlciB3b3VsZCBiZWNvbWUgY29uZnVzZWQgYXMgdG8gd2hhdCB0byBkbyB3aXRoIHRoZSBkYXRhLgorCSAgIEluIHRoZSB3b3JzdCBjYXNlIHdoZW4gYWxsIHRoZSBkYXRhIGlzIHJldHVybmVkIGJhY2sgdG8gdGhlIGNvbnRyb2xsZXIsIHRoZQorCSAgIGNvbnRyb2xsZXIgY291bGQgaGFuZy4gSW4gb3RoZXIgY2FzZXMgaXQgY291bGQgcmV0dXJuIHBhcnRpYWwgZGF0YSByZXR1cm5pbmcKKwkgICBpbiBkYXRhIGNvcnJ1cHRpb24uIFRoaXMgcHJvYmxlbSBoYXMgYmVlbiBzZWVuIGluIFBQQyBzeXN0ZW1zIGFuZCBjYW4gYWxzbyBhcHBlYXIKKwkgICBvbiBhbiBzeXN0ZW0gd2l0aCB2ZXJ5IGZhc3QgZGlza3MsIHdoZXJlIHRoZSBTQVRBIGNvbnRyb2xsZXIgaXMgc2l0dGluZyBiZWhpbmQgYSAKKwkgICBudW1iZXIgb2YgYnJpZGdlcywgYW5kIGhlbmNlIHRoZXJlIGlzIHNpZ25pZmljYW50IGxhdGVuY3kgYmV0d2VlbiB0aGUgci93IGNvbW1hbmQKKwkgICBhbmQgdGhlIHN0YXJ0IGNvbW1hbmQuICovCisJLyogaXNzdWUgci93IGNvbW1hbmQgaWYgdGhlIGFjY2VzcyBpcyB0byBBVEEqLworCWlmIChxYy0+dGYucHJvdG9jb2wgPT0gQVRBX1BST1RfRE1BKQorCQlhcC0+b3BzLT5leGVjX2NvbW1hbmQoYXAsICZxYy0+dGYpOworfQorCisJCQkJCQkJCQkgICAgICAKK3N0YXRpYyB1OCBrMl9zdGF0X2NoZWNrX3N0YXR1cyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworICAgICAgIAlyZXR1cm4gcmVhZGwoKHZvaWQgKikgYXAtPmlvYWRkci5zdGF0dXNfYWRkcik7Cit9CisKKyNpZmRlZiBDT05GSUdfUFBDX09GCisvKgorICogazJfc2F0YV9wcm9jX2luZm8KKyAqIGlub3V0IDogZGVjaWRlcyBvbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBkYXRhZmxvdyBhbmQgdGhlIG1lYW5pbmcgb2YgdGhlCisgKgkgICB2YXJpYWJsZXMKKyAqIGJ1ZmZlcjogSWYgaW5vdXQ9PUZBTFNFIGRhdGEgaXMgYmVpbmcgd3JpdHRlbiB0byBpdCBlbHNlIHJlYWQgZnJvbSBpdAorICogKnN0YXJ0OiBJZiBpbm91dD09RkFMU0Ugc3RhcnQgb2YgdGhlIHZhbGlkIGRhdGEgaW4gdGhlIGJ1ZmZlcgorICogb2Zmc2V0OiBJZiBpbm91dD09RkFMU0Ugb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW1hZ2luYXJ5IGZpbGUKKyAqCSAgIGZyb20gd2hpY2ggd2Ugc3RhcnQgd3JpdGluZyBpbnRvIHRoZSBidWZmZXIKKyAqIGxlbmd0aDogSWYgaW5vdXQ9PUZBTFNFIG1heCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBidWZmZXIKKyAqCSAgIGVsc2UgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIKKyAqLworc3RhdGljIGludCBrMl9zYXRhX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICAgICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwgaW50IGlub3V0KQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXA7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlpbnQgbGVuLCBpbmRleDsKKworCS8qIEZpbmQgIHRoZSBhdGFfcG9ydCAqLworCWFwID0gKHN0cnVjdCBhdGFfcG9ydCAqKSAmc2hvc3QtPmhvc3RkYXRhWzBdOworCWlmIChhcCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCS8qIEZpbmQgdGhlIE9GIG5vZGUgZm9yIHRoZSBQQ0kgZGV2aWNlIHByb3BlciAqLworCW5wID0gcGNpX2RldmljZV90b19PRl9ub2RlKHRvX3BjaV9kZXYoYXAtPmhvc3Rfc2V0LT5kZXYpKTsKKwlpZiAobnAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkvKiBNYXRjaCBpdCB0byBhIHBvcnQgbm9kZSAqLworCWluZGV4ID0gKGFwID09IGFwLT5ob3N0X3NldC0+cG9ydHNbMF0pID8gMCA6IDE7CisJZm9yIChucCA9IG5wLT5jaGlsZDsgbnAgIT0gTlVMTDsgbnAgPSBucC0+c2libGluZykgeworCQl1MzIgKnJlZyA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKKwkJaWYgKCFyZWcpCisJCQljb250aW51ZTsKKwkJaWYgKGluZGV4ID09ICpyZWcpCisJCQlicmVhazsKKwl9CisJaWYgKG5wID09IE5VTEwpCisJCXJldHVybiAwOworCisJbGVuID0gc3ByaW50ZihwYWdlLCAiZGV2c3BlYzogJXNcbiIsIG5wLT5mdWxsX25hbWUpOworCisJcmV0dXJuIGxlbjsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFBDX09GICovCisKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBrMl9zYXRhX3NodCA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlvY3RsCQkJPSBhdGFfc2NzaV9pb2N0bCwKKwkucXVldWVjb21tYW5kCQk9IGF0YV9zY3NpX3F1ZXVlY21kLAorCS5laF9zdHJhdGVneV9oYW5kbGVyCT0gYXRhX3Njc2lfZXJyb3IsCisJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAorCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKKwkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAorCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCisJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCisJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCisJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKKwkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCisJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKyNpZmRlZiBDT05GSUdfUFBDX09GCisJLnByb2NfaW5mbwkJPSBrMl9zYXRhX3Byb2NfaW5mbywKKyNlbmRpZgorCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkub3JkZXJlZF9mbHVzaAkJPSAxLAorfTsKKworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgazJfc2F0YV9vcHMgPSB7CisJLnBvcnRfZGlzYWJsZQkJPSBhdGFfcG9ydF9kaXNhYmxlLAorCS50Zl9sb2FkCQk9IGsyX3NhdGFfdGZfbG9hZCwKKwkudGZfcmVhZAkJPSBrMl9zYXRhX3RmX3JlYWQsCisJLmNoZWNrX3N0YXR1cwkJPSBrMl9zdGF0X2NoZWNrX3N0YXR1cywKKwkuZXhlY19jb21tYW5kCQk9IGF0YV9leGVjX2NvbW1hbmQsCisJLmRldl9zZWxlY3QJCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAorCS5waHlfcmVzZXQJCT0gc2F0YV9waHlfcmVzZXQsCisJLmJtZG1hX3NldHVwCQk9IGsyX2JtZG1hX3NldHVwX21taW8sCisJLmJtZG1hX3N0YXJ0CQk9IGsyX2JtZG1hX3N0YXJ0X21taW8sCisJLmJtZG1hX3N0b3AJCT0gYXRhX2JtZG1hX3N0b3AsCisJLmJtZG1hX3N0YXR1cwkJPSBhdGFfYm1kbWFfc3RhdHVzLAorCS5xY19wcmVwCQk9IGF0YV9xY19wcmVwLAorCS5xY19pc3N1ZQkJPSBhdGFfcWNfaXNzdWVfcHJvdCwKKwkuZW5nX3RpbWVvdXQJCT0gYXRhX2VuZ190aW1lb3V0LAorCS5pcnFfaGFuZGxlcgkJPSBhdGFfaW50ZXJydXB0LAorCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKKwkuc2NyX3JlYWQJCT0gazJfc2F0YV9zY3JfcmVhZCwKKwkuc2NyX3dyaXRlCQk9IGsyX3NhdGFfc2NyX3dyaXRlLAorCS5wb3J0X3N0YXJ0CQk9IGF0YV9wb3J0X3N0YXJ0LAorCS5wb3J0X3N0b3AJCT0gYXRhX3BvcnRfc3RvcCwKK307CisKK3N0YXRpYyB2b2lkIGsyX3NhdGFfc2V0dXBfcG9ydChzdHJ1Y3QgYXRhX2lvcG9ydHMgKnBvcnQsIHVuc2lnbmVkIGxvbmcgYmFzZSkKK3sKKwlwb3J0LT5jbWRfYWRkcgkJPSBiYXNlICsgSzJfU0FUQV9URl9DTURfT0ZGU0VUOworCXBvcnQtPmRhdGFfYWRkcgkJPSBiYXNlICsgSzJfU0FUQV9URl9EQVRBX09GRlNFVDsKKwlwb3J0LT5mZWF0dXJlX2FkZHIJPQorCXBvcnQtPmVycm9yX2FkZHIJPSBiYXNlICsgSzJfU0FUQV9URl9FUlJPUl9PRkZTRVQ7CisJcG9ydC0+bnNlY3RfYWRkcgk9IGJhc2UgKyBLMl9TQVRBX1RGX05TRUNUX09GRlNFVDsKKwlwb3J0LT5sYmFsX2FkZHIJCT0gYmFzZSArIEsyX1NBVEFfVEZfTEJBTF9PRkZTRVQ7CisJcG9ydC0+bGJhbV9hZGRyCQk9IGJhc2UgKyBLMl9TQVRBX1RGX0xCQU1fT0ZGU0VUOworCXBvcnQtPmxiYWhfYWRkcgkJPSBiYXNlICsgSzJfU0FUQV9URl9MQkFIX09GRlNFVDsKKwlwb3J0LT5kZXZpY2VfYWRkcgk9IGJhc2UgKyBLMl9TQVRBX1RGX0RFVklDRV9PRkZTRVQ7CisJcG9ydC0+Y29tbWFuZF9hZGRyCT0KKwlwb3J0LT5zdGF0dXNfYWRkcgk9IGJhc2UgKyBLMl9TQVRBX1RGX0NNRFNUQVRfT0ZGU0VUOworCXBvcnQtPmFsdHN0YXR1c19hZGRyCT0KKwlwb3J0LT5jdGxfYWRkcgkJPSBiYXNlICsgSzJfU0FUQV9URl9DVExfT0ZGU0VUOworCXBvcnQtPmJtZG1hX2FkZHIJPSBiYXNlICsgSzJfU0FUQV9ETUFfQ01EX09GRlNFVDsKKwlwb3J0LT5zY3JfYWRkcgkJPSBiYXNlICsgSzJfU0FUQV9TQ1JfU1RBVFVTX09GRlNFVDsKK30KKworCitzdGF0aWMgaW50IGsyX3NhdGFfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwl2b2lkICptbWlvX2Jhc2U7CisJaW50IHBjaV9kZXZfYnVzeSA9IDA7CisJaW50IHJjOworCisJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIiB2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisKKwkvKgorCSAqIElmIHRoaXMgZHJpdmVyIGhhcHBlbnMgdG8gb25seSBiZSB1c2VmdWwgb24gQXBwbGUncyBLMiwgdGhlbgorCSAqIHdlIHNob3VsZCBjaGVjayB0aGF0IGhlcmUgYXMgaXQgaGFzIGEgbm9ybWFsIFNlcnZlcndvcmtzIElECisJICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwkvKgorCSAqIENoZWNrIGlmIHdlIGhhdmUgcmVzb3VyY2VzIG1hcHBlZCBhdCBhbGwgKHNlY29uZCBmdW5jdGlvbiBtYXkKKwkgKiBoYXZlIGJlZW4gZGlzYWJsZWQgYnkgZmlybXdhcmUpCisJICovCisJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgNSkgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBSZXF1ZXN0IFBDSSByZWdpb25zICovCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmMpIHsKKwkJcGNpX2Rldl9idXN5ID0gMTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCisJcHJvYmVfZW50ID0ga21hbGxvYyhzaXplb2YoKnByb2JlX2VudCksIEdGUF9LRVJORUwpOworCWlmIChwcm9iZV9lbnQgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCX0KKworCW1lbXNldChwcm9iZV9lbnQsIDAsIHNpemVvZigqcHJvYmVfZW50KSk7CisJcHJvYmVfZW50LT5kZXYgPSBwY2lfZGV2X3RvX2RldihwZGV2KTsKKwlJTklUX0xJU1RfSEVBRCgmcHJvYmVfZW50LT5ub2RlKTsKKworCW1taW9fYmFzZSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDUpLAorCQkgICAgICAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDUpKTsKKwlpZiAobW1pb19iYXNlID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZV9lbnQ7CisJfQorCWJhc2UgPSAodW5zaWduZWQgbG9uZykgbW1pb19iYXNlOworCisJLyogQ2xlYXIgYSBtYWdpYyBiaXQgaW4gU0NSMSBhY2NvcmRpbmcgdG8gRGFyd2luLCB0aG9zZSBoZWxwCisJICogc29tZSBmdW5reSBzZWFnYXRlIGRyaXZlcyAodGhvdWdoIHNvIGZhciwgdGhvc2Ugd2VyZSBhbHJlYWR5CisJICogc2V0IGJ5IHRoZSBmaXJtd2FyZSBvbiB0aGUgbWFjaGluZXMgSSBoYWQgYWNjZXNzIHRvCisJICovCisJd3JpdGVsKHJlYWRsKG1taW9fYmFzZSArIEsyX1NBVEFfU0lDUjFfT0ZGU0VUKSAmIH4weDAwMDQwMDAwLAorCSAgICAgICBtbWlvX2Jhc2UgKyBLMl9TQVRBX1NJQ1IxX09GRlNFVCk7CisKKwkvKiBDbGVhciBTQVRBIGVycm9yICYgaW50ZXJydXB0cyB3ZSBkb24ndCB1c2UgKi8KKwl3cml0ZWwoMHhmZmZmZmZmZiwgbW1pb19iYXNlICsgSzJfU0FUQV9TQ1JfRVJST1JfT0ZGU0VUKTsKKwl3cml0ZWwoMHgwLCBtbWlvX2Jhc2UgKyBLMl9TQVRBX1NJTV9PRkZTRVQpOworCisJcHJvYmVfZW50LT5zaHQgPSAmazJfc2F0YV9zaHQ7CisJcHJvYmVfZW50LT5ob3N0X2ZsYWdzID0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX1NBVEFfUkVTRVQgfAorCQkJCUFUQV9GTEFHX05PX0xFR0FDWSB8IEFUQV9GTEFHX01NSU87CisJcHJvYmVfZW50LT5wb3J0X29wcyA9ICZrMl9zYXRhX29wczsKKwlwcm9iZV9lbnQtPm5fcG9ydHMgPSA0OworCXByb2JlX2VudC0+aXJxID0gcGRldi0+aXJxOworCXByb2JlX2VudC0+aXJxX2ZsYWdzID0gU0FfU0hJUlE7CisJcHJvYmVfZW50LT5tbWlvX2Jhc2UgPSBtbWlvX2Jhc2U7CisKKwkvKiBXZSBkb24ndCBjYXJlIG11Y2ggYWJvdXQgdGhlIFBJTy9VRE1BIG1hc2tzLCBidXQgdGhlIGNvcmUgd29uJ3QgbGlrZSB1cworCSAqIGlmIHdlIGRvbid0IGZpbGwgdGhlc2UKKwkgKi8KKwlwcm9iZV9lbnQtPnBpb19tYXNrID0gMHgxZjsKKwlwcm9iZV9lbnQtPm13ZG1hX21hc2sgPSAweDc7CisJcHJvYmVfZW50LT51ZG1hX21hc2sgPSAweDdmOworCisJLyogV2UgaGF2ZSA0IHBvcnRzIHBlciBQQ0kgZnVuY3Rpb24gKi8KKwlrMl9zYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFswXSwgYmFzZSArIDAgKiBLMl9TQVRBX1BPUlRfT0ZGU0VUKTsKKwlrMl9zYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFsxXSwgYmFzZSArIDEgKiBLMl9TQVRBX1BPUlRfT0ZGU0VUKTsKKwlrMl9zYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFsyXSwgYmFzZSArIDIgKiBLMl9TQVRBX1BPUlRfT0ZGU0VUKTsKKwlrMl9zYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFszXSwgYmFzZSArIDMgKiBLMl9TQVRBX1BPUlRfT0ZGU0VUKTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJLyogRklYTUU6IGNoZWNrIGF0YV9kZXZpY2VfYWRkIHJldHVybiB2YWx1ZSAqLworCWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCk7CisJa2ZyZWUocHJvYmVfZW50KTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2ZyZWVfZW50OgorCWtmcmVlKHByb2JlX2VudCk7CitlcnJfb3V0X3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXQ6CisJaWYgKCFwY2lfZGV2X2J1c3kpCisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGsyX3NhdGFfcGNpX3RibFtdID0geworCXsgMHgxMTY2LCAweDAyNDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IDB4MTE2NiwgMHgwMjQxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyAweDExNjYsIDB4MDI0MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgfQorfTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgazJfc2F0YV9wY2lfZHJpdmVyID0geworCS5uYW1lCQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJCT0gazJfc2F0YV9wY2lfdGJsLAorCS5wcm9iZQkJCT0gazJfc2F0YV9pbml0X29uZSwKKwkucmVtb3ZlCQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGsyX3NhdGFfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmsyX3NhdGFfcGNpX2RyaXZlcik7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IGsyX3NhdGFfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmazJfc2F0YV9wY2lfZHJpdmVyKTsKK30KKworCitNT0RVTEVfQVVUSE9SKCJCZW5qYW1pbiBIZXJyZW5zY2htaWR0Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImxvdy1sZXZlbCBkcml2ZXIgZm9yIEsyIFNBVEEgY29udHJvbGxlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGsyX3NhdGFfcGNpX3RibCk7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK21vZHVsZV9pbml0KGsyX3NhdGFfaW5pdCk7Cittb2R1bGVfZXhpdChrMl9zYXRhX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NhdGFfc3g0LmMgYi9kcml2ZXJzL3Njc2kvc2F0YV9zeDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDExODY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfc3g0LmMKQEAgLTAsMCArMSwxNTAzIEBACisvKgorICogIHNhdGFfc3g0LmMgLSBQcm9taXNlIFNBVEEKKyAqCisgKiAgTWFpbnRhaW5lZCBieTogIEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKyAqICAJCSAgICBQbGVhc2UgQUxXQVlTIGNvcHkgbGludXgtaWRlQHZnZXIua2VybmVsLm9yZworICoJCSAgICBvbiBlbWFpbHMuCisgKgorICogIENvcHlyaWdodCAyMDAzLTIwMDQgUmVkIEhhdCwgSW5jLgorICoKKyAqICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBPcGVuCisgKiAgU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMSB0aGF0IGNhbiBiZSBmb3VuZCBhdAorICogIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLTEuMS50eHQgYW5kIGlzIGluY2x1ZGVkIGhlcmVpbgorICogIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpIGFzIGRpc3RyaWJ1dGVkCisgKiAgaW4gdGhlIGtlcm5lbCBzb3VyY2UgQ09QWUlORyBmaWxlLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mCisgKiAgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZSBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93CisgKiAgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgorICogIHRoZSBPU0wsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kCisgKiAgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLgorICogIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIKKyAqICB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE9TTCBvciB0aGUgR1BMLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJzYXRhX3Byb21pc2UuaCIKKworI2RlZmluZSBEUlZfTkFNRQkic2F0YV9zeDQiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjciCisKKworZW51bSB7CisJUERDX1BSRF9UQkwJCT0gMHg0NCwJLyogRGlyZWN0IGNvbW1hbmQgRE1BIHRhYmxlIGFkZHIgKi8KKworCVBEQ19QS1RfU1VCTUlUCQk9IDB4NDAsIC8qIENvbW1hbmQgcGFja2V0IHBvaW50ZXIgYWRkciAqLworCVBEQ19IRE1BX1BLVF9TVUJNSVQJPSAweDEwMCwgLyogSG9zdCBETUEgcGFja2V0IHBvaW50ZXIgYWRkciAqLworCVBEQ19JTlRfU0VRTUFTSwkJPSAweDQwLAkvKiBNYXNrIG9mIGFzc2VydGVkIFNFUSBJTlRzICovCisJUERDX0hETUFfQ1RMU1RBVAk9IDB4MTJDLCAvKiBIb3N0IERNQSBjb250cm9sIC8gc3RhdHVzICovCisKKwlQRENfMjA2MjFfU0VRQ1RMCT0gMHg0MDAsCisJUERDXzIwNjIxX1NFUU1BU0sJPSAweDQ4MCwKKwlQRENfMjA2MjFfR0VORVJBTF9DVEwJPSAweDQ4NCwKKwlQRENfMjA2MjFfUEFHRV9TSVpFCT0gKDMyICogMTAyNCksCisKKwkvKiBjaG9zZW4sIG5vdCBjb25zdGFudCwgdmFsdWVzOyB3ZSBkZXNpZ24gb3VyIG93biBESU1NIG1lbSBtYXAgKi8KKwlQRENfMjA2MjFfRElNTV9XSU5ET1cJPSAweDBDLAkvKiBwYWdlIyBmb3IgMzJLIERJTU0gd2luZG93ICovCisJUERDXzIwNjIxX0RJTU1fQkFTRQk9IDB4MDAyMDAwMDAsCisJUERDXzIwNjIxX0RJTU1fREFUQQk9ICg2NCAqIDEwMjQpLAorCVBEQ19ESU1NX0RBVEFfU1RFUAk9ICgyNTYgKiAxMDI0KSwKKwlQRENfRElNTV9XSU5ET1dfU1RFUAk9ICg4ICogMTAyNCksCisJUERDX0RJTU1fSE9TVF9QUkQJPSAoNiAqIDEwMjQpLAorCVBEQ19ESU1NX0hPU1RfUEtUCT0gKDEyOCAqIDApLAorCVBEQ19ESU1NX0hQS1RfUFJECT0gKDEyOCAqIDEpLAorCVBEQ19ESU1NX0FUQV9QS1QJPSAoMTI4ICogMiksCisJUERDX0RJTU1fQVBLVF9QUkQJPSAoMTI4ICogMyksCisJUERDX0RJTU1fSEVBREVSX1NaCT0gUERDX0RJTU1fQVBLVF9QUkQgKyAxMjgsCisJUERDX1BBR0VfV0lORE9XCQk9IDB4NDAsCisJUERDX1BBR0VfREFUQQkJPSBQRENfUEFHRV9XSU5ET1cgKworCQkJCSAgKFBEQ18yMDYyMV9ESU1NX0RBVEEgLyBQRENfMjA2MjFfUEFHRV9TSVpFKSwKKwlQRENfUEFHRV9TRVQJCT0gUERDX0RJTU1fREFUQV9TVEVQIC8gUERDXzIwNjIxX1BBR0VfU0laRSwKKworCVBEQ19DSElQMF9PRlMJCT0gMHhDMDAwMCwgLyogb2Zmc2V0IG9mIGNoaXAgIzAgKi8KKworCVBEQ18yMDYyMV9FUlJfTUFTSwk9ICgxPDwxOSkgfCAoMTw8MjApIHwgKDE8PDIxKSB8ICgxPDwyMikgfAorCQkJCSAgKDE8PDIzKSwKKworCWJvYXJkXzIwNjIxCQk9IDAsCS8qIEZhc3RUcmFrIFMxNTAgU1g0ICovCisKKwlQRENfUkVTRVQJCT0gKDEgPDwgMTEpLCAvKiBIRE1BIHJlc2V0ICovCisKKwlQRENfTUFYX0hETUEJCT0gMzIsCisJUERDX0hETUFfUV9NQVNLCQk9IChQRENfTUFYX0hETUEgLSAxKSwKKworCVBEQ19ESU1NMF9TUERfREVWX0FERFJFU1MgICAgID0gMHg1MCwKKwlQRENfRElNTTFfU1BEX0RFVl9BRERSRVNTICAgICA9IDB4NTEsCisJUERDX01BWF9ESU1NX01PRFVMRSAgICAgICAgICAgPSAweDAyLAorCVBEQ19JMkNfQ09OVFJPTF9PRkZTRVQgICAgICAgID0gMHg0OCwKKwlQRENfSTJDX0FERFJfREFUQV9PRkZTRVQgICAgICA9IDB4NEMsCisJUERDX0RJTU0wX0NPTlRST0xfT0ZGU0VUICAgICAgPSAweDgwLAorCVBEQ19ESU1NMV9DT05UUk9MX09GRlNFVCAgICAgID0gMHg4NCwKKwlQRENfU0RSQU1fQ09OVFJPTF9PRkZTRVQgICAgICA9IDB4ODgsCisJUERDX0kyQ19XUklURSAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorCVBEQ19JMkNfUkVBRCAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDA0MCwJCisJUERDX0kyQ19TVEFSVCAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDgwLAorCVBEQ19JMkNfTUFTS19JTlQgICAgICAgICAgICAgID0gMHgwMDAwMDAyMCwKKwlQRENfSTJDX0NPTVBMRVRFICAgICAgICAgICAgICA9IDB4MDAwMTAwMDAsCisJUERDX0kyQ19OT19BQ0sgICAgICAgICAgICAgICAgPSAweDAwMTAwMDAwLAorCVBEQ19ESU1NX1NQRF9TVUJBRERSRVNTX1NUQVJUID0gMHgwMCwKKwlQRENfRElNTV9TUERfU1VCQUREUkVTU19FTkQgICA9IDB4N0YsCisJUERDX0RJTU1fU1BEX1JPV19OVU0gICAgICAgICAgPSAzLAorCVBEQ19ESU1NX1NQRF9DT0xVTU5fTlVNICAgICAgID0gNCwKKwlQRENfRElNTV9TUERfTU9EVUxFX1JPVyAgICAgICA9IDUsCisJUERDX0RJTU1fU1BEX1RZUEUgICAgICAgICAgICAgPSAxMSwKKwlQRENfRElNTV9TUERfRlJFU0hfUkFURSAgICAgICA9IDEyLCAgICAgICAgIAorCVBEQ19ESU1NX1NQRF9CQU5LX05VTSAgICAgICAgID0gMTcsCQorCVBEQ19ESU1NX1NQRF9DQVNfTEFURU5DWSAgICAgID0gMTgsCisJUERDX0RJTU1fU1BEX0FUVFJJQlVURSAgICAgICAgPSAyMSwgICAgCisJUERDX0RJTU1fU1BEX1JPV19QUkVfQ0hBUkdFICAgPSAyNywKKwlQRENfRElNTV9TUERfUk9XX0FDVElWRV9ERUxBWSA9IDI4LCAgICAgIAorCVBEQ19ESU1NX1NQRF9SQVNfQ0FTX0RFTEFZICAgID0gMjksCisJUERDX0RJTU1fU1BEX0FDVElWRV9QUkVDSEFSR0UgPSAzMCwKKwlQRENfRElNTV9TUERfU1lTVEVNX0ZSRVEgICAgICA9IDEyNiwKKwlQRENfQ1RMX1NUQVRVUwkJICAgICAgPSAweDA4LAkKKwlQRENfRElNTV9XSU5ET1dfQ1RMUgkgICAgICA9IDB4MEMsCisJUERDX1RJTUVfQ09OVFJPTCAgICAgICAgICAgICAgPSAweDNDLAorCVBEQ19USU1FX1BFUklPRCAgICAgICAgICAgICAgID0gMHg0MCwKKwlQRENfVElNRV9DT1VOVEVSICAgICAgICAgICAgICA9IDB4NDQsCisJUERDX0dFTkVSQUxfQ1RMUgkgICAgICA9IDB4NDg0LAorCVBDSV9QTExfSU5JVCAgICAgICAgICAgICAgICAgID0gMHg4QTUzMTgyNCwKKwlQQ0lfWF9UQ09VTlQgICAgICAgICAgICAgICAgICA9IDB4RUUxRTVDRkYKK307CisKKworc3RydWN0IHBkY19wb3J0X3ByaXYgeworCXU4CQkJZGltbV9idWZbKEFUQV9QUkRfU1ogKiBBVEFfTUFYX1BSRCkgKyA1MTJdOworCXU4CQkJKnBrdDsKKwlkbWFfYWRkcl90CQlwa3RfZG1hOworfTsKKworc3RydWN0IHBkY19ob3N0X3ByaXYgeworCXZvaWQJCQkqZGltbV9tbWlvOworCisJdW5zaWduZWQgaW50CQlkb2luZ19oZG1hOworCXVuc2lnbmVkIGludAkJaGRtYV9wcm9kOworCXVuc2lnbmVkIGludAkJaGRtYV9jb25zOworCXN0cnVjdCB7CisJCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisJCXVuc2lnbmVkIGludAlzZXE7CisJCXVuc2lnbmVkIGxvbmcJcGt0X29mczsKKwl9IGhkbWFbMzJdOworfTsKKworCitzdGF0aWMgaW50IHBkY19zYXRhX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgcGRjMjA2MjFfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHBkY19lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIHBkY18yMDYyMV9waHlfcmVzZXQgKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIGludCBwZGNfcG9ydF9zdGFydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIHBkY19wb3J0X3N0b3Aoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgdm9pZCBwZGMyMDYyMV9xY19wcmVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworc3RhdGljIHZvaWQgcGRjX3RmX2xvYWRfbW1pbyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Zik7CitzdGF0aWMgdm9pZCBwZGNfZXhlY19jb21tYW5kX21taW8oc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpOworc3RhdGljIHZvaWQgcGRjMjA2MjFfaG9zdF9zdG9wKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGRjMjA2MjFfZGltbV9pbml0KHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwZSk7CitzdGF0aWMgaW50IHBkYzIwNjIxX2RldGVjdF9kaW1tKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwZSk7CitzdGF0aWMgdW5zaWduZWQgaW50IHBkYzIwNjIxX2kyY19yZWFkKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwZSwgCisJCQkJICAgICAgdTMyIGRldmljZSwgdTMyIHN1YmFkZHIsIHUzMiAqcGRhdGEpOworc3RhdGljIGludCBwZGMyMDYyMV9wcm9nX2RpbW0wKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwZSk7CitzdGF0aWMgdW5zaWduZWQgaW50IHBkYzIwNjIxX3Byb2dfZGltbV9nbG9iYWwoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKTsKKyNpZmRlZiBBVEFfVkVSQk9TRV9ERUJVRworc3RhdGljIHZvaWQgcGRjMjA2MjFfZ2V0X2Zyb21fZGltbShzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcGUsIAorCQkJCSAgIHZvaWQgKnBzb3VyY2UsIHUzMiBvZmZzZXQsIHUzMiBzaXplKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgcGRjMjA2MjFfcHV0X3RvX2RpbW0oc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlLCAKKwkJCQkgdm9pZCAqcHNvdXJjZSwgdTMyIG9mZnNldCwgdTMyIHNpemUpOworc3RhdGljIHZvaWQgcGRjMjA2MjFfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIGludCBwZGMyMDYyMV9xY19pc3N1ZV9wcm90KHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgcGRjX3NhdGFfc2h0ID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSBEUlZfTkFNRSwKKwkuaW9jdGwJCQk9IGF0YV9zY3NpX2lvY3RsLAorCS5xdWV1ZWNvbW1hbmQJCT0gYXRhX3Njc2lfcXVldWVjbWQsCisJLmVoX3N0cmF0ZWd5X2hhbmRsZXIJPSBhdGFfc2NzaV9lcnJvciwKKwkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCisJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAorCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCisJLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKKwkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKKwkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKKwkucHJvY19uYW1lCQk9IERSVl9OQU1FLAorCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKKwkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkub3JkZXJlZF9mbHVzaAkJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHBkY18yMDYyMV9vcHMgPSB7CisJLnBvcnRfZGlzYWJsZQkJPSBhdGFfcG9ydF9kaXNhYmxlLAorCS50Zl9sb2FkCQk9IHBkY190Zl9sb2FkX21taW8sCisJLnRmX3JlYWQJCT0gYXRhX3RmX3JlYWQsCisJLmNoZWNrX3N0YXR1cwkJPSBhdGFfY2hlY2tfc3RhdHVzLAorCS5leGVjX2NvbW1hbmQJCT0gcGRjX2V4ZWNfY29tbWFuZF9tbWlvLAorCS5kZXZfc2VsZWN0CQk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKKwkucGh5X3Jlc2V0CQk9IHBkY18yMDYyMV9waHlfcmVzZXQsCisJLnFjX3ByZXAJCT0gcGRjMjA2MjFfcWNfcHJlcCwKKwkucWNfaXNzdWUJCT0gcGRjMjA2MjFfcWNfaXNzdWVfcHJvdCwKKwkuZW5nX3RpbWVvdXQJCT0gcGRjX2VuZ190aW1lb3V0LAorCS5pcnFfaGFuZGxlcgkJPSBwZGMyMDYyMV9pbnRlcnJ1cHQsCisJLmlycV9jbGVhcgkJPSBwZGMyMDYyMV9pcnFfY2xlYXIsCisJLnBvcnRfc3RhcnQJCT0gcGRjX3BvcnRfc3RhcnQsCisJLnBvcnRfc3RvcAkJPSBwZGNfcG9ydF9zdG9wLAorCS5ob3N0X3N0b3AJCT0gcGRjMjA2MjFfaG9zdF9zdG9wLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIHBkY19wb3J0X2luZm9bXSA9IHsKKwkvKiBib2FyZF8yMDYyMSAqLworCXsKKwkJLnNodAkJPSAmcGRjX3NhdGFfc2h0LAorCQkuaG9zdF9mbGFncwk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1kgfAorCQkJCSAgQVRBX0ZMQUdfU1JTVCB8IEFUQV9GTEFHX01NSU8sCisJCS5waW9fbWFzawk9IDB4MWYsIC8qIHBpbzAtNCAqLworCQkubXdkbWFfbWFzawk9IDB4MDcsIC8qIG13ZG1hMC0yICovCisJCS51ZG1hX21hc2sJPSAweDdmLCAvKiB1ZG1hMC02IDsgRklYTUUgKi8KKwkJLnBvcnRfb3BzCT0gJnBkY18yMDYyMV9vcHMsCisJfSwKKworfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBkY19zYXRhX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfUFJPTUlTRSwgMHg2NjIyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCSAgYm9hcmRfMjA2MjEgfSwKKwl7IH0JLyogdGVybWluYXRlIGxpc3QgKi8KK307CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBkY19zYXRhX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQkJPSBwZGNfc2F0YV9wY2lfdGJsLAorCS5wcm9iZQkJCT0gcGRjX3NhdGFfaW5pdF9vbmUsCisJLnJlbW92ZQkJCT0gYXRhX3BjaV9yZW1vdmVfb25lLAorfTsKKworCitzdGF0aWMgdm9pZCBwZGMyMDYyMV9ob3N0X3N0b3Aoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpCit7CisJc3RydWN0IHBkY19ob3N0X3ByaXYgKmhwcml2ID0gaG9zdF9zZXQtPnByaXZhdGVfZGF0YTsKKwl2b2lkICpkaW1tX21taW8gPSBocHJpdi0+ZGltbV9tbWlvOworCisJaW91bm1hcChkaW1tX21taW8pOworCWtmcmVlKGhwcml2KTsKK30KKworc3RhdGljIGludCBwZGNfcG9ydF9zdGFydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFwLT5ob3N0X3NldC0+ZGV2OworCXN0cnVjdCBwZGNfcG9ydF9wcml2ICpwcDsKKwlpbnQgcmM7CisKKwlyYyA9IGF0YV9wb3J0X3N0YXJ0KGFwKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBwID0ga21hbGxvYyhzaXplb2YoKnBwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJbWVtc2V0KHBwLCAwLCBzaXplb2YoKnBwKSk7CisKKwlwcC0+cGt0ID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgMTI4LCAmcHAtPnBrdF9kbWEsIEdGUF9LRVJORUwpOworCWlmICghcHAtPnBrdCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9rZnJlZTsKKwl9CisKKwlhcC0+cHJpdmF0ZV9kYXRhID0gcHA7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9rZnJlZToKKwlrZnJlZShwcCk7CitlcnJfb3V0OgorCWF0YV9wb3J0X3N0b3AoYXApOworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgdm9pZCBwZGNfcG9ydF9zdG9wKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gYXAtPmhvc3Rfc2V0LT5kZXY7CisJc3RydWN0IHBkY19wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKworCWFwLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgMTI4LCBwcC0+cGt0LCBwcC0+cGt0X2RtYSk7CisJa2ZyZWUocHApOworCWF0YV9wb3J0X3N0b3AoYXApOworfQorCisKK3N0YXRpYyB2b2lkIHBkY18yMDYyMV9waHlfcmVzZXQgKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJVlBSSU5USygiRU5URVJcbiIpOworICAgICAgICBhcC0+Y2JsID0gQVRBX0NCTF9TQVRBOworICAgICAgICBhdGFfcG9ydF9wcm9iZShhcCk7CisgICAgICAgIGF0YV9idXNfcmVzZXQoYXApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGRjMjA2MjFfYXRhX3NnKHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmLCB1OCAqYnVmLAorCQkJCSAgICAJICAgdW5zaWduZWQgaW50IHBvcnRubywKKwkJCQkJICAgdW5zaWduZWQgaW50IHRvdGFsX2xlbikKK3sKKwl1MzIgYWRkcjsKKwl1bnNpZ25lZCBpbnQgZHcgPSBQRENfRElNTV9BUEtUX1BSRCA+PiAyOworCXUzMiAqYnVmMzIgPSAodTMyICopIGJ1ZjsKKworCS8qIG91dHB1dCBBVEEgcGFja2V0IFMvRyB0YWJsZSAqLworCWFkZHIgPSBQRENfMjA2MjFfRElNTV9CQVNFICsgUERDXzIwNjIxX0RJTU1fREFUQSArCisJICAgICAgIChQRENfRElNTV9EQVRBX1NURVAgKiBwb3J0bm8pOworCVZQUklOVEsoIkFUQSBzZyBhZGRyIDB4JXgsICVkXG4iLCBhZGRyLCBhZGRyKTsKKwlidWYzMltkd10gPSBjcHVfdG9fbGUzMihhZGRyKTsKKwlidWYzMltkdyArIDFdID0gY3B1X3RvX2xlMzIodG90YWxfbGVuIHwgQVRBX1BSRF9FT1QpOworCisJVlBSSU5USygiQVRBIFBTRyBAICV4ID09ICgweCV4LCAweCV4KVxuIiwKKwkJUERDXzIwNjIxX0RJTU1fQkFTRSArCisJCSAgICAgICAoUERDX0RJTU1fV0lORE9XX1NURVAgKiBwb3J0bm8pICsKKwkJICAgICAgIFBEQ19ESU1NX0FQS1RfUFJELAorCQlidWYzMltkd10sIGJ1ZjMyW2R3ICsgMV0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGRjMjA2MjFfaG9zdF9zZyhzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiwgdTggKmJ1ZiwKKwkJCQkgICAgCSAgICB1bnNpZ25lZCBpbnQgcG9ydG5vLAorCQkJCQkgICAgdW5zaWduZWQgaW50IHRvdGFsX2xlbikKK3sKKwl1MzIgYWRkcjsKKwl1bnNpZ25lZCBpbnQgZHcgPSBQRENfRElNTV9IUEtUX1BSRCA+PiAyOworCXUzMiAqYnVmMzIgPSAodTMyICopIGJ1ZjsKKworCS8qIG91dHB1dCBIb3N0IERNQSBwYWNrZXQgUy9HIHRhYmxlICovCisJYWRkciA9IFBEQ18yMDYyMV9ESU1NX0JBU0UgKyBQRENfMjA2MjFfRElNTV9EQVRBICsKKwkgICAgICAgKFBEQ19ESU1NX0RBVEFfU1RFUCAqIHBvcnRubyk7CisKKwlidWYzMltkd10gPSBjcHVfdG9fbGUzMihhZGRyKTsKKwlidWYzMltkdyArIDFdID0gY3B1X3RvX2xlMzIodG90YWxfbGVuIHwgQVRBX1BSRF9FT1QpOworCisJVlBSSU5USygiSE9TVCBQU0cgQCAleCA9PSAoMHgleCwgMHgleClcbiIsCisJCVBEQ18yMDYyMV9ESU1NX0JBU0UgKworCQkgICAgICAgKFBEQ19ESU1NX1dJTkRPV19TVEVQICogcG9ydG5vKSArCisJCSAgICAgICBQRENfRElNTV9IUEtUX1BSRCwKKwkJYnVmMzJbZHddLCBidWYzMltkdyArIDFdKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcGRjMjA2MjFfYXRhX3BrdChzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiwKKwkJCQkJICAgIHVuc2lnbmVkIGludCBkZXZubywgdTggKmJ1ZiwKKwkJCQkJICAgIHVuc2lnbmVkIGludCBwb3J0bm8pCit7CisJdW5zaWduZWQgaW50IGksIGR3OworCXUzMiAqYnVmMzIgPSAodTMyICopIGJ1ZjsKKwl1OCBkZXZfcmVnOworCisJdW5zaWduZWQgaW50IGRpbW1fc2cgPSBQRENfMjA2MjFfRElNTV9CQVNFICsKKwkJCSAgICAgICAoUERDX0RJTU1fV0lORE9XX1NURVAgKiBwb3J0bm8pICsKKwkJCSAgICAgICBQRENfRElNTV9BUEtUX1BSRDsKKwlWUFJJTlRLKCJFTlRFUiwgZGltbV9zZyA9PSAweCV4LCAlZFxuIiwgZGltbV9zZywgZGltbV9zZyk7CisKKwlpID0gUERDX0RJTU1fQVRBX1BLVDsKKworCS8qCisJICogU2V0IHVwIEFUQSBwYWNrZXQKKwkgKi8KKwlpZiAoKHRmLT5wcm90b2NvbCA9PSBBVEFfUFJPVF9ETUEpICYmICghKHRmLT5mbGFncyAmIEFUQV9URkxBR19XUklURSkpKQorCQlidWZbaSsrXSA9IFBEQ19QS1RfUkVBRDsKKwllbHNlIGlmICh0Zi0+cHJvdG9jb2wgPT0gQVRBX1BST1RfTk9EQVRBKQorCQlidWZbaSsrXSA9IFBEQ19QS1RfTk9EQVRBOworCWVsc2UKKwkJYnVmW2krK10gPSAwOworCWJ1ZltpKytdID0gMDsJCQkvKiByZXNlcnZlZCAqLworCWJ1ZltpKytdID0gcG9ydG5vICsgMTsJCS8qIHNlcS4gaWQgKi8KKwlidWZbaSsrXSA9IDB4ZmY7CQkvKiBkZWxheSBzZXEuIGlkICovCisKKwkvKiBkaW1tIGRtYSBTL0csIGFuZCBuZXh0LXBrdCAqLworCWR3ID0gaSA+PiAyOworCWlmICh0Zi0+cHJvdG9jb2wgPT0gQVRBX1BST1RfTk9EQVRBKQorCQlidWYzMltkd10gPSAwOworCWVsc2UKKwkJYnVmMzJbZHddID0gY3B1X3RvX2xlMzIoZGltbV9zZyk7CisJYnVmMzJbZHcgKyAxXSA9IDA7CisJaSArPSA4OworCisJaWYgKGRldm5vID09IDApCisJCWRldl9yZWcgPSBBVEFfREVWSUNFX09CUzsKKwllbHNlCisJCWRldl9yZWcgPSBBVEFfREVWSUNFX09CUyB8IEFUQV9ERVYxOworCisJLyogc2VsZWN0IGRldmljZSAqLworCWJ1ZltpKytdID0gKDEgPDwgNSkgfCBQRENfUEtUX0NMRUFSX0JTWSB8IEFUQV9SRUdfREVWSUNFOworCWJ1ZltpKytdID0gZGV2X3JlZzsKKworCS8qIGRldmljZSBjb250cm9sIHJlZ2lzdGVyICovCisJYnVmW2krK10gPSAoMSA8PCA1KSB8IFBEQ19SRUdfREVWQ1RMOworCWJ1ZltpKytdID0gdGYtPmN0bDsKKworCXJldHVybiBpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGRjMjA2MjFfaG9zdF9wa3Qoc3RydWN0IGF0YV90YXNrZmlsZSAqdGYsIHU4ICpidWYsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgcG9ydG5vKQoreworCXVuc2lnbmVkIGludCBkdzsKKwl1MzIgdG1wLCAqYnVmMzIgPSAodTMyICopIGJ1ZjsKKworCXVuc2lnbmVkIGludCBob3N0X3NnID0gUERDXzIwNjIxX0RJTU1fQkFTRSArCisJCQkgICAgICAgKFBEQ19ESU1NX1dJTkRPV19TVEVQICogcG9ydG5vKSArCisJCQkgICAgICAgUERDX0RJTU1fSE9TVF9QUkQ7CisJdW5zaWduZWQgaW50IGRpbW1fc2cgPSBQRENfMjA2MjFfRElNTV9CQVNFICsKKwkJCSAgICAgICAoUERDX0RJTU1fV0lORE9XX1NURVAgKiBwb3J0bm8pICsKKwkJCSAgICAgICBQRENfRElNTV9IUEtUX1BSRDsKKwlWUFJJTlRLKCJFTlRFUiwgZGltbV9zZyA9PSAweCV4LCAlZFxuIiwgZGltbV9zZywgZGltbV9zZyk7CisJVlBSSU5USygiaG9zdF9zZyA9PSAweCV4LCAlZFxuIiwgaG9zdF9zZywgaG9zdF9zZyk7CisKKwlkdyA9IFBEQ19ESU1NX0hPU1RfUEtUID4+IDI7CisKKwkvKgorCSAqIFNldCB1cCBIb3N0IERNQSBwYWNrZXQKKwkgKi8KKwlpZiAoKHRmLT5wcm90b2NvbCA9PSBBVEFfUFJPVF9ETUEpICYmICghKHRmLT5mbGFncyAmIEFUQV9URkxBR19XUklURSkpKQorCQl0bXAgPSBQRENfUEtUX1JFQUQ7CisJZWxzZQorCQl0bXAgPSAwOworCXRtcCB8PSAoKHBvcnRubyArIDEgKyA0KSA8PCAxNik7CS8qIHNlcS4gaWQgKi8KKwl0bXAgfD0gKDB4ZmYgPDwgMjQpOwkJCS8qIGRlbGF5IHNlcS4gaWQgKi8KKwlidWYzMltkdyArIDBdID0gY3B1X3RvX2xlMzIodG1wKTsKKwlidWYzMltkdyArIDFdID0gY3B1X3RvX2xlMzIoaG9zdF9zZyk7CisJYnVmMzJbZHcgKyAyXSA9IGNwdV90b19sZTMyKGRpbW1fc2cpOworCWJ1ZjMyW2R3ICsgM10gPSAwOworCisJVlBSSU5USygiSE9TVCBQS1QgQCAleCA9PSAoMHgleCAweCV4IDB4JXggMHgleClcbiIsCisJCVBEQ18yMDYyMV9ESU1NX0JBU0UgKyAoUERDX0RJTU1fV0lORE9XX1NURVAgKiBwb3J0bm8pICsKKwkJCVBEQ19ESU1NX0hPU1RfUEtULAorCQlidWYzMltkdyArIDBdLAorCQlidWYzMltkdyArIDFdLAorCQlidWYzMltkdyArIDJdLAorCQlidWYzMltkdyArIDNdKTsKK30KKworc3RhdGljIHZvaWQgcGRjMjA2MjFfZG1hX3ByZXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gcWMtPnNnOworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJc3RydWN0IHBkY19wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKwl2b2lkICptbWlvID0gYXAtPmhvc3Rfc2V0LT5tbWlvX2Jhc2U7CisJc3RydWN0IHBkY19ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3Rfc2V0LT5wcml2YXRlX2RhdGE7CisJdm9pZCAqZGltbV9tbWlvID0gaHByaXYtPmRpbW1fbW1pbzsKKwl1bnNpZ25lZCBpbnQgcG9ydG5vID0gYXAtPnBvcnRfbm87CisJdW5zaWduZWQgaW50IGksIGxhc3QsIGlkeCwgdG90YWxfbGVuID0gMCwgc2d0X2xlbjsKKwl1MzIgKmJ1ZiA9ICh1MzIgKikgJnBwLT5kaW1tX2J1ZltQRENfRElNTV9IRUFERVJfU1pdOworCisJYXNzZXJ0KHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRE1BTUFQKTsKKworCVZQUklOVEsoImF0YSV1OiBFTlRFUlxuIiwgYXAtPmlkKTsKKworCS8qIGhhcmQtY29kZSBjaGlwICMwICovCisJbW1pbyArPSBQRENfQ0hJUDBfT0ZTOworCisJLyoKKwkgKiBCdWlsZCBTL0cgdGFibGUKKwkgKi8KKwlsYXN0ID0gcWMtPm5fZWxlbTsKKwlpZHggPSAwOworCWZvciAoaSA9IDA7IGkgPCBsYXN0OyBpKyspIHsKKwkJYnVmW2lkeCsrXSA9IGNwdV90b19sZTMyKHNnX2RtYV9hZGRyZXNzKCZzZ1tpXSkpOworCQlidWZbaWR4KytdID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbigmc2dbaV0pKTsKKwkJdG90YWxfbGVuICs9IHNnW2ldLmxlbmd0aDsKKwl9CisJYnVmW2lkeCAtIDFdIHw9IGNwdV90b19sZTMyKEFUQV9QUkRfRU9UKTsKKwlzZ3RfbGVuID0gaWR4ICogNDsKKworCS8qCisJICogQnVpbGQgQVRBLCBob3N0IERNQSBwYWNrZXRzCisJICovCisJcGRjMjA2MjFfaG9zdF9zZygmcWMtPnRmLCAmcHAtPmRpbW1fYnVmWzBdLCBwb3J0bm8sIHRvdGFsX2xlbik7CisJcGRjMjA2MjFfaG9zdF9wa3QoJnFjLT50ZiwgJnBwLT5kaW1tX2J1ZlswXSwgcG9ydG5vKTsKKworCXBkYzIwNjIxX2F0YV9zZygmcWMtPnRmLCAmcHAtPmRpbW1fYnVmWzBdLCBwb3J0bm8sIHRvdGFsX2xlbik7CisJaSA9IHBkYzIwNjIxX2F0YV9wa3QoJnFjLT50ZiwgcWMtPmRldi0+ZGV2bm8sICZwcC0+ZGltbV9idWZbMF0sIHBvcnRubyk7CisKKwlpZiAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX0xCQTQ4KQorCQlpID0gcGRjX3ByZXBfbGJhNDgoJnFjLT50ZiwgJnBwLT5kaW1tX2J1ZlswXSwgaSk7CisJZWxzZQorCQlpID0gcGRjX3ByZXBfbGJhMjgoJnFjLT50ZiwgJnBwLT5kaW1tX2J1ZlswXSwgaSk7CisKKwlwZGNfcGt0X2Zvb3RlcigmcWMtPnRmLCAmcHAtPmRpbW1fYnVmWzBdLCBpKTsKKworCS8qIGNvcHkgdGhyZWUgUy9HIHRhYmxlcyBhbmQgdHdvIHBhY2tldHMgdG8gRElNTSBNTUlPIHdpbmRvdyAqLworCW1lbWNweV90b2lvKGRpbW1fbW1pbyArIChwb3J0bm8gKiBQRENfRElNTV9XSU5ET1dfU1RFUCksCisJCSAgICAmcHAtPmRpbW1fYnVmLCBQRENfRElNTV9IRUFERVJfU1opOworCW1lbWNweV90b2lvKGRpbW1fbW1pbyArIChwb3J0bm8gKiBQRENfRElNTV9XSU5ET1dfU1RFUCkgKworCQkgICAgUERDX0RJTU1fSE9TVF9QUkQsCisJCSAgICAmcHAtPmRpbW1fYnVmW1BEQ19ESU1NX0hFQURFUl9TWl0sIHNndF9sZW4pOworCisJLyogZm9yY2UgaG9zdCBGSUZPIGR1bXAgKi8KKwl3cml0ZWwoMHgwMDAwMDAwMSwgbW1pbyArIFBEQ18yMDYyMV9HRU5FUkFMX0NUTCk7CisKKwlyZWFkbChkaW1tX21taW8pOwkvKiBNTUlPIFBDSSBwb3N0aW5nIGZsdXNoICovCisKKwlWUFJJTlRLKCJhdGEgcGt0IGJ1ZiBvZnMgJXUsIHByZCBzaXplICV1LCBtbWlvIGNvcGllZFxuIiwgaSwgc2d0X2xlbik7Cit9CisKK3N0YXRpYyB2b2lkIHBkYzIwNjIxX25vZGF0YV9wcmVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwlzdHJ1Y3QgcGRjX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOworCXZvaWQgKm1taW8gPSBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZTsKKwlzdHJ1Y3QgcGRjX2hvc3RfcHJpdiAqaHByaXYgPSBhcC0+aG9zdF9zZXQtPnByaXZhdGVfZGF0YTsKKwl2b2lkICpkaW1tX21taW8gPSBocHJpdi0+ZGltbV9tbWlvOworCXVuc2lnbmVkIGludCBwb3J0bm8gPSBhcC0+cG9ydF9ubzsKKwl1bnNpZ25lZCBpbnQgaTsKKworCVZQUklOVEsoImF0YSV1OiBFTlRFUlxuIiwgYXAtPmlkKTsKKworCS8qIGhhcmQtY29kZSBjaGlwICMwICovCisJbW1pbyArPSBQRENfQ0hJUDBfT0ZTOworCisJaSA9IHBkYzIwNjIxX2F0YV9wa3QoJnFjLT50ZiwgcWMtPmRldi0+ZGV2bm8sICZwcC0+ZGltbV9idWZbMF0sIHBvcnRubyk7CisKKwlpZiAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX0xCQTQ4KQorCQlpID0gcGRjX3ByZXBfbGJhNDgoJnFjLT50ZiwgJnBwLT5kaW1tX2J1ZlswXSwgaSk7CisJZWxzZQorCQlpID0gcGRjX3ByZXBfbGJhMjgoJnFjLT50ZiwgJnBwLT5kaW1tX2J1ZlswXSwgaSk7CisKKwlwZGNfcGt0X2Zvb3RlcigmcWMtPnRmLCAmcHAtPmRpbW1fYnVmWzBdLCBpKTsKKworCS8qIGNvcHkgdGhyZWUgUy9HIHRhYmxlcyBhbmQgdHdvIHBhY2tldHMgdG8gRElNTSBNTUlPIHdpbmRvdyAqLworCW1lbWNweV90b2lvKGRpbW1fbW1pbyArIChwb3J0bm8gKiBQRENfRElNTV9XSU5ET1dfU1RFUCksCisJCSAgICAmcHAtPmRpbW1fYnVmLCBQRENfRElNTV9IRUFERVJfU1opOworCisJLyogZm9yY2UgaG9zdCBGSUZPIGR1bXAgKi8KKwl3cml0ZWwoMHgwMDAwMDAwMSwgbW1pbyArIFBEQ18yMDYyMV9HRU5FUkFMX0NUTCk7CisKKwlyZWFkbChkaW1tX21taW8pOwkvKiBNTUlPIFBDSSBwb3N0aW5nIGZsdXNoICovCisKKwlWUFJJTlRLKCJhdGEgcGt0IGJ1ZiBvZnMgJXUsIG1taW8gY29waWVkXG4iLCBpKTsKK30KKworc3RhdGljIHZvaWQgcGRjMjA2MjFfcWNfcHJlcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN3aXRjaCAocWMtPnRmLnByb3RvY29sKSB7CisJY2FzZSBBVEFfUFJPVF9ETUE6CisJCXBkYzIwNjIxX2RtYV9wcmVwKHFjKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfUFJPVF9OT0RBVEE6CisJCXBkYzIwNjIxX25vZGF0YV9wcmVwKHFjKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX3BkYzIwNjIxX3B1c2hfaGRtYShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLAorCQkJCSB1bnNpZ25lZCBpbnQgc2VxLAorCQkJCSB1MzIgcGt0X29mcykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0ID0gYXAtPmhvc3Rfc2V0OworCXZvaWQgKm1taW8gPSBob3N0X3NldC0+bW1pb19iYXNlOworCisJLyogaGFyZC1jb2RlIGNoaXAgIzAgKi8KKwltbWlvICs9IFBEQ19DSElQMF9PRlM7CisKKwl3cml0ZWwoMHgwMDAwMDAwMSwgbW1pbyArIFBEQ18yMDYyMV9TRVFDVEwgKyAoc2VxICogNCkpOworCXJlYWRsKG1taW8gKyBQRENfMjA2MjFfU0VRQ1RMICsgKHNlcSAqIDQpKTsJLyogZmx1c2ggKi8KKworCXdyaXRlbChwa3Rfb2ZzLCBtbWlvICsgUERDX0hETUFfUEtUX1NVQk1JVCk7CisJcmVhZGwobW1pbyArIFBEQ19IRE1BX1BLVF9TVUJNSVQpOwkvKiBmbHVzaCAqLworfQorCitzdGF0aWMgdm9pZCBwZGMyMDYyMV9wdXNoX2hkbWEoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywKKwkJCQl1bnNpZ25lZCBpbnQgc2VxLAorCQkJCXUzMiBwa3Rfb2ZzKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJc3RydWN0IHBkY19ob3N0X3ByaXYgKnBwID0gYXAtPmhvc3Rfc2V0LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IGlkeCA9IHBwLT5oZG1hX3Byb2QgJiBQRENfSERNQV9RX01BU0s7CisKKwlpZiAoIXBwLT5kb2luZ19oZG1hKSB7CisJCV9fcGRjMjA2MjFfcHVzaF9oZG1hKHFjLCBzZXEsIHBrdF9vZnMpOworCQlwcC0+ZG9pbmdfaGRtYSA9IDE7CisJCXJldHVybjsKKwl9CisKKwlwcC0+aGRtYVtpZHhdLnFjID0gcWM7CisJcHAtPmhkbWFbaWR4XS5zZXEgPSBzZXE7CisJcHAtPmhkbWFbaWR4XS5wa3Rfb2ZzID0gcGt0X29mczsKKwlwcC0+aGRtYV9wcm9kKys7Cit9CisKK3N0YXRpYyB2b2lkIHBkYzIwNjIxX3BvcF9oZG1hKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwlzdHJ1Y3QgcGRjX2hvc3RfcHJpdiAqcHAgPSBhcC0+aG9zdF9zZXQtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gcHAtPmhkbWFfY29ucyAmIFBEQ19IRE1BX1FfTUFTSzsKKworCS8qIGlmIG5vdGhpbmcgb24gcXVldWUsIHdlJ3JlIGRvbmUgKi8KKwlpZiAocHAtPmhkbWFfcHJvZCA9PSBwcC0+aGRtYV9jb25zKSB7CisJCXBwLT5kb2luZ19oZG1hID0gMDsKKwkJcmV0dXJuOworCX0KKworCV9fcGRjMjA2MjFfcHVzaF9oZG1hKHBwLT5oZG1hW2lkeF0ucWMsIHBwLT5oZG1hW2lkeF0uc2VxLAorCQkJICAgICBwcC0+aGRtYVtpZHhdLnBrdF9vZnMpOworCXBwLT5oZG1hX2NvbnMrKzsKK30KKworI2lmZGVmIEFUQV9WRVJCT1NFX0RFQlVHCitzdGF0aWMgdm9pZCBwZGMyMDYyMV9kdW1wX2hkbWEoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXVuc2lnbmVkIGludCBwb3J0X25vID0gYXAtPnBvcnRfbm87CisJc3RydWN0IHBkY19ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3Rfc2V0LT5wcml2YXRlX2RhdGE7CisJdm9pZCAqZGltbV9tbWlvID0gaHByaXYtPmRpbW1fbW1pbzsKKworCWRpbW1fbW1pbyArPSAocG9ydF9ubyAqIFBEQ19ESU1NX1dJTkRPV19TVEVQKTsKKwlkaW1tX21taW8gKz0gUERDX0RJTU1fSE9TVF9QS1Q7CisKKwlwcmludGsoS0VSTl9FUlIgIkhETUFbMF0gPT0gMHglMDhYXG4iLCByZWFkbChkaW1tX21taW8pKTsKKwlwcmludGsoS0VSTl9FUlIgIkhETUFbMV0gPT0gMHglMDhYXG4iLCByZWFkbChkaW1tX21taW8gKyA0KSk7CisJcHJpbnRrKEtFUk5fRVJSICJIRE1BWzJdID09IDB4JTA4WFxuIiwgcmVhZGwoZGltbV9tbWlvICsgOCkpOworCXByaW50ayhLRVJOX0VSUiAiSERNQVszXSA9PSAweCUwOFhcbiIsIHJlYWRsKGRpbW1fbW1pbyArIDEyKSk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHBkYzIwNjIxX2R1bXBfaGRtYShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKSB7IH0KKyNlbmRpZiAvKiBBVEFfVkVSQk9TRV9ERUJVRyAqLworCitzdGF0aWMgdm9pZCBwZGMyMDYyMV9wYWNrZXRfc3RhcnQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0ID0gYXAtPmhvc3Rfc2V0OworCXVuc2lnbmVkIGludCBwb3J0X25vID0gYXAtPnBvcnRfbm87CisJdm9pZCAqbW1pbyA9IGhvc3Rfc2V0LT5tbWlvX2Jhc2U7CisJdW5zaWduZWQgaW50IHJ3ID0gKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSk7CisJdTggc2VxID0gKHU4KSAocG9ydF9ubyArIDEpOworCXVuc2lnbmVkIGludCBwb3J0X29mczsKKworCS8qIGhhcmQtY29kZSBjaGlwICMwICovCisJbW1pbyArPSBQRENfQ0hJUDBfT0ZTOworCisJVlBSSU5USygiYXRhJXU6IEVOVEVSXG4iLCBhcC0+aWQpOworCisJd21iKCk7CQkJLyogZmx1c2ggUFJELCBwa3Qgd3JpdGVzICovCisKKwlwb3J0X29mcyA9IFBEQ18yMDYyMV9ESU1NX0JBU0UgKyAoUERDX0RJTU1fV0lORE9XX1NURVAgKiBwb3J0X25vKTsKKworCS8qIGlmIHdyaXRpbmcsIHdlICgxKSBETUEgdG8gRElNTSwgdGhlbiAoMikgZG8gQVRBIGNvbW1hbmQgKi8KKwlpZiAocncgJiYgcWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX0RNQSkgeworCQlzZXEgKz0gNDsKKworCQlwZGMyMDYyMV9kdW1wX2hkbWEocWMpOworCQlwZGMyMDYyMV9wdXNoX2hkbWEocWMsIHNlcSwgcG9ydF9vZnMgKyBQRENfRElNTV9IT1NUX1BLVCk7CisJCVZQUklOVEsoInF1ZXVlZCBvZnMgMHgleCAoJXUpLCBzZXEgJXVcbiIsCisJCQlwb3J0X29mcyArIFBEQ19ESU1NX0hPU1RfUEtULAorCQkJcG9ydF9vZnMgKyBQRENfRElNTV9IT1NUX1BLVCwKKwkJCXNlcSk7CisJfSBlbHNlIHsKKwkJd3JpdGVsKDB4MDAwMDAwMDEsIG1taW8gKyBQRENfMjA2MjFfU0VRQ1RMICsgKHNlcSAqIDQpKTsKKwkJcmVhZGwobW1pbyArIFBEQ18yMDYyMV9TRVFDVEwgKyAoc2VxICogNCkpOwkvKiBmbHVzaCAqLworCisJCXdyaXRlbChwb3J0X29mcyArIFBEQ19ESU1NX0FUQV9QS1QsCisJCSAgICAgICAodm9pZCAqKSBhcC0+aW9hZGRyLmNtZF9hZGRyICsgUERDX1BLVF9TVUJNSVQpOworCQlyZWFkbCgodm9pZCAqKSBhcC0+aW9hZGRyLmNtZF9hZGRyICsgUERDX1BLVF9TVUJNSVQpOworCQlWUFJJTlRLKCJzdWJtaXR0ZWQgb2ZzIDB4JXggKCV1KSwgc2VxICV1XG4iLAorCQkJcG9ydF9vZnMgKyBQRENfRElNTV9BVEFfUEtULAorCQkJcG9ydF9vZnMgKyBQRENfRElNTV9BVEFfUEtULAorCQkJc2VxKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGRjMjA2MjFfcWNfaXNzdWVfcHJvdChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN3aXRjaCAocWMtPnRmLnByb3RvY29sKSB7CisJY2FzZSBBVEFfUFJPVF9ETUE6CisJY2FzZSBBVEFfUFJPVF9OT0RBVEE6CisJCXBkYzIwNjIxX3BhY2tldF9zdGFydChxYyk7CisJCXJldHVybiAwOworCisJY2FzZSBBVEFfUFJPVF9BVEFQSV9ETUE6CisJCUJVRygpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBhdGFfcWNfaXNzdWVfcHJvdChxYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBkYzIwNjIxX2hvc3RfaW50ciggc3RydWN0IGF0YV9wb3J0ICphcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsCisJCQkJCSAgdW5zaWduZWQgaW50IGRvaW5nX2hkbWEsCisJCQkJCSAgdm9pZCAqbW1pbykKK3sKKwl1bnNpZ25lZCBpbnQgcG9ydF9ubyA9IGFwLT5wb3J0X25vOworCXVuc2lnbmVkIGludCBwb3J0X29mcyA9CisJCVBEQ18yMDYyMV9ESU1NX0JBU0UgKyAoUERDX0RJTU1fV0lORE9XX1NURVAgKiBwb3J0X25vKTsKKwl1OCBzdGF0dXM7CisJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAwOworCisJVlBSSU5USygiRU5URVJcbiIpOworCisJaWYgKChxYy0+dGYucHJvdG9jb2wgPT0gQVRBX1BST1RfRE1BKSAmJgkvKiByZWFkICovCisJICAgICghKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSkpKSB7CisKKwkJLyogc3RlcCB0d28gLSBETUEgZnJvbSBESU1NIHRvIGhvc3QgKi8KKwkJaWYgKGRvaW5nX2hkbWEpIHsKKwkJCVZQUklOVEsoImF0YSV1OiByZWFkIGhkbWEsIDB4JXggMHgleFxuIiwgYXAtPmlkLAorCQkJCXJlYWRsKG1taW8gKyAweDEwNCksIHJlYWRsKG1taW8gKyBQRENfSERNQV9DVExTVEFUKSk7CisJCQkvKiBnZXQgZHJpdmUgc3RhdHVzOyBjbGVhciBpbnRyOyBjb21wbGV0ZSB0eG4gKi8KKwkJCWF0YV9xY19jb21wbGV0ZShxYywgYXRhX3dhaXRfaWRsZShhcCkpOworCQkJcGRjMjA2MjFfcG9wX2hkbWEocWMpOworCQl9CisKKwkJLyogc3RlcCBvbmUgLSBleGVjIEFUQSBjb21tYW5kICovCisJCWVsc2UgeworCQkJdTggc2VxID0gKHU4KSAocG9ydF9ubyArIDEgKyA0KTsKKwkJCVZQUklOVEsoImF0YSV1OiByZWFkIGF0YSwgMHgleCAweCV4XG4iLCBhcC0+aWQsCisJCQkJcmVhZGwobW1pbyArIDB4MTA0KSwgcmVhZGwobW1pbyArIFBEQ19IRE1BX0NUTFNUQVQpKTsKKworCQkJLyogc3VibWl0IGhkbWEgcGt0ICovCisJCQlwZGMyMDYyMV9kdW1wX2hkbWEocWMpOworCQkJcGRjMjA2MjFfcHVzaF9oZG1hKHFjLCBzZXEsCisJCQkJCSAgIHBvcnRfb2ZzICsgUERDX0RJTU1fSE9TVF9QS1QpOworCQl9CisJCWhhbmRsZWQgPSAxOworCisJfSBlbHNlIGlmIChxYy0+dGYucHJvdG9jb2wgPT0gQVRBX1BST1RfRE1BKSB7CS8qIHdyaXRlICovCisKKwkJLyogc3RlcCBvbmUgLSBETUEgZnJvbSBob3N0IHRvIERJTU0gKi8KKwkJaWYgKGRvaW5nX2hkbWEpIHsKKwkJCXU4IHNlcSA9ICh1OCkgKHBvcnRfbm8gKyAxKTsKKwkJCVZQUklOVEsoImF0YSV1OiB3cml0ZSBoZG1hLCAweCV4IDB4JXhcbiIsIGFwLT5pZCwKKwkJCQlyZWFkbChtbWlvICsgMHgxMDQpLCByZWFkbChtbWlvICsgUERDX0hETUFfQ1RMU1RBVCkpOworCisJCQkvKiBzdWJtaXQgYXRhIHBrdCAqLworCQkJd3JpdGVsKDB4MDAwMDAwMDEsIG1taW8gKyBQRENfMjA2MjFfU0VRQ1RMICsgKHNlcSAqIDQpKTsKKwkJCXJlYWRsKG1taW8gKyBQRENfMjA2MjFfU0VRQ1RMICsgKHNlcSAqIDQpKTsKKwkJCXdyaXRlbChwb3J0X29mcyArIFBEQ19ESU1NX0FUQV9QS1QsCisJCQkgICAgICAgKHZvaWQgKikgYXAtPmlvYWRkci5jbWRfYWRkciArIFBEQ19QS1RfU1VCTUlUKTsKKwkJCXJlYWRsKCh2b2lkICopIGFwLT5pb2FkZHIuY21kX2FkZHIgKyBQRENfUEtUX1NVQk1JVCk7CisJCX0KKworCQkvKiBzdGVwIHR3byAtIGV4ZWN1dGUgQVRBIGNvbW1hbmQgKi8KKwkJZWxzZSB7CisJCQlWUFJJTlRLKCJhdGEldTogd3JpdGUgYXRhLCAweCV4IDB4JXhcbiIsIGFwLT5pZCwKKwkJCQlyZWFkbChtbWlvICsgMHgxMDQpLCByZWFkbChtbWlvICsgUERDX0hETUFfQ1RMU1RBVCkpOworCQkJLyogZ2V0IGRyaXZlIHN0YXR1czsgY2xlYXIgaW50cjsgY29tcGxldGUgdHhuICovCisJCQlhdGFfcWNfY29tcGxldGUocWMsIGF0YV93YWl0X2lkbGUoYXApKTsKKwkJCXBkYzIwNjIxX3BvcF9oZG1hKHFjKTsKKwkJfQorCQloYW5kbGVkID0gMTsKKworCS8qIGNvbW1hbmQgY29tcGxldGlvbiwgYnV0IG5vIGRhdGEgeGZlciAqLworCX0gZWxzZSBpZiAocWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX05PREFUQSkgeworCisJCXN0YXR1cyA9IGF0YV9idXN5X3dhaXQoYXAsIEFUQV9CVVNZIHwgQVRBX0RSUSwgMTAwMCk7CisJCURQUklOVEsoIkJVU19OT0RBVEEgKGRydl9zdGF0IDB4JVgpXG4iLCBzdGF0dXMpOworCQlhdGFfcWNfY29tcGxldGUocWMsIHN0YXR1cyk7CisJCWhhbmRsZWQgPSAxOworCisJfSBlbHNlIHsKKwkJYXAtPnN0YXRzLmlkbGVfaXJxKys7CisJfQorCisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKK3N0YXRpYyB2b2lkIHBkYzIwNjIxX2lycV9jbGVhcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0ID0gYXAtPmhvc3Rfc2V0OworCXZvaWQgKm1taW8gPSBob3N0X3NldC0+bW1pb19iYXNlOworCisJbW1pbyArPSBQRENfQ0hJUDBfT0ZTOworCisJcmVhZGwobW1pbyArIFBEQ18yMDYyMV9TRVFNQVNLKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHBkYzIwNjIxX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCA9IGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwOworCXUzMiBtYXNrID0gMDsKKwl1bnNpZ25lZCBpbnQgaSwgdG1wLCBwb3J0X25vOworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKKwl2b2lkICptbWlvX2Jhc2U7CisKKwlWUFJJTlRLKCJFTlRFUlxuIik7CisKKwlpZiAoIWhvc3Rfc2V0IHx8ICFob3N0X3NldC0+bW1pb19iYXNlKSB7CisJCVZQUklOVEsoIlFVSUNLIEVYSVRcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJbW1pb19iYXNlID0gaG9zdF9zZXQtPm1taW9fYmFzZTsKKworCS8qIHJlYWRpbmcgc2hvdWxkIGFsc28gY2xlYXIgaW50ZXJydXB0cyAqLworCW1taW9fYmFzZSArPSBQRENfQ0hJUDBfT0ZTOworCW1hc2sgPSByZWFkbChtbWlvX2Jhc2UgKyBQRENfMjA2MjFfU0VRTUFTSyk7CisJVlBSSU5USygibWFzayA9PSAweCV4XG4iLCBtYXNrKTsKKworCWlmIChtYXNrID09IDB4ZmZmZmZmZmYpIHsKKwkJVlBSSU5USygiUVVJQ0sgRVhJVCAyXG4iKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwltYXNrICY9IDB4ZmZmZjsJCS8qIG9ubHkgMTYgdGFncyBwb3NzaWJsZSAqLworCWlmICghbWFzaykgeworCQlWUFJJTlRLKCJRVUlDSyBFWElUIDNcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisgICAgICAgIHNwaW5fbG9jaygmaG9zdF9zZXQtPmxvY2spOworCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCA5OyBpKyspIHsKKwkJcG9ydF9ubyA9IGkgLSAxOworCQlpZiAocG9ydF9ubyA+IDMpCisJCQlwb3J0X25vIC09IDQ7CisJCWlmIChwb3J0X25vID49IGhvc3Rfc2V0LT5uX3BvcnRzKQorCQkJYXAgPSBOVUxMOworCQllbHNlCisJCQlhcCA9IGhvc3Rfc2V0LT5wb3J0c1twb3J0X25vXTsKKwkJdG1wID0gbWFzayAmICgxIDw8IGkpOworCQlWUFJJTlRLKCJzZXEgJXUsIHBvcnRfbm8gJXUsIGFwICVwLCB0bXAgJXhcbiIsIGksIHBvcnRfbm8sIGFwLCB0bXApOworCQlpZiAodG1wICYmIGFwICYmICghKGFwLT5mbGFncyAmIEFUQV9GTEFHX1BPUlRfRElTQUJMRUQpKSkgeworCQkJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKKworCQkJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKKwkJCWlmIChxYyAmJiAoIShxYy0+dGYuY3RsICYgQVRBX05JRU4pKSkKKwkJCQloYW5kbGVkICs9IHBkYzIwNjIxX2hvc3RfaW50cihhcCwgcWMsIChpID4gNCksCisJCQkJCQkJICAgICAgbW1pb19iYXNlKTsKKwkJfQorCX0KKworICAgICAgICBzcGluX3VubG9jaygmaG9zdF9zZXQtPmxvY2spOworCisJVlBSSU5USygibWFzayA9PSAweCV4XG4iLCBtYXNrKTsKKworCVZQUklOVEsoIkVYSVRcbiIpOworCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHBkY19lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXU4IGRydl9zdGF0OworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisKKwlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOworCWlmICghcWMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhdGEldTogQlVHOiB0aW1lb3V0IHdpdGhvdXQgY29tbWFuZFxuIiwKKwkJICAgICAgIGFwLT5pZCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGhhY2sgYWxlcnQhICBXZSBjYW5ub3QgdXNlIHRoZSBzdXBwbGllZCBjb21wbGV0aW9uCisJICogZnVuY3Rpb24gZnJvbSBpbnNpZGUgdGhlIC0+ZWhfc3RyYXRlZ3lfaGFuZGxlcigpIHRocmVhZC4KKwkgKiBsaWJhdGEgaXMgdGhlIG9ubHkgdXNlciBvZiAtPmVoX3N0cmF0ZWd5X2hhbmRsZXIoKSBpbgorCSAqIGFueSBrZXJuZWwsIHNvIHRoZSBkZWZhdWx0IHNjc2lfZG9uZSgpIGFzc3VtZXMgaXQgaXMKKwkgKiBub3QgYmVpbmcgY2FsbGVkIGZyb20gdGhlIFNDU0kgRUguCisJICovCisJcWMtPnNjc2lkb25lID0gc2NzaV9maW5pc2hfY29tbWFuZDsKKworCXN3aXRjaCAocWMtPnRmLnByb3RvY29sKSB7CisJY2FzZSBBVEFfUFJPVF9ETUE6CisJY2FzZSBBVEFfUFJPVF9OT0RBVEE6CisJCXByaW50ayhLRVJOX0VSUiAiYXRhJXU6IGNvbW1hbmQgdGltZW91dFxuIiwgYXAtPmlkKTsKKwkJYXRhX3FjX2NvbXBsZXRlKHFjLCBhdGFfd2FpdF9pZGxlKGFwKSB8IEFUQV9FUlIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRydl9zdGF0ID0gYXRhX2J1c3lfd2FpdChhcCwgQVRBX0JVU1kgfCBBVEFfRFJRLCAxMDAwKTsKKworCQlwcmludGsoS0VSTl9FUlIgImF0YSV1OiB1bmtub3duIHRpbWVvdXQsIGNtZCAweCV4IHN0YXQgMHgleFxuIiwKKwkJICAgICAgIGFwLT5pZCwgcWMtPnRmLmNvbW1hbmQsIGRydl9zdGF0KTsKKworCQlhdGFfcWNfY29tcGxldGUocWMsIGRydl9zdGF0KTsKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJRFBSSU5USygiRVhJVFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHBkY190Zl9sb2FkX21taW8oc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpCit7CisJV0FSTl9PTiAodGYtPnByb3RvY29sID09IEFUQV9QUk9UX0RNQSB8fAorCQkgdGYtPnByb3RvY29sID09IEFUQV9QUk9UX05PREFUQSk7CisJYXRhX3RmX2xvYWQoYXAsIHRmKTsKK30KKworCitzdGF0aWMgdm9pZCBwZGNfZXhlY19jb21tYW5kX21taW8oc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpCit7CisJV0FSTl9PTiAodGYtPnByb3RvY29sID09IEFUQV9QUk9UX0RNQSB8fAorCQkgdGYtPnByb3RvY29sID09IEFUQV9QUk9UX05PREFUQSk7CisJYXRhX2V4ZWNfY29tbWFuZChhcCwgdGYpOworfQorCisKK3N0YXRpYyB2b2lkIHBkY19zYXRhX3NldHVwX3BvcnQoc3RydWN0IGF0YV9pb3BvcnRzICpwb3J0LCB1bnNpZ25lZCBsb25nIGJhc2UpCit7CisJcG9ydC0+Y21kX2FkZHIJCT0gYmFzZTsKKwlwb3J0LT5kYXRhX2FkZHIJCT0gYmFzZTsKKwlwb3J0LT5mZWF0dXJlX2FkZHIJPQorCXBvcnQtPmVycm9yX2FkZHIJPSBiYXNlICsgMHg0OworCXBvcnQtPm5zZWN0X2FkZHIJPSBiYXNlICsgMHg4OworCXBvcnQtPmxiYWxfYWRkcgkJPSBiYXNlICsgMHhjOworCXBvcnQtPmxiYW1fYWRkcgkJPSBiYXNlICsgMHgxMDsKKwlwb3J0LT5sYmFoX2FkZHIJCT0gYmFzZSArIDB4MTQ7CisJcG9ydC0+ZGV2aWNlX2FkZHIJPSBiYXNlICsgMHgxODsKKwlwb3J0LT5jb21tYW5kX2FkZHIJPQorCXBvcnQtPnN0YXR1c19hZGRyCT0gYmFzZSArIDB4MWM7CisJcG9ydC0+YWx0c3RhdHVzX2FkZHIJPQorCXBvcnQtPmN0bF9hZGRyCQk9IGJhc2UgKyAweDM4OworfQorCisKKyNpZmRlZiBBVEFfVkVSQk9TRV9ERUJVRworc3RhdGljIHZvaWQgcGRjMjA2MjFfZ2V0X2Zyb21fZGltbShzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcGUsIHZvaWQgKnBzb3VyY2UsIAorCQkJCSAgIHUzMiBvZmZzZXQsIHUzMiBzaXplKQoreworCXUzMiB3aW5kb3dfc2l6ZTsKKwl1MTYgaWR4OworCXU4IHBhZ2VfbWFzazsKKwlsb25nIGRpc3Q7CisJdm9pZCAqbW1pbyA9IHBlLT5tbWlvX2Jhc2U7CisJc3RydWN0IHBkY19ob3N0X3ByaXYgKmhwcml2ID0gcGUtPnByaXZhdGVfZGF0YTsKKwl2b2lkICpkaW1tX21taW8gPSBocHJpdi0+ZGltbV9tbWlvOworCisJLyogaGFyZC1jb2RlIGNoaXAgIzAgKi8KKwltbWlvICs9IFBEQ19DSElQMF9PRlM7CisKKwlwYWdlX21hc2sgPSAweDAwOwkKKyAgIAl3aW5kb3dfc2l6ZSA9IDB4MjAwMCAqIDQ7IC8qIDMySyBieXRlIHVjaGFyIHNpemUgKi8gIAorCWlkeCA9ICh1MTYpIChvZmZzZXQgLyB3aW5kb3dfc2l6ZSk7IAorCisJd3JpdGVsKDB4MDEsIG1taW8gKyBQRENfR0VORVJBTF9DVExSKTsKKwlyZWFkbChtbWlvICsgUERDX0dFTkVSQUxfQ1RMUik7CisJd3JpdGVsKCgoaWR4KSA8PCBwYWdlX21hc2spLCBtbWlvICsgUERDX0RJTU1fV0lORE9XX0NUTFIpOworCXJlYWRsKG1taW8gKyBQRENfRElNTV9XSU5ET1dfQ1RMUik7CisKKwlvZmZzZXQgLT0gKGlkeCAqIHdpbmRvd19zaXplKTsKKwlpZHgrKzsKKwlkaXN0ID0gKChsb25nKSAod2luZG93X3NpemUgLSAob2Zmc2V0ICsgc2l6ZSkpKSA+PSAwID8gc2l6ZSA6IAorCQkobG9uZykgKHdpbmRvd19zaXplIC0gb2Zmc2V0KTsKKwltZW1jcHlfZnJvbWlvKChjaGFyICopIHBzb3VyY2UsIChjaGFyICopIChkaW1tX21taW8gKyBvZmZzZXQgLyA0KSwgCisJCSAgICAgIGRpc3QpOworCisJcHNvdXJjZSArPSBkaXN0OyAgICAKKwlzaXplIC09IGRpc3Q7CisJZm9yICg7IChsb25nKSBzaXplID49IChsb25nKSB3aW5kb3dfc2l6ZSA7KSB7CisJCXdyaXRlbCgweDAxLCBtbWlvICsgUERDX0dFTkVSQUxfQ1RMUik7CisJCXJlYWRsKG1taW8gKyBQRENfR0VORVJBTF9DVExSKTsKKwkJd3JpdGVsKCgoaWR4KSA8PCBwYWdlX21hc2spLCBtbWlvICsgUERDX0RJTU1fV0lORE9XX0NUTFIpOworCQlyZWFkbChtbWlvICsgUERDX0RJTU1fV0lORE9XX0NUTFIpOworCQltZW1jcHlfZnJvbWlvKChjaGFyICopIHBzb3VyY2UsIChjaGFyICopIChkaW1tX21taW8pLCAKKwkJCSAgICAgIHdpbmRvd19zaXplIC8gNCk7CisJCXBzb3VyY2UgKz0gd2luZG93X3NpemU7CisJCXNpemUgLT0gd2luZG93X3NpemU7CisJCWlkeCArKzsKKwl9CisKKwlpZiAoc2l6ZSkgeworCQl3cml0ZWwoMHgwMSwgbW1pbyArIFBEQ19HRU5FUkFMX0NUTFIpOworCQlyZWFkbChtbWlvICsgUERDX0dFTkVSQUxfQ1RMUik7CisJCXdyaXRlbCgoKGlkeCkgPDwgcGFnZV9tYXNrKSwgbW1pbyArIFBEQ19ESU1NX1dJTkRPV19DVExSKTsKKwkJcmVhZGwobW1pbyArIFBEQ19ESU1NX1dJTkRPV19DVExSKTsKKwkJbWVtY3B5X2Zyb21pbygoY2hhciAqKSBwc291cmNlLCAoY2hhciAqKSAoZGltbV9tbWlvKSwgCisJCQkgICAgICBzaXplIC8gNCk7CisJfQorfQorI2VuZGlmCisKKworc3RhdGljIHZvaWQgcGRjMjA2MjFfcHV0X3RvX2RpbW0oc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlLCB2b2lkICpwc291cmNlLCAKKwkJCQkgdTMyIG9mZnNldCwgdTMyIHNpemUpCit7CisJdTMyIHdpbmRvd19zaXplOworCXUxNiBpZHg7CisJdTggcGFnZV9tYXNrOworCWxvbmcgZGlzdDsKKwl2b2lkICptbWlvID0gcGUtPm1taW9fYmFzZTsKKwlzdHJ1Y3QgcGRjX2hvc3RfcHJpdiAqaHByaXYgPSBwZS0+cHJpdmF0ZV9kYXRhOworCXZvaWQgKmRpbW1fbW1pbyA9IGhwcml2LT5kaW1tX21taW87CisKKwkvKiBoYXJkLWNvZGUgY2hpcCAjMCAqLyAgIAorCW1taW8gKz0gUERDX0NISVAwX09GUzsKKworCXBhZ2VfbWFzayA9IDB4MDA7CQorICAgCXdpbmRvd19zaXplID0gMHgyMDAwICogNDsgICAgICAgLyogMzJLIGJ5dGUgdWNoYXIgc2l6ZSAqLyAgCisJaWR4ID0gKHUxNikgKG9mZnNldCAvIHdpbmRvd19zaXplKTsKKworCXdyaXRlbCgoKGlkeCkgPDwgcGFnZV9tYXNrKSwgbW1pbyArIFBEQ19ESU1NX1dJTkRPV19DVExSKTsKKwlyZWFkbChtbWlvICsgUERDX0RJTU1fV0lORE9XX0NUTFIpOworCW9mZnNldCAtPSAoaWR4ICogd2luZG93X3NpemUpOyAKKwlpZHgrKzsKKwlkaXN0ID0gKChsb25nKShzMzIpKHdpbmRvd19zaXplIC0gKG9mZnNldCArIHNpemUpKSkgPj0gMCA/IHNpemUgOgorCQkobG9uZykgKHdpbmRvd19zaXplIC0gb2Zmc2V0KTsKKwltZW1jcHlfdG9pbygoY2hhciAqKSAoZGltbV9tbWlvICsgb2Zmc2V0IC8gNCksIChjaGFyICopIHBzb3VyY2UsIGRpc3QpOworCXdyaXRlbCgweDAxLCBtbWlvICsgUERDX0dFTkVSQUxfQ1RMUik7CisJcmVhZGwobW1pbyArIFBEQ19HRU5FUkFMX0NUTFIpOworCisJcHNvdXJjZSArPSBkaXN0OyAgICAKKwlzaXplIC09IGRpc3Q7CisJZm9yICg7IChsb25nKSBzaXplID49IChsb25nKSB3aW5kb3dfc2l6ZSA7KSB7CisJCXdyaXRlbCgoKGlkeCkgPDwgcGFnZV9tYXNrKSwgbW1pbyArIFBEQ19ESU1NX1dJTkRPV19DVExSKTsKKwkJcmVhZGwobW1pbyArIFBEQ19ESU1NX1dJTkRPV19DVExSKTsKKwkJbWVtY3B5X3RvaW8oKGNoYXIgKikgKGRpbW1fbW1pbyksIChjaGFyICopIHBzb3VyY2UsIAorCQkJICAgIHdpbmRvd19zaXplIC8gNCk7CisJCXdyaXRlbCgweDAxLCBtbWlvICsgUERDX0dFTkVSQUxfQ1RMUik7CisJCXJlYWRsKG1taW8gKyBQRENfR0VORVJBTF9DVExSKTsKKwkJcHNvdXJjZSArPSB3aW5kb3dfc2l6ZTsKKwkJc2l6ZSAtPSB3aW5kb3dfc2l6ZTsKKwkJaWR4ICsrOworCX0KKyAgICAKKwlpZiAoc2l6ZSkgeworCQl3cml0ZWwoKChpZHgpIDw8IHBhZ2VfbWFzayksIG1taW8gKyBQRENfRElNTV9XSU5ET1dfQ1RMUik7CisJCXJlYWRsKG1taW8gKyBQRENfRElNTV9XSU5ET1dfQ1RMUik7CisJCW1lbWNweV90b2lvKChjaGFyICopIChkaW1tX21taW8pLCAoY2hhciAqKSBwc291cmNlLCBzaXplIC8gNCk7CisJCXdyaXRlbCgweDAxLCBtbWlvICsgUERDX0dFTkVSQUxfQ1RMUik7CisJCXJlYWRsKG1taW8gKyBQRENfR0VORVJBTF9DVExSKTsKKwl9Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBwZGMyMDYyMV9pMmNfcmVhZChzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcGUsIHUzMiBkZXZpY2UsIAorCQkJCSAgICAgIHUzMiBzdWJhZGRyLCB1MzIgKnBkYXRhKQoreworCXZvaWQgKm1taW8gPSBwZS0+bW1pb19iYXNlOworCXUzMiBpMmNyZWcgID0gMDsKKwl1MzIgc3RhdHVzOyAgICAgCisJdTMyIGNvdW50ID0wOworCisJLyogaGFyZC1jb2RlIGNoaXAgIzAgKi8KKwltbWlvICs9IFBEQ19DSElQMF9PRlM7CisKKwlpMmNyZWcgfD0gZGV2aWNlIDw8IDI0OworCWkyY3JlZyB8PSBzdWJhZGRyIDw8IDE2OworCisJLyogU2V0IHRoZSBkZXZpY2UgYW5kIHN1YmFkZHJlc3MgKi8KKwl3cml0ZWwoaTJjcmVnLCBtbWlvICsgUERDX0kyQ19BRERSX0RBVEFfT0ZGU0VUKTsKKwlyZWFkbChtbWlvICsgUERDX0kyQ19BRERSX0RBVEFfT0ZGU0VUKTsKKworCS8qIFdyaXRlIENvbnRyb2wgdG8gcGVyZm9ybSByZWFkIG9wZXJhdGlvbiwgbWFzayBpbnQgKi8KKwl3cml0ZWwoUERDX0kyQ19SRUFEIHwgUERDX0kyQ19TVEFSVCB8IFBEQ19JMkNfTUFTS19JTlQsIAorCSAgICAgICBtbWlvICsgUERDX0kyQ19DT05UUk9MX09GRlNFVCk7CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPD0gMTAwMDsgY291bnQgKyspIHsKKwkJc3RhdHVzID0gcmVhZGwobW1pbyArIFBEQ19JMkNfQ09OVFJPTF9PRkZTRVQpOworCQlpZiAoc3RhdHVzICYgUERDX0kyQ19DT01QTEVURSkgeworCQkJc3RhdHVzID0gcmVhZGwobW1pbyArIFBEQ19JMkNfQUREUl9EQVRBX09GRlNFVCk7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChjb3VudCA9PSAxMDAwKQorCQkJcmV0dXJuIDA7CisJfQorCisJKnBkYXRhID0gKHN0YXR1cyA+PiA4KSAmIDB4MDAwMDAwZmY7CisJcmV0dXJuIDE7ICAgICAgICAgICAKK30KKworCitzdGF0aWMgaW50IHBkYzIwNjIxX2RldGVjdF9kaW1tKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwZSkKK3sKKwl1MzIgZGF0YT0wIDsKKyAgCWlmIChwZGMyMDYyMV9pMmNfcmVhZChwZSwgUERDX0RJTU0wX1NQRF9ERVZfQUREUkVTUywgCisJCQkgICAgIFBEQ19ESU1NX1NQRF9TWVNURU1fRlJFUSwgJmRhdGEpKSB7CisgICAJCWlmIChkYXRhID09IDEwMCkKKwkJCXJldHVybiAxMDA7CisgIAl9IGVsc2UKKwkJcmV0dXJuIDA7CisgCQorICAgCWlmIChwZGMyMDYyMV9pMmNfcmVhZChwZSwgUERDX0RJTU0wX1NQRF9ERVZfQUREUkVTUywgOSwgJmRhdGEpKSB7CisJCWlmKGRhdGEgPD0gMHg3NSkgCisJCQlyZXR1cm4gMTMzOworICAgCX0gZWxzZQorCQlyZXR1cm4gMDsKKyAgIAkKKyAgIAlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHBkYzIwNjIxX3Byb2dfZGltbTAoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKQoreworCXUzMiBzcGQwWzUwXTsKKwl1MzIgZGF0YSA9IDA7CisgICAJaW50IHNpemUsIGk7CisgICAJdTggYmRpbW1zaXplOyAKKyAgIAl2b2lkICptbWlvID0gcGUtPm1taW9fYmFzZTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IHJlZzsKKwkJdW5zaWduZWQgaW50IG9mczsKKwl9IHBkY19pMmNfcmVhZF9kYXRhIFtdID0geworCQl7IFBEQ19ESU1NX1NQRF9UWVBFLCAxMSB9LAkJCisJCXsgUERDX0RJTU1fU1BEX0ZSRVNIX1JBVEUsIDEyIH0sCisJCXsgUERDX0RJTU1fU1BEX0NPTFVNTl9OVU0sIDQgfSwgCisJCXsgUERDX0RJTU1fU1BEX0FUVFJJQlVURSwgMjEgfSwKKwkJeyBQRENfRElNTV9TUERfUk9XX05VTSwgMyB9LAorCQl7IFBEQ19ESU1NX1NQRF9CQU5LX05VTSwgMTcgfSwKKwkJeyBQRENfRElNTV9TUERfTU9EVUxFX1JPVywgNSB9LAorCQl7IFBEQ19ESU1NX1NQRF9ST1dfUFJFX0NIQVJHRSwgMjcgfSwKKwkJeyBQRENfRElNTV9TUERfUk9XX0FDVElWRV9ERUxBWSwgMjggfSwKKwkJeyBQRENfRElNTV9TUERfUkFTX0NBU19ERUxBWSwgMjkgfSwKKwkJeyBQRENfRElNTV9TUERfQUNUSVZFX1BSRUNIQVJHRSwgMzAgfSwKKwkJeyBQRENfRElNTV9TUERfQ0FTX0xBVEVOQ1ksIDE4IH0sICAgICAgIAorCX07CisKKwkvKiBoYXJkLWNvZGUgY2hpcCAjMCAqLworCW1taW8gKz0gUERDX0NISVAwX09GUzsKKworCWZvcihpPTA7IGk8QVJSQVlfU0laRShwZGNfaTJjX3JlYWRfZGF0YSk7IGkrKykKKwkJcGRjMjA2MjFfaTJjX3JlYWQocGUsIFBEQ19ESU1NMF9TUERfREVWX0FERFJFU1MsCisJCQkJICBwZGNfaTJjX3JlYWRfZGF0YVtpXS5yZWcsIAorCQkJCSAgJnNwZDBbcGRjX2kyY19yZWFkX2RhdGFbaV0ub2ZzXSk7CisgIAorICAgCWRhdGEgfD0gKHNwZDBbNF0gLSA4KSB8ICgoc3BkMFsyMV0gIT0gMCkgPDwgMykgfCAoKHNwZDBbM10tMTEpIDw8IDQpOworICAgCWRhdGEgfD0gKChzcGQwWzE3XSAvIDQpIDw8IDYpIHwgKChzcGQwWzVdIC8gMikgPDwgNykgfCAKKwkJKCgoKHNwZDBbMjddICsgOSkgLyAxMCkgLSAxKSA8PCA4KSA7CisgICAJZGF0YSB8PSAoKCgoKHNwZDBbMjldID4gc3BkMFsyOF0pIAorCQkgICAgPyBzcGQwWzI5XSA6IHNwZDBbMjhdKSArIDkpIC8gMTApIC0gMSkgPDwgMTA7IAorICAgCWRhdGEgfD0gKChzcGQwWzMwXSAtIHNwZDBbMjldICsgOSkgLyAxMCAtIDIpIDw8IDEyOworICAgCisgICAJaWYgKHNwZDBbMThdICYgMHgwOCkgCisJCWRhdGEgfD0gKCgweDAzKSA8PCAxNCk7CisgICAJZWxzZSBpZiAoc3BkMFsxOF0gJiAweDA0KQorCQlkYXRhIHw9ICgoMHgwMikgPDwgMTQpOworICAgCWVsc2UgaWYgKHNwZDBbMThdICYgMHgwMSkKKwkJZGF0YSB8PSAoKDB4MDEpIDw8IDE0KTsKKyAgIAllbHNlCisJCWRhdGEgfD0gKDAgPDwgMTQpOworCisgIAkvKiAKKwkgICBDYWxjdWxhdGUgdGhlIHNpemUgb2YgYkRJTU1TaXplIChwb3dlciBvZiAyKSBhbmQKKwkgICBtZXJnZSB0aGUgRElNTSBzaXplIGJ5IHByb2dyYW0gc3RhcnQvZW5kIGFkZHJlc3MuCisJKi8KKworICAgCWJkaW1tc2l6ZSA9IHNwZDBbNF0gKyAoc3BkMFs1XSAvIDIpICsgc3BkMFszXSArIChzcGQwWzE3XSAvIDIpICsgMzsKKyAgIAlzaXplID0gKDEgPDwgYmRpbW1zaXplKSA+PiAyMDsJLyogc2l6ZSA9IHh4eChNQikgKi8KKyAgIAlkYXRhIHw9ICgoKHNpemUgLyAxNikgLSAxKSA8PCAxNik7CisgICAJZGF0YSB8PSAoMCA8PCAyMyk7CisJZGF0YSB8PSA4OworICAgCXdyaXRlbChkYXRhLCBtbWlvICsgUERDX0RJTU0wX0NPTlRST0xfT0ZGU0VUKTsgCisJcmVhZGwobW1pbyArIFBEQ19ESU1NMF9DT05UUk9MX09GRlNFVCk7CisgICAJcmV0dXJuIHNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IHBkYzIwNjIxX3Byb2dfZGltbV9nbG9iYWwoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKQoreworCXUzMiBkYXRhLCBzcGQwOworICAgCWludCBlcnJvciwgaTsKKyAgIAl2b2lkICptbWlvID0gcGUtPm1taW9fYmFzZTsKKworCS8qIGhhcmQtY29kZSBjaGlwICMwICovCisgICAJbW1pbyArPSBQRENfQ0hJUDBfT0ZTOworCisgICAJLyoKKwkgIFNldCBUbyBEZWZhdWx0IDogRElNTSBNb2R1bGUgR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgKDB4MDIyMjU5RjEpCisJICBESU1NIEFyYml0cmF0aW9uIERpc2FibGUgKGJpdCAyMCkKKwkgIERJTU0gRGF0YS9Db250cm9sIE91dHB1dCBEcml2aW5nIFNlbGVjdGlvbiAoYml0MTIgLSBiaXQxNSkKKwkgIFJlZnJlc2ggRW5hYmxlIChiaXQgMTcpCisJKi8KKworCWRhdGEgPSAweDAyMjI1OUYxOyAgIAorCXdyaXRlbChkYXRhLCBtbWlvICsgUERDX1NEUkFNX0NPTlRST0xfT0ZGU0VUKTsKKwlyZWFkbChtbWlvICsgUERDX1NEUkFNX0NPTlRST0xfT0ZGU0VUKTsKKworCS8qIFR1cm4gb24gZm9yIEVDQyAqLworCXBkYzIwNjIxX2kyY19yZWFkKHBlLCBQRENfRElNTTBfU1BEX0RFVl9BRERSRVNTLCAKKwkJCSAgUERDX0RJTU1fU1BEX1RZUEUsICZzcGQwKTsKKwlpZiAoc3BkMCA9PSAweDAyKSB7CisJCWRhdGEgfD0gKDB4MDEgPDwgMTYpOworCQl3cml0ZWwoZGF0YSwgbW1pbyArIFBEQ19TRFJBTV9DT05UUk9MX09GRlNFVCk7CisJCXJlYWRsKG1taW8gKyBQRENfU0RSQU1fQ09OVFJPTF9PRkZTRVQpOworCQlwcmludGsoS0VSTl9FUlIgIkxvY2FsIERJTU0gRUNDIEVuYWJsZWRcbiIpOworICAgCX0KKworICAgCS8qIERJTU0gSW5pdGlhbGl6YXRpb24gU2VsZWN0L0VuYWJsZSAoYml0IDE4LzE5KSAqLworICAgCWRhdGEgJj0gKH4oMTw8MTgpKTsKKyAgIAlkYXRhIHw9ICgxPDwxOSk7CisgICAJd3JpdGVsKGRhdGEsIG1taW8gKyBQRENfU0RSQU1fQ09OVFJPTF9PRkZTRVQpOworCisgICAJZXJyb3IgPSAxOyAgICAgICAgICAgICAgICAgICAgIAorICAgCWZvciAoaSA9IDE7IGkgPD0gMTA7IGkrKykgeyAgIC8qIHBvbGxpbmcgfjUgc2VjcyAqLworCQlkYXRhID0gcmVhZGwobW1pbyArIFBEQ19TRFJBTV9DT05UUk9MX09GRlNFVCk7CisJCWlmICghKGRhdGEgJiAoMTw8MTkpKSkgeworCSAgIAkJZXJyb3IgPSAwOworCSAgIAkJYnJlYWs7ICAgICAKKwkJfQorCQltc2xlZXAoaSoxMDApOworICAgCX0KKyAgIAlyZXR1cm4gZXJyb3I7Cit9CisJCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGRjMjA2MjFfZGltbV9pbml0KHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwZSkKK3sKKwlpbnQgc3BlZWQsIHNpemUsIGxlbmd0aDsgCisJdTMyIGFkZHIsc3BkMCxwY2lfc3RhdHVzOworCXUzMiB0bXA9MDsKKwl1MzIgdGltZV9wZXJpb2Q9MDsKKwl1MzIgdGNvdW50PTA7CisJdTMyIHRpY2tzPTA7CisJdTMyIGNsb2NrPTA7CisJdTMyIGZwYXJhbT0wOworICAgCXZvaWQgKm1taW8gPSBwZS0+bW1pb19iYXNlOworCisJLyogaGFyZC1jb2RlIGNoaXAgIzAgKi8KKyAgIAltbWlvICs9IFBEQ19DSElQMF9PRlM7CisKKwkvKiBJbml0aWFsaXplIFBMTCBiYXNlZCB1cG9uIFBDSSBCdXMgRnJlcXVlbmN5ICovCisKKwkvKiBJbml0aWFsaXplIFRpbWUgUGVyaW9kIFJlZ2lzdGVyICovCisJd3JpdGVsKDB4ZmZmZmZmZmYsIG1taW8gKyBQRENfVElNRV9QRVJJT0QpOworCXRpbWVfcGVyaW9kID0gcmVhZGwobW1pbyArIFBEQ19USU1FX1BFUklPRCk7CisJVlBSSU5USygiVGltZSBQZXJpb2QgUmVnaXN0ZXIgKDB4NDApOiAweCV4XG4iLCB0aW1lX3BlcmlvZCk7CisKKwkvKiBFbmFibGUgdGltZXIgKi8KKwl3cml0ZWwoMHgwMDAwMWEwLCBtbWlvICsgUERDX1RJTUVfQ09OVFJPTCk7CisJcmVhZGwobW1pbyArIFBEQ19USU1FX0NPTlRST0wpOworCisJLyogV2FpdCAzIHNlY29uZHMgKi8KKwltc2xlZXAoMzAwMCk7CisKKwkvKiAKKwkgICBXaGVuIHRpbWVyIGlzIGVuYWJsZWQsIGNvdW50ZXIgaXMgZGVjcmVhc2VkIGV2ZXJ5IGludGVybmFsCisJICAgY2xvY2sgY3ljbGUuCisJKi8KKworCXRjb3VudCA9IHJlYWRsKG1taW8gKyBQRENfVElNRV9DT1VOVEVSKTsKKwlWUFJJTlRLKCJUaW1lIENvdW50ZXIgUmVnaXN0ZXIgKDB4NDQpOiAweCV4XG4iLCB0Y291bnQpOworCisJLyogCisJICAgSWYgU1g0IGlzIG9uIFBDSS1YIGJ1cywgYWZ0ZXIgMyBzZWNvbmRzLCB0aGUgdGltZXIgY291bnRlcgorCSAgIHJlZ2lzdGVyIHNob3VsZCBiZSA+PSAoMHhmZmZmZmZmZiAtIDN4MTBeOCkuCisJKi8KKwlpZih0Y291bnQgPj0gUENJX1hfVENPVU5UKSB7CisJCXRpY2tzID0gKHRpbWVfcGVyaW9kIC0gdGNvdW50KTsKKwkJVlBSSU5USygiTnVtIGNvdW50ZXJzIDB4JXggKCVkKVxuIiwgdGlja3MsIHRpY2tzKTsKKwkKKwkJY2xvY2sgPSAodGlja3MgLyAzMDAwMDApOworCQlWUFJJTlRLKCIxMCAqIEludGVybmFsIGNsayA9IDB4JXggKCVkKVxuIiwgY2xvY2ssIGNsb2NrKTsKKwkJCisJCWNsb2NrID0gKGNsb2NrICogMzMpOworCQlWUFJJTlRLKCIxMCAqIEludGVybmFsIGNsayAqIDMzID0gMHgleCAoJWQpXG4iLCBjbG9jaywgY2xvY2spOworCisJCS8qIFBMTCBGIFBhcmFtIChiaXQgMjI6MTYpICovCisJCWZwYXJhbSA9ICgxNDAwMDAwIC8gY2xvY2spIC0gMjsKKwkJVlBSSU5USygiUExMIEYgUGFyYW06IDB4JXggKCVkKVxuIiwgZnBhcmFtLCBmcGFyYW0pOworCQkKKwkJLyogT0QgcGFyYW0gPSAweDIgKGJpdCAzMTozMCksIFIgcGFyYW0gPSAweDUgKGJpdCAyOToyNSkgKi8KKwkJcGNpX3N0YXR1cyA9ICgweDhhMDAxODI0IHwgKGZwYXJhbSA8PCAxNikpOworCX0gZWxzZQorCQlwY2lfc3RhdHVzID0gUENJX1BMTF9JTklUOworCisJLyogSW5pdGlhbGl6ZSBQTEwuICovCisJVlBSSU5USygicGNpX3N0YXR1czogMHgleFxuIiwgcGNpX3N0YXR1cyk7CisJd3JpdGVsKHBjaV9zdGF0dXMsIG1taW8gKyBQRENfQ1RMX1NUQVRVUyk7CisJcmVhZGwobW1pbyArIFBEQ19DVExfU1RBVFVTKTsKKworCS8qIAorCSAgIFJlYWQgU1BEIG9mIERJTU0gYnkgSTJDIGludGVyZmFjZSwKKwkgICBhbmQgcHJvZ3JhbSB0aGUgRElNTSBNb2R1bGUgQ29udHJvbGxlci4KKwkqLworIAlpZiAoIShzcGVlZCA9IHBkYzIwNjIxX2RldGVjdF9kaW1tKHBlKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJEZXRlY3QgTG9jYWwgRElNTSBGYWlsXG4iKTsgIAorCQlyZXR1cm4gMTsJLyogRElNTSBlcnJvciAqLworICAgCX0KKyAgIAlWUFJJTlRLKCJMb2NhbCBESU1NIFNwZWVkID0gJWRcbiIsIHNwZWVkKTsKKworICAgCS8qIFByb2dyYW1taW5nIERJTU0wIE1vZHVsZSBDb250cm9sIFJlZ2lzdGVyIChpbmRleF9DSUQwOjgwaCkgKi8gCisgICAJc2l6ZSA9IHBkYzIwNjIxX3Byb2dfZGltbTAocGUpOworICAgCVZQUklOVEsoIkxvY2FsIERJTU0gU2l6ZSA9ICVkTUJcbiIsc2l6ZSk7CisKKyAgIAkvKiBQcm9ncmFtbWluZyBESU1NIE1vZHVsZSBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAoaW5kZXhfQ0lEMDo4OGgpICovIAorICAgCWlmIChwZGMyMDYyMV9wcm9nX2RpbW1fZ2xvYmFsKHBlKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlByb2dyYW1taW5nIERJTU0gTW9kdWxlIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyIEZhaWxcbiIpOworCQlyZXR1cm4gMTsKKyAgIAl9CisKKyNpZmRlZiBBVEFfVkVSQk9TRV9ERUJVRworCXsKKwkJdTggdGVzdF9wYXJ0dGVybjFbNDBdID0gezB4NTUsMHhBQSwnUCcsJ3InLCdvJywnbScsJ2knLCdzJywnZScsJyAnLAorICAJCQkJJ04nLCdvJywndCcsJyAnLCdZJywnZScsJ3QnLCcgJywnRCcsJ2UnLCdmJywnaScsJ24nLCdlJywnZCcsJyAnLAorIAkJCQkgJzEnLCcuJywnMScsJzAnLAorICAJCQkJJzknLCc4JywnMCcsJzMnLCcxJywnNicsJzEnLCcyJywwLDB9OworCQl1OCB0ZXN0X3BhcnR0ZXJuMls0MF0gPSB7MH07CisKKwkJcGRjMjA2MjFfcHV0X3RvX2RpbW0ocGUsICh2b2lkICopIHRlc3RfcGFydHRlcm4yLCAweDEwMDQwLCA0MCk7CisJCXBkYzIwNjIxX3B1dF90b19kaW1tKHBlLCAodm9pZCAqKSB0ZXN0X3BhcnR0ZXJuMiwgMHg0MCwgNDApOworCisJCXBkYzIwNjIxX3B1dF90b19kaW1tKHBlLCAodm9pZCAqKSB0ZXN0X3BhcnR0ZXJuMSwgMHgxMDA0MCwgNDApOworCQlwZGMyMDYyMV9nZXRfZnJvbV9kaW1tKHBlLCAodm9pZCAqKSB0ZXN0X3BhcnR0ZXJuMiwgMHg0MCwgNDApOworCQlwcmludGsoS0VSTl9FUlIgIiV4LCAleCwgJXNcbiIsIHRlc3RfcGFydHRlcm4yWzBdLCAKKwkJICAgICAgIHRlc3RfcGFydHRlcm4yWzFdLCAmKHRlc3RfcGFydHRlcm4yWzJdKSk7CisJCXBkYzIwNjIxX2dldF9mcm9tX2RpbW0ocGUsICh2b2lkICopIHRlc3RfcGFydHRlcm4yLCAweDEwMDQwLCAKKwkJCQkgICAgICAgNDApOworCQlwcmludGsoS0VSTl9FUlIgIiV4LCAleCwgJXNcbiIsIHRlc3RfcGFydHRlcm4yWzBdLCAKKwkJICAgICAgIHRlc3RfcGFydHRlcm4yWzFdLCAmKHRlc3RfcGFydHRlcm4yWzJdKSk7CisKKwkJcGRjMjA2MjFfcHV0X3RvX2RpbW0ocGUsICh2b2lkICopIHRlc3RfcGFydHRlcm4xLCAweDQwLCA0MCk7CisJCXBkYzIwNjIxX2dldF9mcm9tX2RpbW0ocGUsICh2b2lkICopIHRlc3RfcGFydHRlcm4yLCAweDQwLCA0MCk7CisJCXByaW50ayhLRVJOX0VSUiAiJXgsICV4LCAlc1xuIiwgdGVzdF9wYXJ0dGVybjJbMF0sIAorCQkgICAgICAgdGVzdF9wYXJ0dGVybjJbMV0sICYodGVzdF9wYXJ0dGVybjJbMl0pKTsKKwl9CisjZW5kaWYKKworCS8qIEVDQyBpbml0aWxpYXphdGlvbi4gKi8KKworCXBkYzIwNjIxX2kyY19yZWFkKHBlLCBQRENfRElNTTBfU1BEX0RFVl9BRERSRVNTLCAKKwkJCSAgUERDX0RJTU1fU1BEX1RZUEUsICZzcGQwKTsKKwlpZiAoc3BkMCA9PSAweDAyKSB7CisJCVZQUklOVEsoIlN0YXJ0IEVDQyBpbml0aWFsaXphdGlvblxuIik7CisJCWFkZHIgPSAwOworCQlsZW5ndGggPSBzaXplICogMTAyNCAqIDEwMjQ7CisJCXdoaWxlIChhZGRyIDwgbGVuZ3RoKSB7CisJCQlwZGMyMDYyMV9wdXRfdG9fZGltbShwZSwgKHZvaWQgKikgJnRtcCwgYWRkciwgCisJCQkJCSAgICAgc2l6ZW9mKHUzMikpOworCQkJYWRkciArPSBzaXplb2YodTMyKTsKKwkJfQorCQlWUFJJTlRLKCJGaW5pc2ggRUNDIGluaXRpYWxpemF0aW9uXG4iKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgcGRjXzIwNjIxX2luaXQoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKQoreworCXUzMiB0bXA7CisJdm9pZCAqbW1pbyA9IHBlLT5tbWlvX2Jhc2U7CisKKwkvKiBoYXJkLWNvZGUgY2hpcCAjMCAqLworCW1taW8gKz0gUERDX0NISVAwX09GUzsKKworCS8qCisJICogU2VsZWN0IHBhZ2UgMHg0MCBmb3Igb3VyIDMyayBESU1NIHdpbmRvdworCSAqLworCXRtcCA9IHJlYWRsKG1taW8gKyBQRENfMjA2MjFfRElNTV9XSU5ET1cpICYgMHhmZmZmMDAwMDsKKwl0bXAgfD0gUERDX1BBR0VfV0lORE9XOwkvKiBwYWdlIDQwaDsgYXJiaXRyYXJpbHkgc2VsZWN0ZWQgKi8KKwl3cml0ZWwodG1wLCBtbWlvICsgUERDXzIwNjIxX0RJTU1fV0lORE9XKTsKKworCS8qCisJICogUmVzZXQgSG9zdCBETUEKKwkgKi8KKwl0bXAgPSByZWFkbChtbWlvICsgUERDX0hETUFfQ1RMU1RBVCk7CisJdG1wIHw9IFBEQ19SRVNFVDsKKwl3cml0ZWwodG1wLCBtbWlvICsgUERDX0hETUFfQ1RMU1RBVCk7CisJcmVhZGwobW1pbyArIFBEQ19IRE1BX0NUTFNUQVQpOwkJLyogZmx1c2ggKi8KKworCXVkZWxheSgxMCk7CisKKwl0bXAgPSByZWFkbChtbWlvICsgUERDX0hETUFfQ1RMU1RBVCk7CisJdG1wICY9IH5QRENfUkVTRVQ7CisJd3JpdGVsKHRtcCwgbW1pbyArIFBEQ19IRE1BX0NUTFNUQVQpOworCXJlYWRsKG1taW8gKyBQRENfSERNQV9DVExTVEFUKTsJCS8qIGZsdXNoICovCit9CisKK3N0YXRpYyBpbnQgcGRjX3NhdGFfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwl2b2lkICptbWlvX2Jhc2UsICpkaW1tX21taW8gPSBOVUxMOworCXN0cnVjdCBwZGNfaG9zdF9wcml2ICpocHJpdiA9IE5VTEw7CisJdW5zaWduZWQgaW50IGJvYXJkX2lkeCA9ICh1bnNpZ25lZCBpbnQpIGVudC0+ZHJpdmVyX2RhdGE7CisJaW50IHBjaV9kZXZfYnVzeSA9IDA7CisJaW50IHJjOworCisJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIiB2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisKKwkvKgorCSAqIElmIHRoaXMgZHJpdmVyIGhhcHBlbnMgdG8gb25seSBiZSB1c2VmdWwgb24gQXBwbGUncyBLMiwgdGhlbgorCSAqIHdlIHNob3VsZCBjaGVjayB0aGF0IGhlcmUgYXMgaXQgaGFzIGEgbm9ybWFsIFNlcnZlcndvcmtzIElECisJICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKHJjKSB7CisJCXBjaV9kZXZfYnVzeSA9IDE7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKworCXByb2JlX2VudCA9IGttYWxsb2Moc2l6ZW9mKCpwcm9iZV9lbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJvYmVfZW50ID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwl9CisKKwltZW1zZXQocHJvYmVfZW50LCAwLCBzaXplb2YoKnByb2JlX2VudCkpOworCXByb2JlX2VudC0+ZGV2ID0gcGNpX2Rldl90b19kZXYocGRldik7CisJSU5JVF9MSVNUX0hFQUQoJnByb2JlX2VudC0+bm9kZSk7CisKKwltbWlvX2Jhc2UgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKSwKKwkJICAgICAgICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAzKSk7CisJaWYgKG1taW9fYmFzZSA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfZW50OworCX0KKwliYXNlID0gKHVuc2lnbmVkIGxvbmcpIG1taW9fYmFzZTsKKworCWhwcml2ID0ga21hbGxvYyhzaXplb2YoKmhwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFocHJpdikgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKwltZW1zZXQoaHByaXYsIDAsIHNpemVvZigqaHByaXYpKTsKKworCWRpbW1fbW1pbyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDQpLAorCQkJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgNCkpOworCWlmICghZGltbV9tbWlvKSB7CisJCWtmcmVlKGhwcml2KTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwlocHJpdi0+ZGltbV9tbWlvID0gZGltbV9tbWlvOworCisJcHJvYmVfZW50LT5zaHQJCT0gcGRjX3BvcnRfaW5mb1tib2FyZF9pZHhdLnNodDsKKwlwcm9iZV9lbnQtPmhvc3RfZmxhZ3MJPSBwZGNfcG9ydF9pbmZvW2JvYXJkX2lkeF0uaG9zdF9mbGFnczsKKwlwcm9iZV9lbnQtPnBpb19tYXNrCT0gcGRjX3BvcnRfaW5mb1tib2FyZF9pZHhdLnBpb19tYXNrOworCXByb2JlX2VudC0+bXdkbWFfbWFzawk9IHBkY19wb3J0X2luZm9bYm9hcmRfaWR4XS5td2RtYV9tYXNrOworCXByb2JlX2VudC0+dWRtYV9tYXNrCT0gcGRjX3BvcnRfaW5mb1tib2FyZF9pZHhdLnVkbWFfbWFzazsKKwlwcm9iZV9lbnQtPnBvcnRfb3BzCT0gcGRjX3BvcnRfaW5mb1tib2FyZF9pZHhdLnBvcnRfb3BzOworCisgICAgICAgCXByb2JlX2VudC0+aXJxID0gcGRldi0+aXJxOworICAgICAgIAlwcm9iZV9lbnQtPmlycV9mbGFncyA9IFNBX1NISVJROworCXByb2JlX2VudC0+bW1pb19iYXNlID0gbW1pb19iYXNlOworCisJcHJvYmVfZW50LT5wcml2YXRlX2RhdGEgPSBocHJpdjsKKwliYXNlICs9IFBEQ19DSElQMF9PRlM7CisKKwlwcm9iZV9lbnQtPm5fcG9ydHMgPSA0OworCXBkY19zYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFswXSwgYmFzZSArIDB4MjAwKTsKKwlwZGNfc2F0YV9zZXR1cF9wb3J0KCZwcm9iZV9lbnQtPnBvcnRbMV0sIGJhc2UgKyAweDI4MCk7CisJcGRjX3NhdGFfc2V0dXBfcG9ydCgmcHJvYmVfZW50LT5wb3J0WzJdLCBiYXNlICsgMHgzMDApOworCXBkY19zYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFszXSwgYmFzZSArIDB4MzgwKTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJLyogaW5pdGlhbGl6ZSBhZGFwdGVyICovCisJLyogaW5pdGlhbGl6ZSBsb2NhbCBkaW1tICovCisJaWYgKHBkYzIwNjIxX2RpbW1faW5pdChwcm9iZV9lbnQpKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXBfZGltbTsKKwl9CisJcGRjXzIwNjIxX2luaXQocHJvYmVfZW50KTsKKworCS8qIEZJWE1FOiBjaGVjayBhdGFfZGV2aWNlX2FkZCByZXR1cm4gdmFsdWUgKi8KKwlhdGFfZGV2aWNlX2FkZChwcm9iZV9lbnQpOworCWtmcmVlKHByb2JlX2VudCk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9pb3VubWFwX2RpbW06CQkvKiBvbmx5IGdldCB0byB0aGlzIGxhYmVsIGlmIDIwNjIxICovCisJa2ZyZWUoaHByaXYpOworCWlvdW5tYXAoZGltbV9tbWlvKTsKK2Vycl9vdXRfaW91bm1hcDoKKwlpb3VubWFwKG1taW9fYmFzZSk7CitlcnJfb3V0X2ZyZWVfZW50OgorCWtmcmVlKHByb2JlX2VudCk7CitlcnJfb3V0X3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXQ6CisJaWYgKCFwY2lfZGV2X2J1c3kpCisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgcGRjX3NhdGFfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnBkY19zYXRhX3BjaV9kcml2ZXIpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwZGNfc2F0YV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwZGNfc2F0YV9wY2lfZHJpdmVyKTsKK30KKworCitNT0RVTEVfQVVUSE9SKCJKZWZmIEdhcnppayIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQcm9taXNlIFNBVEEgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBkY19zYXRhX3BjaV90YmwpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCittb2R1bGVfaW5pdChwZGNfc2F0YV9pbml0KTsKK21vZHVsZV9leGl0KHBkY19zYXRhX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NhdGFfdWxpLmMgYi9kcml2ZXJzL3Njc2kvc2F0YV91bGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmZmNGY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfdWxpLmMKQEAgLTAsMCArMSwyODcgQEAKKy8qCisgKiAgc2F0YV91bGkuYyAtIFVMaSBFbGVjdHJvbmljcyBTQVRBCisgKgorICogIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE9wZW4KKyAqICBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4xIHRoYXQgY2FuIGJlIGZvdW5kIGF0CisgKiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMS4xLnR4dCBhbmQgaXMgaW5jbHVkZWQgaGVyZWluCisgKiAgYnkgcmVmZXJlbmNlLgorICoKKyAqICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIikgYXMgZGlzdHJpYnV0ZWQKKyAqICBpbiB0aGUga2VybmVsIHNvdXJjZSBDT1BZSU5HIGZpbGUsIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YKKyAqICB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cKKyAqICB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiAgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCisgKiAgdGhlIE9TTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKKyAqICByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuCisgKiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91cgorICogIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUgT1NMIG9yIHRoZSBHUEwuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KKworI2RlZmluZSBEUlZfTkFNRQkic2F0YV91bGkiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjUiCisKK2VudW0geworCXVsaV81Mjg5CQk9IDAsCisJdWxpXzUyODcJCT0gMSwKKwl1bGlfNTI4MQkJPSAyLAorCisJLyogUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisJVUxJNTI4N19CQVNFCQk9IDB4OTAsIC8qIHNhdGEwIHBoeSBTQ1IgcmVnaXN0ZXJzICovCisJVUxJNTI4N19PRkZTCQk9IDB4MTAsIC8qIG9mZnNldCBmcm9tIHNhdGEwLT5zYXRhMSBwaHkgcmVncyAqLworCVVMSTUyODFfQkFTRQkJPSAweDYwLCAvKiBzYXRhMCBwaHkgU0NSICByZWdpc3RlcnMgKi8KKwlVTEk1MjgxX09GRlMJCT0gMHg2MCwgLyogb2Zmc2V0IGZyb20gc2F0YTAtPnNhdGExIHBoeSByZWdzICovCit9OworCitzdGF0aWMgaW50IHVsaV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworc3RhdGljIHUzMiB1bGlfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpOworc3RhdGljIHZvaWQgdWxpX3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB1bGlfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9BTCwgMHg1Mjg5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCB1bGlfNTI4OSB9LAorCXsgUENJX1ZFTkRPUl9JRF9BTCwgMHg1Mjg3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCB1bGlfNTI4NyB9LAorCXsgUENJX1ZFTkRPUl9JRF9BTCwgMHg1MjgxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCB1bGlfNTI4MSB9LAorCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdWxpX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQkJPSB1bGlfcGNpX3RibCwKKwkucHJvYmUJCQk9IHVsaV9pbml0X29uZSwKKwkucmVtb3ZlCQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCit9OworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIHVsaV9zaHQgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pb2N0bAkJCT0gYXRhX3Njc2lfaW9jdGwsCisJLnF1ZXVlY29tbWFuZAkJPSBhdGFfc2NzaV9xdWV1ZWNtZCwKKwkuZWhfc3RyYXRlZ3lfaGFuZGxlcgk9IGF0YV9zY3NpX2Vycm9yLAorCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKKwkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCisJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKKwkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAorCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAorCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAorCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAorCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCisJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAorCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5vcmRlcmVkX2ZsdXNoCQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgdWxpX29wcyA9IHsKKwkucG9ydF9kaXNhYmxlCQk9IGF0YV9wb3J0X2Rpc2FibGUsCisKKwkudGZfbG9hZAkJPSBhdGFfdGZfbG9hZCwKKwkudGZfcmVhZAkJPSBhdGFfdGZfcmVhZCwKKwkuY2hlY2tfc3RhdHVzCQk9IGF0YV9jaGVja19zdGF0dXMsCisJLmV4ZWNfY29tbWFuZAkJPSBhdGFfZXhlY19jb21tYW5kLAorCS5kZXZfc2VsZWN0CQk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKKworCS5waHlfcmVzZXQJCT0gc2F0YV9waHlfcmVzZXQsCisKKwkuYm1kbWFfc2V0dXAgICAgICAgICAgICA9IGF0YV9ibWRtYV9zZXR1cCwKKwkuYm1kbWFfc3RhcnQgICAgICAgICAgICA9IGF0YV9ibWRtYV9zdGFydCwKKwkuYm1kbWFfc3RvcAkJPSBhdGFfYm1kbWFfc3RvcCwKKwkuYm1kbWFfc3RhdHVzCQk9IGF0YV9ibWRtYV9zdGF0dXMsCisJLnFjX3ByZXAJCT0gYXRhX3FjX3ByZXAsCisJLnFjX2lzc3VlCQk9IGF0YV9xY19pc3N1ZV9wcm90LAorCisJLmVuZ190aW1lb3V0CQk9IGF0YV9lbmdfdGltZW91dCwKKworCS5pcnFfaGFuZGxlcgkJPSBhdGFfaW50ZXJydXB0LAorCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKKworCS5zY3JfcmVhZAkJPSB1bGlfc2NyX3JlYWQsCisJLnNjcl93cml0ZQkJPSB1bGlfc2NyX3dyaXRlLAorCisJLnBvcnRfc3RhcnQJCT0gYXRhX3BvcnRfc3RhcnQsCisJLnBvcnRfc3RvcAkJPSBhdGFfcG9ydF9zdG9wLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIHVsaV9wb3J0X2luZm8gPSB7CisJLnNodCAgICAgICAgICAgID0gJnVsaV9zaHQsCisJLmhvc3RfZmxhZ3MgICAgID0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX1NBVEFfUkVTRVQgfAorCQkJICBBVEFfRkxBR19OT19MRUdBQ1ksCisJLnBpb19tYXNrICAgICAgID0gMHgwMywJCS8vc3VwcG9ydCBwaW8gbW9kZSA0IChGSVhNRSkKKwkudWRtYV9tYXNrICAgICAgPSAweDdmLAkJLy9zdXBwb3J0IHVkbWEgbW9kZSA2CisJLnBvcnRfb3BzICAgICAgID0gJnVsaV9vcHMsCit9OworCisKK01PRFVMRV9BVVRIT1IoIlBlZXIgQ2hlbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJsb3ctbGV2ZWwgZHJpdmVyIGZvciBVTGkgRWxlY3Ryb25pY3MgU0FUQSBjb250cm9sbGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdWxpX3BjaV90YmwpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9zY3JfY2ZnX2FkZHIoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZykKK3sKKwlyZXR1cm4gYXAtPmlvYWRkci5zY3JfYWRkciArICg0ICogc2NfcmVnKTsKK30KKworc3RhdGljIHUzMiB1bGlfc2NyX2NmZ19yZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdF9zZXQtPmRldik7CisJdW5zaWduZWQgaW50IGNmZ19hZGRyID0gZ2V0X3Njcl9jZmdfYWRkcihhcCwgc2NfcmVnKTsKKwl1MzIgdmFsOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGNmZ19hZGRyLCAmdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCB1bGlfc2NyX2NmZ193cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjciwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3Rfc2V0LT5kZXYpOworCXVuc2lnbmVkIGludCBjZmdfYWRkciA9IGdldF9zY3JfY2ZnX2FkZHIoYXAsIHNjcik7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIGNmZ19hZGRyLCB2YWwpOworfQorCitzdGF0aWMgdTMyIHVsaV9zY3JfcmVhZCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZykKK3sKKwlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpCisJCXJldHVybiAweGZmZmZmZmZmVTsKKworCXJldHVybiB1bGlfc2NyX2NmZ19yZWFkKGFwLCBzY19yZWcpOworfQorCitzdGF0aWMgdm9pZCB1bGlfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKQoreworCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkJLy9TQ1JfQ09OVFJPTD0yLCBTQ1JfRVJST1I9MSwgU0NSX1NUQVRVUz0wCisJCXJldHVybjsKKworCXVsaV9zY3JfY2ZnX3dyaXRlKGFwLCBzY19yZWcsIHZhbCk7Cit9CisKKy8qIG1vdmUgdG8gUENJIGxheWVyLCBpbnRlZ3JhdGUgdy8gTVNJIHN0dWZmICovCitzdGF0aWMgdm9pZCBwY2lfZW5hYmxlX2ludHgoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTE2IHBjaV9jb21tYW5kOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZwY2lfY29tbWFuZCk7CisJaWYgKHBjaV9jb21tYW5kICYgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKSB7CisJCXBjaV9jb21tYW5kICY9IH5QQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEU7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NvbW1hbmQpOworCX0KK30KKworc3RhdGljIGludCB1bGlfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQ7CisJc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaTsKKwlpbnQgcmM7CisJdW5zaWduZWQgaW50IGJvYXJkX2lkeCA9ICh1bnNpZ25lZCBpbnQpIGVudC0+ZHJpdmVyX2RhdGE7CisJaW50IHBjaV9kZXZfYnVzeSA9IDA7CisKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmMpIHsKKwkJcGNpX2Rldl9idXN5ID0gMTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCisJcHBpID0gJnVsaV9wb3J0X2luZm87CisJcHJvYmVfZW50ID0gYXRhX3BjaV9pbml0X25hdGl2ZV9tb2RlKHBkZXYsICZwcGkpOworCWlmICghcHJvYmVfZW50KSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJfQorCQorCXN3aXRjaCAoYm9hcmRfaWR4KSB7CisJY2FzZSB1bGlfNTI4NzoKKwkJcHJvYmVfZW50LT5wb3J0WzBdLnNjcl9hZGRyID0gVUxJNTI4N19CQVNFOworCQlwcm9iZV9lbnQtPnBvcnRbMV0uc2NyX2FkZHIgPSBVTEk1Mjg3X0JBU0UgKyBVTEk1Mjg3X09GRlM7CisgICAgICAgCQlwcm9iZV9lbnQtPm5fcG9ydHMgPSA0OworCisgICAgICAgCQlwcm9iZV9lbnQtPnBvcnRbMl0uY21kX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCkgKyA4OworCQlwcm9iZV9lbnQtPnBvcnRbMl0uYWx0c3RhdHVzX2FkZHIgPQorCQlwcm9iZV9lbnQtPnBvcnRbMl0uY3RsX2FkZHIgPQorCQkJKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKSB8IEFUQV9QQ0lfQ1RMX09GUykgKyA0OworCQlwcm9iZV9lbnQtPnBvcnRbMl0uYm1kbWFfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA0KSArIDE2OworCQlwcm9iZV9lbnQtPnBvcnRbMl0uc2NyX2FkZHIgPSBVTEk1Mjg3X0JBU0UgKyBVTEk1Mjg3X09GRlMqNDsKKworCQlwcm9iZV9lbnQtPnBvcnRbM10uY21kX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMikgKyA4OworCQlwcm9iZV9lbnQtPnBvcnRbM10uYWx0c3RhdHVzX2FkZHIgPQorCQlwcm9iZV9lbnQtPnBvcnRbM10uY3RsX2FkZHIgPQorCQkJKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKSB8IEFUQV9QQ0lfQ1RMX09GUykgKyA0OworCQlwcm9iZV9lbnQtPnBvcnRbM10uYm1kbWFfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA0KSArIDI0OworCQlwcm9iZV9lbnQtPnBvcnRbM10uc2NyX2FkZHIgPSBVTEk1Mjg3X0JBU0UgKyBVTEk1Mjg3X09GRlMqNTsKKworCQlhdGFfc3RkX3BvcnRzKCZwcm9iZV9lbnQtPnBvcnRbMl0pOworCQlhdGFfc3RkX3BvcnRzKCZwcm9iZV9lbnQtPnBvcnRbM10pOworCQlicmVhazsKKworCWNhc2UgdWxpXzUyODk6CisJCXByb2JlX2VudC0+cG9ydFswXS5zY3JfYWRkciA9IFVMSTUyODdfQkFTRTsKKwkJcHJvYmVfZW50LT5wb3J0WzFdLnNjcl9hZGRyID0gVUxJNTI4N19CQVNFICsgVUxJNTI4N19PRkZTOworCQlicmVhazsKKworCWNhc2UgdWxpXzUyODE6CisJCXByb2JlX2VudC0+cG9ydFswXS5zY3JfYWRkciA9IFVMSTUyODFfQkFTRTsKKwkJcHJvYmVfZW50LT5wb3J0WzFdLnNjcl9hZGRyID0gVUxJNTI4MV9CQVNFICsgVUxJNTI4MV9PRkZTOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCQlicmVhazsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlwY2lfZW5hYmxlX2ludHgocGRldik7CisKKwkvKiBGSVhNRTogY2hlY2sgYXRhX2RldmljZV9hZGQgcmV0dXJuIHZhbHVlICovCisJYXRhX2RldmljZV9hZGQocHJvYmVfZW50KTsKKwlrZnJlZShwcm9iZV9lbnQpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCitlcnJfb3V0OgorCWlmICghcGNpX2Rldl9idXN5KQorCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIHJjOworCit9CisKK3N0YXRpYyBpbnQgX19pbml0IHVsaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmdWxpX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdWxpX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnVsaV9wY2lfZHJpdmVyKTsKK30KKworCittb2R1bGVfaW5pdCh1bGlfaW5pdCk7Cittb2R1bGVfZXhpdCh1bGlfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV92aWEuYyBiL2RyaXZlcnMvc2NzaS9zYXRhX3ZpYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNzgzMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2F0YV92aWEuYwpAQCAtMCwwICsxLDM4NyBAQAorLyoKKyAgIHNhdGFfdmlhLmMgLSBWSUEgU2VyaWFsIEFUQSBjb250cm9sbGVycworCisgICBNYWludGFpbmVkIGJ5OiAgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorICAgCQkgICBQbGVhc2UgQUxXQVlTIGNvcHkgbGludXgtaWRlQHZnZXIua2VybmVsLm9yZworIAkJICAgb24gZW1haWxzLgorCisgICBDb3B5cmlnaHQgMjAwMy0yMDA0IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICBDb3B5cmlnaHQgMjAwMy0yMDA0IEplZmYgR2FyemlrCisKKyAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE9wZW4KKyAgIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjEgdGhhdCBjYW4gYmUgZm91bmQgYXQKKyAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLTEuMS50eHQgYW5kIGlzIGluY2x1ZGVkIGhlcmVpbgorICAgYnkgcmVmZXJlbmNlLgorCisgICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcworICAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSBhcyBkaXN0cmlidXRlZAorICAgaW4gdGhlIGtlcm5lbCBzb3VyY2UgQ09QWUlORyBmaWxlLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mCisgICB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cKKyAgIHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAgIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgorICAgdGhlIE9TTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKKyAgIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4KKyAgIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIKKyAgIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUgT1NMIG9yIHRoZSBHUEwuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgVG8tZG8gbGlzdDoKKyAgICogVlQ2NDIxIFBBVEEgc3VwcG9ydAorCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIERSVl9OQU1FCSJzYXRhX3ZpYSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMSIKKworZW51bSBib2FyZF9pZHNfZW51bSB7CisJdnQ2NDIwLAorCXZ0NjQyMSwKK307CisKK2VudW0geworCVNBVEFfQ0hBTl9FTkFCCQk9IDB4NDAsIC8qIFNBVEEgY2hhbm5lbCBlbmFibGUgKi8KKwlTQVRBX0lOVF9HQVRFCQk9IDB4NDEsIC8qIFNBVEEgaW50ZXJydXB0IGdhdGluZyAqLworCVNBVEFfTkFUSVZFX01PREUJPSAweDQyLCAvKiBOYXRpdmUgbW9kZSBlbmFibGUgKi8KKwlTQVRBX1BBVEFfU0hBUklORwk9IDB4NDksIC8qIFBBVEEvU0FUQSBzaGFyaW5nIGZ1bmMgY3RybCAqLworCisJUE9SVDAJCQk9ICgxIDw8IDEpLAorCVBPUlQxCQkJPSAoMSA8PCAwKSwKKwlBTExfUE9SVFMJCT0gUE9SVDAgfCBQT1JUMSwKKwlOX1BPUlRTCQkJPSAyLAorCisJTkFUSVZFX01PREVfQUxMCQk9ICgxIDw8IDcpIHwgKDEgPDwgNikgfCAoMSA8PCA1KSB8ICgxIDw8IDQpLAorCisJU0FUQV9FWFRfUEhZCQk9ICgxIDw8IDYpLCAvKiAwPT11c2UgUEFUQSwgMT09ZXh0IHBoeSAqLworCVNBVEFfMkRFVgkJPSAoMSA8PCA1KSwgLyogU0FUQSBpcyBtYXN0ZXIvc2xhdmUgKi8KK307CisKK3N0YXRpYyBpbnQgc3ZpYV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworc3RhdGljIHUzMiBzdmlhX3Njcl9yZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKTsKK3N0YXRpYyB2b2lkIHN2aWFfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHN2aWFfcGNpX3RibFtdID0geworCXsgMHgxMTA2LCAweDMxNDksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHZ0NjQyMCB9LAorCXsgMHgxMTA2LCAweDMyNDksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHZ0NjQyMSB9LAorCisJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc3ZpYV9wY2lfZHJpdmVyID0geworCS5uYW1lCQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJCT0gc3ZpYV9wY2lfdGJsLAorCS5wcm9iZQkJCT0gc3ZpYV9pbml0X29uZSwKKwkucmVtb3ZlCQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCit9OworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIHN2aWFfc2h0ID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSBEUlZfTkFNRSwKKwkuaW9jdGwJCQk9IGF0YV9zY3NpX2lvY3RsLAorCS5xdWV1ZWNvbW1hbmQJCT0gYXRhX3Njc2lfcXVldWVjbWQsCisJLmVoX3N0cmF0ZWd5X2hhbmRsZXIJPSBhdGFfc2NzaV9lcnJvciwKKwkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCisJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAorCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCisJLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKKwkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKKwkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKKwkucHJvY19uYW1lCQk9IERSVl9OQU1FLAorCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKKwkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkub3JkZXJlZF9mbHVzaAkJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHN2aWFfc2F0YV9vcHMgPSB7CisJLnBvcnRfZGlzYWJsZQkJPSBhdGFfcG9ydF9kaXNhYmxlLAorCisJLnRmX2xvYWQJCT0gYXRhX3RmX2xvYWQsCisJLnRmX3JlYWQJCT0gYXRhX3RmX3JlYWQsCisJLmNoZWNrX3N0YXR1cwkJPSBhdGFfY2hlY2tfc3RhdHVzLAorCS5leGVjX2NvbW1hbmQJCT0gYXRhX2V4ZWNfY29tbWFuZCwKKwkuZGV2X3NlbGVjdAkJPSBhdGFfc3RkX2Rldl9zZWxlY3QsCisKKwkucGh5X3Jlc2V0CQk9IHNhdGFfcGh5X3Jlc2V0LAorCisJLmJtZG1hX3NldHVwICAgICAgICAgICAgPSBhdGFfYm1kbWFfc2V0dXAsCisJLmJtZG1hX3N0YXJ0ICAgICAgICAgICAgPSBhdGFfYm1kbWFfc3RhcnQsCisJLmJtZG1hX3N0b3AJCT0gYXRhX2JtZG1hX3N0b3AsCisJLmJtZG1hX3N0YXR1cwkJPSBhdGFfYm1kbWFfc3RhdHVzLAorCisJLnFjX3ByZXAJCT0gYXRhX3FjX3ByZXAsCisJLnFjX2lzc3VlCQk9IGF0YV9xY19pc3N1ZV9wcm90LAorCisJLmVuZ190aW1lb3V0CQk9IGF0YV9lbmdfdGltZW91dCwKKworCS5pcnFfaGFuZGxlcgkJPSBhdGFfaW50ZXJydXB0LAorCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKKworCS5zY3JfcmVhZAkJPSBzdmlhX3Njcl9yZWFkLAorCS5zY3Jfd3JpdGUJCT0gc3ZpYV9zY3Jfd3JpdGUsCisKKwkucG9ydF9zdGFydAkJPSBhdGFfcG9ydF9zdGFydCwKKwkucG9ydF9zdG9wCQk9IGF0YV9wb3J0X3N0b3AsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gc3ZpYV9wb3J0X2luZm8gPSB7CisJLnNodAkJPSAmc3ZpYV9zaHQsCisJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfU1JTVCB8IEFUQV9GTEFHX05PX0xFR0FDWSwKKwkucGlvX21hc2sJPSAweDFmLAorCS5td2RtYV9tYXNrCT0gMHgwNywKKwkudWRtYV9tYXNrCT0gMHg3ZiwKKwkucG9ydF9vcHMJPSAmc3ZpYV9zYXRhX29wcywKK307CisKK01PRFVMRV9BVVRIT1IoIkplZmYgR2FyemlrIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNDU0kgbG93LWxldmVsIGRyaXZlciBmb3IgVklBIFNBVEEgY29udHJvbGxlcnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzdmlhX3BjaV90YmwpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCitzdGF0aWMgdTMyIHN2aWFfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpCit7CisJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQorCQlyZXR1cm4gMHhmZmZmZmZmZlU7CisJcmV0dXJuIGlubChhcC0+aW9hZGRyLnNjcl9hZGRyICsgKDQgKiBzY19yZWcpKTsKK30KKworc3RhdGljIHZvaWQgc3ZpYV9zY3Jfd3JpdGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpCit7CisJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQorCQlyZXR1cm47CisJb3V0bCh2YWwsIGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoNCAqIHNjX3JlZykpOworfQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHN2aWFfYmFyX3NpemVzW10gPSB7CisJOCwgNCwgOCwgNCwgMTYsIDI1NgorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2dDY0MjFfYmFyX3NpemVzW10gPSB7CisJMTYsIDE2LCAxNiwgMTYsIDMyLCAxMjgKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN2aWFfc2NyX2FkZHIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgcG9ydCkKK3sKKwlyZXR1cm4gYWRkciArIChwb3J0ICogMTI4KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdnQ2NDIxX3Njcl9hZGRyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgaW50IHBvcnQpCit7CisJcmV0dXJuIGFkZHIgKyAocG9ydCAqIDY0KTsKK30KKworc3RhdGljIHZvaWQgdnQ2NDIxX2luaXRfYWRkcnMoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCwKKwkJCSAgICAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJICAgICAgdW5zaWduZWQgaW50IHBvcnQpCit7CisJdW5zaWduZWQgbG9uZyByZWdfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBwb3J0KTsKKwl1bnNpZ25lZCBsb25nIGJtZG1hX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNCkgKyAocG9ydCAqIDgpOworCXVuc2lnbmVkIGxvbmcgc2NyX2FkZHI7CisKKwlwcm9iZV9lbnQtPnBvcnRbcG9ydF0uY21kX2FkZHIgPSByZWdfYWRkcjsKKwlwcm9iZV9lbnQtPnBvcnRbcG9ydF0uYWx0c3RhdHVzX2FkZHIgPQorCXByb2JlX2VudC0+cG9ydFtwb3J0XS5jdGxfYWRkciA9IChyZWdfYWRkciArIDgpIHwgQVRBX1BDSV9DVExfT0ZTOworCXByb2JlX2VudC0+cG9ydFtwb3J0XS5ibWRtYV9hZGRyID0gYm1kbWFfYWRkcjsKKworCXNjcl9hZGRyID0gdnQ2NDIxX3Njcl9hZGRyKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA1KSwgcG9ydCk7CisJcHJvYmVfZW50LT5wb3J0W3BvcnRdLnNjcl9hZGRyID0gc2NyX2FkZHI7CisKKwlhdGFfc3RkX3BvcnRzKCZwcm9iZV9lbnQtPnBvcnRbcG9ydF0pOworfQorCitzdGF0aWMgc3RydWN0IGF0YV9wcm9iZV9lbnQgKnZ0NjQyMF9pbml0X3Byb2JlX2VudChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50OworCXN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGkgPSAmc3ZpYV9wb3J0X2luZm87CisKKwlwcm9iZV9lbnQgPSBhdGFfcGNpX2luaXRfbmF0aXZlX21vZGUocGRldiwgJnBwaSk7CisJaWYgKCFwcm9iZV9lbnQpCisJCXJldHVybiBOVUxMOworCisJcHJvYmVfZW50LT5wb3J0WzBdLnNjcl9hZGRyID0KKwkJc3ZpYV9zY3JfYWRkcihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNSksIDApOworCXByb2JlX2VudC0+cG9ydFsxXS5zY3JfYWRkciA9CisJCXN2aWFfc2NyX2FkZHIocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDUpLCAxKTsKKworCXJldHVybiBwcm9iZV9lbnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqdnQ2NDIxX2luaXRfcHJvYmVfZW50KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQ7CisJdW5zaWduZWQgaW50IGk7CisKKwlwcm9iZV9lbnQgPSBrbWFsbG9jKHNpemVvZigqcHJvYmVfZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcm9iZV9lbnQpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KHByb2JlX2VudCwgMCwgc2l6ZW9mKCpwcm9iZV9lbnQpKTsKKwlwcm9iZV9lbnQtPmRldiA9IHBjaV9kZXZfdG9fZGV2KHBkZXYpOworCUlOSVRfTElTVF9IRUFEKCZwcm9iZV9lbnQtPm5vZGUpOworCisJcHJvYmVfZW50LT5zaHQJCT0gJnN2aWFfc2h0OworCXByb2JlX2VudC0+aG9zdF9mbGFncwk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19TQVRBX1JFU0VUIHwKKwkJCQkgIEFUQV9GTEFHX05PX0xFR0FDWTsKKwlwcm9iZV9lbnQtPnBvcnRfb3BzCT0gJnN2aWFfc2F0YV9vcHM7CisJcHJvYmVfZW50LT5uX3BvcnRzCT0gTl9QT1JUUzsKKwlwcm9iZV9lbnQtPmlycQkJPSBwZGV2LT5pcnE7CisJcHJvYmVfZW50LT5pcnFfZmxhZ3MJPSBTQV9TSElSUTsKKwlwcm9iZV9lbnQtPnBpb19tYXNrCT0gMHgxZjsKKwlwcm9iZV9lbnQtPm13ZG1hX21hc2sJPSAweDA3OworCXByb2JlX2VudC0+dWRtYV9tYXNrCT0gMHg3ZjsKKworCWZvciAoaSA9IDA7IGkgPCBOX1BPUlRTOyBpKyspCisJCXZ0NjQyMV9pbml0X2FkZHJzKHByb2JlX2VudCwgcGRldiwgaSk7CisKKwlyZXR1cm4gcHJvYmVfZW50OworfQorCitzdGF0aWMgdm9pZCBzdmlhX2NvbmZpZ3VyZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1OCB0bXA4OworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCAmdG1wOCk7CisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiKCVzKTogcm91dGVkIHRvIGhhcmQgaXJxIGxpbmUgJWRcbiIsCisJICAgICAgIHBjaV9uYW1lKHBkZXYpLAorCSAgICAgICAoaW50KSAodG1wOCAmIDB4ZjApID09IDB4ZjAgPyAwIDogdG1wOCAmIDB4MGYpOworCisJLyogbWFrZSBzdXJlIFNBVEEgY2hhbm5lbHMgYXJlIGVuYWJsZWQgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBTQVRBX0NIQU5fRU5BQiwgJnRtcDgpOworCWlmICgodG1wOCAmIEFMTF9QT1JUUykgIT0gQUxMX1BPUlRTKSB7CisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIoJXMpOiBlbmFibGluZyBTQVRBIGNoYW5uZWxzICgweCV4KVxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpLCAoaW50KSB0bXA4KTsKKwkJdG1wOCB8PSBBTExfUE9SVFM7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBTQVRBX0NIQU5fRU5BQiwgdG1wOCk7CisJfQorCisJLyogbWFrZSBzdXJlIGludGVycnVwdHMgZm9yIGVhY2ggY2hhbm5lbCBzZW50IHRvIHVzICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgU0FUQV9JTlRfR0FURSwgJnRtcDgpOworCWlmICgodG1wOCAmIEFMTF9QT1JUUykgIT0gQUxMX1BPUlRTKSB7CisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIoJXMpOiBlbmFibGluZyBTQVRBIGNoYW5uZWwgaW50ZXJydXB0cyAoMHgleClcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSwgKGludCkgdG1wOCk7CisJCXRtcDggfD0gQUxMX1BPUlRTOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgU0FUQV9JTlRfR0FURSwgdG1wOCk7CisJfQorCisJLyogbWFrZSBzdXJlIG5hdGl2ZSBtb2RlIGlzIGVuYWJsZWQgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBTQVRBX05BVElWRV9NT0RFLCAmdG1wOCk7CisJaWYgKCh0bXA4ICYgTkFUSVZFX01PREVfQUxMKSAhPSBOQVRJVkVfTU9ERV9BTEwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIiglcyk6IGVuYWJsaW5nIFNBVEEgY2hhbm5lbCBuYXRpdmUgbW9kZSAoMHgleClcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSwgKGludCkgdG1wOCk7CisJCXRtcDggfD0gTkFUSVZFX01PREVfQUxMOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgU0FUQV9OQVRJVkVfTU9ERSwgdG1wOCk7CisJfQorfQorCitzdGF0aWMgaW50IHN2aWFfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCXVuc2lnbmVkIGludCBpOworCWludCByYzsKKwlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50OworCWludCBib2FyZF9pZCA9IChpbnQpIGVudC0+ZHJpdmVyX2RhdGE7CisJY29uc3QgaW50ICpiYXJfc2l6ZXM7CisJaW50IHBjaV9kZXZfYnVzeSA9IDA7CisJdTggdG1wODsKKworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKHJjKSB7CisJCXBjaV9kZXZfYnVzeSA9IDE7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlpZiAoYm9hcmRfaWQgPT0gdnQ2NDIwKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFNBVEFfUEFUQV9TSEFSSU5HLCAmdG1wOCk7CisJCWlmICh0bXA4ICYgU0FUQV8yREVWKSB7CisJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIiglcyk6IFNBVEEgbWFzdGVyL3NsYXZlIG5vdCBzdXBwb3J0ZWQgKDB4JXgpXG4iLAorCQkgICAgICAgCXBjaV9uYW1lKHBkZXYpLCAoaW50KSB0bXA4KTsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gZXJyX291dF9yZWdpb25zOworCQl9CisKKwkJYmFyX3NpemVzID0gJnN2aWFfYmFyX3NpemVzWzBdOworCX0gZWxzZSB7CisJCWJhcl9zaXplcyA9ICZ2dDY0MjFfYmFyX3NpemVzWzBdOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN2aWFfYmFyX3NpemVzKTsgaSsrKQorCQlpZiAoKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBpKSA9PSAwKSB8fAorCQkgICAgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaSkgPCBiYXJfc2l6ZXNbaV0pKSB7CisJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIiglcyk6IGludmFsaWQgUENJIEJBUiAldSAoc3ogMHglbHgsIHZhbCAweCVseClcbiIsCisJCQkgICAgICAgcGNpX25hbWUocGRldiksIGksCisJCQkgICAgICAgcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGkpLAorCQkJICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaSkpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJCX0KKworCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCisJaWYgKGJvYXJkX2lkID09IHZ0NjQyMCkKKwkJcHJvYmVfZW50ID0gdnQ2NDIwX2luaXRfcHJvYmVfZW50KHBkZXYpOworCWVsc2UKKwkJcHJvYmVfZW50ID0gdnQ2NDIxX2luaXRfcHJvYmVfZW50KHBkZXYpOworCQorCWlmICghcHJvYmVfZW50KSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiKCVzKTogb3V0IG9mIG1lbW9yeVxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwl9CisKKwlzdmlhX2NvbmZpZ3VyZShwZGV2KTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJLyogRklYTUU6IGNoZWNrIGF0YV9kZXZpY2VfYWRkIHJldHVybiB2YWx1ZSAqLworCWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCk7CisJa2ZyZWUocHJvYmVfZW50KTsKKworCXJldHVybiAwOworCitlcnJfb3V0X3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXQ6CisJaWYgKCFwY2lfZGV2X2J1c3kpCisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHN2aWFfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnN2aWFfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzdmlhX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnN2aWFfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHN2aWFfaW5pdCk7Cittb2R1bGVfZXhpdChzdmlhX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV92c2MuYyBiL2RyaXZlcnMvc2NzaS9zYXRhX3ZzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMjhmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2F0YV92c2MuYwpAQCAtMCwwICsxLDQwNyBAQAorLyoKKyAqICBzYXRhX3ZzYy5jIC0gVml0ZXNzZSBWU0M3MTc0IDQgcG9ydCBEUEEgU0FUQQorICoKKyAqICBNYWludGFpbmVkIGJ5OiAgSmVyZW15IEhpZ2RvbiBAIFNHSQorICogCQkgICAgUGxlYXNlIEFMV0FZUyBjb3B5IGxpbnV4LWlkZUB2Z2VyLmtlcm5lbC5vcmcKKyAqCQkgICAgb24gZW1haWxzLgorICoKKyAqICBDb3B5cmlnaHQgMjAwNCBTR0kKKyAqCisgKiAgQml0cyBmcm9tIEplZmYgR2FyemlrLCBDb3B5cmlnaHQgUmVkSGF0LCBJbmMuCisgKgorICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorCisjZGVmaW5lIERSVl9OQU1FCSJzYXRhX3ZzYyIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMCIKKworLyogSW50ZXJydXB0IHJlZ2lzdGVyIG9mZnNldHMgKGZyb20gY2hpcCBiYXNlIGFkZHJlc3MpICovCisjZGVmaW5lIFZTQ19TQVRBX0lOVF9TVEFUX09GRlNFVAkweDAwCisjZGVmaW5lIFZTQ19TQVRBX0lOVF9NQVNLX09GRlNFVAkweDA0CisKKy8qIFRhc2tmaWxlIHJlZ2lzdGVycyBvZmZzZXRzICovCisjZGVmaW5lIFZTQ19TQVRBX1RGX0NNRF9PRkZTRVQJCTB4MDAKKyNkZWZpbmUgVlNDX1NBVEFfVEZfREFUQV9PRkZTRVQJCTB4MDAKKyNkZWZpbmUgVlNDX1NBVEFfVEZfRVJST1JfT0ZGU0VUCTB4MDQKKyNkZWZpbmUgVlNDX1NBVEFfVEZfRkVBVFVSRV9PRkZTRVQJMHgwNgorI2RlZmluZSBWU0NfU0FUQV9URl9OU0VDVF9PRkZTRVQJMHgwOAorI2RlZmluZSBWU0NfU0FUQV9URl9MQkFMX09GRlNFVAkJMHgwYworI2RlZmluZSBWU0NfU0FUQV9URl9MQkFNX09GRlNFVAkJMHgxMAorI2RlZmluZSBWU0NfU0FUQV9URl9MQkFIX09GRlNFVAkJMHgxNAorI2RlZmluZSBWU0NfU0FUQV9URl9ERVZJQ0VfT0ZGU0VUCTB4MTgKKyNkZWZpbmUgVlNDX1NBVEFfVEZfU1RBVFVTX09GRlNFVAkweDFjCisjZGVmaW5lIFZTQ19TQVRBX1RGX0NPTU1BTkRfT0ZGU0VUCTB4MWQKKyNkZWZpbmUgVlNDX1NBVEFfVEZfQUxUU1RBVFVTX09GRlNFVAkweDI4CisjZGVmaW5lIFZTQ19TQVRBX1RGX0NUTF9PRkZTRVQJCTB4MjkKKworLyogRE1BIGJhc2UgKi8KKyNkZWZpbmUgVlNDX1NBVEFfVVBfREVTQ1JJUFRPUl9PRkZTRVQJMHg2NAorI2RlZmluZSBWU0NfU0FUQV9VUF9EQVRBX0JVRkZFUl9PRkZTRVQJMHg2QworI2RlZmluZSBWU0NfU0FUQV9ETUFfQ01EX09GRlNFVAkJMHg3MAorCisvKiBTQ1JzIGJhc2UgKi8KKyNkZWZpbmUgVlNDX1NBVEFfU0NSX1NUQVRVU19PRkZTRVQJMHgxMDAKKyNkZWZpbmUgVlNDX1NBVEFfU0NSX0VSUk9SX09GRlNFVAkweDEwNAorI2RlZmluZSBWU0NfU0FUQV9TQ1JfQ09OVFJPTF9PRkZTRVQJMHgxMDgKKworLyogUG9ydCBzdHJpZGUgKi8KKyNkZWZpbmUgVlNDX1NBVEFfUE9SVF9PRkZTRVQJCTB4MjAwCisKKworc3RhdGljIHUzMiB2c2Nfc2F0YV9zY3JfcmVhZCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZykKK3sKKwlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpCisJCXJldHVybiAweGZmZmZmZmZmVTsKKwlyZXR1cm4gcmVhZGwoKHZvaWQgKikgYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7Cit9CisKKworc3RhdGljIHZvaWQgdnNjX3NhdGFfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLAorCQkJICAgICAgIHUzMiB2YWwpCit7CisJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQorCQlyZXR1cm47CisJd3JpdGVsKHZhbCwgKHZvaWQgKikgYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7Cit9CisKKworc3RhdGljIHZvaWQgdnNjX2ludHJfbWFza191cGRhdGUoc3RydWN0IGF0YV9wb3J0ICphcCwgdTggY3RsKQoreworCXVuc2lnbmVkIGxvbmcgbWFza19hZGRyOworCXU4IG1hc2s7CisKKwltYXNrX2FkZHIgPSAodW5zaWduZWQgbG9uZykgYXAtPmhvc3Rfc2V0LT5tbWlvX2Jhc2UgKworCQlWU0NfU0FUQV9JTlRfTUFTS19PRkZTRVQgKyBhcC0+cG9ydF9ubzsKKwltYXNrID0gcmVhZGIobWFza19hZGRyKTsKKwlpZiAoY3RsICYgQVRBX05JRU4pCisJCW1hc2sgfD0gMHg4MDsKKwllbHNlCisJCW1hc2sgJj0gMHg3RjsKKwl3cml0ZWIobWFzaywgbWFza19hZGRyKTsKK30KKworCitzdGF0aWMgdm9pZCB2c2Nfc2F0YV90Zl9sb2FkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCXN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyID0gJmFwLT5pb2FkZHI7CisJdW5zaWduZWQgaW50IGlzX2FkZHIgPSB0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfSVNBRERSOworCisJLyoKKwkgKiBUaGUgb25seSB0aGluZyB0aGUgY3RsIHJlZ2lzdGVyIGlzIHVzZWQgZm9yIGlzIFNSU1QuCisJICogVGhhdCBpcyBub3QgZW5hYmxlZCBvciBkaXNhYmxlZCB2aWEgdGZfbG9hZC4KKwkgKiBIb3dldmVyLCBpZiBBVEFfTklFTiBpcyBjaGFuZ2VkLCB0aGVuIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIuCisJICovCisJaWYgKCh0Zi0+Y3RsICYgQVRBX05JRU4pICE9IChhcC0+bGFzdF9jdGwgJiBBVEFfTklFTikpIHsKKwkJYXAtPmxhc3RfY3RsID0gdGYtPmN0bDsKKwkJdnNjX2ludHJfbWFza191cGRhdGUoYXAsIHRmLT5jdGwgJiBBVEFfTklFTik7CisJfQorCWlmIChpc19hZGRyICYmICh0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfTEJBNDgpKSB7CisJCXdyaXRldyh0Zi0+ZmVhdHVyZSB8ICgoKHUxNil0Zi0+aG9iX2ZlYXR1cmUpIDw8IDgpLCBpb2FkZHItPmZlYXR1cmVfYWRkcik7CisJCXdyaXRldyh0Zi0+bnNlY3QgfCAoKCh1MTYpdGYtPmhvYl9uc2VjdCkgPDwgOCksIGlvYWRkci0+bnNlY3RfYWRkcik7CisJCXdyaXRldyh0Zi0+bGJhbCB8ICgoKHUxNil0Zi0+aG9iX2xiYWwpIDw8IDgpLCBpb2FkZHItPmxiYWxfYWRkcik7CisJCXdyaXRldyh0Zi0+bGJhbSB8ICgoKHUxNil0Zi0+aG9iX2xiYW0pIDw8IDgpLCBpb2FkZHItPmxiYW1fYWRkcik7CisJCXdyaXRldyh0Zi0+bGJhaCB8ICgoKHUxNil0Zi0+aG9iX2xiYWgpIDw8IDgpLCBpb2FkZHItPmxiYWhfYWRkcik7CisJfSBlbHNlIGlmIChpc19hZGRyKSB7CisJCXdyaXRldyh0Zi0+ZmVhdHVyZSwgaW9hZGRyLT5mZWF0dXJlX2FkZHIpOworCQl3cml0ZXcodGYtPm5zZWN0LCBpb2FkZHItPm5zZWN0X2FkZHIpOworCQl3cml0ZXcodGYtPmxiYWwsIGlvYWRkci0+bGJhbF9hZGRyKTsKKwkJd3JpdGV3KHRmLT5sYmFtLCBpb2FkZHItPmxiYW1fYWRkcik7CisJCXdyaXRldyh0Zi0+bGJhaCwgaW9hZGRyLT5sYmFoX2FkZHIpOworCX0KKworCWlmICh0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfREVWSUNFKQorCQl3cml0ZWIodGYtPmRldmljZSwgaW9hZGRyLT5kZXZpY2VfYWRkcik7CisKKwlhdGFfd2FpdF9pZGxlKGFwKTsKK30KKworCitzdGF0aWMgdm9pZCB2c2Nfc2F0YV90Zl9yZWFkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCXN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyID0gJmFwLT5pb2FkZHI7CisJdTE2IG5zZWN0LCBsYmFsLCBsYmFtLCBsYmFoOworCisJbnNlY3QgPSB0Zi0+bnNlY3QgPSByZWFkdyhpb2FkZHItPm5zZWN0X2FkZHIpOworCWxiYWwgPSB0Zi0+bGJhbCA9IHJlYWR3KGlvYWRkci0+bGJhbF9hZGRyKTsKKwlsYmFtID0gdGYtPmxiYW0gPSByZWFkdyhpb2FkZHItPmxiYW1fYWRkcik7CisJbGJhaCA9IHRmLT5sYmFoID0gcmVhZHcoaW9hZGRyLT5sYmFoX2FkZHIpOworCXRmLT5kZXZpY2UgPSByZWFkdyhpb2FkZHItPmRldmljZV9hZGRyKTsKKworCWlmICh0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfTEJBNDgpIHsKKwkJdGYtPmhvYl9mZWF0dXJlID0gcmVhZGIoaW9hZGRyLT5lcnJvcl9hZGRyKTsKKwkJdGYtPmhvYl9uc2VjdCA9IG5zZWN0ID4+IDg7CisJCXRmLT5ob2JfbGJhbCA9IGxiYWwgPj4gODsKKwkJdGYtPmhvYl9sYmFtID0gbGJhbSA+PiA4OworCQl0Zi0+aG9iX2xiYWggPSBsYmFoID4+IDg7CisgICAgICAgIH0KK30KKworCisvKgorICogdnNjX3NhdGFfaW50ZXJydXB0CisgKgorICogUmVhZCB0aGUgaW50ZXJydXB0IHJlZ2lzdGVyIGFuZCBwcm9jZXNzIGZvciB0aGUgZGV2aWNlcyB0aGF0IGhhdmUgdGhlbSBwZW5kaW5nLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgdnNjX3NhdGFfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCisJCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0ID0gZGV2X2luc3RhbmNlOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKKwl1MzIgaW50X3N0YXR1czsKKworCXNwaW5fbG9jaygmaG9zdF9zZXQtPmxvY2spOworCisJaW50X3N0YXR1cyA9IHJlYWRsKGhvc3Rfc2V0LT5tbWlvX2Jhc2UgKyBWU0NfU0FUQV9JTlRfU1RBVF9PRkZTRVQpOworCisJZm9yIChpID0gMDsgaSA8IGhvc3Rfc2V0LT5uX3BvcnRzOyBpKyspIHsKKwkJaWYgKGludF9zdGF0dXMgJiAoKHUzMikgMHhGRiA8PCAoOCAqIGkpKSkgeworCQkJc3RydWN0IGF0YV9wb3J0ICphcDsKKworCQkJYXAgPSBob3N0X3NldC0+cG9ydHNbaV07CisJCQlpZiAoYXAgJiYgKCEoYXAtPmZsYWdzICYgQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRCkpKSB7CisJCQkJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKKworCQkJCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7CisJCQkJaWYgKHFjICYmICghKHFjLT50Zi5jdGwgJiBBVEFfTklFTikpKQorCQkJCQloYW5kbGVkICs9IGF0YV9ob3N0X2ludHIoYXAsIHFjKTsKKwkJCX0KKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZob3N0X3NldC0+bG9jayk7CisKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIHZzY19zYXRhX3NodCA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlvY3RsCQkJPSBhdGFfc2NzaV9pb2N0bCwKKwkucXVldWVjb21tYW5kCQk9IGF0YV9zY3NpX3F1ZXVlY21kLAorCS5laF9zdHJhdGVneV9oYW5kbGVyCT0gYXRhX3Njc2lfZXJyb3IsCisJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAorCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKKwkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAorCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCisJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCisJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCisJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKKwkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCisJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLm9yZGVyZWRfZmx1c2gJCT0gMSwKK307CisKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHZzY19zYXRhX29wcyA9IHsKKwkucG9ydF9kaXNhYmxlCQk9IGF0YV9wb3J0X2Rpc2FibGUsCisJLnRmX2xvYWQJCT0gdnNjX3NhdGFfdGZfbG9hZCwKKwkudGZfcmVhZAkJPSB2c2Nfc2F0YV90Zl9yZWFkLAorCS5leGVjX2NvbW1hbmQJCT0gYXRhX2V4ZWNfY29tbWFuZCwKKwkuY2hlY2tfc3RhdHVzCQk9IGF0YV9jaGVja19zdGF0dXMsCisJLmRldl9zZWxlY3QJCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAorCS5waHlfcmVzZXQJCT0gc2F0YV9waHlfcmVzZXQsCisJLmJtZG1hX3NldHVwICAgICAgICAgICAgPSBhdGFfYm1kbWFfc2V0dXAsCisJLmJtZG1hX3N0YXJ0ICAgICAgICAgICAgPSBhdGFfYm1kbWFfc3RhcnQsCisJLmJtZG1hX3N0b3AJCT0gYXRhX2JtZG1hX3N0b3AsCisJLmJtZG1hX3N0YXR1cwkJPSBhdGFfYm1kbWFfc3RhdHVzLAorCS5xY19wcmVwCQk9IGF0YV9xY19wcmVwLAorCS5xY19pc3N1ZQkJPSBhdGFfcWNfaXNzdWVfcHJvdCwKKwkuZW5nX3RpbWVvdXQJCT0gYXRhX2VuZ190aW1lb3V0LAorCS5pcnFfaGFuZGxlcgkJPSB2c2Nfc2F0YV9pbnRlcnJ1cHQsCisJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAorCS5zY3JfcmVhZAkJPSB2c2Nfc2F0YV9zY3JfcmVhZCwKKwkuc2NyX3dyaXRlCQk9IHZzY19zYXRhX3Njcl93cml0ZSwKKwkucG9ydF9zdGFydAkJPSBhdGFfcG9ydF9zdGFydCwKKwkucG9ydF9zdG9wCQk9IGF0YV9wb3J0X3N0b3AsCit9OworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdnNjX3NhdGFfc2V0dXBfcG9ydChzdHJ1Y3QgYXRhX2lvcG9ydHMgKnBvcnQsIHVuc2lnbmVkIGxvbmcgYmFzZSkKK3sKKwlwb3J0LT5jbWRfYWRkcgkJPSBiYXNlICsgVlNDX1NBVEFfVEZfQ01EX09GRlNFVDsKKwlwb3J0LT5kYXRhX2FkZHIJCT0gYmFzZSArIFZTQ19TQVRBX1RGX0RBVEFfT0ZGU0VUOworCXBvcnQtPmVycm9yX2FkZHIJPSBiYXNlICsgVlNDX1NBVEFfVEZfRVJST1JfT0ZGU0VUOworCXBvcnQtPmZlYXR1cmVfYWRkcgk9IGJhc2UgKyBWU0NfU0FUQV9URl9GRUFUVVJFX09GRlNFVDsKKwlwb3J0LT5uc2VjdF9hZGRyCT0gYmFzZSArIFZTQ19TQVRBX1RGX05TRUNUX09GRlNFVDsKKwlwb3J0LT5sYmFsX2FkZHIJCT0gYmFzZSArIFZTQ19TQVRBX1RGX0xCQUxfT0ZGU0VUOworCXBvcnQtPmxiYW1fYWRkcgkJPSBiYXNlICsgVlNDX1NBVEFfVEZfTEJBTV9PRkZTRVQ7CisJcG9ydC0+bGJhaF9hZGRyCQk9IGJhc2UgKyBWU0NfU0FUQV9URl9MQkFIX09GRlNFVDsKKwlwb3J0LT5kZXZpY2VfYWRkcgk9IGJhc2UgKyBWU0NfU0FUQV9URl9ERVZJQ0VfT0ZGU0VUOworCXBvcnQtPnN0YXR1c19hZGRyCT0gYmFzZSArIFZTQ19TQVRBX1RGX1NUQVRVU19PRkZTRVQ7CisJcG9ydC0+Y29tbWFuZF9hZGRyCT0gYmFzZSArIFZTQ19TQVRBX1RGX0NPTU1BTkRfT0ZGU0VUOworCXBvcnQtPmFsdHN0YXR1c19hZGRyCT0gYmFzZSArIFZTQ19TQVRBX1RGX0FMVFNUQVRVU19PRkZTRVQ7CisJcG9ydC0+Y3RsX2FkZHIJCT0gYmFzZSArIFZTQ19TQVRBX1RGX0NUTF9PRkZTRVQ7CisJcG9ydC0+Ym1kbWFfYWRkcgk9IGJhc2UgKyBWU0NfU0FUQV9ETUFfQ01EX09GRlNFVDsKKwlwb3J0LT5zY3JfYWRkcgkJPSBiYXNlICsgVlNDX1NBVEFfU0NSX1NUQVRVU19PRkZTRVQ7CisJd3JpdGVsKDAsIGJhc2UgKyBWU0NfU0FUQV9VUF9ERVNDUklQVE9SX09GRlNFVCk7CisJd3JpdGVsKDAsIGJhc2UgKyBWU0NfU0FUQV9VUF9EQVRBX0JVRkZFUl9PRkZTRVQpOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZzY19zYXRhX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKwlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJaW50IHBjaV9kZXZfYnVzeSA9IDA7CisJdm9pZCAqbW1pb19iYXNlOworCWludCByYzsKKworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qCisJICogQ2hlY2sgaWYgd2UgaGF2ZSBuZWVkZWQgcmVzb3VyY2UgbWFwcGVkLgorCSAqLworCWlmIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApID09IDApIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmMpIHsKKwkJcGNpX2Rldl9idXN5ID0gMTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qCisJICogVXNlIDMyIGJpdCBETUEgbWFzaywgYmVjYXVzZSA2NCBiaXQgYWRkcmVzcyBzdXBwb3J0IGlzIHBvb3IuCisJICovCisJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCisJcHJvYmVfZW50ID0ga21hbGxvYyhzaXplb2YoKnByb2JlX2VudCksIEdGUF9LRVJORUwpOworCWlmIChwcm9iZV9lbnQgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCX0KKwltZW1zZXQocHJvYmVfZW50LCAwLCBzaXplb2YoKnByb2JlX2VudCkpOworCXByb2JlX2VudC0+ZGV2ID0gcGNpX2Rldl90b19kZXYocGRldik7CisJSU5JVF9MSVNUX0hFQUQoJnByb2JlX2VudC0+bm9kZSk7CisKKwltbWlvX2Jhc2UgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwKKwkJICAgICAgICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CisJaWYgKG1taW9fYmFzZSA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfZW50OworCX0KKwliYXNlID0gKHVuc2lnbmVkIGxvbmcpIG1taW9fYmFzZTsKKworCS8qCisJICogRHVlIHRvIGEgYnVnIGluIHRoZSBjaGlwLCB0aGUgZGVmYXVsdCBjYWNoZSBsaW5lIHNpemUgY2FuJ3QgYmUgdXNlZAorCSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLCAweDgwKTsKKworCXByb2JlX2VudC0+c2h0ID0gJnZzY19zYXRhX3NodDsKKwlwcm9iZV9lbnQtPmhvc3RfZmxhZ3MgPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQlBVEFfRkxBR19NTUlPIHwgQVRBX0ZMQUdfU0FUQV9SRVNFVDsKKwlwcm9iZV9lbnQtPnBvcnRfb3BzID0gJnZzY19zYXRhX29wczsKKwlwcm9iZV9lbnQtPm5fcG9ydHMgPSA0OworCXByb2JlX2VudC0+aXJxID0gcGRldi0+aXJxOworCXByb2JlX2VudC0+aXJxX2ZsYWdzID0gU0FfU0hJUlE7CisJcHJvYmVfZW50LT5tbWlvX2Jhc2UgPSBtbWlvX2Jhc2U7CisKKwkvKiBXZSBkb24ndCBjYXJlIG11Y2ggYWJvdXQgdGhlIFBJTy9VRE1BIG1hc2tzLCBidXQgdGhlIGNvcmUgd29uJ3QgbGlrZSB1cworCSAqIGlmIHdlIGRvbid0IGZpbGwgdGhlc2UKKwkgKi8KKwlwcm9iZV9lbnQtPnBpb19tYXNrID0gMHgxZjsKKwlwcm9iZV9lbnQtPm13ZG1hX21hc2sgPSAweDA3OworCXByb2JlX2VudC0+dWRtYV9tYXNrID0gMHg3ZjsKKworCS8qIFdlIGhhdmUgNCBwb3J0cyBwZXIgUENJIGZ1bmN0aW9uICovCisJdnNjX3NhdGFfc2V0dXBfcG9ydCgmcHJvYmVfZW50LT5wb3J0WzBdLCBiYXNlICsgMSAqIFZTQ19TQVRBX1BPUlRfT0ZGU0VUKTsKKwl2c2Nfc2F0YV9zZXR1cF9wb3J0KCZwcm9iZV9lbnQtPnBvcnRbMV0sIGJhc2UgKyAyICogVlNDX1NBVEFfUE9SVF9PRkZTRVQpOworCXZzY19zYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFsyXSwgYmFzZSArIDMgKiBWU0NfU0FUQV9QT1JUX09GRlNFVCk7CisJdnNjX3NhdGFfc2V0dXBfcG9ydCgmcHJvYmVfZW50LT5wb3J0WzNdLCBiYXNlICsgNCAqIFZTQ19TQVRBX1BPUlRfT0ZGU0VUKTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJLyogCisJICogQ29uZmlnIG9mZnNldCAweDk4IGlzICJFeHRlbmRlZCBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgMCIKKwkgKiBEZWZhdWx0IHZhbHVlIGlzICgxIDw8IDI4KS4gIEFsbCBiaXRzIGV4Y2VwdCBiaXQgMjggYXJlIHJlc2VydmVkIGluCisJICogRFBBIG1vZGUuICBJZiBiaXQgMjggaXMgc2V0LCBMRUQgMCByZWZsZWN0cyBhbGwgcG9ydHMnIGFjdGl2aXR5LgorCSAqIElmIGJpdCAyOCBpcyBjbGVhciwgZWFjaCBwb3J0IGhhcyBpdHMgb3duIExFRC4KKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4OTgsIDApOworCisJLyogRklYTUU6IGNoZWNrIGF0YV9kZXZpY2VfYWRkIHJldHVybiB2YWx1ZSAqLworCWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCk7CisJa2ZyZWUocHJvYmVfZW50KTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2ZyZWVfZW50OgorCWtmcmVlKHByb2JlX2VudCk7CitlcnJfb3V0X3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXQ6CisJaWYgKCFwY2lfZGV2X2J1c3kpCisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqIDB4MTcyNS8weDcxNzQgaXMgdGhlIFZpdGVzc2UgVlNDLTcxNzQKKyAqIDB4ODA4Ni8weDMyMDAgaXMgdGhlIEludGVsIDMxMjQ0LCB3aGljaCBpcyBzdXBwb3NlZCB0byBiZSBpZGVudGljYWwKKyAqIGNvbXBhdGliaWxpdHkgaXMgdW50ZXN0ZWQgYXMgb2YgeWV0CisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2c2Nfc2F0YV9wY2lfdGJsW10gPSB7CisJeyAweDE3MjUsIDB4NzE3NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMHgxMDYwMCwgMHhGRkZGRkYsIDAgfSwKKwl7IDB4ODA4NiwgMHgzMjAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAweDEwNjAwLCAweEZGRkZGRiwgMCB9LAorCXsgfQorfTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdnNjX3NhdGFfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCQk9IHZzY19zYXRhX3BjaV90YmwsCisJLnByb2JlCQkJPSB2c2Nfc2F0YV9pbml0X29uZSwKKwkucmVtb3ZlCQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IHZzY19zYXRhX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZ2c2Nfc2F0YV9wY2lfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgdnNjX3NhdGFfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdnNjX3NhdGFfcGNpX2RyaXZlcik7Cit9CisKKworTU9EVUxFX0FVVEhPUigiSmVyZW15IEhpZ2RvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJsb3ctbGV2ZWwgZHJpdmVyIGZvciBWaXRlc3NlIFZTQzcxNzQgU0FUQSBjb250cm9sbGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdnNjX3NhdGFfcGNpX3RibCk7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK21vZHVsZV9pbml0KHZzY19zYXRhX2luaXQpOworbW9kdWxlX2V4aXQodnNjX3NhdGFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NyaXB0X2FzbS5wbCBiL2RyaXZlcnMvc2NzaS9zY3JpcHRfYXNtLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNjUxZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2NyaXB0X2FzbS5wbApAQCAtMCwwICsxLDk4NCBAQAorIyEvdXNyL2Jpbi9wZXJsIC1zCisKKyMgTkNSIDUzYzgxMCBzY3JpcHQgYXNzZW1ibGVyCisjIFNwb25zb3JlZCBieSAKKyMgICAgICAgaVggTXVsdGl1c2VyIE11bHRpdGFza2luZyBNYWdhemluZQorIworIyBDb3B5cmlnaHQgMTk5MywgRHJldyBFY2toYXJkdAorIyAgICAgIFZpc2lvbmFyeSBDb21wdXRpbmcgCisjICAgICAgKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyMgICAgICBkcmV3QENvbG9yYWRvLkVEVQorIyAgICAgICsxICgzMDMpIDc4Ni03OTc1IAorIworIyAgIFN1cHBvcnQgZm9yIDUzYzcxMCAodmlhIC1uY3I3eDBfZmFtaWx5IHN3aXRjaCkgYWRkZWQgYnkgUmljaGFyZAorIyAgIEhpcnN0IDxyaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWs+IC0gMTV0aCBNYXJjaCAxOTk3CisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyMKKyMgVG9sZXJBTlQgYW5kIFNDU0kgU0NSSVBUUyBhcmUgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIE5DUiBDb3Jwb3JhdGlvbi4KKyMKKworIyAKKyMgQmFzaWNhbGx5LCBJIGZvbGxvdyB0aGUgTkNSIHN5bnRheCBkb2N1bWVudGVkIGluIHRoZSBOQ1I1M2M3MTAgCisjIFByb2dyYW1tZXIncyBndWlkZSwgd2l0aCB0aGUgbmV3IGluc3RydWN0aW9ucywgcmVnaXN0ZXJzLCBldGMuCisjIGZyb20gdGhlIE5DUjUzYzgxMC4KKyMKKyMgRGlmZmVyZW5jZXMgYmV0d2VlbiB0aGlzIGFzc2VtYmxlciBhbmQgTkNSJ3MgYXJlIHRoYXQgCisjIDEuICBQQVNTLCBSRUwgKGRhdGEsIEpVTVBzIHdvcmsgZmluZSksIGFuZCB0aGUgb3B0aW9uIHRvIHN0YXJ0IGEgbmV3IAorIwlzY3JpcHQsICBhcmUgdW5pbXBsZW1lbnRlZCwgc2luY2UgSSBkaWRuJ3QgdXNlIHRoZW0gaW4gbXkgc2NyaXB0cy4KKyMgCisjIDIuICBJIGFsc28gZW1pdCBhIHNjcmlwdF91LmggZmlsZSwgd2hpY2ggd2lsbCB1bmRlZmluZSBhbGwgb2YgCisjIAl0aGUgQV8qLCBFXyosIGV0Yy4gc3ltYm9scyBkZWZpbmVkIGluIHRoZSBzY3JpcHQuICBUaGlzIAorIwltYWtlcyBpbmNsdWRpbmcgbXVsdGlwbGUgc2NyaXB0cyBpbiBvbmUgcHJvZ3JhbSBlYXNpZXIKKyMgCQorIyAzLiAgVGhpcyBpcyBhIHNpbmdsZSBwYXNzIGFzc2VtYmxlciwgd2hpY2ggb25seSBlbWl0cyAKKyMJLmggZmlsZXMuCisjCisKKworIyBYWFggLSBzZXQgdGhlc2Ugd2l0aCBjb21tYW5kIGxpbmUgb3B0aW9ucworJGRlYnVnID0gMDsJCSMgUHJpbnQgZ2VuZXJhbCBkZWJ1Z2dpbmcgbWVzc2FnZXMKKyRkZWJ1Z19leHRlcm5hbCA9IDA7CSMgUHJpbnQgZXh0ZXJuYWwvZm9yd2FyZCByZWZlcmVuY2UgbWVzc2FnZXMKKyRsaXN0X2luX2FycmF5ID0gMTsJIyBFbWl0IG9yaWdpbmFsIFNDUklQVFMgYXNzZW1ibGVyIGluIGNvbW1lbnRzIGluCisJCQkjIHNjcmlwdC5oCisjJHByZWZpeDsJCSMgKHNldCBieSBwZXJsIC1zKQorICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWZpbmUgYWxsIGFycmF5cyBoYXZpbmcgdGhpcyBwcmVmaXggc28gd2UgCisJCQkjIGRvbid0IGhhdmUgbmFtZSBzcGFjZSBjb2xsaXNpb25zIGFmdGVyIAorCQkJIyBhc3NlbWJsaW5nIHRoaXMgZmlsZSBpbiBkaWZmZXJlbnQgd2F5cyBmb3IKKwkJCSMgZGlmZmVyZW50IGhvc3QgYWRhcHRlcnMKKworIyBDb25zdGFudHMKKworCisjIFRhYmxlIG9mIHRoZSBTQ1NJIHBoYXNlIGVuY29kaW5ncworJXNjc2lfcGhhc2VzID0gKCAJCQkKKyAgICAnREFUQV9PVVQnLCAweDAwXzAwXzAwXzAwLCAnREFUQV9JTicsIDB4MDFfMDBfMDBfMDAsICdDTUQnLCAweDAyXzAwXzAwXzAwLAorICAgICdTVEFUVVMnLCAweDAzXzAwXzAwXzAwLCAnTVNHX09VVCcsIDB4MDZfMDBfMDBfMDAsICdNU0dfSU4nLCAweDA3XzAwXzAwXzAwCispOworCisjIFhYWCAtIHJlcGxhY2UgcmVmZXJlbmNlcyB0byB0aGUgKl84MTAgY29uc3RhbnRzIHdpdGggZ2VuZXJhbCBjb25zdGFudHMKKyMgYXNzaWduZWQgYXQgY29tcGlsZSB0aW1lIGJhc2VkIG9uIGNoaXAgdHlwZS4KKworIyBUYWJsZSBvZiBvcGVyYXRvciBlbmNvZGluZ3MKKyMgWFhYIC0gTkNSNTNjNzEwIG9ubHkgaW1wbGVtZW50cyAKKyMgCW1vdmUgKG5vcCkgPSAweDAwXzAwXzAwXzAwCisjCW9yID0gMHgwMl8wMF8wMF8wMAorIyAJYW5kID0gMHgwNF8wMF8wMF8wMAorIyAJYWRkID0gMHgwNl8wMF8wMF8wMAorCitpZiAoJG5jcjd4MF9mYW1pbHkpIHsKKyAgJW9wZXJhdG9ycyA9ICgKKyAgICAnfCcsIDB4MDJfMDBfMDBfMDAsICdPUicsIDB4MDJfMDBfMDBfMDAsCisgICAgJyYnLCAweDA0XzAwXzAwXzAwLCAnQU5EJywgMHgwNF8wMF8wMF8wMCwKKyAgICAnKycsIDB4MDZfMDBfMDBfMDAKKyAgKTsKK30KK2Vsc2UgeworICAlb3BlcmF0b3JzID0gKAorICAgICdTSEwnLCAgMHgwMV8wMF8wMF8wMCwgCisgICAgJ3wnLCAweDAyXzAwXzAwXzAwLCAnT1InLCAweDAyXzAwXzAwXzAwLCAKKyAgICAnWE9SJywgMHgwM18wMF8wMF8wMCwgCisgICAgJyYnLCAweDA0XzAwXzAwXzAwLCAnQU5EJywgMHgwNF8wMF8wMF8wMCwgCisgICAgJ1NIUicsIDB4MDVfMDBfMDBfMDAsIAorICAgICMgTm90ZSA6IGxvdyBiaXQgb2YgdGhlIG9wZXJhdG9yIGJpdCBzaG91bGQgYmUgc2V0IGZvciBhZGQgd2l0aCAKKyAgICAjIGNhcnJ5LgorICAgICcrJywgMHgwNl8wMF8wMF8wMCAKKyAgKTsKK30KKworIyBUYWJsZSBvZiByZWdpc3RlciBhZGRyZXNzZXMKKworaWYgKCRuY3I3eDBfZmFtaWx5KSB7CisgICVyZWdpc3RlcnMgPSAoCisgICAgJ1NDTlRMMCcsIDAsICdTQ05UTDEnLCAxLCAnU0RJRCcsIDIsICdTSUVOJywgMywKKyAgICAnU0NJRCcsIDQsICdTWEZFUicsIDUsICdTT0RMJywgNiwgJ1NPQ0wnLCA3LAorICAgICdTRkJSJywgOCwgJ1NJREwnLCA5LCAnU0JETCcsIDEwLCAnU0JDTCcsIDExLAorICAgICdEU1RBVCcsIDEyLCAnU1NUQVQwJywgMTMsICdTU1RBVDEnLCAxNCwgJ1NTVEFUMicsIDE1LAorICAgICdEU0EwJywgMTYsICdEU0ExJywgMTcsICdEU0EyJywgMTgsICdEU0EzJywgMTksCisgICAgJ0NURVNUMCcsIDIwLCAnQ1RFU1QxJywgMjEsICdDVEVTVDInLCAyMiwgJ0NURVNUMycsIDIzLAorICAgICdDVEVTVDQnLCAyNCwgJ0NURVNUNScsIDI1LCAnQ1RFU1Q2JywgMjYsICdDVEVTVDcnLCAyNywKKyAgICAnVEVNUDAnLCAyOCwgJ1RFTVAxJywgMjksICdURU1QMicsIDMwLCAnVEVNUDMnLCAzMSwKKyAgICAnREZJRk8nLCAzMiwgJ0lTVEFUJywgMzMsICdDVEVTVDgnLCAzNCwgJ0xDUkMnLCAzNSwKKyAgICAnREJDMCcsIDM2LCAnREJDMScsIDM3LCAnREJDMicsIDM4LCAnRENNRCcsIDM5LAorICAgICdETkFEMCcsIDQwLCAnRE5BRDEnLCA0MSwgJ0ROQUQyJywgNDIsICdETkFEMycsIDQzLAorICAgICdEU1AwJywgNDQsICdEU1AxJywgNDUsICdEU1AyJywgNDYsICdEU1AzJywgNDcsCisgICAgJ0RTUFMwJywgNDgsICdEU1BTMScsIDQ5LCAnRFNQUzInLCA1MCwgJ0RTUFMzJywgNTEsCisgICAgJ1NDUkFUQ0gwJywgNTIsICdTQ1JBVENIMScsIDUzLCAnU0NSQVRDSDInLCA1NCwgJ1NDUkFUQ0gzJywgNTUsCisgICAgJ0RNT0RFJywgNTYsICdESUVOJywgNTcsICdEV1QnLCA1OCwgJ0RDTlRMJywgNTksCisgICAgJ0FEREVSMCcsIDYwLCAnQURERVIxJywgNjEsICdBRERFUjInLCA2MiwgJ0FEREVSMycsIDYzLAorICApOworfQorZWxzZSB7CisgICVyZWdpc3RlcnMgPSAoCisgICAgJ1NDTlRMMCcsIDAsICdTQ05UTDEnLCAxLCAnU0NOVEwyJywgMiwgJ1NDTlRMMycsIDMsCisgICAgJ1NDSUQnLCA0LCAnU1hGRVInLCA1LCAnU0RJRCcsIDYsICdHUFJFRycsIDcsCisgICAgJ1NGQlInLCA4LCAnU09DTCcsIDksICdTU0lEJywgMTAsICdTQkNMJywgMTEsCisgICAgJ0RTVEFUJywgMTIsICdTU1RBVDAnLCAxMywgJ1NTVEFUMScsIDE0LCAnU1NUQVQyJywgMTUsCisgICAgJ0RTQTAnLCAxNiwgJ0RTQTEnLCAxNywgJ0RTQTInLCAxOCwgJ0RTQTMnLCAxOSwKKyAgICAnSVNUQVQnLCAyMCwKKyAgICAnQ1RFU1QwJywgMjQsICdDVEVTVDEnLCAyNSwgJ0NURVNUMicsIDI2LCAnQ1RFU1QzJywgMjcsCisgICAgJ1RFTVAwJywgMjgsICdURU1QMScsIDI5LCAnVEVNUDInLCAzMCwgJ1RFTVAzJywgMzEsCisgICAgJ0RGSUZPJywgMzIsICdDVEVTVDQnLCAzMywgJ0NURVNUNScsIDM0LCAnQ1RFU1Q2JywgMzUsCisgICAgJ0RCQzAnLCAzNiwgJ0RCQzEnLCAzNywgJ0RCQzInLCAzOCwgJ0RDTUQnLCAzOSwKKyAgICAnRE5BRDAnLCA0MCwgJ0ROQUQxJywgNDEsICdETkFEMicsIDQyLCAnRE5BRDMnLCA0MywKKyAgICAnRFNQMCcsIDQ0LCAnRFNQMScsIDQ1LCAnRFNQMicsIDQ2LCAnRFNQMycsIDQ3LAorICAgICdEU1BTMCcsIDQ4LCAnRFNQUzEnLCA0OSwgJ0RTUFMyJywgNTAsICdEU1BTMycsIDUxLAorICAgICdTQ1JBVENIMCcsIDUyLCAnU0NSQVRDSDEnLCA1MywgJ1NDUkFUQ0gyJywgNTQsICdTQ1JBVENIMycsIDU1LAorICAgICdTQ1JBVENIQTAnLCA1MiwgJ1NDUkFUQ0hBMScsIDUzLCAnU0NSQVRDSEEyJywgNTQsICdTQ1JBVENIQTMnLCA1NSwKKyAgICAnRE1PREUnLCA1NiwgJ0RJRU4nLCA1NywgJ0RXVCcsIDU4LCAnRENOVEwnLCA1OSwKKyAgICAnQURERVIwJywgNjAsICdBRERFUjEnLCA2MSwgJ0FEREVSMicsIDYyLCAnQURERVIzJywgNjMsCisgICAgJ1NJRU4wJywgNjQsICdTSUVOMScsIDY1LCAnU0lTVDAnLCA2NiwgJ1NJU1QxJywgNjcsCisgICAgJ1NMUEFSJywgNjgsIAkgICAgICAnTUFDTlRMJywgNzAsICdHUENOVEwnLCA3MSwKKyAgICAnU1RJTUUwJywgNzIsICdTVElNRTEnLCA3MywgJ1JFU1BJRCcsIDc0LCAKKyAgICAnU1RFU1QwJywgNzYsICdTVEVTVDEnLCA3NywgJ1NURVNUMicsIDc4LCAnU1RFU1QzJywgNzksCisgICAgJ1NJREwnLCA4MCwKKyAgICAnU09ETCcsIDg0LAorICAgICdTQkRMJywgODgsCisgICAgJ1NDUkFUQ0hCMCcsIDkyLCAnU0NSQVRDSEIxJywgOTMsICdTQ1JBVENIQjInLCA5NCwgJ1NDUkFUQ0hCMycsIDk1CisgICk7Cit9CisKKyMgUGFyc2luZyByZWd1bGFyIGV4cHJlc3Npb25zCiskaWRlbnRpZmllciA9ICdbQS1aYS16X11bQS1aYS16XzAtOV0qJzsJCQorJGRlY251bSA9ICctP1xcZCsnOworJGhleG51bSA9ICcwW3hYXVswLTlBLUZhLWZdKyc7CQkKKyRjb25zdGFudCA9ICIkaGV4bnVtfCRkZWNudW0iOworCisjIHl1Y2t5IC0gc2luY2Ugd2UgY2FuJ3QgY29udHJvbCBncm91cGluZyBvZiAjICRjb25zdGFudCwgd2UgbmVlZCB0byAKKyMgZXhwYW5kIG91dCBlYWNoIGFsdGVybmF0aXZlIGZvciAkdmFsdWUuCisKKyR2YWx1ZSA9ICIkaWRlbnRpZmllcnwkaWRlbnRpZmllclxccypbK1wtXVxccyokZGVjbnVtfCIuCisgICAgIiRpZGVudGlmaWVyXFxzKlsrLV1ccyokaGV4bnVtfCRjb25zdGFudCI7CisKK3ByaW50IFNUREVSUiAidmFsdWUgcmVnZXggPSAkdmFsdWVcbiIgaWYgKCRkZWJ1Zyk7CisKKyRwaGFzZSA9IGpvaW4gKCd8Jywga2V5cyAlc2NzaV9waGFzZXMpOworcHJpbnQgU1RERVJSICJwaGFzZSByZWdleCA9ICRwaGFzZVxuIiBpZiAoJGRlYnVnKTsKKyRyZWdpc3RlciA9IGpvaW4gKCd8Jywga2V5cyAlcmVnaXN0ZXJzKTsKKworIyB5dWNreSAtIHNpbmNlICVvcGVyYXRvcnMgaW5jbHVkZXMgbWV0YS1jaGFyYWN0ZXJzIHdoaWNoIG11c3QKKyMgYmUgZXNjYXBlZCwgSSBjYW4ndCB1c2UgdGhlIGpvaW4oKSB0cmljayBJIHVzZWQgZm9yIHRoZSByZWdpc3RlcgorIyByZWdleAorCitpZiAoJG5jcjd4MF9mYW1pbHkpIHsKKyAgJG9wZXJhdG9yID0gJ1x8fE9SfEFORHxcJnxcKyc7Cit9CitlbHNlIHsKKyAgJG9wZXJhdG9yID0gJ1x8fE9SfEFORHxYT1J8XCZ8XCsnOworfQorCisjIEdsb2JhbCB2YXJpYWJsZXMKKworJXN5bWJvbF92YWx1ZXMgPSAoJXJlZ2lzdGVycykgOwkJIyBUcmFkaXRpb25hbCBzeW1ib2wgdGFibGUKKworJXN5bWJvbF9yZWZlcmVuY2VzID0gKCkgOwkJIyBUYWJsZSBvZiBzeW1ib2wgcmVmZXJlbmNlcywgd2hlcmUKKwkJCQkJIyB0aGUgaW5kZXggaXMgdGhlIHN5bWJvbCBuYW1lLCAKKwkJCQkJIyBhbmQgdGhlIGNvbnRlbnRzIGEgd2hpdGUgc3BhY2UgCisJCQkJCSMgZGVsaW1pdGVkIGxpc3Qgb2YgYWRkcmVzcyxzaXplCisJCQkJCSMgdHVwbGVzIHdoZXJlIHNpemUgaXMgaW4gYnl0ZXMuCisKK0Bjb2RlID0gKCk7CQkJCSMgQXJyYXkgb2YgMzIgYml0IHdvcmRzIGZvciBTSU9QIAorCitAZW50cnkgPSAoKTsJCQkJIyBBcnJheSBvZiBlbnRyeSBwb2ludCBuYW1lcworCitAbGFiZWwgPSAoKTsJCQkJIyBBcnJheSBvZiBsYWJlbCBuYW1lcworCitAYWJzb2x1dGUgPSAoKTsJCQkJIyBBcnJheSBvZiBhYnNvbHV0ZSBuYW1lcworCitAcmVsYXRpdmUgPSAoKTsJCQkJIyBBcnJheSBvZiByZWxhdGl2ZSBuYW1lcworCitAZXh0ZXJuYWwgPSAoKTsJCQkJIyBBcnJheSBvZiBleHRlcm5hbCBuYW1lcworCiskYWRkcmVzcyA9IDA7CQkJCSMgQWRkcmVzcyBvZiBjdXJyZW50IGluc3RydWN0aW9uCisKKyRsaW5lbm8gPSAwOwkJCQkjIExpbmUgbnVtYmVyIHdlIGFyZSBwYXJzaW5nCisKKyRvdXRwdXQgPSAnc2NyaXB0LmgnOwkJCSMgT3V0cHV0IGZpbGUKKyRvdXRwdXR1ID0gJ3NjcmlwdHUuaCc7CisKKyMgJnBhdGNoICgkYWRkcmVzcywgJG9mZnNldCwgJGxlbmd0aCwgJHZhbHVlKSBwYXRjaGVzICRjb2RlWyRhZGRyZXNzXQorIyAJc28gdGhhdCB0aGUgJGxlbmd0aCBieXRlcyBhdCAkb2Zmc2V0IGhhdmUgJHZhbHVlIGFkZGVkIHRvCisjIAl0aGVtLiAgCisKK0BpbnZlcnRlZF9tYXNrcyA9ICgweDAwXzAwXzAwXzAwLCAweDAwXzAwXzAwX2ZmLCAweDAwXzAwX2ZmX2ZmLCAweDAwX2ZmX2ZmX2ZmLCAKKyAgICAweGZmX2ZmX2ZmX2ZmKTsKKworc3ViIHBhdGNoIHsKKyAgICBsb2NhbCAoJGFkZHJlc3MsICRvZmZzZXQsICRsZW5ndGgsICR2YWx1ZSkgPSBAXzsKKyAgICBpZiAoJGRlYnVnKSB7CisJcHJpbnQgU1RERVJSICJQYXRjaGluZyAkYWRkcmVzcyBhdCBvZmZzZXQgJG9mZnNldCwgbGVuZ3RoICRsZW5ndGggdG8gJHZhbHVlXG4iOworCXByaW50ZiBTVERFUlIgIk9sZCBjb2RlIDogJTA4eFxuIiwgJGNvZGVbJGFkZHJlc3NdOworICAgICB9CisKKyAgICAkbWFzayA9ICgkaW52ZXJ0ZWRfbWFza3NbJGxlbmd0aF0gPDwgKCRvZmZzZXQgKiA4KSk7CisgICAKKyAgICAkY29kZVskYWRkcmVzc10gPSAoJGNvZGVbJGFkZHJlc3NdICYgfiRtYXNrKSB8IAorCSgoJGNvZGVbJGFkZHJlc3NdICYgJG1hc2spICsgKCR2YWx1ZSA8PCAoJG9mZnNldCAqIDgpKSAmIAorCSRtYXNrKTsKKyAgICAKKyAgICBwcmludGYgU1RERVJSICJOZXcgY29kZSA6ICUwOHhcbiIsICRjb2RlWyRhZGRyZXNzXSBpZiAoJGRlYnVnKTsKK30KKworIyAmcGFyc2VfdmFsdWUoJHZhbHVlLCAkd29yZCwgJG9mZnNldCwgJGxlbmd0aCkgd2hlcmUgJHZhbHVlIGlzIAorIyAJYW4gaWRlbnRpZmllciBvciBjb25zdGFudCwgJHdvcmQgaXMgdGhlIHdvcmQgb2Zmc2V0IHJlbGF0aXZlIHRvIAorIwkkYWRkcmVzcywgJG9mZnNldCBpcyB0aGUgc3RhcnRpbmcgYnl0ZSB3aXRoaW4gdGhhdCB3b3JkLCBhbmQgCisjCSRsZW5ndGggaXMgdGhlIGxlbmd0aCBvZiB0aGUgZmllbGQgaW4gYnl0ZXMuCisjCisjIFNpZGUgZWZmZWN0cyBhcmUgdGhhdCB0aGUgYnl0ZXMgYXJlIGNvbWJpbmVkIGludG8gdGhlIEBjb2RlIGFycmF5CisjCXJlbGF0aXZlIHRvICRhZGRyZXNzLCBhbmQgdGhhdCB0aGUgJXN5bWJvbF9yZWZlcmVuY2VzIHRhYmxlIGlzIAorIyAJdXBkYXRlZCBhcyBhcHByb3ByaWF0ZS4KKworc3ViIHBhcnNlX3ZhbHVlIHsKKyAgICBsb2NhbCAoJHZhbHVlLCAkd29yZCwgJG9mZnNldCwgJGxlbmd0aCkgPSBAXzsKKyAgICBsb2NhbCAoJHRtcCk7CisKKyAgICAkc3ltYm9sID0gJyc7CisKKyAgICBpZiAoJHZhbHVlID1+IC9eUkVMXHMqXChccyooJGlkZW50aWZpZXIpXHMqXClccyooLiopL2kpIHsKKwkkcmVsYXRpdmUgPSAnUkVMJzsKKwkkc3ltYm9sID0gJDE7CisJJHZhbHVlID0gJDI7CitwcmludCBTVERFUlIgIlJlbGF0aXZlIHJlZmVyZW5jZSAkc3ltYm9sXG4iIGlmICgkZGVidWcpOworICAgIH0gZWxzaWYgKCR2YWx1ZSA9fiAvXigkaWRlbnRpZmllcilccyooLiopLykgeworCSRyZWxhdGl2ZSA9ICdBQlMnOworCSRzeW1ib2wgPSAkMTsKKwkkdmFsdWUgPSAkMjsKK3ByaW50IFNUREVSUiAiQWJzb2x1dGUgcmVmZXJlbmNlICRzeW1ib2xcbiIgaWYgKCRkZWJ1Zyk7CisgICAgfSAKKworICAgIGlmICgkc3ltYm9sIG5lICcnKSB7CitwcmludCBTVERFUlIgIlJlZmVyZW5jaW5nIHN5bWJvbCAkMSwgbGVuZ3RoID0gJGxlbmd0aCBpbiAkX1xuIiBpZiAoJGRlYnVnKTsKKyAgICAgCSR0bXAgPSAoJGFkZHJlc3MgKyAkd29yZCkgKiA0ICsgJG9mZnNldDsKKwlpZiAoJHN5bWJvbF9yZWZlcmVuY2VzeyRzeW1ib2x9IG5lIHVuZGVmKSB7CisJICAgICRzeW1ib2xfcmVmZXJlbmNlc3skc3ltYm9sfSA9IAorCQkiJHN5bWJvbF9yZWZlcmVuY2VzeyRzeW1ib2x9ICRyZWxhdGl2ZSwkdG1wLCRsZW5ndGgiOworCX0gZWxzZSB7CisJICAgIGlmICghZGVmaW5lZCgkc3ltYm9sX3ZhbHVlc3skc3ltYm9sfSkpIHsKK3ByaW50IFNUREVSUiAiZm9yd2FyZCAkMVxuIiBpZiAoJGRlYnVnX2V4dGVybmFsKTsKKwkJJGZvcndhcmR7JHN5bWJvbH0gPSAibGluZSAkbGluZW5vIDogJF8iOworCSAgICB9IAorCSAgICAkc3ltYm9sX3JlZmVyZW5jZXN7JHN5bWJvbH0gPSAiJHJlbGF0aXZlLCR0bXAsJGxlbmd0aCI7CisJfQorICAgIH0gCisKKyAgICAkdmFsdWUgPSBldmFsICR2YWx1ZTsKKyAgICAmcGF0Y2ggKCRhZGRyZXNzICsgJHdvcmQsICRvZmZzZXQsICRsZW5ndGgsICR2YWx1ZSk7Cit9CisKKyMgJnBhcnNlX2NvbmRpdGlvbmFsICgkY29uZGl0aW9uYWwpIHdoZXJlICRjb25kaXRpb25hbCBpcyB0aGUgY29uZGl0aW9uYWwKKyMgY2xhdXNlIGZyb20gYSB0cmFuc2ZlciBjb250cm9sIGluc3RydWN0aW9uIChSRVRVUk4sIENBTEwsIEpVTVAsIElOVCkuCisKK3N1YiBwYXJzZV9jb25kaXRpb25hbCB7CisgICAgbG9jYWwgKCRjb25kaXRpb25hbCkgPSBAXzsKKyAgICBpZiAoJGNvbmRpdGlvbmFsID1+IC9eXHMqKElGfFdIRU4pXHMqKC4qKS9pKSB7CisJJGlmID0gJDE7CisJJGNvbmRpdGlvbmFsID0gJDI7CisJaWYgKCRpZiA9fiAvV0hFTi9pKSB7CisJICAgICRhbGxvd19hdG4gPSAwOworCSAgICAkY29kZVskYWRkcmVzc10gfD0gMHgwMF8wMV8wMF8wMDsKKwkgICAgJGFsbG93X2F0biA9IDA7CisJICAgIHByaW50IFNUREVSUiAiJDAgOiBwYXJzZWQgV0hFTlxuIiBpZiAoJGRlYnVnKTsKKwl9IGVsc2UgeworCSAgICAkYWxsb3dfYXRuID0gMTsKKwkgICAgcHJpbnQgU1RERVJSICIkMCA6IHBhcnNlZCBJRlxuIiBpZiAoJGRlYnVnKTsKKwl9CisgICAgfSBlbHNlIHsKKwkgICAgZGllICIkMCA6IHN5bnRheCBlcnJvciBpbiBsaW5lICRsaW5lbm8gOiAkXworCWV4cGVjdGVkIElGIG9yIFdIRU4KKyI7CisgICAgfQorCisgICAgaWYgKCRjb25kaXRpb25hbCA9fiAvXk5PVFxzKyguKikkL2kpIHsKKwkkbm90ID0gJ05PVCAnOworCSRvdGhlciA9ICdPUic7CisJJGNvbmRpdGlvbmFsID0gJDE7CisJcHJpbnQgU1RERVJSICIkMCA6IHBhcnNlZCBOT1RcbiIgaWYgKCRkZWJ1Zyk7CisgICAgfSBlbHNlIHsKKwkkY29kZVskYWRkcmVzc10gfD0gMHgwMF8wOF8wMF8wMDsKKwkkbm90ID0gJyc7CisJJG90aGVyID0gJ0FORCcKKyAgICB9CisKKyAgICAkbmVlZF9kYXRhID0gMDsKKyAgICBpZiAoJGNvbmRpdGlvbmFsID1+IC9eQVROXHMqKC4qKS9pKSB7IworCWRpZSAiJDAgOiBzeW50YXggZXJyb3IgaW4gbGluZSAkbGluZW5vIDogJF8KKwlXSEVOIGNvbmRpdGlvbmFsIGlzIGluY29tcGF0aWJsZSB3aXRoIEFUTiAKKyIgaWYgKCEkYWxsb3dfYXRuKTsKKwkkY29kZVskYWRkcmVzc10gfD0gMHgwMF8wMl8wMF8wMDsKKwkkY29uZGl0aW9uYWwgPSAkMTsKKwlwcmludCBTVERFUlIgIiQwIDogcGFyc2VkIEFUTlxuIiBpZiAoJGRlYnVnKTsKKyAgICB9IGVsc2lmICgkY29uZGl0aW9uYWwgPX4gL14oJHBoYXNlKVxzKiguKikvaSkgeworCSRwaGFzZV9pbmRleCA9ICJcVSQxXEUiOworCSRwID0gJHNjc2lfcGhhc2VzeyRwaGFzZV9pbmRleH07CisJJGNvZGVbJGFkZHJlc3NdIHw9ICRwIHwgMHgwMF8wMl8wMF8wMDsKKwkkY29uZGl0aW9uYWwgPSAkMjsKKwlwcmludCBTVERFUlIgIiQwIDogcGFyc2VkIHBoYXNlICRwaGFzZV9pbmRleFxuIiBpZiAoJGRlYnVnKTsKKyAgICB9IGVsc2UgeworCSRvdGhlciA9ICcnOworCSRuZWVkX2RhdGEgPSAxOworICAgIH0KKworcHJpbnQgU1RERVJSICJQYXJzaW5nIGNvbmp1bmN0aW9uLCBleHBlY3RpbmcgJG90aGVyXG4iIGlmICgkZGVidWcpOworICAgIGlmICgkY29uZGl0aW9uYWwgPX4gL14oQU5EfE9SKVxzKiguKikvaSkgeworCSRjb25qdW5jdGlvbiA9ICQxOworCSRjb25kaXRpb25hbCA9ICQyOworCSRuZWVkX2RhdGEgPSAxOworCWRpZSAiJDAgOiBzeW50YXggZXJyb3IgaW4gbGluZSAkbGluZW5vIDogJF8KKwkgICAgSWxsZWdhbCB1c2Ugb2YgJDEuICBWYWxpZCB1c2VzIGFyZSAKKwkgICAgIi4kbm90LiI8cGhhc2U+ICQxIGRhdGEKKwkgICAgIi4kbm90LiJBVE4gJDEgZGF0YQorIiBpZiAoJG90aGVyIGVxICcnKTsKKwlkaWUgIiQwIDogc3ludGF4IGVycm9yIGluIGxpbmUgJGxpbmVubyA6ICRfCisJSWxsZWdhbCB1c2Ugb2YgJGNvbmp1bmN0aW9uLiAgVmFsaWQgc3ludGF4ZXMgYXJlIAorCQlOT1QgPHBoYXNlPnxBVE4gT1IgZGF0YQorCQk8cGhhc2U+fEFUTiBBTkQgZGF0YQorIiBpZiAoJGNvbmp1bmN0aW9uICF+IC9ccyokb3RoZXJccyovaSk7CisJcHJpbnQgU1RERVJSICIkMCA6IHBhcnNlZCAkMVxuIiBpZiAoJGRlYnVnKTsKKyAgICB9CisKKyAgICBpZiAoJG5lZWRfZGF0YSkgeworcHJpbnQgU1RERVJSICJsb29raW5nIGZvciBkYXRhIGluICRjb25kaXRpb25hbFxuIiBpZiAoJGRlYnVnKTsKKwlpZiAoJGNvbmRpdGlvbmFsPX4gL14oJHZhbHVlKVxzKiguKikvaSkgeworCSAgICAkY29kZVskYWRkcmVzc10gfD0gMHgwMF8wNF8wMF8wMDsKKwkgICAgJGNvbmRpdGlvbmFsID0gJDI7CisJICAgICZwYXJzZV92YWx1ZSgkMSwgMCwgMCwgMSk7CisJICAgIHByaW50IFNUREVSUiAiJDAgOiBwYXJzZWQgZGF0YVxuIiBpZiAoJGRlYnVnKTsKKwl9IGVsc2UgeworCWRpZSAiJDAgOiBzeW50YXggZXJyb3IgaW4gbGluZSAkbGluZW5vIDogJF8KKwlleHBlY3RlZCA8ZGF0YT4uCisiOworCX0KKyAgICB9CisKKyAgICBpZiAoJGNvbmRpdGlvbmFsID1+IC9eXHMqLFxzKiguKikvKSB7CisJJGNvbmRpdGlvbmFsID0gJDE7CisJaWYgKCRjb25kaXRpb25hbCA9fiAvXkFORFxzXHMqTUFTS1xzXHMqKCR2YWx1ZSlccyooLiopL2kpIHsKKwkgICAgJnBhcnNlX3ZhbHVlICgkMSwgMCwgMSwgMSk7CisJICAgIHByaW50IFNUREVSUiAiJDAgcGFyc2VkIEFORCBNQVNLICQxXG4iIGlmICgkZGVidWcpOworCSAgICBkaWUgIiQwIDogc3ludGF4IGVycm9yIGluIGxpbmUgJGxpbmVubyA6ICRfCisJZXhwZWN0ZWQgZW5kIG9mIGxpbmUsIG5vdCBcIiQyXCIKKyIgaWYgKCQyIG5lICcnKTsKKwl9IGVsc2UgeworCSAgICBkaWUgIiQwIDogc3ludGF4IGVycm9yIGluIGxpbmUgJGxpbmVubyA6ICRfCisJZXhwZWN0ZWQgXCIsQU5EIE1BU0sgPGRhdGE+XCIsIG5vdCBcIiQyXCIKKyI7CisJfQorICAgIH0gZWxzaWYgKCRjb25kaXRpb25hbCAhfiAvXlxzKiQvKSB7IAorCWRpZSAiJDAgOiBzeW50YXggZXJyb3IgaW4gbGluZSAkbGluZW5vIDogJF8KKwlleHBlY3RlZCBlbmQgb2YgbGluZSIgLiAoKCRuZWVkX2RhdGEpID8gIiBvciBcIkFORCBNQVNLIDxkYXRhPlwiIiA6ICIiKSAuICIKKwlub3QgXCIkY29uZGl0aW9uYWxcIgorIjsKKyAgICB9Cit9CisKKyMgUGFyc2UgY29tbWFuZCBsaW5lCiskb3V0cHV0ID0gc2hpZnQ7Ciskb3V0cHV0dSA9IHNoaWZ0OworCisgICAgCisjIE1haW4gbG9vcAord2hpbGUgKDxTVERJTj4pIHsKKyAgICAkbGluZW5vID0gJGxpbmVubyArIDE7CisgICAgJGxpc3RbJGFkZHJlc3NdID0gJGxpc3RbJGFkZHJlc3NdLiRfOworICAgIHMvOy4qJC8vOwkJCQkjIFN0cmlwIGNvbW1lbnRzCisKKworICAgIGNob3A7CQkJCSMgTGVhdmUgbmV3IGxpbmUgb3V0IG9mIGVycm9yIG1lc3NhZ2VzCisKKyMgSGFuZGxlIHN5bWJvbCBkZWZpbml0aW9ucyBvZiB0aGUgZm9ybSBsYWJlbDoKKyAgICBpZiAoL15ccyooJGlkZW50aWZpZXIpXHMqOiguKikvKSB7CisJaWYgKCFkZWZpbmVkKCRzeW1ib2xfdmFsdWVzeyQxfSkpIHsKKwkgICAgJHN5bWJvbF92YWx1ZXN7JDF9ID0gJGFkZHJlc3MgKiA0OwkjIEFkZHJlc3MgaXMgYW4gaW5kZXggaW50bworCSAgICBkZWxldGUgJGZvcndhcmR7JDF9OwkJIyBhbiBhcnJheSBvZiBsb25ncworCSAgICBwdXNoIChAbGFiZWwsICQxKTsKKwkgICAgJF8gPSAkMjsKKwl9IGVsc2UgeworCSAgICBkaWUgIiQwIDogcmVkZWZpbml0aW9uIG9mIHN5bWJvbCAkMSBpbiBsaW5lICRsaW5lbm8gOiAkX1xuIjsKKwl9CisgICAgfQorCisjIEhhbmRsZSBzeW1ib2wgZGVmaW5pdGlvbnMgb2YgdGhlIGZvcm0gQUJTT0xVVEUgb3IgUkVMQVRJVkUgaWRlbnRpZmllciA9IAorIyB2YWx1ZQorICAgIGlmICgvXlxzKihBQlNPTFVURXxSRUxBVElWRSlccysoLiopL2kpIHsKKwkkaXNfYWJzb2x1dGUgPSAkMTsKKwkkcmVzdCA9ICQyOworCWZvcmVhY2ggJHJlc3QgKHNwbGl0ICgvXHMqLFxzKi8sICRyZXN0KSkgeworCSAgICBpZiAoJHJlc3QgPX4gL14oJGlkZW50aWZpZXIpXHMqPVxzKigkY29uc3RhbnQpXHMqJC8pIHsKKwkgICAgICAgIGxvY2FsICgkaWQsICRjbnN0KSA9ICgkMSwgJDIpOworCQlpZiAoJHN5bWJvbF92YWx1ZXN7JGlkfSBlcSB1bmRlZikgeworCQkgICAgJHN5bWJvbF92YWx1ZXN7JGlkfSA9IGV2YWwgJGNuc3Q7CisJCSAgICBkZWxldGUgJGZvcndhcmR7JGlkfTsKKwkJICAgIGlmICgkaXNfYWJzb2x1dGUgPX4gL0FCU09MVVRFL2kpIHsKKwkJCXB1c2ggKEBhYnNvbHV0ZSAsICRpZCk7CisJCSAgICB9IGVsc2UgeworCQkJcHVzaCAoQHJlbGF0aXZlLCAkaWQpOworCQkgICAgfQorCQl9IGVsc2UgeworCQkgICAgZGllICIkMCA6IHJlZGVmaW5pdGlvbiBvZiBzeW1ib2wgJGlkIGluIGxpbmUgJGxpbmVubyA6ICRfXG4iOworCQl9CisJICAgIH0gZWxzZSB7CisJCWRpZSAKKyIkMCA6IHN5bnRheCBlcnJvciBpbiBsaW5lICRsaW5lbm8gOiAkXworCSAgICBleHBlY3RlZCA8aWRlbnRpZmllcj4gPSA8dmFsdWU+CisiOworCSAgICB9CisJfQorICAgIH0gZWxzaWYgKC9eXHMqRVhURVJOQUxccysoLiopL2kpIHsKKwkkZXh0ZXJuYWxzID0gJDE7CisJZm9yZWFjaCAkZXh0ZXJuYWwgKHNwbGl0ICgvLC8sJGV4dGVybmFscykpIHsKKwkgICAgaWYgKCRleHRlcm5hbCA9fiAvXHMqKCRpZGVudGlmaWVyKVxzKiQvKSB7CisJCSRleHRlcm5hbCA9ICQxOworCQlwdXNoIChAZXh0ZXJuYWwsICRleHRlcm5hbCk7CisJCWRlbGV0ZSAkZm9yd2FyZHskZXh0ZXJuYWx9OworCQlpZiAoZGVmaW5lZCgkc3ltYm9sX3ZhbHVlc3skZXh0ZXJuYWx9KSkgeworCQkJZGllICIkMCA6IHJlZGVmaW5pdGlvbiBvZiBzeW1ib2wgJDEgaW4gbGluZSAkbGluZW5vIDogJF9cbiI7CisJCX0KKwkJJHN5bWJvbF92YWx1ZXN7JGV4dGVybmFsfSA9ICRleHRlcm5hbDsKK3ByaW50IFNUREVSUiAiZGVmaW5lZCBleHRlcm5hbCAkMSB0byAkZXh0ZXJuYWxcbiIgaWYgKCRkZWJ1Z19leHRlcm5hbCk7CisJICAgIH0gZWxzZSB7CisJCWRpZSAKKyIkMCA6IHN5bnRheCBlcnJvciBpbiBsaW5lICRsaW5lbm8gOiAkXworCWV4cGVjdGVkIDxpZGVudGlmaWVyPiwgZ290ICRleHRlcm5hbAorIjsKKwkgICAgfQorCX0KKyMgUHJvY2VzcyBFTlRSWSBpZGVudGlmaWVyIGRlY2xhcmF0aW9ucworICAgIH0gZWxzaWYgKC9eXHMqRU5UUllccysoLiopL2kpIHsKKwlpZiAoJDEgPX4gL14oJGlkZW50aWZpZXIpXHMqJC8pIHsKKwkgICAgcHVzaCAoQGVudHJ5LCAkMSk7CisJfSBlbHNlIHsKKwkgICAgZGllCisiJDAgOiBzeW50YXggZXJyb3IgaW4gbGluZSAkbGluZW5vIDogJF8KKwlleHBlY3RlZCBFTlRSWSA8aWRlbnRpZmllcj4KKyI7CisJfQorIyBQcm9jZXNzIE1PVkUgbGVuZ3RoLCBhZGRyZXNzLCBXSVRIfFdIRU4gcGhhc2UgaW5zdHJ1Y3Rpb24KKyAgICB9IGVsc2lmICgvXlxzKk1PVkVccysoLiopL2kpIHsKKwkkcmVzdCA9ICQxOworCWlmICgkcmVzdCA9fiAvXkZST01ccysoJHZhbHVlKVxzKixccyooV0lUSHxXSEVOKVxzKygkcGhhc2UpXHMqJC9pKSB7CisJICAgICR0cmFuc2Zlcl9hZGRyID0gJDE7CisJICAgICR3aXRoX3doZW4gPSAkMjsKKwkgICAgJHNjc2lfcGhhc2UgPSAkMzsKK3ByaW50IFNUREVSUiAiUGFyc2luZyBNT1ZFIEZST00gJHRyYW5zZmVyX2FkZHIsICR3aXRoX3doZW4gJDNcbiIgaWYgKCRkZWJ1Zyk7CisJICAgICRjb2RlWyRhZGRyZXNzXSA9IDB4MThfMDBfMDBfMDAgfCAoKCR3aXRoX3doZW4gPX4gL1dJVEgvaSkgPyAKKwkJMHgwMF8wMF8wMF8wMCA6IDB4MDhfMDBfMDBfMDApIHwgJHNjc2lfcGhhc2VzeyRzY3NpX3BoYXNlfTsKKwkgICAgJnBhcnNlX3ZhbHVlICgkdHJhbnNmZXJfYWRkciwgMSwgMCwgNCk7CisJICAgICRhZGRyZXNzICs9IDI7CisJfSBlbHNpZiAoJHJlc3QgPX4gL14oJHZhbHVlKVxzKixccyooUFRSXHMrfCkoJHZhbHVlKVxzKixccyooV0lUSHxXSEVOKVxzKygkcGhhc2UpXHMqJC9pKSB7CisJICAgICR0cmFuc2Zlcl9sZW4gPSAkMTsKKwkgICAgJHB0ciA9ICQyOworCSAgICAkdHJhbnNmZXJfYWRkciA9ICQzOworCSAgICAkd2l0aF93aGVuID0gJDQ7CisJICAgICRzY3NpX3BoYXNlID0gJDU7CisJICAgICRjb2RlWyRhZGRyZXNzXSA9ICgoJHdpdGhfd2hlbiA9fiAvV0lUSC9pKSA/IDB4MDBfMDBfMDBfMDAgOiAKKwkJMHgwOF8wMF8wMF8wMCkgIHwgKCgkcHRyID1+IC9QVFIvaSkgPyAoMSA8PCAyOSkgOiAwKSB8IAorCQkkc2NzaV9waGFzZXN7JHNjc2lfcGhhc2V9OworCSAgICAmcGFyc2VfdmFsdWUgKCR0cmFuc2Zlcl9sZW4sIDAsIDAsIDMpOworCSAgICAmcGFyc2VfdmFsdWUgKCR0cmFuc2Zlcl9hZGRyLCAxLCAwLCA0KTsKKwkgICAgJGFkZHJlc3MgKz0gMjsKKwl9IGVsc2lmICgkcmVzdCA9fiAvXk1FTU9SWVxzKyguKikvaSkgeworCSAgICAkcmVzdCA9ICQxOworCSAgICAkY29kZVskYWRkcmVzc10gPSAweGMwXzAwXzAwXzAwOyAKKwkgICAgaWYgKCRyZXN0ID1+IC9eKCR2YWx1ZSlccyosXHMqKCR2YWx1ZSlccyosXHMqKCR2YWx1ZSlccyokLykgeworCQkkY291bnQgPSAkMTsKKwkJJHNvdXJjZSA9ICQyOworCQkkZGVzdCA9ICAkMzsKK3ByaW50IFNUREVSUiAiUGFyc2luZyBNT1ZFIE1FTU9SWSAkY291bnQsICRzb3VyY2UsICRkZXN0XG4iIGlmICgkZGVidWcpOworCQkmcGFyc2VfdmFsdWUgKCRjb3VudCwgMCwgMCwgMyk7CisJCSZwYXJzZV92YWx1ZSAoJHNvdXJjZSwgMSwgMCwgNCk7CisJCSZwYXJzZV92YWx1ZSAoJGRlc3QsIDIsIDAsIDQpOworcHJpbnRmIFNUREVSUiAiTW92ZSBtZW1vcnkgaW5zdHJ1Y3Rpb24gPSAlMDh4LCUwOHgsJTA4eFxuIiwgCisJCSRjb2RlWyRhZGRyZXNzXSwgJGNvZGVbJGFkZHJlc3MrMV0sICRjb2RlWyRhZGRyZXNzICsyXSBpZgorCQkoJGRlYnVnKTsKKwkJJGFkZHJlc3MgKz0gMzsKKwkKKwkgICAgfSBlbHNlIHsKKwkJZGllIAorIiQwIDogc3ludGF4IGVycm9yIGluIGxpbmUgJGxpbmVubyA6ICRfCisJZXhwZWN0ZWQgPGNvdW50PiwgPHNvdXJjZT4sIDxkZXN0aW5hdGlvbj4KKyIKKwkgICAgfQorCX0gZWxzaWYgKCQxID1+IC9eKC4qKVxzKyhUT3xTSEx8U0hSKVxzKyguKikvaSkgeworcHJpbnQgU1RERVJSICJQYXJzaW5nIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyIG1vdmVcbiIgaWYgKCRkZWJ1Zyk7CisJICAgICRzcmMgPSAkMTsKKwkgICAgJG9wID0gIlxVJDJcRSI7CisJICAgICRyZXN0ID0gJDM7CisKKwkgICAgJGNvZGVbJGFkZHJlc3NdID0gMHg0MF8wMF8wMF8wMDsKKwkKKwkgICAgJGZvcmNlID0gKCRvcCAhfiAvVE8vaSk7IAorCisKK3ByaW50IFNUREVSUiAiRm9yY2luZyByZWdpc3RlciBzb3VyY2UgXG4iIGlmICgkZm9yY2UgJiYgJGRlYnVnKTsKKworCSAgICBpZiAoISRmb3JjZSAmJiAkc3JjID1+IAorCQkvXigkcmVnaXN0ZXIpXHMrKC18JG9wZXJhdG9yKVxzKygkdmFsdWUpXHMqJC9pKSB7CitwcmludCBTVERFUlIgInJlZ2lzdGVyIG9wZXJhbmQgIGRhdGE4IHNvdXJjZVxuIiBpZiAoJGRlYnVnKTsKKwkJJHNyY19yZWcgPSAiXFUkMVxFIjsKKwkJJG9wID0gIlxVJDJcRSI7CisJCWlmICgkb3AgbmUgJy0nKSB7CisJCSAgICAkZGF0YTggPSAkMzsKKwkJfSBlbHNlIHsKKwkJICAgIGRpZSAiLSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LlxuIgorCQl9CisJICAgIH0gZWxzaWYgKCRzcmMgPX4gL14oJHJlZ2lzdGVyKVxzKiQvaSkgeworcHJpbnQgU1RERVJSICJyZWdpc3RlciBzb3VyY2VcbiIgaWYgKCRkZWJ1Zyk7CisJCSRzcmNfcmVnID0gIlxVJDFcRSI7CisJCSMgRW5jb2RlIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyIG1vdmUgYXMgYSByZWdpc3RlciB8IDAgCisJCSMgbW92ZSB0byByZWdpc3Rlci4KKwkJaWYgKCEkZm9yY2UpIHsKKwkJICAgICRvcCA9ICd8JzsKKwkJfQorCQkkZGF0YTggPSAwOworCSAgICB9IGVsc2lmICghJGZvcmNlICYmICRzcmMgPX4gL14oJHZhbHVlKVxzKiQvaSkgeworcHJpbnQgU1RERVJSICJkYXRhOCBzb3VyY2VcbiIgaWYgKCRkZWJ1Zyk7CisJCSRzcmNfcmVnID0gdW5kZWY7CisJCSRvcCA9ICdOT05FJzsKKwkJJGRhdGE4ID0gJDE7CisJICAgIH0gZWxzZSB7CisJCWlmICghJGZvcmNlKSB7CisJCSAgICBkaWUgCisiJDAgOiBzeW50YXggZXJyb3IgaW4gbGluZSAkbGluZW5vIDogJF8KKwlleHBlY3RlZCA8cmVnaXN0ZXI+CisJCTxkYXRhOD4KKwkJPHJlZ2lzdGVyPiA8b3BlcmFuZD4gPGRhdGE4PgorIjsKKwkJfSBlbHNlIHsKKwkJICAgIGRpZQorIiQwIDogc3ludGF4IGVycm9yIGluIGxpbmUgJGxpbmVubyA6ICRfCisJZXhwZWN0ZWQgPHJlZ2lzdGVyPgorIjsKKwkJfQorCSAgICB9CisJICAgIGlmICgkcmVzdCA9fiAvXigkcmVnaXN0ZXIpXHMqKC4qKSQvaSkgeworCQkkZHN0X3JlZyA9ICJcVSQxXEUiOworCQkkcmVzdCA9ICQyOworCSAgICB9IGVsc2UgeworCSAgICBkaWUgCisiJDAgOiBzeW50YXggZXJyb3IgaW4gJGxpbmVubyA6ICRfCisJZXhwZWN0ZWQgPHJlZ2lzdGVyPiwgZ290ICRyZXN0CisiOworCSAgICB9CisKKwkgICAgaWYgKCRyZXN0ID1+IC9eV0lUSFxzK0NBUlJZXHMqKC4qKS9pKSB7CisJCSRyZXN0ID0gJDE7CisJCWlmICgkb3AgZXEgJysnKSB7CisJCSAgICAkY29kZVskYWRkcmVzc10gfD0gMHgwMV8wMF8wMF8wMDsKKwkJfSBlbHNlIHsKKwkJICAgIGRpZQorIiQwIDogc3ludGF4IGVycm9yIGluICRsaW5lbm8gOiAkXworCVdJVEggQ0FSUlkgb3B0aW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSAkb3Agb3BlcmF0b3IuCisiOworCQl9CisJICAgIH0KKworCSAgICBpZiAoJHJlc3QgIX4gL15ccyokLykgeworCQlkaWUKKyIkMCA6IHN5bnRheCBlcnJvciBpbiAkbGluZW5vIDogJF8KKwlFeHBlY3RlZCBlbmQgb2YgbGluZSwgZ290ICRyZXN0CisiOworCSAgICB9CisKKwkgICAgcHJpbnQgU1RERVJSICJzb3VyY2UgPSAkc3JjX3JlZywgZGF0YSA9ICRkYXRhOCAsIGRlc3RpbmF0aW9uID0gJGRzdF9yZWdcbiIKKwkJaWYgKCRkZWJ1Zyk7CisJICAgICMgTm90ZSB0aGF0IE1vdmUgZGF0YTggdG8gcmVnIGlzIGVuY29kZWQgYXMgYSByZWFkLW1vZGlmeS13cml0ZQorCSAgICAjIGluc3RydWN0aW9uLgorCSAgICBpZiAoKCRzcmNfcmVnIGVxIHVuZGVmKSB8fCAoJHNyY19yZWcgZXEgJGRzdF9yZWcpKSB7CisJCSRjb2RlWyRhZGRyZXNzXSB8PSAweDM4XzAwXzAwXzAwIHwgCisJCSAgICAoJHJlZ2lzdGVyc3skZHN0X3JlZ30gPDwgMTYpOworCSAgICB9IGVsc2lmICgkZHN0X3JlZyA9fiAvU0ZCUi9pKSB7CisJCSRjb2RlWyRhZGRyZXNzXSB8PSAweDMwXzAwXzAwXzAwIHwKKwkJICAgICgkcmVnaXN0ZXJzeyRzcmNfcmVnfSA8PCAxNik7CisJICAgIH0gZWxzaWYgKCRzcmNfcmVnID1+IC9TRkJSL2kpIHsKKwkJJGNvZGVbJGFkZHJlc3NdIHw9IDB4MjhfMDBfMDBfMDAgfAorCQkgICAgKCRyZWdpc3RlcnN7JGRzdF9yZWd9IDw8IDE2KTsKKwkgICAgfSBlbHNlIHsKKwkJZGllCisiJDAgOiBJbGxlZ2FsIGNvbWJpbmF0aW9uIG9mIHJlZ2lzdGVycyBpbiBsaW5lICRsaW5lbm8gOiAkXworCUVpdGhlciBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHJlZ2lzdGVycyBtdXN0IGJlIHRoZSBzYW1lLAorCW9yIGVpdGhlciBzb3VyY2Ugb3IgZGVzdGluYXRpb24gcmVnaXN0ZXIgbXVzdCBiZSBTRkJSLgorIjsKKwkgICAgfQorCisJICAgICRjb2RlWyRhZGRyZXNzXSB8PSAkb3BlcmF0b3JzeyRvcH07CisJICAgIAorCSAgICAmcGFyc2VfdmFsdWUgKCRkYXRhOCwgMCwgMSwgMSk7CisJICAgICRjb2RlWyRhZGRyZXNzXSB8PSAkb3BlcmF0b3JzeyRvcH07CisJICAgICRjb2RlWyRhZGRyZXNzICsgMV0gPSAweDAwXzAwXzAwXzAwOyMgUmVzZXJ2ZWQKKwkgICAgJGFkZHJlc3MgKz0gMjsKKwl9IGVsc2UgeworCSAgICBkaWUgCisiJDAgOiBzeW50YXggZXJyb3IgaW4gbGluZSAkbGluZW5vIDogJF8KKwlleHBlY3RlZCAoaW5pdGlhdG9yKSA8bGVuZ3RoPiwgPGFkZHJlc3M+LCBXSEVOIDxwaGFzZT4KKwkJICh0YXJnZXQpIDxsZW5ndGg+LCA8YWRkcmVzcz4sIFdJVEggPHBoYXNlPgorCQkgTUVNT1JZIDxsZW5ndGg+LCA8c291cmNlPiwgPGRlc3RpbmF0aW9uPgorCQkgPGV4cHJlc3Npb24+IFRPIDxyZWdpc3Rlcj4KKyI7CisJfQorIyBQcm9jZXNzIFNFTEVDVCB7QVROfH0gaWQsIGZhaWxfYWRkcmVzcworICAgIH0gZWxzaWYgKC9eXHMqKFNFTEVDVHxSRVNFTEVDVClccysoLiopL2kpIHsKKwkkcmVzdCA9ICQyOworCWlmICgkcmVzdCA9fiAvXihBVE58KVxzKigkdmFsdWUpXHMqLFxzKigkaWRlbnRpZmllcilccyokL2kpIHsKKwkgICAgJGF0biA9ICQxOworCSAgICAkaWQgPSAkMjsKKwkgICAgJGFsdF9hZGRyID0gJDM7CisJICAgICRjb2RlWyRhZGRyZXNzXSA9IDB4NDBfMDBfMDBfMDAgfCAKKwkJKCgkYXRuID1+IC9BVE4vaSkgPyAweDAxXzAwXzAwXzAwIDogMCk7CisJICAgICRjb2RlWyRhZGRyZXNzICsgMV0gPSAweDAwXzAwXzAwXzAwOworCSAgICAmcGFyc2VfdmFsdWUoJGlkLCAwLCAyLCAxKTsKKwkgICAgJnBhcnNlX3ZhbHVlKCRhbHRfYWRkciwgMSwgMCwgNCk7CisJICAgICRhZGRyZXNzICs9IDI7CisJfSBlbHNpZiAoJHJlc3QgPX4gL14oQVROfClccypGUk9NXHMrKCR2YWx1ZSlccyosXHMqKCRpZGVudGlmaWVyKVxzKiQvaSkgeworCSAgICAkYXRuID0gJDE7CisJICAgICRhZGRyID0gJDI7CisJICAgICRhbHRfYWRkciA9ICQzOworCSAgICAkY29kZVskYWRkcmVzc10gPSAweDQyXzAwXzAwXzAwIHwgCisJCSgoJGF0biA9fiAvQVROL2kpID8gMHgwMV8wMF8wMF8wMCA6IDApOworCSAgICAkY29kZVskYWRkcmVzcyArIDFdID0gMHgwMF8wMF8wMF8wMDsKKwkgICAgJnBhcnNlX3ZhbHVlKCRhZGRyLCAwLCAwLCAzKTsKKwkgICAgJnBhcnNlX3ZhbHVlKCRhbHRfYWRkciwgMSwgMCwgNCk7CisJICAgICRhZGRyZXNzICs9IDI7CisgICAgICAgIH0gZWxzZSB7CisJICAgIGRpZSAKKyIkMCA6IHN5bnRheCBlcnJvciBpbiBsaW5lICRsaW5lbm8gOiAkXworCWV4cGVjdGVkIFNFTEVDVCBpZCwgYWx0ZXJuYXRlX2FkZHJlc3Mgb3IgCisJCVNFTEVDVCBGUk9NIGFkZHJlc3MsIGFsdGVybmF0ZV9hZGRyZXNzIG9yIAorCQlSRVNFTEVDVCBpZCwgYWx0ZXJuYXRlX2FkZHJlc3Mgb3IKKwkJUkVTRUxFQ1QgRlJPTSBhZGRyZXNzLCBhbHRlcm5hdGVfYWRkcmVzcworIjsKKwl9CisgICAgfSBlbHNpZiAoL15ccypXQUlUXHMrKC4qKS9pKSB7CisJICAgICRyZXN0ID0gJDE7CitwcmludCBTVERFUlIgIlBhcnNpbmcgV0FJVCAkcmVzdFxuIiBpZiAoJGRlYnVnKTsKKwlpZiAoJHJlc3QgPX4gL15ESVNDT05ORUNUXHMqJC9pKSB7CisJICAgICRjb2RlWyRhZGRyZXNzXSA9IDB4NDhfMDBfMDBfMDA7CisJICAgICRjb2RlWyRhZGRyZXNzICsgMV0gPSAweDAwXzAwXzAwXzAwOworCSAgICAkYWRkcmVzcyArPSAyOworCX0gZWxzaWYgKCRyZXN0ID1+IC9eKFJFU0VMRUNUfFNFTEVDVClccysoJGlkZW50aWZpZXIpXHMqJC9pKSB7CisJICAgICRhbHRfYWRkciA9ICQyOworCSAgICAkY29kZVskYWRkcmVzc10gPSAweDUwXzAwXzAwXzAwOworCSAgICAmcGFyc2VfdmFsdWUgKCRhbHRfYWRkciwgMSwgMCwgNCk7CisJICAgICRhZGRyZXNzICs9IDI7CisJfSBlbHNlIHsKKwkgICAgZGllCisiJDAgOiBzeW50YXggZXJyb3IgaW4gbGluZSAkbGluZW5vIDogJF8KKwlleHBlY3RlZCAoaW5pdGlhdG9yKSBXQUlUIERJU0NPTk5FQ1Qgb3IgCisJCSAoaW5pdGlhdG9yKSBXQUlUIFJFU0VMRUNUIGFsdGVybmF0ZV9hZGRyZXNzIG9yCisJCSAodGFyZ2V0KSBXQUlUIFNFTEVDVCBhbHRlcm5hdGVfYWRkcmVzcworIjsKKwl9CisjIEhhbmRsZSBTRVQgYW5kIENMRUFSIGluc3RydWN0aW9ucy4gIE5vdGUgdGhhdCB3ZSBzaG91bGQgYWxzbyBkbyBzb21ldGhpbmcKKyMgd2l0aCB0aGlzIHN5bnRheCB0byBzZXQgdGFyZ2V0IG1vZGUuCisgICAgfSBlbHNpZiAoL15ccyooU0VUfENMRUFSKVxzKyguKikvaSkgeworCSRzZXQgPSAkMTsKKwkkbGlzdCA9ICQyOworCSRjb2RlWyRhZGRyZXNzXSA9ICgkc2V0ID1+IC9TRVQvaSkgPyAgMHg1OF8wMF8wMF8wMCA6IAorCSAgICAweDYwXzAwXzAwXzAwOworCWZvcmVhY2ggJGFyZyAoc3BsaXQgKC9ccytBTkRccysvaSwkbGlzdCkpIHsKKwkgICAgaWYgKCRhcmcgPX4gL0FUTi9pKSB7CisJCSRjb2RlWyRhZGRyZXNzXSB8PSAweDAwXzAwXzAwXzA4OworCSAgICB9IGVsc2lmICgkYXJnID1+IC9BQ0svaSkgeworCQkkY29kZVskYWRkcmVzc10gfD0gMHgwMF8wMF8wMF80MDsKKwkgICAgfSBlbHNpZiAoJGFyZyA9fiAvVEFSR0VUL2kpIHsKKwkJJGNvZGVbJGFkZHJlc3NdIHw9IDB4MDBfMDBfMDJfMDA7CisJICAgIH0gZWxzaWYgKCRhcmcgPX4gL0NBUlJZL2kpIHsKKwkJJGNvZGVbJGFkZHJlc3NdIHw9IDB4MDBfMDBfMDRfMDA7CisJICAgIH0gZWxzZSB7CisJCWRpZSAKKyIkMCA6IHN5bnRheCBlcnJvciBpbiBsaW5lICRsaW5lbm8gOiAkXworCWV4cGVjdGVkICRzZXQgZm9sbG93ZWQgYnkgYSBBTkQgZGVsaW1pdGVkIGxpc3Qgb2Ygb25lIG9yIAorCW1vcmUgc3RyaW5ncyBmcm9tIHRoZSBsaXN0IEFDSywgQVROLCBDQVJSWSwgVEFSR0VULgorIjsKKwkgICAgfQorCX0KKwkkY29kZVskYWRkcmVzcyArIDFdID0gMHgwMF8wMF8wMF8wMDsKKwkkYWRkcmVzcyArPSAyOworICAgIH0gZWxzaWYgKC9eXHMqKEpVTVB8Q0FMTHxJTlQpXHMrKC4qKS9pKSB7CisJJGluc3RydWN0aW9uID0gJDE7CisJJHJlc3QgPSAkMjsKKwlpZiAoJGluc3RydWN0aW9uID1+IC9KVU1QL2kpIHsKKwkgICAgJGNvZGVbJGFkZHJlc3NdID0gMHg4MF8wMF8wMF8wMDsKKwl9IGVsc2lmICgkaW5zdHJ1Y3Rpb24gPX4gL0NBTEwvaSkgeworCSAgICAkY29kZVskYWRkcmVzc10gPSAweDg4XzAwXzAwXzAwOworCX0gZWxzZSB7CisJICAgICRjb2RlWyRhZGRyZXNzXSA9IDB4OThfMDBfMDBfMDA7CisJfQorcHJpbnQgU1RERVJSICJwYXJzaW5nIEpVTVAsIHJlc3QgPSAkcmVzdFxuIiBpZiAoJGRlYnVnKTsKKworIyBSZWxhdGl2ZSBqdW1wLiAKKwlpZiAoJHJlc3QgPX4gL14oUkVMXHMqXChccyokaWRlbnRpZmllclxzKlwpKVxzKiguKikvaSkgeyAKKwkgICAgJGFkZHIgPSAkMTsKKwkgICAgJHJlc3QgPSAkMjsKK3ByaW50IFNUREVSUiAicGFyc2luZyBKVU1QIFJFTCwgYWRkciA9ICRhZGRyLCByZXN0ID0gJHJlc3RcbiIgaWYgKCRkZWJ1Zyk7CisJICAgICRjb2RlWyRhZGRyZXNzXSAgfD0gMHgwMF84MF8wMF8wMDsKKwkgICAgJnBhcnNlX3ZhbHVlKCRhZGRyLCAxLCAwLCA0KTsKKyMgQWJzb2x1dGUganVtcCwgcmVxdWlyZXMgbm8gbW9yZSBndW5rCisJfSBlbHNpZiAoJHJlc3QgPX4gL14oJHZhbHVlKVxzKiguKikvKSB7CisJICAgICRhZGRyID0gJDE7CisJICAgICRyZXN0ID0gJDI7CisJICAgICZwYXJzZV92YWx1ZSgkYWRkciwgMSwgMCwgNCk7CisJfSBlbHNlIHsKKwkgICAgZGllCisiJDAgOiBzeW50YXggZXJyb3IgaW4gbGluZSAkbGluZW5vIDogJF8KKwlleHBlY3RlZCA8YWRkcmVzcz4gb3IgUkVMIChhZGRyZXNzKQorIjsKKwl9CisKKwlpZiAoJHJlc3QgPX4gL14sXHMqKC4qKS8pIHsKKwkgICAgJnBhcnNlX2NvbmRpdGlvbmFsKCQxKTsKKwl9IGVsc2lmICgkcmVzdCA9fiAvXlxzKiQvKSB7CisJICAgICRjb2RlWyRhZGRyZXNzXSB8PSAoMSA8PCAxOSk7CisJfSBlbHNlIHsKKwkgICAgZGllCisiJDAgOiBzeW50YXggZXJyb3IgaW4gbGluZSAkbGluZW5vIDogJF8KKwlleHBlY3RlZCAsIDxjb25kaXRpb25hbD4gb3IgZW5kIG9mIGxpbmUsIGdvdCAkMQorIjsKKwl9CisJCisJJGFkZHJlc3MgKz0gMjsKKyAgICB9IGVsc2lmICgvXlxzKihSRVRVUk58SU5URkxZKVxzKiguKikvaSkgeworCSRpbnN0cnVjdGlvbiA9ICQxOworCSRjb25kaXRpb25hbCA9ICQyOyAKK3ByaW50IFNUREVSUiAiUGFyc2luZyAkaW5zdHJ1Y3Rpb25cbiIgaWYgKCRkZWJ1Zyk7CisJJGNvZGVbJGFkZHJlc3NdID0gKCRpbnN0cnVjdGlvbiA9fiAvUkVUVVJOL2kpID8gMHg5MF8wMF8wMF8wMCA6CisJICAgIDB4OThfMTBfMDBfMDA7CisJaWYgKCRjb25kaXRpb25hbCA9fiAvXixccyooLiopLykgeworCSAgICAkY29uZGl0aW9uYWwgPSAkMTsKKwkgICAgJnBhcnNlX2NvbmRpdGlvbmFsICgkY29uZGl0aW9uYWwpOworCX0gZWxzaWYgKCRjb25kaXRpb25hbCAhfiAvXlxzKiQvKSB7CisJICAgIGRpZQorIiQwIDogc3ludGF4IGVycm9yIGluIGxpbmUgJGxpbmVubyA6ICRfCisJZXhwZWN0ZWQgLCA8Y29uZGl0aW9uYWw+IAorIjsKKwl9IGVsc2UgeworCSAgICAkY29kZVskYWRkcmVzc10gfD0gMHgwMF8wOF8wMF8wMDsKKwl9CisJICAgCisJJGNvZGVbJGFkZHJlc3MgKyAxXSA9IDB4MDBfMDBfMDBfMDA7CisJJGFkZHJlc3MgKz0gMjsKKyAgICB9IGVsc2lmICgvXlxzKkRJU0NPTk5FQ1RccyokLykgeworCSRjb2RlWyRhZGRyZXNzXSA9IDB4NDhfMDBfMDBfMDA7CisJJGNvZGVbJGFkZHJlc3MgKyAxXSA9IDB4MDBfMDBfMDBfMDA7CisJJGFkZHJlc3MgKz0gMjsKKyMgSSdtIG5vdCBzdXJlIHRoYXQgSSBzaG91bGQgYmUgaW5jbHVkaW5nIHRoaXMgZXh0ZW5zaW9uLCBidXQgCisjIHdoYXQgdGhlIGhlbGw/CisgICAgfSBlbHNpZiAoL15ccypOT1BccyokL2kpIHsKKwkkY29kZVskYWRkcmVzc10gPSAweDgwXzg4XzAwXzAwOworCSRjb2RlWyRhZGRyZXNzICsgMV0gPSAweDAwXzAwXzAwXzAwOworCSRhZGRyZXNzICs9IDI7CisjIElnbm9yZSBsaW5lcyBjb25zaXN0aW5nIGVudGlyZWx5IG9mIHdoaXRlIHNwYWNlCisgICAgfSBlbHNpZiAoL15ccyokLykgeworICAgIH0gZWxzZSB7CisJZGllIAorIiQwIDogc3ludGF4IGVycm9yIGluIGxpbmUgJGxpbmVubzogJF8KKwlleHBlY3RlZCBsYWJlbDosIEFCU09MVVRFLCBDTEVBUiwgRElTQ09OTkVDVCwgRVhURVJOQUwsIE1PVkUsIFJFU0VMRUNULAorCSAgICBTRUxFQ1QgU0VULCBvciBXQUlUCisiOworICAgIH0KK30KKworIyBGaWxsIGluIGxhYmVsIHJlZmVyZW5jZXMKKworQHVuZGVmaW5lZCA9IGtleXMgJWZvcndhcmQ7CitpZiAoJCN1bmRlZmluZWQgPj0gMCkgeworICAgIHByaW50IFNUREVSUiAiVW5kZWZpbmVkIHN5bWJvbHMgOiBcbiI7CisgICAgZm9yZWFjaCAkdW5kZWYgKEB1bmRlZmluZWQpIHsKKwlwcmludCBTVERFUlIgIiR1bmRlZiBpbiAkZm9yd2FyZHskdW5kZWZ9XG4iOworICAgIH0KKyAgICBleGl0IDE7Cit9CisKK0BsYWJlbF9wYXRjaGVzID0gKCk7CisKK0BleHRlcm5hbF9wYXRjaGVzID0gKCk7CisKK0BhYnNvbHV0ZSA9IHNvcnQgQGFic29sdXRlOworCitmb3JlYWNoICRpIChAYWJzb2x1dGUpIHsKKyAgICBmb3JlYWNoICRqIChzcGxpdCAoL1xzKy8sJHN5bWJvbF9yZWZlcmVuY2VzeyRpfSkpIHsKKwkkaiA9fiAvKFJFTHxBQlMpLCguKiksKC4qKS87CisJJHR5cGUgPSAkMTsKKwkkYWRkcmVzcyA9ICQyOworCSRsZW5ndGggPSAkMzsKKwlkaWUgCisiJDAgOiAkc3ltYm9sICRpIGhhcyBpbnZhbGlkIHJlbGF0aXZlIHJlZmVyZW5jZSBhdCBhZGRyZXNzICRhZGRyZXNzLAorICAgIHNpemUgJGxlbmd0aFxuIgorCWlmICgkdHlwZSBlcSAnUkVMJyk7CisJICAgIAorCSZwYXRjaCAoJGFkZHJlc3MgLyA0LCAkYWRkcmVzcyAlIDQsICRsZW5ndGgsICRzeW1ib2xfdmFsdWVzeyRpfSk7CisgICAgfQorfQorCitmb3JlYWNoICRleHRlcm5hbCAoQGV4dGVybmFsKSB7CitwcmludCBTVERFUlIgImNoZWNraW5nIGV4dGVybmFsICRleHRlcm5hbCBcbiIgaWYgKCRkZWJ1Z19leHRlcm5hbCk7CisgICAgaWYgKCRzeW1ib2xfcmVmZXJlbmNlc3skZXh0ZXJuYWx9IG5lIHVuZGVmKSB7CisJZm9yICRyZWZlcmVuY2UgKHNwbGl0KC9ccysvLCRzeW1ib2xfcmVmZXJlbmNlc3skZXh0ZXJuYWx9KSkgeworCSAgICAkcmVmZXJlbmNlID1+IC8oUkVMfEFCUyksKC4qKSwoLiopLzsKKwkgICAgJHR5cGUgPSAkMTsKKwkgICAgJGFkZHJlc3MgPSAkMjsKKwkgICAgJGxlbmd0aCA9ICQzOworCSAgICAKKwkgICAgZGllIAorIiQwIDogc3ltYm9sICRsYWJlbCBpcyBleHRlcm5hbCwgaGFzIGludmFsaWQgcmVsYXRpdmUgcmVmZXJlbmNlIGF0ICRhZGRyZXNzLAorICAgIHNpemUgJGxlbmd0aFxuIgorCQlpZiAoJHR5cGUgZXEgJ1JFTCcpOworCisJICAgIGRpZSAKKyIkMCA6IHN5bWJvbCAkbGFiZWwgaGFzIGludmFsaWQgcmVmZXJlbmNlIGF0ICRhZGRyZXNzLCBzaXplICRsZW5ndGhcbiIKKwkJaWYgKCgoJGFkZHJlc3MgJSA0KSAhPTApIHx8ICgkbGVuZ3RoICE9IDQpKTsKKworCSAgICAkc3ltYm9sID0gJHN5bWJvbF92YWx1ZXN7JGV4dGVybmFsfTsKKwkgICAgJGFkZCA9ICRjb2RlWyRhZGRyZXNzIC8gNF07CisJICAgIGlmICgkYWRkIGVxIDApIHsKKwkJJGNvZGVbJGFkZHJlc3MgLyA0XSA9ICRzeW1ib2w7CisJICAgIH0gZWxzZSB7CisJCSRhZGQgPSBzcHJpbnRmICgiMHglMDh4IiwgJGFkZCk7CisJCSRjb2RlWyRhZGRyZXNzIC8gNF0gPSAiJHN5bWJvbCArICRhZGQiOworCSAgICB9CisJCQorcHJpbnQgU1RERVJSICJyZWZlcmVuY2VkIGV4dGVybmFsICRleHRlcm5hbCBhdCAkMVxuIiBpZiAoJGRlYnVnX2V4dGVybmFsKTsKKwl9CisgICAgfQorfQorCitmb3JlYWNoICRsYWJlbCAoQGxhYmVsKSB7CisgICAgaWYgKCRzeW1ib2xfcmVmZXJlbmNlc3skbGFiZWx9IG5lIHVuZGVmKSB7CisJZm9yICRyZWZlcmVuY2UgKHNwbGl0KC9ccysvLCRzeW1ib2xfcmVmZXJlbmNlc3skbGFiZWx9KSkgeworCSAgICAkcmVmZXJlbmNlID1+IC8oUkVMfEFCUyksKC4qKSwoLiopLzsKKwkgICAgJHR5cGUgPSAkMTsKKwkgICAgJGFkZHJlc3MgPSAkMjsKKwkgICAgJGxlbmd0aCA9ICQzOworCisJICAgIGlmICgoKCRhZGRyZXNzICUgNCkgIT0wKSB8fCAoJGxlbmd0aCAhPSA0KSkgeworCQlkaWUgIiQwIDogc3ltYm9sICRsYWJlbCBoYXMgaW52YWxpZCByZWZlcmVuY2UgYXQgJDEsIHNpemUgJDJcbiI7CisJICAgIH0KKworCSAgICBpZiAoJHR5cGUgZXEgJ0FCUycpIHsKKwkJJGNvZGVbJGFkZHJlc3MgLyA0XSArPSAkc3ltYm9sX3ZhbHVlc3skbGFiZWx9OworCQlwdXNoIChAbGFiZWxfcGF0Y2hlcywgJGFkZHJlc3MgLyA0KTsKKwkgICAgfSBlbHNlIHsKKyMgCisjIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlZmVyZW5jZSBzaG91bGQgYmUgaW4gdGhlIHNlY29uZCBhbmQgbGFzdCB3b3JkCisjCW9mIGFuIGluc3RydWN0aW9uCisjIC0gUmVsYXRpdmUganVtcHMsIGV0Yy4gYXJlIHJlbGF0aXZlIHRvIHRoZSBEU1Agb2YgdGhlIF9uZXh0XyBpbnN0cnVjdGlvbgorIworIyBTbywgd2UgbmVlZCB0byBhZGQgZm91ciB0byB0aGUgYWRkcmVzcyBvZiB0aGUgcmVmZXJlbmNlLCB0byBnZXQgCisjIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IGluc3RydWN0aW9uLCB3aGVuIGNvbXB1dGluZyB0aGUgcmVmZXJlbmNlLgorICAKKwkJJHRtcCA9ICRzeW1ib2xfdmFsdWVzeyRsYWJlbH0gLSAKKwkJICAgICgkYWRkcmVzcyArIDQpOworCQlkaWUgCisjIFJlbGF0aXZlIGFkZHJlc3NpbmcgaXMgbGltaXRlZCB0byAyNCBiaXRzLgorIiQwIDogc3ltYm9sICRsYWJlbCBpcyB0b28gZmFyICgkdG1wKSBmcm9tICRhZGRyZXNzIHRvIHJlZmVyZW5jZSBhcyAKKyAgICByZWxhdGl2ZS9cbiIgaWYgKCgkdG1wID49IDB4ODBfMDBfMDApIHx8ICgkdG1wIDwgLTB4ODBfMDBfMDApKTsKKwkJJGNvZGVbJGFkZHJlc3MgLyA0XSA9ICR0bXAgJiAweDAwX2ZmX2ZmX2ZmOworCSAgICB9CisJfQorICAgIH0KK30KKworIyBPdXRwdXQgU0NSSVBUW10gYXJyYXksIG9uZSBpbnN0cnVjdGlvbiBwZXIgbGluZS4gIE9wdGlvbmFsbHkgCisjIHByaW50IHRoZSBvcmlnaW5hbCBjb2RlIHRvby4KKworb3BlbiAoT1VUUFVULCAiPiRvdXRwdXQiKSB8fCBkaWUgIiQwIDogY2FuJ3Qgb3BlbiAkb3V0cHV0IGZvciB3cml0aW5nXG4iOworb3BlbiAoT1VUUFVUVSwgIj4kb3V0cHV0dSIpIHx8IGRpZSAiJDAgOiBjYW4ndCBvcGVuICRvdXRwdXR1IGZvciB3cml0aW5nXG4iOworCisoJF8gPSAkMCkgPX4gczouKi86OjsKK3ByaW50IE9VVFBVVCAiLyogRE8gTk9UIEVESVQgLSBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAiLiRfLiIgKi9cbiI7CitwcmludCBPVVRQVVQgInN0YXRpYyB1MzIgIi4kcHJlZml4LiJTQ1JJUFRbXSA9IHtcbiI7CiskaW5zdHJ1Y3Rpb25zID0gMDsKK2ZvciAoJGkgPSAwOyAkaSA8ICQjY29kZTsgKSB7CisgICAgaWYgKCRsaXN0X2luX2FycmF5KSB7CisJcHJpbnRmIE9VVFBVVCAiLypcbiRsaXN0WyRpXVxuYXQgMHglMDh4IDogKi8iLCAkaTsKKyAgICB9CisgICAgcHJpbnRmIE9VVFBVVCAiXHQweCUwOHgsIiwgJGNvZGVbJGldOworICAgIHByaW50ZiBTVERFUlIgIkFkZHJlc3MgJGkgPSAleFxuIiwgJGNvZGVbJGldIGlmICgkZGVidWcpOworICAgIGlmICgkY29kZVskaSArIDFdID1+IC9ccyooJGlkZW50aWZpZXIpKC4qKSQvKSB7CisJcHVzaCAoQGV4dGVybmFsX3BhdGNoZXMsICRpKzEsICQxKTsKKwlwcmludGYgT1VUUFVUICIwJXMsIiwgJDIKKyAgICB9IGVsc2UgeworCXByaW50ZiBPVVRQVVQgIjB4JTA4eCwiLCRjb2RlWyRpKzFdOworICAgIH0KKworICAgIGlmICgoJGNvZGVbJGldICYgMHhmZl8wMF8wMF8wMCkgPT0gMHhjMF8wMF8wMF8wMCkgeworCWlmICgkY29kZVskaSArIDJdID1+IC8kaWRlbnRpZmllci8pIHsKKwkgICAgcHVzaCAoQGV4dGVybmFsX3BhdGNoZXMsICRpKzIsICRjb2RlWyRpKzJdKTsKKwkgICAgcHJpbnRmIE9VVFBVVCAiMCxcbiI7CisJfSBlbHNlIHsKKwkgICAgcHJpbnRmIE9VVFBVVCAiMHglMDh4LFxuIiwkY29kZVskaSsyXTsKKwl9CisJJGkgKz0gMzsKKyAgICB9IGVsc2UgeworCXByaW50ZiBPVVRQVVQgIlxuIjsKKwkkaSArPSAyOworICAgIH0KKyAgICAkaW5zdHJ1Y3Rpb25zICs9IDE7Cit9CitwcmludCBPVVRQVVQgIn07XG5cbiI7CisKK2ZvcmVhY2ggJGkgKEBhYnNvbHV0ZSkgeworICAgIHByaW50ZiBPVVRQVVQgIiNkZWZpbmUgQV8kaVx0MHglMDh4XG4iLCAkc3ltYm9sX3ZhbHVlc3skaX07CisgICAgaWYgKGRlZmluZWQoJHByZWZpeCkgJiYgJHByZWZpeCBuZSAnJykgeworCXByaW50ZiBPVVRQVVQgIiNkZWZpbmUgQV8iLiRpLiJfdXNlZCAiLiRwcmVmaXguIkFfIi4kaS4iX3VzZWRcbiI7CisJcHJpbnRmIE9VVFBVVFUgIiN1bmRlZiBBXyIuJGkuIl91c2VkXG4iOworICAgIH0KKyAgICBwcmludGYgT1VUUFVUVSAiI3VuZGVmIEFfJGlcbiI7CisKKyAgICBwcmludGYgT1VUUFVUICJzdGF0aWMgdTMyIEFfIi4kaS4iX3VzZWRcW1xdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHtcbiI7CitwcmludGYgU1RERVJSICIkaSBpcyB1c2VkICRzeW1ib2xfcmVmZXJlbmNlc3skaX1cbiIgaWYgKCRkZWJ1Zyk7CisgICAgZm9yZWFjaCAkaiAoc3BsaXQgKC9ccysvLCRzeW1ib2xfcmVmZXJlbmNlc3skaX0pKSB7CisJJGogPX4gLyhBQlN8UkVMKSwoLiopLCguKikvOworCWlmICgkMSBlcSAnQUJTJykgeworCSAgICAkYWRkcmVzcyA9ICQyOworCSAgICAkbGVuZ3RoID0gJDM7CisJICAgIHByaW50ZiBPVVRQVVQgIlx0MHglMDh4LFxuIiwgJGFkZHJlc3MgLyA0OworCX0KKyAgICB9CisgICAgcHJpbnRmIE9VVFBVVCAifTtcblxuIjsKK30KKworZm9yZWFjaCAkaSAoc29ydCBAZW50cnkpIHsKKyAgICBwcmludGYgT1VUUFVUICIjZGVmaW5lIEVudF8kaVx0MHglMDh4XG4iLCAkc3ltYm9sX3ZhbHVlc3skaX07CisgICAgcHJpbnRmIE9VVFBVVFUgIiN1bmRlZiBFbnRfJGlcbiIsICRzeW1ib2xfdmFsdWVzeyRpfTsKK30KKworIworIyBOQ1IgYXNzZW1ibGVyIG91dHB1dHMgbGFiZWwgcGF0Y2hlcyBpbiB0aGUgZm9ybSBvZiBpbmRpY2VzIGludG8gCisjIHRoZSBjb2RlLgorIworcHJpbnRmIE9VVFBVVCAic3RhdGljIHUzMiAiLiRwcmVmaXguIkxBQkVMUEFUQ0hFU1tdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHtcbiI7Citmb3IgJHBhdGNoIChzb3J0IHskYSA8PT4gJGJ9IEBsYWJlbF9wYXRjaGVzKSB7CisgICAgcHJpbnRmIE9VVFBVVCAiXHQweCUwOHgsXG4iLCAkcGF0Y2g7Cit9CitwcmludGYgT1VUUFVUICJ9O1xuXG4iOworCiskbnVtX2V4dGVybmFsX3BhdGNoZXMgPSAwOworcHJpbnRmIE9VVFBVVCAic3RhdGljIHN0cnVjdCB7XG5cdHUzMlx0b2Zmc2V0O1xuXHR2b2lkXHRcdCphZGRyZXNzO1xuIi4KKyAgICAifSAiLiRwcmVmaXguIkVYVEVSTkFMX1BBVENIRVNbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7XG4iOword2hpbGUgKCRpZGVudCA9IHBvcChAZXh0ZXJuYWxfcGF0Y2hlcykpIHsKKyAgICAkb2ZmID0gcG9wKEBleHRlcm5hbF9wYXRjaGVzKTsKKyAgICBwcmludGYgT1VUUFVUICJcdHsweCUwOHgsICYlc30sXG4iLCAkb2ZmLCAkaWRlbnQ7CisgICAgKyskbnVtX2V4dGVybmFsX3BhdGNoZXM7Cit9CitwcmludGYgT1VUUFVUICJ9O1xuXG4iOworCitwcmludGYgT1VUUFVUICJzdGF0aWMgdTMyICIuJHByZWZpeC4iSU5TVFJVQ1RJT05TIF9fYXR0cmlidXRlKCh1bnVzZWQpKVx0PSAlZDtcbiIsIAorICAgICRpbnN0cnVjdGlvbnM7CitwcmludGYgT1VUUFVUICJzdGF0aWMgdTMyICIuJHByZWZpeC4iUEFUQ0hFUyBfX2F0dHJpYnV0ZSgodW51c2VkKSlcdD0gJWQ7XG4iLCAKKyAgICAkI2xhYmVsX3BhdGNoZXMrMTsKK3ByaW50ZiBPVVRQVVQgInN0YXRpYyB1MzIgIi4kcHJlZml4LiJFWFRFUk5BTF9QQVRDSEVTX0xFTiBfX2F0dHJpYnV0ZSgodW51c2VkKSlcdD0gJWQ7XG4iLAorICAgICRudW1fZXh0ZXJuYWxfcGF0Y2hlczsKK2Nsb3NlIE9VVFBVVDsKK2Nsb3NlIE9VVFBVVFU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaS5jIGIvZHJpdmVycy9zY3NpL3Njc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTdhYjNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Njc2kuYwpAQCAtMCwwICsxLDEzNzUgQEAKKy8qCisgKiAgc2NzaS5jIENvcHlyaWdodCAoQykgMTk5MiBEcmV3IEVja2hhcmR0CisgKiAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5OSBFcmljIFlvdW5nZGFsZQorICogICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgQ2hyaXN0b3BoIEhlbGx3aWcKKyAqCisgKiAgZ2VuZXJpYyBtaWQtbGV2ZWwgU0NTSSBkcml2ZXIKKyAqICAgICAgSW5pdGlhbCB2ZXJzaW9uczogRHJldyBFY2toYXJkdAorICogICAgICBTdWJzZXF1ZW50IHJldmlzaW9uczogRXJpYyBZb3VuZ2RhbGUKKyAqCisgKiAgPGRyZXdAY29sb3JhZG8uZWR1PgorICoKKyAqICBCdWcgY29ycmVjdGlvbiB0aGFua3MgZ28gdG8gOgorICogICAgICBSaWsgRmFpdGggPGZhaXRoQGNzLnVuYy5lZHU+CisgKiAgICAgIFRvbW15IFRob3JuIDx0dGhvcm4+CisgKiAgICAgIFRob21hcyBXdWVuc2NoZSA8dHdAZmdiMS5mZ2IubXcudHUtbXVlbmNoZW4uZGU+CisgKgorICogIE1vZGlmaWVkIGJ5IEVyaWMgWW91bmdkYWxlIGVyaWNAYW5kYW50ZS5vcmcgb3IgZXJpY3lAZ251LmFpLm1pdC5lZHUgdG8KKyAqICBhZGQgc2NhdHRlci1nYXRoZXIsIG11bHRpcGxlIG91dHN0YW5kaW5nIHJlcXVlc3QsIGFuZCBvdGhlcgorICogIGVuaGFuY2VtZW50cy4KKyAqCisgKiAgTmF0aXZlIG11bHRpY2hhbm5lbCwgd2lkZSBzY3NpLCAvcHJvYy9zY3NpIGFuZCBob3QgcGx1Z2dpbmcKKyAqICBzdXBwb3J0IGFkZGVkIGJ5IE1pY2hhZWwgTmV1ZmZlciA8bWlrZUBpLWNvbm5lY3QubmV0PgorICoKKyAqICBBZGRlZCByZXF1ZXN0X21vZHVsZSgic2NzaV9ob3N0YWRhcHRlciIpIGZvciBrZXJuZWxkOgorICogIChQdXQgYW4gImFsaWFzIHNjc2lfaG9zdGFkYXB0ZXIgeW91cl9ob3N0YWRhcHRlciIgaW4gL2V0Yy9tb2Rwcm9iZS5jb25mKQorICogIEJqb3JuIEVrd2FsbCAgPGJqMHJuQGJsb3guc2U+CisgKiAgKGNoYW5nZWQgdG8ga21vZCkKKyAqCisgKiAgTWFqb3IgaW1wcm92ZW1lbnRzIHRvIHRoZSB0aW1lb3V0LCBhYm9ydCwgYW5kIHJlc2V0IHByb2Nlc3NpbmcsCisgKiAgYXMgd2VsbCBhcyBwZXJmb3JtYW5jZSBtb2RpZmljYXRpb25zIGZvciBsYXJnZSBxdWV1ZSBkZXB0aHMgYnkKKyAqICBMZW9uYXJkIE4uIFp1YmtvZmYgPGxuekBkYW5kZWxpb24uY29tPgorICoKKyAqICBDb252ZXJ0ZWQgY2xpKCkgY29kZSB0byBzcGlubG9ja3MsIEluZ28gTW9sbmFyCisgKgorICogIEppZmZpZXMgd3JhcCBmaXhlcyAoaG9zdC0+cmVzZXR0aW5nKSwgMyBEZWMgMTk5OCBBbmRyZWEgQXJjYW5nZWxpCisgKgorICogIG91dF9vZl9zcGFjZSBoYWNrcywgRC4gR2lsYmVydCAoZHBnKSA5OTA2MDgKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGJnLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9yZXF1ZXN0Lmg+CisKKyNpbmNsdWRlICJzY3NpX3ByaXYuaCIKKyNpbmNsdWRlICJzY3NpX2xvZ2dpbmcuaCIKKworCisvKgorICogRGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cy4KKyAqLworCisjZGVmaW5lIE1JTl9SRVNFVF9ERUxBWSAoMipIWikKKworLyogRG8gbm90IGNhbGwgcmVzZXQgb24gZXJyb3IgaWYgd2UganVzdCBkaWQgYSByZXNldCB3aXRoaW4gMTUgc2VjLiAqLworI2RlZmluZSBNSU5fUkVTRVRfUEVSSU9EICgxNSpIWikKKworLyoKKyAqIE1hY3JvIHRvIGRldGVybWluZSB0aGUgc2l6ZSBvZiBTQ1NJIGNvbW1hbmQuIFRoaXMgbWFjcm8gdGFrZXMgdmVuZG9yCisgKiB1bmlxdWUgY29tbWFuZHMgaW50byBhY2NvdW50LiBTQ1NJIGNvbW1hbmRzIGluIGdyb3VwcyA2IGFuZCA3IGFyZQorICogdmVuZG9yIHVuaXF1ZSBhbmQgd2Ugd2lsbCBkZXBlbmQgdXBvbiB0aGUgY29tbWFuZCBsZW5ndGggYmVpbmcKKyAqIHN1cHBsaWVkIGNvcnJlY3RseSBpbiBjbWRfbGVuLgorICovCisjZGVmaW5lIENEQl9TSVpFKGNtZCkJKCgoKChjbWQpLT5jbW5kWzBdID4+IDUpICYgNykgPCA2KSA/IFwKKwkJCQlDT01NQU5EX1NJWkUoKGNtZCktPmNtbmRbMF0pIDogKGNtZCktPmNtZF9sZW4pCisKKy8qCisgKiBOb3RlIC0gdGhlIGluaXRpYWwgbG9nZ2luZyBsZXZlbCBjYW4gYmUgc2V0IGhlcmUgdG8gbG9nIGV2ZW50cyBhdCBib290IHRpbWUuCisgKiBBZnRlciB0aGUgc3lzdGVtIGlzIHVwLCB5b3UgbWF5IGVuYWJsZSBsb2dnaW5nIHZpYSB0aGUgL3Byb2MgaW50ZXJmYWNlLgorICovCit1bnNpZ25lZCBpbnQgc2NzaV9sb2dnaW5nX2xldmVsOworI2lmIGRlZmluZWQoQ09ORklHX1NDU0lfTE9HR0lORykKK0VYUE9SVF9TWU1CT0woc2NzaV9sb2dnaW5nX2xldmVsKTsKKyNlbmRpZgorCitjb25zdCBjaGFyICpjb25zdCBzY3NpX2RldmljZV90eXBlc1tNQVhfU0NTSV9ERVZJQ0VfQ09ERV0gPSB7CisJIkRpcmVjdC1BY2Nlc3MgICAgIiwKKwkiU2VxdWVudGlhbC1BY2Nlc3MiLAorCSJQcmludGVyICAgICAgICAgICIsCisJIlByb2Nlc3NvciAgICAgICAgIiwKKwkiV09STSAgICAgICAgICAgICAiLAorCSJDRC1ST00gICAgICAgICAgICIsCisJIlNjYW5uZXIgICAgICAgICAgIiwKKwkiT3B0aWNhbCBEZXZpY2UgICAiLAorCSJNZWRpdW0gQ2hhbmdlciAgICIsCisJIkNvbW11bmljYXRpb25zICAgIiwKKwkiVW5rbm93biAgICAgICAgICAiLAorCSJVbmtub3duICAgICAgICAgICIsCisJIlJBSUQgICAgICAgICAgICAgIiwKKwkiRW5jbG9zdXJlICAgICAgICAiLAorfTsKK0VYUE9SVF9TWU1CT0woc2NzaV9kZXZpY2VfdHlwZXMpOworCisvKgorICogRnVuY3Rpb246ICAgIHNjc2lfYWxsb2NhdGVfcmVxdWVzdAorICoKKyAqIFB1cnBvc2U6ICAgICBBbGxvY2F0ZSBhIHJlcXVlc3QgZGVzY3JpcHRvci4KKyAqCisgKiBBcmd1bWVudHM6ICAgZGV2aWNlCQktIGRldmljZSBmb3Igd2hpY2ggd2Ugd2FudCBhIHJlcXVlc3QKKyAqCQlnZnBfbWFzawktIGFsbG9jYXRpb24gZmxhZ3MgcGFzc2VkIHRvIGttYWxsb2MKKyAqCisgKiBMb2NrIHN0YXR1czogTm8gbG9ja3MgYXNzdW1lZCB0byBiZSBoZWxkLiAgVGhpcyBmdW5jdGlvbiBpcyBTTVAtc2FmZS4KKyAqCisgKiBSZXR1cm5zOiAgICAgUG9pbnRlciB0byByZXF1ZXN0IGJsb2NrLgorICovCitzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQkJCQkgICBpbnQgZ2ZwX21hc2spCit7CisJY29uc3QgaW50IG9mZnNldCA9IEFMSUdOKHNpemVvZihzdHJ1Y3Qgc2NzaV9yZXF1ZXN0KSwgNCk7CisJY29uc3QgaW50IHNpemUgPSBvZmZzZXQgKyBzaXplb2Yoc3RydWN0IHJlcXVlc3QpOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXE7CisgIAorCXNyZXEgPSBrbWFsbG9jKHNpemUsIGdmcF9tYXNrKTsKKwlpZiAobGlrZWx5KHNyZXEgIT0gTlVMTCkpIHsKKwkJbWVtc2V0KHNyZXEsIDAsIHNpemUpOworCQlzcmVxLT5zcl9yZXF1ZXN0ID0gKHN0cnVjdCByZXF1ZXN0ICopKCgoY2hhciAqKXNyZXEpICsgb2Zmc2V0KTsKKwkJc3JlcS0+c3JfZGV2aWNlID0gc2RldjsKKwkJc3JlcS0+c3JfaG9zdCA9IHNkZXYtPmhvc3Q7CisJCXNyZXEtPnNyX21hZ2ljID0gU0NTSV9SRVFfTUFHSUM7CisJCXNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX0JJRElSRUNUSU9OQUw7CisJfQorCisJcmV0dXJuIHNyZXE7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfYWxsb2NhdGVfcmVxdWVzdCk7CisKK3ZvaWQgX19zY3NpX3JlbGVhc2VfcmVxdWVzdChzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxKQoreworCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBzcmVxLT5zcl9yZXF1ZXN0OworCisJLyogdW5saWtlbHkgYmVjYXVzZSB0aGUgdGFnIHdhcyB1c3VhbGx5IGVuZGVkIGVhcmxpZXIgYnkgdGhlCisJICogbWlkLWxheWVyLiBIb3dldmVyLCBmb3IgbGF5ZXJpbmcgcmVhc29ucyBVTEQncyBkb24ndCBlbmQKKwkgKiB0aGUgdGFnIG9mIGNvbW1hbmRzIHRoZXkgZ2VuZXJhdGUuICovCisJaWYgKHVubGlrZWx5KGJsa19ycV90YWdnZWQocmVxKSkpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSByZXEtPnE7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCQlibGtfcXVldWVfZW5kX3RhZyhxLCByZXEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwl9CisKKworCWlmIChsaWtlbHkoc3JlcS0+c3JfY29tbWFuZCAhPSBOVUxMKSkgeworCQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBzcmVxLT5zcl9jb21tYW5kOworCisJCXNyZXEtPnNyX2NvbW1hbmQgPSBOVUxMOworCQlzY3NpX25leHRfY29tbWFuZChjbWQpOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uOiAgICBzY3NpX3JlbGVhc2VfcmVxdWVzdAorICoKKyAqIFB1cnBvc2U6ICAgICBSZWxlYXNlIGEgcmVxdWVzdCBkZXNjcmlwdG9yLgorICoKKyAqIEFyZ3VtZW50czogICBzcmVxICAgIC0gcmVxdWVzdCB0byByZWxlYXNlCisgKgorICogTG9jayBzdGF0dXM6IE5vIGxvY2tzIGFzc3VtZWQgdG8gYmUgaGVsZC4gIFRoaXMgZnVuY3Rpb24gaXMgU01QLXNhZmUuCisgKi8KK3ZvaWQgc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSkKK3sKKwlfX3Njc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOworCWtmcmVlKHNyZXEpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3JlbGVhc2VfcmVxdWVzdCk7CisKK3N0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgeworCWttZW1fY2FjaGVfdAkqc2xhYjsKKwl1bnNpZ25lZCBpbnQJdXNlcnM7CisJY2hhcgkJKm5hbWU7CisJdW5zaWduZWQgaW50CXNsYWJfZmxhZ3M7CisJdW5zaWduZWQgaW50CWdmcF9tYXNrOworfTsKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgc2NzaV9jbWRfcG9vbCA9IHsKKwkubmFtZQkJPSAic2NzaV9jbWRfY2FjaGUiLAorCS5zbGFiX2ZsYWdzCT0gU0xBQl9IV0NBQ0hFX0FMSUdOLAorfTsKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgc2NzaV9jbWRfZG1hX3Bvb2wgPSB7CisJLm5hbWUJCT0gInNjc2lfY21kX2NhY2hlKERNQSkiLAorCS5zbGFiX2ZsYWdzCT0gU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfQ0FDSEVfRE1BLAorCS5nZnBfbWFzawk9IF9fR0ZQX0RNQSwKK307CisKK3N0YXRpYyBERUNMQVJFX01VVEVYKGhvc3RfY21kX3Bvb2xfbXV0ZXgpOworCitzdGF0aWMgc3RydWN0IHNjc2lfY21uZCAqX19zY3NpX2dldF9jb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQkJCQkgICAgaW50IGdmcF9tYXNrKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKworCWNtZCA9IGttZW1fY2FjaGVfYWxsb2Moc2hvc3QtPmNtZF9wb29sLT5zbGFiLAorCQkJZ2ZwX21hc2sgfCBzaG9zdC0+Y21kX3Bvb2wtPmdmcF9tYXNrKTsKKworCWlmICh1bmxpa2VseSghY21kKSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzaG9zdC0+ZnJlZV9saXN0X2xvY2ssIGZsYWdzKTsKKwkJaWYgKGxpa2VseSghbGlzdF9lbXB0eSgmc2hvc3QtPmZyZWVfbGlzdCkpKSB7CisJCQljbWQgPSBsaXN0X2VudHJ5KHNob3N0LT5mcmVlX2xpc3QubmV4dCwKKwkJCQkJIHN0cnVjdCBzY3NpX2NtbmQsIGxpc3QpOworCQkJbGlzdF9kZWxfaW5pdCgmY21kLT5saXN0KTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaG9zdC0+ZnJlZV9saXN0X2xvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gY21kOworfQorCisvKgorICogRnVuY3Rpb246CXNjc2lfZ2V0X2NvbW1hbmQoKQorICoKKyAqIFB1cnBvc2U6CUFsbG9jYXRlIGFuZCBzZXR1cCBhIHNjc2kgY29tbWFuZCBibG9jaworICoKKyAqIEFyZ3VtZW50czoJZGV2CS0gcGFyZW50IHNjc2kgZGV2aWNlCisgKgkJZ2ZwX21hc2stIGFsbG9jYXRvciBmbGFncworICoKKyAqIFJldHVybnM6CVRoZSBhbGxvY2F0ZWQgc2NzaSBjb21tYW5kIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IHNjc2lfY21uZCAqc2NzaV9nZXRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldiwgaW50IGdmcF9tYXNrKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKworCS8qIEJhaWwgaWYgd2UgY2FuJ3QgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBkZXZpY2UgKi8KKwlpZiAoIWdldF9kZXZpY2UoJmRldi0+c2Rldl9nZW5kZXYpKQorCQlyZXR1cm4gTlVMTDsKKworCWNtZCA9IF9fc2NzaV9nZXRfY29tbWFuZChkZXYtPmhvc3QsIGdmcF9tYXNrKTsKKworCWlmIChsaWtlbHkoY21kICE9IE5VTEwpKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKCpjbWQpKTsKKwkJY21kLT5kZXZpY2UgPSBkZXY7CisJCWNtZC0+c3RhdGUgPSBTQ1NJX1NUQVRFX1VOVVNFRDsKKwkJY21kLT5vd25lciA9IFNDU0lfT1dORVJfTk9CT0RZOworCQlpbml0X3RpbWVyKCZjbWQtPmVoX3RpbWVvdXQpOworCQlJTklUX0xJU1RfSEVBRCgmY21kLT5saXN0KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bGlzdF9sb2NrLCBmbGFncyk7CisJCWxpc3RfYWRkX3RhaWwoJmNtZC0+bGlzdCwgJmRldi0+Y21kX2xpc3QpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxpc3RfbG9jaywgZmxhZ3MpOworCX0gZWxzZQorCQlwdXRfZGV2aWNlKCZkZXYtPnNkZXZfZ2VuZGV2KTsKKworCXJldHVybiBjbWQ7Cit9CQkJCQorRVhQT1JUX1NZTUJPTChzY3NpX2dldF9jb21tYW5kKTsKKworLyoKKyAqIEZ1bmN0aW9uOglzY3NpX3B1dF9jb21tYW5kKCkKKyAqCisgKiBQdXJwb3NlOglGcmVlIGEgc2NzaSBjb21tYW5kIGJsb2NrCisgKgorICogQXJndW1lbnRzOgljbWQJLSBjb21tYW5kIGJsb2NrIHRvIGZyZWUKKyAqCisgKiBSZXR1cm5zOglOb3RoaW5nLgorICoKKyAqIE5vdGVzOglUaGUgY29tbWFuZCBtdXN0IG5vdCBiZWxvbmcgdG8gYW55IGxpc3RzLgorICovCit2b2lkIHNjc2lfcHV0X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IGNtZC0+ZGV2aWNlOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gc2Rldi0+aG9zdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCS8qIHNlcmlvdXMgZXJyb3IgaWYgdGhlIGNvbW1hbmQgaGFzbid0IGNvbWUgZnJvbSBhIGRldmljZSBsaXN0ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNtZC0+ZGV2aWNlLT5saXN0X2xvY2ssIGZsYWdzKTsKKwlCVUdfT04obGlzdF9lbXB0eSgmY21kLT5saXN0KSk7CisJbGlzdF9kZWxfaW5pdCgmY21kLT5saXN0KTsKKwlzcGluX3VubG9jaygmY21kLT5kZXZpY2UtPmxpc3RfbG9jayk7CisJLyogY2hhbmdpbmcgbG9ja3MgaGVyZSwgZG9uJ3QgbmVlZCB0byByZXN0b3JlIHRoZSBpcnEgc3RhdGUgKi8KKwlzcGluX2xvY2soJnNob3N0LT5mcmVlX2xpc3RfbG9jayk7CisJaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJnNob3N0LT5mcmVlX2xpc3QpKSkgeworCQlsaXN0X2FkZCgmY21kLT5saXN0LCAmc2hvc3QtPmZyZWVfbGlzdCk7CisJCWNtZCA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNob3N0LT5mcmVlX2xpc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKGxpa2VseShjbWQgIT0gTlVMTCkpCisJCWttZW1fY2FjaGVfZnJlZShzaG9zdC0+Y21kX3Bvb2wtPnNsYWIsIGNtZCk7CisKKwlwdXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfcHV0X2NvbW1hbmQpOworCisvKgorICogRnVuY3Rpb246CXNjc2lfc2V0dXBfY29tbWFuZF9mcmVlbGlzdCgpCisgKgorICogUHVycG9zZToJU2V0dXAgdGhlIGNvbW1hbmQgZnJlZWxpc3QgZm9yIGEgc2NzaSBob3N0LgorICoKKyAqIEFyZ3VtZW50czoJc2hvc3QJLSBob3N0IHRvIGFsbG9jYXRlIHRoZSBmcmVlbGlzdCBmb3IuCisgKgorICogUmV0dXJuczoJTm90aGluZy4KKyAqLworaW50IHNjc2lfc2V0dXBfY29tbWFuZF9mcmVlbGlzdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sICpwb29sOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKworCXNwaW5fbG9ja19pbml0KCZzaG9zdC0+ZnJlZV9saXN0X2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZzaG9zdC0+ZnJlZV9saXN0KTsKKworCS8qCisJICogU2VsZWN0IGEgY29tbWFuZCBzbGFiIGZvciB0aGlzIGhvc3QgYW5kIGNyZWF0ZSBpdCBpZiBub3QKKwkgKiB5ZXQgZXhpc3RhbnQuCisJICovCisJZG93bigmaG9zdF9jbWRfcG9vbF9tdXRleCk7CisJcG9vbCA9IChzaG9zdC0+dW5jaGVja2VkX2lzYV9kbWEgPyAmc2NzaV9jbWRfZG1hX3Bvb2wgOiAmc2NzaV9jbWRfcG9vbCk7CisJaWYgKCFwb29sLT51c2VycykgeworCQlwb29sLT5zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUocG9vbC0+bmFtZSwKKwkJCQlzaXplb2Yoc3RydWN0IHNjc2lfY21uZCksIDAsCisJCQkJcG9vbC0+c2xhYl9mbGFncywgTlVMTCwgTlVMTCk7CisJCWlmICghcG9vbC0+c2xhYikKKwkJCWdvdG8gZmFpbDsKKwl9CisKKwlwb29sLT51c2VycysrOworCXNob3N0LT5jbWRfcG9vbCA9IHBvb2w7CisJdXAoJmhvc3RfY21kX3Bvb2xfbXV0ZXgpOworCisJLyoKKwkgKiBHZXQgb25lIGJhY2t1cCBjb21tYW5kIGZvciB0aGlzIGhvc3QuCisJICovCisJY21kID0ga21lbV9jYWNoZV9hbGxvYyhzaG9zdC0+Y21kX3Bvb2wtPnNsYWIsCisJCQlHRlBfS0VSTkVMIHwgc2hvc3QtPmNtZF9wb29sLT5nZnBfbWFzayk7CisJaWYgKCFjbWQpCisJCWdvdG8gZmFpbDI7CisJbGlzdF9hZGQoJmNtZC0+bGlzdCwgJnNob3N0LT5mcmVlX2xpc3QpOwkJCisJcmV0dXJuIDA7CisKKyBmYWlsMjoKKwlpZiAoIS0tcG9vbC0+dXNlcnMpCisJCWttZW1fY2FjaGVfZGVzdHJveShwb29sLT5zbGFiKTsKKwlyZXR1cm4gLUVOT01FTTsKKyBmYWlsOgorCXVwKCZob3N0X2NtZF9wb29sX211dGV4KTsKKwlyZXR1cm4gLUVOT01FTTsKKworfQorCisvKgorICogRnVuY3Rpb246CXNjc2lfZGVzdHJveV9jb21tYW5kX2ZyZWVsaXN0KCkKKyAqCisgKiBQdXJwb3NlOglSZWxlYXNlIHRoZSBjb21tYW5kIGZyZWVsaXN0IGZvciBhIHNjc2kgaG9zdC4KKyAqCisgKiBBcmd1bWVudHM6CXNob3N0CS0gaG9zdCB0aGF0J3MgZnJlZWxpc3QgaXMgZ29pbmcgdG8gYmUgZGVzdHJveWVkCisgKi8KK3ZvaWQgc2NzaV9kZXN0cm95X2NvbW1hbmRfZnJlZWxpc3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZzaG9zdC0+ZnJlZV9saXN0KSkgeworCQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisKKwkJY21kID0gbGlzdF9lbnRyeShzaG9zdC0+ZnJlZV9saXN0Lm5leHQsIHN0cnVjdCBzY3NpX2NtbmQsIGxpc3QpOworCQlsaXN0X2RlbF9pbml0KCZjbWQtPmxpc3QpOworCQlrbWVtX2NhY2hlX2ZyZWUoc2hvc3QtPmNtZF9wb29sLT5zbGFiLCBjbWQpOworCX0KKworCWRvd24oJmhvc3RfY21kX3Bvb2xfbXV0ZXgpOworCWlmICghLS1zaG9zdC0+Y21kX3Bvb2wtPnVzZXJzKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3koc2hvc3QtPmNtZF9wb29sLT5zbGFiKTsKKwl1cCgmaG9zdF9jbWRfcG9vbF9tdXRleCk7Cit9CisKKyNpZmRlZiBDT05GSUdfU0NTSV9MT0dHSU5HCit2b2lkIHNjc2lfbG9nX3NlbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXVuc2lnbmVkIGludCBsZXZlbDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisKKwkvKgorCSAqIElmIE1MIFFVRVVFIGxvZyBsZXZlbCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG86CisJICoKKwkgKiAxOiBub3RoaW5nIChtYXRjaCBjb21wbGV0aW9uKQorCSAqCisJICogMjogbG9nIG9wY29kZSArIGNvbW1hbmQgb2YgYWxsIGNvbW1hbmRzCisJICoKKwkgKiAzOiBzYW1lIGFzIDIgcGx1cyBkdW1wIGNtZCBhZGRyZXNzCisJICoKKwkgKiA0OiBzYW1lIGFzIDMgcGx1cyBkdW1wIGV4dHJhIGp1bmsKKwkgKi8KKwlpZiAodW5saWtlbHkoc2NzaV9sb2dnaW5nX2xldmVsKSkgeworCQlsZXZlbCA9IFNDU0lfTE9HX0xFVkVMKFNDU0lfTE9HX01MUVVFVUVfU0hJRlQsCisJCQkJICAgICAgIFNDU0lfTE9HX01MUVVFVUVfQklUUyk7CisJCWlmIChsZXZlbCA+IDEpIHsKKwkJCXNkZXYgPSBjbWQtPmRldmljZTsKKwkJCXByaW50ayhLRVJOX0lORk8gInNjc2kgPCVkOiVkOiVkOiVkPiBzZW5kICIsCisJCQkgICAgICAgc2Rldi0+aG9zdC0+aG9zdF9ubywgc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQsCisJCQkgICAgICAgc2Rldi0+bHVuKTsKKwkJCWlmIChsZXZlbCA+IDIpCisJCQkJcHJpbnRrKCIweCVwICIsIGNtZCk7CisJCQkvKgorCQkJICogc3BhY2VzIHRvIG1hdGNoIGRpc3Bvc2l0aW9uIGFuZCBjbWQtPnJlc3VsdAorCQkJICogb3V0cHV0IGluIHNjc2lfbG9nX2NvbXBsZXRpb24uCisJCQkgKi8KKwkJCXByaW50aygiICAgICAgICAgICAgICAgICAiKTsKKwkJCXNjc2lfcHJpbnRfY29tbWFuZChjbWQpOworCQkJaWYgKGxldmVsID4gMykgeworCQkJCXByaW50ayhLRVJOX0lORk8gImJ1ZmZlciA9IDB4JXAsIGJ1ZmZsZW4gPSAlZCwiCisJCQkJICAgICAgICIgZG9uZSA9IDB4JXAsIHF1ZXVlY29tbWFuZCAweCVwXG4iLAorCQkJCQljbWQtPmJ1ZmZlciwgY21kLT5idWZmbGVuLAorCQkJCQljbWQtPmRvbmUsCisJCQkJCXNkZXYtPmhvc3QtPmhvc3R0LT5xdWV1ZWNvbW1hbmQpOworCisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgc2NzaV9sb2dfY29tcGxldGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCBkaXNwb3NpdGlvbikKK3sKKwl1bnNpZ25lZCBpbnQgbGV2ZWw7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCisJLyoKKwkgKiBJZiBNTCBDT01QTEVURSBsb2cgbGV2ZWwgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvOgorCSAqCisJICogMTogbG9nIGRpc3Bvc2l0aW9uLCByZXN1bHQsIG9wY29kZSArIGNvbW1hbmQsIGFuZCBjb25kaXRpb25hbGx5CisJICogc2Vuc2UgZGF0YSBmb3IgZmFpbHVyZXMgb3Igbm9uIFNVQ0NFU1MgZGlzcG9zaXRpb25zLgorCSAqCisJICogMjogc2FtZSBhcyAxIGJ1dCBmb3IgYWxsIGNvbW1hbmQgY29tcGxldGlvbnMuCisJICoKKwkgKiAzOiBzYW1lIGFzIDIgcGx1cyBkdW1wIGNtZCBhZGRyZXNzCisJICoKKwkgKiA0OiBzYW1lIGFzIDMgcGx1cyBkdW1wIGV4dHJhIGp1bmsKKwkgKi8KKwlpZiAodW5saWtlbHkoc2NzaV9sb2dnaW5nX2xldmVsKSkgeworCQlsZXZlbCA9IFNDU0lfTE9HX0xFVkVMKFNDU0lfTE9HX01MQ09NUExFVEVfU0hJRlQsCisJCQkJICAgICAgIFNDU0lfTE9HX01MQ09NUExFVEVfQklUUyk7CisJCWlmICgoKGxldmVsID4gMCkgJiYgKGNtZC0+cmVzdWx0IHx8IGRpc3Bvc2l0aW9uICE9IFNVQ0NFU1MpKSB8fAorCQkgICAgKGxldmVsID4gMSkpIHsKKwkJCXNkZXYgPSBjbWQtPmRldmljZTsKKwkJCXByaW50ayhLRVJOX0lORk8gInNjc2kgPCVkOiVkOiVkOiVkPiBkb25lICIsCisJCQkgICAgICAgc2Rldi0+aG9zdC0+aG9zdF9ubywgc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQsCisJCQkgICAgICAgc2Rldi0+bHVuKTsKKwkJCWlmIChsZXZlbCA+IDIpCisJCQkJcHJpbnRrKCIweCVwICIsIGNtZCk7CisJCQkvKgorCQkJICogRHVtcCB0cnVuY2F0ZWQgdmFsdWVzLCBzbyB3ZSB1c3VhbGx5IGZpdCB3aXRoaW4KKwkJCSAqIDgwIGNoYXJzLgorCQkJICovCisJCQlzd2l0Y2ggKGRpc3Bvc2l0aW9uKSB7CisJCQljYXNlIFNVQ0NFU1M6CisJCQkJcHJpbnRrKCJTVUNDRVNTIik7CisJCQkJYnJlYWs7CisJCQljYXNlIE5FRURTX1JFVFJZOgorCQkJCXByaW50aygiUkVUUlkgICIpOworCQkJCWJyZWFrOworCQkJY2FzZSBBRERfVE9fTUxRVUVVRToKKwkJCQlwcmludGsoIk1MUVVFVUUiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRkFJTEVEOgorCQkJCXByaW50aygiRkFJTEVEICIpOworCQkJCWJyZWFrOworCQkJY2FzZSBUSU1FT1VUX0VSUk9SOgorCQkJCS8qIAorCQkJCSAqIElmIGNhbGxlZCB2aWEgc2NzaV90aW1lc19vdXQuCisJCQkJICovCisJCQkJcHJpbnRrKCJUSU1FT1VUIik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50aygiVU5LTk9XTiIpOworCQkJfQorCQkJcHJpbnRrKCIgJTh4ICIsIGNtZC0+cmVzdWx0KTsKKwkJCXNjc2lfcHJpbnRfY29tbWFuZChjbWQpOworCQkJaWYgKHN0YXR1c19ieXRlKGNtZC0+cmVzdWx0KSAmIENIRUNLX0NPTkRJVElPTikgeworCQkJCS8qCisJCQkJICogWFhYIFRoZSBwcmludF9zZW5zZSBmb3JtYXR0aW5nL3ByZWZpeAorCQkJCSAqIGRvZXNuJ3QgbWF0Y2ggdGhpcyBmdW5jdGlvbi4KKwkJCQkgKi8KKwkJCQlzY3NpX3ByaW50X3NlbnNlKCIiLCBjbWQpOworCQkJfQorCQkJaWYgKGxldmVsID4gMykgeworCQkJCXByaW50ayhLRVJOX0lORk8gInNjc2kgaG9zdCBidXN5ICVkIGZhaWxlZCAlZFxuIiwKKwkJCQkgICAgICAgc2Rldi0+aG9zdC0+aG9zdF9idXN5LAorCQkJCSAgICAgICBzZGV2LT5ob3N0LT5ob3N0X2ZhaWxlZCk7CisJCQl9CisJCX0KKwl9Cit9CisjZW5kaWYKKworLyogCisgKiBBc3NpZ24gYSBzZXJpYWwgbnVtYmVyIGFuZCBwaWQgdG8gdGhlIHJlcXVlc3QgZm9yIGVycm9yIHJlY292ZXJ5CisgKiBhbmQgZGVidWdnaW5nIHB1cnBvc2VzLiAgUHJvdGVjdGVkIGJ5IHRoZSBIb3N0X0xvY2sgb2YgaG9zdC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNjc2lfY21kX2dldF9zZXJpYWwoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCWNtZC0+c2VyaWFsX251bWJlciA9IGhvc3QtPmNtZF9zZXJpYWxfbnVtYmVyKys7CisJaWYgKGNtZC0+c2VyaWFsX251bWJlciA9PSAwKSAKKwkJY21kLT5zZXJpYWxfbnVtYmVyID0gaG9zdC0+Y21kX3NlcmlhbF9udW1iZXIrKzsKKwkKKwljbWQtPnBpZCA9IGhvc3QtPmNtZF9waWQrKzsKKwlpZiAoY21kLT5waWQgPT0gMCkKKwkJY21kLT5waWQgPSBob3N0LT5jbWRfcGlkKys7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogICAgc2NzaV9kaXNwYXRjaF9jb21tYW5kCisgKgorICogUHVycG9zZTogICAgIERpc3BhdGNoIGEgY29tbWFuZCB0byB0aGUgbG93LWxldmVsIGRyaXZlci4KKyAqCisgKiBBcmd1bWVudHM6ICAgY21kIC0gY29tbWFuZCBibG9jayB3ZSBhcmUgZGlzcGF0Y2hpbmcuCisgKgorICogTm90ZXM6CisgKi8KK2ludCBzY3NpX2Rpc3BhdGNoX2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgcnRuID0gMDsKKworCS8qIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgc3RpbGwgdXNhYmxlICovCisJaWYgKHVubGlrZWx5KGNtZC0+ZGV2aWNlLT5zZGV2X3N0YXRlID09IFNERVZfREVMKSkgeworCQkvKiBpbiBTREVWX0RFTCB3ZSBlcnJvciBhbGwgY29tbWFuZHMuIERJRF9OT19DT05ORUNUCisJCSAqIHJldHVybnMgYW4gaW1tZWRpYXRlIGVycm9yIHVwd2FyZHMsIGFuZCBzaWduYWxzCisJCSAqIHRoYXQgdGhlIGRldmljZSBpcyBubyBsb25nZXIgcHJlc2VudCAqLworCQljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQlhdG9taWNfaW5jKCZjbWQtPmRldmljZS0+aW9yZXF1ZXN0X2NudCk7CisJCXNjc2lfZG9uZShjbWQpOworCQkvKiByZXR1cm4gMCAoYmVjYXVzZSB0aGUgY29tbWFuZCBoYXMgYmVlbiBwcm9jZXNzZWQpICovCisJCWdvdG8gb3V0OworCX0KKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgc2NzaSBsbGQgcHV0IHRoaXMgZGV2aWNlIGludG8gc3RhdGUgU0RFVl9CTE9DSy4gKi8KKwlpZiAodW5saWtlbHkoY21kLT5kZXZpY2UtPnNkZXZfc3RhdGUgPT0gU0RFVl9CTE9DSykpIHsKKwkJLyogCisJCSAqIGluIFNERVZfQkxPQ0ssIHRoZSBjb21tYW5kIGlzIGp1c3QgcHV0IGJhY2sgb24gdGhlIGRldmljZQorCQkgKiBxdWV1ZS4gIFRoZSBzdXNwZW5kIHN0YXRlIGhhcyBhbHJlYWR5IGJsb2NrZWQgdGhlIHF1ZXVlIHNvCisJCSAqIGZ1dHVyZSByZXF1ZXN0cyBzaG91bGQgbm90IG9jY3VyIHVudGlsIHRoZSBkZXZpY2UgCisJCSAqIHRyYW5zaXRpb25zIG91dCBvZiB0aGUgc3VzcGVuZCBzdGF0ZS4KKwkJICovCisJCXNjc2lfcXVldWVfaW5zZXJ0KGNtZCwgU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZKTsKKworCQlTQ1NJX0xPR19NTFFVRVVFKDMsIHByaW50aygicXVldWVjb21tYW5kIDogZGV2aWNlIGJsb2NrZWQgXG4iKSk7CisKKwkJLyoKKwkJICogTk9URTogcnRuIGlzIHN0aWxsIHplcm8gaGVyZSBiZWNhdXNlIHdlIGRvbid0IG5lZWQgdGhlCisJCSAqIHF1ZXVlIHRvIGJlIHBsdWdnZWQgb24gcmV0dXJuIChpdCdzIGFscmVhZHkgc3RvcHBlZCkKKwkJICovCisJCWdvdG8gb3V0OworCX0KKworCS8qIAorCSAqIElmIFNDU0ktMiBvciBsb3dlciwgc3RvcmUgdGhlIExVTiB2YWx1ZSBpbiBjbW5kLgorCSAqLworCWlmIChjbWQtPmRldmljZS0+c2NzaV9sZXZlbCA8PSBTQ1NJXzIpIHsKKwkJY21kLT5jbW5kWzFdID0gKGNtZC0+Y21uZFsxXSAmIDB4MWYpIHwKKwkJCSAgICAgICAoY21kLT5kZXZpY2UtPmx1biA8PCA1ICYgMHhlMCk7CisJfQorCisJLyoKKwkgKiBXZSB3aWxsIHdhaXQgTUlOX1JFU0VUX0RFTEFZIGNsb2NrIHRpY2tzIGFmdGVyIHRoZSBsYXN0IHJlc2V0IHNvCisJICogd2UgY2FuIGF2b2lkIHRoZSBkcml2ZSBub3QgYmVpbmcgcmVhZHkuCisJICovCisJdGltZW91dCA9IGhvc3QtPmxhc3RfcmVzZXQgKyBNSU5fUkVTRVRfREVMQVk7CisKKwlpZiAoaG9zdC0+cmVzZXR0aW5nICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCWludCB0aWNrc19yZW1haW5pbmcgPSB0aW1lb3V0IC0gamlmZmllczsKKwkJLyoKKwkJICogTk9URTogVGhpcyBtYXkgYmUgZXhlY3V0ZWQgZnJvbSB3aXRoaW4gYW4gaW50ZXJydXB0CisJCSAqIGhhbmRsZXIhICBUaGlzIGlzIGJhZCwgYnV0IGZvciBub3csIGl0J2xsIGRvLiAgVGhlIGlycQorCQkgKiBsZXZlbCBvZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgaGFzIGJlZW4gbWFza2VkIG91dCBieSB0aGUKKwkJICogcGxhdGZvcm0gZGVwZW5kZW50IGludGVycnVwdCBoYW5kbGluZyBjb2RlIGFscmVhZHksIHNvIHRoZQorCQkgKiBzdGkoKSBoZXJlIHdpbGwgbm90IGNhdXNlIGFub3RoZXIgY2FsbCB0byB0aGUgU0NTSSBob3N0J3MKKwkJICogaW50ZXJydXB0IGhhbmRsZXIgKGFzc3VtaW5nIHRoZXJlIGlzIG9uZSBpcnEtbGV2ZWwgcGVyCisJCSAqIGhvc3QpLgorCQkgKi8KKwkJd2hpbGUgKC0tdGlja3NfcmVtYWluaW5nID49IDApCisJCQltZGVsYXkoMSArIDk5OSAvIEhaKTsKKwkJaG9zdC0+cmVzZXR0aW5nID0gMDsKKwl9CisKKwkvKiAKKwkgKiBBSzogdW5saWtlbHkgcmFjZSBoZXJlOiBmb3Igc29tZSByZWFzb24gdGhlIHRpbWVyIGNvdWxkCisJICogZXhwaXJlIGJlZm9yZSB0aGUgc2VyaWFsIG51bWJlciBpcyBzZXQgdXAgYmVsb3cuCisJICovCisJc2NzaV9hZGRfdGltZXIoY21kLCBjbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQsIHNjc2lfdGltZXNfb3V0KTsKKworCXNjc2lfbG9nX3NlbmQoY21kKTsKKworCS8qCisJICogV2Ugd2lsbCB1c2UgYSBxdWV1ZWQgY29tbWFuZCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIHdlIHdpbGwKKwkgKiBlbXVsYXRlIHRoZSBxdWV1aW5nIGFuZCBjYWxsaW5nIG9mIGNvbXBsZXRpb24gZnVuY3Rpb24gb3Vyc2VsdmVzLgorCSAqLworCisJY21kLT5zdGF0ZSA9IFNDU0lfU1RBVEVfUVVFVUVEOworCWNtZC0+b3duZXIgPSBTQ1NJX09XTkVSX0xPV0xFVkVMOworCisJYXRvbWljX2luYygmY21kLT5kZXZpY2UtPmlvcmVxdWVzdF9jbnQpOworCisJLyoKKwkgKiBCZWZvcmUgd2UgcXVldWUgdGhpcyBjb21tYW5kLCBjaGVjayBpZiB0aGUgY29tbWFuZAorCSAqIGxlbmd0aCBleGNlZWRzIHdoYXQgdGhlIGhvc3QgYWRhcHRlciBjYW4gaGFuZGxlLgorCSAqLworCWlmIChDREJfU0laRShjbWQpID4gY21kLT5kZXZpY2UtPmhvc3QtPm1heF9jbWRfbGVuKSB7CisJCVNDU0lfTE9HX01MUVVFVUUoMywKKwkJCQlwcmludGsoInF1ZXVlY29tbWFuZCA6IGNvbW1hbmQgdG9vIGxvbmcuXG4iKSk7CisJCWNtZC0+cmVzdWx0ID0gKERJRF9BQk9SVCA8PCAxNik7CisKKwkJc2NzaV9kb25lKGNtZCk7CisJCWdvdG8gb3V0OworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXNjc2lfY21kX2dldF9zZXJpYWwoaG9zdCwgY21kKTsgCisKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoU0hPU1RfQ0FOQ0VMLCAmaG9zdC0+c2hvc3Rfc3RhdGUpKSkgeworCQljbWQtPnJlc3VsdCA9IChESURfTk9fQ09OTkVDVCA8PCAxNik7CisJCXNjc2lfZG9uZShjbWQpOworCX0gZWxzZSB7CisJCXJ0biA9IGhvc3QtPmhvc3R0LT5xdWV1ZWNvbW1hbmQoY21kLCBzY3NpX2RvbmUpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWlmIChydG4pIHsKKwkJYXRvbWljX2luYygmY21kLT5kZXZpY2UtPmlvZG9uZV9jbnQpOworCQlzY3NpX3F1ZXVlX2luc2VydChjbWQsCisJCQkJKHJ0biA9PSBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1kpID8KKwkJCQkgcnRuIDogU0NTSV9NTFFVRVVFX0hPU1RfQlVTWSk7CisJCVNDU0lfTE9HX01MUVVFVUUoMywKKwkJICAgIHByaW50aygicXVldWVjb21tYW5kIDogcmVxdWVzdCByZWplY3RlZFxuIikpOworCX0KKworIG91dDoKKwlTQ1NJX0xPR19NTFFVRVVFKDMsIHByaW50aygibGVhdmluZyBzY3NpX2Rpc3BhdGNoX2NtbmQoKVxuIikpOworCXJldHVybiBydG47Cit9CisKKy8qCisgKiBGdW5jdGlvbjogICAgc2NzaV9pbml0X2NtZF9mcm9tX3JlcQorICoKKyAqIFB1cnBvc2U6ICAgICBRdWV1ZSBhIFNDU0kgY29tbWFuZAorICogUHVycG9zZTogICAgIEluaXRpYWxpemUgYSBzdHJ1Y3Qgc2NzaV9jbW5kIGZyb20gYSBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0CisgKgorICogQXJndW1lbnRzOiAgIGNtZCAgICAgICAtIGNvbW1hbmQgZGVzY3JpcHRvci4KKyAqICAgICAgICAgICAgICBzcmVxICAgICAgLSBSZXF1ZXN0IGZyb20gdGhlIHF1ZXVlLgorICoKKyAqIExvY2sgc3RhdHVzOiBOb25lIG5lZWRlZC4KKyAqCisgKiBSZXR1cm5zOiAgICAgTm90aGluZy4KKyAqCisgKiBOb3RlczogICAgICAgTWFpbmx5IHRyYW5zZmVyIGRhdGEgZnJvbSB0aGUgcmVxdWVzdCBzdHJ1Y3R1cmUgdG8gdGhlCisgKiAgICAgICAgICAgICAgY29tbWFuZCBzdHJ1Y3R1cmUuICBUaGUgcmVxdWVzdCBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkCisgKiAgICAgICAgICAgICAgdXNpbmcgdGhlIG5vcm1hbCBtZW1vcnkgYWxsb2NhdG9yLCBhbmQgcmVxdWVzdHMgY2FuIHBpbGUKKyAqICAgICAgICAgICAgICB1cCB0byBtb3JlIG9yIGxlc3MgYW55IGRlcHRoLiAgVGhlIGNvbW1hbmQgc3RydWN0dXJlIHJlcHJlc2VudHMKKyAqICAgICAgICAgICAgICBhIGNvbnN1bWFibGUgcmVzb3VyY2UsIGFzIHRoZXNlIGFyZSBhbGxvY2F0ZWQgaW50byBhIHBvb2wKKyAqICAgICAgICAgICAgICB3aGVuIHRoZSBTQ1NJIHN1YnN5c3RlbSBpbml0aWFsaXplcy4gIFRoZSBwcmVhbGxvY2F0aW9uIGlzCisgKiAgICAgICAgICAgICAgcmVxdWlyZWQgc28gdGhhdCBpbiBsb3ctbWVtb3J5IHNpdHVhdGlvbnMgYSBkaXNrIEkvTyByZXF1ZXN0CisgKiAgICAgICAgICAgICAgd29uJ3QgY2F1c2UgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIHRyeSBhbmQgd3JpdGUgb3V0IGEgcGFnZS4KKyAqICAgICAgICAgICAgICBUaGUgcmVxdWVzdCBzdHJ1Y3R1cmUgaXMgZ2VuZXJhbGx5IHVzZWQgYnkgaW9jdGxzIGFuZCBjaGFyYWN0ZXIKKyAqICAgICAgICAgICAgICBkZXZpY2VzLgorICovCit2b2lkIHNjc2lfaW5pdF9jbWRfZnJvbV9yZXEoc3RydWN0IHNjc2lfY21uZCAqY21kLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxKQoreworCXNyZXEtPnNyX2NvbW1hbmQgPSBjbWQ7CisKKwljbWQtPm93bmVyID0gU0NTSV9PV05FUl9NSURMRVZFTDsKKwljbWQtPmNtZF9sZW4gPSBzcmVxLT5zcl9jbWRfbGVuOworCWNtZC0+dXNlX3NnID0gc3JlcS0+c3JfdXNlX3NnOworCisJY21kLT5yZXF1ZXN0ID0gc3JlcS0+c3JfcmVxdWVzdDsKKwltZW1jcHkoY21kLT5kYXRhX2NtbmQsIHNyZXEtPnNyX2NtbmQsIHNpemVvZihjbWQtPmRhdGFfY21uZCkpOworCWNtZC0+c2VyaWFsX251bWJlciA9IDA7CisJY21kLT5zZXJpYWxfbnVtYmVyX2F0X3RpbWVvdXQgPSAwOworCWNtZC0+YnVmZmxlbiA9IHNyZXEtPnNyX2J1ZmZsZW47CisJY21kLT5idWZmZXIgPSBzcmVxLT5zcl9idWZmZXI7CisJY21kLT5yZXRyaWVzID0gMDsKKwljbWQtPmFsbG93ZWQgPSBzcmVxLT5zcl9hbGxvd2VkOworCWNtZC0+ZG9uZSA9IHNyZXEtPnNyX2RvbmU7CisJY21kLT50aW1lb3V0X3Blcl9jb21tYW5kID0gc3JlcS0+c3JfdGltZW91dF9wZXJfY29tbWFuZDsKKwljbWQtPnNjX2RhdGFfZGlyZWN0aW9uID0gc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb247CisJY21kLT5zZ2xpc3RfbGVuID0gc3JlcS0+c3Jfc2dsaXN0X2xlbjsKKwljbWQtPnVuZGVyZmxvdyA9IHNyZXEtPnNyX3VuZGVyZmxvdzsKKwljbWQtPnNjX3JlcXVlc3QgPSBzcmVxOworCW1lbWNweShjbWQtPmNtbmQsIHNyZXEtPnNyX2NtbmQsIHNpemVvZihzcmVxLT5zcl9jbW5kKSk7CisKKwkvKgorCSAqIFplcm8gdGhlIHNlbnNlIGJ1ZmZlci4gIFNvbWUgaG9zdCBhZGFwdGVycyBhdXRvbWF0aWNhbGx5IHJlcXVlc3QKKwkgKiBzZW5zZSBvbiBlcnJvci4gIDAgaXMgbm90IGEgdmFsaWQgc2Vuc2UgY29kZS4KKwkgKi8KKwltZW1zZXQoY21kLT5zZW5zZV9idWZmZXIsIDAsIHNpemVvZihzcmVxLT5zcl9zZW5zZV9idWZmZXIpKTsKKwljbWQtPnJlcXVlc3RfYnVmZmVyID0gc3JlcS0+c3JfYnVmZmVyOworCWNtZC0+cmVxdWVzdF9idWZmbGVuID0gc3JlcS0+c3JfYnVmZmxlbjsKKwljbWQtPm9sZF91c2Vfc2cgPSBjbWQtPnVzZV9zZzsKKwlpZiAoY21kLT5jbWRfbGVuID09IDApCisJCWNtZC0+Y21kX2xlbiA9IENPTU1BTkRfU0laRShjbWQtPmNtbmRbMF0pOworCWNtZC0+b2xkX2NtZF9sZW4gPSBjbWQtPmNtZF9sZW47CisJY21kLT5zY19vbGRfZGF0YV9kaXJlY3Rpb24gPSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uOworCWNtZC0+b2xkX3VuZGVyZmxvdyA9IGNtZC0+dW5kZXJmbG93OworCisJLyoKKwkgKiBTdGFydCB0aGUgdGltZXIgdGlja2luZy4KKwkgKi8KKwljbWQtPmludGVybmFsX3RpbWVvdXQgPSBOT1JNQUxfVElNRU9VVDsKKwljbWQtPmFib3J0X3JlYXNvbiA9IDA7CisJY21kLT5yZXN1bHQgPSAwOworCisJU0NTSV9MT0dfTUxRVUVVRSgzLCBwcmludGsoIkxlYXZpbmcgc2NzaV9pbml0X2NtZF9mcm9tX3JlcSgpXG4iKSk7Cit9CisKKy8qCisgKiBQZXItQ1BVIEkvTyBjb21wbGV0aW9uIHF1ZXVlLgorICovCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGxpc3RfaGVhZCwgc2NzaV9kb25lX3EpOworCisvKioKKyAqIHNjc2lfZG9uZSAtIEVucXVldWUgdGhlIGZpbmlzaGVkIFNDU0kgY29tbWFuZCBpbnRvIHRoZSBkb25lIHF1ZXVlLgorICogQGNtZDogVGhlIFNDU0kgQ29tbWFuZCBmb3Igd2hpY2ggYSBsb3ctbGV2ZWwgZGV2aWNlIGRyaXZlciAoTExERCkgZ2l2ZXMKKyAqIG93bmVyc2hpcCBiYWNrIHRvIFNDU0kgQ29yZSAtLSBpLmUuIHRoZSBMTEREIGhhcyBmaW5pc2hlZCB3aXRoIGl0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG1pZC1sZXZlbCdzIChTQ1NJIENvcmUpIGludGVycnVwdCByb3V0aW5lLCB3aGljaAorICogcmVnYWlucyBvd25lcnNoaXAgb2YgdGhlIFNDU0kgY29tbWFuZCAoZGUgZmFjdG8pIGZyb20gYSBMTERELCBhbmQgZW5xdWV1ZXMKKyAqIHRoZSBjb21tYW5kIHRvIHRoZSBkb25lIHF1ZXVlIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgKgorICogVGhpcyBpcyB0aGUgcHJvZHVjZXIgb2YgdGhlIGRvbmUgcXVldWUgd2hvIGVucXVldWVzIGF0IHRoZSB0YWlsLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZXJydXB0IGNvbnRleHQgc2FmZS4KKyAqLwordm9pZCBzY3NpX2RvbmUoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCS8qCisJICogV2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGlzIG9uZSB0aW1pbmcgb3V0IGFueSBtb3JlLgorCSAqIElmIHdlIGFyZSB1bmFibGUgdG8gcmVtb3ZlIHRoZSB0aW1lciwgdGhlbiB0aGUgY29tbWFuZAorCSAqIGhhcyBhbHJlYWR5IHRpbWVkIG91dC4gIEluIHdoaWNoIGNhc2UsIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0bworCSAqIGxldCB0aGUgdGltZW91dCBmdW5jdGlvbiBydW4sIGFzIHdlIGhhdmUgbm8gaWRlYSB3aGVyZSBpbiBmYWN0CisJICogdGhhdCBmdW5jdGlvbiBjb3VsZCByZWFsbHkgYmUuICBJdCBtaWdodCBiZSBvbiBhbm90aGVyIHByb2Nlc3NvciwKKwkgKiBldGMsIGV0Yy4KKwkgKi8KKwlpZiAoIXNjc2lfZGVsZXRlX3RpbWVyKGNtZCkpCisJCXJldHVybjsKKwlfX3Njc2lfZG9uZShjbWQpOworfQorCisvKiBQcml2YXRlIGVudHJ5IHRvIHNjc2lfZG9uZSgpIHRvIGNvbXBsZXRlIGEgY29tbWFuZCB3aGVuIHRoZSB0aW1lcgorICogaXNuJ3QgcnVubmluZyAtLS0gdXNlZCBieSBzY3NpX3RpbWVzX291dCAqLwordm9pZCBfX3Njc2lfZG9uZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogU2V0IHRoZSBzZXJpYWwgbnVtYmVycyBiYWNrIHRvIHplcm8KKwkgKi8KKwljbWQtPnNlcmlhbF9udW1iZXIgPSAwOworCWNtZC0+c2VyaWFsX251bWJlcl9hdF90aW1lb3V0ID0gMDsKKwljbWQtPnN0YXRlID0gU0NTSV9TVEFURV9CSFFVRVVFOworCWNtZC0+b3duZXIgPSBTQ1NJX09XTkVSX0JIX0hBTkRMRVI7CisKKwlhdG9taWNfaW5jKCZjbWQtPmRldmljZS0+aW9kb25lX2NudCk7CisJaWYgKGNtZC0+cmVzdWx0KQorCQlhdG9taWNfaW5jKCZjbWQtPmRldmljZS0+aW9lcnJfY250KTsKKworCS8qCisJICogTmV4dCwgZW5xdWV1ZSB0aGUgY29tbWFuZCBpbnRvIHRoZSBkb25lIHF1ZXVlLgorCSAqIEl0IGlzIGEgcGVyLUNQVSBxdWV1ZSwgc28gd2UganVzdCBkaXNhYmxlIGxvY2FsIGludGVycnVwdHMKKwkgKiBhbmQgbmVlZCBubyBzcGlubG9jay4KKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmY21kLT5laF9lbnRyeSwgJl9fZ2V0X2NwdV92YXIoc2NzaV9kb25lX3EpKTsKKwlyYWlzZV9zb2Z0aXJxX2lycW9mZihTQ1NJX1NPRlRJUlEpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoqCisgKiBzY3NpX3NvZnRpcnEgLSBQZXJmb3JtIHBvc3QtaW50ZXJydXB0IHByb2Nlc3Npbmcgb2YgZmluaXNoZWQgU0NTSSBjb21tYW5kcy4KKyAqCisgKiBUaGlzIGlzIHRoZSBjb25zdW1lciBvZiB0aGUgZG9uZSBxdWV1ZS4KKyAqCisgKiBUaGlzIGlzIGNhbGxlZCB3aXRoIGFsbCBpbnRlcnJ1cHRzIGVuYWJsZWQuICBUaGlzIHNob3VsZCByZWR1Y2UKKyAqIGludGVycnVwdCBsYXRlbmN5LCBzdGFjayBkZXB0aCwgYW5kIHJlZW50cmFuY3kgb2YgdGhlIGxvdy1sZXZlbAorICogZHJpdmVycy4KKyAqLworc3RhdGljIHZvaWQgc2NzaV9zb2Z0aXJxKHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiAqaCkKK3sKKwlpbnQgZGlzcG9zaXRpb247CisJTElTVF9IRUFEKGxvY2FsX3EpOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlsaXN0X3NwbGljZV9pbml0KCZfX2dldF9jcHVfdmFyKHNjc2lfZG9uZV9xKSwgJmxvY2FsX3EpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmbG9jYWxfcSkpIHsKKwkJc3RydWN0IHNjc2lfY21uZCAqY21kID0gbGlzdF9lbnRyeShsb2NhbF9xLm5leHQsCisJCQkJCQkgICBzdHJ1Y3Qgc2NzaV9jbW5kLCBlaF9lbnRyeSk7CisJCWxpc3RfZGVsX2luaXQoJmNtZC0+ZWhfZW50cnkpOworCisJCWRpc3Bvc2l0aW9uID0gc2NzaV9kZWNpZGVfZGlzcG9zaXRpb24oY21kKTsKKwkJc2NzaV9sb2dfY29tcGxldGlvbihjbWQsIGRpc3Bvc2l0aW9uKTsKKwkJc3dpdGNoIChkaXNwb3NpdGlvbikgeworCQljYXNlIFNVQ0NFU1M6CisJCQlzY3NpX2ZpbmlzaF9jb21tYW5kKGNtZCk7CisJCQlicmVhazsKKwkJY2FzZSBORUVEU19SRVRSWToKKwkJCXNjc2lfcmV0cnlfY29tbWFuZChjbWQpOworCQkJYnJlYWs7CisJCWNhc2UgQUREX1RPX01MUVVFVUU6CisJCQlzY3NpX3F1ZXVlX2luc2VydChjbWQsIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmICghc2NzaV9laF9zY21kX2FkZChjbWQsIDApKQorCQkJCXNjc2lfZmluaXNoX2NvbW1hbmQoY21kKTsKKwkJfQorCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uOiAgICBzY3NpX3JldHJ5X2NvbW1hbmQKKyAqCisgKiBQdXJwb3NlOiAgICAgU2VuZCBhIGNvbW1hbmQgYmFjayB0byB0aGUgbG93IGxldmVsIHRvIGJlIHJldHJpZWQuCisgKgorICogTm90ZXM6ICAgICAgIFRoaXMgY29tbWFuZCBpcyBhbHdheXMgZXhlY3V0ZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlCisgKiAgICAgICAgICAgICAgYm90dG9tIGhhbGYgaGFuZGxlciwgb3IgdGhlIGVycm9yIGhhbmRsZXIgdGhyZWFkLiBMb3cKKyAqICAgICAgICAgICAgICBsZXZlbCBkcml2ZXJzIHNob3VsZCBub3QgYmVjb21lIHJlLWVudHJhbnQgYXMgYSByZXN1bHQgb2YKKyAqICAgICAgICAgICAgICB0aGlzLgorICovCitpbnQgc2NzaV9yZXRyeV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwkvKgorCSAqIFJlc3RvcmUgdGhlIFNDU0kgY29tbWFuZCBzdGF0ZS4KKwkgKi8KKwlzY3NpX3NldHVwX2NtZF9yZXRyeShjbWQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFplcm8gdGhlIHNlbnNlIGluZm9ybWF0aW9uIGZyb20gdGhlIGxhc3QgdGltZSB3ZSB0cmllZAorICAgICAgICAgKiB0aGlzIGNvbW1hbmQuCisgICAgICAgICAqLworCW1lbXNldChjbWQtPnNlbnNlX2J1ZmZlciwgMCwgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisKKwlyZXR1cm4gc2NzaV9xdWV1ZV9pbnNlcnQoY21kLCBTQ1NJX01MUVVFVUVfRUhfUkVUUlkpOworfQorCisvKgorICogRnVuY3Rpb246ICAgIHNjc2lfZmluaXNoX2NvbW1hbmQKKyAqCisgKiBQdXJwb3NlOiAgICAgUGFzcyBjb21tYW5kIG9mZiB0byB1cHBlciBsYXllciBmb3IgZmluaXNoaW5nIG9mIEkvTworICogICAgICAgICAgICAgIHJlcXVlc3QsIHdha2luZyBwcm9jZXNzZXMgdGhhdCBhcmUgd2FpdGluZyBvbiByZXN1bHRzLAorICogICAgICAgICAgICAgIGV0Yy4KKyAqLwordm9pZCBzY3NpX2ZpbmlzaF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBjbWQtPmRldmljZTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHNkZXYtPmhvc3Q7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcTsKKworCXNjc2lfZGV2aWNlX3VuYnVzeShzZGV2KTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDbGVhciB0aGUgZmxhZ3Mgd2hpY2ggc2F5IHRoYXQgdGhlIGRldmljZS9ob3N0IGlzIG5vIGxvbmdlcgorICAgICAgICAgKiBjYXBhYmxlIG9mIGFjY2VwdGluZyBuZXcgY29tbWFuZHMuICBUaGVzZSBhcmUgc2V0IGluIHNjc2lfcXVldWUuYworICAgICAgICAgKiBmb3IgYm90aCB0aGUgcXVldWUgZnVsbCBjb25kaXRpb24gb24gYSBkZXZpY2UsIGFuZCBmb3IgYQorICAgICAgICAgKiBob3N0IGZ1bGwgY29uZGl0aW9uIG9uIHRoZSBob3N0LgorCSAqCisJICogWFhYKGhjaCk6IFdoYXQgYWJvdXQgbG9ja2luZz8KKyAgICAgICAgICovCisgICAgICAgIHNob3N0LT5ob3N0X2Jsb2NrZWQgPSAwOworICAgICAgICBzZGV2LT5kZXZpY2VfYmxvY2tlZCA9IDA7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgdmFsaWQgc2Vuc2UgaW5mb3JtYXRpb24sIHRoZW4gc29tZSBraW5kIG9mIHJlY292ZXJ5CisJICogbXVzdCBoYXZlIHRha2VuIHBsYWNlLiAgTWFrZSBhIG5vdGUgb2YgdGhpcy4KKwkgKi8KKwlpZiAoU0NTSV9TRU5TRV9WQUxJRChjbWQpKQorCQljbWQtPnJlc3VsdCB8PSAoRFJJVkVSX1NFTlNFIDw8IDI0KTsKKworCVNDU0lfTE9HX01MQ09NUExFVEUoNCwgcHJpbnRrKCJOb3RpZnlpbmcgdXBwZXIgZHJpdmVyIG9mIGNvbXBsZXRpb24gIgorCQkJCSJmb3IgZGV2aWNlICVkICV4XG4iLCBzZGV2LT5pZCwgY21kLT5yZXN1bHQpKTsKKworCWNtZC0+b3duZXIgPSBTQ1NJX09XTkVSX0hJR0hMRVZFTDsKKwljbWQtPnN0YXRlID0gU0NTSV9TVEFURV9GSU5JU0hFRDsKKworCS8qCisJICogV2UgY2FuIGdldCBoZXJlIHdpdGggdXNlX3NnPTAsIGNhdXNpbmcgYSBwYW5pYyBpbiB0aGUgdXBwZXIgbGV2ZWwKKwkgKi8KKwljbWQtPnVzZV9zZyA9IGNtZC0+b2xkX3VzZV9zZzsKKworCS8qCisJICogSWYgdGhlcmUgaXMgYW4gYXNzb2NpYXRlZCByZXF1ZXN0IHN0cnVjdHVyZSwgY29weSB0aGUgZGF0YSBvdmVyCisJICogYmVmb3JlIHdlIGNhbGwgdGhlIGNvbXBsZXRpb24gZnVuY3Rpb24uCisJICovCisJc3JlcSA9IGNtZC0+c2NfcmVxdWVzdDsKKwlpZiAoc3JlcSkgeworCSAgICAgICBzcmVxLT5zcl9yZXN1bHQgPSBzcmVxLT5zcl9jb21tYW5kLT5yZXN1bHQ7CisJICAgICAgIGlmIChzcmVxLT5zcl9yZXN1bHQpIHsKKwkJICAgICAgIG1lbWNweShzcmVxLT5zcl9zZW5zZV9idWZmZXIsCisJCQkgICAgICBzcmVxLT5zcl9jb21tYW5kLT5zZW5zZV9idWZmZXIsCisJCQkgICAgICBzaXplb2Yoc3JlcS0+c3Jfc2Vuc2VfYnVmZmVyKSk7CisJICAgICAgIH0KKwl9CisKKwljbWQtPmRvbmUoY21kKTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9maW5pc2hfY29tbWFuZCk7CisKKy8qCisgKiBGdW5jdGlvbjoJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoKQorICoKKyAqIFB1cnBvc2U6CUFsbG93IGxvdyBsZXZlbCBkcml2ZXJzIHRvIHRlbGwgdXMgdG8gY2hhbmdlIHRoZSBxdWV1ZSBkZXB0aAorICogCQlvbiBhIHNwZWNpZmljIFNDU0kgZGV2aWNlCisgKgorICogQXJndW1lbnRzOglzZGV2CS0gU0NTSSBEZXZpY2UgaW4gcXVlc3Rpb24KKyAqIAkJdGFnZ2VkCS0gRG8gd2UgdXNlIHRhZ2dlZCBxdWV1ZWluZyAobm9uLTApIG9yIGRvIHdlIHRyZWF0CisgKiAJCQkgIHRoaXMgZGV2aWNlIGFzIGFuIHVudGFnZ2VkIGRldmljZSAoMCkKKyAqIAkJdGFncwktIE51bWJlciBvZiB0YWdzIGFsbG93ZWQgaWYgdGFnZ2VkIHF1ZXVlaW5nIGVuYWJsZWQsCisgKiAJCQkgIG9yIG51bWJlciBvZiBjb21tYW5kcyB0aGUgbG93IGxldmVsIGRyaXZlciBjYW4KKyAqIAkJCSAgcXVldWUgdXAgaW4gbm9uLXRhZ2dlZCBtb2RlIChhcyBwZXIgY21kX3Blcl9sdW4pLgorICoKKyAqIFJldHVybnM6CU5vdGhpbmcKKyAqCisgKiBMb2NrIFN0YXR1czoJTm9uZSBoZWxkIG9uIGVudHJ5CisgKgorICogTm90ZXM6CUxvdyBsZXZlbCBkcml2ZXJzIG1heSBjYWxsIHRoaXMgYXQgYW55IHRpbWUgYW5kIHdlIHdpbGwgZG8KKyAqIAkJdGhlIHJpZ2h0IHRoaW5nIGRlcGVuZGluZyBvbiB3aGV0aGVyIG9yIG5vdCB0aGUgZGV2aWNlIGlzCisgKiAJCWN1cnJlbnRseSBhY3RpdmUgYW5kIHdoZXRoZXIgb3Igbm90IGl0IGV2ZW4gaGFzIHRoZQorICogCQljb21tYW5kIGJsb2NrcyBidWlsdCB5ZXQuCisgKi8KK3ZvaWQgc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgdGFnZ2VkLCBpbnQgdGFncykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiByZWZ1c2UgdG8gc2V0IHRhZ2dlZCBkZXB0aCB0byBhbiB1bndvcmthYmxlIHNpemUKKwkgKi8KKwlpZiAodGFncyA8PSAwKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzZGV2LT5yZXF1ZXN0X3F1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhlIHF1ZXVlIGlzIG1hbmFnZWQgYnkgdGhlIGJsb2NrIGxheWVyCisJICogaWYgaXQgaXMsIGFuZCB3ZSBmYWlsIHRvIGFkanVzdCB0aGUgZGVwdGgsIGV4aXQgKi8KKwlpZiAoYmxrX3F1ZXVlX3RhZ2dlZChzZGV2LT5yZXF1ZXN0X3F1ZXVlKSAmJgorCSAgICBibGtfcXVldWVfcmVzaXplX3RhZ3Moc2Rldi0+cmVxdWVzdF9xdWV1ZSwgdGFncykgIT0gMCkKKwkJZ290byBvdXQ7CisKKwlzZGV2LT5xdWV1ZV9kZXB0aCA9IHRhZ3M7CisJc3dpdGNoICh0YWdnZWQpIHsKKwkJY2FzZSBNU0dfT1JERVJFRF9UQUc6CisJCQlzZGV2LT5vcmRlcmVkX3RhZ3MgPSAxOworCQkJc2Rldi0+c2ltcGxlX3RhZ3MgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgTVNHX1NJTVBMRV9UQUc6CisJCQlzZGV2LT5vcmRlcmVkX3RhZ3MgPSAwOworCQkJc2Rldi0+c2ltcGxlX3RhZ3MgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIoc2NzaSVkOiVkOiVkOiVkKSAiCisJCQkJInNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoLCBiYWQgcXVldWUgdHlwZSwgIgorCQkJCSJkaXNhYmxlZFxuIiwgc2Rldi0+aG9zdC0+aG9zdF9ubywKKwkJCQlzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwgc2Rldi0+bHVuKTsgCisJCWNhc2UgMDoKKwkJCXNkZXYtPm9yZGVyZWRfdGFncyA9IHNkZXYtPnNpbXBsZV90YWdzID0gMDsKKwkJCXNkZXYtPnF1ZXVlX2RlcHRoID0gdGFnczsKKwkJCWJyZWFrOworCX0KKyBvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzZGV2LT5yZXF1ZXN0X3F1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKTsKKworLyoKKyAqIEZ1bmN0aW9uOglzY3NpX3RyYWNrX3F1ZXVlX2Z1bGwoKQorICoKKyAqIFB1cnBvc2U6CVRoaXMgZnVuY3Rpb24gd2lsbCB0cmFjayBzdWNjZXNzaXZlIFFVRVVFX0ZVTEwgZXZlbnRzIG9uIGEKKyAqIAkJc3BlY2lmaWMgU0NTSSBkZXZpY2UgdG8gZGV0ZXJtaW5lIGlmIGFuZCB3aGVuIHRoZXJlIGlzIGEKKyAqIAkJbmVlZCB0byBhZGp1c3QgdGhlIHF1ZXVlIGRlcHRoIG9uIHRoZSBkZXZpY2UuCisgKgorICogQXJndW1lbnRzOglzZGV2CS0gU0NTSSBEZXZpY2UgaW4gcXVlc3Rpb24KKyAqIAkJZGVwdGgJLSBDdXJyZW50IG51bWJlciBvZiBvdXRzdGFuZGluZyBTQ1NJIGNvbW1hbmRzIG9uCisgKiAJCQkgIHRoaXMgZGV2aWNlLCBub3QgY291bnRpbmcgdGhlIG9uZSByZXR1cm5lZCBhcworICogCQkJICBRVUVVRV9GVUxMLgorICoKKyAqIFJldHVybnM6CTAgLSBObyBjaGFuZ2UgbmVlZGVkCisgKiAJCT4wIC0gQWRqdXN0IHF1ZXVlIGRlcHRoIHRvIHRoaXMgbmV3IGRlcHRoCisgKiAJCS0xIC0gRHJvcCBiYWNrIHRvIHVudGFnZ2VkIG9wZXJhdGlvbiB1c2luZyBob3N0LT5jbWRfcGVyX2x1bgorICogCQkJYXMgdGhlIHVudGFnZ2VkIGNvbW1hbmQgZGVwdGgKKyAqCisgKiBMb2NrIFN0YXR1czoJTm9uZSBoZWxkIG9uIGVudHJ5CisgKgorICogTm90ZXM6CUxvdyBsZXZlbCBkcml2ZXJzIG1heSBjYWxsIHRoaXMgYXQgYW55IHRpbWUgYW5kIHdlIHdpbGwgZG8KKyAqIAkJIlRoZSBSaWdodCBUaGluZy4iICBXZSBhcmUgaW50ZXJydXB0IGNvbnRleHQgc2FmZS4KKyAqLworaW50IHNjc2lfdHJhY2tfcXVldWVfZnVsbChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBkZXB0aCkKK3sKKwlpZiAoKGppZmZpZXMgPj4gNCkgPT0gc2Rldi0+bGFzdF9xdWV1ZV9mdWxsX3RpbWUpCisJCXJldHVybiAwOworCisJc2Rldi0+bGFzdF9xdWV1ZV9mdWxsX3RpbWUgPSAoamlmZmllcyA+PiA0KTsKKwlpZiAoc2Rldi0+bGFzdF9xdWV1ZV9mdWxsX2RlcHRoICE9IGRlcHRoKSB7CisJCXNkZXYtPmxhc3RfcXVldWVfZnVsbF9jb3VudCA9IDE7CisJCXNkZXYtPmxhc3RfcXVldWVfZnVsbF9kZXB0aCA9IGRlcHRoOworCX0gZWxzZSB7CisJCXNkZXYtPmxhc3RfcXVldWVfZnVsbF9jb3VudCsrOworCX0KKworCWlmIChzZGV2LT5sYXN0X3F1ZXVlX2Z1bGxfY291bnQgPD0gMTApCisJCXJldHVybiAwOworCWlmIChzZGV2LT5sYXN0X3F1ZXVlX2Z1bGxfZGVwdGggPCA4KSB7CisJCS8qIERyb3AgYmFjayB0byB1bnRhZ2dlZCAqLworCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCAwLCBzZGV2LT5ob3N0LT5jbWRfcGVyX2x1bik7CisJCXJldHVybiAtMTsKKwl9CisJCisJaWYgKHNkZXYtPm9yZGVyZWRfdGFncykKKwkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RldiwgTVNHX09SREVSRURfVEFHLCBkZXB0aCk7CisJZWxzZQorCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBNU0dfU0lNUExFX1RBRywgZGVwdGgpOworCXJldHVybiBkZXB0aDsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV90cmFja19xdWV1ZV9mdWxsKTsKKworLyoqCisgKiBzY3NpX2RldmljZV9nZXQgIC0gIGdldCBhbiBhZGRpdGlvbiByZWZlcmVuY2UgdG8gYSBzY3NpX2RldmljZQorICogQHNkZXY6CWRldmljZSB0byBnZXQgYSByZWZlcmVuY2UgdG8KKyAqCisgKiBHZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBzY3NpX2RldmljZSBhbmQgaW5jcmVtZW50cyB0aGUgdXNlIGNvdW50CisgKiBvZiB0aGUgdW5kZXJseWluZyBMTEREIG1vZHVsZS4gIFlvdSBtdXN0IGhvbGQgaG9zdF9sb2NrIG9mIHRoZQorICogcGFyZW50IFNjc2lfSG9zdCBvciBhbHJlYWR5IGhhdmUgYSByZWZlcmVuY2Ugd2hlbiBjYWxsaW5nIHRoaXMuCisgKi8KK2ludCBzY3NpX2RldmljZV9nZXQoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCWlmIChzZGV2LT5zZGV2X3N0YXRlID09IFNERVZfREVMIHx8IHNkZXYtPnNkZXZfc3RhdGUgPT0gU0RFVl9DQU5DRUwpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFnZXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldikpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCF0cnlfbW9kdWxlX2dldChzZGV2LT5ob3N0LT5ob3N0dC0+bW9kdWxlKSkgeworCQlwdXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CisJCXJldHVybiAtRU5YSU87CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzY3NpX2RldmljZV9nZXQpOworCisvKioKKyAqIHNjc2lfZGV2aWNlX3B1dCAgLSAgcmVsZWFzZSBhIHJlZmVyZW5jZSB0byBhIHNjc2lfZGV2aWNlCisgKiBAc2RldjoJZGV2aWNlIHRvIHJlbGVhc2UgYSByZWZlcmVuY2Ugb24uCisgKgorICogUmVsZWFzZSBhIHJlZmVyZW5jZSB0byB0aGUgc2NzaV9kZXZpY2UgYW5kIGRlY3JlbWVudHMgdGhlIHVzZSBjb3VudAorICogb2YgdGhlIHVuZGVybHlpbmcgTExERCBtb2R1bGUuICBUaGUgZGV2aWNlIGlzIGZyZWVkIG9uY2UgdGhlIGxhc3QKKyAqIHVzZXIgdmFuaXNoZXMuCisgKi8KK3ZvaWQgc2NzaV9kZXZpY2VfcHV0KHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwltb2R1bGVfcHV0KHNkZXYtPmhvc3QtPmhvc3R0LT5tb2R1bGUpOworCXB1dF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9kZXZpY2VfcHV0KTsKKworLyogaGVscGVyIGZvciBzaG9zdF9mb3JfZWFjaF9kZXZpY2UsIHRodXMgbm90IGRvY3VtZW50ZWQgKi8KK3N0cnVjdCBzY3NpX2RldmljZSAqX19zY3NpX2l0ZXJhdGVfZGV2aWNlcyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJCQkJICAgc3RydWN0IHNjc2lfZGV2aWNlICpwcmV2KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QgPSAocHJldiA/ICZwcmV2LT5zaWJsaW5ncyA6ICZzaG9zdC0+X19kZXZpY2VzKTsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKm5leHQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJd2hpbGUgKGxpc3QtPm5leHQgIT0gJnNob3N0LT5fX2RldmljZXMpIHsKKwkJbmV4dCA9IGxpc3RfZW50cnkobGlzdC0+bmV4dCwgc3RydWN0IHNjc2lfZGV2aWNlLCBzaWJsaW5ncyk7CisJCS8qIHNraXAgZGV2aWNlcyB0aGF0IHdlIGNhbid0IGdldCBhIHJlZmVyZW5jZSB0byAqLworCQlpZiAoIXNjc2lfZGV2aWNlX2dldChuZXh0KSkKKwkJCWJyZWFrOworCQluZXh0ID0gTlVMTDsKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKHByZXYpCisJCXNjc2lfZGV2aWNlX3B1dChwcmV2KTsKKwlyZXR1cm4gbmV4dDsKK30KK0VYUE9SVF9TWU1CT0woX19zY3NpX2l0ZXJhdGVfZGV2aWNlcyk7CisKKy8qKgorICogc3RhcmdldF9mb3JfZWFjaF9kZXZpY2UgIC0gIGhlbHBlciB0byB3YWxrIGFsbCBkZXZpY2VzIG9mIGEgdGFyZ2V0CisgKiBAc3RhcmdldDoJdGFyZ2V0IHdob3NlIGRldmljZXMgd2Ugd2FudCB0byBpdGVyYXRlIG92ZXIuCisgKgorICogVGhpcyB0cmF2ZXJzZXMgb3ZlciBlYWNoIGRldmljZXMgb2YgQHNob3N0LiAgVGhlIGRldmljZXMgaGF2ZQorICogYSByZWZlcmVuY2UgdGhhdCBtdXN0IGJlIHJlbGVhc2VkIGJ5IHNjc2lfaG9zdF9wdXQgd2hlbiBicmVha2luZworICogb3V0IG9mIHRoZSBsb29wLgorICovCit2b2lkIHN0YXJnZXRfZm9yX2VhY2hfZGV2aWNlKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwgdm9pZCAqIGRhdGEsCisJCSAgICAgdm9pZCAoKmZuKShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgdm9pZCAqKSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisKKwlzaG9zdF9mb3JfZWFjaF9kZXZpY2Uoc2Rldiwgc2hvc3QpIHsKKwkJaWYgKChzZGV2LT5jaGFubmVsID09IHN0YXJnZXQtPmNoYW5uZWwpICYmCisJCSAgICAoc2Rldi0+aWQgPT0gc3RhcmdldC0+aWQpKQorCQkJZm4oc2RldiwgZGF0YSk7CisJfQorfQorRVhQT1JUX1NZTUJPTChzdGFyZ2V0X2Zvcl9lYWNoX2RldmljZSk7CisKKy8qKgorICogX19zY3NpX2RldmljZV9sb29rdXBfYnlfdGFyZ2V0IC0gZmluZCBhIGRldmljZSBnaXZlbiB0aGUgdGFyZ2V0IChVTkxPQ0tFRCkKKyAqIEBzdGFyZ2V0OglTQ1NJIHRhcmdldCBwb2ludGVyCisgKiBAbHVuOglTQ1NJIExvZ2ljYWwgVW5pdCBOdW1iZXIKKyAqCisgKiBMb29rcyB1cCB0aGUgc2NzaV9kZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIEBsdW4gZm9yIGEgZ2l2ZQorICogQHN0YXJnZXQuIFRoZSByZXR1cm5lZCBzY3NpX2RldmljZSBkb2VzIG5vdCBoYXZlIGFuIGFkZGl0aW9uYWwKKyAqIHJlZmVyZW5jZS4gIFlvdSBtdXN0IGhvbGQgdGhlIGhvc3QncyBob3N0X2xvY2sgb3ZlciB0aGlzIGNhbGwgYW5kCisgKiBhbnkgYWNjZXNzIHRvIHRoZSByZXR1cm5lZCBzY3NpX2RldmljZS4KKyAqCisgKiBOb3RlOiAgVGhlIG9ubHkgcmVhc29uIHdoeSBkcml2ZXJzIHdvdWxkIHdhbnQgdG8gdXNlIHRoaXMgaXMgYmVjYXVzZQorICogdGhleSdyZSBuZWVkIHRvIGFjY2VzcyB0aGUgZGV2aWNlIGxpc3QgaW4gaXJxIGNvbnRleHQuICBPdGhlcndpc2UgeW91CisgKiByZWFsbHkgd2FudCB0byB1c2Ugc2NzaV9kZXZpY2VfbG9va3VwX2J5X3RhcmdldCBpbnN0ZWFkLgorICoqLworc3RydWN0IHNjc2lfZGV2aWNlICpfX3Njc2lfZGV2aWNlX2xvb2t1cF9ieV90YXJnZXQoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LAorCQkJCQkJICAgdWludCBsdW4pCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZGV2LCAmc3RhcmdldC0+ZGV2aWNlcywgc2FtZV90YXJnZXRfc2libGluZ3MpIHsKKwkJaWYgKHNkZXYtPmx1biA9PWx1bikKKwkJCXJldHVybiBzZGV2OworCX0KKworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChfX3Njc2lfZGV2aWNlX2xvb2t1cF9ieV90YXJnZXQpOworCisvKioKKyAqIHNjc2lfZGV2aWNlX2xvb2t1cF9ieV90YXJnZXQgLSBmaW5kIGEgZGV2aWNlIGdpdmVuIHRoZSB0YXJnZXQKKyAqIEBzdGFyZ2V0OglTQ1NJIHRhcmdldCBwb2ludGVyCisgKiBAbHVuOglTQ1NJIExvZ2ljYWwgVW5pdCBOdW1iZXIKKyAqCisgKiBMb29rcyB1cCB0aGUgc2NzaV9kZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIEBjaGFubmVsLCBAaWQsIEBsdW4gZm9yIGEKKyAqIGdpdmUgaG9zdC4gIFRoZSByZXR1cm5lZCBzY3NpX2RldmljZSBoYXMgYW4gYWRkaXRpb25hbCByZWZlcmVuY2UgdGhhdAorICogbmVlZHMgdG8gYmUgcmVsZWFzZSB3aXRoIHNjc2lfaG9zdF9wdXQgb25jZSB5b3UncmUgZG9uZSB3aXRoIGl0LgorICoqLworc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2RldmljZV9sb29rdXBfYnlfdGFyZ2V0KHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwKKwkJCQkJCSB1aW50IGx1bikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlzZGV2ID0gX19zY3NpX2RldmljZV9sb29rdXBfYnlfdGFyZ2V0KHN0YXJnZXQsIGx1bik7CisJaWYgKHNkZXYgJiYgc2NzaV9kZXZpY2VfZ2V0KHNkZXYpKQorCQlzZGV2ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBzZGV2OworfQorRVhQT1JUX1NZTUJPTChzY3NpX2RldmljZV9sb29rdXBfYnlfdGFyZ2V0KTsKKworLyoqCisgKiBzY3NpX2RldmljZV9sb29rdXAgLSBmaW5kIGEgZGV2aWNlIGdpdmVuIHRoZSBob3N0IChVTkxPQ0tFRCkKKyAqIEBzaG9zdDoJU0NTSSBob3N0IHBvaW50ZXIKKyAqIEBjaGFubmVsOglTQ1NJIGNoYW5uZWwgKHplcm8gaWYgb25seSBvbmUgY2hhbm5lbCkKKyAqIEBwdW46CVNDU0kgdGFyZ2V0IG51bWJlciAocGh5c2ljYWwgdW5pdCBudW1iZXIpCisgKiBAbHVuOglTQ1NJIExvZ2ljYWwgVW5pdCBOdW1iZXIKKyAqCisgKiBMb29rcyB1cCB0aGUgc2NzaV9kZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIEBjaGFubmVsLCBAaWQsIEBsdW4gZm9yIGEKKyAqIGdpdmUgaG9zdC4gVGhlIHJldHVybmVkIHNjc2lfZGV2aWNlIGRvZXMgbm90IGhhdmUgYW4gYWRkaXRpb25hbCByZWZlcmVuY2UuCisgKiBZb3UgbXVzdCBob2xkIHRoZSBob3N0J3MgaG9zdF9sb2NrIG92ZXIgdGhpcyBjYWxsIGFuZCBhbnkgYWNjZXNzIHRvIHRoZQorICogcmV0dXJuZWQgc2NzaV9kZXZpY2UuCisgKgorICogTm90ZTogIFRoZSBvbmx5IHJlYXNvbiB3aHkgZHJpdmVycyB3b3VsZCB3YW50IHRvIHVzZSB0aGlzIGlzIGJlY2F1c2UKKyAqIHRoZXkncmUgbmVlZCB0byBhY2Nlc3MgdGhlIGRldmljZSBsaXN0IGluIGlycSBjb250ZXh0LiAgT3RoZXJ3aXNlIHlvdQorICogcmVhbGx5IHdhbnQgdG8gdXNlIHNjc2lfZGV2aWNlX2xvb2t1cCBpbnN0ZWFkLgorICoqLworc3RydWN0IHNjc2lfZGV2aWNlICpfX3Njc2lfZGV2aWNlX2xvb2t1cChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJdWludCBjaGFubmVsLCB1aW50IGlkLCB1aW50IGx1bikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNkZXYsICZzaG9zdC0+X19kZXZpY2VzLCBzaWJsaW5ncykgeworCQlpZiAoc2Rldi0+Y2hhbm5lbCA9PSBjaGFubmVsICYmIHNkZXYtPmlkID09IGlkICYmCisJCQkJc2Rldi0+bHVuID09bHVuKQorCQkJcmV0dXJuIHNkZXY7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKF9fc2NzaV9kZXZpY2VfbG9va3VwKTsKKworLyoqCisgKiBzY3NpX2RldmljZV9sb29rdXAgLSBmaW5kIGEgZGV2aWNlIGdpdmVuIHRoZSBob3N0CisgKiBAc2hvc3Q6CVNDU0kgaG9zdCBwb2ludGVyCisgKiBAY2hhbm5lbDoJU0NTSSBjaGFubmVsICh6ZXJvIGlmIG9ubHkgb25lIGNoYW5uZWwpCisgKiBAaWQ6CQlTQ1NJIHRhcmdldCBudW1iZXIgKHBoeXNpY2FsIHVuaXQgbnVtYmVyKQorICogQGx1bjoJU0NTSSBMb2dpY2FsIFVuaXQgTnVtYmVyCisgKgorICogTG9va3MgdXAgdGhlIHNjc2lfZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBAY2hhbm5lbCwgQGlkLCBAbHVuIGZvciBhCisgKiBnaXZlIGhvc3QuICBUaGUgcmV0dXJuZWQgc2NzaV9kZXZpY2UgaGFzIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRoYXQKKyAqIG5lZWRzIHRvIGJlIHJlbGVhc2Ugd2l0aCBzY3NpX2hvc3RfcHV0IG9uY2UgeW91J3JlIGRvbmUgd2l0aCBpdC4KKyAqKi8KK3N0cnVjdCBzY3NpX2RldmljZSAqc2NzaV9kZXZpY2VfbG9va3VwKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQl1aW50IGNoYW5uZWwsIHVpbnQgaWQsIHVpbnQgbHVuKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXNkZXYgPSBfX3Njc2lfZGV2aWNlX2xvb2t1cChzaG9zdCwgY2hhbm5lbCwgaWQsIGx1bik7CisJaWYgKHNkZXYgJiYgc2NzaV9kZXZpY2VfZ2V0KHNkZXYpKQorCQlzZGV2ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBzZGV2OworfQorRVhQT1JUX1NZTUJPTChzY3NpX2RldmljZV9sb29rdXApOworCisvKioKKyAqIHNjc2lfZGV2aWNlX2NhbmNlbCAtIGNhbmNlbCBvdXRzdGFuZGluZyBJTyB0byB0aGlzIGRldmljZQorICogQHNkZXY6CVBvaW50ZXIgdG8gc3RydWN0IHNjc2lfZGV2aWNlCisgKiBAcmVjb3Zlcnk6CUJvb2xlYW4gaW5zdHJ1Y3RpbmcgZnVuY3Rpb24gdG8gcmVjb3ZlciBkZXZpY2Ugb3Igbm90LgorICoKKyAqKi8KK2ludCBzY3NpX2RldmljZV9jYW5jZWwoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgcmVjb3ZlcnkpCit7CisJc3RydWN0IHNjc2lfY21uZCAqc2NtZDsKKwlMSVNUX0hFQUQoYWN0aXZlX2xpc3QpOworCXN0cnVjdCBsaXN0X2hlYWQgKmxoLCAqbGhfc2Y7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNjc2lfZGV2aWNlX3NldF9zdGF0ZShzZGV2LCBTREVWX0NBTkNFTCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2Rldi0+bGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzY21kLCAmc2Rldi0+Y21kX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHNjbWQtPnJlcXVlc3QgJiYgc2NtZC0+cmVxdWVzdC0+cnFfc3RhdHVzICE9IFJRX0lOQUNUSVZFKSB7CisJCQkvKgorCQkJICogSWYgd2UgYXJlIHVuYWJsZSB0byByZW1vdmUgdGhlIHRpbWVyLCBpdCBtZWFucworCQkJICogdGhhdCB0aGUgY29tbWFuZCBoYXMgYWxyZWFkeSB0aW1lZCBvdXQgb3IKKwkJCSAqIGZpbmlzaGVkLgorCQkJICovCisJCQlpZiAoIXNjc2lfZGVsZXRlX3RpbWVyKHNjbWQpKQorCQkJCWNvbnRpbnVlOworCQkJbGlzdF9hZGRfdGFpbCgmc2NtZC0+ZWhfZW50cnksICZhY3RpdmVfbGlzdCk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Rldi0+bGlzdF9sb2NrLCBmbGFncyk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmFjdGl2ZV9saXN0KSkgeworCQlsaXN0X2Zvcl9lYWNoX3NhZmUobGgsIGxoX3NmLCAmYWN0aXZlX2xpc3QpIHsKKwkJCXNjbWQgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3Qgc2NzaV9jbW5kLCBlaF9lbnRyeSk7CisJCQlsaXN0X2RlbF9pbml0KGxoKTsKKwkJCWlmIChyZWNvdmVyeSkgeworCQkJCXNjc2lfZWhfc2NtZF9hZGQoc2NtZCwgU0NTSV9FSF9DQU5DRUxfQ01EKTsKKwkJCX0gZWxzZSB7CisJCQkJc2NtZC0+cmVzdWx0ID0gKERJRF9BQk9SVCA8PCAxNik7CisJCQkJc2NzaV9maW5pc2hfY29tbWFuZChzY21kKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzY3NpX2RldmljZV9jYW5jZWwpOworCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCitzdGF0aWMgaW50IHNjc2lfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3sKKwlpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKKworCXN3aXRjaChhY3Rpb24pIHsKKwljYXNlIENQVV9ERUFEOgorCQkvKiBEcmFpbiBzY3NpX2RvbmVfcS4gKi8KKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmcGVyX2NwdShzY3NpX2RvbmVfcSwgY3B1KSwKKwkJCQkgJl9fZ2V0X2NwdV92YXIoc2NzaV9kb25lX3EpKTsKKwkJcmFpc2Vfc29mdGlycV9pcnFvZmYoU0NTSV9TT0ZUSVJRKTsKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBfX2RldmluaXRkYXRhIHNjc2lfY3B1X25iID0geworCS5ub3RpZmllcl9jYWxsCT0gc2NzaV9jcHVfbm90aWZ5LAorfTsKKworI2RlZmluZSByZWdpc3Rlcl9zY3NpX2NwdSgpIHJlZ2lzdGVyX2NwdV9ub3RpZmllcigmc2NzaV9jcHVfbmIpCisjZGVmaW5lIHVucmVnaXN0ZXJfc2NzaV9jcHUoKSB1bnJlZ2lzdGVyX2NwdV9ub3RpZmllcigmc2NzaV9jcHVfbmIpCisjZWxzZQorI2RlZmluZSByZWdpc3Rlcl9zY3NpX2NwdSgpCisjZGVmaW5lIHVucmVnaXN0ZXJfc2NzaV9jcHUoKQorI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNDU0kgY29yZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0oc2NzaV9sb2dnaW5nX2xldmVsLCBpbnQsIFNfSVJVR098U19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKHNjc2lfbG9nZ2luZ19sZXZlbCwgImEgYml0IG1hc2sgb2YgbG9nZ2luZyBsZXZlbHMiKTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9zY3NpKHZvaWQpCit7CisJaW50IGVycm9yLCBpOworCisJZXJyb3IgPSBzY3NpX2luaXRfcXVldWUoKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwllcnJvciA9IHNjc2lfaW5pdF9wcm9jZnMoKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cF9xdWV1ZTsKKwllcnJvciA9IHNjc2lfaW5pdF9kZXZpbmZvKCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGNsZWFudXBfcHJvY2ZzOworCWVycm9yID0gc2NzaV9pbml0X2hvc3RzKCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGNsZWFudXBfZGV2bGlzdDsKKwllcnJvciA9IHNjc2lfaW5pdF9zeXNjdGwoKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cF9ob3N0czsKKwllcnJvciA9IHNjc2lfc3lzZnNfcmVnaXN0ZXIoKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cF9zeXNjdGw7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKQorCQlJTklUX0xJU1RfSEVBRCgmcGVyX2NwdShzY3NpX2RvbmVfcSwgaSkpOworCisJZGV2ZnNfbWtfZGlyKCJzY3NpIik7CisJb3Blbl9zb2Z0aXJxKFNDU0lfU09GVElSUSwgc2NzaV9zb2Z0aXJxLCBOVUxMKTsKKwlyZWdpc3Rlcl9zY3NpX2NwdSgpOworCXByaW50ayhLRVJOX05PVElDRSAiU0NTSSBzdWJzeXN0ZW0gaW5pdGlhbGl6ZWRcbiIpOworCXJldHVybiAwOworCitjbGVhbnVwX3N5c2N0bDoKKwlzY3NpX2V4aXRfc3lzY3RsKCk7CitjbGVhbnVwX2hvc3RzOgorCXNjc2lfZXhpdF9ob3N0cygpOworY2xlYW51cF9kZXZsaXN0OgorCXNjc2lfZXhpdF9kZXZpbmZvKCk7CitjbGVhbnVwX3Byb2NmczoKKwlzY3NpX2V4aXRfcHJvY2ZzKCk7CitjbGVhbnVwX3F1ZXVlOgorCXNjc2lfZXhpdF9xdWV1ZSgpOworCXByaW50ayhLRVJOX0VSUiAiU0NTSSBzdWJzeXN0ZW0gZmFpbGVkIHRvIGluaXRpYWxpemUsIGVycm9yID0gJWRcbiIsCisJICAgICAgIC1lcnJvcik7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9zY3NpKHZvaWQpCit7CisJc2NzaV9zeXNmc191bnJlZ2lzdGVyKCk7CisJc2NzaV9leGl0X3N5c2N0bCgpOworCXNjc2lfZXhpdF9ob3N0cygpOworCXNjc2lfZXhpdF9kZXZpbmZvKCk7CisJZGV2ZnNfcmVtb3ZlKCJzY3NpIik7CisJc2NzaV9leGl0X3Byb2NmcygpOworCXNjc2lfZXhpdF9xdWV1ZSgpOworCXVucmVnaXN0ZXJfc2NzaV9jcHUoKTsKK30KKworc3Vic3lzX2luaXRjYWxsKGluaXRfc2NzaSk7Cittb2R1bGVfZXhpdChleGl0X3Njc2kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2kuaCBiL2RyaXZlcnMvc2NzaS9zY3NpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I2YjVmYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiAgc2NzaS5oIENvcHlyaWdodCAoQykgMTk5MiBEcmV3IEVja2hhcmR0IAorICogICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTgsIDE5OTkgRXJpYyBZb3VuZ2RhbGUKKyAqICBnZW5lcmljIFNDU0kgcGFja2FnZSBoZWFkZXIgZmlsZSBieQorICogICAgICBJbml0aWFsIHZlcnNpb25zOiBEcmV3IEVja2hhcmR0CisgKiAgICAgIFN1YnNlcXVlbnQgcmV2aXNpb25zOiBFcmljIFlvdW5nZGFsZQorICoKKyAqICA8ZHJld0Bjb2xvcmFkby5lZHU+CisgKgorICogICAgICAgTW9kaWZpZWQgYnkgRXJpYyBZb3VuZ2RhbGUgZXJpY0BhbmRhbnRlLm9yZyB0bworICogICAgICAgYWRkIHNjYXR0ZXItZ2F0aGVyLCBtdWx0aXBsZSBvdXRzdGFuZGluZyByZXF1ZXN0LCBhbmQgb3RoZXIKKyAqICAgICAgIGVuaGFuY2VtZW50cy4KKyAqLworLyoKKyAqIE5PVEU6ICB0aGlzIGZpbGUgb25seSBjb250YWlucyBjb21wYXRpYmlsaXR5IGdsdWUgZm9yIG9sZCBkcml2ZXJzLiAgQWxsCisgKiB0aGVzZSB3cmFwcGVycyB3aWxsIGJlIHJlbW92ZWQgc29vbmVyIG9yIGxhdGVyLiAgRm9yIG5ldyBjb2RlIHBsZWFzZSB1c2UKKyAqIHRoZSBpbnRlcmZhY2VzIGRlY2xhcmVkIGluIHRoZSBoZWFkZXJzIGluIGluY2x1ZGUvc2NzaS8KKyAqLworCisjaWZuZGVmIF9TQ1NJX0gKKyNkZWZpbmUgX1NDU0lfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CSAgICAvKiBmb3IgQ09ORklHX1NDU0lfTE9HR0lORyAqLworCisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGJnLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9yZXF1ZXN0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorCisvKgorICogU29tZSBkZWZzLCBpbiBjYXNlIHRoZXNlIGFyZSBub3QgZGVmaW5lZCBlbHNld2hlcmUuCisgKi8KKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFIDEKKyNlbmRpZgorI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKworc3RydWN0IFNjc2lfSG9zdDsKK3N0cnVjdCBzY3NpX2NtbmQ7CitzdHJ1Y3Qgc2NzaV9kZXZpY2U7CitzdHJ1Y3Qgc2NzaV90YXJnZXQ7CitzdHJ1Y3Qgc2NhdHRlcmxpc3Q7CisKKy8qCisgKiBMZWdhY3kgZG1hIGRpcmVjdGlvbiBpbnRlcmZhY2VzLgorICoKKyAqIFRoaXMgYXNzdW1lcyB0aGUgcGNpL3NidXMgZG1hIG1hcHBpbmcgZmxhZ3MgaGF2ZSB0aGUgc2FtZSBudW1lcmNpYWwKKyAqIHZhbHVlcyBhcyB0aGUgZ2VuZXJpYyBkbWEtbWFwcGluZyBvbmVzLiAgQ3VycmVudGx5IHRoZXkgaGF2ZSBidXQgdGhlcmUncworICogbm8gd2F5IHRvIGNoZWNrLiAgQmV0dGVyIGRvbid0IHVzZSB0aGVzZSBpbnRlcmZhY2VzIQorICovCisjZGVmaW5lIFNDU0lfREFUQV9VTktOT1dOCShETUFfQklESVJFQ1RJT05BTCkKKyNkZWZpbmUgU0NTSV9EQVRBX1dSSVRFCQkoRE1BX1RPX0RFVklDRSkKKyNkZWZpbmUgU0NTSV9EQVRBX1JFQUQJCShETUFfRlJPTV9ERVZJQ0UpCisjZGVmaW5lIFNDU0lfREFUQV9OT05FCQkoRE1BX05PTkUpCisKKyNkZWZpbmUgc2NzaV90b19wY2lfZG1hX2RpcihzY3NpX2RpcikJKChpbnQpKHNjc2lfZGlyKSkKKyNkZWZpbmUgc2NzaV90b19zYnVzX2RtYV9kaXIoc2NzaV9kaXIpCSgoaW50KShzY3NpX2RpcikpCisKKy8qCisgKiBPbGQgbmFtZXMgZm9yIGRlYnVnIHByZXR0eXByaW50aW5nIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHByaW50X1Njc2lfQ21uZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJcmV0dXJuIHNjc2lfcHJpbnRfY29tbWFuZChjbWQpOworfQorc3RhdGljIGlubGluZSB2b2lkIHByaW50X2NvbW1hbmQodW5zaWduZWQgY2hhciAqY2RiKQoreworCXJldHVybiBfX3Njc2lfcHJpbnRfY29tbWFuZChjZGIpOworfQorc3RhdGljIGlubGluZSB2b2lkIHByaW50X3NlbnNlKGNvbnN0IGNoYXIgKmRldmNsYXNzLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJcmV0dXJuIHNjc2lfcHJpbnRfc2Vuc2UoZGV2Y2xhc3MsIGNtZCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfcmVxX3NlbnNlKGNvbnN0IGNoYXIgKmRldmNsYXNzLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpyZXEpCit7CisJcmV0dXJuIHNjc2lfcHJpbnRfcmVxX3NlbnNlKGRldmNsYXNzLCByZXEpOworfQorc3RhdGljIGlubGluZSB2b2lkIHByaW50X2RyaXZlcmJ5dGUoaW50IHNjc2lyZXN1bHQpCit7CisJcmV0dXJuIHNjc2lfcHJpbnRfZHJpdmVyYnl0ZShzY3NpcmVzdWx0KTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmludF9ob3N0Ynl0ZShpbnQgc2NzaXJlc3VsdCkKK3sKKwlyZXR1cm4gc2NzaV9wcmludF9ob3N0Ynl0ZShzY3NpcmVzdWx0KTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmludF9zdGF0dXModW5zaWduZWQgY2hhciBzdGF0dXMpCit7CisJcmV0dXJuIHNjc2lfcHJpbnRfc3RhdHVzKHN0YXR1cyk7Cit9CitzdGF0aWMgaW5saW5lIGludCBwcmludF9tc2coY29uc3QgdW5zaWduZWQgY2hhciAqbXNnKQoreworCXJldHVybiBzY3NpX3ByaW50X21zZyhtc2cpOworfQorCisvKgorICogVGhpcyBpcyB0aGUgY3JhcCBmcm9tIHRoZSBvbGQgZXJyb3IgaGFuZGxpbmcgY29kZS4gIFdlIGhhdmUgaXQgaW4gYSBzcGVjaWFsCisgKiBwbGFjZSBzbyB0aGF0IHdlIGNhbiBtb3JlIGVhc2lseSBkZWxldGUgaXQgbGF0ZXIgb24uCisgKi8KKyNpbmNsdWRlICJzY3NpX29ic29sZXRlLmgiCisKKy8qIG9ic29sZXRlIHR5cGVkZWYganVuay4gKi8KKyNpbmNsdWRlICJzY3NpX3R5cGVkZWZzLmgiCisKKyNlbmRpZiAvKiBfU0NTSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jIGIvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDIwODg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYwpAQCAtMCwwICsxLDE5NzYgQEAKKy8qCisgKiAgbGludXgva2VybmVsL3Njc2lfZGVidWcuYworICogdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYgT3JpZ2luYWwgdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dgorICogIENvcHlyaWdodCAoQykgMTk5MiAgRXJpYyBZb3VuZ2RhbGUKKyAqICBTaW11bGF0ZSBhIGhvc3QgYWRhcHRlciB3aXRoIDIgZGlza3MgYXR0YWNoZWQuICBEbyBhIGxvdCBvZiBjaGVja2luZworICogIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBub3QgZ2V0dGluZyBibG9ja3MgbWl4ZWQgdXAsIGFuZCBQQU5JQyBpZgorICogIGFueXRoaW5nIG91dCBvZiB0aGUgb3JkaW5hcnkgaXMgc2Vlbi4KKyAqIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eIE9yaWdpbmFsIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKyAqCisgKiAgVGhpcyB2ZXJzaW9uIGlzIG1vcmUgZ2VuZXJpYywgc2ltdWxhdGluZyBhIHZhcmlhYmxlIG51bWJlciBvZiBkaXNrCisgKiAgKG9yIGRpc2sgbGlrZSBkZXZpY2VzKSBzaGFyaW5nIGEgY29tbW9uIGFtb3VudCBvZiBSQU0KKyAqCisgKgorICogIEZvciBkb2N1bWVudGF0aW9uIHNlZSBodHRwOi8vd3d3LnRvcnF1ZS5uZXQvc2cvc2RlYnVnMjYuaHRtbAorICoKKyAqICAgRC4gR2lsYmVydCAoZHBnKSB3b3JrIGZvciBNYWduZXRvLU9wdGljYWwgZGV2aWNlIHRlc3QgWzIwMDEwNDIxXQorICogICBkcGc6IHdvcmsgZm9yIGRldmZzIGxhcmdlIG51bWJlciBvZiBkaXNrcyBbMjAwMTA4MDldCisgKiAgICAgICAgZm9ya2VkIGZvciBsayAyLjUgc2VyaWVzIFsyMDAxMTIxNiwgMjAwMjAxMDFdCisgKiAgICAgICAgdXNlIHZtYWxsb2MoKSBtb3JlIGlucXVpcnkrbW9kZV9zZW5zZSBbMjAwMjAzMDJdCisgKiAgICAgICAgYWRkIHRpbWVycyBmb3IgZGVsYXllZCByZXNwb25zZXMgWzIwMDIwNzIxXQorICogICBQYXRyaWNrIE1hbnNmaWVsZCA8cGF0bWFuc0B1cy5pYm0uY29tPiBtYXhfbHVucytzY3NpX2xldmVsIFsyMDAyMTAzMV0KKyAqICAgTWlrZSBBbmRlcnNvbiA8YW5kbWlrZUB1cy5pYm0uY29tPiBzeXNmcyB3b3JrIFsyMDAyMTExOF0KKyAqICAgZHBnOiBjaGFuZ2Ugc3R5bGUgb2YgYm9vdCBvcHRpb25zIHRvICJzY3NpX2RlYnVnLm51bV90Z3RzPTIiIGFuZAorICogICAgICAgIG1vZHVsZSBvcHRpb25zIHRvICJtb2Rwcm9iZSBzY3NpX2RlYnVnIG51bV90Z3RzPTIiIFsyMDAyMTIyMV0KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKworI2lmbmRlZiBMSU5VWF9WRVJTSU9OX0NPREUKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNjc2lfbG9nZ2luZy5oIgorI2luY2x1ZGUgInNjc2lfZGVidWcuaCIKKworI2RlZmluZSBTQ1NJX0RFQlVHX1ZFUlNJT04gIjEuNzUiCitzdGF0aWMgY29uc3QgY2hhciAqIHNjc2lfZGVidWdfdmVyc2lvbl9kYXRlID0gIjIwMDUwMTEzIjsKKworLyogQWRkaXRpb25hbCBTZW5zZSBDb2RlIChBU0MpIHVzZWQgKi8KKyNkZWZpbmUgTk9fQURERURfU0VOU0UgMHgwCisjZGVmaW5lIFVOUkVDT1ZFUkVEX1JFQURfRVJSIDB4MTEKKyNkZWZpbmUgSU5WQUxJRF9PUENPREUgMHgyMAorI2RlZmluZSBBRERSX09VVF9PRl9SQU5HRSAweDIxCisjZGVmaW5lIElOVkFMSURfRklFTERfSU5fQ0RCIDB4MjQKKyNkZWZpbmUgUE9XRVJPTl9SRVNFVCAweDI5CisjZGVmaW5lIFNBVklOR19QQVJBTVNfVU5TVVAgMHgzOQorI2RlZmluZSBUSFJFU0hIT0xEX0VYQ0VFREVEIDB4NWQKKworI2RlZmluZSBTREVCVUdfVEFHR0VEX1FVRVVJTkcgMCAvKiAwIHwgTVNHX1NJTVBMRV9UQUcgfCBNU0dfT1JERVJFRF9UQUcgKi8KKworLyogRGVmYXVsdCB2YWx1ZXMgZm9yIGRyaXZlciBwYXJhbWV0ZXJzICovCisjZGVmaW5lIERFRl9OVU1fSE9TVCAgIDEKKyNkZWZpbmUgREVGX05VTV9UR1RTICAgMQorI2RlZmluZSBERUZfTUFYX0xVTlMgICAxCisvKiBXaXRoIHRoZXNlIGRlZmF1bHRzLCB0aGlzIGRyaXZlciB3aWxsIG1ha2UgMSBob3N0IHdpdGggMSB0YXJnZXQKKyAqIChpZCAwKSBjb250YWluaW5nIDEgbG9naWNhbCB1bml0IChsdW4gMCkuIFRoYXQgaXMgMSBkZXZpY2UuCisgKi8KKyNkZWZpbmUgREVGX0RFTEFZICAgMQorI2RlZmluZSBERUZfREVWX1NJWkVfTUIgICA4CisjZGVmaW5lIERFRl9FVkVSWV9OVEggICAwCisjZGVmaW5lIERFRl9OVU1fUEFSVFMgICAwCisjZGVmaW5lIERFRl9PUFRTICAgMAorI2RlZmluZSBERUZfU0NTSV9MRVZFTCAgIDUgICAgLyogSU5RVUlSWSwgYnl0ZTIgWzUtPlNQQy0zXSAqLworI2RlZmluZSBERUZfUFRZUEUgICAwCisjZGVmaW5lIERFRl9EX1NFTlNFICAgMAorCisvKiBiaXQgbWFzayB2YWx1ZXMgZm9yIHNjc2lfZGVidWdfb3B0cyAqLworI2RlZmluZSBTQ1NJX0RFQlVHX09QVF9OT0lTRSAgIDEKKyNkZWZpbmUgU0NTSV9ERUJVR19PUFRfTUVESVVNX0VSUiAgIDIKKyNkZWZpbmUgU0NTSV9ERUJVR19PUFRfVElNRU9VVCAgIDQKKyNkZWZpbmUgU0NTSV9ERUJVR19PUFRfUkVDT1ZFUkVEX0VSUiAgIDgKKy8qIFdoZW4gImV2ZXJ5X250aCIgPiAwIHRoZW4gbW9kdWxvICJldmVyeV9udGgiIGNvbW1hbmRzOgorICogICAtIGEgbm8gcmVzcG9uc2UgaXMgc2ltdWxhdGVkIGlmIFNDU0lfREVCVUdfT1BUX1RJTUVPVVQgaXMgc2V0CisgKiAgIC0gYSBSRUNPVkVSRURfRVJST1IgaXMgc2ltdWxhdGVkIG9uIHN1Y2Nlc3NmdWwgcmVhZCBhbmQgd3JpdGUKKyAqICAgICBjb21tYW5kcyBpZiBTQ1NJX0RFQlVHX09QVF9SRUNPVkVSRURfRVJSIGlzIHNldC4KKyAqCisgKiBXaGVuICJldmVyeV9udGgiIDwgMCB0aGVuIGFmdGVyICItIGV2ZXJ5X250aCIgY29tbWFuZHM6CisgKiAgIC0gYSBubyByZXNwb25zZSBpcyBzaW11bGF0ZWQgaWYgU0NTSV9ERUJVR19PUFRfVElNRU9VVCBpcyBzZXQKKyAqICAgLSBhIFJFQ09WRVJFRF9FUlJPUiBpcyBzaW11bGF0ZWQgb24gc3VjY2Vzc2Z1bCByZWFkIGFuZCB3cml0ZQorICogICAgIGNvbW1hbmRzIGlmIFNDU0lfREVCVUdfT1BUX1JFQ09WRVJFRF9FUlIgaXMgc2V0LgorICogVGhpcyB3aWxsIGNvbnRpbnVlIHVudGlsIHNvbWUgb3RoZXIgYWN0aW9uIG9jY3VycyAoZS5nLiB0aGUgdXNlcgorICogd3JpdGluZyBhIG5ldyB2YWx1ZSAob3RoZXIgdGhhbiAtMSBvciAxKSB0byBldmVyeV9udGggdmlhIHN5c2ZzKS4KKyAqLworCisvKiB3aGVuIDE9PVNDU0lfREVCVUdfT1BUX01FRElVTV9FUlIsIGEgbWVkaXVtIGVycm9yIGlzIHNpbXVsYXRlZCBhdCB0aGlzCisgKiBzZWN0b3Igb24gcmVhZCBjb21tYW5kczogKi8KKyNkZWZpbmUgT1BUX01FRElVTV9FUlJfQUREUiAgIDB4MTIzNCAvKiB0aGF0J3Mgc2VjdG9yIDQ2NjAgaW4gZGVjaW1hbCAqLworCisvKiBJZiBSRVBPUlQgTFVOUyBoYXMgbHVucyA+PSAyNTYgaXQgY2FuIGNob29zZSAiZmxhdCBzcGFjZSIgKHZhbHVlIDEpCisgKiBvciAicGVyaXBoZXJhbCBkZXZpY2UiIGFkZHJlc3NpbmcgKHZhbHVlIDApICovCisjZGVmaW5lIFNBTTJfTFVOX0FERFJFU1NfTUVUSE9EIDAKKworc3RhdGljIGludCBzY3NpX2RlYnVnX2FkZF9ob3N0ID0gREVGX05VTV9IT1NUOworc3RhdGljIGludCBzY3NpX2RlYnVnX2RlbGF5ID0gREVGX0RFTEFZOworc3RhdGljIGludCBzY3NpX2RlYnVnX2Rldl9zaXplX21iID0gREVGX0RFVl9TSVpFX01COworc3RhdGljIGludCBzY3NpX2RlYnVnX2V2ZXJ5X250aCA9IERFRl9FVkVSWV9OVEg7CitzdGF0aWMgaW50IHNjc2lfZGVidWdfbWF4X2x1bnMgPSBERUZfTUFYX0xVTlM7CitzdGF0aWMgaW50IHNjc2lfZGVidWdfbnVtX3BhcnRzID0gREVGX05VTV9QQVJUUzsKK3N0YXRpYyBpbnQgc2NzaV9kZWJ1Z19udW1fdGd0cyA9IERFRl9OVU1fVEdUUzsgLyogdGFyZ2V0cyBwZXIgaG9zdCAqLworc3RhdGljIGludCBzY3NpX2RlYnVnX29wdHMgPSBERUZfT1BUUzsKK3N0YXRpYyBpbnQgc2NzaV9kZWJ1Z19zY3NpX2xldmVsID0gREVGX1NDU0lfTEVWRUw7CitzdGF0aWMgaW50IHNjc2lfZGVidWdfcHR5cGUgPSBERUZfUFRZUEU7IC8qIFNDU0kgcGVyaXBoZXJhbCB0eXBlICgwPT1kaXNrKSAqLworc3RhdGljIGludCBzY3NpX2RlYnVnX2RzZW5zZSA9IERFRl9EX1NFTlNFOworCitzdGF0aWMgaW50IHNjc2lfZGVidWdfY21uZF9jb3VudCA9IDA7CisKKyNkZWZpbmUgREVWX1JFQURPTkxZKFRHVCkgICAgICAoMCkKKyNkZWZpbmUgREVWX1JFTU9WRUFCTEUoVEdUKSAgICAoMCkKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2RlYnVnX3N0b3JlX3NpemU7CS8qIGluIGJ5dGVzICovCitzdGF0aWMgc2VjdG9yX3Qgc2RlYnVnX2NhcGFjaXR5OwkvKiBpbiBzZWN0b3JzICovCisKKy8qIG9sZCBCSU9TIHN0dWZmLCBrZXJuZWwgbWF5IGdldCByaWQgb2YgdGhlbSBidXQgc29tZSBtb2RlIHNlbnNlIHBhZ2VzCisgICBtYXkgc3RpbGwgbmVlZCB0aGVtICovCitzdGF0aWMgaW50IHNkZWJ1Z19oZWFkczsJCS8qIGhlYWRzIHBlciBkaXNrICovCitzdGF0aWMgaW50IHNkZWJ1Z19jeWxpbmRlcnNfcGVyOwkvKiBjeWxpbmRlcnMgcGVyIHN1cmZhY2UgKi8KK3N0YXRpYyBpbnQgc2RlYnVnX3NlY3RvcnNfcGVyOwkJLyogc2VjdG9ycyBwZXIgY3lsaW5kZXIgKi8KKworLyogZGVmYXVsdCBzZWN0b3Igc2l6ZSBpcyA1MTIgYnl0ZXMsIDIqKjkgYnl0ZXMgKi8KKyNkZWZpbmUgUE9XMl9TRUNUX1NJWkUgOQorI2RlZmluZSBTRUNUX1NJWkUgKDEgPDwgUE9XMl9TRUNUX1NJWkUpCisjZGVmaW5lIFNFQ1RfU0laRV9QRVIoVEdUKSBTRUNUX1NJWkUKKworI2RlZmluZSBTREVCVUdfTUFYX1BBUlRTIDQKKworI2RlZmluZSBTREVCVUdfU0VOU0VfTEVOIDMyCisKK3N0cnVjdCBzZGVidWdfZGV2X2luZm8geworCXN0cnVjdCBsaXN0X2hlYWQgZGV2X2xpc3Q7CisJdW5zaWduZWQgY2hhciBzZW5zZV9idWZmW1NERUJVR19TRU5TRV9MRU5dOwkvKiB3ZWFrIG5leHVzICovCisJdW5zaWduZWQgaW50IGNoYW5uZWw7CisJdW5zaWduZWQgaW50IHRhcmdldDsKKwl1bnNpZ25lZCBpbnQgbHVuOworCXN0cnVjdCBzZGVidWdfaG9zdF9pbmZvICpzZGJnX2hvc3Q7CisJY2hhciByZXNldDsKKwljaGFyIHVzZWQ7Cit9OworCitzdHJ1Y3Qgc2RlYnVnX2hvc3RfaW5mbyB7CisJc3RydWN0IGxpc3RfaGVhZCBob3N0X2xpc3Q7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IGRldmljZSBkZXY7CisJc3RydWN0IGxpc3RfaGVhZCBkZXZfaW5mb19saXN0OworfTsKKworI2RlZmluZSB0b19zZGVidWdfaG9zdChkKQlcCisJY29udGFpbmVyX29mKGQsIHN0cnVjdCBzZGVidWdfaG9zdF9pbmZvLCBkZXYpCisKK3N0YXRpYyBMSVNUX0hFQUQoc2RlYnVnX2hvc3RfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNkZWJ1Z19ob3N0X2xpc3RfbG9jayk7CisKK3R5cGVkZWYgdm9pZCAoKiBkb25lX2Z1bmN0X3QpIChzdHJ1Y3Qgc2NzaV9jbW5kICopOworCitzdHJ1Y3Qgc2RlYnVnX3F1ZXVlZF9jbWQgeworCWludCBpbl91c2U7CisJc3RydWN0IHRpbWVyX2xpc3QgY21uZF90aW1lcjsKKwlkb25lX2Z1bmN0X3QgZG9uZV9mdW5jdDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICogYV9jbW5kOworCWludCBzY3NpX3Jlc3VsdDsKK307CitzdGF0aWMgc3RydWN0IHNkZWJ1Z19xdWV1ZWRfY21kIHF1ZXVlZF9hcnJbU0NTSV9ERUJVR19DQU5RVUVVRV07CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgc2RlYnVnX2RyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19pbmZvID0JCXNjc2lfZGVidWdfcHJvY19pbmZvLAorCS5uYW1lID0JCQkiU0NTSSBERUJVRyIsCisJLmluZm8gPQkJCXNjc2lfZGVidWdfaW5mbywKKwkuc2xhdmVfYWxsb2MgPQkJc2NzaV9kZWJ1Z19zbGF2ZV9hbGxvYywKKwkuc2xhdmVfY29uZmlndXJlID0Jc2NzaV9kZWJ1Z19zbGF2ZV9jb25maWd1cmUsCisJLnNsYXZlX2Rlc3Ryb3kgPQlzY3NpX2RlYnVnX3NsYXZlX2Rlc3Ryb3ksCisJLmlvY3RsID0JCXNjc2lfZGVidWdfaW9jdGwsCisJLnF1ZXVlY29tbWFuZCA9CQlzY3NpX2RlYnVnX3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlciA9CXNjc2lfZGVidWdfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyID0gc2NzaV9kZWJ1Z19idXNfcmVzZXQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gc2NzaV9kZWJ1Z19kZXZpY2VfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlciA9IHNjc2lfZGVidWdfaG9zdF9yZXNldCwKKwkuYmlvc19wYXJhbSA9CQlzY3NpX2RlYnVnX2Jpb3NwYXJhbSwKKwkuY2FuX3F1ZXVlID0JCVNDU0lfREVCVUdfQ0FOUVVFVUUsCisJLnRoaXNfaWQgPQkJNywKKwkuc2dfdGFibGVzaXplID0JCTY0LAorCS5jbWRfcGVyX2x1biA9CQkzLAorCS5tYXhfc2VjdG9ycyA9CQk0MDk2LAorCS51bmNoZWNrZWRfaXNhX2RtYSA9IAkwLAorCS51c2VfY2x1c3RlcmluZyA9IAlESVNBQkxFX0NMVVNURVJJTkcsCisJLm1vZHVsZSA9CQlUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICogZmFrZV9zdG9yZXA7CS8qIHJhbWRpc2sgc3RvcmFnZSAqLworCitzdGF0aWMgaW50IG51bV9hYm9ydHMgPSAwOworc3RhdGljIGludCBudW1fZGV2X3Jlc2V0cyA9IDA7CitzdGF0aWMgaW50IG51bV9idXNfcmVzZXRzID0gMDsKK3N0YXRpYyBpbnQgbnVtX2hvc3RfcmVzZXRzID0gMDsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhxdWV1ZWRfYXJyX2xvY2spOworc3RhdGljIERFRklORV9SV0xPQ0soYXRvbWljX3J3KTsKKworc3RhdGljIGNoYXIgc2RlYnVnX3Byb2NfbmFtZVtdID0gInNjc2lfZGVidWciOworCitzdGF0aWMgaW50IHNkZWJ1Z19kcml2ZXJfcHJvYmUoc3RydWN0IGRldmljZSAqKTsKK3N0YXRpYyBpbnQgc2RlYnVnX2RyaXZlcl9yZW1vdmUoc3RydWN0IGRldmljZSAqKTsKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgcHNldWRvX2xsZF9idXM7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBzZGVidWdfZHJpdmVyZnNfZHJpdmVyID0geworCS5uYW1lIAkJPSBzZGVidWdfcHJvY19uYW1lLAorCS5idXMJCT0gJnBzZXVkb19sbGRfYnVzLAorCS5wcm9iZSAgICAgICAgICA9IHNkZWJ1Z19kcml2ZXJfcHJvYmUsCisJLnJlbW92ZSAgICAgICAgID0gc2RlYnVnX2RyaXZlcl9yZW1vdmUsCit9OworCitzdGF0aWMgY29uc3QgaW50IGNoZWNrX2NvbmRpdGlvbl9yZXN1bHQgPQorCQkoRFJJVkVSX1NFTlNFIDw8IDI0KSB8IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKworLyogZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCitzdGF0aWMgaW50IHJlc3BfaW5xdWlyeShzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQsIGludCB0YXJnZXQsCisJCQlzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXApOworc3RhdGljIGludCByZXNwX3JlcXVlc3RzKHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCwKKwkJCSBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXApOworc3RhdGljIGludCByZXNwX3JlYWRjYXAoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50LAorCQkJc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwKTsKK3N0YXRpYyBpbnQgcmVzcF9tb2RlX3NlbnNlKHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCwgaW50IHRhcmdldCwKKwkJCSAgIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCk7CitzdGF0aWMgaW50IHJlc3BfcmVhZChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQsIGludCB1cHBlcl9ibGssIGludCBibG9jaywKKwkJICAgICBpbnQgbnVtLCBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXApOworc3RhdGljIGludCByZXNwX3dyaXRlKHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCwgaW50IHVwcGVyX2JsaywgaW50IGJsb2NrLAorCQkgICAgICBpbnQgbnVtLCBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXApOworc3RhdGljIGludCByZXNwX3JlcG9ydF9sdW5zKHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCwKKwkJCSAgICBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXApOworc3RhdGljIGludCBmaWxsX2Zyb21fZGV2X2J1ZmZlcihzdHJ1Y3Qgc2NzaV9jbW5kICogc2NwLCB1bnNpZ25lZCBjaGFyICogYXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJyX2xlbik7CitzdGF0aWMgaW50IGZldGNoX3RvX2Rldl9idWZmZXIoc3RydWN0IHNjc2lfY21uZCAqIHNjcCwgdW5zaWduZWQgY2hhciAqIGFyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2Fycl9sZW4pOworc3RhdGljIHZvaWQgdGltZXJfaW50cl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZJbmZvUmVnKHN0cnVjdCBzY3NpX2RldmljZSAqIHNkZXYpOworc3RhdGljIHZvaWQgbWtfc2Vuc2VfYnVmZmVyKHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCwgaW50IGtleSwKKwkJCSAgICBpbnQgYXNjLCBpbnQgYXNxKTsKK3N0YXRpYyBpbnQgY2hlY2tfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50LAorCQkgICAgICAgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwKTsKK3N0YXRpYyBpbnQgc2NoZWR1bGVfcmVzcChzdHJ1Y3Qgc2NzaV9jbW5kICogY21uZCwKKwkJCSBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXAsCisJCQkgZG9uZV9mdW5jdF90IGRvbmUsIGludCBzY3NpX3Jlc3VsdCwgaW50IGRlbHRhX2ppZmYpOworc3RhdGljIHZvaWQgX19pbml0IHNkZWJ1Z19idWlsZF9wYXJ0cyh1bnNpZ25lZCBjaGFyICogcmFtcCk7CitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9hbGxfcXVldWVkKHZvaWQpOworc3RhdGljIHZvaWQgc3RvcF9hbGxfcXVldWVkKHZvaWQpOworc3RhdGljIGludCBzdG9wX3F1ZXVlZF9jbW5kKHN0cnVjdCBzY3NpX2NtbmQgKiBjbW5kKTsKK3N0YXRpYyBpbnQgaW5xdWlyeV9ldnBkXzgzKHVuc2lnbmVkIGNoYXIgKiBhcnIsIGludCBkZXZfaWRfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGRldl9pZF9zdHIsIGludCBkZXZfaWRfc3RyX2xlbik7CitzdGF0aWMgdm9pZCBkb19jcmVhdGVfZHJpdmVyZnNfZmlsZXModm9pZCk7CitzdGF0aWMgdm9pZCBkb19yZW1vdmVfZHJpdmVyZnNfZmlsZXModm9pZCk7CisKK3N0YXRpYyBpbnQgc2RlYnVnX2FkZF9hZGFwdGVyKHZvaWQpOworc3RhdGljIHZvaWQgc2RlYnVnX3JlbW92ZV9hZGFwdGVyKHZvaWQpOworc3RhdGljIHZvaWQgc2RlYnVnX21heF90Z3RzX2x1bnModm9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlIHBzZXVkb19wcmltYXJ5Oworc3RhdGljIHN0cnVjdCBidXNfdHlwZSBwc2V1ZG9fbGxkX2J1czsKKworCitzdGF0aWMKK2ludCBzY3NpX2RlYnVnX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQsIGRvbmVfZnVuY3RfdCBkb25lKQoreworCXVuc2lnbmVkIGNoYXIgKmNtZCA9ICh1bnNpZ25lZCBjaGFyICopIFNDcG50LT5jbW5kOworCWludCBibG9jaywgdXBwZXJfYmxrLCBudW0sIGs7CisJaW50IGVycnN0cyA9IDA7CisJaW50IHRhcmdldCA9IFNDcG50LT5kZXZpY2UtPmlkOworCXN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCA9IE5VTEw7CisJaW50IGlual9yZWNvdmVyZWQgPSAwOworCisJaWYgKGRvbmUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CS8qIGFzc3VtZSBtaWQgbGV2ZWwgcmVwcm9jZXNzaW5nIGNvbW1hbmQgKi8KKworCWlmICgoU0NTSV9ERUJVR19PUFRfTk9JU0UgJiBzY3NpX2RlYnVnX29wdHMpICYmIGNtZCkgeworCQlwcmludGsoS0VSTl9JTkZPICJzY3NpX2RlYnVnOiBjbWQgIik7CisJCWZvciAoayA9IDAsIG51bSA9IFNDcG50LT5jbWRfbGVuOyBrIDwgbnVtOyArK2spCisJCQlwcmludGsoIiUwMnggIiwgKGludCljbWRba10pOworCQlwcmludGsoIlxuIik7CisJfQorICAgICAgICBpZih0YXJnZXQgPT0gc2RlYnVnX2RyaXZlcl90ZW1wbGF0ZS50aGlzX2lkKSB7CisJCXByaW50ayhLRVJOX0lORk8gInNjc2lfZGVidWc6IGluaXRpYXRvcidzIGlkIHVzZWQgYXMgIgorCQkgICAgICAgInRhcmdldCFcbiIpOworCQlyZXR1cm4gc2NoZWR1bGVfcmVzcChTQ3BudCwgTlVMTCwgZG9uZSwKKwkJCQkgICAgIERJRF9OT19DT05ORUNUIDw8IDE2LCAwKTsKKyAgICAgICAgfQorCisJaWYgKFNDcG50LT5kZXZpY2UtPmx1biA+PSBzY3NpX2RlYnVnX21heF9sdW5zKQorCQlyZXR1cm4gc2NoZWR1bGVfcmVzcChTQ3BudCwgTlVMTCwgZG9uZSwKKwkJCQkgICAgIERJRF9OT19DT05ORUNUIDw8IDE2LCAwKTsKKwlkZXZpcCA9IGRldkluZm9SZWcoU0NwbnQtPmRldmljZSk7CisJaWYgKE5VTEwgPT0gZGV2aXApCisJCXJldHVybiBzY2hlZHVsZV9yZXNwKFNDcG50LCBOVUxMLCBkb25lLAorCQkJCSAgICAgRElEX05PX0NPTk5FQ1QgPDwgMTYsIDApOworCisgICAgICAgIGlmICgoc2NzaV9kZWJ1Z19ldmVyeV9udGggIT0gMCkgJiYKKyAgICAgICAgICAgICgrK3Njc2lfZGVidWdfY21uZF9jb3VudCA+PSBhYnMoc2NzaV9kZWJ1Z19ldmVyeV9udGgpKSkgeworICAgICAgICAgICAgICAgIHNjc2lfZGVidWdfY21uZF9jb3VudCA9IDA7CisJCWlmIChzY3NpX2RlYnVnX2V2ZXJ5X250aCA8IC0xKQorCQkJc2NzaV9kZWJ1Z19ldmVyeV9udGggPSAtMTsKKwkJaWYgKFNDU0lfREVCVUdfT1BUX1RJTUVPVVQgJiBzY3NpX2RlYnVnX29wdHMpCisJCQlyZXR1cm4gMDsgLyogaWdub3JlIGNvbW1hbmQgY2F1c2luZyB0aW1lb3V0ICovCisJCWVsc2UgaWYgKFNDU0lfREVCVUdfT1BUX1JFQ09WRVJFRF9FUlIgJiBzY3NpX2RlYnVnX29wdHMpCisJCQlpbmpfcmVjb3ZlcmVkID0gMTsgLyogdG8gcmVhZHMgYW5kIHdyaXRlcyBiZWxvdyAqLworICAgICAgICB9CisKKwlzd2l0Y2ggKCpjbWQpIHsKKwljYXNlIElOUVVJUlk6ICAgICAvKiBtYW5kYXRvcnksIGlnbm9yZSB1bml0IGF0dGVudGlvbiAqLworCQllcnJzdHMgPSByZXNwX2lucXVpcnkoU0NwbnQsIHRhcmdldCwgZGV2aXApOworCQlicmVhazsKKwljYXNlIFJFUVVFU1RfU0VOU0U6CS8qIG1hbmRhdG9yeSwgaWdub3JlIHVuaXQgYXR0ZW50aW9uICovCisJCWVycnN0cyA9IHJlc3BfcmVxdWVzdHMoU0NwbnQsIGRldmlwKTsKKwkJYnJlYWs7CisJY2FzZSBSRVpFUk9fVU5JVDoJLyogYWN0dWFsbHkgdGhpcyBpcyBSRVdJTkQgZm9yIFNTQyAqLworCWNhc2UgU1RBUlRfU1RPUDoKKwkJZXJyc3RzID0gY2hlY2tfcmVzZXQoU0NwbnQsIGRldmlwKTsKKwkJYnJlYWs7CisJY2FzZSBBTExPV19NRURJVU1fUkVNT1ZBTDoKKwkJaWYgKChlcnJzdHMgPSBjaGVja19yZXNldChTQ3BudCwgZGV2aXApKSkKKwkJCWJyZWFrOworCQlpZiAoU0NTSV9ERUJVR19PUFRfTk9JU0UgJiBzY3NpX2RlYnVnX29wdHMpCisJCQlwcmludGsoS0VSTl9JTkZPICJzY3NpX2RlYnVnOiBNZWRpdW0gcmVtb3ZhbCAlc1xuIiwKKwkJCSAgICAgICAgY21kWzRdID8gImluaGliaXRlZCIgOiAiZW5hYmxlZCIpOworCQlicmVhazsKKwljYXNlIFNFTkRfRElBR05PU1RJQzogICAgIC8qIG1hbmRhdG9yeSAqLworCQllcnJzdHMgPSBjaGVja19yZXNldChTQ3BudCwgZGV2aXApOworCQlicmVhazsKKwljYXNlIFRFU1RfVU5JVF9SRUFEWTogICAgIC8qIG1hbmRhdG9yeSAqLworCQllcnJzdHMgPSBjaGVja19yZXNldChTQ3BudCwgZGV2aXApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBSRVNFUlZFOgorCQllcnJzdHMgPSBjaGVja19yZXNldChTQ3BudCwgZGV2aXApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFU0VSVkVfMTA6CisJCWVycnN0cyA9IGNoZWNrX3Jlc2V0KFNDcG50LCBkZXZpcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVMRUFTRToKKwkJZXJyc3RzID0gY2hlY2tfcmVzZXQoU0NwbnQsIGRldmlwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRUxFQVNFXzEwOgorCQllcnJzdHMgPSBjaGVja19yZXNldChTQ3BudCwgZGV2aXApOworICAgICAgICAgICAgICAgIGJyZWFrOworCWNhc2UgUkVBRF9DQVBBQ0lUWToKKwkJZXJyc3RzID0gcmVzcF9yZWFkY2FwKFNDcG50LCBkZXZpcCk7CisJCWJyZWFrOworCWNhc2UgUkVBRF8xNjoKKwljYXNlIFJFQURfMTI6CisJY2FzZSBSRUFEXzEwOgorCWNhc2UgUkVBRF82OgorCQlpZiAoKGVycnN0cyA9IGNoZWNrX3Jlc2V0KFNDcG50LCBkZXZpcCkpKQorCQkJYnJlYWs7CisJCXVwcGVyX2JsayA9IDA7CisJCWlmICgoKmNtZCkgPT0gUkVBRF8xNikgeworCQkJdXBwZXJfYmxrID0gY21kWzVdICsgKGNtZFs0XSA8PCA4KSArCisJCQkJICAgIChjbWRbM10gPDwgMTYpICsgKGNtZFsyXSA8PCAyNCk7CisJCQlibG9jayA9IGNtZFs5XSArIChjbWRbOF0gPDwgOCkgKworCQkJCShjbWRbN10gPDwgMTYpICsgKGNtZFs2XSA8PCAyNCk7CisJCQludW0gPSBjbWRbMTNdICsgKGNtZFsxMl0gPDwgOCkgKworCQkJCShjbWRbMTFdIDw8IDE2KSArIChjbWRbMTBdIDw8IDI0KTsKKwkJfSBlbHNlIGlmICgoKmNtZCkgPT0gUkVBRF8xMikgeworCQkJYmxvY2sgPSBjbWRbNV0gKyAoY21kWzRdIDw8IDgpICsKKwkJCQkoY21kWzNdIDw8IDE2KSArIChjbWRbMl0gPDwgMjQpOworCQkJbnVtID0gY21kWzldICsgKGNtZFs4XSA8PCA4KSArCisJCQkJKGNtZFs3XSA8PCAxNikgKyAoY21kWzZdIDw8IDI0KTsKKwkJfSBlbHNlIGlmICgoKmNtZCkgPT0gUkVBRF8xMCkgeworCQkJYmxvY2sgPSBjbWRbNV0gKyAoY21kWzRdIDw8IDgpICsKKwkJCQkoY21kWzNdIDw8IDE2KSArIChjbWRbMl0gPDwgMjQpOworCQkJbnVtID0gY21kWzhdICsgKGNtZFs3XSA8PCA4KTsKKwkJfSBlbHNlIHsKKwkJCWJsb2NrID0gY21kWzNdICsgKGNtZFsyXSA8PCA4KSArCisJCQkJKChjbWRbMV0gJiAweDFmKSA8PCAxNik7CisJCQludW0gPSBjbWRbNF07CisJCX0KKwkJZXJyc3RzID0gcmVzcF9yZWFkKFNDcG50LCB1cHBlcl9ibGssIGJsb2NrLCBudW0sIGRldmlwKTsKKwkJaWYgKGlual9yZWNvdmVyZWQgJiYgKDAgPT0gZXJyc3RzKSkgeworCQkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBSRUNPVkVSRURfRVJST1IsCisJCQkJCVRIUkVTSEhPTERfRVhDRUVERUQsIDApOworCQkJZXJyc3RzID0gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKKwkJfQorCQlicmVhazsKKwljYXNlIFJFUE9SVF9MVU5TOgkvKiBtYW5kYXRvcnksIGlnbm9yZSB1bml0IGF0dGVudGlvbiAqLworCQllcnJzdHMgPSByZXNwX3JlcG9ydF9sdW5zKFNDcG50LCBkZXZpcCk7CisJCWJyZWFrOworCWNhc2UgVkVSSUZZOgkJLyogMTAgYnl0ZSBTQkMtMiBjb21tYW5kICovCisJCWVycnN0cyA9IGNoZWNrX3Jlc2V0KFNDcG50LCBkZXZpcCk7CisJCWJyZWFrOworCWNhc2UgV1JJVEVfMTY6CisJY2FzZSBXUklURV8xMjoKKwljYXNlIFdSSVRFXzEwOgorCWNhc2UgV1JJVEVfNjoKKwkJaWYgKChlcnJzdHMgPSBjaGVja19yZXNldChTQ3BudCwgZGV2aXApKSkKKwkJCWJyZWFrOworCQl1cHBlcl9ibGsgPSAwOworCQlpZiAoKCpjbWQpID09IFdSSVRFXzE2KSB7CisJCQl1cHBlcl9ibGsgPSBjbWRbNV0gKyAoY21kWzRdIDw8IDgpICsKKwkJCQkgICAgKGNtZFszXSA8PCAxNikgKyAoY21kWzJdIDw8IDI0KTsKKwkJCWJsb2NrID0gY21kWzldICsgKGNtZFs4XSA8PCA4KSArCisJCQkJKGNtZFs3XSA8PCAxNikgKyAoY21kWzZdIDw8IDI0KTsKKwkJCW51bSA9IGNtZFsxM10gKyAoY21kWzEyXSA8PCA4KSArCisJCQkJKGNtZFsxMV0gPDwgMTYpICsgKGNtZFsxMF0gPDwgMjQpOworCQl9IGVsc2UgaWYgKCgqY21kKSA9PSBXUklURV8xMikgeworCQkJYmxvY2sgPSBjbWRbNV0gKyAoY21kWzRdIDw8IDgpICsKKwkJCQkoY21kWzNdIDw8IDE2KSArIChjbWRbMl0gPDwgMjQpOworCQkJbnVtID0gY21kWzldICsgKGNtZFs4XSA8PCA4KSArCisJCQkJKGNtZFs3XSA8PCAxNikgKyAoY21kWzZdIDw8IDI0KTsKKwkJfSBlbHNlIGlmICgoKmNtZCkgPT0gV1JJVEVfMTApIHsKKwkJCWJsb2NrID0gY21kWzVdICsgKGNtZFs0XSA8PCA4KSArCisJCQkJKGNtZFszXSA8PCAxNikgKyAoY21kWzJdIDw8IDI0KTsKKwkJCW51bSA9IGNtZFs4XSArIChjbWRbN10gPDwgOCk7CisJCX0gZWxzZSB7CisJCQlibG9jayA9IGNtZFszXSArIChjbWRbMl0gPDwgOCkgKworCQkJCSgoY21kWzFdICYgMHgxZikgPDwgMTYpOworCQkJbnVtID0gY21kWzRdOworCQl9CisJCWVycnN0cyA9IHJlc3Bfd3JpdGUoU0NwbnQsIHVwcGVyX2JsaywgYmxvY2ssIG51bSwgZGV2aXApOworCQlpZiAoaW5qX3JlY292ZXJlZCAmJiAoMCA9PSBlcnJzdHMpKSB7CisJCQlta19zZW5zZV9idWZmZXIoZGV2aXAsIFJFQ09WRVJFRF9FUlJPUiwKKwkJCQkJVEhSRVNISE9MRF9FWENFRURFRCwgMCk7CisJCQllcnJzdHMgPSBjaGVja19jb25kaXRpb25fcmVzdWx0OworCQl9CisJCWJyZWFrOworCWNhc2UgTU9ERV9TRU5TRToKKwljYXNlIE1PREVfU0VOU0VfMTA6CisJCWVycnN0cyA9IHJlc3BfbW9kZV9zZW5zZShTQ3BudCwgdGFyZ2V0LCBkZXZpcCk7CisJCWJyZWFrOworCWNhc2UgU1lOQ0hST05JWkVfQ0FDSEU6CisJCWVycnN0cyA9IGNoZWNrX3Jlc2V0KFNDcG50LCBkZXZpcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChTQ1NJX0RFQlVHX09QVF9OT0lTRSAmIHNjc2lfZGVidWdfb3B0cykKKwkJCXByaW50ayhLRVJOX0lORk8gInNjc2lfZGVidWc6IE9wY29kZTogMHgleCBub3QgIgorCQkJICAgICAgICJzdXBwb3J0ZWRcbiIsICpjbWQpOworCQlpZiAoKGVycnN0cyA9IGNoZWNrX3Jlc2V0KFNDcG50LCBkZXZpcCkpKQorCQkJYnJlYWs7CS8qIFVuaXQgYXR0ZW50aW9uIHRha2VzIHByZWNlZGVuY2UgKi8KKwkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBJTExFR0FMX1JFUVVFU1QsIElOVkFMSURfT1BDT0RFLCAwKTsKKwkJZXJyc3RzID0gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBzY2hlZHVsZV9yZXNwKFNDcG50LCBkZXZpcCwgZG9uZSwgZXJyc3RzLCBzY3NpX2RlYnVnX2RlbGF5KTsKK30KKworc3RhdGljIGludCBzY3NpX2RlYnVnX2lvY3RsKHN0cnVjdCBzY3NpX2RldmljZSAqZGV2LCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCWlmIChTQ1NJX0RFQlVHX09QVF9OT0lTRSAmIHNjc2lfZGVidWdfb3B0cykgeworCQlwcmludGsoS0VSTl9JTkZPICJzY3NpX2RlYnVnOiBpb2N0bDogY21kPTB4JXhcbiIsIGNtZCk7CisJfQorCXJldHVybiAtRUlOVkFMOworCS8qIHJldHVybiAtRU5PVFRZOyAvLyBjb3JyZWN0IHJldHVybiBidXQgdXBzZXRzIGZkaXNrICovCit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50LCBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXApCit7CisJaWYgKGRldmlwLT5yZXNldCkgeworCQlpZiAoU0NTSV9ERUJVR19PUFRfTk9JU0UgJiBzY3NpX2RlYnVnX29wdHMpCisJCQlwcmludGsoS0VSTl9JTkZPICJzY3NpX2RlYnVnOiBSZXBvcnRpbmcgVW5pdCAiCisJCQkgICAgICAgImF0dGVudGlvbjogcG93ZXIgb24gcmVzZXRcbiIpOworCQlkZXZpcC0+cmVzZXQgPSAwOworCQlta19zZW5zZV9idWZmZXIoZGV2aXAsIFVOSVRfQVRURU5USU9OLCBQT1dFUk9OX1JFU0VULCAwKTsKKwkJcmV0dXJuIGNoZWNrX2NvbmRpdGlvbl9yZXN1bHQ7CisJfQorCXJldHVybiAwOworfQorCisvKiBSZXR1cm5zIDAgaWYgb2sgZWxzZSAoRElEX0VSUk9SIDw8IDE2KS4gU2V0cyBzY3AtPnJlc2lkIC4gKi8KK3N0YXRpYyBpbnQgZmlsbF9mcm9tX2Rldl9idWZmZXIoc3RydWN0IHNjc2lfY21uZCAqIHNjcCwgdW5zaWduZWQgY2hhciAqIGFyciwKKwkJCQlpbnQgYXJyX2xlbikKK3sKKwlpbnQgaywgcmVxX2xlbiwgYWN0X2xlbiwgbGVuLCBhY3RpdmU7CisJdm9pZCAqIGthZGRyOworCXZvaWQgKiBrYWRkcl9vZmY7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICogc2dwbnQ7CisKKwlpZiAoMCA9PSBzY3AtPnJlcXVlc3RfYnVmZmxlbikKKwkJcmV0dXJuIDA7CisJaWYgKE5VTEwgPT0gc2NwLT5yZXF1ZXN0X2J1ZmZlcikKKwkJcmV0dXJuIChESURfRVJST1IgPDwgMTYpOworCWlmICghICgoc2NwLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfQklESVJFQ1RJT05BTCkgfHwKKwkgICAgICAoc2NwLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpKSkKKwkJcmV0dXJuIChESURfRVJST1IgPDwgMTYpOworCWlmICgwID09IHNjcC0+dXNlX3NnKSB7CisJCXJlcV9sZW4gPSBzY3AtPnJlcXVlc3RfYnVmZmxlbjsKKwkJYWN0X2xlbiA9IChyZXFfbGVuIDwgYXJyX2xlbikgPyByZXFfbGVuIDogYXJyX2xlbjsKKwkJbWVtY3B5KHNjcC0+cmVxdWVzdF9idWZmZXIsIGFyciwgYWN0X2xlbik7CisJCXNjcC0+cmVzaWQgPSByZXFfbGVuIC0gYWN0X2xlbjsKKwkJcmV0dXJuIDA7CisJfQorCXNncG50ID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNjcC0+cmVxdWVzdF9idWZmZXI7CisJYWN0aXZlID0gMTsKKwlmb3IgKGsgPSAwLCByZXFfbGVuID0gMCwgYWN0X2xlbiA9IDA7IGsgPCBzY3AtPnVzZV9zZzsgKytrLCArK3NncG50KSB7CisJCWlmIChhY3RpdmUpIHsKKwkJCWthZGRyID0gKHVuc2lnbmVkIGNoYXIgKikKKwkJCQlrbWFwX2F0b21pYyhzZ3BudC0+cGFnZSwgS01fVVNFUjApOworCQkJaWYgKE5VTEwgPT0ga2FkZHIpCisJCQkJcmV0dXJuIChESURfRVJST1IgPDwgMTYpOworCQkJa2FkZHJfb2ZmID0gKHVuc2lnbmVkIGNoYXIgKilrYWRkciArIHNncG50LT5vZmZzZXQ7CisJCQlsZW4gPSBzZ3BudC0+bGVuZ3RoOworCQkJaWYgKChyZXFfbGVuICsgbGVuKSA+IGFycl9sZW4pIHsKKwkJCQlhY3RpdmUgPSAwOworCQkJCWxlbiA9IGFycl9sZW4gLSByZXFfbGVuOworCQkJfQorCQkJbWVtY3B5KGthZGRyX29mZiwgYXJyICsgcmVxX2xlbiwgbGVuKTsKKwkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCWFjdF9sZW4gKz0gbGVuOworCQl9CisJCXJlcV9sZW4gKz0gc2dwbnQtPmxlbmd0aDsKKwl9CisJc2NwLT5yZXNpZCA9IHJlcV9sZW4gLSBhY3RfbGVuOworCXJldHVybiAwOworfQorCisvKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyBmZXRjaGVkIGludG8gJ2Fycicgb3IgLTEgaWYgZXJyb3IuICovCitzdGF0aWMgaW50IGZldGNoX3RvX2Rldl9idWZmZXIoc3RydWN0IHNjc2lfY21uZCAqIHNjcCwgdW5zaWduZWQgY2hhciAqIGFyciwKKwkJCSAgICAgICBpbnQgbWF4X2Fycl9sZW4pCit7CisJaW50IGssIHJlcV9sZW4sIGxlbiwgZmluOworCXZvaWQgKiBrYWRkcjsKKwl2b2lkICoga2FkZHJfb2ZmOworCXN0cnVjdCBzY2F0dGVybGlzdCAqIHNncG50OworCisJaWYgKDAgPT0gc2NwLT5yZXF1ZXN0X2J1ZmZsZW4pCisJCXJldHVybiAwOworCWlmIChOVUxMID09IHNjcC0+cmVxdWVzdF9idWZmZXIpCisJCXJldHVybiAtMTsKKwlpZiAoISAoKHNjcC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0JJRElSRUNUSU9OQUwpIHx8CisJICAgICAgKHNjcC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkpKQorCQlyZXR1cm4gLTE7CisJaWYgKDAgPT0gc2NwLT51c2Vfc2cpIHsKKwkJcmVxX2xlbiA9IHNjcC0+cmVxdWVzdF9idWZmbGVuOworCQlsZW4gPSAocmVxX2xlbiA8IG1heF9hcnJfbGVuKSA/IHJlcV9sZW4gOiBtYXhfYXJyX2xlbjsKKwkJbWVtY3B5KGFyciwgc2NwLT5yZXF1ZXN0X2J1ZmZlciwgbGVuKTsKKwkJcmV0dXJuIGxlbjsKKwl9CisJc2dwbnQgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopc2NwLT5yZXF1ZXN0X2J1ZmZlcjsKKwlmb3IgKGsgPSAwLCByZXFfbGVuID0gMCwgZmluID0gMDsgayA8IHNjcC0+dXNlX3NnOyArK2ssICsrc2dwbnQpIHsKKwkJa2FkZHIgPSAodW5zaWduZWQgY2hhciAqKWttYXBfYXRvbWljKHNncG50LT5wYWdlLCBLTV9VU0VSMCk7CisJCWlmIChOVUxMID09IGthZGRyKQorCQkJcmV0dXJuIC0xOworCQlrYWRkcl9vZmYgPSAodW5zaWduZWQgY2hhciAqKWthZGRyICsgc2dwbnQtPm9mZnNldDsKKwkJbGVuID0gc2dwbnQtPmxlbmd0aDsKKwkJaWYgKChyZXFfbGVuICsgbGVuKSA+IG1heF9hcnJfbGVuKSB7CisJCQlsZW4gPSBtYXhfYXJyX2xlbiAtIHJlcV9sZW47CisJCQlmaW4gPSAxOworCQl9CisJCW1lbWNweShhcnIgKyByZXFfbGVuLCBrYWRkcl9vZmYsIGxlbik7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJaWYgKGZpbikKKwkJCXJldHVybiByZXFfbGVuICsgbGVuOworCQlyZXFfbGVuICs9IHNncG50LT5sZW5ndGg7CisJfQorCXJldHVybiByZXFfbGVuOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICogaW5xX3ZlbmRvcl9pZCA9ICJMaW51eCAgICI7CitzdGF0aWMgY29uc3QgY2hhciAqIGlucV9wcm9kdWN0X2lkID0gInNjc2lfZGVidWcgICAgICAiOworc3RhdGljIGNvbnN0IGNoYXIgKiBpbnFfcHJvZHVjdF9yZXYgPSAiMDAwNCI7CisKK3N0YXRpYyBpbnQgaW5xdWlyeV9ldnBkXzgzKHVuc2lnbmVkIGNoYXIgKiBhcnIsIGludCBkZXZfaWRfbnVtLAorCQkJICAgY29uc3QgY2hhciAqIGRldl9pZF9zdHIsIGludCBkZXZfaWRfc3RyX2xlbikKK3sKKwlpbnQgbnVtOworCisJLyogVHdvIGlkZW50aWZpY2F0aW9uIGRlc2NyaXB0b3JzOiAqLworCS8qIFQxMCB2ZW5kb3IgaWRlbnRpZmllciBmaWVsZCBmb3JtYXQgKGZha2VkKSAqLworCWFyclswXSA9IDB4MjsJLyogQVNDSUkgKi8KKwlhcnJbMV0gPSAweDE7CisJYXJyWzJdID0gMHgwOworCW1lbWNweSgmYXJyWzRdLCBpbnFfdmVuZG9yX2lkLCA4KTsKKwltZW1jcHkoJmFyclsxMl0sIGlucV9wcm9kdWN0X2lkLCAxNik7CisJbWVtY3B5KCZhcnJbMjhdLCBkZXZfaWRfc3RyLCBkZXZfaWRfc3RyX2xlbik7CisJbnVtID0gOCArIDE2ICsgZGV2X2lkX3N0cl9sZW47CisJYXJyWzNdID0gbnVtOworCW51bSArPSA0OworCS8qIE5BQSBJRUVFIHJlZ2lzdGVyZWQgaWRlbnRpZmllciAoZmFrZWQpICovCisJYXJyW251bV0gPSAweDE7CS8qIGJpbmFyeSAqLworCWFycltudW0gKyAxXSA9IDB4MzsKKwlhcnJbbnVtICsgMl0gPSAweDA7CisJYXJyW251bSArIDNdID0gMHg4OworCWFycltudW0gKyA0XSA9IDB4NTE7CS8qIGllZWUgY29tcGFueSBpZD0weDEyMzQ1NiAoZmFrZWQpICovCisJYXJyW251bSArIDVdID0gMHgyMzsKKwlhcnJbbnVtICsgNl0gPSAweDQ1OworCWFycltudW0gKyA3XSA9IDB4NjA7CisJYXJyW251bSArIDhdID0gKGRldl9pZF9udW0gPj4gMjQpOworCWFycltudW0gKyA5XSA9IChkZXZfaWRfbnVtID4+IDE2KSAmIDB4ZmY7CisJYXJyW251bSArIDEwXSA9IChkZXZfaWRfbnVtID4+IDgpICYgMHhmZjsKKwlhcnJbbnVtICsgMTFdID0gZGV2X2lkX251bSAmIDB4ZmY7CisJcmV0dXJuIG51bSArIDEyOworfQorCisKKyNkZWZpbmUgU0RFQlVHX0xPTkdfSU5RX1NaIDk2CisjZGVmaW5lIFNERUJVR19NQVhfSU5RX0FSUl9TWiAxMjgKKworc3RhdGljIGludCByZXNwX2lucXVpcnkoc3RydWN0IHNjc2lfY21uZCAqIHNjcCwgaW50IHRhcmdldCwKKwkJCXN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCkKK3sKKwl1bnNpZ25lZCBjaGFyIHBxX3BkdDsKKwl1bnNpZ25lZCBjaGFyIGFycltTREVCVUdfTUFYX0lOUV9BUlJfU1pdOworCXVuc2lnbmVkIGNoYXIgKmNtZCA9ICh1bnNpZ25lZCBjaGFyICopc2NwLT5jbW5kOworCWludCBhbGxvY19sZW47CisKKwlhbGxvY19sZW4gPSAoY21kWzNdIDw8IDgpICsgY21kWzRdOworCW1lbXNldChhcnIsIDAsIFNERUJVR19NQVhfSU5RX0FSUl9TWik7CisJcHFfcGR0ID0gKHNjc2lfZGVidWdfcHR5cGUgJiAweDFmKTsKKwlhcnJbMF0gPSBwcV9wZHQ7CisJaWYgKDB4MiAmIGNtZFsxXSkgeyAgLyogQ01ERFQgYml0IHNldCAqLworCQlta19zZW5zZV9idWZmZXIoZGV2aXAsIElMTEVHQUxfUkVRVUVTVCwgSU5WQUxJRF9GSUVMRF9JTl9DREIsCisJCQkgICAgICAgCTApOworCQlyZXR1cm4gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKKwl9IGVsc2UgaWYgKDB4MSAmIGNtZFsxXSkgeyAgLyogRVZQRCBiaXQgc2V0ICovCisJCWludCBkZXZfaWRfbnVtLCBsZW47CisJCWNoYXIgZGV2X2lkX3N0cls2XTsKKwkJCisJCWRldl9pZF9udW0gPSAoKGRldmlwLT5zZGJnX2hvc3QtPnNob3N0LT5ob3N0X25vICsgMSkgKiAyMDAwKSArCisJCQkgICAgIChkZXZpcC0+dGFyZ2V0ICogMTAwMCkgKyBkZXZpcC0+bHVuOworCQlsZW4gPSBzY25wcmludGYoZGV2X2lkX3N0ciwgNiwgIiVkIiwgZGV2X2lkX251bSk7CisJCWlmICgwID09IGNtZFsyXSkgeyAvKiBzdXBwb3J0ZWQgdml0YWwgcHJvZHVjdCBkYXRhIHBhZ2VzICovCisJCQlhcnJbM10gPSAzOworCQkJYXJyWzRdID0gMHgwOyAvKiB0aGlzIHBhZ2UgKi8KKwkJCWFycls1XSA9IDB4ODA7IC8qIHVuaXQgc2VyaWFsIG51bWJlciAqLworCQkJYXJyWzZdID0gMHg4MzsgLyogZGV2aWNlIGlkZW50aWZpY2F0aW9uICovCisJCX0gZWxzZSBpZiAoMHg4MCA9PSBjbWRbMl0pIHsgLyogdW5pdCBzZXJpYWwgbnVtYmVyICovCisJCQlhcnJbMV0gPSAweDgwOworCQkJYXJyWzNdID0gbGVuOworCQkJbWVtY3B5KCZhcnJbNF0sIGRldl9pZF9zdHIsIGxlbik7CisJCX0gZWxzZSBpZiAoMHg4MyA9PSBjbWRbMl0pIHsgLyogZGV2aWNlIGlkZW50aWZpY2F0aW9uICovCisJCQlhcnJbMV0gPSAweDgzOworCQkJYXJyWzNdID0gaW5xdWlyeV9ldnBkXzgzKCZhcnJbNF0sIGRldl9pZF9udW0sCisJCQkJCQkgZGV2X2lkX3N0ciwgbGVuKTsKKwkJfSBlbHNlIHsKKwkJCS8qIElsbGVnYWwgcmVxdWVzdCwgaW52YWxpZCBmaWVsZCBpbiBjZGIgKi8KKwkJCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgSUxMRUdBTF9SRVFVRVNULAorCQkJCQlJTlZBTElEX0ZJRUxEX0lOX0NEQiwgMCk7CisJCQlyZXR1cm4gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKKwkJfQorCQlyZXR1cm4gZmlsbF9mcm9tX2Rldl9idWZmZXIoc2NwLCBhcnIsCisJCQkgICAgbWluKGFsbG9jX2xlbiwgU0RFQlVHX01BWF9JTlFfQVJSX1NaKSk7CisJfQorCS8qIGRyb3BzIHRocm91Z2ggaGVyZSBmb3IgYSBzdGFuZGFyZCBpbnF1aXJ5ICovCisJYXJyWzFdID0gREVWX1JFTU9WRUFCTEUodGFyZ2V0KSA/IDB4ODAgOiAwOwkvKiBSZW1vdmFibGUgZGlzayAqLworCWFyclsyXSA9IHNjc2lfZGVidWdfc2NzaV9sZXZlbDsKKwlhcnJbM10gPSAyOyAgICAvKiByZXNwb25zZV9kYXRhX2Zvcm1hdD09MiAqLworCWFycls0XSA9IFNERUJVR19MT05HX0lOUV9TWiAtIDU7CisJYXJyWzZdID0gMHgxOyAvKiBjbGFpbTogQUREUjE2ICovCisJLyogYXJyWzZdIHw9IDB4NDA7IC4uLiBjbGFpbTogRW5jU2VydiAoZW5jbG9zdXJlIHNlcnZpY2VzKSAqLworCWFycls3XSA9IDB4M2E7IC8qIGNsYWltOiBXQlVTMTYsIFNZTkMsIExJTktFRCArIENNRFFVRSAqLworCW1lbWNweSgmYXJyWzhdLCBpbnFfdmVuZG9yX2lkLCA4KTsKKwltZW1jcHkoJmFyclsxNl0sIGlucV9wcm9kdWN0X2lkLCAxNik7CisJbWVtY3B5KCZhcnJbMzJdLCBpbnFfcHJvZHVjdF9yZXYsIDQpOworCS8qIHZlcnNpb24gZGVzY3JpcHRvcnMgKDIgYnl0ZXMgZWFjaCkgZm9sbG93ICovCisJYXJyWzU4XSA9IDB4MDsgYXJyWzU5XSA9IDB4NDA7IC8qIFNBTS0yICovCisJYXJyWzYwXSA9IDB4MzsgYXJyWzYxXSA9IDB4MDsgIC8qIFNQQy0zICovCisJaWYgKHNjc2lfZGVidWdfcHR5cGUgPT0gMCkgeworCQlhcnJbNjJdID0gMHgxOyBhcnJbNjNdID0gMHg4MDsgLyogU0JDICovCisJfSBlbHNlIGlmIChzY3NpX2RlYnVnX3B0eXBlID09IDEpIHsKKwkJYXJyWzYyXSA9IDB4MjsgYXJyWzYzXSA9IDB4MDA7IC8qIFNTQyAqLworCX0KKwlyZXR1cm4gZmlsbF9mcm9tX2Rldl9idWZmZXIoc2NwLCBhcnIsCisJCQkgICAgbWluKGFsbG9jX2xlbiwgU0RFQlVHX0xPTkdfSU5RX1NaKSk7Cit9CisKK3N0YXRpYyBpbnQgcmVzcF9yZXF1ZXN0cyhzdHJ1Y3Qgc2NzaV9jbW5kICogc2NwLAorCQkJIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCkKK3sKKwl1bnNpZ25lZCBjaGFyICogc2J1ZmY7CisJdW5zaWduZWQgY2hhciAqY21kID0gKHVuc2lnbmVkIGNoYXIgKilzY3AtPmNtbmQ7CisJdW5zaWduZWQgY2hhciBhcnJbU0RFQlVHX1NFTlNFX0xFTl07CisJaW50IGxlbiA9IDE4OworCisJbWVtc2V0KGFyciwgMCwgU0RFQlVHX1NFTlNFX0xFTik7CisJaWYgKGRldmlwLT5yZXNldCA9PSAxKQorCQlta19zZW5zZV9idWZmZXIoZGV2aXAsIDAsIE5PX0FEREVEX1NFTlNFLCAwKTsKKwlzYnVmZiA9IGRldmlwLT5zZW5zZV9idWZmOworCWlmICgoY21kWzFdICYgMSkgJiYgKCEgc2NzaV9kZWJ1Z19kc2Vuc2UpKSB7CisJCS8qIERFU0MgYml0IHNldCBhbmQgc2Vuc2VfYnVmZiBpbiBmaXhlZCBmb3JtYXQgKi8KKwkJYXJyWzBdID0gMHg3MjsKKwkJYXJyWzFdID0gc2J1ZmZbMl07ICAgICAvKiBzZW5zZSBrZXkgKi8KKwkJYXJyWzJdID0gc2J1ZmZbMTJdOyAgICAvKiBhc2MgKi8KKwkJYXJyWzNdID0gc2J1ZmZbMTNdOyAgICAvKiBhc2NxICovCisJCWxlbiA9IDg7CisJfSBlbHNlCisJCW1lbWNweShhcnIsIHNidWZmLCBTREVCVUdfU0VOU0VfTEVOKTsKKwlta19zZW5zZV9idWZmZXIoZGV2aXAsIDAsIE5PX0FEREVEX1NFTlNFLCAwKTsKKwlyZXR1cm4gZmlsbF9mcm9tX2Rldl9idWZmZXIoc2NwLCBhcnIsIGxlbik7Cit9CisKKyNkZWZpbmUgU0RFQlVHX1JFQURDQVBfQVJSX1NaIDgKK3N0YXRpYyBpbnQgcmVzcF9yZWFkY2FwKHN0cnVjdCBzY3NpX2NtbmQgKiBzY3AsCisJCQlzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXApCit7CisJdW5zaWduZWQgY2hhciBhcnJbU0RFQlVHX1JFQURDQVBfQVJSX1NaXTsKKwl1bnNpZ25lZCBsb25nIGNhcGFjOworCWludCBlcnJzdHM7CisKKwlpZiAoKGVycnN0cyA9IGNoZWNrX3Jlc2V0KHNjcCwgZGV2aXApKSkKKwkJcmV0dXJuIGVycnN0czsKKwltZW1zZXQoYXJyLCAwLCBTREVCVUdfUkVBRENBUF9BUlJfU1opOworCWNhcGFjID0gKHVuc2lnbmVkIGxvbmcpc2RlYnVnX2NhcGFjaXR5IC0gMTsKKwlhcnJbMF0gPSAoY2FwYWMgPj4gMjQpOworCWFyclsxXSA9IChjYXBhYyA+PiAxNikgJiAweGZmOworCWFyclsyXSA9IChjYXBhYyA+PiA4KSAmIDB4ZmY7CisJYXJyWzNdID0gY2FwYWMgJiAweGZmOworCWFycls2XSA9IChTRUNUX1NJWkVfUEVSKHRhcmdldCkgPj4gOCkgJiAweGZmOworCWFycls3XSA9IFNFQ1RfU0laRV9QRVIodGFyZ2V0KSAmIDB4ZmY7CisJcmV0dXJuIGZpbGxfZnJvbV9kZXZfYnVmZmVyKHNjcCwgYXJyLCBTREVCVUdfUkVBRENBUF9BUlJfU1opOworfQorCisvKiA8PEZvbGxvd2luZyBtb2RlIHBhZ2UgaW5mbyBjb3BpZWQgZnJvbSBTVDMxODQ1MUxXPj4gKi8KKworc3RhdGljIGludCByZXNwX2Vycl9yZWNvdl9wZyh1bnNpZ25lZCBjaGFyICogcCwgaW50IHBjb250cm9sLCBpbnQgdGFyZ2V0KQorewkvKiBSZWFkLVdyaXRlIEVycm9yIFJlY292ZXJ5IHBhZ2UgZm9yIG1vZGVfc2Vuc2UgKi8KKwl1bnNpZ25lZCBjaGFyIGVycl9yZWNvdl9wZ1tdID0gezB4MSwgMHhhLCAweGMwLCAxMSwgMjQwLCAwLCAwLCAwLAorCQkJCQk1LCAwLCAweGZmLCAweGZmfTsKKworCW1lbWNweShwLCBlcnJfcmVjb3ZfcGcsIHNpemVvZihlcnJfcmVjb3ZfcGcpKTsKKwlpZiAoMSA9PSBwY29udHJvbCkKKwkJbWVtc2V0KHAgKyAyLCAwLCBzaXplb2YoZXJyX3JlY292X3BnKSAtIDIpOworCXJldHVybiBzaXplb2YoZXJyX3JlY292X3BnKTsKK30KKworc3RhdGljIGludCByZXNwX2Rpc2Nvbm5lY3RfcGcodW5zaWduZWQgY2hhciAqIHAsIGludCBwY29udHJvbCwgaW50IHRhcmdldCkKK3sgCS8qIERpc2Nvbm5lY3QtUmVjb25uZWN0IHBhZ2UgZm9yIG1vZGVfc2Vuc2UgKi8KKwl1bnNpZ25lZCBjaGFyIGRpc2Nvbm5lY3RfcGdbXSA9IHsweDIsIDB4ZSwgMTI4LCAxMjgsIDAsIDEwLCAwLCAwLAorCQkJCQkgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07CisKKwltZW1jcHkocCwgZGlzY29ubmVjdF9wZywgc2l6ZW9mKGRpc2Nvbm5lY3RfcGcpKTsKKwlpZiAoMSA9PSBwY29udHJvbCkKKwkJbWVtc2V0KHAgKyAyLCAwLCBzaXplb2YoZGlzY29ubmVjdF9wZykgLSAyKTsKKwlyZXR1cm4gc2l6ZW9mKGRpc2Nvbm5lY3RfcGcpOworfQorCitzdGF0aWMgaW50IHJlc3BfZm9ybWF0X3BnKHVuc2lnbmVkIGNoYXIgKiBwLCBpbnQgcGNvbnRyb2wsIGludCB0YXJnZXQpCit7ICAgICAgIC8qIEZvcm1hdCBkZXZpY2UgcGFnZSBmb3IgbW9kZV9zZW5zZSAqLworICAgICAgICB1bnNpZ25lZCBjaGFyIGZvcm1hdF9wZ1tdID0gezB4MywgMHgxNiwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDB4NDAsIDAsIDAsIDB9OworCisgICAgICAgIG1lbWNweShwLCBmb3JtYXRfcGcsIHNpemVvZihmb3JtYXRfcGcpKTsKKyAgICAgICAgcFsxMF0gPSAoc2RlYnVnX3NlY3RvcnNfcGVyID4+IDgpICYgMHhmZjsKKyAgICAgICAgcFsxMV0gPSBzZGVidWdfc2VjdG9yc19wZXIgJiAweGZmOworICAgICAgICBwWzEyXSA9IChTRUNUX1NJWkUgPj4gOCkgJiAweGZmOworICAgICAgICBwWzEzXSA9IFNFQ1RfU0laRSAmIDB4ZmY7CisgICAgICAgIGlmIChERVZfUkVNT1ZFQUJMRSh0YXJnZXQpKQorICAgICAgICAgICAgICAgIHBbMjBdIHw9IDB4MjA7IC8qIHNob3VsZCBhZ3JlZSB3aXRoIElOUVVJUlkgKi8KKyAgICAgICAgaWYgKDEgPT0gcGNvbnRyb2wpCisgICAgICAgICAgICAgICAgbWVtc2V0KHAgKyAyLCAwLCBzaXplb2YoZm9ybWF0X3BnKSAtIDIpOworICAgICAgICByZXR1cm4gc2l6ZW9mKGZvcm1hdF9wZyk7Cit9CisKK3N0YXRpYyBpbnQgcmVzcF9jYWNoaW5nX3BnKHVuc2lnbmVkIGNoYXIgKiBwLCBpbnQgcGNvbnRyb2wsIGludCB0YXJnZXQpCit7IAkvKiBDYWNoaW5nIHBhZ2UgZm9yIG1vZGVfc2Vuc2UgKi8KKwl1bnNpZ25lZCBjaGFyIGNhY2hpbmdfcGdbXSA9IHsweDgsIDE4LCAweDE0LCAwLCAweGZmLCAweGZmLCAwLCAwLAorCQkweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDgwLCAweDE0LCAwLCAwLCAgICAgMCwgMCwgMCwgMH07CisKKwltZW1jcHkocCwgY2FjaGluZ19wZywgc2l6ZW9mKGNhY2hpbmdfcGcpKTsKKwlpZiAoMSA9PSBwY29udHJvbCkKKwkJbWVtc2V0KHAgKyAyLCAwLCBzaXplb2YoY2FjaGluZ19wZykgLSAyKTsKKwlyZXR1cm4gc2l6ZW9mKGNhY2hpbmdfcGcpOworfQorCitzdGF0aWMgaW50IHJlc3BfY3RybF9tX3BnKHVuc2lnbmVkIGNoYXIgKiBwLCBpbnQgcGNvbnRyb2wsIGludCB0YXJnZXQpCit7IAkvKiBDb250cm9sIG1vZGUgcGFnZSBmb3IgbW9kZV9zZW5zZSAqLworCXVuc2lnbmVkIGNoYXIgY3RybF9tX3BnW10gPSB7MHhhLCAxMCwgMiwgMCwgMCwgMCwgMCwgMCwKKwkJCQkgICAgIDAsIDAsIDB4MiwgMHg0Yn07CisKKwlpZiAoc2NzaV9kZWJ1Z19kc2Vuc2UpCisJCWN0cmxfbV9wZ1syXSB8PSAweDQ7CisJbWVtY3B5KHAsIGN0cmxfbV9wZywgc2l6ZW9mKGN0cmxfbV9wZykpOworCWlmICgxID09IHBjb250cm9sKQorCQltZW1zZXQocCArIDIsIDAsIHNpemVvZihjdHJsX21fcGcpIC0gMik7CisJcmV0dXJuIHNpemVvZihjdHJsX21fcGcpOworfQorCitzdGF0aWMgaW50IHJlc3BfaWVjX21fcGcodW5zaWduZWQgY2hhciAqIHAsIGludCBwY29udHJvbCwgaW50IHRhcmdldCkKK3sJLyogSW5mb3JtYXRpb25hbCBFeGNlcHRpb25zIGNvbnRyb2wgbW9kZSBwYWdlIGZvciBtb2RlX3NlbnNlICovCisJdW5zaWduZWQgY2hhciBpZWNfbV9wZ1tdID0gezB4MWMsIDB4YSwgMHgwOCwgMCwgMCwgMCwgMCwgMCwKKwkJCQkgICAgMCwgMCwgMHgwLCAweDB9OworCW1lbWNweShwLCBpZWNfbV9wZywgc2l6ZW9mKGllY19tX3BnKSk7CisJaWYgKDEgPT0gcGNvbnRyb2wpCisJCW1lbXNldChwICsgMiwgMCwgc2l6ZW9mKGllY19tX3BnKSAtIDIpOworCXJldHVybiBzaXplb2YoaWVjX21fcGcpOworfQorCisjZGVmaW5lIFNERUJVR19NQVhfTVNFTlNFX1NaIDI1NgorCitzdGF0aWMgaW50IHJlc3BfbW9kZV9zZW5zZShzdHJ1Y3Qgc2NzaV9jbW5kICogc2NwLCBpbnQgdGFyZ2V0LAorCQkJICAgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwKQoreworCXVuc2lnbmVkIGNoYXIgZGJkOworCWludCBwY29udHJvbCwgcGNvZGUsIHN1YnBjb2RlOworCXVuc2lnbmVkIGNoYXIgZGV2X3NwZWM7CisJaW50IGFsbG9jX2xlbiwgbXNlbnNlXzYsIG9mZnNldCwgbGVuLCBlcnJzdHM7CisJdW5zaWduZWQgY2hhciAqIGFwOworCXVuc2lnbmVkIGNoYXIgYXJyW1NERUJVR19NQVhfTVNFTlNFX1NaXTsKKwl1bnNpZ25lZCBjaGFyICpjbWQgPSAodW5zaWduZWQgY2hhciAqKXNjcC0+Y21uZDsKKworCWlmICgoZXJyc3RzID0gY2hlY2tfcmVzZXQoc2NwLCBkZXZpcCkpKQorCQlyZXR1cm4gZXJyc3RzOworCWRiZCA9IGNtZFsxXSAmIDB4ODsKKwlwY29udHJvbCA9IChjbWRbMl0gJiAweGMwKSA+PiA2OworCXBjb2RlID0gY21kWzJdICYgMHgzZjsKKwlzdWJwY29kZSA9IGNtZFszXTsKKwltc2Vuc2VfNiA9IChNT0RFX1NFTlNFID09IGNtZFswXSk7CisJYWxsb2NfbGVuID0gbXNlbnNlXzYgPyBjbWRbNF0gOiAoKGNtZFs3XSA8PCA4KSB8IGNtZFs4XSk7CisJbWVtc2V0KGFyciwgMCwgU0RFQlVHX01BWF9NU0VOU0VfU1opOworCWlmICgweDMgPT0gcGNvbnRyb2wpIHsgIC8qIFNhdmluZyB2YWx1ZXMgbm90IHN1cHBvcnRlZCAqLworCQlta19zZW5zZV9idWZmZXIoZGV2aXAsIElMTEVHQUxfUkVRVUVTVCwgU0FWSU5HX1BBUkFNU19VTlNVUCwKKwkJCSAgICAgICAJMCk7CisJCXJldHVybiBjaGVja19jb25kaXRpb25fcmVzdWx0OworCX0KKwlkZXZfc3BlYyA9IERFVl9SRUFET05MWSh0YXJnZXQpID8gMHg4MCA6IDB4MDsKKwlpZiAobXNlbnNlXzYpIHsKKwkJYXJyWzJdID0gZGV2X3NwZWM7CisJCW9mZnNldCA9IDQ7CisJfSBlbHNlIHsKKwkJYXJyWzNdID0gZGV2X3NwZWM7CisJCW9mZnNldCA9IDg7CisJfQorCWFwID0gYXJyICsgb2Zmc2V0OworCisJaWYgKDAgIT0gc3VicGNvZGUpIHsgLyogVE9ETzogQ29udHJvbCBFeHRlbnNpb24gcGFnZSAqLworCQlta19zZW5zZV9idWZmZXIoZGV2aXAsIElMTEVHQUxfUkVRVUVTVCwgSU5WQUxJRF9GSUVMRF9JTl9DREIsCisJCQkgICAgICAgCTApOworCQlyZXR1cm4gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKKwl9CisJc3dpdGNoIChwY29kZSkgeworCWNhc2UgMHgxOgkvKiBSZWFkLVdyaXRlIGVycm9yIHJlY292ZXJ5IHBhZ2UsIGRpcmVjdCBhY2Nlc3MgKi8KKwkJbGVuID0gcmVzcF9lcnJfcmVjb3ZfcGcoYXAsIHBjb250cm9sLCB0YXJnZXQpOworCQlvZmZzZXQgKz0gbGVuOworCQlicmVhazsKKwljYXNlIDB4MjoJLyogRGlzY29ubmVjdC1SZWNvbm5lY3QgcGFnZSwgYWxsIGRldmljZXMgKi8KKwkJbGVuID0gcmVzcF9kaXNjb25uZWN0X3BnKGFwLCBwY29udHJvbCwgdGFyZ2V0KTsKKwkJb2Zmc2V0ICs9IGxlbjsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgMHgzOiAgICAgICAvKiBGb3JtYXQgZGV2aWNlIHBhZ2UsIGRpcmVjdCBhY2Nlc3MgKi8KKyAgICAgICAgICAgICAgICBsZW4gPSByZXNwX2Zvcm1hdF9wZyhhcCwgcGNvbnRyb2wsIHRhcmdldCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKwljYXNlIDB4ODoJLyogQ2FjaGluZyBwYWdlLCBkaXJlY3QgYWNjZXNzICovCisJCWxlbiA9IHJlc3BfY2FjaGluZ19wZyhhcCwgcGNvbnRyb2wsIHRhcmdldCk7CisJCW9mZnNldCArPSBsZW47CisJCWJyZWFrOworCWNhc2UgMHhhOgkvKiBDb250cm9sIE1vZGUgcGFnZSwgYWxsIGRldmljZXMgKi8KKwkJbGVuID0gcmVzcF9jdHJsX21fcGcoYXAsIHBjb250cm9sLCB0YXJnZXQpOworCQlvZmZzZXQgKz0gbGVuOworCQlicmVhazsKKwljYXNlIDB4MWM6CS8qIEluZm9ybWF0aW9uYWwgRXhjZXB0aW9ucyBNb2RlIHBhZ2UsIGFsbCBkZXZpY2VzICovCisJCWxlbiA9IHJlc3BfaWVjX21fcGcoYXAsIHBjb250cm9sLCB0YXJnZXQpOworCQlvZmZzZXQgKz0gbGVuOworCQlicmVhazsKKwljYXNlIDB4M2Y6CS8qIFJlYWQgYWxsIE1vZGUgcGFnZXMgKi8KKwkJbGVuID0gcmVzcF9lcnJfcmVjb3ZfcGcoYXAsIHBjb250cm9sLCB0YXJnZXQpOworCQlsZW4gKz0gcmVzcF9kaXNjb25uZWN0X3BnKGFwICsgbGVuLCBwY29udHJvbCwgdGFyZ2V0KTsKKwkJbGVuICs9IHJlc3BfZm9ybWF0X3BnKGFwICsgbGVuLCBwY29udHJvbCwgdGFyZ2V0KTsKKwkJbGVuICs9IHJlc3BfY2FjaGluZ19wZyhhcCArIGxlbiwgcGNvbnRyb2wsIHRhcmdldCk7CisJCWxlbiArPSByZXNwX2N0cmxfbV9wZyhhcCArIGxlbiwgcGNvbnRyb2wsIHRhcmdldCk7CisJCWxlbiArPSByZXNwX2llY19tX3BnKGFwICsgbGVuLCBwY29udHJvbCwgdGFyZ2V0KTsKKwkJb2Zmc2V0ICs9IGxlbjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBJTExFR0FMX1JFUVVFU1QsIElOVkFMSURfRklFTERfSU5fQ0RCLAorCQkJICAgICAgIAkwKTsKKwkJcmV0dXJuIGNoZWNrX2NvbmRpdGlvbl9yZXN1bHQ7CisJfQorCWlmIChtc2Vuc2VfNikKKwkJYXJyWzBdID0gb2Zmc2V0IC0gMTsKKwllbHNlIHsKKwkJYXJyWzBdID0gKChvZmZzZXQgLSAyKSA+PiA4KSAmIDB4ZmY7CisJCWFyclsxXSA9IChvZmZzZXQgLSAyKSAmIDB4ZmY7CisJfQorCXJldHVybiBmaWxsX2Zyb21fZGV2X2J1ZmZlcihzY3AsIGFyciwgbWluKGFsbG9jX2xlbiwgb2Zmc2V0KSk7Cit9CisKK3N0YXRpYyBpbnQgcmVzcF9yZWFkKHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCwgaW50IHVwcGVyX2JsaywgaW50IGJsb2NrLAorCQkgICAgIGludCBudW0sIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCkKK3sKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKwlpbnQgcmV0OworCisJaWYgKHVwcGVyX2JsayB8fCAoYmxvY2sgKyBudW0gPiBzZGVidWdfY2FwYWNpdHkpKSB7CisJCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgSUxMRUdBTF9SRVFVRVNULCBBRERSX09VVF9PRl9SQU5HRSwKKwkJCQkwKTsKKwkJcmV0dXJuIGNoZWNrX2NvbmRpdGlvbl9yZXN1bHQ7CisJfQorCWlmICgoU0NTSV9ERUJVR19PUFRfTUVESVVNX0VSUiAmIHNjc2lfZGVidWdfb3B0cykgJiYKKwkgICAgKGJsb2NrIDw9IE9QVF9NRURJVU1fRVJSX0FERFIpICYmCisJICAgICgoYmxvY2sgKyBudW0pID4gT1BUX01FRElVTV9FUlJfQUREUikpIHsKKwkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBNRURJVU1fRVJST1IsIFVOUkVDT1ZFUkVEX1JFQURfRVJSLAorCQkJCTApOworCQkvKiBjbGFpbSB1bnJlY292ZXJhYmxlIHJlYWQgZXJyb3IgKi8KKwkJcmV0dXJuIGNoZWNrX2NvbmRpdGlvbl9yZXN1bHQ7CisJfQorCXJlYWRfbG9ja19pcnFzYXZlKCZhdG9taWNfcncsIGlmbGFncyk7CisJcmV0ID0gZmlsbF9mcm9tX2Rldl9idWZmZXIoU0NwbnQsIGZha2Vfc3RvcmVwICsgKGJsb2NrICogU0VDVF9TSVpFKSwKKwkJCSAgIAkgICBudW0gKiBTRUNUX1NJWkUpOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmF0b21pY19ydywgaWZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlc3Bfd3JpdGUoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50LCBpbnQgdXBwZXJfYmxrLCBpbnQgYmxvY2ssCisJCSAgICAgIGludCBudW0sIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCkKK3sKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKwlpbnQgcmVzOworCisJaWYgKHVwcGVyX2JsayB8fCAoYmxvY2sgKyBudW0gPiBzZGVidWdfY2FwYWNpdHkpKSB7CisJCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgSUxMRUdBTF9SRVFVRVNULCBBRERSX09VVF9PRl9SQU5HRSwKKwkJCSAgICAgICAJMCk7CisJCXJldHVybiBjaGVja19jb25kaXRpb25fcmVzdWx0OworCX0KKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmYXRvbWljX3J3LCBpZmxhZ3MpOworCXJlcyA9IGZldGNoX3RvX2Rldl9idWZmZXIoU0NwbnQsIGZha2Vfc3RvcmVwICsgKGJsb2NrICogU0VDVF9TSVpFKSwKKwkJCSAgIAkgIG51bSAqIFNFQ1RfU0laRSk7CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmF0b21pY19ydywgaWZsYWdzKTsKKwlpZiAoLTEgPT0gcmVzKQorCQlyZXR1cm4gKERJRF9FUlJPUiA8PCAxNik7CisJZWxzZSBpZiAoKHJlcyA8IChudW0gKiBTRUNUX1NJWkUpKSAmJgorCQkgKFNDU0lfREVCVUdfT1BUX05PSVNFICYgc2NzaV9kZWJ1Z19vcHRzKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaV9kZWJ1Zzogd3JpdGU6IGNkYiBpbmRpY2F0ZWQ9JWQsICIKKwkJICAgICAgICIgSU8gc2VudD0lZCBieXRlc1xuIiwgbnVtICogU0VDVF9TSVpFLCByZXMpOworCXJldHVybiAwOworfQorCisjZGVmaW5lIFNERUJVR19STFVOX0FSUl9TWiAxMjgKKworc3RhdGljIGludCByZXNwX3JlcG9ydF9sdW5zKHN0cnVjdCBzY3NpX2NtbmQgKiBzY3AsCisJCQkgICAgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwKQoreworCXVuc2lnbmVkIGludCBhbGxvY19sZW47CisJaW50IGx1bl9jbnQsIGksIHVwcGVyOworCXVuc2lnbmVkIGNoYXIgKmNtZCA9ICh1bnNpZ25lZCBjaGFyICopc2NwLT5jbW5kOworCWludCBzZWxlY3RfcmVwb3J0ID0gKGludCljbWRbMl07CisJc3RydWN0IHNjc2lfbHVuICpvbmVfbHVuOworCXVuc2lnbmVkIGNoYXIgYXJyW1NERUJVR19STFVOX0FSUl9TWl07CisKKwlhbGxvY19sZW4gPSBjbWRbOV0gKyAoY21kWzhdIDw8IDgpICsgKGNtZFs3XSA8PCAxNikgKyAoY21kWzZdIDw8IDI0KTsKKwlpZiAoKGFsbG9jX2xlbiA8IDE2KSB8fCAoc2VsZWN0X3JlcG9ydCA+IDIpKSB7CisJCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgSUxMRUdBTF9SRVFVRVNULCBJTlZBTElEX0ZJRUxEX0lOX0NEQiwKKwkJCSAgICAgICAJMCk7CisJCXJldHVybiBjaGVja19jb25kaXRpb25fcmVzdWx0OworCX0KKwkvKiBjYW4gcHJvZHVjZSByZXNwb25zZSB3aXRoIHVwIHRvIDE2ayBsdW5zIChsdW4gMCB0byBsdW4gMTYzODMpICovCisJbWVtc2V0KGFyciwgMCwgU0RFQlVHX1JMVU5fQVJSX1NaKTsKKwlsdW5fY250ID0gc2NzaV9kZWJ1Z19tYXhfbHVuczsKKwlhcnJbMl0gPSAoKHNpemVvZihzdHJ1Y3Qgc2NzaV9sdW4pICogbHVuX2NudCkgPj4gOCkgJiAweGZmOworCWFyclszXSA9IChzaXplb2Yoc3RydWN0IHNjc2lfbHVuKSAqIGx1bl9jbnQpICYgMHhmZjsKKwlsdW5fY250ID0gbWluKChpbnQpKChTREVCVUdfUkxVTl9BUlJfU1ogLSA4KSAvCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3NpX2x1bikpLCBsdW5fY250KTsKKwlvbmVfbHVuID0gKHN0cnVjdCBzY3NpX2x1biAqKSAmYXJyWzhdOworCWZvciAoaSA9IDA7IGkgPCBsdW5fY250OyBpKyspIHsKKwkJdXBwZXIgPSAoaSA+PiA4KSAmIDB4M2Y7CisJCWlmICh1cHBlcikKKwkJCW9uZV9sdW5baV0uc2NzaV9sdW5bMF0gPQorCQkJICAgICh1cHBlciB8IChTQU0yX0xVTl9BRERSRVNTX01FVEhPRCA8PCA2KSk7CisJCW9uZV9sdW5baV0uc2NzaV9sdW5bMV0gPSBpICYgMHhmZjsKKwl9CisJcmV0dXJuIGZpbGxfZnJvbV9kZXZfYnVmZmVyKHNjcCwgYXJyLAorCQkJCSAgICBtaW4oKGludClhbGxvY19sZW4sIFNERUJVR19STFVOX0FSUl9TWikpOworfQorCisvKiBXaGVuIHRpbWVyIGdvZXMgb2ZmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAqLworc3RhdGljIHZvaWQgdGltZXJfaW50cl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgaW5keCkKK3sKKwlzdHJ1Y3Qgc2RlYnVnX3F1ZXVlZF9jbWQgKiBzcWNwOworCXVuc2lnbmVkIGxvbmcgaWZsYWdzOworCisJaWYgKGluZHggPj0gU0NTSV9ERUJVR19DQU5RVUVVRSkgeworCQlwcmludGsoS0VSTl9FUlIgInNjc2lfZGVidWc6dGltZXJfaW50cl9oYW5kbGVyOiBpbmR4IHRvbyAiCisJCSAgICAgICAibGFyZ2VcbiIpOworCQlyZXR1cm47CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZWRfYXJyX2xvY2ssIGlmbGFncyk7CisJc3FjcCA9ICZxdWV1ZWRfYXJyWyhpbnQpaW5keF07CisJaWYgKCEgc3FjcC0+aW5fdXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2NzaV9kZWJ1Zzp0aW1lcl9pbnRyX2hhbmRsZXI6IFVuZXhwZWN0ZWQgIgorCQkgICAgICAgImludGVycnVwdFxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlZF9hcnJfbG9jaywgaWZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlzcWNwLT5pbl91c2UgPSAwOworCWlmIChzcWNwLT5kb25lX2Z1bmN0KSB7CisJCXNxY3AtPmFfY21uZC0+cmVzdWx0ID0gc3FjcC0+c2NzaV9yZXN1bHQ7CisJCXNxY3AtPmRvbmVfZnVuY3Qoc3FjcC0+YV9jbW5kKTsgLyogY2FsbGJhY2sgdG8gbWlkIGxldmVsICovCisJfQorCXNxY3AtPmRvbmVfZnVuY3QgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlZF9hcnJfbG9jaywgaWZsYWdzKTsKK30KKworc3RhdGljIGludCBzY3NpX2RlYnVnX3NsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqIHNkcCkKK3sKKwlpZiAoU0NTSV9ERUJVR19PUFRfTk9JU0UgJiBzY3NpX2RlYnVnX29wdHMpCisJCXByaW50ayhLRVJOX0lORk8gInNjc2lfZGVidWc6IHNsYXZlX2FsbG9jIDwldSAldSAldSAldT5cbiIsCisJCSAgICAgICBzZHAtPmhvc3QtPmhvc3Rfbm8sIHNkcC0+Y2hhbm5lbCwgc2RwLT5pZCwgc2RwLT5sdW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjc2lfZGVidWdfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqIHNkcCkKK3sKKwlzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXA7CisKKwlpZiAoU0NTSV9ERUJVR19PUFRfTk9JU0UgJiBzY3NpX2RlYnVnX29wdHMpCisJCXByaW50ayhLRVJOX0lORk8gInNjc2lfZGVidWc6IHNsYXZlX2NvbmZpZ3VyZSA8JXUgJXUgJXUgJXU+XG4iLAorCQkgICAgICAgc2RwLT5ob3N0LT5ob3N0X25vLCBzZHAtPmNoYW5uZWwsIHNkcC0+aWQsIHNkcC0+bHVuKTsKKwlpZiAoc2RwLT5ob3N0LT5tYXhfY21kX2xlbiAhPSBTQ1NJX0RFQlVHX01BWF9DTURfTEVOKQorCQlzZHAtPmhvc3QtPm1heF9jbWRfbGVuID0gU0NTSV9ERUJVR19NQVhfQ01EX0xFTjsKKwlkZXZpcCA9IGRldkluZm9SZWcoc2RwKTsKKwlzZHAtPmhvc3RkYXRhID0gZGV2aXA7CisJaWYgKHNkcC0+aG9zdC0+Y21kX3Blcl9sdW4pCisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkcCwgU0RFQlVHX1RBR0dFRF9RVUVVSU5HLAorCQkJCQlzZHAtPmhvc3QtPmNtZF9wZXJfbHVuKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2NzaV9kZWJ1Z19zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqIHNkcCkKK3sKKwlzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXAgPQorCQkJCShzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICopc2RwLT5ob3N0ZGF0YTsKKworCWlmIChTQ1NJX0RFQlVHX09QVF9OT0lTRSAmIHNjc2lfZGVidWdfb3B0cykKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaV9kZWJ1Zzogc2xhdmVfZGVzdHJveSA8JXUgJXUgJXUgJXU+XG4iLAorCQkgICAgICAgc2RwLT5ob3N0LT5ob3N0X25vLCBzZHAtPmNoYW5uZWwsIHNkcC0+aWQsIHNkcC0+bHVuKTsKKwlpZiAoZGV2aXApIHsKKwkJLyogbWFrZSB0aGlzIHNsb3QgYXZhbGlhYmxlIGZvciByZS11c2UgKi8KKwkJZGV2aXAtPnVzZWQgPSAwOworCQlzZHAtPmhvc3RkYXRhID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2SW5mb1JlZyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiBzZGV2KQoreworCXN0cnVjdCBzZGVidWdfaG9zdF9pbmZvICogc2RiZ19ob3N0OworCXN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBvcGVuX2RldmlwID0gTlVMTDsKKwlzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXAgPQorCQkJKHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKilzZGV2LT5ob3N0ZGF0YTsKKworCWlmIChkZXZpcCkKKwkJcmV0dXJuIGRldmlwOworCXNkYmdfaG9zdCA9ICooc3RydWN0IHNkZWJ1Z19ob3N0X2luZm8gKiopIHNkZXYtPmhvc3QtPmhvc3RkYXRhOworICAgICAgICBpZighIHNkYmdfaG9zdCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiSG9zdCBpbmZvIE5VTExcbiIpOworCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aXAsICZzZGJnX2hvc3QtPmRldl9pbmZvX2xpc3QsIGRldl9saXN0KSB7CisJCWlmICgoZGV2aXAtPnVzZWQpICYmIChkZXZpcC0+Y2hhbm5lbCA9PSBzZGV2LT5jaGFubmVsKSAmJgorICAgICAgICAgICAgICAgICAgICAoZGV2aXAtPnRhcmdldCA9PSBzZGV2LT5pZCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGRldmlwLT5sdW4gPT0gc2Rldi0+bHVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpcDsKKwkJZWxzZSB7CisJCQlpZiAoKCFkZXZpcC0+dXNlZCkgJiYgKCFvcGVuX2RldmlwKSkKKwkJCQlvcGVuX2RldmlwID0gZGV2aXA7CisJCX0KKwl9CisJaWYgKE5VTEwgPT0gb3Blbl9kZXZpcCkgeyAvKiB0cnkgYW5kIG1ha2UgYSBuZXcgb25lICovCisJCW9wZW5fZGV2aXAgPSBrbWFsbG9jKHNpemVvZigqb3Blbl9kZXZpcCksR0ZQX0tFUk5FTCk7CisJCWlmIChOVUxMID09IG9wZW5fZGV2aXApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IG91dCBvZiBtZW1vcnkgYXQgbGluZSAlZFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCW1lbXNldChvcGVuX2RldmlwLCAwLCBzaXplb2YoKm9wZW5fZGV2aXApKTsKKwkJb3Blbl9kZXZpcC0+c2RiZ19ob3N0ID0gc2RiZ19ob3N0OworCQlsaXN0X2FkZF90YWlsKCZvcGVuX2RldmlwLT5kZXZfbGlzdCwKKwkJJnNkYmdfaG9zdC0+ZGV2X2luZm9fbGlzdCk7CisJfQorICAgICAgICBpZiAob3Blbl9kZXZpcCkgeworCQlvcGVuX2RldmlwLT5jaGFubmVsID0gc2Rldi0+Y2hhbm5lbDsKKwkJb3Blbl9kZXZpcC0+dGFyZ2V0ID0gc2Rldi0+aWQ7CisJCW9wZW5fZGV2aXAtPmx1biA9IHNkZXYtPmx1bjsKKwkJb3Blbl9kZXZpcC0+c2RiZ19ob3N0ID0gc2RiZ19ob3N0OworCQlvcGVuX2RldmlwLT5yZXNldCA9IDE7CisJCW9wZW5fZGV2aXAtPnVzZWQgPSAxOworCQltZW1zZXQob3Blbl9kZXZpcC0+c2Vuc2VfYnVmZiwgMCwgU0RFQlVHX1NFTlNFX0xFTik7CisJCWlmIChzY3NpX2RlYnVnX2RzZW5zZSkKKwkJCW9wZW5fZGV2aXAtPnNlbnNlX2J1ZmZbMF0gPSAweDcyOworCQllbHNlIHsKKwkJCW9wZW5fZGV2aXAtPnNlbnNlX2J1ZmZbMF0gPSAweDcwOworCQkJb3Blbl9kZXZpcC0+c2Vuc2VfYnVmZls3XSA9IDB4YTsKKwkJfQorCQlyZXR1cm4gb3Blbl9kZXZpcDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgbWtfc2Vuc2VfYnVmZmVyKHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCwgaW50IGtleSwKKwkJCSAgICBpbnQgYXNjLCBpbnQgYXNxKQoreworCXVuc2lnbmVkIGNoYXIgKiBzYnVmZjsKKworCXNidWZmID0gZGV2aXAtPnNlbnNlX2J1ZmY7CisJbWVtc2V0KHNidWZmLCAwLCBTREVCVUdfU0VOU0VfTEVOKTsKKwlpZiAoc2NzaV9kZWJ1Z19kc2Vuc2UpIHsKKwkJc2J1ZmZbMF0gPSAweDcyOyAgLyogZGVzY3JpcHRvciwgY3VycmVudCAqLworCQlzYnVmZlsxXSA9IGtleTsKKwkJc2J1ZmZbMl0gPSBhc2M7CisJCXNidWZmWzNdID0gYXNxOworCX0gZWxzZSB7CisJCXNidWZmWzBdID0gMHg3MDsgIC8qIGZpeGVkLCBjdXJyZW50ICovCisJCXNidWZmWzJdID0ga2V5OworCQlzYnVmZls3XSA9IDB4YTsJICAvKiBpbXBsaWVzIDE4IGJ5dGUgc2Vuc2UgYnVmZmVyICovCisJCXNidWZmWzEyXSA9IGFzYzsKKwkJc2J1ZmZbMTNdID0gYXNxOworCX0KKwlpZiAoU0NTSV9ERUJVR19PUFRfTk9JU0UgJiBzY3NpX2RlYnVnX29wdHMpCisJCXByaW50ayhLRVJOX0lORk8gInNjc2lfZGVidWc6ICAgIFtzZW5zZV9rZXksYXNjLGFzY3FdOiAiCisJCSAgICAgICJbMHgleCwweCV4LDB4JXhdXG4iLCBrZXksIGFzYywgYXNxKTsKK30KKworc3RhdGljIGludCBzY3NpX2RlYnVnX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCkKK3sKKwlpZiAoU0NTSV9ERUJVR19PUFRfTk9JU0UgJiBzY3NpX2RlYnVnX29wdHMpCisJCXByaW50ayhLRVJOX0lORk8gInNjc2lfZGVidWc6IGFib3J0XG4iKTsKKwkrK251bV9hYm9ydHM7CisJc3RvcF9xdWV1ZWRfY21uZChTQ3BudCk7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgc2NzaV9kZWJ1Z19iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICogYmRldiwgc2VjdG9yX3QgY2FwYWNpdHksIGludCAqaW5mbykKK3sKKwlpbnQgcmVzOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworCWlmIChTQ1NJX0RFQlVHX09QVF9OT0lTRSAmIHNjc2lfZGVidWdfb3B0cykKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaV9kZWJ1ZzogYmlvc3BhcmFtXG4iKTsKKwlidWYgPSBzY3NpX2Jpb3NfcHRhYmxlKGJkZXYpOworCWlmIChidWYpIHsKKwkJcmVzID0gc2NzaV9wYXJ0c2l6ZShidWYsIGNhcGFjaXR5LAorCQkJCSAgICAmaW5mb1syXSwgJmluZm9bMF0sICZpbmZvWzFdKTsKKwkJa2ZyZWUoYnVmKTsKKwkJaWYgKCEgcmVzKQorCQkJcmV0dXJuIHJlczsKKwl9CisJaW5mb1swXSA9IHNkZWJ1Z19oZWFkczsKKwlpbmZvWzFdID0gc2RlYnVnX3NlY3RvcnNfcGVyOworCWluZm9bMl0gPSBzZGVidWdfY3lsaW5kZXJzX3BlcjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY3NpX2RlYnVnX2RldmljZV9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpCit7CisJc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwOworCisJaWYgKFNDU0lfREVCVUdfT1BUX05PSVNFICYgc2NzaV9kZWJ1Z19vcHRzKQorCQlwcmludGsoS0VSTl9JTkZPICJzY3NpX2RlYnVnOiBkZXZpY2VfcmVzZXRcbiIpOworCSsrbnVtX2Rldl9yZXNldHM7CisJaWYgKFNDcG50KSB7CisJCWRldmlwID0gZGV2SW5mb1JlZyhTQ3BudC0+ZGV2aWNlKTsKKwkJaWYgKGRldmlwKQorCQkJZGV2aXAtPnJlc2V0ID0gMTsKKwl9CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgc2NzaV9kZWJ1Z19idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KQoreworCXN0cnVjdCBzZGVidWdfaG9zdF9pbmZvICpzZGJnX2hvc3Q7CisgICAgICAgIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZfaW5mbzsKKyAgICAgICAgc3RydWN0IHNjc2lfZGV2aWNlICogc2RwOworICAgICAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICogaHA7CisKKwlpZiAoU0NTSV9ERUJVR19PUFRfTk9JU0UgJiBzY3NpX2RlYnVnX29wdHMpCisJCXByaW50ayhLRVJOX0lORk8gInNjc2lfZGVidWc6IGJ1c19yZXNldFxuIik7CisJKytudW1fYnVzX3Jlc2V0czsKKwlpZiAoU0NwbnQgJiYgKChzZHAgPSBTQ3BudC0+ZGV2aWNlKSkgJiYgKChocCA9IHNkcC0+aG9zdCkpKSB7CisJCXNkYmdfaG9zdCA9ICooc3RydWN0IHNkZWJ1Z19ob3N0X2luZm8gKiopIGhwLT5ob3N0ZGF0YTsKKwkJaWYgKHNkYmdfaG9zdCkgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNkYmdfaG9zdC0+ZGV2X2luZm9fbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2xpc3QpCisJCQkJZGV2X2luZm8tPnJlc2V0ID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzY3NpX2RlYnVnX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KQoreworCXN0cnVjdCBzZGVidWdfaG9zdF9pbmZvICogc2RiZ19ob3N0OworICAgICAgICBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2X2luZm87CisKKwlpZiAoU0NTSV9ERUJVR19PUFRfTk9JU0UgJiBzY3NpX2RlYnVnX29wdHMpCisJCXByaW50ayhLRVJOX0lORk8gInNjc2lfZGVidWc6IGhvc3RfcmVzZXRcbiIpOworCSsrbnVtX2hvc3RfcmVzZXRzOworICAgICAgICBzcGluX2xvY2soJnNkZWJ1Z19ob3N0X2xpc3RfbG9jayk7CisgICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnkoc2RiZ19ob3N0LCAmc2RlYnVnX2hvc3RfbGlzdCwgaG9zdF9saXN0KSB7CisgICAgICAgICAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZfaW5mbywgJnNkYmdfaG9zdC0+ZGV2X2luZm9fbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9saXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPnJlc2V0ID0gMTsKKyAgICAgICAgfQorICAgICAgICBzcGluX3VubG9jaygmc2RlYnVnX2hvc3RfbGlzdF9sb2NrKTsKKwlzdG9wX2FsbF9xdWV1ZWQoKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyogUmV0dXJucyAxIGlmIGZvdW5kICdjbW5kJyBhbmQgZGVsZXRlZCBpdHMgdGltZXIuIGVsc2UgcmV0dXJucyAwICovCitzdGF0aWMgaW50IHN0b3BfcXVldWVkX2NtbmQoc3RydWN0IHNjc2lfY21uZCAqIGNtbmQpCit7CisJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CisJaW50IGs7CisJc3RydWN0IHNkZWJ1Z19xdWV1ZWRfY21kICogc3FjcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZWRfYXJyX2xvY2ssIGlmbGFncyk7CisJZm9yIChrID0gMDsgayA8IFNDU0lfREVCVUdfQ0FOUVVFVUU7ICsraykgeworCQlzcWNwID0gJnF1ZXVlZF9hcnJba107CisJCWlmIChzcWNwLT5pbl91c2UgJiYgKGNtbmQgPT0gc3FjcC0+YV9jbW5kKSkgeworCQkJZGVsX3RpbWVyX3N5bmMoJnNxY3AtPmNtbmRfdGltZXIpOworCQkJc3FjcC0+aW5fdXNlID0gMDsKKwkJCXNxY3AtPmFfY21uZCA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZWRfYXJyX2xvY2ssIGlmbGFncyk7CisJcmV0dXJuIChrIDwgU0NTSV9ERUJVR19DQU5RVUVVRSkgPyAxIDogMDsKK30KKworLyogRGVsZXRlcyAoc3RvcHMpIHRpbWVycyBvZiBhbGwgcXVldWVkIGNvbW1hbmRzICovCitzdGF0aWMgdm9pZCBzdG9wX2FsbF9xdWV1ZWQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKwlpbnQgazsKKwlzdHJ1Y3Qgc2RlYnVnX3F1ZXVlZF9jbWQgKiBzcWNwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlZF9hcnJfbG9jaywgaWZsYWdzKTsKKwlmb3IgKGsgPSAwOyBrIDwgU0NTSV9ERUJVR19DQU5RVUVVRTsgKytrKSB7CisJCXNxY3AgPSAmcXVldWVkX2FycltrXTsKKwkJaWYgKHNxY3AtPmluX3VzZSAmJiBzcWNwLT5hX2NtbmQpIHsKKwkJCWRlbF90aW1lcl9zeW5jKCZzcWNwLT5jbW5kX3RpbWVyKTsKKwkJCXNxY3AtPmluX3VzZSA9IDA7CisJCQlzcWNwLT5hX2NtbmQgPSBOVUxMOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlZF9hcnJfbG9jaywgaWZsYWdzKTsKK30KKworLyogSW5pdGlhbGl6ZXMgdGltZXJzIGluIHF1ZXVlZCBhcnJheSAqLworc3RhdGljIHZvaWQgX19pbml0IGluaXRfYWxsX3F1ZXVlZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaWZsYWdzOworCWludCBrOworCXN0cnVjdCBzZGVidWdfcXVldWVkX2NtZCAqIHNxY3A7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWVkX2Fycl9sb2NrLCBpZmxhZ3MpOworCWZvciAoayA9IDA7IGsgPCBTQ1NJX0RFQlVHX0NBTlFVRVVFOyArK2spIHsKKwkJc3FjcCA9ICZxdWV1ZWRfYXJyW2tdOworCQlpbml0X3RpbWVyKCZzcWNwLT5jbW5kX3RpbWVyKTsKKwkJc3FjcC0+aW5fdXNlID0gMDsKKwkJc3FjcC0+YV9jbW5kID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWVkX2Fycl9sb2NrLCBpZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc2RlYnVnX2J1aWxkX3BhcnRzKHVuc2lnbmVkIGNoYXIgKiByYW1wKQoreworCXN0cnVjdCBwYXJ0aXRpb24gKiBwcDsKKwlpbnQgc3RhcnRzW1NERUJVR19NQVhfUEFSVFMgKyAyXTsKKwlpbnQgc2VjdG9yc19wZXJfcGFydCwgbnVtX3NlY3RvcnMsIGs7CisJaW50IGhlYWRzX2J5X3NlY3RzLCBzdGFydF9zZWMsIGVuZF9zZWM7CisKKwkvKiBhc3N1bWUgcGFydGl0aW9uIHRhYmxlIGFscmVhZHkgemVyb2VkICovCisJaWYgKChzY3NpX2RlYnVnX251bV9wYXJ0cyA8IDEpIHx8IChzZGVidWdfc3RvcmVfc2l6ZSA8IDEwNDg1NzYpKQorCQlyZXR1cm47CisJaWYgKHNjc2lfZGVidWdfbnVtX3BhcnRzID4gU0RFQlVHX01BWF9QQVJUUykgeworCQlzY3NpX2RlYnVnX251bV9wYXJ0cyA9IFNERUJVR19NQVhfUEFSVFM7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2lfZGVidWc6YnVpbGRfcGFydHM6IHJlZHVjaW5nICIKKwkJCQkgICAgInBhcnRpdGlvbnMgdG8gJWRcbiIsIFNERUJVR19NQVhfUEFSVFMpOworCX0KKwludW1fc2VjdG9ycyA9IChpbnQpKHNkZWJ1Z19zdG9yZV9zaXplIC8gU0VDVF9TSVpFKTsKKwlzZWN0b3JzX3Blcl9wYXJ0ID0gKG51bV9zZWN0b3JzIC0gc2RlYnVnX3NlY3RvcnNfcGVyKQorCQkJICAgLyBzY3NpX2RlYnVnX251bV9wYXJ0czsKKwloZWFkc19ieV9zZWN0cyA9IHNkZWJ1Z19oZWFkcyAqIHNkZWJ1Z19zZWN0b3JzX3BlcjsKKyAgICAgICAgc3RhcnRzWzBdID0gc2RlYnVnX3NlY3RvcnNfcGVyOworCWZvciAoayA9IDE7IGsgPCBzY3NpX2RlYnVnX251bV9wYXJ0czsgKytrKQorCQlzdGFydHNba10gPSAoKGsgKiBzZWN0b3JzX3Blcl9wYXJ0KSAvIGhlYWRzX2J5X3NlY3RzKQorCQkJICAgICogaGVhZHNfYnlfc2VjdHM7CisJc3RhcnRzW3Njc2lfZGVidWdfbnVtX3BhcnRzXSA9IG51bV9zZWN0b3JzOworCXN0YXJ0c1tzY3NpX2RlYnVnX251bV9wYXJ0cyArIDFdID0gMDsKKworCXJhbXBbNTEwXSA9IDB4NTU7CS8qIG1hZ2ljIHBhcnRpdGlvbiBtYXJraW5ncyAqLworCXJhbXBbNTExXSA9IDB4QUE7CisJcHAgPSAoc3RydWN0IHBhcnRpdGlvbiAqKShyYW1wICsgMHgxYmUpOworCWZvciAoayA9IDA7IHN0YXJ0c1trICsgMV07ICsraywgKytwcCkgeworCQlzdGFydF9zZWMgPSBzdGFydHNba107CisJCWVuZF9zZWMgPSBzdGFydHNbayArIDFdIC0gMTsKKwkJcHAtPmJvb3RfaW5kID0gMDsKKworCQlwcC0+Y3lsID0gc3RhcnRfc2VjIC8gaGVhZHNfYnlfc2VjdHM7CisJCXBwLT5oZWFkID0gKHN0YXJ0X3NlYyAtIChwcC0+Y3lsICogaGVhZHNfYnlfc2VjdHMpKQorCQkJICAgLyBzZGVidWdfc2VjdG9yc19wZXI7CisJCXBwLT5zZWN0b3IgPSAoc3RhcnRfc2VjICUgc2RlYnVnX3NlY3RvcnNfcGVyKSArIDE7CisKKwkJcHAtPmVuZF9jeWwgPSBlbmRfc2VjIC8gaGVhZHNfYnlfc2VjdHM7CisJCXBwLT5lbmRfaGVhZCA9IChlbmRfc2VjIC0gKHBwLT5lbmRfY3lsICogaGVhZHNfYnlfc2VjdHMpKQorCQkJICAgICAgIC8gc2RlYnVnX3NlY3RvcnNfcGVyOworCQlwcC0+ZW5kX3NlY3RvciA9IChlbmRfc2VjICUgc2RlYnVnX3NlY3RvcnNfcGVyKSArIDE7CisKKwkJcHAtPnN0YXJ0X3NlY3QgPSBzdGFydF9zZWM7CisJCXBwLT5ucl9zZWN0cyA9IGVuZF9zZWMgLSBzdGFydF9zZWMgKyAxOworCQlwcC0+c3lzX2luZCA9IDB4ODM7CS8qIHBsYWluIExpbnV4IHBhcnRpdGlvbiAqLworCX0KK30KKworc3RhdGljIGludCBzY2hlZHVsZV9yZXNwKHN0cnVjdCBzY3NpX2NtbmQgKiBjbW5kLAorCQkJIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCwKKwkJCSBkb25lX2Z1bmN0X3QgZG9uZSwgaW50IHNjc2lfcmVzdWx0LCBpbnQgZGVsdGFfamlmZikKK3sKKwlpZiAoKFNDU0lfREVCVUdfT1BUX05PSVNFICYgc2NzaV9kZWJ1Z19vcHRzKSAmJiBjbW5kKSB7CisJCWlmIChzY3NpX3Jlc3VsdCkgeworCQkJc3RydWN0IHNjc2lfZGV2aWNlICogc2RwID0gY21uZC0+ZGV2aWNlOworCisJCQlwcmludGsoS0VSTl9JTkZPICJzY3NpX2RlYnVnOiAgICA8JXUgJXUgJXUgJXU+ICIKKwkJCSAgICAgICAibm9uLXplcm8gcmVzdWx0PTB4JXhcbiIsIHNkcC0+aG9zdC0+aG9zdF9ubywKKwkJCSAgICAgICBzZHAtPmNoYW5uZWwsIHNkcC0+aWQsIHNkcC0+bHVuLCBzY3NpX3Jlc3VsdCk7CisJCX0KKwl9CisJaWYgKGNtbmQgJiYgZGV2aXApIHsKKwkJLyogc2ltdWxhdGUgYXV0b3NlbnNlIGJ5IHRoaXMgZHJpdmVyICovCisJCWlmIChTQU1fU1RBVF9DSEVDS19DT05ESVRJT04gPT0gKHNjc2lfcmVzdWx0ICYgMHhmZikpCisJCQltZW1jcHkoY21uZC0+c2Vuc2VfYnVmZmVyLCBkZXZpcC0+c2Vuc2VfYnVmZiwKKwkJCSAgICAgICAoU0NTSV9TRU5TRV9CVUZGRVJTSVpFID4gU0RFQlVHX1NFTlNFX0xFTikgPworCQkJICAgICAgIFNERUJVR19TRU5TRV9MRU4gOiBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOworCX0KKwlpZiAoZGVsdGFfamlmZiA8PSAwKSB7CisJCWlmIChjbW5kKQorCQkJY21uZC0+cmVzdWx0ID0gc2NzaV9yZXN1bHQ7CisJCWlmIChkb25lKQorCQkJZG9uZShjbW5kKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CisJCWludCBrOworCQlzdHJ1Y3Qgc2RlYnVnX3F1ZXVlZF9jbWQgKiBzcWNwID0gTlVMTDsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWVkX2Fycl9sb2NrLCBpZmxhZ3MpOworCQlmb3IgKGsgPSAwOyBrIDwgU0NTSV9ERUJVR19DQU5RVUVVRTsgKytrKSB7CisJCQlzcWNwID0gJnF1ZXVlZF9hcnJba107CisJCQlpZiAoISBzcWNwLT5pbl91c2UpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGsgPj0gU0NTSV9ERUJVR19DQU5RVUVVRSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWVkX2Fycl9sb2NrLCBpZmxhZ3MpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaV9kZWJ1ZzogY2FuX3F1ZXVlIGV4Y2VlZGVkXG4iKTsKKwkJCXJldHVybiAxOwkvKiByZXBvcnQgYnVzeSB0byBtaWQgbGV2ZWwgKi8KKwkJfQorCQlzcWNwLT5pbl91c2UgPSAxOworCQlzcWNwLT5hX2NtbmQgPSBjbW5kOworCQlzcWNwLT5zY3NpX3Jlc3VsdCA9IHNjc2lfcmVzdWx0OworCQlzcWNwLT5kb25lX2Z1bmN0ID0gZG9uZTsKKwkJc3FjcC0+Y21uZF90aW1lci5mdW5jdGlvbiA9IHRpbWVyX2ludHJfaGFuZGxlcjsKKwkJc3FjcC0+Y21uZF90aW1lci5kYXRhID0gazsKKwkJc3FjcC0+Y21uZF90aW1lci5leHBpcmVzID0gamlmZmllcyArIGRlbHRhX2ppZmY7CisJCWFkZF90aW1lcigmc3FjcC0+Y21uZF90aW1lcik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlZF9hcnJfbG9jaywgaWZsYWdzKTsKKwkJaWYgKGNtbmQpCisJCQljbW5kLT5yZXN1bHQgPSAwOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qIFNldCAncGVybScgKDR0aCBhcmd1bWVudCkgdG8gMCB0byBkaXNhYmxlIG1vZHVsZV9wYXJhbSdzIGRlZmluaXRpb24KKyAqIG9mIHN5c2ZzIHBhcmFtZXRlcnMgKHdoaWNoIG1vZHVsZV9wYXJhbSBkb2Vzbid0IHlldCBzdXBwb3J0KS4KKyAqIFN5c2ZzIHBhcmFtZXRlcnMgZGVmaW5lZCBleHBsaWNpdGx5IGJlbG93LgorICovCittb2R1bGVfcGFyYW1fbmFtZWQoYWRkX2hvc3QsIHNjc2lfZGVidWdfYWRkX2hvc3QsIGludCwgMCk7IC8qIHBlcm09MDY0NCAqLworbW9kdWxlX3BhcmFtX25hbWVkKGRlbGF5LCBzY3NpX2RlYnVnX2RlbGF5LCBpbnQsIDApOyAvKiBwZXJtPTA2NDQgKi8KK21vZHVsZV9wYXJhbV9uYW1lZChkZXZfc2l6ZV9tYiwgc2NzaV9kZWJ1Z19kZXZfc2l6ZV9tYiwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZChkc2Vuc2UsIHNjc2lfZGVidWdfZHNlbnNlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX25hbWVkKGV2ZXJ5X250aCwgc2NzaV9kZWJ1Z19ldmVyeV9udGgsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQobWF4X2x1bnMsIHNjc2lfZGVidWdfbWF4X2x1bnMsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQobnVtX3BhcnRzLCBzY3NpX2RlYnVnX251bV9wYXJ0cywgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZChudW1fdGd0cywgc2NzaV9kZWJ1Z19udW1fdGd0cywgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZChvcHRzLCBzY3NpX2RlYnVnX29wdHMsIGludCwgMCk7IC8qIHBlcm09MDY0NCAqLworbW9kdWxlX3BhcmFtX25hbWVkKHB0eXBlLCBzY3NpX2RlYnVnX3B0eXBlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX25hbWVkKHNjc2lfbGV2ZWwsIHNjc2lfZGVidWdfc2NzaV9sZXZlbCwgaW50LCAwKTsKKworTU9EVUxFX0FVVEhPUigiRXJpYyBZb3VuZ2RhbGUgKyBEb3VnbGFzIEdpbGJlcnQiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0NTSSBkZWJ1ZyBhZGFwdGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oU0NTSV9ERUJVR19WRVJTSU9OKTsKKworTU9EVUxFX1BBUk1fREVTQyhhZGRfaG9zdCwgIjAuLjEyNyBob3N0cyBhbGxvd2VkKGRlZj0xKSIpOworTU9EVUxFX1BBUk1fREVTQyhkZWxheSwgIiMgb2YgamlmZmllcyB0byBkZWxheSByZXNwb25zZShkZWY9MSkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2X3NpemVfbWIsICJzaXplIGluIE1CIG9mIHJhbSBzaGFyZWQgYnkgZGV2cyIpOworTU9EVUxFX1BBUk1fREVTQyhkc2Vuc2UsICJ1c2UgZGVzY3JpcHRvciBzZW5zZSBmb3JtYXQoZGVmOiBmaXhlZCkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZXZlcnlfbnRoLCAidGltZW91dCBldmVyeSBudGggY29tbWFuZChkZWY9MTAwKSIpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfbHVucywgIm51bWJlciBvZiBTQ1NJIExVTnMgcGVyIHRhcmdldCB0byBzaW11bGF0ZSIpOworTU9EVUxFX1BBUk1fREVTQyhudW1fcGFydHMsICJudW1iZXIgb2YgcGFydGl0aW9ucyhkZWY9MCkiKTsKK01PRFVMRV9QQVJNX0RFU0MobnVtX3RndHMsICJudW1iZXIgb2YgU0NTSSB0YXJnZXRzIHBlciBob3N0IHRvIHNpbXVsYXRlIik7CitNT0RVTEVfUEFSTV9ERVNDKG9wdHMsICIxLT5ub2lzZSwgMi0+bWVkaXVtX2Vycm9yLCA0LT4uLi4iKTsKK01PRFVMRV9QQVJNX0RFU0MocHR5cGUsICJTQ1NJIHBlcmlwaGVyYWwgdHlwZShkZWY9MFtkaXNrXSkiKTsKK01PRFVMRV9QQVJNX0RFU0Moc2NzaV9sZXZlbCwgIlNDU0kgbGV2ZWwgdG8gc2ltdWxhdGUoZGVmPTVbU1BDLTNdKSIpOworCisKK3N0YXRpYyBjaGFyIHNkZWJ1Z19pbmZvWzI1Nl07CisKK3N0YXRpYyBjb25zdCBjaGFyICogc2NzaV9kZWJ1Z19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKiBzaHApCit7CisJc3ByaW50ZihzZGVidWdfaW5mbywgInNjc2lfZGVidWcsIHZlcnNpb24gJXMgWyVzXSwgIgorCQkiZGV2X3NpemVfbWI9JWQsIG9wdHM9MHgleCIsIFNDU0lfREVCVUdfVkVSU0lPTiwKKwkJc2NzaV9kZWJ1Z192ZXJzaW9uX2RhdGUsIHNjc2lfZGVidWdfZGV2X3NpemVfbWIsCisJCXNjc2lfZGVidWdfb3B0cyk7CisJcmV0dXJuIHNkZWJ1Z19pbmZvOworfQorCisvKiBzY3NpX2RlYnVnX3Byb2NfaW5mbworICogVXNlZCBpZiB0aGUgZHJpdmVyIGN1cnJlbnRseSBoYXMgbm8gb3duIHN1cHBvcnQgZm9yIC9wcm9jL3Njc2kKKyAqLworc3RhdGljIGludCBzY3NpX2RlYnVnX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJCWludCBsZW5ndGgsIGludCBpbm91dCkKK3sKKwlpbnQgbGVuLCBwb3MsIGJlZ2luOworCWludCBvcmlnX2xlbmd0aDsKKworCW9yaWdfbGVuZ3RoID0gbGVuZ3RoOworCisJaWYgKGlub3V0ID09IDEpIHsKKwkJY2hhciBhcnJbMTZdOworCQlpbnQgbWluTGVuID0gbGVuZ3RoID4gMTUgPyAxNSA6IGxlbmd0aDsKKworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJbWVtY3B5KGFyciwgYnVmZmVyLCBtaW5MZW4pOworCQlhcnJbbWluTGVuXSA9ICdcMCc7CisJCWlmICgxICE9IHNzY2FuZihhcnIsICIlZCIsICZwb3MpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNjc2lfZGVidWdfb3B0cyA9IHBvczsKKwkJaWYgKHNjc2lfZGVidWdfZXZlcnlfbnRoICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBzY3NpX2RlYnVnX2NtbmRfY291bnQgPSAwOworCQlyZXR1cm4gbGVuZ3RoOworCX0KKwliZWdpbiA9IDA7CisJcG9zID0gbGVuID0gc3ByaW50ZihidWZmZXIsICJzY3NpX2RlYnVnIGFkYXB0ZXIgZHJpdmVyLCB2ZXJzaW9uICIKKwkgICAgIiVzIFslc11cbiIKKwkgICAgIm51bV90Z3RzPSVkLCBzaGFyZWQgKHJhbSkgc2l6ZT0lZCBNQiwgb3B0cz0weCV4LCAiCisJICAgICJldmVyeV9udGg9JWQoY3VycjolZClcbiIKKwkgICAgImRlbGF5PSVkLCBtYXhfbHVucz0lZCwgc2NzaV9sZXZlbD0lZFxuIgorCSAgICAic2VjdG9yX3NpemU9JWQgYnl0ZXMsIGN5bGluZGVycz0lZCwgaGVhZHM9JWQsIHNlY3RvcnM9JWRcbiIKKwkgICAgIm51bWJlciBvZiBhYm9ydHM9JWQsIGRldmljZV9yZXNldD0lZCwgYnVzX3Jlc2V0cz0lZCwgIgorCSAgICAiaG9zdF9yZXNldHM9JWRcbiIsCisJICAgIFNDU0lfREVCVUdfVkVSU0lPTiwgc2NzaV9kZWJ1Z192ZXJzaW9uX2RhdGUsIHNjc2lfZGVidWdfbnVtX3RndHMsCisJICAgIHNjc2lfZGVidWdfZGV2X3NpemVfbWIsIHNjc2lfZGVidWdfb3B0cywgc2NzaV9kZWJ1Z19ldmVyeV9udGgsCisJICAgIHNjc2lfZGVidWdfY21uZF9jb3VudCwgc2NzaV9kZWJ1Z19kZWxheSwKKwkgICAgc2NzaV9kZWJ1Z19tYXhfbHVucywgc2NzaV9kZWJ1Z19zY3NpX2xldmVsLAorCSAgICBTRUNUX1NJWkUsIHNkZWJ1Z19jeWxpbmRlcnNfcGVyLCBzZGVidWdfaGVhZHMsIHNkZWJ1Z19zZWN0b3JzX3BlciwKKwkgICAgbnVtX2Fib3J0cywgbnVtX2Rldl9yZXNldHMsIG51bV9idXNfcmVzZXRzLCBudW1faG9zdF9yZXNldHMpOworCWlmIChwb3MgPCBvZmZzZXQpIHsKKwkJbGVuID0gMDsKKwkJYmVnaW4gPSBwb3M7CisJfQorCSpzdGFydCA9IGJ1ZmZlciArIChvZmZzZXQgLSBiZWdpbik7CS8qIFN0YXJ0IG9mIHdhbnRlZCBkYXRhICovCisJbGVuIC09IChvZmZzZXQgLSBiZWdpbik7CisJaWYgKGxlbiA+IGxlbmd0aCkKKwkJbGVuID0gbGVuZ3RoOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNkZWJ1Z19kZWxheV9zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZGRwLCBjaGFyICogYnVmKQoreworICAgICAgICByZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHNjc2lfZGVidWdfZGVsYXkpOworfQorCitzdGF0aWMgc3NpemVfdCBzZGVidWdfZGVsYXlfc3RvcmUoc3RydWN0IGRldmljZV9kcml2ZXIgKiBkZHAsCisJCQkJICBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpCit7CisgICAgICAgIGludCBkZWxheTsKKwljaGFyIHdvcmtbMjBdOworCisgICAgICAgIGlmICgxID09IHNzY2FuZihidWYsICIlMTBzIiwgd29yaykpIHsKKwkJaWYgKCgxID09IHNzY2FuZih3b3JrLCAiJWQiLCAmZGVsYXkpKSAmJiAoZGVsYXkgPj0gMCkpIHsKKwkJCXNjc2lfZGVidWdfZGVsYXkgPSBkZWxheTsKKwkJCXJldHVybiBjb3VudDsKKwkJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KK0RSSVZFUl9BVFRSKGRlbGF5LCBTX0lSVUdPIHwgU19JV1VTUiwgc2RlYnVnX2RlbGF5X3Nob3csCisJICAgIHNkZWJ1Z19kZWxheV9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IHNkZWJ1Z19vcHRzX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKiBkZHAsIGNoYXIgKiBidWYpCit7CisgICAgICAgIHJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIweCV4XG4iLCBzY3NpX2RlYnVnX29wdHMpOworfQorCitzdGF0aWMgc3NpemVfdCBzZGVidWdfb3B0c19zdG9yZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRkcCwKKwkJCQkgY29uc3QgY2hhciAqIGJ1Ziwgc2l6ZV90IGNvdW50KQoreworICAgICAgICBpbnQgb3B0czsKKwljaGFyIHdvcmtbMjBdOworCisgICAgICAgIGlmICgxID09IHNzY2FuZihidWYsICIlMTBzIiwgd29yaykpIHsKKwkJaWYgKDAgPT0gc3RybmljbXAod29yaywiMHgiLCAyKSkgeworCQkJaWYgKDEgPT0gc3NjYW5mKCZ3b3JrWzJdLCAiJXgiLCAmb3B0cykpCisJCQkJZ290byBvcHRzX2RvbmU7CisJCX0gZWxzZSB7CisJCQlpZiAoMSA9PSBzc2NhbmYod29yaywgIiVkIiwgJm9wdHMpKQorCQkJCWdvdG8gb3B0c19kb25lOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworb3B0c19kb25lOgorCXNjc2lfZGVidWdfb3B0cyA9IG9wdHM7CisJc2NzaV9kZWJ1Z19jbW5kX2NvdW50ID0gMDsKKwlyZXR1cm4gY291bnQ7Cit9CitEUklWRVJfQVRUUihvcHRzLCBTX0lSVUdPIHwgU19JV1VTUiwgc2RlYnVnX29wdHNfc2hvdywKKwkgICAgc2RlYnVnX29wdHNfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBzZGVidWdfcHR5cGVfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRkcCwgY2hhciAqIGJ1ZikKK3sKKyAgICAgICAgcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBzY3NpX2RlYnVnX3B0eXBlKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNkZWJ1Z19wdHlwZV9zdG9yZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRkcCwKKwkJCQkgIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCkKK3sKKyAgICAgICAgaW50IG47CisKKwlpZiAoKGNvdW50ID4gMCkgJiYgKDEgPT0gc3NjYW5mKGJ1ZiwgIiVkIiwgJm4pKSAmJiAobiA+PSAwKSkgeworCQlzY3NpX2RlYnVnX3B0eXBlID0gbjsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KK0RSSVZFUl9BVFRSKHB0eXBlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2RlYnVnX3B0eXBlX3Nob3csIHNkZWJ1Z19wdHlwZV9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IHNkZWJ1Z19kc2Vuc2Vfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRkcCwgY2hhciAqIGJ1ZikKK3sKKyAgICAgICAgcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBzY3NpX2RlYnVnX2RzZW5zZSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZGVidWdfZHNlbnNlX3N0b3JlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZGRwLAorCQkJCSAgY29uc3QgY2hhciAqIGJ1Ziwgc2l6ZV90IGNvdW50KQoreworICAgICAgICBpbnQgbjsKKworCWlmICgoY291bnQgPiAwKSAmJiAoMSA9PSBzc2NhbmYoYnVmLCAiJWQiLCAmbikpICYmIChuID49IDApKSB7CisJCXNjc2lfZGVidWdfZHNlbnNlID0gbjsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KK0RSSVZFUl9BVFRSKGRzZW5zZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNkZWJ1Z19kc2Vuc2Vfc2hvdywKKwkgICAgc2RlYnVnX2RzZW5zZV9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IHNkZWJ1Z19udW1fdGd0c19zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZGRwLCBjaGFyICogYnVmKQoreworICAgICAgICByZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHNjc2lfZGVidWdfbnVtX3RndHMpOworfQorc3RhdGljIHNzaXplX3Qgc2RlYnVnX251bV90Z3RzX3N0b3JlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZGRwLAorCQkJCSAgICAgY29uc3QgY2hhciAqIGJ1Ziwgc2l6ZV90IGNvdW50KQoreworICAgICAgICBpbnQgbjsKKworCWlmICgoY291bnQgPiAwKSAmJiAoMSA9PSBzc2NhbmYoYnVmLCAiJWQiLCAmbikpICYmIChuID49IDApKSB7CisJCXNjc2lfZGVidWdfbnVtX3RndHMgPSBuOworCQlzZGVidWdfbWF4X3RndHNfbHVucygpOworCQlyZXR1cm4gY291bnQ7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorRFJJVkVSX0FUVFIobnVtX3RndHMsIFNfSVJVR08gfCBTX0lXVVNSLCBzZGVidWdfbnVtX3RndHNfc2hvdywKKwkgICAgc2RlYnVnX251bV90Z3RzX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3Qgc2RlYnVnX2Rldl9zaXplX21iX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKiBkZHAsIGNoYXIgKiBidWYpCit7CisgICAgICAgIHJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgc2NzaV9kZWJ1Z19kZXZfc2l6ZV9tYik7Cit9CitEUklWRVJfQVRUUihkZXZfc2l6ZV9tYiwgU19JUlVHTywgc2RlYnVnX2Rldl9zaXplX21iX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzZGVidWdfbnVtX3BhcnRzX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKiBkZHAsIGNoYXIgKiBidWYpCit7CisgICAgICAgIHJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgc2NzaV9kZWJ1Z19udW1fcGFydHMpOworfQorRFJJVkVSX0FUVFIobnVtX3BhcnRzLCBTX0lSVUdPLCBzZGVidWdfbnVtX3BhcnRzX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzZGVidWdfZXZlcnlfbnRoX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKiBkZHAsIGNoYXIgKiBidWYpCit7CisgICAgICAgIHJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgc2NzaV9kZWJ1Z19ldmVyeV9udGgpOworfQorc3RhdGljIHNzaXplX3Qgc2RlYnVnX2V2ZXJ5X250aF9zdG9yZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRkcCwKKwkJCQkgICAgICBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpCit7CisgICAgICAgIGludCBudGg7CisKKwlpZiAoKGNvdW50ID4gMCkgJiYgKDEgPT0gc3NjYW5mKGJ1ZiwgIiVkIiwgJm50aCkpKSB7CisJCXNjc2lfZGVidWdfZXZlcnlfbnRoID0gbnRoOworCQlzY3NpX2RlYnVnX2NtbmRfY291bnQgPSAwOworCQlyZXR1cm4gY291bnQ7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorRFJJVkVSX0FUVFIoZXZlcnlfbnRoLCBTX0lSVUdPIHwgU19JV1VTUiwgc2RlYnVnX2V2ZXJ5X250aF9zaG93LAorCSAgICBzZGVidWdfZXZlcnlfbnRoX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3Qgc2RlYnVnX21heF9sdW5zX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKiBkZHAsIGNoYXIgKiBidWYpCit7CisgICAgICAgIHJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgc2NzaV9kZWJ1Z19tYXhfbHVucyk7Cit9CitzdGF0aWMgc3NpemVfdCBzZGVidWdfbWF4X2x1bnNfc3RvcmUoc3RydWN0IGRldmljZV9kcml2ZXIgKiBkZHAsCisJCQkJICAgICBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpCit7CisgICAgICAgIGludCBuOworCisJaWYgKChjb3VudCA+IDApICYmICgxID09IHNzY2FuZihidWYsICIlZCIsICZuKSkgJiYgKG4gPj0gMCkpIHsKKwkJc2NzaV9kZWJ1Z19tYXhfbHVucyA9IG47CisJCXNkZWJ1Z19tYXhfdGd0c19sdW5zKCk7CisJCXJldHVybiBjb3VudDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CitEUklWRVJfQVRUUihtYXhfbHVucywgU19JUlVHTyB8IFNfSVdVU1IsIHNkZWJ1Z19tYXhfbHVuc19zaG93LAorCSAgICBzZGVidWdfbWF4X2x1bnNfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBzZGVidWdfc2NzaV9sZXZlbF9zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZGRwLCBjaGFyICogYnVmKQoreworICAgICAgICByZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHNjc2lfZGVidWdfc2NzaV9sZXZlbCk7Cit9CitEUklWRVJfQVRUUihzY3NpX2xldmVsLCBTX0lSVUdPLCBzZGVidWdfc2NzaV9sZXZlbF9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2RlYnVnX2FkZF9ob3N0X3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKiBkZHAsIGNoYXIgKiBidWYpCit7CisgICAgICAgIHJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgc2NzaV9kZWJ1Z19hZGRfaG9zdCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNkZWJ1Z19hZGRfaG9zdF9zdG9yZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRkcCwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCkKK3sKKyAgICAgICAgaW50IGRlbHRhX2hvc3RzOworCWNoYXIgd29ya1syMF07CisKKyAgICAgICAgaWYgKDEgIT0gc3NjYW5mKGJ1ZiwgIiUxMHMiLCB3b3JrKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJewkvKiB0ZW1wb3JhcnkgaGFjayBhcm91bmQgc3NjYW5mKCkgcHJvYmxlbSB3aXRoIC12ZSBudW1zICovCisJCWludCBuZWcgPSAwOworCisJCWlmICgnLScgPT0gKndvcmspCisJCQluZWcgPSAxOworCQlpZiAoMSAhPSBzc2NhbmYod29yayArIG5lZywgIiVkIiwgJmRlbHRhX2hvc3RzKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAobmVnKQorCQkJZGVsdGFfaG9zdHMgPSAtZGVsdGFfaG9zdHM7CisJfQorCWlmIChkZWx0YV9ob3N0cyA+IDApIHsKKwkJZG8geworCQkJc2RlYnVnX2FkZF9hZGFwdGVyKCk7CisJCX0gd2hpbGUgKC0tZGVsdGFfaG9zdHMpOworCX0gZWxzZSBpZiAoZGVsdGFfaG9zdHMgPCAwKSB7CisJCWRvIHsKKwkJCXNkZWJ1Z19yZW1vdmVfYWRhcHRlcigpOworCQl9IHdoaWxlICgrK2RlbHRhX2hvc3RzKTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorRFJJVkVSX0FUVFIoYWRkX2hvc3QsIFNfSVJVR08gfCBTX0lXVVNSLCBzZGVidWdfYWRkX2hvc3Rfc2hvdywgCisJICAgIHNkZWJ1Z19hZGRfaG9zdF9zdG9yZSk7CisKK3N0YXRpYyB2b2lkIGRvX2NyZWF0ZV9kcml2ZXJmc19maWxlcyh2b2lkKQoreworCWRyaXZlcl9jcmVhdGVfZmlsZSgmc2RlYnVnX2RyaXZlcmZzX2RyaXZlciwgJmRyaXZlcl9hdHRyX2FkZF9ob3N0KTsKKwlkcml2ZXJfY3JlYXRlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9kZWxheSk7CisJZHJpdmVyX2NyZWF0ZV9maWxlKCZzZGVidWdfZHJpdmVyZnNfZHJpdmVyLCAmZHJpdmVyX2F0dHJfZGV2X3NpemVfbWIpOworCWRyaXZlcl9jcmVhdGVfZmlsZSgmc2RlYnVnX2RyaXZlcmZzX2RyaXZlciwgJmRyaXZlcl9hdHRyX2RzZW5zZSk7CisJZHJpdmVyX2NyZWF0ZV9maWxlKCZzZGVidWdfZHJpdmVyZnNfZHJpdmVyLCAmZHJpdmVyX2F0dHJfZXZlcnlfbnRoKTsKKwlkcml2ZXJfY3JlYXRlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9tYXhfbHVucyk7CisJZHJpdmVyX2NyZWF0ZV9maWxlKCZzZGVidWdfZHJpdmVyZnNfZHJpdmVyLCAmZHJpdmVyX2F0dHJfbnVtX3RndHMpOworCWRyaXZlcl9jcmVhdGVfZmlsZSgmc2RlYnVnX2RyaXZlcmZzX2RyaXZlciwgJmRyaXZlcl9hdHRyX251bV9wYXJ0cyk7CisJZHJpdmVyX2NyZWF0ZV9maWxlKCZzZGVidWdfZHJpdmVyZnNfZHJpdmVyLCAmZHJpdmVyX2F0dHJfcHR5cGUpOworCWRyaXZlcl9jcmVhdGVfZmlsZSgmc2RlYnVnX2RyaXZlcmZzX2RyaXZlciwgJmRyaXZlcl9hdHRyX29wdHMpOworCWRyaXZlcl9jcmVhdGVfZmlsZSgmc2RlYnVnX2RyaXZlcmZzX2RyaXZlciwgJmRyaXZlcl9hdHRyX3Njc2lfbGV2ZWwpOworfQorCitzdGF0aWMgdm9pZCBkb19yZW1vdmVfZHJpdmVyZnNfZmlsZXModm9pZCkKK3sKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9zY3NpX2xldmVsKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9vcHRzKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9wdHlwZSk7CisJZHJpdmVyX3JlbW92ZV9maWxlKCZzZGVidWdfZHJpdmVyZnNfZHJpdmVyLCAmZHJpdmVyX2F0dHJfbnVtX3BhcnRzKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9udW1fdGd0cyk7CisJZHJpdmVyX3JlbW92ZV9maWxlKCZzZGVidWdfZHJpdmVyZnNfZHJpdmVyLCAmZHJpdmVyX2F0dHJfbWF4X2x1bnMpOworCWRyaXZlcl9yZW1vdmVfZmlsZSgmc2RlYnVnX2RyaXZlcmZzX2RyaXZlciwgJmRyaXZlcl9hdHRyX2V2ZXJ5X250aCk7CisJZHJpdmVyX3JlbW92ZV9maWxlKCZzZGVidWdfZHJpdmVyZnNfZHJpdmVyLCAmZHJpdmVyX2F0dHJfZHNlbnNlKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9kZXZfc2l6ZV9tYik7CisJZHJpdmVyX3JlbW92ZV9maWxlKCZzZGVidWdfZHJpdmVyZnNfZHJpdmVyLCAmZHJpdmVyX2F0dHJfZGVsYXkpOworCWRyaXZlcl9yZW1vdmVfZmlsZSgmc2RlYnVnX2RyaXZlcmZzX2RyaXZlciwgJmRyaXZlcl9hdHRyX2FkZF9ob3N0KTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2NzaV9kZWJ1Z19pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBzejsKKwlpbnQgaG9zdF90b19hZGQ7CisJaW50IGs7CisKKwlpZiAoc2NzaV9kZWJ1Z19kZXZfc2l6ZV9tYiA8IDEpCisJCXNjc2lfZGVidWdfZGV2X3NpemVfbWIgPSAxOyAgLyogZm9yY2UgbWluaW11bSAxIE1CIHJhbWRpc2sgKi8KKwlzZGVidWdfc3RvcmVfc2l6ZSA9ICh1bnNpZ25lZCBsb25nKXNjc2lfZGVidWdfZGV2X3NpemVfbWIgKiAxMDQ4NTc2OworCXNkZWJ1Z19jYXBhY2l0eSA9IHNkZWJ1Z19zdG9yZV9zaXplIC8gU0VDVF9TSVpFOworCisJLyogcGxheSBhcm91bmQgd2l0aCBnZW9tZXRyeSwgZG9uJ3Qgd2FzdGUgdG9vIG11Y2ggb24gdHJhY2sgMCAqLworCXNkZWJ1Z19oZWFkcyA9IDg7CisJc2RlYnVnX3NlY3RvcnNfcGVyID0gMzI7CisJaWYgKHNjc2lfZGVidWdfZGV2X3NpemVfbWIgPj0gMTYpCisJCXNkZWJ1Z19oZWFkcyA9IDMyOworCWVsc2UgaWYgKHNjc2lfZGVidWdfZGV2X3NpemVfbWIgPj0gMjU2KQorCQlzZGVidWdfaGVhZHMgPSA2NDsKKwlzZGVidWdfY3lsaW5kZXJzX3BlciA9ICh1bnNpZ25lZCBsb25nKXNkZWJ1Z19jYXBhY2l0eSAvCisJCQkgICAgICAgKHNkZWJ1Z19zZWN0b3JzX3BlciAqIHNkZWJ1Z19oZWFkcyk7CisJaWYgKHNkZWJ1Z19jeWxpbmRlcnNfcGVyID49IDEwMjQpIHsKKwkJLyogb3RoZXIgTExEcyBkbyB0aGlzOyBpbXBsaWVzID49IDFHQiByYW0gZGlzayAuLi4gKi8KKwkJc2RlYnVnX2hlYWRzID0gMjU1OworCQlzZGVidWdfc2VjdG9yc19wZXIgPSA2MzsKKwkJc2RlYnVnX2N5bGluZGVyc19wZXIgPSAodW5zaWduZWQgbG9uZylzZGVidWdfY2FwYWNpdHkgLworCQkJICAgICAgIChzZGVidWdfc2VjdG9yc19wZXIgKiBzZGVidWdfaGVhZHMpOworCX0KKworCXN6ID0gc2RlYnVnX3N0b3JlX3NpemU7CisJZmFrZV9zdG9yZXAgPSB2bWFsbG9jKHN6KTsKKwlpZiAoTlVMTCA9PSBmYWtlX3N0b3JlcCkgeworCQlwcmludGsoS0VSTl9FUlIgInNjc2lfZGVidWdfaW5pdDogb3V0IG9mIG1lbW9yeSwgMVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoZmFrZV9zdG9yZXAsIDAsIHN6KTsKKwlpZiAoc2NzaV9kZWJ1Z19udW1fcGFydHMgPiAwKQorCQlzZGVidWdfYnVpbGRfcGFydHMoZmFrZV9zdG9yZXApOworCisJaW5pdF9hbGxfcXVldWVkKCk7CisKKwlkZXZpY2VfcmVnaXN0ZXIoJnBzZXVkb19wcmltYXJ5KTsKKwlidXNfcmVnaXN0ZXIoJnBzZXVkb19sbGRfYnVzKTsKKwlkcml2ZXJfcmVnaXN0ZXIoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIpOworCWRvX2NyZWF0ZV9kcml2ZXJmc19maWxlcygpOworCisJc2RlYnVnX2RyaXZlcl90ZW1wbGF0ZS5wcm9jX25hbWUgPSAoY2hhciAqKXNkZWJ1Z19wcm9jX25hbWU7CisKKwlob3N0X3RvX2FkZCA9IHNjc2lfZGVidWdfYWRkX2hvc3Q7CisgICAgICAgIHNjc2lfZGVidWdfYWRkX2hvc3QgPSAwOworCisgICAgICAgIGZvciAoayA9IDA7IGsgPCBob3N0X3RvX2FkZDsgaysrKSB7CisgICAgICAgICAgICAgICAgaWYgKHNkZWJ1Z19hZGRfYWRhcHRlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInNjc2lfZGVidWdfaW5pdDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZGVidWdfYWRkX2FkYXB0ZXIgZmFpbGVkIGs9JWRcbiIsIGspOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKwlpZiAoU0NTSV9ERUJVR19PUFRfTk9JU0UgJiBzY3NpX2RlYnVnX29wdHMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaV9kZWJ1Z19pbml0OiBidWlsdCAlZCBob3N0KHMpXG4iLAorCQkgICAgICAgc2NzaV9kZWJ1Z19hZGRfaG9zdCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2NzaV9kZWJ1Z19leGl0KHZvaWQpCit7CisJaW50IGsgPSBzY3NpX2RlYnVnX2FkZF9ob3N0OworCisJc3RvcF9hbGxfcXVldWVkKCk7CisJZm9yICg7IGs7IGstLSkKKwkJc2RlYnVnX3JlbW92ZV9hZGFwdGVyKCk7CisJZG9fcmVtb3ZlX2RyaXZlcmZzX2ZpbGVzKCk7CisJZHJpdmVyX3VucmVnaXN0ZXIoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIpOworCWJ1c191bnJlZ2lzdGVyKCZwc2V1ZG9fbGxkX2J1cyk7CisJZGV2aWNlX3VucmVnaXN0ZXIoJnBzZXVkb19wcmltYXJ5KTsKKworCXZmcmVlKGZha2Vfc3RvcmVwKTsKK30KKworZGV2aWNlX2luaXRjYWxsKHNjc2lfZGVidWdfaW5pdCk7Cittb2R1bGVfZXhpdChzY3NpX2RlYnVnX2V4aXQpOworCit2b2lkIHBzZXVkb18wX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqIGRldikKK3sKKwlpZiAoU0NTSV9ERUJVR19PUFRfTk9JU0UgJiBzY3NpX2RlYnVnX29wdHMpCisJCXByaW50ayhLRVJOX0lORk8gInNjc2lfZGVidWc6IHBzZXVkb18wX3JlbGVhc2UoKSBjYWxsZWRcbiIpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZSBwc2V1ZG9fcHJpbWFyeSA9IHsKKwkuYnVzX2lkCQk9ICJwc2V1ZG9fMCIsCisJLnJlbGVhc2UJPSBwc2V1ZG9fMF9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBwc2V1ZG9fbGxkX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZXZfZHJpdmVyKQoreworICAgICAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBidXNfdHlwZSBwc2V1ZG9fbGxkX2J1cyA9IHsKKyAgICAgICAgLm5hbWUgPSAicHNldWRvIiwKKyAgICAgICAgLm1hdGNoID0gcHNldWRvX2xsZF9idXNfbWF0Y2gsCit9OworCitzdGF0aWMgdm9pZCBzZGVidWdfcmVsZWFzZV9hZGFwdGVyKHN0cnVjdCBkZXZpY2UgKiBkZXYpCit7CisgICAgICAgIHN0cnVjdCBzZGVidWdfaG9zdF9pbmZvICpzZGJnX2hvc3Q7CisKKwlzZGJnX2hvc3QgPSB0b19zZGVidWdfaG9zdChkZXYpOworICAgICAgICBrZnJlZShzZGJnX2hvc3QpOworfQorCitzdGF0aWMgaW50IHNkZWJ1Z19hZGRfYWRhcHRlcih2b2lkKQoreworCWludCBrLCBkZXZzX3Blcl9ob3N0OworICAgICAgICBpbnQgZXJyb3IgPSAwOworICAgICAgICBzdHJ1Y3Qgc2RlYnVnX2hvc3RfaW5mbyAqc2RiZ19ob3N0OworICAgICAgICBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICpzZGJnX2RldmluZm87CisgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxoLCAqbGhfc2Y7CisKKyAgICAgICAgc2RiZ19ob3N0ID0ga21hbGxvYyhzaXplb2YoKnNkYmdfaG9zdCksR0ZQX0tFUk5FTCk7CisKKyAgICAgICAgaWYgKE5VTEwgPT0gc2RiZ19ob3N0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogb3V0IG9mIG1lbW9yeSBhdCBsaW5lICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldChzZGJnX2hvc3QsIDAsIHNpemVvZigqc2RiZ19ob3N0KSk7CisgICAgICAgIElOSVRfTElTVF9IRUFEKCZzZGJnX2hvc3QtPmRldl9pbmZvX2xpc3QpOworCisJZGV2c19wZXJfaG9zdCA9IHNjc2lfZGVidWdfbnVtX3RndHMgKiBzY3NpX2RlYnVnX21heF9sdW5zOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZGV2c19wZXJfaG9zdDsgaysrKSB7CisgICAgICAgICAgICAgICAgc2RiZ19kZXZpbmZvID0ga21hbGxvYyhzaXplb2YoKnNkYmdfZGV2aW5mbyksR0ZQX0tFUk5FTCk7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgPT0gc2RiZ19kZXZpbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBvdXQgb2YgbWVtb3J5IGF0IGxpbmUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IC1FTk9NRU07CisJCQlnb3RvIGNsZWFuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1zZXQoc2RiZ19kZXZpbmZvLCAwLCBzaXplb2YoKnNkYmdfZGV2aW5mbykpOworICAgICAgICAgICAgICAgIHNkYmdfZGV2aW5mby0+c2RiZ19ob3N0ID0gc2RiZ19ob3N0OworICAgICAgICAgICAgICAgIGxpc3RfYWRkX3RhaWwoJnNkYmdfZGV2aW5mby0+ZGV2X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2RiZ19ob3N0LT5kZXZfaW5mb19saXN0KTsKKyAgICAgICAgfQorCisgICAgICAgIHNwaW5fbG9jaygmc2RlYnVnX2hvc3RfbGlzdF9sb2NrKTsKKyAgICAgICAgbGlzdF9hZGRfdGFpbCgmc2RiZ19ob3N0LT5ob3N0X2xpc3QsICZzZGVidWdfaG9zdF9saXN0KTsKKyAgICAgICAgc3Bpbl91bmxvY2soJnNkZWJ1Z19ob3N0X2xpc3RfbG9jayk7CisKKyAgICAgICAgc2RiZ19ob3N0LT5kZXYuYnVzID0gJnBzZXVkb19sbGRfYnVzOworICAgICAgICBzZGJnX2hvc3QtPmRldi5wYXJlbnQgPSAmcHNldWRvX3ByaW1hcnk7CisgICAgICAgIHNkYmdfaG9zdC0+ZGV2LnJlbGVhc2UgPSAmc2RlYnVnX3JlbGVhc2VfYWRhcHRlcjsKKyAgICAgICAgc3ByaW50ZihzZGJnX2hvc3QtPmRldi5idXNfaWQsICJhZGFwdGVyJWQiLCBzY3NpX2RlYnVnX2FkZF9ob3N0KTsKKworICAgICAgICBlcnJvciA9IGRldmljZV9yZWdpc3Rlcigmc2RiZ19ob3N0LT5kZXYpOworCisgICAgICAgIGlmIChlcnJvcikKKwkJZ290byBjbGVhbjsKKworCSsrc2NzaV9kZWJ1Z19hZGRfaG9zdDsKKyAgICAgICAgcmV0dXJuIGVycm9yOworCitjbGVhbjoKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGgsIGxoX3NmLCAmc2RiZ19ob3N0LT5kZXZfaW5mb19saXN0KSB7CisJCXNkYmdfZGV2aW5mbyA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBzZGVidWdfZGV2X2luZm8sCisJCQkJCSAgZGV2X2xpc3QpOworCQlsaXN0X2RlbCgmc2RiZ19kZXZpbmZvLT5kZXZfbGlzdCk7CisJCWtmcmVlKHNkYmdfZGV2aW5mbyk7CisJfQorCisJa2ZyZWUoc2RiZ19ob3N0KTsKKyAgICAgICAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBzZGVidWdfcmVtb3ZlX2FkYXB0ZXIodm9pZCkKK3sKKyAgICAgICAgc3RydWN0IHNkZWJ1Z19ob3N0X2luZm8gKiBzZGJnX2hvc3QgPSBOVUxMOworCisgICAgICAgIHNwaW5fbG9jaygmc2RlYnVnX2hvc3RfbGlzdF9sb2NrKTsKKyAgICAgICAgaWYgKCFsaXN0X2VtcHR5KCZzZGVidWdfaG9zdF9saXN0KSkgeworICAgICAgICAgICAgICAgIHNkYmdfaG9zdCA9IGxpc3RfZW50cnkoc2RlYnVnX2hvc3RfbGlzdC5wcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNkZWJ1Z19ob3N0X2luZm8sIGhvc3RfbGlzdCk7CisJCWxpc3RfZGVsKCZzZGJnX2hvc3QtPmhvc3RfbGlzdCk7CisJfQorICAgICAgICBzcGluX3VubG9jaygmc2RlYnVnX2hvc3RfbGlzdF9sb2NrKTsKKworCWlmICghc2RiZ19ob3N0KQorCQlyZXR1cm47CisKKyAgICAgICAgZGV2aWNlX3VucmVnaXN0ZXIoJnNkYmdfaG9zdC0+ZGV2KTsKKyAgICAgICAgLS1zY3NpX2RlYnVnX2FkZF9ob3N0OworfQorCitzdGF0aWMgaW50IHNkZWJ1Z19kcml2ZXJfcHJvYmUoc3RydWN0IGRldmljZSAqIGRldikKK3sKKyAgICAgICAgaW50IGVycm9yID0gMDsKKyAgICAgICAgc3RydWN0IHNkZWJ1Z19ob3N0X2luZm8gKnNkYmdfaG9zdDsKKyAgICAgICAgc3RydWN0IFNjc2lfSG9zdCAqaHBudDsKKworCXNkYmdfaG9zdCA9IHRvX3NkZWJ1Z19ob3N0KGRldik7CisKKyAgICAgICAgaHBudCA9IHNjc2lfaG9zdF9hbGxvYygmc2RlYnVnX2RyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKHNkYmdfaG9zdCkpOworICAgICAgICBpZiAoTlVMTCA9PSBocG50KSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogc2NzaV9yZWdpc3RlciBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgZXJyb3IgPSAtRU5PREVWOworCQlyZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBzZGJnX2hvc3QtPnNob3N0ID0gaHBudDsKKwkqKChzdHJ1Y3Qgc2RlYnVnX2hvc3RfaW5mbyAqKilocG50LT5ob3N0ZGF0YSkgPSBzZGJnX2hvc3Q7CisJaWYgKChocG50LT50aGlzX2lkID49IDApICYmIChzY3NpX2RlYnVnX251bV90Z3RzID4gaHBudC0+dGhpc19pZCkpCisJCWhwbnQtPm1heF9pZCA9IHNjc2lfZGVidWdfbnVtX3RndHMgKyAxOworCWVsc2UKKwkJaHBudC0+bWF4X2lkID0gc2NzaV9kZWJ1Z19udW1fdGd0czsKKwlocG50LT5tYXhfbHVuID0gc2NzaV9kZWJ1Z19tYXhfbHVuczsKKworICAgICAgICBlcnJvciA9IHNjc2lfYWRkX2hvc3QoaHBudCwgJnNkYmdfaG9zdC0+ZGV2KTsKKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogc2NzaV9hZGRfaG9zdCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgZXJyb3IgPSAtRU5PREVWOworCQlzY3NpX2hvc3RfcHV0KGhwbnQpOworICAgICAgICB9IGVsc2UKKwkJc2NzaV9zY2FuX2hvc3QoaHBudCk7CisKKworICAgICAgICByZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgc2RlYnVnX2RyaXZlcl9yZW1vdmUoc3RydWN0IGRldmljZSAqIGRldikKK3sKKyAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGgsICpsaF9zZjsKKyAgICAgICAgc3RydWN0IHNkZWJ1Z19ob3N0X2luZm8gKnNkYmdfaG9zdDsKKyAgICAgICAgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqc2RiZ19kZXZpbmZvOworCisJc2RiZ19ob3N0ID0gdG9fc2RlYnVnX2hvc3QoZGV2KTsKKworCWlmICghc2RiZ19ob3N0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBsb2NhdGUgaG9zdCBpbmZvXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisgICAgICAgIHNjc2lfcmVtb3ZlX2hvc3Qoc2RiZ19ob3N0LT5zaG9zdCk7CisKKyAgICAgICAgbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBsaF9zZiwgJnNkYmdfaG9zdC0+ZGV2X2luZm9fbGlzdCkgeworICAgICAgICAgICAgICAgIHNkYmdfZGV2aW5mbyA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBzZGVidWdfZGV2X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfbGlzdCk7CisgICAgICAgICAgICAgICAgbGlzdF9kZWwoJnNkYmdfZGV2aW5mby0+ZGV2X2xpc3QpOworICAgICAgICAgICAgICAgIGtmcmVlKHNkYmdfZGV2aW5mbyk7CisgICAgICAgIH0KKworICAgICAgICBzY3NpX2hvc3RfcHV0KHNkYmdfaG9zdC0+c2hvc3QpOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2RlYnVnX21heF90Z3RzX2x1bnModm9pZCkKK3sKKwlzdHJ1Y3Qgc2RlYnVnX2hvc3RfaW5mbyAqIHNkYmdfaG9zdDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpocG50OworCisJc3Bpbl9sb2NrKCZzZGVidWdfaG9zdF9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2RiZ19ob3N0LCAmc2RlYnVnX2hvc3RfbGlzdCwgaG9zdF9saXN0KSB7CisJCWhwbnQgPSBzZGJnX2hvc3QtPnNob3N0OworCQlpZiAoKGhwbnQtPnRoaXNfaWQgPj0gMCkgJiYKKwkJICAgIChzY3NpX2RlYnVnX251bV90Z3RzID4gaHBudC0+dGhpc19pZCkpCisJCQlocG50LT5tYXhfaWQgPSBzY3NpX2RlYnVnX251bV90Z3RzICsgMTsKKwkJZWxzZQorCQkJaHBudC0+bWF4X2lkID0gc2NzaV9kZWJ1Z19udW1fdGd0czsKKwkJaHBudC0+bWF4X2x1biA9IHNjc2lfZGVidWdfbWF4X2x1bnM7CisJfQorCXNwaW5fdW5sb2NrKCZzZGVidWdfaG9zdF9saXN0X2xvY2spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuaCBiL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1ZGQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBfU0NTSV9ERUJVR19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdGF0aWMgaW50IHNjc2lfZGVidWdfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICopOworc3RhdGljIGludCBzY3NpX2RlYnVnX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CitzdGF0aWMgdm9pZCBzY3NpX2RlYnVnX3NsYXZlX2Rlc3Ryb3koc3RydWN0IHNjc2lfZGV2aWNlICopOworc3RhdGljIGludCBzY3NpX2RlYnVnX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICosCisJCQkJICAgdm9pZCAoKmRvbmUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKK3N0YXRpYyBpbnQgc2NzaV9kZWJ1Z19pb2N0bChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgaW50LCB2b2lkIF9fdXNlciAqKTsKK3N0YXRpYyBpbnQgc2NzaV9kZWJ1Z19iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICosIHN0cnVjdCBibG9ja19kZXZpY2UgKiwKKwkJc2VjdG9yX3QsIGludFtdKTsKK3N0YXRpYyBpbnQgc2NzaV9kZWJ1Z19hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIGludCBzY3NpX2RlYnVnX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIGludCBzY3NpX2RlYnVnX2RldmljZV9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIGludCBzY3NpX2RlYnVnX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyBpbnQgc2NzaV9kZWJ1Z19wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqLCBjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCk7CitzdGF0aWMgY29uc3QgY2hhciAqIHNjc2lfZGVidWdfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOworCisjZGVmaW5lIFNDU0lfREVCVUdfQ0FOUVVFVUUgIDI1NSAJLyogbmVlZHMgdG8gYmUgPj0gMSAqLworCisjZGVmaW5lIFNDU0lfREVCVUdfTUFYX0NNRF9MRU4gMTYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9kZXZpbmZvLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZXZpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyMWRjMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2RldmluZm8uYwpAQCAtMCwwICsxLDU2NCBAQAorCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmluZm8uaD4KKworI2luY2x1ZGUgInNjc2lfcHJpdi5oIgorCisKKy8qCisgKiBzY3NpX2Rldl9pbmZvX2xpc3Q6IHN0cnVjdHVyZSB0byBob2xkIGJsYWNrL3doaXRlIGxpc3RlZCBkZXZpY2VzLgorICovCitzdHJ1Y3Qgc2NzaV9kZXZfaW5mb19saXN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRldl9pbmZvX2xpc3Q7CisJY2hhciB2ZW5kb3JbOF07CisJY2hhciBtb2RlbFsxNl07CisJdW5zaWduZWQgZmxhZ3M7CisJdW5zaWduZWQgY29tcGF0aWJsZTsgLyogZm9yIHVzZSB3aXRoIHNjc2lfc3RhdGljX2RldmljZV9saXN0IGVudHJpZXMgKi8KK307CisKKworc3RhdGljIGNvbnN0IGNoYXIgc3BhY2VzW10gPSAiICAgICAgICAgICAgICAgICI7IC8qIDE2IG9mIHRoZW0gKi8KK3N0YXRpYyB1bnNpZ25lZCBzY3NpX2RlZmF1bHRfZGV2X2ZsYWdzOworc3RhdGljIExJU1RfSEVBRChzY3NpX2Rldl9pbmZvX2xpc3QpOworc3RhdGljIGNoYXIgc2NzaV9kZXZfZmxhZ3NbMjU2XTsKKworLyoKKyAqIHNjc2lfc3RhdGljX2RldmljZV9saXN0OiBkZXByZWNhdGVkIGxpc3Qgb2YgZGV2aWNlcyB0aGF0IHJlcXVpcmUKKyAqIHNldHRpbmdzIHRoYXQgZGlmZmVyIGZyb20gdGhlIGRlZmF1bHQsIGluY2x1ZGVzIGJsYWNrLWxpc3RlZCAoYnJva2VuKQorICogZGV2aWNlcy4gVGhlIGVudHJpZXMgaGVyZSBhcmUgYWRkZWQgdG8gdGhlIHRhaWwgb2Ygc2NzaV9kZXZfaW5mb19saXN0CisgKiB2aWEgc2NzaV9kZXZfaW5mb19saXN0X2luaXQuCisgKgorICogRG8gbm90IGFkZCB0byB0aGlzIGxpc3QsIHVzZSB0aGUgY29tbWFuZCBsaW5lIG9yIHByb2MgaW50ZXJmYWNlIHRvIGFkZAorICogdG8gdGhlIHNjc2lfZGV2X2luZm9fbGlzdC4gVGhpcyB0YWJsZSB3aWxsIGV2ZW50dWFsbHkgZ28gYXdheS4KKyAqLworc3RhdGljIHN0cnVjdCB7CisJY2hhciAqdmVuZG9yOworCWNoYXIgKm1vZGVsOworCWNoYXIgKnJldmlzaW9uOwkvKiByZXZpc2lvbiBrbm93biB0byBiZSBiYWQsIHVudXNlZCAqLworCXVuc2lnbmVkIGZsYWdzOworfSBzY3NpX3N0YXRpY19kZXZpY2VfbGlzdFtdIF9faW5pdGRhdGEgPSB7CisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGRldmljZXMgYXJlIGtub3duIG5vdCB0byB0b2xlcmF0ZSBhIGx1biAhPSAwIHNjYW4KKwkgKiBmb3Igb25lIHJlYXNvbiBvciBhbm90aGVyLiBTb21lIHdpbGwgcmVzcG9uZCB0byBhbGwgbHVucywKKwkgKiBvdGhlcnMgd2lsbCBsb2NrIHVwLgorCSAqLworCXsiQWFzaGltYSIsICJJTUFHRVJZIDI0MDBTUCIsICIxLjAzIiwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLworCXsiQ0hJTk9OIiwgIkNELVJPTSBDRFMtNDMxIiwgIkg0MiIsIEJMSVNUX05PTFVOfSwJLyogbG9ja3MgdXAgKi8KKwl7IkNISU5PTiIsICJDRC1ST00gQ0RTLTUzNSIsICJRMTQiLCBCTElTVF9OT0xVTn0sCS8qIGxvY2tzIHVwICovCisJeyJERU5PTiIsICJEUkQtMjVYIiwgIlYiLCBCTElTVF9OT0xVTn0sCQkJLyogbG9ja3MgdXAgKi8KKwl7IkhJVEFDSEkiLCAiREszMTJDIiwgIkNNODEiLCBCTElTVF9OT0xVTn0sCS8qIHJlc3BvbmRzIHRvIGFsbCBsdW4gKi8KKwl7IkhJVEFDSEkiLCAiREszMTRDIiwgIkNSMjEiLCBCTElTVF9OT0xVTn0sCS8qIHJlc3BvbmRzIHRvIGFsbCBsdW4gKi8KKwl7IklNUyIsICJDREQ1MjEvMTAiLCAiMi4wNiIsIEJMSVNUX05PTFVOfSwJLyogbG9ja3MgdXAgKi8KKwl7Ik1BWFRPUiIsICJYVC0zMjgwIiwgIlBSMDIiLCBCTElTVF9OT0xVTn0sCS8qIGxvY2tzIHVwICovCisJeyJNQVhUT1IiLCAiWFQtNDM4MFMiLCAiQjNDIiwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLworCXsiTUFYVE9SIiwgIk1YVC0xMjQwUyIsICJJMS4yIiwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLworCXsiTUFYVE9SIiwgIlhULTQxNzBTIiwgIkI1QSIsIEJMSVNUX05PTFVOfSwJLyogbG9ja3MgdXAgKi8KKwl7Ik1BWFRPUiIsICJYVC04NzYwUyIsICJCN0IiLCBCTElTVF9OT0xVTn0sCS8qIGxvY2tzIHVwICovCisJeyJNRURJQVZJUyIsICJSRU5PIENELVJPTVgyQSIsICIyLjAzIiwgQkxJU1RfTk9MVU59LAkvKiByZXNwb25kcyB0byBhbGwgbHVuICovCisJeyJNSUNST1RFSyIsICJTY2FuTWFrZXJJSUkiLCAiMi4zMCIsIEJMSVNUX05PTFVOfSwJLyogcmVzcG9uZHMgdG8gYWxsIGx1biAqLworCXsiTkVDIiwgIkNELVJPTSBEUklWRTo4NDEiLCAiMS4wIiwgQkxJU1RfTk9MVU59LC8qIGxvY2tzIHVwICovCisJeyJQSElMSVBTIiwgIlBDQTgwU0MiLCAiVjQtMiIsIEJMSVNUX05PTFVOfSwJLyogcmVzcG9uZHMgdG8gYWxsIGx1biAqLworCXsiUk9ESU1FIiwgIlJPMzAwMFMiLCAiMi4zMyIsIEJMSVNUX05PTFVOfSwJLyogbG9ja3MgdXAgKi8KKwl7IlNVTiIsICJTRU5BIiwgTlVMTCwgQkxJU1RfTk9MVU59LAkJLyogcmVzcG9uZHMgdG8gYWxsIGx1bnMgKi8KKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgY2F1c2VzIGEgZmFpbGVkIFJFUVVFU1QgU0VOU0Ugb24gbHVuIDEgZm9yCisJICogYWhhMTUyeCBjb250cm9sbGVyLCB3aGljaCBjYXVzZXMgU0NTSSBjb2RlIHRvIHJlc2V0IGJ1cy4KKwkgKi8KKwl7IlNBTllPIiwgIkNSRC0yNTBTIiwgIjEuMjAiLCBCTElTVF9OT0xVTn0sCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGNhdXNlcyBhIGZhaWxlZCBSRVFVRVNUIFNFTlNFIG9uIGx1biAxIGZvcgorCSAqIGFoYTE1MnggY29udHJvbGxlciwgd2hpY2ggY2F1c2VzIFNDU0kgY29kZSB0byByZXNldCBidXMuCisJICovCisJeyJTRUFHQVRFIiwgIlNUMTU3TiIsICJcMDA0fGoiLCBCTElTVF9OT0xVTn0sCisJeyJTRUFHQVRFIiwgIlNUMjk2IiwgIjkyMSIsIEJMSVNUX05PTFVOfSwJLyogcmVzcG9uZHMgdG8gYWxsIGx1biAqLworCXsiU0VBR0FURSIsICJTVDE1ODEiLCAiNjUzOCIsIEJMSVNUX05PTFVOfSwJLyogcmVzcG9uZHMgdG8gYWxsIGx1biAqLworCXsiU09OWSIsICJDRC1ST00gQ0RVLTU0MSIsICI0LjNkIiwgQkxJU1RfTk9MVU59LAorCXsiU09OWSIsICJDRC1ST00gQ0RVLTU1UyIsICIxLjBpIiwgQkxJU1RfTk9MVU59LAorCXsiU09OWSIsICJDRC1ST00gQ0RVLTU2MSIsICIxLjd4IiwgQkxJU1RfTk9MVU59LAorCXsiU09OWSIsICJDRC1ST00gQ0RVLTgwMTIiLCBOVUxMLCBCTElTVF9OT0xVTn0sCisJeyJTT05ZIiwgIlNEVC01MDAwIiwgIjMuMTciLCBCTElTVF9TRUxFQ1RfTk9fQVROfSwKKwl7IlRBTkRCRVJHIiwgIlREQyAzNjAwIiwgIlUwNyIsIEJMSVNUX05PTFVOfSwJLyogbG9ja3MgdXAgKi8KKwl7IlRFQUMiLCAiQ0QtUjU1UyIsICIxLjBIIiwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLworCS8qCisJICogVGhlIGZvbGxvd2luZyBjYXVzZXMgYSBmYWlsZWQgUkVRVUVTVCBTRU5TRSBvbiBsdW4gMSBmb3IKKwkgKiBzZWFnYXRlIGNvbnRyb2xsZXIsIHdoaWNoIGNhdXNlcyBTQ1NJIGNvZGUgdG8gcmVzZXQgYnVzLgorCSAqLworCXsiVEVBQyIsICJDRC1ST00iLCAiMS4wNiIsIEJMSVNUX05PTFVOfSwKKwl7IlRFQUMiLCAiTVQtMlNULzQ1UzItMjciLCAiUlYgTSIsIEJMSVNUX05PTFVOfSwJLyogcmVzcG9uZHMgdG8gYWxsIGx1biAqLworCS8qCisJICogVGhlIGZvbGxvd2luZyBjYXVzZXMgYSBmYWlsZWQgUkVRVUVTVCBTRU5TRSBvbiBsdW4gMSBmb3IKKwkgKiBzZWFnYXRlIGNvbnRyb2xsZXIsIHdoaWNoIGNhdXNlcyBTQ1NJIGNvZGUgdG8gcmVzZXQgYnVzLgorCSAqLworCXsiSFAiLCAiQzE3NTBBIiwgIjMyMjYiLCBCTElTVF9OT0xVTn0sCQkvKiBzY2FuamV0IGlpYyAqLworCXsiSFAiLCAiQzE3OTBBIiwgIiIsIEJMSVNUX05PTFVOfSwJCS8qIHNjYW5qZXQgaWlwICovCisJeyJIUCIsICJDMjUwMEEiLCAiIiwgQkxJU1RfTk9MVU59LAkJLyogc2NhbmpldCBpaWN4ICovCisJeyJNRURJQVZJUyIsICJDRFItSDkzTVYiLCAiMS4zMSIsIEJMSVNUX05PTFVOfSwJLyogbG9ja3MgdXAgKi8KKwl7Ik1JQ1JPVEVLIiwgIlNjYW5NYWtlciBJSSIsICI1LjYxIiwgQkxJU1RfTk9MVU59LAkvKiByZXNwb25kcyB0byBhbGwgbHVuICovCisJeyJNSVRTVU1JIiwgIkNELVIgQ1ItMjIwMUNTIiwgIjYxMTkiLCBCTElTVF9OT0xVTn0sCS8qIGxvY2tzIHVwICovCisJeyJORUMiLCAiRDM4NTYiLCAiMDAwOSIsIEJMSVNUX05PTFVOfSwKKwl7IlFVQU5UVU0iLCAiTFBTNTI1UyIsICIzMTEwIiwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLworCXsiUVVBTlRVTSIsICJQRDEyMjVTIiwgIjMxMTAiLCBCTElTVF9OT0xVTn0sCS8qIGxvY2tzIHVwICovCisJeyJRVUFOVFVNIiwgIkZJUkVCQUxMIFNUNC4zUyIsICIwRjBDIiwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLworCXsiUkVMSVNZUyIsICJTY29ycGlvIiwgTlVMTCwgQkxJU1RfTk9MVU59LAkvKiByZXNwb25kcyB0byBhbGwgbHVuICovCisJeyJTQU5LWU8iLCAiQ1A1MjUiLCAiNi42NCIsIEJMSVNUX05PTFVOfSwJLyogY2F1c2VzIGZhaWxlZCBSRVEgU0VOU0UsIGV4dHJhIHJlc2V0ICovCisJeyJURVhFTCIsICJDRC1ST00iLCAiMS4wNiIsIEJMSVNUX05PTFVOfSwKKwl7IllBTUFIQSIsICJDRFIxMDAiLCAiMS4wMCIsIEJMSVNUX05PTFVOfSwJLyogbG9ja3MgdXAgKi8KKwl7IllBTUFIQSIsICJDRFIxMDIiLCAiMS4wMCIsIEJMSVNUX05PTFVOfSwJLyogbG9ja3MgdXAgKi8KKwl7IllBTUFIQSIsICJDUlc4NDI0UyIsICIxLjAiLCBCTElTVF9OT0xVTn0sCS8qIGxvY2tzIHVwICovCisJeyJZQU1BSEEiLCAiQ1JXNjQxNlMiLCAiMS4wYyIsIEJMSVNUX05PTFVOfSwJLyogbG9ja3MgdXAgKi8KKworCS8qCisJICogT3RoZXIgdHlwZXMgb2YgZGV2aWNlcyB0aGF0IGhhdmUgc3BlY2lhbCBmbGFncy4KKwkgKiBOb3RlIHRoYXQgYWxsIFVTQiBkZXZpY2VzIHNob3VsZCBoYXZlIHRoZSBCTElTVF9JTlFVSVJZXzM2IGZsYWcuCisJICovCisJeyIzUEFSZGF0YSIsICJWViIsIE5VTEwsIEJMSVNUX1JFUE9SVExVTjJ9LAorCXsiQURBUFRFQyIsICJBQUNSQUlEIiwgTlVMTCwgQkxJU1RfRk9SQ0VMVU59LAorCXsiQURBUFRFQyIsICJBZGFwdGVjIDU0MDBTIiwgTlVMTCwgQkxJU1RfRk9SQ0VMVU59LAorCXsiQUZUIFBSTyIsICItSVggQ0YiLCAiMC4wPiIsIEJMSVNUX0ZPUkNFTFVOfSwKKwl7IkJFTEtJTiIsICJVU0IgMiBIUy1DRiIsICIxLjk1IiwgIEJMSVNUX0ZPUkNFTFVOIHwgQkxJU1RfSU5RVUlSWV8zNn0sCisJeyJDQU5PTiIsICJJUFVCSkQiLCBOVUxMLCBCTElTVF9TUEFSU0VMVU59LAorCXsiQ0JPWDMiLCAiVVNCIFN0b3JhZ2UtU01DIiwgIjMwMEEiLCBCTElTVF9GT1JDRUxVTiB8IEJMSVNUX0lOUVVJUllfMzZ9LAorCXsiQ01EIiwgIkNSQS03MjgwIiwgTlVMTCwgQkxJU1RfU1BBUlNFTFVOfSwJLyogQ01EIFJBSUQgQ29udHJvbGxlciAqLworCXsiQ05TSSIsICJHNzMyNCIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTn0sCS8qIENoYXBhcnJhbCBHNzMyNCBSQUlEICovCisJeyJDTlNpIiwgIkc4MzI0IiwgTlVMTCwgQkxJU1RfU1BBUlNFTFVOfSwJLyogQ2hhcGFycmFsIEc4MzI0IFJBSUQgKi8KKwl7IkNPTVBBUSIsICJMT0dJQ0FMIFZPTFVNRSIsIE5VTEwsIEJMSVNUX0ZPUkNFTFVOfSwKKwl7IkNPTVBBUSIsICJDUjM1MDAiLCBOVUxMLCBCTElTVF9GT1JDRUxVTn0sCisJeyJDT01QQVEiLCAiTVNBMTAwMCIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTiB8IEJMSVNUX05PU1RBUlRPTkFERH0sCisJeyJDT01QQVEiLCAiTVNBMTAwMCBWT0xVTUUiLCBOVUxMLCBCTElTVF9TUEFSU0VMVU4gfCBCTElTVF9OT1NUQVJUT05BRER9LAorCXsiQ09NUEFRIiwgIkhTVjExMCIsIE5VTEwsIEJMSVNUX1JFUE9SVExVTjIgfCBCTElTVF9OT1NUQVJUT05BRER9LAorCXsiREROIiwgIlNBTiBEYXRhRGlyZWN0b3IiLCAiKiIsIEJMSVNUX1NQQVJTRUxVTn0sCisJeyJERUMiLCAiSFNHODAiLCBOVUxMLCBCTElTVF9TUEFSU0VMVU4gfCBCTElTVF9OT1NUQVJUT05BRER9LAorCXsiREVMTCIsICJQVjY2MEYiLCBOVUxMLCBCTElTVF9TUEFSU0VMVU59LAorCXsiREVMTCIsICJQVjY2MEYgICBQU0VVRE8iLCBOVUxMLCBCTElTVF9TUEFSU0VMVU59LAorCXsiREVMTCIsICJQU0VVRE8gREVWSUNFIC4iLCBOVUxMLCBCTElTVF9TUEFSU0VMVU59LAkvKiBEZWxsIFBWIDUzMEYgKi8KKwl7IkRFTEwiLCAiUFY1MzBGIiwgTlVMTCwgQkxJU1RfU1BBUlNFTFVOfSwKKwl7IkRFTEwiLCAiUEVSQ1JBSUQiLCBOVUxMLCBCTElTVF9GT1JDRUxVTn0sCisJeyJER0MiLCAiUkFJRCIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTn0sCS8qIERlbGwgUFYgNjUwRiwgc3RvcmFnZSBvbiBMVU4gMCAqLworCXsiREdDIiwgIkRJU0siLCBOVUxMLCBCTElTVF9TUEFSU0VMVU59LAkvKiBEZWxsIFBWIDY1MEYsIG5vIHN0b3JhZ2Ugb24gTFVOIDAgKi8KKwl7IkVNQyIsICJTWU1NRVRSSVgiLCBOVUxMLCBCTElTVF9TUEFSU0VMVU4gfCBCTElTVF9MQVJHRUxVTiB8IEJMSVNUX0ZPUkNFTFVOfSwKKwl7IkVNVUxFWCIsICJNRDIxL1MyICAgICBFU0RJIiwgTlVMTCwgQkxJU1RfU0lOR0xFTFVOfSwKKwl7IkZTQyIsICJDZW50cmljU3RvciIsICIqIiwgQkxJU1RfU1BBUlNFTFVOIHwgQkxJU1RfTEFSR0VMVU59LAorCXsiR2VuZXJpYyIsICJVU0IgU0QgUmVhZGVyIiwgIjEuMDAiLCBCTElTVF9GT1JDRUxVTiB8IEJMSVNUX0lOUVVJUllfMzZ9LAorCXsiR2VuZXJpYyIsICJVU0IgU3RvcmFnZS1TTUMiLCAiMDE4MCIsIEJMSVNUX0ZPUkNFTFVOIHwgQkxJU1RfSU5RVUlSWV8zNn0sCisJeyJHZW5lcmljIiwgIlVTQiBTdG9yYWdlLVNNQyIsICIwMjA3IiwgQkxJU1RfRk9SQ0VMVU4gfCBCTElTVF9JTlFVSVJZXzM2fSwKKwl7IkhJVEFDSEkiLCAiREY0MDAiLCAiKiIsIEJMSVNUX1NQQVJTRUxVTn0sCisJeyJISVRBQ0hJIiwgIkRGNTAwIiwgIioiLCBCTElTVF9TUEFSU0VMVU59LAorCXsiSElUQUNISSIsICJERjYwMCIsICIqIiwgQkxJU1RfU1BBUlNFTFVOfSwKKwl7IkhQIiwgIkE2MTg5QSIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTiB8IEJMSVNUX0xBUkdFTFVOfSwJLyogSFAgVkE3NDAwICovCisJeyJIUCIsICJPUEVOLSIsICIqIiwgQkxJU1RfU1BBUlNFTFVOIHwgQkxJU1RfTEFSR0VMVU59LCAvKiBIUCBYUCBBcnJheXMgKi8KKwl7IkhQIiwgIk5ldFJBSUQtNE0iLCBOVUxMLCBCTElTVF9GT1JDRUxVTn0sCisJeyJIUCIsICJIU1YxMDAiLCBOVUxMLCBCTElTVF9SRVBPUlRMVU4yIHwgQkxJU1RfTk9TVEFSVE9OQUREfSwKKwl7IkhQIiwgIkMxNTU3QSIsIE5VTEwsIEJMSVNUX0ZPUkNFTFVOfSwKKwl7IkhQIiwgIkMzMzIzLTMwMCIsICI0MjY5IiwgQkxJU1RfTk9UUX0sCisJeyJJQk0iLCAiQXVTYVYxUzIiLCBOVUxMLCBCTElTVF9GT1JDRUxVTn0sCisJeyJJQk0iLCAiUHJvRmlicmUgNDAwMFIiLCAiKiIsIEJMSVNUX1NQQVJTRUxVTiB8IEJMSVNUX0xBUkdFTFVOfSwKKwl7IklCTSIsICIyMTA1IiwgTlVMTCwgQkxJU1RfUkVUUllfSFdFUlJPUn0sCisJeyJpb21lZ2EiLCAiamF6IDFHQiIsICJKLjg2IiwgQkxJU1RfTk9UUSB8IEJMSVNUX05PTFVOfSwKKwl7IklPTUVHQSIsICJJbzIwUyAgICAgICAgICpGIiwgTlVMTCwgQkxJU1RfS0VZfSwKKwl7IklOU0lURSIsICJGbG9wdGljYWwgICBGKjhJIiwgTlVMTCwgQkxJU1RfS0VZfSwKKwl7IklOU0lURSIsICJJMzI1Vk0iLCBOVUxMLCBCTElTVF9LRVl9LAorCXsiaVJpdmVyIiwgImlGUCBNYXNzIERyaXZlciIsIE5VTEwsIEJMSVNUX05PVF9MT0NLQUJMRSB8IEJMSVNUX0lOUVVJUllfMzZ9LAorCXsiTEFTT1VORCIsICJDRFg3NDA1IiwgIjMuMTAiLCBCTElTVF9NQVg1TFVOIHwgQkxJU1RfU0lOR0xFTFVOfSwKKwl7Ik1BVFNISVRBIiwgIlBELTEiLCBOVUxMLCBCTElTVF9GT1JDRUxVTiB8IEJMSVNUX1NJTkdMRUxVTn0sCisJeyJNQVRTSElUQSIsICJETUMtTEM1IiwgTlVMTCwgQkxJU1RfTk9UX0xPQ0tBQkxFIHwgQkxJU1RfSU5RVUlSWV8zNn0sCisJeyJNQVRTSElUQSIsICJETUMtTEM0MCIsIE5VTEwsIEJMSVNUX05PVF9MT0NLQUJMRSB8IEJMSVNUX0lOUVVJUllfMzZ9LAorCXsiTWVkaW9uIiwgIkZsYXNoIFhMICBNTUMvU0QiLCAiMi42RCIsIEJMSVNUX0ZPUkNFTFVOfSwKKwl7Ik1lZ2FSQUlEIiwgIkxEIiwgTlVMTCwgQkxJU1RfRk9SQ0VMVU59LAorCXsiTUlDUk9QIiwgIjQxMTAiLCBOVUxMLCBCTElTVF9OT1RRfSwKKwl7Ik1ZTEVYIiwgIkRBQ0FSTVJCIiwgIioiLCBCTElTVF9SRVBPUlRMVU4yfSwKKwl7Im5DaXBoZXIiLCAiRmFzdG5lc3MgQ3J5cHRvIiwgTlVMTCwgQkxJU1RfRk9SQ0VMVU59LAorCXsiTkFLQU1JQ0giLCAiTUotNC44UyIsIE5VTEwsIEJMSVNUX0ZPUkNFTFVOIHwgQkxJU1RfU0lOR0xFTFVOfSwKKwl7Ik5BS0FNSUNIIiwgIk1KLTUuMTZTIiwgTlVMTCwgQkxJU1RfRk9SQ0VMVU4gfCBCTElTVF9TSU5HTEVMVU59LAorCXsiTkVDIiwgIlBELTEgT0RYNjU0UCIsIE5VTEwsIEJMSVNUX0ZPUkNFTFVOIHwgQkxJU1RfU0lOR0xFTFVOfSwKKwl7Ik5SQyIsICJNQlItNyIsIE5VTEwsIEJMSVNUX0ZPUkNFTFVOIHwgQkxJU1RfU0lOR0xFTFVOfSwKKwl7Ik5SQyIsICJNQlItNy40IiwgTlVMTCwgQkxJU1RfRk9SQ0VMVU4gfCBCTElTVF9TSU5HTEVMVU59LAorCXsiUElPTkVFUiIsICJDRC1ST00gRFJNLTYwMCIsIE5VTEwsIEJMSVNUX0ZPUkNFTFVOIHwgQkxJU1RfU0lOR0xFTFVOfSwKKwl7IlBJT05FRVIiLCAiQ0QtUk9NIERSTS02MDJYIiwgTlVMTCwgQkxJU1RfRk9SQ0VMVU4gfCBCTElTVF9TSU5HTEVMVU59LAorCXsiUElPTkVFUiIsICJDRC1ST00gRFJNLTYwNFgiLCBOVUxMLCBCTElTVF9GT1JDRUxVTiB8IEJMSVNUX1NJTkdMRUxVTn0sCisJeyJSRUdBTCIsICJDREMtNFgiLCBOVUxMLCBCTElTVF9NQVg1TFVOIHwgQkxJU1RfU0lOR0xFTFVOfSwKKwl7IlNhbkRpc2siLCAiSW1hZ2VNYXRlIENGLVNEMSIsIE5VTEwsIEJMSVNUX0ZPUkNFTFVOfSwKKwl7IlNFQUdBVEUiLCAiU1QzNDU1NU4iLCAiMDkzMCIsIEJMSVNUX05PVFF9LAkvKiBDaG9rZXMgb24gdGFnZ2VkIElOUVVJUlkgKi8KKwl7IlNFQUdBVEUiLCAiU1QzMzkwTiIsICI5NTQ2IiwgQkxJU1RfTk9UUX0sCisJeyJTR0kiLCAiUkFJRDMiLCAiKiIsIEJMSVNUX1NQQVJTRUxVTn0sCisJeyJTR0kiLCAiUkFJRDUiLCAiKiIsIEJMSVNUX1NQQVJTRUxVTn0sCisJeyJTR0kiLCAiVFA5MTAwIiwgIioiLCBCTElTVF9SRVBPUlRMVU4yfSwKKwl7IlNHSSIsICJVbml2ZXJzYWwgWHBvcnQiLCAiKiIsIEJMSVNUX05PX1VMRF9BVFRBQ0h9LAorCXsiU01TQyIsICJVU0IgMiBIUy1DRiIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTiB8IEJMSVNUX0lOUVVJUllfMzZ9LAorCXsiU09OWSIsICJDRC1ST00gQ0RVLTgwMDEiLCBOVUxMLCBCTElTVF9CT1JLRU59LAorCXsiU09OWSIsICJUU0wiLCBOVUxMLCBCTElTVF9GT1JDRUxVTn0sCQkvKiBERFMzICYgRERTNCBhdXRvbG9hZGVycyAqLworCXsiU1Q2NTAyMTEiLCAiQ0YiLCBOVUxMLCBCTElTVF9SRVRSWV9IV0VSUk9SfSwKKwl7IlNVTiIsICJUMzAwIiwgIioiLCBCTElTVF9TUEFSU0VMVU59LAorCXsiU1VOIiwgIlQ0IiwgIioiLCBCTElTVF9TUEFSU0VMVU59LAorCXsiVEVYRUwiLCAiQ0QtUk9NIiwgIjEuMDYiLCBCTElTVF9CT1JLRU59LAorCXsiVE9TSElCQSIsICJDRFJPTSIsIE5VTEwsIEJMSVNUX0lTUk9NfSwKKwl7IlRPU0hJQkEiLCAiQ0QtUk9NIiwgTlVMTCwgQkxJU1RfSVNST019LAorCXsiVVNCMi4wIiwgIlNNQVJUTUVESUEvWEQiLCBOVUxMLCBCTElTVF9GT1JDRUxVTiB8IEJMSVNUX0lOUVVJUllfMzZ9LAorCXsiV2FuZ0RBVCIsICJNb2RlbCAyNjAwIiwgIjAxLjciLCBCTElTVF9TRUxFQ1RfTk9fQVROfSwKKwl7IldhbmdEQVQiLCAiTW9kZWwgMzIwMCIsICIwMi4yIiwgQkxJU1RfU0VMRUNUX05PX0FUTn0sCisJeyJXYW5nREFUIiwgIk1vZGVsIDEzMDAiLCAiMDIuNCIsIEJMSVNUX1NFTEVDVF9OT19BVE59LAorCXsiV0RDIFdEMjUiLCAiMDBKQi0wMEZVQTAiLCBOVUxMLCBCTElTVF9OT1JFUE9SVExVTn0sCisJeyJYWVJBVEVYIiwgIlJTIiwgIioiLCBCTElTVF9TUEFSU0VMVU4gfCBCTElTVF9MQVJHRUxVTn0sCisJeyJaenl6eCIsICJSb2NrZXRTdG9yIDUwMFMiLCBOVUxMLCBCTElTVF9TUEFSU0VMVU59LAorCXsiWnp5engiLCAiUm9ja2V0U3RvciAyMDAwIiwgTlVMTCwgQkxJU1RfU1BBUlNFTFVOfSwKKwl7IE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwKK307CisKKy8qCisgKiBzY3NpX3N0cmNweV9kZXZpbmZvOiBjYWxsZWQgZnJvbSBzY3NpX2Rldl9pbmZvX2xpc3RfYWRkIHRvIGNvcHkgaW50bworICogZGV2aW5mbyB2ZW5kb3IgYW5kIG1vZGVsIHN0cmluZ3MuCisgKi8KK3N0YXRpYyB2b2lkIHNjc2lfc3RyY3B5X2RldmluZm8oY2hhciAqbmFtZSwgY2hhciAqdG8sIHNpemVfdCB0b19sZW5ndGgsCisJCQkJY2hhciAqZnJvbSwgaW50IGNvbXBhdGlibGUpCit7CisJc2l6ZV90IGZyb21fbGVuZ3RoOworCisJZnJvbV9sZW5ndGggPSBzdHJsZW4oZnJvbSk7CisJc3RybmNweSh0bywgZnJvbSwgbWluKHRvX2xlbmd0aCwgZnJvbV9sZW5ndGgpKTsKKwlpZiAoZnJvbV9sZW5ndGggPCB0b19sZW5ndGgpIHsKKwkJaWYgKGNvbXBhdGlibGUpIHsKKwkJCS8qCisJCQkgKiBOVUwgdGVybWluYXRlIHRoZSBzdHJpbmcgaWYgaXQgaXMgc2hvcnQuCisJCQkgKi8KKwkJCXRvW2Zyb21fbGVuZ3RoXSA9ICdcMCc7CisJCX0gZWxzZSB7CisJCQkvKiAKKwkJCSAqIHNwYWNlIHBhZCB0aGUgc3RyaW5nIGlmIGl0IGlzIHNob3J0LiAKKwkJCSAqLworCQkJc3RybmNweSgmdG9bZnJvbV9sZW5ndGhdLCBzcGFjZXMsCisJCQkJdG9fbGVuZ3RoIC0gZnJvbV9sZW5ndGgpOworCQl9CisJfQorCWlmIChmcm9tX2xlbmd0aCA+IHRvX2xlbmd0aCkKKwkJIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAlcyBzdHJpbmcgJyVzJyBpcyB0b28gbG9uZ1xuIiwKKwkJCV9fRlVOQ1RJT05fXywgbmFtZSwgZnJvbSk7Cit9CisKKy8qKgorICogc2NzaV9kZXZfaW5mb19saXN0X2FkZDogYWRkIG9uZSBkZXZfaW5mbyBsaXN0IGVudHJ5LgorICogQHZlbmRvcjoJdmVuZG9yIHN0cmluZworICogQG1vZGVsOgltb2RlbCAocHJvZHVjdCkgc3RyaW5nCisgKiBAc3RyZmxhZ3M6CWludGVnZXIgc3RyaW5nCisgKiBAZmxhZzoJaWYgc3RyZmxhZ3MgTlVMTCwgdXNlIHRoaXMgZmxhZyB2YWx1ZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogCUNyZWF0ZSBhbmQgYWRkIG9uZSBkZXZfaW5mbyBlbnRyeSBmb3IgQHZlbmRvciwgQG1vZGVsLCBAc3RyZmxhZ3Mgb3IKKyAqIAlAZmxhZy4gSWYgQGNvbXBhdGlibGUsIGFkZCB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdCwgZG8gbm90IHNwYWNlCisgKiAJcGFkLCBhbmQgc2V0IGRldmluZm8tPmNvbXBhdGlibGUuIFRoZSBzY3NpX3N0YXRpY19kZXZpY2VfbGlzdCBlbnRyaWVzCisgKiAJYXJlIGFkZGVkIHdpdGggQGNvbXBhdGlibGUgMSBhbmQgQGNsZmFncyBOVUxMLgorICoKKyAqIFJldHVybnM6IDAgT0ssIC1lcnJvciBvbiBmYWlsdXJlLgorICoqLworc3RhdGljIGludCBzY3NpX2Rldl9pbmZvX2xpc3RfYWRkKGludCBjb21wYXRpYmxlLCBjaGFyICp2ZW5kb3IsIGNoYXIgKm1vZGVsLAorCQkJICAgIGNoYXIgKnN0cmZsYWdzLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNjc2lfZGV2X2luZm9fbGlzdCAqZGV2aW5mbzsKKworCWRldmluZm8gPSBrbWFsbG9jKHNpemVvZigqZGV2aW5mbyksIEdGUF9LRVJORUwpOworCWlmICghZGV2aW5mbykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNjc2lfc3RyY3B5X2RldmluZm8oInZlbmRvciIsIGRldmluZm8tPnZlbmRvciwgc2l6ZW9mKGRldmluZm8tPnZlbmRvciksCisJCQkgICAgdmVuZG9yLCBjb21wYXRpYmxlKTsKKwlzY3NpX3N0cmNweV9kZXZpbmZvKCJtb2RlbCIsIGRldmluZm8tPm1vZGVsLCBzaXplb2YoZGV2aW5mby0+bW9kZWwpLAorCQkJICAgIG1vZGVsLCBjb21wYXRpYmxlKTsKKworCWlmIChzdHJmbGFncykKKwkJZGV2aW5mby0+ZmxhZ3MgPSBzaW1wbGVfc3RydG91bChzdHJmbGFncywgTlVMTCwgMCk7CisJZWxzZQorCQlkZXZpbmZvLT5mbGFncyA9IGZsYWdzOworCisJZGV2aW5mby0+Y29tcGF0aWJsZSA9IGNvbXBhdGlibGU7CisKKwlpZiAoY29tcGF0aWJsZSkKKwkJbGlzdF9hZGRfdGFpbCgmZGV2aW5mby0+ZGV2X2luZm9fbGlzdCwgJnNjc2lfZGV2X2luZm9fbGlzdCk7CisJZWxzZQorCQlsaXN0X2FkZCgmZGV2aW5mby0+ZGV2X2luZm9fbGlzdCwgJnNjc2lfZGV2X2luZm9fbGlzdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzY3NpX2Rldl9pbmZvX2xpc3RfYWRkX3N0cjogcGFyc2UgZGV2X2xpc3QgYW5kIGFkZCB0byB0aGUKKyAqIHNjc2lfZGV2X2luZm9fbGlzdC4KKyAqIEBkZXZfbGlzdDoJc3RyaW5nIG9mIGRldmljZSBmbGFncyB0byBhZGQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIAlQYXJzZSBkZXZfbGlzdCwgYW5kIGFkZCBlbnRyaWVzIHRvIHRoZSBzY3NpX2Rldl9pbmZvX2xpc3QuCisgKiAJZGV2X2xpc3QgaXMgb2YgdGhlIGZvcm0gInZlbmRvcjpwcm9kdWN0OmZsYWcsdmVuZG9yOnByb2R1Y3Q6ZmxhZyIuCisgKiAJZGV2X2xpc3QgaXMgbW9kaWZpZWQgdmlhIHN0cnNlcC4gQ2FuIGJlIGNhbGxlZCBmb3IgY29tbWFuZCBsaW5lCisgKiAJYWRkaXRpb24sIGZvciBwcm9jIG9yIG1hYnllIGEgc3lzZnMgaW50ZXJmYWNlLgorICoKKyAqIFJldHVybnM6IDAgaWYgT0ssIC1lcnJvciBvbiBmYWlsdXJlLgorICoqLworc3RhdGljIGludCBzY3NpX2Rldl9pbmZvX2xpc3RfYWRkX3N0cihjaGFyICpkZXZfbGlzdCkKK3sKKwljaGFyICp2ZW5kb3IsICptb2RlbCwgKnN0cmZsYWdzLCAqbmV4dDsKKwljaGFyICpuZXh0X2NoZWNrOworCWludCByZXMgPSAwOworCisJbmV4dCA9IGRldl9saXN0OworCWlmIChuZXh0ICYmIG5leHRbMF0gPT0gJyInKSB7CisJCS8qCisJCSAqIElnbm9yZSBib3RoIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBxdW90ZS4KKwkJICovCisJCW5leHQrKzsKKwkJbmV4dF9jaGVjayA9ICIsXCIiOworCX0gZWxzZSB7CisJCW5leHRfY2hlY2sgPSAiLCI7CisJfQorCisJLyoKKwkgKiBGb3IgdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nICciJyBjYXNlLCB0aGUgZm9yIGxvb3AgY29tZXMKKwkgKiB0aHJvdWdoIHRoZSBsYXN0IHRpbWUgd2l0aCB2ZW5kb3JbMF0gPT0gJ1wwJy4KKwkgKi8KKwlmb3IgKHZlbmRvciA9IHN0cnNlcCgmbmV4dCwgIjoiKTsgdmVuZG9yICYmICh2ZW5kb3JbMF0gIT0gJ1wwJykKKwkgICAgICYmIChyZXMgPT0gMCk7IHZlbmRvciA9IHN0cnNlcCgmbmV4dCwgIjoiKSkgeworCQlzdHJmbGFncyA9IE5VTEw7CisJCW1vZGVsID0gc3Ryc2VwKCZuZXh0LCAiOiIpOworCQlpZiAobW9kZWwpCisJCQlzdHJmbGFncyA9IHN0cnNlcCgmbmV4dCwgbmV4dF9jaGVjayk7CisJCWlmICghbW9kZWwgfHwgIXN0cmZsYWdzKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBiYWQgZGV2IGluZm8gc3RyaW5nICclcycgJyVzJyIKKwkJCSAgICAgICAiICclcydcbiIsIF9fRlVOQ1RJT05fXywgdmVuZG9yLCBtb2RlbCwKKwkJCSAgICAgICBzdHJmbGFncyk7CisJCQlyZXMgPSAtRUlOVkFMOworCQl9IGVsc2UKKwkJCXJlcyA9IHNjc2lfZGV2X2luZm9fbGlzdF9hZGQoMCAvKiBjb21wYXRpYmxlICovLCB2ZW5kb3IsCisJCQkJCQkgICAgIG1vZGVsLCBzdHJmbGFncywgMCk7CisJfQorCXJldHVybiByZXM7Cit9CisKKy8qKgorICogZ2V0X2RldmljZV9mbGFncyAtIGdldCBkZXZpY2Ugc3BlY2lmaWMgZmxhZ3MgZnJvbSB0aGUgZHluYW1pYyBkZXZpY2UKKyAqIGxpc3QuIENhbGxlZCBkdXJpbmcgc2NhbiB0aW1lLgorICogQHZlbmRvcjoJdmVuZG9yIG5hbWUKKyAqIEBtb2RlbDoJbW9kZWwgbmFtZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIFNlYXJjaCB0aGUgc2NzaV9kZXZfaW5mb19saXN0IGZvciBhbiBlbnRyeSBtYXRjaGluZyBAdmVuZG9yIGFuZAorICogICAgIEBtb2RlbCwgaWYgZm91bmQsIHJldHVybiB0aGUgbWF0Y2hpbmcgZmxhZ3MgdmFsdWUsIGVsc2UgcmV0dXJuCisgKiAgICAgdGhlIGhvc3Qgb3IgZ2xvYmFsIGRlZmF1bHQgc2V0dGluZ3MuCisgKiovCitpbnQgc2NzaV9nZXRfZGV2aWNlX2ZsYWdzKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgdW5zaWduZWQgY2hhciAqdmVuZG9yLAorCQkJICB1bnNpZ25lZCBjaGFyICptb2RlbCkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZfaW5mb19saXN0ICpkZXZpbmZvOworCXVuc2lnbmVkIGludCBiZmxhZ3M7CisKKwliZmxhZ3MgPSBzZGV2LT5zZGV2X2JmbGFnczsKKwlpZiAoIWJmbGFncykKKwkJYmZsYWdzID0gc2NzaV9kZWZhdWx0X2Rldl9mbGFnczsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aW5mbywgJnNjc2lfZGV2X2luZm9fbGlzdCwgZGV2X2luZm9fbGlzdCkgeworCQlpZiAoZGV2aW5mby0+Y29tcGF0aWJsZSkgeworCQkJLyoKKwkJCSAqIEJlaGF2ZSBsaWtlIHRoZSBvbGRlciB2ZXJzaW9uIG9mIGdldF9kZXZpY2VfZmxhZ3MuCisJCQkgKi8KKwkJCXNpemVfdCBtYXg7CisJCQkvKgorCQkJICogWFhYIHdoeSBza2lwIGxlYWRpbmcgc3BhY2VzPyBJZiBhbiBvZGQgSU5RVUlSWQorCQkJICogdmFsdWUsIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBwYXJ0IG9mIHRoZQorCQkJICogc2NzaV9zdGF0aWNfZGV2aWNlX2xpc3RbXSBlbnRyeSwgc3VjaCBhcyAiICBGT08iCisJCQkgKiByYXRoZXIgdGhhbiAiRk9PIi4gU2luY2UgdGhpcyBjb2RlIGlzIGFscmVhZHkKKwkJCSAqIGhlcmUsIGFuZCB3ZSBkb24ndCBrbm93IHdoYXQgZGV2aWNlIGl0IGlzCisJCQkgKiB0cnlpbmcgdG8gd29yayB3aXRoLCBsZWF2ZSBpdCBhcy1pcy4KKwkJCSAqLworCQkJbWF4ID0gODsJLyogbWF4IGxlbmd0aCBvZiB2ZW5kb3IgKi8KKwkJCXdoaWxlICgobWF4ID4gMCkgJiYgKnZlbmRvciA9PSAnICcpIHsKKwkJCQltYXgtLTsKKwkJCQl2ZW5kb3IrKzsKKwkJCX0KKwkJCS8qCisJCQkgKiBYWFggcmVtb3ZpbmcgdGhlIGZvbGxvd2luZyBzdHJsZW4oKSB3b3VsZCBiZQorCQkJICogZ29vZCwgdXNpbmcgaXQgbWVhbnMgdGhhdCBmb3IgYSBhbiBlbnRyeSBub3QgaW4KKwkJCSAqIHRoZSBsaXN0LCB3ZSBzY2FuIGV2ZXJ5IGJ5dGUgb2YgZXZlcnkgdmVuZG9yCisJCQkgKiBsaXN0ZWQgaW4gc2NzaV9zdGF0aWNfZGV2aWNlX2xpc3RbXSwgYW5kIG5ldmVyIG1hdGNoCisJCQkgKiBhIHNpbmdsZSBvbmUgKGFuZCBzdGlsbCBoYXZlIHRvIGNvbXBhcmUgYXQKKwkJCSAqIGxlYXN0IHRoZSBmaXJzdCBieXRlIG9mIGVhY2ggdmVuZG9yKS4KKwkJCSAqLworCQkJaWYgKG1lbWNtcChkZXZpbmZvLT52ZW5kb3IsIHZlbmRvciwKKwkJCQkgICAgbWluKG1heCwgc3RybGVuKGRldmluZm8tPnZlbmRvcikpKSkKKwkJCQljb250aW51ZTsKKwkJCS8qCisJCQkgKiBTa2lwIHNwYWNlcyBhZ2Fpbi4KKwkJCSAqLworCQkJbWF4ID0gMTY7CS8qIG1heCBsZW5ndGggb2YgbW9kZWwgKi8KKwkJCXdoaWxlICgobWF4ID4gMCkgJiYgKm1vZGVsID09ICcgJykgeworCQkJCW1heC0tOworCQkJCW1vZGVsKys7CisJCQl9CisJCQlpZiAobWVtY21wKGRldmluZm8tPm1vZGVsLCBtb2RlbCwKKwkJCQkgICBtaW4obWF4LCBzdHJsZW4oZGV2aW5mby0+bW9kZWwpKSkpCisJCQkJY29udGludWU7CisJCQlyZXR1cm4gZGV2aW5mby0+ZmxhZ3M7CisJCX0gZWxzZSB7CisJCQlpZiAoIW1lbWNtcChkZXZpbmZvLT52ZW5kb3IsIHZlbmRvciwKKwkJCQkgICAgIHNpemVvZihkZXZpbmZvLT52ZW5kb3IpKSAmJgorCQkJICAgICAhbWVtY21wKGRldmluZm8tPm1vZGVsLCBtb2RlbCwKKwkJCQkgICAgICBzaXplb2YoZGV2aW5mby0+bW9kZWwpKSkKKwkJCQlyZXR1cm4gZGV2aW5mby0+ZmxhZ3M7CisJCX0KKwl9CisJcmV0dXJuIGJmbGFnczsKK30KKworI2lmZGVmIENPTkZJR19TQ1NJX1BST0NfRlMKKy8qIAorICogcHJvY19zY3NpX2Rldl9pbmZvX3JlYWQ6IGR1bXAgdGhlIHNjc2lfZGV2X2luZm9fbGlzdCB2aWEKKyAqIC9wcm9jL3Njc2kvZGV2aWNlX2luZm8KKyAqLworc3RhdGljIGludCBwcm9jX3Njc2lfZGV2aW5mb19yZWFkKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LAorCQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBzY3NpX2Rldl9pbmZvX2xpc3QgKmRldmluZm87CisJaW50IHNpemUsIGxlbiA9IDA7CisJb2ZmX3QgYmVnaW4gPSAwOworCW9mZl90IHBvcyA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmluZm8sICZzY3NpX2Rldl9pbmZvX2xpc3QsIGRldl9pbmZvX2xpc3QpIHsKKwkJc2l6ZSA9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiJyUuOHMnICclLjE2cycgMHgleFxuIiwKKwkJCWRldmluZm8tPnZlbmRvciwgZGV2aW5mby0+bW9kZWwsIGRldmluZm8tPmZsYWdzKTsKKwkJbGVuICs9IHNpemU7CisJCXBvcyA9IGJlZ2luICsgbGVuOworCQlpZiAocG9zIDwgb2Zmc2V0KSB7CisJCQlsZW4gPSAwOworCQkJYmVnaW4gPSBwb3M7CisJCX0KKwkJaWYgKHBvcyA+IG9mZnNldCArIGxlbmd0aCkKKwkJCWdvdG8gc3RvcF9vdXRwdXQ7CisJfQorCitzdG9wX291dHB1dDoKKwkqc3RhcnQgPSBidWZmZXIgKyAob2Zmc2V0IC0gYmVnaW4pOwkvKiBTdGFydCBvZiB3YW50ZWQgZGF0YSAqLworCWxlbiAtPSAob2Zmc2V0IC0gYmVnaW4pOwkvKiBTdGFydCBzbG9wICovCisJaWYgKGxlbiA+IGxlbmd0aCkKKwkJbGVuID0gbGVuZ3RoOwkvKiBFbmRpbmcgc2xvcCAqLworCXJldHVybiAobGVuKTsKK30KKworLyogCisgKiBwcm9jX3Njc2lfZGV2X2luZm9fd3JpdGU6IGFsbG93IGFkZGl0aW9ucyB0byB0aGUgc2NzaV9kZXZfaW5mb19saXN0IHZpYQorICogL3Byb2MuCisgKgorICogVXNlOiBlY2hvICJ2ZW5kb3I6bW9kZWw6ZmxhZyIgPiAvcHJvYy9zY3NpL2RldmljZV9pbmZvCisgKgorICogVG8gYWRkIGEgYmxhY2svd2hpdGUgbGlzdCBlbnRyeSBmb3IgdmVuZG9yIGFuZCBtb2RlbCB3aXRoIGFuIGludGVnZXIKKyAqIHZhbHVlIG9mIGZsYWcgdG8gdGhlIHNjc2kgZGV2aWNlIGluZm8gbGlzdC4KKyAqLworc3RhdGljIGludCBwcm9jX3Njc2lfZGV2aW5mb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGxlbmd0aCwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpidWZmZXI7CisJaW50IGVyciA9IGxlbmd0aDsKKworCWlmICghYnVmIHx8IGxlbmd0aD5QQUdFX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghKGJ1ZmZlciA9IChjaGFyICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChjb3B5X2Zyb21fdXNlcihidWZmZXIsIGJ1ZiwgbGVuZ3RoKSkgeworCQllcnIgPS1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChsZW5ndGggPCBQQUdFX1NJWkUpCisJCWJ1ZmZlcltsZW5ndGhdID0gJ1wwJzsKKwllbHNlIGlmIChidWZmZXJbUEFHRV9TSVpFLTFdKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXNjc2lfZGV2X2luZm9fbGlzdF9hZGRfc3RyKGJ1ZmZlcik7CisKK291dDoKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmZmVyKTsKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmIC8qIENPTkZJR19TQ1NJX1BST0NfRlMgKi8KKworbW9kdWxlX3BhcmFtX3N0cmluZyhkZXZfZmxhZ3MsIHNjc2lfZGV2X2ZsYWdzLCBzaXplb2Yoc2NzaV9kZXZfZmxhZ3MpLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2X2ZsYWdzLAorCSAiR2l2ZW4gc2NzaV9kZXZfZmxhZ3M9dmVuZG9yOm1vZGVsOmZsYWdzWyx2Om06Zl0gYWRkIGJsYWNrL3doaXRlIgorCSAiIGxpc3QgZW50cmllcyBmb3IgdmVuZG9yIGFuZCBtb2RlbCB3aXRoIGFuIGludGVnZXIgdmFsdWUgb2YgZmxhZ3MiCisJICIgdG8gdGhlIHNjc2kgZGV2aWNlIGluZm8gbGlzdCIpOworCittb2R1bGVfcGFyYW1fbmFtZWQoZGVmYXVsdF9kZXZfZmxhZ3MsIHNjc2lfZGVmYXVsdF9kZXZfZmxhZ3MsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVmYXVsdF9kZXZfZmxhZ3MsCisJCSAic2NzaSBkZWZhdWx0IGRldmljZSBmbGFnIGludGVnZXIgdmFsdWUiKTsKKworLyoqCisgKiBzY3NpX2Rldl9pbmZvX2xpc3RfZGVsZXRlOiBjYWxsZWQgZnJvbSBzY3NpLmM6ZXhpdF9zY3NpIHRvIHJlbW92ZQorICogCXRoZSBzY3NpX2Rldl9pbmZvX2xpc3QuCisgKiovCit2b2lkIHNjc2lfZXhpdF9kZXZpbmZvKHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGgsICpsaF9uZXh0OworCXN0cnVjdCBzY3NpX2Rldl9pbmZvX2xpc3QgKmRldmluZm87CisKKyNpZmRlZiBDT05GSUdfU0NTSV9QUk9DX0ZTCisJcmVtb3ZlX3Byb2NfZW50cnkoInNjc2kvZGV2aWNlX2luZm8iLCBOVUxMKTsKKyNlbmRpZgorCisJbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBsaF9uZXh0LCAmc2NzaV9kZXZfaW5mb19saXN0KSB7CisJCWRldmluZm8gPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3Qgc2NzaV9kZXZfaW5mb19saXN0LAorCQkJCSAgICAgZGV2X2luZm9fbGlzdCk7CisJCWtmcmVlKGRldmluZm8pOworCX0KK30KKworLyoqCisgKiBzY3NpX2Rldl9saXN0X2luaXQ6IHNldCB1cCB0aGUgZHluYW1pYyBkZXZpY2UgbGlzdC4KKyAqIEBkZXZfbGlzdDoJc3RyaW5nIG9mIGRldmljZSBmbGFncyB0byBhZGQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIAlBZGQgY29tbWFuZCBsaW5lIEBkZXZfbGlzdCBlbnRyaWVzLCB0aGVuIGFkZAorICogCXNjc2lfc3RhdGljX2RldmljZV9saXN0IGVudHJpZXMgdG8gdGhlIHNjc2kgZGV2aWNlIGluZm8gbGlzdC4KKyAqKi8KK2ludCBfX2luaXQgc2NzaV9pbml0X2RldmluZm8odm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfU0NTSV9QUk9DX0ZTCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwOworI2VuZGlmCisJaW50IGVycm9yLCBpOworCisJZXJyb3IgPSBzY3NpX2Rldl9pbmZvX2xpc3RfYWRkX3N0cihzY3NpX2Rldl9mbGFncyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlmb3IgKGkgPSAwOyBzY3NpX3N0YXRpY19kZXZpY2VfbGlzdFtpXS52ZW5kb3I7IGkrKykgeworCQllcnJvciA9IHNjc2lfZGV2X2luZm9fbGlzdF9hZGQoMSAvKiBjb21wYXRpYmlsZSAqLywKKwkJCQlzY3NpX3N0YXRpY19kZXZpY2VfbGlzdFtpXS52ZW5kb3IsCisJCQkJc2NzaV9zdGF0aWNfZGV2aWNlX2xpc3RbaV0ubW9kZWwsCisJCQkJTlVMTCwKKwkJCQlzY3NpX3N0YXRpY19kZXZpY2VfbGlzdFtpXS5mbGFncyk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCX0KKworI2lmZGVmIENPTkZJR19TQ1NJX1BST0NfRlMKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoInNjc2kvZGV2aWNlX2luZm8iLCAwLCBOVUxMKTsKKwlpZiAoIXApIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlwLT5vd25lciA9IFRISVNfTU9EVUxFOworCXAtPmdldF9pbmZvID0gcHJvY19zY3NpX2RldmluZm9fcmVhZDsKKwlwLT53cml0ZV9wcm9jID0gcHJvY19zY3NpX2RldmluZm9fd3JpdGU7CisjZW5kaWYgLyogQ09ORklHX1NDU0lfUFJPQ19GUyAqLworCisgb3V0OgorCWlmIChlcnJvcikKKwkJc2NzaV9leGl0X2RldmluZm8oKTsKKwlyZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jIGIvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmM1OTdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwpAQCAtMCwwICsxLDIwNTAgQEAKKy8qCisgKiAgc2NzaV9lcnJvci5jIENvcHlyaWdodCAoQykgMTk5NyBFcmljIFlvdW5nZGFsZQorICoKKyAqICBTQ1NJIGVycm9yL3RpbWVvdXQgaGFuZGxpbmcKKyAqICAgICAgSW5pdGlhbCB2ZXJzaW9uczogRXJpYyBZb3VuZ2RhbGUuICBCYXNlZCB1cG9uIGNvbnZlcnNhdGlvbnMgd2l0aAorICogICAgICAgICAgICAgICAgICAgICAgICBMZW9uYXJkIFp1YmtvZmYgYW5kIERhdmlkIE1pbGxlciBhdCBMaW51eCBFeHBvLCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgaWRlYXMgb3JpZ2luYXRpbmcgZnJvbSBhbGwgb3ZlciB0aGUgcGxhY2UuCisgKgorICoJUmVzdHJ1Y3R1cmVkIHNjc2lfdW5qYW1faG9zdCBhbmQgYXNzb2NpYXRlZCBmdW5jdGlvbnMuCisgKglTZXB0ZW1iZXIgMDQsIDIwMDIgTWlrZSBBbmRlcnNvbiAoYW5kbWlrZUB1cy5pYm0uY29tKQorICoKKyAqCUZvcndhcmQgcG9ydCBvZiBSdXNzZWxsIEtpbmcncyAocm1rQGFybS5saW51eC5vcmcudWspIGNoYW5nZXMgYW5kCisgKgltaW5vciAgY2xlYW51cHMuCisgKglTZXB0ZW1iZXIgMzAsIDIwMDIgTWlrZSBBbmRlcnNvbiAoYW5kbWlrZUB1cy5pYm0uY29tKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGJnLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3JlcXVlc3QuaD4KKworI2luY2x1ZGUgInNjc2lfcHJpdi5oIgorI2luY2x1ZGUgInNjc2lfbG9nZ2luZy5oIgorCisjZGVmaW5lIFNFTlNFX1RJTUVPVVQJCSgxMCpIWikKKyNkZWZpbmUgU1RBUlRfVU5JVF9USU1FT1VUCSgzMCpIWikKKworLyoKKyAqIFRoZXNlIHNob3VsZCAqcHJvYmFibHkqIGJlIGhhbmRsZWQgYnkgdGhlIGhvc3QgaXRzZWxmLgorICogU2luY2UgaXQgaXMgYWxsb3dlZCB0byBzbGVlcCwgaXQgcHJvYmFibHkgc2hvdWxkLgorICovCisjZGVmaW5lIEJVU19SRVNFVF9TRVRUTEVfVElNRSAgICgxMCkKKyNkZWZpbmUgSE9TVF9SRVNFVF9TRVRUTEVfVElNRSAgKDEwKQorCisvKiBjYWxsZWQgd2l0aCBzaG9zdC0+aG9zdF9sb2NrIGhlbGQgKi8KK3ZvaWQgc2NzaV9laF93YWtldXAoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJaWYgKHNob3N0LT5ob3N0X2J1c3kgPT0gc2hvc3QtPmhvc3RfZmFpbGVkKSB7CisJCXVwKHNob3N0LT5laF93YWl0KTsKKwkJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoNSwKKwkJCQlwcmludGsoIldha2luZyBlcnJvciBoYW5kbGVyIHRocmVhZFxuIikpOworCX0KK30KKworLyoqCisgKiBzY3NpX2VoX3NjbWRfYWRkIC0gYWRkIHNjc2kgY21kIHRvIGVycm9yIGhhbmRsaW5nLgorICogQHNjbWQ6CXNjbWQgdG8gcnVuIGVoIG9uLgorICogQGVoX2ZsYWc6CW9wdGlvbmFsIFNDU0lfRUggZmxhZy4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKgkwIG9uIGZhaWx1cmUuCisgKiovCitpbnQgc2NzaV9laF9zY21kX2FkZChzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kLCBpbnQgZWhfZmxhZykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHNjbWQtPmRldmljZS0+aG9zdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNob3N0LT5laF93YWl0ID09IE5VTEwpCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJc2NzaV9laF9lZmxhZ3Nfc2V0KHNjbWQsIGVoX2ZsYWcpOworCS8qCisJICogRklYTUU6IENhbiB3ZSBzdG9wIHNldHRpbmcgb3duZXIgYW5kIHN0YXRlLgorCSAqLworCXNjbWQtPm93bmVyID0gU0NTSV9PV05FUl9FUlJPUl9IQU5ETEVSOworCXNjbWQtPnN0YXRlID0gU0NTSV9TVEFURV9GQUlMRUQ7CisJLyoKKwkgKiBTZXQgdGhlIHNlcmlhbF9udW1iZXJfYXRfdGltZW91dCB0byB0aGUgY3VycmVudAorCSAqIHNlcmlhbF9udW1iZXIKKwkgKi8KKwlzY21kLT5zZXJpYWxfbnVtYmVyX2F0X3RpbWVvdXQgPSBzY21kLT5zZXJpYWxfbnVtYmVyOworCWxpc3RfYWRkX3RhaWwoJnNjbWQtPmVoX2VudHJ5LCAmc2hvc3QtPmVoX2NtZF9xKTsKKwlzZXRfYml0KFNIT1NUX1JFQ09WRVJZLCAmc2hvc3QtPnNob3N0X3N0YXRlKTsKKwlzaG9zdC0+aG9zdF9mYWlsZWQrKzsKKwlzY3NpX2VoX3dha2V1cChzaG9zdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogc2NzaV9hZGRfdGltZXIgLSBTdGFydCB0aW1lb3V0IHRpbWVyIGZvciBhIHNpbmdsZSBzY3NpIGNvbW1hbmQuCisgKiBAc2NtZDoJc2NzaSBjb21tYW5kIHRoYXQgaXMgYWJvdXQgdG8gc3RhcnQgcnVubmluZy4KKyAqIEB0aW1lb3V0OglhbW91bnQgb2YgdGltZSB0byBhbGxvdyB0aGlzIGNvbW1hbmQgdG8gcnVuLgorICogQGNvbXBsZXRlOgl0aW1lb3V0IGZ1bmN0aW9uIHRvIGNhbGwgaWYgdGltZXIgaXNuJ3QgY2FuY2VsZWQuCisgKgorICogTm90ZXM6CisgKiAgICBUaGlzIHNob3VsZCBiZSB0dXJuZWQgaW50byBhbiBpbmxpbmUgZnVuY3Rpb24uICBFYWNoIHNjc2kgY29tbWFuZAorICogICAgaGFzIGl0cyBvd24gdGltZXIsIGFuZCBhcyBpdCBpcyBhZGRlZCB0byB0aGUgcXVldWUsIHdlIHNldCB1cCB0aGUKKyAqICAgIHRpbWVyLiAgV2hlbiB0aGUgY29tbWFuZCBjb21wbGV0ZXMsIHdlIGNhbmNlbCB0aGUgdGltZXIuCisgKiovCit2b2lkIHNjc2lfYWRkX3RpbWVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQsIGludCB0aW1lb3V0LAorCQkgICAgdm9pZCAoKmNvbXBsZXRlKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCisJLyoKKwkgKiBJZiB0aGUgY2xvY2sgd2FzIGFscmVhZHkgcnVubmluZyBmb3IgdGhpcyBjb21tYW5kLCB0aGVuCisJICogZmlyc3QgZGVsZXRlIHRoZSB0aW1lci4gIFRoZSB0aW1lciBoYW5kbGluZyBjb2RlIGdldHMgcmF0aGVyCisJICogY29uZnVzZWQgaWYgd2UgZG9uJ3QgZG8gdGhpcy4KKwkgKi8KKwlpZiAoc2NtZC0+ZWhfdGltZW91dC5mdW5jdGlvbikKKwkJZGVsX3RpbWVyKCZzY21kLT5laF90aW1lb3V0KTsKKworCXNjbWQtPmVoX3RpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNjbWQ7CisJc2NtZC0+ZWhfdGltZW91dC5leHBpcmVzID0gamlmZmllcyArIHRpbWVvdXQ7CisJc2NtZC0+ZWhfdGltZW91dC5mdW5jdGlvbiA9ICh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSkgY29tcGxldGU7CisKKwlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSg1LCBwcmludGsoIiVzOiBzY21kOiAlcCwgdGltZToiCisJCQkJCSAgIiAlZCwgKCVwKVxuIiwgX19GVU5DVElPTl9fLAorCQkJCQkgIHNjbWQsIHRpbWVvdXQsIGNvbXBsZXRlKSk7CisKKwlhZGRfdGltZXIoJnNjbWQtPmVoX3RpbWVvdXQpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX2FkZF90aW1lcik7CisKKy8qKgorICogc2NzaV9kZWxldGVfdGltZXIgLSBEZWxldGUvY2FuY2VsIHRpbWVyIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgorICogQHNjbWQ6CUNtZCB0aGF0IHdlIGFyZSBjYW5jZWxpbmcgdGltZXIgZm9yCisgKgorICogTm90ZXM6CisgKiAgICAgVGhpcyBzaG91bGQgYmUgdHVybmVkIGludG8gYW4gaW5saW5lIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqICAgICAxIGlmIHdlIHdlcmUgYWJsZSB0byBkZXRhY2ggdGhlIHRpbWVyLiAgMCBpZiB3ZSBibGV3IGl0LCBhbmQgdGhlCisgKiAgICAgdGltZXIgZnVuY3Rpb24gaGFzIGFscmVhZHkgc3RhcnRlZCB0byBydW4uCisgKiovCitpbnQgc2NzaV9kZWxldGVfdGltZXIoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK3sKKwlpbnQgcnRuOworCisJcnRuID0gZGVsX3RpbWVyKCZzY21kLT5laF90aW1lb3V0KTsKKworCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDUsIHByaW50aygiJXM6IHNjbWQ6ICVwLCIKKwkJCQkJICIgcnRuOiAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkJCQkgc2NtZCwgcnRuKSk7CisKKwlzY21kLT5laF90aW1lb3V0LmRhdGEgPSAodW5zaWduZWQgbG9uZylOVUxMOworCXNjbWQtPmVoX3RpbWVvdXQuZnVuY3Rpb24gPSBOVUxMOworCisJcmV0dXJuIHJ0bjsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9kZWxldGVfdGltZXIpOworCisvKioKKyAqIHNjc2lfdGltZXNfb3V0IC0gVGltZW91dCBmdW5jdGlvbiBmb3Igbm9ybWFsIHNjc2kgY29tbWFuZHMuCisgKiBAc2NtZDoJQ21kIHRoYXQgaXMgdGltaW5nIG91dC4KKyAqCisgKiBOb3RlczoKKyAqICAgICBXZSBkbyBub3QgbmVlZCB0byBsb2NrIHRoaXMuICBUaGVyZSBpcyB0aGUgcG90ZW50aWFsIGZvciBhIHJhY2UKKyAqICAgICBvbmx5IGluIHRoYXQgdGhlIG5vcm1hbCBjb21wbGV0aW9uIGhhbmRsaW5nIG1pZ2h0IHJ1biwgYnV0IGlmIHRoZQorICogICAgIG5vcm1hbCBjb21wbGV0aW9uIGZ1bmN0aW9uIGRldGVybWluZXMgdGhhdCB0aGUgdGltZXIgaGFzIGFscmVhZHkKKyAqICAgICBmaXJlZCwgdGhlbiBpdCBtdXN0bid0IGRvIGFueXRoaW5nLgorICoqLwordm9pZCBzY3NpX3RpbWVzX291dChzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQoreworCXNjc2lfbG9nX2NvbXBsZXRpb24oc2NtZCwgVElNRU9VVF9FUlJPUik7CisKKwlpZiAoc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0dC0+ZWhfdGltZWRfb3V0KQorCQlzd2l0Y2ggKHNjbWQtPmRldmljZS0+aG9zdC0+aG9zdHQtPmVoX3RpbWVkX291dChzY21kKSkgeworCQljYXNlIEVIX0hBTkRMRUQ6CisJCQlfX3Njc2lfZG9uZShzY21kKTsKKwkJCXJldHVybjsKKwkJY2FzZSBFSF9SRVNFVF9USU1FUjoKKwkJCS8qIFRoaXMgYWxsb3dzIGEgc2luZ2xlIHJldHJ5IGV2ZW4gb2YgYSBjb21tYW5kCisJCQkgKiB3aXRoIGFsbG93ZWQgPT0gMCAqLworCQkJaWYgKHNjbWQtPnJldHJpZXMrKyA+IHNjbWQtPmFsbG93ZWQpCisJCQkJYnJlYWs7CisJCQlzY3NpX2FkZF90aW1lcihzY21kLCBzY21kLT50aW1lb3V0X3Blcl9jb21tYW5kLAorCQkJCSAgICAgICBzY3NpX3RpbWVzX291dCk7CisJCQlyZXR1cm47CisJCWNhc2UgRUhfTk9UX0hBTkRMRUQ6CisJCQlicmVhazsKKwkJfQorCisJaWYgKHVubGlrZWx5KCFzY3NpX2VoX3NjbWRfYWRkKHNjbWQsIFNDU0lfRUhfQ0FOQ0VMX0NNRCkpKSB7CisJCXBhbmljKCJFcnJvciBoYW5kbGVyIHRocmVhZCBub3QgcHJlc2VudCBhdCAlcCAlcCAlcyAlZCIsCisJCSAgICAgIHNjbWQsIHNjbWQtPmRldmljZS0+aG9zdCwgX19GSUxFX18sIF9fTElORV9fKTsKKwl9Cit9CisKKy8qKgorICogc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzIC0gUHJldmVudCBjbWRzIGZyb20gYmVpbmcgcXVldWVkLgorICogQHNkZXY6CURldmljZSBvbiB3aGljaCB3ZSBhcmUgcGVyZm9ybWluZyByZWNvdmVyeS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgICBXZSBibG9jayB1bnRpbCB0aGUgaG9zdCBpcyBvdXQgb2YgZXJyb3IgcmVjb3ZlcnksIGFuZCB0aGVuIGNoZWNrIHRvCisgKiAgICAgc2VlIHdoZXRoZXIgdGhlIGhvc3Qgb3IgdGhlIGRldmljZSBpcyBvZmZsaW5lLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqICAgICAwIHdoZW4gZGV2IHdhcyB0YWtlbiBvZmZsaW5lIGJ5IGVycm9yIHJlY292ZXJ5LiAxIE9LIHRvIHByb2NlZWQuCisgKiovCitpbnQgc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlpbnQgb25saW5lOworCisJd2FpdF9ldmVudChzZGV2LT5ob3N0LT5ob3N0X3dhaXQsICghdGVzdF9iaXQoU0hPU1RfUkVDT1ZFUlksICZzZGV2LT5ob3N0LT5zaG9zdF9zdGF0ZSkpKTsKKworCW9ubGluZSA9IHNjc2lfZGV2aWNlX29ubGluZShzZGV2KTsKKworCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDUsIHByaW50aygiJXM6IHJ0bjogJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkJICBvbmxpbmUpKTsKKworCXJldHVybiBvbmxpbmU7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyk7CisKKyNpZmRlZiBDT05GSUdfU0NTSV9MT0dHSU5HCisvKioKKyAqIHNjc2lfZWhfcHJ0X2ZhaWxfc3RhdHMgLSBMb2cgaW5mbyBvbiBmYWlsdXJlcy4KKyAqIEBzaG9zdDoJc2NzaSBob3N0IGJlaW5nIHJlY292ZXJlZC4KKyAqIEB3b3JrX3E6CVF1ZXVlIG9mIHNjc2kgY21kcyB0byBwcm9jZXNzLgorICoqLworc3RhdGljIGlubGluZSB2b2lkIHNjc2lfZWhfcHJ0X2ZhaWxfc3RhdHMoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCisJCQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqd29ya19xKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQ7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCWludCB0b3RhbF9mYWlsdXJlcyA9IDA7CisJaW50IGNtZF9mYWlsZWQgPSAwOworCWludCBjbWRfY2FuY2VsID0gMDsKKwlpbnQgZGV2aWNlc19mYWlsZWQgPSAwOworCisJc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHNkZXYsIHNob3N0KSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc2NtZCwgd29ya19xLCBlaF9lbnRyeSkgeworCQkJaWYgKHNjbWQtPmRldmljZSA9PSBzZGV2KSB7CisJCQkJKyt0b3RhbF9mYWlsdXJlczsKKwkJCQlpZiAoc2NzaV9laF9lZmxhZ3NfY2hrKHNjbWQsCisJCQkJCQkgICAgICAgU0NTSV9FSF9DQU5DRUxfQ01EKSkKKwkJCQkJKytjbWRfY2FuY2VsOworCQkJCWVsc2UgCisJCQkJCSsrY21kX2ZhaWxlZDsKKwkJCX0KKwkJfQorCisJCWlmIChjbWRfY2FuY2VsIHx8IGNtZF9mYWlsZWQpIHsKKwkJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsCisJCQkJcHJpbnRrKCIlczogJWQ6JWQ6JWQ6JWQgY21kcyBmYWlsZWQ6ICVkLCIKKwkJCQkgICAgICAgIiBjYW5jZWw6ICVkXG4iLAorCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIHNob3N0LT5ob3N0X25vLAorCQkJCSAgICAgICBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwgc2Rldi0+bHVuLAorCQkJCSAgICAgICBjbWRfZmFpbGVkLCBjbWRfY2FuY2VsKSk7CisJCQljbWRfY2FuY2VsID0gMDsKKwkJCWNtZF9mYWlsZWQgPSAwOworCQkJKytkZXZpY2VzX2ZhaWxlZDsKKwkJfQorCX0KKworCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDIsIHByaW50aygiVG90YWwgb2YgJWQgY29tbWFuZHMgb24gJWQiCisJCQkJCSAgIiBkZXZpY2VzIHJlcXVpcmUgZWggd29ya1xuIiwKKwkJCQkgIHRvdGFsX2ZhaWx1cmVzLCBkZXZpY2VzX2ZhaWxlZCkpOworfQorI2VuZGlmCisKKy8qKgorICogc2NzaV9jaGVja19zZW5zZSAtIEV4YW1pbmUgc2NzaSBjbWQgc2Vuc2UKKyAqIEBzY21kOglDbWQgdG8gaGF2ZSBzZW5zZSBjaGVja2VkLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlTVUNDRVNTIG9yIEZBSUxFRCBvciBORUVEU19SRVRSWQorICoKKyAqIE5vdGVzOgorICoJV2hlbiBhIGRlZmVycmVkIGVycm9yIGlzIGRldGVjdGVkIHRoZSBjdXJyZW50IGNvbW1hbmQgaGFzCisgKglub3QgYmVlbiBleGVjdXRlZCBhbmQgbmVlZHMgcmV0cnlpbmcuCisgKiovCitzdGF0aWMgaW50IHNjc2lfY2hlY2tfc2Vuc2Uoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CisKKwlpZiAoISBzY3NpX2NvbW1hbmRfbm9ybWFsaXplX3NlbnNlKHNjbWQsICZzc2hkcikpCisJCXJldHVybiBGQUlMRUQ7CS8qIG5vIHZhbGlkIHNlbnNlIGRhdGEgKi8KKworCWlmIChzY3NpX3NlbnNlX2lzX2RlZmVycmVkKCZzc2hkcikpCisJCXJldHVybiBORUVEU19SRVRSWTsKKworCS8qCisJICogUHJldmlvdXMgbG9naWMgbG9va2VkIGZvciBGSUxFTUFSSywgRU9NIG9yIElMSSB3aGljaCBhcmUKKwkgKiBtYWlubHkgYXNzb2NpYXRlZCB3aXRoIHRhcGVzIGFuZCByZXR1cm5lZCBTVUNDRVNTLgorCSAqLworCWlmIChzc2hkci5yZXNwb25zZV9jb2RlID09IDB4NzApIHsKKwkJLyogZml4ZWQgZm9ybWF0ICovCisJCWlmIChzY21kLT5zZW5zZV9idWZmZXJbMl0gJiAweGUwKQorCQkJcmV0dXJuIFNVQ0NFU1M7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogZGVzY3JpcHRvciBmb3JtYXQ6IGxvb2sgZm9yICJzdHJlYW0gY29tbWFuZHMgc2Vuc2UgZGF0YQorCQkgKiBkZXNjcmlwdG9yIiAoc2VlIFNTQy0zKS4gQXNzdW1lIHNpbmdsZSBzZW5zZSBkYXRhCisJCSAqIGRlc2NyaXB0b3IuIElnbm9yZSBJTEkgZnJvbSBTQkMtMiBSRUFEIExPTkcgYW5kIFdSSVRFIExPTkcuCisJCSAqLworCQlpZiAoKHNzaGRyLmFkZGl0aW9uYWxfbGVuZ3RoID4gMykgJiYKKwkJICAgIChzY21kLT5zZW5zZV9idWZmZXJbOF0gPT0gMHg0KSAmJgorCQkgICAgKHNjbWQtPnNlbnNlX2J1ZmZlclsxMV0gJiAweGUwKSkKKwkJCXJldHVybiBTVUNDRVNTOworCX0KKworCXN3aXRjaCAoc3NoZHIuc2Vuc2Vfa2V5KSB7CisJY2FzZSBOT19TRU5TRToKKwkJcmV0dXJuIFNVQ0NFU1M7CisJY2FzZSBSRUNPVkVSRURfRVJST1I6CisJCXJldHVybiAvKiBzb2Z0X2Vycm9yICovIFNVQ0NFU1M7CisKKwljYXNlIEFCT1JURURfQ09NTUFORDoKKwkJcmV0dXJuIE5FRURTX1JFVFJZOworCWNhc2UgTk9UX1JFQURZOgorCWNhc2UgVU5JVF9BVFRFTlRJT046CisJCS8qCisJCSAqIGlmIHdlIGFyZSBleHBlY3RpbmcgYSBjYy91YSBiZWNhdXNlIG9mIGEgYnVzIHJlc2V0IHRoYXQgd2UKKwkJICogcGVyZm9ybWVkLCB0cmVhdCB0aGlzIGp1c3QgYXMgYSByZXRyeS4gIG90aGVyd2lzZSB0aGlzIGlzCisJCSAqIGluZm9ybWF0aW9uIHRoYXQgd2Ugc2hvdWxkIHBhc3MgdXAgdG8gdGhlIHVwcGVyLWxldmVsIGRyaXZlcgorCQkgKiBzbyB0aGF0IHdlIGNhbiBkZWFsIHdpdGggaXQgdGhlcmUuCisJCSAqLworCQlpZiAoc2NtZC0+ZGV2aWNlLT5leHBlY3RpbmdfY2NfdWEpIHsKKwkJCXNjbWQtPmRldmljZS0+ZXhwZWN0aW5nX2NjX3VhID0gMDsKKwkJCXJldHVybiBORUVEU19SRVRSWTsKKwkJfQorCQkvKgorCQkgKiBpZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlY29taW5nIHJlYWR5LCB3ZSAKKwkJICogc2hvdWxkIHJldHJ5LgorCQkgKi8KKwkJaWYgKChzc2hkci5hc2MgPT0gMHgwNCkgJiYgKHNzaGRyLmFzY3EgPT0gMHgwMSkpCisJCQlyZXR1cm4gTkVFRFNfUkVUUlk7CisJCS8qCisJCSAqIGlmIHRoZSBkZXZpY2UgaXMgbm90IHN0YXJ0ZWQsIHdlIG5lZWQgdG8gd2FrZQorCQkgKiB0aGUgZXJyb3IgaGFuZGxlciB0byBzdGFydCB0aGUgbW90b3IKKwkJICovCisJCWlmIChzY21kLT5kZXZpY2UtPmFsbG93X3Jlc3RhcnQgJiYKKwkJICAgIChzc2hkci5hc2MgPT0gMHgwNCkgJiYgKHNzaGRyLmFzY3EgPT0gMHgwMikpCisJCQlyZXR1cm4gRkFJTEVEOworCQlyZXR1cm4gU1VDQ0VTUzsKKworCQkvKiB0aGVzZSB0aHJlZSBhcmUgbm90IHN1cHBvcnRlZCAqLworCWNhc2UgQ09QWV9BQk9SVEVEOgorCWNhc2UgVk9MVU1FX09WRVJGTE9XOgorCWNhc2UgTUlTQ09NUEFSRToKKwkJcmV0dXJuIFNVQ0NFU1M7CisKKwljYXNlIE1FRElVTV9FUlJPUjoKKwkJcmV0dXJuIE5FRURTX1JFVFJZOworCisJY2FzZSBIQVJEV0FSRV9FUlJPUjoKKwkJaWYgKHNjbWQtPmRldmljZS0+cmV0cnlfaHdlcnJvcikKKwkJCXJldHVybiBORUVEU19SRVRSWTsKKwkJZWxzZQorCQkJcmV0dXJuIFNVQ0NFU1M7CisKKwljYXNlIElMTEVHQUxfUkVRVUVTVDoKKwljYXNlIEJMQU5LX0NIRUNLOgorCWNhc2UgREFUQV9QUk9URUNUOgorCWRlZmF1bHQ6CisJCXJldHVybiBTVUNDRVNTOworCX0KK30KKworLyoqCisgKiBzY3NpX2VoX2NvbXBsZXRlZF9ub3JtYWxseSAtIERpc3Bvc2l0aW9uIGEgZWggY21kIG9uIHJldHVybiBmcm9tIExMRC4KKyAqIEBzY21kOglTQ1NJIGNtZCB0byBleGFtaW5lLgorICoKKyAqIE5vdGVzOgorICogICAgVGhpcyBpcyAqb25seSogY2FsbGVkIHdoZW4gd2UgYXJlIGV4YW1pbmluZyB0aGUgc3RhdHVzIG9mIGNvbW1hbmRzCisgKiAgICBxdWV1ZWQgZHVyaW5nIGVycm9yIHJlY292ZXJ5LiAgdGhlIG1haW4gZGlmZmVyZW5jZSBoZXJlIGlzIHRoYXQgd2UKKyAqICAgIGRvbid0IGFsbG93IGZvciB0aGUgcG9zc2liaWxpdHkgb2YgcmV0cmllcyBoZXJlLCBhbmQgd2UgYXJlIGEgbG90CisgKiAgICBtb3JlIHJlc3RyaWN0aXZlIGFib3V0IHdoYXQgd2UgY29uc2lkZXIgYWNjZXB0YWJsZS4KKyAqKi8KK3N0YXRpYyBpbnQgc2NzaV9laF9jb21wbGV0ZWRfbm9ybWFsbHkoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK3sKKwkvKgorCSAqIGZpcnN0IGNoZWNrIHRoZSBob3N0IGJ5dGUsIHRvIHNlZSBpZiB0aGVyZSBpcyBhbnl0aGluZyBpbiB0aGVyZQorCSAqIHRoYXQgd291bGQgaW5kaWNhdGUgd2hhdCB3ZSBuZWVkIHRvIGRvLgorCSAqLworCWlmIChob3N0X2J5dGUoc2NtZC0+cmVzdWx0KSA9PSBESURfUkVTRVQpIHsKKwkJLyoKKwkJICogcmF0cy4gIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBlcnJvciBoYW5kbGVyLCBzbyB3ZSBub3cKKwkJICogZ2V0IHRvIHRyeSBhbmQgZmlndXJlIG91dCB3aGF0IHRvIGRvIG5leHQuICBpZiB0aGUgc2Vuc2UKKwkJICogaXMgdmFsaWQsIHdlIGhhdmUgYSBwcmV0dHkgZ29vZCBpZGVhIG9mIHdoYXQgdG8gZG8uCisJCSAqIGlmIG5vdCwgd2UgbWFyayBpdCBhcyBGQUlMRUQuCisJCSAqLworCQlyZXR1cm4gc2NzaV9jaGVja19zZW5zZShzY21kKTsKKwl9CisJaWYgKGhvc3RfYnl0ZShzY21kLT5yZXN1bHQpICE9IERJRF9PSykKKwkJcmV0dXJuIEZBSUxFRDsKKworCS8qCisJICogbmV4dCwgY2hlY2sgdGhlIG1lc3NhZ2UgYnl0ZS4KKwkgKi8KKwlpZiAobXNnX2J5dGUoc2NtZC0+cmVzdWx0KSAhPSBDT01NQU5EX0NPTVBMRVRFKQorCQlyZXR1cm4gRkFJTEVEOworCisJLyoKKwkgKiBub3csIGNoZWNrIHRoZSBzdGF0dXMgYnl0ZSB0byBzZWUgaWYgdGhpcyBpbmRpY2F0ZXMKKwkgKiBhbnl0aGluZyBzcGVjaWFsLgorCSAqLworCXN3aXRjaCAoc3RhdHVzX2J5dGUoc2NtZC0+cmVzdWx0KSkgeworCWNhc2UgR09PRDoKKwljYXNlIENPTU1BTkRfVEVSTUlOQVRFRDoKKwkJcmV0dXJuIFNVQ0NFU1M7CisJY2FzZSBDSEVDS19DT05ESVRJT046CisJCXJldHVybiBzY3NpX2NoZWNrX3NlbnNlKHNjbWQpOworCWNhc2UgQ09ORElUSU9OX0dPT0Q6CisJY2FzZSBJTlRFUk1FRElBVEVfR09PRDoKKwljYXNlIElOVEVSTUVESUFURV9DX0dPT0Q6CisJCS8qCisJCSAqIHdobyBrbm93cz8gIEZJWE1FKGVyaWMpCisJCSAqLworCQlyZXR1cm4gU1VDQ0VTUzsKKwljYXNlIEJVU1k6CisJY2FzZSBRVUVVRV9GVUxMOgorCWNhc2UgUkVTRVJWQVRJT05fQ09ORkxJQ1Q6CisJZGVmYXVsdDoKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisJcmV0dXJuIEZBSUxFRDsKK30KKworLyoqCisgKiBzY3NpX2VoX3RpbWVzX291dCAtIHRpbWVvdXQgZnVuY3Rpb24gZm9yIGVycm9yIGhhbmRsaW5nLgorICogQHNjbWQ6CUNtZCB0aGF0IGlzIHRpbWluZyBvdXQuCisgKgorICogTm90ZXM6CisgKiAgICBEdXJpbmcgZXJyb3IgaGFuZGxpbmcsIHRoZSBrZXJuZWwgdGhyZWFkIHdpbGwgYmUgc2xlZXBpbmcgd2FpdGluZworICogICAgZm9yIHNvbWUgYWN0aW9uIHRvIGNvbXBsZXRlIG9uIHRoZSBkZXZpY2UuICBvdXIgb25seSBqb2IgaXMgdG8KKyAqICAgIHJlY29yZCB0aGF0IGl0IHRpbWVkIG91dCwgYW5kIHRvIHdha2UgdXAgdGhlIHRocmVhZC4KKyAqKi8KK3N0YXRpYyB2b2lkIHNjc2lfZWhfdGltZXNfb3V0KHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCit7CisJc2NzaV9laF9lZmxhZ3Nfc2V0KHNjbWQsIFNDU0lfRUhfUkVDX1RJTUVPVVQpOworCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygiJXM6IHNjbWQ6JXBcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkJICBzY21kKSk7CisKKwlpZiAoc2NtZC0+ZGV2aWNlLT5ob3N0LT5laF9hY3Rpb24pCisJCXVwKHNjbWQtPmRldmljZS0+aG9zdC0+ZWhfYWN0aW9uKTsKK30KKworLyoqCisgKiBzY3NpX2VoX2RvbmUgLSBDb21wbGV0aW9uIGZ1bmN0aW9uIGZvciBlcnJvciBoYW5kbGluZy4KKyAqIEBzY21kOglDbWQgdGhhdCBpcyBkb25lLgorICoqLworc3RhdGljIHZvaWQgc2NzaV9laF9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCit7CisJLyoKKwkgKiBpZiB0aGUgdGltZW91dCBoYW5kbGVyIGlzIGFscmVhZHkgcnVubmluZywgdGhlbiBqdXN0IHNldCB0aGUKKwkgKiBmbGFnIHdoaWNoIHNheXMgd2UgZmluaXNoZWQgbGF0ZSwgYW5kIHJldHVybi4gIHdlIGhhdmUgbm8KKwkgKiB3YXkgb2Ygc3RvcHBpbmcgdGhlIHRpbWVvdXQgaGFuZGxlciBmcm9tIHJ1bm5pbmcsIHNvIHdlIG11c3QKKwkgKiBhbHdheXMgZGVmZXIgdG8gaXQuCisJICovCisJaWYgKGRlbF90aW1lcigmc2NtZC0+ZWhfdGltZW91dCkpIHsKKwkJc2NtZC0+cmVxdWVzdC0+cnFfc3RhdHVzID0gUlFfU0NTSV9ET05FOworCQlzY21kLT5vd25lciA9IFNDU0lfT1dORVJfRVJST1JfSEFORExFUjsKKworCQlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgzLCBwcmludGsoIiVzIHNjbWQ6ICVwIHJlc3VsdDogJXhcbiIsCisJCQkJCSAgIF9fRlVOQ1RJT05fXywgc2NtZCwgc2NtZC0+cmVzdWx0KSk7CisKKwkJaWYgKHNjbWQtPmRldmljZS0+aG9zdC0+ZWhfYWN0aW9uKQorCQkJdXAoc2NtZC0+ZGV2aWNlLT5ob3N0LT5laF9hY3Rpb24pOworCX0KK30KKworLyoqCisgKiBzY3NpX3NlbmRfZWhfY21uZCAgLSBzZW5kIGEgY21kIHRvIGEgZGV2aWNlIGFzIHBhcnQgb2YgZXJyb3IgcmVjb3ZlcnkuCisgKiBAc2NtZDoJU0NTSSBDbWQgdG8gc2VuZC4KKyAqIEB0aW1lb3V0OglUaW1lb3V0IGZvciBjbWQuCisgKgorICogTm90ZXM6CisgKiAgICBUaGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHN0cnVjdHVyZXMgaXMgcXVpdGUgYSBiaXQgZGlmZmVyZW50IGluCisgKiAgICB0aGlzIGNhc2UsIGFuZCBmdXJ0aGVybW9yZSwgdGhlcmUgaXMgYSBkaWZmZXJlbnQgY29tcGxldGlvbiBoYW5kbGVyCisgKiAgICB2cyBzY3NpX2Rpc3BhdGNoX2NtZC4KKyAqIFJldHVybiB2YWx1ZToKKyAqICAgIFNVQ0NFU1Mgb3IgRkFJTEVEIG9yIE5FRURTX1JFVFJZCisgKiovCitzdGF0aWMgaW50IHNjc2lfc2VuZF9laF9jbW5kKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQsIGludCB0aW1lb3V0KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBzY21kLT5kZXZpY2UtPmhvc3Q7CisJREVDTEFSRV9NVVRFWF9MT0NLRUQoc2VtKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBydG4gPSBTVUNDRVNTOworCisJLyoKKwkgKiB3ZSB3aWxsIHVzZSBhIHF1ZXVlZCBjb21tYW5kIGlmIHBvc3NpYmxlLCBvdGhlcndpc2Ugd2Ugd2lsbAorCSAqIGVtdWxhdGUgdGhlIHF1ZXVpbmcgYW5kIGNhbGxpbmcgb2YgY29tcGxldGlvbiBmdW5jdGlvbiBvdXJzZWx2ZXMuCisJICovCisJc2NtZC0+b3duZXIgPSBTQ1NJX09XTkVSX0xPV0xFVkVMOworCisJaWYgKHNjbWQtPmRldmljZS0+c2NzaV9sZXZlbCA8PSBTQ1NJXzIpCisJCXNjbWQtPmNtbmRbMV0gPSAoc2NtZC0+Y21uZFsxXSAmIDB4MWYpIHwKKwkJCShzY21kLT5kZXZpY2UtPmx1biA8PCA1ICYgMHhlMCk7CisKKwlzY3NpX2FkZF90aW1lcihzY21kLCB0aW1lb3V0LCBzY3NpX2VoX3RpbWVzX291dCk7CisKKwkvKgorCSAqIHNldCB1cCB0aGUgc2VtYXBob3JlIHNvIHdlIHdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGNvbXBsZXRlLgorCSAqLworCXNjbWQtPmRldmljZS0+aG9zdC0+ZWhfYWN0aW9uID0gJnNlbTsKKwlzY21kLT5yZXF1ZXN0LT5ycV9zdGF0dXMgPSBSUV9TQ1NJX0JVU1k7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXNjc2lfbG9nX3NlbmQoc2NtZCk7CisJaG9zdC0+aG9zdHQtPnF1ZXVlY29tbWFuZChzY21kLCBzY3NpX2VoX2RvbmUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCWRvd24oJnNlbSk7CisJc2NzaV9sb2dfY29tcGxldGlvbihzY21kLCBTVUNDRVNTKTsKKworCXNjbWQtPmRldmljZS0+aG9zdC0+ZWhfYWN0aW9uID0gTlVMTDsKKworCS8qCisJICogc2VlIGlmIHRpbWVvdXQuICBpZiBzbywgdGVsbCB0aGUgaG9zdCB0byBmb3JnZXQgYWJvdXQgaXQuCisJICogaW4gb3RoZXIgd29yZHMsIHdlIGRvbid0IHdhbnQgYSBjYWxsYmFjayBhbnkgbW9yZS4KKwkgKi8KKwlpZiAoc2NzaV9laF9lZmxhZ3NfY2hrKHNjbWQsIFNDU0lfRUhfUkVDX1RJTUVPVVQpKSB7CisJCXNjc2lfZWhfZWZsYWdzX2NscihzY21kLCAgU0NTSV9FSF9SRUNfVElNRU9VVCk7CisJCXNjbWQtPm93bmVyID0gU0NTSV9PV05FUl9MT1dMRVZFTDsKKworCQkvKgorCQkgKiBhcyBmYXIgYXMgdGhlIGxvdyBsZXZlbCBkcml2ZXIgaXMKKwkJICogY29uY2VybmVkLCB0aGlzIGNvbW1hbmQgaXMgc3RpbGwgYWN0aXZlLCBzbworCQkgKiB3ZSBtdXN0IGdpdmUgdGhlIGxvdyBsZXZlbCBkcml2ZXIgYSBjaGFuY2UKKwkJICogdG8gYWJvcnQgaXQuIChkYikgCisJCSAqCisJCSAqIEZJWE1FKGVyaWMpIC0gd2UgYXJlIG5vdCB0cmFja2luZyB3aGV0aGVyIHdlIGNvdWxkCisJCSAqIGFib3J0IGEgdGltZWQgb3V0IGNvbW1hbmQgb3Igbm90LiAgbm90IHN1cmUgaG93CisJCSAqIHdlIHNob3VsZCB0cmVhdCB0aGVtIGRpZmZlcmVudGx5IGFueXdheXMuCisJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZShzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlpZiAoc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0dC0+ZWhfYWJvcnRfaGFuZGxlcikKKwkJCXNjbWQtPmRldmljZS0+aG9zdC0+aG9zdHQtPmVoX2Fib3J0X2hhbmRsZXIoc2NtZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJCQorCQlzY21kLT5yZXF1ZXN0LT5ycV9zdGF0dXMgPSBSUV9TQ1NJX0RPTkU7CisJCXNjbWQtPm93bmVyID0gU0NTSV9PV05FUl9FUlJPUl9IQU5ETEVSOworCQkJCisJCXJ0biA9IEZBSUxFRDsKKwl9CisKKwlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgzLCBwcmludGsoIiVzOiBzY21kOiAlcCwgcnRuOiV4XG4iLAorCQkJCQkgIF9fRlVOQ1RJT05fXywgc2NtZCwgcnRuKSk7CisKKwkvKgorCSAqIG5vdyBleGFtaW5lIHRoZSBhY3R1YWwgc3RhdHVzIGNvZGVzIHRvIHNlZSB3aGV0aGVyIHRoZSBjb21tYW5kCisJICogYWN0dWFsbHkgZGlkIGNvbXBsZXRlIG5vcm1hbGx5LgorCSAqLworCWlmIChydG4gPT0gU1VDQ0VTUykgeworCQlydG4gPSBzY3NpX2VoX2NvbXBsZXRlZF9ub3JtYWxseShzY21kKTsKKwkJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMywKKwkJCXByaW50aygiJXM6IHNjc2lfZWhfY29tcGxldGVkX25vcm1hbGx5ICV4XG4iLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywgcnRuKSk7CisJCXN3aXRjaCAocnRuKSB7CisJCWNhc2UgU1VDQ0VTUzoKKwkJY2FzZSBORUVEU19SRVRSWToKKwkJY2FzZSBGQUlMRUQ6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJ0biA9IEZBSUxFRDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJ0bjsKK30KKworLyoqCisgKiBzY3NpX3JlcXVlc3Rfc2Vuc2UgLSBSZXF1ZXN0IHNlbnNlIGRhdGEgZnJvbSBhIHBhcnRpY3VsYXIgdGFyZ2V0LgorICogQHNjbWQ6CVNDU0kgY21kIGZvciByZXF1ZXN0IHNlbnNlLgorICoKKyAqIE5vdGVzOgorICogICAgU29tZSBob3N0cyBhdXRvbWF0aWNhbGx5IG9idGFpbiB0aGlzIGluZm9ybWF0aW9uLCBvdGhlcnMgcmVxdWlyZQorICogICAgdGhhdCB3ZSBvYnRhaW4gaXQgb24gb3VyIG93bi4gVGhpcyBmdW5jdGlvbiB3aWxsICpub3QqIHJldHVybiB1bnRpbAorICogICAgdGhlIGNvbW1hbmQgZWl0aGVyIHRpbWVzIG91dCwgb3IgaXQgY29tcGxldGVzLgorICoqLworc3RhdGljIGludCBzY3NpX3JlcXVlc3Rfc2Vuc2Uoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBnZW5lcmljX3NlbnNlWzZdID0KKwl7UkVRVUVTVF9TRU5TRSwgMCwgMCwgMCwgMjUyLCAwfTsKKwl1bnNpZ25lZCBjaGFyICpzY3NpX3Jlc3VsdDsKKwlpbnQgc2F2ZWRfcmVzdWx0OworCWludCBydG47CisKKwltZW1jcHkoc2NtZC0+Y21uZCwgZ2VuZXJpY19zZW5zZSwgc2l6ZW9mKGdlbmVyaWNfc2Vuc2UpKTsKKworCXNjc2lfcmVzdWx0ID0ga21hbGxvYygyNTIsIEdGUF9BVE9NSUMgfCAoc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0dC0+dW5jaGVja2VkX2lzYV9kbWEpID8gX19HRlBfRE1BIDogMCk7CisKKworCWlmICh1bmxpa2VseSghc2NzaV9yZXN1bHQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCBhbGxvY2F0ZSBzY3NpX3Jlc3VsdC5cbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCS8qCisJICogemVybyB0aGUgc2Vuc2UgYnVmZmVyLiAgc29tZSBob3N0IGFkYXB0ZXJzIGF1dG9tYXRpY2FsbHkgYWx3YXlzCisJICogcmVxdWVzdCBzZW5zZSwgc28gaXQgaXMgbm90IGEgZ29vZCBpZGVhIHRoYXQKKwkgKiBzY21kLT5yZXF1ZXN0X2J1ZmZlciBhbmQgc2NtZC0+c2Vuc2VfYnVmZmVyIHBvaW50IHRvIHRoZSBzYW1lCisJICogYWRkcmVzcyAoZGIpLiAgMCBpcyBub3QgYSB2YWxpZCBzZW5zZSBjb2RlLiAKKwkgKi8KKwltZW1zZXQoc2NtZC0+c2Vuc2VfYnVmZmVyLCAwLCBzaXplb2Yoc2NtZC0+c2Vuc2VfYnVmZmVyKSk7CisJbWVtc2V0KHNjc2lfcmVzdWx0LCAwLCAyNTIpOworCisJc2F2ZWRfcmVzdWx0ID0gc2NtZC0+cmVzdWx0OworCXNjbWQtPnJlcXVlc3RfYnVmZmVyID0gc2NzaV9yZXN1bHQ7CisJc2NtZC0+cmVxdWVzdF9idWZmbGVuID0gMjUyOworCXNjbWQtPnVzZV9zZyA9IDA7CisJc2NtZC0+Y21kX2xlbiA9IENPTU1BTkRfU0laRShzY21kLT5jbW5kWzBdKTsKKwlzY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwlzY21kLT51bmRlcmZsb3cgPSAwOworCisJcnRuID0gc2NzaV9zZW5kX2VoX2NtbmQoc2NtZCwgU0VOU0VfVElNRU9VVCk7CisKKwkvKiBsYXN0IGNoYW5jZSB0byBoYXZlIHZhbGlkIHNlbnNlIGRhdGEgKi8KKwlpZighU0NTSV9TRU5TRV9WQUxJRChzY21kKSkgeworCQltZW1jcHkoc2NtZC0+c2Vuc2VfYnVmZmVyLCBzY21kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJICAgICAgIHNpemVvZihzY21kLT5zZW5zZV9idWZmZXIpKTsKKwl9CisKKwlrZnJlZShzY3NpX3Jlc3VsdCk7CisKKwkvKgorCSAqIHdoZW4gd2UgZXZlbnR1YWxseSBjYWxsIHNjc2lfZmluaXNoLCB3ZSByZWFsbHkgd2lzaCB0byBjb21wbGV0ZQorCSAqIHRoZSBvcmlnaW5hbCByZXF1ZXN0LCBzbyBsZXQncyByZXN0b3JlIHRoZSBvcmlnaW5hbCBkYXRhLiAoZGIpCisJICovCisJc2NzaV9zZXR1cF9jbWRfcmV0cnkoc2NtZCk7CisJc2NtZC0+cmVzdWx0ID0gc2F2ZWRfcmVzdWx0OworCXJldHVybiBydG47Cit9CisKKy8qKgorICogc2NzaV9laF9maW5pc2hfY21kIC0gSGFuZGxlIGEgY21kIHRoYXQgZWggaXMgZmluaXNoZWQgd2l0aC4KKyAqIEBzY21kOglPcmlnaW5hbCBTQ1NJIGNtZCB0aGF0IGVoIGhhcyBmaW5pc2hlZC4KKyAqIEBkb25lX3E6CVF1ZXVlIGZvciBwcm9jZXNzZWQgY29tbWFuZHMuCisgKgorICogTm90ZXM6CisgKiAgICBXZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgbm9ybWFsIGNvbW1hbmQgY29tcGxldGlvbiB3aGlsZSB3ZSBhcmUgYXJlCisgKiAgICBzdGlsbCBoYW5kbGluZyBlcnJvcnMgLSBpdCBtYXkgY2F1c2Ugb3RoZXIgY29tbWFuZHMgdG8gYmUgcXVldWVkLAorICogICAgYW5kIHRoYXQgd291bGQgZGlzdHVyYiB3aGF0IHdlIGFyZSBkb2luZy4gIHRodXMgd2UgcmVhbGx5IHdhbnQgdG8KKyAqICAgIGtlZXAgYSBsaXN0IG9mIHBlbmRpbmcgY29tbWFuZHMgZm9yIGZpbmFsIGNvbXBsZXRpb24sIGFuZCBvbmNlIHdlCisgKiAgICBhcmUgcmVhZHkgdG8gbGVhdmUgZXJyb3IgaGFuZGxpbmcgd2UgaGFuZGxlIGNvbXBsZXRpb24gZm9yIHJlYWwuCisgKiovCitzdGF0aWMgdm9pZCBzY3NpX2VoX2ZpbmlzaF9jbWQoc3RydWN0IHNjc2lfY21uZCAqc2NtZCwKKwkJCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkb25lX3EpCit7CisJc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2ZhaWxlZC0tOworCXNjbWQtPnN0YXRlID0gU0NTSV9TVEFURV9CSFFVRVVFOworCisJc2NzaV9laF9lZmxhZ3NfY2xyX2FsbChzY21kKTsKKworCS8qCisJICogc2V0IHRoaXMgYmFjayBzbyB0aGF0IHRoZSB1cHBlciBsZXZlbCBjYW4gY29ycmVjdGx5IGZyZWUgdXAKKwkgKiB0aGluZ3MuCisJICovCisJc2NzaV9zZXR1cF9jbWRfcmV0cnkoc2NtZCk7CisJbGlzdF9tb3ZlX3RhaWwoJnNjbWQtPmVoX2VudHJ5LCBkb25lX3EpOworfQorCisvKioKKyAqIHNjc2lfZWhfZ2V0X3NlbnNlIC0gR2V0IGRldmljZSBzZW5zZSBkYXRhLgorICogQHdvcmtfcToJUXVldWUgb2YgY29tbWFuZHMgdG8gcHJvY2Vzcy4KKyAqIEBkb25lX3E6CVF1ZXVlIG9mIHByb2NjZXNzZWQgY29tbWFuZHMuLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgU2VlIGlmIHdlIG5lZWQgdG8gcmVxdWVzdCBzZW5zZSBpbmZvcm1hdGlvbi4gIGlmIHNvLCB0aGVuIGdldCBpdAorICogICAgbm93LCBzbyB3ZSBoYXZlIGEgYmV0dGVyIGlkZWEgb2Ygd2hhdCB0byBkby4gIAorICoKKyAqIE5vdGVzOgorICogICAgVGhpcyBoYXMgdGhlIHVuZm9ydHVuYXRlIHNpZGUgZWZmZWN0IHRoYXQgaWYgYSBzaG9zdCBhZGFwdGVyIGRvZXMKKyAqICAgIG5vdCBhdXRvbWF0aWNhbGx5IHJlcXVlc3Qgc2Vuc2UgaW5mb3JtYXRpb24sIHRoYXQgd2UgZW5kIHVwIHNodXR0aW5nCisgKiAgICBpdCBkb3duIGJlZm9yZSB3ZSByZXF1ZXN0IGl0LgorICoKKyAqICAgIEFsbCBkcml2ZXJzIHNob3VsZCByZXF1ZXN0IHNlbnNlIGluZm9ybWF0aW9uIGludGVybmFsbHkgdGhlc2UgZGF5cywKKyAqICAgIHNvIGZvciBub3cgYWxsIEkgaGF2ZSB0byBzYXkgaXMgdG91Z2ggbm9vZ2llcyBpZiB5b3UgZW5kIHVwIGluIGhlcmUuCisgKgorICogICAgWFhYOiBMb25nIHRlcm0gdGhpcyBjb2RlIHNob3VsZCBnbyBhd2F5LCBidXQgdGhhdCBuZWVkcyBhbiBhdWRpdCBvZgorICogICAgICAgICBhbGwgTExERHMgZmlyc3QuCisgKiovCitzdGF0aWMgaW50IHNjc2lfZWhfZ2V0X3NlbnNlKHN0cnVjdCBsaXN0X2hlYWQgKndvcmtfcSwKKwkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqZG9uZV9xKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxoLCAqbGhfc2Y7CisJc3RydWN0IHNjc2lfY21uZCAqc2NtZDsKKwlpbnQgcnRuOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBsaF9zZiwgd29ya19xKSB7CisJCXNjbWQgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3Qgc2NzaV9jbW5kLCBlaF9lbnRyeSk7CisJCWlmIChzY3NpX2VoX2VmbGFnc19jaGsoc2NtZCwgU0NTSV9FSF9DQU5DRUxfQ01EKSB8fAorCQkgICAgU0NTSV9TRU5TRV9WQUxJRChzY21kKSkKKwkJCWNvbnRpbnVlOworCisJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDIsIHByaW50aygiJXM6IHJlcXVlc3Rpbmcgc2Vuc2UiCisJCQkJCQkgICIgZm9yIGlkOiAlZFxuIiwKKwkJCQkJCSAgY3VycmVudC0+Y29tbSwKKwkJCQkJCSAgc2NtZC0+ZGV2aWNlLT5pZCkpOworCQlydG4gPSBzY3NpX3JlcXVlc3Rfc2Vuc2Uoc2NtZCk7CisJCWlmIChydG4gIT0gU1VDQ0VTUykKKwkJCWNvbnRpbnVlOworCisJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygic2Vuc2UgcmVxdWVzdGVkIGZvciAlcCIKKwkJCQkJCSAgIiByZXN1bHQgJXhcbiIsIHNjbWQsCisJCQkJCQkgIHNjbWQtPnJlc3VsdCkpOworCQlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgzLCBzY3NpX3ByaW50X3NlbnNlKCJiaCIsIHNjbWQpKTsKKworCQlydG4gPSBzY3NpX2RlY2lkZV9kaXNwb3NpdGlvbihzY21kKTsKKworCQkvKgorCQkgKiBpZiB0aGUgcmVzdWx0IHdhcyBub3JtYWwsIHRoZW4ganVzdCBwYXNzIGl0IGFsb25nIHRvIHRoZQorCQkgKiB1cHBlciBsZXZlbC4KKwkJICovCisJCWlmIChydG4gPT0gU1VDQ0VTUykKKwkJCS8qIHdlIGRvbid0IHdhbnQgdGhpcyBjb21tYW5kIHJlaXNzdWVkLCBqdXN0CisJCQkgKiBmaW5pc2hlZCB3aXRoIHRoZSBzZW5zZSBkYXRhLCBzbyBzZXQKKwkJCSAqIHJldHJpZXMgdG8gdGhlIG1heCBhbGxvd2VkIHRvIGVuc3VyZSBpdAorCQkJICogd29uJ3QgZ2V0IHJlaXNzdWVkICovCisJCQlzY21kLT5yZXRyaWVzID0gc2NtZC0+YWxsb3dlZDsKKwkJZWxzZSBpZiAocnRuICE9IE5FRURTX1JFVFJZKQorCQkJY29udGludWU7CisKKwkJc2NzaV9laF9maW5pc2hfY21kKHNjbWQsIGRvbmVfcSk7CisJfQorCisJcmV0dXJuIGxpc3RfZW1wdHkod29ya19xKTsKK30KKworLyoqCisgKiBzY3NpX3RyeV90b19hYm9ydF9jbWQgLSBBc2sgaG9zdCB0byBhYm9ydCBhIHJ1bm5pbmcgY29tbWFuZC4KKyAqIEBzY21kOglTQ1NJIGNtZCB0byBhYm9ydCBmcm9tIExvd2VyIExldmVsLgorICoKKyAqIE5vdGVzOgorICogICAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCByZXR1cm4gdW50aWwgdGhlIHVzZXIncyBjb21wbGV0aW9uIGZ1bmN0aW9uCisgKiAgICBoYXMgYmVlbiBjYWxsZWQuICB0aGVyZSBpcyBubyB0aW1lb3V0IG9uIHRoaXMgb3BlcmF0aW9uLiAgaWYgdGhlCisgKiAgICBhdXRob3Igb2YgdGhlIGxvdy1sZXZlbCBkcml2ZXIgd2lzaGVzIHRoaXMgb3BlcmF0aW9uIHRvIGJlIHRpbWVkLAorICogICAgdGhleSBjYW4gcHJvdmlkZSB0aGlzIGZhY2lsaXR5IHRoZW1zZWx2ZXMuICBoZWxwZXIgZnVuY3Rpb25zIGluCisgKiAgICBzY3NpX2Vycm9yLmMgY2FuIGJlIHN1cHBsaWVkIHRvIG1ha2UgdGhpcyBlYXNpZXIgdG8gZG8uCisgKiovCitzdGF0aWMgaW50IHNjc2lfdHJ5X3RvX2Fib3J0X2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJ0biA9IEZBSUxFRDsKKworCWlmICghc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0dC0+ZWhfYWJvcnRfaGFuZGxlcikKKwkJcmV0dXJuIHJ0bjsKKworCS8qCisJICogc2NzaV9kb25lIHdhcyBjYWxsZWQganVzdCBhZnRlciB0aGUgY29tbWFuZCB0aW1lZCBvdXQgYW5kIGJlZm9yZQorCSAqIHdlIGhhZCBhIGNoYW5jZSB0byBwcm9jZXNzIGl0LiAoZGIpCisJICovCisJaWYgKHNjbWQtPnNlcmlhbF9udW1iZXIgPT0gMCkKKwkJcmV0dXJuIFNVQ0NFU1M7CisKKwlzY21kLT5vd25lciA9IFNDU0lfT1dORVJfTE9XTEVWRUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJ0biA9IHNjbWQtPmRldmljZS0+aG9zdC0+aG9zdHQtPmVoX2Fib3J0X2hhbmRsZXIoc2NtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJ0bjsKK30KKworLyoqCisgKiBzY3NpX2VoX3R1ciAtIFNlbmQgVFVSIHRvIGRldmljZS4KKyAqIEBzY21kOglTY3NpIGNtZCB0byBzZW5kIFRVUgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqICAgIDAgLSBEZXZpY2UgaXMgcmVhZHkuIDEgLSBEZXZpY2UgTk9UIHJlYWR5LgorICoqLworc3RhdGljIGludCBzY3NpX2VoX3R1cihzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHR1cl9jb21tYW5kWzZdID0ge1RFU1RfVU5JVF9SRUFEWSwgMCwgMCwgMCwgMCwgMH07CisJaW50IHJldHJ5X2NudCA9IDEsIHJ0bjsKKworcmV0cnlfdHVyOgorCW1lbWNweShzY21kLT5jbW5kLCB0dXJfY29tbWFuZCwgc2l6ZW9mKHR1cl9jb21tYW5kKSk7CisKKwkvKgorCSAqIHplcm8gdGhlIHNlbnNlIGJ1ZmZlci4gIHRoZSBzY3NpIHNwZWMgbWFuZGF0ZXMgdGhhdCBhbnkKKwkgKiB1bnRyYW5zZmVycmVkIHNlbnNlIGRhdGEgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGJlaW5nIHplcm8uCisJICovCisJbWVtc2V0KHNjbWQtPnNlbnNlX2J1ZmZlciwgMCwgc2l6ZW9mKHNjbWQtPnNlbnNlX2J1ZmZlcikpOworCisJc2NtZC0+cmVxdWVzdF9idWZmZXIgPSBOVUxMOworCXNjbWQtPnJlcXVlc3RfYnVmZmxlbiA9IDA7CisJc2NtZC0+dXNlX3NnID0gMDsKKwlzY21kLT5jbWRfbGVuID0gQ09NTUFORF9TSVpFKHNjbWQtPmNtbmRbMF0pOworCXNjbWQtPnVuZGVyZmxvdyA9IDA7CisJc2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKKworCXJ0biA9IHNjc2lfc2VuZF9laF9jbW5kKHNjbWQsIFNFTlNFX1RJTUVPVVQpOworCisJLyoKKwkgKiB3aGVuIHdlIGV2ZW50dWFsbHkgY2FsbCBzY3NpX2ZpbmlzaCwgd2UgcmVhbGx5IHdpc2ggdG8gY29tcGxldGUKKwkgKiB0aGUgb3JpZ2luYWwgcmVxdWVzdCwgc28gbGV0J3MgcmVzdG9yZSB0aGUgb3JpZ2luYWwgZGF0YS4gKGRiKQorCSAqLworCXNjc2lfc2V0dXBfY21kX3JldHJ5KHNjbWQpOworCisJLyoKKwkgKiBoZXksIHdlIGFyZSBkb25lLiAgbGV0J3MgbG9vayB0byBzZWUgd2hhdCBoYXBwZW5lZC4KKwkgKi8KKwlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgzLCBwcmludGsoIiVzOiBzY21kICVwIHJ0biAleFxuIiwKKwkJX19GVU5DVElPTl9fLCBzY21kLCBydG4pKTsKKwlpZiAocnRuID09IFNVQ0NFU1MpCisJCXJldHVybiAwOworCWVsc2UgaWYgKHJ0biA9PSBORUVEU19SRVRSWSkKKwkJaWYgKHJldHJ5X2NudC0tKQorCQkJZ290byByZXRyeV90dXI7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogc2NzaV9laF9hYm9ydF9jbWRzIC0gYWJvcnQgY2FuY2VsZWQgY29tbWFuZHMuCisgKiBAc2hvc3Q6CXNjc2kgaG9zdCBiZWluZyByZWNvdmVyZWQuCisgKiBAZWhfZG9uZV9xOglsaXN0X2hlYWQgZm9yIHByb2Nlc3NlZCBjb21tYW5kcy4KKyAqCisgKiBEZWNyaXB0aW9uOgorICogICAgVHJ5IGFuZCBzZWUgd2hldGhlciBvciBub3QgaXQgbWFrZXMgc2Vuc2UgdG8gdHJ5IGFuZCBhYm9ydCB0aGUKKyAqICAgIHJ1bm5pbmcgY29tbWFuZC4gIHRoaXMgb25seSB3b3JrcyBvdXQgdG8gYmUgdGhlIGNhc2UgaWYgd2UgaGF2ZSBvbmUKKyAqICAgIGNvbW1hbmQgdGhhdCBoYXMgdGltZWQgb3V0LiAgaWYgdGhlIGNvbW1hbmQgc2ltcGx5IGZhaWxlZCwgaXQgbWFrZXMKKyAqICAgIG5vIHNlbnNlIHRvIHRyeSBhbmQgYWJvcnQgdGhlIGNvbW1hbmQsIHNpbmNlIGFzIGZhciBhcyB0aGUgc2hvc3QKKyAqICAgIGFkYXB0ZXIgaXMgY29uY2VybmVkLCBpdCBpc24ndCBydW5uaW5nLgorICoqLworc3RhdGljIGludCBzY3NpX2VoX2Fib3J0X2NtZHMoc3RydWN0IGxpc3RfaGVhZCAqd29ya19xLAorCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqZG9uZV9xKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxoLCAqbGhfc2Y7CisJc3RydWN0IHNjc2lfY21uZCAqc2NtZDsKKwlpbnQgcnRuOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBsaF9zZiwgd29ya19xKSB7CisJCXNjbWQgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3Qgc2NzaV9jbW5kLCBlaF9lbnRyeSk7CisJCWlmICghc2NzaV9laF9lZmxhZ3NfY2hrKHNjbWQsIFNDU0lfRUhfQ0FOQ0VMX0NNRCkpCisJCQljb250aW51ZTsKKwkJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMywgcHJpbnRrKCIlczogYWJvcnRpbmcgY21kOiIKKwkJCQkJCSAgIjB4JXBcbiIsIGN1cnJlbnQtPmNvbW0sCisJCQkJCQkgIHNjbWQpKTsKKwkJcnRuID0gc2NzaV90cnlfdG9fYWJvcnRfY21kKHNjbWQpOworCQlpZiAocnRuID09IFNVQ0NFU1MpIHsKKwkJCXNjc2lfZWhfZWZsYWdzX2NscihzY21kLCAgU0NTSV9FSF9DQU5DRUxfQ01EKTsKKwkJCWlmICghc2NzaV9kZXZpY2Vfb25saW5lKHNjbWQtPmRldmljZSkgfHwKKwkJCSAgICAhc2NzaV9laF90dXIoc2NtZCkpIHsKKwkJCQlzY3NpX2VoX2ZpbmlzaF9jbWQoc2NtZCwgZG9uZV9xKTsKKwkJCX0KKwkJCQkKKwkJfSBlbHNlCisJCQlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgzLCBwcmludGsoIiVzOiBhYm9ydGluZyIKKwkJCQkJCQkgICIgY21kIGZhaWxlZDoiCisJCQkJCQkJICAiMHglcFxuIiwKKwkJCQkJCQkgIGN1cnJlbnQtPmNvbW0sCisJCQkJCQkJICBzY21kKSk7CisJfQorCisJcmV0dXJuIGxpc3RfZW1wdHkod29ya19xKTsKK30KKworLyoqCisgKiBzY3NpX3RyeV9idXNfZGV2aWNlX3Jlc2V0IC0gQXNrIGhvc3QgdG8gcGVyZm9ybSBhIEJEUiBvbiBhIGRldgorICogQHNjbWQ6CVNDU0kgY21kIHVzZWQgdG8gc2VuZCBCRFIJCisgKgorICogTm90ZXM6CisgKiAgICBUaGVyZSBpcyBubyB0aW1lb3V0IGZvciB0aGlzIG9wZXJhdGlvbi4gIGlmIHRoaXMgb3BlcmF0aW9uIGlzCisgKiAgICB1bnJlbGlhYmxlIGZvciBhIGdpdmVuIGhvc3QsIHRoZW4gdGhlIGhvc3QgaXRzZWxmIG5lZWRzIHRvIHB1dCBhCisgKiAgICB0aW1lciBvbiBpdCwgYW5kIHNldCB0aGUgaG9zdCBiYWNrIHRvIGEgY29uc2lzdGVudCBzdGF0ZSBwcmlvciB0bworICogICAgcmV0dXJuaW5nLgorICoqLworc3RhdGljIGludCBzY3NpX3RyeV9idXNfZGV2aWNlX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcnRuID0gRkFJTEVEOworCisJaWYgKCFzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3R0LT5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcikKKwkJcmV0dXJuIHJ0bjsKKworCXNjbWQtPm93bmVyID0gU0NTSV9PV05FUl9MT1dMRVZFTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcnRuID0gc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0dC0+ZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIoc2NtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKHJ0biA9PSBTVUNDRVNTKSB7CisJCXNjbWQtPmRldmljZS0+d2FzX3Jlc2V0ID0gMTsKKwkJc2NtZC0+ZGV2aWNlLT5leHBlY3RpbmdfY2NfdWEgPSAxOworCX0KKworCXJldHVybiBydG47Cit9CisKKy8qKgorICogc2NzaV9laF90cnlfc3R1IC0gU2VuZCBTVEFSVF9VTklUIHRvIGRldmljZS4KKyAqIEBzY21kOglTY3NpIGNtZCB0byBzZW5kIFNUQVJUX1VOSVQKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAgICAwIC0gRGV2aWNlIGlzIHJlYWR5LiAxIC0gRGV2aWNlIE5PVCByZWFkeS4KKyAqKi8KK3N0YXRpYyBpbnQgc2NzaV9laF90cnlfc3R1KHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgc3R1X2NvbW1hbmRbNl0gPSB7U1RBUlRfU1RPUCwgMCwgMCwgMCwgMSwgMH07CisJaW50IHJ0bjsKKworCWlmICghc2NtZC0+ZGV2aWNlLT5hbGxvd19yZXN0YXJ0KQorCQlyZXR1cm4gMTsKKworCW1lbWNweShzY21kLT5jbW5kLCBzdHVfY29tbWFuZCwgc2l6ZW9mKHN0dV9jb21tYW5kKSk7CisKKwkvKgorCSAqIHplcm8gdGhlIHNlbnNlIGJ1ZmZlci4gIHRoZSBzY3NpIHNwZWMgbWFuZGF0ZXMgdGhhdCBhbnkKKwkgKiB1bnRyYW5zZmVycmVkIHNlbnNlIGRhdGEgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGJlaW5nIHplcm8uCisJICovCisJbWVtc2V0KHNjbWQtPnNlbnNlX2J1ZmZlciwgMCwgc2l6ZW9mKHNjbWQtPnNlbnNlX2J1ZmZlcikpOworCisJc2NtZC0+cmVxdWVzdF9idWZmZXIgPSBOVUxMOworCXNjbWQtPnJlcXVlc3RfYnVmZmxlbiA9IDA7CisJc2NtZC0+dXNlX3NnID0gMDsKKwlzY21kLT5jbWRfbGVuID0gQ09NTUFORF9TSVpFKHNjbWQtPmNtbmRbMF0pOworCXNjbWQtPnVuZGVyZmxvdyA9IDA7CisJc2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKKworCXJ0biA9IHNjc2lfc2VuZF9laF9jbW5kKHNjbWQsIFNUQVJUX1VOSVRfVElNRU9VVCk7CisKKwkvKgorCSAqIHdoZW4gd2UgZXZlbnR1YWxseSBjYWxsIHNjc2lfZmluaXNoLCB3ZSByZWFsbHkgd2lzaCB0byBjb21wbGV0ZQorCSAqIHRoZSBvcmlnaW5hbCByZXF1ZXN0LCBzbyBsZXQncyByZXN0b3JlIHRoZSBvcmlnaW5hbCBkYXRhLiAoZGIpCisJICovCisJc2NzaV9zZXR1cF9jbWRfcmV0cnkoc2NtZCk7CisKKwkvKgorCSAqIGhleSwgd2UgYXJlIGRvbmUuICBsZXQncyBsb29rIHRvIHNlZSB3aGF0IGhhcHBlbmVkLgorCSAqLworCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygiJXM6IHNjbWQgJXAgcnRuICV4XG4iLAorCQlfX0ZVTkNUSU9OX18sIHNjbWQsIHJ0bikpOworCWlmIChydG4gPT0gU1VDQ0VTUykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKyAvKioKKyAqIHNjc2lfZWhfc3R1IC0gc2VuZCBTVEFSVF9VTklUIGlmIG5lZWRlZAorICogQHNob3N0OglzY3NpIGhvc3QgYmVpbmcgcmVjb3ZlcmVkLgorICogQGVoX2RvbmVfcToJbGlzdF9oZWFkIGZvciBwcm9jZXNzZWQgY29tbWFuZHMuCisgKgorICogTm90ZXM6CisgKiAgICBJZiBjb21tYW5kcyBhcmUgZmFpbGluZyBkdWUgdG8gbm90IHJlYWR5LCBpbml0aWFsaXppbmcgY29tbWFuZCByZXF1aXJlZCwKKyAqCXRyeSByZXZhbGlkYXRpbmcgdGhlIGRldmljZSwgd2hpY2ggd2lsbCBlbmQgdXAgc2VuZGluZyBhIHN0YXJ0IHVuaXQuIAorICoqLworc3RhdGljIGludCBzY3NpX2VoX3N0dShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKndvcmtfcSwKKwkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmRvbmVfcSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaCwgKmxoX3NmOworCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQsICpzdHVfc2NtZDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisKKwlzaG9zdF9mb3JfZWFjaF9kZXZpY2Uoc2Rldiwgc2hvc3QpIHsKKwkJc3R1X3NjbWQgPSBOVUxMOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNjbWQsIHdvcmtfcSwgZWhfZW50cnkpCisJCQlpZiAoc2NtZC0+ZGV2aWNlID09IHNkZXYgJiYgU0NTSV9TRU5TRV9WQUxJRChzY21kKSAmJgorCQkJICAgIHNjc2lfY2hlY2tfc2Vuc2Uoc2NtZCkgPT0gRkFJTEVEICkgeworCQkJCXN0dV9zY21kID0gc2NtZDsKKwkJCQlicmVhazsKKwkJCX0KKworCQlpZiAoIXN0dV9zY21kKQorCQkJY29udGludWU7CisKKwkJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMywgcHJpbnRrKCIlczogU2VuZGluZyBTVEFSVF9VTklUIHRvIHNkZXY6IgorCQkJCQkJICAiIDB4JXBcbiIsIGN1cnJlbnQtPmNvbW0sIHNkZXYpKTsKKworCQlpZiAoIXNjc2lfZWhfdHJ5X3N0dShzdHVfc2NtZCkpIHsKKwkJCWlmICghc2NzaV9kZXZpY2Vfb25saW5lKHNkZXYpIHx8CisJCQkgICAgIXNjc2lfZWhfdHVyKHN0dV9zY21kKSkgeworCQkJCWxpc3RfZm9yX2VhY2hfc2FmZShsaCwgbGhfc2YsIHdvcmtfcSkgeworCQkJCQlzY21kID0gbGlzdF9lbnRyeShsaCwgc3RydWN0IHNjc2lfY21uZCwgZWhfZW50cnkpOworCQkJCQlpZiAoc2NtZC0+ZGV2aWNlID09IHNkZXYpCisJCQkJCQlzY3NpX2VoX2ZpbmlzaF9jbWQoc2NtZCwgZG9uZV9xKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgzLAorCQkJCQkJcHJpbnRrKCIlczogU1RBUlRfVU5JVCBmYWlsZWQgdG8gc2RldjoiCisJCQkJCQkgICAgICAgIiAweCVwXG4iLCBjdXJyZW50LT5jb21tLCBzZGV2KSk7CisJCX0KKwl9CisKKwlyZXR1cm4gbGlzdF9lbXB0eSh3b3JrX3EpOworfQorCisKKy8qKgorICogc2NzaV9laF9idXNfZGV2aWNlX3Jlc2V0IC0gc2VuZCBiZHIgaWYgbmVlZGVkCisgKiBAc2hvc3Q6CXNjc2kgaG9zdCBiZWluZyByZWNvdmVyZWQuCisgKiBAZWhfZG9uZV9xOglsaXN0X2hlYWQgZm9yIHByb2Nlc3NlZCBjb21tYW5kcy4KKyAqCisgKiBOb3RlczoKKyAqICAgIFRyeSBhIGJ1cyBkZXZpY2UgcmVzZXQuICBzdGlsbCwgbG9vayB0byBzZWUgd2hldGhlciB3ZSBoYXZlIG11bHRpcGxlCisgKiAgICBkZXZpY2VzIHRoYXQgYXJlIGphbW1lZCBvciBub3QgLSBpZiB3ZSBoYXZlIG11bHRpcGxlIGRldmljZXMsIGl0CisgKiAgICBtYWtlcyBubyBzZW5zZSB0byB0cnkgYnVzX2RldmljZV9yZXNldCAtIHdlIHJlYWxseSB3b3VsZCBuZWVkIHRvIHRyeQorICogICAgYSBidXNfcmVzZXQgaW5zdGVhZC4gCisgKiovCitzdGF0aWMgaW50IHNjc2lfZWhfYnVzX2RldmljZV9yZXNldChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqd29ya19xLAorCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkb25lX3EpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGgsICpsaF9zZjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kLCAqYmRyX3NjbWQ7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCWludCBydG47CisKKwlzaG9zdF9mb3JfZWFjaF9kZXZpY2Uoc2Rldiwgc2hvc3QpIHsKKwkJYmRyX3NjbWQgPSBOVUxMOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNjbWQsIHdvcmtfcSwgZWhfZW50cnkpCisJCQlpZiAoc2NtZC0+ZGV2aWNlID09IHNkZXYpIHsKKwkJCQliZHJfc2NtZCA9IHNjbWQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJaWYgKCFiZHJfc2NtZCkKKwkJCWNvbnRpbnVlOworCisJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygiJXM6IFNlbmRpbmcgQkRSIHNkZXY6IgorCQkJCQkJICAiIDB4JXBcbiIsIGN1cnJlbnQtPmNvbW0sCisJCQkJCQkgIHNkZXYpKTsKKwkJcnRuID0gc2NzaV90cnlfYnVzX2RldmljZV9yZXNldChiZHJfc2NtZCk7CisJCWlmIChydG4gPT0gU1VDQ0VTUykgeworCQkJaWYgKCFzY3NpX2RldmljZV9vbmxpbmUoc2RldikgfHwKKwkJCSAgICAhc2NzaV9laF90dXIoYmRyX3NjbWQpKSB7CisJCQkJbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBsaF9zZiwKKwkJCQkJCSAgIHdvcmtfcSkgeworCQkJCQlzY21kID0gbGlzdF9lbnRyeShsaCwgc3RydWN0CisJCQkJCQkJICBzY3NpX2NtbmQsCisJCQkJCQkJICBlaF9lbnRyeSk7CisJCQkJCWlmIChzY21kLT5kZXZpY2UgPT0gc2RldikKKwkJCQkJCXNjc2lfZWhfZmluaXNoX2NtZChzY21kLAorCQkJCQkJCQkgICBkb25lX3EpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygiJXM6IEJEUiIKKwkJCQkJCQkgICIgZmFpbGVkIHNkZXY6IgorCQkJCQkJCSAgIjB4JXBcbiIsCisJCQkJCQkJICBjdXJyZW50LT5jb21tLAorCQkJCQkJCSAgIHNkZXYpKTsKKwkJfQorCX0KKworCXJldHVybiBsaXN0X2VtcHR5KHdvcmtfcSk7Cit9CisKKy8qKgorICogc2NzaV90cnlfYnVzX3Jlc2V0IC0gYXNrIGhvc3QgdG8gcGVyZm9ybSBhIGJ1cyByZXNldAorICogQHNjbWQ6CVNDU0kgY21kIHRvIHNlbmQgYnVzIHJlc2V0LgorICoqLworc3RhdGljIGludCBzY3NpX3RyeV9idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBydG47CisKKwlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgzLCBwcmludGsoIiVzOiBTbmQgQnVzIFJTVFxuIiwKKwkJCQkJICBfX0ZVTkNUSU9OX18pKTsKKwlzY21kLT5vd25lciA9IFNDU0lfT1dORVJfTE9XTEVWRUw7CisJc2NtZC0+c2VyaWFsX251bWJlcl9hdF90aW1lb3V0ID0gc2NtZC0+c2VyaWFsX251bWJlcjsKKworCWlmICghc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0dC0+ZWhfYnVzX3Jlc2V0X2hhbmRsZXIpCisJCXJldHVybiBGQUlMRUQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJ0biA9IHNjbWQtPmRldmljZS0+aG9zdC0+aG9zdHQtPmVoX2J1c19yZXNldF9oYW5kbGVyKHNjbWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCWlmIChydG4gPT0gU1VDQ0VTUykgeworCQlpZiAoIXNjbWQtPmRldmljZS0+aG9zdC0+aG9zdHQtPnNraXBfc2V0dGxlX2RlbGF5KQorCQkJc3NsZWVwKEJVU19SRVNFVF9TRVRUTEVfVElNRSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKHNjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXNjc2lfcmVwb3J0X2J1c19yZXNldChzY21kLT5kZXZpY2UtPmhvc3QsIHNjbWQtPmRldmljZS0+Y2hhbm5lbCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gcnRuOworfQorCisvKioKKyAqIHNjc2lfdHJ5X2hvc3RfcmVzZXQgLSBhc2sgaG9zdCBhZGFwdGVyIHRvIHJlc2V0IGl0c2VsZgorICogQHNjbWQ6CVNDU0kgY21kIHRvIHNlbmQgaHNvdCByZXNldC4KKyAqKi8KK3N0YXRpYyBpbnQgc2NzaV90cnlfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJ0bjsKKworCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygiJXM6IFNuZCBIb3N0IFJTVFxuIiwKKwkJCQkJICBfX0ZVTkNUSU9OX18pKTsKKwlzY21kLT5vd25lciA9IFNDU0lfT1dORVJfTE9XTEVWRUw7CisJc2NtZC0+c2VyaWFsX251bWJlcl9hdF90aW1lb3V0ID0gc2NtZC0+c2VyaWFsX251bWJlcjsKKworCWlmICghc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0dC0+ZWhfaG9zdF9yZXNldF9oYW5kbGVyKQorCQlyZXR1cm4gRkFJTEVEOworCisJc3Bpbl9sb2NrX2lycXNhdmUoc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlydG4gPSBzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3R0LT5laF9ob3N0X3Jlc2V0X2hhbmRsZXIoc2NtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKHJ0biA9PSBTVUNDRVNTKSB7CisJCWlmICghc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0dC0+c2tpcF9zZXR0bGVfZGVsYXkpCisJCQlzc2xlZXAoSE9TVF9SRVNFVF9TRVRUTEVfVElNRSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKHNjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXNjc2lfcmVwb3J0X2J1c19yZXNldChzY21kLT5kZXZpY2UtPmhvc3QsIHNjbWQtPmRldmljZS0+Y2hhbm5lbCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gcnRuOworfQorCisvKioKKyAqIHNjc2lfZWhfYnVzX3Jlc2V0IC0gc2VuZCBhIGJ1cyByZXNldCAKKyAqIEBzaG9zdDoJc2NzaSBob3N0IGJlaW5nIHJlY292ZXJlZC4KKyAqIEBlaF9kb25lX3E6CWxpc3RfaGVhZCBmb3IgcHJvY2Vzc2VkIGNvbW1hbmRzLgorICoqLworc3RhdGljIGludCBzY3NpX2VoX2J1c19yZXNldChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqd29ya19xLAorCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkb25lX3EpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGgsICpsaF9zZjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kOworCXN0cnVjdCBzY3NpX2NtbmQgKmNoYW5fc2NtZDsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbDsKKwlpbnQgcnRuOworCisJLyoKKwkgKiB3ZSByZWFsbHkgd2FudCB0byBsb29wIG92ZXIgdGhlIHZhcmlvdXMgY2hhbm5lbHMsIGFuZCBkbyB0aGlzIG9uCisJICogYSBjaGFubmVsIGJ5IGNoYW5uZWwgYmFzaXMuICB3ZSBzaG91bGQgYWxzbyBjaGVjayB0byBzZWUgaWYgYW55CisJICogb2YgdGhlIGZhaWxlZCBjb21tYW5kcyBhcmUgb24gc29mdF9yZXNldCBkZXZpY2VzLCBhbmQgaWYgc28sIHNraXAKKwkgKiB0aGUgcmVzZXQuICAKKwkgKi8KKworCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPD0gc2hvc3QtPm1heF9jaGFubmVsOyBjaGFubmVsKyspIHsKKwkJY2hhbl9zY21kID0gTlVMTDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShzY21kLCB3b3JrX3EsIGVoX2VudHJ5KSB7CisJCQlpZiAoY2hhbm5lbCA9PSBzY21kLT5kZXZpY2UtPmNoYW5uZWwpIHsKKwkJCQljaGFuX3NjbWQgPSBzY21kOworCQkJCWJyZWFrOworCQkJCS8qCisJCQkJICogRklYTUUgYWRkIGJhY2sgaW4gc29tZSBzdXBwb3J0IGZvcgorCQkJCSAqIHNvZnRfcmVzZXQgZGV2aWNlcy4KKwkJCQkgKi8KKwkJCX0KKwkJfQorCisJCWlmICghY2hhbl9zY21kKQorCQkJY29udGludWU7CisJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygiJXM6IFNlbmRpbmcgQlJTVCBjaGFuOiIKKwkJCQkJCSAgIiAlZFxuIiwgY3VycmVudC0+Y29tbSwKKwkJCQkJCSAgY2hhbm5lbCkpOworCQlydG4gPSBzY3NpX3RyeV9idXNfcmVzZXQoY2hhbl9zY21kKTsKKwkJaWYgKHJ0biA9PSBTVUNDRVNTKSB7CisJCQlsaXN0X2Zvcl9lYWNoX3NhZmUobGgsIGxoX3NmLCB3b3JrX3EpIHsKKwkJCQlzY21kID0gbGlzdF9lbnRyeShsaCwgc3RydWN0IHNjc2lfY21uZCwKKwkJCQkJCSAgZWhfZW50cnkpOworCQkJCWlmIChjaGFubmVsID09IHNjbWQtPmRldmljZS0+Y2hhbm5lbCkKKwkJCQkJaWYgKCFzY3NpX2RldmljZV9vbmxpbmUoc2NtZC0+ZGV2aWNlKSB8fAorCQkJCQkgICAgIXNjc2lfZWhfdHVyKHNjbWQpKQorCQkJCQkJc2NzaV9laF9maW5pc2hfY21kKHNjbWQsCisJCQkJCQkJCSAgIGRvbmVfcSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgzLCBwcmludGsoIiVzOiBCUlNUIgorCQkJCQkJCSAgIiBmYWlsZWQgY2hhbjogJWRcbiIsCisJCQkJCQkJICBjdXJyZW50LT5jb21tLAorCQkJCQkJCSAgY2hhbm5lbCkpOworCQl9CisJfQorCXJldHVybiBsaXN0X2VtcHR5KHdvcmtfcSk7Cit9CisKKy8qKgorICogc2NzaV9laF9ob3N0X3Jlc2V0IC0gc2VuZCBhIGhvc3QgcmVzZXQgCisgKiBAd29ya19xOglsaXN0X2hlYWQgZm9yIHByb2Nlc3NlZCBjb21tYW5kcy4KKyAqIEBkb25lX3E6CWxpc3RfaGVhZCBmb3IgcHJvY2Vzc2VkIGNvbW1hbmRzLgorICoqLworc3RhdGljIGludCBzY3NpX2VoX2hvc3RfcmVzZXQoc3RydWN0IGxpc3RfaGVhZCAqd29ya19xLAorCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqZG9uZV9xKQoreworCWludCBydG47CisJc3RydWN0IGxpc3RfaGVhZCAqbGgsICpsaF9zZjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kOworCisJaWYgKCFsaXN0X2VtcHR5KHdvcmtfcSkpIHsKKwkJc2NtZCA9IGxpc3RfZW50cnkod29ya19xLT5uZXh0LAorCQkJCSAgc3RydWN0IHNjc2lfY21uZCwgZWhfZW50cnkpOworCisJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygiJXM6IFNlbmRpbmcgSFJTVFxuIgorCQkJCQkJICAsIGN1cnJlbnQtPmNvbW0pKTsKKworCQlydG4gPSBzY3NpX3RyeV9ob3N0X3Jlc2V0KHNjbWQpOworCQlpZiAocnRuID09IFNVQ0NFU1MpIHsKKwkJCWxpc3RfZm9yX2VhY2hfc2FmZShsaCwgbGhfc2YsIHdvcmtfcSkgeworCQkJCXNjbWQgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3Qgc2NzaV9jbW5kLCBlaF9lbnRyeSk7CisJCQkJaWYgKCFzY3NpX2RldmljZV9vbmxpbmUoc2NtZC0+ZGV2aWNlKSB8fAorCQkJCSAgICAoIXNjc2lfZWhfdHJ5X3N0dShzY21kKSAmJiAhc2NzaV9laF90dXIoc2NtZCkpIHx8CisJCQkJICAgICFzY3NpX2VoX3R1cihzY21kKSkKKwkJCQkJc2NzaV9laF9maW5pc2hfY21kKHNjbWQsIGRvbmVfcSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgzLCBwcmludGsoIiVzOiBIUlNUIgorCQkJCQkJCSAgIiBmYWlsZWRcbiIsCisJCQkJCQkJICBjdXJyZW50LT5jb21tKSk7CisJCX0KKwl9CisJcmV0dXJuIGxpc3RfZW1wdHkod29ya19xKTsKK30KKworLyoqCisgKiBzY3NpX2VoX29mZmxpbmVfc2RldnMgLSBvZmZsaW5lIHNjc2kgZGV2aWNlcyB0aGF0IGZhaWwgdG8gcmVjb3ZlcgorICogQHdvcmtfcToJbGlzdF9oZWFkIGZvciBwcm9jZXNzZWQgY29tbWFuZHMuCisgKiBAZG9uZV9xOglsaXN0X2hlYWQgZm9yIHByb2Nlc3NlZCBjb21tYW5kcy4KKyAqCisgKiovCitzdGF0aWMgdm9pZCBzY3NpX2VoX29mZmxpbmVfc2RldnMoc3RydWN0IGxpc3RfaGVhZCAqd29ya19xLAorCQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqZG9uZV9xKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxoLCAqbGhfc2Y7CisJc3RydWN0IHNjc2lfY21uZCAqc2NtZDsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShsaCwgbGhfc2YsIHdvcmtfcSkgeworCQlzY21kID0gbGlzdF9lbnRyeShsaCwgc3RydWN0IHNjc2lfY21uZCwgZWhfZW50cnkpOworCQlwcmludGsoS0VSTl9JTkZPICJzY3NpOiBEZXZpY2Ugb2ZmbGluZWQgLSBub3QiCisJCSAgICAgICAJCSIgcmVhZHkgYWZ0ZXIgZXJyb3IgcmVjb3Zlcnk6IGhvc3QiCisJCQkJIiAlZCBjaGFubmVsICVkIGlkICVkIGx1biAlZFxuIiwKKwkJCQlzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8sCisJCQkJc2NtZC0+ZGV2aWNlLT5jaGFubmVsLAorCQkJCXNjbWQtPmRldmljZS0+aWQsCisJCQkJc2NtZC0+ZGV2aWNlLT5sdW4pOworCQlzY3NpX2RldmljZV9zZXRfc3RhdGUoc2NtZC0+ZGV2aWNlLCBTREVWX09GRkxJTkUpOworCQlpZiAoc2NzaV9laF9lZmxhZ3NfY2hrKHNjbWQsIFNDU0lfRUhfQ0FOQ0VMX0NNRCkpIHsKKwkJCS8qCisJCQkgKiBGSVhNRTogSGFuZGxlIGxvc3QgY21kcy4KKwkJCSAqLworCQl9CisJCXNjc2lfZWhfZmluaXNoX2NtZChzY21kLCBkb25lX3EpOworCX0KKwlyZXR1cm47Cit9CisKKy8qKgorICogc2NzaV9kZWNpZGVfZGlzcG9zaXRpb24gLSBEaXNwb3NpdGlvbiBhIGNtZCBvbiByZXR1cm4gZnJvbSBMTEQuCisgKiBAc2NtZDoJU0NTSSBjbWQgdG8gZXhhbWluZS4KKyAqCisgKiBOb3RlczoKKyAqICAgIFRoaXMgaXMgKm9ubHkqIGNhbGxlZCB3aGVuIHdlIGFyZSBleGFtaW5pbmcgdGhlIHN0YXR1cyBhZnRlciBzZW5kaW5nCisgKiAgICBvdXQgdGhlIGFjdHVhbCBkYXRhIGNvbW1hbmQuICBhbnkgY29tbWFuZHMgdGhhdCBhcmUgcXVldWVkIGZvciBlcnJvcgorICogICAgcmVjb3ZlcnkgKGUuZy4gdGVzdF91bml0X3JlYWR5KSBkbyAqbm90KiBjb21lIHRocm91Z2ggaGVyZS4KKyAqCisgKiAgICBXaGVuIHRoaXMgcm91dGluZSByZXR1cm5zIGZhaWxlZCwgaXQgbWVhbnMgdGhlIGVycm9yIGhhbmRsZXIgdGhyZWFkCisgKiAgICBpcyB3b2tlbi4gIEluIGNhc2VzIHdoZXJlIHRoZSBlcnJvciBjb2RlIGluZGljYXRlcyBhbiBlcnJvciB0aGF0CisgKiAgICBkb2Vzbid0IHJlcXVpcmUgdGhlIGVycm9yIGhhbmRsZXIgcmVhZCAoaS5lLiB3ZSBkb24ndCBuZWVkIHRvCisgKiAgICBhYm9ydC9yZXNldCksIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBTVUNDRVNTLgorICoqLworaW50IHNjc2lfZGVjaWRlX2Rpc3Bvc2l0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCit7CisJaW50IHJ0bjsKKworCS8qCisJICogaWYgdGhlIGRldmljZSBpcyBvZmZsaW5lLCB0aGVuIHdlIGNsZWFybHkganVzdCBwYXNzIHRoZSByZXN1bHQgYmFjaworCSAqIHVwIHRvIHRoZSB0b3AgbGV2ZWwuCisJICovCisJaWYgKCFzY3NpX2RldmljZV9vbmxpbmUoc2NtZC0+ZGV2aWNlKSkgeworCQlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSg1LCBwcmludGsoIiVzOiBkZXZpY2Ugb2ZmbGluZSAtIHJlcG9ydCIKKwkJCQkJCSAgIiBhcyBTVUNDRVNTXG4iLAorCQkJCQkJICBfX0ZVTkNUSU9OX18pKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCisJLyoKKwkgKiBmaXJzdCBjaGVjayB0aGUgaG9zdCBieXRlLCB0byBzZWUgaWYgdGhlcmUgaXMgYW55dGhpbmcgaW4gdGhlcmUKKwkgKiB0aGF0IHdvdWxkIGluZGljYXRlIHdoYXQgd2UgbmVlZCB0byBkby4KKwkgKi8KKwlzd2l0Y2ggKGhvc3RfYnl0ZShzY21kLT5yZXN1bHQpKSB7CisJY2FzZSBESURfUEFTU1RIUk9VR0g6CisJCS8qCisJCSAqIG5vIG1hdHRlciB3aGF0LCBwYXNzIHRoaXMgdGhyb3VnaCB0byB0aGUgdXBwZXIgbGF5ZXIuCisJCSAqIG51a2UgdGhpcyBzcGVjaWFsIGNvZGUgc28gdGhhdCBpdCBsb29rcyBsaWtlIHdlIGFyZSBzYXlpbmcKKwkJICogZGlkX29rLgorCQkgKi8KKwkJc2NtZC0+cmVzdWx0ICY9IDB4ZmYwMGZmZmY7CisJCXJldHVybiBTVUNDRVNTOworCWNhc2UgRElEX09LOgorCQkvKgorCQkgKiBsb29rcyBnb29kLiAgZHJvcCB0aHJvdWdoLCBhbmQgY2hlY2sgdGhlIG5leHQgYnl0ZS4KKwkJICovCisJCWJyZWFrOworCWNhc2UgRElEX05PX0NPTk5FQ1Q6CisJY2FzZSBESURfQkFEX1RBUkdFVDoKKwljYXNlIERJRF9BQk9SVDoKKwkJLyoKKwkJICogbm90ZSAtIHRoaXMgbWVhbnMgdGhhdCB3ZSBqdXN0IHJlcG9ydCB0aGUgc3RhdHVzIGJhY2sKKwkJICogdG8gdGhlIHRvcCBsZXZlbCBkcml2ZXIsIG5vdCB0aGF0IHdlIGFjdHVhbGx5IHRoaW5rCisJCSAqIHRoYXQgaXQgaW5kaWNhdGVzIFNVQ0NFU1MuCisJCSAqLworCQlyZXR1cm4gU1VDQ0VTUzsKKwkJLyoKKwkJICogd2hlbiB0aGUgbG93IGxldmVsIGRyaXZlciByZXR1cm5zIGRpZF9zb2Z0X2Vycm9yLAorCQkgKiBpdCBpcyByZXNwb25zaWJsZSBmb3Iga2VlcGluZyBhbiBpbnRlcm5hbCByZXRyeSBjb3VudGVyIAorCQkgKiBpbiBvcmRlciB0byBhdm9pZCBlbmRsZXNzIGxvb3BzIChkYikKKwkJICoKKwkJICogYWN0dWFsbHkgdGhpcyBpcyBhIGJ1ZyBpbiB0aGlzIGZ1bmN0aW9uIGhlcmUuICB3ZSBzaG91bGQKKwkJICogYmUgbWluZGZ1bCBvZiB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBzcGVjaWZpZWQKKwkJICogYW5kIG5vdCBnZXQgc3R1Y2sgaW4gYSBsb29wLgorCQkgKi8KKwljYXNlIERJRF9TT0ZUX0VSUk9SOgorCQlnb3RvIG1heWJlX3JldHJ5OworCWNhc2UgRElEX0lNTV9SRVRSWToKKwkJcmV0dXJuIE5FRURTX1JFVFJZOworCisJY2FzZSBESURfRVJST1I6CisJCWlmIChtc2dfYnl0ZShzY21kLT5yZXN1bHQpID09IENPTU1BTkRfQ09NUExFVEUgJiYKKwkJICAgIHN0YXR1c19ieXRlKHNjbWQtPnJlc3VsdCkgPT0gUkVTRVJWQVRJT05fQ09ORkxJQ1QpCisJCQkvKgorCQkJICogZXhlY3V0ZSByZXNlcnZhdGlvbiBjb25mbGljdCBwcm9jZXNzaW5nIGNvZGUKKwkJCSAqIGxvd2VyIGRvd24KKwkJCSAqLworCQkJYnJlYWs7CisJCS8qIGZhbGx0aHJvdWdoICovCisKKwljYXNlIERJRF9CVVNfQlVTWToKKwljYXNlIERJRF9QQVJJVFk6CisJCWdvdG8gbWF5YmVfcmV0cnk7CisJY2FzZSBESURfVElNRV9PVVQ6CisJCS8qCisJCSAqIHdoZW4gd2Ugc2NhbiB0aGUgYnVzLCB3ZSBnZXQgdGltZW91dCBtZXNzYWdlcyBmb3IKKwkJICogdGhlc2UgY29tbWFuZHMgaWYgdGhlcmUgaXMgbm8gZGV2aWNlIGF2YWlsYWJsZS4KKwkJICogb3RoZXIgaG9zdHMgcmVwb3J0IGRpZF9ub19jb25uZWN0IGZvciB0aGUgc2FtZSB0aGluZy4KKwkJICovCisJCWlmICgoc2NtZC0+Y21uZFswXSA9PSBURVNUX1VOSVRfUkVBRFkgfHwKKwkJICAgICBzY21kLT5jbW5kWzBdID09IElOUVVJUlkpKSB7CisJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBGQUlMRUQ7CisJCX0KKwljYXNlIERJRF9SRVNFVDoKKwkJcmV0dXJuIFNVQ0NFU1M7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwkvKgorCSAqIG5leHQsIGNoZWNrIHRoZSBtZXNzYWdlIGJ5dGUuCisJICovCisJaWYgKG1zZ19ieXRlKHNjbWQtPnJlc3VsdCkgIT0gQ09NTUFORF9DT01QTEVURSkKKwkJcmV0dXJuIEZBSUxFRDsKKworCS8qCisJICogY2hlY2sgdGhlIHN0YXR1cyBieXRlIHRvIHNlZSBpZiB0aGlzIGluZGljYXRlcyBhbnl0aGluZyBzcGVjaWFsLgorCSAqLworCXN3aXRjaCAoc3RhdHVzX2J5dGUoc2NtZC0+cmVzdWx0KSkgeworCWNhc2UgUVVFVUVfRlVMTDoKKwkJLyoKKwkJICogdGhlIGNhc2Ugb2YgdHJ5aW5nIHRvIHNlbmQgdG9vIG1hbnkgY29tbWFuZHMgdG8gYQorCQkgKiB0YWdnZWQgcXVldWVpbmcgZGV2aWNlLgorCQkgKi8KKwljYXNlIEJVU1k6CisJCS8qCisJCSAqIGRldmljZSBjYW4ndCB0YWxrIHRvIHVzIGF0IHRoZSBtb21lbnQuICBTaG91bGQgb25seQorCQkgKiBvY2N1ciAoU0FNLTMpIHdoZW4gdGhlIHRhc2sgcXVldWUgaXMgZW1wdHksIHNvIHdpbGwgY2F1c2UKKwkJICogdGhlIGVtcHR5IHF1ZXVlIGhhbmRsaW5nIHRvIHRyaWdnZXIgYSBzdGFsbCBpbiB0aGUKKwkJICogZGV2aWNlLgorCQkgKi8KKwkJcmV0dXJuIEFERF9UT19NTFFVRVVFOworCWNhc2UgR09PRDoKKwljYXNlIENPTU1BTkRfVEVSTUlOQVRFRDoKKwljYXNlIFRBU0tfQUJPUlRFRDoKKwkJcmV0dXJuIFNVQ0NFU1M7CisJY2FzZSBDSEVDS19DT05ESVRJT046CisJCXJ0biA9IHNjc2lfY2hlY2tfc2Vuc2Uoc2NtZCk7CisJCWlmIChydG4gPT0gTkVFRFNfUkVUUlkpCisJCQlnb3RvIG1heWJlX3JldHJ5OworCQkvKiBpZiBydG4gPT0gRkFJTEVELCB3ZSBoYXZlIG5vIHNlbnNlIGluZm9ybWF0aW9uOworCQkgKiByZXR1cm5pbmcgRkFJTEVEIHdpbGwgd2FrZSB0aGUgZXJyb3IgaGFuZGxlciB0aHJlYWQKKwkJICogdG8gY29sbGVjdCB0aGUgc2Vuc2UgYW5kIHJlZG8gdGhlIGRlY2lkZQorCQkgKiBkaXNwb3NpdGlvbiAqLworCQlyZXR1cm4gcnRuOworCWNhc2UgQ09ORElUSU9OX0dPT0Q6CisJY2FzZSBJTlRFUk1FRElBVEVfR09PRDoKKwljYXNlIElOVEVSTUVESUFURV9DX0dPT0Q6CisJY2FzZSBBQ0FfQUNUSVZFOgorCQkvKgorCQkgKiB3aG8ga25vd3M/ICBGSVhNRShlcmljKQorCQkgKi8KKwkJcmV0dXJuIFNVQ0NFU1M7CisKKwljYXNlIFJFU0VSVkFUSU9OX0NPTkZMSUNUOgorCQlwcmludGsoS0VSTl9JTkZPICJzY3NpOiByZXNlcnZhdGlvbiBjb25mbGljdDogaG9zdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAlZCBjaGFubmVsICVkIGlkICVkIGx1biAlZFxuIiwKKwkJICAgICAgIHNjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9ubywgc2NtZC0+ZGV2aWNlLT5jaGFubmVsLAorCQkgICAgICAgc2NtZC0+ZGV2aWNlLT5pZCwgc2NtZC0+ZGV2aWNlLT5sdW4pOworCQlyZXR1cm4gU1VDQ0VTUzsgLyogY2F1c2VzIGltbWVkaWF0ZSBpL28gZXJyb3IgKi8KKwlkZWZhdWx0OgorCQlyZXR1cm4gRkFJTEVEOworCX0KKwlyZXR1cm4gRkFJTEVEOworCisgICAgICBtYXliZV9yZXRyeToKKworCS8qIHdlIHJlcXVldWUgZm9yIHJldHJ5IGJlY2F1c2UgdGhlIGVycm9yIHdhcyByZXRyeWFibGUsIGFuZAorCSAqIHRoZSByZXF1ZXN0IHdhcyBub3QgbWFya2VkIGZhc3QgZmFpbC4gIE5vdGUgdGhhdCBhYm92ZSwKKwkgKiBldmVuIGlmIHRoZSByZXF1ZXN0IGlzIG1hcmtlZCBmYXN0IGZhaWwsIHdlIHN0aWxsIHJlcXVldWUKKwkgKiBmb3IgcXVldWUgY29uZ2VzdGlvbiBjb25kaXRpb25zIChRVUVVRV9GVUxMIG9yIEJVU1kpICovCisJaWYgKCgrK3NjbWQtPnJldHJpZXMpIDwgc2NtZC0+YWxsb3dlZCAKKwkgICAgJiYgIWJsa19ub3JldHJ5X3JlcXVlc3Qoc2NtZC0+cmVxdWVzdCkpIHsKKwkJcmV0dXJuIE5FRURTX1JFVFJZOworCX0gZWxzZSB7CisJCS8qCisJCSAqIG5vIG1vcmUgcmV0cmllcyAtIHJlcG9ydCB0aGlzIG9uZSBiYWNrIHRvIHVwcGVyIGxldmVsLgorCQkgKi8KKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorfQorCisvKioKKyAqIHNjc2lfZWhfbG9ja19kb25lIC0gZG9uZSBmdW5jdGlvbiBmb3IgZWggZG9vciBsb2NrIHJlcXVlc3QKKyAqIEBzY21kOglTQ1NJIGNvbW1hbmQgYmxvY2sgZm9yIHRoZSBkb29yIGxvY2sgcmVxdWVzdAorICoKKyAqIE5vdGVzOgorICogCVdlIGNvbXBsZXRlZCB0aGUgYXN5bmNocm9ub3VzIGRvb3IgbG9jayByZXF1ZXN0LCBhbmQgaXQgaGFzIGVpdGhlcgorICogCWxvY2tlZCB0aGUgZG9vciBvciBmYWlsZWQuICBXZSBtdXN0IGZyZWUgdGhlIGNvbW1hbmQgc3RydWN0dXJlcworICogCWFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCisgKiovCitzdGF0aWMgdm9pZCBzY3NpX2VoX2xvY2tfZG9uZShzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQoreworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEgPSBzY21kLT5zY19yZXF1ZXN0OworCisJc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JlcSk7Cit9CisKKworLyoqCisgKiBzY3NpX2VoX2xvY2tfZG9vciAtIFByZXZlbnQgbWVkaXVtIHJlbW92YWwgZm9yIHRoZSBzcGVjaWZpZWQgZGV2aWNlCisgKiBAc2RldjoJU0NTSSBkZXZpY2UgdG8gcHJldmVudCBtZWRpdW0gcmVtb3ZhbAorICoKKyAqIExvY2tpbmc6CisgKiAJV2UgbXVzdCBiZSBjYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQ7IHNjc2lfYWxsb2NhdGVfcmVxdWVzdCgpCisgKiAJbWF5IHNsZWVwLgorICoKKyAqIE5vdGVzOgorICogCVdlIHF1ZXVlIHVwIGFuIGFzeW5jaHJvbm91cyAiQUxMT1cgTUVESVVNIFJFTU9WQUwiIHJlcXVlc3Qgb24gdGhlCisgKiAJaGVhZCBvZiB0aGUgZGV2aWNlcyByZXF1ZXN0IHF1ZXVlLCBhbmQgY29udGludWUuCisgKgorICogQnVnczoKKyAqIAlzY3NpX2FsbG9jYXRlX3JlcXVlc3QoKSBtYXkgc2xlZXAgd2FpdGluZyBmb3IgZXhpc3RpbmcgcmVxdWVzdHMgdG8KKyAqIAliZSBwcm9jZXNzZWQuICBIb3dldmVyLCBzaW5jZSB3ZSBoYXZlbid0IGtpY2tlZCBvZmYgYW55IHJlcXVlc3QKKyAqIAlwcm9jZXNzaW5nIGZvciB0aGlzIGhvc3QsIHRoaXMgbWF5IGRlYWRsb2NrLgorICoKKyAqCUlmIHNjc2lfYWxsb2NhdGVfcmVxdWVzdCgpIGZhaWxzIGZvciB3aGF0IGV2ZXIgcmVhc29uLCB3ZQorICoJY29tcGxldGVseSBmb3JnZXQgdG8gbG9jayB0aGUgZG9vci4KKyAqKi8KK3N0YXRpYyB2b2lkIHNjc2lfZWhfbG9ja19kb29yKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KHNkZXYsIEdGUF9LRVJORUwpOworCisJaWYgKHVubGlrZWx5KCFzcmVxKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZXF1ZXN0IGFsbG9jYXRlIGZhaWxlZCwiCisJCSAgICAgICAicHJldmVudCBtZWRpYSByZW1vdmFsIGNtZCBub3Qgc2VudFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCXNyZXEtPnNyX2NtbmRbMF0gPSBBTExPV19NRURJVU1fUkVNT1ZBTDsKKwlzcmVxLT5zcl9jbW5kWzFdID0gMDsKKwlzcmVxLT5zcl9jbW5kWzJdID0gMDsKKwlzcmVxLT5zcl9jbW5kWzNdID0gMDsKKwlzcmVxLT5zcl9jbW5kWzRdID0gU0NTSV9SRU1PVkFMX1BSRVZFTlQ7CisJc3JlcS0+c3JfY21uZFs1XSA9IDA7CisJc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKKwlzcmVxLT5zcl9idWZmbGVuID0gMDsKKwlzcmVxLT5zcl9idWZmZXIgPSBOVUxMOworCXNyZXEtPnNyX2FsbG93ZWQgPSA1OworCXNyZXEtPnNyX2RvbmUgPSBzY3NpX2VoX2xvY2tfZG9uZTsKKwlzcmVxLT5zcl90aW1lb3V0X3Blcl9jb21tYW5kID0gMTAgKiBIWjsKKwlzcmVxLT5zcl9jbWRfbGVuID0gQ09NTUFORF9TSVpFKHNyZXEtPnNyX2NtbmRbMF0pOworCisJc2NzaV9pbnNlcnRfc3BlY2lhbF9yZXEoc3JlcSwgMSk7Cit9CisKKworLyoqCisgKiBzY3NpX3Jlc3RhcnRfb3BlcmF0aW9ucyAtIHJlc3RhcnQgaW8gb3BlcmF0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGhvc3QuCisgKiBAc2hvc3Q6CUhvc3Qgd2UgYXJlIHJlc3RhcnRpbmcuCisgKgorICogTm90ZXM6CisgKiAgICBXaGVuIHdlIGVudGVyZWQgdGhlIGVycm9yIGhhbmRsZXIsIHdlIGJsb2NrZWQgYWxsIGZ1cnRoZXIgaS9vIHRvCisgKiAgICB0aGlzIGRldmljZS4gIHdlIG5lZWQgdG8gJ3JldmVyc2UnIHRoaXMgcHJvY2Vzcy4KKyAqKi8KK3N0YXRpYyB2b2lkIHNjc2lfcmVzdGFydF9vcGVyYXRpb25zKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKworCS8qCisJICogSWYgdGhlIGRvb3Igd2FzIGxvY2tlZCwgd2UgbmVlZCB0byBpbnNlcnQgYSBkb29yIGxvY2sgcmVxdWVzdAorCSAqIG9udG8gdGhlIGhlYWQgb2YgdGhlIFNDU0kgcmVxdWVzdCBxdWV1ZSBmb3IgdGhlIGRldmljZS4gIFRoZXJlCisJICogaXMgbm8gcG9pbnQgdHJ5aW5nIHRvIGxvY2sgdGhlIGRvb3Igb2YgYW4gb2ZmLWxpbmUgZGV2aWNlLgorCSAqLworCXNob3N0X2Zvcl9lYWNoX2RldmljZShzZGV2LCBzaG9zdCkgeworCQlpZiAoc2NzaV9kZXZpY2Vfb25saW5lKHNkZXYpICYmIHNkZXYtPmxvY2tlZCkKKwkJCXNjc2lfZWhfbG9ja19kb29yKHNkZXYpOworCX0KKworCS8qCisJICogbmV4dCBmcmVlIHVwIGFueXRoaW5nIGRpcmVjdGx5IHdhaXRpbmcgdXBvbiB0aGUgaG9zdC4gIHRoaXMKKwkgKiB3aWxsIGJlIHJlcXVlc3RzIGZvciBjaGFyYWN0ZXIgZGV2aWNlIG9wZXJhdGlvbnMsIGFuZCBhbHNvIGZvcgorCSAqIGlvY3RscyB0byBxdWV1ZWQgYmxvY2sgZGV2aWNlcy4KKwkgKi8KKwlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgzLCBwcmludGsoIiVzOiB3YWtpbmcgdXAgaG9zdCB0byByZXN0YXJ0XG4iLAorCQkJCQkgIF9fRlVOQ1RJT05fXykpOworCisJY2xlYXJfYml0KFNIT1NUX1JFQ09WRVJZLCAmc2hvc3QtPnNob3N0X3N0YXRlKTsKKworCXdha2VfdXAoJnNob3N0LT5ob3N0X3dhaXQpOworCisJLyoKKwkgKiBmaW5hbGx5IHdlIG5lZWQgdG8gcmUtaW5pdGlhdGUgcmVxdWVzdHMgdGhhdCBtYXkgYmUgcGVuZGluZy4gIHdlIHdpbGwKKwkgKiBoYXZlIGhhZCBldmVyeXRoaW5nIGJsb2NrZWQgd2hpbGUgZXJyb3IgaGFuZGxpbmcgaXMgdGFraW5nIHBsYWNlLCBhbmQKKwkgKiBub3cgdGhhdCBlcnJvciByZWNvdmVyeSBpcyBkb25lLCB3ZSB3aWxsIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlc2UKKwkgKiByZXF1ZXN0cyBhcmUgc3RhcnRlZC4KKwkgKi8KKwlzY3NpX3J1bl9ob3N0X3F1ZXVlcyhzaG9zdCk7Cit9CisKKy8qKgorICogc2NzaV9laF9yZWFkeV9kZXZzIC0gY2hlY2sgZGV2aWNlIHJlYWR5IHN0YXRlIGFuZCByZWNvdmVyIGlmIG5vdC4KKyAqIEBzaG9zdDogCWhvc3QgdG8gYmUgcmVjb3ZlcmVkLgorICogQGVoX2RvbmVfcToJbGlzdF9oZWFkIGZvciBwcm9jZXNzZWQgY29tbWFuZHMuCisgKgorICoqLworc3RhdGljIHZvaWQgc2NzaV9laF9yZWFkeV9kZXZzKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQkJICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKndvcmtfcSwKKwkJCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkb25lX3EpCit7CisJaWYgKCFzY3NpX2VoX3N0dShzaG9zdCwgd29ya19xLCBkb25lX3EpKQorCQlpZiAoIXNjc2lfZWhfYnVzX2RldmljZV9yZXNldChzaG9zdCwgd29ya19xLCBkb25lX3EpKQorCQkJaWYgKCFzY3NpX2VoX2J1c19yZXNldChzaG9zdCwgd29ya19xLCBkb25lX3EpKQorCQkJCWlmICghc2NzaV9laF9ob3N0X3Jlc2V0KHdvcmtfcSwgZG9uZV9xKSkKKwkJCQkJc2NzaV9laF9vZmZsaW5lX3NkZXZzKHdvcmtfcSwgZG9uZV9xKTsKK30KKworLyoqCisgKiBzY3NpX2VoX2ZsdXNoX2RvbmVfcSAtIGZpbmlzaCBwcm9jZXNzZWQgY29tbWFuZHMgb3IgcmV0cnkgdGhlbS4KKyAqIEBkb25lX3E6CWxpc3RfaGVhZCBvZiBwcm9jZXNzZWQgY29tbWFuZHMuCisgKgorICoqLworc3RhdGljIHZvaWQgc2NzaV9laF9mbHVzaF9kb25lX3Eoc3RydWN0IGxpc3RfaGVhZCAqZG9uZV9xKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxoLCAqbGhfc2Y7CisJc3RydWN0IHNjc2lfY21uZCAqc2NtZDsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShsaCwgbGhfc2YsIGRvbmVfcSkgeworCQlzY21kID0gbGlzdF9lbnRyeShsaCwgc3RydWN0IHNjc2lfY21uZCwgZWhfZW50cnkpOworCQlsaXN0X2RlbF9pbml0KGxoKTsKKwkJaWYgKHNjc2lfZGV2aWNlX29ubGluZShzY21kLT5kZXZpY2UpICYmCisJCSAgICAhYmxrX25vcmV0cnlfcmVxdWVzdChzY21kLT5yZXF1ZXN0KSAmJgorCQkgICAgKCsrc2NtZC0+cmV0cmllcyA8IHNjbWQtPmFsbG93ZWQpKSB7CisJCQlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgzLCBwcmludGsoIiVzOiBmbHVzaCIKKwkJCQkJCQkgICIgcmV0cnkgY21kOiAlcFxuIiwKKwkJCQkJCQkgIGN1cnJlbnQtPmNvbW0sCisJCQkJCQkJICBzY21kKSk7CisJCQkJc2NzaV9xdWV1ZV9pbnNlcnQoc2NtZCwgU0NTSV9NTFFVRVVFX0VIX1JFVFJZKTsKKwkJfSBlbHNlIHsKKwkJCWlmICghc2NtZC0+cmVzdWx0KQorCQkJCXNjbWQtPnJlc3VsdCB8PSAoRFJJVkVSX1RJTUVPVVQgPDwgMjQpOworCQkJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMywgcHJpbnRrKCIlczogZmx1c2ggZmluaXNoIgorCQkJCQkJCSIgY21kOiAlcFxuIiwKKwkJCQkJCQljdXJyZW50LT5jb21tLCBzY21kKSk7CisJCQlzY3NpX2ZpbmlzaF9jb21tYW5kKHNjbWQpOworCQl9CisJfQorfQorCisvKioKKyAqIHNjc2lfdW5qYW1faG9zdCAtIEF0dGVtcHQgdG8gZml4IGEgaG9zdCB3aGljaCBoYXMgYSBjbWQgdGhhdCBmYWlsZWQuCisgKiBAc2hvc3Q6CUhvc3QgdG8gdW5qYW0uCisgKgorICogTm90ZXM6CisgKiAgICBXaGVuIHdlIGNvbWUgaW4gaGVyZSwgd2UgKmtub3cqIHRoYXQgYWxsIGNvbW1hbmRzIG9uIHRoZSBidXMgaGF2ZQorICogICAgZWl0aGVyIGNvbXBsZXRlZCwgZmFpbGVkIG9yIHRpbWVkIG91dC4gIHdlIGFsc28ga25vdyB0aGF0IG5vIGZ1cnRoZXIKKyAqICAgIGNvbW1hbmRzIGFyZSBiZWluZyBzZW50IHRvIHRoZSBob3N0LCBzbyB0aGluZ3MgYXJlIHJlbGF0aXZlbHkgcXVpZXQKKyAqICAgIGFuZCB3ZSBoYXZlIGZyZWVkb20gdG8gZmlkZGxlIHdpdGggdGhpbmdzIGFzIHdlIHdpc2guCisgKgorICogICAgVGhpcyBpcyBvbmx5IHRoZSAqZGVmYXVsdCogaW1wbGVtZW50YXRpb24uICBpdCBpcyBwb3NzaWJsZSBmb3IKKyAqICAgIGluZGl2aWR1YWwgZHJpdmVycyB0byBzdXBwbHkgdGhlaXIgb3duIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiwgYW5kCisgKiAgICBpZiB0aGUgbWFpbnRhaW5lciB3aXNoZXMgdG8gZG8gdGhpcywgaXQgaXMgc3Ryb25nbHkgc3VnZ2VzdGVkIHRoYXQKKyAqICAgIHRoaXMgZnVuY3Rpb24gYmUgdGFrZW4gYXMgYSB0ZW1wbGF0ZSBhbmQgbW9kaWZpZWQuICB0aGlzIGZ1bmN0aW9uCisgKiAgICB3YXMgZGVzaWduZWQgdG8gY29ycmVjdGx5IGhhbmRsZSBwcm9ibGVtcyBmb3IgYWJvdXQgOTUlIG9mIHRoZQorICogICAgZGlmZmVyZW50IGNhc2VzIG91dCB0aGVyZSwgYW5kIGl0IHNob3VsZCBhbHdheXMgcHJvdmlkZSBhdCBsZWFzdCBhCisgKiAgICByZWFzb25hYmxlIGFtb3VudCBvZiBlcnJvciByZWNvdmVyeS4KKyAqCisgKiAgICBBbnkgY29tbWFuZCBtYXJrZWQgJ2ZhaWxlZCcgb3IgJ3RpbWVvdXQnIG11c3QgZXZlbnR1YWxseSBoYXZlCisgKiAgICBzY3NpX2ZpbmlzaF9jbWQoKSBjYWxsZWQgZm9yIGl0LiAgd2UgZG8gYWxsIG9mIHRoZSByZXRyeSBzdHVmZgorICogICAgaGVyZSwgc28gd2hlbiB3ZSByZXN0YXJ0IHRoZSBob3N0IGFmdGVyIHdlIHJldHVybiBpdCBzaG91bGQgaGF2ZSBhbgorICogICAgZW1wdHkgcXVldWUuCisgKiovCitzdGF0aWMgdm9pZCBzY3NpX3VuamFtX2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlMSVNUX0hFQUQoZWhfd29ya19xKTsKKwlMSVNUX0hFQUQoZWhfZG9uZV9xKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X3NwbGljZV9pbml0KCZzaG9zdC0+ZWhfY21kX3EsICZlaF93b3JrX3EpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMSwgc2NzaV9laF9wcnRfZmFpbF9zdGF0cyhzaG9zdCwgJmVoX3dvcmtfcSkpOworCisJaWYgKCFzY3NpX2VoX2dldF9zZW5zZSgmZWhfd29ya19xLCAmZWhfZG9uZV9xKSkKKwkJaWYgKCFzY3NpX2VoX2Fib3J0X2NtZHMoJmVoX3dvcmtfcSwgJmVoX2RvbmVfcSkpCisJCQlzY3NpX2VoX3JlYWR5X2RldnMoc2hvc3QsICZlaF93b3JrX3EsICZlaF9kb25lX3EpOworCisJc2NzaV9laF9mbHVzaF9kb25lX3EoJmVoX2RvbmVfcSk7Cit9CisKKy8qKgorICogc2NzaV9lcnJvcl9oYW5kbGVyIC0gSGFuZGxlIGVycm9ycy90aW1lb3V0cyBvZiBTQ1NJIGNtZHMuCisgKiBAZGF0YToJSG9zdCBmb3Igd2hpY2ggd2UgYXJlIHJ1bm5pbmcuCisgKgorICogTm90ZXM6CisgKiAgICBUaGlzIGlzIGFsd2F5cyBydW4gaW4gdGhlIGNvbnRleHQgb2YgYSBrZXJuZWwgdGhyZWFkLiAgVGhlIGlkZWEgaXMKKyAqICAgIHRoYXQgd2Ugc3RhcnQgdGhpcyB0aGluZyB1cCB3aGVuIHRoZSBrZXJuZWwgc3RhcnRzIHVwIChvbmUgcGVyIGhvc3QKKyAqICAgIHRoYXQgd2UgZGV0ZWN0KSwgYW5kIGl0IGltbWVkaWF0ZWx5IGdvZXMgdG8gc2xlZXAgYW5kIHdhaXRzIGZvciBzb21lCisgKiAgICBldmVudCAoaS5lLiBmYWlsdXJlKS4gIFdoZW4gdGhpcyB0YWtlcyBwbGFjZSwgd2UgaGF2ZSB0aGUgam9iIG9mCisgKiAgICB0cnlpbmcgdG8gdW5qYW0gdGhlIGJ1cyBhbmQgcmVzdGFydGluZyB0aGluZ3MuCisgKiovCitpbnQgc2NzaV9lcnJvcl9oYW5kbGVyKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSAoc3RydWN0IFNjc2lfSG9zdCAqKSBkYXRhOworCWludCBydG47CisJREVDTEFSRV9NVVRFWF9MT0NLRUQoc2VtKTsKKworCS8qCisJICogICAgRmx1c2ggcmVzb3VyY2VzCisJICovCisKKwlkYWVtb25pemUoInNjc2lfZWhfJWQiLCBzaG9zdC0+aG9zdF9ubyk7CisKKwljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKKworCXNob3N0LT5laF93YWl0ID0gJnNlbTsKKwlzaG9zdC0+ZWhhbmRsZXIgPSBjdXJyZW50OworCisJLyoKKwkgKiBXYWtlIHVwIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHVzLgorCSAqLworCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygiV2FrZSB1cCBwYXJlbnQgb2YiCisJCQkJCSAgIiBzY3NpX2VoXyVkXG4iLHNob3N0LT5ob3N0X25vKSk7CisKKwljb21wbGV0ZShzaG9zdC0+ZWhfbm90aWZ5KTsKKworCXdoaWxlICgxKSB7CisJCS8qCisJCSAqIElmIHdlIGdldCBhIHNpZ25hbCwgaXQgbWVhbnMgd2UgYXJlIHN1cHBvc2VkIHRvIGdvCisJCSAqIGF3YXkgYW5kIGRpZS4gIFRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgaWYgdGhlIHVzZXIgaXMKKwkJICogdHJ5aW5nIHRvIHVubG9hZCBhIG1vZHVsZS4KKwkJICovCisJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDEsIHByaW50aygiRXJyb3IgaGFuZGxlciIKKwkJCQkJCSAgIiBzY3NpX2VoXyVkIgorCQkJCQkJICAiIHNsZWVwaW5nXG4iLHNob3N0LT5ob3N0X25vKSk7CisKKwkJLyoKKwkJICogTm90ZSAtIHdlIGFsd2F5cyB1c2UgZG93bl9pbnRlcnJ1cHRpYmxlIHdpdGggdGhlIHNlbWFwaG9yZQorCQkgKiBldmVuIGlmIHRoZSBtb2R1bGUgd2FzIGxvYWRlZCBhcyBwYXJ0IG9mIHRoZSBrZXJuZWwuICBUaGUKKwkJICogcmVhc29uIGlzIHRoYXQgZG93bigpIHdpbGwgY2F1c2UgdGhpcyB0aHJlYWQgdG8gYmUgY291bnRlZAorCQkgKiBpbiB0aGUgbG9hZCBhdmVyYWdlIGFzIGEgcnVubmluZyBwcm9jZXNzLCBhbmQgZG93bgorCQkgKiBpbnRlcnJ1cHRpYmxlIGRvZXNuJ3QuICBHaXZlbiB0aGF0IHdlIG5lZWQgdG8gYWxsb3cgdGhpcworCQkgKiB0aHJlYWQgdG8gZGllIGlmIHRoZSBkcml2ZXIgd2FzIGxvYWRlZCBhcyBhIG1vZHVsZSwgdXNpbmcKKwkJICogc2VtYXBob3JlcyBpc24ndCB1bnJlYXNvbmFibGUuCisJCSAqLworCQlkb3duX2ludGVycnVwdGlibGUoJnNlbSk7CisJCWlmIChzaG9zdC0+ZWhfa2lsbCkKKwkJCWJyZWFrOworCisJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDEsIHByaW50aygiRXJyb3IgaGFuZGxlciIKKwkJCQkJCSAgIiBzY3NpX2VoXyVkIHdha2luZyIKKwkJCQkJCSAgIiB1cFxuIixzaG9zdC0+aG9zdF9ubykpOworCisJCXNob3N0LT5laF9hY3RpdmUgPSAxOworCisJCS8qCisJCSAqIFdlIGhhdmUgYSBob3N0IHRoYXQgaXMgZmFpbGluZyBmb3Igc29tZSByZWFzb24uICBGaWd1cmUgb3V0CisJCSAqIHdoYXQgd2UgbmVlZCB0byBkbyB0byBnZXQgaXQgdXAgYW5kIG9ubGluZSBhZ2FpbiAoaWYgd2UgY2FuKS4KKwkJICogSWYgd2UgZmFpbCwgd2UgZW5kIHVwIHRha2luZyB0aGUgdGhpbmcgb2ZmbGluZS4KKwkJICovCisJCWlmIChzaG9zdC0+aG9zdHQtPmVoX3N0cmF0ZWd5X2hhbmRsZXIpIAorCQkJcnRuID0gc2hvc3QtPmhvc3R0LT5laF9zdHJhdGVneV9oYW5kbGVyKHNob3N0KTsKKwkJZWxzZQorCQkJc2NzaV91bmphbV9ob3N0KHNob3N0KTsKKworCQlzaG9zdC0+ZWhfYWN0aXZlID0gMDsKKworCQkvKgorCQkgKiBOb3RlIC0gaWYgdGhlIGFib3ZlIGZhaWxzIGNvbXBsZXRlbHksIHRoZSBhY3Rpb24gaXMgdG8gdGFrZQorCQkgKiBpbmRpdmlkdWFsIGRldmljZXMgb2ZmbGluZSBhbmQgZmx1c2ggdGhlIHF1ZXVlIG9mIGFueQorCQkgKiBvdXRzdGFuZGluZyByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGJlZW4gcGVuZGluZy4gIFdoZW4gd2UKKwkJICogcmVzdGFydCwgd2UgcmVzdGFydCBhbnkgSS9PIHRvIGFueSBvdGhlciBkZXZpY2VzIG9uIHRoZSBidXMKKwkJICogd2hpY2ggYXJlIHN0aWxsIG9ubGluZS4KKwkJICovCisJCXNjc2lfcmVzdGFydF9vcGVyYXRpb25zKHNob3N0KTsKKworCX0KKworCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDEsIHByaW50aygiRXJyb3IgaGFuZGxlciBzY3NpX2VoXyVkIgorCQkJCQkgICIgZXhpdGluZ1xuIixzaG9zdC0+aG9zdF9ubykpOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCBub2JvZHkgdHJpZXMgdG8gd2FrZSB1cyB1cCBhZ2Fpbi4KKwkgKi8KKwlzaG9zdC0+ZWhfd2FpdCA9IE5VTEw7CisKKwkvKgorCSAqIEtub2NrIHRoaXMgZG93biB0b28uICBGcm9tIHRoaXMgcG9pbnQgb24sIHRoZSBob3N0IGlzIGZseWluZworCSAqIHdpdGhvdXQgYSBwaWxvdC4gIElmIHRoaXMgaXMgYmVjYXVzZSB0aGUgbW9kdWxlIGlzIGJlaW5nIHVubG9hZGVkLAorCSAqIHRoYXQncyBmaW5lLiAgSWYgdGhlIHVzZXIgc2VudCBhIHNpZ25hbCB0byB0aGlzIHRoaW5nLCB3ZSBhcmUKKwkgKiBwb3RlbnRpYWxseSBpbiByZWFsIGRhbmdlci4KKwkgKi8KKwlzaG9zdC0+ZWhfYWN0aXZlID0gMDsKKwlzaG9zdC0+ZWhhbmRsZXIgPSBOVUxMOworCisJLyoKKwkgKiBJZiBhbnlvbmUgaXMgd2FpdGluZyBmb3IgdXMgdG8gZXhpdCAoaS5lLiBzb21lb25lIHRyeWluZyB0byB1bmxvYWQKKwkgKiBhIGRyaXZlciksIHRoZW4gd2FrZSB1cCB0aGF0IHByb2Nlc3MgdG8gbGV0IHRoZW0ga25vdyB3ZSBhcmUgb24KKwkgKiB0aGUgd2F5IG91dCB0aGUgZG9vci4KKwkgKi8KKwljb21wbGV0ZV9hbmRfZXhpdChzaG9zdC0+ZWhfbm90aWZ5LCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiAgICBzY3NpX3JlcG9ydF9idXNfcmVzZXQoKQorICoKKyAqIFB1cnBvc2U6ICAgICBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgbG93LWxldmVsIGRyaXZlcnMgdG8gcmVwb3J0IHRoYXQKKyAqCQl0aGV5IGhhdmUgb2JzZXJ2ZWQgYSBidXMgcmVzZXQgb24gdGhlIGJ1cyBiZWluZyBoYW5kbGVkLgorICoKKyAqIEFyZ3VtZW50czogICBzaG9zdCAgICAgICAtIEhvc3QgaW4gcXVlc3Rpb24KKyAqCQljaGFubmVsICAgICAtIGNoYW5uZWwgb24gd2hpY2ggcmVzZXQgd2FzIG9ic2VydmVkLgorICoKKyAqIFJldHVybnM6ICAgICBOb3RoaW5nCisgKgorICogTG9jayBzdGF0dXM6IEhvc3QgbG9jayBtdXN0IGJlIGhlbGQuCisgKgorICogTm90ZXM6ICAgICAgIFRoaXMgb25seSBuZWVkcyB0byBiZSBjYWxsZWQgaWYgdGhlIHJlc2V0IGlzIG9uZSB3aGljaAorICoJCW9yaWdpbmF0ZXMgZnJvbSBhbiB1bmtub3duIGxvY2F0aW9uLiAgUmVzZXRzIG9yaWdpbmF0ZWQKKyAqCQlieSB0aGUgbWlkLWxldmVsIGl0c2VsZiBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcywgYnV0IHRoZXJlCisgKgkJc2hvdWxkIGJlIG5vIGhhcm0uCisgKgorICoJCVRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBtYWtlIHN1cmUgdGhhdCBhIENIRUNLX0NPTkRJVElPTgorICoJCWlzIHByb3Blcmx5IHRyZWF0ZWQuCisgKi8KK3ZvaWQgc2NzaV9yZXBvcnRfYnVzX3Jlc2V0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBpbnQgY2hhbm5lbCkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisKKwlfX3Nob3N0X2Zvcl9lYWNoX2RldmljZShzZGV2LCBzaG9zdCkgeworCQlpZiAoY2hhbm5lbCA9PSBzZGV2LT5jaGFubmVsKSB7CisJCQlzZGV2LT53YXNfcmVzZXQgPSAxOworCQkJc2Rldi0+ZXhwZWN0aW5nX2NjX3VhID0gMTsKKwkJfQorCX0KK30KK0VYUE9SVF9TWU1CT0woc2NzaV9yZXBvcnRfYnVzX3Jlc2V0KTsKKworLyoKKyAqIEZ1bmN0aW9uOiAgICBzY3NpX3JlcG9ydF9kZXZpY2VfcmVzZXQoKQorICoKKyAqIFB1cnBvc2U6ICAgICBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgbG93LWxldmVsIGRyaXZlcnMgdG8gcmVwb3J0IHRoYXQKKyAqCQl0aGV5IGhhdmUgb2JzZXJ2ZWQgYSBkZXZpY2UgcmVzZXQgb24gdGhlIGRldmljZSBiZWluZyBoYW5kbGVkLgorICoKKyAqIEFyZ3VtZW50czogICBzaG9zdCAgICAgICAtIEhvc3QgaW4gcXVlc3Rpb24KKyAqCQljaGFubmVsICAgICAtIGNoYW5uZWwgb24gd2hpY2ggcmVzZXQgd2FzIG9ic2VydmVkCisgKgkJdGFyZ2V0CSAgICAtIHRhcmdldCBvbiB3aGljaCByZXNldCB3YXMgb2JzZXJ2ZWQKKyAqCisgKiBSZXR1cm5zOiAgICAgTm90aGluZworICoKKyAqIExvY2sgc3RhdHVzOiBIb3N0IGxvY2sgbXVzdCBiZSBoZWxkCisgKgorICogTm90ZXM6ICAgICAgIFRoaXMgb25seSBuZWVkcyB0byBiZSBjYWxsZWQgaWYgdGhlIHJlc2V0IGlzIG9uZSB3aGljaAorICoJCW9yaWdpbmF0ZXMgZnJvbSBhbiB1bmtub3duIGxvY2F0aW9uLiAgUmVzZXRzIG9yaWdpbmF0ZWQKKyAqCQlieSB0aGUgbWlkLWxldmVsIGl0c2VsZiBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcywgYnV0IHRoZXJlCisgKgkJc2hvdWxkIGJlIG5vIGhhcm0uCisgKgorICoJCVRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBtYWtlIHN1cmUgdGhhdCBhIENIRUNLX0NPTkRJVElPTgorICoJCWlzIHByb3Blcmx5IHRyZWF0ZWQuCisgKi8KK3ZvaWQgc2NzaV9yZXBvcnRfZGV2aWNlX3Jlc2V0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBpbnQgY2hhbm5lbCwgaW50IHRhcmdldCkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisKKwlfX3Nob3N0X2Zvcl9lYWNoX2RldmljZShzZGV2LCBzaG9zdCkgeworCQlpZiAoY2hhbm5lbCA9PSBzZGV2LT5jaGFubmVsICYmCisJCSAgICB0YXJnZXQgPT0gc2Rldi0+aWQpIHsKKwkJCXNkZXYtPndhc19yZXNldCA9IDE7CisJCQlzZGV2LT5leHBlY3RpbmdfY2NfdWEgPSAxOworCQl9CisJfQorfQorRVhQT1JUX1NZTUJPTChzY3NpX3JlcG9ydF9kZXZpY2VfcmVzZXQpOworCitzdGF0aWMgdm9pZAorc2NzaV9yZXNldF9wcm92aWRlcl9kb25lX2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK3sKK30KKworLyoKKyAqIEZ1bmN0aW9uOglzY3NpX3Jlc2V0X3Byb3ZpZGVyCisgKgorICogUHVycG9zZToJU2VuZCByZXF1ZXN0ZWQgcmVzZXQgdG8gYSBidXMgb3IgZGV2aWNlIGF0IGFueSBwaGFzZS4KKyAqCisgKiBBcmd1bWVudHM6CWRldmljZQktIGRldmljZSB0byBzZW5kIHJlc2V0IHRvCisgKgkJZmxhZyAtIHJlc2V0IHR5cGUgKHNlZSBzY3NpLmgpCisgKgorICogUmV0dXJuczoJU1VDQ0VTUy9GQUlMVVJFLgorICoKKyAqIE5vdGVzOglUaGlzIGlzIHVzZWQgYnkgdGhlIFNDU0kgR2VuZXJpYyBkcml2ZXIgdG8gcHJvdmlkZQorICoJCUJ1cy9EZXZpY2UgcmVzZXQgY2FwYWJpbGl0eS4KKyAqLworaW50CitzY3NpX3Jlc2V0X3Byb3ZpZGVyKHN0cnVjdCBzY3NpX2RldmljZSAqZGV2LCBpbnQgZmxhZykKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kID0gc2NzaV9nZXRfY29tbWFuZChkZXYsIEdGUF9LRVJORUwpOworCXN0cnVjdCByZXF1ZXN0IHJlcTsKKwlpbnQgcnRuOworCisJc2NtZC0+cmVxdWVzdCA9ICZyZXE7CisJbWVtc2V0KCZzY21kLT5laF90aW1lb3V0LCAwLCBzaXplb2Yoc2NtZC0+ZWhfdGltZW91dCkpOworCXNjbWQtPnJlcXVlc3QtPnJxX3N0YXR1cyAgICAgIAk9IFJRX1NDU0lfQlVTWTsKKwlzY21kLT5zdGF0ZSAgICAgICAgICAgICAgICAgICAJPSBTQ1NJX1NUQVRFX0lOSVRJQUxJWklORzsKKwlzY21kLT5vd25lcgkgICAgIAkJPSBTQ1NJX09XTkVSX01JRExFVkVMOworICAgIAorCW1lbXNldCgmc2NtZC0+Y21uZCwgJ1wwJywgc2l6ZW9mKHNjbWQtPmNtbmQpKTsKKyAgICAKKwlzY21kLT5zY3NpX2RvbmUJCT0gc2NzaV9yZXNldF9wcm92aWRlcl9kb25lX2NvbW1hbmQ7CisJc2NtZC0+ZG9uZQkJCT0gTlVMTDsKKwlzY21kLT5idWZmZXIJCQk9IE5VTEw7CisJc2NtZC0+YnVmZmxlbgkJCT0gMDsKKwlzY21kLT5yZXF1ZXN0X2J1ZmZlcgkJPSBOVUxMOworCXNjbWQtPnJlcXVlc3RfYnVmZmxlbgkJPSAwOworCXNjbWQtPmludGVybmFsX3RpbWVvdXQJCT0gTk9STUFMX1RJTUVPVVQ7CisJc2NtZC0+YWJvcnRfcmVhc29uCQk9IERJRF9BQk9SVDsKKworCXNjbWQtPmNtZF9sZW4JCQk9IDA7CisKKwlzY21kLT5zY19kYXRhX2RpcmVjdGlvbgkJPSBETUFfQklESVJFQ1RJT05BTDsKKwlzY21kLT5zY19yZXF1ZXN0CQk9IE5VTEw7CisJc2NtZC0+c2NfbWFnaWMJCQk9IFNDU0lfQ01ORF9NQUdJQzsKKworCWluaXRfdGltZXIoJnNjbWQtPmVoX3RpbWVvdXQpOworCisJLyoKKwkgKiBTb21ldGltZXMgdGhlIGNvbW1hbmQgY2FuIGdldCBiYWNrIGludG8gdGhlIHRpbWVyIGNoYWluLAorCSAqIHNvIHVzZSB0aGUgcGlkIGFzIGFuIGlkZW50aWZpZXIuCisJICovCisJc2NtZC0+cGlkCQkJPSAwOworCisJc3dpdGNoIChmbGFnKSB7CisJY2FzZSBTQ1NJX1RSWV9SRVNFVF9ERVZJQ0U6CisJCXJ0biA9IHNjc2lfdHJ5X2J1c19kZXZpY2VfcmVzZXQoc2NtZCk7CisJCWlmIChydG4gPT0gU1VDQ0VTUykKKwkJCWJyZWFrOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgU0NTSV9UUllfUkVTRVRfQlVTOgorCQlydG4gPSBzY3NpX3RyeV9idXNfcmVzZXQoc2NtZCk7CisJCWlmIChydG4gPT0gU1VDQ0VTUykKKwkJCWJyZWFrOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgU0NTSV9UUllfUkVTRVRfSE9TVDoKKwkJcnRuID0gc2NzaV90cnlfaG9zdF9yZXNldChzY21kKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcnRuID0gRkFJTEVEOworCX0KKworCXNjc2lfZGVsZXRlX3RpbWVyKHNjbWQpOworCXNjc2lfbmV4dF9jb21tYW5kKHNjbWQpOworCXJldHVybiBydG47Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfcmVzZXRfcHJvdmlkZXIpOworCisvKioKKyAqIHNjc2lfbm9ybWFsaXplX3NlbnNlIC0gbm9ybWFsaXplIG1haW4gZWxlbWVudHMgZnJvbSBlaXRoZXIgZml4ZWQgb3IKKyAqCQkJZGVzY3JpcHRvciBzZW5zZSBkYXRhIGZvcm1hdCBpbnRvIGEgY29tbW9uIGZvcm1hdC4KKyAqCisgKiBAc2Vuc2VfYnVmZmVyOglieXRlIGFycmF5IGNvbnRhaW5pbmcgc2Vuc2UgZGF0YSByZXR1cm5lZCBieSBkZXZpY2UKKyAqIEBzYl9sZW46CQludW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gc2Vuc2VfYnVmZmVyCisgKiBAc3NoZHI6CQlwb2ludGVyIHRvIGluc3RhbmNlIG9mIHN0cnVjdHVyZSB0aGF0IGNvbW1vbgorICoJCQllbGVtZW50cyBhcmUgd3JpdHRlbiB0by4KKyAqCisgKiBOb3RlczoKKyAqCVRoZSAibWFpbiBlbGVtZW50cyIgZnJvbSBzZW5zZSBkYXRhIGFyZTogcmVzcG9uc2VfY29kZSwgc2Vuc2Vfa2V5LAorICoJYXNjLCBhc2NxIGFuZCBhZGRpdGlvbmFsX2xlbmd0aCAob25seSBmb3IgZGVzY3JpcHRvciBmb3JtYXQpLgorICoKKyAqCVR5cGljYWxseSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgYSBkZXZpY2UgaGFzCisgKglyZXNwb25kZWQgdG8gYSBTQ1NJIGNvbW1hbmQgd2l0aCB0aGUgQ0hFQ0tfQ09ORElUSU9OIHN0YXR1cy4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKgkxIGlmIHZhbGlkIHNlbnNlIGRhdGEgaW5mb3JtYXRpb24gZm91bmQsIGVsc2UgMDsKKyAqKi8KK2ludCBzY3NpX25vcm1hbGl6ZV9zZW5zZShjb25zdCB1OCAqc2Vuc2VfYnVmZmVyLCBpbnQgc2JfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY3NpX3NlbnNlX2hkciAqc3NoZHIpCit7CisJaWYgKCFzZW5zZV9idWZmZXIgfHwgIXNiX2xlbiB8fCAoc2Vuc2VfYnVmZmVyWzBdICYgMHg3MCkgIT0gMHg3MCkKKwkJcmV0dXJuIDA7CisKKwltZW1zZXQoc3NoZHIsIDAsIHNpemVvZihzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIpKTsKKworCXNzaGRyLT5yZXNwb25zZV9jb2RlID0gKHNlbnNlX2J1ZmZlclswXSAmIDB4N2YpOworCWlmIChzc2hkci0+cmVzcG9uc2VfY29kZSA+PSAweDcyKSB7CisJCS8qCisJCSAqIGRlc2NyaXB0b3IgZm9ybWF0CisJCSAqLworCQlpZiAoc2JfbGVuID4gMSkKKwkJCXNzaGRyLT5zZW5zZV9rZXkgPSAoc2Vuc2VfYnVmZmVyWzFdICYgMHhmKTsKKwkJaWYgKHNiX2xlbiA+IDIpCisJCQlzc2hkci0+YXNjID0gc2Vuc2VfYnVmZmVyWzJdOworCQlpZiAoc2JfbGVuID4gMykKKwkJCXNzaGRyLT5hc2NxID0gc2Vuc2VfYnVmZmVyWzNdOworCQlpZiAoc2JfbGVuID4gNykKKwkJCXNzaGRyLT5hZGRpdGlvbmFsX2xlbmd0aCA9IHNlbnNlX2J1ZmZlcls3XTsKKwl9IGVsc2UgeworCQkvKiAKKwkJICogZml4ZWQgZm9ybWF0CisJCSAqLworCQlpZiAoc2JfbGVuID4gMikKKwkJCXNzaGRyLT5zZW5zZV9rZXkgPSAoc2Vuc2VfYnVmZmVyWzJdICYgMHhmKTsKKwkJaWYgKHNiX2xlbiA+IDcpIHsKKwkJCXNiX2xlbiA9IChzYl9sZW4gPCAoc2Vuc2VfYnVmZmVyWzddICsgOCkpID8KKwkJCQkJIHNiX2xlbiA6IChzZW5zZV9idWZmZXJbN10gKyA4KTsKKwkJCWlmIChzYl9sZW4gPiAxMikKKwkJCQlzc2hkci0+YXNjID0gc2Vuc2VfYnVmZmVyWzEyXTsKKwkJCWlmIChzYl9sZW4gPiAxMykKKwkJCQlzc2hkci0+YXNjcSA9IHNlbnNlX2J1ZmZlclsxM107CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9ub3JtYWxpemVfc2Vuc2UpOworCitpbnQgc2NzaV9yZXF1ZXN0X25vcm1hbGl6ZV9zZW5zZShzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxLAorCQkJCSBzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgKnNzaGRyKQoreworCXJldHVybiBzY3NpX25vcm1hbGl6ZV9zZW5zZShzcmVxLT5zcl9zZW5zZV9idWZmZXIsCisJCQlzaXplb2Yoc3JlcS0+c3Jfc2Vuc2VfYnVmZmVyKSwgc3NoZHIpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3JlcXVlc3Rfbm9ybWFsaXplX3NlbnNlKTsKKworaW50IHNjc2lfY29tbWFuZF9ub3JtYWxpemVfc2Vuc2Uoc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJCSBzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgKnNzaGRyKQoreworCXJldHVybiBzY3NpX25vcm1hbGl6ZV9zZW5zZShjbWQtPnNlbnNlX2J1ZmZlciwKKwkJCXNpemVvZihjbWQtPnNlbnNlX2J1ZmZlciksIHNzaGRyKTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9jb21tYW5kX25vcm1hbGl6ZV9zZW5zZSk7CisKKy8qKgorICogc2NzaV9zZW5zZV9kZXNjX2ZpbmQgLSBzZWFyY2ggZm9yIGEgZ2l2ZW4gZGVzY3JpcHRvciB0eXBlIGluCisgKgkJCWRlc2NyaXB0b3Igc2Vuc2UgZGF0YSBmb3JtYXQuCisgKgorICogQHNlbnNlX2J1ZmZlcjoJYnl0ZSBhcnJheSBvZiBkZXNjcmlwdG9yIGZvcm1hdCBzZW5zZSBkYXRhCisgKiBAc2JfbGVuOgkJbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGluIHNlbnNlX2J1ZmZlcgorICogQGRlc2NfdHlwZToJCXZhbHVlIG9mIGRlc2NyaXB0b3IgdHlwZSB0byBmaW5kCisgKgkJCShlLmcuIDAgLT4gaW5mb3JtYXRpb24pCisgKgorICogTm90ZXM6CisgKglvbmx5IHZhbGlkIHdoZW4gc2Vuc2UgZGF0YSBpcyBpbiBkZXNjcmlwdG9yIGZvcm1hdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCXBvaW50ZXIgdG8gc3RhcnQgb2YgKGZpcnN0KSBkZXNjcmlwdG9yIGlmIGZvdW5kIGVsc2UgTlVMTAorICoqLworY29uc3QgdTggKiBzY3NpX3NlbnNlX2Rlc2NfZmluZChjb25zdCB1OCAqIHNlbnNlX2J1ZmZlciwgaW50IHNiX2xlbiwKKwkJCQlpbnQgZGVzY190eXBlKQoreworCWludCBhZGRfc2VuX2xlbiwgYWRkX2xlbiwgZGVzY19sZW4sIGs7CisJY29uc3QgdTggKiBkZXNjcDsKKworCWlmICgoc2JfbGVuIDwgOCkgfHwgKDAgPT0gKGFkZF9zZW5fbGVuID0gc2Vuc2VfYnVmZmVyWzddKSkpCisJCXJldHVybiBOVUxMOworCWlmICgoc2Vuc2VfYnVmZmVyWzBdIDwgMHg3MikgfHwgKHNlbnNlX2J1ZmZlclswXSA+IDB4NzMpKQorCQlyZXR1cm4gTlVMTDsKKwlhZGRfc2VuX2xlbiA9IChhZGRfc2VuX2xlbiA8IChzYl9sZW4gLSA4KSkgPworCQkJYWRkX3Nlbl9sZW4gOiAoc2JfbGVuIC0gOCk7CisJZGVzY3AgPSAmc2Vuc2VfYnVmZmVyWzhdOworCWZvciAoZGVzY19sZW4gPSAwLCBrID0gMDsgayA8IGFkZF9zZW5fbGVuOyBrICs9IGRlc2NfbGVuKSB7CisJCWRlc2NwICs9IGRlc2NfbGVuOworCQlhZGRfbGVuID0gKGsgPCAoYWRkX3Nlbl9sZW4gLSAxKSkgPyBkZXNjcFsxXTogLTE7CisJCWRlc2NfbGVuID0gYWRkX2xlbiArIDI7CisJCWlmIChkZXNjcFswXSA9PSBkZXNjX3R5cGUpCisJCQlyZXR1cm4gZGVzY3A7CisJCWlmIChhZGRfbGVuIDwgMCkgLy8gc2hvcnQgZGVzY3JpcHRvciA/PworCQkJYnJlYWs7CisJfQorCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3NlbnNlX2Rlc2NfZmluZCk7CisKKy8qKgorICogc2NzaV9nZXRfc2Vuc2VfaW5mb19mbGQgLSBhdHRlbXB0cyB0byBnZXQgaW5mb3JtYXRpb24gZmllbGQgZnJvbQorICoJCQlzZW5zZSBkYXRhIChlaXRoZXIgZml4ZWQgb3IgZGVzY3JpcHRvciBmb3JtYXQpCisgKgorICogQHNlbnNlX2J1ZmZlcjoJYnl0ZSBhcnJheSBvZiBzZW5zZSBkYXRhCisgKiBAc2JfbGVuOgkJbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGluIHNlbnNlX2J1ZmZlcgorICogQGluZm9fb3V0OgkJcG9pbnRlciB0byA2NCBpbnRlZ2VyIHdoZXJlIDggb3IgNCBieXRlIGluZm9ybWF0aW9uCisgKgkJCWZpZWxkIHdpbGwgYmUgcGxhY2VkIGlmIGZvdW5kLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCTEgaWYgaW5mb3JtYXRpb24gZmllbGQgZm91bmQsIDAgaWYgbm90IGZvdW5kLgorICoqLworaW50IHNjc2lfZ2V0X3NlbnNlX2luZm9fZmxkKGNvbnN0IHU4ICogc2Vuc2VfYnVmZmVyLCBpbnQgc2JfbGVuLAorCQkJICAgIHU2NCAqIGluZm9fb3V0KQoreworCWludCBqOworCWNvbnN0IHU4ICogdWNwOworCXU2NCB1bGw7CisKKwlpZiAoc2JfbGVuIDwgNykKKwkJcmV0dXJuIDA7CisJc3dpdGNoIChzZW5zZV9idWZmZXJbMF0gJiAweDdmKSB7CisJY2FzZSAweDcwOgorCWNhc2UgMHg3MToKKwkJaWYgKHNlbnNlX2J1ZmZlclswXSAmIDB4ODApIHsKKwkJCSppbmZvX291dCA9IChzZW5zZV9idWZmZXJbM10gPDwgMjQpICsKKwkJCQkgICAgKHNlbnNlX2J1ZmZlcls0XSA8PCAxNikgKworCQkJCSAgICAoc2Vuc2VfYnVmZmVyWzVdIDw8IDgpICsgc2Vuc2VfYnVmZmVyWzZdOworCQkJcmV0dXJuIDE7CisJCX0gZWxzZQorCQkJcmV0dXJuIDA7CisJY2FzZSAweDcyOgorCWNhc2UgMHg3MzoKKwkJdWNwID0gc2NzaV9zZW5zZV9kZXNjX2ZpbmQoc2Vuc2VfYnVmZmVyLCBzYl9sZW4sCisJCQkJCSAgIDAgLyogaW5mbyBkZXNjICovKTsKKwkJaWYgKHVjcCAmJiAoMHhhID09IHVjcFsxXSkpIHsKKwkJCXVsbCA9IDA7CisJCQlmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisJCQkJaWYgKGogPiAwKQorCQkJCQl1bGwgPDw9IDg7CisJCQkJdWxsIHw9IHVjcFs0ICsgal07CisJCQl9CisJCQkqaW5mb19vdXQgPSB1bGw7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfZ2V0X3NlbnNlX2luZm9fZmxkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2lvY3RsLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4Yzk3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9pb2N0bC5jCkBAIC0wLDAgKzEsNTE2IEBACisvKgorICogQ2hhbmdlczoKKyAqIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiAwOC8yMy8yMDAwCisgKiAtIGdldCByaWQgb2Ygc29tZSB2ZXJpZnlfYXJlYXMgYW5kIHVzZSBfX2NvcHkqdXNlciBhbmQgX19nZXQvcHV0X3VzZXIKKyAqICAgZm9yIHRoZSBvbmVzIHRoYXQgcmVtYWluCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3JlcXVlc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3NnLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RiZy5oPgorCisjaW5jbHVkZSAic2NzaV9sb2dnaW5nLmgiCisKKyNkZWZpbmUgTk9STUFMX1JFVFJJRVMJCQk1CisjZGVmaW5lIElPQ1RMX05PUk1BTF9USU1FT1VUCQkJKDEwICogSFopCisjZGVmaW5lIEZPUk1BVF9VTklUX1RJTUVPVVQJCSgyICogNjAgKiA2MCAqIEhaKQorI2RlZmluZSBTVEFSVF9TVE9QX1RJTUVPVVQJCSg2MCAqIEhaKQorI2RlZmluZSBNT1ZFX01FRElVTV9USU1FT1VUCQkoNSAqIDYwICogSFopCisjZGVmaW5lIFJFQURfRUxFTUVOVF9TVEFUVVNfVElNRU9VVAkoNSAqIDYwICogSFopCisjZGVmaW5lIFJFQURfREVGRUNUX0RBVEFfVElNRU9VVAkoNjAgKiBIWiApICAvKiBaSVAtMjUwIG9uIHBhcmFsbGVsIHBvcnQgdGFrZXMgYXMgbG9uZyEgKi8KKworI2RlZmluZSBNQVhfQlVGIFBBR0VfU0laRQorCisvKgorICogSWYgd2UgYXJlIHRvbGQgdG8gcHJvYmUgYSBob3N0LCB3ZSB3aWxsIHJldHVybiAwIGlmICB0aGUgaG9zdCBpcyBub3QKKyAqIHByZXNlbnQsIDEgaWYgdGhlIGhvc3QgaXMgcHJlc2VudCwgYW5kIHdpbGwgcmV0dXJuIGFuIGlkZW50aWZ5aW5nCisgKiBzdHJpbmcgYXQgKmFyZywgaWYgYXJnIGlzIG5vbiBudWxsLCBmaWxsaW5nIHRvIHRoZSBsZW5ndGggc3RvcmVkIGF0CisgKiAoaW50ICopIGFyZworICovCisKK3N0YXRpYyBpbnQgaW9jdGxfcHJvYmUoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgdm9pZCBfX3VzZXIgKmJ1ZmZlcikKK3sKKwl1bnNpZ25lZCBpbnQgbGVuLCBzbGVuOworCWNvbnN0IGNoYXIgKnN0cmluZzsKKwlpbnQgdGVtcCA9IGhvc3QtPmhvc3R0LT5wcmVzZW50OworCisJaWYgKHRlbXAgJiYgYnVmZmVyKSB7CisJCWlmIChnZXRfdXNlcihsZW4sICh1bnNpZ25lZCBpbnQgX191c2VyICopIGJ1ZmZlcikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoaG9zdC0+aG9zdHQtPmluZm8pCisJCQlzdHJpbmcgPSBob3N0LT5ob3N0dC0+aW5mbyhob3N0KTsKKwkJZWxzZQorCQkJc3RyaW5nID0gaG9zdC0+aG9zdHQtPm5hbWU7CisJCWlmIChzdHJpbmcpIHsKKwkJCXNsZW4gPSBzdHJsZW4oc3RyaW5nKTsKKwkJCWlmIChsZW4gPiBzbGVuKQorCQkJCWxlbiA9IHNsZW4gKyAxOworCQkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIHN0cmluZywgbGVuKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKwlyZXR1cm4gdGVtcDsKK30KKworLyoKKworICogVGhlIFNDU0lfSU9DVExfU0VORF9DT01NQU5EIGlvY3RsIHNlbmRzIGEgY29tbWFuZCBvdXQgdG8gdGhlIFNDU0kgaG9zdC4KKyAqIFRoZSBJT0NUTF9OT1JNQUxfVElNRU9VVCBhbmQgTk9STUFMX1JFVFJJRVMgIHZhcmlhYmxlcyBhcmUgdXNlZC4gIAorICogCisgKiBkZXYgaXMgdGhlIFNDU0kgZGV2aWNlIHN0cnVjdCBwdHIsICooaW50ICopIGFyZyBpcyB0aGUgbGVuZ3RoIG9mIHRoZQorICogaW5wdXQgZGF0YSwgaWYgYW55LCBub3QgaW5jbHVkaW5nIHRoZSBjb21tYW5kIHN0cmluZyAmIGNvdW50cywgCisgKiAqKChpbnQgKilhcmcgKyAxKSBpcyB0aGUgb3V0cHV0IGJ1ZmZlciBzaXplIGluIGJ5dGVzLgorICogCisgKiAqKGNoYXIgKikgKChpbnQgKikgYXJnKVsyXSB0aGUgYWN0dWFsIGNvbW1hbmQgYnl0ZS4gICAKKyAqIAorICogTm90ZSB0aGF0IGlmIG1vcmUgdGhhbiBNQVhfQlVGIGJ5dGVzIGFyZSByZXF1ZXN0ZWQgdG8gYmUgdHJhbnNmZXJyZWQsCisgKiB0aGUgaW9jdGwgd2lsbCBmYWlsIHdpdGggZXJyb3IgRUlOVkFMLgorICogCisgKiBUaGlzIHNpemUgKmRvZXMgbm90KiBpbmNsdWRlIHRoZSBpbml0aWFsIGxlbmd0aHMgdGhhdCB3ZXJlIHBhc3NlZC4KKyAqIAorICogVGhlIFNDU0kgY29tbWFuZCBpcyByZWFkIGZyb20gdGhlIG1lbW9yeSBsb2NhdGlvbiBpbW1lZGlhdGVseSBhZnRlciB0aGUKKyAqIGxlbmd0aCB3b3JkcywgYW5kIHRoZSBpbnB1dCBkYXRhIGlzIHJpZ2h0IGFmdGVyIHRoZSBjb21tYW5kLiAgVGhlIFNDU0kKKyAqIHJvdXRpbmVzIGtub3cgdGhlIGNvbW1hbmQgc2l6ZSBiYXNlZCBvbiB0aGUgb3Bjb2RlIGRlY29kZS4gIAorICogCisgKiBUaGUgb3V0cHV0IGFyZWEgaXMgdGhlbiBmaWxsZWQgaW4gc3RhcnRpbmcgZnJvbSB0aGUgY29tbWFuZCBieXRlLiAKKyAqLworCitzdGF0aWMgaW50IGlvY3RsX2ludGVybmFsX2NvbW1hbmQoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBjaGFyICpjbWQsCisJCQkJICBpbnQgdGltZW91dCwgaW50IHJldHJpZXMpCit7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcTsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKKworCVNDU0lfTE9HX0lPQ1RMKDEsIHByaW50aygiVHJ5aW5nIGlvY3RsIHdpdGggc2NzaSBjb21tYW5kICVkXG4iLCAqY21kKSk7CisKKwlzcmVxID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KHNkZXYsIEdGUF9LRVJORUwpOworCWlmICghc3JlcSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJTQ1NJIGludGVybmFsIGlvY3RsIGZhaWxlZCwgbm8gbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKKyAgICAgICAgc2NzaV93YWl0X3JlcShzcmVxLCBjbWQsIE5VTEwsIDAsIHRpbWVvdXQsIHJldHJpZXMpOworCisJU0NTSV9MT0dfSU9DVEwoMiwgcHJpbnRrKCJJb2N0bCByZXR1cm5lZCAgMHgleFxuIiwgc3JlcS0+c3JfcmVzdWx0KSk7CisKKwlpZiAoKGRyaXZlcl9ieXRlKHNyZXEtPnNyX3Jlc3VsdCkgJiBEUklWRVJfU0VOU0UpICYmCisJICAgIChzY3NpX3JlcXVlc3Rfbm9ybWFsaXplX3NlbnNlKHNyZXEsICZzc2hkcikpKSB7CisJCXN3aXRjaCAoc3NoZHIuc2Vuc2Vfa2V5KSB7CisJCWNhc2UgSUxMRUdBTF9SRVFVRVNUOgorCQkJaWYgKGNtZFswXSA9PSBBTExPV19NRURJVU1fUkVNT1ZBTCkKKwkJCQlzZGV2LT5sb2NrYWJsZSA9IDA7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiaW9jdGxfaW50ZXJuYWxfY29tbWFuZDogIgorCQkJCSAgICAgICAiSUxMRUdBTCBSRVFVRVNUIGFzYz0weCV4IGFzY3E9MHgleFxuIiwKKwkJCQkgICAgICAgc3NoZHIuYXNjLCBzc2hkci5hc2NxKTsKKwkJCWJyZWFrOworCQljYXNlIE5PVF9SRUFEWToJLyogVGhpcyBoYXBwZW5zIGlmIHRoZXJlIGlzIG5vIGRpc2MgaW4gZHJpdmUgKi8KKwkJCWlmIChzZGV2LT5yZW1vdmFibGUgJiYgKGNtZFswXSAhPSBURVNUX1VOSVRfUkVBRFkpKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiRGV2aWNlIG5vdCByZWFkeS4gTWFrZSBzdXJlIgorCQkJCSAgICAgICAiIHRoZXJlIGlzIGEgZGlzYyBpbiB0aGUgZHJpdmUuXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBVTklUX0FUVEVOVElPTjoKKwkJCWlmIChzZGV2LT5yZW1vdmFibGUpIHsKKwkJCQlzZGV2LT5jaGFuZ2VkID0gMTsKKwkJCQlzcmVxLT5zcl9yZXN1bHQgPSAwOwkvKiBUaGlzIGlzIG5vIGxvbmdlciBjb25zaWRlcmVkIGFuIGVycm9yICovCisJCQkJYnJlYWs7CisJCQl9CisJCWRlZmF1bHQ6CS8qIEZhbGwgdGhyb3VnaCBmb3Igbm9uLXJlbW92YWJsZSBtZWRpYSAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiaW9jdGxfaW50ZXJuYWxfY29tbWFuZDogPCVkICVkICVkICIKKwkJCSAgICAgICAiJWQ+IHJldHVybiBjb2RlID0gJXhcbiIsCisJCQkgICAgICAgc2Rldi0+aG9zdC0+aG9zdF9ubywKKwkJCSAgICAgICBzZGV2LT5jaGFubmVsLAorCQkJICAgICAgIHNkZXYtPmlkLAorCQkJICAgICAgIHNkZXYtPmx1biwKKwkJCSAgICAgICBzcmVxLT5zcl9yZXN1bHQpOworCQkJc2NzaV9wcmludF9yZXFfc2Vuc2UoIiAgICIsIHNyZXEpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXN1bHQgPSBzcmVxLT5zcl9yZXN1bHQ7CisJU0NTSV9MT0dfSU9DVEwoMiwgcHJpbnRrKCJJT0NUTCBSZWxlYXNpbmcgY29tbWFuZFxuIikpOworCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBzY3NpX3NldF9tZWRpdW1fcmVtb3ZhbChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGNoYXIgc3RhdGUpCit7CisJY2hhciBzY3NpX2NtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlpbnQgcmV0OworCisJaWYgKCFzZGV2LT5yZW1vdmFibGUgfHwgIXNkZXYtPmxvY2thYmxlKQorCSAgICAgICByZXR1cm4gMDsKKworCXNjc2lfY21kWzBdID0gQUxMT1dfTUVESVVNX1JFTU9WQUw7CisJc2NzaV9jbWRbMV0gPSAwOworCXNjc2lfY21kWzJdID0gMDsKKwlzY3NpX2NtZFszXSA9IDA7CisJc2NzaV9jbWRbNF0gPSBzdGF0ZTsKKwlzY3NpX2NtZFs1XSA9IDA7CisKKwlyZXQgPSBpb2N0bF9pbnRlcm5hbF9jb21tYW5kKHNkZXYsIHNjc2lfY21kLAorCQkJSU9DVExfTk9STUFMX1RJTUVPVVQsIE5PUk1BTF9SRVRSSUVTKTsKKwlpZiAocmV0ID09IDApCisJCXNkZXYtPmxvY2tlZCA9IChzdGF0ZSA9PSBTQ1NJX1JFTU9WQUxfUFJFVkVOVCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9zZXRfbWVkaXVtX3JlbW92YWwpOworCisvKgorICogVGhpcyBpbnRlcmZhY2UgaXMgZGVwcmVjYXRlZCAtIHVzZXJzIHNob3VsZCB1c2UgdGhlIHNjc2kgZ2VuZXJpYyAoc2cpCisgKiBpbnRlcmZhY2UgaW5zdGVhZCwgYXMgdGhpcyBpcyBhIG1vcmUgZmxleGlibGUgYXBwcm9hY2ggdG8gcGVyZm9ybWluZworICogZ2VuZXJpYyBTQ1NJIGNvbW1hbmRzIG9uIGEgZGV2aWNlLgorICoKKyAqIFRoZSBzdHJ1Y3R1cmUgdGhhdCB3ZSBhcmUgcGFzc2VkIHNob3VsZCBsb29rIGxpa2U6CisgKgorICogc3RydWN0IHNkYXRhIHsKKyAqICB1bnNpZ25lZCBpbnQgaW5sZW47ICAgICAgW2ldIExlbmd0aCBvZiBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gZGV2aWNlIAorICogIHVuc2lnbmVkIGludCBvdXRsZW47ICAgICBbaV0gTGVuZ3RoIG9mIGRhdGEgdG8gYmUgcmVhZCBmcm9tIGRldmljZSAKKyAqICB1bnNpZ25lZCBjaGFyIGNtZFt4XTsgICAgW2ldIFNDU0kgY29tbWFuZCAoNiA8PSB4IDw9IDEyKS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgW29dIERhdGEgcmVhZCBmcm9tIGRldmljZSBzdGFydHMgaGVyZS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgW29dIE9uIGVycm9yLCBzZW5zZSBidWZmZXIgc3RhcnRzIGhlcmUuCisgKiAgdW5zaWduZWQgY2hhciB3ZGF0YVt5XTsgIFtpXSBEYXRhIHdyaXR0ZW4gdG8gZGV2aWNlIHN0YXJ0cyBoZXJlLgorICogfTsKKyAqIE5vdGVzOgorICogICAtICBUaGUgU0NTSSBjb21tYW5kIGxlbmd0aCBpcyBkZXRlcm1pbmVkIGJ5IGV4YW1pbmluZyB0aGUgMXN0IGJ5dGUKKyAqICAgICAgb2YgdGhlIGdpdmVuIGNvbW1hbmQuIFRoZXJlIGlzIG5vIHdheSB0byBvdmVycmlkZSB0aGlzLgorICogICAtICBEYXRhIHRyYW5zZmVycyBhcmUgbGltaXRlZCB0byBQQUdFX1NJWkUgKDRLIG9uIGkzODYsIDhLIG9uIGFscGhhKS4KKyAqICAgLSAgVGhlIGxlbmd0aCAoeCArIHkpIG11c3QgYmUgYXQgbGVhc3QgT01BWF9TQl9MRU4gYnl0ZXMgbG9uZyB0bworICogICAgICBhY2NvbW1vZGF0ZSB0aGUgc2Vuc2UgYnVmZmVyIHdoZW4gYW4gZXJyb3Igb2NjdXJzLgorICogICAgICBUaGUgc2Vuc2UgYnVmZmVyIGlzIHRydW5jYXRlZCB0byBPTUFYX1NCX0xFTiAoMTYpIGJ5dGVzIHNvIHRoYXQKKyAqICAgICAgb2xkIGNvZGUgd2lsbCBub3QgYmUgc3VycHJpc2VkLgorICogICAtICBJZiBhIFVuaXggZXJyb3Igb2NjdXJzIChlLmcuIEVOT01FTSkgdGhlbiB0aGUgdXNlciB3aWxsIHJlY2VpdmUKKyAqICAgICAgYSBuZWdhdGl2ZSByZXR1cm4gYW5kIHRoZSBVbml4IGVycm9yIGNvZGUgaW4gJ2Vycm5vJy4gCisgKiAgICAgIElmIHRoZSBTQ1NJIGNvbW1hbmQgc3VjY2VlZHMgdGhlbiAwIGlzIHJldHVybmVkLgorICogICAgICBQb3NpdGl2ZSBudW1iZXJzIHJldHVybmVkIGFyZSB0aGUgY29tcGFjdGVkIFNDU0kgZXJyb3IgY29kZXMgKDQgCisgKiAgICAgIGJ5dGVzIGluIG9uZSBpbnQpIHdoZXJlIHRoZSBsb3dlc3QgYnl0ZSBpcyB0aGUgU0NTSSBzdGF0dXMuCisgKiAgICAgIFNlZSB0aGUgZHJpdmVycy9zY3NpL3Njc2kuaCBmaWxlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMuCisgKgorICovCisjZGVmaW5lIE9NQVhfU0JfTEVOIDE2CQkvKiBPbGQgc2Vuc2UgYnVmZmVyIGxlbmd0aCAqLworCitpbnQgc2NzaV9pb2N0bF9zZW5kX2NvbW1hbmQoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQkJICAgIHN0cnVjdCBzY3NpX2lvY3RsX2NvbW1hbmQgX191c2VyICpzaWMpCit7CisJY2hhciAqYnVmOworCXVuc2lnbmVkIGNoYXIgY21kW01BWF9DT01NQU5EX1NJWkVdOworCWNoYXIgX191c2VyICpjbWRfaW47CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcTsKKwl1bnNpZ25lZCBjaGFyIG9wY29kZTsKKwl1bnNpZ25lZCBpbnQgaW5sZW4sIG91dGxlbiwgY21kbGVuOworCXVuc2lnbmVkIGludCBuZWVkZWQsIGJ1Zl9uZWVkZWQ7CisJaW50IHRpbWVvdXQsIHJldHJpZXMsIHJlc3VsdDsKKwlpbnQgZGF0YV9kaXJlY3Rpb24sIGdmcF9tYXNrID0gR0ZQX0tFUk5FTDsKKworCWlmICghc2ljKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzZGV2LT5ob3N0LT51bmNoZWNrZWRfaXNhX2RtYSkKKwkJZ2ZwX21hc2sgfD0gR0ZQX0RNQTsKKworCS8qCisJICogVmVyaWZ5IHRoYXQgd2UgY2FuIHJlYWQgYXQgbGVhc3QgdGhpcyBtdWNoLgorCSAqLworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBzaWMsIHNpemVvZihTY3NpX0lvY3RsX0NvbW1hbmQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZihfX2dldF91c2VyKGlubGVuLCAmc2ljLT5pbmxlbikpCisJCXJldHVybiAtRUZBVUxUOworCQkKKwlpZihfX2dldF91c2VyKG91dGxlbiwgJnNpYy0+b3V0bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKgorCSAqIFdlIGRvIG5vdCB0cmFuc2ZlciBtb3JlIHRoYW4gTUFYX0JVRiB3aXRoIHRoaXMgaW50ZXJmYWNlLgorCSAqIElmIHRoZSB1c2VyIG5lZWRzIHRvIHRyYW5zZmVyIG1vcmUgZGF0YSB0aGFuIHRoaXMsIHRoZXkKKwkgKiBzaG91bGQgdXNlIHNjc2lfZ2VuZXJpY3MgKHNnKSBpbnN0ZWFkLgorCSAqLworCWlmIChpbmxlbiA+IE1BWF9CVUYpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChvdXRsZW4gPiBNQVhfQlVGKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNtZF9pbiA9IHNpYy0+ZGF0YTsKKwlpZihnZXRfdXNlcihvcGNvZGUsIGNtZF9pbikpCisJCXJldHVybiAtRUZBVUxUOworCisJbmVlZGVkID0gYnVmX25lZWRlZCA9IChpbmxlbiA+IG91dGxlbiA/IGlubGVuIDogb3V0bGVuKTsKKwlpZiAoYnVmX25lZWRlZCkgeworCQlidWZfbmVlZGVkID0gKGJ1Zl9uZWVkZWQgKyA1MTEpICYgfjUxMTsKKwkJaWYgKGJ1Zl9uZWVkZWQgPiBNQVhfQlVGKQorCQkJYnVmX25lZWRlZCA9IE1BWF9CVUY7CisJCWJ1ZiA9IGttYWxsb2MoYnVmX25lZWRlZCwgZ2ZwX21hc2spOworCQlpZiAoIWJ1ZikKKwkJCXJldHVybiAtRU5PTUVNOworCQltZW1zZXQoYnVmLCAwLCBidWZfbmVlZGVkKTsKKwkJaWYgKGlubGVuID09IDApIHsKKwkJCWRhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCQl9IGVsc2UgaWYgKG91dGxlbiA9PSAwICkgeworCQkJZGF0YV9kaXJlY3Rpb24gPSBETUFfVE9fREVWSUNFOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIENhbiB0aGlzIGV2ZXIgaGFwcGVuPworCQkJICovCisJCQlkYXRhX2RpcmVjdGlvbiA9IERNQV9CSURJUkVDVElPTkFMOworCQl9CisKKwl9IGVsc2UgeworCQlidWYgPSBOVUxMOworCQlkYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOworCX0KKworCS8qCisJICogT2J0YWluIHRoZSBjb21tYW5kIGZyb20gdGhlIHVzZXIncyBhZGRyZXNzIHNwYWNlLgorCSAqLworCWNtZGxlbiA9IENPTU1BTkRfU0laRShvcGNvZGUpOworCQorCXJlc3VsdCA9IC1FRkFVTFQ7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgY21kX2luLCBjbWRsZW4gKyBpbmxlbikpCisJCWdvdG8gZXJyb3I7CisKKwlpZihfX2NvcHlfZnJvbV91c2VyKGNtZCwgY21kX2luLCBjbWRsZW4pKQorCQlnb3RvIGVycm9yOworCisJLyoKKwkgKiBPYnRhaW4gdGhlIGRhdGEgdG8gYmUgc2VudCB0byB0aGUgZGV2aWNlIChpZiBhbnkpLgorCSAqLworCisJaWYoY29weV9mcm9tX3VzZXIoYnVmLCBjbWRfaW4gKyBjbWRsZW4sIGlubGVuKSkKKwkJZ290byBlcnJvcjsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBTRU5EX0RJQUdOT1NUSUM6CisJY2FzZSBGT1JNQVRfVU5JVDoKKwkJdGltZW91dCA9IEZPUk1BVF9VTklUX1RJTUVPVVQ7CisJCXJldHJpZXMgPSAxOworCQlicmVhazsKKwljYXNlIFNUQVJUX1NUT1A6CisJCXRpbWVvdXQgPSBTVEFSVF9TVE9QX1RJTUVPVVQ7CisJCXJldHJpZXMgPSBOT1JNQUxfUkVUUklFUzsKKwkJYnJlYWs7CisJY2FzZSBNT1ZFX01FRElVTToKKwkJdGltZW91dCA9IE1PVkVfTUVESVVNX1RJTUVPVVQ7CisJCXJldHJpZXMgPSBOT1JNQUxfUkVUUklFUzsKKwkJYnJlYWs7CisJY2FzZSBSRUFEX0VMRU1FTlRfU1RBVFVTOgorCQl0aW1lb3V0ID0gUkVBRF9FTEVNRU5UX1NUQVRVU19USU1FT1VUOworCQlyZXRyaWVzID0gTk9STUFMX1JFVFJJRVM7CisJCWJyZWFrOworCWNhc2UgUkVBRF9ERUZFQ1RfREFUQToKKwkJdGltZW91dCA9IFJFQURfREVGRUNUX0RBVEFfVElNRU9VVDsKKwkJcmV0cmllcyA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXRpbWVvdXQgPSBJT0NUTF9OT1JNQUxfVElNRU9VVDsKKwkJcmV0cmllcyA9IE5PUk1BTF9SRVRSSUVTOworCQlicmVhazsKKwl9CisKKwlzcmVxID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KHNkZXYsIEdGUF9LRVJORUwpOworICAgICAgICBpZiAoIXNyZXEpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAtRUlOVFI7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisJc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBkYXRhX2RpcmVjdGlvbjsKKyAgICAgICAgc2NzaV93YWl0X3JlcShzcmVxLCBjbWQsIGJ1ZiwgbmVlZGVkLCB0aW1lb3V0LCByZXRyaWVzKTsKKworCS8qIAorCSAqIElmIHRoZXJlIHdhcyBhbiBlcnJvciBjb25kaXRpb24sIHBhc3MgdGhlIGluZm8gYmFjayB0byB0aGUgdXNlci4gCisJICovCisJcmVzdWx0ID0gc3JlcS0+c3JfcmVzdWx0OworCWlmIChyZXN1bHQpIHsKKwkJaW50IHNiX2xlbiA9IHNpemVvZihzcmVxLT5zcl9zZW5zZV9idWZmZXIpOworCisJCXNiX2xlbiA9IChzYl9sZW4gPiBPTUFYX1NCX0xFTikgPyBPTUFYX1NCX0xFTiA6IHNiX2xlbjsKKwkJaWYgKGNvcHlfdG9fdXNlcihjbWRfaW4sIHNyZXEtPnNyX3NlbnNlX2J1ZmZlciwgc2JfbGVuKSkKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJfSBlbHNlIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihjbWRfaW4sIGJ1Ziwgb3V0bGVuKSkKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJfQkKKworCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOworZXJyb3I6CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTChzY3NpX2lvY3RsX3NlbmRfY29tbWFuZCk7CisKKy8qCisgKiBUaGUgc2NzaV9pb2N0bF9nZXRfcGNpKCkgZnVuY3Rpb24gcGxhY2VzIGludG8gYXJnIHRoZSB2YWx1ZQorICogcGNpX2Rldjo6c2xvdF9uYW1lICg4IGNoYXJhY3RlcnMpIGZvciB0aGUgUENJIGRldmljZSAoaWYgYW55KS4KKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcworICogICAgICAgICAgLUVOWElPIGlmIHRoZXJlIGlzbid0IGEgUENJIGRldmljZSBwb2ludGVyCisgKiAgICAgICAgICAgICAgICAgKGNvdWxkIGJlIGJlY2F1c2UgdGhlIFNDU0kgZHJpdmVyIGhhc24ndCBiZWVuCisgKiAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgeWV0LCBvciBiZWNhdXNlIGl0IGlzbid0IGEgU0NTSQorICogICAgICAgICAgICAgICAgICBkZXZpY2UpCisgKiAgICAgICAgICBhbnkgY29weV90b191c2VyKCkgZXJyb3Igb24gZmFpbHVyZSB0aGVyZQorICovCitzdGF0aWMgaW50IHNjc2lfaW9jdGxfZ2V0X3BjaShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gc2NzaV9nZXRfZGV2aWNlKHNkZXYtPmhvc3QpOworCisgICAgICAgIGlmICghZGV2KQorCQlyZXR1cm4gLUVOWElPOworICAgICAgICByZXR1cm4gY29weV90b191c2VyKGFyZywgZGV2LT5idXNfaWQsIHNpemVvZihkZXYtPmJ1c19pZCkpPyAtRUZBVUxUOiAwOworfQorCisKKy8qCisgKiB0aGUgc2NzaV9pb2N0bCgpIGZ1bmN0aW9uIGRpZmZlcnMgZnJvbSBtb3N0IGlvY3RscyBpbiB0aGF0IGl0IGRvZXMKKyAqIG5vdCB0YWtlIGEgbWFqb3IvbWlub3IgbnVtYmVyIGFzIHRoZSBkZXYgZmllbGQuICBSYXRoZXIsIGl0IHRha2VzCisgKiBhIHBvaW50ZXIgdG8gYSBzY3NpX2RldmljZXNbXSBlbGVtZW50LCBhIHN0cnVjdHVyZS4gCisgKi8KK2ludCBzY3NpX2lvY3RsKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwljaGFyIHNjc2lfY21kW01BWF9DT01NQU5EX1NJWkVdOworCisJLyogTm8gaWRlYSBob3cgdGhpcyBoYXBwZW5zLi4uLiAqLworCWlmICghc2RldikKKwkJcmV0dXJuIC1FTlhJTzsKKworCS8qCisJICogSWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgZXJyb3IgcmVjb3ZlcnksIGRvbid0IGxldCBhbnlvbmUKKwkgKiBlbHNlIHRyeSBhbmQgdXNlIHRoaXMgZGV2aWNlLiAgQWxzbywgaWYgZXJyb3IgcmVjb3ZlcnkgZmFpbHMsIGl0CisJICogbWF5IHRyeSBhbmQgdGFrZSB0aGUgZGV2aWNlIG9mZmxpbmUsIGluIHdoaWNoIGNhc2UgYWxsIGZ1cnRoZXIKKwkgKiBhY2Nlc3MgdG8gdGhlIGRldmljZSBpcyBwcm9oaWJpdGVkLgorCSAqLworCWlmICghc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKHNkZXYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIENoZWNrIGZvciBkZXByZWNhdGVkIGlvY3RscyAuLi4gYWxsIHRoZSBpb2N0bHMgd2hpY2ggZG9uJ3QKKwkgKiBmb2xsb3cgdGhlIG5ldyB1bmlxdWUgbnVtYmVyaW5nIHNjaGVtZSBhcmUgZGVwcmVjYXRlZCAqLworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTQ1NJX0lPQ1RMX1NFTkRfQ09NTUFORDoKKwljYXNlIFNDU0lfSU9DVExfVEVTVF9VTklUX1JFQURZOgorCWNhc2UgU0NTSV9JT0NUTF9CRU5DSE1BUktfQ09NTUFORDoKKwljYXNlIFNDU0lfSU9DVExfU1lOQzoKKwljYXNlIFNDU0lfSU9DVExfU1RBUlRfVU5JVDoKKwljYXNlIFNDU0lfSU9DVExfU1RPUF9VTklUOgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJwcm9ncmFtICVzIGlzIHVzaW5nIGEgZGVwcmVjYXRlZCBTQ1NJICIKKwkJICAgICAgICJpb2N0bCwgcGxlYXNlIGNvbnZlcnQgaXQgdG8gU0dfSU9cbiIsIGN1cnJlbnQtPmNvbW0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0NTSV9JT0NUTF9HRVRfSURMVU46CisJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYXJnLCBzaXplb2Yoc3RydWN0IHNjc2lfaWRsdW4pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCV9fcHV0X3VzZXIoKHNkZXYtPmlkICYgMHhmZikKKwkJCSArICgoc2Rldi0+bHVuICYgMHhmZikgPDwgOCkKKwkJCSArICgoc2Rldi0+Y2hhbm5lbCAmIDB4ZmYpIDw8IDE2KQorCQkJICsgKChzZGV2LT5ob3N0LT5ob3N0X25vICYgMHhmZikgPDwgMjQpLAorCQkJICYoKHN0cnVjdCBzY3NpX2lkbHVuIF9fdXNlciAqKWFyZyktPmRldl9pZCk7CisJCV9fcHV0X3VzZXIoc2Rldi0+aG9zdC0+dW5pcXVlX2lkLAorCQkJICYoKHN0cnVjdCBzY3NpX2lkbHVuIF9fdXNlciAqKWFyZyktPmhvc3RfdW5pcXVlX2lkKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBTQ1NJX0lPQ1RMX0dFVF9CVVNfTlVNQkVSOgorCQlyZXR1cm4gcHV0X3VzZXIoc2Rldi0+aG9zdC0+aG9zdF9ubywgKGludCBfX3VzZXIgKilhcmcpOworCWNhc2UgU0NTSV9JT0NUTF9QUk9CRV9IT1NUOgorCQlyZXR1cm4gaW9jdGxfcHJvYmUoc2Rldi0+aG9zdCwgYXJnKTsKKwljYXNlIFNDU0lfSU9DVExfU0VORF9DT01NQU5EOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJcmV0dXJuIHNjc2lfaW9jdGxfc2VuZF9jb21tYW5kKHNkZXYsIGFyZyk7CisJY2FzZSBTQ1NJX0lPQ1RMX0RPT1JMT0NLOgorCQlyZXR1cm4gc2NzaV9zZXRfbWVkaXVtX3JlbW92YWwoc2RldiwgU0NTSV9SRU1PVkFMX1BSRVZFTlQpOworCWNhc2UgU0NTSV9JT0NUTF9ET09SVU5MT0NLOgorCQlyZXR1cm4gc2NzaV9zZXRfbWVkaXVtX3JlbW92YWwoc2RldiwgU0NTSV9SRU1PVkFMX0FMTE9XKTsKKwljYXNlIFNDU0lfSU9DVExfVEVTVF9VTklUX1JFQURZOgorCQlyZXR1cm4gc2NzaV90ZXN0X3VuaXRfcmVhZHkoc2RldiwgSU9DVExfTk9STUFMX1RJTUVPVVQsCisJCQkJCSAgICBOT1JNQUxfUkVUUklFUyk7CisJY2FzZSBTQ1NJX0lPQ1RMX1NUQVJUX1VOSVQ6CisJCXNjc2lfY21kWzBdID0gU1RBUlRfU1RPUDsKKwkJc2NzaV9jbWRbMV0gPSAwOworCQlzY3NpX2NtZFsyXSA9IHNjc2lfY21kWzNdID0gc2NzaV9jbWRbNV0gPSAwOworCQlzY3NpX2NtZFs0XSA9IDE7CisJCXJldHVybiBpb2N0bF9pbnRlcm5hbF9jb21tYW5kKHNkZXYsIHNjc2lfY21kLAorCQkJCSAgICAgU1RBUlRfU1RPUF9USU1FT1VULCBOT1JNQUxfUkVUUklFUyk7CisJY2FzZSBTQ1NJX0lPQ1RMX1NUT1BfVU5JVDoKKwkJc2NzaV9jbWRbMF0gPSBTVEFSVF9TVE9QOworCQlzY3NpX2NtZFsxXSA9IDA7CisJCXNjc2lfY21kWzJdID0gc2NzaV9jbWRbM10gPSBzY3NpX2NtZFs1XSA9IDA7CisJCXNjc2lfY21kWzRdID0gMDsKKwkJcmV0dXJuIGlvY3RsX2ludGVybmFsX2NvbW1hbmQoc2Rldiwgc2NzaV9jbWQsCisJCQkJICAgICBTVEFSVF9TVE9QX1RJTUVPVVQsIE5PUk1BTF9SRVRSSUVTKTsKKyAgICAgICAgY2FzZSBTQ1NJX0lPQ1RMX0dFVF9QQ0k6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNjc2lfaW9jdGxfZ2V0X3BjaShzZGV2LCBhcmcpOworCWRlZmF1bHQ6CisJCWlmIChzZGV2LT5ob3N0LT5ob3N0dC0+aW9jdGwpCisJCQlyZXR1cm4gc2Rldi0+aG9zdC0+aG9zdHQtPmlvY3RsKHNkZXYsIGNtZCwgYXJnKTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfaW9jdGwpOworCisvKgorICogdGhlIHNjc2lfbm9uYmxvY2tfaW9jdGwoKSBmdW5jdGlvbiBpcyBkZXNpZ25lZCBmb3IgaW9jdGxzIHdoaWNoIG1heQorICogYmUgZXhlY3V0ZWQgZXZlbiBpZiB0aGUgZGV2aWNlIGlzIGluIHJlY292ZXJ5LgorICovCitpbnQgc2NzaV9ub25ibG9ja2FibGVfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgY21kLAorCQkJICAgIHZvaWQgX191c2VyICphcmcsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWludCB2YWwsIHJlc3VsdDsKKworCS8qIFRoZSBmaXJzdCBzZXQgb2YgaW9jdHMgbWF5IGJlIGV4ZWN1dGVkIGV2ZW4gaWYgd2UncmUgZG9pbmcKKwkgKiBlcnJvciBwcm9jZXNzaW5nLCBhcyBsb25nIGFzIHRoZSBkZXZpY2Ugd2FzIG9wZW5lZAorCSAqIG5vbi1ibG9ja2luZyAqLworCWlmIChmaWxwICYmIGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCWlmICh0ZXN0X2JpdChTSE9TVF9SRUNPVkVSWSwKKwkJCSAgICAgJnNkZXYtPmhvc3QtPnNob3N0X3N0YXRlKSkKKwkJCXJldHVybiAtRU5PREVWOworCX0gZWxzZSBpZiAoIXNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhzZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0dfU0NTSV9SRVNFVDoKKwkJcmVzdWx0ID0gZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZyk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCQlpZiAodmFsID09IFNHX1NDU0lfUkVTRVRfTk9USElORykKKwkJCXJldHVybiAwOworCQlzd2l0Y2ggKHZhbCkgeworCQljYXNlIFNHX1NDU0lfUkVTRVRfREVWSUNFOgorCQkJdmFsID0gU0NTSV9UUllfUkVTRVRfREVWSUNFOworCQkJYnJlYWs7CisJCWNhc2UgU0dfU0NTSV9SRVNFVF9CVVM6CisJCQl2YWwgPSBTQ1NJX1RSWV9SRVNFVF9CVVM7CisJCQlicmVhazsKKwkJY2FzZSBTR19TQ1NJX1JFU0VUX0hPU1Q6CisJCQl2YWwgPSBTQ1NJX1RSWV9SRVNFVF9IT1NUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJcmV0dXJuIChzY3NpX3Jlc2V0X3Byb3ZpZGVyKHNkZXYsIHZhbCkgPT0KKwkJCVNVQ0NFU1MpID8gMCA6IC1FSU87CisJfQorCXJldHVybiAtRU5PREVWOworfQorRVhQT1JUX1NZTUJPTChzY3NpX25vbmJsb2NrYWJsZV9pb2N0bCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYmM0MTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwpAQCAtMCwwICsxLDIwMjMgQEAKKy8qCisgKiAgc2NzaV9saWIuYyBDb3B5cmlnaHQgKEMpIDE5OTkgRXJpYyBZb3VuZ2RhbGUKKyAqCisgKiAgU0NTSSBxdWV1ZWluZyBsaWJyYXJ5LgorICogICAgICBJbml0aWFsIHZlcnNpb25zOiBFcmljIFlvdW5nZGFsZSAoZXJpY0BhbmRhbnRlLm9yZykuCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VkIHVwb24gY29udmVyc2F0aW9ucyB3aXRoIGxhcmdlIG51bWJlcnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgb2YgcGVvcGxlIGF0IExpbnV4IEV4cG8uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RiZy5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZHJpdmVyLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfcmVxdWVzdC5oPgorCisjaW5jbHVkZSAic2NzaV9wcml2LmgiCisjaW5jbHVkZSAic2NzaV9sb2dnaW5nLmgiCisKKworI2RlZmluZSBTR19NRU1QT09MX05SCQkoc2l6ZW9mKHNjc2lfc2dfcG9vbHMpL3NpemVvZihzdHJ1Y3Qgc2NzaV9ob3N0X3NnX3Bvb2wpKQorI2RlZmluZSBTR19NRU1QT09MX1NJWkUJCTMyCisKK3N0cnVjdCBzY3NpX2hvc3Rfc2dfcG9vbCB7CisJc2l6ZV90CQlzaXplOworCWNoYXIJCSpuYW1lOyAKKwlrbWVtX2NhY2hlX3QJKnNsYWI7CisJbWVtcG9vbF90CSpwb29sOworfTsKKworI2lmIChTQ1NJX01BWF9QSFlTX1NFR01FTlRTIDwgMzIpCisjZXJyb3IgU0NTSV9NQVhfUEhZU19TRUdNRU5UUyBpcyB0b28gc21hbGwKKyNlbmRpZgorCisjZGVmaW5lIFNQKHgpIHsgeCwgInNncG9vbC0iICN4IH0gCitzdHJ1Y3Qgc2NzaV9ob3N0X3NnX3Bvb2wgc2NzaV9zZ19wb29sc1tdID0geyAKKwlTUCg4KSwKKwlTUCgxNiksCisJU1AoMzIpLAorI2lmIChTQ1NJX01BWF9QSFlTX1NFR01FTlRTID4gMzIpCisJU1AoNjQpLAorI2lmIChTQ1NJX01BWF9QSFlTX1NFR01FTlRTID4gNjQpCisJU1AoMTI4KSwKKyNpZiAoU0NTSV9NQVhfUEhZU19TRUdNRU5UUyA+IDEyOCkKKwlTUCgyNTYpLAorI2lmIChTQ1NJX01BWF9QSFlTX1NFR01FTlRTID4gMjU2KQorI2Vycm9yIFNDU0lfTUFYX1BIWVNfU0VHTUVOVFMgaXMgdG9vIGxhcmdlCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKK307IAkKKyN1bmRlZiBTUAorCisKKy8qCisgKiBGdW5jdGlvbjogICAgc2NzaV9pbnNlcnRfc3BlY2lhbF9yZXEoKQorICoKKyAqIFB1cnBvc2U6ICAgICBJbnNlcnQgcHJlLWZvcm1lZCByZXF1ZXN0IGludG8gcmVxdWVzdCBxdWV1ZS4KKyAqCisgKiBBcmd1bWVudHM6ICAgc3JlcQktIHJlcXVlc3QgdGhhdCBpcyByZWFkeSB0byBiZSBxdWV1ZWQuCisgKiAgICAgICAgICAgICAgYXRfaGVhZAktIGJvb2xlYW4uICBUcnVlIGlmIHdlIHNob3VsZCBpbnNlcnQgYXQgaGVhZAorICogICAgICAgICAgICAgICAgICAgICAgICBvZiBxdWV1ZSwgZmFsc2UgaWYgd2Ugc2hvdWxkIGluc2VydCBhdCB0YWlsLgorICoKKyAqIExvY2sgc3RhdHVzOiBBc3N1bWVkIHRoYXQgbG9jayBpcyBub3QgaGVsZCB1cG9uIGVudHJ5LgorICoKKyAqIFJldHVybnM6ICAgICBOb3RoaW5nCisgKgorICogTm90ZXM6ICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gY2hhcmFjdGVyIGRldmljZSBhbmQgZnJvbQorICogICAgICAgICAgICAgIGlvY3RsIHR5cGVzIG9mIGZ1bmN0aW9ucyB3aGVyZSB0aGUgY2FsbGVyIGtub3dzIGV4YWN0bHkKKyAqICAgICAgICAgICAgICB3aGF0IFNDU0kgY29tbWFuZCBuZWVkcyB0byBiZSBpc3N1ZWQuICAgVGhlIGlkZWEgaXMgdGhhdAorICogICAgICAgICAgICAgIHdlIG1lcmVseSBpbmplY3QgdGhlIGNvbW1hbmQgaW50byB0aGUgcXVldWUgKGF0IHRoZSBoZWFkCisgKiAgICAgICAgICAgICAgZm9yIG5vdyksIGFuZCB0aGVuIGNhbGwgdGhlIHF1ZXVlIHJlcXVlc3QgZnVuY3Rpb24gdG8gYWN0dWFsbHkKKyAqICAgICAgICAgICAgICBwcm9jZXNzIGl0LgorICovCitpbnQgc2NzaV9pbnNlcnRfc3BlY2lhbF9yZXEoc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSwgaW50IGF0X2hlYWQpCit7CisJLyoKKwkgKiBCZWNhdXNlIHVzZXJzIG9mIHRoaXMgZnVuY3Rpb24gYXJlIGFwdCB0byByZXVzZSByZXF1ZXN0cyB3aXRoIG5vCisJICogbW9kaWZpY2F0aW9uLCB3ZSBoYXZlIHRvIHNhbml0aXNlIHRoZSByZXF1ZXN0IGZsYWdzIGhlcmUKKwkgKi8KKwlzcmVxLT5zcl9yZXF1ZXN0LT5mbGFncyAmPSB+UkVRX0RPTlRQUkVQOworCWJsa19pbnNlcnRfcmVxdWVzdChzcmVxLT5zcl9kZXZpY2UtPnJlcXVlc3RfcXVldWUsIHNyZXEtPnNyX3JlcXVlc3QsCisJCSAgICAgICAJICAgYXRfaGVhZCwgc3JlcSwgMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogICAgc2NzaV9xdWV1ZV9pbnNlcnQoKQorICoKKyAqIFB1cnBvc2U6ICAgICBJbnNlcnQgYSBjb21tYW5kIGluIHRoZSBtaWRsZXZlbCBxdWV1ZS4KKyAqCisgKiBBcmd1bWVudHM6ICAgY21kICAgIC0gY29tbWFuZCB0aGF0IHdlIGFyZSBhZGRpbmcgdG8gcXVldWUuCisgKiAgICAgICAgICAgICAgcmVhc29uIC0gd2h5IHdlIGFyZSBpbnNlcnRpbmcgY29tbWFuZCB0byBxdWV1ZS4KKyAqCisgKiBMb2NrIHN0YXR1czogQXNzdW1lZCB0aGF0IGxvY2sgaXMgbm90IGhlbGQgdXBvbiBlbnRyeS4KKyAqCisgKiBSZXR1cm5zOiAgICAgTm90aGluZy4KKyAqCisgKiBOb3RlczogICAgICAgV2UgZG8gdGhpcyBmb3Igb25lIG9mIHR3byBjYXNlcy4gIEVpdGhlciB0aGUgaG9zdCBpcyBidXN5CisgKiAgICAgICAgICAgICAgYW5kIGl0IGNhbm5vdCBhY2NlcHQgYW55IG1vcmUgY29tbWFuZHMgZm9yIHRoZSB0aW1lIGJlaW5nLAorICogICAgICAgICAgICAgIG9yIHRoZSBkZXZpY2UgcmV0dXJuZWQgUVVFVUVfRlVMTCBhbmQgY2FuIGFjY2VwdCBubyBtb3JlCisgKiAgICAgICAgICAgICAgY29tbWFuZHMuCisgKiBOb3RlczogICAgICAgVGhpcyBjb3VsZCBiZSBjYWxsZWQgZWl0aGVyIGZyb20gYW4gaW50ZXJydXB0IGNvbnRleHQgb3IgYQorICogICAgICAgICAgICAgIG5vcm1hbCBwcm9jZXNzIGNvbnRleHQuCisgKi8KK2ludCBzY3NpX3F1ZXVlX2luc2VydChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCByZWFzb24pCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCXN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlID0gY21kLT5kZXZpY2U7CisKKwlTQ1NJX0xPR19NTFFVRVVFKDEsCisJCSBwcmludGsoIkluc2VydGluZyBjb21tYW5kICVwIGludG8gbWxxdWV1ZVxuIiwgY21kKSk7CisKKwkvKgorCSAqIFdlIGFyZSBpbnNlcnRpbmcgdGhlIGNvbW1hbmQgaW50byB0aGUgbWwgcXVldWUuICBGaXJzdCwgd2UKKwkgKiBjYW5jZWwgdGhlIHRpbWVyLCBzbyBpdCBkb2Vzbid0IHRpbWUgb3V0LgorCSAqLworCXNjc2lfZGVsZXRlX3RpbWVyKGNtZCk7CisKKwkvKgorCSAqIE5leHQsIHNldCB0aGUgYXBwcm9wcmlhdGUgYnVzeSBiaXQgZm9yIHRoZSBkZXZpY2UvaG9zdC4KKwkgKgorCSAqIElmIHRoZSBob3N0L2RldmljZSBpc24ndCBidXN5LCBhc3N1bWUgdGhhdCBzb21ldGhpbmcgYWN0dWFsbHkKKwkgKiBjb21wbGV0ZWQsIGFuZCB0aGF0IHdlIHNob3VsZCBiZSBhYmxlIHRvIHF1ZXVlIGEgY29tbWFuZCBub3cuCisJICoKKwkgKiBOb3RlIHRoYXQgdGhlIHByaW9yIG1pZC1sYXllciBhc3N1bXB0aW9uIHRoYXQgYW55IGhvc3QgY291bGQKKwkgKiBhbHdheXMgcXVldWUgYXQgbGVhc3Qgb25lIGNvbW1hbmQgaXMgbm93IGJyb2tlbi4gIFRoZSBtaWQtbGF5ZXIKKwkgKiB3aWxsIGltcGxlbWVudCBhIHVzZXIgc3BlY2lmaWFibGUgc3RhbGwgKHNlZQorCSAqIHNjc2lfaG9zdC5tYXhfaG9zdF9ibG9ja2VkIGFuZCBzY3NpX2RldmljZS5tYXhfZGV2aWNlX2Jsb2NrZWQpCisJICogaWYgYSBjb21tYW5kIGlzIHJlcXVldWVkIHdpdGggbm8gb3RoZXIgY29tbWFuZHMgb3V0c3RhbmRpbmcKKwkgKiBlaXRoZXIgZm9yIHRoZSBkZXZpY2Ugb3IgZm9yIHRoZSBob3N0LgorCSAqLworCWlmIChyZWFzb24gPT0gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWSkKKwkJaG9zdC0+aG9zdF9ibG9ja2VkID0gaG9zdC0+bWF4X2hvc3RfYmxvY2tlZDsKKwllbHNlIGlmIChyZWFzb24gPT0gU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZKQorCQlkZXZpY2UtPmRldmljZV9ibG9ja2VkID0gZGV2aWNlLT5tYXhfZGV2aWNlX2Jsb2NrZWQ7CisKKwkvKgorCSAqIFJlZ2lzdGVyIHRoZSBmYWN0IHRoYXQgd2Ugb3duIHRoZSB0aGluZyBmb3Igbm93LgorCSAqLworCWNtZC0+c3RhdGUgPSBTQ1NJX1NUQVRFX01MUVVFVUU7CisJY21kLT5vd25lciA9IFNDU0lfT1dORVJfTUlETEVWRUw7CisKKwkvKgorCSAqIERlY3JlbWVudCB0aGUgY291bnRlcnMsIHNpbmNlIHRoZXNlIGNvbW1hbmRzIGFyZSBubyBsb25nZXIKKwkgKiBhY3RpdmUgb24gdGhlIGhvc3QvZGV2aWNlLgorCSAqLworCXNjc2lfZGV2aWNlX3VuYnVzeShkZXZpY2UpOworCisJLyoKKwkgKiBJbnNlcnQgdGhpcyBjb21tYW5kIGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBmb3IgaXQncyBkZXZpY2UuCisJICogSXQgd2lsbCBnbyBiZWZvcmUgYWxsIG90aGVyIGNvbW1hbmRzIHRoYXQgYXJlIGFscmVhZHkgaW4gdGhlIHF1ZXVlLgorCSAqCisJICogTk9URTogdGhlcmUgaXMgbWFnaWMgaGVyZSBhYm91dCB0aGUgd2F5IHRoZSBxdWV1ZSBpcyBwbHVnZ2VkIGlmCisJICogd2UgaGF2ZSBubyBvdXRzdGFuZGluZyBjb21tYW5kcy4KKwkgKiAKKwkgKiBBbHRob3VnaCB0aGlzICpkb2Vzbid0KiBwbHVnIHRoZSBxdWV1ZSwgaXQgZG9lcyBjYWxsIHRoZSByZXF1ZXN0CisJICogZnVuY3Rpb24uICBUaGUgU0NTSSByZXF1ZXN0IGZ1bmN0aW9uIGRldGVjdHMgdGhlIGJsb2NrZWQgY29uZGl0aW9uCisJICogYW5kIHBsdWdzIHRoZSBxdWV1ZSBhcHByb3ByaWF0ZWx5LgorCSAqLworCWJsa19pbnNlcnRfcmVxdWVzdChkZXZpY2UtPnJlcXVlc3RfcXVldWUsIGNtZC0+cmVxdWVzdCwgMSwgY21kLCAxKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiAgICBzY3NpX2RvX3JlcQorICoKKyAqIFB1cnBvc2U6ICAgICBRdWV1ZSBhIFNDU0kgcmVxdWVzdAorICoKKyAqIEFyZ3VtZW50czogICBzcmVxCSAgLSBjb21tYW5kIGRlc2NyaXB0b3IuCisgKiAgICAgICAgICAgICAgY21uZCAgICAgIC0gYWN0dWFsIFNDU0kgY29tbWFuZCB0byBiZSBwZXJmb3JtZWQuCisgKiAgICAgICAgICAgICAgYnVmZmVyICAgIC0gZGF0YSBidWZmZXIuCisgKiAgICAgICAgICAgICAgYnVmZmxlbiAgIC0gc2l6ZSBvZiBkYXRhIGJ1ZmZlci4KKyAqICAgICAgICAgICAgICBkb25lICAgICAgLSBjb21wbGV0aW9uIGZ1bmN0aW9uIHRvIGJlIHJ1bi4KKyAqICAgICAgICAgICAgICB0aW1lb3V0ICAgLSBob3cgbG9uZyB0byBsZXQgaXQgcnVuIGJlZm9yZSB0aW1lb3V0LgorICogICAgICAgICAgICAgIHJldHJpZXMgICAtIG51bWJlciBvZiByZXRyaWVzIHdlIGFsbG93LgorICoKKyAqIExvY2sgc3RhdHVzOiBObyBsb2NrcyBoZWxkIHVwb24gZW50cnkuCisgKgorICogUmV0dXJuczogICAgIE5vdGhpbmcuCisgKgorICogTm90ZXM6CVRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGZvciBxdWV1ZWluZyByZXF1ZXN0cyBmb3IgdGhpbmdzCisgKgkJbGlrZSBpb2N0bHMgYW5kIGNoYXJhY3RlciBkZXZpY2UgcmVxdWVzdHMgLSB0aGlzIGlzIGJlY2F1c2UKKyAqCQl3ZSBlc3NlbnRpYWxseSBqdXN0IGluamVjdCBhIHJlcXVlc3QgaW50byB0aGUgcXVldWUgZm9yIHRoZQorICoJCWRldmljZS4KKyAqCisgKgkJSW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgc2NzaV9kZXZpY2VfcXVpZXNjZSBmdW5jdGlvbiwgd2UKKyAqCQlub3cgaW5qZWN0IHJlcXVlc3RzIG9uIHRoZSAqaGVhZCogb2YgdGhlIGRldmljZSBxdWV1ZQorICoJCXJhdGhlciB0aGFuIHRoZSB0YWlsLgorICovCit2b2lkIHNjc2lfZG9fcmVxKHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEsIGNvbnN0IHZvaWQgKmNtbmQsCisJCSB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGJ1ZmZsZW4sCisJCSB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSwKKwkJIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcykKK3sKKwkvKgorCSAqIElmIHRoZSB1cHBlciBsZXZlbCBkcml2ZXIgaXMgcmV1c2luZyB0aGVzZSB0aGluZ3MsIHRoZW4KKwkgKiB3ZSBzaG91bGQgcmVsZWFzZSB0aGUgbG93LWxldmVsIGJsb2NrIG5vdy4gIEFub3RoZXIgb25lIHdpbGwKKwkgKiBiZSBhbGxvY2F0ZWQgbGF0ZXIgd2hlbiB0aGlzIHJlcXVlc3QgaXMgZ2V0dGluZyBxdWV1ZWQuCisJICovCisJX19zY3NpX3JlbGVhc2VfcmVxdWVzdChzcmVxKTsKKworCS8qCisJICogT3VyIG93biBmdW5jdGlvbiBzY3NpX2RvbmUgKHdoaWNoIG1hcmtzIHRoZSBob3N0IGFzIG5vdCBidXN5LAorCSAqIGRpc2FibGVzIHRoZSB0aW1lb3V0IGNvdW50ZXIsIGV0Yykgd2lsbCBiZSBjYWxsZWQgYnkgdXMgb3IgYnkgdGhlCisJICogc2NzaV9ob3N0c1tob3N0XS5xdWV1ZWNvbW1hbmQoKSBmdW5jdGlvbiBuZWVkcyB0byBhbHNvIGNhbGwKKwkgKiB0aGUgY29tcGxldGlvbiBmdW5jdGlvbiBmb3IgdGhlIGhpZ2ggbGV2ZWwgZHJpdmVyLgorCSAqLworCW1lbWNweShzcmVxLT5zcl9jbW5kLCBjbW5kLCBzaXplb2Yoc3JlcS0+c3JfY21uZCkpOworCXNyZXEtPnNyX2J1ZmZsZW4gPSBidWZmbGVuOworCXNyZXEtPnNyX2J1ZmZlciA9IGJ1ZmZlcjsKKwlzcmVxLT5zcl9hbGxvd2VkID0gcmV0cmllczsKKwlzcmVxLT5zcl9kb25lID0gZG9uZTsKKwlzcmVxLT5zcl90aW1lb3V0X3Blcl9jb21tYW5kID0gdGltZW91dDsKKworCWlmIChzcmVxLT5zcl9jbWRfbGVuID09IDApCisJCXNyZXEtPnNyX2NtZF9sZW4gPSBDT01NQU5EX1NJWkUoc3JlcS0+c3JfY21uZFswXSk7CisKKwkvKgorCSAqIGhlYWQgaW5qZWN0aW9uICpyZXF1aXJlZCogaGVyZSBvdGhlcndpc2UgcXVpZXNjZSB3b24ndCB3b3JrCisJICovCisJc2NzaV9pbnNlcnRfc3BlY2lhbF9yZXEoc3JlcSwgMSk7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfZG9fcmVxKTsKKworc3RhdGljIHZvaWQgc2NzaV93YWl0X2RvbmUoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBjbWQtPnJlcXVlc3Q7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBjbWQtPmRldmljZS0+cmVxdWVzdF9xdWV1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmVxLT5ycV9zdGF0dXMgPSBSUV9TQ1NJX0RPTkU7CS8qIEJ1c3ksIGJ1dCBpbmRpY2F0ZSByZXF1ZXN0IGRvbmUgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlpZiAoYmxrX3JxX3RhZ2dlZChyZXEpKQorCQlibGtfcXVldWVfZW5kX3RhZyhxLCByZXEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJaWYgKHJlcS0+d2FpdGluZykKKwkJY29tcGxldGUocmVxLT53YWl0aW5nKTsKK30KKworLyogVGhpcyBpcyB0aGUgZW5kIHJvdXRpbmUgd2UgZ2V0IHRvIGlmIGEgY29tbWFuZCB3YXMgbmV2ZXIgYXR0YWNoZWQKKyAqIHRvIHRoZSByZXF1ZXN0LiAgU2ltcGx5IGNvbXBsZXRlIHRoZSByZXF1ZXN0IHdpdGhvdXQgY2hhbmdpbmcKKyAqIHJxX3N0YXR1czsgdGhpcyB3aWxsIGNhdXNlIGEgRFJJVkVSX0VSUk9SLiAqLworc3RhdGljIHZvaWQgc2NzaV93YWl0X3JlcV9lbmRfaW8oc3RydWN0IHJlcXVlc3QgKnJlcSkKK3sKKwlCVUdfT04oIXJlcS0+d2FpdGluZyk7CisKKwljb21wbGV0ZShyZXEtPndhaXRpbmcpOworfQorCit2b2lkIHNjc2lfd2FpdF9yZXEoc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSwgY29uc3Qgdm9pZCAqY21uZCwgdm9pZCAqYnVmZmVyLAorCQkgICB1bnNpZ25lZCBidWZmbGVuLCBpbnQgdGltZW91dCwgaW50IHJldHJpZXMpCit7CisJREVDTEFSRV9DT01QTEVUSU9OKHdhaXQpOworCQorCXNyZXEtPnNyX3JlcXVlc3QtPndhaXRpbmcgPSAmd2FpdDsKKwlzcmVxLT5zcl9yZXF1ZXN0LT5ycV9zdGF0dXMgPSBSUV9TQ1NJX0JVU1k7CisJc3JlcS0+c3JfcmVxdWVzdC0+ZW5kX2lvID0gc2NzaV93YWl0X3JlcV9lbmRfaW87CisJc2NzaV9kb19yZXEoc3JlcSwgY21uZCwgYnVmZmVyLCBidWZmbGVuLCBzY3NpX3dhaXRfZG9uZSwKKwkJCXRpbWVvdXQsIHJldHJpZXMpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOworCXNyZXEtPnNyX3JlcXVlc3QtPndhaXRpbmcgPSBOVUxMOworCWlmIChzcmVxLT5zcl9yZXF1ZXN0LT5ycV9zdGF0dXMgIT0gUlFfU0NTSV9ET05FKQorCQlzcmVxLT5zcl9yZXN1bHQgfD0gKERSSVZFUl9FUlJPUiA8PCAyNCk7CisKKwlfX3Njc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3dhaXRfcmVxKTsKKworLyoKKyAqIEZ1bmN0aW9uOiAgICBzY3NpX2luaXRfY21kX2VycmgoKQorICoKKyAqIFB1cnBvc2U6ICAgICBJbml0aWFsaXplIGNtZCBmaWVsZHMgcmVsYXRlZCB0byBlcnJvciBoYW5kbGluZy4KKyAqCisgKiBBcmd1bWVudHM6ICAgY21kCS0gY29tbWFuZCB0aGF0IGlzIHJlYWR5IHRvIGJlIHF1ZXVlZC4KKyAqCisgKiBSZXR1cm5zOiAgICAgTm90aGluZworICoKKyAqIE5vdGVzOiAgICAgICBUaGlzIGZ1bmN0aW9uIGhhcyB0aGUgam9iIG9mIGluaXRpYWxpemluZyBhIG51bWJlciBvZgorICogICAgICAgICAgICAgIGZpZWxkcyByZWxhdGVkIHRvIGVycm9yIGhhbmRsaW5nLiAgIFR5cGljYWxseSB0aGlzIHdpbGwKKyAqICAgICAgICAgICAgICBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBjb21tYW5kLCBhcyByZXF1aXJlZC4KKyAqLworc3RhdGljIGludCBzY3NpX2luaXRfY21kX2Vycmgoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCWNtZC0+b3duZXIgPSBTQ1NJX09XTkVSX01JRExFVkVMOworCWNtZC0+c2VyaWFsX251bWJlciA9IDA7CisJY21kLT5zZXJpYWxfbnVtYmVyX2F0X3RpbWVvdXQgPSAwOworCWNtZC0+YWJvcnRfcmVhc29uID0gMDsKKworCW1lbXNldChjbWQtPnNlbnNlX2J1ZmZlciwgMCwgc2l6ZW9mIGNtZC0+c2Vuc2VfYnVmZmVyKTsKKworCWlmIChjbWQtPmNtZF9sZW4gPT0gMCkKKwkJY21kLT5jbWRfbGVuID0gQ09NTUFORF9TSVpFKGNtZC0+Y21uZFswXSk7CisKKwkvKgorCSAqIFdlIG5lZWQgc2F2ZWQgY29waWVzIG9mIGEgbnVtYmVyIG9mIGZpZWxkcyAtIHRoaXMgaXMgYmVjYXVzZQorCSAqIGVycm9yIGhhbmRsaW5nIG1heSBuZWVkIHRvIG92ZXJ3cml0ZSB0aGVzZSB3aXRoIGRpZmZlcmVudCB2YWx1ZXMKKwkgKiB0byBydW4gZGlmZmVyZW50IGNvbW1hbmRzLCBhbmQgb25jZSBlcnJvciBoYW5kbGluZyBpcyBjb21wbGV0ZSwKKwkgKiB3ZSB3aWxsIG5lZWQgdG8gcmVzdG9yZSB0aGVzZSB2YWx1ZXMgcHJpb3IgdG8gcnVubmluZyB0aGUgYWN0dWFsCisJICogY29tbWFuZC4KKwkgKi8KKwljbWQtPm9sZF91c2Vfc2cgPSBjbWQtPnVzZV9zZzsKKwljbWQtPm9sZF9jbWRfbGVuID0gY21kLT5jbWRfbGVuOworCWNtZC0+c2Nfb2xkX2RhdGFfZGlyZWN0aW9uID0gY21kLT5zY19kYXRhX2RpcmVjdGlvbjsKKwljbWQtPm9sZF91bmRlcmZsb3cgPSBjbWQtPnVuZGVyZmxvdzsKKwltZW1jcHkoY21kLT5kYXRhX2NtbmQsIGNtZC0+Y21uZCwgc2l6ZW9mKGNtZC0+Y21uZCkpOworCWNtZC0+YnVmZmVyID0gY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwljbWQtPmJ1ZmZsZW4gPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwljbWQtPmludGVybmFsX3RpbWVvdXQgPSBOT1JNQUxfVElNRU9VVDsKKwljbWQtPmFib3J0X3JlYXNvbiA9IDA7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiAgIHNjc2lfc2V0dXBfY21kX3JldHJ5KCkKKyAqCisgKiBQdXJwb3NlOiAgICBSZXN0b3JlIHRoZSBjb21tYW5kIHN0YXRlIGZvciBhIHJldHJ5CisgKgorICogQXJndW1lbnRzOiAgY21kCS0gY29tbWFuZCB0byBiZSByZXN0b3JlZAorICoKKyAqIFJldHVybnM6ICAgIE5vdGhpbmcKKyAqCisgKiBOb3RlczogICAgICBJbW1lZGlhdGVseSBwcmlvciB0byByZXRyeWluZyBhIGNvbW1hbmQsIHdlIG5lZWQKKyAqICAgICAgICAgICAgIHRvIHJlc3RvcmUgY2VydGFpbiBmaWVsZHMgdGhhdCB3ZSBzYXZlZCBhYm92ZS4KKyAqLwordm9pZCBzY3NpX3NldHVwX2NtZF9yZXRyeShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJbWVtY3B5KGNtZC0+Y21uZCwgY21kLT5kYXRhX2NtbmQsIHNpemVvZihjbWQtPmRhdGFfY21uZCkpOworCWNtZC0+cmVxdWVzdF9idWZmZXIgPSBjbWQtPmJ1ZmZlcjsKKwljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IGNtZC0+YnVmZmxlbjsKKwljbWQtPnVzZV9zZyA9IGNtZC0+b2xkX3VzZV9zZzsKKwljbWQtPmNtZF9sZW4gPSBjbWQtPm9sZF9jbWRfbGVuOworCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBjbWQtPnNjX29sZF9kYXRhX2RpcmVjdGlvbjsKKwljbWQtPnVuZGVyZmxvdyA9IGNtZC0+b2xkX3VuZGVyZmxvdzsKK30KKwordm9pZCBzY3NpX2RldmljZV91bmJ1c3koc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gc2Rldi0+aG9zdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXNob3N0LT5ob3N0X2J1c3ktLTsKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoU0hPU1RfUkVDT1ZFUlksICZzaG9zdC0+c2hvc3Rfc3RhdGUpICYmCisJCSAgICAgc2hvc3QtPmhvc3RfZmFpbGVkKSkKKwkJc2NzaV9laF93YWtldXAoc2hvc3QpOworCXNwaW5fdW5sb2NrKHNob3N0LT5ob3N0X2xvY2spOworCXNwaW5fbG9jaygmc2Rldi0+c2Rldl9sb2NrKTsKKwlzZGV2LT5kZXZpY2VfYnVzeS0tOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkZXYtPnNkZXZfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogQ2FsbGVkIGZvciBzaW5nbGVfbHVuIGRldmljZXMgb24gSU8gY29tcGxldGlvbi4gQ2xlYXIgc3RhcmdldF9zZGV2X3VzZXIsCisgKiBhbmQgY2FsbCBibGtfcnVuX3F1ZXVlIGZvciBhbGwgdGhlIHNjc2lfZGV2aWNlcyBvbiB0aGUgdGFyZ2V0IC0KKyAqIGluY2x1ZGluZyBjdXJyZW50X3NkZXYgZmlyc3QuCisgKgorICogQ2FsbGVkIHdpdGggKm5vKiBzY3NpIGxvY2tzIGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIHNjc2lfc2luZ2xlX2x1bl9ydW4oc3RydWN0IHNjc2lfZGV2aWNlICpjdXJyZW50X3NkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjdXJyZW50X3NkZXYtPmhvc3Q7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCAqdG1wOworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHNjc2lfdGFyZ2V0KGN1cnJlbnRfc2Rldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlzdGFyZ2V0LT5zdGFyZ2V0X3NkZXZfdXNlciA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIENhbGwgYmxrX3J1bl9xdWV1ZSBmb3IgYWxsIExVTnMgb24gdGhlIHRhcmdldCwgc3RhcnRpbmcgd2l0aAorCSAqIGN1cnJlbnRfc2Rldi4gV2UgcmFjZSB3aXRoIG90aGVycyAodG8gc2V0IHN0YXJnZXRfc2Rldl91c2VyKSwKKwkgKiBidXQgaW4gbW9zdCBjYXNlcywgd2Ugd2lsbCBiZSBmaXJzdC4gSWRlYWxseSwgZWFjaCBMVSBvbiB0aGUKKwkgKiB0YXJnZXQgd291bGQgZ2V0IHNvbWUgbGltaXRlZCB0aW1lIG9yIHJlcXVlc3RzIG9uIHRoZSB0YXJnZXQuCisJICovCisJYmxrX3J1bl9xdWV1ZShjdXJyZW50X3NkZXYtPnJlcXVlc3RfcXVldWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWlmIChzdGFyZ2V0LT5zdGFyZ2V0X3NkZXZfdXNlcikKKwkJZ290byBvdXQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNkZXYsIHRtcCwgJnN0YXJnZXQtPmRldmljZXMsCisJCQlzYW1lX3RhcmdldF9zaWJsaW5ncykgeworCQlpZiAoc2RldiA9PSBjdXJyZW50X3NkZXYpCisJCQljb250aW51ZTsKKwkJaWYgKHNjc2lfZGV2aWNlX2dldChzZGV2KSkKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlibGtfcnVuX3F1ZXVlKHNkZXYtPnJlcXVlc3RfcXVldWUpOworCQlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCisJCXNjc2lfZGV2aWNlX3B1dChzZGV2KTsKKwl9Cisgb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogRnVuY3Rpb246CXNjc2lfcnVuX3F1ZXVlKCkKKyAqCisgKiBQdXJwb3NlOglTZWxlY3QgYSBwcm9wZXIgcmVxdWVzdCBxdWV1ZSB0byBzZXJ2ZSBuZXh0CisgKgorICogQXJndW1lbnRzOglxCS0gbGFzdCByZXF1ZXN0J3MgcXVldWUKKyAqCisgKiBSZXR1cm5zOiAgICAgTm90aGluZworICoKKyAqIE5vdGVzOglUaGUgcHJldmlvdXMgY29tbWFuZCB3YXMgY29tcGxldGVseSBmaW5pc2hlZCwgc3RhcnQKKyAqCQlhIG5ldyBvbmUgaWYgcG9zc2libGUuCisgKi8KK3N0YXRpYyB2b2lkIHNjc2lfcnVuX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHEtPnF1ZXVlZGF0YTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHNkZXYtPmhvc3Q7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZGV2LT5zaW5nbGVfbHVuKQorCQlzY3NpX3NpbmdsZV9sdW5fcnVuKHNkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXdoaWxlICghbGlzdF9lbXB0eSgmc2hvc3QtPnN0YXJ2ZWRfbGlzdCkgJiYKKwkgICAgICAgIXNob3N0LT5ob3N0X2Jsb2NrZWQgJiYgIXNob3N0LT5ob3N0X3NlbGZfYmxvY2tlZCAmJgorCQkhKChzaG9zdC0+Y2FuX3F1ZXVlID4gMCkgJiYKKwkJICAoc2hvc3QtPmhvc3RfYnVzeSA+PSBzaG9zdC0+Y2FuX3F1ZXVlKSkpIHsKKwkJLyoKKwkJICogQXMgbG9uZyBhcyBzaG9zdCBpcyBhY2NlcHRpbmcgY29tbWFuZHMgYW5kIHdlIGhhdmUKKwkJICogc3RhcnZlZCBxdWV1ZXMsIGNhbGwgYmxrX3J1bl9xdWV1ZS4gc2NzaV9yZXF1ZXN0X2ZuCisJCSAqIGRyb3BzIHRoZSBxdWV1ZV9sb2NrIGFuZCBjYW4gYWRkIHVzIGJhY2sgdG8gdGhlCisJCSAqIHN0YXJ2ZWRfbGlzdC4KKwkJICoKKwkJICogaG9zdF9sb2NrIHByb3RlY3RzIHRoZSBzdGFydmVkX2xpc3QgYW5kIHN0YXJ2ZWRfZW50cnkuCisJCSAqIHNjc2lfcmVxdWVzdF9mbiBtdXN0IGdldCB0aGUgaG9zdF9sb2NrIGJlZm9yZSBjaGVja2luZworCQkgKiBvciBtb2RpZnlpbmcgc3RhcnZlZF9saXN0IG9yIHN0YXJ2ZWRfZW50cnkuCisJCSAqLworCQlzZGV2ID0gbGlzdF9lbnRyeShzaG9zdC0+c3RhcnZlZF9saXN0Lm5leHQsCisJCQkJCSAgc3RydWN0IHNjc2lfZGV2aWNlLCBzdGFydmVkX2VudHJ5KTsKKwkJbGlzdF9kZWxfaW5pdCgmc2Rldi0+c3RhcnZlZF9lbnRyeSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJCWJsa19ydW5fcXVldWUoc2Rldi0+cmVxdWVzdF9xdWV1ZSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlpZiAodW5saWtlbHkoIWxpc3RfZW1wdHkoJnNkZXYtPnN0YXJ2ZWRfZW50cnkpKSkKKwkJCS8qCisJCQkgKiBzZGV2IGxvc3QgYSByYWNlLCBhbmQgd2FzIHB1dCBiYWNrIG9uIHRoZQorCQkJICogc3RhcnZlZCBsaXN0LiBUaGlzIGlzIHVubGlrZWx5IGJ1dCB3aXRob3V0IHRoaXMKKwkJCSAqIGluIHRoZW9yeSB3ZSBjb3VsZCBsb29wIGZvcmV2ZXIuCisJCQkgKi8KKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCWJsa19ydW5fcXVldWUocSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjoJc2NzaV9yZXF1ZXVlX2NvbW1hbmQoKQorICoKKyAqIFB1cnBvc2U6CUhhbmRsZSBwb3N0LXByb2Nlc3Npbmcgb2YgY29tcGxldGVkIGNvbW1hbmRzLgorICoKKyAqIEFyZ3VtZW50czoJcQktIHF1ZXVlIHRvIG9wZXJhdGUgb24KKyAqCQljbWQJLSBjb21tYW5kIHRoYXQgbWF5IG5lZWQgdG8gYmUgcmVxdWV1ZWQuCisgKgorICogUmV0dXJuczoJTm90aGluZworICoKKyAqIE5vdGVzOglBZnRlciBjb21tYW5kIGNvbXBsZXRpb24sIHRoZXJlIG1heSBiZSBibG9ja3MgbGVmdAorICoJCW92ZXIgd2hpY2ggd2VyZW4ndCBmaW5pc2hlZCBieSB0aGUgcHJldmlvdXMgY29tbWFuZAorICoJCXRoaXMgY2FuIGJlIGZvciBhIG51bWJlciBvZiByZWFzb25zIC0gdGhlIG1haW4gb25lIGlzCisgKgkJSS9PIGVycm9ycyBpbiB0aGUgbWlkZGxlIG9mIHRoZSByZXF1ZXN0LCBpbiB3aGljaCBjYXNlCisgKgkJd2UgbmVlZCB0byByZXF1ZXN0IHRoZSBibG9ja3MgdGhhdCBjb21lIGFmdGVyIHRoZSBiYWQKKyAqCQlzZWN0b3IuCisgKi8KK3N0YXRpYyB2b2lkIHNjc2lfcmVxdWV1ZV9jb21tYW5kKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJY21kLT5yZXF1ZXN0LT5mbGFncyAmPSB+UkVRX0RPTlRQUkVQOworCWJsa19pbnNlcnRfcmVxdWVzdChxLCBjbWQtPnJlcXVlc3QsIDEsIGNtZCwgMSk7CisKKwlzY3NpX3J1bl9xdWV1ZShxKTsKK30KKwordm9pZCBzY3NpX25leHRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBjbWQtPmRldmljZS0+cmVxdWVzdF9xdWV1ZTsKKworCXNjc2lfcHV0X2NvbW1hbmQoY21kKTsKKwlzY3NpX3J1bl9xdWV1ZShxKTsKK30KKwordm9pZCBzY3NpX3J1bl9ob3N0X3F1ZXVlcyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisKKwlzaG9zdF9mb3JfZWFjaF9kZXZpY2Uoc2Rldiwgc2hvc3QpCisJCXNjc2lfcnVuX3F1ZXVlKHNkZXYtPnJlcXVlc3RfcXVldWUpOworfQorCisvKgorICogRnVuY3Rpb246ICAgIHNjc2lfZW5kX3JlcXVlc3QoKQorICoKKyAqIFB1cnBvc2U6ICAgICBQb3N0LXByb2Nlc3Npbmcgb2YgY29tcGxldGVkIGNvbW1hbmRzICh1c3VhbGx5IGludm9rZWQgYXQgZW5kCisgKgkJb2YgdXBwZXIgbGV2ZWwgcG9zdC1wcm9jZXNzaW5nIGFuZCBzY3NpX2lvX2NvbXBsZXRpb24pLgorICoKKyAqIEFyZ3VtZW50czogICBjbWQJIC0gY29tbWFuZCB0aGF0IGlzIGNvbXBsZXRlLgorICogICAgICAgICAgICAgIHVwdG9kYXRlIC0gMSBpZiBJL08gaW5kaWNhdGVzIHN1Y2Nlc3MsIDw9IDAgZm9yIEkvTyBlcnJvci4KKyAqICAgICAgICAgICAgICBieXRlcyAgICAtIG51bWJlciBvZiBieXRlcyBvZiBjb21wbGV0ZWQgSS9PCisgKgkJcmVxdWV1ZSAgLSBpbmRpY2F0ZXMgd2hldGhlciB3ZSBzaG91bGQgcmVxdWV1ZSBsZWZ0b3ZlcnMuCisgKgorICogTG9jayBzdGF0dXM6IEFzc3VtZWQgdGhhdCBsb2NrIGlzIG5vdCBoZWxkIHVwb24gZW50cnkuCisgKgorICogUmV0dXJuczogICAgIGNtZCBpZiByZXF1ZXVlIGRvbmUgb3IgcmVxdWlyZWQsIE5VTEwgb3RoZXJ3aXNlCisgKgorICogTm90ZXM6ICAgICAgIFRoaXMgaXMgY2FsbGVkIGZvciBibG9jayBkZXZpY2UgcmVxdWVzdHMgaW4gb3JkZXIgdG8KKyAqICAgICAgICAgICAgICBtYXJrIHNvbWUgbnVtYmVyIG9mIHNlY3RvcnMgYXMgY29tcGxldGUuCisgKiAKKyAqCQlXZSBhcmUgZ3VhcmFudGVlaW5nIHRoYXQgdGhlIHJlcXVlc3QgcXVldWUgd2lsbCBiZSBnb29zZWQKKyAqCQlhdCBzb21lIHBvaW50IGR1cmluZyB0aGlzIGNhbGwuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2VuZF9yZXF1ZXN0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgaW50IHVwdG9kYXRlLAorCQkJCQkgIGludCBieXRlcywgaW50IHJlcXVldWUpCit7CisJcmVxdWVzdF9xdWV1ZV90ICpxID0gY21kLT5kZXZpY2UtPnJlcXVlc3RfcXVldWU7CisJc3RydWN0IHJlcXVlc3QgKnJlcSA9IGNtZC0+cmVxdWVzdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgYmxvY2tzIGxlZnQgb3ZlciBhdCB0aGUgZW5kLCBzZXQgdXAgdGhlIGNvbW1hbmQKKwkgKiB0byBxdWV1ZSB0aGUgcmVtYWluZGVyIG9mIHRoZW0uCisJICovCisJaWYgKGVuZF90aGF0X3JlcXVlc3RfY2h1bmsocmVxLCB1cHRvZGF0ZSwgYnl0ZXMpKSB7CisJCWludCBsZWZ0b3ZlciA9IChyZXEtPmhhcmRfbnJfc2VjdG9ycyA8PCA5KTsKKworCQlpZiAoYmxrX3BjX3JlcXVlc3QocmVxKSkKKwkJCWxlZnRvdmVyID0gcmVxLT5kYXRhX2xlbjsKKworCQkvKiBraWxsIHJlbWFpbmRlciBpZiBubyByZXRyeXMgKi8KKwkJaWYgKCF1cHRvZGF0ZSAmJiBibGtfbm9yZXRyeV9yZXF1ZXN0KHJlcSkpCisJCQllbmRfdGhhdF9yZXF1ZXN0X2NodW5rKHJlcSwgMCwgbGVmdG92ZXIpOworCQllbHNlIHsKKwkJCWlmIChyZXF1ZXVlKQorCQkJCS8qCisJCQkJICogQmxlYWguICBMZWZ0b3ZlcnMgYWdhaW4uICBTdGljayB0aGUKKwkJCQkgKiBsZWZ0b3ZlcnMgaW4gdGhlIGZyb250IG9mIHRoZQorCQkJCSAqIHF1ZXVlLCBhbmQgZ29vc2UgdGhlIHF1ZXVlIGFnYWluLgorCQkJCSAqLworCQkJCXNjc2lfcmVxdWV1ZV9jb21tYW5kKHEsIGNtZCk7CisKKwkJCXJldHVybiBjbWQ7CisJCX0KKwl9CisKKwlhZGRfZGlza19yYW5kb21uZXNzKHJlcS0+cnFfZGlzayk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJaWYgKGJsa19ycV90YWdnZWQocmVxKSkKKwkJYmxrX3F1ZXVlX2VuZF90YWcocSwgcmVxKTsKKwllbmRfdGhhdF9yZXF1ZXN0X2xhc3QocmVxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogVGhpcyB3aWxsIGdvb3NlIHRoZSBxdWV1ZSByZXF1ZXN0IGZ1bmN0aW9uIGF0IHRoZSBlbmQsIHNvIHdlIGRvbid0CisJICogbmVlZCB0byB3b3JyeSBhYm91dCBsYXVuY2hpbmcgYW5vdGhlciBjb21tYW5kLgorCSAqLworCXNjc2lfbmV4dF9jb21tYW5kKGNtZCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNjc2lfYWxsb2Nfc2d0YWJsZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCBnZnBfbWFzaykKK3sKKwlzdHJ1Y3Qgc2NzaV9ob3N0X3NnX3Bvb2wgKnNncDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbDsKKworCUJVR19PTighY21kLT51c2Vfc2cpOworCisJc3dpdGNoIChjbWQtPnVzZV9zZykgeworCWNhc2UgMSAuLi4gODoKKwkJY21kLT5zZ2xpc3RfbGVuID0gMDsKKwkJYnJlYWs7CisJY2FzZSA5IC4uLiAxNjoKKwkJY21kLT5zZ2xpc3RfbGVuID0gMTsKKwkJYnJlYWs7CisJY2FzZSAxNyAuLi4gMzI6CisJCWNtZC0+c2dsaXN0X2xlbiA9IDI7CisJCWJyZWFrOworI2lmIChTQ1NJX01BWF9QSFlTX1NFR01FTlRTID4gMzIpCisJY2FzZSAzMyAuLi4gNjQ6CisJCWNtZC0+c2dsaXN0X2xlbiA9IDM7CisJCWJyZWFrOworI2lmIChTQ1NJX01BWF9QSFlTX1NFR01FTlRTID4gNjQpCisJY2FzZSA2NSAuLi4gMTI4OgorCQljbWQtPnNnbGlzdF9sZW4gPSA0OworCQlicmVhazsKKyNpZiAoU0NTSV9NQVhfUEhZU19TRUdNRU5UUyAgPiAxMjgpCisJY2FzZSAxMjkgLi4uIDI1NjoKKwkJY21kLT5zZ2xpc3RfbGVuID0gNTsKKwkJYnJlYWs7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2dwID0gc2NzaV9zZ19wb29scyArIGNtZC0+c2dsaXN0X2xlbjsKKwlzZ2wgPSBtZW1wb29sX2FsbG9jKHNncC0+cG9vbCwgZ2ZwX21hc2spOworCWlmIChzZ2wpCisJCW1lbXNldChzZ2wsIDAsIHNncC0+c2l6ZSk7CisJcmV0dXJuIHNnbDsKK30KKworc3RhdGljIHZvaWQgc2NzaV9mcmVlX3NndGFibGUoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3Qgc2NzaV9ob3N0X3NnX3Bvb2wgKnNncDsKKworCUJVR19PTihpbmRleCA+IFNHX01FTVBPT0xfTlIpOworCisJc2dwID0gc2NzaV9zZ19wb29scyArIGluZGV4OworCW1lbXBvb2xfZnJlZShzZ2wsIHNncC0+cG9vbCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogICAgc2NzaV9yZWxlYXNlX2J1ZmZlcnMoKQorICoKKyAqIFB1cnBvc2U6ICAgICBDb21wbGV0aW9uIHByb2Nlc3NpbmcgZm9yIGJsb2NrIGRldmljZSBJL08gcmVxdWVzdHMuCisgKgorICogQXJndW1lbnRzOiAgIGNtZAktIGNvbW1hbmQgdGhhdCB3ZSBhcmUgYmFpbGluZy4KKyAqCisgKiBMb2NrIHN0YXR1czogQXNzdW1lZCB0aGF0IG5vIGxvY2sgaXMgaGVsZCB1cG9uIGVudHJ5LgorICoKKyAqIFJldHVybnM6ICAgICBOb3RoaW5nCisgKgorICogTm90ZXM6ICAgICAgIEluIHRoZSBldmVudCB0aGF0IGFuIHVwcGVyIGxldmVsIGRyaXZlciByZWplY3RzIGEKKyAqCQljb21tYW5kLCB3ZSBtdXN0IHJlbGVhc2UgcmVzb3VyY2VzIGFsbG9jYXRlZCBkdXJpbmcKKyAqCQl0aGUgX19pbml0X2lvKCkgZnVuY3Rpb24uICBQcmltYXJpbHkgdGhpcyB3b3VsZCBpbnZvbHZlCisgKgkJdGhlIHNjYXR0ZXItZ2F0aGVyIHRhYmxlLCBhbmQgcG90ZW50aWFsbHkgYW55IGJvdW5jZQorICoJCWJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkIHNjc2lfcmVsZWFzZV9idWZmZXJzKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxID0gY21kLT5yZXF1ZXN0OworCisJLyoKKwkgKiBGcmVlIHVwIGFueSBpbmRpcmVjdGlvbiBidWZmZXJzIHdlIGFsbG9jYXRlZCBmb3IgRE1BIHB1cnBvc2VzLiAKKwkgKi8KKwlpZiAoY21kLT51c2Vfc2cpCisJCXNjc2lfZnJlZV9zZ3RhYmxlKGNtZC0+cmVxdWVzdF9idWZmZXIsIGNtZC0+c2dsaXN0X2xlbik7CisJZWxzZSBpZiAoY21kLT5yZXF1ZXN0X2J1ZmZlciAhPSByZXEtPmJ1ZmZlcikKKwkJa2ZyZWUoY21kLT5yZXF1ZXN0X2J1ZmZlcik7CisKKwkvKgorCSAqIFplcm8gdGhlc2Ugb3V0LiAgVGhleSBub3cgcG9pbnQgdG8gZnJlZWQgbWVtb3J5LCBhbmQgaXQgaXMKKwkgKiBkYW5nZXJvdXMgdG8gaGFuZyBvbnRvIHRoZSBwb2ludGVycy4KKwkgKi8KKwljbWQtPmJ1ZmZlciAgPSBOVUxMOworCWNtZC0+YnVmZmxlbiA9IDA7CisJY21kLT5yZXF1ZXN0X2J1ZmZlciA9IE5VTEw7CisJY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPSAwOworfQorCisvKgorICogRnVuY3Rpb246ICAgIHNjc2lfaW9fY29tcGxldGlvbigpCisgKgorICogUHVycG9zZTogICAgIENvbXBsZXRpb24gcHJvY2Vzc2luZyBmb3IgYmxvY2sgZGV2aWNlIEkvTyByZXF1ZXN0cy4KKyAqCisgKiBBcmd1bWVudHM6ICAgY21kICAgLSBjb21tYW5kIHRoYXQgaXMgZmluaXNoZWQuCisgKgorICogTG9jayBzdGF0dXM6IEFzc3VtZWQgdGhhdCBubyBsb2NrIGlzIGhlbGQgdXBvbiBlbnRyeS4KKyAqCisgKiBSZXR1cm5zOiAgICAgTm90aGluZworICoKKyAqIE5vdGVzOiAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG1hdGNoZWQgaW4gdGVybXMgb2YgY2FwYWJpbGl0aWVzIHRvCisgKiAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIHRoYXQgY3JlYXRlZCB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdC4KKyAqICAgICAgICAgICAgICBJbiBvdGhlciB3b3JkcywgaWYgdGhlcmUgYXJlIG5vIGJvdW5jZSBidWZmZXJzCisgKiAgICAgICAgICAgICAgKHRoZSBub3JtYWwgY2FzZSBmb3IgbW9zdCBkcml2ZXJzKSwgd2UgZG9uJ3QgbmVlZAorICogICAgICAgICAgICAgIHRoZSBsb2dpYyB0byBkZWFsIHdpdGggY2xlYW5pbmcgdXAgYWZ0ZXJ3YXJkcy4KKyAqCisgKgkJV2UgbXVzdCBkbyBvbmUgb2Ygc2V2ZXJhbCB0aGluZ3MgaGVyZToKKyAqCisgKgkJYSkgQ2FsbCBzY3NpX2VuZF9yZXF1ZXN0LiAgVGhpcyB3aWxsIGZpbmlzaCBvZmYgdGhlCisgKgkJICAgc3BlY2lmaWVkIG51bWJlciBvZiBzZWN0b3JzLiAgSWYgd2UgYXJlIGRvbmUsIHRoZQorICoJCSAgIGNvbW1hbmQgYmxvY2sgd2lsbCBiZSByZWxlYXNlZCwgYW5kIHRoZSBxdWV1ZQorICoJCSAgIGZ1bmN0aW9uIHdpbGwgYmUgZ29vc2VkLiAgSWYgd2UgYXJlIG5vdCBkb25lLCB0aGVuCisgKgkJICAgc2NzaV9lbmRfcmVxdWVzdCB3aWxsIGRpcmVjdGx5IGdvb3NlIHRoZSBxdWV1ZS4KKyAqCisgKgkJYikgV2UgY2FuIGp1c3QgdXNlIHNjc2lfcmVxdWV1ZV9jb21tYW5kKCkgaGVyZS4gIFRoaXMgd291bGQKKyAqCQkgICBiZSB1c2VkIGlmIHdlIGp1c3Qgd2FudGVkIHRvIHJldHJ5LCBmb3IgZXhhbXBsZS4KKyAqLwordm9pZCBzY3NpX2lvX2NvbXBsZXRpb24oc3RydWN0IHNjc2lfY21uZCAqY21kLCB1bnNpZ25lZCBpbnQgZ29vZF9ieXRlcywKKwkJCXVuc2lnbmVkIGludCBibG9ja19ieXRlcykKK3sKKwlpbnQgcmVzdWx0ID0gY21kLT5yZXN1bHQ7CisJaW50IHRoaXNfY291bnQgPSBjbWQtPmJ1ZmZsZW47CisJcmVxdWVzdF9xdWV1ZV90ICpxID0gY21kLT5kZXZpY2UtPnJlcXVlc3RfcXVldWU7CisJc3RydWN0IHJlcXVlc3QgKnJlcSA9IGNtZC0+cmVxdWVzdDsKKwlpbnQgY2xlYXJfZXJyb3JzID0gMTsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CisJaW50IHNlbnNlX3ZhbGlkID0gMDsKKwlpbnQgc2Vuc2VfZGVmZXJyZWQgPSAwOworCisJaWYgKGJsa19jb21wbGV0ZV9iYXJyaWVyX3JxKHEsIHJlcSwgZ29vZF9ieXRlcyA+PiA5KSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBGcmVlIHVwIGFueSBpbmRpcmVjdGlvbiBidWZmZXJzIHdlIGFsbG9jYXRlZCBmb3IgRE1BIHB1cnBvc2VzLiAKKwkgKiBGb3IgdGhlIGNhc2Ugb2YgYSBSRUFELCB3ZSBuZWVkIHRvIGNvcHkgdGhlIGRhdGEgb3V0IG9mIHRoZQorCSAqIGJvdW5jZSBidWZmZXIgYW5kIGludG8gdGhlIHJlYWwgYnVmZmVyLgorCSAqLworCWlmIChjbWQtPnVzZV9zZykKKwkJc2NzaV9mcmVlX3NndGFibGUoY21kLT5idWZmZXIsIGNtZC0+c2dsaXN0X2xlbik7CisJZWxzZSBpZiAoY21kLT5idWZmZXIgIT0gcmVxLT5idWZmZXIpIHsKKwkJaWYgKHJxX2RhdGFfZGlyKHJlcSkgPT0gUkVBRCkgeworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCWNoYXIgKnRvID0gYmlvX2ttYXBfaXJxKHJlcS0+YmlvLCAmZmxhZ3MpOworCQkJbWVtY3B5KHRvLCBjbWQtPmJ1ZmZlciwgY21kLT5idWZmbGVuKTsKKwkJCWJpb19rdW5tYXBfaXJxKHRvLCAmZmxhZ3MpOworCQl9CisJCWtmcmVlKGNtZC0+YnVmZmVyKTsKKwl9CisKKwlpZiAocmVzdWx0KSB7CisJCXNlbnNlX3ZhbGlkID0gc2NzaV9jb21tYW5kX25vcm1hbGl6ZV9zZW5zZShjbWQsICZzc2hkcik7CisJCWlmIChzZW5zZV92YWxpZCkKKwkJCXNlbnNlX2RlZmVycmVkID0gc2NzaV9zZW5zZV9pc19kZWZlcnJlZCgmc3NoZHIpOworCX0KKwlpZiAoYmxrX3BjX3JlcXVlc3QocmVxKSkgeyAvKiBTR19JTyBpb2N0bCBmcm9tIGJsb2NrIGxldmVsICovCisJCXJlcS0+ZXJyb3JzID0gcmVzdWx0OworCQlpZiAocmVzdWx0KSB7CisJCQljbGVhcl9lcnJvcnMgPSAwOworCQkJaWYgKHNlbnNlX3ZhbGlkICYmIHJlcS0+c2Vuc2UpIHsKKwkJCQkvKgorCQkJCSAqIFNHX0lPIHdhbnRzIGN1cnJlbnQgYW5kIGRlZmVycmVkIGVycm9ycworCQkJCSAqLworCQkJCWludCBsZW4gPSA4ICsgY21kLT5zZW5zZV9idWZmZXJbN107CisKKwkJCQlpZiAobGVuID4gU0NTSV9TRU5TRV9CVUZGRVJTSVpFKQorCQkJCQlsZW4gPSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkU7CisJCQkJbWVtY3B5KHJlcS0+c2Vuc2UsIGNtZC0+c2Vuc2VfYnVmZmVyLCAgbGVuKTsKKwkJCQlyZXEtPnNlbnNlX2xlbiA9IGxlbjsKKwkJCX0KKwkJfSBlbHNlCisJCQlyZXEtPmRhdGFfbGVuID0gY21kLT5yZXNpZDsKKwl9CisKKwkvKgorCSAqIFplcm8gdGhlc2Ugb3V0LiAgVGhleSBub3cgcG9pbnQgdG8gZnJlZWQgbWVtb3J5LCBhbmQgaXQgaXMKKwkgKiBkYW5nZXJvdXMgdG8gaGFuZyBvbnRvIHRoZSBwb2ludGVycy4KKwkgKi8KKwljbWQtPmJ1ZmZlciAgPSBOVUxMOworCWNtZC0+YnVmZmxlbiA9IDA7CisJY21kLT5yZXF1ZXN0X2J1ZmZlciA9IE5VTEw7CisJY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPSAwOworCisJLyoKKwkgKiBOZXh0IGRlYWwgd2l0aCBhbnkgc2VjdG9ycyB3aGljaCB3ZSB3ZXJlIGFibGUgdG8gY29ycmVjdGx5CisJICogaGFuZGxlLgorCSAqLworCWlmIChnb29kX2J5dGVzID49IDApIHsKKwkJU0NTSV9MT0dfSExDT01QTEVURSgxLCBwcmludGsoIiVsZCBzZWN0b3JzIHRvdGFsLCAlZCBieXRlcyBkb25lLlxuIiwKKwkJCQkJICAgICAgcmVxLT5ucl9zZWN0b3JzLCBnb29kX2J5dGVzKSk7CisJCVNDU0lfTE9HX0hMQ09NUExFVEUoMSwgcHJpbnRrKCJ1c2Vfc2cgaXMgJWRcbiIsIGNtZC0+dXNlX3NnKSk7CisKKwkJaWYgKGNsZWFyX2Vycm9ycykKKwkJCXJlcS0+ZXJyb3JzID0gMDsKKwkJLyoKKwkJICogSWYgbXVsdGlwbGUgc2VjdG9ycyBhcmUgcmVxdWVzdGVkIGluIG9uZSBidWZmZXIsIHRoZW4KKwkJICogdGhleSB3aWxsIGhhdmUgYmVlbiBmaW5pc2hlZCBvZmYgYnkgdGhlIGZpcnN0IGNvbW1hbmQuCisJCSAqIElmIG5vdCwgdGhlbiB3ZSBoYXZlIGEgbXVsdGktYnVmZmVyIGNvbW1hbmQuCisJCSAqCisJCSAqIElmIGJsb2NrX2J5dGVzICE9IDAsIGl0IG1lYW5zIHdlIGhhZCBhIG1lZGl1bSBlcnJvcgorCQkgKiBvZiBzb21lIHNvcnQsIGFuZCB0aGF0IHdlIHdhbnQgdG8gbWFyayBzb21lIG51bWJlciBvZgorCQkgKiBzZWN0b3JzIGFzIG5vdCB1cHRvZGF0ZS4gIFRodXMgd2Ugd2FudCB0byBpbmhpYml0CisJCSAqIHJlcXVldWVpbmcgcmlnaHQgaGVyZSAtIHdlIHdpbGwgcmVxdWV1ZSBkb3duIGJlbG93CisJCSAqIHdoZW4gd2UgaGFuZGxlIHRoZSBiYWQgc2VjdG9ycy4KKwkJICovCisJCWNtZCA9IHNjc2lfZW5kX3JlcXVlc3QoY21kLCAxLCBnb29kX2J5dGVzLCByZXN1bHQgPT0gMCk7CisKKwkJLyoKKwkJICogSWYgdGhlIGNvbW1hbmQgY29tcGxldGVkIHdpdGhvdXQgZXJyb3IsIHRoZW4gZWl0aGVyIGZpbmlzaCBvZmYgdGhlCisJCSAqIHJlc3Qgb2YgdGhlIGNvbW1hbmQsIG9yIHN0YXJ0IGEgbmV3IG9uZS4KKwkJICovCisJCWlmIChyZXN1bHQgPT0gMCB8fCBjbWQgPT0gTlVMTCApIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkvKgorCSAqIE5vdywgaWYgd2Ugd2VyZSBnb29kIGxpdHRsZSBib3lzIGFuZCBnaXJscywgU2FudGEgbGVmdCB1cyBhIHJlcXVlc3QKKwkgKiBzZW5zZSBidWZmZXIuICBXZSBjYW4gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIHRoaXMsIHNvIHdlCisJICogY2FuIGNob29zZSBhIGJsb2NrIHRvIHJlbWFwLCBldGMuCisJICovCisJaWYgKHNlbnNlX3ZhbGlkICYmICFzZW5zZV9kZWZlcnJlZCkgeworCQlzd2l0Y2ggKHNzaGRyLnNlbnNlX2tleSkgeworCQljYXNlIFVOSVRfQVRURU5USU9OOgorCQkJaWYgKGNtZC0+ZGV2aWNlLT5yZW1vdmFibGUpIHsKKwkJCQkvKiBkZXRlY3RlZCBkaXNjIGNoYW5nZS4gIHNldCBhIGJpdCAKKwkJCQkgKiBhbmQgcXVpZXRseSByZWZ1c2UgZnVydGhlciBhY2Nlc3MuCisJCQkJICovCisJCQkJY21kLT5kZXZpY2UtPmNoYW5nZWQgPSAxOworCQkJCWNtZCA9IHNjc2lfZW5kX3JlcXVlc3QoY21kLCAwLAorCQkJCQkJdGhpc19jb3VudCwgMSk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSogTXVzdCBoYXZlIGJlZW4gYSBwb3dlciBnbGl0Y2gsIG9yIGEKKwkJCQkqIGJ1cyByZXNldC4gIENvdWxkIG5vdCBoYXZlIGJlZW4gYQorCQkJCSogbWVkaWEgY2hhbmdlLCBzbyB3ZSBqdXN0IHJldHJ5IHRoZQorCQkJCSogcmVxdWVzdCBhbmQgc2VlIHdoYXQgaGFwcGVucy4gIAorCQkJCSovCisJCQkJc2NzaV9yZXF1ZXVlX2NvbW1hbmQocSwgY21kKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBJTExFR0FMX1JFUVVFU1Q6CisJCQkvKgorCQkgCSogSWYgd2UgaGFkIGFuIElMTEVHQUwgUkVRVUVTVCByZXR1cm5lZCwgdGhlbiB3ZSBtYXkKKwkJIAkqIGhhdmUgcGVyZm9ybWVkIGFuIHVuc3VwcG9ydGVkIGNvbW1hbmQuICBUaGUgb25seQorCQkgCSogdGhpbmcgdGhpcyBzaG91bGQgYmUgd291bGQgYmUgYSB0ZW4gYnl0ZSByZWFkIHdoZXJlCisJCQkqIG9ubHkgYSBzaXggYnl0ZSByZWFkIHdhcyBzdXBwb3J0ZWQuICBBbHNvLCBvbiBhCisJCQkqIHN5c3RlbSB3aGVyZSBSRUFEIENBUEFDSVRZIGZhaWxlZCwgd2UgbWF5IGhhdmUgcmVhZAorCQkJKiBwYXN0IHRoZSBlbmQgb2YgdGhlIGRpc2suCisJCSAJKi8KKwkJCWlmIChjbWQtPmRldmljZS0+dXNlXzEwX2Zvcl9ydyAmJgorCQkJICAgIChjbWQtPmNtbmRbMF0gPT0gUkVBRF8xMCB8fAorCQkJICAgICBjbWQtPmNtbmRbMF0gPT0gV1JJVEVfMTApKSB7CisJCQkJY21kLT5kZXZpY2UtPnVzZV8xMF9mb3JfcncgPSAwOworCQkJCS8qCisJCQkJICogVGhpcyB3aWxsIGNhdXNlIGEgcmV0cnkgd2l0aCBhIDYtYnl0ZQorCQkJCSAqIGNvbW1hbmQuCisJCQkJICovCisJCQkJc2NzaV9yZXF1ZXVlX2NvbW1hbmQocSwgY21kKTsKKwkJCQlyZXN1bHQgPSAwOworCQkJfSBlbHNlIHsKKwkJCQljbWQgPSBzY3NpX2VuZF9yZXF1ZXN0KGNtZCwgMCwgdGhpc19jb3VudCwgMSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTk9UX1JFQURZOgorCQkJLyoKKwkJCSAqIElmIHRoZSBkZXZpY2UgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVjb21pbmcgcmVhZHksCisJCQkgKiByZXRyeS4KKwkJCSAqLworCQkJaWYgKHNzaGRyLmFzYyA9PSAweDA0ICYmIHNzaGRyLmFzY3EgPT0gMHgwMSkgeworCQkJCXNjc2lfcmVxdWV1ZV9jb21tYW5kKHEsIGNtZCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiRGV2aWNlICVzIG5vdCByZWFkeS5cbiIsCisJCQkgICAgICAgcmVxLT5ycV9kaXNrID8gcmVxLT5ycV9kaXNrLT5kaXNrX25hbWUgOiAiIik7CisJCQljbWQgPSBzY3NpX2VuZF9yZXF1ZXN0KGNtZCwgMCwgdGhpc19jb3VudCwgMSk7CisJCQlyZXR1cm47CisJCWNhc2UgVk9MVU1FX09WRVJGTE9XOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiVm9sdW1lIG92ZXJmbG93IDwlZCAlZCAlZCAlZD4gQ0RCOiAiLAorCQkJICAgICAgIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLAorCQkJICAgICAgIChpbnQpY21kLT5kZXZpY2UtPmNoYW5uZWwsCisJCQkgICAgICAgKGludCljbWQtPmRldmljZS0+aWQsIChpbnQpY21kLT5kZXZpY2UtPmx1bik7CisJCQlfX3Njc2lfcHJpbnRfY29tbWFuZChjbWQtPmRhdGFfY21uZCk7CisJCQlzY3NpX3ByaW50X3NlbnNlKCIiLCBjbWQpOworCQkJY21kID0gc2NzaV9lbmRfcmVxdWVzdChjbWQsIDAsIGJsb2NrX2J5dGVzLCAxKTsKKwkJCXJldHVybjsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQkJCS8qIGRyaXZlciBieXRlICE9IDAgKi8KKwlpZiAoaG9zdF9ieXRlKHJlc3VsdCkgPT0gRElEX1JFU0VUKSB7CisJCS8qCisJCSAqIFRoaXJkIHBhcnR5IGJ1cyByZXNldCBvciByZXNldCBmb3IgZXJyb3IKKwkJICogcmVjb3ZlcnkgcmVhc29ucy4gIEp1c3QgcmV0cnkgdGhlIHJlcXVlc3QKKwkJICogYW5kIHNlZSB3aGF0IGhhcHBlbnMuICAKKwkJICovCisJCXNjc2lfcmVxdWV1ZV9jb21tYW5kKHEsIGNtZCk7CisJCXJldHVybjsKKwl9CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9JTkZPICJTQ1NJIGVycm9yIDogPCVkICVkICVkICVkPiByZXR1cm4gY29kZSAiCisJCSAgICAgICAiPSAweCV4XG4iLCBjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9ubywKKwkJICAgICAgIGNtZC0+ZGV2aWNlLT5jaGFubmVsLAorCQkgICAgICAgY21kLT5kZXZpY2UtPmlkLAorCQkgICAgICAgY21kLT5kZXZpY2UtPmx1biwgcmVzdWx0KTsKKworCQlpZiAoZHJpdmVyX2J5dGUocmVzdWx0KSAmIERSSVZFUl9TRU5TRSkKKwkJCXNjc2lfcHJpbnRfc2Vuc2UoIiIsIGNtZCk7CisJCS8qCisJCSAqIE1hcmsgYSBzaW5nbGUgYnVmZmVyIGFzIG5vdCB1cHRvZGF0ZS4gIFF1ZXVlIHRoZSByZW1haW5kZXIuCisJCSAqIFdlIHNvbWV0aW1lcyBnZXQgdGhpcyBjcnVmdCBpbiB0aGUgZXZlbnQgdGhhdCBhIG1lZGl1bSBlcnJvcgorCQkgKiBpc24ndCBwcm9wZXJseSByZXBvcnRlZC4KKwkJICovCisJCWJsb2NrX2J5dGVzID0gcmVxLT5oYXJkX2N1cl9zZWN0b3JzIDw8IDk7CisJCWlmICghYmxvY2tfYnl0ZXMpCisJCQlibG9ja19ieXRlcyA9IHJlcS0+ZGF0YV9sZW47CisJCWNtZCA9IHNjc2lfZW5kX3JlcXVlc3QoY21kLCAwLCBibG9ja19ieXRlcywgMSk7CisJfQorfQorRVhQT1JUX1NZTUJPTChzY3NpX2lvX2NvbXBsZXRpb24pOworCisvKgorICogRnVuY3Rpb246ICAgIHNjc2lfaW5pdF9pbygpCisgKgorICogUHVycG9zZTogICAgIFNDU0kgSS9PIGluaXRpYWxpemUgZnVuY3Rpb24uCisgKgorICogQXJndW1lbnRzOiAgIGNtZCAgIC0gQ29tbWFuZCBkZXNjcmlwdG9yIHdlIHdpc2ggdG8gaW5pdGlhbGl6ZQorICoKKyAqIFJldHVybnM6ICAgICAwIG9uIHN1Y2Nlc3MKKyAqCQlCTEtQUkVQX0RFRkVSIGlmIHRoZSBmYWlsdXJlIGlzIHJldHJ5YWJsZQorICoJCUJMS1BSRVBfS0lMTCBpZiB0aGUgZmFpbHVyZSBpcyBmYXRhbAorICovCitzdGF0aWMgaW50IHNjc2lfaW5pdF9pbyhzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IHJlcXVlc3QgICAgICpyZXEgPSBjbWQtPnJlcXVlc3Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ3BudDsKKwlpbnQJCSAgIGNvdW50OworCisJLyoKKwkgKiBpZiB0aGlzIGlzIGEgcnEtPmRhdGEgYmFzZWQgUkVRX0JMT0NLX1BDLCBzZXR1cCBmb3IgYSBub24tc2cgeGZlcgorCSAqLworCWlmICgocmVxLT5mbGFncyAmIFJFUV9CTE9DS19QQykgJiYgIXJlcS0+YmlvKSB7CisJCWNtZC0+cmVxdWVzdF9idWZmbGVuID0gcmVxLT5kYXRhX2xlbjsKKwkJY21kLT5yZXF1ZXN0X2J1ZmZlciA9IHJlcS0+ZGF0YTsKKwkJcmVxLT5idWZmZXIgPSByZXEtPmRhdGE7CisJCWNtZC0+dXNlX3NnID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiB3ZSB1c2VkIHRvIG5vdCB1c2Ugc2NhdHRlci1nYXRoZXIgZm9yIHNpbmdsZSBzZWdtZW50IHJlcXVlc3QsCisJICogYnV0IG5vdyB3ZSBkbyAoaXQgbWFrZXMgaGlnaG1lbSBJL08gZWFzaWVyIHRvIHN1cHBvcnQgd2l0aG91dAorCSAqIGttYXBwaW5nIHBhZ2VzKQorCSAqLworCWNtZC0+dXNlX3NnID0gcmVxLT5ucl9waHlzX3NlZ21lbnRzOworCisJLyoKKwkgKiBpZiBzZyB0YWJsZSBhbGxvY2F0aW9uIGZhaWxzLCByZXF1ZXVlIHJlcXVlc3QgbGF0ZXIuCisJICovCisJc2dwbnQgPSBzY3NpX2FsbG9jX3NndGFibGUoY21kLCBHRlBfQVRPTUlDKTsKKwlpZiAodW5saWtlbHkoIXNncG50KSkgeworCQlyZXEtPmZsYWdzIHw9IFJFUV9TUEVDSUFMOworCQlyZXR1cm4gQkxLUFJFUF9ERUZFUjsKKwl9CisKKwljbWQtPnJlcXVlc3RfYnVmZmVyID0gKGNoYXIgKikgc2dwbnQ7CisJY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPSByZXEtPm5yX3NlY3RvcnMgPDwgOTsKKwlpZiAoYmxrX3BjX3JlcXVlc3QocmVxKSkKKwkJY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPSByZXEtPmRhdGFfbGVuOworCXJlcS0+YnVmZmVyID0gTlVMTDsKKworCS8qIAorCSAqIE5leHQsIHdhbGsgdGhlIGxpc3QsIGFuZCBmaWxsIGluIHRoZSBhZGRyZXNzZXMgYW5kIHNpemVzIG9mCisJICogZWFjaCBzZWdtZW50LgorCSAqLworCWNvdW50ID0gYmxrX3JxX21hcF9zZyhyZXEtPnEsIHJlcSwgY21kLT5yZXF1ZXN0X2J1ZmZlcik7CisKKwkvKgorCSAqIG1hcHBlZCB3ZWxsLCBzZW5kIGl0IG9mZgorCSAqLworCWlmIChsaWtlbHkoY291bnQgPD0gY21kLT51c2Vfc2cpKSB7CisJCWNtZC0+dXNlX3NnID0gY291bnQ7CisJCXJldHVybiAwOworCX0KKworCXByaW50ayhLRVJOX0VSUiAiSW5jb3JyZWN0IG51bWJlciBvZiBzZWdtZW50cyBhZnRlciBidWlsZGluZyBsaXN0XG4iKTsKKwlwcmludGsoS0VSTl9FUlIgImNvdW50ZWQgJWQsIHJlY2VpdmVkICVkXG4iLCBjb3VudCwgY21kLT51c2Vfc2cpOworCXByaW50ayhLRVJOX0VSUiAicmVxIG5yX3NlYyAlbHUsIGN1cl9ucl9zZWMgJXVcbiIsIHJlcS0+bnJfc2VjdG9ycywKKwkJCXJlcS0+Y3VycmVudF9ucl9zZWN0b3JzKTsKKworCS8qIHJlbGVhc2UgdGhlIGNvbW1hbmQgYW5kIGtpbGwgaXQgKi8KKwlzY3NpX3JlbGVhc2VfYnVmZmVycyhjbWQpOworCXNjc2lfcHV0X2NvbW1hbmQoY21kKTsKKwlyZXR1cm4gQkxLUFJFUF9LSUxMOworfQorCitzdGF0aWMgaW50IHNjc2lfcHJlcGFyZV9mbHVzaF9mbihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBxLT5xdWV1ZWRhdGE7CisJc3RydWN0IHNjc2lfZHJpdmVyICpkcnY7CisKKwlpZiAoc2Rldi0+c2Rldl9zdGF0ZSA9PSBTREVWX1JVTk5JTkcpIHsKKwkJZHJ2ID0gKihzdHJ1Y3Qgc2NzaV9kcml2ZXIgKiopIHJxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CisKKwkJaWYgKGRydi0+cHJlcGFyZV9mbHVzaCkKKwkJCXJldHVybiBkcnYtPnByZXBhcmVfZmx1c2gocSwgcnEpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzY3NpX2VuZF9mbHVzaF9mbihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBxLT5xdWV1ZWRhdGE7CisJc3RydWN0IHJlcXVlc3QgKmZsdXNoX3JxID0gcnEtPmVuZF9pb19kYXRhOworCXN0cnVjdCBzY3NpX2RyaXZlciAqZHJ2OworCisJaWYgKGZsdXNoX3JxLT5lcnJvcnMpIHsKKwkJcHJpbnRrKCJzY3NpOiBiYXJyaWVyIGVycm9yLCBkaXNhYmxpbmcgZmx1c2ggc3VwcG9ydFxuIik7CisJCWJsa19xdWV1ZV9vcmRlcmVkKHEsIFFVRVVFX09SREVSRURfTk9ORSk7CisJfQorCisJaWYgKHNkZXYtPnNkZXZfc3RhdGUgPT0gU0RFVl9SVU5OSU5HKSB7CisJCWRydiA9ICooc3RydWN0IHNjc2lfZHJpdmVyICoqKSBycS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOworCQlkcnYtPmVuZF9mbHVzaChxLCBycSk7CisJfQorfQorCitzdGF0aWMgaW50IHNjc2lfaXNzdWVfZmx1c2hfZm4ocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgZ2VuZGlzayAqZGlzaywKKwkJCSAgICAgICBzZWN0b3JfdCAqZXJyb3Jfc2VjdG9yKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHEtPnF1ZXVlZGF0YTsKKwlzdHJ1Y3Qgc2NzaV9kcml2ZXIgKmRydjsKKworCWlmIChzZGV2LT5zZGV2X3N0YXRlICE9IFNERVZfUlVOTklORykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWRydiA9ICooc3RydWN0IHNjc2lfZHJpdmVyICoqKSBkaXNrLT5wcml2YXRlX2RhdGE7CisJaWYgKGRydi0+aXNzdWVfZmx1c2gpCisJCXJldHVybiBkcnYtPmlzc3VlX2ZsdXNoKCZzZGV2LT5zZGV2X2dlbmRldiwgZXJyb3Jfc2VjdG9yKTsKKworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGludCBzY3NpX3ByZXBfZm4oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gcS0+cXVldWVkYXRhOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwlpbnQgc3BlY2lhbHNfb25seSA9IDA7CisKKwkvKgorCSAqIEp1c3QgY2hlY2sgdG8gc2VlIGlmIHRoZSBkZXZpY2UgaXMgb25saW5lLiAgSWYgaXQgaXNuJ3QsIHdlCisJICogcmVmdXNlIHRvIHByb2Nlc3MgYW55IGNvbW1hbmRzLiAgVGhlIGRldmljZSBtdXN0IGJlIGJyb3VnaHQKKwkgKiBvbmxpbmUgYmVmb3JlIHRyeWluZyBhbnkgcmVjb3ZlcnkgY29tbWFuZHMKKwkgKi8KKwlpZiAodW5saWtlbHkoIXNjc2lfZGV2aWNlX29ubGluZShzZGV2KSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQgKCVkOiVkKTogcmVqZWN0aW5nIEkvTyB0byBvZmZsaW5lIGRldmljZVxuIiwKKwkJICAgICAgIHNkZXYtPmhvc3QtPmhvc3Rfbm8sIHNkZXYtPmlkLCBzZGV2LT5sdW4pOworCQlyZXR1cm4gQkxLUFJFUF9LSUxMOworCX0KKwlpZiAodW5saWtlbHkoc2Rldi0+c2Rldl9zdGF0ZSAhPSBTREVWX1JVTk5JTkcpKSB7CisJCS8qIE9LLCB3ZSdyZSBub3QgaW4gYSBydW5uaW5nIHN0YXRlIGRvbid0IHByZXAKKwkJICogdXNlciBjb21tYW5kcyAqLworCQlpZiAoc2Rldi0+c2Rldl9zdGF0ZSA9PSBTREVWX0RFTCkgeworCQkJLyogRGV2aWNlIGlzIGZ1bGx5IGRlbGV0ZWQsIG5vIGNvbW1hbmRzCisJCQkgKiBhdCBhbGwgYWxsb3dlZCBkb3duICovCisJCQlwcmludGsoS0VSTl9FUlIgInNjc2klZCAoJWQ6JWQpOiByZWplY3RpbmcgSS9PIHRvIGRlYWQgZGV2aWNlXG4iLAorCQkJICAgICAgIHNkZXYtPmhvc3QtPmhvc3Rfbm8sIHNkZXYtPmlkLCBzZGV2LT5sdW4pOworCQkJcmV0dXJuIEJMS1BSRVBfS0lMTDsKKwkJfQorCQkvKiBPSywgd2Ugb25seSBhbGxvdyBzcGVjaWFsIGNvbW1hbmRzIChpLmUuIG5vdAorCQkgKiB1c2VyIGluaXRpYXRlZCBvbmVzICovCisJCXNwZWNpYWxzX29ubHkgPSBzZGV2LT5zZGV2X3N0YXRlOworCX0KKworCS8qCisJICogRmluZCB0aGUgYWN0dWFsIGRldmljZSBkcml2ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tbWFuZC4KKwkgKiBUaGUgU1BFQ0lBTCByZXF1ZXN0cyBhcmUgdGhpbmdzIGxpa2UgY2hhcmFjdGVyIGRldmljZSBvcgorCSAqIGlvY3Rscywgd2hpY2ggZGlkIG5vdCBvcmlnaW5hdGUgZnJvbSBsbF9yd19ibGsuICBOb3RlIHRoYXQKKwkgKiB0aGUgc3BlY2lhbCBmaWVsZCBpcyBhbHNvIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGNtZCBmb3IKKwkgKiB0aGUgcmVtYWluZGVyIG9mIGEgcGFydGlhbGx5IGZ1bGZpbGxlZCByZXF1ZXN0IHRoYXQgY2FuIAorCSAqIGNvbWUgdXAgd2hlbiB0aGVyZSBpcyBhIG1lZGl1bSBlcnJvci4gIFdlIGhhdmUgdG8gdHJlYXQKKwkgKiB0aGVzZSB0d28gY2FzZXMgZGlmZmVyZW50bHkuICBXZSBkaWZmZXJlbnRpYXRlIGJ5IGxvb2tpbmcKKwkgKiBhdCByZXF1ZXN0LT5jbWQsIGFzIHRoaXMgdGVsbHMgdXMgdGhlIHJlYWwgc3RvcnkuCisJICovCisJaWYgKHJlcS0+ZmxhZ3MgJiBSRVFfU1BFQ0lBTCkgeworCQlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxID0gcmVxLT5zcGVjaWFsOworCisJCWlmIChzcmVxLT5zcl9tYWdpYyA9PSBTQ1NJX1JFUV9NQUdJQykgeworCQkJY21kID0gc2NzaV9nZXRfY29tbWFuZChzcmVxLT5zcl9kZXZpY2UsIEdGUF9BVE9NSUMpOworCQkJaWYgKHVubGlrZWx5KCFjbWQpKQorCQkJCWdvdG8gZGVmZXI7CisJCQlzY3NpX2luaXRfY21kX2Zyb21fcmVxKGNtZCwgc3JlcSk7CisJCX0gZWxzZQorCQkJY21kID0gcmVxLT5zcGVjaWFsOworCX0gZWxzZSBpZiAocmVxLT5mbGFncyAmIChSRVFfQ01EIHwgUkVRX0JMT0NLX1BDKSkgeworCisJCWlmKHVubGlrZWx5KHNwZWNpYWxzX29ubHkpKSB7CisJCQlpZihzcGVjaWFsc19vbmx5ID09IFNERVZfUVVJRVNDRSB8fAorCQkJCQlzcGVjaWFsc19vbmx5ID09IFNERVZfQkxPQ0spCisJCQkJcmV0dXJuIEJMS1BSRVBfREVGRVI7CisJCQkKKwkJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkICglZDolZCk6IHJlamVjdGluZyBJL08gdG8gZGV2aWNlIGJlaW5nIHJlbW92ZWRcbiIsCisJCQkgICAgICAgc2Rldi0+aG9zdC0+aG9zdF9ubywgc2Rldi0+aWQsIHNkZXYtPmx1bik7CisJCQlyZXR1cm4gQkxLUFJFUF9LSUxMOworCQl9CisJCQkKKwkJCQorCQkvKgorCQkgKiBOb3cgdHJ5IGFuZCBmaW5kIGEgY29tbWFuZCBibG9jayB0aGF0IHdlIGNhbiB1c2UuCisJCSAqLworCQlpZiAoIXJlcS0+c3BlY2lhbCkgeworCQkJY21kID0gc2NzaV9nZXRfY29tbWFuZChzZGV2LCBHRlBfQVRPTUlDKTsKKwkJCWlmICh1bmxpa2VseSghY21kKSkKKwkJCQlnb3RvIGRlZmVyOworCQl9IGVsc2UKKwkJCWNtZCA9IHJlcS0+c3BlY2lhbDsKKwkJCisJCS8qIHB1bGwgYSB0YWcgb3V0IG9mIHRoZSByZXF1ZXN0IGlmIHdlIGhhdmUgb25lICovCisJCWNtZC0+dGFnID0gcmVxLT50YWc7CisJfSBlbHNlIHsKKwkJYmxrX2R1bXBfcnFfZmxhZ3MocmVxLCAiU0NTSSBiYWQgcmVxIik7CisJCXJldHVybiBCTEtQUkVQX0tJTEw7CisJfQorCQorCS8qIG5vdGUgdGhlIG92ZXJsb2FkaW5nIG9mIHJlcS0+c3BlY2lhbC4gIFdoZW4gdGhlIHRhZworCSAqIGlzIGFjdGl2ZSBpdCBhbHdheXMgbWVhbnMgY21kLiAgSWYgdGhlIHRhZyBnb2VzCisJICogYmFjayBmb3IgcmUtcXVldWVpbmcsIGl0IG1heSBiZSByZXNldCAqLworCXJlcS0+c3BlY2lhbCA9IGNtZDsKKwljbWQtPnJlcXVlc3QgPSByZXE7CisJCisJLyoKKwkgKiBGSVhNRTogZHJvcCB0aGUgbG9jayBoZXJlIGJlY2F1c2UgdGhlIGZ1bmN0aW9ucyBiZWxvdworCSAqIGV4cGVjdCB0byBiZSBjYWxsZWQgd2l0aG91dCB0aGUgcXVldWUgbG9jayBoZWxkLiAgQWxzbywKKwkgKiBwcmV2aW91c2x5LCB3ZSBkZXF1ZXVlZCB0aGUgcmVxdWVzdCBiZWZvcmUgZHJvcHBpbmcgdGhlCisJICogbG9jay4gIFdlIGhvcGUgUkVRX1NUQVJURUQgcHJldmVudHMgYW55dGhpbmcgdW50b3dhcmQgZnJvbQorCSAqIGhhcHBlbmluZyBub3cuCisJICovCisJaWYgKHJlcS0+ZmxhZ3MgJiAoUkVRX0NNRCB8IFJFUV9CTE9DS19QQykpIHsKKwkJc3RydWN0IHNjc2lfZHJpdmVyICpkcnY7CisJCWludCByZXQ7CisKKwkJLyoKKwkJICogVGhpcyB3aWxsIGRvIGEgY291cGxlIG9mIHRoaW5nczoKKwkJICogIDEpIEZpbGwgaW4gdGhlIGFjdHVhbCBTQ1NJIGNvbW1hbmQuCisJCSAqICAyKSBGaWxsIGluIGFueSBvdGhlciB1cHBlci1sZXZlbCBzcGVjaWZpYyBmaWVsZHMKKwkJICogKHRpbWVvdXQpLgorCQkgKgorCQkgKiBJZiB0aGlzIHJldHVybnMgMCwgaXQgbWVhbnMgdGhhdCB0aGUgcmVxdWVzdCBmYWlsZWQKKwkJICogKHJlYWRpbmcgcGFzdCBlbmQgb2YgZGlzaywgcmVhZGluZyBvZmZsaW5lIGRldmljZSwKKwkJICogZXRjKS4gICBUaGlzIHdvbid0IGFjdHVhbGx5IHRhbGsgdG8gdGhlIGRldmljZSwgYnV0CisJCSAqIHNvbWUga2luZHMgb2YgY29uc2lzdGVuY3kgY2hlY2tpbmcgbWF5IGNhdXNlIHRoZQkKKwkJICogcmVxdWVzdCB0byBiZSByZWplY3RlZCBpbW1lZGlhdGVseS4KKwkJICovCisKKwkJLyogCisJCSAqIFRoaXMgc2V0cyB1cCB0aGUgc2NhdHRlci1nYXRoZXIgdGFibGUgKGFsbG9jYXRpbmcgaWYKKwkJICogcmVxdWlyZWQpLgorCQkgKi8KKwkJcmV0ID0gc2NzaV9pbml0X2lvKGNtZCk7CisJCWlmIChyZXQpCS8qIEJMS1BSRVBfS0lMTCByZXR1cm4gYWxzbyByZWxlYXNlcyB0aGUgY29tbWFuZCAqLworCQkJcmV0dXJuIHJldDsKKwkJCisJCS8qCisJCSAqIEluaXRpYWxpemUgdGhlIGFjdHVhbCBTQ1NJIGNvbW1hbmQgZm9yIHRoaXMgcmVxdWVzdC4KKwkJICovCisJCWRydiA9ICooc3RydWN0IHNjc2lfZHJpdmVyICoqKXJlcS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOworCQlpZiAodW5saWtlbHkoIWRydi0+aW5pdF9jb21tYW5kKGNtZCkpKSB7CisJCQlzY3NpX3JlbGVhc2VfYnVmZmVycyhjbWQpOworCQkJc2NzaV9wdXRfY29tbWFuZChjbWQpOworCQkJcmV0dXJuIEJMS1BSRVBfS0lMTDsKKwkJfQorCX0KKworCS8qCisJICogVGhlIHJlcXVlc3QgaXMgbm93IHByZXBwZWQsIG5vIG5lZWQgdG8gY29tZSBiYWNrIGhlcmUKKwkgKi8KKwlyZXEtPmZsYWdzIHw9IFJFUV9ET05UUFJFUDsKKwlyZXR1cm4gQkxLUFJFUF9PSzsKKworIGRlZmVyOgorCS8qIElmIHdlIGRlZmVyLCB0aGUgZWx2X25leHRfcmVxdWVzdCgpIHJldHVybnMgTlVMTCwgYnV0IHRoZQorCSAqIHF1ZXVlIG11c3QgYmUgcmVzdGFydGVkLCBzbyB3ZSBwbHVnIGhlcmUgaWYgbm8gcmV0dXJuaW5nCisJICogY29tbWFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgZG8gdGhhdC4gKi8KKwlpZiAoc2Rldi0+ZGV2aWNlX2J1c3kgPT0gMCkKKwkJYmxrX3BsdWdfZGV2aWNlKHEpOworCXJldHVybiBCTEtQUkVQX0RFRkVSOworfQorCisvKgorICogc2NzaV9kZXZfcXVldWVfcmVhZHk6IGlmIHdlIGNhbiBzZW5kIHJlcXVlc3RzIHRvIHNkZXYsIHJldHVybiAxIGVsc2UKKyAqIHJldHVybiAwLgorICoKKyAqIENhbGxlZCB3aXRoIHRoZSBxdWV1ZV9sb2NrIGhlbGQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNjc2lfZGV2X3F1ZXVlX3JlYWR5KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAorCQkJCSAgc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCWlmIChzZGV2LT5kZXZpY2VfYnVzeSA+PSBzZGV2LT5xdWV1ZV9kZXB0aCkKKwkJcmV0dXJuIDA7CisJaWYgKHNkZXYtPmRldmljZV9idXN5ID09IDAgJiYgc2Rldi0+ZGV2aWNlX2Jsb2NrZWQpIHsKKwkJLyoKKwkJICogdW5ibG9jayBhZnRlciBkZXZpY2VfYmxvY2tlZCBpdGVyYXRlcyB0byB6ZXJvCisJCSAqLworCQlpZiAoLS1zZGV2LT5kZXZpY2VfYmxvY2tlZCA9PSAwKSB7CisJCQlTQ1NJX0xPR19NTFFVRVVFKDMsCisJCQkJcHJpbnRrKCJzY3NpJWQgKCVkOiVkKSB1bmJsb2NraW5nIGRldmljZSBhdCIKKwkJCQkgICAgICAgIiB6ZXJvIGRlcHRoXG4iLCBzZGV2LT5ob3N0LT5ob3N0X25vLAorCQkJCSAgICAgICBzZGV2LT5pZCwgc2Rldi0+bHVuKSk7CisJCX0gZWxzZSB7CisJCQlibGtfcGx1Z19kZXZpY2UocSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAoc2Rldi0+ZGV2aWNlX2Jsb2NrZWQpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBzY3NpX2hvc3RfcXVldWVfcmVhZHk6IGlmIHdlIGNhbiBzZW5kIHJlcXVlc3RzIHRvIHNob3N0LCByZXR1cm4gMSBlbHNlCisgKiByZXR1cm4gMC4gV2UgbXVzdCBlbmQgdXAgcnVubmluZyB0aGUgcXVldWUgYWdhaW4gd2hlbmV2ZXIgMCBpcworICogcmV0dXJuZWQsIGVsc2UgSU8gY2FuIGhhbmcuCisgKgorICogQ2FsbGVkIHdpdGggaG9zdF9sb2NrIGhlbGQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNjc2lfaG9zdF9xdWV1ZV9yZWFkeShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKKwkJCQkgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJCQkgICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJaWYgKHRlc3RfYml0KFNIT1NUX1JFQ09WRVJZLCAmc2hvc3QtPnNob3N0X3N0YXRlKSkKKwkJcmV0dXJuIDA7CisJaWYgKHNob3N0LT5ob3N0X2J1c3kgPT0gMCAmJiBzaG9zdC0+aG9zdF9ibG9ja2VkKSB7CisJCS8qCisJCSAqIHVuYmxvY2sgYWZ0ZXIgaG9zdF9ibG9ja2VkIGl0ZXJhdGVzIHRvIHplcm8KKwkJICovCisJCWlmICgtLXNob3N0LT5ob3N0X2Jsb2NrZWQgPT0gMCkgeworCQkJU0NTSV9MT0dfTUxRVUVVRSgzLAorCQkJCXByaW50aygic2NzaSVkIHVuYmxvY2tpbmcgaG9zdCBhdCB6ZXJvIGRlcHRoXG4iLAorCQkJCQlzaG9zdC0+aG9zdF9ubykpOworCQl9IGVsc2UgeworCQkJYmxrX3BsdWdfZGV2aWNlKHEpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKChzaG9zdC0+Y2FuX3F1ZXVlID4gMCAmJiBzaG9zdC0+aG9zdF9idXN5ID49IHNob3N0LT5jYW5fcXVldWUpIHx8CisJICAgIHNob3N0LT5ob3N0X2Jsb2NrZWQgfHwgc2hvc3QtPmhvc3Rfc2VsZl9ibG9ja2VkKSB7CisJCWlmIChsaXN0X2VtcHR5KCZzZGV2LT5zdGFydmVkX2VudHJ5KSkKKwkJCWxpc3RfYWRkX3RhaWwoJnNkZXYtPnN0YXJ2ZWRfZW50cnksICZzaG9zdC0+c3RhcnZlZF9saXN0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogV2UncmUgT0sgdG8gcHJvY2VzcyB0aGUgY29tbWFuZCwgc28gd2UgY2FuJ3QgYmUgc3RhcnZlZCAqLworCWlmICghbGlzdF9lbXB0eSgmc2Rldi0+c3RhcnZlZF9lbnRyeSkpCisJCWxpc3RfZGVsX2luaXQoJnNkZXYtPnN0YXJ2ZWRfZW50cnkpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBLaWxsIHJlcXVlc3RzIGZvciBhIGRlYWQgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHNjc2lfa2lsbF9yZXF1ZXN0cyhyZXF1ZXN0X3F1ZXVlX3QgKnEpCit7CisJc3RydWN0IHJlcXVlc3QgKnJlcTsKKworCXdoaWxlICgocmVxID0gZWx2X25leHRfcmVxdWVzdChxKSkgIT0gTlVMTCkgeworCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJlcSk7CisJCXJlcS0+ZmxhZ3MgfD0gUkVRX1FVSUVUOworCQl3aGlsZSAoZW5kX3RoYXRfcmVxdWVzdF9maXJzdChyZXEsIDAsIHJlcS0+bnJfc2VjdG9ycykpCisJCQk7CisJCWVuZF90aGF0X3JlcXVlc3RfbGFzdChyZXEpOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uOiAgICBzY3NpX3JlcXVlc3RfZm4oKQorICoKKyAqIFB1cnBvc2U6ICAgICBNYWluIHN0cmF0ZWd5IHJvdXRpbmUgZm9yIFNDU0kuCisgKgorICogQXJndW1lbnRzOiAgIHEgICAgICAgLSBQb2ludGVyIHRvIGFjdHVhbCBxdWV1ZS4KKyAqCisgKiBSZXR1cm5zOiAgICAgTm90aGluZworICoKKyAqIExvY2sgc3RhdHVzOiBJTyByZXF1ZXN0IGxvY2sgYXNzdW1lZCB0byBiZSBoZWxkIHdoZW4gY2FsbGVkLgorICovCitzdGF0aWMgdm9pZCBzY3NpX3JlcXVlc3RfZm4oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gcS0+cXVldWVkYXRhOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxOworCisJaWYgKCFzZGV2KSB7CisJCXByaW50aygic2NzaToga2lsbGluZyByZXF1ZXN0cyBmb3IgZGVhZCBxdWV1ZVxuIik7CisJCXNjc2lfa2lsbF9yZXF1ZXN0cyhxKTsKKwkJcmV0dXJuOworCX0KKworCWlmKCFnZXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldikpCisJCS8qIFdlIG11c3QgYmUgdGVhcmluZyB0aGUgYmxvY2sgcXVldWUgZG93biBhbHJlYWR5ICovCisJCXJldHVybjsKKworCS8qCisJICogVG8gc3RhcnQgd2l0aCwgd2Uga2VlcCBsb29waW5nIHVudGlsIHRoZSBxdWV1ZSBpcyBlbXB0eSwgb3IgdW50aWwKKwkgKiB0aGUgaG9zdCBpcyBubyBsb25nZXIgYWJsZSB0byBhY2NlcHQgYW55IG1vcmUgcmVxdWVzdHMuCisJICovCisJc2hvc3QgPSBzZGV2LT5ob3N0OworCXdoaWxlICghYmxrX3F1ZXVlX3BsdWdnZWQocSkpIHsKKwkJaW50IHJ0bjsKKwkJLyoKKwkJICogZ2V0IG5leHQgcXVldWVhYmxlIHJlcXVlc3QuICBXZSBkbyB0aGlzIGVhcmx5IHRvIG1ha2Ugc3VyZQorCQkgKiB0aGF0IHRoZSByZXF1ZXN0IGlzIGZ1bGx5IHByZXBhcmVkIGV2ZW4gaWYgd2UgY2Fubm90IAorCQkgKiBhY2NlcHQgaXQuCisJCSAqLworCQlyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpOworCQlpZiAoIXJlcSB8fCAhc2NzaV9kZXZfcXVldWVfcmVhZHkocSwgc2RldikpCisJCQlicmVhazsKKworCQlpZiAodW5saWtlbHkoIXNjc2lfZGV2aWNlX29ubGluZShzZGV2KSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkICglZDolZCk6IHJlamVjdGluZyBJL08gdG8gb2ZmbGluZSBkZXZpY2VcbiIsCisJCQkgICAgICAgc2Rldi0+aG9zdC0+aG9zdF9ubywgc2Rldi0+aWQsIHNkZXYtPmx1bik7CisJCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJlcSk7CisJCQlyZXEtPmZsYWdzIHw9IFJFUV9RVUlFVDsKKwkJCXdoaWxlIChlbmRfdGhhdF9yZXF1ZXN0X2ZpcnN0KHJlcSwgMCwgcmVxLT5ucl9zZWN0b3JzKSkKKwkJCQk7CisJCQllbmRfdGhhdF9yZXF1ZXN0X2xhc3QocmVxKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKworCQkvKgorCQkgKiBSZW1vdmUgdGhlIHJlcXVlc3QgZnJvbSB0aGUgcmVxdWVzdCBsaXN0LgorCQkgKi8KKwkJaWYgKCEoYmxrX3F1ZXVlX3RhZ2dlZChxKSAmJiAhYmxrX3F1ZXVlX3N0YXJ0X3RhZyhxLCByZXEpKSkKKwkJCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocmVxKTsKKwkJc2Rldi0+ZGV2aWNlX2J1c3krKzsKKworCQlzcGluX3VubG9jayhxLT5xdWV1ZV9sb2NrKTsKKwkJc3Bpbl9sb2NrKHNob3N0LT5ob3N0X2xvY2spOworCisJCWlmICghc2NzaV9ob3N0X3F1ZXVlX3JlYWR5KHEsIHNob3N0LCBzZGV2KSkKKwkJCWdvdG8gbm90X3JlYWR5OworCQlpZiAoc2Rldi0+c2luZ2xlX2x1bikgeworCQkJaWYgKHNjc2lfdGFyZ2V0KHNkZXYpLT5zdGFyZ2V0X3NkZXZfdXNlciAmJgorCQkJICAgIHNjc2lfdGFyZ2V0KHNkZXYpLT5zdGFyZ2V0X3NkZXZfdXNlciAhPSBzZGV2KQorCQkJCWdvdG8gbm90X3JlYWR5OworCQkJc2NzaV90YXJnZXQoc2RldiktPnN0YXJnZXRfc2Rldl91c2VyID0gc2RldjsKKwkJfQorCQlzaG9zdC0+aG9zdF9idXN5Kys7CisKKwkJLyoKKwkJICogWFhYKGhjaCk6IFRoaXMgaXMgcmF0aGVyIHN1Ym9wdGltYWwsIHNjc2lfZGlzcGF0Y2hfY21kIHdpbGwKKwkJICoJCXRha2UgdGhlIGxvY2sgYWdhaW4uCisJCSAqLworCQlzcGluX3VubG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7CisKKwkJY21kID0gcmVxLT5zcGVjaWFsOworCQlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7CisJCQlwcmludGsoS0VSTl9DUklUICJpbXBvc3NpYmxlIHJlcXVlc3QgaW4gJXMuXG4iCisJCQkJCSAicGxlYXNlIG1haWwgYSBzdGFjayB0cmFjZSB0byAiCisJCQkJCSAibGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmciLAorCQkJCQkgX19GVU5DVElPTl9fKTsKKwkJCUJVRygpOworCQl9CisKKwkJLyoKKwkJICogRmluYWxseSwgaW5pdGlhbGl6ZSBhbnkgZXJyb3IgaGFuZGxpbmcgcGFyYW1ldGVycywgYW5kIHNldCB1cAorCQkgKiB0aGUgdGltZXJzIGZvciB0aW1lb3V0cy4KKwkJICovCisJCXNjc2lfaW5pdF9jbWRfZXJyaChjbWQpOworCisJCS8qCisJCSAqIERpc3BhdGNoIHRoZSBjb21tYW5kIHRvIHRoZSBsb3ctbGV2ZWwgZHJpdmVyLgorCQkgKi8KKwkJcnRuID0gc2NzaV9kaXNwYXRjaF9jbWQoY21kKTsKKwkJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKKwkJaWYocnRuKSB7CisJCQkvKiB3ZSdyZSByZWZ1c2luZyB0aGUgY29tbWFuZDsgYmVjYXVzZSBvZgorCQkJICogdGhlIHdheSBsb2NrcyBnZXQgZHJvcHBlZCwgd2UgbmVlZCB0byAKKwkJCSAqIGNoZWNrIGhlcmUgaWYgcGx1Z2dpbmcgaXMgcmVxdWlyZWQgKi8KKwkJCWlmKHNkZXYtPmRldmljZV9idXN5ID09IDApCisJCQkJYmxrX3BsdWdfZGV2aWNlKHEpOworCisJCQlicmVhazsKKwkJfQorCX0KKworCWdvdG8gb3V0OworCisgbm90X3JlYWR5OgorCXNwaW5fdW5sb2NrX2lycShzaG9zdC0+aG9zdF9sb2NrKTsKKworCS8qCisJICogbG9jayBxLCBoYW5kbGUgdGFnLCByZXF1ZXVlIHJlcSwgYW5kIGRlY3JlbWVudCBkZXZpY2VfYnVzeS4gV2UKKwkgKiBtdXN0IHJldHVybiB3aXRoIHF1ZXVlX2xvY2sgaGVsZC4KKwkgKgorCSAqIERlY3JlbWVudGluZyBkZXZpY2VfYnVzeSB3aXRob3V0IGNoZWNraW5nIGl0IGlzIE9LLCBhcyBhbGwgc3VjaAorCSAqIGNhc2VzIChob3N0IGxpbWl0cyBvciBzZXR0aW5ncykgc2hvdWxkIHJ1biB0aGUgcXVldWUgYXQgc29tZQorCSAqIGxhdGVyIHRpbWUuCisJICovCisJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKKwlibGtfcmVxdWV1ZV9yZXF1ZXN0KHEsIHJlcSk7CisJc2Rldi0+ZGV2aWNlX2J1c3ktLTsKKwlpZihzZGV2LT5kZXZpY2VfYnVzeSA9PSAwKQorCQlibGtfcGx1Z19kZXZpY2UocSk7Cisgb3V0OgorCS8qIG11c3QgYmUgY2FyZWZ1bCBoZXJlLi4uaWYgd2UgdHJpZ2dlciB0aGUgLT5yZW1vdmUoKSBmdW5jdGlvbgorCSAqIHdlIGNhbm5vdCBiZSBob2xkaW5nIHRoZSBxIGxvY2sgKi8KKwlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CisJcHV0X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7Cit9CisKK3U2NCBzY3NpX2NhbGN1bGF0ZV9ib3VuY2VfbGltaXQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IGRldmljZSAqaG9zdF9kZXY7CisJdTY0IGJvdW5jZV9saW1pdCA9IDB4ZmZmZmZmZmY7CisKKwlpZiAoc2hvc3QtPnVuY2hlY2tlZF9pc2FfZG1hKQorCQlyZXR1cm4gQkxLX0JPVU5DRV9JU0E7CisJLyoKKwkgKiBQbGF0Zm9ybXMgd2l0aCB2aXJ0dWFsLURNQSB0cmFuc2xhdGlvbgorCSAqIGhhcmR3YXJlIGhhdmUgbm8gcHJhY3RpY2FsIGxpbWl0LgorCSAqLworCWlmICghUENJX0RNQV9CVVNfSVNfUEhZUykKKwkJcmV0dXJuIEJMS19CT1VOQ0VfQU5ZOworCisJaG9zdF9kZXYgPSBzY3NpX2dldF9kZXZpY2Uoc2hvc3QpOworCWlmIChob3N0X2RldiAmJiBob3N0X2Rldi0+ZG1hX21hc2spCisJCWJvdW5jZV9saW1pdCA9ICpob3N0X2Rldi0+ZG1hX21hc2s7CisKKwlyZXR1cm4gYm91bmNlX2xpbWl0OworfQorRVhQT1JUX1NZTUJPTChzY3NpX2NhbGN1bGF0ZV9ib3VuY2VfbGltaXQpOworCitzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqc2NzaV9hbGxvY19xdWV1ZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBzZGV2LT5ob3N0OworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxOworCisJcSA9IGJsa19pbml0X3F1ZXVlKHNjc2lfcmVxdWVzdF9mbiwgJnNkZXYtPnNkZXZfbG9jayk7CisJaWYgKCFxKQorCQlyZXR1cm4gTlVMTDsKKworCWJsa19xdWV1ZV9wcmVwX3JxKHEsIHNjc2lfcHJlcF9mbik7CisKKwlibGtfcXVldWVfbWF4X2h3X3NlZ21lbnRzKHEsIHNob3N0LT5zZ190YWJsZXNpemUpOworCWJsa19xdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhxLCBTQ1NJX01BWF9QSFlTX1NFR01FTlRTKTsKKwlibGtfcXVldWVfbWF4X3NlY3RvcnMocSwgc2hvc3QtPm1heF9zZWN0b3JzKTsKKwlibGtfcXVldWVfYm91bmNlX2xpbWl0KHEsIHNjc2lfY2FsY3VsYXRlX2JvdW5jZV9saW1pdChzaG9zdCkpOworCWJsa19xdWV1ZV9zZWdtZW50X2JvdW5kYXJ5KHEsIHNob3N0LT5kbWFfYm91bmRhcnkpOworCWJsa19xdWV1ZV9pc3N1ZV9mbHVzaF9mbihxLCBzY3NpX2lzc3VlX2ZsdXNoX2ZuKTsKKworCS8qCisJICogb3JkZXJlZCB0YWdzIGFyZSBzdXBlcmlvciB0byBmbHVzaCBvcmRlcmluZworCSAqLworCWlmIChzaG9zdC0+b3JkZXJlZF90YWcpCisJCWJsa19xdWV1ZV9vcmRlcmVkKHEsIFFVRVVFX09SREVSRURfVEFHKTsKKwllbHNlIGlmIChzaG9zdC0+b3JkZXJlZF9mbHVzaCkgeworCQlibGtfcXVldWVfb3JkZXJlZChxLCBRVUVVRV9PUkRFUkVEX0ZMVVNIKTsKKwkJcS0+cHJlcGFyZV9mbHVzaF9mbiA9IHNjc2lfcHJlcGFyZV9mbHVzaF9mbjsKKwkJcS0+ZW5kX2ZsdXNoX2ZuID0gc2NzaV9lbmRfZmx1c2hfZm47CisJfQorCisJaWYgKCFzaG9zdC0+dXNlX2NsdXN0ZXJpbmcpCisJCWNsZWFyX2JpdChRVUVVRV9GTEFHX0NMVVNURVIsICZxLT5xdWV1ZV9mbGFncyk7CisJcmV0dXJuIHE7Cit9CisKK3ZvaWQgc2NzaV9mcmVlX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQoreworCWJsa19jbGVhbnVwX3F1ZXVlKHEpOworfQorCisvKgorICogRnVuY3Rpb246ICAgIHNjc2lfYmxvY2tfcmVxdWVzdHMoKQorICoKKyAqIFB1cnBvc2U6ICAgICBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgbG93LWxldmVsIGRyaXZlcnMgdG8gcHJldmVudCBmdXJ0aGVyCisgKgkJY29tbWFuZHMgZnJvbSBiZWluZyBxdWV1ZWQgdG8gdGhlIGRldmljZS4KKyAqCisgKiBBcmd1bWVudHM6ICAgc2hvc3QgICAgICAgLSBIb3N0IGluIHF1ZXN0aW9uCisgKgorICogUmV0dXJuczogICAgIE5vdGhpbmcKKyAqCisgKiBMb2NrIHN0YXR1czogTm8gbG9ja3MgYXJlIGFzc3VtZWQgaGVsZC4KKyAqCisgKiBOb3RlczogICAgICAgVGhlcmUgaXMgbm8gdGltZXIgbm9yIGFueSBvdGhlciBtZWFucyBieSB3aGljaCB0aGUgcmVxdWVzdHMKKyAqCQlnZXQgdW5ibG9ja2VkIG90aGVyIHRoYW4gdGhlIGxvdy1sZXZlbCBkcml2ZXIgY2FsbGluZworICoJCXNjc2lfdW5ibG9ja19yZXF1ZXN0cygpLgorICovCit2b2lkIHNjc2lfYmxvY2tfcmVxdWVzdHMoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc2hvc3QtPmhvc3Rfc2VsZl9ibG9ja2VkID0gMTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9ibG9ja19yZXF1ZXN0cyk7CisKKy8qCisgKiBGdW5jdGlvbjogICAgc2NzaV91bmJsb2NrX3JlcXVlc3RzKCkKKyAqCisgKiBQdXJwb3NlOiAgICAgVXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IGxvdy1sZXZlbCBkcml2ZXJzIHRvIGFsbG93IGZ1cnRoZXIKKyAqCQljb21tYW5kcyBmcm9tIGJlaW5nIHF1ZXVlZCB0byB0aGUgZGV2aWNlLgorICoKKyAqIEFyZ3VtZW50czogICBzaG9zdCAgICAgICAtIEhvc3QgaW4gcXVlc3Rpb24KKyAqCisgKiBSZXR1cm5zOiAgICAgTm90aGluZworICoKKyAqIExvY2sgc3RhdHVzOiBObyBsb2NrcyBhcmUgYXNzdW1lZCBoZWxkLgorICoKKyAqIE5vdGVzOiAgICAgICBUaGVyZSBpcyBubyB0aW1lciBub3IgYW55IG90aGVyIG1lYW5zIGJ5IHdoaWNoIHRoZSByZXF1ZXN0cworICoJCWdldCB1bmJsb2NrZWQgb3RoZXIgdGhhbiB0aGUgbG93LWxldmVsIGRyaXZlciBjYWxsaW5nCisgKgkJc2NzaV91bmJsb2NrX3JlcXVlc3RzKCkuCisgKgorICoJCVRoaXMgaXMgZG9uZSBhcyBhbiBBUEkgZnVuY3Rpb24gc28gdGhhdCBjaGFuZ2VzIHRvIHRoZQorICoJCWludGVybmFscyBvZiB0aGUgc2NzaSBtaWQtbGF5ZXIgd29uJ3QgcmVxdWlyZSB3aG9sZXNhbGUKKyAqCQljaGFuZ2VzIHRvIGRyaXZlcnMgdGhhdCB1c2UgdGhpcyBmZWF0dXJlLgorICovCit2b2lkIHNjc2lfdW5ibG9ja19yZXF1ZXN0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzaG9zdC0+aG9zdF9zZWxmX2Jsb2NrZWQgPSAwOworCXNjc2lfcnVuX2hvc3RfcXVldWVzKHNob3N0KTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV91bmJsb2NrX3JlcXVlc3RzKTsKKworaW50IF9faW5pdCBzY3NpX2luaXRfcXVldWUodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTR19NRU1QT09MX05SOyBpKyspIHsKKwkJc3RydWN0IHNjc2lfaG9zdF9zZ19wb29sICpzZ3AgPSBzY3NpX3NnX3Bvb2xzICsgaTsKKwkJaW50IHNpemUgPSBzZ3AtPnNpemUgKiBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KTsKKworCQlzZ3AtPnNsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZShzZ3AtPm5hbWUsIHNpemUsIDAsCisJCQkJU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMLCBOVUxMKTsKKwkJaWYgKCFzZ3AtPnNsYWIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiU0NTSTogY2FuJ3QgaW5pdCBzZyBzbGFiICVzXG4iLAorCQkJCQlzZ3AtPm5hbWUpOworCQl9CisKKwkJc2dwLT5wb29sID0gbWVtcG9vbF9jcmVhdGUoU0dfTUVNUE9PTF9TSVpFLAorCQkJCW1lbXBvb2xfYWxsb2Nfc2xhYiwgbWVtcG9vbF9mcmVlX3NsYWIsCisJCQkJc2dwLT5zbGFiKTsKKwkJaWYgKCFzZ3AtPnBvb2wpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiU0NTSTogY2FuJ3QgaW5pdCBzZyBtZW1wb29sICVzXG4iLAorCQkJCQlzZ3AtPm5hbWUpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2NzaV9leGl0X3F1ZXVlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0dfTUVNUE9PTF9OUjsgaSsrKSB7CisJCXN0cnVjdCBzY3NpX2hvc3Rfc2dfcG9vbCAqc2dwID0gc2NzaV9zZ19wb29scyArIGk7CisJCW1lbXBvb2xfZGVzdHJveShzZ3AtPnBvb2wpOworCQlrbWVtX2NhY2hlX2Rlc3Ryb3koc2dwLT5zbGFiKTsKKwl9Cit9CisvKioKKyAqCV9fc2NzaV9tb2RlX3NlbnNlIC0gaXNzdWUgYSBtb2RlIHNlbnNlLCBmYWxsaW5nIGJhY2sgZnJvbSAxMCB0byAKKyAqCQlzaXggYnl0ZXMgaWYgbmVjZXNzYXJ5LgorICoJQHNyZXE6CVNDU0kgcmVxdWVzdCB0byBmaWxsIGluIHdpdGggdGhlIE1PREVfU0VOU0UKKyAqCUBkYmQ6CXNldCBpZiBtb2RlIHNlbnNlIHdpbGwgYWxsb3cgYmxvY2sgZGVzY3JpcHRvcnMgdG8gYmUgcmV0dXJuZWQKKyAqCUBtb2RlcGFnZTogbW9kZSBwYWdlIGJlaW5nIHJlcXVlc3RlZAorICoJQGJ1ZmZlcjogcmVxdWVzdCBidWZmZXIgKG1heSBub3QgYmUgc21hbGxlciB0aGFuIGVpZ2h0IGJ5dGVzKQorICoJQGxlbjoJbGVuZ3RoIG9mIHJlcXVlc3QgYnVmZmVyLgorICoJQHRpbWVvdXQ6IGNvbW1hbmQgdGltZW91dAorICoJQHJldHJpZXM6IG51bWJlciBvZiByZXRyaWVzIGJlZm9yZSBmYWlsaW5nCisgKglAZGF0YTogcmV0dXJucyBhIHN0cnVjdHVyZSBhYnN0cmFjdGluZyB0aGUgbW9kZSBoZWFkZXIgZGF0YQorICoKKyAqCVJldHVybnMgemVybyBpZiB1bnN1Y2Nlc3NmdWwsIG9yIHRoZSBoZWFkZXIgb2Zmc2V0IChlaXRoZXIgNAorICoJb3IgOCBkZXBlbmRpbmcgb24gd2hldGhlciBhIHNpeCBvciB0ZW4gYnl0ZSBjb21tYW5kIHdhcworICoJaXNzdWVkKSBpZiBzdWNjZXNzZnVsLgorICoqLworaW50CitfX3Njc2lfbW9kZV9zZW5zZShzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxLCBpbnQgZGJkLCBpbnQgbW9kZXBhZ2UsCisJCSAgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgbGVuLCBpbnQgdGltZW91dCwgaW50IHJldHJpZXMsCisJCSAgc3RydWN0IHNjc2lfbW9kZV9kYXRhICpkYXRhKSB7CisJdW5zaWduZWQgY2hhciBjbWRbMTJdOworCWludCB1c2VfMTBfZm9yX21zOworCWludCBoZWFkZXJfbGVuZ3RoOworCisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZigqZGF0YSkpOworCW1lbXNldCgmY21kWzBdLCAwLCAxMik7CisJY21kWzFdID0gZGJkICYgMHgxODsJLyogYWxsb3dzIERCRCBhbmQgTExCQSBiaXRzICovCisJY21kWzJdID0gbW9kZXBhZ2U7CisKKyByZXRyeToKKwl1c2VfMTBfZm9yX21zID0gc3JlcS0+c3JfZGV2aWNlLT51c2VfMTBfZm9yX21zOworCisJaWYgKHVzZV8xMF9mb3JfbXMpIHsKKwkJaWYgKGxlbiA8IDgpCisJCQlsZW4gPSA4OworCisJCWNtZFswXSA9IE1PREVfU0VOU0VfMTA7CisJCWNtZFs4XSA9IGxlbjsKKwkJaGVhZGVyX2xlbmd0aCA9IDg7CisJfSBlbHNlIHsKKwkJaWYgKGxlbiA8IDQpCisJCQlsZW4gPSA0OworCisJCWNtZFswXSA9IE1PREVfU0VOU0U7CisJCWNtZFs0XSA9IGxlbjsKKwkJaGVhZGVyX2xlbmd0aCA9IDQ7CisJfQorCisJc3JlcS0+c3JfY21kX2xlbiA9IDA7CisJbWVtc2V0KHNyZXEtPnNyX3NlbnNlX2J1ZmZlciwgMCwgc2l6ZW9mKHNyZXEtPnNyX3NlbnNlX2J1ZmZlcikpOworCXNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCisJbWVtc2V0KGJ1ZmZlciwgMCwgbGVuKTsKKworCXNjc2lfd2FpdF9yZXEoc3JlcSwgY21kLCBidWZmZXIsIGxlbiwgdGltZW91dCwgcmV0cmllcyk7CisKKwkvKiBUaGlzIGNvZGUgbG9va3MgYXdmdWw6IHdoYXQgaXQncyBkb2luZyBpcyBtYWtpbmcgc3VyZSBhbgorCSAqIElMTEVHQUwgUkVRVUVTVCBzZW5zZSByZXR1cm4gaWRlbnRpZmllcyB0aGUgYWN0dWFsIGNvbW1hbmQKKwkgKiBieXRlIGFzIHRoZSBwcm9ibGVtLiAgTU9ERV9TRU5TRSBjb21tYW5kcyBjYW4gcmV0dXJuCisJICogSUxMRUdBTCBSRVFVRVNUIGlmIHRoZSBjb2RlIHBhZ2UgaXNuJ3Qgc3VwcG9ydGVkICovCisKKwlpZiAodXNlXzEwX2Zvcl9tcyAmJiAhc2NzaV9zdGF0dXNfaXNfZ29vZChzcmVxLT5zcl9yZXN1bHQpICYmCisJICAgIChkcml2ZXJfYnl0ZShzcmVxLT5zcl9yZXN1bHQpICYgRFJJVkVSX1NFTlNFKSkgeworCQlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CisKKwkJaWYgKHNjc2lfcmVxdWVzdF9ub3JtYWxpemVfc2Vuc2Uoc3JlcSwgJnNzaGRyKSkgeworCQkJaWYgKChzc2hkci5zZW5zZV9rZXkgPT0gSUxMRUdBTF9SRVFVRVNUKSAmJgorCQkJICAgIChzc2hkci5hc2MgPT0gMHgyMCkgJiYgKHNzaGRyLmFzY3EgPT0gMCkpIHsKKwkJCQkvKiAKKwkJCQkgKiBJbnZhbGlkIGNvbW1hbmQgb3BlcmF0aW9uIGNvZGUKKwkJCQkgKi8KKwkJCQlzcmVxLT5zcl9kZXZpY2UtPnVzZV8xMF9mb3JfbXMgPSAwOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCX0KKwl9CisKKwlpZihzY3NpX3N0YXR1c19pc19nb29kKHNyZXEtPnNyX3Jlc3VsdCkpIHsKKwkJZGF0YS0+aGVhZGVyX2xlbmd0aCA9IGhlYWRlcl9sZW5ndGg7CisJCWlmKHVzZV8xMF9mb3JfbXMpIHsKKwkJCWRhdGEtPmxlbmd0aCA9IGJ1ZmZlclswXSoyNTYgKyBidWZmZXJbMV0gKyAyOworCQkJZGF0YS0+bWVkaXVtX3R5cGUgPSBidWZmZXJbMl07CisJCQlkYXRhLT5kZXZpY2Vfc3BlY2lmaWMgPSBidWZmZXJbM107CisJCQlkYXRhLT5sb25nbGJhID0gYnVmZmVyWzRdICYgMHgwMTsKKwkJCWRhdGEtPmJsb2NrX2Rlc2NyaXB0b3JfbGVuZ3RoID0gYnVmZmVyWzZdKjI1NgorCQkJCSsgYnVmZmVyWzddOworCQl9IGVsc2UgeworCQkJZGF0YS0+bGVuZ3RoID0gYnVmZmVyWzBdICsgMTsKKwkJCWRhdGEtPm1lZGl1bV90eXBlID0gYnVmZmVyWzFdOworCQkJZGF0YS0+ZGV2aWNlX3NwZWNpZmljID0gYnVmZmVyWzJdOworCQkJZGF0YS0+YmxvY2tfZGVzY3JpcHRvcl9sZW5ndGggPSBidWZmZXJbM107CisJCX0KKwl9CisKKwlyZXR1cm4gc3JlcS0+c3JfcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTChfX3Njc2lfbW9kZV9zZW5zZSk7CisKKy8qKgorICoJc2NzaV9tb2RlX3NlbnNlIC0gaXNzdWUgYSBtb2RlIHNlbnNlLCBmYWxsaW5nIGJhY2sgZnJvbSAxMCB0byAKKyAqCQlzaXggYnl0ZXMgaWYgbmVjZXNzYXJ5LgorICoJQHNkZXY6CXNjc2kgZGV2aWNlIHRvIHNlbmQgY29tbWFuZCB0by4KKyAqCUBkYmQ6CXNldCBpZiBtb2RlIHNlbnNlIHdpbGwgZGlzYWJsZSBibG9jayBkZXNjcmlwdG9ycyBpbiB0aGUgcmV0dXJuCisgKglAbW9kZXBhZ2U6IG1vZGUgcGFnZSBiZWluZyByZXF1ZXN0ZWQKKyAqCUBidWZmZXI6IHJlcXVlc3QgYnVmZmVyIChtYXkgbm90IGJlIHNtYWxsZXIgdGhhbiBlaWdodCBieXRlcykKKyAqCUBsZW46CWxlbmd0aCBvZiByZXF1ZXN0IGJ1ZmZlci4KKyAqCUB0aW1lb3V0OiBjb21tYW5kIHRpbWVvdXQKKyAqCUByZXRyaWVzOiBudW1iZXIgb2YgcmV0cmllcyBiZWZvcmUgZmFpbGluZworICoKKyAqCVJldHVybnMgemVybyBpZiB1bnN1Y2Nlc3NmdWwsIG9yIHRoZSBoZWFkZXIgb2Zmc2V0IChlaXRoZXIgNAorICoJb3IgOCBkZXBlbmRpbmcgb24gd2hldGhlciBhIHNpeCBvciB0ZW4gYnl0ZSBjb21tYW5kIHdhcworICoJaXNzdWVkKSBpZiBzdWNjZXNzZnVsLgorICoqLworaW50CitzY3NpX21vZGVfc2Vuc2Uoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgZGJkLCBpbnQgbW9kZXBhZ2UsCisJCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGxlbiwgaW50IHRpbWVvdXQsIGludCByZXRyaWVzLAorCQlzdHJ1Y3Qgc2NzaV9tb2RlX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChzZGV2LCBHRlBfS0VSTkVMKTsKKwlpbnQgcmV0OworCisJaWYgKCFzcmVxKQorCQlyZXR1cm4gLTE7CisKKwlyZXQgPSBfX3Njc2lfbW9kZV9zZW5zZShzcmVxLCBkYmQsIG1vZGVwYWdlLCBidWZmZXIsIGxlbiwKKwkJCQl0aW1lb3V0LCByZXRyaWVzLCBkYXRhKTsKKworCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9tb2RlX3NlbnNlKTsKKworaW50CitzY3NpX3Rlc3RfdW5pdF9yZWFkeShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcykKK3sKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxOworCWNoYXIgY21kW10gPSB7CisJCVRFU1RfVU5JVF9SRUFEWSwgMCwgMCwgMCwgMCwgMCwKKwl9OworCWludCByZXN1bHQ7CisJCisJc3JlcSA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChzZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNyZXEpCisJCXJldHVybiAtRU5PTUVNOworCisJc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKKwlzY3NpX3dhaXRfcmVxKHNyZXEsIGNtZCwgTlVMTCwgMCwgdGltZW91dCwgcmV0cmllcyk7CisKKwlpZiAoKGRyaXZlcl9ieXRlKHNyZXEtPnNyX3Jlc3VsdCkgJiBEUklWRVJfU0VOU0UpICYmIHNkZXYtPnJlbW92YWJsZSkgeworCQlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CisKKwkJaWYgKChzY3NpX3JlcXVlc3Rfbm9ybWFsaXplX3NlbnNlKHNyZXEsICZzc2hkcikpICYmCisJCSAgICAoKHNzaGRyLnNlbnNlX2tleSA9PSBVTklUX0FUVEVOVElPTikgfHwKKwkJICAgICAoc3NoZHIuc2Vuc2Vfa2V5ID09IE5PVF9SRUFEWSkpKSB7CisJCQlzZGV2LT5jaGFuZ2VkID0gMTsKKwkJCXNyZXEtPnNyX3Jlc3VsdCA9IDA7CisJCX0KKwl9CisJcmVzdWx0ID0gc3JlcS0+c3JfcmVzdWx0OworCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOworCXJldHVybiByZXN1bHQ7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfdGVzdF91bml0X3JlYWR5KTsKKworLyoqCisgKglzY3NpX2RldmljZV9zZXRfc3RhdGUgLSBUYWtlIHRoZSBnaXZlbiBkZXZpY2UgdGhyb3VnaCB0aGUgZGV2aWNlCisgKgkJc3RhdGUgbW9kZWwuCisgKglAc2RldjoJc2NzaSBkZXZpY2UgdG8gY2hhbmdlIHRoZSBzdGF0ZSBvZi4KKyAqCUBzdGF0ZToJc3RhdGUgdG8gY2hhbmdlIHRvLgorICoKKyAqCVJldHVybnMgemVybyBpZiB1bnN1Y2Nlc3NmdWwgb3IgYW4gZXJyb3IgaWYgdGhlIHJlcXVlc3RlZCAKKyAqCXRyYW5zaXRpb24gaXMgaWxsZWdhbC4KKyAqKi8KK2ludAorc2NzaV9kZXZpY2Vfc2V0X3N0YXRlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgZW51bSBzY3NpX2RldmljZV9zdGF0ZSBzdGF0ZSkKK3sKKwllbnVtIHNjc2lfZGV2aWNlX3N0YXRlIG9sZHN0YXRlID0gc2Rldi0+c2Rldl9zdGF0ZTsKKworCWlmIChzdGF0ZSA9PSBvbGRzdGF0ZSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTREVWX0NSRUFURUQ6CisJCS8qIFRoZXJlIGFyZSBubyBsZWdhbCBzdGF0ZXMgdGhhdCBjb21lIGJhY2sgdG8KKwkJICogY3JlYXRlZC4gIFRoaXMgaXMgdGhlIG1hbnVhbGx5IGluaXRpYWxpc2VkIHN0YXJ0CisJCSAqIHN0YXRlICovCisJCWdvdG8gaWxsZWdhbDsKKwkJCQorCWNhc2UgU0RFVl9SVU5OSU5HOgorCQlzd2l0Y2ggKG9sZHN0YXRlKSB7CisJCWNhc2UgU0RFVl9DUkVBVEVEOgorCQljYXNlIFNERVZfT0ZGTElORToKKwkJY2FzZSBTREVWX1FVSUVTQ0U6CisJCWNhc2UgU0RFVl9CTE9DSzoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBpbGxlZ2FsOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTREVWX1FVSUVTQ0U6CisJCXN3aXRjaCAob2xkc3RhdGUpIHsKKwkJY2FzZSBTREVWX1JVTk5JTkc6CisJCWNhc2UgU0RFVl9PRkZMSU5FOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGlsbGVnYWw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNERVZfT0ZGTElORToKKwkJc3dpdGNoIChvbGRzdGF0ZSkgeworCQljYXNlIFNERVZfQ1JFQVRFRDoKKwkJY2FzZSBTREVWX1JVTk5JTkc6CisJCWNhc2UgU0RFVl9RVUlFU0NFOgorCQljYXNlIFNERVZfQkxPQ0s6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gaWxsZWdhbDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0RFVl9CTE9DSzoKKwkJc3dpdGNoIChvbGRzdGF0ZSkgeworCQljYXNlIFNERVZfQ1JFQVRFRDoKKwkJY2FzZSBTREVWX1JVTk5JTkc6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gaWxsZWdhbDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0RFVl9DQU5DRUw6CisJCXN3aXRjaCAob2xkc3RhdGUpIHsKKwkJY2FzZSBTREVWX0NSRUFURUQ6CisJCWNhc2UgU0RFVl9SVU5OSU5HOgorCQljYXNlIFNERVZfT0ZGTElORToKKwkJY2FzZSBTREVWX0JMT0NLOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGlsbGVnYWw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNERVZfREVMOgorCQlzd2l0Y2ggKG9sZHN0YXRlKSB7CisJCWNhc2UgU0RFVl9DQU5DRUw6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gaWxsZWdhbDsKKwkJfQorCQlicmVhazsKKworCX0KKwlzZGV2LT5zZGV2X3N0YXRlID0gc3RhdGU7CisJcmV0dXJuIDA7CisKKyBpbGxlZ2FsOgorCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDEsIAorCQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZzZGV2LT5zZGV2X2dlbmRldiwKKwkJCQkJICAgIklsbGVnYWwgc3RhdGUgdHJhbnNpdGlvbiAlcy0+JXNcbiIsCisJCQkJCSAgIHNjc2lfZGV2aWNlX3N0YXRlX25hbWUob2xkc3RhdGUpLAorCQkJCQkgICBzY3NpX2RldmljZV9zdGF0ZV9uYW1lKHN0YXRlKSkKKwkJCQkpOworCXJldHVybiAtRUlOVkFMOworfQorRVhQT1JUX1NZTUJPTChzY3NpX2RldmljZV9zZXRfc3RhdGUpOworCisvKioKKyAqCXNjc2lfZGV2aWNlX3F1aWVzY2UgLSBCbG9jayB1c2VyIGlzc3VlZCBjb21tYW5kcy4KKyAqCUBzZGV2OglzY3NpIGRldmljZSB0byBxdWllc2NlLgorICoKKyAqCVRoaXMgd29ya3MgYnkgdHJ5aW5nIHRvIHRyYW5zaXRpb24gdG8gdGhlIFNERVZfUVVJRVNDRSBzdGF0ZQorICoJKHdoaWNoIG11c3QgYmUgYSBsZWdhbCB0cmFuc2l0aW9uKS4gIFdoZW4gdGhlIGRldmljZSBpcyBpbiB0aGlzCisgKglzdGF0ZSwgb25seSBzcGVjaWFsIHJlcXVlc3RzIHdpbGwgYmUgYWNjZXB0ZWQsIGFsbCBvdGhlcnMgd2lsbAorICoJYmUgZGVmZXJyZWQuICBTaW5jZSBzcGVjaWFsIHJlcXVlc3RzIG1heSBhbHNvIGJlIHJlcXVldWVkIHJlcXVlc3RzLAorICoJYSBzdWNjZXNzZnVsIHJldHVybiBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgZGV2aWNlIHdpbGwgYmUgCisgKgl0b3RhbGx5IHF1aWVzY2VudC4KKyAqCisgKglNdXN0IGJlIGNhbGxlZCB3aXRoIHVzZXIgY29udGV4dCwgbWF5IHNsZWVwLgorICoKKyAqCVJldHVybnMgemVybyBpZiB1bnN1Y2Nlc3NmdWwgb3IgYW4gZXJyb3IgaWYgbm90LgorICoqLworaW50CitzY3NpX2RldmljZV9xdWllc2NlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlpbnQgZXJyID0gc2NzaV9kZXZpY2Vfc2V0X3N0YXRlKHNkZXYsIFNERVZfUVVJRVNDRSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXNjc2lfcnVuX3F1ZXVlKHNkZXYtPnJlcXVlc3RfcXVldWUpOworCXdoaWxlIChzZGV2LT5kZXZpY2VfYnVzeSkgeworCQltc2xlZXBfaW50ZXJydXB0aWJsZSgyMDApOworCQlzY3NpX3J1bl9xdWV1ZShzZGV2LT5yZXF1ZXN0X3F1ZXVlKTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfZGV2aWNlX3F1aWVzY2UpOworCisvKioKKyAqCXNjc2lfZGV2aWNlX3Jlc3VtZSAtIFJlc3RhcnQgdXNlciBpc3N1ZWQgY29tbWFuZHMgdG8gYSBxdWllc2NlZCBkZXZpY2UuCisgKglAc2RldjoJc2NzaSBkZXZpY2UgdG8gcmVzdW1lLgorICoKKyAqCU1vdmVzIHRoZSBkZXZpY2UgZnJvbSBxdWllc2NlZCBiYWNrIHRvIHJ1bm5pbmcgYW5kIHJlc3RhcnRzIHRoZQorICoJcXVldWVzLgorICoKKyAqCU11c3QgYmUgY2FsbGVkIHdpdGggdXNlciBjb250ZXh0LCBtYXkgc2xlZXAuCisgKiovCit2b2lkCitzY3NpX2RldmljZV9yZXN1bWUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCWlmKHNjc2lfZGV2aWNlX3NldF9zdGF0ZShzZGV2LCBTREVWX1JVTk5JTkcpKQorCQlyZXR1cm47CisJc2NzaV9ydW5fcXVldWUoc2Rldi0+cmVxdWVzdF9xdWV1ZSk7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfZGV2aWNlX3Jlc3VtZSk7CisKK3N0YXRpYyB2b2lkCitkZXZpY2VfcXVpZXNjZV9mbihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHZvaWQgKmRhdGEpCit7CisJc2NzaV9kZXZpY2VfcXVpZXNjZShzZGV2KTsKK30KKwordm9pZAorc2NzaV90YXJnZXRfcXVpZXNjZShzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQpCit7CisJc3RhcmdldF9mb3JfZWFjaF9kZXZpY2Uoc3RhcmdldCwgTlVMTCwgZGV2aWNlX3F1aWVzY2VfZm4pOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3RhcmdldF9xdWllc2NlKTsKKworc3RhdGljIHZvaWQKK2RldmljZV9yZXN1bWVfZm4oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCB2b2lkICpkYXRhKQoreworCXNjc2lfZGV2aWNlX3Jlc3VtZShzZGV2KTsKK30KKwordm9pZAorc2NzaV90YXJnZXRfcmVzdW1lKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKK3sKKwlzdGFyZ2V0X2Zvcl9lYWNoX2RldmljZShzdGFyZ2V0LCBOVUxMLCBkZXZpY2VfcmVzdW1lX2ZuKTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV90YXJnZXRfcmVzdW1lKTsKKworLyoqCisgKiBzY3NpX2ludGVybmFsX2RldmljZV9ibG9jayAtIGludGVybmFsIGZ1bmN0aW9uIHRvIHB1dCBhIGRldmljZQorICoJCQkJdGVtcG9yYXJpbHkgaW50byB0aGUgU0RFVl9CTE9DSyBzdGF0ZQorICogQHNkZXY6CWRldmljZSB0byBibG9jaworICoKKyAqIEJsb2NrIHJlcXVlc3QgbWFkZSBieSBzY3NpIGxsZCdzIHRvIHRlbXBvcmFyaWx5IHN0b3AgYWxsCisgKiBzY3NpIGNvbW1hbmRzIG9uIHRoZSBzcGVjaWZpZWQgZGV2aWNlLiAgQ2FsbGVkIGZyb20gaW50ZXJydXB0CisgKiBvciBub3JtYWwgcHJvY2VzcyBjb250ZXh0LgorICoKKyAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsIG9yIGVycm9yIGlmIG5vdAorICoKKyAqIE5vdGVzOiAgICAgICAKKyAqCVRoaXMgcm91dGluZSB0cmFuc2l0aW9ucyB0aGUgZGV2aWNlIHRvIHRoZSBTREVWX0JMT0NLIHN0YXRlCisgKgkod2hpY2ggbXVzdCBiZSBhIGxlZ2FsIHRyYW5zaXRpb24pLiAgV2hlbiB0aGUgZGV2aWNlIGlzIGluIHRoaXMKKyAqCXN0YXRlLCBhbGwgY29tbWFuZHMgYXJlIGRlZmVycmVkIHVudGlsIHRoZSBzY3NpIGxsZCByZWVuYWJsZXMKKyAqCXRoZSBkZXZpY2Ugd2l0aCBzY3NpX2RldmljZV91bmJsb2NrIG9yIGRldmljZV9ibG9ja190bW8gZmlyZXMuCisgKglUaGlzIHJvdXRpbmUgYXNzdW1lcyB0aGUgaG9zdF9sb2NrIGlzIGhlbGQgb24gZW50cnkuCisgKiovCitpbnQKK3Njc2lfaW50ZXJuYWxfZGV2aWNlX2Jsb2NrKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBzZGV2LT5yZXF1ZXN0X3F1ZXVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVyciA9IDA7CisKKwllcnIgPSBzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9CTE9DSyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIAorCSAqIFRoZSBkZXZpY2UgaGFzIHRyYW5zaXRpb25lZCB0byBTREVWX0JMT0NLLiAgU3RvcCB0aGUKKwkgKiBibG9jayBsYXllciBmcm9tIGNhbGxpbmcgdGhlIG1pZGxheWVyIHdpdGggdGhpcyBkZXZpY2UncworCSAqIHJlcXVlc3QgcXVldWUuIAorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlibGtfc3RvcF9xdWV1ZShxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2NzaV9pbnRlcm5hbF9kZXZpY2VfYmxvY2spOworIAorLyoqCisgKiBzY3NpX2ludGVybmFsX2RldmljZV91bmJsb2NrIC0gcmVzdW1lIGEgZGV2aWNlIGFmdGVyIGEgYmxvY2sgcmVxdWVzdAorICogQHNkZXY6CWRldmljZSB0byByZXN1bWUKKyAqCisgKiBDYWxsZWQgYnkgc2NzaSBsbGQncyBvciB0aGUgbWlkbGF5ZXIgdG8gcmVzdGFydCB0aGUgZGV2aWNlIHF1ZXVlCisgKiBmb3IgdGhlIHByZXZpb3VzbHkgc3VzcGVuZGVkIHNjc2kgZGV2aWNlLiAgQ2FsbGVkIGZyb20gaW50ZXJydXB0IG9yCisgKiBub3JtYWwgcHJvY2VzcyBjb250ZXh0LgorICoKKyAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsIG9yIGVycm9yIGlmIG5vdC4KKyAqCisgKiBOb3RlczogICAgICAgCisgKglUaGlzIHJvdXRpbmUgdHJhbnNpdGlvbnMgdGhlIGRldmljZSB0byB0aGUgU0RFVl9SVU5OSU5HIHN0YXRlCisgKgkod2hpY2ggbXVzdCBiZSBhIGxlZ2FsIHRyYW5zaXRpb24pIGFsbG93aW5nIHRoZSBtaWRsYXllciB0bworICoJZ29vc2UgdGhlIHF1ZXVlIGZvciB0aGlzIGRldmljZS4gIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoZSAKKyAqCWhvc3RfbG9jayBpcyBoZWxkIHVwb24gZW50cnkuCisgKiovCitpbnQKK3Njc2lfaW50ZXJuYWxfZGV2aWNlX3VuYmxvY2soc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXJlcXVlc3RfcXVldWVfdCAqcSA9IHNkZXYtPnJlcXVlc3RfcXVldWU7IAorCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwkvKiAKKwkgKiBUcnkgdG8gdHJhbnNpdGlvbiB0aGUgc2NzaSBkZXZpY2UgdG8gU0RFVl9SVU5OSU5HCisJICogYW5kIGdvb3NlIHRoZSBkZXZpY2UgcXVldWUgaWYgc3VjY2Vzc2Z1bC4gIAorCSAqLworCWVyciA9IHNjc2lfZGV2aWNlX3NldF9zdGF0ZShzZGV2LCBTREVWX1JVTk5JTkcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJYmxrX3N0YXJ0X3F1ZXVlKHEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzY3NpX2ludGVybmFsX2RldmljZV91bmJsb2NrKTsKKworc3RhdGljIHZvaWQKK2RldmljZV9ibG9jayhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHZvaWQgKmRhdGEpCit7CisJc2NzaV9pbnRlcm5hbF9kZXZpY2VfYmxvY2soc2Rldik7Cit9CisKK3N0YXRpYyBpbnQKK3RhcmdldF9ibG9jayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJaWYgKHNjc2lfaXNfdGFyZ2V0X2RldmljZShkZXYpKQorCQlzdGFyZ2V0X2Zvcl9lYWNoX2RldmljZSh0b19zY3NpX3RhcmdldChkZXYpLCBOVUxMLAorCQkJCQlkZXZpY2VfYmxvY2spOworCXJldHVybiAwOworfQorCit2b2lkCitzY3NpX3RhcmdldF9ibG9jayhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKHNjc2lfaXNfdGFyZ2V0X2RldmljZShkZXYpKQorCQlzdGFyZ2V0X2Zvcl9lYWNoX2RldmljZSh0b19zY3NpX3RhcmdldChkZXYpLCBOVUxMLAorCQkJCQlkZXZpY2VfYmxvY2spOworCWVsc2UKKwkJZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKGRldiwgTlVMTCwgdGFyZ2V0X2Jsb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNjc2lfdGFyZ2V0X2Jsb2NrKTsKKworc3RhdGljIHZvaWQKK2RldmljZV91bmJsb2NrKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgdm9pZCAqZGF0YSkKK3sKKwlzY3NpX2ludGVybmFsX2RldmljZV91bmJsb2NrKHNkZXYpOworfQorCitzdGF0aWMgaW50Cit0YXJnZXRfdW5ibG9jayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJaWYgKHNjc2lfaXNfdGFyZ2V0X2RldmljZShkZXYpKQorCQlzdGFyZ2V0X2Zvcl9lYWNoX2RldmljZSh0b19zY3NpX3RhcmdldChkZXYpLCBOVUxMLAorCQkJCQlkZXZpY2VfdW5ibG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3Njc2lfdGFyZ2V0X3VuYmxvY2soc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmIChzY3NpX2lzX3RhcmdldF9kZXZpY2UoZGV2KSkKKwkJc3RhcmdldF9mb3JfZWFjaF9kZXZpY2UodG9fc2NzaV90YXJnZXQoZGV2KSwgTlVMTCwKKwkJCQkJZGV2aWNlX3VuYmxvY2spOworCWVsc2UKKwkJZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKGRldiwgTlVMTCwgdGFyZ2V0X3VuYmxvY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2NzaV90YXJnZXRfdW5ibG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9sb2dnaW5nLmggYi9kcml2ZXJzL3Njc2kvc2NzaV9sb2dnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE3MjJiYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xvZ2dpbmcuaApAQCAtMCwwICsxLDgyIEBACisjaWZuZGVmIF9TQ1NJX0xPR0dJTkdfSAorI2RlZmluZSBfU0NTSV9MT0dHSU5HX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisvKgorICogVGhpcyBkZWZpbmVzIHRoZSBzY3NpIGxvZ2dpbmcgZmVhdHVyZS4gIEl0IGlzIGEgbWVhbnMgYnkgd2hpY2ggdGhlIHVzZXIKKyAqIGNhbiBzZWxlY3QgaG93IG11Y2ggaW5mb3JtYXRpb24gdGhleSBnZXQgYWJvdXQgdmFyaW91cyBnb2luZ3Mgb24sIGFuZCBpdAorICogY2FuIGJlIHJlYWxseSB1c2VmdWwgZm9yIGZhdWx0IHRyYWNpbmcuICBUaGUgbG9nZ2luZyB3b3JkIGlzIGRpdmlkZWQgaW50bworICogOCBuaWJibGVzLCBlYWNoIG9mIHdoaWNoIGRlc2NyaWJlcyBhIGxvZ2xldmVsLiAgVGhlIGRpdmlzaW9uIG9mIHRoaW5ncyBpcworICogc29tZXdoYXQgYXJiaXRyYXJ5LCBhbmQgdGhlIGRpdmlzaW9uIG9mIHRoZSB3b3JkIGNvdWxkIGJlIGNoYW5nZWQgaWYgaXQKKyAqIHdlcmUgcmVhbGx5IG5lZWRlZCBmb3IgYW55IHJlYXNvbi4gIFRoZSBudW1iZXJzIGJlbG93IGFyZSB0aGUgb25seSBwbGFjZQorICogd2hlcmUgdGhlc2UgYXJlIHNwZWNpZmllZC4gIEZvciBhIGZpcnN0IGdvLWFyb3VuZCwgMyBiaXRzIGlzIG1vcmUgdGhhbgorICogZW5vdWdoLCBzaW5jZSB0aGlzIGdpdmVzIDggbGV2ZWxzIG9mIGxvZ2dpbmcgKHJlYWxseSA3LCBzaW5jZSAwIGlzIGFsd2F5cworICogb2ZmKS4gIEN1dHRpbmcgdG8gMiBiaXRzIG1pZ2h0IGJlIHdpc2UgYXQgc29tZSBwb2ludC4KKyAqLworCisjZGVmaW5lIFNDU0lfTE9HX0VSUk9SX1NISUZUICAgICAgICAgICAgICAwCisjZGVmaW5lIFNDU0lfTE9HX1RJTUVPVVRfU0hJRlQgICAgICAgICAgICAzCisjZGVmaW5lIFNDU0lfTE9HX1NDQU5fU0hJRlQgICAgICAgICAgICAgICA2CisjZGVmaW5lIFNDU0lfTE9HX01MUVVFVUVfU0hJRlQgICAgICAgICAgICA5CisjZGVmaW5lIFNDU0lfTE9HX01MQ09NUExFVEVfU0hJRlQgICAgICAgICAxMgorI2RlZmluZSBTQ1NJX0xPR19MTFFVRVVFX1NISUZUICAgICAgICAgICAgMTUKKyNkZWZpbmUgU0NTSV9MT0dfTExDT01QTEVURV9TSElGVCAgICAgICAgIDE4CisjZGVmaW5lIFNDU0lfTE9HX0hMUVVFVUVfU0hJRlQgICAgICAgICAgICAyMQorI2RlZmluZSBTQ1NJX0xPR19ITENPTVBMRVRFX1NISUZUICAgICAgICAgMjQKKyNkZWZpbmUgU0NTSV9MT0dfSU9DVExfU0hJRlQgICAgICAgICAgICAgIDI3CisKKyNkZWZpbmUgU0NTSV9MT0dfRVJST1JfQklUUyAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgU0NTSV9MT0dfVElNRU9VVF9CSVRTICAgICAgICAgICAgIDMKKyNkZWZpbmUgU0NTSV9MT0dfU0NBTl9CSVRTICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgU0NTSV9MT0dfTUxRVUVVRV9CSVRTICAgICAgICAgICAgIDMKKyNkZWZpbmUgU0NTSV9MT0dfTUxDT01QTEVURV9CSVRTICAgICAgICAgIDMKKyNkZWZpbmUgU0NTSV9MT0dfTExRVUVVRV9CSVRTICAgICAgICAgICAgIDMKKyNkZWZpbmUgU0NTSV9MT0dfTExDT01QTEVURV9CSVRTICAgICAgICAgIDMKKyNkZWZpbmUgU0NTSV9MT0dfSExRVUVVRV9CSVRTICAgICAgICAgICAgIDMKKyNkZWZpbmUgU0NTSV9MT0dfSExDT01QTEVURV9CSVRTICAgICAgICAgIDMKKyNkZWZpbmUgU0NTSV9MT0dfSU9DVExfQklUUyAgICAgICAgICAgICAgIDMKKworZXh0ZXJuIHVuc2lnbmVkIGludCBzY3NpX2xvZ2dpbmdfbGV2ZWw7CisKKyNpZmRlZiBDT05GSUdfU0NTSV9MT0dHSU5HCisKKyNkZWZpbmUgU0NTSV9MT0dfTEVWRUwoU0hJRlQsIEJJVFMpCQkJCVwKKyAgICAgICAgKChzY3NpX2xvZ2dpbmdfbGV2ZWwgPj4gKFNISUZUKSkgJiAoKDEgPDwgKEJJVFMpKSAtIDEpKQorCisjZGVmaW5lIFNDU0lfQ0hFQ0tfTE9HR0lORyhTSElGVCwgQklUUywgTEVWRUwsIENNRCkJCVwKK3sJCQkJCQkJCVwKKyAgICAgICAgaWYgKHVubGlrZWx5KChTQ1NJX0xPR19MRVZFTChTSElGVCwgQklUUykpID4gKExFVkVMKSkpCVwKKwkJKENNRCk7CQkJCQkJXAorfQorI2Vsc2UKKyNkZWZpbmUgU0NTSV9DSEVDS19MT0dHSU5HKFNISUZULCBCSVRTLCBMRVZFTCwgQ01EKQorI2VuZGlmIC8qIENPTkZJR19TQ1NJX0xPR0dJTkcgKi8KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgbWFjcm9zIHRoYXQgYXJlIGFjdHVhbGx5IHVzZWQgdGhyb3VnaG91dCB0aGUgY29kZSB0bworICogbG9nIGV2ZW50cy4gIElmIGxvZ2dpbmcgaXNuJ3QgZW5hYmxlZCwgdGhleSBhcmUgbm8tb3BzIGFuZCB3aWxsIGJlCisgKiBjb21wbGV0ZWx5IGFic2VudCBmcm9tIHRoZSB1c2VyJ3MgY29kZS4KKyAqLworI2RlZmluZSBTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWShMRVZFTCxDTUQpICBcCisgICAgICAgIFNDU0lfQ0hFQ0tfTE9HR0lORyhTQ1NJX0xPR19FUlJPUl9TSElGVCwgU0NTSV9MT0dfRVJST1JfQklUUywgTEVWRUwsQ01EKTsKKyNkZWZpbmUgU0NTSV9MT0dfVElNRU9VVChMRVZFTCxDTUQpICBcCisgICAgICAgIFNDU0lfQ0hFQ0tfTE9HR0lORyhTQ1NJX0xPR19USU1FT1VUX1NISUZULCBTQ1NJX0xPR19USU1FT1VUX0JJVFMsIExFVkVMLENNRCk7CisjZGVmaW5lIFNDU0lfTE9HX1NDQU5fQlVTKExFVkVMLENNRCkgIFwKKyAgICAgICAgU0NTSV9DSEVDS19MT0dHSU5HKFNDU0lfTE9HX1NDQU5fU0hJRlQsIFNDU0lfTE9HX1NDQU5fQklUUywgTEVWRUwsQ01EKTsKKyNkZWZpbmUgU0NTSV9MT0dfTUxRVUVVRShMRVZFTCxDTUQpICBcCisgICAgICAgIFNDU0lfQ0hFQ0tfTE9HR0lORyhTQ1NJX0xPR19NTFFVRVVFX1NISUZULCBTQ1NJX0xPR19NTFFVRVVFX0JJVFMsIExFVkVMLENNRCk7CisjZGVmaW5lIFNDU0lfTE9HX01MQ09NUExFVEUoTEVWRUwsQ01EKSAgXAorICAgICAgICBTQ1NJX0NIRUNLX0xPR0dJTkcoU0NTSV9MT0dfTUxDT01QTEVURV9TSElGVCwgU0NTSV9MT0dfTUxDT01QTEVURV9CSVRTLCBMRVZFTCxDTUQpOworI2RlZmluZSBTQ1NJX0xPR19MTFFVRVVFKExFVkVMLENNRCkgIFwKKyAgICAgICAgU0NTSV9DSEVDS19MT0dHSU5HKFNDU0lfTE9HX0xMUVVFVUVfU0hJRlQsIFNDU0lfTE9HX0xMUVVFVUVfQklUUywgTEVWRUwsQ01EKTsKKyNkZWZpbmUgU0NTSV9MT0dfTExDT01QTEVURShMRVZFTCxDTUQpICBcCisgICAgICAgIFNDU0lfQ0hFQ0tfTE9HR0lORyhTQ1NJX0xPR19MTENPTVBMRVRFX1NISUZULCBTQ1NJX0xPR19MTENPTVBMRVRFX0JJVFMsIExFVkVMLENNRCk7CisjZGVmaW5lIFNDU0lfTE9HX0hMUVVFVUUoTEVWRUwsQ01EKSAgXAorICAgICAgICBTQ1NJX0NIRUNLX0xPR0dJTkcoU0NTSV9MT0dfSExRVUVVRV9TSElGVCwgU0NTSV9MT0dfSExRVUVVRV9CSVRTLCBMRVZFTCxDTUQpOworI2RlZmluZSBTQ1NJX0xPR19ITENPTVBMRVRFKExFVkVMLENNRCkgIFwKKyAgICAgICAgU0NTSV9DSEVDS19MT0dHSU5HKFNDU0lfTE9HX0hMQ09NUExFVEVfU0hJRlQsIFNDU0lfTE9HX0hMQ09NUExFVEVfQklUUywgTEVWRUwsQ01EKTsKKyNkZWZpbmUgU0NTSV9MT0dfSU9DVEwoTEVWRUwsQ01EKSAgXAorICAgICAgICBTQ1NJX0NIRUNLX0xPR0dJTkcoU0NTSV9MT0dfSU9DVExfU0hJRlQsIFNDU0lfTE9HX0lPQ1RMX0JJVFMsIExFVkVMLENNRCk7CisKKyNlbmRpZiAvKiBfU0NTSV9MT0dHSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX21vZHVsZS5jIGIvZHJpdmVycy9zY3NpL3Njc2lfbW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5MTc1OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX21vZHVsZS5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ2hyaXN0b3BoIEhlbGx3aWcuCisgKglSZWxlYXNlZCB1bmRlciBHUEwgdjIuCisgKgorICogU3VwcG9ydCBmb3Igb2xkLXN0eWxlIGhvc3QgdGVtcGxhdGVzLgorICoKKyAqIE5PVEU6ICBEbyBub3QgdXNlIHRoaXMgZm9yIG5ldyBkcml2ZXJzIGV2ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKworc3RhdGljIGludCBfX2luaXQgaW5pdF90aGlzX3Njc2lfZHJpdmVyKHZvaWQpCit7CisJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0ID0gJmRyaXZlcl90ZW1wbGF0ZTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCWludCBlcnJvcjsKKworCWlmICghc2h0LT5yZWxlYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgInNjc2kgSEJBIGRyaXZlciAlcyBkaWRuJ3Qgc2V0IGEgcmVsZWFzZSBtZXRob2QuXG4iLAorCQkgICAgc2h0LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2h0LT5tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlJTklUX0xJU1RfSEVBRCgmc2h0LT5sZWdhY3lfaG9zdHMpOworCisJc2h0LT5kZXRlY3Qoc2h0KTsKKwlpZiAobGlzdF9lbXB0eSgmc2h0LT5sZWdhY3lfaG9zdHMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2hvc3QsICZzaHQtPmxlZ2FjeV9ob3N0cywgc2h0X2xlZ2FjeV9saXN0KSB7CisJCWVycm9yID0gc2NzaV9hZGRfaG9zdChzaG9zdCwgTlVMTCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZmFpbDsKKwkJc2NzaV9zY2FuX2hvc3Qoc2hvc3QpOworCX0KKwlyZXR1cm4gMDsKKyBmYWlsOgorCWwgPSAmc2hvc3QtPnNodF9sZWdhY3lfbGlzdDsKKwl3aGlsZSAoKGwgPSBsLT5wcmV2KSAhPSAmc2h0LT5sZWdhY3lfaG9zdHMpCisJCXNjc2lfcmVtb3ZlX2hvc3QobGlzdF9lbnRyeShsLCBzdHJ1Y3QgU2NzaV9Ib3N0LCBzaHRfbGVnYWN5X2xpc3QpKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3RoaXNfc2NzaV9kcml2ZXIodm9pZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQgPSAmZHJpdmVyX3RlbXBsYXRlOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCAqczsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2hvc3QsICZzaHQtPmxlZ2FjeV9ob3N0cywgc2h0X2xlZ2FjeV9saXN0KQorCQlzY3NpX3JlbW92ZV9ob3N0KHNob3N0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2hvc3QsIHMsICZzaHQtPmxlZ2FjeV9ob3N0cywgc2h0X2xlZ2FjeV9saXN0KQorCQlzaHQtPnJlbGVhc2Uoc2hvc3QpOworCisJaWYgKGxpc3RfZW1wdHkoJnNodC0+bGVnYWN5X2hvc3RzKSkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgZGlkIG5vdCBjYWxsIHNjc2lfdW5yZWdpc3RlclxuIiwgc2h0LT5uYW1lKTsKKwlkdW1wX3N0YWNrKCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2hvc3QsIHMsICZzaHQtPmxlZ2FjeV9ob3N0cywgc2h0X2xlZ2FjeV9saXN0KQorCQlzY3NpX3VucmVnaXN0ZXIoc2hvc3QpOworfQorCittb2R1bGVfaW5pdChpbml0X3RoaXNfc2NzaV9kcml2ZXIpOworbW9kdWxlX2V4aXQoZXhpdF90aGlzX3Njc2lfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX29ic29sZXRlLmggYi9kcml2ZXJzL3Njc2kvc2NzaV9vYnNvbGV0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZWFjYjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9vYnNvbGV0ZS5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogIHNjc2lfb2Jzb2xldGUuaCBDb3B5cmlnaHQgKEMpIDE5OTcgRXJpYyBZb3VuZ2RhbGUKKyAqCisgKi8KKworI2lmbmRlZiBfU0NTSV9PQlNPTEVURV9ICisjZGVmaW5lIF9TQ1NJX09CU09MRVRFX0gKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgcmV0dXJuIGNvZGVzIGZvciB0aGUgYWJvcnQgYW5kIHJlc2V0IGZ1bmN0aW9ucy4gIFRoZSBtaWQtbGV2ZWwKKyAqIGNvZGUgdXNlcyB0aGVzZSB0byBkZWNpZGUgd2hhdCB0byBkbyBuZXh0LiAgRWFjaCBvZiB0aGUgbG93IGxldmVsIGFib3J0CisgKiBhbmQgcmVzZXQgZnVuY3Rpb25zIG11c3QgY29ycmVjdGx5IGluZGljYXRlIHdoYXQgaXQgaGFzIGRvbmUuCisgKiBUaGUgZGVzY3JpcHRpb25zIGFyZSB3cml0dGVuIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIG1pZC1sZXZlbCBjb2RlLAorICogc28gdGhhdCB0aGUgcmV0dXJuIGNvZGUgaXMgdGVsbGluZyB0aGUgbWlkLWxldmVsIGRyaXZlcnMgZXhhY3RseSB3aGF0CisgKiB0aGUgbG93IGxldmVsIGRyaXZlciBoYXMgYWxyZWFkeSBkb25lLCBhbmQgd2hhdCByZW1haW5zIHRvIGJlIGRvbmUuCisgKi8KKworLyogV2UgZGlkIG5vdCBkbyBhbnl0aGluZy4gIAorICogV2FpdCBzb21lIG1vcmUgZm9yIHRoaXMgY29tbWFuZCB0byBjb21wbGV0ZSwgYW5kIGlmIHRoaXMgZG9lcyBub3Qgd29yaywgCisgKiB0cnkgc29tZXRoaW5nIG1vcmUgc2VyaW91cy4gKi8KKyNkZWZpbmUgU0NTSV9BQk9SVF9TTk9PWkUgMAorCisvKiBUaGlzIG1lYW5zIHRoYXQgd2Ugd2VyZSBhYmxlIHRvIGFib3J0IHRoZSBjb21tYW5kLiAgV2UgaGF2ZSBhbHJlYWR5CisgKiBjYWxsZWQgdGhlIG1pZC1sZXZlbCBkb25lIGZ1bmN0aW9uLCBhbmQgZG8gbm90IGV4cGVjdCBhbiBpbnRlcnJ1cHQgdGhhdCAKKyAqIHdpbGwgbGVhZCB0byBhbm90aGVyIGNhbGwgdG8gdGhlIG1pZC1sZXZlbCBkb25lIGZ1bmN0aW9uIGZvciB0aGlzIGNvbW1hbmQgKi8KKyNkZWZpbmUgU0NTSV9BQk9SVF9TVUNDRVNTIDEKKworLyogV2UgY2FsbGVkIGZvciBhbiBhYm9ydCBvZiB0aGlzIGNvbW1hbmQsIGFuZCB3ZSBzaG91bGQgZ2V0IGFuIGludGVycnVwdCAKKyAqIHdoZW4gdGhpcyBzdWNjZWVkcy4gIFRodXMgd2Ugc2hvdWxkIG5vdCByZXN0b3JlIHRoZSB0aW1lciBmb3IgdGhpcworICogY29tbWFuZCBpbiB0aGUgbWlkLWxldmVsIGFib3J0IGZ1bmN0aW9uLiAqLworI2RlZmluZSBTQ1NJX0FCT1JUX1BFTkRJTkcgMgorCisvKiBVbmFibGUgdG8gYWJvcnQgLSBjb21tYW5kIGlzIGN1cnJlbnRseSBvbiB0aGUgYnVzLiAgR3JpbiBhbmQgYmVhciBpdC4gKi8KKyNkZWZpbmUgU0NTSV9BQk9SVF9CVVNZIDMKKworLyogVGhlIGNvbW1hbmQgaXMgbm90IGFjdGl2ZSBpbiB0aGUgbG93IGxldmVsIGNvZGUuIENvbW1hbmQgcHJvYmFibHkKKyAqIGZpbmlzaGVkLiAqLworI2RlZmluZSBTQ1NJX0FCT1JUX05PVF9SVU5OSU5HIDQKKworLyogU29tZXRoaW5nIHdlbnQgd3JvbmcuICBUaGUgbG93IGxldmVsIGRyaXZlciB3aWxsIGluZGljYXRlIHRoZSBjb3JyZWN0CisgKiBlcnJvciBjb25kaXRpb24gd2hlbiBpdCBjYWxscyBzY3NpX2RvbmUsIHNvIHRoZSBtaWQtbGV2ZWwgYWJvcnQgZnVuY3Rpb24KKyAqIGNhbiBzaW1wbHkgd2FpdCB1bnRpbCB0aGlzIGNvbWVzIHRocm91Z2ggKi8KKyNkZWZpbmUgU0NTSV9BQk9SVF9FUlJPUiA1CisKKy8qIFdlIGRvIG5vdCBrbm93IGhvdyB0byByZXNldCB0aGUgYnVzLCBvciB3ZSBkbyBub3Qgd2FudCB0by4gIEJ1bW1lci4KKyAqIEFueXdheSwganVzdCB3YWl0IGEgbGl0dGxlIG1vcmUgZm9yIHRoZSBjb21tYW5kIGluIHF1ZXN0aW9uLCBhbmQgaG9wZSB0aGF0CisgKiBpdCBldmVudHVhbGx5IGZpbmlzaGVzLiAgSWYgaXQgbmV2ZXIgZmluaXNoZXMsIHRoZSBTQ1NJIGRldmljZSBjb3VsZAorICogaGFuZywgc28gdXNlIHRoaXMgd2l0aCBjYXV0aW9uLiAqLworI2RlZmluZSBTQ1NJX1JFU0VUX1NOT09aRSAwCisKKy8qIFdlIGRvIG5vdCBrbm93IGhvdyB0byByZXNldCB0aGUgYnVzLCBvciB3ZSBkbyBub3Qgd2FudCB0by4gIEJ1bW1lci4KKyAqIFdlIGhhdmUgZ2l2ZW4gdXAgb24gdGhpcyBldmVyIGNvbXBsZXRpbmcuICBUaGUgbWlkLWxldmVsIGNvZGUgd2lsbAorICogcmVxdWVzdCBzZW5zZSBpbmZvcm1hdGlvbiB0byBkZWNpZGUgaG93IHRvIHByb2NlZWQgZnJvbSBoZXJlLiAqLworI2RlZmluZSBTQ1NJX1JFU0VUX1BVTlQgMQorCisvKiBUaGlzIG1lYW5zIHRoYXQgd2Ugd2VyZSBhYmxlIHRvIHJlc2V0IHRoZSBidXMuICBXZSBoYXZlIHJlc3RhcnRlZCBhbGwgb2YKKyAqIHRoZSBjb21tYW5kcyB0aGF0IHNob3VsZCBiZSByZXN0YXJ0ZWQsIGFuZCB3ZSBzaG91bGQgYmUgYWJsZSB0byBjb250aW51ZQorICogb24gbm9ybWFsbHkgZnJvbSBoZXJlLiAgV2UgZG8gbm90IGV4cGVjdCBhbnkgaW50ZXJydXB0cyB0aGF0IHdpbGwgcmV0dXJuCisgKiBESURfUkVTRVQgdG8gYW55IG9mIHRoZSBvdGhlciBjb21tYW5kcyBpbiB0aGUgaG9zdF9xdWV1ZSwgYW5kIHRoZSBtaWQtbGV2ZWwKKyAqIGNvZGUgZG9lcyBub3QgbmVlZCB0byBkbyBhbnl0aGluZyBzcGVjaWFsIHRvIGtlZXAgdGhlIGNvbW1hbmRzIGFsaXZlLiAKKyAqIElmIGEgaGFyZCByZXNldCB3YXMgcGVyZm9ybWVkIHRoZW4gYWxsIG91dHN0YW5kaW5nIGNvbW1hbmRzIG9uIHRoZQorICogYnVzIGhhdmUgYmVlbiByZXN0YXJ0ZWQuICovCisjZGVmaW5lIFNDU0lfUkVTRVRfU1VDQ0VTUyAyCisKKy8qIFdlIGNhbGxlZCBmb3IgYSByZXNldCBvZiB0aGlzIGJ1cywgYW5kIHdlIHNob3VsZCBnZXQgYW4gaW50ZXJydXB0IAorICogd2hlbiB0aGlzIHN1Y2NlZWRzLiAgRWFjaCBjb21tYW5kIHNob3VsZCBnZXQgaXRzIG93biBzdGF0dXMKKyAqIHBhc3NlZCB1cCB0byBzY3NpX2RvbmUsIGJ1dCB0aGlzIGhhcyBub3QgaGFwcGVuZWQgeWV0LiAKKyAqIElmIGEgaGFyZCByZXNldCB3YXMgcGVyZm9ybWVkLCB0aGVuIHdlIGV4cGVjdCBhbiBpbnRlcnJ1cHQKKyAqIGZvciAqZWFjaCogb2YgdGhlIG91dHN0YW5kaW5nIGNvbW1hbmRzIHRoYXQgd2lsbCBoYXZlIHRoZQorICogZWZmZWN0IG9mIHJlc3RhcnRpbmcgdGhlIGNvbW1hbmRzLgorICovCisjZGVmaW5lIFNDU0lfUkVTRVRfUEVORElORyAzCisKKy8qIFdlIGRpZCBhIHJlc2V0LCBidXQgZG8gbm90IGV4cGVjdCBhbiBpbnRlcnJ1cHQgdG8gc2lnbmFsIERJRF9SRVNFVC4KKyAqIFRoaXMgdGVsbHMgdGhlIHVwcGVyIGxldmVsIGNvZGUgdG8gcmVxdWVzdCB0aGUgc2Vuc2UgaW5mbywgYW5kIHRoaXMKKyAqIHNob3VsZCBrZWVwIHRoZSBjb21tYW5kIGFsaXZlLiAqLworI2RlZmluZSBTQ1NJX1JFU0VUX1dBS0VVUCA0CisKKy8qIFRoZSBjb21tYW5kIGlzIG5vdCBhY3RpdmUgaW4gdGhlIGxvdyBsZXZlbCBjb2RlLiBDb21tYW5kIHByb2JhYmx5CisgICBmaW5pc2hlZC4gKi8KKyNkZWZpbmUgU0NTSV9SRVNFVF9OT1RfUlVOTklORyA1CisKKy8qIFNvbWV0aGluZyB3ZW50IHdyb25nLCBhbmQgd2UgZG8gbm90IGtub3cgaG93IHRvIGZpeCBpdC4gKi8KKyNkZWZpbmUgU0NTSV9SRVNFVF9FUlJPUiA2CisKKyNkZWZpbmUgU0NTSV9SRVNFVF9TWU5DSFJPTk9VUwkJMHgwMQorI2RlZmluZSBTQ1NJX1JFU0VUX0FTWU5DSFJPTk9VUwkJMHgwMgorI2RlZmluZSBTQ1NJX1JFU0VUX1NVR0dFU1RfQlVTX1JFU0VUCTB4MDQKKyNkZWZpbmUgU0NTSV9SRVNFVF9TVUdHRVNUX0hPU1RfUkVTRVQJMHgwOAorLyoKKyAqIFRoaXMgaXMgYSBiaXRtYXNrIHRoYXQgaXMgb3JlZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgY29kZXMuCisgKiBJdCB0ZWxscyB0aGUgbWlkLWxldmVsIGNvZGUgdGhhdCB3ZSBkaWQgYSBoYXJkIHJlc2V0LgorICovCisjZGVmaW5lIFNDU0lfUkVTRVRfQlVTX1JFU0VUIDB4MTAwCisvKgorICogVGhpcyBpcyBhIGJpdG1hc2sgdGhhdCBpcyBvcmVkIHdpdGggb25lIG9mIHRoZSBhYm92ZSBjb2Rlcy4KKyAqIEl0IHRlbGxzIHRoZSBtaWQtbGV2ZWwgY29kZSB0aGF0IHdlIGRpZCBhIGhvc3QgYWRhcHRlciByZXNldC4KKyAqLworI2RlZmluZSBTQ1NJX1JFU0VUX0hPU1RfUkVTRVQgMHgyMDAKKy8qCisgKiBVc2VkIHRvIG1hc2sgb2ZmIGJpdHMgYW5kIHRvIG9idGFpbiB0aGUgYmFzaWMgYWN0aW9uIHRoYXQgd2FzCisgKiBwZXJmb3JtZWQuICAKKyAqLworI2RlZmluZSBTQ1NJX1JFU0VUX0FDVElPTiAgIDB4ZmYKKworI2VuZGlmCQkJCS8qIFNDU0lfT0JTT0xFVEVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oIGIvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYTNiMzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9wcml2LmgKQEAgLTAsMCArMSwxNjUgQEAKKyNpZm5kZWYgX1NDU0lfUFJJVl9ICisjZGVmaW5lIF9TQ1NJX1BSSVZfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKK3N0cnVjdCByZXF1ZXN0X3F1ZXVlOworc3RydWN0IHNjc2lfY21uZDsKK3N0cnVjdCBzY3NpX2RldmljZTsKK3N0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGU7CitzdHJ1Y3Qgc2NzaV9yZXF1ZXN0Oworc3RydWN0IFNjc2lfSG9zdDsKKworCisvKgorICogVGhlc2UgYXJlIHRoZSB2YWx1ZXMgdGhhdCB0aGUgb3duZXIgZmllbGQgY2FuIHRha2UuCisgKiBUaGV5IGFyZSB1c2VkIGFzIGFuIGluZGljYXRpb24gb2Ygd2hvIHRoZSBjb21tYW5kIGJlbG9uZ3MgdG8uCisgKi8KKyNkZWZpbmUgU0NTSV9PV05FUl9ISUdITEVWRUwgICAgICAweDEwMAorI2RlZmluZSBTQ1NJX09XTkVSX01JRExFVkVMICAgICAgIDB4MTAxCisjZGVmaW5lIFNDU0lfT1dORVJfTE9XTEVWRUwgICAgICAgMHgxMDIKKyNkZWZpbmUgU0NTSV9PV05FUl9FUlJPUl9IQU5ETEVSICAweDEwMworI2RlZmluZSBTQ1NJX09XTkVSX0JIX0hBTkRMRVIgICAgIDB4MTA0CisjZGVmaW5lIFNDU0lfT1dORVJfTk9CT0RZICAgICAgICAgMHgxMDUKKworLyoKKyAqIE1hZ2ljIHZhbHVlcyBmb3IgY2VydGFpbiBzY3NpIHN0cnVjdHMuIFNob3VsZG4ndCBldmVyIGJlIHVzZWQuCisgKi8KKyNkZWZpbmUgU0NTSV9DTU5EX01BR0lDCQkweEUyNUMyM0E1CisjZGVmaW5lIFNDU0lfUkVRX01BR0lDCQkweDc1RjZEMzU0CisKKy8qCisgKiAgRmxhZyBiaXQgZm9yIHRoZSBpbnRlcm5hbF90aW1lb3V0IGFycmF5CisgKi8KKyNkZWZpbmUgTk9STUFMX1RJTUVPVVQJCTAKKworLyoKKyAqIFNjc2kgRXJyb3IgSGFuZGxlciBGbGFncworICovCisjZGVmaW5lIHNjc2lfZWhfZWZsYWdzX2NoayhzY3AsIGZsYWdzKSBcCisJKChzY3ApLT5laF9lZmxhZ3MgJiAoZmxhZ3MpKQorI2RlZmluZSBzY3NpX2VoX2VmbGFnc19zZXQoc2NwLCBmbGFncykgXAorCWRvIHsgKHNjcCktPmVoX2VmbGFncyB8PSAoZmxhZ3MpOyB9IHdoaWxlKDApCisjZGVmaW5lIHNjc2lfZWhfZWZsYWdzX2NscihzY3AsIGZsYWdzKSBcCisJZG8geyAoc2NwKS0+ZWhfZWZsYWdzICY9IH4oZmxhZ3MpOyB9IHdoaWxlKDApCisjZGVmaW5lIHNjc2lfZWhfZWZsYWdzX2Nscl9hbGwoc2NwKSBcCisJKHNjcC0+ZWhfZWZsYWdzID0gMCkKKworI2RlZmluZSBTQ1NJX0VIX0NBTkNFTF9DTUQJMHgwMDAxCS8qIENhbmNlbCB0aGlzIGNtZCAqLworI2RlZmluZSBTQ1NJX0VIX1JFQ19USU1FT1VUCTB4MDAwMgkvKiBFSCByZXRyeSB0aW1lZCBvdXQgKi8KKworI2RlZmluZSBTQ1NJX1NFTlNFX1ZBTElEKHNjbWQpIFwKKwkoKChzY21kKS0+c2Vuc2VfYnVmZmVyWzBdICYgMHg3MCkgPT0gMHg3MCkKKworLyoKKyAqIFNwZWNpYWwgdmFsdWUgZm9yIHNjYW5uaW5nIHRvIHNwZWNpZnkgc2Nhbm5pbmcgb3IgcmVzY2FubmluZyBvZiBhbGwKKyAqIHBvc3NpYmxlIGNoYW5uZWxzLCAodGFyZ2V0KSBpZHMsIG9yIGx1bnMgb24gYSBnaXZlbiBzaG9zdC4KKyAqLworI2RlZmluZSBTQ0FOX1dJTERfQ0FSRAl+MAorCisvKiBob3N0cy5jICovCitleHRlcm4gaW50IHNjc2lfaW5pdF9ob3N0cyh2b2lkKTsKK2V4dGVybiB2b2lkIHNjc2lfZXhpdF9ob3N0cyh2b2lkKTsKKworLyogc2NzaS5jICovCitleHRlcm4gaW50IHNjc2lfZGlzcGF0Y2hfY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CitleHRlcm4gaW50IHNjc2lfc2V0dXBfY29tbWFuZF9mcmVlbGlzdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CitleHRlcm4gdm9pZCBzY3NpX2Rlc3Ryb3lfY29tbWFuZF9mcmVlbGlzdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CitleHRlcm4gdm9pZCBzY3NpX2RvbmUoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK2V4dGVybiBpbnQgc2NzaV9yZXRyeV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CitleHRlcm4gaW50IHNjc2lfaW5zZXJ0X3NwZWNpYWxfcmVxKHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEsIGludCk7CitleHRlcm4gdm9pZCBzY3NpX2luaXRfY21kX2Zyb21fcmVxKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSk7CitleHRlcm4gdm9pZCBfX3Njc2lfcmVsZWFzZV9yZXF1ZXN0KHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEpOworZXh0ZXJuIHZvaWQgX19zY3NpX2RvbmUoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKKyNpZmRlZiBDT05GSUdfU0NTSV9MT0dHSU5HCit2b2lkIHNjc2lfbG9nX3NlbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK3ZvaWQgc2NzaV9sb2dfY29tcGxldGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCBkaXNwb3NpdGlvbik7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHNjc2lfbG9nX3NlbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKSAKKwl7IH07CitzdGF0aWMgaW5saW5lIHZvaWQgc2NzaV9sb2dfY29tcGxldGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCBkaXNwb3NpdGlvbikKKwl7IH07CisjZW5kaWYKKworLyogc2NzaV9kZXZpbmZvLmMgKi8KK2V4dGVybiBpbnQgc2NzaV9nZXRfZGV2aWNlX2ZsYWdzKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKKwkJCQkgdW5zaWduZWQgY2hhciAqdmVuZG9yLCB1bnNpZ25lZCBjaGFyICptb2RlbCk7CitleHRlcm4gaW50IF9faW5pdCBzY3NpX2luaXRfZGV2aW5mbyh2b2lkKTsKK2V4dGVybiB2b2lkIHNjc2lfZXhpdF9kZXZpbmZvKHZvaWQpOworCisvKiBzY3NpX2Vycm9yLmMgKi8KK2V4dGVybiB2b2lkIHNjc2lfdGltZXNfb3V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CitleHRlcm4gaW50IHNjc2lfZXJyb3JfaGFuZGxlcih2b2lkICpob3N0KTsKK2V4dGVybiBpbnQgc2NzaV9kZWNpZGVfZGlzcG9zaXRpb24oc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK2V4dGVybiB2b2lkIHNjc2lfZWhfd2FrZXVwKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKK2V4dGVybiBpbnQgc2NzaV9laF9zY21kX2FkZChzdHJ1Y3Qgc2NzaV9jbW5kICosIGludCk7CisKKy8qIHNjc2lfbGliLmMgKi8KK2V4dGVybiBpbnQgc2NzaV9tYXliZV91bmJsb2NrX2hvc3Qoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KTsKK2V4dGVybiB2b2lkIHNjc2lfc2V0dXBfY21kX3JldHJ5KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CitleHRlcm4gdm9pZCBzY3NpX2RldmljZV91bmJ1c3koc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KTsKK2V4dGVybiBpbnQgc2NzaV9xdWV1ZV9pbnNlcnQoc3RydWN0IHNjc2lfY21uZCAqY21kLCBpbnQgcmVhc29uKTsKK2V4dGVybiB2b2lkIHNjc2lfbmV4dF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CitleHRlcm4gdm9pZCBzY3NpX3J1bl9ob3N0X3F1ZXVlcyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CitleHRlcm4gc3RydWN0IHJlcXVlc3RfcXVldWUgKnNjc2lfYWxsb2NfcXVldWUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KTsKK2V4dGVybiB2b2lkIHNjc2lfZnJlZV9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CitleHRlcm4gaW50IHNjc2lfaW5pdF9xdWV1ZSh2b2lkKTsKK2V4dGVybiB2b2lkIHNjc2lfZXhpdF9xdWV1ZSh2b2lkKTsKKworLyogc2NzaV9wcm9jLmMgKi8KKyNpZmRlZiBDT05GSUdfU0NTSV9QUk9DX0ZTCitleHRlcm4gdm9pZCBzY3NpX3Byb2NfaG9zdGRpcl9hZGQoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqKTsKK2V4dGVybiB2b2lkIHNjc2lfcHJvY19ob3N0ZGlyX3JtKHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKik7CitleHRlcm4gdm9pZCBzY3NpX3Byb2NfaG9zdF9hZGQoc3RydWN0IFNjc2lfSG9zdCAqKTsKK2V4dGVybiB2b2lkIHNjc2lfcHJvY19ob3N0X3JtKHN0cnVjdCBTY3NpX0hvc3QgKik7CitleHRlcm4gaW50IHNjc2lfaW5pdF9wcm9jZnModm9pZCk7CitleHRlcm4gdm9pZCBzY3NpX2V4aXRfcHJvY2ZzKHZvaWQpOworI2Vsc2UKKyMgZGVmaW5lIHNjc2lfcHJvY19ob3N0ZGlyX2FkZChzaHQpCWRvIHsgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIHNjc2lfcHJvY19ob3N0ZGlyX3JtKHNodCkJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgc2NzaV9wcm9jX2hvc3RfYWRkKHNob3N0KQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSBzY3NpX3Byb2NfaG9zdF9ybShzaG9zdCkJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgc2NzaV9pbml0X3Byb2NmcygpCQkoMCkKKyMgZGVmaW5lIHNjc2lfZXhpdF9wcm9jZnMoKQkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKy8qIHNjc2lfc2Nhbi5jICovCitleHRlcm4gaW50IHNjc2lfc2Nhbl9ob3N0X3NlbGVjdGVkKHN0cnVjdCBTY3NpX0hvc3QgKiwgdW5zaWduZWQgaW50LAorCQkJCSAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBpbnQpOworZXh0ZXJuIHZvaWQgc2NzaV9mb3JnZXRfaG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICopOworZXh0ZXJuIHZvaWQgc2NzaV9yZXNjYW5fZGV2aWNlKHN0cnVjdCBkZXZpY2UgKik7CisKKy8qIHNjc2lfc3lzY3RsLmMgKi8KKyNpZmRlZiBDT05GSUdfU1lTQ1RMCitleHRlcm4gaW50IHNjc2lfaW5pdF9zeXNjdGwodm9pZCk7CitleHRlcm4gdm9pZCBzY3NpX2V4aXRfc3lzY3RsKHZvaWQpOworI2Vsc2UKKyMgZGVmaW5lIHNjc2lfaW5pdF9zeXNjdGwoKQkJKDApCisjIGRlZmluZSBzY3NpX2V4aXRfc3lzY3RsKCkJCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCisKKy8qIHNjc2lfc3lzZnMuYyAqLworZXh0ZXJuIHZvaWQgc2NzaV9kZXZpY2VfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqKTsKK2V4dGVybiBpbnQgc2NzaV9zeXNmc19hZGRfc2RldihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CitleHRlcm4gaW50IHNjc2lfc3lzZnNfYWRkX2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqKTsKK2V4dGVybiBpbnQgc2NzaV9zeXNmc19yZWdpc3Rlcih2b2lkKTsKK2V4dGVybiB2b2lkIHNjc2lfc3lzZnNfdW5yZWdpc3Rlcih2b2lkKTsKK2V4dGVybiB2b2lkIHNjc2lfc3lzZnNfZGV2aWNlX2luaXRpYWxpemUoc3RydWN0IHNjc2lfZGV2aWNlICopOworZXh0ZXJuIGludCBzY3NpX3N5c2ZzX3RhcmdldF9pbml0aWFsaXplKHN0cnVjdCBzY3NpX2RldmljZSAqKTsKK2V4dGVybiBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgYmxhbmtfdHJhbnNwb3J0X3RlbXBsYXRlOworCitleHRlcm4gc3RydWN0IGNsYXNzIHNkZXZfY2xhc3M7CitleHRlcm4gc3RydWN0IGJ1c190eXBlIHNjc2lfYnVzX3R5cGU7CisKKy8qIAorICogaW50ZXJuYWwgc2NzaSB0aW1lb3V0IGZ1bmN0aW9uczogZm9yIHVzZSBieSBtaWQtbGF5ZXIgYW5kIHRyYW5zcG9ydAorICogY2xhc3Nlcy4KKyAqLworCisjZGVmaW5lIFNDU0lfREVWSUNFX0JMT0NLX01BWF9USU1FT1VUCShIWio2MCkKK2V4dGVybiBpbnQgc2NzaV9pbnRlcm5hbF9kZXZpY2VfYmxvY2soc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KTsKK2V4dGVybiBpbnQgc2NzaV9pbnRlcm5hbF9kZXZpY2VfdW5ibG9jayhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOworCisjZW5kaWYgLyogX1NDU0lfUFJJVl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9wcm9jLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUwOTU4YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3Byb2MuYwpAQCAtMCwwICsxLDMzNiBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvc2NzaS9zY3NpX3Byb2MuYworICoKKyAqIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIHByb3ZpZGUgYW4gaW50ZXJmYWNlIGJldHdlZW4KKyAqIHRoZSBQUk9DIGZpbGUgc3lzdGVtIGFuZCB0aGUgU0NTSSBkZXZpY2UgZHJpdmVycworICogSXQgaXMgbWFpbmx5IHVzZWQgZm9yIGRlYnVnZ2luZywgc3RhdGlzdGljcyBhbmQgdG8gcGFzcyAKKyAqIGluZm9ybWF0aW9uIGRpcmVjdGx5IHRvIHRoZSBsb3dsZXZlbCBkcml2ZXIuCisgKgorICogKGMpIDE5OTUgTWljaGFlbCBOZXVmZmVyIG5ldWZmZXJAZ29vZnkuemR2LnVuaS1tYWluei5kZSAKKyAqIFZlcnNpb246IDAuOTkuOCAgIGxhc3QgY2hhbmdlOiA5NS8wOS8xMworICogCisgKiBnZW5lcmljIGNvbW1hbmQgcGFyc2VyIHByb3ZpZGVkIGJ5OiAKKyAqIEFuZHJlYXMgSGVpbHdhZ2VuIDxjcmFzaGNhckBpbmZvcm1hdGlrLnVuaS1rb2JsZW56LmRlPgorICoKKyAqIGdlbmVyaWNfcHJvY19pbmZvKCkgc3VwcG9ydCBvZiB4eHh4X2luZm8oKSBieToKKyAqIE1pY2hhZWwgQS4gR3JpZmZpdGggPGdyaWZAYWNtLm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSAic2NzaV9wcml2LmgiCisjaW5jbHVkZSAic2NzaV9sb2dnaW5nLmgiCisKKworLyogNEsgcGFnZSBzaXplLCBidXQgb3VyIG91dHB1dCByb3V0aW5lcywgdXNlIHNvbWUgc2xhY2sgZm9yIG92ZXJydW5zICovCisjZGVmaW5lIFBST0NfQkxPQ0tfU0laRSAoMyoxMDI0KQorCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3Njc2k7CisKKy8qIFByb3RlY3Qgc2h0LT5wcmVzZW50IGFuZCBzaHQtPnByb2NfZGlyICovCitzdGF0aWMgREVDTEFSRV9NVVRFWChnbG9iYWxfaG9zdF90ZW1wbGF0ZV9zZW0pOworCitzdGF0aWMgaW50IHByb2Nfc2NzaV9yZWFkKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkgIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGF0YTsKKwlpbnQgbjsKKworCW4gPSBzaG9zdC0+aG9zdHQtPnByb2NfaW5mbyhzaG9zdCwgYnVmZmVyLCBzdGFydCwgb2Zmc2V0LCBsZW5ndGgsIDApOworCSplb2YgPSAobiA8IGxlbmd0aCk7CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBwcm9jX3Njc2lfd3JpdGVfcHJvYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkYXRhOworCXNzaXplX3QgcmV0ID0gLUVOT01FTTsKKwljaGFyICpwYWdlOworCWNoYXIgKnN0YXJ0OworICAgIAorCWlmIChjb3VudCA+IFBST0NfQkxPQ0tfU0laRSkKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisKKwlwYWdlID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKHBhZ2UpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHBhZ2UsIGJ1ZiwgY291bnQpKQorCQkJZ290byBvdXQ7CisJCXJldCA9IHNob3N0LT5ob3N0dC0+cHJvY19pbmZvKHNob3N0LCBwYWdlLCAmc3RhcnQsIDAsIGNvdW50LCAxKTsKKwl9CitvdXQ6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgc2NzaV9wcm9jX2hvc3RkaXJfYWRkKHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCkKK3sKKwlpZiAoIXNodC0+cHJvY19pbmZvKQorCQlyZXR1cm47CisKKwlkb3duKCZnbG9iYWxfaG9zdF90ZW1wbGF0ZV9zZW0pOworCWlmICghc2h0LT5wcmVzZW50KyspIHsKKwkJc2h0LT5wcm9jX2RpciA9IHByb2NfbWtkaXIoc2h0LT5wcm9jX25hbWUsIHByb2Nfc2NzaSk7CisgICAgICAgIAlpZiAoIXNodC0+cHJvY19kaXIpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwcm9jX21rZGlyIGZhaWxlZCBmb3IgJXNcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBzaHQtPnByb2NfbmFtZSk7CisJCWVsc2UKKwkJCXNodC0+cHJvY19kaXItPm93bmVyID0gc2h0LT5tb2R1bGU7CisJfQorCXVwKCZnbG9iYWxfaG9zdF90ZW1wbGF0ZV9zZW0pOworfQorCit2b2lkIHNjc2lfcHJvY19ob3N0ZGlyX3JtKHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCkKK3sKKwlpZiAoIXNodC0+cHJvY19pbmZvKQorCQlyZXR1cm47CisKKwlkb3duKCZnbG9iYWxfaG9zdF90ZW1wbGF0ZV9zZW0pOworCWlmICghLS1zaHQtPnByZXNlbnQgJiYgc2h0LT5wcm9jX2RpcikgeworCQlyZW1vdmVfcHJvY19lbnRyeShzaHQtPnByb2NfbmFtZSwgcHJvY19zY3NpKTsKKwkJc2h0LT5wcm9jX2RpciA9IE5VTEw7CisJfQorCXVwKCZnbG9iYWxfaG9zdF90ZW1wbGF0ZV9zZW0pOworfQorCit2b2lkIHNjc2lfcHJvY19ob3N0X2FkZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQgPSBzaG9zdC0+aG9zdHQ7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwOworCWNoYXIgbmFtZVsxMF07CisKKwlpZiAoIXNodC0+cHJvY19kaXIpCisJCXJldHVybjsKKworCXNwcmludGYobmFtZSwiJWQiLCBzaG9zdC0+aG9zdF9ubyk7CisJcCA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkobmFtZSwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJc2h0LT5wcm9jX2RpciwgcHJvY19zY3NpX3JlYWQsIHNob3N0KTsKKwlpZiAoIXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIGhvc3QgJWQgaW4iCisJCSAgICAgICAiJXNcbiIsIF9fRlVOQ1RJT05fXywgc2hvc3QtPmhvc3Rfbm8sCisJCSAgICAgICBzaHQtPnByb2NfbmFtZSk7CisJCXJldHVybjsKKwl9IAorCisJcC0+d3JpdGVfcHJvYyA9IHByb2Nfc2NzaV93cml0ZV9wcm9jOworCXAtPm93bmVyID0gc2h0LT5tb2R1bGU7Cit9CisKK3ZvaWQgc2NzaV9wcm9jX2hvc3Rfcm0oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJY2hhciBuYW1lWzEwXTsKKworCWlmICghc2hvc3QtPmhvc3R0LT5wcm9jX2RpcikKKwkJcmV0dXJuOworCisJc3ByaW50ZihuYW1lLCIlZCIsIHNob3N0LT5ob3N0X25vKTsKKwlyZW1vdmVfcHJvY19lbnRyeShuYW1lLCBzaG9zdC0+aG9zdHQtPnByb2NfZGlyKTsKK30KKworc3RhdGljIGludCBwcm9jX3ByaW50X3Njc2lkZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJc3RydWN0IHNlcV9maWxlICpzID0gZGF0YTsKKwlpbnQgaTsKKworCXNlcV9wcmludGYocywKKwkJIkhvc3Q6IHNjc2klZCBDaGFubmVsOiAlMDJkIElkOiAlMDJkIEx1bjogJTAyZFxuICBWZW5kb3I6ICIsCisJCXNkZXYtPmhvc3QtPmhvc3Rfbm8sIHNkZXYtPmNoYW5uZWwsIHNkZXYtPmlkLCBzZGV2LT5sdW4pOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKHNkZXYtPnZlbmRvcltpXSA+PSAweDIwKQorCQkJc2VxX3ByaW50ZihzLCAiJWMiLCBzZGV2LT52ZW5kb3JbaV0pOworCQllbHNlCisJCQlzZXFfcHJpbnRmKHMsICIgIik7CisJfQorCisJc2VxX3ByaW50ZihzLCAiIE1vZGVsOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlpZiAoc2Rldi0+bW9kZWxbaV0gPj0gMHgyMCkKKwkJCXNlcV9wcmludGYocywgIiVjIiwgc2Rldi0+bW9kZWxbaV0pOworCQllbHNlCisJCQlzZXFfcHJpbnRmKHMsICIgIik7CisJfQorCisJc2VxX3ByaW50ZihzLCAiIFJldjogIik7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAoc2Rldi0+cmV2W2ldID49IDB4MjApCisJCQlzZXFfcHJpbnRmKHMsICIlYyIsIHNkZXYtPnJldltpXSk7CisJCWVsc2UKKwkJCXNlcV9wcmludGYocywgIiAiKTsKKwl9CisKKwlzZXFfcHJpbnRmKHMsICJcbiIpOworCisJc2VxX3ByaW50ZihzLCAiICBUeXBlOiAgICVzICIsCisJCSAgICAgc2Rldi0+dHlwZSA8IE1BWF9TQ1NJX0RFVklDRV9DT0RFID8KKwkgICAgICAgc2NzaV9kZXZpY2VfdHlwZXNbKGludCkgc2Rldi0+dHlwZV0gOiAiVW5rbm93biAgICAgICAgICAiKTsKKwlzZXFfcHJpbnRmKHMsICIgICAgICAgICAgICAgICBBTlNJIgorCQkgICAgICIgU0NTSSByZXZpc2lvbjogJTAyeCIsIChzZGV2LT5zY3NpX2xldmVsIC0gMSkgPworCQkgICAgIHNkZXYtPnNjc2lfbGV2ZWwgLSAxIDogMSk7CisJaWYgKHNkZXYtPnNjc2lfbGV2ZWwgPT0gMikKKwkJc2VxX3ByaW50ZihzLCAiIENDU1xuIik7CisJZWxzZQorCQlzZXFfcHJpbnRmKHMsICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NzaV9hZGRfc2luZ2xlX2RldmljZSh1aW50IGhvc3QsIHVpbnQgY2hhbm5lbCwgdWludCBpZCwgdWludCBsdW4pCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJaW50IGVycm9yID0gLUVOWElPOworCisJc2hvc3QgPSBzY3NpX2hvc3RfbG9va3VwKGhvc3QpOworCWlmIChJU19FUlIoc2hvc3QpKQorCQlyZXR1cm4gUFRSX0VSUihzaG9zdCk7CisKKwllcnJvciA9IHNjc2lfc2Nhbl9ob3N0X3NlbGVjdGVkKHNob3N0LCBjaGFubmVsLCBpZCwgbHVuLCAxKTsKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgc2NzaV9yZW1vdmVfc2luZ2xlX2RldmljZSh1aW50IGhvc3QsIHVpbnQgY2hhbm5lbCwgdWludCBpZCwgdWludCBsdW4pCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCWludCBlcnJvciA9IC1FTlhJTzsKKworCXNob3N0ID0gc2NzaV9ob3N0X2xvb2t1cChob3N0KTsKKwlpZiAoSVNfRVJSKHNob3N0KSkKKwkJcmV0dXJuIFBUUl9FUlIoc2hvc3QpOworCXNkZXYgPSBzY3NpX2RldmljZV9sb29rdXAoc2hvc3QsIGNoYW5uZWwsIGlkLCBsdW4pOworCWlmIChzZGV2KSB7CisJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2KTsKKwkJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOworCQllcnJvciA9IDA7CisJfQorCisJc2NzaV9ob3N0X3B1dChzaG9zdCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgc3NpemVfdCBwcm9jX3Njc2lfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICAgc2l6ZV90IGxlbmd0aCwgbG9mZl90ICpwcG9zKQoreworCWludCBob3N0LCBjaGFubmVsLCBpZCwgbHVuOworCWNoYXIgKmJ1ZmZlciwgKnA7CisJaW50IGVycjsKKworCWlmICghYnVmIHx8IGxlbmd0aCA+IFBBR0VfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidWZmZXIgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnIgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcihidWZmZXIsIGJ1ZiwgbGVuZ3RoKSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRUlOVkFMOworCWlmIChsZW5ndGggPCBQQUdFX1NJWkUpCisJCWJ1ZmZlcltsZW5ndGhdID0gJ1wwJzsKKwllbHNlIGlmIChidWZmZXJbUEFHRV9TSVpFLTFdKQorCQlnb3RvIG91dDsKKworCS8qCisJICogVXNhZ2U6IGVjaG8gInNjc2kgYWRkLXNpbmdsZS1kZXZpY2UgMCAxIDIgMyIgPi9wcm9jL3Njc2kvc2NzaQorCSAqIHdpdGggICIwIDEgMiAzIiByZXBsYWNlZCBieSB5b3VyICJIb3N0IENoYW5uZWwgSWQgTHVuIi4KKwkgKi8KKwlpZiAoIXN0cm5jbXAoInNjc2kgYWRkLXNpbmdsZS1kZXZpY2UiLCBidWZmZXIsIDIyKSkgeworCQlwID0gYnVmZmVyICsgMjM7CisKKwkJaG9zdCA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAwKTsKKwkJY2hhbm5lbCA9IHNpbXBsZV9zdHJ0b3VsKHAgKyAxLCAmcCwgMCk7CisJCWlkID0gc2ltcGxlX3N0cnRvdWwocCArIDEsICZwLCAwKTsKKwkJbHVuID0gc2ltcGxlX3N0cnRvdWwocCArIDEsICZwLCAwKTsKKworCQllcnIgPSBzY3NpX2FkZF9zaW5nbGVfZGV2aWNlKGhvc3QsIGNoYW5uZWwsIGlkLCBsdW4pOworCQlpZiAoZXJyID49IDApCisJCQllcnIgPSBsZW5ndGg7CisKKwkvKgorCSAqIFVzYWdlOiBlY2hvICJzY3NpIHJlbW92ZS1zaW5nbGUtZGV2aWNlIDAgMSAyIDMiID4vcHJvYy9zY3NpL3Njc2kKKwkgKiB3aXRoICAiMCAxIDIgMyIgcmVwbGFjZWQgYnkgeW91ciAiSG9zdCBDaGFubmVsIElkIEx1biIuCisJICovCisJfSBlbHNlIGlmICghc3RybmNtcCgic2NzaSByZW1vdmUtc2luZ2xlLWRldmljZSIsIGJ1ZmZlciwgMjUpKSB7CisJCXAgPSBidWZmZXIgKyAyNjsKKworCQlob3N0ID0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDApOworCQljaGFubmVsID0gc2ltcGxlX3N0cnRvdWwocCArIDEsICZwLCAwKTsKKwkJaWQgPSBzaW1wbGVfc3RydG91bChwICsgMSwgJnAsIDApOworCQlsdW4gPSBzaW1wbGVfc3RydG91bChwICsgMSwgJnAsIDApOworCisJCWVyciA9IHNjc2lfcmVtb3ZlX3NpbmdsZV9kZXZpY2UoaG9zdCwgY2hhbm5lbCwgaWQsIGx1bik7CisJfQorCisgb3V0OgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWZmZXIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19zY3NpX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQoreworCXNlcV9wcmludGYocywgIkF0dGFjaGVkIGRldmljZXM6XG4iKTsKKwlidXNfZm9yX2VhY2hfZGV2KCZzY3NpX2J1c190eXBlLCBOVUxMLCBzLCBwcm9jX3ByaW50X3Njc2lkZXZpY2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nfc2NzaV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qCisJICogV2UgZG9uJ3QgcmVhbGx5IG5lZWRzIHRoaXMgZm9yIHRoZSB3cml0ZSBjYXNlIGJ1dCBpdCBkb2Vzbid0CisJICogaGFybSBlaXRoZXIuCisJICovCisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHByb2Nfc2NzaV9zaG93LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zY3NpX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gcHJvY19zY3NpX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLndyaXRlCQk9IHByb2Nfc2NzaV93cml0ZSwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworaW50IF9faW5pdCBzY3NpX2luaXRfcHJvY2ZzKHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGU7CisKKwlwcm9jX3Njc2kgPSBwcm9jX21rZGlyKCJzY3NpIiwgTlVMTCk7CisJaWYgKCFwcm9jX3Njc2kpCisJCWdvdG8gZXJyMTsKKworCXBkZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJzY3NpL3Njc2kiLCAwLCBOVUxMKTsKKwlpZiAoIXBkZSkKKwkJZ290byBlcnIyOworCXBkZS0+cHJvY19mb3BzID0gJnByb2Nfc2NzaV9vcGVyYXRpb25zOworCisJcmV0dXJuIDA7CisKK2VycjI6CisJcmVtb3ZlX3Byb2NfZW50cnkoInNjc2kiLCBOVUxMKTsKK2VycjE6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3ZvaWQgc2NzaV9leGl0X3Byb2Nmcyh2b2lkKQoreworCXJlbW92ZV9wcm9jX2VudHJ5KCJzY3NpL3Njc2kiLCBOVUxMKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgic2NzaSIsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YTM3YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKQEAgLTAsMCArMSwxNDczIEBACisvKgorICogc2NzaV9zY2FuLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgRXJpYyBZb3VuZ2RhbGUsCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUGF0cmljayBNYW5zZmllbGQKKyAqCisgKiBUaGUgZ2VuZXJhbCBzY2FubmluZy9wcm9iaW5nIGFsZ29yaXRobSBpcyBhcyBmb2xsb3dzLCBleGNlcHRpb25zIGFyZQorICogbWFkZSB0byBpdCBkZXBlbmRpbmcgb24gZGV2aWNlIHNwZWNpZmljIGZsYWdzLCBjb21waWxhdGlvbiBvcHRpb25zLCBhbmQKKyAqIGdsb2JhbCB2YXJpYWJsZSAoYm9vdCBvciBtb2R1bGUgbG9hZCB0aW1lKSBzZXR0aW5ncy4KKyAqCisgKiBBIHNwZWNpZmljIExVTiBpcyBzY2FubmVkIHZpYSBhbiBJTlFVSVJZIGNvbW1hbmQ7IGlmIHRoZSBMVU4gaGFzIGEKKyAqIGRldmljZSBhdHRhY2hlZCwgYSBTY3NpX0RldmljZSBpcyBhbGxvY2F0ZWQgYW5kIHNldHVwIGZvciBpdC4KKyAqCisgKiBGb3IgZXZlcnkgaWQgb2YgZXZlcnkgY2hhbm5lbCBvbiB0aGUgZ2l2ZW4gaG9zdDoKKyAqCisgKiAJU2NhbiBMVU4gMDsgaWYgdGhlIHRhcmdldCByZXNwb25kcyB0byBMVU4gMCAoZXZlbiBpZiB0aGVyZSBpcyBubworICogCWRldmljZSBvciBzdG9yYWdlIGF0dGFjaGVkIHRvIExVTiAwKToKKyAqCisgKiAJCUlmIExVTiAwIGhhcyBhIGRldmljZSBhdHRhY2hlZCwgYWxsb2NhdGUgYW5kIHNldHVwIGEKKyAqIAkJU2NzaV9EZXZpY2UgZm9yIGl0LgorICoKKyAqIAkJSWYgdGFyZ2V0IGlzIFNDU0ktMyBvciB1cCwgaXNzdWUgYSBSRVBPUlQgTFVOLCBhbmQgc2NhbgorICogCQlhbGwgb2YgdGhlIExVTnMgcmV0dXJuZWQgYnkgdGhlIFJFUE9SVCBMVU47IGVsc2UsCisgKiAJCXNlcXVlbnRpYWxseSBzY2FuIExVTnMgdXAgdW50aWwgc29tZSBtYXhpbXVtIGlzIHJlYWNoZWQsCisgKiAJCW9yIGEgTFVOIGlzIHNlZW4gdGhhdCBjYW5ub3QgaGF2ZSBhIGRldmljZSBhdHRhY2hlZCB0byBpdC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aW5mby5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3JlcXVlc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CisKKyNpbmNsdWRlICJzY3NpX3ByaXYuaCIKKyNpbmNsdWRlICJzY3NpX2xvZ2dpbmcuaCIKKworI2RlZmluZSBBTExPQ19GQUlMVVJFX01TRwlLRVJOX0VSUiAiJXM6IEFsbG9jYXRpb24gZmFpbHVyZSBkdXJpbmciIFwKKwkiIFNDU0kgc2Nhbm5pbmcsIHNvbWUgU0NTSSBkZXZpY2VzIG1pZ2h0IG5vdCBiZSBjb25maWd1cmVkXG4iCisKKy8qCisgKiBEZWZhdWx0IHRpbWVvdXQKKyAqLworI2RlZmluZSBTQ1NJX1RJTUVPVVQgKDIqSFopCisKKy8qCisgKiBQcmVmaXggdmFsdWVzIGZvciB0aGUgU0NTSSBpZCdzIChzdG9yZWQgaW4gZHJpdmVyZnMgbmFtZSBmaWVsZCkKKyAqLworI2RlZmluZSBTQ1NJX1VJRF9TRVJfTlVNICdTJworI2RlZmluZSBTQ1NJX1VJRF9VTktOT1dOICdaJworCisvKgorICogUmV0dXJuIHZhbHVlcyBvZiBzb21lIG9mIHRoZSBzY2FubmluZyBmdW5jdGlvbnMuCisgKgorICogU0NTSV9TQ0FOX05PX1JFU1BPTlNFOiBubyB2YWxpZCByZXNwb25zZSByZWNlaXZlZCBmcm9tIHRoZSB0YXJnZXQsIHRoaXMKKyAqIGluY2x1ZGVzIGFsbG9jYXRpb24gb3IgZ2VuZXJhbCBmYWlsdXJlcyBwcmV2ZW50aW5nIElPIGZyb20gYmVpbmcgc2VudC4KKyAqCisgKiBTQ1NJX1NDQU5fVEFSR0VUX1BSRVNFTlQ6IHRhcmdldCByZXNwb25kZWQsIGJ1dCBubyBkZXZpY2UgaXMgYXZhaWxhYmxlCisgKiBvbiB0aGUgZ2l2ZW4gTFVOLgorICoKKyAqIFNDU0lfU0NBTl9MVU5fUFJFU0VOVDogdGFyZ2V0IHJlc3BvbmRlZCwgYW5kIGEgZGV2aWNlIGlzIGF2YWlsYWJsZSBvbiBhCisgKiBnaXZlbiBMVU4uCisgKi8KKyNkZWZpbmUgU0NTSV9TQ0FOX05PX1JFU1BPTlNFCQkwCisjZGVmaW5lIFNDU0lfU0NBTl9UQVJHRVRfUFJFU0VOVAkxCisjZGVmaW5lIFNDU0lfU0NBTl9MVU5fUFJFU0VOVAkJMgorCitzdGF0aWMgY2hhciAqc2NzaV9udWxsX2RldmljZV9zdHJzID0gIm51bGxudWxsbnVsbG51bGwiOworCisjZGVmaW5lIE1BWF9TQ1NJX0xVTlMJNTEyCisKKyNpZmRlZiBDT05GSUdfU0NTSV9NVUxUSV9MVU4KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X3Njc2lfbHVucyA9IE1BWF9TQ1NJX0xVTlM7CisjZWxzZQorc3RhdGljIHVuc2lnbmVkIGludCBtYXhfc2NzaV9sdW5zID0gMTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW1fbmFtZWQobWF4X2x1bnMsIG1heF9zY3NpX2x1bnMsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2x1bnMsCisJCSAibGFzdCBzY3NpIExVTiAoc2hvdWxkIGJlIGJldHdlZW4gMSBhbmQgMl4zMi0xKSIpOworCisvKgorICogbWF4X3Njc2lfcmVwb3J0X2x1bnM6IHRoZSBtYXhpbXVtIG51bWJlciBvZiBMVU5TIHRoYXQgd2lsbCBiZQorICogcmV0dXJuZWQgZnJvbSB0aGUgUkVQT1JUIExVTlMgY29tbWFuZC4gOCB0aW1lcyB0aGlzIHZhbHVlIG11c3QKKyAqIGJlIGFsbG9jYXRlZC4gSW4gdGhlb3J5IHRoaXMgY291bGQgYmUgdXAgdG8gYW4gOCBieXRlIHZhbHVlLCBidXQKKyAqIGluIHByYWN0aWNlLCB0aGUgbWF4aW11bSBudW1iZXIgb2YgTFVOcyBzdXBwb3JlZCBieSBhbnkgZGV2aWNlCisgKiBpcyBhYm91dCAxNmsuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X3Njc2lfcmVwb3J0X2x1bnMgPSA1MTE7CisKK21vZHVsZV9wYXJhbV9uYW1lZChtYXhfcmVwb3J0X2x1bnMsIG1heF9zY3NpX3JlcG9ydF9sdW5zLCBpbnQsIFNfSVJVR098U19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9yZXBvcnRfbHVucywKKwkJICJSRVBPUlQgTFVOUyBtYXhpbXVtIG51bWJlciBvZiBMVU5TIHJlY2VpdmVkIChzaG91bGQgYmUiCisJCSAiIGJldHdlZW4gMSBhbmQgMTYzODQpIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2NzaV9pbnFfdGltZW91dCA9IFNDU0lfVElNRU9VVC9IWiszOworCittb2R1bGVfcGFyYW1fbmFtZWQoaW5xX3RpbWVvdXQsIHNjc2lfaW5xX3RpbWVvdXQsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoaW5xX3RpbWVvdXQsIAorCQkgIlRpbWVvdXQgKGluIHNlY29uZHMpIHdhaXRpbmcgZm9yIGRldmljZXMgdG8gYW5zd2VyIElOUVVJUlkuIgorCQkgIiBEZWZhdWx0IGlzIDUuIFNvbWUgbm9uLWNvbXBsaWFudCBkZXZpY2VzIG5lZWQgbW9yZS4iKTsKKworLyoqCisgKiBzY3NpX3VubG9ja19mbG9wdGljYWwgLSB1bmxvY2sgZGV2aWNlIHZpYSBhIHNwZWNpYWwgTU9ERSBTRU5TRSBjb21tYW5kCisgKiBAc3JlcToJdXNlZCB0byBzZW5kIHRoZSBjb21tYW5kCisgKiBAcmVzdWx0OglhcmVhIHRvIHN0b3JlIHRoZSByZXN1bHQgb2YgdGhlIE1PREUgU0VOU0UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgICBTZW5kIGEgdmVuZG9yIHNwZWNpZmljIE1PREUgU0VOU0UgKG5vdCBhIE1PREUgU0VMRUNUKSBjb21tYW5kIHVzaW5nCisgKiAgICAgQHNyZXEgdG8gdW5sb2NrIGEgZGV2aWNlLCBzdG9yaW5nIHRoZSAodW51c2VkKSByZXN1bHRzIGludG8gcmVzdWx0LgorICogICAgIENhbGxlZCBmb3IgQkxJU1RfS0VZIGRldmljZXMuCisgKiovCitzdGF0aWMgdm9pZCBzY3NpX3VubG9ja19mbG9wdGljYWwoc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKnJlc3VsdCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNjc2lfY21kW01BWF9DT01NQU5EX1NJWkVdOworCisJcHJpbnRrKEtFUk5fTk9USUNFICJzY3NpOiB1bmxvY2tpbmcgZmxvcHRpY2FsIGRyaXZlXG4iKTsKKwlzY3NpX2NtZFswXSA9IE1PREVfU0VOU0U7CisJc2NzaV9jbWRbMV0gPSAwOworCXNjc2lfY21kWzJdID0gMHgyZTsKKwlzY3NpX2NtZFszXSA9IDA7CisJc2NzaV9jbWRbNF0gPSAweDJhOwkvKiBzaXplICovCisJc2NzaV9jbWRbNV0gPSAwOworCXNyZXEtPnNyX2NtZF9sZW4gPSAwOworCXNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCXNjc2lfd2FpdF9yZXEoc3JlcSwgc2NzaV9jbWQsIHJlc3VsdCwgMHgyYSAvKiBzaXplICovLCBTQ1NJX1RJTUVPVVQsIDMpOworfQorCisvKioKKyAqIHByaW50X2lucXVpcnkgLSBwcmludGsgdGhlIGlucXVpcnkgaW5mb3JtYXRpb24KKyAqIEBpbnFfcmVzdWx0OglwcmludGsgdGhpcyBTQ1NJIElOUVVJUlkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgICBwcmludGsgdGhlIHZlbmRvciwgbW9kZWwsIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGUKKyAqICAgICBJTlFVSVJZIGRhdGEgaW4gQGlucV9yZXN1bHQuCisgKgorICogTm90ZXM6CisgKiAgICAgUmVtb3ZlIHRoaXMsIGFuZCByZXBsYWNlIHdpdGggYSBob3RwbHVnIGV2ZW50IHRoYXQgbG9ncyBhbnkKKyAqICAgICByZWxldmFudCBpbmZvcm1hdGlvbi4KKyAqKi8KK3N0YXRpYyB2b2lkIHByaW50X2lucXVpcnkodW5zaWduZWQgY2hhciAqaW5xX3Jlc3VsdCkKK3sKKwlpbnQgaTsKKworCXByaW50ayhLRVJOX05PVElDRSAiICBWZW5kb3I6ICIpOworCWZvciAoaSA9IDg7IGkgPCAxNjsgaSsrKQorCQlpZiAoaW5xX3Jlc3VsdFtpXSA+PSAweDIwICYmIGkgPCBpbnFfcmVzdWx0WzRdICsgNSkKKwkJCXByaW50aygiJWMiLCBpbnFfcmVzdWx0W2ldKTsKKwkJZWxzZQorCQkJcHJpbnRrKCIgIik7CisKKwlwcmludGsoIiAgTW9kZWw6ICIpOworCWZvciAoaSA9IDE2OyBpIDwgMzI7IGkrKykKKwkJaWYgKGlucV9yZXN1bHRbaV0gPj0gMHgyMCAmJiBpIDwgaW5xX3Jlc3VsdFs0XSArIDUpCisJCQlwcmludGsoIiVjIiwgaW5xX3Jlc3VsdFtpXSk7CisJCWVsc2UKKwkJCXByaW50aygiICIpOworCisJcHJpbnRrKCIgIFJldjogIik7CisJZm9yIChpID0gMzI7IGkgPCAzNjsgaSsrKQorCQlpZiAoaW5xX3Jlc3VsdFtpXSA+PSAweDIwICYmIGkgPCBpbnFfcmVzdWx0WzRdICsgNSkKKwkJCXByaW50aygiJWMiLCBpbnFfcmVzdWx0W2ldKTsKKwkJZWxzZQorCQkJcHJpbnRrKCIgIik7CisKKwlwcmludGsoIlxuIik7CisKKwlpID0gaW5xX3Jlc3VsdFswXSAmIDB4MWY7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiAgVHlwZTogICAlcyAiLAorCSAgICAgICBpIDwKKwkgICAgICAgTUFYX1NDU0lfREVWSUNFX0NPREUgPyBzY3NpX2RldmljZV90eXBlc1tpXSA6CisJICAgICAgICJVbmtub3duICAgICAgICAgICIpOworCXByaW50aygiICAgICAgICAgICAgICAgICBBTlNJIFNDU0kgcmV2aXNpb246ICUwMngiLAorCSAgICAgICBpbnFfcmVzdWx0WzJdICYgMHgwNyk7CisJaWYgKChpbnFfcmVzdWx0WzJdICYgMHgwNykgPT0gMSAmJiAoaW5xX3Jlc3VsdFszXSAmIDB4MGYpID09IDEpCisJCXByaW50aygiIENDU1xuIik7CisJZWxzZQorCQlwcmludGsoIlxuIik7Cit9CisKKy8qKgorICogc2NzaV9hbGxvY19zZGV2IC0gYWxsb2NhdGUgYW5kIHNldHVwIGEgc2NzaV9EZXZpY2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgICBBbGxvY2F0ZSwgaW5pdGlhbGl6ZSBmb3IgaW8sIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGEgc2NzaV9EZXZpY2UuCisgKiAgICAgU3RvcmVzIHRoZSBAc2hvc3QsIEBjaGFubmVsLCBAaWQsIGFuZCBAbHVuIGluIHRoZSBzY3NpX0RldmljZSwgYW5kCisgKiAgICAgYWRkcyBzY3NpX0RldmljZSB0byB0aGUgYXBwcm9wcmlhdGUgbGlzdC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAgICAgc2NzaV9EZXZpY2UgcG9pbnRlciwgb3IgTlVMTCBvbiBmYWlsdXJlLgorICoqLworc3RhdGljIHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaV9hbGxvY19zZGV2KHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwKKwkJCQkJICAgdW5zaWduZWQgaW50IGx1biwgdm9pZCAqaG9zdGRhdGEpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCWludCBkaXNwbGF5X2ZhaWx1cmVfbXNnID0gMSwgcmV0OworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCisJc2RldiA9IGttYWxsb2Moc2l6ZW9mKCpzZGV2KSArIHNob3N0LT50cmFuc3BvcnR0LT5kZXZpY2Vfc2l6ZSwKKwkJICAgICAgIEdGUF9BVE9NSUMpOworCWlmICghc2RldikKKwkJZ290byBvdXQ7CisKKwltZW1zZXQoc2RldiwgMCwgc2l6ZW9mKCpzZGV2KSk7CisJc2Rldi0+dmVuZG9yID0gc2NzaV9udWxsX2RldmljZV9zdHJzOworCXNkZXYtPm1vZGVsID0gc2NzaV9udWxsX2RldmljZV9zdHJzOworCXNkZXYtPnJldiA9IHNjc2lfbnVsbF9kZXZpY2Vfc3RyczsKKwlzZGV2LT5ob3N0ID0gc2hvc3Q7CisJc2Rldi0+aWQgPSBzdGFyZ2V0LT5pZDsKKwlzZGV2LT5sdW4gPSBsdW47CisJc2Rldi0+Y2hhbm5lbCA9IHN0YXJnZXQtPmNoYW5uZWw7CisJc2Rldi0+c2Rldl9zdGF0ZSA9IFNERVZfQ1JFQVRFRDsKKwlJTklUX0xJU1RfSEVBRCgmc2Rldi0+c2libGluZ3MpOworCUlOSVRfTElTVF9IRUFEKCZzZGV2LT5zYW1lX3RhcmdldF9zaWJsaW5ncyk7CisJSU5JVF9MSVNUX0hFQUQoJnNkZXYtPmNtZF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmc2Rldi0+c3RhcnZlZF9lbnRyeSk7CisJc3Bpbl9sb2NrX2luaXQoJnNkZXYtPmxpc3RfbG9jayk7CisKKwlzZGV2LT5zZGV2X2dlbmRldi5wYXJlbnQgPSBnZXRfZGV2aWNlKCZzdGFyZ2V0LT5kZXYpOworCXNkZXYtPnNkZXZfdGFyZ2V0ID0gc3RhcmdldDsKKworCS8qIHVzdWFsbHkgTlVMTCBhbmQgc2V0IGJ5IC0+c2xhdmVfYWxsb2MgaW5zdGVhZCAqLworCXNkZXYtPmhvc3RkYXRhID0gaG9zdGRhdGE7CisKKwkvKiBpZiB0aGUgZGV2aWNlIG5lZWRzIHRoaXMgY2hhbmdpbmcsIGl0IG1heSBkbyBzbyBpbiB0aGUKKwkgKiBzbGF2ZV9jb25maWd1cmUgZnVuY3Rpb24gKi8KKwlzZGV2LT5tYXhfZGV2aWNlX2Jsb2NrZWQgPSBTQ1NJX0RFRkFVTFRfREVWSUNFX0JMT0NLRUQ7CisKKwkvKgorCSAqIFNvbWUgbG93IGxldmVsIGRyaXZlciBjb3VsZCB1c2UgZGV2aWNlLT50eXBlCisJICovCisJc2Rldi0+dHlwZSA9IC0xOworCisJLyoKKwkgKiBBc3N1bWUgdGhhdCB0aGUgZGV2aWNlIHdpbGwgaGF2ZSBoYW5kc2hha2luZyBwcm9ibGVtcywKKwkgKiBhbmQgdGhlbiBmaXggdGhpcyBmaWVsZCBsYXRlciBpZiBpdCB0dXJucyBvdXQgaXQKKwkgKiBkb2Vzbid0CisJICovCisJc2Rldi0+Ym9ya2VuID0gMTsKKworCXNwaW5fbG9ja19pbml0KCZzZGV2LT5zZGV2X2xvY2spOworCXNkZXYtPnJlcXVlc3RfcXVldWUgPSBzY3NpX2FsbG9jX3F1ZXVlKHNkZXYpOworCWlmICghc2Rldi0+cmVxdWVzdF9xdWV1ZSkgeworCQkvKiByZWxlYXNlIGZuIGlzIHNldCB1cCBpbiBzY3NpX3N5c2ZzX2RldmljZV9pbml0aWFsaXNlLCBzbworCQkgKiBoYXZlIHRvIGZyZWUgYW5kIHB1dCBtYW51YWxseSBoZXJlICovCisJCXB1dF9kZXZpY2UoJnN0YXJnZXQtPmRldik7CisJCWdvdG8gb3V0OworCX0KKworCXNkZXYtPnJlcXVlc3RfcXVldWUtPnF1ZXVlZGF0YSA9IHNkZXY7CisJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RldiwgMCwgc2Rldi0+aG9zdC0+Y21kX3Blcl9sdW4pOworCisJc2NzaV9zeXNmc19kZXZpY2VfaW5pdGlhbGl6ZShzZGV2KTsKKworCWlmIChzaG9zdC0+aG9zdHQtPnNsYXZlX2FsbG9jKSB7CisJCXJldCA9IHNob3N0LT5ob3N0dC0+c2xhdmVfYWxsb2Moc2Rldik7CisJCWlmIChyZXQpIHsKKwkJCS8qCisJCQkgKiBpZiBMTEREIHJlcG9ydHMgc2xhdmUgbm90IHByZXNlbnQsIGRvbid0IGNsdXR0ZXIKKwkJCSAqIGNvbnNvbGUgd2l0aCBhbGxvYyBmYWlsdXJlIG1lc3NhZ2VzCisKKworCQkJICovCisJCQlpZiAocmV0ID09IC1FTlhJTykKKwkJCQlkaXNwbGF5X2ZhaWx1cmVfbXNnID0gMDsKKwkJCWdvdG8gb3V0X2RldmljZV9kZXN0cm95OworCQl9CisJfQorCisJcmV0dXJuIHNkZXY7CisKK291dF9kZXZpY2VfZGVzdHJveToKKwl0cmFuc3BvcnRfZGVzdHJveV9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKKwlzY3NpX2ZyZWVfcXVldWUoc2Rldi0+cmVxdWVzdF9xdWV1ZSk7CisJcHV0X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworb3V0OgorCWlmIChkaXNwbGF5X2ZhaWx1cmVfbXNnKQorCQlwcmludGsoQUxMT0NfRkFJTFVSRV9NU0csIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNjc2lfdGFyZ2V0X2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSBkZXYtPnBhcmVudDsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0b19zY3NpX3RhcmdldChkZXYpOworCWtmcmVlKHN0YXJnZXQpOworCXB1dF9kZXZpY2UocGFyZW50KTsKK30KKworaW50IHNjc2lfaXNfdGFyZ2V0X2RldmljZShjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+cmVsZWFzZSA9PSBzY3NpX3RhcmdldF9kZXZfcmVsZWFzZTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9pc190YXJnZXRfZGV2aWNlKTsKKworc3RhdGljIHN0cnVjdCBzY3NpX3RhcmdldCAqX19zY3NpX2ZpbmRfdGFyZ2V0KHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKKwkJCQkJICAgICAgaW50IGNoYW5uZWwsIHVpbnQgaWQpCit7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LCAqZm91bmRfc3RhcmdldCA9IE5VTEw7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3QocGFyZW50KTsKKwkvKgorCSAqIFNlYXJjaCBmb3IgYW4gZXhpc3RpbmcgdGFyZ2V0IGZvciB0aGlzIHNkZXYuCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdGFyZ2V0LCAmc2hvc3QtPl9fdGFyZ2V0cywgc2libGluZ3MpIHsKKwkJaWYgKHN0YXJnZXQtPmlkID09IGlkICYmCisJCSAgICBzdGFyZ2V0LT5jaGFubmVsID09IGNoYW5uZWwpIHsKKwkJCWZvdW5kX3N0YXJnZXQgPSBzdGFyZ2V0OworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGZvdW5kX3N0YXJnZXQpCisJCWdldF9kZXZpY2UoJmZvdW5kX3N0YXJnZXQtPmRldik7CisKKwlyZXR1cm4gZm91bmRfc3RhcmdldDsKK30KKworc3RhdGljIHN0cnVjdCBzY3NpX3RhcmdldCAqc2NzaV9hbGxvY190YXJnZXQoc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJCQkgICAgIGludCBjaGFubmVsLCB1aW50IGlkKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHBhcmVudCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNvbnN0IGludCBzaXplID0gc2l6ZW9mKHN0cnVjdCBzY3NpX3RhcmdldCkKKwkJKyBzaG9zdC0+dHJhbnNwb3J0dC0+dGFyZ2V0X3NpemU7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0ga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKmZvdW5kX3RhcmdldDsKKworCWlmICghc3RhcmdldCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhbGxvY2F0aW9uIGZhaWx1cmVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQoc3RhcmdldCwgMCwgc2l6ZSk7CisJZGV2ID0gJnN0YXJnZXQtPmRldjsKKwlkZXZpY2VfaW5pdGlhbGl6ZShkZXYpOworCXN0YXJnZXQtPnJlYXBfcmVmID0gMTsKKwlkZXYtPnBhcmVudCA9IGdldF9kZXZpY2UocGFyZW50KTsKKwlkZXYtPnJlbGVhc2UgPSBzY3NpX3RhcmdldF9kZXZfcmVsZWFzZTsKKwlzcHJpbnRmKGRldi0+YnVzX2lkLCAidGFyZ2V0JWQ6JWQ6JWQiLAorCQlzaG9zdC0+aG9zdF9ubywgY2hhbm5lbCwgaWQpOworCXN0YXJnZXQtPmlkID0gaWQ7CisJc3RhcmdldC0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJSU5JVF9MSVNUX0hFQUQoJnN0YXJnZXQtPnNpYmxpbmdzKTsKKwlJTklUX0xJU1RfSEVBRCgmc3RhcmdldC0+ZGV2aWNlcyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJZm91bmRfdGFyZ2V0ID0gX19zY3NpX2ZpbmRfdGFyZ2V0KHBhcmVudCwgY2hhbm5lbCwgaWQpOworCWlmIChmb3VuZF90YXJnZXQpCisJCWdvdG8gZm91bmQ7CisKKwlsaXN0X2FkZF90YWlsKCZzdGFyZ2V0LT5zaWJsaW5ncywgJnNob3N0LT5fX3RhcmdldHMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCS8qIGFsbG9jYXRlIGFuZCBhZGQgKi8KKwl0cmFuc3BvcnRfc2V0dXBfZGV2aWNlKCZzdGFyZ2V0LT5kZXYpOworCWRldmljZV9hZGQoJnN0YXJnZXQtPmRldik7CisJdHJhbnNwb3J0X2FkZF9kZXZpY2UoJnN0YXJnZXQtPmRldik7CisJcmV0dXJuIHN0YXJnZXQ7CisKKyBmb3VuZDoKKwlmb3VuZF90YXJnZXQtPnJlYXBfcmVmKys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcHV0X2RldmljZShwYXJlbnQpOworCWtmcmVlKHN0YXJnZXQpOworCXJldHVybiBmb3VuZF90YXJnZXQ7Cit9CisKKy8qKgorICogc2NzaV90YXJnZXRfcmVhcCAtIGNoZWNrIHRvIHNlZSBpZiB0YXJnZXQgaXMgaW4gdXNlIGFuZCBkZXN0cm95IGlmIG5vdAorICoKKyAqIEBzdGFyZ2V0OiB0YXJnZXQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFRoaXMgaXMgdXNlZCBhZnRlciByZW1vdmluZyBhIExVTiBvciBkb2luZyBhIGxhc3QgcHV0IG9mIHRoZSB0YXJnZXQKKyAqIGl0IGNoZWNrcyBhdG9taWNhbGx5IHRoYXQgbm90aGluZyBpcyB1c2luZyB0aGUgdGFyZ2V0IGFuZCByZW1vdmVzCisgKiBpdCBpZiBzby4KKyAqLwordm9pZCBzY3NpX3RhcmdldF9yZWFwKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCWlmICgtLXN0YXJnZXQtPnJlYXBfcmVmID09IDAgJiYgbGlzdF9lbXB0eSgmc3RhcmdldC0+ZGV2aWNlcykpIHsKKwkJbGlzdF9kZWxfaW5pdCgmc3RhcmdldC0+c2libGluZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJZGV2aWNlX2RlbCgmc3RhcmdldC0+ZGV2KTsKKwkJdHJhbnNwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKCZzdGFyZ2V0LT5kZXYpOworCQlwdXRfZGV2aWNlKCZzdGFyZ2V0LT5kZXYpOworCQlyZXR1cm47CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIHNjc2lfcHJvYmVfbHVuIC0gcHJvYmUgYSBzaW5nbGUgTFVOIHVzaW5nIGEgU0NTSSBJTlFVSVJZCisgKiBAc3JlcToJdXNlZCB0byBzZW5kIHRoZSBJTlFVSVJZCisgKiBAaW5xX3Jlc3VsdDoJYXJlYSB0byBzdG9yZSB0aGUgSU5RVUlSWSByZXN1bHQKKyAqIEBiZmxhZ3M6CXN0b3JlIGFueSBiZmxhZ3MgZm91bmQgaGVyZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIFByb2JlIHRoZSBsdW4gYXNzb2NpYXRlZCB3aXRoIEBzcmVxIHVzaW5nIGEgc3RhbmRhcmQgU0NTSSBJTlFVSVJZOworICoKKyAqICAgICBJZiB0aGUgSU5RVUlSWSBpcyBzdWNjZXNzZnVsLCBzcmVxLT5zcl9yZXN1bHQgaXMgemVybyBhbmQ6IHRoZQorICogICAgIElOUVVJUlkgZGF0YSBpcyBpbiBAaW5xX3Jlc3VsdDsgdGhlIHNjc2lfbGV2ZWwgYW5kIElOUVVJUlkgbGVuZ3RoCisgKiAgICAgYXJlIGNvcGllZCB0byB0aGUgU2NzaV9EZXZpY2UgYXQgQHNyZXEtPnNyX2RldmljZSAoc2Rldik7CisgKiAgICAgYW55IGZsYWdzIHZhbHVlIGlzIHN0b3JlZCBpbiAqQGJmbGFncy4KKyAqKi8KK3N0YXRpYyB2b2lkIHNjc2lfcHJvYmVfbHVuKHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEsIGNoYXIgKmlucV9yZXN1bHQsCisJCQkgICBpbnQgKmJmbGFncykKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBzcmVxLT5zcl9kZXZpY2U7CS8qIGEgYml0IHVnbHkgKi8KKwl1bnNpZ25lZCBjaGFyIHNjc2lfY21kW01BWF9DT01NQU5EX1NJWkVdOworCWludCBmaXJzdF9pbnF1aXJ5X2xlbiwgdHJ5X2lucXVpcnlfbGVuLCBuZXh0X2lucXVpcnlfbGVuOworCWludCByZXNwb25zZV9sZW4gPSAwOworCWludCBwYXNzLCBjb3VudDsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CisKKwkqYmZsYWdzID0gMDsKKworCS8qIFBlcmZvcm0gdXAgdG8gMyBwYXNzZXMuICBUaGUgZmlyc3QgcGFzcyB1c2VzIGEgY29uc2VydmF0aXZlCisJICogdHJhbnNmZXIgbGVuZ3RoIG9mIDM2IHVubGVzcyBzZGV2LT5pbnF1aXJ5X2xlbiBzcGVjaWZpZXMgYQorCSAqIGRpZmZlcmVudCB2YWx1ZS4gKi8KKwlmaXJzdF9pbnF1aXJ5X2xlbiA9IHNkZXYtPmlucXVpcnlfbGVuID8gc2Rldi0+aW5xdWlyeV9sZW4gOiAzNjsKKwl0cnlfaW5xdWlyeV9sZW4gPSBmaXJzdF9pbnF1aXJ5X2xlbjsKKwlwYXNzID0gMTsKKworIG5leHRfcGFzczoKKwlTQ1NJX0xPR19TQ0FOX0JVUygzLCBwcmludGsoS0VSTl9JTkZPICJzY3NpIHNjYW46IElOUVVJUlkgcGFzcyAlZCAiCisJCQkidG8gaG9zdCAlZCBjaGFubmVsICVkIGlkICVkIGx1biAlZCwgbGVuZ3RoICVkXG4iLAorCQkJcGFzcywgc2Rldi0+aG9zdC0+aG9zdF9ubywgc2Rldi0+Y2hhbm5lbCwKKwkJCXNkZXYtPmlkLCBzZGV2LT5sdW4sIHRyeV9pbnF1aXJ5X2xlbikpOworCisJLyogRWFjaCBwYXNzIGdldHMgdXAgdG8gdGhyZWUgY2hhbmNlcyB0byBpZ25vcmUgVW5pdCBBdHRlbnRpb24gKi8KKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzOyArK2NvdW50KSB7CisJCW1lbXNldChzY3NpX2NtZCwgMCwgNik7CisJCXNjc2lfY21kWzBdID0gSU5RVUlSWTsKKwkJc2NzaV9jbWRbNF0gPSAodW5zaWduZWQgY2hhcikgdHJ5X2lucXVpcnlfbGVuOworCQlzcmVxLT5zcl9jbWRfbGVuID0gMDsKKwkJc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisKKwkJbWVtc2V0KGlucV9yZXN1bHQsIDAsIHRyeV9pbnF1aXJ5X2xlbik7CisJCXNjc2lfd2FpdF9yZXEoc3JlcSwgKHZvaWQgKikgc2NzaV9jbWQsICh2b2lkICopIGlucV9yZXN1bHQsCisJCQkJdHJ5X2lucXVpcnlfbGVuLAorCQkJCUhaLzIgKyBIWipzY3NpX2lucV90aW1lb3V0LCAzKTsKKworCQlTQ1NJX0xPR19TQ0FOX0JVUygzLCBwcmludGsoS0VSTl9JTkZPICJzY3NpIHNjYW46IElOUVVJUlkgJXMgIgorCQkJCSJ3aXRoIGNvZGUgMHgleFxuIiwKKwkJCQlzcmVxLT5zcl9yZXN1bHQgPyAiZmFpbGVkIiA6ICJzdWNjZXNzZnVsIiwKKwkJCQlzcmVxLT5zcl9yZXN1bHQpKTsKKworCQlpZiAoc3JlcS0+c3JfcmVzdWx0KSB7CisJCQkvKgorCQkJICogbm90LXJlYWR5IHRvIHJlYWR5IHRyYW5zaXRpb24gW2FzYy9hc2NxPTB4MjgvMHgwXQorCQkJICogb3IgcG93ZXItb24sIHJlc2V0IFthc2MvYXNjcT0weDI5LzB4MF0sIGNvbnRpbnVlLgorCQkJICogSU5RVUlSWSBzaG91bGQgbm90IHlpZWxkIFVOSVRfQVRURU5USU9OCisJCQkgKiBidXQgbWFueSBidWdneSBkZXZpY2VzIGRvIHNvIGFueXdheS4gCisJCQkgKi8KKwkJCWlmICgoZHJpdmVyX2J5dGUoc3JlcS0+c3JfcmVzdWx0KSAmIERSSVZFUl9TRU5TRSkgJiYKKwkJCSAgICBzY3NpX3JlcXVlc3Rfbm9ybWFsaXplX3NlbnNlKHNyZXEsICZzc2hkcikpIHsKKwkJCQlpZiAoKHNzaGRyLnNlbnNlX2tleSA9PSBVTklUX0FUVEVOVElPTikgJiYKKwkJCQkgICAgKChzc2hkci5hc2MgPT0gMHgyOCkgfHwKKwkJCQkgICAgIChzc2hkci5hc2MgPT0gMHgyOSkpICYmCisJCQkJICAgIChzc2hkci5hc2NxID09IDApKQorCQkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAoc3JlcS0+c3JfcmVzdWx0ID09IDApIHsKKwkJcmVzcG9uc2VfbGVuID0gKHVuc2lnbmVkIGNoYXIpIGlucV9yZXN1bHRbNF0gKyA1OworCQlpZiAocmVzcG9uc2VfbGVuID4gMjU1KQorCQkJcmVzcG9uc2VfbGVuID0gZmlyc3RfaW5xdWlyeV9sZW47CS8qIHNhbml0eSAqLworCisJCS8qCisJCSAqIEdldCBhbnkgZmxhZ3MgZm9yIHRoaXMgZGV2aWNlLgorCQkgKgorCQkgKiBYWFggYWRkIGEgYmZsYWdzIHRvIFNjc2lfRGV2aWNlLCBhbmQgcmVwbGFjZSB0aGUKKwkJICogY29ycmVzcG9uZGluZyBiaXQgZmllbGRzIGluIFNjc2lfRGV2aWNlLCBzbyBiZmxhZ3MKKwkJICogbmVlZCBub3QgYmUgcGFzc2VkIGFzIGFuIGFyZ3VtZW50LgorCQkgKi8KKwkJKmJmbGFncyA9IHNjc2lfZ2V0X2RldmljZV9mbGFncyhzZGV2LCAmaW5xX3Jlc3VsdFs4XSwKKwkJCQkmaW5xX3Jlc3VsdFsxNl0pOworCisJCS8qIFdoZW4gdGhlIGZpcnN0IHBhc3Mgc3VjY2VlZHMgd2UgZ2FpbiBpbmZvcm1hdGlvbiBhYm91dAorCQkgKiB3aGF0IGxhcmdlciB0cmFuc2ZlciBsZW5ndGhzIG1pZ2h0IHdvcmsuICovCisJCWlmIChwYXNzID09IDEpIHsKKwkJCWlmIChCTElTVF9JTlFVSVJZXzM2ICYgKmJmbGFncykKKwkJCQluZXh0X2lucXVpcnlfbGVuID0gMzY7CisJCQllbHNlIGlmIChCTElTVF9JTlFVSVJZXzU4ICYgKmJmbGFncykKKwkJCQluZXh0X2lucXVpcnlfbGVuID0gNTg7CisJCQllbHNlIGlmIChzZGV2LT5pbnF1aXJ5X2xlbikKKwkJCQluZXh0X2lucXVpcnlfbGVuID0gc2Rldi0+aW5xdWlyeV9sZW47CisJCQllbHNlCisJCQkJbmV4dF9pbnF1aXJ5X2xlbiA9IHJlc3BvbnNlX2xlbjsKKworCQkJLyogSWYgbW9yZSBkYXRhIGlzIGF2YWlsYWJsZSBwZXJmb3JtIHRoZSBzZWNvbmQgcGFzcyAqLworCQkJaWYgKG5leHRfaW5xdWlyeV9sZW4gPiB0cnlfaW5xdWlyeV9sZW4pIHsKKwkJCQl0cnlfaW5xdWlyeV9sZW4gPSBuZXh0X2lucXVpcnlfbGVuOworCQkJCXBhc3MgPSAyOworCQkJCWdvdG8gbmV4dF9wYXNzOworCQkJfQorCQl9CisKKwl9IGVsc2UgaWYgKHBhc3MgPT0gMikgeworCQlwcmludGsoS0VSTl9JTkZPICJzY3NpIHNjYW46ICVkIGJ5dGUgaW5xdWlyeSBmYWlsZWQuICAiCisJCQkJIkNvbnNpZGVyIEJMSVNUX0lOUVVJUllfMzYgZm9yIHRoaXMgZGV2aWNlXG4iLAorCQkJCXRyeV9pbnF1aXJ5X2xlbik7CisKKwkJLyogSWYgdGhpcyBwYXNzIGZhaWxlZCwgdGhlIHRoaXJkIHBhc3MgZ29lcyBiYWNrIGFuZCB0cmFuc2ZlcnMKKwkJICogdGhlIHNhbWUgYW1vdW50IGFzIHdlIHN1Y2Nlc3NmdWxseSBnb3QgaW4gdGhlIGZpcnN0IHBhc3MuICovCisJCXRyeV9pbnF1aXJ5X2xlbiA9IGZpcnN0X2lucXVpcnlfbGVuOworCQlwYXNzID0gMzsKKwkJZ290byBuZXh0X3Bhc3M7CisJfQorCisJLyogSWYgdGhlIGxhc3QgdHJhbnNmZXIgYXR0ZW1wdCBnb3QgYW4gZXJyb3IsIGFzc3VtZSB0aGUKKwkgKiBwZXJpcGhlcmFsIGRvZXNuJ3QgZXhpc3Qgb3IgaXMgZGVhZC4gKi8KKwlpZiAoc3JlcS0+c3JfcmVzdWx0KQorCQlyZXR1cm47CisKKwkvKiBEb24ndCByZXBvcnQgYW55IG1vcmUgZGF0YSB0aGFuIHRoZSBkZXZpY2Ugc2F5cyBpcyB2YWxpZCAqLworCXNkZXYtPmlucXVpcnlfbGVuID0gbWluKHRyeV9pbnF1aXJ5X2xlbiwgcmVzcG9uc2VfbGVuKTsKKworCS8qCisJICogWFhYIEFib3J0IGlmIHRoZSByZXNwb25zZSBsZW5ndGggaXMgbGVzcyB0aGFuIDM2PyBJZiBsZXNzIHRoYW4KKwkgKiAzMiwgdGhlIGxvb2t1cCBvZiB0aGUgZGV2aWNlIGZsYWdzIChhYm92ZSkgY291bGQgYmUgaW52YWxpZCwKKwkgKiBhbmQgaXQgd291bGQgYmUgcG9zc2libGUgdG8gdGFrZSBhbiBpbmNvcnJlY3QgYWN0aW9uIC0gd2UgZG8KKwkgKiBub3Qgd2FudCB0byBoYW5nIGJlY2F1c2Ugb2YgYSBzaG9ydCBJTlFVSVJZLiBPbiB0aGUgZmxpcCBzaWRlLAorCSAqIGlmIHRoZSBkZXZpY2UgaXMgc3B1biBkb3duIG9yIGJlY29taW5nIHJlYWR5IChhbmQgc28gaXQgZ2l2ZXMgYQorCSAqIHNob3J0IElOUVVJUlkpLCBhbiBhYm9ydCBoZXJlIHByZXZlbnRzIGFueSBmdXJ0aGVyIHVzZSBvZiB0aGUKKwkgKiBkZXZpY2UsIGluY2x1ZGluZyBzcGluIHVwLgorCSAqCisJICogUmVsYXRlZCB0byB0aGUgYWJvdmUgaXNzdWU6CisJICoKKwkgKiBYWFggRGV2aWNlcyAoZGlzayBvciBhbGw/KSBzaG91bGQgYmUgc2VudCBhIFRFU1QgVU5JVCBSRUFEWSwKKwkgKiBhbmQgaWYgbm90IHJlYWR5LCBzZW50IGEgU1RBUlRfU1RPUCB0byBzdGFydCAobWF5YmUgc3BpbiB1cCkgYW5kCisJICogdGhlbiBzZW5kIHRoZSBJTlFVSVJZIGFnYWluLCBzaW5jZSB0aGUgSU5RVUlSWSBjYW4gY2hhbmdlIGFmdGVyCisJICogYSBkZXZpY2UgaXMgaW5pdGlhbGl6ZWQuCisJICoKKwkgKiBJZGVhbGx5LCBzdGFydCBhIGRldmljZSBpZiBleHBsaWNpdGx5IGFza2VkIHRvIGRvIHNvLiAgVGhpcworCSAqIGFzc3VtZXMgdGhhdCBhIGRldmljZSBpcyBzcHVuIHVwIG9uIHBvd2VyIG9uLCBzcHVuIGRvd24gb24KKwkgKiByZXF1ZXN0LCBhbmQgdGhlbiBzcHVuIHVwIG9uIHJlcXVlc3QuCisJICovCisKKwkvKgorCSAqIFRoZSBzY2FubmluZyBjb2RlIG5lZWRzIHRvIGtub3cgdGhlIHNjc2lfbGV2ZWwsIGV2ZW4gaWYgbm8KKwkgKiBkZXZpY2UgaXMgYXR0YWNoZWQgYXQgTFVOIDAgKFNDU0lfU0NBTl9UQVJHRVRfUFJFU0VOVCkgc28KKwkgKiBub24temVybyBMVU5zIGNhbiBiZSBzY2FubmVkLgorCSAqLworCXNkZXYtPnNjc2lfbGV2ZWwgPSBpbnFfcmVzdWx0WzJdICYgMHgwNzsKKwlpZiAoc2Rldi0+c2NzaV9sZXZlbCA+PSAyIHx8CisJICAgIChzZGV2LT5zY3NpX2xldmVsID09IDEgJiYgKGlucV9yZXN1bHRbM10gJiAweDBmKSA9PSAxKSkKKwkJc2Rldi0+c2NzaV9sZXZlbCsrOworCisJcmV0dXJuOworfQorCisvKioKKyAqIHNjc2lfYWRkX2x1biAtIGFsbG9jYXRlIGFuZCBmdWxseSBpbml0aWFsemUgYSBTY3NpX0RldmljZQorICogQHNkZXZzY2FuOglob2xkcyBpbmZvcm1hdGlvbiB0byBiZSBzdG9yZWQgaW4gdGhlIG5ldyBTY3NpX0RldmljZQorICogQHNkZXZuZXc6CXN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgU2NzaV9EZXZpY2UKKyAqIEBpbnFfcmVzdWx0Oglob2xkcyB0aGUgcmVzdWx0IG9mIGEgcHJldmlvdXMgSU5RVUlSWSB0byB0aGUgTFVOCisgKiBAYmZsYWdzOglibGFjay93aGl0ZSBsaXN0IGZsYWcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgICBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIFNjc2lfRGV2aWNlIG1hdGNoaW5nIHNkZXZzY2FuLiBPcHRpb25hbGx5CisgKiAgICAgc2V0IGZpZWxkcyBiYXNlZCBvbiB2YWx1ZXMgaW4gKkBiZmxhZ3MuIElmIEBzZGV2bmV3IGlzIG5vdAorICogICAgIE5VTEwsIHN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXcgU2NzaV9EZXZpY2UgaW4gKkBzZGV2bmV3IChuZWVkZWQKKyAqICAgICB3aGVuIHNjYW5uaW5nIGEgcGFydGljdWxhciBMVU4pLgorICoKKyAqIFJldHVybjoKKyAqICAgICBTQ1NJX1NDQU5fTk9fUkVTUE9OU0U6IGNvdWxkIG5vdCBhbGxvY2F0ZSBvciBzZXR1cCBhIFNjc2lfRGV2aWNlCisgKiAgICAgU0NTSV9TQ0FOX0xVTl9QUkVTRU5UOiBhIG5ldyBTY3NpX0RldmljZSB3YXMgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZAorICoqLworc3RhdGljIGludCBzY3NpX2FkZF9sdW4oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBjaGFyICppbnFfcmVzdWx0LCBpbnQgKmJmbGFncykKK3sKKwkvKgorCSAqIFhYWCBkbyBub3Qgc2F2ZSB0aGUgaW5xdWlyeSwgc2luY2UgaXQgY2FuIGNoYW5nZSB1bmRlcm5lYXRoIHVzLAorCSAqIHNhdmUganVzdCB2ZW5kb3IvbW9kZWwvcmV2LgorCSAqCisJICogUmF0aGVyIHRoYW4gc2F2ZSBpdCBhbmQgaGF2ZSBhbiBpb2N0bCB0aGF0IHJldHJpZXZlcyB0aGUgc2F2ZWQKKwkgKiB2YWx1ZSwgaGF2ZSBhbiBpb2N0bCB0aGF0IGV4ZWN1dGVzIHRoZSBzYW1lIElOUVVJUlkgY29kZSB1c2VkCisJICogaW4gc2NzaV9wcm9iZV9sdW4sIGxldCB1c2VyIGxldmVsIHByb2dyYW1zIGRvaW5nIElOUVVJUlkKKwkgKiBzY2FubmluZyBydW4gYXQgdGhlaXIgb3duIHJpc2ssIG9yIHN1cHBseSBhIHVzZXIgbGV2ZWwgcHJvZ3JhbQorCSAqIHRoYXQgY2FuIGNvcnJlY3RseSBzY2FuLgorCSAqLworCXNkZXYtPmlucXVpcnkgPSBrbWFsbG9jKHNkZXYtPmlucXVpcnlfbGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoc2Rldi0+aW5xdWlyeSA9PSBOVUxMKSB7CisJCXJldHVybiBTQ1NJX1NDQU5fTk9fUkVTUE9OU0U7CisJfQorCisJbWVtY3B5KHNkZXYtPmlucXVpcnksIGlucV9yZXN1bHQsIHNkZXYtPmlucXVpcnlfbGVuKTsKKwlzZGV2LT52ZW5kb3IgPSAoY2hhciAqKSAoc2Rldi0+aW5xdWlyeSArIDgpOworCXNkZXYtPm1vZGVsID0gKGNoYXIgKikgKHNkZXYtPmlucXVpcnkgKyAxNik7CisJc2Rldi0+cmV2ID0gKGNoYXIgKikgKHNkZXYtPmlucXVpcnkgKyAzMik7CisKKwlpZiAoKmJmbGFncyAmIEJMSVNUX0lTUk9NKSB7CisJCS8qCisJCSAqIEl0IHdvdWxkIGJlIGJldHRlciB0byBtb2RpZnkgc2Rldi0+dHlwZSwgYW5kIHNldAorCQkgKiBzZGV2LT5yZW1vdmFibGUsIGJ1dCB0aGVuIHRoZSBwcmludF9pbnF1aXJ5KCkgb3V0cHV0CisJCSAqIHdvdWxkIG5vdCBzaG93IFRZUEVfUk9NOyBpZiBwcmludF9pbnF1aXJ5KCkgaXMgcmVtb3ZlZAorCQkgKiB0aGUgaXNzdWUgZ29lcyBhd2F5LgorCQkgKi8KKwkJaW5xX3Jlc3VsdFswXSA9IFRZUEVfUk9NOworCQlpbnFfcmVzdWx0WzFdIHw9IDB4ODA7CS8qIHJlbW92YWJsZSAqLworCX0gZWxzZSBpZiAoKmJmbGFncyAmIEJMSVNUX05PX1VMRF9BVFRBQ0gpCisJCXNkZXYtPm5vX3VsZF9hdHRhY2ggPSAxOworCisJc3dpdGNoIChzZGV2LT50eXBlID0gKGlucV9yZXN1bHRbMF0gJiAweDFmKSkgeworCWNhc2UgVFlQRV9UQVBFOgorCWNhc2UgVFlQRV9ESVNLOgorCWNhc2UgVFlQRV9QUklOVEVSOgorCWNhc2UgVFlQRV9NT0Q6CisJY2FzZSBUWVBFX1BST0NFU1NPUjoKKwljYXNlIFRZUEVfU0NBTk5FUjoKKwljYXNlIFRZUEVfTUVESVVNX0NIQU5HRVI6CisJY2FzZSBUWVBFX0VOQ0xPU1VSRToKKwljYXNlIFRZUEVfQ09NTToKKwkJc2Rldi0+d3JpdGVhYmxlID0gMTsKKwkJYnJlYWs7CisJY2FzZSBUWVBFX1dPUk06CisJY2FzZSBUWVBFX1JPTToKKwkJc2Rldi0+d3JpdGVhYmxlID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaTogdW5rbm93biBkZXZpY2UgdHlwZSAlZFxuIiwgc2Rldi0+dHlwZSk7CisJfQorCisJcHJpbnRfaW5xdWlyeShpbnFfcmVzdWx0KTsKKworCS8qCisJICogRm9yIGEgcGVyaXBoZXJhbCBxdWFsaWZpZXIgKFBRKSB2YWx1ZSBvZiAxICgwMDFiKSwgdGhlIFNDU0kKKwkgKiBzcGVjIHNheXM6IFRoZSBkZXZpY2Ugc2VydmVyIGlzIGNhcGFibGUgb2Ygc3VwcG9ydGluZyB0aGUKKwkgKiBzcGVjaWZpZWQgcGVyaXBoZXJhbCBkZXZpY2UgdHlwZSBvbiB0aGlzIGxvZ2ljYWwgdW5pdC4gSG93ZXZlciwKKwkgKiB0aGUgcGh5c2ljYWwgZGV2aWNlIGlzIG5vdCBjdXJyZW50bHkgY29ubmVjdGVkIHRvIHRoaXMgbG9naWNhbAorCSAqIHVuaXQuCisJICoKKwkgKiBUaGUgYWJvdmUgaXMgdmFndWUsIGFzIGl0IGltcGxpZXMgdGhhdCB3ZSBjb3VsZCB0cmVhdCAwMDEgYW5kCisJICogMDExIHRoZSBzYW1lLiBTdGF5IGNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyBjb2RlLCBhbmQgY3JlYXRlIGEKKwkgKiBTY3NpX0RldmljZSBmb3IgYSBQUSBvZiAxCisJICoKKwkgKiBEb24ndCBzZXQgdGhlIGRldmljZSBvZmZsaW5lIGhlcmU7IHJhdGhlciBsZXQgdGhlIHVwcGVyCisJICogbGV2ZWwgZHJpdmVycyBldmFsIHRoZSBQUSB0byBkZWNpZGUgd2hldGhlciB0aGV5IHNob3VsZAorCSAqIGF0dGFjaC4gU28gcmVtb3ZlICgoaW5xX3Jlc3VsdFswXSA+PiA1KSAmIDcpID09IDEgY2hlY2suCisJICovIAorCisJc2Rldi0+aW5xX3BlcmlwaF9xdWFsID0gKGlucV9yZXN1bHRbMF0gPj4gNSkgJiA3OworCXNkZXYtPnJlbW92YWJsZSA9ICgweDgwICYgaW5xX3Jlc3VsdFsxXSkgPj4gNzsKKwlzZGV2LT5sb2NrYWJsZSA9IHNkZXYtPnJlbW92YWJsZTsKKwlzZGV2LT5zb2Z0X3Jlc2V0ID0gKGlucV9yZXN1bHRbN10gJiAxKSAmJiAoKGlucV9yZXN1bHRbM10gJiA3KSA9PSAyKTsKKworCWlmIChzZGV2LT5zY3NpX2xldmVsID49IFNDU0lfMyB8fCAoc2Rldi0+aW5xdWlyeV9sZW4gPiA1NiAmJgorCQlpbnFfcmVzdWx0WzU2XSAmIDB4MDQpKQorCQlzZGV2LT5wcHIgPSAxOworCWlmIChpbnFfcmVzdWx0WzddICYgMHg2MCkKKwkJc2Rldi0+d2R0ciA9IDE7CisJaWYgKGlucV9yZXN1bHRbN10gJiAweDEwKQorCQlzZGV2LT5zZHRyID0gMTsKKworCXNwcmludGYoc2Rldi0+ZGV2ZnNfbmFtZSwgInNjc2kvaG9zdCVkL2J1cyVkL3RhcmdldCVkL2x1biVkIiwKKwkJCQlzZGV2LT5ob3N0LT5ob3N0X25vLCBzZGV2LT5jaGFubmVsLAorCQkJCXNkZXYtPmlkLCBzZGV2LT5sdW4pOworCisJLyoKKwkgKiBFbmQgZHJpdmVyZnMvZGV2ZnMgY29kZS4KKwkgKi8KKworCWlmICgoc2Rldi0+c2NzaV9sZXZlbCA+PSBTQ1NJXzIpICYmIChpbnFfcmVzdWx0WzddICYgMikgJiYKKwkgICAgISgqYmZsYWdzICYgQkxJU1RfTk9UUSkpCisJCXNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQgPSAxOworCS8qCisJICogU29tZSBkZXZpY2VzIChUZXhlbCBDRCBST00gZHJpdmVzKSBoYXZlIGhhbmRzaGFraW5nIHByb2JsZW1zCisJICogd2hlbiB1c2VkIHdpdGggdGhlIFNlYWdhdGUgY29udHJvbGxlcnMuIGJvcmtlbiBpcyBpbml0aWFsaXplZAorCSAqIHRvIDEsIGFuZCB0aGVuIHNldCBpdCB0byAwIGhlcmUuCisJICovCisJaWYgKCgqYmZsYWdzICYgQkxJU1RfQk9SS0VOKSA9PSAwKQorCQlzZGV2LT5ib3JrZW4gPSAwOworCisJLyoKKwkgKiBBcHBhcmVudGx5IHNvbWUgcmVhbGx5IGJyb2tlbiBkZXZpY2VzIChjb250cmFyeSB0byB0aGUgU0NTSQorCSAqIHN0YW5kYXJkcykgbmVlZCB0byBiZSBzZWxlY3RlZCB3aXRob3V0IGFzc2VydGluZyBBVE4KKwkgKi8KKwlpZiAoKmJmbGFncyAmIEJMSVNUX1NFTEVDVF9OT19BVE4pCisJCXNkZXYtPnNlbGVjdF9ub19hdG4gPSAxOworCisJLyoKKwkgKiBTb21lIGRldmljZXMgbWF5IG5vdCB3YW50IHRvIGhhdmUgYSBzdGFydCBjb21tYW5kIGF1dG9tYXRpY2FsbHkKKwkgKiBpc3N1ZWQgd2hlbiBhIGRldmljZSBpcyBhZGRlZC4KKwkgKi8KKwlpZiAoKmJmbGFncyAmIEJMSVNUX05PU1RBUlRPTkFERCkKKwkJc2Rldi0+bm9fc3RhcnRfb25fYWRkID0gMTsKKworCWlmICgqYmZsYWdzICYgQkxJU1RfU0lOR0xFTFVOKQorCQlzZGV2LT5zaW5nbGVfbHVuID0gMTsKKworCisJc2Rldi0+dXNlXzEwX2Zvcl9ydyA9IDE7CisKKwlpZiAoKmJmbGFncyAmIEJMSVNUX01TX1NLSVBfUEFHRV8wOCkKKwkJc2Rldi0+c2tpcF9tc19wYWdlXzggPSAxOworCisJaWYgKCpiZmxhZ3MgJiBCTElTVF9NU19TS0lQX1BBR0VfM0YpCisJCXNkZXYtPnNraXBfbXNfcGFnZV8zZiA9IDE7CisKKwlpZiAoKmJmbGFncyAmIEJMSVNUX1VTRV8xMF9CWVRFX01TKQorCQlzZGV2LT51c2VfMTBfZm9yX21zID0gMTsKKworCS8qIHNldCB0aGUgZGV2aWNlIHJ1bm5pbmcgaGVyZSBzbyB0aGF0IHNsYXZlIGNvbmZpZ3VyZQorCSAqIG1heSBkbyBJL08gKi8KKwlzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9SVU5OSU5HKTsKKworCWlmICgqYmZsYWdzICYgQkxJU1RfTVNfMTkyX0JZVEVTX0ZPUl8zRikKKwkJc2Rldi0+dXNlXzE5Ml9ieXRlc19mb3JfM2YgPSAxOworCisJaWYgKCpiZmxhZ3MgJiBCTElTVF9OT1RfTE9DS0FCTEUpCisJCXNkZXYtPmxvY2thYmxlID0gMDsKKworCWlmICgqYmZsYWdzICYgQkxJU1RfUkVUUllfSFdFUlJPUikKKwkJc2Rldi0+cmV0cnlfaHdlcnJvciA9IDE7CisKKwl0cmFuc3BvcnRfY29uZmlndXJlX2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCisJaWYgKHNkZXYtPmhvc3QtPmhvc3R0LT5zbGF2ZV9jb25maWd1cmUpCisJCXNkZXYtPmhvc3QtPmhvc3R0LT5zbGF2ZV9jb25maWd1cmUoc2Rldik7CisKKwkvKgorCSAqIE9rLCB0aGUgZGV2aWNlIGlzIG5vdyBhbGwgc2V0IHVwLCB3ZSBjYW4KKwkgKiByZWdpc3RlciBpdCBhbmQgdGVsbCB0aGUgcmVzdCBvZiB0aGUga2VybmVsCisJICogYWJvdXQgaXQuCisJICovCisJc2NzaV9zeXNmc19hZGRfc2RldihzZGV2KTsKKworCXJldHVybiBTQ1NJX1NDQU5fTFVOX1BSRVNFTlQ7Cit9CisKKy8qKgorICogc2NzaV9wcm9iZV9hbmRfYWRkX2x1biAtIHByb2JlIGEgTFVOLCBpZiBhIExVTiBpcyBmb3VuZCBhZGQgaXQKKyAqIEBzdGFyZ2V0Oglwb2ludGVyIHRvIHRhcmdldCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAbHVuOglMVU4gb2YgdGFyZ2V0IGRldmljZQorICogQHNkZXZzY2FuOglwcm9iZSB0aGUgTFVOIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBTY3NpX0RldmljZQorICogQHNkZXZuZXc6CXN0b3JlIHRoZSB2YWx1ZSBvZiBhbnkgbmV3IFNjc2lfRGV2aWNlIGFsbG9jYXRlZAorICogQGJmbGFnc3A6CXN0b3JlIGJmbGFncyBoZXJlIGlmIG5vdCBOVUxMCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgQ2FsbCBzY3NpX3Byb2JlX2x1biwgaWYgYSBMVU4gd2l0aCBhbiBhdHRhY2hlZCBkZXZpY2UgaXMgZm91bmQsCisgKiAgICAgYWxsb2NhdGUgYW5kIHNldCBpdCB1cCBieSBjYWxsaW5nIHNjc2lfYWRkX2x1bi4KKyAqCisgKiBSZXR1cm46CisgKiAgICAgU0NTSV9TQ0FOX05PX1JFU1BPTlNFOiBjb3VsZCBub3QgYWxsb2NhdGUgb3Igc2V0dXAgYSBTY3NpX0RldmljZQorICogICAgIFNDU0lfU0NBTl9UQVJHRVRfUFJFU0VOVDogdGFyZ2V0IHJlc3BvbmRlZCwgYnV0IG5vIGRldmljZSBpcworICogICAgICAgICBhdHRhY2hlZCBhdCB0aGUgTFVOCisgKiAgICAgU0NTSV9TQ0FOX0xVTl9QUkVTRU5UOiBhIG5ldyBTY3NpX0RldmljZSB3YXMgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZAorICoqLworc3RhdGljIGludCBzY3NpX3Byb2JlX2FuZF9hZGRfbHVuKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwKKwkJCQkgIHVpbnQgbHVuLCBpbnQgKmJmbGFnc3AsCisJCQkJICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKipzZGV2cCwgaW50IHJlc2NhbiwKKwkJCQkgIHZvaWQgKmhvc3RkYXRhKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxOworCXVuc2lnbmVkIGNoYXIgKnJlc3VsdDsKKwlpbnQgYmZsYWdzLCByZXMgPSBTQ1NJX1NDQU5fTk9fUkVTUE9OU0U7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisKKwkvKgorCSAqIFRoZSByZXNjYW4gZmxhZyBpcyB1c2VkIGFzIGFuIG9wdGltaXphdGlvbiwgdGhlIGZpcnN0IHNjYW4gb2YgYQorCSAqIGhvc3QgYWRhcHRlciBjYWxscyBpbnRvIGhlcmUgd2l0aCByZXNjYW4gPT0gMC4KKwkgKi8KKwlpZiAocmVzY2FuKSB7CisJCXNkZXYgPSBzY3NpX2RldmljZV9sb29rdXBfYnlfdGFyZ2V0KHN0YXJnZXQsIGx1bik7CisJCWlmIChzZGV2KSB7CisJCQlTQ1NJX0xPR19TQ0FOX0JVUygzLCBwcmludGsoS0VSTl9JTkZPCisJCQkJInNjc2kgc2NhbjogZGV2aWNlIGV4aXN0cyBvbiAlc1xuIiwKKwkJCQlzZGV2LT5zZGV2X2dlbmRldi5idXNfaWQpKTsKKwkJCWlmIChzZGV2cCkKKwkJCQkqc2RldnAgPSBzZGV2OworCQkJZWxzZQorCQkJCXNjc2lfZGV2aWNlX3B1dChzZGV2KTsKKworCQkJaWYgKGJmbGFnc3ApCisJCQkJKmJmbGFnc3AgPSBzY3NpX2dldF9kZXZpY2VfZmxhZ3Moc2RldiwKKwkJCQkJCQkJIHNkZXYtPnZlbmRvciwKKwkJCQkJCQkJIHNkZXYtPm1vZGVsKTsKKwkJCXJldHVybiBTQ1NJX1NDQU5fTFVOX1BSRVNFTlQ7CisJCX0KKwl9CisKKwlzZGV2ID0gc2NzaV9hbGxvY19zZGV2KHN0YXJnZXQsIGx1biwgaG9zdGRhdGEpOworCWlmICghc2RldikKKwkJZ290byBvdXQ7CisJc3JlcSA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChzZGV2LCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNyZXEpCisJCWdvdG8gb3V0X2ZyZWVfc2RldjsKKwlyZXN1bHQgPSBrbWFsbG9jKDI1NiwgR0ZQX0FUT01JQyB8CisJCQkoc2hvc3QtPnVuY2hlY2tlZF9pc2FfZG1hKSA/IF9fR0ZQX0RNQSA6IDApOworCWlmICghcmVzdWx0KQorCQlnb3RvIG91dF9mcmVlX3NyZXE7CisKKwlzY3NpX3Byb2JlX2x1bihzcmVxLCByZXN1bHQsICZiZmxhZ3MpOworCWlmIChzcmVxLT5zcl9yZXN1bHQpCisJCWdvdG8gb3V0X2ZyZWVfcmVzdWx0OworCisJLyoKKwkgKiByZXN1bHQgY29udGFpbnMgdmFsaWQgU0NTSSBJTlFVSVJZIGRhdGEuCisJICovCisJaWYgKChyZXN1bHRbMF0gPj4gNSkgPT0gMykgeworCQkvKgorCQkgKiBGb3IgYSBQZXJpcGhlcmFsIHF1YWxpZmllciAzICgwMTFiKSwgdGhlIFNDU0kKKwkJICogc3BlYyBzYXlzOiBUaGUgZGV2aWNlIHNlcnZlciBpcyBub3QgY2FwYWJsZSBvZgorCQkgKiBzdXBwb3J0aW5nIGEgcGh5c2ljYWwgZGV2aWNlIG9uIHRoaXMgbG9naWNhbAorCQkgKiB1bml0LgorCQkgKgorCQkgKiBGb3IgZGlza3MsIHRoaXMgaW1wbGllcyB0aGF0IHRoZXJlIGlzIG5vCisJCSAqIGxvZ2ljYWwgZGlzayBjb25maWd1cmVkIGF0IHNkZXYtPmx1biwgYnV0IHRoZXJlCisJCSAqIGlzIGEgdGFyZ2V0IGlkIHJlc3BvbmRpbmcuCisJCSAqLworCQlTQ1NJX0xPR19TQ0FOX0JVUygzLCBwcmludGsoS0VSTl9JTkZPCisJCQkJCSJzY3NpIHNjYW46IHBlcmlwaGVyYWwgcXVhbGlmaWVyIG9mIDMsIgorCQkJCQkiIG5vIGRldmljZSBhZGRlZFxuIikpOworCQlyZXMgPSBTQ1NJX1NDQU5fVEFSR0VUX1BSRVNFTlQ7CisJCWdvdG8gb3V0X2ZyZWVfcmVzdWx0OworCX0KKworCXJlcyA9IHNjc2lfYWRkX2x1bihzZGV2LCByZXN1bHQsICZiZmxhZ3MpOworCWlmIChyZXMgPT0gU0NTSV9TQ0FOX0xVTl9QUkVTRU5UKSB7CisJCWlmIChiZmxhZ3MgJiBCTElTVF9LRVkpIHsKKwkJCXNkZXYtPmxvY2thYmxlID0gMDsKKwkJCXNjc2lfdW5sb2NrX2Zsb3B0aWNhbChzcmVxLCByZXN1bHQpOworCQl9CisJCWlmIChiZmxhZ3NwKQorCQkJKmJmbGFnc3AgPSBiZmxhZ3M7CisJfQorCisgb3V0X2ZyZWVfcmVzdWx0OgorCWtmcmVlKHJlc3VsdCk7Cisgb3V0X2ZyZWVfc3JlcToKKwlzY3NpX3JlbGVhc2VfcmVxdWVzdChzcmVxKTsKKyBvdXRfZnJlZV9zZGV2OgorCWlmIChyZXMgPT0gU0NTSV9TQ0FOX0xVTl9QUkVTRU5UKSB7CisJCWlmIChzZGV2cCkgeworCQkJc2NzaV9kZXZpY2VfZ2V0KHNkZXYpOworCQkJKnNkZXZwID0gc2RldjsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzZGV2LT5ob3N0LT5ob3N0dC0+c2xhdmVfZGVzdHJveSkKKwkJCXNkZXYtPmhvc3QtPmhvc3R0LT5zbGF2ZV9kZXN0cm95KHNkZXYpOworCQl0cmFuc3BvcnRfZGVzdHJveV9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKKwkJcHV0X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCX0KKyBvdXQ6CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBzY3NpX3NlcXVlbnRpYWxfbHVuX3NjYW4gLSBzZXF1ZW50aWFsbHkgc2NhbiBhIFNDU0kgdGFyZ2V0CisgKiBAc3RhcmdldDoJcG9pbnRlciB0byB0YXJnZXQgc3RydWN0dXJlIHRvIHNjYW4KKyAqIEBiZmxhZ3M6CWJsYWNrL3doaXRlIGxpc3QgZmxhZyBmb3IgTFVOIDAKKyAqIEBsdW4wX3JlczoJcmVzdWx0IG9mIHNjYW5uaW5nIExVTiAwCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgR2VuZXJhbGx5LCBzY2FuIGZyb20gTFVOIDEgKExVTiAwIGlzIGFzc3VtZWQgdG8gYWxyZWFkeSBoYXZlIGJlZW4KKyAqICAgICBzY2FubmVkKSB0byBzb21lIG1heGltdW0gbHVuIHVudGlsIGEgTFVOIGlzIGZvdW5kIHdpdGggbm8gZGV2aWNlCisgKiAgICAgYXR0YWNoZWQuIFVzZSB0aGUgYmZsYWdzIHRvIGZpZ3VyZSBvdXQgYW55IG9kZGl0aWVzLgorICoKKyAqICAgICBNb2RpZmllcyBzZGV2c2Nhbi0+bHVuLgorICoqLworc3RhdGljIHZvaWQgc2NzaV9zZXF1ZW50aWFsX2x1bl9zY2FuKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwKKwkJCQkgICAgIGludCBiZmxhZ3MsIGludCBsdW4wX3JlcywgaW50IHNjc2lfbGV2ZWwsCisJCQkJICAgICBpbnQgcmVzY2FuKQoreworCXVuc2lnbmVkIGludCBzcGFyc2VfbHVuLCBsdW4sIG1heF9kZXZfbHVuOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCisJU0NTSV9MT0dfU0NBTl9CVVMoMywgcHJpbnRrKEtFUk5fSU5GTyAic2NzaSBzY2FuOiBTZXF1ZW50aWFsIHNjYW4gb2YiCisJCQkJICAgICIlc1xuIiwgc3RhcmdldC0+ZGV2LmJ1c19pZCkpOworCisJbWF4X2Rldl9sdW4gPSBtaW4obWF4X3Njc2lfbHVucywgc2hvc3QtPm1heF9sdW4pOworCS8qCisJICogSWYgdGhpcyBkZXZpY2UgaXMga25vd24gdG8gc3VwcG9ydCBzcGFyc2UgbXVsdGlwbGUgdW5pdHMsCisJICogb3ZlcnJpZGUgdGhlIG90aGVyIHNldHRpbmdzLCBhbmQgc2NhbiBhbGwgb2YgdGhlbS4gTm9ybWFsbHksCisJICogU0NTSS0zIGRldmljZXMgc2hvdWxkIGJlIHNjYW5uZWQgdmlhIHRoZSBSRVBPUlQgTFVOUy4KKwkgKi8KKwlpZiAoYmZsYWdzICYgQkxJU1RfU1BBUlNFTFVOKSB7CisJCW1heF9kZXZfbHVuID0gc2hvc3QtPm1heF9sdW47CisJCXNwYXJzZV9sdW4gPSAxOworCX0gZWxzZQorCQlzcGFyc2VfbHVuID0gMDsKKworCS8qCisJICogSWYgbm90IHNwYXJzZSBsdW4gYW5kIG5vIGRldmljZSBhdHRhY2hlZCBhdCBMVU4gMCBkbyBub3Qgc2NhbgorCSAqIGFueSBmdXJ0aGVyLgorCSAqLworCWlmICghc3BhcnNlX2x1biAmJiAobHVuMF9yZXMgIT0gU0NTSV9TQ0FOX0xVTl9QUkVTRU5UKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZiBsZXNzIHRoYW4gU0NTSV8xX0NTUywgYW5kIG5vIHNwZWNpYWwgbHVuIHNjYW5pbmcsIHN0b3AKKwkgKiBzY2FubmluZzsgdGhpcyBtYXRjaGVzIDIuNCBiZWhhdmlvdXIsIGJ1dCBjb3VsZCBqdXN0IGJlIGEgYnVnCisJICogKHRvIGNvbnRpbnVlIHNjYW5uaW5nIGEgU0NTSV8xX0NTUyBkZXZpY2UpLgorCSAqCisJICogVGhpcyB0ZXN0IGlzIGJyb2tlbi4gIFdlIG1pZ2h0IG5vdCBoYXZlIGFueSBkZXZpY2Ugb24gbHVuMCBmb3IKKwkgKiBhIHNwYXJzZWx1biBkZXZpY2UsIGFuZCBpZiB0aGF0J3MgdGhlIGNhc2UgdGhlbiBob3cgd291bGQgd2UKKwkgKiBrbm93IHRoZSByZWFsIHNjc2lfbGV2ZWwsIGVoPyAgSXQgbWlnaHQgbWFrZSBzZW5zZSB0byBqdXN0IG5vdAorCSAqIHNjYW4gYW55IFNDU0lfMSBkZXZpY2UgZm9yIG5vbi0wIGx1bnMsIGJ1dCB0aGF0IGNoZWNrIHdvdWxkIGJlc3QKKwkgKiBnbyBpbnRvIHNjc2lfYWxsb2Nfc2RldigpIGFuZCBqdXN0IGhhdmUgaXQgcmV0dXJuIG51bGwgd2hlbiBhc2tlZAorCSAqIHRvIGFsbG9jIGFuIHNkZXYgZm9yIGx1biA+IDAgb24gYW4gYWxyZWFkeSBmb3VuZCBTQ1NJXzEgZGV2aWNlLgorCSAqCisJaWYgKChzZGV2c2Nhbi0+c2NzaV9sZXZlbCA8IFNDU0lfMV9DQ1MpICYmCisJICAgICgoYmZsYWdzICYgKEJMSVNUX0ZPUkNFTFVOIHwgQkxJU1RfU1BBUlNFTFVOIHwgQkxJU1RfTUFYNUxVTikpCisJICAgICA9PSAwKSkKKwkJcmV0dXJuOworCSAqLworCS8qCisJICogSWYgdGhpcyBkZXZpY2UgaXMga25vd24gdG8gc3VwcG9ydCBtdWx0aXBsZSB1bml0cywgb3ZlcnJpZGUKKwkgKiB0aGUgb3RoZXIgc2V0dGluZ3MsIGFuZCBzY2FuIGFsbCBvZiB0aGVtLgorCSAqLworCWlmIChiZmxhZ3MgJiBCTElTVF9GT1JDRUxVTikKKwkJbWF4X2Rldl9sdW4gPSBzaG9zdC0+bWF4X2x1bjsKKwkvKgorCSAqIFJFR0FMIENEQy00WDogYXZvaWQgaGFuZyBhZnRlciBMVU4gNAorCSAqLworCWlmIChiZmxhZ3MgJiBCTElTVF9NQVg1TFVOKQorCQltYXhfZGV2X2x1biA9IG1pbig1VSwgbWF4X2Rldl9sdW4pOworCS8qCisJICogRG8gbm90IHNjYW4gU0NTSS0yIG9yIGxvd2VyIGRldmljZSBwYXN0IExVTiA3LCB1bmxlc3MKKwkgKiBCTElTVF9MQVJHRUxVTi4KKwkgKi8KKwlpZiAoc2NzaV9sZXZlbCA8IFNDU0lfMyAmJiAhKGJmbGFncyAmIEJMSVNUX0xBUkdFTFVOKSkKKwkJbWF4X2Rldl9sdW4gPSBtaW4oOFUsIG1heF9kZXZfbHVuKTsKKworCS8qCisJICogV2UgaGF2ZSBhbHJlYWR5IHNjYW5uZWQgTFVOIDAsIHNvIHN0YXJ0IGF0IExVTiAxLiBLZWVwIHNjYW5uaW5nCisJICogdW50aWwgd2UgcmVhY2ggdGhlIG1heCwgb3Igbm8gTFVOIGlzIGZvdW5kIGFuZCB3ZSBhcmUgbm90CisJICogc3BhcnNlX2x1bi4KKwkgKi8KKwlmb3IgKGx1biA9IDE7IGx1biA8IG1heF9kZXZfbHVuOyArK2x1bikKKwkJaWYgKChzY3NpX3Byb2JlX2FuZF9hZGRfbHVuKHN0YXJnZXQsIGx1biwgTlVMTCwgTlVMTCwgcmVzY2FuLAorCQkJCQkgICAgTlVMTCkgIT0gU0NTSV9TQ0FOX0xVTl9QUkVTRU5UKSAmJgorCQkgICAgIXNwYXJzZV9sdW4pCisJCQlyZXR1cm47Cit9CisKKy8qKgorICogc2NzaWx1bl90b19pbnQ6IGNvbnZlcnQgYSBzY3NpX2x1biB0byBhbiBpbnQKKyAqIEBzY3NpbHVuOglzdHJ1Y3Qgc2NzaV9sdW4gdG8gYmUgY29udmVydGVkLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIENvbnZlcnQgQHNjc2lsdW4gZnJvbSBhIHN0cnVjdCBzY3NpX2x1biB0byBhIGZvdXIgYnl0ZSBob3N0IGJ5dGUtb3JkZXJlZAorICogICAgIGludGVnZXIsIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gVGhlIGNhbGxlciBtdXN0IGNoZWNrIGZvcgorICogICAgIHRydW5jYXRpb24gYmVmb3JlIHVzaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICogTm90ZXM6CisgKiAgICAgVGhlIHN0cnVjdCBzY3NpX2x1biBpcyBhc3N1bWVkIHRvIGJlIGZvdXIgbGV2ZWxzLCB3aXRoIGVhY2ggbGV2ZWwKKyAqICAgICBlZmZlY3RpdmVseSBjb250YWluaW5nIGEgU0NTSSBieXRlLW9yZGVyZWQgKGJpZyBlbmRpYW4pIHNob3J0OyB0aGUKKyAqICAgICBhZGRyZXNzaW5nIGJpdHMgb2YgZWFjaCBsZXZlbCBhcmUgaWdub3JlZCAodGhlIGhpZ2hlc3QgdHdvIGJpdHMpLgorICogICAgIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBMVU4gZm9ybWF0LCBwb3N0IFNDU0ktMyBzZWUgdGhlIFNDU0kKKyAqICAgICBBcmNoaXRlY3R1cmUgTW9kZWwsIGZvciBTQ1NJLTMgc2VlIHRoZSBTQ1NJIENvbnRyb2xsZXIgQ29tbWFuZHMuCisgKgorICogICAgIEdpdmVuIGEgc3RydWN0IHNjc2lfbHVuIG9mOiAwYSAwNCAwYiAwMyAwMCAwMCAwMCAwMCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgKiAgICAgdGhlIGludGVnZXI6IDB4MGIwMzBhMDQKKyAqKi8KK3N0YXRpYyBpbnQgc2NzaWx1bl90b19pbnQoc3RydWN0IHNjc2lfbHVuICpzY3NpbHVuKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBsdW47CisKKwlsdW4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YobHVuKTsgaSArPSAyKQorCQlsdW4gPSBsdW4gfCAoKChzY3NpbHVuLT5zY3NpX2x1bltpXSA8PCA4KSB8CisJCQkgICAgICBzY3NpbHVuLT5zY3NpX2x1bltpICsgMV0pIDw8IChpICogOCkpOworCXJldHVybiBsdW47Cit9CisKKy8qKgorICogc2NzaV9yZXBvcnRfbHVuX3NjYW4gLSBTY2FuIHVzaW5nIFNDU0kgUkVQT1JUIExVTiByZXN1bHRzCisgKiBAc2RldnNjYW46CXNjYW4gdGhlIGhvc3QsIGNoYW5uZWwsIGFuZCBpZCBvZiB0aGlzIFNjc2lfRGV2aWNlCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgSWYgQHNkZXZzY2FuIGlzIGZvciBhIFNDU0ktMyBvciB1cCBkZXZpY2UsIHNlbmQgYSBSRVBPUlQgTFVOCisgKiAgICAgY29tbWFuZCwgYW5kIHNjYW4gdGhlIHJlc3VsdGluZyBsaXN0IG9mIExVTnMgYnkgY2FsbGluZworICogICAgIHNjc2lfcHJvYmVfYW5kX2FkZF9sdW4uCisgKgorICogICAgIE1vZGlmaWVzIHNkZXZzY2FuLT5sdW4uCisgKgorICogUmV0dXJuOgorICogICAgIDA6IHNjYW4gY29tcGxldGVkIChvciBubyBtZW1vcnksIHNvIGZ1cnRoZXIgc2Nhbm5pbmcgaXMgZnV0aWxlKQorICogICAgIDE6IG5vIHJlcG9ydCBsdW4gc2Nhbiwgb3Igbm90IGNvbmZpZ3VyZWQKKyAqKi8KK3N0YXRpYyBpbnQgc2NzaV9yZXBvcnRfbHVuX3NjYW4oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgYmZsYWdzLAorCQkJCWludCByZXNjYW4pCit7CisJY2hhciBkZXZuYW1lWzY0XTsKKwl1bnNpZ25lZCBjaGFyIHNjc2lfY21kW01BWF9DT01NQU5EX1NJWkVdOworCXVuc2lnbmVkIGludCBsZW5ndGg7CisJdW5zaWduZWQgaW50IGx1bjsKKwl1bnNpZ25lZCBpbnQgbnVtX2x1bnM7CisJdW5zaWduZWQgaW50IHJldHJpZXM7CisJc3RydWN0IHNjc2lfbHVuICpsdW5wLCAqbHVuX2RhdGE7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcTsKKwl1OCAqZGF0YTsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gc2NzaV90YXJnZXQoc2Rldik7CisKKwkvKgorCSAqIE9ubHkgc3VwcG9ydCBTQ1NJLTMgYW5kIHVwIGRldmljZXMgaWYgQkxJU1RfTk9SRVBPUlRMVU4gaXMgbm90IHNldC4KKwkgKiBBbHNvIGFsbG93IFNDU0ktMiBpZiBCTElTVF9SRVBPUlRMVU4yIGlzIHNldCBhbmQgaG9zdCBhZGFwdGVyIGRvZXMKKwkgKiBzdXBwb3J0IG1vcmUgdGhhbiA4IExVTnMuCisJICovCisJaWYgKChiZmxhZ3MgJiBCTElTVF9OT1JFUE9SVExVTikgfHwgCisJICAgICBzZGV2LT5zY3NpX2xldmVsIDwgU0NTSV8yIHx8CisJICAgIChzZGV2LT5zY3NpX2xldmVsIDwgU0NTSV8zICYmIAorCSAgICAgKCEoYmZsYWdzICYgQkxJU1RfUkVQT1JUTFVOMikgfHwgc2Rldi0+aG9zdC0+bWF4X2x1biA8PSA4KSkgKQorCQlyZXR1cm4gMTsKKwlpZiAoYmZsYWdzICYgQkxJU1RfTk9MVU4pCisJCXJldHVybiAwOworCisJc3JlcSA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChzZGV2LCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNyZXEpCisJCWdvdG8gb3V0OworCisJc3ByaW50ZihkZXZuYW1lLCAiaG9zdCAlZCBjaGFubmVsICVkIGlkICVkIiwKKwkJc2Rldi0+aG9zdC0+aG9zdF9ubywgc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQpOworCisJLyoKKwkgKiBBbGxvY2F0ZSBlbm91Z2ggdG8gaG9sZCB0aGUgaGVhZGVyICh0aGUgc2FtZSBzaXplIGFzIG9uZSBzY3NpX2x1bikKKwkgKiBwbHVzIHRoZSBtYXggbnVtYmVyIG9mIGx1bnMgd2UgYXJlIHJlcXVlc3RpbmcuCisJICoKKwkgKiBSZWFsbG9jYXRpbmcgYW5kIHRyeWluZyBhZ2FpbiAod2l0aCB0aGUgZXhhY3QgYW1vdW50IHdlIG5lZWQpCisJICogd291bGQgYmUgbmljZSwgYnV0IHRoZW4gd2UgbmVlZCB0byBzb21laG93IGxpbWl0IHRoZSBzaXplCisJICogYWxsb2NhdGVkIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgbWVtb3J5IGFuZCB0aGUgbGltaXRzIG9mCisJICoga21hbGxvYyAtIHdlIGRvbid0IHdhbnQgYSBrbWFsbG9jKCkgZmFpbHVyZSBvZiBhIGh1Z2UgdmFsdWUgdG8KKwkgKiBwcmV2ZW50IHVzIGZyb20gZmluZGluZyBhbnkgTFVOcyBvbiB0aGlzIHRhcmdldC4KKwkgKi8KKwlsZW5ndGggPSAobWF4X3Njc2lfcmVwb3J0X2x1bnMgKyAxKSAqIHNpemVvZihzdHJ1Y3Qgc2NzaV9sdW4pOworCWx1bl9kYXRhID0ga21hbGxvYyhsZW5ndGgsIEdGUF9BVE9NSUMgfAorCQkJICAgKHNkZXYtPmhvc3QtPnVuY2hlY2tlZF9pc2FfZG1hID8gX19HRlBfRE1BIDogMCkpOworCWlmICghbHVuX2RhdGEpCisJCWdvdG8gb3V0X3JlbGVhc2VfcmVxdWVzdDsKKworCXNjc2lfY21kWzBdID0gUkVQT1JUX0xVTlM7CisKKwkvKgorCSAqIGJ5dGVzIDEgLSA1OiByZXNlcnZlZCwgc2V0IHRvIHplcm8uCisJICovCisJbWVtc2V0KCZzY3NpX2NtZFsxXSwgMCwgNSk7CisKKwkvKgorCSAqIGJ5dGVzIDYgLSA5OiBsZW5ndGggb2YgdGhlIGNvbW1hbmQuCisJICovCisJc2NzaV9jbWRbNl0gPSAodW5zaWduZWQgY2hhcikgKGxlbmd0aCA+PiAyNCkgJiAweGZmOworCXNjc2lfY21kWzddID0gKHVuc2lnbmVkIGNoYXIpIChsZW5ndGggPj4gMTYpICYgMHhmZjsKKwlzY3NpX2NtZFs4XSA9ICh1bnNpZ25lZCBjaGFyKSAobGVuZ3RoID4+IDgpICYgMHhmZjsKKwlzY3NpX2NtZFs5XSA9ICh1bnNpZ25lZCBjaGFyKSBsZW5ndGggJiAweGZmOworCisJc2NzaV9jbWRbMTBdID0gMDsJLyogcmVzZXJ2ZWQgKi8KKwlzY3NpX2NtZFsxMV0gPSAwOwkvKiBjb250cm9sICovCisJc3JlcS0+c3JfY21kX2xlbiA9IDA7CisJc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisKKwkvKgorCSAqIFdlIGNhbiBnZXQgYSBVTklUIEFUVEVOVElPTiwgZm9yIGV4YW1wbGUgYSBwb3dlciBvbi9yZXNldCwgc28KKwkgKiByZXRyeSBhIGZldyB0aW1lcyAobGlrZSBzZC5jIGRvZXMgZm9yIFRFU1QgVU5JVCBSRUFEWSkuCisJICogRXhwZXJpZW5jZSBzaG93cyBzb21lIGNvbWJpbmF0aW9ucyBvZiBhZGFwdGVyL2RldmljZXMgZ2V0IGF0CisJICogbGVhc3QgdHdvIHBvd2VyIG9uL3Jlc2V0cy4KKwkgKgorCSAqIElsbGVnYWwgcmVxdWVzdHMgKGZvciBkZXZpY2VzIHRoYXQgZG8gbm90IHN1cHBvcnQgUkVQT1JUIExVTlMpCisJICogc2hvdWxkIGNvbWUgdGhyb3VnaCBhcyBhIGNoZWNrIGNvbmRpdGlvbiwgYW5kIHdpbGwgbm90IGdlbmVyYXRlCisJICogYSByZXRyeS4KKwkgKi8KKwlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgMzsgcmV0cmllcysrKSB7CisJCVNDU0lfTE9HX1NDQU5fQlVTKDMsIHByaW50ayAoS0VSTl9JTkZPICJzY3NpIHNjYW46IFNlbmRpbmciCisJCQkJIiBSRVBPUlQgTFVOUyB0byAlcyAodHJ5ICVkKVxuIiwgZGV2bmFtZSwKKwkJCQlyZXRyaWVzKSk7CisJCXNjc2lfd2FpdF9yZXEoc3JlcSwgc2NzaV9jbWQsIGx1bl9kYXRhLCBsZW5ndGgsCisJCQkJU0NTSV9USU1FT1VUICsgNCpIWiwgMyk7CisJCVNDU0lfTE9HX1NDQU5fQlVTKDMsIHByaW50ayAoS0VSTl9JTkZPICJzY3NpIHNjYW46IFJFUE9SVCBMVU5TIgorCQkJCSIgJXMgKHRyeSAlZCkgcmVzdWx0IDB4JXhcbiIsIHNyZXEtPnNyX3Jlc3VsdAorCQkJCT8gICJmYWlsZWQiIDogInN1Y2Nlc3NmdWwiLCByZXRyaWVzLAorCQkJCXNyZXEtPnNyX3Jlc3VsdCkpOworCQlpZiAoc3JlcS0+c3JfcmVzdWx0ID09IDApCisJCQlicmVhazsKKwkJZWxzZSBpZiAoc2NzaV9yZXF1ZXN0X25vcm1hbGl6ZV9zZW5zZShzcmVxLCAmc3NoZHIpKSB7CisJCQlpZiAoc3NoZHIuc2Vuc2Vfa2V5ICE9IFVOSVRfQVRURU5USU9OKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHNyZXEtPnNyX3Jlc3VsdCkgeworCQkvKgorCQkgKiBUaGUgZGV2aWNlIHByb2JhYmx5IGRvZXMgbm90IHN1cHBvcnQgYSBSRVBPUlQgTFVOIGNvbW1hbmQKKwkJICovCisJCWtmcmVlKGx1bl9kYXRhKTsKKwkJc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JlcSk7CisJCXJldHVybiAxOworCX0KKwlzY3NpX3JlbGVhc2VfcmVxdWVzdChzcmVxKTsKKworCS8qCisJICogR2V0IHRoZSBsZW5ndGggZnJvbSB0aGUgZmlyc3QgZm91ciBieXRlcyBvZiBsdW5fZGF0YS4KKwkgKi8KKwlkYXRhID0gKHU4ICopIGx1bl9kYXRhLT5zY3NpX2x1bjsKKwlsZW5ndGggPSAoKGRhdGFbMF0gPDwgMjQpIHwgKGRhdGFbMV0gPDwgMTYpIHwKKwkJICAoZGF0YVsyXSA8PCA4KSB8IChkYXRhWzNdIDw8IDApKTsKKworCW51bV9sdW5zID0gKGxlbmd0aCAvIHNpemVvZihzdHJ1Y3Qgc2NzaV9sdW4pKTsKKwlpZiAobnVtX2x1bnMgPiBtYXhfc2NzaV9yZXBvcnRfbHVucykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpOiBPbiAlcyBvbmx5ICVkIChtYXhfc2NzaV9yZXBvcnRfbHVucykiCisJCSAgICAgICAiIG9mICVkIGx1bnMgcmVwb3J0ZWQsIHRyeSBpbmNyZWFzaW5nIgorCQkgICAgICAgIiBtYXhfc2NzaV9yZXBvcnRfbHVucy5cbiIsIGRldm5hbWUsCisJCSAgICAgICBtYXhfc2NzaV9yZXBvcnRfbHVucywgbnVtX2x1bnMpOworCQludW1fbHVucyA9IG1heF9zY3NpX3JlcG9ydF9sdW5zOworCX0KKworCVNDU0lfTE9HX1NDQU5fQlVTKDMsIHByaW50ayAoS0VSTl9JTkZPICJzY3NpIHNjYW46IFJFUE9SVCBMVU4gc2NhbiBvZiIKKwkJCSIgaG9zdCAlZCBjaGFubmVsICVkIGlkICVkXG4iLCBzZGV2LT5ob3N0LT5ob3N0X25vLAorCQkJc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQpKTsKKworCS8qCisJICogU2NhbiB0aGUgbHVucyBpbiBsdW5fZGF0YS4gVGhlIGVudHJ5IGF0IG9mZnNldCAwIGlzIHJlYWxseQorCSAqIHRoZSBoZWFkZXIsIHNvIHN0YXJ0IGF0IDEgYW5kIGdvIHVwIHRvIGFuZCBpbmNsdWRpbmcgbnVtX2x1bnMuCisJICovCisJZm9yIChsdW5wID0gJmx1bl9kYXRhWzFdOyBsdW5wIDw9ICZsdW5fZGF0YVtudW1fbHVuc107IGx1bnArKykgeworCQlsdW4gPSBzY3NpbHVuX3RvX2ludChsdW5wKTsKKworCQkvKgorCQkgKiBDaGVjayBpZiB0aGUgdW51c2VkIHBhcnQgb2YgbHVucCBpcyBub24temVybywgYW5kIHNvCisJCSAqIGRvZXMgbm90IGZpdCBpbiBsdW4uCisJCSAqLworCQlpZiAobWVtY21wKCZsdW5wLT5zY3NpX2x1bltzaXplb2YobHVuKV0sICJcMFwwXDBcMCIsIDQpKSB7CisJCQlpbnQgaTsKKworCQkJLyoKKwkJCSAqIE91dHB1dCBhbiBlcnJvciBkaXNwbGF5aW5nIHRoZSBMVU4gaW4gYnl0ZSBvcmRlciwKKwkJCSAqIHRoaXMgZGlmZmVycyBmcm9tIHdoYXQgbGludXggd291bGQgcHJpbnQgZm9yIHRoZQorCQkJICogaW50ZWdlciBMVU4gdmFsdWUuCisJCQkgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2k6ICVzIGx1biAweCIsIGRldm5hbWUpOworCQkJZGF0YSA9IChjaGFyICopbHVucC0+c2NzaV9sdW47CisJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCBzY3NpX2x1bik7IGkrKykKKwkJCQlwcmludGsoIiUwMngiLCBkYXRhW2ldKTsKKwkJCXByaW50aygiIGhhcyBhIExVTiBsYXJnZXIgdGhhbiBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIik7CisJCX0gZWxzZSBpZiAobHVuID09IDApIHsKKwkJCS8qCisJCQkgKiBMVU4gMCBoYXMgYWxyZWFkeSBiZWVuIHNjYW5uZWQuCisJCQkgKi8KKwkJfSBlbHNlIGlmIChsdW4gPiBzZGV2LT5ob3N0LT5tYXhfbHVuKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpOiAlcyBsdW4lZCBoYXMgYSBMVU4gbGFyZ2VyIgorCQkJICAgICAgICIgdGhhbiBhbGxvd2VkIGJ5IHRoZSBob3N0IGFkYXB0ZXJcbiIsCisJCQkgICAgICAgZGV2bmFtZSwgbHVuKTsKKwkJfSBlbHNlIHsKKwkJCWludCByZXM7CisKKwkJCXJlcyA9IHNjc2lfcHJvYmVfYW5kX2FkZF9sdW4oc3RhcmdldCwKKwkJCQlsdW4sIE5VTEwsIE5VTEwsIHJlc2NhbiwgTlVMTCk7CisJCQlpZiAocmVzID09IFNDU0lfU0NBTl9OT19SRVNQT05TRSkgeworCQkJCS8qCisJCQkJICogR290IHNvbWUgcmVzdWx0cywgYnV0IG5vdyBub25lLCBhYm9ydC4KKwkJCQkgKi8KKwkJCQlwcmludGsoS0VSTl9FUlIgInNjc2k6IFVuZXhwZWN0ZWQgcmVzcG9uc2UiCisJCQkJICAgICAgICIgZnJvbSAlcyBsdW4gJWQgd2hpbGUgc2Nhbm5pbmcsIHNjYW4iCisJCQkJICAgICAgICIgYWJvcnRlZFxuIiwgZGV2bmFtZSwgbHVuKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWtmcmVlKGx1bl9kYXRhKTsKKwlyZXR1cm4gMDsKKworIG91dF9yZWxlYXNlX3JlcXVlc3Q6CisJc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JlcSk7Cisgb3V0OgorCS8qCisJICogV2UgYXJlIG91dCBvZiBtZW1vcnksIGRvbid0IHRyeSBzY2FubmluZyBhbnkgZnVydGhlci4KKwkgKi8KKwlwcmludGsoQUxMT0NfRkFJTFVSRV9NU0csIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzY3NpX2RldmljZSAqX19zY3NpX2FkZF9kZXZpY2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHVpbnQgY2hhbm5lbCwKKwkJCQkgICAgICB1aW50IGlkLCB1aW50IGx1biwgdm9pZCAqaG9zdGRhdGEpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9ICZzaG9zdC0+c2hvc3RfZ2VuZGV2OworCWludCByZXM7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gc2NzaV9hbGxvY190YXJnZXQocGFyZW50LCBjaGFubmVsLCBpZCk7CisKKwlpZiAoIXN0YXJnZXQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZG93bigmc2hvc3QtPnNjYW5fbXV0ZXgpOworCXJlcyA9IHNjc2lfcHJvYmVfYW5kX2FkZF9sdW4oc3RhcmdldCwgbHVuLCBOVUxMLCAmc2RldiwgMSwgaG9zdGRhdGEpOworCWlmIChyZXMgIT0gU0NTSV9TQ0FOX0xVTl9QUkVTRU5UKQorCQlzZGV2ID0gRVJSX1BUUigtRU5PREVWKTsKKwl1cCgmc2hvc3QtPnNjYW5fbXV0ZXgpOworCXNjc2lfdGFyZ2V0X3JlYXAoc3RhcmdldCk7CisJcHV0X2RldmljZSgmc3RhcmdldC0+ZGV2KTsKKworCXJldHVybiBzZGV2OworfQorRVhQT1JUX1NZTUJPTChfX3Njc2lfYWRkX2RldmljZSk7CisKK3ZvaWQgc2NzaV9yZXNjYW5fZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NzaV9kcml2ZXIgKmRydjsKKwkKKwlpZiAoIWRldi0+ZHJpdmVyKQorCQlyZXR1cm47CisKKwlkcnYgPSB0b19zY3NpX2RyaXZlcihkZXYtPmRyaXZlcik7CisJaWYgKHRyeV9tb2R1bGVfZ2V0KGRydi0+b3duZXIpKSB7CisJCWlmIChkcnYtPnJlc2NhbikKKwkJCWRydi0+cmVzY2FuKGRldik7CisJCW1vZHVsZV9wdXQoZHJ2LT5vd25lcik7CisJfQorfQorRVhQT1JUX1NZTUJPTChzY3NpX3Jlc2Nhbl9kZXZpY2UpOworCisvKioKKyAqIHNjc2lfc2Nhbl90YXJnZXQgLSBzY2FuIGEgdGFyZ2V0IGlkLCBwb3NzaWJseSBpbmNsdWRpbmcgYWxsIExVTnMgb24gdGhlCisgKiAgICAgdGFyZ2V0LgorICogQHNkZXZzY2E6CVNjc2lfRGV2aWNlIGhhbmRsZSBmb3Igc2Nhbm5pbmcKKyAqIEBzaG9zdDoJaG9zdCB0byBzY2FuCisgKiBAY2hhbm5lbDoJY2hhbm5lbCB0byBzY2FuCisgKiBAaWQ6CQl0YXJnZXQgaWQgdG8gc2NhbgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIFNjYW4gdGhlIHRhcmdldCBpZCBvbiBAc2hvc3QsIEBjaGFubmVsLCBhbmQgQGlkLiBTY2FuIGF0IGxlYXN0IExVTgorICogICAgIDAsIGFuZCBwb3NzaWJseSBhbGwgTFVOcyBvbiB0aGUgdGFyZ2V0IGlkLgorICoKKyAqICAgICBVc2UgdGhlIHByZS1hbGxvY2F0ZWQgQHNkZXZzY2FuIGFzIGEgaGFuZGxlIGZvciB0aGUgc2Nhbm5pbmcuIFRoaXMKKyAqICAgICBmdW5jdGlvbiBzZXRzIHNkZXZzY2FuLT5ob3N0LCBzZGV2c2Nhbi0+aWQgYW5kIHNkZXZzY2FuLT5sdW47IHRoZQorICogICAgIHNjYW5uaW5nIGZ1bmN0aW9ucyBtb2RpZnkgc2RldnNjYW4tPmx1bi4KKyAqCisgKiAgICAgRmlyc3QgdHJ5IGEgUkVQT1JUIExVTiBzY2FuLCBpZiB0aGF0IGRvZXMgbm90IHNjYW4gdGhlIHRhcmdldCwgZG8gYQorICogICAgIHNlcXVlbnRpYWwgc2NhbiBvZiBMVU5zIG9uIHRoZSB0YXJnZXQgaWQuCisgKiovCit2b2lkIHNjc2lfc2Nhbl90YXJnZXQoc3RydWN0IGRldmljZSAqcGFyZW50LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCwKKwkJICAgICAgdW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBpbnQgbHVuLCBpbnQgcmVzY2FuKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHBhcmVudCk7CisJaW50IGJmbGFncyA9IDA7CisJaW50IHJlczsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBOVUxMOworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldDsKKworCWlmIChzaG9zdC0+dGhpc19pZCA9PSBpZCkKKwkJLyoKKwkJICogRG9uJ3Qgc2NhbiB0aGUgaG9zdCBhZGFwdGVyCisJCSAqLworCQlyZXR1cm47CisKKworCXN0YXJnZXQgPSBzY3NpX2FsbG9jX3RhcmdldChwYXJlbnQsIGNoYW5uZWwsIGlkKTsKKworCWlmICghc3RhcmdldCkKKwkJcmV0dXJuOworCisJZ2V0X2RldmljZSgmc3RhcmdldC0+ZGV2KTsKKwlpZiAobHVuICE9IFNDQU5fV0lMRF9DQVJEKSB7CisJCS8qCisJCSAqIFNjYW4gZm9yIGEgc3BlY2lmaWMgaG9zdC9jaGFuL2lkL2x1bi4KKwkJICovCisJCXNjc2lfcHJvYmVfYW5kX2FkZF9sdW4oc3RhcmdldCwgbHVuLCBOVUxMLCBOVUxMLCByZXNjYW4sIE5VTEwpOworCQlnb3RvIG91dF9yZWFwOworCX0KKworCS8qCisJICogU2NhbiBMVU4gMCwgaWYgdGhlcmUgaXMgc29tZSByZXNwb25zZSwgc2NhbiBmdXJ0aGVyLiBJZGVhbGx5LCB3ZQorCSAqIHdvdWxkIG5vdCBjb25maWd1cmUgTFVOIDAgdW50aWwgYWxsIExVTnMgYXJlIHNjYW5uZWQuCisJICovCisJcmVzID0gc2NzaV9wcm9iZV9hbmRfYWRkX2x1bihzdGFyZ2V0LCAwLCAmYmZsYWdzLCAmc2RldiwgcmVzY2FuLCBOVUxMKTsKKwlpZiAocmVzID09IFNDU0lfU0NBTl9MVU5fUFJFU0VOVCkgeworCQlpZiAoc2NzaV9yZXBvcnRfbHVuX3NjYW4oc2RldiwgYmZsYWdzLCByZXNjYW4pICE9IDApCisJCQkvKgorCQkJICogVGhlIFJFUE9SVCBMVU4gZGlkIG5vdCBzY2FuIHRoZSB0YXJnZXQsCisJCQkgKiBkbyBhIHNlcXVlbnRpYWwgc2Nhbi4KKwkJCSAqLworCQkJc2NzaV9zZXF1ZW50aWFsX2x1bl9zY2FuKHN0YXJnZXQsIGJmbGFncywKKwkJCQkgICAgICAgCXJlcywgc2Rldi0+c2NzaV9sZXZlbCwgcmVzY2FuKTsKKwl9IGVsc2UgaWYgKHJlcyA9PSBTQ1NJX1NDQU5fVEFSR0VUX1BSRVNFTlQpIHsKKwkJLyoKKwkJICogVGhlcmUncyBhIHRhcmdldCBoZXJlLCBidXQgbHVuIDAgaXMgb2ZmbGluZSBzbyB3ZQorCQkgKiBjYW4ndCB1c2UgdGhlIHJlcG9ydF9sdW4gc2Nhbi4gIEZhbGwgYmFjayB0byBhCisJCSAqIHNlcXVlbnRpYWwgbHVuIHNjYW4gd2l0aCBhIGJmbGFncyBvZiBTUEFSU0VMVU4gYW5kCisJCSAqIGEgZGVmYXVsdCBzY3NpIGxldmVsIG9mIFNDU0lfMgorCQkgKi8KKwkJc2NzaV9zZXF1ZW50aWFsX2x1bl9zY2FuKHN0YXJnZXQsIEJMSVNUX1NQQVJTRUxVTiwKKwkJCQlTQ1NJX1NDQU5fVEFSR0VUX1BSRVNFTlQsIFNDU0lfMiwgcmVzY2FuKTsKKwl9CisJaWYgKHNkZXYpCisJCXNjc2lfZGV2aWNlX3B1dChzZGV2KTsKKworIG91dF9yZWFwOgorCS8qIG5vdyBkZXRlcm1pbmUgaWYgdGhlIHRhcmdldCBoYXMgYW55IGNoaWxkcmVuIGF0IGFsbAorCSAqIGFuZCBpZiBub3QsIG51a2UgaXQgKi8KKwlzY3NpX3RhcmdldF9yZWFwKHN0YXJnZXQpOworCisJcHV0X2RldmljZSgmc3RhcmdldC0+ZGV2KTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9zY2FuX3RhcmdldCk7CisKK3N0YXRpYyB2b2lkIHNjc2lfc2Nhbl9jaGFubmVsKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IGx1biwgaW50IHJlc2NhbikKK3sKKwl1aW50IG9yZGVyX2lkOworCisJaWYgKGlkID09IFNDQU5fV0lMRF9DQVJEKQorCQlmb3IgKGlkID0gMDsgaWQgPCBzaG9zdC0+bWF4X2lkOyArK2lkKSB7CisJCQkvKgorCQkJICogWFhYIGFkYXB0ZXIgZHJpdmVycyB3aGVuIHBvc3NpYmxlIChGQ1AsIGlTQ1NJKQorCQkJICogY291bGQgbW9kaWZ5IG1heF9pZCB0byBtYXRjaCB0aGUgY3VycmVudCBtYXgsCisJCQkgKiBub3QgdGhlIGFic29sdXRlIG1heC4KKwkJCSAqCisJCQkgKiBYWFggYWRkIGEgc2hvc3QgaWQgaXRlcmF0b3IsIHNvIGZvciBleGFtcGxlLAorCQkJICogdGhlIEZDIElEIGNhbiBiZSB0aGUgc2FtZSBhcyBhIHRhcmdldCBpZAorCQkJICogd2l0aG91dCBhIGh1Z2Ugb3ZlcmhlYWQgb2Ygc3BhcnNlIGlkJ3MuCisJCQkgKi8KKwkJCWlmIChzaG9zdC0+cmV2ZXJzZV9vcmRlcmluZykKKwkJCQkvKgorCQkJCSAqIFNjYW4gZnJvbSBoaWdoIHRvIGxvdyBpZC4KKwkJCQkgKi8KKwkJCQlvcmRlcl9pZCA9IHNob3N0LT5tYXhfaWQgLSBpZCAtIDE7CisJCQllbHNlCisJCQkJb3JkZXJfaWQgPSBpZDsKKwkJCXNjc2lfc2Nhbl90YXJnZXQoJnNob3N0LT5zaG9zdF9nZW5kZXYsIGNoYW5uZWwsIG9yZGVyX2lkLCBsdW4sIHJlc2Nhbik7CisJCX0KKwllbHNlCisJCXNjc2lfc2Nhbl90YXJnZXQoJnNob3N0LT5zaG9zdF9nZW5kZXYsIGNoYW5uZWwsIGlkLCBsdW4sIHJlc2Nhbik7Cit9CisKK2ludCBzY3NpX3NjYW5faG9zdF9zZWxlY3RlZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgdW5zaWduZWQgaW50IGNoYW5uZWwsCisJCQkgICAgdW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBpbnQgbHVuLCBpbnQgcmVzY2FuKQoreworCVNDU0lfTE9HX1NDQU5fQlVTKDMsIHByaW50ayAoS0VSTl9JTkZPICIlczogPCV1OiV1OiV1OiV1PlxuIiwKKwkJX19GVU5DVElPTl9fLCBzaG9zdC0+aG9zdF9ubywgY2hhbm5lbCwgaWQsIGx1bikpOworCisJaWYgKCgoY2hhbm5lbCAhPSBTQ0FOX1dJTERfQ0FSRCkgJiYgKGNoYW5uZWwgPiBzaG9zdC0+bWF4X2NoYW5uZWwpKSB8fAorCSAgICAoKGlkICE9IFNDQU5fV0lMRF9DQVJEKSAmJiAoaWQgPiBzaG9zdC0+bWF4X2lkKSkgfHwKKwkgICAgKChsdW4gIT0gU0NBTl9XSUxEX0NBUkQpICYmIChsdW4gPiBzaG9zdC0+bWF4X2x1bikpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd24oJnNob3N0LT5zY2FuX211dGV4KTsKKwlpZiAoY2hhbm5lbCA9PSBTQ0FOX1dJTERfQ0FSRCkgCisJCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPD0gc2hvc3QtPm1heF9jaGFubmVsOyBjaGFubmVsKyspCisJCQlzY3NpX3NjYW5fY2hhbm5lbChzaG9zdCwgY2hhbm5lbCwgaWQsIGx1biwgcmVzY2FuKTsKKwllbHNlCisJCXNjc2lfc2Nhbl9jaGFubmVsKHNob3N0LCBjaGFubmVsLCBpZCwgbHVuLCByZXNjYW4pOworCXVwKCZzaG9zdC0+c2Nhbl9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzY3NpX3NjYW5faG9zdCAtIHNjYW4gdGhlIGdpdmVuIGFkYXB0ZXIKKyAqIEBzaG9zdDoJYWRhcHRlciB0byBzY2FuCisgKiovCit2b2lkIHNjc2lfc2Nhbl9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXNjc2lfc2Nhbl9ob3N0X3NlbGVjdGVkKHNob3N0LCBTQ0FOX1dJTERfQ0FSRCwgU0NBTl9XSUxEX0NBUkQsCisJCQkJU0NBTl9XSUxEX0NBUkQsIDApOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3NjYW5faG9zdCk7CisKKy8qKgorICogc2NzaV9zY2FuX3NpbmdsZV90YXJnZXQgLSBzY2FuIHRoZSBnaXZlbiBTQ1NJIHRhcmdldAorICogQHNob3N0OiAgICAgICAgIGFkYXB0ZXIgdG8gc2NhbgorICogQGNoYW46ICAgICAgICAgIGNoYW5uZWwgdG8gc2NhbgorICogQGlkOiAgICAgICAgICAgIHRhcmdldCBpZCB0byBzY2FuCisgKiovCit2b2lkIHNjc2lfc2Nhbl9zaW5nbGVfdGFyZ2V0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCAKKwl1bnNpZ25lZCBpbnQgY2hhbiwgdW5zaWduZWQgaW50IGlkKQoreworCXNjc2lfc2Nhbl9ob3N0X3NlbGVjdGVkKHNob3N0LCBjaGFuLCBpZCwgU0NBTl9XSUxEX0NBUkQsIDEpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3NjYW5fc2luZ2xlX3RhcmdldCk7CisKK3ZvaWQgc2NzaV9mb3JnZXRfaG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsICp0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogT2ssIHRoaXMgbG9vayBhIGJpdCBzdHJhbmdlLiAgV2UgYWx3YXlzIGxvb2sgZm9yIHRoZSBmaXJzdCBkZXZpY2UKKwkgKiBvbiB0aGUgbGlzdCBhcyBzY3NpX3JlbW92ZV9kZXZpY2UgcmVtb3ZlcyB0aGVtIGZyb20gaXQgLSB0aHVzIHdlCisJICogYWxzbyBoYXZlIHRvIHJlbGVhc2UgdGhlIGxvY2suCisJICogV2UgZG9uJ3QgbmVlZCB0byBnZXQgYW5vdGhlciByZWZlcmVuY2UgdG8gdGhlIGRldmljZSBiZWZvcmUKKwkgKiByZWxlYXNpbmcgdGhlIGxvY2sgYXMgd2UgYWxyZWFkeSBvd24gdGhlIHJlZmVyZW5jZSBmcm9tCisJICogc2NzaV9yZWdpc3Rlcl9kZXZpY2UgdGhhdCdzIHJlbGVhc2UgaW4gc2NzaV9yZW1vdmVfZGV2aWNlLiAgQW5kCisJICogYWZ0ZXIgdGhhdCB3ZSBkb24ndCBsb29rIGF0IHNkZXYgYW55bW9yZS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHN0YXJnZXQsIHRtcCwgJnNob3N0LT5fX3RhcmdldHMsIHNpYmxpbmdzKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlzY3NpX3JlbW92ZV90YXJnZXQoJnN0YXJnZXQtPmRldik7CisJCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogICAgc2NzaV9nZXRfaG9zdF9kZXYoKQorICoKKyAqIFB1cnBvc2U6ICAgICBDcmVhdGUgYSBTY3NpX0RldmljZSB0aGF0IHBvaW50cyB0byB0aGUgaG9zdCBhZGFwdGVyIGl0c2VsZi4KKyAqCisgKiBBcmd1bWVudHM6ICAgU0hwbnQgICAtIEhvc3QgdGhhdCBuZWVkcyBhIFNjc2lfRGV2aWNlCisgKgorICogTG9jayBzdGF0dXM6IE5vbmUgYXNzdW1lZC4KKyAqCisgKiBSZXR1cm5zOiAgICAgVGhlIFNjc2lfRGV2aWNlIG9yIE5VTEwKKyAqCisgKiBOb3RlczoKKyAqCUF0dGFjaCBhIHNpbmdsZSBTY3NpX0RldmljZSB0byB0aGUgU2NzaV9Ib3N0IC0gdGhpcyBzaG91bGQKKyAqCWJlIG1hZGUgdG8gbG9vayBsaWtlIGEgInBzZXVkby1kZXZpY2UiIHRoYXQgcG9pbnRzIHRvIHRoZQorICoJSEEgaXRzZWxmLgorICoKKyAqCU5vdGUgLSB0aGlzIGRldmljZSBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIGFueSBoaWdoLWxldmVsCisgKglkcml2ZXJzIChpbmNsdWRpbmcgZ2VuZXJpY3MpLCB3aGljaCBpcyBwcm9iYWJseSBub3QKKyAqCW9wdGltYWwuICBXZSBjYW4gYWRkIGhvb2tzIGxhdGVyIHRvIGF0dGFjaCAKKyAqLworc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2dldF9ob3N0X2RldihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0OworCisJc3RhcmdldCA9IHNjc2lfYWxsb2NfdGFyZ2V0KCZzaG9zdC0+c2hvc3RfZ2VuZGV2LCAwLCBzaG9zdC0+dGhpc19pZCk7CisJaWYgKCFzdGFyZ2V0KQorCQlyZXR1cm4gTlVMTDsKKworCXNkZXYgPSBzY3NpX2FsbG9jX3NkZXYoc3RhcmdldCwgMCwgTlVMTCk7CisJaWYgKHNkZXYpIHsKKwkJc2Rldi0+c2Rldl9nZW5kZXYucGFyZW50ID0gZ2V0X2RldmljZSgmc3RhcmdldC0+ZGV2KTsKKwkJc2Rldi0+Ym9ya2VuID0gMDsKKwl9CisJcHV0X2RldmljZSgmc3RhcmdldC0+ZGV2KTsKKwlyZXR1cm4gc2RldjsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9nZXRfaG9zdF9kZXYpOworCisvKgorICogRnVuY3Rpb246ICAgIHNjc2lfZnJlZV9ob3N0X2RldigpCisgKgorICogUHVycG9zZTogICAgIEZyZWUgYSBzY3NpX2RldmljZSB0aGF0IHBvaW50cyB0byB0aGUgaG9zdCBhZGFwdGVyIGl0c2VsZi4KKyAqCisgKiBBcmd1bWVudHM6ICAgU0hwbnQgICAtIEhvc3QgdGhhdCBuZWVkcyBhIFNjc2lfRGV2aWNlCisgKgorICogTG9jayBzdGF0dXM6IE5vbmUgYXNzdW1lZC4KKyAqCisgKiBSZXR1cm5zOiAgICAgTm90aGluZworICoKKyAqIE5vdGVzOgorICovCit2b2lkIHNjc2lfZnJlZV9ob3N0X2RldihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJQlVHX09OKHNkZXYtPmlkICE9IHNkZXYtPmhvc3QtPnRoaXNfaWQpOworCisJaWYgKHNkZXYtPmhvc3QtPmhvc3R0LT5zbGF2ZV9kZXN0cm95KQorCQlzZGV2LT5ob3N0LT5ob3N0dC0+c2xhdmVfZGVzdHJveShzZGV2KTsKKwl0cmFuc3BvcnRfZGVzdHJveV9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKKwlwdXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfZnJlZV9ob3N0X2Rldik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2N0bC5jIGIvZHJpdmVycy9zY3NpL3Njc2lfc3lzY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRkMDZjMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2N0bC5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ2hyaXN0b3BoIEhlbGx3aWcuCisgKglSZWxlYXNlZCB1bmRlciBHUEwgdjIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorCisjaW5jbHVkZSAic2NzaV9sb2dnaW5nLmgiCisKKworc3RhdGljIGN0bF90YWJsZSBzY3NpX3RhYmxlW10gPSB7CisJeyAuY3RsX25hbWUJPSBERVZfU0NTSV9MT0dHSU5HX0xFVkVMLAorCSAgLnByb2NuYW1lCT0gImxvZ2dpbmdfbGV2ZWwiLAorCSAgLmRhdGEJCT0gJnNjc2lfbG9nZ2luZ19sZXZlbCwKKwkgIC5tYXhsZW4JPSBzaXplb2Yoc2NzaV9sb2dnaW5nX2xldmVsKSwKKwkgIC5tb2RlCQk9IDA2NDQsCisJICAucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMgfSwKKwl7IH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgc2NzaV9kaXJfdGFibGVbXSA9IHsKKwl7IC5jdGxfbmFtZQk9IERFVl9TQ1NJLAorCSAgLnByb2NuYW1lCT0gInNjc2kiLAorCSAgLm1vZGUJCT0gMDU1NSwKKwkgIC5jaGlsZAk9IHNjc2lfdGFibGUgfSwKKwl7IH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgc2NzaV9yb290X3RhYmxlW10gPSB7CisJeyAuY3RsX25hbWUJPSBDVExfREVWLAorCSAgLnByb2NuYW1lCT0gImRldiIsCisJICAubW9kZQkJPSAwNTU1LAorCSAgLmNoaWxkCT0gc2NzaV9kaXJfdGFibGUgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqc2NzaV90YWJsZV9oZWFkZXI7CisKK2ludCBfX2luaXQgc2NzaV9pbml0X3N5c2N0bCh2b2lkKQoreworCXNjc2lfdGFibGVfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHNjc2lfcm9vdF90YWJsZSwgMSk7CisJaWYgKCFzY3NpX3RhYmxlX2hlYWRlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2NzaV9leGl0X3N5c2N0bCh2b2lkKQoreworCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHNjc2lfdGFibGVfaGVhZGVyKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNGQzYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCkBAIC0wLDAgKzEsODE2IEBACisvKgorICogc2NzaV9zeXNmcy5jCisgKgorICogU0NTSSBzeXNmcyBpbnRlcmZhY2Ugcm91dGluZXMuCisgKgorICogQ3JlYXRlZCB0byBwdWxsIFNDU0kgbWlkIGxheWVyIHN5c2ZzIHJvdXRpbmVzIGludG8gb25lIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlICJzY3NpX3ByaXYuaCIKKyNpbmNsdWRlICJzY3NpX2xvZ2dpbmcuaCIKKworc3RhdGljIHN0cnVjdCB7CisJZW51bSBzY3NpX2RldmljZV9zdGF0ZQl2YWx1ZTsKKwljaGFyCQkJKm5hbWU7Cit9IHNkZXZfc3RhdGVzW10gPSB7CisJeyBTREVWX0NSRUFURUQsICJjcmVhdGVkIiB9LAorCXsgU0RFVl9SVU5OSU5HLCAicnVubmluZyIgfSwKKwl7IFNERVZfQ0FOQ0VMLCAiY2FuY2VsIiB9LAorCXsgU0RFVl9ERUwsICJkZWxldGVkIiB9LAorCXsgU0RFVl9RVUlFU0NFLCAicXVpZXNjZSIgfSwKKwl7IFNERVZfT0ZGTElORSwJIm9mZmxpbmUiIH0sCisJeyBTREVWX0JMT0NLLAkiYmxvY2tlZCIgfSwKK307CisKK2NvbnN0IGNoYXIgKnNjc2lfZGV2aWNlX3N0YXRlX25hbWUoZW51bSBzY3NpX2RldmljZV9zdGF0ZSBzdGF0ZSkKK3sKKwlpbnQgaTsKKwljaGFyICpuYW1lID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc2Rldl9zdGF0ZXMpL3NpemVvZihzZGV2X3N0YXRlc1swXSk7IGkrKykgeworCQlpZiAoc2Rldl9zdGF0ZXNbaV0udmFsdWUgPT0gc3RhdGUpIHsKKwkJCW5hbWUgPSBzZGV2X3N0YXRlc1tpXS5uYW1lOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIG5hbWU7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfc2V0KHVuc2lnbmVkIGludCAqdmFsLCBjaGFyICpzcmMpCit7CisJY2hhciAqbGFzdDsKKworCWlmIChzdHJuY21wKHNyYywgIi0iLCAyMCkgPT0gMCkgeworCQkqdmFsID0gU0NBTl9XSUxEX0NBUkQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRG9lc24ndCBjaGVjayBmb3IgaW50IG92ZXJmbG93CisJCSAqLworCQkqdmFsID0gc2ltcGxlX3N0cnRvdWwoc3JjLCAmbGFzdCwgMCk7CisJCWlmICgqbGFzdCAhPSAnXDAnKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjc2lfc2NhbihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgY29uc3QgY2hhciAqc3RyKQoreworCWNoYXIgczFbMTVdLCBzMlsxNV0sIHMzWzE1XSwganVuazsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbCwgaWQsIGx1bjsKKwlpbnQgcmVzOworCisJcmVzID0gc3NjYW5mKHN0ciwgIiUxMHMgJTEwcyAlMTBzICVjIiwgczEsIHMyLCBzMywgJmp1bmspOworCWlmIChyZXMgIT0gMykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNoZWNrX3NldCgmY2hhbm5lbCwgczEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY2hlY2tfc2V0KCZpZCwgczIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY2hlY2tfc2V0KCZsdW4sIHMzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmVzID0gc2NzaV9zY2FuX2hvc3Rfc2VsZWN0ZWQoc2hvc3QsIGNoYW5uZWwsIGlkLCBsdW4sIDEpOworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBzaG9zdF9zaG93X2Z1bmN0aW9uOiBtYWNybyB0byBjcmVhdGUgYW4gYXR0ciBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvCisgKiBzaG93IGEgbm9uLWJpdCBmaWVsZC4KKyAqLworI2RlZmluZSBzaG9zdF9zaG93X2Z1bmN0aW9uKG5hbWUsIGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzaG93XyMjbmFtZSAoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGNsYXNzX2Rldik7CQlcCisJcmV0dXJuIHNucHJpbnRmIChidWYsIDIwLCBmb3JtYXRfc3RyaW5nLCBzaG9zdC0+ZmllbGQpOwkJXAorfQorCisvKgorICogc2hvc3RfcmRfYXR0cjogbWFjcm8gdG8gY3JlYXRlIGEgZnVuY3Rpb24gYW5kIGF0dHJpYnV0ZSB2YXJpYWJsZSBmb3IgYQorICogcmVhZCBvbmx5IGZpZWxkLgorICovCisjZGVmaW5lIHNob3N0X3JkX2F0dHIyKG5hbWUsIGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJCVwKKwlzaG9zdF9zaG93X2Z1bmN0aW9uKG5hbWUsIGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJCVwKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93XyMjbmFtZSwgTlVMTCk7CisKKyNkZWZpbmUgc2hvc3RfcmRfYXR0cihmaWVsZCwgZm9ybWF0X3N0cmluZykgXAorc2hvc3RfcmRfYXR0cjIoZmllbGQsIGZpZWxkLCBmb3JtYXRfc3RyaW5nKQorCisvKgorICogQ3JlYXRlIHRoZSBhY3R1YWwgc2hvdy9zdG9yZSBmdW5jdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcy4KKyAqLworCitzdGF0aWMgc3NpemVfdCBzdG9yZV9zY2FuKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY29uc3QgY2hhciAqYnVmLAorCQkJICBzaXplX3QgY291bnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjbGFzc19kZXYpOworCWludCByZXM7CisKKwlyZXMgPSBzY3NpX3NjYW4oc2hvc3QsIGJ1Zik7CisJaWYgKHJlcyA9PSAwKQorCQlyZXMgPSBjb3VudDsKKwlyZXR1cm4gcmVzOworfTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihzY2FuLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9zY2FuKTsKKworc2hvc3RfcmRfYXR0cih1bmlxdWVfaWQsICIldVxuIik7CitzaG9zdF9yZF9hdHRyKGhvc3RfYnVzeSwgIiVodVxuIik7CitzaG9zdF9yZF9hdHRyKGNtZF9wZXJfbHVuLCAiJWhkXG4iKTsKK3Nob3N0X3JkX2F0dHIoc2dfdGFibGVzaXplLCAiJWh1XG4iKTsKK3Nob3N0X3JkX2F0dHIodW5jaGVja2VkX2lzYV9kbWEsICIlZFxuIik7CitzaG9zdF9yZF9hdHRyMihwcm9jX25hbWUsIGhvc3R0LT5wcm9jX25hbWUsICIlc1xuIik7CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqc2NzaV9zeXNmc19zaG9zdF9hdHRyc1tdID0geworCSZjbGFzc19kZXZpY2VfYXR0cl91bmlxdWVfaWQsCisJJmNsYXNzX2RldmljZV9hdHRyX2hvc3RfYnVzeSwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfY21kX3Blcl9sdW4sCisJJmNsYXNzX2RldmljZV9hdHRyX3NnX3RhYmxlc2l6ZSwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfdW5jaGVja2VkX2lzYV9kbWEsCisJJmNsYXNzX2RldmljZV9hdHRyX3Byb2NfbmFtZSwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfc2NhbiwKKwlOVUxMCit9OworCitzdGF0aWMgdm9pZCBzY3NpX2RldmljZV9jbHNfcmVsZWFzZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCisJc2RldiA9IGNsYXNzX3RvX3NkZXYoY2xhc3NfZGV2KTsKKwlwdXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7Cit9CisKK3ZvaWQgc2NzaV9kZXZpY2VfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwYXJlbnQgPSBkZXYtPnBhcmVudDsKKwlzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwlzdGFyZ2V0ID0gdG9fc2NzaV90YXJnZXQocGFyZW50KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNkZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXN0YXJnZXQtPnJlYXBfcmVmKys7CisJbGlzdF9kZWwoJnNkZXYtPnNpYmxpbmdzKTsKKwlsaXN0X2RlbCgmc2Rldi0+c2FtZV90YXJnZXRfc2libGluZ3MpOworCWxpc3RfZGVsKCZzZGV2LT5zdGFydmVkX2VudHJ5KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNkZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKHNkZXYtPnJlcXVlc3RfcXVldWUpIHsKKwkJc2Rldi0+cmVxdWVzdF9xdWV1ZS0+cXVldWVkYXRhID0gTlVMTDsKKwkJc2NzaV9mcmVlX3F1ZXVlKHNkZXYtPnJlcXVlc3RfcXVldWUpOworCX0KKworCXNjc2lfdGFyZ2V0X3JlYXAoc2NzaV90YXJnZXQoc2RldikpOworCisJa2ZyZWUoc2Rldi0+aW5xdWlyeSk7CisJa2ZyZWUoc2Rldik7CisKKwlpZiAocGFyZW50KQorCQlwdXRfZGV2aWNlKHBhcmVudCk7Cit9CisKK3N0cnVjdCBjbGFzcyBzZGV2X2NsYXNzID0geworCS5uYW1lCQk9ICJzY3NpX2RldmljZSIsCisJLnJlbGVhc2UJPSBzY3NpX2RldmljZV9jbHNfcmVsZWFzZSwKK307CisKKy8qIGFsbCBwcm9iaW5nIGlzIGRvbmUgaW4gdGhlIGluZGl2aWR1YWwgLT5wcm9iZSByb3V0aW5lcyAqLworc3RhdGljIGludCBzY3NpX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpnZW5kcnYpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZHAgPSB0b19zY3NpX2RldmljZShkZXYpOworCWlmIChzZHAtPm5vX3VsZF9hdHRhY2gpCisJCXJldHVybiAwOworCXJldHVybiAoc2RwLT5pbnFfcGVyaXBoX3F1YWwgPT0gU0NTSV9JTlFfUFFfQ09OKT8gMTogMDsKK30KKworc3RydWN0IGJ1c190eXBlIHNjc2lfYnVzX3R5cGUgPSB7CisgICAgICAgIC5uYW1lCQk9ICJzY3NpIiwKKyAgICAgICAgLm1hdGNoCQk9IHNjc2lfYnVzX21hdGNoLAorfTsKKworaW50IHNjc2lfc3lzZnNfcmVnaXN0ZXIodm9pZCkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGJ1c19yZWdpc3Rlcigmc2NzaV9idXNfdHlwZSk7CisJaWYgKCFlcnJvcikgeworCQllcnJvciA9IGNsYXNzX3JlZ2lzdGVyKCZzZGV2X2NsYXNzKTsKKwkJaWYgKGVycm9yKQorCQkJYnVzX3VucmVnaXN0ZXIoJnNjc2lfYnVzX3R5cGUpOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKwordm9pZCBzY3NpX3N5c2ZzX3VucmVnaXN0ZXIodm9pZCkKK3sKKwljbGFzc191bnJlZ2lzdGVyKCZzZGV2X2NsYXNzKTsKKwlidXNfdW5yZWdpc3Rlcigmc2NzaV9idXNfdHlwZSk7Cit9CisKKy8qCisgKiBzZGV2X3Nob3dfZnVuY3Rpb246IG1hY3JvIHRvIGNyZWF0ZSBhbiBhdHRyIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8KKyAqIHNob3cgYSBub24tYml0IGZpZWxkLgorICovCisjZGVmaW5lIHNkZXZfc2hvd19mdW5jdGlvbihmaWVsZCwgZm9ybWF0X3N0cmluZykJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3NkZXZfc2hvd18jI2ZpZWxkIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJCQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CQkJCQlcCisJc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CQkJCQlcCisJcmV0dXJuIHNucHJpbnRmIChidWYsIDIwLCBmb3JtYXRfc3RyaW5nLCBzZGV2LT5maWVsZCk7CQlcCit9CQkJCQkJCQkJXAorCisvKgorICogc2Rldl9yZF9hdHRyOiBtYWNybyB0byBjcmVhdGUgYSBmdW5jdGlvbiBhbmQgYXR0cmlidXRlIHZhcmlhYmxlIGZvciBhCisgKiByZWFkIG9ubHkgZmllbGQuCisgKi8KKyNkZWZpbmUgc2Rldl9yZF9hdHRyKGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJCQlcCisJc2Rldl9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihmaWVsZCwgU19JUlVHTywgc2Rldl9zaG93XyMjZmllbGQsIE5VTEwpOworCisKKy8qCisgKiBzZGV2X3JkX2F0dHI6IGNyZWF0ZSBhIGZ1bmN0aW9uIGFuZCBhdHRyaWJ1dGUgdmFyaWFibGUgZm9yIGEKKyAqIHJlYWQvd3JpdGUgZmllbGQuCisgKi8KKyNkZWZpbmUgc2Rldl9yd19hdHRyKGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJCQlcCisJc2Rldl9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorc2Rldl9zdG9yZV8jI2ZpZWxkIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsJCQkJCVwKKwlzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsJCQkJCVwKKwlzbnNjYW5mIChidWYsIDIwLCBmb3JtYXRfc3RyaW5nLCAmc2Rldi0+ZmllbGQpOwkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIoZmllbGQsIFNfSVJVR08gfCBTX0lXVVNSLCBzZGV2X3Nob3dfIyNmaWVsZCwgc2Rldl9zdG9yZV8jI2ZpZWxkKTsKKworLyogQ3VycmVudGx5IHdlIGRvbid0IGV4cG9ydCBiaXQgZmllbGRzLCBidXQgd2UgbWlnaHQgaW4gZnV0dXJlLAorICogc28gbGVhdmUgdGhpcyBjb2RlIGluICovCisjaWYgMAorLyoKKyAqIHNkZXZfcmRfYXR0cjogY3JlYXRlIGEgZnVuY3Rpb24gYW5kIGF0dHJpYnV0ZSB2YXJpYWJsZSBmb3IgYQorICogcmVhZC93cml0ZSBiaXQgZmllbGQuCisgKi8KKyNkZWZpbmUgc2Rldl9yd19hdHRyX2JpdChmaWVsZCkJCQkJCQlcCisJc2Rldl9zaG93X2Z1bmN0aW9uKGZpZWxkLCAiJWRcbiIpCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorc2Rldl9zdG9yZV8jI2ZpZWxkIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJXAorCWludCByZXQ7CQkJCQkJCVwKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CQkJCQlcCisJcmV0ID0gc2NzaV9zZGV2X2NoZWNrX2J1Zl9iaXQoYnVmKTsJCQkJXAorCWlmIChyZXQgPj0gMCkJewkJCQkJCVwKKwkJc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CQkJCVwKKwkJc2Rldi0+ZmllbGQgPSByZXQ7CQkJCQlcCisJCXJldCA9IGNvdW50OwkJCQkJCVwKKwl9CQkJCQkJCQlcCisJcmV0dXJuIHJldDsJCQkJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihmaWVsZCwgU19JUlVHTyB8IFNfSVdVU1IsIHNkZXZfc2hvd18jI2ZpZWxkLCBzZGV2X3N0b3JlXyMjZmllbGQpOworCisvKgorICogc2NzaV9zZGV2X2NoZWNrX2J1Zl9iaXQ6IHJldHVybiAwIGlmIGJ1ZiBpcyAiMCIsIHJldHVybiAxIGlmIGJ1ZiBpcyAiMSIsCisgKiBlbHNlIHJldHVybiAtRUlOVkFMLgorICovCitzdGF0aWMgaW50IHNjc2lfc2Rldl9jaGVja19idWZfYml0KGNvbnN0IGNoYXIgKmJ1ZikKK3sKKwlpZiAoKGJ1ZlsxXSA9PSAnXDAnKSB8fCAoKGJ1ZlsxXSA9PSAnXG4nKSAmJiAoYnVmWzJdID09ICdcMCcpKSkgeworCQlpZiAoYnVmWzBdID09ICcxJykKKwkJCXJldHVybiAxOworCQllbHNlIGlmIChidWZbMF0gPT0gJzAnKQorCQkJcmV0dXJuIDA7CisJCWVsc2UgCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisjZW5kaWYKKy8qCisgKiBDcmVhdGUgdGhlIGFjdHVhbCBzaG93L3N0b3JlIGZ1bmN0aW9ucyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLgorICovCitzZGV2X3JkX2F0dHIgKGRldmljZV9ibG9ja2VkLCAiJWRcbiIpOworc2Rldl9yZF9hdHRyIChxdWV1ZV9kZXB0aCwgIiVkXG4iKTsKK3NkZXZfcmRfYXR0ciAodHlwZSwgIiVkXG4iKTsKK3NkZXZfcmRfYXR0ciAoc2NzaV9sZXZlbCwgIiVkXG4iKTsKK3NkZXZfcmRfYXR0ciAodmVuZG9yLCAiJS44c1xuIik7CitzZGV2X3JkX2F0dHIgKG1vZGVsLCAiJS4xNnNcbiIpOworc2Rldl9yZF9hdHRyIChyZXYsICIlLjRzXG4iKTsKKworc3RhdGljIHNzaXplX3QKK3NkZXZfc2hvd190aW1lb3V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJcmV0dXJuIHNucHJpbnRmIChidWYsIDIwLCAiJWRcbiIsIHNkZXYtPnRpbWVvdXQgLyBIWik7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzZGV2X3N0b3JlX3RpbWVvdXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCWludCB0aW1lb3V0OworCXNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOworCXNzY2FuZiAoYnVmLCAiJWRcbiIsICZ0aW1lb3V0KTsKKwlzZGV2LT50aW1lb3V0ID0gdGltZW91dCAqIEhaOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUih0aW1lb3V0LCBTX0lSVUdPIHwgU19JV1VTUiwgc2Rldl9zaG93X3RpbWVvdXQsIHNkZXZfc3RvcmVfdGltZW91dCk7CisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9yZXNjYW5fZmllbGQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAoreworCXNjc2lfcmVzY2FuX2RldmljZShkZXYpOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihyZXNjYW4sIFNfSVdVU1IsIE5VTEwsIHN0b3JlX3Jlc2Nhbl9maWVsZCk7CisKK3N0YXRpYyBzc2l6ZV90IHNkZXZfc3RvcmVfZGVsZXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQkJCSBzaXplX3QgY291bnQpCit7CisJc2NzaV9yZW1vdmVfZGV2aWNlKHRvX3Njc2lfZGV2aWNlKGRldikpOworCXJldHVybiBjb3VudDsKK307CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsZXRlLCBTX0lXVVNSLCBOVUxMLCBzZGV2X3N0b3JlX2RlbGV0ZSk7CisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9zdGF0ZV9maWVsZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBpOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJZW51bSBzY3NpX2RldmljZV9zdGF0ZSBzdGF0ZSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNkZXZfc3RhdGVzKS9zaXplb2Yoc2Rldl9zdGF0ZXNbMF0pOyBpKyspIHsKKwkJY29uc3QgaW50IGxlbiA9IHN0cmxlbihzZGV2X3N0YXRlc1tpXS5uYW1lKTsKKwkJaWYgKHN0cm5jbXAoc2Rldl9zdGF0ZXNbaV0ubmFtZSwgYnVmLCBsZW4pID09IDAgJiYKKwkJICAgYnVmW2xlbl0gPT0gJ1xuJykgeworCQkJc3RhdGUgPSBzZGV2X3N0YXRlc1tpXS52YWx1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghc3RhdGUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNjc2lfZGV2aWNlX3NldF9zdGF0ZShzZGV2LCBzdGF0ZSkpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK3Nob3dfc3RhdGVfZmllbGQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwljb25zdCBjaGFyICpuYW1lID0gc2NzaV9kZXZpY2Vfc3RhdGVfbmFtZShzZGV2LT5zZGV2X3N0YXRlKTsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgIiVzXG4iLCBuYW1lKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHN0YXRlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19zdGF0ZV9maWVsZCwgc3RvcmVfc3RhdGVfZmllbGQpOworCitzdGF0aWMgc3NpemVfdAorc2hvd19xdWV1ZV90eXBlX2ZpZWxkKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJY29uc3QgY2hhciAqbmFtZSA9ICJub25lIjsKKworCWlmIChzZGV2LT5vcmRlcmVkX3RhZ3MpCisJCW5hbWUgPSAib3JkZXJlZCI7CisJZWxzZSBpZiAoc2Rldi0+c2ltcGxlX3RhZ3MpCisJCW5hbWUgPSAic2ltcGxlIjsKKworCXJldHVybiBzbnByaW50ZihidWYsIDIwLCAiJXNcbiIsIG5hbWUpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIocXVldWVfdHlwZSwgU19JUlVHTywgc2hvd19xdWV1ZV90eXBlX2ZpZWxkLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QKK3Nob3dfaW9zdGF0X2NvdW50ZXJiaXRzKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIDIwLCAiJWRcbiIsIChpbnQpc2l6ZW9mKGF0b21pY190KSAqIDgpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoaW9jb3VudGVyYml0cywgU19JUlVHTywgc2hvd19pb3N0YXRfY291bnRlcmJpdHMsIE5VTEwpOworCisjZGVmaW5lIHNob3dfc2Rldl9pb3N0YXQoZmllbGQpCQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3Nob3dfaW9zdGF0XyMjZmllbGQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOwkJCVwKKwl1bnNpZ25lZCBsb25nIGxvbmcgY291bnQgPSBhdG9taWNfcmVhZCgmc2Rldi0+ZmllbGQpOwkJXAorCXJldHVybiBzbnByaW50ZihidWYsIDIwLCAiMHglbGx4XG4iLCBjb3VudCk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihmaWVsZCwgU19JUlVHTywgc2hvd19pb3N0YXRfIyNmaWVsZCwgTlVMTCkKKworc2hvd19zZGV2X2lvc3RhdChpb3JlcXVlc3RfY250KTsKK3Nob3dfc2Rldl9pb3N0YXQoaW9kb25lX2NudCk7CitzaG93X3NkZXZfaW9zdGF0KGlvZXJyX2NudCk7CisKKworLyogRGVmYXVsdCB0ZW1wbGF0ZSBmb3IgZGV2aWNlIGF0dHJpYnV0ZXMuICBNYXkgTk9UIGJlIG1vZGlmaWVkICovCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKnNjc2lfc3lzZnNfc2Rldl9hdHRyc1tdID0geworCSZkZXZfYXR0cl9kZXZpY2VfYmxvY2tlZCwKKwkmZGV2X2F0dHJfcXVldWVfZGVwdGgsCisJJmRldl9hdHRyX3F1ZXVlX3R5cGUsCisJJmRldl9hdHRyX3R5cGUsCisJJmRldl9hdHRyX3Njc2lfbGV2ZWwsCisJJmRldl9hdHRyX3ZlbmRvciwKKwkmZGV2X2F0dHJfbW9kZWwsCisJJmRldl9hdHRyX3JldiwKKwkmZGV2X2F0dHJfcmVzY2FuLAorCSZkZXZfYXR0cl9kZWxldGUsCisJJmRldl9hdHRyX3N0YXRlLAorCSZkZXZfYXR0cl90aW1lb3V0LAorCSZkZXZfYXR0cl9pb2NvdW50ZXJiaXRzLAorCSZkZXZfYXR0cl9pb3JlcXVlc3RfY250LAorCSZkZXZfYXR0cl9pb2RvbmVfY250LAorCSZkZXZfYXR0cl9pb2Vycl9jbnQsCisJTlVMTAorfTsKKworc3RhdGljIHNzaXplX3Qgc2Rldl9zdG9yZV9xdWV1ZV9kZXB0aF9ydyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgZGVwdGgsIHJldHZhbDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOworCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCA9IHNkZXYtPmhvc3QtPmhvc3R0OworCisJaWYgKCFzaHQtPmNoYW5nZV9xdWV1ZV9kZXB0aCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXB0aCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisKKwlpZiAoZGVwdGggPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHZhbCA9IHNodC0+Y2hhbmdlX3F1ZXVlX2RlcHRoKHNkZXYsIGRlcHRoKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHNkZXZfYXR0cl9xdWV1ZV9kZXB0aF9ydyA9CisJX19BVFRSKHF1ZXVlX2RlcHRoLCBTX0lSVUdPIHwgU19JV1VTUiwgc2Rldl9zaG93X3F1ZXVlX2RlcHRoLAorCSAgICAgICBzZGV2X3N0b3JlX3F1ZXVlX2RlcHRoX3J3KTsKKworc3RhdGljIHNzaXplX3Qgc2Rldl9zdG9yZV9xdWV1ZV90eXBlX3J3KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQkJCQlzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQgPSBzZGV2LT5ob3N0LT5ob3N0dDsKKwlpbnQgdGFnX3R5cGUgPSAwLCByZXR2YWw7CisJaW50IHByZXZfdGFnX3R5cGUgPSBzY3NpX2dldF90YWdfdHlwZShzZGV2KTsKKworCWlmICghc2Rldi0+dGFnZ2VkX3N1cHBvcnRlZCB8fCAhc2h0LT5jaGFuZ2VfcXVldWVfdHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3RybmNtcChidWYsICJvcmRlcmVkIiwgNykgPT0gMCkKKwkJdGFnX3R5cGUgPSBNU0dfT1JERVJFRF9UQUc7CisJZWxzZSBpZiAoc3RybmNtcChidWYsICJzaW1wbGUiLCA2KSA9PSAwKQorCQl0YWdfdHlwZSA9IE1TR19TSU1QTEVfVEFHOworCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCAibm9uZSIsIDQpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRhZ190eXBlID09IHByZXZfdGFnX3R5cGUpCisJCXJldHVybiBjb3VudDsKKworCXJldHZhbCA9IHNodC0+Y2hhbmdlX3F1ZXVlX3R5cGUoc2RldiwgdGFnX3R5cGUpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgc2Rldl9hdHRyX3F1ZXVlX3R5cGVfcncgPQorCV9fQVRUUihxdWV1ZV90eXBlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19xdWV1ZV90eXBlX2ZpZWxkLAorCSAgICAgICBzZGV2X3N0b3JlX3F1ZXVlX3R5cGVfcncpOworCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHJfY2hhbmdlZF9pbnRlcm5hbGx5KAorCQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKiBhdHRyKQoreworCWlmICghc3RyY21wKCJxdWV1ZV9kZXB0aCIsIGF0dHItPmF0dHIubmFtZSkKKwkgICAgJiYgc2hvc3QtPmhvc3R0LT5jaGFuZ2VfcXVldWVfZGVwdGgpCisJCXJldHVybiAmc2Rldl9hdHRyX3F1ZXVlX2RlcHRoX3J3OworCWVsc2UgaWYgKCFzdHJjbXAoInF1ZXVlX3R5cGUiLCBhdHRyLT5hdHRyLm5hbWUpCisJICAgICYmIHNob3N0LT5ob3N0dC0+Y2hhbmdlX3F1ZXVlX3R5cGUpCisJCXJldHVybiAmc2Rldl9hdHRyX3F1ZXVlX3R5cGVfcnc7CisJcmV0dXJuIGF0dHI7Cit9CisKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyX292ZXJyaWRkZW4oCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICoqYXR0cnMsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyKQoreworCWludCBpOworCisJaWYgKCFhdHRycykKKwkJcmV0dXJuIE5VTEw7CisJZm9yIChpID0gMDsgYXR0cnNbaV07IGkrKykKKwkJaWYgKCFzdHJjbXAoYXR0cnNbaV0tPmF0dHIubmFtZSwgYXR0ci0+YXR0ci5uYW1lKSkKKwkJCXJldHVybiBhdHRyc1tpXTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBhdHRyX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyKQoreworCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpiYXNlX2F0dHI7CisKKwkvKgorCSAqIFNwYXJlIHRoZSBjYWxsZXIgZnJvbSBoYXZpbmcgdG8gY29weSB0aGluZ3MgaXQncyBub3QgaW50ZXJlc3RlZCBpbi4KKwkgKi8KKwliYXNlX2F0dHIgPSBhdHRyX292ZXJyaWRkZW4oc2NzaV9zeXNmc19zZGV2X2F0dHJzLCBhdHRyKTsKKwlpZiAoYmFzZV9hdHRyKSB7CisJCS8qIGV4dGVuZCBwZXJtaXNzaW9ucyAqLworCQlhdHRyLT5hdHRyLm1vZGUgfD0gYmFzZV9hdHRyLT5hdHRyLm1vZGU7CisKKwkJLyogb3ZlcnJpZGUgbnVsbCBzaG93L3N0b3JlIHdpdGggZGVmYXVsdCAqLworCQlpZiAoIWF0dHItPnNob3cpCisJCQlhdHRyLT5zaG93ID0gYmFzZV9hdHRyLT5zaG93OworCQlpZiAoIWF0dHItPnN0b3JlKQorCQkJYXR0ci0+c3RvcmUgPSBiYXNlX2F0dHItPnN0b3JlOworCX0KKworCXJldHVybiBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCBhdHRyKTsKK30KKworLyoqCisgKiBzY3NpX3N5c2ZzX2FkZF9zZGV2IC0gYWRkIHNjc2kgZGV2aWNlIHRvIHN5c2ZzCisgKiBAc2RldjoJc2NzaV9kZXZpY2UgdG8gYWRkCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTAgb24gU3VjY2VzcyAvIG5vbi16ZXJvIG9uIEZhaWx1cmUKKyAqKi8KK2ludCBzY3NpX3N5c2ZzX2FkZF9zZGV2KHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlpbnQgZXJyb3IsIGk7CisKKwlpZiAoKGVycm9yID0gc2NzaV9kZXZpY2Vfc2V0X3N0YXRlKHNkZXYsIFNERVZfUlVOTklORykpICE9IDApCisJCXJldHVybiBlcnJvcjsKKworCWVycm9yID0gZGV2aWNlX2FkZCgmc2Rldi0+c2Rldl9nZW5kZXYpOworCWlmIChlcnJvcikgeworCQlwdXRfZGV2aWNlKHNkZXYtPnNkZXZfZ2VuZGV2LnBhcmVudCk7CisJCXByaW50ayhLRVJOX0lORk8gImVycm9yIDFcbiIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCWVycm9yID0gY2xhc3NfZGV2aWNlX2FkZCgmc2Rldi0+c2Rldl9jbGFzc2Rldik7CisJaWYgKGVycm9yKSB7CisJCXByaW50ayhLRVJOX0lORk8gImVycm9yIDJcbiIpOworCQlnb3RvIGNsZWFuX2RldmljZTsKKwl9CisKKwkvKiB0YWtlIGEgcmVmZXJlbmNlIGZvciB0aGUgc2Rldl9jbGFzc2RldjsgdGhpcyBpcworCSAqIHJlbGVhc2VkIGJ5IHRoZSBzZGV2X2NsYXNzIC5yZWxlYXNlICovCisJZ2V0X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCWlmIChzZGV2LT5ob3N0LT5ob3N0dC0+c2Rldl9hdHRycykgeworCQlmb3IgKGkgPSAwOyBzZGV2LT5ob3N0LT5ob3N0dC0+c2Rldl9hdHRyc1tpXTsgaSsrKSB7CisJCQllcnJvciA9IGF0dHJfYWRkKCZzZGV2LT5zZGV2X2dlbmRldiwKKwkJCQkJc2Rldi0+aG9zdC0+aG9zdHQtPnNkZXZfYXR0cnNbaV0pOworCQkJaWYgKGVycm9yKSB7CisJCQkJc2NzaV9yZW1vdmVfZGV2aWNlKHNkZXYpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorCQorCWZvciAoaSA9IDA7IHNjc2lfc3lzZnNfc2Rldl9hdHRyc1tpXTsgaSsrKSB7CisJCWlmICghYXR0cl9vdmVycmlkZGVuKHNkZXYtPmhvc3QtPmhvc3R0LT5zZGV2X2F0dHJzLAorCQkJCQlzY3NpX3N5c2ZzX3NkZXZfYXR0cnNbaV0pKSB7CisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqIGF0dHIgPSAKKwkJCQlhdHRyX2NoYW5nZWRfaW50ZXJuYWxseShzZGV2LT5ob3N0LCAKKwkJCQkJCQlzY3NpX3N5c2ZzX3NkZXZfYXR0cnNbaV0pOworCQkJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNkZXYtPnNkZXZfZ2VuZGV2LCBhdHRyKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKworCXRyYW5zcG9ydF9hZGRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7Cisgb3V0OgorCXJldHVybiBlcnJvcjsKKworIGNsZWFuX2RldmljZToKKwlzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9DQU5DRUwpOworCisJZGV2aWNlX2RlbCgmc2Rldi0+c2Rldl9nZW5kZXYpOworCXRyYW5zcG9ydF9kZXN0cm95X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCXB1dF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKKworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBzY3NpX3JlbW92ZV9kZXZpY2UgLSB1bnJlZ2lzdGVyIGEgZGV2aWNlIGZyb20gdGhlIHNjc2kgYnVzCisgKiBAc2RldjoJc2NzaV9kZXZpY2UgdG8gdW5yZWdpc3RlcgorICoqLwordm9pZCBzY3NpX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gc2Rldi0+aG9zdDsKKworCWRvd24oJnNob3N0LT5zY2FuX211dGV4KTsKKwlpZiAoc2NzaV9kZXZpY2Vfc2V0X3N0YXRlKHNkZXYsIFNERVZfQ0FOQ0VMKSAhPSAwKQorCQlnb3RvIG91dDsKKworCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCZzZGV2LT5zZGV2X2NsYXNzZGV2KTsKKwlkZXZpY2VfZGVsKCZzZGV2LT5zZGV2X2dlbmRldik7CisJc2NzaV9kZXZpY2Vfc2V0X3N0YXRlKHNkZXYsIFNERVZfREVMKTsKKwlpZiAoc2Rldi0+aG9zdC0+aG9zdHQtPnNsYXZlX2Rlc3Ryb3kpCisJCXNkZXYtPmhvc3QtPmhvc3R0LT5zbGF2ZV9kZXN0cm95KHNkZXYpOworCXRyYW5zcG9ydF91bnJlZ2lzdGVyX2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCXB1dF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKK291dDoKKwl1cCgmc2hvc3QtPnNjYW5fbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3JlbW92ZV9kZXZpY2UpOworCit2b2lkIF9fc2NzaV9yZW1vdmVfdGFyZ2V0KHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgKnRtcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlzdGFyZ2V0LT5yZWFwX3JlZisrOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzZGV2LCB0bXAsICZzaG9zdC0+X19kZXZpY2VzLCBzaWJsaW5ncykgeworCQlpZiAoc2Rldi0+Y2hhbm5lbCAhPSBzdGFyZ2V0LT5jaGFubmVsIHx8CisJCSAgICBzZGV2LT5pZCAhPSBzdGFyZ2V0LT5pZCkKKwkJCWNvbnRpbnVlOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJc2NzaV9yZW1vdmVfZGV2aWNlKHNkZXYpOworCQlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXNjc2lfdGFyZ2V0X3JlYXAoc3RhcmdldCk7Cit9CisKKy8qKgorICogc2NzaV9yZW1vdmVfdGFyZ2V0IC0gdHJ5IHRvIHJlbW92ZSBhIHRhcmdldCBhbmQgYWxsIGl0cyBkZXZpY2VzCisgKiBAZGV2OiBnZW5lcmljIHN0YXJnZXQgb3IgcGFyZW50IG9mIGdlbmVyaWMgc3RhcmdldHMgdG8gYmUgcmVtb3ZlZAorICoKKyAqIE5vdGU6IFRoaXMgaXMgc2xpZ2h0bHkgcmFjeS4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgaWYgdGhlIHVzZXIKKyAqIHJlcXVlc3RzIHRoZSBhZGRpdGlvbiBvZiBhbm90aGVyIGRldmljZSB0aGVuIHRoZSB0YXJnZXQgd29uJ3QgYmUKKyAqIHJlbW92ZWQuCisgKi8KK3ZvaWQgc2NzaV9yZW1vdmVfdGFyZ2V0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpyZGV2LCAqaWRldiwgKm5leHQ7CisKKwlpZiAoc2NzaV9pc190YXJnZXRfZGV2aWNlKGRldikpIHsKKwkJX19zY3NpX3JlbW92ZV90YXJnZXQodG9fc2NzaV90YXJnZXQoZGV2KSk7CisJCXJldHVybjsKKwl9CisKKwlyZGV2ID0gZ2V0X2RldmljZShkZXYpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpZGV2LCBuZXh0LCAmZGV2LT5jaGlsZHJlbiwgbm9kZSkgeworCQlpZiAoc2NzaV9pc190YXJnZXRfZGV2aWNlKGlkZXYpKQorCQkJX19zY3NpX3JlbW92ZV90YXJnZXQodG9fc2NzaV90YXJnZXQoaWRldikpOworCX0KKwlwdXRfZGV2aWNlKHJkZXYpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3JlbW92ZV90YXJnZXQpOworCitpbnQgc2NzaV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlkcnYtPmJ1cyA9ICZzY3NpX2J1c190eXBlOworCisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcihkcnYpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3JlZ2lzdGVyX2RyaXZlcik7CisKK2ludCBzY3NpX3JlZ2lzdGVyX2ludGVyZmFjZShzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlICppbnRmKQoreworCWludGYtPmNsYXNzID0gJnNkZXZfY2xhc3M7CisKKwlyZXR1cm4gY2xhc3NfaW50ZXJmYWNlX3JlZ2lzdGVyKGludGYpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3JlZ2lzdGVyX2ludGVyZmFjZSk7CisKKworc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICpjbGFzc19hdHRyX292ZXJyaWRkZW4oCisJCXN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICoqYXR0cnMsCisJCXN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICphdHRyKQoreworCWludCBpOworCisJaWYgKCFhdHRycykKKwkJcmV0dXJuIE5VTEw7CisJZm9yIChpID0gMDsgYXR0cnNbaV07IGkrKykKKwkJaWYgKCFzdHJjbXAoYXR0cnNbaV0tPmF0dHIubmFtZSwgYXR0ci0+YXR0ci5uYW1lKSkKKwkJCXJldHVybiBhdHRyc1tpXTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBjbGFzc19hdHRyX2FkZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc2RldiwKKwkJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIpCit7CisJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKmJhc2VfYXR0cjsKKworCS8qCisJICogU3BhcmUgdGhlIGNhbGxlciBmcm9tIGhhdmluZyB0byBjb3B5IHRoaW5ncyBpdCdzIG5vdCBpbnRlcmVzdGVkIGluLgorCSAqLworCWJhc2VfYXR0ciA9IGNsYXNzX2F0dHJfb3ZlcnJpZGRlbihzY3NpX3N5c2ZzX3Nob3N0X2F0dHJzLCBhdHRyKTsKKwlpZiAoYmFzZV9hdHRyKSB7CisJCS8qIGV4dGVuZCBwZXJtaXNzaW9ucyAqLworCQlhdHRyLT5hdHRyLm1vZGUgfD0gYmFzZV9hdHRyLT5hdHRyLm1vZGU7CisKKwkJLyogb3ZlcnJpZGUgbnVsbCBzaG93L3N0b3JlIHdpdGggZGVmYXVsdCAqLworCQlpZiAoIWF0dHItPnNob3cpCisJCQlhdHRyLT5zaG93ID0gYmFzZV9hdHRyLT5zaG93OworCQlpZiAoIWF0dHItPnN0b3JlKQorCQkJYXR0ci0+c3RvcmUgPSBiYXNlX2F0dHItPnN0b3JlOworCX0KKworCXJldHVybiBjbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoY2xhc3NkZXYsIGF0dHIpOworfQorCisvKioKKyAqIHNjc2lfc3lzZnNfYWRkX2hvc3QgLSBhZGQgc2NzaSBob3N0IHRvIHN1YnN5c3RlbQorICogQHNob3N0OiAgICAgc2NzaSBob3N0IHN0cnVjdCB0byBhZGQgdG8gc3Vic3lzdGVtCisgKiBAZGV2OiAgICAgICBwYXJlbnQgc3RydWN0IGRldmljZSBwb2ludGVyCisgKiovCitpbnQgc2NzaV9zeXNmc19hZGRfaG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpbnQgZXJyb3IsIGk7CisKKwlpZiAoc2hvc3QtPmhvc3R0LT5zaG9zdF9hdHRycykgeworCQlmb3IgKGkgPSAwOyBzaG9zdC0+aG9zdHQtPnNob3N0X2F0dHJzW2ldOyBpKyspIHsKKwkJCWVycm9yID0gY2xhc3NfYXR0cl9hZGQoJnNob3N0LT5zaG9zdF9jbGFzc2RldiwKKwkJCQkJc2hvc3QtPmhvc3R0LT5zaG9zdF9hdHRyc1tpXSk7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisJfQorCisJZm9yIChpID0gMDsgc2NzaV9zeXNmc19zaG9zdF9hdHRyc1tpXTsgaSsrKSB7CisJCWlmICghY2xhc3NfYXR0cl9vdmVycmlkZGVuKHNob3N0LT5ob3N0dC0+c2hvc3RfYXR0cnMsCisJCQkJCXNjc2lfc3lzZnNfc2hvc3RfYXR0cnNbaV0pKSB7CisJCQllcnJvciA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZSgmc2hvc3QtPnNob3N0X2NsYXNzZGV2LAorCQkJCQlzY3NpX3N5c2ZzX3Nob3N0X2F0dHJzW2ldKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwl9CisKKwl0cmFuc3BvcnRfcmVnaXN0ZXJfZGV2aWNlKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzY3NpX3N5c2ZzX2RldmljZV9pbml0aWFsaXplKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gc2Rldi0+aG9zdDsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgICpzdGFyZ2V0ID0gc2Rldi0+c2Rldl90YXJnZXQ7CisKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCXNkZXYtPnNkZXZfZ2VuZGV2LmJ1cyA9ICZzY3NpX2J1c190eXBlOworCXNkZXYtPnNkZXZfZ2VuZGV2LnJlbGVhc2UgPSBzY3NpX2RldmljZV9kZXZfcmVsZWFzZTsKKwlzcHJpbnRmKHNkZXYtPnNkZXZfZ2VuZGV2LmJ1c19pZCwiJWQ6JWQ6JWQ6JWQiLAorCQlzZGV2LT5ob3N0LT5ob3N0X25vLCBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwKKwkJc2Rldi0+bHVuKTsKKwkKKwljbGFzc19kZXZpY2VfaW5pdGlhbGl6ZSgmc2Rldi0+c2Rldl9jbGFzc2Rldik7CisJc2Rldi0+c2Rldl9jbGFzc2Rldi5kZXYgPSAmc2Rldi0+c2Rldl9nZW5kZXY7CisJc2Rldi0+c2Rldl9jbGFzc2Rldi5jbGFzcyA9ICZzZGV2X2NsYXNzOworCXNucHJpbnRmKHNkZXYtPnNkZXZfY2xhc3NkZXYuY2xhc3NfaWQsIEJVU19JRF9TSVpFLAorCQkgIiVkOiVkOiVkOiVkIiwgc2Rldi0+aG9zdC0+aG9zdF9ubywKKwkJIHNkZXYtPmNoYW5uZWwsIHNkZXYtPmlkLCBzZGV2LT5sdW4pOworCXNkZXYtPnNjc2lfbGV2ZWwgPSBTQ1NJXzI7CisJdHJhbnNwb3J0X3NldHVwX2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZzZGV2LT5zYW1lX3RhcmdldF9zaWJsaW5ncywgJnN0YXJnZXQtPmRldmljZXMpOworCWxpc3RfYWRkX3RhaWwoJnNkZXYtPnNpYmxpbmdzLCAmc2hvc3QtPl9fZGV2aWNlcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Cit9CisKK2ludCBzY3NpX2lzX3NkZXZfZGV2aWNlKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2LT5yZWxlYXNlID09IHNjc2lfZGV2aWNlX2Rldl9yZWxlYXNlOworfQorRVhQT1JUX1NZTUJPTChzY3NpX2lzX3NkZXZfZGV2aWNlKTsKKworLyogQSBibGFuayB0cmFuc3BvcnQgdGVtcGxhdGUgdGhhdCBpcyB1c2VkIGluIGRyaXZlcnMgdGhhdCBkb24ndAorICogeWV0IGltcGxlbWVudCBUcmFuc3BvcnQgQXR0cmlidXRlcyAqLworc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlIGJsYW5rX3RyYW5zcG9ydF90ZW1wbGF0ZSA9IHsgeyB7IHtOVUxMLCB9LCB9LCB9LCB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWQxYzFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMKQEAgLTAsMCArMSwxNjY1IEBACisvKiAKKyAqICBGaWJlckNoYW5uZWwgdHJhbnNwb3J0IHNwZWNpZmljIGF0dHJpYnV0ZXMgZXhwb3J0ZWQgdG8gc3lzZnMuCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqICA9PT09PT09PQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSAgIEphbWVzIFNtYXJ0LCBFbXVsZXggQ29ycG9yYXRpb24KKyAqICAgIFJld3JpdGUgZm9yIGhvc3QsIHRhcmdldCwgZGV2aWNlLCBhbmQgcmVtb3RlIHBvcnQgYXR0cmlidXRlcywKKyAqICAgIHN0YXRpc3RpY3MsIGFuZCBzZXJ2aWNlIGZ1bmN0aW9ucy4uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oPgorI2luY2x1ZGUgInNjc2lfcHJpdi5oIgorCisjZGVmaW5lIEZDX1BSSU5USyh4LCBsLCBmLCBhLi4uKQlwcmludGsobCAic2NzaSglZDolZDolZDolZCk6ICIgZiwgKHgpLT5ob3N0LT5ob3N0X25vLCAoeCktPmNoYW5uZWwsICh4KS0+aWQsICh4KS0+bHVuICwgIyNhKQorCisvKgorICogUmVkZWZpbmUgc28gdGhhdCB3ZSBjYW4gaGF2ZSBzYW1lIG5hbWVkIGF0dHJpYnV0ZXMgaW4gdGhlCisgKiBzZGV2L3N0YXJnZXQvaG9zdCBvYmplY3RzLgorICovCisjZGVmaW5lIEZDX0NMQVNTX0RFVklDRV9BVFRSKF9wcmVmaXgsX25hbWUsX21vZGUsX3Nob3csX3N0b3JlKQkJXAorc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgY2xhc3NfZGV2aWNlX2F0dHJfIyNfcHJlZml4IyNfIyNfbmFtZSA9IAlcCisJX19BVFRSKF9uYW1lLF9tb2RlLF9zaG93LF9zdG9yZSkKKworI2RlZmluZSBmY19lbnVtX25hbWVfc2VhcmNoKHRpdGxlLCB0YWJsZV90eXBlLCB0YWJsZSkJCQlcCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2ZjXyMjdGl0bGUjI19uYW1lKGVudW0gdGFibGVfdHlwZSB0YWJsZV9rZXkpCVwKK3sJCQkJCQkJCQlcCisJaW50IGk7CQkJCQkJCQlcCisJY2hhciAqbmFtZSA9IE5VTEw7CQkJCQkJXAorCQkJCQkJCQkJXAorCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodGFibGUpL3NpemVvZih0YWJsZVswXSk7IGkrKykgewkJXAorCQlpZiAodGFibGVbaV0udmFsdWUgPT0gdGFibGVfa2V5KSB7CQkJXAorCQkJbmFtZSA9IHRhYmxlW2ldLm5hbWU7CQkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJfQkJCQkJCQlcCisJfQkJCQkJCQkJXAorCXJldHVybiBuYW1lOwkJCQkJCQlcCit9CisKKyNkZWZpbmUgZmNfZW51bV9uYW1lX21hdGNoKHRpdGxlLCB0YWJsZV90eXBlLCB0YWJsZSkJCQlcCitzdGF0aWMgaW50IGdldF9mY18jI3RpdGxlIyNfbWF0Y2goY29uc3QgY2hhciAqdGFibGVfa2V5LAkJXAorCQllbnVtIHRhYmxlX3R5cGUgKnZhbHVlKQkJCQkJXAorewkJCQkJCQkJCVwKKwlpbnQgaTsJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHRhYmxlKS9zaXplb2YodGFibGVbMF0pOyBpKyspIHsJCVwKKwkJaWYgKHN0cm5jbXAodGFibGVfa2V5LCB0YWJsZVtpXS5uYW1lLAkJCVwKKwkJCQl0YWJsZVtpXS5tYXRjaGxlbikgPT0gMCkgewkJXAorCQkJKnZhbHVlID0gdGFibGVbaV0udmFsdWU7CQkJXAorCQkJcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8JCQkJXAorCQl9CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJcmV0dXJuIDE7IC8qIGZhaWx1cmUgKi8JCQkJCQlcCit9CisKKworLyogQ29udmVydCBmY19wb3J0X3R5cGUgdmFsdWVzIHRvIGFzY2lpIHN0cmluZyBuYW1lICovCitzdGF0aWMgc3RydWN0IHsKKwllbnVtIGZjX3BvcnRfdHlwZQl2YWx1ZTsKKwljaGFyCQkJKm5hbWU7Cit9IGZjX3BvcnRfdHlwZV9uYW1lc1tdID0geworCXsgRkNfUE9SVFRZUEVfVU5LTk9XTiwJCSJVbmtub3duIiB9LAorCXsgRkNfUE9SVFRZUEVfT1RIRVIsCQkiT3RoZXIiIH0sCisJeyBGQ19QT1JUVFlQRV9OT1RQUkVTRU5ULAkiTm90IFByZXNlbnQiIH0sCisJeyBGQ19QT1JUVFlQRV9OUE9SVCwJIk5Qb3J0IChmYWJyaWMgdmlhIHBvaW50LXRvLXBvaW50KSIgfSwKKwl7IEZDX1BPUlRUWVBFX05MUE9SVCwJIk5MUG9ydCAoZmFicmljIHZpYSBsb29wKSIgfSwKKwl7IEZDX1BPUlRUWVBFX0xQT1JULAkiTFBvcnQgKHByaXZhdGUgbG9vcCkiIH0sCisJeyBGQ19QT1JUVFlQRV9QVFAsCSJQb2ludC1Uby1Qb2ludCAoZGlyZWN0IG5wb3J0IGNvbm5lY3Rpb24iIH0sCit9OworZmNfZW51bV9uYW1lX3NlYXJjaChwb3J0X3R5cGUsIGZjX3BvcnRfdHlwZSwgZmNfcG9ydF90eXBlX25hbWVzKQorI2RlZmluZSBGQ19QT1JUVFlQRV9NQVhfTkFNRUxFTgkJNTAKKworCisvKiBDb252ZXJ0IGZjX3BvcnRfc3RhdGUgdmFsdWVzIHRvIGFzY2lpIHN0cmluZyBuYW1lICovCitzdGF0aWMgc3RydWN0IHsKKwllbnVtIGZjX3BvcnRfc3RhdGUJdmFsdWU7CisJY2hhcgkJCSpuYW1lOworfSBmY19wb3J0X3N0YXRlX25hbWVzW10gPSB7CisJeyBGQ19QT1JUU1RBVEVfVU5LTk9XTiwJCSJVbmtub3duIiB9LAorCXsgRkNfUE9SVFNUQVRFX05PVFBSRVNFTlQsCSJOb3QgUHJlc2VudCIgfSwKKwl7IEZDX1BPUlRTVEFURV9PTkxJTkUsCQkiT25saW5lIiB9LAorCXsgRkNfUE9SVFNUQVRFX09GRkxJTkUsCQkiT2ZmbGluZSIgfSwKKwl7IEZDX1BPUlRTVEFURV9CTE9DS0VELAkJIkJsb2NrZWQiIH0sCisJeyBGQ19QT1JUU1RBVEVfQllQQVNTRUQsCSJCeXBhc3NlZCIgfSwKKwl7IEZDX1BPUlRTVEFURV9ESUFHTk9TVElDUywJIkRpYWdub3N0aWNzIiB9LAorCXsgRkNfUE9SVFNUQVRFX0xJTktET1dOLAkiTGlua2Rvd24iIH0sCisJeyBGQ19QT1JUU1RBVEVfRVJST1IsCQkiRXJyb3IiIH0sCisJeyBGQ19QT1JUU1RBVEVfTE9PUEJBQ0ssCSJMb29wYmFjayIgfSwKK307CitmY19lbnVtX25hbWVfc2VhcmNoKHBvcnRfc3RhdGUsIGZjX3BvcnRfc3RhdGUsIGZjX3BvcnRfc3RhdGVfbmFtZXMpCisjZGVmaW5lIEZDX1BPUlRTVEFURV9NQVhfTkFNRUxFTgkyMAorCisKKy8qIENvbnZlcnQgZmNfdGd0aWRfYmluZGluZ190eXBlIHZhbHVlcyB0byBhc2NpaSBzdHJpbmcgbmFtZSAqLworc3RhdGljIHN0cnVjdCB7CisJZW51bSBmY190Z3RpZF9iaW5kaW5nX3R5cGUJdmFsdWU7CisJY2hhcgkJCQkqbmFtZTsKKwlpbnQJCQkJbWF0Y2hsZW47Cit9IGZjX3RndGlkX2JpbmRpbmdfdHlwZV9uYW1lc1tdID0geworCXsgRkNfVEdUSURfQklORF9OT05FLCAibm9uZSIsIDQgfSwKKwl7IEZDX1RHVElEX0JJTkRfQllfV1dQTiwgInd3cG4gKFdvcmxkIFdpZGUgUG9ydCBOYW1lKSIsIDQgfSwKKwl7IEZDX1RHVElEX0JJTkRfQllfV1dOTiwgInd3bm4gKFdvcmxkIFdpZGUgTm9kZSBOYW1lKSIsIDQgfSwKKwl7IEZDX1RHVElEX0JJTkRfQllfSUQsICJwb3J0X2lkIChGQyBBZGRyZXNzKSIsIDcgfSwKK307CitmY19lbnVtX25hbWVfc2VhcmNoKHRndGlkX2JpbmRfdHlwZSwgZmNfdGd0aWRfYmluZGluZ190eXBlLAorCQlmY190Z3RpZF9iaW5kaW5nX3R5cGVfbmFtZXMpCitmY19lbnVtX25hbWVfbWF0Y2godGd0aWRfYmluZF90eXBlLCBmY190Z3RpZF9iaW5kaW5nX3R5cGUsCisJCWZjX3RndGlkX2JpbmRpbmdfdHlwZV9uYW1lcykKKyNkZWZpbmUgRkNfQklORFRZUEVfTUFYX05BTUVMRU4JMzAKKworCisjZGVmaW5lIGZjX2JpdGZpZWxkX25hbWVfc2VhcmNoKHRpdGxlLCB0YWJsZSkJCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQlcCitnZXRfZmNfIyN0aXRsZSMjX25hbWVzKHUzMiB0YWJsZV9rZXksIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCVwKKwljaGFyICpwcmVmaXggPSAiIjsJCQkJCVwKKwlzc2l6ZV90IGxlbiA9IDA7CQkJCQlcCisJaW50IGk7CQkJCQkJCVwKKwkJCQkJCQkJXAorCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodGFibGUpL3NpemVvZih0YWJsZVswXSk7IGkrKykgewlcCisJCWlmICh0YWJsZVtpXS52YWx1ZSAmIHRhYmxlX2tleSkgewkJXAorCQkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiJXMlcyIsCVwKKwkJCQlwcmVmaXgsIHRhYmxlW2ldLm5hbWUpOwkJXAorCQkJcHJlZml4ID0gIiwgIjsJCQkJXAorCQl9CQkJCQkJXAorCX0JCQkJCQkJXAorCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlxuIik7CQkJXAorCXJldHVybiBsZW47CQkJCQkJXAorfQorCisKKy8qIENvbnZlcnQgRkNfQ09TIGJpdCB2YWx1ZXMgdG8gYXNjaWkgc3RyaW5nIG5hbWUgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCXUzMiAJCQl2YWx1ZTsKKwljaGFyCQkJKm5hbWU7Cit9IGZjX2Nvc19uYW1lc1tdID0geworCXsgRkNfQ09TX0NMQVNTMSwJIkNsYXNzIDEiIH0sCisJeyBGQ19DT1NfQ0xBU1MyLAkiQ2xhc3MgMiIgfSwKKwl7IEZDX0NPU19DTEFTUzMsCSJDbGFzcyAzIiB9LAorCXsgRkNfQ09TX0NMQVNTNCwJIkNsYXNzIDQiIH0sCisJeyBGQ19DT1NfQ0xBU1M2LAkiQ2xhc3MgNiIgfSwKK307CitmY19iaXRmaWVsZF9uYW1lX3NlYXJjaChjb3MsIGZjX2Nvc19uYW1lcykKKworCisvKiBDb252ZXJ0IEZDX1BPUlRTUEVFRCBiaXQgdmFsdWVzIHRvIGFzY2lpIHN0cmluZyBuYW1lICovCitzdGF0aWMgc3RydWN0IHsKKwl1MzIgCQkJdmFsdWU7CisJY2hhcgkJCSpuYW1lOworfSBmY19wb3J0X3NwZWVkX25hbWVzW10gPSB7CisJeyBGQ19QT1JUU1BFRURfMUdCSVQsCQkiMSBHYml0IiB9LAorCXsgRkNfUE9SVFNQRUVEXzJHQklULAkJIjIgR2JpdCIgfSwKKwl7IEZDX1BPUlRTUEVFRF80R0JJVCwJCSI0IEdiaXQiIH0sCisJeyBGQ19QT1JUU1BFRURfMTBHQklULAkJIjEwIEdiaXQiIH0sCisJeyBGQ19QT1JUU1BFRURfTk9UX05FR09USUFURUQsCSJOb3QgTmVnb3RpYXRlZCIgfSwKK307CitmY19iaXRmaWVsZF9uYW1lX3NlYXJjaChwb3J0X3NwZWVkLCBmY19wb3J0X3NwZWVkX25hbWVzKQorCisKK3N0YXRpYyBpbnQKK3Nob3dfZmNfZmM0cyAoY2hhciAqYnVmLCB1OCAqZmM0X2xpc3QpCit7CisJaW50IGksIGxlbj0wOworCisJZm9yIChpID0gMDsgaSA8IEZDX0ZDNF9MSVNUX1NJWkU7IGkrKywgZmM0X2xpc3QrKykKKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuICwgIjB4JTAyeCAiLCAqZmM0X2xpc3QpOworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlxuIik7CisJcmV0dXJuIGxlbjsKK30KKworCisvKiBDb252ZXJ0IEZDX1JQT1JUX1JPTEUgYml0IHZhbHVlcyB0byBhc2NpaSBzdHJpbmcgbmFtZSAqLworc3RhdGljIHN0cnVjdCB7CisJdTMyIAkJCXZhbHVlOworCWNoYXIJCQkqbmFtZTsKK30gZmNfcmVtb3RlX3BvcnRfcm9sZV9uYW1lc1tdID0geworCXsgRkNfUlBPUlRfUk9MRV9GQ1BfVEFSR0VULAkiRkNQIFRhcmdldCIgfSwKKwl7IEZDX1JQT1JUX1JPTEVfRkNQX0lOSVRJQVRPUiwJIkZDUCBJbml0aWF0b3IiIH0sCisJeyBGQ19SUE9SVF9ST0xFX0lQX1BPUlQsCSJJUCBQb3J0IiB9LAorfTsKK2ZjX2JpdGZpZWxkX25hbWVfc2VhcmNoKHJlbW90ZV9wb3J0X3JvbGVzLCBmY19yZW1vdGVfcG9ydF9yb2xlX25hbWVzKQorCisvKgorICogRGVmaW5lIHJvbGVzIHRoYXQgYXJlIHNwZWNpZmljIHRvIHBvcnRfaWQuIFZhbHVlcyBhcmUgcmVsYXRpdmUgdG8gUk9MRV9NQVNLLgorICovCisjZGVmaW5lIEZDX1dFTExLTk9XTl9QT1JUSURfTUFTSwkweGZmZmZmMAorI2RlZmluZSBGQ19XRUxMS05PV05fUk9MRV9NQVNLICAJMHgwMDAwMGYKKyNkZWZpbmUgRkNfRlBPUlRfUE9SVElECQkJMHgwMDAwMGUKKyNkZWZpbmUgRkNfRkFCQ1RMUl9QT1JUSUQJCTB4MDAwMDBkCisjZGVmaW5lIEZDX0RJUlNSVlJfUE9SVElECQkweDAwMDAwYworI2RlZmluZSBGQ19USU1FU1JWUl9QT1JUSUQJCTB4MDAwMDBiCisjZGVmaW5lIEZDX01HTVRTUlZSX1BPUlRJRAkJMHgwMDAwMGEKKworCitzdGF0aWMgdm9pZCBmY190aW1lb3V0X2Jsb2NrZWRfcnBvcnQodm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBmY19zY3NpX3NjYW5fcnBvcnQodm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBmY19ycG9ydF90ZXJtaW5hdGUoc3RydWN0IGZjX3Jwb3J0ICAqcnBvcnQpOworCisvKgorICogQXR0cmlidXRlIGNvdW50cyBwcmUgb2JqZWN0IHR5cGUuLi4KKyAqIEluY3JlYXNlIHRoZXNlIHZhbHVlcyBpZiB5b3UgYWRkIGF0dHJpYnV0ZXMKKyAqLworI2RlZmluZSBGQ19TVEFSR0VUX05VTV9BVFRSUyAJMworI2RlZmluZSBGQ19SUE9SVF9OVU1fQVRUUlMJOQorI2RlZmluZSBGQ19IT1NUX05VTV9BVFRSUwkxNQorCitzdHJ1Y3QgZmNfaW50ZXJuYWwgeworCXN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSB0OworCXN0cnVjdCBmY19mdW5jdGlvbl90ZW1wbGF0ZSAqZjsKKworCS8qCisJICogRm9yIGF0dHJpYnV0ZXMgOiBlYWNoIG9iamVjdCBoYXMgOgorCSAqICAgQW4gYXJyYXkgb2YgdGhlIGFjdHVhbCBhdHRyaWJ1dGVzIHN0cnVjdHVyZXMKKwkgKiAgIEFuIGFycmF5IG9mIG51bGwtdGVybWluYXRlZCBwb2ludGVycyB0byB0aGUgYXR0cmlidXRlCisJICogICAgIHN0cnVjdHVyZXMgLSB1c2VkIGZvciBtaWQtbGF5ZXIgaW50ZXJhY3Rpb24uCisJICoKKwkgKiBUaGUgYXR0cmlidXRlIGNvbnRhaW5lcnMgZm9yIHRoZSBzdGFyZ2V0IGFuZCBob3N0IGFyZSBhcmUKKwkgKiBwYXJ0IG9mIHRoZSBtaWRsYXllci4gQXMgdGhlIHJlbW90ZSBwb3J0IGlzIHNwZWNpZmljIHRvIHRoZQorCSAqIGZjIHRyYW5zcG9ydCwgd2UgbXVzdCBwcm92aWRlIHRoZSBhdHRyaWJ1dGUgY29udGFpbmVyLgorCSAqLworCXN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlIHByaXZhdGVfc3RhcmdldF9hdHRyc1sKKwkJCQkJCQlGQ19TVEFSR0VUX05VTV9BVFRSU107CisJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKnN0YXJnZXRfYXR0cnNbRkNfU1RBUkdFVF9OVU1fQVRUUlMgKyAxXTsKKworCXN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlIHByaXZhdGVfaG9zdF9hdHRyc1tGQ19IT1NUX05VTV9BVFRSU107CisJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKmhvc3RfYXR0cnNbRkNfSE9TVF9OVU1fQVRUUlMgKyAxXTsKKworCXN0cnVjdCB0cmFuc3BvcnRfY29udGFpbmVyIHJwb3J0X2F0dHJfY29udDsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBwcml2YXRlX3Jwb3J0X2F0dHJzW0ZDX1JQT1JUX05VTV9BVFRSU107CisJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKnJwb3J0X2F0dHJzW0ZDX1JQT1JUX05VTV9BVFRSUyArIDFdOworfTsKKworI2RlZmluZSB0b19mY19pbnRlcm5hbCh0bXBsKQljb250YWluZXJfb2YodG1wbCwgc3RydWN0IGZjX2ludGVybmFsLCB0KQorCitzdGF0aWMgaW50IGZjX3RhcmdldF9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gdG9fc2NzaV90YXJnZXQoZGV2KTsKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gc3RhcmdldF90b19ycG9ydChzdGFyZ2V0KTsKKworCS8qCisJICogaWYgcGFyZW50IGlzIHJlbW90ZSBwb3J0LCB1c2UgdmFsdWVzIGZyb20gcmVtb3RlIHBvcnQuCisJICogT3RoZXJ3aXNlLCB0aGlzIGhvc3QgdXNlcyB0aGUgZmNfdHJhbnNwb3J0LCBidXQgbm90IHRoZQorCSAqIHJlbW90ZSBwb3J0IGludGVyZmFjZS4gQXMgc3VjaCwgaW5pdGlhbGl6ZSB0byBrbm93biBub24tdmFsdWVzLgorCSAqLworCWlmIChycG9ydCkgeworCQlmY19zdGFyZ2V0X25vZGVfbmFtZShzdGFyZ2V0KSA9IHJwb3J0LT5ub2RlX25hbWU7CisJCWZjX3N0YXJnZXRfcG9ydF9uYW1lKHN0YXJnZXQpID0gcnBvcnQtPnBvcnRfbmFtZTsKKwkJZmNfc3RhcmdldF9wb3J0X2lkKHN0YXJnZXQpID0gcnBvcnQtPnBvcnRfaWQ7CisJfSBlbHNlIHsKKwkJZmNfc3RhcmdldF9ub2RlX25hbWUoc3RhcmdldCkgPSAtMTsKKwkJZmNfc3RhcmdldF9wb3J0X25hbWUoc3RhcmdldCkgPSAtMTsKKwkJZmNfc3RhcmdldF9wb3J0X2lkKHN0YXJnZXQpID0gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBERUNMQVJFX1RSQU5TUE9SVF9DTEFTUyhmY190cmFuc3BvcnRfY2xhc3MsCisJCQkgICAgICAgImZjX3RyYW5zcG9ydCIsCisJCQkgICAgICAgZmNfdGFyZ2V0X3NldHVwLAorCQkJICAgICAgIE5VTEwsCisJCQkgICAgICAgTlVMTCk7CisKK3N0YXRpYyBpbnQgZmNfaG9zdF9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3QoZGV2KTsKKworCS8qIAorCSAqIFNldCBkZWZhdWx0IHZhbHVlcyBlYXNpbHkgZGV0ZWN0ZWQgYnkgdGhlIG1pZGxheWVyIGFzCisJICogZmFpbHVyZSBjYXNlcy4gIFRoZSBzY3NpIGxsZGQgaXMgcmVzcG9uc2libGUgZm9yIGluaXRpYWxpemluZworCSAqIGFsbCB0cmFuc3BvcnQgYXR0cmlidXRlcyB0byB2YWxpZCB2YWx1ZXMgcGVyIGhvc3QuCisJICovCisJZmNfaG9zdF9ub2RlX25hbWUoc2hvc3QpID0gLTE7CisJZmNfaG9zdF9wb3J0X25hbWUoc2hvc3QpID0gLTE7CisJZmNfaG9zdF9zdXBwb3J0ZWRfY2xhc3NlcyhzaG9zdCkgPSBGQ19DT1NfVU5TUEVDSUZJRUQ7CisJbWVtc2V0KGZjX2hvc3Rfc3VwcG9ydGVkX2ZjNHMoc2hvc3QpLCAwLAorCQlzaXplb2YoZmNfaG9zdF9zdXBwb3J0ZWRfZmM0cyhzaG9zdCkpKTsKKwltZW1zZXQoZmNfaG9zdF9zeW1ib2xpY19uYW1lKHNob3N0KSwgMCwKKwkJc2l6ZW9mKGZjX2hvc3Rfc3ltYm9saWNfbmFtZShzaG9zdCkpKTsKKwlmY19ob3N0X3N1cHBvcnRlZF9zcGVlZHMoc2hvc3QpID0gRkNfUE9SVFNQRUVEX1VOS05PV047CisJZmNfaG9zdF9tYXhmcmFtZV9zaXplKHNob3N0KSA9IC0xOworCW1lbXNldChmY19ob3N0X3NlcmlhbF9udW1iZXIoc2hvc3QpLCAwLAorCQlzaXplb2YoZmNfaG9zdF9zZXJpYWxfbnVtYmVyKHNob3N0KSkpOworCisJZmNfaG9zdF9wb3J0X2lkKHNob3N0KSA9IC0xOworCWZjX2hvc3RfcG9ydF90eXBlKHNob3N0KSA9IEZDX1BPUlRUWVBFX1VOS05PV047CisJZmNfaG9zdF9wb3J0X3N0YXRlKHNob3N0KSA9IEZDX1BPUlRTVEFURV9VTktOT1dOOworCW1lbXNldChmY19ob3N0X2FjdGl2ZV9mYzRzKHNob3N0KSwgMCwKKwkJc2l6ZW9mKGZjX2hvc3RfYWN0aXZlX2ZjNHMoc2hvc3QpKSk7CisJZmNfaG9zdF9zcGVlZChzaG9zdCkgPSBGQ19QT1JUU1BFRURfVU5LTk9XTjsKKwlmY19ob3N0X2ZhYnJpY19uYW1lKHNob3N0KSA9IC0xOworCisJZmNfaG9zdF90Z3RpZF9iaW5kX3R5cGUoc2hvc3QpID0gRkNfVEdUSURfQklORF9CWV9XV1BOOworCisJSU5JVF9MSVNUX0hFQUQoJmZjX2hvc3RfcnBvcnRzKHNob3N0KSk7CisJSU5JVF9MSVNUX0hFQUQoJmZjX2hvc3RfcnBvcnRfYmluZGluZ3Moc2hvc3QpKTsKKwlmY19ob3N0X25leHRfcnBvcnRfbnVtYmVyKHNob3N0KSA9IDA7CisJZmNfaG9zdF9uZXh0X3RhcmdldF9pZChzaG9zdCkgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBERUNMQVJFX1RSQU5TUE9SVF9DTEFTUyhmY19ob3N0X2NsYXNzLAorCQkJICAgICAgICJmY19ob3N0IiwKKwkJCSAgICAgICBmY19ob3N0X3NldHVwLAorCQkJICAgICAgIE5VTEwsCisJCQkgICAgICAgTlVMTCk7CisKKy8qCisgKiBTZXR1cCBhbmQgUmVtb3ZlIGFjdGlvbnMgZm9yIHJlbW90ZSBwb3J0cyBhcmUgaGFuZGxlZAorICogaW4gdGhlIHNlcnZpY2UgZnVuY3Rpb25zIGJlbG93LgorICovCitzdGF0aWMgREVDTEFSRV9UUkFOU1BPUlRfQ0xBU1MoZmNfcnBvcnRfY2xhc3MsCisJCQkgICAgICAgImZjX3JlbW90ZV9wb3J0cyIsCisJCQkgICAgICAgTlVMTCwKKwkJCSAgICAgICBOVUxMLAorCQkJICAgICAgIE5VTEwpOworCisvKgorICogTW9kdWxlIFBhcmFtZXRlcnMKKyAqLworCisvKgorICogZGV2X2xvc3NfdG1vOiB0aGUgZGVmYXVsdCBudW1iZXIgb2Ygc2Vjb25kcyB0aGF0IHRoZSBGQyB0cmFuc3BvcnQKKyAqICAgc2hvdWxkIGluc3VsYXRlIHRoZSBsb3NzIG9mIGEgcmVtb3RlIHBvcnQuCisgKiAgIFRoZSBtYXhpbXVtIHdpbGwgYmUgY2FwcGVkIGJ5IHRoZSB2YWx1ZSBvZiBTQ1NJX0RFVklDRV9CTE9DS19NQVhfVElNRU9VVC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBmY19kZXZfbG9zc190bW8gPSBTQ1NJX0RFVklDRV9CTE9DS19NQVhfVElNRU9VVDsKKworbW9kdWxlX3BhcmFtX25hbWVkKGRldl9sb3NzX3RtbywgZmNfZGV2X2xvc3NfdG1vLCBpbnQsIFNfSVJVR098U19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRldl9sb3NzX3RtbywKKwkJICJNYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIHRoYXQgdGhlIEZDIHRyYW5zcG9ydCBzaG91bGQiCisJCSAiIGluc3VsYXRlIHRoZSBsb3NzIG9mIGEgcmVtb3RlIHBvcnQuIE9uY2UgdGhpcyB2YWx1ZSBpcyIKKwkJICIgZXhjZWVkZWQsIHRoZSBzY3NpIHRhcmdldCBpcyByZW1vdmVkLiBWYWx1ZSBzaG91bGQgYmUiCisJCSAiIGJldHdlZW4gMSBhbmQgU0NTSV9ERVZJQ0VfQkxPQ0tfTUFYX1RJTUVPVVQuIik7CisKKworc3RhdGljIF9faW5pdCBpbnQgZmNfdHJhbnNwb3J0X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyb3IgPSB0cmFuc3BvcnRfY2xhc3NfcmVnaXN0ZXIoJmZjX2hvc3RfY2xhc3MpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWVycm9yID0gdHJhbnNwb3J0X2NsYXNzX3JlZ2lzdGVyKCZmY19ycG9ydF9jbGFzcyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIHRyYW5zcG9ydF9jbGFzc19yZWdpc3RlcigmZmNfdHJhbnNwb3J0X2NsYXNzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZjX3RyYW5zcG9ydF9leGl0KHZvaWQpCit7CisJdHJhbnNwb3J0X2NsYXNzX3VucmVnaXN0ZXIoJmZjX3RyYW5zcG9ydF9jbGFzcyk7CisJdHJhbnNwb3J0X2NsYXNzX3VucmVnaXN0ZXIoJmZjX3Jwb3J0X2NsYXNzKTsKKwl0cmFuc3BvcnRfY2xhc3NfdW5yZWdpc3RlcigmZmNfaG9zdF9jbGFzcyk7Cit9CisKKy8qCisgKiBGQyBSZW1vdGUgUG9ydCBBdHRyaWJ1dGUgTWFuYWdlbWVudAorICovCisKKyNkZWZpbmUgZmNfcnBvcnRfc2hvd19mdW5jdGlvbihmaWVsZCwgZm9ybWF0X3N0cmluZywgc3osIGNhc3QpCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorc2hvd19mY19ycG9ydF8jI2ZpZWxkIChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSB0cmFuc3BvcnRfY2xhc3NfdG9fcnBvcnQoY2Rldik7CVwKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHJwb3J0X3RvX3Nob3N0KHJwb3J0KTsJCVwKKwlzdHJ1Y3QgZmNfaW50ZXJuYWwgKmkgPSB0b19mY19pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CVwKKwlpZiAoaS0+Zi0+Z2V0X3Jwb3J0XyMjZmllbGQpCQkJCQlcCisJCWktPmYtPmdldF9ycG9ydF8jI2ZpZWxkKHJwb3J0KTsJCQkJXAorCXJldHVybiBzbnByaW50ZihidWYsIHN6LCBmb3JtYXRfc3RyaW5nLCBjYXN0IHJwb3J0LT5maWVsZCk7IAlcCit9CisKKyNkZWZpbmUgZmNfcnBvcnRfc3RvcmVfZnVuY3Rpb24oZmllbGQpCQkJCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorc3RvcmVfZmNfcnBvcnRfIyNmaWVsZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjb25zdCBjaGFyICpidWYsCVwKKwkJCSAgIHNpemVfdCBjb3VudCkJCQkJXAorewkJCQkJCQkJCVwKKwlpbnQgdmFsOwkJCQkJCQlcCisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHRyYW5zcG9ydF9jbGFzc190b19ycG9ydChjZGV2KTsJXAorCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gcnBvcnRfdG9fc2hvc3QocnBvcnQpOwkJXAorCXN0cnVjdCBmY19pbnRlcm5hbCAqaSA9IHRvX2ZjX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsJXAorCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CQkJCVwKKwlpLT5mLT5zZXRfcnBvcnRfIyNmaWVsZChycG9ydCwgdmFsKTsJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQorCisjZGVmaW5lIGZjX3Jwb3J0X3JkX2F0dHIoZmllbGQsIGZvcm1hdF9zdHJpbmcsIHN6KQkJCVwKKwlmY19ycG9ydF9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgKQkJXAorc3RhdGljIEZDX0NMQVNTX0RFVklDRV9BVFRSKHJwb3J0LCBmaWVsZCwgU19JUlVHTywJCQlcCisJCQkgc2hvd19mY19ycG9ydF8jI2ZpZWxkLCBOVUxMKQorCisjZGVmaW5lIGZjX3Jwb3J0X3JkX2F0dHJfY2FzdChmaWVsZCwgZm9ybWF0X3N0cmluZywgc3osIGNhc3QpCQlcCisJZmNfcnBvcnRfc2hvd19mdW5jdGlvbihmaWVsZCwgZm9ybWF0X3N0cmluZywgc3osIChjYXN0KSkJXAorc3RhdGljIEZDX0NMQVNTX0RFVklDRV9BVFRSKHJwb3J0LCBmaWVsZCwgU19JUlVHTywJCQlcCisJCQkgIHNob3dfZmNfcnBvcnRfIyNmaWVsZCwgTlVMTCkKKworI2RlZmluZSBmY19ycG9ydF9yd19hdHRyKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeikJCQlcCisJZmNfcnBvcnRfc2hvd19mdW5jdGlvbihmaWVsZCwgZm9ybWF0X3N0cmluZywgc3osICkJCVwKKwlmY19ycG9ydF9zdG9yZV9mdW5jdGlvbihmaWVsZCkJCQkJCVwKK3N0YXRpYyBGQ19DTEFTU19ERVZJQ0VfQVRUUihycG9ydCwgZmllbGQsIFNfSVJVR08gfCBTX0lXVVNSLAkJXAorCQkJc2hvd19mY19ycG9ydF8jI2ZpZWxkLAkJCQlcCisJCQlzdG9yZV9mY19ycG9ydF8jI2ZpZWxkKQorCisKKyNkZWZpbmUgZmNfcHJpdmF0ZV9ycG9ydF9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgY2FzdCkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3Nob3dfZmNfcnBvcnRfIyNmaWVsZCAoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3Jwb3J0KGNkZXYpOwlcCisJcmV0dXJuIHNucHJpbnRmKGJ1Ziwgc3osIGZvcm1hdF9zdHJpbmcsIGNhc3QgcnBvcnQtPmZpZWxkKTsgCVwKK30KKworI2RlZmluZSBmY19wcml2YXRlX3Jwb3J0X3JkX2F0dHIoZmllbGQsIGZvcm1hdF9zdHJpbmcsIHN6KQkJXAorCWZjX3ByaXZhdGVfcnBvcnRfc2hvd19mdW5jdGlvbihmaWVsZCwgZm9ybWF0X3N0cmluZywgc3osICkJXAorc3RhdGljIEZDX0NMQVNTX0RFVklDRV9BVFRSKHJwb3J0LCBmaWVsZCwgU19JUlVHTywJCQlcCisJCQkgc2hvd19mY19ycG9ydF8jI2ZpZWxkLCBOVUxMKQorCisjZGVmaW5lIGZjX3ByaXZhdGVfcnBvcnRfcmRfYXR0cl9jYXN0KGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgY2FzdCkJXAorCWZjX3ByaXZhdGVfcnBvcnRfc2hvd19mdW5jdGlvbihmaWVsZCwgZm9ybWF0X3N0cmluZywgc3osIChjYXN0KSkgXAorc3RhdGljIEZDX0NMQVNTX0RFVklDRV9BVFRSKHJwb3J0LCBmaWVsZCwgU19JUlVHTywJCQlcCisJCQkgIHNob3dfZmNfcnBvcnRfIyNmaWVsZCwgTlVMTCkKKworCisjZGVmaW5lIGZjX3ByaXZhdGVfcnBvcnRfcmRfZW51bV9hdHRyKHRpdGxlLCBtYXhsZW4pCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3Nob3dfZmNfcnBvcnRfIyN0aXRsZSAoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3Jwb3J0KGNkZXYpOwlcCisJY29uc3QgY2hhciAqbmFtZTsJCQkJCQlcCisJbmFtZSA9IGdldF9mY18jI3RpdGxlIyNfbmFtZShycG9ydC0+dGl0bGUpOwkJCVwKKwlpZiAoIW5hbWUpCQkJCQkJCVwKKwkJcmV0dXJuIC1FSU5WQUw7CQkJCQkJXAorCXJldHVybiBzbnByaW50ZihidWYsIG1heGxlbiwgIiVzXG4iLCBuYW1lKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIEZDX0NMQVNTX0RFVklDRV9BVFRSKHJwb3J0LCB0aXRsZSwgU19JUlVHTywJCQlcCisJCQlzaG93X2ZjX3Jwb3J0XyMjdGl0bGUsIE5VTEwpCisKKworI2RlZmluZSBTRVRVUF9SUE9SVF9BVFRSSUJVVEVfUkQoZmllbGQpCQkJCQlcCisJaS0+cHJpdmF0ZV9ycG9ydF9hdHRyc1tjb3VudF0gPSBjbGFzc19kZXZpY2VfYXR0cl9ycG9ydF8jI2ZpZWxkOyBcCisJaS0+cHJpdmF0ZV9ycG9ydF9hdHRyc1tjb3VudF0uYXR0ci5tb2RlID0gU19JUlVHTzsJCVwKKwlpLT5wcml2YXRlX3Jwb3J0X2F0dHJzW2NvdW50XS5zdG9yZSA9IE5VTEw7CQkJXAorCWktPnJwb3J0X2F0dHJzW2NvdW50XSA9ICZpLT5wcml2YXRlX3Jwb3J0X2F0dHJzW2NvdW50XTsJCVwKKwlpZiAoaS0+Zi0+c2hvd19ycG9ydF8jI2ZpZWxkKQkJCQkJXAorCQljb3VudCsrCisKKyNkZWZpbmUgU0VUVVBfUFJJVkFURV9SUE9SVF9BVFRSSUJVVEVfUkQoZmllbGQpCQkJCVwKKwlpLT5wcml2YXRlX3Jwb3J0X2F0dHJzW2NvdW50XSA9IGNsYXNzX2RldmljZV9hdHRyX3Jwb3J0XyMjZmllbGQ7IFwKKwlpLT5wcml2YXRlX3Jwb3J0X2F0dHJzW2NvdW50XS5hdHRyLm1vZGUgPSBTX0lSVUdPOwkJXAorCWktPnByaXZhdGVfcnBvcnRfYXR0cnNbY291bnRdLnN0b3JlID0gTlVMTDsJCQlcCisJaS0+cnBvcnRfYXR0cnNbY291bnRdID0gJmktPnByaXZhdGVfcnBvcnRfYXR0cnNbY291bnRdOwkJXAorCWNvdW50KysKKworI2RlZmluZSBTRVRVUF9SUE9SVF9BVFRSSUJVVEVfUlcoZmllbGQpCQkJCQlcCisJaS0+cHJpdmF0ZV9ycG9ydF9hdHRyc1tjb3VudF0gPSBjbGFzc19kZXZpY2VfYXR0cl9ycG9ydF8jI2ZpZWxkOyBcCisJaWYgKCFpLT5mLT5zZXRfcnBvcnRfIyNmaWVsZCkgewkJCQkJXAorCQlpLT5wcml2YXRlX3Jwb3J0X2F0dHJzW2NvdW50XS5hdHRyLm1vZGUgPSBTX0lSVUdPOwlcCisJCWktPnByaXZhdGVfcnBvcnRfYXR0cnNbY291bnRdLnN0b3JlID0gTlVMTDsJCVwKKwl9CQkJCQkJCQlcCisJaS0+cnBvcnRfYXR0cnNbY291bnRdID0gJmktPnByaXZhdGVfcnBvcnRfYXR0cnNbY291bnRdOwkJXAorCWlmIChpLT5mLT5zaG93X3Jwb3J0XyMjZmllbGQpCQkJCQlcCisJCWNvdW50KysKKworCisvKiBUaGUgRkMgVHJhbnNwb3J0IFJlbW90ZSBQb3J0IEF0dHJpYnV0ZXM6ICovCisKKy8qIEZpeGVkIFJlbW90ZSBQb3J0IEF0dHJpYnV0ZXMgKi8KKworZmNfcHJpdmF0ZV9ycG9ydF9yZF9hdHRyKG1heGZyYW1lX3NpemUsICIldSBieXRlc1xuIiwgMjApOworCitzdGF0aWMgc3NpemVfdAorc2hvd19mY19ycG9ydF9zdXBwb3J0ZWRfY2xhc3NlcyAoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSB0cmFuc3BvcnRfY2xhc3NfdG9fcnBvcnQoY2Rldik7CisJaWYgKHJwb3J0LT5zdXBwb3J0ZWRfY2xhc3NlcyA9PSBGQ19DT1NfVU5TUEVDSUZJRUQpCisJCXJldHVybiBzbnByaW50ZihidWYsIDIwLCAidW5zcGVjaWZpZWRcbiIpOworCXJldHVybiBnZXRfZmNfY29zX25hbWVzKHJwb3J0LT5zdXBwb3J0ZWRfY2xhc3NlcywgYnVmKTsKK30KK3N0YXRpYyBGQ19DTEFTU19ERVZJQ0VfQVRUUihycG9ydCwgc3VwcG9ydGVkX2NsYXNzZXMsIFNfSVJVR08sCisJCXNob3dfZmNfcnBvcnRfc3VwcG9ydGVkX2NsYXNzZXMsIE5VTEwpOworCisvKiBEeW5hbWljIFJlbW90ZSBQb3J0IEF0dHJpYnV0ZXMgKi8KKworZmNfcnBvcnRfcndfYXR0cihkZXZfbG9zc190bW8sICIlZFxuIiwgMjApOworCisKKy8qIFByaXZhdGUgUmVtb3RlIFBvcnQgQXR0cmlidXRlcyAqLworCitmY19wcml2YXRlX3Jwb3J0X3JkX2F0dHJfY2FzdChub2RlX25hbWUsICIweCVsbHhcbiIsIDIwLCB1bnNpZ25lZCBsb25nIGxvbmcpOworZmNfcHJpdmF0ZV9ycG9ydF9yZF9hdHRyX2Nhc3QocG9ydF9uYW1lLCAiMHglbGx4XG4iLCAyMCwgdW5zaWduZWQgbG9uZyBsb25nKTsKK2ZjX3ByaXZhdGVfcnBvcnRfcmRfYXR0cihwb3J0X2lkLCAiMHglMDZ4XG4iLCAyMCk7CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X2ZjX3Jwb3J0X3JvbGVzIChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHRyYW5zcG9ydF9jbGFzc190b19ycG9ydChjZGV2KTsKKworCS8qIGlkZW50aWZ5IGFueSByb2xlcyB0aGF0IGFyZSBwb3J0X2lkIHNwZWNpZmljICovCisJaWYgKChycG9ydC0+cG9ydF9pZCAhPSAtMSkgJiYKKwkgICAgKHJwb3J0LT5wb3J0X2lkICYgRkNfV0VMTEtOT1dOX1BPUlRJRF9NQVNLKSA9PQorCQkJCQlGQ19XRUxMS05PV05fUE9SVElEX01BU0spIHsKKwkJc3dpdGNoIChycG9ydC0+cG9ydF9pZCAmIEZDX1dFTExLTk9XTl9ST0xFX01BU0spIHsKKwkJY2FzZSBGQ19GUE9SVF9QT1JUSUQ6CisJCQlyZXR1cm4gc25wcmludGYoYnVmLCAzMCwgIkZhYnJpYyBQb3J0XG4iKTsKKwkJY2FzZSBGQ19GQUJDVExSX1BPUlRJRDoKKwkJCXJldHVybiBzbnByaW50ZihidWYsIDMwLCAiRmFicmljIENvbnRyb2xsZXJcbiIpOworCQljYXNlIEZDX0RJUlNSVlJfUE9SVElEOgorCQkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMzAsICJEaXJlY3RvcnkgU2VydmVyXG4iKTsKKwkJY2FzZSBGQ19USU1FU1JWUl9QT1JUSUQ6CisJCQlyZXR1cm4gc25wcmludGYoYnVmLCAzMCwgIlRpbWUgU2VydmVyXG4iKTsKKwkJY2FzZSBGQ19NR01UU1JWUl9QT1JUSUQ6CisJCQlyZXR1cm4gc25wcmludGYoYnVmLCAzMCwgIk1hbmFnZW1lbnQgU2VydmVyXG4iKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBzbnByaW50ZihidWYsIDMwLCAiVW5rbm93biBGYWJyaWMgRW50aXR5XG4iKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChycG9ydC0+cm9sZXMgPT0gRkNfUlBPUlRfUk9MRV9VTktOT1dOKQorCQkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICJ1bmtub3duXG4iKTsKKwkJcmV0dXJuIGdldF9mY19yZW1vdGVfcG9ydF9yb2xlc19uYW1lcyhycG9ydC0+cm9sZXMsIGJ1Zik7CisJfQorfQorc3RhdGljIEZDX0NMQVNTX0RFVklDRV9BVFRSKHJwb3J0LCByb2xlcywgU19JUlVHTywKKwkJc2hvd19mY19ycG9ydF9yb2xlcywgTlVMTCk7CisKK2ZjX3ByaXZhdGVfcnBvcnRfcmRfZW51bV9hdHRyKHBvcnRfc3RhdGUsIEZDX1BPUlRTVEFURV9NQVhfTkFNRUxFTik7CitmY19wcml2YXRlX3Jwb3J0X3JkX2F0dHIoc2NzaV90YXJnZXRfaWQsICIlZFxuIiwgMjApOworCisKKworLyoKKyAqIEZDIFNDU0kgVGFyZ2V0IEF0dHJpYnV0ZSBNYW5hZ2VtZW50CisgKi8KKworLyoKKyAqIE5vdGU6IGluIHRoZSB0YXJnZXQgc2hvdyBmdW5jdGlvbiB3ZSByZWNvZ25pemUgd2hlbiB0aGUgcmVtb3RlCisgKiAgcG9ydCBpcyBpbiB0aGUgaGVpcmFyY2h5IGFuZCBkbyBub3QgYWxsb3cgdGhlIGRyaXZlciB0byBnZXQKKyAqICBpbnZvbHZlZCBpbiBzeXNmcyBmdW5jdGlvbnMuIFRoZSBkcml2ZXIgb25seSBnZXRzIGludm9sdmVkIGlmCisgKiAgaXQncyB0aGUgIm9sZCIgc3R5bGUgdGhhdCBkb2Vzbid0IHVzZSBycG9ydHMuCisgKi8KKyNkZWZpbmUgZmNfc3RhcmdldF9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgY2FzdCkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3Nob3dfZmNfc3RhcmdldF8jI2ZpZWxkIChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRyYW5zcG9ydF9jbGFzc190b19zdGFyZ2V0KGNkZXYpOwlcCisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CVwKKwlzdHJ1Y3QgZmNfaW50ZXJuYWwgKmkgPSB0b19mY19pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CVwKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gc3RhcmdldF90b19ycG9ydChzdGFyZ2V0KTsJCVwKKwlpZiAocnBvcnQpCQkJCQkJCVwKKwkJZmNfc3RhcmdldF8jI2ZpZWxkKHN0YXJnZXQpID0gcnBvcnQtPmZpZWxkOwkJXAorCWVsc2UgaWYgKGktPmYtPmdldF9zdGFyZ2V0XyMjZmllbGQpCQkJCVwKKwkJaS0+Zi0+Z2V0X3N0YXJnZXRfIyNmaWVsZChzdGFyZ2V0KTsJCQlcCisJcmV0dXJuIHNucHJpbnRmKGJ1Ziwgc3osIGZvcm1hdF9zdHJpbmcsIAkJCVwKKwkJY2FzdCBmY19zdGFyZ2V0XyMjZmllbGQoc3RhcmdldCkpOyAJCQlcCit9CisKKyNkZWZpbmUgZmNfc3RhcmdldF9yZF9hdHRyKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeikJCQlcCisJZmNfc3RhcmdldF9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgKQkJXAorc3RhdGljIEZDX0NMQVNTX0RFVklDRV9BVFRSKHN0YXJnZXQsIGZpZWxkLCBTX0lSVUdPLAkJCVwKKwkJCSBzaG93X2ZjX3N0YXJnZXRfIyNmaWVsZCwgTlVMTCkKKworI2RlZmluZSBmY19zdGFyZ2V0X3JkX2F0dHJfY2FzdChmaWVsZCwgZm9ybWF0X3N0cmluZywgc3osIGNhc3QpCQlcCisJZmNfc3RhcmdldF9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgKGNhc3QpKQlcCitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIoc3RhcmdldCwgZmllbGQsIFNfSVJVR08sCQkJXAorCQkJICBzaG93X2ZjX3N0YXJnZXRfIyNmaWVsZCwgTlVMTCkKKworI2RlZmluZSBTRVRVUF9TVEFSR0VUX0FUVFJJQlVURV9SRChmaWVsZCkJCQkJXAorCWktPnByaXZhdGVfc3RhcmdldF9hdHRyc1tjb3VudF0gPSBjbGFzc19kZXZpY2VfYXR0cl9zdGFyZ2V0XyMjZmllbGQ7IFwKKwlpLT5wcml2YXRlX3N0YXJnZXRfYXR0cnNbY291bnRdLmF0dHIubW9kZSA9IFNfSVJVR087CQlcCisJaS0+cHJpdmF0ZV9zdGFyZ2V0X2F0dHJzW2NvdW50XS5zdG9yZSA9IE5VTEw7CQkJXAorCWktPnN0YXJnZXRfYXR0cnNbY291bnRdID0gJmktPnByaXZhdGVfc3RhcmdldF9hdHRyc1tjb3VudF07CVwKKwlpZiAoaS0+Zi0+c2hvd19zdGFyZ2V0XyMjZmllbGQpCQkJCQlcCisJCWNvdW50KysKKworI2RlZmluZSBTRVRVUF9TVEFSR0VUX0FUVFJJQlVURV9SVyhmaWVsZCkJCQkJXAorCWktPnByaXZhdGVfc3RhcmdldF9hdHRyc1tjb3VudF0gPSBjbGFzc19kZXZpY2VfYXR0cl9zdGFyZ2V0XyMjZmllbGQ7IFwKKwlpZiAoIWktPmYtPnNldF9zdGFyZ2V0XyMjZmllbGQpIHsJCQkJXAorCQlpLT5wcml2YXRlX3N0YXJnZXRfYXR0cnNbY291bnRdLmF0dHIubW9kZSA9IFNfSVJVR087CVwKKwkJaS0+cHJpdmF0ZV9zdGFyZ2V0X2F0dHJzW2NvdW50XS5zdG9yZSA9IE5VTEw7CQlcCisJfQkJCQkJCQkJXAorCWktPnN0YXJnZXRfYXR0cnNbY291bnRdID0gJmktPnByaXZhdGVfc3RhcmdldF9hdHRyc1tjb3VudF07CVwKKwlpZiAoaS0+Zi0+c2hvd19zdGFyZ2V0XyMjZmllbGQpCQkJCQlcCisJCWNvdW50KysKKworLyogVGhlIEZDIFRyYW5zcG9ydCBTQ1NJIFRhcmdldCBBdHRyaWJ1dGVzOiAqLworZmNfc3RhcmdldF9yZF9hdHRyX2Nhc3Qobm9kZV9uYW1lLCAiMHglbGx4XG4iLCAyMCwgdW5zaWduZWQgbG9uZyBsb25nKTsKK2ZjX3N0YXJnZXRfcmRfYXR0cl9jYXN0KHBvcnRfbmFtZSwgIjB4JWxseFxuIiwgMjAsIHVuc2lnbmVkIGxvbmcgbG9uZyk7CitmY19zdGFyZ2V0X3JkX2F0dHIocG9ydF9pZCwgIjB4JTA2eFxuIiwgMjApOworCisKKy8qCisgKiBIb3N0IEF0dHJpYnV0ZSBNYW5hZ2VtZW50CisgKi8KKworI2RlZmluZSBmY19ob3N0X3Nob3dfZnVuY3Rpb24oZmllbGQsIGZvcm1hdF9zdHJpbmcsIHN6LCBjYXN0KQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3Nob3dfZmNfaG9zdF8jI2ZpZWxkIChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3Nob3N0KGNkZXYpOwlcCisJc3RydWN0IGZjX2ludGVybmFsICppID0gdG9fZmNfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOwlcCisJaWYgKGktPmYtPmdldF9ob3N0XyMjZmllbGQpCQkJCQlcCisJCWktPmYtPmdldF9ob3N0XyMjZmllbGQoc2hvc3QpOwkJCQlcCisJcmV0dXJuIHNucHJpbnRmKGJ1Ziwgc3osIGZvcm1hdF9zdHJpbmcsIGNhc3QgZmNfaG9zdF8jI2ZpZWxkKHNob3N0KSk7IFwKK30KKworI2RlZmluZSBmY19ob3N0X3N0b3JlX2Z1bmN0aW9uKGZpZWxkKQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3N0b3JlX2ZjX2hvc3RfIyNmaWVsZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjb25zdCBjaGFyICpidWYsCVwKKwkJCSAgIHNpemVfdCBjb3VudCkJCQkJXAorewkJCQkJCQkJCVwKKwlpbnQgdmFsOwkJCQkJCQlcCisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc2hvc3QoY2Rldik7CVwKKwlzdHJ1Y3QgZmNfaW50ZXJuYWwgKmkgPSB0b19mY19pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CVwKKwkJCQkJCQkJCVwKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOwkJCQlcCisJaS0+Zi0+c2V0X2hvc3RfIyNmaWVsZChzaG9zdCwgdmFsKTsJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQorCisjZGVmaW5lIGZjX2hvc3RfcmRfYXR0cihmaWVsZCwgZm9ybWF0X3N0cmluZywgc3opCQkJXAorCWZjX2hvc3Rfc2hvd19mdW5jdGlvbihmaWVsZCwgZm9ybWF0X3N0cmluZywgc3osICkJCVwKK3N0YXRpYyBGQ19DTEFTU19ERVZJQ0VfQVRUUihob3N0LCBmaWVsZCwgU19JUlVHTywJCQlcCisJCQkgc2hvd19mY19ob3N0XyMjZmllbGQsIE5VTEwpCisKKyNkZWZpbmUgZmNfaG9zdF9yZF9hdHRyX2Nhc3QoZmllbGQsIGZvcm1hdF9zdHJpbmcsIHN6LCBjYXN0KQkJXAorCWZjX2hvc3Rfc2hvd19mdW5jdGlvbihmaWVsZCwgZm9ybWF0X3N0cmluZywgc3osIChjYXN0KSkJCVwKK3N0YXRpYyBGQ19DTEFTU19ERVZJQ0VfQVRUUihob3N0LCBmaWVsZCwgU19JUlVHTywJCQlcCisJCQkgIHNob3dfZmNfaG9zdF8jI2ZpZWxkLCBOVUxMKQorCisjZGVmaW5lIGZjX2hvc3RfcndfYXR0cihmaWVsZCwgZm9ybWF0X3N0cmluZywgc3opCQkJXAorCWZjX2hvc3Rfc2hvd19mdW5jdGlvbihmaWVsZCwgZm9ybWF0X3N0cmluZywgc3osICkJCVwKKwlmY19ob3N0X3N0b3JlX2Z1bmN0aW9uKGZpZWxkKQkJCQkJXAorc3RhdGljIEZDX0NMQVNTX0RFVklDRV9BVFRSKGhvc3QsIGZpZWxkLCBTX0lSVUdPIHwgU19JV1VTUiwJCVwKKwkJCXNob3dfZmNfaG9zdF8jI2ZpZWxkLAkJCQlcCisJCQlzdG9yZV9mY19ob3N0XyMjZmllbGQpCisKKyNkZWZpbmUgZmNfaG9zdF9yZF9lbnVtX2F0dHIodGl0bGUsIG1heGxlbikJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3Nob3dfZmNfaG9zdF8jI3RpdGxlIChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3Nob3N0KGNkZXYpOwlcCisJc3RydWN0IGZjX2ludGVybmFsICppID0gdG9fZmNfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOwlcCisJY29uc3QgY2hhciAqbmFtZTsJCQkJCQlcCisJaWYgKGktPmYtPmdldF9ob3N0XyMjdGl0bGUpCQkJCQlcCisJCWktPmYtPmdldF9ob3N0XyMjdGl0bGUoc2hvc3QpOwkJCQlcCisJbmFtZSA9IGdldF9mY18jI3RpdGxlIyNfbmFtZShmY19ob3N0XyMjdGl0bGUoc2hvc3QpKTsJCVwKKwlpZiAoIW5hbWUpCQkJCQkJCVwKKwkJcmV0dXJuIC1FSU5WQUw7CQkJCQkJXAorCXJldHVybiBzbnByaW50ZihidWYsIG1heGxlbiwgIiVzXG4iLCBuYW1lKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIEZDX0NMQVNTX0RFVklDRV9BVFRSKGhvc3QsIHRpdGxlLCBTX0lSVUdPLCBzaG93X2ZjX2hvc3RfIyN0aXRsZSwgTlVMTCkKKworI2RlZmluZSBTRVRVUF9IT1NUX0FUVFJJQlVURV9SRChmaWVsZCkJCQkJCVwKKwlpLT5wcml2YXRlX2hvc3RfYXR0cnNbY291bnRdID0gY2xhc3NfZGV2aWNlX2F0dHJfaG9zdF8jI2ZpZWxkOwlcCisJaS0+cHJpdmF0ZV9ob3N0X2F0dHJzW2NvdW50XS5hdHRyLm1vZGUgPSBTX0lSVUdPOwkJXAorCWktPnByaXZhdGVfaG9zdF9hdHRyc1tjb3VudF0uc3RvcmUgPSBOVUxMOwkJCVwKKwlpLT5ob3N0X2F0dHJzW2NvdW50XSA9ICZpLT5wcml2YXRlX2hvc3RfYXR0cnNbY291bnRdOwkJXAorCWlmIChpLT5mLT5zaG93X2hvc3RfIyNmaWVsZCkJCQkJCVwKKwkJY291bnQrKworCisjZGVmaW5lIFNFVFVQX0hPU1RfQVRUUklCVVRFX1JXKGZpZWxkKQkJCQkJXAorCWktPnByaXZhdGVfaG9zdF9hdHRyc1tjb3VudF0gPSBjbGFzc19kZXZpY2VfYXR0cl9ob3N0XyMjZmllbGQ7CVwKKwlpZiAoIWktPmYtPnNldF9ob3N0XyMjZmllbGQpIHsJCQkJCVwKKwkJaS0+cHJpdmF0ZV9ob3N0X2F0dHJzW2NvdW50XS5hdHRyLm1vZGUgPSBTX0lSVUdPOwlcCisJCWktPnByaXZhdGVfaG9zdF9hdHRyc1tjb3VudF0uc3RvcmUgPSBOVUxMOwkJXAorCX0JCQkJCQkJCVwKKwlpLT5ob3N0X2F0dHJzW2NvdW50XSA9ICZpLT5wcml2YXRlX2hvc3RfYXR0cnNbY291bnRdOwkJXAorCWlmIChpLT5mLT5zaG93X2hvc3RfIyNmaWVsZCkJCQkJCVwKKwkJY291bnQrKworCisKKyNkZWZpbmUgZmNfcHJpdmF0ZV9ob3N0X3Nob3dfZnVuY3Rpb24oZmllbGQsIGZvcm1hdF9zdHJpbmcsIHN6LCBjYXN0KQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorc2hvd19mY19ob3N0XyMjZmllbGQgKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc2hvc3QoY2Rldik7CVwKKwlyZXR1cm4gc25wcmludGYoYnVmLCBzeiwgZm9ybWF0X3N0cmluZywgY2FzdCBmY19ob3N0XyMjZmllbGQoc2hvc3QpKTsgXAorfQorCisjZGVmaW5lIGZjX3ByaXZhdGVfaG9zdF9yZF9hdHRyKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeikJCVwKKwlmY19wcml2YXRlX2hvc3Rfc2hvd19mdW5jdGlvbihmaWVsZCwgZm9ybWF0X3N0cmluZywgc3osICkJXAorc3RhdGljIEZDX0NMQVNTX0RFVklDRV9BVFRSKGhvc3QsIGZpZWxkLCBTX0lSVUdPLAkJCVwKKwkJCSBzaG93X2ZjX2hvc3RfIyNmaWVsZCwgTlVMTCkKKworI2RlZmluZSBmY19wcml2YXRlX2hvc3RfcmRfYXR0cl9jYXN0KGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgY2FzdCkJXAorCWZjX3ByaXZhdGVfaG9zdF9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgKGNhc3QpKSBcCitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIoaG9zdCwgZmllbGQsIFNfSVJVR08sCQkJXAorCQkJICBzaG93X2ZjX2hvc3RfIyNmaWVsZCwgTlVMTCkKKworI2RlZmluZSBTRVRVUF9QUklWQVRFX0hPU1RfQVRUUklCVVRFX1JEKGZpZWxkKQkJCVwKKwlpLT5wcml2YXRlX2hvc3RfYXR0cnNbY291bnRdID0gY2xhc3NfZGV2aWNlX2F0dHJfaG9zdF8jI2ZpZWxkOwlcCisJaS0+cHJpdmF0ZV9ob3N0X2F0dHJzW2NvdW50XS5hdHRyLm1vZGUgPSBTX0lSVUdPOwkJXAorCWktPnByaXZhdGVfaG9zdF9hdHRyc1tjb3VudF0uc3RvcmUgPSBOVUxMOwkJCVwKKwlpLT5ob3N0X2F0dHJzW2NvdW50XSA9ICZpLT5wcml2YXRlX2hvc3RfYXR0cnNbY291bnRdOwkJXAorCWNvdW50KysKKworI2RlZmluZSBTRVRVUF9QUklWQVRFX0hPU1RfQVRUUklCVVRFX1JXKGZpZWxkKQkJCVwKKwlpLT5wcml2YXRlX2hvc3RfYXR0cnNbY291bnRdID0gY2xhc3NfZGV2aWNlX2F0dHJfaG9zdF8jI2ZpZWxkOwlcCisJaS0+aG9zdF9hdHRyc1tjb3VudF0gPSAmaS0+cHJpdmF0ZV9ob3N0X2F0dHJzW2NvdW50XTsJCVwKKwljb3VudCsrCisKKworLyogRml4ZWQgSG9zdCBBdHRyaWJ1dGVzICovCisKK3N0YXRpYyBzc2l6ZV90CitzaG93X2ZjX2hvc3Rfc3VwcG9ydGVkX2NsYXNzZXMgKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHRyYW5zcG9ydF9jbGFzc190b19zaG9zdChjZGV2KTsKKworCWlmIChmY19ob3N0X3N1cHBvcnRlZF9jbGFzc2VzKHNob3N0KSA9PSBGQ19DT1NfVU5TUEVDSUZJRUQpCisJCXJldHVybiBzbnByaW50ZihidWYsIDIwLCAidW5zcGVjaWZpZWRcbiIpOworCisJcmV0dXJuIGdldF9mY19jb3NfbmFtZXMoZmNfaG9zdF9zdXBwb3J0ZWRfY2xhc3NlcyhzaG9zdCksIGJ1Zik7Cit9CitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIoaG9zdCwgc3VwcG9ydGVkX2NsYXNzZXMsIFNfSVJVR08sCisJCXNob3dfZmNfaG9zdF9zdXBwb3J0ZWRfY2xhc3NlcywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X2ZjX2hvc3Rfc3VwcG9ydGVkX2ZjNHMgKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHRyYW5zcG9ydF9jbGFzc190b19zaG9zdChjZGV2KTsKKwlyZXR1cm4gKHNzaXplX3Qpc2hvd19mY19mYzRzKGJ1ZiwgZmNfaG9zdF9zdXBwb3J0ZWRfZmM0cyhzaG9zdCkpOworfQorc3RhdGljIEZDX0NMQVNTX0RFVklDRV9BVFRSKGhvc3QsIHN1cHBvcnRlZF9mYzRzLCBTX0lSVUdPLAorCQlzaG93X2ZjX2hvc3Rfc3VwcG9ydGVkX2ZjNHMsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdAorc2hvd19mY19ob3N0X3N1cHBvcnRlZF9zcGVlZHMgKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHRyYW5zcG9ydF9jbGFzc190b19zaG9zdChjZGV2KTsKKworCWlmIChmY19ob3N0X3N1cHBvcnRlZF9zcGVlZHMoc2hvc3QpID09IEZDX1BPUlRTUEVFRF9VTktOT1dOKQorCQlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgInVua25vd25cbiIpOworCisJcmV0dXJuIGdldF9mY19wb3J0X3NwZWVkX25hbWVzKGZjX2hvc3Rfc3VwcG9ydGVkX3NwZWVkcyhzaG9zdCksIGJ1Zik7Cit9CitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIoaG9zdCwgc3VwcG9ydGVkX3NwZWVkcywgU19JUlVHTywKKwkJc2hvd19mY19ob3N0X3N1cHBvcnRlZF9zcGVlZHMsIE5VTEwpOworCisKK2ZjX3ByaXZhdGVfaG9zdF9yZF9hdHRyX2Nhc3Qobm9kZV9uYW1lLCAiMHglbGx4XG4iLCAyMCwgdW5zaWduZWQgbG9uZyBsb25nKTsKK2ZjX3ByaXZhdGVfaG9zdF9yZF9hdHRyX2Nhc3QocG9ydF9uYW1lLCAiMHglbGx4XG4iLCAyMCwgdW5zaWduZWQgbG9uZyBsb25nKTsKK2ZjX3ByaXZhdGVfaG9zdF9yZF9hdHRyKHN5bWJvbGljX25hbWUsICIlc1xuIiwgKEZDX1NZTUJPTElDX05BTUVfU0laRSArMSkpOworZmNfcHJpdmF0ZV9ob3N0X3JkX2F0dHIobWF4ZnJhbWVfc2l6ZSwgIiV1IGJ5dGVzXG4iLCAyMCk7CitmY19wcml2YXRlX2hvc3RfcmRfYXR0cihzZXJpYWxfbnVtYmVyLCAiJXNcbiIsIChGQ19TRVJJQUxfTlVNQkVSX1NJWkUgKzEpKTsKKworCisvKiBEeW5hbWljIEhvc3QgQXR0cmlidXRlcyAqLworCitzdGF0aWMgc3NpemVfdAorc2hvd19mY19ob3N0X2FjdGl2ZV9mYzRzIChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IGZjX2ludGVybmFsICppID0gdG9fZmNfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOworCisJaWYgKGktPmYtPmdldF9ob3N0X2FjdGl2ZV9mYzRzKQorCQlpLT5mLT5nZXRfaG9zdF9hY3RpdmVfZmM0cyhzaG9zdCk7CisKKwlyZXR1cm4gKHNzaXplX3Qpc2hvd19mY19mYzRzKGJ1ZiwgZmNfaG9zdF9hY3RpdmVfZmM0cyhzaG9zdCkpOworfQorc3RhdGljIEZDX0NMQVNTX0RFVklDRV9BVFRSKGhvc3QsIGFjdGl2ZV9mYzRzLCBTX0lSVUdPLAorCQlzaG93X2ZjX2hvc3RfYWN0aXZlX2ZjNHMsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdAorc2hvd19mY19ob3N0X3NwZWVkIChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IGZjX2ludGVybmFsICppID0gdG9fZmNfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOworCisJaWYgKGktPmYtPmdldF9ob3N0X3NwZWVkKQorCQlpLT5mLT5nZXRfaG9zdF9zcGVlZChzaG9zdCk7CisKKwlpZiAoZmNfaG9zdF9zcGVlZChzaG9zdCkgPT0gRkNfUE9SVFNQRUVEX1VOS05PV04pCisJCXJldHVybiBzbnByaW50ZihidWYsIDIwLCAidW5rbm93blxuIik7CisKKwlyZXR1cm4gZ2V0X2ZjX3BvcnRfc3BlZWRfbmFtZXMoZmNfaG9zdF9zcGVlZChzaG9zdCksIGJ1Zik7Cit9CitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIoaG9zdCwgc3BlZWQsIFNfSVJVR08sCisJCXNob3dfZmNfaG9zdF9zcGVlZCwgTlVMTCk7CisKKworZmNfaG9zdF9yZF9hdHRyKHBvcnRfaWQsICIweCUwNnhcbiIsIDIwKTsKK2ZjX2hvc3RfcmRfZW51bV9hdHRyKHBvcnRfdHlwZSwgRkNfUE9SVFRZUEVfTUFYX05BTUVMRU4pOworZmNfaG9zdF9yZF9lbnVtX2F0dHIocG9ydF9zdGF0ZSwgRkNfUE9SVFNUQVRFX01BWF9OQU1FTEVOKTsKK2ZjX2hvc3RfcmRfYXR0cl9jYXN0KGZhYnJpY19uYW1lLCAiMHglbGx4XG4iLCAyMCwgdW5zaWduZWQgbG9uZyBsb25nKTsKKworCisvKiBQcml2YXRlIEhvc3QgQXR0cmlidXRlcyAqLworCitzdGF0aWMgc3NpemVfdAorc2hvd19mY19wcml2YXRlX2hvc3RfdGd0aWRfYmluZF90eXBlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHRyYW5zcG9ydF9jbGFzc190b19zaG9zdChjZGV2KTsKKwljb25zdCBjaGFyICpuYW1lOworCisJbmFtZSA9IGdldF9mY190Z3RpZF9iaW5kX3R5cGVfbmFtZShmY19ob3N0X3RndGlkX2JpbmRfdHlwZShzaG9zdCkpOworCWlmICghbmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgRkNfQklORFRZUEVfTUFYX05BTUVMRU4sICIlc1xuIiwgbmFtZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9mY19wcml2YXRlX2hvc3RfdGd0aWRfYmluZF90eXBlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCwgKm5leHRfcnBvcnQ7CisgCWVudW0gZmNfdGd0aWRfYmluZGluZ190eXBlIHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGdldF9mY190Z3RpZF9iaW5kX3R5cGVfbWF0Y2goYnVmLCAmdmFsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBpZiBjaGFuZ2luZyBiaW5kIHR5cGUsIHB1cmdlIGFsbCB1bnVzZWQgY29uc2lzdGVudCBiaW5kaW5ncyAqLworCWlmICh2YWwgIT0gZmNfaG9zdF90Z3RpZF9iaW5kX3R5cGUoc2hvc3QpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJwb3J0LCBuZXh0X3Jwb3J0LAorCQkJCSZmY19ob3N0X3Jwb3J0X2JpbmRpbmdzKHNob3N0KSwgcGVlcnMpCisJCQlmY19ycG9ydF90ZXJtaW5hdGUocnBvcnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl9CisKKwlmY19ob3N0X3RndGlkX2JpbmRfdHlwZShzaG9zdCkgPSB2YWw7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIoaG9zdCwgdGd0aWRfYmluZF90eXBlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCXNob3dfZmNfcHJpdmF0ZV9ob3N0X3RndGlkX2JpbmRfdHlwZSwKKwkJCXN0b3JlX2ZjX3ByaXZhdGVfaG9zdF90Z3RpZF9iaW5kX3R5cGUpOworCisvKgorICogSG9zdCBTdGF0aXN0aWNzIE1hbmFnZW1lbnQKKyAqLworCisvKiBTaG93IGEgZ2l2ZW4gYW4gYXR0cmlidXRlIGluIHRoZSBzdGF0aXN0aWNzIGdyb3VwICovCitzdGF0aWMgc3NpemVfdAorZmNfc3RhdF9zaG93KGNvbnN0IHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IGZjX2ludGVybmFsICppID0gdG9fZmNfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOworCXN0cnVjdCBmY19ob3N0X3N0YXRpc3RpY3MgKnN0YXRzOworCXNzaXplX3QgcmV0ID0gLUVOT0VOVDsKKworCWlmIChvZmZzZXQgPiBzaXplb2Yoc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcykgfHwKKwkgICAgb2Zmc2V0ICUgc2l6ZW9mKHU2NCkgIT0gMCkKKwkJV0FSTl9PTigxKTsKKworCWlmIChpLT5mLT5nZXRfZmNfaG9zdF9zdGF0cykgeworCQlzdGF0cyA9IChpLT5mLT5nZXRfZmNfaG9zdF9zdGF0cykoc2hvc3QpOworCQlpZiAoc3RhdHMpCisJCQlyZXQgPSBzbnByaW50ZihidWYsIDIwLCAiMHglbGx4XG4iLAorCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykqKHU2NCAqKSgoKHU4ICopIHN0YXRzKSArIG9mZnNldCkpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisKKy8qIGdlbmVyYXRlIGEgcmVhZC1vbmx5IHN0YXRpc3RpY3MgYXR0cmlidXRlICovCisjZGVmaW5lIGZjX2hvc3Rfc3RhdGlzdGljKG5hbWUpCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19mY3N0YXRfIyNuYW1lKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpIAlcCit7CQkJCQkJCQkJXAorCXJldHVybiBmY19zdGF0X3Nob3coY2QsIGJ1ZiwgCQkJCQlcCisJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcywgbmFtZSkpOwlcCit9CQkJCQkJCQkJXAorc3RhdGljIEZDX0NMQVNTX0RFVklDRV9BVFRSKGhvc3QsIG5hbWUsIFNfSVJVR08sIHNob3dfZmNzdGF0XyMjbmFtZSwgTlVMTCkKKworZmNfaG9zdF9zdGF0aXN0aWMoc2Vjb25kc19zaW5jZV9sYXN0X3Jlc2V0KTsKK2ZjX2hvc3Rfc3RhdGlzdGljKHR4X2ZyYW1lcyk7CitmY19ob3N0X3N0YXRpc3RpYyh0eF93b3Jkcyk7CitmY19ob3N0X3N0YXRpc3RpYyhyeF9mcmFtZXMpOworZmNfaG9zdF9zdGF0aXN0aWMocnhfd29yZHMpOworZmNfaG9zdF9zdGF0aXN0aWMobGlwX2NvdW50KTsKK2ZjX2hvc3Rfc3RhdGlzdGljKG5vc19jb3VudCk7CitmY19ob3N0X3N0YXRpc3RpYyhlcnJvcl9mcmFtZXMpOworZmNfaG9zdF9zdGF0aXN0aWMoZHVtcGVkX2ZyYW1lcyk7CitmY19ob3N0X3N0YXRpc3RpYyhsaW5rX2ZhaWx1cmVfY291bnQpOworZmNfaG9zdF9zdGF0aXN0aWMobG9zc19vZl9zeW5jX2NvdW50KTsKK2ZjX2hvc3Rfc3RhdGlzdGljKGxvc3Nfb2Zfc2lnbmFsX2NvdW50KTsKK2ZjX2hvc3Rfc3RhdGlzdGljKHByaW1fc2VxX3Byb3RvY29sX2Vycl9jb3VudCk7CitmY19ob3N0X3N0YXRpc3RpYyhpbnZhbGlkX3R4X3dvcmRfY291bnQpOworZmNfaG9zdF9zdGF0aXN0aWMoaW52YWxpZF9jcmNfY291bnQpOworZmNfaG9zdF9zdGF0aXN0aWMoZmNwX2lucHV0X3JlcXVlc3RzKTsKK2ZjX2hvc3Rfc3RhdGlzdGljKGZjcF9vdXRwdXRfcmVxdWVzdHMpOworZmNfaG9zdF9zdGF0aXN0aWMoZmNwX2NvbnRyb2xfcmVxdWVzdHMpOworZmNfaG9zdF9zdGF0aXN0aWMoZmNwX2lucHV0X21lZ2FieXRlcyk7CitmY19ob3N0X3N0YXRpc3RpYyhmY3Bfb3V0cHV0X21lZ2FieXRlcyk7CisKK3N0YXRpYyBzc2l6ZV90CitmY19yZXNldF9zdGF0aXN0aWNzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHRyYW5zcG9ydF9jbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3QgZmNfaW50ZXJuYWwgKmkgPSB0b19mY19pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CisKKwkvKiBpZ25vcmUgYW55IGRhdGEgdmFsdWUgd3JpdHRlbiB0byB0aGUgYXR0cmlidXRlICovCisJaWYgKGktPmYtPnJlc2V0X2ZjX2hvc3Rfc3RhdHMpIHsKKwkJaS0+Zi0+cmVzZXRfZmNfaG9zdF9zdGF0cyhzaG9zdCk7CisJCXJldHVybiBjb3VudDsKKwl9CisKKwlyZXR1cm4gLUVOT0VOVDsKK30KK3N0YXRpYyBGQ19DTEFTU19ERVZJQ0VfQVRUUihob3N0LCByZXNldF9zdGF0aXN0aWNzLCBTX0lXVVNSLCBOVUxMLAorCQkJCWZjX3Jlc2V0X3N0YXRpc3RpY3MpOworCisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpmY19zdGF0aXN0aWNzX2F0dHJzW10gPSB7CisJJmNsYXNzX2RldmljZV9hdHRyX2hvc3Rfc2Vjb25kc19zaW5jZV9sYXN0X3Jlc2V0LmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2hvc3RfdHhfZnJhbWVzLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2hvc3RfdHhfd29yZHMuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfaG9zdF9yeF9mcmFtZXMuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfaG9zdF9yeF93b3Jkcy5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9ob3N0X2xpcF9jb3VudC5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9ob3N0X25vc19jb3VudC5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9ob3N0X2Vycm9yX2ZyYW1lcy5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9ob3N0X2R1bXBlZF9mcmFtZXMuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfaG9zdF9saW5rX2ZhaWx1cmVfY291bnQuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfaG9zdF9sb3NzX29mX3N5bmNfY291bnQuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfaG9zdF9sb3NzX29mX3NpZ25hbF9jb3VudC5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9ob3N0X3ByaW1fc2VxX3Byb3RvY29sX2Vycl9jb3VudC5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9ob3N0X2ludmFsaWRfdHhfd29yZF9jb3VudC5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9ob3N0X2ludmFsaWRfY3JjX2NvdW50LmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2hvc3RfZmNwX2lucHV0X3JlcXVlc3RzLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2hvc3RfZmNwX291dHB1dF9yZXF1ZXN0cy5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9ob3N0X2ZjcF9jb250cm9sX3JlcXVlc3RzLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2hvc3RfZmNwX2lucHV0X21lZ2FieXRlcy5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9ob3N0X2ZjcF9vdXRwdXRfbWVnYWJ5dGVzLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2hvc3RfcmVzZXRfc3RhdGlzdGljcy5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGZjX3N0YXRpc3RpY3NfZ3JvdXAgPSB7CisJLm5hbWUgPSAic3RhdGlzdGljcyIsCisJLmF0dHJzID0gZmNfc3RhdGlzdGljc19hdHRycywKK307CisKK3N0YXRpYyBpbnQgZmNfaG9zdF9tYXRjaChzdHJ1Y3QgYXR0cmlidXRlX2NvbnRhaW5lciAqY29udCwKKwkJCSAgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXN0cnVjdCBmY19pbnRlcm5hbCAqaTsKKworCWlmICghc2NzaV9pc19ob3N0X2RldmljZShkZXYpKQorCQlyZXR1cm4gMDsKKworCXNob3N0ID0gZGV2X3RvX3Nob3N0KGRldik7CisJaWYgKCFzaG9zdC0+dHJhbnNwb3J0dCAgfHwgc2hvc3QtPnRyYW5zcG9ydHQtPmhvc3RfYXR0cnMuYWMuY2xhc3MKKwkgICAgIT0gJmZjX2hvc3RfY2xhc3MuY2xhc3MpCisJCXJldHVybiAwOworCisJaSA9IHRvX2ZjX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKKworCXJldHVybiAmaS0+dC5ob3N0X2F0dHJzLmFjID09IGNvbnQ7Cit9CisKK3N0YXRpYyBpbnQgZmNfdGFyZ2V0X21hdGNoKHN0cnVjdCBhdHRyaWJ1dGVfY29udGFpbmVyICpjb250LAorCQkJICAgIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlzdHJ1Y3QgZmNfaW50ZXJuYWwgKmk7CisKKwlpZiAoIXNjc2lfaXNfdGFyZ2V0X2RldmljZShkZXYpKQorCQlyZXR1cm4gMDsKKworCXNob3N0ID0gZGV2X3RvX3Nob3N0KGRldi0+cGFyZW50KTsKKwlpZiAoIXNob3N0LT50cmFuc3BvcnR0ICB8fCBzaG9zdC0+dHJhbnNwb3J0dC0+aG9zdF9hdHRycy5hYy5jbGFzcworCSAgICAhPSAmZmNfaG9zdF9jbGFzcy5jbGFzcykKKwkJcmV0dXJuIDA7CisKKwlpID0gdG9fZmNfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOworCisJcmV0dXJuICZpLT50LnRhcmdldF9hdHRycy5hYyA9PSBjb250OworfQorCitzdGF0aWMgdm9pZCBmY19ycG9ydF9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IGRldl90b19ycG9ydChkZXYpOworCXB1dF9kZXZpY2UoZGV2LT5wYXJlbnQpOworCWtmcmVlKHJwb3J0KTsKK30KKworaW50IHNjc2lfaXNfZmNfcnBvcnQoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPnJlbGVhc2UgPT0gZmNfcnBvcnRfZGV2X3JlbGVhc2U7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfaXNfZmNfcnBvcnQpOworCitzdGF0aWMgaW50IGZjX3Jwb3J0X21hdGNoKHN0cnVjdCBhdHRyaWJ1dGVfY29udGFpbmVyICpjb250LAorCQkJICAgIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlzdHJ1Y3QgZmNfaW50ZXJuYWwgKmk7CisKKwlpZiAoIXNjc2lfaXNfZmNfcnBvcnQoZGV2KSkKKwkJcmV0dXJuIDA7CisKKwlzaG9zdCA9IGRldl90b19zaG9zdChkZXYtPnBhcmVudCk7CisJaWYgKCFzaG9zdC0+dHJhbnNwb3J0dCAgfHwgc2hvc3QtPnRyYW5zcG9ydHQtPmhvc3RfYXR0cnMuYWMuY2xhc3MKKwkgICAgIT0gJmZjX2hvc3RfY2xhc3MuY2xhc3MpCisJCXJldHVybiAwOworCisJaSA9IHRvX2ZjX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKKworCXJldHVybiAmaS0+cnBvcnRfYXR0cl9jb250LmFjID09IGNvbnQ7Cit9CisKK3N0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqCitmY19hdHRhY2hfdHJhbnNwb3J0KHN0cnVjdCBmY19mdW5jdGlvbl90ZW1wbGF0ZSAqZnQpCit7CisJc3RydWN0IGZjX2ludGVybmFsICppID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZjX2ludGVybmFsKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJaW50IGNvdW50OworCisJaWYgKHVubGlrZWx5KCFpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQoaSwgMCwgc2l6ZW9mKHN0cnVjdCBmY19pbnRlcm5hbCkpOworCisJaS0+dC50YXJnZXRfYXR0cnMuYWMuYXR0cnMgPSAmaS0+c3RhcmdldF9hdHRyc1swXTsKKwlpLT50LnRhcmdldF9hdHRycy5hYy5jbGFzcyA9ICZmY190cmFuc3BvcnRfY2xhc3MuY2xhc3M7CisJaS0+dC50YXJnZXRfYXR0cnMuYWMubWF0Y2ggPSBmY190YXJnZXRfbWF0Y2g7CisJaS0+dC50YXJnZXRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZmNfc3RhcmdldF9hdHRycyk7CisJdHJhbnNwb3J0X2NvbnRhaW5lcl9yZWdpc3RlcigmaS0+dC50YXJnZXRfYXR0cnMpOworCisJaS0+dC5ob3N0X2F0dHJzLmFjLmF0dHJzID0gJmktPmhvc3RfYXR0cnNbMF07CisJaS0+dC5ob3N0X2F0dHJzLmFjLmNsYXNzID0gJmZjX2hvc3RfY2xhc3MuY2xhc3M7CisJaS0+dC5ob3N0X2F0dHJzLmFjLm1hdGNoID0gZmNfaG9zdF9tYXRjaDsKKwlpLT50Lmhvc3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZmNfaG9zdF9hdHRycyk7CisJaWYgKGZ0LT5nZXRfZmNfaG9zdF9zdGF0cykKKwkJaS0+dC5ob3N0X2F0dHJzLnN0YXRpc3RpY3MgPSAmZmNfc3RhdGlzdGljc19ncm91cDsKKwl0cmFuc3BvcnRfY29udGFpbmVyX3JlZ2lzdGVyKCZpLT50Lmhvc3RfYXR0cnMpOworCisJaS0+cnBvcnRfYXR0cl9jb250LmFjLmF0dHJzID0gJmktPnJwb3J0X2F0dHJzWzBdOworCWktPnJwb3J0X2F0dHJfY29udC5hYy5jbGFzcyA9ICZmY19ycG9ydF9jbGFzcy5jbGFzczsKKwlpLT5ycG9ydF9hdHRyX2NvbnQuYWMubWF0Y2ggPSBmY19ycG9ydF9tYXRjaDsKKwl0cmFuc3BvcnRfY29udGFpbmVyX3JlZ2lzdGVyKCZpLT5ycG9ydF9hdHRyX2NvbnQpOworCisJaS0+ZiA9IGZ0OworCisJLyogVHJhbnNwb3J0IHVzZXMgdGhlIHNob3N0IHdvcmtxIGZvciBzY3NpIHNjYW5uaW5nICovCisJaS0+dC5jcmVhdGVfd29ya19xdWV1ZSA9IDE7CisJCisJLyoKKwkgKiBTZXR1cCBTQ1NJIFRhcmdldCBBdHRyaWJ1dGVzLgorCSAqLworCWNvdW50ID0gMDsKKwlTRVRVUF9TVEFSR0VUX0FUVFJJQlVURV9SRChub2RlX25hbWUpOworCVNFVFVQX1NUQVJHRVRfQVRUUklCVVRFX1JEKHBvcnRfbmFtZSk7CisJU0VUVVBfU1RBUkdFVF9BVFRSSUJVVEVfUkQocG9ydF9pZCk7CisKKwlCVUdfT04oY291bnQgPiBGQ19TVEFSR0VUX05VTV9BVFRSUyk7CisKKwlpLT5zdGFyZ2V0X2F0dHJzW2NvdW50XSA9IE5VTEw7CisKKworCS8qCisJICogU2V0dXAgU0NTSSBIb3N0IEF0dHJpYnV0ZXMuCisJICovCisJY291bnQ9MDsKKwlTRVRVUF9IT1NUX0FUVFJJQlVURV9SRChub2RlX25hbWUpOworCVNFVFVQX0hPU1RfQVRUUklCVVRFX1JEKHBvcnRfbmFtZSk7CisJU0VUVVBfSE9TVF9BVFRSSUJVVEVfUkQoc3VwcG9ydGVkX2NsYXNzZXMpOworCVNFVFVQX0hPU1RfQVRUUklCVVRFX1JEKHN1cHBvcnRlZF9mYzRzKTsKKwlTRVRVUF9IT1NUX0FUVFJJQlVURV9SRChzeW1ib2xpY19uYW1lKTsKKwlTRVRVUF9IT1NUX0FUVFJJQlVURV9SRChzdXBwb3J0ZWRfc3BlZWRzKTsKKwlTRVRVUF9IT1NUX0FUVFJJQlVURV9SRChtYXhmcmFtZV9zaXplKTsKKwlTRVRVUF9IT1NUX0FUVFJJQlVURV9SRChzZXJpYWxfbnVtYmVyKTsKKworCVNFVFVQX0hPU1RfQVRUUklCVVRFX1JEKHBvcnRfaWQpOworCVNFVFVQX0hPU1RfQVRUUklCVVRFX1JEKHBvcnRfdHlwZSk7CisJU0VUVVBfSE9TVF9BVFRSSUJVVEVfUkQocG9ydF9zdGF0ZSk7CisJU0VUVVBfSE9TVF9BVFRSSUJVVEVfUkQoYWN0aXZlX2ZjNHMpOworCVNFVFVQX0hPU1RfQVRUUklCVVRFX1JEKHNwZWVkKTsKKwlTRVRVUF9IT1NUX0FUVFJJQlVURV9SRChmYWJyaWNfbmFtZSk7CisKKwkvKiBUcmFuc3BvcnQtbWFuYWdlZCBhdHRyaWJ1dGVzICovCisJU0VUVVBfUFJJVkFURV9IT1NUX0FUVFJJQlVURV9SVyh0Z3RpZF9iaW5kX3R5cGUpOworCisJQlVHX09OKGNvdW50ID4gRkNfSE9TVF9OVU1fQVRUUlMpOworCisJaS0+aG9zdF9hdHRyc1tjb3VudF0gPSBOVUxMOworCisJLyoKKwkgKiBTZXR1cCBSZW1vdGUgUG9ydCBBdHRyaWJ1dGVzLgorCSAqLworCWNvdW50PTA7CisJU0VUVVBfUlBPUlRfQVRUUklCVVRFX1JEKG1heGZyYW1lX3NpemUpOworCVNFVFVQX1JQT1JUX0FUVFJJQlVURV9SRChzdXBwb3J0ZWRfY2xhc3Nlcyk7CisJU0VUVVBfUlBPUlRfQVRUUklCVVRFX1JXKGRldl9sb3NzX3Rtbyk7CisJU0VUVVBfUFJJVkFURV9SUE9SVF9BVFRSSUJVVEVfUkQobm9kZV9uYW1lKTsKKwlTRVRVUF9QUklWQVRFX1JQT1JUX0FUVFJJQlVURV9SRChwb3J0X25hbWUpOworCVNFVFVQX1BSSVZBVEVfUlBPUlRfQVRUUklCVVRFX1JEKHBvcnRfaWQpOworCVNFVFVQX1BSSVZBVEVfUlBPUlRfQVRUUklCVVRFX1JEKHJvbGVzKTsKKwlTRVRVUF9QUklWQVRFX1JQT1JUX0FUVFJJQlVURV9SRChwb3J0X3N0YXRlKTsKKwlTRVRVUF9QUklWQVRFX1JQT1JUX0FUVFJJQlVURV9SRChzY3NpX3RhcmdldF9pZCk7CisKKwlCVUdfT04oY291bnQgPiBGQ19SUE9SVF9OVU1fQVRUUlMpOworCisJaS0+cnBvcnRfYXR0cnNbY291bnRdID0gTlVMTDsKKworCXJldHVybiAmaS0+dDsKK30KK0VYUE9SVF9TWU1CT0woZmNfYXR0YWNoX3RyYW5zcG9ydCk7CisKK3ZvaWQgZmNfcmVsZWFzZV90cmFuc3BvcnQoc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICp0KQoreworCXN0cnVjdCBmY19pbnRlcm5hbCAqaSA9IHRvX2ZjX2ludGVybmFsKHQpOworCisJdHJhbnNwb3J0X2NvbnRhaW5lcl91bnJlZ2lzdGVyKCZpLT50LnRhcmdldF9hdHRycyk7CisJdHJhbnNwb3J0X2NvbnRhaW5lcl91bnJlZ2lzdGVyKCZpLT50Lmhvc3RfYXR0cnMpOworCXRyYW5zcG9ydF9jb250YWluZXJfdW5yZWdpc3RlcigmaS0+cnBvcnRfYXR0cl9jb250KTsKKworCWtmcmVlKGkpOworfQorRVhQT1JUX1NZTUJPTChmY19yZWxlYXNlX3RyYW5zcG9ydCk7CisKKworLyoqCisgKiBmY19yZW1vdmVfaG9zdCAtIGNhbGxlZCB0byB0ZXJtaW5hdGUgYW55IGZjX3RyYW5zcG9ydC1yZWxhdGVkIGVsZW1lbnRzCisgKiAgICAgICAgICAgICAgICAgIGZvciBhIHNjc2kgaG9zdC4KKyAqIEBycG9ydDoJcmVtb3RlIHBvcnQgdG8gYmUgdW5ibG9ja2VkLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgcHJlY2VlZGluZyB0aGUKKyAqIGEgZHJpdmVyJ3MgY2FsbCB0byBzY3NpX3JlbW92ZV9ob3N0KCkuCisgKgorICogV0FSTklORzogQSBkcml2ZXIgdXRpbGl6aW5nIHRoZSBmY190cmFuc3BvcnQsIHdoaWNoIGZhaWxzIHRvIGNhbGwKKyAqICAgdGhpcyByb3V0aW5lIHByaW9yIHRvIHNjc2lfcmVtb3RlX2hvc3QoKSwgd2lsbCBsZWF2ZSBkYW5nbGluZworICogICBvYmplY3RzIGluIC9zeXMvY2xhc3MvZmNfcmVtb3RlX3BvcnRzLiBBY2Nlc3MgdG8gYW55IG9mIHRoZXNlCisgKiAgIG9iamVjdHMgY2FuIHJlc3VsdCBpbiBhIHN5c3RlbSBjcmFzaCAhISEKKyAqCisgKiBOb3RlczoKKyAqCVRoaXMgcm91dGluZSBhc3N1bWVzIG5vIGxvY2tzIGFyZSBoZWxkIG9uIGVudHJ5LgorICoqLwordm9pZAorZmNfcmVtb3ZlX2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCwgKm5leHRfcnBvcnQ7CisKKwkvKiBSZW1vdmUgYW55IHJlbW90ZSBwb3J0cyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShycG9ydCwgbmV4dF9ycG9ydCwKKwkJCSZmY19ob3N0X3Jwb3J0cyhzaG9zdCksIHBlZXJzKQorCQlmY19ycG9ydF90ZXJtaW5hdGUocnBvcnQpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShycG9ydCwgbmV4dF9ycG9ydCwKKwkJCSZmY19ob3N0X3Jwb3J0X2JpbmRpbmdzKHNob3N0KSwgcGVlcnMpCisJCWZjX3Jwb3J0X3Rlcm1pbmF0ZShycG9ydCk7Cit9CitFWFBPUlRfU1lNQk9MKGZjX3JlbW92ZV9ob3N0KTsKKworLyoqCisgKiBmY19ycG9ydF9jcmVhdGUgLSBhbGxvY2F0ZXMgYW5kIGNyZWF0ZXMgYSByZW1vdGUgRkMgcG9ydC4KKyAqIEBzaG9zdDoJc2NzaSBob3N0IHRoZSByZW1vdGUgcG9ydCBpcyBjb25uZWN0ZWQgdG8uCisgKiBAY2hhbm5lbDoJQ2hhbm5lbCBvbiBzaG9zdCBwb3J0IGNvbm5lY3RlZCB0by4KKyAqIEBpZHM6CVRoZSB3b3JsZCB3aWRlIG5hbWVzLCBmYyBhZGRyZXNzLCBhbmQgRkM0IHBvcnQKKyAqCQlyb2xlcyBmb3IgdGhlIHJlbW90ZSBwb3J0LgorICoKKyAqIEFsbG9jYXRlcyBhbmQgY3JlYXRlcyB0aGUgcmVtb3RlciBwb3J0IHN0cnVjdHVyZSwgaW5jbHVkaW5nIHRoZQorICogY2xhc3MgYW5kIHN5c2ZzIGNyZWF0aW9uLgorICoKKyAqIE5vdGVzOgorICoJVGhpcyByb3V0aW5lIGFzc3VtZXMgbm8gbG9ja3MgYXJlIGhlbGQgb24gZW50cnkuCisgKiovCitzdHJ1Y3QgZmNfcnBvcnQgKgorZmNfcnBvcnRfY3JlYXRlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBpbnQgY2hhbm5lbCwKKwlzdHJ1Y3QgZmNfcnBvcnRfaWRlbnRpZmllcnMgICppZHMpCit7CisJc3RydWN0IGZjX2hvc3RfYXR0cnMgKmZjX2hvc3QgPQorCQkJKHN0cnVjdCBmY19ob3N0X2F0dHJzICopc2hvc3QtPnNob3N0X2RhdGE7CisJc3RydWN0IGZjX2ludGVybmFsICpmY2kgPSB0b19mY19pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyb3I7CisJc2l6ZV90IHNpemU7CisKKwlzaXplID0gKHNpemVvZihzdHJ1Y3QgZmNfcnBvcnQpICsgZmNpLT5mLT5kZF9mY3Jwb3J0X3NpemUpOworCXJwb3J0ID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIXJwb3J0KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhbGxvY2F0aW9uIGZhaWx1cmVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQocnBvcnQsIDAsIHNpemUpOworCisJcnBvcnQtPm1heGZyYW1lX3NpemUgPSAtMTsKKwlycG9ydC0+c3VwcG9ydGVkX2NsYXNzZXMgPSBGQ19DT1NfVU5TUEVDSUZJRUQ7CisJcnBvcnQtPmRldl9sb3NzX3RtbyA9IGZjX2Rldl9sb3NzX3RtbzsKKwltZW1jcHkoJnJwb3J0LT5ub2RlX25hbWUsICZpZHMtPm5vZGVfbmFtZSwgc2l6ZW9mKHJwb3J0LT5ub2RlX25hbWUpKTsKKwltZW1jcHkoJnJwb3J0LT5wb3J0X25hbWUsICZpZHMtPnBvcnRfbmFtZSwgc2l6ZW9mKHJwb3J0LT5wb3J0X25hbWUpKTsKKwlycG9ydC0+cG9ydF9pZCA9IGlkcy0+cG9ydF9pZDsKKwlycG9ydC0+cm9sZXMgPSBpZHMtPnJvbGVzOworCXJwb3J0LT5wb3J0X3N0YXRlID0gRkNfUE9SVFNUQVRFX09OTElORTsKKwlpZiAoZmNpLT5mLT5kZF9mY3Jwb3J0X3NpemUpCisJCXJwb3J0LT5kZF9kYXRhID0gJnJwb3J0WzFdOworCXJwb3J0LT5jaGFubmVsID0gY2hhbm5lbDsKKworCUlOSVRfV09SSygmcnBvcnQtPmRldl9sb3NzX3dvcmssIGZjX3RpbWVvdXRfYmxvY2tlZF9ycG9ydCwgcnBvcnQpOworCUlOSVRfV09SSygmcnBvcnQtPnNjYW5fd29yaywgZmNfc2NzaV9zY2FuX3Jwb3J0LCBycG9ydCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlycG9ydC0+bnVtYmVyID0gZmNfaG9zdC0+bmV4dF9ycG9ydF9udW1iZXIrKzsKKwlpZiAocnBvcnQtPnJvbGVzICYgRkNfUlBPUlRfUk9MRV9GQ1BfVEFSR0VUKQorCQlycG9ydC0+c2NzaV90YXJnZXRfaWQgPSBmY19ob3N0LT5uZXh0X3RhcmdldF9pZCsrOworCWVsc2UKKwkJcnBvcnQtPnNjc2lfdGFyZ2V0X2lkID0gLTE7CisJbGlzdF9hZGRfdGFpbCgmcnBvcnQtPnBlZXJzLCAmZmNfaG9zdF9ycG9ydHMoc2hvc3QpKTsKKwlnZXRfZGV2aWNlKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJZGV2ID0gJnJwb3J0LT5kZXY7CisJZGV2aWNlX2luaXRpYWxpemUoZGV2KTsKKwlkZXYtPnBhcmVudCA9IGdldF9kZXZpY2UoJnNob3N0LT5zaG9zdF9nZW5kZXYpOworCWRldi0+cmVsZWFzZSA9IGZjX3Jwb3J0X2Rldl9yZWxlYXNlOworCXNwcmludGYoZGV2LT5idXNfaWQsICJycG9ydC0lZDolZC0lZCIsCisJCXNob3N0LT5ob3N0X25vLCBjaGFubmVsLCBycG9ydC0+bnVtYmVyKTsKKwl0cmFuc3BvcnRfc2V0dXBfZGV2aWNlKGRldik7CisKKwllcnJvciA9IGRldmljZV9hZGQoZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGQyBSZW1vdGUgUG9ydCBkZXZpY2VfYWRkIGZhaWxlZFxuIik7CisJCWdvdG8gZGVsZXRlX3Jwb3J0OworCX0KKwl0cmFuc3BvcnRfYWRkX2RldmljZShkZXYpOworCXRyYW5zcG9ydF9jb25maWd1cmVfZGV2aWNlKGRldik7CisKKwlpZiAocnBvcnQtPnJvbGVzICYgRkNfUlBPUlRfUk9MRV9GQ1BfVEFSR0VUKQorCQkvKiBpbml0aWF0ZSBhIHNjYW4gb2YgdGhlIHRhcmdldCAqLworCQlzY3NpX3F1ZXVlX3dvcmsoc2hvc3QsICZycG9ydC0+c2Nhbl93b3JrKTsKKworCXJldHVybiBycG9ydDsKKworZGVsZXRlX3Jwb3J0OgorCXRyYW5zcG9ydF9kZXN0cm95X2RldmljZShkZXYpOworCXB1dF9kZXZpY2UoZGV2LT5wYXJlbnQpOworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmcnBvcnQtPnBlZXJzKTsKKwlwdXRfZGV2aWNlKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlwdXRfZGV2aWNlKGRldi0+cGFyZW50KTsKKwlrZnJlZShycG9ydCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogZmNfcmVtb3RlX3BvcnRfYWRkIC0gbm90aWZpZXMgdGhlIGZjIHRyYW5zcG9ydCBvZiB0aGUgZXhpc3RlbmNlCisgKgkJb2YgYSByZW1vdGUgRkMgcG9ydC4KKyAqIEBzaG9zdDoJc2NzaSBob3N0IHRoZSByZW1vdGUgcG9ydCBpcyBjb25uZWN0ZWQgdG8uCisgKiBAY2hhbm5lbDoJQ2hhbm5lbCBvbiBzaG9zdCBwb3J0IGNvbm5lY3RlZCB0by4KKyAqIEBpZHM6CVRoZSB3b3JsZCB3aWRlIG5hbWVzLCBmYyBhZGRyZXNzLCBhbmQgRkM0IHBvcnQKKyAqCQlyb2xlcyBmb3IgdGhlIHJlbW90ZSBwb3J0LgorICoKKyAqIFRoZSBMTEREIGNhbGxzIHRoaXMgcm91dGluZSB0byBub3RpZnkgdGhlIHRyYW5zcG9ydCBvZiB0aGUgZXhpc3RlbmNlCisgKiBvZiBhIHJlbW90ZSBwb3J0LiBUaGUgTExERCBwcm92aWRlcyB0aGUgdW5pcXVlIGlkZW50aWZpZXJzICh3d3BuLHd3bikKKyAqIG9mIHRoZSBwb3J0LCBpdCdzIEZDIGFkZHJlc3MgKHBvcnRfaWQpLCBhbmQgdGhlIEZDNCByb2xlcyB0aGF0IGFyZQorICogYWN0aXZlIGZvciB0aGUgcG9ydC4KKyAqCisgKiBGb3IgcG9ydHMgdGhhdCBhcmUgRkNQIHRhcmdldHMgKGFrYSBzY3NpIHRhcmdldHMpLCB0aGUgRkMgdHJhbnNwb3J0CisgKiBtYWludGFpbnMgY29uc2lzdGVudCB0YXJnZXQgaWQgYmluZGluZ3Mgb24gYmVoYWxmIG9mIHRoZSBMTERELgorICogQSBjb25zaXN0ZW50IHRhcmdldCBpZCBiaW5kaW5nIGlzIGFuIGFzc2lnbm1lbnQgb2YgYSB0YXJnZXQgaWQgdG8KKyAqIGEgcmVtb3RlIHBvcnQgaWRlbnRpZmllciwgd2hpY2ggcGVyc2lzdHMgd2hpbGUgdGhlIHNjc2kgaG9zdCBpcworICogYXR0YWNoZWQuIFRoZSByZW1vdGUgcG9ydCBjYW4gZGlzYXBwZWFyLCB0aGVuIGxhdGVyIHJlYXBwZWFyLCBhbmQKKyAqIGl0J3MgdGFyZ2V0IGlkIGFzc2lnbm1lbnQgcmVtYWlucyB0aGUgc2FtZS4gVGhpcyBhbGxvd3MgZm9yIHNoaWZ0cworICogaW4gRkMgYWRkcmVzc2luZyAoaWYgYmluZGluZyBieSB3d3BuIG9yIHd3bm4pIHdpdGggbm8gYXBwYXJlbnQKKyAqIGNoYW5nZXMgdG8gdGhlIHNjc2kgc3Vic3lzdGVtIHdoaWNoIGlzIGJhc2VkIG9uIHNjc2kgaG9zdCBudW1iZXIgYW5kCisgKiB0YXJnZXQgaWQgdmFsdWVzLiAgQmluZGluZ3MgYXJlIG9ubHkgdmFsaWQgZHVyaW5nIHRoZSBhdHRhY2htZW50IG9mCisgKiB0aGUgc2NzaSBob3N0LiBJZiB0aGUgaG9zdCBkZXRhY2hlcywgdGhlbiBsYXRlciByZS1hdHRhY2hlcywgdGFyZ2V0CisgKiBpZCBiaW5kaW5ncyBtYXkgY2hhbmdlLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3IgcmV0dXJuaW5nIGEgcmVtb3RlIHBvcnQgc3RydWN0dXJlLgorICogVGhlIHJvdXRpbmUgd2lsbCBzZWFyY2ggdGhlIGxpc3Qgb2YgcmVtb3RlIHBvcnRzIGl0IG1haW50YWlucworICogaW50ZXJuYWxseSBvbiBiZWhhbGYgb2YgY29uc2lzdGVudCB0YXJnZXQgaWQgbWFwcGluZ3MuIElmIGZvdW5kLCB0aGUKKyAqIHJlbW90ZSBwb3J0IHN0cnVjdHVyZSB3aWxsIGJlIHJldXNlZC4gT3RoZXJ3aXNlLCBhIG5ldyByZW1vdGUgcG9ydAorICogc3RydWN0dXJlIHdpbGwgYmUgYWxsb2NhdGVkLgorICoKKyAqIFdoZW5ldmVyIGEgcmVtb3RlIHBvcnQgaXMgYWxsb2NhdGVkLCBhIG5ldyBmY19yZW1vdGVfcG9ydCBjbGFzcworICogZGV2aWNlIGlzIGNyZWF0ZWQuCisgKgorICogU2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KKyAqCisgKiBOb3RlczoKKyAqCVRoaXMgcm91dGluZSBhc3N1bWVzIG5vIGxvY2tzIGFyZSBoZWxkIG9uIGVudHJ5LgorICoqLworc3RydWN0IGZjX3Jwb3J0ICoKK2ZjX3JlbW90ZV9wb3J0X2FkZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgaW50IGNoYW5uZWwsCisJc3RydWN0IGZjX3Jwb3J0X2lkZW50aWZpZXJzICAqaWRzKQoreworCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbWF0Y2ggPSAwOworCisJaWYgKGxpa2VseSgoaWRzLT5yb2xlcyAmIEZDX1JQT1JUX1JPTEVfRkNQX1RBUkdFVCkgJiYKKwkJKGZjX2hvc3RfdGd0aWRfYmluZF90eXBlKHNob3N0KSAhPSBGQ19UR1RJRF9CSU5EX05PTkUpKSkgeworCisJCS8qIHNlYXJjaCBmb3IgYSBtYXRjaGluZyBjb25zaXN0ZW50IGJpbmRpbmcgKi8KKworCQlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShycG9ydCwgJmZjX2hvc3RfcnBvcnRfYmluZGluZ3Moc2hvc3QpLAorCQkJCQlwZWVycykgeworCQkJaWYgKHJwb3J0LT5jaGFubmVsICE9IGNoYW5uZWwpCisJCQkJY29udGludWU7CisKKwkJCXN3aXRjaCAoZmNfaG9zdF90Z3RpZF9iaW5kX3R5cGUoc2hvc3QpKSB7CisJCQljYXNlIEZDX1RHVElEX0JJTkRfQllfV1dQTjoKKwkJCQlpZiAocnBvcnQtPnBvcnRfbmFtZSA9PSBpZHMtPnBvcnRfbmFtZSkKKwkJCQkJbWF0Y2ggPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBGQ19UR1RJRF9CSU5EX0JZX1dXTk46CisJCQkJaWYgKHJwb3J0LT5ub2RlX25hbWUgPT0gaWRzLT5ub2RlX25hbWUpCisJCQkJCW1hdGNoID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRkNfVEdUSURfQklORF9CWV9JRDoKKwkJCQlpZiAocnBvcnQtPnBvcnRfaWQgPT0gaWRzLT5wb3J0X2lkKQorCQkJCQltYXRjaCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIEZDX1RHVElEX0JJTkRfTk9ORTogLyogdG8ga2VlcCBjb21waWxlciBoYXBweSAqLworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAobWF0Y2gpIHsKKwkJCQlsaXN0X21vdmVfdGFpbCgmcnBvcnQtPnBlZXJzLAorCQkJCQkmZmNfaG9zdF9ycG9ydHMoc2hvc3QpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJCWlmIChtYXRjaCkgeworCQkJbWVtY3B5KCZycG9ydC0+bm9kZV9uYW1lLCAmaWRzLT5ub2RlX25hbWUsCisJCQkJc2l6ZW9mKHJwb3J0LT5ub2RlX25hbWUpKTsKKwkJCW1lbWNweSgmcnBvcnQtPnBvcnRfbmFtZSwgJmlkcy0+cG9ydF9uYW1lLAorCQkJCXNpemVvZihycG9ydC0+cG9ydF9uYW1lKSk7CisJCQlycG9ydC0+cG9ydF9pZCA9IGlkcy0+cG9ydF9pZDsKKwkJCXJwb3J0LT5yb2xlcyA9IGlkcy0+cm9sZXM7CisJCQlycG9ydC0+cG9ydF9zdGF0ZSA9IEZDX1BPUlRTVEFURV9PTkxJTkU7CisKKwkJCWlmIChycG9ydC0+cm9sZXMgJiBGQ19SUE9SVF9ST0xFX0ZDUF9UQVJHRVQpCisJCQkJLyogaW5pdGlhdGUgYSBzY2FuIG9mIHRoZSB0YXJnZXQgKi8KKwkJCQlzY3NpX3F1ZXVlX3dvcmsoc2hvc3QsICZycG9ydC0+c2Nhbl93b3JrKTsKKworCQkJcmV0dXJuIHJwb3J0OworCQl9CisJfQorCisJLyogTm8gY29uc2lzdGVudCBiaW5kaW5nIGZvdW5kIC0gY3JlYXRlIG5ldyByZW1vdGUgcG9ydCBlbnRyeSAqLworCXJwb3J0ID0gZmNfcnBvcnRfY3JlYXRlKHNob3N0LCBjaGFubmVsLCBpZHMpOworCisJcmV0dXJuIHJwb3J0OworfQorRVhQT1JUX1NZTUJPTChmY19yZW1vdGVfcG9ydF9hZGQpOworCisvKgorICogZmNfcnBvcnRfdGd0X3JlbW92ZSAtIFJlbW92ZXMgdGhlIHNjc2kgdGFyZ2V0IG9uIHRoZSByZW1vdGUgcG9ydAorICogQHJwb3J0OglUaGUgcmVtb3RlIHBvcnQgdG8gYmUgb3BlcmF0ZWQgb24KKyAqLworc3RhdGljIHZvaWQKK2ZjX3Jwb3J0X3RndF9yZW1vdmUoc3RydWN0IGZjX3Jwb3J0ICpycG9ydCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHJwb3J0X3RvX3Nob3N0KHJwb3J0KTsKKworCXNjc2lfdGFyZ2V0X3VuYmxvY2soJnJwb3J0LT5kZXYpOworCisJLyogU3RvcCBhbnl0aGluZyBvbiB0aGUgd29ya3EgKi8KKwlpZiAoIWNhbmNlbF9kZWxheWVkX3dvcmsoJnJwb3J0LT5kZXZfbG9zc193b3JrKSkKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwlzY3NpX2ZsdXNoX3dvcmsoc2hvc3QpOworCisJc2NzaV9yZW1vdmVfdGFyZ2V0KCZycG9ydC0+ZGV2KTsKK30KKworLyoKKyAqIGZjX3Jwb3J0X3Rlcm1pbmF0ZSAtIHRoaXMgcm91dGluZSB0ZWFycyBkb3duIGFuZCBkZWFsbG9jYXRlcyBhIHJlbW90ZSBwb3J0LgorICogQHJwb3J0OglUaGUgcmVtb3RlIHBvcnQgdG8gYmUgdGVybWluYXRlZAorICoKKyAqIE5vdGVzOgorICoJVGhpcyByb3V0aW5lIGFzc3VtZXMgbm8gbG9ja3MgYXJlIGhlbGQgb24gZW50cnkuCisgKi8KK3N0YXRpYyB2b2lkCitmY19ycG9ydF90ZXJtaW5hdGUoc3RydWN0IGZjX3Jwb3J0ICAqcnBvcnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBycG9ydF90b19zaG9zdChycG9ydCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnJwb3J0LT5kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZjX3Jwb3J0X3RndF9yZW1vdmUocnBvcnQpOworCisJdHJhbnNwb3J0X3JlbW92ZV9kZXZpY2UoZGV2KTsKKwlkZXZpY2VfZGVsKGRldik7CisJdHJhbnNwb3J0X2Rlc3Ryb3lfZGV2aWNlKGRldik7CisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCZycG9ydC0+cGVlcnMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXB1dF9kZXZpY2UoJnNob3N0LT5zaG9zdF9nZW5kZXYpOworfQorCisvKioKKyAqIGZjX3JlbW90ZV9wb3J0X2RlbGV0ZSAtIG5vdGlmaWVzIHRoZSBmYyB0cmFuc3BvcnQgdGhhdCBhIHJlbW90ZQorICoJCXBvcnQgaXMgbm8gbG9uZ2VyIGluIGV4aXN0ZW5jZS4KKyAqIEBycG9ydDoJVGhlIHJlbW90ZSBwb3J0IHRoYXQgbm8gbG9uZ2VyIGV4aXN0cworICoKKyAqIFRoZSBMTEREIGNhbGxzIHRoaXMgcm91dGluZSB0byBub3RpZnkgdGhlIHRyYW5zcG9ydCB0aGF0IGEgcmVtb3RlCisgKiBwb3J0IGlzIG5vIGxvbmdlciBwYXJ0IG9mIHRoZSB0b3BvbG9neS4gTm90ZTogQWx0aG91Z2ggYSBwb3J0CisgKiBtYXkgbm8gbG9uZ2VyIGJlIHBhcnQgb2YgdGhlIHRvcG9sb2d5LCBpdCBtYXkgcGVyc2lzdCBpbiB0aGUgcmVtb3RlCisgKiBwb3J0cyBkaXNwbGF5ZWQgYnkgdGhlIGZjX2hvc3QuIFRoaXMgaXMgZG9uZSBzbyB0aGF0IHRhcmdldCBpZAorICogbWFwcGluZ3MgKG1hbmFnZWQgdmlhIHRoZSByZW1vdGUgcG9ydCBzdHJ1Y3R1cmVzKSwgYXJlIGFsd2F5cyB2aXNpYmxlCisgKiBhcyBsb25nIGFzIHRoZSBtYXBwaW5nIGlzIHZhbGlkLCByZWdhcmRsZXNzIG9mIHBvcnQgc3RhdGUsCisgKgorICogSWYgdGhlIHJlbW90ZSBwb3J0IGlzIG5vdCBhbiBGQ1AgVGFyZ2V0LCBpdCB3aWxsIGJlIGZ1bGx5IHRvcm4gZG93bgorICogYW5kIGRlYWxsb2NhdGVkLCBpbmNsdWRpbmcgdGhlIGZjX3JlbW90ZV9wb3J0IGNsYXNzIGRldmljZS4KKyAqCisgKiBJZiB0aGUgcmVtb3RlIHBvcnQgaXMgYW4gRkNQIFRhcmdldCwgdGhlIHBvcnQgc3RydWN0dXJlIHdpbGwgYmUKKyAqIG1hcmtlZCBhcyBOb3QgUHJlc2VudCwgYnV0IHdpbGwgcmVtYWluIGFzIGxvbmcgYXMgdGhlcmUgaXMgYSB2YWxpZAorICogU0NTSSB0YXJnZXQgaWQgbWFwcGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIHBvcnQgc3RydWN0dXJlLiBWYWxpZGl0eQorICogaXMgZGV0ZXJtaW5lZCBieSB0aGUgYmluZGluZyB0eXBlLiBJZiBiaW5kaW5nIGJ5IHd3cG4sIHRoZW4gdGhlIHBvcnQKKyAqIHN0cnVjdHVyZSBpcyBhbHdheXMgdmFsaWQgYW5kIHdpbGwgbm90IGJlIGRlYWxsb2NhdGVkIHVudGlsIHRoZSBob3N0CisgKiBpcyByZW1vdmVkLiAgSWYgYmluZGluZyBieSB3d25uLCB0aGVuIHRoZSBwb3J0IHN0cnVjdHVyZSBpcyB2YWxpZAorICogdW50aWwgYW5vdGhlciBwb3J0IHdpdGggdGhlIHNhbWUgbm9kZSBuYW1lIGlzIGZvdW5kIGluIHRoZSB0b3BvbG9neS4KKyAqIElmIGJpbmRpbmcgYnkgcG9ydCBpZCAoZmMgYWRkcmVzcyksIHRoZW4gdGhlIHBvcnQgc3RydWN0dXJlIGlzIHZhbGlkCisgKiB2YWxpZCB1bnRpbCBhbm90aGVyIHBvcnQgd2l0aCB0aGUgc2FtZSBhZGRyZXNzIGlzIGlkZW50aWZpZWQuCisgKgorICogQ2FsbGVkIGZyb20gaW50ZXJydXB0IG9yIG5vcm1hbCBwcm9jZXNzIGNvbnRleHQuCisgKgorICogTm90ZXM6CisgKglUaGlzIHJvdXRpbmUgYXNzdW1lcyBubyBsb2NrcyBhcmUgaGVsZCBvbiBlbnRyeS4KKyAqKi8KK3ZvaWQKK2ZjX3JlbW90ZV9wb3J0X2RlbGV0ZShzdHJ1Y3QgZmNfcnBvcnQgICpycG9ydCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHJwb3J0X3RvX3Nob3N0KHJwb3J0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogSWYgbm8gc2NzaSB0YXJnZXQgaWQgbWFwcGluZyBvciBjb25zaXN0ZW50IGJpbmRpbmcgdHlwZSwgZGVsZXRlIGl0ICovCisJaWYgKChycG9ydC0+c2NzaV90YXJnZXRfaWQgPT0gLTEpIHx8CisJICAgIChmY19ob3N0X3RndGlkX2JpbmRfdHlwZShzaG9zdCkgPT0gRkNfVEdUSURfQklORF9OT05FKSkgeworCQlmY19ycG9ydF90ZXJtaW5hdGUocnBvcnQpOworCQlyZXR1cm47CisJfQorCisJZmNfcnBvcnRfdGd0X3JlbW92ZShycG9ydCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJbGlzdF9tb3ZlX3RhaWwoJnJwb3J0LT5wZWVycywgJmZjX2hvc3RfcnBvcnRfYmluZGluZ3Moc2hvc3QpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogTm90ZTogV2UgZG8gbm90IHJlbW92ZSBvciBjbGVhciB0aGUgaG9zdGRhdGEgYXJlYS4gVGhpcyBhbGxvd3MKKwkgKiAgIGhvc3Qtc3BlY2lmaWMgdGFyZ2V0IGRhdGEgdG8gcGVyc2lzdCBhbG9uZyB3aXRoIHRoZQorCSAqICAgc2NzaV90YXJnZXRfaWQuIEl0J3MgdXAgdG8gdGhlIGhvc3QgdG8gbWFuYWdlIGl0J3MgaG9zdGRhdGEgYXJlYS4KKwkgKi8KKworCS8qCisJICogUmVpbml0aWFsaXplIHBvcnQgYXR0cmlidXRlcyB0aGF0IG1heSBjaGFuZ2UgaWYgdGhlIHBvcnQgY29tZXMgYmFjay4KKwkgKi8KKwlycG9ydC0+bWF4ZnJhbWVfc2l6ZSA9IC0xOworCXJwb3J0LT5zdXBwb3J0ZWRfY2xhc3NlcyA9IEZDX0NPU19VTlNQRUNJRklFRDsKKwlycG9ydC0+cm9sZXMgPSBGQ19SUE9SVF9ST0xFX1VOS05PV047CisJcnBvcnQtPnBvcnRfc3RhdGUgPSBGQ19QT1JUU1RBVEVfTk9UUFJFU0VOVDsKKworCS8qIHJlbW92ZSB0aGUgaWRlbnRpZmllcnMgdGhhdCBhcmVuJ3QgdXNlZCBpbiB0aGUgY29uc2lzdGluZyBiaW5kaW5nICovCisJc3dpdGNoIChmY19ob3N0X3RndGlkX2JpbmRfdHlwZShzaG9zdCkpIHsKKwljYXNlIEZDX1RHVElEX0JJTkRfQllfV1dQTjoKKwkJcnBvcnQtPm5vZGVfbmFtZSA9IC0xOworCQlycG9ydC0+cG9ydF9pZCA9IC0xOworCQlicmVhazsKKwljYXNlIEZDX1RHVElEX0JJTkRfQllfV1dOTjoKKwkJcnBvcnQtPnBvcnRfbmFtZSA9IC0xOworCQlycG9ydC0+cG9ydF9pZCA9IC0xOworCQlicmVhazsKKwljYXNlIEZDX1RHVElEX0JJTkRfQllfSUQ6CisJCXJwb3J0LT5ub2RlX25hbWUgPSAtMTsKKwkJcnBvcnQtPnBvcnRfbmFtZSA9IC0xOworCQlicmVhazsKKwljYXNlIEZDX1RHVElEX0JJTkRfTk9ORToJLyogdG8ga2VlcCBjb21waWxlciBoYXBweSAqLworCQlicmVhazsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGZjX3JlbW90ZV9wb3J0X2RlbGV0ZSk7CisKKy8qKgorICogZmNfcmVtb3RlX3BvcnRfcm9sZWNoZyAtIG5vdGlmaWVzIHRoZSBmYyB0cmFuc3BvcnQgdGhhdCB0aGUgcm9sZXMKKyAqCQlvbiBhIHJlbW90ZSBtYXkgaGF2ZSBjaGFuZ2VkLgorICogQHJwb3J0OglUaGUgcmVtb3RlIHBvcnQgdGhhdCBjaGFuZ2VkLgorICoKKyAqIFRoZSBMTEREIGNhbGxzIHRoaXMgcm91dGluZSB0byBub3RpZnkgdGhlIHRyYW5zcG9ydCB0aGF0IHRoZSByb2xlcworICogb24gYSByZW1vdGUgcG9ydCBtYXkgaGF2ZSBjaGFuZ2VkLiBUaGUgbGFyZ2VzdCBlZmZlY3Qgb2YgdGhpcyBpcworICogaWYgYSBwb3J0IG5vdyBiZWNvbWVzIGEgRkNQIFRhcmdldCwgaXQgbXVzdCBiZSBhbGxvY2F0ZWQgYQorICogc2NzaSB0YXJnZXQgaWQuICBJZiB0aGUgcG9ydCBpcyBubyBsb25nZXIgYSBGQ1AgdGFyZ2V0LCBhbnkKKyAqIHNjc2kgdGFyZ2V0IGlkIHZhbHVlIGFzc2lnbmVkIHRvIGl0IHdpbGwgcGVyc2lzdCBpbiBjYXNlIHRoZQorICogcm9sZSBjaGFuZ2VzIGJhY2sgdG8gaW5jbHVkZSBGQ1AgVGFyZ2V0LiBObyBjaGFuZ2VzIGluIHRoZSBzY3NpCisgKiBtaWRsYXllciB3aWxsIGJlIGludm9rZWQgaWYgdGhlIHJvbGUgY2hhbmdlcyAoaW4gdGhlIGV4cGVjdGF0aW9uCisgKiB0aGF0IHRoZSByb2xlIHdpbGwgYmUgcmVzdW1lZC4gSWYgaXQgZG9lc24ndCBub3JtYWwgZXJyb3IgcHJvY2Vzc2luZworICogd2lsbCB0YWtlIHBsYWNlKS4KKyAqCisgKiBTaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LgorICoKKyAqIE5vdGVzOgorICoJVGhpcyByb3V0aW5lIGFzc3VtZXMgbm8gbG9ja3MgYXJlIGhlbGQgb24gZW50cnkuCisgKiovCit2b2lkCitmY19yZW1vdGVfcG9ydF9yb2xlY2hnKHN0cnVjdCBmY19ycG9ydCAgKnJwb3J0LCB1MzIgcm9sZXMpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBycG9ydF90b19zaG9zdChycG9ydCk7CisJc3RydWN0IGZjX2hvc3RfYXR0cnMgKmZjX2hvc3QgPQorCQkJKHN0cnVjdCBmY19ob3N0X2F0dHJzICopc2hvc3QtPnNob3N0X2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY3JlYXRlID0gMDsKKworCXJwb3J0LT5yb2xlcyA9IHJvbGVzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWlmICgocnBvcnQtPnNjc2lfdGFyZ2V0X2lkID09IC0xKSAmJgorCSAgICAocnBvcnQtPnJvbGVzICYgRkNfUlBPUlRfUk9MRV9GQ1BfVEFSR0VUKSkgeworCQlycG9ydC0+c2NzaV90YXJnZXRfaWQgPSBmY19ob3N0LT5uZXh0X3RhcmdldF9pZCsrOworCQljcmVhdGUgPSAxOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCWlmIChjcmVhdGUpCisJCS8qIGluaXRpYXRlIGEgc2NhbiBvZiB0aGUgdGFyZ2V0ICovCisJCXNjc2lfcXVldWVfd29yayhzaG9zdCwgJnJwb3J0LT5zY2FuX3dvcmspOworfQorRVhQT1JUX1NZTUJPTChmY19yZW1vdGVfcG9ydF9yb2xlY2hnKTsKKworLyoqCisgKiBmY190aW1lb3V0X2Jsb2NrZWRfcnBvcnQgLSBUaW1lb3V0IGhhbmRsZXIgZm9yIGJsb2NrZWQgcmVtb3RlIHBvcnQKKyAqICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGZhaWxzIHRvIHJldHVybiBpbiB0aGUgYWxsb3RlZCB0aW1lLgorICogQGRhdGE6CXNjc2kgdGFyZ2V0IHRoYXQgZmFpbGVkIHRvIHJlYXBwZWFyIGluIHRoZSBhbGxvdGVkIHRpbWUuCisgKiovCitzdGF0aWMgdm9pZAorZmNfdGltZW91dF9ibG9ja2VkX3Jwb3J0KHZvaWQgICpkYXRhKQoreworCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSAoc3RydWN0IGZjX3Jwb3J0ICopZGF0YTsKKworCXJwb3J0LT5wb3J0X3N0YXRlID0gRkNfUE9SVFNUQVRFX09GRkxJTkU7CisKKwlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcnBvcnQtPmRldiwKKwkJImJsb2NrZWQgRkMgcmVtb3RlIHBvcnQgdGltZSBvdXQ6IHJlbW92aW5nIHRhcmdldFxuIik7CisKKwkvKgorCSAqIEFzIHRoaXMgb25seSBvY2N1cnMgaWYgdGhlIHJlbW90ZSBwb3J0IChzY3NpIHRhcmdldCkKKwkgKiB3ZW50IGF3YXkgYW5kIGRpZG4ndCBjb21lIGJhY2sgLSB3ZSdsbCByZW1vdmUKKwkgKiBhbGwgYXR0YWNoZWQgc2NzaSBkZXZpY2VzLgorCSAqLworCXNjc2lfdGFyZ2V0X3VuYmxvY2soJnJwb3J0LT5kZXYpOworCXNjc2lfcmVtb3ZlX3RhcmdldCgmcnBvcnQtPmRldik7Cit9CisKKy8qKgorICogZmNfcmVtb3RlX3BvcnRfYmxvY2sgLSB0ZW1wb3JhcmlseSBibG9jayBhbnkgc2NzaSB0cmFmZmljIHRvIGEgcmVtb3RlIHBvcnQuCisgKiBAcnBvcnQ6CXJlbW90ZSBwb3J0IHRvIGJlIGJsb2NrZWQuCisgKgorICogc2NzaSBsbGRkJ3Mgd2l0aCBhIEZDIHRyYW5zcG9ydCBjYWxsIHRoaXMgcm91dGluZSB0byB0ZW1wb3JhcmlseSBzdG9wCisgKiBhbGwgc2NzaSB0cmFmZmljIHRvIGEgcmVtb3RlIHBvcnQuIElmIHRoZSBwb3J0IGlzIG5vdCBhIFNDU0kgdGFyZ2V0LAorICogbm8gYWN0aW9uIGlzIHRha2VuLiBJZiB0aGUgcG9ydCBpcyBhIFNDU0kgdGFyZ2V0LCBhbGwgYXR0YWNoZWQgZGV2aWNlcworICogYXJlIHBsYWNlZCBpbnRvIGEgU0RFVl9CTE9DSyBzdGF0ZSBhbmQgYSB0aW1lciBpcyBzdGFydGVkLiBUaGUgdGltZXIgaXMKKyAqIHJlcHJlc2VudHMgdGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdGhlIHBvcnQgbWF5IGJlIGJsb2NrZWQuIElmIHRoZQorICogdGltZXIgZXhwaXJlcywgdGhlIHBvcnQgaXMgY29uc2lkZXJlZCBub24tZXhpc3RlbnQgYW5kIHRoZSBhdHRhY2hlZAorICogc2NzaSBkZXZpY2VzIHdpbGwgYmUgcmVtb3ZlZC4KKyAqCisgKiBDYWxsZWQgZnJvbSBpbnRlcnJ1cHQgb3Igbm9ybWFsIHByb2Nlc3MgY29udGV4dC4KKyAqCisgKiBSZXR1cm5zIHplcm8gaWYgc3VjY2Vzc2Z1bCBvciBlcnJvciBpZiBub3QKKyAqCisgKiBOb3RlczoKKyAqICAgICAgVGhpcyByb3V0aW5lIGFzc3VtZXMgbm8gbG9ja3MgYXJlIGhlbGQgb24gZW50cnkuCisgKgorICoJVGhlIHRpbWVvdXQgYW5kIHRpbWVyIHR5cGVzIGFyZSBleHRyYWN0ZWQgZnJvbSB0aGUgZmMgdHJhbnNwb3J0IAorICoJYXR0cmlidXRlcyBmcm9tIHRoZSBjYWxsZXIncyBycG9ydCBwb2ludGVyLgorICoqLworaW50CitmY19yZW1vdGVfcG9ydF9ibG9jayhzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0KQoreworCWludCB0aW1lb3V0ID0gcnBvcnQtPmRldl9sb3NzX3RtbzsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmsgPSAmcnBvcnQtPmRldl9sb3NzX3dvcms7CisKKwlpZiAodGltZW91dCA8IDAgfHwgdGltZW91dCA+IFNDU0lfREVWSUNFX0JMT0NLX01BWF9USU1FT1VUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNjc2lfdGFyZ2V0X2Jsb2NrKCZycG9ydC0+ZGV2KTsKKworCS8qIGNhcCB0aGUgbGVuZ3RoIHRoZSBkZXZpY2VzIGNhbiBiZSBibG9ja2VkICovCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKHdvcmssIHRpbWVvdXQgKiBIWik7CisKKwlycG9ydC0+cG9ydF9zdGF0ZSA9IEZDX1BPUlRTVEFURV9CTE9DS0VEOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChmY19yZW1vdGVfcG9ydF9ibG9jayk7CisKKy8qKgorICogZmNfcmVtb3RlX3BvcnRfdW5ibG9jayAtIHJlc3RhcnQgYW55IGJsb2NrZWQgc2NzaSB0cmFmZmljIHRvIGEgcmVtb3RlIHBvcnQuCisgKiBAcnBvcnQ6CXJlbW90ZSBwb3J0IHRvIGJlIHVuYmxvY2tlZC4KKyAqCisgKiBzY3NpIGxsZCdzIHdpdGggYSBGQyB0cmFuc3BvcnQgY2FsbCB0aGlzIHJvdXRpbmUgdG8gcmVzdGFydCBJTyB0byBhbGwKKyAqIGRldmljZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsZXIncyBzY3NpIHRhcmdldCBmb2xsb3dpbmcgYSBmY190YXJnZXRfYmxvY2sKKyAqIHJlcXVlc3QuICBDYWxsZWQgZnJvbSBpbnRlcnJ1cHQgb3Igbm9ybWFsIHByb2Nlc3MgY29udGV4dC4KKyAqCisgKiBOb3RlczoKKyAqCVRoaXMgcm91dGluZSBhc3N1bWVzIG5vIGxvY2tzIGFyZSBoZWxkIG9uIGVudHJ5LgorICoqLworIHZvaWQKK2ZjX3JlbW90ZV9wb3J0X3VuYmxvY2soc3RydWN0IGZjX3Jwb3J0ICpycG9ydCkKK3sKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmsgPSAmcnBvcnQtPmRldl9sb3NzX3dvcms7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBycG9ydF90b19zaG9zdChycG9ydCk7CisKKwkvKgorCSAqIFN0b3AgdGhlIHRhcmdldCB0aW1lciBmaXJzdC4gVGFrZSBubyBhY3Rpb24gb24gdGhlIGRlbF90aW1lcgorCSAqIGZhaWx1cmUgYXMgdGhlIHN0YXRlIG1hY2hpbmUgc3RhdGUgY2hhbmdlIHdpbGwgdmFsaWRhdGUgdGhlCisJICogdHJhbnNhY3Rpb24uCisJICovCisJaWYgKCFjYW5jZWxfZGVsYXllZF93b3JrKHdvcmspKQorCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJaWYgKHJwb3J0LT5wb3J0X3N0YXRlID09IEZDX1BPUlRTVEFURV9PRkZMSU5FKQorCQkvKgorCQkgKiBpbml0aWF0ZSBhIHNjYW4gb2YgdGhlIHRhcmdldCBhcyB0aGUgdGFyZ2V0IGhhcworCQkgKiBiZWVuIHRvcm4gZG93bi4KKwkJICovCisJCXNjc2lfcXVldWVfd29yayhzaG9zdCwgJnJwb3J0LT5zY2FuX3dvcmspOworCWVsc2UKKwkJc2NzaV90YXJnZXRfdW5ibG9jaygmcnBvcnQtPmRldik7CisKKwlycG9ydC0+cG9ydF9zdGF0ZSA9IEZDX1BPUlRTVEFURV9PTkxJTkU7Cit9CitFWFBPUlRfU1lNQk9MKGZjX3JlbW90ZV9wb3J0X3VuYmxvY2spOworCisvKioKKyAqIGZjX3Njc2lfc2Nhbl9ycG9ydCAtIGNhbGxlZCB0byBwZXJmb3JtIGEgc2NzaSBzY2FuIG9uIGEgcmVtb3RlIHBvcnQuCisgKiBAZGF0YToJcmVtb3RlIHBvcnQgdG8gYmUgc2Nhbm5lZC4KKyAqKi8KK3N0YXRpYyB2b2lkCitmY19zY3NpX3NjYW5fcnBvcnQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gKHN0cnVjdCBmY19ycG9ydCAqKWRhdGE7CisKKwlzY3NpX3NjYW5fdGFyZ2V0KCZycG9ydC0+ZGV2LCBycG9ydC0+Y2hhbm5lbCwgcnBvcnQtPnNjc2lfdGFyZ2V0X2lkLAorCQkJU0NBTl9XSUxEX0NBUkQsIDEpOworfQorCisKK01PRFVMRV9BVVRIT1IoIk1hcnRpbiBIaWNrcyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJGQyBUcmFuc3BvcnQgQXR0cmlidXRlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChmY190cmFuc3BvcnRfaW5pdCk7Cittb2R1bGVfZXhpdChmY190cmFuc3BvcnRfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYjgyMjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYwpAQCAtMCwwICsxLDM4OCBAQAorLyogCisgKiBpU0NTSSB0cmFuc3BvcnQgY2xhc3MgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAorICogQ29weXJpZ2h0IChDKSBNaWtlIENocmlzdGllLCAyMDA0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmg+CisKKyNkZWZpbmUgSVNDU0lfU0VTU0lPTl9BVFRSUyAyMAorI2RlZmluZSBJU0NTSV9IT1NUX0FUVFJTIDIKKworc3RydWN0IGlzY3NpX2ludGVybmFsIHsKKwlzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgdDsKKwlzdHJ1Y3QgaXNjc2lfZnVuY3Rpb25fdGVtcGxhdGUgKmZudDsKKwkvKgorCSAqIFdlIGRvIG5vdCBoYXZlIGFueSBwcml2YXRlIG9yIG90aGVyIGF0dHJzLgorCSAqLworCXN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICpzZXNzaW9uX2F0dHJzW0lTQ1NJX1NFU1NJT05fQVRUUlMgKyAxXTsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqaG9zdF9hdHRyc1tJU0NTSV9IT1NUX0FUVFJTICsgMV07Cit9OworCisjZGVmaW5lIHRvX2lzY3NpX2ludGVybmFsKHRtcGwpIGNvbnRhaW5lcl9vZih0bXBsLCBzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwsIHQpCisKK3N0YXRpYyBERUNMQVJFX1RSQU5TUE9SVF9DTEFTUyhpc2NzaV90cmFuc3BvcnRfY2xhc3MsCisJCQkgICAgICAgImlzY3NpX3RyYW5zcG9ydCIsCisJCQkgICAgICAgTlVMTCwKKwkJCSAgICAgICBOVUxMLAorCQkJICAgICAgIE5VTEwpOworCitzdGF0aWMgREVDTEFSRV9UUkFOU1BPUlRfQ0xBU1MoaXNjc2lfaG9zdF9jbGFzcywKKwkJCSAgICAgICAiaXNjc2lfaG9zdCIsCisJCQkgICAgICAgTlVMTCwKKwkJCSAgICAgICBOVUxMLAorCQkJICAgICAgIE5VTEwpOworLyoKKyAqIGlTQ1NJIHRhcmdldCBhbmQgc2Vzc2lvbiBhdHRycworICovCisjZGVmaW5lIGlzY3NpX3Nlc3Npb25fc2hvd19mbihmaWVsZCwgZm9ybWF0KQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorc2hvd19zZXNzaW9uXyMjZmllbGQoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc3RhcmdldChjZGV2KTsJXAorCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOwlcCisJc3RydWN0IGlzY3NpX2ludGVybmFsICppID0gdG9faXNjc2lfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOyBcCisJCQkJCQkJCQlcCisJaWYgKGktPmZudC0+Z2V0XyMjZmllbGQpCQkJCQlcCisJCWktPmZudC0+Z2V0XyMjZmllbGQoc3RhcmdldCk7CQkJCVwKKwlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgZm9ybWF0IlxuIiwgaXNjc2lfIyNmaWVsZChzdGFyZ2V0KSk7CVwKK30KKworI2RlZmluZSBpc2NzaV9zZXNzaW9uX3JkX2F0dHIoZmllbGQsIGZvcm1hdCkJCQkJXAorCWlzY3NpX3Nlc3Npb25fc2hvd19mbihmaWVsZCwgZm9ybWF0KQkJCQlcCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoZmllbGQsIFNfSVJVR08sIHNob3dfc2Vzc2lvbl8jI2ZpZWxkLCBOVUxMKTsKKworaXNjc2lfc2Vzc2lvbl9yZF9hdHRyKHRwZ3QsICIlaHUiKTsKK2lzY3NpX3Nlc3Npb25fcmRfYXR0cih0c2loLCAiJTJ4Iik7Citpc2NzaV9zZXNzaW9uX3JkX2F0dHIobWF4X3JlY3ZfZGF0YV9zZWdtZW50X2xlbiwgIiV1Iik7Citpc2NzaV9zZXNzaW9uX3JkX2F0dHIobWF4X2J1cnN0X2xlbiwgIiV1Iik7Citpc2NzaV9zZXNzaW9uX3JkX2F0dHIoZmlyc3RfYnVyc3RfbGVuLCAiJXUiKTsKK2lzY3NpX3Nlc3Npb25fcmRfYXR0cihkZWZfdGltZTJ3YWl0LCAiJWh1Iik7Citpc2NzaV9zZXNzaW9uX3JkX2F0dHIoZGVmX3RpbWUycmV0YWluLCAiJWh1Iik7Citpc2NzaV9zZXNzaW9uX3JkX2F0dHIobWF4X291dHN0YW5kaW5nX3IydCwgIiVodSIpOworaXNjc2lfc2Vzc2lvbl9yZF9hdHRyKGVybCwgIiVkIik7CisKKworI2RlZmluZSBpc2NzaV9zZXNzaW9uX3Nob3dfYm9vbF9mbihmaWVsZCkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3Nob3dfc2Vzc2lvbl9ib29sXyMjZmllbGQoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc3RhcmdldChjZGV2KTsJXAorCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOwlcCisJc3RydWN0IGlzY3NpX2ludGVybmFsICppID0gdG9faXNjc2lfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOyBcCisJCQkJCQkJCQlcCisJaWYgKGktPmZudC0+Z2V0XyMjZmllbGQpCQkJCQlcCisJCWktPmZudC0+Z2V0XyMjZmllbGQoc3RhcmdldCk7CQkJCVwKKwkJCQkJCQkJCVwKKwlpZiAoaXNjc2lfIyNmaWVsZChzdGFyZ2V0KSkJCQkJCVwKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiWWVzXG4iKTsJCQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIk5vXG4iKTsJCQkJCVwKK30KKworI2RlZmluZSBpc2NzaV9zZXNzaW9uX3JkX2Jvb2xfYXR0cihmaWVsZCkJCQkJXAorCWlzY3NpX3Nlc3Npb25fc2hvd19ib29sX2ZuKGZpZWxkKQkJCQlcCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoZmllbGQsIFNfSVJVR08sIHNob3dfc2Vzc2lvbl9ib29sXyMjZmllbGQsIE5VTEwpOworCitpc2NzaV9zZXNzaW9uX3JkX2Jvb2xfYXR0cihpbml0aWFsX3IydCk7Citpc2NzaV9zZXNzaW9uX3JkX2Jvb2xfYXR0cihpbW1lZGlhdGVfZGF0YSk7Citpc2NzaV9zZXNzaW9uX3JkX2Jvb2xfYXR0cihkYXRhX3BkdV9pbl9vcmRlcik7Citpc2NzaV9zZXNzaW9uX3JkX2Jvb2xfYXR0cihkYXRhX3NlcXVlbmNlX2luX29yZGVyKTsKKworI2RlZmluZSBpc2NzaV9zZXNzaW9uX3Nob3dfZGlnZXN0X2ZuKGZpZWxkKQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorc2hvd18jI2ZpZWxkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRyYW5zcG9ydF9jbGFzc190b19zdGFyZ2V0KGNkZXYpOwlcCisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CVwKKwlzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKmkgPSB0b19pc2NzaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7IFwKKwkJCQkJCQkJCVwKKwlpZiAoaS0+Zm50LT5nZXRfIyNmaWVsZCkJCQkJCVwKKwkJaS0+Zm50LT5nZXRfIyNmaWVsZChzdGFyZ2V0KTsJCQkJXAorCQkJCQkJCQkJXAorCWlmIChpc2NzaV8jI2ZpZWxkKHN0YXJnZXQpKQkJCQkJXAorCQlyZXR1cm4gc3ByaW50ZihidWYsICJDUkMzMkNcbiIpOwkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICJOb25lXG4iKTsJCQkJCVwKK30KKworI2RlZmluZSBpc2NzaV9zZXNzaW9uX3JkX2RpZ2VzdF9hdHRyKGZpZWxkKQkJCQlcCisJaXNjc2lfc2Vzc2lvbl9zaG93X2RpZ2VzdF9mbihmaWVsZCkJCQkJXAorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGZpZWxkLCBTX0lSVUdPLCBzaG93XyMjZmllbGQsIE5VTEwpOworCitpc2NzaV9zZXNzaW9uX3JkX2RpZ2VzdF9hdHRyKGhlYWRlcl9kaWdlc3QpOworaXNjc2lfc2Vzc2lvbl9yZF9kaWdlc3RfYXR0cihkYXRhX2RpZ2VzdCk7CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3BvcnQoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRyYW5zcG9ydF9jbGFzc190b19zdGFyZ2V0KGNkZXYpOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBpc2NzaV9pbnRlcm5hbCAqaSA9IHRvX2lzY3NpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKKworCWlmIChpLT5mbnQtPmdldF9wb3J0KQorCQlpLT5mbnQtPmdldF9wb3J0KHN0YXJnZXQpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICIlaHVcbiIsIG50b2hzKGlzY3NpX3BvcnQoc3RhcmdldCkpKTsKK30KK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihwb3J0LCBTX0lSVUdPLCBzaG93X3BvcnQsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdAorc2hvd19pcF9hZGRyZXNzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc3RhcmdldChjZGV2KTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKmkgPSB0b19pc2NzaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CisKKwlpZiAoaS0+Zm50LT5nZXRfaXBfYWRkcmVzcykKKwkJaS0+Zm50LT5nZXRfaXBfYWRkcmVzcyhzdGFyZ2V0KTsKKworCWlmIChpc2NzaV9hZGRyX3R5cGUoc3RhcmdldCkgPT0gQUZfSU5FVCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXUuJXUuJXUuJXVcbiIsCisJCQkgICAgICAgTklQUVVBRChpc2NzaV9zaW5fYWRkcihzdGFyZ2V0KSkpOworCWVsc2UgaWYoaXNjc2lfYWRkcl90eXBlKHN0YXJnZXQpID09IEFGX0lORVQ2KQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHhcbiIsCisJCQkgICAgICAgTklQNihpc2NzaV9zaW42X2FkZHIoc3RhcmdldCkpKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihpcF9hZGRyZXNzLCBTX0lSVUdPLCBzaG93X2lwX2FkZHJlc3MsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdAorc2hvd19pc2lkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc3RhcmdldChjZGV2KTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKmkgPSB0b19pc2NzaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CisKKwlpZiAoaS0+Zm50LT5nZXRfaXNpZCkKKwkJaS0+Zm50LT5nZXRfaXNpZChzdGFyZ2V0KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJICAgICAgIGlzY3NpX2lzaWQoc3RhcmdldClbMF0sIGlzY3NpX2lzaWQoc3RhcmdldClbMV0sCisJCSAgICAgICBpc2NzaV9pc2lkKHN0YXJnZXQpWzJdLCBpc2NzaV9pc2lkKHN0YXJnZXQpWzNdLAorCQkgICAgICAgaXNjc2lfaXNpZChzdGFyZ2V0KVs0XSwgaXNjc2lfaXNpZChzdGFyZ2V0KVs1XSk7Cit9CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoaXNpZCwgU19JUlVHTywgc2hvd19pc2lkLCBOVUxMKTsKKworLyoKKyAqIFRoaXMgaXMgdXNlZCBmb3IgaVNDU0kgbmFtZXMuIE5vcm1hbGx5LCB3ZSBmb2xsb3cKKyAqIHRoZSB0cmFuc3BvcnQgY2xhc3MgY29udmVudGlvbiBvZiBoYXZpbmcgdGhlIGxsZAorICogc2V0IHRoZSBmaWVsZCwgYnV0IGluIHRoZXNlIGNhc2VzIHRoZSB2YWx1ZSBpcworICogdG9vIGxhcmdlLgorICovCisjZGVmaW5lIGlzY3NpX3Nlc3Npb25fc2hvd19zdHJfZm4oZmllbGQpCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzaG93X3Nlc3Npb25fc3RyXyMjZmllbGQoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzc2l6ZV90IHJldCA9IDA7CQkJCQkJXAorCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRyYW5zcG9ydF9jbGFzc190b19zdGFyZ2V0KGNkZXYpOwlcCisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CVwKKwlzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKmkgPSB0b19pc2NzaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7IFwKKwkJCQkJCQkJCVwKKwlpZiAoaS0+Zm50LT5nZXRfIyNmaWVsZCkJCQkJCVwKKwkJcmV0ID0gaS0+Zm50LT5nZXRfIyNmaWVsZChzdGFyZ2V0LCBidWYsIFBBR0VfU0laRSk7CVwKKwlyZXR1cm4gcmV0OwkJCQkJCQlcCit9CisKKyNkZWZpbmUgaXNjc2lfc2Vzc2lvbl9yZF9zdHJfYXR0cihmaWVsZCkJCQkJXAorCWlzY3NpX3Nlc3Npb25fc2hvd19zdHJfZm4oZmllbGQpCQkJCVwKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihmaWVsZCwgU19JUlVHTywgc2hvd19zZXNzaW9uX3N0cl8jI2ZpZWxkLCBOVUxMKTsKKworaXNjc2lfc2Vzc2lvbl9yZF9zdHJfYXR0cih0YXJnZXRfbmFtZSk7Citpc2NzaV9zZXNzaW9uX3JkX3N0cl9hdHRyKHRhcmdldF9hbGlhcyk7CisKKy8qCisgKiBpU0NTSSBob3N0IGF0dHJzCisgKi8KKworLyoKKyAqIEFnYWluLCB0aGlzIGlzIHVzZWQgZm9yIGlTQ1NJIG5hbWVzLiBOb3JtYWxseSwgd2UgZm9sbG93CisgKiB0aGUgdHJhbnNwb3J0IGNsYXNzIGNvbnZlbnRpb24gb2YgaGF2aW5nIHRoZSBsbGQgc2V0CisgKiB0aGUgZmllbGQsIGJ1dCBpbiB0aGVzZSBjYXNlcyB0aGUgdmFsdWUgaXMgdG9vIGxhcmdlLgorICovCisjZGVmaW5lIGlzY3NpX2hvc3Rfc2hvd19zdHJfZm4oZmllbGQpCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorc2hvd19ob3N0X3N0cl8jI2ZpZWxkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJaW50IHJldCA9IDA7CQkJCQkJCVwKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHRyYW5zcG9ydF9jbGFzc190b19zaG9zdChjZGV2KTsJXAorCXN0cnVjdCBpc2NzaV9pbnRlcm5hbCAqaSA9IHRvX2lzY3NpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsgXAorCQkJCQkJCQkJXAorCWlmIChpLT5mbnQtPmdldF8jI2ZpZWxkKQkJCQkJXAorCQlyZXQgPSBpLT5mbnQtPmdldF8jI2ZpZWxkKHNob3N0LCBidWYsIFBBR0VfU0laRSk7CVwKKwlyZXR1cm4gcmV0OwkJCQkJCQlcCit9CisKKyNkZWZpbmUgaXNjc2lfaG9zdF9yZF9zdHJfYXR0cihmaWVsZCkJCQkJCVwKKwlpc2NzaV9ob3N0X3Nob3dfc3RyX2ZuKGZpZWxkKQkJCQkJXAorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGZpZWxkLCBTX0lSVUdPLCBzaG93X2hvc3Rfc3RyXyMjZmllbGQsIE5VTEwpOworCitpc2NzaV9ob3N0X3JkX3N0cl9hdHRyKGluaXRpYXRvcl9uYW1lKTsKK2lzY3NpX2hvc3RfcmRfc3RyX2F0dHIoaW5pdGlhdG9yX2FsaWFzKTsKKworI2RlZmluZSBTRVRVUF9TRVNTSU9OX1JEX0FUVFIoZmllbGQpCQkJCQlcCisJaWYgKGktPmZudC0+c2hvd18jI2ZpZWxkKSB7CQkJCQlcCisJCWktPnNlc3Npb25fYXR0cnNbY291bnRdID0gJmNsYXNzX2RldmljZV9hdHRyXyMjZmllbGQ7CVwKKwkJY291bnQrKzsJCQkJCQlcCisJfQorCisjZGVmaW5lIFNFVFVQX0hPU1RfUkRfQVRUUihmaWVsZCkJCQkJCVwKKwlpZiAoaS0+Zm50LT5zaG93XyMjZmllbGQpIHsJCQkJCVwKKwkJaS0+aG9zdF9hdHRyc1tjb3VudF0gPSAmY2xhc3NfZGV2aWNlX2F0dHJfIyNmaWVsZDsJXAorCQljb3VudCsrOwkJCQkJCVwKKwl9CisKK3N0YXRpYyBpbnQgaXNjc2lfaG9zdF9tYXRjaChzdHJ1Y3QgYXR0cmlidXRlX2NvbnRhaW5lciAqY29udCwKKwkJCSAgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXN0cnVjdCBpc2NzaV9pbnRlcm5hbCAqaTsKKworCWlmICghc2NzaV9pc19ob3N0X2RldmljZShkZXYpKQorCQlyZXR1cm4gMDsKKworCXNob3N0ID0gZGV2X3RvX3Nob3N0KGRldik7CisJaWYgKCFzaG9zdC0+dHJhbnNwb3J0dCAgfHwgc2hvc3QtPnRyYW5zcG9ydHQtPmhvc3RfYXR0cnMuYWMuY2xhc3MKKwkgICAgIT0gJmlzY3NpX2hvc3RfY2xhc3MuY2xhc3MpCisJCXJldHVybiAwOworCisJaSA9IHRvX2lzY3NpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKKwkKKwlyZXR1cm4gJmktPnQuaG9zdF9hdHRycy5hYyA9PSBjb250OworfQorCitzdGF0aWMgaW50IGlzY3NpX3RhcmdldF9tYXRjaChzdHJ1Y3QgYXR0cmlidXRlX2NvbnRhaW5lciAqY29udCwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IGlzY3NpX2ludGVybmFsICppOworCisJaWYgKCFzY3NpX2lzX3RhcmdldF9kZXZpY2UoZGV2KSkKKwkJcmV0dXJuIDA7CisKKwlzaG9zdCA9IGRldl90b19zaG9zdChkZXYtPnBhcmVudCk7CisJaWYgKCFzaG9zdC0+dHJhbnNwb3J0dCAgfHwgc2hvc3QtPnRyYW5zcG9ydHQtPmhvc3RfYXR0cnMuYWMuY2xhc3MKKwkgICAgIT0gJmlzY3NpX2hvc3RfY2xhc3MuY2xhc3MpCisJCXJldHVybiAwOworCisJaSA9IHRvX2lzY3NpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKKwkKKwlyZXR1cm4gJmktPnQudGFyZ2V0X2F0dHJzLmFjID09IGNvbnQ7Cit9CisKK3N0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqCitpc2NzaV9hdHRhY2hfdHJhbnNwb3J0KHN0cnVjdCBpc2NzaV9mdW5jdGlvbl90ZW1wbGF0ZSAqZm50KQoreworCXN0cnVjdCBpc2NzaV9pbnRlcm5hbCAqaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpc2NzaV9pbnRlcm5hbCksCisJCQkJCSAgIEdGUF9LRVJORUwpOworCWludCBjb3VudCA9IDA7CisKKwlpZiAodW5saWtlbHkoIWkpKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChpLCAwLCBzaXplb2Yoc3RydWN0IGlzY3NpX2ludGVybmFsKSk7CisJaS0+Zm50ID0gZm50OworCisJaS0+dC50YXJnZXRfYXR0cnMuYWMuYXR0cnMgPSAmaS0+c2Vzc2lvbl9hdHRyc1swXTsKKwlpLT50LnRhcmdldF9hdHRycy5hYy5jbGFzcyA9ICZpc2NzaV90cmFuc3BvcnRfY2xhc3MuY2xhc3M7CisJaS0+dC50YXJnZXRfYXR0cnMuYWMubWF0Y2ggPSBpc2NzaV90YXJnZXRfbWF0Y2g7CisJdHJhbnNwb3J0X2NvbnRhaW5lcl9yZWdpc3RlcigmaS0+dC50YXJnZXRfYXR0cnMpOworCWktPnQudGFyZ2V0X3NpemUgPSBzaXplb2Yoc3RydWN0IGlzY3NpX2NsYXNzX3Nlc3Npb24pOworCisJU0VUVVBfU0VTU0lPTl9SRF9BVFRSKHRzaWgpOworCVNFVFVQX1NFU1NJT05fUkRfQVRUUihpc2lkKTsKKwlTRVRVUF9TRVNTSU9OX1JEX0FUVFIoaGVhZGVyX2RpZ2VzdCk7CisJU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGRhdGFfZGlnZXN0KTsKKwlTRVRVUF9TRVNTSU9OX1JEX0FUVFIodGFyZ2V0X25hbWUpOworCVNFVFVQX1NFU1NJT05fUkRfQVRUUih0YXJnZXRfYWxpYXMpOworCVNFVFVQX1NFU1NJT05fUkRfQVRUUihwb3J0KTsKKwlTRVRVUF9TRVNTSU9OX1JEX0FUVFIodHBndCk7CisJU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGlwX2FkZHJlc3MpOworCVNFVFVQX1NFU1NJT05fUkRfQVRUUihpbml0aWFsX3IydCk7CisJU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGltbWVkaWF0ZV9kYXRhKTsKKwlTRVRVUF9TRVNTSU9OX1JEX0FUVFIobWF4X3JlY3ZfZGF0YV9zZWdtZW50X2xlbik7CisJU0VUVVBfU0VTU0lPTl9SRF9BVFRSKG1heF9idXJzdF9sZW4pOworCVNFVFVQX1NFU1NJT05fUkRfQVRUUihmaXJzdF9idXJzdF9sZW4pOworCVNFVFVQX1NFU1NJT05fUkRfQVRUUihkZWZfdGltZTJ3YWl0KTsKKwlTRVRVUF9TRVNTSU9OX1JEX0FUVFIoZGVmX3RpbWUycmV0YWluKTsKKwlTRVRVUF9TRVNTSU9OX1JEX0FUVFIobWF4X291dHN0YW5kaW5nX3IydCk7CisJU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGRhdGFfcGR1X2luX29yZGVyKTsKKwlTRVRVUF9TRVNTSU9OX1JEX0FUVFIoZGF0YV9zZXF1ZW5jZV9pbl9vcmRlcik7CisJU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGVybCk7CisKKwlCVUdfT04oY291bnQgPiBJU0NTSV9TRVNTSU9OX0FUVFJTKTsKKwlpLT5zZXNzaW9uX2F0dHJzW2NvdW50XSA9IE5VTEw7CisKKwlpLT50Lmhvc3RfYXR0cnMuYWMuYXR0cnMgPSAmaS0+aG9zdF9hdHRyc1swXTsKKwlpLT50Lmhvc3RfYXR0cnMuYWMuY2xhc3MgPSAmaXNjc2lfaG9zdF9jbGFzcy5jbGFzczsKKwlpLT50Lmhvc3RfYXR0cnMuYWMubWF0Y2ggPSBpc2NzaV9ob3N0X21hdGNoOworCXRyYW5zcG9ydF9jb250YWluZXJfcmVnaXN0ZXIoJmktPnQuaG9zdF9hdHRycyk7CisJaS0+dC5ob3N0X3NpemUgPSAwOworCisJY291bnQgPSAwOworCVNFVFVQX0hPU1RfUkRfQVRUUihpbml0aWF0b3JfbmFtZSk7CisJU0VUVVBfSE9TVF9SRF9BVFRSKGluaXRpYXRvcl9hbGlhcyk7CisKKwlCVUdfT04oY291bnQgPiBJU0NTSV9IT1NUX0FUVFJTKTsKKwlpLT5ob3N0X2F0dHJzW2NvdW50XSA9IE5VTEw7CisKKwlyZXR1cm4gJmktPnQ7Cit9CisKK0VYUE9SVF9TWU1CT0woaXNjc2lfYXR0YWNoX3RyYW5zcG9ydCk7CisKK3ZvaWQgaXNjc2lfcmVsZWFzZV90cmFuc3BvcnQoc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICp0KQoreworCXN0cnVjdCBpc2NzaV9pbnRlcm5hbCAqaSA9IHRvX2lzY3NpX2ludGVybmFsKHQpOworCisJdHJhbnNwb3J0X2NvbnRhaW5lcl91bnJlZ2lzdGVyKCZpLT50LnRhcmdldF9hdHRycyk7CisJdHJhbnNwb3J0X2NvbnRhaW5lcl91bnJlZ2lzdGVyKCZpLT50Lmhvc3RfYXR0cnMpOworICAKKwlrZnJlZShpKTsKK30KKworRVhQT1JUX1NZTUJPTChpc2NzaV9yZWxlYXNlX3RyYW5zcG9ydCk7CisKK3N0YXRpYyBfX2luaXQgaW50IGlzY3NpX3RyYW5zcG9ydF9pbml0KHZvaWQpCit7CisJaW50IGVyciA9IHRyYW5zcG9ydF9jbGFzc19yZWdpc3RlcigmaXNjc2lfdHJhbnNwb3J0X2NsYXNzKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJcmV0dXJuIHRyYW5zcG9ydF9jbGFzc19yZWdpc3RlcigmaXNjc2lfaG9zdF9jbGFzcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpc2NzaV90cmFuc3BvcnRfZXhpdCh2b2lkKQoreworCXRyYW5zcG9ydF9jbGFzc191bnJlZ2lzdGVyKCZpc2NzaV9ob3N0X2NsYXNzKTsKKwl0cmFuc3BvcnRfY2xhc3NfdW5yZWdpc3RlcigmaXNjc2lfdHJhbnNwb3J0X2NsYXNzKTsKK30KKworbW9kdWxlX2luaXQoaXNjc2lfdHJhbnNwb3J0X2luaXQpOworbW9kdWxlX2V4aXQoaXNjc2lfdHJhbnNwb3J0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNaWtlIENocmlzdGllIik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlTQ1NJIFRyYW5zcG9ydCBBdHRyaWJ1dGVzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzZDc2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuYwpAQCAtMCwwICsxLDEwMjAgQEAKKy8qIAorICogIFBhcmFsbGVsIFNDU0kgKFNQSSkgdHJhbnNwb3J0IHNwZWNpZmljIGF0dHJpYnV0ZXMgZXhwb3J0ZWQgdG8gc3lzZnMuCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBKYW1lcyBCb3R0b21sZXkgPEphbWVzLkJvdHRvbWxleUBTdGVlbEV5ZS5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSAic2NzaV9wcml2LmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3JlcXVlc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuaD4KKworI2RlZmluZSBTUElfUFJJTlRLKHgsIGwsIGYsIGEuLi4pCWRldl9wcmludGsobCwgJih4KS0+ZGV2LCBmICwgIyNhKQorCisjZGVmaW5lIFNQSV9OVU1fQVRUUlMgMTAJLyogaW5jcmVhc2UgdGhpcyBpZiB5b3UgYWRkIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgU1BJX09USEVSX0FUVFJTIDEJLyogSW5jcmVhc2UgdGhpcyBpZiB5b3UgYWRkICJhbHdheXMKKwkJCQkgKiBvbiIgYXR0cmlidXRlcyAqLworI2RlZmluZSBTUElfSE9TVF9BVFRSUwkxCisKKyNkZWZpbmUgU1BJX01BWF9FQ0hPX0JVRkZFUl9TSVpFCTQwOTYKKworLyogUHJpdmF0ZSBkYXRhIGFjY2Vzc29ycyAoa2VlcCB0aGVzZSBvdXQgb2YgdGhlIGhlYWRlciBmaWxlKSAqLworI2RlZmluZSBzcGlfZHZfcGVuZGluZyh4KSAoKChzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqKSYoeCktPnN0YXJnZXRfZGF0YSktPmR2X3BlbmRpbmcpCisjZGVmaW5lIHNwaV9kdl9zZW0oeCkgKCgoc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKikmKHgpLT5zdGFyZ2V0X2RhdGEpLT5kdl9zZW0pCisKK3N0cnVjdCBzcGlfaW50ZXJuYWwgeworCXN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSB0OworCXN0cnVjdCBzcGlfZnVuY3Rpb25fdGVtcGxhdGUgKmY7CisJLyogVGhlIGFjdHVhbCBhdHRyaWJ1dGVzICovCisJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgcHJpdmF0ZV9hdHRyc1tTUElfTlVNX0FUVFJTXTsKKwkvKiBUaGUgYXJyYXkgb2YgbnVsbCB0ZXJtaW5hdGVkIHBvaW50ZXJzIHRvIGF0dHJpYnV0ZXMgCisJICogbmVlZGVkIGJ5IHNjc2lfc3lzZnMuYyAqLworCXN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICphdHRyc1tTUElfTlVNX0FUVFJTICsgU1BJX09USEVSX0FUVFJTICsgMV07CisJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgcHJpdmF0ZV9ob3N0X2F0dHJzW1NQSV9IT1NUX0FUVFJTXTsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqaG9zdF9hdHRyc1tTUElfSE9TVF9BVFRSUyArIDFdOworfTsKKworI2RlZmluZSB0b19zcGlfaW50ZXJuYWwodG1wbCkJY29udGFpbmVyX29mKHRtcGwsIHN0cnVjdCBzcGlfaW50ZXJuYWwsIHQpCisKK3N0YXRpYyBjb25zdCBpbnQgcHByX3RvX3BzW10gPSB7CisJLyogVGhlIFBQUiB2YWx1ZXMgMC02IGFyZSByZXNlcnZlZCwgZmlsbCB0aGVtIGluIHdoZW4KKwkgKiB0aGUgY29tbWl0dGVlIGRlZmluZXMgdGhlbSAqLworCS0xLAkJCS8qIDB4MDAgKi8KKwktMSwJCQkvKiAweDAxICovCisJLTEsCQkJLyogMHgwMiAqLworCS0xLAkJCS8qIDB4MDMgKi8KKwktMSwJCQkvKiAweDA0ICovCisJLTEsCQkJLyogMHgwNSAqLworCS0xLAkJCS8qIDB4MDYgKi8KKwkgMzEyNSwJCQkvKiAweDA3ICovCisJIDYyNTAsCQkJLyogMHgwOCAqLworCTEyNTAwLAkJCS8qIDB4MDkgKi8KKwkyNTAwMCwJCQkvKiAweDBhICovCisJMzAzMDAsCQkJLyogMHgwYiAqLworCTUwMDAwLAkJCS8qIDB4MGMgKi8KK307CisvKiBUaGUgUFBSIHZhbHVlcyBhdCB3aGljaCB5b3UgY2FsY3VsYXRlIHRoZSBwZXJpb2QgaW4gbnMgYnkgbXVsdGlwbHlpbmcKKyAqIGJ5IDQgKi8KKyNkZWZpbmUgU1BJX1NUQVRJQ19QUFIJMHgwYworCitzdGF0aWMgaW50IHNwcmludF9mcmFjKGNoYXIgKmRlc3QsIGludCB2YWx1ZSwgaW50IGRlbm9tKQoreworCWludCBmcmFjID0gdmFsdWUgJSBkZW5vbTsKKwlpbnQgcmVzdWx0ID0gc3ByaW50ZihkZXN0LCAiJWQiLCB2YWx1ZSAvIGRlbm9tKTsKKworCWlmIChmcmFjID09IDApCisJCXJldHVybiByZXN1bHQ7CisJZGVzdFtyZXN1bHQrK10gPSAnLic7CisKKwlkbyB7CisJCWRlbm9tIC89IDEwOworCQlzcHJpbnRmKGRlc3QgKyByZXN1bHQsICIlZCIsIGZyYWMgLyBkZW5vbSk7CisJCXJlc3VsdCsrOworCQlmcmFjICU9IGRlbm9tOworCX0gd2hpbGUgKGZyYWMpOworCisJZGVzdFtyZXN1bHQrK10gPSAnXDAnOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeworCWVudW0gc3BpX3NpZ25hbF90eXBlCXZhbHVlOworCWNoYXIJCQkqbmFtZTsKK30gc2lnbmFsX3R5cGVzW10gPSB7CisJeyBTUElfU0lHTkFMX1VOS05PV04sICJ1bmtub3duIiB9LAorCXsgU1BJX1NJR05BTF9TRSwgIlNFIiB9LAorCXsgU1BJX1NJR05BTF9MVkQsICJMVkQiIH0sCisJeyBTUElfU0lHTkFMX0hWRCwgIkhWRCIgfSwKK307CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqc3BpX3NpZ25hbF90b19zdHJpbmcoZW51bSBzcGlfc2lnbmFsX3R5cGUgdHlwZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc2lnbmFsX3R5cGVzKS9zaXplb2Yoc2lnbmFsX3R5cGVzWzBdKTsgaSsrKSB7CisJCWlmICh0eXBlID09IHNpZ25hbF90eXBlc1tpXS52YWx1ZSkKKwkJCXJldHVybiBzaWduYWxfdHlwZXNbaV0ubmFtZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CitzdGF0aWMgaW5saW5lIGVudW0gc3BpX3NpZ25hbF90eXBlIHNwaV9zaWduYWxfdG9fdmFsdWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgaSwgbGVuOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzaWduYWxfdHlwZXMpL3NpemVvZihzaWduYWxfdHlwZXNbMF0pOyBpKyspIHsKKwkJbGVuID0gIHN0cmxlbihzaWduYWxfdHlwZXNbaV0ubmFtZSk7CisJCWlmIChzdHJuY21wKG5hbWUsIHNpZ25hbF90eXBlc1tpXS5uYW1lLCBsZW4pID09IDAgJiYKKwkJICAgIChuYW1lW2xlbl0gPT0gJ1xuJyB8fCBuYW1lW2xlbl0gPT0gJ1wwJykpCisJCQlyZXR1cm4gc2lnbmFsX3R5cGVzW2ldLnZhbHVlOworCX0KKwlyZXR1cm4gU1BJX1NJR05BTF9VTktOT1dOOworfQorCitzdGF0aWMgaW50IHNwaV9ob3N0X3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChkZXYpOworCisJc3BpX3NpZ25hbGxpbmcoc2hvc3QpID0gU1BJX1NJR05BTF9VTktOT1dOOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBERUNMQVJFX1RSQU5TUE9SVF9DTEFTUyhzcGlfaG9zdF9jbGFzcywKKwkJCSAgICAgICAic3BpX2hvc3QiLAorCQkJICAgICAgIHNwaV9ob3N0X3NldHVwLAorCQkJICAgICAgIE5VTEwsCisJCQkgICAgICAgTlVMTCk7CisKK3N0YXRpYyBpbnQgc3BpX2hvc3RfbWF0Y2goc3RydWN0IGF0dHJpYnV0ZV9jb250YWluZXIgKmNvbnQsCisJCQkgIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlzdHJ1Y3Qgc3BpX2ludGVybmFsICppOworCisJaWYgKCFzY3NpX2lzX2hvc3RfZGV2aWNlKGRldikpCisJCXJldHVybiAwOworCisJc2hvc3QgPSBkZXZfdG9fc2hvc3QoZGV2KTsKKwlpZiAoIXNob3N0LT50cmFuc3BvcnR0ICB8fCBzaG9zdC0+dHJhbnNwb3J0dC0+aG9zdF9hdHRycy5hYy5jbGFzcworCSAgICAhPSAmc3BpX2hvc3RfY2xhc3MuY2xhc3MpCisJCXJldHVybiAwOworCisJaSA9IHRvX3NwaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CisJCisJcmV0dXJuICZpLT50Lmhvc3RfYXR0cnMuYWMgPT0gY29udDsKK30KKworc3RhdGljIGludCBzcGlfZGV2aWNlX2NvbmZpZ3VyZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSBzZGV2LT5zZGV2X3RhcmdldDsKKworCS8qIFBvcHVsYXRlIHRoZSB0YXJnZXQgY2FwYWJpbGl0eSBmaWVsZHMgd2l0aCB0aGUgdmFsdWVzCisJICogZ2xlYW5lZCBmcm9tIHRoZSBkZXZpY2UgaW5xdWlyeSAqLworCisJc3BpX3N1cHBvcnRfc3luYyhzdGFyZ2V0KSA9IHNjc2lfZGV2aWNlX3N5bmMoc2Rldik7CisJc3BpX3N1cHBvcnRfd2lkZShzdGFyZ2V0KSA9IHNjc2lfZGV2aWNlX3dpZGUoc2Rldik7CisJc3BpX3N1cHBvcnRfZHQoc3RhcmdldCkgPSBzY3NpX2RldmljZV9kdChzZGV2KTsKKwlzcGlfc3VwcG9ydF9kdF9vbmx5KHN0YXJnZXQpID0gc2NzaV9kZXZpY2VfZHRfb25seShzZGV2KTsKKwlzcGlfc3VwcG9ydF9pdXMoc3RhcmdldCkgPSBzY3NpX2RldmljZV9pdXMoc2Rldik7CisJc3BpX3N1cHBvcnRfcWFzKHN0YXJnZXQpID0gc2NzaV9kZXZpY2VfcWFzKHNkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3NldHVwX3RyYW5zcG9ydF9hdHRycyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gdG9fc2NzaV90YXJnZXQoZGV2KTsKKworCXNwaV9wZXJpb2Qoc3RhcmdldCkgPSAtMTsJLyogaWxsZWdhbCB2YWx1ZSAqLworCXNwaV9vZmZzZXQoc3RhcmdldCkgPSAwOwkvKiBhc3luYyAqLworCXNwaV93aWR0aChzdGFyZ2V0KSA9IDA7CS8qIG5hcnJvdyAqLworCXNwaV9pdShzdGFyZ2V0KSA9IDA7CS8qIG5vIElVICovCisJc3BpX2R0KHN0YXJnZXQpID0gMDsJLyogU1QgKi8KKwlzcGlfcWFzKHN0YXJnZXQpID0gMDsKKwlzcGlfd3JfZmxvdyhzdGFyZ2V0KSA9IDA7CisJc3BpX3JkX3N0cm0oc3RhcmdldCkgPSAwOworCXNwaV9ydGkoc3RhcmdldCkgPSAwOworCXNwaV9wY29tcF9lbihzdGFyZ2V0KSA9IDA7CisJc3BpX2R2X3BlbmRpbmcoc3RhcmdldCkgPSAwOworCXNwaV9pbml0aWFsX2R2KHN0YXJnZXQpID0gMDsKKwlpbml0X01VVEVYKCZzcGlfZHZfc2VtKHN0YXJnZXQpKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIHNwaV90cmFuc3BvcnRfc2hvd19mdW5jdGlvbihmaWVsZCwgZm9ybWF0X3N0cmluZykJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzaG93X3NwaV90cmFuc3BvcnRfIyNmaWVsZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3N0YXJnZXQoY2Rldik7CVwKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsJXAorCXN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzICp0cDsJCQkJCVwKKwlzdHJ1Y3Qgc3BpX2ludGVybmFsICppID0gdG9fc3BpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsJXAorCXRwID0gKHN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzICopJnN0YXJnZXQtPnN0YXJnZXRfZGF0YTsJXAorCWlmIChpLT5mLT5nZXRfIyNmaWVsZCkJCQkJCQlcCisJCWktPmYtPmdldF8jI2ZpZWxkKHN0YXJnZXQpOwkJCQlcCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsIGZvcm1hdF9zdHJpbmcsIHRwLT5maWVsZCk7CQlcCit9CisKKyNkZWZpbmUgc3BpX3RyYW5zcG9ydF9zdG9yZV9mdW5jdGlvbihmaWVsZCwgZm9ybWF0X3N0cmluZykJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzdG9yZV9zcGlfdHJhbnNwb3J0XyMjZmllbGQoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY29uc3QgY2hhciAqYnVmLCBcCisJCQkgICAgc2l6ZV90IGNvdW50KQkJCQlcCit7CQkJCQkJCQkJXAorCWludCB2YWw7CQkJCQkJCVwKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc3RhcmdldChjZGV2KTsJXAorCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOwlcCisJc3RydWN0IHNwaV9pbnRlcm5hbCAqaSA9IHRvX3NwaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CVwKKwkJCQkJCQkJCVwKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOwkJCQlcCisJaS0+Zi0+c2V0XyMjZmllbGQoc3RhcmdldCwgdmFsKTsJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQorCisjZGVmaW5lIHNwaV90cmFuc3BvcnRfcmRfYXR0cihmaWVsZCwgZm9ybWF0X3N0cmluZykJCQlcCisJc3BpX3RyYW5zcG9ydF9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJXAorCXNwaV90cmFuc3BvcnRfc3RvcmVfZnVuY3Rpb24oZmllbGQsIGZvcm1hdF9zdHJpbmcpCQlcCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoZmllbGQsIFNfSVJVR08gfCBTX0lXVVNSLAkJCVwKKwkJCSBzaG93X3NwaV90cmFuc3BvcnRfIyNmaWVsZCwJCQlcCisJCQkgc3RvcmVfc3BpX3RyYW5zcG9ydF8jI2ZpZWxkKTsKKworLyogVGhlIFBhcmFsbGVsIFNDU0kgVHJhbnBvcnQgQXR0cmlidXRlczogKi8KK3NwaV90cmFuc3BvcnRfcmRfYXR0cihvZmZzZXQsICIlZFxuIik7CitzcGlfdHJhbnNwb3J0X3JkX2F0dHIod2lkdGgsICIlZFxuIik7CitzcGlfdHJhbnNwb3J0X3JkX2F0dHIoaXUsICIlZFxuIik7CitzcGlfdHJhbnNwb3J0X3JkX2F0dHIoZHQsICIlZFxuIik7CitzcGlfdHJhbnNwb3J0X3JkX2F0dHIocWFzLCAiJWRcbiIpOworc3BpX3RyYW5zcG9ydF9yZF9hdHRyKHdyX2Zsb3csICIlZFxuIik7CitzcGlfdHJhbnNwb3J0X3JkX2F0dHIocmRfc3RybSwgIiVkXG4iKTsKK3NwaV90cmFuc3BvcnRfcmRfYXR0cihydGksICIlZFxuIik7CitzcGlfdHJhbnNwb3J0X3JkX2F0dHIocGNvbXBfZW4sICIlZFxuIik7CisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9zcGlfcmV2YWxpZGF0ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc3RhcmdldChjZGV2KTsKKworCS8qIEZJWE1FOiB3ZSdyZSByZWx5aW5nIG9uIGFuIGF3ZnVsIGxvdCBvZiBkZXZpY2UgaW50ZXJuYWxzCisJICogaGVyZS4gIFdlIHJlYWxseSBuZWVkIGEgZnVuY3Rpb24gdG8gZ2V0IHRoZSBmaXJzdCBhdmFpbGFibGUKKwkgKiBjaGlsZCAqLworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihzdGFyZ2V0LT5kZXYuY2hpbGRyZW4ubmV4dCwgc3RydWN0IGRldmljZSwgbm9kZSk7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwlzcGlfZHZfZGV2aWNlKHNkZXYpOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihyZXZhbGlkYXRlLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9zcGlfcmV2YWxpZGF0ZSk7CisKKy8qIFRyYW5zbGF0ZSB0aGUgcGVyaW9kIGludG8gbnMgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHNwZWMKKyAqIGZvciBTRFRSL1BQUiBtZXNzYWdlcyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19zcGlfdHJhbnNwb3J0X3BlcmlvZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCisKK3sKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc3RhcmdldChjZGV2KTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqdHA7CisJaW50IGxlbiwgcGljb3NlYzsKKwlzdHJ1Y3Qgc3BpX2ludGVybmFsICppID0gdG9fc3BpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKKworCXRwID0gKHN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzICopJnN0YXJnZXQtPnN0YXJnZXRfZGF0YTsKKworCWlmIChpLT5mLT5nZXRfcGVyaW9kKQorCQlpLT5mLT5nZXRfcGVyaW9kKHN0YXJnZXQpOworCisJaWYgKHRwLT5wZXJpb2QgPCAwIHx8IHRwLT5wZXJpb2QgPiAweGZmKSB7CisJCXBpY29zZWMgPSAtMTsKKwl9IGVsc2UgaWYgKHRwLT5wZXJpb2QgPD0gU1BJX1NUQVRJQ19QUFIpIHsKKwkJcGljb3NlYyA9IHBwcl90b19wc1t0cC0+cGVyaW9kXTsKKwl9IGVsc2UgeworCQlwaWNvc2VjID0gdHAtPnBlcmlvZCAqIDQwMDA7CisJfQorCisJaWYgKHBpY29zZWMgPT0gLTEpIHsKKwkJbGVuID0gc3ByaW50ZihidWYsICJyZXNlcnZlZCIpOworCX0gZWxzZSB7CisJCWxlbiA9IHNwcmludF9mcmFjKGJ1ZiwgcGljb3NlYywgMTAwMCk7CisJfQorCisJYnVmW2xlbisrXSA9ICdcbic7CisJYnVmW2xlbl0gPSAnXDAnOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9zcGlfdHJhbnNwb3J0X3BlcmlvZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjb25zdCBjaGFyICpidWYsCisJCQkgICAgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRyYW5zcG9ydF9jbGFzc190b19zdGFyZ2V0KGNkZXYpOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzcGlfaW50ZXJuYWwgKmkgPSB0b19zcGlfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOworCWludCBqLCBwaWNvc2VjLCBwZXJpb2QgPSAtMTsKKwljaGFyICplbmRwOworCisJcGljb3NlYyA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZHAsIDEwKSAqIDEwMDA7CisJaWYgKCplbmRwID09ICcuJykgeworCQlpbnQgbXVsdCA9IDEwMDsKKwkJZG8geworCQkJZW5kcCsrOworCQkJaWYgKCFpc2RpZ2l0KCplbmRwKSkKKwkJCQlicmVhazsKKwkJCXBpY29zZWMgKz0gKCplbmRwIC0gJzAnKSAqIG11bHQ7CisJCQltdWx0IC89IDEwOworCQl9IHdoaWxlIChtdWx0ID4gMCk7CisJfQorCisJZm9yIChqID0gMDsgaiA8PSBTUElfU1RBVElDX1BQUjsgaisrKSB7CisJCWlmIChwcHJfdG9fcHNbal0gPCBwaWNvc2VjKQorCQkJY29udGludWU7CisJCXBlcmlvZCA9IGo7CisJCWJyZWFrOworCX0KKworCWlmIChwZXJpb2QgPT0gLTEpCisJCXBlcmlvZCA9IHBpY29zZWMgLyA0MDAwOworCisJaWYgKHBlcmlvZCA+IDB4ZmYpCisJCXBlcmlvZCA9IDB4ZmY7CisKKwlpLT5mLT5zZXRfcGVyaW9kKHN0YXJnZXQsIHBlcmlvZCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihwZXJpb2QsIFNfSVJVR08gfCBTX0lXVVNSLCAKKwkJCSBzaG93X3NwaV90cmFuc3BvcnRfcGVyaW9kLAorCQkJIHN0b3JlX3NwaV90cmFuc3BvcnRfcGVyaW9kKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19zcGlfaG9zdF9zaWduYWxsaW5nKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHRyYW5zcG9ydF9jbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3Qgc3BpX2ludGVybmFsICppID0gdG9fc3BpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKKworCWlmIChpLT5mLT5nZXRfc2lnbmFsbGluZykKKwkJaS0+Zi0+Z2V0X3NpZ25hbGxpbmcoc2hvc3QpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHNwaV9zaWduYWxfdG9fc3RyaW5nKHNwaV9zaWduYWxsaW5nKHNob3N0KSkpOworfQorc3RhdGljIHNzaXplX3Qgc3RvcmVfc3BpX2hvc3Rfc2lnbmFsbGluZyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LAorCQkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IHNwaV9pbnRlcm5hbCAqaSA9IHRvX3NwaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CisJZW51bSBzcGlfc2lnbmFsX3R5cGUgdHlwZSA9IHNwaV9zaWduYWxfdG9fdmFsdWUoYnVmKTsKKworCWlmICh0eXBlICE9IFNQSV9TSUdOQUxfVU5LTk9XTikKKwkJaS0+Zi0+c2V0X3NpZ25hbGxpbmcoc2hvc3QsIHR5cGUpOworCisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHNpZ25hbGxpbmcsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJIHNob3dfc3BpX2hvc3Rfc2lnbmFsbGluZywKKwkJCSBzdG9yZV9zcGlfaG9zdF9zaWduYWxsaW5nKTsKKworI2RlZmluZSBEVl9TRVQoeCwgeSkJCQlcCisJaWYoaS0+Zi0+c2V0XyMjeCkJCVwKKwkJaS0+Zi0+c2V0XyMjeChzZGV2LT5zZGV2X3RhcmdldCwgeSkKKworI2RlZmluZSBEVl9MT09QUwkzCisjZGVmaW5lIERWX1RJTUVPVVQJKDEwKkhaKQorI2RlZmluZSBEVl9SRVRSSUVTCTMJLyogc2hvdWxkIG9ubHkgbmVlZCBhdCBtb3N0IAorCQkJCSAqIHR3byBjYy91YSBjbGVhcnMgKi8KKworZW51bSBzcGlfY29tcGFyZV9yZXR1cm5zIHsKKwlTUElfQ09NUEFSRV9TVUNDRVNTLAorCVNQSV9DT01QQVJFX0ZBSUxVUkUsCisJU1BJX0NPTVBBUkVfU0tJUF9URVNULAorfTsKKworCisvKiBUaGlzIGlzIGZvciByZWFkL3dyaXRlIERvbWFpbiBWYWxpZGF0aW9uOiAgSWYgdGhlIGRldmljZSBzdXBwb3J0cworICogYW4gZWNobyBidWZmZXIsIHdlIGRvIHJlYWQvd3JpdGUgdGVzdHMgdG8gaXQgKi8KK3N0YXRpYyBlbnVtIHNwaV9jb21wYXJlX3JldHVybnMKK3NwaV9kdl9kZXZpY2VfZWNob19idWZmZXIoc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSwgdTggKmJ1ZmZlciwKKwkJCSAgdTggKnB0ciwgY29uc3QgaW50IHJldHJpZXMpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gc3JlcS0+c3JfZGV2aWNlOworCWludCBsZW4gPSBwdHIgLSBidWZmZXI7CisJaW50IGosIGssIHI7CisJdW5zaWduZWQgaW50IHBhdHRlcm4gPSAweDAwMDBmZmZmOworCisJY29uc3QgY2hhciBzcGlfd3JpdGVfYnVmZmVyW10gPSB7CisJCVdSSVRFX0JVRkZFUiwgMHgwYSwgMCwgMCwgMCwgMCwgMCwgbGVuID4+IDgsIGxlbiAmIDB4ZmYsIDAKKwl9OworCWNvbnN0IGNoYXIgc3BpX3JlYWRfYnVmZmVyW10gPSB7CisJCVJFQURfQlVGRkVSLCAweDBhLCAwLCAwLCAwLCAwLCAwLCBsZW4gPj4gOCwgbGVuICYgMHhmZiwgMAorCX07CisKKwkvKiBzZXQgdXAgdGhlIHBhdHRlcm4gYnVmZmVyLiAgRG9lc24ndCBtYXR0ZXIgaWYgd2Ugc3BpbGwKKwkgKiBzbGlnaHRseSBiZXlvbmQgc2luY2UgdGhhdCdzIHdoZXJlIHRoZSByZWFkIGJ1ZmZlciBpcyAqLworCWZvciAoaiA9IDA7IGogPCBsZW47ICkgeworCisJCS8qIGZpbGwgdGhlIGJ1ZmZlciB3aXRoIGNvdW50aW5nICh0ZXN0IGEpICovCisJCWZvciAoIDsgaiA8IG1pbihsZW4sIDMyKTsgaisrKQorCQkJYnVmZmVyW2pdID0gajsKKwkJayA9IGo7CisJCS8qIGZpbGwgdGhlIGJ1ZmZlciB3aXRoIGFsdGVybmF0aW5nIHdvcmRzIG9mIDB4MCBhbmQKKwkJICogMHhmZmZmICh0ZXN0IGIpICovCisJCWZvciAoIDsgaiA8IG1pbihsZW4sIGsgKyAzMik7IGogKz0gMikgeworCQkJdTE2ICp3b3JkID0gKHUxNiAqKSZidWZmZXJbal07CisJCQkKKwkJCSp3b3JkID0gKGogJiAweDAyKSA/IDB4MDAwMCA6IDB4ZmZmZjsKKwkJfQorCQlrID0gajsKKwkJLyogZmlsbCB3aXRoIGNyb3NzdGFsayAoYWx0ZXJuYXRpbmcgMHg1NTU1IDB4YWFhKQorICAgICAgICAgICAgICAgICAqICh0ZXN0IGMpICovCisJCWZvciAoIDsgaiA8IG1pbihsZW4sIGsgKyAzMik7IGogKz0gMikgeworCQkJdTE2ICp3b3JkID0gKHUxNiAqKSZidWZmZXJbal07CisKKwkJCSp3b3JkID0gKGogJiAweDAyKSA/IDB4NTU1NSA6IDB4YWFhYTsKKwkJfQorCQlrID0gajsKKwkJLyogZmlsbCB3aXRoIHNoaWZ0aW5nIGJpdHMgKHRlc3QgZCkgKi8KKwkJZm9yICggOyBqIDwgbWluKGxlbiwgayArIDMyKTsgaiArPSA0KSB7CisJCQl1MzIgKndvcmQgPSAodW5zaWduZWQgaW50ICopJmJ1ZmZlcltqXTsKKwkJCXUzMiByb2xsID0gKHBhdHRlcm4gJiAweDgwMDAwMDAwKSA/IDEgOiAwOworCQkJCisJCQkqd29yZCA9IHBhdHRlcm47CisJCQlwYXR0ZXJuID0gKHBhdHRlcm4gPDwgMSkgfCByb2xsOworCQl9CisJCS8qIGRvbid0IGJvdGhlciB3aXRoIHJhbmRvbSBkYXRhICh0ZXN0IGUpICovCisJfQorCisJZm9yIChyID0gMDsgciA8IHJldHJpZXM7IHIrKykgeworCQlzcmVxLT5zcl9jbWRfbGVuID0gMDsJLyogd2FpdF9yZXEgdG8gZmlsbCBpbiAqLworCQlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7CisJCXNjc2lfd2FpdF9yZXEoc3JlcSwgc3BpX3dyaXRlX2J1ZmZlciwgYnVmZmVyLCBsZW4sCisJCQkgICAgICBEVl9USU1FT1VULCBEVl9SRVRSSUVTKTsKKwkJaWYoc3JlcS0+c3JfcmVzdWx0IHx8ICFzY3NpX2RldmljZV9vbmxpbmUoc2RldikpIHsKKwkJCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKKworCQkJc2NzaV9kZXZpY2Vfc2V0X3N0YXRlKHNkZXYsIFNERVZfUVVJRVNDRSk7CisJCQlpZiAoc2NzaV9yZXF1ZXN0X25vcm1hbGl6ZV9zZW5zZShzcmVxLCAmc3NoZHIpCisJCQkgICAgJiYgc3NoZHIuc2Vuc2Vfa2V5ID09IElMTEVHQUxfUkVRVUVTVAorCQkJICAgIC8qIElOVkFMSUQgRklFTEQgSU4gQ0RCICovCisJCQkgICAgJiYgc3NoZHIuYXNjID09IDB4MjQgJiYgc3NoZHIuYXNjcSA9PSAweDAwKQorCQkJCS8qIFRoaXMgd291bGQgbWVhbiB0aGF0IHRoZSBkcml2ZSBsaWVkCisJCQkJICogdG8gdXMgYWJvdXQgc3VwcG9ydGluZyBhbiBlY2hvCisJCQkJICogYnVmZmVyICh1bmZvcnR1bmF0ZWx5IHNvbWUgV2VzdGVybgorCQkJCSAqIERpZ2l0YWwgZHJpdmVzIGRvIHByZWNpc2VseSB0aGlzKQorCQkJCSAqLworCQkJCXJldHVybiBTUElfQ09NUEFSRV9TS0lQX1RFU1Q7CisKKworCQkJU1BJX1BSSU5USyhzZGV2LT5zZGV2X3RhcmdldCwgS0VSTl9FUlIsICJXcml0ZSBCdWZmZXIgZmFpbHVyZSAleFxuIiwgc3JlcS0+c3JfcmVzdWx0KTsKKwkJCXJldHVybiBTUElfQ09NUEFSRV9GQUlMVVJFOworCQl9CisKKwkJbWVtc2V0KHB0ciwgMCwgbGVuKTsKKwkJc3JlcS0+c3JfY21kX2xlbiA9IDA7CS8qIHdhaXRfcmVxIHRvIGZpbGwgaW4gKi8KKwkJc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisJCXNjc2lfd2FpdF9yZXEoc3JlcSwgc3BpX3JlYWRfYnVmZmVyLCBwdHIsIGxlbiwKKwkJCSAgICAgIERWX1RJTUVPVVQsIERWX1JFVFJJRVMpOworCQlzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9RVUlFU0NFKTsKKworCQlpZiAobWVtY21wKGJ1ZmZlciwgcHRyLCBsZW4pICE9IDApCisJCQlyZXR1cm4gU1BJX0NPTVBBUkVfRkFJTFVSRTsKKwl9CisJcmV0dXJuIFNQSV9DT01QQVJFX1NVQ0NFU1M7Cit9CisKKy8qIFRoaXMgaXMgZm9yIHRoZSBzaW1wbGVzdCBmb3JtIG9mIERvbWFpbiBWYWxpZGF0aW9uOiBhIHJlYWQgdGVzdAorICogb24gdGhlIGlucXVpcnkgZGF0YSBmcm9tIHRoZSBkZXZpY2UgKi8KK3N0YXRpYyBlbnVtIHNwaV9jb21wYXJlX3JldHVybnMKK3NwaV9kdl9kZXZpY2VfY29tcGFyZV9pbnF1aXJ5KHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEsIHU4ICpidWZmZXIsCisJCQkgICAgICB1OCAqcHRyLCBjb25zdCBpbnQgcmV0cmllcykKK3sKKwlpbnQgcjsKKwljb25zdCBpbnQgbGVuID0gc3JlcS0+c3JfZGV2aWNlLT5pbnF1aXJ5X2xlbjsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBzcmVxLT5zcl9kZXZpY2U7CisJY29uc3QgY2hhciBzcGlfaW5xdWlyeVtdID0geworCQlJTlFVSVJZLCAwLCAwLCAwLCBsZW4sIDAKKwl9OworCisJZm9yIChyID0gMDsgciA8IHJldHJpZXM7IHIrKykgeworCQlzcmVxLT5zcl9jbWRfbGVuID0gMDsJLyogd2FpdF9yZXEgdG8gZmlsbCBpbiAqLworCQlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKworCQltZW1zZXQocHRyLCAwLCBsZW4pOworCisJCXNjc2lfd2FpdF9yZXEoc3JlcSwgc3BpX2lucXVpcnksIHB0ciwgbGVuLAorCQkJICAgICAgRFZfVElNRU9VVCwgRFZfUkVUUklFUyk7CisJCQorCQlpZihzcmVxLT5zcl9yZXN1bHQgfHwgIXNjc2lfZGV2aWNlX29ubGluZShzZGV2KSkgeworCQkJc2NzaV9kZXZpY2Vfc2V0X3N0YXRlKHNkZXYsIFNERVZfUVVJRVNDRSk7CisJCQlyZXR1cm4gU1BJX0NPTVBBUkVfRkFJTFVSRTsKKwkJfQorCisJCS8qIElmIHdlIGRvbid0IGhhdmUgdGhlIGlucXVpcnkgZGF0YSBhbHJlYWR5LCB0aGUKKwkJICogZmlyc3QgcmVhZCBnZXRzIGl0ICovCisJCWlmIChwdHIgPT0gYnVmZmVyKSB7CisJCQlwdHIgKz0gbGVuOworCQkJLS1yOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobWVtY21wKGJ1ZmZlciwgcHRyLCBsZW4pICE9IDApCisJCQkvKiBmYWlsdXJlICovCisJCQlyZXR1cm4gU1BJX0NPTVBBUkVfRkFJTFVSRTsKKwl9CisJcmV0dXJuIFNQSV9DT01QQVJFX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBlbnVtIHNwaV9jb21wYXJlX3JldHVybnMKK3NwaV9kdl9yZXRyYWluKHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEsIHU4ICpidWZmZXIsIHU4ICpwdHIsCisJICAgICAgIGVudW0gc3BpX2NvbXBhcmVfcmV0dXJucyAKKwkgICAgICAgKCpjb21wYXJlX2ZuKShzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICosIHU4ICosIHU4ICosIGludCkpCit7CisJc3RydWN0IHNwaV9pbnRlcm5hbCAqaSA9IHRvX3NwaV9pbnRlcm5hbChzcmVxLT5zcl9ob3N0LT50cmFuc3BvcnR0KTsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBzcmVxLT5zcl9kZXZpY2U7CisJaW50IHBlcmlvZCA9IDAsIHByZXZwZXJpb2QgPSAwOyAKKwllbnVtIHNwaV9jb21wYXJlX3JldHVybnMgcmV0dmFsOworCisKKwlmb3IgKDs7KSB7CisJCWludCBuZXdwZXJpb2Q7CisJCXJldHZhbCA9IGNvbXBhcmVfZm4oc3JlcSwgYnVmZmVyLCBwdHIsIERWX0xPT1BTKTsKKworCQlpZiAocmV0dmFsID09IFNQSV9DT01QQVJFX1NVQ0NFU1MKKwkJICAgIHx8IHJldHZhbCA9PSBTUElfQ09NUEFSRV9TS0lQX1RFU1QpCisJCQlicmVhazsKKworCQkvKiBPSywgcmV0cmFpbiwgZmFsbGJhY2sgKi8KKwkJaWYgKGktPmYtPmdldF9wZXJpb2QpCisJCQlpLT5mLT5nZXRfcGVyaW9kKHNkZXYtPnNkZXZfdGFyZ2V0KTsKKwkJbmV3cGVyaW9kID0gc3BpX3BlcmlvZChzZGV2LT5zZGV2X3RhcmdldCk7CisJCXBlcmlvZCA9IG5ld3BlcmlvZCA+IHBlcmlvZCA/IG5ld3BlcmlvZCA6IHBlcmlvZDsKKwkJaWYgKHBlcmlvZCA8IDB4MGQpCisJCQlwZXJpb2QrKzsKKwkJZWxzZQorCQkJcGVyaW9kICs9IHBlcmlvZCA+PiAxOworCisJCWlmICh1bmxpa2VseShwZXJpb2QgPiAweGZmIHx8IHBlcmlvZCA9PSBwcmV2cGVyaW9kKSkgeworCQkJLyogVG90YWwgZmFpbHVyZTsgc2V0IHRvIGFzeW5jIGFuZCByZXR1cm4gKi8KKwkJCVNQSV9QUklOVEsoc2Rldi0+c2Rldl90YXJnZXQsIEtFUk5fRVJSLCAiRG9tYWluIFZhbGlkYXRpb24gRmFpbHVyZSwgZHJvcHBpbmcgYmFjayB0byBBc3luY2hyb25vdXNcbiIpOworCQkJRFZfU0VUKG9mZnNldCwgMCk7CisJCQlyZXR1cm4gU1BJX0NPTVBBUkVfRkFJTFVSRTsKKwkJfQorCQlTUElfUFJJTlRLKHNkZXYtPnNkZXZfdGFyZ2V0LCBLRVJOX0VSUiwgIkRvbWFpbiBWYWxpZGF0aW9uIGRldGVjdGVkIGZhaWx1cmUsIGRyb3BwaW5nIGJhY2tcbiIpOworCQlEVl9TRVQocGVyaW9kLCBwZXJpb2QpOworCQlwcmV2cGVyaW9kID0gcGVyaW9kOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitzcGlfZHZfZGV2aWNlX2dldF9lY2hvX2J1ZmZlcihzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxLCB1OCAqYnVmZmVyKQoreworCWludCBsOworCisJLyogZmlyc3Qgb2ZmIGRvIGEgdGVzdCB1bml0IHJlYWR5LiAgVGhpcyBjYW4gZXJyb3Igb3V0IAorCSAqIGJlY2F1c2Ugb2YgcmVzZXJ2YXRpb25zIG9yIHNvbWUgb3RoZXIgcmVhc29uLiAgSWYgaXQKKwkgKiBmYWlscywgdGhlIGRldmljZSB3b24ndCBsZXQgdXMgd3JpdGUgdG8gdGhlIGVjaG8gYnVmZmVyCisJICogc28ganVzdCByZXR1cm4gZmFpbHVyZSAqLworCQorCWNvbnN0IGNoYXIgc3BpX3Rlc3RfdW5pdF9yZWFkeVtdID0geworCQlURVNUX1VOSVRfUkVBRFksIDAsIDAsIDAsIDAsIDAKKwl9OworCisJY29uc3QgY2hhciBzcGlfcmVhZF9idWZmZXJfZGVzY3JpcHRvcltdID0geworCQlSRUFEX0JVRkZFUiwgMHgwYiwgMCwgMCwgMCwgMCwgMCwgMCwgNCwgMAorCX07CisKKwkKKwlzcmVxLT5zcl9jbWRfbGVuID0gMDsKKwlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOworCisJLyogV2Ugc2VuZCBhIHNldCBvZiB0aHJlZSBUVVJzIHRvIGNsZWFyIGFueSBvdXRzdGFuZGluZyAKKwkgKiB1bml0IGF0dGVudGlvbiBjb25kaXRpb25zIGlmIHRoZXkgZXhpc3QgKE90aGVyd2lzZSB0aGUKKwkgKiBidWZmZXIgdGVzdHMgd29uJ3QgYmUgaGFwcHkpLiAgSWYgdGhlIFRVUiBzdGlsbCBmYWlscworCSAqIChyZXNlcnZhdGlvbiBjb25mbGljdCwgZGV2aWNlIG5vdCByZWFkeSwgZXRjKSBqdXN0CisJICogc2tpcCB0aGUgd3JpdGUgdGVzdHMgKi8KKwlmb3IgKGwgPSAwOyA7IGwrKykgeworCQlzY3NpX3dhaXRfcmVxKHNyZXEsIHNwaV90ZXN0X3VuaXRfcmVhZHksIE5VTEwsIDAsCisJCQkgICAgICBEVl9USU1FT1VULCBEVl9SRVRSSUVTKTsKKworCQlpZihzcmVxLT5zcl9yZXN1bHQpIHsKKwkJCWlmKGwgPj0gMykKKwkJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIFRVUiBzdWNjZWVkZWQgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJc3JlcS0+c3JfY21kX2xlbiA9IDA7CisJc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisKKwlzY3NpX3dhaXRfcmVxKHNyZXEsIHNwaV9yZWFkX2J1ZmZlcl9kZXNjcmlwdG9yLCBidWZmZXIsIDQsCisJCSAgICAgIERWX1RJTUVPVVQsIERWX1JFVFJJRVMpOworCisJaWYgKHNyZXEtPnNyX3Jlc3VsdCkKKwkJLyogRGV2aWNlIGhhcyBubyBlY2hvIGJ1ZmZlciAqLworCQlyZXR1cm4gMDsKKworCXJldHVybiBidWZmZXJbM10gKyAoKGJ1ZmZlclsyXSAmIDB4MWYpIDw8IDgpOworfQorCitzdGF0aWMgdm9pZAorc3BpX2R2X2RldmljZV9pbnRlcm5hbChzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxLCB1OCAqYnVmZmVyKQoreworCXN0cnVjdCBzcGlfaW50ZXJuYWwgKmkgPSB0b19zcGlfaW50ZXJuYWwoc3JlcS0+c3JfaG9zdC0+dHJhbnNwb3J0dCk7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gc3JlcS0+c3JfZGV2aWNlOworCWludCBsZW4gPSBzZGV2LT5pbnF1aXJ5X2xlbjsKKwkvKiBmaXJzdCBzZXQgdXMgdXAgZm9yIG5hcnJvdyBhc3luYyAqLworCURWX1NFVChvZmZzZXQsIDApOworCURWX1NFVCh3aWR0aCwgMCk7CisJCisJaWYgKHNwaV9kdl9kZXZpY2VfY29tcGFyZV9pbnF1aXJ5KHNyZXEsIGJ1ZmZlciwgYnVmZmVyLCBEVl9MT09QUykKKwkgICAgIT0gU1BJX0NPTVBBUkVfU1VDQ0VTUykgeworCQlTUElfUFJJTlRLKHNkZXYtPnNkZXZfdGFyZ2V0LCBLRVJOX0VSUiwgIkRvbWFpbiBWYWxpZGF0aW9uIEluaXRpYWwgSW5xdWlyeSBGYWlsZWRcbiIpOworCQkvKiBGSVhNRTogc2hvdWxkIHByb2JhYmx5IG9mZmxpbmUgdGhlIGRldmljZSBoZXJlPyAqLworCQlyZXR1cm47CisJfQorCisJLyogdGVzdCB3aWR0aCAqLworCWlmIChpLT5mLT5zZXRfd2lkdGggJiYgc2Rldi0+d2R0cikgeworCQlpLT5mLT5zZXRfd2lkdGgoc2Rldi0+c2Rldl90YXJnZXQsIDEpOworCisJCWlmIChzcGlfZHZfZGV2aWNlX2NvbXBhcmVfaW5xdWlyeShzcmVxLCBidWZmZXIsCisJCQkJCQkgICBidWZmZXIgKyBsZW4sCisJCQkJCQkgICBEVl9MT09QUykKKwkJICAgICE9IFNQSV9DT01QQVJFX1NVQ0NFU1MpIHsKKwkJCVNQSV9QUklOVEsoc2Rldi0+c2Rldl90YXJnZXQsIEtFUk5fRVJSLCAiV2lkZSBUcmFuc2ZlcnMgRmFpbFxuIik7CisJCQlpLT5mLT5zZXRfd2lkdGgoc2Rldi0+c2Rldl90YXJnZXQsIDApOworCQl9CisJfQorCisJaWYgKCFpLT5mLT5zZXRfcGVyaW9kKQorCQlyZXR1cm47CisKKwkvKiBkZXZpY2UgY2FuJ3QgaGFuZGxlIHN5bmNocm9ub3VzICovCisJaWYoIXNkZXYtPnBwciAmJiAhc2Rldi0+c2R0cikKKwkJcmV0dXJuOworCisJLyogc2VlIGlmIHRoZSBkZXZpY2UgaGFzIGFuIGVjaG8gYnVmZmVyLiAgSWYgaXQgZG9lcyB3ZSBjYW4KKwkgKiBkbyB0aGUgU1BJIHBhdHRlcm4gd3JpdGUgdGVzdHMgKi8KKworCWxlbiA9IDA7CisJaWYgKHNkZXYtPnBwcikKKwkJbGVuID0gc3BpX2R2X2RldmljZV9nZXRfZWNob19idWZmZXIoc3JlcSwgYnVmZmVyKTsKKworIHJldHJ5OgorCisJLyogbm93IHNldCB1cCB0byB0aGUgbWF4aW11bSAqLworCURWX1NFVChvZmZzZXQsIDI1NSk7CisJRFZfU0VUKHBlcmlvZCwgMSk7CisKKwlpZiAobGVuID09IDApIHsKKwkJU1BJX1BSSU5USyhzZGV2LT5zZGV2X3RhcmdldCwgS0VSTl9JTkZPLCAiRG9tYWluIFZhbGlkYXRpb24gc2tpcHBpbmcgd3JpdGUgdGVzdHNcbiIpOworCQlzcGlfZHZfcmV0cmFpbihzcmVxLCBidWZmZXIsIGJ1ZmZlciArIGxlbiwKKwkJCSAgICAgICBzcGlfZHZfZGV2aWNlX2NvbXBhcmVfaW5xdWlyeSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobGVuID4gU1BJX01BWF9FQ0hPX0JVRkZFUl9TSVpFKSB7CisJCVNQSV9QUklOVEsoc2Rldi0+c2Rldl90YXJnZXQsIEtFUk5fV0FSTklORywgIkVjaG8gYnVmZmVyIHNpemUgJWQgaXMgdG9vIGJpZywgdHJpbW1pbmcgdG8gJWRcbiIsIGxlbiwgU1BJX01BWF9FQ0hPX0JVRkZFUl9TSVpFKTsKKwkJbGVuID0gU1BJX01BWF9FQ0hPX0JVRkZFUl9TSVpFOworCX0KKworCWlmIChzcGlfZHZfcmV0cmFpbihzcmVxLCBidWZmZXIsIGJ1ZmZlciArIGxlbiwKKwkJCSAgIHNwaV9kdl9kZXZpY2VfZWNob19idWZmZXIpCisJICAgID09IFNQSV9DT01QQVJFX1NLSVBfVEVTVCkgeworCQkvKiBPSywgdGhlIHN0dXBpZCBkcml2ZSBjYW4ndCBkbyBhIHdyaXRlIGVjaG8gYnVmZmVyCisJCSAqIHRlc3QgYWZ0ZXIgYWxsLCBmYWxsIGJhY2sgdG8gdGhlIHJlYWQgdGVzdHMgKi8KKwkJbGVuID0gMDsKKwkJZ290byByZXRyeTsKKwl9Cit9CisKKworLyoqCXNwaV9kdl9kZXZpY2UgLSBEbyBEb21haW4gVmFsaWRhdGlvbiBvbiB0aGUgZGV2aWNlCisgKglAc2RldjoJCXNjc2kgZGV2aWNlIHRvIHZhbGlkYXRlCisgKgorICoJUGVyZm9ybXMgdGhlIGRvbWFpbiB2YWxpZGF0aW9uIG9uIHRoZSBnaXZlbiBkZXZpY2UgaW4gdGhlCisgKgljdXJyZW50IGV4ZWN1dGlvbiB0aHJlYWQuICBTaW5jZSBEViBvcGVyYXRpb25zIG1heSBzbGVlcCwKKyAqCXRoZSBjdXJyZW50IHRocmVhZCBtdXN0IGhhdmUgdXNlciBjb250ZXh0LiAgQWxzbyBubyBTQ1NJCisgKglyZWxhdGVkIGxvY2tzIHRoYXQgd291bGQgZGVhZGxvY2sgSS9PIGlzc3VlZCBieSB0aGUgRFYgbWF5CisgKgliZSBoZWxkLgorICovCit2b2lkCitzcGlfZHZfZGV2aWNlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KHNkZXYsIEdGUF9LRVJORUwpOworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHNkZXYtPnNkZXZfdGFyZ2V0OworCXU4ICpidWZmZXI7CisJY29uc3QgaW50IGxlbiA9IFNQSV9NQVhfRUNIT19CVUZGRVJfU0laRSoyOworCisJaWYgKHVubGlrZWx5KCFzcmVxKSkKKwkJcmV0dXJuOworCisJaWYgKHVubGlrZWx5KHNjc2lfZGV2aWNlX2dldChzZGV2KSkpCisJCWdvdG8gb3V0X2ZyZWVfcmVxOworCisJYnVmZmVyID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCisJaWYgKHVubGlrZWx5KCFidWZmZXIpKQorCQlnb3RvIG91dF9wdXQ7CisKKwltZW1zZXQoYnVmZmVyLCAwLCBsZW4pOworCisJLyogV2UgbmVlZCB0byB2ZXJpZnkgdGhhdCB0aGUgYWN0dWFsIGRldmljZSB3aWxsIHF1aWVzY2U7IHRoZQorCSAqIGxhdGVyIHRhcmdldCBxdWllc2NlIGlzIGp1c3QgYSBuaWNlIHRvIGhhdmUgKi8KKwlpZiAodW5saWtlbHkoc2NzaV9kZXZpY2VfcXVpZXNjZShzZGV2KSkpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlzY3NpX3RhcmdldF9xdWllc2NlKHN0YXJnZXQpOworCisJc3BpX2R2X3BlbmRpbmcoc3RhcmdldCkgPSAxOworCWRvd24oJnNwaV9kdl9zZW0oc3RhcmdldCkpOworCisJU1BJX1BSSU5USyhzdGFyZ2V0LCBLRVJOX0lORk8sICJCZWdpbm5pbmcgRG9tYWluIFZhbGlkYXRpb25cbiIpOworCisJc3BpX2R2X2RldmljZV9pbnRlcm5hbChzcmVxLCBidWZmZXIpOworCisJU1BJX1BSSU5USyhzdGFyZ2V0LCBLRVJOX0lORk8sICJFbmRpbmcgRG9tYWluIFZhbGlkYXRpb25cbiIpOworCisJdXAoJnNwaV9kdl9zZW0oc3RhcmdldCkpOworCXNwaV9kdl9wZW5kaW5nKHN0YXJnZXQpID0gMDsKKworCXNjc2lfdGFyZ2V0X3Jlc3VtZShzdGFyZ2V0KTsKKworCXNwaV9pbml0aWFsX2R2KHN0YXJnZXQpID0gMTsKKworIG91dF9mcmVlOgorCWtmcmVlKGJ1ZmZlcik7Cisgb3V0X3B1dDoKKwlzY3NpX2RldmljZV9wdXQoc2Rldik7Cisgb3V0X2ZyZWVfcmVxOgorCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOworfQorRVhQT1JUX1NZTUJPTChzcGlfZHZfZGV2aWNlKTsKKworc3RydWN0IHdvcmtfcXVldWVfd3JhcHBlciB7CisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisJc3RydWN0IHNjc2lfZGV2aWNlCSpzZGV2OworfTsKKworc3RhdGljIHZvaWQKK3NwaV9kdl9kZXZpY2Vfd29ya193cmFwcGVyKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHdvcmtfcXVldWVfd3JhcHBlciAqd3F3ID0gKHN0cnVjdCB3b3JrX3F1ZXVlX3dyYXBwZXIgKilkYXRhOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHdxdy0+c2RldjsKKworCWtmcmVlKHdxdyk7CisJc3BpX2R2X2RldmljZShzZGV2KTsKKwlzcGlfZHZfcGVuZGluZyhzZGV2LT5zZGV2X3RhcmdldCkgPSAwOworCXNjc2lfZGV2aWNlX3B1dChzZGV2KTsKK30KKworCisvKioKKyAqCXNwaV9zY2hlZHVsZV9kdl9kZXZpY2UgLSBzY2hlZHVsZSBkb21haW4gdmFsaWRhdGlvbiB0byBvY2N1ciBvbiB0aGUgZGV2aWNlCisgKglAc2RldjoJVGhlIGRldmljZSB0byB2YWxpZGF0ZQorICoKKyAqCUlkZW50aWNhbCB0byBzcGlfZHZfZGV2aWNlKCkgYWJvdmUsIGV4Y2VwdCB0aGF0IHRoZSBEViB3aWxsIGJlCisgKglzY2hlZHVsZWQgdG8gb2NjdXIgaW4gYSB3b3JrcXVldWUgbGF0ZXIuICBBbGwgbWVtb3J5IGFsbG9jYXRpb25zCisgKglhcmUgYXRvbWljLCBzbyBtYXkgYmUgY2FsbGVkIGZyb20gYW55IGNvbnRleHQgaW5jbHVkaW5nIHRob3NlIGhvbGRpbmcKKyAqCVNDU0kgbG9ja3MuCisgKi8KK3ZvaWQKK3NwaV9zY2hlZHVsZV9kdl9kZXZpY2Uoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXN0cnVjdCB3b3JrX3F1ZXVlX3dyYXBwZXIgKndxdyA9CisJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB3b3JrX3F1ZXVlX3dyYXBwZXIpLCBHRlBfQVRPTUlDKTsKKworCWlmICh1bmxpa2VseSghd3F3KSkKKwkJcmV0dXJuOworCisJaWYgKHVubGlrZWx5KHNwaV9kdl9wZW5kaW5nKHNkZXYtPnNkZXZfdGFyZ2V0KSkpIHsKKwkJa2ZyZWUod3F3KTsKKwkJcmV0dXJuOworCX0KKwkvKiBTZXQgcGVuZGluZyBlYXJseSAoZHZfZGV2aWNlIGRvZXNuJ3QgY2hlY2sgaXQsIG9ubHkgc2V0cyBpdCkgKi8KKwlzcGlfZHZfcGVuZGluZyhzZGV2LT5zZGV2X3RhcmdldCkgPSAxOworCWlmICh1bmxpa2VseShzY3NpX2RldmljZV9nZXQoc2RldikpKSB7CisJCWtmcmVlKHdxdyk7CisJCXNwaV9kdl9wZW5kaW5nKHNkZXYtPnNkZXZfdGFyZ2V0KSA9IDA7CisJCXJldHVybjsKKwl9CisKKwlJTklUX1dPUksoJndxdy0+d29yaywgc3BpX2R2X2RldmljZV93b3JrX3dyYXBwZXIsIHdxdyk7CisJd3F3LT5zZGV2ID0gc2RldjsKKworCXNjaGVkdWxlX3dvcmsoJndxdy0+d29yayk7Cit9CitFWFBPUlRfU1lNQk9MKHNwaV9zY2hlZHVsZV9kdl9kZXZpY2UpOworCisvKioKKyAqIHNwaV9kaXNwbGF5X3hmZXJfYWdyZWVtZW50IC0gUHJpbnQgdGhlIGN1cnJlbnQgdGFyZ2V0IHRyYW5zZmVyIGFncmVlbWVudAorICogQHN0YXJnZXQ6IFRoZSB0YXJnZXQgZm9yIHdoaWNoIHRvIGRpc3BsYXkgdGhlIGFncmVlbWVudAorICoKKyAqIEVhY2ggU1BJIHBvcnQgaXMgcmVxdWlyZWQgdG8gbWFpbnRhaW4gYSB0cmFuc2ZlciBhZ3JlZW1lbnQgZm9yIGVhY2gKKyAqIG90aGVyIHBvcnQgb24gdGhlIGJ1cy4gIFRoaXMgZnVuY3Rpb24gcHJpbnRzIGEgb25lLWxpbmUgc3VtbWFyeSBvZgorICogdGhlIGN1cnJlbnQgYWdyZWVtZW50OyBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBpbiBzeXNmcy4KKyAqLwordm9pZCBzcGlfZGlzcGxheV94ZmVyX2FncmVlbWVudChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQpCit7CisJc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKnRwOworCXRwID0gKHN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzICopJnN0YXJnZXQtPnN0YXJnZXRfZGF0YTsKKworCWlmICh0cC0+b2Zmc2V0ID4gMCAmJiB0cC0+cGVyaW9kID4gMCkgeworCQl1bnNpZ25lZCBpbnQgcGljb3NlYywga2IxMDA7CisJCWNoYXIgKnNjc2kgPSAiRkFTVC0/IjsKKwkJY2hhciB0bXBbOF07CisKKwkJaWYgKHRwLT5wZXJpb2QgPD0gU1BJX1NUQVRJQ19QUFIpIHsKKwkJCXBpY29zZWMgPSBwcHJfdG9fcHNbdHAtPnBlcmlvZF07CisJCQlzd2l0Y2ggKHRwLT5wZXJpb2QpIHsKKwkJCQljYXNlICA3OiBzY3NpID0gIkZBU1QtMzIwIjsgYnJlYWs7CisJCQkJY2FzZSAgODogc2NzaSA9ICJGQVNULTE2MCI7IGJyZWFrOworCQkJCWNhc2UgIDk6IHNjc2kgPSAiRkFTVC04MCI7IGJyZWFrOworCQkJCWNhc2UgMTA6CisJCQkJY2FzZSAxMTogc2NzaSA9ICJGQVNULTQwIjsgYnJlYWs7CisJCQkJY2FzZSAxMjogc2NzaSA9ICJGQVNULTIwIjsgYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwaWNvc2VjID0gdHAtPnBlcmlvZCAqIDQwMDA7CisJCQlpZiAodHAtPnBlcmlvZCA8IDI1KQorCQkJCXNjc2kgPSAiRkFTVC0yMCI7CisJCQllbHNlIGlmICh0cC0+cGVyaW9kIDwgNTApCisJCQkJc2NzaSA9ICJGQVNULTEwIjsKKwkJCWVsc2UKKwkJCQlzY3NpID0gIkZBU1QtNSI7CisJCX0KKworCQlrYjEwMCA9ICgxMDAwMDAwMCArIHBpY29zZWMgLyAyKSAvIHBpY29zZWM7CisJCWlmICh0cC0+d2lkdGgpCisJCQlrYjEwMCAqPSAyOworCQlzcHJpbnRfZnJhYyh0bXAsIHBpY29zZWMsIDEwMDApOworCisJCWRldl9pbmZvKCZzdGFyZ2V0LT5kZXYsCisJCQkiJXMgJXNTQ1NJICVkLiVkIE1CL3MgJXMlcyVzICglcyBucywgb2Zmc2V0ICVkKVxuIiwKKwkJCXNjc2ksIHRwLT53aWR0aCA/ICJXSURFICIgOiAiIiwga2IxMDAvMTAsIGtiMTAwICUgMTAsCisJCQl0cC0+ZHQgPyAiRFQiIDogIlNUIiwgdHAtPml1ID8gIiBJVSIgOiAiIiwKKwkJCXRwLT5xYXMgID8gIiBRQVMiIDogIiIsIHRtcCwgdHAtPm9mZnNldCk7CisJfSBlbHNlIHsKKwkJZGV2X2luZm8oJnN0YXJnZXQtPmRldiwgIiVzYXN5bmNocm9ub3VzLlxuIiwKKwkJCQl0cC0+d2lkdGggPyAid2lkZSAiIDogIiIpOworCX0KK30KK0VYUE9SVF9TWU1CT0woc3BpX2Rpc3BsYXlfeGZlcl9hZ3JlZW1lbnQpOworCisjZGVmaW5lIFNFVFVQX0FUVFJJQlVURShmaWVsZCkJCQkJCQlcCisJaS0+cHJpdmF0ZV9hdHRyc1tjb3VudF0gPSBjbGFzc19kZXZpY2VfYXR0cl8jI2ZpZWxkOwkJXAorCWlmICghaS0+Zi0+c2V0XyMjZmllbGQpIHsJCQkJCVwKKwkJaS0+cHJpdmF0ZV9hdHRyc1tjb3VudF0uYXR0ci5tb2RlID0gU19JUlVHTzsJCVwKKwkJaS0+cHJpdmF0ZV9hdHRyc1tjb3VudF0uc3RvcmUgPSBOVUxMOwkJCVwKKwl9CQkJCQkJCQlcCisJaS0+YXR0cnNbY291bnRdID0gJmktPnByaXZhdGVfYXR0cnNbY291bnRdOwkJCVwKKwlpZiAoaS0+Zi0+c2hvd18jI2ZpZWxkKQkJCQkJCVwKKwkJY291bnQrKworCisjZGVmaW5lIFNFVFVQX0hPU1RfQVRUUklCVVRFKGZpZWxkKQkJCQkJXAorCWktPnByaXZhdGVfaG9zdF9hdHRyc1tjb3VudF0gPSBjbGFzc19kZXZpY2VfYXR0cl8jI2ZpZWxkOwlcCisJaWYgKCFpLT5mLT5zZXRfIyNmaWVsZCkgewkJCQkJXAorCQlpLT5wcml2YXRlX2hvc3RfYXR0cnNbY291bnRdLmF0dHIubW9kZSA9IFNfSVJVR087CVwKKwkJaS0+cHJpdmF0ZV9ob3N0X2F0dHJzW2NvdW50XS5zdG9yZSA9IE5VTEw7CQlcCisJfQkJCQkJCQkJXAorCWktPmhvc3RfYXR0cnNbY291bnRdID0gJmktPnByaXZhdGVfaG9zdF9hdHRyc1tjb3VudF07CQlcCisJY291bnQrKworCitzdGF0aWMgaW50IHNwaV9kZXZpY2VfbWF0Y2goc3RydWN0IGF0dHJpYnV0ZV9jb250YWluZXIgKmNvbnQsCisJCQkgICAgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKworCWlmICghc2NzaV9pc19zZGV2X2RldmljZShkZXYpKQorCQlyZXR1cm4gMDsKKworCXNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOworCXNob3N0ID0gc2Rldi0+aG9zdDsKKwlpZiAoIXNob3N0LT50cmFuc3BvcnR0ICB8fCBzaG9zdC0+dHJhbnNwb3J0dC0+aG9zdF9hdHRycy5hYy5jbGFzcworCSAgICAhPSAmc3BpX2hvc3RfY2xhc3MuY2xhc3MpCisJCXJldHVybiAwOworCS8qIE5vdGU6IHRoaXMgY2xhc3MgaGFzIG5vIGRldmljZSBhdHRyaWJ1dGVzLCBzbyBpdCBoYXMKKwkgKiBubyBwZXItSEJBIGFsbG9jYXRpb24gYW5kIHRodXMgd2UgZG9uJ3QgbmVlZCB0byBkaXN0aW5ndWlzaAorCSAqIHRoZSBhdHRyaWJ1dGUgY29udGFpbmVycyBmb3IgdGhlIGRldmljZSAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNwaV90YXJnZXRfbWF0Y2goc3RydWN0IGF0dHJpYnV0ZV9jb250YWluZXIgKmNvbnQsCisJCQkgICAgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXN0cnVjdCBzcGlfaW50ZXJuYWwgKmk7CisKKwlpZiAoIXNjc2lfaXNfdGFyZ2V0X2RldmljZShkZXYpKQorCQlyZXR1cm4gMDsKKworCXNob3N0ID0gZGV2X3RvX3Nob3N0KGRldi0+cGFyZW50KTsKKwlpZiAoIXNob3N0LT50cmFuc3BvcnR0ICB8fCBzaG9zdC0+dHJhbnNwb3J0dC0+aG9zdF9hdHRycy5hYy5jbGFzcworCSAgICAhPSAmc3BpX2hvc3RfY2xhc3MuY2xhc3MpCisJCXJldHVybiAwOworCisJaSA9IHRvX3NwaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CisJCisJcmV0dXJuICZpLT50LnRhcmdldF9hdHRycy5hYyA9PSBjb250OworfQorCitzdGF0aWMgREVDTEFSRV9UUkFOU1BPUlRfQ0xBU1Moc3BpX3RyYW5zcG9ydF9jbGFzcywKKwkJCSAgICAgICAic3BpX3RyYW5zcG9ydCIsCisJCQkgICAgICAgc3BpX3NldHVwX3RyYW5zcG9ydF9hdHRycywKKwkJCSAgICAgICBOVUxMLAorCQkJICAgICAgIE5VTEwpOworCitzdGF0aWMgREVDTEFSRV9BTk9OX1RSQU5TUE9SVF9DTEFTUyhzcGlfZGV2aWNlX2NsYXNzLAorCQkJCSAgICBzcGlfZGV2aWNlX21hdGNoLAorCQkJCSAgICBzcGlfZGV2aWNlX2NvbmZpZ3VyZSk7CisKK3N0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqCitzcGlfYXR0YWNoX3RyYW5zcG9ydChzdHJ1Y3Qgc3BpX2Z1bmN0aW9uX3RlbXBsYXRlICpmdCkKK3sKKwlzdHJ1Y3Qgc3BpX2ludGVybmFsICppID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNwaV9pbnRlcm5hbCksCisJCQkJCSBHRlBfS0VSTkVMKTsKKwlpbnQgY291bnQgPSAwOworCWlmICh1bmxpa2VseSghaSkpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KGksIDAsIHNpemVvZihzdHJ1Y3Qgc3BpX2ludGVybmFsKSk7CisKKworCWktPnQudGFyZ2V0X2F0dHJzLmFjLmNsYXNzID0gJnNwaV90cmFuc3BvcnRfY2xhc3MuY2xhc3M7CisJaS0+dC50YXJnZXRfYXR0cnMuYWMuYXR0cnMgPSAmaS0+YXR0cnNbMF07CisJaS0+dC50YXJnZXRfYXR0cnMuYWMubWF0Y2ggPSBzcGlfdGFyZ2V0X21hdGNoOworCXRyYW5zcG9ydF9jb250YWluZXJfcmVnaXN0ZXIoJmktPnQudGFyZ2V0X2F0dHJzKTsKKwlpLT50LnRhcmdldF9zaXplID0gc2l6ZW9mKHN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzKTsKKwlpLT50Lmhvc3RfYXR0cnMuYWMuY2xhc3MgPSAmc3BpX2hvc3RfY2xhc3MuY2xhc3M7CisJaS0+dC5ob3N0X2F0dHJzLmFjLmF0dHJzID0gJmktPmhvc3RfYXR0cnNbMF07CisJaS0+dC5ob3N0X2F0dHJzLmFjLm1hdGNoID0gc3BpX2hvc3RfbWF0Y2g7CisJdHJhbnNwb3J0X2NvbnRhaW5lcl9yZWdpc3RlcigmaS0+dC5ob3N0X2F0dHJzKTsKKwlpLT50Lmhvc3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc3BpX2hvc3RfYXR0cnMpOworCWktPmYgPSBmdDsKKworCVNFVFVQX0FUVFJJQlVURShwZXJpb2QpOworCVNFVFVQX0FUVFJJQlVURShvZmZzZXQpOworCVNFVFVQX0FUVFJJQlVURSh3aWR0aCk7CisJU0VUVVBfQVRUUklCVVRFKGl1KTsKKwlTRVRVUF9BVFRSSUJVVEUoZHQpOworCVNFVFVQX0FUVFJJQlVURShxYXMpOworCVNFVFVQX0FUVFJJQlVURSh3cl9mbG93KTsKKwlTRVRVUF9BVFRSSUJVVEUocmRfc3RybSk7CisJU0VUVVBfQVRUUklCVVRFKHJ0aSk7CisJU0VUVVBfQVRUUklCVVRFKHBjb21wX2VuKTsKKworCS8qIGlmIHlvdSBhZGQgYW4gYXR0cmlidXRlIGJ1dCBmb3JnZXQgdG8gaW5jcmVhc2UgU1BJX05VTV9BVFRSUworCSAqIHRoaXMgYnVnIHdpbGwgdHJpZ2dlciAqLworCUJVR19PTihjb3VudCA+IFNQSV9OVU1fQVRUUlMpOworCisJaS0+YXR0cnNbY291bnQrK10gPSAmY2xhc3NfZGV2aWNlX2F0dHJfcmV2YWxpZGF0ZTsKKworCWktPmF0dHJzW2NvdW50XSA9IE5VTEw7CisKKwljb3VudCA9IDA7CisJU0VUVVBfSE9TVF9BVFRSSUJVVEUoc2lnbmFsbGluZyk7CisKKwlCVUdfT04oY291bnQgPiBTUElfSE9TVF9BVFRSUyk7CisKKwlpLT5ob3N0X2F0dHJzW2NvdW50XSA9IE5VTEw7CisKKwlyZXR1cm4gJmktPnQ7Cit9CitFWFBPUlRfU1lNQk9MKHNwaV9hdHRhY2hfdHJhbnNwb3J0KTsKKwordm9pZCBzcGlfcmVsZWFzZV90cmFuc3BvcnQoc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICp0KQoreworCXN0cnVjdCBzcGlfaW50ZXJuYWwgKmkgPSB0b19zcGlfaW50ZXJuYWwodCk7CisKKwl0cmFuc3BvcnRfY29udGFpbmVyX3VucmVnaXN0ZXIoJmktPnQudGFyZ2V0X2F0dHJzKTsKKwl0cmFuc3BvcnRfY29udGFpbmVyX3VucmVnaXN0ZXIoJmktPnQuaG9zdF9hdHRycyk7CisKKwlrZnJlZShpKTsKK30KK0VYUE9SVF9TWU1CT0woc3BpX3JlbGVhc2VfdHJhbnNwb3J0KTsKKworc3RhdGljIF9faW5pdCBpbnQgc3BpX3RyYW5zcG9ydF9pbml0KHZvaWQpCit7CisJaW50IGVycm9yID0gdHJhbnNwb3J0X2NsYXNzX3JlZ2lzdGVyKCZzcGlfdHJhbnNwb3J0X2NsYXNzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwllcnJvciA9IGFub25fdHJhbnNwb3J0X2NsYXNzX3JlZ2lzdGVyKCZzcGlfZGV2aWNlX2NsYXNzKTsKKwlyZXR1cm4gdHJhbnNwb3J0X2NsYXNzX3JlZ2lzdGVyKCZzcGlfaG9zdF9jbGFzcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzcGlfdHJhbnNwb3J0X2V4aXQodm9pZCkKK3sKKwl0cmFuc3BvcnRfY2xhc3NfdW5yZWdpc3Rlcigmc3BpX3RyYW5zcG9ydF9jbGFzcyk7CisJYW5vbl90cmFuc3BvcnRfY2xhc3NfdW5yZWdpc3Rlcigmc3BpX2RldmljZV9jbGFzcyk7CisJdHJhbnNwb3J0X2NsYXNzX3VucmVnaXN0ZXIoJnNwaV9ob3N0X2NsYXNzKTsKK30KKworTU9EVUxFX0FVVEhPUigiTWFydGluIEhpY2tzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNQSSBUcmFuc3BvcnQgQXR0cmlidXRlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzcGlfdHJhbnNwb3J0X2luaXQpOworbW9kdWxlX2V4aXQoc3BpX3RyYW5zcG9ydF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3R5cGVkZWZzLmggYi9kcml2ZXJzL3Njc2kvc2NzaV90eXBlZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDMxMzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90eXBlZGVmcy5oCkBAIC0wLDAgKzEsNiBAQAorCit0eXBlZGVmIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgU2NzaV9Ib3N0X1RlbXBsYXRlOwordHlwZWRlZiBzdHJ1Y3Qgc2NzaV9kZXZpY2UgU2NzaV9EZXZpY2U7Cit0eXBlZGVmIHN0cnVjdCBzY3NpX2NtbmQgU2NzaV9DbW5kOwordHlwZWRlZiBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0IFNjc2lfUmVxdWVzdDsKK3R5cGVkZWYgc3RydWN0IHNjc2lfcG9pbnRlciBTY3NpX1BvaW50ZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaWNhbS5jIGIvZHJpdmVycy9zY3NpL3Njc2ljYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzgzNTRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Njc2ljYW0uYwpAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIHNjc2ljYW0uYyAtIFNDU0kgQ0FNIHN1cHBvcnQgZnVuY3Rpb25zLCB1c2UgZm9yIEhESU9fR0VUR0VPLCBldGMuCisgKgorICogQ29weXJpZ2h0IDE5OTMsIDE5OTQgRHJldyBFY2toYXJkdAorICogICAgICBWaXNpb25hcnkgQ29tcHV0aW5nIAorICogICAgICAoVW5peCBhbmQgTGludXggY29uc3VsdGluZyBhbmQgY3VzdG9tIHByb2dyYW1taW5nKQorICogICAgICBkcmV3QENvbG9yYWRvLkVEVQorICogICAgICArMSAoMzAzKSA3ODYtNzk3NQorICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgY29uc3VsdCB0aGUgU0NTSS1DQU0gZHJhZnQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgorCisKK3N0YXRpYyBpbnQgc2V0c2l6ZSh1bnNpZ25lZCBsb25nIGNhcGFjaXR5LCB1bnNpZ25lZCBpbnQgKmN5bHMsIHVuc2lnbmVkIGludCAqaGRzLAorCQkgICB1bnNpZ25lZCBpbnQgKnNlY3MpOworCit1bnNpZ25lZCBjaGFyICpzY3NpX2Jpb3NfcHRhYmxlKHN0cnVjdCBibG9ja19kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBjaGFyICpyZXMgPSBrbWFsbG9jKDY2LCBHRlBfS0VSTkVMKTsKKwlpZiAocmVzKSB7CisJCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBkZXYtPmJkX2NvbnRhaW5zOworCQlTZWN0b3Igc2VjdDsKKwkJdm9pZCAqZGF0YSA9IHJlYWRfZGV2X3NlY3RvcihiZGV2LCAwLCAmc2VjdCk7CisJCWlmIChkYXRhKSB7CisJCQltZW1jcHkocmVzLCBkYXRhICsgMHgxYmUsIDY2KTsKKwkJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQl9IGVsc2UgeworCQkJa2ZyZWUocmVzKTsKKwkJCXJlcyA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIHJlczsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9iaW9zX3B0YWJsZSk7CisKKy8qCisgKiBGdW5jdGlvbiA6IGludCBzY3NpY2FtX2Jpb3NfcGFyYW0gKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGVjdG9yX3QgY2FwYWNpdHksIGludCAqaXApCisgKgorICogUHVycG9zZSA6IHRvIGRldGVybWluZSB0aGUgQklPUyBtYXBwaW5nIHVzZWQgZm9yIGEgZHJpdmUgaW4gYSAKKyAqICAgICAgU0NTSS1DQU0gc3lzdGVtLCBzdG9yaW5nIHRoZSByZXN1bHRzIGluIGlwIGFzIHJlcXVpcmVkCisgKiAgICAgIGJ5IHRoZSBIRElPX0dFVEdFTyBpb2N0bCgpLgorICoKKyAqIFJldHVybnMgOiAtMSBvbiBmYWlsdXJlLCAwIG9uIHN1Y2Nlc3MuCisgKgorICovCisKK2ludCBzY3NpY2FtX2Jpb3NfcGFyYW0oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3QgY2FwYWNpdHksIGludCAqaXApCit7CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgcmV0OworCisJcCA9IHNjc2lfYmlvc19wdGFibGUoYmRldik7CisJaWYgKCFwKQorCQlyZXR1cm4gLTE7CisKKwkvKiB0cnkgdG8gaW5mZXIgbWFwcGluZyBmcm9tIHBhcnRpdGlvbiB0YWJsZSAqLworCXJldCA9IHNjc2lfcGFydHNpemUocCwgKHVuc2lnbmVkIGxvbmcpY2FwYWNpdHksICh1bnNpZ25lZCBpbnQgKilpcCArIDIsCisJCQkgICAgICAgKHVuc2lnbmVkIGludCAqKWlwICsgMCwgKHVuc2lnbmVkIGludCAqKWlwICsgMSk7CisJa2ZyZWUocCk7CisKKwlpZiAocmV0ID09IC0xKSB7CisJCS8qIHBpY2sgc29tZSBzdGFuZGFyZCBtYXBwaW5nIHdpdGggYXQgbW9zdCAxMDI0IGN5bGluZGVycywKKwkJICAgYW5kIGF0IG1vc3QgNjIgc2VjdG9ycyBwZXIgdHJhY2sgLSB0aGlzIHdvcmtzIHVwIHRvCisJCSAgIDc5MDUgTUIgKi8KKwkJcmV0ID0gc2V0c2l6ZSgodW5zaWduZWQgbG9uZyljYXBhY2l0eSwgKHVuc2lnbmVkIGludCAqKWlwICsgMiwKKwkJICAgICAgICh1bnNpZ25lZCBpbnQgKilpcCArIDAsICh1bnNpZ25lZCBpbnQgKilpcCArIDEpOworCX0KKworCS8qIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLCB0aGVuIGFwcGFyZW50bHkgd2UgaGF2ZSB0byByZXR1cm4KKwkgICBhIGdlb21ldHJ5IHdpdGggbW9yZSB0aGFuIDEwMjQgY3lsaW5kZXJzICovCisJaWYgKHJldCB8fCBpcFswXSA+IDI1NSB8fCBpcFsxXSA+IDYzKSB7CisJCWlmICgoY2FwYWNpdHkgPj4gMTEpID4gNjU1MzQpIHsKKwkJCWlwWzBdID0gMjU1OworCQkJaXBbMV0gPSA2MzsKKwkJfSBlbHNlIHsKKwkJCWlwWzBdID0gNjQ7CisJCQlpcFsxXSA9IDMyOworCQl9CisKKwkJaWYgKGNhcGFjaXR5ID4gNjU1MzUqNjMqMjU1KQorCQkJaXBbMl0gPSA2NTUzNTsKKwkJZWxzZQorCQkJaXBbMl0gPSAodW5zaWduZWQgbG9uZyljYXBhY2l0eSAvIChpcFswXSAqIGlwWzFdKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc2NzaWNhbV9iaW9zX3BhcmFtKTsKKworLyoKKyAqIEZ1bmN0aW9uIDogc3RhdGljIGludCBzY3NpX3BhcnRzaXplKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyAKKyAqICAgICBjYXBhY2l0eSx1bnNpZ25lZCBpbnQgKmN5bHMsIHVuc2lnbmVkIGludCAqaGRzLCB1bnNpZ25lZCBpbnQgKnNlY3MpOworICoKKyAqIFB1cnBvc2UgOiB0byBkZXRlcm1pbmUgdGhlIEJJT1MgbWFwcGluZyB1c2VkIHRvIGNyZWF0ZSB0aGUgcGFydGl0aW9uCisgKiAgICAgIHRhYmxlLCBzdG9yaW5nIHRoZSByZXN1bHRzIGluICpjeWxzLCAqaGRzLCBhbmQgKnNlY3MgCisgKgorICogUmV0dXJucyA6IC0xIG9uIGZhaWx1cmUsIDAgb24gc3VjY2Vzcy4KKyAqCisgKi8KKworaW50IHNjc2lfcGFydHNpemUodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGNhcGFjaXR5LAorCSAgICAgICB1bnNpZ25lZCBpbnQgKmN5bHMsIHVuc2lnbmVkIGludCAqaGRzLCB1bnNpZ25lZCBpbnQgKnNlY3MpCit7CisJc3RydWN0IHBhcnRpdGlvbiAqcCA9IChzdHJ1Y3QgcGFydGl0aW9uICopYnVmLCAqbGFyZ2VzdCA9IE5VTEw7CisJaW50IGksIGxhcmdlc3RfY3lsOworCWludCBjeWwsIGV4dF9jeWwsIGVuZF9oZWFkLCBlbmRfY3lsLCBlbmRfc2VjdG9yOworCXVuc2lnbmVkIGludCBsb2dpY2FsX2VuZCwgcGh5c2ljYWxfZW5kLCBleHRfcGh5c2ljYWxfZW5kOworCisKKwlpZiAoKih1bnNpZ25lZCBzaG9ydCAqKSAoYnVmICsgNjQpID09IDB4QUE1NSkgeworCQlmb3IgKGxhcmdlc3RfY3lsID0gLTEsIGkgPSAwOyBpIDwgNDsgKytpLCArK3ApIHsKKwkJCWlmICghcC0+c3lzX2luZCkKKwkJCQljb250aW51ZTsKKyNpZmRlZiBERUJVRworCQkJcHJpbnRrKCJzY3NpY2FtX2Jpb3NfcGFyYW0gOiBwYXJ0aXRpb24gJWQgaGFzIHN5c3RlbSBcbiIsCisJCQkgICAgICAgaSk7CisjZW5kaWYKKwkJCWN5bCA9IHAtPmN5bCArICgocC0+c2VjdG9yICYgMHhjMCkgPDwgMik7CisJCQlpZiAoY3lsID4gbGFyZ2VzdF9jeWwpIHsKKwkJCQlsYXJnZXN0X2N5bCA9IGN5bDsKKwkJCQlsYXJnZXN0ID0gcDsKKwkJCX0KKwkJfQorCX0KKwlpZiAobGFyZ2VzdCkgeworCQllbmRfY3lsID0gbGFyZ2VzdC0+ZW5kX2N5bCArICgobGFyZ2VzdC0+ZW5kX3NlY3RvciAmIDB4YzApIDw8IDIpOworCQllbmRfaGVhZCA9IGxhcmdlc3QtPmVuZF9oZWFkOworCQllbmRfc2VjdG9yID0gbGFyZ2VzdC0+ZW5kX3NlY3RvciAmIDB4M2Y7CisKKwkJaWYgKGVuZF9oZWFkICsgMSA9PSAwIHx8IGVuZF9zZWN0b3IgPT0gMCkKKwkJCXJldHVybiAtMTsKKworI2lmZGVmIERFQlVHCisJCXByaW50aygic2NzaWNhbV9iaW9zX3BhcmFtIDogZW5kIGF0IGggPSAlZCwgYyA9ICVkLCBzID0gJWRcbiIsCisJCSAgICAgICBlbmRfaGVhZCwgZW5kX2N5bCwgZW5kX3NlY3Rvcik7CisjZW5kaWYKKworCQlwaHlzaWNhbF9lbmQgPSBlbmRfY3lsICogKGVuZF9oZWFkICsgMSkgKiBlbmRfc2VjdG9yICsKKwkJICAgIGVuZF9oZWFkICogZW5kX3NlY3RvciArIGVuZF9zZWN0b3I7CisKKwkJLyogVGhpcyBpcyB0aGUgYWN0dWFsIF9zZWN0b3JfIG51bWJlciBhdCB0aGUgZW5kICovCisJCWxvZ2ljYWxfZW5kID0gZ2V0X3VuYWxpZ25lZCgmbGFyZ2VzdC0+c3RhcnRfc2VjdCkKKwkJICAgICsgZ2V0X3VuYWxpZ25lZCgmbGFyZ2VzdC0+bnJfc2VjdHMpOworCisJCS8qIFRoaXMgaXMgZm9yID4xMDIzIGN5bGluZGVycyAqLworCQlleHRfY3lsID0gKGxvZ2ljYWxfZW5kIC0gKGVuZF9oZWFkICogZW5kX3NlY3RvciArIGVuZF9zZWN0b3IpKQorCQkgICAgLyAoZW5kX2hlYWQgKyAxKSAvIGVuZF9zZWN0b3I7CisJCWV4dF9waHlzaWNhbF9lbmQgPSBleHRfY3lsICogKGVuZF9oZWFkICsgMSkgKiBlbmRfc2VjdG9yICsKKwkJICAgIGVuZF9oZWFkICogZW5kX3NlY3RvciArIGVuZF9zZWN0b3I7CisKKyNpZmRlZiBERUJVRworCQlwcmludGsoInNjc2ljYW1fYmlvc19wYXJhbSA6IGxvZ2ljYWxfZW5kPSVkIHBoeXNpY2FsX2VuZD0lZCBleHRfcGh5c2ljYWxfZW5kPSVkIGV4dF9jeWw9JWRcbiIKKwkJICAsbG9naWNhbF9lbmQsIHBoeXNpY2FsX2VuZCwgZXh0X3BoeXNpY2FsX2VuZCwgZXh0X2N5bCk7CisjZW5kaWYKKworCQlpZiAoKGxvZ2ljYWxfZW5kID09IHBoeXNpY2FsX2VuZCkgfHwKKwkJICAoZW5kX2N5bCA9PSAxMDIzICYmIGV4dF9waHlzaWNhbF9lbmQgPT0gbG9naWNhbF9lbmQpKSB7CisJCQkqc2VjcyA9IGVuZF9zZWN0b3I7CisJCQkqaGRzID0gZW5kX2hlYWQgKyAxOworCQkJKmN5bHMgPSBjYXBhY2l0eSAvICgoZW5kX2hlYWQgKyAxKSAqIGVuZF9zZWN0b3IpOworCQkJcmV0dXJuIDA7CisJCX0KKyNpZmRlZiBERUJVRworCQlwcmludGsoInNjc2ljYW1fYmlvc19wYXJhbSA6IGxvZ2ljYWwgKCV1KSAhPSBwaHlzaWNhbCAoJXUpXG4iLAorCQkgICAgICAgbG9naWNhbF9lbmQsIHBoeXNpY2FsX2VuZCk7CisjZW5kaWYKKwl9CisJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3BhcnRzaXplKTsKKworLyoKKyAqIEZ1bmN0aW9uIDogc3RhdGljIGludCBzZXRzaXplKHVuc2lnbmVkIGxvbmcgY2FwYWNpdHksdW5zaWduZWQgaW50ICpjeWxzLAorICogICAgICB1bnNpZ25lZCBpbnQgKmhkcywgdW5zaWduZWQgaW50ICpzZWNzKTsKKyAqCisgKiBQdXJwb3NlIDogdG8gZGV0ZXJtaW5lIGEgbmVhci1vcHRpbWFsIGludCAweDEzIG1hcHBpbmcgZm9yIGEKKyAqICAgICAgU0NTSSBkaXNrIGluIHRlcm1zIG9mIGxvc3Qgc3BhY2Ugb2Ygc2l6ZSBjYXBhY2l0eSwgc3RvcmluZworICogICAgICB0aGUgcmVzdWx0cyBpbiAqY3lscywgKmhkcywgYW5kICpzZWNzLgorICoKKyAqIFJldHVybnMgOiAtMSBvbiBmYWlsdXJlLCAwIG9uIHN1Y2Nlc3MuCisgKgorICogRXh0cmFjdGVkIGZyb20KKyAqCisgKiBXT1JLSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgzVDkuMgorICogRFJBRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc5MkQKKyAqCisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldmlzaW9uIDYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAtTUFSLTk0CisgKiBJbmZvcm1hdGlvbiB0ZWNobm9sb2d5IC0KKyAqIFNDU0ktMiBDb21tb24gYWNjZXNzIG1ldGhvZAorICogdHJhbnNwb3J0IGFuZCBTQ1NJIGludGVyZmFjZSBtb2R1bGUKKyAqIAorICogQU5ORVggQSA6CisgKgorICogc2V0c2l6ZSgpIGNvbnZlcnRzIGEgcmVhZCBjYXBhY2l0eSB2YWx1ZSB0byBpbnQgMTNoCisgKiBoZWFkLWN5bGluZGVyLXNlY3RvciByZXF1aXJlbWVudHMuIEl0IG1pbmltaXplcyB0aGUgdmFsdWUgZm9yCisgKiBudW1iZXIgb2YgaGVhZHMgYW5kIG1heGltaXplcyB0aGUgbnVtYmVyIG9mIGN5bGluZGVycy4gVGhpcworICogd2lsbCBzdXBwb3J0IHJhdGhlciBsYXJnZSBkaXNrcyBiZWZvcmUgdGhlIG51bWJlciBvZiBoZWFkcworICogd2lsbCBub3QgZml0IGluIDQgYml0cyAob3IgNiBiaXRzKS4gVGhpcyBhbGdvcml0aG0gYWxzbworICogbWluaW1pemVzIHRoZSBudW1iZXIgb2Ygc2VjdG9ycyB0aGF0IHdpbGwgYmUgdW51c2VkIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBkaXNrIHdoaWxlIGFsbG93aW5nIGZvciB2ZXJ5IGxhcmdlIGRpc2tzIHRvIGJlCisgKiBhY2NvbW1vZGF0ZWQuIFRoaXMgYWxnb3JpdGhtIGRvZXMgbm90IHVzZSBwaHlzaWNhbCBnZW9tZXRyeS4gCisgKi8KKworc3RhdGljIGludCBzZXRzaXplKHVuc2lnbmVkIGxvbmcgY2FwYWNpdHksIHVuc2lnbmVkIGludCAqY3lscywgdW5zaWduZWQgaW50ICpoZHMsCisJCSAgIHVuc2lnbmVkIGludCAqc2VjcykKK3sKKwl1bnNpZ25lZCBpbnQgcnYgPSAwOworCXVuc2lnbmVkIGxvbmcgaGVhZHMsIHNlY3RvcnMsIGN5bGluZGVycywgdGVtcDsKKworCWN5bGluZGVycyA9IDEwMjRMOwkvKiBTZXQgbnVtYmVyIG9mIGN5bGluZGVycyB0byBtYXggKi8KKwlzZWN0b3JzID0gNjJMOwkJLyogTWF4aW1pemUgc2VjdG9ycyBwZXIgdHJhY2sgKi8KKworCXRlbXAgPSBjeWxpbmRlcnMgKiBzZWN0b3JzOwkvKiBDb21wdXRlIGRpdmlzb3IgZm9yIGhlYWRzICovCisJaGVhZHMgPSBjYXBhY2l0eSAvIHRlbXA7CS8qIENvbXB1dGUgdmFsdWUgZm9yIG51bWJlciBvZiBoZWFkcyAqLworCWlmIChjYXBhY2l0eSAlIHRlbXApIHsJLyogSWYgbm8gcmVtYWluZGVyLCBkb25lISAqLworCQloZWFkcysrOwkvKiBFbHNlLCBpbmNyZW1lbnQgbnVtYmVyIG9mIGhlYWRzICovCisJCXRlbXAgPSBjeWxpbmRlcnMgKiBoZWFkczsJLyogQ29tcHV0ZSBkaXZpc29yIGZvciBzZWN0b3JzICovCisJCXNlY3RvcnMgPSBjYXBhY2l0eSAvIHRlbXA7CS8qIENvbXB1dGUgdmFsdWUgZm9yIHNlY3RvcnMgcGVyCisJCQkJCQkgICB0cmFjayAqLworCQlpZiAoY2FwYWNpdHkgJSB0ZW1wKSB7CS8qIElmIG5vIHJlbWFpbmRlciwgZG9uZSEgKi8KKwkJCXNlY3RvcnMrKzsJLyogRWxzZSwgaW5jcmVtZW50IG51bWJlciBvZiBzZWN0b3JzICovCisJCQl0ZW1wID0gaGVhZHMgKiBzZWN0b3JzOwkJLyogQ29tcHV0ZSBkaXZpc29yIGZvciBjeWxpbmRlcnMgKi8KKwkJCWN5bGluZGVycyA9IGNhcGFjaXR5IC8gdGVtcDsJLyogQ29tcHV0ZSBudW1iZXIgb2YgY3lsaW5kZXJzICovCisJCX0KKwl9CisJaWYgKGN5bGluZGVycyA9PSAwKQorCQlydiA9ICh1bnNpZ25lZCkgLTE7CS8qIEdpdmUgZXJyb3IgaWYgMCBjeWxpbmRlcnMgKi8KKworCSpjeWxzID0gKHVuc2lnbmVkIGludCkgY3lsaW5kZXJzOwkvKiBTdHVmZiByZXR1cm4gdmFsdWVzICovCisJKnNlY3MgPSAodW5zaWduZWQgaW50KSBzZWN0b3JzOworCSpoZHMgPSAodW5zaWduZWQgaW50KSBoZWFkczsKKwlyZXR1cm4gKHJ2KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZC5jIGIvZHJpdmVycy9zY3NpL3NkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhZmIyNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zZC5jCkBAIC0wLDAgKzEsMTc0MCBAQAorLyoKKyAqICAgICAgc2QuYyBDb3B5cmlnaHQgKEMpIDE5OTIgRHJldyBFY2toYXJkdAorICogICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5OSBFcmljIFlvdW5nZGFsZQorICoKKyAqICAgICAgTGludXggc2NzaSBkaXNrIGRyaXZlcgorICogICAgICAgICAgICAgIEluaXRpYWwgdmVyc2lvbnM6IERyZXcgRWNraGFyZHQKKyAqICAgICAgICAgICAgICBTdWJzZXF1ZW50IHJldmlzaW9uczogRXJpYyBZb3VuZ2RhbGUKKyAqCU1vZGlmaWNhdGlvbiBoaXN0b3J5OgorICogICAgICAgLSBEcmV3IEVja2hhcmR0IDxkcmV3QGNvbG9yYWRvLmVkdT4gb3JpZ2luYWwKKyAqICAgICAgIC0gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYW5kYW50ZS5vcmc+IGFkZCBzY2F0dGVyLWdhdGhlciwgbXVsdGlwbGUgCisgKiAgICAgICAgIG91dHN0YW5kaW5nIHJlcXVlc3QsIGFuZCBvdGhlciBlbmhhbmNlbWVudHMuCisgKiAgICAgICAgIFN1cHBvcnQgbG9hZGFibGUgbG93LWxldmVsIHNjc2kgZHJpdmVycy4KKyAqICAgICAgIC0gSmlya2EgSGFuaWthIDxnZW9AZmYuY3VuaS5jej4gc3VwcG9ydCBtb3JlIHNjc2kgZGlza3MgdXNpbmcgCisgKiAgICAgICAgIGVpZ2h0IG1ham9yIG51bWJlcnMuCisgKiAgICAgICAtIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PiBzdXBwb3J0IGRldmZzLgorICoJIC0gVG9yYmVuIE1hdGhpYXNlbiA8dG1tQGltYWdlLmRrPiBSZXNvdXJjZSBhbGxvY2F0aW9uIGZpeGVzIGluIAorICoJICAgc2RfaW5pdCBhbmQgY2xlYW51cHMuCisgKgkgLSBBbGV4IERhdmlzIDxsZXRtZWluQGVyb2xzLmNvbT4gRml4IHByb2JsZW0gd2hlcmUgcGFydGl0aW9uIGluZm8KKyAqCSAgIG5vdCBiZWluZyByZWFkIGluIHNkX29wZW4uIEZpeCBwcm9ibGVtIHdoZXJlIHJlbW92YWJsZSBtZWRpYSAKKyAqCSAgIGNvdWxkIGJlIGVqZWN0ZWQgYWZ0ZXIgc2Rfb3Blbi4KKyAqCSAtIERvdWdsYXMgR2lsYmVydCA8ZGdpbGJlcnRAaW50ZXJsb2cuY29tPiBjbGVhbnVwIGZvciBsayAyLjUueAorICoJIC0gQmFkYXJpIFB1bGF2YXJ0eSA8cGJhZGFyaUB1cy5pYm0uY29tPiwgTWF0dGhldyBXaWxjb3ggCisgKgkgICA8d2lsbHlAZGViaWFuLm9yZz4sIEt1cnQgR2FybG9mZiA8Z2FybG9mZkBzdXNlLmRlPjogCisgKgkgICBTdXBwb3J0IDMyay8xTSBkaXNrcy4KKyAqCisgKglMb2dnaW5nIHBvbGljeSAobmVlZHMgQ09ORklHX1NDU0lfTE9HR0lORyBkZWZpbmVkKToKKyAqCSAtIHNldHRpbmcgdXAgdHJhbnNmZXI6IFNDU0lfTE9HX0hMUVVFVUUgbGV2ZWxzIDEgYW5kIDIKKyAqCSAtIGVuZCBvZiB0cmFuc2ZlciAoYmggKyBzY3NpX2xpYik6IFNDU0lfTE9HX0hMQ09NUExFVEUgbGV2ZWwgMQorICoJIC0gZW50ZXJpbmcgc2RfaW9jdGw6IFNDU0lfTE9HX0lPQ1RMIGxldmVsIDEKKyAqCSAtIGVudGVyaW5nIG90aGVyIGNvbW1hbmRzOiBTQ1NJX0xPR19ITFFVRVVFIGxldmVsIDMKKyAqCU5vdGU6IHdoZW4gdGhlIGxvZ2dpbmcgbGV2ZWwgaXMgc2V0IGJ5IHRoZSB1c2VyLCBpdCBtdXN0IGJlIGdyZWF0ZXIKKyAqCXRoYW4gdGhlIGxldmVsIGluZGljYXRlZCBhYm92ZSB0byB0cmlnZ2VyIG91dHB1dC4JCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtwZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RyaXZlci5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3JlcXVlc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKworI2luY2x1ZGUgInNjc2lfbG9nZ2luZy5oIgorCisvKgorICogTW9yZSB0aGFuIGVub3VnaCBmb3IgZXZlcnlib2R5IDspICBUaGUgaHVnZSBudW1iZXIgb2YgbWFqb3JzCisgKiBpcyBhIGxlZnRvdmVyIGZyb20gMTZiaXQgZGV2X3QgZGF5cywgd2UgZG9uJ3QgcmVhbGx5IG5lZWQgdGhhdAorICogbXVjaCBudW1iZXJzcGFjZS4KKyAqLworI2RlZmluZSBTRF9NQUpPUlMJMTYKKworLyoKKyAqIFRoaXMgaXMgbGltaXRlZCBieSB0aGUgbmFtaW5nIHNjaGVtZSBlbmZvcmNlZCBpbiBzZF9wcm9iZSwKKyAqIGFkZCBhbm90aGVyIGNoYXJhY3RlciB0byBpdCBpZiB5b3UgcmVhbGx5IG5lZWQgbW9yZSBkaXNrcy4KKyAqLworI2RlZmluZSBTRF9NQVhfRElTS1MJKCgoMjYgKiAyNikgKyAyNiArIDEpICogMjYpCisKKy8qCisgKiBUaW1lIG91dCBpbiBzZWNvbmRzIGZvciBkaXNrcyBhbmQgTWFnbmV0by1vcHRpY2FscyAod2hpY2ggYXJlIHNsb3dlcikuCisgKi8KKyNkZWZpbmUgU0RfVElNRU9VVAkJKDMwICogSFopCisjZGVmaW5lIFNEX01PRF9USU1FT1VUCQkoNzUgKiBIWikKKworLyoKKyAqIE51bWJlciBvZiBhbGxvd2VkIHJldHJpZXMKKyAqLworI2RlZmluZSBTRF9NQVhfUkVUUklFUwkJNQorI2RlZmluZSBTRF9QQVNTVEhST1VHSF9SRVRSSUVTCTEKKworc3RhdGljIHZvaWQgc2NzaV9kaXNrX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpOworCitzdHJ1Y3Qgc2NzaV9kaXNrIHsKKwlzdHJ1Y3Qgc2NzaV9kcml2ZXIgKmRyaXZlcjsJLyogYWx3YXlzICZzZF90ZW1wbGF0ZSAqLworCXN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlOworCXN0cnVjdCBrcmVmCWtyZWY7CisJc3RydWN0IGdlbmRpc2sJKmRpc2s7CisJdW5zaWduZWQgaW50CW9wZW5lcnM7CS8qIHByb3RlY3RlZCBieSBCS0wgZm9yIG5vdywgeXVjayAqLworCXNlY3Rvcl90CWNhcGFjaXR5OwkvKiBzaXplIGluIDUxMi1ieXRlIHNlY3RvcnMgKi8KKwl1MzIJCWluZGV4OworCXU4CQltZWRpYV9wcmVzZW50OworCXU4CQl3cml0ZV9wcm90OworCXVuc2lnbmVkCVdDRSA6IDE7CS8qIHN0YXRlIG9mIGRpc2sgV0NFIGJpdCAqLworCXVuc2lnbmVkCVJDRCA6IDE7CS8qIHN0YXRlIG9mIGRpc2sgUkNEIGJpdCwgdW51c2VkICovCit9OworCitzdGF0aWMgREVGSU5FX0lEUihzZF9pbmRleF9pZHIpOworc3RhdGljIERFRklORV9TUElOTE9DSyhzZF9pbmRleF9sb2NrKTsKKworLyogVGhpcyBzZW1hcGhvcmUgaXMgdXNlZCB0byBtZWRpYXRlIHRoZSAwLT4xIHJlZmVyZW5jZSBnZXQgaW4gdGhlCisgKiBmYWNlIG9mIG9iamVjdCBkZXN0cnVjdGlvbiAoaS5lLiB3ZSBjYW4ndCBhbGxvdyBhIGdldCBvbiBhbgorICogb2JqZWN0IGFmdGVyIGxhc3QgcHV0KSAqLworc3RhdGljIERFQ0xBUkVfTVVURVgoc2RfcmVmX3NlbSk7CisKK3N0YXRpYyBpbnQgc2RfcmV2YWxpZGF0ZV9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrKTsKK3N0YXRpYyB2b2lkIHNkX3J3X2ludHIoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KTsKKworc3RhdGljIGludCBzZF9wcm9iZShzdHJ1Y3QgZGV2aWNlICopOworc3RhdGljIGludCBzZF9yZW1vdmUoc3RydWN0IGRldmljZSAqKTsKK3N0YXRpYyB2b2lkIHNkX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZF9yZXNjYW4oc3RydWN0IGRldmljZSAqKTsKK3N0YXRpYyBpbnQgc2RfaW5pdF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgaW50IHNkX2lzc3VlX2ZsdXNoKHN0cnVjdCBkZXZpY2UgKiwgc2VjdG9yX3QgKik7CitzdGF0aWMgdm9pZCBzZF9lbmRfZmx1c2gocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOworc3RhdGljIGludCBzZF9wcmVwYXJlX2ZsdXNoKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKK3N0YXRpYyB2b2lkIHNkX3JlYWRfY2FwYWNpdHkoc3RydWN0IHNjc2lfZGlzayAqc2RrcCwgY2hhciAqZGlza25hbWUsCisJCSBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudCwgdW5zaWduZWQgY2hhciAqYnVmZmVyKTsKKworc3RhdGljIHN0cnVjdCBzY3NpX2RyaXZlciBzZF90ZW1wbGF0ZSA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5nZW5kcnYgPSB7CisJCS5uYW1lCQk9ICJzZCIsCisJCS5wcm9iZQkJPSBzZF9wcm9iZSwKKwkJLnJlbW92ZQkJPSBzZF9yZW1vdmUsCisJCS5zaHV0ZG93bgk9IHNkX3NodXRkb3duLAorCX0sCisJLnJlc2NhbgkJCT0gc2RfcmVzY2FuLAorCS5pbml0X2NvbW1hbmQJCT0gc2RfaW5pdF9jb21tYW5kLAorCS5pc3N1ZV9mbHVzaAkJPSBzZF9pc3N1ZV9mbHVzaCwKKwkucHJlcGFyZV9mbHVzaAkJPSBzZF9wcmVwYXJlX2ZsdXNoLAorCS5lbmRfZmx1c2gJCT0gc2RfZW5kX2ZsdXNoLAorfTsKKworLyoKKyAqIERldmljZSBubyB0byBkaXNrIG1hcHBpbmc6CisgKiAKKyAqICAgICAgIG1ham9yICAgICAgICAgZGlzYzIgICAgIGRpc2MgIHAxCisgKiAgIHwuLi4uLi4uLi4uLi58Li4uLi4uLi4uLi4uLnwuLi4ufC4uLi58IDwtIGRldl90CisgKiAgICAzMSAgICAgICAgMjAgMTkgICAgICAgICAgOCA3ICA0IDMgIDAKKyAqIAorICogSW5zaWRlIGEgbWFqb3IsIHdlIGhhdmUgMTZrIGRpc2tzLCBob3dldmVyIG1hcHBlZCBub24tCisgKiBjb250aWd1b3VzbHkuIFRoZSBmaXJzdCAxNiBkaXNrcyBhcmUgZm9yIG1ham9yMCwgdGhlIG5leHQKKyAqIG9uZXMgd2l0aCBtYWpvcjEsIC4uLiBEaXNrIDI1NiBpcyBmb3IgbWFqb3IwIGFnYWluLCBkaXNrIDI3MiAKKyAqIGZvciBtYWpvcjEsIC4uLiAKKyAqIEFzIHdlIHN0YXkgY29tcGF0aWJsZSB3aXRoIG91ciBudW1iZXJpbmcgc2NoZW1lLCB3ZSBjYW4gcmV1c2UgCisgKiB0aGUgd2VsbC1rbm93IFNDU0kgbWFqb3JzIDgsIDY1LS03MSwgMTM2LS0xNDMuCisgKi8KK3N0YXRpYyBpbnQgc2RfbWFqb3IoaW50IG1ham9yX2lkeCkKK3sKKwlzd2l0Y2ggKG1ham9yX2lkeCkgeworCWNhc2UgMDoKKwkJcmV0dXJuIFNDU0lfRElTSzBfTUFKT1I7CisJY2FzZSAxIC4uLiA3OgorCQlyZXR1cm4gU0NTSV9ESVNLMV9NQUpPUiArIG1ham9yX2lkeCAtIDE7CisJY2FzZSA4IC4uLiAxNToKKwkJcmV0dXJuIFNDU0lfRElTSzhfTUFKT1IgKyBtYWpvcl9pZHggLSA4OworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm4gMDsJLyogc2h1dCB1cCBnY2MgKi8KKwl9Cit9CisKKyNkZWZpbmUgdG9fc2NzaV9kaXNrKG9iaikgY29udGFpbmVyX29mKG9iaixzdHJ1Y3Qgc2NzaV9kaXNrLGtyZWYpCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNjc2lfZGlzayAqc2NzaV9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCXJldHVybiBjb250YWluZXJfb2YoZGlzay0+cHJpdmF0ZV9kYXRhLCBzdHJ1Y3Qgc2NzaV9kaXNrLCBkcml2ZXIpOworfQorCitzdGF0aWMgc3RydWN0IHNjc2lfZGlzayAqc2NzaV9kaXNrX2dldChzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwID0gTlVMTDsKKworCWRvd24oJnNkX3JlZl9zZW0pOworCWlmIChkaXNrLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJc2RrcCA9IHNjc2lfZGlzayhkaXNrKTsKKwlrcmVmX2dldCgmc2RrcC0+a3JlZik7CisJaWYgKHNjc2lfZGV2aWNlX2dldChzZGtwLT5kZXZpY2UpKQorCQlnb3RvIG91dF9wdXQ7CisJdXAoJnNkX3JlZl9zZW0pOworCXJldHVybiBzZGtwOworCisgb3V0X3B1dDoKKwlrcmVmX3B1dCgmc2RrcC0+a3JlZiwgc2NzaV9kaXNrX3JlbGVhc2UpOworCXNka3AgPSBOVUxMOworIG91dDoKKwl1cCgmc2RfcmVmX3NlbSk7CisJcmV0dXJuIHNka3A7Cit9CisKK3N0YXRpYyB2b2lkIHNjc2lfZGlza19wdXQoc3RydWN0IHNjc2lfZGlzayAqc2RrcCkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBzZGtwLT5kZXZpY2U7CisKKwlkb3duKCZzZF9yZWZfc2VtKTsKKwlrcmVmX3B1dCgmc2RrcC0+a3JlZiwgc2NzaV9kaXNrX3JlbGVhc2UpOworCXNjc2lfZGV2aWNlX3B1dChzZGV2KTsKKwl1cCgmc2RfcmVmX3NlbSk7Cit9CisKKy8qKgorICoJc2RfaW5pdF9jb21tYW5kIC0gYnVpbGQgYSBzY3NpIChyZWFkIG9yIHdyaXRlKSBjb21tYW5kIGZyb20KKyAqCWluZm9ybWF0aW9uIGluIHRoZSByZXF1ZXN0IHN0cnVjdHVyZS4KKyAqCUBTQ3BudDogcG9pbnRlciB0byBtaWQtbGV2ZWwncyBwZXIgc2NzaSBjb21tYW5kIHN0cnVjdHVyZSB0aGF0CisgKgljb250YWlucyByZXF1ZXN0IGFuZCBpbnRvIHdoaWNoIHRoZSBzY3NpIGNvbW1hbmQgaXMgd3JpdHRlbgorICoKKyAqCVJldHVybnMgMSBpZiBzdWNjZXNzZnVsIGFuZCAwIGlmIGVycm9yIChvciBjYW5ub3QgYmUgZG9uZSBub3cpLgorICoqLworc3RhdGljIGludCBzZF9pbml0X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KQoreworCXVuc2lnbmVkIGludCB0aGlzX2NvdW50LCB0aW1lb3V0OworCXN0cnVjdCBnZW5kaXNrICpkaXNrOworCXNlY3Rvcl90IGJsb2NrOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RwID0gU0NwbnQtPmRldmljZTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBTQ3BudC0+cmVxdWVzdDsKKworCXRpbWVvdXQgPSBzZHAtPnRpbWVvdXQ7CisKKwkvKgorCSAqIFNHX0lPIGZyb20gYmxvY2sgbGF5ZXIgYWxyZWFkeSBzZXR1cCwganVzdCBjb3B5IGNkYiBiYXNpY2FsbHkKKwkgKi8KKwlpZiAoYmxrX3BjX3JlcXVlc3QocnEpKSB7CisJCWlmIChzaXplb2YocnEtPmNtZCkgPiBzaXplb2YoU0NwbnQtPmNtbmQpKQorCQkJcmV0dXJuIDA7CisKKwkJbWVtY3B5KFNDcG50LT5jbW5kLCBycS0+Y21kLCBzaXplb2YoU0NwbnQtPmNtbmQpKTsKKwkJaWYgKHJxX2RhdGFfZGlyKHJxKSA9PSBXUklURSkKKwkJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7CisJCWVsc2UgaWYgKHJxLT5kYXRhX2xlbikKKwkJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwkJZWxzZQorCQkJU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7CisKKwkJdGhpc19jb3VudCA9IHJxLT5kYXRhX2xlbjsKKwkJaWYgKHJxLT50aW1lb3V0KQorCQkJdGltZW91dCA9IHJxLT50aW1lb3V0OworCisJCVNDcG50LT50cmFuc2ZlcnNpemUgPSBycS0+ZGF0YV9sZW47CisJCVNDcG50LT5hbGxvd2VkID0gU0RfUEFTU1RIUk9VR0hfUkVUUklFUzsKKwkJZ290byBxdWV1ZTsKKwl9CisKKwkvKgorCSAqIHdlIG9ubHkgZG8gUkVRX0NNRCBhbmQgUkVRX0JMT0NLX1BDCisJICovCisJaWYgKCFibGtfZnNfcmVxdWVzdChycSkpCisJCXJldHVybiAwOworCisJZGlzayA9IHJxLT5ycV9kaXNrOworCWJsb2NrID0gcnEtPnNlY3RvcjsKKwl0aGlzX2NvdW50ID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiA+PiA5OworCisJU0NTSV9MT0dfSExRVUVVRSgxLCBwcmludGsoInNkX2luaXRfY29tbWFuZDogZGlzaz0lcywgYmxvY2s9JWxsdSwgIgorCQkJICAgICJjb3VudD0lZFxuIiwgZGlzay0+ZGlza19uYW1lLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpYmxvY2ssIHRoaXNfY291bnQpKTsKKworCWlmICghc2RwIHx8ICFzY3NpX2RldmljZV9vbmxpbmUoc2RwKSB8fAorIAkgICAgYmxvY2sgKyBycS0+bnJfc2VjdG9ycyA+IGdldF9jYXBhY2l0eShkaXNrKSkgeworCQlTQ1NJX0xPR19ITFFVRVVFKDIsIHByaW50aygiRmluaXNoaW5nICVsZCBzZWN0b3JzXG4iLCAKKwkJCQkgcnEtPm5yX3NlY3RvcnMpKTsKKwkJU0NTSV9MT0dfSExRVUVVRSgyLCBwcmludGsoIlJldHJ5IHdpdGggMHglcFxuIiwgU0NwbnQpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNkcC0+Y2hhbmdlZCkgeworCQkvKgorCQkgKiBxdWlldGx5IHJlZnVzZSB0byBkbyBhbnl0aGluZyB0byBhIGNoYW5nZWQgZGlzYyB1bnRpbCAKKwkJICogdGhlIGNoYW5nZWQgYml0IGhhcyBiZWVuIHJlc2V0CisJCSAqLworCQkvKiBwcmludGsoIlNDU0kgZGlzayBoYXMgYmVlbiBjaGFuZ2VkLiBQcm9oaWJpdGluZyBmdXJ0aGVyIEkvTy5cbiIpOyAqLworCQlyZXR1cm4gMDsKKwl9CisJU0NTSV9MT0dfSExRVUVVRSgyLCBwcmludGsoIiVzIDogYmxvY2s9JWxsdVxuIiwKKwkJCQkgICBkaXNrLT5kaXNrX25hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcpYmxvY2spKTsKKworCS8qCisJICogSWYgd2UgaGF2ZSBhIDFLIGhhcmR3YXJlIHNlY3RvcnNpemUsIHByZXZlbnQgYWNjZXNzIHRvIHNpbmdsZQorCSAqIDUxMiBieXRlIHNlY3RvcnMuICBJbiB0aGVvcnkgd2UgY291bGQgaGFuZGxlIHRoaXMgLSBpbiBmYWN0CisJICogdGhlIHNjc2kgY2Ryb20gZHJpdmVyIG11c3QgYmUgYWJsZSB0byBoYW5kbGUgdGhpcyBiZWNhdXNlCisJICogd2UgdHlwaWNhbGx5IHVzZSAxSyBibG9ja3NpemVzLCBhbmQgY2Ryb21zIHR5cGljYWxseSBoYXZlCisJICogMksgaGFyZHdhcmUgc2VjdG9yc2l6ZXMuICBPZiBjb3Vyc2UsIHRoaW5ncyBhcmUgc2ltcGxlcgorCSAqIHdpdGggdGhlIGNkcm9tLCBzaW5jZSBpdCBpcyByZWFkLW9ubHkuICBGb3IgcGVyZm9ybWFuY2UKKwkgKiByZWFzb25zLCB0aGUgZmlsZXN5c3RlbXMgc2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIHRoaXMKKwkgKiBhbmQgbm90IGZvcmNlIHRoZSBzY3NpIGRpc2sgZHJpdmVyIHRvIHVzZSBib3VuY2UgYnVmZmVycworCSAqIGZvciB0aGlzLgorCSAqLworCWlmIChzZHAtPnNlY3Rvcl9zaXplID09IDEwMjQpIHsKKwkJaWYgKChibG9jayAmIDEpIHx8IChycS0+bnJfc2VjdG9ycyAmIDEpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNkOiBCYWQgYmxvY2sgbnVtYmVyIHJlcXVlc3RlZCIpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlibG9jayA9IGJsb2NrID4+IDE7CisJCQl0aGlzX2NvdW50ID0gdGhpc19jb3VudCA+PiAxOworCQl9CisJfQorCWlmIChzZHAtPnNlY3Rvcl9zaXplID09IDIwNDgpIHsKKwkJaWYgKChibG9jayAmIDMpIHx8IChycS0+bnJfc2VjdG9ycyAmIDMpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNkOiBCYWQgYmxvY2sgbnVtYmVyIHJlcXVlc3RlZCIpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlibG9jayA9IGJsb2NrID4+IDI7CisJCQl0aGlzX2NvdW50ID0gdGhpc19jb3VudCA+PiAyOworCQl9CisJfQorCWlmIChzZHAtPnNlY3Rvcl9zaXplID09IDQwOTYpIHsKKwkJaWYgKChibG9jayAmIDcpIHx8IChycS0+bnJfc2VjdG9ycyAmIDcpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNkOiBCYWQgYmxvY2sgbnVtYmVyIHJlcXVlc3RlZCIpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlibG9jayA9IGJsb2NrID4+IDM7CisJCQl0aGlzX2NvdW50ID0gdGhpc19jb3VudCA+PiAzOworCQl9CisJfQorCWlmIChycV9kYXRhX2RpcihycSkgPT0gV1JJVEUpIHsKKwkJaWYgKCFzZHAtPndyaXRlYWJsZSkgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJU0NwbnQtPmNtbmRbMF0gPSBXUklURV82OworCQlTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBETUFfVE9fREVWSUNFOworCX0gZWxzZSBpZiAocnFfZGF0YV9kaXIocnEpID09IFJFQUQpIHsKKwkJU0NwbnQtPmNtbmRbMF0gPSBSRUFEXzY7CisJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgInNkOiBVbmtub3duIGNvbW1hbmQgJWx4XG4iLCBycS0+ZmxhZ3MpOworLyogb3ZlcmtpbGwgCXBhbmljKCJVbmtub3duIHNkIGNvbW1hbmQgJWx4XG4iLCBycS0+ZmxhZ3MpOyAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlTQ1NJX0xPR19ITFFVRVVFKDIsIHByaW50aygiJXMgOiAlcyAlZC8lbGQgNTEyIGJ5dGUgYmxvY2tzLlxuIiwgCisJCWRpc2stPmRpc2tfbmFtZSwgKHJxX2RhdGFfZGlyKHJxKSA9PSBXUklURSkgPyAKKwkJIndyaXRpbmciIDogInJlYWRpbmciLCB0aGlzX2NvdW50LCBycS0+bnJfc2VjdG9ycykpOworCisJU0NwbnQtPmNtbmRbMV0gPSAwOworCQorCWlmIChibG9jayA+IDB4ZmZmZmZmZmYpIHsKKwkJU0NwbnQtPmNtbmRbMF0gKz0gUkVBRF8xNiAtIFJFQURfNjsKKwkJU0NwbnQtPmNtbmRbMl0gPSBzaXplb2YoYmxvY2spID4gNCA/ICh1bnNpZ25lZCBjaGFyKSAoYmxvY2sgPj4gNTYpICYgMHhmZiA6IDA7CisJCVNDcG50LT5jbW5kWzNdID0gc2l6ZW9mKGJsb2NrKSA+IDQgPyAodW5zaWduZWQgY2hhcikgKGJsb2NrID4+IDQ4KSAmIDB4ZmYgOiAwOworCQlTQ3BudC0+Y21uZFs0XSA9IHNpemVvZihibG9jaykgPiA0ID8gKHVuc2lnbmVkIGNoYXIpIChibG9jayA+PiA0MCkgJiAweGZmIDogMDsKKwkJU0NwbnQtPmNtbmRbNV0gPSBzaXplb2YoYmxvY2spID4gNCA/ICh1bnNpZ25lZCBjaGFyKSAoYmxvY2sgPj4gMzIpICYgMHhmZiA6IDA7CisJCVNDcG50LT5jbW5kWzZdID0gKHVuc2lnbmVkIGNoYXIpIChibG9jayA+PiAyNCkgJiAweGZmOworCQlTQ3BudC0+Y21uZFs3XSA9ICh1bnNpZ25lZCBjaGFyKSAoYmxvY2sgPj4gMTYpICYgMHhmZjsKKwkJU0NwbnQtPmNtbmRbOF0gPSAodW5zaWduZWQgY2hhcikgKGJsb2NrID4+IDgpICYgMHhmZjsKKwkJU0NwbnQtPmNtbmRbOV0gPSAodW5zaWduZWQgY2hhcikgYmxvY2sgJiAweGZmOworCQlTQ3BudC0+Y21uZFsxMF0gPSAodW5zaWduZWQgY2hhcikgKHRoaXNfY291bnQgPj4gMjQpICYgMHhmZjsKKwkJU0NwbnQtPmNtbmRbMTFdID0gKHVuc2lnbmVkIGNoYXIpICh0aGlzX2NvdW50ID4+IDE2KSAmIDB4ZmY7CisJCVNDcG50LT5jbW5kWzEyXSA9ICh1bnNpZ25lZCBjaGFyKSAodGhpc19jb3VudCA+PiA4KSAmIDB4ZmY7CisJCVNDcG50LT5jbW5kWzEzXSA9ICh1bnNpZ25lZCBjaGFyKSB0aGlzX2NvdW50ICYgMHhmZjsKKwkJU0NwbnQtPmNtbmRbMTRdID0gU0NwbnQtPmNtbmRbMTVdID0gMDsKKwl9IGVsc2UgaWYgKCh0aGlzX2NvdW50ID4gMHhmZikgfHwgKGJsb2NrID4gMHgxZmZmZmYpIHx8CisJCSAgIFNDcG50LT5kZXZpY2UtPnVzZV8xMF9mb3JfcncpIHsKKwkJaWYgKHRoaXNfY291bnQgPiAweGZmZmYpCisJCQl0aGlzX2NvdW50ID0gMHhmZmZmOworCisJCVNDcG50LT5jbW5kWzBdICs9IFJFQURfMTAgLSBSRUFEXzY7CisJCVNDcG50LT5jbW5kWzJdID0gKHVuc2lnbmVkIGNoYXIpIChibG9jayA+PiAyNCkgJiAweGZmOworCQlTQ3BudC0+Y21uZFszXSA9ICh1bnNpZ25lZCBjaGFyKSAoYmxvY2sgPj4gMTYpICYgMHhmZjsKKwkJU0NwbnQtPmNtbmRbNF0gPSAodW5zaWduZWQgY2hhcikgKGJsb2NrID4+IDgpICYgMHhmZjsKKwkJU0NwbnQtPmNtbmRbNV0gPSAodW5zaWduZWQgY2hhcikgYmxvY2sgJiAweGZmOworCQlTQ3BudC0+Y21uZFs2XSA9IFNDcG50LT5jbW5kWzldID0gMDsKKwkJU0NwbnQtPmNtbmRbN10gPSAodW5zaWduZWQgY2hhcikgKHRoaXNfY291bnQgPj4gOCkgJiAweGZmOworCQlTQ3BudC0+Y21uZFs4XSA9ICh1bnNpZ25lZCBjaGFyKSB0aGlzX2NvdW50ICYgMHhmZjsKKwl9IGVsc2UgeworCQlpZiAodGhpc19jb3VudCA+IDB4ZmYpCisJCQl0aGlzX2NvdW50ID0gMHhmZjsKKworCQlTQ3BudC0+Y21uZFsxXSB8PSAodW5zaWduZWQgY2hhcikgKChibG9jayA+PiAxNikgJiAweDFmKTsKKwkJU0NwbnQtPmNtbmRbMl0gPSAodW5zaWduZWQgY2hhcikgKChibG9jayA+PiA4KSAmIDB4ZmYpOworCQlTQ3BudC0+Y21uZFszXSA9ICh1bnNpZ25lZCBjaGFyKSBibG9jayAmIDB4ZmY7CisJCVNDcG50LT5jbW5kWzRdID0gKHVuc2lnbmVkIGNoYXIpIHRoaXNfY291bnQ7CisJCVNDcG50LT5jbW5kWzVdID0gMDsKKwl9CisJU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiA9IFNDcG50LT5idWZmbGVuID0KKwkJCXRoaXNfY291bnQgKiBzZHAtPnNlY3Rvcl9zaXplOworCisJLyoKKwkgKiBXZSBzaG91bGRuJ3QgZGlzY29ubmVjdCBpbiB0aGUgbWlkZGxlIG9mIGEgc2VjdG9yLCBzbyB3aXRoIGEgZHVtYgorCSAqIGhvc3QgYWRhcHRlciwgaXQncyBzYWZlIHRvIGFzc3VtZSB0aGF0IHdlIGNhbiBhdCBsZWFzdCB0cmFuc2ZlcgorCSAqIHRoaXMgbWFueSBieXRlcyBiZXR3ZWVuIGVhY2ggY29ubmVjdCAvIGRpc2Nvbm5lY3QuCisJICovCisJU0NwbnQtPnRyYW5zZmVyc2l6ZSA9IHNkcC0+c2VjdG9yX3NpemU7CisJU0NwbnQtPnVuZGVyZmxvdyA9IHRoaXNfY291bnQgPDwgOTsKKwlTQ3BudC0+YWxsb3dlZCA9IFNEX01BWF9SRVRSSUVTOworCitxdWV1ZToKKwlTQ3BudC0+dGltZW91dF9wZXJfY29tbWFuZCA9IHRpbWVvdXQ7CisKKwkvKgorCSAqIFRoaXMgaXMgdGhlIGNvbXBsZXRpb24gcm91dGluZSB3ZSB1c2UuICBUaGlzIGlzIG1hdGNoZWQgaW4gdGVybXMKKwkgKiBvZiBjYXBhYmlsaXR5IHRvIHRoaXMgZnVuY3Rpb24uCisJICovCisJU0NwbnQtPmRvbmUgPSBzZF9yd19pbnRyOworCisJLyoKKwkgKiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBjb21tYW5kIGlzIHJlYWR5IGZyb20gb3VyIGVuZCB0byBiZQorCSAqIHF1ZXVlZC4KKwkgKi8KKwlyZXR1cm4gMTsKK30KKworLyoqCisgKglzZF9vcGVuIC0gb3BlbiBhIHNjc2kgZGlzayBkZXZpY2UKKyAqCUBpbm9kZTogb25seSBpX3JkZXYgbWVtYmVyIG1heSBiZSB1c2VkCisgKglAZmlscDogb25seSBmX21vZGUgYW5kIGZfZmxhZ3MgbWF5IGJlIHVzZWQKKyAqCisgKglSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gUmV0dXJucyBhIG5lZ2F0ZWQgZXJybm8gdmFsdWUgaW4gY2FzZSAKKyAqCW9mIGVycm9yLgorICoKKyAqCU5vdGU6IFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIGEgdXNlciBjb250ZXh0IChlLmcuIGZzY2soMSkgKQorICoJb3IgZnJvbSB3aXRoaW4gdGhlIGtlcm5lbCAoZS5nLiBhcyBhIHJlc3VsdCBvZiBhIG1vdW50KDEpICkuCisgKglJbiB0aGUgbGF0dGVyIGNhc2UgQGlub2RlIGFuZCBAZmlscCBjYXJyeSBhbiBhYnJpZGdlZCBhbW91bnQKKyAqCW9mIGluZm9ybWF0aW9uIGFzIG5vdGVkIGFib3ZlLgorICoqLworc3RhdGljIGludCBzZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzazsKKwlzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKwlpbnQgcmV0dmFsOworCisJaWYgKCEoc2RrcCA9IHNjc2lfZGlza19nZXQoZGlzaykpKQorCQlyZXR1cm4gLUVOWElPOworCisKKwlTQ1NJX0xPR19ITFFVRVVFKDMsIHByaW50aygic2Rfb3BlbjogZGlzaz0lc1xuIiwgZGlzay0+ZGlza19uYW1lKSk7CisKKwlzZGV2ID0gc2RrcC0+ZGV2aWNlOworCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGlzIGluIGVycm9yIHJlY292ZXJ5LCB3YWl0IHVudGlsIGl0IGlzIGRvbmUuCisJICogSWYgdGhlIGRldmljZSBpcyBvZmZsaW5lLCB0aGVuIGRpc2FsbG93IGFueSBhY2Nlc3MgdG8gaXQuCisJICovCisJcmV0dmFsID0gLUVOWElPOworCWlmICghc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKHNkZXYpKQorCQlnb3RvIGVycm9yX291dDsKKworCWlmIChzZGV2LT5yZW1vdmFibGUgfHwgc2RrcC0+d3JpdGVfcHJvdCkKKwkJY2hlY2tfZGlza19jaGFuZ2UoaW5vZGUtPmlfYmRldik7CisKKwkvKgorCSAqIElmIHRoZSBkcml2ZSBpcyBlbXB0eSwganVzdCBsZXQgdGhlIG9wZW4gZmFpbC4KKwkgKi8KKwlyZXR2YWwgPSAtRU5PTUVESVVNOworCWlmIChzZGV2LT5yZW1vdmFibGUgJiYgIXNka3AtPm1lZGlhX3ByZXNlbnQgJiYKKwkgICAgIShmaWxwLT5mX2ZsYWdzICYgT19OREVMQVkpKQorCQlnb3RvIGVycm9yX291dDsKKworCS8qCisJICogSWYgdGhlIGRldmljZSBoYXMgdGhlIHdyaXRlIHByb3RlY3QgdGFiIHNldCwgaGF2ZSB0aGUgb3BlbiBmYWlsCisJICogaWYgdGhlIHVzZXIgZXhwZWN0cyB0byBiZSBhYmxlIHRvIHdyaXRlIHRvIHRoZSB0aGluZy4KKwkgKi8KKwlyZXR2YWwgPSAtRVJPRlM7CisJaWYgKHNka3AtPndyaXRlX3Byb3QgJiYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJZ290byBlcnJvcl9vdXQ7CisKKwkvKgorCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGRpc2sgY2hhbmdpbmcgc3R1ZmYgcmVzdWx0ZWQgaW4KKwkgKiB0aGUgZGV2aWNlIGJlaW5nIHRha2VuIG9mZmxpbmUuICBJZiB0aGlzIGlzIHRoZSBjYXNlLAorCSAqIHJlcG9ydCB0aGlzIHRvIHRoZSB1c2VyLCBhbmQgZG9uJ3QgcHJldGVuZCB0aGF0IHRoZQorCSAqIG9wZW4gYWN0dWFsbHkgc3VjY2VlZGVkLgorCSAqLworCXJldHZhbCA9IC1FTlhJTzsKKwlpZiAoIXNjc2lfZGV2aWNlX29ubGluZShzZGV2KSkKKwkJZ290byBlcnJvcl9vdXQ7CisKKwlpZiAoIXNka3AtPm9wZW5lcnMrKyAmJiBzZGV2LT5yZW1vdmFibGUpIHsKKwkJaWYgKHNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhzZGV2KSkKKwkJCXNjc2lfc2V0X21lZGl1bV9yZW1vdmFsKHNkZXYsIFNDU0lfUkVNT1ZBTF9QUkVWRU5UKTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyb3Jfb3V0OgorCXNjc2lfZGlza19wdXQoc2RrcCk7CisJcmV0dXJuIHJldHZhbDsJCit9CisKKy8qKgorICoJc2RfcmVsZWFzZSAtIGludm9rZWQgd2hlbiB0aGUgKGxhc3QpIGNsb3NlKDIpIGlzIGNhbGxlZCBvbiB0aGlzCisgKglzY3NpIGRpc2suCisgKglAaW5vZGU6IG9ubHkgaV9yZGV2IG1lbWJlciBtYXkgYmUgdXNlZAorICoJQGZpbHA6IG9ubHkgZl9tb2RlIGFuZCBmX2ZsYWdzIG1heSBiZSB1c2VkCisgKgorICoJUmV0dXJucyAwLiAKKyAqCisgKglOb3RlOiBtYXkgYmxvY2sgKHVuaW50ZXJydXB0aWJsZSkgaWYgZXJyb3IgcmVjb3ZlcnkgaXMgdW5kZXJ3YXkKKyAqCW9uIHRoaXMgZGlzay4KKyAqKi8KK3N0YXRpYyBpbnQgc2RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2s7CisJc3RydWN0IHNjc2lfZGlzayAqc2RrcCA9IHNjc2lfZGlzayhkaXNrKTsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBzZGtwLT5kZXZpY2U7CisKKwlTQ1NJX0xPR19ITFFVRVVFKDMsIHByaW50aygic2RfcmVsZWFzZTogZGlzaz0lc1xuIiwgZGlzay0+ZGlza19uYW1lKSk7CisKKwlpZiAoIS0tc2RrcC0+b3BlbmVycyAmJiBzZGV2LT5yZW1vdmFibGUpIHsKKwkJaWYgKHNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhzZGV2KSkKKwkJCXNjc2lfc2V0X21lZGl1bV9yZW1vdmFsKHNkZXYsIFNDU0lfUkVNT1ZBTF9BTExPVyk7CisJfQorCisJLyoKKwkgKiBYWFggYW5kIHdoYXQgaWYgdGhlcmUgYXJlIHBhY2tldHMgaW4gZmxpZ2h0IGFuZCB0aGlzIGNsb3NlKCkKKwkgKiBYWFggaXMgZm9sbG93ZWQgYnkgYSAicm1tb2Qgc2RfbW9kIj8KKwkgKi8KKwlzY3NpX2Rpc2tfcHV0KHNka3ApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX2hkaW9fZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSBfX3VzZXIgKmxvYykKK3sKKwlzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwID0gc2NzaV9kaXNrKGJkZXYtPmJkX2Rpc2spOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RwID0gc2RrcC0+ZGV2aWNlOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBzZHAtPmhvc3Q7CisJaW50IGRpc2tpbmZvWzRdOworCisJLyogZGVmYXVsdCB0byBtb3N0IGNvbW1vbmx5IHVzZWQgdmFsdWVzICovCisgICAgICAgIGRpc2tpbmZvWzBdID0gMHg0MDsJLyogMSA8PCA2ICovCisgICAgICAgCWRpc2tpbmZvWzFdID0gMHgyMDsJLyogMSA8PCA1ICovCisgICAgICAgCWRpc2tpbmZvWzJdID0gc2RrcC0+Y2FwYWNpdHkgPj4gMTE7CisJCisJLyogb3ZlcnJpZGUgd2l0aCBjYWxjdWxhdGVkLCBleHRlbmRlZCBkZWZhdWx0LCBvciBkcml2ZXIgdmFsdWVzICovCisJaWYgKGhvc3QtPmhvc3R0LT5iaW9zX3BhcmFtKQorCQlob3N0LT5ob3N0dC0+Ymlvc19wYXJhbShzZHAsIGJkZXYsIHNka3AtPmNhcGFjaXR5LCBkaXNraW5mbyk7CisJZWxzZQorCQlzY3NpY2FtX2Jpb3NfcGFyYW0oYmRldiwgc2RrcC0+Y2FwYWNpdHksIGRpc2tpbmZvKTsKKworCWlmIChwdXRfdXNlcihkaXNraW5mb1swXSwgJmxvYy0+aGVhZHMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAocHV0X3VzZXIoZGlza2luZm9bMV0sICZsb2MtPnNlY3RvcnMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAocHV0X3VzZXIoZGlza2luZm9bMl0sICZsb2MtPmN5bGluZGVycykpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChwdXRfdXNlcigodW5zaWduZWQpZ2V0X3N0YXJ0X3NlY3QoYmRldiksCisJICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSZsb2MtPnN0YXJ0KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2RfaW9jdGwgLSBwcm9jZXNzIGFuIGlvY3RsCisgKglAaW5vZGU6IG9ubHkgaV9yZGV2L2lfYmRldiBtZW1iZXJzIG1heSBiZSB1c2VkCisgKglAZmlscDogb25seSBmX21vZGUgYW5kIGZfZmxhZ3MgbWF5IGJlIHVzZWQKKyAqCUBjbWQ6IGlvY3RsIGNvbW1hbmQgbnVtYmVyCisgKglAYXJnOiB0aGlzIGlzIHRoaXJkIGFyZ3VtZW50IGdpdmVuIHRvIGlvY3RsKDIpIHN5c3RlbSBjYWxsLgorICoJT2Z0ZW4gY29udGFpbnMgYSBwb2ludGVyLgorICoKKyAqCVJldHVybnMgMCBpZiBzdWNjZXNzZnVsIChzb21lIGlvY3RscyByZXR1cm4gcG9zdGl2ZSBudW1iZXJzIG9uCisgKglzdWNjZXNzIGFzIHdlbGwpLiBSZXR1cm5zIGEgbmVnYXRlZCBlcnJubyB2YWx1ZSBpbiBjYXNlIG9mIGVycm9yLgorICoKKyAqCU5vdGU6IG1vc3QgaW9jdGxzIGFyZSBmb3J3YXJkIG9udG8gdGhlIGJsb2NrIHN1YnN5c3RlbSBvciBmdXJ0aGVyCisgKglkb3duIGluIHRoZSBzY3NpIHN1YnN5dGVtLgorICoqLworc3RhdGljIGludCBzZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwLCAKKwkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBpbm9kZS0+aV9iZGV2OworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gYmRldi0+YmRfZGlzazsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCA9IHNjc2lfZGlzayhkaXNrKS0+ZGV2aWNlOworCXZvaWQgX191c2VyICpwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBlcnJvcjsKKyAgICAKKwlTQ1NJX0xPR19JT0NUTCgxLCBwcmludGsoInNkX2lvY3RsOiBkaXNrPSVzLCBjbWQ9MHgleFxuIiwKKwkJCQkJCWRpc2stPmRpc2tfbmFtZSwgY21kKSk7CisKKwkvKgorCSAqIElmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGVycm9yIHJlY292ZXJ5LCBkb24ndCBsZXQgYW55b25lCisJICogZWxzZSB0cnkgYW5kIHVzZSB0aGlzIGRldmljZS4gIEFsc28sIGlmIGVycm9yIHJlY292ZXJ5IGZhaWxzLCBpdAorCSAqIG1heSB0cnkgYW5kIHRha2UgdGhlIGRldmljZSBvZmZsaW5lLCBpbiB3aGljaCBjYXNlIGFsbCBmdXJ0aGVyCisJICogYWNjZXNzIHRvIHRoZSBkZXZpY2UgaXMgcHJvaGliaXRlZC4KKwkgKi8KKwllcnJvciA9IHNjc2lfbm9uYmxvY2thYmxlX2lvY3RsKHNkcCwgY21kLCBwLCBmaWxwKTsKKwlpZiAoIXNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhzZHApIHx8ICFlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKGNtZCA9PSBIRElPX0dFVEdFTykgeworCQlpZiAoIWFyZykKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gc2RfaGRpb19nZXRnZW8oYmRldiwgcCk7CisJfQorCisJLyoKKwkgKiBTZW5kIFNDU0kgYWRkcmVzc2luZyBpb2N0bHMgZGlyZWN0bHkgdG8gbWlkIGxldmVsLCBzZW5kIG90aGVyCisJICogaW9jdGxzIHRvIGJsb2NrIGxldmVsIGFuZCB0aGVuIG9udG8gbWlkIGxldmVsIGlmIHRoZXkgY2FuJ3QgYmUKKwkgKiByZXNvbHZlZC4KKwkgKi8KKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFNDU0lfSU9DVExfR0VUX0lETFVOOgorCQljYXNlIFNDU0lfSU9DVExfR0VUX0JVU19OVU1CRVI6CisJCQlyZXR1cm4gc2NzaV9pb2N0bChzZHAsIGNtZCwgcCk7CisJCWRlZmF1bHQ6CisJCQllcnJvciA9IHNjc2lfY21kX2lvY3RsKGZpbHAsIGRpc2ssIGNtZCwgcCk7CisJCQlpZiAoZXJyb3IgIT0gLUVOT1RUWSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJfQorCXJldHVybiBzY3NpX2lvY3RsKHNkcCwgY21kLCBwKTsKK30KKworc3RhdGljIHZvaWQgc2V0X21lZGlhX25vdF9wcmVzZW50KHN0cnVjdCBzY3NpX2Rpc2sgKnNka3ApCit7CisJc2RrcC0+bWVkaWFfcHJlc2VudCA9IDA7CisJc2RrcC0+Y2FwYWNpdHkgPSAwOworCXNka3AtPmRldmljZS0+Y2hhbmdlZCA9IDE7Cit9CisKKy8qKgorICoJc2RfbWVkaWFfY2hhbmdlZCAtIGNoZWNrIGlmIG91ciBtZWRpdW0gY2hhbmdlZAorICoJQGRpc2s6IGtlcm5lbCBkZXZpY2UgZGVzY3JpcHRvciAKKyAqCisgKglSZXR1cm5zIDAgaWYgbm90IGFwcGxpY2FibGUgb3Igbm8gY2hhbmdlOyAxIGlmIGNoYW5nZQorICoKKyAqCU5vdGU6IHRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCBmcm9tIHRoZSBibG9jayBzdWJzeXN0ZW0uCisgKiovCitzdGF0aWMgaW50IHNkX21lZGlhX2NoYW5nZWQoc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJc3RydWN0IHNjc2lfZGlzayAqc2RrcCA9IHNjc2lfZGlzayhkaXNrKTsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCA9IHNka3AtPmRldmljZTsKKwlpbnQgcmV0dmFsOworCisJU0NTSV9MT0dfSExRVUVVRSgzLCBwcmludGsoInNkX21lZGlhX2NoYW5nZWQ6IGRpc2s9JXNcbiIsCisJCQkJCQlkaXNrLT5kaXNrX25hbWUpKTsKKworCWlmICghc2RwLT5yZW1vdmFibGUpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGlzIG9mZmxpbmUsIGRvbid0IHNlbmQgYW55IGNvbW1hbmRzIC0ganVzdCBwcmV0ZW5kIGFzCisJICogaWYgdGhlIGNvbW1hbmQgZmFpbGVkLiAgSWYgdGhlIGRldmljZSBldmVyIGNvbWVzIGJhY2sgb25saW5lLCB3ZQorCSAqIGNhbiBkZWFsIHdpdGggaXQgdGhlbi4gIEl0IGlzIG9ubHkgYmVjYXVzZSBvZiB1bnJlY292ZXJhYmxlIGVycm9ycworCSAqIHRoYXQgd2Ugd291bGQgZXZlciB0YWtlIGEgZGV2aWNlIG9mZmxpbmUgaW4gdGhlIGZpcnN0IHBsYWNlLgorCSAqLworCWlmICghc2NzaV9kZXZpY2Vfb25saW5lKHNkcCkpCisJCWdvdG8gbm90X3ByZXNlbnQ7CisKKwkvKgorCSAqIFVzaW5nIFRFU1RfVU5JVF9SRUFEWSBlbmFibGVzIGRpZmZlcmVudGlhdGlvbiBiZXR3ZWVuIGRyaXZlIHdpdGgKKwkgKiBubyBjYXJ0cmlkZ2UgbG9hZGVkIC0gTk9UIFJFQURZLCBkcml2ZSB3aXRoIGNoYW5nZWQgY2FydHJpZGdlIC0KKwkgKiBVTklUIEFUVEVOVElPTiwgb3Igd2l0aCBzYW1lIGNhcnRyaWRnZSAtIEdPT0QgU1RBVFVTLgorCSAqCisJICogRHJpdmVzIHRoYXQgYXV0byBzcGluIGRvd24uIGVnIGlvbWVnYSBqYXogMUcsIHdpbGwgYmUgc3RhcnRlZAorCSAqIGJ5IHNkX3NwaW51cF9kaXNrKCkgZnJvbSBzZF9yZXZhbGlkYXRlX2Rpc2soKSwgd2hpY2ggaGFwcGVucyB3aGVuZXZlcgorCSAqIHNkX3JldmFsaWRhdGUoKSBpcyBjYWxsZWQuCisJICovCisJcmV0dmFsID0gLUVOT0RFVjsKKwlpZiAoc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKHNkcCkpCisJCXJldHZhbCA9IHNjc2lfdGVzdF91bml0X3JlYWR5KHNkcCwgU0RfVElNRU9VVCwgU0RfTUFYX1JFVFJJRVMpOworCisJLyoKKwkgKiBVbmFibGUgdG8gdGVzdCwgdW5pdCBwcm9iYWJseSBub3QgcmVhZHkuICAgVGhpcyB1c3VhbGx5CisJICogbWVhbnMgdGhlcmUgaXMgbm8gZGlzYyBpbiB0aGUgZHJpdmUuICBNYXJrIGFzIGNoYW5nZWQsCisJICogYW5kIHdlIHdpbGwgZmlndXJlIGl0IG91dCBsYXRlciBvbmNlIHRoZSBkcml2ZSBpcworCSAqIGF2YWlsYWJsZSBhZ2Fpbi4KKwkgKi8KKwlpZiAocmV0dmFsKQorCQkgZ290byBub3RfcHJlc2VudDsKKworCS8qCisJICogRm9yIHJlbW92YWJsZSBzY3NpIGRpc2sgd2UgaGF2ZSB0byByZWNvZ25pc2UgdGhlIHByZXNlbmNlCisJICogb2YgYSBkaXNrIGluIHRoZSBkcml2ZS4gVGhpcyBpcyBrZXB0IGluIHRoZSBzdHJ1Y3Qgc2NzaV9kaXNrCisJICogc3RydWN0IGFuZCB0ZXN0ZWQgYXQgb3BlbiAhICBEYW5pZWwgUm9jaGUgKGRhbkBsZWN0cmEuZnIpCisJICovCisJc2RrcC0+bWVkaWFfcHJlc2VudCA9IDE7CisKKwlyZXR2YWwgPSBzZHAtPmNoYW5nZWQ7CisJc2RwLT5jaGFuZ2VkID0gMDsKKworCXJldHVybiByZXR2YWw7CisKK25vdF9wcmVzZW50OgorCXNldF9tZWRpYV9ub3RfcHJlc2VudChzZGtwKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzZF9zeW5jX2NhY2hlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RwKQoreworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXE7CisJaW50IHJldHJpZXMsIHJlczsKKworCWlmICghc2NzaV9kZXZpY2Vfb25saW5lKHNkcCkpCisJCXJldHVybiAtRU5PREVWOworCisJc3JlcSA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChzZHAsIEdGUF9LRVJORUwpOworCWlmICghc3JlcSkgeworCQlwcmludGsoIkZBSUxFRFxuICBObyBtZW1vcnkgZm9yIHJlcXVlc3RcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOworCWZvciAocmV0cmllcyA9IDM7IHJldHJpZXMgPiAwOyAtLXJldHJpZXMpIHsKKwkJdW5zaWduZWQgY2hhciBjbWRbMTBdID0geyAwIH07CisKKwkJY21kWzBdID0gU1lOQ0hST05JWkVfQ0FDSEU7CisJCS8qCisJCSAqIExlYXZlIHRoZSByZXN0IG9mIHRoZSBjb21tYW5kIHplcm8gdG8gaW5kaWNhdGUKKwkJICogZmx1c2ggZXZlcnl0aGluZy4KKwkJICovCisJCXNjc2lfd2FpdF9yZXEoc3JlcSwgY21kLCBOVUxMLCAwLCBTRF9USU1FT1VULCBTRF9NQVhfUkVUUklFUyk7CisJCWlmIChzcmVxLT5zcl9yZXN1bHQgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCXJlcyA9IHNyZXEtPnNyX3Jlc3VsdDsKKwlpZiAocmVzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZBSUxFRFxuICBzdGF0dXMgPSAleCwgbWVzc2FnZSA9ICUwMngsICIKKwkJCQkgICAgImhvc3QgPSAlZCwgZHJpdmVyID0gJTAyeFxuICAiLAorCQkJCSAgICBzdGF0dXNfYnl0ZShyZXMpLCBtc2dfYnl0ZShyZXMpLAorCQkJCSAgICBob3N0X2J5dGUocmVzKSwgZHJpdmVyX2J5dGUocmVzKSk7CisJCQlpZiAoZHJpdmVyX2J5dGUocmVzKSAmIERSSVZFUl9TRU5TRSkKKwkJCQlzY3NpX3ByaW50X3JlcV9zZW5zZSgic2QiLCBzcmVxKTsKKwl9CisKKwlzY3NpX3JlbGVhc2VfcmVxdWVzdChzcmVxKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHNkX2lzc3VlX2ZsdXNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc2VjdG9yX3QgKmVycm9yX3NlY3RvcikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJc3RydWN0IHNjc2lfZGlzayAqc2RrcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKCFzZGtwKQorICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIXNka3AtPldDRSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc2Rfc3luY19jYWNoZShzZHApOworfQorCitzdGF0aWMgdm9pZCBzZF9lbmRfZmx1c2gocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqZmx1c2hfcnEpCit7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gZmx1c2hfcnEtPmVuZF9pb19kYXRhOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHJxLT5zcGVjaWFsOworCXVuc2lnbmVkIGludCBieXRlcyA9IHJxLT5oYXJkX25yX3NlY3RvcnMgPDwgOTsKKworCWlmICghZmx1c2hfcnEtPmVycm9ycykgeworCQlzcGluX3VubG9jayhxLT5xdWV1ZV9sb2NrKTsKKwkJc2NzaV9pb19jb21wbGV0aW9uKGNtZCwgYnl0ZXMsIDApOworCQlzcGluX2xvY2socS0+cXVldWVfbG9jayk7CisJfSBlbHNlIGlmIChibGtfYmFycmllcl9wb3N0Zmx1c2gocnEpKSB7CisJCXNwaW5fdW5sb2NrKHEtPnF1ZXVlX2xvY2spOworCQlzY3NpX2lvX2NvbXBsZXRpb24oY21kLCAwLCBieXRlcyk7CisJCXNwaW5fbG9jayhxLT5xdWV1ZV9sb2NrKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBmb3JjZSBqb3VybmFsIGFib3J0IG9mIGJhcnJpZXJzCisJCSAqLworCQllbmRfdGhhdF9yZXF1ZXN0X2ZpcnN0KHJxLCAtRU9QTk9UU1VQUCwgcnEtPmhhcmRfbnJfc2VjdG9ycyk7CisJCWVuZF90aGF0X3JlcXVlc3RfbGFzdChycSk7CisJfQorfQorCitzdGF0aWMgaW50IHNkX3ByZXBhcmVfZmx1c2gocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gcS0+cXVldWVkYXRhOworCXN0cnVjdCBzY3NpX2Rpc2sgKnNka3AgPSBkZXZfZ2V0X2RydmRhdGEoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKKworCWlmIChzZGtwLT5XQ0UpIHsKKwkJbWVtc2V0KHJxLT5jbWQsIDAsIHNpemVvZihycS0+Y21kKSk7CisJCXJxLT5mbGFncyB8PSBSRVFfQkxPQ0tfUEMgfCBSRVFfU09GVEJBUlJJRVI7CisJCXJxLT50aW1lb3V0ID0gU0RfVElNRU9VVDsKKwkJcnEtPmNtZFswXSA9IFNZTkNIUk9OSVpFX0NBQ0hFOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2RfcmVzY2FuKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc2RfcmV2YWxpZGF0ZV9kaXNrKHNka3AtPmRpc2spOworfQorCisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisvKiAKKyAqIFRoaXMgZ2V0cyBkaXJlY3RseSBjYWxsZWQgZnJvbSBWRlMuIFdoZW4gdGhlIGlvY3RsIAorICogaXMgbm90IHJlY29nbml6ZWQgd2UgZ28gYmFjayB0byB0aGUgb3RoZXIgdHJhbnNsYXRpb24gcGF0aHMuIAorICovCitzdGF0aWMgbG9uZyBzZF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9iZGV2OworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gYmRldi0+YmRfZGlzazsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBzY3NpX2Rpc2soZGlzayktPmRldmljZTsKKworCS8qCisJICogSWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgZXJyb3IgcmVjb3ZlcnksIGRvbid0IGxldCBhbnlvbmUKKwkgKiBlbHNlIHRyeSBhbmQgdXNlIHRoaXMgZGV2aWNlLiAgQWxzbywgaWYgZXJyb3IgcmVjb3ZlcnkgZmFpbHMsIGl0CisJICogbWF5IHRyeSBhbmQgdGFrZSB0aGUgZGV2aWNlIG9mZmxpbmUsIGluIHdoaWNoIGNhc2UgYWxsIGZ1cnRoZXIKKwkgKiBhY2Nlc3MgdG8gdGhlIGRldmljZSBpcyBwcm9oaWJpdGVkLgorCSAqLworCWlmICghc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKHNkZXYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkgICAgICAgCisJaWYgKHNkZXYtPmhvc3QtPmhvc3R0LT5jb21wYXRfaW9jdGwpIHsKKwkJaW50IHJldDsKKworCQlyZXQgPSBzZGV2LT5ob3N0LT5ob3N0dC0+Y29tcGF0X2lvY3RsKHNkZXYsIGNtZCwgKHZvaWQgX191c2VyICopYXJnKTsKKworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIAorCSAqIExldCB0aGUgc3RhdGljIGlvY3RsIHRyYW5zbGF0aW9uIHRhYmxlIHRha2UgY2FyZSBvZiBpdC4KKwkgKi8KKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOyAKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIHNkX2ZvcHMgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJCT0gc2Rfb3BlbiwKKwkucmVsZWFzZQkJPSBzZF9yZWxlYXNlLAorCS5pb2N0bAkJCT0gc2RfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwJCT0gc2RfY29tcGF0X2lvY3RsLAorI2VuZGlmCisJLm1lZGlhX2NoYW5nZWQJCT0gc2RfbWVkaWFfY2hhbmdlZCwKKwkucmV2YWxpZGF0ZV9kaXNrCT0gc2RfcmV2YWxpZGF0ZV9kaXNrLAorfTsKKworLyoqCisgKglzZF9yd19pbnRyIC0gYm90dG9tIGhhbGYgaGFuZGxlcjogY2FsbGVkIHdoZW4gdGhlIGxvd2VyIGxldmVsCisgKglkcml2ZXIgaGFzIGNvbXBsZXRlZCAoc3VjY2Vzc2Z1bGx5IG9yIG90aGVyd2lzZSkgYSBzY3NpIGNvbW1hbmQuCisgKglAU0NwbnQ6IG1pZC1sZXZlbCdzIHBlciBjb21tYW5kIHN0cnVjdHVyZS4KKyAqCisgKglOb3RlOiBwb3RlbnRpYWxseSBydW4gZnJvbSB3aXRoaW4gYW4gSVNSLiBNdXN0IG5vdCBibG9jay4KKyAqKi8KK3N0YXRpYyB2b2lkIHNkX3J3X2ludHIoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KQoreworCWludCByZXN1bHQgPSBTQ3BudC0+cmVzdWx0OworCWludCB0aGlzX2NvdW50ID0gU0NwbnQtPmJ1ZmZsZW47CisJaW50IGdvb2RfYnl0ZXMgPSAocmVzdWx0ID09IDAgPyB0aGlzX2NvdW50IDogMCk7CisJc2VjdG9yX3QgYmxvY2tfc2VjdG9ycyA9IDE7CisJdTY0IGZpcnN0X2Vycl9ibG9jazsKKwlzZWN0b3JfdCBlcnJvcl9zZWN0b3I7CisJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOworCWludCBzZW5zZV92YWxpZCA9IDA7CisJaW50IHNlbnNlX2RlZmVycmVkID0gMDsKKwlpbnQgaW5mb192YWxpZDsKKworCWlmIChyZXN1bHQpIHsKKwkJc2Vuc2VfdmFsaWQgPSBzY3NpX2NvbW1hbmRfbm9ybWFsaXplX3NlbnNlKFNDcG50LCAmc3NoZHIpOworCQlpZiAoc2Vuc2VfdmFsaWQpCisJCQlzZW5zZV9kZWZlcnJlZCA9IHNjc2lfc2Vuc2VfaXNfZGVmZXJyZWQoJnNzaGRyKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU0NTSV9MT0dHSU5HCisJU0NTSV9MT0dfSExDT01QTEVURSgxLCBwcmludGsoInNkX3J3X2ludHI6ICVzOiByZXM9MHgleFxuIiwgCisJCQkJU0NwbnQtPnJlcXVlc3QtPnJxX2Rpc2stPmRpc2tfbmFtZSwgcmVzdWx0KSk7CisJaWYgKHNlbnNlX3ZhbGlkKSB7CisJCVNDU0lfTE9HX0hMQ09NUExFVEUoMSwgcHJpbnRrKCJzZF9yd19pbnRyOiBzYltyZXNwYyxzayxhc2MsIgorCQkJCSJhc2NxXT0leCwleCwleCwleFxuIiwgc3NoZHIucmVzcG9uc2VfY29kZSwKKwkJCQlzc2hkci5zZW5zZV9rZXksIHNzaGRyLmFzYywgc3NoZHIuYXNjcSkpOworCX0KKyNlbmRpZgorCS8qCisJICAgSGFuZGxlIE1FRElVTSBFUlJPUnMgdGhhdCBpbmRpY2F0ZSBwYXJ0aWFsIHN1Y2Nlc3MuICBTaW5jZSB0aGlzIGlzIGEKKwkgICByZWxhdGl2ZWx5IHJhcmUgZXJyb3IgY29uZGl0aW9uLCBubyBjYXJlIGlzIHRha2VuIHRvIGF2b2lkCisJICAgdW5uZWNlc3NhcnkgYWRkaXRpb25hbCB3b3JrIHN1Y2ggYXMgbWVtY3B5J3MgdGhhdCBjb3VsZCBiZSBhdm9pZGVkLgorCSAqLworCisJLyogCisJICogSWYgU0dfSU8gZnJvbSBibG9jayBsYXllciB0aGVuIHNldCBnb29kX2J5dGVzIHRvIHN0b3AgcmV0cmllczsKKwkgKiBlbHNlIGlmIGVycm9ycywgY2hlY2sgdGhlbSwgYW5kIGlmIG5lY2Vzc2FyeSBwcmVwYXJlIGZvcgorCSAqIChwYXJ0aWFsKSByZXRyaWVzLgorCSAqLworCWlmIChibGtfcGNfcmVxdWVzdChTQ3BudC0+cmVxdWVzdCkpCisJCWdvb2RfYnl0ZXMgPSB0aGlzX2NvdW50OworCWVsc2UgaWYgKGRyaXZlcl9ieXRlKHJlc3VsdCkgIT0gMCAmJgorCQkgc2Vuc2VfdmFsaWQgJiYgIXNlbnNlX2RlZmVycmVkKSB7CisJCXN3aXRjaCAoc3NoZHIuc2Vuc2Vfa2V5KSB7CisJCWNhc2UgTUVESVVNX0VSUk9SOgorCQkJaWYgKCFibGtfZnNfcmVxdWVzdChTQ3BudC0+cmVxdWVzdCkpCisJCQkJYnJlYWs7CisJCQlpbmZvX3ZhbGlkID0gc2NzaV9nZXRfc2Vuc2VfaW5mb19mbGQoCisJCQkJU0NwbnQtPnNlbnNlX2J1ZmZlciwgU0NTSV9TRU5TRV9CVUZGRVJTSVpFLAorCQkJCSZmaXJzdF9lcnJfYmxvY2spOworCQkJLyoKKwkJCSAqIE1heSB3YW50IHRvIHdhcm4gYW5kIHNraXAgaWYgZm9sbG93aW5nIGNhc3QgcmVzdWx0cworCQkJICogaW4gYWN0dWFsIHRydW5jYXRpb24gKGlmIHNlY3Rvcl90IDwgNjQgYml0cykKKwkJCSAqLworCQkJZXJyb3Jfc2VjdG9yID0gKHNlY3Rvcl90KWZpcnN0X2Vycl9ibG9jazsKKwkJCWlmIChTQ3BudC0+cmVxdWVzdC0+YmlvICE9IE5VTEwpCisJCQkJYmxvY2tfc2VjdG9ycyA9IGJpb19zZWN0b3JzKFNDcG50LT5yZXF1ZXN0LT5iaW8pOworCQkJc3dpdGNoIChTQ3BudC0+ZGV2aWNlLT5zZWN0b3Jfc2l6ZSkgeworCQkJY2FzZSAxMDI0OgorCQkJCWVycm9yX3NlY3RvciA8PD0gMTsKKwkJCQlpZiAoYmxvY2tfc2VjdG9ycyA8IDIpCisJCQkJCWJsb2NrX3NlY3RvcnMgPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSAyMDQ4OgorCQkJCWVycm9yX3NlY3RvciA8PD0gMjsKKwkJCQlpZiAoYmxvY2tfc2VjdG9ycyA8IDQpCisJCQkJCWJsb2NrX3NlY3RvcnMgPSA0OworCQkJCWJyZWFrOworCQkJY2FzZSA0MDk2OgorCQkJCWVycm9yX3NlY3RvciA8PD0zOworCQkJCWlmIChibG9ja19zZWN0b3JzIDwgOCkKKwkJCQkJYmxvY2tfc2VjdG9ycyA9IDg7CisJCQkJYnJlYWs7CisJCQljYXNlIDI1NjoKKwkJCQllcnJvcl9zZWN0b3IgPj49IDE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCisJCQllcnJvcl9zZWN0b3IgJj0gfihibG9ja19zZWN0b3JzIC0gMSk7CisJCQlnb29kX2J5dGVzID0gKGVycm9yX3NlY3RvciAtIFNDcG50LT5yZXF1ZXN0LT5zZWN0b3IpIDw8IDk7CisJCQlpZiAoZ29vZF9ieXRlcyA8IDAgfHwgZ29vZF9ieXRlcyA+PSB0aGlzX2NvdW50KQorCQkJCWdvb2RfYnl0ZXMgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRUNPVkVSRURfRVJST1I6IC8qIGFuIGVycm9yIG9jY3VycmVkLCBidXQgaXQgcmVjb3ZlcmVkICovCisJCWNhc2UgTk9fU0VOU0U6IC8qIExMREQgZ290IHNlbnNlIGRhdGEgKi8KKwkJCS8qCisJCQkgKiBJbmZvcm0gdGhlIHVzZXIsIGJ1dCBtYWtlIHN1cmUgdGhhdCBpdCdzIG5vdCB0cmVhdGVkCisJCQkgKiBhcyBhIGhhcmQgZXJyb3IuCisJCQkgKi8KKwkJCXNjc2lfcHJpbnRfc2Vuc2UoInNkIiwgU0NwbnQpOworCQkJU0NwbnQtPnJlc3VsdCA9IDA7CisJCQltZW1zZXQoU0NwbnQtPnNlbnNlX2J1ZmZlciwgMCwgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKKwkJCWdvb2RfYnl0ZXMgPSB0aGlzX2NvdW50OworCQkJYnJlYWs7CisKKwkJY2FzZSBJTExFR0FMX1JFUVVFU1Q6CisJCQlpZiAoU0NwbnQtPmRldmljZS0+dXNlXzEwX2Zvcl9ydyAmJgorCQkJICAgIChTQ3BudC0+Y21uZFswXSA9PSBSRUFEXzEwIHx8CisJCQkgICAgIFNDcG50LT5jbW5kWzBdID09IFdSSVRFXzEwKSkKKwkJCQlTQ3BudC0+ZGV2aWNlLT51c2VfMTBfZm9yX3J3ID0gMDsKKwkJCWlmIChTQ3BudC0+ZGV2aWNlLT51c2VfMTBfZm9yX21zICYmCisJCQkgICAgKFNDcG50LT5jbW5kWzBdID09IE1PREVfU0VOU0VfMTAgfHwKKwkJCSAgICAgU0NwbnQtPmNtbmRbMF0gPT0gTU9ERV9TRUxFQ1RfMTApKQorCQkJCVNDcG50LT5kZXZpY2UtPnVzZV8xMF9mb3JfbXMgPSAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCS8qCisJICogVGhpcyBjYWxscyB0aGUgZ2VuZXJpYyBjb21wbGV0aW9uIGZ1bmN0aW9uLCBub3cgdGhhdCB3ZSBrbm93CisJICogaG93IG1hbnkgYWN0dWFsIHNlY3RvcnMgZmluaXNoZWQsIGFuZCBob3cgbWFueSBzZWN0b3JzIHdlIG5lZWQKKwkgKiB0byBzYXkgaGF2ZSBmYWlsZWQuCisJICovCisJc2NzaV9pb19jb21wbGV0aW9uKFNDcG50LCBnb29kX2J5dGVzLCBibG9ja19zZWN0b3JzIDw8IDkpOworfQorCitzdGF0aWMgaW50IG1lZGlhX25vdF9wcmVzZW50KHN0cnVjdCBzY3NpX2Rpc2sgKnNka3AsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNycCkKK3sKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CisKKwlpZiAoIXNycC0+c3JfcmVzdWx0KQorCQlyZXR1cm4gMDsKKwlpZiAoIShkcml2ZXJfYnl0ZShzcnAtPnNyX3Jlc3VsdCkgJiBEUklWRVJfU0VOU0UpKQorCQlyZXR1cm4gMDsKKwkvKiBub3QgaW52b2tlZCBmb3IgY29tbWFuZHMgdGhhdCBjb3VsZCByZXR1cm4gZGVmZXJyZWQgZXJyb3JzICovCisJaWYgKHNjc2lfcmVxdWVzdF9ub3JtYWxpemVfc2Vuc2Uoc3JwLCAmc3NoZHIpKSB7CisJCWlmIChzc2hkci5zZW5zZV9rZXkgIT0gTk9UX1JFQURZICYmCisJCSAgICBzc2hkci5zZW5zZV9rZXkgIT0gVU5JVF9BVFRFTlRJT04pCisJCQlyZXR1cm4gMDsKKwkJaWYgKHNzaGRyLmFzYyAhPSAweDNBKSAvKiBtZWRpdW0gbm90IHByZXNlbnQgKi8KKwkJCXJldHVybiAwOworCX0KKwlzZXRfbWVkaWFfbm90X3ByZXNlbnQoc2RrcCk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBzcGludXAgZGlzayAtIGNhbGxlZCBvbmx5IGluIHNkX3JldmFsaWRhdGVfZGlzaygpCisgKi8KK3N0YXRpYyB2b2lkCitzZF9zcGludXBfZGlzayhzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwLCBjaGFyICpkaXNrbmFtZSwKKwkgICAgICAgc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikgeworCXVuc2lnbmVkIGNoYXIgY21kWzEwXTsKKwl1bnNpZ25lZCBsb25nIHNwaW50aW1lX3ZhbHVlID0gMDsKKwlpbnQgcmV0cmllcywgc3BpbnRpbWU7CisJdW5zaWduZWQgaW50IHRoZV9yZXN1bHQ7CisJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOworCWludCBzZW5zZV92YWxpZCA9IDA7CisKKwlzcGludGltZSA9IDA7CisKKwkvKiBTcGluIHVwIGRyaXZlcywgYXMgcmVxdWlyZWQuICBPbmx5IGRvIHRoaXMgYXQgYm9vdCB0aW1lICovCisJLyogU3BpbnVwIG5lZWRzIHRvIGJlIGRvbmUgZm9yIG1vZHVsZSBsb2FkcyB0b28uICovCisJZG8geworCQlyZXRyaWVzID0gMDsKKworCQlkbyB7CisJCQljbWRbMF0gPSBURVNUX1VOSVRfUkVBRFk7CisJCQltZW1zZXQoKHZvaWQgKikgJmNtZFsxXSwgMCwgOSk7CisKKwkJCVNScG50LT5zcl9jbWRfbGVuID0gMDsKKwkJCW1lbXNldChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyLCAwLAorCQkJICAgICAgIFNDU0lfU0VOU0VfQlVGRkVSU0laRSk7CisJCQlTUnBudC0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKKworCQkJc2NzaV93YWl0X3JlcSAoU1JwbnQsICh2b2lkICopIGNtZCwgKHZvaWQgKikgYnVmZmVyLAorCQkJCSAgICAgICAwLyo1MTIqLywgU0RfVElNRU9VVCwgU0RfTUFYX1JFVFJJRVMpOworCisJCQl0aGVfcmVzdWx0ID0gU1JwbnQtPnNyX3Jlc3VsdDsKKwkJCWlmICh0aGVfcmVzdWx0KQorCQkJCXNlbnNlX3ZhbGlkID0gc2NzaV9yZXF1ZXN0X25vcm1hbGl6ZV9zZW5zZSgKKwkJCQkJCQlTUnBudCwgJnNzaGRyKTsKKwkJCXJldHJpZXMrKzsKKwkJfSB3aGlsZSAocmV0cmllcyA8IDMgJiYgCisJCQkgKCFzY3NpX3N0YXR1c19pc19nb29kKHRoZV9yZXN1bHQpIHx8CisJCQkgICgoZHJpdmVyX2J5dGUodGhlX3Jlc3VsdCkgJiBEUklWRVJfU0VOU0UpICYmCisJCQkgIHNlbnNlX3ZhbGlkICYmIHNzaGRyLnNlbnNlX2tleSA9PSBVTklUX0FUVEVOVElPTikpKTsKKworCQkvKgorCQkgKiBJZiB0aGUgZHJpdmUgaGFzIGluZGljYXRlZCB0byB1cyB0aGF0IGl0IGRvZXNuJ3QgaGF2ZQorCQkgKiBhbnkgbWVkaWEgaW4gaXQsIGRvbid0IGJvdGhlciB3aXRoIGFueSBvZiB0aGUgcmVzdCBvZgorCQkgKiB0aGlzIGNyYXAuCisJCSAqLworCQlpZiAobWVkaWFfbm90X3ByZXNlbnQoc2RrcCwgU1JwbnQpKQorCQkJcmV0dXJuOworCisJCWlmICgoZHJpdmVyX2J5dGUodGhlX3Jlc3VsdCkgJiBEUklWRVJfU0VOU0UpID09IDApIHsKKwkJCS8qIG5vIHNlbnNlLCBUVVIgZWl0aGVyIHN1Y2NlZWRlZCBvciBmYWlsZWQKKwkJCSAqIHdpdGggYSBzdGF0dXMgZXJyb3IgKi8KKwkJCWlmKCFzcGludGltZSAmJiAhc2NzaV9zdGF0dXNfaXNfZ29vZCh0aGVfcmVzdWx0KSkKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBVbml0IE5vdCBSZWFkeSwgIgorCQkJCSAgICAgICAiZXJyb3IgPSAweCV4XG4iLCBkaXNrbmFtZSwgdGhlX3Jlc3VsdCk7CisJCQlicmVhazsKKwkJfQorCQkJCQkKKwkJLyoKKwkJICogVGhlIGRldmljZSBkb2VzIG5vdCB3YW50IHRoZSBhdXRvbWF0aWMgc3RhcnQgdG8gYmUgaXNzdWVkLgorCQkgKi8KKwkJaWYgKHNka3AtPmRldmljZS0+bm9fc3RhcnRfb25fYWRkKSB7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIElmIG1hbnVhbCBpbnRlcnZlbnRpb24gaXMgcmVxdWlyZWQsIG9yIHRoaXMgaXMgYW4KKwkJICogYWJzZW50IFVTQiBzdG9yYWdlIGRldmljZSwgYSBzcGludXAgaXMgbWVhbmluZ2xlc3MuCisJCSAqLworCQlpZiAoc2Vuc2VfdmFsaWQgJiYKKwkJICAgIHNzaGRyLnNlbnNlX2tleSA9PSBOT1RfUkVBRFkgJiYKKwkJICAgIHNzaGRyLmFzYyA9PSA0ICYmIHNzaGRyLmFzY3EgPT0gMykgeworCQkJYnJlYWs7CQkvKiBtYW51YWwgaW50ZXJ2ZW50aW9uIHJlcXVpcmVkICovCisKKwkJLyoKKwkJICogSXNzdWUgY29tbWFuZCB0byBzcGluIHVwIGRyaXZlIHdoZW4gbm90IHJlYWR5CisJCSAqLworCQl9IGVsc2UgaWYgKHNlbnNlX3ZhbGlkICYmIHNzaGRyLnNlbnNlX2tleSA9PSBOT1RfUkVBRFkpIHsKKwkJCWlmICghc3BpbnRpbWUpIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBTcGlubmluZyB1cCBkaXNrLi4uIiwKKwkJCQkgICAgICAgZGlza25hbWUpOworCQkJCWNtZFswXSA9IFNUQVJUX1NUT1A7CisJCQkJY21kWzFdID0gMTsJLyogUmV0dXJuIGltbWVkaWF0ZWx5ICovCisJCQkJbWVtc2V0KCh2b2lkICopICZjbWRbMl0sIDAsIDgpOworCQkJCWNtZFs0XSA9IDE7CS8qIFN0YXJ0IHNwaW4gY3ljbGUgKi8KKwkJCQlTUnBudC0+c3JfY21kX2xlbiA9IDA7CisJCQkJbWVtc2V0KFNScG50LT5zcl9zZW5zZV9idWZmZXIsIDAsCisJCQkJCVNDU0lfU0VOU0VfQlVGRkVSU0laRSk7CisKKwkJCQlTUnBudC0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKKwkJCQlzY3NpX3dhaXRfcmVxKFNScG50LCAodm9pZCAqKWNtZCwgCisJCQkJCSAgICAgICh2b2lkICopIGJ1ZmZlciwgMC8qNTEyKi8sIAorCQkJCQkgICAgICBTRF9USU1FT1VULCBTRF9NQVhfUkVUUklFUyk7CisJCQkJc3BpbnRpbWVfdmFsdWUgPSBqaWZmaWVzOworCQkJfQorCQkJc3BpbnRpbWUgPSAxOworCQkJLyogV2FpdCAxIHNlY29uZCBmb3IgbmV4dCB0cnkgKi8KKwkJCW1zbGVlcCgxMDAwKTsKKwkJCXByaW50aygiLiIpOworCQl9IGVsc2UgeworCQkJLyogd2UgZG9uJ3QgdW5kZXJzdGFuZCB0aGUgc2Vuc2UgY29kZSwgc28gaXQncworCQkJICogcHJvYmFibHkgcG9pbnRsZXNzIHRvIGxvb3AgKi8KKwkJCWlmKCFzcGludGltZSkgeworCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFVuaXQgTm90IFJlYWR5LCAiCisJCQkJCSJzZW5zZTpcbiIsIGRpc2tuYW1lKTsKKwkJCQlzY3NpX3ByaW50X3JlcV9zZW5zZSgiIiwgU1JwbnQpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJCQkKKwl9IHdoaWxlIChzcGludGltZSAmJgorCQkgdGltZV9hZnRlcihzcGludGltZV92YWx1ZSArIDEwMCAqIEhaLCBqaWZmaWVzKSk7CisKKwlpZiAoc3BpbnRpbWUpIHsKKwkJaWYgKHNjc2lfc3RhdHVzX2lzX2dvb2QodGhlX3Jlc3VsdCkpCisJCQlwcmludGsoInJlYWR5XG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJub3QgcmVzcG9uZGluZy4uLlxuIik7CisJfQorfQorCisvKgorICogcmVhZCBkaXNrIGNhcGFjaXR5CisgKi8KK3N0YXRpYyB2b2lkCitzZF9yZWFkX2NhcGFjaXR5KHN0cnVjdCBzY3NpX2Rpc2sgKnNka3AsIGNoYXIgKmRpc2tuYW1lLAorCQkgc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikgeworCXVuc2lnbmVkIGNoYXIgY21kWzE2XTsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCA9IHNka3AtPmRldmljZTsKKwlpbnQgdGhlX3Jlc3VsdCwgcmV0cmllczsKKwlpbnQgc2VjdG9yX3NpemUgPSAwOworCWludCBsb25ncmMgPSAwOworCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKKwlpbnQgc2Vuc2VfdmFsaWQgPSAwOworCityZXBlYXQ6CisJcmV0cmllcyA9IDM7CisJZG8geworCQlpZiAobG9uZ3JjKSB7CisJCQltZW1zZXQoKHZvaWQgKikgY21kLCAwLCAxNik7CisJCQljbWRbMF0gPSBTRVJWSUNFX0FDVElPTl9JTjsKKwkJCWNtZFsxXSA9IFNBSV9SRUFEX0NBUEFDSVRZXzE2OworCQkJY21kWzEzXSA9IDEyOworCQkJbWVtc2V0KCh2b2lkICopIGJ1ZmZlciwgMCwgMTIpOworCQl9IGVsc2UgeworCQkJY21kWzBdID0gUkVBRF9DQVBBQ0lUWTsKKwkJCW1lbXNldCgodm9pZCAqKSAmY21kWzFdLCAwLCA5KTsKKwkJCW1lbXNldCgodm9pZCAqKSBidWZmZXIsIDAsIDgpOworCQl9CisJCQorCQlTUnBudC0+c3JfY21kX2xlbiA9IDA7CisJCW1lbXNldChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyLCAwLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOworCQlTUnBudC0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisKKwkJc2NzaV93YWl0X3JlcShTUnBudCwgKHZvaWQgKikgY21kLCAodm9pZCAqKSBidWZmZXIsCisJCQkgICAgICBsb25ncmMgPyAxMiA6IDgsIFNEX1RJTUVPVVQsIFNEX01BWF9SRVRSSUVTKTsKKworCQlpZiAobWVkaWFfbm90X3ByZXNlbnQoc2RrcCwgU1JwbnQpKQorCQkJcmV0dXJuOworCisJCXRoZV9yZXN1bHQgPSBTUnBudC0+c3JfcmVzdWx0OworCQlpZiAodGhlX3Jlc3VsdCkKKwkJCXNlbnNlX3ZhbGlkID0gc2NzaV9yZXF1ZXN0X25vcm1hbGl6ZV9zZW5zZShTUnBudCwKKwkJCQkJCQkJICAgJnNzaGRyKTsKKwkJcmV0cmllcy0tOworCisJfSB3aGlsZSAodGhlX3Jlc3VsdCAmJiByZXRyaWVzKTsKKworCWlmICh0aGVfcmVzdWx0ICYmICFsb25ncmMpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyA6IFJFQUQgQ0FQQUNJVFkgZmFpbGVkLlxuIgorCQkgICAgICAgIiVzIDogc3RhdHVzPSV4LCBtZXNzYWdlPSUwMngsIGhvc3Q9JWQsIGRyaXZlcj0lMDJ4IFxuIiwKKwkJICAgICAgIGRpc2tuYW1lLCBkaXNrbmFtZSwKKwkJICAgICAgIHN0YXR1c19ieXRlKHRoZV9yZXN1bHQpLAorCQkgICAgICAgbXNnX2J5dGUodGhlX3Jlc3VsdCksCisJCSAgICAgICBob3N0X2J5dGUodGhlX3Jlc3VsdCksCisJCSAgICAgICBkcml2ZXJfYnl0ZSh0aGVfcmVzdWx0KSk7CisKKwkJaWYgKGRyaXZlcl9ieXRlKHRoZV9yZXN1bHQpICYgRFJJVkVSX1NFTlNFKQorCQkJc2NzaV9wcmludF9yZXFfc2Vuc2UoInNkIiwgU1JwbnQpOworCQllbHNlCisJCQlwcmludGsoIiVzIDogc2Vuc2Ugbm90IGF2YWlsYWJsZS4gXG4iLCBkaXNrbmFtZSk7CisKKwkJLyogU2V0IGRpcnR5IGJpdCBmb3IgcmVtb3ZhYmxlIGRldmljZXMgaWYgbm90IHJlYWR5IC0KKwkJICogc29tZXRpbWVzIGRyaXZlcyB3aWxsIG5vdCByZXBvcnQgdGhpcyBwcm9wZXJseS4gKi8KKwkJaWYgKHNkcC0+cmVtb3ZhYmxlICYmCisJCSAgICBzZW5zZV92YWxpZCAmJiBzc2hkci5zZW5zZV9rZXkgPT0gTk9UX1JFQURZKQorCQkJc2RwLT5jaGFuZ2VkID0gMTsKKworCQkvKiBFaXRoZXIgbm8gbWVkaWEgYXJlIHByZXNlbnQgYnV0IHRoZSBkcml2ZSBkaWRuJ3QgdGVsbCB1cywKKwkJICAgb3IgdGhleSBhcmUgcHJlc2VudCBidXQgdGhlIHJlYWQgY2FwYWNpdHkgY29tbWFuZCBmYWlscyAqLworCQkvKiBzZGtwLT5tZWRpYV9wcmVzZW50ID0gMDsgLS0gbm90IGFsd2F5cyBjb3JyZWN0ICovCisJCXNka3AtPmNhcGFjaXR5ID0gMHgyMDAwMDA7IC8qIDEgR0IgLSByYW5kb20gKi8KKworCQlyZXR1cm47CisJfSBlbHNlIGlmICh0aGVfcmVzdWx0ICYmIGxvbmdyYykgeworCQkvKiBSRUFEIENBUEFDSVRZKDE2KSBoYXMgYmVlbiBmYWlsZWQgKi8KKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyA6IFJFQUQgQ0FQQUNJVFkoMTYpIGZhaWxlZC5cbiIKKwkJICAgICAgICIlcyA6IHN0YXR1cz0leCwgbWVzc2FnZT0lMDJ4LCBob3N0PSVkLCBkcml2ZXI9JTAyeCBcbiIsCisJCSAgICAgICBkaXNrbmFtZSwgZGlza25hbWUsCisJCSAgICAgICBzdGF0dXNfYnl0ZSh0aGVfcmVzdWx0KSwKKwkJICAgICAgIG1zZ19ieXRlKHRoZV9yZXN1bHQpLAorCQkgICAgICAgaG9zdF9ieXRlKHRoZV9yZXN1bHQpLAorCQkgICAgICAgZHJpdmVyX2J5dGUodGhlX3Jlc3VsdCkpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIDogdXNlIDB4ZmZmZmZmZmYgYXMgZGV2aWNlIHNpemVcbiIsCisJCSAgICAgICBkaXNrbmFtZSk7CisJCQorCQlzZGtwLT5jYXBhY2l0eSA9IDEgKyAoc2VjdG9yX3QpIDB4ZmZmZmZmZmY7CQkKKwkJZ290byBnb3RfZGF0YTsKKwl9CQorCQorCWlmICghbG9uZ3JjKSB7CisJCXNlY3Rvcl9zaXplID0gKGJ1ZmZlcls0XSA8PCAyNCkgfAorCQkJKGJ1ZmZlcls1XSA8PCAxNikgfCAoYnVmZmVyWzZdIDw8IDgpIHwgYnVmZmVyWzddOworCQlpZiAoYnVmZmVyWzBdID09IDB4ZmYgJiYgYnVmZmVyWzFdID09IDB4ZmYgJiYKKwkJICAgIGJ1ZmZlclsyXSA9PSAweGZmICYmIGJ1ZmZlclszXSA9PSAweGZmKSB7CisJCQlpZihzaXplb2Yoc2RrcC0+Y2FwYWNpdHkpID4gNCkgeworCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXMgOiB2ZXJ5IGJpZyBkZXZpY2UuIHRyeSB0byB1c2UiCisJCQkJICAgICAgICIgUkVBRCBDQVBBQ0lUWSgxNikuXG4iLCBkaXNrbmFtZSk7CisJCQkJbG9uZ3JjID0gMTsKKwkJCQlnb3RvIHJlcGVhdDsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRvbyBiaWcgZm9yIHRoaXMga2VybmVsLiAgVXNlIGEgIgorCQkJICAgICAgICJrZXJuZWwgY29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciBsYXJnZSBibG9jayAiCisJCQkgICAgICAgImRldmljZXMuXG4iLCBkaXNrbmFtZSk7CisJCQlzZGtwLT5jYXBhY2l0eSA9IDA7CisJCQlnb3RvIGdvdF9kYXRhOworCQl9CisJCXNka3AtPmNhcGFjaXR5ID0gMSArICgoKHNlY3Rvcl90KWJ1ZmZlclswXSA8PCAyNCkgfAorCQkJKGJ1ZmZlclsxXSA8PCAxNikgfAorCQkJKGJ1ZmZlclsyXSA8PCA4KSB8CisJCQlidWZmZXJbM10pOwkJCQorCX0gZWxzZSB7CisJCXNka3AtPmNhcGFjaXR5ID0gMSArICgoKHU2NClidWZmZXJbMF0gPDwgNTYpIHwKKwkJCSgodTY0KWJ1ZmZlclsxXSA8PCA0OCkgfAorCQkJKCh1NjQpYnVmZmVyWzJdIDw8IDQwKSB8CisJCQkoKHU2NClidWZmZXJbM10gPDwgMzIpIHwKKwkJCSgoc2VjdG9yX3QpYnVmZmVyWzRdIDw8IDI0KSB8CisJCQkoKHNlY3Rvcl90KWJ1ZmZlcls1XSA8PCAxNikgfAorCQkJKChzZWN0b3JfdClidWZmZXJbNl0gPDwgOCkgIHwKKwkJCShzZWN0b3JfdClidWZmZXJbN10pOworCQkJCisJCXNlY3Rvcl9zaXplID0gKGJ1ZmZlcls4XSA8PCAyNCkgfAorCQkJKGJ1ZmZlcls5XSA8PCAxNikgfCAoYnVmZmVyWzEwXSA8PCA4KSB8IGJ1ZmZlclsxMV07CisJfQkKKworCS8qIFNvbWUgZGV2aWNlcyByZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBzZWN0b3JzLCBub3QgdGhlCisJICogaGlnaGVzdCBzZWN0b3IgbnVtYmVyLiAgTWFrZSB0aGUgbmVjZXNzYXJ5IGFkanVzdG1lbnQuICovCisJaWYgKHNkcC0+Zml4X2NhcGFjaXR5KQorCQktLXNka3AtPmNhcGFjaXR5OworCitnb3RfZGF0YToKKwlpZiAoc2VjdG9yX3NpemUgPT0gMCkgeworCQlzZWN0b3Jfc2l6ZSA9IDUxMjsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyA6IHNlY3RvciBzaXplIDAgcmVwb3J0ZWQsICIKKwkJICAgICAgICJhc3N1bWluZyA1MTIuXG4iLCBkaXNrbmFtZSk7CisJfQorCisJaWYgKHNlY3Rvcl9zaXplICE9IDUxMiAmJgorCSAgICBzZWN0b3Jfc2l6ZSAhPSAxMDI0ICYmCisJICAgIHNlY3Rvcl9zaXplICE9IDIwNDggJiYKKwkgICAgc2VjdG9yX3NpemUgIT0gNDA5NiAmJgorCSAgICBzZWN0b3Jfc2l6ZSAhPSAyNTYpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyA6IHVuc3VwcG9ydGVkIHNlY3RvciBzaXplICIKKwkJICAgICAgICIlZC5cbiIsIGRpc2tuYW1lLCBzZWN0b3Jfc2l6ZSk7CisJCS8qCisJCSAqIFRoZSB1c2VyIG1pZ2h0IHdhbnQgdG8gcmUtZm9ybWF0IHRoZSBkcml2ZSB3aXRoCisJCSAqIGEgc3VwcG9ydGVkIHNlY3RvcnNpemUuICBPbmNlIHRoaXMgaGFwcGVucywgaXQKKwkJICogd291bGQgYmUgcmVsYXRpdmVseSB0cml2aWFsIHRvIHNldCB0aGUgdGhpbmcgdXAuCisJCSAqIEZvciB0aGlzIHJlYXNvbiwgd2UgbGVhdmUgdGhlIHRoaW5nIGluIHRoZSB0YWJsZS4KKwkJICovCisJCXNka3AtPmNhcGFjaXR5ID0gMDsKKwkJLyoKKwkJICogc2V0IGEgYm9ndXMgc2VjdG9yIHNpemUgc28gdGhlIG5vcm1hbCByZWFkL3dyaXRlCisJCSAqIGxvZ2ljIGluIHRoZSBibG9jayBsYXllciB3aWxsIGV2ZW50dWFsbHkgcmVmdXNlIGFueQorCQkgKiByZXF1ZXN0IG9uIHRoaXMgZGV2aWNlIHdpdGhvdXQgdHJpcHBpbmcgb3ZlciBwb3dlcgorCQkgKiBvZiB0d28gc2VjdG9yIHNpemUgYXNzdW1wdGlvbnMKKwkJICovCisJCXNlY3Rvcl9zaXplID0gNTEyOworCX0KKwl7CisJCS8qCisJCSAqIFRoZSBtc2RvcyBmcyBuZWVkcyB0byBrbm93IHRoZSBoYXJkd2FyZSBzZWN0b3Igc2l6ZQorCQkgKiBTbyBJIGhhdmUgY3JlYXRlZCB0aGlzIHRhYmxlLiBTZWUgbGxfcndfYmxrLmMKKwkJICogSmFjcXVlcyBHZWxpbmFzIChKYWNxdWVzQHNvbHVjb3JwLnFjLmNhKQorCQkgKi8KKwkJaW50IGhhcmRfc2VjdG9yID0gc2VjdG9yX3NpemU7CisJCXNlY3Rvcl90IHN6ID0gc2RrcC0+Y2FwYWNpdHkgKiAoaGFyZF9zZWN0b3IvMjU2KTsKKwkJcmVxdWVzdF9xdWV1ZV90ICpxdWV1ZSA9IHNkcC0+cmVxdWVzdF9xdWV1ZTsKKwkJc2VjdG9yX3QgbWI7CisKKwkJYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUocXVldWUsIGhhcmRfc2VjdG9yKTsKKwkJLyogYXZvaWQgNjQtYml0IGRpdmlzaW9uIG9uIDMyLWJpdCBwbGF0Zm9ybXMgKi8KKwkJbWIgPSBzeiA+PiAxOworCQlzZWN0b3JfZGl2KHN6LCAxMjUwKTsKKwkJbWIgLT0gc3ogLSA5NzQ7CisJCXNlY3Rvcl9kaXYobWIsIDE5NTApOworCisJCXByaW50ayhLRVJOX05PVElDRSAiU0NTSSBkZXZpY2UgJXM6ICIKKwkJICAgICAgICIlbGx1ICVkLWJ5dGUgaGR3ciBzZWN0b3JzICglbGx1IE1CKVxuIiwKKwkJICAgICAgIGRpc2tuYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKXNka3AtPmNhcGFjaXR5LAorCQkgICAgICAgaGFyZF9zZWN0b3IsICh1bnNpZ25lZCBsb25nIGxvbmcpbWIpOworCX0KKworCS8qIFJlc2NhbGUgY2FwYWNpdHkgdG8gNTEyLWJ5dGUgdW5pdHMgKi8KKwlpZiAoc2VjdG9yX3NpemUgPT0gNDA5NikKKwkJc2RrcC0+Y2FwYWNpdHkgPDw9IDM7CisJZWxzZSBpZiAoc2VjdG9yX3NpemUgPT0gMjA0OCkKKwkJc2RrcC0+Y2FwYWNpdHkgPDw9IDI7CisJZWxzZSBpZiAoc2VjdG9yX3NpemUgPT0gMTAyNCkKKwkJc2RrcC0+Y2FwYWNpdHkgPDw9IDE7CisJZWxzZSBpZiAoc2VjdG9yX3NpemUgPT0gMjU2KQorCQlzZGtwLT5jYXBhY2l0eSA+Pj0gMTsKKworCXNka3AtPmRldmljZS0+c2VjdG9yX3NpemUgPSBzZWN0b3Jfc2l6ZTsKK30KKworLyogY2FsbGVkIHdpdGggYnVmZmVyIG9mIGxlbmd0aCA1MTIgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzZF9kb19tb2RlX3NlbnNlKHN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50LCBpbnQgZGJkLCBpbnQgbW9kZXBhZ2UsCisJCSB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBsZW4sIHN0cnVjdCBzY3NpX21vZGVfZGF0YSAqZGF0YSkKK3sKKwlyZXR1cm4gX19zY3NpX21vZGVfc2Vuc2UoU1JwbnQsIGRiZCwgbW9kZXBhZ2UsIGJ1ZmZlciwgbGVuLAorCQkJCSBTRF9USU1FT1VULCBTRF9NQVhfUkVUUklFUywgZGF0YSk7Cit9CisKKy8qCisgKiByZWFkIHdyaXRlIHByb3RlY3Qgc2V0dGluZywgaWYgcG9zc2libGUgLSBjYWxsZWQgb25seSBpbiBzZF9yZXZhbGlkYXRlX2Rpc2soKQorICogY2FsbGVkIHdpdGggYnVmZmVyIG9mIGxlbmd0aCA1MTIKKyAqLworc3RhdGljIHZvaWQKK3NkX3JlYWRfd3JpdGVfcHJvdGVjdF9mbGFnKHN0cnVjdCBzY3NpX2Rpc2sgKnNka3AsIGNoYXIgKmRpc2tuYW1lLAorCQkgICBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudCwgdW5zaWduZWQgY2hhciAqYnVmZmVyKSB7CisJaW50IHJlczsKKwlzdHJ1Y3Qgc2NzaV9tb2RlX2RhdGEgZGF0YTsKKworCXNldF9kaXNrX3JvKHNka3AtPmRpc2ssIDApOworCWlmIChzZGtwLT5kZXZpY2UtPnNraXBfbXNfcGFnZV8zZikgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBhc3N1bWluZyBXcml0ZSBFbmFibGVkXG4iLCBkaXNrbmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc2RrcC0+ZGV2aWNlLT51c2VfMTkyX2J5dGVzX2Zvcl8zZikgeworCQlyZXMgPSBzZF9kb19tb2RlX3NlbnNlKFNScG50LCAwLCAweDNGLCBidWZmZXIsIDE5MiwgJmRhdGEpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEZpcnN0IGF0dGVtcHQ6IGFzayBmb3IgYWxsIHBhZ2VzICgweDNGKSwgYnV0IG9ubHkgNCBieXRlcy4KKwkJICogV2UgaGF2ZSB0byBzdGFydCBjYXJlZnVsbHk6IHNvbWUgZGV2aWNlcyBoYW5nIGlmIHdlIGFzaworCQkgKiBmb3IgbW9yZSB0aGFuIGlzIGF2YWlsYWJsZS4KKwkJICovCisJCXJlcyA9IHNkX2RvX21vZGVfc2Vuc2UoU1JwbnQsIDAsIDB4M0YsIGJ1ZmZlciwgNCwgJmRhdGEpOworCisJCS8qCisJCSAqIFNlY29uZCBhdHRlbXB0OiBhc2sgZm9yIHBhZ2UgMCBXaGVuIG9ubHkgcGFnZSAwIGlzCisJCSAqIGltcGxlbWVudGVkLCBhIHJlcXVlc3QgZm9yIHBhZ2UgM0YgbWF5IHJldHVybiBTZW5zZSBLZXkKKwkJICogNTogSWxsZWdhbCBSZXF1ZXN0LCBTZW5zZSBDb2RlIDI0OiBJbnZhbGlkIGZpZWxkIGluCisJCSAqIENEQi4KKwkJICovCisJCWlmICghc2NzaV9zdGF0dXNfaXNfZ29vZChyZXMpKQorCQkJcmVzID0gc2RfZG9fbW9kZV9zZW5zZShTUnBudCwgMCwgMCwgYnVmZmVyLCA0LCAmZGF0YSk7CisKKwkJLyoKKwkJICogVGhpcmQgYXR0ZW1wdDogYXNrIDI1NSBieXRlcywgYXMgd2UgZGlkIGVhcmxpZXIuCisJCSAqLworCQlpZiAoIXNjc2lfc3RhdHVzX2lzX2dvb2QocmVzKSkKKwkJCXJlcyA9IHNkX2RvX21vZGVfc2Vuc2UoU1JwbnQsIDAsIDB4M0YsIGJ1ZmZlciwgMjU1LAorCQkJCQkgICAgICAgJmRhdGEpOworCX0KKworCWlmICghc2NzaV9zdGF0dXNfaXNfZ29vZChyZXMpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogdGVzdCBXUCBmYWlsZWQsIGFzc3VtZSBXcml0ZSBFbmFibGVkXG4iLCBkaXNrbmFtZSk7CisJfSBlbHNlIHsKKwkJc2RrcC0+d3JpdGVfcHJvdCA9ICgoZGF0YS5kZXZpY2Vfc3BlY2lmaWMgJiAweDgwKSAhPSAwKTsKKwkJc2V0X2Rpc2tfcm8oc2RrcC0+ZGlzaywgc2RrcC0+d3JpdGVfcHJvdCk7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFdyaXRlIFByb3RlY3QgaXMgJXNcbiIsIGRpc2tuYW1lLAorCQkgICAgICAgc2RrcC0+d3JpdGVfcHJvdCA/ICJvbiIgOiAib2ZmIik7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTW9kZSBTZW5zZTogJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJICAgICAgIGRpc2tuYW1lLCBidWZmZXJbMF0sIGJ1ZmZlclsxXSwgYnVmZmVyWzJdLCBidWZmZXJbM10pOworCX0KK30KKworLyoKKyAqIHNkX3JlYWRfY2FjaGVfdHlwZSAtIGNhbGxlZCBvbmx5IGZyb20gc2RfcmV2YWxpZGF0ZV9kaXNrKCkKKyAqIGNhbGxlZCB3aXRoIGJ1ZmZlciBvZiBsZW5ndGggNTEyCisgKi8KK3N0YXRpYyB2b2lkCitzZF9yZWFkX2NhY2hlX3R5cGUoc3RydWN0IHNjc2lfZGlzayAqc2RrcCwgY2hhciAqZGlza25hbWUsCisJCSAgIHN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50LCB1bnNpZ25lZCBjaGFyICpidWZmZXIpIHsKKwlpbnQgbGVuID0gMCwgcmVzOworCisJY29uc3QgaW50IGRiZCA9IDA7CSAgIC8qIERCRCAqLworCWNvbnN0IGludCBtb2RlcGFnZSA9IDB4MDg7IC8qIGN1cnJlbnQgdmFsdWVzLCBjYWNoZSBwYWdlICovCisJc3RydWN0IHNjc2lfbW9kZV9kYXRhIGRhdGE7CisJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOworCisJaWYgKHNka3AtPmRldmljZS0+c2tpcF9tc19wYWdlXzgpCisJCWdvdG8gZGVmYXVsdHM7CisKKwkvKiBjYXV0aW91c2x5IGFzayAqLworCXJlcyA9IHNkX2RvX21vZGVfc2Vuc2UoU1JwbnQsIGRiZCwgbW9kZXBhZ2UsIGJ1ZmZlciwgNCwgJmRhdGEpOworCisJaWYgKCFzY3NpX3N0YXR1c19pc19nb29kKHJlcykpCisJCWdvdG8gYmFkX3NlbnNlOworCisJLyogdGhhdCB3ZW50IE9LLCBub3cgYXNrIGZvciB0aGUgcHJvcGVyIGxlbmd0aCAqLworCWxlbiA9IGRhdGEubGVuZ3RoOworCisJLyoKKwkgKiBXZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGZpcnN0IHRocmVlIGJ5dGVzLCBhY3R1YWxseS4KKwkgKiBCdXQgdGhlIGRhdGEgY2FjaGUgcGFnZSBpcyBkZWZpbmVkIGZvciB0aGUgZmlyc3QgMjAuCisJICovCisJaWYgKGxlbiA8IDMpCisJCWdvdG8gYmFkX3NlbnNlOworCWlmIChsZW4gPiAyMCkKKwkJbGVuID0gMjA7CisKKwkvKiBUYWtlIGhlYWRlcnMgYW5kIGJsb2NrIGRlc2NyaXB0b3JzIGludG8gYWNjb3VudCAqLworCWxlbiArPSBkYXRhLmhlYWRlcl9sZW5ndGggKyBkYXRhLmJsb2NrX2Rlc2NyaXB0b3JfbGVuZ3RoOworCisJLyogR2V0IHRoZSBkYXRhICovCisJcmVzID0gc2RfZG9fbW9kZV9zZW5zZShTUnBudCwgZGJkLCBtb2RlcGFnZSwgYnVmZmVyLCBsZW4sICZkYXRhKTsKKworCWlmIChzY3NpX3N0YXR1c19pc19nb29kKHJlcykpIHsKKwkJY29uc3QgY2hhciAqdHlwZXNbXSA9IHsKKwkJCSJ3cml0ZSB0aHJvdWdoIiwgIm5vbmUiLCAid3JpdGUgYmFjayIsCisJCQkid3JpdGUgYmFjaywgbm8gcmVhZCAoZGFmdCkiCisJCX07CisJCWludCBjdCA9IDA7CisJCWludCBvZmZzZXQgPSBkYXRhLmhlYWRlcl9sZW5ndGggKworCQkJZGF0YS5ibG9ja19kZXNjcmlwdG9yX2xlbmd0aCArIDI7CisKKwkJc2RrcC0+V0NFID0gKChidWZmZXJbb2Zmc2V0XSAmIDB4MDQpICE9IDApOworCQlzZGtwLT5SQ0QgPSAoKGJ1ZmZlcltvZmZzZXRdICYgMHgwMSkgIT0gMCk7CisKKwkJY3QgPSAgc2RrcC0+UkNEICsgMipzZGtwLT5XQ0U7CisKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJTQ1NJIGRldmljZSAlczogZHJpdmUgY2FjaGU6ICVzXG4iLAorCQkgICAgICAgZGlza25hbWUsIHR5cGVzW2N0XSk7CisKKwkJcmV0dXJuOworCX0KKworYmFkX3NlbnNlOgorCWlmIChzY3NpX3JlcXVlc3Rfbm9ybWFsaXplX3NlbnNlKFNScG50LCAmc3NoZHIpICYmCisJICAgIHNzaGRyLnNlbnNlX2tleSA9PSBJTExFR0FMX1JFUVVFU1QgJiYKKwkgICAgc3NoZHIuYXNjID09IDB4MjQgJiYgc3NoZHIuYXNjcSA9PSAweDApCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGNhY2hlIGRhdGEgdW5hdmFpbGFibGVcbiIsCisJCSAgICAgICBkaXNrbmFtZSk7CS8qIEludmFsaWQgZmllbGQgaW4gQ0RCICovCisJZWxzZQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhc2tpbmcgZm9yIGNhY2hlIGRhdGEgZmFpbGVkXG4iLAorCQkgICAgICAgZGlza25hbWUpOworCitkZWZhdWx0czoKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBhc3N1bWluZyBkcml2ZSBjYWNoZTogd3JpdGUgdGhyb3VnaFxuIiwKKwkgICAgICAgZGlza25hbWUpOworCXNka3AtPldDRSA9IDA7CisJc2RrcC0+UkNEID0gMDsKK30KKworLyoqCisgKglzZF9yZXZhbGlkYXRlX2Rpc2sgLSBjYWxsZWQgdGhlIGZpcnN0IHRpbWUgYSBuZXcgZGlzayBpcyBzZWVuLAorICoJcGVyZm9ybXMgZGlzayBzcGluIHVwLCByZWFkX2NhcGFjaXR5LCBldGMuCisgKglAZGlzazogc3RydWN0IGdlbmRpc2sgd2UgY2FyZSBhYm91dAorICoqLworc3RhdGljIGludCBzZF9yZXZhbGlkYXRlX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJc3RydWN0IHNjc2lfZGlzayAqc2RrcCA9IHNjc2lfZGlzayhkaXNrKTsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCA9IHNka3AtPmRldmljZTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxOworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKworCVNDU0lfTE9HX0hMUVVFVUUoMywgcHJpbnRrKCJzZF9yZXZhbGlkYXRlX2Rpc2s6IGRpc2s9JXNcbiIsIGRpc2stPmRpc2tfbmFtZSkpOworCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGlzIG9mZmxpbmUsIGRvbid0IHRyeSBhbmQgcmVhZCBjYXBhY2l0eSBvciBhbnkKKwkgKiBvZiB0aGUgb3RoZXIgbmljZXRpZXMuCisJICovCisJaWYgKCFzY3NpX2RldmljZV9vbmxpbmUoc2RwKSkKKwkJZ290byBvdXQ7CisKKwlzcmVxID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KHNkcCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzcmVxKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIihzZF9yZXZhbGlkYXRlX2Rpc2s6KSBSZXF1ZXN0IGFsbG9jYXRpb24gIgorCQkgICAgICAgImZhaWx1cmUuXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJYnVmZmVyID0ga21hbGxvYyg1MTIsIEdGUF9LRVJORUwgfCBfX0dGUF9ETUEpOworCWlmICghYnVmZmVyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIihzZF9yZXZhbGlkYXRlX2Rpc2s6KSBNZW1vcnkgYWxsb2NhdGlvbiAiCisJCSAgICAgICAiZmFpbHVyZS5cbiIpOworCQlnb3RvIG91dF9yZWxlYXNlX3JlcXVlc3Q7CisJfQorCisJLyogZGVmYXVsdHMsIHVudGlsIHRoZSBkZXZpY2UgdGVsbHMgdXMgb3RoZXJ3aXNlICovCisJc2RwLT5zZWN0b3Jfc2l6ZSA9IDUxMjsKKwlzZGtwLT5jYXBhY2l0eSA9IDA7CisJc2RrcC0+bWVkaWFfcHJlc2VudCA9IDE7CisJc2RrcC0+d3JpdGVfcHJvdCA9IDA7CisJc2RrcC0+V0NFID0gMDsKKwlzZGtwLT5SQ0QgPSAwOworCisJc2Rfc3BpbnVwX2Rpc2soc2RrcCwgZGlzay0+ZGlza19uYW1lLCBzcmVxLCBidWZmZXIpOworCisJLyoKKwkgKiBXaXRob3V0IG1lZGlhIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBhc2s7IG1vcmVvdmVyLCBzb21lIGRldmljZXMKKwkgKiByZWFjdCBiYWRseSBpZiB3ZSBkby4KKwkgKi8KKwlpZiAoc2RrcC0+bWVkaWFfcHJlc2VudCkgeworCQlzZF9yZWFkX2NhcGFjaXR5KHNka3AsIGRpc2stPmRpc2tfbmFtZSwgc3JlcSwgYnVmZmVyKTsKKwkJaWYgKHNkcC0+cmVtb3ZhYmxlKQorCQkJc2RfcmVhZF93cml0ZV9wcm90ZWN0X2ZsYWcoc2RrcCwgZGlzay0+ZGlza19uYW1lLAorCQkJCQlzcmVxLCBidWZmZXIpOworCQlzZF9yZWFkX2NhY2hlX3R5cGUoc2RrcCwgZGlzay0+ZGlza19uYW1lLCBzcmVxLCBidWZmZXIpOworCX0KKwkJCisJc2V0X2NhcGFjaXR5KGRpc2ssIHNka3AtPmNhcGFjaXR5KTsKKwlrZnJlZShidWZmZXIpOworCisgb3V0X3JlbGVhc2VfcmVxdWVzdDogCisJc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JlcSk7Cisgb3V0OgorCXJldHVybiAwOworfQorCisvKioKKyAqCXNkX3Byb2JlIC0gY2FsbGVkIGR1cmluZyBkcml2ZXIgaW5pdGlhbGl6YXRpb24gYW5kIHdoZW5ldmVyIGEKKyAqCW5ldyBzY3NpIGRldmljZSBpcyBhdHRhY2hlZCB0byB0aGUgc3lzdGVtLiBJdCBpcyBjYWxsZWQgb25jZQorICoJZm9yIGVhY2ggc2NzaSBkZXZpY2UgKG5vdCBqdXN0IGRpc2tzKSBwcmVzZW50LgorICoJQGRldjogcG9pbnRlciB0byBkZXZpY2Ugb2JqZWN0CisgKgorICoJUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwgKG9yIG5vdCBpbnRlcmVzdGVkIGluIHRoaXMgc2NzaSBkZXZpY2UgCisgKgkoZS5nLiBzY2FubmVyKSk7IDEgd2hlbiB0aGVyZSBpcyBhbiBlcnJvci4KKyAqCisgKglOb3RlOiB0aGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgZnJvbSB0aGUgc2NzaSBtaWQtbGV2ZWwuCisgKglUaGlzIGZ1bmN0aW9uIHNldHMgdXAgdGhlIG1hcHBpbmcgYmV0d2VlbiBhIGdpdmVuIAorICoJPGhvc3QsY2hhbm5lbCxpZCxsdW4+IChmb3VuZCBpbiBzZHApIGFuZCBuZXcgZGV2aWNlIG5hbWUgCisgKgkoZS5nLiAvZGV2L3NkYSkuIE1vcmUgcHJlY2lzZWx5IGl0IGlzIHRoZSBibG9jayBkZXZpY2UgbWFqb3IgCisgKglhbmQgbWlub3IgbnVtYmVyIHRoYXQgaXMgY2hvc2VuIGhlcmUuCisgKgorICoJQXNzdW1lIHNkX2F0dGFjaCBpcyBub3QgcmUtZW50cmFudCAoZm9yIHRpbWUgYmVpbmcpCisgKglBbHNvIHRoaW5rIGFib3V0IHNkX2F0dGFjaCgpIGFuZCBzZF9yZW1vdmUoKSBydW5uaW5nIGNvaW5jaWRlbnRhbGx5LgorICoqLworc3RhdGljIGludCBzZF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZHAgPSB0b19zY3NpX2RldmljZShkZXYpOworCXN0cnVjdCBzY3NpX2Rpc2sgKnNka3A7CisJc3RydWN0IGdlbmRpc2sgKmdkOworCXUzMiBpbmRleDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IC1FTk9ERVY7CisJaWYgKChzZHAtPnR5cGUgIT0gVFlQRV9ESVNLKSAmJiAoc2RwLT50eXBlICE9IFRZUEVfTU9EKSkKKwkJZ290byBvdXQ7CisKKwlTQ1NJX0xPR19ITFFVRVVFKDMsIHByaW50aygic2RfYXR0YWNoOiBzY3NpIGRldmljZTogPCVkLCVkLCVkLCVkPlxuIiwgCisJCQkgc2RwLT5ob3N0LT5ob3N0X25vLCBzZHAtPmNoYW5uZWwsIHNkcC0+aWQsIHNkcC0+bHVuKSk7CisKKwllcnJvciA9IC1FTk9NRU07CisJc2RrcCA9IGttYWxsb2Moc2l6ZW9mKCpzZGtwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZGtwKQorCQlnb3RvIG91dDsKKworCW1lbXNldCAoc2RrcCwgMCwgc2l6ZW9mKCpzZGtwKSk7CisJa3JlZl9pbml0KCZzZGtwLT5rcmVmKTsKKworCWdkID0gYWxsb2NfZGlzaygxNik7CisJaWYgKCFnZCkKKwkJZ290byBvdXRfZnJlZTsKKworCWlmICghaWRyX3ByZV9nZXQoJnNkX2luZGV4X2lkciwgR0ZQX0tFUk5FTCkpCisJCWdvdG8gb3V0X3B1dDsKKworCXNwaW5fbG9jaygmc2RfaW5kZXhfbG9jayk7CisJZXJyb3IgPSBpZHJfZ2V0X25ldygmc2RfaW5kZXhfaWRyLCBOVUxMLCAmaW5kZXgpOworCXNwaW5fdW5sb2NrKCZzZF9pbmRleF9sb2NrKTsKKworCWlmIChpbmRleCA+PSBTRF9NQVhfRElTS1MpCisJCWVycm9yID0gLUVCVVNZOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfcHV0OworCisJc2RrcC0+ZGV2aWNlID0gc2RwOworCXNka3AtPmRyaXZlciA9ICZzZF90ZW1wbGF0ZTsKKwlzZGtwLT5kaXNrID0gZ2Q7CisJc2RrcC0+aW5kZXggPSBpbmRleDsKKwlzZGtwLT5vcGVuZXJzID0gMDsKKworCWlmICghc2RwLT50aW1lb3V0KSB7CisJCWlmIChzZHAtPnR5cGUgPT0gVFlQRV9ESVNLKQorCQkJc2RwLT50aW1lb3V0ID0gU0RfVElNRU9VVDsKKwkJZWxzZQorCQkJc2RwLT50aW1lb3V0ID0gU0RfTU9EX1RJTUVPVVQ7CisJfQorCisJZ2QtPm1ham9yID0gc2RfbWFqb3IoKGluZGV4ICYgMHhmMCkgPj4gNCk7CisJZ2QtPmZpcnN0X21pbm9yID0gKChpbmRleCAmIDB4ZikgPDwgNCkgfCAoaW5kZXggJiAweGZmZjAwKTsKKwlnZC0+bWlub3JzID0gMTY7CisJZ2QtPmZvcHMgPSAmc2RfZm9wczsKKworCWlmIChpbmRleCA8IDI2KSB7CisJCXNwcmludGYoZ2QtPmRpc2tfbmFtZSwgInNkJWMiLCAnYScgKyBpbmRleCAlIDI2KTsKKwl9IGVsc2UgaWYgKGluZGV4IDwgKDI2ICsgMSkgKiAyNikgeworCQlzcHJpbnRmKGdkLT5kaXNrX25hbWUsICJzZCVjJWMiLAorCQkJJ2EnICsgaW5kZXggLyAyNiAtIDEsJ2EnICsgaW5kZXggJSAyNik7CisJfSBlbHNlIHsKKwkJY29uc3QgdW5zaWduZWQgaW50IG0xID0gKGluZGV4IC8gMjYgLSAxKSAvIDI2IC0gMTsKKwkJY29uc3QgdW5zaWduZWQgaW50IG0yID0gKGluZGV4IC8gMjYgLSAxKSAlIDI2OworCQljb25zdCB1bnNpZ25lZCBpbnQgbTMgPSAgaW5kZXggJSAyNjsKKwkJc3ByaW50ZihnZC0+ZGlza19uYW1lLCAic2QlYyVjJWMiLAorCQkJJ2EnICsgbTEsICdhJyArIG0yLCAnYScgKyBtMyk7CisJfQorCisJc3RyY3B5KGdkLT5kZXZmc19uYW1lLCBzZHAtPmRldmZzX25hbWUpOworCisJZ2QtPnByaXZhdGVfZGF0YSA9ICZzZGtwLT5kcml2ZXI7CisKKwlzZF9yZXZhbGlkYXRlX2Rpc2soZ2QpOworCisJZ2QtPmRyaXZlcmZzX2RldiA9ICZzZHAtPnNkZXZfZ2VuZGV2OworCWdkLT5mbGFncyA9IEdFTkhEX0ZMX0RSSVZFUkZTOworCWlmIChzZHAtPnJlbW92YWJsZSkKKwkJZ2QtPmZsYWdzIHw9IEdFTkhEX0ZMX1JFTU9WQUJMRTsKKwlnZC0+cXVldWUgPSBzZGtwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWU7CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBzZGtwKTsKKwlhZGRfZGlzayhnZCk7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIkF0dGFjaGVkIHNjc2kgJXNkaXNrICVzIGF0IHNjc2klZCwgY2hhbm5lbCAlZCwgIgorCSAgICAgICAiaWQgJWQsIGx1biAlZFxuIiwgc2RwLT5yZW1vdmFibGUgPyAicmVtb3ZhYmxlICIgOiAiIiwKKwkgICAgICAgZ2QtPmRpc2tfbmFtZSwgc2RwLT5ob3N0LT5ob3N0X25vLCBzZHAtPmNoYW5uZWwsCisJICAgICAgIHNkcC0+aWQsIHNkcC0+bHVuKTsKKworCXJldHVybiAwOworCitvdXRfcHV0OgorCXB1dF9kaXNrKGdkKTsKK291dF9mcmVlOgorCWtmcmVlKHNka3ApOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglzZF9yZW1vdmUgLSBjYWxsZWQgd2hlbmV2ZXIgYSBzY3NpIGRpc2sgKHByZXZpb3VzbHkgcmVjb2duaXplZCBieQorICoJc2RfcHJvYmUpIGlzIGRldGFjaGVkIGZyb20gdGhlIHN5c3RlbS4gSXQgaXMgY2FsbGVkIChwb3RlbnRpYWxseQorICoJbXVsdGlwbGUgdGltZXMpIGR1cmluZyBzZCBtb2R1bGUgdW5sb2FkLgorICoJQHNkcDogcG9pbnRlciB0byBtaWQgbGV2ZWwgc2NzaSBkZXZpY2Ugb2JqZWN0CisgKgorICoJTm90ZTogdGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGZyb20gdGhlIHNjc2kgbWlkLWxldmVsLgorICoJVGhpcyBmdW5jdGlvbiBwb3RlbnRpYWxseSBmcmVlcyB1cCBhIGRldmljZSBuYW1lIChlLmcuIC9kZXYvc2RjKQorICoJdGhhdCBjb3VsZCBiZSByZS11c2VkIGJ5IGEgc3Vic2VxdWVudCBzZF9wcm9iZSgpLgorICoJVGhpcyBmdW5jdGlvbiBpcyBub3QgY2FsbGVkIHdoZW4gdGhlIGJ1aWx0LWluIHNkIGRyaXZlciBpcyAiZXhpdC1lZCIuCisgKiovCitzdGF0aWMgaW50IHNkX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjc2lfZGlzayAqc2RrcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJZGVsX2dlbmRpc2soc2RrcC0+ZGlzayk7CisJc2Rfc2h1dGRvd24oZGV2KTsKKwlkb3duKCZzZF9yZWZfc2VtKTsKKwlrcmVmX3B1dCgmc2RrcC0+a3JlZiwgc2NzaV9kaXNrX3JlbGVhc2UpOworCXVwKCZzZF9yZWZfc2VtKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXNjc2lfZGlza19yZWxlYXNlIC0gQ2FsbGVkIHRvIGZyZWUgdGhlIHNjc2lfZGlzayBzdHJ1Y3R1cmUKKyAqCUBrcmVmOiBwb2ludGVyIHRvIGVtYmVkZGVkIGtyZWYKKyAqCisgKglzZF9yZWZfc2VtIG11c3QgYmUgaGVsZCBlbnRlcmluZyB0aGlzIHJvdXRpbmUuICBCZWNhdXNlIGl0IGlzCisgKgljYWxsZWQgb24gbGFzdCBwdXQsIHlvdSBzaG91bGQgYWx3YXlzIHVzZSB0aGUgc2NzaV9kaXNrX2dldCgpCisgKglzY3NpX2Rpc2tfcHV0KCkgaGVscGVycyB3aGljaCBtYW5pcHVsYXRlIHRoZSBzZW1hcGhvcmUgZGlyZWN0bHkKKyAqCWFuZCBuZXZlciBkbyBhIGRpcmVjdCBrcmVmX3B1dCgpLgorICoqLworc3RhdGljIHZvaWQgc2NzaV9kaXNrX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHNjc2lfZGlzayAqc2RrcCA9IHRvX3Njc2lfZGlzayhrcmVmKTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IHNka3AtPmRpc2s7CisJCisJc3Bpbl9sb2NrKCZzZF9pbmRleF9sb2NrKTsKKwlpZHJfcmVtb3ZlKCZzZF9pbmRleF9pZHIsIHNka3AtPmluZGV4KTsKKwlzcGluX3VubG9jaygmc2RfaW5kZXhfbG9jayk7CisKKwlkaXNrLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCisJcHV0X2Rpc2soZGlzayk7CisKKwlrZnJlZShzZGtwKTsKK30KKworLyoKKyAqIFNlbmQgYSBTWU5DSFJPTklaRSBDQUNIRSBpbnN0cnVjdGlvbiBkb3duIHRvIHRoZSBkZXZpY2UgdGhyb3VnaAorICogdGhlIG5vcm1hbCBTQ1NJIGNvbW1hbmQgc3RydWN0dXJlLiAgV2FpdCBmb3IgdGhlIGNvbW1hbmQgdG8KKyAqIGNvbXBsZXRlLgorICovCitzdGF0aWMgdm9pZCBzZF9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZHAgPSB0b19zY3NpX2RldmljZShkZXYpOworCXN0cnVjdCBzY3NpX2Rpc2sgKnNka3AgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghc2RrcCkKKwkJcmV0dXJuOyAgICAgICAgIC8qIHRoaXMgY2FuIGhhcHBlbiAqLworCisJaWYgKCFzZGtwLT5XQ0UpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX05PVElDRSAiU3luY2hyb25pemluZyBTQ1NJIGNhY2hlIGZvciBkaXNrICVzOiBcbiIsCisJCQlzZGtwLT5kaXNrLT5kaXNrX25hbWUpOworCXNkX3N5bmNfY2FjaGUoc2RwKTsKK30JCisKKy8qKgorICoJaW5pdF9zZCAtIGVudHJ5IHBvaW50IGZvciB0aGlzIGRyaXZlciAoYm90aCB3aGVuIGJ1aWx0IGluIG9yIHdoZW4KKyAqCWEgbW9kdWxlKS4KKyAqCisgKglOb3RlOiB0aGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyB0aGlzIGRyaXZlciB3aXRoIHRoZSBzY3NpIG1pZC1sZXZlbC4KKyAqKi8KK3N0YXRpYyBpbnQgX19pbml0IGluaXRfc2Qodm9pZCkKK3sKKwlpbnQgbWFqb3JzID0gMCwgaTsKKworCVNDU0lfTE9HX0hMUVVFVUUoMywgcHJpbnRrKCJpbml0X3NkOiBzZCBkcml2ZXIgZW50cnkgcG9pbnRcbiIpKTsKKworCWZvciAoaSA9IDA7IGkgPCBTRF9NQUpPUlM7IGkrKykKKwkJaWYgKHJlZ2lzdGVyX2Jsa2RldihzZF9tYWpvcihpKSwgInNkIikgPT0gMCkKKwkJCW1ham9ycysrOworCisJaWYgKCFtYWpvcnMpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHNjc2lfcmVnaXN0ZXJfZHJpdmVyKCZzZF90ZW1wbGF0ZS5nZW5kcnYpOworfQorCisvKioKKyAqCWV4aXRfc2QgLSBleGl0IHBvaW50IGZvciB0aGlzIGRyaXZlciAod2hlbiBpdCBpcyBhIG1vZHVsZSkuCisgKgorICoJTm90ZTogdGhpcyBmdW5jdGlvbiB1bnJlZ2lzdGVycyB0aGlzIGRyaXZlciBmcm9tIHRoZSBzY3NpIG1pZC1sZXZlbC4KKyAqKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3NkKHZvaWQpCit7CisJaW50IGk7CisKKwlTQ1NJX0xPR19ITFFVRVVFKDMsIHByaW50aygiZXhpdF9zZDogZXhpdGluZyBzZCBkcml2ZXJcbiIpKTsKKworCXNjc2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnNkX3RlbXBsYXRlLmdlbmRydik7CisJZm9yIChpID0gMDsgaSA8IFNEX01BSk9SUzsgaSsrKQorCQl1bnJlZ2lzdGVyX2Jsa2RldihzZF9tYWpvcihpKSwgInNkIik7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkVyaWMgWW91bmdkYWxlIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNDU0kgZGlzayAoc2QpIGRyaXZlciIpOworCittb2R1bGVfaW5pdChpbml0X3NkKTsKK21vZHVsZV9leGl0KGV4aXRfc2QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NlYWdhdGUuYyBiL2RyaXZlcnMvc2NzaS9zZWFnYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2MmZmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zZWFnYXRlLmMKQEAgLTAsMCArMSwxNjc1IEBACisvKgorICogICAgc2VhZ2F0ZS5jIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MyBEcmV3IEVja2hhcmR0CisgKiAgICAgIGxvdyBsZXZlbCBzY3NpIGRyaXZlciBmb3IgU1QwMS9TVDAyLCBGdXR1cmUgRG9tYWluIFRNQy04ODUsCisgKiAgICAgIFRNQy05NTAgYnkgRHJldyBFY2toYXJkdCA8ZHJld0Bjb2xvcmFkby5lZHU+CisgKgorICogICAgICBOb3RlIDogVE1DLTg4MCBib2FyZHMgZG9uJ3Qgd29yayBiZWNhdXNlIHRoZXkgaGF2ZSB0d28gYml0cyBpbgorICogICAgICAgICAgICAgIHRoZSBzdGF0dXMgcmVnaXN0ZXIgZmxpcHBlZCwgSSdsbCBmaXggdGhpcyAiUlNOIgorICoJW3doeSBkbyBJIGhhdmUgc3Ryb25nIGZlZWxpbmcgdGhhdCBhYm92ZSBtZXNzYWdlIGlzIGZyb20gMTk5Mz8gOi0pCisgKgkgICAgICAgIHBhdmVsQHVjdy5jel0KKyAqCisgKiAgICAgIFRoaXMgY2FyZCBkb2VzIGFsbCB0aGUgSS9PIHZpYSBtZW1vcnkgbWFwcGVkIEkvTywgc28gdGhlcmUgaXMgbm8gbmVlZAorICogICAgICB0byBjaGVjayBvciBhbGxvY2F0ZSBhIHJlZ2lvbiBvZiB0aGUgSS9PIGFkZHJlc3Mgc3BhY2UuCisgKi8KKworLyogMTk5NiAtIHRvIHVzZSBuZXcgcmVhZHtiLHcsbH0sIHdyaXRle2IsdyxsfSwgYW5kIHBoeXNfdG9fdmlydAorICogbWFjcm9zLCByZXBsYWNlZCBhc3NlbWJsZXIgcm91dGluZXMgd2l0aCBDLiBUaGVyZSdzIHByb2JhYmx5IGEKKyAqIHBlcmZvcm1hbmNlIGhpdCwgYnV0IEkgb25seSBoYXZlIGEgY2Ryb20gYW5kIGNhbid0IHRlbGwuIERlZmluZQorICogU0VBR0FURV9VU0VfQVNNIGlmIHlvdSB3YW50IHRoZSBvbGQgYXNzZW1ibGVyIGNvZGUgLS0gU0pUCisgKgorICogMTk5OC1qdWwtMjkgLSBjcmVhdGVkIERQUklOVEsgbWFjcm9zIGFuZCBtYWRlIGl0IHdvcmsgdW5kZXIgCisgKiBsaW51eCAyLjEuMTEyLCBzaW1wbGlmaWVkIHNvbWUgI2RlZmluZXMgZXRjLiA8cGF2ZWxAdWN3LmN6PgorICoKKyAqIEF1ZyAyMDAwIC0gYWViIC0gZGVsZXRlZCBzZWFnYXRlX3N0MHhfYmlvc3BhcmFtKCkuIEl0IHdvdWxkIHRyeSB0bworICogcmVhZCB0aGUgcGh5c2ljYWwgZGlzayBnZW9tZXRyeSwgYSBiYWQgbWlzdGFrZS4gT2YgY291cnNlIGl0IGRvZXNuJ3QKKyAqIG1hdHRlciBtdWNoIHdoYXQgZ2VvbWV0cnkgb25lIGludmVudHMsIGJ1dCBvbiBsYXJnZSBkaXNrcyBpdAorICogcmV0dXJuZWQgMjU2IChvciBtb3JlKSBoZWFkcywgY2F1c2luZyBhbGwga2luZCBvZiBmYWlsdXJlcy4KKyAqIE9mIGNvdXJzZSB0aGlzIG1lYW5zIHRoYXQgcGVvcGxlIG1pZ2h0IHNlZSBhIGRpZmZlcmVudCBnZW9tZXRyeSBub3csCisgKiBzbyBib290IHBhcmFtZXRlcnMgbWF5IGJlIG5lY2Vzc2FyeSBpbiBzb21lIGNhc2VzLgorICovCisKKy8qCisgKiBDb25maWd1cmF0aW9uIDoKKyAqIFRvIHVzZSB3aXRob3V0IEJJT1MgLURPVkVSUklERT1iYXNlX2FkZHJlc3MgLURDT05UUk9MTEVSPUZEIG9yIFNFQUdBVEUKKyAqIC1ESVJRIHdpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb2YgNS4KKyAqIE5vdGU6IFlvdSBjYW4gbm93IHNldCB0aGVzZSBvcHRpb25zIGZyb20gdGhlIGtlcm5lbCdzICJjb21tYW5kIGxpbmUiLgorICogVGhlIHN5bnRheCBpczoKKyAqCisgKiAgICAgc3QweD1BRERSRVNTLElSUSAgICAgICAgICAgICAgICAoZm9yIGEgU2VhZ2F0ZSBjb250cm9sbGVyKQorICogb3I6CisgKiAgICAgdG1jOHh4PUFERFJFU1MsSVJRICAgICAgICAgICAgICAoZm9yIGEgVE1DLTh4eCBvciBUTUMtOTUwIGNvbnRyb2xsZXIpCisgKiBlZzoKKyAqICAgICB0bWM4eHg9MHhDODAwMCwxNQorICoKKyAqIHdpbGwgY29uZmlndXJlIHRoZSBkcml2ZXIgZm9yIGEgVE1DLTh4eCBzdHlsZSBjb250cm9sbGVyIHVzaW5nIElSUSAxNQorICogd2l0aCBhIGJhc2UgYWRkcmVzcyBvZiAweEM4MDAwLgorICoKKyAqIC1EQVJCSVRSQVRFIAorICogICAgICBXaWxsIGNhdXNlIHRoZSBob3N0IGFkYXB0ZXIgdG8gYXJiaXRyYXRlIGZvciB0aGUKKyAqICAgICAgYnVzIGZvciBiZXR0ZXIgU0NTSS1JSSBjb21wYXRpYmlsaXR5LCByYXRoZXIgdGhhbiBqdXN0CisgKiAgICAgIHdhaXRpbmcgZm9yIEJVUyBGUkVFIGFuZCB0aGVuIGRvaW5nIGl0cyB0aGluZy4gIFNob3VsZAorICogICAgICBsZXQgdXMgZG8gb25lIGNvbW1hbmQgcGVyIEx1biB3aGVuIEkgaW50ZWdyYXRlIG15CisgKiAgICAgIHJlb3JnYW5pemF0aW9uIGNoYW5nZXMgaW50byB0aGUgZGlzdHJpYnV0aW9uIHNvdXJjZXMuCisgKgorICogLURERUJVRz02NTUzNQorICogICAgICBXaWxsIGFjdGl2YXRlIGRlYnVnIGNvZGUuCisgKgorICogLURGQVNUIG9yIC1ERkFTVDMyIAorICogICAgICBXaWxsIHVzZSBibGluZCB0cmFuc2ZlcnMgd2hlcmUgcG9zc2libGUKKyAqCisgKiAtRFBBUklUWSAgCisgKiAgICAgIFRoaXMgd2lsbCBlbmFibGUgcGFyaXR5LgorICoKKyAqIC1EU0VBR0FURV9VU0VfQVNNCisgKiAgICAgIFdpbGwgdXNlIG9sZGVyIHNlYWdhdGUgYXNzZW1ibHkgY29kZS4gc2hvdWxkIGJlICh2ZXJ5IHNtYWxsIGFtb3VudCkKKyAqICAgICAgRmFzdGVyLgorICoKKyAqIC1EU0xPV19SQVRFPTUwCisgKiAgICAgIFdpbGwgYWxsb3cgY29tcGF0aWJpbGl0eSB3aXRoIGJyb2tlbiBkZXZpY2VzIHRoYXQgZG9uJ3QKKyAqICAgICAgaGFuZHNoYWtlIGZhc3QgZW5vdWdoIChpZSwgc29tZSBDRCBST00ncykgZm9yIHRoZSBTZWFnYXRlCisgKiAgICAgIGNvZGUuCisgKgorICogICAgICA1MCBpcyBzb21lIG51bWJlciwgSXQgd2lsbCBsZXQgeW91IHNwZWNpZnkgYSBkZWZhdWx0CisgKiAgICAgIHRyYW5zZmVyIHJhdGUgaWYgaGFuZHNoYWtpbmcgaXNuJ3Qgd29ya2luZyBjb3JyZWN0bHkuCisgKgorICogLURPTERDTlREQVRBU0NFTUUgIFRoZXJlIGlzIGEgbmV3IHNjZW1lIHRvIHNldCB0aGUgQ09OVFJPTAorICogICAgICAgICAgICAgICAgICAgIGFuZCBEQVRBIHJlaWdzdGVycyB3aGljaCBjb21wbGllcyBtb3JlIGNsb3NlbHkKKyAqICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBTQ1NJMiBzdGFuZGFyZC4gVGhpcyBob3BlZnVsbHkgZWxpbWluYXRlcworICogICAgICAgICAgICAgICAgICAgIHRoZSBuZWVkIHRvIHN3YXAgdGhlIG9yZGVyIHRoZXNlIHJlZ2lzdGVycyBhcmUKKyAqICAgICAgICAgICAgICAgICAgICAnbWVzc2VkJyB3aXRoLiBJdCBtYWtlcyB0aGUgZm9sbG93aW5nIHR3byBvcHRpb25zCisgKiAgICAgICAgICAgICAgICAgICAgb2Jzb2xldGUuIFRvIHJlZW5hYmxlIHRoZSBvbGQgc2NlbWUgZGVmaW5lIHRoaXMuCisgKgorICogVGhlIGZvbGxvd2luZyB0byBvcHRpb25zIGFyZSBwYXRjaGVzIGZyb20gdGhlIFNDU0kuSE9XVE8KKyAqCisgKiAtRFNXQVBTVEFUICBUaGlzIHdpbGwgc3dhcCB0aGUgZGVmaW5pdGlvbnMgZm9yIFNUQVRfTVNHIGFuZCBTVEFUX0NELgorICoKKyAqIC1EU1dBUENOVERBVEEgIFRoaXMgd2lsbCBzd2FwIHRoZSBvcmRlciB0aGF0IHNlYWdhdGUuYyBtZXNzZXMgd2l0aAorICogICAgICAgICAgICAgICAgdGhlIENPTlRST0wgYW4gREFUQSByZWdpc3RlcnMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAic2VhZ2F0ZS5oIgorCisjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEUFJJTlRLKCB3aGVuLCBtc2cuLi4gKSBkbyB7IGlmICggKERFQlVHICYgKHdoZW4pKSA9PSAod2hlbikgKSBwcmludGsoIG1zZyApOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyggd2hlbiwgbXNnLi4uICkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisjZGVmaW5lIERBTlkoIG1zZy4uLiApIERQUklOVEsoIDB4ZmZmZiwgbXNnICk7CisKKyNpZm5kZWYgSVJRCisjZGVmaW5lIElSUSA1CisjZW5kaWYKKworI2lmZGVmIEZBU1QzMgorI2RlZmluZSBGQVNUCisjZW5kaWYKKworI3VuZGVmIExJTktFRAkJCS8qIExpbmtlZCBjb21tYW5kcyBhcmUgY3VycmVudGx5IGJyb2tlbiEgKi8KKworI2lmIGRlZmluZWQoT1ZFUlJJREUpICYmICFkZWZpbmVkKENPTlRST0xMRVIpCisjZXJyb3IgUGxlYXNlIHVzZSAtRENPTlRST0xMRVI9U0VBR0FURSBvciAtRENPTlRST0xMRVI9RkQgdG8gb3ZlcnJpZGUgY29udHJvbGxlciB0eXBlCisjZW5kaWYKKworI2lmbmRlZiBfX2kzODZfXworI3VuZGVmIFNFQUdBVEVfVVNFX0FTTQorI2VuZGlmCisKKy8qCisJVGhhbmtzIHRvIEJyaWFuIEFudG9pbmUgZm9yIHRoZSBleGFtcGxlIGNvZGUgaW4gaGlzIE1lc3N5LUxvc3MgU1QtMDEKKwkJZHJpdmVyLCBhbmQgTWl0c3VndSBTdXp1a2kgZm9yIGluZm9ybWF0aW9uIG9uIHRoZSBTVC0wMQorCQlTQ1NJIGhvc3QuCisqLworCisvKgorCUNPTlRST0wgZGVmaW5lcworKi8KKworI2RlZmluZSBDTURfUlNUIAkJMHgwMQorI2RlZmluZSBDTURfU0VMIAkJMHgwMgorI2RlZmluZSBDTURfQlNZIAkJMHgwNAorI2RlZmluZSBDTURfQVRUTiAgICAJCTB4MDgKKyNkZWZpbmUgQ01EX1NUQVJUX0FSQgkJMHgxMAorI2RlZmluZSBDTURfRU5fUEFSSVRZCQkweDIwCisjZGVmaW5lIENNRF9JTlRSCQkweDQwCisjZGVmaW5lIENNRF9EUlZSX0VOQUJMRQkJMHg4MAorCisvKgorCVNUQVRVUworKi8KKyNpZmRlZiBTV0FQU1RBVAorI2RlZmluZSBTVEFUX01TRwkJMHgwOAorI2RlZmluZSBTVEFUX0NECQkJMHgwMgorI2Vsc2UKKyNkZWZpbmUgU1RBVF9NU0cJCTB4MDIKKyNkZWZpbmUgU1RBVF9DRAkJCTB4MDgKKyNlbmRpZgorCisjZGVmaW5lIFNUQVRfQlNZCQkweDAxCisjZGVmaW5lIFNUQVRfSU8JCQkweDA0CisjZGVmaW5lIFNUQVRfUkVRCQkweDEwCisjZGVmaW5lIFNUQVRfU0VMCQkweDIwCisjZGVmaW5lIFNUQVRfUEFSSVRZCQkweDQwCisjZGVmaW5lIFNUQVRfQVJCX0NNUEwJCTB4ODAKKworLyogCisJUkVRVUVTVFMKKyovCisKKyNkZWZpbmUgUkVRX01BU0sgKFNUQVRfQ0QgfCAgU1RBVF9JTyB8IFNUQVRfTVNHKQorI2RlZmluZSBSRVFfREFUQU9VVCAwCisjZGVmaW5lIFJFUV9EQVRBSU4gU1RBVF9JTworI2RlZmluZSBSRVFfQ01ET1VUIFNUQVRfQ0QKKyNkZWZpbmUgUkVRX1NUQVRJTiAoU1RBVF9DRCB8IFNUQVRfSU8pCisjZGVmaW5lIFJFUV9NU0dPVVQgKFNUQVRfTVNHIHwgU1RBVF9DRCkKKyNkZWZpbmUgUkVRX01TR0lOIChTVEFUX01TRyB8IFNUQVRfQ0QgfCBTVEFUX0lPKQorCitleHRlcm4gdm9sYXRpbGUgaW50IHNlYWdhdGVfc3QweF90aW1lb3V0OworCisjaWZkZWYgUEFSSVRZCisjZGVmaW5lIEJBU0VfQ01EIENNRF9FTl9QQVJJVFkKKyNlbHNlCisjZGVmaW5lIEJBU0VfQ01EICAwCisjZW5kaWYKKworLyoKKwlEZWJ1Z2dpbmcgY29kZQorKi8KKworI2RlZmluZSBQSEFTRV9CVVNfRlJFRSAxCisjZGVmaW5lIFBIQVNFX0FSQklUUkFUSU9OIDIKKyNkZWZpbmUgUEhBU0VfU0VMRUNUSU9OIDQKKyNkZWZpbmUgUEhBU0VfREFUQUlOIDgKKyNkZWZpbmUgUEhBU0VfREFUQU9VVCAweDEwCisjZGVmaW5lIFBIQVNFX0NNRE9VVCAweDIwCisjZGVmaW5lIFBIQVNFX01TR0lOIDB4NDAKKyNkZWZpbmUgUEhBU0VfTVNHT1VUIDB4ODAKKyNkZWZpbmUgUEhBU0VfU1RBVFVTSU4gMHgxMDAKKyNkZWZpbmUgUEhBU0VfRVRDIChQSEFTRV9EQVRBSU4gfCBQSEFTRV9EQVRBT1VUIHwgUEhBU0VfQ01ET1VUIHwgUEhBU0VfTVNHSU4gfCBQSEFTRV9NU0dPVVQgfCBQSEFTRV9TVEFUVVNJTikKKyNkZWZpbmUgUFJJTlRfQ09NTUFORCAweDIwMAorI2RlZmluZSBQSEFTRV9FWElUIDB4NDAwCisjZGVmaW5lIFBIQVNFX1JFU0VMRUNUIDB4ODAwCisjZGVmaW5lIERFQlVHX0ZBU1QgMHgxMDAwCisjZGVmaW5lIERFQlVHX1NHICAgMHgyMDAwCisjZGVmaW5lIERFQlVHX0xJTktFRAkweDQwMDAKKyNkZWZpbmUgREVCVUdfQk9SS0VOCTB4ODAwMAorCisvKiAKKyAqCUNvbnRyb2wgb3B0aW9ucyAtIHRoZXNlIGFyZSB0aW1lb3V0cyBzcGVjaWZpZWQgaW4gLjAxIHNlY29uZHMuCisgKi8KKworLyogMzAsIDIwIHdvcmsgKi8KKyNkZWZpbmUgU1QwWF9CVVNfRlJFRV9ERUxBWSAyNQorI2RlZmluZSBTVDBYX1NFTEVDVElPTl9ERUxBWSAyNQorCisjZGVmaW5lIFNFQUdBVEUgMQkJLyogdGhlc2UgZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHRoZSBjb250cm9sbGVyICovCisjZGVmaW5lIEZECTIKKworI2RlZmluZSBTVDBYX0lEX1NUUgkiU2VhZ2F0ZSBTVC0wMS9TVC0wMiIKKyNkZWZpbmUgRkRfSURfU1RSCSJUTUMtOFhYL1RNQy05NTAiCisKK3N0YXRpYyBpbnQgaW50ZXJuYWxfY29tbWFuZCAodW5zaWduZWQgY2hhciB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgbHVuLAorCQkJICAgICBjb25zdCB2b2lkICpjbW5kLAorCQkJICAgICB2b2lkICpidWZmLCBpbnQgYnVmZmxlbiwgaW50IHJlc2VsZWN0KTsKKworc3RhdGljIGludCBpbmNvbW1hbmQ7CQkvKiBzZXQgaWYgYXJiaXRyYXRpb24gaGFzIGZpbmlzaGVkCisJCQkJICAgYW5kIHdlIGFyZSBpbiBzb21lIGNvbW1hbmQgcGhhc2UuICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYmFzZV9hZGRyZXNzID0gMDsJLyogV2hlcmUgdGhlIGNhcmQgUk9NIHN0YXJ0cywgdXNlZCB0byAKKwkJCQkJICAgY2FsY3VsYXRlIG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXIKKwkJCQkJICAgbG9jYXRpb24uICAqLworCitzdGF0aWMgdm9pZCBfX2lvbWVtICpzdDB4X2NyX3NyOwkvKiBjb250cm9sIHJlZ2lzdGVyIHdyaXRlLCBzdGF0dXMKKwkJCQkJICAgcmVnaXN0ZXIgcmVhZC4gIDI1NiBieXRlcyBpbgorCQkJCQkgICBsZW5ndGguCisJCQkJCSAgIFJlYWQgaXMgc3RhdHVzIG9mIFNDU0kgQlVTLCBhcyBwZXIgCisJCQkJCSAgIFNUQVQgbWFza3MuICAqLworCitzdGF0aWMgdm9pZCBfX2lvbWVtICpzdDB4X2RyOwkvKiBkYXRhIHJlZ2lzdGVyLCByZWFkIHdyaXRlIDI1NgorCQkJCSAgIGJ5dGVzIGluIGxlbmd0aC4gICovCisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgc3QweF9hYm9ydGVkID0gMDsJLyogc2V0IHdoZW4gd2UgYXJlIGFib3J0ZWQsIGllIGJ5IGEKKwkJCQkJICAgdGltZSBvdXQsIGV0Yy4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNvbnRyb2xsZXJfdHlwZSA9IDA7CS8qIHNldCB0byBTRUFHQVRFIGZvciBTVDB4CisJCQkJCQkgICBib2FyZHMgb3IgRkQgZm9yIFRNQy04eHgKKwkJCQkJCSAgIGJvYXJkcyAqLworc3RhdGljIGludCBpcnEgPSBJUlE7CisKK21vZHVsZV9wYXJhbShiYXNlX2FkZHJlc3MsIHVpbnQsIDApOworbW9kdWxlX3BhcmFtKGNvbnRyb2xsZXJfdHlwZSwgYnl0ZSwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKyNkZWZpbmUgcmV0Y29kZShyZXN1bHQpICgoKHJlc3VsdCkgPDwgMTYpIHwgKG1lc3NhZ2UgPDwgOCkgfCBzdGF0dXMpCisjZGVmaW5lIFNUQVRVUyAoKHU4KSByZWFkYihzdDB4X2NyX3NyKSkKKyNkZWZpbmUgREFUQSAoKHU4KSByZWFkYihzdDB4X2RyKSkKKyNkZWZpbmUgV1JJVEVfQ09OVFJPTChkKSB7IHdyaXRlYigoZCksIHN0MHhfY3Jfc3IpOyB9CisjZGVmaW5lIFdSSVRFX0RBVEEoZCkgeyB3cml0ZWIoKGQpLCBzdDB4X2RyKTsgfQorCisjaWZuZGVmIE9WRVJSSURFCitzdGF0aWMgdW5zaWduZWQgaW50IHNlYWdhdGVfYmFzZXNbXSA9IHsKKwkweGM4MDAwLCAweGNhMDAwLCAweGNjMDAwLAorCTB4Y2UwMDAsIDB4ZGMwMDAsIDB4ZGUwMDAKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmU7CisJdW5zaWduZWQgb2Zmc2V0OworCXVuc2lnbmVkIGxlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIHR5cGU7Cit9IFNpZ25hdHVyZTsKKworc3RhdGljIFNpZ25hdHVyZSBfX2luaXRkYXRhIHNpZ25hdHVyZXNbXSA9IHsKKwl7IlNUMDEgdjEuNyAgKEMpIENvcHlyaWdodCAxOTg3IFNlYWdhdGUiLCAxNSwgMzcsIFNFQUdBVEV9LAorCXsiU0NTSSBCSU9TIDIuMDAgIChDKSBDb3B5cmlnaHQgMTk4NyBTZWFnYXRlIiwgMTUsIDQwLCBTRUFHQVRFfSwKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIGFyZSBOT1QgbWlzdGFrZXMuICBPbmUgZGV0ZWN0cyBST00gcmV2aXNpb24KKyAqIDMuMC4wLCB0aGUgb3RoZXIgMy4yLiAgU2luY2Ugc2VhZ2F0ZSBoYXMgb25seSBvbmUgdHlwZSBvZiBTQ1NJIGFkYXB0ZXIsCisgKiBhbmQgdGhpcyBpcyBub3QgZ29pbmcgdG8gY2hhbmdlLCB0aGUgIlNFQUdBVEUiIGFuZCAiU0NTSSIgdG9nZXRoZXIKKyAqIGFyZSBwcm9iYWJseSAiZ29vZCBlbm91Z2giCisgKi8KKworCXsiU0VBR0FURSBTQ1NJIEJJT1MgIiwgMTYsIDE3LCBTRUFHQVRFfSwKKwl7IlNFQUdBVEUgU0NTSSBCSU9TICIsIDE3LCAxNywgU0VBR0FURX0sCisKKy8qCisgKiBIb3dldmVyLCBmdXR1cmUgZG9tYWluIG1ha2VzIHNldmVyYWwgaW5jb21wYXRpYmxlIFNDU0kgYm9hcmRzLCBzbyBzcGVjaWZpYworICogc2lnbmF0dXJlcyBtdXN0IGJlIHVzZWQuCisgKi8KKworCXsiRlVUVVJFIERPTUFJTiBDT1JQLiAoQykgMTk4Ni0xOTg5IFY1LjBDMi8xNC84OSIsIDUsIDQ2LCBGRH0sCisJeyJGVVRVUkUgRE9NQUlOIENPUlAuIChDKSAxOTg2LTE5ODkgVjYuMEE3LzI4Lzg5IiwgNSwgNDYsIEZEfSwKKwl7IkZVVFVSRSBET01BSU4gQ09SUC4gKEMpIDE5ODYtMTk5MCBWNi4wMTA1LzMxLzkwIiwgNSwgNDcsIEZEfSwKKwl7IkZVVFVSRSBET01BSU4gQ09SUC4gKEMpIDE5ODYtMTk5MCBWNi4wMjA5LzE4LzkwIiwgNSwgNDcsIEZEfSwKKwl7IkZVVFVSRSBET01BSU4gQ09SUC4gKEMpIDE5ODYtMTk5MCBWNy4wMDkvMTgvOTAiLCA1LCA0NiwgRkR9LAorCXsiRlVUVVJFIERPTUFJTiBDT1JQLiAoQykgMTk5MiBWOC4wMC4wMDQvMDIvOTIiLCA1LCA0NCwgRkR9LAorCXsiSUJNIEYxIEJJT1MgVjEuMTAwNC8zMC85MiIsIDUsIDI1LCBGRH0sCisJeyJGVVRVUkUgRE9NQUlOIFRNQy05NTAiLCA1LCAyMSwgRkR9LAorCS8qIEFkZGVkIGZvciAyLjIuMTYgYnkgTWF0dGhpYXNfSGVpZGJyaW5rQGIubWF1cy5kZSAqLworCXsiSUJNIEYxIFYxLjIwMDkvMjIvOTMiLCA1LCAyNSwgRkR9LAorfTsKKworI2RlZmluZSBOVU1fU0lHTkFUVVJFUyAoc2l6ZW9mKHNpZ25hdHVyZXMpIC8gc2l6ZW9mKFNpZ25hdHVyZSkpCisjZW5kaWYJCQkJLyogbiBPVkVSUklERSAqLworCisvKgorICogaG9zdG5vIHN0b3JlcyB0aGUgaG9zdG51bWJlciwgYXMgdG9sZCB0byB1cyBieSB0aGUgaW5pdCByb3V0aW5lLgorICovCisKK3N0YXRpYyBpbnQgaG9zdG5vID0gLTE7CitzdGF0aWMgdm9pZCBzZWFnYXRlX3JlY29ubmVjdF9pbnRyIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgaXJxcmV0dXJuX3QgZG9fc2VhZ2F0ZV9yZWNvbm5lY3RfaW50ciAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworCisjaWZkZWYgRkFTVAorc3RhdGljIGludCBmYXN0ID0gMTsKKyNlbHNlCisjZGVmaW5lIGZhc3QgMAorI2VuZGlmCisKKyNpZmRlZiBTTE9XX1JBVEUKKy8qCisgKiBTdXBwb3J0IGZvciBicm9rZW4gZGV2aWNlcyA6CisgKiBUaGUgU2VhZ2F0ZSBib2FyZCBoYXMgYSBoYW5kc2hha2luZyBwcm9ibGVtLiAgTmFtZWx5LCBhIGxhY2sKKyAqIHRoZXJlb2YgZm9yIHNsb3cgZGV2aWNlcy4gIFlvdSBjYW4gYmxhc3QgNjAwSy9zZWNvbmQgdGhyb3VnaAorICogaXQgaWYgeW91IGFyZSBwb2xsaW5nIGZvciBlYWNoIGJ5dGUsIG1vcmUgaWYgeW91IGRvIGEgYmxpbmQKKyAqIHRyYW5zZmVyLiAgSW4gdGhlIGZpcnN0IGNhc2UsIHdpdGggYSBmYXN0IGRldmljZSwgUkVRIHdpbGwKKyAqIHRyYW5zaXRpb24gaGlnaC1sb3cgb3IgaGlnaC1sb3ctaGlnaCBiZWZvcmUgeW91ciBsb29wIHJlc3RhcnRzCisgKiBhbmQgeW91J2xsIGhhdmUgbm8gcHJvYmxlbXMuICBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSBib2FyZAorICogd2lsbCBpbnNlcnQgd2FpdCBzdGF0ZXMgZm9yIHVwIHRvIDEzLjIgdXNlY3MgZm9yIFJFUSB0bworICogdHJhbnNpdGlvbiBsb3ctPmhpZ2gsIGFuZCBldmVyeXRoaW5nIHdpbGwgd29yay4KKyAqCisgKiBIb3dldmVyLCB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIHN0YXRlIG1hY2hpbmUgdGhhdCBzYXlzCisgKiB5b3UgKkhBVkUqIHRvIHNlZSBhIGhpZ2gtbG93LWhpZ2ggc2V0IG9mIHRyYW5zaXRpb25zIGJlZm9yZQorICogc2VuZGluZyB0aGUgbmV4dCBieXRlLCBhbmQgc2xvdyB0aGluZ3MgbGlrZSB0aGUgVHJhbnRvciBDRCBST01TCisgKiB3aWxsIGJyZWFrIGJlY2F1c2Ugb2YgdGhpcy4KKyAqCisgKiBTbywgd2UgbmVlZCB0byBzbG93IHRoaW5ncyBkb3duLCB3aGljaCBpc24ndCBhcyBzaW1wbGUgYXMgaXQKKyAqIHNlZW1zLiAgV2UgY2FuJ3Qgc2xvdyB0aGluZ3MgZG93biBwZXJpb2QsIGJlY2F1c2UgdGhlbiBwZW9wbGUKKyAqIHdobyBkb24ndCByZWNvbXBpbGUgdGhlaXIga2VybmVscyB3aWxsIHNob290IG1lIGZvciBydWluaW5nCisgKiB0aGVpciBwZXJmb3JtYW5jZS4gIFdlIG5lZWQgdG8gZG8gaXQgb24gYSBjYXNlIHBlciBjYXNlIGJhc2lzLgorICoKKyAqIFRoZSBiZXN0IGZvciBwZXJmb3JtYW5jZSB3aWxsIGJlIHRvLCBvbmx5IGZvciBib3JrZW4gZGV2aWNlcworICogKHRoaXMgaXMgc3RvcmVkIG9uIGEgcGVyLXRhcmdldCBiYXNpcyBpbiB0aGUgc2NzaV9kZXZpY2VzIGFycmF5KQorICoKKyAqIFdhaXQgZm9yIGEgbG93LT5oaWdoIHRyYW5zaXRpb24gYmVmb3JlIGNvbnRpbnVpbmcgd2l0aCB0aGF0CisgKiB0cmFuc2Zlci4gIElmIHdlIHRpbWVvdXQsIGNvbnRpbnVlIGFueXdheXMuICBXZSBkb24ndCBuZWVkCisgKiBhIGxvbmcgdGltZW91dCwgYmVjYXVzZSBSRVEgc2hvdWxkIG9ubHkgYmUgYXNzZXJ0ZWQgdW50aWwgdGhlCisgKiBjb3JyZXNwb25kaW5nIEFDSyBpcyByZWNlaXZlZCBhbmQgcHJvY2Vzc2VkLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgdGhlIHN5c3RlbSB0aW1lciBmb3IgdGhpcywgYmVjYXVzZSBvZgorICogcmVzb2x1dGlvbiwgYW5kIHdlICpyZWFsbHkqIGNhbid0IHVzZSB0aGUgdGltZXIgY2hpcCBzaW5jZQorICogZ2V0dGltZW9mZGF5KCkgYW5kIHRoZSBiZWVwZXIgcm91dGluZXMgdXNlIHRoYXQuICBTbywKKyAqIHRoZSBiZXN0IHRoaW5nIGZvciB1cyB0byBkbyB3aWxsIGJlIHRvIGNhbGlicmF0ZSBhIHRpbWluZworICogbG9vcCBpbiB0aGUgaW5pdGlhbGl6YXRpb24gY29kZSB1c2luZyB0aGUgdGltZXIgY2hpcCBiZWZvcmUKKyAqIGdldHRpbWVvZmRheSgpIGNhbiBzY3JldyB3aXRoIGl0LgorICoKKyAqIEZJWE1FOiB0aGlzIGlzIGJyb2tlbiAobm90IGJvcmtlbiA6LSkuIEVtcHR5IGxvb3AgY29zdHMgbGVzcyB0aGFuCisgKiBsb29wIHdpdGggSVNBIGFjY2VzcyBpbiBpdCEgLS0gcGF2ZWxAdWN3LmN6CisgKi8KKworc3RhdGljIGludCBib3JrZW5fY2FsaWJyYXRpb24gPSAwOworCitzdGF0aWMgdm9pZCBfX2luaXQgYm9ya2VuX2luaXQgKHZvaWQpCit7CisJcmVnaXN0ZXIgaW50IGNvdW50ID0gMCwgc3RhcnQgPSBqaWZmaWVzICsgMSwgc3RvcCA9IHN0YXJ0ICsgMjU7CisKKwkvKiBGSVhNRTogVGhlcmUgbWF5IGJlIGEgYmV0dGVyIGFwcHJvYWNoLCB0aGlzIGlzIGEgc3RyYWlnaHQgcG9ydCBmb3IKKwkgICBub3cgKi8KKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwl3aGlsZSAodGltZV9iZWZvcmUgKGppZmZpZXMsIHN0YXJ0KSkKKwkJY3B1X3JlbGF4KCk7CisJZm9yICg7IHRpbWVfYmVmb3JlIChqaWZmaWVzLCBzdG9wKTsgKytjb3VudCkKKwkJY3B1X3JlbGF4KCk7CisJcHJlZW1wdF9lbmFibGUoKTsKKworLyoKKyAqIE9rLCB3ZSBub3cgaGF2ZSBhIGNvdW50IGZvciAuMjUgc2Vjb25kcy4gIENvbnZlcnQgdG8gYQorICogY291bnQgcGVyIHNlY29uZCBhbmQgZGl2aWRlIGJ5IHRyYW5zZmVyIHJhdGUgaW4gSy4gICovCisKKwlib3JrZW5fY2FsaWJyYXRpb24gPSAoY291bnQgKiA0KSAvIChTTE9XX1JBVEUgKiAxMDI0KTsKKworCWlmIChib3JrZW5fY2FsaWJyYXRpb24gPCAxKQorCQlib3JrZW5fY2FsaWJyYXRpb24gPSAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYm9ya2VuX3dhaXQgKHZvaWQpCit7CisJcmVnaXN0ZXIgaW50IGNvdW50OworCisJZm9yIChjb3VudCA9IGJvcmtlbl9jYWxpYnJhdGlvbjsgY291bnQgJiYgKFNUQVRVUyAmIFNUQVRfUkVRKTsgLS1jb3VudCkKKwkJY3B1X3JlbGF4KCk7CisJICAgICAJCisjaWYgKERFQlVHICYgREVCVUdfQk9SS0VOKQorCWlmIChjb3VudCkKKwkJcHJpbnRrICgic2NzaSVkIDogYm9ya2VuIHRpbWVvdXRcbiIsIGhvc3Rubyk7CisjZW5kaWYKK30KKworI2VuZGlmCQkJCS8qIGRlZiBTTE9XX1JBVEUgKi8KKworLyogVGhlc2UgYmVhc3RzIG9ubHkgbGl2ZSBvbiBJU0EsIGFuZCBJU0EgbWVhbnMgOE1Iei4gRWFjaCBVTE9PUCgpCisgKiBjb250YWlucyBhdCBsZWFzdCBvbmUgSVNBIGFjY2Vzcywgd2hpY2ggdGFrZXMgbW9yZSB0aGFuIDAuMTI1CisgKiB1c2VjLiBTbyBpZiB3ZSBsb29wIDggdGltZXMgdGltZSBpbiB1c2VjLCB3ZSBhcmUgc2FmZS4KKyAqLworCisjZGVmaW5lIFVMT09QKCBpICkgZm9yIChjbG9jayA9IGkqODs7KQorI2RlZmluZSBUSU1FT1VUICghKGNsb2NrLS0pKQorCitpbnQgX19pbml0IHNlYWdhdGVfc3QweF9kZXRlY3QgKFNjc2lfSG9zdF9UZW1wbGF0ZSAqIHRwbnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7CisJaW50IGksIGo7CisJdW5zaWduZWQgbG9uZyBjciwgZHI7CisKKwl0cG50LT5wcm9jX25hbWUgPSAic2VhZ2F0ZSI7CisvKgorICoJRmlyc3QsIHdlIHRyeSBmb3IgdGhlIG1hbnVhbCBvdmVycmlkZS4KKyAqLworCURBTlkgKCJBdXRvZGV0ZWN0aW5nIFNUMHggLyBUTUMtOHh4XG4iKTsKKworCWlmIChob3N0bm8gIT0gLTEpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAic2VhZ2F0ZV9zdDB4X2RldGVjdCgpIGNhbGxlZCB0d2ljZT8hXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisvKiBJZiB0aGUgdXNlciBzcGVjaWZpZWQgdGhlIGNvbnRyb2xsZXIgdHlwZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUsCisgICBjb250cm9sbGVyX3R5cGUgd2lsbCBiZSBub24temVybywgc28gZG9uJ3QgdHJ5IHRvIGRldGVjdCBvbmUgKi8KKworCWlmICghY29udHJvbGxlcl90eXBlKSB7CisjaWZkZWYgT1ZFUlJJREUKKwkJYmFzZV9hZGRyZXNzID0gT1ZFUlJJREU7CisJCWNvbnRyb2xsZXJfdHlwZSA9IENPTlRST0xMRVI7CisKKwkJREFOWSAoIkJhc2UgYWRkcmVzcyBvdmVycmlkZGVuIHRvICV4LCBjb250cm9sbGVyIHR5cGUgaXMgJXNcbiIsCisJCSAgICAgIGJhc2VfYWRkcmVzcywKKwkJICAgICAgY29udHJvbGxlcl90eXBlID09IFNFQUdBVEUgPyAiU0VBR0FURSIgOiAiRkQiKTsKKyNlbHNlCQkJCS8qIE9WRVJSSURFICovCisvKgorICogCVRvIGRldGVjdCB0aGlzIGNhcmQsIHdlIHNpbXBseSBsb29rIGZvciB0aGUgc2lnbmF0dXJlCisgKiAgICAgIGZyb20gdGhlIEJJT1MgdmVyc2lvbiBub3RpY2UgaW4gYWxsIHRoZSBwb3NzaWJsZSBsb2NhdGlvbnMKKyAqICAgICAgb2YgdGhlIFJPTSdzLiAgVGhpcyBoYXMgYSBuaWNlIHNpZGUgZWZmZWN0IG9mIG5vdCB0cmFzaGluZworICogICAgICBhbnkgcmVnaXN0ZXIgbG9jYXRpb25zIHRoYXQgbWlnaHQgYmUgdXNlZCBieSBzb21ldGhpbmcgZWxzZS4KKyAqCisgKiBYWFggLSBub3RlIHRoYXQgd2UgcHJvYmFibHkgc2hvdWxkIGJlIHByb2JpbmcgdGhlIGFkZHJlc3MKKyAqIHNwYWNlIGZvciB0aGUgb24tYm9hcmQgUkFNIGluc3RlYWQuCisgKi8KKworCQlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZiAoc2VhZ2F0ZV9iYXNlcykgLyBzaXplb2YgKHVuc2lnbmVkIGludCkpOyArK2kpIHsKKwkJCXZvaWQgX19pb21lbSAqcCA9IGlvcmVtYXAoc2VhZ2F0ZV9iYXNlc1tpXSwgMHgyMDAwKTsKKwkJCWlmICghcCkKKwkJCQljb250aW51ZTsKKwkJCWZvciAoaiA9IDA7IGogPCBOVU1fU0lHTkFUVVJFUzsgKytqKQorCQkJCWlmIChjaGVja19zaWduYXR1cmUocCArIHNpZ25hdHVyZXNbal0ub2Zmc2V0LCBzaWduYXR1cmVzW2pdLnNpZ25hdHVyZSwgc2lnbmF0dXJlc1tqXS5sZW5ndGgpKSB7CisJCQkJCWJhc2VfYWRkcmVzcyA9IHNlYWdhdGVfYmFzZXNbaV07CisJCQkJCWNvbnRyb2xsZXJfdHlwZSA9IHNpZ25hdHVyZXNbal0udHlwZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJaW91bm1hcChwKTsKKwkJfQorI2VuZGlmCQkJCS8qIE9WRVJSSURFICovCisJfQorCS8qICghIGNvbnRyb2xsZXJfdHlwZSkgKi8KKwl0cG50LT50aGlzX2lkID0gKGNvbnRyb2xsZXJfdHlwZSA9PSBTRUFHQVRFKSA/IDcgOiA2OworCXRwbnQtPm5hbWUgPSAoY29udHJvbGxlcl90eXBlID09IFNFQUdBVEUpID8gU1QwWF9JRF9TVFIgOiBGRF9JRF9TVFI7CisKKwlpZiAoIWJhc2VfYWRkcmVzcykgeworCQlwcmludGsoS0VSTl9JTkZPICJzZWFnYXRlOiBTVDB4L1RNQy04eHggbm90IGRldGVjdGVkLlxuIik7CisJCXJldHVybiAwOworCX0KKworCWNyID0gYmFzZV9hZGRyZXNzICsgKGNvbnRyb2xsZXJfdHlwZSA9PSBTRUFHQVRFID8gMHgxYTAwIDogMHgxYzAwKTsKKwlkciA9IGNyICsgMHgyMDA7CisJc3QweF9jcl9zciA9IGlvcmVtYXAoY3IsIDB4MTAwKTsKKwlzdDB4X2RyID0gaW9yZW1hcChkciwgMHgxMDApOworCisJREFOWSgiJXMgZGV0ZWN0ZWQuIEJhc2UgYWRkcmVzcyA9ICV4LCBjciA9ICV4LCBkciA9ICV4XG4iLAorCSAgICAgIHRwbnQtPm5hbWUsIGJhc2VfYWRkcmVzcywgY3IsIGRyKTsKKworCS8qCisJICoJQXQgYWxsIHRpbWVzLCB3ZSB3aWxsIHVzZSBJUlEgNS4gIFNob3VsZCBhbHNvIGNoZWNrIGZvciBJUlEzCisJICoJaWYgd2UgbG9zZSBvdXIgZmlyc3QgaW50ZXJydXB0LgorCSAqLworCWluc3RhbmNlID0gc2NzaV9yZWdpc3RlciAodHBudCwgMCk7CisJaWYgKGluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAwOworCisJaG9zdG5vID0gaW5zdGFuY2UtPmhvc3Rfbm87CisJaWYgKHJlcXVlc3RfaXJxIChpcnEsIGRvX3NlYWdhdGVfcmVjb25uZWN0X2ludHIsIFNBX0lOVEVSUlVQVCwgKGNvbnRyb2xsZXJfdHlwZSA9PSBTRUFHQVRFKSA/ICJzZWFnYXRlIiA6ICJ0bWMtOHh4IiwgaW5zdGFuY2UpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkIDogdW5hYmxlIHRvIGFsbG9jYXRlIElSUSVkXG4iLCBob3N0bm8sIGlycSk7CisJCXJldHVybiAwOworCX0KKwlpbnN0YW5jZS0+aXJxID0gaXJxOworCWluc3RhbmNlLT5pb19wb3J0ID0gYmFzZV9hZGRyZXNzOworI2lmZGVmIFNMT1dfUkFURQorCXByaW50ayhLRVJOX0lORk8gIkNhbGlicmF0aW5nIGJvcmtlbiB0aW1lci4uLiAiKTsKKwlib3JrZW5faW5pdCgpOworCXByaW50aygiICVkIGN5Y2xlcyBwZXIgdHJhbnNmZXJcbiIsIGJvcmtlbl9jYWxpYnJhdGlvbik7CisjZW5kaWYKKwlwcmludGsgKEtFUk5fSU5GTyAiVGhpcyBpcyBvbmUgc2Vjb25kLi4uICIpOworCXsKKwkJaW50IGNsb2NrOworCQlVTE9PUCAoMSAqIDEwMDAgKiAxMDAwKSB7CisJCQlTVEFUVVM7CisJCQlpZiAoVElNRU9VVCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCXByaW50ayAoImRvbmUsICVzIG9wdGlvbnM6IgorI2lmZGVmIEFSQklUUkFURQorCQkiIEFSQklUUkFURSIKKyNlbmRpZgorI2lmZGVmIERFQlVHCisJCSIgREVCVUciCisjZW5kaWYKKyNpZmRlZiBGQVNUCisJCSIgRkFTVCIKKyNpZmRlZiBGQVNUMzIKKwkJIjMyIgorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBMSU5LRUQKKwkJIiBMSU5LRUQiCisjZW5kaWYKKyNpZmRlZiBQQVJJVFkKKwkJIiBQQVJJVFkiCisjZW5kaWYKKyNpZmRlZiBTRUFHQVRFX1VTRV9BU00KKwkJIiBTRUFHQVRFX1VTRV9BU00iCisjZW5kaWYKKyNpZmRlZiBTTE9XX1JBVEUKKwkJIiBTTE9XX1JBVEUiCisjZW5kaWYKKyNpZmRlZiBTV0FQU1RBVAorCQkiIFNXQVBTVEFUIgorI2VuZGlmCisjaWZkZWYgU1dBUENOVERBVEEKKwkJIiBTV0FQQ05UREFUQSIKKyNlbmRpZgorCQkiXG4iLCB0cG50LT5uYW1lKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnNlYWdhdGVfc3QweF9pbmZvIChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlzdGF0aWMgY2hhciBidWZmZXJbNjRdOworCisJc25wcmludGYoYnVmZmVyLCA2NCwgIiVzIGF0IGlycSAlZCwgYWRkcmVzcyAweCUwNVgiLAorCQkgKGNvbnRyb2xsZXJfdHlwZSA9PSBTRUFHQVRFKSA/IFNUMFhfSURfU1RSIDogRkRfSURfU1RSLAorCQkgaXJxLCBiYXNlX2FkZHJlc3MpOworCXJldHVybiBidWZmZXI7Cit9CisKKy8qCisgKiBUaGVzZSBhcmUgb3VyIHNhdmVkIHBvaW50ZXJzIGZvciB0aGUgb3V0c3RhbmRpbmcgY29tbWFuZCB0aGF0IGlzCisgKiB3YWl0aW5nIGZvciBhIHJlY29ubmVjdAorICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGN1cnJlbnRfdGFyZ2V0LCBjdXJyZW50X2x1bjsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpjdXJyZW50X2NtbmQsICpjdXJyZW50X2RhdGE7CitzdGF0aWMgaW50IGN1cnJlbnRfbm9idWZmczsKK3N0YXRpYyBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmN1cnJlbnRfYnVmZmVyOworc3RhdGljIGludCBjdXJyZW50X2J1ZmZsZW47CisKKyNpZmRlZiBMSU5LRUQKKy8qCisgKiBsaW5rZWRfY29ubmVjdGVkIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgY3VycmVudGx5IGNvbm5lY3RlZCB0bworICogbGlua2VkX3RhcmdldCwgbGlua2VkX2x1biBhbmQgaW4gYW4gSU5GT1JNQVRJT04gVFJBTlNGRVIgcGhhc2UsCisgKiB1c2luZyBsaW5rZWQgY29tbWFuZHMuCisgKi8KKworc3RhdGljIGludCBsaW5rZWRfY29ubmVjdGVkID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxpbmtlZF90YXJnZXQsIGxpbmtlZF9sdW47CisjZW5kaWYKKworc3RhdGljIHZvaWQgKCpkb25lX2ZuKSAoU2NzaV9DbW5kICopID0gTlVMTDsKK3N0YXRpYyBTY3NpX0NtbmQgKlNDaW50ID0gTlVMTDsKKworLyoKKyAqIFRoZXNlIGNvbnRyb2wgd2hldGhlciBvciBub3QgZGlzY29ubmVjdCAvIHJlY29ubmVjdCB3aWxsIGJlIGF0dGVtcHRlZCwKKyAqIG9yIGFyZSBiZWluZyBhdHRlbXB0ZWQuCisgKi8KKworI2RlZmluZSBOT19SRUNPTk5FQ1QgICAgMAorI2RlZmluZSBSRUNPTk5FQ1RfTk9XICAgMQorI2RlZmluZSBDQU5fUkVDT05ORUNUICAgMgorCisvKgorICogTElOS0VEX1JJR0hUIGluZGljYXRlcyB0aGF0IHdlIGFyZSBjdXJyZW50bHkgY29ubmVjdGVkIHRvIHRoZSBjb3JyZWN0IHRhcmdldAorICogZm9yIHRoaXMgY29tbWFuZCwgTElOS0VEX1dST05HIGluZGljYXRlcyB0aGF0IHdlIGFyZSBjb25uZWN0ZWQgdG8gdGhlIHdyb25nCisgKiB0YXJnZXQuIE5vdGUgdGhhdCB0aGVzZSBpbXBseSBDQU5fUkVDT05ORUNUIGFuZCByZXF1aXJlIGRlZmluZWQoTElOS0VEKS4KKyAqLworCisjZGVmaW5lIExJTktFRF9SSUdIVCAgICAzCisjZGVmaW5lIExJTktFRF9XUk9ORyAgICA0CisKKy8qCisgKiBUaGlzIGRldGVybWluZXMgaWYgd2UgYXJlIGV4cGVjdGluZyB0byByZWNvbm5lY3Qgb3Igbm90LgorICovCisKK3N0YXRpYyBpbnQgc2hvdWxkX3JlY29ubmVjdCA9IDA7CisKKy8qCisgKiBUaGUgc2VhZ2F0ZV9yZWNvbm5lY3RfaW50ciByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIGEgdGFyZ2V0IHJlc2VsZWN0cyB0aGUKKyAqIGhvc3QgYWRhcHRlci4gIFRoaXMgb2NjdXJzIG9uIHRoZSBpbnRlcnJ1cHQgdHJpZ2dlcmVkIGJ5IHRoZSB0YXJnZXQKKyAqIGFzc2VydGluZyBTRUwuCisgKi8KKworc3RhdGljIGlycXJldHVybl90IGRvX3NlYWdhdGVfcmVjb25uZWN0X2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpkZXYgPSBkZXZfaWQ7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUgKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJc2VhZ2F0ZV9yZWNvbm5lY3RfaW50ciAoaXJxLCBkZXZfaWQsIHJlZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBzZWFnYXRlX3JlY29ubmVjdF9pbnRyIChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCB0ZW1wOworCVNjc2lfQ21uZCAqU0N0bXA7CisKKwlEUFJJTlRLIChQSEFTRV9SRVNFTEVDVCwgInNjc2klZCA6IHNlYWdhdGVfcmVjb25uZWN0X2ludHIoKSBjYWxsZWRcbiIsIGhvc3Rubyk7CisKKwlpZiAoIXNob3VsZF9yZWNvbm5lY3QpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZDogdW5leHBlY3RlZCBpbnRlcnJ1cHQuXG4iLCBob3N0bm8pOworCWVsc2UgeworCQlzaG91bGRfcmVjb25uZWN0ID0gMDsKKworCQlEUFJJTlRLIChQSEFTRV9SRVNFTEVDVCwgInNjc2klZCA6IGludGVybmFsX2NvbW1hbmQoJWQsICUwOHgsICUwOHgsIFJFQ09OTkVDVF9OT1dcbiIsIAorCQkJaG9zdG5vLCBjdXJyZW50X3RhcmdldCwgY3VycmVudF9kYXRhLCBjdXJyZW50X2J1ZmZsZW4pOworCisJCXRlbXAgPSBpbnRlcm5hbF9jb21tYW5kIChjdXJyZW50X3RhcmdldCwgY3VycmVudF9sdW4sIGN1cnJlbnRfY21uZCwgY3VycmVudF9kYXRhLCBjdXJyZW50X2J1ZmZsZW4sIFJFQ09OTkVDVF9OT1cpOworCisJCWlmIChtc2dfYnl0ZSh0ZW1wKSAhPSBESVNDT05ORUNUKSB7CisJCQlpZiAoZG9uZV9mbikgeworCQkJCURQUklOVEsoUEhBU0VfUkVTRUxFQ1QsICJzY3NpJWQgOiBkb25lX2ZuKCVkLCUwOHgpIiwgaG9zdG5vLCBob3N0bm8sIHRlbXApOworCQkJCWlmICghU0NpbnQpCisJCQkJCXBhbmljICgiU0NpbnQgPT0gTlVMTCBpbiBzZWFnYXRlIik7CisJCQkJU0N0bXAgPSBTQ2ludDsKKwkJCQlTQ2ludCA9IE5VTEw7CisJCQkJU0N0bXAtPnJlc3VsdCA9IHRlbXA7CisJCQkJZG9uZV9mbihTQ3RtcCk7CisJCQl9IGVsc2UKKwkJCQlwcmludGsoS0VSTl9FUlIgImRvbmVfZm4oKSBub3QgZGVmaW5lZC5cbiIpOworCQl9CisJfQorfQorCisvKgorICogVGhlIHNlYWdhdGVfc3QweF9xdWV1ZV9jb21tYW5kKCkgZnVuY3Rpb24gcHJvdmlkZXMgYSBxdWV1ZWQgaW50ZXJmYWNlCisgKiB0byB0aGUgc2VhZ2F0ZSBTQ1NJIGRyaXZlci4gIEJhc2ljYWxseSwgaXQganVzdCBwYXNzZXMgY29udHJvbCBvbnRvIHRoZQorICogc2VhZ2F0ZV9jb21tYW5kKCkgZnVuY3Rpb24sIGFmdGVyIGZpeGluZyBpdCBzbyB0aGF0IHRoZSBkb25lX2ZuKCkKKyAqIGlzIHNldCB0byB0aGUgb25lIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uICBXZSBoYXZlIHRvIGJlIHZlcnkgY2FyZWZ1bCwKKyAqIGJlY2F1c2UgdGhlcmUgYXJlIHNvbWUgY29tbWFuZHMgb24gc29tZSBkZXZpY2VzIHRoYXQgZG8gbm90IGRpc2Nvbm5lY3QsCisgKiBhbmQgaWYgd2Ugc2ltcGx5IGNhbGwgdGhlIGRvbmVfZm4gd2hlbiB0aGUgY29tbWFuZCBpcyBkb25lIHRoZW4gYW5vdGhlcgorICogY29tbWFuZCBpcyBzdGFydGVkIGFuZCBxdWV1ZV9jb21tYW5kIGlzIGNhbGxlZCBhZ2Fpbi4uLiAgV2UgZW5kIHVwCisgKiBvdmVyZmxvd2luZyB0aGUga2VybmVsIHN0YWNrLCBhbmQgdGhpcyB0ZW5kcyBub3QgdG8gYmUgc3VjaCBhIGdvb2QgaWRlYS4KKyAqLworCitzdGF0aWMgaW50IHJlY3Vyc2lvbl9kZXB0aCA9IDA7CisKK3N0YXRpYyBpbnQgc2VhZ2F0ZV9zdDB4X3F1ZXVlX2NvbW1hbmQgKFNjc2lfQ21uZCAqIFNDcG50LCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSkKK3sKKwlpbnQgcmVzdWx0LCByZWNvbm5lY3Q7CisJU2NzaV9DbW5kICpTQ3RtcDsKKworCURBTlkgKCJzZWFnYXRlOiBxdWVfY29tbWFuZCIpOworCWRvbmVfZm4gPSBkb25lOworCWN1cnJlbnRfdGFyZ2V0ID0gU0NwbnQtPmRldmljZS0+aWQ7CisJY3VycmVudF9sdW4gPSBTQ3BudC0+ZGV2aWNlLT5sdW47CisJY3VycmVudF9jbW5kID0gU0NwbnQtPmNtbmQ7CisJY3VycmVudF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCWN1cnJlbnRfYnVmZmxlbiA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW47CisJU0NpbnQgPSBTQ3BudDsKKwlpZiAocmVjdXJzaW9uX2RlcHRoKQorCQlyZXR1cm4gMTsKKwlyZWN1cnNpb25fZGVwdGgrKzsKKwlkbyB7CisjaWZkZWYgTElOS0VECisJCS8qCisJCSAqIFNldCBsaW5rZWQgY29tbWFuZCBiaXQgaW4gY29udHJvbCBmaWVsZCBvZiBTQ1NJIGNvbW1hbmQuCisJCSAqLworCisJCWN1cnJlbnRfY21uZFtTQ3BudC0+Y21kX2xlbl0gfD0gMHgwMTsKKwkJaWYgKGxpbmtlZF9jb25uZWN0ZWQpIHsKKwkJCURQUklOVEsgKERFQlVHX0xJTktFRCwgInNjc2klZCA6IHVzaW5nIGxpbmtlZCBjb21tYW5kcywgY3VycmVudCBJX1RfTCBuZXh1cyBpcyAiLCBob3N0bm8pOworCQkJaWYgKGxpbmtlZF90YXJnZXQgPT0gY3VycmVudF90YXJnZXQgJiYgbGlua2VkX2x1biA9PSBjdXJyZW50X2x1bikgCisJCQl7CisJCQkJRFBSSU5USyhERUJVR19MSU5LRUQsICJjb3JyZWN0XG4iKTsKKwkJCQlyZWNvbm5lY3QgPSBMSU5LRURfUklHSFQ7CisJCQl9IGVsc2UgeworCQkJCURQUklOVEsoREVCVUdfTElOS0VELCAiaW5jb3JyZWN0XG4iKTsKKwkJCQlyZWNvbm5lY3QgPSBMSU5LRURfV1JPTkc7CisJCQl9CisJCX0gZWxzZQorI2VuZGlmCQkJCS8qIExJTktFRCAqLworCQkJcmVjb25uZWN0ID0gQ0FOX1JFQ09OTkVDVDsKKworCQlyZXN1bHQgPSBpbnRlcm5hbF9jb21tYW5kKFNDaW50LT5kZXZpY2UtPmlkLCBTQ2ludC0+ZGV2aWNlLT5sdW4sIFNDaW50LT5jbW5kLAorCQkJCSAgICAgIFNDaW50LT5yZXF1ZXN0X2J1ZmZlciwgU0NpbnQtPnJlcXVlc3RfYnVmZmxlbiwgcmVjb25uZWN0KTsKKwkJaWYgKG1zZ19ieXRlKHJlc3VsdCkgPT0gRElTQ09OTkVDVCkKKwkJCWJyZWFrOworCQlTQ3RtcCA9IFNDaW50OworCQlTQ2ludCA9IE5VTEw7CisJCVNDdG1wLT5yZXN1bHQgPSByZXN1bHQ7CisJCWRvbmVfZm4oU0N0bXApOworCX0KKwl3aGlsZSAoU0NpbnQpOworCXJlY3Vyc2lvbl9kZXB0aC0tOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVybmFsX2NvbW1hbmQgKHVuc2lnbmVkIGNoYXIgdGFyZ2V0LCB1bnNpZ25lZCBjaGFyIGx1biwKKwkJICBjb25zdCB2b2lkICpjbW5kLCB2b2lkICpidWZmLCBpbnQgYnVmZmxlbiwgaW50IHJlc2VsZWN0KQoreworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSBOVUxMOworCXN0cnVjdCBzY2F0dGVybGlzdCAqYnVmZmVyID0gTlVMTDsKKwlpbnQgY2xvY2ssIHRlbXAsIG5vYnVmZnMgPSAwLCBkb25lID0gMCwgbGVuID0gMDsKKyNpZmRlZiBERUJVRworCWludCB0cmFuc2ZlcmVkID0gMCwgcGhhc2UgPSAwLCBuZXdwaGFzZTsKKyNlbmRpZgorCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgc3RhdHVzX3JlYWQ7CisJdW5zaWduZWQgY2hhciB0bXBfZGF0YSwgdG1wX2NvbnRyb2wsIHN0YXR1cyA9IDAsIG1lc3NhZ2UgPSAwOworCXVuc2lnbmVkIHRyYW5zZmVyc2l6ZSA9IDAsIHVuZGVyZmxvdyA9IDA7CisjaWZkZWYgU0xPV19SQVRFCisJaW50IGJvcmtlbiA9IChpbnQpIFNDaW50LT5kZXZpY2UtPmJvcmtlbjsJLyogRG9lcyB0aGUgY3VycmVudCB0YXJnZXQgcmVxdWlyZQorCQkJCQkJCSAgIFZlcnkgU2xvdyBJL08gPyAgKi8KKyNlbmRpZgorCisJaW5jb21tYW5kID0gMDsKKwlzdDB4X2Fib3J0ZWQgPSAwOworCisjaWYgKERFQlVHICYgUFJJTlRfQ09NTUFORCkKKwlwcmludGsoInNjc2klZCA6IHRhcmdldCA9ICVkLCBjb21tYW5kID0gIiwgaG9zdG5vLCB0YXJnZXQpOworCXByaW50X2NvbW1hbmQoKHVuc2lnbmVkIGNoYXIgKikgY21uZCk7CisjZW5kaWYKKworI2lmIChERUJVRyAmIFBIQVNFX1JFU0VMRUNUKQorCXN3aXRjaCAocmVzZWxlY3QpIHsKKwljYXNlIFJFQ09OTkVDVF9OT1c6CisJCXByaW50aygic2NzaSVkIDogcmVjb25uZWN0aW5nXG4iLCBob3N0bm8pOworCQlicmVhazsKKyNpZmRlZiBMSU5LRUQKKwljYXNlIExJTktFRF9SSUdIVDoKKwkJcHJpbnRrKCJzY3NpJWQgOiBjb25uZWN0ZWQsIGNhbiByZWNvbm5lY3RcbiIsIGhvc3Rubyk7CisJCWJyZWFrOworCWNhc2UgTElOS0VEX1dST05HOgorCQlwcmludGsoInNjc2klZCA6IGNvbm5lY3RlZCB0byB3cm9uZyB0YXJnZXQsIGNhbiByZWNvbm5lY3RcbiIsCisJCQlob3N0bm8pOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgQ0FOX1JFQ09OTkVDVDoKKwkJcHJpbnRrKCJzY3NpJWQgOiBhbGxvd2VkIHRvIHJlY29ubmVjdFxuIiwgaG9zdG5vKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCJzY3NpJWQgOiBub3QgYWxsb3dlZCB0byByZWNvbm5lY3RcbiIsIGhvc3Rubyk7CisJfQorI2VuZGlmCisKKwlpZiAodGFyZ2V0ID09IChjb250cm9sbGVyX3R5cGUgPT0gU0VBR0FURSA/IDcgOiA2KSkKKwkJcmV0dXJuIERJRF9CQURfVEFSR0VUOworCisJLyoKKwkgKglXZSB3b3JrIGl0IGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiBpZiB0aGlzIGlzIGlzICJ0aGUgZmlyc3QgdGltZSwiCisJICogICAgICBvciBhIHJlY29ubmVjdC4gIElmIHRoaXMgaXMgYSByZXNlbGVjdCBwaGFzZSwgdGhlbiBTRUwgd2lsbAorCSAqICAgICAgYmUgYXNzZXJ0ZWQsIGFuZCB3ZSBtdXN0IHNraXAgc2VsZWN0aW9uIC8gYXJiaXRyYXRpb24gcGhhc2VzLgorCSAqLworCisJc3dpdGNoIChyZXNlbGVjdCkgeworCWNhc2UgUkVDT05ORUNUX05PVzoKKwkJRFBSSU5USyAoUEhBU0VfUkVTRUxFQ1QsICJzY3NpJWQgOiBwaGFzZSBSRVNFTEVDVCBcbiIsIGhvc3Rubyk7CisJCS8qCisJCSAqCUF0IHRoaXMgcG9pbnQsIHdlIHNob3VsZCBmaW5kIHRoZSBsb2dpY2FsIG9yIG9mIG91ciBJRAorCQkgKglhbmQgdGhlIG9yaWdpbmFsIHRhcmdldCdzIElEIG9uIHRoZSBCVVMsIHdpdGggQlNZLCBTRUwsCisJCSAqCWFuZCBJL08gc2lnbmFscyBhc3NlcnRlZC4KKwkJICoKKwkJICogICAgICBBZnRlciBBUkJJVFJBVElPTiBwaGFzZSBpcyBjb21wbGV0ZWQsIG9ubHkgU0VMLCBCU1ksCisJCSAqCWFuZCB0aGUgdGFyZ2V0IElEIGFyZSBhc3NlcnRlZC4gIEEgdmFsaWQgaW5pdGlhdG9yIElECisJCSAqCWlzIG5vdCBvbiB0aGUgYnVzIHVudGlsIElPIGlzIGFzc2VydGVkLCBzbyB3ZSBtdXN0IHdhaXQKKwkJICoJZm9yIHRoYXQuCisJCSAqLworCQlVTE9PUCAoMTAwICogMTAwMCkgeworCQkJdGVtcCA9IFNUQVRVUzsKKwkJCWlmICgodGVtcCAmIFNUQVRfSU8pICYmICEodGVtcCAmIFNUQVRfQlNZKSkKKwkJCQlicmVhazsKKwkJCWlmIChUSU1FT1VUKSB7CisJCQkJRFBSSU5USyAoUEhBU0VfUkVTRUxFQ1QsICJzY3NpJWQgOiBSRVNFTEVDVCB0aW1lZCBvdXQgd2hpbGUgd2FpdGluZyBmb3IgSU8gLlxuIiwgaG9zdG5vKTsKKwkJCQlyZXR1cm4gKERJRF9CQURfSU5UUiA8PCAxNik7CisJCQl9CisJCX0KKworCQkvKgorCQkgKglBZnRlciBJL08gaXMgYXNzZXJ0ZWQgYnkgdGhlIHRhcmdldCwgd2UgY2FuIHJlYWQgb3VyIElECisJCSAqCWFuZCBpdHMgSUQgb2ZmIG9mIHRoZSBCVVMuCisJCSAqLworCisJCWlmICghKCh0ZW1wID0gREFUQSkgJiAoY29udHJvbGxlcl90eXBlID09IFNFQUdBVEUgPyAweDgwIDogMHg0MCkpKSB7CisJCQlEUFJJTlRLIChQSEFTRV9SRVNFTEVDVCwgInNjc2klZCA6IGRldGVjdGVkIHJlY29ubmVjdCByZXF1ZXN0IHRvIGRpZmZlcmVudCB0YXJnZXQuXG5cdERhdGEgYnVzID0gJWRcbiIsIGhvc3RubywgdGVtcCk7CisJCQlyZXR1cm4gKERJRF9CQURfSU5UUiA8PCAxNik7CisJCX0KKworCQlpZiAoISh0ZW1wICYgKDEgPDwgY3VycmVudF90YXJnZXQpKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkIDogVW5leHBlY3RlZCByZXNlbGVjdCBpbnRlcnJ1cHQuICBEYXRhIGJ1cyA9ICVkXG4iLCBob3N0bm8sIHRlbXApOworCQkJcmV0dXJuIChESURfQkFEX0lOVFIgPDwgMTYpOworCQl9CisKKwkJYnVmZmVyID0gY3VycmVudF9idWZmZXI7CisJCWNtbmQgPSBjdXJyZW50X2NtbmQ7CS8qIFdERSBhZGQgKi8KKwkJZGF0YSA9IGN1cnJlbnRfZGF0YTsJLyogV0RFIGFkZCAqLworCQlsZW4gPSBjdXJyZW50X2J1ZmZsZW47CS8qIFdERSBhZGQgKi8KKwkJbm9idWZmcyA9IGN1cnJlbnRfbm9idWZmczsKKworCQkvKgorCQkgKglXZSBoYXZlIGRldGVybWluZWQgdGhhdCB3ZSBoYXZlIGJlZW4gc2VsZWN0ZWQuICBBdCB0aGlzCisJCSAqCXBvaW50LCB3ZSBtdXN0IHJlc3BvbmQgdG8gdGhlIHJlc2VsZWN0aW9uIGJ5IGFzc2VydGluZworCQkgKglCU1kgb3Vyc2VsdmVzCisJCSAqLworCisjaWYgMQorCQlXUklURV9DT05UUk9MIChCQVNFX0NNRCB8IENNRF9EUlZSX0VOQUJMRSB8IENNRF9CU1kpOworI2Vsc2UKKwkJV1JJVEVfQ09OVFJPTCAoQkFTRV9DTUQgfCBDTURfQlNZKTsKKyNlbmRpZgorCisJCS8qCisJCSAqCVRoZSB0YXJnZXQgd2lsbCBkcm9wIFNFTCwgYW5kIHJhaXNlIEJTWSwgYXQgd2hpY2ggdGltZQorCQkgKgl3ZSBtdXN0IGRyb3AgQlNZLgorCQkgKi8KKworCQlVTE9PUCAoMTAwICogMTAwMCkgeworCQkJaWYgKCEoU1RBVFVTICYgU1RBVF9TRUwpKQorCQkJCWJyZWFrOworCQkJaWYgKFRJTUVPVVQpIHsKKwkJCQlXUklURV9DT05UUk9MIChCQVNFX0NNRCB8IENNRF9JTlRSKTsKKwkJCQlEUFJJTlRLIChQSEFTRV9SRVNFTEVDVCwgInNjc2klZCA6IFJFU0VMRUNUIHRpbWVkIG91dCB3aGlsZSB3YWl0aW5nIGZvciBTRUwuXG4iLCBob3N0bm8pOworCQkJCXJldHVybiAoRElEX0JBRF9JTlRSIDw8IDE2KTsKKwkJCX0KKwkJfQorCQlXUklURV9DT05UUk9MIChCQVNFX0NNRCk7CisJCS8qCisJCSAqCUF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgY29ubmVjdGVkIHdpdGggdGhlIHRhcmdldAorCQkgKglhbmQgY2FuIGdldCBvbiB3aXRoIG91ciBsaXZlcy4KKwkJICovCisJCWJyZWFrOworCWNhc2UgQ0FOX1JFQ09OTkVDVDoKKyNpZmRlZiBMSU5LRUQKKwkJLyoKKwkJICogVGhpcyBpcyBhIGJsZXRjaGVyb3VzIGhhY2ssIGp1c3QgYXMgYmFkIGFzIHRoZSBVbml4ICMhCisJCSAqIGludGVycHJldGVyIHN0dWZmLiBJZiBpdCB0dXJucyBvdXQgd2UgYXJlIHVzaW5nIHRoZSB3cm9uZworCQkgKiBJX1RfTCBuZXh1cywgdGhlIGVhc2llc3Qgd2F5IHRvIGRlYWwgd2l0aCBpdCBpcyB0byBnbyBpbnRvCisJCSAqICBvdXIgSU5GT1JNQVRJT04gVFJBTlNGRVIgUEhBU0UgY29kZSwgc2VuZCBhIEFCT1JUCisJCSAqIG1lc3NhZ2Ugb24gTUVTU0FHRSBPVVQgcGhhc2UsIGFuZCB0aGVuIGxvb3AgYmFjayB0byBoZXJlLgorCQkgKi8KK2Nvbm5lY3RfbG9vcDoKKyNlbmRpZgorCQlEUFJJTlRLIChQSEFTRV9CVVNfRlJFRSwgInNjc2klZCA6IHBoYXNlID0gQlVTIEZSRUUgXG4iLCBob3N0bm8pOworCisJCS8qCisJCSAqICAgIEJVUyBGUkVFIFBIQVNFCisJCSAqCisJCSAqICAgICAgT24gZW50cnksIHdlIG1ha2Ugc3VyZSB0aGF0IHRoZSBCVVMgaXMgaW4gYSBCVVMgRlJFRQorCQkgKiAgICAgIHBoYXNlLCBieSBpbnN1cmluZyB0aGF0IGJvdGggQlNZIGFuZCBTRUwgYXJlIGxvdyBmb3IKKwkJICogICAgICBhdCBsZWFzdCBvbmUgYnVzIHNldHRsZSBkZWxheS4gIFNldmVyYWwgcmVhZHMgaGVscAorCQkgKiAgICAgIGVsaW1pbmF0ZSB3aXJlIGdsaXRjaC4KKwkJICovCisKKyNpZm5kZWYgQVJCSVRSQVRFCisjZXJyb3IgRklYTUU6IHRoaXMgaXMgYnJva2VuOiB3ZSBtYXkgbm90IHVzZSBqaWZmaWVzIGhlcmUgLSB3ZSBhcmUgdW5kZXIgY2xpKCkuIEl0IHdpbGwgaGFyZGxvY2suCisJCWNsb2NrID0gamlmZmllcyArIFNUMFhfQlVTX0ZSRUVfREVMQVk7CisKKwkJd2hpbGUgKCgoU1RBVFVTIHwgU1RBVFVTIHwgU1RBVFVTKSAmIChTVEFUX0JTWSB8IFNUQVRfU0VMKSkgJiYgKCFzdDB4X2Fib3J0ZWQpICYmIHRpbWVfYmVmb3JlIChqaWZmaWVzLCBjbG9jaykpCisJCQljcHVfcmVsYXgoKTsKKworCQlpZiAodGltZV9hZnRlciAoamlmZmllcywgY2xvY2spKQorCQkJcmV0dXJuIHJldGNvZGUgKERJRF9CVVNfQlVTWSk7CisJCWVsc2UgaWYgKHN0MHhfYWJvcnRlZCkKKwkJCXJldHVybiByZXRjb2RlIChzdDB4X2Fib3J0ZWQpOworI2VuZGlmCisJCURQUklOVEsgKFBIQVNFX1NFTEVDVElPTiwgInNjc2klZCA6IHBoYXNlID0gU0VMRUNUSU9OXG4iLCBob3N0bm8pOworCisJCWNsb2NrID0gamlmZmllcyArIFNUMFhfU0VMRUNUSU9OX0RFTEFZOworCisJCS8qCisJCSAqIEFyYml0cmF0aW9uL3NlbGVjdGlvbiBwcm9jZWR1cmUgOgorCQkgKiAxLiAgRGlzYWJsZSBkcml2ZXJzCisJCSAqIDIuICBXcml0ZSBIT1NUIGFkYXB0ZXIgYWRkcmVzcyBiaXQKKwkJICogMy4gIFNldCBzdGFydCBhcmJpdHJhdGlvbi4KKwkJICogNC4gIFdlIGdldCBlaXRoZXIgQVJCSVRSQVRJT04gQ09NUExFVEUgb3IgU0VMRUNUIGF0IHRoaXMKKwkJICogICAgIHBvaW50LgorCQkgKiA1LiAgT1Igb3VyIElEIGFuZCB0YXJnZXRzIG9uIGJ1cy4KKwkJICogNi4gIEVuYWJsZSBTQ1NJIGRyaXZlcnMgYW5kIGFzc2VydGVkIFNFTCBhbmQgQVRUTgorCQkgKi8KKworI2lmZGVmIEFSQklUUkFURQorCQkvKiBGSVhNRTogdmVyaWZ5IGhvc3QgbG9jayBpcyBhbHdheXMgaGVsZCBoZXJlICovCisJCVdSSVRFX0NPTlRST0woMCk7CisJCVdSSVRFX0RBVEEoKGNvbnRyb2xsZXJfdHlwZSA9PSBTRUFHQVRFKSA/IDB4ODAgOiAweDQwKTsKKwkJV1JJVEVfQ09OVFJPTChDTURfU1RBUlRfQVJCKTsKKworCQlVTE9PUCAoU1QwWF9TRUxFQ1RJT05fREVMQVkgKiAxMDAwMCkgeworCQkJc3RhdHVzX3JlYWQgPSBTVEFUVVM7CisJCQlpZiAoc3RhdHVzX3JlYWQgJiBTVEFUX0FSQl9DTVBMKQorCQkJCWJyZWFrOworCQkJaWYgKHN0MHhfYWJvcnRlZCkJLyogRklYTUU6IFdoYXQ/IFdlIGFyZSBnb2luZyB0byBkbyBzb21ldGhpbmcgZXZlbiBhZnRlciBhYm9ydD8gKi8KKwkJCQlicmVhazsKKwkJCWlmIChUSU1FT1VUIHx8IChzdGF0dXNfcmVhZCAmIFNUQVRfU0VMKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZCA6IGFyYml0cmF0aW9uIGxvc3Qgb3IgdGltZW91dC5cbiIsIGhvc3Rubyk7CisJCQkJV1JJVEVfQ09OVFJPTCAoQkFTRV9DTUQpOworCQkJCXJldHVybiByZXRjb2RlIChESURfTk9fQ09OTkVDVCk7CisJCQl9CisJCX0KKwkJRFBSSU5USyAoUEhBU0VfU0VMRUNUSU9OLCAic2NzaSVkIDogYXJiaXRyYXRpb24gY29tcGxldGVcbiIsIGhvc3Rubyk7CisjZW5kaWYKKworCQkvKgorCQkgKiAgICBXaGVuIHRoZSBTQ1NJIGRldmljZSBkZWNpZGVzIHRoYXQgd2UncmUgZ2F3a2luZyBhdCBpdCwgCisJCSAqICAgIGl0IHdpbGwgcmVzcG9uZCBieSBhc3NlcnRpbmcgQlVTWSBvbiB0aGUgYnVzLgorCQkgKgorCQkgKiAgICBOb3RlIDogdGhlIFNlYWdhdGUgU1QtMDEvMDIgcHJvZHVjdCBtYW51YWwgc2F5cyB0aGF0IHdlCisJCSAqICAgIHNob3VsZCB0d2lkZGxlIHRoZSBEQVRBIHJlZ2lzdGVyIGJlZm9yZSB0aGUgY29udHJvbAorCQkgKiAgICByZWdpc3Rlci4gSG93ZXZlciwgdGhpcyBkb2VzIG5vdCB3b3JrIHJlbGlhYmx5IHNvIHdlIGRvCisJCSAqICAgIGl0IHRoZSBvdGhlciB3YXkgYXJvdW5kLgorCQkgKgorCQkgKiAgICBQcm9iYWJseSBjb3VsZCBiZSBhIHByb2JsZW0gd2l0aCBhcmJpdHJhdGlvbiB0b28sIHdlCisJCSAqICAgIHJlYWxseSBzaG91bGQgdHJ5IHRoaXMgd2l0aCBhIFNDU0kgcHJvdG9jb2wgb3IgbG9naWMgCisJCSAqICAgIGFuYWx5emVyIHRvIHNlZSB3aGF0IGlzIGdvaW5nIG9uLgorCQkgKi8KKwkJdG1wX2RhdGEgPSAodW5zaWduZWQgY2hhcikgKCgxIDw8IHRhcmdldCkgfCAoY29udHJvbGxlcl90eXBlID09IFNFQUdBVEUgPyAweDgwIDogMHg0MCkpOworCQl0bXBfY29udHJvbCA9IEJBU0VfQ01EIHwgQ01EX0RSVlJfRU5BQkxFIHwgQ01EX1NFTCB8IChyZXNlbGVjdCA/IENNRF9BVFROIDogMCk7CisKKwkJLyogRklYTUU6IHZlcmlmeSBob3N0IGxvY2sgaXMgYWx3YXlzIGhlbGQgaGVyZSAqLworI2lmZGVmIE9MRENOVERBVEFTQ0VNRQorI2lmZGVmIFNXQVBDTlREQVRBCisJCVdSSVRFX0NPTlRST0wgKHRtcF9jb250cm9sKTsKKwkJV1JJVEVfREFUQSAodG1wX2RhdGEpOworI2Vsc2UKKwkJV1JJVEVfREFUQSAodG1wX2RhdGEpOworCQlXUklURV9DT05UUk9MICh0bXBfY29udHJvbCk7CisjZW5kaWYKKyNlbHNlCisJCXRtcF9jb250cm9sIF49IENNRF9CU1k7CS8qIFRoaXMgaXMgZ3Vlc3N3b3JrLiBXaGF0IHVzZWQgdG8gYmUgaW4gZHJpdmVyICAgICovCisJCVdSSVRFX0NPTlRST0wgKHRtcF9jb250cm9sKTsJLyogY291bGQgbmV2ZXIgd29yazogaXQgc2VudCBkYXRhIGludG8gY29udHJvbCAgICAgKi8KKwkJV1JJVEVfREFUQSAodG1wX2RhdGEpOwkvKiByZWdpc3RlciBhbmQgY29udHJvbCBpbmZvIGludG8gZGF0YS4gSG9wZWZ1bGx5ICAqLworCQl0bXBfY29udHJvbCBePSBDTURfQlNZOwkvKiBmaXhlZCwgYnV0IG9yZGVyIG9mIGZpcnN0IHR3byBtYXkgYmUgd3JvbmcuICAgICAqLworCQlXUklURV9DT05UUk9MICh0bXBfY29udHJvbCk7CS8qIC0tIHBhdmVsQHVjdy5jeiAgICovCisjZW5kaWYKKworCQlVTE9PUCAoMjUwICogMTAwMCkgeworCQkJaWYgKHN0MHhfYWJvcnRlZCkgeworCQkJCS8qCisJCQkJICoJSWYgd2UgaGF2ZSBiZWVuIGFib3J0ZWQsIGFuZCB3ZSBoYXZlIGEKKwkJCQkgKgljb21tYW5kIGluIHByb2dyZXNzLCBJRSB0aGUgdGFyZ2V0IAorCQkJCSAqCXN0aWxsIGhhcyBCU1kgYXNzZXJ0ZWQsIHRoZW4gd2Ugd2lsbAorCQkJCSAqCXJlc2V0IHRoZSBidXMsIGFuZCBub3RpZnkgdGhlIG1pZGxldmVsCisJCQkJICoJZHJpdmVyIHRvIGV4cGVjdCBzZW5zZS4KKwkJCQkgKi8KKworCQkJCVdSSVRFX0NPTlRST0wgKEJBU0VfQ01EKTsKKwkJCQlpZiAoU1RBVFVTICYgU1RBVF9CU1kpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkIDogQlNUIGFzc2VydGVkIGFmdGVyIHdlJ3ZlIGJlZW4gYWJvcnRlZC5cbiIsIGhvc3Rubyk7CisJCQkJCXNlYWdhdGVfc3QweF9idXNfcmVzZXQoTlVMTCk7CisJCQkJCXJldHVybiByZXRjb2RlIChESURfUkVTRVQpOworCQkJCX0KKwkJCQlyZXR1cm4gcmV0Y29kZSAoc3QweF9hYm9ydGVkKTsKKwkJCX0KKwkJCWlmIChTVEFUVVMgJiBTVEFUX0JTWSkKKwkJCQlicmVhazsKKwkJCWlmIChUSU1FT1VUKSB7CisJCQkJRFBSSU5USyAoUEhBU0VfU0VMRUNUSU9OLCAic2NzaSVkIDogTk8gQ09OTkVDVCB3aXRoIHRhcmdldCAlZCwgc3RhdCA9ICV4IFxuIiwgaG9zdG5vLCB0YXJnZXQsIFNUQVRVUyk7CisJCQkJcmV0dXJuIHJldGNvZGUgKERJRF9OT19DT05ORUNUKTsKKwkJCX0KKwkJfQorCisJCS8qIEVzdGFibGlzaCBjdXJyZW50IHBvaW50ZXJzLiAgVGFrZSBpbnRvIGFjY291bnQgc2NhdHRlciAvIGdhdGhlciAqLworCisJCWlmICgobm9idWZmcyA9IFNDaW50LT51c2Vfc2cpKSB7CisjaWYgKERFQlVHICYgREVCVUdfU0cpCisJCQl7CisJCQkJaW50IGk7CisJCQkJcHJpbnRrKCJzY3NpJWQgOiBzY2F0dGVyIGdhdGhlciByZXF1ZXN0ZWQsIHVzaW5nICVkIGJ1ZmZlcnMuXG4iLCBob3N0bm8sIG5vYnVmZnMpOworCQkJCWZvciAoaSA9IDA7IGkgPCBub2J1ZmZzOyArK2kpCisJCQkJCXByaW50aygic2NzaSVkIDogYnVmZmVyICVkIGFkZHJlc3MgPSAlcCBsZW5ndGggPSAlZFxuIiwKKwkJCQkJICAgICBob3N0bm8sIGksCisJCQkJCSAgICAgcGFnZV9hZGRyZXNzKGJ1ZmZlcltpXS5wYWdlKSArIGJ1ZmZlcltpXS5vZmZzZXQsCisJCQkJCSAgICAgYnVmZmVyW2ldLmxlbmd0aCk7CisJCQl9CisjZW5kaWYKKworCQkJYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBTQ2ludC0+YnVmZmVyOworCQkJbGVuID0gYnVmZmVyLT5sZW5ndGg7CisJCQlkYXRhID0gcGFnZV9hZGRyZXNzKGJ1ZmZlci0+cGFnZSkgKyBidWZmZXItPm9mZnNldDsKKwkJfSBlbHNlIHsKKwkJCURQUklOVEsgKERFQlVHX1NHLCAic2NzaSVkIDogc2NhdHRlciBnYXRoZXIgbm90IHJlcXVlc3RlZC5cbiIsIGhvc3Rubyk7CisJCQlidWZmZXIgPSBOVUxMOworCQkJbGVuID0gU0NpbnQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJCWRhdGEgPSAodW5zaWduZWQgY2hhciAqKSBTQ2ludC0+cmVxdWVzdF9idWZmZXI7CisJCX0KKworCQlEUFJJTlRLIChQSEFTRV9EQVRBSU4gfCBQSEFTRV9EQVRBT1VULCAic2NzaSVkIDogbGVuID0gJWRcbiIsCisJCQkgaG9zdG5vLCBsZW4pOworCisJCWJyZWFrOworI2lmZGVmIExJTktFRAorCWNhc2UgTElOS0VEX1JJR0hUOgorCQlicmVhazsKKwljYXNlIExJTktFRF9XUk9ORzoKKwkJYnJlYWs7CisjZW5kaWYKKwl9CQkJLyogZW5kIG9mIHN3aXRjaChyZXNlbGVjdCkgKi8KKworCS8qCisJICogICAgVGhlcmUgYXJlIHNldmVyYWwgY29uZGl0aW9ucyB1bmRlciB3aGljaCB3ZSB3aXNoIHRvIHNlbmQgYSBtZXNzYWdlIDoKKwkgKiAgICAgIDEuICBXaGVuIHdlIGFyZSBhbGxvd2luZyBkaXNjb25uZWN0IC8gcmVjb25uZWN0LCBhbmQgbmVlZCB0bworCSAqCWVzdGFibGlzaCB0aGUgSV9UX0wgbmV4dXMgdmlhIGFuIElERU5USUZZIHdpdGggdGhlIERpc2NQcml2IGJpdAorCSAqCXNldC4KKwkgKgorCSAqICAgICAgMi4gIFdoZW4gd2UgYXJlIGRvaW5nIGxpbmtlZCBjb21tYW5kcywgYXJlIGhhdmUgdGhlIHdyb25nIElfVF9MCisJICoJbmV4dXMgZXN0YWJsaXNoZWQgYW5kIHdhbnQgdG8gc2VuZCBhbiBBQk9SVCBtZXNzYWdlLgorCSAqLworCisJLyogR0NDIGRvZXMgbm90IGxpa2UgYW4gaWZkZWYgaW5zaWRlIGEgbWFjcm8sIHNvIGRvIGl0IHRoZSBoYXJkIHdheS4gKi8KKyNpZmRlZiBMSU5LRUQKKwlXUklURV9DT05UUk9MIChCQVNFX0NNRCB8IENNRF9EUlZSX0VOQUJMRSB8ICgoKHJlc2VsZWN0ID09IENBTl9SRUNPTk5FQ1QpfHwgKHJlc2VsZWN0ID09IExJTktFRF9XUk9ORykpPyBDTURfQVRUTiA6IDApKTsKKyNlbHNlCisJV1JJVEVfQ09OVFJPTCAoQkFTRV9DTUQgfCBDTURfRFJWUl9FTkFCTEUgfCAoKChyZXNlbGVjdCA9PSBDQU5fUkVDT05ORUNUKSk/IENNRF9BVFROIDogMCkpOworI2VuZGlmCisKKwkvKgorCSAqICAgIElORk9STUFUSU9OIFRSQU5TRkVSIFBIQVNFCisJICoKKwkgKiAgICAgIFRoZSBuYXN0eSBsb29raW5nIHJlYWQgLyB3cml0ZSBpbmxpbmUgYXNzZW1ibGVyIGxvb3BzIHdlIHVzZSBmb3IKKwkgKiAgICAgIERBVEFJTiBhbmQgREFUQU9VVCBwaGFzZXMgYXJlIGFwcHJveGltYXRlbHkgNC01IHRpbWVzIGFzIGZhc3QgYXMKKwkgKiAgICAgIHRoZSAnQycgdmVyc2lvbnMgLSBzaW5jZSB3ZSdyZSBtb3ZpbmcgMTAyNCBieXRlcyBvZiBkYXRhLCB0aGlzCisJICogICAgICByZWFsbHkgYWRkcyB1cC4KKwkgKgorCSAqICAgICAgU0pUOiBUaGUgbmFzdHktbG9va2luZyBhc3NlbWJsZXIgaXMgZ29uZSwgc28gaXQncyBzbG93ZXIuCisJICoKKwkgKi8KKworCURQUklOVEsgKFBIQVNFX0VUQywgInNjc2klZCA6IHBoYXNlID0gSU5GT1JNQVRJT04gVFJBTlNGRVJcbiIsIGhvc3Rubyk7CisKKwlpbmNvbW1hbmQgPSAxOworCXRyYW5zZmVyc2l6ZSA9IFNDaW50LT50cmFuc2ZlcnNpemU7CisJdW5kZXJmbG93ID0gU0NpbnQtPnVuZGVyZmxvdzsKKworCS8qCisJICoJTm93LCB3ZSBwb2xsIHRoZSBkZXZpY2UgZm9yIHN0YXR1cyBpbmZvcm1hdGlvbiwKKwkgKiAgICAgIGFuZCBoYW5kbGUgYW55IHJlcXVlc3RzIGl0IG1ha2VzLiAgTm90ZSB0aGF0IHNpbmNlIHdlIGFyZSB1bnN1cmUKKwkgKglvZiBob3cgbXVjaCBkYXRhIHdpbGwgYmUgZmxvd2luZyBhY3Jvc3MgdGhlIHN5c3RlbSwgZXRjIGFuZAorCSAqCWNhbm5vdCBtYWtlIHJlYXNvbmFibGUgdGltZW91dHMsIHRoYXQgd2Ugd2lsbCBpbnN0ZWFkIGhhdmUgdGhlCisJICoJbWlkbGV2ZWwgZHJpdmVyIGhhbmRsZSBhbnkgdGltZW91dHMgdGhhdCBvY2N1ciBpbiB0aGlzIHBoYXNlLgorCSAqLworCisJd2hpbGUgKCgoc3RhdHVzX3JlYWQgPSBTVEFUVVMpICYgU1RBVF9CU1kpICYmICFzdDB4X2Fib3J0ZWQgJiYgIWRvbmUpIHsKKyNpZmRlZiBQQVJJVFkKKwkJaWYgKHN0YXR1c19yZWFkICYgU1RBVF9QQVJJVFkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkIDogZ290IHBhcml0eSBlcnJvclxuIiwgaG9zdG5vKTsKKwkJCXN0MHhfYWJvcnRlZCA9IERJRF9QQVJJVFk7CisJCX0KKyNlbmRpZgorCQlpZiAoc3RhdHVzX3JlYWQgJiBTVEFUX1JFUSkgeworI2lmICgoREVCVUcgJiBQSEFTRV9FVEMpID09IFBIQVNFX0VUQykKKwkJCWlmICgobmV3cGhhc2UgPSAoc3RhdHVzX3JlYWQgJiBSRVFfTUFTSykpICE9IHBoYXNlKSB7CisJCQkJcGhhc2UgPSBuZXdwaGFzZTsKKwkJCQlzd2l0Y2ggKHBoYXNlKSB7CisJCQkJY2FzZSBSRVFfREFUQU9VVDoKKwkJCQkJcHJpbnRrICgic2NzaSVkIDogcGhhc2UgPSBEQVRBIE9VVFxuIiwgaG9zdG5vKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBSRVFfREFUQUlOOgorCQkJCQlwcmludGsgKCJzY3NpJWQgOiBwaGFzZSA9IERBVEEgSU5cbiIsIGhvc3Rubyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUkVRX0NNRE9VVDoKKwkJCQkJcHJpbnRrCisJCQkJCSAgICAoInNjc2klZCA6IHBoYXNlID0gQ09NTUFORCBPVVRcbiIsIGhvc3Rubyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUkVRX1NUQVRJTjoKKwkJCQkJcHJpbnRrICgic2NzaSVkIDogcGhhc2UgPSBTVEFUVVMgSU5cbiIsCWhvc3Rubyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUkVRX01TR09VVDoKKwkJCQkJcHJpbnRrCisJCQkJCSAgICAoInNjc2klZCA6IHBoYXNlID0gTUVTU0FHRSBPVVRcbiIsIGhvc3Rubyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUkVRX01TR0lOOgorCQkJCQlwcmludGsgKCJzY3NpJWQgOiBwaGFzZSA9IE1FU1NBR0UgSU5cbiIsIGhvc3Rubyk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXByaW50ayAoInNjc2klZCA6IHBoYXNlID0gVU5LTk9XTlxuIiwgaG9zdG5vKTsKKwkJCQkJc3QweF9hYm9ydGVkID0gRElEX0VSUk9SOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQkJc3dpdGNoIChzdGF0dXNfcmVhZCAmIFJFUV9NQVNLKSB7CisJCQljYXNlIFJFUV9EQVRBT1VUOgorCQkJCS8qCisJCQkJICogSWYgd2UgYXJlIGluIGZhc3QgbW9kZSwgdGhlbiB3ZSBzaW1wbHkgc3BsYXQKKwkJCQkgKiB0aGUgZGF0YSBvdXQgaW4gd29yZC1zaXplZCBjaHVua3MgYXMgZmFzdCBhcworCQkJCSAqIHdlIGNhbi4KKwkJCQkgKi8KKworCQkJCWlmICghbGVuKSB7CisjaWYgMAorCQkJCQlwcmludGsoInNjc2klZDogdW5kZXJmbG93IHRvIHRhcmdldCAlZCBsdW4gJWQgXG4iLCBob3N0bm8sIHRhcmdldCwgbHVuKTsKKwkJCQkJc3QweF9hYm9ydGVkID0gRElEX0VSUk9SOworCQkJCQlmYXN0ID0gMDsKKyNlbmRpZgorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAoZmFzdCAmJiB0cmFuc2ZlcnNpemUKKwkJCQkgICAgJiYgIShsZW4gJSB0cmFuc2ZlcnNpemUpCisJCQkJICAgICYmIChsZW4gPj0gdHJhbnNmZXJzaXplKQorI2lmZGVmIEZBU1QzMgorCQkJCSAgICAmJiAhKHRyYW5zZmVyc2l6ZSAlIDQpCisjZW5kaWYKKwkJCQkgICAgKSB7CisJCQkJCURQUklOVEsgKERFQlVHX0ZBU1QsCisJCQkJCQkgInNjc2klZCA6IEZBU1QgdHJhbnNmZXIsIHVuZGVyZmxvdyA9ICVkLCB0cmFuc2ZlcnNpemUgPSAlZFxuIgorCQkJCQkJICIgICAgICAgICBsZW4gPSAlZCwgZGF0YSA9ICUwOHhcbiIsCisJCQkJCQkgaG9zdG5vLCBTQ2ludC0+dW5kZXJmbG93LAorCQkJCQkJIFNDaW50LT50cmFuc2ZlcnNpemUsIGxlbiwKKwkJCQkJCSBkYXRhKTsKKworCQkJLyogU0pUOiBTdGFydC4gRmFzdCBXcml0ZSAqLworI2lmZGVmIFNFQUdBVEVfVVNFX0FTTQorCQkJCQlfX2FzbV9fICgiY2xkXG5cdCIKKyNpZmRlZiBGQVNUMzIKKwkJCQkJCSAic2hyICQyLCAlJWVjeFxuXHQiCisJCQkJCQkgIjE6XHQiCisJCQkJCQkgImxvZHNsXG5cdCIKKwkJCQkJCSAibW92bCAlJWVheCwgKCUlZWRpKVxuXHQiCisjZWxzZQorCQkJCQkJICIxOlx0IgorCQkJCQkJICJsb2RzYlxuXHQiCisJCQkJCQkgIm1vdmIgJSVhbCwgKCUlZWRpKVxuXHQiCisjZW5kaWYKKwkJCQkJCSAibG9vcCAxYjsiCisJCQkJICAgICAgLyogb3V0cHV0ICovIDoKKwkJCQkgICAgICAvKiBpbnB1dCAqLyA6IkQiIChzdDB4X2RyKSwKKwkJCQkJCSAiUyIKKwkJCQkJCSAoZGF0YSksCisJCQkJCQkgImMiIChTQ2ludC0+dHJhbnNmZXJzaXplKQorLyogY2xvYmJlcmVkICovCisJCQkJICAgICAgOgkgImVheCIsICJlY3giLAorCQkJCQkJICJlc2kiKTsKKyNlbHNlCQkJCS8qIFNFQUdBVEVfVVNFX0FTTSAqLworCQkJCQltZW1jcHlfdG9pbyhzdDB4X2RyLCBkYXRhLCB0cmFuc2ZlcnNpemUpOworI2VuZGlmCQkJCS8qIFNFQUdBVEVfVVNFX0FTTSAqLworLyogU0pUOiBFbmQgKi8KKwkJCQkJbGVuIC09IHRyYW5zZmVyc2l6ZTsKKwkJCQkJZGF0YSArPSB0cmFuc2ZlcnNpemU7CisJCQkJCURQUklOVEsgKERFQlVHX0ZBU1QsICJzY3NpJWQgOiBGQVNUIHRyYW5zZmVyIGNvbXBsZXRlIGxlbiA9ICVkIGRhdGEgPSAlMDh4XG4iLCBob3N0bm8sIGxlbiwgZGF0YSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyoKKwkJCQkJICogICAgV2UgbG9vcCBhcyBsb25nIGFzIHdlIGFyZSBpbiBhIAorCQkJCQkgKiAgICBkYXRhIG91dCBwaGFzZSwgdGhlcmUgaXMgZGF0YSB0bworCQkJCQkgKiAgICBzZW5kLCBhbmQgQlNZIGlzIHN0aWxsIGFjdGl2ZS4KKwkJCQkJICovCisKKy8qIFNKVDogU3RhcnQuIFNsb3cgV3JpdGUuICovCisjaWZkZWYgU0VBR0FURV9VU0VfQVNNCisKKwkJCQkJaW50IF9fZHVtbXlfMSwgX19kdW1teV8yOworCisvKgorICogICAgICBXZSBsb29wIGFzIGxvbmcgYXMgd2UgYXJlIGluIGEgZGF0YSBvdXQgcGhhc2UsIHRoZXJlIGlzIGRhdGEgdG8gc2VuZCwgCisgKiAgICAgIGFuZCBCU1kgaXMgc3RpbGwgYWN0aXZlLgorICovCisvKiBMb2NhbCB2YXJpYWJsZXMgOiBsZW4gPSBlY3ggLCBkYXRhID0gZXNpLCAKKyAgICAgICAgICAgICAgICAgICAgIHN0MHhfY3Jfc3IgPSBlYngsIHN0MHhfZHIgPSAgZWRpCisqLworCQkJCQlfX2FzbV9fICgKKwkJCQkJCQkvKiBUZXN0IGZvciBhbnkgZGF0YSBoZXJlIGF0IGFsbC4gKi8KKwkJCQkJCQkib3JsICUlZWN4LCAlJWVjeFxuXHQiCisJCQkJCQkJImp6IDJmXG5cdCIgImNsZFxuXHQiCisvKiAgICAgICAgICAgICAgICAgICAgIm1vdmwgc3QweF9jcl9zciwgJSVlYnhcblx0IiAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAibW92bCBzdDB4X2RyLCAlJWVkaVxuXHQiICAqLworCQkJCQkJCSIxOlx0IgorCQkJCQkJCSJtb3ZiICglJWVieCksICUlYWxcblx0IgorCQkJCQkJCS8qIFRlc3QgZm9yIEJTWSAqLworCQkJCQkJCSJ0ZXN0ICQxLCAlJWFsXG5cdCIKKwkJCQkJCQkianogMmZcblx0IgorCQkJCQkJCS8qIFRlc3QgZm9yIGRhdGEgb3V0IHBoYXNlIC0gU1RBVFVTICYgUkVRX01BU0sgc2hvdWxkIGJlIAorCQkJCQkJCSAgIFJFUV9EQVRBT1VULCB3aGljaCBpcyAwLiAqLworCQkJCQkJCSJ0ZXN0ICQweGUsICUlYWxcblx0IgorCQkJCQkJCSJqbnogMmZcblx0IgorCQkJCQkJCS8qIFRlc3QgZm9yIFJFUSAqLworCQkJCQkJCSJ0ZXN0ICQweDEwLCAlJWFsXG5cdCIKKwkJCQkJCQkianogMWJcblx0IgorCQkJCQkJCSJsb2RzYlxuXHQiCisJCQkJCQkJIm1vdmIgJSVhbCwgKCUlZWRpKVxuXHQiCisJCQkJCQkJImxvb3AgMWJcblx0IiAiMjpcbiIKKwkJCQkgICAgICAvKiBvdXRwdXQgKi8gOiI9UyIgKGRhdGEpLCAiPWMiIChsZW4pLAorCQkJCQkJCSI9YiIKKwkJCQkJCQkoX19kdW1teV8xKSwKKwkJCQkJCQkiPUQiIChfX2R1bW15XzIpCisvKiBpbnB1dCAqLworCQkJCSAgICAgIDoJCSIwIiAoZGF0YSksICIxIiAobGVuKSwKKwkJCQkJCQkiMiIgKHN0MHhfY3Jfc3IpLAorCQkJCQkJCSIzIiAoc3QweF9kcikKKy8qIGNsb2JiZXJlZCAqLworCQkJCSAgICAgIDoJCSJlYXgiKTsKKyNlbHNlCQkJCS8qIFNFQUdBVEVfVVNFX0FTTSAqLworCQkJCQl3aGlsZSAobGVuKSB7CisJCQkJCQl1bnNpZ25lZCBjaGFyIHN0YXQ7CisKKwkJCQkJCXN0YXQgPSBTVEFUVVM7CisJCQkJCQlpZiAoIShzdGF0ICYgU1RBVF9CU1kpCisJCQkJCQkgICAgfHwgKChzdGF0ICYgUkVRX01BU0spICE9CisJCQkJCQkJUkVRX0RBVEFPVVQpKQorCQkJCQkJCWJyZWFrOworCQkJCQkJaWYgKHN0YXQgJiBTVEFUX1JFUSkgeworCQkJCQkJCVdSSVRFX0RBVEEgKCpkYXRhKyspOworCQkJCQkJCS0tbGVuOworCQkJCQkJfQorCQkJCQl9CisjZW5kaWYJCQkJLyogU0VBR0FURV9VU0VfQVNNICovCisvKiBTSlQ6IEVuZC4gKi8KKwkJCQl9CisKKwkJCQlpZiAoIWxlbiAmJiBub2J1ZmZzKSB7CisJCQkJCS0tbm9idWZmczsKKwkJCQkJKytidWZmZXI7CisJCQkJCWxlbiA9IGJ1ZmZlci0+bGVuZ3RoOworCQkJCQlkYXRhID0gcGFnZV9hZGRyZXNzKGJ1ZmZlci0+cGFnZSkgKyBidWZmZXItPm9mZnNldDsKKwkJCQkJRFBSSU5USyAoREVCVUdfU0csCisJCQkJCQkgInNjc2klZCA6IG5leHQgc2NhdHRlci1nYXRoZXIgYnVmZmVyIGxlbiA9ICVkIGFkZHJlc3MgPSAlMDh4XG4iLAorCQkJCQkJIGhvc3RubywgbGVuLCBkYXRhKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkVRX0RBVEFJTjoKKyNpZmRlZiBTTE9XX1JBVEUKKwkJCQlpZiAoYm9ya2VuKSB7CisjaWYgKERFQlVHICYgKFBIQVNFX0RBVEFJTikpCisJCQkJCXRyYW5zZmVyZWQgKz0gbGVuOworI2VuZGlmCisJCQkJCWZvciAoOyBsZW4gJiYgKFNUQVRVUyAmIChSRVFfTUFTSyB8IFNUQVRfUkVRKSkgPT0gKFJFUV9EQVRBSU4gfCBTVEFUX1JFUSk7IC0tbGVuKSB7CisJCQkJCQkqZGF0YSsrID0gREFUQTsKKwkJCQkJCWJvcmtlbl93YWl0KCk7CisJCQkJCX0KKyNpZiAoREVCVUcgJiAoUEhBU0VfREFUQUlOKSkKKwkJCQkJdHJhbnNmZXJlZCAtPSBsZW47CisjZW5kaWYKKwkJCQl9IGVsc2UKKyNlbmRpZgorCisJCQkJCWlmIChmYXN0ICYmIHRyYW5zZmVyc2l6ZQorCQkJCQkgICAgJiYgIShsZW4gJSB0cmFuc2ZlcnNpemUpCisJCQkJCSAgICAmJiAobGVuID49IHRyYW5zZmVyc2l6ZSkKKyNpZmRlZiBGQVNUMzIKKwkJCQkJICAgICYmICEodHJhbnNmZXJzaXplICUgNCkKKyNlbmRpZgorCQkJCSAgICApIHsKKwkJCQkJRFBSSU5USyAoREVCVUdfRkFTVCwKKwkJCQkJCSAic2NzaSVkIDogRkFTVCB0cmFuc2ZlciwgdW5kZXJmbG93ID0gJWQsIHRyYW5zZmVyc2l6ZSA9ICVkXG4iCisJCQkJCQkgIiAgICAgICAgIGxlbiA9ICVkLCBkYXRhID0gJTA4eFxuIiwKKwkJCQkJCSBob3N0bm8sIFNDaW50LT51bmRlcmZsb3csCisJCQkJCQkgU0NpbnQtPnRyYW5zZmVyc2l6ZSwgbGVuLAorCQkJCQkJIGRhdGEpOworCisvKiBTSlQ6IFN0YXJ0LiBGYXN0IFJlYWQgKi8KKyNpZmRlZiBTRUFHQVRFX1VTRV9BU00KKwkJCQkJX19hc21fXyAoImNsZFxuXHQiCisjaWZkZWYgRkFTVDMyCisJCQkJCQkgInNociAkMiwgJSVlY3hcblx0IgorCQkJCQkJICIxOlx0IgorCQkJCQkJICJtb3ZsICglJWVzaSksICUlZWF4XG5cdCIKKwkJCQkJCSAic3Rvc2xcblx0IgorI2Vsc2UKKwkJCQkJCSAiMTpcdCIKKwkJCQkJCSAibW92YiAoJSVlc2kpLCAlJWFsXG5cdCIKKwkJCQkJCSAic3Rvc2Jcblx0IgorI2VuZGlmCisJCQkJCQkgImxvb3AgMWJcblx0IgorCQkJCSAgICAgIC8qIG91dHB1dCAqLyA6CisJCQkJICAgICAgLyogaW5wdXQgKi8gOiJTIiAoc3QweF9kciksCisJCQkJCQkgIkQiCisJCQkJCQkgKGRhdGEpLAorCQkJCQkJICJjIiAoU0NpbnQtPnRyYW5zZmVyc2l6ZSkKKy8qIGNsb2JiZXJlZCAqLworCQkJCSAgICAgIDoJICJlYXgiLCAiZWN4IiwKKwkJCQkJCSAiZWRpIik7CisjZWxzZQkJCQkvKiBTRUFHQVRFX1VTRV9BU00gKi8KKwkJCQkJbWVtY3B5X2Zyb21pbyhkYXRhLCBzdDB4X2RyLCBsZW4pOworI2VuZGlmCQkJCS8qIFNFQUdBVEVfVVNFX0FTTSAqLworLyogU0pUOiBFbmQgKi8KKwkJCQkJbGVuIC09IHRyYW5zZmVyc2l6ZTsKKwkJCQkJZGF0YSArPSB0cmFuc2ZlcnNpemU7CisjaWYgKERFQlVHICYgUEhBU0VfREFUQUlOKQorCQkJCQlwcmludGsgKCJzY3NpJWQ6IHRyYW5zZmVyZWQgKz0gJWRcbiIsIGhvc3RubywgdHJhbnNmZXJzaXplKTsKKwkJCQkJdHJhbnNmZXJlZCArPSB0cmFuc2ZlcnNpemU7CisjZW5kaWYKKworCQkJCQlEUFJJTlRLIChERUJVR19GQVNULCAic2NzaSVkIDogRkFTVCB0cmFuc2ZlciBjb21wbGV0ZSBsZW4gPSAlZCBkYXRhID0gJTA4eFxuIiwgaG9zdG5vLCBsZW4sIGRhdGEpOworCQkJCX0gZWxzZSB7CisKKyNpZiAoREVCVUcgJiBQSEFTRV9EQVRBSU4pCisJCQkJCXByaW50ayAoInNjc2klZDogdHJhbnNmZXJlZCArPSAlZFxuIiwgaG9zdG5vLCBsZW4pOworCQkJCQl0cmFuc2ZlcmVkICs9IGxlbjsJLyogQXNzdW1lIHdlJ2xsIHRyYW5zZmVyIGl0IGFsbCwgdGhlbgorCQkJCQkJCQkgICBzdWJ0cmFjdCB3aGF0IHdlICpkaWRuJ3QqIHRyYW5zZmVyICovCisjZW5kaWYKKworLyoKKyAqCVdlIGxvb3AgYXMgbG9uZyBhcyB3ZSBhcmUgaW4gYSBkYXRhIGluIHBoYXNlLCB0aGVyZSBpcyByb29tIHRvIHJlYWQsCisgKiAgICAgIGFuZCBCU1kgaXMgc3RpbGwgYWN0aXZlCisgKi8KKworLyogU0pUOiBTdGFydC4gKi8KKyNpZmRlZiBTRUFHQVRFX1VTRV9BU00KKworCQkJCQlpbnQgX19kdW1teV8zLCBfX2R1bW15XzQ7CisKKy8qIER1bW15IGNsb2JiZXJpbmcgdmFyaWFibGVzIGZvciB0aGUgbmV3IGdjYy0yLjk1ICovCisKKy8qCisgKiAgICAgIFdlIGxvb3AgYXMgbG9uZyBhcyB3ZSBhcmUgaW4gYSBkYXRhIGluIHBoYXNlLCB0aGVyZSBpcyByb29tIHRvIHJlYWQsIAorICogICAgICBhbmQgQlNZIGlzIHN0aWxsIGFjdGl2ZQorICovCisJCQkJCS8qIExvY2FsIHZhcmlhYmxlcyA6IGVjeCA9IGxlbiwgZWRpID0gZGF0YQorCQkJCQkgICBlc2kgPSBzdDB4X2NyX3NyLCBlYnggPSBzdDB4X2RyICovCisJCQkJCV9fYXNtX18gKAorCQkJCQkJCS8qIFRlc3QgZm9yIHJvb20gdG8gcmVhZCAqLworCQkJCQkJCSJvcmwgJSVlY3gsICUlZWN4XG5cdCIKKwkJCQkJCQkianogMmZcblx0IiAiY2xkXG5cdCIKKy8qICAgICAgICAgICAgICAgICJtb3ZsIHN0MHhfY3Jfc3IsICUlZXNpXG5cdCIgICovCisvKiAgICAgICAgICAgICAgICAibW92bCBzdDB4X2RyLCAlJWVieFxuXHQiICAqLworCQkJCQkJCSIxOlx0IgorCQkJCQkJCSJtb3ZiICglJWVzaSksICUlYWxcblx0IgorCQkJCQkJCS8qIFRlc3QgZm9yIEJTWSAqLworCQkJCQkJCSJ0ZXN0ICQxLCAlJWFsXG5cdCIKKwkJCQkJCQkianogMmZcblx0IgorCQkJCQkJCS8qIFRlc3QgZm9yIGRhdGEgaW4gcGhhc2UgLSBTVEFUVVMgJiBSRVFfTUFTSyBzaG91bGQgYmUgUkVRX0RBVEFJTiwgCisJCQkJCQkJICAgPSBTVEFUX0lPLCB3aGljaCBpcyA0LiAqLworCQkJCQkJCSJtb3ZiICQweGUsICUlYWhcblx0IgorCQkJCQkJCSJhbmRiICUlYWwsICUlYWhcblx0IgorCQkJCQkJCSJjbXBiICQweDA0LCAlJWFoXG5cdCIKKwkJCQkJCQkiam5lIDJmXG5cdCIKKwkJCQkJCQkvKiBUZXN0IGZvciBSRVEgKi8KKwkJCQkJCQkidGVzdCAkMHgxMCwgJSVhbFxuXHQiCisJCQkJCQkJImp6IDFiXG5cdCIKKwkJCQkJCQkibW92YiAoJSVlYngpLCAlJWFsXG5cdCIKKwkJCQkJCQkic3Rvc2Jcblx0IgorCQkJCQkJCSJsb29wIDFiXG5cdCIgIjI6XG4iCisJCQkJICAgICAgLyogb3V0cHV0ICovIDoiPUQiIChkYXRhKSwgIj1jIiAobGVuKSwKKwkJCQkJCQkiPVMiCisJCQkJCQkJKF9fZHVtbXlfMyksCisJCQkJCQkJIj1iIiAoX19kdW1teV80KQorLyogaW5wdXQgKi8KKwkJCQkgICAgICA6CQkiMCIgKGRhdGEpLCAiMSIgKGxlbiksCisJCQkJCQkJIjIiIChzdDB4X2NyX3NyKSwKKwkJCQkJCQkiMyIgKHN0MHhfZHIpCisvKiBjbG9iYmVyZWQgKi8KKwkJCQkgICAgICA6CQkiZWF4Iik7CisjZWxzZQkJCQkvKiBTRUFHQVRFX1VTRV9BU00gKi8KKwkJCQkJd2hpbGUgKGxlbikgeworCQkJCQkJdW5zaWduZWQgY2hhciBzdGF0OworCisJCQkJCQlzdGF0ID0gU1RBVFVTOworCQkJCQkJaWYgKCEoc3RhdCAmIFNUQVRfQlNZKQorCQkJCQkJICAgIHx8ICgoc3RhdCAmIFJFUV9NQVNLKSAhPQorCQkJCQkJCVJFUV9EQVRBSU4pKQorCQkJCQkJCWJyZWFrOworCQkJCQkJaWYgKHN0YXQgJiBTVEFUX1JFUSkgeworCQkJCQkJCSpkYXRhKysgPSBEQVRBOworCQkJCQkJCS0tbGVuOworCQkJCQkJfQorCQkJCQl9CisjZW5kaWYJCQkJLyogU0VBR0FURV9VU0VfQVNNICovCisvKiBTSlQ6IEVuZC4gKi8KKyNpZiAoREVCVUcgJiBQSEFTRV9EQVRBSU4pCisJCQkJCXByaW50ayAoInNjc2klZDogdHJhbnNmZXJlZCAtPSAlZFxuIiwgaG9zdG5vLCBsZW4pOworCQkJCQl0cmFuc2ZlcmVkIC09IGxlbjsJLyogU2luY2Ugd2UgYXNzdW1lZCBhbGwgb2YgTGVuIGdvdCAgKgorCQkJCQkJCQkgICB0cmFuc2ZlcmVkLCBjb3JyZWN0IG91ciBtaXN0YWtlICovCisjZW5kaWYKKwkJCQl9CisKKwkJCQlpZiAoIWxlbiAmJiBub2J1ZmZzKSB7CisJCQkJCS0tbm9idWZmczsKKwkJCQkJKytidWZmZXI7CisJCQkJCWxlbiA9IGJ1ZmZlci0+bGVuZ3RoOworCQkJCQlkYXRhID0gcGFnZV9hZGRyZXNzKGJ1ZmZlci0+cGFnZSkgKyBidWZmZXItPm9mZnNldDsKKwkJCQkJRFBSSU5USyAoREVCVUdfU0csICJzY3NpJWQgOiBuZXh0IHNjYXR0ZXItZ2F0aGVyIGJ1ZmZlciBsZW4gPSAlZCBhZGRyZXNzID0gJTA4eFxuIiwgaG9zdG5vLCBsZW4sIGRhdGEpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBSRVFfQ01ET1VUOgorCQkJCXdoaWxlICgoKHN0YXR1c19yZWFkID0gU1RBVFVTKSAmIFNUQVRfQlNZKSAmJgorCQkJCSAgICAgICAoKHN0YXR1c19yZWFkICYgUkVRX01BU0spID09IFJFUV9DTURPVVQpKQorCQkJCQlpZiAoc3RhdHVzX3JlYWQgJiBTVEFUX1JFUSkgeworCQkJCQkJV1JJVEVfREFUQSAoKihjb25zdCB1bnNpZ25lZCBjaGFyICopIGNtbmQpOworCQkJCQkJY21uZCA9IDEgKyAoY29uc3QgdW5zaWduZWQgY2hhciAqKWNtbmQ7CisjaWZkZWYgU0xPV19SQVRFCisJCQkJCQlpZiAoYm9ya2VuKQorCQkJCQkJCWJvcmtlbl93YWl0ICgpOworI2VuZGlmCisJCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBSRVFfU1RBVElOOgorCQkJCXN0YXR1cyA9IERBVEE7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkVRX01TR09VVDoKKwkJCQkvKgorCQkJCSAqCVdlIGNhbiBvbmx5IGhhdmUgc2VudCBhIE1TRyBPVVQgaWYgd2UKKwkJCQkgKglyZXF1ZXN0ZWQgdG8gZG8gdGhpcyBieSByYWlzaW5nIEFUVE4uCisJCQkJICoJU28sIHdlIG11c3QgZHJvcCBBVFROLgorCQkJCSAqLworCQkJCVdSSVRFX0NPTlRST0wgKEJBU0VfQ01EIHwgQ01EX0RSVlJfRU5BQkxFKTsKKwkJCQkvKgorCQkJCSAqCUlmIHdlIGFyZSByZWNvbm5lY3RpbmcsIHRoZW4gd2UgbXVzdCAKKwkJCQkgKglzZW5kIGFuIElERU5USUZZIG1lc3NhZ2UgaW4gcmVzcG9uc2UKKwkJCQkgKgl0byBNU0dPVVQuCisJCQkJICovCisJCQkJc3dpdGNoIChyZXNlbGVjdCkgeworCQkJCWNhc2UgQ0FOX1JFQ09OTkVDVDoKKwkJCQkJV1JJVEVfREFUQSAoSURFTlRJRlkgKDEsIGx1bikpOworCQkJCQlEUFJJTlRLIChQSEFTRV9SRVNFTEVDVCB8IFBIQVNFX01TR09VVCwgInNjc2klZCA6IHNlbnQgSURFTlRJRlkgbWVzc2FnZS5cbiIsIGhvc3Rubyk7CisJCQkJCWJyZWFrOworI2lmZGVmIExJTktFRAorCQkJCWNhc2UgTElOS0VEX1dST05HOgorCQkJCQlXUklURV9EQVRBIChBQk9SVCk7CisJCQkJCWxpbmtlZF9jb25uZWN0ZWQgPSAwOworCQkJCQlyZXNlbGVjdCA9IENBTl9SRUNPTk5FQ1Q7CisJCQkJCWdvdG8gY29ubmVjdF9sb29wOworCQkJCQlEUFJJTlRLIChQSEFTRV9NU0dPVVQgfCBERUJVR19MSU5LRUQsICJzY3NpJWQgOiBzZW50IEFCT1JUIG1lc3NhZ2UgdG8gY2FuY2VsIGluY29ycmVjdCBJX1RfTCBuZXh1cy5cbiIsIGhvc3Rubyk7CisjZW5kaWYJCQkJCS8qIExJTktFRCAqLworCQkJCQlEUFJJTlRLIChERUJVR19MSU5LRUQsICJjb3JyZWN0XG4iKTsKKwkJCQlkZWZhdWx0OgorCQkJCQlXUklURV9EQVRBIChOT1ApOworCQkJCQlwcmludGsoInNjc2klZCA6IHRhcmdldCAlZCByZXF1ZXN0ZWQgTVNHT1VULCBzZW50IE5PUCBtZXNzYWdlLlxuIiwgaG9zdG5vLCB0YXJnZXQpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBSRVFfTVNHSU46CisJCQkJc3dpdGNoIChtZXNzYWdlID0gREFUQSkgeworCQkJCWNhc2UgRElTQ09OTkVDVDoKKwkJCQkJREFOWSgic2VhZ2F0ZTogZGVjaWRpbmcgdG8gZGlzY29ubmVjdFxuIik7CisJCQkJCXNob3VsZF9yZWNvbm5lY3QgPSAxOworCQkJCQljdXJyZW50X2RhdGEgPSBkYXRhOwkvKiBXREUgYWRkICovCisJCQkJCWN1cnJlbnRfYnVmZmVyID0gYnVmZmVyOworCQkJCQljdXJyZW50X2J1ZmZsZW4gPSBsZW47CS8qIFdERSBhZGQgKi8KKwkJCQkJY3VycmVudF9ub2J1ZmZzID0gbm9idWZmczsKKyNpZmRlZiBMSU5LRUQKKwkJCQkJbGlua2VkX2Nvbm5lY3RlZCA9IDA7CisjZW5kaWYKKwkJCQkJZG9uZSA9IDE7CisJCQkJCURQUklOVEsgKChQSEFTRV9SRVNFTEVDVCB8IFBIQVNFX01TR0lOKSwgInNjc2klZCA6IGRpc2Nvbm5lY3RlZC5cbiIsIGhvc3Rubyk7CisJCQkJCWJyZWFrOworCisjaWZkZWYgTElOS0VECisJCQkJY2FzZSBMSU5LRURfQ01EX0NPTVBMRVRFOgorCQkJCWNhc2UgTElOS0VEX0ZMR19DTURfQ09NUExFVEU6CisjZW5kaWYKKwkJCQljYXNlIENPTU1BTkRfQ09NUExFVEU6CisJCQkJCS8qCisJCQkJCSAqIE5vdGUgOiB3ZSBzaG91bGQgY2hlY2sgZm9yIHVuZGVyZmxvdyBoZXJlLgorCQkJCQkgKi8KKwkJCQkJRFBSSU5USyhQSEFTRV9NU0dJTiwgInNjc2klZCA6IGNvbW1hbmQgY29tcGxldGUuXG4iLCBob3N0bm8pOworCQkJCQlkb25lID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBQk9SVDoKKwkJCQkJRFBSSU5USyhQSEFTRV9NU0dJTiwgInNjc2klZCA6IGFib3J0IG1lc3NhZ2UuXG4iLCBob3N0bm8pOworCQkJCQlkb25lID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTQVZFX1BPSU5URVJTOgorCQkJCQljdXJyZW50X2J1ZmZlciA9IGJ1ZmZlcjsKKwkJCQkJY3VycmVudF9idWZmbGVuID0gbGVuOwkvKiBXREUgYWRkICovCisJCQkJCWN1cnJlbnRfZGF0YSA9IGRhdGE7CS8qIFdERSBtb2QgKi8KKwkJCQkJY3VycmVudF9ub2J1ZmZzID0gbm9idWZmczsKKwkJCQkJRFBSSU5USyAoUEhBU0VfTVNHSU4sICJzY3NpJWQgOiBwb2ludGVycyBzYXZlZC5cbiIsIGhvc3Rubyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUkVTVE9SRV9QT0lOVEVSUzoKKwkJCQkJYnVmZmVyID0gY3VycmVudF9idWZmZXI7CisJCQkJCWNtbmQgPSBjdXJyZW50X2NtbmQ7CisJCQkJCWRhdGEgPSBjdXJyZW50X2RhdGE7CS8qIFdERSBtb2QgKi8KKwkJCQkJbGVuID0gY3VycmVudF9idWZmbGVuOworCQkJCQlub2J1ZmZzID0gY3VycmVudF9ub2J1ZmZzOworCQkJCQlEUFJJTlRLKFBIQVNFX01TR0lOLCAic2NzaSVkIDogcG9pbnRlcnMgcmVzdG9yZWQuXG4iLCBob3N0bm8pOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCisJCQkJCS8qCisJCQkJCSAqCUlERU5USUZZIGRpc3Rpbmd1aXNoZXMgaXRzZWxmCisJCQkJCSAqCWZyb20gdGhlIG90aGVyIG1lc3NhZ2VzIGJ5IAorCQkJCQkgKglzZXR0aW5nIHRoZSBoaWdoIGJpdC4KKwkJCQkJICoKKwkJCQkJICogICAgICBOb3RlIDogd2UgbmVlZCB0byBoYW5kbGUgYXQgCisJCQkJCSAqCWxlYXN0IG9uZSBvdXRzdGFuZGluZyBjb21tYW5kCisJCQkJCSAqCXBlciBMVU4sIGFuZCBuZWVkIHRvIGhhc2ggdGhlIAorCQkJCQkgKglTQ1NJIGNvbW1hbmQgZm9yIHRoYXQgSV9UX0wKKwkJCQkJICoJbmV4dXMgYmFzZWQgb24gdGhlIGtub3duIElEIAorCQkJCQkgKgkoYXQgdGhpcyBwb2ludCkgYW5kIExVTi4KKwkJCQkJICovCisKKwkJCQkJaWYgKG1lc3NhZ2UgJiAweDgwKSB7CisJCQkJCQlEUFJJTlRLIChQSEFTRV9NU0dJTiwgInNjc2klZCA6IElERU5USUZZIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBpZCAlZCwgbHVuICVkLlxuIiwgaG9zdG5vLCB0YXJnZXQsIG1lc3NhZ2UgJiA3KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qCisJCQkJCQkgKiAgICAgIFdlIHNob3VsZCBnbyBpbnRvIGEKKwkJCQkJCSAqCU1FU1NBR0UgT1VUIHBoYXNlLCBhbmQKKwkJCQkJCSAqCXNlbmQgIGEgTUVTU0FHRV9SRUpFQ1QKKwkJCQkJCSAqICAgICAgaWYgd2UgcnVuIGludG8gYSBtZXNzYWdlIAorCQkJCQkJICoJdGhhdCB3ZSBkb24ndCBsaWtlLiAgVGhlCisJCQkJCQkgKglzZWFnYXRlIGRyaXZlciBuZWVkcyAKKwkJCQkJCSAqCXNvbWUgc2VyaW91cyAKKwkJCQkJCSAqCXJlc3RydWN0dXJpbmcgZmlyc3QKKwkJCQkJCSAqCXRob3VnaC4KKwkJCQkJCSAqLworCQkJCQkJRFBSSU5USyAoUEhBU0VfTVNHSU4sICJzY3NpJWQgOiB1bmtub3duIG1lc3NhZ2UgJWQgZnJvbSB0YXJnZXQgJWQuXG4iLCBob3N0bm8sIG1lc3NhZ2UsIHRhcmdldCk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkIDogdW5rbm93biBwaGFzZS5cbiIsIGhvc3Rubyk7CisJCQkJc3QweF9hYm9ydGVkID0gRElEX0VSUk9SOworCQkJfQkvKiBlbmQgb2Ygc3dpdGNoIChzdGF0dXNfcmVhZCAmICBSRVFfTUFTSykgKi8KKyNpZmRlZiBTTE9XX1JBVEUKKwkJCS8qCisJCQkgKiBJIHJlYWxseSBkb24ndCBjYXJlIHRvIGRlYWwgd2l0aCBib3JrZW4gZGV2aWNlcyBpbgorCQkJICogZWFjaCBzaW5nbGUgYnl0ZSB0cmFuc2ZlciBjYXNlIChpZSwgbWVzc2FnZSBpbiwKKwkJCSAqIG1lc3NhZ2Ugb3V0LCBzdGF0dXMpLCBzbyBJJ2xsIGRvIHRoZSB3YWl0IGhlcmUgaWYgCisJCQkgKiBuZWNlc3NhcnkuCisJCQkgKi8KKwkJCWlmKGJvcmtlbikKKwkJCQlib3JrZW5fd2FpdCgpOworI2VuZGlmCisKKwkJfQkJLyogaWYoc3RhdHVzX3JlYWQgJiBTVEFUX1JFUSkgZW5kcyAqLworCX0JCQkvKiB3aGlsZSgoKHN0YXR1c19yZWFkID0gU1RBVFVTKS4uLikgZW5kcyAqLworCisJRFBSSU5USyhQSEFTRV9EQVRBSU4gfCBQSEFTRV9EQVRBT1VUIHwgUEhBU0VfRVhJVCwgInNjc2klZCA6IFRyYW5zZmVyZWQgJWQgYnl0ZXNcbiIsIGhvc3RubywgdHJhbnNmZXJlZCk7CisKKyNpZiAoREVCVUcgJiBQSEFTRV9FWElUKQorI2lmIDAJCQkJLyogRG9lc24ndCB3b3JrIGZvciBzY2F0dGVyL2dhdGhlciAqLworCXByaW50aygiQnVmZmVyIDogXG4iKTsKKwlmb3IoaSA9IDA7IGkgPCAyMDsgKytpKQorCQlwcmludGsoIiUwMnggICIsICgodW5zaWduZWQgY2hhciAqKSBkYXRhKVtpXSk7CS8qIFdERSBtb2QgKi8KKwlwcmludGsoIlxuIik7CisjZW5kaWYKKwlwcmludGsoInNjc2klZCA6IHN0YXR1cyA9ICIsIGhvc3Rubyk7CisJcHJpbnRfc3RhdHVzKHN0YXR1cyk7CisJcHJpbnRrKCIgbWVzc2FnZSA9ICUwMnhcbiIsIG1lc3NhZ2UpOworI2VuZGlmCisKKwkvKiBXZSBzaG91bGRuJ3QgcmVhY2ggdGhpcyB1bnRpbCAqYWZ0ZXIqIEJTWSBoYXMgYmVlbiBkZWFzc2VydGVkICovCisKKyNpZmRlZiBMSU5LRUQKKwllbHNlCisJeworCQkvKgorCQkgKiBGaXggdGhlIG1lc3NhZ2UgYnl0ZSBzbyB0aGF0IHVuc3VzcGVjdGluZyBoaWdoIGxldmVsIGRyaXZlcnMKKwkJICogZG9uJ3QgcHVrZSB3aGVuIHRoZXkgc2VlIGEgTElOS0VEIENPTU1BTkQgbWVzc2FnZSBpbiBwbGFjZSBvZgorCQkgKiB0aGUgQ09NTUFORCBDT01QTEVURSB0aGV5IG1heSBiZSBleHBlY3RpbmcuICBTaG91bGRuJ3QgYmUKKwkJICogbmVjZXNzYXJ5LCBidXQgaXQncyBiZXR0ZXIgdG8gYmUgb24gdGhlIHNhZmUgc2lkZS4KKwkJICoKKwkJICogQSBub24gTElOS0VEKiBtZXNzYWdlIGJ5dGUgd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kCisJCSAqIGNvbXBsZXRlZCwgYW5kIHdlIGFyZSBub3cgZGlzY29ubmVjdGVkLgorCQkgKi8KKworCQlzd2l0Y2ggKG1lc3NhZ2UpIHsKKwkJY2FzZSBMSU5LRURfQ01EX0NPTVBMRVRFOgorCQljYXNlIExJTktFRF9GTEdfQ01EX0NPTVBMRVRFOgorCQkJbWVzc2FnZSA9IENPTU1BTkRfQ09NUExFVEU7CisJCQlsaW5rZWRfdGFyZ2V0ID0gY3VycmVudF90YXJnZXQ7CisJCQlsaW5rZWRfbHVuID0gY3VycmVudF9sdW47CisJCQlsaW5rZWRfY29ubmVjdGVkID0gMTsKKwkJCURQUklOVEsgKERFQlVHX0xJTktFRCwgInNjc2klZCA6IGtlZXBpbmcgSV9UX0wgbmV4dXMgZXN0YWJsaXNoZWQgZm9yIGxpbmtlZCBjb21tYW5kLlxuIiwgaG9zdG5vKTsKKwkJCS8qIFdlIGFsc28gd2lsbCBuZWVkIHRvIGFkanVzdCBzdGF0dXMgdG8gYWNjb21tb2RhdGUgaW50ZXJtZWRpYXRlCisJCQkgICBjb25kaXRpb25zLiAqLworCQkJaWYgKChzdGF0dXMgPT0gSU5URVJNRURJQVRFX0dPT0QpIHx8IChzdGF0dXMgPT0gSU5URVJNRURJQVRFX0NfR09PRCkpCisJCQkJc3RhdHVzID0gR09PRDsKKwkJCWJyZWFrOworCQkJLyoKKwkJCSAqIFdlIHNob3VsZCBhbHNvIGhhbmRsZSB3aGF0IGFyZSAibm9ybWFsIiB0ZXJtaW5hdGlvbgorCQkJICogbWVzc2FnZXMgaGVyZSAoQUJPUlQsIEJVU19ERVZJQ0VfUkVTRVQ/LCBhbmQKKwkJCSAqIENPTU1BTkRfQ09NUExFVEUgaW5kaXZpZHVhbGx5LCBhbmQgZmxha2UgaWYgdGhpbmdzCisJCQkgKiBhcmVuJ3QgcmlnaHQuCisJCQkgKi8KKwkJZGVmYXVsdDoKKwkJCURQUklOVEsgKERFQlVHX0xJTktFRCwgInNjc2klZCA6IGNsb3NpbmcgSV9UX0wgbmV4dXMuXG4iLCBob3N0bm8pOworCQkJbGlua2VkX2Nvbm5lY3RlZCA9IDA7CisJCX0KKwl9CisjZW5kaWYJLyogTElOS0VEICovCisKKwlpZiAoc2hvdWxkX3JlY29ubmVjdCkgeworCQlEUFJJTlRLIChQSEFTRV9SRVNFTEVDVCwgInNjc2klZCA6IGV4aXRpbmcgc2VhZ2F0ZV9zdDB4X3F1ZXVlX2NvbW1hbmQoKSB3aXRoIHJlY29ubmVjdCBlbmFibGVkLlxuIiwgaG9zdG5vKTsKKwkJV1JJVEVfQ09OVFJPTCAoQkFTRV9DTUQgfCBDTURfSU5UUik7CisJfSBlbHNlCisJCVdSSVRFX0NPTlRST0wgKEJBU0VfQ01EKTsKKworCXJldHVybiByZXRjb2RlIChzdDB4X2Fib3J0ZWQpOworfQkJCQkvKiBlbmQgb2YgaW50ZXJuYWxfY29tbWFuZCAqLworCitzdGF0aWMgaW50IHNlYWdhdGVfc3QweF9hYm9ydCAoU2NzaV9DbW5kICogU0NwbnQpCit7CisJc3QweF9hYm9ydGVkID0gRElEX0FCT1JUOworCXJldHVybiBTVUNDRVNTOworfQorCisjdW5kZWYgVUxPT1AKKyN1bmRlZiBUSU1FT1VUCisKKy8qCisgKiB0aGUgc2VhZ2F0ZV9zdDB4X3Jlc2V0IGZ1bmN0aW9uIHJlc2V0cyB0aGUgU0NTSSBidXMgCisgKgorICogTWF5IGJlIGNhbGxlZCB3aXRoIFNDcG50ID0gTlVMTAorICovCisKK3N0YXRpYyBpbnQgc2VhZ2F0ZV9zdDB4X2J1c19yZXNldChTY3NpX0NtbmQgKiBTQ3BudCkKK3sKKwkvKiBObyB0aW1lb3V0cyAtIHRoaXMgY29tbWFuZCBpcyBnb2luZyB0byBmYWlsIGJlY2F1c2UgaXQgd2FzIHJlc2V0LiAqLworCURBTlkgKCJzY3NpJWQ6IFJlc2V0aW5nIGJ1cy4uLiAiLCBob3N0bm8pOworCisJLyogYXNzZXJ0ICBSRVNFVCBzaWduYWwgb24gU0NTSSBidXMuICAqLworCVdSSVRFX0NPTlRST0wgKEJBU0VfQ01EIHwgQ01EX1JTVCk7CisKKwl1ZGVsYXkgKDIwICogMTAwMCk7CisKKwlXUklURV9DT05UUk9MIChCQVNFX0NNRCk7CisJc3QweF9hYm9ydGVkID0gRElEX1JFU0VUOworCisJREFOWSAoImRvbmUuXG4iKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzZWFnYXRlX3N0MHhfaG9zdF9yZXNldChTY3NpX0NtbmQgKlNDcG50KQoreworCXJldHVybiBGQUlMRUQ7Cit9CisKK3N0YXRpYyBpbnQgc2VhZ2F0ZV9zdDB4X2RldmljZV9yZXNldChTY3NpX0NtbmQgKlNDcG50KQoreworCXJldHVybiBGQUlMRUQ7Cit9CisKK3N0YXRpYyBpbnQgc2VhZ2F0ZV9zdDB4X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJaWYgKHNob3N0LT5pcnEpCisJCWZyZWVfaXJxKHNob3N0LT5pcnEsIHNob3N0KTsKKwlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgc2hvc3QtPm5faW9fcG9ydCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5kZXRlY3QgICAgICAgICAJPSBzZWFnYXRlX3N0MHhfZGV0ZWN0LAorCS5yZWxlYXNlICAgICAgICAJPSBzZWFnYXRlX3N0MHhfcmVsZWFzZSwKKwkuaW5mbyAgICAgICAgICAgCT0gc2VhZ2F0ZV9zdDB4X2luZm8sCisJLnF1ZXVlY29tbWFuZCAgIAk9IHNlYWdhdGVfc3QweF9xdWV1ZV9jb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gc2VhZ2F0ZV9zdDB4X2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IHNlYWdhdGVfc3QweF9idXNfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IHNlYWdhdGVfc3QweF9ob3N0X3Jlc2V0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9IHNlYWdhdGVfc3QweF9kZXZpY2VfcmVzZXQsCisJLmNhbl9xdWV1ZSAgICAgIAk9IDEsCisJLnRoaXNfaWQgICAgICAgIAk9IDcsCisJLnNnX3RhYmxlc2l6ZSAgIAk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4gICAgCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorfTsKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NlYWdhdGUuaCBiL2RyaXZlcnMvc2NzaS9zZWFnYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5ZThlYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zZWFnYXRlLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqCXNlYWdhdGUuaCBDb3B5cmlnaHQgKEMpIDE5OTIgRHJldyBFY2toYXJkdCAKKyAqCWxvdyBsZXZlbCBzY3NpIGRyaXZlciBoZWFkZXIgZm9yIFNUMDEvU1QwMiBieQorICoJCURyZXcgRWNraGFyZHQgCisgKgorICoJPGRyZXdAY29sb3JhZG8uZWR1PgorICovCisKKyNpZm5kZWYgX1NFQUdBVEVfSAorI2RlZmluZSBTRUFHQVRFX0gKKworc3RhdGljIGludCBzZWFnYXRlX3N0MHhfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK3N0YXRpYyBpbnQgc2VhZ2F0ZV9zdDB4X3F1ZXVlX2NvbW1hbmQoU2NzaV9DbW5kICosIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpOworCitzdGF0aWMgaW50IHNlYWdhdGVfc3QweF9hYm9ydChTY3NpX0NtbmQgKik7CitzdGF0aWMgY29uc3QgY2hhciAqc2VhZ2F0ZV9zdDB4X2luZm8oc3RydWN0IFNjc2lfSG9zdCAqKTsKK3N0YXRpYyBpbnQgc2VhZ2F0ZV9zdDB4X2J1c19yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IHNlYWdhdGVfc3QweF9kZXZpY2VfcmVzZXQoU2NzaV9DbW5kICopOworc3RhdGljIGludCBzZWFnYXRlX3N0MHhfaG9zdF9yZXNldChTY3NpX0NtbmQgKik7CisKKyNlbmRpZiAvKiBfU0VBR0FURV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2cuYyBiL2RyaXZlcnMvc2NzaS9zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNzJkNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2cuYwpAQCAtMCwwICsxLDMwOTIgQEAKKy8qCisgKiAgSGlzdG9yeToKKyAqICBTdGFydGVkOiBBdWcgOSBieSBMYXdyZW5jZSBGb2FyZCAoZW50cm9weUB3b3JsZC5zdGQuY29tKSwKKyAqICAgICAgICAgICB0byBhbGxvdyB1c2VyIHByb2Nlc3MgY29udHJvbCBvZiBTQ1NJIGRldmljZXMuCisgKiAgRGV2ZWxvcG1lbnQgU3BvbnNvcmVkIGJ5IEtpbGx5IENvcnAuIE5ZIE5ZCisgKgorICogT3JpZ2luYWwgZHJpdmVyIChzZy5jKToKKyAqICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTIgTGF3cmVuY2UgRm9hcmQKKyAqIFZlcnNpb24gMiBhbmQgMyBleHRlbnNpb25zIHRvIGRyaXZlcjoKKyAqICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDA1IERvdWdsYXMgR2lsYmVydAorICoKKyAqICBNb2RpZmllZCAgMTktSkFOLTE5OTggIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PiAgRGV2ZnMgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKK3N0YXRpYyBpbnQgc2dfdmVyc2lvbl9udW0gPSAzMDUzMjsJLyogMiBkaWdpdHMgZm9yIGVhY2ggY29tcG9uZW50ICovCisjZGVmaW5lIFNHX1ZFUlNJT05fU1RSICIzLjUuMzIiCisKKy8qCisgKiAgRC4gUC4gR2lsYmVydCAoZGdpbGJlcnRAaW50ZXJsb2cuY29tLCBkb3VnZ0B0cmlvZGUubmV0LmF1KSwgbm90ZXM6CisgKiAgICAgIC0gc2NzaSBsb2dnaW5nIGlzIGF2YWlsYWJsZSB2aWEgU0NTSV9MT0dfVElNRU9VVCBtYWNyb3MuIEZpcnN0CisgKiAgICAgICAgdGhlIGtlcm5lbC9tb2R1bGUgbmVlZHMgdG8gYmUgYnVpbHQgd2l0aCBDT05GSUdfU0NTSV9MT0dHSU5HCisgKiAgICAgICAgKG90aGVyd2lzZSB0aGUgbWFjcm9zIGNvbXBpbGUgdG8gZW1wdHkgc3RhdGVtZW50cykuCisgKgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L210aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KKyNpbmNsdWRlIDxzY3NpL3NnLmg+CisKKyNpbmNsdWRlICJzY3NpX2xvZ2dpbmcuaCIKKworI2lmZGVmIENPTkZJR19TQ1NJX1BST0NfRlMKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CitzdGF0aWMgY2hhciAqc2dfdmVyc2lvbl9kYXRlID0gIjIwMDUwMTE3IjsKKworc3RhdGljIGludCBzZ19wcm9jX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCBzZ19wcm9jX2NsZWFudXAodm9pZCk7CisjZW5kaWYKKworI2lmbmRlZiBMSU5VWF9WRVJTSU9OX0NPREUKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjZW5kaWYJCQkJLyogTElOVVhfVkVSU0lPTl9DT0RFICovCisKKyNkZWZpbmUgU0dfQUxMT1dfRElPX0RFRiAwCisjZGVmaW5lIFNHX0FMTE9XX0RJT19DT0RFIC8qIGNvbXBpbGUgb3V0IGJ5IGNvbW1lbnRpbmcgdGhpcyBkZWZpbmUgKi8KKworI2RlZmluZSBTR19NQVhfREVWUyAzMjc2OAorCisvKgorICogU3VwcG9zZSB5b3Ugd2FudCB0byBjYWxjdWxhdGUgdGhlIGZvcm11bGEgbXVsZGl2KHgsbSxkKT1pbnQoeCAqIG0gLyBkKQorICogVGhlbiB3aGVuIHVzaW5nIDMyIGJpdCBpbnRlZ2VycyB4ICogbSBtYXkgb3ZlcmZsb3cgZHVyaW5nIHRoZSBjYWxjdWxhdGlvbi4KKyAqIFJlcGxhY2luZyBtdWxkaXYoeCkgYnkgbXVsZGl2KHgpPSgoeCAlIGQpICogbSkgLyBkICsgaW50KHggLyBkKSAqIG0KKyAqIGNhbGN1bGF0ZXMgdGhlIHNhbWUsIGJ1dCBwcmV2ZW50cyB0aGUgb3ZlcmZsb3cgd2hlbiBib3RoIG0gYW5kIGQKKyAqIGFyZSAic21hbGwiIG51bWJlcnMgKGxpa2UgSFogYW5kIFVTRVJfSFopLgorICogT2YgY291cnNlIGFuIG92ZXJmbG93IGlzIGluYXZvaWRhYmxlIGlmIHRoZSByZXN1bHQgb2YgbXVsZGl2IGRvZXNuJ3QgZml0CisgKiBpbiAzMiBiaXRzLgorICovCisjZGVmaW5lIE1VTERJVihYLE1VTCxESVYpICgoKChYICUgRElWKSAqIE1VTCkgLyBESVYpICsgKChYIC8gRElWKSAqIE1VTCkpCisKKyNkZWZpbmUgU0dfREVGQVVMVF9USU1FT1VUIE1VTERJVihTR19ERUZBVUxUX1RJTUVPVVRfVVNFUiwgSFosIFVTRVJfSFopCisKK2ludCBzZ19iaWdfYnVmZiA9IFNHX0RFRl9SRVNFUlZFRF9TSVpFOworLyogTi5CLiBUaGlzIHZhcmlhYmxlIGlzIHJlYWRhYmxlIGFuZCB3cml0ZWFibGUgdmlhCisgICAvcHJvYy9zY3NpL3NnL2RlZl9yZXNlcnZlZF9zaXplIC4gRWFjaCB0aW1lIHNnX29wZW4oKSBpcyBjYWxsZWQgYSBidWZmZXIKKyAgIG9mIHRoaXMgc2l6ZSAob3IgbGVzcyBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIG1lbW9yeSkgd2lsbCBiZSByZXNlcnZlZAorICAgZm9yIHVzZSBieSB0aGlzIGZpbGUgZGVzY3JpcHRvci4gW0RlcHJlY2F0ZWQgdXNhZ2U6IHRoaXMgdmFyaWFibGUgaXMgYWxzbworICAgcmVhZGFibGUgdmlhIC9wcm9jL3N5cy9rZXJuZWwvc2ctYmlnLWJ1ZmYgaWYgdGhlIHNnIGRyaXZlciBpcyBidWlsdCBpbnRvCisgICB0aGUga2VybmVsIChpLmUuIGl0IGlzIG5vdCBhIG1vZHVsZSkuXSAqLworc3RhdGljIGludCBkZWZfcmVzZXJ2ZWRfc2l6ZSA9IC0xOwkvKiBwaWNrcyB1cCBpbml0IHBhcmFtZXRlciAqLworc3RhdGljIGludCBzZ19hbGxvd19kaW8gPSBTR19BTExPV19ESU9fREVGOworCisjZGVmaW5lIFNHX1NFQ1RPUl9TWiA1MTIKKyNkZWZpbmUgU0dfU0VDVE9SX01TSyAoU0dfU0VDVE9SX1NaIC0gMSkKKworI2RlZmluZSBTR19ERVZfQVJSX0xVTVAgMzIJLyogYW1vdW50IHRvIG92ZXIgYWxsb2NhdGUgc2dfZGV2X2FyciBieSAqLworCitzdGF0aWMgaW50IHNnX2FkZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICopOworc3RhdGljIHZvaWQgc2dfcmVtb3ZlKHN0cnVjdCBjbGFzc19kZXZpY2UgKik7CisKK3N0YXRpYyBTY3NpX1JlcXVlc3QgKmR1bW15X2NtZHA7CS8qIG9ubHkgdXNlZCBmb3Igc2l6ZW9mICovCisKK3N0YXRpYyBERUZJTkVfUldMT0NLKHNnX2Rldl9hcnJfbG9jayk7CS8qIEFsc28gdXNlZCB0byBsb2NrCisJCQkJCQkJICAgZmlsZSBkZXNjcmlwdG9yIGxpc3QgZm9yIGRldmljZSAqLworCitzdGF0aWMgc3RydWN0IGNsYXNzX2ludGVyZmFjZSBzZ19pbnRlcmZhY2UgPSB7CisJLmFkZAkJPSBzZ19hZGQsCisJLnJlbW92ZQkJPSBzZ19yZW1vdmUsCit9OworCit0eXBlZGVmIHN0cnVjdCBzZ19zY2F0dGVyX2hvbGQgeyAvKiBob2xkaW5nIGFyZWEgZm9yIHNjc2kgc2NhdHRlciBnYXRoZXIgaW5mbyAqLworCXVuc2lnbmVkIHNob3J0IGtfdXNlX3NnOyAvKiBDb3VudCBvZiBrZXJuZWwgc2NhdHRlci1nYXRoZXIgcGllY2VzICovCisJdW5zaWduZWQgc2hvcnQgc2dsaXN0X2xlbjsgLyogc2l6ZSBvZiBtYWxsb2MnZCBzY2F0dGVyLWdhdGhlciBsaXN0ICsrICovCisJdW5zaWduZWQgYnVmZmxlbjsJLyogU2l6ZSBvZiAoYWdncmVnYXRlKSBkYXRhIGJ1ZmZlciAqLworCXVuc2lnbmVkIGJfbWFsbG9jX2xlbjsJLyogYWN0dWFsIGxlbiBtYWxsb2MnZWQgaW4gYnVmZmVyICovCisJdm9pZCAqYnVmZmVyOwkJLyogRGF0YSBidWZmZXIgb3Igc2NhdHRlciBsaXN0IChrX3VzZV9zZz4wKSAqLworCWNoYXIgZGlvX2luX3VzZTsJLyogMC0+aW5kaXJlY3QgSU8gKG9yIG1tYXApLCAxLT5kaW8gKi8KKwl1bnNpZ25lZCBjaGFyIGNtZF9vcGNvZGU7IC8qIGZpcnN0IGJ5dGUgb2YgY29tbWFuZCAqLworfSBTZ19zY2F0dGVyX2hvbGQ7CisKK3N0cnVjdCBzZ19kZXZpY2U7CQkvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworc3RydWN0IHNnX2ZkOworCit0eXBlZGVmIHN0cnVjdCBzZ19yZXF1ZXN0IHsJLyogU0dfTUFYX1FVRVVFIHJlcXVlc3RzIG91dHN0YW5kaW5nIHBlciBmaWxlICovCisJU2NzaV9SZXF1ZXN0ICpteV9jbWRwOwkvKiAhPSAwICB3aGVuIHJlcXVlc3Qgd2l0aCBsb3dlciBsZXZlbHMgKi8KKwlzdHJ1Y3Qgc2dfcmVxdWVzdCAqbmV4dHJwOwkvKiBOVUxMIC0+IHRhaWwgcmVxdWVzdCAoc2xpc3QpICovCisJc3RydWN0IHNnX2ZkICpwYXJlbnRmcDsJLyogTlVMTCAtPiBub3QgaW4gdXNlICovCisJU2dfc2NhdHRlcl9ob2xkIGRhdGE7CS8qIGhvbGQgYnVmZmVyLCBwZXJoYXBzIHNjYXR0ZXIgbGlzdCAqLworCXNnX2lvX2hkcl90IGhlYWRlcjsJLyogc2NzaSBjb21tYW5kK2luZm8sIHNlZSA8c2NzaS9zZy5oPiAqLworCXVuc2lnbmVkIGNoYXIgc2Vuc2VfYltzaXplb2YgKGR1bW15X2NtZHAtPnNyX3NlbnNlX2J1ZmZlcildOworCWNoYXIgcmVzX3VzZWQ7CQkvKiAxIC0+IHVzaW5nIHJlc2VydmUgYnVmZmVyLCAwIC0+IG5vdCAuLi4gKi8KKwljaGFyIG9ycGhhbjsJCS8qIDEgLT4gZHJvcCBvbiBzaWdodCwgMCAtPiBub3JtYWwgKi8KKwljaGFyIHNnX2lvX293bmVkOwkvKiAxIC0+IHBhY2tldCBiZWxvbmdzIHRvIFNHX0lPICovCisJdm9sYXRpbGUgY2hhciBkb25lOwkvKiAwLT5iZWZvcmUgYmgsIDEtPmJlZm9yZSByZWFkLCAyLT5yZWFkICovCit9IFNnX3JlcXVlc3Q7CisKK3R5cGVkZWYgc3RydWN0IHNnX2ZkIHsJCS8qIGhvbGRzIHRoZSBzdGF0ZSBvZiBhIGZpbGUgZGVzY3JpcHRvciAqLworCXN0cnVjdCBzZ19mZCAqbmV4dGZwOwkvKiBOVUxMIHdoZW4gbGFzdCBvcGVuZWQgZmQgb24gdGhpcyBkZXZpY2UgKi8KKwlzdHJ1Y3Qgc2dfZGV2aWNlICpwYXJlbnRkcDsJLyogb3duaW5nIGRldmljZSAqLworCXdhaXRfcXVldWVfaGVhZF90IHJlYWRfd2FpdDsJLyogcXVldWUgcmVhZCB1bnRpbCBjb21tYW5kIGRvbmUgKi8KKwlyd2xvY2tfdCBycV9saXN0X2xvY2s7CS8qIHByb3RlY3QgYWNjZXNzIHRvIGxpc3QgaW4gcmVxX2FyciAqLworCWludCB0aW1lb3V0OwkJLyogZGVmYXVsdHMgdG8gU0dfREVGQVVMVF9USU1FT1VUICAgICAgKi8KKwlpbnQgdGltZW91dF91c2VyOwkvKiBkZWZhdWx0cyB0byBTR19ERUZBVUxUX1RJTUVPVVRfVVNFUiAqLworCVNnX3NjYXR0ZXJfaG9sZCByZXNlcnZlOwkvKiBidWZmZXIgaGVsZCBmb3IgdGhpcyBmaWxlIGRlc2NyaXB0b3IgKi8KKwl1bnNpZ25lZCBzYXZlX3NjYXRfbGVuOwkvKiBvcmlnaW5hbCBsZW5ndGggb2YgdHJ1bmMuIHNjYXQuIGVsZW1lbnQgKi8KKwlTZ19yZXF1ZXN0ICpoZWFkcnA7CS8qIGhlYWQgb2YgcmVxdWVzdCBzbGlzdCwgTlVMTC0+ZW1wdHkgKi8KKwlzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqYXN5bmNfcXA7CS8qIHVzZWQgYnkgYXN5bmNocm9ub3VzIG5vdGlmaWNhdGlvbiAqLworCVNnX3JlcXVlc3QgcmVxX2FycltTR19NQVhfUVVFVUVdOwkvKiB1c2VkIGFzIHNpbmdseS1saW5rZWQgbGlzdCAqLworCWNoYXIgbG93X2RtYTsJCS8qIGFzIGluIHBhcmVudCBidXQgcG9zc2libHkgb3ZlcnJpZGRlbiB0byAxICovCisJY2hhciBmb3JjZV9wYWNraWQ7CS8qIDEgLT4gcGFja19pZCBpbnB1dCB0byByZWFkKCksIDAgLT4gaWdub3JlZCAqLworCXZvbGF0aWxlIGNoYXIgY2xvc2VkOwkvKiAxIC0+IGZkIGNsb3NlZCBidXQgcmVxdWVzdChzKSBvdXRzdGFuZGluZyAqLworCWNoYXIgY21kX3E7CQkvKiAxIC0+IGFsbG93IGNvbW1hbmQgcXVldWluZywgMCAtPiBkb24ndCAqLworCWNoYXIgbmV4dF9jbWRfbGVuOwkvKiAwIC0+IGF1dG9tYXRpYyAoZGVmKSwgPjAgLT4gdXNlIG9uIG5leHQgd3JpdGUoKSAqLworCWNoYXIga2VlcF9vcnBoYW47CS8qIDAgLT4gZHJvcCBvcnBoYW4gKGRlZiksIDEgLT4ga2VlcCBmb3IgcmVhZCgpICovCisJY2hhciBtbWFwX2NhbGxlZDsJLyogMCAtPiBtbWFwKCkgbmV2ZXIgY2FsbGVkIG9uIHRoaXMgZmQgKi8KK30gU2dfZmQ7CisKK3R5cGVkZWYgc3RydWN0IHNnX2RldmljZSB7IC8qIGhvbGRzIHRoZSBzdGF0ZSBvZiBlYWNoIHNjc2kgZ2VuZXJpYyBkZXZpY2UgKi8KKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvX2V4Y2xfd2FpdDsJLyogcXVldWUgb3BlbigpIHdoZW4gT19FWENMIGluIHVzZSAqLworCWludCBzZ190YWJsZXNpemU7CS8qIGFkYXB0ZXIncyBtYXggc2NhdHRlci1nYXRoZXIgdGFibGUgc2l6ZSAqLworCVNnX2ZkICpoZWFkZnA7CQkvKiBmaXJzdCBvcGVuIGZkIGJlbG9uZ2luZyB0byB0aGlzIGRldmljZSAqLworCXZvbGF0aWxlIGNoYXIgZGV0YWNoZWQ7CS8qIDAtPmF0dGFjaGVkLCAxLT5kZXRhY2hlZCBwZW5kaW5nIHJlbW92YWwgKi8KKwl2b2xhdGlsZSBjaGFyIGV4Y2x1ZGU7CS8qIG9wZW5lZCBmb3IgZXhjbHVzaXZlIGFjY2VzcyAqLworCWNoYXIgc2dkZWJ1ZzsJCS8qIDAtPm9mZiwgMS0+c2Vuc2UsIDktPmR1bXAgZGV2LCAxMC0+IGFsbCBkZXZzICovCisJc3RydWN0IGdlbmRpc2sgKmRpc2s7CisJc3RydWN0IGNkZXYgKiBjZGV2OwkvKiBjaGFyX2RldiBbc3lzZnM6IC9zeXMvY2Rldi9tYWpvci9zZzxuPl0gKi8KK30gU2dfZGV2aWNlOworCitzdGF0aWMgaW50IHNnX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgbW9kZSk7CitzdGF0aWMgdm9pZCBzZ19jbWRfZG9uZShTY3NpX0NtbmQgKiBTQ3BudCk7CS8qIHRhc2tsZXQgb3Igc29mdCBpcnEgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgc2dfc3RhcnRfcmVxKFNnX3JlcXVlc3QgKiBzcnApOworc3RhdGljIHZvaWQgc2dfZmluaXNoX3JlbV9yZXEoU2dfcmVxdWVzdCAqIHNycCk7CitzdGF0aWMgaW50IHNnX2J1aWxkX2luZGlyZWN0KFNnX3NjYXR0ZXJfaG9sZCAqIHNjaHAsIFNnX2ZkICogc2ZwLCBpbnQgYnVmZl9zaXplKTsKK3N0YXRpYyBpbnQgc2dfYnVpbGRfc2dhdChTZ19zY2F0dGVyX2hvbGQgKiBzY2hwLCBjb25zdCBTZ19mZCAqIHNmcCwKKwkJCSBpbnQgdGFibGVzaXplKTsKK3N0YXRpYyBzc2l6ZV90IHNnX25ld19yZWFkKFNnX2ZkICogc2ZwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkgICBTZ19yZXF1ZXN0ICogc3JwKTsKK3N0YXRpYyBzc2l6ZV90IHNnX25ld193cml0ZShTZ19mZCAqIHNmcCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJICAgIGludCBibG9ja2luZywgaW50IHJlYWRfb25seSwgU2dfcmVxdWVzdCAqKiBvX3NycCk7CitzdGF0aWMgaW50IHNnX2NvbW1vbl93cml0ZShTZ19mZCAqIHNmcCwgU2dfcmVxdWVzdCAqIHNycCwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKmNtbmQsIGludCB0aW1lb3V0LCBpbnQgYmxvY2tpbmcpOworc3RhdGljIGludCBzZ191X2lvdmVjKHNnX2lvX2hkcl90ICogaHAsIGludCBzZ19udW0sIGludCBpbmQsCisJCSAgICAgIGludCB3cl94ZiwgaW50ICpjb3VudHAsIHVuc2lnbmVkIGNoYXIgX191c2VyICoqdXApOworc3RhdGljIGludCBzZ193cml0ZV94ZmVyKFNnX3JlcXVlc3QgKiBzcnApOworc3RhdGljIGludCBzZ19yZWFkX3hmZXIoU2dfcmVxdWVzdCAqIHNycCk7CitzdGF0aWMgaW50IHNnX3JlYWRfb3hmZXIoU2dfcmVxdWVzdCAqIHNycCwgY2hhciBfX3VzZXIgKm91dHAsIGludCBudW1fcmVhZF94ZmVyKTsKK3N0YXRpYyB2b2lkIHNnX3JlbW92ZV9zY2F0KFNnX3NjYXR0ZXJfaG9sZCAqIHNjaHApOworc3RhdGljIHZvaWQgc2dfYnVpbGRfcmVzZXJ2ZShTZ19mZCAqIHNmcCwgaW50IHJlcV9zaXplKTsKK3N0YXRpYyB2b2lkIHNnX2xpbmtfcmVzZXJ2ZShTZ19mZCAqIHNmcCwgU2dfcmVxdWVzdCAqIHNycCwgaW50IHNpemUpOworc3RhdGljIHZvaWQgc2dfdW5saW5rX3Jlc2VydmUoU2dfZmQgKiBzZnAsIFNnX3JlcXVlc3QgKiBzcnApOworc3RhdGljIGNoYXIgKnNnX3BhZ2VfbWFsbG9jKGludCBycVN6LCBpbnQgbG93RG1hLCBpbnQgKnJldFN6cCk7CitzdGF0aWMgdm9pZCBzZ19wYWdlX2ZyZWUoY2hhciAqYnVmZiwgaW50IHNpemUpOworc3RhdGljIFNnX2ZkICpzZ19hZGRfc2ZwKFNnX2RldmljZSAqIHNkcCwgaW50IGRldik7CitzdGF0aWMgaW50IHNnX3JlbW92ZV9zZnAoU2dfZGV2aWNlICogc2RwLCBTZ19mZCAqIHNmcCk7CitzdGF0aWMgdm9pZCBfX3NnX3JlbW92ZV9zZnAoU2dfZGV2aWNlICogc2RwLCBTZ19mZCAqIHNmcCk7CitzdGF0aWMgU2dfcmVxdWVzdCAqc2dfZ2V0X3JxX21hcmsoU2dfZmQgKiBzZnAsIGludCBwYWNrX2lkKTsKK3N0YXRpYyBTZ19yZXF1ZXN0ICpzZ19hZGRfcmVxdWVzdChTZ19mZCAqIHNmcCk7CitzdGF0aWMgaW50IHNnX3JlbW92ZV9yZXF1ZXN0KFNnX2ZkICogc2ZwLCBTZ19yZXF1ZXN0ICogc3JwKTsKK3N0YXRpYyBpbnQgc2dfcmVzX2luX3VzZShTZ19mZCAqIHNmcCk7CitzdGF0aWMgaW50IHNnX2FsbG93X2FjY2Vzcyh1bnNpZ25lZCBjaGFyIG9wY29kZSwgY2hhciBkZXZfdHlwZSk7CitzdGF0aWMgaW50IHNnX2J1aWxkX2RpcmVjdChTZ19yZXF1ZXN0ICogc3JwLCBTZ19mZCAqIHNmcCwgaW50IGR4ZmVyX2xlbik7CitzdGF0aWMgU2dfZGV2aWNlICpzZ19nZXRfZGV2KGludCBkZXYpOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICpzZ19zY2F0ZzJ2aXJ0KGNvbnN0IHN0cnVjdCBzY2F0dGVybGlzdCAqc2NscCk7CisjaWZkZWYgQ09ORklHX1NDU0lfUFJPQ19GUworc3RhdGljIGludCBzZ19sYXN0X2Rldih2b2lkKTsKKyNlbmRpZgorCitzdGF0aWMgU2dfZGV2aWNlICoqc2dfZGV2X2FyciA9IE5VTEw7CitzdGF0aWMgaW50IHNnX2Rldl9tYXg7CitzdGF0aWMgaW50IHNnX25yX2RldjsKKworI2RlZmluZSBTWl9TR19IRUFERVIgc2l6ZW9mKHN0cnVjdCBzZ19oZWFkZXIpCisjZGVmaW5lIFNaX1NHX0lPX0hEUiBzaXplb2Yoc2dfaW9faGRyX3QpCisjZGVmaW5lIFNaX1NHX0lPVkVDIHNpemVvZihzZ19pb3ZlY190KQorI2RlZmluZSBTWl9TR19SRVFfSU5GTyBzaXplb2Yoc2dfcmVxX2luZm9fdCkKKworc3RhdGljIGludAorc2dfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpbnQgZGV2ID0gaW1pbm9yKGlub2RlKTsKKwlpbnQgZmxhZ3MgPSBmaWxwLT5mX2ZsYWdzOworCVNnX2RldmljZSAqc2RwOworCVNnX2ZkICpzZnA7CisJaW50IHJlczsKKwlpbnQgcmV0dmFsOworCisJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7CisJU0NTSV9MT0dfVElNRU9VVCgzLCBwcmludGsoInNnX29wZW46IGRldj0lZCwgZmxhZ3M9MHgleFxuIiwgZGV2LCBmbGFncykpOworCXNkcCA9IHNnX2dldF9kZXYoZGV2KTsKKwlpZiAoKCFzZHApIHx8ICghc2RwLT5kZXZpY2UpKQorCQlyZXR1cm4gLUVOWElPOworCWlmIChzZHAtPmRldGFjaGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFRoaXMgZHJpdmVyJ3MgbW9kdWxlIGNvdW50IGJ1bXBlZCBieSBmb3BzX2dldCBpbiA8bGludXgvZnMuaD4gKi8KKwkvKiBQcmV2ZW50IHRoZSBkZXZpY2UgZHJpdmVyIGZyb20gdmFuaXNoaW5nIHdoaWxlIHdlIHNsZWVwICovCisJcmV0dmFsID0gc2NzaV9kZXZpY2VfZ2V0KHNkcC0+ZGV2aWNlKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKCEoKGZsYWdzICYgT19OT05CTE9DSykgfHwKKwkgICAgICBzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2luZ19lcnJvcnMoc2RwLT5kZXZpY2UpKSkgeworCQlyZXR2YWwgPSAtRU5YSU87CisJCS8qIHdlIGFyZSBpbiBlcnJvciByZWNvdmVyeSBmb3IgdGhpcyBkZXZpY2UgKi8KKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCisJaWYgKGZsYWdzICYgT19FWENMKSB7CisJCWlmIChPX1JET05MWSA9PSAoZmxhZ3MgJiBPX0FDQ01PREUpKSB7CisJCQlyZXR2YWwgPSAtRVBFUk07IC8qIENhbid0IGxvY2sgaXQgd2l0aCByZWFkIG9ubHkgYWNjZXNzICovCisJCQlnb3RvIGVycm9yX291dDsKKwkJfQorCQlpZiAoc2RwLT5oZWFkZnAgJiYgKGZsYWdzICYgT19OT05CTE9DSykpIHsKKwkJCXJldHZhbCA9IC1FQlVTWTsKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CisJCXJlcyA9IDA7CisJCV9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNkcC0+b19leGNsX3dhaXQsCisJCQkoKHNkcC0+aGVhZGZwIHx8IHNkcC0+ZXhjbHVkZSkgPyAwIDogKHNkcC0+ZXhjbHVkZSA9IDEpKSwgcmVzKTsKKwkJaWYgKHJlcykgeworCQkJcmV0dmFsID0gcmVzOwkvKiAtRVJFU1RBUlRTWVMgYmVjYXVzZSBzaWduYWwgaGl0IHByb2Nlc3MgKi8KKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CisJfSBlbHNlIGlmIChzZHAtPmV4Y2x1ZGUpIHsJLyogc29tZSBvdGhlciBmZCBoYXMgYW4gZXhjbHVzaXZlIGxvY2sgb24gZGV2ICovCisJCWlmIChmbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXJldHZhbCA9IC1FQlVTWTsKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CisJCXJlcyA9IDA7CisJCV9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNkcC0+b19leGNsX3dhaXQsICghc2RwLT5leGNsdWRlKSwKKwkJCQkJICAgcmVzKTsKKwkJaWYgKHJlcykgeworCQkJcmV0dmFsID0gcmVzOwkvKiAtRVJFU1RBUlRTWVMgYmVjYXVzZSBzaWduYWwgaGl0IHByb2Nlc3MgKi8KKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CisJfQorCWlmIChzZHAtPmRldGFjaGVkKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKwlpZiAoIXNkcC0+aGVhZGZwKSB7CS8qIG5vIGV4aXN0aW5nIG9wZW5zIG9uIHRoaXMgZGV2aWNlICovCisJCXNkcC0+c2dkZWJ1ZyA9IDA7CisJCXNkcC0+c2dfdGFibGVzaXplID0gc2RwLT5kZXZpY2UtPmhvc3QtPnNnX3RhYmxlc2l6ZTsKKwl9CisJaWYgKChzZnAgPSBzZ19hZGRfc2ZwKHNkcCwgZGV2KSkpCisJCWZpbHAtPnByaXZhdGVfZGF0YSA9IHNmcDsKKwllbHNlIHsKKwkJaWYgKGZsYWdzICYgT19FWENMKQorCQkJc2RwLT5leGNsdWRlID0gMDsJLyogdW5kbyBpZiBlcnJvciAqLworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX291dDsKKwl9CisJcmV0dXJuIDA7CisKKyAgICAgIGVycm9yX291dDoKKwlzY3NpX2RldmljZV9wdXQoc2RwLT5kZXZpY2UpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIEZvbGxvd2luZyBmdW5jdGlvbiB3YXMgZm9ybWVybHkgY2FsbGVkICdzZ19jbG9zZScgKi8KK3N0YXRpYyBpbnQKK3NnX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJU2dfZGV2aWNlICpzZHA7CisJU2dfZmQgKnNmcDsKKworCWlmICgoIShzZnAgPSAoU2dfZmQgKikgZmlscC0+cHJpdmF0ZV9kYXRhKSkgfHwgKCEoc2RwID0gc2ZwLT5wYXJlbnRkcCkpKQorCQlyZXR1cm4gLUVOWElPOworCVNDU0lfTE9HX1RJTUVPVVQoMywgcHJpbnRrKCJzZ19yZWxlYXNlOiAlc1xuIiwgc2RwLT5kaXNrLT5kaXNrX25hbWUpKTsKKwlzZ19mYXN5bmMoLTEsIGZpbHAsIDApOwkvKiByZW1vdmUgZmlscCBmcm9tIGFzeW5jIG5vdGlmaWNhdGlvbiBsaXN0ICovCisJaWYgKDAgPT0gc2dfcmVtb3ZlX3NmcChzZHAsIHNmcCkpIHsJLyogUmV0dXJucyAxIHdoZW4gc2RwIGdvbmUgKi8KKwkJaWYgKCFzZHAtPmRldGFjaGVkKSB7CisJCQlzY3NpX2RldmljZV9wdXQoc2RwLT5kZXZpY2UpOworCQl9CisJCXNkcC0+ZXhjbHVkZSA9IDA7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2RwLT5vX2V4Y2xfd2FpdCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAorc2dfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCWludCByZXM7CisJU2dfZGV2aWNlICpzZHA7CisJU2dfZmQgKnNmcDsKKwlTZ19yZXF1ZXN0ICpzcnA7CisJaW50IHJlcV9wYWNrX2lkID0gLTE7CisJc3RydWN0IHNnX2hlYWRlciBvbGRfaGRyOworCXNnX2lvX2hkcl90IG5ld19oZHI7CisJc2dfaW9faGRyX3QgKmhwOworCisJaWYgKCghKHNmcCA9IChTZ19mZCAqKSBmaWxwLT5wcml2YXRlX2RhdGEpKSB8fCAoIShzZHAgPSBzZnAtPnBhcmVudGRwKSkpCisJCXJldHVybiAtRU5YSU87CisJU0NTSV9MT0dfVElNRU9VVCgzLCBwcmludGsoInNnX3JlYWQ6ICVzLCBjb3VudD0lZFxuIiwKKwkJCQkgICBzZHAtPmRpc2stPmRpc2tfbmFtZSwgKGludCkgY291bnQpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoc2ZwLT5mb3JjZV9wYWNraWQgJiYgKGNvdW50ID49IFNaX1NHX0hFQURFUikpIHsKKwkJaWYgKF9fY29weV9mcm9tX3VzZXIoJm9sZF9oZHIsIGJ1ZiwgU1pfU0dfSEVBREVSKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAob2xkX2hkci5yZXBseV9sZW4gPCAwKSB7CisJCQlpZiAoY291bnQgPj0gU1pfU0dfSU9fSERSKSB7CisJCQkJaWYgKF9fY29weV9mcm9tX3VzZXIKKwkJCQkgICAgKCZuZXdfaGRyLCBidWYsIFNaX1NHX0lPX0hEUikpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXJlcV9wYWNrX2lkID0gbmV3X2hkci5wYWNrX2lkOworCQkJfQorCQl9IGVsc2UKKwkJCXJlcV9wYWNrX2lkID0gb2xkX2hkci5wYWNrX2lkOworCX0KKwlzcnAgPSBzZ19nZXRfcnFfbWFyayhzZnAsIHJlcV9wYWNrX2lkKTsKKwlpZiAoIXNycCkgewkJLyogbm93IHdhaXQgb24gcGFja2V0IHRvIGFycml2ZSAqLworCQlpZiAoc2RwLT5kZXRhY2hlZCkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJd2hpbGUgKDEpIHsKKwkJCXJlcyA9IDA7CS8qIGZvbGxvd2luZyBpcyBhIG1hY3JvIHRoYXQgYmVhdHMgcmFjZSBjb25kaXRpb24gKi8KKwkJCV9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNmcC0+cmVhZF93YWl0LAorCQkJCShzZHAtPmRldGFjaGVkIHx8IChzcnAgPSBzZ19nZXRfcnFfbWFyayhzZnAsIHJlcV9wYWNrX2lkKSkpLCAKKwkJCQkJCSAgIHJlcyk7CisJCQlpZiAoc2RwLT5kZXRhY2hlZCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCWlmICgwID09IHJlcykKKwkJCQlicmVhazsKKwkJCXJldHVybiByZXM7CS8qIC1FUkVTVEFSVFNZUyBiZWNhdXNlIHNpZ25hbCBoaXQgcHJvY2VzcyAqLworCQl9CisJfQorCWlmIChzcnAtPmhlYWRlci5pbnRlcmZhY2VfaWQgIT0gJ1wwJykKKwkJcmV0dXJuIHNnX25ld19yZWFkKHNmcCwgYnVmLCBjb3VudCwgc3JwKTsKKworCWhwID0gJnNycC0+aGVhZGVyOworCW1lbXNldCgmb2xkX2hkciwgMCwgU1pfU0dfSEVBREVSKTsKKwlvbGRfaGRyLnJlcGx5X2xlbiA9IChpbnQpIGhwLT50aW1lb3V0OworCW9sZF9oZHIucGFja19sZW4gPSBvbGRfaGRyLnJlcGx5X2xlbjsgLyogdmVyeSBvbGQsIHN0cmFuZ2UgYmVoYXZpb3VyICovCisJb2xkX2hkci5wYWNrX2lkID0gaHAtPnBhY2tfaWQ7CisJb2xkX2hkci50d2VsdmVfYnl0ZSA9CisJICAgICgoc3JwLT5kYXRhLmNtZF9vcGNvZGUgPj0gMHhjMCkgJiYgKDEyID09IGhwLT5jbWRfbGVuKSkgPyAxIDogMDsKKwlvbGRfaGRyLnRhcmdldF9zdGF0dXMgPSBocC0+bWFza2VkX3N0YXR1czsKKwlvbGRfaGRyLmhvc3Rfc3RhdHVzID0gaHAtPmhvc3Rfc3RhdHVzOworCW9sZF9oZHIuZHJpdmVyX3N0YXR1cyA9IGhwLT5kcml2ZXJfc3RhdHVzOworCWlmICgoQ0hFQ0tfQ09ORElUSU9OICYgaHAtPm1hc2tlZF9zdGF0dXMpIHx8CisJICAgIChEUklWRVJfU0VOU0UgJiBocC0+ZHJpdmVyX3N0YXR1cykpCisJCW1lbWNweShvbGRfaGRyLnNlbnNlX2J1ZmZlciwgc3JwLT5zZW5zZV9iLAorCQkgICAgICAgc2l6ZW9mIChvbGRfaGRyLnNlbnNlX2J1ZmZlcikpOworCXN3aXRjaCAoaHAtPmhvc3Rfc3RhdHVzKSB7CisJLyogVGhpcyBzZXR1cCBvZiAncmVzdWx0JyBpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhbmQgaXMgYmVzdAorCSAgIGlnbm9yZWQgYnkgdGhlIHVzZXIgd2hvIHNob3VsZCB1c2UgdGFyZ2V0LCBob3N0ICsgZHJpdmVyIHN0YXR1cyAqLworCWNhc2UgRElEX09LOgorCWNhc2UgRElEX1BBU1NUSFJPVUdIOgorCWNhc2UgRElEX1NPRlRfRVJST1I6CisJCW9sZF9oZHIucmVzdWx0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBESURfTk9fQ09OTkVDVDoKKwljYXNlIERJRF9CVVNfQlVTWToKKwljYXNlIERJRF9USU1FX09VVDoKKwkJb2xkX2hkci5yZXN1bHQgPSBFQlVTWTsKKwkJYnJlYWs7CisJY2FzZSBESURfQkFEX1RBUkdFVDoKKwljYXNlIERJRF9BQk9SVDoKKwljYXNlIERJRF9QQVJJVFk6CisJY2FzZSBESURfUkVTRVQ6CisJY2FzZSBESURfQkFEX0lOVFI6CisJCW9sZF9oZHIucmVzdWx0ID0gRUlPOworCQlicmVhazsKKwljYXNlIERJRF9FUlJPUjoKKwkJb2xkX2hkci5yZXN1bHQgPSAoc3JwLT5zZW5zZV9iWzBdID09IDAgJiYgCisJCQkJICBocC0+bWFza2VkX3N0YXR1cyA9PSBHT09EKSA/IDAgOiBFSU87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW9sZF9oZHIucmVzdWx0ID0gRUlPOworCQlicmVhazsKKwl9CisKKwkvKiBOb3cgY29weSB0aGUgcmVzdWx0IGJhY2sgdG8gdGhlIHVzZXIgYnVmZmVyLiAgKi8KKwlpZiAoY291bnQgPj0gU1pfU0dfSEVBREVSKSB7CisJCWlmIChfX2NvcHlfdG9fdXNlcihidWYsICZvbGRfaGRyLCBTWl9TR19IRUFERVIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJ1ZiArPSBTWl9TR19IRUFERVI7CisJCWlmIChjb3VudCA+IG9sZF9oZHIucmVwbHlfbGVuKQorCQkJY291bnQgPSBvbGRfaGRyLnJlcGx5X2xlbjsKKwkJaWYgKGNvdW50ID4gU1pfU0dfSEVBREVSKSB7CisJCQlpZiAoKHJlcyA9CisJCQkgICAgIHNnX3JlYWRfb3hmZXIoc3JwLCBidWYsIGNvdW50IC0gU1pfU0dfSEVBREVSKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9IGVsc2UKKwkJY291bnQgPSAob2xkX2hkci5yZXN1bHQgPT0gMCkgPyAwIDogLUVJTzsKKwlzZ19maW5pc2hfcmVtX3JlcShzcnApOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK3NnX25ld19yZWFkKFNnX2ZkICogc2ZwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIFNnX3JlcXVlc3QgKiBzcnApCit7CisJc2dfaW9faGRyX3QgKmhwID0gJnNycC0+aGVhZGVyOworCWludCBlcnIgPSAwOworCWludCBsZW47CisKKwlpZiAoY291bnQgPCBTWl9TR19JT19IRFIpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnJfb3V0OworCX0KKwlocC0+c2JfbGVuX3dyID0gMDsKKwlpZiAoKGhwLT5teF9zYl9sZW4gPiAwKSAmJiBocC0+c2JwKSB7CisJCWlmICgoQ0hFQ0tfQ09ORElUSU9OICYgaHAtPm1hc2tlZF9zdGF0dXMpIHx8CisJCSAgICAoRFJJVkVSX1NFTlNFICYgaHAtPmRyaXZlcl9zdGF0dXMpKSB7CisJCQlpbnQgc2JfbGVuID0gc2l6ZW9mIChkdW1teV9jbWRwLT5zcl9zZW5zZV9idWZmZXIpOworCQkJc2JfbGVuID0gKGhwLT5teF9zYl9sZW4gPiBzYl9sZW4pID8gc2JfbGVuIDogaHAtPm14X3NiX2xlbjsKKwkJCWxlbiA9IDggKyAoaW50KSBzcnAtPnNlbnNlX2JbN107CS8qIEFkZGl0aW9uYWwgc2Vuc2UgbGVuZ3RoIGZpZWxkICovCisJCQlsZW4gPSAobGVuID4gc2JfbGVuKSA/IHNiX2xlbiA6IGxlbjsKKwkJCWlmIChjb3B5X3RvX3VzZXIoaHAtPnNicCwgc3JwLT5zZW5zZV9iLCBsZW4pKSB7CisJCQkJZXJyID0gLUVGQVVMVDsKKwkJCQlnb3RvIGVycl9vdXQ7CisJCQl9CisJCQlocC0+c2JfbGVuX3dyID0gbGVuOworCQl9CisJfQorCWlmIChocC0+bWFza2VkX3N0YXR1cyB8fCBocC0+aG9zdF9zdGF0dXMgfHwgaHAtPmRyaXZlcl9zdGF0dXMpCisJCWhwLT5pbmZvIHw9IFNHX0lORk9fQ0hFQ0s7CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIGhwLCBTWl9TR19JT19IRFIpKSB7CisJCWVyciA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyX291dDsKKwl9CisJZXJyID0gc2dfcmVhZF94ZmVyKHNycCk7CisgICAgICBlcnJfb3V0OgorCXNnX2ZpbmlzaF9yZW1fcmVxKHNycCk7CisJcmV0dXJuICgwID09IGVycikgPyBjb3VudCA6IGVycjsKK30KKworc3RhdGljIHNzaXplX3QKK3NnX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJaW50IG14c2l6ZSwgY21kX3NpemUsIGs7CisJaW50IGlucHV0X3NpemUsIGJsb2NraW5nOworCXVuc2lnbmVkIGNoYXIgb3Bjb2RlOworCVNnX2RldmljZSAqc2RwOworCVNnX2ZkICpzZnA7CisJU2dfcmVxdWVzdCAqc3JwOworCXN0cnVjdCBzZ19oZWFkZXIgb2xkX2hkcjsKKwlzZ19pb19oZHJfdCAqaHA7CisJdW5zaWduZWQgY2hhciBjbW5kW3NpemVvZiAoZHVtbXlfY21kcC0+c3JfY21uZCldOworCisJaWYgKCghKHNmcCA9IChTZ19mZCAqKSBmaWxwLT5wcml2YXRlX2RhdGEpKSB8fCAoIShzZHAgPSBzZnAtPnBhcmVudGRwKSkpCisJCXJldHVybiAtRU5YSU87CisJU0NTSV9MT0dfVElNRU9VVCgzLCBwcmludGsoInNnX3dyaXRlOiAlcywgY291bnQ9JWRcbiIsCisJCQkJICAgc2RwLT5kaXNrLT5kaXNrX25hbWUsIChpbnQpIGNvdW50KSk7CisJaWYgKHNkcC0+ZGV0YWNoZWQpCisJCXJldHVybiAtRU5PREVWOworCWlmICghKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwKKwkgICAgICBzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2luZ19lcnJvcnMoc2RwLT5kZXZpY2UpKSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWYsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CS8qIHByb3RlY3RzIGZvbGxvd2luZyBjb3B5X2Zyb21fdXNlcigpcyArIGdldF91c2VyKClzICovCisJaWYgKGNvdW50IDwgU1pfU0dfSEVBREVSKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAoX19jb3B5X2Zyb21fdXNlcigmb2xkX2hkciwgYnVmLCBTWl9TR19IRUFERVIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlibG9ja2luZyA9ICEoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWlmIChvbGRfaGRyLnJlcGx5X2xlbiA8IDApCisJCXJldHVybiBzZ19uZXdfd3JpdGUoc2ZwLCBidWYsIGNvdW50LCBibG9ja2luZywgMCwgTlVMTCk7CisJaWYgKGNvdW50IDwgKFNaX1NHX0hFQURFUiArIDYpKQorCQlyZXR1cm4gLUVJTzsJLyogVGhlIG1pbmltdW0gc2NzaSBjb21tYW5kIGxlbmd0aCBpcyA2IGJ5dGVzLiAqLworCisJaWYgKCEoc3JwID0gc2dfYWRkX3JlcXVlc3Qoc2ZwKSkpIHsKKwkJU0NTSV9MT0dfVElNRU9VVCgxLCBwcmludGsoInNnX3dyaXRlOiBxdWV1ZSBmdWxsXG4iKSk7CisJCXJldHVybiAtRURPTTsKKwl9CisJYnVmICs9IFNaX1NHX0hFQURFUjsKKwlfX2dldF91c2VyKG9wY29kZSwgYnVmKTsKKwlpZiAoc2ZwLT5uZXh0X2NtZF9sZW4gPiAwKSB7CisJCWlmIChzZnAtPm5leHRfY21kX2xlbiA+IE1BWF9DT01NQU5EX1NJWkUpIHsKKwkJCVNDU0lfTE9HX1RJTUVPVVQoMSwgcHJpbnRrKCJzZ193cml0ZTogY29tbWFuZCBsZW5ndGggdG9vIGxvbmdcbiIpKTsKKwkJCXNmcC0+bmV4dF9jbWRfbGVuID0gMDsKKwkJCXNnX3JlbW92ZV9yZXF1ZXN0KHNmcCwgc3JwKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWNtZF9zaXplID0gc2ZwLT5uZXh0X2NtZF9sZW47CisJCXNmcC0+bmV4dF9jbWRfbGVuID0gMDsJLyogcmVzZXQgc28gb25seSB0aGlzIHdyaXRlKCkgZWZmZWN0ZWQgKi8KKwl9IGVsc2UgeworCQljbWRfc2l6ZSA9IENPTU1BTkRfU0laRShvcGNvZGUpOwkvKiBiYXNlZCBvbiBTQ1NJIGNvbW1hbmQgZ3JvdXAgKi8KKwkJaWYgKChvcGNvZGUgPj0gMHhjMCkgJiYgb2xkX2hkci50d2VsdmVfYnl0ZSkKKwkJCWNtZF9zaXplID0gMTI7CisJfQorCVNDU0lfTE9HX1RJTUVPVVQoNCwgcHJpbnRrKAorCQkic2dfd3JpdGU6ICAgc2NzaSBvcGNvZGU9MHglMDJ4LCBjbWRfc2l6ZT0lZFxuIiwgKGludCkgb3Bjb2RlLCBjbWRfc2l6ZSkpOworLyogRGV0ZXJtaW5lIGJ1ZmZlciBzaXplLiAgKi8KKwlpbnB1dF9zaXplID0gY291bnQgLSBjbWRfc2l6ZTsKKwlteHNpemUgPSAoaW5wdXRfc2l6ZSA+IG9sZF9oZHIucmVwbHlfbGVuKSA/IGlucHV0X3NpemUgOiBvbGRfaGRyLnJlcGx5X2xlbjsKKwlteHNpemUgLT0gU1pfU0dfSEVBREVSOworCWlucHV0X3NpemUgLT0gU1pfU0dfSEVBREVSOworCWlmIChpbnB1dF9zaXplIDwgMCkgeworCQlzZ19yZW1vdmVfcmVxdWVzdChzZnAsIHNycCk7CisJCXJldHVybiAtRUlPOwkvKiBVc2VyIGRpZCBub3QgcGFzcyBlbm91Z2ggYnl0ZXMgZm9yIHRoaXMgY29tbWFuZC4gKi8KKwl9CisJaHAgPSAmc3JwLT5oZWFkZXI7CisJaHAtPmludGVyZmFjZV9pZCA9ICdcMCc7CS8qIGluZGljYXRvciBvZiBvbGQgaW50ZXJmYWNlIHR1bm5lbGxlZCAqLworCWhwLT5jbWRfbGVuID0gKHVuc2lnbmVkIGNoYXIpIGNtZF9zaXplOworCWhwLT5pb3ZlY19jb3VudCA9IDA7CisJaHAtPm14X3NiX2xlbiA9IDA7CisJaWYgKGlucHV0X3NpemUgPiAwKQorCQlocC0+ZHhmZXJfZGlyZWN0aW9uID0gKG9sZF9oZHIucmVwbHlfbGVuID4gU1pfU0dfSEVBREVSKSA/CisJCSAgICBTR19EWEZFUl9UT19GUk9NX0RFViA6IFNHX0RYRkVSX1RPX0RFVjsKKwllbHNlCisJCWhwLT5keGZlcl9kaXJlY3Rpb24gPSAobXhzaXplID4gMCkgPyBTR19EWEZFUl9GUk9NX0RFViA6IFNHX0RYRkVSX05PTkU7CisJaHAtPmR4ZmVyX2xlbiA9IG14c2l6ZTsKKwlocC0+ZHhmZXJwID0gKGNoYXIgX191c2VyICopYnVmICsgY21kX3NpemU7CisJaHAtPnNicCA9IE5VTEw7CisJaHAtPnRpbWVvdXQgPSBvbGRfaGRyLnJlcGx5X2xlbjsJLyogc3RydWN0dXJlIGFidXNlIC4uLiAqLworCWhwLT5mbGFncyA9IGlucHV0X3NpemU7CS8qIHN0cnVjdHVyZSBhYnVzZSAuLi4gKi8KKwlocC0+cGFja19pZCA9IG9sZF9oZHIucGFja19pZDsKKwlocC0+dXNyX3B0ciA9IE5VTEw7CisJaWYgKF9fY29weV9mcm9tX3VzZXIoY21uZCwgYnVmLCBjbWRfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCS8qCisJICogU0dfRFhGRVJfVE9fRlJPTV9ERVYgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gU0dfRFhGRVJfRlJPTV9ERVYsCisJICogYnV0IGlzIGlzIHBvc3NpYmxlIHRoYXQgdGhlIGFwcCBpbnRlbmRlZCBTR19EWEZFUl9UT19ERVYsIGJlY2F1c2UgdGhlcmUKKwkgKiBpcyBhIG5vbi16ZXJvIGlucHV0X3NpemUsIHNvIGVtaXQgYSB3YXJuaW5nLgorCSAqLworCWlmIChocC0+ZHhmZXJfZGlyZWN0aW9uID09IFNHX0RYRkVSX1RPX0ZST01fREVWKQorCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJzZ193cml0ZTogZGF0YSBpbi9vdXQgJWQvJWQgYnl0ZXMgZm9yIFNDU0kgY29tbWFuZCAweCV4LS0iCisJCQkgICAgICAgImd1ZXNzaW5nIGRhdGEgaW47XG4iIEtFUk5fV0FSTklORyAiICAgIgorCQkJICAgICAgICJwcm9ncmFtICVzIG5vdCBzZXR0aW5nIGNvdW50IGFuZC9vciByZXBseV9sZW4gcHJvcGVybHlcbiIsCisJCQkgICAgICAgb2xkX2hkci5yZXBseV9sZW4gLSAoaW50KVNaX1NHX0hFQURFUiwKKwkJCSAgICAgICBpbnB1dF9zaXplLCAodW5zaWduZWQgaW50KSBjbW5kWzBdLAorCQkJICAgICAgIGN1cnJlbnQtPmNvbW0pOworCWsgPSBzZ19jb21tb25fd3JpdGUoc2ZwLCBzcnAsIGNtbmQsIHNmcC0+dGltZW91dCwgYmxvY2tpbmcpOworCXJldHVybiAoayA8IDApID8gayA6IGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAorc2dfbmV3X3dyaXRlKFNnX2ZkICogc2ZwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJICAgICBpbnQgYmxvY2tpbmcsIGludCByZWFkX29ubHksIFNnX3JlcXVlc3QgKiogb19zcnApCit7CisJaW50IGs7CisJU2dfcmVxdWVzdCAqc3JwOworCXNnX2lvX2hkcl90ICpocDsKKwl1bnNpZ25lZCBjaGFyIGNtbmRbc2l6ZW9mIChkdW1teV9jbWRwLT5zcl9jbW5kKV07CisJaW50IHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyB1bF90aW1lb3V0OworCisJaWYgKGNvdW50IDwgU1pfU0dfSU9fSERSKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOyAvKiBwcm90ZWN0cyBmb2xsb3dpbmcgY29weV9mcm9tX3VzZXIoKXMgKyBnZXRfdXNlcigpcyAqLworCisJc2ZwLT5jbWRfcSA9IDE7CS8qIHdoZW4gc2dfaW9faGRyIHNlZW4sIHNldCBjb21tYW5kIHF1ZXVpbmcgb24gKi8KKwlpZiAoIShzcnAgPSBzZ19hZGRfcmVxdWVzdChzZnApKSkgeworCQlTQ1NJX0xPR19USU1FT1VUKDEsIHByaW50aygic2dfbmV3X3dyaXRlOiBxdWV1ZSBmdWxsXG4iKSk7CisJCXJldHVybiAtRURPTTsKKwl9CisJaHAgPSAmc3JwLT5oZWFkZXI7CisJaWYgKF9fY29weV9mcm9tX3VzZXIoaHAsIGJ1ZiwgU1pfU0dfSU9fSERSKSkgeworCQlzZ19yZW1vdmVfcmVxdWVzdChzZnAsIHNycCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlpZiAoaHAtPmludGVyZmFjZV9pZCAhPSAnUycpIHsKKwkJc2dfcmVtb3ZlX3JlcXVlc3Qoc2ZwLCBzcnApOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisJaWYgKGhwLT5mbGFncyAmIFNHX0ZMQUdfTU1BUF9JTykgeworCQlpZiAoaHAtPmR4ZmVyX2xlbiA+IHNmcC0+cmVzZXJ2ZS5idWZmbGVuKSB7CisJCQlzZ19yZW1vdmVfcmVxdWVzdChzZnAsIHNycCk7CisJCQlyZXR1cm4gLUVOT01FTTsJLyogTU1BUF9JTyBzaXplIG11c3QgZml0IGluIHJlc2VydmUgYnVmZmVyICovCisJCX0KKwkJaWYgKGhwLT5mbGFncyAmIFNHX0ZMQUdfRElSRUNUX0lPKSB7CisJCQlzZ19yZW1vdmVfcmVxdWVzdChzZnAsIHNycCk7CisJCQlyZXR1cm4gLUVJTlZBTDsJLyogZWl0aGVyIE1NQVBfSU8gb3IgRElSRUNUX0lPIChub3QgYm90aCkgKi8KKwkJfQorCQlpZiAoc2dfcmVzX2luX3VzZShzZnApKSB7CisJCQlzZ19yZW1vdmVfcmVxdWVzdChzZnAsIHNycCk7CisJCQlyZXR1cm4gLUVCVVNZOwkvKiByZXNlcnZlIGJ1ZmZlciBhbHJlYWR5IGJlaW5nIHVzZWQgKi8KKwkJfQorCX0KKwl1bF90aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhzcnAtPmhlYWRlci50aW1lb3V0KTsKKwl0aW1lb3V0ID0gKHVsX3RpbWVvdXQgPCBJTlRfTUFYKSA/IHVsX3RpbWVvdXQgOiBJTlRfTUFYOworCWlmICgoIWhwLT5jbWRwKSB8fCAoaHAtPmNtZF9sZW4gPCA2KSB8fCAoaHAtPmNtZF9sZW4gPiBzaXplb2YgKGNtbmQpKSkgeworCQlzZ19yZW1vdmVfcmVxdWVzdChzZnAsIHNycCk7CisJCXJldHVybiAtRU1TR1NJWkU7CisJfQorCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBocC0+Y21kcCwgaHAtPmNtZF9sZW4pKSB7CisJCXNnX3JlbW92ZV9yZXF1ZXN0KHNmcCwgc3JwKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CS8qIHByb3RlY3RzIGZvbGxvd2luZyBjb3B5X2Zyb21fdXNlcigpcyArIGdldF91c2VyKClzICovCisJfQorCWlmIChfX2NvcHlfZnJvbV91c2VyKGNtbmQsIGhwLT5jbWRwLCBocC0+Y21kX2xlbikpIHsKKwkJc2dfcmVtb3ZlX3JlcXVlc3Qoc2ZwLCBzcnApOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKHJlYWRfb25seSAmJgorCSAgICAoIXNnX2FsbG93X2FjY2VzcyhjbW5kWzBdLCBzZnAtPnBhcmVudGRwLT5kZXZpY2UtPnR5cGUpKSkgeworCQlzZ19yZW1vdmVfcmVxdWVzdChzZnAsIHNycCk7CisJCXJldHVybiAtRVBFUk07CisJfQorCWsgPSBzZ19jb21tb25fd3JpdGUoc2ZwLCBzcnAsIGNtbmQsIHRpbWVvdXQsIGJsb2NraW5nKTsKKwlpZiAoayA8IDApCisJCXJldHVybiBrOworCWlmIChvX3NycCkKKwkJKm9fc3JwID0gc3JwOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludAorc2dfY29tbW9uX3dyaXRlKFNnX2ZkICogc2ZwLCBTZ19yZXF1ZXN0ICogc3JwLAorCQl1bnNpZ25lZCBjaGFyICpjbW5kLCBpbnQgdGltZW91dCwgaW50IGJsb2NraW5nKQoreworCWludCBrOworCVNjc2lfUmVxdWVzdCAqU1JwbnQ7CisJU2dfZGV2aWNlICpzZHAgPSBzZnAtPnBhcmVudGRwOworCXNnX2lvX2hkcl90ICpocCA9ICZzcnAtPmhlYWRlcjsKKwlyZXF1ZXN0X3F1ZXVlX3QgKnE7CisKKwlzcnAtPmRhdGEuY21kX29wY29kZSA9IGNtbmRbMF07CS8qIGhvbGQgb3Bjb2RlIG9mIGNvbW1hbmQgKi8KKwlocC0+c3RhdHVzID0gMDsKKwlocC0+bWFza2VkX3N0YXR1cyA9IDA7CisJaHAtPm1zZ19zdGF0dXMgPSAwOworCWhwLT5pbmZvID0gMDsKKwlocC0+aG9zdF9zdGF0dXMgPSAwOworCWhwLT5kcml2ZXJfc3RhdHVzID0gMDsKKwlocC0+cmVzaWQgPSAwOworCVNDU0lfTE9HX1RJTUVPVVQoNCwgcHJpbnRrKCJzZ19jb21tb25fd3JpdGU6ICBzY3NpIG9wY29kZT0weCUwMngsIGNtZF9zaXplPSVkXG4iLAorCQkJICAoaW50KSBjbW5kWzBdLCAoaW50KSBocC0+Y21kX2xlbikpOworCisJaWYgKChrID0gc2dfc3RhcnRfcmVxKHNycCkpKSB7CisJCVNDU0lfTE9HX1RJTUVPVVQoMSwgcHJpbnRrKCJzZ193cml0ZTogc3RhcnRfcmVxIGVycj0lZFxuIiwgaykpOworCQlzZ19maW5pc2hfcmVtX3JlcShzcnApOworCQlyZXR1cm4gazsJLyogcHJvYmFibHkgb3V0IG9mIHNwYWNlIC0tPiBFTk9NRU0gKi8KKwl9CisJaWYgKChrID0gc2dfd3JpdGVfeGZlcihzcnApKSkgeworCQlTQ1NJX0xPR19USU1FT1VUKDEsIHByaW50aygic2dfd3JpdGU6IHdyaXRlX3hmZXIsIGJhZCBhZGRyZXNzXG4iKSk7CisJCXNnX2ZpbmlzaF9yZW1fcmVxKHNycCk7CisJCXJldHVybiBrOworCX0KKwlpZiAoc2RwLT5kZXRhY2hlZCkgeworCQlzZ19maW5pc2hfcmVtX3JlcShzcnApOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJU1JwbnQgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc2RwLT5kZXZpY2UsIEdGUF9BVE9NSUMpOworCWlmIChTUnBudCA9PSBOVUxMKSB7CisJCVNDU0lfTE9HX1RJTUVPVVQoMSwgcHJpbnRrKCJzZ193cml0ZTogbm8gbWVtXG4iKSk7CisJCXNnX2ZpbmlzaF9yZW1fcmVxKHNycCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNycC0+bXlfY21kcCA9IFNScG50OworCXEgPSBTUnBudC0+c3JfZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlOworCVNScG50LT5zcl9yZXF1ZXN0LT5ycV9kaXNrID0gc2RwLT5kaXNrOworCVNScG50LT5zcl9zZW5zZV9idWZmZXJbMF0gPSAwOworCVNScG50LT5zcl9jbWRfbGVuID0gaHAtPmNtZF9sZW47CisJU1JwbnQtPnNyX3VzZV9zZyA9IHNycC0+ZGF0YS5rX3VzZV9zZzsKKwlTUnBudC0+c3Jfc2dsaXN0X2xlbiA9IHNycC0+ZGF0YS5zZ2xpc3RfbGVuOworCVNScG50LT5zcl9idWZmbGVuID0gc3JwLT5kYXRhLmJ1ZmZsZW47CisJU1JwbnQtPnNyX3VuZGVyZmxvdyA9IDA7CisJU1JwbnQtPnNyX2J1ZmZlciA9IHNycC0+ZGF0YS5idWZmZXI7CisJc3dpdGNoIChocC0+ZHhmZXJfZGlyZWN0aW9uKSB7CisJY2FzZSBTR19EWEZFUl9UT19GUk9NX0RFVjoKKwljYXNlIFNHX0RYRkVSX0ZST01fREVWOgorCQlTUnBudC0+c3JfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfUkVBRDsKKwkJYnJlYWs7CisJY2FzZSBTR19EWEZFUl9UT19ERVY6CisJCVNScG50LT5zcl9kYXRhX2RpcmVjdGlvbiA9IFNDU0lfREFUQV9XUklURTsKKwkJYnJlYWs7CisJY2FzZSBTR19EWEZFUl9VTktOT1dOOgorCQlTUnBudC0+c3JfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfVU5LTk9XTjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJU1JwbnQtPnNyX2RhdGFfZGlyZWN0aW9uID0gU0NTSV9EQVRBX05PTkU7CisJCWJyZWFrOworCX0KKwlTUnBudC0+dXBwZXJfcHJpdmF0ZV9kYXRhID0gc3JwOworCXNycC0+ZGF0YS5rX3VzZV9zZyA9IDA7CisJc3JwLT5kYXRhLnNnbGlzdF9sZW4gPSAwOworCXNycC0+ZGF0YS5idWZmbGVuID0gMDsKKwlzcnAtPmRhdGEuYnVmZmVyID0gTlVMTDsKKwlocC0+ZHVyYXRpb24gPSBqaWZmaWVzOwkvKiB1bml0IGppZmZpZXMgbm93LCBtaWxsaXNlY3MgYWZ0ZXIgZG9uZSAqLworLyogTm93IHNlbmQgZXZlcnl0aGluZyBvZiB0byBtaWQtbGV2ZWwuIFRoZSBuZXh0IHRpbWUgd2UgaGVhciBhYm91dCB0aGlzCisgICBwYWNrZXQgaXMgd2hlbiBzZ19jbWRfZG9uZSgpIGlzIGNhbGxlZCAoaS5lLiBhIGNhbGxiYWNrKS4gKi8KKwlzY3NpX2RvX3JlcShTUnBudCwgKHZvaWQgKikgY21uZCwKKwkJICAgICh2b2lkICopIFNScG50LT5zcl9idWZmZXIsIGhwLT5keGZlcl9sZW4sCisJCSAgICBzZ19jbWRfZG9uZSwgdGltZW91dCwgU0dfREVGQVVMVF9SRVRSSUVTKTsKKwkvKiBkeGZlcl9sZW4gb3ZlcndyaXRlcyBTUnBudC0+c3JfYnVmZmxlbiwgaGVuY2UgbmVlZCBmb3IgYl9tYWxsb2NfbGVuICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NnX3NycF9kb25lKFNnX3JlcXVlc3QgKnNycCwgU2dfZmQgKnNmcCkKK3sKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKwlpbnQgZG9uZTsKKworCXJlYWRfbG9ja19pcnFzYXZlKCZzZnAtPnJxX2xpc3RfbG9jaywgaWZsYWdzKTsKKwlkb25lID0gc3JwLT5kb25lOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCXJldHVybiBkb25lOworfQorCitzdGF0aWMgaW50CitzZ19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkgdW5zaWduZWQgaW50IGNtZF9pbiwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKnAgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqaXAgPSBwOworCWludCByZXN1bHQsIHZhbCwgcmVhZF9vbmx5OworCVNnX2RldmljZSAqc2RwOworCVNnX2ZkICpzZnA7CisJU2dfcmVxdWVzdCAqc3JwOworCXVuc2lnbmVkIGxvbmcgaWZsYWdzOworCisJaWYgKCghKHNmcCA9IChTZ19mZCAqKSBmaWxwLT5wcml2YXRlX2RhdGEpKSB8fCAoIShzZHAgPSBzZnAtPnBhcmVudGRwKSkpCisJCXJldHVybiAtRU5YSU87CisJU0NTSV9MT0dfVElNRU9VVCgzLCBwcmludGsoInNnX2lvY3RsOiAlcywgY21kPTB4JXhcbiIsCisJCQkJICAgc2RwLT5kaXNrLT5kaXNrX25hbWUsIChpbnQpIGNtZF9pbikpOworCXJlYWRfb25seSA9IChPX1JEV1IgIT0gKGZpbHAtPmZfZmxhZ3MgJiBPX0FDQ01PREUpKTsKKworCXN3aXRjaCAoY21kX2luKSB7CisJY2FzZSBTR19JTzoKKwkJeworCQkJaW50IGJsb2NraW5nID0gMTsJLyogaWdub3JlIE9fTk9OQkxPQ0sgZmxhZyAqLworCisJCQlpZiAoc2RwLT5kZXRhY2hlZCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCWlmICghc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKHNkcC0+ZGV2aWNlKSkKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBwLCBTWl9TR19JT19IRFIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmVzdWx0ID0KKwkJCSAgICBzZ19uZXdfd3JpdGUoc2ZwLCBwLCBTWl9TR19JT19IRFIsCisJCQkJCSBibG9ja2luZywgcmVhZF9vbmx5LCAmc3JwKTsKKwkJCWlmIChyZXN1bHQgPCAwKQorCQkJCXJldHVybiByZXN1bHQ7CisJCQlzcnAtPnNnX2lvX293bmVkID0gMTsKKwkJCXdoaWxlICgxKSB7CisJCQkJcmVzdWx0ID0gMDsJLyogZm9sbG93aW5nIG1hY3JvIHRvIGJlYXQgcmFjZSBjb25kaXRpb24gKi8KKwkJCQlfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzZnAtPnJlYWRfd2FpdCwKKwkJCQkJKHNkcC0+ZGV0YWNoZWQgfHwgc2ZwLT5jbG9zZWQgfHwgc2dfc3JwX2RvbmUoc3JwLCBzZnApKSwKKwkJCQkJCQkgICByZXN1bHQpOworCQkJCWlmIChzZHAtPmRldGFjaGVkKQorCQkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCQlpZiAoc2ZwLT5jbG9zZWQpCisJCQkJCXJldHVybiAwOwkvKiByZXF1ZXN0IHBhY2tldCBkcm9wcGVkIGFscmVhZHkgKi8KKwkJCQlpZiAoMCA9PSByZXN1bHQpCisJCQkJCWJyZWFrOworCQkJCXNycC0+b3JwaGFuID0gMTsKKwkJCQlyZXR1cm4gcmVzdWx0OwkvKiAtRVJFU1RBUlRTWVMgYmVjYXVzZSBzaWduYWwgaGl0IHByb2Nlc3MgKi8KKwkJCX0KKwkJCXdyaXRlX2xvY2tfaXJxc2F2ZSgmc2ZwLT5ycV9saXN0X2xvY2ssIGlmbGFncyk7CisJCQlzcnAtPmRvbmUgPSAyOworCQkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCQkJcmVzdWx0ID0gc2dfbmV3X3JlYWQoc2ZwLCBwLCBTWl9TR19JT19IRFIsIHNycCk7CisJCQlyZXR1cm4gKHJlc3VsdCA8IDApID8gcmVzdWx0IDogMDsKKwkJfQorCWNhc2UgU0dfU0VUX1RJTUVPVVQ6CisJCXJlc3VsdCA9IGdldF91c2VyKHZhbCwgaXApOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJaWYgKHZhbCA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKHZhbCA+PSBNVUxESVYgKElOVF9NQVgsIFVTRVJfSFosIEhaKSkKKwkJICAgIHZhbCA9IE1VTERJViAoSU5UX01BWCwgVVNFUl9IWiwgSFopOworCQlzZnAtPnRpbWVvdXRfdXNlciA9IHZhbDsKKwkJc2ZwLT50aW1lb3V0ID0gTVVMRElWICh2YWwsIEhaLCBVU0VSX0haKTsKKworCQlyZXR1cm4gMDsKKwljYXNlIFNHX0dFVF9USU1FT1VUOgkvKiBOLkIuIFVzZXIgcmVjZWl2ZXMgdGltZW91dCBhcyByZXR1cm4gdmFsdWUgKi8KKwkJCQkvKiBzdHJhbmdlIC4uLiwgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKwkJcmV0dXJuIHNmcC0+dGltZW91dF91c2VyOworCWNhc2UgU0dfU0VUX0ZPUkNFX0xPV19ETUE6CisJCXJlc3VsdCA9IGdldF91c2VyKHZhbCwgaXApOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJaWYgKHZhbCkgeworCQkJc2ZwLT5sb3dfZG1hID0gMTsKKwkJCWlmICgoMCA9PSBzZnAtPmxvd19kbWEpICYmICgwID09IHNnX3Jlc19pbl91c2Uoc2ZwKSkpIHsKKwkJCQl2YWwgPSAoaW50KSBzZnAtPnJlc2VydmUuYnVmZmxlbjsKKwkJCQlzZ19yZW1vdmVfc2NhdCgmc2ZwLT5yZXNlcnZlKTsKKwkJCQlzZ19idWlsZF9yZXNlcnZlKHNmcCwgdmFsKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChzZHAtPmRldGFjaGVkKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJc2ZwLT5sb3dfZG1hID0gc2RwLT5kZXZpY2UtPmhvc3QtPnVuY2hlY2tlZF9pc2FfZG1hOworCQl9CisJCXJldHVybiAwOworCWNhc2UgU0dfR0VUX0xPV19ETUE6CisJCXJldHVybiBwdXRfdXNlcigoaW50KSBzZnAtPmxvd19kbWEsIGlwKTsKKwljYXNlIFNHX0dFVF9TQ1NJX0lEOgorCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHAsIHNpemVvZiAoc2dfc2NzaV9pZF90KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZWxzZSB7CisJCQlzZ19zY3NpX2lkX3QgX191c2VyICpzZ19pZHAgPSBwOworCisJCQlpZiAoc2RwLT5kZXRhY2hlZCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCV9fcHV0X3VzZXIoKGludCkgc2RwLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8sCisJCQkJICAgJnNnX2lkcC0+aG9zdF9ubyk7CisJCQlfX3B1dF91c2VyKChpbnQpIHNkcC0+ZGV2aWNlLT5jaGFubmVsLAorCQkJCSAgICZzZ19pZHAtPmNoYW5uZWwpOworCQkJX19wdXRfdXNlcigoaW50KSBzZHAtPmRldmljZS0+aWQsICZzZ19pZHAtPnNjc2lfaWQpOworCQkJX19wdXRfdXNlcigoaW50KSBzZHAtPmRldmljZS0+bHVuLCAmc2dfaWRwLT5sdW4pOworCQkJX19wdXRfdXNlcigoaW50KSBzZHAtPmRldmljZS0+dHlwZSwgJnNnX2lkcC0+c2NzaV90eXBlKTsKKwkJCV9fcHV0X3VzZXIoKHNob3J0KSBzZHAtPmRldmljZS0+aG9zdC0+Y21kX3Blcl9sdW4sCisJCQkJICAgJnNnX2lkcC0+aF9jbWRfcGVyX2x1bik7CisJCQlfX3B1dF91c2VyKChzaG9ydCkgc2RwLT5kZXZpY2UtPnF1ZXVlX2RlcHRoLAorCQkJCSAgICZzZ19pZHAtPmRfcXVldWVfZGVwdGgpOworCQkJX19wdXRfdXNlcigwLCAmc2dfaWRwLT51bnVzZWRbMF0pOworCQkJX19wdXRfdXNlcigwLCAmc2dfaWRwLT51bnVzZWRbMV0pOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIFNHX1NFVF9GT1JDRV9QQUNLX0lEOgorCQlyZXN1bHQgPSBnZXRfdXNlcih2YWwsIGlwKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJCXNmcC0+Zm9yY2VfcGFja2lkID0gdmFsID8gMSA6IDA7CisJCXJldHVybiAwOworCWNhc2UgU0dfR0VUX1BBQ0tfSUQ6CisJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgaXAsIHNpemVvZiAoaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmVhZF9sb2NrX2lycXNhdmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCQlmb3IgKHNycCA9IHNmcC0+aGVhZHJwOyBzcnA7IHNycCA9IHNycC0+bmV4dHJwKSB7CisJCQlpZiAoKDEgPT0gc3JwLT5kb25lKSAmJiAoIXNycC0+c2dfaW9fb3duZWQpKSB7CisJCQkJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmc2ZwLT5ycV9saXN0X2xvY2ssCisJCQkJCQkgICAgICAgaWZsYWdzKTsKKwkJCQlfX3B1dF91c2VyKHNycC0+aGVhZGVyLnBhY2tfaWQsIGlwKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZzZnAtPnJxX2xpc3RfbG9jaywgaWZsYWdzKTsKKwkJX19wdXRfdXNlcigtMSwgaXApOworCQlyZXR1cm4gMDsKKwljYXNlIFNHX0dFVF9OVU1fV0FJVElORzoKKwkJcmVhZF9sb2NrX2lycXNhdmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCQlmb3IgKHZhbCA9IDAsIHNycCA9IHNmcC0+aGVhZHJwOyBzcnA7IHNycCA9IHNycC0+bmV4dHJwKSB7CisJCQlpZiAoKDEgPT0gc3JwLT5kb25lKSAmJiAoIXNycC0+c2dfaW9fb3duZWQpKQorCQkJCSsrdmFsOworCQl9CisJCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBpcCk7CisJY2FzZSBTR19HRVRfU0dfVEFCTEVTSVpFOgorCQlyZXR1cm4gcHV0X3VzZXIoc2RwLT5zZ190YWJsZXNpemUsIGlwKTsKKwljYXNlIFNHX1NFVF9SRVNFUlZFRF9TSVpFOgorCQlyZXN1bHQgPSBnZXRfdXNlcih2YWwsIGlwKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgaWYgKHZhbCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHZhbCAhPSBzZnAtPnJlc2VydmUuYnVmZmxlbikgeworCQkJaWYgKHNnX3Jlc19pbl91c2Uoc2ZwKSB8fCBzZnAtPm1tYXBfY2FsbGVkKQorCQkJCXJldHVybiAtRUJVU1k7CisJCQlzZ19yZW1vdmVfc2NhdCgmc2ZwLT5yZXNlcnZlKTsKKwkJCXNnX2J1aWxkX3Jlc2VydmUoc2ZwLCB2YWwpOworCQl9CisJCXJldHVybiAwOworCWNhc2UgU0dfR0VUX1JFU0VSVkVEX1NJWkU6CisJCXZhbCA9IChpbnQpIHNmcC0+cmVzZXJ2ZS5idWZmbGVuOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBpcCk7CisJY2FzZSBTR19TRVRfQ09NTUFORF9ROgorCQlyZXN1bHQgPSBnZXRfdXNlcih2YWwsIGlwKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJCXNmcC0+Y21kX3EgPSB2YWwgPyAxIDogMDsKKwkJcmV0dXJuIDA7CisJY2FzZSBTR19HRVRfQ09NTUFORF9ROgorCQlyZXR1cm4gcHV0X3VzZXIoKGludCkgc2ZwLT5jbWRfcSwgaXApOworCWNhc2UgU0dfU0VUX0tFRVBfT1JQSEFOOgorCQlyZXN1bHQgPSBnZXRfdXNlcih2YWwsIGlwKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJCXNmcC0+a2VlcF9vcnBoYW4gPSB2YWw7CisJCXJldHVybiAwOworCWNhc2UgU0dfR0VUX0tFRVBfT1JQSEFOOgorCQlyZXR1cm4gcHV0X3VzZXIoKGludCkgc2ZwLT5rZWVwX29ycGhhbiwgaXApOworCWNhc2UgU0dfTkVYVF9DTURfTEVOOgorCQlyZXN1bHQgPSBnZXRfdXNlcih2YWwsIGlwKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJCXNmcC0+bmV4dF9jbWRfbGVuID0gKHZhbCA+IDApID8gdmFsIDogMDsKKwkJcmV0dXJuIDA7CisJY2FzZSBTR19HRVRfVkVSU0lPTl9OVU06CisJCXJldHVybiBwdXRfdXNlcihzZ192ZXJzaW9uX251bSwgaXApOworCWNhc2UgU0dfR0VUX0FDQ0VTU19DT1VOVDoKKwkJLyogZmFrZWQgLSB3ZSBkb24ndCBoYXZlIGEgcmVhbCBhY2Nlc3MgY291bnQgYW55bW9yZSAqLworCQl2YWwgPSAoc2RwLT5kZXZpY2UgPyAxIDogMCk7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIGlwKTsKKwljYXNlIFNHX0dFVF9SRVFVRVNUX1RBQkxFOgorCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHAsIFNaX1NHX1JFUV9JTkZPICogU0dfTUFYX1FVRVVFKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQllbHNlIHsKKwkJCXNnX3JlcV9pbmZvX3QgcmluZm9bU0dfTUFYX1FVRVVFXTsKKwkJCVNnX3JlcXVlc3QgKnNycDsKKwkJCXJlYWRfbG9ja19pcnFzYXZlKCZzZnAtPnJxX2xpc3RfbG9jaywgaWZsYWdzKTsKKwkJCWZvciAoc3JwID0gc2ZwLT5oZWFkcnAsIHZhbCA9IDA7IHZhbCA8IFNHX01BWF9RVUVVRTsKKwkJCSAgICAgKyt2YWwsIHNycCA9IHNycCA/IHNycC0+bmV4dHJwIDogc3JwKSB7CisJCQkJbWVtc2V0KCZyaW5mb1t2YWxdLCAwLCBTWl9TR19SRVFfSU5GTyk7CisJCQkJaWYgKHNycCkgeworCQkJCQlyaW5mb1t2YWxdLnJlcV9zdGF0ZSA9IHNycC0+ZG9uZSArIDE7CisJCQkJCXJpbmZvW3ZhbF0ucHJvYmxlbSA9CisJCQkJCSAgICBzcnAtPmhlYWRlci5tYXNrZWRfc3RhdHVzICYgCisJCQkJCSAgICBzcnAtPmhlYWRlci5ob3N0X3N0YXR1cyAmIAorCQkJCQkgICAgc3JwLT5oZWFkZXIuZHJpdmVyX3N0YXR1czsKKwkJCQkJcmluZm9bdmFsXS5kdXJhdGlvbiA9CisJCQkJCSAgICBzcnAtPmRvbmUgPyBzcnAtPmhlYWRlci5kdXJhdGlvbiA6CisJCQkJCSAgICBqaWZmaWVzX3RvX21zZWNzKAorCQkJCQkJamlmZmllcyAtIHNycC0+aGVhZGVyLmR1cmF0aW9uKTsKKwkJCQkJcmluZm9bdmFsXS5vcnBoYW4gPSBzcnAtPm9ycGhhbjsKKwkJCQkJcmluZm9bdmFsXS5zZ19pb19vd25lZCA9IHNycC0+c2dfaW9fb3duZWQ7CisJCQkJCXJpbmZvW3ZhbF0ucGFja19pZCA9IHNycC0+aGVhZGVyLnBhY2tfaWQ7CisJCQkJCXJpbmZvW3ZhbF0udXNyX3B0ciA9IHNycC0+aGVhZGVyLnVzcl9wdHI7CisJCQkJfQorCQkJfQorCQkJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmc2ZwLT5ycV9saXN0X2xvY2ssIGlmbGFncyk7CisJCQlyZXR1cm4gKF9fY29weV90b191c2VyKHAsIHJpbmZvLAorCQkJICAgICAgICBTWl9TR19SRVFfSU5GTyAqIFNHX01BWF9RVUVVRSkgPyAtRUZBVUxUIDogMCk7CisJCX0KKwljYXNlIFNHX0VNVUxBVEVEX0hPU1Q6CisJCWlmIChzZHAtPmRldGFjaGVkKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiBwdXRfdXNlcihzZHAtPmRldmljZS0+aG9zdC0+aG9zdHQtPmVtdWxhdGVkLCBpcCk7CisJY2FzZSBTR19TQ1NJX1JFU0VUOgorCQlpZiAoc2RwLT5kZXRhY2hlZCkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCWlmICh0ZXN0X2JpdChTSE9TVF9SRUNPVkVSWSwKKwkJCQkgICAgICZzZHAtPmRldmljZS0+aG9zdC0+c2hvc3Rfc3RhdGUpKQorCQkJCXJldHVybiAtRUJVU1k7CisJCX0gZWxzZSBpZiAoIXNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhzZHAtPmRldmljZSkpCisJCQlyZXR1cm4gLUVCVVNZOworCQlyZXN1bHQgPSBnZXRfdXNlcih2YWwsIGlwKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJCWlmIChTR19TQ1NJX1JFU0VUX05PVEhJTkcgPT0gdmFsKQorCQkJcmV0dXJuIDA7CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgU0dfU0NTSV9SRVNFVF9ERVZJQ0U6CisJCQl2YWwgPSBTQ1NJX1RSWV9SRVNFVF9ERVZJQ0U7CisJCQlicmVhazsKKwkJY2FzZSBTR19TQ1NJX1JFU0VUX0JVUzoKKwkJCXZhbCA9IFNDU0lfVFJZX1JFU0VUX0JVUzsKKwkJCWJyZWFrOworCQljYXNlIFNHX1NDU0lfUkVTRVRfSE9TVDoKKwkJCXZhbCA9IFNDU0lfVFJZX1JFU0VUX0hPU1Q7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlyZXR1cm4gKHNjc2lfcmVzZXRfcHJvdmlkZXIoc2RwLT5kZXZpY2UsIHZhbCkgPT0KKwkJCVNVQ0NFU1MpID8gMCA6IC1FSU87CisJY2FzZSBTQ1NJX0lPQ1RMX1NFTkRfQ09NTUFORDoKKwkJaWYgKHNkcC0+ZGV0YWNoZWQpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJaWYgKHJlYWRfb25seSkgeworCQkJdW5zaWduZWQgY2hhciBvcGNvZGUgPSBXUklURV82OworCQkJU2NzaV9Jb2N0bF9Db21tYW5kIF9fdXNlciAqc2lvY3AgPSBwOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJm9wY29kZSwgc2lvY3AtPmRhdGEsIDEpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKCFzZ19hbGxvd19hY2Nlc3Mob3Bjb2RlLCBzZHAtPmRldmljZS0+dHlwZSkpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCQlyZXR1cm4gc2NzaV9pb2N0bF9zZW5kX2NvbW1hbmQoc2RwLT5kZXZpY2UsIHApOworCWNhc2UgU0dfU0VUX0RFQlVHOgorCQlyZXN1bHQgPSBnZXRfdXNlcih2YWwsIGlwKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJCXNkcC0+c2dkZWJ1ZyA9IChjaGFyKSB2YWw7CisJCXJldHVybiAwOworCWNhc2UgU0NTSV9JT0NUTF9HRVRfSURMVU46CisJY2FzZSBTQ1NJX0lPQ1RMX0dFVF9CVVNfTlVNQkVSOgorCWNhc2UgU0NTSV9JT0NUTF9QUk9CRV9IT1NUOgorCWNhc2UgU0dfR0VUX1RSQU5TRk9STToKKwkJaWYgKHNkcC0+ZGV0YWNoZWQpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuIHNjc2lfaW9jdGwoc2RwLT5kZXZpY2UsIGNtZF9pbiwgcCk7CisJZGVmYXVsdDoKKwkJaWYgKHJlYWRfb25seSkKKwkJCXJldHVybiAtRVBFUk07CS8qIGRvbid0IGtub3cgc28gdGFrZSBzYWZlIGFwcHJvYWNoICovCisJCXJldHVybiBzY3NpX2lvY3RsKHNkcC0+ZGV2aWNlLCBjbWRfaW4sIHApOworCX0KK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nIHNnX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZF9pbiwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJU2dfZGV2aWNlICpzZHA7CisJU2dfZmQgKnNmcDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisKKwlpZiAoKCEoc2ZwID0gKFNnX2ZkICopIGZpbHAtPnByaXZhdGVfZGF0YSkpIHx8ICghKHNkcCA9IHNmcC0+cGFyZW50ZHApKSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXNkZXYgPSBzZHAtPmRldmljZTsKKwlpZiAoc2Rldi0+aG9zdC0+aG9zdHQtPmNvbXBhdF9pb2N0bCkgeyAKKwkJaW50IHJldDsKKworCQlyZXQgPSBzZGV2LT5ob3N0LT5ob3N0dC0+Y29tcGF0X2lvY3RsKHNkZXYsIGNtZF9pbiwgKHZvaWQgX191c2VyICopYXJnKTsKKworCQlyZXR1cm4gcmV0OworCX0KKwkKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3NnX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHBvbGxfdGFibGUgKiB3YWl0KQoreworCXVuc2lnbmVkIGludCByZXMgPSAwOworCVNnX2RldmljZSAqc2RwOworCVNnX2ZkICpzZnA7CisJU2dfcmVxdWVzdCAqc3JwOworCWludCBjb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CisKKwlpZiAoKCEoc2ZwID0gKFNnX2ZkICopIGZpbHAtPnByaXZhdGVfZGF0YSkpIHx8ICghKHNkcCA9IHNmcC0+cGFyZW50ZHApKQorCSAgICB8fCBzZnAtPmNsb3NlZCkKKwkJcmV0dXJuIFBPTExFUlI7CisJcG9sbF93YWl0KGZpbHAsICZzZnAtPnJlYWRfd2FpdCwgd2FpdCk7CisJcmVhZF9sb2NrX2lycXNhdmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCWZvciAoc3JwID0gc2ZwLT5oZWFkcnA7IHNycDsgc3JwID0gc3JwLT5uZXh0cnApIHsKKwkJLyogaWYgYW55IHJlYWQgd2FpdGluZywgZmxhZyBpdCAqLworCQlpZiAoKDAgPT0gcmVzKSAmJiAoMSA9PSBzcnAtPmRvbmUpICYmICghc3JwLT5zZ19pb19vd25lZCkpCisJCQlyZXMgPSBQT0xMSU4gfCBQT0xMUkROT1JNOworCQkrK2NvdW50OworCX0KKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZzZnAtPnJxX2xpc3RfbG9jaywgaWZsYWdzKTsKKworCWlmIChzZHAtPmRldGFjaGVkKQorCQlyZXMgfD0gUE9MTEhVUDsKKwllbHNlIGlmICghc2ZwLT5jbWRfcSkgeworCQlpZiAoMCA9PSBjb3VudCkKKwkJCXJlcyB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwl9IGVsc2UgaWYgKGNvdW50IDwgU0dfTUFYX1FVRVVFKQorCQlyZXMgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJU0NTSV9MT0dfVElNRU9VVCgzLCBwcmludGsoInNnX3BvbGw6ICVzLCByZXM9MHgleFxuIiwKKwkJCQkgICBzZHAtPmRpc2stPmRpc2tfbmFtZSwgKGludCkgcmVzKSk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludAorc2dfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBtb2RlKQoreworCWludCByZXR2YWw7CisJU2dfZGV2aWNlICpzZHA7CisJU2dfZmQgKnNmcDsKKworCWlmICgoIShzZnAgPSAoU2dfZmQgKikgZmlscC0+cHJpdmF0ZV9kYXRhKSkgfHwgKCEoc2RwID0gc2ZwLT5wYXJlbnRkcCkpKQorCQlyZXR1cm4gLUVOWElPOworCVNDU0lfTE9HX1RJTUVPVVQoMywgcHJpbnRrKCJzZ19mYXN5bmM6ICVzLCBtb2RlPSVkXG4iLAorCQkJCSAgIHNkcC0+ZGlzay0+ZGlza19uYW1lLCBtb2RlKSk7CisKKwlyZXR2YWwgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxwLCBtb2RlLCAmc2ZwLT5hc3luY19xcCk7CisJcmV0dXJuIChyZXR2YWwgPCAwKSA/IHJldHZhbCA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqCitzZ19zY2F0ZzJ2aXJ0KGNvbnN0IHN0cnVjdCBzY2F0dGVybGlzdCAqc2NscCkKK3sKKwlyZXR1cm4gKHNjbHAgJiYgc2NscC0+cGFnZSkgPworCSAgICAodW5zaWduZWQgY2hhciAqKSBwYWdlX2FkZHJlc3Moc2NscC0+cGFnZSkgKyBzY2xwLT5vZmZzZXQgOiBOVUxMOworfQorCisvKiBXaGVuIHN0YXJ0RmluaXNoPT0xIGluY3JlbWVudHMgcGFnZSBjb3VudHMgZm9yIHBhZ2VzIG90aGVyIHRoYW4gdGhlIAorICAgZmlyc3Qgb2Ygc2NhdHRlciBnYXRoZXIgZWxlbWVudHMgb2J0YWluZWQgZnJvbSBfX2dldF9mcmVlX3BhZ2VzKCkuCisgICBXaGVuIHN0YXJ0RmluaXNoPT0wIGRlY3JlbWVudHMgLi4uICovCitzdGF0aWMgdm9pZAorc2dfcmJfY29ycmVjdDRtbWFwKFNnX3NjYXR0ZXJfaG9sZCAqIHJzdl9zY2hwLCBpbnQgc3RhcnRGaW5pc2gpCit7CisJdm9pZCAqcGFnZV9wdHI7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IGssIG07CisKKwlTQ1NJX0xPR19USU1FT1VUKDMsIHByaW50aygic2dfcmJfY29ycmVjdDRtbWFwOiBzdGFydEZpbmlzaD0lZCwgc2NhdGc9JWRcbiIsIAorCQkJCSAgIHN0YXJ0RmluaXNoLCByc3Zfc2NocC0+a191c2Vfc2cpKTsKKwkvKiBOLkIuIGNvcnJlY3Rpb24gX25vdF8gYXBwbGllZCB0byBiYXNlIHBhZ2Ugb2YgZWFjaCBhbGxvY2F0aW9uICovCisJaWYgKHJzdl9zY2hwLT5rX3VzZV9zZykgewkvKiByZXNlcnZlIGJ1ZmZlciBpcyBhIHNjYXR0ZXIgZ2F0aGVyIGxpc3QgKi8KKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzY2xwID0gcnN2X3NjaHAtPmJ1ZmZlcjsKKworCQlmb3IgKGsgPSAwOyBrIDwgcnN2X3NjaHAtPmtfdXNlX3NnOyArK2ssICsrc2NscCkgeworCQkJZm9yIChtID0gUEFHRV9TSVpFOyBtIDwgc2NscC0+bGVuZ3RoOyBtICs9IFBBR0VfU0laRSkgeworCQkJCXBhZ2VfcHRyID0gc2dfc2NhdGcydmlydChzY2xwKSArIG07CisJCQkJcGFnZSA9IHZpcnRfdG9fcGFnZShwYWdlX3B0cik7CisJCQkJaWYgKHN0YXJ0RmluaXNoKQorCQkJCQlnZXRfcGFnZShwYWdlKTsKKwkJCQllbHNlIHsKKwkJCQkJaWYgKHBhZ2VfY291bnQocGFnZSkgPiAwKQorCQkJCQkJX19wdXRfcGFnZShwYWdlKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgewkJLyogcmVzZXJ2ZSBidWZmZXIgaXMganVzdCBhIHNpbmdsZSBhbGxvY2F0aW9uICovCisJCWZvciAobSA9IFBBR0VfU0laRTsgbSA8IHJzdl9zY2hwLT5idWZmbGVuOyBtICs9IFBBR0VfU0laRSkgeworCQkJcGFnZV9wdHIgPSAodW5zaWduZWQgY2hhciAqKSByc3Zfc2NocC0+YnVmZmVyICsgbTsKKwkJCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UocGFnZV9wdHIpOworCQkJaWYgKHN0YXJ0RmluaXNoKQorCQkJCWdldF9wYWdlKHBhZ2UpOworCQkJZWxzZSB7CisJCQkJaWYgKHBhZ2VfY291bnQocGFnZSkgPiAwKQorCQkJCQlfX3B1dF9wYWdlKHBhZ2UpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKgorc2dfdm1hX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgKnR5cGUpCit7CisJU2dfZmQgKnNmcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5PUEFHRV9TSUdCVVM7CisJdm9pZCAqcGFnZV9wdHIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCVNnX3NjYXR0ZXJfaG9sZCAqcnN2X3NjaHA7CisKKwlpZiAoKE5VTEwgPT0gdm1hKSB8fCAoIShzZnAgPSAoU2dfZmQgKikgdm1hLT52bV9wcml2YXRlX2RhdGEpKSkKKwkJcmV0dXJuIHBhZ2U7CisJcnN2X3NjaHAgPSAmc2ZwLT5yZXNlcnZlOworCW9mZnNldCA9IGFkZHIgLSB2bWEtPnZtX3N0YXJ0OworCWlmIChvZmZzZXQgPj0gcnN2X3NjaHAtPmJ1ZmZsZW4pCisJCXJldHVybiBwYWdlOworCVNDU0lfTE9HX1RJTUVPVVQoMywgcHJpbnRrKCJzZ192bWFfbm9wYWdlOiBvZmZzZXQ9JWx1LCBzY2F0Zz0lZFxuIiwKKwkJCQkgICBvZmZzZXQsIHJzdl9zY2hwLT5rX3VzZV9zZykpOworCWlmIChyc3Zfc2NocC0+a191c2Vfc2cpIHsJLyogcmVzZXJ2ZSBidWZmZXIgaXMgYSBzY2F0dGVyIGdhdGhlciBsaXN0ICovCisJCWludCBrOworCQl1bnNpZ25lZCBsb25nIHNhID0gdm1hLT52bV9zdGFydDsKKwkJdW5zaWduZWQgbG9uZyBsZW47CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2NscCA9IHJzdl9zY2hwLT5idWZmZXI7CisKKwkJZm9yIChrID0gMDsgKGsgPCByc3Zfc2NocC0+a191c2Vfc2cpICYmIChzYSA8IHZtYS0+dm1fZW5kKTsKKwkJICAgICArK2ssICsrc2NscCkgeworCQkJbGVuID0gdm1hLT52bV9lbmQgLSBzYTsKKwkJCWxlbiA9IChsZW4gPCBzY2xwLT5sZW5ndGgpID8gbGVuIDogc2NscC0+bGVuZ3RoOworCQkJaWYgKG9mZnNldCA8IGxlbikgeworCQkJCXBhZ2VfcHRyID0gc2dfc2NhdGcydmlydChzY2xwKSArIG9mZnNldDsKKwkJCQlwYWdlID0gdmlydF90b19wYWdlKHBhZ2VfcHRyKTsKKwkJCQlnZXRfcGFnZShwYWdlKTsJLyogaW5jcmVtZW50IHBhZ2UgY291bnQgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJCXNhICs9IGxlbjsKKwkJCW9mZnNldCAtPSBsZW47CisJCX0KKwl9IGVsc2UgewkJLyogcmVzZXJ2ZSBidWZmZXIgaXMganVzdCBhIHNpbmdsZSBhbGxvY2F0aW9uICovCisJCXBhZ2VfcHRyID0gKHVuc2lnbmVkIGNoYXIgKikgcnN2X3NjaHAtPmJ1ZmZlciArIG9mZnNldDsKKwkJcGFnZSA9IHZpcnRfdG9fcGFnZShwYWdlX3B0cik7CisJCWdldF9wYWdlKHBhZ2UpOwkvKiBpbmNyZW1lbnQgcGFnZSBjb3VudCAqLworCX0KKwlpZiAodHlwZSkKKwkJKnR5cGUgPSBWTV9GQVVMVF9NSU5PUjsKKwlyZXR1cm4gcGFnZTsKK30KKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzZ19tbWFwX3ZtX29wcyA9IHsKKwkubm9wYWdlID0gc2dfdm1hX25vcGFnZSwKK307CisKK3N0YXRpYyBpbnQKK3NnX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCVNnX2ZkICpzZnA7CisJdW5zaWduZWQgbG9uZyByZXFfc3ogPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJU2dfc2NhdHRlcl9ob2xkICpyc3Zfc2NocDsKKworCWlmICgoIWZpbHApIHx8ICghdm1hKSB8fCAoIShzZnAgPSAoU2dfZmQgKikgZmlscC0+cHJpdmF0ZV9kYXRhKSkpCisJCXJldHVybiAtRU5YSU87CisJU0NTSV9MT0dfVElNRU9VVCgzLCBwcmludGsoInNnX21tYXAgc3RhcnRpbmcsIHZtX3N0YXJ0PSVwLCBsZW49JWRcbiIsCisJCQkJICAgKHZvaWQgKikgdm1hLT52bV9zdGFydCwgKGludCkgcmVxX3N6KSk7CisJaWYgKHZtYS0+dm1fcGdvZmYpCisJCXJldHVybiAtRUlOVkFMOwkvKiB3YW50IG5vIG9mZnNldCAqLworCXJzdl9zY2hwID0gJnNmcC0+cmVzZXJ2ZTsKKwlpZiAocmVxX3N6ID4gcnN2X3NjaHAtPmJ1ZmZsZW4pCisJCXJldHVybiAtRU5PTUVNOwkvKiBjYW5ub3QgbWFwIG1vcmUgdGhhbiByZXNlcnZlZCBidWZmZXIgKi8KKworCWlmIChyc3Zfc2NocC0+a191c2Vfc2cpIHsgLyogcmVzZXJ2ZSBidWZmZXIgaXMgYSBzY2F0dGVyIGdhdGhlciBsaXN0ICovCisJCWludCBrOworCQl1bnNpZ25lZCBsb25nIHNhID0gdm1hLT52bV9zdGFydDsKKwkJdW5zaWduZWQgbG9uZyBsZW47CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2NscCA9IHJzdl9zY2hwLT5idWZmZXI7CisKKwkJZm9yIChrID0gMDsgKGsgPCByc3Zfc2NocC0+a191c2Vfc2cpICYmIChzYSA8IHZtYS0+dm1fZW5kKTsKKwkJICAgICArK2ssICsrc2NscCkgeworCQkJaWYgKDAgIT0gc2NscC0+b2Zmc2V0KQorCQkJCXJldHVybiAtRUZBVUxUOwkvKiBub24gcGFnZSBhbGlnbmVkIG1lbW9yeSA/PyAqLworCQkJbGVuID0gdm1hLT52bV9lbmQgLSBzYTsKKwkJCWxlbiA9IChsZW4gPCBzY2xwLT5sZW5ndGgpID8gbGVuIDogc2NscC0+bGVuZ3RoOworCQkJc2EgKz0gbGVuOworCQl9CisJfSBlbHNlIHsJLyogcmVzZXJ2ZSBidWZmZXIgaXMganVzdCBhIHNpbmdsZSBhbGxvY2F0aW9uICovCisJCWlmICgodW5zaWduZWQgbG9uZykgcnN2X3NjaHAtPmJ1ZmZlciAmIChQQUdFX1NJWkUgLSAxKSkKKwkJCXJldHVybiAtRUZBVUxUOwkvKiBub24gcGFnZSBhbGlnbmVkIG1lbW9yeSA/PyAqLworCX0KKwlpZiAoMCA9PSBzZnAtPm1tYXBfY2FsbGVkKSB7CisJCXNnX3JiX2NvcnJlY3Q0bW1hcChyc3Zfc2NocCwgMSk7CS8qIGRvIG9ubHkgb25jZSBwZXIgZmQgbGlmZXRpbWUgKi8KKwkJc2ZwLT5tbWFwX2NhbGxlZCA9IDE7CisJfQorCXZtYS0+dm1fZmxhZ3MgfD0gKFZNX1JFU0VSVkVEIHwgVk1fSU8pOworCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gc2ZwOworCXZtYS0+dm1fb3BzID0gJnNnX21tYXBfdm1fb3BzOworCXJldHVybiAwOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGEgImJvdHRvbSBoYWxmIiBoYW5kbGVyIHRoYXQgaXMgY2FsbGVkIGJ5IHRoZQorICogbWlkIGxldmVsIHdoZW4gYSBjb21tYW5kIGlzIGNvbXBsZXRlZCAob3IgaGFzIGZhaWxlZCkuICovCitzdGF0aWMgdm9pZAorc2dfY21kX2RvbmUoU2NzaV9DbW5kICogU0NwbnQpCit7CisJU2NzaV9SZXF1ZXN0ICpTUnBudCA9IE5VTEw7CisJU2dfZGV2aWNlICpzZHAgPSBOVUxMOworCVNnX2ZkICpzZnA7CisJU2dfcmVxdWVzdCAqc3JwID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKworCWlmIChTQ3BudCAmJiAoU1JwbnQgPSBTQ3BudC0+c2NfcmVxdWVzdCkpCisJCXNycCA9IChTZ19yZXF1ZXN0ICopIFNScG50LT51cHBlcl9wcml2YXRlX2RhdGE7CisJaWYgKE5VTEwgPT0gc3JwKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2dfY21kX2RvbmU6IE5VTEwgcmVxdWVzdFxuIik7CisJCWlmIChTUnBudCkKKwkJCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwkJcmV0dXJuOworCX0KKwlzZnAgPSBzcnAtPnBhcmVudGZwOworCWlmIChzZnApCisJCXNkcCA9IHNmcC0+cGFyZW50ZHA7CisJaWYgKChOVUxMID09IHNkcCkgfHwgc2RwLT5kZXRhY2hlZCkgeworCQlwcmludGsoS0VSTl9JTkZPICJzZ19jbWRfZG9uZTogZGV2aWNlIGRldGFjaGVkXG4iKTsKKwkJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCQlyZXR1cm47CisJfQorCisJLyogRmlyc3QgdHJhbnNmZXIgb3duZXJzaGlwIG9mIGRhdGEgYnVmZmVycyB0byBzZ19kZXZpY2Ugb2JqZWN0LiAqLworCXNycC0+ZGF0YS5rX3VzZV9zZyA9IFNScG50LT5zcl91c2Vfc2c7CisJc3JwLT5kYXRhLnNnbGlzdF9sZW4gPSBTUnBudC0+c3Jfc2dsaXN0X2xlbjsKKwlzcnAtPmRhdGEuYnVmZmxlbiA9IFNScG50LT5zcl9idWZmbGVuOworCXNycC0+ZGF0YS5idWZmZXIgPSBTUnBudC0+c3JfYnVmZmVyOworCS8qIG5vdyBjbGVhciBvdXQgcmVxdWVzdCBzdHJ1Y3R1cmUgKi8KKwlTUnBudC0+c3JfdXNlX3NnID0gMDsKKwlTUnBudC0+c3Jfc2dsaXN0X2xlbiA9IDA7CisJU1JwbnQtPnNyX2J1ZmZsZW4gPSAwOworCVNScG50LT5zcl9idWZmZXIgPSBOVUxMOworCVNScG50LT5zcl91bmRlcmZsb3cgPSAwOworCVNScG50LT5zcl9yZXF1ZXN0LT5ycV9kaXNrID0gTlVMTDsgLyogInNnIiBfZGlzb3duc18gcmVxdWVzdCBibGsgKi8KKworCXNycC0+bXlfY21kcCA9IE5VTEw7CisKKwlTQ1NJX0xPR19USU1FT1VUKDQsIHByaW50aygic2dfY21kX2RvbmU6ICVzLCBwYWNrX2lkPSVkLCByZXM9MHgleFxuIiwKKwkJc2RwLT5kaXNrLT5kaXNrX25hbWUsIHNycC0+aGVhZGVyLnBhY2tfaWQsIChpbnQpIFNScG50LT5zcl9yZXN1bHQpKTsKKwlzcnAtPmhlYWRlci5yZXNpZCA9IFNDcG50LT5yZXNpZDsKKwkvKiBOLkIuIHVuaXQgb2YgZHVyYXRpb24gY2hhbmdlcyBoZXJlIGZyb20gamlmZmllcyB0byBtaWxsaXNlY3MgKi8KKwlzcnAtPmhlYWRlci5kdXJhdGlvbiA9CisJICAgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHNycC0+aGVhZGVyLmR1cmF0aW9uKTsKKwlpZiAoMCAhPSBTUnBudC0+c3JfcmVzdWx0KSB7CisJCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKKworCQltZW1jcHkoc3JwLT5zZW5zZV9iLCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyLAorCQkgICAgICAgc2l6ZW9mIChzcnAtPnNlbnNlX2IpKTsKKwkJc3JwLT5oZWFkZXIuc3RhdHVzID0gMHhmZiAmIFNScG50LT5zcl9yZXN1bHQ7CisJCXNycC0+aGVhZGVyLm1hc2tlZF9zdGF0dXMgPSBzdGF0dXNfYnl0ZShTUnBudC0+c3JfcmVzdWx0KTsKKwkJc3JwLT5oZWFkZXIubXNnX3N0YXR1cyA9IG1zZ19ieXRlKFNScG50LT5zcl9yZXN1bHQpOworCQlzcnAtPmhlYWRlci5ob3N0X3N0YXR1cyA9IGhvc3RfYnl0ZShTUnBudC0+c3JfcmVzdWx0KTsKKwkJc3JwLT5oZWFkZXIuZHJpdmVyX3N0YXR1cyA9IGRyaXZlcl9ieXRlKFNScG50LT5zcl9yZXN1bHQpOworCQlpZiAoKHNkcC0+c2dkZWJ1ZyA+IDApICYmCisJCSAgICAoKENIRUNLX0NPTkRJVElPTiA9PSBzcnAtPmhlYWRlci5tYXNrZWRfc3RhdHVzKSB8fAorCQkgICAgIChDT01NQU5EX1RFUk1JTkFURUQgPT0gc3JwLT5oZWFkZXIubWFza2VkX3N0YXR1cykpKQorCQkJcHJpbnRfcmVxX3NlbnNlKCJzZ19jbWRfZG9uZSIsIFNScG50KTsKKworCQkvKiBGb2xsb3dpbmcgaWYgc3RhdGVtZW50IGlzIGEgcGF0Y2ggc3VwcGxpZWQgYnkgRXJpYyBZb3VuZ2RhbGUgKi8KKwkJaWYgKGRyaXZlcl9ieXRlKFNScG50LT5zcl9yZXN1bHQpICE9IDAKKwkJICAgICYmIHNjc2lfY29tbWFuZF9ub3JtYWxpemVfc2Vuc2UoU0NwbnQsICZzc2hkcikKKwkJICAgICYmICFzY3NpX3NlbnNlX2lzX2RlZmVycmVkKCZzc2hkcikKKwkJICAgICYmIHNzaGRyLnNlbnNlX2tleSA9PSBVTklUX0FUVEVOVElPTgorCQkgICAgJiYgc2RwLT5kZXZpY2UtPnJlbW92YWJsZSkgeworCQkJLyogRGV0ZWN0ZWQgcG9zc2libGUgZGlzYyBjaGFuZ2UuIFNldCB0aGUgYml0IC0gdGhpcyAqLworCQkJLyogbWF5IGJlIHVzZWQgaWYgdGhlcmUgYXJlIGZpbGVzeXN0ZW1zIHVzaW5nIHRoaXMgZGV2aWNlICovCisJCQlzZHAtPmRldmljZS0+Y2hhbmdlZCA9IDE7CisJCX0KKwl9CisJLyogUmVseSBvbiB3cml0ZSBwaGFzZSB0byBjbGVhbiBvdXQgc3JwIHN0YXR1cyB2YWx1ZXMsIHNvIG5vICJlbHNlIiAqLworCisJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCVNScG50ID0gTlVMTDsKKwlpZiAoc2ZwLT5jbG9zZWQpIHsJLyogd2hvb3BzIHRoaXMgZmQgYWxyZWFkeSByZWxlYXNlZCwgY2xlYW51cCAqLworCQlTQ1NJX0xPR19USU1FT1VUKDEsIHByaW50aygic2dfY21kX2RvbmU6IGFscmVhZHkgY2xvc2VkLCBmcmVlaW5nIC4uLlxuIikpOworCQlzZ19maW5pc2hfcmVtX3JlcShzcnApOworCQlzcnAgPSBOVUxMOworCQlpZiAoTlVMTCA9PSBzZnAtPmhlYWRycCkgeworCQkJU0NTSV9MT0dfVElNRU9VVCgxLCBwcmludGsoInNnLi4uYmg6IGFscmVhZHkgY2xvc2VkLCBmaW5hbCBjbGVhbnVwXG4iKSk7CisJCQlpZiAoMCA9PSBzZ19yZW1vdmVfc2ZwKHNkcCwgc2ZwKSkgewkvKiBkZXZpY2Ugc3RpbGwgcHJlc2VudCAqLworCQkJCXNjc2lfZGV2aWNlX3B1dChzZHAtPmRldmljZSk7CisJCQl9CisJCQlzZnAgPSBOVUxMOworCQl9CisJfSBlbHNlIGlmIChzcnAgJiYgc3JwLT5vcnBoYW4pIHsKKwkJaWYgKHNmcC0+a2VlcF9vcnBoYW4pCisJCQlzcnAtPnNnX2lvX293bmVkID0gMDsKKwkJZWxzZSB7CisJCQlzZ19maW5pc2hfcmVtX3JlcShzcnApOworCQkJc3JwID0gTlVMTDsKKwkJfQorCX0KKwlpZiAoc2ZwICYmIHNycCkgeworCQkvKiBOb3cgd2FrZSB1cCBhbnkgc2dfcmVhZCgpIHRoYXQgaXMgd2FpdGluZyBmb3IgdGhpcyBwYWNrZXQuICovCisJCWtpbGxfZmFzeW5jKCZzZnAtPmFzeW5jX3FwLCBTSUdQT0xMLCBQT0xMX0lOKTsKKwkJd3JpdGVfbG9ja19pcnFzYXZlKCZzZnAtPnJxX2xpc3RfbG9jaywgaWZsYWdzKTsKKwkJc3JwLT5kb25lID0gMTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZnAtPnJlYWRfd2FpdCk7CisJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZzZnAtPnJxX2xpc3RfbG9jaywgaWZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNnX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnJlYWQgPSBzZ19yZWFkLAorCS53cml0ZSA9IHNnX3dyaXRlLAorCS5wb2xsID0gc2dfcG9sbCwKKwkuaW9jdGwgPSBzZ19pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCA9IHNnX2NvbXBhdF9pb2N0bCwKKyNlbmRpZgorCS5vcGVuID0gc2dfb3BlbiwKKwkubW1hcCA9IHNnX21tYXAsCisJLnJlbGVhc2UgPSBzZ19yZWxlYXNlLAorCS5mYXN5bmMgPSBzZ19mYXN5bmMsCit9OworCitzdGF0aWMgc3RydWN0IGNsYXNzX3NpbXBsZSAqIHNnX3N5c2ZzX2NsYXNzOworCitzdGF0aWMgaW50IHNnX3N5c2ZzX3ZhbGlkID0gMDsKKworc3RhdGljIGludCBzZ19hbGxvYyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZHApCit7CisJU2dfZGV2aWNlICpzZHA7CisJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CisJdm9pZCAqb2xkX3NnX2Rldl9hcnIgPSBOVUxMOworCWludCBrLCBlcnJvcjsKKworCXNkcCA9IGttYWxsb2Moc2l6ZW9mKFNnX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghc2RwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImttYWxsb2MgU2dfZGV2aWNlIGZhaWx1cmVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJnNnX2Rldl9hcnJfbG9jaywgaWZsYWdzKTsKKwlpZiAodW5saWtlbHkoc2dfbnJfZGV2ID49IHNnX2Rldl9tYXgpKSB7CS8qIHRyeSB0byByZXNpemUgKi8KKwkJU2dfZGV2aWNlICoqdG1wX2RhOworCQlpbnQgdG1wX2Rldl9tYXggPSBzZ19ucl9kZXYgKyBTR19ERVZfQVJSX0xVTVA7CisJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZzZ19kZXZfYXJyX2xvY2ssIGlmbGFncyk7CisKKwkJdG1wX2RhID0ga21hbGxvYyh0bXBfZGV2X21heCAqIHNpemVvZihTZ19kZXZpY2UgKiksIEdGUF9LRVJORUwpOworCQlpZiAodW5saWtlbHkoIXRtcF9kYSkpCisJCQlnb3RvIGV4cGFuZF9mYWlsZWQ7CisKKwkJd3JpdGVfbG9ja19pcnFzYXZlKCZzZ19kZXZfYXJyX2xvY2ssIGlmbGFncyk7CisJCW1lbXNldCh0bXBfZGEsIDAsIHRtcF9kZXZfbWF4ICogc2l6ZW9mKFNnX2RldmljZSAqKSk7CisJCW1lbWNweSh0bXBfZGEsIHNnX2Rldl9hcnIsIHNnX2Rldl9tYXggKiBzaXplb2YoU2dfZGV2aWNlICopKTsKKwkJb2xkX3NnX2Rldl9hcnIgPSBzZ19kZXZfYXJyOworCQlzZ19kZXZfYXJyID0gdG1wX2RhOworCQlzZ19kZXZfbWF4ID0gdG1wX2Rldl9tYXg7CisJfQorCisJZm9yIChrID0gMDsgayA8IHNnX2Rldl9tYXg7IGsrKykKKwkJaWYgKCFzZ19kZXZfYXJyW2tdKQorCQkJYnJlYWs7CisJaWYgKHVubGlrZWx5KGsgPj0gU0dfTUFYX0RFVlMpKQorCQlnb3RvIG92ZXJmbG93OworCisJbWVtc2V0KHNkcCwgMCwgc2l6ZW9mKCpzZHApKTsKKwlTQ1NJX0xPR19USU1FT1VUKDMsIHByaW50aygic2dfYWxsb2M6IGRldj0lZCBcbiIsIGspKTsKKwlzcHJpbnRmKGRpc2stPmRpc2tfbmFtZSwgInNnJWQiLCBrKTsKKwlkaXNrLT5maXJzdF9taW5vciA9IGs7CisJc2RwLT5kaXNrID0gZGlzazsKKwlzZHAtPmRldmljZSA9IHNjc2lkcDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZHAtPm9fZXhjbF93YWl0KTsKKwlzZHAtPnNnX3RhYmxlc2l6ZSA9IHNjc2lkcC0+aG9zdCA/IHNjc2lkcC0+aG9zdC0+c2dfdGFibGVzaXplIDogMDsKKworCXNnX25yX2RldisrOworCXNnX2Rldl9hcnJba10gPSBzZHA7CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnNnX2Rldl9hcnJfbG9jaywgaWZsYWdzKTsKKwllcnJvciA9IGs7CisKKyBvdXQ6CisJaWYgKGVycm9yIDwgMCkKKwkJa2ZyZWUoc2RwKTsKKwlrZnJlZShvbGRfc2dfZGV2X2Fycik7CisJcmV0dXJuIGVycm9yOworCisgZXhwYW5kX2ZhaWxlZDoKKwlwcmludGsoS0VSTl9XQVJOSU5HICJzZ19hbGxvYzogZGV2aWNlIGFycmF5IGNhbm5vdCBiZSByZXNpemVkXG4iKTsKKwllcnJvciA9IC1FTk9NRU07CisJZ290byBvdXQ7CisKKyBvdmVyZmxvdzoKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmc2dfZGV2X2Fycl9sb2NrLCBpZmxhZ3MpOworCXByaW50ayhLRVJOX1dBUk5JTkcKKwkgICAgICAgIlVuYWJsZSB0byBhdHRhY2ggc2cgZGV2aWNlIDwlZCwgJWQsICVkLCAlZD4gdHlwZT0lZCwgbWlub3IgIgorCSAgICAgICAibnVtYmVyIGV4Y2VlZHMgJWRcbiIsIHNjc2lkcC0+aG9zdC0+aG9zdF9ubywgc2NzaWRwLT5jaGFubmVsLAorCSAgICAgICBzY3NpZHAtPmlkLCBzY3NpZHAtPmx1biwgc2NzaWRwLT50eXBlLCBTR19NQVhfREVWUyAtIDEpOworCWVycm9yID0gLUVOT0RFVjsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIGludAorc2dfYWRkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsX2RldikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkcCA9IHRvX3Njc2lfZGV2aWNlKGNsX2Rldi0+ZGV2KTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKKwlTZ19kZXZpY2UgKnNkcCA9IE5VTEw7CisJc3RydWN0IGNkZXYgKiBjZGV2ID0gTlVMTDsKKwlpbnQgZXJyb3IsIGs7CisKKwlkaXNrID0gYWxsb2NfZGlzaygxKTsKKwlpZiAoIWRpc2spIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWxsb2NfZGlzayBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZGlzay0+bWFqb3IgPSBTQ1NJX0dFTkVSSUNfTUFKT1I7CisKKwllcnJvciA9IC1FTk9NRU07CisJY2RldiA9IGNkZXZfYWxsb2MoKTsKKwlpZiAoIWNkZXYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Rldl9hbGxvYyBmYWlsZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisJY2Rldi0+b3duZXIgPSBUSElTX01PRFVMRTsKKwljZGV2LT5vcHMgPSAmc2dfZm9wczsKKworCWVycm9yID0gc2dfYWxsb2MoZGlzaywgc2NzaWRwKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNnX2FsbG9jIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKwlrID0gZXJyb3I7CisJc2RwID0gc2dfZGV2X2FycltrXTsKKworCWRldmZzX21rX2NkZXYoTUtERVYoU0NTSV9HRU5FUklDX01BSk9SLCBrKSwKKwkJCVNfSUZDSFIgfCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAsCisJCQkiJXMvZ2VuZXJpYyIsIHNjc2lkcC0+ZGV2ZnNfbmFtZSk7CisJZXJyb3IgPSBjZGV2X2FkZChjZGV2LCBNS0RFVihTQ1NJX0dFTkVSSUNfTUFKT1IsIGspLCAxKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2ZnNfcmVtb3ZlKCIlcy9nZW5lcmljIiwgc2NzaWRwLT5kZXZmc19uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCXNkcC0+Y2RldiA9IGNkZXY7CisJaWYgKHNnX3N5c2ZzX3ZhbGlkKSB7CisJCXN0cnVjdCBjbGFzc19kZXZpY2UgKiBzZ19jbGFzc19tZW1iZXI7CisKKwkJc2dfY2xhc3NfbWVtYmVyID0gY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoc2dfc3lzZnNfY2xhc3MsIAorCQkJCU1LREVWKFNDU0lfR0VORVJJQ19NQUpPUiwgayksIAorCQkJCWNsX2Rldi0+ZGV2LCAiJXMiLCAKKwkJCQlkaXNrLT5kaXNrX25hbWUpOworCQlpZiAoSVNfRVJSKHNnX2NsYXNzX21lbWJlcikpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzZ19hZGQ6ICIKKwkJCQkiY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQgZmFpbGVkXG4iKTsKKwkJY2xhc3Nfc2V0X2RldmRhdGEoc2dfY2xhc3NfbWVtYmVyLCBzZHApOworCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZzY3NpZHAtPnNkZXZfZ2VuZGV2LmtvYmosIAorCQkJCQkgICZzZ19jbGFzc19tZW1iZXItPmtvYmosICJnZW5lcmljIik7CisJCWlmIChlcnJvcikKKwkJCXByaW50ayhLRVJOX0VSUiAic2dfYWRkOiB1bmFibGUgdG8gbWFrZSBzeW1saW5rICIKKwkJCQkJIidnZW5lcmljJyBiYWNrIHRvIHNnJWRcbiIsIGspOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJzZ19hZGQ6IHNnX3N5cyBJTnZhbGlkXG4iKTsKKworCXByaW50ayhLRVJOX05PVElDRQorCSAgICAgICAiQXR0YWNoZWQgc2NzaSBnZW5lcmljIHNnJWQgYXQgc2NzaSVkLCBjaGFubmVsIgorCSAgICAgICAiICVkLCBpZCAlZCwgbHVuICVkLCAgdHlwZSAlZFxuIiwgaywKKwkgICAgICAgc2NzaWRwLT5ob3N0LT5ob3N0X25vLCBzY3NpZHAtPmNoYW5uZWwsIHNjc2lkcC0+aWQsCisJICAgICAgIHNjc2lkcC0+bHVuLCBzY3NpZHAtPnR5cGUpOworCisJcmV0dXJuIDA7CisKK291dDoKKwlwdXRfZGlzayhkaXNrKTsKKwlpZiAoY2RldikKKwkJY2Rldl9kZWwoY2Rldik7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZAorc2dfcmVtb3ZlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsX2RldikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkcCA9IHRvX3Njc2lfZGV2aWNlKGNsX2Rldi0+ZGV2KTsKKwlTZ19kZXZpY2UgKnNkcCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CisJU2dfZmQgKnNmcDsKKwlTZ19mZCAqdHNmcDsKKwlTZ19yZXF1ZXN0ICpzcnA7CisJU2dfcmVxdWVzdCAqdHNycDsKKwlpbnQgaywgZGVsYXk7CisKKwlpZiAoTlVMTCA9PSBzZ19kZXZfYXJyKQorCQlyZXR1cm47CisJZGVsYXkgPSAwOworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmc2dfZGV2X2Fycl9sb2NrLCBpZmxhZ3MpOworCWZvciAoayA9IDA7IGsgPCBzZ19kZXZfbWF4OyBrKyspIHsKKwkJc2RwID0gc2dfZGV2X2FycltrXTsKKwkJaWYgKChOVUxMID09IHNkcCkgfHwgKHNkcC0+ZGV2aWNlICE9IHNjc2lkcCkpCisJCQljb250aW51ZTsJLyogZGlydHkgYnV0IGxvd2VycyBuZXN0aW5nICovCisJCWlmIChzZHAtPmhlYWRmcCkgeworCQkJc2RwLT5kZXRhY2hlZCA9IDE7CisJCQlmb3IgKHNmcCA9IHNkcC0+aGVhZGZwOyBzZnA7IHNmcCA9IHRzZnApIHsKKwkJCQl0c2ZwID0gc2ZwLT5uZXh0ZnA7CisJCQkJZm9yIChzcnAgPSBzZnAtPmhlYWRycDsgc3JwOyBzcnAgPSB0c3JwKSB7CisJCQkJCXRzcnAgPSBzcnAtPm5leHRycDsKKwkJCQkJaWYgKHNmcC0+Y2xvc2VkIHx8ICgwID09IHNnX3NycF9kb25lKHNycCwgc2ZwKSkpCisJCQkJCQlzZ19maW5pc2hfcmVtX3JlcShzcnApOworCQkJCX0KKwkJCQlpZiAoc2ZwLT5jbG9zZWQpIHsKKwkJCQkJc2NzaV9kZXZpY2VfcHV0KHNkcC0+ZGV2aWNlKTsKKwkJCQkJX19zZ19yZW1vdmVfc2ZwKHNkcCwgc2ZwKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkZWxheSA9IDE7CisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2ZwLT5yZWFkX3dhaXQpOworCQkJCQlraWxsX2Zhc3luYygmc2ZwLT5hc3luY19xcCwgU0lHUE9MTCwKKwkJCQkJCSAgICBQT0xMX0hVUCk7CisJCQkJfQorCQkJfQorCQkJU0NTSV9MT0dfVElNRU9VVCgzLCBwcmludGsoInNnX2RldGFjaDogZGV2PSVkLCBkaXJ0eVxuIiwgaykpOworCQkJaWYgKE5VTEwgPT0gc2RwLT5oZWFkZnApIHsKKwkJCQlzZ19kZXZfYXJyW2tdID0gTlVMTDsKKwkJCX0KKwkJfSBlbHNlIHsJLyogbm90aGluZyBhY3RpdmUsIHNpbXBsZSBjYXNlICovCisJCQlTQ1NJX0xPR19USU1FT1VUKDMsIHByaW50aygic2dfZGV0YWNoOiBkZXY9JWRcbiIsIGspKTsKKwkJCXNnX2Rldl9hcnJba10gPSBOVUxMOworCQl9CisJCXNnX25yX2Rldi0tOworCQlicmVhazsKKwl9CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnNnX2Rldl9hcnJfbG9jaywgaWZsYWdzKTsKKworCWlmIChzZHApIHsKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJnNjc2lkcC0+c2Rldl9nZW5kZXYua29iaiwgImdlbmVyaWMiKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoU0NTSV9HRU5FUklDX01BSk9SLCBrKSk7CisJCWNkZXZfZGVsKHNkcC0+Y2Rldik7CisJCXNkcC0+Y2RldiA9IE5VTEw7CisJCWRldmZzX3JlbW92ZSgiJXMvZ2VuZXJpYyIsIHNjc2lkcC0+ZGV2ZnNfbmFtZSk7CisJCXB1dF9kaXNrKHNkcC0+ZGlzayk7CisJCXNkcC0+ZGlzayA9IE5VTEw7CisJCWlmIChOVUxMID09IHNkcC0+aGVhZGZwKQorCQkJa2ZyZWUoKGNoYXIgKikgc2RwKTsKKwl9CisKKwlpZiAoZGVsYXkpCisJCW1zbGVlcCgxMCk7CS8qIGRpcnR5IGRldGFjaCBzbyBkZWxheSBkZXZpY2UgZGVzdHJ1Y3Rpb24gKi8KK30KKworLyogU2V0ICdwZXJtJyAoNHRoIGFyZ3VtZW50KSB0byAwIHRvIGRpc2FibGUgbW9kdWxlX3BhcmFtJ3MgZGVmaW5pdGlvbgorICogb2Ygc3lzZnMgcGFyYW1ldGVycyAod2hpY2ggbW9kdWxlX3BhcmFtIGRvZXNuJ3QgeWV0IHN1cHBvcnQpLgorICogU3lzZnMgcGFyYW1ldGVycyBkZWZpbmVkIGV4cGxpY2l0bHkgYmVsb3cuCisgKi8KK21vZHVsZV9wYXJhbV9uYW1lZChkZWZfcmVzZXJ2ZWRfc2l6ZSwgZGVmX3Jlc2VydmVkX3NpemUsIGludCwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW1fbmFtZWQoYWxsb3dfZGlvLCBzZ19hbGxvd19kaW8sIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworCitNT0RVTEVfQVVUSE9SKCJEb3VnbGFzIEdpbGJlcnQiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0NTSSBnZW5lcmljIChzZykgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihTR19WRVJTSU9OX1NUUik7CisKK01PRFVMRV9QQVJNX0RFU0MoZGVmX3Jlc2VydmVkX3NpemUsICJzaXplIG9mIGJ1ZmZlciByZXNlcnZlZCBmb3IgZWFjaCBmZCIpOworTU9EVUxFX1BBUk1fREVTQyhhbGxvd19kaW8sICJhbGxvdyBkaXJlY3QgSS9PIChkZWZhdWx0OiAwIChkaXNhbGxvdykpIik7CisKK3N0YXRpYyBpbnQgX19pbml0Citpbml0X3NnKHZvaWQpCit7CisJaW50IHJjOworCisJaWYgKGRlZl9yZXNlcnZlZF9zaXplID49IDApCisJCXNnX2JpZ19idWZmID0gZGVmX3Jlc2VydmVkX3NpemU7CisKKwlyYyA9IHJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoU0NTSV9HRU5FUklDX01BSk9SLCAwKSwgCisJCQkJICAgIFNHX01BWF9ERVZTLCAic2ciKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKyAgICAgICAgc2dfc3lzZnNfY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCAic2NzaV9nZW5lcmljIik7CisgICAgICAgIGlmICggSVNfRVJSKHNnX3N5c2ZzX2NsYXNzKSApIHsKKwkJcmMgPSBQVFJfRVJSKHNnX3N5c2ZzX2NsYXNzKTsKKwkJZ290byBlcnJfb3V0OworICAgICAgICB9CisJc2dfc3lzZnNfdmFsaWQgPSAxOworCXJjID0gc2NzaV9yZWdpc3Rlcl9pbnRlcmZhY2UoJnNnX2ludGVyZmFjZSk7CisJaWYgKDAgPT0gcmMpIHsKKyNpZmRlZiBDT05GSUdfU0NTSV9QUk9DX0ZTCisJCXNnX3Byb2NfaW5pdCgpOworI2VuZGlmCQkJCS8qIENPTkZJR19TQ1NJX1BST0NfRlMgKi8KKwkJcmV0dXJuIDA7CisJfQorCWNsYXNzX3NpbXBsZV9kZXN0cm95KHNnX3N5c2ZzX2NsYXNzKTsKK2Vycl9vdXQ6CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFNDU0lfR0VORVJJQ19NQUpPUiwgMCksIFNHX01BWF9ERVZTKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorZXhpdF9zZyh2b2lkKQoreworI2lmZGVmIENPTkZJR19TQ1NJX1BST0NfRlMKKwlzZ19wcm9jX2NsZWFudXAoKTsKKyNlbmRpZgkJCQkvKiBDT05GSUdfU0NTSV9QUk9DX0ZTICovCisJc2NzaV91bnJlZ2lzdGVyX2ludGVyZmFjZSgmc2dfaW50ZXJmYWNlKTsKKwljbGFzc19zaW1wbGVfZGVzdHJveShzZ19zeXNmc19jbGFzcyk7CisJc2dfc3lzZnNfdmFsaWQgPSAwOworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihTQ1NJX0dFTkVSSUNfTUFKT1IsIDApLAorCQkJCSBTR19NQVhfREVWUyk7CisJaWYgKHNnX2Rldl9hcnIgIT0gTlVMTCkgeworCQlrZnJlZSgoY2hhciAqKSBzZ19kZXZfYXJyKTsKKwkJc2dfZGV2X2FyciA9IE5VTEw7CisJfQorCXNnX2Rldl9tYXggPSAwOworfQorCitzdGF0aWMgaW50CitzZ19zdGFydF9yZXEoU2dfcmVxdWVzdCAqIHNycCkKK3sKKwlpbnQgcmVzOworCVNnX2ZkICpzZnAgPSBzcnAtPnBhcmVudGZwOworCXNnX2lvX2hkcl90ICpocCA9ICZzcnAtPmhlYWRlcjsKKwlpbnQgZHhmZXJfbGVuID0gKGludCkgaHAtPmR4ZmVyX2xlbjsKKwlpbnQgZHhmZXJfZGlyID0gaHAtPmR4ZmVyX2RpcmVjdGlvbjsKKwlTZ19zY2F0dGVyX2hvbGQgKnJlcV9zY2hwID0gJnNycC0+ZGF0YTsKKwlTZ19zY2F0dGVyX2hvbGQgKnJzdl9zY2hwID0gJnNmcC0+cmVzZXJ2ZTsKKworCVNDU0lfTE9HX1RJTUVPVVQoNCwgcHJpbnRrKCJzZ19zdGFydF9yZXE6IGR4ZmVyX2xlbj0lZFxuIiwgZHhmZXJfbGVuKSk7CisJaWYgKChkeGZlcl9sZW4gPD0gMCkgfHwgKGR4ZmVyX2RpciA9PSBTR19EWEZFUl9OT05FKSkKKwkJcmV0dXJuIDA7CisJaWYgKHNnX2FsbG93X2RpbyAmJiAoaHAtPmZsYWdzICYgU0dfRkxBR19ESVJFQ1RfSU8pICYmCisJICAgIChkeGZlcl9kaXIgIT0gU0dfRFhGRVJfVU5LTk9XTikgJiYgKDAgPT0gaHAtPmlvdmVjX2NvdW50KSAmJgorCSAgICAoIXNmcC0+cGFyZW50ZHAtPmRldmljZS0+aG9zdC0+dW5jaGVja2VkX2lzYV9kbWEpKSB7CisJCXJlcyA9IHNnX2J1aWxkX2RpcmVjdChzcnAsIHNmcCwgZHhmZXJfbGVuKTsKKwkJaWYgKHJlcyA8PSAwKQkvKiAtdmUgLT4gZXJyb3IsIDAgLT4gZG9uZSwgMSAtPiB0cnkgaW5kaXJlY3QgKi8KKwkJCXJldHVybiByZXM7CisJfQorCWlmICgoIXNnX3Jlc19pbl91c2Uoc2ZwKSkgJiYgKGR4ZmVyX2xlbiA8PSByc3Zfc2NocC0+YnVmZmxlbikpCisJCXNnX2xpbmtfcmVzZXJ2ZShzZnAsIHNycCwgZHhmZXJfbGVuKTsKKwllbHNlIHsKKwkJcmVzID0gc2dfYnVpbGRfaW5kaXJlY3QocmVxX3NjaHAsIHNmcCwgZHhmZXJfbGVuKTsKKwkJaWYgKHJlcykgeworCQkJc2dfcmVtb3ZlX3NjYXQocmVxX3NjaHApOworCQkJcmV0dXJuIHJlczsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3NnX2ZpbmlzaF9yZW1fcmVxKFNnX3JlcXVlc3QgKiBzcnApCit7CisJU2dfZmQgKnNmcCA9IHNycC0+cGFyZW50ZnA7CisJU2dfc2NhdHRlcl9ob2xkICpyZXFfc2NocCA9ICZzcnAtPmRhdGE7CisKKwlTQ1NJX0xPR19USU1FT1VUKDQsIHByaW50aygic2dfZmluaXNoX3JlbV9yZXE6IHJlc191c2VkPSVkXG4iLCAoaW50KSBzcnAtPnJlc191c2VkKSk7CisJaWYgKHNycC0+cmVzX3VzZWQpCisJCXNnX3VubGlua19yZXNlcnZlKHNmcCwgc3JwKTsKKwllbHNlCisJCXNnX3JlbW92ZV9zY2F0KHJlcV9zY2hwKTsKKwlzZ19yZW1vdmVfcmVxdWVzdChzZnAsIHNycCk7Cit9CisKK3N0YXRpYyBpbnQKK3NnX2J1aWxkX3NnYXQoU2dfc2NhdHRlcl9ob2xkICogc2NocCwgY29uc3QgU2dfZmQgKiBzZnAsIGludCB0YWJsZXNpemUpCit7CisJaW50IHJldF9zejsKKwlpbnQgZWxlbV9zeiA9IHNpemVvZiAoc3RydWN0IHNjYXR0ZXJsaXN0KTsKKwlpbnQgc2dfYnVmZmxlbiA9IHRhYmxlc2l6ZSAqIGVsZW1fc3o7CisJaW50IG14X3NjX2VsZW1zID0gdGFibGVzaXplOworCisJc2NocC0+YnVmZmVyID0gc2dfcGFnZV9tYWxsb2Moc2dfYnVmZmxlbiwgc2ZwLT5sb3dfZG1hLCAmcmV0X3N6KTsKKwlpZiAoIXNjaHAtPmJ1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJZWxzZSBpZiAocmV0X3N6ICE9IHNnX2J1ZmZsZW4pIHsKKwkJc2dfYnVmZmxlbiA9IHJldF9zejsKKwkJbXhfc2NfZWxlbXMgPSBzZ19idWZmbGVuIC8gZWxlbV9zejsKKwl9CisJc2NocC0+c2dsaXN0X2xlbiA9IHNnX2J1ZmZsZW47CisJbWVtc2V0KHNjaHAtPmJ1ZmZlciwgMCwgc2dfYnVmZmxlbik7CisJcmV0dXJuIG14X3NjX2VsZW1zOwkvKiBudW1iZXIgb2Ygc2NhdF9nYXRoIGVsZW1lbnRzIGFsbG9jYXRlZCAqLworfQorCisjaWZkZWYgU0dfQUxMT1dfRElPX0NPREUKKy8qIHZ2dnZ2dnZ2ICBmb2xsb3dpbmcgY29kZSBib3Jyb3dlZCBmcm9tIHN0IGRyaXZlcidzIGRpcmVjdCBJTyB2dnZ2dnZ2dnYgKi8KKwkvKiBob3BlZnVsbHkgdGhpcyBnZW5lcmljIGNvZGUgd2lsbCBtb3ZlZCB0byBhIGxpYnJhcnkgKi8KKworLyogUGluIGRvd24gdXNlciBwYWdlcyBhbmQgcHV0IHRoZW0gaW50byBhIHNjYXR0ZXIgZ2F0aGVyIGxpc3QuIFJldHVybnMgPD0gMCBpZgorICAgLSBtYXBwaW5nIG9mIGFsbCBwYWdlcyBub3Qgc3VjY2Vzc2Z1bAorICAgLSBhbnkgcGFnZSBpcyBhYm92ZSBtYXhfcGZuCisgICAoaS5lLiwgZWl0aGVyIGNvbXBsZXRlbHkgc3VjY2Vzc2Z1bCBvciBmYWlscykKKyovCitzdGF0aWMgaW50IAorc3RfbWFwX3VzZXJfcGFnZXMoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcGFnZXMsIAorCSAgICAgICAgICB1bnNpZ25lZCBsb25nIHVhZGRyLCBzaXplX3QgY291bnQsIGludCBydywKKwkgICAgICAgICAgdW5zaWduZWQgbG9uZyBtYXhfcGZuKQoreworCWludCByZXMsIGksIGo7CisJdW5zaWduZWQgaW50IG5yX3BhZ2VzOworCXN0cnVjdCBwYWdlICoqcGFnZXM7CisKKwlucl9wYWdlcyA9ICgodWFkZHIgJiB+UEFHRV9NQVNLKSArIGNvdW50ICsgflBBR0VfTUFTSykgPj4gUEFHRV9TSElGVDsKKworCS8qIFVzZXIgYXR0ZW1wdGVkIE92ZXJmbG93ISAqLworCWlmICgodWFkZHIgKyBjb3VudCkgPCB1YWRkcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBUb28gYmlnICovCisgICAgICAgIGlmIChucl9wYWdlcyA+IG1heF9wYWdlcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBIbW0/ICovCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCisJaWYgKChwYWdlcyA9IGttYWxsb2MobWF4X3BhZ2VzICogc2l6ZW9mKCpwYWdlcyksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworICAgICAgICAvKiBUcnkgdG8gZmF1bHQgaW4gYWxsIG9mIHRoZSBuZWNlc3NhcnkgcGFnZXMgKi8KKwlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisgICAgICAgIC8qIHJ3PT1SRUFEIG1lYW5zIHJlYWQgZnJvbSBkcml2ZSwgd3JpdGUgaW50byBtZW1vcnkgYXJlYSAqLworCXJlcyA9IGdldF91c2VyX3BhZ2VzKAorCQljdXJyZW50LAorCQljdXJyZW50LT5tbSwKKwkJdWFkZHIsCisJCW5yX3BhZ2VzLAorCQlydyA9PSBSRUFELAorCQkwLCAvKiBkb24ndCBmb3JjZSAqLworCQlwYWdlcywKKwkJTlVMTCk7CisJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCS8qIEVycm9ycyBhbmQgbm8gcGFnZSBtYXBwZWQgc2hvdWxkIHJldHVybiBoZXJlICovCisJaWYgKHJlcyA8IG5yX3BhZ2VzKQorCQlnb3RvIG91dF91bm1hcDsKKworICAgICAgICBmb3IgKGk9MDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvKiBGSVhNRTogZmx1c2ggc3VwZXJmbG91cyBmb3Igcnc9PVJFQUQsCisgICAgICAgICAgICAgICAgICogcHJvYmFibHkgd3JvbmcgZnVuY3Rpb24gZm9yIHJ3PT1XUklURQorICAgICAgICAgICAgICAgICAqLworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlc1tpXSk7CisJCWlmIChwYWdlX3RvX3BmbihwYWdlc1tpXSkgPiBtYXhfcGZuKQorCQkJZ290byBvdXRfdW5sb2NrOworCQkvKiA/PyBJcyBsb2NraW5nIG5lZWRlZD8gSSBkb24ndCB0aGluayBzbyAqLworCQkvKiBpZiAoVGVzdFNldFBhZ2VMb2NrZWQocGFnZXNbaV0pKQorCQkgICBnb3RvIG91dF91bmxvY2s7ICovCisgICAgICAgIH0KKworCS8qIFBvcHVsYXRlIHRoZSBzY2F0dGVyL2dhdGhlciBsaXN0ICovCisJc2dsWzBdLnBhZ2UgPSBwYWdlc1swXTsgCisJc2dsWzBdLm9mZnNldCA9IHVhZGRyICYgflBBR0VfTUFTSzsKKwlpZiAobnJfcGFnZXMgPiAxKSB7CisJCXNnbFswXS5sZW5ndGggPSBQQUdFX1NJWkUgLSBzZ2xbMF0ub2Zmc2V0OworCQljb3VudCAtPSBzZ2xbMF0ubGVuZ3RoOworCQlmb3IgKGk9MTsgaSA8IG5yX3BhZ2VzIDsgaSsrKSB7CisJCQlzZ2xbaV0ub2Zmc2V0ID0gMDsKKwkJCXNnbFtpXS5wYWdlID0gcGFnZXNbaV07IAorCQkJc2dsW2ldLmxlbmd0aCA9IGNvdW50IDwgUEFHRV9TSVpFID8gY291bnQgOiBQQUdFX1NJWkU7CisJCQljb3VudCAtPSBQQUdFX1NJWkU7CisJCX0KKwl9CisJZWxzZSB7CisJCXNnbFswXS5sZW5ndGggPSBjb3VudDsKKwl9CisKKwlrZnJlZShwYWdlcyk7CisJcmV0dXJuIG5yX3BhZ2VzOworCisgb3V0X3VubG9jazoKKwkvKiBmb3IgKGo9MDsgaiA8IGk7IGorKykKKwkgICB1bmxvY2tfcGFnZShwYWdlc1tqXSk7ICovCisJcmVzID0gMDsKKyBvdXRfdW5tYXA6CisJaWYgKHJlcyA+IDApCisJCWZvciAoaj0wOyBqIDwgcmVzOyBqKyspCisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZXNbal0pOworCWtmcmVlKHBhZ2VzKTsKKwlyZXR1cm4gcmVzOworfQorCisKKy8qIEFuZCB1bm1hcCB0aGVtLi4uICovCitzdGF0aWMgaW50IAorc3RfdW5tYXBfdXNlcl9wYWdlcyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgY29uc3QgdW5zaWduZWQgaW50IG5yX3BhZ2VzLAorCQkgICAgaW50IGRpcnRpZWQpCit7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKwkJaWYgKGRpcnRpZWQgJiYgIVBhZ2VSZXNlcnZlZChzZ2xbaV0ucGFnZSkpCisJCQlTZXRQYWdlRGlydHkoc2dsW2ldLnBhZ2UpOworCQkvKiB1bmxvY2tfcGFnZShzZ2xbaV0ucGFnZSk7ICovCisJCS8qIEZJWE1FOiBjYWNoZSBmbHVzaCBtaXNzaW5nIGZvciBydz09UkVBRAorCQkgKiBGSVhNRTogY2FsbCB0aGUgY29ycmVjdCByZWZlcmVuY2UgY291bnRpbmcgZnVuY3Rpb24KKwkJICovCisJCXBhZ2VfY2FjaGVfcmVsZWFzZShzZ2xbaV0ucGFnZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIF5eXl5eXl5eICBhYm92ZSBjb2RlIGJvcnJvd2VkIGZyb20gc3QgZHJpdmVyJ3MgZGlyZWN0IElPIF5eXl5eXl5eXiAqLworI2VuZGlmCisKKworLyogUmV0dXJuczogLXZlIC0+IGVycm9yLCAwIC0+IGRvbmUsIDEgLT4gdHJ5IGluZGlyZWN0ICovCitzdGF0aWMgaW50CitzZ19idWlsZF9kaXJlY3QoU2dfcmVxdWVzdCAqIHNycCwgU2dfZmQgKiBzZnAsIGludCBkeGZlcl9sZW4pCit7CisjaWZkZWYgU0dfQUxMT1dfRElPX0NPREUKKwlzZ19pb19oZHJfdCAqaHAgPSAmc3JwLT5oZWFkZXI7CisJU2dfc2NhdHRlcl9ob2xkICpzY2hwID0gJnNycC0+ZGF0YTsKKwlpbnQgc2dfdGFibGVzaXplID0gc2ZwLT5wYXJlbnRkcC0+c2dfdGFibGVzaXplOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsOworCWludCBteF9zY19lbGVtcywgcmVzOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHNmcC0+cGFyZW50ZHAtPmRldmljZTsKKworCWlmICgoKHVuc2lnbmVkIGxvbmcpaHAtPmR4ZmVycCAmCisJCQlxdWV1ZV9kbWFfYWxpZ25tZW50KHNkZXYtPnJlcXVlc3RfcXVldWUpKSAhPSAwKQorCQlyZXR1cm4gMTsKKwlteF9zY19lbGVtcyA9IHNnX2J1aWxkX3NnYXQoc2NocCwgc2ZwLCBzZ190YWJsZXNpemUpOworICAgICAgICBpZiAobXhfc2NfZWxlbXMgPD0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisJc2dsID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNjaHAtPmJ1ZmZlcjsKKwlyZXMgPSBzdF9tYXBfdXNlcl9wYWdlcyhzZ2wsIG14X3NjX2VsZW1zLCAodW5zaWduZWQgbG9uZylocC0+ZHhmZXJwLCBkeGZlcl9sZW4sIAorCQkJCShTR19EWEZFUl9UT19ERVYgPT0gaHAtPmR4ZmVyX2RpcmVjdGlvbikgPyAxIDogMCwgVUxPTkdfTUFYKTsKKwlpZiAocmVzIDw9IDApCisJCXJldHVybiAxOworCXNjaHAtPmtfdXNlX3NnID0gcmVzOworCXNjaHAtPmRpb19pbl91c2UgPSAxOworCWhwLT5pbmZvIHw9IFNHX0lORk9fRElSRUNUX0lPOworCXJldHVybiAwOworI2Vsc2UKKwlyZXR1cm4gMTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50CitzZ19idWlsZF9pbmRpcmVjdChTZ19zY2F0dGVyX2hvbGQgKiBzY2hwLCBTZ19mZCAqIHNmcCwgaW50IGJ1ZmZfc2l6ZSkKK3sKKwlpbnQgcmV0X3N6OworCWludCBibGtfc2l6ZSA9IGJ1ZmZfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICpwID0gTlVMTDsKKworCWlmICgoYmxrX3NpemUgPCAwKSB8fCAoIXNmcCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICgwID09IGJsa19zaXplKQorCQkrK2Jsa19zaXplOwkvKiBkb24ndCBrbm93IHdoeSAqLworLyogcm91bmQgcmVxdWVzdCB1cCB0byBuZXh0IGhpZ2hlc3QgU0dfU0VDVE9SX1NaIGJ5dGUgYm91bmRhcnkgKi8KKwlibGtfc2l6ZSA9IChibGtfc2l6ZSArIFNHX1NFQ1RPUl9NU0spICYgKH5TR19TRUNUT1JfTVNLKTsKKwlTQ1NJX0xPR19USU1FT1VUKDQsIHByaW50aygic2dfYnVpbGRfaW5kaXJlY3Q6IGJ1ZmZfc2l6ZT0lZCwgYmxrX3NpemU9JWRcbiIsCisJCQkJICAgYnVmZl9zaXplLCBibGtfc2l6ZSkpOworCWlmIChibGtfc2l6ZSA8PSBTR19TQ0FUVEVSX1NaKSB7CisJCXAgPSBzZ19wYWdlX21hbGxvYyhibGtfc2l6ZSwgc2ZwLT5sb3dfZG1hLCAmcmV0X3N6KTsKKwkJaWYgKCFwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmIChibGtfc2l6ZSA9PSByZXRfc3opIHsJLyogZ290IGl0IG9uIHRoZSBmaXJzdCBhdHRlbXB0ICovCisJCQlzY2hwLT5rX3VzZV9zZyA9IDA7CisJCQlzY2hwLT5idWZmZXIgPSBwOworCQkJc2NocC0+YnVmZmxlbiA9IGJsa19zaXplOworCQkJc2NocC0+Yl9tYWxsb2NfbGVuID0gYmxrX3NpemU7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCXAgPSBzZ19wYWdlX21hbGxvYyhTR19TQ0FUVEVSX1NaLCBzZnAtPmxvd19kbWEsICZyZXRfc3opOworCQlpZiAoIXApCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisvKiBXYW50IHNvbWUgbG9jYWwgZGVjbGFyYXRpb25zLCBzbyBzdGFydCBuZXcgYmxvY2sgLi4uICovCisJewkJCS8qIGxldHMgdHJ5IGFuZCBidWlsZCBhIHNjYXR0ZXIgZ2F0aGVyIGxpc3QgKi8KKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzY2xwOworCQlpbnQgaywgcmVtX3N6LCBudW07CisJCWludCBteF9zY19lbGVtczsKKwkJaW50IHNnX3RhYmxlc2l6ZSA9IHNmcC0+cGFyZW50ZHAtPnNnX3RhYmxlc2l6ZTsKKwkJaW50IGZpcnN0ID0gMTsKKworCQkvKiBOLkIuIHJldF9zeiBjYXJyaWVkIGludG8gdGhpcyBibG9jayAuLi4gKi8KKwkJbXhfc2NfZWxlbXMgPSBzZ19idWlsZF9zZ2F0KHNjaHAsIHNmcCwgc2dfdGFibGVzaXplKTsKKwkJaWYgKG14X3NjX2VsZW1zIDwgMCkKKwkJCXJldHVybiBteF9zY19lbGVtczsJLyogbW9zdCBsaWtlbHkgLUVOT01FTSAqLworCisJCWZvciAoayA9IDAsIHNjbHAgPSBzY2hwLT5idWZmZXIsIHJlbV9zeiA9IGJsa19zaXplOworCQkgICAgIChyZW1fc3ogPiAwKSAmJiAoayA8IG14X3NjX2VsZW1zKTsKKwkJICAgICArK2ssIHJlbV9zeiAtPSByZXRfc3osICsrc2NscCkgeworCQkJaWYgKGZpcnN0KQorCQkJCWZpcnN0ID0gMDsKKwkJCWVsc2UgeworCQkJCW51bSA9CisJCQkJICAgIChyZW1fc3ogPgorCQkJCSAgICAgU0dfU0NBVFRFUl9TWikgPyBTR19TQ0FUVEVSX1NaIDogcmVtX3N6OworCQkJCXAgPSBzZ19wYWdlX21hbGxvYyhudW0sIHNmcC0+bG93X2RtYSwgJnJldF9zeik7CisJCQkJaWYgKCFwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXNjbHAtPnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocCk7CisJCQlzY2xwLT5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShwKTsKKwkJCXNjbHAtPmxlbmd0aCA9IHJldF9zejsKKworCQkJU0NTSV9MT0dfVElNRU9VVCg1LCBwcmludGsoInNnX2J1aWxkX2J1aWxkOiBrPSVkLCBhPTB4JXAsIGxlbj0lZFxuIiwKKwkJCQkJICBrLCBzZ19zY2F0ZzJ2aXJ0KHNjbHApLCByZXRfc3opKTsKKwkJfQkJLyogZW5kIG9mIGZvciBsb29wICovCisJCXNjaHAtPmtfdXNlX3NnID0gazsKKwkJU0NTSV9MT0dfVElNRU9VVCg1LCBwcmludGsoInNnX2J1aWxkX2luZGlyZWN0OiBrX3VzZV9zZz0lZCwgcmVtX3N6PSVkXG4iLCBrLCByZW1fc3opKTsKKwkJc2NocC0+YnVmZmxlbiA9IGJsa19zaXplOworCQlpZiAocmVtX3N6ID4gMCkJLyogbXVzdCBoYXZlIGZhaWxlZCAqLworCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzZ193cml0ZV94ZmVyKFNnX3JlcXVlc3QgKiBzcnApCit7CisJc2dfaW9faGRyX3QgKmhwID0gJnNycC0+aGVhZGVyOworCVNnX3NjYXR0ZXJfaG9sZCAqc2NocCA9ICZzcnAtPmRhdGE7CisJaW50IG51bV94ZmVyID0gMDsKKwlpbnQgaiwgaywgb251bSwgdXNnbGVuLCBrc2dsZW4sIHJlczsKKwlpbnQgaW92ZWNfY291bnQgPSAoaW50KSBocC0+aW92ZWNfY291bnQ7CisJaW50IGR4ZmVyX2RpciA9IGhwLT5keGZlcl9kaXJlY3Rpb247CisJdW5zaWduZWQgY2hhciAqcDsKKwl1bnNpZ25lZCBjaGFyIF9fdXNlciAqdXA7CisJaW50IG5ld19pbnRlcmZhY2UgPSAoJ1wwJyA9PSBocC0+aW50ZXJmYWNlX2lkKSA/IDAgOiAxOworCisJaWYgKChTR19EWEZFUl9VTktOT1dOID09IGR4ZmVyX2RpcikgfHwgKFNHX0RYRkVSX1RPX0RFViA9PSBkeGZlcl9kaXIpIHx8CisJICAgIChTR19EWEZFUl9UT19GUk9NX0RFViA9PSBkeGZlcl9kaXIpKSB7CisJCW51bV94ZmVyID0gKGludCkgKG5ld19pbnRlcmZhY2UgPyBocC0+ZHhmZXJfbGVuIDogaHAtPmZsYWdzKTsKKwkJaWYgKHNjaHAtPmJ1ZmZsZW4gPCBudW1feGZlcikKKwkJCW51bV94ZmVyID0gc2NocC0+YnVmZmxlbjsKKwl9CisJaWYgKChudW1feGZlciA8PSAwKSB8fCAoc2NocC0+ZGlvX2luX3VzZSkgfHwKKwkgICAgKG5ld19pbnRlcmZhY2UKKwkgICAgICYmICgoU0dfRkxBR19OT19EWEZFUiB8IFNHX0ZMQUdfTU1BUF9JTykgJiBocC0+ZmxhZ3MpKSkKKwkJcmV0dXJuIDA7CisKKwlTQ1NJX0xPR19USU1FT1VUKDQsIHByaW50aygic2dfd3JpdGVfeGZlcjogbnVtX3hmZXI9JWQsIGlvdmVjX2NvdW50PSVkLCBrX3VzZV9zZz0lZFxuIiwKKwkJCSAgbnVtX3hmZXIsIGlvdmVjX2NvdW50LCBzY2hwLT5rX3VzZV9zZykpOworCWlmIChpb3ZlY19jb3VudCkgeworCQlvbnVtID0gaW92ZWNfY291bnQ7CisJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBocC0+ZHhmZXJwLCBTWl9TR19JT1ZFQyAqIG9udW0pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfSBlbHNlCisJCW9udW0gPSAxOworCisJaWYgKDAgPT0gc2NocC0+a191c2Vfc2cpIHsJLyoga2VybmVsIGhhcyBzaW5nbGUgYnVmZmVyICovCisJCWZvciAoaiA9IDAsIHAgPSBzY2hwLT5idWZmZXI7IGogPCBvbnVtOyArK2opIHsKKwkJCXJlcyA9IHNnX3VfaW92ZWMoaHAsIGlvdmVjX2NvdW50LCBqLCAxLCAmdXNnbGVuLCAmdXApOworCQkJaWYgKHJlcykKKwkJCQlyZXR1cm4gcmVzOworCQkJdXNnbGVuID0gKG51bV94ZmVyID4gdXNnbGVuKSA/IHVzZ2xlbiA6IG51bV94ZmVyOworCQkJaWYgKF9fY29weV9mcm9tX3VzZXIocCwgdXAsIHVzZ2xlbikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwICs9IHVzZ2xlbjsKKwkJCW51bV94ZmVyIC09IHVzZ2xlbjsKKwkJCWlmIChudW1feGZlciA8PSAwKQorCQkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsJCS8qIGtlcm5lbCB1c2luZyBzY2F0dGVyIGdhdGhlciBsaXN0ICovCisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2NscCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgc2NocC0+YnVmZmVyOworCisJCWtzZ2xlbiA9IChpbnQpIHNjbHAtPmxlbmd0aDsKKwkJcCA9IHNnX3NjYXRnMnZpcnQoc2NscCk7CisJCWZvciAoaiA9IDAsIGsgPSAwOyBqIDwgb251bTsgKytqKSB7CisJCQlyZXMgPSBzZ191X2lvdmVjKGhwLCBpb3ZlY19jb3VudCwgaiwgMSwgJnVzZ2xlbiwgJnVwKTsKKwkJCWlmIChyZXMpCisJCQkJcmV0dXJuIHJlczsKKworCQkJZm9yICg7IHA7ICsrc2NscCwga3NnbGVuID0gKGludCkgc2NscC0+bGVuZ3RoLAorCQkJCSAgcCA9IHNnX3NjYXRnMnZpcnQoc2NscCkpIHsKKwkJCQlpZiAodXNnbGVuIDw9IDApCisJCQkJCWJyZWFrOworCQkJCWlmIChrc2dsZW4gPiB1c2dsZW4pIHsKKwkJCQkJaWYgKHVzZ2xlbiA+PSBudW1feGZlcikgeworCQkJCQkJaWYgKF9fY29weV9mcm9tX3VzZXIKKwkJCQkJCSAgICAocCwgdXAsIG51bV94ZmVyKSkKKwkJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJCWlmIChfX2NvcHlfZnJvbV91c2VyKHAsIHVwLCB1c2dsZW4pKQorCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCXAgKz0gdXNnbGVuOworCQkJCQlrc2dsZW4gLT0gdXNnbGVuOworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoa3NnbGVuID49IG51bV94ZmVyKSB7CisJCQkJCQlpZiAoX19jb3B5X2Zyb21fdXNlcgorCQkJCQkJICAgIChwLCB1cCwgbnVtX3hmZXIpKQorCQkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQkJaWYgKF9fY29weV9mcm9tX3VzZXIocCwgdXAsIGtzZ2xlbikpCisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJdXAgKz0ga3NnbGVuOworCQkJCQl1c2dsZW4gLT0ga3NnbGVuOworCQkJCX0KKwkJCQkrK2s7CisJCQkJaWYgKGsgPj0gc2NocC0+a191c2Vfc2cpCisJCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzZ191X2lvdmVjKHNnX2lvX2hkcl90ICogaHAsIGludCBzZ19udW0sIGludCBpbmQsCisJICAgaW50IHdyX3hmLCBpbnQgKmNvdW50cCwgdW5zaWduZWQgY2hhciBfX3VzZXIgKip1cCkKK3sKKwlpbnQgbnVtX3hmZXIgPSAoaW50KSBocC0+ZHhmZXJfbGVuOworCXVuc2lnbmVkIGNoYXIgX191c2VyICpwID0gaHAtPmR4ZmVycDsKKwlpbnQgY291bnQ7CisKKwlpZiAoMCA9PSBzZ19udW0pIHsKKwkJaWYgKHdyX3hmICYmICgnXDAnID09IGhwLT5pbnRlcmZhY2VfaWQpKQorCQkJY291bnQgPSAoaW50KSBocC0+ZmxhZ3M7CS8qIGhvbGRzICJvbGQiIGlucHV0X3NpemUgKi8KKwkJZWxzZQorCQkJY291bnQgPSBudW1feGZlcjsKKwl9IGVsc2UgeworCQlzZ19pb3ZlY190IGlvdmVjOworCQlpZiAoX19jb3B5X2Zyb21fdXNlcigmaW92ZWMsIHAgKyBpbmQqU1pfU0dfSU9WRUMsIFNaX1NHX0lPVkVDKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwID0gaW92ZWMuaW92X2Jhc2U7CisJCWNvdW50ID0gKGludCkgaW92ZWMuaW92X2xlbjsKKwl9CisJaWYgKCFhY2Nlc3Nfb2sod3JfeGYgPyBWRVJJRllfUkVBRCA6IFZFUklGWV9XUklURSwgcCwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAodXApCisJCSp1cCA9IHA7CisJaWYgKGNvdW50cCkKKwkJKmNvdW50cCA9IGNvdW50OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc2dfcmVtb3ZlX3NjYXQoU2dfc2NhdHRlcl9ob2xkICogc2NocCkKK3sKKwlTQ1NJX0xPR19USU1FT1VUKDQsIHByaW50aygic2dfcmVtb3ZlX3NjYXQ6IGtfdXNlX3NnPSVkXG4iLCBzY2hwLT5rX3VzZV9zZykpOworCWlmIChzY2hwLT5idWZmZXIgJiYgKHNjaHAtPnNnbGlzdF9sZW4gPiAwKSkgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNjbHAgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIHNjaHAtPmJ1ZmZlcjsKKworCQlpZiAoc2NocC0+ZGlvX2luX3VzZSkgeworI2lmZGVmIFNHX0FMTE9XX0RJT19DT0RFCisJCQlzdF91bm1hcF91c2VyX3BhZ2VzKHNjbHAsIHNjaHAtPmtfdXNlX3NnLCBUUlVFKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJaW50IGs7CisKKwkJCWZvciAoayA9IDA7IChrIDwgc2NocC0+a191c2Vfc2cpICYmIHNnX3NjYXRnMnZpcnQoc2NscCk7CisJCQkgICAgICsraywgKytzY2xwKSB7CisJCQkJU0NTSV9MT0dfVElNRU9VVCg1LCBwcmludGsoCisJCQkJICAgICJzZ19yZW1vdmVfc2NhdDogaz0lZCwgYT0weCVwLCBsZW49JWRcbiIsCisJCQkJICAgIGssIHNnX3NjYXRnMnZpcnQoc2NscCksIHNjbHAtPmxlbmd0aCkpOworCQkJCXNnX3BhZ2VfZnJlZShzZ19zY2F0ZzJ2aXJ0KHNjbHApLCBzY2xwLT5sZW5ndGgpOworCQkJCXNjbHAtPnBhZ2UgPSBOVUxMOworCQkJCXNjbHAtPm9mZnNldCA9IDA7CisJCQkJc2NscC0+bGVuZ3RoID0gMDsKKwkJCX0KKwkJfQorCQlzZ19wYWdlX2ZyZWUoc2NocC0+YnVmZmVyLCBzY2hwLT5zZ2xpc3RfbGVuKTsKKwl9IGVsc2UgaWYgKHNjaHAtPmJ1ZmZlcikKKwkJc2dfcGFnZV9mcmVlKHNjaHAtPmJ1ZmZlciwgc2NocC0+Yl9tYWxsb2NfbGVuKTsKKwltZW1zZXQoc2NocCwgMCwgc2l6ZW9mICgqc2NocCkpOworfQorCitzdGF0aWMgaW50CitzZ19yZWFkX3hmZXIoU2dfcmVxdWVzdCAqIHNycCkKK3sKKwlzZ19pb19oZHJfdCAqaHAgPSAmc3JwLT5oZWFkZXI7CisJU2dfc2NhdHRlcl9ob2xkICpzY2hwID0gJnNycC0+ZGF0YTsKKwlpbnQgbnVtX3hmZXIgPSAwOworCWludCBqLCBrLCBvbnVtLCB1c2dsZW4sIGtzZ2xlbiwgcmVzOworCWludCBpb3ZlY19jb3VudCA9IChpbnQpIGhwLT5pb3ZlY19jb3VudDsKKwlpbnQgZHhmZXJfZGlyID0gaHAtPmR4ZmVyX2RpcmVjdGlvbjsKKwl1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGNoYXIgX191c2VyICp1cDsKKwlpbnQgbmV3X2ludGVyZmFjZSA9ICgnXDAnID09IGhwLT5pbnRlcmZhY2VfaWQpID8gMCA6IDE7CisKKwlpZiAoKFNHX0RYRkVSX1VOS05PV04gPT0gZHhmZXJfZGlyKSB8fCAoU0dfRFhGRVJfRlJPTV9ERVYgPT0gZHhmZXJfZGlyKQorCSAgICB8fCAoU0dfRFhGRVJfVE9fRlJPTV9ERVYgPT0gZHhmZXJfZGlyKSkgeworCQludW1feGZlciA9IGhwLT5keGZlcl9sZW47CisJCWlmIChzY2hwLT5idWZmbGVuIDwgbnVtX3hmZXIpCisJCQludW1feGZlciA9IHNjaHAtPmJ1ZmZsZW47CisJfQorCWlmICgobnVtX3hmZXIgPD0gMCkgfHwgKHNjaHAtPmRpb19pbl91c2UpIHx8CisJICAgIChuZXdfaW50ZXJmYWNlCisJICAgICAmJiAoKFNHX0ZMQUdfTk9fRFhGRVIgfCBTR19GTEFHX01NQVBfSU8pICYgaHAtPmZsYWdzKSkpCisJCXJldHVybiAwOworCisJU0NTSV9MT0dfVElNRU9VVCg0LCBwcmludGsoInNnX3JlYWRfeGZlcjogbnVtX3hmZXI9JWQsIGlvdmVjX2NvdW50PSVkLCBrX3VzZV9zZz0lZFxuIiwKKwkJCSAgbnVtX3hmZXIsIGlvdmVjX2NvdW50LCBzY2hwLT5rX3VzZV9zZykpOworCWlmIChpb3ZlY19jb3VudCkgeworCQlvbnVtID0gaW92ZWNfY291bnQ7CisJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBocC0+ZHhmZXJwLCBTWl9TR19JT1ZFQyAqIG9udW0pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfSBlbHNlCisJCW9udW0gPSAxOworCisJaWYgKDAgPT0gc2NocC0+a191c2Vfc2cpIHsJLyoga2VybmVsIGhhcyBzaW5nbGUgYnVmZmVyICovCisJCWZvciAoaiA9IDAsIHAgPSBzY2hwLT5idWZmZXI7IGogPCBvbnVtOyArK2opIHsKKwkJCXJlcyA9IHNnX3VfaW92ZWMoaHAsIGlvdmVjX2NvdW50LCBqLCAwLCAmdXNnbGVuLCAmdXApOworCQkJaWYgKHJlcykKKwkJCQlyZXR1cm4gcmVzOworCQkJdXNnbGVuID0gKG51bV94ZmVyID4gdXNnbGVuKSA/IHVzZ2xlbiA6IG51bV94ZmVyOworCQkJaWYgKF9fY29weV90b191c2VyKHVwLCBwLCB1c2dsZW4pKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcCArPSB1c2dsZW47CisJCQludW1feGZlciAtPSB1c2dsZW47CisJCQlpZiAobnVtX3hmZXIgPD0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CQkvKiBrZXJuZWwgdXNpbmcgc2NhdHRlciBnYXRoZXIgbGlzdCAqLworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNjbHAgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIHNjaHAtPmJ1ZmZlcjsKKworCQlrc2dsZW4gPSAoaW50KSBzY2xwLT5sZW5ndGg7CisJCXAgPSBzZ19zY2F0ZzJ2aXJ0KHNjbHApOworCQlmb3IgKGogPSAwLCBrID0gMDsgaiA8IG9udW07ICsraikgeworCQkJcmVzID0gc2dfdV9pb3ZlYyhocCwgaW92ZWNfY291bnQsIGosIDAsICZ1c2dsZW4sICZ1cCk7CisJCQlpZiAocmVzKQorCQkJCXJldHVybiByZXM7CisKKwkJCWZvciAoOyBwOyArK3NjbHAsIGtzZ2xlbiA9IChpbnQpIHNjbHAtPmxlbmd0aCwKKwkJCQkgIHAgPSBzZ19zY2F0ZzJ2aXJ0KHNjbHApKSB7CisJCQkJaWYgKHVzZ2xlbiA8PSAwKQorCQkJCQlicmVhazsKKwkJCQlpZiAoa3NnbGVuID4gdXNnbGVuKSB7CisJCQkJCWlmICh1c2dsZW4gPj0gbnVtX3hmZXIpIHsKKwkJCQkJCWlmIChfX2NvcHlfdG9fdXNlcgorCQkJCQkJICAgICh1cCwgcCwgbnVtX3hmZXIpKQorCQkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQkJaWYgKF9fY29weV90b191c2VyKHVwLCBwLCB1c2dsZW4pKQorCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCXAgKz0gdXNnbGVuOworCQkJCQlrc2dsZW4gLT0gdXNnbGVuOworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoa3NnbGVuID49IG51bV94ZmVyKSB7CisJCQkJCQlpZiAoX19jb3B5X3RvX3VzZXIKKwkJCQkJCSAgICAodXAsIHAsIG51bV94ZmVyKSkKKwkJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJCWlmIChfX2NvcHlfdG9fdXNlcih1cCwgcCwga3NnbGVuKSkKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl1cCArPSBrc2dsZW47CisJCQkJCXVzZ2xlbiAtPSBrc2dsZW47CisJCQkJfQorCQkJCSsrazsKKwkJCQlpZiAoayA+PSBzY2hwLT5rX3VzZV9zZykKKwkJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NnX3JlYWRfb3hmZXIoU2dfcmVxdWVzdCAqIHNycCwgY2hhciBfX3VzZXIgKm91dHAsIGludCBudW1fcmVhZF94ZmVyKQoreworCVNnX3NjYXR0ZXJfaG9sZCAqc2NocCA9ICZzcnAtPmRhdGE7CisKKwlTQ1NJX0xPR19USU1FT1VUKDQsIHByaW50aygic2dfcmVhZF9veGZlcjogbnVtX3JlYWRfeGZlcj0lZFxuIiwKKwkJCQkgICBudW1fcmVhZF94ZmVyKSk7CisJaWYgKCghb3V0cCkgfHwgKG51bV9yZWFkX3hmZXIgPD0gMCkpCisJCXJldHVybiAwOworCWlmIChzY2hwLT5rX3VzZV9zZyA+IDApIHsKKwkJaW50IGssIG51bTsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzY2xwID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBzY2hwLT5idWZmZXI7CisKKwkJZm9yIChrID0gMDsgKGsgPCBzY2hwLT5rX3VzZV9zZykgJiYgc2dfc2NhdGcydmlydChzY2xwKTsKKwkJICAgICArK2ssICsrc2NscCkgeworCQkJbnVtID0gKGludCkgc2NscC0+bGVuZ3RoOworCQkJaWYgKG51bSA+IG51bV9yZWFkX3hmZXIpIHsKKwkJCQlpZiAoX19jb3B5X3RvX3VzZXIKKwkJCQkgICAgKG91dHAsIHNnX3NjYXRnMnZpcnQoc2NscCksIG51bV9yZWFkX3hmZXIpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKF9fY29weV90b191c2VyCisJCQkJICAgIChvdXRwLCBzZ19zY2F0ZzJ2aXJ0KHNjbHApLCBudW0pKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQludW1fcmVhZF94ZmVyIC09IG51bTsKKwkJCQlpZiAobnVtX3JlYWRfeGZlciA8PSAwKQorCQkJCQlicmVhazsKKwkJCQlvdXRwICs9IG51bTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChfX2NvcHlfdG9fdXNlcihvdXRwLCBzY2hwLT5idWZmZXIsIG51bV9yZWFkX3hmZXIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc2dfYnVpbGRfcmVzZXJ2ZShTZ19mZCAqIHNmcCwgaW50IHJlcV9zaXplKQoreworCVNnX3NjYXR0ZXJfaG9sZCAqc2NocCA9ICZzZnAtPnJlc2VydmU7CisKKwlTQ1NJX0xPR19USU1FT1VUKDQsIHByaW50aygic2dfYnVpbGRfcmVzZXJ2ZTogcmVxX3NpemU9JWRcbiIsIHJlcV9zaXplKSk7CisJZG8geworCQlpZiAocmVxX3NpemUgPCBQQUdFX1NJWkUpCisJCQlyZXFfc2l6ZSA9IFBBR0VfU0laRTsKKwkJaWYgKDAgPT0gc2dfYnVpbGRfaW5kaXJlY3Qoc2NocCwgc2ZwLCByZXFfc2l6ZSkpCisJCQlyZXR1cm47CisJCWVsc2UKKwkJCXNnX3JlbW92ZV9zY2F0KHNjaHApOworCQlyZXFfc2l6ZSA+Pj0gMTsJLyogZGl2aWRlIGJ5IDIgKi8KKwl9IHdoaWxlIChyZXFfc2l6ZSA+IChQQUdFX1NJWkUgLyAyKSk7Cit9CisKK3N0YXRpYyB2b2lkCitzZ19saW5rX3Jlc2VydmUoU2dfZmQgKiBzZnAsIFNnX3JlcXVlc3QgKiBzcnAsIGludCBzaXplKQoreworCVNnX3NjYXR0ZXJfaG9sZCAqcmVxX3NjaHAgPSAmc3JwLT5kYXRhOworCVNnX3NjYXR0ZXJfaG9sZCAqcnN2X3NjaHAgPSAmc2ZwLT5yZXNlcnZlOworCisJc3JwLT5yZXNfdXNlZCA9IDE7CisJU0NTSV9MT0dfVElNRU9VVCg0LCBwcmludGsoInNnX2xpbmtfcmVzZXJ2ZTogc2l6ZT0lZFxuIiwgc2l6ZSkpOworCXNpemUgPSAoc2l6ZSArIDEpICYgKH4xKTsJLyogcm91bmQgdG8gZXZlbiBmb3IgYWhhMTU0MiAqLworCWlmIChyc3Zfc2NocC0+a191c2Vfc2cgPiAwKSB7CisJCWludCBrLCBudW07CisJCWludCByZW0gPSBzaXplOworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNjbHAgPQorCQkgICAgKHN0cnVjdCBzY2F0dGVybGlzdCAqKSByc3Zfc2NocC0+YnVmZmVyOworCisJCWZvciAoayA9IDA7IGsgPCByc3Zfc2NocC0+a191c2Vfc2c7ICsraywgKytzY2xwKSB7CisJCQludW0gPSAoaW50KSBzY2xwLT5sZW5ndGg7CisJCQlpZiAocmVtIDw9IG51bSkgeworCQkJCWlmICgwID09IGspIHsKKwkJCQkJcmVxX3NjaHAtPmtfdXNlX3NnID0gMDsKKwkJCQkJcmVxX3NjaHAtPmJ1ZmZlciA9IHNnX3NjYXRnMnZpcnQoc2NscCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2ZwLT5zYXZlX3NjYXRfbGVuID0gbnVtOworCQkJCQlzY2xwLT5sZW5ndGggPSAodW5zaWduZWQpIHJlbTsKKwkJCQkJcmVxX3NjaHAtPmtfdXNlX3NnID0gayArIDE7CisJCQkJCXJlcV9zY2hwLT5zZ2xpc3RfbGVuID0KKwkJCQkJICAgIHJzdl9zY2hwLT5zZ2xpc3RfbGVuOworCQkJCQlyZXFfc2NocC0+YnVmZmVyID0gcnN2X3NjaHAtPmJ1ZmZlcjsKKwkJCQl9CisJCQkJcmVxX3NjaHAtPmJ1ZmZsZW4gPSBzaXplOworCQkJCXJlcV9zY2hwLT5iX21hbGxvY19sZW4gPSByc3Zfc2NocC0+Yl9tYWxsb2NfbGVuOworCQkJCWJyZWFrOworCQkJfSBlbHNlCisJCQkJcmVtIC09IG51bTsKKwkJfQorCQlpZiAoayA+PSByc3Zfc2NocC0+a191c2Vfc2cpCisJCQlTQ1NJX0xPR19USU1FT1VUKDEsIHByaW50aygic2dfbGlua19yZXNlcnZlOiBCQUQgc2l6ZVxuIikpOworCX0gZWxzZSB7CisJCXJlcV9zY2hwLT5rX3VzZV9zZyA9IDA7CisJCXJlcV9zY2hwLT5idWZmbGVuID0gc2l6ZTsKKwkJcmVxX3NjaHAtPmJ1ZmZlciA9IHJzdl9zY2hwLT5idWZmZXI7CisJCXJlcV9zY2hwLT5iX21hbGxvY19sZW4gPSByc3Zfc2NocC0+Yl9tYWxsb2NfbGVuOworCX0KK30KKworc3RhdGljIHZvaWQKK3NnX3VubGlua19yZXNlcnZlKFNnX2ZkICogc2ZwLCBTZ19yZXF1ZXN0ICogc3JwKQoreworCVNnX3NjYXR0ZXJfaG9sZCAqcmVxX3NjaHAgPSAmc3JwLT5kYXRhOworCVNnX3NjYXR0ZXJfaG9sZCAqcnN2X3NjaHAgPSAmc2ZwLT5yZXNlcnZlOworCisJU0NTSV9MT0dfVElNRU9VVCg0LCBwcmludGsoInNnX3VubGlua19yZXNlcnZlOiByZXEtPmtfdXNlX3NnPSVkXG4iLAorCQkJCSAgIChpbnQpIHJlcV9zY2hwLT5rX3VzZV9zZykpOworCWlmICgocnN2X3NjaHAtPmtfdXNlX3NnID4gMCkgJiYgKHJlcV9zY2hwLT5rX3VzZV9zZyA+IDApKSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2NscCA9CisJCSAgICAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIHJzdl9zY2hwLT5idWZmZXI7CisKKwkJaWYgKHNmcC0+c2F2ZV9zY2F0X2xlbiA+IDApCisJCQkoc2NscCArIChyZXFfc2NocC0+a191c2Vfc2cgLSAxKSktPmxlbmd0aCA9CisJCQkgICAgKHVuc2lnbmVkKSBzZnAtPnNhdmVfc2NhdF9sZW47CisJCWVsc2UKKwkJCVNDU0lfTE9HX1RJTUVPVVQoMSwgcHJpbnRrICgic2dfdW5saW5rX3Jlc2VydmU6IEJBRCBzYXZlX3NjYXRfbGVuXG4iKSk7CisJfQorCXJlcV9zY2hwLT5rX3VzZV9zZyA9IDA7CisJcmVxX3NjaHAtPmJ1ZmZsZW4gPSAwOworCXJlcV9zY2hwLT5idWZmZXIgPSBOVUxMOworCXJlcV9zY2hwLT5zZ2xpc3RfbGVuID0gMDsKKwlzZnAtPnNhdmVfc2NhdF9sZW4gPSAwOworCXNycC0+cmVzX3VzZWQgPSAwOworfQorCitzdGF0aWMgU2dfcmVxdWVzdCAqCitzZ19nZXRfcnFfbWFyayhTZ19mZCAqIHNmcCwgaW50IHBhY2tfaWQpCit7CisJU2dfcmVxdWVzdCAqcmVzcDsKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmc2ZwLT5ycV9saXN0X2xvY2ssIGlmbGFncyk7CisJZm9yIChyZXNwID0gc2ZwLT5oZWFkcnA7IHJlc3A7IHJlc3AgPSByZXNwLT5uZXh0cnApIHsKKwkJLyogbG9vayBmb3IgcmVxdWVzdHMgdGhhdCBhcmUgcmVhZHkgKyBub3QgU0dfSU8gb3duZWQgKi8KKwkJaWYgKCgxID09IHJlc3AtPmRvbmUpICYmICghcmVzcC0+c2dfaW9fb3duZWQpICYmCisJCSAgICAoKC0xID09IHBhY2tfaWQpIHx8IChyZXNwLT5oZWFkZXIucGFja19pZCA9PSBwYWNrX2lkKSkpIHsKKwkJCXJlc3AtPmRvbmUgPSAyOwkvKiBndWFyZCBhZ2FpbnN0IG90aGVyIHJlYWRlcnMgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZzZnAtPnJxX2xpc3RfbG9jaywgaWZsYWdzKTsKKwlyZXR1cm4gcmVzcDsKK30KKworI2lmZGVmIENPTkZJR19TQ1NJX1BST0NfRlMKK3N0YXRpYyBTZ19yZXF1ZXN0ICoKK3NnX2dldF9udGhfcmVxdWVzdChTZ19mZCAqIHNmcCwgaW50IG50aCkKK3sKKwlTZ19yZXF1ZXN0ICpyZXNwOworCXVuc2lnbmVkIGxvbmcgaWZsYWdzOworCWludCBrOworCisJcmVhZF9sb2NrX2lycXNhdmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCWZvciAoayA9IDAsIHJlc3AgPSBzZnAtPmhlYWRycDsgcmVzcCAmJiAoayA8IG50aCk7CisJICAgICArK2ssIHJlc3AgPSByZXNwLT5uZXh0cnApIDsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZzZnAtPnJxX2xpc3RfbG9jaywgaWZsYWdzKTsKKwlyZXR1cm4gcmVzcDsKK30KKyNlbmRpZgorCisvKiBhbHdheXMgYWRkcyB0byBlbmQgb2YgbGlzdCAqLworc3RhdGljIFNnX3JlcXVlc3QgKgorc2dfYWRkX3JlcXVlc3QoU2dfZmQgKiBzZnApCit7CisJaW50IGs7CisJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CisJU2dfcmVxdWVzdCAqcmVzcDsKKwlTZ19yZXF1ZXN0ICpycCA9IHNmcC0+cmVxX2FycjsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmc2ZwLT5ycV9saXN0X2xvY2ssIGlmbGFncyk7CisJcmVzcCA9IHNmcC0+aGVhZHJwOworCWlmICghcmVzcCkgeworCQltZW1zZXQocnAsIDAsIHNpemVvZiAoU2dfcmVxdWVzdCkpOworCQlycC0+cGFyZW50ZnAgPSBzZnA7CisJCXJlc3AgPSBycDsKKwkJc2ZwLT5oZWFkcnAgPSByZXNwOworCX0gZWxzZSB7CisJCWlmICgwID09IHNmcC0+Y21kX3EpCisJCQlyZXNwID0gTlVMTDsJLyogY29tbWFuZCBxdWV1aW5nIGRpc2FsbG93ZWQgKi8KKwkJZWxzZSB7CisJCQlmb3IgKGsgPSAwOyBrIDwgU0dfTUFYX1FVRVVFOyArK2ssICsrcnApIHsKKwkJCQlpZiAoIXJwLT5wYXJlbnRmcCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoayA8IFNHX01BWF9RVUVVRSkgeworCQkJCW1lbXNldChycCwgMCwgc2l6ZW9mIChTZ19yZXF1ZXN0KSk7CisJCQkJcnAtPnBhcmVudGZwID0gc2ZwOworCQkJCXdoaWxlIChyZXNwLT5uZXh0cnApCisJCQkJCXJlc3AgPSByZXNwLT5uZXh0cnA7CisJCQkJcmVzcC0+bmV4dHJwID0gcnA7CisJCQkJcmVzcCA9IHJwOworCQkJfSBlbHNlCisJCQkJcmVzcCA9IE5VTEw7CisJCX0KKwl9CisJaWYgKHJlc3ApIHsKKwkJcmVzcC0+bmV4dHJwID0gTlVMTDsKKwkJcmVzcC0+aGVhZGVyLmR1cmF0aW9uID0gamlmZmllczsKKwkJcmVzcC0+bXlfY21kcCA9IE5VTEw7CisJfQorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZzZnAtPnJxX2xpc3RfbG9jaywgaWZsYWdzKTsKKwlyZXR1cm4gcmVzcDsKK30KKworLyogUmV0dXJuIG9mIDEgZm9yIGZvdW5kOyAwIGZvciBub3QgZm91bmQgKi8KK3N0YXRpYyBpbnQKK3NnX3JlbW92ZV9yZXF1ZXN0KFNnX2ZkICogc2ZwLCBTZ19yZXF1ZXN0ICogc3JwKQoreworCVNnX3JlcXVlc3QgKnByZXZfcnA7CisJU2dfcmVxdWVzdCAqcnA7CisJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CisJaW50IHJlcyA9IDA7CisKKwlpZiAoKCFzZnApIHx8ICghc3JwKSB8fCAoIXNmcC0+aGVhZHJwKSkKKwkJcmV0dXJuIHJlczsKKwl3cml0ZV9sb2NrX2lycXNhdmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCXByZXZfcnAgPSBzZnAtPmhlYWRycDsKKwlpZiAoc3JwID09IHByZXZfcnApIHsKKwkJc2ZwLT5oZWFkcnAgPSBwcmV2X3JwLT5uZXh0cnA7CisJCXByZXZfcnAtPnBhcmVudGZwID0gTlVMTDsKKwkJcmVzID0gMTsKKwl9IGVsc2UgeworCQl3aGlsZSAoKHJwID0gcHJldl9ycC0+bmV4dHJwKSkgeworCQkJaWYgKHNycCA9PSBycCkgeworCQkJCXByZXZfcnAtPm5leHRycCA9IHJwLT5uZXh0cnA7CisJCQkJcnAtPnBhcmVudGZwID0gTlVMTDsKKwkJCQlyZXMgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJcHJldl9ycCA9IHJwOworCQl9CisJfQorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZzZnAtPnJxX2xpc3RfbG9jaywgaWZsYWdzKTsKKwlyZXR1cm4gcmVzOworfQorCisjaWZkZWYgQ09ORklHX1NDU0lfUFJPQ19GUworc3RhdGljIFNnX2ZkICoKK3NnX2dldF9udGhfc2ZwKFNnX2RldmljZSAqIHNkcCwgaW50IG50aCkKK3sKKwlTZ19mZCAqcmVzcDsKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKwlpbnQgazsKKworCXJlYWRfbG9ja19pcnFzYXZlKCZzZ19kZXZfYXJyX2xvY2ssIGlmbGFncyk7CisJZm9yIChrID0gMCwgcmVzcCA9IHNkcC0+aGVhZGZwOyByZXNwICYmIChrIDwgbnRoKTsKKwkgICAgICsraywgcmVzcCA9IHJlc3AtPm5leHRmcCkgOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnNnX2Rldl9hcnJfbG9jaywgaWZsYWdzKTsKKwlyZXR1cm4gcmVzcDsKK30KKyNlbmRpZgorCitzdGF0aWMgU2dfZmQgKgorc2dfYWRkX3NmcChTZ19kZXZpY2UgKiBzZHAsIGludCBkZXYpCit7CisJU2dfZmQgKnNmcDsKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKworCXNmcCA9IChTZ19mZCAqKSBzZ19wYWdlX21hbGxvYyhzaXplb2YgKFNnX2ZkKSwgMCwgTlVMTCk7CisJaWYgKCFzZnApCisJCXJldHVybiBOVUxMOworCW1lbXNldChzZnAsIDAsIHNpemVvZiAoU2dfZmQpKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZnAtPnJlYWRfd2FpdCk7CisJcndsb2NrX2luaXQoJnNmcC0+cnFfbGlzdF9sb2NrKTsKKworCXNmcC0+dGltZW91dCA9IFNHX0RFRkFVTFRfVElNRU9VVDsKKwlzZnAtPnRpbWVvdXRfdXNlciA9IFNHX0RFRkFVTFRfVElNRU9VVF9VU0VSOworCXNmcC0+Zm9yY2VfcGFja2lkID0gU0dfREVGX0ZPUkNFX1BBQ0tfSUQ7CisJc2ZwLT5sb3dfZG1hID0gKFNHX0RFRl9GT1JDRV9MT1dfRE1BID09IDApID8KKwkgICAgc2RwLT5kZXZpY2UtPmhvc3QtPnVuY2hlY2tlZF9pc2FfZG1hIDogMTsKKwlzZnAtPmNtZF9xID0gU0dfREVGX0NPTU1BTkRfUTsKKwlzZnAtPmtlZXBfb3JwaGFuID0gU0dfREVGX0tFRVBfT1JQSEFOOworCXNmcC0+cGFyZW50ZHAgPSBzZHA7CisJd3JpdGVfbG9ja19pcnFzYXZlKCZzZ19kZXZfYXJyX2xvY2ssIGlmbGFncyk7CisJaWYgKCFzZHAtPmhlYWRmcCkKKwkJc2RwLT5oZWFkZnAgPSBzZnA7CisJZWxzZSB7CQkJLyogYWRkIHRvIHRhaWwgb2YgZXhpc3RpbmcgbGlzdCAqLworCQlTZ19mZCAqcGZwID0gc2RwLT5oZWFkZnA7CisJCXdoaWxlIChwZnAtPm5leHRmcCkKKwkJCXBmcCA9IHBmcC0+bmV4dGZwOworCQlwZnAtPm5leHRmcCA9IHNmcDsKKwl9CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnNnX2Rldl9hcnJfbG9jaywgaWZsYWdzKTsKKwlTQ1NJX0xPR19USU1FT1VUKDMsIHByaW50aygic2dfYWRkX3NmcDogc2ZwPTB4JXBcbiIsIHNmcCkpOworCXNnX2J1aWxkX3Jlc2VydmUoc2ZwLCBzZ19iaWdfYnVmZik7CisJU0NTSV9MT0dfVElNRU9VVCgzLCBwcmludGsoInNnX2FkZF9zZnA6ICAgYnVmZmxlbj0lZCwga191c2Vfc2c9JWRcbiIsCisJCQkgICBzZnAtPnJlc2VydmUuYnVmZmxlbiwgc2ZwLT5yZXNlcnZlLmtfdXNlX3NnKSk7CisJcmV0dXJuIHNmcDsKK30KKworc3RhdGljIHZvaWQKK19fc2dfcmVtb3ZlX3NmcChTZ19kZXZpY2UgKiBzZHAsIFNnX2ZkICogc2ZwKQoreworCVNnX2ZkICpmcDsKKwlTZ19mZCAqcHJldl9mcDsKKworCXByZXZfZnAgPSBzZHAtPmhlYWRmcDsKKwlpZiAoc2ZwID09IHByZXZfZnApCisJCXNkcC0+aGVhZGZwID0gcHJldl9mcC0+bmV4dGZwOworCWVsc2UgeworCQl3aGlsZSAoKGZwID0gcHJldl9mcC0+bmV4dGZwKSkgeworCQkJaWYgKHNmcCA9PSBmcCkgeworCQkJCXByZXZfZnAtPm5leHRmcCA9IGZwLT5uZXh0ZnA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwcmV2X2ZwID0gZnA7CisJCX0KKwl9CisJaWYgKHNmcC0+cmVzZXJ2ZS5idWZmbGVuID4gMCkgeworCQlTQ1NJX0xPR19USU1FT1VUKDYsIAorCQkJcHJpbnRrKCJfX3NnX3JlbW92ZV9zZnA6ICAgIGJ1ZmZsZW49JWQsIGtfdXNlX3NnPSVkXG4iLAorCQkJKGludCkgc2ZwLT5yZXNlcnZlLmJ1ZmZsZW4sIChpbnQpIHNmcC0+cmVzZXJ2ZS5rX3VzZV9zZykpOworCQlpZiAoc2ZwLT5tbWFwX2NhbGxlZCkKKwkJCXNnX3JiX2NvcnJlY3Q0bW1hcCgmc2ZwLT5yZXNlcnZlLCAwKTsJLyogdW5kbyBjb3JyZWN0aW9uICovCisJCXNnX3JlbW92ZV9zY2F0KCZzZnAtPnJlc2VydmUpOworCX0KKwlzZnAtPnBhcmVudGRwID0gTlVMTDsKKwlTQ1NJX0xPR19USU1FT1VUKDYsIHByaW50aygiX19zZ19yZW1vdmVfc2ZwOiAgICBzZnA9MHglcFxuIiwgc2ZwKSk7CisJc2dfcGFnZV9mcmVlKChjaGFyICopIHNmcCwgc2l6ZW9mIChTZ19mZCkpOworfQorCisvKiBSZXR1cm5zIDAgaW4gbm9ybWFsIGNhc2UsIDEgd2hlbiBkZXRhY2hlZCBhbmQgc2RwIG9iamVjdCByZW1vdmVkICovCitzdGF0aWMgaW50CitzZ19yZW1vdmVfc2ZwKFNnX2RldmljZSAqIHNkcCwgU2dfZmQgKiBzZnApCit7CisJU2dfcmVxdWVzdCAqc3JwOworCVNnX3JlcXVlc3QgKnRzcnA7CisJaW50IGRpcnR5ID0gMDsKKwlpbnQgcmVzID0gMDsKKworCWZvciAoc3JwID0gc2ZwLT5oZWFkcnA7IHNycDsgc3JwID0gdHNycCkgeworCQl0c3JwID0gc3JwLT5uZXh0cnA7CisJCWlmIChzZ19zcnBfZG9uZShzcnAsIHNmcCkpCisJCQlzZ19maW5pc2hfcmVtX3JlcShzcnApOworCQllbHNlCisJCQkrK2RpcnR5OworCX0KKwlpZiAoMCA9PSBkaXJ0eSkgeworCQl1bnNpZ25lZCBsb25nIGlmbGFnczsKKworCQl3cml0ZV9sb2NrX2lycXNhdmUoJnNnX2Rldl9hcnJfbG9jaywgaWZsYWdzKTsKKwkJX19zZ19yZW1vdmVfc2ZwKHNkcCwgc2ZwKTsKKwkJaWYgKHNkcC0+ZGV0YWNoZWQgJiYgKE5VTEwgPT0gc2RwLT5oZWFkZnApKSB7CisJCQlpbnQgaywgbWF4ZDsKKworCQkJbWF4ZCA9IHNnX2Rldl9tYXg7CisJCQlmb3IgKGsgPSAwOyBrIDwgbWF4ZDsgKytrKSB7CisJCQkJaWYgKHNkcCA9PSBzZ19kZXZfYXJyW2tdKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChrIDwgbWF4ZCkKKwkJCQlzZ19kZXZfYXJyW2tdID0gTlVMTDsKKwkJCWtmcmVlKChjaGFyICopIHNkcCk7CisJCQlyZXMgPSAxOworCQl9CisJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZzZ19kZXZfYXJyX2xvY2ssIGlmbGFncyk7CisJfSBlbHNlIHsKKwkJLyogTU9EX0lOQydzIHRvIGluaGliaXQgdW5sb2FkaW5nIHNnIGFuZCBhc3NvY2lhdGVkIGFkYXB0ZXIgZHJpdmVyICovCisJCS8qIG9ubHkgYnVtcCB0aGUgYWNjZXNzX2NvdW50IGlmIHdlIGFjdHVhbGx5IHN1Y2NlZWRlZCBpbgorCQkgKiB0aHJvd2luZyBhbm90aGVyIGNvdW50ZXIgb24gdGhlIGhvc3QgbW9kdWxlICovCisJCXNjc2lfZGV2aWNlX2dldChzZHAtPmRldmljZSk7CS8qIFhYWDogcmV0dmFsIGlnbm9yZWQ/ICovCQorCQlzZnAtPmNsb3NlZCA9IDE7CS8qIGZsYWcgZGlydHkgc3RhdGUgb24gdGhpcyBmZCAqLworCQlTQ1NJX0xPR19USU1FT1VUKDEsIHByaW50aygic2dfcmVtb3ZlX3NmcDogd29ycmlzb21lLCAlZCB3cml0ZXMgcGVuZGluZ1xuIiwKKwkJCQkgIGRpcnR5KSk7CisJfQorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQKK3NnX3Jlc19pbl91c2UoU2dfZmQgKiBzZnApCit7CisJY29uc3QgU2dfcmVxdWVzdCAqc3JwOworCXVuc2lnbmVkIGxvbmcgaWZsYWdzOworCisJcmVhZF9sb2NrX2lycXNhdmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCWZvciAoc3JwID0gc2ZwLT5oZWFkcnA7IHNycDsgc3JwID0gc3JwLT5uZXh0cnApCisJCWlmIChzcnAtPnJlc191c2VkKQorCQkJYnJlYWs7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmc2ZwLT5ycV9saXN0X2xvY2ssIGlmbGFncyk7CisJcmV0dXJuIHNycCA/IDEgOiAwOworfQorCisvKiBJZiByZXRTenA9PU5VTEwgd2FudCBleGFjdCBzaXplIG9yIGZhaWwgKi8KK3N0YXRpYyBjaGFyICoKK3NnX3BhZ2VfbWFsbG9jKGludCBycVN6LCBpbnQgbG93RG1hLCBpbnQgKnJldFN6cCkKK3sKKwljaGFyICpyZXNwID0gTlVMTDsKKwlpbnQgcGFnZV9tYXNrOworCWludCBvcmRlciwgYV9zaXplOworCWludCByZXNTeiA9IHJxU3o7CisKKwlpZiAocnFTeiA8PSAwKQorCQlyZXR1cm4gcmVzcDsKKworCWlmIChsb3dEbWEpCisJCXBhZ2VfbWFzayA9IEdGUF9BVE9NSUMgfCBHRlBfRE1BIHwgX19HRlBfTk9XQVJOOworCWVsc2UKKwkJcGFnZV9tYXNrID0gR0ZQX0FUT01JQyB8IF9fR0ZQX05PV0FSTjsKKworCWZvciAob3JkZXIgPSAwLCBhX3NpemUgPSBQQUdFX1NJWkU7IGFfc2l6ZSA8IHJxU3o7CisJICAgICBvcmRlcisrLCBhX3NpemUgPDw9IDEpIDsKKwlyZXNwID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlcyhwYWdlX21hc2ssIG9yZGVyKTsKKwl3aGlsZSAoKCFyZXNwKSAmJiBvcmRlciAmJiByZXRTenApIHsKKwkJLS1vcmRlcjsKKwkJYV9zaXplID4+PSAxOwkvKiBkaXZpZGUgYnkgMiwgdW50aWwgUEFHRV9TSVpFICovCisJCXJlc3AgPSAoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2VzKHBhZ2VfbWFzaywgb3JkZXIpOwkvKiB0cnkgaGFsZiAqLworCQlyZXNTeiA9IGFfc2l6ZTsKKwl9CisJaWYgKHJlc3ApIHsKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8ICFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJbWVtc2V0KHJlc3AsIDAsIHJlc1N6KTsKKwkJaWYgKHJldFN6cCkKKwkJCSpyZXRTenAgPSByZXNTejsKKwl9CisJcmV0dXJuIHJlc3A7Cit9CisKK3N0YXRpYyB2b2lkCitzZ19wYWdlX2ZyZWUoY2hhciAqYnVmZiwgaW50IHNpemUpCit7CisJaW50IG9yZGVyLCBhX3NpemU7CisKKwlpZiAoIWJ1ZmYpCisJCXJldHVybjsKKwlmb3IgKG9yZGVyID0gMCwgYV9zaXplID0gUEFHRV9TSVpFOyBhX3NpemUgPCBzaXplOworCSAgICAgb3JkZXIrKywgYV9zaXplIDw8PSAxKSA7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgYnVmZiwgb3JkZXIpOworfQorCisjaWZuZGVmIE1BSU5URU5BTkNFX0lOX0NNRAorI2RlZmluZSBNQUlOVEVOQU5DRV9JTl9DTUQgMHhhMworI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFsbG93X29wc1tdID0geyBURVNUX1VOSVRfUkVBRFksIFJFUVVFU1RfU0VOU0UsCisJSU5RVUlSWSwgUkVBRF9DQVBBQ0lUWSwgUkVBRF9CVUZGRVIsIFJFQURfNiwgUkVBRF8xMCwgUkVBRF8xMiwKKwlSRUFEXzE2LCBNT0RFX1NFTlNFLCBNT0RFX1NFTlNFXzEwLCBMT0dfU0VOU0UsIFJFUE9SVF9MVU5TLAorCVNFUlZJQ0VfQUNUSU9OX0lOLCBSRUNFSVZFX0RJQUdOT1NUSUMsIFJFQURfTE9ORywgTUFJTlRFTkFOQ0VfSU5fQ01ECit9OworCitzdGF0aWMgaW50CitzZ19hbGxvd19hY2Nlc3ModW5zaWduZWQgY2hhciBvcGNvZGUsIGNoYXIgZGV2X3R5cGUpCit7CisJaW50IGs7CisKKwlpZiAoVFlQRV9TQ0FOTkVSID09IGRldl90eXBlKQkvKiBUWVBFX1JPTSBtYXliZSBidXJuZXIgKi8KKwkJcmV0dXJuIDE7CisJZm9yIChrID0gMDsgayA8IHNpemVvZiAoYWxsb3dfb3BzKTsgKytrKSB7CisJCWlmIChvcGNvZGUgPT0gYWxsb3dfb3BzW2tdKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1NDU0lfUFJPQ19GUworc3RhdGljIGludAorc2dfbGFzdF9kZXYodm9pZCkKK3sKKwlpbnQgazsKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKworCXJlYWRfbG9ja19pcnFzYXZlKCZzZ19kZXZfYXJyX2xvY2ssIGlmbGFncyk7CisJZm9yIChrID0gc2dfZGV2X21heCAtIDE7IGsgPj0gMDsgLS1rKQorCQlpZiAoc2dfZGV2X2FycltrXSAmJiBzZ19kZXZfYXJyW2tdLT5kZXZpY2UpCisJCQlicmVhazsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZzZ19kZXZfYXJyX2xvY2ssIGlmbGFncyk7CisJcmV0dXJuIGsgKyAxOwkJLyogb3JpZ2luIDEgKi8KK30KKyNlbmRpZgorCitzdGF0aWMgU2dfZGV2aWNlICoKK3NnX2dldF9kZXYoaW50IGRldikKK3sKKwlTZ19kZXZpY2UgKnNkcCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CisKKwlpZiAoc2dfZGV2X2FyciAmJiAoZGV2ID49IDApKSB7CisJCXJlYWRfbG9ja19pcnFzYXZlKCZzZ19kZXZfYXJyX2xvY2ssIGlmbGFncyk7CisJCWlmIChkZXYgPCBzZ19kZXZfbWF4KQorCQkJc2RwID0gc2dfZGV2X2FycltkZXZdOworCQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZzZ19kZXZfYXJyX2xvY2ssIGlmbGFncyk7CisJfQorCXJldHVybiBzZHA7Cit9CisKKyNpZmRlZiBDT05GSUdfU0NTSV9QUk9DX0ZTCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnNnX3Byb2Nfc2dwID0gTlVMTDsKKworc3RhdGljIGNoYXIgc2dfcHJvY19zZ19kaXJuYW1lW10gPSAic2NzaS9zZyI7CisKK3N0YXRpYyBpbnQgc2dfcHJvY19zZXFfc2hvd19pbnQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KTsKKworc3RhdGljIGludCBzZ19wcm9jX3NpbmdsZV9vcGVuX2FkaW8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIHNzaXplX3Qgc2dfcHJvY193cml0ZV9hZGlvKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpOworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWRpb19mb3BzID0geworCS8qIC5vd25lciwgLnJlYWQgYW5kIC5sbHNlZWsgYWRkZWQgaW4gc2dfcHJvY19pbml0KCkgKi8KKwkub3BlbiA9IHNnX3Byb2Nfc2luZ2xlX29wZW5fYWRpbywKKwkud3JpdGUgPSBzZ19wcm9jX3dyaXRlX2FkaW8sCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgc2dfcHJvY19zaW5nbGVfb3Blbl9kcmVzc3ooc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIHNzaXplX3Qgc2dfcHJvY193cml0ZV9kcmVzc3ooc3RydWN0IGZpbGUgKmZpbHAsIAorCQljb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmKTsKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRyZXNzel9mb3BzID0geworCS5vcGVuID0gc2dfcHJvY19zaW5nbGVfb3Blbl9kcmVzc3osCisJLndyaXRlID0gc2dfcHJvY193cml0ZV9kcmVzc3osCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgc2dfcHJvY19zZXFfc2hvd192ZXJzaW9uKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdik7CitzdGF0aWMgaW50IHNnX3Byb2Nfc2luZ2xlX29wZW5fdmVyc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2ZXJzaW9uX2ZvcHMgPSB7CisJLm9wZW4gPSBzZ19wcm9jX3NpbmdsZV9vcGVuX3ZlcnNpb24sCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgc2dfcHJvY19zZXFfc2hvd19kZXZoZHIoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KTsKK3N0YXRpYyBpbnQgc2dfcHJvY19zaW5nbGVfb3Blbl9kZXZoZHIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGV2aGRyX2ZvcHMgPSB7CisJLm9wZW4gPSBzZ19wcm9jX3NpbmdsZV9vcGVuX2RldmhkciwKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBzZ19wcm9jX3NlcV9zaG93X2RldihzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpOworc3RhdGljIGludCBzZ19wcm9jX29wZW5fZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyB2b2lkICogZGV2X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGxvZmZfdCAqcG9zKTsKK3N0YXRpYyB2b2lkICogZGV2X3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdiwgbG9mZl90ICpwb3MpOworc3RhdGljIHZvaWQgZGV2X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdik7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZXZfZm9wcyA9IHsKKwkub3BlbiA9IHNnX3Byb2Nfb3Blbl9kZXYsCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGRldl9zZXFfb3BzID0geworCS5zdGFydCA9IGRldl9zZXFfc3RhcnQsCisJLm5leHQgID0gZGV2X3NlcV9uZXh0LAorCS5zdG9wICA9IGRldl9zZXFfc3RvcCwKKwkuc2hvdyAgPSBzZ19wcm9jX3NlcV9zaG93X2RldiwKK307CisKK3N0YXRpYyBpbnQgc2dfcHJvY19zZXFfc2hvd19kZXZzdHJzKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdik7CitzdGF0aWMgaW50IHNnX3Byb2Nfb3Blbl9kZXZzdHJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRldnN0cnNfZm9wcyA9IHsKKwkub3BlbiA9IHNnX3Byb2Nfb3Blbl9kZXZzdHJzLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9Oworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBkZXZzdHJzX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gZGV2X3NlcV9zdGFydCwKKwkubmV4dCAgPSBkZXZfc2VxX25leHQsCisJLnN0b3AgID0gZGV2X3NlcV9zdG9wLAorCS5zaG93ICA9IHNnX3Byb2Nfc2VxX3Nob3dfZGV2c3RycywKK307CisKK3N0YXRpYyBpbnQgc2dfcHJvY19zZXFfc2hvd19kZWJ1ZyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpOworc3RhdGljIGludCBzZ19wcm9jX29wZW5fZGVidWcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdfZm9wcyA9IHsKKwkub3BlbiA9IHNnX3Byb2Nfb3Blbl9kZWJ1ZywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZGVidWdfc2VxX29wcyA9IHsKKwkuc3RhcnQgPSBkZXZfc2VxX3N0YXJ0LAorCS5uZXh0ICA9IGRldl9zZXFfbmV4dCwKKwkuc3RvcCAgPSBkZXZfc2VxX3N0b3AsCisJLnNob3cgID0gc2dfcHJvY19zZXFfc2hvd19kZWJ1ZywKK307CisKKworc3RydWN0IHNnX3Byb2NfbGVhZiB7CisJY29uc3QgY2hhciAqIG5hbWU7CisJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqIGZvcHM7Cit9OworCitzdGF0aWMgc3RydWN0IHNnX3Byb2NfbGVhZiBzZ19wcm9jX2xlYWZfYXJyW10gPSB7CisJeyJhbGxvd19kaW8iLCAmYWRpb19mb3BzfSwKKwl7ImRlYnVnIiwgJmRlYnVnX2ZvcHN9LAorCXsiZGVmX3Jlc2VydmVkX3NpemUiLCAmZHJlc3N6X2ZvcHN9LAorCXsiZGV2aWNlX2hkciIsICZkZXZoZHJfZm9wc30sCisJeyJkZXZpY2VzIiwgJmRldl9mb3BzfSwKKwl7ImRldmljZV9zdHJzIiwgJmRldnN0cnNfZm9wc30sCisJeyJ2ZXJzaW9uIiwgJnZlcnNpb25fZm9wc30KK307CisKK3N0YXRpYyBpbnQKK3NnX3Byb2NfaW5pdCh2b2lkKQoreworCWludCBrLCBtYXNrOworCWludCBudW1fbGVhdmVzID0KKwkgICAgc2l6ZW9mIChzZ19wcm9jX2xlYWZfYXJyKSAvIHNpemVvZiAoc2dfcHJvY19sZWFmX2FyclswXSk7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGVwOworCXN0cnVjdCBzZ19wcm9jX2xlYWYgKiBsZWFmOworCisJc2dfcHJvY19zZ3AgPSBjcmVhdGVfcHJvY19lbnRyeShzZ19wcm9jX3NnX2Rpcm5hbWUsCisJCQkJCVNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTywgTlVMTCk7CisJaWYgKCFzZ19wcm9jX3NncCkKKwkJcmV0dXJuIDE7CisJZm9yIChrID0gMDsgayA8IG51bV9sZWF2ZXM7ICsraykgeworCQlsZWFmID0gJnNnX3Byb2NfbGVhZl9hcnJba107CisJCW1hc2sgPSBsZWFmLT5mb3BzLT53cml0ZSA/IFNfSVJVR08gfCBTX0lXVVNSIDogU19JUlVHTzsKKwkJcGRlcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KGxlYWYtPm5hbWUsIG1hc2ssIHNnX3Byb2Nfc2dwKTsKKwkJaWYgKHBkZXApIHsKKwkJCWxlYWYtPmZvcHMtPm93bmVyID0gVEhJU19NT0RVTEUsCisJCQlsZWFmLT5mb3BzLT5yZWFkID0gc2VxX3JlYWQsCisJCQlsZWFmLT5mb3BzLT5sbHNlZWsgPSBzZXFfbHNlZWssCisJCQlwZGVwLT5wcm9jX2ZvcHMgPSBsZWFmLT5mb3BzOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc2dfcHJvY19jbGVhbnVwKHZvaWQpCit7CisJaW50IGs7CisJaW50IG51bV9sZWF2ZXMgPQorCSAgICBzaXplb2YgKHNnX3Byb2NfbGVhZl9hcnIpIC8gc2l6ZW9mIChzZ19wcm9jX2xlYWZfYXJyWzBdKTsKKworCWlmICghc2dfcHJvY19zZ3ApCisJCXJldHVybjsKKwlmb3IgKGsgPSAwOyBrIDwgbnVtX2xlYXZlczsgKytrKQorCQlyZW1vdmVfcHJvY19lbnRyeShzZ19wcm9jX2xlYWZfYXJyW2tdLm5hbWUsIHNnX3Byb2Nfc2dwKTsKKwlyZW1vdmVfcHJvY19lbnRyeShzZ19wcm9jX3NnX2Rpcm5hbWUsIE5VTEwpOworfQorCisKK3N0YXRpYyBpbnQgc2dfcHJvY19zZXFfc2hvd19pbnQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCXNlcV9wcmludGYocywgIiVkXG4iLCAqKChpbnQgKilzLT5wcml2YXRlKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2dfcHJvY19zaW5nbGVfb3Blbl9hZGlvKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzZ19wcm9jX3NlcV9zaG93X2ludCwgJnNnX2FsbG93X2Rpbyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IAorc2dfcHJvY193cml0ZV9hZGlvKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmKQoreworCWludCBudW07CisJY2hhciBidWZmWzExXTsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisJbnVtID0gKGNvdW50IDwgMTApID8gY291bnQgOiAxMDsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmZiwgYnVmZmVyLCBudW0pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlidWZmW251bV0gPSAnXDAnOworCXNnX2FsbG93X2RpbyA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZmYsIE5VTEwsIDEwKSA/IDEgOiAwOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBzZ19wcm9jX3NpbmdsZV9vcGVuX2RyZXNzeihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc2dfcHJvY19zZXFfc2hvd19pbnQsICZzZ19iaWdfYnVmZik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IAorc2dfcHJvY193cml0ZV9kcmVzc3ooc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZikKK3sKKwlpbnQgbnVtOworCXVuc2lnbmVkIGxvbmcgayA9IFVMT05HX01BWDsKKwljaGFyIGJ1ZmZbMTFdOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8ICFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQlyZXR1cm4gLUVBQ0NFUzsKKwludW0gPSAoY291bnQgPCAxMCkgPyBjb3VudCA6IDEwOworCWlmIChjb3B5X2Zyb21fdXNlcihidWZmLCBidWZmZXIsIG51bSkpCisJCXJldHVybiAtRUZBVUxUOworCWJ1ZmZbbnVtXSA9ICdcMCc7CisJayA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZmYsIE5VTEwsIDEwKTsKKwlpZiAoayA8PSAxMDQ4NTc2KSB7CS8qIGxpbWl0ICJiaWcgYnVmZiIgdG8gMSBNQiAqLworCQlzZ19iaWdfYnVmZiA9IGs7CisJCXJldHVybiBjb3VudDsKKwl9CisJcmV0dXJuIC1FUkFOR0U7Cit9CisKK3N0YXRpYyBpbnQgc2dfcHJvY19zZXFfc2hvd192ZXJzaW9uKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3sKKwlzZXFfcHJpbnRmKHMsICIlZFx0JXMgWyVzXVxuIiwgc2dfdmVyc2lvbl9udW0sIFNHX1ZFUlNJT05fU1RSLAorCQkgICBzZ192ZXJzaW9uX2RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNnX3Byb2Nfc2luZ2xlX29wZW5fdmVyc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc2dfcHJvY19zZXFfc2hvd192ZXJzaW9uLCBOVUxMKTsKK30KKworc3RhdGljIGludCBzZ19wcm9jX3NlcV9zaG93X2RldmhkcihzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCit7CisJc2VxX3ByaW50ZihzLCAiaG9zdFx0Y2hhblx0aWRcdGx1blx0dHlwZVx0b3BlbnNcdHFkZXB0aFx0YnVzeVx0IgorCQkgICAib25saW5lXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZ19wcm9jX3NpbmdsZV9vcGVuX2RldmhkcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc2dfcHJvY19zZXFfc2hvd19kZXZoZHIsIE5VTEwpOworfQorCitzdHJ1Y3Qgc2dfcHJvY19kZXZpdGVyIHsKKwlsb2ZmX3QJaW5kZXg7CisJc2l6ZV90CW1heDsKK307CisKK3N0YXRpYyB2b2lkICogZGV2X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzZ19wcm9jX2Rldml0ZXIgKiBpdCA9IGttYWxsb2Moc2l6ZW9mKCppdCksIEdGUF9LRVJORUwpOworCisJaWYgKCEgaXQpCisJCXJldHVybiBOVUxMOworCWlmIChOVUxMID09IHNnX2Rldl9hcnIpCisJCWdvdG8gZXJyMTsKKwlpdC0+aW5kZXggPSAqcG9zOworCWl0LT5tYXggPSBzZ19sYXN0X2RldigpOworCWlmIChpdC0+aW5kZXggPj0gaXQtPm1heCkKKwkJZ290byBlcnIxOworCXJldHVybiBpdDsKK2VycjE6CisJa2ZyZWUoaXQpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqIGRldl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzZ19wcm9jX2Rldml0ZXIgKiBpdCA9IChzdHJ1Y3Qgc2dfcHJvY19kZXZpdGVyICopIHY7CisKKwkqcG9zID0gKytpdC0+aW5kZXg7CisJcmV0dXJuIChpdC0+aW5kZXggPCBpdC0+bWF4KSA/IGl0IDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgZGV2X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3sKKwlrZnJlZSAodik7Cit9CisKK3N0YXRpYyBpbnQgc2dfcHJvY19vcGVuX2RldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICAgICAgcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZkZXZfc2VxX29wcyk7Cit9CisKK3N0YXRpYyBpbnQgc2dfcHJvY19zZXFfc2hvd19kZXYoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCXN0cnVjdCBzZ19wcm9jX2Rldml0ZXIgKiBpdCA9IChzdHJ1Y3Qgc2dfcHJvY19kZXZpdGVyICopIHY7CisJU2dfZGV2aWNlICpzZHA7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZHA7CisKKwlzZHAgPSBpdCA/IHNnX2dldF9kZXYoaXQtPmluZGV4KSA6IE5VTEw7CisJaWYgKHNkcCAmJiAoc2NzaWRwID0gc2RwLT5kZXZpY2UpICYmICghc2RwLT5kZXRhY2hlZCkpCisJCXNlcV9wcmludGYocywgIiVkXHQlZFx0JWRcdCVkXHQlZFx0JWRcdCVkXHQlZFx0JWRcbiIsCisJCQkgICAgICBzY3NpZHAtPmhvc3QtPmhvc3Rfbm8sIHNjc2lkcC0+Y2hhbm5lbCwKKwkJCSAgICAgIHNjc2lkcC0+aWQsIHNjc2lkcC0+bHVuLCAoaW50KSBzY3NpZHAtPnR5cGUsCisJCQkgICAgICAxLAorCQkJICAgICAgKGludCkgc2NzaWRwLT5xdWV1ZV9kZXB0aCwKKwkJCSAgICAgIChpbnQpIHNjc2lkcC0+ZGV2aWNlX2J1c3ksCisJCQkgICAgICAoaW50KSBzY3NpX2RldmljZV9vbmxpbmUoc2NzaWRwKSk7CisJZWxzZQorCQlzZXFfcHJpbnRmKHMsICItMVx0LTFcdC0xXHQtMVx0LTFcdC0xXHQtMVx0LTFcdC0xXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZ19wcm9jX29wZW5fZGV2c3RycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICAgICAgcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZkZXZzdHJzX3NlcV9vcHMpOworfQorCitzdGF0aWMgaW50IHNnX3Byb2Nfc2VxX3Nob3dfZGV2c3RycyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCit7CisJc3RydWN0IHNnX3Byb2NfZGV2aXRlciAqIGl0ID0gKHN0cnVjdCBzZ19wcm9jX2Rldml0ZXIgKikgdjsKKwlTZ19kZXZpY2UgKnNkcDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkcDsKKworCXNkcCA9IGl0ID8gc2dfZ2V0X2RldihpdC0+aW5kZXgpIDogTlVMTDsKKwlpZiAoc2RwICYmIChzY3NpZHAgPSBzZHAtPmRldmljZSkgJiYgKCFzZHAtPmRldGFjaGVkKSkKKwkJc2VxX3ByaW50ZihzLCAiJTguOHNcdCUxNi4xNnNcdCU0LjRzXG4iLAorCQkJICAgc2NzaWRwLT52ZW5kb3IsIHNjc2lkcC0+bW9kZWwsIHNjc2lkcC0+cmV2KTsKKwllbHNlCisJCXNlcV9wcmludGYocywgIjxubyBhY3RpdmUgZGV2aWNlPlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNnX3Byb2NfZGVidWdfaGVscGVyKHN0cnVjdCBzZXFfZmlsZSAqcywgU2dfZGV2aWNlICogc2RwKQoreworCWludCBrLCBtLCBuZXdfaW50ZXJmYWNlLCBibGVuLCB1c2c7CisJU2dfcmVxdWVzdCAqc3JwOworCVNnX2ZkICpmcDsKKwljb25zdCBzZ19pb19oZHJfdCAqaHA7CisJY29uc3QgY2hhciAqIGNwOworCisJZm9yIChrID0gMDsgKGZwID0gc2dfZ2V0X250aF9zZnAoc2RwLCBrKSk7ICsraykgeworCQlzZXFfcHJpbnRmKHMsICIgICBGRCglZCk6IHRpbWVvdXQ9JWRtcyBidWZmbGVuPSVkICIKKwkJCSAgICIocmVzKXNnYXQ9JWQgbG93X2RtYT0lZFxuIiwgayArIDEsCisJCQkgICBqaWZmaWVzX3RvX21zZWNzKGZwLT50aW1lb3V0KSwKKwkJCSAgIGZwLT5yZXNlcnZlLmJ1ZmZsZW4sCisJCQkgICAoaW50KSBmcC0+cmVzZXJ2ZS5rX3VzZV9zZywKKwkJCSAgIChpbnQpIGZwLT5sb3dfZG1hKTsKKwkJc2VxX3ByaW50ZihzLCAiICAgY21kX3E9JWQgZl9wYWNraWQ9JWQga19vcnBoYW49JWQgY2xvc2VkPSVkXG4iLAorCQkJICAgKGludCkgZnAtPmNtZF9xLCAoaW50KSBmcC0+Zm9yY2VfcGFja2lkLAorCQkJICAgKGludCkgZnAtPmtlZXBfb3JwaGFuLCAoaW50KSBmcC0+Y2xvc2VkKTsKKwkJZm9yIChtID0gMDsgKHNycCA9IHNnX2dldF9udGhfcmVxdWVzdChmcCwgbSkpOyArK20pIHsKKwkJCWhwID0gJnNycC0+aGVhZGVyOworCQkJbmV3X2ludGVyZmFjZSA9IChocC0+aW50ZXJmYWNlX2lkID09ICdcMCcpID8gMCA6IDE7CisJCQlpZiAoc3JwLT5yZXNfdXNlZCkgeworCQkJCWlmIChuZXdfaW50ZXJmYWNlICYmIAorCQkJCSAgICAoU0dfRkxBR19NTUFQX0lPICYgaHAtPmZsYWdzKSkKKwkJCQkJY3AgPSAiICAgICBtbWFwPj4gIjsKKwkJCQllbHNlCisJCQkJCWNwID0gIiAgICAgcmI+PiAiOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoU0dfSU5GT19ESVJFQ1RfSU9fTUFTSyAmIGhwLT5pbmZvKQorCQkJCQljcCA9ICIgICAgIGRpbz4+ICI7CisJCQkJZWxzZQorCQkJCQljcCA9ICIgICAgICI7CisJCQl9CisJCQlzZXFfcHJpbnRmKHMsIGNwKTsKKwkJCWJsZW4gPSBzcnAtPm15X2NtZHAgPyAKKwkJCQlzcnAtPm15X2NtZHAtPnNyX2J1ZmZsZW4gOiBzcnAtPmRhdGEuYnVmZmxlbjsKKwkJCXVzZyA9IHNycC0+bXlfY21kcCA/IAorCQkJCXNycC0+bXlfY21kcC0+c3JfdXNlX3NnIDogc3JwLT5kYXRhLmtfdXNlX3NnOworCQkJc2VxX3ByaW50ZihzLCBzcnAtPmRvbmUgPyAKKwkJCQkgICAoKDEgPT0gc3JwLT5kb25lKSA/ICAicmN2OiIgOiAiZmluOiIpCisJCQkJICAgOiAoc3JwLT5teV9jbWRwID8gImFjdDoiIDogInByaW9yOiIpKTsKKwkJCXNlcV9wcmludGYocywgIiBpZD0lZCBibGVuPSVkIiwKKwkJCQkgICBzcnAtPmhlYWRlci5wYWNrX2lkLCBibGVuKTsKKwkJCWlmIChzcnAtPmRvbmUpCisJCQkJc2VxX3ByaW50ZihzLCAiIGR1cj0lZCIsIGhwLT5kdXJhdGlvbik7CisJCQllbHNlCisJCQkJc2VxX3ByaW50ZihzLCAiIHRfby9lbGFwPSVkLyVkIiwKKwkJCQkgIG5ld19pbnRlcmZhY2UgPyBocC0+dGltZW91dCA6IGppZmZpZXNfdG9fbXNlY3MoZnAtPnRpbWVvdXQpLAorCQkJCSAgamlmZmllc190b19tc2VjcyhocC0+ZHVyYXRpb24gPyAoamlmZmllcyAtIGhwLT5kdXJhdGlvbikgOiAwKSk7CisJCQlzZXFfcHJpbnRmKHMsICJtcyBzZ2F0PSVkIG9wPTB4JTAyeFxuIiwgdXNnLAorCQkJCSAgIChpbnQpIHNycC0+ZGF0YS5jbWRfb3Bjb2RlKTsKKwkJfQorCQlpZiAoMCA9PSBtKQorCQkJc2VxX3ByaW50ZihzLCAiICAgICBObyByZXF1ZXN0cyBhY3RpdmVcbiIpOworCX0KK30KKworc3RhdGljIGludCBzZ19wcm9jX29wZW5fZGVidWcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgICAgIHJldHVybiBzZXFfb3BlbihmaWxlLCAmZGVidWdfc2VxX29wcyk7Cit9CisKK3N0YXRpYyBpbnQgc2dfcHJvY19zZXFfc2hvd19kZWJ1ZyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCit7CisJc3RydWN0IHNnX3Byb2NfZGV2aXRlciAqIGl0ID0gKHN0cnVjdCBzZ19wcm9jX2Rldml0ZXIgKikgdjsKKwlTZ19kZXZpY2UgKnNkcDsKKworCWlmIChpdCAmJiAoMCA9PSBpdC0+aW5kZXgpKSB7CisJCXNlcV9wcmludGYocywgImRldl9tYXgoY3VycmVudGx5KT0lZCBtYXhfYWN0aXZlX2RldmljZT0lZCAiCisJCQkgICAiKG9yaWdpbiAxKVxuIiwgc2dfZGV2X21heCwgKGludClpdC0+bWF4KTsKKwkJc2VxX3ByaW50ZihzLCAiIGRlZl9yZXNlcnZlZF9zaXplPSVkXG4iLCBzZ19iaWdfYnVmZik7CisJfQorCXNkcCA9IGl0ID8gc2dfZ2V0X2RldihpdC0+aW5kZXgpIDogTlVMTDsKKwlpZiAoc2RwKSB7CisJCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRwID0gc2RwLT5kZXZpY2U7CisKKwkJaWYgKE5VTEwgPT0gc2NzaWRwKSB7CisJCQlzZXFfcHJpbnRmKHMsICJkZXZpY2UgJWQgZGV0YWNoZWQgPz9cbiIsIAorCQkJCSAgIChpbnQpaXQtPmluZGV4KTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKHNnX2dldF9udGhfc2ZwKHNkcCwgMCkpIHsKKwkJCXNlcV9wcmludGYocywgIiA+Pj4gZGV2aWNlPSVzICIsCisJCQkJc2RwLT5kaXNrLT5kaXNrX25hbWUpOworCQkJaWYgKHNkcC0+ZGV0YWNoZWQpCisJCQkJc2VxX3ByaW50ZihzLCAiZGV0YWNoZWQgcGVuZGluZyBjbG9zZSAiKTsKKwkJCWVsc2UKKwkJCQlzZXFfcHJpbnRmCisJCQkJICAgIChzLCAic2NzaSVkIGNoYW49JWQgaWQ9JWQgbHVuPSVkICAgZW09JWQiLAorCQkJCSAgICAgc2NzaWRwLT5ob3N0LT5ob3N0X25vLAorCQkJCSAgICAgc2NzaWRwLT5jaGFubmVsLCBzY3NpZHAtPmlkLAorCQkJCSAgICAgc2NzaWRwLT5sdW4sCisJCQkJICAgICBzY3NpZHAtPmhvc3QtPmhvc3R0LT5lbXVsYXRlZCk7CisJCQlzZXFfcHJpbnRmKHMsICIgc2dfdGFibGVzaXplPSVkIGV4Y2w9JWRcbiIsCisJCQkJICAgc2RwLT5zZ190YWJsZXNpemUsIHNkcC0+ZXhjbHVkZSk7CisJCX0KKwkJc2dfcHJvY19kZWJ1Z19oZWxwZXIocywgc2RwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgkJCQkvKiBDT05GSUdfU0NTSV9QUk9DX0ZTICovCisKK21vZHVsZV9pbml0KGluaXRfc2cpOworbW9kdWxlX2V4aXQoZXhpdF9zZyk7CitNT0RVTEVfQUxJQVNfQ0hBUkRFVl9NQUpPUihTQ1NJX0dFTkVSSUNfTUFKT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NnaXdkOTMuYyBiL2RyaXZlcnMvc2NzaS9zZ2l3ZDkzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcwZjJhYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zZ2l3ZDkzLmMKQEAgLTAsMCArMSwzMzcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgRGF2aWQgUy4gTWlsbGVyIChkbUBlbmdyLnNnaS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgQW5kcmV3IFIuIEJha2VyIChhbmRyZXdiQHVhYi5lZHUpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgRmxvcmlhbiBMb2hvZmYgKGZsb0ByZmM4MjIub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzIFJhbGYgQmFlY2hsZSAocmFsZkBsaW51eC1taXBzLm9yZykKKyAqIAorICogKEluIGFsbCB0cnV0aCwgSmVkIFNjaGltbWVsIHdyb3RlIGFsbCB0aGlzIGNvZGUuKQorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3NnaWFsaWIuaD4KKyNpbmNsdWRlIDxhc20vc2dpL3NnaS5oPgorI2luY2x1ZGUgPGFzbS9zZ2kvbWMuaD4KKyNpbmNsdWRlIDxhc20vc2dpL2hwYzMuaD4KKyNpbmNsdWRlIDxhc20vc2dpL2lwMjIuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJ3ZDMzYzkzLmgiCisjaW5jbHVkZSAic2dpd2Q5My5oIgorCisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorCisjaWYgMAorI2RlZmluZSBEUFJJTlRLKGFyZ3MuLi4pCXByaW50ayhhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyhhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgSERBVEEocHRyKSAoKHN0cnVjdCBpcDIyX2hvc3RkYXRhICopKChwdHIpLT5ob3N0ZGF0YSkpCisKK3N0cnVjdCBpcDIyX2hvc3RkYXRhIHsKKwlzdHJ1Y3QgV0QzM0M5M19ob3N0ZGF0YSB3aDsKKwlzdHJ1Y3QgaHBjX2RhdGEgeworCQlkbWFfYWRkcl90ICAgICAgZG1hOworCQl2b2lkICAgICAgICAgICAgKiBjcHU7CisJfSBoZDsKK307CisKK3N0cnVjdCBocGNfY2h1bmsgeworCXN0cnVjdCBocGNfZG1hX2Rlc2MgZGVzYzsKKwl1MzIgX3BhZGRpbmc7CS8qIGFsaWduIHRvIHF1YWR3b3JkIGJvdW5kYXJ5ICovCit9OworCitzdHJ1Y3QgU2NzaV9Ib3N0ICpzZ2l3ZDkzX2hvc3Q7CitzdHJ1Y3QgU2NzaV9Ib3N0ICpzZ2l3ZDkzX2hvc3QxOworCisvKiBXdWZmIHd1ZmYsIHd1ZmYsIHdkMzNjOTMuYywgd3VmZiB3dWZmLCBvYmplY3Qgb3JpZW50ZWQsIGJvdyB3b3cuICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfd2QzM2M5M19jb3VudChjb25zdCB3ZDMzYzkzX3JlZ3MgcmVncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKwkqcmVncy5TQVNSID0gV0RfVFJBTlNGRVJfQ09VTlRfTVNCOworCW1iKCk7CisJKnJlZ3MuU0NNRCA9ICgodmFsdWUgPj4gMTYpICYgMHhmZik7CisJKnJlZ3MuU0NNRCA9ICgodmFsdWUgPj4gIDgpICYgMHhmZik7CisJKnJlZ3MuU0NNRCA9ICgodmFsdWUgPj4gIDApICYgMHhmZik7CisJbWIoKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRfd2QzM2M5M19jb3VudChjb25zdCB3ZDMzYzkzX3JlZ3MgcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCisJKnJlZ3MuU0FTUiA9IFdEX1RSQU5TRkVSX0NPVU5UX01TQjsKKwltYigpOworCXZhbHVlID0gICgoKnJlZ3MuU0NNRCAmIDB4ZmYpIDw8IDE2KTsKKwl2YWx1ZSB8PSAoKCpyZWdzLlNDTUQgJiAweGZmKSA8PCAgOCk7CisJdmFsdWUgfD0gKCgqcmVncy5TQ01EICYgMHhmZikgPDwgIDApOworCW1iKCk7CisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2dpd2Q5M19pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqIGhvc3QgPSAoc3RydWN0IFNjc2lfSG9zdCAqKSBkZXZfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXdkMzNjOTNfaW50cihob3N0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW5saW5lCit2b2lkIGZpbGxfaHBjX2VudHJpZXMoc3RydWN0IGhwY19jaHVuayAqaGNwLCBTY3NpX0NtbmQgKmNtZCwgaW50IGRhdGFpbnApCit7CisJdW5zaWduZWQgbG9uZyBsZW4gPSBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsOworCXZvaWQgKmFkZHIgPSBjbWQtPlNDcC5wdHI7CisJZG1hX2FkZHJfdCBwaHlzYWRkcjsKKwl1bnNpZ25lZCBsb25nIGNvdW50OworCisJcGh5c2FkZHIgPSBkbWFfbWFwX3NpbmdsZShOVUxMLCBhZGRyLCBsZW4sIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCWNtZC0+U0NwLmRtYV9oYW5kbGUgPSBwaHlzYWRkcjsKKworCXdoaWxlIChsZW4pIHsKKwkJLyoKKwkJICogZXZlbiBjbnRpbmZvIGNvdWxkIGJlIHVwIHRvIDE2MzgzLCB3aXRob3V0CisJCSAqIG1hZ2ljIG9ubHkgODE5MiB3b3JrcyBjb3JyZWN0bHkKKwkJICovCisJCWNvdW50ID0gbGVuID4gODE5MiA/IDgxOTIgOiBsZW47CisJCWhjcC0+ZGVzYy5wYnVmID0gcGh5c2FkZHI7CisJCWhjcC0+ZGVzYy5jbnRpbmZvID0gY291bnQ7CisJCWhjcCsrOworCQlsZW4gLT0gY291bnQ7CisJCXBoeXNhZGRyICs9IGNvdW50OworCX0KKworCS8qCisJICogVG8gbWFrZSBzdXJlLCBpZiB3ZSB0cmlwIGFuIEhQQyBidWcsIHRoYXQgd2UgdHJhbnNmZXIgZXZlcnkgc2luZ2xlCisJICogYnl0ZSwgd2UgdGFnIG9uIGFuIGV4dHJhIHplcm8gbGVuZ3RoIGRtYSBkZXNjcmlwdG9yIGF0IHRoZSBlbmQgb2YKKwkgKiB0aGUgY2hhaW4uCisJICovCisJaGNwLT5kZXNjLnBidWYgPSAwOworCWhjcC0+ZGVzYy5jbnRpbmZvID0gSFBDRE1BX0VPWDsKK30KKworc3RhdGljIGludCBkbWFfc2V0dXAoU2NzaV9DbW5kICpjbWQsIGludCBkYXRhaW5wKQoreworCXN0cnVjdCBpcDIyX2hvc3RkYXRhICpoZGF0YSA9IEhEQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KTsKKwlzdHJ1Y3QgaHBjM19zY3NpcmVncyAqaHJlZ3MgPQorCQkoc3RydWN0IGhwYzNfc2NzaXJlZ3MgKikgY21kLT5kZXZpY2UtPmhvc3QtPmJhc2U7CisJc3RydWN0IGhwY19jaHVuayAqaGNwID0gKHN0cnVjdCBocGNfY2h1bmsgKikgaGRhdGEtPmhkLmNwdTsKKworCURQUklOVEsoImRtYV9zZXR1cDogZGF0YWlucDwlZD4gaGNwPCVwPiAiLCBkYXRhaW5wLCBoY3ApOworCisJaGRhdGEtPndoLmRtYV9kaXIgPSBkYXRhaW5wOworCisJLyoKKwkgKiB3ZDMzYzkzIHNob3VsZG4ndCBwYXNzIHVzIGJvZ3VzIGRtYV9zZXR1cHMsIGJ1dCBpdCBkb2VzOi0oICBUaGUKKwkgKiBvdGhlciB3ZDMzYzkzIGRyaXZlcnMgZGVhbCB3aXRoIGl0IHRoZSBzYW1lIHdheSAod2hpY2ggaXNuJ3QgdGhhdAorCSAqIG9idmlvdXMpLiAgSU1ITyBhIGJldHRlciBmaXggd291bGQgYmUsIG5vdCB0byBkbyB0aGVzZSBkbWEgc2V0dXBzCisJICogaW4gdGhlIGZpcnN0IHBsYWNlLgorCSAqLworCWlmIChjbWQtPlNDcC5wdHIgPT0gTlVMTCB8fCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsID09IDApCisJCXJldHVybiAxOworCisJZmlsbF9ocGNfZW50cmllcyhoY3AsIGNtZCwgZGF0YWlucCk7CisKKwlEUFJJTlRLKCIgSFBDR09cbiIpOworCisJLyogU3RhcnQgdXAgdGhlIEhQQy4gKi8KKwlocmVncy0+bmRwdHIgPSBoZGF0YS0+aGQuZG1hOworCWlmIChkYXRhaW5wKQorCQlocmVncy0+Y3RybCA9IEhQQzNfU0NUUkxfQUNUSVZFOworCWVsc2UKKwkJaHJlZ3MtPmN0cmwgPSBIUEMzX1NDVFJMX0FDVElWRSB8IEhQQzNfU0NUUkxfRElSOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9zdG9wKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBTY3NpX0NtbmQgKlNDcG50LAorCQkgICAgIGludCBzdGF0dXMpCit7CisJc3RydWN0IGlwMjJfaG9zdGRhdGEgKmhkYXRhID0gSERBVEEoaW5zdGFuY2UpOworCXN0cnVjdCBocGMzX3Njc2lyZWdzICpocmVnczsKKworCWlmICghU0NwbnQpCisJCXJldHVybjsKKworCWhyZWdzID0gKHN0cnVjdCBocGMzX3Njc2lyZWdzICopIFNDcG50LT5kZXZpY2UtPmhvc3QtPmJhc2U7CisKKwlEUFJJTlRLKCJkbWFfc3RvcDogc3RhdHVzPCVkPiAiLCBzdGF0dXMpOworCisJLyogRmlyc3Qgc3RvcCB0aGUgSFBDIGFuZCBmbHVzaCBpdCdzIEZJRk8uICovCisJaWYgKGhkYXRhLT53aC5kbWFfZGlyKSB7CisJCWhyZWdzLT5jdHJsIHw9IEhQQzNfU0NUUkxfRkxVU0g7CisJCXdoaWxlIChocmVncy0+Y3RybCAmIEhQQzNfU0NUUkxfQUNUSVZFKQorCQkJYmFycmllcigpOworCX0KKwlocmVncy0+Y3RybCA9IDA7CisJZG1hX3VubWFwX3NpbmdsZShOVUxMLCBTQ3BudC0+U0NwLmRtYV9oYW5kbGUsIFNDcG50LT5TQ3AudGhpc19yZXNpZHVhbCwKKwkgICAgICAgICAgICAgICAgIFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbik7CisKKwlEUFJJTlRLKCJcbiIpOworfQorCit2b2lkIHNnaXdkOTNfcmVzZXQodW5zaWduZWQgbG9uZyBiYXNlKQoreworCXN0cnVjdCBocGMzX3Njc2lyZWdzICpocmVncyA9IChzdHJ1Y3QgaHBjM19zY3NpcmVncyAqKSBiYXNlOworCisJaHJlZ3MtPmN0cmwgPSBIUEMzX1NDVFJMX0NSRVNFVDsKKwl1ZGVsYXkoNTApOworCWhyZWdzLT5jdHJsID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfaHBjX2NoYWluKHN0cnVjdCBocGNfZGF0YSAqaGQpCit7CisJc3RydWN0IGhwY19jaHVuayAqaGNwID0gKHN0cnVjdCBocGNfY2h1bmsgKikgaGQtPmNwdTsKKwlzdHJ1Y3QgaHBjX2NodW5rICpkbWEgPSAoc3RydWN0IGhwY19jaHVuayAqKSBoZC0+ZG1hOworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKKworCXN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIGhjcDsKKwllbmQgPSBzdGFydCArIFBBR0VfU0laRTsKKwl3aGlsZSAoc3RhcnQgPCBlbmQpIHsKKwkJaGNwLT5kZXNjLnBuZXh0ID0gKHUzMikgKGRtYSArIDEpOworCQloY3AtPmRlc2MuY250aW5mbyA9IEhQQ0RNQV9FT1g7CisJCWhjcCsrOyBkbWErKzsKKwkJc3RhcnQgKz0gc2l6ZW9mKHN0cnVjdCBocGNfY2h1bmspOworCX07CisJaGNwLS07CisJaGNwLT5kZXNjLnBuZXh0ID0gaGQtPmRtYTsKK30KKworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKiBfX2luaXQgc2dpd2Q5M19zZXR1cF9zY3NpKAorCVNjc2lfSG9zdF9UZW1wbGF0ZSAqU0dJYmxvd3MsIGludCB1bml0LCBpbnQgaXJxLAorCXN0cnVjdCBocGMzX3Njc2lyZWdzICpocmVncywgdW5zaWduZWQgY2hhciAqd2RyZWdzKQoreworCXN0cnVjdCBpcDIyX2hvc3RkYXRhICpoZGF0YTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXdkMzNjOTNfcmVncyByZWdzOworCisJaG9zdCA9IHNjc2lfcmVnaXN0ZXIoU0dJYmxvd3MsIHNpemVvZihzdHJ1Y3QgaXAyMl9ob3N0ZGF0YSkpOworCWlmICghaG9zdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlob3N0LT5iYXNlID0gKHVuc2lnbmVkIGxvbmcpIGhyZWdzOworCWhvc3QtPmlycSA9IGlycTsKKworCWhkYXRhID0gSERBVEEoaG9zdCk7CisJaGRhdGEtPmhkLmNwdSA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBQQUdFX1NJWkUsICZoZGF0YS0+aGQuZG1hLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFoZGF0YS0+aGQuY3B1KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNnaXdkOTM6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKKwkJICAgICAgICJob3N0ICVkIGJ1ZmZlci5cbiIsIHVuaXQpOworCQlnb3RvIG91dF91bnJlZ2lzdGVyOworCX0KKwlpbml0X2hwY19jaGFpbigmaGRhdGEtPmhkKTsKKworCXJlZ3MuU0FTUiA9IHdkcmVncyArIDM7CisJcmVncy5TQ01EID0gd2RyZWdzICsgNzsKKworCXdkMzNjOTNfaW5pdChob3N0LCByZWdzLCBkbWFfc2V0dXAsIGRtYV9zdG9wLCBXRDMzQzkzX0ZTXzE2XzIwKTsKKworCWhkYXRhLT53aC5ub19zeW5jID0gMDsKKworCWlmIChyZXF1ZXN0X2lycShpcnEsIHNnaXdkOTNfaW50ciwgMCwgIlNHSSBXRDkzIiwgKHZvaWQgKikgaG9zdCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2dpd2Q5MzogQ291bGQgbm90IHJlZ2lzdGVyIGlycSAlZCAiCisJCSAgICAgICAiZm9yIGhvc3QgJWQuXG4iLCBpcnEsIHVuaXQpOworCQlnb3RvIG91dF9mcmVlOworCX0KKwlyZXR1cm4gaG9zdDsKKworb3V0X2ZyZWU6CisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgUEFHRV9TSVpFLCBoZGF0YS0+aGQuY3B1LCBoZGF0YS0+aGQuZG1hKTsKKwl3ZDMzYzkzX3JlbGVhc2UoKTsKKworb3V0X3VucmVnaXN0ZXI6CisJc2NzaV91bnJlZ2lzdGVyKGhvc3QpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBfX2luaXQgc2dpd2Q5M19kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICpTR0libG93cykKK3sKKwlpbnQgZm91bmQgPSAwOworCisJU0dJYmxvd3MtPnByb2NfbmFtZSA9ICJTR0lXRDkzIjsKKwlzZ2l3ZDkzX2hvc3QgPSBzZ2l3ZDkzX3NldHVwX3Njc2koU0dJYmxvd3MsIDAsIFNHSV9XRDkzXzBfSVJRLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaHBjM2MwLT5zY3NpX2NoYW4wLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKWhwYzNjMC0+c2NzaTBfZXh0KTsKKwlpZiAoc2dpd2Q5M19ob3N0KQorCQlmb3VuZCsrOworCisJLyogU2V0IHVwIHNlY29uZCBjb250cm9sbGVyIG9uIHRoZSBJbmRpZ28yICovCisJaWYgKGlwMjJfaXNfZnVsbGhvdXNlKCkpIHsKKwkJc2dpd2Q5M19ob3N0MSA9IHNnaXdkOTNfc2V0dXBfc2NzaShTR0libG93cywgMSwgU0dJX1dEOTNfMV9JUlEsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmhwYzNjMC0+c2NzaV9jaGFuMSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKWhwYzNjMC0+c2NzaTFfZXh0KTsKKwkJaWYgKHNnaXdkOTNfaG9zdDEpCisJCQlmb3VuZCsrOworCX0KKworCXJldHVybiBmb3VuZDsKK30KKworaW50IHNnaXdkOTNfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKwlzdHJ1Y3QgaXAyMl9ob3N0ZGF0YSAqaGRhdGEgPSBIREFUQShpbnN0YW5jZSk7CisJaW50IGlycSA9IDA7CisKKwlpZiAoc2dpd2Q5M19ob3N0ICYmIHNnaXdkOTNfaG9zdCA9PSBpbnN0YW5jZSkKKwkJaXJxID0gU0dJX1dEOTNfMF9JUlE7CisJZWxzZSBpZiAoc2dpd2Q5M19ob3N0MSAmJiBzZ2l3ZDkzX2hvc3QxID09IGluc3RhbmNlKQorCQlpcnEgPSBTR0lfV0Q5M18xX0lSUTsKKworCWZyZWVfaXJxKGlycSwgc2dpd2Q5M19pbnRyKTsKKwlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBQQUdFX1NJWkUsIGhkYXRhLT5oZC5jcHUsIGhkYXRhLT5oZC5kbWEpOworCXdkMzNjOTNfcmVsZWFzZSgpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2dpd2Q5M19idXNfcmVzZXQoU2NzaV9DbW5kICpjbWQpCit7CisJLyogRklYTUUgcGVyZm9ybSBidXMtc3BlY2lmaWMgcmVzZXQgKi8KKwl3ZDMzYzkzX2hvc3RfcmVzZXQoY21kKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyoKKyAqIEtsdWRnZSBhbGVydCAtIHRoZSBTQ1NJIGNvZGUgY2FsbHMgdGhlIGFib3J0IGFuZCByZXNldCBtZXRob2Qgd2l0aCBpbnQKKyAqIGFyZ3VtZW50cyBub3Qgd2l0aCBwb2ludGVycy4gIFNvIHRoaXMgaXMgZ29pbmcgdG8gYmxvdyB1cCBiZWF1dHlmdWxseQorICogb24gNjQtYml0IHN5c3RlbXMgd2l0aCBtZW1vcnkgb3V0c2lkZSB0aGUgY29tcGF0IGFkZHJlc3Mgc3BhY2VzLgorICovCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJTR0lXRDkzIiwKKwkubmFtZQkJCT0gIlNHSSBXRDkzIiwKKwkuZGV0ZWN0CQkJPSBzZ2l3ZDkzX2RldGVjdCwKKwkucmVsZWFzZQkJPSBzZ2l3ZDkzX3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSB3ZDMzYzkzX3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IHdkMzNjOTNfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gc2dpd2Q5M19idXNfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IHdkMzNjOTNfaG9zdF9yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IENBTl9RVUVVRSwKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSBDTURfUEVSX0xVTiwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorfTsKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NnaXdkOTMuaCBiL2RyaXZlcnMvc2NzaS9zZ2l3ZDkzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxZDBiNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zZ2l3ZDkzLmgKQEAgLTAsMCArMSwyNCBAQAorLyogJElkOiBzZ2l3ZDkzLmgsdiAxLjUgMTk5OC8wOC8yNSAwOToxODo1MCByYWxmIEV4cCAkCisgKiBzZ2l3ZDkzLmg6IFNHSSBXRDkzIHNjc2kgZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IERhdmlkIFMuIE1pbGxlciAoZG1AZW5nci5zZ2kuY29tKQorICovCisjaWZuZGVmIF9TR0lXRDkzX0gKKyNkZWZpbmUgX1NHSVdEOTNfSAorCisjaWZuZGVmIENNRF9QRVJfTFVOCisjZGVmaW5lIENNRF9QRVJfTFVOIDgKKyNlbmRpZgorCisjaWZuZGVmIENBTl9RVUVVRQorI2RlZmluZSBDQU5fUVVFVUUgICAxNgorI2VuZGlmCisKK2ludCBzZ2l3ZDkzX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKik7CitpbnQgc2dpd2Q5M19yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKTsKK2NvbnN0IGNoYXIgKndkMzNjOTNfaW5mbyh2b2lkKTsKK2ludCB3ZDMzYzkzX3F1ZXVlY29tbWFuZChTY3NpX0NtbmQgKiwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSk7CitpbnQgd2QzM2M5M19hYm9ydChTY3NpX0NtbmQgKik7CitpbnQgd2QzM2M5M19ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50KTsKKworI2VuZGlmIC8qICEoX1NHSVdEOTNfSCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zaW03MTAuYyBiL2RyaXZlcnMvc2NzaS9zaW03MTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2JmMmFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3NpbTcxMC5jCkBAIC0wLDAgKzEsMzcyIEBACisvKgorICogc2ltNzEwLmMgLSBDb3B5cmlnaHQgKEMpIDE5OTkgUmljaGFyZCBIaXJzdCA8cmljaGFyZEBzbGVlcGllLmRlbW9uLmNvLnVrPgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBNQ0EgY2FyZCBkZXRlY3Rpb24gY29kZSBieSBUcmVudCBNY05haXIuCisgKiBGaXhlcyB0byBub3QgZXhwbGljaXRseSBudWwgYnNzIGRhdGEgZnJvbSBYYXZpZXIgQmVzdGVsLgorICogU29tZSBtdWx0aWJvYXJkIGZpeGVzIGZyb20gUm9sZiBFaWtlIEJlZXIuCisgKiBBdXRvIHByb2Jpbmcgb2YgRUlTQSBjb25maWcgc3BhY2UgZnJvbSBUcmV2b3IgSGVtc2xleS4KKyAqCisgKiBSZXdyaXR0ZW4gdG8gdXNlIDUzYzcwMC5jIGJ5IEphbWVzLkJvdHRvbWxleUBTdGVlbEV5ZS5jb20KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vpc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuaD4KKworI2luY2x1ZGUgIjUzYzcwMC5oIgorCisKKy8qIE11c3QgYmUgZW5vdWdoIGZvciBib3RoIEVJU0EgYW5kIE1DQSAqLworI2RlZmluZSBNQVhfU0xPVFMgOAorc3RhdGljIF9fdTggX19pbml0ZGF0YSBpZF9hcnJheVtNQVhfU0xPVFNdID0geyBbMCAuLi4gTUFYX1NMT1RTLTFdID0gNyB9OworCitzdGF0aWMgY2hhciAqc2ltNzEwOwkJLyogY29tbWFuZCBsaW5lIHBhc3NlZCBieSBpbnNtb2QgKi8KKworTU9EVUxFX0FVVEhPUigiUmljaGFyZCBIaXJzdCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTaW1wbGUgTkNSNTNDNzEwIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0oc2ltNzEwLCBjaGFycCwgMCk7CisKKyNpZmRlZiBNT0RVTEUKKyNkZWZpbmUgQVJHX1NFUCAnICcKKyNlbHNlCisjZGVmaW5lIEFSR19TRVAgJywnCisjZW5kaWYKKworc3RhdGljIF9faW5pdCBpbnQKK3BhcmFtX3NldHVwKGNoYXIgKnN0cikKK3sKKwljaGFyICpwb3MgPSBzdHIsICpuZXh0OworCWludCBzbG90ID0gLTE7CisKKwl3aGlsZShwb3MgIT0gTlVMTCAmJiAobmV4dCA9IHN0cmNocihwb3MsICc6JykpICE9IE5VTEwpIHsKKwkJaW50IHZhbCA9IChpbnQpc2ltcGxlX3N0cnRvdWwoKytuZXh0LCBOVUxMLCAwKTsKKworCQlpZighc3RybmNtcChwb3MsICJzbG90OiIsIDUpKQorCQkJc2xvdCA9IHZhbDsKKwkJZWxzZSBpZighc3RybmNtcChwb3MsICJpZDoiLCAzKSkgeworCQkJaWYoc2xvdCA9PSAtMSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNpbTcxMDogTXVzdCBzcGVjaWZ5IHNsb3QgZm9yIGlkIHBhcmFtZXRlclxuIik7CisJCQl9IGVsc2UgaWYoc2xvdCA+IE1BWF9TTE9UUykgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNpbTcxMDogSWxsZWdhbCBzbG90ICVkIGZvciBpZCAlZFxuIiwgc2xvdCwgdmFsKTsKKwkJCX0gZWxzZSB7CisJCQkJaWRfYXJyYXlbc2xvdF0gPSB2YWw7CisJCQl9CisJCX0KKwkJaWYoKHBvcyA9IHN0cmNocihwb3MsIEFSR19TRVApKSAhPSBOVUxMKQorCQkJcG9zKys7CisJfQorCXJldHVybiAxOworfQorX19zZXR1cCgic2ltNzEwPSIsIHBhcmFtX3NldHVwKTsKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgc2ltNzEwX2RyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubmFtZQkJCT0gIkxTSSAoU3ltYmlvcykgNzEwIE1DQS9FSVNBIiwKKwkucHJvY19uYW1lCQk9ICJzaW03MTAiLAorCS50aGlzX2lkCQk9IDcsCisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgX19kZXZpbml0IGludAorc2ltNzEwX3Byb2JlX2NvbW1vbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyLAorCQkgICAgaW50IGlycSwgaW50IGNsb2NrLCBpbnQgZGlmZmVyZW50aWFsLCBpbnQgc2NzaV9pZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICogaG9zdCA9IE5VTEw7CisJc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSA9CisJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyksCUdGUF9LRVJORUwpOworCisJcHJpbnRrKEtFUk5fTk9USUNFICJzaW03MTA6ICVzXG4iLCBkZXYtPmJ1c19pZCk7CisJcHJpbnRrKEtFUk5fTk9USUNFICJzaW03MTA6IGlycSA9ICVkLCBjbG9jayA9ICVkLCBiYXNlID0gMHglbHgsIHNjc2lfaWQgPSAlZFxuIiwKKwkgICAgICAgaXJxLCBjbG9jaywgYmFzZV9hZGRyLCBzY3NpX2lkKTsKKworCWlmKGhvc3RkYXRhID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzaW03MTA6IEZhaWxlZCB0byBhbGxvY2F0ZSBob3N0IGRhdGFcbiIpOworCQlnb3RvIG91dDsKKwl9CisJbWVtc2V0KGhvc3RkYXRhLCAwLCBzaXplb2Yoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzKSk7CisKKwlpZihyZXF1ZXN0X3JlZ2lvbihiYXNlX2FkZHIsIDY0LCAic2ltNzEwIikgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInNpbTcxMDogRmFpbGVkIHRvIHJlc2VydmUgSU8gcmVnaW9uIDB4JWx4XG4iLAorCQkgICAgICAgYmFzZV9hZGRyKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwkvKiBGaWxsIGluIHRoZSB0aHJlZSByZXF1aXJlZCBwaWVjZXMgb2YgaG9zdGRhdGEgKi8KKwlob3N0ZGF0YS0+YmFzZSA9IGJhc2VfYWRkcjsKKwlob3N0ZGF0YS0+ZGlmZmVyZW50aWFsID0gZGlmZmVyZW50aWFsOworCWhvc3RkYXRhLT5jbG9jayA9IGNsb2NrOworCWhvc3RkYXRhLT5jaGlwNzEwID0gMTsKKwlOQ1JfNzAwX3NldF9pb19tYXBwZWQoaG9zdGRhdGEpOworCisJLyogYW5kIHJlZ2lzdGVyIHRoZSBjaGlwICovCisJaWYoKGhvc3QgPSBOQ1JfNzAwX2RldGVjdCgmc2ltNzEwX2RyaXZlcl90ZW1wbGF0ZSwgaG9zdGRhdGEsIGRldikpCisJICAgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInNpbTcxMDogTm8gaG9zdCBkZXRlY3RlZDsgY2FyZCBjb25maWd1cmF0aW9uIHByb2JsZW0/XG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisJaG9zdC0+dGhpc19pZCA9IHNjc2lfaWQ7CisJaG9zdC0+aXJxID0gaXJxOworCWlmIChyZXF1ZXN0X2lycShpcnEsIE5DUl83MDBfaW50ciwgU0FfU0hJUlEsICJzaW03MTAiLCBob3N0KSkgeworCQlwcmludGsoS0VSTl9FUlIgInNpbTcxMDogcmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKKwkJZ290byBvdXRfcHV0X2hvc3Q7CisJfQorCisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisKKwlyZXR1cm4gMDsKKworIG91dF9wdXRfaG9zdDoKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworIG91dF9yZWxlYXNlOgorCXJlbGVhc2VfcmVnaW9uKGhvc3QtPmJhc2UsIDY0KTsKKyBvdXRfZnJlZToKKwlrZnJlZShob3N0ZGF0YSk7Cisgb3V0OgorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgX19kZXZleGl0IGludAorc2ltNzEwX2RldmljZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBkZXZfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhID0KKwkJKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqKWhvc3QtPmhvc3RkYXRhWzBdOworCisJc2NzaV9yZW1vdmVfaG9zdChob3N0KTsKKwlOQ1JfNzAwX3JlbGVhc2UoaG9zdCk7CisJa2ZyZWUoaG9zdGRhdGEpOworCWZyZWVfaXJxKGhvc3QtPmlycSwgaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfTUNBCisKKy8qIENBUkQgSUQgMDFCQiBhbmQgMDFCQSB1c2UgdGhlIHNhbWUgcG9zIHZhbHVlcyAqLworI2RlZmluZSBNQ0FfMDFCQl9JT19QT1JUUyB7IDB4MDAwMCwgMHgwMDAwLCAweDA4MDAsIDB4MEMwMCwgMHgxMDAwLCAweDE0MDAsIFwKKwkJCSAgICAweDE4MDAsIDB4MUMwMCwgMHgyMDAwLCAweDI0MDAsIDB4MjgwMCwgXAorCQkJICAgIDB4MkMwMCwgMHgzMDAwLCAweDM0MDAsIDB4MzgwMCwgMHgzQzAwLCBcCisJCQkgICAgMHg0MDAwLCAweDQ0MDAsIDB4NDgwMCwgMHg0QzAwLCAweDUwMDAgIH0KKworI2RlZmluZSBNQ0FfMDFCQl9JUlFTIHsgMywgNSwgMTEsIDE0IH0KKworLyogQ0FSRCBJRCAwMDRmICovCisjZGVmaW5lIE1DQV8wMDRGX0lPX1BPUlRTIHsgMHgwMDAwLCAweDAyMDAsIDB4MDMwMCwgMHgwNDAwLCAweDA1MDAsICAweDA2MDAgfQorI2RlZmluZSBNQ0FfMDA0Rl9JUlFTIHsgNSwgOSwgMTQgfQorCitzdGF0aWMgc2hvcnQgc2ltNzEwX21jYV9pZF90YWJsZVtdID0geyAweDAxYmIsIDB4MDFiYSwgMHgwMDRmLCAwfTsKKworc3RhdGljIF9faW5pdCBpbnQKK3NpbTcxMF9tY2FfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtY2FfZGV2aWNlICptY2FfZGV2ID0gdG9fbWNhX2RldmljZShkZXYpOworCWludCBzbG90ID0gbWNhX2Rldi0+c2xvdDsKKwlpbnQgcG9zWzNdOworCXVuc2lnbmVkIGludCBiYXNlOworCWludCBpcnFfdmVjdG9yOworCXNob3J0IGlkID0gc2ltNzEwX21jYV9pZF90YWJsZVttY2FfZGV2LT5pbmRleF07CisJc3RhdGljIGludCBpb18wMDRmX2J5X3Bvc1tdID0gTUNBXzAwNEZfSU9fUE9SVFM7CisJc3RhdGljIGludCBpcnFfMDA0Zl9ieV9wb3NbXSA9IE1DQV8wMDRGX0lSUVM7CisJc3RhdGljIGludCBpb18wMWJiX2J5X3Bvc1tdID0gTUNBXzAxQkJfSU9fUE9SVFM7CisJc3RhdGljIGludCBpcnFfMDFiYl9ieV9wb3NbXSA9IE1DQV8wMUJCX0lSUVM7CisJY2hhciAqbmFtZTsKKwlpbnQgY2xvY2s7CisKKwlwb3NbMF0gPSBtY2FfZGV2aWNlX3JlYWRfc3RvcmVkX3BvcyhtY2FfZGV2LCAyKTsKKwlwb3NbMV0gPSBtY2FfZGV2aWNlX3JlYWRfc3RvcmVkX3BvcyhtY2FfZGV2LCAzKTsKKwlwb3NbMl0gPSBtY2FfZGV2aWNlX3JlYWRfc3RvcmVkX3BvcyhtY2FfZGV2LCA0KTsKKworCS8qCisJICogMDFCQiAmIDAxQkEgcG9ydCBiYXNlIGJ5IGJpdHMgNyw2LDUsNCwzLDIgaW4gcG9zWzJdCisJICoKKwkgKiAgICAwMDAwMDAgIDxkaXNhYmxlZD4gICAwMDEwMTAgIDB4MjgwMAorCSAqICAgIDAwMDAwMSAgPGludmFsaWQ+ICAgIDAwMTAxMSAgMHgyQzAwCisJICogICAgMDAwMDEwICAweDA4MDAgICAgICAgMDAxMTAwICAweDMwMDAKKwkgKiAgICAwMDAwMTEgIDB4MEMwMCAgICAgICAwMDExMDEgIDB4MzQwMAorCSAqICAgIDAwMDEwMCAgMHgxMDAwICAgICAgIDAwMTExMCAgMHgzODAwCisJICogICAgMDAwMTAxICAweDE0MDAgICAgICAgMDAxMTExICAweDNDMDAKKwkgKiAgICAwMDAxMTAgIDB4MTgwMCAgICAgICAwMTAwMDAgIDB4NDAwMAorCSAqICAgIDAwMDExMSAgMHgxQzAwICAgICAgIDAxMDAwMSAgMHg0NDAwCisJICogICAgMDAxMDAwICAweDIwMDAgICAgICAgMDEwMDEwICAweDQ4MDAKKwkgKiAgICAwMDEwMDEgIDB4MjQwMCAgICAgICAwMTAwMTEgIDB4NEMwMAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgIDAxMDEwMCAgMHg1MDAwCisJICoKKwkgKiAwMEY0IHBvcnQgYmFzZSBieSBiaXRzIDMsMiwxIGluIHBvc1swXQorCSAqCisJICogICAgMDAwICA8ZGlzYWJsZWQ+ICAgICAgMDAxICAgIDB4MjAwCisJICogICAgMDEwICAweDMwMCAgICAgICAgICAgMDExICAgIDB4NDAwCisJICogICAgMTAwICAweDUwMCAgICAgICAgICAgMTAxICAgIDB4NjAwCisJICoKKwkgKiAwMUJCICYgMDFCQSBJUlEgaXMgc3BlY2lmaWVkIGluIHBvc1swXSBiaXRzIDcgYW5kIDY6CisJICoKKwkgKiAgICAwMCAgIDMgICAgICAgICAgICAgICAxMCAgIDExCisJICogICAgMDEgICA1ICAgICAgICAgICAgICAgMTEgICAxNAorCSAqCisJICogMDBGNCBJUlEgc3BlY2lmaWVkIGJ5IGJpdHMgNiw1LDQgaW4gcG9zWzBdCisJICoKKwkgKiAgICAxMDAgICA1ICAgICAgICAgICAgICAxMDEgICAgOQorCSAqICAgIDExMCAgIDE0CisJICovCisKKwlpZiAoaWQgPT0gMHgwMWJiIHx8IGlkID09IDB4MDFiYSkgeworCQliYXNlID0gaW9fMDFiYl9ieV9wb3NbKHBvc1syXSAmIDB4RkMpID4+IDJdOworCQlpcnFfdmVjdG9yID0KKwkJCWlycV8wMWJiX2J5X3Bvc1soKHBvc1swXSAmIDB4QzApID4+IDYpXTsKKworCQljbG9jayA9IDUwOworCQlpZiAoaWQgPT0gMHgwMWJiKQorCQkJbmFtZSA9ICJOQ1IgMzM2MC8zNDMwIFNDU0kgU3ViU3lzdGVtIjsKKwkJZWxzZQorCQkJbmFtZSA9ICJOQ1IgRHVhbCBTSU9QIFNDU0kgSG9zdCBBZGFwdGVyIEJvYXJkIjsKKwl9IGVsc2UgaWYgKCBpZCA9PSAweDAwNGYgKSB7CisJCWJhc2UgPSBpb18wMDRmX2J5X3Bvc1soKHBvc1swXSAmIDB4MEUpID4+IDEpXTsKKwkJaXJxX3ZlY3RvciA9CisJCQlpcnFfMDA0Zl9ieV9wb3NbKChwb3NbMF0gJiAweDcwKSA+PiA0KSAtIDRdOworCQljbG9jayA9IDUwOworCQluYW1lID0gIk5DUiA1M2M3MTAgU0NTSSBIb3N0IEFkYXB0ZXIgQm9hcmQiOworCX0gZWxzZSB7CisJCXJldHVybiAtRU5PREVWOworCX0KKwltY2FfZGV2aWNlX3NldF9uYW1lKG1jYV9kZXYsIG5hbWUpOworCW1jYV9kZXZpY2Vfc2V0X2NsYWltKG1jYV9kZXYsIDEpOworCWJhc2UgPSBtY2FfZGV2aWNlX3RyYW5zZm9ybV9pb3BvcnQobWNhX2RldiwgYmFzZSk7CisJaXJxX3ZlY3RvciA9IG1jYV9kZXZpY2VfdHJhbnNmb3JtX2lycShtY2FfZGV2LCBpcnFfdmVjdG9yKTsKKworCXJldHVybiBzaW03MTBfcHJvYmVfY29tbW9uKGRldiwgYmFzZSwgaXJxX3ZlY3RvciwgY2xvY2ssCisJCQkJICAgMCwgaWRfYXJyYXlbc2xvdF0pOworfQorCitzdGF0aWMgc3RydWN0IG1jYV9kcml2ZXIgc2ltNzEwX21jYV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlCQk9IHNpbTcxMF9tY2FfaWRfdGFibGUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJCT0gInNpbTcxMCIsCisJCS5idXMJCT0gJm1jYV9idXNfdHlwZSwKKwkJLnByb2JlCQk9IHNpbTcxMF9tY2FfcHJvYmUsCisJCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2ltNzEwX2RldmljZV9yZW1vdmUpLAorCX0sCit9OworCisjZW5kaWYgLyogQ09ORklHX01DQSAqLworCisjaWZkZWYgQ09ORklHX0VJU0EKK3N0YXRpYyBzdHJ1Y3QgZWlzYV9kZXZpY2VfaWQgc2ltNzEwX2Vpc2FfaWRzW10gPSB7CisJeyAiQ1BRNDQxMCIgfSwKKwl7ICJDUFE0NDExIiB9LAorCXsgIkhXUDBDODAiIH0sCisJeyAiIiB9Cit9OworCitzdGF0aWMgX19pbml0IGludAorc2ltNzEwX2Vpc2FfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBlaXNhX2RldmljZSAqZWRldiA9IHRvX2Vpc2FfZGV2aWNlKGRldik7CisJdW5zaWduZWQgbG9uZyBpb19hZGRyID0gZWRldi0+YmFzZV9hZGRyOworCWNoYXIgZWlzYV9jcHFfaXJxc1tdID0geyAxMSwgMTQsIDE1LCAxMCwgOSwgMCB9OworCWNoYXIgZWlzYV9od3BfaXJxc1tdID0geyAzLCA0LCA1LCA3LCAxMiwgMTAsIDExLCAwfTsKKwljaGFyICplaXNhX2lycXM7CisJdW5zaWduZWQgY2hhciBpcnFfaW5kZXg7CisJdW5zaWduZWQgY2hhciBpcnEsIGRpZmZlcmVudGlhbCA9IDAsIHNjc2lfaWQgPSA3OworCisJaWYoc3RyY21wKGVkZXYtPmlkLnNpZywgIkhXUDBDODAiKSA9PSAwKSB7CisJCV9fdTggdmFsOworCQllaXNhX2lycXMgPSAgZWlzYV9od3BfaXJxczsKKwkJaXJxX2luZGV4ID0gKGluYihpb19hZGRyICsgMHhjODUpICYgMHg3KSAtIDE7CisKKwkJdmFsID0gaW5iKGlvX2FkZHIgKyAweDQpOworCQlzY3NpX2lkID0gZmZzKHZhbCkgLSAxOworCisJCWlmKHNjc2lfaWQgPiA3IHx8ICh2YWwgJiB+KDE8PHNjc2lfaWQpKSAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNpbTcxMC5jLCBFSVNBIGNhcmQgJXMgaGFzIGluY29ycmVjdCBzY3NpX2lkLCBzZXR0aW5nIHRvIDdcbiIsIGRldi0+YnVzX2lkKTsKKwkJCXNjc2lfaWQgPSA3OworCQl9CisJfSBlbHNlIHsKKwkJZWlzYV9pcnFzID0gZWlzYV9jcHFfaXJxczsKKwkJaXJxX2luZGV4ID0gaW5iKGlvX2FkZHIgKyAweGM4OCkgJiAweDA3OworCX0KKworCWlmKGlycV9pbmRleCA+PSBzdHJsZW4oZWlzYV9pcnFzKSkgeworCQlwcmludGsoInNpbTcxMC5jOiBpcnEgbmFzdHlcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpcnEgPSBlaXNhX2lycXNbaXJxX2luZGV4XTsKKwkJCisJcmV0dXJuIHNpbTcxMF9wcm9iZV9jb21tb24oZGV2LCBpb19hZGRyLCBpcnEsIDUwLAorCQkJCSAgIGRpZmZlcmVudGlhbCwgc2NzaV9pZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWlzYV9kcml2ZXIgc2ltNzEwX2Vpc2FfZHJpdmVyID0geworCS5pZF90YWJsZQkJPSBzaW03MTBfZWlzYV9pZHMsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJCT0gInNpbTcxMCIsCisJCS5wcm9iZQkJPSBzaW03MTBfZWlzYV9wcm9iZSwKKwkJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzaW03MTBfZGV2aWNlX3JlbW92ZSksCisJfSwKK307CisjZW5kaWYgLyogQ09ORklHX0VJU0EgKi8KKworc3RhdGljIGludCBfX2luaXQgc2ltNzEwX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworI2lmZGVmIE1PRFVMRQorCWlmIChzaW03MTApCisJCXBhcmFtX3NldHVwKHNpbTcxMCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NQ0EKKwllcnIgPSBtY2FfcmVnaXN0ZXJfZHJpdmVyKCZzaW03MTBfbWNhX2RyaXZlcik7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19FSVNBCisJZXJyID0gZWlzYV9kcml2ZXJfcmVnaXN0ZXIoJnNpbTcxMF9laXNhX2RyaXZlcik7CisjZW5kaWYKKwkvKiBGSVhNRTogd2hhdCB3ZSdkIHJlYWxseSBsaWtlIHRvIHJldHVybiBoZXJlIGlzIC1FTk9ERVYgaWYKKwkgKiBubyBkZXZpY2VzIGhhdmUgYWN0dWFsbHkgYmVlbiBmb3VuZC4gIEluc3RlYWQsIHRoZSBlcnIKKwkgKiBhYm92ZSBhY3R1YWxseSBvbmx5IHJlcG9ydHMgcHJvYmxlbXMgd2l0aCBrb2JqZWN0X3JlZ2lzdGVyLAorCSAqIHNvIGZvciB0aGUgbW9tZW50IHJldHVybiBzdWNjZXNzICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNpbTcxMF9leGl0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX01DQQorCWlmIChNQ0FfYnVzKQorCQltY2FfdW5yZWdpc3Rlcl9kcml2ZXIoJnNpbTcxMF9tY2FfZHJpdmVyKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0VJU0EKKwllaXNhX2RyaXZlcl91bnJlZ2lzdGVyKCZzaW03MTBfZWlzYV9kcml2ZXIpOworI2VuZGlmCit9CisKK21vZHVsZV9pbml0KHNpbTcxMF9pbml0KTsKK21vZHVsZV9leGl0KHNpbTcxMF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zci5jIGIvZHJpdmVycy9zY3NpL3NyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYyNTlmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zci5jCkBAIC0wLDAgKzEsOTY1IEBACisvKgorICogIHNyLmMgQ29weXJpZ2h0IChDKSAxOTkyIERhdmlkIEdpbGxlcgorICogICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5OSBFcmljIFlvdW5nZGFsZQorICoKKyAqICBhZGFwdGVkIGZyb206CisgKiAgICAgIHNkLmMgQ29weXJpZ2h0IChDKSAxOTkyIERyZXcgRWNraGFyZHQKKyAqICAgICAgTGludXggc2NzaSBkaXNrIGRyaXZlciBieQorICogICAgICAgICAgICAgIERyZXcgRWNraGFyZHQgPGRyZXdAY29sb3JhZG8uZWR1PgorICoKKyAqCU1vZGlmaWVkIGJ5IEVyaWMgWW91bmdkYWxlIGVyaWN5QGFuZGFudGUub3JnIHRvCisgKglhZGQgc2NhdHRlci1nYXRoZXIsIG11bHRpcGxlIG91dHN0YW5kaW5nIHJlcXVlc3QsIGFuZCBvdGhlcgorICoJZW5oYW5jZW1lbnRzLgorICoKKyAqICAgICAgTW9kaWZpZWQgYnkgRXJpYyBZb3VuZ2RhbGUgZXJpY0BhbmRhbnRlLm9yZyB0byBzdXBwb3J0IGxvYWRhYmxlCisgKiAgICAgIGxvdy1sZXZlbCBzY3NpIGRyaXZlcnMuCisgKgorICogICAgICBNb2RpZmllZCBieSBUaG9tYXMgUXVpbm90IHRob21hc0BtZWxjaGlvci5jdWl2cmUuZmRuLmZyIHRvCisgKiAgICAgIHByb3ZpZGUgYXV0by1lamVjdC4KKyAqCisgKiAgICAgIE1vZGlmaWVkIGJ5IEdlcmQgS25vcnIgPGtyYXhlbEBjcy50dS1iZXJsaW4uZGU+IHRvIHN1cHBvcnQgdGhlCisgKiAgICAgIGdlbmVyaWMgY2Ryb20gaW50ZXJmYWNlCisgKgorICogICAgICBNb2RpZmllZCBieSBKZW5zIEF4Ym9lIDxheGJvZUBzdXNlLmRlPiAtIFVuaWZvcm0gc3JfcGFja2V0KCkKKyAqICAgICAgaW50ZXJmYWNlLCBjYXBhYmlsaXRpZXMgcHJvYmUgYWRkaXRpb25zLCBpb2N0bCBjbGVhbnVwcywgZXRjLgorICoKKyAqCU1vZGlmaWVkIGJ5IFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PiB0byBzdXBwb3J0IGRldmZzCisgKgorICoJTW9kaWZpZWQgYnkgSmVucyBBeGJvZSA8YXhib2VAc3VzZS5kZT4gLSBzdXBwb3J0IERWRC1SQU0KKyAqCXRyYW5zcGFyZW50bHkgYW5kIGxvc2UgdGhlIEdIT1NUIGhhY2sKKyAqCisgKglNb2RpZmllZCBieSBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqCWNoZWNrIHJlc291cmNlIGFsbG9jYXRpb24gaW4gc3JfaW5pdCBhbmQgc29tZSBjbGVhbnVwcworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Nkcm9tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGJnLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9pb2N0bC5oPgkvKiBGb3IgdGhlIGRvb3IgbG9jay91bmxvY2sgY29tbWFuZHMgKi8KKyNpbmNsdWRlIDxzY3NpL3Njc2lfcmVxdWVzdC5oPgorCisjaW5jbHVkZSAic2NzaV9sb2dnaW5nLmgiCisjaW5jbHVkZSAic3IuaCIKKworCisjZGVmaW5lIFNSX0RJU0tTCTI1NgorCisjZGVmaW5lIE1BWF9SRVRSSUVTCTMKKyNkZWZpbmUgU1JfVElNRU9VVAkoMzAgKiBIWikKKyNkZWZpbmUgU1JfQ0FQQUJJTElUSUVTIFwKKwkoQ0RDX0NMT1NFX1RSQVl8Q0RDX09QRU5fVFJBWXxDRENfTE9DS3xDRENfU0VMRUNUX1NQRUVEfCBcCisJIENEQ19TRUxFQ1RfRElTQ3xDRENfTVVMVElfU0VTU0lPTnxDRENfTUNOfENEQ19NRURJQV9DSEFOR0VEfCBcCisJIENEQ19QTEFZX0FVRElPfENEQ19SRVNFVHxDRENfSU9DVExTfENEQ19EUklWRV9TVEFUVVN8IFwKKwkgQ0RDX0NEX1J8Q0RDX0NEX1JXfENEQ19EVkR8Q0RDX0RWRF9SfENEQ19EVkRfUkFNfENEQ19HRU5FUklDX1BBQ0tFVHwgXAorCSBDRENfTVJXfENEQ19NUldfV3xDRENfUkFNKQorCitzdGF0aWMgaW50IHNyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKik7CitzdGF0aWMgaW50IHNyX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICopOworc3RhdGljIGludCBzcl9pbml0X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqKTsKKworc3RhdGljIHN0cnVjdCBzY3NpX2RyaXZlciBzcl90ZW1wbGF0ZSA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5nZW5kcnYgPSB7CisJCS5uYW1lICAgCT0gInNyIiwKKwkJLnByb2JlCQk9IHNyX3Byb2JlLAorCQkucmVtb3ZlCQk9IHNyX3JlbW92ZSwKKwl9LAorCS5pbml0X2NvbW1hbmQJCT0gc3JfaW5pdF9jb21tYW5kLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc3JfaW5kZXhfYml0c1tTUl9ESVNLUyAvIEJJVFNfUEVSX0xPTkddOworc3RhdGljIERFRklORV9TUElOTE9DSyhzcl9pbmRleF9sb2NrKTsKKworLyogVGhpcyBzZW1hcGhvcmUgaXMgdXNlZCB0byBtZWRpYXRlIHRoZSAwLT4xIHJlZmVyZW5jZSBnZXQgaW4gdGhlCisgKiBmYWNlIG9mIG9iamVjdCBkZXN0cnVjdGlvbiAoaS5lLiB3ZSBjYW4ndCBhbGxvdyBhIGdldCBvbiBhbgorICogb2JqZWN0IGFmdGVyIGxhc3QgcHV0KSAqLworc3RhdGljIERFQ0xBUkVfTVVURVgoc3JfcmVmX3NlbSk7CisKK3N0YXRpYyBpbnQgc3Jfb3BlbihzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKiwgaW50KTsKK3N0YXRpYyB2b2lkIHNyX3JlbGVhc2Uoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICopOworCitzdGF0aWMgdm9pZCBnZXRfc2VjdG9yc2l6ZShzdHJ1Y3Qgc2NzaV9jZCAqKTsKK3N0YXRpYyB2b2lkIGdldF9jYXBhYmlsaXRpZXMoc3RydWN0IHNjc2lfY2QgKik7CisKK3N0YXRpYyBpbnQgc3JfbWVkaWFfY2hhbmdlKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqLCBpbnQpOworc3RhdGljIGludCBzcl9wYWNrZXQoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICosIHN0cnVjdCBwYWNrZXRfY29tbWFuZCAqKTsKKworc3RhdGljIHN0cnVjdCBjZHJvbV9kZXZpY2Vfb3BzIHNyX2RvcHMgPSB7CisJLm9wZW4JCQk9IHNyX29wZW4sCisJLnJlbGVhc2UJIAk9IHNyX3JlbGVhc2UsCisJLmRyaXZlX3N0YXR1cwkgCT0gc3JfZHJpdmVfc3RhdHVzLAorCS5tZWRpYV9jaGFuZ2VkCQk9IHNyX21lZGlhX2NoYW5nZSwKKwkudHJheV9tb3ZlCQk9IHNyX3RyYXlfbW92ZSwKKwkubG9ja19kb29yCQk9IHNyX2xvY2tfZG9vciwKKwkuc2VsZWN0X3NwZWVkCQk9IHNyX3NlbGVjdF9zcGVlZCwKKwkuZ2V0X2xhc3Rfc2Vzc2lvbgk9IHNyX2dldF9sYXN0X3Nlc3Npb24sCisJLmdldF9tY24JCT0gc3JfZ2V0X21jbiwKKwkucmVzZXQJCQk9IHNyX3Jlc2V0LAorCS5hdWRpb19pb2N0bAkJPSBzcl9hdWRpb19pb2N0bCwKKwkuZGV2X2lvY3RsCQk9IHNyX2Rldl9pb2N0bCwKKwkuY2FwYWJpbGl0eQkJPSBTUl9DQVBBQklMSVRJRVMsCisJLmdlbmVyaWNfcGFja2V0CQk9IHNyX3BhY2tldCwKK307CisKK3N0YXRpYyB2b2lkIHNyX2tyZWZfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZik7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNjc2lfY2QgKnNjc2lfY2Qoc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkaXNrLT5wcml2YXRlX2RhdGEsIHN0cnVjdCBzY3NpX2NkLCBkcml2ZXIpOworfQorCisvKgorICogVGhlIGdldCBhbmQgcHV0IHJvdXRpbmVzIGZvciB0aGUgc3RydWN0IHNjc2lfY2QuICBOb3RlIHRoaXMgZW50aXR5CisgKiBoYXMgYSBzY3NpX2RldmljZSBwb2ludGVyIGFuZCBvd25zIGEgcmVmZXJlbmNlIHRvIHRoaXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNjc2lfY2QgKnNjc2lfY2RfZ2V0KHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCXN0cnVjdCBzY3NpX2NkICpjZCA9IE5VTEw7CisKKwlkb3duKCZzcl9yZWZfc2VtKTsKKwlpZiAoZGlzay0+cHJpdmF0ZV9kYXRhID09IE5VTEwpCisJCWdvdG8gb3V0OworCWNkID0gc2NzaV9jZChkaXNrKTsKKwlrcmVmX2dldCgmY2QtPmtyZWYpOworCWlmIChzY3NpX2RldmljZV9nZXQoY2QtPmRldmljZSkpCisJCWdvdG8gb3V0X3B1dDsKKwlnb3RvIG91dDsKKworIG91dF9wdXQ6CisJa3JlZl9wdXQoJmNkLT5rcmVmLCBzcl9rcmVmX3JlbGVhc2UpOworCWNkID0gTlVMTDsKKyBvdXQ6CisJdXAoJnNyX3JlZl9zZW0pOworCXJldHVybiBjZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNjc2lfY2RfcHV0KHN0cnVjdCBzY3NpX2NkICpjZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBjZC0+ZGV2aWNlOworCisJZG93bigmc3JfcmVmX3NlbSk7CisJa3JlZl9wdXQoJmNkLT5rcmVmLCBzcl9rcmVmX3JlbGVhc2UpOworCXNjc2lfZGV2aWNlX3B1dChzZGV2KTsKKwl1cCgmc3JfcmVmX3NlbSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0byBzZWUgaWYgdGhlIG1lZGlhIGhhcyBiZWVuIGNoYW5nZWQgaW4gdGhlCisgKiBDRFJPTSBkcml2ZS4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IHNlbnNlZCBhIGNoYW5nZSwKKyAqIG9yIHRoZSBkcml2ZSBtYXkgaGF2ZSBzZW5zZWQgb25lIGFuZCBub3QgeWV0IHJlcG9ydGVkIGl0LiAgV2UgbXVzdAorICogYmUgcmVhZHkgZm9yIGVpdGhlciBjYXNlLiBUaGlzIGZ1bmN0aW9uIGFsd2F5cyByZXBvcnRzIHRoZSBjdXJyZW50CisgKiB2YWx1ZSBvZiB0aGUgY2hhbmdlZCBiaXQuICBJZiBmbGFnIGlzIDAsIHRoZW4gdGhlIGNoYW5nZWQgYml0IGlzIHJlc2V0LgorICogVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBkb25lIGFzIGFuIGlvY3RsLCBidXQgd2Ugd291bGQgbmVlZCB0byBoYXZlCisgKiBhbiBpbm9kZSBmb3IgdGhhdCB0byB3b3JrLCBhbmQgd2UgZG8gbm90IGFsd2F5cyBoYXZlIG9uZS4KKyAqLworCitpbnQgc3JfbWVkaWFfY2hhbmdlKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBpbnQgc2xvdCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jZCAqY2QgPSBjZGktPmhhbmRsZTsKKwlpbnQgcmV0dmFsOworCisJaWYgKENEU0xfQ1VSUkVOVCAhPSBzbG90KSB7CisJCS8qIG5vIGNoYW5nZXIgc3VwcG9ydCAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR2YWwgPSBzY3NpX3Rlc3RfdW5pdF9yZWFkeShjZC0+ZGV2aWNlLCBTUl9USU1FT1VULCBNQVhfUkVUUklFUyk7CisJaWYgKHJldHZhbCkgeworCQkvKiBVbmFibGUgdG8gdGVzdCwgdW5pdCBwcm9iYWJseSBub3QgcmVhZHkuICBUaGlzIHVzdWFsbHkKKwkJICogbWVhbnMgdGhlcmUgaXMgbm8gZGlzYyBpbiB0aGUgZHJpdmUuICBNYXJrIGFzIGNoYW5nZWQsCisJCSAqIGFuZCB3ZSB3aWxsIGZpZ3VyZSBpdCBvdXQgbGF0ZXIgb25jZSB0aGUgZHJpdmUgaXMKKwkJICogYXZhaWxhYmxlIGFnYWluLiAgKi8KKwkJY2QtPmRldmljZS0+Y2hhbmdlZCA9IDE7CisJCXJldHVybiAxOwkvKiBUaGlzIHdpbGwgZm9yY2UgYSBmbHVzaCwgaWYgY2FsbGVkIGZyb20KKwkJCQkgKiBjaGVja19kaXNrX2NoYW5nZSAqLworCX07CisKKwlyZXR2YWwgPSBjZC0+ZGV2aWNlLT5jaGFuZ2VkOworCWNkLT5kZXZpY2UtPmNoYW5nZWQgPSAwOworCS8qIElmIHRoZSBkaXNrIGNoYW5nZWQsIHRoZSBjYXBhY2l0eSB3aWxsIG5vdyBiZSBkaWZmZXJlbnQsCisJICogc28gd2UgZm9yY2UgYSByZS1yZWFkIG9mIHRoaXMgaW5mb3JtYXRpb24gKi8KKwlpZiAocmV0dmFsKSB7CisJCS8qIGNoZWNrIG11bHRpc2Vzc2lvbiBvZmZzZXQgZXRjICovCisJCXNyX2NkX2NoZWNrKGNkaSk7CisKKwkJLyogCisJCSAqIElmIHRoZSBkaXNrIGNoYW5nZWQsIHRoZSBjYXBhY2l0eSB3aWxsIG5vdyBiZSBkaWZmZXJlbnQsCisJCSAqIHNvIHdlIGZvcmNlIGEgcmUtcmVhZCBvZiB0aGlzIGluZm9ybWF0aW9uIAorCQkgKiBGb3JjZSAyMDQ4IGZvciB0aGUgc2VjdG9yIHNpemUgc28gdGhhdCBmaWxlc3lzdGVtcyB3b24ndAorCQkgKiBiZSB0cnlpbmcgdG8gdXNlIHNvbWV0aGluZyB0aGF0IGlzIHRvbyBzbWFsbCBpZiB0aGUgZGlzYworCQkgKiBoYXMgY2hhbmdlZC4KKwkJICovCisJCWNkLT5uZWVkc19zZWN0b3Jfc2l6ZSA9IDE7CisJCWNkLT5kZXZpY2UtPnNlY3Rvcl9zaXplID0gMjA0ODsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKyAKKy8qCisgKiByd19pbnRyIGlzIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBmb3IgdGhlIGRldmljZSBkcml2ZXIuCisgKgorICogSXQgd2lsbCBiZSBub3RpZmllZCBvbiB0aGUgZW5kIG9mIGEgU0NTSSByZWFkIC8gd3JpdGUsIGFuZCB3aWxsIHRha2Ugb24KKyAqIG9mIHNldmVyYWwgYWN0aW9ucyBiYXNlZCBvbiBzdWNjZXNzIG9yIGZhaWx1cmUuCisgKi8KK3N0YXRpYyB2b2lkIHJ3X2ludHIoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KQoreworCWludCByZXN1bHQgPSBTQ3BudC0+cmVzdWx0OworCWludCB0aGlzX2NvdW50ID0gU0NwbnQtPmJ1ZmZsZW47CisJaW50IGdvb2RfYnl0ZXMgPSAocmVzdWx0ID09IDAgPyB0aGlzX2NvdW50IDogMCk7CisJaW50IGJsb2NrX3NlY3RvcnMgPSAwOworCWxvbmcgZXJyb3Jfc2VjdG9yOworCXN0cnVjdCBzY3NpX2NkICpjZCA9IHNjc2lfY2QoU0NwbnQtPnJlcXVlc3QtPnJxX2Rpc2spOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInNyLmMgZG9uZTogJXhcbiIsIHJlc3VsdCk7CisjZW5kaWYKKworCS8qCisJICogSGFuZGxlIE1FRElVTSBFUlJPUnMgb3IgVk9MVU1FIE9WRVJGTE9XcyB0aGF0IGluZGljYXRlIHBhcnRpYWwKKwkgKiBzdWNjZXNzLiAgU2luY2UgdGhpcyBpcyBhIHJlbGF0aXZlbHkgcmFyZSBlcnJvciBjb25kaXRpb24sIG5vCisJICogY2FyZSBpcyB0YWtlbiB0byBhdm9pZCB1bm5lY2Vzc2FyeSBhZGRpdGlvbmFsIHdvcmsgc3VjaCBhcworCSAqIG1lbWNweSdzIHRoYXQgY291bGQgYmUgYXZvaWRlZC4KKwkgKi8KKwlpZiAoZHJpdmVyX2J5dGUocmVzdWx0KSAhPSAwICYmCQkvKiBBbiBlcnJvciBvY2N1cnJlZCAqLworCSAgICAoU0NwbnQtPnNlbnNlX2J1ZmZlclswXSAmIDB4N2YpID09IDB4NzApIHsgLyogU2Vuc2UgY3VycmVudCAqLworCQlzd2l0Y2ggKFNDcG50LT5zZW5zZV9idWZmZXJbMl0pIHsKKwkJY2FzZSBNRURJVU1fRVJST1I6CisJCWNhc2UgVk9MVU1FX09WRVJGTE9XOgorCQljYXNlIElMTEVHQUxfUkVRVUVTVDoKKwkJCWlmICghKFNDcG50LT5zZW5zZV9idWZmZXJbMF0gJiAweDkwKSkKKwkJCQlicmVhazsKKwkJCWlmICghYmxrX2ZzX3JlcXVlc3QoU0NwbnQtPnJlcXVlc3QpKQorCQkJCWJyZWFrOworCQkJZXJyb3Jfc2VjdG9yID0gKFNDcG50LT5zZW5zZV9idWZmZXJbM10gPDwgMjQpIHwKKwkJCQkoU0NwbnQtPnNlbnNlX2J1ZmZlcls0XSA8PCAxNikgfAorCQkJCShTQ3BudC0+c2Vuc2VfYnVmZmVyWzVdIDw8IDgpIHwKKwkJCQlTQ3BudC0+c2Vuc2VfYnVmZmVyWzZdOworCQkJaWYgKFNDcG50LT5yZXF1ZXN0LT5iaW8gIT0gTlVMTCkKKwkJCQlibG9ja19zZWN0b3JzID0KKwkJCQkJYmlvX3NlY3RvcnMoU0NwbnQtPnJlcXVlc3QtPmJpbyk7CisJCQlpZiAoYmxvY2tfc2VjdG9ycyA8IDQpCisJCQkJYmxvY2tfc2VjdG9ycyA9IDQ7CisJCQlpZiAoY2QtPmRldmljZS0+c2VjdG9yX3NpemUgPT0gMjA0OCkKKwkJCQllcnJvcl9zZWN0b3IgPDw9IDI7CisJCQllcnJvcl9zZWN0b3IgJj0gfihibG9ja19zZWN0b3JzIC0gMSk7CisJCQlnb29kX2J5dGVzID0gKGVycm9yX3NlY3RvciAtIFNDcG50LT5yZXF1ZXN0LT5zZWN0b3IpIDw8IDk7CisJCQlpZiAoZ29vZF9ieXRlcyA8IDAgfHwgZ29vZF9ieXRlcyA+PSB0aGlzX2NvdW50KQorCQkJCWdvb2RfYnl0ZXMgPSAwOworCQkJLyoKKwkJCSAqIFRoZSBTQ1NJIHNwZWNpZmljYXRpb24gYWxsb3dzIGZvciB0aGUgdmFsdWUKKwkJCSAqIHJldHVybmVkIGJ5IFJFQUQgQ0FQQUNJVFkgdG8gYmUgdXAgdG8gNzUgMksKKwkJCSAqIHNlY3RvcnMgcGFzdCB0aGUgbGFzdCByZWFkYWJsZSBibG9jay4KKwkJCSAqIFRoZXJlZm9yZSwgaWYgd2UgaGl0IGEgbWVkaXVtIGVycm9yIHdpdGhpbiB0aGUKKwkJCSAqIGxhc3QgNzUgMksgc2VjdG9ycywgd2UgZGVjcmVhc2UgdGhlIHNhdmVkIHNpemUKKwkJCSAqIHZhbHVlLgorCQkJICovCisJCQlpZiAoZXJyb3Jfc2VjdG9yIDwgZ2V0X2NhcGFjaXR5KGNkLT5kaXNrKSAmJgorCQkJICAgIGNkLT5jYXBhY2l0eSAtIGVycm9yX3NlY3RvciA8IDQgKiA3NSkKKwkJCQlzZXRfY2FwYWNpdHkoY2QtPmRpc2ssIGVycm9yX3NlY3Rvcik7CisJCQlicmVhazsKKworCQljYXNlIFJFQ09WRVJFRF9FUlJPUjoKKworCQkJLyoKKwkJCSAqIEFuIGVycm9yIG9jY3VyZWQsIGJ1dCBpdCByZWNvdmVyZWQuICBJbmZvcm0gdGhlCisJCQkgKiB1c2VyLCBidXQgbWFrZSBzdXJlIHRoYXQgaXQncyBub3QgdHJlYXRlZCBhcyBhCisJCQkgKiBoYXJkIGVycm9yLgorCQkJICovCisJCQlzY3NpX3ByaW50X3NlbnNlKCJzciIsIFNDcG50KTsKKwkJCVNDcG50LT5yZXN1bHQgPSAwOworCQkJU0NwbnQtPnNlbnNlX2J1ZmZlclswXSA9IDB4MDsKKwkJCWdvb2RfYnl0ZXMgPSB0aGlzX2NvdW50OworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBUaGlzIGNhbGxzIHRoZSBnZW5lcmljIGNvbXBsZXRpb24gZnVuY3Rpb24sIG5vdyB0aGF0IHdlIGtub3cKKwkgKiBob3cgbWFueSBhY3R1YWwgc2VjdG9ycyBmaW5pc2hlZCwgYW5kIGhvdyBtYW55IHNlY3RvcnMgd2UgbmVlZAorCSAqIHRvIHNheSBoYXZlIGZhaWxlZC4KKwkgKi8KKwlzY3NpX2lvX2NvbXBsZXRpb24oU0NwbnQsIGdvb2RfYnl0ZXMsIGJsb2NrX3NlY3RvcnMgPDwgOSk7Cit9CisKK3N0YXRpYyBpbnQgc3JfaW5pdF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCkKK3sKKwlpbnQgYmxvY2s9MCwgdGhpc19jb3VudCwgc19zaXplLCB0aW1lb3V0ID0gU1JfVElNRU9VVDsKKwlzdHJ1Y3Qgc2NzaV9jZCAqY2QgPSBzY3NpX2NkKFNDcG50LT5yZXF1ZXN0LT5ycV9kaXNrKTsKKworCVNDU0lfTE9HX0hMUVVFVUUoMSwgcHJpbnRrKCJEb2luZyBzciByZXF1ZXN0LCBkZXYgPSAlcywgYmxvY2sgPSAlZFxuIiwKKwkJCQljZC0+ZGlzay0+ZGlza19uYW1lLCBibG9jaykpOworCisJaWYgKCFjZC0+ZGV2aWNlIHx8ICFzY3NpX2RldmljZV9vbmxpbmUoY2QtPmRldmljZSkpIHsKKwkJU0NTSV9MT0dfSExRVUVVRSgyLCBwcmludGsoIkZpbmlzaGluZyAlbGQgc2VjdG9yc1xuIiwKKwkJCQkJU0NwbnQtPnJlcXVlc3QtPm5yX3NlY3RvcnMpKTsKKwkJU0NTSV9MT0dfSExRVUVVRSgyLCBwcmludGsoIlJldHJ5IHdpdGggMHglcFxuIiwgU0NwbnQpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGNkLT5kZXZpY2UtPmNoYW5nZWQpIHsKKwkJLyoKKwkJICogcXVpZXRseSByZWZ1c2UgdG8gZG8gYW55dGhpbmcgdG8gYSBjaGFuZ2VkIGRpc2MgdW50aWwgdGhlCisJCSAqIGNoYW5nZWQgYml0IGhhcyBiZWVuIHJlc2V0CisJCSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIHRoZXNlIGFyZSBhbHJlYWR5IHNldHVwLCBqdXN0IGNvcHkgY2RiIGJhc2ljYWxseQorCSAqLworCWlmIChTQ3BudC0+cmVxdWVzdC0+ZmxhZ3MgJiBSRVFfQkxPQ0tfUEMpIHsKKwkJc3RydWN0IHJlcXVlc3QgKnJxID0gU0NwbnQtPnJlcXVlc3Q7CisKKwkJaWYgKHNpemVvZihycS0+Y21kKSA+IHNpemVvZihTQ3BudC0+Y21uZCkpCisJCQlyZXR1cm4gMDsKKworCQltZW1jcHkoU0NwbnQtPmNtbmQsIHJxLT5jbWQsIHNpemVvZihTQ3BudC0+Y21uZCkpOworCQlpZiAoIXJxLT5kYXRhX2xlbikKKwkJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOworCQllbHNlIGlmIChycV9kYXRhX2RpcihycSkgPT0gV1JJVEUpCisJCQlTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBETUFfVE9fREVWSUNFOworCQllbHNlCisJCQlTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisKKwkJdGhpc19jb3VudCA9IHJxLT5kYXRhX2xlbjsKKwkJaWYgKHJxLT50aW1lb3V0KQorCQkJdGltZW91dCA9IHJxLT50aW1lb3V0OworCisJCVNDcG50LT50cmFuc2ZlcnNpemUgPSBycS0+ZGF0YV9sZW47CisJCWdvdG8gcXVldWU7CisJfQorCisJaWYgKCEoU0NwbnQtPnJlcXVlc3QtPmZsYWdzICYgUkVRX0NNRCkpIHsKKwkJYmxrX2R1bXBfcnFfZmxhZ3MoU0NwbnQtPnJlcXVlc3QsICJzciB1bnN1cCBjb21tYW5kIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogd2UgZG8gbGF6eSBibG9ja3NpemUgc3dpdGNoaW5nICh3aGVuIHJlYWRpbmcgWEEgc2VjdG9ycywKKwkgKiBzZWUgQ0RST01SRUFETU9ERTIgaW9jdGwpIAorCSAqLworCXNfc2l6ZSA9IGNkLT5kZXZpY2UtPnNlY3Rvcl9zaXplOworCWlmIChzX3NpemUgPiAyMDQ4KSB7CisJCWlmICghaW5faW50ZXJydXB0KCkpCisJCQlzcl9zZXRfYmxvY2tsZW5ndGgoY2QsIDIwNDgpOworCQllbHNlCisJCQlwcmludGsoInNyOiBjYW4ndCBzd2l0Y2ggYmxvY2tzaXplOiBpbiBpbnRlcnJ1cHRcbiIpOworCX0KKworCWlmIChzX3NpemUgIT0gNTEyICYmIHNfc2l6ZSAhPSAxMDI0ICYmIHNfc2l6ZSAhPSAyMDQ4KSB7CisJCXByaW50aygic3I6IGJhZCBzZWN0b3Igc2l6ZSAlZFxuIiwgc19zaXplKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHJxX2RhdGFfZGlyKFNDcG50LT5yZXF1ZXN0KSA9PSBXUklURSkgeworCQlpZiAoIWNkLT5kZXZpY2UtPndyaXRlYWJsZSkKKwkJCXJldHVybiAwOworCQlTQ3BudC0+Y21uZFswXSA9IFdSSVRFXzEwOworCQlTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBETUFfVE9fREVWSUNFOworIAkgCWNkLT5jZGkubWVkaWFfd3JpdHRlbiA9IDE7CisJfSBlbHNlIGlmIChycV9kYXRhX2RpcihTQ3BudC0+cmVxdWVzdCkgPT0gUkVBRCkgeworCQlTQ3BudC0+Y21uZFswXSA9IFJFQURfMTA7CisJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwl9IGVsc2UgeworCQlibGtfZHVtcF9ycV9mbGFncyhTQ3BudC0+cmVxdWVzdCwgIlVua25vd24gc3IgY29tbWFuZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBTQ3BudC0+cmVxdWVzdF9idWZmZXI7CisJCWludCBpLCBzaXplID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IFNDcG50LT51c2Vfc2c7IGkrKykKKwkJCXNpemUgKz0gc2dbaV0ubGVuZ3RoOworCisJCWlmIChzaXplICE9IFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gJiYgU0NwbnQtPnVzZV9zZykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzcjogbWlzbWF0Y2ggY291bnQgJWQsIGJ5dGVzICVkXG4iLAorCQkJCQlzaXplLCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuKTsKKwkJCWlmIChTQ3BudC0+cmVxdWVzdF9idWZmbGVuID4gc2l6ZSkKKwkJCQlTQ3BudC0+cmVxdWVzdF9idWZmbGVuID0gU0NwbnQtPmJ1ZmZsZW4gPSBzaXplOworCQl9CisJfQorCisJLyoKKwkgKiByZXF1ZXN0IGRvZXNuJ3Qgc3RhcnQgb24gaHcgYmxvY2sgYm91bmRhcnksIGFkZCBzY2F0dGVyIHBhZHMKKwkgKi8KKwlpZiAoKCh1bnNpZ25lZCBpbnQpU0NwbnQtPnJlcXVlc3QtPnNlY3RvciAlIChzX3NpemUgPj4gOSkpIHx8CisJICAgIChTQ3BudC0+cmVxdWVzdF9idWZmbGVuICUgc19zaXplKSkgeworCQlwcmludGsoInNyOiB1bmFsaWduZWQgdHJhbnNmZXJcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0aGlzX2NvdW50ID0gKFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gPj4gOSkgLyAoc19zaXplID4+IDkpOworCisKKwlTQ1NJX0xPR19ITFFVRVVFKDIsIHByaW50aygiJXMgOiAlcyAlZC8lbGQgNTEyIGJ5dGUgYmxvY2tzLlxuIiwKKwkJCQljZC0+Y2RpLm5hbWUsCisJCQkJKHJxX2RhdGFfZGlyKFNDcG50LT5yZXF1ZXN0KSA9PSBXUklURSkgPworCQkJCQkid3JpdGluZyIgOiAicmVhZGluZyIsCisJCQkJdGhpc19jb3VudCwgU0NwbnQtPnJlcXVlc3QtPm5yX3NlY3RvcnMpKTsKKworCVNDcG50LT5jbW5kWzFdID0gMDsKKwlibG9jayA9ICh1bnNpZ25lZCBpbnQpU0NwbnQtPnJlcXVlc3QtPnNlY3RvciAvIChzX3NpemUgPj4gOSk7CisKKwlpZiAodGhpc19jb3VudCA+IDB4ZmZmZikgeworCQl0aGlzX2NvdW50ID0gMHhmZmZmOworCQlTQ3BudC0+cmVxdWVzdF9idWZmbGVuID0gU0NwbnQtPmJ1ZmZsZW4gPQorCQkJCXRoaXNfY291bnQgKiBzX3NpemU7CisJfQorCisJU0NwbnQtPmNtbmRbMl0gPSAodW5zaWduZWQgY2hhcikgKGJsb2NrID4+IDI0KSAmIDB4ZmY7CisJU0NwbnQtPmNtbmRbM10gPSAodW5zaWduZWQgY2hhcikgKGJsb2NrID4+IDE2KSAmIDB4ZmY7CisJU0NwbnQtPmNtbmRbNF0gPSAodW5zaWduZWQgY2hhcikgKGJsb2NrID4+IDgpICYgMHhmZjsKKwlTQ3BudC0+Y21uZFs1XSA9ICh1bnNpZ25lZCBjaGFyKSBibG9jayAmIDB4ZmY7CisJU0NwbnQtPmNtbmRbNl0gPSBTQ3BudC0+Y21uZFs5XSA9IDA7CisJU0NwbnQtPmNtbmRbN10gPSAodW5zaWduZWQgY2hhcikgKHRoaXNfY291bnQgPj4gOCkgJiAweGZmOworCVNDcG50LT5jbW5kWzhdID0gKHVuc2lnbmVkIGNoYXIpIHRoaXNfY291bnQgJiAweGZmOworCisJLyoKKwkgKiBXZSBzaG91bGRuJ3QgZGlzY29ubmVjdCBpbiB0aGUgbWlkZGxlIG9mIGEgc2VjdG9yLCBzbyB3aXRoIGEgZHVtYgorCSAqIGhvc3QgYWRhcHRlciwgaXQncyBzYWZlIHRvIGFzc3VtZSB0aGF0IHdlIGNhbiBhdCBsZWFzdCB0cmFuc2ZlcgorCSAqIHRoaXMgbWFueSBieXRlcyBiZXR3ZWVuIGVhY2ggY29ubmVjdCAvIGRpc2Nvbm5lY3QuCisJICovCisJU0NwbnQtPnRyYW5zZmVyc2l6ZSA9IGNkLT5kZXZpY2UtPnNlY3Rvcl9zaXplOworCVNDcG50LT51bmRlcmZsb3cgPSB0aGlzX2NvdW50IDw8IDk7CisKK3F1ZXVlOgorCVNDcG50LT5hbGxvd2VkID0gTUFYX1JFVFJJRVM7CisJU0NwbnQtPnRpbWVvdXRfcGVyX2NvbW1hbmQgPSB0aW1lb3V0OworCisJLyoKKwkgKiBUaGlzIGlzIHRoZSBjb21wbGV0aW9uIHJvdXRpbmUgd2UgdXNlLiAgVGhpcyBpcyBtYXRjaGVkIGluIHRlcm1zCisJICogb2YgY2FwYWJpbGl0eSB0byB0aGlzIGZ1bmN0aW9uLgorCSAqLworCVNDcG50LT5kb25lID0gcndfaW50cjsKKworCS8qCisJICogVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tbWFuZCBpcyByZWFkeSBmcm9tIG91ciBlbmQgdG8gYmUKKwkgKiBxdWV1ZWQuCisJICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc3JfYmxvY2tfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2s7CisJc3RydWN0IHNjc2lfY2QgKmNkID0gc2NzaV9jZChpbm9kZS0+aV9iZGV2LT5iZF9kaXNrKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmKCEoY2QgPSBzY3NpX2NkX2dldChkaXNrKSkpCisJCXJldHVybiAtRU5YSU87CisKKwlpZigocmV0ID0gY2Ryb21fb3BlbigmY2QtPmNkaSwgaW5vZGUsIGZpbGUpKSAhPSAwKQorCQlzY3NpX2NkX3B1dChjZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNyX2Jsb2NrX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2NzaV9jZCAqY2QgPSBzY3NpX2NkKGlub2RlLT5pX2JkZXYtPmJkX2Rpc2spOworCXJldCA9IGNkcm9tX3JlbGVhc2UoJmNkLT5jZGksIGZpbGUpOworCWlmKHJldCkKKwkJcmV0dXJuIHJldDsKKwkKKwlzY3NpX2NkX3B1dChjZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcl9ibG9ja19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY21kLAorCQkJICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc2NzaV9jZCAqY2QgPSBzY3NpX2NkKGlub2RlLT5pX2JkZXYtPmJkX2Rpc2spOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IGNkLT5kZXZpY2U7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2VuZCBTQ1NJIGFkZHJlc3NpbmcgaW9jdGxzIGRpcmVjdGx5IHRvIG1pZCBsZXZlbCwgc2VuZCBvdGhlcgorICAgICAgICAgKiBpb2N0bHMgdG8gY2Ryb20vYmxvY2sgbGV2ZWwuCisgICAgICAgICAqLworICAgICAgICBzd2l0Y2ggKGNtZCkgeworICAgICAgICAgICAgICAgIGNhc2UgU0NTSV9JT0NUTF9HRVRfSURMVU46CisgICAgICAgICAgICAgICAgY2FzZSBTQ1NJX0lPQ1RMX0dFVF9CVVNfTlVNQkVSOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNjc2lfaW9jdGwoc2RldiwgY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworCX0KKwlyZXR1cm4gY2Ryb21faW9jdGwoZmlsZSwgJmNkLT5jZGksIGlub2RlLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgc3JfYmxvY2tfbWVkaWFfY2hhbmdlZChzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlzdHJ1Y3Qgc2NzaV9jZCAqY2QgPSBzY3NpX2NkKGRpc2spOworCXJldHVybiBjZHJvbV9tZWRpYV9jaGFuZ2VkKCZjZC0+Y2RpKTsKK30KKworc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyBzcl9iZG9wcyA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHNyX2Jsb2NrX29wZW4sCisJLnJlbGVhc2UJPSBzcl9ibG9ja19yZWxlYXNlLAorCS5pb2N0bAkJPSBzcl9ibG9ja19pb2N0bCwKKwkubWVkaWFfY2hhbmdlZAk9IHNyX2Jsb2NrX21lZGlhX2NoYW5nZWQsCisJLyogCisJICogTm8gY29tcGF0X2lvY3RsIGZvciBub3cgYmVjYXVzZSBzcl9ibG9ja19pb2N0bCBuZXZlcgorCSAqIHNlZW1zIHRvIHBhc3MgYXJiaXRhcnkgaW9jdGxzIGRvd24gdG8gaG9zdCBkcml2ZXJzLgorCSAqLworfTsKKworc3RhdGljIGludCBzcl9vcGVuKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBpbnQgcHVycG9zZSkKK3sKKwlzdHJ1Y3Qgc2NzaV9jZCAqY2QgPSBjZGktPmhhbmRsZTsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBjZC0+ZGV2aWNlOworCWludCByZXR2YWw7CisKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgaXMgaW4gZXJyb3IgcmVjb3ZlcnksIHdhaXQgdW50aWwgaXQgaXMgZG9uZS4KKwkgKiBJZiB0aGUgZGV2aWNlIGlzIG9mZmxpbmUsIHRoZW4gZGlzYWxsb3cgYW55IGFjY2VzcyB0byBpdC4KKwkgKi8KKwlyZXR2YWwgPSAtRU5YSU87CisJaWYgKCFzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2luZ19lcnJvcnMoc2RldikpCisJCWdvdG8gZXJyb3Jfb3V0OworCisJLyoKKwkgKiBJZiB0aGlzIGRldmljZSBkaWQgbm90IGhhdmUgbWVkaWEgaW4gdGhlIGRyaXZlIGF0IGJvb3QgdGltZSwgdGhlbgorCSAqIHdlIHdvdWxkIGhhdmUgYmVlbiB1bmFibGUgdG8gZ2V0IHRoZSBzZWN0b3Igc2l6ZS4gIENoZWNrIHRvIHNlZSBpZgorCSAqIHRoaXMgaXMgdGhlIGNhc2UsIGFuZCB0cnkgYWdhaW4uCisJICovCisJaWYgKGNkLT5uZWVkc19zZWN0b3Jfc2l6ZSkKKwkJZ2V0X3NlY3RvcnNpemUoY2QpOworCXJldHVybiAwOworCitlcnJvcl9vdXQ6CisJcmV0dXJuIHJldHZhbDsJCit9CisKK3N0YXRpYyB2b2lkIHNyX3JlbGVhc2Uoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGkpCit7CisJc3RydWN0IHNjc2lfY2QgKmNkID0gY2RpLT5oYW5kbGU7CisKKwlpZiAoY2QtPmRldmljZS0+c2VjdG9yX3NpemUgPiAyMDQ4KQorCQlzcl9zZXRfYmxvY2tsZW5ndGgoY2QsIDIwNDgpOworCit9CisKK3N0YXRpYyBpbnQgc3JfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJc3RydWN0IGdlbmRpc2sgKmRpc2s7CisJc3RydWN0IHNjc2lfY2QgKmNkOworCWludCBtaW5vciwgZXJyb3I7CisKKwllcnJvciA9IC1FTk9ERVY7CisJaWYgKHNkZXYtPnR5cGUgIT0gVFlQRV9ST00gJiYgc2Rldi0+dHlwZSAhPSBUWVBFX1dPUk0pCisJCWdvdG8gZmFpbDsKKworCWVycm9yID0gLUVOT01FTTsKKwljZCA9IGttYWxsb2Moc2l6ZW9mKCpjZCksIEdGUF9LRVJORUwpOworCWlmICghY2QpCisJCWdvdG8gZmFpbDsKKwltZW1zZXQoY2QsIDAsIHNpemVvZigqY2QpKTsKKworCWtyZWZfaW5pdCgmY2QtPmtyZWYpOworCisJZGlzayA9IGFsbG9jX2Rpc2soMSk7CisJaWYgKCFkaXNrKQorCQlnb3RvIGZhaWxfZnJlZTsKKworCXNwaW5fbG9jaygmc3JfaW5kZXhfbG9jayk7CisJbWlub3IgPSBmaW5kX2ZpcnN0X3plcm9fYml0KHNyX2luZGV4X2JpdHMsIFNSX0RJU0tTKTsKKwlpZiAobWlub3IgPT0gU1JfRElTS1MpIHsKKwkJc3Bpbl91bmxvY2soJnNyX2luZGV4X2xvY2spOworCQllcnJvciA9IC1FQlVTWTsKKwkJZ290byBmYWlsX3B1dDsKKwl9CisJX19zZXRfYml0KG1pbm9yLCBzcl9pbmRleF9iaXRzKTsKKwlzcGluX3VubG9jaygmc3JfaW5kZXhfbG9jayk7CisKKwlkaXNrLT5tYWpvciA9IFNDU0lfQ0RST01fTUFKT1I7CisJZGlzay0+Zmlyc3RfbWlub3IgPSBtaW5vcjsKKwlzcHJpbnRmKGRpc2stPmRpc2tfbmFtZSwgInNyJWQiLCBtaW5vcik7CisJZGlzay0+Zm9wcyA9ICZzcl9iZG9wczsKKwlkaXNrLT5mbGFncyA9IEdFTkhEX0ZMX0NEOworCisJY2QtPmRldmljZSA9IHNkZXY7CisJY2QtPmRpc2sgPSBkaXNrOworCWNkLT5kcml2ZXIgPSAmc3JfdGVtcGxhdGU7CisJY2QtPmRpc2sgPSBkaXNrOworCWNkLT5jYXBhY2l0eSA9IDB4MWZmZmZmOworCWNkLT5uZWVkc19zZWN0b3Jfc2l6ZSA9IDE7CisJY2QtPmRldmljZS0+Y2hhbmdlZCA9IDE7CS8qIGZvcmNlIHJlY2hlY2sgQ0QgdHlwZSAqLworCWNkLT51c2UgPSAxOworCWNkLT5yZWFkY2Rfa25vd24gPSAwOworCWNkLT5yZWFkY2RfY2RkYSA9IDA7CisKKwljZC0+Y2RpLm9wcyA9ICZzcl9kb3BzOworCWNkLT5jZGkuaGFuZGxlID0gY2Q7CisJY2QtPmNkaS5tYXNrID0gMDsKKwljZC0+Y2RpLmNhcGFjaXR5ID0gMTsKKwlzcHJpbnRmKGNkLT5jZGkubmFtZSwgInNyJWQiLCBtaW5vcik7CisKKwlzZGV2LT5zZWN0b3Jfc2l6ZSA9IDIwNDg7CS8qIEEgZ3Vlc3MsIGp1c3QgaW4gY2FzZSAqLworCisJLyogRklYTUU6IG5lZWQgdG8gaGFuZGxlIGEgZ2V0X2NhcGFiaWxpdGllcyBmYWlsdXJlIHByb3Blcmx5ID8/ICovCisJZ2V0X2NhcGFiaWxpdGllcyhjZCk7CisJc3JfdmVuZG9yX2luaXQoY2QpOworCisJc25wcmludGYoZGlzay0+ZGV2ZnNfbmFtZSwgc2l6ZW9mKGRpc2stPmRldmZzX25hbWUpLAorCQkJIiVzL2NkIiwgc2Rldi0+ZGV2ZnNfbmFtZSk7CisJZGlzay0+ZHJpdmVyZnNfZGV2ID0gJnNkZXYtPnNkZXZfZ2VuZGV2OworCXNldF9jYXBhY2l0eShkaXNrLCBjZC0+Y2FwYWNpdHkpOworCWRpc2stPnByaXZhdGVfZGF0YSA9ICZjZC0+ZHJpdmVyOworCWRpc2stPnF1ZXVlID0gc2Rldi0+cmVxdWVzdF9xdWV1ZTsKKwljZC0+Y2RpLmRpc2sgPSBkaXNrOworCisJaWYgKHJlZ2lzdGVyX2Nkcm9tKCZjZC0+Y2RpKSkKKwkJZ290byBmYWlsX3B1dDsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGNkKTsKKwlkaXNrLT5mbGFncyB8PSBHRU5IRF9GTF9SRU1PVkFCTEU7CisJYWRkX2Rpc2soZGlzayk7CisKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAiQXR0YWNoZWQgc2NzaSBDRC1ST00gJXMgYXQgc2NzaSVkLCBjaGFubmVsICVkLCBpZCAlZCwgbHVuICVkXG4iLAorCSAgICBjZC0+Y2RpLm5hbWUsIHNkZXYtPmhvc3QtPmhvc3Rfbm8sIHNkZXYtPmNoYW5uZWwsCisJICAgIHNkZXYtPmlkLCBzZGV2LT5sdW4pOworCXJldHVybiAwOworCitmYWlsX3B1dDoKKwlwdXRfZGlzayhkaXNrKTsKK2ZhaWxfZnJlZToKKwlrZnJlZShjZCk7CitmYWlsOgorCXJldHVybiBlcnJvcjsKK30KKworCitzdGF0aWMgdm9pZCBnZXRfc2VjdG9yc2l6ZShzdHJ1Y3Qgc2NzaV9jZCAqY2QpCit7CisJdW5zaWduZWQgY2hhciBjbWRbMTBdOworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKwlpbnQgdGhlX3Jlc3VsdCwgcmV0cmllcyA9IDM7CisJaW50IHNlY3Rvcl9zaXplOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50ID0gTlVMTDsKKwlyZXF1ZXN0X3F1ZXVlX3QgKnF1ZXVlOworCisJYnVmZmVyID0ga21hbGxvYyg1MTIsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoIWJ1ZmZlcikKKwkJZ290byBFbm9tZW07CisJU1JwbnQgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3QoY2QtPmRldmljZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFTUnBudCkKKwkJZ290byBFbm9tZW07CisKKwlkbyB7CisJCWNtZFswXSA9IFJFQURfQ0FQQUNJVFk7CisJCW1lbXNldCgodm9pZCAqKSAmY21kWzFdLCAwLCA5KTsKKwkJLyogTWFyayBhcyByZWFsbHkgYnVzeSAqLworCQlTUnBudC0+c3JfcmVxdWVzdC0+cnFfc3RhdHVzID0gUlFfU0NTSV9CVVNZOworCQlTUnBudC0+c3JfY21kX2xlbiA9IDA7CisKKwkJbWVtc2V0KGJ1ZmZlciwgMCwgOCk7CisKKwkJLyogRG8gdGhlIGNvbW1hbmQgYW5kIHdhaXQuLiAqLworCQlTUnBudC0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisJCXNjc2lfd2FpdF9yZXEoU1JwbnQsICh2b2lkICopIGNtZCwgKHZvaWQgKikgYnVmZmVyLAorCQkJICAgICAgOCwgU1JfVElNRU9VVCwgTUFYX1JFVFJJRVMpOworCisJCXRoZV9yZXN1bHQgPSBTUnBudC0+c3JfcmVzdWx0OworCQlyZXRyaWVzLS07CisKKwl9IHdoaWxlICh0aGVfcmVzdWx0ICYmIHJldHJpZXMpOworCisKKwlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJU1JwbnQgPSBOVUxMOworCisJaWYgKHRoZV9yZXN1bHQpIHsKKwkJY2QtPmNhcGFjaXR5ID0gMHgxZmZmZmY7CisJCXNlY3Rvcl9zaXplID0gMjA0ODsJLyogQSBndWVzcywganVzdCBpbiBjYXNlICovCisJCWNkLT5uZWVkc19zZWN0b3Jfc2l6ZSA9IDE7CisJfSBlbHNlIHsKKyNpZiAwCisJCWlmIChjZHJvbV9nZXRfbGFzdF93cml0dGVuKCZjZC0+Y2RpLAorCQkJCQkgICAmY2QtPmNhcGFjaXR5KSkKKyNlbmRpZgorCQkJY2QtPmNhcGFjaXR5ID0gMSArICgoYnVmZmVyWzBdIDw8IDI0KSB8CisJCQkJCQkgICAgKGJ1ZmZlclsxXSA8PCAxNikgfAorCQkJCQkJICAgIChidWZmZXJbMl0gPDwgOCkgfAorCQkJCQkJICAgIGJ1ZmZlclszXSk7CisJCXNlY3Rvcl9zaXplID0gKGJ1ZmZlcls0XSA8PCAyNCkgfAorCQkgICAgKGJ1ZmZlcls1XSA8PCAxNikgfCAoYnVmZmVyWzZdIDw8IDgpIHwgYnVmZmVyWzddOworCQlzd2l0Y2ggKHNlY3Rvcl9zaXplKSB7CisJCQkvKgorCQkJICogSFAgNDAyMGkgQ0QtUmVjb3JkZXIgcmVwb3J0cyAyMzQwIGJ5dGUgc2VjdG9ycworCQkJICogUGhpbGlwcyBDRC1Xcml0ZXJzIHJlcG9ydCAyMzUyIGJ5dGUgc2VjdG9ycworCQkJICoKKwkJCSAqIFVzZSAyayBzZWN0b3JzIGZvciB0aGVtLi4KKwkJCSAqLworCQljYXNlIDA6CisJCWNhc2UgMjM0MDoKKwkJY2FzZSAyMzUyOgorCQkJc2VjdG9yX3NpemUgPSAyMDQ4OworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgMjA0ODoKKwkJCWNkLT5jYXBhY2l0eSAqPSA0OworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgNTEyOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoIiVzOiB1bnN1cHBvcnRlZCBzZWN0b3Igc2l6ZSAlZC5cbiIsCisJCQkgICAgICAgY2QtPmNkaS5uYW1lLCBzZWN0b3Jfc2l6ZSk7CisJCQljZC0+Y2FwYWNpdHkgPSAwOworCQkJY2QtPm5lZWRzX3NlY3Rvcl9zaXplID0gMTsKKwkJfQorCisJCWNkLT5kZXZpY2UtPnNlY3Rvcl9zaXplID0gc2VjdG9yX3NpemU7CisKKwkJLyoKKwkJICogQWRkIHRoaXMgc28gdGhhdCB3ZSBoYXZlIHRoZSBhYmlsaXR5IHRvIGNvcnJlY3RseSBnYXVnZQorCQkgKiB3aGF0IHRoZSBkZXZpY2UgaXMgY2FwYWJsZSBvZi4KKwkJICovCisJCWNkLT5uZWVkc19zZWN0b3Jfc2l6ZSA9IDA7CisJCXNldF9jYXBhY2l0eShjZC0+ZGlzaywgY2QtPmNhcGFjaXR5KTsKKwl9CisKKwlxdWV1ZSA9IGNkLT5kZXZpY2UtPnJlcXVlc3RfcXVldWU7CisJYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUocXVldWUsIHNlY3Rvcl9zaXplKTsKK291dDoKKwlrZnJlZShidWZmZXIpOworCXJldHVybjsKKworRW5vbWVtOgorCWNkLT5jYXBhY2l0eSA9IDB4MWZmZmZmOworCXNlY3Rvcl9zaXplID0gMjA0ODsJLyogQSBndWVzcywganVzdCBpbiBjYXNlICovCisJY2QtPm5lZWRzX3NlY3Rvcl9zaXplID0gMTsKKwlpZiAoU1JwbnQpCisJCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgZ2V0X2NhcGFiaWxpdGllcyhzdHJ1Y3Qgc2NzaV9jZCAqY2QpCit7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCXN0cnVjdCBzY3NpX21vZGVfZGF0YSBkYXRhOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50OworCXVuc2lnbmVkIGNoYXIgY21kW01BWF9DT01NQU5EX1NJWkVdOworCXVuc2lnbmVkIGludCB0aGVfcmVzdWx0OworCWludCByZXRyaWVzLCByYywgbjsKKworCXN0YXRpYyBjaGFyICpsb2FkbWVjaFtdID0KKwl7CisJCSJjYWRkeSIsCisJCSJ0cmF5IiwKKwkJInBvcC11cCIsCisJCSIiLAorCQkiY2hhbmdlciIsCisJCSJjYXJ0cmlkZ2UgY2hhbmdlciIsCisJCSIiLAorCQkiIgorCX07CisKKwkvKiBhbGxvY2F0ZSBhIHJlcXVlc3QgZm9yIHRoZSBURVNUX1VOSVRfUkVBRFkgKi8KKwlTUnBudCA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChjZC0+ZGV2aWNlLCBHRlBfS0VSTkVMKTsKKwlpZiAoIVNScG50KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIihnZXRfY2FwYWJpbGl0aWVzOikgUmVxdWVzdCBhbGxvY2F0aW9uICIKKwkJICAgICAgICJmYWlsdXJlLlxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBhbGxvY2F0ZSB0cmFuc2ZlciBidWZmZXIgKi8KKwlidWZmZXIgPSBrbWFsbG9jKDUxMiwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWlmICghYnVmZmVyKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3I6IG91dCBvZiBtZW1vcnkuXG4iKTsKKwkJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCQlyZXR1cm47CisJfQorCisJLyogaXNzdWUgVEVTVF9VTklUX1JFQURZIHVudGlsIHRoZSBpbml0aWFsIHN0YXJ0dXAgVU5JVF9BVFRFTlRJT04KKwkgKiBjb25kaXRpb25zIGFyZSBnb25lLCBvciBhIHRpbWVvdXQgaGFwcGVucworCSAqLworCXJldHJpZXMgPSAwOworCWRvIHsKKwkJbWVtc2V0KCh2b2lkICopY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwkJY21kWzBdID0gVEVTVF9VTklUX1JFQURZOworCisJCVNScG50LT5zcl9jbWRfbGVuID0gMDsKKwkJU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclswXSA9IDA7CisJCVNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0gPSAwOworCQlTUnBudC0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKKworCQlzY3NpX3dhaXRfcmVxIChTUnBudCwgKHZvaWQgKikgY21kLCBidWZmZXIsCisJCQkgICAgICAgMCwgU1JfVElNRU9VVCwgTUFYX1JFVFJJRVMpOworCisJCXRoZV9yZXN1bHQgPSBTUnBudC0+c3JfcmVzdWx0OworCQlyZXRyaWVzKys7CisJfSB3aGlsZSAocmV0cmllcyA8IDUgJiYgCisJCSAoIXNjc2lfc3RhdHVzX2lzX2dvb2QodGhlX3Jlc3VsdCkgfHwKKwkJICAoKGRyaXZlcl9ieXRlKHRoZV9yZXN1bHQpICYgRFJJVkVSX1NFTlNFKSAmJgorCQkgICBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdID09IFVOSVRfQVRURU5USU9OKSkpOworCisJLyogYXNrIGZvciBtb2RlIHBhZ2UgMHgyYSAqLworCXJjID0gc2NzaV9tb2RlX3NlbnNlKGNkLT5kZXZpY2UsIDAsIDB4MmEsIGJ1ZmZlciwgMTI4LAorCQkJICAgICBTUl9USU1FT1VULCAzLCAmZGF0YSk7CisKKwlpZiAoIXNjc2lfc3RhdHVzX2lzX2dvb2QocmMpKSB7CisJCS8qIGZhaWxlZCwgZHJpdmUgZG9lc24ndCBoYXZlIGNhcGFiaWxpdGllcyBtb2RlIHBhZ2UgKi8KKwkJY2QtPmNkaS5zcGVlZCA9IDE7CisJCWNkLT5jZGkubWFzayB8PSAoQ0RDX0NEX1IgfCBDRENfQ0RfUlcgfCBDRENfRFZEX1IgfAorCQkJCQkgQ0RDX0RWRCB8IENEQ19EVkRfUkFNIHwKKwkJCQkJIENEQ19TRUxFQ1RfRElTQyB8IENEQ19TRUxFQ1RfU1BFRUQpOworCQlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJCWtmcmVlKGJ1ZmZlcik7CisJCXByaW50aygiJXM6IHNjc2ktMSBkcml2ZVxuIiwgY2QtPmNkaS5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCW4gPSBkYXRhLmhlYWRlcl9sZW5ndGggKyBkYXRhLmJsb2NrX2Rlc2NyaXB0b3JfbGVuZ3RoOworCWNkLT5jZGkuc3BlZWQgPSAoKGJ1ZmZlcltuICsgOF0gPDwgOCkgKyBidWZmZXJbbiArIDldKSAvIDE3NjsKKwljZC0+cmVhZGNkX2tub3duID0gMTsKKwljZC0+cmVhZGNkX2NkZGEgPSBidWZmZXJbbiArIDVdICYgMHgwMTsKKwkvKiBwcmludCBzb21lIGNhcGFiaWxpdHkgYml0cyAqLworCXByaW50aygiJXM6IHNjc2kzLW1tYyBkcml2ZTogJWR4LyVkeCAlcyVzJXMlcyVzJXNcbiIsIGNkLT5jZGkubmFtZSwKKwkgICAgICAgKChidWZmZXJbbiArIDE0XSA8PCA4KSArIGJ1ZmZlcltuICsgMTVdKSAvIDE3NiwKKwkgICAgICAgY2QtPmNkaS5zcGVlZCwKKwkgICAgICAgYnVmZmVyW24gKyAzXSAmIDB4MDEgPyAid3JpdGVyICIgOiAiIiwgLyogQ0QgV3JpdGVyICovCisJICAgICAgIGJ1ZmZlcltuICsgM10gJiAweDIwID8gImR2ZC1yYW0gIiA6ICIiLAorCSAgICAgICBidWZmZXJbbiArIDJdICYgMHgwMiA/ICJjZC9ydyAiIDogIiIsIC8qIGNhbiByZWFkIHJld3JpdGVhYmxlICovCisJICAgICAgIGJ1ZmZlcltuICsgNF0gJiAweDIwID8gInhhL2Zvcm0yICIgOiAiIiwJLyogY2FuIHJlYWQgeGEvZnJvbTIgKi8KKwkgICAgICAgYnVmZmVyW24gKyA1XSAmIDB4MDEgPyAiY2RkYSAiIDogIiIsIC8qIGNhbiByZWFkIGF1ZGlvIGRhdGEgKi8KKwkgICAgICAgbG9hZG1lY2hbYnVmZmVyW24gKyA2XSA+PiA1XSk7CisJaWYgKChidWZmZXJbbiArIDZdID4+IDUpID09IDApCisJCS8qIGNhZGR5IGRyaXZlcyBjYW4ndCBjbG9zZSB0cmF5Li4uICovCisJCWNkLT5jZGkubWFzayB8PSBDRENfQ0xPU0VfVFJBWTsKKwlpZiAoKGJ1ZmZlcltuICsgMl0gJiAweDgpID09IDApCisJCS8qIG5vdCBhIERWRCBkcml2ZSAqLworCQljZC0+Y2RpLm1hc2sgfD0gQ0RDX0RWRDsKKwlpZiAoKGJ1ZmZlcltuICsgM10gJiAweDIwKSA9PSAwKSAKKwkJLyogY2FuJ3Qgd3JpdGUgRFZELVJBTSBtZWRpYSAqLworCQljZC0+Y2RpLm1hc2sgfD0gQ0RDX0RWRF9SQU07CisJaWYgKChidWZmZXJbbiArIDNdICYgMHgxMCkgPT0gMCkKKwkJLyogY2FuJ3Qgd3JpdGUgRFZELVIgbWVkaWEgKi8KKwkJY2QtPmNkaS5tYXNrIHw9IENEQ19EVkRfUjsKKwlpZiAoKGJ1ZmZlcltuICsgM10gJiAweDIpID09IDApCisJCS8qIGNhbid0IHdyaXRlIENELVJXIG1lZGlhICovCisJCWNkLT5jZGkubWFzayB8PSBDRENfQ0RfUlc7CisJaWYgKChidWZmZXJbbiArIDNdICYgMHgxKSA9PSAwKQorCQkvKiBjYW4ndCB3cml0ZSBDRC1SIG1lZGlhICovCisJCWNkLT5jZGkubWFzayB8PSBDRENfQ0RfUjsKKwlpZiAoKGJ1ZmZlcltuICsgNl0gJiAweDgpID09IDApCisJCS8qIGNhbid0IGVqZWN0ICovCisJCWNkLT5jZGkubWFzayB8PSBDRENfT1BFTl9UUkFZOworCisJaWYgKChidWZmZXJbbiArIDZdID4+IDUpID09IG1lY2h0eXBlX2luZGl2aWR1YWxfY2hhbmdlciB8fAorCSAgICAoYnVmZmVyW24gKyA2XSA+PiA1KSA9PSBtZWNodHlwZV9jYXJ0cmlkZ2VfY2hhbmdlcikKKwkJY2QtPmNkaS5jYXBhY2l0eSA9CisJCSAgICBjZHJvbV9udW1iZXJfb2Zfc2xvdHMoJmNkLT5jZGkpOworCWlmIChjZC0+Y2RpLmNhcGFjaXR5IDw9IDEpCisJCS8qIG5vdCBhIGNoYW5nZXIgKi8KKwkJY2QtPmNkaS5tYXNrIHw9IENEQ19TRUxFQ1RfRElTQzsKKwkvKmVsc2UgICAgSSBkb24ndCB0aGluayBpdCBjYW4gY2xvc2UgaXRzIHRyYXkKKwkJY2QtPmNkaS5tYXNrIHw9IENEQ19DTE9TRV9UUkFZOyAqLworCisJLyoKKwkgKiBpZiBEVkQtUkFNLCBNUlctVyBvciBDRC1SVywgd2UgYXJlIHJhbmRvbWx5IHdyaXRhYmxlCisJICovCisJaWYgKChjZC0+Y2RpLm1hc2sgJiAoQ0RDX0RWRF9SQU0gfCBDRENfTVJXX1cgfCBDRENfUkFNIHwgQ0RDX0NEX1JXKSkgIT0KKwkJCShDRENfRFZEX1JBTSB8IENEQ19NUldfVyB8IENEQ19SQU0gfCBDRENfQ0RfUlcpKSB7CisJCWNkLT5kZXZpY2UtPndyaXRlYWJsZSA9IDE7CisJfQorCisJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCWtmcmVlKGJ1ZmZlcik7Cit9CisKKy8qCisgKiBzcl9wYWNrZXQoKSBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBnZW5lcmljIGNvbW1hbmRzIGdlbmVyYXRlZAorICogYnkgdGhlIFVuaWZvcm0gQ0QtUk9NIGxheWVyLiAKKyAqLworc3RhdGljIGludCBzcl9wYWNrZXQoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksCisJCXN0cnVjdCBwYWNrZXRfY29tbWFuZCAqY2djKQoreworCWlmIChjZ2MtPnRpbWVvdXQgPD0gMCkKKwkJY2djLT50aW1lb3V0ID0gSU9DVExfVElNRU9VVDsKKworCXNyX2RvX2lvY3RsKGNkaS0+aGFuZGxlLCBjZ2MpOworCisJcmV0dXJuIGNnYy0+c3RhdDsKK30KKworLyoqCisgKglzcl9rcmVmX3JlbGVhc2UgLSBDYWxsZWQgdG8gZnJlZSB0aGUgc2NzaV9jZCBzdHJ1Y3R1cmUKKyAqCUBrcmVmOiBwb2ludGVyIHRvIGVtYmVkZGVkIGtyZWYKKyAqCisgKglzcl9yZWZfc2VtIG11c3QgYmUgaGVsZCBlbnRlcmluZyB0aGlzIHJvdXRpbmUuICBCZWNhdXNlIGl0IGlzCisgKgljYWxsZWQgb24gbGFzdCBwdXQsIHlvdSBzaG91bGQgYWx3YXlzIHVzZSB0aGUgc2NzaV9jZF9nZXQoKQorICoJc2NzaV9jZF9wdXQoKSBoZWxwZXJzIHdoaWNoIG1hbmlwdWxhdGUgdGhlIHNlbWFwaG9yZSBkaXJlY3RseQorICoJYW5kIG5ldmVyIGRvIGEgZGlyZWN0IGtyZWZfcHV0KCkuCisgKiovCitzdGF0aWMgdm9pZCBzcl9rcmVmX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHNjc2lfY2QgKmNkID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBzY3NpX2NkLCBrcmVmKTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGNkLT5kaXNrOworCisJc3Bpbl9sb2NrKCZzcl9pbmRleF9sb2NrKTsKKwljbGVhcl9iaXQoZGlzay0+Zmlyc3RfbWlub3IsIHNyX2luZGV4X2JpdHMpOworCXNwaW5fdW5sb2NrKCZzcl9pbmRleF9sb2NrKTsKKworCXVucmVnaXN0ZXJfY2Ryb20oJmNkLT5jZGkpOworCisJZGlzay0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKworCXB1dF9kaXNrKGRpc2spOworCisJa2ZyZWUoY2QpOworfQorCitzdGF0aWMgaW50IHNyX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjc2lfY2QgKmNkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlkZWxfZ2VuZGlzayhjZC0+ZGlzayk7CisKKwlkb3duKCZzcl9yZWZfc2VtKTsKKwlrcmVmX3B1dCgmY2QtPmtyZWYsIHNyX2tyZWZfcmVsZWFzZSk7CisJdXAoJnNyX3JlZl9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfc3Iodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IHJlZ2lzdGVyX2Jsa2RldihTQ1NJX0NEUk9NX01BSk9SLCAic3IiKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwlyZXR1cm4gc2NzaV9yZWdpc3Rlcl9kcml2ZXIoJnNyX3RlbXBsYXRlLmdlbmRydik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3NyKHZvaWQpCit7CisJc2NzaV91bnJlZ2lzdGVyX2RyaXZlcigmc3JfdGVtcGxhdGUuZ2VuZHJ2KTsKKwl1bnJlZ2lzdGVyX2Jsa2RldihTQ1NJX0NEUk9NX01BSk9SLCAic3IiKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9zcik7Cittb2R1bGVfZXhpdChleGl0X3NyKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zci5oIGIvZHJpdmVycy9zY3NpL3NyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzMTc4MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zci5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiAgICAgIHNyLmggYnkgRGF2aWQgR2lsbGVyCisgKiAgICAgIENELVJPTSBkaXNrIGRyaXZlciBoZWFkZXIgZmlsZQorICogICAgICAKKyAqICAgICAgYWRhcHRlZCBmcm9tOgorICogICAgICBzZC5oIENvcHlyaWdodCAoQykgMTk5MiBEcmV3IEVja2hhcmR0IAorICogICAgICBTQ1NJIGRpc2sgZHJpdmVyIGhlYWRlciBmaWxlIGJ5CisgKiAgICAgICAgICAgICAgRHJldyBFY2toYXJkdCAKKyAqCisgKiAgICAgIDxkcmV3QGNvbG9yYWRvLmVkdT4KKyAqCisgKiAgICAgICBNb2RpZmllZCBieSBFcmljIFlvdW5nZGFsZSBlcmljQGFuZGFudGUub3JnIHRvCisgKiAgICAgICBhZGQgc2NhdHRlci1nYXRoZXIsIG11bHRpcGxlIG91dHN0YW5kaW5nIHJlcXVlc3QsIGFuZCBvdGhlcgorICogICAgICAgZW5oYW5jZW1lbnRzLgorICovCisKKyNpZm5kZWYgX1NSX0gKKyNkZWZpbmUgX1NSX0gKKworI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8bGludXgva3JlZi5oPgorCitzdHJ1Y3Qgc2NzaV9kZXZpY2U7CisKKy8qIFRoZSBDRFJPTSBpcyBmYWlybHkgc2xvdywgc28gd2UgbmVlZCBhIGxpdHRsZSBleHRyYSB0aW1lICovCisvKiBJbiBmYWN0LCBpdCBpcyB2ZXJ5IHNsb3cgaWYgaXQgaGFzIHRvIHNwaW4gdXAgZmlyc3QgKi8KKyNkZWZpbmUgSU9DVExfVElNRU9VVCAzMCpIWgorCisKK3R5cGVkZWYgc3RydWN0IHNjc2lfY2QgeworCXN0cnVjdCBzY3NpX2RyaXZlciAqZHJpdmVyOworCXVuc2lnbmVkIGNhcGFjaXR5OwkvKiBzaXplIGluIGJsb2NrcyAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZTsKKwl1bnNpZ25lZCBpbnQgdmVuZG9yOwkvKiB2ZW5kb3IgY29kZSwgc2VlIHNyX3ZlbmRvci5jICAgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIG1zX29mZnNldDsJLyogZm9yIHJlYWRpbmcgbXVsdGlzZXNzaW9uLUNEJ3MgICAgICAgICovCisJdW5zaWduZWQgbmVlZHNfc2VjdG9yX3NpemU6MTsJLyogbmVlZHMgdG8gZ2V0IHNlY3RvciBzaXplICovCisJdW5zaWduZWQgdXNlOjE7CQkvKiBpcyB0aGlzIGRldmljZSBzdGlsbCBzdXBwb3J0YWJsZSAgICAgKi8KKwl1bnNpZ25lZCB4YV9mbGFnOjE7CS8qIENEIGhhcyBYQSBzZWN0b3JzID8gKi8KKwl1bnNpZ25lZCByZWFkY2Rfa25vd246MTsJLyogZHJpdmUgc3VwcG9ydHMgUkVBRF9DRCAoMHhiZSkgKi8KKwl1bnNpZ25lZCByZWFkY2RfY2RkYToxOwkvKiByZWFkaW5nIGF1ZGlvIGRhdGEgdXNpbmcgUkVBRF9DRCAqLworCXN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyBjZGk7CisJLyogV2UgaG9sZCBnZW5kaXNrIGFuZCBzY3NpX2RldmljZSByZWZlcmVuY2VzIG9uIHByb2JlIGFuZCB1c2UKKwkgKiB0aGUgcmVmcyBvbiB0aGlzIGtyZWYgdG8gZGVjaWRlIHdoZW4gdG8gcmVsZWFzZSB0aGVtICovCisJc3RydWN0IGtyZWYga3JlZjsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKK30gU2NzaV9DRDsKKworaW50IHNyX2RvX2lvY3RsKFNjc2lfQ0QgKiwgc3RydWN0IHBhY2tldF9jb21tYW5kICopOworCitpbnQgc3JfbG9ja19kb29yKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqLCBpbnQpOworaW50IHNyX3RyYXlfbW92ZShzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKiwgaW50KTsKK2ludCBzcl9kcml2ZV9zdGF0dXMoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICosIGludCk7CitpbnQgc3JfZGlza19zdGF0dXMoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICopOworaW50IHNyX2dldF9sYXN0X3Nlc3Npb24oc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICosIHN0cnVjdCBjZHJvbV9tdWx0aXNlc3Npb24gKik7CitpbnQgc3JfZ2V0X21jbihzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKiwgc3RydWN0IGNkcm9tX21jbiAqKTsKK2ludCBzcl9yZXNldChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKik7CitpbnQgc3Jfc2VsZWN0X3NwZWVkKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBpbnQgc3BlZWQpOworaW50IHNyX2F1ZGlvX2lvY3RsKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqLCB1bnNpZ25lZCBpbnQsIHZvaWQgKik7CitpbnQgc3JfZGV2X2lvY3RsKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworCitpbnQgc3JfaXNfeGEoU2NzaV9DRCAqKTsKKworLyogc3JfdmVuZG9yLmMgKi8KK3ZvaWQgc3JfdmVuZG9yX2luaXQoU2NzaV9DRCAqKTsKK2ludCBzcl9jZF9jaGVjayhzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKik7CitpbnQgc3Jfc2V0X2Jsb2NrbGVuZ3RoKFNjc2lfQ0QgKiwgaW50IGJsb2NrbGVuZ3RoKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3JfaW9jdGwuYyBiL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NzFiZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc3JfaW9jdGwuYwpAQCAtMCwwICsxLDU2OCBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrcGcuaD4KKyNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfcmVxdWVzdC5oPgorCisjaW5jbHVkZSAic3IuaCIKKworI2lmIDAKKyNkZWZpbmUgREVCVUcKKyNlbmRpZgorCisvKiBUaGUgc3JfaXNfeGEoKSBzZWVtcyB0byB0cmlnZ2VyIGZpcm13YXJlIGJ1Z3Mgd2l0aCBzb21lIGRyaXZlcyA6LSgKKyAqIEl0IGlzIG9mZiBieSBkZWZhdWx0IGFuZCBjYW4gYmUgdHVybmVkIG9uIHdpdGggdGhpcyBtb2R1bGUgcGFyYW1ldGVyICovCitzdGF0aWMgaW50IHhhX3Rlc3QgPSAwOworCittb2R1bGVfcGFyYW0oeGFfdGVzdCwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CisKKworI2RlZmluZSBJT0NUTF9SRVRSSUVTIDMKKworLyogQVRBUEkgZHJpdmVzIGRvbid0IGhhdmUgYSBTQ01EX1BMQVlBVURJT19USSBjb21tYW5kLiAgV2hlbiB0aGVzZSBkcml2ZXMKKyAgIGFyZSBlbXVsYXRpbmcgYSBTQ1NJIGRldmljZSB2aWEgdGhlIGlkZXNjc2kgbW9kdWxlLCB0aGV5IG5lZWQgdG8gaGF2ZQorICAgQ0RST01QTEFZVFJLSU5EIGNvbW1hbmRzIHRyYW5zbGF0ZWQgaW50byBDRFJPTVBMQVlNU0YgY29tbWFuZHMgZm9yIHRoZW0gKi8KKworc3RhdGljIGludCBzcl9mYWtlX3BsYXl0cmtpbmQoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIHN0cnVjdCBjZHJvbV90aSAqdGkpCit7CisJc3RydWN0IGNkcm9tX3RvY2VudHJ5IHRyazBfdGUsIHRyazFfdGU7CisJc3RydWN0IGNkcm9tX3RvY2hkciB0b2NoZHI7CisJc3RydWN0IHBhY2tldF9jb21tYW5kIGNnYzsKKwlpbnQgbnRyYWNrcywgcmV0OworCisJaWYgKChyZXQgPSBzcl9hdWRpb19pb2N0bChjZGksIENEUk9NUkVBRFRPQ0hEUiwgJnRvY2hkcikpKQorCQlyZXR1cm4gcmV0OworCisJbnRyYWNrcyA9IHRvY2hkci5jZHRoX3RyazEgLSB0b2NoZHIuY2R0aF90cmswICsgMTsKKwkKKwlpZiAodGktPmNkdGlfdHJrMSA9PSBudHJhY2tzKSAKKwkJdGktPmNkdGlfdHJrMSA9IENEUk9NX0xFQURPVVQ7CisJZWxzZSBpZiAodGktPmNkdGlfdHJrMSAhPSBDRFJPTV9MRUFET1VUKQorCQl0aS0+Y2R0aV90cmsxICsrOworCisJdHJrMF90ZS5jZHRlX3RyYWNrID0gdGktPmNkdGlfdHJrMDsKKwl0cmswX3RlLmNkdGVfZm9ybWF0ID0gQ0RST01fTVNGOworCXRyazFfdGUuY2R0ZV90cmFjayA9IHRpLT5jZHRpX3RyazE7CisJdHJrMV90ZS5jZHRlX2Zvcm1hdCA9IENEUk9NX01TRjsKKwkKKwlpZiAoKHJldCA9IHNyX2F1ZGlvX2lvY3RsKGNkaSwgQ0RST01SRUFEVE9DRU5UUlksICZ0cmswX3RlKSkpCisJCXJldHVybiByZXQ7CisJaWYgKChyZXQgPSBzcl9hdWRpb19pb2N0bChjZGksIENEUk9NUkVBRFRPQ0VOVFJZLCAmdHJrMV90ZSkpKQorCQlyZXR1cm4gcmV0OworCisJbWVtc2V0KCZjZ2MsIDAsIHNpemVvZihzdHJ1Y3QgcGFja2V0X2NvbW1hbmQpKTsKKwljZ2MuY21kWzBdID0gR1BDTURfUExBWV9BVURJT19NU0Y7CisJY2djLmNtZFszXSA9IHRyazBfdGUuY2R0ZV9hZGRyLm1zZi5taW51dGU7CisJY2djLmNtZFs0XSA9IHRyazBfdGUuY2R0ZV9hZGRyLm1zZi5zZWNvbmQ7CisJY2djLmNtZFs1XSA9IHRyazBfdGUuY2R0ZV9hZGRyLm1zZi5mcmFtZTsKKwljZ2MuY21kWzZdID0gdHJrMV90ZS5jZHRlX2FkZHIubXNmLm1pbnV0ZTsKKwljZ2MuY21kWzddID0gdHJrMV90ZS5jZHRlX2FkZHIubXNmLnNlY29uZDsKKwljZ2MuY21kWzhdID0gdHJrMV90ZS5jZHRlX2FkZHIubXNmLmZyYW1lOworCWNnYy5kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOworCWNnYy50aW1lb3V0ID0gSU9DVExfVElNRU9VVDsKKwlyZXR1cm4gc3JfZG9faW9jdGwoY2RpLT5oYW5kbGUsICZjZ2MpOworfQorCisvKiBXZSBkbyBvdXIgb3duIHJldHJpZXMgYmVjYXVzZSB3ZSB3YW50IHRvIGtub3cgd2hhdCB0aGUgc3BlY2lmaWMKKyAgIGVycm9yIGNvZGUgaXMuICBOb3JtYWxseSB0aGUgVU5JVF9BVFRFTlRJT04gY29kZSB3aWxsIGF1dG9tYXRpY2FsbHkKKyAgIGNsZWFyIGFmdGVyIG9uZSBlcnJvciAqLworCitpbnQgc3JfZG9faW9jdGwoU2NzaV9DRCAqY2QsIHN0cnVjdCBwYWNrZXRfY29tbWFuZCAqY2djKQoreworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50OworCXN0cnVjdCBzY3NpX2RldmljZSAqU0RldjsKKyAgICAgICAgc3RydWN0IHJlcXVlc3QgKnJlcTsKKwlpbnQgcmVzdWx0LCBlcnIgPSAwLCByZXRyaWVzID0gMDsKKworCVNEZXYgPSBjZC0+ZGV2aWNlOworCVNScG50ID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KFNEZXYsIEdGUF9LRVJORUwpOworICAgICAgICBpZiAoIVNScG50KSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgU0NTSSByZXF1ZXN0IGluIHNyX2RvX2lvY3RsIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworICAgICAgICB9CisJU1JwbnQtPnNyX2RhdGFfZGlyZWN0aW9uID0gY2djLT5kYXRhX2RpcmVjdGlvbjsKKworICAgICAgcmV0cnk6CisJaWYgKCFzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2luZ19lcnJvcnMoU0RldikpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlzY3NpX3dhaXRfcmVxKFNScG50LCBjZ2MtPmNtZCwgY2djLT5idWZmZXIsIGNnYy0+YnVmbGVuLAorCQkgICAgICBjZ2MtPnRpbWVvdXQsIElPQ1RMX1JFVFJJRVMpOworCisJcmVxID0gU1JwbnQtPnNyX3JlcXVlc3Q7CisJaWYgKFNScG50LT5zcl9idWZmZXIgJiYgcmVxLT5idWZmZXIgJiYgU1JwbnQtPnNyX2J1ZmZlciAhPSByZXEtPmJ1ZmZlcikgeworCQltZW1jcHkocmVxLT5idWZmZXIsIFNScG50LT5zcl9idWZmZXIsIFNScG50LT5zcl9idWZmbGVuKTsKKwkJa2ZyZWUoU1JwbnQtPnNyX2J1ZmZlcik7CisJCVNScG50LT5zcl9idWZmZXIgPSByZXEtPmJ1ZmZlcjsKKyAgICAgICAgfQorCisJcmVzdWx0ID0gU1JwbnQtPnNyX3Jlc3VsdDsKKworCS8qIE1pbmltYWwgZXJyb3IgY2hlY2tpbmcuICBJZ25vcmUgY2FzZXMgd2Uga25vdyBhYm91dCwgYW5kIHJlcG9ydCB0aGUgcmVzdC4gKi8KKwlpZiAoZHJpdmVyX2J5dGUocmVzdWx0KSAhPSAwKSB7CisJCXN3aXRjaCAoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAmIDB4ZikgeworCQljYXNlIFVOSVRfQVRURU5USU9OOgorCQkJU0Rldi0+Y2hhbmdlZCA9IDE7CisJCQlpZiAoIWNnYy0+cXVpZXQpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGRpc2MgY2hhbmdlIGRldGVjdGVkLlxuIiwgY2QtPmNkaS5uYW1lKTsKKwkJCWlmIChyZXRyaWVzKysgPCAxMCkKKwkJCQlnb3RvIHJldHJ5OworCQkJZXJyID0gLUVOT01FRElVTTsKKwkJCWJyZWFrOworCQljYXNlIE5PVF9SRUFEWToJLyogVGhpcyBoYXBwZW5zIGlmIHRoZXJlIGlzIG5vIGRpc2MgaW4gZHJpdmUgKi8KKwkJCWlmIChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEyXSA9PSAweDA0ICYmCisJCQkgICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10gPT0gMHgwMSkgeworCQkJCS8qIHNlbnNlOiBMb2dpY2FsIHVuaXQgaXMgaW4gcHJvY2VzcyBvZiBiZWNvbWluZyByZWFkeSAqLworCQkJCWlmICghY2djLT5xdWlldCkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENEUk9NIG5vdCByZWFkeSB5ZXQuXG4iLCBjZC0+Y2RpLm5hbWUpOworCQkJCWlmIChyZXRyaWVzKysgPCAxMCkgeworCQkJCQkvKiBzbGVlcCAyIHNlYyBhbmQgdHJ5IGFnYWluICovCisJCQkJCXNzbGVlcCgyKTsKKwkJCQkJZ290byByZXRyeTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiAyMCBzZWNzIGFyZSBlbm91Z2g/ICovCisJCQkJCWVyciA9IC1FTk9NRURJVU07CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmICghY2djLT5xdWlldCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ0RST00gbm90IHJlYWR5LiAgTWFrZSBzdXJlIHRoZXJlIGlzIGEgZGlzYyBpbiB0aGUgZHJpdmUuXG4iLCBjZC0+Y2RpLm5hbWUpOworI2lmZGVmIERFQlVHCisJCQlzY3NpX3ByaW50X3JlcV9zZW5zZSgic3IiLCBTUnBudCk7CisjZW5kaWYKKwkJCWVyciA9IC1FTk9NRURJVU07CisJCQlicmVhazsKKwkJY2FzZSBJTExFR0FMX1JFUVVFU1Q6CisJCQllcnIgPSAtRUlPOworCQkJaWYgKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTJdID09IDB4MjAgJiYKKwkJCSAgICBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXSA9PSAweDAwKQorCQkJCS8qIHNlbnNlOiBJbnZhbGlkIGNvbW1hbmQgb3BlcmF0aW9uIGNvZGUgKi8KKwkJCQllcnIgPSAtRURSSVZFX0NBTlRfRE9fVEhJUzsKKyNpZmRlZiBERUJVRworCQkJX19zY3NpX3ByaW50X2NvbW1hbmQoY2djLT5jbWQpOworCQkJc2NzaV9wcmludF9yZXFfc2Vuc2UoInNyIiwgU1JwbnQpOworI2VuZGlmCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENEUk9NIChpb2N0bCkgZXJyb3IsIGNvbW1hbmQ6ICIsIGNkLT5jZGkubmFtZSk7CisJCQlfX3Njc2lfcHJpbnRfY29tbWFuZChjZ2MtPmNtZCk7CisJCQlzY3NpX3ByaW50X3JlcV9zZW5zZSgic3IiLCBTUnBudCk7CisJCQllcnIgPSAtRUlPOworCQl9CisJfQorCisJaWYgKGNnYy0+c2Vuc2UpCisJCW1lbWNweShjZ2MtPnNlbnNlLCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyLCBzaXplb2YoKmNnYy0+c2Vuc2UpKTsKKworCS8qIFdha2UgdXAgYSBwcm9jZXNzIHdhaXRpbmcgZm9yIGRldmljZSAqLworICAgICAgb3V0X2ZyZWU6CisJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCVNScG50ID0gTlVMTDsKKyAgICAgIG91dDoKKwljZ2MtPnN0YXQgPSBlcnI7CisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogaW50ZXJmYWNlIHRvIGNkcm9tLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgaW50IHRlc3RfdW5pdF9yZWFkeShTY3NpX0NEICpjZCkKK3sKKwlzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgY2djOworCisJbWVtc2V0KCZjZ2MsIDAsIHNpemVvZihzdHJ1Y3QgcGFja2V0X2NvbW1hbmQpKTsKKwljZ2MuY21kWzBdID0gR1BDTURfVEVTVF9VTklUX1JFQURZOworCWNnYy5xdWlldCA9IDE7CisJY2djLmRhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7CisJY2djLnRpbWVvdXQgPSBJT0NUTF9USU1FT1VUOworCXJldHVybiBzcl9kb19pb2N0bChjZCwgJmNnYyk7Cit9CisKK2ludCBzcl90cmF5X21vdmUoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIGludCBwb3MpCit7CisJU2NzaV9DRCAqY2QgPSBjZGktPmhhbmRsZTsKKwlzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgY2djOworCisJbWVtc2V0KCZjZ2MsIDAsIHNpemVvZihzdHJ1Y3QgcGFja2V0X2NvbW1hbmQpKTsKKwljZ2MuY21kWzBdID0gR1BDTURfU1RBUlRfU1RPUF9VTklUOworCWNnYy5jbWRbNF0gPSAocG9zID09IDApID8gMHgwMyAvKiBjbG9zZSAqLyA6IDB4MDIgLyogZWplY3QgKi8gOworCWNnYy5kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOworCWNnYy50aW1lb3V0ID0gSU9DVExfVElNRU9VVDsKKwlyZXR1cm4gc3JfZG9faW9jdGwoY2QsICZjZ2MpOworfQorCitpbnQgc3JfbG9ja19kb29yKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBpbnQgbG9jaykKK3sKKwlTY3NpX0NEICpjZCA9IGNkaS0+aGFuZGxlOworCisJcmV0dXJuIHNjc2lfc2V0X21lZGl1bV9yZW1vdmFsKGNkLT5kZXZpY2UsIGxvY2sgPworCQkgICAgICAgU0NTSV9SRU1PVkFMX1BSRVZFTlQgOiBTQ1NJX1JFTU9WQUxfQUxMT1cpOworfQorCitpbnQgc3JfZHJpdmVfc3RhdHVzKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBpbnQgc2xvdCkKK3sKKwlpZiAoQ0RTTF9DVVJSRU5UICE9IHNsb3QpIHsKKwkJLyogd2UgaGF2ZSBubyBjaGFuZ2VyIHN1cHBvcnQgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICgwID09IHRlc3RfdW5pdF9yZWFkeShjZGktPmhhbmRsZSkpCisJCXJldHVybiBDRFNfRElTQ19PSzsKKworCXJldHVybiBDRFNfVFJBWV9PUEVOOworfQorCitpbnQgc3JfZGlza19zdGF0dXMoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGkpCit7CisJU2NzaV9DRCAqY2QgPSBjZGktPmhhbmRsZTsKKwlzdHJ1Y3QgY2Ryb21fdG9jaGRyIHRvY19oOworCXN0cnVjdCBjZHJvbV90b2NlbnRyeSB0b2NfZTsKKwlpbnQgaSwgcmMsIGhhdmVfZGF0YXRyYWNrcyA9IDA7CisKKwkvKiBsb29rIGZvciBkYXRhIHRyYWNrcyAqLworCWlmICgwICE9IChyYyA9IHNyX2F1ZGlvX2lvY3RsKGNkaSwgQ0RST01SRUFEVE9DSERSLCAmdG9jX2gpKSkKKwkJcmV0dXJuIChyYyA9PSAtRU5PTUVESVVNKSA/IENEU19OT19ESVNDIDogQ0RTX05PX0lORk87CisKKwlmb3IgKGkgPSB0b2NfaC5jZHRoX3RyazA7IGkgPD0gdG9jX2guY2R0aF90cmsxOyBpKyspIHsKKwkJdG9jX2UuY2R0ZV90cmFjayA9IGk7CisJCXRvY19lLmNkdGVfZm9ybWF0ID0gQ0RST01fTEJBOworCQlpZiAoc3JfYXVkaW9faW9jdGwoY2RpLCBDRFJPTVJFQURUT0NFTlRSWSwgJnRvY19lKSkKKwkJCXJldHVybiBDRFNfTk9fSU5GTzsKKwkJaWYgKHRvY19lLmNkdGVfY3RybCAmIENEUk9NX0RBVEFfVFJBQ0spIHsKKwkJCWhhdmVfZGF0YXRyYWNrcyA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIWhhdmVfZGF0YXRyYWNrcykKKwkJcmV0dXJuIENEU19BVURJTzsKKworCWlmIChjZC0+eGFfZmxhZykKKwkJcmV0dXJuIENEU19YQV8yXzE7CisJZWxzZQorCQlyZXR1cm4gQ0RTX0RBVEFfMTsKK30KKworaW50IHNyX2dldF9sYXN0X3Nlc3Npb24oc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksCisJCQlzdHJ1Y3QgY2Ryb21fbXVsdGlzZXNzaW9uICptc19pbmZvKQoreworCVNjc2lfQ0QgKmNkID0gY2RpLT5oYW5kbGU7CisKKwltc19pbmZvLT5hZGRyLmxiYSA9IGNkLT5tc19vZmZzZXQ7CisJbXNfaW5mby0+eGFfZmxhZyA9IGNkLT54YV9mbGFnIHx8IGNkLT5tc19vZmZzZXQgPiAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHByaW1pdGl2ZSB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBuZWVkIHRvIGhhdmUgR0ZQX0RNQSBzZXQgYmFzZWQgb24KKyAqIHRoZSBzdGF0dXMgb2YgdGhlIHVuY2hlY2tlZF9pc2FfZG1hIGZsYWcgaW4gdGhlIGhvc3Qgc3RydWN0dXJlICovCisjZGVmaW5lIFNSX0dGUF9ETUEoY2QpICgoKGNkKS0+ZGV2aWNlLT5ob3N0LT51bmNoZWNrZWRfaXNhX2RtYSkgPyBHRlBfRE1BIDogMCkKKworaW50IHNyX2dldF9tY24oc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIHN0cnVjdCBjZHJvbV9tY24gKm1jbikKK3sKKwlTY3NpX0NEICpjZCA9IGNkaS0+aGFuZGxlOworCXN0cnVjdCBwYWNrZXRfY29tbWFuZCBjZ2M7CisJY2hhciAqYnVmZmVyID0ga21hbGxvYygzMiwgR0ZQX0tFUk5FTCB8IFNSX0dGUF9ETUEoY2QpKTsKKwlpbnQgcmVzdWx0OworCisJbWVtc2V0KCZjZ2MsIDAsIHNpemVvZihzdHJ1Y3QgcGFja2V0X2NvbW1hbmQpKTsKKwljZ2MuY21kWzBdID0gR1BDTURfUkVBRF9TVUJDSEFOTkVMOworCWNnYy5jbWRbMl0gPSAweDQwOwkvKiBJIGRvIHdhbnQgdGhlIHN1YmNoYW5uZWwgaW5mbyAqLworCWNnYy5jbWRbM10gPSAweDAyOwkvKiBHaXZlIG1lIG1lZGl1bSBjYXRhbG9nIG51bWJlciBpbmZvICovCisJY2djLmNtZFs4XSA9IDI0OworCWNnYy5idWZmZXIgPSBidWZmZXI7CisJY2djLmJ1ZmxlbiA9IDI0OworCWNnYy5kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwljZ2MudGltZW91dCA9IElPQ1RMX1RJTUVPVVQ7CisJcmVzdWx0ID0gc3JfZG9faW9jdGwoY2QsICZjZ2MpOworCisJbWVtY3B5KG1jbi0+bWVkaXVtX2NhdGFsb2dfbnVtYmVyLCBidWZmZXIgKyA5LCAxMyk7CisJbWNuLT5tZWRpdW1fY2F0YWxvZ19udW1iZXJbMTNdID0gMDsKKworCWtmcmVlKGJ1ZmZlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHNyX3Jlc2V0KHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpKQoreworCXJldHVybiAwOworfQorCitpbnQgc3Jfc2VsZWN0X3NwZWVkKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBpbnQgc3BlZWQpCit7CisJU2NzaV9DRCAqY2QgPSBjZGktPmhhbmRsZTsKKwlzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgY2djOworCisJaWYgKHNwZWVkID09IDApCisJCXNwZWVkID0gMHhmZmZmOwkvKiBzZXQgdG8gbWF4ICovCisJZWxzZQorCQlzcGVlZCAqPSAxNzc7CS8qIE54IHRvIGtieXRlL3MgKi8KKworCW1lbXNldCgmY2djLCAwLCBzaXplb2Yoc3RydWN0IHBhY2tldF9jb21tYW5kKSk7CisJY2djLmNtZFswXSA9IEdQQ01EX1NFVF9TUEVFRDsJLyogU0VUIENEIFNQRUVEICovCisJY2djLmNtZFsyXSA9IChzcGVlZCA+PiA4KSAmIDB4ZmY7CS8qIE1TQiBmb3Igc3BlZWQgKGluIGtieXRlcy9zZWMpICovCisJY2djLmNtZFszXSA9IHNwZWVkICYgMHhmZjsJLyogTFNCICovCisJY2djLmRhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7CisJY2djLnRpbWVvdXQgPSBJT0NUTF9USU1FT1VUOworCisJaWYgKHNyX2RvX2lvY3RsKGNkLCAmY2djKSkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB0aGlzIGlzIGNhbGxlZCBieSB0aGUgZ2VuZXJpYyBjZHJvbSBkcml2ZXIuIGFyZyBpcyBhIF9rZXJuZWxfIHBvaW50ZXIsICAqLworLyogYmVjYXVzZSB0aGUgZ2VuZXJpYyBjZHJvbSBkcml2ZXIgZG9lcyB0aGUgdXNlciBhY2Nlc3Mgc3R1ZmYgZm9yIHVzLiAgICAgKi8KKy8qIG9ubHkgY2Ryb21yZWFkdG9jaGRyIGFuZCBjZHJvbXJlYWR0b2NlbnRyeSBhcmUgbGVmdCAtIGZvciB1c2Ugd2l0aCB0aGUgICovCisvKiBzcl9kaXNrX3N0YXR1cyBpbnRlcmZhY2UgZm9yIHRoZSBnZW5lcmljIGNkcm9tIGRyaXZlci4gICAgICAgICAgICAgICAgICAqLworCitpbnQgc3JfYXVkaW9faW9jdGwoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlTY3NpX0NEICpjZCA9IGNkaS0+aGFuZGxlOworCXN0cnVjdCBwYWNrZXRfY29tbWFuZCBjZ2M7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSBrbWFsbG9jKDMyLCBHRlBfS0VSTkVMIHwgU1JfR0ZQX0RNQShjZCkpOworCisJaWYgKCFidWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KCZjZ2MsIDAsIHNpemVvZihzdHJ1Y3QgcGFja2V0X2NvbW1hbmQpKTsKKwljZ2MudGltZW91dCA9IElPQ1RMX1RJTUVPVVQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQ0RST01SRUFEVE9DSERSOgorCQl7CisJCQlzdHJ1Y3QgY2Ryb21fdG9jaGRyICp0b2NoZHIgPSAoc3RydWN0IGNkcm9tX3RvY2hkciAqKSBhcmc7CisKKwkJCWNnYy5jbWRbMF0gPSBHUENNRF9SRUFEX1RPQ19QTUFfQVRJUDsKKwkJCWNnYy5jbWRbOF0gPSAxMjsJCS8qIExTQiBvZiBsZW5ndGggKi8KKwkJCWNnYy5idWZmZXIgPSBidWZmZXI7CisJCQljZ2MuYnVmbGVuID0gMTI7CisJCQljZ2MucXVpZXQgPSAxOworCQkJY2djLmRhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCisJCQlyZXN1bHQgPSBzcl9kb19pb2N0bChjZCwgJmNnYyk7CisKKwkJCXRvY2hkci0+Y2R0aF90cmswID0gYnVmZmVyWzJdOworCQkJdG9jaGRyLT5jZHRoX3RyazEgPSBidWZmZXJbM107CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIENEUk9NUkVBRFRPQ0VOVFJZOgorCQl7CisJCQlzdHJ1Y3QgY2Ryb21fdG9jZW50cnkgKnRvY2VudHJ5ID0gKHN0cnVjdCBjZHJvbV90b2NlbnRyeSAqKSBhcmc7CisKKwkJCWNnYy5jbWRbMF0gPSBHUENNRF9SRUFEX1RPQ19QTUFfQVRJUDsKKwkJCWNnYy5jbWRbMV0gfD0gKHRvY2VudHJ5LT5jZHRlX2Zvcm1hdCA9PSBDRFJPTV9NU0YpID8gMHgwMiA6IDA7CisJCQljZ2MuY21kWzZdID0gdG9jZW50cnktPmNkdGVfdHJhY2s7CisJCQljZ2MuY21kWzhdID0gMTI7CQkvKiBMU0Igb2YgbGVuZ3RoICovCisJCQljZ2MuYnVmZmVyID0gYnVmZmVyOworCQkJY2djLmJ1ZmxlbiA9IDEyOworCQkJY2djLmRhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCisJCQlyZXN1bHQgPSBzcl9kb19pb2N0bChjZCwgJmNnYyk7CisKKwkJCXRvY2VudHJ5LT5jZHRlX2N0cmwgPSBidWZmZXJbNV0gJiAweGY7CisJCQl0b2NlbnRyeS0+Y2R0ZV9hZHIgPSBidWZmZXJbNV0gPj4gNDsKKwkJCXRvY2VudHJ5LT5jZHRlX2RhdGFtb2RlID0gKHRvY2VudHJ5LT5jZHRlX2N0cmwgJiAweDA0KSA/IDEgOiAwOworCQkJaWYgKHRvY2VudHJ5LT5jZHRlX2Zvcm1hdCA9PSBDRFJPTV9NU0YpIHsKKwkJCQl0b2NlbnRyeS0+Y2R0ZV9hZGRyLm1zZi5taW51dGUgPSBidWZmZXJbOV07CisJCQkJdG9jZW50cnktPmNkdGVfYWRkci5tc2Yuc2Vjb25kID0gYnVmZmVyWzEwXTsKKwkJCQl0b2NlbnRyeS0+Y2R0ZV9hZGRyLm1zZi5mcmFtZSA9IGJ1ZmZlclsxMV07CisJCQl9IGVsc2UKKwkJCQl0b2NlbnRyeS0+Y2R0ZV9hZGRyLmxiYSA9ICgoKCgoYnVmZmVyWzhdIDw8IDgpICsgYnVmZmVyWzldKSA8PCA4KQorCQkJCQkrIGJ1ZmZlclsxMF0pIDw8IDgpICsgYnVmZmVyWzExXTsKKworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgQ0RST01QTEFZVFJLSU5EOiB7CisJCXN0cnVjdCBjZHJvbV90aSogdGkgPSAoc3RydWN0IGNkcm9tX3RpKilhcmc7CisKKwkJY2djLmNtZFswXSA9IEdQQ01EX1BMQVlBVURJT19USTsKKwkJY2djLmNtZFs0XSA9IHRpLT5jZHRpX3RyazA7CisJCWNnYy5jbWRbNV0gPSB0aS0+Y2R0aV9pbmQwOworCQljZ2MuY21kWzddID0gdGktPmNkdGlfdHJrMTsKKwkJY2djLmNtZFs4XSA9IHRpLT5jZHRpX2luZDE7CisJCWNnYy5kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOworCisJCXJlc3VsdCA9IHNyX2RvX2lvY3RsKGNkLCAmY2djKTsKKwkJaWYgKHJlc3VsdCA9PSAtRURSSVZFX0NBTlRfRE9fVEhJUykKKwkJCXJlc3VsdCA9IHNyX2Zha2VfcGxheXRya2luZChjZGksIHRpKTsKKworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQlyZXN1bHQgPSAtRUlOVkFMOworCX0KKworI2lmIDAKKwlpZiAocmVzdWx0KQorCQlwcmludGsoIkRFQlVHOiBzcl9hdWRpbzogcmVzdWx0IGZvciBpb2N0bCAleDogJXhcbiIsIGNtZCwgcmVzdWx0KTsKKyNlbmRpZgorCisJa2ZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogYSBmdW5jdGlvbiB0byByZWFkIGFsbCBzb3J0cyBvZiBmdW5ueSBjZHJvbSBzZWN0b3JzIHVzaW5nIHRoZSBSRUFEX0NECisgKiBzY3NpLTMgbW1jIGNvbW1hbmQKKyAqCisgKiBsYmE6ICAgICBsaW5lYXIgYmxvY2sgYWRkcmVzcworICogZm9ybWF0OiAgMCA9IGRhdGEgKGFueXRoaW5nKQorICogICAgICAgICAgMSA9IGF1ZGlvCisgKiAgICAgICAgICAyID0gZGF0YSAobW9kZSAxKQorICogICAgICAgICAgMyA9IGRhdGEgKG1vZGUgMikKKyAqICAgICAgICAgIDQgPSBkYXRhIChtb2RlIDIgZm9ybTEpCisgKiAgICAgICAgICA1ID0gZGF0YSAobW9kZSAyIGZvcm0yKQorICogYmxrc2l6ZTogMjA0OCB8IDIzMzYgfCAyMzQwIHwgMjM1MgorICovCisKK3N0YXRpYyBpbnQgc3JfcmVhZF9jZChTY3NpX0NEICpjZCwgdW5zaWduZWQgY2hhciAqZGVzdCwgaW50IGxiYSwgaW50IGZvcm1hdCwgaW50IGJsa3NpemUpCit7CisJc3RydWN0IHBhY2tldF9jb21tYW5kIGNnYzsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCIlczogc3JfcmVhZF9jZCBsYmE9JWQgZm9ybWF0PSVkIGJsa3NpemU9JWRcbiIsCisJICAgICAgIGNkLT5jZGkubmFtZSwgbGJhLCBmb3JtYXQsIGJsa3NpemUpOworI2VuZGlmCisKKwltZW1zZXQoJmNnYywgMCwgc2l6ZW9mKHN0cnVjdCBwYWNrZXRfY29tbWFuZCkpOworCWNnYy5jbWRbMF0gPSBHUENNRF9SRUFEX0NEOwkvKiBSRUFEX0NEICovCisJY2djLmNtZFsxXSA9ICgoZm9ybWF0ICYgNykgPDwgMik7CisJY2djLmNtZFsyXSA9ICh1bnNpZ25lZCBjaGFyKSAobGJhID4+IDI0KSAmIDB4ZmY7CisJY2djLmNtZFszXSA9ICh1bnNpZ25lZCBjaGFyKSAobGJhID4+IDE2KSAmIDB4ZmY7CisJY2djLmNtZFs0XSA9ICh1bnNpZ25lZCBjaGFyKSAobGJhID4+IDgpICYgMHhmZjsKKwljZ2MuY21kWzVdID0gKHVuc2lnbmVkIGNoYXIpIGxiYSAmIDB4ZmY7CisJY2djLmNtZFs4XSA9IDE7CisJc3dpdGNoIChibGtzaXplKSB7CisJY2FzZSAyMzM2OgorCQljZ2MuY21kWzldID0gMHg1ODsKKwkJYnJlYWs7CisJY2FzZSAyMzQwOgorCQljZ2MuY21kWzldID0gMHg3ODsKKwkJYnJlYWs7CisJY2FzZSAyMzUyOgorCQljZ2MuY21kWzldID0gMHhmODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2djLmNtZFs5XSA9IDB4MTA7CisJCWJyZWFrOworCX0KKwljZ2MuYnVmZmVyID0gZGVzdDsKKwljZ2MuYnVmbGVuID0gYmxrc2l6ZTsKKwljZ2MuZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisJY2djLnRpbWVvdXQgPSBJT0NUTF9USU1FT1VUOworCXJldHVybiBzcl9kb19pb2N0bChjZCwgJmNnYyk7Cit9CisKKy8qCisgKiByZWFkIHNlY3RvcnMgd2l0aCBibG9ja3NpemVzIG90aGVyIHRoYW4gMjA0OAorICovCisKK3N0YXRpYyBpbnQgc3JfcmVhZF9zZWN0b3IoU2NzaV9DRCAqY2QsIGludCBsYmEsIGludCBibGtzaXplLCB1bnNpZ25lZCBjaGFyICpkZXN0KQoreworCXN0cnVjdCBwYWNrZXRfY29tbWFuZCBjZ2M7CisJaW50IHJjOworCisJLyogd2UgdHJ5IHRoZSBSRUFEIENEIGNvbW1hbmQgZmlyc3QuLi4gKi8KKwlpZiAoY2QtPnJlYWRjZF9rbm93bikgeworCQlyYyA9IHNyX3JlYWRfY2QoY2QsIGRlc3QsIGxiYSwgMCwgYmxrc2l6ZSk7CisJCWlmICgtRURSSVZFX0NBTlRfRE9fVEhJUyAhPSByYykKKwkJCXJldHVybiByYzsKKwkJY2QtPnJlYWRjZF9rbm93biA9IDA7CisJCXByaW50aygiQ0RST00gZG9lcydudCBzdXBwb3J0IFJFQUQgQ0QgKDB4YmUpIGNvbW1hbmRcbiIpOworCQkvKiBmYWxsICYgcmV0cnkgdGhlIG90aGVyIHdheSAqLworCX0KKwkvKiAuLi4gaWYgdGhpcyBmYWlscywgd2Ugc3dpdGNoIHRoZSBibG9ja3NpemUgdXNpbmcgTU9ERSBTRUxFQ1QgKi8KKwlpZiAoYmxrc2l6ZSAhPSBjZC0+ZGV2aWNlLT5zZWN0b3Jfc2l6ZSkgeworCQlpZiAoMCAhPSAocmMgPSBzcl9zZXRfYmxvY2tsZW5ndGgoY2QsIGJsa3NpemUpKSkKKwkJCXJldHVybiByYzsKKwl9CisjaWZkZWYgREVCVUcKKwlwcmludGsoIiVzOiBzcl9yZWFkX3NlY3RvciBsYmE9JWQgYmxrc2l6ZT0lZFxuIiwgY2QtPmNkaS5uYW1lLCBsYmEsIGJsa3NpemUpOworI2VuZGlmCisKKwltZW1zZXQoJmNnYywgMCwgc2l6ZW9mKHN0cnVjdCBwYWNrZXRfY29tbWFuZCkpOworCWNnYy5jbWRbMF0gPSBHUENNRF9SRUFEXzEwOworCWNnYy5jbWRbMl0gPSAodW5zaWduZWQgY2hhcikgKGxiYSA+PiAyNCkgJiAweGZmOworCWNnYy5jbWRbM10gPSAodW5zaWduZWQgY2hhcikgKGxiYSA+PiAxNikgJiAweGZmOworCWNnYy5jbWRbNF0gPSAodW5zaWduZWQgY2hhcikgKGxiYSA+PiA4KSAmIDB4ZmY7CisJY2djLmNtZFs1XSA9ICh1bnNpZ25lZCBjaGFyKSBsYmEgJiAweGZmOworCWNnYy5jbWRbOF0gPSAxOworCWNnYy5idWZmZXIgPSBkZXN0OworCWNnYy5idWZsZW4gPSBibGtzaXplOworCWNnYy5kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwljZ2MudGltZW91dCA9IElPQ1RMX1RJTUVPVVQ7CisJcmMgPSBzcl9kb19pb2N0bChjZCwgJmNnYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiByZWFkIGEgc2VjdG9yIGluIHJhdyBtb2RlIHRvIGNoZWNrIHRoZSBzZWN0b3IgZm9ybWF0CisgKiByZXQ6IDEgPT0gbW9kZTIgKFhBKSwgMCA9PSBtb2RlMSwgPDAgPT0gZXJyb3IgCisgKi8KKworaW50IHNyX2lzX3hhKFNjc2lfQ0QgKmNkKQoreworCXVuc2lnbmVkIGNoYXIgKnJhd19zZWN0b3I7CisJaW50IGlzX3hhOworCisJaWYgKCF4YV90ZXN0KQorCQlyZXR1cm4gMDsKKworCXJhd19zZWN0b3IgPSAodW5zaWduZWQgY2hhciAqKSBrbWFsbG9jKDIwNDgsIEdGUF9LRVJORUwgfCBTUl9HRlBfRE1BKGNkKSk7CisJaWYgKCFyYXdfc2VjdG9yKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoMCA9PSBzcl9yZWFkX3NlY3RvcihjZCwgY2QtPm1zX29mZnNldCArIDE2LAorCQkJCUNEX0ZSQU1FU0laRV9SQVcxLCByYXdfc2VjdG9yKSkgeworCQlpc194YSA9IChyYXdfc2VjdG9yWzNdID09IDB4MDIpID8gMSA6IDA7CisJfSBlbHNlIHsKKwkJLyogcmVhZCBhIHJhdyBzZWN0b3IgZmFpbGVkIGZvciBzb21lIHJlYXNvbi4gKi8KKwkJaXNfeGEgPSAtMTsKKwl9CisJa2ZyZWUocmF3X3NlY3Rvcik7CisjaWZkZWYgREVCVUcKKwlwcmludGsoIiVzOiBzcl9pc194YTogJWRcbiIsIGNkLT5jZGkubmFtZSwgaXNfeGEpOworI2VuZGlmCisJcmV0dXJuIGlzX3hhOworfQorCitpbnQgc3JfZGV2X2lvY3RsKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLAorCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJU2NzaV9DRCAqY2QgPSBjZGktPmhhbmRsZTsKKwlpbnQgcmV0OworCQorCXJldCA9IHNjc2lfbm9uYmxvY2thYmxlX2lvY3RsKGNkLT5kZXZpY2UsIGNtZCwKKwkJCQkgICAgICAodm9pZCBfX3VzZXIgKilhcmcsIE5VTEwpOworCS8qCisJICogRU5PREVWIG1lYW5zIHRoYXQgd2UgZGlkbid0IHJlY29nbmlzZSB0aGUgaW9jdGwsIG9yIHRoYXQgd2UKKwkgKiBjYW5ub3QgZXhlY3V0ZSBpdCBpbiB0aGUgY3VycmVudCBkZXZpY2Ugc3RhdGUuICBJbiBlaXRoZXIKKwkgKiBjYXNlIGZhbGwgdGhyb3VnaCB0byBzY3NpX2lvY3RsLCB3aGljaCB3aWxsIHJldHVybiBFTkRPRVYgYWdhaW4KKwkgKiBpZiBpdCBkb2Vzbid0IHJlY29nbmlzZSB0aGUgaW9jdGwKKwkgKi8KKwlpZiAocmV0ICE9IC1FTk9ERVYpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHNjc2lfaW9jdGwoY2QtPmRldmljZSwgY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NyX3ZlbmRvci5jIGIvZHJpdmVycy9zY3NpL3NyX3ZlbmRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4Mjc0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc3JfdmVuZG9yLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qIC0qLWxpbnV4LWMtKi0KKworICogdmVuZG9yLXNwZWNpZmljIGNvZGUgZm9yIFNDU0kgQ0QtUk9NJ3MgZ29lcyBoZXJlLgorICoKKyAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1Y2UgbW9zdCBvZiB0aGUgbmV3IGZlYXR1cmVzIChtdWx0aXNlc3Npb24gYW5kCisgKiB0aGUgbGlrZSkgYXJlIHRvbyBuZXcgdG8gYmUgaW5jbHVkZWQgaW50byB0aGUgU0NTSS1JSSBzdGFuZGFyZCAodG8KKyAqIGJlIGV4YWN0OiB0aGVyZSBpcydudCBhbnl0aGluZyBpbiBteSBkcmFmdCBjb3B5KS4KKyAqCisgKiBBdWcgMTk5NzogSGEhIEdvdCBhIFNDU0ktMyBjZHJvbSBzcGVjIGFjcm9zcyBteSBmaW5nZXJzLiBTQ1NJLTMgZG9lcworICogICAgICAgICAgIG11bHRpc2Vzc2lvbiB1c2luZyB0aGUgUkVBRCBUT0MgY29tbWFuZCAobGlrZSBTT05ZKS4KKyAqCisgKiAgICAgICAgICAgUmVhcnJhbmdlZCBzdHVmZiBoZXJlOiBTQ1NJLTMgaXMgaW5jbHVkZWQgYWxsd2F5cywgc3VwcG9ydAorICogICAgICAgICAgIGZvciBORUMvVE9TSElCQS9IUCBjb21tYW5kcyBpcyBvcHRpb25hbC4KKyAqCisgKiAgIEdlcmQgS25vcnIgPGtyYXhlbEBjcy50dS1iZXJsaW4uZGU+IAorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogc3VwcG9ydCBmb3IgWEEvbXVsdGlzZXNzaW9uLUNEJ3MKKyAqIAorICogICAtIE5FQzogICAgIERldGVjdGlvbiBhbmQgc3VwcG9ydCBvZiBtdWx0aXNlc3Npb24gQ0Qncy4KKyAqICAgICAKKyAqICAgLSBUT1NISUJBOiBEZXRlY3Rpb24gYW5kIHN1cHBvcnQgb2YgbXVsdGlzZXNzaW9uIENEJ3MuCisgKiAgICAgICAgICAgICAgU29tZSBYQS1TZWN0b3IgdHdlYWtpbmcsIHJlcXVpcmVkIGZvciBvbGRlciBkcml2ZXMuCisgKgorICogICAtIFNPTlk6ICAgIERldGVjdGlvbiBhbmQgc3VwcG9ydCBvZiBtdWx0aXNlc3Npb24gQ0Qncy4KKyAqICAgICAgICAgICAgICBhZGRlZCBieSBUaG9tYXMgUXVpbm90IDx0aG9tYXNAY3VpdnJlLmZyZWVuaXguZnI+CisgKgorICogICAtIFBJT05FRVIsIEhJVEFDSEksIFBMRVhUT1IsIE1BVFNISVRBLCBURUFDLCBQSElMSVBTOiBrbm93biB0bworICogICAgICAgICAgICAgIHdvcmsgd2l0aCBTT05ZIChTQ1NJMyBub3cpICBjb2RlLgorICoKKyAqICAgLSBIUDogICAgICBNdWNoIGxpa2UgU09OWSwgYnV0IGEgbGl0dGxlIGRpZmZlcmVudC4uLiAoVGhvbWFzKQorICogICAgICAgICAgICAgIEhQLVdyaXRlcnMgb25seSA/Pz8gTWF5YmUgb3RoZXIgQ0QtV3JpdGVycyB3b3JrIHdpdGggdGhpcyB0b28gPworICogICAgICAgICAgICAgIEhQIDYwMjAgd3JpdGVycyBub3cgc3VwcG9ydGVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9pb2N0bC5oPgorCisjaW5jbHVkZSAic3IuaCIKKworI2lmIDAKKyNkZWZpbmUgREVCVUcKKyNlbmRpZgorCisvKiBoZXJlIGFyZSBzb21lIGNvbnN0YW50cyB0byBzb3J0IHRoZSB2ZW5kb3JzIGludG8gZ3JvdXBzICovCisKKyNkZWZpbmUgVkVORE9SX1NDU0kzICAgICAgICAgICAxCS8qIGRlZmF1bHQ6IHNjc2ktMyBtbWMgKi8KKworI2RlZmluZSBWRU5ET1JfTkVDICAgICAgICAgICAgIDIKKyNkZWZpbmUgVkVORE9SX1RPU0hJQkEgICAgICAgICAzCisjZGVmaW5lIFZFTkRPUl9XUklURVIgICAgICAgICAgNAkvKiBwcmUtc2NzaTMgd3JpdGVycyAqLworCisjZGVmaW5lIFZFTkRPUl9USU1FT1VUCTMwKkhaCisKK3ZvaWQgc3JfdmVuZG9yX2luaXQoU2NzaV9DRCAqY2QpCit7CisjaWZuZGVmIENPTkZJR19CTEtfREVWX1NSX1ZFTkRPUgorCWNkLT52ZW5kb3IgPSBWRU5ET1JfU0NTSTM7CisjZWxzZQorCWNoYXIgKnZlbmRvciA9IGNkLT5kZXZpY2UtPnZlbmRvcjsKKwljaGFyICptb2RlbCA9IGNkLT5kZXZpY2UtPm1vZGVsOworCQorCS8qIGRlZmF1bHQgKi8KKwljZC0+dmVuZG9yID0gVkVORE9SX1NDU0kzOworCWlmIChjZC0+cmVhZGNkX2tub3duKQorCQkvKiB0aGlzIGlzIHRydWUgZm9yIHNjc2kzL21tYyBkcml2ZXMgLSBubyBtb3JlIGNoZWNrcyAqLworCQlyZXR1cm47CisKKwlpZiAoY2QtPmRldmljZS0+dHlwZSA9PSBUWVBFX1dPUk0pIHsKKwkJY2QtPnZlbmRvciA9IFZFTkRPUl9XUklURVI7CisKKwl9IGVsc2UgaWYgKCFzdHJuY21wKHZlbmRvciwgIk5FQyIsIDMpKSB7CisJCWNkLT52ZW5kb3IgPSBWRU5ET1JfTkVDOworCQlpZiAoIXN0cm5jbXAobW9kZWwsICJDRC1ST00gRFJJVkU6MjUiLCAxNSkgfHwKKwkJICAgICFzdHJuY21wKG1vZGVsLCAiQ0QtUk9NIERSSVZFOjM2IiwgMTUpIHx8CisJCSAgICAhc3RybmNtcChtb2RlbCwgIkNELVJPTSBEUklWRTo4MyIsIDE1KSB8fAorCQkgICAgIXN0cm5jbXAobW9kZWwsICJDRC1ST00gRFJJVkU6ODQgIiwgMTYpCisjaWYgMAorCQkvKiBteSBORUMgM3ggcmV0dXJucyB0aGUgcmVhZC1yYXcgZGF0YSBpZiBhIHJlYWQtcmF3CisJCSAgIGlzIGZvbGxvd2VkIGJ5IGEgcmVhZCBmb3IgdGhlIHNhbWUgc2VjdG9yIC0gYWViICovCisJCSAgICB8fCAhc3RybmNtcChtb2RlbCwgIkNELVJPTSBEUklWRTo1MDAiLCAxNikKKyNlbmRpZgorCQkgICAgKQorCQkJLyogdGhlc2UgY2FuJ3QgaGFuZGxlIG11bHRpc2Vzc2lvbiwgbWF5IGhhbmcgKi8KKwkJCWNkLT5jZGkubWFzayB8PSBDRENfTVVMVElfU0VTU0lPTjsKKworCX0gZWxzZSBpZiAoIXN0cm5jbXAodmVuZG9yLCAiVE9TSElCQSIsIDcpKSB7CisJCWNkLT52ZW5kb3IgPSBWRU5ET1JfVE9TSElCQTsKKworCX0KKyNlbmRpZgorfQorCisKKy8qIHNtYWxsIGhhbmR5IGZ1bmN0aW9uIGZvciBzd2l0Y2hpbmcgYmxvY2sgbGVuZ3RoIHVzaW5nIE1PREUgU0VMRUNULAorICogdXNlZCBieSBzcl9yZWFkX3NlY3RvcigpICovCisKK2ludCBzcl9zZXRfYmxvY2tsZW5ndGgoU2NzaV9DRCAqY2QsIGludCBibG9ja2xlbmd0aCkKK3sKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7CS8qIHRoZSBidWZmZXIgZm9yIHRoZSBpb2N0bCAqLworCXN0cnVjdCBwYWNrZXRfY29tbWFuZCBjZ2M7CisJc3RydWN0IGNjc19tb2Rlc2VsX2hlYWQgKm1vZGVzZWw7CisJaW50IHJjLCBkZW5zaXR5ID0gMDsKKworI2lmZGVmIENPTkZJR19CTEtfREVWX1NSX1ZFTkRPUgorCWlmIChjZC0+dmVuZG9yID09IFZFTkRPUl9UT1NISUJBKQorCQlkZW5zaXR5ID0gKGJsb2NrbGVuZ3RoID4gMjA0OCkgPyAweDgxIDogMHg4MzsKKyNlbmRpZgorCisJYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikga21hbGxvYyg1MTIsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKyNpZmRlZiBERUJVRworCXByaW50aygiJXM6IE1PREUgU0VMRUNUIDB4JXgvJWRcbiIsIGNkLT5jZGkubmFtZSwgZGVuc2l0eSwgYmxvY2tsZW5ndGgpOworI2VuZGlmCisJbWVtc2V0KCZjZ2MsIDAsIHNpemVvZihzdHJ1Y3QgcGFja2V0X2NvbW1hbmQpKTsKKwljZ2MuY21kWzBdID0gTU9ERV9TRUxFQ1Q7CisJY2djLmNtZFsxXSA9ICgxIDw8IDQpOworCWNnYy5jbWRbNF0gPSAxMjsKKwltb2Rlc2VsID0gKHN0cnVjdCBjY3NfbW9kZXNlbF9oZWFkICopIGJ1ZmZlcjsKKwltZW1zZXQobW9kZXNlbCwgMCwgc2l6ZW9mKCptb2Rlc2VsKSk7CisJbW9kZXNlbC0+YmxvY2tfZGVzY19sZW5ndGggPSAweDA4OworCW1vZGVzZWwtPmRlbnNpdHkgPSBkZW5zaXR5OworCW1vZGVzZWwtPmJsb2NrX2xlbmd0aF9tZWQgPSAoYmxvY2tsZW5ndGggPj4gOCkgJiAweGZmOworCW1vZGVzZWwtPmJsb2NrX2xlbmd0aF9sbyA9IGJsb2NrbGVuZ3RoICYgMHhmZjsKKwljZ2MuYnVmZmVyID0gYnVmZmVyOworCWNnYy5idWZsZW4gPSBzaXplb2YoKm1vZGVzZWwpOworCWNnYy5kYXRhX2RpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7CisJY2djLnRpbWVvdXQgPSBWRU5ET1JfVElNRU9VVDsKKwlpZiAoMCA9PSAocmMgPSBzcl9kb19pb2N0bChjZCwgJmNnYykpKSB7CisJCWNkLT5kZXZpY2UtPnNlY3Rvcl9zaXplID0gYmxvY2tsZW5ndGg7CisJfQorI2lmZGVmIERFQlVHCisJZWxzZQorCQlwcmludGsoIiVzOiBzd2l0Y2hpbmcgYmxvY2tsZW5ndGggdG8gJWQgYnl0ZXMgZmFpbGVkXG4iLAorCQkgICAgICAgY2QtPmNkaS5uYW1lLCBibG9ja2xlbmd0aCk7CisjZW5kaWYKKwlrZnJlZShidWZmZXIpOworCXJldHVybiByYzsKK30KKworLyogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBhZnRlciBhIG1lZGlhIGNoYW5nZS4gQ2hlY2tzIGlmIHRoZSBDRCBpcworICAgbXVsdGlzZXNzaW9uLCBhc2tzIGZvciBvZmZzZXQgZXRjLiAqLworCitpbnQgc3JfY2RfY2hlY2soc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGkpCit7CisJU2NzaV9DRCAqY2QgPSBjZGktPmhhbmRsZTsKKwl1bnNpZ25lZCBsb25nIHNlY3RvcjsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7CS8qIHRoZSBidWZmZXIgZm9yIHRoZSBpb2N0bCAqLworCXN0cnVjdCBwYWNrZXRfY29tbWFuZCBjZ2M7CisJaW50IHJjLCBub19tdWx0aTsKKworCWlmIChjZC0+Y2RpLm1hc2sgJiBDRENfTVVMVElfU0VTU0lPTikKKwkJcmV0dXJuIDA7CisKKwlidWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSBrbWFsbG9jKDUxMiwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNlY3RvciA9IDA7CQkvKiB0aGUgbXVsdGlzZXNzaW9uIHNlY3RvciBvZmZzZXQgZ29lcyBoZXJlICAqLworCW5vX211bHRpID0gMDsJCS8qIGZsYWc6IHRoZSBkcml2ZSBjYW4ndCBoYW5kbGUgbXVsdGlzZXNzaW9uICovCisJcmMgPSAwOworCisJbWVtc2V0KCZjZ2MsIDAsIHNpemVvZihzdHJ1Y3QgcGFja2V0X2NvbW1hbmQpKTsKKworCXN3aXRjaCAoY2QtPnZlbmRvcikgeworCisJY2FzZSBWRU5ET1JfU0NTSTM6CisJCWNnYy5jbWRbMF0gPSBSRUFEX1RPQzsKKwkJY2djLmNtZFs4XSA9IDEyOworCQljZ2MuY21kWzldID0gMHg0MDsKKwkJY2djLmJ1ZmZlciA9IGJ1ZmZlcjsKKwkJY2djLmJ1ZmxlbiA9IDEyOworCQljZ2MucXVpZXQgPSAxOworCQljZ2MuZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisJCWNnYy50aW1lb3V0ID0gVkVORE9SX1RJTUVPVVQ7CisJCXJjID0gc3JfZG9faW9jdGwoY2QsICZjZ2MpOworCQlpZiAocmMgIT0gMCkKKwkJCWJyZWFrOworCQlpZiAoKGJ1ZmZlclswXSA8PCA4KSArIGJ1ZmZlclsxXSA8IDB4MGEpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBIbW0sIHNlZW1zIHRoZSBkcml2ZSAiCisJCQkgICAiZG9lc24ndCBzdXBwb3J0IG11bHRpc2Vzc2lvbiBDRCdzXG4iLCBjZC0+Y2RpLm5hbWUpOworCQkJbm9fbXVsdGkgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJc2VjdG9yID0gYnVmZmVyWzExXSArIChidWZmZXJbMTBdIDw8IDgpICsKKwkJICAgIChidWZmZXJbOV0gPDwgMTYpICsgKGJ1ZmZlcls4XSA8PCAyNCk7CisJCWlmIChidWZmZXJbNl0gPD0gMSkgeworCQkJLyogaWdub3JlIHNlY3RvciBvZmZzZXRzIGZyb20gZmlyc3QgdHJhY2sgKi8KKwkJCXNlY3RvciA9IDA7CisJCX0KKwkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9TUl9WRU5ET1IKKwljYXNlIFZFTkRPUl9ORUM6eworCQkJdW5zaWduZWQgbG9uZyBtaW4sIHNlYywgZnJhbWU7CisJCQljZ2MuY21kWzBdID0gMHhkZTsKKwkJCWNnYy5jbWRbMV0gPSAweDAzOworCQkJY2djLmNtZFsyXSA9IDB4YjA7CisJCQljZ2MuYnVmZmVyID0gYnVmZmVyOworCQkJY2djLmJ1ZmxlbiA9IDB4MTY7CisJCQljZ2MucXVpZXQgPSAxOworCQkJY2djLmRhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCQkJY2djLnRpbWVvdXQgPSBWRU5ET1JfVElNRU9VVDsKKwkJCXJjID0gc3JfZG9faW9jdGwoY2QsICZjZ2MpOworCQkJaWYgKHJjICE9IDApCisJCQkJYnJlYWs7CisJCQlpZiAoYnVmZmVyWzE0XSAhPSAwICYmIGJ1ZmZlclsxNF0gIT0gMHhiMCkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBIbW0sIHNlZW1zIHRoZSBjZHJvbSAiCisJCQkJICAgICAgICJkb2Vzbid0IHN1cHBvcnQgbXVsdGlzZXNzaW9uIENEJ3NcbiIsCisJCQkJICAgICAgIGNkLT5jZGkubmFtZSk7CisJCQkJbm9fbXVsdGkgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJbWluID0gQkNEMkJJTihidWZmZXJbMTVdKTsKKwkJCXNlYyA9IEJDRDJCSU4oYnVmZmVyWzE2XSk7CisJCQlmcmFtZSA9IEJDRDJCSU4oYnVmZmVyWzE3XSk7CisJCQlzZWN0b3IgPSBtaW4gKiBDRF9TRUNTICogQ0RfRlJBTUVTICsgc2VjICogQ0RfRlJBTUVTICsgZnJhbWU7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBWRU5ET1JfVE9TSElCQTp7CisJCQl1bnNpZ25lZCBsb25nIG1pbiwgc2VjLCBmcmFtZTsKKworCQkJLyogd2UgcmVxdWVzdCBzb21lIGRpc2MgaW5mb3JtYXRpb24gKGlzIGl0IGEgWEEtQ0QgPywKKwkJCSAqIHdoZXJlIHN0YXJ0cyB0aGUgbGFzdCBzZXNzaW9uID8pICovCisJCQljZ2MuY21kWzBdID0gMHhjNzsKKwkJCWNnYy5jbWRbMV0gPSAweDAzOworCQkJY2djLmJ1ZmZlciA9IGJ1ZmZlcjsKKwkJCWNnYy5idWZsZW4gPSA0OworCQkJY2djLnF1aWV0ID0gMTsKKwkJCWNnYy5kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwkJCWNnYy50aW1lb3V0ID0gVkVORE9SX1RJTUVPVVQ7CisJCQlyYyA9IHNyX2RvX2lvY3RsKGNkLCAmY2djKTsKKwkJCWlmIChyYyA9PSAtRUlOVkFMKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEhtbSwgc2VlbXMgdGhlIGRyaXZlICIKKwkJCQkgICAgICAgImRvZXNuJ3Qgc3VwcG9ydCBtdWx0aXNlc3Npb24gQ0Qnc1xuIiwKKwkJCQkgICAgICAgY2QtPmNkaS5uYW1lKTsKKwkJCQlub19tdWx0aSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocmMgIT0gMCkKKwkJCQlicmVhazsKKwkJCW1pbiA9IEJDRDJCSU4oYnVmZmVyWzFdKTsKKwkJCXNlYyA9IEJDRDJCSU4oYnVmZmVyWzJdKTsKKwkJCWZyYW1lID0gQkNEMkJJTihidWZmZXJbM10pOworCQkJc2VjdG9yID0gbWluICogQ0RfU0VDUyAqIENEX0ZSQU1FUyArIHNlYyAqIENEX0ZSQU1FUyArIGZyYW1lOworCQkJaWYgKHNlY3RvcikKKwkJCQlzZWN0b3IgLT0gQ0RfTVNGX09GRlNFVDsKKwkJCXNyX3NldF9ibG9ja2xlbmd0aChjZCwgMjA0OCk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBWRU5ET1JfV1JJVEVSOgorCQljZ2MuY21kWzBdID0gUkVBRF9UT0M7CisJCWNnYy5jbWRbOF0gPSAweDA0OworCQljZ2MuY21kWzldID0gMHg0MDsKKwkJY2djLmJ1ZmZlciA9IGJ1ZmZlcjsKKwkJY2djLmJ1ZmxlbiA9IDB4MDQ7CisJCWNnYy5xdWlldCA9IDE7CisJCWNnYy5kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwkJY2djLnRpbWVvdXQgPSBWRU5ET1JfVElNRU9VVDsKKwkJcmMgPSBzcl9kb19pb2N0bChjZCwgJmNnYyk7CisJCWlmIChyYyAhPSAwKSB7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKHJjID0gYnVmZmVyWzJdKSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzOiBObyBmaW5pc2hlZCBzZXNzaW9uXG4iLCBjZC0+Y2RpLm5hbWUpOworCQkJYnJlYWs7CisJCX0KKwkJY2djLmNtZFswXSA9IFJFQURfVE9DOwkvKiBSZWFkIFRPQyAqLworCQljZ2MuY21kWzZdID0gcmMgJiAweDdmOwkvKiBudW1iZXIgb2YgbGFzdCBzZXNzaW9uICovCisJCWNnYy5jbWRbOF0gPSAweDBjOworCQljZ2MuY21kWzldID0gMHg0MDsKKwkJY2djLmJ1ZmZlciA9IGJ1ZmZlcjsKKwkJY2djLmJ1ZmxlbiA9IDEyOworCQljZ2MucXVpZXQgPSAxOworCQljZ2MuZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisJCWNnYy50aW1lb3V0ID0gVkVORE9SX1RJTUVPVVQ7CisJCXJjID0gc3JfZG9faW9jdGwoY2QsICZjZ2MpOworCQlpZiAocmMgIT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwkJc2VjdG9yID0gYnVmZmVyWzExXSArIChidWZmZXJbMTBdIDw8IDgpICsKKwkJICAgIChidWZmZXJbOV0gPDwgMTYpICsgKGJ1ZmZlcls4XSA8PCAyNCk7CisJCWJyZWFrOworI2VuZGlmCQkJCS8qIENPTkZJR19CTEtfREVWX1NSX1ZFTkRPUiAqLworCisJZGVmYXVsdDoKKwkJLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAiJXM6IHVua25vd24gdmVuZG9yIGNvZGUgKCVpKSwgbm90IGluaXRpYWxpemVkID9cbiIsCisJCSAgICAgICBjZC0+Y2RpLm5hbWUsIGNkLT52ZW5kb3IpOworCQlzZWN0b3IgPSAwOworCQlub19tdWx0aSA9IDE7CisJCWJyZWFrOworCX0KKwljZC0+bXNfb2Zmc2V0ID0gc2VjdG9yOworCWNkLT54YV9mbGFnID0gMDsKKwlpZiAoQ0RTX0FVRElPICE9IHNyX2Rpc2tfc3RhdHVzKGNkaSkgJiYgMSA9PSBzcl9pc194YShjZCkpCisJCWNkLT54YV9mbGFnID0gMTsKKworCWlmICgyMDQ4ICE9IGNkLT5kZXZpY2UtPnNlY3Rvcl9zaXplKSB7CisJCXNyX3NldF9ibG9ja2xlbmd0aChjZCwgMjA0OCk7CisJfQorCWlmIChub19tdWx0aSkKKwkJY2RpLT5tYXNrIHw9IENEQ19NVUxUSV9TRVNTSU9OOworCisjaWZkZWYgREVCVUcKKwlpZiAoc2VjdG9yKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG11bHRpc2Vzc2lvbiBvZmZzZXQ9JWx1XG4iLAorCQkgICAgICAgY2QtPmNkaS5uYW1lLCBzZWN0b3IpOworI2VuZGlmCisJa2ZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3QuYyBiL2RyaXZlcnMvc2NzaS9zdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NWQxZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc3QuYwpAQCAtMCwwICsxLDQ0MzggQEAKKy8qCisgICBTQ1NJIFRhcGUgRHJpdmVyIGZvciBMaW51eCB2ZXJzaW9uIDEuMSBhbmQgbmV3ZXIuIFNlZSB0aGUgYWNjb21wYW55aW5nCisgICBmaWxlIERvY3VtZW50YXRpb24vc2NzaS9zdC50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgIEhpc3Rvcnk6CisgICBSZXdyaXR0ZW4gZnJvbSBEd2F5bmUgRm9yc3l0aCdzIFNDU0kgdGFwZSBkcml2ZXIgYnkgS2FpIE1ha2lzYXJhLgorICAgQ29udHJpYnV0aW9uIGFuZCBpZGVhcyBmcm9tIHNldmVyYWwgcGVvcGxlIGluY2x1ZGluZyAoaW4gYWxwaGFiZXRpY2FsCisgICBvcmRlcikgS2xhdXMgRWhyZW5mcmllZCwgRXVnZW5lIEV4YXJldnNreSwgRXJpYyBMZWUgR3JlZW4sIFdvbGZnYW5nIERlbmssCisgICBTdGV2ZSBIaXJzY2gsIEFuZHJlYXMgS29wcGVuaCJvZmVyLCBNaWNoYWVsIExlb2RvbHRlciwgRXlhbCBMZWJlZGluc2t5LAorICAgTWljaGFlbCBTY2hhZWZlciwgSiJvcmcgV2V1bGUsIGFuZCBFcmljIFlvdW5nZGFsZS4KKworICAgQ29weXJpZ2h0IDE5OTIgLSAyMDA1IEthaSBNYWtpc2FyYQorICAgZW1haWwgS2FpLk1ha2lzYXJhQGtvbHVtYnVzLmZpCisKKyAgIFNvbWUgc21hbGwgZm9ybWFsIGNoYW5nZXMgLSBhZWIsIDk1MDgwOQorCisgICBMYXN0IG1vZGlmaWVkOiAxOC1KQU4tMTk5OCBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4gRGV2ZnMgc3VwcG9ydAorICovCisKK3N0YXRpYyBjaGFyICp2ZXJzdHIgPSAiMjAwNTAzMTIiOworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tdGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RyaXZlci5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3JlcXVlc3QuaD4KKworCisvKiBUaGUgZHJpdmVyIHByaW50cyBzb21lIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBvbiB0aGUgY29uc29sZSBpZiBERUJVRworICAgaXMgZGVmaW5lZCBhbmQgbm9uLXplcm8uICovCisjZGVmaW5lIERFQlVHIDAKKworI2lmIERFQlVHCisvKiBUaGUgbWVzc2FnZSBsZXZlbCBmb3IgdGhlIGRlYnVnIG1lc3NhZ2VzIGlzIGN1cnJlbnRseSBzZXQgdG8gS0VSTl9OT1RJQ0UKKyAgIHNvIHRoYXQgcGVvcGxlIGNhbiBlYXNpbHkgc2VlIHRoZSBtZXNzYWdlcy4gTGF0ZXIgd2hlbiB0aGUgZGVidWdnaW5nIG1lc3NhZ2VzCisgICBpbiB0aGUgZHJpdmVycyBhcmUgbW9yZSB3aWRlbHkgY2xhc3NpZmllZCwgdGhpcyBtYXkgYmUgY2hhbmdlZCB0byBLRVJOX0RFQlVHLiAqLworI2RlZmluZSBTVF9ERUJfTVNHICBLRVJOX05PVElDRQorI2RlZmluZSBERUIoYSkgYQorI2RlZmluZSBERUJDKGEpIGlmIChkZWJ1Z2dpbmcpIHsgYSA7IH0KKyNlbHNlCisjZGVmaW5lIERFQihhKQorI2RlZmluZSBERUJDKGEpCisjZW5kaWYKKworI2RlZmluZSBTVF9LSUxPQllURSAxMDI0CisKKyNpbmNsdWRlICJzdF9vcHRpb25zLmgiCisjaW5jbHVkZSAic3QuaCIKKworc3RhdGljIGludCBidWZmZXJfa2JzOworc3RhdGljIGludCBtYXhfc2dfc2VnczsKK3N0YXRpYyBpbnQgdHJ5X2RpcmVjdF9pbyA9IFRSWV9ESVJFQ1RfSU87CitzdGF0aWMgaW50IHRyeV9yZGlvID0gMTsKK3N0YXRpYyBpbnQgdHJ5X3dkaW8gPSAxOworCitzdGF0aWMgaW50IHN0X2Rldl9tYXg7CitzdGF0aWMgaW50IHN0X25yX2RldjsKKworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKnN0X3N5c2ZzX2NsYXNzOworCitNT0RVTEVfQVVUSE9SKCJLYWkgTWFraXNhcmEiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0NTSSBUYXBlIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBTZXQgJ3Blcm0nICg0dGggYXJndW1lbnQpIHRvIDAgdG8gZGlzYWJsZSBtb2R1bGVfcGFyYW0ncyBkZWZpbml0aW9uCisgKiBvZiBzeXNmcyBwYXJhbWV0ZXJzICh3aGljaCBtb2R1bGVfcGFyYW0gZG9lc24ndCB5ZXQgc3VwcG9ydCkuCisgKiBTeXNmcyBwYXJhbWV0ZXJzIGRlZmluZWQgZXhwbGljaXRseSBsYXRlci4KKyAqLworbW9kdWxlX3BhcmFtX25hbWVkKGJ1ZmZlcl9rYnMsIGJ1ZmZlcl9rYnMsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1ZmZlcl9rYnMsICJEZWZhdWx0IGRyaXZlciBidWZmZXIgc2l6ZSBmb3IgZml4ZWQgYmxvY2sgbW9kZSAoS0I7IDMyKSIpOworbW9kdWxlX3BhcmFtX25hbWVkKG1heF9zZ19zZWdzLCBtYXhfc2dfc2VncywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X3NnX3NlZ3MsICJNYXhpbXVtIG51bWJlciBvZiBzY2F0dGVyL2dhdGhlciBzZWdtZW50cyB0byB1c2UgKDI1NikiKTsKK21vZHVsZV9wYXJhbV9uYW1lZCh0cnlfZGlyZWN0X2lvLCB0cnlfZGlyZWN0X2lvLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0cnlfZGlyZWN0X2lvLCAiVHJ5IGRpcmVjdCBJL08gYmV0d2VlbiB1c2VyIGJ1ZmZlciBhbmQgdGFwZSBkcml2ZSAoMSkiKTsKKworLyogRXh0cmEgcGFyYW1ldGVycyBmb3IgdGVzdGluZyAqLworbW9kdWxlX3BhcmFtX25hbWVkKHRyeV9yZGlvLCB0cnlfcmRpbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModHJ5X3JkaW8sICJUcnkgZGlyZWN0IHJlYWQgaS9vIHdoZW4gcG9zc2libGUiKTsKK21vZHVsZV9wYXJhbV9uYW1lZCh0cnlfd2RpbywgdHJ5X3dkaW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRyeV93ZGlvLCAiVHJ5IGRpcmVjdCB3cml0ZSBpL28gd2hlbiBwb3NzaWJsZSIpOworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCB3cml0ZV90aHJlc2hvbGRfa2JzOyAgLyogcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3RfZGV2X3Bhcm0geworCWNoYXIgKm5hbWU7CisJaW50ICp2YWw7Cit9IHBhcm1zW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCSJidWZmZXJfa2JzIiwgJmJ1ZmZlcl9rYnMKKwl9LAorCXsgICAgICAgLyogUmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAyLjQgKi8KKwkJIndyaXRlX3RocmVzaG9sZF9rYnMiLCAmd3JpdGVfdGhyZXNob2xkX2ticworCX0sCisJeworCQkibWF4X3NnX3NlZ3MiLCBOVUxMCisJfSwKKwl7CisJCSJ0cnlfZGlyZWN0X2lvIiwgJnRyeV9kaXJlY3RfaW8KKwl9Cit9OworI2VuZGlmCisKKy8qIFJlc3RyaWN0IHRoZSBudW1iZXIgb2YgbW9kZXMgc28gdGhhdCBuYW1lcyBmb3IgYWxsIGFyZSBhc3NpZ25lZCAqLworI2lmIFNUX05CUl9NT0RFUyA+IDE2CisjZXJyb3IgIk1heGltdW0gbnVtYmVyIG9mIG1vZGVzIGlzIDE2IgorI2VuZGlmCisvKiBCaXQgcmV2ZXJzZWQgb3JkZXIgdG8gZ2V0IHNhbWUgbmFtZXMgZm9yIHNhbWUgbWlub3JzIHdpdGggYWxsCisgICBtb2RlIGNvdW50cyAqLworc3RhdGljIGNoYXIgKnN0X2Zvcm1hdHNbXSA9IHsKKwkiIiwgICJyIiwgImsiLCAicyIsICJsIiwgInQiLCAibyIsICJ1IiwKKwkibSIsICJ2IiwgInAiLCAieCIsICJhIiwgInkiLCAicSIsICJ6In07IAorCisvKiBUaGUgZGVmYXVsdCBkZWZpbml0aW9ucyBoYXZlIGJlZW4gbW92ZWQgdG8gc3Rfb3B0aW9ucy5oICovCisKKyNkZWZpbmUgU1RfRklYRURfQlVGRkVSX1NJWkUgKFNUX0ZJWEVEX0JVRkZFUl9CTE9DS1MgKiBTVF9LSUxPQllURSkKKworLyogVGhlIGJ1ZmZlciBzaXplIHNob3VsZCBmaXQgaW50byB0aGUgMjQgYml0cyBmb3IgbGVuZ3RoIGluIHRoZQorICAgNi1ieXRlIFNDU0kgcmVhZCBhbmQgd3JpdGUgY29tbWFuZHMuICovCisjaWYgU1RfRklYRURfQlVGRkVSX1NJWkUgPj0gKDIgPDwgMjQgLSAxKQorI2Vycm9yICJCdWZmZXIgc2l6ZSBzaG91bGQgbm90IGV4Y2VlZCAoMiA8PCAyNCAtIDEpIGJ5dGVzISIKKyNlbmRpZgorCitzdGF0aWMgaW50IGRlYnVnZ2luZyA9IERFQlVHOworCisjZGVmaW5lIE1BWF9SRVRSSUVTIDAKKyNkZWZpbmUgTUFYX1dSSVRFX1JFVFJJRVMgMAorI2RlZmluZSBNQVhfUkVBRFlfUkVUUklFUyAwCisjZGVmaW5lIE5PX1RBUEUgIE5PVF9SRUFEWQorCisjZGVmaW5lIFNUX1RJTUVPVVQgKDkwMCAqIEhaKQorI2RlZmluZSBTVF9MT05HX1RJTUVPVVQgKDE0MDAwICogSFopCisKKy8qIFJlbW92ZSBtb2RlIGJpdHMgYW5kIGF1dG8tcmV3aW5kIGJpdCAoNykgKi8KKyNkZWZpbmUgVEFQRV9OUih4KSAoICgoaW1pbm9yKHgpICYgfjI1NSkgPj4gKFNUX05CUl9NT0RFX0JJVFMgKyAxKSkgfCBcCisgICAgKGltaW5vcih4KSAmIH4oLTEgPDwgU1RfTU9ERV9TSElGVCkpICkKKyNkZWZpbmUgVEFQRV9NT0RFKHgpICgoaW1pbm9yKHgpICYgU1RfTU9ERV9NQVNLKSA+PiBTVF9NT0RFX1NISUZUKQorCisvKiBDb25zdHJ1Y3QgdGhlIG1pbm9yIG51bWJlciBmcm9tIHRoZSBkZXZpY2UgKGQpLCBtb2RlIChtKSwgYW5kIG5vbi1yZXdpbmQgKG4pIGRhdGEgKi8KKyNkZWZpbmUgVEFQRV9NSU5PUihkLCBtLCBuKSAoKChkICYgfigyNTUgPj4gKFNUX05CUl9NT0RFX0JJVFMgKyAxKSkpIDw8IChTVF9OQlJfTU9ERV9CSVRTICsgMSkpIHwgXAorICAoZCAmICgyNTUgPj4gKFNUX05CUl9NT0RFX0JJVFMgKyAxKSkpIHwgKG0gPDwgU1RfTU9ERV9TSElGVCkgfCAoKG4gIT0gMCkgPDwgNykgKQorCisvKiBJbnRlcm5hbCBpb2N0bCB0byBzZXQgYm90aCBkZW5zaXR5ICh1cHBlcm1vc3QgOCBiaXRzKSBhbmQgYmxvY2tzaXplIChsb3dlcgorICAgMjQgYml0cykgKi8KKyNkZWZpbmUgU0VUX0RFTlNfQU5EX0JMSyAweDEwMDAxCisKK3N0YXRpYyBERUZJTkVfUldMT0NLKHN0X2Rldl9hcnJfbG9jayk7CisKK3N0YXRpYyBpbnQgc3RfZml4ZWRfYnVmZmVyX3NpemUgPSBTVF9GSVhFRF9CVUZGRVJfU0laRTsKK3N0YXRpYyBpbnQgc3RfbWF4X3NnX3NlZ3MgPSBTVF9NQVhfU0c7CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV90YXBlICoqc2NzaV90YXBlcyA9IE5VTEw7CisKK3N0YXRpYyBpbnQgbW9kZXNfZGVmaW5lZDsKKworc3RhdGljIHN0cnVjdCBzdF9idWZmZXIgKm5ld190YXBlX2J1ZmZlcihpbnQsIGludCwgaW50KTsKK3N0YXRpYyBpbnQgZW5sYXJnZV9idWZmZXIoc3RydWN0IHN0X2J1ZmZlciAqLCBpbnQsIGludCk7CitzdGF0aWMgdm9pZCBub3JtYWxpemVfYnVmZmVyKHN0cnVjdCBzdF9idWZmZXIgKik7CitzdGF0aWMgaW50IGFwcGVuZF90b19idWZmZXIoY29uc3QgY2hhciBfX3VzZXIgKiwgc3RydWN0IHN0X2J1ZmZlciAqLCBpbnQpOworc3RhdGljIGludCBmcm9tX2J1ZmZlcihzdHJ1Y3Qgc3RfYnVmZmVyICosIGNoYXIgX191c2VyICosIGludCk7CitzdGF0aWMgdm9pZCBtb3ZlX2J1ZmZlcl9kYXRhKHN0cnVjdCBzdF9idWZmZXIgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGJ1Zl90b19zZyhzdHJ1Y3Qgc3RfYnVmZmVyICosIHVuc2lnbmVkIGludCk7CisKK3N0YXRpYyBpbnQgc3RfbWFwX3VzZXJfcGFnZXMoc3RydWN0IHNjYXR0ZXJsaXN0ICosIGNvbnN0IHVuc2lnbmVkIGludCwgCisJCQkgICAgIHVuc2lnbmVkIGxvbmcsIHNpemVfdCwgaW50LCB1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBpbnQgc2dsX21hcF91c2VyX3BhZ2VzKHN0cnVjdCBzY2F0dGVybGlzdCAqLCBjb25zdCB1bnNpZ25lZCBpbnQsIAorCQkJICAgICAgdW5zaWduZWQgbG9uZywgc2l6ZV90LCBpbnQpOworc3RhdGljIGludCBzZ2xfdW5tYXBfdXNlcl9wYWdlcyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgY29uc3QgdW5zaWduZWQgaW50LCBpbnQpOworCitzdGF0aWMgaW50IHN0X3Byb2JlKHN0cnVjdCBkZXZpY2UgKik7CitzdGF0aWMgaW50IHN0X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICopOworc3RhdGljIGludCBzdF9pbml0X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqKTsKKworc3RhdGljIHZvaWQgZG9fY3JlYXRlX2RyaXZlcmZzX2ZpbGVzKHZvaWQpOworc3RhdGljIHZvaWQgZG9fcmVtb3ZlX2RyaXZlcmZzX2ZpbGVzKHZvaWQpOworc3RhdGljIHZvaWQgZG9fY3JlYXRlX2NsYXNzX2ZpbGVzKHN0cnVjdCBzY3NpX3RhcGUgKiwgaW50LCBpbnQpOworCitzdGF0aWMgc3RydWN0IHNjc2lfZHJpdmVyIHN0X3RlbXBsYXRlID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmdlbmRydiA9IHsKKwkJLm5hbWUJCT0gInN0IiwKKwkJLnByb2JlCQk9IHN0X3Byb2JlLAorCQkucmVtb3ZlCQk9IHN0X3JlbW92ZSwKKwl9LAorCS5pbml0X2NvbW1hbmQJCT0gc3RfaW5pdF9jb21tYW5kLAorfTsKKworc3RhdGljIGludCBzdF9jb21wcmVzc2lvbihzdHJ1Y3Qgc2NzaV90YXBlICosIGludCk7CisKK3N0YXRpYyBpbnQgZmluZF9wYXJ0aXRpb24oc3RydWN0IHNjc2lfdGFwZSAqKTsKK3N0YXRpYyBpbnQgc3dpdGNoX3BhcnRpdGlvbihzdHJ1Y3Qgc2NzaV90YXBlICopOworCitzdGF0aWMgaW50IHN0X2ludF9pb2N0bChzdHJ1Y3Qgc2NzaV90YXBlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CisKKwwKKyNpbmNsdWRlICJvc3N0X2RldGVjdC5oIgorI2lmbmRlZiBTSUdTX0ZST01fT1NTVAorI2RlZmluZSBTSUdTX0ZST01fT1NTVCBcCisJeyJPblN0cmVhbSIsICJTQy0iLCAiIiwgIm9zc3QifSwgXAorCXsiT25TdHJlYW0iLCAiREktIiwgIiIsICJvc3N0In0sIFwKKwl7Ik9uU3RyZWFtIiwgIkRQLSIsICIiLCAib3NzdCJ9LCBcCisJeyJPblN0cmVhbSIsICJVU0IiLCAiIiwgIm9zc3QifSwgXAorCXsiT25TdHJlYW0iLCAiRlctIiwgIiIsICJvc3N0In0KKyNlbmRpZgorCitzdHJ1Y3Qgc3RfcmVqZWN0X2RhdGEgeworCWNoYXIgKnZlbmRvcjsKKwljaGFyICptb2RlbDsKKwljaGFyICpyZXY7CisJY2hhciAqZHJpdmVyX2hpbnQ7IC8qIE5hbWUgb2YgdGhlIGNvcnJlY3QgZHJpdmVyLCBOVUxMIGlmIHVua25vd24gKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3RfcmVqZWN0X2RhdGEgcmVqZWN0X2xpc3RbXSA9IHsKKwkvKiB7IlhYWCIsICJZeS0iLCAiIiwgTlVMTH0sICBleGFtcGxlICovCisJU0lHU19GUk9NX09TU1QsCisJe05VTEwsIH19OworCisvKiBJZiB0aGUgZGV2aWNlIHNpZ25hdHVyZSBpcyBvbiB0aGUgbGlzdCBvZiBpbmNvbXBhdGlibGUgZHJpdmVzLCB0aGUKKyAgIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuYW1lIG9mIHRoZSBjb3JyZWN0IGRyaXZlciAoaWYga25vd24pICovCitzdGF0aWMgY2hhciAqIHN0X2luY29tcGF0aWJsZShzdHJ1Y3Qgc2NzaV9kZXZpY2UqIFNEcCkKK3sKKwlzdHJ1Y3Qgc3RfcmVqZWN0X2RhdGEgKnJwOworCisJZm9yIChycD0mKHJlamVjdF9saXN0WzBdKTsgcnAtPnZlbmRvciAhPSBOVUxMOyBycCsrKQorCQlpZiAoIXN0cm5jbXAocnAtPnZlbmRvciwgU0RwLT52ZW5kb3IsIHN0cmxlbihycC0+dmVuZG9yKSkgJiYKKwkJICAgICFzdHJuY21wKHJwLT5tb2RlbCwgU0RwLT5tb2RlbCwgc3RybGVuKHJwLT5tb2RlbCkpICYmCisJCSAgICAhc3RybmNtcChycC0+cmV2LCBTRHAtPnJldiwgc3RybGVuKHJwLT5yZXYpKSkgeworCQkJaWYgKHJwLT5kcml2ZXJfaGludCkKKwkJCQlyZXR1cm4gcnAtPmRyaXZlcl9oaW50OworCQkJZWxzZQorCQkJCXJldHVybiAidW5rbm93biI7CisJCX0KKwlyZXR1cm4gTlVMTDsKK30KKwwKKworc3RhdGljIGlubGluZSBjaGFyICp0YXBlX25hbWUoc3RydWN0IHNjc2lfdGFwZSAqdGFwZSkKK3sKKwlyZXR1cm4gdGFwZS0+ZGlzay0+ZGlza19uYW1lOworfQorCisKK3N0YXRpYyB2b2lkIHN0X2FuYWx5emVfc2Vuc2Uoc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQsIHN0cnVjdCBzdF9jbWRzdGF0dXMgKnMpCit7CisJY29uc3QgdTggKnVjcDsKKwljb25zdCB1OCAqc2Vuc2UgPSBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyOworCisJcy0+aGF2ZV9zZW5zZSA9IHNjc2lfcmVxdWVzdF9ub3JtYWxpemVfc2Vuc2UoU1JwbnQsICZzLT5zZW5zZV9oZHIpOworCXMtPmZsYWdzID0gMDsKKworCWlmIChzLT5oYXZlX3NlbnNlKSB7CisJCXMtPmRlZmVycmVkID0gMDsKKwkJcy0+cmVtYWluZGVyX3ZhbGlkID0KKwkJCXNjc2lfZ2V0X3NlbnNlX2luZm9fZmxkKHNlbnNlLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsICZzLT51cmVtYWluZGVyNjQpOworCQlzd2l0Y2ggKHNlbnNlWzBdICYgMHg3ZikgeworCQljYXNlIDB4NzE6CisJCQlzLT5kZWZlcnJlZCA9IDE7CisJCWNhc2UgMHg3MDoKKwkJCXMtPmZpeGVkX2Zvcm1hdCA9IDE7CisJCQlzLT5mbGFncyA9IHNlbnNlWzJdICYgMHhlMDsKKwkJCWJyZWFrOworCQljYXNlIDB4NzM6CisJCQlzLT5kZWZlcnJlZCA9IDE7CisJCWNhc2UgMHg3MjoKKwkJCXMtPmZpeGVkX2Zvcm1hdCA9IDA7CisJCQl1Y3AgPSBzY3NpX3NlbnNlX2Rlc2NfZmluZChzZW5zZSwgU0NTSV9TRU5TRV9CVUZGRVJTSVpFLCA0KTsKKwkJCXMtPmZsYWdzID0gdWNwID8gKHVjcFszXSAmIDB4ZTApIDogMDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisKKy8qIENvbnZlcnQgdGhlIHJlc3VsdCB0byBzdWNjZXNzIGNvZGUgKi8KK3N0YXRpYyBpbnQgc3RfY2hrX3Jlc3VsdChzdHJ1Y3Qgc2NzaV90YXBlICpTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiBTUnBudCkKK3sKKwlpbnQgcmVzdWx0ID0gU1JwbnQtPnNyX3Jlc3VsdDsKKwl1OCBzY29kZTsKKwlERUIoY29uc3QgY2hhciAqc3RwOykKKwljaGFyICpuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisJc3RydWN0IHN0X2NtZHN0YXR1cyAqY21kc3RhdHA7CisKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIDA7CisKKwljbWRzdGF0cCA9ICZTVHAtPmJ1ZmZlci0+Y21kc3RhdDsKKwlzdF9hbmFseXplX3NlbnNlKFNUcC0+YnVmZmVyLT5sYXN0X1NScG50LCBjbWRzdGF0cCk7CisKKwlpZiAoY21kc3RhdHAtPmhhdmVfc2Vuc2UpCisJCXNjb2RlID0gU1RwLT5idWZmZXItPmNtZHN0YXQuc2Vuc2VfaGRyLnNlbnNlX2tleTsKKwllbHNlCisJCXNjb2RlID0gMDsKKworICAgICAgICBERUIoCisgICAgICAgIGlmIChkZWJ1Z2dpbmcpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoU1RfREVCX01TRyAiJXM6IEVycm9yOiAleCwgY21kOiAleCAleCAleCAleCAleCAleCBMZW46ICVkXG4iLAorCQkgICAgICAgbmFtZSwgcmVzdWx0LAorCQkgICAgICAgU1JwbnQtPnNyX2NtbmRbMF0sIFNScG50LT5zcl9jbW5kWzFdLCBTUnBudC0+c3JfY21uZFsyXSwKKwkJICAgICAgIFNScG50LT5zcl9jbW5kWzNdLCBTUnBudC0+c3JfY21uZFs0XSwgU1JwbnQtPnNyX2NtbmRbNV0sCisJCSAgICAgICBTUnBudC0+c3JfYnVmZmxlbik7CisJCWlmIChjbWRzdGF0cC0+aGF2ZV9zZW5zZSkKKwkJCXNjc2lfcHJpbnRfcmVxX3NlbnNlKCJzdCIsIFNScG50KTsKKwl9ICkgLyogZW5kIERFQiAqLworCWlmICghZGVidWdnaW5nKSB7IC8qIEFibm9ybWFsIGNvbmRpdGlvbnMgZm9yIHRhcGUgKi8KKwkJaWYgKCFjbWRzdGF0cC0+aGF2ZV9zZW5zZSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXM6IEVycm9yICV4IChzdWdnLiBidCAweCV4LCBkcml2ZXIgYnQgMHgleCwgaG9zdCBidCAweCV4KS5cbiIsCisJCQkgICAgICAgbmFtZSwgcmVzdWx0LCBzdWdnZXN0aW9uKHJlc3VsdCksCisJCQkgICAgICAgZHJpdmVyX2J5dGUocmVzdWx0KSAmIERSSVZFUl9NQVNLLCBob3N0X2J5dGUocmVzdWx0KSk7CisJCWVsc2UgaWYgKGNtZHN0YXRwLT5oYXZlX3NlbnNlICYmCisJCQkgc2NvZGUgIT0gTk9fU0VOU0UgJiYKKwkJCSBzY29kZSAhPSBSRUNPVkVSRURfRVJST1IgJiYKKwkJCSAvKiBzY29kZSAhPSBVTklUX0FUVEVOVElPTiAmJiAqLworCQkJIHNjb2RlICE9IEJMQU5LX0NIRUNLICYmCisJCQkgc2NvZGUgIT0gVk9MVU1FX09WRVJGTE9XICYmCisJCQkgU1JwbnQtPnNyX2NtbmRbMF0gIT0gTU9ERV9TRU5TRSAmJgorCQkJIFNScG50LT5zcl9jbW5kWzBdICE9IFRFU1RfVU5JVF9SRUFEWSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFcnJvciB3aXRoIHNlbnNlIGRhdGE6ICIsIG5hbWUpOworCQkJCXNjc2lfcHJpbnRfcmVxX3NlbnNlKCJzdCIsIFNScG50KTsKKwkJfQorCX0KKworCWlmIChjbWRzdGF0cC0+Zml4ZWRfZm9ybWF0ICYmCisJICAgIFNUcC0+Y2xuX21vZGUgPj0gRVhURU5ERURfU0VOU0VfU1RBUlQpIHsgIC8qIE9ubHkgZml4ZWQgZm9ybWF0IHNlbnNlICovCisJCWlmIChTVHAtPmNsbl9zZW5zZV92YWx1ZSkKKwkJCVNUcC0+Y2xlYW5pbmdfcmVxIHw9ICgoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlcltTVHAtPmNsbl9tb2RlXSAmCisJCQkJCSAgICAgICBTVHAtPmNsbl9zZW5zZV9tYXNrKSA9PSBTVHAtPmNsbl9zZW5zZV92YWx1ZSk7CisJCWVsc2UKKwkJCVNUcC0+Y2xlYW5pbmdfcmVxIHw9ICgoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlcltTVHAtPmNsbl9tb2RlXSAmCisJCQkJCSAgICAgICBTVHAtPmNsbl9zZW5zZV9tYXNrKSAhPSAwKTsKKwl9CisJaWYgKGNtZHN0YXRwLT5oYXZlX3NlbnNlICYmCisJICAgIGNtZHN0YXRwLT5zZW5zZV9oZHIuYXNjID09IDAgJiYgY21kc3RhdHAtPnNlbnNlX2hkci5hc2NxID09IDB4MTcpCisJCVNUcC0+Y2xlYW5pbmdfcmVxID0gMTsgLyogQVNDIGFuZCBBU0NRID0+IGNsZWFuaW5nIHJlcXVlc3RlZCAqLworCisJU1RwLT5wb3NfdW5rbm93biB8PSBTVHAtPmRldmljZS0+d2FzX3Jlc2V0OworCisJaWYgKGNtZHN0YXRwLT5oYXZlX3NlbnNlICYmCisJICAgIHNjb2RlID09IFJFQ09WRVJFRF9FUlJPUgorI2lmIFNUX1JFQ09WRVJFRF9XUklURV9GQVRBTAorCSAgICAmJiBTUnBudC0+c3JfY21uZFswXSAhPSBXUklURV82CisJICAgICYmIFNScG50LT5zcl9jbW5kWzBdICE9IFdSSVRFX0ZJTEVNQVJLUworI2VuZGlmCisJICAgICkgeworCQlTVHAtPnJlY292ZXJfY291bnQrKzsKKwkJU1RwLT5yZWNvdmVyX3JlZysrOworCisgICAgICAgICAgICAgICAgREVCKAorCQlpZiAoZGVidWdnaW5nKSB7CisJCQlpZiAoU1JwbnQtPnNyX2NtbmRbMF0gPT0gUkVBRF82KQorCQkJCXN0cCA9ICJyZWFkIjsKKwkJCWVsc2UgaWYgKFNScG50LT5zcl9jbW5kWzBdID09IFdSSVRFXzYpCisJCQkJc3RwID0gIndyaXRlIjsKKwkJCWVsc2UKKwkJCQlzdHAgPSAiaW9jdGwiOworCQkJcHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBSZWNvdmVyZWQgJXMgZXJyb3IgKCVkKS5cbiIsIG5hbWUsIHN0cCwKKwkJCSAgICAgICBTVHAtPnJlY292ZXJfY291bnQpOworCQl9ICkgLyogZW5kIERFQiAqLworCisJCWlmIChjbWRzdGF0cC0+ZmxhZ3MgPT0gMCkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gKC1FSU8pOworfQorCisKKy8qIFdha2V1cCBmcm9tIGludGVycnVwdCAqLworc3RhdGljIHZvaWQgc3Rfc2xlZXBfZG9uZShzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpCit7CisJc3RydWN0IHNjc2lfdGFwZSAqU1RwID0gY29udGFpbmVyX29mKFNDcG50LT5yZXF1ZXN0LT5ycV9kaXNrLT5wcml2YXRlX2RhdGEsCisJCQkJCSAgICAgc3RydWN0IHNjc2lfdGFwZSwgZHJpdmVyKTsKKworCShTVHAtPmJ1ZmZlciktPmNtZHN0YXQubWlkbGV2ZWxfcmVzdWx0ID0gU0NwbnQtPnJlc3VsdDsKKwlTQ3BudC0+cmVxdWVzdC0+cnFfc3RhdHVzID0gUlFfU0NTSV9ET05FOworCShTVHAtPmJ1ZmZlciktPmxhc3RfU1JwbnQgPSBTQ3BudC0+c2NfcmVxdWVzdDsKKwlERUIoIFNUcC0+d3JpdGVfcGVuZGluZyA9IDA7ICkKKworCWNvbXBsZXRlKFNDcG50LT5yZXF1ZXN0LT53YWl0aW5nKTsKK30KKworLyogRG8gdGhlIHNjc2kgY29tbWFuZC4gV2FpdHMgdW50aWwgY29tbWFuZCBwZXJmb3JtZWQgaWYgZG9fd2FpdCBpcyB0cnVlLgorICAgT3RoZXJ3aXNlIHdyaXRlX2JlaGluZF9jaGVjaygpIGlzIHVzZWQgdG8gY2hlY2sgdGhhdCB0aGUgY29tbWFuZAorICAgaGFzIGZpbmlzaGVkLiAqLworc3RhdGljIHN0cnVjdCBzY3NpX3JlcXVlc3QgKgorc3RfZG9fc2NzaShzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICogU1JwbnQsIHN0cnVjdCBzY3NpX3RhcGUgKiBTVHAsIHVuc2lnbmVkIGNoYXIgKmNtZCwKKwkgICBpbnQgYnl0ZXMsIGludCBkaXJlY3Rpb24sIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcywgaW50IGRvX3dhaXQpCit7CisJdW5zaWduZWQgY2hhciAqYnA7CisKKwlpZiAoU1JwbnQgPT0gTlVMTCkgeworCQlTUnBudCA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChTVHAtPmRldmljZSwgR0ZQX0FUT01JQyk7CisJCWlmIChTUnBudCA9PSBOVUxMKSB7CisJCQlERUJDKCBwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBnZXQgU0NTSSByZXF1ZXN0LlxuIiwKKwkJCQkgICAgIHRhcGVfbmFtZShTVHApKTsgKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQkoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCA9ICgtRUlOVFIpOworCQkJZWxzZQorCQkJCShTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ID0gKC1FQlVTWSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCWluaXRfY29tcGxldGlvbigmU1RwLT53YWl0KTsKKwlTUnBudC0+c3JfdXNlX3NnID0gU1RwLT5idWZmZXItPmRvX2RpbyB8fCAoYnl0ZXMgPiAoU1RwLT5idWZmZXIpLT5mcnBbMF0ubGVuZ3RoKTsKKwlpZiAoU1JwbnQtPnNyX3VzZV9zZykgeworCQlpZiAoIVNUcC0+YnVmZmVyLT5kb19kaW8pCisJCQlidWZfdG9fc2coU1RwLT5idWZmZXIsIGJ5dGVzKTsKKwkJU1JwbnQtPnNyX3VzZV9zZyA9IChTVHAtPmJ1ZmZlciktPnNnX3NlZ3M7CisJCWJwID0gKGNoYXIgKikgJigoU1RwLT5idWZmZXIpLT5zZ1swXSk7CisJfSBlbHNlCisJCWJwID0gKFNUcC0+YnVmZmVyKS0+Yl9kYXRhOworCVNScG50LT5zcl9kYXRhX2RpcmVjdGlvbiA9IGRpcmVjdGlvbjsKKwlTUnBudC0+c3JfY21kX2xlbiA9IDA7CisJU1JwbnQtPnNyX3JlcXVlc3QtPndhaXRpbmcgPSAmKFNUcC0+d2FpdCk7CisJU1JwbnQtPnNyX3JlcXVlc3QtPnJxX3N0YXR1cyA9IFJRX1NDU0lfQlVTWTsKKwlTUnBudC0+c3JfcmVxdWVzdC0+cnFfZGlzayA9IFNUcC0+ZGlzazsKKwlTVHAtPmJ1ZmZlci0+Y21kc3RhdC5oYXZlX3NlbnNlID0gMDsKKworCXNjc2lfZG9fcmVxKFNScG50LCAodm9pZCAqKSBjbWQsIGJwLCBieXRlcywKKwkJICAgIHN0X3NsZWVwX2RvbmUsIHRpbWVvdXQsIHJldHJpZXMpOworCisJaWYgKGRvX3dhaXQpIHsKKwkJd2FpdF9mb3JfY29tcGxldGlvbihTUnBudC0+c3JfcmVxdWVzdC0+d2FpdGluZyk7CisJCVNScG50LT5zcl9yZXF1ZXN0LT53YWl0aW5nID0gTlVMTDsKKwkJKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgPSBzdF9jaGtfcmVzdWx0KFNUcCwgU1JwbnQpOworCX0KKwlyZXR1cm4gU1JwbnQ7Cit9CisKKworLyogSGFuZGxlIHRoZSB3cml0ZS1iZWhpbmQgY2hlY2tpbmcgKHdhaXRzIGZvciBjb21wbGV0aW9uKS4gUmV0dXJucyAtRU5PU1BDIGlmCisgICB3cml0ZSBoYXMgYmVlbiBjb3JyZWN0IGJ1dCBFT00gZWFybHkgd2FybmluZyByZWFjaGVkLCAtRUlPIGlmIHdyaXRlIGVuZGVkIGluCisgICBlcnJvciBvciB6ZXJvIGlmIHdyaXRlIHN1Y2Nlc3NmdWwuIEFzeW5jaHJvbm91cyB3cml0ZXMgYXJlIHVzZWQgb25seSBpbgorICAgdmFyaWFibGUgYmxvY2sgbW9kZS4gKi8KK3N0YXRpYyBpbnQgd3JpdGVfYmVoaW5kX2NoZWNrKHN0cnVjdCBzY3NpX3RhcGUgKiBTVHApCit7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHN0X2J1ZmZlciAqU1RidWZmZXI7CisJc3RydWN0IHN0X3BhcnRzdGF0ICpTVHBzOworCXN0cnVjdCBzdF9jbWRzdGF0dXMgKmNtZHN0YXRwOworCisJU1RidWZmZXIgPSBTVHAtPmJ1ZmZlcjsKKwlpZiAoIVNUYnVmZmVyLT53cml0aW5nKQorCQlyZXR1cm4gMDsKKworICAgICAgICBERUIoCisJaWYgKFNUcC0+d3JpdGVfcGVuZGluZykKKwkJU1RwLT5uYnJfd2FpdHMrKzsKKwllbHNlCisJCVNUcC0+bmJyX2ZpbmlzaGVkKys7CisgICAgICAgICkgLyogZW5kIERFQiAqLworCisJd2FpdF9mb3JfY29tcGxldGlvbigmKFNUcC0+d2FpdCkpOworCShTVHAtPmJ1ZmZlciktPmxhc3RfU1JwbnQtPnNyX3JlcXVlc3QtPndhaXRpbmcgPSBOVUxMOworCisJKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgPSBzdF9jaGtfcmVzdWx0KFNUcCwgKFNUcC0+YnVmZmVyKS0+bGFzdF9TUnBudCk7CisJc2NzaV9yZWxlYXNlX3JlcXVlc3QoKFNUcC0+YnVmZmVyKS0+bGFzdF9TUnBudCk7CisKKwlTVGJ1ZmZlci0+YnVmZmVyX2J5dGVzIC09IFNUYnVmZmVyLT53cml0aW5nOworCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKKwlpZiAoU1Rwcy0+ZHJ2X2Jsb2NrID49IDApIHsKKwkJaWYgKFNUcC0+YmxvY2tfc2l6ZSA9PSAwKQorCQkJU1Rwcy0+ZHJ2X2Jsb2NrKys7CisJCWVsc2UKKwkJCVNUcHMtPmRydl9ibG9jayArPSBTVGJ1ZmZlci0+d3JpdGluZyAvIFNUcC0+YmxvY2tfc2l6ZTsKKwl9CisKKwljbWRzdGF0cCA9ICZTVGJ1ZmZlci0+Y21kc3RhdDsKKwlpZiAoU1RidWZmZXItPnN5c2NhbGxfcmVzdWx0KSB7CisJCXJldHZhbCA9IC1FSU87CisJCWlmIChjbWRzdGF0cC0+aGF2ZV9zZW5zZSAmJiAhY21kc3RhdHAtPmRlZmVycmVkICYmCisJCSAgICAoY21kc3RhdHAtPmZsYWdzICYgU0VOU0VfRU9NKSAmJgorCQkgICAgKGNtZHN0YXRwLT5zZW5zZV9oZHIuc2Vuc2Vfa2V5ID09IE5PX1NFTlNFIHx8CisJCSAgICAgY21kc3RhdHAtPnNlbnNlX2hkci5zZW5zZV9rZXkgPT0gUkVDT1ZFUkVEX0VSUk9SKSkgeworCQkJLyogRU9NIGF0IHdyaXRlLWJlaGluZCwgaGFzIGFsbCBkYXRhIGJlZW4gd3JpdHRlbj8gKi8KKwkJCWlmICghY21kc3RhdHAtPnJlbWFpbmRlcl92YWxpZCB8fAorCQkJICAgIGNtZHN0YXRwLT51cmVtYWluZGVyNjQgPT0gMCkKKwkJCQlyZXR2YWwgPSAtRU5PU1BDOworCQl9CisJCWlmIChyZXR2YWwgPT0gLUVJTykKKwkJCVNUcHMtPmRydl9ibG9jayA9IC0xOworCX0KKwlTVGJ1ZmZlci0+d3JpdGluZyA9IDA7CisKKwlERUIoaWYgKGRlYnVnZ2luZyAmJiByZXR2YWwpCisJICAgIHByaW50ayhTVF9ERUJfTVNHICIlczogQXN5bmMgd3JpdGUgZXJyb3IgJXgsIHJldHVybiB2YWx1ZSAlZC5cbiIsCisJCSAgIHRhcGVfbmFtZShTVHApLCBTVGJ1ZmZlci0+Y21kc3RhdC5taWRsZXZlbF9yZXN1bHQsIHJldHZhbCk7KSAvKiBlbmQgREVCICovCisKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKy8qIFN0ZXAgb3ZlciBFT0YgaWYgaXQgaGFzIGJlZW4gaW5hZHZlcnRlbnRseSBjcm9zc2VkIChpb2N0bCBub3QgdXNlZCBiZWNhdXNlCisgICBpdCBtZXNzZXMgdXAgdGhlIGJsb2NrIG51bWJlcikuICovCitzdGF0aWMgaW50IGNyb3NzX2VvZihzdHJ1Y3Qgc2NzaV90YXBlICogU1RwLCBpbnQgZm9yd2FyZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudDsKKwl1bnNpZ25lZCBjaGFyIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKworCWNtZFswXSA9IFNQQUNFOworCWNtZFsxXSA9IDB4MDE7CQkvKiBTcGFjZSBGaWxlTWFya3MgKi8KKwlpZiAoZm9yd2FyZCkgeworCQljbWRbMl0gPSBjbWRbM10gPSAwOworCQljbWRbNF0gPSAxOworCX0gZWxzZQorCQljbWRbMl0gPSBjbWRbM10gPSBjbWRbNF0gPSAweGZmOwkvKiAtMSBmaWxlbWFya3MgKi8KKwljbWRbNV0gPSAwOworCisgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBTdGVwcGluZyBvdmVyIGZpbGVtYXJrICVzLlxuIiwKKwkJICAgdGFwZV9uYW1lKFNUcCksIGZvcndhcmQgPyAiZm9yd2FyZCIgOiAiYmFja3dhcmQiKSk7CisKKwlTUnBudCA9IHN0X2RvX3Njc2koTlVMTCwgU1RwLCBjbWQsIDAsIERNQV9OT05FLAorCQkJICAgU1RwLT5kZXZpY2UtPnRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKwlpZiAoIVNScG50KQorCQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CisKKwlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJU1JwbnQgPSBOVUxMOworCisJaWYgKChTVHAtPmJ1ZmZlciktPmNtZHN0YXQubWlkbGV2ZWxfcmVzdWx0ICE9IDApCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFN0ZXBwaW5nIG92ZXIgZmlsZW1hcmsgJXMgZmFpbGVkLlxuIiwKKwkJICAgdGFwZV9uYW1lKFNUcCksIGZvcndhcmQgPyAiZm9yd2FyZCIgOiAiYmFja3dhcmQiKTsKKworCXJldHVybiAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKK30KKworCisvKiBGbHVzaCB0aGUgd3JpdGUgYnVmZmVyIChuZXZlciBuZWVkIHRvIHdyaXRlIGlmIHZhcmlhYmxlIGJsb2Nrc2l6ZSkuICovCitzdGF0aWMgaW50IGZsdXNoX3dyaXRlX2J1ZmZlcihzdHJ1Y3Qgc2NzaV90YXBlICogU1RwKQoreworCWludCBvZmZzZXQsIHRyYW5zZmVyLCBibGtzOworCWludCByZXN1bHQ7CisJdW5zaWduZWQgY2hhciBjbWRbTUFYX0NPTU1BTkRfU0laRV07CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQ7CisJc3RydWN0IHN0X3BhcnRzdGF0ICpTVHBzOworCisJcmVzdWx0ID0gd3JpdGVfYmVoaW5kX2NoZWNrKFNUcCk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXJlc3VsdCA9IDA7CisJaWYgKFNUcC0+ZGlydHkgPT0gMSkgeworCisJCW9mZnNldCA9IChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlczsKKwkJdHJhbnNmZXIgPSAoKG9mZnNldCArIFNUcC0+YmxvY2tfc2l6ZSAtIDEpIC8KKwkJCSAgICBTVHAtPmJsb2NrX3NpemUpICogU1RwLT5ibG9ja19zaXplOworICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBGbHVzaGluZyAlZCBieXRlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwZV9uYW1lKFNUcCksIHRyYW5zZmVyKSk7CisKKwkJbWVtc2V0KChTVHAtPmJ1ZmZlciktPmJfZGF0YSArIG9mZnNldCwgMCwgdHJhbnNmZXIgLSBvZmZzZXQpOworCisJCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCQljbWRbMF0gPSBXUklURV82OworCQljbWRbMV0gPSAxOworCQlibGtzID0gdHJhbnNmZXIgLyBTVHAtPmJsb2NrX3NpemU7CisJCWNtZFsyXSA9IGJsa3MgPj4gMTY7CisJCWNtZFszXSA9IGJsa3MgPj4gODsKKwkJY21kWzRdID0gYmxrczsKKworCQlTUnBudCA9IHN0X2RvX3Njc2koTlVMTCwgU1RwLCBjbWQsIHRyYW5zZmVyLCBETUFfVE9fREVWSUNFLAorCQkJCSAgIFNUcC0+ZGV2aWNlLT50aW1lb3V0LCBNQVhfV1JJVEVfUkVUUklFUywgMSk7CisJCWlmICghU1JwbnQpCisJCQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CisKKwkJU1RwcyA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCQlpZiAoKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgIT0gMCkgeworCQkJc3RydWN0IHN0X2NtZHN0YXR1cyAqY21kc3RhdHAgPSAmU1RwLT5idWZmZXItPmNtZHN0YXQ7CisKKwkJCWlmIChjbWRzdGF0cC0+aGF2ZV9zZW5zZSAmJiAhY21kc3RhdHAtPmRlZmVycmVkICYmCisJCQkgICAgKGNtZHN0YXRwLT5mbGFncyAmIFNFTlNFX0VPTSkgJiYKKwkJCSAgICAoY21kc3RhdHAtPnNlbnNlX2hkci5zZW5zZV9rZXkgPT0gTk9fU0VOU0UgfHwKKwkJCSAgICAgY21kc3RhdHAtPnNlbnNlX2hkci5zZW5zZV9rZXkgPT0gUkVDT1ZFUkVEX0VSUk9SKSAmJgorCQkJICAgICghY21kc3RhdHAtPnJlbWFpbmRlcl92YWxpZCB8fAorCQkJICAgICBjbWRzdGF0cC0+dXJlbWFpbmRlcjY0ID09IDApKSB7IC8qIEFsbCB3cml0dGVuIGF0IEVPTSBlYXJseSB3YXJuaW5nICovCisJCQkJU1RwLT5kaXJ0eSA9IDA7CisJCQkJKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzID0gMDsKKwkJCQlpZiAoU1Rwcy0+ZHJ2X2Jsb2NrID49IDApCisJCQkJCVNUcHMtPmRydl9ibG9jayArPSBibGtzOworCQkJCXJlc3VsdCA9ICgtRU5PU1BDKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igb24gZmx1c2guXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwZV9uYW1lKFNUcCkpOworCQkJCVNUcHMtPmRydl9ibG9jayA9ICgtMSk7CisJCQkJcmVzdWx0ID0gKC1FSU8pOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKFNUcHMtPmRydl9ibG9jayA+PSAwKQorCQkJCVNUcHMtPmRydl9ibG9jayArPSBibGtzOworCQkJU1RwLT5kaXJ0eSA9IDA7CisJCQkoU1RwLT5idWZmZXIpLT5idWZmZXJfYnl0ZXMgPSAwOworCQl9CisJCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwkJU1JwbnQgPSBOVUxMOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qIEZsdXNoIHRoZSB0YXBlIGJ1ZmZlci4gVGhlIHRhcGUgd2lsbCBiZSBwb3NpdGlvbmVkIGNvcnJlY3RseSB1bmxlc3MKKyAgIHNlZWtfbmV4dCBpcyB0cnVlLiAqLworc3RhdGljIGludCBmbHVzaF9idWZmZXIoc3RydWN0IHNjc2lfdGFwZSAqU1RwLCBpbnQgc2Vla19uZXh0KQoreworCWludCBiYWNrc3BhY2UsIHJlc3VsdDsKKwlzdHJ1Y3Qgc3RfYnVmZmVyICpTVGJ1ZmZlcjsKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgKlNUcHM7CisKKwlTVGJ1ZmZlciA9IFNUcC0+YnVmZmVyOworCisJLyoKKwkgKiBJZiB0aGVyZSB3YXMgYSBidXMgcmVzZXQsIGJsb2NrIGZ1cnRoZXIgYWNjZXNzCisJICogdG8gdGhpcyBkZXZpY2UuCisJICovCisJaWYgKFNUcC0+cG9zX3Vua25vd24pCisJCXJldHVybiAoLUVJTyk7CisKKwlpZiAoU1RwLT5yZWFkeSAhPSBTVF9SRUFEWSkKKwkJcmV0dXJuIDA7CisJU1RwcyA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCWlmIChTVHBzLT5ydyA9PSBTVF9XUklUSU5HKQkvKiBXcml0aW5nICovCisJCXJldHVybiBmbHVzaF93cml0ZV9idWZmZXIoU1RwKTsKKworCWlmIChTVHAtPmJsb2NrX3NpemUgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwliYWNrc3BhY2UgPSAoKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzICsKKwkJICAgICAoU1RwLT5idWZmZXIpLT5yZWFkX3BvaW50ZXIpIC8gU1RwLT5ibG9ja19zaXplIC0KKwkgICAgKChTVHAtPmJ1ZmZlciktPnJlYWRfcG9pbnRlciArIFNUcC0+YmxvY2tfc2l6ZSAtIDEpIC8KKwkgICAgU1RwLT5ibG9ja19zaXplOworCShTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyA9IDA7CisJKFNUcC0+YnVmZmVyKS0+cmVhZF9wb2ludGVyID0gMDsKKwlyZXN1bHQgPSAwOworCWlmICghc2Vla19uZXh0KSB7CisJCWlmIChTVHBzLT5lb2YgPT0gU1RfRk1fSElUKSB7CisJCQlyZXN1bHQgPSBjcm9zc19lb2YoU1RwLCAwKTsJLyogQmFjayBvdmVyIHRoZSBFT0YgaGl0ICovCisJCQlpZiAoIXJlc3VsdCkKKwkJCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKwkJCWVsc2UgeworCQkJCWlmIChTVHBzLT5kcnZfZmlsZSA+PSAwKQorCQkJCQlTVHBzLT5kcnZfZmlsZSsrOworCQkJCVNUcHMtPmRydl9ibG9jayA9IDA7CisJCQl9CisJCX0KKwkJaWYgKCFyZXN1bHQgJiYgYmFja3NwYWNlID4gMCkKKwkJCXJlc3VsdCA9IHN0X2ludF9pb2N0bChTVHAsIE1UQlNSLCBiYWNrc3BhY2UpOworCX0gZWxzZSBpZiAoU1Rwcy0+ZW9mID09IFNUX0ZNX0hJVCkgeworCQlpZiAoU1Rwcy0+ZHJ2X2ZpbGUgPj0gMCkKKwkJCVNUcHMtPmRydl9maWxlKys7CisJCVNUcHMtPmRydl9ibG9jayA9IDA7CisJCVNUcHMtPmVvZiA9IFNUX05PRU9GOworCX0KKwlyZXR1cm4gcmVzdWx0OworCit9CisMCisvKiBTZXQgdGhlIG1vZGUgcGFyYW1ldGVycyAqLworc3RhdGljIGludCBzZXRfbW9kZV9kZW5zYmxrKHN0cnVjdCBzY3NpX3RhcGUgKiBTVHAsIHN0cnVjdCBzdF9tb2RlZGVmICogU1RtKQoreworCWludCBzZXRfaXQgPSAwOworCXVuc2lnbmVkIGxvbmcgYXJnOworCWNoYXIgKm5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKworCWlmICghU1RwLT5kZW5zaXR5X2NoYW5nZWQgJiYKKwkgICAgU1RtLT5kZWZhdWx0X2RlbnNpdHkgPj0gMCAmJgorCSAgICBTVG0tPmRlZmF1bHRfZGVuc2l0eSAhPSBTVHAtPmRlbnNpdHkpIHsKKwkJYXJnID0gU1RtLT5kZWZhdWx0X2RlbnNpdHk7CisJCXNldF9pdCA9IDE7CisJfSBlbHNlCisJCWFyZyA9IFNUcC0+ZGVuc2l0eTsKKwlhcmcgPDw9IE1UX1NUX0RFTlNJVFlfU0hJRlQ7CisJaWYgKCFTVHAtPmJsa3NpemVfY2hhbmdlZCAmJgorCSAgICBTVG0tPmRlZmF1bHRfYmxrc2l6ZSA+PSAwICYmCisJICAgIFNUbS0+ZGVmYXVsdF9ibGtzaXplICE9IFNUcC0+YmxvY2tfc2l6ZSkgeworCQlhcmcgfD0gU1RtLT5kZWZhdWx0X2Jsa3NpemU7CisJCXNldF9pdCA9IDE7CisJfSBlbHNlCisJCWFyZyB8PSBTVHAtPmJsb2NrX3NpemU7CisJaWYgKHNldF9pdCAmJgorCSAgICBzdF9pbnRfaW9jdGwoU1RwLCBTRVRfREVOU19BTkRfQkxLLCBhcmcpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogQ2FuJ3Qgc2V0IGRlZmF1bHQgYmxvY2sgc2l6ZSB0byAlZCBieXRlcyBhbmQgZGVuc2l0eSAleC5cbiIsCisJCSAgICAgICBuYW1lLCBTVG0tPmRlZmF1bHRfYmxrc2l6ZSwgU1RtLT5kZWZhdWx0X2RlbnNpdHkpOworCQlpZiAobW9kZXNfZGVmaW5lZCkKKwkJCXJldHVybiAoLUVJTlZBTCk7CisJfQorCXJldHVybiAwOworfQorCisKKy8qIExvY2sgb3IgdW5sb2NrIHRoZSBkcml2ZSBkb29yLiBEb24ndCB1c2Ugd2hlbiBzY3NpX3JlcXVlc3QgYWxsb2NhdGVkLiAqLworc3RhdGljIGludCBkb19kb29yX2xvY2soc3RydWN0IHNjc2lfdGFwZSAqIFNUcCwgaW50IGRvX2xvY2spCit7CisJaW50IHJldHZhbCwgY21kOworCURFQihjaGFyICpuYW1lID0gdGFwZV9uYW1lKFNUcCk7KQorCisKKwljbWQgPSBkb19sb2NrID8gU0NTSV9JT0NUTF9ET09STE9DSyA6IFNDU0lfSU9DVExfRE9PUlVOTE9DSzsKKwlERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogJXNvY2tpbmcgZHJpdmUgZG9vci5cbiIsIG5hbWUsCisJCSAgICBkb19sb2NrID8gIkwiIDogIlVubCIpKTsKKwlyZXR2YWwgPSBzY3NpX2lvY3RsKFNUcC0+ZGV2aWNlLCBjbWQsIE5VTEwpOworCWlmICghcmV0dmFsKSB7CisJCVNUcC0+ZG9vcl9sb2NrZWQgPSBkb19sb2NrID8gU1RfTE9DS0VEX0VYUExJQ0lUIDogU1RfVU5MT0NLRUQ7CisJfQorCWVsc2UgeworCQlTVHAtPmRvb3JfbG9ja2VkID0gU1RfTE9DS19GQUlMUzsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworCisvKiBTZXQgdGhlIGludGVybmFsIHN0YXRlIGFmdGVyIHJlc2V0ICovCitzdGF0aWMgdm9pZCByZXNldF9zdGF0ZShzdHJ1Y3Qgc2NzaV90YXBlICpTVHApCit7CisJaW50IGk7CisJc3RydWN0IHN0X3BhcnRzdGF0ICpTVHBzOworCisJU1RwLT5wb3NfdW5rbm93biA9IDA7CisJZm9yIChpID0gMDsgaSA8IFNUX05CUl9QQVJUSVRJT05TOyBpKyspIHsKKwkJU1RwcyA9ICYoU1RwLT5wc1tpXSk7CisJCVNUcHMtPnJ3ID0gU1RfSURMRTsKKwkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisJCVNUcHMtPmF0X3NtID0gMDsKKwkJU1Rwcy0+bGFzdF9ibG9ja192YWxpZCA9IDA7CisJCVNUcHMtPmRydl9ibG9jayA9IC0xOworCQlTVHBzLT5kcnZfZmlsZSA9IC0xOworCX0KKwlpZiAoU1RwLT5jYW5fcGFydGl0aW9ucykgeworCQlTVHAtPnBhcnRpdGlvbiA9IGZpbmRfcGFydGl0aW9uKFNUcCk7CisJCWlmIChTVHAtPnBhcnRpdGlvbiA8IDApCisJCQlTVHAtPnBhcnRpdGlvbiA9IDA7CisJCVNUcC0+bmV3X3BhcnRpdGlvbiA9IFNUcC0+cGFydGl0aW9uOworCX0KK30KKwwKKy8qIFRlc3QgaWYgdGhlIGRyaXZlIGlzIHJlYWR5LiBSZXR1cm5zIGVpdGhlciBvbmUgb2YgdGhlIGNvZGVzIGJlbG93IG9yIGEgbmVnYXRpdmUgc3lzdGVtCisgICBlcnJvciBjb2RlLiAqLworI2RlZmluZSBDSEtSRVNfUkVBRFkgICAgICAgMAorI2RlZmluZSBDSEtSRVNfTkVXX1NFU1NJT04gMQorI2RlZmluZSBDSEtSRVNfTk9UX1JFQURZICAgMgorI2RlZmluZSBDSEtSRVNfTk9fVEFQRSAgICAgMworCisjZGVmaW5lIE1BWF9BVFRFTlRJT05TICAgIDEwCisKK3N0YXRpYyBpbnQgdGVzdF9yZWFkeShzdHJ1Y3Qgc2NzaV90YXBlICpTVHAsIGludCBkb193YWl0KQoreworCWludCBhdHRlbnRpb25zLCB3YWl0cywgbWF4X3dhaXQsIHNjb2RlOworCWludCByZXR2YWwgPSBDSEtSRVNfUkVBRFksIG5ld19zZXNzaW9uID0gMDsKKwl1bnNpZ25lZCBjaGFyIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudCA9IE5VTEw7CisJc3RydWN0IHN0X2NtZHN0YXR1cyAqY21kc3RhdHAgPSAmU1RwLT5idWZmZXItPmNtZHN0YXQ7CisKKwltYXhfd2FpdCA9IGRvX3dhaXQgPyBTVF9CTE9DS19TRUNPTkRTIDogMDsKKworCWZvciAoYXR0ZW50aW9ucz13YWl0cz0wOyA7ICkgeworCQltZW1zZXQoKHZvaWQgKikgJmNtZFswXSwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJCWNtZFswXSA9IFRFU1RfVU5JVF9SRUFEWTsKKwkJU1JwbnQgPSBzdF9kb19zY3NpKFNScG50LCBTVHAsIGNtZCwgMCwgRE1BX05PTkUsCisJCQkJICAgU1RwLT5sb25nX3RpbWVvdXQsIE1BWF9SRUFEWV9SRVRSSUVTLCAxKTsKKworCQlpZiAoIVNScG50KSB7CisJCQlyZXR2YWwgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNtZHN0YXRwLT5oYXZlX3NlbnNlKSB7CisKKwkJCXNjb2RlID0gY21kc3RhdHAtPnNlbnNlX2hkci5zZW5zZV9rZXk7CisKKwkJCWlmIChzY29kZSA9PSBVTklUX0FUVEVOVElPTikgeyAvKiBOZXcgbWVkaWE/ICovCisJCQkJbmV3X3Nlc3Npb24gPSAxOworCQkJCWlmIChhdHRlbnRpb25zIDwgTUFYX0FUVEVOVElPTlMpIHsKKwkJCQkJYXR0ZW50aW9ucysrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXJldHZhbCA9ICgtRUlPKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoc2NvZGUgPT0gTk9UX1JFQURZKSB7CisJCQkJaWYgKHdhaXRzIDwgbWF4X3dhaXQpIHsKKwkJCQkJaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDApKSB7CisJCQkJCQlyZXR2YWwgPSAoLUVJTlRSKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCXdhaXRzKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJaWYgKChTVHAtPmRldmljZSktPnNjc2lfbGV2ZWwgPj0gU0NTSV8yICYmCisJCQkJCSAgICBjbWRzdGF0cC0+c2Vuc2VfaGRyLmFzYyA9PSAweDNhKQkvKiBDaGVjayBBU0MgKi8KKwkJCQkJCXJldHZhbCA9IENIS1JFU19OT19UQVBFOworCQkJCQllbHNlCisJCQkJCQlyZXR2YWwgPSBDSEtSRVNfTk9UX1JFQURZOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR2YWwgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKwkJaWYgKCFyZXR2YWwpCisJCQlyZXR2YWwgPSBuZXdfc2Vzc2lvbiA/IENIS1JFU19ORVdfU0VTU0lPTiA6IENIS1JFU19SRUFEWTsKKwkJYnJlYWs7CisJfQorCisJaWYgKFNScG50ICE9IE5VTEwpCisJCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKy8qIFNlZSBpZiB0aGUgZHJpdmUgaXMgcmVhZHkgYW5kIGdhdGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFwZS4gUmV0dXJuIHZhbHVlczoKKyAgIDwgMCAgIG5lZ2F0aXZlIGVycm9yIGNvZGUgZnJvbSBlcnJuby5oCisgICAwICAgICBkcml2ZSByZWFkeQorICAgMSAgICAgZHJpdmUgbm90IHJlYWR5IChwb3NzaWJseSBubyB0YXBlKQorKi8KK3N0YXRpYyBpbnQgY2hlY2tfdGFwZShzdHJ1Y3Qgc2NzaV90YXBlICpTVHAsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWludCBpLCByZXR2YWwsIG5ld19zZXNzaW9uID0gMCwgZG9fd2FpdDsKKwl1bnNpZ25lZCBjaGFyIGNtZFtNQVhfQ09NTUFORF9TSVpFXSwgc2F2ZWRfY2xlYW5pbmc7CisJdW5zaWduZWQgc2hvcnQgc3RfZmxhZ3MgPSBmaWxwLT5mX2ZsYWdzOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50ID0gTlVMTDsKKwlzdHJ1Y3Qgc3RfbW9kZWRlZiAqU1RtOworCXN0cnVjdCBzdF9wYXJ0c3RhdCAqU1RwczsKKwljaGFyICpuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCWludCBtb2RlID0gVEFQRV9NT0RFKGlub2RlKTsKKworCVNUcC0+cmVhZHkgPSBTVF9SRUFEWTsKKworCWlmIChtb2RlICE9IFNUcC0+Y3VycmVudF9tb2RlKSB7CisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IE1vZGUgY2hhbmdlIGZyb20gJWQgdG8gJWQuXG4iLAorCQkJICAgICAgIG5hbWUsIFNUcC0+Y3VycmVudF9tb2RlLCBtb2RlKSk7CisJCW5ld19zZXNzaW9uID0gMTsKKwkJU1RwLT5jdXJyZW50X21vZGUgPSBtb2RlOworCX0KKwlTVG0gPSAmKFNUcC0+bW9kZXNbU1RwLT5jdXJyZW50X21vZGVdKTsKKworCXNhdmVkX2NsZWFuaW5nID0gU1RwLT5jbGVhbmluZ19yZXE7CisJU1RwLT5jbGVhbmluZ19yZXEgPSAwOworCisJZG9fd2FpdCA9ICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spID09IDApOworCXJldHZhbCA9IHRlc3RfcmVhZHkoU1RwLCBkb193YWl0KTsKKworCWlmIChyZXR2YWwgPCAwKQorCSAgICBnb3RvIGVycl9vdXQ7CisKKwlpZiAocmV0dmFsID09IENIS1JFU19ORVdfU0VTU0lPTikgeworCQlTVHAtPnBvc191bmtub3duID0gMDsKKwkJU1RwLT5wYXJ0aXRpb24gPSBTVHAtPm5ld19wYXJ0aXRpb24gPSAwOworCQlpZiAoU1RwLT5jYW5fcGFydGl0aW9ucykKKwkJCVNUcC0+bmJyX3BhcnRpdGlvbnMgPSAxOyAvKiBUaGlzIGd1ZXNzIHdpbGwgYmUgdXBkYXRlZCBsYXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5lY2Vzc2FyeSAqLworCQlmb3IgKGkgPSAwOyBpIDwgU1RfTkJSX1BBUlRJVElPTlM7IGkrKykgeworCQkJU1RwcyA9ICYoU1RwLT5wc1tpXSk7CisJCQlTVHBzLT5ydyA9IFNUX0lETEU7CisJCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKwkJCVNUcHMtPmF0X3NtID0gMDsKKwkJCVNUcHMtPmxhc3RfYmxvY2tfdmFsaWQgPSAwOworCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gMDsKKwkJCVNUcHMtPmRydl9maWxlID0gMDsKKwkJfQorCQluZXdfc2Vzc2lvbiA9IDE7CisJfQorCWVsc2UgeworCQlTVHAtPmNsZWFuaW5nX3JlcSB8PSBzYXZlZF9jbGVhbmluZzsKKworCQlpZiAocmV0dmFsID09IENIS1JFU19OT1RfUkVBRFkgfHwgcmV0dmFsID09IENIS1JFU19OT19UQVBFKSB7CisJCQlpZiAocmV0dmFsID09IENIS1JFU19OT19UQVBFKQorCQkJCVNUcC0+cmVhZHkgPSBTVF9OT19UQVBFOworCQkJZWxzZQorCQkJCVNUcC0+cmVhZHkgPSBTVF9OT1RfUkVBRFk7CisKKwkJCVNUcC0+ZGVuc2l0eSA9IDA7CS8qIENsZWFyIHRoZSBlcnJvbmVvdXMgInJlc2lkdWUiICovCisJCQlTVHAtPndyaXRlX3Byb3QgPSAwOworCQkJU1RwLT5ibG9ja19zaXplID0gMDsKKwkJCVNUcC0+cHNbMF0uZHJ2X2ZpbGUgPSBTVHAtPnBzWzBdLmRydl9ibG9jayA9ICgtMSk7CisJCQlTVHAtPnBhcnRpdGlvbiA9IFNUcC0+bmV3X3BhcnRpdGlvbiA9IDA7CisJCQlTVHAtPmRvb3JfbG9ja2VkID0gU1RfVU5MT0NLRUQ7CisJCQlyZXR1cm4gQ0hLUkVTX05PVF9SRUFEWTsKKwkJfQorCX0KKworCWlmIChTVHAtPm9taXRfYmxrbGltcykKKwkJU1RwLT5taW5fYmxvY2sgPSBTVHAtPm1heF9ibG9jayA9ICgtMSk7CisJZWxzZSB7CisJCW1lbXNldCgodm9pZCAqKSAmY21kWzBdLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwkJY21kWzBdID0gUkVBRF9CTE9DS19MSU1JVFM7CisKKwkJU1JwbnQgPSBzdF9kb19zY3NpKFNScG50LCBTVHAsIGNtZCwgNiwgRE1BX0ZST01fREVWSUNFLAorCQkJCSAgIFNUcC0+ZGV2aWNlLT50aW1lb3V0LCBNQVhfUkVBRFlfUkVUUklFUywgMSk7CisJCWlmICghU1JwbnQpIHsKKwkJCXJldHZhbCA9IChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworCQkJZ290byBlcnJfb3V0OworCQl9CisKKwkJaWYgKCFTUnBudC0+c3JfcmVzdWx0ICYmICFTVHAtPmJ1ZmZlci0+Y21kc3RhdC5oYXZlX3NlbnNlKSB7CisJCQlTVHAtPm1heF9ibG9jayA9ICgoU1RwLT5idWZmZXIpLT5iX2RhdGFbMV0gPDwgMTYpIHwKKwkJCSAgICAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzJdIDw8IDgpIHwgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzNdOworCQkJU1RwLT5taW5fYmxvY2sgPSAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzRdIDw8IDgpIHwKKwkJCSAgICAoU1RwLT5idWZmZXIpLT5iX2RhdGFbNV07CisJCQlpZiAoIERFQiggZGVidWdnaW5nIHx8ICkgIVNUcC0+aW5pdGVkKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogQmxvY2sgbGltaXRzICVkIC0gJWQgYnl0ZXMuXG4iLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RwLT5taW5fYmxvY2ssIFNUcC0+bWF4X2Jsb2NrKTsKKwkJfSBlbHNlIHsKKwkJCVNUcC0+bWluX2Jsb2NrID0gU1RwLT5tYXhfYmxvY2sgPSAoLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IENhbid0IHJlYWQgYmxvY2sgbGltaXRzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpKTsKKwkJfQorCX0KKworCW1lbXNldCgodm9pZCAqKSAmY21kWzBdLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwljbWRbMF0gPSBNT0RFX1NFTlNFOworCWNtZFs0XSA9IDEyOworCisJU1JwbnQgPSBzdF9kb19zY3NpKFNScG50LCBTVHAsIGNtZCwgMTIsIERNQV9GUk9NX0RFVklDRSwKKwkJCVNUcC0+ZGV2aWNlLT50aW1lb3V0LCBNQVhfUkVBRFlfUkVUUklFUywgMSk7CisJaWYgKCFTUnBudCkgeworCQlyZXR2YWwgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWlmICgoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IE5vIE1vZGUgU2Vuc2UuXG4iLCBuYW1lKSk7CisJCVNUcC0+YmxvY2tfc2l6ZSA9IFNUX0RFRkFVTFRfQkxPQ0s7CS8qIEVkdWNhdGVkIGd1ZXNzICg/KSAqLworCQkoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCA9IDA7CS8qIFByZXZlbnQgZXJyb3IgcHJvcGFnYXRpb24gKi8KKwkJU1RwLT5kcnZfd3JpdGVfcHJvdCA9IDA7CisJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBNb2RlIHNlbnNlLiBMZW5ndGggJWQsIG1lZGl1bSAleCwgV0JTICV4LCBCTEwgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU1RwLT5idWZmZXIpLT5iX2RhdGFbMF0sIChTVHAtPmJ1ZmZlciktPmJfZGF0YVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU1RwLT5idWZmZXIpLT5iX2RhdGFbMl0sIChTVHAtPmJ1ZmZlciktPmJfZGF0YVszXSkpOworCisJCWlmICgoU1RwLT5idWZmZXIpLT5iX2RhdGFbM10gPj0gOCkgeworCQkJU1RwLT5kcnZfYnVmZmVyID0gKChTVHAtPmJ1ZmZlciktPmJfZGF0YVsyXSA+PiA0KSAmIDc7CisJCQlTVHAtPmRlbnNpdHkgPSAoU1RwLT5idWZmZXIpLT5iX2RhdGFbNF07CisJCQlTVHAtPmJsb2NrX3NpemUgPSAoU1RwLT5idWZmZXIpLT5iX2RhdGFbOV0gKiA2NTUzNiArCisJCQkgICAgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzEwXSAqIDI1NiArIChTVHAtPmJ1ZmZlciktPmJfZGF0YVsxMV07CisgICAgICAgICAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IERlbnNpdHkgJXgsIHRhcGUgbGVuZ3RoOiAleCwgZHJ2IGJ1ZmZlcjogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBTVHAtPmRlbnNpdHksIChTVHAtPmJ1ZmZlciktPmJfZGF0YVs1XSAqIDY1NTM2ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTVHAtPmJ1ZmZlciktPmJfZGF0YVs2XSAqIDI1NiArIChTVHAtPmJ1ZmZlciktPmJfZGF0YVs3XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUcC0+ZHJ2X2J1ZmZlcikpOworCQl9CisJCVNUcC0+ZHJ2X3dyaXRlX3Byb3QgPSAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzJdICYgMHg4MCkgIT0gMDsKKwl9CisJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCVNScG50ID0gTlVMTDsKKyAgICAgICAgU1RwLT5pbml0ZWQgPSAxOworCisJaWYgKFNUcC0+YmxvY2tfc2l6ZSA+IDApCisJCShTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ibG9ja3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgKFNUcC0+YnVmZmVyKS0+YnVmZmVyX3NpemUgLyBTVHAtPmJsb2NrX3NpemU7CisJZWxzZQorCQkoU1RwLT5idWZmZXIpLT5idWZmZXJfYmxvY2tzID0gMTsKKwkoU1RwLT5idWZmZXIpLT5idWZmZXJfYnl0ZXMgPSAoU1RwLT5idWZmZXIpLT5yZWFkX3BvaW50ZXIgPSAwOworCisgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBCbG9jayBzaXplOiAlZCwgYnVmZmVyIHNpemU6ICVkICglZCBibG9ja3MpLlxuIiwgbmFtZSwKKwkJICAgICAgIFNUcC0+YmxvY2tfc2l6ZSwgKFNUcC0+YnVmZmVyKS0+YnVmZmVyX3NpemUsCisJCSAgICAgICAoU1RwLT5idWZmZXIpLT5idWZmZXJfYmxvY2tzKSk7CisKKwlpZiAoU1RwLT5kcnZfd3JpdGVfcHJvdCkgeworCQlTVHAtPndyaXRlX3Byb3QgPSAxOworCisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IFdyaXRlIHByb3RlY3RlZFxuIiwgbmFtZSkpOworCisJCWlmIChkb193YWl0ICYmCisJCSAgICAoKHN0X2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1dST05MWSB8fAorCQkgICAgIChzdF9mbGFncyAmIE9fQUNDTU9ERSkgPT0gT19SRFdSKSkgeworCQkJcmV0dmFsID0gKC1FUk9GUyk7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwl9CisKKwlpZiAoU1RwLT5jYW5fcGFydGl0aW9ucyAmJiBTVHAtPm5icl9wYXJ0aXRpb25zIDwgMSkgeworCQkvKiBUaGlzIGNvZGUgaXMgcmVhY2hlZCB3aGVuIHRoZSBkZXZpY2UgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQorCQkgICBhZnRlciB0aGUgZHJpdmVyIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggdGFwZSBpbiB0aGUgZHJpdmUgYW5kIHRoZQorCQkgICBwYXJ0aXRpb24gc3VwcG9ydCBoYXMgYmVlbiBlbmFibGVkLiAqLworICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFVwZGF0aW5nIHBhcnRpdGlvbiBudW1iZXIgaW4gc3RhdHVzLlxuIiwgbmFtZSkpOworCQlpZiAoKFNUcC0+cGFydGl0aW9uID0gZmluZF9wYXJ0aXRpb24oU1RwKSkgPCAwKSB7CisJCQlyZXR2YWwgPSBTVHAtPnBhcnRpdGlvbjsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQlTVHAtPm5ld19wYXJ0aXRpb24gPSBTVHAtPnBhcnRpdGlvbjsKKwkJU1RwLT5uYnJfcGFydGl0aW9ucyA9IDE7IC8qIFRoaXMgZ3Vlc3Mgd2lsbCBiZSB1cGRhdGVkIHdoZW4gbmVjZXNzYXJ5ICovCisJfQorCisJaWYgKG5ld19zZXNzaW9uKSB7CS8qIENoYW5nZSB0aGUgZHJpdmUgcGFyYW1ldGVycyBmb3IgdGhlIG5ldyBtb2RlICovCisJCVNUcC0+ZGVuc2l0eV9jaGFuZ2VkID0gU1RwLT5ibGtzaXplX2NoYW5nZWQgPSAwOworCQlTVHAtPmNvbXByZXNzaW9uX2NoYW5nZWQgPSAwOworCQlpZiAoIShTVG0tPmRlZmF1bHRzX2Zvcl93cml0ZXMpICYmCisJCSAgICAocmV0dmFsID0gc2V0X21vZGVfZGVuc2JsayhTVHAsIFNUbSkpIDwgMCkKKwkJICAgIGdvdG8gZXJyX291dDsKKworCQlpZiAoU1RwLT5kZWZhdWx0X2RydmJ1ZmZlciAhPSAweGZmKSB7CisJCQlpZiAoc3RfaW50X2lvY3RsKFNUcCwgTVRTRVREUlZCVUZGRVIsIFNUcC0+ZGVmYXVsdF9kcnZidWZmZXIpKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogQ2FuJ3Qgc2V0IGRlZmF1bHQgZHJpdmUgYnVmZmVyaW5nIHRvICVkLlxuIiwKKwkJCQkgICAgICAgbmFtZSwgU1RwLT5kZWZhdWx0X2RydmJ1ZmZlcik7CisJCX0KKwl9CisKKwlyZXR1cm4gQ0hLUkVTX1JFQURZOworCisgZXJyX291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKwwvKiBPcGVuIHRoZSBkZXZpY2UuIE5lZWRzIHRvIGJlIGNhbGxlZCB3aXRoIEJLTCBvbmx5IGJlY2F1c2Ugb2YgaW5jcmVtZW50aW5nIHRoZSBTQ1NJIGhvc3QKKyAgIG1vZHVsZSBjb3VudC4gKi8KK3N0YXRpYyBpbnQgc3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpbnQgaSwgcmV0dmFsID0gKC1FSU8pOworCXN0cnVjdCBzY3NpX3RhcGUgKlNUcDsKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgKlNUcHM7CisJaW50IGRldiA9IFRBUEVfTlIoaW5vZGUpOworCWNoYXIgKm5hbWU7CisKKwkvKgorCSAqIFdlIHJlYWxseSB3YW50IHRvIGRvIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbHApOyBoZXJlLCBidXQgc29tZQorCSAqIHZlcnNpb25zIG9mIHRhciBpbmNvcnJlY3RseSBjYWxsIGxzZWVrIG9uIHRhcGVzIGFuZCBiYWlsIG91dCBpZiB0aGF0CisJICogZmFpbHMuICBTbyB3ZSBkaXNhbGxvdyBwcmVhZCgpIGFuZCBwd3JpdGUoKSwgYnV0IHBlcm1pdCBsc2Vla3MuCisJICovCisJZmlscC0+Zl9tb2RlICY9IH4oRk1PREVfUFJFQUQgfCBGTU9ERV9QV1JJVEUpOworCisJd3JpdGVfbG9jaygmc3RfZGV2X2Fycl9sb2NrKTsKKwlpZiAoZGV2ID49IHN0X2Rldl9tYXggfHwgc2NzaV90YXBlcyA9PSBOVUxMIHx8CisJICAgICgoU1RwID0gc2NzaV90YXBlc1tkZXZdKSA9PSBOVUxMKSkgeworCQl3cml0ZV91bmxvY2soJnN0X2Rldl9hcnJfbG9jayk7CisJCXJldHVybiAoLUVOWElPKTsKKwl9CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gU1RwOworCW5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKworCWlmIChTVHAtPmluX3VzZSkgeworCQl3cml0ZV91bmxvY2soJnN0X2Rldl9hcnJfbG9jayk7CisJCURFQiggcHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBEZXZpY2UgYWxyZWFkeSBpbiB1c2UuXG4iLCBuYW1lKTsgKQorCQlyZXR1cm4gKC1FQlVTWSk7CisJfQorCisJaWYoc2NzaV9kZXZpY2VfZ2V0KFNUcC0+ZGV2aWNlKSkgeworCQl3cml0ZV91bmxvY2soJnN0X2Rldl9hcnJfbG9jayk7CisJCXJldHVybiAoLUVOWElPKTsKKwl9CisJU1RwLT5pbl91c2UgPSAxOworCXdyaXRlX3VubG9jaygmc3RfZGV2X2Fycl9sb2NrKTsKKwlTVHAtPnJld19hdF9jbG9zZSA9IFNUcC0+YXV0b3Jld19kZXYgPSAoaW1pbm9yKGlub2RlKSAmIDB4ODApID09IDA7CisKKwlpZiAoIXNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhTVHAtPmRldmljZSkpIHsKKwkJcmV0dmFsID0gKC1FTlhJTyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBTZWUgdGhhdCB3ZSBoYXZlIGF0IGxlYXN0IGEgb25lIHBhZ2UgYnVmZmVyIGF2YWlsYWJsZSAqLworCWlmICghZW5sYXJnZV9idWZmZXIoU1RwLT5idWZmZXIsIFBBR0VfU0laRSwgU1RwLT5yZXN0cl9kbWEpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW4ndCBhbGxvY2F0ZSBvbmUgcGFnZSB0YXBlIGJ1ZmZlci5cbiIsCisJCSAgICAgICBuYW1lKTsKKwkJcmV0dmFsID0gKC1FT1ZFUkZMT1cpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJKFNUcC0+YnVmZmVyKS0+d3JpdGluZyA9IDA7CisJKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgPSAwOworCisJU1RwLT53cml0ZV9wcm90ID0gKChmaWxwLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSk7CisKKwlTVHAtPmRpcnR5ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgU1RfTkJSX1BBUlRJVElPTlM7IGkrKykgeworCQlTVHBzID0gJihTVHAtPnBzW2ldKTsKKwkJU1Rwcy0+cncgPSBTVF9JRExFOworCX0KKwlTVHAtPnJlY292ZXJfY291bnQgPSAwOworCURFQiggU1RwLT5uYnJfd2FpdHMgPSBTVHAtPm5icl9maW5pc2hlZCA9IDA7CisJICAgICBTVHAtPm5icl9yZXF1ZXN0cyA9IFNUcC0+bmJyX2RpbyA9IFNUcC0+bmJyX3BhZ2VzID0gU1RwLT5uYnJfY29tYmluYWJsZSA9IDA7ICkKKworCXJldHZhbCA9IGNoZWNrX3RhcGUoU1RwLCBmaWxwKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBlcnJfb3V0OworCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spID09IDAgJiYKKwkgICAgcmV0dmFsICE9IENIS1JFU19SRUFEWSkgeworCQlyZXR2YWwgPSAoLUVJTyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJcmV0dXJuIDA7CisKKyBlcnJfb3V0OgorCW5vcm1hbGl6ZV9idWZmZXIoU1RwLT5idWZmZXIpOworCVNUcC0+aW5fdXNlID0gMDsKKwlzY3NpX2RldmljZV9wdXQoU1RwLT5kZXZpY2UpOworCXJldHVybiByZXR2YWw7CisKK30KKwwKKworLyogRmx1c2ggdGhlIHRhcGUgYnVmZmVyIGJlZm9yZSBjbG9zZSAqLworc3RhdGljIGludCBzdF9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpbnQgcmVzdWx0ID0gMCwgcmVzdWx0MjsKKwl1bnNpZ25lZCBjaGFyIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudDsKKwlzdHJ1Y3Qgc2NzaV90YXBlICpTVHAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHN0X21vZGVkZWYgKlNUbSA9ICYoU1RwLT5tb2Rlc1tTVHAtPmN1cnJlbnRfbW9kZV0pOworCXN0cnVjdCBzdF9wYXJ0c3RhdCAqU1RwcyA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCWNoYXIgKm5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKworCWlmIChmaWxlX2NvdW50KGZpbHApID4gMSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoU1Rwcy0+cncgPT0gU1RfV1JJVElORyAmJiAhU1RwLT5wb3NfdW5rbm93bikgeworCQlyZXN1bHQgPSBmbHVzaF93cml0ZV9idWZmZXIoU1RwKTsKKwkJaWYgKHJlc3VsdCAhPSAwICYmIHJlc3VsdCAhPSAoLUVOT1NQQykpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoU1RwLT5jYW5fcGFydGl0aW9ucyAmJgorCSAgICAocmVzdWx0MiA9IHN3aXRjaF9wYXJ0aXRpb24oU1RwKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogc3dpdGNoX3BhcnRpdGlvbiBhdCBjbG9zZSBmYWlsZWQuXG4iLCBuYW1lKSk7CisJCWlmIChyZXN1bHQgPT0gMCkKKwkJCXJlc3VsdCA9IHJlc3VsdDI7CisJCWdvdG8gb3V0OworCX0KKworCURFQkMoIGlmIChTVHAtPm5icl9yZXF1ZXN0cykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE51bWJlciBvZiByL3cgcmVxdWVzdHMgJWQsIGRpbyB1c2VkIGluICVkLCBwYWdlcyAlZCAoJWQpLlxuIiwKKwkJICAgICAgIG5hbWUsIFNUcC0+bmJyX3JlcXVlc3RzLCBTVHAtPm5icl9kaW8sIFNUcC0+bmJyX3BhZ2VzLCBTVHAtPm5icl9jb21iaW5hYmxlKSk7CisKKwlpZiAoU1Rwcy0+cncgPT0gU1RfV1JJVElORyAmJiAhU1RwLT5wb3NfdW5rbm93bikgeworCQlzdHJ1Y3Qgc3RfY21kc3RhdHVzICpjbWRzdGF0cCA9ICZTVHAtPmJ1ZmZlci0+Y21kc3RhdDsKKworICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBBc3luYyB3cml0ZSB3YWl0cyAlZCwgZmluaXNoZWQgJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIFNUcC0+bmJyX3dhaXRzLCBTVHAtPm5icl9maW5pc2hlZCk7CisJCSkKKworCQltZW1zZXQoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwkJY21kWzBdID0gV1JJVEVfRklMRU1BUktTOworCQljbWRbNF0gPSAxICsgU1RwLT50d29fZm07CisKKwkJU1JwbnQgPSBzdF9kb19zY3NpKE5VTEwsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwKKwkJCQkgICBTVHAtPmRldmljZS0+dGltZW91dCwgTUFYX1dSSVRFX1JFVFJJRVMsIDEpOworCQlpZiAoIVNScG50KSB7CisJCQlyZXN1bHQgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCA9PSAwIHx8CisJCSAgICAoY21kc3RhdHAtPmhhdmVfc2Vuc2UgJiYgIWNtZHN0YXRwLT5kZWZlcnJlZCAmJgorCQkgICAgIChjbWRzdGF0cC0+ZmxhZ3MgJiBTRU5TRV9FT00pICYmCisJCSAgICAgKGNtZHN0YXRwLT5zZW5zZV9oZHIuc2Vuc2Vfa2V5ID09IE5PX1NFTlNFIHx8CisJCSAgICAgIGNtZHN0YXRwLT5zZW5zZV9oZHIuc2Vuc2Vfa2V5ID09IFJFQ09WRVJFRF9FUlJPUikgJiYKKwkJICAgICAoIWNtZHN0YXRwLT5yZW1haW5kZXJfdmFsaWQgfHwgY21kc3RhdHAtPnVyZW1haW5kZXI2NCA9PSAwKSkpIHsKKwkJCS8qIFdyaXRlIHN1Y2Nlc3NmdWwgYXQgRU9NICovCisJCQlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJCQlTUnBudCA9IE5VTEw7CisJCQlpZiAoU1Rwcy0+ZHJ2X2ZpbGUgPj0gMCkKKwkJCQlTVHBzLT5kcnZfZmlsZSsrOworCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gMDsKKwkJCWlmIChTVHAtPnR3b19mbSkKKwkJCQljcm9zc19lb2YoU1RwLCAwKTsKKwkJCVNUcHMtPmVvZiA9IFNUX0ZNOworCQl9CisJCWVsc2UgeyAvKiBXcml0ZSBlcnJvciAqLworCQkJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCQkJU1JwbnQgPSBOVUxMOworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igb24gd3JpdGUgZmlsZW1hcmsuXG4iLCBuYW1lKTsKKwkJCWlmIChyZXN1bHQgPT0gMCkKKwkJCQlyZXN1bHQgPSAoLUVJTyk7CisJCX0KKworICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBCdWZmZXIgZmx1c2hlZCwgJWQgRU9GKHMpIHdyaXR0ZW5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgY21kWzRdKSk7CisJfSBlbHNlIGlmICghU1RwLT5yZXdfYXRfY2xvc2UpIHsKKwkJU1RwcyA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCQlpZiAoIVNUbS0+c3lzdiB8fCBTVHBzLT5ydyAhPSBTVF9SRUFESU5HKSB7CisJCQlpZiAoU1RwLT5jYW5fYnNyKQorCQkJCXJlc3VsdCA9IGZsdXNoX2J1ZmZlcihTVHAsIDApOworCQkJZWxzZSBpZiAoU1Rwcy0+ZW9mID09IFNUX0ZNX0hJVCkgeworCQkJCXJlc3VsdCA9IGNyb3NzX2VvZihTVHAsIDApOworCQkJCWlmIChyZXN1bHQpIHsKKwkJCQkJaWYgKFNUcHMtPmRydl9maWxlID49IDApCisJCQkJCQlTVHBzLT5kcnZfZmlsZSsrOworCQkJCQlTVHBzLT5kcnZfYmxvY2sgPSAwOworCQkJCQlTVHBzLT5lb2YgPSBTVF9GTTsKKwkJCQl9IGVsc2UKKwkJCQkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisJCQl9CisJCX0gZWxzZSBpZiAoKFNUcHMtPmVvZiA9PSBTVF9OT0VPRiAmJgorCQkJICAgICEocmVzdWx0ID0gY3Jvc3NfZW9mKFNUcCwgMSkpKSB8fAorCQkJICAgU1Rwcy0+ZW9mID09IFNUX0ZNX0hJVCkgeworCQkJaWYgKFNUcHMtPmRydl9maWxlID49IDApCisJCQkJU1Rwcy0+ZHJ2X2ZpbGUrKzsKKwkJCVNUcHMtPmRydl9ibG9jayA9IDA7CisJCQlTVHBzLT5lb2YgPSBTVF9GTTsKKwkJfQorCX0KKworICAgICAgb3V0OgorCWlmIChTVHAtPnJld19hdF9jbG9zZSkgeworCQlyZXN1bHQyID0gc3RfaW50X2lvY3RsKFNUcCwgTVRSRVcsIDEpOworCQlpZiAocmVzdWx0ID09IDApCisJCQlyZXN1bHQgPSByZXN1bHQyOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qIENsb3NlIHRoZSBkZXZpY2UgYW5kIHJlbGVhc2UgaXQuIEJLTCBpcyBub3QgbmVlZGVkOiB0aGlzIGlzIHRoZSBvbmx5IHRocmVhZAorICAgYWNjZXNzaW5nIHRoaXMgdGFwZS4gKi8KK3N0YXRpYyBpbnQgc3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3Qgc2NzaV90YXBlICpTVHAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoU1RwLT5kb29yX2xvY2tlZCA9PSBTVF9MT0NLRURfQVVUTykKKwkJZG9fZG9vcl9sb2NrKFNUcCwgMCk7CisKKwlub3JtYWxpemVfYnVmZmVyKFNUcC0+YnVmZmVyKTsKKwl3cml0ZV9sb2NrKCZzdF9kZXZfYXJyX2xvY2spOworCVNUcC0+aW5fdXNlID0gMDsKKwl3cml0ZV91bmxvY2soJnN0X2Rldl9hcnJfbG9jayk7CisJc2NzaV9kZXZpY2VfcHV0KFNUcC0+ZGV2aWNlKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisMCisvKiBUaGUgY2hlY2tzIGNvbW1vbiB0byBib3RoIHJlYWRpbmcgYW5kIHdyaXRpbmcgKi8KK3N0YXRpYyBzc2l6ZV90IHJ3X2NoZWNrcyhzdHJ1Y3Qgc2NzaV90YXBlICpTVHAsIHN0cnVjdCBmaWxlICpmaWxwLCBzaXplX3QgY291bnQpCit7CisJc3NpemVfdCByZXR2YWwgPSAwOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBlcnJvciByZWNvdmVyeSwgZG9uJ3QgbGV0IGFueW9uZQorCSAqIGVsc2UgdHJ5IGFuZCB1c2UgdGhpcyBkZXZpY2UuICBBbHNvLCBpZiBlcnJvciByZWNvdmVyeSBmYWlscywgaXQKKwkgKiBtYXkgdHJ5IGFuZCB0YWtlIHRoZSBkZXZpY2Ugb2ZmbGluZSwgaW4gd2hpY2ggY2FzZSBhbGwgZnVydGhlcgorCSAqIGFjY2VzcyB0byB0aGUgZGV2aWNlIGlzIHByb2hpYml0ZWQuCisJICovCisJaWYgKCFzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2luZ19lcnJvcnMoU1RwLT5kZXZpY2UpKSB7CisJCXJldHZhbCA9ICgtRU5YSU8pOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoU1RwLT5yZWFkeSAhPSBTVF9SRUFEWSkgeworCQlpZiAoU1RwLT5yZWFkeSA9PSBTVF9OT19UQVBFKQorCQkJcmV0dmFsID0gKC1FTk9NRURJVU0pOworCQllbHNlCisJCQlyZXR2YWwgPSAoLUVJTyk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghIFNUcC0+bW9kZXNbU1RwLT5jdXJyZW50X21vZGVdLmRlZmluZWQpIHsKKwkJcmV0dmFsID0gKC1FTlhJTyk7CisJCWdvdG8gb3V0OworCX0KKworCisJLyoKKwkgKiBJZiB0aGVyZSB3YXMgYSBidXMgcmVzZXQsIGJsb2NrIGZ1cnRoZXIgYWNjZXNzCisJICogdG8gdGhpcyBkZXZpY2UuCisJICovCisJaWYgKFNUcC0+cG9zX3Vua25vd24pIHsKKwkJcmV0dmFsID0gKC1FSU8pOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoY291bnQgPT0gMCkKKwkJZ290byBvdXQ7CisKKyAgICAgICAgREVCKAorCWlmICghU1RwLT5pbl91c2UpIHsKKwkJcHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBJbmNvcnJlY3QgZGV2aWNlLlxuIiwgdGFwZV9uYW1lKFNUcCkpOworCQlyZXR2YWwgPSAoLUVJTyk7CisJCWdvdG8gb3V0OworCX0gKSAvKiBlbmQgREVCICovCisKKwlpZiAoU1RwLT5jYW5fcGFydGl0aW9ucyAmJgorCSAgICAocmV0dmFsID0gc3dpdGNoX3BhcnRpdGlvbihTVHApKSA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKFNUcC0+YmxvY2tfc2l6ZSA9PSAwICYmIFNUcC0+bWF4X2Jsb2NrID4gMCAmJgorCSAgICAoY291bnQgPCBTVHAtPm1pbl9ibG9jayB8fCBjb3VudCA+IFNUcC0+bWF4X2Jsb2NrKSkgeworCQlyZXR2YWwgPSAoLUVJTlZBTCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChTVHAtPmRvX2F1dG9fbG9jayAmJiBTVHAtPmRvb3JfbG9ja2VkID09IFNUX1VOTE9DS0VEICYmCisJICAgICFkb19kb29yX2xvY2soU1RwLCAxKSkKKwkJU1RwLT5kb29yX2xvY2tlZCA9IFNUX0xPQ0tFRF9BVVRPOworCisgb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKworc3RhdGljIGludCBzZXR1cF9idWZmZXJpbmcoc3RydWN0IHNjc2lfdGFwZSAqU1RwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgc2l6ZV90IGNvdW50LCBpbnQgaXNfcmVhZCkKK3sKKwlpbnQgaSwgYnVmc2l6ZSwgcmV0dmFsID0gMDsKKwlzdHJ1Y3Qgc3RfYnVmZmVyICpTVGJwID0gU1RwLT5idWZmZXI7CisKKwlpZiAoaXNfcmVhZCkKKwkJaSA9IFNUcC0+dHJ5X2RpbyAmJiB0cnlfcmRpbzsKKwllbHNlCisJCWkgPSBTVHAtPnRyeV9kaW8gJiYgdHJ5X3dkaW87CisJaWYgKGkgJiYgKCh1bnNpZ25lZCBsb25nKWJ1ZiAmIHF1ZXVlX2RtYV9hbGlnbm1lbnQoCisJCQkJCVNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlKSkgPT0gMCkgeworCQlpID0gc3RfbWFwX3VzZXJfcGFnZXMoJihTVGJwLT5zZ1swXSksIFNUYnAtPnVzZV9zZywKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZylidWYsIGNvdW50LCAoaXNfcmVhZCA/IFJFQUQgOiBXUklURSksCisJCQkJICAgICAgU1RwLT5tYXhfcGZuKTsKKwkJaWYgKGkgPiAwKSB7CisJCQlTVGJwLT5kb19kaW8gPSBpOworCQkJU1RicC0+YnVmZmVyX2J5dGVzID0gMDsgICAvKiBjYW4gYmUgdXNlZCBhcyB0cmFuc2ZlciBjb3VudGVyICovCisJCX0KKwkJZWxzZQorCQkJU1RicC0+ZG9fZGlvID0gMDsgIC8qIGZhbGwgYmFjayB0byBidWZmZXJpbmcgd2l0aCBhbnkgZXJyb3IgKi8KKwkJU1RicC0+c2dfc2VncyA9IFNUYnAtPmRvX2RpbzsKKwkJU1RicC0+ZnJwX3NnX2N1cnJlbnQgPSAwOworCQlERUIoCisJCSAgICAgaWYgKFNUYnAtPmRvX2RpbykgeworCQkJU1RwLT5uYnJfZGlvKys7CisJCQlTVHAtPm5icl9wYWdlcyArPSBTVGJwLT5kb19kaW87CisJCQlmb3IgKGk9MTsgaSA8IFNUYnAtPmRvX2RpbzsgaSsrKQorCQkJCWlmIChwYWdlX3RvX3BmbihTVGJwLT5zZ1tpXS5wYWdlKSA9PSBwYWdlX3RvX3BmbihTVGJwLT5zZ1tpLTFdLnBhZ2UpICsgMSkKKwkJCQkJU1RwLT5uYnJfY29tYmluYWJsZSsrOworCQkgICAgIH0KKwkJKQorCX0gZWxzZQorCQlTVGJwLT5kb19kaW8gPSAwOworCURFQiggU1RwLT5uYnJfcmVxdWVzdHMrKzsgKQorCisJaWYgKCFTVGJwLT5kb19kaW8pIHsKKwkJaWYgKFNUcC0+YmxvY2tfc2l6ZSkKKwkJCWJ1ZnNpemUgPSBTVHAtPmJsb2NrX3NpemUgPiBzdF9maXhlZF9idWZmZXJfc2l6ZSA/CisJCQkJU1RwLT5ibG9ja19zaXplIDogc3RfZml4ZWRfYnVmZmVyX3NpemU7CisJCWVsc2UKKwkJCWJ1ZnNpemUgPSBjb3VudDsKKwkJaWYgKGJ1ZnNpemUgPiBTVGJwLT5idWZmZXJfc2l6ZSAmJgorCQkgICAgIWVubGFyZ2VfYnVmZmVyKFNUYnAsIGJ1ZnNpemUsIFNUcC0+cmVzdHJfZG1hKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENhbid0IGFsbG9jYXRlICVkIGJ5dGUgdGFwZSBidWZmZXIuXG4iLAorCQkJICAgICAgIHRhcGVfbmFtZShTVHApLCBidWZzaXplKTsKKwkJCXJldHZhbCA9ICgtRU9WRVJGTE9XKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChTVHAtPmJsb2NrX3NpemUpCisJCQlTVGJwLT5idWZmZXJfYmxvY2tzID0gYnVmc2l6ZSAvIFNUcC0+YmxvY2tfc2l6ZTsKKwl9CisKKyBvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworCisvKiBDYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGFmdGVyIGVhY2ggc2V0dXBfYnVmZmVyKCkgKi8KK3N0YXRpYyB2b2lkIHJlbGVhc2VfYnVmZmVyaW5nKHN0cnVjdCBzY3NpX3RhcGUgKlNUcCkKK3sKKwlzdHJ1Y3Qgc3RfYnVmZmVyICpTVGJwOworCisJU1RicCA9IFNUcC0+YnVmZmVyOworCWlmIChTVGJwLT5kb19kaW8pIHsKKwkJc2dsX3VubWFwX3VzZXJfcGFnZXMoJihTVGJwLT5zZ1swXSksIFNUYnAtPmRvX2RpbywgMCk7CisJCVNUYnAtPmRvX2RpbyA9IDA7CisJfQorfQorCisKKy8qIFdyaXRlIGNvbW1hbmQgKi8KK3N0YXRpYyBzc2l6ZV90CitzdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCXNzaXplX3QgdG90YWw7CisJc3NpemVfdCBpLCBkb19jb3VudCwgYmxrcywgdHJhbnNmZXI7CisJc3NpemVfdCByZXR2YWw7CisJaW50IHVuZG9uZSwgcmV0cnlfZW90ID0gMCwgc2NvZGU7CisJaW50IGFzeW5jX3dyaXRlOworCXVuc2lnbmVkIGNoYXIgY21kW01BWF9DT01NQU5EX1NJWkVdOworCWNvbnN0IGNoYXIgX191c2VyICpiX3BvaW50OworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50ID0gTlVMTDsKKwlzdHJ1Y3Qgc2NzaV90YXBlICpTVHAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHN0X21vZGVkZWYgKlNUbTsKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgKlNUcHM7CisJc3RydWN0IHN0X2J1ZmZlciAqU1RicDsKKwljaGFyICpuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZTVHAtPmxvY2spKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJcmV0dmFsID0gcndfY2hlY2tzKFNUcCwgZmlscCwgY291bnQpOworCWlmIChyZXR2YWwgfHwgY291bnQgPT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKiBXcml0ZSBtdXN0IGJlIGludGVncmFsIG51bWJlciBvZiBibG9ja3MgKi8KKwlpZiAoU1RwLT5ibG9ja19zaXplICE9IDAgJiYgKGNvdW50ICUgU1RwLT5ibG9ja19zaXplKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBXcml0ZSBub3QgbXVsdGlwbGUgb2YgdGFwZSBibG9jayBzaXplLlxuIiwKKwkJICAgICAgIG5hbWUpOworCQlyZXR2YWwgPSAoLUVJTlZBTCk7CisJCWdvdG8gb3V0OworCX0KKworCVNUbSA9ICYoU1RwLT5tb2Rlc1tTVHAtPmN1cnJlbnRfbW9kZV0pOworCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKKworCWlmIChTVHAtPndyaXRlX3Byb3QpIHsKKwkJcmV0dmFsID0gKC1FQUNDRVMpOworCQlnb3RvIG91dDsKKwl9CisKKworCWlmIChTVHBzLT5ydyA9PSBTVF9SRUFESU5HKSB7CisJCXJldHZhbCA9IGZsdXNoX2J1ZmZlcihTVHAsIDApOworCQlpZiAocmV0dmFsKQorCQkJZ290byBvdXQ7CisJCVNUcHMtPnJ3ID0gU1RfV1JJVElORzsKKwl9IGVsc2UgaWYgKFNUcHMtPnJ3ICE9IFNUX1dSSVRJTkcgJiYKKwkJICAgU1Rwcy0+ZHJ2X2ZpbGUgPT0gMCAmJiBTVHBzLT5kcnZfYmxvY2sgPT0gMCkgeworCQlpZiAoKHJldHZhbCA9IHNldF9tb2RlX2RlbnNibGsoU1RwLCBTVG0pKSA8IDApCisJCQlnb3RvIG91dDsKKwkJaWYgKFNUbS0+ZGVmYXVsdF9jb21wcmVzc2lvbiAhPSBTVF9ET05UX1RPVUNIICYmCisJCSAgICAhKFNUcC0+Y29tcHJlc3Npb25fY2hhbmdlZCkpIHsKKwkJCWlmIChzdF9jb21wcmVzc2lvbihTVHAsIChTVG0tPmRlZmF1bHRfY29tcHJlc3Npb24gPT0gU1RfWUVTKSkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FuJ3Qgc2V0IGRlZmF1bHQgY29tcHJlc3Npb24uXG4iLAorCQkJCSAgICAgICBuYW1lKTsKKwkJCQlpZiAobW9kZXNfZGVmaW5lZCkgeworCQkJCQlyZXR2YWwgPSAoLUVJTlZBTCk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCVNUYnAgPSBTVHAtPmJ1ZmZlcjsKKwlpID0gd3JpdGVfYmVoaW5kX2NoZWNrKFNUcCk7CisJaWYgKGkpIHsKKwkJaWYgKGkgPT0gLUVOT1NQQykKKwkJCVNUcHMtPmVvZiA9IFNUX0VPTV9PSzsKKwkJZWxzZQorCQkJU1Rwcy0+ZW9mID0gU1RfRU9NX0VSUk9SOworCX0KKworCWlmIChTVHBzLT5lb2YgPT0gU1RfRU9NX09LKSB7CisJCVNUcHMtPmVvZiA9IFNUX0VPRF8xOyAgLyogYWxsb3cgbmV4dCB3cml0ZSAqLworCQlyZXR2YWwgPSAoLUVOT1NQQyk7CisJCWdvdG8gb3V0OworCX0KKwllbHNlIGlmIChTVHBzLT5lb2YgPT0gU1RfRU9NX0VSUk9SKSB7CisJCXJldHZhbCA9ICgtRUlPKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ2hlY2sgdGhlIGJ1ZmZlciByZWFkYWJpbGl0eSBpbiBjYXNlcyB3aGVyZSBjb3B5X3VzZXIgbWlnaHQgY2F0Y2gKKwkgICB0aGUgcHJvYmxlbXMgYWZ0ZXIgc29tZSB0YXBlIG1vdmVtZW50LiAqLworCWlmIChTVHAtPmJsb2NrX3NpemUgIT0gMCAmJgorCSAgICAhU1RicC0+ZG9fZGlvICYmCisJICAgIChjb3B5X2Zyb21fdXNlcigmaSwgYnVmLCAxKSAhPSAwIHx8CisJICAgICBjb3B5X2Zyb21fdXNlcigmaSwgYnVmICsgY291bnQgLSAxLCAxKSAhPSAwKSkgeworCQlyZXR2YWwgPSAoLUVGQVVMVCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldHZhbCA9IHNldHVwX2J1ZmZlcmluZyhTVHAsIGJ1ZiwgY291bnQsIDApOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCisJdG90YWwgPSBjb3VudDsKKworCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCWNtZFswXSA9IFdSSVRFXzY7CisJY21kWzFdID0gKFNUcC0+YmxvY2tfc2l6ZSAhPSAwKTsKKworCVNUcHMtPnJ3ID0gU1RfV1JJVElORzsKKworCWJfcG9pbnQgPSBidWY7CisJd2hpbGUgKGNvdW50ID4gMCAmJiAhcmV0cnlfZW90KSB7CisKKwkJaWYgKFNUYnAtPmRvX2RpbykgeworCQkJZG9fY291bnQgPSBjb3VudDsKKwkJfQorCQllbHNlIHsKKwkJCWlmIChTVHAtPmJsb2NrX3NpemUgPT0gMCkKKwkJCQlkb19jb3VudCA9IGNvdW50OworCQkJZWxzZSB7CisJCQkJZG9fY291bnQgPSBTVGJwLT5idWZmZXJfYmxvY2tzICogU1RwLT5ibG9ja19zaXplIC0KKwkJCQkJU1RicC0+YnVmZmVyX2J5dGVzOworCQkJCWlmIChkb19jb3VudCA+IGNvdW50KQorCQkJCQlkb19jb3VudCA9IGNvdW50OworCQkJfQorCisJCQlpID0gYXBwZW5kX3RvX2J1ZmZlcihiX3BvaW50LCBTVGJwLCBkb19jb3VudCk7CisJCQlpZiAoaSkgeworCQkJCXJldHZhbCA9IGk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJY291bnQgLT0gZG9fY291bnQ7CisJCWJfcG9pbnQgKz0gZG9fY291bnQ7CisKKwkJYXN5bmNfd3JpdGUgPSBTVHAtPmJsb2NrX3NpemUgPT0gMCAmJiAhU1RicC0+ZG9fZGlvICYmCisJCQlTVG0tPmRvX2FzeW5jX3dyaXRlcyAmJiBTVHBzLT5lb2YgPCBTVF9FT01fT0s7CisKKwkJaWYgKFNUcC0+YmxvY2tfc2l6ZSAhPSAwICYmIFNUbS0+ZG9fYnVmZmVyX3dyaXRlcyAmJgorCQkgICAgIShTVHAtPnRyeV9kaW8gJiYgdHJ5X3dkaW8pICYmIFNUcHMtPmVvZiA8IFNUX0VPTV9PSyAmJgorCQkgICAgU1RicC0+YnVmZmVyX2J5dGVzIDwgU1RicC0+YnVmZmVyX3NpemUpIHsKKwkJCVNUcC0+ZGlydHkgPSAxOworCQkJLyogRG9uJ3Qgd3JpdGUgYSBidWZmZXIgdGhhdCBpcyBub3QgZnVsbCBlbm91Z2guICovCisJCQlpZiAoIWFzeW5jX3dyaXRlICYmIGNvdW50ID09IDApCisJCQkJYnJlYWs7CisJCX0KKworCXJldHJ5X3dyaXRlOgorCQlpZiAoU1RwLT5ibG9ja19zaXplID09IDApCisJCQlibGtzID0gdHJhbnNmZXIgPSBkb19jb3VudDsKKwkJZWxzZSB7CisJCQlpZiAoIVNUYnAtPmRvX2RpbykKKwkJCQlibGtzID0gU1RicC0+YnVmZmVyX2J5dGVzOworCQkJZWxzZQorCQkJCWJsa3MgPSBkb19jb3VudDsKKwkJCWJsa3MgLz0gU1RwLT5ibG9ja19zaXplOworCQkJdHJhbnNmZXIgPSBibGtzICogU1RwLT5ibG9ja19zaXplOworCQl9CisJCWNtZFsyXSA9IGJsa3MgPj4gMTY7CisJCWNtZFszXSA9IGJsa3MgPj4gODsKKwkJY21kWzRdID0gYmxrczsKKworCQlTUnBudCA9IHN0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCB0cmFuc2ZlciwgRE1BX1RPX0RFVklDRSwKKwkJCQkgICBTVHAtPmRldmljZS0+dGltZW91dCwgTUFYX1dSSVRFX1JFVFJJRVMsICFhc3luY193cml0ZSk7CisJCWlmICghU1JwbnQpIHsKKwkJCXJldHZhbCA9IFNUYnAtPnN5c2NhbGxfcmVzdWx0OworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGFzeW5jX3dyaXRlKSB7CisJCQlTVGJwLT53cml0aW5nID0gdHJhbnNmZXI7CisJCQlTVHAtPmRpcnR5ID0gIShTVGJwLT53cml0aW5nID09CisJCQkJICAgICAgIFNUYnAtPmJ1ZmZlcl9ieXRlcyk7CisJCQlTUnBudCA9IE5VTEw7ICAvKiBQcmV2ZW50IHJlbGVhc2luZyB0aGlzIHJlcXVlc3QhICovCisJCQlERUIoIFNUcC0+d3JpdGVfcGVuZGluZyA9IDE7ICkKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKFNUYnAtPnN5c2NhbGxfcmVzdWx0ICE9IDApIHsKKwkJCXN0cnVjdCBzdF9jbWRzdGF0dXMgKmNtZHN0YXRwID0gJlNUcC0+YnVmZmVyLT5jbWRzdGF0OworCisgICAgICAgICAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogRXJyb3Igb24gd3JpdGU6XG4iLCBuYW1lKSk7CisJCQlpZiAoY21kc3RhdHAtPmhhdmVfc2Vuc2UgJiYgKGNtZHN0YXRwLT5mbGFncyAmIFNFTlNFX0VPTSkpIHsKKwkJCQlzY29kZSA9IGNtZHN0YXRwLT5zZW5zZV9oZHIuc2Vuc2Vfa2V5OworCQkJCWlmIChjbWRzdGF0cC0+cmVtYWluZGVyX3ZhbGlkKQorCQkJCQl1bmRvbmUgPSAoaW50KWNtZHN0YXRwLT51cmVtYWluZGVyNjQ7CisJCQkJZWxzZSBpZiAoU1RwLT5ibG9ja19zaXplID09IDAgJiYKKwkJCQkJIHNjb2RlID09IFZPTFVNRV9PVkVSRkxPVykKKwkJCQkJdW5kb25lID0gdHJhbnNmZXI7CisJCQkJZWxzZQorCQkJCQl1bmRvbmUgPSAwOworCQkJCWlmIChTVHAtPmJsb2NrX3NpemUgIT0gMCkKKwkJCQkJdW5kb25lICo9IFNUcC0+YmxvY2tfc2l6ZTsKKwkJCQlpZiAodW5kb25lIDw9IGRvX2NvdW50KSB7CisJCQkJCS8qIE9ubHkgZGF0YSBmcm9tIHRoaXMgd3JpdGUgaXMgbm90IHdyaXR0ZW4gKi8KKwkJCQkJY291bnQgKz0gdW5kb25lOworCQkJCQlkb19jb3VudCAtPSB1bmRvbmU7CisJCQkJCWlmIChTVHAtPmJsb2NrX3NpemUpCisJCQkJCQlibGtzID0gKHRyYW5zZmVyIC0gdW5kb25lKSAvIFNUcC0+YmxvY2tfc2l6ZTsKKwkJCQkJU1Rwcy0+ZW9mID0gU1RfRU9NX09LOworCQkJCQkvKiBDb250aW51ZSBpbiBmaXhlZCBibG9jayBtb2RlIGlmIGFsbCB3cml0dGVuCisJCQkJCSAgIGluIHRoaXMgcmVxdWVzdCBidXQgc3RpbGwgc29tZXRoaW5nIGxlZnQgdG8gd3JpdGUKKwkJCQkJICAgKHJldHZhbCBsZWZ0IHRvIHplcm8pCisJCQkJCSovCisJCQkJCWlmIChTVHAtPmJsb2NrX3NpemUgPT0gMCB8fAorCQkJCQkgICAgdW5kb25lID4gMCB8fCBjb3VudCA9PSAwKQorCQkJCQkJcmV0dmFsID0gKC1FTk9TUEMpOyAvKiBFT00gd2l0aGluIGN1cnJlbnQgcmVxdWVzdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEVPTSB3aXRoICVkIGJ5dGVzIHVud3JpdHRlbi5cbiIsCisJCQkJCQkgICAgICAgbmFtZSwgKGludCljb3VudCkpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIEVPVCB3aXRoaW4gZGF0YSBidWZmZXJlZCBlYXJsaWVyIChwb3NzaWJsZSBvbmx5CisJCQkJCSAgIGluIGZpeGVkIGJsb2NrIG1vZGUgd2l0aG91dCBkaXJlY3QgaS9vKSAqLworCQkJCQlpZiAoIXJldHJ5X2VvdCAmJiAhY21kc3RhdHAtPmRlZmVycmVkICYmCisJCQkJCSAgICAoc2NvZGUgPT0gTk9fU0VOU0UgfHwgc2NvZGUgPT0gUkVDT1ZFUkVEX0VSUk9SKSkgeworCQkJCQkJbW92ZV9idWZmZXJfZGF0YShTVHAtPmJ1ZmZlciwgdHJhbnNmZXIgLSB1bmRvbmUpOworCQkJCQkJcmV0cnlfZW90ID0gMTsKKwkJCQkJCWlmIChTVHBzLT5kcnZfYmxvY2sgPj0gMCkgeworCQkJCQkJCVNUcHMtPmRydl9ibG9jayArPSAodHJhbnNmZXIgLSB1bmRvbmUpIC8KKwkJCQkJCQkJU1RwLT5ibG9ja19zaXplOworCQkJCQkJfQorCQkJCQkJU1Rwcy0+ZW9mID0gU1RfRU9NX09LOworCQkJCQkJREVCQyhwcmludGsoU1RfREVCX01TRworCQkJCQkJCSAgICAiJXM6IFJldHJ5IHdyaXRlIG9mICVkIGJ5dGVzIGF0IEVPTS5cbiIsCisJCQkJCQkJICAgIG5hbWUsIFNUcC0+YnVmZmVyLT5idWZmZXJfYnl0ZXMpKTsKKwkJCQkJCWdvdG8gcmV0cnlfd3JpdGU7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvKiBFaXRoZXIgZXJyb3Igd2l0aGluIGRhdGEgYnVmZmVyZWQgYnkgZHJpdmVyIG9yCisJCQkJCQkgICBmYWlsZWQgcmV0cnkgKi8KKwkJCQkJCWNvdW50IC09IGRvX2NvdW50OworCQkJCQkJYmxrcyA9IGRvX2NvdW50ID0gMDsKKwkJCQkJCVNUcHMtPmVvZiA9IFNUX0VPTV9FUlJPUjsKKwkJCQkJCVNUcHMtPmRydl9ibG9jayA9ICgtMSk7IC8qIFRvbyBjYXV0aW91cz8gKi8KKwkJCQkJCXJldHZhbCA9ICgtRUlPKTsJLyogRU9NIGZvciBvbGQgZGF0YSAqLworCQkJCQkJREVCQyhwcmludGsoU1RfREVCX01TRworCQkJCQkJCSAgICAiJXM6IEVPTSB3aXRoIGxvc3QgZGF0YS5cbiIsCisJCQkJCQkJICAgIG5hbWUpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY291bnQgKz0gZG9fY291bnQ7CisJCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gKC0xKTsJCS8qIFRvbyBjYXV0aW91cz8gKi8KKwkJCQlyZXR2YWwgPSAoLUVJTyk7CisJCQl9CisKKwkJfQorCisJCWlmIChTVHBzLT5kcnZfYmxvY2sgPj0gMCkgeworCQkJaWYgKFNUcC0+YmxvY2tfc2l6ZSA9PSAwKQorCQkJCVNUcHMtPmRydl9ibG9jayArPSAoZG9fY291bnQgPiAwKTsKKwkJCWVsc2UKKwkJCQlTVHBzLT5kcnZfYmxvY2sgKz0gYmxrczsKKwkJfQorCisJCVNUYnAtPmJ1ZmZlcl9ieXRlcyA9IDA7CisJCVNUcC0+ZGlydHkgPSAwOworCisJCWlmIChyZXR2YWwgfHwgcmV0cnlfZW90KSB7CisJCQlpZiAoY291bnQgPCB0b3RhbCkKKwkJCQlyZXR2YWwgPSB0b3RhbCAtIGNvdW50OworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoU1Rwcy0+ZW9mID09IFNUX0VPRF8xKQorCQlTVHBzLT5lb2YgPSBTVF9FT01fT0s7CisJZWxzZSBpZiAoU1Rwcy0+ZW9mICE9IFNUX0VPTV9PSykKKwkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisJcmV0dmFsID0gdG90YWwgLSBjb3VudDsKKworIG91dDoKKwlpZiAoU1JwbnQgIT0gTlVMTCkKKwkJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCXJlbGVhc2VfYnVmZmVyaW5nKFNUcCk7CisJdXAoJlNUcC0+bG9jayk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorDAorLyogUmVhZCBkYXRhIGZyb20gdGhlIHRhcGUuIFJldHVybnMgemVybyBpbiB0aGUgbm9ybWFsIGNhc2UsIG9uZSBpZiB0aGUKKyAgIGVvZiBzdGF0dXMgaGFzIGNoYW5nZWQsIGFuZCB0aGUgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGEKKyAgIGZhdGFsIGVycm9yLiBPdGhlcndpc2UgdXBkYXRlcyB0aGUgYnVmZmVyIGFuZCB0aGUgZW9mIHN0YXRlLgorCisgICBEb2VzIHJlbGVhc2UgdXNlciBidWZmZXIgbWFwcGluZyBpZiBpdCBpcyBzZXQuCisqLworc3RhdGljIGxvbmcgcmVhZF90YXBlKHN0cnVjdCBzY3NpX3RhcGUgKlNUcCwgbG9uZyBjb3VudCwKKwkJICAgICAgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQpCit7CisJaW50IHRyYW5zZmVyLCBibGtzLCBieXRlczsKKwl1bnNpZ25lZCBjaGFyIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudDsKKwlzdHJ1Y3Qgc3RfbW9kZWRlZiAqU1RtOworCXN0cnVjdCBzdF9wYXJ0c3RhdCAqU1RwczsKKwlzdHJ1Y3Qgc3RfYnVmZmVyICpTVGJwOworCWludCByZXR2YWwgPSAwOworCWNoYXIgKm5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCVNUbSA9ICYoU1RwLT5tb2Rlc1tTVHAtPmN1cnJlbnRfbW9kZV0pOworCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKKwlpZiAoU1Rwcy0+ZW9mID09IFNUX0ZNX0hJVCkKKwkJcmV0dXJuIDE7CisJU1RicCA9IFNUcC0+YnVmZmVyOworCisJaWYgKFNUcC0+YmxvY2tfc2l6ZSA9PSAwKQorCQlibGtzID0gYnl0ZXMgPSBjb3VudDsKKwllbHNlIHsKKwkJaWYgKCEoU1RwLT50cnlfZGlvICYmIHRyeV9yZGlvKSAmJiBTVG0tPmRvX3JlYWRfYWhlYWQpIHsKKwkJCWJsa3MgPSAoU1RwLT5idWZmZXIpLT5idWZmZXJfYmxvY2tzOworCQkJYnl0ZXMgPSBibGtzICogU1RwLT5ibG9ja19zaXplOworCQl9IGVsc2UgeworCQkJYnl0ZXMgPSBjb3VudDsKKwkJCWlmICghU1RicC0+ZG9fZGlvICYmIGJ5dGVzID4gKFNUcC0+YnVmZmVyKS0+YnVmZmVyX3NpemUpCisJCQkJYnl0ZXMgPSAoU1RwLT5idWZmZXIpLT5idWZmZXJfc2l6ZTsKKwkJCWJsa3MgPSBieXRlcyAvIFNUcC0+YmxvY2tfc2l6ZTsKKwkJCWJ5dGVzID0gYmxrcyAqIFNUcC0+YmxvY2tfc2l6ZTsKKwkJfQorCX0KKworCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCWNtZFswXSA9IFJFQURfNjsKKwljbWRbMV0gPSAoU1RwLT5ibG9ja19zaXplICE9IDApOworCWNtZFsyXSA9IGJsa3MgPj4gMTY7CisJY21kWzNdID0gYmxrcyA+PiA4OworCWNtZFs0XSA9IGJsa3M7CisKKwlTUnBudCA9ICphU1JwbnQ7CisJU1JwbnQgPSBzdF9kb19zY3NpKFNScG50LCBTVHAsIGNtZCwgYnl0ZXMsIERNQV9GUk9NX0RFVklDRSwKKwkJCSAgIFNUcC0+ZGV2aWNlLT50aW1lb3V0LCBNQVhfUkVUUklFUywgMSk7CisJcmVsZWFzZV9idWZmZXJpbmcoU1RwKTsKKwkqYVNScG50ID0gU1JwbnQ7CisJaWYgKCFTUnBudCkKKwkJcmV0dXJuIFNUYnAtPnN5c2NhbGxfcmVzdWx0OworCisJU1RicC0+cmVhZF9wb2ludGVyID0gMDsKKwlTVHBzLT5hdF9zbSA9IDA7CisKKwkvKiBTb21ldGhpbmcgdG8gY2hlY2sgKi8KKwlpZiAoU1RicC0+c3lzY2FsbF9yZXN1bHQpIHsKKwkJc3RydWN0IHN0X2NtZHN0YXR1cyAqY21kc3RhdHAgPSAmU1RwLT5idWZmZXItPmNtZHN0YXQ7CisKKwkJcmV0dmFsID0gMTsKKwkJREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IFNlbnNlOiAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclswXSwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdLCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNScG50LT5zcl9zZW5zZV9idWZmZXJbNF0sIFNScG50LT5zcl9zZW5zZV9idWZmZXJbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlcls2XSwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlcls3XSkpOworCQlpZiAoY21kc3RhdHAtPmhhdmVfc2Vuc2UpIHsKKworCQkJaWYgKGNtZHN0YXRwLT5zZW5zZV9oZHIuc2Vuc2Vfa2V5ID09IEJMQU5LX0NIRUNLKQorCQkJCWNtZHN0YXRwLT5mbGFncyAmPSAweGNmOwkvKiBObyBuZWVkIGZvciBFT00gaW4gdGhpcyBjYXNlICovCisKKwkJCWlmIChjbWRzdGF0cC0+ZmxhZ3MgIT0gMCkgeyAvKiBFT0YsIEVPTSwgb3IgSUxJICovCisJCQkJLyogQ29tcHV0ZSB0aGUgcmVzaWR1YWwgY291bnQgKi8KKwkJCQlpZiAoY21kc3RhdHAtPnJlbWFpbmRlcl92YWxpZCkKKwkJCQkJdHJhbnNmZXIgPSAoaW50KWNtZHN0YXRwLT51cmVtYWluZGVyNjQ7CisJCQkJZWxzZQorCQkJCQl0cmFuc2ZlciA9IDA7CisJCQkJaWYgKFNUcC0+YmxvY2tfc2l6ZSA9PSAwICYmCisJCQkJICAgIGNtZHN0YXRwLT5zZW5zZV9oZHIuc2Vuc2Vfa2V5ID09IE1FRElVTV9FUlJPUikKKwkJCQkJdHJhbnNmZXIgPSBieXRlczsKKworCQkJCWlmIChjbWRzdGF0cC0+ZmxhZ3MgJiBTRU5TRV9JTEkpIHsJLyogSUxJICovCisJCQkJCWlmIChTVHAtPmJsb2NrX3NpemUgPT0gMCkgeworCQkJCQkJaWYgKHRyYW5zZmVyIDw9IDApIHsKKwkJCQkJCQlpZiAodHJhbnNmZXIgPCAwKQorCQkJCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCQkJCQkJICAgICAgICIlczogRmFpbGVkIHRvIHJlYWQgJWQgYnl0ZSBibG9jayB3aXRoICVkIGJ5dGUgdHJhbnNmZXIuXG4iLAorCQkJCQkJCQkgICAgICAgbmFtZSwgYnl0ZXMgLSB0cmFuc2ZlciwgYnl0ZXMpOworCQkJCQkJCWlmIChTVHBzLT5kcnZfYmxvY2sgPj0gMCkKKwkJCQkJCQkJU1Rwcy0+ZHJ2X2Jsb2NrICs9IDE7CisJCQkJCQkJU1RicC0+YnVmZmVyX2J5dGVzID0gMDsKKwkJCQkJCQlyZXR1cm4gKC1FTk9NRU0pOworCQkJCQkJfQorCQkJCQkJU1RicC0+YnVmZmVyX2J5dGVzID0gYnl0ZXMgLSB0cmFuc2ZlcjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwkJCQkJCVNScG50ID0gKmFTUnBudCA9IE5VTEw7CisJCQkJCQlpZiAodHJhbnNmZXIgPT0gYmxrcykgewkvKiBXZSBkaWQgbm90IGdldCBhbnl0aGluZywgZXJyb3IgKi8KKwkJCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBJbmNvcnJlY3QgYmxvY2sgc2l6ZS5cbiIsIG5hbWUpOworCQkJCQkJCWlmIChTVHBzLT5kcnZfYmxvY2sgPj0gMCkKKwkJCQkJCQkJU1Rwcy0+ZHJ2X2Jsb2NrICs9IGJsa3MgLSB0cmFuc2ZlciArIDE7CisJCQkJCQkJc3RfaW50X2lvY3RsKFNUcCwgTVRCU1IsIDEpOworCQkJCQkJCXJldHVybiAoLUVJTyk7CisJCQkJCQl9CisJCQkJCQkvKiBXZSBoYXZlIHNvbWUgZGF0YSwgZGVsaXZlciBpdCAqLworCQkJCQkJU1RicC0+YnVmZmVyX2J5dGVzID0gKGJsa3MgLSB0cmFuc2ZlcikgKgorCQkJCQkJICAgIFNUcC0+YmxvY2tfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogSUxJIGJ1dCBlbm91Z2ggZGF0YSByZWNlaXZlZCAlbGQgJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgY291bnQsIFNUYnAtPmJ1ZmZlcl9ieXRlcykpOworCQkJCQkJaWYgKFNUcHMtPmRydl9ibG9jayA+PSAwKQorCQkJCQkJCVNUcHMtPmRydl9ibG9jayArPSAxOworCQkJCQkJaWYgKHN0X2ludF9pb2N0bChTVHAsIE1UQlNSLCAxKSkKKwkJCQkJCQlyZXR1cm4gKC1FSU8pOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChjbWRzdGF0cC0+ZmxhZ3MgJiBTRU5TRV9GTUspIHsJLyogRk0gb3ZlcnJpZGVzIEVPTSAqLworCQkJCQlpZiAoU1Rwcy0+ZW9mICE9IFNUX0ZNX0hJVCkKKwkJCQkJCVNUcHMtPmVvZiA9IFNUX0ZNX0hJVDsKKwkJCQkJZWxzZQorCQkJCQkJU1Rwcy0+ZW9mID0gU1RfRU9EXzI7CisJCQkJCWlmIChTVHAtPmJsb2NrX3NpemUgPT0gMCkKKwkJCQkJCVNUYnAtPmJ1ZmZlcl9ieXRlcyA9IDA7CisJCQkJCWVsc2UKKwkJCQkJCVNUYnAtPmJ1ZmZlcl9ieXRlcyA9CisJCQkJCQkgICAgYnl0ZXMgLSB0cmFuc2ZlciAqIFNUcC0+YmxvY2tfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBFT0YgZGV0ZWN0ZWQgKCVkIGJ5dGVzIHJlYWQpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBTVGJwLT5idWZmZXJfYnl0ZXMpKTsKKwkJCQl9IGVsc2UgaWYgKGNtZHN0YXRwLT5mbGFncyAmIFNFTlNFX0VPTSkgeworCQkJCQlpZiAoU1Rwcy0+ZW9mID09IFNUX0ZNKQorCQkJCQkJU1Rwcy0+ZW9mID0gU1RfRU9EXzE7CisJCQkJCWVsc2UKKwkJCQkJCVNUcHMtPmVvZiA9IFNUX0VPTV9PSzsKKwkJCQkJaWYgKFNUcC0+YmxvY2tfc2l6ZSA9PSAwKQorCQkJCQkJU1RicC0+YnVmZmVyX2J5dGVzID0gYnl0ZXMgLSB0cmFuc2ZlcjsKKwkJCQkJZWxzZQorCQkJCQkJU1RicC0+YnVmZmVyX2J5dGVzID0KKwkJCQkJCSAgICBieXRlcyAtIHRyYW5zZmVyICogU1RwLT5ibG9ja19zaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IEVPTSBkZXRlY3RlZCAoJWQgYnl0ZXMgcmVhZCkuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIFNUYnAtPmJ1ZmZlcl9ieXRlcykpOworCQkJCX0KKwkJCX0KKwkJCS8qIGVuZCBvZiBFT0YsIEVPTSwgSUxJIHRlc3QgKi8gCisJCQllbHNlIHsJLyogbm9uemVybyBzZW5zZSBrZXkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFRhcGUgZXJyb3Igd2hpbGUgcmVhZGluZy5cbiIsIG5hbWUpKTsKKwkJCQlTVHBzLT5kcnZfYmxvY2sgPSAoLTEpOworCQkJCWlmIChTVHBzLT5lb2YgPT0gU1RfRk0gJiYKKwkJCQkgICAgY21kc3RhdHAtPnNlbnNlX2hkci5zZW5zZV9rZXkgPT0gQkxBTktfQ0hFQ0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBaZXJvIHJldHVybmVkIGZvciBmaXJzdCBCTEFOSyBDSEVDSyBhZnRlciBFT0YuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpKTsKKwkJCQkJU1Rwcy0+ZW9mID0gU1RfRU9EXzI7CS8qIEZpcnN0IEJMQU5LX0NIRUNLIGFmdGVyIEZNICovCisJCQkJfSBlbHNlCS8qIFNvbWUgb3RoZXIgZXh0ZW5kZWQgc2Vuc2UgY29kZSAqLworCQkJCQlyZXR2YWwgPSAoLUVJTyk7CisJCQl9CisKKwkJCWlmIChTVGJwLT5idWZmZXJfYnl0ZXMgPCAwKSAgLyogQ2F1c2VkIGJ5IGJvZ3VzIHNlbnNlIGRhdGEgKi8KKwkJCQlTVGJwLT5idWZmZXJfYnl0ZXMgPSAwOworCQl9CisJCS8qIEVuZCBvZiBleHRlbmRlZCBzZW5zZSB0ZXN0ICovIAorCQllbHNlIHsJCS8qIE5vbi1leHRlbmRlZCBzZW5zZSAqLworCQkJcmV0dmFsID0gU1RicC0+c3lzY2FsbF9yZXN1bHQ7CisJCX0KKworCX0KKwkvKiBFbmQgb2YgZXJyb3IgaGFuZGxpbmcgKi8gCisJZWxzZQkJCS8qIFJlYWQgc3VjY2Vzc2Z1bCAqLworCQlTVGJwLT5idWZmZXJfYnl0ZXMgPSBieXRlczsKKworCWlmIChTVHBzLT5kcnZfYmxvY2sgPj0gMCkgeworCQlpZiAoU1RwLT5ibG9ja19zaXplID09IDApCisJCQlTVHBzLT5kcnZfYmxvY2srKzsKKwkJZWxzZQorCQkJU1Rwcy0+ZHJ2X2Jsb2NrICs9IFNUYnAtPmJ1ZmZlcl9ieXRlcyAvIFNUcC0+YmxvY2tfc2l6ZTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKwwKKworLyogUmVhZCBjb21tYW5kICovCitzdGF0aWMgc3NpemVfdAorc3RfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCXNzaXplX3QgdG90YWw7CisJc3NpemVfdCByZXR2YWwgPSAwOworCXNzaXplX3QgaSwgdHJhbnNmZXI7CisJaW50IHNwZWNpYWwsIGRvX2RpbyA9IDA7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQgPSBOVUxMOworCXN0cnVjdCBzY3NpX3RhcGUgKlNUcCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc3RfbW9kZWRlZiAqU1RtOworCXN0cnVjdCBzdF9wYXJ0c3RhdCAqU1RwczsKKwlzdHJ1Y3Qgc3RfYnVmZmVyICpTVGJwID0gU1RwLT5idWZmZXI7CisJREVCKCBjaGFyICpuYW1lID0gdGFwZV9uYW1lKFNUcCk7ICkKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJlNUcC0+bG9jaykpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlyZXR2YWwgPSByd19jaGVja3MoU1RwLCBmaWxwLCBjb3VudCk7CisJaWYgKHJldHZhbCB8fCBjb3VudCA9PSAwKQorCQlnb3RvIG91dDsKKworCVNUbSA9ICYoU1RwLT5tb2Rlc1tTVHAtPmN1cnJlbnRfbW9kZV0pOworCWlmICghKFNUbS0+ZG9fcmVhZF9haGVhZCkgJiYgU1RwLT5ibG9ja19zaXplICE9IDAgJiYKKwkgICAgKGNvdW50ICUgU1RwLT5ibG9ja19zaXplKSAhPSAwKSB7CisJCXJldHZhbCA9ICgtRUlOVkFMKTsJLyogUmVhZCBtdXN0IGJlIGludGVncmFsIG51bWJlciBvZiBibG9ja3MgKi8KKwkJZ290byBvdXQ7CisJfQorCisJU1RwcyA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCWlmIChTVHBzLT5ydyA9PSBTVF9XUklUSU5HKSB7CisJCXJldHZhbCA9IGZsdXNoX2J1ZmZlcihTVHAsIDApOworCQlpZiAocmV0dmFsKQorCQkJZ290byBvdXQ7CisJCVNUcHMtPnJ3ID0gU1RfUkVBRElORzsKKwl9CisgICAgICAgIERFQigKKwlpZiAoZGVidWdnaW5nICYmIFNUcHMtPmVvZiAhPSBTVF9OT0VPRikKKwkJcHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBFT0YvRU9NIGZsYWcgdXAgKCVkKS4gQnl0ZXMgJWRcbiIsIG5hbWUsCisJCSAgICAgICBTVHBzLT5lb2YsIFNUYnAtPmJ1ZmZlcl9ieXRlcyk7CisgICAgICAgICkgLyogZW5kIERFQiAqLworCisJcmV0dmFsID0gc2V0dXBfYnVmZmVyaW5nKFNUcCwgYnVmLCBjb3VudCwgMSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CisJZG9fZGlvID0gU1RicC0+ZG9fZGlvOworCisJaWYgKFNUYnAtPmJ1ZmZlcl9ieXRlcyA9PSAwICYmCisJICAgIFNUcHMtPmVvZiA+PSBTVF9FT0RfMSkgeworCQlpZiAoU1Rwcy0+ZW9mIDwgU1RfRU9EKSB7CisJCQlTVHBzLT5lb2YgKz0gMTsKKwkJCXJldHZhbCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyZXR2YWwgPSAoLUVJTyk7CS8qIEVPTSBvciBCbGFuayBDaGVjayAqLworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZG9fZGlvKSB7CisJCS8qIENoZWNrIHRoZSBidWZmZXIgd3JpdGFiaWxpdHkgYmVmb3JlIGFueSB0YXBlIG1vdmVtZW50LiBEb24ndCBhbHRlcgorCQkgICBidWZmZXIgZGF0YS4gKi8KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZpLCBidWYsIDEpICE9IDAgfHwKKwkJICAgIGNvcHlfdG9fdXNlcihidWYsICZpLCAxKSAhPSAwIHx8CisJCSAgICBjb3B5X2Zyb21fdXNlcigmaSwgYnVmICsgY291bnQgLSAxLCAxKSAhPSAwIHx8CisJCSAgICBjb3B5X3RvX3VzZXIoYnVmICsgY291bnQgLSAxLCAmaSwgMSkgIT0gMCkgeworCQkJcmV0dmFsID0gKC1FRkFVTFQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlTVHBzLT5ydyA9IFNUX1JFQURJTkc7CisKKworCS8qIExvb3AgdW50aWwgZW5vdWdoIGRhdGEgaW4gYnVmZmVyIG9yIGEgc3BlY2lhbCBjb25kaXRpb24gZm91bmQgKi8KKwlmb3IgKHRvdGFsID0gMCwgc3BlY2lhbCA9IDA7IHRvdGFsIDwgY291bnQgJiYgIXNwZWNpYWw7KSB7CisKKwkJLyogR2V0IG5ldyBkYXRhIGlmIHRoZSBidWZmZXIgaXMgZW1wdHkgKi8KKwkJaWYgKFNUYnAtPmJ1ZmZlcl9ieXRlcyA9PSAwKSB7CisJCQlzcGVjaWFsID0gcmVhZF90YXBlKFNUcCwgY291bnQgLSB0b3RhbCwgJlNScG50KTsKKwkJCWlmIChzcGVjaWFsIDwgMCkgewkvKiBObyBuZWVkIHRvIGNvbnRpbnVlIHJlYWQgKi8KKwkJCQlyZXR2YWwgPSBzcGVjaWFsOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisKKwkJLyogTW92ZSB0aGUgZGF0YSBmcm9tIGRyaXZlciBidWZmZXIgdG8gdXNlciBidWZmZXIgKi8KKwkJaWYgKFNUYnAtPmJ1ZmZlcl9ieXRlcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQigKKwkJCWlmIChkZWJ1Z2dpbmcgJiYgU1Rwcy0+ZW9mICE9IFNUX05PRU9GKQorCQkJCXByaW50ayhTVF9ERUJfTVNHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEVPRiB1cCAoJWQpLiBMZWZ0ICVkLCBuZWVkZWQgJWQuXG4iLCBuYW1lLAorCQkJCSAgICAgICBTVHBzLT5lb2YsIFNUYnAtPmJ1ZmZlcl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGNvdW50IC0gdG90YWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICkgLyogZW5kIERFQiAqLworCQkJdHJhbnNmZXIgPSBTVGJwLT5idWZmZXJfYnl0ZXMgPCBjb3VudCAtIHRvdGFsID8KKwkJCSAgICBTVGJwLT5idWZmZXJfYnl0ZXMgOiBjb3VudCAtIHRvdGFsOworCQkJaWYgKCFkb19kaW8pIHsKKwkJCQlpID0gZnJvbV9idWZmZXIoU1RicCwgYnVmLCB0cmFuc2Zlcik7CisJCQkJaWYgKGkpIHsKKwkJCQkJcmV0dmFsID0gaTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQkJYnVmICs9IHRyYW5zZmVyOworCQkJdG90YWwgKz0gdHJhbnNmZXI7CisJCX0KKworCQlpZiAoU1RwLT5ibG9ja19zaXplID09IDApCisJCQlicmVhazsJLyogUmVhZCBvbmx5IG9uZSB2YXJpYWJsZSBsZW5ndGggYmxvY2sgKi8KKworCX0JCQkvKiBmb3IgKHRvdGFsID0gMCwgc3BlY2lhbCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsIDwgY291bnQgJiYgIXNwZWNpYWw7ICkgKi8KKworCS8qIENoYW5nZSB0aGUgZW9mIHN0YXRlIGlmIG5vIGRhdGEgZnJvbSB0YXBlIG9yIGJ1ZmZlciAqLworCWlmICh0b3RhbCA9PSAwKSB7CisJCWlmIChTVHBzLT5lb2YgPT0gU1RfRk1fSElUKSB7CisJCQlTVHBzLT5lb2YgPSBTVF9GTTsKKwkJCVNUcHMtPmRydl9ibG9jayA9IDA7CisJCQlpZiAoU1Rwcy0+ZHJ2X2ZpbGUgPj0gMCkKKwkJCQlTVHBzLT5kcnZfZmlsZSsrOworCQl9IGVsc2UgaWYgKFNUcHMtPmVvZiA9PSBTVF9FT0RfMSkgeworCQkJU1Rwcy0+ZW9mID0gU1RfRU9EXzI7CisJCQlTVHBzLT5kcnZfYmxvY2sgPSAwOworCQkJaWYgKFNUcHMtPmRydl9maWxlID49IDApCisJCQkJU1Rwcy0+ZHJ2X2ZpbGUrKzsKKwkJfSBlbHNlIGlmIChTVHBzLT5lb2YgPT0gU1RfRU9EXzIpCisJCQlTVHBzLT5lb2YgPSBTVF9FT0Q7CisJfSBlbHNlIGlmIChTVHBzLT5lb2YgPT0gU1RfRk0pCisJCVNUcHMtPmVvZiA9IFNUX05PRU9GOworCXJldHZhbCA9IHRvdGFsOworCisgb3V0OgorCWlmIChTUnBudCAhPSBOVUxMKSB7CisJCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwkJU1JwbnQgPSBOVUxMOworCX0KKwlpZiAoZG9fZGlvKSB7CisJCXJlbGVhc2VfYnVmZmVyaW5nKFNUcCk7CisJCVNUYnAtPmJ1ZmZlcl9ieXRlcyA9IDA7CisJfQorCXVwKCZTVHAtPmxvY2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKwwKKworCitERUIoCisvKiBTZXQgdGhlIGRyaXZlciBvcHRpb25zICovCitzdGF0aWMgdm9pZCBzdF9sb2dfb3B0aW9ucyhzdHJ1Y3Qgc2NzaV90YXBlICogU1RwLCBzdHJ1Y3Qgc3RfbW9kZWRlZiAqIFNUbSwgY2hhciAqbmFtZSkKK3sKKwlpZiAoZGVidWdnaW5nKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogTW9kZSAlZCBvcHRpb25zOiBidWZmZXIgd3JpdGVzOiAlZCwgYXN5bmMgd3JpdGVzOiAlZCwgcmVhZCBhaGVhZDogJWRcbiIsCisJCSAgICAgICBuYW1lLCBTVHAtPmN1cnJlbnRfbW9kZSwgU1RtLT5kb19idWZmZXJfd3JpdGVzLCBTVG0tPmRvX2FzeW5jX3dyaXRlcywKKwkJICAgICAgIFNUbS0+ZG9fcmVhZF9haGVhZCk7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogICAgY2FuIGJzcjogJWQsIHR3byBGTXM6ICVkLCBmYXN0IG10ZW9tOiAlZCwgYXV0byBsb2NrOiAlZCxcbiIsCisJCSAgICAgICBuYW1lLCBTVHAtPmNhbl9ic3IsIFNUcC0+dHdvX2ZtLCBTVHAtPmZhc3RfbXRlb20sIFNUcC0+ZG9fYXV0b19sb2NrKTsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiAgICBkZWZzIGZvciB3cjogJWQsIG5vIGJsb2NrIGxpbWl0czogJWQsIHBhcnRpdGlvbnM6ICVkLCBzMiBsb2c6ICVkXG4iLAorCQkgICAgICAgbmFtZSwgU1RtLT5kZWZhdWx0c19mb3Jfd3JpdGVzLCBTVHAtPm9taXRfYmxrbGltcywgU1RwLT5jYW5fcGFydGl0aW9ucywKKwkJICAgICAgIFNUcC0+c2NzaTJfbG9naWNhbCk7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogICAgc3lzdjogJWQgbm93YWl0OiAlZFxuIiwgbmFtZSwgU1RtLT5zeXN2LCBTVHAtPmltbWVkaWF0ZSk7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiAgICBkZWJ1Z2dpbmc6ICVkXG4iLAorCQkgICAgICAgbmFtZSwgZGVidWdnaW5nKTsKKwl9Cit9CisJKQorCisKK3N0YXRpYyBpbnQgc3Rfc2V0X29wdGlvbnMoc3RydWN0IHNjc2lfdGFwZSAqU1RwLCBsb25nIG9wdGlvbnMpCit7CisJaW50IHZhbHVlOworCWxvbmcgY29kZTsKKwlzdHJ1Y3Qgc3RfbW9kZWRlZiAqU1RtOworCWNoYXIgKm5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKwlzdHJ1Y3QgY2RldiAqY2QwLCAqY2QxOworCisJU1RtID0gJihTVHAtPm1vZGVzW1NUcC0+Y3VycmVudF9tb2RlXSk7CisJaWYgKCFTVG0tPmRlZmluZWQpIHsKKwkJY2QwID0gU1RtLT5jZGV2c1swXTsgY2QxID0gU1RtLT5jZGV2c1sxXTsKKwkJbWVtY3B5KFNUbSwgJihTVHAtPm1vZGVzWzBdKSwgc2l6ZW9mKHN0cnVjdCBzdF9tb2RlZGVmKSk7CisJCVNUbS0+Y2RldnNbMF0gPSBjZDA7IFNUbS0+Y2RldnNbMV0gPSBjZDE7CisJCW1vZGVzX2RlZmluZWQgPSAxOworICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEluaXRpYWxpemVkIG1vZGUgJWQgZGVmaW5pdGlvbiBmcm9tIG1vZGUgMFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBTVHAtPmN1cnJlbnRfbW9kZSkpOworCX0KKworCWNvZGUgPSBvcHRpb25zICYgTVRfU1RfT1BUSU9OUzsKKwlpZiAoY29kZSA9PSBNVF9TVF9CT09MRUFOUykgeworCQlTVG0tPmRvX2J1ZmZlcl93cml0ZXMgPSAob3B0aW9ucyAmIE1UX1NUX0JVRkZFUl9XUklURVMpICE9IDA7CisJCVNUbS0+ZG9fYXN5bmNfd3JpdGVzID0gKG9wdGlvbnMgJiBNVF9TVF9BU1lOQ19XUklURVMpICE9IDA7CisJCVNUbS0+ZGVmYXVsdHNfZm9yX3dyaXRlcyA9IChvcHRpb25zICYgTVRfU1RfREVGX1dSSVRFUykgIT0gMDsKKwkJU1RtLT5kb19yZWFkX2FoZWFkID0gKG9wdGlvbnMgJiBNVF9TVF9SRUFEX0FIRUFEKSAhPSAwOworCQlTVHAtPnR3b19mbSA9IChvcHRpb25zICYgTVRfU1RfVFdPX0ZNKSAhPSAwOworCQlTVHAtPmZhc3RfbXRlb20gPSAob3B0aW9ucyAmIE1UX1NUX0ZBU1RfTVRFT00pICE9IDA7CisJCVNUcC0+ZG9fYXV0b19sb2NrID0gKG9wdGlvbnMgJiBNVF9TVF9BVVRPX0xPQ0spICE9IDA7CisJCVNUcC0+Y2FuX2JzciA9IChvcHRpb25zICYgTVRfU1RfQ0FOX0JTUikgIT0gMDsKKwkJU1RwLT5vbWl0X2Jsa2xpbXMgPSAob3B0aW9ucyAmIE1UX1NUX05PX0JMS0xJTVMpICE9IDA7CisJCWlmICgoU1RwLT5kZXZpY2UpLT5zY3NpX2xldmVsID49IFNDU0lfMikKKwkJCVNUcC0+Y2FuX3BhcnRpdGlvbnMgPSAob3B0aW9ucyAmIE1UX1NUX0NBTl9QQVJUSVRJT05TKSAhPSAwOworCQlTVHAtPnNjc2kyX2xvZ2ljYWwgPSAob3B0aW9ucyAmIE1UX1NUX1NDU0kyTE9HSUNBTCkgIT0gMDsKKwkJU1RwLT5pbW1lZGlhdGUgPSAob3B0aW9ucyAmIE1UX1NUX05PV0FJVCkgIT0gMDsKKwkJU1RtLT5zeXN2ID0gKG9wdGlvbnMgJiBNVF9TVF9TWVNWKSAhPSAwOworCQlERUIoIGRlYnVnZ2luZyA9IChvcHRpb25zICYgTVRfU1RfREVCVUdHSU5HKSAhPSAwOworCQkgICAgIHN0X2xvZ19vcHRpb25zKFNUcCwgU1RtLCBuYW1lKTsgKQorCX0gZWxzZSBpZiAoY29kZSA9PSBNVF9TVF9TRVRCT09MRUFOUyB8fCBjb2RlID09IE1UX1NUX0NMRUFSQk9PTEVBTlMpIHsKKwkJdmFsdWUgPSAoY29kZSA9PSBNVF9TVF9TRVRCT09MRUFOUyk7CisJCWlmICgob3B0aW9ucyAmIE1UX1NUX0JVRkZFUl9XUklURVMpICE9IDApCisJCQlTVG0tPmRvX2J1ZmZlcl93cml0ZXMgPSB2YWx1ZTsKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfQVNZTkNfV1JJVEVTKSAhPSAwKQorCQkJU1RtLT5kb19hc3luY193cml0ZXMgPSB2YWx1ZTsKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfREVGX1dSSVRFUykgIT0gMCkKKwkJCVNUbS0+ZGVmYXVsdHNfZm9yX3dyaXRlcyA9IHZhbHVlOworCQlpZiAoKG9wdGlvbnMgJiBNVF9TVF9SRUFEX0FIRUFEKSAhPSAwKQorCQkJU1RtLT5kb19yZWFkX2FoZWFkID0gdmFsdWU7CisJCWlmICgob3B0aW9ucyAmIE1UX1NUX1RXT19GTSkgIT0gMCkKKwkJCVNUcC0+dHdvX2ZtID0gdmFsdWU7CisJCWlmICgob3B0aW9ucyAmIE1UX1NUX0ZBU1RfTVRFT00pICE9IDApCisJCQlTVHAtPmZhc3RfbXRlb20gPSB2YWx1ZTsKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfQVVUT19MT0NLKSAhPSAwKQorCQkJU1RwLT5kb19hdXRvX2xvY2sgPSB2YWx1ZTsKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfQ0FOX0JTUikgIT0gMCkKKwkJCVNUcC0+Y2FuX2JzciA9IHZhbHVlOworCQlpZiAoKG9wdGlvbnMgJiBNVF9TVF9OT19CTEtMSU1TKSAhPSAwKQorCQkJU1RwLT5vbWl0X2Jsa2xpbXMgPSB2YWx1ZTsKKwkJaWYgKChTVHAtPmRldmljZSktPnNjc2lfbGV2ZWwgPj0gU0NTSV8yICYmCisJCSAgICAob3B0aW9ucyAmIE1UX1NUX0NBTl9QQVJUSVRJT05TKSAhPSAwKQorCQkJU1RwLT5jYW5fcGFydGl0aW9ucyA9IHZhbHVlOworCQlpZiAoKG9wdGlvbnMgJiBNVF9TVF9TQ1NJMkxPR0lDQUwpICE9IDApCisJCQlTVHAtPnNjc2kyX2xvZ2ljYWwgPSB2YWx1ZTsKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfTk9XQUlUKSAhPSAwKQorCQkJU1RwLT5pbW1lZGlhdGUgPSB2YWx1ZTsKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfU1lTVikgIT0gMCkKKwkJCVNUbS0+c3lzdiA9IHZhbHVlOworICAgICAgICAgICAgICAgIERFQigKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfREVCVUdHSU5HKSAhPSAwKQorCQkJZGVidWdnaW5nID0gdmFsdWU7CisJCQlzdF9sb2dfb3B0aW9ucyhTVHAsIFNUbSwgbmFtZSk7ICkKKwl9IGVsc2UgaWYgKGNvZGUgPT0gTVRfU1RfV1JJVEVfVEhSRVNIT0xEKSB7CisJCS8qIFJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5ICovCisJfSBlbHNlIGlmIChjb2RlID09IE1UX1NUX0RFRl9CTEtTSVpFKSB7CisJCXZhbHVlID0gKG9wdGlvbnMgJiB+TVRfU1RfT1BUSU9OUyk7CisJCWlmICh2YWx1ZSA9PSB+TVRfU1RfT1BUSU9OUykgeworCQkJU1RtLT5kZWZhdWx0X2Jsa3NpemUgPSAoLTEpOworCQkJREVCQyggcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERlZmF1bHQgYmxvY2sgc2l6ZSBkaXNhYmxlZC5cbiIsIG5hbWUpKTsKKwkJfSBlbHNlIHsKKwkJCVNUbS0+ZGVmYXVsdF9ibGtzaXplID0gdmFsdWU7CisJCQlERUJDKCBwcmludGsoS0VSTl9JTkZPICIlczogRGVmYXVsdCBibG9jayBzaXplIHNldCB0byAlZCBieXRlcy5cbiIsCisJCQkgICAgICAgbmFtZSwgU1RtLT5kZWZhdWx0X2Jsa3NpemUpKTsKKwkJCWlmIChTVHAtPnJlYWR5ID09IFNUX1JFQURZKSB7CisJCQkJU1RwLT5ibGtzaXplX2NoYW5nZWQgPSAwOworCQkJCXNldF9tb2RlX2RlbnNibGsoU1RwLCBTVG0pOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChjb2RlID09IE1UX1NUX1RJTUVPVVRTKSB7CisJCXZhbHVlID0gKG9wdGlvbnMgJiB+TVRfU1RfT1BUSU9OUyk7CisJCWlmICgodmFsdWUgJiBNVF9TVF9TRVRfTE9OR19USU1FT1VUKSAhPSAwKSB7CisJCQlTVHAtPmxvbmdfdGltZW91dCA9ICh2YWx1ZSAmIH5NVF9TVF9TRVRfTE9OR19USU1FT1VUKSAqIEhaOworCQkJREVCQyggcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExvbmcgdGltZW91dCBzZXQgdG8gJWQgc2Vjb25kcy5cbiIsIG5hbWUsCisJCQkgICAgICAgKHZhbHVlICYgfk1UX1NUX1NFVF9MT05HX1RJTUVPVVQpKSk7CisJCX0gZWxzZSB7CisJCQlTVHAtPmRldmljZS0+dGltZW91dCA9IHZhbHVlICogSFo7CisJCQlERUJDKCBwcmludGsoS0VSTl9JTkZPICIlczogTm9ybWFsIHRpbWVvdXQgc2V0IHRvICVkIHNlY29uZHMuXG4iLAorCQkJCW5hbWUsIHZhbHVlKSApOworCQl9CisJfSBlbHNlIGlmIChjb2RlID09IE1UX1NUX1NFVF9DTE4pIHsKKwkJdmFsdWUgPSAob3B0aW9ucyAmIH5NVF9TVF9PUFRJT05TKSAmIDB4ZmY7CisJCWlmICh2YWx1ZSAhPSAwICYmCisJCSAgICB2YWx1ZSA8IEVYVEVOREVEX1NFTlNFX1NUQVJUICYmIHZhbHVlID49IFNDU0lfU0VOU0VfQlVGRkVSU0laRSkKKwkJCXJldHVybiAoLUVJTlZBTCk7CisJCVNUcC0+Y2xuX21vZGUgPSB2YWx1ZTsKKwkJU1RwLT5jbG5fc2Vuc2VfbWFzayA9IChvcHRpb25zID4+IDgpICYgMHhmZjsKKwkJU1RwLT5jbG5fc2Vuc2VfdmFsdWUgPSAob3B0aW9ucyA+PiAxNikgJiAweGZmOworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IENsZWFuaW5nIHJlcXVlc3QgbW9kZSAlZCwgbWFzayAlMDJ4LCB2YWx1ZSAlMDJ4XG4iLAorCQkgICAgICAgbmFtZSwgdmFsdWUsIFNUcC0+Y2xuX3NlbnNlX21hc2ssIFNUcC0+Y2xuX3NlbnNlX3ZhbHVlKTsKKwl9IGVsc2UgaWYgKGNvZGUgPT0gTVRfU1RfREVGX09QVElPTlMpIHsKKwkJY29kZSA9IChvcHRpb25zICYgfk1UX1NUX0NMRUFSX0RFRkFVTFQpOworCQl2YWx1ZSA9IChvcHRpb25zICYgTVRfU1RfQ0xFQVJfREVGQVVMVCk7CisJCWlmIChjb2RlID09IE1UX1NUX0RFRl9ERU5TSVRZKSB7CisJCQlpZiAodmFsdWUgPT0gTVRfU1RfQ0xFQVJfREVGQVVMVCkgeworCQkJCVNUbS0+ZGVmYXVsdF9kZW5zaXR5ID0gKC0xKTsKKwkJCQlERUJDKCBwcmludGsoS0VSTl9JTkZPICIlczogRGVuc2l0eSBkZWZhdWx0IGRpc2FibGVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpKTsKKwkJCX0gZWxzZSB7CisJCQkJU1RtLT5kZWZhdWx0X2RlbnNpdHkgPSB2YWx1ZSAmIDB4ZmY7CisJCQkJREVCQyggcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERlbnNpdHkgZGVmYXVsdCBzZXQgdG8gJXhcbiIsCisJCQkJICAgICAgIG5hbWUsIFNUbS0+ZGVmYXVsdF9kZW5zaXR5KSk7CisJCQkJaWYgKFNUcC0+cmVhZHkgPT0gU1RfUkVBRFkpIHsKKwkJCQkJU1RwLT5kZW5zaXR5X2NoYW5nZWQgPSAwOworCQkJCQlzZXRfbW9kZV9kZW5zYmxrKFNUcCwgU1RtKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoY29kZSA9PSBNVF9TVF9ERUZfRFJWQlVGRkVSKSB7CisJCQlpZiAodmFsdWUgPT0gTVRfU1RfQ0xFQVJfREVGQVVMVCkgeworCQkJCVNUcC0+ZGVmYXVsdF9kcnZidWZmZXIgPSAweGZmOworCQkJCURFQkMoIHByaW50ayhLRVJOX0lORk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogRHJpdmUgYnVmZmVyIGRlZmF1bHQgZGlzYWJsZWQuXG4iLCBuYW1lKSk7CisJCQl9IGVsc2UgeworCQkJCVNUcC0+ZGVmYXVsdF9kcnZidWZmZXIgPSB2YWx1ZSAmIDc7CisJCQkJREVCQyggcHJpbnRrKEtFUk5fSU5GTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBEcml2ZSBidWZmZXIgZGVmYXVsdCBzZXQgdG8gJXhcbiIsCisJCQkJICAgICAgIG5hbWUsIFNUcC0+ZGVmYXVsdF9kcnZidWZmZXIpKTsKKwkJCQlpZiAoU1RwLT5yZWFkeSA9PSBTVF9SRUFEWSkKKwkJCQkJc3RfaW50X2lvY3RsKFNUcCwgTVRTRVREUlZCVUZGRVIsIFNUcC0+ZGVmYXVsdF9kcnZidWZmZXIpOworCQkJfQorCQl9IGVsc2UgaWYgKGNvZGUgPT0gTVRfU1RfREVGX0NPTVBSRVNTSU9OKSB7CisJCQlpZiAodmFsdWUgPT0gTVRfU1RfQ0xFQVJfREVGQVVMVCkgeworCQkJCVNUbS0+ZGVmYXVsdF9jb21wcmVzc2lvbiA9IFNUX0RPTlRfVE9VQ0g7CisJCQkJREVCQyggcHJpbnRrKEtFUk5fSU5GTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBDb21wcmVzc2lvbiBkZWZhdWx0IGRpc2FibGVkLlxuIiwgbmFtZSkpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKHZhbHVlICYgMHhmZjAwKSAhPSAwKSB7CisJCQkJCVNUcC0+Y19hbGdvID0gKHZhbHVlICYgMHhmZjAwKSA+PiA4OworCQkJCQlERUJDKCBwcmludGsoS0VSTl9JTkZPICIlczogQ29tcHJlc3Npb24gYWxnb3JpdGhtIHNldCB0byAweCV4LlxuIiwKKwkJCQkJICAgICAgIG5hbWUsIFNUcC0+Y19hbGdvKSk7CisJCQkJfQorCQkJCWlmICgodmFsdWUgJiAweGZmKSAhPSAweGZmKSB7CisJCQkJCVNUbS0+ZGVmYXVsdF9jb21wcmVzc2lvbiA9ICh2YWx1ZSAmIDEgPyBTVF9ZRVMgOiBTVF9OTyk7CisJCQkJCURFQkMoIHByaW50ayhLRVJOX0lORk8gIiVzOiBDb21wcmVzc2lvbiBkZWZhdWx0IHNldCB0byAleFxuIiwKKwkJCQkJICAgICAgIG5hbWUsICh2YWx1ZSAmIDEpKSk7CisJCQkJCWlmIChTVHAtPnJlYWR5ID09IFNUX1JFQURZKSB7CisJCQkJCQlTVHAtPmNvbXByZXNzaW9uX2NoYW5nZWQgPSAwOworCQkJCQkJc3RfY29tcHJlc3Npb24oU1RwLCAoU1RtLT5kZWZhdWx0X2NvbXByZXNzaW9uID09IFNUX1lFUykpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlCisJCXJldHVybiAoLUVJTyk7CisKKwlyZXR1cm4gMDsKK30KKwwKKyNkZWZpbmUgTU9ERV9IRUFERVJfTEVOR1RIICA0CisKKy8qIE1vZGUgaGVhZGVyIGFuZCBwYWdlIGJ5dGUgb2Zmc2V0cyAqLworI2RlZmluZSBNSF9PRkZfREFUQV9MRU5HVEggICAgIDAKKyNkZWZpbmUgTUhfT0ZGX01FRElVTV9UWVBFICAgICAxCisjZGVmaW5lIE1IX09GRl9ERVZfU1BFQ0lGSUMgICAgMgorI2RlZmluZSBNSF9PRkZfQkRFU0NTX0xFTkdUSCAgIDMKKyNkZWZpbmUgTVBfT0ZGX1BBR0VfTkJSICAgICAgICAwCisjZGVmaW5lIE1QX09GRl9QQUdFX0xFTkdUSCAgICAgMQorCisvKiBNb2RlIGhlYWRlciBhbmQgcGFnZSBiaXQgbWFza3MgKi8KKyNkZWZpbmUgTUhfQklUX1dQICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIE1QX01TS19QQUdFX05CUiAgICAgICAgMHgzZgorCisvKiBEb24ndCByZXR1cm4gYmxvY2sgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgTU9ERV9TRU5TRV9PTUlUX0JERVNDUyAweDA4CisKKyNkZWZpbmUgTU9ERV9TRUxFQ1RfUEFHRV9GT1JNQVQgMHgxMAorCisvKiBSZWFkIGEgbW9kZSBwYWdlIGludG8gdGhlIHRhcGUgYnVmZmVyLiBUaGUgYmxvY2sgZGVzY3JpcHRvcnMgYXJlIGluY2x1ZGVkCisgICBpZiBpbmNsX2Jsb2NrX2Rlc2NzIGlzIHRydWUuIFRoZSBwYWdlIGNvbnRyb2wgaXMgb3JlZCB0byB0aGUgcGFnZSBudW1iZXIKKyAgIHBhcmFtZXRlciwgaWYgbmVjZXNzYXJ5LiAqLworc3RhdGljIGludCByZWFkX21vZGVfcGFnZShzdHJ1Y3Qgc2NzaV90YXBlICpTVHAsIGludCBwYWdlLCBpbnQgb21pdF9ibG9ja19kZXNjcykKK3sKKwl1bnNpZ25lZCBjaGFyIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudCA9IE5VTEw7CisKKwltZW1zZXQoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwljbWRbMF0gPSBNT0RFX1NFTlNFOworCWlmIChvbWl0X2Jsb2NrX2Rlc2NzKQorCQljbWRbMV0gPSBNT0RFX1NFTlNFX09NSVRfQkRFU0NTOworCWNtZFsyXSA9IHBhZ2U7CisJY21kWzRdID0gMjU1OworCisJU1JwbnQgPSBzdF9kb19zY3NpKFNScG50LCBTVHAsIGNtZCwgY21kWzRdLCBETUFfRlJPTV9ERVZJQ0UsCisJCQkgICBTVHAtPmRldmljZS0+dGltZW91dCwgMCwgMSk7CisJaWYgKFNScG50ID09IE5VTEwpCisJCXJldHVybiAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKworCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKworCXJldHVybiAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKK30KKworCisvKiBTZW5kIHRoZSBtb2RlIHBhZ2UgaW4gdGhlIHRhcGUgYnVmZmVyIHRvIHRoZSBkcml2ZS4gQXNzdW1lcyB0aGF0IHRoZSBtb2RlIGRhdGEKKyAgIGluIHRoZSBidWZmZXIgaXMgY29ycmVjdGx5IGZvcm1hdHRlZC4gVGhlIGxvbmcgdGltZW91dCBpcyB1c2VkIGlmIHNsb3cgaXMgbm9uLXplcm8uICovCitzdGF0aWMgaW50IHdyaXRlX21vZGVfcGFnZShzdHJ1Y3Qgc2NzaV90YXBlICpTVHAsIGludCBwYWdlLCBpbnQgc2xvdykKK3sKKwlpbnQgcGdvOworCXVuc2lnbmVkIGNoYXIgY21kW01BWF9DT01NQU5EX1NJWkVdOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50ID0gTlVMTDsKKworCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCWNtZFswXSA9IE1PREVfU0VMRUNUOworCWNtZFsxXSA9IE1PREVfU0VMRUNUX1BBR0VfRk9STUFUOworCXBnbyA9IE1PREVfSEVBREVSX0xFTkdUSCArIChTVHAtPmJ1ZmZlciktPmJfZGF0YVtNSF9PRkZfQkRFU0NTX0xFTkdUSF07CisJY21kWzRdID0gcGdvICsgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW3BnbyArIE1QX09GRl9QQUdFX0xFTkdUSF0gKyAyOworCisJLyogQ2xlYXIgcmVzZXJ2ZWQgZmllbGRzICovCisJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW01IX09GRl9EQVRBX0xFTkdUSF0gPSAwOworCShTVHAtPmJ1ZmZlciktPmJfZGF0YVtNSF9PRkZfTUVESVVNX1RZUEVdID0gMDsKKwkoU1RwLT5idWZmZXIpLT5iX2RhdGFbTUhfT0ZGX0RFVl9TUEVDSUZJQ10gJj0gfk1IX0JJVF9XUDsKKwkoU1RwLT5idWZmZXIpLT5iX2RhdGFbcGdvICsgTVBfT0ZGX1BBR0VfTkJSXSAmPSBNUF9NU0tfUEFHRV9OQlI7CisKKwlTUnBudCA9IHN0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCBjbWRbNF0sIERNQV9UT19ERVZJQ0UsCisJCQkgICAoc2xvdyA/IFNUcC0+bG9uZ190aW1lb3V0IDogU1RwLT5kZXZpY2UtPnRpbWVvdXQpLCAwLCAxKTsKKwlpZiAoU1JwbnQgPT0gTlVMTCkKKwkJcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworCisJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCisJcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworfQorCisKKyNkZWZpbmUgQ09NUFJFU1NJT05fUEFHRSAgICAgICAgMHgwZgorI2RlZmluZSBDT01QUkVTU0lPTl9QQUdFX0xFTkdUSCAxNgorCisjZGVmaW5lIENQX09GRl9EQ0VfRENDICAgICAgICAgIDIKKyNkZWZpbmUgQ1BfT0ZGX0NfQUxHTyAgICAgICAgICAgNworCisjZGVmaW5lIERDRV9NQVNLICAweDgwCisjZGVmaW5lIERDQ19NQVNLICAweDQwCisjZGVmaW5lIFJFRF9NQVNLICAweDYwCisKKworLyogQ29udHJvbCB0aGUgY29tcHJlc3Npb24gd2l0aCBtb2RlIHBhZ2UgMTUuIEFsZ29yaXRobSBub3QgY2hhbmdlZCBpZiB6ZXJvLgorCisgICBUaGUgYmxvY2sgZGVzY3JpcHRvcnMgYXJlIHJlYWQgYW5kIHdyaXR0ZW4gYmVjYXVzZSBTb255IFNEVC03MDAwIGRvZXMgbm90CisgICB3b3JrIHdpdGhvdXQgdGhpcyAoc3VnZ2VzdGlvbiBmcm9tIE1pY2hhZWwgU2NoYWVmZXIgPE1pY2hhZWwuU2NoYWVmZXJAZGxyLmRlPikuCisgICBJbmNsdWRpbmcgYmxvY2sgZGVzY3JpcHRvcnMgc2hvdWxkIG5vdCBjYXVzZSBhbnkgaGFybSB0byBvdGhlciBkcml2ZXMuICovCisKK3N0YXRpYyBpbnQgc3RfY29tcHJlc3Npb24oc3RydWN0IHNjc2lfdGFwZSAqIFNUcCwgaW50IHN0YXRlKQoreworCWludCByZXR2YWw7CisJaW50IG1wb2ZmczsgIC8qIE9mZnNldCB0byBtb2RlIHBhZ2Ugc3RhcnQgKi8KKwl1bnNpZ25lZCBjaGFyICpiX2RhdGEgPSAoU1RwLT5idWZmZXIpLT5iX2RhdGE7CisJREVCKCBjaGFyICpuYW1lID0gdGFwZV9uYW1lKFNUcCk7ICkKKworCWlmIChTVHAtPnJlYWR5ICE9IFNUX1JFQURZKQorCQlyZXR1cm4gKC1FSU8pOworCisJLyogUmVhZCB0aGUgY3VycmVudCBwYWdlIGNvbnRlbnRzICovCisJcmV0dmFsID0gcmVhZF9tb2RlX3BhZ2UoU1RwLCBDT01QUkVTU0lPTl9QQUdFLCAwKTsKKwlpZiAocmV0dmFsKSB7CisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IENvbXByZXNzaW9uIG1vZGUgcGFnZSBub3Qgc3VwcG9ydGVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKSk7CisJCXJldHVybiAoLUVJTyk7CisJfQorCisJbXBvZmZzID0gTU9ERV9IRUFERVJfTEVOR1RIICsgYl9kYXRhW01IX09GRl9CREVTQ1NfTEVOR1RIXTsKKyAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IENvbXByZXNzaW9uIHN0YXRlIGlzICVkLlxuIiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgKGJfZGF0YVttcG9mZnMgKyBDUF9PRkZfRENFX0RDQ10gJiBEQ0VfTUFTSyA/IDEgOiAwKSkpOworCisJLyogQ2hlY2sgaWYgY29tcHJlc3Npb24gY2FuIGJlIGNoYW5nZWQgKi8KKwlpZiAoKGJfZGF0YVttcG9mZnMgKyBDUF9PRkZfRENFX0RDQ10gJiBEQ0NfTUFTSykgPT0gMCkgeworICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBDb21wcmVzc2lvbiBub3Qgc3VwcG9ydGVkLlxuIiwgbmFtZSkpOworCQlyZXR1cm4gKC1FSU8pOworCX0KKworCS8qIERvIHRoZSBjaGFuZ2UgKi8KKwlpZiAoc3RhdGUpIHsKKwkJYl9kYXRhW21wb2ZmcyArIENQX09GRl9EQ0VfRENDXSB8PSBEQ0VfTUFTSzsKKwkJaWYgKFNUcC0+Y19hbGdvICE9IDApCisJCQliX2RhdGFbbXBvZmZzICsgQ1BfT0ZGX0NfQUxHT10gPSBTVHAtPmNfYWxnbzsKKwl9CisJZWxzZSB7CisJCWJfZGF0YVttcG9mZnMgKyBDUF9PRkZfRENFX0RDQ10gJj0gfkRDRV9NQVNLOworCQlpZiAoU1RwLT5jX2FsZ28gIT0gMCkKKwkJCWJfZGF0YVttcG9mZnMgKyBDUF9PRkZfQ19BTEdPXSA9IDA7IC8qIG5vIGNvbXByZXNzaW9uICovCisJfQorCisJcmV0dmFsID0gd3JpdGVfbW9kZV9wYWdlKFNUcCwgQ09NUFJFU1NJT05fUEFHRSwgMCk7CisJaWYgKHJldHZhbCkgeworICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBDb21wcmVzc2lvbiBjaGFuZ2UgZmFpbGVkLlxuIiwgbmFtZSkpOworCQlyZXR1cm4gKC1FSU8pOworCX0KKyAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IENvbXByZXNzaW9uIHN0YXRlIGNoYW5nZWQgdG8gJWQuXG4iLAorCQkgICAgICAgbmFtZSwgc3RhdGUpKTsKKworCVNUcC0+Y29tcHJlc3Npb25fY2hhbmdlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKworLyogUHJvY2VzcyB0aGUgbG9hZCBhbmQgdW5sb2FkIGNvbW1hbmRzIChkb2VzIHVubG9hZCBpZiB0aGUgbG9hZCBjb2RlIGlzIHplcm8pICovCitzdGF0aWMgaW50IGRvX2xvYWRfdW5sb2FkKHN0cnVjdCBzY3NpX3RhcGUgKlNUcCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBsb2FkX2NvZGUpCit7CisJaW50IHJldHZhbCA9ICgtRUlPKSwgdGltZW91dDsKKwlERUIoIGNoYXIgKm5hbWUgPSB0YXBlX25hbWUoU1RwKTsgKQorCXVuc2lnbmVkIGNoYXIgY21kW01BWF9DT01NQU5EX1NJWkVdOworCXN0cnVjdCBzdF9wYXJ0c3RhdCAqU1RwczsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudDsKKworCWlmIChTVHAtPnJlYWR5ICE9IFNUX1JFQURZICYmICFsb2FkX2NvZGUpIHsKKwkJaWYgKFNUcC0+cmVhZHkgPT0gU1RfTk9fVEFQRSkKKwkJCXJldHVybiAoLUVOT01FRElVTSk7CisJCWVsc2UKKwkJCXJldHVybiAoLUVJTyk7CisJfQorCisJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJY21kWzBdID0gU1RBUlRfU1RPUDsKKwlpZiAobG9hZF9jb2RlKQorCQljbWRbNF0gfD0gMTsKKwkvKgorCSAqIElmIGFyZyA+PSAxICYmIGFyZyA8PSA2IEVuaGFuY2VkIGxvYWQvdW5sb2FkIGluIEhQIEMxNTUzQQorCSAqLworCWlmIChsb2FkX2NvZGUgPj0gMSArIE1UX1NUX0hQTE9BREVSX09GRlNFVAorCSAgICAmJiBsb2FkX2NvZGUgPD0gNiArIE1UX1NUX0hQTE9BREVSX09GRlNFVCkgeworCQlERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogRW5oYW5jZWQgJXNsb2FkIHNsb3QgJTJkLlxuIiwKKwkJCSAgICBuYW1lLCAoY21kWzRdKSA/ICIiIDogInVuIiwKKwkJCSAgICBsb2FkX2NvZGUgLSBNVF9TVF9IUExPQURFUl9PRkZTRVQpKTsKKwkJY21kWzNdID0gbG9hZF9jb2RlIC0gTVRfU1RfSFBMT0FERVJfT0ZGU0VUOyAvKiBNZWRpYUlEIGZpZWxkIG9mIEMxNTUzQSAqLworCX0KKwlpZiAoU1RwLT5pbW1lZGlhdGUpIHsKKwkJY21kWzFdID0gMTsJLyogRG9uJ3Qgd2FpdCBmb3IgY29tcGxldGlvbiAqLworCQl0aW1lb3V0ID0gU1RwLT5kZXZpY2UtPnRpbWVvdXQ7CisJfQorCWVsc2UKKwkJdGltZW91dCA9IFNUcC0+bG9uZ190aW1lb3V0OworCisJREVCQygKKwkJaWYgKCFsb2FkX2NvZGUpCisJCXByaW50ayhTVF9ERUJfTVNHICIlczogVW5sb2FkaW5nIHRhcGUuXG4iLCBuYW1lKTsKKwkJZWxzZQorCQlwcmludGsoU1RfREVCX01TRyAiJXM6IExvYWRpbmcgdGFwZS5cbiIsIG5hbWUpOworCQkpOworCisJU1JwbnQgPSBzdF9kb19zY3NpKE5VTEwsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwKKwkJCSAgIHRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKwlpZiAoIVNScG50KQorCQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CisKKwlyZXR2YWwgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKwlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisKKwlpZiAoIXJldHZhbCkgewkvKiBTQ1NJIGNvbW1hbmQgc3VjY2Vzc2Z1bCAqLworCisJCWlmICghbG9hZF9jb2RlKSB7CisJCQlTVHAtPnJld19hdF9jbG9zZSA9IDA7CisJCQlTVHAtPnJlYWR5ID0gU1RfTk9fVEFQRTsKKwkJfQorCQllbHNlIHsKKwkJCVNUcC0+cmV3X2F0X2Nsb3NlID0gU1RwLT5hdXRvcmV3X2RldjsKKwkJCXJldHZhbCA9IGNoZWNrX3RhcGUoU1RwLCBmaWxwKTsKKwkJCWlmIChyZXR2YWwgPiAwKQorCQkJCXJldHZhbCA9IDA7CisJCX0KKwl9CisJZWxzZSB7CisJCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKKwkJU1Rwcy0+ZHJ2X2ZpbGUgPSBTVHBzLT5kcnZfYmxvY2sgPSAoLTEpOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisMCisjaWYgREVCVUcKKyNkZWZpbmUgU1RfREVCX0ZPUldBUkQgIDAKKyNkZWZpbmUgU1RfREVCX0JBQ0tXQVJEIDEKK3N0YXRpYyB2b2lkIGRlYl9zcGFjZV9wcmludChjaGFyICpuYW1lLCBpbnQgZGlyZWN0aW9uLCBjaGFyICp1bml0cywgdW5zaWduZWQgY2hhciAqY21kKQoreworCXMzMiBzYzsKKworCXNjID0gY21kWzJdICYgMHg4MCA/IDB4ZmYwMDAwMDAgOiAwOworCXNjIHw9IChjbWRbMl0gPDwgMTYpIHwgKGNtZFszXSA8PCA4KSB8IGNtZFs0XTsKKwlpZiAoZGlyZWN0aW9uKQorCQlzYyA9IC1zYzsKKwlwcmludGsoU1RfREVCX01TRyAiJXM6IFNwYWNpbmcgdGFwZSAlcyBvdmVyICVkICVzLlxuIiwgbmFtZSwKKwkgICAgICAgZGlyZWN0aW9uID8gImJhY2t3YXJkIiA6ICJmb3J3YXJkIiwgc2MsIHVuaXRzKTsKK30KKyNlbmRpZgorCisKKy8qIEludGVybmFsIGlvY3RsIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IHN0X2ludF9pb2N0bChzdHJ1Y3Qgc2NzaV90YXBlICpTVHAsIHVuc2lnbmVkIGludCBjbWRfaW4sIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCB0aW1lb3V0OworCWxvbmcgbHRtcDsKKwlpbnQgaW9jdGxfcmVzdWx0OworCWludCBjaGdfZW9mID0gMTsKKwl1bnNpZ25lZCBjaGFyIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudDsKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgKlNUcHM7CisJaW50IGZpbGVubywgYmxrbm8sIGF0X3NtLCB1bmRvbmU7CisJaW50IGRhdGFsZW4gPSAwLCBkaXJlY3Rpb24gPSBETUFfTk9ORTsKKwljaGFyICpuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisKKwlXQVJOX09OKFNUcC0+YnVmZmVyLT5kb19kaW8gIT0gMCk7CisJaWYgKFNUcC0+cmVhZHkgIT0gU1RfUkVBRFkpIHsKKwkJaWYgKFNUcC0+cmVhZHkgPT0gU1RfTk9fVEFQRSkKKwkJCXJldHVybiAoLUVOT01FRElVTSk7CisJCWVsc2UKKwkJCXJldHVybiAoLUVJTyk7CisJfQorCXRpbWVvdXQgPSBTVHAtPmxvbmdfdGltZW91dDsKKwlTVHBzID0gJihTVHAtPnBzW1NUcC0+cGFydGl0aW9uXSk7CisJZmlsZW5vID0gU1Rwcy0+ZHJ2X2ZpbGU7CisJYmxrbm8gPSBTVHBzLT5kcnZfYmxvY2s7CisJYXRfc20gPSBTVHBzLT5hdF9zbTsKKworCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCXN3aXRjaCAoY21kX2luKSB7CisJY2FzZSBNVEZTRk06CisJCWNoZ19lb2YgPSAwOwkvKiBDaGFuZ2VkIGZyb20gdGhlIEZTRiBhZnRlciB0aGlzICovCisJY2FzZSBNVEZTRjoKKwkJY21kWzBdID0gU1BBQ0U7CisJCWNtZFsxXSA9IDB4MDE7CS8qIFNwYWNlIEZpbGVNYXJrcyAqLworCQljbWRbMl0gPSAoYXJnID4+IDE2KTsKKwkJY21kWzNdID0gKGFyZyA+PiA4KTsKKwkJY21kWzRdID0gYXJnOworICAgICAgICAgICAgICAgIERFQkMoZGViX3NwYWNlX3ByaW50KG5hbWUsIFNUX0RFQl9GT1JXQVJELCAiZmlsZW1hcmtzIiwgY21kKTspCisJCWlmIChmaWxlbm8gPj0gMCkKKwkJCWZpbGVubyArPSBhcmc7CisJCWJsa25vID0gMDsKKwkJYXRfc20gJj0gKGFyZyA9PSAwKTsKKwkJYnJlYWs7CisJY2FzZSBNVEJTRk06CisJCWNoZ19lb2YgPSAwOwkvKiBDaGFuZ2VkIGZyb20gdGhlIEZTRiBhZnRlciB0aGlzICovCisJY2FzZSBNVEJTRjoKKwkJY21kWzBdID0gU1BBQ0U7CisJCWNtZFsxXSA9IDB4MDE7CS8qIFNwYWNlIEZpbGVNYXJrcyAqLworCQlsdG1wID0gKC1hcmcpOworCQljbWRbMl0gPSAobHRtcCA+PiAxNik7CisJCWNtZFszXSA9IChsdG1wID4+IDgpOworCQljbWRbNF0gPSBsdG1wOworICAgICAgICAgICAgICAgIERFQkMoZGViX3NwYWNlX3ByaW50KG5hbWUsIFNUX0RFQl9CQUNLV0FSRCwgImZpbGVtYXJrcyIsIGNtZCk7KQorCQlpZiAoZmlsZW5vID49IDApCisJCQlmaWxlbm8gLT0gYXJnOworCQlibGtubyA9ICgtMSk7CS8qIFdlIGNhbid0IGtub3cgdGhlIGJsb2NrIG51bWJlciAqLworCQlhdF9zbSAmPSAoYXJnID09IDApOworCQlicmVhazsKKwljYXNlIE1URlNSOgorCQljbWRbMF0gPSBTUEFDRTsKKwkJY21kWzFdID0gMHgwMDsJLyogU3BhY2UgQmxvY2tzICovCisJCWNtZFsyXSA9IChhcmcgPj4gMTYpOworCQljbWRbM10gPSAoYXJnID4+IDgpOworCQljbWRbNF0gPSBhcmc7CisgICAgICAgICAgICAgICAgREVCQyhkZWJfc3BhY2VfcHJpbnQobmFtZSwgU1RfREVCX0ZPUldBUkQsICJibG9ja3MiLCBjbWQpOykKKwkJaWYgKGJsa25vID49IDApCisJCQlibGtubyArPSBhcmc7CisJCWF0X3NtICY9IChhcmcgPT0gMCk7CisJCWJyZWFrOworCWNhc2UgTVRCU1I6CisJCWNtZFswXSA9IFNQQUNFOworCQljbWRbMV0gPSAweDAwOwkvKiBTcGFjZSBCbG9ja3MgKi8KKwkJbHRtcCA9ICgtYXJnKTsKKwkJY21kWzJdID0gKGx0bXAgPj4gMTYpOworCQljbWRbM10gPSAobHRtcCA+PiA4KTsKKwkJY21kWzRdID0gbHRtcDsKKyAgICAgICAgICAgICAgICBERUJDKGRlYl9zcGFjZV9wcmludChuYW1lLCBTVF9ERUJfQkFDS1dBUkQsICJibG9ja3MiLCBjbWQpOykKKwkJaWYgKGJsa25vID49IDApCisJCQlibGtubyAtPSBhcmc7CisJCWF0X3NtICY9IChhcmcgPT0gMCk7CisJCWJyZWFrOworCWNhc2UgTVRGU1M6CisJCWNtZFswXSA9IFNQQUNFOworCQljbWRbMV0gPSAweDA0OwkvKiBTcGFjZSBTZXRtYXJrcyAqLworCQljbWRbMl0gPSAoYXJnID4+IDE2KTsKKwkJY21kWzNdID0gKGFyZyA+PiA4KTsKKwkJY21kWzRdID0gYXJnOworICAgICAgICAgICAgICAgIERFQkMoZGViX3NwYWNlX3ByaW50KG5hbWUsIFNUX0RFQl9GT1JXQVJELCAic2V0bWFya3MiLCBjbWQpOykKKwkJaWYgKGFyZyAhPSAwKSB7CisJCQlibGtubyA9IGZpbGVubyA9ICgtMSk7CisJCQlhdF9zbSA9IDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBNVEJTUzoKKwkJY21kWzBdID0gU1BBQ0U7CisJCWNtZFsxXSA9IDB4MDQ7CS8qIFNwYWNlIFNldG1hcmtzICovCisJCWx0bXAgPSAoLWFyZyk7CisJCWNtZFsyXSA9IChsdG1wID4+IDE2KTsKKwkJY21kWzNdID0gKGx0bXAgPj4gOCk7CisJCWNtZFs0XSA9IGx0bXA7CisgICAgICAgICAgICAgICAgREVCQyhkZWJfc3BhY2VfcHJpbnQobmFtZSwgU1RfREVCX0JBQ0tXQVJELCAic2V0bWFya3MiLCBjbWQpOykKKwkJaWYgKGFyZyAhPSAwKSB7CisJCQlibGtubyA9IGZpbGVubyA9ICgtMSk7CisJCQlhdF9zbSA9IDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBNVFdFT0Y6CisJY2FzZSBNVFdTTToKKwkJaWYgKFNUcC0+d3JpdGVfcHJvdCkKKwkJCXJldHVybiAoLUVBQ0NFUyk7CisJCWNtZFswXSA9IFdSSVRFX0ZJTEVNQVJLUzsKKwkJaWYgKGNtZF9pbiA9PSBNVFdTTSkKKwkJCWNtZFsxXSA9IDI7CisJCWNtZFsyXSA9IChhcmcgPj4gMTYpOworCQljbWRbM10gPSAoYXJnID4+IDgpOworCQljbWRbNF0gPSBhcmc7CisJCXRpbWVvdXQgPSBTVHAtPmRldmljZS0+dGltZW91dDsKKyAgICAgICAgICAgICAgICBERUJDKAorICAgICAgICAgICAgICAgICAgICAgaWYgKGNtZF9pbiA9PSBNVFdFT0YpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBXcml0aW5nICVkIGZpbGVtYXJrcy5cbiIsIG5hbWUsCisJCQkJIGNtZFsyXSAqIDY1NTM2ICsgY21kWzNdICogMjU2ICsgY21kWzRdKTsKKyAgICAgICAgICAgICAgICAgICAgIGVsc2UKKwkJCQlwcmludGsoU1RfREVCX01TRyAiJXM6IFdyaXRpbmcgJWQgc2V0bWFya3MuXG4iLCBuYW1lLAorCQkJCSBjbWRbMl0gKiA2NTUzNiArIGNtZFszXSAqIDI1NiArIGNtZFs0XSk7CisJCSkKKwkJaWYgKGZpbGVubyA+PSAwKQorCQkJZmlsZW5vICs9IGFyZzsKKwkJYmxrbm8gPSAwOworCQlhdF9zbSA9IChjbWRfaW4gPT0gTVRXU00pOworCQlicmVhazsKKwljYXNlIE1UUkVXOgorCQljbWRbMF0gPSBSRVpFUk9fVU5JVDsKKwkJaWYgKFNUcC0+aW1tZWRpYXRlKSB7CisJCQljbWRbMV0gPSAxOwkvKiBEb24ndCB3YWl0IGZvciBjb21wbGV0aW9uICovCisJCQl0aW1lb3V0ID0gU1RwLT5kZXZpY2UtPnRpbWVvdXQ7CisJCX0KKyAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogUmV3aW5kaW5nIHRhcGUuXG4iLCBuYW1lKSk7CisJCWZpbGVubyA9IGJsa25vID0gYXRfc20gPSAwOworCQlicmVhazsKKwljYXNlIE1UTk9QOgorICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBObyBvcCBvbiB0YXBlLlxuIiwgbmFtZSkpOworCQlyZXR1cm4gMDsJLyogU2hvdWxkIGRvIHNvbWV0aGluZyA/ICovCisJCWJyZWFrOworCWNhc2UgTVRSRVRFTjoKKwkJY21kWzBdID0gU1RBUlRfU1RPUDsKKwkJaWYgKFNUcC0+aW1tZWRpYXRlKSB7CisJCQljbWRbMV0gPSAxOwkvKiBEb24ndCB3YWl0IGZvciBjb21wbGV0aW9uICovCisJCQl0aW1lb3V0ID0gU1RwLT5kZXZpY2UtPnRpbWVvdXQ7CisJCX0KKwkJY21kWzRdID0gMzsKKyAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogUmV0ZW5zaW9uaW5nIHRhcGUuXG4iLCBuYW1lKSk7CisJCWZpbGVubyA9IGJsa25vID0gYXRfc20gPSAwOworCQlicmVhazsKKwljYXNlIE1URU9NOgorCQlpZiAoIVNUcC0+ZmFzdF9tdGVvbSkgeworCQkJLyogc3BhY2UgdG8gdGhlIGVuZCBvZiB0YXBlICovCisJCQlpb2N0bF9yZXN1bHQgPSBzdF9pbnRfaW9jdGwoU1RwLCBNVEZTRiwgMHg3ZmZmZmYpOworCQkJZmlsZW5vID0gU1Rwcy0+ZHJ2X2ZpbGU7CisJCQlpZiAoU1Rwcy0+ZW9mID49IFNUX0VPRF8xKQorCQkJCXJldHVybiAwOworCQkJLyogVGhlIG5leHQgbGluZXMgd291bGQgaGlkZSB0aGUgbnVtYmVyIG9mIHNwYWNlZCBGaWxlTWFya3MKKwkJCSAgIFRoYXQncyB3aHkgSSBpbnNlcnRlZCB0aGUgcHJldmlvdXMgbGluZXMuIEkgaGFkIG5vIGx1Y2sKKwkJCSAgIHdpdGggZGV0ZWN0aW5nIEVPTSB3aXRoIEZTRiwgc28gd2UgZ28gbm93IHRvIEVPTS4KKwkJCSAgIEpvZXJnIFdldWxlICovCisJCX0gZWxzZQorCQkJZmlsZW5vID0gKC0xKTsKKwkJY21kWzBdID0gU1BBQ0U7CisJCWNtZFsxXSA9IDM7CisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IFNwYWNpbmcgdG8gZW5kIG9mIHJlY29yZGVkIG1lZGl1bS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSkpOworCQlibGtubyA9IC0xOworCQlhdF9zbSA9IDA7CisJCWJyZWFrOworCWNhc2UgTVRFUkFTRToKKwkJaWYgKFNUcC0+d3JpdGVfcHJvdCkKKwkJCXJldHVybiAoLUVBQ0NFUyk7CisJCWNtZFswXSA9IEVSQVNFOworCQljbWRbMV0gPSAoYXJnID8gMSA6IDApOwkvKiBMb25nIGVyYXNlIHdpdGggbm9uLXplcm8gYXJndW1lbnQgKi8KKwkJaWYgKFNUcC0+aW1tZWRpYXRlKSB7CisJCQljbWRbMV0gfD0gMjsJLyogRG9uJ3Qgd2FpdCBmb3IgY29tcGxldGlvbiAqLworCQkJdGltZW91dCA9IFNUcC0+ZGV2aWNlLT50aW1lb3V0OworCQl9CisJCWVsc2UKKwkJCXRpbWVvdXQgPSBTVHAtPmxvbmdfdGltZW91dCAqIDg7CisKKyAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogRXJhc2luZyB0YXBlLlxuIiwgbmFtZSkpOworCQlmaWxlbm8gPSBibGtubyA9IGF0X3NtID0gMDsKKwkJYnJlYWs7CisJY2FzZSBNVFNFVEJMSzoJCS8qIFNldCBibG9jayBsZW5ndGggKi8KKwljYXNlIE1UU0VUREVOU0lUWToJLyogU2V0IHRhcGUgZGVuc2l0eSAqLworCWNhc2UgTVRTRVREUlZCVUZGRVI6CS8qIFNldCBkcml2ZSBidWZmZXJpbmcgKi8KKwljYXNlIFNFVF9ERU5TX0FORF9CTEs6CS8qIFNldCBkZW5zaXR5IGFuZCBibG9jayBzaXplICovCisJCWNoZ19lb2YgPSAwOworCQlpZiAoU1RwLT5kaXJ0eSB8fCAoU1RwLT5idWZmZXIpLT5idWZmZXJfYnl0ZXMgIT0gMCkKKwkJCXJldHVybiAoLUVJTyk7CS8qIE5vdCBhbGxvd2VkIGlmIGRhdGEgaW4gYnVmZmVyICovCisJCWlmICgoY21kX2luID09IE1UU0VUQkxLIHx8IGNtZF9pbiA9PSBTRVRfREVOU19BTkRfQkxLKSAmJgorCQkgICAgKGFyZyAmIE1UX1NUX0JMS1NJWkVfTUFTSykgIT0gMCAmJgorCQkgICAgU1RwLT5tYXhfYmxvY2sgPiAwICYmCisJCSAgICAoKGFyZyAmIE1UX1NUX0JMS1NJWkVfTUFTSykgPCBTVHAtPm1pbl9ibG9jayB8fAorCQkgICAgIChhcmcgJiBNVF9TVF9CTEtTSVpFX01BU0spID4gU1RwLT5tYXhfYmxvY2spKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSWxsZWdhbCBibG9jayBzaXplLlxuIiwgbmFtZSk7CisJCQlyZXR1cm4gKC1FSU5WQUwpOworCQl9CisJCWNtZFswXSA9IE1PREVfU0VMRUNUOworCQlpZiAoKFNUcC0+dXNlX3BmICYgVVNFX1BGKSkKKwkJCWNtZFsxXSA9IE1PREVfU0VMRUNUX1BBR0VfRk9STUFUOworCQljbWRbNF0gPSBkYXRhbGVuID0gMTI7CisJCWRpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7CisKKwkJbWVtc2V0KChTVHAtPmJ1ZmZlciktPmJfZGF0YSwgMCwgMTIpOworCQlpZiAoY21kX2luID09IE1UU0VURFJWQlVGRkVSKQorCQkJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzJdID0gKGFyZyAmIDcpIDw8IDQ7CisJCWVsc2UKKwkJCShTVHAtPmJ1ZmZlciktPmJfZGF0YVsyXSA9CisJCQkgICAgU1RwLT5kcnZfYnVmZmVyIDw8IDQ7CisJCShTVHAtPmJ1ZmZlciktPmJfZGF0YVszXSA9IDg7CS8qIGJsb2NrIGRlc2NyaXB0b3IgbGVuZ3RoICovCisJCWlmIChjbWRfaW4gPT0gTVRTRVRERU5TSVRZKSB7CisJCQkoU1RwLT5idWZmZXIpLT5iX2RhdGFbNF0gPSBhcmc7CisJCQlTVHAtPmRlbnNpdHlfY2hhbmdlZCA9IDE7CS8qIEF0IGxlYXN0IHdlIHRyaWVkIDstKSAqLworCQl9IGVsc2UgaWYgKGNtZF9pbiA9PSBTRVRfREVOU19BTkRfQkxLKQorCQkJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzRdID0gYXJnID4+IDI0OworCQllbHNlCisJCQkoU1RwLT5idWZmZXIpLT5iX2RhdGFbNF0gPSBTVHAtPmRlbnNpdHk7CisJCWlmIChjbWRfaW4gPT0gTVRTRVRCTEsgfHwgY21kX2luID09IFNFVF9ERU5TX0FORF9CTEspIHsKKwkJCWx0bXAgPSBhcmcgJiBNVF9TVF9CTEtTSVpFX01BU0s7CisJCQlpZiAoY21kX2luID09IE1UU0VUQkxLKQorCQkJCVNUcC0+Ymxrc2l6ZV9jaGFuZ2VkID0gMTsgLyogQXQgbGVhc3Qgd2UgdHJpZWQgOy0pICovCisJCX0gZWxzZQorCQkJbHRtcCA9IFNUcC0+YmxvY2tfc2l6ZTsKKwkJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzldID0gKGx0bXAgPj4gMTYpOworCQkoU1RwLT5idWZmZXIpLT5iX2RhdGFbMTBdID0gKGx0bXAgPj4gOCk7CisJCShTVHAtPmJ1ZmZlciktPmJfZGF0YVsxMV0gPSBsdG1wOworCQl0aW1lb3V0ID0gU1RwLT5kZXZpY2UtPnRpbWVvdXQ7CisgICAgICAgICAgICAgICAgREVCQygKKwkJCWlmIChjbWRfaW4gPT0gTVRTRVRCTEsgfHwgY21kX2luID09IFNFVF9ERU5TX0FORF9CTEspCisJCQkJcHJpbnRrKFNUX0RFQl9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogU2V0dGluZyBibG9jayBzaXplIHRvICVkIGJ5dGVzLlxuIiwgbmFtZSwKKwkJCQkgICAgICAgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzldICogNjU1MzYgKworCQkJCSAgICAgICAoU1RwLT5idWZmZXIpLT5iX2RhdGFbMTBdICogMjU2ICsKKwkJCQkgICAgICAgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzExXSk7CisJCQlpZiAoY21kX2luID09IE1UU0VUREVOU0lUWSB8fCBjbWRfaW4gPT0gU0VUX0RFTlNfQU5EX0JMSykKKwkJCQlwcmludGsoU1RfREVCX01TRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBTZXR0aW5nIGRlbnNpdHkgY29kZSB0byAleC5cbiIsIG5hbWUsCisJCQkJICAgICAgIChTVHAtPmJ1ZmZlciktPmJfZGF0YVs0XSk7CisJCQlpZiAoY21kX2luID09IE1UU0VURFJWQlVGRkVSKQorCQkJCXByaW50ayhTVF9ERUJfTVNHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFNldHRpbmcgZHJpdmUgYnVmZmVyIGNvZGUgdG8gJWQuXG4iLCBuYW1lLAorCQkJCSAgICAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzJdID4+IDQpICYgNyk7CisJCSkKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuICgtRU5PU1lTKTsKKwl9CisKKwlTUnBudCA9IHN0X2RvX3Njc2koTlVMTCwgU1RwLCBjbWQsIGRhdGFsZW4sIGRpcmVjdGlvbiwKKwkJCSAgIHRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKwlpZiAoIVNScG50KQorCQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CisKKwlpb2N0bF9yZXN1bHQgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKworCWlmICghaW9jdGxfcmVzdWx0KSB7CS8qIFNDU0kgY29tbWFuZCBzdWNjZXNzZnVsICovCisJCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwkJU1JwbnQgPSBOVUxMOworCQlTVHBzLT5kcnZfYmxvY2sgPSBibGtubzsKKwkJU1Rwcy0+ZHJ2X2ZpbGUgPSBmaWxlbm87CisJCVNUcHMtPmF0X3NtID0gYXRfc207CisKKwkJaWYgKGNtZF9pbiA9PSBNVEJTRk0pCisJCQlpb2N0bF9yZXN1bHQgPSBzdF9pbnRfaW9jdGwoU1RwLCBNVEZTRiwgMSk7CisJCWVsc2UgaWYgKGNtZF9pbiA9PSBNVEZTRk0pCisJCQlpb2N0bF9yZXN1bHQgPSBzdF9pbnRfaW9jdGwoU1RwLCBNVEJTRiwgMSk7CisKKwkJaWYgKGNtZF9pbiA9PSBNVFNFVEJMSyB8fCBjbWRfaW4gPT0gU0VUX0RFTlNfQU5EX0JMSykgeworCQkJaW50IG9sZF9ibG9ja19zaXplID0gU1RwLT5ibG9ja19zaXplOworCQkJU1RwLT5ibG9ja19zaXplID0gYXJnICYgTVRfU1RfQkxLU0laRV9NQVNLOworCQkJaWYgKFNUcC0+YmxvY2tfc2l6ZSAhPSAwKSB7CisJCQkJaWYgKG9sZF9ibG9ja19zaXplID09IDApCisJCQkJCW5vcm1hbGl6ZV9idWZmZXIoU1RwLT5idWZmZXIpOworCQkJCShTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ibG9ja3MgPQorCQkJCSAgICAoU1RwLT5idWZmZXIpLT5idWZmZXJfc2l6ZSAvIFNUcC0+YmxvY2tfc2l6ZTsKKwkJCX0KKwkJCShTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyA9IChTVHAtPmJ1ZmZlciktPnJlYWRfcG9pbnRlciA9IDA7CisJCQlpZiAoY21kX2luID09IFNFVF9ERU5TX0FORF9CTEspCisJCQkJU1RwLT5kZW5zaXR5ID0gYXJnID4+IE1UX1NUX0RFTlNJVFlfU0hJRlQ7CisJCX0gZWxzZSBpZiAoY21kX2luID09IE1UU0VURFJWQlVGRkVSKQorCQkJU1RwLT5kcnZfYnVmZmVyID0gKGFyZyAmIDcpOworCQllbHNlIGlmIChjbWRfaW4gPT0gTVRTRVRERU5TSVRZKQorCQkJU1RwLT5kZW5zaXR5ID0gYXJnOworCisJCWlmIChjbWRfaW4gPT0gTVRFT00pCisJCQlTVHBzLT5lb2YgPSBTVF9FT0Q7CisJCWVsc2UgaWYgKGNtZF9pbiA9PSBNVEZTRikKKwkJCVNUcHMtPmVvZiA9IFNUX0ZNOworCQllbHNlIGlmIChjaGdfZW9mKQorCQkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisKKwkJaWYgKGNtZF9pbiA9PSBNVFdFT0YpCisJCQlTVHBzLT5ydyA9IFNUX0lETEU7CisJfSBlbHNlIHsgLyogU0NTSSBjb21tYW5kIHdhcyBub3QgY29tcGxldGVseSBzdWNjZXNzZnVsLiBEb24ndCByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGlzIGJsb2NrIHdpdGhvdXQgcmVsZWFzaW5nIHRoZSBTQ1NJIGNvbW1hbmQgYmxvY2shICovCisJCXN0cnVjdCBzdF9jbWRzdGF0dXMgKmNtZHN0YXRwID0gJlNUcC0+YnVmZmVyLT5jbWRzdGF0OworCisJCWlmIChjbWRzdGF0cC0+ZmxhZ3MgJiBTRU5TRV9FT00pIHsKKwkJCWlmIChjbWRfaW4gIT0gTVRCU0YgJiYgY21kX2luICE9IE1UQlNGTSAmJgorCQkJICAgIGNtZF9pbiAhPSBNVEJTUiAmJiBjbWRfaW4gIT0gTVRCU1MpCisJCQkJU1Rwcy0+ZW9mID0gU1RfRU9NX09LOworCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gMDsKKwkJfQorCisJCWlmIChjbWRzdGF0cC0+cmVtYWluZGVyX3ZhbGlkKQorCQkJdW5kb25lID0gKGludCljbWRzdGF0cC0+dXJlbWFpbmRlcjY0OworCQllbHNlCisJCQl1bmRvbmUgPSAwOworCisJCWlmIChjbWRfaW4gPT0gTVRXRU9GICYmCisJCSAgICBjbWRzdGF0cC0+aGF2ZV9zZW5zZSAmJgorCQkgICAgKGNtZHN0YXRwLT5mbGFncyAmIFNFTlNFX0VPTSkgJiYKKwkJICAgIChjbWRzdGF0cC0+c2Vuc2VfaGRyLnNlbnNlX2tleSA9PSBOT19TRU5TRSB8fAorCQkgICAgIGNtZHN0YXRwLT5zZW5zZV9oZHIuc2Vuc2Vfa2V5ID09IFJFQ09WRVJFRF9FUlJPUikgJiYKKwkJICAgIHVuZG9uZSA9PSAwKSB7CisJCQlpb2N0bF9yZXN1bHQgPSAwOwkvKiBFT0Ygd3JpdHRlbiBzdWNjZXNmdWxseSBhdCBFT00gKi8KKwkJCWlmIChmaWxlbm8gPj0gMCkKKwkJCQlmaWxlbm8rKzsKKwkJCVNUcHMtPmRydl9maWxlID0gZmlsZW5vOworCQkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisJCX0gZWxzZSBpZiAoKGNtZF9pbiA9PSBNVEZTRikgfHwgKGNtZF9pbiA9PSBNVEZTRk0pKSB7CisJCQlpZiAoZmlsZW5vID49IDApCisJCQkJU1Rwcy0+ZHJ2X2ZpbGUgPSBmaWxlbm8gLSB1bmRvbmU7CisJCQllbHNlCisJCQkJU1Rwcy0+ZHJ2X2ZpbGUgPSBmaWxlbm87CisJCQlTVHBzLT5kcnZfYmxvY2sgPSAtMTsKKwkJCVNUcHMtPmVvZiA9IFNUX05PRU9GOworCQl9IGVsc2UgaWYgKChjbWRfaW4gPT0gTVRCU0YpIHx8IChjbWRfaW4gPT0gTVRCU0ZNKSkgeworCQkJaWYgKGFyZyA+IDAgJiYgdW5kb25lIDwgMCkgIC8qIFNvbWUgZHJpdmVzIGdldCB0aGlzIHdyb25nICovCisJCQkJdW5kb25lID0gKC11bmRvbmUpOworCQkJaWYgKFNUcHMtPmRydl9maWxlID49IDApCisJCQkJU1Rwcy0+ZHJ2X2ZpbGUgPSBmaWxlbm8gKyB1bmRvbmU7CisJCQlTVHBzLT5kcnZfYmxvY2sgPSAwOworCQkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisJCX0gZWxzZSBpZiAoY21kX2luID09IE1URlNSKSB7CisJCQlpZiAoY21kc3RhdHAtPmZsYWdzICYgU0VOU0VfRk1LKSB7CS8qIEhpdCBmaWxlbWFyayAqLworCQkJCWlmIChTVHBzLT5kcnZfZmlsZSA+PSAwKQorCQkJCQlTVHBzLT5kcnZfZmlsZSsrOworCQkJCVNUcHMtPmRydl9ibG9jayA9IDA7CisJCQkJU1Rwcy0+ZW9mID0gU1RfRk07CisJCQl9IGVsc2UgeworCQkJCWlmIChibGtubyA+PSB1bmRvbmUpCisJCQkJCVNUcHMtPmRydl9ibG9jayA9IGJsa25vIC0gdW5kb25lOworCQkJCWVsc2UKKwkJCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gKC0xKTsKKwkJCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKwkJCX0KKwkJfSBlbHNlIGlmIChjbWRfaW4gPT0gTVRCU1IpIHsKKwkJCWlmIChjbWRzdGF0cC0+ZmxhZ3MgJiBTRU5TRV9GTUspIHsJLyogSGl0IGZpbGVtYXJrICovCisJCQkJU1Rwcy0+ZHJ2X2ZpbGUtLTsKKwkJCQlTVHBzLT5kcnZfYmxvY2sgPSAoLTEpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoYXJnID4gMCAmJiB1bmRvbmUgPCAwKSAgLyogU29tZSBkcml2ZXMgZ2V0IHRoaXMgd3JvbmcgKi8KKwkJCQkJdW5kb25lID0gKC11bmRvbmUpOworCQkJCWlmIChTVHBzLT5kcnZfYmxvY2sgPj0gMCkKKwkJCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gYmxrbm8gKyB1bmRvbmU7CisJCQl9CisJCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKwkJfSBlbHNlIGlmIChjbWRfaW4gPT0gTVRFT00pIHsKKwkJCVNUcHMtPmRydl9maWxlID0gKC0xKTsKKwkJCVNUcHMtPmRydl9ibG9jayA9ICgtMSk7CisJCQlTVHBzLT5lb2YgPSBTVF9FT0Q7CisJCX0gZWxzZSBpZiAoY21kX2luID09IE1UU0VUQkxLIHx8CisJCQkgICBjbWRfaW4gPT0gTVRTRVRERU5TSVRZIHx8CisJCQkgICBjbWRfaW4gPT0gTVRTRVREUlZCVUZGRVIgfHwKKwkJCSAgIGNtZF9pbiA9PSBTRVRfREVOU19BTkRfQkxLKSB7CisJCQlpZiAoY21kc3RhdHAtPnNlbnNlX2hkci5zZW5zZV9rZXkgPT0gSUxMRUdBTF9SRVFVRVNUICYmCisJCQkgICAgIShTVHAtPnVzZV9wZiAmIFBGX1RFU1RFRCkpIHsKKwkJCQkvKiBUcnkgdGhlIG90aGVyIHBvc3NpYmxlIHN0YXRlIG9mIFBhZ2UgRm9ybWF0IGlmIG5vdAorCQkJCSAgIGFscmVhZHkgdHJpZWQgKi8KKwkJCQlTVHAtPnVzZV9wZiA9ICFTVHAtPnVzZV9wZiB8IFBGX1RFU1RFRDsKKwkJCQlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJCQkJU1JwbnQgPSBOVUxMOworCQkJCXJldHVybiBzdF9pbnRfaW9jdGwoU1RwLCBjbWRfaW4sIGFyZyk7CisJCQl9CisJCX0gZWxzZSBpZiAoY2hnX2VvZikKKwkJCVNUcHMtPmVvZiA9IFNUX05PRU9GOworCisJCWlmIChjbWRzdGF0cC0+c2Vuc2VfaGRyLnNlbnNlX2tleSA9PSBCTEFOS19DSEVDSykKKwkJCVNUcHMtPmVvZiA9IFNUX0VPRDsKKworCQlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJCVNScG50ID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gaW9jdGxfcmVzdWx0OworfQorDAorCisvKiBHZXQgdGhlIHRhcGUgcG9zaXRpb24uIElmIGJ0ID09IDIsIGFyZyBwb2ludHMgaW50byBhIGtlcm5lbCBzcGFjZSBtdF9sb2MKKyAgIHN0cnVjdHVyZS4gKi8KKworc3RhdGljIGludCBnZXRfbG9jYXRpb24oc3RydWN0IHNjc2lfdGFwZSAqU1RwLCB1bnNpZ25lZCBpbnQgKmJsb2NrLCBpbnQgKnBhcnRpdGlvbiwKKwkJCWludCBsb2dpY2FsKQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgY2hhciBzY21kW01BWF9DT01NQU5EX1NJWkVdOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50OworCURFQiggY2hhciAqbmFtZSA9IHRhcGVfbmFtZShTVHApOyApCisKKwlpZiAoU1RwLT5yZWFkeSAhPSBTVF9SRUFEWSkKKwkJcmV0dXJuICgtRUlPKTsKKworCW1lbXNldChzY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwlpZiAoKFNUcC0+ZGV2aWNlKS0+c2NzaV9sZXZlbCA8IFNDU0lfMikgeworCQlzY21kWzBdID0gUUZBX1JFUVVFU1RfQkxPQ0s7CisJCXNjbWRbNF0gPSAzOworCX0gZWxzZSB7CisJCXNjbWRbMF0gPSBSRUFEX1BPU0lUSU9OOworCQlpZiAoIWxvZ2ljYWwgJiYgIVNUcC0+c2NzaTJfbG9naWNhbCkKKwkJCXNjbWRbMV0gPSAxOworCX0KKwlTUnBudCA9IHN0X2RvX3Njc2koTlVMTCwgU1RwLCBzY21kLCAyMCwgRE1BX0ZST01fREVWSUNFLAorCQkJU1RwLT5kZXZpY2UtPnRpbWVvdXQsIE1BWF9SRUFEWV9SRVRSSUVTLCAxKTsKKwlpZiAoIVNScG50KQorCQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CisKKwlpZiAoKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgIT0gMCB8fAorCSAgICAoU1RwLT5kZXZpY2UtPnNjc2lfbGV2ZWwgPj0gU0NTSV8yICYmCisJICAgICAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzBdICYgNCkgIT0gMCkpIHsKKwkJKmJsb2NrID0gKnBhcnRpdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IENhbid0IHJlYWQgdGFwZSBwb3NpdGlvbi5cbiIsIG5hbWUpKTsKKwkJcmVzdWx0ID0gKC1FSU8pOworCX0gZWxzZSB7CisJCXJlc3VsdCA9IDA7CisJCWlmICgoU1RwLT5kZXZpY2UpLT5zY3NpX2xldmVsIDwgU0NTSV8yKSB7CisJCQkqYmxvY2sgPSAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzBdIDw8IDE2KQorCQkJICAgICsgKChTVHAtPmJ1ZmZlciktPmJfZGF0YVsxXSA8PCA4KQorCQkJICAgICsgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzJdOworCQkJKnBhcnRpdGlvbiA9IDA7CisJCX0gZWxzZSB7CisJCQkqYmxvY2sgPSAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzRdIDw8IDI0KQorCQkJICAgICsgKChTVHAtPmJ1ZmZlciktPmJfZGF0YVs1XSA8PCAxNikKKwkJCSAgICArICgoU1RwLT5idWZmZXIpLT5iX2RhdGFbNl0gPDwgOCkKKwkJCSAgICArIChTVHAtPmJ1ZmZlciktPmJfZGF0YVs3XTsKKwkJCSpwYXJ0aXRpb24gPSAoU1RwLT5idWZmZXIpLT5iX2RhdGFbMV07CisJCQlpZiAoKChTVHAtPmJ1ZmZlciktPmJfZGF0YVswXSAmIDB4ODApICYmCisJCQkgICAgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzFdID09IDApCS8qIEJPUCBvZiBwYXJ0aXRpb24gMCAqLworCQkJCVNUcC0+cHNbMF0uZHJ2X2Jsb2NrID0gU1RwLT5wc1swXS5kcnZfZmlsZSA9IDA7CisJCX0KKyAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogR290IHRhcGUgcG9zLiBibGsgJWQgcGFydCAlZC5cbiIsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJsb2NrLCAqcGFydGl0aW9uKSk7CisJfQorCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwlTUnBudCA9IE5VTEw7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qIFNldCB0aGUgdGFwZSBibG9jayBhbmQgcGFydGl0aW9uLiBOZWdhdGl2ZSBwYXJ0aXRpb24gbWVhbnMgdGhhdCBvbmx5IHRoZQorICAgYmxvY2sgc2hvdWxkIGJlIHNldCBpbiB2ZW5kb3Igc3BlY2lmaWMgd2F5LiAqLworc3RhdGljIGludCBzZXRfbG9jYXRpb24oc3RydWN0IHNjc2lfdGFwZSAqU1RwLCB1bnNpZ25lZCBpbnQgYmxvY2ssIGludCBwYXJ0aXRpb24sCisJCQlpbnQgbG9naWNhbCkKK3sKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgKlNUcHM7CisJaW50IHJlc3VsdCwgcDsKKwl1bnNpZ25lZCBpbnQgYmxrOworCWludCB0aW1lb3V0OworCXVuc2lnbmVkIGNoYXIgc2NtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudDsKKwlERUIoIGNoYXIgKm5hbWUgPSB0YXBlX25hbWUoU1RwKTsgKQorCisJaWYgKFNUcC0+cmVhZHkgIT0gU1RfUkVBRFkpCisJCXJldHVybiAoLUVJTyk7CisJdGltZW91dCA9IFNUcC0+bG9uZ190aW1lb3V0OworCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKKworICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogU2V0dGluZyBibG9jayB0byAlZCBhbmQgcGFydGl0aW9uIHRvICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgbmFtZSwgYmxvY2ssIHBhcnRpdGlvbikpOworCURFQihpZiAocGFydGl0aW9uIDwgMCkKKwkJcmV0dXJuICgtRUlPKTsgKQorCisJLyogVXBkYXRlIHRoZSBsb2NhdGlvbiBhdCB0aGUgcGFydGl0aW9uIHdlIGFyZSBsZWF2aW5nICovCisJaWYgKCghU1RwLT5jYW5fcGFydGl0aW9ucyAmJiBwYXJ0aXRpb24gIT0gMCkgfHwKKwkgICAgcGFydGl0aW9uID49IFNUX05CUl9QQVJUSVRJT05TKQorCQlyZXR1cm4gKC1FSU5WQUwpOworCWlmIChwYXJ0aXRpb24gIT0gU1RwLT5wYXJ0aXRpb24pIHsKKwkJaWYgKGdldF9sb2NhdGlvbihTVHAsICZibGssICZwLCAxKSkKKwkJCVNUcHMtPmxhc3RfYmxvY2tfdmFsaWQgPSAwOworCQllbHNlIHsKKwkJCVNUcHMtPmxhc3RfYmxvY2tfdmFsaWQgPSAxOworCQkJU1Rwcy0+bGFzdF9ibG9ja192aXNpdGVkID0gYmxrOworICAgICAgICAgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWaXNpdGVkIGJsb2NrICVkIGZvciBwYXJ0aXRpb24gJWQgc2F2ZWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgYmxrLCBTVHAtPnBhcnRpdGlvbikpOworCQl9CisJfQorCisJbWVtc2V0KHNjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCWlmICgoU1RwLT5kZXZpY2UpLT5zY3NpX2xldmVsIDwgU0NTSV8yKSB7CisJCXNjbWRbMF0gPSBRRkFfU0VFS19CTE9DSzsKKwkJc2NtZFsyXSA9IChibG9jayA+PiAxNik7CisJCXNjbWRbM10gPSAoYmxvY2sgPj4gOCk7CisJCXNjbWRbNF0gPSBibG9jazsKKwkJc2NtZFs1XSA9IDA7CisJfSBlbHNlIHsKKwkJc2NtZFswXSA9IFNFRUtfMTA7CisJCXNjbWRbM10gPSAoYmxvY2sgPj4gMjQpOworCQlzY21kWzRdID0gKGJsb2NrID4+IDE2KTsKKwkJc2NtZFs1XSA9IChibG9jayA+PiA4KTsKKwkJc2NtZFs2XSA9IGJsb2NrOworCQlpZiAoIWxvZ2ljYWwgJiYgIVNUcC0+c2NzaTJfbG9naWNhbCkKKwkJCXNjbWRbMV0gPSA0OworCQlpZiAoU1RwLT5wYXJ0aXRpb24gIT0gcGFydGl0aW9uKSB7CisJCQlzY21kWzFdIHw9IDI7CisJCQlzY21kWzhdID0gcGFydGl0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBUcnlpbmcgdG8gY2hhbmdlIHBhcnRpdGlvbiBmcm9tICVkIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgU1RwLT5wYXJ0aXRpb24sIHBhcnRpdGlvbikpOworCQl9CisJfQorCWlmIChTVHAtPmltbWVkaWF0ZSkgeworCQlzY21kWzFdIHw9IDE7CQkvKiBEb24ndCB3YWl0IGZvciBjb21wbGV0aW9uICovCisJCXRpbWVvdXQgPSBTVHAtPmRldmljZS0+dGltZW91dDsKKwl9CisKKwlTUnBudCA9IHN0X2RvX3Njc2koTlVMTCwgU1RwLCBzY21kLCAwLCBETUFfTk9ORSwKKwkJCSAgIHRpbWVvdXQsIE1BWF9SRUFEWV9SRVRSSUVTLCAxKTsKKwlpZiAoIVNScG50KQorCQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CisKKwlTVHBzLT5kcnZfYmxvY2sgPSBTVHBzLT5kcnZfZmlsZSA9ICgtMSk7CisJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisJaWYgKChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ICE9IDApIHsKKwkJcmVzdWx0ID0gKC1FSU8pOworCQlpZiAoU1RwLT5jYW5fcGFydGl0aW9ucyAmJgorCQkgICAgKFNUcC0+ZGV2aWNlKS0+c2NzaV9sZXZlbCA+PSBTQ1NJXzIgJiYKKwkJICAgIChwID0gZmluZF9wYXJ0aXRpb24oU1RwKSkgPj0gMCkKKwkJCVNUcC0+cGFydGl0aW9uID0gcDsKKwl9IGVsc2UgeworCQlpZiAoU1RwLT5jYW5fcGFydGl0aW9ucykgeworCQkJU1RwLT5wYXJ0aXRpb24gPSBwYXJ0aXRpb247CisJCQlTVHBzID0gJihTVHAtPnBzW3BhcnRpdGlvbl0pOworCQkJaWYgKCFTVHBzLT5sYXN0X2Jsb2NrX3ZhbGlkIHx8CisJCQkgICAgU1Rwcy0+bGFzdF9ibG9ja192aXNpdGVkICE9IGJsb2NrKSB7CisJCQkJU1Rwcy0+YXRfc20gPSAwOworCQkJCVNUcHMtPnJ3ID0gU1RfSURMRTsKKwkJCX0KKwkJfSBlbHNlCisJCQlTVHBzLT5hdF9zbSA9IDA7CisJCWlmIChibG9jayA9PSAwKQorCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gU1Rwcy0+ZHJ2X2ZpbGUgPSAwOworCQlyZXN1bHQgPSAwOworCX0KKworCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwlTUnBudCA9IE5VTEw7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qIEZpbmQgdGhlIGN1cnJlbnQgcGFydGl0aW9uIG51bWJlciBmb3IgdGhlIGRyaXZlIHN0YXR1cy4gQ2FsbGVkIGZyb20gb3BlbiBhbmQKKyAgIHJldHVybnMgZWl0aGVyIHBhcnRpdGlvbiBudW1iZXIgb2YgbmVnYXRpdmUgZXJyb3IgY29kZS4gKi8KK3N0YXRpYyBpbnQgZmluZF9wYXJ0aXRpb24oc3RydWN0IHNjc2lfdGFwZSAqU1RwKQoreworCWludCBpLCBwYXJ0aXRpb247CisJdW5zaWduZWQgaW50IGJsb2NrOworCisJaWYgKChpID0gZ2V0X2xvY2F0aW9uKFNUcCwgJmJsb2NrLCAmcGFydGl0aW9uLCAxKSkgPCAwKQorCQlyZXR1cm4gaTsKKwlpZiAocGFydGl0aW9uID49IFNUX05CUl9QQVJUSVRJT05TKQorCQlyZXR1cm4gKC1FSU8pOworCXJldHVybiBwYXJ0aXRpb247Cit9CisKKworLyogQ2hhbmdlIHRoZSBwYXJ0aXRpb24gaWYgbmVjZXNzYXJ5ICovCitzdGF0aWMgaW50IHN3aXRjaF9wYXJ0aXRpb24oc3RydWN0IHNjc2lfdGFwZSAqU1RwKQoreworCXN0cnVjdCBzdF9wYXJ0c3RhdCAqU1RwczsKKworCWlmIChTVHAtPnBhcnRpdGlvbiA9PSBTVHAtPm5ld19wYXJ0aXRpb24pCisJCXJldHVybiAwOworCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5uZXdfcGFydGl0aW9uXSk7CisJaWYgKCFTVHBzLT5sYXN0X2Jsb2NrX3ZhbGlkKQorCQlTVHBzLT5sYXN0X2Jsb2NrX3Zpc2l0ZWQgPSAwOworCXJldHVybiBzZXRfbG9jYXRpb24oU1RwLCBTVHBzLT5sYXN0X2Jsb2NrX3Zpc2l0ZWQsIFNUcC0+bmV3X3BhcnRpdGlvbiwgMSk7Cit9CisMCisvKiBGdW5jdGlvbnMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgdGhlIG1lZGl1bSBwYXJ0aXRpb24gbW9kZSBwYWdlLiAqLworCisjZGVmaW5lIFBBUlRfUEFHRSAgIDB4MTEKKyNkZWZpbmUgUEFSVF9QQUdFX0ZJWEVEX0xFTkdUSCA4CisKKyNkZWZpbmUgUFBfT0ZGX01BWF9BRERfUEFSVFMgICAyCisjZGVmaW5lIFBQX09GRl9OQlJfQUREX1BBUlRTICAgMworI2RlZmluZSBQUF9PRkZfRkxBR1MgICAgICAgICAgIDQKKyNkZWZpbmUgUFBfT0ZGX1BBUlRfVU5JVFMgICAgICA2CisjZGVmaW5lIFBQX09GRl9SRVNFUlZFRCAgICAgICAgNworCisjZGVmaW5lIFBQX0JJVF9JRFAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBQUF9NU0tfUFNVTV9NQiAgICAgICAgIDB4MTAKKworLyogR2V0IHRoZSBudW1iZXIgb2YgcGFydGl0aW9ucyBvbiB0aGUgdGFwZS4gQXMgYSBzaWRlIGVmZmVjdCByZWFkcyB0aGUKKyAgIG1vZGUgcGFnZSBpbnRvIHRoZSB0YXBlIGJ1ZmZlci4gKi8KK3N0YXRpYyBpbnQgbmJyX3BhcnRpdGlvbnMoc3RydWN0IHNjc2lfdGFwZSAqU1RwKQoreworCWludCByZXN1bHQ7CisJREVCKCBjaGFyICpuYW1lID0gdGFwZV9uYW1lKFNUcCk7ICkKKworCWlmIChTVHAtPnJlYWR5ICE9IFNUX1JFQURZKQorCQlyZXR1cm4gKC1FSU8pOworCisJcmVzdWx0ID0gcmVhZF9tb2RlX3BhZ2UoU1RwLCBQQVJUX1BBR0UsIDEpOworCisJaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBDYW4ndCByZWFkIG1lZGl1bSBwYXJ0aXRpb24gcGFnZS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSkpOworCQlyZXN1bHQgPSAoLUVJTyk7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArCisJCQkJCSAgICAgIFBQX09GRl9OQlJfQUREX1BBUlRTXSArIDE7CisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IE51bWJlciBvZiBwYXJ0aXRpb25zICVkLlxuIiwgbmFtZSwgcmVzdWx0KSk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBQYXJ0aXRpb24gdGhlIHRhcGUgaW50byB0d28gcGFydGl0aW9ucyBpZiBzaXplID4gMCBvciBvbmUgcGFydGl0aW9uIGlmCisgICBzaXplID09IDAuCisKKyAgIFRoZSBibG9jayBkZXNjcmlwdG9ycyBhcmUgcmVhZCBhbmQgd3JpdHRlbiBiZWNhdXNlIFNvbnkgU0RULTcwMDAgZG9lcyBub3QKKyAgIHdvcmsgd2l0aG91dCB0aGlzIChzdWdnZXN0aW9uIGZyb20gTWljaGFlbCBTY2hhZWZlciA8TWljaGFlbC5TY2hhZWZlckBkbHIuZGU+KS4KKworICAgTXkgSFAgQzE1MzNBIGRyaXZlIHJldHVybnMgb25seSBvbmUgcGFydGl0aW9uIHNpemUgZmllbGQuIFRoaXMgaXMgdXNlZCB0bworICAgc2V0IHRoZSBzaXplIG9mIHBhcnRpdGlvbiAxLiBUaGVyZSBpcyBubyBzaXplIGZpZWxkIGZvciB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uCisgICBNaWNoYWVsIFNjaGFlZmVyJ3MgU29ueSBTRFQtNzAwMCByZXR1cm5zIHR3byBkZXNjcmlwdG9ycyBhbmQgdGhlIHNlY29uZCBpcworICAgdXNlZCB0byBzZXQgdGhlIHNpemUgb2YgcGFydGl0aW9uIDEgKHRoaXMgaXMgd2hhdCB0aGUgU0NTSS0zIHN0YW5kYXJkIHNwZWNpZmllcykuCisgICBUaGUgZm9sbG93aW5nIGFsZ29yaXRobSBpcyB1c2VkIHRvIGFjY29tbW9kYXRlIGJvdGggZHJpdmVzOiBpZiB0aGUgbnVtYmVyIG9mCisgICBwYXJ0aXRpb24gc2l6ZSBmaWVsZHMgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhZGRpdGlvbmFsIHBhcnRpdGlvbnMKKyAgIGluIHRoZSBtb2RlIHBhZ2UsIHRoZSBzZWNvbmQgZmllbGQgaXMgdXNlZC4gT3RoZXJ3aXNlIHRoZSBmaXJzdCBmaWVsZCBpcyB1c2VkLgorCisgICBGb3IgU2VhZ2F0ZSBERFMgZHJpdmVzIHRoZSBwYWdlIGxlbmd0aCBtdXN0IGJlIDggd2hlbiBubyBwYXJ0aXRpb25zIGlzIGRlZmluZWQKKyAgIGFuZCAxMCB3aGVuIDEgcGFydGl0aW9uIGlzIGRlZmluZWQgKGluZm9ybWF0aW9uIGZyb20gRXJpYyBMZWUgR3JlZW4pLiBUaGlzIGlzCisgICBpcyBhY2NlcHRhYmxlIGFsc28gdG8gc29tZSBvdGhlciBvbGQgZHJpdmVzIGFuZCBlbmZvcmNlZCBpZiB0aGUgZmlyc3QgcGFydGl0aW9uCisgICBzaXplIGZpZWxkIGlzIHVzZWQgZm9yIHRoZSBmaXJzdCBhZGRpdGlvbmFsIHBhcnRpdGlvbiBzaXplLgorICovCitzdGF0aWMgaW50IHBhcnRpdGlvbl90YXBlKHN0cnVjdCBzY3NpX3RhcGUgKlNUcCwgaW50IHNpemUpCit7CisJY2hhciAqbmFtZSA9IHRhcGVfbmFtZShTVHApOworCWludCByZXN1bHQ7CisJaW50IHBnbywgcHNkX2NudCwgcHNkbzsKKwl1bnNpZ25lZCBjaGFyICpicDsKKworCXJlc3VsdCA9IHJlYWRfbW9kZV9wYWdlKFNUcCwgUEFSVF9QQUdFLCAwKTsKKwlpZiAocmVzdWx0KSB7CisJCURFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBDYW4ndCByZWFkIHBhcnRpdGlvbiBtb2RlIHBhZ2UuXG4iLCBuYW1lKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCS8qIFRoZSBtb2RlIHBhZ2UgaXMgaW4gdGhlIGJ1ZmZlci4gTGV0J3MgbW9kaWZ5IGl0IGFuZCB3cml0ZSBpdC4gKi8KKwlicCA9IChTVHAtPmJ1ZmZlciktPmJfZGF0YTsKKwlwZ28gPSBNT0RFX0hFQURFUl9MRU5HVEggKyBicFtNSF9PRkZfQkRFU0NTX0xFTkdUSF07CisJREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IFBhcnRpdGlvbiBwYWdlIGxlbmd0aCBpcyAlZCBieXRlcy5cbiIsCisJCSAgICBuYW1lLCBicFtwZ28gKyBNUF9PRkZfUEFHRV9MRU5HVEhdICsgMikpOworCisJcHNkX2NudCA9IChicFtwZ28gKyBNUF9PRkZfUEFHRV9MRU5HVEhdICsgMiAtIFBBUlRfUEFHRV9GSVhFRF9MRU5HVEgpIC8gMjsKKwlwc2RvID0gcGdvICsgUEFSVF9QQUdFX0ZJWEVEX0xFTkdUSDsKKwlpZiAocHNkX2NudCA+IGJwW3BnbyArIFBQX09GRl9NQVhfQUREX1BBUlRTXSkgeworCQlicFtwc2RvXSA9IGJwW3BzZG8gKyAxXSA9IDB4ZmY7ICAvKiBSZXN0IG9mIHRoZSB0YXBlICovCisJCXBzZG8gKz0gMjsKKwl9CisJbWVtc2V0KGJwICsgcHNkbywgMCwgYnBbcGdvICsgUFBfT0ZGX05CUl9BRERfUEFSVFNdICogMik7CisKKwlERUJDKHByaW50aygiJXM6IHBzZF9jbnQgJWQsIG1heC5wYXJ0cyAlZCwgbmJyX3BhcnRzICVkXG4iLCBuYW1lLAorCQkgICAgcHNkX2NudCwgYnBbcGdvICsgUFBfT0ZGX01BWF9BRERfUEFSVFNdLAorCQkgICAgYnBbcGdvICsgUFBfT0ZGX05CUl9BRERfUEFSVFNdKSk7CisKKwlpZiAoc2l6ZSA8PSAwKSB7CisJCWJwW3BnbyArIFBQX09GRl9OQlJfQUREX1BBUlRTXSA9IDA7CisJCWlmIChwc2RfY250IDw9IGJwW3BnbyArIFBQX09GRl9NQVhfQUREX1BBUlRTXSkKKwkJICAgIGJwW3BnbyArIE1QX09GRl9QQUdFX0xFTkdUSF0gPSA2OworICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBGb3JtYXR0aW5nIHRhcGUgd2l0aCBvbmUgcGFydGl0aW9uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKSk7CisJfSBlbHNlIHsKKwkJYnBbcHNkb10gPSAoc2l6ZSA+PiA4KSAmIDB4ZmY7CisJCWJwW3BzZG8gKyAxXSA9IHNpemUgJiAweGZmOworCQlicFtwZ28gKyAzXSA9IDE7CisJCWlmIChicFtwZ28gKyBNUF9PRkZfUEFHRV9MRU5HVEhdIDwgOCkKKwkJICAgIGJwW3BnbyArIE1QX09GRl9QQUdFX0xFTkdUSF0gPSA4OworICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEZvcm1hdHRpbmcgdGFwZSB3aXRoIHR3byBwYXJ0aXRpb25zICgxID0gJWQgTUIpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBzaXplKSk7CisJfQorCWJwW3BnbyArIFBQX09GRl9QQVJUX1VOSVRTXSA9IDA7CisJYnBbcGdvICsgUFBfT0ZGX1JFU0VSVkVEXSA9IDA7CisJYnBbcGdvICsgUFBfT0ZGX0ZMQUdTXSA9IFBQX0JJVF9JRFAgfCBQUF9NU0tfUFNVTV9NQjsKKworCXJlc3VsdCA9IHdyaXRlX21vZGVfcGFnZShTVHAsIFBBUlRfUEFHRSwgMSk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogUGFydGl0aW9uaW5nIG9mIHRhcGUgZmFpbGVkLlxuIiwgbmFtZSk7CisJCXJlc3VsdCA9ICgtRUlPKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorDAorCisKKy8qIFRoZSBpb2N0bCBjb21tYW5kICovCitzdGF0aWMgaW50IHN0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IGNtZF9pbiwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGksIGNtZF9uciwgY21kX3R5cGUsIGJ0OworCWludCByZXR2YWwgPSAwOworCXVuc2lnbmVkIGludCBibGs7CisJc3RydWN0IHNjc2lfdGFwZSAqU1RwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzdF9tb2RlZGVmICpTVG07CisJc3RydWN0IHN0X3BhcnRzdGF0ICpTVHBzOworCWNoYXIgKm5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKwl2b2lkIF9fdXNlciAqcCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJlNUcC0+bG9jaykpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKyAgICAgICAgREVCKAorCWlmIChkZWJ1Z2dpbmcgJiYgIVNUcC0+aW5fdXNlKSB7CisJCXByaW50ayhTVF9ERUJfTVNHICIlczogSW5jb3JyZWN0IGRldmljZS5cbiIsIG5hbWUpOworCQlyZXR2YWwgPSAoLUVJTyk7CisJCWdvdG8gb3V0OworCX0gKSAvKiBlbmQgREVCICovCisKKwlTVG0gPSAmKFNUcC0+bW9kZXNbU1RwLT5jdXJyZW50X21vZGVdKTsKKwlTVHBzID0gJihTVHAtPnBzW1NUcC0+cGFydGl0aW9uXSk7CisKKwkvKgorCSAqIElmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGVycm9yIHJlY292ZXJ5LCBkb24ndCBsZXQgYW55b25lCisJICogZWxzZSB0cnkgYW5kIHVzZSB0aGlzIGRldmljZS4gIEFsc28sIGlmIGVycm9yIHJlY292ZXJ5IGZhaWxzLCBpdAorCSAqIG1heSB0cnkgYW5kIHRha2UgdGhlIGRldmljZSBvZmZsaW5lLCBpbiB3aGljaCBjYXNlIGFsbCBmdXJ0aGVyCisJICogYWNjZXNzIHRvIHRoZSBkZXZpY2UgaXMgcHJvaGliaXRlZC4KKwkgKi8KKwlyZXR2YWwgPSBzY3NpX25vbmJsb2NrYWJsZV9pb2N0bChTVHAtPmRldmljZSwgY21kX2luLCBwLCBmaWxlKTsKKwlpZiAoIXNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhTVHAtPmRldmljZSkgfHwgcmV0dmFsICE9IC1FTk9ERVYpCisJCWdvdG8gb3V0OworCXJldHZhbCA9IDA7CisKKwljbWRfdHlwZSA9IF9JT0NfVFlQRShjbWRfaW4pOworCWNtZF9uciA9IF9JT0NfTlIoY21kX2luKTsKKworCWlmIChjbWRfdHlwZSA9PSBfSU9DX1RZUEUoTVRJT0NUT1ApICYmIGNtZF9uciA9PSBfSU9DX05SKE1USU9DVE9QKSkgeworCQlzdHJ1Y3QgbXRvcCBtdGM7CisKKwkJaWYgKF9JT0NfU0laRShjbWRfaW4pICE9IHNpemVvZihtdGMpKSB7CisJCQlyZXR2YWwgPSAoLUVJTlZBTCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWkgPSBjb3B5X2Zyb21fdXNlcigmbXRjLCBwLCBzaXplb2Yoc3RydWN0IG10b3ApKTsKKwkJaWYgKGkpIHsKKwkJCXJldHZhbCA9ICgtRUZBVUxUKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKG10Yy5tdF9vcCA9PSBNVFNFVERSVkJVRkZFUiAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogTVRTRVREUlZCVUZGRVIgb25seSBhbGxvd2VkIGZvciByb290LlxuIiwgbmFtZSk7CisJCQlyZXR2YWwgPSAoLUVQRVJNKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmICghU1RtLT5kZWZpbmVkICYmCisJCSAgICAobXRjLm10X29wICE9IE1UU0VURFJWQlVGRkVSICYmCisJCSAgICAgKG10Yy5tdF9jb3VudCAmIE1UX1NUX09QVElPTlMpID09IDApKSB7CisJCQlyZXR2YWwgPSAoLUVOWElPKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKCFTVHAtPnBvc191bmtub3duKSB7CisKKwkJCWlmIChTVHBzLT5lb2YgPT0gU1RfRk1fSElUKSB7CisJCQkJaWYgKG10Yy5tdF9vcCA9PSBNVEZTRiB8fCBtdGMubXRfb3AgPT0gTVRGU0ZNIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdGMubXRfb3AgPT0gTVRFT00pIHsKKwkJCQkJbXRjLm10X2NvdW50IC09IDE7CisJCQkJCWlmIChTVHBzLT5kcnZfZmlsZSA+PSAwKQorCQkJCQkJU1Rwcy0+ZHJ2X2ZpbGUgKz0gMTsKKwkJCQl9IGVsc2UgaWYgKG10Yy5tdF9vcCA9PSBNVEJTRiB8fCBtdGMubXRfb3AgPT0gTVRCU0ZNKSB7CisJCQkJCW10Yy5tdF9jb3VudCArPSAxOworCQkJCQlpZiAoU1Rwcy0+ZHJ2X2ZpbGUgPj0gMCkKKwkJCQkJCVNUcHMtPmRydl9maWxlICs9IDE7CisJCQkJfQorCQkJfQorCisJCQlpZiAobXRjLm10X29wID09IE1UU0VFSykgeworCQkJCS8qIE9sZCBwb3NpdGlvbiBtdXN0IGJlIHJlc3RvcmVkIGlmIHBhcnRpdGlvbiB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgKi8KKwkJCQlpID0gIVNUcC0+Y2FuX3BhcnRpdGlvbnMgfHwKKwkJCQkgICAgKFNUcC0+bmV3X3BhcnRpdGlvbiAhPSBTVHAtPnBhcnRpdGlvbik7CisJCQl9IGVsc2UgeworCQkJCWkgPSBtdGMubXRfb3AgPT0gTVRSRVcgfHwgbXRjLm10X29wID09IE1UT0ZGTCB8fAorCQkJCSAgICBtdGMubXRfb3AgPT0gTVRSRVRFTiB8fCBtdGMubXRfb3AgPT0gTVRFT00gfHwKKwkJCQkgICAgbXRjLm10X29wID09IE1UTE9DSyB8fCBtdGMubXRfb3AgPT0gTVRMT0FEIHx8CisJCQkJICAgIG10Yy5tdF9vcCA9PSBNVEZTRiB8fCBtdGMubXRfb3AgPT0gTVRGU0ZNIHx8CisJCQkJICAgIG10Yy5tdF9vcCA9PSBNVEJTRiB8fCBtdGMubXRfb3AgPT0gTVRCU0ZNIHx8CisJCQkJICAgIG10Yy5tdF9vcCA9PSBNVENPTVBSRVNTSU9OOworCQkJfQorCQkJaSA9IGZsdXNoX2J1ZmZlcihTVHAsIGkpOworCQkJaWYgKGkgPCAwKSB7CisJCQkJcmV0dmFsID0gaTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmIChTVHBzLT5ydyA9PSBTVF9XUklUSU5HICYmCisJCQkgICAgKG10Yy5tdF9vcCA9PSBNVFJFVyB8fCBtdGMubXRfb3AgPT0gTVRPRkZMIHx8CisJCQkgICAgIG10Yy5tdF9vcCA9PSBNVFNFRUsgfHwKKwkJCSAgICAgbXRjLm10X29wID09IE1UQlNGIHx8IG10Yy5tdF9vcCA9PSBNVEJTRk0pKSB7CisJCQkJaSA9IHN0X2ludF9pb2N0bChTVHAsIE1UV0VPRiwgMSk7CisJCQkJaWYgKGkgPCAwKSB7CisJCQkJCXJldHZhbCA9IGk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAobXRjLm10X29wID09IE1UQlNGIHx8IG10Yy5tdF9vcCA9PSBNVEJTRk0pCisJCQkJCW10Yy5tdF9jb3VudCsrOworCQkJCVNUcHMtPnJ3ID0gU1RfSURMRTsKKwkJCSAgICAgfQorCisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogSWYgdGhlcmUgd2FzIGEgYnVzIHJlc2V0LCBibG9jayBmdXJ0aGVyIGFjY2VzcworCQkJICogdG8gdGhpcyBkZXZpY2UuICBJZiB0aGUgdXNlciB3YW50cyB0byByZXdpbmQgdGhlIHRhcGUsCisJCQkgKiB0aGVuIHJlc2V0IHRoZSBmbGFnIGFuZCBhbGxvdyBhY2Nlc3MgYWdhaW4uCisJCQkgKi8KKwkJCWlmIChtdGMubXRfb3AgIT0gTVRSRVcgJiYKKwkJCSAgICBtdGMubXRfb3AgIT0gTVRPRkZMICYmCisJCQkgICAgbXRjLm10X29wICE9IE1UUkVURU4gJiYKKwkJCSAgICBtdGMubXRfb3AgIT0gTVRFUkFTRSAmJgorCQkJICAgIG10Yy5tdF9vcCAhPSBNVFNFRUsgJiYKKwkJCSAgICBtdGMubXRfb3AgIT0gTVRFT00pIHsKKwkJCQlyZXR2YWwgPSAoLUVJTyk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlyZXNldF9zdGF0ZShTVHApOworCQkJLyogcmVtb3ZlIHRoaXMgd2hlbiB0aGUgbWlkbGV2ZWwgcHJvcGVybHkgY2xlYXJzIHdhc19yZXNldCAqLworCQkJU1RwLT5kZXZpY2UtPndhc19yZXNldCA9IDA7CisJCX0KKworCQlpZiAobXRjLm10X29wICE9IE1UTk9QICYmIG10Yy5tdF9vcCAhPSBNVFNFVEJMSyAmJgorCQkgICAgbXRjLm10X29wICE9IE1UU0VUREVOU0lUWSAmJiBtdGMubXRfb3AgIT0gTVRXU00gJiYKKwkJICAgIG10Yy5tdF9vcCAhPSBNVFNFVERSVkJVRkZFUiAmJiBtdGMubXRfb3AgIT0gTVRTRVRQQVJUKQorCQkJU1Rwcy0+cncgPSBTVF9JRExFOwkvKiBQcmV2ZW50IGF1dG9tYXRpYyBXRU9GIGFuZCBmc2YgKi8KKworCQlpZiAobXRjLm10X29wID09IE1UT0ZGTCAmJiBTVHAtPmRvb3JfbG9ja2VkICE9IFNUX1VOTE9DS0VEKQorCQkJZG9fZG9vcl9sb2NrKFNUcCwgMCk7CS8qIElnbm9yZSByZXN1bHQhICovCisKKwkJaWYgKG10Yy5tdF9vcCA9PSBNVFNFVERSVkJVRkZFUiAmJgorCQkgICAgKG10Yy5tdF9jb3VudCAmIE1UX1NUX09QVElPTlMpICE9IDApIHsKKwkJCXJldHZhbCA9IHN0X3NldF9vcHRpb25zKFNUcCwgbXRjLm10X2NvdW50KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKG10Yy5tdF9vcCA9PSBNVFNFVFBBUlQpIHsKKwkJCWlmICghU1RwLT5jYW5fcGFydGl0aW9ucyB8fAorCQkJICAgIG10Yy5tdF9jb3VudCA8IDAgfHwgbXRjLm10X2NvdW50ID49IFNUX05CUl9QQVJUSVRJT05TKSB7CisJCQkJcmV0dmFsID0gKC1FSU5WQUwpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaWYgKG10Yy5tdF9jb3VudCA+PSBTVHAtPm5icl9wYXJ0aXRpb25zICYmCisJCQkgICAgKFNUcC0+bmJyX3BhcnRpdGlvbnMgPSBuYnJfcGFydGl0aW9ucyhTVHApKSA8IDApIHsKKwkJCQlyZXR2YWwgPSAoLUVJTyk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpZiAobXRjLm10X2NvdW50ID49IFNUcC0+bmJyX3BhcnRpdGlvbnMpIHsKKwkJCQlyZXR2YWwgPSAoLUVJTlZBTCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlTVHAtPm5ld19wYXJ0aXRpb24gPSBtdGMubXRfY291bnQ7CisJCQlyZXR2YWwgPSAwOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAobXRjLm10X29wID09IE1UTUtQQVJUKSB7CisJCQlpZiAoIVNUcC0+Y2FuX3BhcnRpdGlvbnMpIHsKKwkJCQlyZXR2YWwgPSAoLUVJTlZBTCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpZiAoKGkgPSBzdF9pbnRfaW9jdGwoU1RwLCBNVFJFVywgMCkpIDwgMCB8fAorCQkJICAgIChpID0gcGFydGl0aW9uX3RhcGUoU1RwLCBtdGMubXRfY291bnQpKSA8IDApIHsKKwkJCQlyZXR2YWwgPSBpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJZm9yIChpID0gMDsgaSA8IFNUX05CUl9QQVJUSVRJT05TOyBpKyspIHsKKwkJCQlTVHAtPnBzW2ldLnJ3ID0gU1RfSURMRTsKKwkJCQlTVHAtPnBzW2ldLmF0X3NtID0gMDsKKwkJCQlTVHAtPnBzW2ldLmxhc3RfYmxvY2tfdmFsaWQgPSAwOworCQkJfQorCQkJU1RwLT5wYXJ0aXRpb24gPSBTVHAtPm5ld19wYXJ0aXRpb24gPSAwOworCQkJU1RwLT5uYnJfcGFydGl0aW9ucyA9IDE7CS8qIEJhZCBndWVzcyA/LSkgKi8KKwkJCVNUcHMtPmRydl9ibG9jayA9IFNUcHMtPmRydl9maWxlID0gMDsKKwkJCXJldHZhbCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChtdGMubXRfb3AgPT0gTVRTRUVLKSB7CisJCQlpID0gc2V0X2xvY2F0aW9uKFNUcCwgbXRjLm10X2NvdW50LCBTVHAtPm5ld19wYXJ0aXRpb24sIDApOworCQkJaWYgKCFTVHAtPmNhbl9wYXJ0aXRpb25zKQorCQkJCVNUcC0+cHNbMF0ucncgPSBTVF9JRExFOworCQkJcmV0dmFsID0gaTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKG10Yy5tdF9vcCA9PSBNVFVOTE9BRCB8fCBtdGMubXRfb3AgPT0gTVRPRkZMKSB7CisJCQlyZXR2YWwgPSBkb19sb2FkX3VubG9hZChTVHAsIGZpbGUsIDApOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAobXRjLm10X29wID09IE1UTE9BRCkgeworCQkJcmV0dmFsID0gZG9fbG9hZF91bmxvYWQoU1RwLCBmaWxlLCBtYXgoMSwgbXRjLm10X2NvdW50KSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChtdGMubXRfb3AgPT0gTVRMT0NLIHx8IG10Yy5tdF9vcCA9PSBNVFVOTE9DSykgeworCQkJcmV0dmFsID0gZG9fZG9vcl9sb2NrKFNUcCwgKG10Yy5tdF9vcCA9PSBNVExPQ0spKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKFNUcC0+Y2FuX3BhcnRpdGlvbnMgJiYgU1RwLT5yZWFkeSA9PSBTVF9SRUFEWSAmJgorCQkgICAgKGkgPSBzd2l0Y2hfcGFydGl0aW9uKFNUcCkpIDwgMCkgeworCQkJcmV0dmFsID0gaTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKG10Yy5tdF9vcCA9PSBNVENPTVBSRVNTSU9OKQorCQkJcmV0dmFsID0gc3RfY29tcHJlc3Npb24oU1RwLCAobXRjLm10X2NvdW50ICYgMSkpOworCQllbHNlCisJCQlyZXR2YWwgPSBzdF9pbnRfaW9jdGwoU1RwLCBtdGMubXRfb3AsIG10Yy5tdF9jb3VudCk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoIVNUbS0+ZGVmaW5lZCkgeworCQlyZXR2YWwgPSAoLUVOWElPKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChpID0gZmx1c2hfYnVmZmVyKFNUcCwgMCkpIDwgMCkgeworCQlyZXR2YWwgPSBpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKFNUcC0+Y2FuX3BhcnRpdGlvbnMgJiYKKwkgICAgKGkgPSBzd2l0Y2hfcGFydGl0aW9uKFNUcCkpIDwgMCkgeworCQlyZXR2YWwgPSBpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoY21kX3R5cGUgPT0gX0lPQ19UWVBFKE1USU9DR0VUKSAmJiBjbWRfbnIgPT0gX0lPQ19OUihNVElPQ0dFVCkpIHsKKwkJc3RydWN0IG10Z2V0IG10X3N0YXR1czsKKworCQlpZiAoX0lPQ19TSVpFKGNtZF9pbikgIT0gc2l6ZW9mKHN0cnVjdCBtdGdldCkpIHsKKwkJCSByZXR2YWwgPSAoLUVJTlZBTCk7CisJCQkgZ290byBvdXQ7CisJCX0KKworCQltdF9zdGF0dXMubXRfdHlwZSA9IFNUcC0+dGFwZV90eXBlOworCQltdF9zdGF0dXMubXRfZHNyZWcgPQorCQkgICAgKChTVHAtPmJsb2NrX3NpemUgPDwgTVRfU1RfQkxLU0laRV9TSElGVCkgJiBNVF9TVF9CTEtTSVpFX01BU0spIHwKKwkJICAgICgoU1RwLT5kZW5zaXR5IDw8IE1UX1NUX0RFTlNJVFlfU0hJRlQpICYgTVRfU1RfREVOU0lUWV9NQVNLKTsKKwkJbXRfc3RhdHVzLm10X2Jsa25vID0gU1Rwcy0+ZHJ2X2Jsb2NrOworCQltdF9zdGF0dXMubXRfZmlsZW5vID0gU1Rwcy0+ZHJ2X2ZpbGU7CisJCWlmIChTVHAtPmJsb2NrX3NpemUgIT0gMCkgeworCQkJaWYgKFNUcHMtPnJ3ID09IFNUX1dSSVRJTkcpCisJCQkJbXRfc3RhdHVzLm10X2Jsa25vICs9CisJCQkJICAgIChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyAvIFNUcC0+YmxvY2tfc2l6ZTsKKwkJCWVsc2UgaWYgKFNUcHMtPnJ3ID09IFNUX1JFQURJTkcpCisJCQkJbXRfc3RhdHVzLm10X2Jsa25vIC09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUcC0+YmxvY2tfc2l6ZSAtIDEpIC8gU1RwLT5ibG9ja19zaXplOworCQl9CisKKwkJbXRfc3RhdHVzLm10X2dzdGF0ID0gMDsKKwkJaWYgKFNUcC0+ZHJ2X3dyaXRlX3Byb3QpCisJCQltdF9zdGF0dXMubXRfZ3N0YXQgfD0gR01UX1dSX1BST1QoMHhmZmZmZmZmZik7CisJCWlmIChtdF9zdGF0dXMubXRfYmxrbm8gPT0gMCkgeworCQkJaWYgKG10X3N0YXR1cy5tdF9maWxlbm8gPT0gMCkKKwkJCQltdF9zdGF0dXMubXRfZ3N0YXQgfD0gR01UX0JPVCgweGZmZmZmZmZmKTsKKwkJCWVsc2UKKwkJCQltdF9zdGF0dXMubXRfZ3N0YXQgfD0gR01UX0VPRigweGZmZmZmZmZmKTsKKwkJfQorCQltdF9zdGF0dXMubXRfZXJyZWcgPSAoU1RwLT5yZWNvdmVyX3JlZyA8PCBNVF9TVF9TT0ZURVJSX1NISUZUKTsKKwkJbXRfc3RhdHVzLm10X3Jlc2lkID0gU1RwLT5wYXJ0aXRpb247CisJCWlmIChTVHBzLT5lb2YgPT0gU1RfRU9NX09LIHx8IFNUcHMtPmVvZiA9PSBTVF9FT01fRVJST1IpCisJCQltdF9zdGF0dXMubXRfZ3N0YXQgfD0gR01UX0VPVCgweGZmZmZmZmZmKTsKKwkJZWxzZSBpZiAoU1Rwcy0+ZW9mID49IFNUX0VPTV9PSykKKwkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfRU9EKDB4ZmZmZmZmZmYpOworCQlpZiAoU1RwLT5kZW5zaXR5ID09IDEpCisJCQltdF9zdGF0dXMubXRfZ3N0YXQgfD0gR01UX0RfODAwKDB4ZmZmZmZmZmYpOworCQllbHNlIGlmIChTVHAtPmRlbnNpdHkgPT0gMikKKwkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfRF8xNjAwKDB4ZmZmZmZmZmYpOworCQllbHNlIGlmIChTVHAtPmRlbnNpdHkgPT0gMykKKwkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfRF82MjUwKDB4ZmZmZmZmZmYpOworCQlpZiAoU1RwLT5yZWFkeSA9PSBTVF9SRUFEWSkKKwkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfT05MSU5FKDB4ZmZmZmZmZmYpOworCQlpZiAoU1RwLT5yZWFkeSA9PSBTVF9OT19UQVBFKQorCQkJbXRfc3RhdHVzLm10X2dzdGF0IHw9IEdNVF9EUl9PUEVOKDB4ZmZmZmZmZmYpOworCQlpZiAoU1Rwcy0+YXRfc20pCisJCQltdF9zdGF0dXMubXRfZ3N0YXQgfD0gR01UX1NNKDB4ZmZmZmZmZmYpOworCQlpZiAoU1RtLT5kb19hc3luY193cml0ZXMgfHwKKyAgICAgICAgICAgICAgICAgICAgKFNUbS0+ZG9fYnVmZmVyX3dyaXRlcyAmJiBTVHAtPmJsb2NrX3NpemUgIT0gMCkgfHwKKwkJICAgIFNUcC0+ZHJ2X2J1ZmZlciAhPSAwKQorCQkJbXRfc3RhdHVzLm10X2dzdGF0IHw9IEdNVF9JTV9SRVBfRU4oMHhmZmZmZmZmZik7CisJCWlmIChTVHAtPmNsZWFuaW5nX3JlcSkKKwkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfQ0xOKDB4ZmZmZmZmZmYpOworCisJCWkgPSBjb3B5X3RvX3VzZXIocCwgJm10X3N0YXR1cywgc2l6ZW9mKHN0cnVjdCBtdGdldCkpOworCQlpZiAoaSkgeworCQkJcmV0dmFsID0gKC1FRkFVTFQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlTVHAtPnJlY292ZXJfcmVnID0gMDsJCS8qIENsZWFyIGFmdGVyIHJlYWQgKi8KKwkJcmV0dmFsID0gMDsKKwkJZ290byBvdXQ7CisJfQkJCS8qIEVuZCBvZiBNVElPQ0dFVCAqLworCWlmIChjbWRfdHlwZSA9PSBfSU9DX1RZUEUoTVRJT0NQT1MpICYmIGNtZF9uciA9PSBfSU9DX05SKE1USU9DUE9TKSkgeworCQlzdHJ1Y3QgbXRwb3MgbXRfcG9zOworCQlpZiAoX0lPQ19TSVpFKGNtZF9pbikgIT0gc2l6ZW9mKHN0cnVjdCBtdHBvcykpIHsKKwkJCSByZXR2YWwgPSAoLUVJTlZBTCk7CisJCQkgZ290byBvdXQ7CisJCX0KKwkJaWYgKChpID0gZ2V0X2xvY2F0aW9uKFNUcCwgJmJsaywgJmJ0LCAwKSkgPCAwKSB7CisJCQlyZXR2YWwgPSBpOworCQkJZ290byBvdXQ7CisJCX0KKwkJbXRfcG9zLm10X2Jsa25vID0gYmxrOworCQlpID0gY29weV90b191c2VyKHAsICZtdF9wb3MsIHNpemVvZihzdHJ1Y3QgbXRwb3MpKTsKKwkJaWYgKGkpCisJCQlyZXR2YWwgPSAoLUVGQVVMVCk7CisJCWdvdG8gb3V0OworCX0KKwl1cCgmU1RwLT5sb2NrKTsKKwlzd2l0Y2ggKGNtZF9pbikgeworCQljYXNlIFNDU0lfSU9DVExfR0VUX0lETFVOOgorCQljYXNlIFNDU0lfSU9DVExfR0VUX0JVU19OVU1CRVI6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCQlpID0gLUVQRVJNOworCQkJZWxzZQorCQkJCWkgPSBzY3NpX2NtZF9pb2N0bChmaWxlLCBTVHAtPmRpc2ssIGNtZF9pbiwgcCk7CisJCQlpZiAoaSAhPSAtRU5PVFRZKQorCQkJCXJldHVybiBpOworCQkJYnJlYWs7CisJfQorCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSAmJgorCSAgICAoY21kX2luID09IFNDU0lfSU9DVExfU1RBUlRfVU5JVCB8fCBjbWRfaW4gPT0gU0NTSV9JT0NUTF9TVE9QX1VOSVQpKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiBzY3NpX2lvY3RsKFNUcC0+ZGV2aWNlLCBjbWRfaW4sIHApOworCisgb3V0OgorCXVwKCZTVHAtPmxvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyBzdF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzY3NpX3RhcGUgKlNUcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBTVHAtPmRldmljZTsKKwlpbnQgcmV0ID0gLUVOT0lPQ1RMQ01EOworCWlmIChzZGV2LT5ob3N0LT5ob3N0dC0+Y29tcGF0X2lvY3RsKSB7IAorCisJCXJldCA9IHNkZXYtPmhvc3QtPmhvc3R0LT5jb21wYXRfaW9jdGwoc2RldiwgY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworCisJfQorCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworDAorCisvKiBUcnkgdG8gYWxsb2NhdGUgYSBuZXcgdGFwZSBidWZmZXIuIENhbGxpbmcgZnVuY3Rpb24gbXVzdCBub3QgaG9sZAorICAgZGV2X2Fycl9sb2NrLiAqLworc3RhdGljIHN0cnVjdCBzdF9idWZmZXIgKgorIG5ld190YXBlX2J1ZmZlcihpbnQgZnJvbV9pbml0aWFsaXphdGlvbiwgaW50IG5lZWRfZG1hLCBpbnQgbWF4X3NnKQoreworCWludCBpLCBwcmlvcml0eSwgZ290ID0gMCwgc2VncyA9IDA7CisJc3RydWN0IHN0X2J1ZmZlciAqdGI7CisKKwlpZiAoZnJvbV9pbml0aWFsaXphdGlvbikKKwkJcHJpb3JpdHkgPSBHRlBfQVRPTUlDOworCWVsc2UKKwkJcHJpb3JpdHkgPSBHRlBfS0VSTkVMOworCisJaSA9IHNpemVvZihzdHJ1Y3Qgc3RfYnVmZmVyKSArIChtYXhfc2cgLSAxKSAqIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpICsKKwkJbWF4X3NnICogc2l6ZW9mKHN0cnVjdCBzdF9idWZfZnJhZ21lbnQpOworCXRiID0ga21hbGxvYyhpLCBwcmlvcml0eSk7CisJaWYgKCF0YikgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgInN0OiBDYW4ndCBhbGxvY2F0ZSBuZXcgdGFwZSBidWZmZXIuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldCh0YiwgMCwgaSk7CisJdGItPmZycF9zZWdzID0gdGItPm9yaWdfZnJwX3NlZ3MgPSBzZWdzOworCXRiLT51c2Vfc2cgPSBtYXhfc2c7CisJaWYgKHNlZ3MgPiAwKQorCQl0Yi0+Yl9kYXRhID0gcGFnZV9hZGRyZXNzKHRiLT5zZ1swXS5wYWdlKTsKKwl0Yi0+ZnJwID0gKHN0cnVjdCBzdF9idWZfZnJhZ21lbnQgKikoJih0Yi0+c2dbMF0pICsgbWF4X3NnKTsKKworCXRiLT5pbl91c2UgPSAxOworCXRiLT5kbWEgPSBuZWVkX2RtYTsKKwl0Yi0+YnVmZmVyX3NpemUgPSBnb3Q7CisKKwlyZXR1cm4gdGI7Cit9CisKKworLyogVHJ5IHRvIGFsbG9jYXRlIGVub3VnaCBzcGFjZSBpbiB0aGUgdGFwZSBidWZmZXIgKi8KK3N0YXRpYyBpbnQgZW5sYXJnZV9idWZmZXIoc3RydWN0IHN0X2J1ZmZlciAqIFNUYnVmZmVyLCBpbnQgbmV3X3NpemUsIGludCBuZWVkX2RtYSkKK3sKKwlpbnQgc2VncywgbmJyLCBtYXhfc2VncywgYl9zaXplLCBwcmlvcml0eSwgb3JkZXIsIGdvdDsKKworCWlmIChuZXdfc2l6ZSA8PSBTVGJ1ZmZlci0+YnVmZmVyX3NpemUpCisJCXJldHVybiAxOworCisJaWYgKFNUYnVmZmVyLT5idWZmZXJfc2l6ZSA8PSBQQUdFX1NJWkUpCisJCW5vcm1hbGl6ZV9idWZmZXIoU1RidWZmZXIpOyAgLyogQXZvaWQgZXh0cmEgc2VnbWVudCAqLworCisJbWF4X3NlZ3MgPSBTVGJ1ZmZlci0+dXNlX3NnOworCW5iciA9IG1heF9zZWdzIC0gU1RidWZmZXItPmZycF9zZWdzOworCWlmIChuYnIgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlwcmlvcml0eSA9IEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk47CisJaWYgKG5lZWRfZG1hKQorCQlwcmlvcml0eSB8PSBHRlBfRE1BOworCWZvciAoYl9zaXplID0gUEFHRV9TSVpFLCBvcmRlcj0wOworCSAgICAgYl9zaXplIDwgbmV3X3NpemUgLSBTVGJ1ZmZlci0+YnVmZmVyX3NpemU7CisJICAgICBvcmRlcisrLCBiX3NpemUgKj0gMikKKwkJOyAgLyogZW1wdHkgKi8KKworCWZvciAoc2VncyA9IFNUYnVmZmVyLT5mcnBfc2VncywgZ290ID0gU1RidWZmZXItPmJ1ZmZlcl9zaXplOworCSAgICAgc2VncyA8IG1heF9zZWdzICYmIGdvdCA8IG5ld19zaXplOykgeworCQlTVGJ1ZmZlci0+ZnJwW3NlZ3NdLnBhZ2UgPSBhbGxvY19wYWdlcyhwcmlvcml0eSwgb3JkZXIpOworCQlpZiAoU1RidWZmZXItPmZycFtzZWdzXS5wYWdlID09IE5VTEwpIHsKKwkJCWlmIChuZXdfc2l6ZSAtIGdvdCA8PSAobWF4X3NlZ3MgLSBzZWdzKSAqIGJfc2l6ZSAvIDIpIHsKKwkJCQliX3NpemUgLz0gMjsgLyogTGFyZ2UgZW5vdWdoIGZvciB0aGUgcmVzdCBvZiB0aGUgYnVmZmVycyAqLworCQkJCW9yZGVyLS07CisJCQkJY29udGludWU7CisJCQl9CisJCQlERUIoU1RidWZmZXItPmJ1ZmZlcl9zaXplID0gZ290KTsKKwkJCW5vcm1hbGl6ZV9idWZmZXIoU1RidWZmZXIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJU1RidWZmZXItPmZycFtzZWdzXS5sZW5ndGggPSBiX3NpemU7CisJCVNUYnVmZmVyLT5mcnBfc2VncyArPSAxOworCQlnb3QgKz0gYl9zaXplOworCQlTVGJ1ZmZlci0+YnVmZmVyX3NpemUgPSBnb3Q7CisJCXNlZ3MrKzsKKwl9CisJU1RidWZmZXItPmJfZGF0YSA9IHBhZ2VfYWRkcmVzcyhTVGJ1ZmZlci0+ZnJwWzBdLnBhZ2UpOworCisJcmV0dXJuIDE7Cit9CisKKworLyogUmVsZWFzZSB0aGUgZXh0cmEgYnVmZmVyICovCitzdGF0aWMgdm9pZCBub3JtYWxpemVfYnVmZmVyKHN0cnVjdCBzdF9idWZmZXIgKiBTVGJ1ZmZlcikKK3sKKwlpbnQgaSwgb3JkZXI7CisKKwlmb3IgKGkgPSBTVGJ1ZmZlci0+b3JpZ19mcnBfc2VnczsgaSA8IFNUYnVmZmVyLT5mcnBfc2VnczsgaSsrKSB7CisJCW9yZGVyID0gZ2V0X29yZGVyKFNUYnVmZmVyLT5mcnBbaV0ubGVuZ3RoKTsKKwkJX19mcmVlX3BhZ2VzKFNUYnVmZmVyLT5mcnBbaV0ucGFnZSwgb3JkZXIpOworCQlTVGJ1ZmZlci0+YnVmZmVyX3NpemUgLT0gU1RidWZmZXItPmZycFtpXS5sZW5ndGg7CisJfQorCVNUYnVmZmVyLT5mcnBfc2VncyA9IFNUYnVmZmVyLT5vcmlnX2ZycF9zZWdzOworCVNUYnVmZmVyLT5mcnBfc2dfY3VycmVudCA9IDA7Cit9CisKKworLyogTW92ZSBkYXRhIGZyb20gdGhlIHVzZXIgYnVmZmVyIHRvIHRoZSB0YXBlIGJ1ZmZlci4gUmV0dXJucyB6ZXJvIChzdWNjZXNzKSBvcgorICAgbmVnYXRpdmUgZXJyb3IgY29kZS4gKi8KK3N0YXRpYyBpbnQgYXBwZW5kX3RvX2J1ZmZlcihjb25zdCBjaGFyIF9fdXNlciAqdWJwLCBzdHJ1Y3Qgc3RfYnVmZmVyICogc3RfYnAsIGludCBkb19jb3VudCkKK3sKKwlpbnQgaSwgY250LCByZXMsIG9mZnNldDsKKworCWZvciAoaSA9IDAsIG9mZnNldCA9IHN0X2JwLT5idWZmZXJfYnl0ZXM7CisJICAgICBpIDwgc3RfYnAtPmZycF9zZWdzICYmIG9mZnNldCA+PSBzdF9icC0+ZnJwW2ldLmxlbmd0aDsgaSsrKQorCQlvZmZzZXQgLT0gc3RfYnAtPmZycFtpXS5sZW5ndGg7CisJaWYgKGkgPT0gc3RfYnAtPmZycF9zZWdzKSB7CS8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic3Q6IGFwcGVuZF90b19idWZmZXIgb2Zmc2V0IG92ZXJmbG93LlxuIik7CisJCXJldHVybiAoLUVJTyk7CisJfQorCWZvciAoOyBpIDwgc3RfYnAtPmZycF9zZWdzICYmIGRvX2NvdW50ID4gMDsgaSsrKSB7CisJCWNudCA9IHN0X2JwLT5mcnBbaV0ubGVuZ3RoIC0gb2Zmc2V0IDwgZG9fY291bnQgPworCQkgICAgc3RfYnAtPmZycFtpXS5sZW5ndGggLSBvZmZzZXQgOiBkb19jb3VudDsKKwkJcmVzID0gY29weV9mcm9tX3VzZXIocGFnZV9hZGRyZXNzKHN0X2JwLT5mcnBbaV0ucGFnZSkgKyBvZmZzZXQsIHVicCwgY250KTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiAoLUVGQVVMVCk7CisJCWRvX2NvdW50IC09IGNudDsKKwkJc3RfYnAtPmJ1ZmZlcl9ieXRlcyArPSBjbnQ7CisJCXVicCArPSBjbnQ7CisJCW9mZnNldCA9IDA7CisJfQorCWlmIChkb19jb3VudCkgLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQlyZXR1cm4gKC1FSU8pOworCisJcmV0dXJuIDA7Cit9CisKKworLyogTW92ZSBkYXRhIGZyb20gdGhlIHRhcGUgYnVmZmVyIHRvIHRoZSB1c2VyIGJ1ZmZlci4gUmV0dXJucyB6ZXJvIChzdWNjZXNzKSBvcgorICAgbmVnYXRpdmUgZXJyb3IgY29kZS4gKi8KK3N0YXRpYyBpbnQgZnJvbV9idWZmZXIoc3RydWN0IHN0X2J1ZmZlciAqIHN0X2JwLCBjaGFyIF9fdXNlciAqdWJwLCBpbnQgZG9fY291bnQpCit7CisJaW50IGksIGNudCwgcmVzLCBvZmZzZXQ7CisKKwlmb3IgKGkgPSAwLCBvZmZzZXQgPSBzdF9icC0+cmVhZF9wb2ludGVyOworCSAgICAgaSA8IHN0X2JwLT5mcnBfc2VncyAmJiBvZmZzZXQgPj0gc3RfYnAtPmZycFtpXS5sZW5ndGg7IGkrKykKKwkJb2Zmc2V0IC09IHN0X2JwLT5mcnBbaV0ubGVuZ3RoOworCWlmIChpID09IHN0X2JwLT5mcnBfc2VncykgewkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInN0OiBmcm9tX2J1ZmZlciBvZmZzZXQgb3ZlcmZsb3cuXG4iKTsKKwkJcmV0dXJuICgtRUlPKTsKKwl9CisJZm9yICg7IGkgPCBzdF9icC0+ZnJwX3NlZ3MgJiYgZG9fY291bnQgPiAwOyBpKyspIHsKKwkJY250ID0gc3RfYnAtPmZycFtpXS5sZW5ndGggLSBvZmZzZXQgPCBkb19jb3VudCA/CisJCSAgICBzdF9icC0+ZnJwW2ldLmxlbmd0aCAtIG9mZnNldCA6IGRvX2NvdW50OworCQlyZXMgPSBjb3B5X3RvX3VzZXIodWJwLCBwYWdlX2FkZHJlc3Moc3RfYnAtPmZycFtpXS5wYWdlKSArIG9mZnNldCwgY250KTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiAoLUVGQVVMVCk7CisJCWRvX2NvdW50IC09IGNudDsKKwkJc3RfYnAtPmJ1ZmZlcl9ieXRlcyAtPSBjbnQ7CisJCXN0X2JwLT5yZWFkX3BvaW50ZXIgKz0gY250OworCQl1YnAgKz0gY250OworCQlvZmZzZXQgPSAwOworCX0KKwlpZiAoZG9fY291bnQpIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJcmV0dXJuICgtRUlPKTsKKworCXJldHVybiAwOworfQorCisKKy8qIE1vdmUgZGF0YSB0b3dhcmRzIHN0YXJ0IG9mIGJ1ZmZlciAqLworc3RhdGljIHZvaWQgbW92ZV9idWZmZXJfZGF0YShzdHJ1Y3Qgc3RfYnVmZmVyICogc3RfYnAsIGludCBvZmZzZXQpCit7CisJaW50IHNyY19zZWcsIGRzdF9zZWcsIHNyY19vZmZzZXQgPSAwLCBkc3Rfb2Zmc2V0OworCWludCBjb3VudCwgdG90YWw7CisKKwlpZiAob2Zmc2V0ID09IDApCisJCXJldHVybjsKKworCXRvdGFsPXN0X2JwLT5idWZmZXJfYnl0ZXMgLSBvZmZzZXQ7CisJZm9yIChzcmNfc2VnPTA7IHNyY19zZWcgPCBzdF9icC0+ZnJwX3NlZ3M7IHNyY19zZWcrKykgeworCQlzcmNfb2Zmc2V0ID0gb2Zmc2V0OworCQlpZiAoc3JjX29mZnNldCA8IHN0X2JwLT5mcnBbc3JjX3NlZ10ubGVuZ3RoKQorCQkJYnJlYWs7CisJCW9mZnNldCAtPSBzdF9icC0+ZnJwW3NyY19zZWddLmxlbmd0aDsKKwl9CisKKwlzdF9icC0+YnVmZmVyX2J5dGVzID0gc3RfYnAtPnJlYWRfcG9pbnRlciA9IHRvdGFsOworCWZvciAoZHN0X3NlZz1kc3Rfb2Zmc2V0PTA7IHRvdGFsID4gMDsgKSB7CisJCWNvdW50ID0gbWluKHN0X2JwLT5mcnBbZHN0X3NlZ10ubGVuZ3RoIC0gZHN0X29mZnNldCwKKwkJCSAgICBzdF9icC0+ZnJwW3NyY19zZWddLmxlbmd0aCAtIHNyY19vZmZzZXQpOworCQltZW1tb3ZlKHBhZ2VfYWRkcmVzcyhzdF9icC0+ZnJwW2RzdF9zZWddLnBhZ2UpICsgZHN0X29mZnNldCwKKwkJCXBhZ2VfYWRkcmVzcyhzdF9icC0+ZnJwW3NyY19zZWddLnBhZ2UpICsgc3JjX29mZnNldCwgY291bnQpOworCQlzcmNfb2Zmc2V0ICs9IGNvdW50OworCQlpZiAoc3JjX29mZnNldCA+PSBzdF9icC0+ZnJwW3NyY19zZWddLmxlbmd0aCkgeworCQkJc3JjX3NlZysrOworCQkJc3JjX29mZnNldCA9IDA7CisJCX0KKwkJZHN0X29mZnNldCArPSBjb3VudDsKKwkJaWYgKGRzdF9vZmZzZXQgPj0gc3RfYnAtPmZycFtkc3Rfc2VnXS5sZW5ndGgpIHsKKwkJCWRzdF9zZWcrKzsKKwkJCWRzdF9vZmZzZXQgPSAwOworCQl9CisJCXRvdGFsIC09IGNvdW50OworCX0KK30KKworCisvKiBGaWxsIHRoZSBzL2cgbGlzdCB1cCB0byB0aGUgbGVuZ3RoIHJlcXVpcmVkIGZvciB0aGlzIHRyYW5zZmVyICovCitzdGF0aWMgdm9pZCBidWZfdG9fc2coc3RydWN0IHN0X2J1ZmZlciAqU1RicCwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlzdHJ1Y3Qgc3RfYnVmX2ZyYWdtZW50ICpmcnA7CisKKwlpZiAobGVuZ3RoID09IFNUYnAtPmZycF9zZ19jdXJyZW50KQorCQlyZXR1cm47ICAgLyogd29yayBhbHJlYWR5IGRvbmUgKi8KKworCXNnID0gJihTVGJwLT5zZ1swXSk7CisJZnJwID0gU1RicC0+ZnJwOworCWZvciAoaT1jb3VudD0wOyBjb3VudCA8IGxlbmd0aDsgaSsrKSB7CisJCXNnW2ldLnBhZ2UgPSBmcnBbaV0ucGFnZTsKKwkJaWYgKGxlbmd0aCAtIGNvdW50ID4gZnJwW2ldLmxlbmd0aCkKKwkJCXNnW2ldLmxlbmd0aCA9IGZycFtpXS5sZW5ndGg7CisJCWVsc2UKKwkJCXNnW2ldLmxlbmd0aCA9IGxlbmd0aCAtIGNvdW50OworCQljb3VudCArPSBzZ1tpXS5sZW5ndGg7CisJCXNnW2ldLm9mZnNldCA9IDA7CisJfQorCVNUYnAtPnNnX3NlZ3MgPSBpOworCVNUYnAtPmZycF9zZ19jdXJyZW50ID0gbGVuZ3RoOworfQorCisKKy8qIFZhbGlkYXRlIHRoZSBvcHRpb25zIGZyb20gY29tbWFuZCBsaW5lIG9yIG1vZHVsZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgdm9pZCB2YWxpZGF0ZV9vcHRpb25zKHZvaWQpCit7CisJaWYgKGJ1ZmZlcl9rYnMgPiAwKQorCQlzdF9maXhlZF9idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9rYnMgKiBTVF9LSUxPQllURTsKKwlpZiAobWF4X3NnX3NlZ3MgPj0gU1RfRklSU1RfU0cpCisJCXN0X21heF9zZ19zZWdzID0gbWF4X3NnX3NlZ3M7Cit9CisKKyNpZm5kZWYgTU9EVUxFCisvKiBTZXQgdGhlIGJvb3Qgb3B0aW9ucy4gU3ludGF4IGlzIGRlZmluZWQgaW4gRG9jdW1lbmF0aW9uL3Njc2kvc3QudHh0LgorICovCitzdGF0aWMgaW50IF9faW5pdCBzdF9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGksIGxlbiwgaW50c1s1XTsKKwljaGFyICpzdHA7CisKKwlzdHAgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCisJaWYgKGludHNbMF0gPiAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBpbnRzWzBdICYmIGkgPCBBUlJBWV9TSVpFKHBhcm1zKTsgaSsrKQorCQkJaWYgKHBhcm1zW2ldLnZhbCkKKwkJCQkqcGFybXNbaV0udmFsID0gaW50c1tpICsgMV07CisJfSBlbHNlIHsKKwkJd2hpbGUgKHN0cCAhPSBOVUxMKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwYXJtcyk7IGkrKykgeworCQkJCWxlbiA9IHN0cmxlbihwYXJtc1tpXS5uYW1lKTsKKwkJCQlpZiAoIXN0cm5jbXAoc3RwLCBwYXJtc1tpXS5uYW1lLCBsZW4pICYmCisJCQkJICAgICgqKHN0cCArIGxlbikgPT0gJzonIHx8ICooc3RwICsgbGVuKSA9PSAnPScpKSB7CisJCQkJCWlmIChwYXJtc1tpXS52YWwpCisJCQkJCQkqcGFybXNbaV0udmFsID0KKwkJCQkJCQlzaW1wbGVfc3RydG91bChzdHAgKyBsZW4gKyAxLCBOVUxMLCAwKTsKKwkJCQkJZWxzZQorCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic3Q6IE9ic29sZXRlIHBhcmFtZXRlciAlc1xuIiwKKwkJCQkJCSAgICAgICBwYXJtc1tpXS5uYW1lKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKGkgPj0gc2l6ZW9mKHBhcm1zKSAvIHNpemVvZihzdHJ1Y3Qgc3RfZGV2X3Bhcm0pKQorCQkJCSBwcmludGsoS0VSTl9XQVJOSU5HICJzdDogaW52YWxpZCBwYXJhbWV0ZXIgaW4gJyVzJ1xuIiwKKwkJCQkJc3RwKTsKKwkJCXN0cCA9IHN0cmNocihzdHAsICcsJyk7CisJCQlpZiAoc3RwKQorCQkJCXN0cCsrOworCQl9CisJfQorCisJdmFsaWRhdGVfb3B0aW9ucygpOworCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInN0PSIsIHN0X3NldHVwKTsKKworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN0X2ZvcHMgPQoreworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5yZWFkID0JCXN0X3JlYWQsCisJLndyaXRlID0Jc3Rfd3JpdGUsCisJLmlvY3RsID0Jc3RfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwgPSBzdF9jb21wYXRfaW9jdGwsCisjZW5kaWYKKwkub3BlbiA9CQlzdF9vcGVuLAorCS5mbHVzaCA9CXN0X2ZsdXNoLAorCS5yZWxlYXNlID0Jc3RfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgc3RfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqU0RwID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IE5VTEw7CisJc3RydWN0IGNkZXYgKmNkZXYgPSBOVUxMOworCXN0cnVjdCBzY3NpX3RhcGUgKnRwbnQgPSBOVUxMOworCXN0cnVjdCBzdF9tb2RlZGVmICpTVG07CisJc3RydWN0IHN0X3BhcnRzdGF0ICpTVHBzOworCXN0cnVjdCBzdF9idWZmZXIgKmJ1ZmZlcjsKKwlpbnQgaSwgaiwgbW9kZSwgZGV2X251bSwgZXJyb3I7CisJY2hhciAqc3RwOworCXU2NCBib3VuY2VfbGltaXQ7CisKKwlpZiAoU0RwLT50eXBlICE9IFRZUEVfVEFQRSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKChzdHAgPSBzdF9pbmNvbXBhdGlibGUoU0RwKSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgInN0OiBGb3VuZCBpbmNvbXBhdGlibGUgdGFwZSBhdCBzY3NpJWQsIGNoYW5uZWwgJWQsIGlkICVkLCBsdW4gJWRcbiIsCisJCSAgICAgICBTRHAtPmhvc3QtPmhvc3Rfbm8sIFNEcC0+Y2hhbm5lbCwgU0RwLT5pZCwgU0RwLT5sdW4pOworCQlwcmludGsoS0VSTl9JTkZPICJzdDogVGhlIHN1Z2dlc3RlZCBkcml2ZXIgaXMgJXMuXG4iLCBzdHApOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpID0gU0RwLT5ob3N0LT5zZ190YWJsZXNpemU7CisJaWYgKHN0X21heF9zZ19zZWdzIDwgaSkKKwkJaSA9IHN0X21heF9zZ19zZWdzOworCWJ1ZmZlciA9IG5ld190YXBlX2J1ZmZlcigxLCAoU0RwLT5ob3N0KS0+dW5jaGVja2VkX2lzYV9kbWEsIGkpOworCWlmIChidWZmZXIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJzdDogQ2FuJ3QgYWxsb2NhdGUgbmV3IHRhcGUgYnVmZmVyLiBEZXZpY2Ugbm90IGF0dGFjaGVkLlxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWRpc2sgPSBhbGxvY19kaXNrKDEpOworCWlmICghZGlzaykgeworCQlwcmludGsoS0VSTl9FUlIgInN0OiBvdXQgb2YgbWVtb3J5LiBEZXZpY2Ugbm90IGF0dGFjaGVkLlxuIik7CisJCWdvdG8gb3V0X2J1ZmZlcl9mcmVlOworCX0KKworCXdyaXRlX2xvY2soJnN0X2Rldl9hcnJfbG9jayk7CisJaWYgKHN0X25yX2RldiA+PSBzdF9kZXZfbWF4KSB7CisJCXN0cnVjdCBzY3NpX3RhcGUgKip0bXBfZGE7CisJCWludCB0bXBfZGV2X21heDsKKworCQl0bXBfZGV2X21heCA9IG1heChzdF9ucl9kZXYgKiAyLCA4KTsKKwkJaWYgKHRtcF9kZXZfbWF4ID4gU1RfTUFYX1RBUEVTKQorCQkJdG1wX2Rldl9tYXggPSBTVF9NQVhfVEFQRVM7CisJCWlmICh0bXBfZGV2X21heCA8PSBzdF9ucl9kZXYpIHsKKwkJCXdyaXRlX3VubG9jaygmc3RfZGV2X2Fycl9sb2NrKTsKKwkJCXByaW50ayhLRVJOX0VSUiAic3Q6IFRvbyBtYW55IHRhcGUgZGV2aWNlcyAobWF4LiAlZCkuXG4iLAorCQkJICAgICAgIFNUX01BWF9UQVBFUyk7CisJCQlnb3RvIG91dF9wdXRfZGlzazsKKwkJfQorCisJCXRtcF9kYSA9IGttYWxsb2ModG1wX2Rldl9tYXggKiBzaXplb2Yoc3RydWN0IHNjc2lfdGFwZSAqKSwgR0ZQX0FUT01JQyk7CisJCWlmICh0bXBfZGEgPT0gTlVMTCkgeworCQkJd3JpdGVfdW5sb2NrKCZzdF9kZXZfYXJyX2xvY2spOworCQkJcHJpbnRrKEtFUk5fRVJSICJzdDogQ2FuJ3QgZXh0ZW5kIGRldmljZSBhcnJheS5cbiIpOworCQkJZ290byBvdXRfcHV0X2Rpc2s7CisJCX0KKworCQltZW1zZXQodG1wX2RhLCAwLCB0bXBfZGV2X21heCAqIHNpemVvZihzdHJ1Y3Qgc2NzaV90YXBlICopKTsKKwkJaWYgKHNjc2lfdGFwZXMgIT0gTlVMTCkgeworCQkJbWVtY3B5KHRtcF9kYSwgc2NzaV90YXBlcywKKwkJCSAgICAgICBzdF9kZXZfbWF4ICogc2l6ZW9mKHN0cnVjdCBzY3NpX3RhcGUgKikpOworCQkJa2ZyZWUoc2NzaV90YXBlcyk7CisJCX0KKwkJc2NzaV90YXBlcyA9IHRtcF9kYTsKKworCQlzdF9kZXZfbWF4ID0gdG1wX2Rldl9tYXg7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHN0X2Rldl9tYXg7IGkrKykKKwkJaWYgKHNjc2lfdGFwZXNbaV0gPT0gTlVMTCkKKwkJCWJyZWFrOworCWlmIChpID49IHN0X2Rldl9tYXgpCisJCXBhbmljKCJzY3NpX2RldmljZXMgY29ycnVwdCAoc3QpIik7CisKKwl0cG50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNjc2lfdGFwZSksIEdGUF9BVE9NSUMpOworCWlmICh0cG50ID09IE5VTEwpIHsKKwkJd3JpdGVfdW5sb2NrKCZzdF9kZXZfYXJyX2xvY2spOworCQlwcmludGsoS0VSTl9FUlIgInN0OiBDYW4ndCBhbGxvY2F0ZSBkZXZpY2UgZGVzY3JpcHRvci5cbiIpOworCQlnb3RvIG91dF9wdXRfZGlzazsKKwl9CisJbWVtc2V0KHRwbnQsIDAsIHNpemVvZihzdHJ1Y3Qgc2NzaV90YXBlKSk7CisJdHBudC0+ZGlzayA9IGRpc2s7CisJc3ByaW50ZihkaXNrLT5kaXNrX25hbWUsICJzdCVkIiwgaSk7CisJZGlzay0+cHJpdmF0ZV9kYXRhID0gJnRwbnQtPmRyaXZlcjsKKwlkaXNrLT5xdWV1ZSA9IFNEcC0+cmVxdWVzdF9xdWV1ZTsKKwl0cG50LT5kcml2ZXIgPSAmc3RfdGVtcGxhdGU7CisJc2NzaV90YXBlc1tpXSA9IHRwbnQ7CisJZGV2X251bSA9IGk7CisKKwl0cG50LT5kZXZpY2UgPSBTRHA7CisJaWYgKFNEcC0+c2NzaV9sZXZlbCA8PSAyKQorCQl0cG50LT50YXBlX3R5cGUgPSBNVF9JU1NDU0kxOworCWVsc2UKKwkJdHBudC0+dGFwZV90eXBlID0gTVRfSVNTQ1NJMjsKKworCXRwbnQtPmJ1ZmZlciA9IGJ1ZmZlcjsKKworCXRwbnQtPmluaXRlZCA9IDA7CisJdHBudC0+ZGlydHkgPSAwOworCXRwbnQtPmluX3VzZSA9IDA7CisJdHBudC0+ZHJ2X2J1ZmZlciA9IDE7CS8qIFRyeSBidWZmZXJpbmcgaWYgbm8gbW9kZSBzZW5zZSAqLworCXRwbnQtPnJlc3RyX2RtYSA9IChTRHAtPmhvc3QpLT51bmNoZWNrZWRfaXNhX2RtYTsKKwl0cG50LT51c2VfcGYgPSAoU0RwLT5zY3NpX2xldmVsID49IFNDU0lfMik7CisJdHBudC0+ZGVuc2l0eSA9IDA7CisJdHBudC0+ZG9fYXV0b19sb2NrID0gU1RfQVVUT19MT0NLOworCXRwbnQtPmNhbl9ic3IgPSAoU0RwLT5zY3NpX2xldmVsID4gMiA/IDEgOiBTVF9JTl9GSUxFX1BPUyk7IC8qIEJTUiBtYW5kYXRvcnkgaW4gU0NTSTMgKi8KKwl0cG50LT5jYW5fcGFydGl0aW9ucyA9IDA7CisJdHBudC0+dHdvX2ZtID0gU1RfVFdPX0ZNOworCXRwbnQtPmZhc3RfbXRlb20gPSBTVF9GQVNUX01URU9NOworCXRwbnQtPnNjc2kyX2xvZ2ljYWwgPSBTVF9TQ1NJMkxPR0lDQUw7CisJdHBudC0+aW1tZWRpYXRlID0gU1RfTk9XQUlUOworCXRwbnQtPmRlZmF1bHRfZHJ2YnVmZmVyID0gMHhmZjsJCS8qIE5vIGZvcmNlZCBidWZmZXJpbmcgKi8KKwl0cG50LT5wYXJ0aXRpb24gPSAwOworCXRwbnQtPm5ld19wYXJ0aXRpb24gPSAwOworCXRwbnQtPm5icl9wYXJ0aXRpb25zID0gMDsKKwl0cG50LT5kZXZpY2UtPnRpbWVvdXQgPSBTVF9USU1FT1VUOworCXRwbnQtPmxvbmdfdGltZW91dCA9IFNUX0xPTkdfVElNRU9VVDsKKwl0cG50LT50cnlfZGlvID0gdHJ5X2RpcmVjdF9pbyAmJiAhU0RwLT5ob3N0LT51bmNoZWNrZWRfaXNhX2RtYTsKKworCWJvdW5jZV9saW1pdCA9IHNjc2lfY2FsY3VsYXRlX2JvdW5jZV9saW1pdChTRHAtPmhvc3QpID4+IFBBR0VfU0hJRlQ7CisJaWYgKGJvdW5jZV9saW1pdCA+IFVMT05HX01BWCkKKwkJYm91bmNlX2xpbWl0ID0gVUxPTkdfTUFYOworCXRwbnQtPm1heF9wZm4gPSBib3VuY2VfbGltaXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgU1RfTkJSX01PREVTOyBpKyspIHsKKwkJU1RtID0gJih0cG50LT5tb2Rlc1tpXSk7CisJCVNUbS0+ZGVmaW5lZCA9IDA7CisJCVNUbS0+c3lzdiA9IFNUX1NZU1Y7CisJCVNUbS0+ZGVmYXVsdHNfZm9yX3dyaXRlcyA9IDA7CisJCVNUbS0+ZG9fYXN5bmNfd3JpdGVzID0gU1RfQVNZTkNfV1JJVEVTOworCQlTVG0tPmRvX2J1ZmZlcl93cml0ZXMgPSBTVF9CVUZGRVJfV1JJVEVTOworCQlTVG0tPmRvX3JlYWRfYWhlYWQgPSBTVF9SRUFEX0FIRUFEOworCQlTVG0tPmRlZmF1bHRfY29tcHJlc3Npb24gPSBTVF9ET05UX1RPVUNIOworCQlTVG0tPmRlZmF1bHRfYmxrc2l6ZSA9ICgtMSk7CS8qIE5vIGZvcmNlZCBzaXplICovCisJCVNUbS0+ZGVmYXVsdF9kZW5zaXR5ID0gKC0xKTsJLyogTm8gZm9yY2VkIGRlbnNpdHkgKi8KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgU1RfTkJSX1BBUlRJVElPTlM7IGkrKykgeworCQlTVHBzID0gJih0cG50LT5wc1tpXSk7CisJCVNUcHMtPnJ3ID0gU1RfSURMRTsKKwkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisJCVNUcHMtPmF0X3NtID0gMDsKKwkJU1Rwcy0+bGFzdF9ibG9ja192YWxpZCA9IDA7CisJCVNUcHMtPmRydl9ibG9jayA9ICgtMSk7CisJCVNUcHMtPmRydl9maWxlID0gKC0xKTsKKwl9CisKKwl0cG50LT5jdXJyZW50X21vZGUgPSAwOworCXRwbnQtPm1vZGVzWzBdLmRlZmluZWQgPSAxOworCisJdHBudC0+ZGVuc2l0eV9jaGFuZ2VkID0gdHBudC0+Y29tcHJlc3Npb25fY2hhbmdlZCA9CisJICAgIHRwbnQtPmJsa3NpemVfY2hhbmdlZCA9IDA7CisJaW5pdF9NVVRFWCgmdHBudC0+bG9jayk7CisKKwlzdF9ucl9kZXYrKzsKKwl3cml0ZV91bmxvY2soJnN0X2Rldl9hcnJfbG9jayk7CisKKwlmb3IgKG1vZGUgPSAwOyBtb2RlIDwgU1RfTkJSX01PREVTOyArK21vZGUpIHsKKwkJU1RtID0gJih0cG50LT5tb2Rlc1ttb2RlXSk7CisJCWZvciAoaj0wOyBqIDwgMjsgaisrKSB7CisJCQljZGV2ID0gY2Rldl9hbGxvYygpOworCQkJaWYgKCFjZGV2KSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICJzdCVkOiBvdXQgb2YgbWVtb3J5LiBEZXZpY2Ugbm90IGF0dGFjaGVkLlxuIiwKKwkJCQkgICAgICAgZGV2X251bSk7CisJCQkJZ290byBvdXRfZnJlZV90YXBlOworCQkJfQorCQkJY2Rldi0+b3duZXIgPSBUSElTX01PRFVMRTsKKwkJCWNkZXYtPm9wcyA9ICZzdF9mb3BzOworCisJCQllcnJvciA9IGNkZXZfYWRkKGNkZXYsCisJCQkJCSBNS0RFVihTQ1NJX1RBUEVfTUFKT1IsIFRBUEVfTUlOT1IoZGV2X251bSwgbW9kZSwgaikpLAorCQkJCQkgMSk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgInN0JWQ6IENhbid0IGFkZCAlcy1yZXdpbmQgbW9kZSAlZFxuIiwKKwkJCQkgICAgICAgZGV2X251bSwgaiA/ICJub24iIDogImF1dG8iLCBtb2RlKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgInN0JWQ6IERldmljZSBub3QgYXR0YWNoZWQuXG4iLCBkZXZfbnVtKTsKKwkJCQlnb3RvIG91dF9mcmVlX3RhcGU7CisJCQl9CisJCQlTVG0tPmNkZXZzW2pdID0gY2RldjsKKworCQl9CisJCWRvX2NyZWF0ZV9jbGFzc19maWxlcyh0cG50LCBkZXZfbnVtLCBtb2RlKTsKKwl9CisKKwlmb3IgKG1vZGUgPSAwOyBtb2RlIDwgU1RfTkJSX01PREVTOyArK21vZGUpIHsKKwkJLyogTWFrZSBzdXJlIHRoYXQgdGhlIG1pbm9yIG51bWJlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgZm91cgorCQkgICBmaXJzdCBtb2RlcyBhbHdheXMgZ2V0IHRoZSBzYW1lIG5hbWVzICovCisJCWkgPSBtb2RlIDw8ICg0IC0gU1RfTkJSX01PREVfQklUUyk7CisJCS8qICBSZXdpbmQgZW50cnkgICovCisJCWRldmZzX21rX2NkZXYoTUtERVYoU0NTSV9UQVBFX01BSk9SLCBUQVBFX01JTk9SKGRldl9udW0sIG1vZGUsIDApKSwKKwkJCSAgICAgIFNfSUZDSFIgfCBTX0lSVUdPIHwgU19JV1VHTywKKwkJCSAgICAgICIlcy9tdCVzIiwgU0RwLT5kZXZmc19uYW1lLCBzdF9mb3JtYXRzW2ldKTsKKwkJLyogIE5vLXJld2luZCBlbnRyeSAgKi8KKwkJZGV2ZnNfbWtfY2RldihNS0RFVihTQ1NJX1RBUEVfTUFKT1IsIFRBUEVfTUlOT1IoZGV2X251bSwgbW9kZSwgMSkpLAorCQkJICAgICAgU19JRkNIUiB8IFNfSVJVR08gfCBTX0lXVUdPLAorCQkJICAgICAgIiVzL210JXNuIiwgU0RwLT5kZXZmc19uYW1lLCBzdF9mb3JtYXRzW2ldKTsKKwl9CisJZGlzay0+bnVtYmVyID0gZGV2ZnNfcmVnaXN0ZXJfdGFwZShTRHAtPmRldmZzX25hbWUpOworCisJcHJpbnRrKEtFUk5fV0FSTklORworCSJBdHRhY2hlZCBzY3NpIHRhcGUgJXMgYXQgc2NzaSVkLCBjaGFubmVsICVkLCBpZCAlZCwgbHVuICVkXG4iLAorCSAgICAgICB0YXBlX25hbWUodHBudCksIFNEcC0+aG9zdC0+aG9zdF9ubywgU0RwLT5jaGFubmVsLCBTRHAtPmlkLCBTRHAtPmx1bik7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyeSBkaXJlY3QgaS9vOiAlcyAoYWxpZ25tZW50ICVkIEIpLCBtYXggcGFnZSByZWFjaGFibGUgYnkgSEJBICVsdVxuIiwKKwkgICAgICAgdGFwZV9uYW1lKHRwbnQpLCB0cG50LT50cnlfZGlvID8gInllcyIgOiAibm8iLAorCSAgICAgICBxdWV1ZV9kbWFfYWxpZ25tZW50KFNEcC0+cmVxdWVzdF9xdWV1ZSkgKyAxLCB0cG50LT5tYXhfcGZuKTsKKworCXJldHVybiAwOworCitvdXRfZnJlZV90YXBlOgorCWZvciAobW9kZT0wOyBtb2RlIDwgU1RfTkJSX01PREVTOyBtb2RlKyspIHsKKwkJU1RtID0gJih0cG50LT5tb2Rlc1ttb2RlXSk7CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZ0cG50LT5kZXZpY2UtPnNkZXZfZ2VuZGV2LmtvYmosCisJCQkJICAidGFwZSIpOworCQlmb3IgKGo9MDsgaiA8IDI7IGorKykgeworCQkJaWYgKFNUbS0+Y2RldnNbal0pIHsKKwkJCQlpZiAoY2RldiA9PSBTVG0tPmNkZXZzW2pdKQorCQkJCQljZGV2ID0gTlVMTDsKKwkJCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihTQ1NJX1RBUEVfTUFKT1IsCisJCQkJCQkJCSBUQVBFX01JTk9SKGksIG1vZGUsIGopKSk7CisJCQkJY2Rldl9kZWwoU1RtLT5jZGV2c1tqXSk7CisJCQl9CisJCX0KKwl9CisJaWYgKGNkZXYpCisJCWNkZXZfZGVsKGNkZXYpOworCXdyaXRlX2xvY2soJnN0X2Rldl9hcnJfbG9jayk7CisJc2NzaV90YXBlc1tkZXZfbnVtXSA9IE5VTEw7CisJc3RfbnJfZGV2LS07CisJd3JpdGVfdW5sb2NrKCZzdF9kZXZfYXJyX2xvY2spOworb3V0X3B1dF9kaXNrOgorCXB1dF9kaXNrKGRpc2spOworCWlmICh0cG50KQorCQlrZnJlZSh0cG50KTsKK291dF9idWZmZXJfZnJlZToKKwlrZnJlZShidWZmZXIpOworb3V0OgorCXJldHVybiAtRU5PREVWOworfTsKKworCitzdGF0aWMgaW50IHN0X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpTRHAgPSB0b19zY3NpX2RldmljZShkZXYpOworCXN0cnVjdCBzY3NpX3RhcGUgKnRwbnQ7CisJaW50IGksIGosIG1vZGU7CisKKwl3cml0ZV9sb2NrKCZzdF9kZXZfYXJyX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBzdF9kZXZfbWF4OyBpKyspIHsKKwkJdHBudCA9IHNjc2lfdGFwZXNbaV07CisJCWlmICh0cG50ICE9IE5VTEwgJiYgdHBudC0+ZGV2aWNlID09IFNEcCkgeworCQkJc2NzaV90YXBlc1tpXSA9IE5VTEw7CisJCQlzdF9ucl9kZXYtLTsKKwkJCXdyaXRlX3VubG9jaygmc3RfZGV2X2Fycl9sb2NrKTsKKwkJCWRldmZzX3VucmVnaXN0ZXJfdGFwZSh0cG50LT5kaXNrLT5udW1iZXIpOworCQkJc3lzZnNfcmVtb3ZlX2xpbmsoJnRwbnQtPmRldmljZS0+c2Rldl9nZW5kZXYua29iaiwKKwkJCQkJICAidGFwZSIpOworCQkJZm9yIChtb2RlID0gMDsgbW9kZSA8IFNUX05CUl9NT0RFUzsgKyttb2RlKSB7CisJCQkJaiA9IG1vZGUgPDwgKDQgLSBTVF9OQlJfTU9ERV9CSVRTKTsKKwkJCQlkZXZmc19yZW1vdmUoIiVzL210JXMiLCBTRHAtPmRldmZzX25hbWUsIHN0X2Zvcm1hdHNbal0pOworCQkJCWRldmZzX3JlbW92ZSgiJXMvbXQlc24iLCBTRHAtPmRldmZzX25hbWUsIHN0X2Zvcm1hdHNbal0pOworCQkJCWZvciAoaj0wOyBqIDwgMjsgaisrKSB7CisJCQkJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFNDU0lfVEFQRV9NQUpPUiwKKwkJCQkJCQkJCSBUQVBFX01JTk9SKGksIG1vZGUsIGopKSk7CisJCQkJCWNkZXZfZGVsKHRwbnQtPm1vZGVzW21vZGVdLmNkZXZzW2pdKTsKKwkJCQkJdHBudC0+bW9kZXNbbW9kZV0uY2RldnNbal0gPSBOVUxMOworCQkJCX0KKwkJCX0KKwkJCXRwbnQtPmRldmljZSA9IE5VTEw7CisKKwkJCWlmICh0cG50LT5idWZmZXIpIHsKKwkJCQl0cG50LT5idWZmZXItPm9yaWdfZnJwX3NlZ3MgPSAwOworCQkJCW5vcm1hbGl6ZV9idWZmZXIodHBudC0+YnVmZmVyKTsKKwkJCQlrZnJlZSh0cG50LT5idWZmZXIpOworCQkJfQorCQkJcHV0X2Rpc2sodHBudC0+ZGlzayk7CisJCQlrZnJlZSh0cG50KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJd3JpdGVfdW5sb2NrKCZzdF9kZXZfYXJyX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdF9pbnRyKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCXNjc2lfaW9fY29tcGxldGlvbihTQ3BudCwgKFNDcG50LT5yZXN1bHQgPyAwOiBTQ3BudC0+YnVmZmxlbiksIDEpOworfQorCisvKgorICogc3RfaW5pdF9jb21tYW5kOiBvbmx5IGNhbGxlZCB2aWEgdGhlIHNjc2lfY21kX2lvY3RsIChibG9jayBTR19JTykKKyAqIGludGVyZmFjZSBmb3IgUkVRX0JMT0NLX1BDIGNvbW1hbmRzLgorICovCitzdGF0aWMgaW50IHN0X2luaXRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisKKwlpZiAoIShTQ3BudC0+cmVxdWVzdC0+ZmxhZ3MgJiBSRVFfQkxPQ0tfUEMpKQorCQlyZXR1cm4gMDsKKworCXJxID0gU0NwbnQtPnJlcXVlc3Q7CisJaWYgKHNpemVvZihycS0+Y21kKSA+IHNpemVvZihTQ3BudC0+Y21uZCkpCisJCXJldHVybiAwOworCisJbWVtY3B5KFNDcG50LT5jbW5kLCBycS0+Y21kLCBzaXplb2YoU0NwbnQtPmNtbmQpKTsKKworCWlmIChycV9kYXRhX2RpcihycSkgPT0gV1JJVEUpCisJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7CisJZWxzZSBpZiAocnEtPmRhdGFfbGVuKQorCQlTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisJZWxzZQorCQlTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKKworCVNDcG50LT50aW1lb3V0X3Blcl9jb21tYW5kID0gcnEtPnRpbWVvdXQ7CisJU0NwbnQtPnRyYW5zZmVyc2l6ZSA9IHJxLT5kYXRhX2xlbjsKKwlTQ3BudC0+ZG9uZSA9IHN0X2ludHI7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfc3Qodm9pZCkKK3sKKwl2YWxpZGF0ZV9vcHRpb25zKCk7CisKKwlwcmludGsoS0VSTl9JTkZPCisJCSJzdDogVmVyc2lvbiAlcywgZml4ZWQgYnVmc2l6ZSAlZCwgcy9nIHNlZ3MgJWRcbiIsCisJCXZlcnN0ciwgc3RfZml4ZWRfYnVmZmVyX3NpemUsIHN0X21heF9zZ19zZWdzKTsKKworCXN0X3N5c2ZzX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgInNjc2lfdGFwZSIpOworCWlmIChJU19FUlIoc3Rfc3lzZnNfY2xhc3MpKSB7CisJCXN0X3N5c2ZzX2NsYXNzID0gTlVMTDsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgY3JlYXRlIHN5c2ZzIGNsYXNzIGZvciBTQ1NJIHRhcGVzXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFyZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFNDU0lfVEFQRV9NQUpPUiwgMCksCisJCQkJICAgIFNUX01BWF9UQVBFX0VOVFJJRVMsICJzdCIpKSB7CisJCWlmIChzY3NpX3JlZ2lzdGVyX2RyaXZlcigmc3RfdGVtcGxhdGUuZ2VuZHJ2KSA9PSAwKSB7CisJCQlkb19jcmVhdGVfZHJpdmVyZnNfZmlsZXMoKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChzdF9zeXNmc19jbGFzcykKKwkJCWNsYXNzX3NpbXBsZV9kZXN0cm95KHN0X3N5c2ZzX2NsYXNzKTsJCQorCQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoU0NTSV9UQVBFX01BSk9SLCAwKSwKKworCQkJCQkgU1RfTUFYX1RBUEVfRU5UUklFUyk7CisJfQorCisJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gZ2V0IG1ham9yICVkIGZvciBTQ1NJIHRhcGVzXG4iLCBTQ1NJX1RBUEVfTUFKT1IpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9zdCh2b2lkKQoreworCWlmIChzdF9zeXNmc19jbGFzcykKKwkJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3koc3Rfc3lzZnNfY2xhc3MpOworCXN0X3N5c2ZzX2NsYXNzID0gTlVMTDsKKwlkb19yZW1vdmVfZHJpdmVyZnNfZmlsZXMoKTsKKwlzY3NpX3VucmVnaXN0ZXJfZHJpdmVyKCZzdF90ZW1wbGF0ZS5nZW5kcnYpOworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihTQ1NJX1RBUEVfTUFKT1IsIDApLAorCQkJCSBTVF9NQVhfVEFQRV9FTlRSSUVTKTsKKwlrZnJlZShzY3NpX3RhcGVzKTsKKwlwcmludGsoS0VSTl9JTkZPICJzdDogVW5sb2FkZWQuXG4iKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9zdCk7Cittb2R1bGVfZXhpdChleGl0X3N0KTsKKworCisvKiBUaGUgc3lzZnMgZHJpdmVyIGludGVyZmFjZS4gUmVhZC1vbmx5IGF0IHRoZSBtb21lbnQgKi8KK3N0YXRpYyBzc2l6ZV90IHN0X3RyeV9kaXJlY3RfaW9fc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHRyeV9kaXJlY3RfaW8pOworfQorc3RhdGljIERSSVZFUl9BVFRSKHRyeV9kaXJlY3RfaW8sIFNfSVJVR08sIHN0X3RyeV9kaXJlY3RfaW9fc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHN0X2ZpeGVkX2J1ZmZlcl9zaXplX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBzdF9maXhlZF9idWZmZXJfc2l6ZSk7Cit9CitzdGF0aWMgRFJJVkVSX0FUVFIoZml4ZWRfYnVmZmVyX3NpemUsIFNfSVJVR08sIHN0X2ZpeGVkX2J1ZmZlcl9zaXplX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzdF9tYXhfc2dfc2Vnc19zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgc3RfbWF4X3NnX3NlZ3MpOworfQorc3RhdGljIERSSVZFUl9BVFRSKG1heF9zZ19zZWdzLCBTX0lSVUdPLCBzdF9tYXhfc2dfc2Vnc19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc3RfdmVyc2lvbl9zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZGQsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJbJXNdXG4iLCB2ZXJzdHIpOworfQorc3RhdGljIERSSVZFUl9BVFRSKHZlcnNpb24sIFNfSVJVR08sIHN0X3ZlcnNpb25fc2hvdywgTlVMTCk7CisKK3N0YXRpYyB2b2lkIGRvX2NyZWF0ZV9kcml2ZXJmc19maWxlcyh2b2lkKQoreworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXJmcyA9ICZzdF90ZW1wbGF0ZS5nZW5kcnY7CisKKwlkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl90cnlfZGlyZWN0X2lvKTsKKwlkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9maXhlZF9idWZmZXJfc2l6ZSk7CisJZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfbWF4X3NnX3NlZ3MpOworCWRyaXZlcl9jcmVhdGVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3ZlcnNpb24pOworfQorCitzdGF0aWMgdm9pZCBkb19yZW1vdmVfZHJpdmVyZnNfZmlsZXModm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyZnMgPSAmc3RfdGVtcGxhdGUuZ2VuZHJ2OworCisJZHJpdmVyX3JlbW92ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7CisJZHJpdmVyX3JlbW92ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfbWF4X3NnX3NlZ3MpOworCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX2ZpeGVkX2J1ZmZlcl9zaXplKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl90cnlfZGlyZWN0X2lvKTsKK30KKworCisvKiBUaGUgc3lzZnMgc2ltcGxlIGNsYXNzIGludGVyZmFjZSAqLworc3RhdGljIHNzaXplX3Qgc3RfZGVmaW5lZF9zaG93KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzdF9tb2RlZGVmICpTVG0gPSAoc3RydWN0IHN0X21vZGVkZWYgKiljbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXYpOworCXNzaXplX3QgbCA9IDA7CisKKwlsID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgU1RtLT5kZWZpbmVkKTsKKwlyZXR1cm4gbDsKK30KKworQ0xBU1NfREVWSUNFX0FUVFIoZGVmaW5lZCwgU19JUlVHTywgc3RfZGVmaW5lZF9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc3RfZGVmYmxrX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHN0X21vZGVkZWYgKlNUbSA9IChzdHJ1Y3Qgc3RfbW9kZWRlZiAqKWNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7CisJc3NpemVfdCBsID0gMDsKKworCWwgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBTVG0tPmRlZmF1bHRfYmxrc2l6ZSk7CisJcmV0dXJuIGw7Cit9CisKK0NMQVNTX0RFVklDRV9BVFRSKGRlZmF1bHRfYmxrc2l6ZSwgU19JUlVHTywgc3RfZGVmYmxrX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzdF9kZWZkZW5zaXR5X3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHN0X21vZGVkZWYgKlNUbSA9IChzdHJ1Y3Qgc3RfbW9kZWRlZiAqKWNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7CisJc3NpemVfdCBsID0gMDsKKwljaGFyICpmbXQ7CisKKwlmbXQgPSBTVG0tPmRlZmF1bHRfZGVuc2l0eSA+PSAwID8gIjB4JTAyeFxuIiA6ICIlZFxuIjsKKwlsID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsIGZtdCwgU1RtLT5kZWZhdWx0X2RlbnNpdHkpOworCXJldHVybiBsOworfQorCitDTEFTU19ERVZJQ0VfQVRUUihkZWZhdWx0X2RlbnNpdHksIFNfSVJVR08sIHN0X2RlZmRlbnNpdHlfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHN0X2RlZmNvbXByZXNzaW9uX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHN0X21vZGVkZWYgKlNUbSA9IChzdHJ1Y3Qgc3RfbW9kZWRlZiAqKWNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7CisJc3NpemVfdCBsID0gMDsKKworCWwgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBTVG0tPmRlZmF1bHRfY29tcHJlc3Npb24gLSAxKTsKKwlyZXR1cm4gbDsKK30KKworQ0xBU1NfREVWSUNFX0FUVFIoZGVmYXVsdF9jb21wcmVzc2lvbiwgU19JUlVHTywgc3RfZGVmY29tcHJlc3Npb25fc2hvdywgTlVMTCk7CisKK3N0YXRpYyB2b2lkIGRvX2NyZWF0ZV9jbGFzc19maWxlcyhzdHJ1Y3Qgc2NzaV90YXBlICpTVHAsIGludCBkZXZfbnVtLCBpbnQgbW9kZSkKK3sKKwlpbnQgaSwgcmV3LCBlcnJvcjsKKwljaGFyIG5hbWVbMTBdOworCXN0cnVjdCBjbGFzc19kZXZpY2UgKnN0X2NsYXNzX21lbWJlcjsKKworCWlmICghc3Rfc3lzZnNfY2xhc3MpCisJCXJldHVybjsKKworCWZvciAocmV3PTA7IHJldyA8IDI7IHJldysrKSB7CisJCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBtaW5vciBudW1iZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZvdXIKKwkJICAgZmlyc3QgbW9kZXMgYWx3YXlzIGdldCB0aGUgc2FtZSBuYW1lcyAqLworCQlpID0gbW9kZSA8PCAoNCAtIFNUX05CUl9NT0RFX0JJVFMpOworCQlzbnByaW50ZihuYW1lLCAxMCwgIiVzJXMlcyIsIHJldyA/ICJuIiA6ICIiLAorCQkJIFNUcC0+ZGlzay0+ZGlza19uYW1lLCBzdF9mb3JtYXRzW2ldKTsKKwkJc3RfY2xhc3NfbWVtYmVyID0KKwkJCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKHN0X3N5c2ZzX2NsYXNzLAorCQkJCQkJTUtERVYoU0NTSV9UQVBFX01BSk9SLAorCQkJCQkJICAgICAgVEFQRV9NSU5PUihkZXZfbnVtLCBtb2RlLCByZXcpKSwKKwkJCQkJCSZTVHAtPmRldmljZS0+c2Rldl9nZW5kZXYsICIlcyIsIG5hbWUpOworCQlpZiAoSVNfRVJSKHN0X2NsYXNzX21lbWJlcikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInN0JWQ6IGNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkIGZhaWxlZFxuIiwKKwkJCSAgICAgICBkZXZfbnVtKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWNsYXNzX3NldF9kZXZkYXRhKHN0X2NsYXNzX21lbWJlciwgJlNUcC0+bW9kZXNbbW9kZV0pOworCisJCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShzdF9jbGFzc19tZW1iZXIsCisJCQkJCSAmY2xhc3NfZGV2aWNlX2F0dHJfZGVmaW5lZCk7CisJCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShzdF9jbGFzc19tZW1iZXIsCisJCQkJCSAmY2xhc3NfZGV2aWNlX2F0dHJfZGVmYXVsdF9ibGtzaXplKTsKKwkJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKHN0X2NsYXNzX21lbWJlciwKKwkJCQkJICZjbGFzc19kZXZpY2VfYXR0cl9kZWZhdWx0X2RlbnNpdHkpOworCQljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoc3RfY2xhc3NfbWVtYmVyLAorCQkJCQkgJmNsYXNzX2RldmljZV9hdHRyX2RlZmF1bHRfY29tcHJlc3Npb24pOworCQlpZiAobW9kZSA9PSAwICYmIHJldyA9PSAwKSB7CisJCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZTVHAtPmRldmljZS0+c2Rldl9nZW5kZXYua29iaiwKKwkJCQkJCSAgJnN0X2NsYXNzX21lbWJlci0+a29iaiwKKwkJCQkJCSAgInRhcGUiKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAic3QlZDogQ2FuJ3QgY3JlYXRlIHN5c2ZzIGxpbmsgZnJvbSBTQ1NJIGRldmljZS5cbiIsCisJCQkJICAgICAgIGRldl9udW0pOworCQkJfQorCQl9CisJfQorIG91dDoKKwlyZXR1cm47Cit9CisKKworLyogUGluIGRvd24gdXNlciBwYWdlcyBhbmQgcHV0IHRoZW0gaW50byBhIHNjYXR0ZXIgZ2F0aGVyIGxpc3QuIFJldHVybnMgPD0gMCBpZgorICAgLSBtYXBwaW5nIG9mIGFsbCBwYWdlcyBub3Qgc3VjY2Vzc2Z1bAorICAgLSBhbnkgcGFnZSBpcyBhYm92ZSBtYXhfcGZuCisgICAoaS5lLiwgZWl0aGVyIGNvbXBsZXRlbHkgc3VjY2Vzc2Z1bCBvciBmYWlscykKKyovCitzdGF0aWMgaW50IHN0X21hcF91c2VyX3BhZ2VzKHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCBjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3BhZ2VzLCAKKwkJCSAgICAgdW5zaWduZWQgbG9uZyB1YWRkciwgc2l6ZV90IGNvdW50LCBpbnQgcncsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgbWF4X3BmbikKK3sKKwlpbnQgaSwgbnJfcGFnZXM7CisKKwlucl9wYWdlcyA9IHNnbF9tYXBfdXNlcl9wYWdlcyhzZ2wsIG1heF9wYWdlcywgdWFkZHIsIGNvdW50LCBydyk7CisJaWYgKG5yX3BhZ2VzIDw9IDApCisJCXJldHVybiBucl9wYWdlczsKKworCWZvciAoaT0wOyBpIDwgbnJfcGFnZXM7IGkrKykgeworCQlpZiAocGFnZV90b19wZm4oc2dsW2ldLnBhZ2UpID4gbWF4X3BmbikKKwkJCWdvdG8gb3V0X3VubWFwOworCX0KKwlyZXR1cm4gbnJfcGFnZXM7CisKKyBvdXRfdW5tYXA6CisJc2dsX3VubWFwX3VzZXJfcGFnZXMoc2dsLCBucl9wYWdlcywgMCk7CisJcmV0dXJuIDA7Cit9CisKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbWF5IGJlIHVzZWZ1bCBmb3IgYSBsYXJnZXIgYXVkaWVuY2UuICovCitzdGF0aWMgaW50IHNnbF9tYXBfdXNlcl9wYWdlcyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgY29uc3QgdW5zaWduZWQgaW50IG1heF9wYWdlcywgCisJCQkgICAgICB1bnNpZ25lZCBsb25nIHVhZGRyLCBzaXplX3QgY291bnQsIGludCBydykKK3sKKwlpbnQgcmVzLCBpLCBqOworCXVuc2lnbmVkIGludCBucl9wYWdlczsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOworCisJbnJfcGFnZXMgPSAoKHVhZGRyICYgflBBR0VfTUFTSykgKyBjb3VudCArIH5QQUdFX01BU0spID4+IFBBR0VfU0hJRlQ7CisKKwkvKiBVc2VyIGF0dGVtcHRlZCBPdmVyZmxvdyEgKi8KKwlpZiAoKHVhZGRyICsgY291bnQpIDwgdWFkZHIpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVG9vIGJpZyAqLworICAgICAgICBpZiAobnJfcGFnZXMgPiBtYXhfcGFnZXMpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogSG1tPyAqLworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmICgocGFnZXMgPSBrbWFsbG9jKG1heF9wYWdlcyAqIHNpemVvZigqcGFnZXMpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKyAgICAgICAgLyogVHJ5IHRvIGZhdWx0IGluIGFsbCBvZiB0aGUgbmVjZXNzYXJ5IHBhZ2VzICovCisJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworICAgICAgICAvKiBydz09UkVBRCBtZWFucyByZWFkIGZyb20gZHJpdmUsIHdyaXRlIGludG8gbWVtb3J5IGFyZWEgKi8KKwlyZXMgPSBnZXRfdXNlcl9wYWdlcygKKwkJY3VycmVudCwKKwkJY3VycmVudC0+bW0sCisJCXVhZGRyLAorCQlucl9wYWdlcywKKwkJcncgPT0gUkVBRCwKKwkJMCwgLyogZG9uJ3QgZm9yY2UgKi8KKwkJcGFnZXMsCisJCU5VTEwpOworCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKKwkvKiBFcnJvcnMgYW5kIG5vIHBhZ2UgbWFwcGVkIHNob3VsZCByZXR1cm4gaGVyZSAqLworCWlmIChyZXMgPCBucl9wYWdlcykKKwkJZ290byBvdXRfdW5tYXA7CisKKyAgICAgICAgZm9yIChpPTA7IGkgPCBucl9wYWdlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgLyogRklYTUU6IGZsdXNoIHN1cGVyZmxvdXMgZm9yIHJ3PT1SRUFELAorICAgICAgICAgICAgICAgICAqIHByb2JhYmx5IHdyb25nIGZ1bmN0aW9uIGZvciBydz09V1JJVEUKKyAgICAgICAgICAgICAgICAgKi8KKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZXNbaV0pOworICAgICAgICB9CisKKwkvKiBQb3B1bGF0ZSB0aGUgc2NhdHRlci9nYXRoZXIgbGlzdCAqLworCXNnbFswXS5wYWdlID0gcGFnZXNbMF07IAorCXNnbFswXS5vZmZzZXQgPSB1YWRkciAmIH5QQUdFX01BU0s7CisJaWYgKG5yX3BhZ2VzID4gMSkgeworCQlzZ2xbMF0ubGVuZ3RoID0gUEFHRV9TSVpFIC0gc2dsWzBdLm9mZnNldDsKKwkJY291bnQgLT0gc2dsWzBdLmxlbmd0aDsKKwkJZm9yIChpPTE7IGkgPCBucl9wYWdlcyA7IGkrKykgeworCQkJc2dsW2ldLm9mZnNldCA9IDA7CisJCQlzZ2xbaV0ucGFnZSA9IHBhZ2VzW2ldOyAKKwkJCXNnbFtpXS5sZW5ndGggPSBjb3VudCA8IFBBR0VfU0laRSA/IGNvdW50IDogUEFHRV9TSVpFOworCQkJY291bnQgLT0gUEFHRV9TSVpFOworCQl9CisJfQorCWVsc2UgeworCQlzZ2xbMF0ubGVuZ3RoID0gY291bnQ7CisJfQorCisJa2ZyZWUocGFnZXMpOworCXJldHVybiBucl9wYWdlczsKKworIG91dF91bm1hcDoKKwlpZiAocmVzID4gMCkgeworCQlmb3IgKGo9MDsgaiA8IHJlczsgaisrKQorCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2VzW2pdKTsKKwl9CisJa2ZyZWUocGFnZXMpOworCXJldHVybiByZXM7Cit9CisKKworLyogQW5kIHVubWFwIHRoZW0uLi4gKi8KK3N0YXRpYyBpbnQgc2dsX3VubWFwX3VzZXJfcGFnZXMoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIGNvbnN0IHVuc2lnbmVkIGludCBucl9wYWdlcywKKwkJCQlpbnQgZGlydGllZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpIDwgbnJfcGFnZXM7IGkrKykgeworCQlpZiAoZGlydGllZCAmJiAhUGFnZVJlc2VydmVkKHNnbFtpXS5wYWdlKSkKKwkJCVNldFBhZ2VEaXJ0eShzZ2xbaV0ucGFnZSk7CisJCS8qIEZJWE1FOiBjYWNoZSBmbHVzaCBtaXNzaW5nIGZvciBydz09UkVBRAorCQkgKiBGSVhNRTogY2FsbCB0aGUgY29ycmVjdCByZWZlcmVuY2UgY291bnRpbmcgZnVuY3Rpb24KKwkJICovCisJCXBhZ2VfY2FjaGVfcmVsZWFzZShzZ2xbaV0ucGFnZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3QuaCBiL2RyaXZlcnMvc2NzaS9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MWRhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc3QuaApAQCAtMCwwICsxLDIxMiBAQAorCisjaWZuZGVmIF9TVF9ICisjZGVmaW5lIF9TVF9ICisKKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisKKworLyogRGVzY3JpcHRvciBmb3IgYW5hbHl6ZWQgc2Vuc2UgZGF0YSAqLworc3RydWN0IHN0X2NtZHN0YXR1cyB7CisJaW50IG1pZGxldmVsX3Jlc3VsdDsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc2Vuc2VfaGRyOworCWludCBoYXZlX3NlbnNlOworCXU2NCB1cmVtYWluZGVyNjQ7CisJdTggZmxhZ3M7CisJdTggcmVtYWluZGVyX3ZhbGlkOworCXU4IGZpeGVkX2Zvcm1hdDsKKwl1OCBkZWZlcnJlZDsKK307CisKKy8qIFRoZSB0YXBlIGJ1ZmZlciBkZXNjcmlwdG9yLiAqLworc3RydWN0IHN0X2J1ZmZlciB7CisJdW5zaWduZWQgY2hhciBpbl91c2U7CisJdW5zaWduZWQgY2hhciBkbWE7CS8qIERNQS1hYmxlIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgZG9fZGlvOyAgIC8qIGRpcmVjdCBpL28gc2V0IHVwPyAqLworCWludCBidWZmZXJfc2l6ZTsKKwlpbnQgYnVmZmVyX2Jsb2NrczsKKwlpbnQgYnVmZmVyX2J5dGVzOworCWludCByZWFkX3BvaW50ZXI7CisJaW50IHdyaXRpbmc7CisJaW50IHN5c2NhbGxfcmVzdWx0OworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKmxhc3RfU1JwbnQ7CisJc3RydWN0IHN0X2NtZHN0YXR1cyBjbWRzdGF0OworCXVuc2lnbmVkIGNoYXIgKmJfZGF0YTsKKwl1bnNpZ25lZCBzaG9ydCB1c2Vfc2c7CS8qIHplcm8gb3IgbWF4IG51bWJlciBvZiBzL2cgc2VnbWVudHMgZm9yIHRoaXMgYWRhcHRlciAqLworCXVuc2lnbmVkIHNob3J0IHNnX3NlZ3M7CQkvKiBudW1iZXIgb2Ygc2VnbWVudHMgaW4gcy9nIGxpc3QgKi8KKwl1bnNpZ25lZCBzaG9ydCBvcmlnX2ZycF9zZWdzOwkvKiBudW1iZXIgb2Ygc2VnbWVudHMgYWxsb2NhdGVkIGF0IGZpcnN0IHRyeSAqLworCXVuc2lnbmVkIHNob3J0IGZycF9zZWdzOwkvKiBudW1iZXIgb2YgYnVmZmVyIHNlZ21lbnRzICovCisJdW5zaWduZWQgaW50IGZycF9zZ19jdXJyZW50OwkvKiBkcml2ZXIgYnVmZmVyIGxlbmd0aCBjdXJyZW50bHkgaW4gcy9nIGxpc3QgKi8KKwlzdHJ1Y3Qgc3RfYnVmX2ZyYWdtZW50ICpmcnA7CS8qIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIGZyYWdtZW50IGxpc3QgKi8KKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMV07CS8qIE1VU1QgQkUgbGFzdCBpdGVtICovCit9OworCisvKiBUaGUgdGFwZSBidWZmZXIgZnJhZ21lbnQgZGVzY3JpcHRvciAqLworc3RydWN0IHN0X2J1Zl9mcmFnbWVudCB7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgaW50IGxlbmd0aDsKK307CisKKy8qIFRoZSB0YXBlIG1vZGUgZGVmaW5pdGlvbiAqLworc3RydWN0IHN0X21vZGVkZWYgeworCXVuc2lnbmVkIGNoYXIgZGVmaW5lZDsKKwl1bnNpZ25lZCBjaGFyIHN5c3Y7CS8qIFNZUyBWIHNlbWFudGljcz8gKi8KKwl1bnNpZ25lZCBjaGFyIGRvX2FzeW5jX3dyaXRlczsKKwl1bnNpZ25lZCBjaGFyIGRvX2J1ZmZlcl93cml0ZXM7CisJdW5zaWduZWQgY2hhciBkb19yZWFkX2FoZWFkOworCXVuc2lnbmVkIGNoYXIgZGVmYXVsdHNfZm9yX3dyaXRlczsKKwl1bnNpZ25lZCBjaGFyIGRlZmF1bHRfY29tcHJlc3Npb247CS8qIDAgPSBkb24ndCB0b3VjaCwgZXRjICovCisJc2hvcnQgZGVmYXVsdF9kZW5zaXR5OwkvKiBGb3JjZWQgZGVuc2l0eSwgLTEgPSBubyB2YWx1ZSAqLworCWludCBkZWZhdWx0X2Jsa3NpemU7CS8qIEZvcmNlZCBibG9ja3NpemUsIC0xID0gbm8gdmFsdWUgKi8KKwlzdHJ1Y3QgY2RldiAqY2RldnNbMl07ICAvKiBBdXRvLXJld2luZCBhbmQgbm9uLXJld2luZCBkZXZpY2VzICovCit9OworCisvKiBOdW1iZXIgb2YgbW9kZXMgY2FuIGJlIGNoYW5nZWQgYnkgY2hhbmdpbmcgU1RfTkJSX01PREVfQklUUy4gVGhlIG1heGltdW0KKyAgIG51bWJlciBvZiBtb2RlcyBpcyAxNiAoU1RfTkJSX01PREVfQklUUyA0KSAqLworI2RlZmluZSBTVF9OQlJfTU9ERV9CSVRTIDIKKyNkZWZpbmUgU1RfTkJSX01PREVTICgxIDw8IFNUX05CUl9NT0RFX0JJVFMpCisjZGVmaW5lIFNUX01PREVfU0hJRlQgKDcgLSBTVF9OQlJfTU9ERV9CSVRTKQorI2RlZmluZSBTVF9NT0RFX01BU0sgKChTVF9OQlJfTU9ERVMgLSAxKSA8PCBTVF9NT0RFX1NISUZUKQorCisjZGVmaW5lIFNUX01BWF9UQVBFUyAxMjgKKyNkZWZpbmUgU1RfTUFYX1RBUEVfRU5UUklFUyAgKFNUX01BWF9UQVBFUyA8PCAoU1RfTkJSX01PREVfQklUUyArIDEpKQorCisvKiBUaGUgc3RhdHVzIHJlbGF0ZWQgdG8gZWFjaCBwYXJ0aXRpb24gKi8KK3N0cnVjdCBzdF9wYXJ0c3RhdCB7CisJdW5zaWduZWQgY2hhciBydzsKKwl1bnNpZ25lZCBjaGFyIGVvZjsKKwl1bnNpZ25lZCBjaGFyIGF0X3NtOworCXVuc2lnbmVkIGNoYXIgbGFzdF9ibG9ja192YWxpZDsKKwl1MzIgbGFzdF9ibG9ja192aXNpdGVkOworCWludCBkcnZfYmxvY2s7CQkvKiBUaGUgYmxvY2sgd2hlcmUgdGhlIGRyaXZlIGhlYWQgaXMgKi8KKwlpbnQgZHJ2X2ZpbGU7Cit9OworCisjZGVmaW5lIFNUX05CUl9QQVJUSVRJT05TIDQKKworLyogVGhlIHRhcGUgZHJpdmUgZGVzY3JpcHRvciAqLworc3RydWN0IHNjc2lfdGFwZSB7CisJc3RydWN0IHNjc2lfZHJpdmVyICpkcml2ZXI7CisJc3RydWN0IHNjc2lfZGV2aWNlICpkZXZpY2U7CisJc3RydWN0IHNlbWFwaG9yZSBsb2NrOwkvKiBGb3Igc2VyaWFsaXphdGlvbiAqLworCXN0cnVjdCBjb21wbGV0aW9uIHdhaXQ7CS8qIEZvciBTQ1NJIGNvbW1hbmRzICovCisJc3RydWN0IHN0X2J1ZmZlciAqYnVmZmVyOworCisJLyogRHJpdmUgY2hhcmFjdGVyaXN0aWNzICovCisJdW5zaWduZWQgY2hhciBvbWl0X2Jsa2xpbXM7CisJdW5zaWduZWQgY2hhciBkb19hdXRvX2xvY2s7CisJdW5zaWduZWQgY2hhciBjYW5fYnNyOworCXVuc2lnbmVkIGNoYXIgY2FuX3BhcnRpdGlvbnM7CisJdW5zaWduZWQgY2hhciB0d29fZm07CisJdW5zaWduZWQgY2hhciBmYXN0X210ZW9tOworCXVuc2lnbmVkIGNoYXIgaW1tZWRpYXRlOworCXVuc2lnbmVkIGNoYXIgcmVzdHJfZG1hOworCXVuc2lnbmVkIGNoYXIgc2NzaTJfbG9naWNhbDsKKwl1bnNpZ25lZCBjaGFyIGRlZmF1bHRfZHJ2YnVmZmVyOwkvKiAweGZmID0gZG9uJ3QgdG91Y2gsIHZhbHVlIDMgYml0cyAqLworCXVuc2lnbmVkIGNoYXIgY2xuX21vZGU7CQkJLyogMCA9IG5vbmUsIG90aGVyd2lzZSBzZW5zZSBieXRlIG5iciAqLworCXVuc2lnbmVkIGNoYXIgY2xuX3NlbnNlX3ZhbHVlOworCXVuc2lnbmVkIGNoYXIgY2xuX3NlbnNlX21hc2s7CisJdW5zaWduZWQgY2hhciB1c2VfcGY7CQkJLyogU2V0IFBhZ2UgRm9ybWF0IGJpdCBpbiBhbGwgbW9kZSBzZWxlY3RzPyAqLworCXVuc2lnbmVkIGNoYXIgdHJ5X2RpbzsJCQkvKiB0cnkgZGlyZWN0IGkvbz8gKi8KKwl1bnNpZ25lZCBjaGFyIGNfYWxnbzsJCQkvKiBjb21wcmVzc2lvbiBhbGdvcml0aG0gKi8KKwl1bnNpZ25lZCBjaGFyIHBvc191bmtub3duOwkJCS8qIGFmdGVyIHJlc2V0IHBvc2l0aW9uIHVua25vd24gKi8KKwlpbnQgdGFwZV90eXBlOworCWludCBsb25nX3RpbWVvdXQ7CS8qIHRpbWVvdXQgZm9yIGNvbW1hbmRzIGtub3duIHRvIHRha2UgbG9uZyB0aW1lICovCisKKwl1bnNpZ25lZCBsb25nIG1heF9wZm47CS8qIHRoZSBtYXhpbXVtIHBhZ2UgbnVtYmVyIHJlYWNoYWJsZSBieSB0aGUgSEJBICovCisKKwkvKiBNb2RlIGNoYXJhY3RlcmlzdGljcyAqLworCXN0cnVjdCBzdF9tb2RlZGVmIG1vZGVzW1NUX05CUl9NT0RFU107CisJaW50IGN1cnJlbnRfbW9kZTsKKworCS8qIFN0YXR1cyB2YXJpYWJsZXMgKi8KKwlpbnQgcGFydGl0aW9uOworCWludCBuZXdfcGFydGl0aW9uOworCWludCBuYnJfcGFydGl0aW9uczsJLyogemVybyB1bnRpbCBwYXJ0aXRpb24gc3VwcG9ydCBlbmFibGVkICovCisJc3RydWN0IHN0X3BhcnRzdGF0IHBzW1NUX05CUl9QQVJUSVRJT05TXTsKKwl1bnNpZ25lZCBjaGFyIGRpcnR5OworCXVuc2lnbmVkIGNoYXIgcmVhZHk7CisJdW5zaWduZWQgY2hhciB3cml0ZV9wcm90OworCXVuc2lnbmVkIGNoYXIgZHJ2X3dyaXRlX3Byb3Q7CisJdW5zaWduZWQgY2hhciBpbl91c2U7CisJdW5zaWduZWQgY2hhciBibGtzaXplX2NoYW5nZWQ7CisJdW5zaWduZWQgY2hhciBkZW5zaXR5X2NoYW5nZWQ7CisJdW5zaWduZWQgY2hhciBjb21wcmVzc2lvbl9jaGFuZ2VkOworCXVuc2lnbmVkIGNoYXIgZHJ2X2J1ZmZlcjsKKwl1bnNpZ25lZCBjaGFyIGRlbnNpdHk7CisJdW5zaWduZWQgY2hhciBkb29yX2xvY2tlZDsKKwl1bnNpZ25lZCBjaGFyIGF1dG9yZXdfZGV2OyAgIC8qIGF1dG8tcmV3aW5kIGRldmljZSAqLworCXVuc2lnbmVkIGNoYXIgcmV3X2F0X2Nsb3NlOyAgLyogcmV3aW5kIG5lY2Vzc2FyeSBhdCBjbG9zZSAqLworCXVuc2lnbmVkIGNoYXIgaW5pdGVkOworCXVuc2lnbmVkIGNoYXIgY2xlYW5pbmdfcmVxOyAgLyogY2xlYW5pbmcgcmVxdWVzdGVkPyAqLworCWludCBibG9ja19zaXplOworCWludCBtaW5fYmxvY2s7CisJaW50IG1heF9ibG9jazsKKwlpbnQgcmVjb3Zlcl9jb3VudDsgICAgIC8qIEZyb20gdGFwZSBvcGVuaW5nICovCisJaW50IHJlY292ZXJfcmVnOyAgICAgICAvKiBGcm9tIGxhc3Qgc3RhdHVzIGNhbGwgKi8KKworI2lmIERFQlVHCisJdW5zaWduZWQgY2hhciB3cml0ZV9wZW5kaW5nOworCWludCBuYnJfZmluaXNoZWQ7CisJaW50IG5icl93YWl0czsKKwlpbnQgbmJyX3JlcXVlc3RzOworCWludCBuYnJfZGlvOworCWludCBuYnJfcGFnZXM7CisJaW50IG5icl9jb21iaW5hYmxlOworCXVuc2lnbmVkIGNoYXIgbGFzdF9jbW5kWzZdOworCXVuc2lnbmVkIGNoYXIgbGFzdF9zZW5zZVsxNl07CisjZW5kaWYKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKK307CisKKy8qIEJpdCBtYXNrcyBmb3IgdXNlX3BmICovCisjZGVmaW5lIFVTRV9QRiAgICAgIDEKKyNkZWZpbmUgUEZfVEVTVEVEICAgMgorCisvKiBWYWx1ZXMgb2YgZW9mICovCisjZGVmaW5lCVNUX05PRU9GCTAKKyNkZWZpbmUgU1RfRk1fSElUICAgICAgIDEKKyNkZWZpbmUgU1RfRk0gICAgICAgICAgIDIKKyNkZWZpbmUgU1RfRU9NX09LICAgICAgIDMKKyNkZWZpbmUgU1RfRU9NX0VSUk9SCTQKKyNkZWZpbmUJU1RfRU9EXzEgICAgICAgIDUKKyNkZWZpbmUgU1RfRU9EXzIgICAgICAgIDYKKyNkZWZpbmUgU1RfRU9ECQk3CisvKiBFT0QgaGl0IHdoaWxlIHJlYWRpbmcgPT4gU1RfRU9EXzEgPT4gcmV0dXJuIHplcm8gPT4gU1RfRU9EXzIgPT4KKyAgIHJldHVybiB6ZXJvID0+IFNUX0VPRCwgcmV0dXJuIEVOT1NQQyAqLworLyogV2hlbiB3cml0aW5nOiBTVF9FT01fT0sgPT0gZWFybHkgd2FybmluZyBmb3VuZCwgd3JpdGUgT0sKKwkJIFNUX0VPRF8xICA9PSBhbGxvdyB0cnlpbmcgbmV3IHdyaXRlIGFmdGVyIGVhcmx5IHdhcm5pbmcKKwkJIFNUX0VPTV9FUlJPUiA9PSBlYXJseSB3YXJuaW5nIGZvdW5kLCBub3QgYWJsZSB0byB3cml0ZSBhbGwgKi8KKworLyogVmFsdWVzIG9mIHJ3ICovCisjZGVmaW5lCVNUX0lETEUJCTAKKyNkZWZpbmUJU1RfUkVBRElORwkxCisjZGVmaW5lCVNUX1dSSVRJTkcJMgorCisvKiBWYWx1ZXMgb2YgcmVhZHkgc3RhdGUgKi8KKyNkZWZpbmUgU1RfUkVBRFkJMAorI2RlZmluZSBTVF9OT1RfUkVBRFkJMQorI2RlZmluZSBTVF9OT19UQVBFCTIKKworLyogVmFsdWVzIGZvciBkb29yIGxvY2sgc3RhdGUgKi8KKyNkZWZpbmUgU1RfVU5MT0NLRUQJMAorI2RlZmluZSBTVF9MT0NLRURfRVhQTElDSVQgMQorI2RlZmluZSBTVF9MT0NLRURfQVVUTyAgMgorI2RlZmluZSBTVF9MT0NLX0ZBSUxTICAgMworCisvKiBQb3NpdGlvbmluZyBTQ1NJLWNvbW1hbmRzIGZvciBUYW5kYmVyZywgZXRjLiBkcml2ZXMgKi8KKyNkZWZpbmUJUUZBX1JFUVVFU1RfQkxPQ0sJMHgwMgorI2RlZmluZQlRRkFfU0VFS19CTE9DSwkJMHgwYworCisvKiBTZXR0aW5nIHRoZSBiaW5hcnkgb3B0aW9ucyAqLworI2RlZmluZSBTVF9ET05UX1RPVUNIICAwCisjZGVmaW5lIFNUX05PICAgICAgICAgIDEKKyNkZWZpbmUgU1RfWUVTICAgICAgICAgMgorCisjZGVmaW5lIEVYVEVOREVEX1NFTlNFX1NUQVJUICAxOAorCisvKiBNYXNrcyBmb3Igc29tZSBjb25kaXRpb25zIGluIHRoZSBzZW5zZSBkYXRhICovCisjZGVmaW5lIFNFTlNFX0ZNSyAgIDB4ODAKKyNkZWZpbmUgU0VOU0VfRU9NICAgMHg0MAorI2RlZmluZSBTRU5TRV9JTEkgICAweDIwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N0X29wdGlvbnMuaCBiL2RyaXZlcnMvc2NzaS9zdF9vcHRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiNWM5YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zdF9vcHRpb25zLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgICBUaGUgY29tcGlsZS10aW1lIGNvbmZpZ3VyYWJsZSBkZWZhdWx0cyBmb3IgdGhlIExpbnV4IFNDU0kgdGFwZSBkcml2ZXIuCisKKyAgIENvcHlyaWdodCAxOTk1LTIwMDMgS2FpIE1ha2lzYXJhLgorCisgICBMYXN0IG1vZGlmaWVkOiBNb24gQXByICA3IDIyOjQ5OjE4IDIwMDMgYnkgbWFraXNhcmEKKyovCisKKyNpZm5kZWYgX1NUX09QVElPTlNfSAorI2RlZmluZSBfU1RfT1BUSU9OU19ICisKKy8qIElmIFRSWV9ESVJFQ1RfSU8gaXMgbm9uLXplcm8sIHRoZSBkcml2ZXIgdHJpZXMgdG8gdHJhbnNmZXIgZGF0YSBkaXJlY3RseQorICAgYmV0d2VlbiB0aGUgdXNlciBidWZmZXIgYW5kIHRhcGUgZHJpdmUuIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCBkcml2ZXIKKyAgIGJ1ZmZlciBpcyB1c2VkLiBJZiBUUllfRElSRUNUX0lPIGlzIHplcm8sIGRyaXZlciBidWZmZXIgaXMgYWx3YXlzIHVzZWQuICovCisjZGVmaW5lIFRSWV9ESVJFQ1RfSU8gMQorCisvKiBUaGUgZHJpdmVyIGRvZXMgbm90IHdhaXQgZm9yIHNvbWUgb3BlcmF0aW9ucyB0byBmaW5pc2ggYmVmb3JlIHJldHVybmluZworICAgdG8gdGhlIHVzZXIgcHJvZ3JhbSBpZiBTVF9OT1dBSVQgaXMgbm9uLXplcm8uIFRoaXMgaGVscHMgaWYgdGhlIFNDU0kKKyAgIGFkYXB0ZXIgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBvdXRzdGFuZGluZyBjb21tYW5kcy4gSG93ZXZlciwgdGhlIHVzZXIKKyAgIHNob3VsZCBub3QgZ2l2ZSBhIG5ldyB0YXBlIGNvbW1hbmQgYmVmb3JlIHRoZSBwcmV2aW91cyBvbmUgaGFzIGZpbmlzaGVkLiAqLworI2RlZmluZSBTVF9OT1dBSVQgMAorCisvKiBJZiBTVF9JTl9GSUxFX1BPUyBpcyBub256ZXJvLCB0aGUgZHJpdmVyIHBvc2l0aW9ucyB0aGUgdGFwZSBhZnRlciB0aGUKKyAgIHJlY29yZCBiZWVuIHJlYWQgYnkgdGhlIHVzZXIgcHJvZ3JhbSBldmVuIGlmIHRoZSB0YXBlIGhhcyBtb3ZlZCBmdXJ0aGVyCisgICBiZWNhdXNlIG9mIGJ1ZmZlcmVkIHJlYWRzLiBTaG91bGQgYmUgc2V0IHRvIHplcm8gdG8gc3VwcG9ydCBhbHNvIGRyaXZlcworICAgdGhhdCBjYW4ndCBzcGFjZSBiYWNrd2FyZHMgb3ZlciByZWNvcmRzLiBOT1RFOiBUaGUgdGFwZSB3aWxsIGJlCisgICBzcGFjZWQgYmFja3dhcmRzIG92ZXIgYW4gImFjY2lkZW50YWxseSIgY3Jvc3NlZCBmaWxlbWFyayBpbiBhbnkgY2FzZS4gKi8KKyNkZWZpbmUgU1RfSU5fRklMRV9QT1MgMAorCisvKiBJZiBTVF9SRUNPVkVSRURfV1JJVEVfRkFUQUwgaXMgbm9uLXplcm8sIHJlY292ZXJlZCBlcnJvcnMgd2hpbGUgd3JpdGluZworICAgYXJlIGNvbnNpZGVyZWQgImhhcmQgZXJyb3JzIi4gKi8KKyNkZWZpbmUgU1RfUkVDT1ZFUkVEX1dSSVRFX0ZBVEFMIDAKKworLyogVGhlICJndWVzcyIgZm9yIHRoZSBibG9jayBzaXplIGZvciBkZXZpY2VzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBNT0RFCisgICBTRU5TRS4gKi8KKyNkZWZpbmUgU1RfREVGQVVMVF9CTE9DSyAwCisKKy8qIFRoZSBtaW5pbXVtIHRhcGUgZHJpdmVyIGJ1ZmZlciBzaXplIGluIGtpbG9ieXRlcyBpbiBmaXhlZCBibG9jayBtb2RlLgorICAgTXVzdCBiZSBub24temVyby4gKi8KKyNkZWZpbmUgU1RfRklYRURfQlVGRkVSX0JMT0NLUyAzMgorCisvKiBNYXhpbXVtIG51bWJlciBvZiBzY2F0dGVyL2dhdGhlciBzZWdtZW50cyAqLworI2RlZmluZSBTVF9NQVhfU0cgICAgICAyNTYKKworLyogVGhlIG51bWJlciBvZiBzY2F0dGVyL2dhdGhlciBzZWdtZW50cyB0byBhbGxvY2F0ZSBhdCBmaXJzdCB0cnkgKG11c3QgYmUKKyAgIHNtYWxsZXIgb3IgZXF1YWwgdG8gdGhlIG1heGltdW0pLiAqLworI2RlZmluZSBTVF9GSVJTVF9TRyAgICA4CisKKy8qIFRoZSBzaXplIG9mIHRoZSBmaXJzdCBzY2F0dGVyL2dhdGhlciBzZWdtZW50cyAoZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBibG9jaworICAgc2l6ZSBmb3IgU0NTSSBhZGFwdGVycyBub3Qgc3VwcG9ydGluZyBzY2F0dGVyL2dhdGhlcikuIFRoZSBkZWZhdWx0IGlzIHNldAorICAgdG8gdHJ5IHRvIGFsbG9jYXRlIHRoZSBidWZmZXIgYXMgb25lIGNodW5rLiAqLworI2RlZmluZSBTVF9GSVJTVF9PUkRFUiAgNQorCisKKy8qIFRoZSBmb2xsb3dpbmcgbGluZXMgZGVmaW5lIGRlZmF1bHRzIGZvciBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHNldAorICAgc2VwYXJhdGVseSBmb3IgZWFjaCBkcml2ZSB1c2luZyB0aGUgTVRTVE9QVElPTlMgaW9jdGwuICovCisKKy8qIElmIFNUX1RXT19GTSBpcyBub24temVybywgdGhlIGRyaXZlciB3cml0ZXMgdHdvIGZpbGVtYXJrcyBhZnRlciBhCisgICBmaWxlIGJlaW5nIHdyaXR0ZW4uIFNvbWUgZHJpdmVzIGNhbid0IGhhbmRsZSB0d28gZmlsZW1hcmtzIGF0IHRoZQorICAgZW5kIG9mIGRhdGEuICovCisjZGVmaW5lIFNUX1RXT19GTSAwCisKKy8qIElmIFNUX0JVRkZFUl9XUklURVMgaXMgbm9uLXplcm8sIHdyaXRlcyBpbiBmaXhlZCBibG9jayBtb2RlIGFyZQorICAgYnVmZmVyZWQgdW50aWwgdGhlIGRyaXZlciBidWZmZXIgaXMgZnVsbCBvciBhc3luY2hyb25vdXMgd3JpdGUgaXMKKyAgIHRyaWdnZXJlZC4gTWF5IG1ha2UgZGV0ZWN0aW9uIG9mIEVuZC1PZi1NZWRpdW0gZWFybHkgZW5vdWdoIGZhaWwuICovCisjZGVmaW5lIFNUX0JVRkZFUl9XUklURVMgMQorCisvKiBJZiBTVF9BU1lOQ19XUklURVMgaXMgbm9uLXplcm8sIHRoZSBTQ1NJIHdyaXRlIGNvbW1hbmQgbWF5IGJlIHN0YXJ0ZWQKKyAgIHdpdGhvdXQgd2FpdGluZyBmb3IgaXQgdG8gZmluaXNoLiBNYXkgY2F1c2UgcHJvYmxlbXMgaW4gbXVsdGlwbGUKKyAgIHRhcGUgYmFja3Vwcy4gKi8KKyNkZWZpbmUgU1RfQVNZTkNfV1JJVEVTIDEKKworLyogSWYgU1RfUkVBRF9BSEVBRCBpcyBub24temVybywgYmxvY2tzIGFyZSByZWFkIGFoZWFkIGluIGZpeGVkIGJsb2NrCisgICBtb2RlLiAqLworI2RlZmluZSBTVF9SRUFEX0FIRUFEIDEKKworLyogSWYgU1RfQVVUT19MT0NLIGlzIG5vbi16ZXJvLCB0aGUgZHJpdmUgZG9vciBpcyBsb2NrZWQgYXQgdGhlIGZpcnN0CisgICByZWFkIG9yIHdyaXRlIGNvbW1hbmQgYWZ0ZXIgdGhlIGRldmljZSBpcyBvcGVuZWQuIFRoZSBkb29yIGlzIG9wZW5lZAorICAgd2hlbiB0aGUgZGV2aWNlIGlzIGNsb3NlZC4gKi8KKyNkZWZpbmUgU1RfQVVUT19MT0NLIDAKKworLyogSWYgU1RfRkFTVF9NVEVPTSBpcyBub24temVybywgdGhlIE1URU9NIGlvY3RsIGlzIGRvbmUgdXNpbmcgdGhlCisgICBkaXJlY3QgU0NTSSBjb21tYW5kLiBUaGUgZmlsZSBudW1iZXIgc3RhdHVzIGlzIGxvc3QgYnV0IHRoaXMgbWV0aG9kCisgICBpcyBmYXN0IHdpdGggc29tZSBkcml2ZXMuIE90aGVyd2lzZSBNVEVPTSBpcyBkb25lIGJ5IHNwYWNpbmcgb3ZlcgorICAgZmlsZXMgYW5kIHRoZSBmaWxlIG51bWJlciBzdGF0dXMgaXMgcmV0YWluZWQuICovCisjZGVmaW5lIFNUX0ZBU1RfTVRFT00gMAorCisvKiBJZiBTVF9TQ1NJMkxPR0lDQUwgaXMgbm9uemVybywgdGhlIGxvZ2ljYWwgYmxvY2sgYWRkcmVzc2VzIGFyZSB1c2VkIGZvcgorICAgTVRJT0NQT1MgYW5kIE1UU0VFSyBieSBkZWZhdWx0LiBWZW5kb3IgYWRkcmVzc2VzIGFyZSB1c2VkIGlmIFNUX1NDU0kyTE9HSUNBTAorICAgaXMgemVyby4gKi8KKyNkZWZpbmUgU1RfU0NTSTJMT0dJQ0FMIDAKKworLyogSWYgU1RfU1lTViBpcyBub24temVybywgdGhlIHRhcGUgYmVoYXZlcyBhY2NvcmRpbmcgdG8gdGhlIFNZUyBWIHNlbWFudGljcy4KKyAgIFRoZSBkZWZhdWx0IGlzIEJTRCBzZW1hbnRpY3MuICovCisjZGVmaW5lIFNUX1NZU1YgMAorCisvKiBUaW1lIHRvIHdhaXQgZm9yIHRoZSBkcml2ZSB0byBiZWNvbWUgcmVhZHkgaWYgYmxvY2tpbmcgb3BlbiAqLworI2RlZmluZSBTVF9CTE9DS19TRUNPTkRTICAgICAxMjAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3VuM19OQ1I1MzgwLmMgYi9kcml2ZXJzL3Njc2kvc3VuM19OQ1I1MzgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4MTEzOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zdW4zX05DUjUzODAuYwpAQCAtMCwwICsxLDMwMDkgQEAKKy8qIHN1bjNfTkNSNTM4MC5jIC0tIGFkYXB0ZWQgZnJvbSBhdGFyaV9OQ1I1MzgwLmMgZm9yIHRoZSBzdW4zIGJ5IAorICAgU2FtIENyZWFzZXkuICovIAorLyogCisgKiBOQ1IgNTM4MCBnZW5lcmljIGRyaXZlciByb3V0aW5lcy4gIFRoZXNlIHNob3VsZCBtYWtlIGl0ICp0cml2aWFsKgorICogCXRvIGltcGxlbWVudCA1MzgwIFNDU0kgZHJpdmVycyB1bmRlciBMaW51eCB3aXRoIGEgbm9uLXRyYW50b3IKKyAqCWFyY2hpdGVjdHVyZS4KKyAqCisgKglOb3RlIHRoYXQgdGhlc2Ugcm91dGluZXMgYWxzbyB3b3JrIHdpdGggTlI1M2M0MDAgZmFtaWx5IGNoaXBzLgorICoKKyAqIENvcHlyaWdodCAxOTkzLCBEcmV3IEVja2hhcmR0CisgKglWaXNpb25hcnkgQ29tcHV0aW5nIAorICoJKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyAqIAlkcmV3QGNvbG9yYWRvLmVkdQorICoJKzEgKDMwMykgNjY2LTU4MzYKKyAqCisgKiBESVNUUklCVVRJT04gUkVMRUFTRSA2LiAKKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKgorICogTkNSIDUzODAgRmFtaWx5CisgKiBTQ1NJIFByb3RvY29sIENvbnRyb2xsZXIKKyAqIERhdGFib29rCisgKgorICogTkNSIE1pY3JvZWxlY3Ryb25pY3MKKyAqIDE2MzUgQWVyb3BsYXphIERyaXZlCisgKiBDb2xvcmFkbyBTcHJpbmdzLCBDTyA4MDkxNgorICogMSsgKDcxOSkgNTc4LTM0MDAKKyAqIDErICg4MDApIDMzNC01NDU0CisgKi8KKworLyoKKyAqICsrcm9tYW46IFRvIHBvcnQgdGhlIDUzODAgZHJpdmVyIHRvIHRoZSBBdGFyaSwgSSBoYWQgdG8gZG8gc29tZSBjaGFuZ2VzIGluCisgKiB0aGlzIGZpbGUsIHRvbzoKKyAqCisgKiAgLSBTb21lIG9mIHRoZSBkZWJ1ZyBzdGF0ZW1lbnRzIHdlcmUgaW5jb3JyZWN0ICh1bmRlZmluZWQgdmFyaWFibGVzIGFuZCB0aGUKKyAqICAgIGxpa2UpLiBJIGZpeGVkIHRoYXQuCisgKgorICogIC0gSW4gaW5mb3JtYXRpb25fdHJhbnNmZXIoKSwgSSB0aGluayBhICNpZmRlZiB3YXMgd3JvbmcuIExvb2tpbmcgYXQgdGhlCisgKiAgICBwb3NzaWJsZSBETUEgdHJhbnNmZXIgc2l6ZSBzaG91bGQgYWxzbyBoYXBwZW4gZm9yIFJFQUxfRE1BLiBJIGFkZGVkIHRoaXMKKyAqICAgIGluIHRoZSAjaWYgc3RhdGVtZW50LgorICoKKyAqICAtIFdoZW4gdXNpbmcgcmVhbCBETUEsIGluZm9ybWF0aW9uX3RyYW5zZmVyKCkgc2hvdWxkIHJldHVybiBpbiBhIERBVEFPVVQKKyAqICAgIHBoYXNlIGFmdGVyIHN0YXJ0aW5nIHRoZSBETUEuIEl0IGhhcyBub3RoaW5nIG1vcmUgdG8gZG8uCisgKgorICogIC0gVGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgc2hvdWxkIHJ1biBtYWluIGFmdGVyIGVuZCBvZiBETUEsIHRvbyAobm90CisgKiAgICBvbmx5IGFmdGVyIFJFU0VMRUNUSU9OIGludGVycnVwdHMpLiBBZGRpdGlvbmFsbHksIGl0IHNob3VsZCBfbm90XyB0ZXN0CisgKiAgICBmb3IgbW9yZSBpbnRlcnJ1cHRzIGFmdGVyIHJ1bm5pbmcgbWFpbiwgc2luY2UgYSBETUEgcHJvY2VzcyBtYXkgaGF2ZQorICogICAgYmVlbiBzdGFydGVkIGFuZCBpbnRlcnJ1cHRzIGFyZSB0dXJuZWQgb24gbm93LiBUaGUgbmV3IGludCBjb3VsZCBoYXBwZW4KKyAqICAgIGluc2lkZSB0aGUgZXhlY3V0aW9uIG9mIE5DUjUzODBfaW50cigpLCBsZWFkaW5nIHRvIHJlY3Vyc2l2ZQorICogICAgY2FsbHMuCisgKgorICogIC0gSSd2ZSBhZGRlZCBhIGZ1bmN0aW9uIG1lcmdlX2NvbnRpZ3VvdXNfYnVmZmVycygpIHRoYXQgdHJpZXMgdG8KKyAqICAgIG1lcmdlIHNjYXR0ZXItZ2F0aGVyIGJ1ZmZlcnMgdGhhdCBhcmUgbG9jYXRlZCBhdCBjb250aWd1b3VzCisgKiAgICBwaHlzaWNhbCBhZGRyZXNzZXMgYW5kIGNhbiBiZSBwcm9jZXNzZWQgd2l0aCB0aGUgc2FtZSBETUEgc2V0dXAuCisgKiAgICBTaW5jZSBtb3N0IHNjYXR0ZXItZ2F0aGVyIG9wZXJhdGlvbnMgd29yayBvbiBhIHBhZ2UgKDRLKSBvZgorICogICAgNCBidWZmZXJzICgxSyksIGluIG1vcmUgdGhhbiA5MCUgb2YgYWxsIGNhc2VzIHRocmVlIGludGVycnVwdHMgYW5kCisgKiAgICBETUEgc2V0dXAgYWN0aW9ucyBhcmUgc2F2ZWQuCisgKgorICogLSBJJ3ZlIGRlbGV0ZWQgYWxsIHRoZSBzdHVmZiBmb3IgQVVUT1BST0JFX0lSUSwgUkVBTF9ETUFfUE9MTCwgUFNFVURPX0RNQQorICogICAgYW5kIFVTTEVFUCwgYmVjYXVzZSB0aGVzZSB3ZXJlIG1lc3NpbmcgdXAgcmVhZGFiaWxpdHkgYW5kIHdpbGwgbmV2ZXIgYmUKKyAqICAgIG5lZWRlZCBmb3IgQXRhcmkgU0NTSS4KKyAqIAorICogLSBJJ3ZlIHJldmlzZWQgdGhlIE5DUjUzODBfbWFpbigpIGNhbGxpbmcgc2NoZW1lIChyZWxheCB0aGUgJ21haW5fcnVubmluZycKKyAqICAgc3R1ZmYpLCBhbmQgJ21haW4nIGlzIGV4ZWN1dGVkIGluIGEgYm90dG9tIGhhbGYgaWYgYXdva2VuIGJ5IGFuCisgKiAgIGludGVycnVwdC4KKyAqCisgKiAtIFRoZSBjb2RlIHdhcyBxdWl0ZSBjbHV0dGVyZWQgdXAgYnkgIiNpZiAoTkRFQlVHICYgTkRFQlVHXyopIHByaW50ay4uLiIKKyAqICAgY29uc3RydWN0cy4gSW4gbXkgZXllcywgdGhpcyBtYWRlIHRoZSBzb3VyY2UgcmF0aGVyIHVucmVhZGFibGUsIHNvIEkKKyAqICAgZmluYWxseSByZXBsYWNlZCB0aGF0IGJ5IHRoZSAqX1BSSU5USygpIG1hY3Jvcy4KKyAqCisgKi8KKworLyoKKyAqIEZ1cnRoZXIgZGV2ZWxvcG1lbnQgLyB0ZXN0aW5nIHRoYXQgc2hvdWxkIGJlIGRvbmUgOiAKKyAqIDEuICBUZXN0IGxpbmtlZCBjb21tYW5kIGhhbmRsaW5nIGNvZGUgYWZ0ZXIgRXJpYyBpcyByZWFkeSB3aXRoIAorICogICAgIHRoZSBoaWdoIGxldmVsIGNvZGUuCisgKi8KKworI2lmIChOREVCVUcgJiBOREVCVUdfTElTVFMpCisjZGVmaW5lIExJU1QoeCx5KSBcCisgIHsgcHJpbnRrKCJMSU5FOiVkICAgQWRkaW5nICVwIHRvICVwXG4iLCBfX0xJTkVfXywgKHZvaWQqKSh4KSwgKHZvaWQqKSh5KSk7IFwKKyAgICBpZiAoKHgpPT0oeSkpIHVkZWxheSg1KTsgfQorI2RlZmluZSBSRU1PVkUodyx4LHkseikgXAorICB7IHByaW50aygiTElORTolZCAgIFJlbW92aW5nOiAlcC0+JXAgICVwLT4lcCBcbiIsIF9fTElORV9fLCBcCisJICAgKHZvaWQqKSh3KSwgKHZvaWQqKSh4KSwgKHZvaWQqKSh5KSwgKHZvaWQqKSh6KSk7IFwKKyAgICBpZiAoKHgpPT0oeSkpIHVkZWxheSg1KTsgfQorI2Vsc2UKKyNkZWZpbmUgTElTVCh4LHkpCisjZGVmaW5lIFJFTU9WRSh3LHgseSx6KQorI2VuZGlmCisKKyNpZm5kZWYgbm90eWV0CisjdW5kZWYgTElOS0VECisjZW5kaWYKKworLyoKKyAqIERlc2lnbgorICogSXNzdWVzIDoKKyAqCisgKiBUaGUgb3RoZXIgTGludXggU0NTSSBkcml2ZXJzIHdlcmUgd3JpdHRlbiB3aGVuIExpbnV4IHdhcyBJbnRlbCBQQy1vbmx5LAorICogYW5kIHNwZWNpZmljYWxseSBmb3IgZWFjaCBib2FyZCByYXRoZXIgdGhhbiBlYWNoIGNoaXAuICBUaGlzIG1ha2VzIHRoZWlyCisgKiBhZGFwdGF0aW9uIHRvIHBsYXRmb3JtcyBsaWtlIHRoZSBNYWMgKFNvbWUgb2Ygd2hpY2ggdXNlIE5DUjUzODAncykKKyAqIG1vcmUgZGlmZmljdWx0IHRoYW4gaXQgaGFzIHRvIGJlLgorICoKKyAqIEFsc28sIG1hbnkgb2YgdGhlIFNDU0kgZHJpdmVycyB3ZXJlIHdyaXR0ZW4gYmVmb3JlIHRoZSBjb21tYW5kIHF1ZXVpbmcKKyAqIHJvdXRpbmVzIHdlcmUgaW1wbGVtZW50ZWQsIG1lYW5pbmcgdGhlaXIgaW1wbGVtZW50YXRpb25zIG9mIHF1ZXVlZCAKKyAqIGNvbW1hbmRzIHdlcmUgaGFja2VkIG9uIHJhdGhlciB0aGFuIGRlc2lnbmVkIGluIGZyb20gdGhlIHN0YXJ0LgorICoKKyAqIFdoZW4gSSBkZXNpZ25lZCB0aGUgTGludXggU0NTSSBkcml2ZXJzIEkgZmlndXJlZCB0aGF0IAorICogd2hpbGUgaGF2aW5nIHR3byBkaWZmZXJlbnQgU0NTSSBib2FyZHMgaW4gYSBzeXN0ZW0gbWlnaHQgYmUgdXNlZnVsCisgKiBmb3IgZGVidWdnaW5nIHRoaW5ncywgdHdvIG9mIHRoZSBzYW1lIHR5cGUgd291bGRuJ3QgYmUgdXNlZC4KKyAqIFdlbGwsIEkgd2FzIHdyb25nIGFuZCBhIG51bWJlciBvZiB1c2VycyBoYXZlIG1haWxlZCBtZSBhYm91dCBydW5uaW5nCisgKiBtdWx0aXBsZSBoaWdoLXBlcmZvcm1hbmNlIFNDU0kgYm9hcmRzIGluIGEgc2VydmVyLgorICoKKyAqIEZpbmFsbHksIHdoZW4gSSBnZXQgcXVlc3Rpb25zIGZyb20gdXNlcnMsIEkgaGF2ZSBubyBpZGVhIHdoYXQgCisgKiByZXZpc2lvbiBvZiBteSBkcml2ZXIgdGhleSBhcmUgcnVubmluZy4KKyAqCisgKiBUaGlzIGRyaXZlciBhdHRlbXB0cyB0byBhZGRyZXNzIHRoZXNlIHByb2JsZW1zIDoKKyAqIFRoaXMgaXMgYSBnZW5lcmljIDUzODAgZHJpdmVyLiAgVG8gdXNlIGl0IG9uIGEgZGlmZmVyZW50IHBsYXRmb3JtLCAKKyAqIG9uZSBzaW1wbHkgd3JpdGVzIGFwcHJvcHJpYXRlIHN5c3RlbSBzcGVjaWZpYyBtYWNyb3MgKGllLCBkYXRhCisgKiB0cmFuc2ZlciAtIHNvbWUgUEMncyB3aWxsIHVzZSB0aGUgSS9PIGJ1cywgNjhLJ3MgbXVzdCB1c2UgCisgKiBtZW1vcnkgbWFwcGVkKSBhbmQgZHJvcHMgdGhpcyBmaWxlIGluIHRoZWlyICdDJyB3cmFwcGVyLgorICoKKyAqIEFzIGZhciBhcyBjb21tYW5kIHF1ZXVlaW5nLCB0d28gcXVldWVzIGFyZSBtYWludGFpbmVkIGZvciAKKyAqIGVhY2ggNTM4MCBpbiB0aGUgc3lzdGVtIC0gY29tbWFuZHMgdGhhdCBoYXZlbid0IGJlZW4gaXNzdWVkIHlldCwKKyAqIGFuZCBjb21tYW5kcyB0aGF0IGFyZSBjdXJyZW50bHkgZXhlY3V0aW5nLiAgVGhpcyBtZWFucyB0aGF0IGFuIAorICogdW5saW1pdGVkIG51bWJlciBvZiBjb21tYW5kcyBtYXkgYmUgcXVldWVkLCBsZXR0aW5nIAorICogbW9yZSBjb21tYW5kcyBwcm9wYWdhdGUgZnJvbSB0aGUgaGlnaGVyIGRyaXZlciBsZXZlbHMgZ2l2aW5nIGhpZ2hlciAKKyAqIHRocm91Z2hwdXQuICBOb3RlIHRoYXQgYm90aCBJX1RfTCBhbmQgSV9UX0xfUSBuZXh1c2VzIGFyZSBzdXBwb3J0ZWQsIAorICogYWxsb3dpbmcgbXVsdGlwbGUgY29tbWFuZHMgdG8gcHJvcGFnYXRlIGFsbCB0aGUgd2F5IHRvIGEgU0NTSS1JSSBkZXZpY2UgCisgKiB3aGlsZSBhIGNvbW1hbmQgaXMgYWxyZWFkeSBleGVjdXRpbmcuCisgKgorICogVG8gc29sdmUgdGhlIG11bHRpcGxlLWJvYXJkcy1pbi10aGUtc2FtZS1zeXN0ZW0gcHJvYmxlbSwgCisgKiB0aGVyZSBpcyBhIHNlcGFyYXRlIGluc3RhbmNlIHN0cnVjdHVyZSBmb3IgZWFjaCBpbnN0YW5jZQorICogb2YgYSA1MzgwIGluIHRoZSBzeXN0ZW0uICBTbywgbXVsdGlwbGUgTkNSNTM4MCBkcml2ZXJzIHdpbGwKKyAqIGJlIGFibGUgdG8gY29leGlzdCB3aXRoIGFwcHJvcHJpYXRlIGNoYW5nZXMgdG8gdGhlIGhpZ2ggbGV2ZWwKKyAqIFNDU0kgY29kZS4gIAorICoKKyAqIEEgTkNSNTM4MF9QVUJMSUNfUkVWSVNJT04gbWFjcm8gaXMgcHJvdmlkZWQsIHdpdGggdGhlIHJlbGVhc2UKKyAqIG51bWJlciAodXBkYXRlZCBmb3IgZWFjaCBwdWJsaWMgcmVsZWFzZSkgcHJpbnRlZCBieSB0aGUgCisgKiBOQ1I1MzgwX3ByaW50X29wdGlvbnMgY29tbWFuZCwgd2hpY2ggc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSAKKyAqIHdyYXBwZXIgZGV0ZWN0IGZ1bmN0aW9uLCBzbyB0aGF0IEkga25vdyB3aGF0IHJlbGVhc2Ugb2YgdGhlIGRyaXZlcgorICogdXNlcnMgYXJlIHVzaW5nLgorICoKKyAqIElzc3VlcyBzcGVjaWZpYyB0byB0aGUgTkNSNTM4MCA6IAorICoKKyAqIFdoZW4gdXNlZCBpbiBhIFBJTyBvciBwc2V1ZG8tZG1hIG1vZGUsIHRoZSBOQ1I1MzgwIGlzIGEgYnJhaW5kZWFkIAorICogcGllY2Ugb2YgaGFyZHdhcmUgdGhhdCByZXF1aXJlcyB5b3UgdG8gc2l0IGluIGEgbG9vcCBwb2xsaW5nIGZvciAKKyAqIHRoZSBSRVEgc2lnbmFsIGFzIGxvbmcgYXMgeW91IGFyZSBjb25uZWN0ZWQuICBTb21lIGRldmljZXMgYXJlIAorICogYnJhaW4gZGVhZCAoaWUsIG1hbnkgVEVYRUwgQ0QgUk9NIGRyaXZlcykgYW5kIHdvbid0IGRpc2Nvbm5lY3QgCisgKiB3aGlsZSBkb2luZyBsb25nIHNlZWsgb3BlcmF0aW9ucy4KKyAqIAorICogVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgaXMgdG8ga2VlcCB0cmFjayBvZiBkZXZpY2VzIHRoYXQgaGF2ZQorICogZGlzY29ubmVjdGVkLiAgSWYgdGhlIGRldmljZSBoYXNuJ3QgZGlzY29ubmVjdGVkLCBmb3IgY29tbWFuZHMgdGhhdAorICogc2hvdWxkIGRpc2Nvbm5lY3QsIHdlIGRvIHNvbWV0aGluZyBsaWtlIAorICoKKyAqIHdoaWxlICghUkVRIGlzIGFzc2VydGVkKSB7IHNsZWVwIGZvciBOIHVzZWNzOyBwb2xsIGZvciBNIHVzZWNzIH0KKyAqIAorICogU29tZSB0d2Vha2luZyBvZiBOIGFuZCBNIG5lZWRzIHRvIGJlIGRvbmUuICBBbiBhbGdvcml0aG0gYmFzZWQgCisgKiBvbiAidGltZSB0byBkYXRhIiB3b3VsZCBnaXZlIHRoZSBiZXN0IHJlc3VsdHMgYXMgbG9uZyBhcyBzaG9ydCB0aW1lCisgKiB0byBkYXRhcyAoaWUsIG9uIHRoZSBzYW1lIHRyYWNrKSB3ZXJlIGNvbnNpZGVyZWQsIGhvd2V2ZXIgdGhlc2UgCisgKiBicm9rZW4gZGV2aWNlcyBhcmUgdGhlIGV4Y2VwdGlvbiByYXRoZXIgdGhhbiB0aGUgcnVsZSBhbmQgSSdkIHJhdGhlcgorICogc3BlbmQgbXkgdGltZSBvcHRpbWl6aW5nIGZvciB0aGUgbm9ybWFsIGNhc2UuCisgKgorICogQXJjaGl0ZWN0dXJlIDoKKyAqCisgKiBBdCB0aGUgaGVhcnQgb2YgdGhlIGRlc2lnbiBpcyBhIGNvcm91dGluZSwgTkNSNTM4MF9tYWluLAorICogd2hpY2ggaXMgc3RhcnRlZCB3aGVuIG5vdCBydW5uaW5nIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwKKyAqIHRpbWVyLCBhbmQgcXVldWUgY29tbWFuZCBmdW5jdGlvbi4gIEl0IGF0dGVtcHRzIHRvIGVzdGFibGlzaAorICogSV9UX0wgb3IgSV9UX0xfUSBuZXh1c2VzIGJ5IHJlbW92aW5nIHRoZSBjb21tYW5kcyBmcm9tIHRoZSAKKyAqIGlzc3VlIHF1ZXVlIGFuZCBjYWxsaW5nIE5DUjUzODBfc2VsZWN0KCkgaWYgYSBuZXh1cyAKKyAqIGlzIG5vdCBlc3RhYmxpc2hlZC4gCisgKgorICogT25jZSBhIG5leHVzIGlzIGVzdGFibGlzaGVkLCB0aGUgTkNSNTM4MF9pbmZvcm1hdGlvbl90cmFuc2ZlcigpCisgKiBwaGFzZSBnb2VzIHRocm91Z2ggdGhlIHZhcmlvdXMgcGhhc2VzIGFzIGluc3RydWN0ZWQgYnkgdGhlIHRhcmdldC4KKyAqIGlmIHRoZSB0YXJnZXQgZ29lcyBpbnRvIE1TRyBJTiBhbmQgc2VuZHMgYSBESVNDT05ORUNUIG1lc3NhZ2UsCisgKiB0aGUgY29tbWFuZCBzdHJ1Y3R1cmUgaXMgcGxhY2VkIGludG8gdGhlIHBlciBpbnN0YW5jZSBkaXNjb25uZWN0ZWQKKyAqIHF1ZXVlLCBhbmQgTkNSNTM4MF9tYWluIHRyaWVzIHRvIGZpbmQgbW9yZSB3b3JrLiAgSWYgVVNMRUVQCisgKiB3YXMgZGVmaW5lZCwgYW5kIHRoZSB0YXJnZXQgaXMgaWRsZSBmb3IgdG9vIGxvbmcsIHRoZSBzeXN0ZW0KKyAqIHdpbGwgdHJ5IHRvIHNsZWVwLgorICoKKyAqIElmIGEgY29tbWFuZCBoYXMgZGlzY29ubmVjdGVkLCBldmVudHVhbGx5IGFuIGludGVycnVwdCB3aWxsIHRyaWdnZXIsCisgKiBjYWxsaW5nIE5DUjUzODBfaW50cigpICB3aGljaCB3aWxsIGluIHR1cm4gY2FsbCBOQ1I1MzgwX3Jlc2VsZWN0CisgKiB0byByZWVzdGFibGlzaCBhIG5leHVzLiAgVGhpcyB3aWxsIHJ1biBtYWluIGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBPbiBjb21tYW5kIHRlcm1pbmF0aW9uLCB0aGUgZG9uZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhcyAKKyAqIGFwcHJvcHJpYXRlLgorICoKKyAqIFNDU0kgcG9pbnRlcnMgYXJlIG1haW50YWluZWQgaW4gdGhlIFNDcCBmaWVsZCBvZiBTQ1NJIGNvbW1hbmQgCisgKiBzdHJ1Y3R1cmVzLCBiZWluZyBpbml0aWFsaXplZCBhZnRlciB0aGUgY29tbWFuZCBpcyBjb25uZWN0ZWQKKyAqIGluIE5DUjUzODBfc2VsZWN0LCBhbmQgc2V0IGFzIGFwcHJvcHJpYXRlIGluIE5DUjUzODBfaW5mb3JtYXRpb25fdHJhbnNmZXIuCisgKiBOb3RlIHRoYXQgaW4gdmlvbGF0aW9uIG9mIHRoZSBzdGFuZGFyZCwgYW4gaW1wbGljaXQgU0FWRSBQT0lOVEVSUyBvcGVyYXRpb24KKyAqIGlzIGRvbmUsIHNpbmNlIHNvbWUgQlJPS0VOIGRpc2tzIGZhaWwgdG8gaXNzdWUgYW4gZXhwbGljaXQgU0FWRSBQT0lOVEVSUy4KKyAqLworCisvKgorICogVXNpbmcgdGhpcyBmaWxlIDoKKyAqIFRoaXMgZmlsZSBhIHNrZWxldG9uIExpbnV4IFNDU0kgZHJpdmVyIGZvciB0aGUgTkNSIDUzODAgc2VyaWVzCisgKiBvZiBjaGlwcy4gIFRvIHVzZSBpdCwgeW91IHdyaXRlIGFuIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBmdW5jdGlvbnMgCisgKiBhbmQgbWFjcm9zIGFuZCBpbmNsdWRlIHRoaXMgZmlsZSBpbiB5b3VyIGRyaXZlci4KKyAqCisgKiBUaGVzZSBtYWNyb3MgY29udHJvbCBvcHRpb25zIDogCisgKiBBVVRPU0VOU0UgLSBpZiBkZWZpbmVkLCBSRVFVRVNUIFNFTlNFIHdpbGwgYmUgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkKKyAqCWZvciBjb21tYW5kcyB0aGF0IHJldHVybiB3aXRoIGEgQ0hFQ0sgQ09ORElUSU9OIHN0YXR1cy4gCisgKgorICogTElOS0VEIC0gaWYgZGVmaW5lZCwgbGlua2VkIGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQuCisgKgorICogUkVBTF9ETUEgLSBpZiBkZWZpbmVkLCBSRUFMIERNQSBpcyB1c2VkIGR1cmluZyB0aGUgZGF0YSB0cmFuc2ZlciBwaGFzZXMuCisgKgorICogU1VQUE9SVF9UQUdTIC0gaWYgZGVmaW5lZCwgU0NTSS0yIHRhZ2dlZCBxdWV1aW5nIGlzIHVzZWQgd2hlcmUgcG9zc2libGUKKyAqCisgKiBUaGVzZSBtYWNyb3MgTVVTVCBiZSBkZWZpbmVkIDoKKyAqIAorICogTkNSNTM4MF9yZWFkKHJlZ2lzdGVyKSAgLSByZWFkIGZyb20gdGhlIHNwZWNpZmllZCByZWdpc3RlcgorICoKKyAqIE5DUjUzODBfd3JpdGUocmVnaXN0ZXIsIHZhbHVlKSAtIHdyaXRlIHRvIHRoZSBzcGVjaWZpYyByZWdpc3RlciAKKyAqCisgKiBFaXRoZXIgcmVhbCBETUEgKm9yKiBwc2V1ZG8gRE1BIG1heSBiZSBpbXBsZW1lbnRlZAorICogUkVBTCBmdW5jdGlvbnMgOiAKKyAqIE5DUjUzODBfUkVBTF9ETUEgc2hvdWxkIGJlIGRlZmluZWQgaWYgcmVhbCBETUEgaXMgdG8gYmUgdXNlZC4KKyAqIE5vdGUgdGhhdCB0aGUgRE1BIHNldHVwIGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgCisgKgl0aGF0IHRoZXkgd2VyZSBhYmxlIHRvIHByb2dyYW0gdGhlIGNvbnRyb2xsZXIgZm9yLgorICoKKyAqIEFsc28gbm90ZSB0aGF0IGdlbmVyaWMgaTM4Ni9QQyB2ZXJzaW9ucyBvZiB0aGVzZSBtYWNyb3MgYXJlIAorICoJYXZhaWxhYmxlIGFzIE5DUjUzODBfaTM4Nl9kbWFfd3JpdGVfc2V0dXAsCisgKglOQ1I1MzgwX2kzODZfZG1hX3JlYWRfc2V0dXAsIGFuZCBOQ1I1MzgwX2kzODZfZG1hX3Jlc2lkdWFsLgorICoKKyAqIE5DUjUzODBfZG1hX3dyaXRlX3NldHVwKGluc3RhbmNlLCBzcmMsIGNvdW50KSAtIGluaXRpYWxpemUKKyAqIE5DUjUzODBfZG1hX3JlYWRfc2V0dXAoaW5zdGFuY2UsIGRzdCwgY291bnQpIC0gaW5pdGlhbGl6ZQorICogTkNSNTM4MF9kbWFfcmVzaWR1YWwoaW5zdGFuY2UpOyAtIHJlc2lkdWFsIGNvdW50CisgKgorICogUFNFVURPIGZ1bmN0aW9ucyA6CisgKiBOQ1I1MzgwX3B3cml0ZShpbnN0YW5jZSwgc3JjLCBjb3VudCkKKyAqIE5DUjUzODBfcHJlYWQoaW5zdGFuY2UsIGRzdCwgY291bnQpOworICoKKyAqIElmIG5vdGhpbmcgc3BlY2lmaWMgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbiBuZWVkcyBkb2luZyAoaWUsIHdpdGggZXh0ZXJuYWwKKyAqIGhhcmR3YXJlKSwgeW91IG11c3QgYWxzbyBkZWZpbmUgCisgKiAgCisgKiBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQKKyAqIE5DUjUzODBfcmVzZXQKKyAqIE5DUjUzODBfYWJvcnQKKyAqIE5DUjUzODBfcHJvY19pbmZvCisgKgorICogdG8gYmUgdGhlIGdsb2JhbCBlbnRyeSBwb2ludHMgaW50byB0aGUgc3BlY2lmaWMgZHJpdmVyLCBpZSAKKyAqICNkZWZpbmUgTkNSNTM4MF9xdWV1ZV9jb21tYW5kIHQxMjhfcXVldWVfY29tbWFuZC4KKyAqCisgKiBJZiB0aGlzIGlzIG5vdCBkb25lLCB0aGUgcm91dGluZXMgd2lsbCBiZSBkZWZpbmVkIGFzIHN0YXRpYyBmdW5jdGlvbnMKKyAqIHdpdGggdGhlIE5DUjUzODAqIG5hbWVzIGFuZCB0aGUgdXNlciBtdXN0IHByb3ZpZGUgYSBnbG9iYWxseQorICogYWNjZXNzaWJsZSB3cmFwcGVyIGZ1bmN0aW9uLgorICoKKyAqIFRoZSBnZW5lcmljIGRyaXZlciBpcyBpbml0aWFsaXplZCBieSBjYWxsaW5nIE5DUjUzODBfaW5pdChpbnN0YW5jZSksCisgKiBhZnRlciBzZXR0aW5nIHRoZSBhcHByb3ByaWF0ZSBob3N0IHNwZWNpZmljIGZpZWxkcyBhbmQgSUQuICBJZiB0aGUgCisgKiBkcml2ZXIgd2lzaGVzIHRvIGF1dG9wcm9iZSBmb3IgYW4gSVJRIGxpbmUsIHRoZSBOQ1I1MzgwX3Byb2JlX2lycShpbnN0YW5jZSwKKyAqIHBvc3NpYmxlKSBmdW5jdGlvbiBtYXkgYmUgdXNlZC4gIEJlZm9yZSB0aGUgc3BlY2lmaWMgZHJpdmVyIGluaXRpYWxpemF0aW9uCisgKiBjb2RlIGZpbmlzaGVzLCBOQ1I1MzgwX3ByaW50X29wdGlvbnMgc2hvdWxkIGJlIGNhbGxlZC4KKyAqLworCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqZmlyc3RfaW5zdGFuY2UgPSBOVUxMOworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSAqdGhlX3RlbXBsYXRlID0gTlVMTDsKKworLyogTWFjcm9zIGVhc2UgbGlmZS4uLiA6LSkgKi8KKyNkZWZpbmUJU0VUVVBfSE9TVERBVEEoaW4pCQkJCVwKKyAgICBzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPQkJCVwKKwkoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKikoaW4pLT5ob3N0ZGF0YQorI2RlZmluZQlIT1NUREFUQShpbikgKChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKShpbiktPmhvc3RkYXRhKQorCisjZGVmaW5lCU5FWFQoY21kKQkoKFNjc2lfQ21uZCAqKSgoY21kKS0+aG9zdF9zY3JpYmJsZSkpCisjZGVmaW5lCU5FWFRBRERSKGNtZCkJKChTY3NpX0NtbmQgKiopJigoY21kKS0+aG9zdF9zY3JpYmJsZSkpCisKKyNkZWZpbmUJSE9TVE5PCQlpbnN0YW5jZS0+aG9zdF9ubworI2RlZmluZQlIX05PKGNtZCkJKGNtZCktPmRldmljZS0+aG9zdC0+aG9zdF9ubworCisjZGVmaW5lIFNHQUREUihidWZmZXIpICh2b2lkICopKCgodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MoKGJ1ZmZlciktPnBhZ2UpKSArIFwKKwkJCShidWZmZXIpLT5vZmZzZXQpCisKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKworLyoKKyAqIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgdGFnZ2VkIHF1ZXVpbmcKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiArK3JvbWFuICgwMS85Nik6IE5vdyBJJ3ZlIGltcGxlbWVudGVkIFNDU0ktMiB0YWdnZWQgcXVldWluZy4gU29tZSBub3RlczoKKyAqCisgKiBVc2luZyBjb25zZWN1dGl2ZSBudW1iZXJzIGZvciB0aGUgdGFncyBpcyBubyBnb29kIGlkZWEgaW4gbXkgZXllcy4gVGhlcmUKKyAqIGNvdWxkIGJlIHdyb25nIHJlLXVzaW5ncyBpZiB0aGUgY291bnRlciAoOCBiaXQhKSB3cmFwcyBhbmQgc29tZSBlYXJseQorICogY29tbWFuZCBoYXMgYmVlbiBwcmVlbXB0ZWQgZm9yIGEgbG9uZyB0aW1lLiBNeSBzb2x1dGlvbjogYSBiaXRmaWVsZCBmb3IKKyAqIHJlbWVtYmVyaW5nIHVzZWQgdGFncy4KKyAqCisgKiBUaGVyZSdzIGFsc28gdGhlIHByb2JsZW0gdGhhdCBlYWNoIHRhcmdldCBoYXMgYSBjZXJ0YWluIHF1ZXVlIHNpemUsIGJ1dCB3ZQorICogY2Fubm90IGtub3cgaXQgaW4gYWR2YW5jZSA6LSggV2UganVzdCBzZWUgYSBRVUVVRV9GVUxMIHN0YXR1cyBiZWluZworICogcmV0dXJuZWQuIFNvLCBpbiB0aGlzIGNhc2UsIHRoZSBkcml2ZXIgaW50ZXJuYWwgcXVldWUgc2l6ZSBhc3N1bXB0aW9uIGlzCisgKiByZWR1Y2VkIHRvIHRoZSBudW1iZXIgb2YgYWN0aXZlIHRhZ3MgaWYgUVVFVUVfRlVMTCBpcyByZXR1cm5lZCBieSB0aGUKKyAqIHRhcmdldC4gVGhlIGNvbW1hbmQgaXMgcmV0dXJuZWQgdG8gdGhlIG1pZC1sZXZlbCwgYnV0IHdpdGggc3RhdHVzIGNoYW5nZWQKKyAqIHRvIEJVU1ksIHNpbmNlIC0tYXMgSSd2ZSBzZWVuLS0gdGhlIG1pZC1sZXZlbCBjYW4ndCBoYW5kbGUgUVVFVUVfRlVMTAorICogY29ycmVjdGx5LgorICoKKyAqIFdlJ3JlIGFsc28gbm90IGFsbG93ZWQgcnVubmluZyB0YWdnZWQgY29tbWFuZHMgYXMgbG9uZyBhcyBhbiB1bnRhZ2dlZAorICogY29tbWFuZCBpcyBhY3RpdmUuIEFuZCBSRVFVRVNUIFNFTlNFIGNvbW1hbmRzIGFmdGVyIGEgY29udGluZ2VudCBhbGxlZ2lhbmNlCisgKiBjb25kaXRpb24gX211c3RfIGJlIHVudGFnZ2VkLiBUbyBrZWVwIHRyYWNrIHdoZXRoZXIgYW4gdW50YWdnZWQgY29tbWFuZCBoYXMKKyAqIGJlZW4gaXNzdWVkLCB0aGUgaG9zdC0+YnVzeSBhcnJheSBpcyBzdGlsbCBlbXBsb3llZCwgYXMgaXQgaXMgd2l0aG91dAorICogc3VwcG9ydCBmb3IgdGFnZ2VkIHF1ZXVpbmcuCisgKgorICogT25lIGNvdWxkIHN1c3BlY3QgdGhhdCB0aGVyZSBhcmUgcG9zc2libGUgcmFjZSBjb25kaXRpb25zIGJldHdlZW4KKyAqIGlzX2x1bl9idXN5KCksIGNtZF9nZXRfdGFnKCkgYW5kIGNtZF9mcmVlX3RhZygpLiBCdXQgSSB0aGluayB0aGlzIGlzbid0IHRoZQorICogY2FzZTogaXNfbHVuX2J1c3koKSBhbmQgY21kX2dldF90YWcoKSBhcmUgYm90aCBjYWxsZWQgZnJvbSBOQ1I1MzgwX21haW4oKSwKKyAqIHdoaWNoIGFscmVhZHkgZ3VhcmFudGVlZCB0byBiZSBydW5uaW5nIGF0IG1vc3Qgb25jZS4gSXQgaXMgYWxzbyB0aGUgb25seQorICogcGxhY2Ugd2hlcmUgdGFncy9MVU5zIGFyZSBhbGxvY2F0ZWQuIFNvIG5vIG90aGVyIGFsbG9jYXRpb24gY2FuIHNsaXAKKyAqIGJldHdlZW4gdGhhdCBwYWlyLCB0aGVyZSBjb3VsZCBvbmx5IGhhcHBlbiBhIHJlc2VsZWN0aW9uLCB3aGljaCBjYW4gZnJlZSBhCisgKiB0YWcsIGJ1dCB0aGF0IGRvZXNuJ3QgaHVydC4gT25seSB0aGUgc2VxdWVuY2UgaW4gY21kX2ZyZWVfdGFnKCkgYmVjb21lcworICogaW1wb3J0YW50OiB0aGUgdGFnIGJpdCBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlICducl9hbGxvY2F0ZWQnIGlzIGRlY3JlYXNlZC4KKyAqLworCisvKiAtMSBmb3IgVEFHX05PTkUgaXMgbm90IHBvc3NpYmxlIHdpdGggdW5zaWduZWQgY2hhciBjbWQtPnRhZyAqLworI3VuZGVmIFRBR19OT05FCisjZGVmaW5lIFRBR19OT05FIDB4ZmYKKworLyogRm9yIHRoZSBtNjhrLCB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gJ2FsbG9jYXRlZCcgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyISAqLworI2lmIChNQVhfVEFHUyAlIDMyKSAhPSAwCisjZXJyb3IgIk1BWF9UQUdTIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMiEiCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIJYWxsb2NhdGVkW01BWF9UQUdTLzhdOworICAgIGludAkJbnJfYWxsb2NhdGVkOworICAgIGludAkJcXVldWVfc2l6ZTsKK30gVEFHX0FMTE9DOworCitzdGF0aWMgVEFHX0FMTE9DIFRhZ0FsbG9jWzhdWzhdOyAvKiA4IHRhcmdldHMgYW5kIDggTFVOcyAqLworCisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X3RhZ3MoIHZvaWQgKQoreworICAgIGludCB0YXJnZXQsIGx1bjsKKyAgICBUQUdfQUxMT0MgKnRhOworICAgIAorICAgIGlmICghc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nKQorCXJldHVybjsKKyAgICAKKyAgICBmb3IoIHRhcmdldCA9IDA7IHRhcmdldCA8IDg7ICsrdGFyZ2V0ICkgeworCWZvciggbHVuID0gMDsgbHVuIDwgODsgKytsdW4gKSB7CisJICAgIHRhID0gJlRhZ0FsbG9jW3RhcmdldF1bbHVuXTsKKwkgICAgbWVtc2V0KCAmdGEtPmFsbG9jYXRlZCwgMCwgTUFYX1RBR1MvOCApOworCSAgICB0YS0+bnJfYWxsb2NhdGVkID0gMDsKKwkgICAgLyogQXQgdGhlIGJlZ2lubmluZywgYXNzdW1lIHRoZSBtYXhpbXVtIHF1ZXVlIHNpemUgd2UgY291bGQKKwkgICAgICogc3VwcG9ydCAoTUFYX1RBR1MpLiBUaGlzIHZhbHVlIHdpbGwgYmUgZGVjcmVhc2VkIGlmIHRoZSB0YXJnZXQKKwkgICAgICogcmV0dXJucyBRVUVVRV9GVUxMIHN0YXR1cy4KKwkgICAgICovCisJICAgIHRhLT5xdWV1ZV9zaXplID0gTUFYX1RBR1M7CisJfQorICAgIH0KK30KKworCisvKiBDaGVjayBpZiB3ZSBjYW4gaXNzdWUgYSBjb21tYW5kIHRvIHRoaXMgTFVOOiBGaXJzdCBzZWUgaWYgdGhlIExVTiBpcyBtYXJrZWQKKyAqIGJ1c3kgYnkgYW4gdW50YWdnZWQgY29tbWFuZC4gSWYgdGhlIGNvbW1hbmQgc2hvdWxkIHVzZSB0YWdnZWQgcXVldWluZywgYWxzbworICogY2hlY2sgdGhhdCB0aGVyZSBpcyBhIGZyZWUgdGFnIGFuZCB0aGUgdGFyZ2V0J3MgcXVldWUgd29uJ3Qgb3ZlcmZsb3cuIFRoaXMKKyAqIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIHRvIGF2b2lkIHJhY2UKKyAqIGNvbmRpdGlvbnMuCisgKi8gCisKK3N0YXRpYyBpbnQgaXNfbHVuX2J1c3koIFNjc2lfQ21uZCAqY21kLCBpbnQgc2hvdWxkX2JlX3RhZ2dlZCApCit7CisgICAgU0VUVVBfSE9TVERBVEEoY21kLT5kZXZpY2UtPmhvc3QpOworCisgICAgaWYgKGhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJiAoMSA8PCBjbWQtPmRldmljZS0+bHVuKSkKKwlyZXR1cm4oIDEgKTsKKyAgICBpZiAoIXNob3VsZF9iZV90YWdnZWQgfHwKKwkhc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nIHx8ICFjbWQtPmRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCkKKwlyZXR1cm4oIDAgKTsKKyAgICBpZiAoVGFnQWxsb2NbY21kLT5kZXZpY2UtPmlkXVtjbWQtPmRldmljZS0+bHVuXS5ucl9hbGxvY2F0ZWQgPj0KKwlUYWdBbGxvY1tjbWQtPmRldmljZS0+aWRdW2NtZC0+ZGV2aWNlLT5sdW5dLnF1ZXVlX3NpemUgKSB7CisJVEFHX1BSSU5USyggInNjc2klZDogdGFyZ2V0ICVkIGx1biAlZDogbm8gZnJlZSB0YWdzXG4iLAorCQkgICAgSF9OTyhjbWQpLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4gKTsKKwlyZXR1cm4oIDEgKTsKKyAgICB9CisgICAgcmV0dXJuKCAwICk7Cit9CisKKworLyogQWxsb2NhdGUgYSB0YWcgZm9yIGEgY29tbWFuZCAodGhlcmUgYXJlIG5vIGNoZWNrcyBhbnltb3JlLCBjaGVja19sdW5fYnVzeSgpCisgKiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUhKSwgb3IgcmVzZXJ2ZSB0aGUgTFVOIGluICdidXN5JyBpZiB0aGUgY29tbWFuZCBpcworICogdW50YWdnZWQuCisgKi8KKworc3RhdGljIHZvaWQgY21kX2dldF90YWcoIFNjc2lfQ21uZCAqY21kLCBpbnQgc2hvdWxkX2JlX3RhZ2dlZCApCit7CisgICAgU0VUVVBfSE9TVERBVEEoY21kLT5kZXZpY2UtPmhvc3QpOworCisgICAgLyogSWYgd2Ugb3IgdGhlIHRhcmdldCBkb24ndCBzdXBwb3J0IHRhZ2dlZCBxdWV1aW5nLCBhbGxvY2F0ZSB0aGUgTFVOIGZvcgorICAgICAqIGFuIHVudGFnZ2VkIGNvbW1hbmQuCisgICAgICovCisgICAgaWYgKCFzaG91bGRfYmVfdGFnZ2VkIHx8CisJIXNldHVwX3VzZV90YWdnZWRfcXVldWluZyB8fCAhY21kLT5kZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQpIHsKKwljbWQtPnRhZyA9IFRBR19OT05FOworCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gfD0gKDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisJVEFHX1BSSU5USyggInNjc2klZDogdGFyZ2V0ICVkIGx1biAlZCBub3cgYWxsb2NhdGVkIGJ5IHVudGFnZ2VkICIKKwkJICAgICJjb21tYW5kXG4iLCBIX05PKGNtZCksIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biApOworICAgIH0KKyAgICBlbHNlIHsKKwlUQUdfQUxMT0MgKnRhID0gJlRhZ0FsbG9jW2NtZC0+ZGV2aWNlLT5pZF1bY21kLT5kZXZpY2UtPmx1bl07CisKKwljbWQtPnRhZyA9IGZpbmRfZmlyc3RfemVyb19iaXQoICZ0YS0+YWxsb2NhdGVkLCBNQVhfVEFHUyApOworCXNldF9iaXQoIGNtZC0+dGFnLCAmdGEtPmFsbG9jYXRlZCApOworCXRhLT5ucl9hbGxvY2F0ZWQrKzsKKwlUQUdfUFJJTlRLKCAic2NzaSVkOiB1c2luZyB0YWcgJWQgZm9yIHRhcmdldCAlZCBsdW4gJWQgIgorCQkgICAgIihub3cgJWQgdGFncyBpbiB1c2UpXG4iLAorCQkgICAgSF9OTyhjbWQpLCBjbWQtPnRhZywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLAorCQkgICAgdGEtPm5yX2FsbG9jYXRlZCApOworICAgIH0KK30KKworCisvKiBNYXJrIHRoZSB0YWcgb2YgY29tbWFuZCAnY21kJyBhcyBmcmVlLCBvciBpbiBjYXNlIG9mIGFuIHVudGFnZ2VkIGNvbW1hbmQsCisgKiB1bmxvY2sgdGhlIExVTi4KKyAqLworCitzdGF0aWMgdm9pZCBjbWRfZnJlZV90YWcoIFNjc2lfQ21uZCAqY21kICkKK3sKKyAgICBTRVRVUF9IT1NUREFUQShjbWQtPmRldmljZS0+aG9zdCk7CisKKyAgICBpZiAoY21kLT50YWcgPT0gVEFHX05PTkUpIHsKKwlob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKwlUQUdfUFJJTlRLKCAic2NzaSVkOiB0YXJnZXQgJWQgbHVuICVkIHVudGFnZ2VkIGNtZCBmaW5pc2hlZFxuIiwKKwkJICAgIEhfTk8oY21kKSwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuICk7CisgICAgfQorICAgIGVsc2UgaWYgKGNtZC0+dGFnID49IE1BWF9UQUdTKSB7CisJcHJpbnRrKEtFUk5fTk9USUNFICJzY3NpJWQ6IHRyeWluZyB0byBmcmVlIGJhZCB0YWcgJWQhXG4iLAorCQlIX05PKGNtZCksIGNtZC0+dGFnICk7CisgICAgfQorICAgIGVsc2UgeworCVRBR19BTExPQyAqdGEgPSAmVGFnQWxsb2NbY21kLT5kZXZpY2UtPmlkXVtjbWQtPmRldmljZS0+bHVuXTsKKwljbGVhcl9iaXQoIGNtZC0+dGFnLCAmdGEtPmFsbG9jYXRlZCApOworCXRhLT5ucl9hbGxvY2F0ZWQtLTsKKwlUQUdfUFJJTlRLKCAic2NzaSVkOiBmcmVlZCB0YWcgJWQgZm9yIHRhcmdldCAlZCBsdW4gJWRcbiIsCisJCSAgICBIX05PKGNtZCksIGNtZC0+dGFnLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4gKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgZnJlZV9hbGxfdGFncyggdm9pZCApCit7CisgICAgaW50IHRhcmdldCwgbHVuOworICAgIFRBR19BTExPQyAqdGE7CisKKyAgICBpZiAoIXNldHVwX3VzZV90YWdnZWRfcXVldWluZykKKwlyZXR1cm47CisgICAgCisgICAgZm9yKCB0YXJnZXQgPSAwOyB0YXJnZXQgPCA4OyArK3RhcmdldCApIHsKKwlmb3IoIGx1biA9IDA7IGx1biA8IDg7ICsrbHVuICkgeworCSAgICB0YSA9ICZUYWdBbGxvY1t0YXJnZXRdW2x1bl07CisJICAgIG1lbXNldCggJnRhLT5hbGxvY2F0ZWQsIDAsIE1BWF9UQUdTLzggKTsKKwkgICAgdGEtPm5yX2FsbG9jYXRlZCA9IDA7CisJfQorICAgIH0KK30KKworI2VuZGlmIC8qIFNVUFBPUlRfVEFHUyAqLworCisKKy8qCisgKiBGdW5jdGlvbjogdm9pZCBtZXJnZV9jb250aWd1b3VzX2J1ZmZlcnMoIFNjc2lfQ21uZCAqY21kICkKKyAqCisgKiBQdXJwb3NlOiBUcnkgdG8gbWVyZ2Ugc2V2ZXJhbCBzY2F0dGVyLWdhdGhlciByZXF1ZXN0cyBpbnRvIG9uZSBETUEKKyAqICAgIHRyYW5zZmVyLiBUaGlzIGlzIHBvc3NpYmxlIGlmIHRoZSBzY2F0dGVyIGJ1ZmZlcnMgbGllIG9uCisgKiAgICBwaHlzaWNhbCBjb250aWd1b3VzIGFkZHJlc3Nlcy4KKyAqCisgKiBQYXJhbWV0ZXJzOiBTY3NpX0NtbmQgKmNtZAorICogICAgVGhlIGNvbW1hbmQgdG8gd29yayBvbi4gVGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyJ3MgZGF0YSBhcmUKKyAqICAgIGFzc3VtZWQgdG8gYmUgYWxyZWFkeSB0cmFuc2ZlcmVkIGludG8gcHRyL3RoaXNfcmVzaWR1YWwuCisgKi8KKworc3RhdGljIHZvaWQgbWVyZ2VfY29udGlndW91c19idWZmZXJzKCBTY3NpX0NtbmQgKmNtZCApCit7CisgICAgdW5zaWduZWQgbG9uZyBlbmRhZGRyOworI2lmIChOREVCVUcgJiBOREVCVUdfTUVSR0lORykKKyAgICB1bnNpZ25lZCBsb25nIG9sZGxlbiA9IGNtZC0+U0NwLnRoaXNfcmVzaWR1YWw7CisgICAgaW50CQkgIGNudCA9IDE7CisjZW5kaWYKKworICAgIGZvciAoZW5kYWRkciA9IHZpcnRfdG9fcGh5cyhjbWQtPlNDcC5wdHIgKyBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsIC0gMSkgKyAxOworCSBjbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsICYmCisJIHZpcnRfdG9fcGh5cyhTR0FERFIoJihjbWQtPlNDcC5idWZmZXJbMV0pKSkgPT0gZW5kYWRkcjsgKSB7CisJCisJTUVSX1BSSU5USygiVlRPUCglcCkgPT0gJTA4bHggLT4gbWVyZ2luZ1xuIiwKKwkJICAgU0dBRERSKCYoY21kLT5TQ3AuYnVmZmVyWzFdKSksIGVuZGFkZHIpOworI2lmIChOREVCVUcgJiBOREVCVUdfTUVSR0lORykKKwkrK2NudDsKKyNlbmRpZgorCSsrY21kLT5TQ3AuYnVmZmVyOworCS0tY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbDsKKwljbWQtPlNDcC50aGlzX3Jlc2lkdWFsICs9IGNtZC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCWVuZGFkZHIgKz0gY21kLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisgICAgfQorI2lmIChOREVCVUcgJiBOREVCVUdfTUVSR0lORykKKyAgICBpZiAob2xkbGVuICE9IGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpCisJTUVSX1BSSU5USygibWVyZ2VkICVkIGJ1ZmZlcnMgZnJvbSAlcCwgbmV3IGxlbmd0aCAlMDh4XG4iLAorCQkgICBjbnQsIGNtZC0+U0NwLnB0ciwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7CisjZW5kaWYKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogdm9pZCBpbml0aWFsaXplX1NDcChTY3NpX0NtbmQgKmNtZCkKKyAqCisgKiBQdXJwb3NlIDogaW5pdGlhbGl6ZSB0aGUgc2F2ZWQgZGF0YSBwb2ludGVycyBmb3IgY21kIHRvIHBvaW50IHRvIHRoZSAKKyAqCXN0YXJ0IG9mIHRoZSBidWZmZXIuCisgKgorICogSW5wdXRzIDogY21kIC0gU2NzaV9DbW5kIHN0cnVjdHVyZSB0byBoYXZlIHBvaW50ZXJzIHJlc2V0LgorICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgaW5pdGlhbGl6ZV9TQ3AoU2NzaV9DbW5kICpjbWQpCit7CisgICAgLyogCisgICAgICogSW5pdGlhbGl6ZSB0aGUgU2NzaSBQb2ludGVyIGZpZWxkIHNvIHRoYXQgYWxsIG9mIHRoZSBjb21tYW5kcyBpbiB0aGUgCisgICAgICogdmFyaW91cyBxdWV1ZXMgYXJlIHZhbGlkLgorICAgICAqLworCisgICAgaWYgKGNtZC0+dXNlX3NnKSB7CisJY21kLT5TQ3AuYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBjbWQtPmJ1ZmZlcjsKKwljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gY21kLT51c2Vfc2cgLSAxOworCWNtZC0+U0NwLnB0ciA9IChjaGFyICopIFNHQUREUihjbWQtPlNDcC5idWZmZXIpOworCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBjbWQtPlNDcC5idWZmZXItPmxlbmd0aDsKKworCS8qICsrcm9tYW46IFRyeSB0byBtZXJnZSBzb21lIHNjYXR0ZXItYnVmZmVycyBpZiB0aGV5IGFyZSBhdAorCSAqIGNvbnRpZ3VvdXMgcGh5c2ljYWwgYWRkcmVzc2VzLgorCSAqLworLy8JbWVyZ2VfY29udGlndW91c19idWZmZXJzKCBjbWQgKTsKKyAgICB9IGVsc2UgeworCWNtZC0+U0NwLmJ1ZmZlciA9IE5VTEw7CisJY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IDA7CisJY21kLT5TQ3AucHRyID0gKGNoYXIgKikgY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisgICAgfQorICAgIAorfQorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2lmIDEKK3N0YXRpYyBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNoYXIgbWFzazsKKyAgICBjb25zdCBjaGFyICogbmFtZTt9IAorc2lnbmFsc1tdID0ge3sgU1JfREJQLCAiUEFSSVRZIn0sIHsgU1JfUlNULCAiUlNUIiB9LCB7IFNSX0JTWSwgIkJTWSIgfSwgCisgICAgeyBTUl9SRVEsICJSRVEiIH0sIHsgU1JfTVNHLCAiTVNHIiB9LCB7IFNSX0NELCAgIkNEIiB9LCB7IFNSX0lPLCAiSU8iIH0sIAorICAgIHsgU1JfU0VMLCAiU0VMIiB9LCB7MCwgTlVMTH19LCAKK2Jhc3JzW10gPSB7e0JBU1JfQVROLCAiQVROIn0sIHtCQVNSX0FDSywgIkFDSyJ9LCB7MCwgTlVMTH19LAoraWNyc1tdID0ge3tJQ1JfQVNTRVJUX1JTVCwgIkFTU0VSVCBSU1QifSx7SUNSX0FTU0VSVF9BQ0ssICJBU1NFUlQgQUNLIn0sCisgICAge0lDUl9BU1NFUlRfQlNZLCAiQVNTRVJUIEJTWSJ9LCB7SUNSX0FTU0VSVF9TRUwsICJBU1NFUlQgU0VMIn0sIAorICAgIHtJQ1JfQVNTRVJUX0FUTiwgIkFTU0VSVCBBVE4ifSwge0lDUl9BU1NFUlRfREFUQSwgIkFTU0VSVCBEQVRBIn0sIAorICAgIHswLCBOVUxMfX0sCittcnNbXSA9IHt7TVJfQkxPQ0tfRE1BX01PREUsICJNT0RFIEJMT0NLIERNQSJ9LCB7TVJfVEFSR0VULCAiTU9ERSBUQVJHRVQifSwgCisgICAge01SX0VOQUJMRV9QQVJfQ0hFQ0ssICJNT0RFIFBBUklUWSBDSEVDSyJ9LCB7TVJfRU5BQkxFX1BBUl9JTlRSLCAKKyAgICAiTU9ERSBQQVJJVFkgSU5UUiJ9LCB7TVJfRU5BQkxFX0VPUF9JTlRSLCJNT0RFIEVPUCBJTlRSIn0sCisgICAge01SX01PTklUT1JfQlNZLCAiTU9ERSBNT05JVE9SIEJTWSJ9LAorICAgIHtNUl9ETUFfTU9ERSwgIk1PREUgRE1BIn0sIHtNUl9BUkJJVFJBVEUsICJNT0RFIEFSQklUUkFUSU9OIn0sIAorICAgIHswLCBOVUxMfX07CisKKy8qCisgKiBGdW5jdGlvbiA6IHZvaWQgTkNSNTM4MF9wcmludChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKKyAqCisgKiBQdXJwb3NlIDogcHJpbnQgdGhlIFNDU0kgYnVzIHNpZ25hbHMgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcworICoKKyAqIElucHV0IDogaW5zdGFuY2UgLSB3aGljaCBOQ1I1MzgwCisgKi8KKworc3RhdGljIHZvaWQgTkNSNTM4MF9wcmludChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkgeworICAgIHVuc2lnbmVkIGNoYXIgc3RhdHVzLCBkYXRhLCBiYXNyLCBtciwgaWNyLCBpOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgZGF0YSA9IE5DUjUzODBfcmVhZChDVVJSRU5UX1NDU0lfREFUQV9SRUcpOworICAgIHN0YXR1cyA9IE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKTsKKyAgICBtciA9IE5DUjUzODBfcmVhZChNT0RFX1JFRyk7CisgICAgaWNyID0gTkNSNTM4MF9yZWFkKElOSVRJQVRPUl9DT01NQU5EX1JFRyk7CisgICAgYmFzciA9IE5DUjUzODBfcmVhZChCVVNfQU5EX1NUQVRVU19SRUcpOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICBwcmludGsoIlNUQVRVU19SRUc6ICUwMnggIiwgc3RhdHVzKTsKKyAgICBmb3IgKGkgPSAwOyBzaWduYWxzW2ldLm1hc2sgOyArK2kpIAorCWlmIChzdGF0dXMgJiBzaWduYWxzW2ldLm1hc2spCisJICAgIHByaW50aygiLCVzIiwgc2lnbmFsc1tpXS5uYW1lKTsKKyAgICBwcmludGsoIlxuQkFTUjogJTAyeCAiLCBiYXNyKTsKKyAgICBmb3IgKGkgPSAwOyBiYXNyc1tpXS5tYXNrIDsgKytpKSAKKwlpZiAoYmFzciAmIGJhc3JzW2ldLm1hc2spCisJICAgIHByaW50aygiLCVzIiwgYmFzcnNbaV0ubmFtZSk7CisgICAgcHJpbnRrKCJcbklDUjogJTAyeCAiLCBpY3IpOworICAgIGZvciAoaSA9IDA7IGljcnNbaV0ubWFzazsgKytpKSAKKwlpZiAoaWNyICYgaWNyc1tpXS5tYXNrKQorCSAgICBwcmludGsoIiwlcyIsIGljcnNbaV0ubmFtZSk7CisgICAgcHJpbnRrKCJcbk1PREU6ICUwMnggIiwgbXIpOworICAgIGZvciAoaSA9IDA7IG1yc1tpXS5tYXNrOyArK2kpIAorCWlmIChtciAmIG1yc1tpXS5tYXNrKQorCSAgICBwcmludGsoIiwlcyIsIG1yc1tpXS5uYW1lKTsKKyAgICBwcmludGsoIlxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNoYXIgdmFsdWU7CisgICAgY29uc3QgY2hhciAqbmFtZTsKK30gcGhhc2VzW10gPSB7CisgICAge1BIQVNFX0RBVEFPVVQsICJEQVRBT1VUIn0sIHtQSEFTRV9EQVRBSU4sICJEQVRBSU4ifSwge1BIQVNFX0NNRE9VVCwgIkNNRE9VVCJ9LAorICAgIHtQSEFTRV9TVEFUSU4sICJTVEFUSU4ifSwge1BIQVNFX01TR09VVCwgIk1TR09VVCJ9LCB7UEhBU0VfTVNHSU4sICJNU0dJTiJ9LAorICAgIHtQSEFTRV9VTktOT1dOLCAiVU5LTk9XTiJ9fTsKKworLyogCisgKiBGdW5jdGlvbiA6IHZvaWQgTkNSNTM4MF9wcmludF9waGFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKKyAqCisgKiBQdXJwb3NlIDogcHJpbnQgdGhlIGN1cnJlbnQgU0NTSSBwaGFzZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCisgKgorICogSW5wdXQgOiBpbnN0YW5jZSAtIHdoaWNoIE5DUjUzODAKKyAqLworCitzdGF0aWMgdm9pZCBOQ1I1MzgwX3ByaW50X3BoYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworICAgIHVuc2lnbmVkIGNoYXIgc3RhdHVzOworICAgIGludCBpOworCisgICAgc3RhdHVzID0gTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpOworICAgIGlmICghKHN0YXR1cyAmIFNSX1JFUSkpIAorCXByaW50ayhLRVJOX0RFQlVHICJzY3NpJWQ6IFJFUSBub3QgYXNzZXJ0ZWQsIHBoYXNlIHVua25vd24uXG4iLCBIT1NUTk8pOworICAgIGVsc2UgeworCWZvciAoaSA9IDA7IChwaGFzZXNbaV0udmFsdWUgIT0gUEhBU0VfVU5LTk9XTikgJiYgCisJICAgIChwaGFzZXNbaV0udmFsdWUgIT0gKHN0YXR1cyAmIFBIQVNFX01BU0spKTsgKytpKTsgCisJcHJpbnRrKEtFUk5fREVCVUcgInNjc2klZDogcGhhc2UgJXNcbiIsIEhPU1ROTywgcGhhc2VzW2ldLm5hbWUpOworICAgIH0KK30KKworI2Vsc2UgLyogIU5ERUJVRyAqLworCisvKiBkdW1taWVzLi4uICovCitfX2lubGluZV9fIHZvaWQgTkNSNTM4MF9wcmludChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkgeyB9OworX19pbmxpbmVfXyB2b2lkIE5DUjUzODBfcHJpbnRfcGhhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpIHsgfTsKKworI2VuZGlmCisKKy8qCisgKiArK3JvbWFuOiBOZXcgc2NoZW1lIG9mIGNhbGxpbmcgTkNSNTM4MF9tYWluKCkKKyAqIAorICogSWYgd2UncmUgbm90IGluIGFuIGludGVycnVwdCwgd2UgY2FuIGNhbGwgb3VyIG1haW4gZGlyZWN0bHksIGl0IGNhbm5vdCBiZQorICogYWxyZWFkeSBydW5uaW5nLiBFbHNlLCB3ZSBxdWV1ZSBpdCBvbiBhIHRhc2sgcXVldWUsIGlmIG5vdCAnbWFpbl9ydW5uaW5nJworICogdGVsbHMgdXMgdGhhdCBhIGxvd2VyIGxldmVsIGlzIGFscmVhZHkgZXhlY3V0aW5nIGl0LiBUaGlzIHdheSwKKyAqICdtYWluX3J1bm5pbmcnIG5lZWRzIG5vdCBiZSBwcm90ZWN0ZWQgaW4gYSBzcGVjaWFsIHdheS4KKyAqCisgKiBxdWV1ZV9tYWluKCkgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGZvciBwdXR0aW5nIG91ciBtYWluIG9udG8gdGhlIHRhc2sKKyAqIHF1ZXVlLCBpZiBtYWluX3J1bm5pbmcgaXMgZmFsc2UuIEl0IHNob3VsZCBiZSBjYWxsZWQgb25seSBmcm9tIGEKKyAqIGludGVycnVwdCBvciBib3R0b20gaGFsZi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgbWFpbl9ydW5uaW5nID0gMDsKK3N0YXRpYyBERUNMQVJFX1dPUksoTkNSNTM4MF90cXVldWUsICh2b2lkICgqKSh2b2lkKikpTkNSNTM4MF9tYWluLCBOVUxMKTsKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBxdWV1ZV9tYWluKHZvaWQpCit7CisgICAgaWYgKCFtYWluX3J1bm5pbmcpIHsKKwkvKiBJZiBpbiBpbnRlcnJ1cHQgYW5kIE5DUjUzODBfbWFpbigpIG5vdCBhbHJlYWR5IHJ1bm5pbmcsCisJICAgcXVldWUgaXQgb24gdGhlICdpbW1lZGlhdGUnIHRhc2sgcXVldWUsIHRvIGJlIHByb2Nlc3NlZAorCSAgIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjdXJyZW50IGludGVycnVwdCBwcm9jZXNzaW5nIGhhcworCSAgIGZpbmlzaGVkLiAqLworCXNjaGVkdWxlX3dvcmsoJk5DUjUzODBfdHF1ZXVlKTsKKyAgICB9CisgICAgLyogZWxzZTogbm90aGluZyB0byBkbzogdGhlIHJ1bm5pbmcgTkNSNTM4MF9tYWluKCkgd2lsbCBwaWNrIHVwCisgICAgICAgYW55IG5ld2x5IHF1ZXVlZCBjb21tYW5kLiAqLworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBOQ1I1MzgwX2FsbF9pbml0ICh2b2lkKQoreworICAgIHN0YXRpYyBpbnQgZG9uZSA9IDA7CisgICAgaWYgKCFkb25lKSB7CisJSU5JX1BSSU5USygic2NzaSA6IE5DUjUzODBfYWxsX2luaXQoKVxuIik7CisJZG9uZSA9IDE7CisgICAgfQorfQorCisgCisvKgorICogRnVuY3Rpb24gOiB2b2lkIE5DUjU4MzgwX3ByaW50X29wdGlvbnMgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQorICoKKyAqIFB1cnBvc2UgOiBjYWxsZWQgYnkgcHJvYmUgY29kZSBpbmRpY2F0aW5nIHRoZSBOQ1I1MzgwIGRyaXZlcgorICoJICAgICBvcHRpb25zIHRoYXQgd2VyZSBzZWxlY3RlZC4KKyAqCisgKiBJbnB1dHMgOiBpbnN0YW5jZSwgcG9pbnRlciB0byB0aGlzIGluc3RhbmNlLiAgVW51c2VkLgorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBOQ1I1MzgwX3ByaW50X29wdGlvbnMgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworICAgIHByaW50aygiIGdlbmVyaWMgb3B0aW9ucyIKKyNpZmRlZiBBVVRPU0VOU0UgCisgICAgIiBBVVRPU0VOU0UiCisjZW5kaWYKKyNpZmRlZiBSRUFMX0RNQQorICAgICIgUkVBTCBETUEiCisjZW5kaWYKKyNpZmRlZiBQQVJJVFkKKyAgICAiIFBBUklUWSIKKyNlbmRpZgorI2lmZGVmIFNVUFBPUlRfVEFHUworICAgICIgU0NTSS0yIFRBR0dFRCBRVUVVSU5HIgorI2VuZGlmCisgICAgKTsKKyAgICBwcmludGsoIiBnZW5lcmljIHJlbGVhc2U9JWQiLCBOQ1I1MzgwX1BVQkxJQ19SRUxFQVNFKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogdm9pZCBOQ1I1MzgwX3ByaW50X3N0YXR1cyAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCisgKgorICogUHVycG9zZSA6IHByaW50IGNvbW1hbmRzIGluIHRoZSB2YXJpb3VzIHF1ZXVlcywgY2FsbGVkIGZyb20KKyAqCU5DUjUzODBfYWJvcnQgYW5kIE5DUjUzODBfZGVidWcgdG8gYWlkIGRlYnVnZ2luZy4KKyAqCisgKiBJbnB1dHMgOiBpbnN0YW5jZSwgcG9pbnRlciB0byB0aGlzIGluc3RhbmNlLiAgCisgKi8KKworc3RhdGljIHZvaWQgTkNSNTM4MF9wcmludF9zdGF0dXMgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworICAgIGNoYXIgKnByX2JmcjsKKyAgICBjaGFyICpzdGFydDsKKyAgICBpbnQgbGVuOworCisgICAgTkNSX1BSSU5UKE5ERUJVR19BTlkpOworICAgIE5DUl9QUklOVF9QSEFTRShOREVCVUdfQU5ZKTsKKworICAgIHByX2JmciA9IChjaGFyICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfQVRPTUlDKTsKKyAgICBpZiAoIXByX2JmcikgeworCXByaW50aygiTkNSNTM4MF9wcmludF9zdGF0dXM6IG5vIG1lbW9yeSBmb3IgcHJpbnQgYnVmZmVyXG4iKTsKKwlyZXR1cm47CisgICAgfQorICAgIGxlbiA9IE5DUjUzODBfcHJvY19pbmZvKGluc3RhbmNlLCBwcl9iZnIsICZzdGFydCwgMCwgUEFHRV9TSVpFLCAwKTsKKyAgICBwcl9iZnJbbGVuXSA9IDA7CisgICAgcHJpbnRrKCJcbiVzXG4iLCBwcl9iZnIpOworICAgIGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcHJfYmZyKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIC9wcm9jL3Njc2kvW2R0YyBwYXMxNiB0MTI4IGdlbmVyaWNdL1swLUFTQ19OVU1fQk9BUkRfU1VQUE9SVEVEXQorICoKKyAqICpidWZmZXI6IEkvTyBidWZmZXIKKyAqICoqc3RhcnQ6IGlmIGlub3V0ID09IEZBTFNFIHBvaW50ZXIgaW50byBidWZmZXIgd2hlcmUgdXNlciByZWFkIHNob3VsZCBzdGFydAorICogb2Zmc2V0OiBjdXJyZW50IG9mZnNldAorICogbGVuZ3RoOiBsZW5ndGggb2YgYnVmZmVyCisgKiBob3N0bm86IFNjc2lfSG9zdCBob3N0X25vCisgKiBpbm91dDogVFJVRSAtIHVzZXIgaXMgd3JpdGluZzsgRkFMU0UgLSB1c2VyIGlzIHJlYWRpbmcKKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gb3Igd3JpdHRlbgorKi8KKworI3VuZGVmIFNQUklOVEYKKyNkZWZpbmUgU1BSSU5URihmbXQsYXJncy4uLikgXAorICBkbyB7IGlmIChwb3MgKyBzdHJsZW4oZm10KSArIDIwIC8qIHNsb3AgKi8gPCBidWZmZXIgKyBsZW5ndGgpIFwKKwkgcG9zICs9IHNwcmludGYocG9zLCBmbXQgLCAjIyBhcmdzKTsgfSB3aGlsZSgwKQorc3RhdGljCitjaGFyICpscHJpbnRfU2NzaV9DbW5kIChTY3NpX0NtbmQgKmNtZCwgY2hhciAqcG9zLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpOworCitzdGF0aWMgaW50IE5DUjUzODBfcHJvY19pbmZvIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsCisJCSAgICAgICBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBpbm91dCkKK3sKKyAgICBjaGFyICpwb3MgPSBidWZmZXI7CisgICAgc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKmhvc3RkYXRhOworICAgIFNjc2lfQ21uZCAqcHRyOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgb2ZmX3QgYmVnaW4gPSAwOworI2RlZmluZSBjaGVja19vZmZzZXQoKQkJCQlcCisgICAgZG8gewkJCQkJXAorCWlmIChwb3MgLSBidWZmZXIgPCBvZmZzZXQgLSBiZWdpbikgewlcCisJICAgIGJlZ2luICs9IHBvcyAtIGJ1ZmZlcjsJCVwKKwkgICAgcG9zID0gYnVmZmVyOwkJCVwKKwl9CQkJCQlcCisgICAgfSB3aGlsZSAoMCkKKworICAgIGhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopaW5zdGFuY2UtPmhvc3RkYXRhOworCisgICAgaWYgKGlub3V0KSB7IC8qIEhhcyBkYXRhIGJlZW4gd3JpdHRlbiB0byB0aGUgZmlsZSA/ICovCisJcmV0dXJuKC1FTk9TWVMpOyAgLyogQ3VycmVudGx5IHRoaXMgaXMgYSBuby1vcCAqLworICAgIH0KKyAgICBTUFJJTlRGKCJOQ1I1MzgwIGNvcmUgcmVsZWFzZT0lZC5cbiIsIE5DUjUzODBfUFVCTElDX1JFTEVBU0UpOworICAgIGNoZWNrX29mZnNldCgpOworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICBTUFJJTlRGKCJOQ1I1MzgwOiBjb3JvdXRpbmUgaXMlcyBydW5uaW5nLlxuIiwgbWFpbl9ydW5uaW5nID8gIiIgOiAibid0Iik7CisgICAgY2hlY2tfb2Zmc2V0KCk7CisgICAgaWYgKCFob3N0ZGF0YS0+Y29ubmVjdGVkKQorCVNQUklOVEYoInNjc2klZDogbm8gY3VycmVudGx5IGNvbm5lY3RlZCBjb21tYW5kXG4iLCBIT1NUTk8pOworICAgIGVsc2UKKwlwb3MgPSBscHJpbnRfU2NzaV9DbW5kICgoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5jb25uZWN0ZWQsCisJCQkJcG9zLCBidWZmZXIsIGxlbmd0aCk7CisgICAgU1BSSU5URigic2NzaSVkOiBpc3N1ZV9xdWV1ZVxuIiwgSE9TVE5PKTsKKyAgICBjaGVja19vZmZzZXQoKTsKKyAgICBmb3IgKHB0ciA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOyBwdHI7IHB0ciA9IE5FWFQocHRyKSkgeworCXBvcyA9IGxwcmludF9TY3NpX0NtbmQgKHB0ciwgcG9zLCBidWZmZXIsIGxlbmd0aCk7CisJY2hlY2tfb2Zmc2V0KCk7CisgICAgfQorCisgICAgU1BSSU5URigic2NzaSVkOiBkaXNjb25uZWN0ZWRfcXVldWVcbiIsIEhPU1ROTyk7CisgICAgY2hlY2tfb2Zmc2V0KCk7CisgICAgZm9yIChwdHIgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWU7IHB0cjsKKwkgcHRyID0gTkVYVChwdHIpKSB7CisJcG9zID0gbHByaW50X1Njc2lfQ21uZCAocHRyLCBwb3MsIGJ1ZmZlciwgbGVuZ3RoKTsKKwljaGVja19vZmZzZXQoKTsKKyAgICB9CisKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgICAgKnN0YXJ0ID0gYnVmZmVyICsgKG9mZnNldCAtIGJlZ2luKTsKKyAgICBpZiAocG9zIC0gYnVmZmVyIDwgb2Zmc2V0IC0gYmVnaW4pCisJcmV0dXJuIDA7CisgICAgZWxzZSBpZiAocG9zIC0gYnVmZmVyIC0gKG9mZnNldCAtIGJlZ2luKSA8IGxlbmd0aCkKKwlyZXR1cm4gcG9zIC0gYnVmZmVyIC0gKG9mZnNldCAtIGJlZ2luKTsKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgY2hhciAqCitscHJpbnRfU2NzaV9DbW5kIChTY3NpX0NtbmQgKmNtZCwgY2hhciAqcG9zLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCit7CisgICAgaW50IGksIHM7CisgICAgdW5zaWduZWQgY2hhciAqY29tbWFuZDsKKyAgICBTUFJJTlRGKCJzY3NpJWQ6IGRlc3RpbmF0aW9uIHRhcmdldCAlZCwgbHVuICVkXG4iLAorCSAgICBIX05PKGNtZCksIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisgICAgU1BSSU5URigiICAgICAgICBjb21tYW5kID0gIik7CisgICAgY29tbWFuZCA9IGNtZC0+Y21uZDsKKyAgICBTUFJJTlRGKCIlMmQgKDB4JTAyeCkiLCBjb21tYW5kWzBdLCBjb21tYW5kWzBdKTsKKyAgICBmb3IgKGkgPSAxLCBzID0gQ09NTUFORF9TSVpFKGNvbW1hbmRbMF0pOyBpIDwgczsgKytpKQorCVNQUklOVEYoIiAlMDJ4IiwgY29tbWFuZFtpXSk7CisgICAgU1BSSU5URigiXG4iKTsKKyAgICByZXR1cm4gcG9zOworfQorCisKKy8qIAorICogRnVuY3Rpb24gOiB2b2lkIE5DUjUzODBfaW5pdCAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCisgKgorICogUHVycG9zZSA6IGluaXRpYWxpemVzICppbnN0YW5jZSBhbmQgY29ycmVzcG9uZGluZyA1MzgwIGNoaXAuCisgKgorICogSW5wdXRzIDogaW5zdGFuY2UgLSBpbnN0YW50aWF0aW9uIG9mIHRoZSA1MzgwIGRyaXZlci4gIAorICoKKyAqIE5vdGVzIDogSSBhc3N1bWUgdGhhdCB0aGUgaG9zdCwgaG9zdG5vLCBhbmQgaWQgYml0cyBoYXZlIGJlZW4KKyAqIAlzZXQgY29ycmVjdGx5LiAgSSBkb24ndCBjYXJlIGFib3V0IHRoZSBpcnEgYW5kIG90aGVyIGZpZWxkcy4gCisgKiAKKyAqLworCitzdGF0aWMgaW50IE5DUjUzODBfaW5pdCAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGludCBmbGFncykKK3sKKyAgICBpbnQgaTsKKyAgICBTRVRVUF9IT1NUREFUQShpbnN0YW5jZSk7CisKKyAgICBOQ1I1MzgwX2FsbF9pbml0KCk7CisKKyAgICBob3N0ZGF0YS0+YWJvcnRlZCA9IDA7CisgICAgaG9zdGRhdGEtPmlkX21hc2sgPSAxIDw8IGluc3RhbmNlLT50aGlzX2lkOworICAgIGhvc3RkYXRhLT5pZF9oaWdoZXJfbWFzayA9IDA7CisgICAgZm9yIChpID0gaG9zdGRhdGEtPmlkX21hc2s7IGkgPD0gMHg4MDsgaSA8PD0gMSkKKwlpZiAoaSA+IGhvc3RkYXRhLT5pZF9tYXNrKQorCSAgICBob3N0ZGF0YS0+aWRfaGlnaGVyX21hc2sgfD0gaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKQorCWhvc3RkYXRhLT5idXN5W2ldID0gMDsKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKyAgICBpbml0X3RhZ3MoKTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFJFQUxfRE1BKQorICAgIGhvc3RkYXRhLT5kbWFfbGVuID0gMDsKKyNlbmRpZgorICAgIGhvc3RkYXRhLT50YXJnZXRzX3ByZXNlbnQgPSAwOworICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworICAgIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IE5VTEw7CisgICAgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSA9IE5VTEw7CisgICAgaG9zdGRhdGEtPmZsYWdzID0gRkxBR19DSEVDS19MQVNUX0JZVEVfU0VOVDsKKworICAgIGlmICghdGhlX3RlbXBsYXRlKSB7CisJdGhlX3RlbXBsYXRlID0gaW5zdGFuY2UtPmhvc3R0OworCWZpcnN0X2luc3RhbmNlID0gaW5zdGFuY2U7CisgICAgfQorCQorCisjaWZuZGVmIEFVVE9TRU5TRQorICAgIGlmICgoaW5zdGFuY2UtPmNtZF9wZXJfbHVuID4gMSkgfHwgKGluc3RhbmNlLT5jYW5fcXVldWUgPiAxKSkKKwkgcHJpbnRrKCJzY3NpJWQ6IFdBUk5JTkcgOiBzdXBwb3J0IGZvciBtdWx0aXBsZSBvdXRzdGFuZGluZyBjb21tYW5kcyBlbmFibGVkXG4iCisJICAgICAgICAiICAgICAgICB3aXRob3V0IEFVVE9TRU5TRSBvcHRpb24sIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb25zIG1heVxuIgorCSAgICAgICAgIiAgICAgICAgYmUgaW5jb3JyZWN0bHkgY2xlYXJlZC5cbiIsIEhPU1ROTyk7CisjZW5kaWYgLyogZGVmIEFVVE9TRU5TRSAqLworCisgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKyAgICBOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKyAgICBOQ1I1MzgwX3dyaXRlKFRBUkdFVF9DT01NQU5EX1JFRywgMCk7CisgICAgTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgMCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQgKFNjc2lfQ21uZCAqY21kLCAKKyAqCXZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpIAorICoKKyAqIFB1cnBvc2UgOiAgZW5xdWV1ZXMgYSBTQ1NJIGNvbW1hbmQKKyAqCisgKiBJbnB1dHMgOiBjbWQgLSBTQ1NJIGNvbW1hbmQsIGRvbmUgLSBmdW5jdGlvbiBjYWxsZWQgb24gY29tcGxldGlvbiwgd2l0aAorICoJYSBwb2ludGVyIHRvIHRoZSBjb21tYW5kIGRlc2NyaXB0b3IuCisgKiAKKyAqIFJldHVybnMgOiAwCisgKgorICogU2lkZSBlZmZlY3RzIDogCisgKiAgICAgIGNtZCBpcyBhZGRlZCB0byB0aGUgcGVyIGluc3RhbmNlIGlzc3VlX3F1ZXVlLCB3aXRoIG1pbm9yIAorICoJdHdpZGRsaW5nIGRvbmUgdG8gdGhlIGhvc3Qgc3BlY2lmaWMgZmllbGRzIG9mIGNtZC4gIElmIHRoZSAKKyAqCW1haW4gY29yb3V0aW5lIGlzIG5vdCBydW5uaW5nLCBpdCBpcyByZXN0YXJ0ZWQuCisgKgorICovCisKKy8qIE9ubHkgbWFrZSBzdGF0aWMgaWYgYSB3cmFwcGVyIGZ1bmN0aW9uIGlzIHVzZWQgKi8KK3N0YXRpYyBpbnQgTkNSNTM4MF9xdWV1ZV9jb21tYW5kIChTY3NpX0NtbmQgKmNtZCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKK3sKKyAgICBTRVRVUF9IT1NUREFUQShjbWQtPmRldmljZS0+aG9zdCk7CisgICAgU2NzaV9DbW5kICp0bXA7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmIChOREVCVUcgJiBOREVCVUdfTk9fV1JJVEUpCisgICAgc3dpdGNoIChjbWQtPmNtbmRbMF0pIHsKKyAgICBjYXNlIFdSSVRFXzY6CisgICAgY2FzZSBXUklURV8xMDoKKwlwcmludGsoS0VSTl9OT1RJQ0UgInNjc2klZDogV1JJVEUgYXR0ZW1wdGVkIHdpdGggTk9fV1JJVEUgZGVidWdnaW5nIGZsYWcgc2V0XG4iLAorCSAgICAgICBIX05PKGNtZCkpOworCWNtZC0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNik7CisJZG9uZShjbWQpOworCXJldHVybiAwOworICAgIH0KKyNlbmRpZiAvKiAoTkRFQlVHICYgTkRFQlVHX05PX1dSSVRFKSAqLworCisKKyNpZmRlZiBOQ1I1MzgwX1NUQVRTCisjIGlmIDAKKyAgICBpZiAoIWhvc3RkYXRhLT5jb25uZWN0ZWQgJiYgIWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSAmJgorCSFob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlKSB7CisJaG9zdGRhdGEtPnRpbWViYXNlID0gamlmZmllczsKKyAgICB9CisjIGVuZGlmCisjIGlmZGVmIE5DUjUzODBfU1RBVF9MSU1JVAorICAgIGlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbiA+IE5DUjUzODBfU1RBVF9MSU1JVCkKKyMgZW5kaWYKKwlzd2l0Y2ggKGNtZC0+Y21uZFswXSkKKwl7CisJICAgIGNhc2UgV1JJVEU6CisJICAgIGNhc2UgV1JJVEVfNjoKKwkgICAgY2FzZSBXUklURV8xMDoKKwkJaG9zdGRhdGEtPnRpbWVfd3JpdGVbY21kLT5kZXZpY2UtPmlkXSAtPSAoamlmZmllcyAtIGhvc3RkYXRhLT50aW1lYmFzZSk7CisJCWhvc3RkYXRhLT5ieXRlc193cml0ZVtjbWQtPmRldmljZS0+aWRdICs9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCQlob3N0ZGF0YS0+cGVuZGluZ3crKzsKKwkJYnJlYWs7CisJICAgIGNhc2UgUkVBRDoKKwkgICAgY2FzZSBSRUFEXzY6CisJICAgIGNhc2UgUkVBRF8xMDoKKwkJaG9zdGRhdGEtPnRpbWVfcmVhZFtjbWQtPmRldmljZS0+aWRdIC09IChqaWZmaWVzIC0gaG9zdGRhdGEtPnRpbWViYXNlKTsKKwkJaG9zdGRhdGEtPmJ5dGVzX3JlYWRbY21kLT5kZXZpY2UtPmlkXSArPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJaG9zdGRhdGEtPnBlbmRpbmdyKys7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCisgICAgLyogCisgICAgICogV2UgdXNlIHRoZSBob3N0X3NjcmliYmxlIGZpZWxkIGFzIGEgcG9pbnRlciB0byB0aGUgbmV4dCBjb21tYW5kICAKKyAgICAgKiBpbiBhIHF1ZXVlIAorICAgICAqLworCisgICAgTkVYVChjbWQpID0gTlVMTDsKKyAgICBjbWQtPnNjc2lfZG9uZSA9IGRvbmU7CisKKyAgICBjbWQtPnJlc3VsdCA9IDA7CisKKworICAgIC8qIAorICAgICAqIEluc2VydCB0aGUgY21kIGludG8gdGhlIGlzc3VlIHF1ZXVlLiBOb3RlIHRoYXQgUkVRVUVTVCBTRU5TRSAKKyAgICAgKiBjb21tYW5kcyBhcmUgYWRkZWQgdG8gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIHNpbmNlIGFueSBjb21tYW5kIHdpbGwKKyAgICAgKiBjbGVhciB0aGUgY29udGluZ2VudCBhbGxlZ2lhbmNlIGNvbmRpdGlvbiB0aGF0IGV4aXN0cyBhbmQgdGhlIAorICAgICAqIHNlbnNlIGRhdGEgaXMgb25seSBndWFyYW50ZWVkIHRvIGJlIHZhbGlkIHdoaWxlIHRoZSBjb25kaXRpb24gZXhpc3RzLgorICAgICAqLworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIC8qICsrZ3VlbnRoZXI6IG5vdyB0aGF0IHRoZSBpc3N1ZSBxdWV1ZSBpcyBiZWluZyBzZXQgdXAsIHdlIGNhbiBsb2NrIFNULURNQS4KKyAgICAgKiBPdGhlcndpc2UgYSBydW5uaW5nIE5DUjUzODBfbWFpbiBtYXkgc3RlYWwgdGhlIGxvY2suCisgICAgICogTG9jayBiZWZvcmUgYWN0dWFsbHkgaW5zZXJ0aW5nIGR1ZSB0byBmYWlybmVzcyByZWFzb25zIGV4cGxhaW5lZCBpbgorICAgICAqIGF0YXJpX3Njc2kuYy4gSWYgd2UgaW5zZXJ0IGZpcnN0LCB0aGVuIGl0J3MgaW1wb3NzaWJsZSBmb3IgdGhpcyBkcml2ZXIKKyAgICAgKiB0byByZWxlYXNlIHRoZSBsb2NrLgorICAgICAqIFN0b3AgdGltZXIgZm9yIHRoaXMgY29tbWFuZCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgbG9jaywgb3IgdGltZW91dHMKKyAgICAgKiBtYXkgaGFwcGVuIChhbmQgdGhleSByZWFsbHkgZG8pLCBhbmQgaXQncyBubyBnb29kIGlmIHRoZSBjb21tYW5kIGRvZXNuJ3QKKyAgICAgKiBhcHBlYXIgaW4gYW55IG9mIHRoZSBxdWV1ZXMuCisgICAgICogKytyb21hbjogSnVzdCBkaXNhYmxpbmcgdGhlIE5DUiBpbnRlcnJ1cHQgaXNuJ3Qgc3VmZmljaWVudCBoZXJlLAorICAgICAqIGJlY2F1c2UgYWxzbyBhIHRpbWVyIGludCBjYW4gdHJpZ2dlciBhbiBhYm9ydCBvciByZXNldCwgd2hpY2ggd291bGQKKyAgICAgKiBhbHRlciBxdWV1ZXMgYW5kIHRvdWNoIHRoZSBsb2NrLgorICAgICAqLworICAgIGlmICghKGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSkgfHwgKGNtZC0+Y21uZFswXSA9PSBSRVFVRVNUX1NFTlNFKSkgeworCUxJU1QoY21kLCBob3N0ZGF0YS0+aXNzdWVfcXVldWUpOworCU5FWFQoY21kKSA9IGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsKKwlob3N0ZGF0YS0+aXNzdWVfcXVldWUgPSBjbWQ7CisgICAgfSBlbHNlIHsKKwlmb3IgKHRtcCA9IChTY3NpX0NtbmQgKilob3N0ZGF0YS0+aXNzdWVfcXVldWU7CisJICAgICBORVhUKHRtcCk7IHRtcCA9IE5FWFQodG1wKSkKKwkgICAgOworCUxJU1QoY21kLCB0bXApOworCU5FWFQodG1wKSA9IGNtZDsKKyAgICB9CisKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICBRVV9QUklOVEsoInNjc2klZDogY29tbWFuZCBhZGRlZCB0byAlcyBvZiBxdWV1ZVxuIiwgSF9OTyhjbWQpLAorCSAgICAgIChjbWQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkgPyAiaGVhZCIgOiAidGFpbCIpOworCisgICAgLyogSWYgcXVldWVfY29tbWFuZCgpIGlzIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCAocmVhbCBvbmUgb3IgYm90dG9tCisgICAgICogaGFsZiksIHdlIGxldCBxdWV1ZV9tYWluKCkgZG8gdGhlIGpvYiBvZiB0YWtpbmcgY2FyZSBhYm91dCBtYWluLiBJZiBpdAorICAgICAqIGlzIGFscmVhZHkgcnVubmluZywgdGhpcyBpcyBhIG5vLW9wLCBlbHNlIG1haW4gd2lsbCBiZSBxdWV1ZWQuCisgICAgICoKKyAgICAgKiBJZiB3ZSdyZSBub3QgaW4gYW4gaW50ZXJydXB0LCB3ZSBjYW4gY2FsbCBOQ1I1MzgwX21haW4oKQorICAgICAqIHVuY29uZGl0aW9uYWxseSwgYmVjYXVzZSBpdCBjYW5ub3QgYmUgYWxyZWFkeSBydW5uaW5nLgorICAgICAqLworICAgIGlmIChpbl9pbnRlcnJ1cHQoKSB8fCAoKGZsYWdzID4+IDgpICYgNykgPj0gNikKKwlxdWV1ZV9tYWluKCk7CisgICAgZWxzZQorCU5DUjUzODBfbWFpbihOVUxMKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogTkNSNTM4MF9tYWluICh2b2lkKSAKKyAqCisgKiBQdXJwb3NlIDogTkNSNTM4MF9tYWluIGlzIGEgY29yb3V0aW5lIHRoYXQgcnVucyBhcyBsb25nIGFzIG1vcmUgd29yayBjYW4gCisgKgliZSBkb25lIG9uIHRoZSBOQ1I1MzgwIGhvc3QgYWRhcHRlcnMgaW4gYSBzeXN0ZW0uICBCb3RoIAorICoJTkNSNTM4MF9xdWV1ZV9jb21tYW5kKCkgYW5kIE5DUjUzODBfaW50cigpIHdpbGwgdHJ5IHRvIHN0YXJ0IGl0IAorICoJaW4gY2FzZSBpdCBpcyBub3QgcnVubmluZy4KKyAqIAorICogTk9URSA6IE5DUjUzODBfbWFpbiBleGl0cyB3aXRoIGludGVycnVwdHMgKmRpc2FibGVkKiwgdGhlIGNhbGxlciBzaG91bGQgCisgKiAgcmVlbmFibGUgdGhlbS4gIFRoaXMgcHJldmVudHMgcmVlbnRyYW5jeSBhbmQga2VybmVsIHN0YWNrIG92ZXJmbG93LgorICovIAkKKyAgICAKK3N0YXRpYyB2b2lkIE5DUjUzODBfbWFpbiAodm9pZCAqYmwpCit7CisgICAgU2NzaV9DbW5kICp0bXAsICpwcmV2OworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlID0gZmlyc3RfaW5zdGFuY2U7CisgICAgc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKmhvc3RkYXRhID0gSE9TVERBVEEoaW5zdGFuY2UpOworICAgIGludCBkb25lOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgCisgICAgLyoKKyAgICAgKiBXZSBydW4gKHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCkgdW50aWwgd2UncmUgc3VyZSB0aGF0IG5vbmUgb2YgCisgICAgICogdGhlIGhvc3QgYWRhcHRlcnMgaGF2ZSBhbnl0aGluZyB0aGF0IGNhbiBiZSBkb25lLCBhdCB3aGljaCBwb2ludCAKKyAgICAgKiB3ZSBzZXQgbWFpbl9ydW5uaW5nIHRvIDAgYW5kIGV4aXQuCisgICAgICoKKyAgICAgKiBJbnRlcnJ1cHRzIGFyZSBlbmFibGVkIGJlZm9yZSBkb2luZyB2YXJpb3VzIG90aGVyIGludGVybmFsIAorICAgICAqIGluc3RydWN0aW9ucywgYWZ0ZXIgd2UndmUgZGVjaWRlZCB0aGF0IHdlIG5lZWQgdG8gcnVuIHRocm91Z2gKKyAgICAgKiB0aGUgbG9vcCBhZ2Fpbi4KKyAgICAgKgorICAgICAqIHRoaXMgc2hvdWxkIHByZXZlbnQgYW55IHJhY2UgY29uZGl0aW9ucy4KKyAgICAgKiAKKyAgICAgKiArK3JvbWFuOiBKdXN0IGRpc2FibGluZyB0aGUgTkNSIGludGVycnVwdCBpc24ndCBzdWZmaWNpZW50IGhlcmUsCisgICAgICogYmVjYXVzZSBhbHNvIGEgdGltZXIgaW50IGNhbiB0cmlnZ2VyIGFuIGFib3J0IG9yIHJlc2V0LCB3aGljaCBjYW4KKyAgICAgKiBhbHRlciBxdWV1ZXMgYW5kIHRvdWNoIHRoZSBGYWxjb24gbG9jay4KKyAgICAgKi8KKworICAgIC8qIFRlbGwgaW50IGhhbmRsZXJzIG1haW4oKSBpcyBub3cgYWxyZWFkeSBleGVjdXRpbmcuICBOb3RlIHRoYXQKKyAgICAgICBubyByYWNlcyBhcmUgcG9zc2libGUgaGVyZS4gSWYgYW4gaW50IGNvbWVzIGluIGJlZm9yZQorICAgICAgICdtYWluX3J1bm5pbmcnIGlzIHNldCBoZXJlLCBhbmQgcXVldWVzL2V4ZWN1dGVzIG1haW4gdmlhIHRoZQorICAgICAgIHRhc2sgcXVldWUsIGl0IGRvZXNuJ3QgZG8gYW55IGhhcm0sIGp1c3QgdGhpcyBpbnN0YW5jZSBvZiBtYWluCisgICAgICAgd29uJ3QgZmluZCBhbnkgd29yayBsZWZ0IHRvIGRvLiAqLworICAgIGlmIChtYWluX3J1bm5pbmcpCisgICAgCXJldHVybjsKKyAgICBtYWluX3J1bm5pbmcgPSAxOworCisgICAgbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CisgICAgZG8geworCWxvY2FsX2lycV9kaXNhYmxlKCk7IC8qIEZyZWV6ZSByZXF1ZXN0IHF1ZXVlcyAqLworCWRvbmUgPSAxOworCQorCWlmICghaG9zdGRhdGEtPmNvbm5lY3RlZCkgeworCSAgICBNQUlOX1BSSU5USyggInNjc2klZDogbm90IGNvbm5lY3RlZFxuIiwgSE9TVE5PICk7CisJICAgIC8qCisJICAgICAqIFNlYXJjaCB0aHJvdWdoIHRoZSBpc3N1ZV9xdWV1ZSBmb3IgYSBjb21tYW5kIGRlc3RpbmVkCisJICAgICAqIGZvciBhIHRhcmdldCB0aGF0J3Mgbm90IGJ1c3kuCisJICAgICAqLworI2lmIChOREVCVUcgJiBOREVCVUdfTElTVFMpCisJICAgIGZvciAodG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWUsIHByZXYgPSBOVUxMOworCQkgdG1wICYmICh0bXAgIT0gcHJldik7IHByZXYgPSB0bXAsIHRtcCA9IE5FWFQodG1wKSkKKwkJOworCSAgICBpZiAoKHRtcCA9PSBwcmV2KSAmJiB0bXApIHByaW50aygiIExPT1BcbiIpOy8qIGVsc2UgcHJpbnRrKCJcbiIpOyovCisjZW5kaWYKKwkgICAgZm9yICh0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSwgCisJCSBwcmV2ID0gTlVMTDsgdG1wOyBwcmV2ID0gdG1wLCB0bXAgPSBORVhUKHRtcCkgKSB7CisKKyNpZiAoTkRFQlVHICYgTkRFQlVHX0xJU1RTKQorCQlpZiAocHJldiAhPSB0bXApCisJCSAgICBwcmludGsoIk1BSU4gdG1wPSVwICAgdGFyZ2V0PSVkICAgYnVzeT0lZCBsdW49JWRcbiIsCisJCQkgICB0bXAsIHRtcC0+dGFyZ2V0LCBob3N0ZGF0YS0+YnVzeVt0bXAtPnRhcmdldF0sCisJCQkgICB0bXAtPmx1bik7CisjZW5kaWYKKwkJLyogIFdoZW4gd2UgZmluZCBvbmUsIHJlbW92ZSBpdCBmcm9tIHRoZSBpc3N1ZSBxdWV1ZS4gKi8KKwkJLyogKytndWVudGhlcjogcG9zc2libGUgcmFjZSB3aXRoIEZhbGNvbiBsb2NraW5nICovCisJCWlmICgKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKwkJICAgICFpc19sdW5fYnVzeSggdG1wLCB0bXAtPmNtbmRbMF0gIT0gUkVRVUVTVF9TRU5TRSkKKyNlbHNlCisJCSAgICAhKGhvc3RkYXRhLT5idXN5W3RtcC0+ZGV2aWNlLT5pZF0gJiAoMSA8PCB0bXAtPmRldmljZS0+bHVuKSkKKyNlbmRpZgorCQkgICAgKSB7CisJCSAgICAvKiArK2d1ZW50aGVyOiBqdXN0IHRvIGJlIHN1cmUsIHRoaXMgbXVzdCBiZSBhdG9taWMgKi8KKwkJICAgIGxvY2FsX2lycV9kaXNhYmxlKCk7CisJCSAgICBpZiAocHJldikgeworCQkgICAgICAgIFJFTU9WRShwcmV2LCBORVhUKHByZXYpLCB0bXAsIE5FWFQodG1wKSk7CisJCQlORVhUKHByZXYpID0gTkVYVCh0bXApOworCQkgICAgfSBlbHNlIHsKKwkJICAgICAgICBSRU1PVkUoLTEsIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSwgdG1wLCBORVhUKHRtcCkpOworCQkJaG9zdGRhdGEtPmlzc3VlX3F1ZXVlID0gTkVYVCh0bXApOworCQkgICAgfQorCQkgICAgTkVYVCh0bXApID0gTlVMTDsKKwkJICAgIAorCQkgICAgLyogcmVlbmFibGUgaW50ZXJydXB0cyBhZnRlciBmaW5kaW5nIG9uZSAqLworCQkgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkgICAgCisJCSAgICAvKiAKKwkJICAgICAqIEF0dGVtcHQgdG8gZXN0YWJsaXNoIGFuIElfVF9MIG5leHVzIGhlcmUuIAorCQkgICAgICogT24gc3VjY2VzcywgaW5zdGFuY2UtPmhvc3RkYXRhLT5jb25uZWN0ZWQgaXMgc2V0LgorCQkgICAgICogT24gZmFpbHVyZSwgd2UgbXVzdCBhZGQgdGhlIGNvbW1hbmQgYmFjayB0byB0aGUKKwkJICAgICAqICAgaXNzdWUgcXVldWUgc28gd2UgY2FuIGtlZXAgdHJ5aW5nLgkKKwkJICAgICAqLworCQkgICAgTUFJTl9QUklOVEsoInNjc2klZDogbWFpbigpOiBjb21tYW5kIGZvciB0YXJnZXQgJWQgIgorCQkJCSJsdW4gJWQgcmVtb3ZlZCBmcm9tIGlzc3VlX3F1ZXVlXG4iLAorCQkJCUhPU1ROTywgdG1wLT50YXJnZXQsIHRtcC0+bHVuKTsKKwkJICAgIC8qIAorCQkgICAgICogUkVRVUVTVCBTRU5TRSBjb21tYW5kcyBhcmUgaXNzdWVkIHdpdGhvdXQgdGFnZ2VkCisJCSAgICAgKiBxdWV1ZWluZywgZXZlbiBvbiBTQ1NJLUlJIGRldmljZXMgYmVjYXVzZSB0aGUgCisJCSAgICAgKiBjb250aW5nZW50IGFsbGVnaWFuY2UgY29uZGl0aW9uIGV4aXN0cyBmb3IgdGhlIAorCQkgICAgICogZW50aXJlIHVuaXQuCisJCSAgICAgKi8KKwkJICAgIC8qICsrcm9tYW46IC4uLmFuZCB0aGUgc3RhbmRhcmQgYWxzbyByZXF1aXJlcyB0aGF0CisJCSAgICAgKiBSRVFVRVNUIFNFTlNFIGNvbW1hbmQgYXJlIHVudGFnZ2VkLgorCQkgICAgICovCisJCSAgICAKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKwkJICAgIGNtZF9nZXRfdGFnKCB0bXAsIHRtcC0+Y21uZFswXSAhPSBSRVFVRVNUX1NFTlNFICk7CisjZW5kaWYKKwkJICAgIGlmICghTkNSNTM4MF9zZWxlY3QoaW5zdGFuY2UsIHRtcCwgCisJCQkgICAgKHRtcC0+Y21uZFswXSA9PSBSRVFVRVNUX1NFTlNFKSA/IFRBR19OT05FIDogCisJCQkgICAgVEFHX05FWFQpKSB7CisJCQlicmVhazsKKwkJICAgIH0gZWxzZSB7CisJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQkJTElTVCh0bXAsIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSk7CisJCQlORVhUKHRtcCkgPSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7CisJCQlob3N0ZGF0YS0+aXNzdWVfcXVldWUgPSB0bXA7CisjaWZkZWYgU1VQUE9SVF9UQUdTCisJCQljbWRfZnJlZV90YWcoIHRtcCApOworI2VuZGlmCisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQlNQUlOX1BSSU5USygic2NzaSVkOiBtYWluKCk6IHNlbGVjdCgpIGZhaWxlZCwgIgorCQkJCSAgICAicmV0dXJuZWQgdG8gaXNzdWVfcXVldWVcbiIsIEhPU1ROTyk7CisJCQlpZiAoaG9zdGRhdGEtPmNvbm5lY3RlZCkKKwkJCSAgICBicmVhazsKKwkJICAgIH0KKwkJfSAvKiBpZiB0YXJnZXQvbHVuL3RhcmdldCBxdWV1ZSBpcyBub3QgYnVzeSAqLworCSAgICB9IC8qIGZvciBpc3N1ZV9xdWV1ZSAqLworCX0gLyogaWYgKCFob3N0ZGF0YS0+Y29ubmVjdGVkKSAqLworCWlmIChob3N0ZGF0YS0+Y29ubmVjdGVkIAorI2lmZGVmIFJFQUxfRE1BCisJICAgICYmICFob3N0ZGF0YS0+ZG1hX2xlbgorI2VuZGlmCisJICAgICkgeworCSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJICAgIE1BSU5fUFJJTlRLKCJzY3NpJWQ6IG1haW46IHBlcmZvcm1pbmcgaW5mb3JtYXRpb24gdHJhbnNmZXJcbiIsCisJCQlIT1NUTk8pOworCSAgICBOQ1I1MzgwX2luZm9ybWF0aW9uX3RyYW5zZmVyKGluc3RhbmNlKTsKKwkgICAgTUFJTl9QUklOVEsoInNjc2klZDogbWFpbjogZG9uZSBzZXQgZmFsc2VcbiIsIEhPU1ROTyk7CisJICAgIGRvbmUgPSAwOworCX0KKyAgICB9IHdoaWxlICghZG9uZSk7CisKKyAgICAvKiBCZXR0ZXIgYWxsb3cgaW50cyBfYWZ0ZXJfICdtYWluX3J1bm5pbmcnIGhhcyBiZWVuIGNsZWFyZWQsIGVsc2UKKyAgICAgICBhbiBpbnRlcnJ1cHQgY291bGQgYmVsaWV2ZSB3ZSdsbCBwaWNrIHVwIHRoZSB3b3JrIGl0IGxlZnQgZm9yCisgICAgICAgdXMsIGJ1dCB3ZSB3b24ndCBzZWUgaXQgYW55bW9yZSBoZXJlLi4uICovCisgICAgbWFpbl9ydW5uaW5nID0gMDsKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKworI2lmZGVmIFJFQUxfRE1BCisvKgorICogRnVuY3Rpb24gOiB2b2lkIE5DUjUzODBfZG1hX2NvbXBsZXRlIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKKyAqCisgKiBQdXJwb3NlIDogQ2FsbGVkIGJ5IGludGVycnVwdCBoYW5kbGVyIHdoZW4gRE1BIGZpbmlzaGVzIG9yIGEgcGhhc2UKKyAqCW1pc21hdGNoIG9jY3VycyAod2hpY2ggd291bGQgZmluaXNoIHRoZSBETUEgdHJhbnNmZXIpLiAgCisgKgorICogSW5wdXRzIDogaW5zdGFuY2UgLSB0aGlzIGluc3RhbmNlIG9mIHRoZSBOQ1I1MzgwLgorICoKKyAqLworCitzdGF0aWMgdm9pZCBOQ1I1MzgwX2RtYV9jb21wbGV0ZSggc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UgKQoreworICAgIFNFVFVQX0hPU1REQVRBKGluc3RhbmNlKTsKKyAgICBpbnQgICAgICAgICAgIHRyYW5zZmVyZWQ7CisgICAgdW5zaWduZWQgY2hhciAqKmRhdGE7CisgICAgdm9sYXRpbGUgaW50ICAqY291bnQ7CisKKyAgICBpZiAoIWhvc3RkYXRhLT5jb25uZWN0ZWQpIHsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQ6IHJlY2VpdmVkIGVuZCBvZiBETUEgaW50ZXJydXB0IHdpdGggIgorCSAgICAgICAibm8gY29ubmVjdGVkIGNtZFxuIiwgSE9TVE5PKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgRE1BX1BSSU5USygic2NzaSVkOiByZWFsIERNQSB0cmFuc2ZlciBjb21wbGV0ZSwgYmFzciAweCVYLCBzciAweCVYXG4iLAorCSAgICAgICBIT1NUTk8sIE5DUjUzODBfcmVhZChCVVNfQU5EX1NUQVRVU19SRUcpLAorCSAgICAgICBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykpOworCisgICAgaWYoKHN1bjNzY3NpX2RtYV9maW5pc2gocnFfZGF0YV9kaXIoaG9zdGRhdGEtPmNvbm5lY3RlZC0+cmVxdWVzdCkpKSkgeworCSAgICBwcmludGsoInNjc2klZDogb3ZlcnJ1biBpbiBVREMgY291bnRlciAtLSBub3QgcHJlcGFyZWQgdG8gZGVhbCB3aXRoIHRoaXMhXG4iLCBIT1NUTk8pOworCSAgICBwcmludGsoInBsZWFzZSBlLW1haWwgc2FtbXlAc2FtbXkubmV0IHdpdGggYSBkZXNjcmlwdGlvbiBvZiBob3cgdGhpc1xuIik7CisJICAgIHByaW50aygiZXJyb3Igd2FzIHByb2R1Y2VkLlxuIik7CisJICAgIEJVRygpOworICAgIH0KKworICAgIC8qIG1ha2Ugc3VyZSB3ZSdyZSBub3Qgc3R1Y2sgaW4gYSBkYXRhIHBoYXNlICovCisgICAgaWYoKE5DUjUzODBfcmVhZChCVVNfQU5EX1NUQVRVU19SRUcpICYgKEJBU1JfUEhBU0VfTUFUQ0ggfAorCQkJCQkgICAgQkFTUl9BQ0spKSA9PQorICAgICAgIChCQVNSX1BIQVNFX01BVENIIHwgQkFTUl9BQ0spKSB7CisJICAgIHByaW50aygic2NzaSVkOiBCQVNSICUwMnhcbiIsIEhPU1ROTywgTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRykpOworCSAgICBwcmludGsoInNjc2klZDogYnVzIHN0dWNrIGluIGRhdGEgcGhhc2UgLS0gcHJvYmFibHkgYSBzaW5nbGUgYnl0ZSAiCisJCSAgICJvdmVycnVuIVxuIiwgSE9TVE5PKTsKKwkgICAgcHJpbnRrKCJub3QgcHJlcGFyZWQgZm9yIHRoaXMgZXJyb3IhXG4iKTsKKwkgICAgcHJpbnRrKCJwbGVhc2UgZS1tYWlsIHNhbW15QHNhbW15Lm5ldCB3aXRoIGEgZGVzY3JpcHRpb24gb2YgaG93IHRoaXNcbiIpOworCSAgICBwcmludGsoImVycm9yIHdhcyBwcm9kdWNlZC5cbiIpOworCSAgICBCVUcoKTsKKyAgICB9CisKKworCisgICAgKHZvaWQpIE5DUjUzODBfcmVhZChSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyk7CisgICAgTkNSNTM4MF93cml0ZShNT0RFX1JFRywgTVJfQkFTRSk7CisgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKworICAgIHRyYW5zZmVyZWQgPSBob3N0ZGF0YS0+ZG1hX2xlbiAtIE5DUjUzODBfZG1hX3Jlc2lkdWFsKGluc3RhbmNlKTsKKyAgICBob3N0ZGF0YS0+ZG1hX2xlbiA9IDA7CisKKyAgICBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKiopICYoaG9zdGRhdGEtPmNvbm5lY3RlZC0+U0NwLnB0cik7CisgICAgY291bnQgPSAmKGhvc3RkYXRhLT5jb25uZWN0ZWQtPlNDcC50aGlzX3Jlc2lkdWFsKTsKKyAgICAqZGF0YSArPSB0cmFuc2ZlcmVkOworICAgICpjb3VudCAtPSB0cmFuc2ZlcmVkOworCit9CisjZW5kaWYgLyogUkVBTF9ETUEgKi8KKworCisvKgorICogRnVuY3Rpb24gOiB2b2lkIE5DUjUzODBfaW50ciAoaW50IGlycSkKKyAqIAorICogUHVycG9zZSA6IGhhbmRsZSBpbnRlcnJ1cHRzLCByZWVzdGFibGlzaGluZyBJX1RfTCBvciBJX1RfTF9RIG5leHVzZXMKKyAqCWZyb20gdGhlIGRpc2Nvbm5lY3RlZCBxdWV1ZSwgYW5kIHJlc3RhcnRpbmcgTkNSNTM4MF9tYWluKCkgCisgKglhcyByZXF1aXJlZC4KKyAqCisgKiBJbnB1dHMgOiBpbnQgaXJxLCBpcnEgdGhhdCBjYXVzZWQgdGhpcyBpbnRlcnJ1cHQuCisgKgorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBOQ1I1MzgwX2ludHIgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UgPSBmaXJzdF9pbnN0YW5jZTsKKyAgICBpbnQgZG9uZSA9IDEsIGhhbmRsZWQgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgYmFzcjsKKworICAgIElOVF9QUklOVEsoInNjc2klZDogTkNSNTM4MCBpcnEgdHJpZ2dlcmVkXG4iLCBIT1NUTk8pOworCisgICAgLyogTG9vayBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzICovCisgICAgYmFzciA9IE5DUjUzODBfcmVhZChCVVNfQU5EX1NUQVRVU19SRUcpOworICAgIElOVF9QUklOVEsoInNjc2klZDogQkFTUj0lMDJ4XG4iLCBIT1NUTk8sIGJhc3IpOworICAgIC8qIGRpc3BhdGNoIHRvIGFwcHJvcHJpYXRlIHJvdXRpbmUgaWYgZm91bmQgYW5kIGRvbmU9MCAqLworICAgIGlmIChiYXNyICYgQkFTUl9JUlEpIHsKKwlOQ1JfUFJJTlQoTkRFQlVHX0lOVFIpOworCWlmICgoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgKFNSX1NFTHxTUl9JTykpID09IChTUl9TRUx8U1JfSU8pKSB7CisJICAgIGRvbmUgPSAwOworCSAgICBFTkFCTEVfSVJRKCk7CisJICAgIElOVF9QUklOVEsoInNjc2klZDogU0VMIGludGVycnVwdFxuIiwgSE9TVE5PKTsKKwkgICAgTkNSNTM4MF9yZXNlbGVjdChpbnN0YW5jZSk7CisJICAgICh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworCX0KKwllbHNlIGlmIChiYXNyICYgQkFTUl9QQVJJVFlfRVJST1IpIHsKKwkgICAgSU5UX1BSSU5USygic2NzaSVkOiBQQVJJVFkgaW50ZXJydXB0XG4iLCBIT1NUTk8pOworCSAgICAodm9pZCkgTkNSNTM4MF9yZWFkKFJFU0VUX1BBUklUWV9JTlRFUlJVUFRfUkVHKTsKKwl9CisJZWxzZSBpZiAoKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIFNSX1JTVCkgPT0gU1JfUlNUKSB7CisJICAgIElOVF9QUklOVEsoInNjc2klZDogUkVTRVQgaW50ZXJydXB0XG4iLCBIT1NUTk8pOworCSAgICAodm9pZClOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworCX0KKwllbHNlIHsKKwkgICAgLyogIAorCSAgICAgKiBUaGUgcmVzdCBvZiB0aGUgaW50ZXJydXB0IGNvbmRpdGlvbnMgY2FuIG9jY3VyIG9ubHkgZHVyaW5nIGEKKwkgICAgICogRE1BIHRyYW5zZmVyCisJICAgICAqLworCisjaWYgZGVmaW5lZChSRUFMX0RNQSkKKwkgICAgLyoKKwkgICAgICogV2Ugc2hvdWxkIG9ubHkgZ2V0IFBIQVNFIE1JU01BVENIIGFuZCBFT1AgaW50ZXJydXB0cyBpZiB3ZSBoYXZlCisJICAgICAqIERNQSBlbmFibGVkLCBzbyBkbyBhIHNhbml0eSBjaGVjayBiYXNlZCBvbiB0aGUgY3VycmVudCBzZXR0aW5nCisJICAgICAqIG9mIHRoZSBNT0RFIHJlZ2lzdGVyLgorCSAgICAgKi8KKworCSAgICBpZiAoKE5DUjUzODBfcmVhZChNT0RFX1JFRykgJiBNUl9ETUFfTU9ERSkgJiYKKwkJKChiYXNyICYgQkFTUl9FTkRfRE1BX1RSQU5TRkVSKSB8fCAKKwkJICEoYmFzciAmIEJBU1JfUEhBU0VfTUFUQ0gpKSkgeworCQkgICAgCisJCUlOVF9QUklOVEsoInNjc2klZDogUEhBU0UgTUlTTSBvciBFT1AgaW50ZXJydXB0XG4iLCBIT1NUTk8pOworCQlOQ1I1MzgwX2RtYV9jb21wbGV0ZSggaW5zdGFuY2UgKTsKKwkJZG9uZSA9IDA7CisJCUVOQUJMRV9JUlEoKTsKKwkgICAgfSBlbHNlCisjZW5kaWYgLyogUkVBTF9ETUEgKi8KKwkgICAgeworLyogTVM6IElnbm9yZSB1bmtub3duIHBoYXNlIG1pc21hdGNoIGludGVycnVwdHMgKGNhdXNlZCBieSBFT1AgaW50ZXJydXB0KSAqLworCQlpZiAoYmFzciAmIEJBU1JfUEhBU0VfTUFUQ0gpCisJCSAgIElOVF9QUklOVEsoInNjc2klZDogdW5rbm93biBpbnRlcnJ1cHQsICIKKwkJCSAgICJCQVNSIDB4JXgsIE1SIDB4JXgsIFNSIDB4JXhcbiIsCisJCQkgICBIT1NUTk8sIGJhc3IsIE5DUjUzODBfcmVhZChNT0RFX1JFRyksCisJCQkgICBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykpOworCQkodm9pZCkgTkNSNTM4MF9yZWFkKFJFU0VUX1BBUklUWV9JTlRFUlJVUFRfUkVHKTsKKyNpZmRlZiBTVU4zX1NDU0lfVk1FCisJCWRyZWdzLT5jc3IgfD0gQ1NSX0RNQV9FTkFCTEU7CisjZW5kaWYKKwkgICAgfQorCX0gLyogaWYgIShTRUxFQ1RJT04gfHwgUEFSSVRZKSAqLworCWhhbmRsZWQgPSAxOworICAgIH0gLyogQkFTUiAmIElSUSAqLworICAgIGVsc2UgeworCisJcHJpbnRrKEtFUk5fTk9USUNFICJzY3NpJWQ6IGludGVycnVwdCB3aXRob3V0IElSUSBiaXQgc2V0IGluIEJBU1IsICIKKwkgICAgICAgIkJBU1IgMHglWCwgTVIgMHglWCwgU1IgMHgleFxuIiwgSE9TVE5PLCBiYXNyLAorCSAgICAgICBOQ1I1MzgwX3JlYWQoTU9ERV9SRUcpLCBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykpOworCSh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworI2lmZGVmIFNVTjNfU0NTSV9WTUUKKwkJZHJlZ3MtPmNzciB8PSBDU1JfRE1BX0VOQUJMRTsKKyNlbmRpZgorICAgIH0KKyAgICAKKyAgICBpZiAoIWRvbmUpIHsKKwlJTlRfUFJJTlRLKCJzY3NpJWQ6IGluIGludCByb3V0aW5lLCBjYWxsaW5nIG1haW5cbiIsIEhPU1ROTyk7CisJLyogUHV0IGEgY2FsbCB0byBOQ1I1MzgwX21haW4oKSBvbiB0aGUgcXVldWUuLi4gKi8KKwlxdWV1ZV9tYWluKCk7CisgICAgfQorICAgIHJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisjaWZkZWYgTkNSNTM4MF9TVEFUUworc3RhdGljIHZvaWQgY29sbGVjdF9zdGF0cyhzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSogaG9zdGRhdGEsIFNjc2lfQ21uZCogY21kKQoreworIyBpZmRlZiBOQ1I1MzgwX1NUQVRfTElNSVQKKyAgICBpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPiBOQ1I1MzgwX1NUQVRfTElNSVQpCisjIGVuZGlmCisJc3dpdGNoIChjbWQtPmNtbmRbMF0pCisJeworCSAgICBjYXNlIFdSSVRFOgorCSAgICBjYXNlIFdSSVRFXzY6CisJICAgIGNhc2UgV1JJVEVfMTA6CisJCWhvc3RkYXRhLT50aW1lX3dyaXRlW2NtZC0+ZGV2aWNlLT5pZF0gKz0gKGppZmZpZXMgLSBob3N0ZGF0YS0+dGltZWJhc2UpOworCQkvKmhvc3RkYXRhLT5ieXRlc193cml0ZVtjbWQtPmRldmljZS0+aWRdICs9IGNtZC0+cmVxdWVzdF9idWZmbGVuOyovCisJCWhvc3RkYXRhLT5wZW5kaW5ndy0tOworCQlicmVhazsKKwkgICAgY2FzZSBSRUFEOgorCSAgICBjYXNlIFJFQURfNjoKKwkgICAgY2FzZSBSRUFEXzEwOgorCQlob3N0ZGF0YS0+dGltZV9yZWFkW2NtZC0+ZGV2aWNlLT5pZF0gKz0gKGppZmZpZXMgLSBob3N0ZGF0YS0+dGltZWJhc2UpOworCQkvKmhvc3RkYXRhLT5ieXRlc19yZWFkW2NtZC0+ZGV2aWNlLT5pZF0gKz0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47Ki8KKwkJaG9zdGRhdGEtPnBlbmRpbmdyLS07CisJCWJyZWFrOworCX0KK30KKyNlbmRpZgorCisvKiAKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfc2VsZWN0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgU2NzaV9DbW5kICpjbWQsIAorICoJaW50IHRhZyk7CisgKgorICogUHVycG9zZSA6IGVzdGFibGlzaGVzIElfVF9MIG9yIElfVF9MX1EgbmV4dXMgZm9yIG5ldyBvciBleGlzdGluZyBjb21tYW5kLAorICoJaW5jbHVkaW5nIEFSQklUUkFUSU9OLCBTRUxFQ1RJT04sIGFuZCBpbml0aWFsIG1lc3NhZ2Ugb3V0IGZvciAKKyAqCUlERU5USUZZIGFuZCBxdWV1ZSBtZXNzYWdlcy4gCisgKgorICogSW5wdXRzIDogaW5zdGFuY2UgLSBpbnN0YW50aWF0aW9uIG9mIHRoZSA1MzgwIGRyaXZlciBvbiB3aGljaCB0aGlzIAorICogCXRhcmdldCBsaXZlcywgY21kIC0gU0NTSSBjb21tYW5kIHRvIGV4ZWN1dGUsIHRhZyAtIHNldCB0byBUQUdfTkVYVCBmb3IgCisgKgluZXcgdGFnLCBUQUdfTk9ORSBmb3IgdW50YWdnZWQgcXVldWVpbmcsIG90aGVyd2lzZSBzZXQgdG8gdGhlIHRhZyBmb3IgCisgKgl0aGUgY29tbWFuZCB0aGF0IGlzIHByZXNlbnRseSBjb25uZWN0ZWQuCisgKiAKKyAqIFJldHVybnMgOiAtMSBpZiBzZWxlY3Rpb24gY291bGQgbm90IGV4ZWN1dGUgZm9yIHNvbWUgcmVhc29uLAorICoJMCBpZiBzZWxlY3Rpb24gc3VjY2VlZGVkIG9yIGZhaWxlZCBiZWNhdXNlIHRoZSB0YXJnZXQgCisgKiAJZGlkIG5vdCByZXNwb25kLgorICoKKyAqIFNpZGUgZWZmZWN0cyA6IAorICogCUlmIGJ1cyBidXN5LCBhcmJpdHJhdGlvbiBmYWlsZWQsIGV0YywgTkNSNTM4MF9zZWxlY3QoKSB3aWxsIGV4aXQgCisgKgkJd2l0aCByZWdpc3RlcnMgYXMgdGhleSBzaG91bGQgaGF2ZSBiZWVuIG9uIGVudHJ5IC0gaWUKKyAqCQlTRUxFQ1RfRU5BQkxFIHdpbGwgYmUgc2V0IGFwcHJvcHJpYXRlbHksIHRoZSBOQ1I1MzgwCisgKgkJd2lsbCBjZWFzZSB0byBkcml2ZSBhbnkgU0NTSSBidXMgc2lnbmFscy4KKyAqCisgKglJZiBzdWNjZXNzZnVsIDogSV9UX0wgb3IgSV9UX0xfUSBuZXh1cyB3aWxsIGJlIGVzdGFibGlzaGVkLCAKKyAqCQlpbnN0YW5jZS0+Y29ubmVjdGVkIHdpbGwgYmUgc2V0IHRvIGNtZC4gIAorICogCQlTRUxFQ1QgaW50ZXJydXB0IHdpbGwgYmUgZGlzYWJsZWQuCisgKgorICoJSWYgZmFpbGVkIChubyB0YXJnZXQpIDogY21kLT5zY3NpX2RvbmUoKSB3aWxsIGJlIGNhbGxlZCwgYW5kIHRoZSAKKyAqCQljbWQtPnJlc3VsdCBob3N0IGJ5dGUgc2V0IHRvIERJRF9CQURfVEFSR0VULgorICovCisKK3N0YXRpYyBpbnQgTkNSNTM4MF9zZWxlY3QgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBTY3NpX0NtbmQgKmNtZCwgaW50IHRhZykKK3sKKyAgICBTRVRVUF9IT1NUREFUQShpbnN0YW5jZSk7CisgICAgdW5zaWduZWQgY2hhciB0bXBbM10sIHBoYXNlOworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgaW50IGxlbjsKKyAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIGhvc3RkYXRhLT5yZXN0YXJ0X3NlbGVjdCA9IDA7CisgICAgTkNSX1BSSU5UKE5ERUJVR19BUkJJVFJBVElPTik7CisgICAgQVJCX1BSSU5USygic2NzaSVkOiBzdGFydGluZyBhcmJpdHJhdGlvbiwgaWQgPSAlZFxuIiwgSE9TVE5PLAorCSAgICAgICBpbnN0YW5jZS0+dGhpc19pZCk7CisKKyAgICAvKiAKKyAgICAgKiBTZXQgdGhlIHBoYXNlIGJpdHMgdG8gMCwgb3RoZXJ3aXNlIHRoZSBOQ1I1MzgwIHdvbid0IGRyaXZlIHRoZSAKKyAgICAgKiBkYXRhIGJ1cyBkdXJpbmcgU0VMRUNUSU9OLgorICAgICAqLworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIGlmIChob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAtMTsKKyAgICB9CisgICAgTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIDApOworCisKKyAgICAvKiAKKyAgICAgKiBTdGFydCBhcmJpdHJhdGlvbi4KKyAgICAgKi8KKyAgICAKKyAgICBOQ1I1MzgwX3dyaXRlKE9VVFBVVF9EQVRBX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworICAgIE5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0FSQklUUkFURSk7CisKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICAvKiBXYWl0IGZvciBhcmJpdHJhdGlvbiBsb2dpYyB0byBjb21wbGV0ZSAqLworI2lmIE5DUl9USU1FT1VUCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIDIqTkNSX1RJTUVPVVQ7CisKKyAgICAgIHdoaWxlICghKE5DUjUzODBfcmVhZChJTklUSUFUT1JfQ09NTUFORF9SRUcpICYgSUNSX0FSQklUUkFUSU9OX1BST0dSRVNTKQorCSAgICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmICFob3N0ZGF0YS0+Y29ubmVjdGVkKQorCTsKKyAgICAgIGlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKQorICAgICAgeworCXByaW50aygic2NzaSA6IGFyYml0cmF0aW9uIHRpbWVvdXQgYXQgJWRcbiIsIF9fTElORV9fKTsKKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKwlOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJcmV0dXJuIC0xOworICAgICAgfQorICAgIH0KKyNlbHNlIC8qIE5DUl9USU1FT1VUICovCisgICAgd2hpbGUgKCEoTkNSNTM4MF9yZWFkKElOSVRJQVRPUl9DT01NQU5EX1JFRykgJiBJQ1JfQVJCSVRSQVRJT05fUFJPR1JFU1MpCisJICYmICFob3N0ZGF0YS0+Y29ubmVjdGVkKTsKKyNlbmRpZgorCisgICAgQVJCX1BSSU5USygic2NzaSVkOiBhcmJpdHJhdGlvbiBjb21wbGV0ZVxuIiwgSE9TVE5PKTsKKworICAgIGlmIChob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJTkNSNTM4MF93cml0ZShNT0RFX1JFRywgTVJfQkFTRSk7IAorCXJldHVybiAtMTsKKyAgICB9CisgICAgLyogCisgICAgICogVGhlIGFyYml0cmF0aW9uIGRlbGF5IGlzIDIuMnVzLCBidXQgdGhpcyBpcyBhIG1pbmltdW0gYW5kIHRoZXJlIGlzIAorICAgICAqIG5vIG1heGltdW0gc28gd2UgY2FuIHNhZmVseSBzbGVlcCBmb3IgY2VpbCgyLjIpIHVzZWNzIHRvIGFjY29tbW9kYXRlCisgICAgICogdGhlIGludGVncmFsIG5hdHVyZSBvZiB1ZGVsYXkoKS4KKyAgICAgKgorICAgICAqLworCisgICAgdWRlbGF5KDMpOworCisgICAgLyogQ2hlY2sgZm9yIGxvc3QgYXJiaXRyYXRpb24gKi8KKyAgICBpZiAoKE5DUjUzODBfcmVhZChJTklUSUFUT1JfQ09NTUFORF9SRUcpICYgSUNSX0FSQklUUkFUSU9OX0xPU1QpIHx8CisJKE5DUjUzODBfcmVhZChDVVJSRU5UX1NDU0lfREFUQV9SRUcpICYgaG9zdGRhdGEtPmlkX2hpZ2hlcl9tYXNrKSB8fAorCShOQ1I1MzgwX3JlYWQoSU5JVElBVE9SX0NPTU1BTkRfUkVHKSAmIElDUl9BUkJJVFJBVElPTl9MT1NUKSB8fAorCWhvc3RkYXRhLT5jb25uZWN0ZWQpIHsKKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsgCisJQVJCX1BSSU5USygic2NzaSVkOiBsb3N0IGFyYml0cmF0aW9uLCBkZWFzc2VydGluZyBNUl9BUkJJVFJBVEVcbiIsCisJCSAgIEhPU1ROTyk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgICAvKiBhZnRlci9kdXJpbmcgYXJiaXRyYXRpb24sIEJTWSBzaG91bGQgYmUgYXNzZXJ0ZWQuCisJSUJNIERQRVMtMzEwODAgVmVyc2lvbiBTMzFRIHdvcmtzIG5vdyAqLworICAgICAvKiBUbnggdG8gVGhvbWFzX1JvZXNjaEBtMi5tYXVzLmRlIGZvciBmaW5kaW5nIHRoaXMhIChSb21hbikgKi8KKyAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX1NFTCB8CisJCQkJCSBJQ1JfQVNTRVJUX0JTWSApIDsKKyAgICAKKyAgICBpZiAoKE5DUjUzODBfcmVhZChJTklUSUFUT1JfQ09NTUFORF9SRUcpICYgSUNSX0FSQklUUkFUSU9OX0xPU1QpIHx8CisJaG9zdGRhdGEtPmNvbm5lY3RlZCkgeworCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJQVJCX1BSSU5USygic2NzaSVkOiBsb3N0IGFyYml0cmF0aW9uLCBkZWFzc2VydGluZyBJQ1JfQVNTRVJUX1NFTFxuIiwKKwkJICAgSE9TVE5PKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogCisgICAgICogQWdhaW4sIGJ1cyBjbGVhciArIGJ1cyBzZXR0bGUgdGltZSBpcyAxLjJ1cywgaG93ZXZlciwgdGhpcyBpcyAKKyAgICAgKiBhIG1pbmltdW0gc28gd2UnbGwgdWRlbGF5IGNlaWwoMS4yKQorICAgICAqLworCisjaWZkZWYgQ09ORklHX0FUQVJJX1NDU0lfVE9TSElCQV9ERUxBWQorICAgIC8qICsrcm9tYW46IEJ1dCBzb21lIHRhcmdldHMgKHNlZSBhYm92ZSA6LSkgc2VlbSB0byBuZWVkIGEgYml0IG1vcmUuLi4gKi8KKyAgICB1ZGVsYXkoMTUpOworI2Vsc2UKKyAgICB1ZGVsYXkoMik7CisjZW5kaWYKKyAgICAKKyAgICBpZiAoaG9zdGRhdGEtPmNvbm5lY3RlZCkgeworCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIEFSQl9QUklOVEsoInNjc2klZDogd29uIGFyYml0cmF0aW9uXG4iLCBIT1NUTk8pOworCisgICAgLyogCisgICAgICogTm93IHRoYXQgd2UgaGF2ZSB3b24gYXJiaXRyYXRpb24sIHN0YXJ0IFNlbGVjdGlvbiBwcm9jZXNzLCBhc3NlcnRpbmcgCisgICAgICogdGhlIGhvc3QgYW5kIHRhcmdldCBJRCdzIG9uIHRoZSBTQ1NJIGJ1cy4KKyAgICAgKi8KKworICAgIE5DUjUzODBfd3JpdGUoT1VUUFVUX0RBVEFfUkVHLCAoaG9zdGRhdGEtPmlkX21hc2sgfCAoMSA8PCBjbWQtPmRldmljZS0+aWQpKSk7CisKKyAgICAvKiAKKyAgICAgKiBSYWlzZSBBVE4gd2hpbGUgU0VMIGlzIHRydWUgYmVmb3JlIEJTWSBnb2VzIGZhbHNlIGZyb20gYXJiaXRyYXRpb24sCisgICAgICogc2luY2UgdGhpcyBpcyB0aGUgb25seSB3YXkgdG8gZ3VhcmFudGVlIHRoYXQgd2UnbGwgZ2V0IGEgTUVTU0FHRSBPVVQKKyAgICAgKiBwaGFzZSBpbW1lZGlhdGVseSBhZnRlciBzZWxlY3Rpb24uCisgICAgICovCisKKyAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgKElDUl9CQVNFIHwgSUNSX0FTU0VSVF9CU1kgfCAKKwlJQ1JfQVNTRVJUX0RBVEEgfCBJQ1JfQVNTRVJUX0FUTiB8IElDUl9BU1NFUlRfU0VMICkpOworICAgIE5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworCisgICAgLyogCisgICAgICogUmVzZWxlY3QgaW50ZXJydXB0cyBtdXN0IGJlIHR1cm5lZCBvZmYgcHJpb3IgdG8gdGhlIGRyb3BwaW5nIG9mIEJTWSwKKyAgICAgKiBvdGhlcndpc2Ugd2Ugd2lsbCB0cmlnZ2VyIGFuIGludGVycnVwdC4KKyAgICAgKi8KKworICAgIGlmIChob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgMCk7CisKKyAgICAvKgorICAgICAqIFRoZSBpbml0aWF0b3Igc2hhbGwgdGhlbiB3YWl0IGF0IGxlYXN0IHR3byBkZXNrZXcgZGVsYXlzIGFuZCByZWxlYXNlIAorICAgICAqIHRoZSBCU1kgc2lnbmFsLgorICAgICAqLworICAgIHVkZWxheSgxKTsgICAgICAgIC8qIHdpbmdlbCAtLSB3YWl0IHR3byBidXMgZGVza2V3IGRlbGF5ID4yKjQ1bnMgKi8KKworICAgIC8qIFJlc2V0IEJTWSAqLworICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCAoSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0RBVEEgfCAKKwlJQ1JfQVNTRVJUX0FUTiB8IElDUl9BU1NFUlRfU0VMKSk7CisKKyAgICAvKiAKKyAgICAgKiBTb21ldGhpbmcgd2VpcmQgaGFwcGVucyB3aGVuIHdlIGNlYXNlIHRvIGRyaXZlIEJTWSAtIGxvb2tzCisgICAgICogbGlrZSB0aGUgYm9hcmQvY2hpcCBpcyBsZXR0aW5nIHVzIGRvIGFub3RoZXIgcmVhZCBiZWZvcmUgdGhlIAorICAgICAqIGFwcHJvcHJpYXRlIHByb3BhZ2F0aW9uIGRlbGF5IGhhcyBleHBpcmVkLCBhbmQgd2UncmUgY29uZnVzaW5nCisgICAgICogYSBCU1kgc2lnbmFsIGZyb20gb3Vyc2VsdmVzIGFzIHRoZSB0YXJnZXQncyByZXNwb25zZSB0byBTRUxFQ1RJT04uCisgICAgICoKKyAgICAgKiBBIHNtYWxsIGRlbGF5ICh0aGUgJ0MrKycgZnJvbnRlbmQgYnJlYWtzIHRoZSBwaXBlbGluZSB3aXRoIGFuCisgICAgICogdW5uZWNlc3NhcnkganVtcCwgbWFraW5nIGl0IHdvcmsgb24gbXkgMzg2LTMzL1RyYW50b3IgVDEyOCwgdGhlCisgICAgICogdGlnaHRlciAnQycgY29kZSBicmVha3MgYW5kIHJlcXVpcmVzIHRoaXMpIHNvbHZlcyB0aGUgcHJvYmxlbSAtIAorICAgICAqIHRoZSAxIHVzIGRlbGF5IGlzIGFyYml0cmFyeSwgYW5kIG9ubHkgdXNlZCBiZWNhdXNlIHRoaXMgZGVsYXkgd2lsbCAKKyAgICAgKiBiZSB0aGUgc2FtZSBvbiBvdGhlciBwbGF0Zm9ybXMgYW5kIHNpbmNlIGl0IHdvcmtzIGhlcmUsIGl0IHNob3VsZCAKKyAgICAgKiB3b3JrIHRoZXJlLgorICAgICAqCisgICAgICogd2luZ2VsIHN1Z2dlc3RzIHRoYXQgdGhpcyBjb3VsZCBiZSBkdWUgdG8gZmFpbGluZyB0byB3YWl0CisgICAgICogb25lIGRlc2tldyBkZWxheS4KKyAgICAgKi8KKworICAgIHVkZWxheSgxKTsKKworICAgIFNFTF9QUklOVEsoInNjc2klZDogc2VsZWN0aW5nIHRhcmdldCAlZFxuIiwgSE9TVE5PLCBjbWQtPmRldmljZS0+aWQpOworCisgICAgLyogCisgICAgICogVGhlIFNDU0kgc3BlY2lmaWNhdGlvbiBjYWxscyBmb3IgYSAyNTAgbXMgdGltZW91dCBmb3IgdGhlIGFjdHVhbCAKKyAgICAgKiBzZWxlY3Rpb24uCisgICAgICovCisKKyAgICB0aW1lb3V0ID0gamlmZmllcyArIDI1OyAKKworICAgIC8qIAorICAgICAqIFhYWCB2ZXJ5IGludGVyZXN0aW5nIC0gd2UncmUgc2VlaW5nIGEgYm91bmNlIHdoZXJlIHRoZSBCU1kgd2UgCisgICAgICogYXNzZXJ0ZWQgaXMgYmVpbmcgcmVmbGVjdGVkIC8gc3RpbGwgYXNzZXJ0ZWQgKHByb3BhZ2F0aW9uIGRlbGF5PykKKyAgICAgKiBhbmQgaXQncyBkZXRlY3RpbmcgYXMgdHJ1ZS4gIFNpZ2guCisgICAgICovCisKKyNpZiAwCisgICAgLyogKytyb21hbjogSWYgYSB0YXJnZXQgY29uZm9ybWVkIHRvIHRoZSBTQ1NJIHN0YW5kYXJkLCBpdCB3b3VsZG4ndCBhc3NlcnQKKyAgICAgKiBJTyB3aGlsZSBTRUwgaXMgdHJ1ZS4gQnV0IGFnYWluLCB0aGVyZSBhcmUgc29tZSBkaXNrcyBvdXQgdGhlIGluIHRoZQorICAgICAqIHdvcmxkIHRoYXQgZG8gdGhhdCBuZXZlcnRoZWxlc3MuIChTb21lYm9keSBjbGFpbWVkIHRoYXQgdGhpcyBhbm5vdW5jZXMKKyAgICAgKiByZXNlbGVjdGlvbiBjYXBhYmlsaXR5IG9mIHRoZSB0YXJnZXQuKSBTbyB3ZSBiZXR0ZXIgc2tpcCB0aGF0IHRlc3QgYW5kCisgICAgICogb25seSB3YWl0IGZvciBCU1kuLi4gKEZhbW91cyBnZXJtYW4gd29yZHM6IERlciBLbPxnZXJlIGdpYnQgbmFjaCA6LSkKKyAgICAgKi8KKworICAgIHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSAmJiAhKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIAorCShTUl9CU1kgfCBTUl9JTykpKTsKKworICAgIGlmICgoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgKFNSX1NFTCB8IFNSX0lPKSkgPT0gCisJICAgIChTUl9TRUwgfCBTUl9JTykpIHsKKwkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkgICAgTkNSNTM4MF9yZXNlbGVjdChpbnN0YW5jZSk7CisJICAgIHByaW50ayAoS0VSTl9FUlIgInNjc2klZDogcmVzZWxlY3Rpb24gYWZ0ZXIgd29uIGFyYml0cmF0aW9uP1xuIiwKKwkJICAgIEhPU1ROTyk7CisJICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkgICAgcmV0dXJuIC0xOworICAgIH0KKyNlbHNlCisgICAgd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmICEoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfQlNZKSk7CisjZW5kaWYKKworICAgIC8qIAorICAgICAqIE5vIGxlc3MgdGhhbiB0d28gZGVza2V3IGRlbGF5cyBhZnRlciB0aGUgaW5pdGlhdG9yIGRldGVjdHMgdGhlIAorICAgICAqIEJTWSBzaWduYWwgaXMgdHJ1ZSwgaXQgc2hhbGwgcmVsZWFzZSB0aGUgU0VMIHNpZ25hbCBhbmQgbWF5IAorICAgICAqIGNoYW5nZSB0aGUgREFUQSBCVVMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13aW5nZWwKKyAgICAgKi8KKworICAgIHVkZWxheSgxKTsKKworICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQVROKTsKKworICAgIGlmICghKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIFNSX0JTWSkpIHsKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCWlmIChob3N0ZGF0YS0+dGFyZ2V0c19wcmVzZW50ICYgKDEgPDwgY21kLT5kZXZpY2UtPmlkKSkgeworCSAgICBwcmludGsoS0VSTl9FUlIgInNjc2klZDogd2VpcmRuZXNzXG4iLCBIT1NUTk8pOworCSAgICBpZiAoaG9zdGRhdGEtPnJlc3RhcnRfc2VsZWN0KQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIlx0cmVzdGFydCBzZWxlY3RcbiIpOworCSAgICBOQ1JfUFJJTlQoTkRFQlVHX0FOWSk7CisJICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKwljbWQtPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2OworI2lmZGVmIE5DUjUzODBfU1RBVFMKKwljb2xsZWN0X3N0YXRzKGhvc3RkYXRhLCBjbWQpOworI2VuZGlmCisjaWZkZWYgU1VQUE9SVF9UQUdTCisJY21kX2ZyZWVfdGFnKCBjbWQgKTsKKyNlbmRpZgorCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCVNFTF9QUklOVEsoInNjc2klZDogdGFyZ2V0IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gMjUwbXNcbiIsIEhPU1ROTyk7CisJTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCXJldHVybiAwOworICAgIH0gCisKKyAgICBob3N0ZGF0YS0+dGFyZ2V0c19wcmVzZW50IHw9ICgxIDw8IGNtZC0+ZGV2aWNlLT5pZCk7CisKKyAgICAvKgorICAgICAqIFNpbmNlIHdlIGZvbGxvd2VkIHRoZSBTQ1NJIHNwZWMsIGFuZCByYWlzZWQgQVROIHdoaWxlIFNFTCAKKyAgICAgKiB3YXMgdHJ1ZSBidXQgYmVmb3JlIEJTWSB3YXMgZmFsc2UgZHVyaW5nIHNlbGVjdGlvbiwgdGhlIGluZm9ybWF0aW9uCisgICAgICogdHJhbnNmZXIgcGhhc2Ugc2hvdWxkIGJlIGEgTUVTU0FHRSBPVVQgcGhhc2Ugc28gdGhhdCB3ZSBjYW4gc2VuZCB0aGUKKyAgICAgKiBJREVOVElGWSBtZXNzYWdlLgorICAgICAqIAorICAgICAqIElmIFNDU0ktSUkgdGFnZ2VkIHF1ZXVpbmcgaXMgZW5hYmxlZCwgd2UgYWxzbyBzZW5kIGEgU0lNUExFX1FVRVVFX1RBRworICAgICAqIG1lc3NhZ2UgKDIgYnl0ZXMpIHdpdGggYSB0YWcgSUQgdGhhdCB3ZSBpbmNyZW1lbnQgd2l0aCBldmVyeSBjb21tYW5kCisgICAgICogdW50aWwgaXQgd3JhcHMgYmFjayB0byAwLgorICAgICAqCisgICAgICogWFhYIC0gaXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgYXJlIHNvbWUgYnJva2VuIFNDU0ktSUkgZGV2aWNlcywKKyAgICAgKgkgICAgIHdoaWNoIGNsYWltIHRvIHN1cHBvcnQgdGFnZ2VkIHF1ZXVpbmcgYnV0IGZhaWwgd2hlbiBtb3JlIHRoYW4KKyAgICAgKgkgICAgIHNvbWUgbnVtYmVyIG9mIGNvbW1hbmRzIGFyZSBpc3N1ZWQgYXQgb25jZS4KKyAgICAgKi8KKworICAgIC8qIFdhaXQgZm9yIHN0YXJ0IG9mIFJFUS9BQ0sgaGFuZHNoYWtlICovCisgICAgd2hpbGUgKCEoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfUkVRKSk7CisKKyAgICBTRUxfUFJJTlRLKCJzY3NpJWQ6IHRhcmdldCAlZCBzZWxlY3RlZCwgZ29pbmcgaW50byBNRVNTQUdFIE9VVCBwaGFzZS5cbiIsCisJICAgICAgIEhPU1ROTywgY21kLT5kZXZpY2UtPmlkKTsKKyAgICB0bXBbMF0gPSBJREVOVElGWSgxLCBjbWQtPmRldmljZS0+bHVuKTsKKworI2lmZGVmIFNVUFBPUlRfVEFHUworICAgIGlmIChjbWQtPnRhZyAhPSBUQUdfTk9ORSkgeworCXRtcFsxXSA9IGhvc3RkYXRhLT5sYXN0X21lc3NhZ2UgPSBTSU1QTEVfUVVFVUVfVEFHOworCXRtcFsyXSA9IGNtZC0+dGFnOworCWxlbiA9IDM7CisgICAgfSBlbHNlIAorCWxlbiA9IDE7CisjZWxzZQorICAgIGxlbiA9IDE7CisgICAgY21kLT50YWc9MDsKKyNlbmRpZiAvKiBTVVBQT1JUX1RBR1MgKi8KKworICAgIC8qIFNlbmQgbWVzc2FnZShzKSAqLworICAgIGRhdGEgPSB0bXA7CisgICAgcGhhc2UgPSBQSEFTRV9NU0dPVVQ7CisgICAgTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgJmxlbiwgJmRhdGEpOworICAgIFNFTF9QUklOVEsoInNjc2klZDogbmV4dXMgZXN0YWJsaXNoZWQuXG4iLCBIT1NUTk8pOworICAgIC8qIFhYWCBuZWVkIHRvIGhhbmRsZSBlcnJvcnMgaGVyZSAqLworICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBjbWQ7CisjaWZuZGVmIFNVUFBPUlRfVEFHUworICAgIGhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gfD0gKDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisjZW5kaWYgICAgCisjaWZkZWYgU1VOM19TQ1NJX1ZNRQorICAgIGRyZWdzLT5jc3IgfD0gQ1NSX0lOVFI7CisjZW5kaWYKKyAgICBpbml0aWFsaXplX1NDcChjbWQpOworCisKKyAgICByZXR1cm4gMDsKK30KKworLyogCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX3RyYW5zZmVyX3BpbyAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIAorICogICAgICB1bnNpZ25lZCBjaGFyICpwaGFzZSwgaW50ICpjb3VudCwgdW5zaWduZWQgY2hhciAqKmRhdGEpCisgKgorICogUHVycG9zZSA6IHRyYW5zZmVycyBkYXRhIGluIGdpdmVuIHBoYXNlIHVzaW5nIHBvbGxlZCBJL08KKyAqCisgKiBJbnB1dHMgOiBpbnN0YW5jZSAtIGluc3RhbmNlIG9mIGRyaXZlciwgKnBoYXNlIC0gcG9pbnRlciB0byAKKyAqCXdoYXQgcGhhc2UgaXMgZXhwZWN0ZWQsICpjb3VudCAtIHBvaW50ZXIgdG8gbnVtYmVyIG9mIAorICoJYnl0ZXMgdG8gdHJhbnNmZXIsICoqZGF0YSAtIHBvaW50ZXIgdG8gZGF0YSBwb2ludGVyLgorICogCisgKiBSZXR1cm5zIDogLTEgd2hlbiBkaWZmZXJlbnQgcGhhc2UgaXMgZW50ZXJlZCB3aXRob3V0IHRyYW5zZmVycmluZworICoJbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMsIDAgaWYgYWxsIGJ5dGVzIGFyZSB0cmFuc2ZlcmVkIG9yIGV4aXQKKyAqCWlzIGluIHNhbWUgcGhhc2UuCisgKgorICogCUFsc28sICpwaGFzZSwgKmNvdW50LCAqZGF0YSBhcmUgbW9kaWZpZWQgaW4gcGxhY2UuCisgKgorICogWFhYIE5vdGUgOiBoYW5kbGluZyBmb3IgYnVzIGZyZWUgbWF5IGJlIHVzZWZ1bC4KKyAqLworCisvKgorICogTm90ZSA6IHRoaXMgY29kZSBpcyBub3QgYXMgcXVpY2sgYXMgaXQgY291bGQgYmUsIGhvd2V2ZXIgaXQgCisgKiBJUyAxMDAlIHJlbGlhYmxlLCBhbmQgZm9yIHRoZSBhY3R1YWwgZGF0YSB0cmFuc2ZlciB3aGVyZSBzcGVlZAorICogY291bnRzLCB3ZSB3aWxsIGFsd2F5cyBkbyBhIHBzZXVkbyBETUEgb3IgRE1BIHRyYW5zZmVyLgorICovCisKK3N0YXRpYyBpbnQgTkNSNTM4MF90cmFuc2Zlcl9waW8oIHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCAKKwkJCQkgdW5zaWduZWQgY2hhciAqcGhhc2UsIGludCAqY291bnQsCisJCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhKQoreworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgcCA9ICpwaGFzZSwgdG1wOworICAgIHJlZ2lzdGVyIGludCBjID0gKmNvdW50OworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmQgPSAqZGF0YTsKKworICAgIC8qIAorICAgICAqIFRoZSBOQ1I1MzgwIGNoaXAgd2lsbCBvbmx5IGRyaXZlIHRoZSBTQ1NJIGJ1cyB3aGVuIHRoZSAKKyAgICAgKiBwaGFzZSBzcGVjaWZpZWQgaW4gdGhlIGFwcHJvcHJpYXRlIGJpdHMgb2YgdGhlIFRBUkdFVCBDT01NQU5ECisgICAgICogUkVHSVNURVIgbWF0Y2ggdGhlIFNUQVRVUyBSRUdJU1RFUgorICAgICAqLworCisgICAgTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIFBIQVNFX1NSX1RPX1RDUihwKSk7CisKKyAgICBkbyB7CisJLyogCisJICogV2FpdCBmb3IgYXNzZXJ0aW9uIG9mIFJFUSwgYWZ0ZXIgd2hpY2ggdGhlIHBoYXNlIGJpdHMgd2lsbCBiZSAKKwkgKiB2YWxpZCAKKwkgKi8KKwl3aGlsZSAoISgodG1wID0gTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpKSAmIFNSX1JFUSkpOworCisJSFNIX1BSSU5USygic2NzaSVkOiBSRVEgZGV0ZWN0ZWRcbiIsIEhPU1ROTyk7CisKKwkvKiBDaGVjayBmb3IgcGhhc2UgbWlzbWF0Y2ggKi8JCisJaWYgKCh0bXAgJiBQSEFTRV9NQVNLKSAhPSBwKSB7CisJICAgIFBJT19QUklOVEsoInNjc2klZDogcGhhc2UgbWlzbWF0Y2hcbiIsIEhPU1ROTyk7CisJICAgIE5DUl9QUklOVF9QSEFTRShOREVCVUdfUElPKTsKKwkgICAgYnJlYWs7CisJfQorCisJLyogRG8gYWN0dWFsIHRyYW5zZmVyIGZyb20gU0NTSSBidXMgdG8gLyBmcm9tIG1lbW9yeSAqLworCWlmICghKHAgJiBTUl9JTykpIAorCSAgICBOQ1I1MzgwX3dyaXRlKE9VVFBVVF9EQVRBX1JFRywgKmQpOworCWVsc2UgCisJICAgICpkID0gTkNSNTM4MF9yZWFkKENVUlJFTlRfU0NTSV9EQVRBX1JFRyk7CisKKwkrK2Q7CisKKwkvKiAKKwkgKiBUaGUgU0NTSSBzdGFuZGFyZCBzdWdnZXN0cyB0aGF0IGluIE1TR09VVCBwaGFzZSwgdGhlIGluaXRpYXRvcgorCSAqIHNob3VsZCBkcm9wIEFUTiBvbiB0aGUgbGFzdCBieXRlIG9mIHRoZSBtZXNzYWdlIHBoYXNlCisJICogYWZ0ZXIgUkVRIGhhcyBiZWVuIGFzc2VydGVkIGZvciB0aGUgaGFuZHNoYWtlIGJ1dCBiZWZvcmUKKwkgKiB0aGUgaW5pdGlhdG9yIHJhaXNlcyBBQ0suCisJICovCisKKwlpZiAoIShwICYgU1JfSU8pKSB7CisJICAgIGlmICghKChwICYgU1JfTVNHKSAmJiBjID4gMSkpIHsKKwkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgCisJCSAgICBJQ1JfQVNTRVJUX0RBVEEpOworCQlOQ1JfUFJJTlQoTkRFQlVHX1BJTyk7CisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IAorCQkJSUNSX0FTU0VSVF9EQVRBIHwgSUNSX0FTU0VSVF9BQ0spOworCSAgICB9IGVsc2UgeworCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfAorCQkgICAgSUNSX0FTU0VSVF9EQVRBIHwgSUNSX0FTU0VSVF9BVE4pOworCQlOQ1JfUFJJTlQoTkRFQlVHX1BJTyk7CisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IAorCQkgICAgSUNSX0FTU0VSVF9EQVRBIHwgSUNSX0FTU0VSVF9BVE4gfCBJQ1JfQVNTRVJUX0FDSyk7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBOQ1JfUFJJTlQoTkRFQlVHX1BJTyk7CisJICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQUNLKTsKKwl9CisKKwl3aGlsZSAoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfUkVRKTsKKworCUhTSF9QUklOVEsoInNjc2klZDogcmVxIGZhbHNlLCBoYW5kc2hha2UgY29tcGxldGVcbiIsIEhPU1ROTyk7CisKKy8qCisgKiBXZSBoYXZlIHNldmVyYWwgc3BlY2lhbCBjYXNlcyB0byBjb25zaWRlciBkdXJpbmcgUkVRL0FDSyBoYW5kc2hha2luZyA6IAorICogMS4gIFdlIHdlcmUgaW4gTVNHT1VUIHBoYXNlLCBhbmQgd2UgYXJlIG9uIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIAorICoJbWVzc2FnZS4gIEFUTiBtdXN0IGJlIGRyb3BwZWQgYXMgQUNLIGlzIGRyb3BwZWQuCisgKgorICogMi4gIFdlIGFyZSBpbiBhIE1TR0lOIHBoYXNlLCBhbmQgd2UgYXJlIG9uIHRoZSBsYXN0IGJ5dGUgb2YgdGhlICAKKyAqCW1lc3NhZ2UuICBXZSBtdXN0IGV4aXQgd2l0aCBBQ0sgYXNzZXJ0ZWQsIHNvIHRoYXQgdGhlIGNhbGxpbmcKKyAqCWNvZGUgbWF5IHJhaXNlIEFUTiBiZWZvcmUgZHJvcHBpbmcgQUNLIHRvIHJlamVjdCB0aGUgbWVzc2FnZS4KKyAqCisgKiAzLiAgQUNLIGFuZCBBVE4gYXJlIGNsZWFyIGFuZCB0aGUgdGFyZ2V0IG1heSBwcm9jZWVkIGFzIG5vcm1hbC4KKyAqLworCWlmICghKHAgPT0gUEhBU0VfTVNHSU4gJiYgYyA9PSAxKSkgeyAgCisJICAgIGlmIChwID09IFBIQVNFX01TR09VVCAmJiBjID4gMSkKKwkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9BVE4pOworCSAgICBlbHNlCisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJfSAKKyAgICB9IHdoaWxlICgtLWMpOworCisgICAgUElPX1BSSU5USygic2NzaSVkOiByZXNpZHVhbCAlZFxuIiwgSE9TVE5PLCBjKTsKKworICAgICpjb3VudCA9IGM7CisgICAgKmRhdGEgPSBkOworICAgIHRtcCA9IE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKTsKKyAgICAvKiBUaGUgcGhhc2UgcmVhZCBmcm9tIHRoZSBidXMgaXMgdmFsaWQgaWYgZWl0aGVyIFJFUSBpcyAoYWxyZWFkeSkKKyAgICAgKiBhc3NlcnRlZCBvciBpZiBBQ0sgaGFzbid0IGJlZW4gcmVsZWFzZWQgeWV0LiBUaGUgbGF0dGVyIGlzIHRoZSBjYXNlIGlmCisgICAgICogd2UncmUgaW4gTVNHSU4gYW5kIGFsbCB3YW50ZWQgYnl0ZXMgaGF2ZSBiZWVuIHJlY2VpdmVkLiAqLworICAgIGlmICgodG1wICYgU1JfUkVRKSB8fCAocCA9PSBQSEFTRV9NU0dJTiAmJiBjID09IDApKQorCSpwaGFzZSA9IHRtcCAmIFBIQVNFX01BU0s7CisgICAgZWxzZSAKKwkqcGhhc2UgPSBQSEFTRV9VTktOT1dOOworCisgICAgaWYgKCFjIHx8ICgqcGhhc2UgPT0gcCkpCisJcmV0dXJuIDA7CisgICAgZWxzZSAKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IGRvX2Fib3J0IChTY3NpX0hvc3QgKmhvc3QpCisgKiAKKyAqIFB1cnBvc2UgOiBhYm9ydCB0aGUgY3VycmVudGx5IGVzdGFibGlzaGVkIG5leHVzLiAgU2hvdWxkIG9ubHkgYmUgCisgKiAJY2FsbGVkIGZyb20gYSByb3V0aW5lIHdoaWNoIGNhbiBkcm9wIGludG8gYSAKKyAqIAorICogUmV0dXJucyA6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IGRvX2Fib3J0IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KSAKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHRtcCwgKm1zZ3B0ciwgcGhhc2U7CisgICAgaW50IGxlbjsKKworICAgIC8qIFJlcXVlc3QgbWVzc2FnZSBvdXQgcGhhc2UgKi8KKyAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0FUTik7CisKKyAgICAvKiAKKyAgICAgKiBXYWl0IGZvciB0aGUgdGFyZ2V0IHRvIGluZGljYXRlIGEgdmFsaWQgcGhhc2UgYnkgYXNzZXJ0aW5nIAorICAgICAqIFJFUS4gIE9uY2UgdGhpcyBoYXBwZW5zLCB3ZSdsbCBoYXZlIGVpdGhlciBhIE1TR09VVCBwaGFzZSAKKyAgICAgKiBhbmQgY2FuIGltbWVkaWF0ZWx5IHNlbmQgdGhlIEFCT1JUIG1lc3NhZ2UsIG9yIHdlJ2xsIGhhdmUgc29tZSAKKyAgICAgKiBvdGhlciBwaGFzZSBhbmQgd2lsbCBoYXZlIHRvIHNvdXJjZS9zaW5rIGRhdGEuCisgICAgICogCisgICAgICogV2UgcmVhbGx5IGRvbid0IGNhcmUgd2hhdCB2YWx1ZSB3YXMgb24gdGhlIGJ1cyBvciB3aGF0IHZhbHVlCisgICAgICogdGhlIHRhcmdldCBzZWVzLCBzbyB3ZSBqdXN0IGhhbmRzaGFrZS4KKyAgICAgKi8KKyAgICAKKyAgICB3aGlsZSAoISh0bXAgPSBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykpICYgU1JfUkVRKTsKKworICAgIE5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCBQSEFTRV9TUl9UT19UQ1IodG1wKSk7CisKKyAgICBpZiAoKHRtcCAmIFBIQVNFX01BU0spICE9IFBIQVNFX01TR09VVCkgeworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQVROIHwgCisJCSAgICAgIElDUl9BU1NFUlRfQUNLKTsKKwl3aGlsZSAoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfUkVRKTsKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0FUTik7CisgICAgfQorICAgCisgICAgdG1wID0gQUJPUlQ7CisgICAgbXNncHRyID0gJnRtcDsKKyAgICBsZW4gPSAxOworICAgIHBoYXNlID0gUEhBU0VfTVNHT1VUOworICAgIE5DUjUzODBfdHJhbnNmZXJfcGlvIChob3N0LCAmcGhhc2UsICZsZW4sICZtc2dwdHIpOworCisgICAgLyoKKyAgICAgKiBJZiB3ZSBnb3QgaGVyZSwgYW5kIHRoZSBjb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksCisgICAgICogd2UncmUgYWJvdXQgdG8gZ28gaW50byBidXMgZnJlZSBzdGF0ZS4KKyAgICAgKi8KKworICAgIHJldHVybiBsZW4gPyAtMSA6IDA7Cit9CisKKyNpZiBkZWZpbmVkKFJFQUxfRE1BKQorLyogCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX3RyYW5zZmVyX2RtYSAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIAorICogICAgICB1bnNpZ25lZCBjaGFyICpwaGFzZSwgaW50ICpjb3VudCwgdW5zaWduZWQgY2hhciAqKmRhdGEpCisgKgorICogUHVycG9zZSA6IHRyYW5zZmVycyBkYXRhIGluIGdpdmVuIHBoYXNlIHVzaW5nIGVpdGhlciByZWFsCisgKglvciBwc2V1ZG8gRE1BLgorICoKKyAqIElucHV0cyA6IGluc3RhbmNlIC0gaW5zdGFuY2Ugb2YgZHJpdmVyLCAqcGhhc2UgLSBwb2ludGVyIHRvIAorICoJd2hhdCBwaGFzZSBpcyBleHBlY3RlZCwgKmNvdW50IC0gcG9pbnRlciB0byBudW1iZXIgb2YgCisgKglieXRlcyB0byB0cmFuc2ZlciwgKipkYXRhIC0gcG9pbnRlciB0byBkYXRhIHBvaW50ZXIuCisgKiAKKyAqIFJldHVybnMgOiAtMSB3aGVuIGRpZmZlcmVudCBwaGFzZSBpcyBlbnRlcmVkIHdpdGhvdXQgdHJhbnNmZXJyaW5nCisgKgltYXhpbXVtIG51bWJlciBvZiBieXRlcywgMCBpZiBhbGwgYnl0ZXMgb3IgdHJhbnNmZXJlZCBvciBleGl0CisgKglpcyBpbiBzYW1lIHBoYXNlLgorICoKKyAqIAlBbHNvLCAqcGhhc2UsICpjb3VudCwgKmRhdGEgYXJlIG1vZGlmaWVkIGluIHBsYWNlLgorICoKKyAqLworCisKK3N0YXRpYyBpbnQgTkNSNTM4MF90cmFuc2Zlcl9kbWEoIHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCAKKwkJCQkgdW5zaWduZWQgY2hhciAqcGhhc2UsIGludCAqY291bnQsCisJCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhKQoreworICAgIFNFVFVQX0hPU1REQVRBKGluc3RhbmNlKTsKKyAgICByZWdpc3RlciBpbnQgYyA9ICpjb3VudDsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIHAgPSAqcGhhc2U7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIC8qIHNhbml0eSBjaGVjayAqLworICAgIGlmKCFzdW4zX2RtYV9zZXR1cF9kb25lKSB7CisJIHByaW50aygic2NzaSVkOiB0cmFuc2Zlcl9kbWEgd2l0aG91dCBzZXR1cCFcbiIsIEhPU1ROTyk7CisJIEJVRygpOworICAgIH0KKyAgICBob3N0ZGF0YS0+ZG1hX2xlbiA9IGM7CisKKyAgICBETUFfUFJJTlRLKCJzY3NpJWQ6IGluaXRpYWxpemluZyBETUEgZm9yICVzLCAlZCBieXRlcyAlcyAlcFxuIiwKKwkgICAgICAgSE9TVE5PLCAocCAmIFNSX0lPKSA/ICJyZWFkaW5nIiA6ICJ3cml0aW5nIiwKKwkgICAgICAgYywgKHAgJiBTUl9JTykgPyAidG8iIDogImZyb20iLCAqZGF0YSk7CisKKyAgICAvKiBuZXRic2QgdHVybnMgb2ZmIGludHMgaGVyZSwgd2h5IG5vdCBiZSBzYWZlIGFuZCBkbyBpdCB0b28gKi8KKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgCisgICAgLyogc2VuZCBzdGFydCBjaGFpbiAqLworICAgIHN1bjNzY3NpX2RtYV9zdGFydChjLCAqZGF0YSk7CisgICAgCisgICAgaWYgKHAgJiBTUl9JTykgeworCSAgICBOQ1I1MzgwX3dyaXRlKFRBUkdFVF9DT01NQU5EX1JFRywgMSk7CisJICAgIE5DUjUzODBfcmVhZChSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyk7CisJICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCAwKTsKKwkgICAgTkNSNTM4MF93cml0ZShNT0RFX1JFRywgKE5DUjUzODBfcmVhZChNT0RFX1JFRykgfCBNUl9ETUFfTU9ERSB8IE1SX0VOQUJMRV9FT1BfSU5UUikpOworCSAgICBOQ1I1MzgwX3dyaXRlKFNUQVJUX0RNQV9JTklUSUFUT1JfUkVDRUlWRV9SRUcsIDApOworICAgIH0gZWxzZSB7CisJICAgIE5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCAwKTsKKwkgICAgTkNSNTM4MF9yZWFkKFJFU0VUX1BBUklUWV9JTlRFUlJVUFRfUkVHKTsKKwkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9BU1NFUlRfREFUQSk7CisJICAgIE5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIChOQ1I1MzgwX3JlYWQoTU9ERV9SRUcpIHwgTVJfRE1BX01PREUgfCBNUl9FTkFCTEVfRU9QX0lOVFIpKTsKKwkgICAgTkNSNTM4MF93cml0ZShTVEFSVF9ETUFfU0VORF9SRUcsIDApOworICAgIH0KKworI2lmZGVmIFNVTjNfU0NTSV9WTUUKKyAgICBkcmVncy0+Y3NyIHw9IENTUl9ETUFfRU5BQkxFOworI2VuZGlmCisKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICBzdW4zX2RtYV9hY3RpdmUgPSAxOworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIGRlZmluZWQoUkVBTF9ETUEpICovCisKKy8qCisgKiBGdW5jdGlvbiA6IE5DUjUzODBfaW5mb3JtYXRpb25fdHJhbnNmZXIgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQorICoKKyAqIFB1cnBvc2UgOiBydW4gdGhyb3VnaCB0aGUgdmFyaW91cyBTQ1NJIHBoYXNlcyBhbmQgZG8gYXMgdGhlIHRhcmdldCAKKyAqIAlkaXJlY3RzIHVzIHRvLiAgT3BlcmF0ZXMgb24gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgY29tbWFuZCwgCisgKglpbnN0YW5jZS0+Y29ubmVjdGVkLgorICoKKyAqIElucHV0cyA6IGluc3RhbmNlLCBpbnN0YW5jZSBmb3Igd2hpY2ggd2UgYXJlIGRvaW5nIGNvbW1hbmRzCisgKgorICogU2lkZSBlZmZlY3RzIDogU0NTSSB0aGluZ3MgaGFwcGVuLCB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlIHdpbGwgYmUgCisgKgltb2RpZmllZCBpZiBhIGNvbW1hbmQgZGlzY29ubmVjdHMsICppbnN0YW5jZS0+Y29ubmVjdGVkIHdpbGwKKyAqCWNoYW5nZS4KKyAqCisgKiBYWFggTm90ZSA6IHdlIG5lZWQgdG8gd2F0Y2ggZm9yIGJ1cyBmcmVlIG9yIGEgcmVzZXQgY29uZGl0aW9uIGhlcmUgCisgKiAJdG8gcmVjb3ZlciBmcm9tIGFuIHVuZXhwZWN0ZWQgYnVzIGZyZWUgY29uZGl0aW9uLgorICovCisgCitzdGF0aWMgdm9pZCBOQ1I1MzgwX2luZm9ybWF0aW9uX3RyYW5zZmVyIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKyAgICBTRVRVUF9IT1NUREFUQShpbnN0YW5jZSk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICB1bnNpZ25lZCBjaGFyIG1zZ291dCA9IE5PUDsKKyAgICBpbnQgc2luayA9IDA7CisgICAgaW50IGxlbjsKKyNpZiBkZWZpbmVkKFJFQUxfRE1BKQorICAgIGludCB0cmFuc2ZlcnNpemU7CisjZW5kaWYKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgIHVuc2lnbmVkIGNoYXIgcGhhc2UsIHRtcCwgZXh0ZW5kZWRfbXNnWzEwXSwgb2xkX3BoYXNlPTB4ZmY7CisgICAgU2NzaV9DbW5kICpjbWQgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5jb25uZWN0ZWQ7CisKKyNpZmRlZiBTVU4zX1NDU0lfVk1FCisgICAgZHJlZ3MtPmNzciB8PSBDU1JfSU5UUjsKKyNlbmRpZgorCisgICAgd2hpbGUgKDEpIHsKKwl0bXAgPSBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRyk7CisJLyogV2Ugb25seSBoYXZlIGEgdmFsaWQgU0NTSSBwaGFzZSB3aGVuIFJFUSBpcyBhc3NlcnRlZCAqLworCWlmICh0bXAgJiBTUl9SRVEpIHsKKwkgICAgcGhhc2UgPSAodG1wICYgUEhBU0VfTUFTSyk7IAorIAkgICAgaWYgKHBoYXNlICE9IG9sZF9waGFzZSkgeworCQlvbGRfcGhhc2UgPSBwaGFzZTsKKwkJTkNSX1BSSU5UX1BIQVNFKE5ERUJVR19JTkZPUk1BVElPTik7CisJICAgIH0KKworCSAgICBpZihwaGFzZSA9PSBQSEFTRV9DTURPVVQpIHsKKwkJICAgIHZvaWQgKmQ7CisJCSAgICB1bnNpZ25lZCBsb25nIGNvdW50OworCisJCWlmICghY21kLT5TQ3AudGhpc19yZXNpZHVhbCAmJiBjbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsKSB7CisJCQljb3VudCA9IGNtZC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCQkJZCA9IFNHQUREUihjbWQtPlNDcC5idWZmZXIpOworCQl9IGVsc2UgeworCQkJY291bnQgPSBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsOworCQkJZCA9IGNtZC0+U0NwLnB0cjsKKwkJfQorI2lmZGVmIFJFQUxfRE1BCisJCS8qIHRoaXMgY29tbWFuZCBzZXR1cCBmb3IgZG1hIHlldD8gKi8KKwkJaWYoKGNvdW50ID4gU1VOM19ETUFfTUlOU0laRSkgJiYgKHN1bjNfZG1hX3NldHVwX2RvbmUKKwkJCQkJCSAgIT0gY21kKSkKKwkJeworCQkJaWYoY21kLT5yZXF1ZXN0LT5mbGFncyAmIFJFUV9DTUQpIHsKKwkJCQlzdW4zc2NzaV9kbWFfc2V0dXAoZCwgY291bnQsCisJCQkJCQkgICBycV9kYXRhX2RpcihjbWQtPnJlcXVlc3QpKTsKKwkJCQlzdW4zX2RtYV9zZXR1cF9kb25lID0gY21kOworCQkJfQorCQl9CisjZW5kaWYKKyNpZmRlZiBTVU4zX1NDU0lfVk1FCisJCWRyZWdzLT5jc3IgfD0gQ1NSX0lOVFI7CisjZW5kaWYKKwkgICAgfQorCisJICAgIAorCSAgICBpZiAoc2luayAmJiAocGhhc2UgIT0gUEhBU0VfTVNHT1VUKSkgeworCQlOQ1I1MzgwX3dyaXRlKFRBUkdFVF9DT01NQU5EX1JFRywgUEhBU0VfU1JfVE9fVENSKHRtcCkpOworCisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQVROIHwgCisJCSAgICBJQ1JfQVNTRVJUX0FDSyk7CisJCXdoaWxlIChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9SRVEpOworCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCAKKwkJICAgIElDUl9BU1NFUlRfQVROKTsKKwkJc2luayA9IDA7CisJCWNvbnRpbnVlOworCSAgICB9CisKKwkgICAgc3dpdGNoIChwaGFzZSkgeworCSAgICBjYXNlIFBIQVNFX0RBVEFPVVQ6CisjaWYgKE5ERUJVRyAmIE5ERUJVR19OT19EQVRBT1VUKQorCQlwcmludGsoInNjc2klZDogTkRFQlVHX05PX0RBVEFPVVQgc2V0LCBhdHRlbXB0ZWQgREFUQU9VVCAiCisJCSAgICAgICAiYWJvcnRlZFxuIiwgSE9TVE5PKTsKKwkJc2luayA9IDE7CisJCWRvX2Fib3J0KGluc3RhbmNlKTsKKwkJY21kLT5yZXN1bHQgPSBESURfRVJST1IgIDw8IDE2OworCQljbWQtPmRvbmUoY21kKTsKKwkJcmV0dXJuOworI2VuZGlmCisJICAgIGNhc2UgUEhBU0VfREFUQUlOOgorCQkvKiAKKwkJICogSWYgdGhlcmUgaXMgbm8gcm9vbSBsZWZ0IGluIHRoZSBjdXJyZW50IGJ1ZmZlciBpbiB0aGUKKwkJICogc2NhdHRlci1nYXRoZXIgbGlzdCwgbW92ZSBvbnRvIHRoZSBuZXh0IG9uZS4KKwkJICovCisJCWlmICghY21kLT5TQ3AudGhpc19yZXNpZHVhbCAmJiBjbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsKSB7CisJCSAgICArK2NtZC0+U0NwLmJ1ZmZlcjsKKwkJICAgIC0tY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbDsKKwkJICAgIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBjbWQtPlNDcC5idWZmZXItPmxlbmd0aDsKKwkJICAgIGNtZC0+U0NwLnB0ciA9IFNHQUREUihjbWQtPlNDcC5idWZmZXIpOworCisJCSAgICAvKiArK3JvbWFuOiBUcnkgdG8gbWVyZ2Ugc29tZSBzY2F0dGVyLWJ1ZmZlcnMgaWYKKwkJICAgICAqIHRoZXkgYXJlIGF0IGNvbnRpZ3VvdXMgcGh5c2ljYWwgYWRkcmVzc2VzLgorCQkgICAgICovCisvLwkJICAgIG1lcmdlX2NvbnRpZ3VvdXNfYnVmZmVycyggY21kICk7CisJCSAgICBJTkZfUFJJTlRLKCJzY3NpJWQ6ICVkIGJ5dGVzIGFuZCAlZCBidWZmZXJzIGxlZnRcbiIsCisJCQkgICAgICAgSE9TVE5PLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsLAorCQkJICAgICAgIGNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpOworCQl9CisKKwkJLyoKKwkJICogVGhlIHByZWZlcnJlZCB0cmFuc2ZlciBtZXRob2QgaXMgZ29pbmcgdG8gYmUgCisJCSAqIFBTRVVETy1ETUEgZm9yIHN5c3RlbXMgdGhhdCBhcmUgc3RyaWN0bHkgUElPLAorCQkgKiBzaW5jZSB3ZSBjYW4gbGV0IHRoZSBoYXJkd2FyZSBkbyB0aGUgaGFuZHNoYWtpbmcuCisJCSAqCisJCSAqIEZvciB0aGlzIHRvIHdvcmssIHdlIG5lZWQgdG8ga25vdyB0aGUgdHJhbnNmZXJzaXplCisJCSAqIGFoZWFkIG9mIHRpbWUsIHNpbmNlIHRoZSBwc2V1ZG8tRE1BIGNvZGUgd2lsbCBzaXQKKwkJICogaW4gYW4gdW5jb25kaXRpb25hbCBsb29wLgorCQkgKi8KKworLyogKytyb21hbjogSSBzdWdnZXN0LCB0aGlzIHNob3VsZCBiZQorICogICAjaWYgZGVmKFJFQUxfRE1BKQorICogaW5zdGVhZCBvZiBsZWF2aW5nIFJFQUxfRE1BIG91dC4KKyAqLworCisjaWYgZGVmaW5lZChSRUFMX0RNQSkKKy8vCQlpZiAoIWNtZC0+ZGV2aWNlLT5ib3JrZW4gJiYKKwkJaWYoKHRyYW5zZmVyc2l6ZSA9CisJCSAgICBOQ1I1MzgwX2RtYV94ZmVyX2xlbihpbnN0YW5jZSxjbWQscGhhc2UpKSA+IFNVTjNfRE1BX01JTlNJWkUpIHsKKwkJICAgIGxlbiA9IHRyYW5zZmVyc2l6ZTsKKwkJICAgIGNtZC0+U0NwLnBoYXNlID0gcGhhc2U7CisKKwkJICAgIGlmIChOQ1I1MzgwX3RyYW5zZmVyX2RtYShpbnN0YW5jZSwgJnBoYXNlLAorCQkJJmxlbiwgKHVuc2lnbmVkIGNoYXIgKiopICZjbWQtPlNDcC5wdHIpKSB7CisJCQkvKgorCQkJICogSWYgdGhlIHdhdGNoZG9nIHRpbWVyIGZpcmVzLCBhbGwgZnV0dXJlCisJCQkgKiBhY2Nlc3NlcyB0byB0aGlzIGRldmljZSB3aWxsIHVzZSB0aGUKKwkJCSAqIHBvbGxlZC1JTy4gKi8gCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgInNjc2klZDogc3dpdGNoaW5nIHRhcmdldCAlZCAiCisJCQkgICAgICAgImx1biAlZCB0byBzbG93IGhhbmRzaGFrZVxuIiwgSE9TVE5PLAorCQkJICAgICAgIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisJCQljbWQtPmRldmljZS0+Ym9ya2VuID0gMTsKKwkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IAorCQkJICAgIElDUl9BU1NFUlRfQVROKTsKKwkJCXNpbmsgPSAxOworCQkJZG9fYWJvcnQoaW5zdGFuY2UpOworCQkJY21kLT5yZXN1bHQgPSBESURfRVJST1IgIDw8IDE2OworCQkJY21kLT5kb25lKGNtZCk7CisJCQkvKiBYWFggLSBuZWVkIHRvIHNvdXJjZSBvciBzaW5rIGRhdGEgaGVyZSwgYXMgYXBwcm9wcmlhdGUgKi8KKwkJICAgIH0gZWxzZSB7CisjaWZkZWYgUkVBTF9ETUEKKwkJCS8qICsrcm9tYW46IFdoZW4gdXNpbmcgcmVhbCBETUEsCisJCQkgKiBpbmZvcm1hdGlvbl90cmFuc2ZlcigpIHNob3VsZCByZXR1cm4gYWZ0ZXIKKwkJCSAqIHN0YXJ0aW5nIERNQSBzaW5jZSBpdCBoYXMgbm90aGluZyBtb3JlIHRvCisJCQkgKiBkby4KKwkJCSAqLworCQkJCSAgICByZXR1cm47CisjZWxzZQkJCQorCQkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCAtPSB0cmFuc2ZlcnNpemUgLSBsZW47CisjZW5kaWYKKwkJICAgIH0KKwkJfSBlbHNlIAorI2VuZGlmIC8qIGRlZmluZWQoUkVBTF9ETUEpICovCisJCSAgTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgCisJCSAgICAoaW50ICopICZjbWQtPlNDcC50aGlzX3Jlc2lkdWFsLCAodW5zaWduZWQgY2hhciAqKikKKwkJICAgICZjbWQtPlNDcC5wdHIpOworI2lmZGVmIFJFQUxfRE1BCisJCS8qIGlmIHdlIGhhZCBpbnRlbmRlZCB0byBkbWEgdGhhdCBjb21tYW5kIGNsZWFyIGl0ICovCisJCWlmKHN1bjNfZG1hX3NldHVwX2RvbmUgPT0gY21kKQorCQkJc3VuM19kbWFfc2V0dXBfZG9uZSA9IE5VTEw7CisjZW5kaWYKKworCQlicmVhazsKKwkgICAgY2FzZSBQSEFTRV9NU0dJTjoKKwkJbGVuID0gMTsKKwkJZGF0YSA9ICZ0bXA7CisJCU5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIDApOyAJLyogZGlzYWJsZSByZXNlbGVjdHMgKi8KKwkJTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgJmxlbiwgJmRhdGEpOworCQljbWQtPlNDcC5NZXNzYWdlID0gdG1wOworCQkKKwkJc3dpdGNoICh0bXApIHsKKwkJLyoKKwkJICogTGlua2luZyBsZXRzIHVzIHJlZHVjZSB0aGUgdGltZSByZXF1aXJlZCB0byBnZXQgdGhlIAorCQkgKiBuZXh0IGNvbW1hbmQgb3V0IHRvIHRoZSBkZXZpY2UsIGhvcGVmdWxseSB0aGlzIHdpbGwKKwkJICogbWVhbiB3ZSBkb24ndCB3YXN0ZSBhbm90aGVyIHJldm9sdXRpb24gZHVlIHRvIHRoZSBkZWxheXMKKwkJICogcmVxdWlyZWQgYnkgQVJCSVRSQVRJT04gYW5kIGFub3RoZXIgU0VMRUNUSU9OLgorCQkgKgorCQkgKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBwcm9wb3NhbCwgbG93IGxldmVsIGRyaXZlcnMKKwkJICogbWVyZWx5IGhhdmUgdG8gc3RhcnQgdGhlIG5leHQgY29tbWFuZCwgcG9pbnRlZCB0byBieSAKKwkJICogbmV4dF9saW5rLCBkb25lKCkgaXMgY2FsbGVkIGFzIHdpdGggdW5saW5rZWQgY29tbWFuZHMuCisJCSAqLworI2lmZGVmIExJTktFRAorCQljYXNlIExJTktFRF9DTURfQ09NUExFVEU6CisJCWNhc2UgTElOS0VEX0ZMR19DTURfQ09NUExFVEU6CisJCSAgICAvKiBBY2NlcHQgbWVzc2FnZSBieSBjbGVhcmluZyBBQ0sgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCSAgICAKKwkJICAgIExOS19QUklOVEsoInNjc2klZDogdGFyZ2V0ICVkIGx1biAlZCBsaW5rZWQgY29tbWFuZCAiCisJCQkgICAgICAgImNvbXBsZXRlLlxuIiwgSE9TVE5PLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCisJCSAgICAvKiBFbmFibGUgcmVzZWxlY3QgaW50ZXJydXB0cyAqLworCQkgICAgTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCQkgICAgLyoKKwkJICAgICAqIFNhbml0eSBjaGVjayA6IEEgbGlua2VkIGNvbW1hbmQgc2hvdWxkIG9ubHkgdGVybWluYXRlCisJCSAgICAgKiB3aXRoIG9uZSBvZiB0aGVzZSBtZXNzYWdlcyBpZiB0aGVyZSBhcmUgbW9yZSBsaW5rZWQKKwkJICAgICAqIGNvbW1hbmRzIGF2YWlsYWJsZS4KKwkJICAgICAqLworCisJCSAgICBpZiAoIWNtZC0+bmV4dF9saW5rKSB7CisJCQkgcHJpbnRrKEtFUk5fTk9USUNFICJzY3NpJWQ6IHRhcmdldCAlZCBsdW4gJWQgIgorCQkJCSJsaW5rZWQgY29tbWFuZCBjb21wbGV0ZSwgbm8gbmV4dF9saW5rXG4iLAorCQkJCUhPU1ROTywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKwkJCSAgICBzaW5rID0gMTsKKwkJCSAgICBkb19hYm9ydCAoaW5zdGFuY2UpOworCQkJICAgIHJldHVybjsKKwkJICAgIH0KKworCQkgICAgaW5pdGlhbGl6ZV9TQ3AoY21kLT5uZXh0X2xpbmspOworCQkgICAgLyogVGhlIG5leHQgY29tbWFuZCBpcyBzdGlsbCBwYXJ0IG9mIHRoaXMgcHJvY2VzczsgY29weSBpdAorCQkgICAgICogYW5kIGRvbid0IGZyZWUgaXQhICovCisJCSAgICBjbWQtPm5leHRfbGluay0+dGFnID0gY21kLT50YWc7CisJCSAgICBjbWQtPnJlc3VsdCA9IGNtZC0+U0NwLlN0YXR1cyB8IChjbWQtPlNDcC5NZXNzYWdlIDw8IDgpOyAKKwkJICAgIExOS19QUklOVEsoInNjc2klZDogdGFyZ2V0ICVkIGx1biAlZCBsaW5rZWQgcmVxdWVzdCAiCisJCQkgICAgICAgImRvbmUsIGNhbGxpbmcgc2NzaV9kb25lKCkuXG4iLAorCQkJICAgICAgIEhPU1ROTywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKyNpZmRlZiBOQ1I1MzgwX1NUQVRTCisJCSAgICBjb2xsZWN0X3N0YXRzKGhvc3RkYXRhLCBjbWQpOworI2VuZGlmCisJCSAgICBjbWQtPnNjc2lfZG9uZShjbWQpOworCQkgICAgY21kID0gaG9zdGRhdGEtPmNvbm5lY3RlZDsKKwkJICAgIGJyZWFrOworI2VuZGlmIC8qIGRlZiBMSU5LRUQgKi8KKwkJY2FzZSBBQk9SVDoKKwkJY2FzZSBDT01NQU5EX0NPTVBMRVRFOiAKKwkJICAgIC8qIEFjY2VwdCBtZXNzYWdlIGJ5IGNsZWFyaW5nIEFDSyAqLworCQkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQkgICAgUVVfUFJJTlRLKCJzY3NpJWQ6IGNvbW1hbmQgZm9yIHRhcmdldCAlZCwgbHVuICVkICIKKwkJCSAgICAgICJjb21wbGV0ZWRcbiIsIEhPU1ROTywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKwkJICAgIGNtZF9mcmVlX3RhZyggY21kICk7CisJCSAgICBpZiAoc3RhdHVzX2J5dGUoY21kLT5TQ3AuU3RhdHVzKSA9PSBRVUVVRV9GVUxMKSB7CisJCQkvKiBUdXJuIGEgUVVFVUUgRlVMTCBzdGF0dXMgaW50byBCVVNZLCBJIHRoaW5rIHRoZQorCQkJICogbWlkIGxldmVsIGNhbm5vdCBoYW5kbGUgUVVFVUUgRlVMTCA6LSggKFRoZQorCQkJICogY29tbWFuZCBpcyByZXRyaWVkIGFmdGVyIEJVU1kpLiBBbHNvIHVwZGF0ZSBvdXIKKwkJCSAqIHF1ZXVlIHNpemUgdG8gdGhlIG51bWJlciBvZiBjdXJyZW50bHkgaXNzdWVkCisJCQkgKiBjb21tYW5kcyBub3cuCisJCQkgKi8KKwkJCS8qICsrQW5kcmVhczogdGhlIG1pZCBsZXZlbCBjb2RlIGtub3dzIGFib3V0CisJCQkgICBRVUVVRV9GVUxMIG5vdy4gKi8KKwkJCVRBR19BTExPQyAqdGEgPSAmVGFnQWxsb2NbY21kLT5kZXZpY2UtPmlkXVtjbWQtPmRldmljZS0+bHVuXTsKKwkJCVRBR19QUklOVEsoInNjc2klZDogdGFyZ2V0ICVkIGx1biAlZCByZXR1cm5lZCAiCisJCQkJICAgIlFVRVVFX0ZVTEwgYWZ0ZXIgJWQgY29tbWFuZHNcbiIsCisJCQkJICAgSE9TVE5PLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sCisJCQkJICAgdGEtPm5yX2FsbG9jYXRlZCk7CisJCQlpZiAodGEtPnF1ZXVlX3NpemUgPiB0YS0+bnJfYWxsb2NhdGVkKQorCQkJICAgIHRhLT5ucl9hbGxvY2F0ZWQgPSB0YS0+cXVldWVfc2l6ZTsKKwkJICAgIH0KKyNlbHNlCisJCSAgICBob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKyNlbmRpZgorCQkgICAgLyogRW5hYmxlIHJlc2VsZWN0IGludGVycnVwdHMgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKworCQkgICAgLyogCisJCSAgICAgKiBJJ20gbm90IHN1cmUgd2hhdCB0aGUgY29ycmVjdCB0aGluZyB0byBkbyBoZXJlIGlzIDogCisJCSAgICAgKiAKKwkJICAgICAqIElmIHRoZSBjb21tYW5kIHRoYXQganVzdCBleGVjdXRlZCBpcyBOT1QgYSByZXF1ZXN0IAorCQkgICAgICogc2Vuc2UsIHRoZSBvYnZpb3VzIHRoaW5nIHRvIGRvIGlzIHRvIHNldCB0aGUgcmVzdWx0CisJCSAgICAgKiBjb2RlIHRvIHRoZSB2YWx1ZXMgb2YgdGhlIHN0b3JlZCBwYXJhbWV0ZXJzLgorCQkgICAgICogCisJCSAgICAgKiBJZiBpdCB3YXMgYSBSRVFVRVNUIFNFTlNFIGNvbW1hbmQsIHdlIG5lZWQgc29tZSB3YXkgdG8KKwkJICAgICAqIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgZmFpbHVyZSBjb2RlIG9mIHRoZSBvcmlnaW5hbAorCQkgICAgICogYW5kIHRoZSBmYWlsdXJlIGNvZGUgb2YgdGhlIFJFUVVFU1Qgc2Vuc2UgLSB0aGUgb2J2aW91cworCQkgICAgICogY2FzZSBpcyBzdWNjZXNzLCB3aGVyZSB3ZSBmYWxsIHRocm91Z2ggYW5kIGxlYXZlIHRoZQorCQkgICAgICogcmVzdWx0IGNvZGUgdW5jaGFuZ2VkLgorCQkgICAgICogCisJCSAgICAgKiBUaGUgbm9uLW9idmlvdXMgcGxhY2UgaXMgd2hlcmUgdGhlIFJFUVVFU1QgU0VOU0UgZmFpbGVkCisJCSAgICAgKi8KKworCQkgICAgaWYgKGNtZC0+Y21uZFswXSAhPSBSRVFVRVNUX1NFTlNFKSAKKwkJCWNtZC0+cmVzdWx0ID0gY21kLT5TQ3AuU3RhdHVzIHwgKGNtZC0+U0NwLk1lc3NhZ2UgPDwgOCk7IAorCQkgICAgZWxzZSBpZiAoc3RhdHVzX2J5dGUoY21kLT5TQ3AuU3RhdHVzKSAhPSBHT09EKQorCQkJY21kLT5yZXN1bHQgPSAoY21kLT5yZXN1bHQgJiAweDAwZmZmZikgfCAoRElEX0VSUk9SIDw8IDE2KTsKKwkJICAgIAorI2lmZGVmIEFVVE9TRU5TRQorCQkgICAgaWYgKChjbWQtPmNtbmRbMF0gIT0gUkVRVUVTVF9TRU5TRSkgJiYgCisJCQkoc3RhdHVzX2J5dGUoY21kLT5TQ3AuU3RhdHVzKSA9PSBDSEVDS19DT05ESVRJT04pKSB7CisJCQlBU0VOX1BSSU5USygic2NzaSVkOiBwZXJmb3JtaW5nIHJlcXVlc3Qgc2Vuc2VcbiIsCisJCQkJICAgIEhPU1ROTyk7CisJCQljbWQtPmNtbmRbMF0gPSBSRVFVRVNUX1NFTlNFOworCQkJY21kLT5jbW5kWzFdICY9IDB4ZTA7CisJCQljbWQtPmNtbmRbMl0gPSAwOworCQkJY21kLT5jbW5kWzNdID0gMDsKKwkJCWNtZC0+Y21uZFs0XSA9IHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcik7CisJCQljbWQtPmNtbmRbNV0gPSAwOworCQkJY21kLT5jbWRfbGVuID0gQ09NTUFORF9TSVpFKGNtZC0+Y21uZFswXSk7CisKKwkJCWNtZC0+dXNlX3NnID0gMDsKKwkJCS8qIHRoaXMgaXMgaW5pdGlhbGl6ZWQgZnJvbSBpbml0aWFsaXplX1NDcCAKKwkJCWNtZC0+U0NwLmJ1ZmZlciA9IE5VTEw7CisJCQljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gMDsKKwkJCSovCisJCQljbWQtPnJlcXVlc3RfYnVmZmVyID0gKGNoYXIgKikgY21kLT5zZW5zZV9idWZmZXI7CisJCQljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcik7CisKKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCUxJU1QoY21kLGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSk7CisJCQlORVhUKGNtZCkgPSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7CisJCSAgICAgICAgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlID0gKFNjc2lfQ21uZCAqKSBjbWQ7CisJCSAgICAgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJUVVfUFJJTlRLKCJzY3NpJWQ6IFJFUVVFU1QgU0VOU0UgYWRkZWQgdG8gaGVhZCBvZiAiCisJCQkJICAiaXNzdWUgcXVldWVcbiIsIEhfTk8oY21kKSk7CisJCSAgIH0gZWxzZQorI2VuZGlmIC8qIGRlZiBBVVRPU0VOU0UgKi8KKwkJICAgeworI2lmZGVmIE5DUjUzODBfU1RBVFMKKwkJICAgICAgIGNvbGxlY3Rfc3RhdHMoaG9zdGRhdGEsIGNtZCk7CisjZW5kaWYKKwkJICAgICAgIGNtZC0+c2NzaV9kb25lKGNtZCk7CisJCSAgICB9CisKKwkJICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkJICAgIC8qIAorCQkgICAgICogUmVzdG9yZSBwaGFzZSBiaXRzIHRvIDAgc28gYW4gaW50ZXJydXB0ZWQgc2VsZWN0aW9uLCAKKwkJICAgICAqIGFyYml0cmF0aW9uIGNhbiByZXN1bWUuCisJCSAgICAgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCAwKTsKKwkJICAgIAorCQkgICAgd2hpbGUgKChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9CU1kpICYmICFob3N0ZGF0YS0+Y29ubmVjdGVkKQorCQkJYmFycmllcigpOworCisJCSAgICByZXR1cm47CisJCWNhc2UgTUVTU0FHRV9SRUpFQ1Q6CisJCSAgICAvKiBBY2NlcHQgbWVzc2FnZSBieSBjbGVhcmluZyBBQ0sgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCSAgICAvKiBFbmFibGUgcmVzZWxlY3QgaW50ZXJydXB0cyAqLworCQkgICAgTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCQkgICAgc3dpdGNoIChob3N0ZGF0YS0+bGFzdF9tZXNzYWdlKSB7CisJCSAgICBjYXNlIEhFQURfT0ZfUVVFVUVfVEFHOgorCQkgICAgY2FzZSBPUkRFUkVEX1FVRVVFX1RBRzoKKwkJICAgIGNhc2UgU0lNUExFX1FVRVVFX1RBRzoKKwkJCS8qIFRoZSB0YXJnZXQgb2J2aW91c2x5IGRvZXNuJ3Qgc3VwcG9ydCB0YWdnZWQKKwkJCSAqIHF1ZXVpbmcsIGV2ZW4gdGhvdWdoIGl0IGFubm91bmNlZCB0aGlzIGFiaWxpdHkgaW4KKwkJCSAqIGl0cyBJTlFVSVJZIGRhdGEgPyE/IChtYXliZSBvbmx5IHRoaXMgTFVOPykgT2ssCisJCQkgKiBjbGVhciAndGFnZ2VkX3N1cHBvcnRlZCcgYW5kIGxvY2sgdGhlIExVTiwgc2luY2UKKwkJCSAqIHRoZSBjb21tYW5kIGlzIHRyZWF0ZWQgYXMgdW50YWdnZWQgZnVydGhlciBvbi4KKwkJCSAqLworCQkJY21kLT5kZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQgPSAwOworCQkJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSB8PSAoMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKwkJCWNtZC0+dGFnID0gVEFHX05PTkU7CisJCQlUQUdfUFJJTlRLKCJzY3NpJWQ6IHRhcmdldCAlZCBsdW4gJWQgcmVqZWN0ZWQgIgorCQkJCSAgICJRVUVVRV9UQUcgbWVzc2FnZTsgdGFnZ2VkIHF1ZXVpbmcgIgorCQkJCSAgICJkaXNhYmxlZFxuIiwKKwkJCQkgICBIT1NUTk8sIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIGJyZWFrOworCQljYXNlIERJU0NPTk5FQ1Q6CisJCSAgICAvKiBBY2NlcHQgbWVzc2FnZSBieSBjbGVhcmluZyBBQ0sgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCSAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCSAgICBjbWQtPmRldmljZS0+ZGlzY29ubmVjdCA9IDE7CisJCSAgICBMSVNUKGNtZCxob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlKTsKKwkJICAgIE5FWFQoY21kKSA9IGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWU7CisJCSAgICBob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKwkJICAgIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUgPSBjbWQ7CisJCSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCSAgICBRVV9QUklOVEsoInNjc2klZDogY29tbWFuZCBmb3IgdGFyZ2V0ICVkIGx1biAlZCB3YXMgIgorCQkJICAgICAgIm1vdmVkIGZyb20gY29ubmVjdGVkIHRvIHRoZSAiCisJCQkgICAgICAiZGlzY29ubmVjdGVkX3F1ZXVlXG4iLCBIT1NUTk8sIAorCQkJICAgICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKwkJICAgIC8qIAorCQkgICAgICogUmVzdG9yZSBwaGFzZSBiaXRzIHRvIDAgc28gYW4gaW50ZXJydXB0ZWQgc2VsZWN0aW9uLCAKKwkJICAgICAqIGFyYml0cmF0aW9uIGNhbiByZXN1bWUuCisJCSAgICAgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCAwKTsKKworCQkgICAgLyogRW5hYmxlIHJlc2VsZWN0IGludGVycnVwdHMgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkJICAgIC8qIFdhaXQgZm9yIGJ1cyBmcmVlIHRvIGF2b2lkIG5hc3R5IHRpbWVvdXRzICovCisJCSAgICB3aGlsZSAoKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIFNSX0JTWSkgJiYgIWhvc3RkYXRhLT5jb25uZWN0ZWQpCisJCSAgICAJYmFycmllcigpOworI2lmZGVmIFNVTjNfU0NTSV9WTUUKKwkJICAgIGRyZWdzLT5jc3IgfD0gQ1NSX0RNQV9FTkFCTEU7CisjZW5kaWYKKwkJICAgIHJldHVybjsKKwkJLyogCisJCSAqIFRoZSBTQ1NJIGRhdGEgcG9pbnRlciBpcyAqSU1QTElDSVRMWSogc2F2ZWQgb24gYSBkaXNjb25uZWN0CisJCSAqIG9wZXJhdGlvbiwgaW4gdmlvbGF0aW9uIG9mIHRoZSBTQ1NJIHNwZWMgc28gd2UgY2FuIHNhZmVseSAKKwkJICogaWdub3JlIFNBVkUvUkVTVE9SRSBwb2ludGVycyBjYWxscy4KKwkJICoKKwkJICogVW5mb3J0dW5hdGVseSwgc29tZSBkaXNrcyB2aW9sYXRlIHRoZSBTQ1NJIHNwZWMgYW5kIAorCQkgKiBkb24ndCBpc3N1ZSB0aGUgcmVxdWlyZWQgU0FWRV9QT0lOVEVSUyBtZXNzYWdlIGJlZm9yZQorCQkgKiBkaXNjb25uZWN0aW5nLCBhbmQgd2UgaGF2ZSB0byBicmVhayBzcGVjIHRvIHJlbWFpbiAKKwkJICogY29tcGF0aWJsZS4KKwkJICovCisJCWNhc2UgU0FWRV9QT0lOVEVSUzoKKwkJY2FzZSBSRVNUT1JFX1BPSU5URVJTOgorCQkgICAgLyogQWNjZXB0IG1lc3NhZ2UgYnkgY2xlYXJpbmcgQUNLICovCisJCSAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCQkgICAgLyogRW5hYmxlIHJlc2VsZWN0IGludGVycnVwdHMgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkJICAgIGJyZWFrOworCQljYXNlIEVYVEVOREVEX01FU1NBR0U6CisvKiAKKyAqIEV4dGVuZGVkIG1lc3NhZ2VzIGFyZSBzZW50IGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0IDoKKyAqIEJ5dGUgCQorICogMAkJRVhURU5ERURfTUVTU0FHRSA9PSAxCisgKiAxCQlsZW5ndGggKGluY2x1ZGVzIG9uZSBieXRlIGZvciBjb2RlLCBkb2Vzbid0IAorICoJCWluY2x1ZGUgZmlyc3QgdHdvIGJ5dGVzKQorICogMiAJCWNvZGUKKyAqIDMuLmxlbmd0aCsxCWFyZ3VtZW50cworICoKKyAqIFN0YXJ0IHRoZSBleHRlbmRlZCBtZXNzYWdlIGJ1ZmZlciB3aXRoIHRoZSBFWFRFTkRFRF9NRVNTQUdFCisgKiBieXRlLCBzaW5jZSBwcmludF9tc2coKSB3YW50cyB0aGUgd2hvbGUgdGhpbmcuICAKKyAqLworCQkgICAgZXh0ZW5kZWRfbXNnWzBdID0gRVhURU5ERURfTUVTU0FHRTsKKwkJICAgIC8qIEFjY2VwdCBmaXJzdCBieXRlIGJ5IGNsZWFyaW5nIEFDSyAqLworCQkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKworCQkgICAgRVhUX1BSSU5USygic2NzaSVkOiByZWNlaXZpbmcgZXh0ZW5kZWQgbWVzc2FnZVxuIiwgSE9TVE5PKTsKKworCQkgICAgbGVuID0gMjsKKwkJICAgIGRhdGEgPSBleHRlbmRlZF9tc2cgKyAxOworCQkgICAgcGhhc2UgPSBQSEFTRV9NU0dJTjsKKwkJICAgIE5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKTsKKwkJICAgIEVYVF9QUklOVEsoInNjc2klZDogbGVuZ3RoPSVkLCBjb2RlPTB4JTAyeFxuIiwgSE9TVE5PLAorCQkJICAgICAgIChpbnQpZXh0ZW5kZWRfbXNnWzFdLCAoaW50KWV4dGVuZGVkX21zZ1syXSk7CisKKwkJICAgIGlmICghbGVuICYmIGV4dGVuZGVkX21zZ1sxXSA8PSAKKwkJCShzaXplb2YgKGV4dGVuZGVkX21zZykgLSAxKSkgeworCQkJLyogQWNjZXB0IHRoaXJkIGJ5dGUgYnkgY2xlYXJpbmcgQUNLICovCisJCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCQkJbGVuID0gZXh0ZW5kZWRfbXNnWzFdIC0gMTsKKwkJCWRhdGEgPSBleHRlbmRlZF9tc2cgKyAzOworCQkJcGhhc2UgPSBQSEFTRV9NU0dJTjsKKworCQkJTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgJmxlbiwgJmRhdGEpOworCQkJRVhUX1BSSU5USygic2NzaSVkOiBtZXNzYWdlIHJlY2VpdmVkLCByZXNpZHVhbCAlZFxuIiwKKwkJCQkgICBIT1NUTk8sIGxlbik7CisKKwkJCXN3aXRjaCAoZXh0ZW5kZWRfbXNnWzJdKSB7CisJCQljYXNlIEVYVEVOREVEX1NEVFI6CisJCQljYXNlIEVYVEVOREVEX1dEVFI6CisJCQljYXNlIEVYVEVOREVEX01PRElGWV9EQVRBX1BPSU5URVI6CisJCQljYXNlIEVYVEVOREVEX0VYVEVOREVEX0lERU5USUZZOgorCQkJICAgIHRtcCA9IDA7CisJCQl9CisJCSAgICB9IGVsc2UgaWYgKGxlbikgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJzY3NpJWQ6IGVycm9yIHJlY2VpdmluZyAiCisJCQkgICAgICAgImV4dGVuZGVkIG1lc3NhZ2VcbiIsIEhPU1ROTyk7CisJCQl0bXAgPSAwOworCQkgICAgfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAic2NzaSVkOiBleHRlbmRlZCBtZXNzYWdlICIKKwkJCSAgICAgICAiY29kZSAlMDJ4IGxlbmd0aCAlZCBpcyB0b28gbG9uZ1xuIiwKKwkJCSAgICAgICBIT1NUTk8sIGV4dGVuZGVkX21zZ1syXSwgZXh0ZW5kZWRfbXNnWzFdKTsKKwkJCXRtcCA9IDA7CisJCSAgICB9CisJCS8qIEZhbGwgdGhyb3VnaCB0byByZWplY3QgbWVzc2FnZSAqLworCisJCS8qIAorICAJCSAqIElmIHdlIGdldCBzb21ldGhpbmcgd2VpcmQgdGhhdCB3ZSBhcmVuJ3QgZXhwZWN0aW5nLCAKKyAJCSAqIHJlamVjdCBpdC4KKwkJICovCisJCWRlZmF1bHQ6CisJCSAgICBpZiAoIXRtcCkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInNjc2klZDogcmVqZWN0aW5nIG1lc3NhZ2UgIiwgSE9TVE5PKTsKKwkJCXByaW50X21zZyAoZXh0ZW5kZWRfbXNnKTsKKwkJCXByaW50aygiXG4iKTsKKwkJICAgIH0gZWxzZSBpZiAodG1wICE9IEVYVEVOREVEX01FU1NBR0UpCisJCQlwcmludGsoS0VSTl9ERUJVRyAic2NzaSVkOiByZWplY3RpbmcgdW5rbm93biAiCisJCQkgICAgICAgIm1lc3NhZ2UgJTAyeCBmcm9tIHRhcmdldCAlZCwgbHVuICVkXG4iLAorCQkJICAgICAgIEhPU1ROTywgdG1wLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCQkgICAgZWxzZQorCQkJcHJpbnRrKEtFUk5fREVCVUcgInNjc2klZDogcmVqZWN0aW5nIHVua25vd24gIgorCQkJICAgICAgICJleHRlbmRlZCBtZXNzYWdlICIKKwkJCSAgICAgICAiY29kZSAlMDJ4LCBsZW5ndGggJWQgZnJvbSB0YXJnZXQgJWQsIGx1biAlZFxuIiwKKwkJCSAgICAgICBIT1NUTk8sIGV4dGVuZGVkX21zZ1sxXSwgZXh0ZW5kZWRfbXNnWzBdLAorCQkJICAgICAgIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisgICAKKworCQkgICAgbXNnb3V0ID0gTUVTU0FHRV9SRUpFQ1Q7CisJCSAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCAKKwkJCUlDUl9BU1NFUlRfQVROKTsKKwkJICAgIGJyZWFrOworCQl9IC8qIHN3aXRjaCAodG1wKSAqLworCQlicmVhazsKKwkgICAgY2FzZSBQSEFTRV9NU0dPVVQ6CisJCWxlbiA9IDE7CisJCWRhdGEgPSAmbXNnb3V0OworCQlob3N0ZGF0YS0+bGFzdF9tZXNzYWdlID0gbXNnb3V0OworCQlOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgJnBoYXNlLCAmbGVuLCAmZGF0YSk7CisJCWlmIChtc2dvdXQgPT0gQUJPUlQpIHsKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKwkJICAgIGNtZF9mcmVlX3RhZyggY21kICk7CisjZWxzZQorCQkgICAgaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmPSB+KDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisjZW5kaWYKKwkJICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQkgICAgY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisjaWZkZWYgTkNSNTM4MF9TVEFUUworCQkgICAgY29sbGVjdF9zdGF0cyhob3N0ZGF0YSwgY21kKTsKKyNlbmRpZgorCQkgICAgY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkJICAgIHJldHVybjsKKwkJfQorCQltc2dvdXQgPSBOT1A7CisJCWJyZWFrOworCSAgICBjYXNlIFBIQVNFX0NNRE9VVDoKKwkJbGVuID0gY21kLT5jbWRfbGVuOworCQlkYXRhID0gY21kLT5jbW5kOworCQkvKiAKKwkJICogWFhYIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBvbiBtYWNoaW5lcyB3aXRoIGEgCisJCSAqIFBTRVVETy1ETUEgYXJjaGl0ZWN0dXJlIHdlIHNob3VsZCBwcm9iYWJseSAKKwkJICogdXNlIHRoZSBkbWEgdHJhbnNmZXIgZnVuY3Rpb24uICAKKwkJICovCisJCU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sIAorCQkgICAgJmRhdGEpOworCQlicmVhazsKKwkgICAgY2FzZSBQSEFTRV9TVEFUSU46CisJCWxlbiA9IDE7CisJCWRhdGEgPSAmdG1wOworCQlOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgJnBoYXNlLCAmbGVuLCAmZGF0YSk7CisJCWNtZC0+U0NwLlN0YXR1cyA9IHRtcDsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCXByaW50aygic2NzaSVkOiB1bmtub3duIHBoYXNlXG4iLCBIT1NUTk8pOworCQlOQ1JfUFJJTlQoTkRFQlVHX0FOWSk7CisJICAgIH0gLyogc3dpdGNoKHBoYXNlKSAqLworCX0gLyogaWYgKHRtcCAqIFNSX1JFUSkgKi8gCisgICAgfSAvKiB3aGlsZSAoMSkgKi8KK30KKworLyoKKyAqIEZ1bmN0aW9uIDogdm9pZCBOQ1I1MzgwX3Jlc2VsZWN0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKKyAqCisgKiBQdXJwb3NlIDogZG9lcyByZXNlbGVjdGlvbiwgaW5pdGlhbGl6aW5nIHRoZSBpbnN0YW5jZS0+Y29ubmVjdGVkIAorICoJZmllbGQgdG8gcG9pbnQgdG8gdGhlIFNjc2lfQ21uZCBmb3Igd2hpY2ggdGhlIElfVF9MIG9yIElfVF9MX1EgCisgKgluZXh1cyBoYXMgYmVlbiByZWVzdGFibGlzaGVkLAorICoJCisgKiBJbnB1dHMgOiBpbnN0YW5jZSAtIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIE5DUjUzODAuCisgKgorICovCisKKy8qIGl0IG1pZ2h0IGV2ZW50dWFsbHkgcHJvdmUgbmVjZXNzYXJ5IHRvIGRvIGEgZG1hIHNldHVwIG9uCisgICByZXNlbGVjdGlvbiwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSB0byBiZSBuZWVkZWQgbm93IC0tIHNhbSAqLworCitzdGF0aWMgdm9pZCBOQ1I1MzgwX3Jlc2VsZWN0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKyAgICBTRVRVUF9IT1NUREFUQShpbnN0YW5jZSk7CisgICAgdW5zaWduZWQgY2hhciB0YXJnZXRfbWFzazsKKyAgICB1bnNpZ25lZCBjaGFyIGx1bjsKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKyAgICB1bnNpZ25lZCBjaGFyIHRhZzsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNoYXIgbXNnWzNdOworICAgIFNjc2lfQ21uZCAqdG1wID0gTlVMTCwgKnByZXY7CisvKiAgICB1bnNpZ25lZCBsb25nIGZsYWdzOyAqLworCisgICAgLyoKKyAgICAgKiBEaXNhYmxlIGFyYml0cmF0aW9uLCBldGMuIHNpbmNlIHRoZSBob3N0IGFkYXB0ZXIgb2J2aW91c2x5CisgICAgICogbG9zdCwgYW5kIHRlbGwgYW4gaW50ZXJydXB0ZWQgTkNSNTM4MF9zZWxlY3QoKSB0byByZXN0YXJ0LgorICAgICAqLworCisgICAgTkNSNTM4MF93cml0ZShNT0RFX1JFRywgTVJfQkFTRSk7CisgICAgaG9zdGRhdGEtPnJlc3RhcnRfc2VsZWN0ID0gMTsKKworICAgIHRhcmdldF9tYXNrID0gTkNSNTM4MF9yZWFkKENVUlJFTlRfU0NTSV9EQVRBX1JFRykgJiB+KGhvc3RkYXRhLT5pZF9tYXNrKTsKKworICAgIFJTTF9QUklOVEsoInNjc2klZDogcmVzZWxlY3RcbiIsIEhPU1ROTyk7CisKKyAgICAvKiAKKyAgICAgKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGRldGVjdGVkIHRoYXQgb3VyIFNDU0kgSUQgaXMgb24gdGhlIGJ1cywKKyAgICAgKiBTRUwgaXMgdHJ1ZSBhbmQgQlNZIHdhcyBmYWxzZSBmb3IgYXQgbGVhc3Qgb25lIGJ1cyBzZXR0bGUgZGVsYXkKKyAgICAgKiAoNDAwIG5zKS4KKyAgICAgKgorICAgICAqIFdlIG11c3QgYXNzZXJ0IEJTWSBvdXJzZWx2ZXMsIHVudGlsIHRoZSB0YXJnZXQgZHJvcHMgdGhlIFNFTAorICAgICAqIHNpZ25hbC4KKyAgICAgKi8KKworICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQlNZKTsKKyAgICAKKyAgICB3aGlsZSAoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfU0VMKTsKKyAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCisgICAgLyoKKyAgICAgKiBXYWl0IGZvciB0YXJnZXQgdG8gZ28gaW50byBNU0dJTi4KKyAgICAgKi8KKworICAgIHdoaWxlICghKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIFNSX1JFUSkpOworCisjaWYgMQorICAgIC8vIGFja25vd2xlZGdlIHRvZ2dsZSB0byBNU0dJTgorICAgIE5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCBQSEFTRV9TUl9UT19UQ1IoUEhBU0VfTVNHSU4pKTsKKworICAgIC8vIHBlZWsgYXQgdGhlIGJ5dGUgd2l0aG91dCByZWFsbHkgaGl0dGluZyB0aGUgYnVzCisgICAgbXNnWzBdID0gTkNSNTM4MF9yZWFkKENVUlJFTlRfU0NTSV9EQVRBX1JFRyk7CisjZW5kaWYKKworICAgIGlmICghKG1zZ1swXSAmIDB4ODApKSB7CisJcHJpbnRrKEtFUk5fREVCVUcgInNjc2klZDogZXhwZWN0aW5nIElERU5USUZZIG1lc3NhZ2UsIGdvdCAiLCBIT1NUTk8pOworCXByaW50X21zZyhtc2cpOworCWRvX2Fib3J0KGluc3RhbmNlKTsKKwlyZXR1cm47CisgICAgfQorICAgIGx1biA9IChtc2dbMF0gJiAweDA3KTsKKworICAgIC8qIAorICAgICAqIEZpbmQgdGhlIGNvbW1hbmQgY29ycmVzcG9uZGluZyB0byB0aGUgSV9UX0wgb3IgSV9UX0xfUSAgbmV4dXMgd2UgCisgICAgICoganVzdCByZWVzdGFibGlzaGVkLCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGRpc2Nvbm5lY3RlZCBxdWV1ZS4KKyAgICAgKi8KKworICAgIGZvciAodG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlLCBwcmV2ID0gTlVMTDsgCisJIHRtcDsgcHJldiA9IHRtcCwgdG1wID0gTkVYVCh0bXApICkgeworCWlmICgodGFyZ2V0X21hc2sgPT0gKDEgPDwgdG1wLT5kZXZpY2UtPmlkKSkgJiYgKGx1biA9PSB0bXAtPmRldmljZS0+bHVuKQorI2lmZGVmIFNVUFBPUlRfVEFHUworCSAgICAmJiAodGFnID09IHRtcC0+dGFnKSAKKyNlbmRpZgorCSAgICApIHsKKwkgICAgaWYgKHByZXYpIHsKKwkJUkVNT1ZFKHByZXYsIE5FWFQocHJldiksIHRtcCwgTkVYVCh0bXApKTsKKwkJTkVYVChwcmV2KSA9IE5FWFQodG1wKTsKKwkgICAgfSBlbHNlIHsKKwkJUkVNT1ZFKC0xLCBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlLCB0bXAsIE5FWFQodG1wKSk7CisJCWhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUgPSBORVhUKHRtcCk7CisJICAgIH0KKwkgICAgTkVYVCh0bXApID0gTlVMTDsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICAKKyAgICBpZiAoIXRtcCkgeworCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZDogd2FybmluZzogdGFyZ2V0IGJpdG1hc2sgJTAyeCBsdW4gJWQgIgorI2lmZGVmIFNVUFBPUlRfVEFHUworCQkidGFnICVkICIKKyNlbmRpZgorCQkibm90IGluIGRpc2Nvbm5lY3RlZF9xdWV1ZS5cbiIsCisJCUhPU1ROTywgdGFyZ2V0X21hc2ssIGx1bgorI2lmZGVmIFNVUFBPUlRfVEFHUworCQksIHRhZworI2VuZGlmCisJCSk7CisJLyogCisJICogU2luY2Ugd2UgaGF2ZSBhbiBlc3RhYmxpc2hlZCBuZXh1cyB0aGF0IHdlIGNhbid0IGRvIGFueXRoaW5nCisJICogd2l0aCwgd2UgbXVzdCBhYm9ydCBpdC4gIAorCSAqLworCWRvX2Fib3J0KGluc3RhbmNlKTsKKwlyZXR1cm47CisgICAgfQorI2lmIDEKKyAgICAvKiBlbmdhZ2UgZG1hIHNldHVwIGZvciB0aGUgY29tbWFuZCB3ZSBqdXN0IHNhdyAqLworICAgIHsKKwkgICAgdm9pZCAqZDsKKwkgICAgdW5zaWduZWQgbG9uZyBjb3VudDsKKworCSAgICBpZiAoIXRtcC0+U0NwLnRoaXNfcmVzaWR1YWwgJiYgdG1wLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCkgeworCQkgICAgY291bnQgPSB0bXAtPlNDcC5idWZmZXItPmxlbmd0aDsKKwkJICAgIGQgPSBTR0FERFIodG1wLT5TQ3AuYnVmZmVyKTsKKwkgICAgfSBlbHNlIHsKKwkJICAgIGNvdW50ID0gdG1wLT5TQ3AudGhpc19yZXNpZHVhbDsKKwkJICAgIGQgPSB0bXAtPlNDcC5wdHI7CisJICAgIH0KKyNpZmRlZiBSRUFMX0RNQQorCSAgICAvKiBzZXR1cCB0aGlzIGNvbW1hbmQgZm9yIGRtYSBpZiBub3QgYWxyZWFkeSAqLworCSAgICBpZigoY291bnQgPiBTVU4zX0RNQV9NSU5TSVpFKSAmJiAoc3VuM19kbWFfc2V0dXBfZG9uZSAhPSB0bXApKQorCSAgICB7CisJCSAgICBzdW4zc2NzaV9kbWFfc2V0dXAoZCwgY291bnQsIHJxX2RhdGFfZGlyKHRtcC0+cmVxdWVzdCkpOworCQkgICAgc3VuM19kbWFfc2V0dXBfZG9uZSA9IHRtcDsKKwkgICAgfQorI2VuZGlmCisgICAgfQorI2VuZGlmCisKKyAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0FDSyk7CisgICAgLyogQWNjZXB0IG1lc3NhZ2UgYnkgY2xlYXJpbmcgQUNLICovCisgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKworI2lmZGVmIFNVUFBPUlRfVEFHUworICAgIC8qIElmIHRoZSBwaGFzZSBpcyBzdGlsbCBNU0dJTiwgdGhlIHRhcmdldCB3YW50cyB0byBzZW5kIHNvbWUgbW9yZQorICAgICAqIG1lc3NhZ2VzLiBJbiBjYXNlIGl0IHN1cHBvcnRzIHRhZ2dlZCBxdWV1aW5nLCB0aGlzIGlzIHByb2JhYmx5IGEKKyAgICAgKiBTSU1QTEVfUVVFVUVfVEFHIGZvciB0aGUgSV9UX0xfUSBuZXh1cy4KKyAgICAgKi8KKyAgICB0YWcgPSBUQUdfTk9ORTsKKyAgICBpZiAocGhhc2UgPT0gUEhBU0VfTVNHSU4gJiYgc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nKSB7CisJLyogQWNjZXB0IHByZXZpb3VzIElERU5USUZZIG1lc3NhZ2UgYnkgY2xlYXJpbmcgQUNLICovCisJTkNSNTM4MF93cml0ZSggSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSApOworCWxlbiA9IDI7CisJZGF0YSA9IG1zZysxOworCWlmICghTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgJmxlbiwgJmRhdGEpICYmCisJICAgIG1zZ1sxXSA9PSBTSU1QTEVfUVVFVUVfVEFHKQorCSAgICB0YWcgPSBtc2dbMl07CisJVEFHX1BSSU5USygic2NzaSVkOiB0YXJnZXQgbWFzayAlMDJ4LCBsdW4gJWQgc2VudCB0YWcgJWQgYXQgIgorCQkgICAicmVzZWxlY3Rpb25cbiIsIEhPU1ROTywgdGFyZ2V0X21hc2ssIGx1biwgdGFnKTsKKyAgICB9CisjZW5kaWYKKyAgICAKKyAgICBob3N0ZGF0YS0+Y29ubmVjdGVkID0gdG1wOworICAgIFJTTF9QUklOVEsoInNjc2klZDogbmV4dXMgZXN0YWJsaXNoZWQsIHRhcmdldCA9ICVkLCBsdW4gPSAlZCwgdGFnID0gJWRcbiIsCisJICAgICAgIEhPU1ROTywgdG1wLT50YXJnZXQsIHRtcC0+bHVuLCB0bXAtPnRhZyk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfYWJvcnQgKFNjc2lfQ21uZCAqY21kKQorICoKKyAqIFB1cnBvc2UgOiBhYm9ydCBhIGNvbW1hbmQKKyAqCisgKiBJbnB1dHMgOiBjbWQgLSB0aGUgU2NzaV9DbW5kIHRvIGFib3J0LCBjb2RlIC0gY29kZSB0byBzZXQgdGhlIAorICogCWhvc3QgYnl0ZSBvZiB0aGUgcmVzdWx0IGZpZWxkIHRvLCBpZiB6ZXJvIERJRF9BQk9SVEVEIGlzIAorICoJdXNlZC4KKyAqCisgKiBSZXR1cm5zIDogMCAtIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisgKgorICogWFhYIC0gdGhlcmUgaXMgbm8gd2F5IHRvIGFib3J0IHRoZSBjb21tYW5kIHRoYXQgaXMgY3VycmVudGx5IAorICogCSBjb25uZWN0ZWQsIHlvdSBoYXZlIHRvIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlLiAgSWYgdGhpcyBpcyAKKyAqCSBhIHByb2JsZW0sIHdlIGNvdWxkIGltcGxlbWVudCBsb25nam1wKCkgLyBzZXRqbXAoKSwgc2V0am1wKCkKKyAqIAkgY2FsbGVkIHdoZXJlIHRoZSBsb29wIHN0YXJ0ZWQgaW4gTkNSNTM4MF9tYWluKCkuCisgKi8KKworc3RhdGljIGludCBOQ1I1MzgwX2Fib3J0IChTY3NpX0NtbmQgKmNtZCkKK3sKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSA9IGNtZC0+ZGV2aWNlLT5ob3N0OworICAgIFNFVFVQX0hPU1REQVRBKGluc3RhbmNlKTsKKyAgICBTY3NpX0NtbmQgKnRtcCwgKipwcmV2OworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBwcmludGsoS0VSTl9OT1RJQ0UgInNjc2klZDogYWJvcnRpbmcgY29tbWFuZFxuIiwgSE9TVE5PKTsKKyAgICBwcmludF9TY3NpX0NtbmQgKGNtZCk7CisKKyAgICBOQ1I1MzgwX3ByaW50X3N0YXR1cyAoaW5zdGFuY2UpOworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIAorICAgIEFCUlRfUFJJTlRLKCJzY3NpJWQ6IGFib3J0IGNhbGxlZCBiYXNyIDB4JTAyeCwgc3IgMHglMDJ4XG4iLCBIT1NUTk8sCisJCU5DUjUzODBfcmVhZChCVVNfQU5EX1NUQVRVU19SRUcpLAorCQlOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykpOworCisjaWYgMQorLyogCisgKiBDYXNlIDEgOiBJZiB0aGUgY29tbWFuZCBpcyB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBjb21tYW5kLCAKKyAqIHdlJ2xsIHNldCB0aGUgYWJvcnRlZCBmbGFnIGFuZCByZXR1cm4gY29udHJvbCBzbyB0aGF0IAorICogaW5mb3JtYXRpb24gdHJhbnNmZXIgcm91dGluZSBjYW4gZXhpdCBjbGVhbmx5LgorICovCisKKyAgICBpZiAoaG9zdGRhdGEtPmNvbm5lY3RlZCA9PSBjbWQpIHsKKworCUFCUlRfUFJJTlRLKCJzY3NpJWQ6IGFib3J0aW5nIGNvbm5lY3RlZCBjb21tYW5kXG4iLCBIT1NUTk8pOworLyoKKyAqIFdlIHNob3VsZCBwZXJmb3JtIEJTWSBjaGVja2luZywgYW5kIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IHNsaXBwZWQKKyAqIGludG8gQlVTIEZSRUUuCisgKi8KKworLyoJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9BU1NFUlRfQVROKTsgKi8KKy8qIAorICogU2luY2Ugd2UgY2FuJ3QgY2hhbmdlIHBoYXNlcyB1bnRpbCB3ZSd2ZSBjb21wbGV0ZWQgdGhlIGN1cnJlbnQgCisgKiBoYW5kc2hha2UsIHdlIGhhdmUgdG8gc291cmNlIG9yIHNpbmsgYSBieXRlIG9mIGRhdGEgaWYgdGhlIGN1cnJlbnQKKyAqIHBoYXNlIGlzIG5vdCBNU0dPVVQuCisgKi8KKworLyogCisgKiBSZXR1cm4gY29udHJvbCB0byB0aGUgZXhlY3V0aW5nIE5DUiBkcml2ZSBzbyB3ZSBjYW4gY2xlYXIgdGhlCisgKiBhYm9ydGVkIGZsYWcgYW5kIGdldCBiYWNrIGludG8gb3VyIG1haW4gbG9vcC4KKyAqLyAKKworCWlmIChkb19hYm9ydChpbnN0YW5jZSkgPT0gMCkgeworCSAgaG9zdGRhdGEtPmFib3J0ZWQgPSAxOworCSAgaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisJICBjbWQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKwkgIGNtZF9mcmVlX3RhZyggY21kICk7CisjZWxzZQorCSAgaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmPSB+KDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisjZW5kaWYKKwkgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkgIGNtZC0+c2NzaV9kb25lKGNtZCk7CisJICByZXR1cm4gU0NTSV9BQk9SVF9TVUNDRVNTOworCX0gZWxzZSB7CisvKgkgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgKi8KKwkgIHByaW50aygic2NzaSVkOiBhYm9ydCBvZiBjb25uZWN0ZWQgY29tbWFuZCBmYWlsZWQhXG4iLCBIT1NUTk8pOworCSAgcmV0dXJuIFNDU0lfQUJPUlRfRVJST1I7CisJfSAKKyAgIH0KKyNlbmRpZgorCisvKiAKKyAqIENhc2UgMiA6IElmIHRoZSBjb21tYW5kIGhhc24ndCBiZWVuIGlzc3VlZCB5ZXQsIHdlIHNpbXBseSByZW1vdmUgaXQgCisgKiAJICAgIGZyb20gdGhlIGlzc3VlIHF1ZXVlLgorICovCisgICAgZm9yIChwcmV2ID0gKFNjc2lfQ21uZCAqKikgJihob3N0ZGF0YS0+aXNzdWVfcXVldWUpLCAKKwl0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsKKwl0bXA7IHByZXYgPSBORVhUQUREUih0bXApLCB0bXAgPSBORVhUKHRtcCkgKQorCWlmIChjbWQgPT0gdG1wKSB7CisJICAgIFJFTU9WRSg1LCAqcHJldiwgdG1wLCBORVhUKHRtcCkpOworCSAgICAoKnByZXYpID0gTkVYVCh0bXApOworCSAgICBORVhUKHRtcCkgPSBOVUxMOworCSAgICB0bXAtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKwkgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCSAgICBBQlJUX1BSSU5USygic2NzaSVkOiBhYm9ydCByZW1vdmVkIGNvbW1hbmQgZnJvbSBpc3N1ZSBxdWV1ZS5cbiIsCisJCQlIT1NUTk8pOworCSAgICAvKiBUYWdnZWQgcXVldWluZyBub3RlOiBubyB0YWcgdG8gZnJlZSBoZXJlLCBoYXNuJ3QgYmVlbiBhc3NpZ25lZAorCSAgICAgKiB5ZXQuLi4gKi8KKwkgICAgdG1wLT5zY3NpX2RvbmUodG1wKTsKKwkgICAgcmV0dXJuIFNDU0lfQUJPUlRfU1VDQ0VTUzsKKwl9CisKKy8qIAorICogQ2FzZSAzIDogSWYgYW55IGNvbW1hbmRzIGFyZSBjb25uZWN0ZWQsIHdlJ3JlIGdvaW5nIHRvIGZhaWwgdGhlIGFib3J0CisgKgkgICAgYW5kIGxldCB0aGUgaGlnaCBsZXZlbCBTQ1NJIGRyaXZlciByZXRyeSBhdCBhIGxhdGVyIHRpbWUgb3IgCisgKgkgICAgaXNzdWUgYSByZXNldC4KKyAqCisgKgkgICAgVGltZW91dHMsIGFuZCB0aGVyZWZvcmUgYWJvcnRlZCBjb21tYW5kcywgd2lsbCBiZSBoaWdobHkgdW5saWtlbHkKKyAqICAgICAgICAgIGFuZCBoYW5kbGluZyB0aGVtIGNsZWFubHkgaW4gdGhpcyBzaXR1YXRpb24gd291bGQgbWFrZSB0aGUgY29tbW9uCisgKgkgICAgY2FzZSBvZiBub3Jlc2V0cyBsZXNzIGVmZmljaWVudCwgYW5kIHdvdWxkIHBvbGx1dGUgb3VyIGNvZGUuICBTbywKKyAqCSAgICB3ZSBmYWlsLgorICovCisKKyAgICBpZiAoaG9zdGRhdGEtPmNvbm5lY3RlZCkgeworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlBQlJUX1BSSU5USygic2NzaSVkOiBhYm9ydCBmYWlsZWQsIGNvbW1hbmQgY29ubmVjdGVkLlxuIiwgSE9TVE5PKTsKKyAgICAgICAgcmV0dXJuIFNDU0lfQUJPUlRfU05PT1pFOworICAgIH0KKworLyoKKyAqIENhc2UgNDogSWYgdGhlIGNvbW1hbmQgaXMgY3VycmVudGx5IGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBidXMsIGFuZCAKKyAqIAl0aGVyZSBhcmUgbm8gY29ubmVjdGVkIGNvbW1hbmRzLCB3ZSByZWNvbm5lY3QgdGhlIElfVF9MIG9yIAorICoJSV9UX0xfUSBuZXh1cyBhc3NvY2lhdGVkIHdpdGggaXQsIGdvIGludG8gbWVzc2FnZSBvdXQsIGFuZCBzZW5kIAorICogICAgICBhbiBhYm9ydCBtZXNzYWdlLgorICoKKyAqIFRoaXMgY2FzZSBpcyBlc3BlY2lhbGx5IHVnbHkuIEluIG9yZGVyIHRvIHJlZXN0YWJsaXNoIHRoZSBuZXh1cywgd2UKKyAqIG5lZWQgdG8gY2FsbCBOQ1I1MzgwX3NlbGVjdCgpLiAgVGhlIGVhc2llc3Qgd2F5IHRvIGltcGxlbWVudCB0aGlzIAorICogZnVuY3Rpb24gd2FzIHRvIGFib3J0IGlmIHRoZSBidXMgd2FzIGJ1c3ksIGFuZCBsZXQgdGhlIGludGVycnVwdAorICogaGFuZGxlciB0cmlnZ2VyZWQgb24gdGhlIFNFTCBmb3IgcmVzZWxlY3QgdGFrZSBjYXJlIG9mIGxvc3QgYXJiaXRyYXRpb25zCisgKiB3aGVyZSBuZWNlc3NhcnksIG1lYW5pbmcgaW50ZXJydXB0cyBuZWVkIHRvIGJlIGVuYWJsZWQuCisgKgorICogV2hlbiBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkLCB0aGUgcXVldWVzIG1heSBjaGFuZ2UgLSBzbyB3ZSAKKyAqIGNhbid0IHJlbW92ZSBpdCBmcm9tIHRoZSBkaXNjb25uZWN0ZWQgcXVldWUgYmVmb3JlIHNlbGVjdGluZyBpdAorICogYmVjYXVzZSB0aGF0IGNvdWxkIGNhdXNlIGEgZmFpbHVyZSBpbiBoYXNoaW5nIHRoZSBuZXh1cyBpZiB0aGF0IAorICogZGV2aWNlIHJlc2VsZWN0ZWQuCisgKiAKKyAqIFNpbmNlIHRoZSBxdWV1ZXMgbWF5IGNoYW5nZSwgd2UgY2FuJ3QgdXNlIHRoZSBwb2ludGVycyBmcm9tIHdoZW4gd2UKKyAqIGZpcnN0IGxvY2F0ZSBpdC4KKyAqCisgKiBTbywgd2UgbXVzdCBmaXJzdCBsb2NhdGUgdGhlIGNvbW1hbmQsIGFuZCBpZiBOQ1I1MzgwX3NlbGVjdCgpCisgKiBzdWNjZWVkcywgdGhlbiBpc3N1ZSB0aGUgYWJvcnQsIHJlbG9jYXRlIHRoZSBjb21tYW5kIGFuZCByZW1vdmUKKyAqIGl0IGZyb20gdGhlIGRpc2Nvbm5lY3RlZCBxdWV1ZS4KKyAqLworCisgICAgZm9yICh0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWU7IHRtcDsKKwkgdG1wID0gTkVYVCh0bXApKSAKKyAgICAgICAgaWYgKGNtZCA9PSB0bXApIHsKKyAgICAgICAgICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkgICAgQUJSVF9QUklOVEsoInNjc2klZDogYWJvcnRpbmcgZGlzY29ubmVjdGVkIGNvbW1hbmQuXG4iLCBIT1NUTk8pOworICAKKyAgICAgICAgICAgIGlmIChOQ1I1MzgwX3NlbGVjdCAoaW5zdGFuY2UsIGNtZCwgKGludCkgY21kLT50YWcpKSAKKwkJcmV0dXJuIFNDU0lfQUJPUlRfQlVTWTsKKworCSAgICBBQlJUX1BSSU5USygic2NzaSVkOiBuZXh1cyByZWVzdGFibGlzaGVkLlxuIiwgSE9TVE5PKTsKKworCSAgICBkb19hYm9ydCAoaW5zdGFuY2UpOworCisJICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkgICAgZm9yIChwcmV2ID0gKFNjc2lfQ21uZCAqKikgJihob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlKSwgCisJCXRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZTsKKwkJdG1wOyBwcmV2ID0gTkVYVEFERFIodG1wKSwgdG1wID0gTkVYVCh0bXApICkKKwkJICAgIGlmIChjbWQgPT0gdG1wKSB7CisJCSAgICBSRU1PVkUoNSwgKnByZXYsIHRtcCwgTkVYVCh0bXApKTsKKwkJICAgICpwcmV2ID0gTkVYVCh0bXApOworCQkgICAgTkVYVCh0bXApID0gTlVMTDsKKwkJICAgIHRtcC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworCQkgICAgLyogV2UgbXVzdCB1bmxvY2sgdGhlIHRhZy9MVU4gaW1tZWRpYXRlbHkgaGVyZSwgc2luY2UgdGhlCisJCSAgICAgKiB0YXJnZXQgZ29lcyB0byBCVVMgRlJFRSBhbmQgZG9lc24ndCBzZW5kIHVzIGFub3RoZXIKKwkJICAgICAqIG1lc3NhZ2UgKENPTU1BTkRfQ09NUExFVEUgb3IgdGhlIGxpa2UpCisJCSAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX1RBR1MKKwkJICAgIGNtZF9mcmVlX3RhZyggdG1wICk7CisjZWxzZQorCQkgICAgaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmPSB+KDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisjZW5kaWYKKwkJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJICAgIHRtcC0+c2NzaV9kb25lKHRtcCk7CisJCSAgICByZXR1cm4gU0NTSV9BQk9SVF9TVUNDRVNTOworCQl9CisJfQorCisvKgorICogQ2FzZSA1IDogSWYgd2UgcmVhY2hlZCB0aGlzIHBvaW50LCB0aGUgY29tbWFuZCB3YXMgbm90IGZvdW5kIGluIGFueSBvZiAKKyAqCSAgICB0aGUgcXVldWVzLgorICoKKyAqIFdlIHByb2JhYmx5IHJlYWNoZWQgdGhpcyBwb2ludCBiZWNhdXNlIG9mIGFuIHVubGlrZWx5IHJhY2UgY29uZGl0aW9uCisgKiBiZXR3ZWVuIHRoZSBjb21tYW5kIGNvbXBsZXRpbmcgc3VjY2Vzc2Z1bGx5IGFuZCB0aGUgYWJvcnRpb24gY29kZSwKKyAqIHNvIHdlIHdvbid0IHBhbmljLCBidXQgd2Ugd2lsbCBub3RpZnkgdGhlIHVzZXIgaW4gY2FzZSBzb21ldGhpbmcgcmVhbGx5CisgKiBicm9rZS4KKyAqLworCisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIHByaW50ayhLRVJOX0lORk8gInNjc2klZDogd2FybmluZyA6IFNDU0kgY29tbWFuZCBwcm9iYWJseSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4iCisgICAgICAgICAgIEtFUk5fSU5GTyAiICAgICAgICBiZWZvcmUgYWJvcnRpb25cbiIsIEhPU1ROTyk7IAorCisgICAgcmV0dXJuIFNDU0lfQUJPUlRfTk9UX1JVTk5JTkc7Cit9CisKKworLyogCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX2J1c19yZXNldCAoU2NzaV9DbW5kICpjbWQpCisgKiAKKyAqIFB1cnBvc2UgOiByZXNldCB0aGUgU0NTSSBidXMuCisgKgorICogUmV0dXJucyA6IFNDU0lfUkVTRVRfV0FLRVVQCisgKgorICovIAorCitzdGF0aWMgaW50IE5DUjUzODBfYnVzX3Jlc2V0KCBTY3NpX0NtbmQgKmNtZCkKK3sKKyAgICBTRVRVUF9IT1NUREFUQShjbWQtPmRldmljZS0+aG9zdCk7CisgICAgaW50ICAgICAgICAgICBpOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjaWYgMQorICAgIFNjc2lfQ21uZCAqY29ubmVjdGVkLCAqZGlzY29ubmVjdGVkX3F1ZXVlOworI2VuZGlmCisKKworICAgIE5DUjUzODBfcHJpbnRfc3RhdHVzIChjbWQtPmRldmljZS0+aG9zdCk7CisKKyAgICAvKiBnZXQgaW4gcGhhc2UgKi8KKyAgICBOQ1I1MzgwX3dyaXRlKCBUQVJHRVRfQ09NTUFORF9SRUcsCisJCSAgIFBIQVNFX1NSX1RPX1RDUiggTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICkpOworICAgIC8qIGFzc2VydCBSU1QgKi8KKyAgICBOQ1I1MzgwX3dyaXRlKCBJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9SU1QgKTsKKyAgICB1ZGVsYXkgKDQwKTsKKyAgICAvKiByZXNldCBOQ1IgcmVnaXN0ZXJzICovCisgICAgTkNSNTM4MF93cml0ZSggSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSApOworICAgIE5DUjUzODBfd3JpdGUoIE1PREVfUkVHLCBNUl9CQVNFICk7CisgICAgTkNSNTM4MF93cml0ZSggVEFSR0VUX0NPTU1BTkRfUkVHLCAwICk7CisgICAgTkNSNTM4MF93cml0ZSggU0VMRUNUX0VOQUJMRV9SRUcsIDAgKTsKKyAgICAvKiArK3JvbWFuOiByZXNldCBpbnRlcnJ1cHQgY29uZGl0aW9uISBvdGhlcndpc2Ugbm8gaW50ZXJydXB0cyBkb24ndCBnZXQKKyAgICAgKiB0aHJvdWdoIGFueW1vcmUgLi4uICovCisgICAgKHZvaWQpTkNSNTM4MF9yZWFkKCBSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyApOworCisjaWYgMSAvKiBYWFggU2hvdWxkIG5vdyBiZSBkb25lIGJ5IG1pZGxldmVsIGNvZGUsIGJ1dCBpdCdzIGJyb2tlbiBYWFggKi8KKyAgICAgIC8qIFhYWCBzZWUgYmVsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYWCAqLworCisgICAgLyogTVNjaDogb2xkLXN0eWxlIHJlc2V0OiBhY3R1YWxseSBhYm9ydCBhbGwgY29tbWFuZCBwcm9jZXNzaW5nIGhlcmUgKi8KKworICAgIC8qIEFmdGVyIHRoZSByZXNldCwgdGhlcmUgYXJlIG5vIG1vcmUgY29ubmVjdGVkIG9yIGRpc2Nvbm5lY3RlZCBjb21tYW5kcworICAgICAqIGFuZCBubyBidXN5IHVuaXRzOyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHJlLWluc2VydGluZyB0aGUgY29tbWFuZHMKKyAgICAgKiBpbnRvIHRoZSBpc3N1ZV9xdWV1ZSAodmlhIHNjc2lfZG9uZSgpKSwgdGhlIGFib3J0ZWQgY29tbWFuZHMgYXJlCisgICAgICogcmVtZW1iZXJlZCBpbiBsb2NhbCB2YXJpYWJsZXMgZmlyc3QuCisgICAgICovCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIGNvbm5lY3RlZCA9IChTY3NpX0NtbmQgKilob3N0ZGF0YS0+Y29ubmVjdGVkOworICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworICAgIGRpc2Nvbm5lY3RlZF9xdWV1ZSA9IChTY3NpX0NtbmQgKilob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOworICAgIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUgPSBOVUxMOworI2lmZGVmIFNVUFBPUlRfVEFHUworICAgIGZyZWVfYWxsX3RhZ3MoKTsKKyNlbmRpZgorICAgIGZvciggaSA9IDA7IGkgPCA4OyArK2kgKQorCWhvc3RkYXRhLT5idXN5W2ldID0gMDsKKyNpZmRlZiBSRUFMX0RNQQorICAgIGhvc3RkYXRhLT5kbWFfbGVuID0gMDsKKyNlbmRpZgorICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIC8qIEluIG9yZGVyIHRvIHRlbGwgdGhlIG1pZC1sZXZlbCBjb2RlIHdoaWNoIGNvbW1hbmRzIHdlcmUgYWJvcnRlZCwgCisgICAgICogc2V0IHRoZSBjb21tYW5kIHN0YXR1cyB0byBESURfUkVTRVQgYW5kIGNhbGwgc2NzaV9kb25lKCkgISEhCisgICAgICogVGhpcyB1bHRpbWF0ZWx5IGFib3J0cyBwcm9jZXNzaW5nIG9mIHRoZXNlIGNvbW1hbmRzIGluIHRoZSBtaWQtbGV2ZWwuCisgICAgICovCisKKyAgICBpZiAoKGNtZCA9IGNvbm5lY3RlZCkpIHsKKwlBQlJUX1BSSU5USygic2NzaSVkOiByZXNldCBhYm9ydGVkIGEgY29ubmVjdGVkIGNvbW1hbmRcbiIsIEhfTk8oY21kKSk7CisJY21kLT5yZXN1bHQgPSAoY21kLT5yZXN1bHQgJiAweGZmZmYpIHwgKERJRF9SRVNFVCA8PCAxNik7CisJY21kLT5zY3NpX2RvbmUoIGNtZCApOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IChjbWQgPSBkaXNjb25uZWN0ZWRfcXVldWUpOyArK2kpIHsKKwlkaXNjb25uZWN0ZWRfcXVldWUgPSBORVhUKGNtZCk7CisJTkVYVChjbWQpID0gTlVMTDsKKwljbWQtPnJlc3VsdCA9IChjbWQtPnJlc3VsdCAmIDB4ZmZmZikgfCAoRElEX1JFU0VUIDw8IDE2KTsKKwljbWQtPnNjc2lfZG9uZSggY21kICk7CisgICAgfQorICAgIGlmIChpID4gMCkKKwlBQlJUX1BSSU5USygic2NzaTogcmVzZXQgYWJvcnRlZCAlZCBkaXNjb25uZWN0ZWQgY29tbWFuZChzKVxuIiwgaSk7CisKKworICAgIC8qIHNpbmNlIGFsbCBjb21tYW5kcyBoYXZlIGJlZW4gZXhwbGljaXRseSB0ZXJtaW5hdGVkLCB3ZSBuZWVkIHRvIHRlbGwKKyAgICAgKiB0aGUgbWlkbGV2ZWwgY29kZSB0aGF0IHRoZSByZXNldCB3YXMgU1VDQ0VTU0ZVTCwgYW5kIHRoZXJlIGlzIG5vIAorICAgICAqIG5lZWQgdG8gJ3dha2UgdXAnIHRoZSBjb21tYW5kcyBieSBhIHJlcXVlc3Rfc2Vuc2UKKyAgICAgKi8KKyAgICByZXR1cm4gU0NTSV9SRVNFVF9TVUNDRVNTIHwgU0NTSV9SRVNFVF9CVVNfUkVTRVQ7CisjZWxzZSAvKiAxICovCisKKyAgICAvKiBNU2NoOiBuZXctc3R5bGUgcmVzZXQgaGFuZGxpbmc6IGxldCB0aGUgbWlkLWxldmVsIGRvIHdoYXQgaXQgY2FuICovCisKKyAgICAvKiArK2d1ZW50aGVyOiBNSUQtTEVWRUwgSVMgU1RJTEwgQlJPS0VOLgorICAgICAqIE1pZC1sZXZlbCBpcyBzdXBwb3NlZCB0byByZXF1ZXVlIGFsbCBjb21tYW5kcyB0aGF0IHdlcmUgYWN0aXZlIG9uIHRoZQorICAgICAqIHZhcmlvdXMgbG93LWxldmVsIHF1ZXVlcy4gSW4gZmFjdCBpdCBkb2VzIHRoaXMsIGJ1dCB0aGF0J3Mgbm90IGVub3VnaAorICAgICAqIGJlY2F1c2UgYWxsIHRoZXNlIGNvbW1hbmRzIGFyZSBzdWJqZWN0IHRvIHRpbWVvdXQuIEFuZCBpZiBhIHRpbWVvdXQKKyAgICAgKiBoYXBwZW5zIGZvciBhbnkgcmVtb3ZlZCBjb21tYW5kLCAqX2Fib3J0KCkgaXMgY2FsbGVkIGJ1dCBhbGwgcXVldWVzCisgICAgICogYXJlIG5vdyBlbXB0eS4gQWJvcnQgdGhlbiBnaXZlcyB1cCB0aGUgZmFsY29uIGxvY2ssIHdoaWNoIGlzIGZhdGFsLAorICAgICAqIHNpbmNlIHRoZSBtaWQtbGV2ZWwgd2lsbCBxdWV1ZSBtb3JlIGNvbW1hbmRzIGFuZCBtdXN0IGhhdmUgdGhlIGxvY2sKKyAgICAgKiAoaXQncyBhbGwgaGFwcGVuaW5nIGluc2lkZSB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlciEhKS4KKyAgICAgKiBFdmVuIHdvcnNlLCBhYm9ydCB3aWxsIHJldHVybiBOT1RfUlVOTklORyBmb3IgYWxsIHRob3NlIGNvbW1hbmRzIG5vdAorICAgICAqIG9uIGFueSBxdWV1ZSwgc28gdGhleSB3b24ndCBiZSByZXRyaWVkIC4uLgorICAgICAqCisgICAgICogQ29uY2x1c2lvbjogZWl0aGVyIHNjc2kuYyBkaXNhYmxlcyB0aW1lb3V0IGZvciBhbGwgcmVzZXR0ZWQgY29tbWFuZHMKKyAgICAgKiBpbW1lZGlhdGVseSwgb3Igd2UgbG9zZSEgIEFzIG9mIGxpbnV4LTIuMC4yMCBpdCBkb2Vzbid0LgorICAgICAqLworCisgICAgLyogQWZ0ZXIgdGhlIHJlc2V0LCB0aGVyZSBhcmUgbm8gbW9yZSBjb25uZWN0ZWQgb3IgZGlzY29ubmVjdGVkIGNvbW1hbmRzCisgICAgICogYW5kIG5vIGJ1c3kgdW5pdHM7IHNvIGNsZWFyIHRoZSBsb3ctbGV2ZWwgc3RhdHVzIGhlcmUgdG8gYXZvaWQgCisgICAgICogY29uZmxpY3RzIHdoZW4gdGhlIG1pZC1sZXZlbCBjb2RlIHRyaWVzIHRvIHdha2UgdXAgdGhlIGFmZmVjdGVkIAorICAgICAqIGNvbW1hbmRzIQorICAgICAqLworCisgICAgaWYgKGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSkKKwlBQlJUX1BSSU5USygic2NzaSVkOiByZXNldCBhYm9ydGVkIGlzc3VlZCBjb21tYW5kKHMpXG4iLCBIX05PKGNtZCkpOworICAgIGlmIChob3N0ZGF0YS0+Y29ubmVjdGVkKSAKKwlBQlJUX1BSSU5USygic2NzaSVkOiByZXNldCBhYm9ydGVkIGEgY29ubmVjdGVkIGNvbW1hbmRcbiIsIEhfTk8oY21kKSk7CisgICAgaWYgKGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUpCisJQUJSVF9QUklOVEsoInNjc2klZDogcmVzZXQgYWJvcnRlZCBkaXNjb25uZWN0ZWQgY29tbWFuZChzKVxuIiwgSF9OTyhjbWQpKTsKKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICBob3N0ZGF0YS0+aXNzdWVfcXVldWUgPSBOVUxMOworICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworICAgIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUgPSBOVUxMOworI2lmZGVmIFNVUFBPUlRfVEFHUworICAgIGZyZWVfYWxsX3RhZ3MoKTsKKyNlbmRpZgorICAgIGZvciggaSA9IDA7IGkgPCA4OyArK2kgKQorCWhvc3RkYXRhLT5idXN5W2ldID0gMDsKKyNpZmRlZiBSRUFMX0RNQQorICAgIGhvc3RkYXRhLT5kbWFfbGVuID0gMDsKKyNlbmRpZgorICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIC8qIHdlIGRpZCBubyBjb21wbGV0ZSByZXNldCBvZiBhbGwgY29tbWFuZHMsIHNvIGEgd2FrZXVwIGlzIHJlcXVpcmVkICovCisgICAgcmV0dXJuIFNDU0lfUkVTRVRfV0FLRVVQIHwgU0NTSV9SRVNFVF9CVVNfUkVTRVQ7CisjZW5kaWYgLyogMSAqLworfQorCisvKiBMb2NhbCBWYXJpYWJsZXM6ICovCisvKiB0YWItd2lkdGg6IDggICAgICovCisvKiBFbmQ6ICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3VuM19zY3NpLmMgYi9kcml2ZXJzL3Njc2kvc3VuM19zY3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNlYTk5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zdW4zX3Njc2kuYwpAQCAtMCwwICsxLDY0MiBAQAorLyoKKyAqIFN1bjMgU0NTSSBzdHVmZiBieSBFcmlrIFZlcmJydWdnZW4gKGVyaWtAYmlnbWFtYS54dGRuZXQubmwpCisgKgorICogU3VuMyBETUEgcm91dGluZXMgYWRkZWQgYnkgU2FtIENyZWFzZXkgKHNhbW15QHNhbW15Lm5ldCkKKyAqCisgKiBBZGFwdGVkIGZyb20gbWFjX3Njc2luZXcuYzoKKyAqLworLyoKKyAqIEdlbmVyaWMgTWFjaW50b3NoIE5DUjUzODAgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDE5OTgsIE1pY2hhZWwgU2NobWl0eiA8bXNjaG1pdHpAbGJsLmdvdj4KKyAqCisgKiBkZXJpdmVkIGluIHBhcnQgZnJvbToKKyAqLworLyoKKyAqIEdlbmVyaWMgR2VuZXJpYyBOQ1I1MzgwIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAxOTk1LCBSdXNzZWxsIEtpbmcKKyAqCisgKiBBTFBIQSBSRUxFQVNFIDEuCisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0CisgKgorICogTkNSIDUzODAgRmFtaWx5CisgKiBTQ1NJIFByb3RvY29sIENvbnRyb2xsZXIKKyAqIERhdGFib29rCisgKgorICogTkNSIE1pY3JvZWxlY3Ryb25pY3MKKyAqIDE2MzUgQWVyb3BsYXphIERyaXZlCisgKiBDb2xvcmFkbyBTcHJpbmdzLCBDTyA4MDkxNgorICogMSsgKDcxOSkgNTc4LTM0MDAKKyAqIDErICg4MDApIDMzNC01NDU0CisgKi8KKworCisvKgorICogVGhpcyBpcyBmcm9tIG1hY19zY3NpLmgsIGJ1dCBoZXksIG1heWJlIHRoaXMgaXMgdXNlZnVsIGZvciBTdW4zIHRvbyEgOikKKyAqCisgKiBPcHRpb25zIDoKKyAqCisgKiBQQVJJVFkgLSBlbmFibGUgcGFyaXR5IGNoZWNraW5nLiAgTm90IHN1cHBvcnRlZC4KKyAqCisgKiBTQ1NJMiAtIGVuYWJsZSBzdXBwb3J0IGZvciBTQ1NJLUlJIHRhZ2dlZCBxdWV1ZWluZy4gIFVudGVzdGVkLgorICoKKyAqIFVTTEVFUCAtIGVuYWJsZSBzdXBwb3J0IGZvciBkZXZpY2VzIHRoYXQgZG9uJ3QgZGlzY29ubmVjdC4gIFVudGVzdGVkLgorICovCisKKy8qCisgKiAkTG9nOiBzdW4zX05DUjUzODAuYyx2ICQKKyAqLworCisjZGVmaW5lIEFVVE9TRU5TRQorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGFzbS9zdW4zaW50cy5oPgorI2luY2x1ZGUgPGFzbS9kdm1hLmg+CisjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoaW5lcy5oPgorCisvKiBkbWEgb24hICovCisjZGVmaW5lIFJFQUxfRE1BCisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJzdW4zX3Njc2kuaCIKKyNpbmNsdWRlICJOQ1I1MzgwLmgiCisKK3N0YXRpYyB2b2lkIE5DUjUzODBfcHJpbnQoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpOworCisvKiAjZGVmaW5lIE9MRERNQSAqLworCisjZGVmaW5lIFVTRV9XUkFQUEVSCisvKiNkZWZpbmUgUkVTRVRfQk9PVCAqLworI2RlZmluZSBEUklWRVJfU0VUVVAKKworI2RlZmluZSBOREVCVUcgMAorCisvKgorICogQlVHIGNhbiBiZSB1c2VkIHRvIHRyaWdnZXIgYSBzdHJhbmdlIGNvZGUtc2l6ZSByZWxhdGVkIGhhbmcgb24gMi4xIGtlcm5lbHMKKyAqLworI2lmZGVmIEJVRworI3VuZGVmIFJFU0VUX0JPT1QKKyN1bmRlZiBEUklWRVJfU0VUVVAKKyNlbmRpZgorCisvKiAjZGVmaW5lIFNVUFBPUlRfVEFHUyAqLworCisjZGVmaW5lCUVOQUJMRV9JUlEoKQllbmFibGVfaXJxKCBJUlFfU1VOM19TQ1NJICk7IAorCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzY3NpX3N1bjNfaW50cihpbnQgaXJxLCB2b2lkICpkdW1teSwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBzdW4zc2NzaV9yZWFkKGludCByZWcpOworc3RhdGljIGlubGluZSB2b2lkIHN1bjNzY3NpX3dyaXRlKGludCByZWcsIGludCB2YWx1ZSk7CisKK3N0YXRpYyBpbnQgc2V0dXBfY2FuX3F1ZXVlID0gLTE7Cittb2R1bGVfcGFyYW0oc2V0dXBfY2FuX3F1ZXVlLCBpbnQsIDApOworc3RhdGljIGludCBzZXR1cF9jbWRfcGVyX2x1biA9IC0xOworbW9kdWxlX3BhcmFtKHNldHVwX2NtZF9wZXJfbHVuLCBpbnQsIDApOworc3RhdGljIGludCBzZXR1cF9zZ190YWJsZXNpemUgPSAtMTsKK21vZHVsZV9wYXJhbShzZXR1cF9zZ190YWJsZXNpemUsIGludCwgMCk7CisjaWZkZWYgU1VQUE9SVF9UQUdTCitzdGF0aWMgaW50IHNldHVwX3VzZV90YWdnZWRfcXVldWluZyA9IC0xOworbW9kdWxlX3BhcmFtKHNldHVwX3VzZV90YWdnZWRfcXVldWluZywgaW50LCAwKTsKKyNlbmRpZgorc3RhdGljIGludCBzZXR1cF9ob3N0aWQgPSAtMTsKK21vZHVsZV9wYXJhbShzZXR1cF9ob3N0aWQsIGludCwgMCk7CisKK3N0YXRpYyBTY3NpX0NtbmQgKnN1bjNfZG1hX3NldHVwX2RvbmUgPSBOVUxMOworCisjZGVmaW5lCUFGVEVSX1JFU0VUX0RFTEFZCShIWi8yKQorCisvKiBtcyB0byB3YWl0IGFmdGVyIGhpdHRpbmcgZG1hIHJlZ3MgKi8KKyNkZWZpbmUgU1VOM19ETUFfREVMQVkgMTAKKworLyogZHZtYSBidWZmZXIgdG8gYWxsb2NhdGUgLS0gMzJrIHNob3VsZCBob3BlZnVsbHkgYmUgbW9yZSB0aGFuIHN1ZmZpY2llbnQgKi8KKyNkZWZpbmUgU1VOM19EVk1BX0JVRlNJWkUgMHhlMDAwCisKKy8qIG1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGRvIGRtYSBvbiAqLworI2RlZmluZSBTVU4zX0RNQV9NSU5TSVpFIDEyOAorCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqc3VuM19zY3NpX3JlZ3A7CitzdGF0aWMgdm9sYXRpbGUgc3RydWN0IHN1bjNfZG1hX3JlZ3MgKmRyZWdzOworI2lmZGVmIE9MRERNQQorc3RhdGljIHVuc2lnbmVkIGNoYXIgKmRtYWJ1ZiA9IE5VTEw7IC8qIGRtYSBtZW1vcnkgYnVmZmVyICovCisjZW5kaWYKK3N0YXRpYyBzdHJ1Y3Qgc3VuM191ZGNfcmVncyAqdWRjX3JlZ3MgPSBOVUxMOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnN1bjNfZG1hX29yaWdfYWRkciA9IE5VTEw7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBzdW4zX2RtYV9vcmlnX2NvdW50ID0gMDsKK3N0YXRpYyBpbnQgc3VuM19kbWFfYWN0aXZlID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfcmVzaWR1YWwgPSAwOworCisvKgorICogTkNSIDUzODAgcmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBzdW4zc2NzaV9yZWFkKGludCByZWcpCit7CisJcmV0dXJuKCBzdW4zX3Njc2lfcmVncFtyZWddICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdW4zc2NzaV93cml0ZShpbnQgcmVnLCBpbnQgdmFsdWUpCit7CisJc3VuM19zY3NpX3JlZ3BbcmVnXSA9IHZhbHVlOworfQorCisvKiBkbWEgY29udHJvbGxlciByZWdpc3RlciBhY2Nlc3MgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgc3VuM191ZGNfcmVhZCh1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwl1bnNpZ25lZCBzaG9ydCByZXQ7CisKKwlkcmVncy0+dWRjX2FkZHIgPSBVRENfQ1NSOworCXVkZWxheShTVU4zX0RNQV9ERUxBWSk7CisJcmV0ID0gZHJlZ3MtPnVkY19kYXRhOworCXVkZWxheShTVU4zX0RNQV9ERUxBWSk7CisJCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN1bjNfdWRjX3dyaXRlKHVuc2lnbmVkIHNob3J0IHZhbCwgdW5zaWduZWQgY2hhciByZWcpCit7CisJZHJlZ3MtPnVkY19hZGRyID0gcmVnOworCXVkZWxheShTVU4zX0RNQV9ERUxBWSk7CisJZHJlZ3MtPnVkY19kYXRhID0gdmFsOworCXVkZWxheShTVU4zX0RNQV9ERUxBWSk7Cit9CisKKy8qCisgKiBYWFg6IHN0YXR1cyBkZWJ1ZworICovCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqZGVmYXVsdF9pbnN0YW5jZTsKKworLyoKKyAqIEZ1bmN0aW9uIDogaW50IHN1bjNzY3NpX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKiB0cG50KQorICoKKyAqIFB1cnBvc2UgOiBpbml0aWFsaXplcyBtYWMgTkNSNTM4MCBkcml2ZXIgYmFzZWQgb24gdGhlCisgKgljb21tYW5kIGxpbmUgLyBjb21waWxlIHRpbWUgcG9ydCBhbmQgaXJxIGRlZmluaXRpb25zLgorICoKKyAqIElucHV0cyA6IHRwbnQgLSB0ZW1wbGF0ZSBmb3IgdGhpcyBTQ1NJIGFkYXB0ZXIuCisgKgorICogUmV0dXJucyA6IDEgaWYgYSBob3N0IGFkYXB0ZXIgd2FzIGZvdW5kLCAwIGlmIG5vdC4KKyAqCisgKi8KKyAKK2ludCBzdW4zc2NzaV9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICogdHBudCkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKwlzdGF0aWMgaW50IGNhbGxlZCA9IDA7CisJc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7CisKKwkvKiBjaGVjayB0aGF0IHRoaXMgbWFjaGluZSBoYXMgYW4gb25ib2FyZCA1MzgwICovCisJc3dpdGNoKGlkcHJvbS0+aWRfbWFjaHR5cGUpIHsKKwljYXNlIFNNX1NVTjN8U01fM181MDoKKwljYXNlIFNNX1NVTjN8U01fM182MDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlpZihjYWxsZWQpCisJCXJldHVybiAwOworCisJdHBudC0+cHJvY19uYW1lID0gIlN1bjMgNTM4MCBTQ1NJIjsKKworCS8qIHNldHVwIHZhcmlhYmxlcyAqLworCXRwbnQtPmNhbl9xdWV1ZSA9CisJCShzZXR1cF9jYW5fcXVldWUgPiAwKSA/IHNldHVwX2Nhbl9xdWV1ZSA6IENBTl9RVUVVRTsKKwl0cG50LT5jbWRfcGVyX2x1biA9CisJCShzZXR1cF9jbWRfcGVyX2x1biA+IDApID8gc2V0dXBfY21kX3Blcl9sdW4gOiBDTURfUEVSX0xVTjsKKwl0cG50LT5zZ190YWJsZXNpemUgPSAKKwkJKHNldHVwX3NnX3RhYmxlc2l6ZSA+PSAwKSA/IHNldHVwX3NnX3RhYmxlc2l6ZSA6IFNHX1RBQkxFU0laRTsKKworCWlmIChzZXR1cF9ob3N0aWQgPj0gMCkKKwkJdHBudC0+dGhpc19pZCA9IHNldHVwX2hvc3RpZDsKKwllbHNlIHsKKwkJLyogdXNlIDcgYXMgZGVmYXVsdCAqLworCQl0cG50LT50aGlzX2lkID0gNzsKKwl9CisKKwlpb2FkZHIgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKElPQkFTRV9TVU4zX1NDU0ksIFBBR0VfU0laRSk7CisJc3VuM19zY3NpX3JlZ3AgPSAodW5zaWduZWQgY2hhciAqKWlvYWRkcjsKKworCWRyZWdzID0gKHN0cnVjdCBzdW4zX2RtYV9yZWdzICopKCgodW5zaWduZWQgY2hhciAqKWlvYWRkcikgKyA4KTsKKworCWlmKCh1ZGNfcmVncyA9IGR2bWFfbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3VuM191ZGNfcmVncykpKQorCSAgID09IE5VTEwpIHsKKwkgICAgIHByaW50aygiU1VOMyBTY3NpIGNvdWxkbid0IGFsbG9jYXRlIERWTUEgbWVtb3J5IVxuIik7CisJICAgICByZXR1cm4gMDsKKwl9CisjaWZkZWYgT0xERE1BCisJaWYoKGRtYWJ1ZiA9IGR2bWFfbWFsbG9jX2FsaWduKFNVTjNfRFZNQV9CVUZTSVpFLCAweDEwMDAwKSkgPT0gTlVMTCkgeworCSAgICAgcHJpbnRrKCJTVU4zIFNjc2kgY291bGRuJ3QgYWxsb2NhdGUgRFZNQSBtZW1vcnkhXG4iKTsKKwkgICAgIHJldHVybiAwOworCX0KKyNlbmRpZgorI2lmZGVmIFNVUFBPUlRfVEFHUworCWlmIChzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcgPCAwKQorCQlzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcgPSBVU0VfVEFHR0VEX1FVRVVJTkc7CisjZW5kaWYKKworCWluc3RhbmNlID0gc2NzaV9yZWdpc3RlciAodHBudCwgc2l6ZW9mKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhKSk7CisJaWYoaW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJCQorCWRlZmF1bHRfaW5zdGFuY2UgPSBpbnN0YW5jZTsKKworICAgICAgICBpbnN0YW5jZS0+aW9fcG9ydCA9ICh1bnNpZ25lZCBsb25nKSBpb2FkZHI7CisJaW5zdGFuY2UtPmlycSA9IElSUV9TVU4zX1NDU0k7CisKKwlOQ1I1MzgwX2luaXQoaW5zdGFuY2UsIDApOworCisJaW5zdGFuY2UtPm5faW9fcG9ydCA9IDMyOworCisgICAgICAgICgoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKilpbnN0YW5jZS0+aG9zdGRhdGEpLT5jdHJsID0gMDsKKworCWlmIChyZXF1ZXN0X2lycShpbnN0YW5jZS0+aXJxLCBzY3NpX3N1bjNfaW50ciwKKwkJCSAgICAgMCwgIlN1bjNTQ1NJLTUzODAiLCBOVUxMKSkgeworI2lmbmRlZiBSRUFMX0RNQQorCQlwcmludGsoInNjc2klZDogSVJRJWQgbm90IGZyZWUsIGludGVycnVwdHMgZGlzYWJsZWRcbiIsCisJCSAgICAgICBpbnN0YW5jZS0+aG9zdF9ubywgaW5zdGFuY2UtPmlycSk7CisJCWluc3RhbmNlLT5pcnEgPSBTQ1NJX0lSUV9OT05FOworI2Vsc2UKKwkJcHJpbnRrKCJzY3NpJWQ6IElSUSVkIG5vdCBmcmVlLCBiYWlsaW5nIG91dFxuIiwKKwkJICAgICAgIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+aXJxKTsKKwkJcmV0dXJuIDA7CisjZW5kaWYKKwl9CisJCisJcHJpbnRrKCJzY3NpJWQ6IFN1bjMgNTM4MCBhdCBwb3J0ICVsWCBpcnEiLCBpbnN0YW5jZS0+aG9zdF9ubywgaW5zdGFuY2UtPmlvX3BvcnQpOworCWlmIChpbnN0YW5jZS0+aXJxID09IFNDU0lfSVJRX05PTkUpCisJCXByaW50ayAoInMgZGlzYWJsZWQiKTsKKwllbHNlCisJCXByaW50ayAoIiAlZCIsIGluc3RhbmNlLT5pcnEpOworCXByaW50aygiIG9wdGlvbnMgQ0FOX1FVRVVFPSVkIENNRF9QRVJfTFVOPSVkIHJlbGVhc2U9JWQiLAorCSAgICAgICBpbnN0YW5jZS0+Y2FuX3F1ZXVlLCBpbnN0YW5jZS0+Y21kX3Blcl9sdW4sCisJICAgICAgIFNVTjNTQ1NJX1BVQkxJQ19SRUxFQVNFKTsKKwlwcmludGsoIlxuc2NzaSVkOiIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwlOQ1I1MzgwX3ByaW50X29wdGlvbnMoaW5zdGFuY2UpOworCXByaW50aygiXG4iKTsKKworCWRyZWdzLT5jc3IgPSAwOworCXVkZWxheShTVU4zX0RNQV9ERUxBWSk7CisJZHJlZ3MtPmNzciA9IENTUl9TQ1NJIHwgQ1NSX0ZJRk8gfCBDU1JfSU5UUjsKKwl1ZGVsYXkoU1VOM19ETUFfREVMQVkpOworCWRyZWdzLT5maWZvX2NvdW50ID0gMDsKKworCWNhbGxlZCA9IDE7CisKKyNpZmRlZiBSRVNFVF9CT09UCisJc3VuM19zY3NpX3Jlc2V0X2Jvb3QoaW5zdGFuY2UpOworI2VuZGlmCisKKwlyZXR1cm4gMTsKK30KKworaW50IHN1bjNzY3NpX3JlbGVhc2UgKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCWlmIChzaHBudC0+aXJxICE9IFNDU0lfSVJRX05PTkUpCisJCWZyZWVfaXJxIChzaHBudC0+aXJxLCBOVUxMKTsKKworCWlvdW5tYXAoKHZvaWQgKilzdW4zX3Njc2lfcmVncCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFJFU0VUX0JPT1QKKy8qCisgKiBPdXIgJ2J1cyByZXNldCBvbiBib290JyBmdW5jdGlvbgorICovCisKK3N0YXRpYyB2b2lkIHN1bjNfc2NzaV9yZXNldF9ib290KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworCXVuc2lnbmVkIGxvbmcgZW5kOworCisJTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisJTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisJCisJLyoKKwkgKiBEbyBhIFNDU0kgcmVzZXQgdG8gY2xlYW4gdXAgdGhlIGJ1cyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIE5vCisJICogbWVzc2luZyB3aXRoIHRoZSBxdWV1ZXMsIGludGVycnVwdHMsIG9yIGxvY2tzIG5lY2Vzc2FyeSBoZXJlLgorCSAqLworCisJcHJpbnRrKCAiU3VuMyBTQ1NJOiByZXNldHRpbmcgdGhlIFNDU0kgYnVzLi4uIiApOworCisJLyogc3dpdGNoIG9mZiBTQ1NJIElSUSAtIGNhdGNoIGFuIGludGVycnVwdCB3aXRob3V0IElSUSBiaXQgc2V0IGVsc2UgKi8KKy8vICAgICAgIAlzdW4zX2Rpc2FibGVfaXJxKCBJUlFfU1VOM19TQ1NJICk7CisKKwkvKiBnZXQgaW4gcGhhc2UgKi8KKwlOQ1I1MzgwX3dyaXRlKCBUQVJHRVRfQ09NTUFORF9SRUcsCisJCSAgICAgIFBIQVNFX1NSX1RPX1RDUiggTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICkpOworCisJLyogYXNzZXJ0IFJTVCAqLworCU5DUjUzODBfd3JpdGUoIElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX1JTVCApOworCisJLyogVGhlIG1pbi4gcmVzZXQgaG9sZCB0aW1lIGlzIDI1dXMsIHNvIDQwdXMgc2hvdWxkIGJlIGVub3VnaCAqLworCXVkZWxheSggNTAgKTsKKworCS8qIHJlc2V0IFJTVCBhbmQgaW50ZXJydXB0ICovCisJTkNSNTM4MF93cml0ZSggSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSApOworCU5DUjUzODBfcmVhZCggUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcgKTsKKworCWZvciggZW5kID0gamlmZmllcyArIEFGVEVSX1JFU0VUX0RFTEFZOyB0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmQpOyApCisJCWJhcnJpZXIoKTsKKworCS8qIHN3aXRjaCBvbiBTQ1NJIElSUSBhZ2FpbiAqLworLy8gICAgICAgCXN1bjNfZW5hYmxlX2lycSggSVJRX1NVTjNfU0NTSSApOworCisJcHJpbnRrKCAiIGRvbmVcbiIgKTsKK30KKyNlbmRpZgorCitjb25zdCBjaGFyICogc3VuM3Njc2lfaW5mbyAoc3RydWN0IFNjc2lfSG9zdCAqc3BudCkgeworICAgIHJldHVybiAiIjsKK30KKworLy8gc2FmZSBiaXRzIGZvciB0aGUgQ1NSCisjZGVmaW5lIENTUl9HT09EIDB4MDYwZgorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NzaV9zdW4zX2ludHIoaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBjc3IgPSBkcmVncy0+Y3NyOworCWludCBoYW5kbGVkID0gMDsKKworCWlmKGNzciAmIH5DU1JfR09PRCkgeworCQlpZihjc3IgJiBDU1JfRE1BX0JVU0VSUikgeworCQkJcHJpbnRrKCJzY3NpJWQ6IGJ1cyBlcnJvciBpbiBkbWFcbiIsIGRlZmF1bHRfaW5zdGFuY2UtPmhvc3Rfbm8pOworCQl9CisKKwkJaWYoY3NyICYgQ1NSX0RNQV9DT05GTElDVCkgeworCQkJcHJpbnRrKCJzY3NpJWQ6IGRtYSBjb25mbGljdFxuIiwgZGVmYXVsdF9pbnN0YW5jZS0+aG9zdF9ubyk7CisJCX0KKwkJaGFuZGxlZCA9IDE7CisJfQorCisJaWYoY3NyICYgKENTUl9TREJfSU5UIHwgQ1NSX0RNQV9JTlQpKSB7CisJCU5DUjUzODBfaW50cihpcnEsIGR1bW15LCBmcCk7CisJCWhhbmRsZWQgPSAxOworCX0KKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKgorICogRGVidWcgc3R1ZmYgLSB0byBiZSBjYWxsZWQgb24gTk1JLCBvciBzeXNycSBrZXkuIFVzZSBhdCB5b3VyIG93biByaXNrOyAKKyAqIHJlZW50ZXJpbmcgTkNSNTM4MF9wcmludF9zdGF0dXMgc2VlbXMgdG8gaGF2ZSB1Z2x5IHNpZGUgZWZmZWN0cworICovCisKKy8qIHRoaXMgZG9lc24ndCBzZWVtIHRvIGdldCB1c2VkIGF0IGFsbCAtLSBzYW0gKi8KKyNpZiAwCit2b2lkIHN1bjNfc3VuM19kZWJ1ZyAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCU5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworCisJaWYgKGRlZmF1bHRfaW5zdGFuY2UpIHsKKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCU5DUjUzODBfcHJpbnRfc3RhdHVzKGRlZmF1bHRfaW5zdGFuY2UpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KK30KKyNlbmRpZgorCisKKy8qIHN1bjNzY3NpX2RtYV9zZXR1cCgpIC0tIGluaXRpYWxpemUgdGhlIGRtYSBjb250cm9sbGVyIGZvciBhIHJlYWQvd3JpdGUgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN1bjNzY3NpX2RtYV9zZXR1cCh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGNvdW50LCBpbnQgd3JpdGVfZmxhZykKK3sKKyNpZmRlZiBPTERETUEKKwlpZih3cml0ZV9mbGFnKSAKKwkJbWVtY3B5KGRtYWJ1ZiwgZGF0YSwgY291bnQpOworCWVsc2UgeworCQlzdW4zX2RtYV9vcmlnX2FkZHIgPSBkYXRhOworCQlzdW4zX2RtYV9vcmlnX2NvdW50ID0gY291bnQ7CisJfQorI2Vsc2UKKwl2b2lkICphZGRyOworCisJaWYoc3VuM19kbWFfb3JpZ19hZGRyICE9IE5VTEwpCisJCWR2bWFfdW5tYXAoc3VuM19kbWFfb3JpZ19hZGRyKTsKKworLy8JYWRkciA9IHN1bjNfZHZtYV9wYWdlKCh1bnNpZ25lZCBsb25nKWRhdGEsICh1bnNpZ25lZCBsb25nKWRtYWJ1Zik7CisJYWRkciA9ICh2b2lkICopZHZtYV9tYXAoKHVuc2lnbmVkIGxvbmcpIGRhdGEsIGNvdW50KTsKKwkJCisJc3VuM19kbWFfb3JpZ19hZGRyID0gYWRkcjsKKwlzdW4zX2RtYV9vcmlnX2NvdW50ID0gY291bnQ7CisjZW5kaWYKKwlkcmVncy0+Zmlmb19jb3VudCA9IDA7CisJc3VuM191ZGNfd3JpdGUoVURDX1JFU0VULCBVRENfQ1NSKTsKKwkKKwkvKiByZXNldCBmaWZvICovCisJZHJlZ3MtPmNzciAmPSB+Q1NSX0ZJRk87CisJZHJlZ3MtPmNzciB8PSBDU1JfRklGTzsKKwkKKwkvKiBzZXQgZGlyZWN0aW9uICovCisJaWYod3JpdGVfZmxhZykKKwkJZHJlZ3MtPmNzciB8PSBDU1JfU0VORDsKKwllbHNlCisJCWRyZWdzLT5jc3IgJj0gfkNTUl9TRU5EOworCQorCS8qIGJ5dGUgY291bnQgZm9yIGZpZm8gKi8KKwlkcmVncy0+Zmlmb19jb3VudCA9IGNvdW50OworCisJc3VuM191ZGNfd3JpdGUoVURDX1JFU0VULCBVRENfQ1NSKTsKKwkKKwkvKiByZXNldCBmaWZvICovCisJZHJlZ3MtPmNzciAmPSB+Q1NSX0ZJRk87CisJZHJlZ3MtPmNzciB8PSBDU1JfRklGTzsKKwkKKwlpZihkcmVncy0+Zmlmb19jb3VudCAhPSBjb3VudCkgeyAKKwkJcHJpbnRrKCJzY3NpJWQ6IGZpZm9fbWlzbWF0Y2ggJTA0eCBub3QgJTA0eFxuIiwKKwkJICAgICAgIGRlZmF1bHRfaW5zdGFuY2UtPmhvc3Rfbm8sIGRyZWdzLT5maWZvX2NvdW50LAorCQkgICAgICAgKHVuc2lnbmVkIGludCkgY291bnQpOworCQlOQ1I1MzgwX3ByaW50KGRlZmF1bHRfaW5zdGFuY2UpOworCX0KKworCS8qIHNldHVwIHVkYyAqLworI2lmZGVmIE9MRERNQQorCXVkY19yZWdzLT5hZGRyX2hpID0gKChkdm1hX3Z0b2IoZG1hYnVmKSAmIDB4ZmYwMDAwKSA+PiA4KTsKKwl1ZGNfcmVncy0+YWRkcl9sbyA9IChkdm1hX3Z0b2IoZG1hYnVmKSAmIDB4ZmZmZik7CisjZWxzZQorCXVkY19yZWdzLT5hZGRyX2hpID0gKCgodW5zaWduZWQgbG9uZykoYWRkcikgJiAweGZmMDAwMCkgPj4gOCk7CisJdWRjX3JlZ3MtPmFkZHJfbG8gPSAoKHVuc2lnbmVkIGxvbmcpKGFkZHIpICYgMHhmZmZmKTsKKyNlbmRpZgorCXVkY19yZWdzLT5jb3VudCA9IGNvdW50LzI7IC8qIGNvdW50IGluIHdvcmRzICovCisJdWRjX3JlZ3MtPm1vZGVfaGkgPSBVRENfTU9ERV9ISVdPUkQ7CisJaWYod3JpdGVfZmxhZykgeworCQlpZihjb3VudCAmIDEpCisJCQl1ZGNfcmVncy0+Y291bnQrKzsKKwkJdWRjX3JlZ3MtPm1vZGVfbG8gPSBVRENfTU9ERV9MU0VORDsKKwkJdWRjX3JlZ3MtPnJzZWwgPSBVRENfUlNFTF9TRU5EOworCX0gZWxzZSB7CisJCXVkY19yZWdzLT5tb2RlX2xvID0gVURDX01PREVfTFJFQ1Y7CisJCXVkY19yZWdzLT5yc2VsID0gVURDX1JTRUxfUkVDVjsKKwl9CisJCisJLyogYW5ub3VuY2UgbG9jYXRpb24gb2YgcmVncyBibG9jayAqLworCXN1bjNfdWRjX3dyaXRlKCgoZHZtYV92dG9iKHVkY19yZWdzKSAmIDB4ZmYwMDAwKSA+PiA4KSwKKwkJICAgICAgIFVEQ19DSE5fSEkpOyAKKworCXN1bjNfdWRjX3dyaXRlKChkdm1hX3Z0b2IodWRjX3JlZ3MpICYgMHhmZmZmKSwgVURDX0NITl9MTyk7CisKKwkvKiBzZXQgZG1hIG1hc3RlciBvbiAqLworCXN1bjNfdWRjX3dyaXRlKDB4ZCwgVURDX01PREUpOworCisJLyogaW50ZXJydXB0IGVuYWJsZSAqLworCXN1bjNfdWRjX3dyaXRlKFVEQ19JTlRfRU5BQkxFLCBVRENfQ1NSKTsKKwkKKyAgICAgICAJcmV0dXJuIGNvdW50OworCit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzdW4zc2NzaV9kbWFfY291bnQoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisJdW5zaWduZWQgc2hvcnQgcmVzaWQ7CisKKwlkcmVncy0+dWRjX2FkZHIgPSAweDMyOyAKKwl1ZGVsYXkoU1VOM19ETUFfREVMQVkpOworCXJlc2lkID0gZHJlZ3MtPnVkY19kYXRhOworCXVkZWxheShTVU4zX0RNQV9ERUxBWSk7CisJcmVzaWQgKj0gMjsKKworCXJldHVybiAodW5zaWduZWQgbG9uZykgcmVzaWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzdW4zc2NzaV9kbWFfcmVzaWR1YWwoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisJcmV0dXJuIGxhc3RfcmVzaWR1YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzdW4zc2NzaV9kbWFfeGZlcl9sZW4odW5zaWduZWQgbG9uZyB3YW50ZWQsIFNjc2lfQ21uZCAqY21kLAorCQkJCSAgICBpbnQgd3JpdGVfZmxhZykKK3sKKwlpZihjbWQtPnJlcXVlc3QtPmZsYWdzICYgUkVRX0NNRCkKKyAJCXJldHVybiB3YW50ZWQ7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3VuM3Njc2lfZG1hX3N0YXJ0KHVuc2lnbmVkIGxvbmcgY291bnQsIHVuc2lnbmVkIGNoYXIgKmRhdGEpCit7CisKKyAgICBzdW4zX3VkY193cml0ZShVRENfQ0hOX1NUQVJULCBVRENfQ1NSKTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworLyogY2xlYW4gdXAgYWZ0ZXIgb3VyIGRtYSBpcyBkb25lICovCitzdGF0aWMgaW50IHN1bjNzY3NpX2RtYV9maW5pc2goaW50IHdyaXRlX2ZsYWcpCit7CisJdW5zaWduZWQgc2hvcnQgY291bnQ7CisJdW5zaWduZWQgc2hvcnQgZmlmbzsKKwlpbnQgcmV0ID0gMDsKKwkKKwlzdW4zX2RtYV9hY3RpdmUgPSAwOworI2lmIDEKKwkvLyBjaGVjayB0byBlbXB0eSB0aGUgZmlmbyBvbiBhIHJlYWQKKwlpZighd3JpdGVfZmxhZykgeworCQlpbnQgdG1vID0gMjAwMDA7IC8qIC4yIHNlYyAqLworCQkKKwkJd2hpbGUoMSkgeworCQkJaWYoZHJlZ3MtPmNzciAmIENTUl9GSUZPX0VNUFRZKQorCQkJCWJyZWFrOworCisJCQlpZigtLXRtbyA8PSAwKSB7CisJCQkJcHJpbnRrKCJzdW4zc2NzaTogZmlmbyBmYWlsZWQgdG8gZW1wdHkhXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCXVkZWxheSgxMCk7CisJCX0KKwl9CisJCQorI2VuZGlmCisKKwljb3VudCA9IHN1bjNzY3NpX2RtYV9jb3VudChkZWZhdWx0X2luc3RhbmNlKTsKKyNpZmRlZiBPTERETUEKKworCS8qIGlmIHdlJ3ZlIGZpbmlzaGVkIGEgcmVhZCwgY29weSBvdXQgdGhlIGRhdGEgd2UgcmVhZCAqLworIAlpZihzdW4zX2RtYV9vcmlnX2FkZHIpIHsKKwkJLyogY2hlY2sgZm9yIHJlc2lkdWFsIGJ5dGVzIGFmdGVyIGRtYSBlbmQgKi8KKwkJaWYoY291bnQgJiYgKE5DUjUzODBfcmVhZChCVVNfQU5EX1NUQVRVU19SRUcpICYKKwkJCSAgICAgKEJBU1JfUEhBU0VfTUFUQ0ggfCBCQVNSX0FDSykpKSB7CisJCQlwcmludGsoInNjc2klZDogc3VuM19zY3NpX2ZpbmlzaDogcmVhZCBvdmVycnVuIGJhYnkuLi4gIiwgZGVmYXVsdF9pbnN0YW5jZS0+aG9zdF9ubyk7CisJCQlwcmludGsoImJhc3Igbm93ICUwMnhcbiIsIE5DUjUzODBfcmVhZChCVVNfQU5EX1NUQVRVU19SRUcpKTsKKwkJCXJldCA9IGNvdW50OworCQl9CisJCQorCQkvKiBjb3B5IGluIHdoYXQgd2UgZG1hJ2Qgbm8gbWF0dGVyIHdoYXQgKi8KKwkJbWVtY3B5KHN1bjNfZG1hX29yaWdfYWRkciwgZG1hYnVmLCBzdW4zX2RtYV9vcmlnX2NvdW50KTsKKwkJc3VuM19kbWFfb3JpZ19hZGRyID0gTlVMTDsKKworCX0KKyNlbHNlCisKKwlmaWZvID0gZHJlZ3MtPmZpZm9fY291bnQ7CisJbGFzdF9yZXNpZHVhbCA9IGZpZm87CisKKwkvKiBlbXB0eSBieXRlcyBmcm9tIHRoZSBmaWZvIHdoaWNoIGRpZG4ndCBtYWtlIGl0ICovCisJaWYoKCF3cml0ZV9mbGFnKSAmJiAoY291bnQgLSBmaWZvKSA9PSAyKSB7CisJCXVuc2lnbmVkIHNob3J0IGRhdGE7CisJCXVuc2lnbmVkIGNoYXIgKnZhZGRyOworCisJCWRhdGEgPSBkcmVncy0+Zmlmb19kYXRhOworCQl2YWRkciA9ICh1bnNpZ25lZCBjaGFyICopZHZtYV9idG92KHN1bjNfZG1hX29yaWdfYWRkcik7CisJCQorCQl2YWRkciArPSAoc3VuM19kbWFfb3JpZ19jb3VudCAtIGZpZm8pOworCisJCXZhZGRyWy0yXSA9IChkYXRhICYgMHhmZjAwKSA+PiA4OworCQl2YWRkclstMV0gPSAoZGF0YSAmIDB4ZmYpOworCX0KKworCWR2bWFfdW5tYXAoc3VuM19kbWFfb3JpZ19hZGRyKTsKKwlzdW4zX2RtYV9vcmlnX2FkZHIgPSBOVUxMOworI2VuZGlmCisJc3VuM191ZGNfd3JpdGUoVURDX1JFU0VULCBVRENfQ1NSKTsKKwlkcmVncy0+Zmlmb19jb3VudCA9IDA7CisJZHJlZ3MtPmNzciAmPSB+Q1NSX1NFTkQ7CisKKwkvKiByZXNldCBmaWZvICovCisJZHJlZ3MtPmNzciAmPSB+Q1NSX0ZJRk87CisJZHJlZ3MtPmNzciB8PSBDU1JfRklGTzsKKwkKKwlzdW4zX2RtYV9zZXR1cF9kb25lID0gTlVMTDsKKworCXJldHVybiByZXQ7CisKK30KKwkKKyNpbmNsdWRlICJzdW4zX05DUjUzODAuYyIKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLm5hbWUJCQk9IFNVTjNfU0NTSV9OQU1FLAorCS5kZXRlY3QJCQk9IHN1bjNzY3NpX2RldGVjdCwKKwkucmVsZWFzZQkJPSBzdW4zc2NzaV9yZWxlYXNlLAorCS5pbmZvCQkJPSBzdW4zc2NzaV9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gc3VuM3Njc2lfcXVldWVfY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlciAgICAgIAk9IHN1bjNzY3NpX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlciAgCT0gc3VuM3Njc2lfYnVzX3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gQ0FOX1FVRVVFLAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSBTR19UQUJMRVNJWkUsCisJLmNtZF9wZXJfbHVuCQk9IENNRF9QRVJfTFVOLAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcKK307CisKKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdW4zX3Njc2kuaCBiL2RyaXZlcnMvc2NzaS9zdW4zX3Njc2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTUyODJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N1bjNfc2NzaS5oCkBAIC0wLDAgKzEsMzc5IEBACisvKgorICogU3VuMyBTQ1NJIHN0dWZmIGJ5IEVyaWsgVmVyYnJ1Z2dlbiAoZXJpa0BiaWdtYW1hLnh0ZG5ldC5ubCkKKyAqCisgKiBTdW4zIERNQSBhZGRpdGlvbnMgYnkgU2FtIENyZWFzZXkgKHNhbW15QHNhbW15Lm5ldCkKKyAqCisgKiBBZGFwdGVkIGZyb20gbWFjX3Njc2luZXcuaDoKKyAqLworLyoKKyAqIEN1bWFuYSBHZW5lcmljIE5DUjUzODAgZHJpdmVyIGRlZmluZXMKKyAqCisgKiBDb3B5cmlnaHQgMTk5MywgRHJldyBFY2toYXJkdAorICoJVmlzaW9uYXJ5IENvbXB1dGluZworICoJKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyAqCWRyZXdAY29sb3JhZG8uZWR1CisgKiAgICAgICsxICgzMDMpIDQ0MC00ODk0CisgKgorICogQUxQSEEgUkVMRUFTRSAxLgorICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgY29uc3VsdAorICoKKyAqIE5DUiA1MzgwIEZhbWlseQorICogU0NTSSBQcm90b2NvbCBDb250cm9sbGVyCisgKiBEYXRhYm9vaworICoKKyAqIE5DUiBNaWNyb2VsZWN0cm9uaWNzCisgKiAxNjM1IEFlcm9wbGF6YSBEcml2ZQorICogQ29sb3JhZG8gU3ByaW5ncywgQ08gODA5MTYKKyAqIDErICg3MTkpIDU3OC0zNDAwCisgKiAxKyAoODAwKSAzMzQtNTQ1NAorICovCisKKy8qCisgKiAkTG9nOiBjdW1hbmFfTkNSNTM4MC5oLHYgJAorICovCisKKyNpZm5kZWYgU1VOM19OQ1I1MzgwX0gKKyNkZWZpbmUgU1VOM19OQ1I1MzgwX0gKKworI2RlZmluZSBTVU4zU0NTSV9QVUJMSUNfUkVMRUFTRSAxCisKKy8qCisgKiBJbnQ6IGxldmVsIDIgYXV0b3ZlY3RvcgorICogSU86IHR5cGUgMSwgYmFzZSAweDAwMTQwMDAwLCA1IGJpdHMgcGh5cyBzcGFjZTogQTw0Li4wPgorICovCisjZGVmaW5lIElSUV9TVU4zX1NDU0kgMgorI2RlZmluZSBJT0JBU0VfU1VOM19TQ1NJIDB4MDAxNDAwMDAKKworI2RlZmluZSBJT0JBU0VfU1VOM19WTUVTQ1NJIDB4ZmYyMDAwMDAKKworc3RhdGljIGludCBzdW4zc2NzaV9hYm9ydCAoU2NzaV9DbW5kICopOworc3RhdGljIGludCBzdW4zc2NzaV9kZXRlY3QgKFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICpzdW4zc2NzaV9pbmZvIChzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIGludCBzdW4zc2NzaV9idXNfcmVzZXQoU2NzaV9DbW5kICopOworc3RhdGljIGludCBzdW4zc2NzaV9xdWV1ZV9jb21tYW5kIChTY3NpX0NtbmQgKiwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSk7CitzdGF0aWMgaW50IHN1bjNzY3NpX3JlbGVhc2UgKHN0cnVjdCBTY3NpX0hvc3QgKik7CisKKyNpZm5kZWYgQ01EX1BFUl9MVU4KKyNkZWZpbmUgQ01EX1BFUl9MVU4gMgorI2VuZGlmCisKKyNpZm5kZWYgQ0FOX1FVRVVFCisjZGVmaW5lIENBTl9RVUVVRSAxNgorI2VuZGlmCisKKyNpZm5kZWYgU0dfVEFCTEVTSVpFCisjZGVmaW5lIFNHX1RBQkxFU0laRSBTR19OT05FCisjZW5kaWYKKworI2lmbmRlZiBNQVhfVEFHUworI2RlZmluZSBNQVhfVEFHUyAzMgorI2VuZGlmCisKKyNpZm5kZWYgVVNFX1RBR0dFRF9RVUVVSU5HCisjZGVmaW5lCVVTRV9UQUdHRURfUVVFVUlORyAxCisjZW5kaWYKKworI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgorCisjaWZkZWYgU1VOM19TQ1NJX1ZNRQorI2RlZmluZSBTVU4zX1NDU0lfTkFNRSAiU3VuMyBOQ1I1MzgwIFZNRSBTQ1NJIgorI2Vsc2UKKyNkZWZpbmUgU1VOM19TQ1NJX05BTUUgIlN1bjMgTkNSNTM4MCBTQ1NJIgorI2VuZGlmCisKKyNpZm5kZWYgSE9TVFNfQworCisjZGVmaW5lIE5DUjUzODBfaW1wbGVtZW50YXRpb25fZmllbGRzIFwKKyAgICBpbnQgcG9ydCwgY3RybAorCisjZGVmaW5lIE5DUjUzODBfbG9jYWxfZGVjbGFyZSgpIFwKKyAgICAgICAgc3RydWN0IFNjc2lfSG9zdCAqX2luc3RhbmNlCisKKyNkZWZpbmUgTkNSNTM4MF9zZXR1cChpbnN0YW5jZSkgXAorICAgICAgICBfaW5zdGFuY2UgPSBpbnN0YW5jZQorCisjZGVmaW5lIE5DUjUzODBfcmVhZChyZWcpIHN1bjNzY3NpX3JlYWQocmVnKQorI2RlZmluZSBOQ1I1MzgwX3dyaXRlKHJlZywgdmFsdWUpIHN1bjNzY3NpX3dyaXRlKHJlZywgdmFsdWUpCisKKyNkZWZpbmUgTkNSNTM4MF9pbnRyIHN1bjNzY3NpX2ludHIKKyNkZWZpbmUgTkNSNTM4MF9xdWV1ZV9jb21tYW5kIHN1bjNzY3NpX3F1ZXVlX2NvbW1hbmQKKyNkZWZpbmUgTkNSNTM4MF9idXNfcmVzZXQgc3VuM3Njc2lfYnVzX3Jlc2V0CisjZGVmaW5lIE5DUjUzODBfYWJvcnQgc3VuM3Njc2lfYWJvcnQKKyNkZWZpbmUgTkNSNTM4MF9wcm9jX2luZm8gc3VuM3Njc2lfcHJvY19pbmZvCisjZGVmaW5lIE5DUjUzODBfZG1hX3hmZXJfbGVuKGksIGNtZCwgcGhhc2UpIFwKKyAgICAgICAgc3VuM3Njc2lfZG1hX3hmZXJfbGVuKGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwsY21kLCgocGhhc2UpICYgU1JfSU8pID8gMCA6IDEpCisKKyNkZWZpbmUgTkNSNTM4MF9kbWFfd3JpdGVfc2V0dXAoaW5zdGFuY2UsIGRhdGEsIGNvdW50KSBzdW4zc2NzaV9kbWFfc2V0dXAoZGF0YSwgY291bnQsIDEpCisjZGVmaW5lIE5DUjUzODBfZG1hX3JlYWRfc2V0dXAoaW5zdGFuY2UsIGRhdGEsIGNvdW50KSBzdW4zc2NzaV9kbWFfc2V0dXAoZGF0YSwgY291bnQsIDApCisjZGVmaW5lIE5DUjUzODBfZG1hX3Jlc2lkdWFsIHN1bjNzY3NpX2RtYV9yZXNpZHVhbAorCisjZGVmaW5lIEJPQVJEX05PUk1BTAkwCisjZGVmaW5lIEJPQVJEX05DUjUzQzQwMAkxCisKKy8qIGFkZGl0aW9uYWwgcmVnaXN0ZXJzIC0gbWFpbmx5IERNQSBjb250cm9sIHJlZ3MgKi8KKy8qIHRoZXNlIHN0YXJ0IGF0IHJlZ2Jhc2UgKyA4IC0tIGRpcmVjdGx5IGFmdGVyIHRoZSBOQ1IgcmVncyAqLworc3RydWN0IHN1bjNfZG1hX3JlZ3MgeworCXVuc2lnbmVkIHNob3J0IGRtYV9hZGRyX2hpOyAvKiB2bWUgb25seSAqLworCXVuc2lnbmVkIHNob3J0IGRtYV9hZGRyX2xvOyAvKiB2bWUgb25seSAqLworCXVuc2lnbmVkIHNob3J0IGRtYV9jb3VudF9oaTsgLyogdm1lIG9ubHkgKi8KKwl1bnNpZ25lZCBzaG9ydCBkbWFfY291bnRfbG87IC8qIHZtZSBvbmx5ICovCisJdW5zaWduZWQgc2hvcnQgdWRjX2RhdGE7IC8qIHVkYyBkbWEgZGF0YSByZWcgKG9iaW8gb25seSkgKi8KKwl1bnNpZ25lZCBzaG9ydCB1ZGNfYWRkcjsgLyogdWRhIGRtYSBhZGRyIHJlZyAob2JpbyBvbmx5KSAqLworCXVuc2lnbmVkIHNob3J0IGZpZm9fZGF0YTsgLyogZmlmbyBkYXRhIHJlZywgaG9sZHMgZXh0cmEgYnl0ZSBvbgorCQkJCSAgICAgb2RkIGRtYSByZWFkcyAqLworCXVuc2lnbmVkIHNob3J0IGZpZm9fY291bnQ7IAorCXVuc2lnbmVkIHNob3J0IGNzcjsgLyogY29udHJvbC9zdGF0dXMgcmVnICovCisJdW5zaWduZWQgc2hvcnQgYnBhY2tfaGk7IC8qIHZtZSBvbmx5ICovCisJdW5zaWduZWQgc2hvcnQgYnBhY2tfbG87IC8qIHZtZSBvbmx5ICovCisJdW5zaWduZWQgc2hvcnQgaXZlY3Q7IC8qIHZtZSBvbmx5ICovCisJdW5zaWduZWQgc2hvcnQgZmlmb19jb3VudF9oaTsgLyogdm1lIG9ubHkgKi8KK307CisKKy8qIHVjZCBjaGlwIHNwZWNpZmljIHJlZ3MgLSBsaXZlIGluIGR2bWEgc3BhY2UgKi8KK3N0cnVjdCBzdW4zX3VkY19yZWdzIHsKKyAgICAgdW5zaWduZWQgc2hvcnQgcnNlbDsgLyogc2VsZWN0IHJlZ3MgdG8gbG9hZCAqLworICAgICB1bnNpZ25lZCBzaG9ydCBhZGRyX2hpOyAvKiBoaWdoIHdvcmQgb2YgYWRkciAqLworICAgICB1bnNpZ25lZCBzaG9ydCBhZGRyX2xvOyAvKiBsb3cgd29yZCAqLworICAgICB1bnNpZ25lZCBzaG9ydCBjb3VudDsgLyogd29yZHMgdG8gYmUgeGZlcidkICovCisgICAgIHVuc2lnbmVkIHNob3J0IG1vZGVfaGk7IC8qIGhpZ2ggd29yZCBvZiBjaGFubmVsIG1vZGUgKi8KKyAgICAgdW5zaWduZWQgc2hvcnQgbW9kZV9sbzsgLyogbG93IHdvcmQgb2YgY2hhbm5lbCBtb2RlICovCit9OworCisvKiBhZGRyZXNzZXMgb2YgdGhlIHVkYyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgVURDX01PREUgMHgzOCAKKyNkZWZpbmUgVURDX0NTUiAweDJlIC8qIGNvbW1hbmQvc3RhdHVzICovCisjZGVmaW5lIFVEQ19DSE5fSEkgMHgyNiAvKiBjaGFpbiBoaWdoIHdvcmQgKi8KKyNkZWZpbmUgVURDX0NITl9MTyAweDIyIC8qIGNoYWluIGxvIHdvcmQgKi8KKyNkZWZpbmUgVURDX0NVUkFfSEkgMHgxYSAvKiBjdXIgcmVnIEEgaGlnaCAqLworI2RlZmluZSBVRENfQ1VSQV9MTyAweDBhIC8qIGN1ciByZWcgQSBsb3cgKi8KKyNkZWZpbmUgVURDX0NVUkJfSEkgMHgxMiAvKiBjdXIgcmVnIEIgaGlnaCAqLworI2RlZmluZSBVRENfQ1VSQl9MTyAweDAyIC8qIGN1ciByZWcgQiBsb3cgKi8KKyNkZWZpbmUgVURDX01PREVfSEkgMHg1NiAvKiBtb2RlIHJlZyBoaWdoICovCisjZGVmaW5lIFVEQ19NT0RFX0xPIDB4NTIgLyogbW9kZSByZWcgbG93ICovCisjZGVmaW5lIFVEQ19DT1VOVCAweDMyIC8qIHdvcmRzIHRvIHhmZXIgKi8KKworLyogc29tZSB1ZGMgY29tbWFuZHMgKi8KKyNkZWZpbmUgVURDX1JFU0VUIDAKKyNkZWZpbmUgVURDX0NITl9TVEFSVCAweGEwIC8qIHN0YXJ0IGNoYWluICovCisjZGVmaW5lIFVEQ19JTlRfRU5BQkxFIDB4MzIgLyogY2hhbm5lbCAxIGludCBvbiAqLworCisvKiB1ZGMgbW9kZSB3b3JkcyAqLworI2RlZmluZSBVRENfTU9ERV9ISVdPUkQgMHg0MAorI2RlZmluZSBVRENfTU9ERV9MU0VORCAweGMyCisjZGVmaW5lIFVEQ19NT0RFX0xSRUNWIDB4ZDIKKworLyogdWRjIHJlZyBzZWxlY3Rpb25zICovCisjZGVmaW5lIFVEQ19SU0VMX1NFTkQgMHgyODIKKyNkZWZpbmUgVURDX1JTRUxfUkVDViAweDE4MgorCisvKiBiaXRzIGluIGNzciByZWcgKi8KKyNkZWZpbmUgQ1NSX0RNQV9BQ1RJVkUgMHg4MDAwCisjZGVmaW5lIENTUl9ETUFfQ09ORkxJQ1QgMHg0MDAwCisjZGVmaW5lIENTUl9ETUFfQlVTRVJSIDB4MjAwMAorCisjZGVmaW5lIENTUl9GSUZPX0VNUFRZIDB4NDAwIC8qIGZpZm8gZmx1c2hlZD8gKi8KKyNkZWZpbmUgQ1NSX1NEQl9JTlQgMHgyMDAgLyogc2JjIGludGVycnVwdCBwZW5kaW5nICovCisjZGVmaW5lIENTUl9ETUFfSU5UIDB4MTAwIC8qIGRtYSBpbnRlcnJ1cHQgcGVuZGluZyAqLworCisjZGVmaW5lIENTUl9MRUZUIDB4YzAKKyNkZWZpbmUgQ1NSX0xFRlRfMyAweGMwCisjZGVmaW5lIENTUl9MRUZUXzIgMHg4MAorI2RlZmluZSBDU1JfTEVGVF8xIDB4NDAKKyNkZWZpbmUgQ1NSX1BBQ0tfRU5BQkxFIDB4MjAKKworI2RlZmluZSBDU1JfRE1BX0VOQUJMRSAweDEwCisKKyNkZWZpbmUgQ1NSX1NFTkQgMHg4IC8qIDEgPSBzZW5kICAwID0gcmVjdiAqLworI2RlZmluZSBDU1JfRklGTyAweDIgLyogcmVzZXQgZmlmbyAqLworI2RlZmluZSBDU1JfSU5UUiAweDQgLyogaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBDU1JfU0NTSSAweDEgCisKKyNkZWZpbmUgVk1FX0RBVEEyNCAweDNkMDAKKworLy8gZGVidWdnaW5nIHByaW50aydzLCB0YWtlbiBmcm9tIGF0YXJpX3Njc2kuaCAKKy8qIERlYnVnZ2luZyBwcmludGsgZGVmaW5pdGlvbnM6CisgKgorICogIEFSQiAgLT4gYXJiaXRyYXRpb24KKyAqICBBU0VOIC0+IGF1dG8tc2Vuc2UKKyAqICBETUEgIC0+IERNQQorICogIEhTSCAgLT4gUElPIGhhbmRzaGFrZQorICogIElORiAgLT4gaW5mb3JtYXRpb24gdHJhbnNmZXIKKyAqICBJTkkgIC0+IGluaXRpYWxpemF0aW9uCisgKiAgSU5UICAtPiBpbnRlcnJ1cHQKKyAqICBMTksgIC0+IGxpbmtlZCBjb21tYW5kcworICogIE1BSU4gLT4gTkNSNTM4MF9tYWluKCkgY29udHJvbCBmbG93CisgKiAgTkRBVCAtPiBubyBkYXRhLW91dCBwaGFzZQorICogIE5XUiAgLT4gbm8gd3JpdGUgY29tbWFuZHMKKyAqICBQSU8gIC0+IFBJTyB0cmFuc2ZlcnMKKyAqICBQRE1BIC0+IHBzZXVkbyBETUEgKHVudXNlZCBvbiBBdGFyaSkKKyAqICBRVSAgIC0+IHF1ZXVlcworICogIFJTTCAgLT4gcmVzZWxlY3Rpb25zCisgKiAgU0VMICAtPiBzZWxlY3Rpb25zCisgKiAgVVNMICAtPiB1c2xlZXAgY3BkZSAodW51c2VkIG9uIEF0YXJpKQorICogIExCUyAgLT4gbGFzdCBieXRlIHNlbnQgKHVudXNlZCBvbiBBdGFyaSkKKyAqICBSU1MgIC0+IHJlc3RhcnRpbmcgb2Ygc2VsZWN0aW9ucworICogIEVYVCAgLT4gZXh0ZW5kZWQgbWVzc2FnZXMKKyAqICBBQlJUIC0+IGFib3J0aW5nIGFuZCByZXNldHRpbmcKKyAqICBUQUcgIC0+IHF1ZXVlIHRhZyBoYW5kbGluZworICogIE1FUiAgLT4gbWVyZ2luZyBvZiBjb25zZWMuIGJ1ZmZlcnMKKyAqCisgKi8KKworCisKKyNpZiBOREVCVUcgJiBOREVCVUdfQVJCSVRSQVRJT04KKyNkZWZpbmUgQVJCX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgQVJCX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfQVVUT1NFTlNFCisjZGVmaW5lIEFTRU5fUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBBU0VOX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfRE1BCisjZGVmaW5lIERNQV9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIERNQV9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX0hBTkRTSEFLRQorI2RlZmluZSBIU0hfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBIU0hfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19JTkZPUk1BVElPTgorI2RlZmluZSBJTkZfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBJTkZfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19JTklUCisjZGVmaW5lIElOSV9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIElOSV9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX0lOVFIKKyNkZWZpbmUgSU5UX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgSU5UX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfTElOS0VECisjZGVmaW5lIExOS19QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIExOS19QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX01BSU4KKyNkZWZpbmUgTUFJTl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIE1BSU5fUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19OT19EQVRBT1VUCisjZGVmaW5lIE5EQVRfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBOREFUX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfTk9fV1JJVEUKKyNkZWZpbmUgTldSX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgTldSX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfUElPCisjZGVmaW5lIFBJT19QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIFBJT19QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX1BTRVVET19ETUEKKyNkZWZpbmUgUERNQV9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIFBETUFfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19RVUVVRVMKKyNkZWZpbmUgUVVfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBRVV9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX1JFU0VMRUNUSU9OCisjZGVmaW5lIFJTTF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIFJTTF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX1NFTEVDVElPTgorI2RlZmluZSBTRUxfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBTRUxfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19VU0xFRVAKKyNkZWZpbmUgVVNMX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgVVNMX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfTEFTVF9CWVRFX1NFTlQKKyNkZWZpbmUgTEJTX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgTEJTX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfUkVTVEFSVF9TRUxFQ1QKKyNkZWZpbmUgUlNTX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgUlNTX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfRVhURU5ERUQKKyNkZWZpbmUgRVhUX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRVhUX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfQUJPUlQKKyNkZWZpbmUgQUJSVF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIEFCUlRfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19UQUdTCisjZGVmaW5lIFRBR19QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIFRBR19QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX01FUkdJTkcKKyNkZWZpbmUgTUVSX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgTUVSX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworLyogY29uZGl0aW9uYWwgbWFjcm9zIGZvciBOQ1I1MzgwX3ByaW50X3sscGhhc2Usc3RhdHVzfSAqLworCisjZGVmaW5lIE5DUl9QUklOVChtYXNrKQlcCisJKChOREVCVUcgJiAobWFzaykpID8gTkNSNTM4MF9wcmludChpbnN0YW5jZSkgOiAodm9pZCkwKQorCisjZGVmaW5lIE5DUl9QUklOVF9QSEFTRShtYXNrKSBcCisJKChOREVCVUcgJiAobWFzaykpID8gTkNSNTM4MF9wcmludF9waGFzZShpbnN0YW5jZSkgOiAodm9pZCkwKQorCisjZGVmaW5lIE5DUl9QUklOVF9TVEFUVVMobWFzaykgXAorCSgoTkRFQlVHICYgKG1hc2spKSA/IE5DUjUzODBfcHJpbnRfc3RhdHVzKGluc3RhbmNlKSA6ICh2b2lkKTApCisKKworCisjZW5kaWYgLyogbmRlZiBIT1NUU19DICovCisjZW5kaWYgLyogU1VOM19OQ1I1MzgwX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N1bjNfc2NzaV92bWUuYyBiL2RyaXZlcnMvc2NzaS9zdW4zX3Njc2lfdm1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjYjVkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zdW4zX3Njc2lfdm1lLmMKQEAgLTAsMCArMSw1ODQgQEAKKyAvKgorICogU3VuMyBTQ1NJIHN0dWZmIGJ5IEVyaWsgVmVyYnJ1Z2dlbiAoZXJpa0BiaWdtYW1hLnh0ZG5ldC5ubCkKKyAqCisgKiBTdW4zIERNQSByb3V0aW5lcyBhZGRlZCBieSBTYW0gQ3JlYXNleSAoc2FtbXlAc2FtbXkubmV0KQorICoKKyAqIFZNRSBzdXBwb3J0IGFkZGVkIGJ5IFNhbSBDcmVhc2V5CisgKgorICogQWRhcHRlZCBmcm9tIHN1bjNfc2NzaS5jIC0tIHNlZSB0aGVyZSBmb3Igb3RoZXIgaGVhZGVycworICoKKyAqIFRPRE86IG1vZGlmeSB0aGlzIGRyaXZlciB0byBzdXBwb3J0IG11bHRpcGxlIFN1bjMgU0NTSSBWTUUgYm9hcmRzCisgKgorICovCisKKyNkZWZpbmUgQVVUT1NFTlNFCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8YXNtL3N1bjNpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2R2bWEuaD4KKyNpbmNsdWRlIDxhc20vaWRwcm9tLmg+CisjaW5jbHVkZSA8YXNtL21hY2hpbmVzLmg+CisKKyNkZWZpbmUgU1VOM19TQ1NJX1ZNRQorCisjdW5kZWYgU1VOM19TQ1NJX0RFQlVHCisKKy8qIGRtYSBvbiEgKi8KKyNkZWZpbmUgUkVBTF9ETUEKKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgInN1bjNfc2NzaS5oIgorI2luY2x1ZGUgIk5DUjUzODAuaCIKKworZXh0ZXJuIGludCBzdW4zX21hcF90ZXN0KHVuc2lnbmVkIGxvbmcsIGNoYXIgKik7CisKKyNkZWZpbmUgVVNFX1dSQVBQRVIKKy8qI2RlZmluZSBSRVNFVF9CT09UICovCisjZGVmaW5lIERSSVZFUl9TRVRVUAorCisjZGVmaW5lIE5ERUJVRyAwCisKKy8qCisgKiBCVUcgY2FuIGJlIHVzZWQgdG8gdHJpZ2dlciBhIHN0cmFuZ2UgY29kZS1zaXplIHJlbGF0ZWQgaGFuZyBvbiAyLjEga2VybmVscworICovCisjaWZkZWYgQlVHCisjdW5kZWYgUkVTRVRfQk9PVAorI3VuZGVmIERSSVZFUl9TRVRVUAorI2VuZGlmCisKKy8qICNkZWZpbmUgU1VQUE9SVF9UQUdTICovCisKKy8vI2RlZmluZQlFTkFCTEVfSVJRKCkJZW5hYmxlX2lycSggU1VOM19WRUNfVk1FU0NTSTAgKTsgCisjZGVmaW5lIEVOQUJMRV9JUlEoKQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzY3NpX3N1bjNfaW50cihpbnQgaXJxLCB2b2lkICpkdW1teSwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBzdW4zc2NzaV9yZWFkKGludCByZWcpOworc3RhdGljIGlubGluZSB2b2lkIHN1bjNzY3NpX3dyaXRlKGludCByZWcsIGludCB2YWx1ZSk7CisKK3N0YXRpYyBpbnQgc2V0dXBfY2FuX3F1ZXVlID0gLTE7Cittb2R1bGVfcGFyYW0oc2V0dXBfY2FuX3F1ZXVlLCBpbnQsIDApOworc3RhdGljIGludCBzZXR1cF9jbWRfcGVyX2x1biA9IC0xOworbW9kdWxlX3BhcmFtKHNldHVwX2NtZF9wZXJfbHVuLCBpbnQsIDApOworc3RhdGljIGludCBzZXR1cF9zZ190YWJsZXNpemUgPSAtMTsKK21vZHVsZV9wYXJhbShzZXR1cF9zZ190YWJsZXNpemUsIGludCwgMCk7CisjaWZkZWYgU1VQUE9SVF9UQUdTCitzdGF0aWMgaW50IHNldHVwX3VzZV90YWdnZWRfcXVldWluZyA9IC0xOworbW9kdWxlX3BhcmFtKHNldHVwX3VzZV90YWdnZWRfcXVldWluZywgaW50LCAwKTsKKyNlbmRpZgorc3RhdGljIGludCBzZXR1cF9ob3N0aWQgPSAtMTsKK21vZHVsZV9wYXJhbShzZXR1cF9ob3N0aWQsIGludCwgMCk7CisKK3N0YXRpYyBTY3NpX0NtbmQgKnN1bjNfZG1hX3NldHVwX2RvbmUgPSBOVUxMOworCisjZGVmaW5lCUFGVEVSX1JFU0VUX0RFTEFZCShIWi8yKQorCisvKiBtcyB0byB3YWl0IGFmdGVyIGhpdHRpbmcgZG1hIHJlZ3MgKi8KKyNkZWZpbmUgU1VOM19ETUFfREVMQVkgMTAKKworLyogZHZtYSBidWZmZXIgdG8gYWxsb2NhdGUgLS0gMzJrIHNob3VsZCBob3BlZnVsbHkgYmUgbW9yZSB0aGFuIHN1ZmZpY2llbnQgKi8KKyNkZWZpbmUgU1VOM19EVk1BX0JVRlNJWkUgMHhlMDAwCisKKy8qIG1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGRvIGRtYSBvbiAqLworI2RlZmluZSBTVU4zX0RNQV9NSU5TSVpFIDEyOAorCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqc3VuM19zY3NpX3JlZ3A7CitzdGF0aWMgdm9sYXRpbGUgc3RydWN0IHN1bjNfZG1hX3JlZ3MgKmRyZWdzOworI2lmZGVmIE9MRERNQQorc3RhdGljIHVuc2lnbmVkIGNoYXIgKmRtYWJ1ZiA9IE5VTEw7IC8qIGRtYSBtZW1vcnkgYnVmZmVyICovCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpzdW4zX2RtYV9vcmlnX2FkZHIgPSBOVUxMOworc3RhdGljIHVuc2lnbmVkIGxvbmcgc3VuM19kbWFfb3JpZ19jb3VudCA9IDA7CitzdGF0aWMgaW50IHN1bjNfZG1hX2FjdGl2ZSA9IDA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X3Jlc2lkdWFsID0gMDsKKworLyoKKyAqIE5DUiA1MzgwIHJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgc3VuM3Njc2lfcmVhZChpbnQgcmVnKQoreworCXJldHVybiggc3VuM19zY3NpX3JlZ3BbcmVnXSApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3VuM3Njc2lfd3JpdGUoaW50IHJlZywgaW50IHZhbHVlKQoreworCXN1bjNfc2NzaV9yZWdwW3JlZ10gPSB2YWx1ZTsKK30KKworLyoKKyAqIFhYWDogc3RhdHVzIGRlYnVnCisgKi8KK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICpkZWZhdWx0X2luc3RhbmNlOworCisvKgorICogRnVuY3Rpb24gOiBpbnQgc3VuM3Njc2lfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqIHRwbnQpCisgKgorICogUHVycG9zZSA6IGluaXRpYWxpemVzIG1hYyBOQ1I1MzgwIGRyaXZlciBiYXNlZCBvbiB0aGUKKyAqCWNvbW1hbmQgbGluZSAvIGNvbXBpbGUgdGltZSBwb3J0IGFuZCBpcnEgZGVmaW5pdGlvbnMuCisgKgorICogSW5wdXRzIDogdHBudCAtIHRlbXBsYXRlIGZvciB0aGlzIFNDU0kgYWRhcHRlci4KKyAqCisgKiBSZXR1cm5zIDogMSBpZiBhIGhvc3QgYWRhcHRlciB3YXMgZm91bmQsIDAgaWYgbm90LgorICoKKyAqLworIAorc3RhdGljIGludCBzdW4zc2NzaV9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICogdHBudCkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciwgaXJxID0gMDsKKwlzdGF0aWMgaW50IGNhbGxlZCA9IDA7CisJc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBhZGRyc1szXSA9IHsgSU9CQVNFX1NVTjNfVk1FU0NTSSwgCisJCQkJICAgSU9CQVNFX1NVTjNfVk1FU0NTSSArIDB4NDAwMCwKKwkJCQkgICAwIH07CisJdW5zaWduZWQgbG9uZyB2ZWNzWzNdID0geyBTVU4zX1ZFQ19WTUVTQ1NJMCwKKwkJCQkgIFNVTjNfVkVDX1ZNRVNDU0kxLAorCQkJCSAgMCB9OworCS8qIGNoZWNrIHRoYXQgdGhpcyBtYWNoaW5lIGhhcyBhbiBvbmJvYXJkIDUzODAgKi8KKwlzd2l0Y2goaWRwcm9tLT5pZF9tYWNodHlwZSkgeworCWNhc2UgU01fU1VOM3xTTV8zXzE2MDoKKwljYXNlIFNNX1NVTjN8U01fM18yNjA6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJaWYoY2FsbGVkKQorCQlyZXR1cm4gMDsKKworCXRwbnQtPnByb2NfbmFtZSA9ICJTdW4zIDUzODAgVk1FIFNDU0kiOworCisJLyogc2V0dXAgdmFyaWFibGVzICovCisJdHBudC0+Y2FuX3F1ZXVlID0KKwkJKHNldHVwX2Nhbl9xdWV1ZSA+IDApID8gc2V0dXBfY2FuX3F1ZXVlIDogQ0FOX1FVRVVFOworCXRwbnQtPmNtZF9wZXJfbHVuID0KKwkJKHNldHVwX2NtZF9wZXJfbHVuID4gMCkgPyBzZXR1cF9jbWRfcGVyX2x1biA6IENNRF9QRVJfTFVOOworCXRwbnQtPnNnX3RhYmxlc2l6ZSA9IAorCQkoc2V0dXBfc2dfdGFibGVzaXplID49IDApID8gc2V0dXBfc2dfdGFibGVzaXplIDogU0dfVEFCTEVTSVpFOworCQorCWlmIChzZXR1cF9ob3N0aWQgPj0gMCkKKwkJdHBudC0+dGhpc19pZCA9IHNldHVwX2hvc3RpZDsKKwllbHNlIHsKKwkJLyogdXNlIDcgYXMgZGVmYXVsdCAqLworCQl0cG50LT50aGlzX2lkID0gNzsKKwl9CisJCisJaW9hZGRyID0gMDsKKwlmb3IoaSA9IDA7IGFkZHJzW2ldICE9IDA7IGkrKykgeworCQl1bnNpZ25lZCBjaGFyIHg7CisJCQorCQlpb2FkZHIgPSAodW5zaWduZWQgbG9uZylzdW4zX2lvcmVtYXAoYWRkcnNbaV0sIFBBR0VfU0laRSwKKwkJCQkJCSAgICAgU1VOM19QQUdFX1RZUEVfVk1FMTYpOworCQlpcnEgPSB2ZWNzW2ldOworCQlzdW4zX3Njc2lfcmVncCA9ICh1bnNpZ25lZCBjaGFyICopaW9hZGRyOworCQkKKwkJZHJlZ3MgPSAoc3RydWN0IHN1bjNfZG1hX3JlZ3MgKikoKCh1bnNpZ25lZCBjaGFyICopaW9hZGRyKSArIDgpOworCQkKKwkJaWYoc3VuM19tYXBfdGVzdCgodW5zaWduZWQgbG9uZylkcmVncywgJngpKSB7CisJCQl1bnNpZ25lZCBzaG9ydCBvbGRjc3I7CisKKwkJCW9sZGNzciA9IGRyZWdzLT5jc3I7CisJCQlkcmVncy0+Y3NyID0gMDsKKwkJCXVkZWxheShTVU4zX0RNQV9ERUxBWSk7CisJCQlpZihkcmVncy0+Y3NyID09IDB4MTQwMCkKKwkJCQlicmVhazsKKwkJCQorCQkJZHJlZ3MtPmNzciA9IG9sZGNzcjsKKwkJfQorCisJCWlvdW5tYXAoKHZvaWQgKilpb2FkZHIpOworCQlpb2FkZHIgPSAwOworCX0KKworCWlmKCFpb2FkZHIpCisJCXJldHVybiAwOworCQorI2lmZGVmIFNVUFBPUlRfVEFHUworCWlmIChzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcgPCAwKQorCQlzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcgPSBVU0VfVEFHR0VEX1FVRVVJTkc7CisjZW5kaWYKKworCWluc3RhbmNlID0gc2NzaV9yZWdpc3RlciAodHBudCwgc2l6ZW9mKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhKSk7CisJaWYoaW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJCQorCWRlZmF1bHRfaW5zdGFuY2UgPSBpbnN0YW5jZTsKKworICAgICAgICBpbnN0YW5jZS0+aW9fcG9ydCA9ICh1bnNpZ25lZCBsb25nKSBpb2FkZHI7CisJaW5zdGFuY2UtPmlycSA9IGlycTsKKworCU5DUjUzODBfaW5pdChpbnN0YW5jZSwgMCk7CisKKwlpbnN0YW5jZS0+bl9pb19wb3J0ID0gMzI7CisKKyAgICAgICAgKChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKWluc3RhbmNlLT5ob3N0ZGF0YSktPmN0cmwgPSAwOworCisJaWYgKHJlcXVlc3RfaXJxKGluc3RhbmNlLT5pcnEsIHNjc2lfc3VuM19pbnRyLAorCQkJICAgICAwLCAiU3VuM1NDU0ktNTM4MFZNRSIsIE5VTEwpKSB7CisjaWZuZGVmIFJFQUxfRE1BCisJCXByaW50aygic2NzaSVkOiBJUlElZCBub3QgZnJlZSwgaW50ZXJydXB0cyBkaXNhYmxlZFxuIiwKKwkJICAgICAgIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+aXJxKTsKKwkJaW5zdGFuY2UtPmlycSA9IFNDU0lfSVJRX05PTkU7CisjZWxzZQorCQlwcmludGsoInNjc2klZDogSVJRJWQgbm90IGZyZWUsIGJhaWxpbmcgb3V0XG4iLAorCQkgICAgICAgaW5zdGFuY2UtPmhvc3Rfbm8sIGluc3RhbmNlLT5pcnEpOworCQlyZXR1cm4gMDsKKyNlbmRpZgorCX0KKworCXByaW50aygic2NzaSVkOiBTdW4zIDUzODAgVk1FIGF0IHBvcnQgJWxYIGlycSIsIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+aW9fcG9ydCk7CisJaWYgKGluc3RhbmNlLT5pcnEgPT0gU0NTSV9JUlFfTk9ORSkKKwkJcHJpbnRrICgicyBkaXNhYmxlZCIpOworCWVsc2UKKwkJcHJpbnRrICgiICVkIiwgaW5zdGFuY2UtPmlycSk7CisJcHJpbnRrKCIgb3B0aW9ucyBDQU5fUVVFVUU9JWQgQ01EX1BFUl9MVU49JWQgcmVsZWFzZT0lZCIsCisJICAgICAgIGluc3RhbmNlLT5jYW5fcXVldWUsIGluc3RhbmNlLT5jbWRfcGVyX2x1biwKKwkgICAgICAgU1VOM1NDU0lfUFVCTElDX1JFTEVBU0UpOworCXByaW50aygiXG5zY3NpJWQ6IiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCU5DUjUzODBfcHJpbnRfb3B0aW9ucyhpbnN0YW5jZSk7CisJcHJpbnRrKCJcbiIpOworCisJZHJlZ3MtPmNzciA9IDA7CisJdWRlbGF5KFNVTjNfRE1BX0RFTEFZKTsKKwlkcmVncy0+Y3NyID0gQ1NSX1NDU0kgfCBDU1JfRklGTyB8IENTUl9JTlRSOworCXVkZWxheShTVU4zX0RNQV9ERUxBWSk7CisJZHJlZ3MtPmZpZm9fY291bnQgPSAwOworCWRyZWdzLT5maWZvX2NvdW50X2hpID0gMDsKKwlkcmVncy0+ZG1hX2FkZHJfaGkgPSAwOworCWRyZWdzLT5kbWFfYWRkcl9sbyA9IDA7CisJZHJlZ3MtPmRtYV9jb3VudF9oaSA9IDA7CisJZHJlZ3MtPmRtYV9jb3VudF9sbyA9IDA7CisKKwlkcmVncy0+aXZlY3QgPSBWTUVfREFUQTI0IHwgKGluc3RhbmNlLT5pcnEgJiAweGZmKTsKKworCWNhbGxlZCA9IDE7CisKKyNpZmRlZiBSRVNFVF9CT09UCisJc3VuM19zY3NpX3Jlc2V0X2Jvb3QoaW5zdGFuY2UpOworI2VuZGlmCisKKwlyZXR1cm4gMTsKK30KKworaW50IHN1bjNzY3NpX3JlbGVhc2UgKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCWlmIChzaHBudC0+aXJxICE9IFNDU0lfSVJRX05PTkUpCisJCWZyZWVfaXJxIChzaHBudC0+aXJxLCBOVUxMKTsKKworCWlvdW5tYXAoKHZvaWQgKilzdW4zX3Njc2lfcmVncCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFJFU0VUX0JPT1QKKy8qCisgKiBPdXIgJ2J1cyByZXNldCBvbiBib290JyBmdW5jdGlvbgorICovCisKK3N0YXRpYyB2b2lkIHN1bjNfc2NzaV9yZXNldF9ib290KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworCXVuc2lnbmVkIGxvbmcgZW5kOworCisJTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisJTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisJCisJLyoKKwkgKiBEbyBhIFNDU0kgcmVzZXQgdG8gY2xlYW4gdXAgdGhlIGJ1cyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIE5vCisJICogbWVzc2luZyB3aXRoIHRoZSBxdWV1ZXMsIGludGVycnVwdHMsIG9yIGxvY2tzIG5lY2Vzc2FyeSBoZXJlLgorCSAqLworCisJcHJpbnRrKCAiU3VuMyBTQ1NJOiByZXNldHRpbmcgdGhlIFNDU0kgYnVzLi4uIiApOworCisJLyogc3dpdGNoIG9mZiBTQ1NJIElSUSAtIGNhdGNoIGFuIGludGVycnVwdCB3aXRob3V0IElSUSBiaXQgc2V0IGVsc2UgKi8KKy8vICAgICAgIAlzdW4zX2Rpc2FibGVfaXJxKCBJUlFfU1VOM19TQ1NJICk7CisKKwkvKiBnZXQgaW4gcGhhc2UgKi8KKwlOQ1I1MzgwX3dyaXRlKCBUQVJHRVRfQ09NTUFORF9SRUcsCisJCSAgICAgIFBIQVNFX1NSX1RPX1RDUiggTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICkpOworCisJLyogYXNzZXJ0IFJTVCAqLworCU5DUjUzODBfd3JpdGUoIElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX1JTVCApOworCisJLyogVGhlIG1pbi4gcmVzZXQgaG9sZCB0aW1lIGlzIDI1dXMsIHNvIDQwdXMgc2hvdWxkIGJlIGVub3VnaCAqLworCXVkZWxheSggNTAgKTsKKworCS8qIHJlc2V0IFJTVCBhbmQgaW50ZXJydXB0ICovCisJTkNSNTM4MF93cml0ZSggSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSApOworCU5DUjUzODBfcmVhZCggUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcgKTsKKworCWZvciggZW5kID0gamlmZmllcyArIEFGVEVSX1JFU0VUX0RFTEFZOyB0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmQpOyApCisJCWJhcnJpZXIoKTsKKworCS8qIHN3aXRjaCBvbiBTQ1NJIElSUSBhZ2FpbiAqLworLy8gICAgICAgCXN1bjNfZW5hYmxlX2lycSggSVJRX1NVTjNfU0NTSSApOworCisJcHJpbnRrKCAiIGRvbmVcbiIgKTsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciAqIHN1bjNzY3NpX2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKnNwbnQpIHsKKyAgICByZXR1cm4gIiI7Cit9CisKKy8vIHNhZmUgYml0cyBmb3IgdGhlIENTUgorI2RlZmluZSBDU1JfR09PRCAweDA2MGYKKworc3RhdGljIGlycXJldHVybl90IHNjc2lfc3VuM19pbnRyKGludCBpcnEsIHZvaWQgKmR1bW15LCBzdHJ1Y3QgcHRfcmVncyAqZnApCit7CisJdW5zaWduZWQgc2hvcnQgY3NyID0gZHJlZ3MtPmNzcjsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlkcmVncy0+Y3NyICY9IH5DU1JfRE1BX0VOQUJMRTsKKworCisjaWZkZWYgU1VOM19TQ1NJX0RFQlVHCisJcHJpbnRrKCJzY3NpX2ludHIgY3NyICV4XG4iLCBjc3IpOworI2VuZGlmCisKKwlpZihjc3IgJiB+Q1NSX0dPT0QpIHsKKwkJaWYoY3NyICYgQ1NSX0RNQV9CVVNFUlIpIHsKKwkJCXByaW50aygic2NzaSVkOiBidXMgZXJyb3IgaW4gZG1hXG4iLCBkZWZhdWx0X2luc3RhbmNlLT5ob3N0X25vKTsKKyNpZmRlZiBTVU4zX1NDU0lfREVCVUcKKwkJCXByaW50aygic2NzaTogcmVzaWR1YWwgJXggY291bnQgJXggYWRkciAlcCBkbWFhZGRyICV4XG4iLCAKKwkJCSAgICAgICBkcmVncy0+Zmlmb19jb3VudCwKKwkJCSAgICAgICBkcmVncy0+ZG1hX2NvdW50X2xvIHwgKGRyZWdzLT5kbWFfY291bnRfaGkgPDwgMTYpLAorCQkJICAgICAgIHN1bjNfZG1hX29yaWdfYWRkciwKKwkJCSAgICAgICBkcmVncy0+ZG1hX2FkZHJfbG8gfCAoZHJlZ3MtPmRtYV9hZGRyX2hpIDw8IDE2KSk7CisjZW5kaWYKKwkJfQorCisJCWlmKGNzciAmIENTUl9ETUFfQ09ORkxJQ1QpIHsKKwkJCXByaW50aygic2NzaSVkOiBkbWEgY29uZmxpY3RcbiIsIGRlZmF1bHRfaW5zdGFuY2UtPmhvc3Rfbm8pOworCQl9CisJCWhhbmRsZWQgPSAxOworCX0KKworCWlmKGNzciAmIChDU1JfU0RCX0lOVCB8IENTUl9ETUFfSU5UKSkgeworCQlOQ1I1MzgwX2ludHIoaXJxLCBkdW1teSwgZnApOworCQloYW5kbGVkID0gMTsKKwl9CisKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworLyoKKyAqIERlYnVnIHN0dWZmIC0gdG8gYmUgY2FsbGVkIG9uIE5NSSwgb3Igc3lzcnEga2V5LiBVc2UgYXQgeW91ciBvd24gcmlzazsgCisgKiByZWVudGVyaW5nIE5DUjUzODBfcHJpbnRfc3RhdHVzIHNlZW1zIHRvIGhhdmUgdWdseSBzaWRlIGVmZmVjdHMKKyAqLworCisvKiB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBnZXQgdXNlZCBhdCBhbGwgLS0gc2FtICovCisjaWYgMAordm9pZCBzdW4zX3N1bjNfZGVidWcgKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKworCWlmIChkZWZhdWx0X2luc3RhbmNlKSB7CisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQlOQ1I1MzgwX3ByaW50X3N0YXR1cyhkZWZhdWx0X2luc3RhbmNlKTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9Cit9CisjZW5kaWYKKworCisvKiBzdW4zc2NzaV9kbWFfc2V0dXAoKSAtLSBpbml0aWFsaXplIHRoZSBkbWEgY29udHJvbGxlciBmb3IgYSByZWFkL3dyaXRlICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzdW4zc2NzaV9kbWFfc2V0dXAodm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBjb3VudCwgaW50IHdyaXRlX2ZsYWcpCit7CisJdm9pZCAqYWRkcjsKKworCWlmKHN1bjNfZG1hX29yaWdfYWRkciAhPSBOVUxMKQorCQlkdm1hX3VubWFwKHN1bjNfZG1hX29yaWdfYWRkcik7CisKKy8vCWFkZHIgPSBzdW4zX2R2bWFfcGFnZSgodW5zaWduZWQgbG9uZylkYXRhLCAodW5zaWduZWQgbG9uZylkbWFidWYpOworCWFkZHIgPSAodm9pZCAqKWR2bWFfbWFwX3ZtZSgodW5zaWduZWQgbG9uZykgZGF0YSwgY291bnQpOworCQkKKwlzdW4zX2RtYV9vcmlnX2FkZHIgPSBhZGRyOworCXN1bjNfZG1hX29yaWdfY291bnQgPSBjb3VudDsKKwkKKyNpZmRlZiBTVU4zX1NDU0lfREVCVUcKKwlwcmludGsoInNjc2k6IGRtYV9zZXR1cCBhZGRyICVwIGNvdW50ICV4XG4iLCBhZGRyLCBjb3VudCk7CisjZW5kaWYKKworLy8JZHJlZ3MtPmZpZm9fY291bnQgPSAwOworI2lmIDAJCisJLyogcmVzZXQgZmlmbyAqLworCWRyZWdzLT5jc3IgJj0gfkNTUl9GSUZPOworCWRyZWdzLT5jc3IgfD0gQ1NSX0ZJRk87CisjZW5kaWYJCisJLyogc2V0IGRpcmVjdGlvbiAqLworCWlmKHdyaXRlX2ZsYWcpCisJCWRyZWdzLT5jc3IgfD0gQ1NSX1NFTkQ7CisJZWxzZQorCQlkcmVncy0+Y3NyICY9IH5DU1JfU0VORDsKKwkKKwkvKiByZXNldCBmaWZvICovCisvLwlkcmVncy0+Y3NyICY9IH5DU1JfRklGTzsKKy8vCWRyZWdzLT5jc3IgfD0gQ1NSX0ZJRk87CisKKwlkcmVncy0+Y3NyIHw9IENTUl9QQUNLX0VOQUJMRTsKKworCWRyZWdzLT5kbWFfYWRkcl9oaSA9ICgodW5zaWduZWQgbG9uZylhZGRyID4+IDE2KTsKKwlkcmVncy0+ZG1hX2FkZHJfbG8gPSAoKHVuc2lnbmVkIGxvbmcpYWRkciAmIDB4ZmZmZik7CisJCisJZHJlZ3MtPmRtYV9jb3VudF9oaSA9IDA7CisJZHJlZ3MtPmRtYV9jb3VudF9sbyA9IDA7CisJZHJlZ3MtPmZpZm9fY291bnRfaGkgPSAwOworCWRyZWdzLT5maWZvX2NvdW50ID0gMDsKKwkJCisjaWZkZWYgU1VOM19TQ1NJX0RFQlVHCisJcHJpbnRrKCJzY3NpOiBkbWFfc2V0dXAgZG9uZSBjc3IgJXhcbiIsIGRyZWdzLT5jc3IpOworI2VuZGlmCisgICAgICAgCXJldHVybiBjb3VudDsKKworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc3VuM3Njc2lfZG1hX3Jlc2lkdWFsKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworCXJldHVybiBsYXN0X3Jlc2lkdWFsOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc3VuM3Njc2lfZG1hX3hmZXJfbGVuKHVuc2lnbmVkIGxvbmcgd2FudGVkLCBTY3NpX0NtbmQgKmNtZCwKKwkJCQkgICAgaW50IHdyaXRlX2ZsYWcpCit7CisJaWYoY21kLT5yZXF1ZXN0LT5mbGFncyAmIFJFUV9DTUQpCisgCQlyZXR1cm4gd2FudGVkOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3VuM3Njc2lfZG1hX3N0YXJ0KHVuc2lnbmVkIGxvbmcgY291bnQsIGNoYXIgKmRhdGEpCit7CisJCisJdW5zaWduZWQgc2hvcnQgY3NyOworCisJY3NyID0gZHJlZ3MtPmNzcjsKKyNpZmRlZiBTVU4zX1NDU0lfREVCVUcKKwlwcmludGsoInNjc2k6IGRtYV9zdGFydCBkYXRhICVwIGNvdW50ICV4IGNzciAleCBmaWZvICV4XG4iLCBkYXRhLCBjb3VudCwgY3NyLCBkcmVncy0+Zmlmb19jb3VudCk7CisjZW5kaWYKKwkKKwlkcmVncy0+ZG1hX2NvdW50X2hpID0gKHN1bjNfZG1hX29yaWdfY291bnQgPj4gMTYpOworCWRyZWdzLT5kbWFfY291bnRfbG8gPSAoc3VuM19kbWFfb3JpZ19jb3VudCAmIDB4ZmZmZik7CisKKwlkcmVncy0+Zmlmb19jb3VudF9oaSA9IChzdW4zX2RtYV9vcmlnX2NvdW50ID4+IDE2KTsKKwlkcmVncy0+Zmlmb19jb3VudCA9IChzdW4zX2RtYV9vcmlnX2NvdW50ICYgMHhmZmZmKTsKKworLy8JaWYoIShjc3IgJiBDU1JfRE1BX0VOQUJMRSkpCisvLwkJZHJlZ3MtPmNzciB8PSBDU1JfRE1BX0VOQUJMRTsKKworCXJldHVybiAwOworfQorCisvKiBjbGVhbiB1cCBhZnRlciBvdXIgZG1hIGlzIGRvbmUgKi8KK3N0YXRpYyBpbnQgc3VuM3Njc2lfZG1hX2ZpbmlzaChpbnQgd3JpdGVfZmxhZykKK3sKKwl1bnNpZ25lZCBzaG9ydCBmaWZvOworCWludCByZXQgPSAwOworCQorCXN1bjNfZG1hX2FjdGl2ZSA9IDA7CisKKwlkcmVncy0+Y3NyICY9IH5DU1JfRE1BX0VOQUJMRTsKKwkKKwlmaWZvID0gZHJlZ3MtPmZpZm9fY291bnQ7CisJaWYod3JpdGVfZmxhZykgeworCQlpZigoZmlmbyA+IDApICYmIChmaWZvIDwgc3VuM19kbWFfb3JpZ19jb3VudCkpCisJCQlmaWZvKys7CisJfQorCisJbGFzdF9yZXNpZHVhbCA9IGZpZm87CisjaWZkZWYgU1VOM19TQ1NJX0RFQlVHCisJcHJpbnRrKCJzY3NpOiByZXNpZHVhbCAleCB0b3RhbCAleFxuIiwgZmlmbywgc3VuM19kbWFfb3JpZ19jb3VudCk7CisjZW5kaWYKKwkvKiBlbXB0eSBieXRlcyBmcm9tIHRoZSBmaWZvIHdoaWNoIGRpZG4ndCBtYWtlIGl0ICovCisJaWYoKCF3cml0ZV9mbGFnKSAmJiAoZHJlZ3MtPmNzciAmIENTUl9MRUZUKSkgeworCQl1bnNpZ25lZCBjaGFyICp2YWRkcjsKKworI2lmZGVmIFNVTjNfU0NTSV9ERUJVRworCQlwcmludGsoInNjc2k6IGdvdCBsZWZ0IG92ZXIgYnl0ZXNcbiIpOworI2VuZGlmCisKKwkJdmFkZHIgPSAodW5zaWduZWQgY2hhciAqKWR2bWFfdm1ldG92KHN1bjNfZG1hX29yaWdfYWRkcik7CisJCQorCQl2YWRkciArPSAoc3VuM19kbWFfb3JpZ19jb3VudCAtIGZpZm8pOworCQl2YWRkci0tOworCQkKKwkJc3dpdGNoKGRyZWdzLT5jc3IgJiBDU1JfTEVGVCkgeworCQljYXNlIENTUl9MRUZUXzM6CisJCQkqdmFkZHIgPSAoZHJlZ3MtPmJwYWNrX2xvICYgMHhmZjAwKSA+PiA4OworCQkJdmFkZHItLTsKKwkJCQorCQljYXNlIENTUl9MRUZUXzI6CisJCQkqdmFkZHIgPSAoZHJlZ3MtPmJwYWNrX2hpICYgMHgwMGZmKTsKKwkJCXZhZGRyLS07CisJCQkKKwkJY2FzZSBDU1JfTEVGVF8xOgorCQkJKnZhZGRyID0gKGRyZWdzLT5icGFja19oaSAmIDB4ZmYwMCkgPj4gODsKKwkJCWJyZWFrOworCQl9CisJCQorCQkKKwl9CisKKwlkdm1hX3VubWFwKHN1bjNfZG1hX29yaWdfYWRkcik7CisJc3VuM19kbWFfb3JpZ19hZGRyID0gTlVMTDsKKworCWRyZWdzLT5kbWFfYWRkcl9oaSA9IDA7CisJZHJlZ3MtPmRtYV9hZGRyX2xvID0gMDsKKwlkcmVncy0+ZG1hX2NvdW50X2hpID0gMDsKKwlkcmVncy0+ZG1hX2NvdW50X2xvID0gMDsKKworCWRyZWdzLT5maWZvX2NvdW50ID0gMDsKKwlkcmVncy0+Zmlmb19jb3VudF9oaSA9IDA7CisKKwlkcmVncy0+Y3NyICY9IH5DU1JfU0VORDsKKwkKKy8vCWRyZWdzLT5jc3IgfD0gQ1NSX0RNQV9FTkFCTEU7CisJCisjaWYgMAorCS8qIHJlc2V0IGZpZm8gKi8KKwlkcmVncy0+Y3NyICY9IH5DU1JfRklGTzsKKwlkcmVncy0+Y3NyIHw9IENTUl9GSUZPOworI2VuZGlmCQorCXN1bjNfZG1hX3NldHVwX2RvbmUgPSBOVUxMOworCisJcmV0dXJuIHJldDsKKworfQorCisjaW5jbHVkZSAic3VuM19OQ1I1MzgwLmMiCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5uYW1lCQkJPSBTVU4zX1NDU0lfTkFNRSwKKwkuZGV0ZWN0CQkJPSBzdW4zc2NzaV9kZXRlY3QsCisJLnJlbGVhc2UJCT0gc3VuM3Njc2lfcmVsZWFzZSwKKwkuaW5mbwkJCT0gc3VuM3Njc2lfaW5mbywKKwkucXVldWVjb21tYW5kCQk9IHN1bjNzY3NpX3F1ZXVlX2NvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIgICAgICAJPSBzdW4zc2NzaV9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIgIAk9IHN1bjNzY3NpX2J1c19yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IENBTl9RVUVVRSwKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfVEFCTEVTSVpFLAorCS5jbWRfcGVyX2x1bgkJPSBDTURfUEVSX0xVTiwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HCit9OworCisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3VuM3hfZXNwLmMgYi9kcml2ZXJzL3Njc2kvc3VuM3hfZXNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxZGMwZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zdW4zeF9lc3AuYwpAQCAtMCwwICsxLDM5NCBAQAorLyogc3VuM3hfZXNwLmM6ICBFbmhhbmNlZFNjc2lQcm9jZXNzb3IgU3VuM3ggU0NTSSBkcml2ZXIgY29kZS4KKyAqCisgKiAoQykgMTk5OSBUaG9tYXMgQm9nZW5kb2VyZmVyICh0c2JvZ2VuZEBhbHBoYS5mcmFua2VuLmRlKQorICoKKyAqIEJhc2VkIG9uIERhdmlkIFMuIE1pbGxlcidzIGVzcCBkcml2ZXIKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiTkNSNTNDOXguaCIKKworI2luY2x1ZGUgPGFzbS9zdW4zeC5oPgorI2luY2x1ZGUgPGFzbS9kdm1hLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCitleHRlcm4gc3RydWN0IE5DUl9FU1AgKmVzcGNoYWluOworCitzdGF0aWMgdm9pZCBkbWFfYmFycmllcihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KTsKK3N0YXRpYyBpbnQgIGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCk7CitzdGF0aWMgdm9pZCBkbWFfZHJhaW4oc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW52YWxpZGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiB2YWRkcmVzcywgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiB2YWRkcmVzcywgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9wb2xsKHN0cnVjdCBOQ1JfRVNQICplc3AsIHVuc2lnbmVkIGNoYXIgKnZhZGRyKTsKK3N0YXRpYyBpbnQgIGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX3Jlc2V0KHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKTsKK3N0YXRpYyB2b2lkIGRtYV9tbXVfZ2V0X3Njc2lfb25lIChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKTsKK3N0YXRpYyB2b2lkIGRtYV9tbXVfZ2V0X3Njc2lfc2dsIChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKTsKK3N0YXRpYyB2b2lkIGRtYV9tbXVfcmVsZWFzZV9zY3NpX29uZSAoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCk7CitzdGF0aWMgdm9pZCBkbWFfbW11X3JlbGVhc2Vfc2NzaV9zZ2wgKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApOworc3RhdGljIHZvaWQgZG1hX2FkdmFuY2Vfc2cgKFNjc2lfQ21uZCAqc3ApOworCisvKiBEZXRlY3RpbmcgRVNQIGNoaXBzIG9uIHRoZSBtYWNoaW5lLiAgVGhpcyBpcyB0aGUgc2ltcGxlIGFuZCBlYXN5CisgKiB2ZXJzaW9uLgorICovCitpbnQgc3VuM3hfZXNwX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQpCit7CisJc3RydWN0IE5DUl9FU1AgKmVzcDsKKwlzdHJ1Y3QgQ29uZmlnRGV2ICplc3BfZGV2OworCisJZXNwX2RldiA9IDA7CisJZXNwID0gZXNwX2FsbG9jYXRlKHRwbnQsICh2b2lkICopIGVzcF9kZXYpOworCisJLyogRG8gY29tbWFuZCB0cmFuc2ZlciB3aXRoIERNQSAqLworCWVzcC0+ZG9fcGlvX2NtZHMgPSAwOworCisJLyogUmVxdWlyZWQgZnVuY3Rpb25zICovCisJZXNwLT5kbWFfYnl0ZXNfc2VudCA9ICZkbWFfYnl0ZXNfc2VudDsKKwllc3AtPmRtYV9jYW5fdHJhbnNmZXIgPSAmZG1hX2Nhbl90cmFuc2ZlcjsKKwllc3AtPmRtYV9kdW1wX3N0YXRlID0gJmRtYV9kdW1wX3N0YXRlOworCWVzcC0+ZG1hX2luaXRfcmVhZCA9ICZkbWFfaW5pdF9yZWFkOworCWVzcC0+ZG1hX2luaXRfd3JpdGUgPSAmZG1hX2luaXRfd3JpdGU7CisJZXNwLT5kbWFfaW50c19vZmYgPSAmZG1hX2ludHNfb2ZmOworCWVzcC0+ZG1hX2ludHNfb24gPSAmZG1hX2ludHNfb247CisJZXNwLT5kbWFfaXJxX3AgPSAmZG1hX2lycV9wOworCWVzcC0+ZG1hX3BvcnRzX3AgPSAmZG1hX3BvcnRzX3A7CisJZXNwLT5kbWFfc2V0dXAgPSAmZG1hX3NldHVwOworCisJLyogT3B0aW9uYWwgZnVuY3Rpb25zICovCisJZXNwLT5kbWFfYmFycmllciA9ICZkbWFfYmFycmllcjsKKwllc3AtPmRtYV9pbnZhbGlkYXRlID0gJmRtYV9pbnZhbGlkYXRlOworCWVzcC0+ZG1hX2RyYWluID0gJmRtYV9kcmFpbjsKKwllc3AtPmRtYV9pcnFfZW50cnkgPSAwOworCWVzcC0+ZG1hX2lycV9leGl0ID0gMDsKKwllc3AtPmRtYV9sZWRfb24gPSAwOworCWVzcC0+ZG1hX2xlZF9vZmYgPSAwOworCWVzcC0+ZG1hX3BvbGwgPSAmZG1hX3BvbGw7CisJZXNwLT5kbWFfcmVzZXQgPSAmZG1hX3Jlc2V0OworCisgICAgICAgIC8qIHZpcnR1YWwgRE1BIGZ1bmN0aW9ucyAqLworICAgICAgICBlc3AtPmRtYV9tbXVfZ2V0X3Njc2lfb25lID0gJmRtYV9tbXVfZ2V0X3Njc2lfb25lOworICAgICAgICBlc3AtPmRtYV9tbXVfZ2V0X3Njc2lfc2dsID0gJmRtYV9tbXVfZ2V0X3Njc2lfc2dsOworICAgICAgICBlc3AtPmRtYV9tbXVfcmVsZWFzZV9zY3NpX29uZSA9ICZkbWFfbW11X3JlbGVhc2Vfc2NzaV9vbmU7CisgICAgICAgIGVzcC0+ZG1hX21tdV9yZWxlYXNlX3Njc2lfc2dsID0gJmRtYV9tbXVfcmVsZWFzZV9zY3NpX3NnbDsKKyAgICAgICAgZXNwLT5kbWFfYWR2YW5jZV9zZyA9ICZkbWFfYWR2YW5jZV9zZzsKKwkgICAgCisJLyogU0NTSSBjaGlwIHNwZWVkICovCisJZXNwLT5jZnJlcSA9IDIwMDAwMDAwOworCWVzcC0+ZXJlZ3MgPSAoc3RydWN0IEVTUF9yZWdzICopKFNVTjNYX0VTUF9CQVNFKTsKKwllc3AtPmRyZWdzID0gKHZvaWQgKilTVU4zWF9FU1BfRE1BOworCisJZXNwLT5lc3BfY29tbWFuZCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopZHZtYV9tYWxsb2MoRFZNQV9QQUdFX1NJWkUpOworCWVzcC0+ZXNwX2NvbW1hbmRfZHZtYSA9IGR2bWFfdnRvYigodW5zaWduZWQgbG9uZyllc3AtPmVzcF9jb21tYW5kKTsKKworCWVzcC0+aXJxID0gMjsKKwlpZiAocmVxdWVzdF9pcnEoZXNwLT5pcnEsIGVzcF9pbnRyLCBTQV9JTlRFUlJVUFQsIAorCQkJIlNVTjNYIFNDU0kiLCBlc3AtPmVob3N0KSkgeworCQllc3BfZGVhbGxvY2F0ZShlc3ApOworCQlyZXR1cm4gMDsKKwl9CisKKwllc3AtPnNjc2lfaWQgPSA3OworCWVzcC0+ZGlmZiA9IDA7CisKKwllc3BfaW5pdGlhbGl6ZShlc3ApOworCisgCS8qIGZvciByZWFzb25zIGJleW9uZCBteSBrbm93bGVkZ2UgKGFuZCB3aGljaCBzaG91bGQgbGlrZWx5IGJlIGZpeGVkKQorIAkgICBzeW5jIG1vZGUgZG9lc24ndCB3b3JrIG9uIGEgMy84MCBhdCA1bWh6LiAgYnV0IGl0IGRvZXMgYXQgNC4gKi8KKyAJZXNwLT5zeW5jX2RlZnAgPSAweDNmOworCisJcHJpbnRrKCJFU1A6IFRvdGFsIG9mICVkIEVTUCBob3N0cyBmb3VuZCwgJWQgYWN0dWFsbHkgaW4gdXNlLlxuIiwgbmVzcHMsCisJICAgICAgIGVzcHNfaW5fdXNlKTsKKwllc3BzX3J1bm5pbmcgPSBlc3BzX2luX3VzZTsKKwlyZXR1cm4gZXNwc19pbl91c2U7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9kb19kcmFpbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworIAlzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPQorIAkJKHN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICopIGVzcC0+ZHJlZ3M7CisgCQorIAlpbnQgY291bnQgPSA1MDAwMDA7CisgCisgCXdoaWxlKChkcmVncy0+Y29uZF9yZWcgJiBETUFfUEVORF9SRUFEKSAmJiAoLS1jb3VudCA+IDApKSAKKyAJCXVkZWxheSgxKTsKKyAKKyAJaWYoIWNvdW50KSB7CisgCQlwcmludGsoIiVzOiVkIHRpbWVvdXQgQ1NSICUwOGx4XG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIGRyZWdzLT5jb25kX3JlZyk7CisgCX0KKyAKKyAJZHJlZ3MtPmNvbmRfcmVnIHw9IERNQV9GSUZPX1NURFJBSU47CisgCQorIAljb3VudCA9IDUwMDAwMDsKKyAKKyAJd2hpbGUoKGRyZWdzLT5jb25kX3JlZyAmIERNQV9GSUZPX0lTRFJBSU4pICYmICgtLWNvdW50ID4gMCkpIAorIAkJdWRlbGF5KDEpOworIAorIAlpZighY291bnQpIHsKKyAJCXByaW50aygiJXM6JWQgdGltZW91dCBDU1IgJTA4bHhcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgZHJlZ3MtPmNvbmRfcmVnKTsKKyAJfQorIAorfQorIAorc3RhdGljIHZvaWQgZG1hX2JhcnJpZXIoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKyAgCXN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICpkcmVncyA9CisgIAkJKHN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICopIGVzcC0+ZHJlZ3M7CisgCWludCBjb3VudCA9IDUwMDAwMDsKKyAgCisgCXdoaWxlKChkcmVncy0+Y29uZF9yZWcgJiBETUFfUEVORF9SRUFEKSAmJiAoLS1jb3VudCA+IDApKQorICAJCXVkZWxheSgxKTsKKyAKKyAJaWYoIWNvdW50KSB7CisgCQlwcmludGsoIiVzOiVkIHRpbWVvdXQgQ1NSICUwOGx4XG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIGRyZWdzLT5jb25kX3JlZyk7CisgCX0KKyAKKyAgCWRyZWdzLT5jb25kX3JlZyAmPSB+KERNQV9FTkFCTEUpOworfQorCisvKiBUaGlzIHVzZXMgdmFyaW91cyBETUEgY3NyIGZpZWxkcyBhbmQgdGhlIGZpZm8gZmxhZ3MgY291bnQgdmFsdWUgdG8KKyAqIGRldGVybWluZSBob3cgbWFueSBieXRlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBzZW50L3JlY2VpdmVkIGJ5IHRoZSBFU1AuCisgKi8KK3N0YXRpYyBpbnQgZG1hX2J5dGVzX3NlbnQoc3RydWN0IE5DUl9FU1AgKmVzcCwgaW50IGZpZm9fY291bnQpCit7CisJc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0gCisJCShzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqKSBlc3AtPmRyZWdzOworCisJaW50IHJ2YWwgPSBkcmVncy0+c3RfYWRkciAtIGVzcC0+ZXNwX2NvbW1hbmRfZHZtYTsKKworCXJldHVybiBydmFsIC0gZmlmb19jb3VudDsKK30KKworc3RhdGljIGludCBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisJcmV0dXJuIHNwLT5TQ3AudGhpc19yZXNpZHVhbDsKK30KKworc3RhdGljIHZvaWQgZG1hX2RyYWluKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0KKwkJKHN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICopIGVzcC0+ZHJlZ3M7CisJaW50IGNvdW50ID0gNTAwMDAwOworCisJaWYoZHJlZ3MtPmNvbmRfcmVnICYgRE1BX0ZJRk9fSVNEUkFJTikgeworCQlkcmVncy0+Y29uZF9yZWcgfD0gRE1BX0ZJRk9fU1REUkFJTjsKKwkJd2hpbGUoKGRyZWdzLT5jb25kX3JlZyAmIERNQV9GSUZPX0lTRFJBSU4pICYmICgtLWNvdW50ID4gMCkpCisJCQl1ZGVsYXkoMSk7CisJCWlmKCFjb3VudCkgeworCQkJcHJpbnRrKCIlczolZCB0aW1lb3V0IENTUiAlMDhseFxuIiwgX19GSUxFX18sIF9fTElORV9fLCBkcmVncy0+Y29uZF9yZWcpOworCQl9CisKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbnZhbGlkYXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0KKwkJKHN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICopIGVzcC0+ZHJlZ3M7CisKKwlfX3UzMiB0bXA7CisJaW50IGNvdW50ID0gNTAwMDAwOworCisJd2hpbGUoKCh0bXAgPSBkcmVncy0+Y29uZF9yZWcpICYgRE1BX1BFTkRfUkVBRCkgJiYgKC0tY291bnQgPiAwKSkgCisJCXVkZWxheSgxKTsKKworCWlmKCFjb3VudCkgeworCQlwcmludGsoIiVzOiVkIHRpbWVvdXQgQ1NSICUwOGx4XG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIGRyZWdzLT5jb25kX3JlZyk7CisJfQorCisJZHJlZ3MtPmNvbmRfcmVnID0gdG1wIHwgRE1BX0ZJRk9fSU5WOworCWRyZWdzLT5jb25kX3JlZyAmPSB+RE1BX0ZJRk9fSU5WOworCit9CisKK3N0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0KKwkJKHN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICopIGVzcC0+ZHJlZ3M7CisKKwlFU1BMT0coKCJlc3AlZDogZG1hIC0tIGNvbmRfcmVnPCUwOGx4PiBhZGRyPCUwOGx4PlxuIiwKKwkJZXNwLT5lc3BfaWQsIGRyZWdzLT5jb25kX3JlZywgZHJlZ3MtPnN0X2FkZHIpKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiB2YWRkcmVzcywgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKKwkJKHN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICopIGVzcC0+ZHJlZ3M7CisKKwlkcmVncy0+c3RfYWRkciA9IHZhZGRyZXNzOworCWRyZWdzLT5jb25kX3JlZyB8PSAoRE1BX1NUX1dSSVRFIHwgRE1BX0VOQUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAorCQkoc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVnczsKKworCS8qIFNldCB1cCB0aGUgRE1BIGNvdW50ZXJzICovCisKKwlkcmVncy0+c3RfYWRkciA9IHZhZGRyZXNzOworCWRyZWdzLT5jb25kX3JlZyA9ICgoZHJlZ3MtPmNvbmRfcmVnICYgfihETUFfU1RfV1JJVEUpKSB8IERNQV9FTkFCTEUpOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlETUFfSU5UU09GRigoc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVncyk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJRE1BX0lOVFNPTigoc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVncyk7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJcmV0dXJuIERNQV9JUlFfUCgoc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVncyk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9wb2xsKHN0cnVjdCBOQ1JfRVNQICplc3AsIHVuc2lnbmVkIGNoYXIgKnZhZGRyKQoreworCWludCBjb3VudCA9IDUwOworCWRtYV9kb19kcmFpbihlc3ApOworCisJLyogV2FpdCB0aWxsIHRoZSBmaXJzdCBiaXRzIHNldHRsZS4gKi8KKwl3aGlsZSgoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopdmFkZHIgPT0gMHhmZikgJiYgKC0tY291bnQgPiAwKSkKKwkJdWRlbGF5KDEpOworCisJaWYoIWNvdW50KSB7CisvLwkJcHJpbnRrKCIlczolZCB0aW1lb3V0IGV4cGlyZSAoZGF0YSAlMDJ4KVxuIiwgX19GSUxFX18sIF9fTElORV9fLAorLy8JCSAgICAgICBlc3BfcmVhZChlc3AtPmVyZWdzLT5lc3BfZmRhdGEpKTsKKwkJLy9tYWNoX2hhbHQoKTsKKwkJdmFkZHJbMF0gPSBlc3BfcmVhZChlc3AtPmVyZWdzLT5lc3BfZmRhdGEpOworCQl2YWRkclsxXSA9IGVzcF9yZWFkKGVzcC0+ZXJlZ3MtPmVzcF9mZGF0YSk7CisJfQorCit9CQorCitzdGF0aWMgaW50IGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJcmV0dXJuICgoKHN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICopIGVzcC0+ZHJlZ3MpLT5jb25kX3JlZyAKKwkJCSYgRE1BX0lOVF9FTkFCKTsKK30KKworLyogUmVzZXR0aW5nIHZhcmlvdXMgcGllY2VzIG9mIHRoZSBFU1Agc2NzaSBkcml2ZXIgY2hpcHNldC9idXNlcy4gKi8KK3N0YXRpYyB2b2lkIGRtYV9yZXNldChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCXN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICpkcmVncyA9CisJCShzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqKWVzcC0+ZHJlZ3M7CisKKwkvKiBQdW50IHRoZSBEVk1BIGludG8gYSBrbm93biBzdGF0ZS4gKi8KKwlkcmVncy0+Y29uZF9yZWcgfD0gRE1BX1JTVF9TQ1NJOworCWRyZWdzLT5jb25kX3JlZyAmPSB+KERNQV9SU1RfU0NTSSk7CisJRE1BX0lOVFNPTihkcmVncyk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSkKK3sKKwlzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKKwkJKHN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICopIGVzcC0+ZHJlZ3M7CisJdW5zaWduZWQgbG9uZyBucmVnID0gZHJlZ3MtPmNvbmRfcmVnOworCisvLwlwcmludGsoImRtYV9zZXR1cCAlYyBhZGRyICUwOHggY250ICUwOHhcbiIsCisvLwkgICAgICAgd3JpdGUgPyAnVycgOiAnUicsIGFkZHIsIGNvdW50KTsKKworCWRtYV9kb19kcmFpbihlc3ApOworCisJaWYod3JpdGUpCisJCW5yZWcgfD0gRE1BX1NUX1dSSVRFOworCWVsc2UgeworCQlucmVnICY9IH4oRE1BX1NUX1dSSVRFKTsKKwl9CisJCQorCW5yZWcgfD0gRE1BX0VOQUJMRTsKKwlkcmVncy0+Y29uZF9yZWcgPSBucmVnOworCWRyZWdzLT5zdF9hZGRyID0gYWRkcjsKK30KKworc3RhdGljIHZvaWQgZG1hX21tdV9nZXRfc2NzaV9vbmUgKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisgICAgc3AtPlNDcC5oYXZlX2RhdGFfaW4gPSBkdm1hX21hcCgodW5zaWduZWQgbG9uZylzcC0+U0NwLmJ1ZmZlciwKKwkJCQkgICAgICAgc3AtPlNDcC50aGlzX3Jlc2lkdWFsKTsKKyAgICBzcC0+U0NwLnB0ciA9IChjaGFyICopKCh1bnNpZ25lZCBsb25nKXNwLT5TQ3AuaGF2ZV9kYXRhX2luKTsKK30KKworc3RhdGljIHZvaWQgZG1hX21tdV9nZXRfc2NzaV9zZ2wgKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisgICAgaW50IHN6ID0gc3AtPlNDcC5idWZmZXJzX3Jlc2lkdWFsOworICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBzcC0+U0NwLmJ1ZmZlcjsKKworICAgIHdoaWxlIChzeiA+PSAwKSB7CisJICAgIHNnW3N6XS5kdm1hX2FkZHJlc3MgPSBkdm1hX21hcCgodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3Moc2dbc3pdLnBhZ2UpICsKKwkJCQkJICAgc2dbc3pdLm9mZnNldCwgc2dbc3pdLmxlbmd0aCk7CisJICAgIHN6LS07CisgICAgfQorICAgIHNwLT5TQ3AucHRyPShjaGFyICopKCh1bnNpZ25lZCBsb25nKXNwLT5TQ3AuYnVmZmVyLT5kdm1hX2FkZHJlc3MpOworfQorCitzdGF0aWMgdm9pZCBkbWFfbW11X3JlbGVhc2Vfc2NzaV9vbmUgKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisgICAgZHZtYV91bm1hcCgoY2hhciAqKXNwLT5TQ3AuaGF2ZV9kYXRhX2luKTsKK30KKworc3RhdGljIHZvaWQgZG1hX21tdV9yZWxlYXNlX3Njc2lfc2dsIChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKQoreworICAgIGludCBzeiA9IHNwLT51c2Vfc2cgLSAxOworICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopc3AtPmJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHdoaWxlKHN6ID49IDApIHsKKyAgICAgICAgZHZtYV91bm1hcCgoY2hhciAqKXNnW3N6XS5kdm1hX2FkZHJlc3MpOworICAgICAgICBzei0tOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZG1hX2FkdmFuY2Vfc2cgKFNjc2lfQ21uZCAqc3ApCit7CisgICAgc3AtPlNDcC5wdHIgPSAoY2hhciAqKSgodW5zaWduZWQgbG9uZylzcC0+U0NwLmJ1ZmZlci0+ZHZtYV9hZGRyZXNzKTsKK30KKworc3RhdGljIGludCBzdW4zeF9lc3BfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKwkvKiB0aGlzIGNvZGUgZG9lcyBub3Qgc3VwcG9ydCBiZWluZyBjb21waWxlZCBhcyBhIG1vZHVsZSAqLwkgCisJcmV0dXJuIDE7CisKK30KKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQkJPSAic3VuM3hfZXNwIiwKKwkucHJvY19pbmZvCQk9ICZlc3BfcHJvY19pbmZvLAorCS5uYW1lCQkJPSAiU3VuIEVTUCAxMDAvMTAwYS8yMDAiLAorCS5kZXRlY3QJCQk9IHN1bjN4X2VzcF9kZXRlY3QsCisJLnJlbGVhc2UgICAgICAgICAgICAgICAgPSBzdW4zeF9lc3BfcmVsZWFzZSwKKwkuc2xhdmVfYWxsb2MJCT0gZXNwX3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9kZXN0cm95CQk9IGVzcF9zbGF2ZV9kZXN0cm95LAorCS5pbmZvCQkJPSBlc3BfaW5mbywKKwkucXVldWVjb21tYW5kCQk9IGVzcF9xdWV1ZSwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IGVzcF9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBlc3BfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSA3LAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORywKK307CisKKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zeW01M2M0MTYuYyBiL2RyaXZlcnMvc2NzaS9zeW01M2M0MTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjZjM2EyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N5bTUzYzQxNi5jCkBAIC0wLDAgKzEsODgxIEBACisvKgorICogIHN5bTUzYzQxNi5jCisgKiAgTG93LWxldmVsIFNDU0kgZHJpdmVyIGZvciBzeW01M2M0MTYgY2hpcC4KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTggTGlldmVuIFdpbGxlbXMgKGx3X2xpbnV4QGhvdG1haWwuY29tKQorICogCisgKiAgQ2hhbmdlcyA6IAorICogCisgKiAgTWFyY2VsbyBUb3NhdHRpIDxtYXJjZWxvQGNvbmVjdGl2YS5jb20uYnI+IDogQWRkZWQgaW9fcmVxdWVzdF9sb2NrIGxvY2tpbmcKKyAqICBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiA6IENsZWFuZWQgdXAgY29kZSBmb3JtYXR0aW5nCisgKgkJCQkgRml4ZWQgYW4gaXJxIGxvY2tpbmcgYnVnCisgKgkJCQkgQWRkZWQgSVNBUG5QIHN1cHBvcnQKKyAqICBCam9lcm4gQS4gWmVlYiA8YnplZWJAemFiYmFkb3oubmV0PiA6IEluaXRpYWwgaXJxIGxvY2tpbmcgdXBkYXRlcworICoJCQkJCSAgQWRkZWQgYW5vdGhlciBjYXJkIHdpdGggSVNBUG5QIHN1cHBvcnQKKyAqIAorICogIExJTE8gY29tbWFuZCBsaW5lIHVzYWdlOiBzeW01M2M0MTY9PFBPUlRCQVNFPlssPElSUT5dCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogIGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pc2FwbnAuaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJzeW01M2M0MTYuaCIKKworI2RlZmluZSBWRVJTSU9OX1NUUklORyAgICAgICAgIlZlcnNpb24gMS4wLjAtYWMiCisKKyNkZWZpbmUgVENfTE9XICAgICAgIDB4MDAgICAgIC8qIFRyYW5zZmVyIGNvdW50ZXIgbG93ICAgICAgICAqLworI2RlZmluZSBUQ19NSUQgICAgICAgMHgwMSAgICAgLyogVHJhbnNmZXIgY291bnRlciBtaWQgICAgICAgICovCisjZGVmaW5lIFNDU0lfRklGTyAgICAweDAyICAgICAvKiBTQ1NJIEZJRk8gcmVnaXN0ZXIgICAgICAgICAgKi8KKyNkZWZpbmUgQ09NTUFORF9SRUcgIDB4MDMgICAgIC8qIENvbW1hbmQgUmVnaXN0ZXIgICAgICAgICAgICAqLworI2RlZmluZSBTVEFUVVNfUkVHICAgMHgwNCAgICAgLyogU3RhdHVzIFJlZ2lzdGVyIChSRUFEKSAgICAgICovCisjZGVmaW5lIERFU1RfQlVTX0lEICAweDA0ICAgICAvKiBEZXN0aW5hdGlvbiBCdXMgSUQgKFdSSVRFKSAgKi8KKyNkZWZpbmUgSU5UX1JFRyAgICAgIDB4MDUgICAgIC8qIEludGVycnVwdCBSZWdpc3RlciAoUkVBRCkgICAqLworI2RlZmluZSBUT00gICAgICAgICAgMHgwNSAgICAgLyogVGltZSBvdXQgbXVsdGlwbGllciAoV1JJVEUpICovCisjZGVmaW5lIFNUUCAgICAgICAgICAweDA2ICAgICAvKiBTeW5jaHJvbm91cyBUcmFuc2ZlciBwZXJpb2QgKi8KKyNkZWZpbmUgU1lOQ19PRkZTRVQgIDB4MDcgICAgIC8qIFN5bmNocm9ub3VzIE9mZnNldCAgICAgICAgICAqLworI2RlZmluZSBDT05GX1JFR18xICAgMHgwOCAgICAgLyogQ29uZmlndXJhdGlvbiByZWdpc3RlciAxICAgICovCisjZGVmaW5lIENPTkZfUkVHXzIgICAweDBCICAgICAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIDIgICAgKi8KKyNkZWZpbmUgQ09ORl9SRUdfMyAgIDB4MEMgICAgIC8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMyAgICAqLworI2RlZmluZSBDT05GX1JFR180ICAgMHgwRCAgICAgLyogQ29uZmlndXJhdGlvbiByZWdpc3RlciA0ICAgICovCisjZGVmaW5lIFRDX0hJR0ggICAgICAweDBFICAgICAvKiBUcmFuc2ZlciBjb3VudGVyIGhpZ2ggICAgICAgKi8KKyNkZWZpbmUgUElPX0ZJRk9fMSAgIDB4MTAgICAgIC8qIFBJTyBGSUZPIHJlZ2lzdGVyIDEgICAgICAgICAqLworI2RlZmluZSBQSU9fRklGT18yICAgMHgxMSAgICAgLyogUElPIEZJRk8gcmVnaXN0ZXIgMiAgICAgICAgICovCisjZGVmaW5lIFBJT19GSUZPXzMgICAweDEyICAgICAvKiBQSU8gRklGTyByZWdpc3RlciAzICAgICAgICAgKi8KKyNkZWZpbmUgUElPX0ZJRk9fNCAgIDB4MTMgICAgIC8qIFBJTyBGSUZPIHJlZ2lzdGVyIDQgICAgICAgICAqLworI2RlZmluZSBQSU9fRklGT19DTlQgMHgxNCAgICAgLyogUElPIEZJRk8gY291bnQgICAgICAgICAgICAgICovCisjZGVmaW5lIFBJT19JTlRfUkVHICAweDE1ICAgICAvKiBQSU8gaW50ZXJydXB0IHJlZ2lzdGVyICAgICAgKi8KKyNkZWZpbmUgQ09ORl9SRUdfNSAgIDB4MTYgICAgIC8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgNSAgICAqLworI2RlZmluZSBGRUFUVVJFX0VOICAgMHgxRCAgICAgLyogRmVhdHVyZSBFbmFibGUgcmVnaXN0ZXIgICAgICovCisKKy8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMSBlbnRyaWVzOiAqLworLyogQml0cyAyLTA6IFNDU0kgSUQgb2YgaG9zdCBhZGFwdGVyICovCisjZGVmaW5lIFNDTSAgICAweDgwICAgICAgICAgICAgICAgICAgICAgLyogU2xvdyBDYWJsZSBNb2RlICAgICAgICAgICAgICAqLworI2RlZmluZSBTUklEICAgMHg0MCAgICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgUmVzZXQgSW50ZXJydXB0IERpc2FibGUgKi8KKyNkZWZpbmUgUFRNICAgIDB4MjAgICAgICAgICAgICAgICAgICAgICAvKiBQYXJpdHkgVGVzdCBNb2RlICAgICAgICAgICAgICovCisjZGVmaW5lIEVQQyAgICAweDEwICAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIFBhcml0eSBDaGVja2luZyAgICAgICAqLworI2RlZmluZSBDVE1FICAgMHgwOCAgICAgICAgICAgICAgICAgICAgIC8qIFNwZWNpYWwgVGVzdCBNb2RlICAgICAgICAgICAgKi8KKworLyogQ29uZmlndXJhdGlvbiByZWdpc3RlciAyIGVudHJpZXM6ICovCisjZGVmaW5lIEZFICAgICAweDQwICAgICAgICAgICAgICAgICAgICAgLyogRmVhdHVyZXMgRW5hYmxlICAgICAgICAgICAgICAqLworI2RlZmluZSBTQ1NJMiAgMHgwOCAgICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgMiBFbmFibGUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVEJQQSAgIDB4MDQgICAgICAgICAgICAgICAgICAgICAvKiBUYXJnZXQgQmFkIFBhcml0eSBBYm9ydCAgICAgICovCisKKy8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMyBlbnRyaWVzOiAqLworI2RlZmluZSBJRE1SQyAgMHg4MCAgICAgICAgICAgICAgICAgICAgIC8qIElEIE1lc3NhZ2UgUmVzZXJ2ZWQgQ2hlY2sgICAgKi8KKyNkZWZpbmUgUVRFICAgIDB4NDAgICAgICAgICAgICAgICAgICAgICAvKiBRdWV1ZSBUYWcgRW5hYmxlICAgICAgICAgICAgICovCisjZGVmaW5lIENEQjEwICAweDIwICAgICAgICAgICAgICAgICAgICAgLyogQ29tbWFuZCBEZXNjcmlwdG9yIEJsb2NrIDEwICAqLworI2RlZmluZSBGU0NTSSAgMHgxMCAgICAgICAgICAgICAgICAgICAgIC8qIEZhc3RTQ1NJICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkNMSyAgIDB4MDggICAgICAgICAgICAgICAgICAgICAvKiBGYXN0Q2xvY2sgICAgICAgICAgICAgICAgICAgICovCisKKy8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgNCBlbnRyaWVzOiAqLworI2RlZmluZSBSQlMgICAgMHgwOCAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIGJhbmsgc2VsZWN0ICAgICAgICAgKi8KKyNkZWZpbmUgRUFOICAgIDB4MDQgICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgQWN0aXZlIE5lZ290aWF0aW9uICAgICovCisKKy8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgNSBlbnRyaWVzOiAqLworI2RlZmluZSBMUFNSICAgMHg4MCAgICAgICAgICAgICAgICAgICAgIC8qIExvd2VyIFBvd2VyIFNDU0kgUmVzZXQgICAgICAgKi8KKyNkZWZpbmUgSUUgICAgIDB4MjAgICAgICAgICAgICAgICAgICAgICAvKiBJbnRlcnJ1cHQgRW5hYmxlICAgICAgICAgICAgICovCisjZGVmaW5lIExQTSAgICAweDAyICAgICAgICAgICAgICAgICAgICAgLyogTG93IFBvd2VyIE1vZGUgICAgICAgICAgICAgICAqLworI2RlZmluZSBXU0UwICAgMHgwMSAgICAgICAgICAgICAgICAgICAgIC8qIDBXUyBFbmFibGUgICAgICAgICAgICAgICAgICAgKi8KKworLyogSW50ZXJydXB0IHJlZ2lzdGVyIGVudHJpZXM6ICovCisjZGVmaW5lIFNSU1QgICAweDgwICAgICAgICAgICAgICAgICAgICAgLyogU0NTSSBSZXNldCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJTENNRCAgMHg0MCAgICAgICAgICAgICAgICAgICAgIC8qIElsbGVnYWwgQ29tbWFuZCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRElTICAgIDB4MjAgICAgICAgICAgICAgICAgICAgICAvKiBEaXNjb25uZWN0ICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJTICAgICAweDEwICAgICAgICAgICAgICAgICAgICAgLyogQnVzIFNlcnZpY2UgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQyAgICAgMHgwOCAgICAgICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIENvbXBsZXRlICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkVTRUwgIDB4MDQgICAgICAgICAgICAgICAgICAgICAvKiBSZXNlbGVjdGVkICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNJICAgICAweDAzICAgICAgICAgICAgICAgICAgICAgLyogU2VsZWN0aW9uIEludGVycnVwdCAgICAgICAgICAqLworCisvKiBTdGF0dXMgUmVnaXN0ZXIgRW50cmllczogKi8KKyNkZWZpbmUgU0NJICAgIDB4ODAgICAgICAgICAgICAgICAgICAgICAvKiBTQ1NJIENvcmUgSW50ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdFICAgICAweDQwICAgICAgICAgICAgICAgICAgICAgLyogR3Jvc3MgRXJyb3IgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQRSAgICAgMHgyMCAgICAgICAgICAgICAgICAgICAgIC8qIFBhcml0eSBFcnJvciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVEMgICAgIDB4MTAgICAgICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hbCBDb3VudCAgICAgICAgICAgICAgICovCisjZGVmaW5lIFZHQyAgICAweDA4ICAgICAgICAgICAgICAgICAgICAgLyogVmFsaWQgR3JvdXAgQ29kZSAgICAgICAgICAgICAqLworI2RlZmluZSBQSEJJVFMgMHgwNyAgICAgICAgICAgICAgICAgICAgIC8qIFBoYXNlIGJpdHMgICAgICAgICAgICAgICAgICAgKi8KKworLyogUElPIEludGVycnVwdCBSZWdpc3RlciBFbnRyaWVzOiAqLworI2RlZmluZSBTQ0kgICAgMHg4MCAgICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgQ29yZSBJbnQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUEZJICAgIDB4NDAgICAgICAgICAgICAgICAgICAgICAvKiBQSU8gRklGTyBJbnRlcnJ1cHQgICAgICAgICAgICovCisjZGVmaW5lIEZVTEwgICAweDIwICAgICAgICAgICAgICAgICAgICAgLyogUElPIEZJRk8gRnVsbCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTVBUWSAgMHgxMCAgICAgICAgICAgICAgICAgICAgIC8qIFBJTyBGSUZPIEVtcHR5ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0UgICAgIDB4MDggICAgICAgICAgICAgICAgICAgICAvKiBDb2xsaXNpb24gRXJyb3IgICAgICAgICAgICAgICovCisjZGVmaW5lIE9VRSAgICAweDA0ICAgICAgICAgICAgICAgICAgICAgLyogT3ZlcmZsb3cgLyBVbmRlcmZsb3cgZXJyb3IgICAqLworI2RlZmluZSBGSUUgICAgMHgwMiAgICAgICAgICAgICAgICAgICAgIC8qIEZ1bGwgSW50ZXJydXB0IEVuYWJsZSAgICAgICAgKi8KKyNkZWZpbmUgRUlFICAgIDB4MDEgICAgICAgICAgICAgICAgICAgICAvKiBFbXB0eSBJbnRlcnJ1cHQgRW5hYmxlICAgICAgICovCisKKy8qIFNZTTUzQzQxNiBTQ1NJIHBoYXNlcyAobG93ZXIgMyBiaXRzIG9mIFNZTTUzQzQxNl9TVEFUVVNfUkVHKSAqLworI2RlZmluZSBQSEFTRV9EQVRBX09VVCAgICAweDAwCisjZGVmaW5lIFBIQVNFX0RBVEFfSU4gICAgIDB4MDEKKyNkZWZpbmUgUEhBU0VfQ09NTUFORCAgICAgMHgwMgorI2RlZmluZSBQSEFTRV9TVEFUVVMgICAgICAweDAzCisjZGVmaW5lIFBIQVNFX1JFU0VSVkVEXzEgIDB4MDQKKyNkZWZpbmUgUEhBU0VfUkVTRVJWRURfMiAgMHgwNQorI2RlZmluZSBQSEFTRV9NRVNTQUdFX09VVCAweDA2CisjZGVmaW5lIFBIQVNFX01FU1NBR0VfSU4gIDB4MDcKKworLyogU1lNNTNDNDE2IGNvcmUgY29tbWFuZHMgKi8KKyNkZWZpbmUgTk9PUCAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEZMVVNIX0ZJRk8gICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBSRVNFVF9DSElQICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgUkVTRVRfU0NTSV9CVVMgICAgICAgICAgICAweDAzCisjZGVmaW5lIERJU0FCTEVfU0VMX1JFU0VMICAgICAgICAgMHg0NQorI2RlZmluZSBSRVNFTF9TRVEgICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgU0VMX1dJVEhPVVRfQVROX1NFUSAgICAgICAweDQxCisjZGVmaW5lIFNFTF9XSVRIX0FUTl9TRVEgICAgICAgICAgMHg0MgorI2RlZmluZSBTRUxfV0lUSF9BVE5fQU5EX1NUT1BfU0VRIDB4NDMKKyNkZWZpbmUgRU5BQkxFX1NFTF9SRVNFTCAgICAgICAgICAweDQ0CisjZGVmaW5lIFNFTF9XSVRIX0FUTjNfU0VRICAgICAgICAgMHg0NgorI2RlZmluZSBSRVNFTDNfU0VRICAgICAgICAgICAgICAgIDB4NDcKKyNkZWZpbmUgU05EX01TRyAgICAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIFNORF9TVEFUICAgICAgICAgICAgICAgICAgMHgyMQorI2RlZmluZSBTTkRfREFUQSAgICAgICAgICAgICAgICAgIDB4MjIKKyNkZWZpbmUgRElTQ09OTkVDVF9TRVEgICAgICAgICAgICAweDIzCisjZGVmaW5lIFRFUk1JTkFURV9TRVEgICAgICAgICAgICAgMHgyNAorI2RlZmluZSBUQVJHRVRfQ09NTV9DT01QTEVURV9TRVEgIDB4MjUKKyNkZWZpbmUgRElTQ09OTiAgICAgICAgICAgICAgICAgICAweDI3CisjZGVmaW5lIFJFQ1ZfTVNHX1NFUSAgICAgICAgICAgICAgMHgyOAorI2RlZmluZSBSRUNWX0NNRCAgICAgICAgICAgICAgICAgIDB4MjkKKyNkZWZpbmUgUkVDVl9EQVRBICAgICAgICAgICAgICAgICAweDJBCisjZGVmaW5lIFJFQ1ZfQ01EX1NFUSAgICAgICAgICAgICAgMHgyQgorI2RlZmluZSBUQVJHRVRfQUJPUlRfUElPICAgICAgICAgIDB4MDQKKyNkZWZpbmUgVFJBTlNGRVJfSU5GT1JNQVRJT04gICAgICAweDEwCisjZGVmaW5lIElOSVRfQ09NTV9DT01QTEVURV9TRVEgICAgMHgxMQorI2RlZmluZSBNU0dfQUNDRVBURUQgICAgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgVFJBTlNGRVJfUEFEICAgICAgICAgICAgICAweDE4CisjZGVmaW5lIFNFVF9BVE4gICAgICAgICAgICAgICAgICAgMHgxQQorI2RlZmluZSBSRVNFVF9BVE4gICAgICAgICAgICAgICAgIDB4MUIKKyNkZWZpbmUgSUxMRUdBTCAgICAgICAgICAgICAgICAgICAweEZGCisKKyNkZWZpbmUgUElPX01PREUgICAgICAgICAgICAgICAgICAweDgwCisKKyNkZWZpbmUgSU9fUkFOR0UgMHgyMCAgICAgICAgIC8qIDB4MDAgLSAweDFGICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElEICAgICAgICJzeW01M2M0MTYiCS8qIEF0dGVudGlvbjogY29waWVkIHRvIHRoZSBzeW01M2M0MTYuaCAqLworI2RlZmluZSBQSU9fU0laRSAxMjggICAgICAgICAgLyogU2l6ZSBvZiBQSU8gZmlmbyBpcyAxMjggYnl0ZXMgKi8KKworI2RlZmluZSBSRUFEX1RJTUVPVVQgICAgICAgICAgICAgIDE1MAorI2RlZmluZSBXUklURV9USU1FT1VUICAgICAgICAgICAgIDE1MAorCisjaWZkZWYgTU9EVUxFCisKKyNkZWZpbmUgc3ltNTNjNDE2X2Jhc2Ugc3ltNTNjNDE2CisjZGVmaW5lIHN5bTUzYzQxNl9iYXNlXzEgc3ltNTNjNDE2XzEKKyNkZWZpbmUgc3ltNTNjNDE2X2Jhc2VfMiBzeW01M2M0MTZfMgorI2RlZmluZSBzeW01M2M0MTZfYmFzZV8zIHN5bTUzYzQxNl8zCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3ltNTNjNDE2X2Jhc2VbMl0gPSB7MCwwfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3ltNTNjNDE2X2Jhc2VfMVsyXSA9IHswLDB9Oworc3RhdGljIHVuc2lnbmVkIGludCBzeW01M2M0MTZfYmFzZV8yWzJdID0gezAsMH07CitzdGF0aWMgdW5zaWduZWQgaW50IHN5bTUzYzQxNl9iYXNlXzNbMl0gPSB7MCwwfTsKKworI2VuZGlmCisKKyNkZWZpbmUgTUFYSE9TVFMgNAorCisjZGVmaW5lIFNHX0FERFJFU1MoYnVmZmVyKSAgICAgKChjaGFyICopIChwYWdlX2FkZHJlc3MoKGJ1ZmZlciktPnBhZ2UpKyhidWZmZXIpLT5vZmZzZXQpKQorCitlbnVtIHBoYXNlcworeworCWlkbGUsCisJZGF0YV9vdXQsCisJZGF0YV9pbiwKKwljb21tYW5kX3BoLAorCXN0YXR1c19waCwKKwltZXNzYWdlX291dCwKKwltZXNzYWdlX2luCit9OworCit0eXBlZGVmIHN0cnVjdAoreworCWludCBiYXNlOworCWludCBpcnE7CisJaW50IHNjc2lfaWQ7Cit9IGhvc3Q7CisKK3N0YXRpYyBob3N0IGhvc3RzW01BWEhPU1RTXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgezAsIDAsIFNZTTUzQzQxNl9TQ1NJX0lEfSwKKyAgICAgICAgICAgICAgICAgICAgICAgezAsIDAsIFNZTTUzQzQxNl9TQ1NJX0lEfSwKKyAgICAgICAgICAgICAgICAgICAgICAgezAsIDAsIFNZTTUzQzQxNl9TQ1NJX0lEfSwKKyAgICAgICAgICAgICAgICAgICAgICAgezAsIDAsIFNZTTUzQzQxNl9TQ1NJX0lEfQorICAgICAgICAgICAgICAgICAgICAgICB9OworCitzdGF0aWMgaW50IGhvc3RfaW5kZXggPSAwOworc3RhdGljIGNoYXIgaW5mb1sxMjBdOworc3RhdGljIFNjc2lfQ21uZCAqY3VycmVudF9jb21tYW5kID0gTlVMTDsKK3N0YXRpYyBpbnQgZmFzdHBpbyA9IDE7CisKK3N0YXRpYyBpbnQgcHJvYmVhZGRyc1tdID0gezB4MjAwLCAweDIyMCwgMHgyNDAsIDB9OworCitzdGF0aWMgdm9pZCBzeW01M2M0MTZfc2V0X3RyYW5zZmVyX2NvdW50ZXIoaW50IGJhc2UsIHVuc2lnbmVkIGludCBsZW4pCit7CisJLyogUHJvZ3JhbSBUcmFuc2ZlciBDb3VudGVyICovCisJb3V0YihsZW4gJiAweDAwMDBGRiwgYmFzZSArIFRDX0xPVyk7CisJb3V0YigobGVuICYgMHgwMEZGMDApID4+IDgsIGJhc2UgKyBUQ19NSUQpOworCW91dGIoKGxlbiAmIDB4RkYwMDAwKSA+PiAxNiwgYmFzZSArIFRDX0hJR0gpOworfQorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN5bTUzYzQxNl9sb2NrKTsKKworLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgKi8KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBzeW01M2M0MTZfcmVhZChpbnQgYmFzZSwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGludCBvcmlnX2xlbiA9IGxlbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwl1bnNpZ25lZCBpbnQgYnl0ZXNfbGVmdDsKKwl1bnNpZ25lZCBsb25nIGk7CisJaW50IHRpbWVvdXQgPSBSRUFEX1RJTUVPVVQ7CisKKwkvKiBEbyB0cmFuc2ZlciAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzeW01M2M0MTZfbG9jaywgZmxhZ3MpOworCXdoaWxlKGxlbiAmJiB0aW1lb3V0KQorCXsKKwkJYnl0ZXNfbGVmdCA9IGluYihiYXNlICsgUElPX0ZJRk9fQ05UKTsgLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBQSU8gRklGTyAqLworCQlpZihmYXN0cGlvICYmIGJ5dGVzX2xlZnQgPiAzKQorCQl7CisJCQlpbnNsKGJhc2UgKyBQSU9fRklGT18xLCBidWZmZXIsIGJ5dGVzX2xlZnQgPj4gMik7CisJCQlidWZmZXIgKz0gYnl0ZXNfbGVmdCAmIDB4RkM7CisJCQlsZW4gLT0gYnl0ZXNfbGVmdCAmIDB4RkM7CisJCX0KKwkJZWxzZSBpZihieXRlc19sZWZ0ID4gMCkKKwkJeworCQkJbGVuIC09IGJ5dGVzX2xlZnQ7CisJCQlmb3IoOyBieXRlc19sZWZ0ID4gMDsgYnl0ZXNfbGVmdC0tKQorCQkJCSooYnVmZmVyKyspID0gaW5iKGJhc2UgKyBQSU9fRklGT18xKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWkgPSBqaWZmaWVzICsgdGltZW91dDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5bTUzYzQxNl9sb2NrLCBmbGFncyk7CisJCQl3aGlsZSh0aW1lX2JlZm9yZShqaWZmaWVzLCBpKSAmJiAoaW5iKGJhc2UgKyBQSU9fSU5UX1JFRykgJiBFTVBUWSkgJiYgdGltZW91dCkKKwkJCQlpZihpbmIoYmFzZSArIFBJT19JTlRfUkVHKSAmIFNDSSkKKwkJCQkJdGltZW91dCA9IDA7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3ltNTNjNDE2X2xvY2ssIGZsYWdzKTsKKwkJCWlmKGluYihiYXNlICsgUElPX0lOVF9SRUcpICYgRU1QVFkpCisJCQkJdGltZW91dCA9IDA7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3ltNTNjNDE2X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gb3JpZ19sZW4gLSBsZW47Cit9CisKKy8qIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuICovCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgc3ltNTNjNDE2X3dyaXRlKGludCBiYXNlLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IG9yaWdfbGVuID0gbGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXVuc2lnbmVkIGludCBidWZmZXJmcmVlOworCXVuc2lnbmVkIGxvbmcgaTsKKwl1bnNpZ25lZCBpbnQgdGltZW91dCA9IFdSSVRFX1RJTUVPVVQ7CisKKwkvKiBEbyB0cmFuc2ZlciAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzeW01M2M0MTZfbG9jaywgZmxhZ3MpOworCXdoaWxlKGxlbiAmJiB0aW1lb3V0KQorCXsKKwkJYnVmZmVyZnJlZSA9IFBJT19TSVpFIC0gaW5iKGJhc2UgKyBQSU9fRklGT19DTlQpOworCQlpZihidWZmZXJmcmVlID4gbGVuKQorCQkJYnVmZmVyZnJlZSA9IGxlbjsKKwkJaWYoZmFzdHBpbyAmJiBidWZmZXJmcmVlID4gMykKKwkJeworCQkJb3V0c2woYmFzZSArIFBJT19GSUZPXzEsIGJ1ZmZlciwgYnVmZmVyZnJlZSA+PiAyKTsKKwkJCWJ1ZmZlciArPSBidWZmZXJmcmVlICYgMHhGQzsKKwkJCWxlbiAtPSBidWZmZXJmcmVlICYgMHhGQzsKKwkJfQorCQllbHNlIGlmKGJ1ZmZlcmZyZWUgPiAwKQorCQl7CisJCQlsZW4gLT0gYnVmZmVyZnJlZTsKKwkJCWZvcig7IGJ1ZmZlcmZyZWUgPiAwOyBidWZmZXJmcmVlLS0pCisJCQkJb3V0YigqKGJ1ZmZlcisrKSwgYmFzZSArIFBJT19GSUZPXzEpOworCQl9CisJCWVsc2UKKwkJeworCQkJaSA9IGppZmZpZXMgKyB0aW1lb3V0OworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3ltNTNjNDE2X2xvY2ssIGZsYWdzKTsKKwkJCXdoaWxlKHRpbWVfYmVmb3JlKGppZmZpZXMsIGkpICYmIChpbmIoYmFzZSArIFBJT19JTlRfUkVHKSAmIEZVTEwpICYmIHRpbWVvdXQpCisJCQkJOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN5bTUzYzQxNl9sb2NrLCBmbGFncyk7CisJCQlpZihpbmIoYmFzZSArIFBJT19JTlRfUkVHKSAmIEZVTEwpCisJCQkJdGltZW91dCA9IDA7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3ltNTNjNDE2X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gb3JpZ19sZW4gLSBsZW47Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzeW01M2M0MTZfaW50cl9oYW5kbGUoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpkZXYgPSBkZXZfaWQ7CisJaW50IGJhc2UgPSAwOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzX3JlZywgcGlvX2ludF9yZWcsIGludF9yZWc7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3Q7CisJdW5zaWduZWQgaW50IHNnY291bnQ7CisJdW5zaWduZWQgaW50IHRvdF90cmFucyA9IDA7CisKKwkvKiBXZSBzZWFyY2ggdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgaG9zdCBhZGFwdGVyIHdoaWNoIGNhdXNlZCB0aGUgaW50ZXJydXB0ICovCisJLyogRklYTUU6IHNob3VsZCBwYXNzIGRldl9pZCBzZW5zaWJseSBhcyBob3N0c1tpXSAqLworCWZvcihpID0gMDsgaSA8IGhvc3RfaW5kZXggJiYgIWJhc2U7IGkrKykKKwkJaWYoaXJxID09IGhvc3RzW2ldLmlycSkKKwkJCWJhc2UgPSBob3N0c1tpXS5iYXNlOworCS8qIElmIG5vIGFkYXB0ZXIgZm91bmQsIHdlIGNhbm5vdCBoYW5kbGUgdGhlIGludGVycnVwdC4gTGVhdmUgYSBtZXNzYWdlICovCisJLyogYW5kIGNvbnRpbnVlLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpZighYmFzZSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAic3ltNTNjNDE2OiBObyBob3N0IGFkYXB0ZXIgZGVmaW5lZCBmb3IgaW50ZXJydXB0ICVkXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCS8qIE5vdyB3ZSBoYXZlIHRoZSBiYXNlIGFkZHJlc3MgYW5kIHdlIGNhbiBzdGFydCBoYW5kbGluZyB0aGUgaW50ZXJydXB0ICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZShkZXYtPmhvc3RfbG9jayxmbGFncyk7CisJc3RhdHVzX3JlZyA9IGluYihiYXNlICsgU1RBVFVTX1JFRyk7CisJcGlvX2ludF9yZWcgPSBpbmIoYmFzZSArIFBJT19JTlRfUkVHKTsKKwlpbnRfcmVnID0gaW5iKGJhc2UgKyBJTlRfUkVHKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkvKiBGaXJzdCwgd2UgaGFuZGxlIGVycm9yIGNvbmRpdGlvbnMgKi8KKwlpZihpbnRfcmVnICYgU0NJKSAgICAgICAgIC8qIFNDU0kgUmVzZXQgKi8KKwl7CisJCXByaW50ayhLRVJOX0RFQlVHICJzeW01M2M0MTY6IFJlc2V0IHJlY2VpdmVkXG4iKTsKKwkJY3VycmVudF9jb21tYW5kLT5TQ3AucGhhc2UgPSBpZGxlOworCQljdXJyZW50X2NvbW1hbmQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJY3VycmVudF9jb21tYW5kLT5zY3NpX2RvbmUoY3VycmVudF9jb21tYW5kKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlnb3RvIG91dDsKKwl9CisJaWYoaW50X3JlZyAmIElMQ01EKSAgICAgICAvKiBJbGxlZ2FsIENvbW1hbmQgKi8KKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInN5bTUzYzQxNjogSWxsZWdhbCBDb21tYW5kOiAweCUwMnguXG4iLCBpbmIoYmFzZSArIENPTU1BTkRfUkVHKSk7CisJCWN1cnJlbnRfY29tbWFuZC0+U0NwLnBoYXNlID0gaWRsZTsKKwkJY3VycmVudF9jb21tYW5kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWN1cnJlbnRfY29tbWFuZC0+c2NzaV9kb25lKGN1cnJlbnRfY29tbWFuZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJZ290byBvdXQ7CisJfQorCWlmKHN0YXR1c19yZWcgJiBHRSkgICAgICAgICAvKiBHcm9zcyBFcnJvciAqLworCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic3ltNTNjNDE2OiBDb250cm9sbGVyIHJlcG9ydHMgZ3Jvc3MgZXJyb3IuXG4iKTsKKwkJY3VycmVudF9jb21tYW5kLT5TQ3AucGhhc2UgPSBpZGxlOworCQljdXJyZW50X2NvbW1hbmQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJY3VycmVudF9jb21tYW5kLT5zY3NpX2RvbmUoY3VycmVudF9jb21tYW5kKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlnb3RvIG91dDsKKwl9CisJaWYoc3RhdHVzX3JlZyAmIFBFKSAgICAgICAgIC8qIFBhcml0eSBFcnJvciAqLworCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic3ltNTNjNDE2OlNDU0kgcGFyaXR5IGVycm9yLlxuIik7CisJCWN1cnJlbnRfY29tbWFuZC0+U0NwLnBoYXNlID0gaWRsZTsKKwkJY3VycmVudF9jb21tYW5kLT5yZXN1bHQgPSBESURfUEFSSVRZIDw8IDE2OworCQlzcGluX2xvY2tfaXJxc2F2ZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCQljdXJyZW50X2NvbW1hbmQtPnNjc2lfZG9uZShjdXJyZW50X2NvbW1hbmQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWdvdG8gb3V0OworCX0KKwlpZihwaW9faW50X3JlZyAmIChDRSB8IE9VRSkpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzeW01M2M0MTY6IFBJTyBpbnRlcnJ1cHQgZXJyb3IuXG4iKTsKKwkJY3VycmVudF9jb21tYW5kLT5TQ3AucGhhc2UgPSBpZGxlOworCQljdXJyZW50X2NvbW1hbmQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJY3VycmVudF9jb21tYW5kLT5zY3NpX2RvbmUoY3VycmVudF9jb21tYW5kKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlnb3RvIG91dDsKKwl9CisJaWYoaW50X3JlZyAmIERJUykgICAgICAgICAgIC8qIERpc2Nvbm5lY3QgKi8KKwl7CisJCWlmKGN1cnJlbnRfY29tbWFuZC0+U0NwLnBoYXNlICE9IG1lc3NhZ2VfaW4pCisJCQljdXJyZW50X2NvbW1hbmQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQllbHNlCisJCQljdXJyZW50X2NvbW1hbmQtPnJlc3VsdCA9IChjdXJyZW50X2NvbW1hbmQtPlNDcC5TdGF0dXMgJiAweEZGKSB8ICgoY3VycmVudF9jb21tYW5kLT5TQ3AuTWVzc2FnZSAmIDB4RkYpIDw8IDgpIHwgKERJRF9PSyA8PCAxNik7CisJCWN1cnJlbnRfY29tbWFuZC0+U0NwLnBoYXNlID0gaWRsZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJY3VycmVudF9jb21tYW5kLT5zY3NpX2RvbmUoY3VycmVudF9jb21tYW5kKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlnb3RvIG91dDsKKwl9CisJLyogTm93IHdlIGhhbmRsZSBTQ1NJIHBoYXNlcyAgICAgICAgICovCisKKwlzd2l0Y2goc3RhdHVzX3JlZyAmIFBIQklUUykgICAgICAgLyogRmlsdGVyIFNDU0kgcGhhc2Ugb3V0IG9mIHN0YXR1cyByZWcgKi8KKwl7CisJCWNhc2UgUEhBU0VfREFUQV9PVVQ6CisJCXsKKwkJCWlmKGludF9yZWcgJiBCUykKKwkJCXsKKwkJCQljdXJyZW50X2NvbW1hbmQtPlNDcC5waGFzZSA9IGRhdGFfb3V0OworCQkJCW91dGIoRkxVU0hfRklGTywgYmFzZSArIENPTU1BTkRfUkVHKTsKKwkJCQlzeW01M2M0MTZfc2V0X3RyYW5zZmVyX2NvdW50ZXIoYmFzZSwgY3VycmVudF9jb21tYW5kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCQkJCW91dGIoVFJBTlNGRVJfSU5GT1JNQVRJT04gfCBQSU9fTU9ERSwgYmFzZSArIENPTU1BTkRfUkVHKTsKKwkJCQlpZighY3VycmVudF9jb21tYW5kLT51c2Vfc2cpCisJCQkJCXRvdF90cmFucyA9IHN5bTUzYzQxNl93cml0ZShiYXNlLCBjdXJyZW50X2NvbW1hbmQtPnJlcXVlc3RfYnVmZmVyLCBjdXJyZW50X2NvbW1hbmQtPnJlcXVlc3RfYnVmZmxlbik7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJc2djb3VudCA9IGN1cnJlbnRfY29tbWFuZC0+dXNlX3NnOworCQkJCQlzZ2xpc3QgPSBjdXJyZW50X2NvbW1hbmQtPnJlcXVlc3RfYnVmZmVyOworCQkJCQl3aGlsZShzZ2NvdW50LS0pCisJCQkJCXsKKwkJCQkJCXRvdF90cmFucyArPSBzeW01M2M0MTZfd3JpdGUoYmFzZSwgU0dfQUREUkVTUyhzZ2xpc3QpLCBzZ2xpc3QtPmxlbmd0aCk7CisJCQkJCQlzZ2xpc3QrKzsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZih0b3RfdHJhbnMgPCBjdXJyZW50X2NvbW1hbmQtPnVuZGVyZmxvdykKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic3ltNTNjNDE2OiBVbmRlcmZsb3csIHdyb3RlICVkIGJ5dGVzLCByZXF1ZXN0IGZvciAlZCBieXRlcy5cbiIsIHRvdF90cmFucywgY3VycmVudF9jb21tYW5kLT51bmRlcmZsb3cpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFBIQVNFX0RBVEFfSU46CisJCXsKKwkJCWlmKGludF9yZWcgJiBCUykKKwkJCXsKKwkJCQljdXJyZW50X2NvbW1hbmQtPlNDcC5waGFzZSA9IGRhdGFfaW47CisJCQkJb3V0YihGTFVTSF9GSUZPLCBiYXNlICsgQ09NTUFORF9SRUcpOworCQkJCXN5bTUzYzQxNl9zZXRfdHJhbnNmZXJfY291bnRlcihiYXNlLCBjdXJyZW50X2NvbW1hbmQtPnJlcXVlc3RfYnVmZmxlbik7CisJCQkJb3V0YihUUkFOU0ZFUl9JTkZPUk1BVElPTiB8IFBJT19NT0RFLCBiYXNlICsgQ09NTUFORF9SRUcpOworCQkJCWlmKCFjdXJyZW50X2NvbW1hbmQtPnVzZV9zZykKKwkJCQkJdG90X3RyYW5zID0gc3ltNTNjNDE2X3JlYWQoYmFzZSwgY3VycmVudF9jb21tYW5kLT5yZXF1ZXN0X2J1ZmZlciwgY3VycmVudF9jb21tYW5kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCXNnY291bnQgPSBjdXJyZW50X2NvbW1hbmQtPnVzZV9zZzsKKwkJCQkJc2dsaXN0ID0gY3VycmVudF9jb21tYW5kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJCQkJd2hpbGUoc2djb3VudC0tKQorCQkJCQl7CisJCQkJCQl0b3RfdHJhbnMgKz0gc3ltNTNjNDE2X3JlYWQoYmFzZSwgU0dfQUREUkVTUyhzZ2xpc3QpLCBzZ2xpc3QtPmxlbmd0aCk7CisJCQkJCQlzZ2xpc3QrKzsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZih0b3RfdHJhbnMgPCBjdXJyZW50X2NvbW1hbmQtPnVuZGVyZmxvdykKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic3ltNTNjNDE2OiBVbmRlcmZsb3csIHJlYWQgJWQgYnl0ZXMsIHJlcXVlc3QgZm9yICVkIGJ5dGVzLlxuIiwgdG90X3RyYW5zLCBjdXJyZW50X2NvbW1hbmQtPnVuZGVyZmxvdyk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgUEhBU0VfQ09NTUFORDoKKwkJeworCQkJY3VycmVudF9jb21tYW5kLT5TQ3AucGhhc2UgPSBjb21tYW5kX3BoOworCQkJcHJpbnRrKEtFUk5fRVJSICJzeW01M2M0MTY6IFVua25vd24gaW50ZXJydXB0IGluIGNvbW1hbmQgcGhhc2UuXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBQSEFTRV9TVEFUVVM6CisJCXsKKwkJCWN1cnJlbnRfY29tbWFuZC0+U0NwLnBoYXNlID0gc3RhdHVzX3BoOworCQkJb3V0YihGTFVTSF9GSUZPLCBiYXNlICsgQ09NTUFORF9SRUcpOworCQkJb3V0YihJTklUX0NPTU1fQ09NUExFVEVfU0VRLCBiYXNlICsgQ09NTUFORF9SRUcpOworCQkJYnJlYWs7CisJCX0KKwkJCisJCWNhc2UgUEhBU0VfUkVTRVJWRURfMToKKwkJY2FzZSBQSEFTRV9SRVNFUlZFRF8yOgorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgInN5bTUzYzQxNjogUmVzZXJ2ZWQgcGhhc2Ugb2NjdXJyZWQuXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBQSEFTRV9NRVNTQUdFX09VVDoKKwkJeworCQkJY3VycmVudF9jb21tYW5kLT5TQ3AucGhhc2UgPSBtZXNzYWdlX291dDsKKwkJCW91dGIoU0VUX0FUTiwgYmFzZSArIENPTU1BTkRfUkVHKTsKKwkJCW91dGIoTVNHX0FDQ0VQVEVELCBiYXNlICsgQ09NTUFORF9SRUcpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFBIQVNFX01FU1NBR0VfSU46CisJCXsKKwkJCWN1cnJlbnRfY29tbWFuZC0+U0NwLnBoYXNlID0gbWVzc2FnZV9pbjsKKwkJCWN1cnJlbnRfY29tbWFuZC0+U0NwLlN0YXR1cyA9IGluYihiYXNlICsgU0NTSV9GSUZPKTsKKwkJCWN1cnJlbnRfY29tbWFuZC0+U0NwLk1lc3NhZ2UgPSBpbmIoYmFzZSArIFNDU0lfRklGTyk7CisJCQlpZihjdXJyZW50X2NvbW1hbmQtPlNDcC5NZXNzYWdlID09IFNBVkVfUE9JTlRFUlMgfHwgY3VycmVudF9jb21tYW5kLT5TQ3AuTWVzc2FnZSA9PSBESVNDT05ORUNUKQorCQkJCW91dGIoU0VUX0FUTiwgYmFzZSArIENPTU1BTkRfUkVHKTsKKwkJCW91dGIoTVNHX0FDQ0VQVEVELCBiYXNlICsgQ09NTUFORF9SRUcpOworCQkJYnJlYWs7CisJCX0KKwl9CitvdXQ6CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBzeW01M2M0MTZfaW5pdChpbnQgYmFzZSwgaW50IHNjc2lfaWQpCit7CisJb3V0YihSRVNFVF9DSElQLCBiYXNlICsgQ09NTUFORF9SRUcpOworCW91dGIoTk9PUCwgYmFzZSArIENPTU1BTkRfUkVHKTsKKwlvdXRiKDB4OTksIGJhc2UgKyBUT00pOyAvKiBUaW1lIG91dCBvZiAyNTAgbXMgKi8KKwlvdXRiKDB4MDUsIGJhc2UgKyBTVFApOworCW91dGIoMHgwMCwgYmFzZSArIFNZTkNfT0ZGU0VUKTsKKwlvdXRiKEVQQyB8IHNjc2lfaWQsIGJhc2UgKyBDT05GX1JFR18xKTsKKwlvdXRiKEZFIHwgU0NTSTIgfCBUQlBBLCBiYXNlICsgQ09ORl9SRUdfMik7CisJb3V0YihJRE1SQyB8IFFURSB8IENEQjEwIHwgRlNDU0kgfCBGQ0xLLCBiYXNlICsgQ09ORl9SRUdfMyk7CisJb3V0YigweDgzIHwgRUFOLCBiYXNlICsgQ09ORl9SRUdfNCk7CisJb3V0YihJRSB8IFdTRTAsIGJhc2UgKyBDT05GX1JFR181KTsKKwlvdXRiKDAsIGJhc2UgKyBGRUFUVVJFX0VOKTsKK30KKworc3RhdGljIGludCBzeW01M2M0MTZfcHJvYmVpcnEoaW50IGJhc2UsIGludCBzY3NpX2lkKQoreworCWludCBpcnEsIGlycXM7CisJdW5zaWduZWQgbG9uZyBpOworCisJLyogQ2xlYXIgaW50ZXJydXB0IHJlZ2lzdGVyICovCisJaW5iKGJhc2UgKyBJTlRfUkVHKTsKKwkvKiBTdGFydCBwcm9iaW5nIGZvciBpcnEncyAqLworCWlycXMgPSBwcm9iZV9pcnFfb24oKTsKKwkvKiBSZWluaXQgY2hpcCAqLworCXN5bTUzYzQxNl9pbml0KGJhc2UsIHNjc2lfaWQpOworCS8qIENhdXNlIGludGVycnVwdCAqLworCW91dGIoTk9PUCwgYmFzZSArIENPTU1BTkRfUkVHKTsKKwlvdXRiKElMTEVHQUwsIGJhc2UgKyBDT01NQU5EX1JFRyk7CisJb3V0YigweDA3LCBiYXNlICsgREVTVF9CVVNfSUQpOworCW91dGIoMHgwMCwgYmFzZSArIERFU1RfQlVTX0lEKTsKKwkvKiBXYWl0IGZvciBpbnRlcnJ1cHQgdG8gb2NjdXIgKi8KKwlpID0gamlmZmllcyArIDIwOworCXdoaWxlKHRpbWVfYmVmb3JlKGppZmZpZXMsIGkpICYmICEoaW5iKGJhc2UgKyBTVEFUVVNfUkVHKSAmIFNDSSkpCisJCWJhcnJpZXIoKTsKKwlpZih0aW1lX2JlZm9yZV9lcShpLCBqaWZmaWVzKSkJLyogdGltZWQgb3V0ICovCisJCXJldHVybiAwOworCS8qIEdldCBvY2N1cnJlZCBpcnEgKi8KKwlpcnEgPSBwcm9iZV9pcnFfb2ZmKGlycXMpOworCXN5bTUzYzQxNl9pbml0KGJhc2UsIHNjc2lfaWQpOworCXJldHVybiBpcnE7Cit9CisKKy8qIFNldHVwOiBzeW01M2M0MTY9YmFzZSxpcnEgKi8KK3ZvaWQgc3ltNTNjNDE2X3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKQoreworCWludCBpOworCisJaWYoaG9zdF9pbmRleCA+PSBNQVhIT1NUUykKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInN5bTUzYzQxNjogVG9vIG1hbnkgaG9zdHMgZGVmaW5lZFxuIik7CisJCXJldHVybjsKKwl9CisJaWYoaW50c1swXSA8IDEgfHwgaW50c1swXSA+IDIpCisJeworCQlwcmludGsoS0VSTl9FUlIgInN5bTUzYzQxNjogV3JvbmcgbnVtYmVyIG9mIHBhcmFtZXRlcnM6XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJzeW01M2M0MTY6IHVzYWdlOiBzeW01M2M0MTY9PGJhc2U+Wyw8aXJxPl1cbiIpOworCQlyZXR1cm47CisJfQorCWZvcihpID0gMDsgaSA8IGhvc3RfaW5kZXggJiYgaSA+PSAwOyBpKyspCisJICAgICAgICBpZihob3N0c1tpXS5iYXNlID09IGludHNbMV0pCisgICAgICAgIAkJaSA9IC0yOworCWlmKGkgPj0gMCkKKwl7CisgICAgICAgIAlob3N0c1tob3N0X2luZGV4XS5iYXNlID0gaW50c1sxXTsKKyAgICAgICAgCWhvc3RzW2hvc3RfaW5kZXhdLmlycSA9IChpbnRzWzBdID09IDIpPyBpbnRzWzJdIDogMDsKKyAgICAgICAgCWhvc3RfaW5kZXgrKzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc3ltNTNjNDE2X3Rlc3QoaW50IGJhc2UpCit7CisJb3V0YihSRVNFVF9DSElQLCBiYXNlICsgQ09NTUFORF9SRUcpOworCW91dGIoTk9PUCwgYmFzZSArIENPTU1BTkRfUkVHKTsKKwlpZihpbmIoYmFzZSArIENPTU1BTkRfUkVHKSAhPSBOT09QKQorCQlyZXR1cm4gMDsKKwlpZighaW5iKGJhc2UgKyBUQ19ISUdIKSB8fCBpbmIoYmFzZSArIFRDX0hJR0gpID09IDB4RkYpCisJCXJldHVybiAwOworCWlmKChpbmIoYmFzZSArIFBJT19JTlRfUkVHKSAmIChGVUxMIHwgRU1QVFkgfCBDRSB8IE9VRSB8IEZJRSB8IEVJRSkpICE9IEVNUFRZKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgc3RydWN0IGlzYXBucF9kZXZpY2VfaWQgaWRfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXsJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignUycsJ0wnLCdJJyksIElTQVBOUF9GVU5DVElPTigweDQxNjEpLCAwIH0sCisJewlJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAorCQlJU0FQTlBfVkVORE9SKCdTJywnTCcsJ0knKSwgSVNBUE5QX0ZVTkNUSU9OKDB4NDE2MyksIDAgfSwKKwl7CUlTQVBOUF9ERVZJQ0VfU0lOR0xFX0VORCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGlzYXBucCwgaWRfdGFibGUpOworCitzdGF0aWMgdm9pZCBzeW01M2M0MTZfcHJvYmUodm9pZCkKK3sKKwlpbnQgKmJhc2UgPSBwcm9iZWFkZHJzOworCWludCBpbnRzWzJdOworCisJaW50c1swXSA9IDE7CisJZm9yKDsgKmJhc2U7IGJhc2UrKykgeworCQlpZiAocmVxdWVzdF9yZWdpb24oKmJhc2UsIElPX1JBTkdFLCBJRCkpIHsKKwkJCWlmIChzeW01M2M0MTZfdGVzdCgqYmFzZSkpIHsKKwkJCQlpbnRzWzFdID0gKmJhc2U7CisJCQkJc3ltNTNjNDE2X3NldHVwKE5VTEwsIGludHMpOworCQkJfQorCQkJcmVsZWFzZV9yZWdpb24oKmJhc2UsIElPX1JBTkdFKTsKKwkJfQorCX0KK30KKworaW50IF9faW5pdCBzeW01M2M0MTZfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBTY3NpX0hvc3QgKiBzaHBudCA9IE5VTEw7CisJaW50IGk7CisJaW50IGNvdW50OworCXN0cnVjdCBwbnBfZGV2ICppZGV2ID0gTlVMTDsKKwkKKyNpZmRlZiBNT0RVTEUKKwlpbnQgaW50c1szXTsKKworCWludHNbMF0gPSAyOworCWlmKHN5bTUzYzQxNl9iYXNlKQorCXsKKwkJaW50c1sxXSA9IHN5bTUzYzQxNl9iYXNlWzBdOworCQlpbnRzWzJdID0gc3ltNTNjNDE2X2Jhc2VbMV07CisJCXN5bTUzYzQxNl9zZXR1cChOVUxMLCBpbnRzKTsKKwl9CisJaWYoc3ltNTNjNDE2X2Jhc2VfMSkKKwl7CisJCWludHNbMV0gPSBzeW01M2M0MTZfYmFzZV8xWzBdOworCQlpbnRzWzJdID0gc3ltNTNjNDE2X2Jhc2VfMVsxXTsKKwkJc3ltNTNjNDE2X3NldHVwKE5VTEwsIGludHMpOworCX0KKwlpZihzeW01M2M0MTZfYmFzZV8yKQorCXsKKwkJaW50c1sxXSA9IHN5bTUzYzQxNl9iYXNlXzJbMF07CisJCWludHNbMl0gPSBzeW01M2M0MTZfYmFzZV8yWzFdOworCQlzeW01M2M0MTZfc2V0dXAoTlVMTCwgaW50cyk7CisJfQorCWlmKHN5bTUzYzQxNl9iYXNlXzMpCisJeworCQlpbnRzWzFdID0gc3ltNTNjNDE2X2Jhc2VfM1swXTsKKwkJaW50c1syXSA9IHN5bTUzYzQxNl9iYXNlXzNbMV07CisJCXN5bTUzYzQxNl9zZXR1cChOVUxMLCBpbnRzKTsKKwl9CisjZW5kaWYKKwlwcmludGsoS0VSTl9JTkZPICJzeW01M2M0MTYuYzogJXNcbiIsIFZFUlNJT05fU1RSSU5HKTsKKworCWZvciAoaT0wOyBpZF90YWJsZVtpXS52ZW5kb3IgIT0gMDsgaSsrKSB7CisJCXdoaWxlKChpZGV2PXBucF9maW5kX2RldihOVUxMLCBpZF90YWJsZVtpXS52ZW5kb3IsCisJCQkJCWlkX3RhYmxlW2ldLmZ1bmN0aW9uLCBpZGV2KSkhPU5VTEwpCisJCXsKKwkJCWludCBpWzNdOworCisJCQlpZihwbnBfZGV2aWNlX2F0dGFjaChpZGV2KTwwKQorCQkJeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInN5bTUzYzQxNjogdW5hYmxlIHRvIGF0dGFjaCBQblAgZGV2aWNlLlxuIik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZihwbnBfYWN0aXZhdGVfZGV2KGlkZXYpIDwgMCkKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzeW01M2M0MTY6IHVuYWJsZSB0byBhY3RpdmF0ZSBQblAgZGV2aWNlLlxuIik7CisJCQkJcG5wX2RldmljZV9kZXRhY2goaWRldik7CisJCQkJY29udGludWU7CisJCQkKKwkJCX0KKworCQkJaVswXSA9IDI7CisJCQlpWzFdID0gcG5wX3BvcnRfc3RhcnQoaWRldiwgMCk7CisgCQkJaVsyXSA9IHBucF9pcnEoaWRldiwgMCk7CisKKwkJCXByaW50ayhLRVJOX0lORk8gInN5bTUzYzQxNjogSVNBUG5QIGNhcmQgZm91bmQgYW5kIGNvbmZpZ3VyZWQgYXQgMHglWCwgSVJRICVkLlxuIiwKKwkJCQlpWzFdLCBpWzJdKTsKKyAJCQlzeW01M2M0MTZfc2V0dXAoTlVMTCwgaSk7CisgCQl9CisJfQorCXN5bTUzYzQxNl9wcm9iZSgpOworCisJLyogTm93IHdlIHJlZ2lzdGVyIGFuZCBzZXQgdXAgZWFjaCBob3N0IGFkYXB0ZXIgZm91bmQuLi4gKi8KKwlmb3IoY291bnQgPSAwLCBpID0gMDsgaSA8IGhvc3RfaW5kZXg7IGkrKykgeworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGhvc3RzW2ldLmJhc2UsIElPX1JBTkdFLCBJRCkpCisJCQljb250aW51ZTsKKwkJaWYgKCFzeW01M2M0MTZfdGVzdChob3N0c1tpXS5iYXNlKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm8gc3ltNTNjNDE2IGZvdW5kIGF0IGFkZHJlc3MgMHglMDN4XG4iLCBob3N0c1tpXS5iYXNlKTsKKwkJCWdvdG8gZmFpbF9yZWxlYXNlX3JlZ2lvbjsKKwkJfQorCisJCS8qIFdlIGRvbid0IGhhdmUgYW4gaXJxIHlldCwgc28gd2Ugc2hvdWxkIHByb2JlIGZvciBvbmUgKi8KKwkJaWYgKCFob3N0c1tpXS5pcnEpCisJCQlob3N0c1tpXS5pcnEgPSBzeW01M2M0MTZfcHJvYmVpcnEoaG9zdHNbaV0uYmFzZSwgaG9zdHNbaV0uc2NzaV9pZCk7CisJCWlmICghaG9zdHNbaV0uaXJxKQorCQkJZ290byBmYWlsX3JlbGVhc2VfcmVnaW9uOworCQorCQlzaHBudCA9IHNjc2lfcmVnaXN0ZXIodHBudCwgMCk7CisJCWlmICghc2hwbnQpCisJCQlnb3RvIGZhaWxfcmVsZWFzZV9yZWdpb247CisJCS8qIFJlcXVlc3QgZm9yIHNwZWNpZmllZCBJUlEgKi8KKwkJaWYgKHJlcXVlc3RfaXJxKGhvc3RzW2ldLmlycSwgc3ltNTNjNDE2X2ludHJfaGFuZGxlLCAwLCBJRCwgc2hwbnQpKQorCQkJZ290byBmYWlsX2ZyZWVfaG9zdDsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3ltNTNjNDE2X2xvY2ssIGZsYWdzKTsKKwkJc2hwbnQtPnVuaXF1ZV9pZCA9IGhvc3RzW2ldLmJhc2U7CisJCXNocG50LT5pb19wb3J0ID0gaG9zdHNbaV0uYmFzZTsKKwkJc2hwbnQtPm5faW9fcG9ydCA9IElPX1JBTkdFOworCQlzaHBudC0+aXJxID0gaG9zdHNbaV0uaXJxOworCQlzaHBudC0+dGhpc19pZCA9IGhvc3RzW2ldLnNjc2lfaWQ7CisJCXN5bTUzYzQxNl9pbml0KGhvc3RzW2ldLmJhc2UsIGhvc3RzW2ldLnNjc2lfaWQpOworCQljb3VudCsrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW01M2M0MTZfbG9jaywgZmxhZ3MpOworCQljb250aW51ZTsKKworIGZhaWxfZnJlZV9ob3N0OgorCQlzY3NpX3VucmVnaXN0ZXIoc2hwbnQpOworIGZhaWxfcmVsZWFzZV9yZWdpb246CisJCXJlbGVhc2VfcmVnaW9uKGhvc3RzW2ldLmJhc2UsIElPX1JBTkdFKTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitjb25zdCBjaGFyICpzeW01M2M0MTZfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpTQ2hvc3QpCit7CisJaW50IGk7CisJaW50IGJhc2UgPSBTQ2hvc3QtPmlvX3BvcnQ7CisJaW50IGlycSA9IFNDaG9zdC0+aXJxOworCWludCBzY3NpX2lkID0gMDsKKwlpbnQgcmV2ID0gaW5iKGJhc2UgKyBUQ19ISUdIKTsKKworCWZvcihpID0gMDsgaSA8IGhvc3RfaW5kZXg7IGkrKykKKwkJaWYoaG9zdHNbaV0uYmFzZSA9PSBiYXNlKQorCQkJc2NzaV9pZCA9IGhvc3RzW2ldLnNjc2lfaWQ7CisJc3ByaW50ZihpbmZvLCAiU3ltYmlvcyBMb2dpYyA1M2M0MTYgKHJldi4gJWQpIGF0IDB4JTAzeCwgaXJxICVkLCBTQ1NJLUlEICVkLCAlcyBwaW8iLCByZXYsIGJhc2UsIGlycSwgc2NzaV9pZCwgKGZhc3RwaW8pPyAiZmFzdCIgOiAic2xvdyIpOworCXJldHVybiBpbmZvOworfQorCitpbnQgc3ltNTNjNDE2X3F1ZXVlY29tbWFuZChTY3NpX0NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQoreworCWludCBiYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWludCBpOworCisJLyogU3RvcmUgYmFzZSByZWdpc3RlciBhcyB3ZSBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIGNvbnRyb2xsZXIgaW4gdGhlIHN5c3RlbSAqLworCWJhc2UgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OworCWN1cnJlbnRfY29tbWFuZCA9IFNDcG50OyAgICAgICAgICAgICAgICAgIC8qIHNldCBjdXJyZW50IGNvbW1hbmQgICAgICAgICAgICAgICAgKi8KKwljdXJyZW50X2NvbW1hbmQtPnNjc2lfZG9uZSA9IGRvbmU7ICAgICAgICAvKiBzZXQgcHRyIHRvIGRvbmUgZnVuY3Rpb24gICAgICAgICAgICovCisJY3VycmVudF9jb21tYW5kLT5TQ3AucGhhc2UgPSBjb21tYW5kX3BoOyAgLyogY3VycmVjdCBwaGFzZSBpcyB0aGUgY29tbWFuZCBwaGFzZSAqLworCWN1cnJlbnRfY29tbWFuZC0+U0NwLlN0YXR1cyA9IDA7CisJY3VycmVudF9jb21tYW5kLT5TQ3AuTWVzc2FnZSA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3ltNTNjNDE2X2xvY2ssIGZsYWdzKTsKKwlvdXRiKFNDcG50LT5kZXZpY2UtPmlkLCBiYXNlICsgREVTVF9CVVNfSUQpOyAvKiBTZXQgc2NzaSBpZCB0YXJnZXQgICAgICAgICovCisJb3V0YihGTFVTSF9GSUZPLCBiYXNlICsgQ09NTUFORF9SRUcpOyAgICAvKiBGbHVzaCBTQ1NJIGFuZCBQSU8gRklGTydzICovCisJLyogV3JpdGUgU0NTSSBjb21tYW5kIGludG8gdGhlIFNDU0kgZmlmbyAqLworCWZvcihpID0gMDsgaSA8IFNDcG50LT5jbWRfbGVuOyBpKyspCisJCW91dGIoU0NwbnQtPmNtbmRbaV0sIGJhc2UgKyBTQ1NJX0ZJRk8pOworCS8qIFN0YXJ0IHNlbGVjdGlvbiBzZXF1ZW5jZSAqLworCW91dGIoU0VMX1dJVEhPVVRfQVROX1NFUSwgYmFzZSArIENPTU1BTkRfUkVHKTsKKwkvKiBOb3cgYW4gaW50ZXJydXB0IHdpbGwgYmUgZ2VuZXJhdGVkIHdoaWNoIHdlIHdpbGwgY2F0Y2ggaW4gb3V0IGludGVycnVwdCByb3V0aW5lICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3ltNTNjNDE2X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzeW01M2M0MTZfYWJvcnQoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwlyZXR1cm4gRkFJTEVEOworfQorCitzdGF0aWMgaW50IHN5bTUzYzQxNl9idXNfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwlyZXR1cm4gRkFJTEVEOworfQorCitzdGF0aWMgaW50IHN5bTUzYzQxNl9kZXZpY2VfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwlyZXR1cm4gRkFJTEVEOworfQorCitzdGF0aWMgaW50IHN5bTUzYzQxNl9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqU0NwbnQpCit7CisJaW50IGJhc2U7CisJaW50IHNjc2lfaWQgPSAtMTsJCisJaW50IGk7CisKKwkvKiBwcmludGsoInN5bTUzYzQxNl9yZXNldFxuIik7ICovCisJYmFzZSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisJLyogc2VhcmNoIHNjc2lfaWQgLSBmaXhtZSwgd2Ugc2hvdWxkbnQgbmVlZCB0byBpdGVyYXRlIGZvciB0aGlzISAqLworCWZvcihpID0gMDsgaSA8IGhvc3RfaW5kZXggJiYgc2NzaV9pZCAhPSAtMTsgaSsrKQorCQlpZihob3N0c1tpXS5iYXNlID09IGJhc2UpCisJCQlzY3NpX2lkID0gaG9zdHNbaV0uc2NzaV9pZDsKKwlvdXRiKFJFU0VUX0NISVAsIGJhc2UgKyBDT01NQU5EX1JFRyk7CisJb3V0YihOT09QIHwgUElPX01PREUsIGJhc2UgKyBDT01NQU5EX1JFRyk7CisJb3V0YihSRVNFVF9TQ1NJX0JVUywgYmFzZSArIENPTU1BTkRfUkVHKTsKKwlzeW01M2M0MTZfaW5pdChiYXNlLCBzY3NpX2lkKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzeW01M2M0MTZfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpZiAoc2hvc3QtPmlycSkKKwkJZnJlZV9pcnEoc2hvc3QtPmlycSwgc2hvc3QpOworCWlmIChzaG9zdC0+aW9fcG9ydCAmJiBzaG9zdC0+bl9pb19wb3J0KQorCQlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgc2hvc3QtPm5faW9fcG9ydCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3ltNTNjNDE2X2Jpb3NfcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsCisJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKmlwKQoreworCWludCBzaXplOworCisJc2l6ZSA9IGNhcGFjaXR5OworCWlwWzBdID0gNjQ7CQkJCS8qIGhlYWRzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpcFsxXSA9IDMyOwkJCQkvKiBzZWN0b3JzICAgICAgICAgICAgICAgICAgICAgICovCisJaWYoKGlwWzJdID0gc2l6ZSA+PiAxMSkgPiAxMDI0KQkJLyogY3lsaW5kZXJzLCB0ZXN0IGZvciBiaWcgZGlzayAqLworCXsKKwkJaXBbMF0gPSAyNTU7CQkJLyogaGVhZHMgICAgICAgICAgICAgICAgICAgICAgICAqLworCQlpcFsxXSA9IDYzOwkJCS8qIHNlY3RvcnMgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJaXBbMl0gPSBzaXplIC8gKDI1NSAqIDYzKTsJLyogY3lsaW5kZXJzICAgICAgICAgICAgICAgICAgICAqLworCX0KKwlyZXR1cm4gMDsKK30KKworLyogTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQgKi8KKyNpZmRlZiBNT0RVTEUKKworTU9EVUxFX0FVVEhPUigiTGlldmVuIFdpbGxlbXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KHN5bTUzYzQxNiwgdWludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoc3ltNTNjNDE2XzEsIHVpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KHN5bTUzYzQxNl8yLCB1aW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShzeW01M2M0MTZfMywgdWludCwgTlVMTCwgMCk7CisKKyNlbmRpZgorCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lID0JCSJzeW01M2M0MTYiLAorCS5uYW1lID0JCQkiU3ltYmlvcyBMb2dpYyA1M2M0MTYiLAorCS5kZXRlY3QgPQkJc3ltNTNjNDE2X2RldGVjdCwKKwkuaW5mbyA9CQkJc3ltNTNjNDE2X2luZm8sCQorCS5xdWV1ZWNvbW1hbmQgPQkJc3ltNTNjNDE2X3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlciA9CXN5bTUzYzQxNl9hYm9ydCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyID1zeW01M2M0MTZfaG9zdF9yZXNldCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIgPSBzeW01M2M0MTZfYnVzX3Jlc2V0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9c3ltNTNjNDE2X2RldmljZV9yZXNldCwKKwkucmVsZWFzZSA9IAkJc3ltNTNjNDE2X3JlbGVhc2UsCisJLmJpb3NfcGFyYW0gPQkJc3ltNTNjNDE2X2Jpb3NfcGFyYW0sCisJLmNhbl9xdWV1ZSA9CQkxLAorCS50aGlzX2lkID0JCVNZTTUzQzQxNl9TQ1NJX0lELAorCS5zZ190YWJsZXNpemUgPQkJMzIsCisJLmNtZF9wZXJfbHVuID0JCTEsCisJLnVuY2hlY2tlZF9pc2FfZG1hID0JMSwKKwkudXNlX2NsdXN0ZXJpbmcgPQlFTkFCTEVfQ0xVU1RFUklORywKK307CisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zeW01M2M0MTYuaCBiL2RyaXZlcnMvc2NzaS9zeW01M2M0MTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzBlM2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N5bTUzYzQxNi5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiAgc3ltNTNjNDE2LmgKKyAqIAorICogIENvcHlyaWdodCAoQykgMTk5OCBMaWV2ZW4gV2lsbGVtcyAobHdfbGludXhAaG90bWFpbC5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogIGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX1NZTTUzQzQxNl9ICisjZGVmaW5lIF9TWU01M0M0MTZfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBTWU01M0M0MTZfU0NTSV9JRCA3CisKK3N0YXRpYyBpbnQgc3ltNTNjNDE2X2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKik7CitzdGF0aWMgY29uc3QgY2hhciAqc3ltNTNjNDE2X2luZm8oc3RydWN0IFNjc2lfSG9zdCAqKTsKK3N0YXRpYyBpbnQgc3ltNTNjNDE2X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqKTsKK3N0YXRpYyBpbnQgc3ltNTNjNDE2X3F1ZXVlY29tbWFuZChTY3NpX0NtbmQgKiwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSk7CitzdGF0aWMgaW50IHN5bTUzYzQxNl9hYm9ydChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IHN5bTUzYzQxNl9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgc3ltNTNjNDE2X2J1c19yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IHN5bTUzYzQxNl9kZXZpY2VfcmVzZXQoU2NzaV9DbW5kICopOworc3RhdGljIGludCBzeW01M2M0MTZfYmlvc19wYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLAorCQlzZWN0b3JfdCwgaW50ICopOworc3RhdGljIHZvaWQgc3ltNTNjNDE2X3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3M2U4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvTWFrZWZpbGUKQEAgLTAsMCArMSw0IEBACisjIE1ha2VmaWxlIGZvciB0aGUgTkNSL1NZTUJJT1MvTFNJIDUzQzhYWCBQQ0kgU0NTSSBjb250cm9sbGVycyBkcml2ZXIuCisKK3N5bTUzYzh4eC1vYmpzIDo9IHN5bV9mdy5vIHN5bV9nbHVlLm8gc3ltX2hpcGQubyBzeW1fbWFsbG9jLm8gc3ltX252cmFtLm8KK29iai0kKENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yKSA6PSBzeW01M2M4eHgubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bTUzYzh4eC5oIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bTUzYzh4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MTEwMzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltNTNjOHh4LmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBEZXZpY2UgZHJpdmVyIGZvciB0aGUgU1lNQklPUy9MU0lMT0dJQyA1M0M4WFggYW5kIDUzQzEwMTAgZmFtaWx5IAorICogb2YgUENJLVNDU0kgSU8gcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSAgR2VyYXJkIFJvdWRpZXIgPGdyb3VkaWVyQGZyZWUuZnI+CisgKgorICogVGhpcyBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBMaW51eCBzeW01M2M4eHggZHJpdmVyLgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgIEdlcmFyZCBSb3VkaWVyCisgKgorICogVGhlIHN5bTUzYzh4eCBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBuY3I1M2M4eHggZHJpdmVyIHRoYXQgaGFkIGJlZW4gCisgKiBhIHBvcnQgb2YgdGhlIEZyZWVCU0QgbmNyIGRyaXZlciB0byBMaW51eC0xLjIuMTMuCisgKgorICogVGhlIG9yaWdpbmFsIG5jciBkcml2ZXIgaGFzIGJlZW4gd3JpdHRlbiBmb3IgMzg2YnNkIGFuZCBGcmVlQlNEIGJ5CisgKiAgICAgICAgIFdvbGZnYW5nIFN0YW5nbG1laWVyICAgICAgICA8d29sZkBjb2xvZ25lLmRlPgorICogICAgICAgICBTdGVmYW4gRXNzZXIgICAgICAgICAgICAgICAgPHNlQG1pLlVuaS1Lb2Vsbi5kZT4KKyAqIENvcHlyaWdodCAoQykgMTk5NCAgV29sZmdhbmcgU3RhbmdsbWVpZXIKKyAqCisgKiBPdGhlciBtYWpvciBjb250cmlidXRpb25zOgorICoKKyAqIE5WUkFNIGRldGVjdGlvbiBhbmQgcmVhZGluZy4KKyAqIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIFdhbHRoYW0gPGRvcm1vdXNlQGZhcnNyb2J0LmRlbW9uLmNvLnVrPgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBTWU01M0M4WFhfSAorI2RlZmluZSBTWU01M0M4WFhfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKy8qCisgKiAgRE1BIGFkZHJlc3NpbmcgbW9kZS4KKyAqCisgKiAgMCA6IDMyIGJpdCBhZGRyZXNzaW5nIGZvciBhbGwgY2hpcHMuCisgKiAgMSA6IDQwIGJpdCBhZGRyZXNzaW5nIHdoZW4gc3VwcG9ydGVkIGJ5IGNoaXAuCisgKiAgMiA6IDY0IGJpdCBhZGRyZXNzaW5nIHdoZW4gc3VwcG9ydGVkIGJ5IGNoaXAsCisgKiAgICAgIGxpbWl0ZWQgdG8gMTYgc2VnbWVudHMgb2YgNCBHQiAtPiA2NCBHQiBtYXguCisgKi8KKyNkZWZpbmUJU1lNX0NPTkZfRE1BX0FERFJFU1NJTkdfTU9ERSBDT05GSUdfU0NTSV9TWU01M0M4WFhfRE1BX0FERFJFU1NJTkdfTU9ERQorCisvKgorICogIE5WUkFNIHN1cHBvcnQuCisgKi8KKyNpZiAxCisjZGVmaW5lIFNZTV9DT05GX05WUkFNX1NVUFBPUlQJCSgxKQorI2VuZGlmCisKKy8qCisgKiAgVGhlc2Ugb3B0aW9ucyBhcmUgbm90IHR1bmFibGUgZnJvbSAnbWFrZSBjb25maWcnCisgKi8KKyNpZiAxCisjZGVmaW5lCVNZTV9MSU5VWF9QUk9DX0lORk9fU1VQUE9SVAorI2RlZmluZSBTWU1fTElOVVhfVVNFUl9DT01NQU5EX1NVUFBPUlQKKyNkZWZpbmUgU1lNX0xJTlVYX1VTRVJfSU5GT19TVVBQT1JUCisjZGVmaW5lIFNZTV9MSU5VWF9ERUJVR19DT05UUk9MX1NVUFBPUlQKKyNlbmRpZgorCisvKgorICogIEFsc28gaGFuZGxlIG9sZCBOQ1IgY2hpcHMgaWYgbm90ICgwKS4KKyAqLworI2RlZmluZSBTWU1fQ09ORl9HRU5FUklDX1NVUFBPUlQJKDEpCisKKy8qCisgKiAgQWxsb3cgdGFncyBmcm9tIDIgdG8gMjU2LCBkZWZhdWx0IDgKKyAqLworI2lmbmRlZiBDT05GSUdfU0NTSV9TWU01M0M4WFhfTUFYX1RBR1MKKyNkZWZpbmUgQ09ORklHX1NDU0lfU1lNNTNDOFhYX01BWF9UQUdTCSg4KQorI2VuZGlmCisKKyNpZglDT05GSUdfU0NTSV9TWU01M0M4WFhfTUFYX1RBR1MgPCAyCisjZGVmaW5lIFNZTV9DT05GX01BWF9UQUcJKDIpCisjZWxpZglDT05GSUdfU0NTSV9TWU01M0M4WFhfTUFYX1RBR1MgPiAyNTYKKyNkZWZpbmUgU1lNX0NPTkZfTUFYX1RBRwkoMjU2KQorI2Vsc2UKKyNkZWZpbmUJU1lNX0NPTkZfTUFYX1RBRwlDT05GSUdfU0NTSV9TWU01M0M4WFhfTUFYX1RBR1MKKyNlbmRpZgorCisjaWZuZGVmCUNPTkZJR19TQ1NJX1NZTTUzQzhYWF9ERUZBVUxUX1RBR1MKKyNkZWZpbmUJQ09ORklHX1NDU0lfU1lNNTNDOFhYX0RFRkFVTFRfVEFHUwlTWU1fQ09ORl9NQVhfVEFHCisjZW5kaWYKKworLyoKKyAqICBBbnl3YXksIHdlIGNvbmZpZ3VyZSB0aGUgZHJpdmVyIGZvciBhdCBsZWFzdCA2NCB0YWdzIHBlciBMVU4uIDopCisgKi8KKyNpZglTWU1fQ09ORl9NQVhfVEFHIDw9IDY0CisjZGVmaW5lIFNZTV9DT05GX01BWF9UQUdfT1JERVIJKDYpCisjZWxpZglTWU1fQ09ORl9NQVhfVEFHIDw9IDEyOAorI2RlZmluZSBTWU1fQ09ORl9NQVhfVEFHX09SREVSCSg3KQorI2Vsc2UKKyNkZWZpbmUgU1lNX0NPTkZfTUFYX1RBR19PUkRFUgkoOCkKKyNlbmRpZgorCisvKgorICogIE1heCBudW1iZXIgb2YgU0cgZW50cmllcy4KKyAqLworI2RlZmluZSBTWU1fQ09ORl9NQVhfU0cJCSg5NikKKworLyoKKyAqICBEcml2ZXIgc2V0dXAgc3RydWN0dXJlLgorICoKKyAqICBUaGlzIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCBmcm9tIGxpbnV4IGNvbmZpZyBvcHRpb25zLgorICogIEl0IGNhbiBiZSBvdmVycmlkZGVuIGF0IGJvb3QtdXAgYnkgdGhlIGJvb3QgY29tbWFuZCBsaW5lLgorICovCitzdHJ1Y3Qgc3ltX2RyaXZlcl9zZXR1cCB7CisJdV9zaG9ydAltYXhfdGFnOworCXVfY2hhcglidXJzdF9vcmRlcjsKKwl1X2NoYXIJc2NzaV9sZWQ7CisJdV9jaGFyCXNjc2lfZGlmZjsKKwl1X2NoYXIJaXJxX21vZGU7CisJdV9jaGFyCXNjc2lfYnVzX2NoZWNrOworCXVfY2hhcglob3N0X2lkOworCisJdV9jaGFyCXZlcmJvc2U7CisJdV9jaGFyCXNldHRsZV9kZWxheTsKKwl1X2NoYXIJdXNlX252cmFtOworCXVfbG9uZwlleGNsdWRlc1s4XTsKKwljaGFyCXRhZ19jdHJsWzEwMF07Cit9OworCisjZGVmaW5lIFNZTV9TRVRVUF9NQVhfVEFHCQlzeW1fZHJpdmVyX3NldHVwLm1heF90YWcKKyNkZWZpbmUgU1lNX1NFVFVQX0JVUlNUX09SREVSCQlzeW1fZHJpdmVyX3NldHVwLmJ1cnN0X29yZGVyCisjZGVmaW5lIFNZTV9TRVRVUF9TQ1NJX0xFRAkJc3ltX2RyaXZlcl9zZXR1cC5zY3NpX2xlZAorI2RlZmluZSBTWU1fU0VUVVBfU0NTSV9ESUZGCQlzeW1fZHJpdmVyX3NldHVwLnNjc2lfZGlmZgorI2RlZmluZSBTWU1fU0VUVVBfSVJRX01PREUJCXN5bV9kcml2ZXJfc2V0dXAuaXJxX21vZGUKKyNkZWZpbmUgU1lNX1NFVFVQX1NDU0lfQlVTX0NIRUNLCXN5bV9kcml2ZXJfc2V0dXAuc2NzaV9idXNfY2hlY2sKKyNkZWZpbmUgU1lNX1NFVFVQX0hPU1RfSUQJCXN5bV9kcml2ZXJfc2V0dXAuaG9zdF9pZAorI2RlZmluZSBib290X3ZlcmJvc2UJCQlzeW1fZHJpdmVyX3NldHVwLnZlcmJvc2UKKworLyoKKyAqICBJbml0aWFsIHNldHVwLgorICoKKyAqICBDYW4gYmUgb3ZlcnJpZGVuIGF0IHN0YXJ0dXAgYnkgYSBjb21tYW5kIGxpbmUuCisgKi8KKyNkZWZpbmUgU1lNX0xJTlVYX0RSSVZFUl9TRVRVUAl7CQkJCVwKKwkubWF4X3RhZwk9IENPTkZJR19TQ1NJX1NZTTUzQzhYWF9ERUZBVUxUX1RBR1MsCVwKKwkuYnVyc3Rfb3JkZXIJPSA3LAkJCQkJXAorCS5zY3NpX2xlZAk9IDEsCQkJCQlcCisJLnNjc2lfZGlmZgk9IDEsCQkJCQlcCisJLmlycV9tb2RlCT0gMCwJCQkJCVwKKwkuc2NzaV9idXNfY2hlY2sJPSAxLAkJCQkJXAorCS5ob3N0X2lkCT0gNywJCQkJCVwKKwkudmVyYm9zZQk9IDAsCQkJCQlcCisJLnNldHRsZV9kZWxheQk9IDMsCQkJCQlcCisJLnVzZV9udnJhbQk9IDEsCQkJCQlcCit9CisKK2V4dGVybiBzdHJ1Y3Qgc3ltX2RyaXZlcl9zZXR1cCBzeW1fZHJpdmVyX3NldHVwOworZXh0ZXJuIHVuc2lnbmVkIGludCBzeW1fZGVidWdfZmxhZ3M7CisjZGVmaW5lIERFQlVHX0ZMQUdTCXN5bV9kZWJ1Z19mbGFncworCisvKgorICogIE1heCBudW1iZXIgb2YgdGFyZ2V0cy4KKyAqICBNYXhpbXVtIGlzIDE2IGFuZCB5b3UgYXJlIGFkdmlzZWQgbm90IHRvIGNoYW5nZSB0aGlzIHZhbHVlLgorICovCisjaWZuZGVmIFNZTV9DT05GX01BWF9UQVJHRVQKKyNkZWZpbmUgU1lNX0NPTkZfTUFYX1RBUkdFVAkoMTYpCisjZW5kaWYKKworLyoKKyAqICBNYXggbnVtYmVyIG9mIGxvZ2ljYWwgdW5pdHMuCisgKiAgU1BJLTIgYWxsb3dzIHVwIHRvIDY0IGxvZ2ljYWwgdW5pdHMsIGJ1dCBpbiByZWFsIGxpZmUsIHRhcmdldAorICogIHRoYXQgaW1wbGVtZW50cyBtb3JlIHRoYXQgNyBsb2dpY2FsIHVuaXRzIGFyZSBwcmV0dHkgcmFyZS4KKyAqICBBbnl3YXksIHRoZSBjb3N0IG9mIGFjY2VwdGluZyB1cCB0byA2NCBsb2dpY2FsIHVuaXQgaXMgbG93IGluIAorICogIHRoaXMgZHJpdmVyLCB0aHVzIGdvaW5nIHdpdGggdGhlIG1heGltdW0gaXMgYWNjZXB0YWJsZS4KKyAqLworI2lmbmRlZiBTWU1fQ09ORl9NQVhfTFVOCisjZGVmaW5lIFNZTV9DT05GX01BWF9MVU4JKDY0KQorI2VuZGlmCisKKy8qCisgKiAgTWF4IG51bWJlciBvZiBJTyBjb250cm9sIGJsb2NrcyBxdWV1ZWQgdG8gdGhlIGNvbnRyb2xsZXIuCisgKiAgRWFjaCBlbnRyeSBuZWVkcyA4IGJ5dGVzIGFuZCB0aGUgcXVldWVzIGFyZSBhbGxvY2F0ZWQgY29udGlndW91c2x5LgorICogIFNpbmNlIHdlIGRvbm5vdCB3YW50IHRvIGFsbG9jYXRlIG1vcmUgdGhhbiBhIHBhZ2UsIHRoZSB0aGVvcmljYWwgCisgKiAgbWF4aW11bSBpcyBQQUdFX1NJWkUvOC4gRm9yIHNhZmV0eSwgd2UgYW5ub3VuY2UgYSBiaXQgbGVzcyB0byB0aGUgCisgKiAgYWNjZXNzIG1ldGhvZC4gOikKKyAqICBXaGVuIG5vdCBzdXBwbGllZCwgYXMgaXQgaXMgc3VnZ2VzdGVkLCB0aGUgZHJpdmVyIGNvbXB1dGUgc29tZSAKKyAqICBnb29kIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlci4KKyAqLworLyogI2RlZmluZSBTWU1fQ09ORl9NQVhfU1RBUlQJKFBBR0VfU0laRS84IC0gMTYpICovCisKKy8qCisgKiAgU3VwcG9ydCBmb3IgSW1tZWRpYXRlIEFyYml0cmF0aW9uLgorICogIE5vdCBhZHZpc2VkLgorICovCisvKiAjZGVmaW5lIFNZTV9DT05GX0lBUkJfU1VQUE9SVCAqLworCisvKgorICogIE9ubHkgcmVsZXZhbnQgaWYgSUFSQiBzdXBwb3J0IGNvbmZpZ3VyZWQuCisgKiAgLSBNYXggbnVtYmVyIG9mIHN1Y2Nlc3NpdmUgc2V0dGluZ3Mgb2YgSUFSQiBoaW50cy4KKyAqICAtIFNldCBJQVJCIG9uIGFyYml0cmF0aW9uIGxvc3QuCisgKi8KKyNkZWZpbmUgU1lNX0NPTkZfSUFSQl9NQVggMworI2RlZmluZSBTWU1fQ09ORl9TRVRfSUFSQl9PTl9BUkJfTE9TVCAxCisKKy8qCisgKiAgUmV0dXJuaW5nIHdyb25nIHJlc2lkdWFscyBtYXkgbWFrZSBwcm9ibGVtcy4KKyAqICBXaGVuIHplcm8sIHRoaXMgZGVmaW5lIHRlbGxzIHRoZSBkcml2ZXIgdG8gCisgKiAgYWx3YXlzIHJldHVybiAwIGFzIHRyYW5zZmVyIHJlc2lkdWFsLgorICogIEJ0dywgYWxsIG15IHRlc3RpbmdzIG9mIHJlc2lkdWFscyBoYXZlIHN1Y2NlZWRlZC4KKyAqLworI2RlZmluZSBTWU1fU0VUVVBfUkVTSURVQUxfU1VQUE9SVCAxCisKKyNlbmRpZiAvKiBTWU01M0M4WFhfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9kZWZzLmggYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWJiODkxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9kZWZzLmgKQEAgLTAsMCArMSw3OTIgQEAKKy8qCisgKiBEZXZpY2UgZHJpdmVyIGZvciB0aGUgU1lNQklPUy9MU0lMT0dJQyA1M0M4WFggYW5kIDUzQzEwMTAgZmFtaWx5IAorICogb2YgUENJLVNDU0kgSU8gcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSAgR2VyYXJkIFJvdWRpZXIgPGdyb3VkaWVyQGZyZWUuZnI+CisgKgorICogVGhpcyBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBMaW51eCBzeW01M2M4eHggZHJpdmVyLgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgIEdlcmFyZCBSb3VkaWVyCisgKgorICogVGhlIHN5bTUzYzh4eCBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBuY3I1M2M4eHggZHJpdmVyIHRoYXQgaGFkIGJlZW4gCisgKiBhIHBvcnQgb2YgdGhlIEZyZWVCU0QgbmNyIGRyaXZlciB0byBMaW51eC0xLjIuMTMuCisgKgorICogVGhlIG9yaWdpbmFsIG5jciBkcml2ZXIgaGFzIGJlZW4gd3JpdHRlbiBmb3IgMzg2YnNkIGFuZCBGcmVlQlNEIGJ5CisgKiAgICAgICAgIFdvbGZnYW5nIFN0YW5nbG1laWVyICAgICAgICA8d29sZkBjb2xvZ25lLmRlPgorICogICAgICAgICBTdGVmYW4gRXNzZXIgICAgICAgICAgICAgICAgPHNlQG1pLlVuaS1Lb2Vsbi5kZT4KKyAqIENvcHlyaWdodCAoQykgMTk5NCAgV29sZmdhbmcgU3RhbmdsbWVpZXIKKyAqCisgKiBPdGhlciBtYWpvciBjb250cmlidXRpb25zOgorICoKKyAqIE5WUkFNIGRldGVjdGlvbiBhbmQgcmVhZGluZy4KKyAqIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIFdhbHRoYW0gPGRvcm1vdXNlQGZhcnNyb2J0LmRlbW9uLmNvLnVrPgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBTWU1fREVGU19ICisjZGVmaW5lIFNZTV9ERUZTX0gKKworI2RlZmluZSBTWU1fVkVSU0lPTiAiMi4yLjAiCisjZGVmaW5lIFNZTV9EUklWRVJfTkFNRQkic3ltLSIgU1lNX1ZFUlNJT04KKworLyoKKyAqCVNZTTUzQzhYWCBkZXZpY2UgZmVhdHVyZXMgZGVzY3JpcHRvci4KKyAqLworc3RydWN0IHN5bV9jaGlwIHsKKwl1X3Nob3J0CWRldmljZV9pZDsKKwl1X3Nob3J0CXJldmlzaW9uX2lkOworCWNoYXIJKm5hbWU7CisJdV9jaGFyCWJ1cnN0X21heDsJLyogbG9nLWJhc2UtMiBvZiBtYXggYnVyc3QgKi8KKwl1X2NoYXIJb2Zmc2V0X21heDsKKwl1X2NoYXIJbnJfZGl2aXNvcjsKKwl1X2NoYXIJbHBfcHJvYmVfYml0OworCXVfaW50CWZlYXR1cmVzOworI2RlZmluZSBGRV9MRUQwCQkoMTw8MCkKKyNkZWZpbmUgRkVfV0lERQkJKDE8PDEpICAgIC8qIFdpZGUgZGF0YSB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgRkVfVUxUUkEJKDE8PDIpCSAgLyogVWx0cmEgc3BlZWQgMjBNdHJhbnMvc2VjICovCisjZGVmaW5lIEZFX1VMVFJBMgkoMTw8MykJICAvKiBVbHRyYSAyIC0gNDAgTXRyYW5zL3NlYyAqLworI2RlZmluZSBGRV9EQkxSCQkoMTw8NCkJICAvKiBDbG9jayBkb3VibGVyIHByZXNlbnQgKi8KKyNkZWZpbmUgRkVfUVVBRAkJKDE8PDUpCSAgLyogQ2xvY2sgcXVhZHJ1cGxlciBwcmVzZW50ICovCisjZGVmaW5lIEZFX0VSTAkJKDE8PDYpICAgIC8qIEVuYWJsZSByZWFkIGxpbmUgKi8KKyNkZWZpbmUgRkVfQ0xTRQkJKDE8PDcpICAgIC8qIENhY2hlIGxpbmUgc2l6ZSBlbmFibGUgKi8KKyNkZWZpbmUgRkVfV1JJRQkJKDE8PDgpICAgIC8qIFdyaXRlICYgSW52YWxpZGF0ZSBlbmFibGUgKi8KKyNkZWZpbmUgRkVfRVJNUAkJKDE8PDkpICAgIC8qIEVuYWJsZSByZWFkIG11bHRpcGxlICovCisjZGVmaW5lIEZFX0JPRgkJKDE8PDEwKSAgIC8qIEJ1cnN0IG9wY29kZSBmZXRjaCAqLworI2RlZmluZSBGRV9ERlMJCSgxPDwxMSkgICAvKiBETUEgZmlmbyBzaXplICovCisjZGVmaW5lIEZFX1BGRU4JCSgxPDwxMikgICAvKiBQcmVmZXRjaCBlbmFibGUgKi8KKyNkZWZpbmUgRkVfTERTVFIJKDE8PDEzKSAgIC8qIExvYWQvU3RvcmUgc3VwcG9ydGVkICovCisjZGVmaW5lIEZFX1JBTQkJKDE8PDE0KSAgIC8qIE9uIGNoaXAgUkFNIHByZXNlbnQgKi8KKyNkZWZpbmUgRkVfVkFSQ0xLCSgxPDwxNSkgICAvKiBDbG9jayBmcmVxdWVuY3kgbWF5IHZhcnkgKi8KKyNkZWZpbmUgRkVfUkFNOEsJKDE8PDE2KSAgIC8qIE9uIGNoaXAgUkFNIHNpemVkIDhLYiAqLworI2RlZmluZSBGRV82NEJJVAkoMTw8MTcpICAgLyogNjQtYml0IFBDSSBCVVMgaW50ZXJmYWNlICovCisjZGVmaW5lIEZFX0lPMjU2CSgxPDwxOCkgICAvKiBSZXF1aXJlcyBmdWxsIDI1NiBieXRlcyBpbiBQQ0kgc3BhY2UgKi8KKyNkZWZpbmUgRkVfTk9QTQkJKDE8PDE5KSAgIC8qIFNjcmlwdHMgaGFuZGxlcyBwaGFzZSBtaXNtYXRjaCAqLworI2RlZmluZSBGRV9MRURDCQkoMTw8MjApICAgLyogSGFyZHdhcmUgY29udHJvbCBvZiBMRUQgKi8KKyNkZWZpbmUgRkVfVUxUUkEzCSgxPDwyMSkJICAvKiBVbHRyYSAzIC0gODAgTXRyYW5zL3NlYyBEVCAqLworI2RlZmluZSBGRV82Nk1IWgkoMTw8MjIpCSAgLyogNjZNSHogUENJIHN1cHBvcnQgKi8KKyNkZWZpbmUgRkVfQ1JDCQkoMTw8MjMpCSAgLyogQ1JDIHN1cHBvcnQgKi8KKyNkZWZpbmUgRkVfRElGRgkJKDE8PDI0KQkgIC8qIFNDU0kgSFZEIHN1cHBvcnQgKi8KKyNkZWZpbmUgRkVfREZCQwkJKDE8PDI1KQkgIC8qIEhhdmUgREZCQyByZWdpc3RlciAqLworI2RlZmluZSBGRV9MQ0tGUlEJKDE8PDI2KQkgIC8qIEhhdmUgTENLRlJRICovCisjZGVmaW5lIEZFX0MxMAkJKDE8PDI3KQkgIC8qIFZhcmlvdXMgQzEwIGNvcmUgKG1pcylmZWF0dXJlcyAqLworI2RlZmluZSBGRV9VM0VOCQkoMTw8MjgpCSAgLyogVTNFTiBiaXQgdXNhYmxlICovCisjZGVmaW5lIEZFX0RBQwkJKDE8PDI5KQkgIC8qIFN1cHBvcnQgUENJIERBQyAoNjQgYml0IGFkZHJlc3NpbmcpICovCisjZGVmaW5lIEZFX0lTVEFUMSAJKDE8PDMwKSAgIC8qIEhhdmUgSVNUQVQxLCBNQk9YMCwgTUJPWDEgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgRkVfQ0FDSEVfU0VUCShGRV9FUkx8RkVfQ0xTRXxGRV9XUklFfEZFX0VSTVApCisjZGVmaW5lIEZFX0NBQ0hFMF9TRVQJKEZFX0NBQ0hFX1NFVCAmIH5GRV9FUkwpCit9OworCisvKgorICoJU1lNNTNDOFhYIElPIHJlZ2lzdGVyIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3Qgc3ltX3JlZyB7CisvKjAwKi8gIHU4CW5jX3NjbnRsMDsJLyogZnVsbCBhcmIuLCBlbmEgcGFyaXR5LCBwYXItPkFUTiAgKi8KKworLyowMSovICB1OAluY19zY250bDE7CS8qIG5vIHJlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBJU0NPTiAgIDB4MTAgIC8qIGNvbm5lY3RlZCB0byBzY3NpCQkgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIENSU1QgICAgMHgwOCAgLyogZm9yY2UgcmVzZXQgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIElBUkIgICAgMHgwMiAgLyogaW1tZWRpYXRlIGFyYml0cmF0aW9uICAgICAgICAgICAgKi8KKworLyowMiovICB1OAluY19zY250bDI7CS8qIG5vIGRpc2Nvbm5lY3QgZXhwZWN0ZWQgICAgICAgICAgICovCisJI2RlZmluZSAgIFNEVSAgICAgMHg4MCAgLyogY21kOiBkaXNjb25uZWN0IHdpbGwgcmFpc2UgZXJyb3IgKi8KKwkjZGVmaW5lICAgQ0hNICAgICAweDQwICAvKiBzdGE6IGNoYWluZWQgbW9kZSAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBXU1MgICAgIDB4MDggIC8qIHN0YTogd2lkZSBzY3NpIHNlbmQgICAgICAgICAgIFtXXSovCisJI2RlZmluZSAgIFdTUiAgICAgMHgwMSAgLyogc3RhOiB3aWRlIHNjc2kgcmVjZWl2ZWQgICAgICAgW1ddKi8KKworLyowMyovICB1OAluY19zY250bDM7CS8qIGNuZiBzeXN0ZW0gY2xvY2sgZGVwZW5kZW50ICAgICAgICovCisJI2RlZmluZSAgIEVXUyAgICAgMHgwOCAgLyogY21kOiBlbmFibGUgd2lkZSBzY3NpICAgICAgICAgW1ddKi8KKwkjZGVmaW5lICAgVUxUUkEgICAweDgwICAvKiBjbWQ6IFVMVFJBIGVuYWJsZSAgICAgICAgICAgICAgICAqLworCQkJCS8qIGJpdHMgMC0yLCA3IHJzdmQgZm9yIEMxMDEwICAgICAgICovCisKKy8qMDQqLyAgdTgJbmNfc2NpZDsJLyogY25mIGhvc3QgYWRhcHRlciBzY3NpIGFkZHJlc3MgICAgKi8KKwkjZGVmaW5lICAgUlJFICAgICAweDQwICAvKiByL3c6ZSBlbmFibGUgcmVzcG9uc2UgdG8gcmVzZWwuICAqLworCSNkZWZpbmUgICBTUkUgICAgIDB4MjAgIC8qIHIvdzplIGVuYWJsZSByZXNwb25zZSB0byBzZWxlY3QgICovCisKKy8qMDUqLyAgdTgJbmNfc3hmZXI7CS8qICMjIyBTeW5jIHNwZWVkIGFuZCBjb3VudCAgICAgICAgICovCisJCQkJLyogYml0cyA2LTcgcnN2ZCBmb3IgQzEwMTAgICAgICAgICAgKi8KKworLyowNiovICB1OAluY19zZGlkOwkvKiAjIyMgRGVzdGluYXRpb24tSUQgICAgICAgICAgICAgICAqLworCisvKjA3Ki8gIHU4CW5jX2dwcmVnOwkvKiA/Pz8gSU8tUGlucyAgICAgICAgICAgICAgICAgICAgICAqLworCisvKjA4Ki8gIHU4CW5jX3NmYnI7CS8qICMjIyBGaXJzdCBieXRlIHJlY2VpdmVkICAgICAgICAgICovCisKKy8qMDkqLyAgdTgJbmNfc29jbDsKKwkjZGVmaW5lICAgQ1JFUQkgIDB4ODAJLyogci93OiBTQ1NJLVJFUSAgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgQ0FDSwkgIDB4NDAJLyogci93OiBTQ1NJLUFDSyAgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgQ0JTWQkgIDB4MjAJLyogci93OiBTQ1NJLUJTWSAgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgQ1NFTAkgIDB4MTAJLyogci93OiBTQ1NJLVNFTCAgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgQ0FUTgkgIDB4MDgJLyogci93OiBTQ1NJLUFUTiAgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgQ01TRwkgIDB4MDQJLyogci93OiBTQ1NJLU1TRyAgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgQ0NfRAkgIDB4MDIJLyogci93OiBTQ1NJLUNfRCAgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgQ0lfTwkgIDB4MDEJLyogci93OiBTQ1NJLUlfTyAgICAgICAgICAgICAgICAgICAgKi8KKworLyowYSovICB1OAluY19zc2lkOworCisvKjBiKi8gIHU4CW5jX3NiY2w7CisKKy8qMGMqLyAgdTgJbmNfZHN0YXQ7CisgICAgICAgICNkZWZpbmUgICBERkUgICAgIDB4ODAgIC8qIHN0YTogZG1hIGZpZm8gZW1wdHkgICAgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBNRFBFICAgIDB4NDAgIC8qIGludDogbWFzdGVyIGRhdGEgcGFyaXR5IGVycm9yICAgICovCisgICAgICAgICNkZWZpbmUgICBCRiAgICAgIDB4MjAgIC8qIGludDogc2NyaXB0OiBidXMgZmF1bHQgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBBQlJUICAgIDB4MTAgIC8qIGludDogc2NyaXB0OiBjb21tYW5kIGFib3J0ZWQgICAgICovCisgICAgICAgICNkZWZpbmUgICBTU0kgICAgIDB4MDggIC8qIGludDogc2NyaXB0OiBzaW5nbGUgc3RlcCAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBTSVIgICAgIDB4MDQgIC8qIGludDogc2NyaXB0OiBpbnRlcnJ1cHQgaW5zdHJ1Y3QuICovCisgICAgICAgICNkZWZpbmUgICBJSUQgICAgIDB4MDEgIC8qIGludDogc2NyaXB0OiBpbGxlZ2FsIGluc3RydWN0LiAgICovCisKKy8qMGQqLyAgdTgJbmNfc3N0YXQwOworICAgICAgICAjZGVmaW5lICAgSUxGICAgICAweDgwICAvKiBzdGE6IGRhdGEgaW4gU0lETCByZWdpc3RlciBsc2IgICAqLworICAgICAgICAjZGVmaW5lICAgT1JGICAgICAweDQwICAvKiBzdGE6IGRhdGEgaW4gU09EUiByZWdpc3RlciBsc2IgICAqLworICAgICAgICAjZGVmaW5lICAgT0xGICAgICAweDIwICAvKiBzdGE6IGRhdGEgaW4gU09ETCByZWdpc3RlciBsc2IgICAqLworICAgICAgICAjZGVmaW5lICAgQUlQICAgICAweDEwICAvKiBzdGE6IGFyYml0cmF0aW9uIGluIHByb2dyZXNzICAgICAqLworICAgICAgICAjZGVmaW5lICAgTE9BICAgICAweDA4ICAvKiBzdGE6IGFyYml0cmF0aW9uIGxvc3QgICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgV09BICAgICAweDA0ICAvKiBzdGE6IGFyYml0cmF0aW9uIHdvbiAgICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgSVJTVCAgICAweDAyICAvKiBzdGE6IHNjc2kgcmVzZXQgc2lnbmFsICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgU0RQICAgICAweDAxICAvKiBzdGE6IHNjc2kgcGFyaXR5IHNpZ25hbCAgICAgICAgICAqLworCisvKjBlKi8gIHU4CW5jX3NzdGF0MTsKKwkjZGVmaW5lICAgRkYzMjEwICAweGYwCS8qIHN0YTogYnl0ZXMgaW4gdGhlIHNjc2kgZmlmbyAgICAgICovCisKKy8qMGYqLyAgdTgJbmNfc3N0YXQyOworICAgICAgICAjZGVmaW5lICAgSUxGMSAgICAweDgwICAvKiBzdGE6IGRhdGEgaW4gU0lETCByZWdpc3RlciBtc2JbV10qLworICAgICAgICAjZGVmaW5lICAgT1JGMSAgICAweDQwICAvKiBzdGE6IGRhdGEgaW4gU09EUiByZWdpc3RlciBtc2JbV10qLworICAgICAgICAjZGVmaW5lICAgT0xGMSAgICAweDIwICAvKiBzdGE6IGRhdGEgaW4gU09ETCByZWdpc3RlciBtc2JbV10qLworICAgICAgICAjZGVmaW5lICAgRE0gICAgICAweDA0ICAvKiBzdGE6IERJRkZTRU5TIG1pc21hdGNoICg4OTUvNiBvbmx5KSAqLworICAgICAgICAjZGVmaW5lICAgTERTQyAgICAweDAyICAvKiBzdGE6IGRpc2Nvbm5lY3QgJiByZWNvbm5lY3QgICAgICAqLworCisvKjEwKi8gIHU4CW5jX2RzYTsJCS8qIC0tPiBCYXNlIHBhZ2UgICAgICAgICAgICAgICAgICAgICovCisvKjExKi8gIHU4CW5jX2RzYTE7CisvKjEyKi8gIHU4CW5jX2RzYTI7CisvKjEzKi8gIHU4CW5jX2RzYTM7CisKKy8qMTQqLyAgdTgJbmNfaXN0YXQ7CS8qIC0tPiBNYWluIENvbW1hbmQgYW5kIHN0YXR1cyAgICAgICovCisgICAgICAgICNkZWZpbmUgICBDQUJSVCAgIDB4ODAgIC8qIGNtZDogYWJvcnQgY3VycmVudCBvcGVyYXRpb24gICAgICovCisgICAgICAgICNkZWZpbmUgICBTUlNUICAgIDB4NDAgIC8qIG1vZDogcmVzZXQgY2hpcCAgICAgICAgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBTSUdQICAgIDB4MjAgIC8qIHIvdzogbWVzc2FnZSBmcm9tIGhvc3QgdG8gc2NyaXB0ICovCisgICAgICAgICNkZWZpbmUgICBTRU0gICAgIDB4MTAgIC8qIHIvdzogbWVzc2FnZSBiZXR3ZWVuIGhvc3QgKyBzY3JpcHQgICovCisgICAgICAgICNkZWZpbmUgICBDT04gICAgIDB4MDggIC8qIHN0YTogY29ubmVjdGVkIHRvIHNjc2kgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBJTlRGICAgIDB4MDQgIC8qIHN0YTogaW50IG9uIHRoZSBmbHkgKHJlc2V0IGJ5IHdyKSovCisgICAgICAgICNkZWZpbmUgICBTSVAgICAgIDB4MDIgIC8qIHN0YTogc2NzaS1pbnRlcnJ1cHQgICAgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBESVAgICAgIDB4MDEgIC8qIHN0YTogaG9zdC9zY3JpcHQgaW50ZXJydXB0ICAgICAgICovCisKKy8qMTUqLyAgdTgJbmNfaXN0YXQxOwkvKiA4OTYgb25seSAqLworICAgICAgICAjZGVmaW5lICAgRkxTSCAgICAweDA0ICAvKiBzdGE6IGNoaXAgaXMgZmx1c2hpbmcgICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgU0NSVU4gICAweDAyICAvKiBzdGE6IHNjcmlwdHMgYXJlIHJ1bm5pbmcgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgU0lSUUQgICAweDAxICAvKiByL3c6IGRpc2FibGUgSU5UIHBpbiAgICAgICAgICAgICAqLworCisvKjE2Ki8gIHU4CW5jX21ib3gwOwkvKiA4OTYgb25seSAqLworLyoxNyovICB1OAluY19tYm94MTsJLyogODk2IG9ubHkgKi8KKworLyoxOCovCXU4CW5jX2N0ZXN0MDsKKy8qMTkqLyAgdTgJbmNfY3Rlc3QxOworCisvKjFhKi8gIHU4CW5jX2N0ZXN0MjsKKwkjZGVmaW5lICAgQ1NJR1AgICAweDQwCisJCQkJLyogYml0cyAwLTIsNyByc3ZkIGZvciBDMTAxMCAgICAgICAgKi8KKworLyoxYiovICB1OAluY19jdGVzdDM7CisJI2RlZmluZSAgIEZMRiAgICAgMHgwOCAgLyogY21kOiBmbHVzaCBkbWEgZmlmbyAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgQ0xGCSAgMHgwNAkvKiBjbWQ6IGNsZWFyIGRtYSBmaWZvCQkgICAgKi8KKwkjZGVmaW5lICAgRk0gICAgICAweDAyICAvKiBtb2Q6IGZldGNoIHBpbiBtb2RlICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBXUklFICAgIDB4MDEgIC8qIG1vZDogd3JpdGUgYW5kIGludmFsaWRhdGUgZW5hYmxlICovCisJCQkJLyogYml0cyA0LTcgcnN2ZCBmb3IgQzEwMTAgICAgICAgICAgKi8KKworLyoxYyovICB1MzIJbmNfdGVtcDsJLyogIyMjIFRlbXBvcmFyeSBzdGFjayAgICAgICAgICAgICAgKi8KKworLyoyMCovCXU4CW5jX2RmaWZvOworLyoyMSovICB1OAluY19jdGVzdDQ7CisJI2RlZmluZSAgIEJESVMgICAgMHg4MCAgLyogbW9kOiBidXJzdCBkaXNhYmxlICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgTVBFRSAgICAweDA4ICAvKiBtb2Q6IG1hc3RlciBwYXJpdHkgZXJyb3IgZW5hYmxlICAqLworCisvKjIyKi8gIHU4CW5jX2N0ZXN0NTsKKwkjZGVmaW5lICAgREZTICAgICAweDIwICAvKiBtb2Q6IGRtYSBmaWZvIHNpemUgICAgICAgICAgICAgICAqLworCQkJCS8qIGJpdHMgMC0xLCAzLTcgcnN2ZCBmb3IgQzEwMTAgICAgICovCisKKy8qMjMqLyAgdTgJbmNfY3Rlc3Q2OworCisvKjI0Ki8gIHUzMgluY19kYmM7CQkvKiAjIyMgQnl0ZSBjb3VudCBhbmQgY29tbWFuZCAgICAgICAqLworLyoyOCovICB1MzIJbmNfZG5hZDsJLyogIyMjIE5leHQgY29tbWFuZCByZWdpc3RlciAgICAgICAgKi8KKy8qMmMqLyAgdTMyCW5jX2RzcDsJCS8qIC0tPiBTY3JpcHQgUG9pbnRlciAgICAgICAgICAgICAgICovCisvKjMwKi8gIHUzMgluY19kc3BzOwkvKiAtLT4gU2NyaXB0IHBvaW50ZXIgc2F2ZS9vcGNvZGUjMiAqLworCisvKjM0Ki8gIHU4CW5jX3NjcmF0Y2hhOwkvKiBUZW1wb3JhcnkgcmVnaXN0ZXIgYSAgICAgICAgICAgICovCisvKjM1Ki8gIHU4CW5jX3NjcmF0Y2hhMTsKKy8qMzYqLyAgdTgJbmNfc2NyYXRjaGEyOworLyozNyovICB1OAluY19zY3JhdGNoYTM7CisKKy8qMzgqLyAgdTgJbmNfZG1vZGU7CisJI2RlZmluZSAgIEJMXzIgICAgMHg4MCAgLyogbW9kOiBidXJzdCBsZW5ndGggc2hpZnQgdmFsdWUgKzIgKi8KKwkjZGVmaW5lICAgQkxfMSAgICAweDQwICAvKiBtb2Q6IGJ1cnN0IGxlbmd0aCBzaGlmdCB2YWx1ZSArMSAqLworCSNkZWZpbmUgICBFUkwgICAgIDB4MDggIC8qIG1vZDogZW5hYmxlIHJlYWQgbGluZSAgICAgICAgICAgICovCisJI2RlZmluZSAgIEVSTVAgICAgMHgwNCAgLyogbW9kOiBlbmFibGUgcmVhZCBtdWx0aXBsZSAgICAgICAgKi8KKwkjZGVmaW5lICAgQk9GICAgICAweDAyICAvKiBtb2Q6IGJ1cnN0IG9wIGNvZGUgZmV0Y2ggICAgICAgICAqLworCisvKjM5Ki8gIHU4CW5jX2RpZW47CisvKjNhKi8gIHU4CW5jX3NicjsKKworLyozYiovICB1OAluY19kY250bDsJLyogLS0+IFNjcmlwdCBleGVjdXRpb24gY29udHJvbCAgICAgKi8KKwkjZGVmaW5lICAgQ0xTRSAgICAweDgwICAvKiBtb2Q6IGNhY2hlIGxpbmUgc2l6ZSBlbmFibGUgICAgICAqLworCSNkZWZpbmUgICBQRkYgICAgIDB4NDAgIC8qIGNtZDogcHJlLWZldGNoIGZsdXNoICAgICAgICAgICAgICovCisJI2RlZmluZSAgIFBGRU4gICAgMHgyMCAgLyogbW9kOiBwcmUtZmV0Y2ggZW5hYmxlICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgU1NNICAgICAweDEwICAvKiBtb2Q6IHNpbmdsZSBzdGVwIG1vZGUgICAgICAgICAgICAqLworCSNkZWZpbmUgICBJUlFNICAgIDB4MDggIC8qIG1vZDogaXJxIG1vZGUgKDEgPSB0b3RlbSBwb2xlICEpICovCisJI2RlZmluZSAgIFNURCAgICAgMHgwNCAgLyogY21kOiBzdGFydCBkbWEgbW9kZSAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgSVJRRCAgICAweDAyICAvKiBtb2Q6IGlycSBkaXNhYmxlICAgICAgICAgICAgICAgICAqLworIAkjZGVmaW5lCSAgTk9DT00gICAweDAxCS8qIGNtZDogcHJvdGVjdCBzZmJyIHdoaWxlIHJlc2VsZWN0ICovCisJCQkJLyogYml0cyAwLTEgcnN2ZCBmb3IgQzEwMTAgICAgICAgICAgKi8KKworLyozYyovICB1MzIJbmNfYWRkZXI7CisKKy8qNDAqLyAgdTE2CW5jX3NpZW47CS8qIC0tPjogaW50ZXJydXB0IGVuYWJsZSAgICAgICAgICAgICovCisvKjQyKi8gIHUxNgluY19zaXN0OwkvKiA8LS06IGludGVycnVwdCBzdGF0dXMgICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgU0JNQyAgICAweDEwMDAvKiBzdGE6IFNDU0kgQnVzIE1vZGUgQ2hhbmdlICg4OTUvNiBvbmx5KSAqLworICAgICAgICAjZGVmaW5lICAgU1RPICAgICAweDA0MDAvKiBzdGE6IHRpbWVvdXQgKHNlbGVjdCkgICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgR0VOICAgICAweDAyMDAvKiBzdGE6IHRpbWVvdXQgKGdlbmVyYWwpICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgSFRIICAgICAweDAxMDAvKiBzdGE6IHRpbWVvdXQgKGhhbmRzaGFrZSkgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgTUEgICAgICAweDgwICAvKiBzdGE6IHBoYXNlIG1pc21hdGNoICAgICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgQ01QICAgICAweDQwICAvKiBzdGE6IGFyYml0cmF0aW9uIGNvbXBsZXRlICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgU0VMICAgICAweDIwICAvKiBzdGE6IHNlbGVjdGVkIGJ5IGFub3RoZXIgZGV2aWNlICAqLworICAgICAgICAjZGVmaW5lICAgUlNMICAgICAweDEwICAvKiBzdGE6IHJlc2VsZWN0ZWQgYnkgYW5vdGhlciBkZXZpY2UqLworICAgICAgICAjZGVmaW5lICAgU0dFICAgICAweDA4ICAvKiBzdGE6IGdyb3NzIGVycm9yIChvdmVyL3VuZGVyZmxvdykqLworICAgICAgICAjZGVmaW5lICAgVURDICAgICAweDA0ICAvKiBzdGE6IHVuZXhwZWN0ZWQgZGlzY29ubmVjdCAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgUlNUICAgICAweDAyICAvKiBzdGE6IHNjc2kgYnVzIHJlc2V0IGRldGVjdGVkICAgICAqLworICAgICAgICAjZGVmaW5lICAgUEFSICAgICAweDAxICAvKiBzdGE6IHNjc2kgcGFyaXR5IGVycm9yICAgICAgICAgICAqLworCisvKjQ0Ki8gIHU4CW5jX3NscGFyOworLyo0NSovICB1OAluY19zd2lkZTsKKy8qNDYqLyAgdTgJbmNfbWFjbnRsOworLyo0NyovICB1OAluY19ncGNudGw7CisvKjQ4Ki8gIHU4CW5jX3N0aW1lMDsJLyogY21kOiB0aW1lb3V0IGZvciBzZWxlY3QmaGFuZHNoYWtlKi8KKy8qNDkqLyAgdTgJbmNfc3RpbWUxOwkvKiBjbWQ6IHRpbWVvdXQgdXNlciBkZWZpbmVkICAgICAgICAqLworLyo0YSovICB1MTYJbmNfcmVzcGlkOwkvKiBzdGE6IFJlc2VsZWN0LUlEcyAgICAgICAgICAgICAgICAqLworCisvKjRjKi8gIHU4CW5jX3N0ZXN0MDsKKworLyo0ZCovICB1OAluY19zdGVzdDE7CisJI2RlZmluZSAgIFNDTEsgICAgMHg4MAkvKiBVc2UgdGhlIFBDSSBjbG9jayBhcyBTQ1NJIGNsb2NrCSovCisJI2RlZmluZSAgIERCTEVOICAgMHgwOAkvKiBjbG9jayBkb3VibGVyIHJ1bm5pbmcJCSovCisJI2RlZmluZSAgIERCTFNFTCAgMHgwNAkvKiBjbG9jayBkb3VibGVyIHNlbGVjdGVkCQkqLworICAKKworLyo0ZSovICB1OAluY19zdGVzdDI7CisJI2RlZmluZSAgIFJPRiAgICAgMHg0MAkvKiByZXNldCBzY3NpIG9mZnNldCAoYWZ0ZXIgZ3Jvc3MgZXJyb3IhKSAqLworCSNkZWZpbmUgICBFWFQgICAgIDB4MDIgIC8qIGV4dGVuZGVkIGZpbHRlcmluZyAgICAgICAgICAgICAgICAgICAgICovCisKKy8qNGYqLyAgdTgJbmNfc3Rlc3QzOworCSNkZWZpbmUgICBURSAgICAgMHg4MAkvKiBjOiB0b2xlckFudCBlbmFibGUgKi8KKwkjZGVmaW5lICAgSFNDICAgIDB4MjAJLyogYzogSGFsdCBTQ1NJIENsb2NrICovCisJI2RlZmluZSAgIENTRiAgICAweDAyCS8qIGM6IGNsZWFyIHNjc2kgZmlmbyAqLworCisvKjUwKi8gIHUxNgluY19zaWRsOwkvKiBMb3dsZXZlbDogbGF0Y2hlZCBmcm9tIHNjc2kgZGF0YSAqLworLyo1MiovICB1OAluY19zdGVzdDQ7CisJI2RlZmluZSAgIFNNT0RFICAweGMwCS8qIFNDU0kgYnVzIG1vZGUgICAgICAoODk1LzYgb25seSkgKi8KKwkjZGVmaW5lICAgIFNNT0RFX0hWRCAweDQwCS8qIEhpZ2ggVm9sdGFnZSBEaWZmZXJlbnRpYWwgICAgICAgKi8KKwkjZGVmaW5lICAgIFNNT0RFX1NFICAweDgwCS8qIFNpbmdsZSBFbmRlZCAgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgIFNNT0RFX0xWRCAweGMwCS8qIExvdyBWb2x0YWdlIERpZmZlcmVudGlhbCAgICAgICAgKi8KKwkjZGVmaW5lICAgTENLRlJRIDB4MjAJLyogRnJlcXVlbmN5IExvY2sgKDg5NS82IG9ubHkpICAgICAqLworCQkJCS8qIGJpdHMgMC01IHJzdmQgZm9yIEMxMDEwICAgICAgICAgKi8KKworLyo1MyovICB1OAluY181M187CisvKjU0Ki8gIHUxNgluY19zb2RsOwkvKiBMb3dsZXZlbDogZGF0YSBvdXQgdG8gc2NzaSBkYXRhICAqLworLyo1NiovCXU4CW5jX2NjbnRsMDsJLyogQ2hpcCBDb250cm9sIDAgKDg5NikgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgRU5QTUogIDB4ODAJLyogRW5hYmxlIFBoYXNlIE1pc21hdGNoIEp1bXAgICAgICAgKi8KKwkjZGVmaW5lICAgUE1KQ1RMIDB4NDAJLyogUGhhc2UgTWlzbWF0Y2ggSnVtcCBDb250cm9sICAgICAgKi8KKwkjZGVmaW5lICAgRU5OREogIDB4MjAJLyogRW5hYmxlIE5vbiBEYXRhIFBNIEp1bXAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgRElTRkMgIDB4MTAJLyogRGlzYWJsZSBBdXRvIEZJRk8gQ2xlYXIgICAgICAgICAgKi8KKwkjZGVmaW5lICAgRElMUyAgIDB4MDIJLyogRGlzYWJsZSBJbnRlcm5hbCBMb2FkL1N0b3JlICAgICAgKi8KKwkjZGVmaW5lICAgRFBSICAgIDB4MDEJLyogRGlzYWJsZSBQaXBlIFJlcSAgICAgICAgICAgICAgICAgKi8KKworLyo1NyovCXU4CW5jX2NjbnRsMTsJLyogQ2hpcCBDb250cm9sIDEgKDg5NikgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgWk1PRCAgIDB4ODAJLyogSGlnaCBJbXBlZGFuY2UgTW9kZSAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgRERBQyAgIDB4MDgJLyogRGlzYWJsZSBEdWFsIEFkZHJlc3MgQ3ljbGUgICAgICAgKi8KKwkjZGVmaW5lICAgWFRJTU9EIDB4MDQJLyogNjQtYml0IFRhYmxlIEluZC4gSW5kZXhpbmcgTW9kZSAgKi8KKwkjZGVmaW5lICAgRVhUSUJNViAweDAyCS8qIEVuYWJsZSA2NC1iaXQgVGFibGUgSW5kLiBCTU9WICAgICovCisJI2RlZmluZSAgIEVYREJNViAweDAxCS8qIEVuYWJsZSA2NC1iaXQgRGlyZWN0IEJNT1YgICAgICAgICovCisKKy8qNTgqLyAgdTE2CW5jX3NiZGw7CS8qIExvd2xldmVsOiBkYXRhIGZyb20gc2NzaSBkYXRhICAgICovCisvKjVhKi8gIHUxNgluY181YV87CisKKy8qNWMqLyAgdTgJbmNfc2NyMDsJLyogV29ya2luZyByZWdpc3RlciBCICAgICAgICAgICAgICAgKi8KKy8qNWQqLyAgdTgJbmNfc2NyMTsKKy8qNWUqLyAgdTgJbmNfc2NyMjsKKy8qNWYqLyAgdTgJbmNfc2NyMzsKKworLyo2MCovICB1OAluY19zY3J4WzY0XTsJLyogV29ya2luZyByZWdpc3RlciBDLVIgICAgICAgICAgICAgKi8KKy8qYTAqLwl1MzIJbmNfbW1yczsJLyogTWVtb3J5IE1vdmUgUmVhZCBTZWxlY3RvciAgICAgICAgKi8KKy8qYTQqLwl1MzIJbmNfbW13czsJLyogTWVtb3J5IE1vdmUgV3JpdGUgU2VsZWN0b3IgICAgICAgKi8KKy8qYTgqLwl1MzIJbmNfc2ZzOwkJLyogU2NyaXB0IEZldGNoIFNlbGVjdG9yICAgICAgICAgICAgKi8KKy8qYWMqLwl1MzIJbmNfZHJzOwkJLyogRFNBIFJlbGF0aXZlIFNlbGVjdG9yICAgICAgICAgICAgKi8KKy8qYjAqLwl1MzIJbmNfc2JtczsJLyogU3RhdGljIEJsb2NrIE1vdmUgU2VsZWN0b3IgICAgICAgKi8KKy8qYjQqLwl1MzIJbmNfZGJtczsJLyogRHluYW1pYyBCbG9jayBNb3ZlIFNlbGVjdG9yICAgICAgKi8KKy8qYjgqLwl1MzIJbmNfZG5hZDY0OwkvKiBETUEgTmV4dCBBZGRyZXNzIDY0ICAgICAgICAgICAgICAqLworLypiYyovCXUxNgluY19zY250bDQ7CS8qIEMxMDEwIG9ubHkgICAgICAgICAgICAgICAgICAgICAgICovCisJI2RlZmluZSAgIFUzRU4gICAgMHg4MAkvKiBFbmFibGUgVWx0cmEgMyAgICAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBBSVBDS0VOIDB4NDAgIC8qIEFJUCBjaGVja2luZyBlbmFibGUgICAgICAgICAgICAgICovCisJCQkJLyogQWxzbyBlbmFibGUgQUlQIGdlbmVyYXRpb24gb24gQzEwLTMzKi8KKwkjZGVmaW5lICAgWENMS0hfRFQgMHgwOCAvKiBFeHRyYSBjbG9jayBvZiBkYXRhIGhvbGQgb24gRFQgZWRnZSAqLworCSNkZWZpbmUgICBYQ0xLSF9TVCAweDA0IC8qIEV4dHJhIGNsb2NrIG9mIGRhdGEgaG9sZCBvbiBTVCBlZGdlICovCisJI2RlZmluZSAgIFhDTEtTX0RUIDB4MDIgLyogRXh0cmEgY2xvY2sgb2YgZGF0YSBzZXQgIG9uIERUIGVkZ2UgKi8KKwkjZGVmaW5lICAgWENMS1NfU1QgMHgwMSAvKiBFeHRyYSBjbG9jayBvZiBkYXRhIHNldCAgb24gU1QgZWRnZSAqLworLypiZSovCXU4CW5jX2FpcGNudGwwOwkvKiBBSVAgQ29udHJvbCAwIEMxMDEwIG9ubHkgICAgICAgICAqLworLypiZiovCXU4CW5jX2FpcGNudGwxOwkvKiBBSVAgQ29udHJvbCAxIEMxMDEwIG9ubHkgICAgICAgICAqLworCSNkZWZpbmUgRElTQUlQICAweDA4CS8qIERpc2FibGUgQUlQIGdlbmVyYXRpb24gQzEwLTY2IG9ubHkgICovCisvKmMwKi8JdTMyCW5jX3BtamFkMTsJLyogUGhhc2UgTWlzbWF0Y2ggSnVtcCBBZGRyZXNzIDEgICAgKi8KKy8qYzQqLwl1MzIJbmNfcG1qYWQyOwkvKiBQaGFzZSBNaXNtYXRjaCBKdW1wIEFkZHJlc3MgMiAgICAqLworLypjOCovCXU4CW5jX3JiYzsJCS8qIFJlbWFpbmluZyBCeXRlIENvdW50ICAgICAgICAgICAgICovCisvKmM5Ki8JdTgJbmNfcmJjMTsKKy8qY2EqLwl1OAluY19yYmMyOworLypjYiovCXU4CW5jX3JiYzM7CisKKy8qY2MqLwl1OAluY191YTsJCS8qIFVwZGF0ZWQgQWRkcmVzcyAgICAgICAgICAgICAgICAgICovCisvKmNkKi8JdTgJbmNfdWExOworLypjZSovCXU4CW5jX3VhMjsKKy8qY2YqLwl1OAluY191YTM7CisvKmQwKi8JdTMyCW5jX2VzYTsJCS8qIEVudHJ5IFN0b3JhZ2UgQWRkcmVzcyAgICAgICAgICAgICovCisvKmQ0Ki8JdTgJbmNfaWE7CQkvKiBJbnN0cnVjdGlvbiBBZGRyZXNzICAgICAgICAgICAgICAqLworLypkNSovCXU4CW5jX2lhMTsKKy8qZDYqLwl1OAluY19pYTI7CisvKmQ3Ki8JdTgJbmNfaWEzOworLypkOCovCXUzMgluY19zYmM7CQkvKiBTQ1NJIEJ5dGUgQ291bnQgKDMgYnl0ZXMgb25seSkgICAqLworLypkYyovCXUzMgluY19jc2JjOwkvKiBDdW11bGF0aXZlIFNDU0kgQnl0ZSBDb3VudCAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb2xsb3dpbmcgZm9yIEMxMDEwIG9ubHkgICAgICAgICAqLworLyplMCovCXUxNiAgICBuY19jcmNwYWQ7CS8qIENSQyBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKmUyKi8JdTggICAgIG5jX2NyY2NudGwwOwkvKiBDUkMgY29udHJvbCByZWdpc3RlciAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBTTkRDUkMgIDB4MTAJLyogU2VuZCBDUkMgUmVxdWVzdCAgICAgICAgICAgICAgICAgKi8KKy8qZTMqLwl1OCAgICAgbmNfY3JjY250bDE7CS8qIENSQyBjb250cm9sIHJlZ2lzdGVyICAgICAgICAgICAgICovCisvKmU0Ki8JdTMyICAgIG5jX2NyY2RhdGE7CS8qIENSQyBkYXRhIHJlZ2lzdGVyICAgICAgICAgICAgICAgICovCisvKmU4Ki8JdTMyICAgIG5jX2U4XzsKKy8qZWMqLwl1MzIgICAgbmNfZWNfOworLypmMCovCXUxNiAgICBuY19kZmJjOwkJLyogRE1BIEZJRk8gYnl0ZSBjb3VudCAgICAgICAgICAgICAgKi8gCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoJVXRpbGl0eSBtYWNyb3MgZm9yIHRoZSBzY3JpcHQuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNkZWZpbmUgUkVHSihwLHIpIChvZmZzZXRvZihzdHJ1Y3Qgc3ltX3JlZywgcCAjIyByKSkKKyNkZWZpbmUgUkVHKHIpIFJFR0ogKG5jXywgcikKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCVNDU0kgcGhhc2VzCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNkZWZpbmUJU0NSX0RBVEFfT1VUCTB4MDAwMDAwMDAKKyNkZWZpbmUJU0NSX0RBVEFfSU4JMHgwMTAwMDAwMAorI2RlZmluZQlTQ1JfQ09NTUFORAkweDAyMDAwMDAwCisjZGVmaW5lCVNDUl9TVEFUVVMJMHgwMzAwMDAwMAorI2RlZmluZQlTQ1JfRFRfREFUQV9PVVQJMHgwNDAwMDAwMAorI2RlZmluZQlTQ1JfRFRfREFUQV9JTgkweDA1MDAwMDAwCisjZGVmaW5lIFNDUl9NU0dfT1VUCTB4MDYwMDAwMDAKKyNkZWZpbmUgU0NSX01TR19JTiAgICAgIDB4MDcwMDAwMDAKKy8qIERUIHBoYXNlcyBhcmUgaWxsZWdhbCBmb3Igbm9uIFVsdHJhMyBtb2RlICovCisjZGVmaW5lIFNDUl9JTEdfT1VUCTB4MDQwMDAwMDAKKyNkZWZpbmUgU0NSX0lMR19JTgkweDA1MDAwMDAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKglEYXRhIHRyYW5zZmVyIHZpYSBTQ1NJLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKglNT1ZFX0FCUyAoTEVOKQorICoJPDxzdGFydCBhZGRyZXNzPj4KKyAqCisgKglNT1ZFX0lORCAoTEVOKQorICoJPDxkbmFkX29mZnNldD4+CisgKgorICoJTU9WRV9UQkwKKyAqCTw8ZG5hZF9vZmZzZXQ+PgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjZGVmaW5lIE9QQ19NT1ZFICAgICAgICAgIDB4MDgwMDAwMDAKKworI2RlZmluZSBTQ1JfTU9WRV9BQlMobCkgKCgweDAwMDAwMDAwIHwgT1BDX01PVkUpIHwgKGwpKQorLyogI2RlZmluZSBTQ1JfTU9WRV9JTkQobCkgKCgweDIwMDAwMDAwIHwgT1BDX01PVkUpIHwgKGwpKSAqLworI2RlZmluZSBTQ1JfTU9WRV9UQkwgICAgICgweDEwMDAwMDAwIHwgT1BDX01PVkUpCisKKyNkZWZpbmUgU0NSX0NITU9WX0FCUyhsKSAoKDB4MDAwMDAwMDApIHwgKGwpKQorLyogI2RlZmluZSBTQ1JfQ0hNT1ZfSU5EKGwpICgoMHgyMDAwMDAwMCkgfCAobCkpICovCisjZGVmaW5lIFNDUl9DSE1PVl9UQkwgICAgICgweDEwMDAwMDAwKQorCisjaWZkZWYgU1lNX0NPTkZfVEFSR0VUX1JPTEVfU1VQUE9SVAorLyogV2Ugc3RlYWwgdGhlIGBpbmRpcmVjdCBhZGRyZXNzaW5nJyBmbGFnIGZvciB0YXJnZXQgbW9kZSBNT1ZFIGluIHNjcmlwdHMgKi8KKworI2RlZmluZSBPUENfVENITU9WRSAgICAgICAgMHgwODAwMDAwMAorCisjZGVmaW5lIFNDUl9UQ0hNT1ZFX0FCUyhsKSAoKDB4MjAwMDAwMDAgfCBPUENfVENITU9WRSkgfCAobCkpCisjZGVmaW5lIFNDUl9UQ0hNT1ZFX1RCTCAgICAgKDB4MzAwMDAwMDAgfCBPUENfVENITU9WRSkKKworI2RlZmluZSBTQ1JfVE1PVl9BQlMobCkgICAgKCgweDIwMDAwMDAwKSB8IChsKSkKKyNkZWZpbmUgU0NSX1RNT1ZfVEJMICAgICAgICAoMHgzMDAwMDAwMCkKKyNlbmRpZgorCitzdHJ1Y3Qgc3ltX3RibG1vdmUgeworICAgICAgICB1MzIgIHNpemU7CisgICAgICAgIHUzMiAgYWRkcjsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKglTZWxlY3Rpb24KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoJU0VMX0FCUyB8IFNDUl9JRCAoMC4uMTUpICAgIFsgfCBSRUxfSk1QXQorICoJPDxhbHRlcm5hdGVfYWRkcmVzcz4+CisgKgorICoJU0VMX1RCTCB8IDw8IGRuYWRfb2Zmc2V0Pj4gIFsgfCBSRUxfSk1QXQorICoJPDxhbHRlcm5hdGVfYWRkcmVzcz4+CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNkZWZpbmUJU0NSX1NFTF9BQlMJMHg0MDAwMDAwMAorI2RlZmluZQlTQ1JfU0VMX0FCU19BVE4JMHg0MTAwMDAwMAorI2RlZmluZQlTQ1JfU0VMX1RCTAkweDQyMDAwMDAwCisjZGVmaW5lCVNDUl9TRUxfVEJMX0FUTgkweDQzMDAwMDAwCisKKyNpZmRlZiBTWU1fQ09ORl9UQVJHRVRfUk9MRV9TVVBQT1JUCisjZGVmaW5lCVNDUl9SRVNFTF9BQlMgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUJU0NSX1JFU0VMX0FCU19BVE4gMHg0MTAwMDAwMAorI2RlZmluZQlTQ1JfUkVTRUxfVEJMICAgICAweDQyMDAwMDAwCisjZGVmaW5lCVNDUl9SRVNFTF9UQkxfQVROIDB4NDMwMDAwMDAKKyNlbmRpZgorCitzdHJ1Y3Qgc3ltX3RibHNlbCB7CisgICAgICAgIHVfY2hhciAgc2VsX3NjbnRsNDsJLyogQzEwMTAgb25seSAqLworICAgICAgICB1X2NoYXIgIHNlbF9zeGZlcjsKKyAgICAgICAgdV9jaGFyICBzZWxfaWQ7CisgICAgICAgIHVfY2hhciAgc2VsX3NjbnRsMzsKK307CisKKyNkZWZpbmUgU0NSX0pNUF9SRUwgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgU0NSX0lEKGlkKQkoKCh1MzIpKGlkKSkgPDwgMTYpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKglXYWl0aW5nIGZvciBEaXNjb25uZWN0IG9yIFJlc2VsZWN0CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCVdBSVRfRElTQworICoJZHVtbXk6IDw8YWx0ZXJuYXRlX2FkZHJlc3M+PgorICoKKyAqCVdBSVRfUkVTRUwKKyAqCTw8YWx0ZXJuYXRlX2FkZHJlc3M+PgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjZGVmaW5lCVNDUl9XQUlUX0RJU0MJMHg0ODAwMDAwMAorI2RlZmluZSBTQ1JfV0FJVF9SRVNFTCAgMHg1MDAwMDAwMAorCisjaWZkZWYgU1lNX0NPTkZfVEFSR0VUX1JPTEVfU1VQUE9SVAorI2RlZmluZQlTQ1JfRElTQ09OTkVDVAkweDQ4MDAwMDAwCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCUJpdCBTZXQgLyBSZXNldAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKglTRVQgKGZsYWdzIHt8Li4gfSkKKyAqCisgKglDTFIgKGZsYWdzIHt8Li4gfSkKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2RlZmluZSBTQ1JfU0VUKGYpICAgICAoMHg1ODAwMDAwMCB8IChmKSkKKyNkZWZpbmUgU0NSX0NMUihmKSAgICAgKDB4NjAwMDAwMDAgfCAoZikpCisKKyNkZWZpbmUJU0NSX0NBUlJZCTB4MDAwMDA0MDAKKyNkZWZpbmUJU0NSX1RSRwkJMHgwMDAwMDIwMAorI2RlZmluZQlTQ1JfQUNLCQkweDAwMDAwMDQwCisjZGVmaW5lCVNDUl9BVE4JCTB4MDAwMDAwMDgKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoJTWVtb3J5IHRvIG1lbW9yeSBtb3ZlCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCUNPUFkgKGJ5dGVjb3VudCkKKyAqCTw8IHNvdXJjZV9hZGRyZXNzID4+CisgKgk8PCBkZXN0aW5hdGlvbl9hZGRyZXNzID4+CisgKgorICoJU0NSX0NPUFkgICBzZXRzIHRoZSBOTyBGTFVTSCBvcHRpb24gYnkgZGVmYXVsdC4KKyAqCVNDUl9DT1BZX0YgZG9lcyBub3Qgc2V0IHRoaXMgb3B0aW9uLgorICoKKyAqCUZvciBjaGlwcyB3aGljaCBkbyBub3Qgc3VwcG9ydCB0aGlzIG9wdGlvbiwKKyAqCXN5bV9md19iaW5kX3NjcmlwdCgpIHdpbGwgcmVtb3ZlIHRoaXMgYml0LgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjZGVmaW5lIFNDUl9OT19GTFVTSCAweDAxMDAwMDAwCisKKyNkZWZpbmUgU0NSX0NPUFkobikgKDB4YzAwMDAwMDAgfCBTQ1JfTk9fRkxVU0ggfCAobikpCisjZGVmaW5lIFNDUl9DT1BZX0YobikgKDB4YzAwMDAwMDAgfCAobikpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKglSZWdpc3RlciBtb3ZlIGFuZCBiaW5hcnkgb3BlcmF0aW9ucworICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKglTRkJSX1JFRyAocmVnLCBvcCwgZGF0YSkgICAgICAgIHJlZyAgPSBTRkJSIG9wIGRhdGEKKyAqCTw8IDAgPj4KKyAqCisgKglSRUdfU0ZCUiAocmVnLCBvcCwgZGF0YSkgICAgICAgIFNGQlIgPSByZWcgb3AgZGF0YQorICoJPDwgMCA+PgorICoKKyAqCVJFR19SRUcgIChyZWcsIG9wLCBkYXRhKSAgICAgICAgcmVnICA9IHJlZyBvcCBkYXRhCisgKgk8PCAwID4+CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCU9uIDgyNUEsIDg3NSwgODk1IGFuZCA4OTYgY2hpcHMgdGhlIGNvbnRlbnQgCisgKglvZiBTRkJSIHJlZ2lzdGVyIGNhbiBiZSB1c2VkIGFzIGRhdGEgKFNDUl9TRkJSX0RBVEEpLgorICoJVGhlIDg5NiBoYXMgYWRkaXRpb25uYWwgSU8gcmVnaXN0ZXJzIHN0YXJ0aW5nIGF0IAorICoJb2Zmc2V0IDB4ODAuIEJpdCA3IG9mIHJlZ2lzdGVyIG9mZnNldCBpcyBzdG9yZWQgaW4gCisgKgliaXQgNyBvZiB0aGUgU0NSSVBUUyBpbnN0cnVjdGlvbiBmaXJzdCBEV09SRC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2RlZmluZSBTQ1JfUkVHX09GUyhvZnMpICgoKChvZnMpICYgMHg3ZikgPDwgMTZ1bCkgKyAoKG9mcykgJiAweDgwKSkgCisKKyNkZWZpbmUgU0NSX1NGQlJfUkVHKHJlZyxvcCxkYXRhKSBcCisgICAgICAgICgweDY4MDAwMDAwIHwgKFNDUl9SRUdfT0ZTKFJFRyhyZWcpKSkgfCAob3ApIHwgKCgoZGF0YSkmMHhmZik8PDh1bCkpCisKKyNkZWZpbmUgU0NSX1JFR19TRkJSKHJlZyxvcCxkYXRhKSBcCisgICAgICAgICgweDcwMDAwMDAwIHwgKFNDUl9SRUdfT0ZTKFJFRyhyZWcpKSkgfCAob3ApIHwgKCgoZGF0YSkmMHhmZik8PDh1bCkpCisKKyNkZWZpbmUgU0NSX1JFR19SRUcocmVnLG9wLGRhdGEpIFwKKyAgICAgICAgKDB4NzgwMDAwMDAgfCAoU0NSX1JFR19PRlMoUkVHKHJlZykpKSB8IChvcCkgfCAoKChkYXRhKSYweGZmKTw8OHVsKSkKKworCisjZGVmaW5lICAgICAgU0NSX0xPQUQgICAweDAwMDAwMDAwCisjZGVmaW5lICAgICAgU0NSX1NITCAgICAweDAxMDAwMDAwCisjZGVmaW5lICAgICAgU0NSX09SICAgICAweDAyMDAwMDAwCisjZGVmaW5lICAgICAgU0NSX1hPUiAgICAweDAzMDAwMDAwCisjZGVmaW5lICAgICAgU0NSX0FORCAgICAweDA0MDAwMDAwCisjZGVmaW5lICAgICAgU0NSX1NIUiAgICAweDA1MDAwMDAwCisjZGVmaW5lICAgICAgU0NSX0FERCAgICAweDA2MDAwMDAwCisjZGVmaW5lICAgICAgU0NSX0FEREMgICAweDA3MDAwMDAwCisKKyNkZWZpbmUgICAgICBTQ1JfU0ZCUl9EQVRBICAgKDB4MDA4MDAwMDA+Pjh1bCkJLyogVXNlIFNGQlIgYXMgZGF0YSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoJRlJPTV9SRUcgKHJlZykJCSAgU0ZCUiA9IHJlZworICoJPDwgMCA+PgorICoKKyAqCVRPX1JFRwkgKHJlZykJCSAgcmVnICA9IFNGQlIKKyAqCTw8IDAgPj4KKyAqCisgKglMT0FEX1JFRyAocmVnLCBkYXRhKQkgIHJlZyAgPSA8ZGF0YT4KKyAqCTw8IDAgPj4KKyAqCisgKglMT0FEX1NGQlIoZGF0YSkgCSAgU0ZCUiA9IDxkYXRhPgorICoJPDwgMCA+PgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjZGVmaW5lCVNDUl9GUk9NX1JFRyhyZWcpIFwKKwlTQ1JfUkVHX1NGQlIocmVnLFNDUl9PUiwwKQorCisjZGVmaW5lCVNDUl9UT19SRUcocmVnKSBcCisJU0NSX1NGQlJfUkVHKHJlZyxTQ1JfT1IsMCkKKworI2RlZmluZQlTQ1JfTE9BRF9SRUcocmVnLGRhdGEpIFwKKwlTQ1JfUkVHX1JFRyhyZWcsU0NSX0xPQUQsZGF0YSkKKworI2RlZmluZSBTQ1JfTE9BRF9TRkJSKGRhdGEpIFwKKyAgICAgICAgKFNDUl9SRUdfU0ZCUiAoZ3ByZWcsIFNDUl9MT0FELCBkYXRhKSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCUxPQUQgIGZyb20gbWVtb3J5ICAgdG8gcmVnaXN0ZXIuCisgKglTVE9SRSBmcm9tIHJlZ2lzdGVyIHRvIG1lbW9yeS4KKyAqCisgKglPbmx5IHN1cHBvcnRlZCBieSA4MTBBLCA4NjAsIDgyNUEsIDg3NSwgODk1IGFuZCA4OTYuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCUxPQURfQUJTIChMRU4pCisgKgk8PHN0YXJ0IGFkZHJlc3M+PgorICoKKyAqCUxPQURfUkVMIChMRU4pICAgICAgICAoRFNBIHJlbGF0aXZlKQorICoJPDxkc2Ffb2Zmc2V0Pj4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2RlZmluZSBTQ1JfUkVHX09GUzIob2ZzKSAoKChvZnMpICYgMHhmZikgPDwgMTZ1bCkKKyNkZWZpbmUgU0NSX05PX0ZMVVNIMgkweDAyMDAwMDAwCisjZGVmaW5lIFNDUl9EU0FfUkVMMgkweDEwMDAwMDAwCisKKyNkZWZpbmUgU0NSX0xPQURfUihyZWcsIGhvdywgbikgXAorICAgICAgICAoMHhlMTAwMDAwMCB8IGhvdyB8IChTQ1JfUkVHX09GUzIoUkVHKHJlZykpKSB8IChuKSkKKworI2RlZmluZSBTQ1JfU1RPUkVfUihyZWcsIGhvdywgbikgXAorICAgICAgICAoMHhlMDAwMDAwMCB8IGhvdyB8IChTQ1JfUkVHX09GUzIoUkVHKHJlZykpKSB8IChuKSkKKworI2RlZmluZSBTQ1JfTE9BRF9BQlMocmVnLCBuKQlTQ1JfTE9BRF9SKHJlZywgU0NSX05PX0ZMVVNIMiwgbikKKyNkZWZpbmUgU0NSX0xPQURfUkVMKHJlZywgbikJU0NSX0xPQURfUihyZWcsIFNDUl9OT19GTFVTSDJ8U0NSX0RTQV9SRUwyLCBuKQorI2RlZmluZSBTQ1JfTE9BRF9BQlNfRihyZWcsIG4pCVNDUl9MT0FEX1IocmVnLCAwLCBuKQorI2RlZmluZSBTQ1JfTE9BRF9SRUxfRihyZWcsIG4pCVNDUl9MT0FEX1IocmVnLCBTQ1JfRFNBX1JFTDIsIG4pCisKKyNkZWZpbmUgU0NSX1NUT1JFX0FCUyhyZWcsIG4pCVNDUl9TVE9SRV9SKHJlZywgU0NSX05PX0ZMVVNIMiwgbikKKyNkZWZpbmUgU0NSX1NUT1JFX1JFTChyZWcsIG4pCVNDUl9TVE9SRV9SKHJlZywgU0NSX05PX0ZMVVNIMnxTQ1JfRFNBX1JFTDIsbikKKyNkZWZpbmUgU0NSX1NUT1JFX0FCU19GKHJlZywgbikJU0NSX1NUT1JFX1IocmVnLCAwLCBuKQorI2RlZmluZSBTQ1JfU1RPUkVfUkVMX0YocmVnLCBuKQlTQ1JfU1RPUkVfUihyZWcsIFNDUl9EU0FfUkVMMiwgbikKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoJV2FpdGluZyBmb3IgRGlzY29ubmVjdCBvciBSZXNlbGVjdAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKglKVU1QICAgICAgICAgICAgWyB8IElGVFJVRS9JRkZBTFNFICggLi4uICkgXQorICoJPDxhZGRyZXNzPj4KKyAqCisgKglKVU1QUiAgICAgICAgICAgWyB8IElGVFJVRS9JRkZBTFNFICggLi4uICkgXQorICoJPDxkaXN0YW5jZT4+CisgKgorICoJQ0FMTCAgICAgICAgICAgIFsgfCBJRlRSVUUvSUZGQUxTRSAoIC4uLiApIF0KKyAqCTw8YWRkcmVzcz4+CisgKgorICoJQ0FMTFIgICAgICAgICAgIFsgfCBJRlRSVUUvSUZGQUxTRSAoIC4uLiApIF0KKyAqCTw8ZGlzdGFuY2U+PgorICoKKyAqCVJFVFVSTiAgICAgICAgICBbIHwgSUZUUlVFL0lGRkFMU0UgKCAuLi4gKSBdCisgKgk8PGR1bW15Pj4KKyAqCisgKglJTlQgICAgICAgICAgICAgWyB8IElGVFJVRS9JRkZBTFNFICggLi4uICkgXQorICoJPDxpZGVudD4+CisgKgorICoJSU5UX0ZMWSAgICAgICAgIFsgfCBJRlRSVUUvSUZGQUxTRSAoIC4uLiApIF0KKyAqCTw8aWRlbnQ+PgorICoKKyAqCUNvbmRpdGlvbnM6CisgKgkgICAgIFdIRU4gKHBoYXNlKQorICoJICAgICBJRiAgIChwaGFzZSkKKyAqCSAgICAgQ0FSUllTRVQKKyAqCSAgICAgREFUQSAoZGF0YSwgbWFzaykKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2RlZmluZSBTQ1JfTk9fT1AgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBTQ1JfSlVNUCAgICAgICAgMHg4MDA4MDAwMAorI2RlZmluZSBTQ1JfSlVNUDY0ICAgICAgMHg4MDQ4MDAwMAorI2RlZmluZSBTQ1JfSlVNUFIgICAgICAgMHg4MDg4MDAwMAorI2RlZmluZSBTQ1JfQ0FMTCAgICAgICAgMHg4ODA4MDAwMAorI2RlZmluZSBTQ1JfQ0FMTFIgICAgICAgMHg4ODg4MDAwMAorI2RlZmluZSBTQ1JfUkVUVVJOICAgICAgMHg5MDA4MDAwMAorI2RlZmluZSBTQ1JfSU5UICAgICAgICAgMHg5ODA4MDAwMAorI2RlZmluZSBTQ1JfSU5UX0ZMWSAgICAgMHg5ODE4MDAwMAorCisjZGVmaW5lIElGRkFMU0UoYXJnKSAgICgweDAwMDgwMDAwIHwgKGFyZykpCisjZGVmaW5lIElGVFJVRShhcmcpICAgICgweDAwMDAwMDAwIHwgKGFyZykpCisKKyNkZWZpbmUgV0hFTihwaGFzZSkgICAgKDB4MDAwMzAwMDAgfCAocGhhc2UpKQorI2RlZmluZSBJRihwaGFzZSkgICAgICAoMHgwMDAyMDAwMCB8IChwaGFzZSkpCisKKyNkZWZpbmUgREFUQShEKSAgICAgICAgKDB4MDAwNDAwMDAgfCAoKEQpICYgMHhmZikpCisjZGVmaW5lIE1BU0soRCxNKSAgICAgICgweDAwMDQwMDAwIHwgKCgoTSBeIDB4ZmYpICYgMHhmZikgPDwgOHVsKXwoKEQpICYgMHhmZikpCisKKyNkZWZpbmUgQ0FSUllTRVQgICAgICAgKDB4MDAyMDAwMDApCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKglTQ1NJICBjb25zdGFudHMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qCisgKglNZXNzYWdlcworICovCisKKyNkZWZpbmUJTV9DT01QTEVURQlDT01NQU5EX0NPTVBMRVRFCisjZGVmaW5lCU1fRVhURU5ERUQJRVhURU5ERURfTUVTU0FHRQorI2RlZmluZQlNX1NBVkVfRFAJU0FWRV9QT0lOVEVSUworI2RlZmluZQlNX1JFU1RPUkVfRFAJUkVTVE9SRV9QT0lOVEVSUworI2RlZmluZQlNX0RJU0NPTk5FQ1QJRElTQ09OTkVDVAorI2RlZmluZQlNX0lEX0VSUk9SCUlOSVRJQVRPUl9FUlJPUgorI2RlZmluZQlNX0FCT1JUCQlBQk9SVF9UQVNLX1NFVAorI2RlZmluZQlNX1JFSkVDVAlNRVNTQUdFX1JFSkVDVAorI2RlZmluZQlNX05PT1AJCU5PUAorI2RlZmluZQlNX1BBUklUWQlNU0dfUEFSSVRZX0VSUk9SCisjZGVmaW5lCU1fTENPTVBMRVRFCUxJTktFRF9DTURfQ09NUExFVEUKKyNkZWZpbmUJTV9GQ09NUExFVEUJTElOS0VEX0ZMR19DTURfQ09NUExFVEUKKyNkZWZpbmUJTV9SRVNFVAkJVEFSR0VUX1JFU0VUCisjZGVmaW5lCU1fQUJPUlRfVEFHCUFCT1JUX1RBU0sKKyNkZWZpbmUJTV9DTEVBUl9RVUVVRQlDTEVBUl9UQVNLX1NFVAorI2RlZmluZQlNX0lOSVRfUkVDCUlOSVRJQVRFX1JFQ09WRVJZCisjZGVmaW5lCU1fUkVMX1JFQwlSRUxFQVNFX1JFQ09WRVJZCisjZGVmaW5lCU1fVEVSTUlOQVRFCSgweDExKQorI2RlZmluZQlNX1NJTVBMRV9UQUcJU0lNUExFX1FVRVVFX1RBRworI2RlZmluZQlNX0hFQURfVEFHCUhFQURfT0ZfUVVFVUVfVEFHCisjZGVmaW5lCU1fT1JERVJFRF9UQUcJT1JERVJFRF9RVUVVRV9UQUcKKyNkZWZpbmUJTV9JR05fUkVTSURVRQlJR05PUkVfV0lERV9SRVNJRFVFCisKKyNkZWZpbmUJTV9YX01PRElGWV9EUAlFWFRFTkRFRF9NT0RJRllfREFUQV9QT0lOVEVSCisjZGVmaW5lCU1fWF9TWU5DX1JFUQlFWFRFTkRFRF9TRFRSCisjZGVmaW5lCU1fWF9XSURFX1JFUQlFWFRFTkRFRF9XRFRSCisjZGVmaW5lCU1fWF9QUFJfUkVRCUVYVEVOREVEX1BQUgorCisvKgorICoJUFBSIHByb3RvY29sIG9wdGlvbnMKKyAqLworI2RlZmluZQlQUFJfT1BUX0lVCSgweDAxKQorI2RlZmluZQlQUFJfT1BUX0RUCSgweDAyKQorI2RlZmluZQlQUFJfT1BUX1FBUwkoMHgwNCkKKyNkZWZpbmUgUFBSX09QVF9NQVNLCSgweDA3KQorCisvKgorICoJU3RhdHVzCisgKi8KKworI2RlZmluZQlTX0dPT0QJCVNBTV9TVEFUX0dPT0QKKyNkZWZpbmUJU19DSEVDS19DT05ECVNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTgorI2RlZmluZQlTX0NPTkRfTUVUCVNBTV9TVEFUX0NPTkRJVElPTl9NRVQKKyNkZWZpbmUJU19CVVNZCQlTQU1fU1RBVF9CVVNZCisjZGVmaW5lCVNfSU5UCQlTQU1fU1RBVF9JTlRFUk1FRElBVEUKKyNkZWZpbmUJU19JTlRfQ09ORF9NRVQJU0FNX1NUQVRfSU5URVJNRURJQVRFX0NPTkRJVElPTl9NRVQKKyNkZWZpbmUJU19DT05GTElDVAlTQU1fU1RBVF9SRVNFUlZBVElPTl9DT05GTElDVAorI2RlZmluZQlTX1RFUk1JTkFURUQJU0FNX1NUQVRfQ09NTUFORF9URVJNSU5BVEVECisjZGVmaW5lCVNfUVVFVUVfRlVMTAlTQU1fU1RBVF9UQVNLX1NFVF9GVUxMCisjZGVmaW5lCVNfSUxMRUdBTAkoMHhmZikKKworI2VuZGlmIC8qIGRlZmluZWQgU1lNX0RFRlNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9mdy5jIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9mdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMzZjZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2Z3LmMKQEAgLTAsMCArMSw1NjggQEAKKy8qCisgKiBEZXZpY2UgZHJpdmVyIGZvciB0aGUgU1lNQklPUy9MU0lMT0dJQyA1M0M4WFggYW5kIDUzQzEwMTAgZmFtaWx5IAorICogb2YgUENJLVNDU0kgSU8gcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSAgR2VyYXJkIFJvdWRpZXIgPGdyb3VkaWVyQGZyZWUuZnI+CisgKgorICogVGhpcyBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBMaW51eCBzeW01M2M4eHggZHJpdmVyLgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgIEdlcmFyZCBSb3VkaWVyCisgKgorICogVGhlIHN5bTUzYzh4eCBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBuY3I1M2M4eHggZHJpdmVyIHRoYXQgaGFkIGJlZW4gCisgKiBhIHBvcnQgb2YgdGhlIEZyZWVCU0QgbmNyIGRyaXZlciB0byBMaW51eC0xLjIuMTMuCisgKgorICogVGhlIG9yaWdpbmFsIG5jciBkcml2ZXIgaGFzIGJlZW4gd3JpdHRlbiBmb3IgMzg2YnNkIGFuZCBGcmVlQlNEIGJ5CisgKiAgICAgICAgIFdvbGZnYW5nIFN0YW5nbG1laWVyICAgICAgICA8d29sZkBjb2xvZ25lLmRlPgorICogICAgICAgICBTdGVmYW4gRXNzZXIgICAgICAgICAgICAgICAgPHNlQG1pLlVuaS1Lb2Vsbi5kZT4KKyAqIENvcHlyaWdodCAoQykgMTk5NCAgV29sZmdhbmcgU3RhbmdsbWVpZXIKKyAqCisgKiBPdGhlciBtYWpvciBjb250cmlidXRpb25zOgorICoKKyAqIE5WUkFNIGRldGVjdGlvbiBhbmQgcmVhZGluZy4KKyAqIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIFdhbHRoYW0gPGRvcm1vdXNlQGZhcnNyb2J0LmRlbW9uLmNvLnVrPgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmZGVmIF9fRnJlZUJTRF9fCisjaW5jbHVkZSA8ZGV2L3N5bS9zeW1fZ2x1ZS5oPgorI2Vsc2UKKyNpbmNsdWRlICJzeW1fZ2x1ZS5oIgorI2VuZGlmCisKKy8qCisgKiAgTWFjcm9zIHVzZWQgZm9yIGFsbCBmaXJtd2FyZXMuCisgKi8KKyNkZWZpbmUJU1lNX0dFTl9BKHMsIGxhYmVsKQkoKHNob3J0KSBvZmZzZXRvZihzLCBsYWJlbCkpLAorI2RlZmluZQlTWU1fR0VOX0IocywgbGFiZWwpCSgoc2hvcnQpIG9mZnNldG9mKHMsIGxhYmVsKSksCisjZGVmaW5lCVNZTV9HRU5fWihzLCBsYWJlbCkJKChzaG9ydCkgb2Zmc2V0b2YocywgbGFiZWwpKSwKKyNkZWZpbmUJUEFERFJfQShsYWJlbCkJCVNZTV9HRU5fUEFERFJfQShzdHJ1Y3QgU1lNX0ZXQV9TQ1IsIGxhYmVsKQorI2RlZmluZQlQQUREUl9CKGxhYmVsKQkJU1lNX0dFTl9QQUREUl9CKHN0cnVjdCBTWU1fRldCX1NDUiwgbGFiZWwpCisKKworI2lmCVNZTV9DT05GX0dFTkVSSUNfU1VQUE9SVAorLyoKKyAqICBBbGxvY2F0ZSBmaXJtd2FyZSAjMSBzY3JpcHQgYXJlYS4KKyAqLworI2RlZmluZQlTWU1fRldBX1NDUgkJc3ltX2Z3MWFfc2NyCisjZGVmaW5lCVNZTV9GV0JfU0NSCQlzeW1fZncxYl9zY3IKKyNkZWZpbmUJU1lNX0ZXWl9TQ1IJCXN5bV9mdzF6X3NjcgorI2lmZGVmIF9fRnJlZUJTRF9fCisjaW5jbHVkZSA8ZGV2L3N5bS9zeW1fZncxLmg+CisjZWxzZQorI2luY2x1ZGUgInN5bV9mdzEuaCIKKyNlbmRpZgorc3RhdGljIHN0cnVjdCBzeW1fZndhX29mcyBzeW1fZncxYV9vZnMgPSB7CisJU1lNX0dFTl9GV19BKHN0cnVjdCBTWU1fRldBX1NDUikKK307CitzdGF0aWMgc3RydWN0IHN5bV9md2Jfb2ZzIHN5bV9mdzFiX29mcyA9IHsKKwlTWU1fR0VOX0ZXX0Ioc3RydWN0IFNZTV9GV0JfU0NSKQorI2lmZGVmIFNZTV9PUFRfSEFORExFX0RJUl9VTktOT1dOCisJU1lNX0dFTl9CKHN0cnVjdCBTWU1fRldCX1NDUiwgZGF0YV9pbykKKyNlbmRpZgorfTsKK3N0YXRpYyBzdHJ1Y3Qgc3ltX2Z3el9vZnMgc3ltX2Z3MXpfb2ZzID0geworCVNZTV9HRU5fRldfWihzdHJ1Y3QgU1lNX0ZXWl9TQ1IpCit9OworI3VuZGVmCVNZTV9GV0FfU0NSCisjdW5kZWYJU1lNX0ZXQl9TQ1IKKyN1bmRlZglTWU1fRldaX1NDUgorI2VuZGlmCS8qIFNZTV9DT05GX0dFTkVSSUNfU1VQUE9SVCAqLworCisvKgorICogIEFsbG9jYXRlIGZpcm13YXJlICMyIHNjcmlwdCBhcmVhLgorICovCisjZGVmaW5lCVNZTV9GV0FfU0NSCQlzeW1fZncyYV9zY3IKKyNkZWZpbmUJU1lNX0ZXQl9TQ1IJCXN5bV9mdzJiX3NjcgorI2RlZmluZQlTWU1fRldaX1NDUgkJc3ltX2Z3Mnpfc2NyCisjaWZkZWYgX19GcmVlQlNEX18KKyNpbmNsdWRlIDxkZXYvc3ltL3N5bV9mdzIuaD4KKyNlbHNlCisjaW5jbHVkZSAic3ltX2Z3Mi5oIgorI2VuZGlmCitzdGF0aWMgc3RydWN0IHN5bV9md2Ffb2ZzIHN5bV9mdzJhX29mcyA9IHsKKwlTWU1fR0VOX0ZXX0Eoc3RydWN0IFNZTV9GV0FfU0NSKQorfTsKK3N0YXRpYyBzdHJ1Y3Qgc3ltX2Z3Yl9vZnMgc3ltX2Z3MmJfb2ZzID0geworCVNZTV9HRU5fRldfQihzdHJ1Y3QgU1lNX0ZXQl9TQ1IpCisjaWZkZWYgU1lNX09QVF9IQU5ETEVfRElSX1VOS05PV04KKwlTWU1fR0VOX0Ioc3RydWN0IFNZTV9GV0JfU0NSLCBkYXRhX2lvKQorI2VuZGlmCisJU1lNX0dFTl9CKHN0cnVjdCBTWU1fRldCX1NDUiwgc3RhcnQ2NCkKKwlTWU1fR0VOX0Ioc3RydWN0IFNZTV9GV0JfU0NSLCBwbV9oYW5kbGUpCit9Oworc3RhdGljIHN0cnVjdCBzeW1fZnd6X29mcyBzeW1fZncyel9vZnMgPSB7CisJU1lNX0dFTl9GV19aKHN0cnVjdCBTWU1fRldaX1NDUikKK307CisjdW5kZWYJU1lNX0ZXQV9TQ1IKKyN1bmRlZglTWU1fRldCX1NDUgorI3VuZGVmCVNZTV9GV1pfU0NSCisKKyN1bmRlZglTWU1fR0VOX0EKKyN1bmRlZglTWU1fR0VOX0IKKyN1bmRlZglTWU1fR0VOX1oKKyN1bmRlZglQQUREUl9BCisjdW5kZWYJUEFERFJfQgorCisjaWYJU1lNX0NPTkZfR0VORVJJQ19TVVBQT1JUCisvKgorICogIFBhdGNoIHJvdXRpbmUgZm9yIGZpcm13YXJlICMxLgorICovCitzdGF0aWMgdm9pZAorc3ltX2Z3MV9wYXRjaChzdHJ1Y3Qgc3ltX2hjYiAqbnApCit7CisJc3RydWN0IHN5bV9mdzFhX3NjciAqc2NyaXB0YTA7CisJc3RydWN0IHN5bV9mdzFiX3NjciAqc2NyaXB0YjA7CisKKwlzY3JpcHRhMCA9IChzdHJ1Y3Qgc3ltX2Z3MWFfc2NyICopIG5wLT5zY3JpcHRhMDsKKwlzY3JpcHRiMCA9IChzdHJ1Y3Qgc3ltX2Z3MWJfc2NyICopIG5wLT5zY3JpcHRiMDsKKworCS8qCisJICogIFJlbW92ZSBMRUQgc3VwcG9ydCBpZiBub3QgbmVlZGVkLgorCSAqLworCWlmICghKG5wLT5mZWF0dXJlcyAmIEZFX0xFRDApKSB7CisJCXNjcmlwdGEwLT5pZGxlWzBdCT0gY3B1X3RvX3NjcihTQ1JfTk9fT1ApOworCQlzY3JpcHRhMC0+cmVzZWxlY3RlZFswXQk9IGNwdV90b19zY3IoU0NSX05PX09QKTsKKwkJc2NyaXB0YTAtPnN0YXJ0WzBdCT0gY3B1X3RvX3NjcihTQ1JfTk9fT1ApOworCX0KKworI2lmZGVmIFNZTV9DT05GX0lBUkJfU1VQUE9SVAorCS8qCisJICogICAgSWYgdXNlciBkb2VzIG5vdCB3YW50IHRvIHVzZSBJTU1FRElBVEUgQVJCSVRSQVRJT04KKwkgKiAgICB3aGVuIHdlIGFyZSByZXNlbGVjdGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gYXJiaXRyYXRlLAorCSAqICAgIHBhdGNoIHRoZSBTQ1JJUFRTIGFjY29yZGluZ2x5IHdpdGggYSBTQ1JJUFQgTk9fT1AuCisJICovCisJaWYgKCFTWU1fQ09ORl9TRVRfSUFSQl9PTl9BUkJfTE9TVCkKKwkJc2NyaXB0YTAtPnVuZ2V0am9iWzBdID0gY3B1X3RvX3NjcihTQ1JfTk9fT1ApOworI2VuZGlmCisJLyoKKwkgKiAgUGF0Y2ggc29tZSBkYXRhIGluIFNDUklQVFMuCisJICogIC0gc3RhcnQgYW5kIGRvbmUgcXVldWUgaW5pdGlhbCBidXMgYWRkcmVzcy4KKwkgKiAgLSB0YXJnZXQgYnVzIGFkZHJlc3MgdGFibGUgYnVzIGFkZHJlc3MuCisJICovCisJc2NyaXB0YjAtPnN0YXJ0cG9zWzBdCT0gY3B1X3RvX3NjcihucC0+c3F1ZXVlX2JhKTsKKwlzY3JpcHRiMC0+ZG9uZV9wb3NbMF0JPSBjcHVfdG9fc2NyKG5wLT5kcXVldWVfYmEpOworCXNjcmlwdGIwLT50YXJndGJsWzBdCT0gY3B1X3RvX3NjcihucC0+dGFyZ3RibF9iYSk7Cit9CisjZW5kaWYJLyogU1lNX0NPTkZfR0VORVJJQ19TVVBQT1JUICovCisKKy8qCisgKiAgUGF0Y2ggcm91dGluZSBmb3IgZmlybXdhcmUgIzIuCisgKi8KK3N0YXRpYyB2b2lkCitzeW1fZncyX3BhdGNoKHN0cnVjdCBzeW1faGNiICpucCkKK3sKKwlzdHJ1Y3Qgc3ltX2Z3MmFfc2NyICpzY3JpcHRhMDsKKwlzdHJ1Y3Qgc3ltX2Z3MmJfc2NyICpzY3JpcHRiMDsKKworCXNjcmlwdGEwID0gKHN0cnVjdCBzeW1fZncyYV9zY3IgKikgbnAtPnNjcmlwdGEwOworCXNjcmlwdGIwID0gKHN0cnVjdCBzeW1fZncyYl9zY3IgKikgbnAtPnNjcmlwdGIwOworCisJLyoKKwkgKiAgUmVtb3ZlIExFRCBzdXBwb3J0IGlmIG5vdCBuZWVkZWQuCisJICovCisJaWYgKCEobnAtPmZlYXR1cmVzICYgRkVfTEVEMCkpIHsKKwkJc2NyaXB0YTAtPmlkbGVbMF0JPSBjcHVfdG9fc2NyKFNDUl9OT19PUCk7CisJCXNjcmlwdGEwLT5yZXNlbGVjdGVkWzBdCT0gY3B1X3RvX3NjcihTQ1JfTk9fT1ApOworCQlzY3JpcHRhMC0+c3RhcnRbMF0JPSBjcHVfdG9fc2NyKFNDUl9OT19PUCk7CisJfQorCisjaWYgICBTWU1fQ09ORl9ETUFfQUREUkVTU0lOR19NT0RFID09IDIKKwkvKgorCSAqICBSZW1vdmUgdXNlbGVzcyA2NCBiaXQgRE1BIHNwZWNpZmljIFNDUklQVFMsIAorCSAqICB3aGVuIHRoaXMgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlLgorCSAqLworCWlmICghbnAtPnVzZV9kYWMpIHsKKwkJc2NyaXB0YTAtPmlzX2RtYXBfZGlydHlbMF0gPSBjcHVfdG9fc2NyKFNDUl9OT19PUCk7CisJCXNjcmlwdGEwLT5pc19kbWFwX2RpcnR5WzFdID0gMDsKKwkJc2NyaXB0YTAtPmlzX2RtYXBfZGlydHlbMl0gPSBjcHVfdG9fc2NyKFNDUl9OT19PUCk7CisJCXNjcmlwdGEwLT5pc19kbWFwX2RpcnR5WzNdID0gMDsKKwl9CisjZW5kaWYKKworI2lmZGVmIFNZTV9DT05GX0lBUkJfU1VQUE9SVAorCS8qCisJICogICAgSWYgdXNlciBkb2VzIG5vdCB3YW50IHRvIHVzZSBJTU1FRElBVEUgQVJCSVRSQVRJT04KKwkgKiAgICB3aGVuIHdlIGFyZSByZXNlbGVjdGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gYXJiaXRyYXRlLAorCSAqICAgIHBhdGNoIHRoZSBTQ1JJUFRTIGFjY29yZGluZ2x5IHdpdGggYSBTQ1JJUFQgTk9fT1AuCisJICovCisJaWYgKCFTWU1fQ09ORl9TRVRfSUFSQl9PTl9BUkJfTE9TVCkKKwkJc2NyaXB0YTAtPnVuZ2V0am9iWzBdID0gY3B1X3RvX3NjcihTQ1JfTk9fT1ApOworI2VuZGlmCisJLyoKKwkgKiAgUGF0Y2ggc29tZSB2YXJpYWJsZSBpbiBTQ1JJUFRTLgorCSAqICAtIHN0YXJ0IGFuZCBkb25lIHF1ZXVlIGluaXRpYWwgYnVzIGFkZHJlc3MuCisJICogIC0gdGFyZ2V0IGJ1cyBhZGRyZXNzIHRhYmxlIGJ1cyBhZGRyZXNzLgorCSAqLworCXNjcmlwdGIwLT5zdGFydHBvc1swXQk9IGNwdV90b19zY3IobnAtPnNxdWV1ZV9iYSk7CisJc2NyaXB0YjAtPmRvbmVfcG9zWzBdCT0gY3B1X3RvX3NjcihucC0+ZHF1ZXVlX2JhKTsKKwlzY3JpcHRiMC0+dGFyZ3RibFswXQk9IGNwdV90b19zY3IobnAtPnRhcmd0YmxfYmEpOworCisJLyoKKwkgKiAgUmVtb3ZlIHRoZSBsb2FkIG9mIFNDTlRMNCBvbiByZXNlbGVjdGlvbiBpZiBub3QgYSBDMTAuCisJICovCisJaWYgKCEobnAtPmZlYXR1cmVzICYgRkVfQzEwKSkgeworCQlzY3JpcHRhMC0+cmVzZWxfc2NudGw0WzBdID0gY3B1X3RvX3NjcihTQ1JfTk9fT1ApOworCQlzY3JpcHRhMC0+cmVzZWxfc2NudGw0WzFdID0gY3B1X3RvX3NjcigwKTsKKwl9CisKKwkvKgorCSAqICBSZW1vdmUgYSBjb3VwbGUgb2Ygd29yay1hcm91bmRzIHNwZWNpZmljIHRvIEMxMDEwIGlmIAorCSAqICB0aGV5IGFyZSBub3QgZGVzaXJhYmxlLiBTZWUgYHN5bV9mdzIuaCcgZm9yIG1vcmUgZGV0YWlscy4KKwkgKi8KKwlpZiAoIShucC0+ZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfTFNJXzUzQzEwMTBfNjYgJiYKKwkgICAgICBucC0+cmV2aXNpb25faWQgPCAweDEgJiYKKwkgICAgICBucC0+cGNpY2xrX2toeiA8IDYwMDAwKSkgeworCQlzY3JpcHRhMC0+ZGF0YW9fcGhhc2VbMF0gPSBjcHVfdG9fc2NyKFNDUl9OT19PUCk7CisJCXNjcmlwdGEwLT5kYXRhb19waGFzZVsxXSA9IGNwdV90b19zY3IoMCk7CisJfQorCWlmICghKG5wLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9MU0lfNTNDMTAxMF8zMyAmJgorCSAgICAgIC8qIG5wLT5yZXZpc2lvbl9pZCA8IDB4ZmYgKi8gMSkpIHsKKwkJc2NyaXB0YTAtPnNlbF9kb25lWzBdID0gY3B1X3RvX3NjcihTQ1JfTk9fT1ApOworCQlzY3JpcHRhMC0+c2VsX2RvbmVbMV0gPSBjcHVfdG9fc2NyKDApOworCX0KKworCS8qCisJICogIFBhdGNoIHNvbWUgb3RoZXIgdmFyaWFibGVzIGluIFNDUklQVFMuCisJICogIFRoZXNlIG9uZXMgYXJlIGxvYWRlZCBieSB0aGUgU0NSSVBUUyBwcm9jZXNzb3IuCisJICovCisJc2NyaXB0YjAtPnBtMF9kYXRhX2FkZHJbMF0gPQorCQljcHVfdG9fc2NyKG5wLT5zY3JpcHRhX2JhICsgCisJCQkgICBvZmZzZXRvZihzdHJ1Y3Qgc3ltX2Z3MmFfc2NyLCBwbTBfZGF0YSkpOworCXNjcmlwdGIwLT5wbTFfZGF0YV9hZGRyWzBdID0KKwkJY3B1X3RvX3NjcihucC0+c2NyaXB0YV9iYSArIAorCQkJICAgb2Zmc2V0b2Yoc3RydWN0IHN5bV9mdzJhX3NjciwgcG0xX2RhdGEpKTsKK30KKworLyoKKyAqICBGaWxsIHRoZSBkYXRhIGFyZWEgaW4gc2NyaXB0cy4KKyAqICBUbyBiZSBkb25lIGZvciBhbGwgZmlybXdhcmVzLgorICovCitzdGF0aWMgdm9pZAorc3ltX2Z3X2ZpbGxfZGF0YSAodTMyICppbiwgdTMyICpvdXQpCit7CisJaW50CWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU1lNX0NPTkZfTUFYX1NHOyBpKyspIHsKKwkJKmluKysgID0gU0NSX0NITU9WX1RCTCBeIFNDUl9EQVRBX0lOOworCQkqaW4rKyAgPSBvZmZzZXRvZiAoc3RydWN0IHN5bV9kc2IsIGRhdGFbaV0pOworCQkqb3V0KysgPSBTQ1JfQ0hNT1ZfVEJMIF4gU0NSX0RBVEFfT1VUOworCQkqb3V0KysgPSBvZmZzZXRvZiAoc3RydWN0IHN5bV9kc2IsIGRhdGFbaV0pOworCX0KK30KKworLyoKKyAqICBTZXR1cCB1c2VmdWwgc2NyaXB0IGJ1cyBhZGRyZXNzZXMuCisgKiAgVG8gYmUgZG9uZSBmb3IgYWxsIGZpcm13YXJlcy4KKyAqLworc3RhdGljIHZvaWQgCitzeW1fZndfc2V0dXBfYnVzX2FkZHJlc3NlcyhzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fZncgKmZ3KQoreworCXUzMiAqcGE7CisJdV9zaG9ydCAqcG87CisJaW50IGk7CisKKwkvKgorCSAqICBCdWlsZCB0aGUgYnVzIGFkZHJlc3MgdGFibGUgZm9yIHNjcmlwdCBBIAorCSAqICBmcm9tIHRoZSBzY3JpcHQgQSBvZmZzZXQgdGFibGUuCisJICovCisJcG8gPSAodV9zaG9ydCAqKSBmdy0+YV9vZnM7CisJcGEgPSAodTMyICopICZucC0+ZndhX2JhczsKKwlmb3IgKGkgPSAwIDsgaSA8IHNpemVvZihucC0+ZndhX2Jhcykvc2l6ZW9mKHUzMikgOyBpKyspCisJCXBhW2ldID0gbnAtPnNjcmlwdGFfYmEgKyBwb1tpXTsKKworCS8qCisJICogIFNhbWUgZm9yIHNjcmlwdCBCLgorCSAqLworCXBvID0gKHVfc2hvcnQgKikgZnctPmJfb2ZzOworCXBhID0gKHUzMiAqKSAmbnAtPmZ3Yl9iYXM7CisJZm9yIChpID0gMCA7IGkgPCBzaXplb2YobnAtPmZ3Yl9iYXMpL3NpemVvZih1MzIpIDsgaSsrKQorCQlwYVtpXSA9IG5wLT5zY3JpcHRiX2JhICsgcG9baV07CisKKwkvKgorCSAqICBTYW1lIGZvciBzY3JpcHQgWi4KKwkgKi8KKwlwbyA9ICh1X3Nob3J0ICopIGZ3LT56X29mczsKKwlwYSA9ICh1MzIgKikgJm5wLT5md3pfYmFzOworCWZvciAoaSA9IDAgOyBpIDwgc2l6ZW9mKG5wLT5md3pfYmFzKS9zaXplb2YodTMyKSA7IGkrKykKKwkJcGFbaV0gPSBucC0+c2NyaXB0el9iYSArIHBvW2ldOworfQorCisjaWYJU1lNX0NPTkZfR0VORVJJQ19TVVBQT1JUCisvKgorICogIFNldHVwIHJvdXRpbmUgZm9yIGZpcm13YXJlICMxLgorICovCitzdGF0aWMgdm9pZCAKK3N5bV9mdzFfc2V0dXAoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX2Z3ICpmdykKK3sKKwlzdHJ1Y3Qgc3ltX2Z3MWFfc2NyICpzY3JpcHRhMDsKKwlzdHJ1Y3Qgc3ltX2Z3MWJfc2NyICpzY3JpcHRiMDsKKworCXNjcmlwdGEwID0gKHN0cnVjdCBzeW1fZncxYV9zY3IgKikgbnAtPnNjcmlwdGEwOworCXNjcmlwdGIwID0gKHN0cnVjdCBzeW1fZncxYl9zY3IgKikgbnAtPnNjcmlwdGIwOworCisJLyoKKwkgKiAgRmlsbCB2YXJpYWJsZSBwYXJ0cyBpbiBzY3JpcHRzLgorCSAqLworCXN5bV9md19maWxsX2RhdGEoc2NyaXB0YTAtPmRhdGFfaW4sIHNjcmlwdGEwLT5kYXRhX291dCk7CisKKwkvKgorCSAqICBTZXR1cCBidXMgYWRkcmVzc2VzIHVzZWQgZnJvbSB0aGUgQyBjb2RlLi4KKwkgKi8KKwlzeW1fZndfc2V0dXBfYnVzX2FkZHJlc3NlcyhucCwgZncpOworfQorI2VuZGlmCS8qIFNZTV9DT05GX0dFTkVSSUNfU1VQUE9SVCAqLworCisvKgorICogIFNldHVwIHJvdXRpbmUgZm9yIGZpcm13YXJlICMyLgorICovCitzdGF0aWMgdm9pZCAKK3N5bV9mdzJfc2V0dXAoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX2Z3ICpmdykKK3sKKwlzdHJ1Y3Qgc3ltX2Z3MmFfc2NyICpzY3JpcHRhMDsKKwlzdHJ1Y3Qgc3ltX2Z3MmJfc2NyICpzY3JpcHRiMDsKKworCXNjcmlwdGEwID0gKHN0cnVjdCBzeW1fZncyYV9zY3IgKikgbnAtPnNjcmlwdGEwOworCXNjcmlwdGIwID0gKHN0cnVjdCBzeW1fZncyYl9zY3IgKikgbnAtPnNjcmlwdGIwOworCisJLyoKKwkgKiAgRmlsbCB2YXJpYWJsZSBwYXJ0cyBpbiBzY3JpcHRzLgorCSAqLworCXN5bV9md19maWxsX2RhdGEoc2NyaXB0YTAtPmRhdGFfaW4sIHNjcmlwdGEwLT5kYXRhX291dCk7CisKKwkvKgorCSAqICBTZXR1cCBidXMgYWRkcmVzc2VzIHVzZWQgZnJvbSB0aGUgQyBjb2RlLi4KKwkgKi8KKwlzeW1fZndfc2V0dXBfYnVzX2FkZHJlc3NlcyhucCwgZncpOworfQorCisvKgorICogIEFsbG9jYXRlIGZpcm13YXJlIGRlc2NyaXB0b3JzLgorICovCisjaWYJU1lNX0NPTkZfR0VORVJJQ19TVVBQT1JUCitzdGF0aWMgc3RydWN0IHN5bV9mdyBzeW1fZncxID0gU1lNX0ZXX0VOVFJZKHN5bV9mdzEsICJOQ1ItZ2VuZXJpYyIpOworI2VuZGlmCS8qIFNZTV9DT05GX0dFTkVSSUNfU1VQUE9SVCAqLworc3RhdGljIHN0cnVjdCBzeW1fZncgc3ltX2Z3MiA9IFNZTV9GV19FTlRSWShzeW1fZncyLCAiTE9BRC9TVE9SRS1iYXNlZCIpOworCisvKgorICogIEZpbmQgdGhlIG1vc3QgYXBwcm9wcmlhdGUgZmlybXdhcmUgZm9yIGEgY2hpcC4KKyAqLworc3RydWN0IHN5bV9mdyAqIAorc3ltX2ZpbmRfZmlybXdhcmUoc3RydWN0IHN5bV9jaGlwICpjaGlwKQoreworCWlmIChjaGlwLT5mZWF0dXJlcyAmIEZFX0xEU1RSKQorCQlyZXR1cm4gJnN5bV9mdzI7CisjaWYJU1lNX0NPTkZfR0VORVJJQ19TVVBQT1JUCisJZWxzZSBpZiAoIShjaGlwLT5mZWF0dXJlcyAmIChGRV9QRkVOfEZFX05PUE18RkVfREFDKSkpCisJCXJldHVybiAmc3ltX2Z3MTsKKyNlbmRpZgorCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiAgQmluZCBhIHNjcmlwdCB0byBwaHlzaWNhbCBhZGRyZXNzZXMuCisgKi8KK3ZvaWQgc3ltX2Z3X2JpbmRfc2NyaXB0KHN0cnVjdCBzeW1faGNiICpucCwgdTMyICpzdGFydCwgaW50IGxlbikKK3sKKwl1MzIgb3Bjb2RlLCBuZXcsIG9sZCwgdG1wMSwgdG1wMjsKKwl1MzIgKmVuZCwgKmN1cjsKKwlpbnQgcmVsb2NzOworCisJY3VyID0gc3RhcnQ7CisJZW5kID0gc3RhcnQgKyBsZW4vNDsKKworCXdoaWxlIChjdXIgPCBlbmQpIHsKKworCQlvcGNvZGUgPSAqY3VyOworCisJCS8qCisJCSAqICBJZiB3ZSBmb3JnZXQgdG8gY2hhbmdlIHRoZSBsZW5ndGgKKwkJICogIGluIHNjcmlwdHMsIGEgZmllbGQgd2lsbCBiZQorCQkgKiAgcGFkZGVkIHdpdGggMC4gVGhpcyBpcyBhbiBpbGxlZ2FsCisJCSAqICBjb21tYW5kLgorCQkgKi8KKwkJaWYgKG9wY29kZSA9PSAwKSB7CisJCQlwcmludGYgKCIlczogRVJST1IwIElOIFNDUklQVCBhdCAlZC5cbiIsCisJCQkJc3ltX25hbWUobnApLCAoaW50KSAoY3VyLXN0YXJ0KSk7CisJCQkrK2N1cjsKKwkJCWNvbnRpbnVlOworCQl9OworCisJCS8qCisJCSAqICBXZSB1c2UgdGhlIGJvZ3VzIHZhbHVlIDB4ZjAwZmYwMGYgOy0pCisJCSAqICB0byByZXNlcnZlIGRhdGEgYXJlYSBpbiBTQ1JJUFRTLgorCQkgKi8KKwkJaWYgKG9wY29kZSA9PSBTQ1JfREFUQV9aRVJPKSB7CisJCQkqY3VyKysgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19TQ1JJUFQpCisJCQlwcmludGYgKCIlZDogIDwleD5cbiIsIChpbnQpIChjdXItc3RhcnQpLAorCQkJCSh1bnNpZ25lZClvcGNvZGUpOworCisJCS8qCisJCSAqICBXZSBkb24ndCBoYXZlIHRvIGRlY29kZSBBTEwgY29tbWFuZHMKKwkJICovCisJCXN3aXRjaCAob3Bjb2RlID4+IDI4KSB7CisJCWNhc2UgMHhmOgorCQkJLyoKKwkJCSAqICBMT0FEIC8gU1RPUkUgRFNBIHJlbGF0aXZlLCBkb24ndCByZWxvY2F0ZS4KKwkJCSAqLworCQkJcmVsb2NzID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDB4ZToKKwkJCS8qCisJCQkgKiAgTE9BRCAvIFNUT1JFIGFic29sdXRlLgorCQkJICovCisJCQlyZWxvY3MgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMHhjOgorCQkJLyoKKwkJCSAqICBDT1BZIGhhcyBUV08gYXJndW1lbnRzLgorCQkJICovCisJCQlyZWxvY3MgPSAyOworCQkJdG1wMSA9IGN1clsxXTsKKwkJCXRtcDIgPSBjdXJbMl07CisJCQlpZiAoKHRtcDEgXiB0bXAyKSAmIDMpIHsKKwkJCQlwcmludGYgKCIlczogRVJST1IxIElOIFNDUklQVCBhdCAlZC5cbiIsCisJCQkJCXN5bV9uYW1lKG5wKSwgKGludCkgKGN1ci1zdGFydCkpOworCQkJfQorCQkJLyoKKwkJCSAqICBJZiBQUkVGRVRDSCBmZWF0dXJlIG5vdCBlbmFibGVkLCByZW1vdmUgCisJCQkgKiAgdGhlIE5PIEZMVVNIIGJpdCBpZiBwcmVzZW50LgorCQkJICovCisJCQlpZiAoKG9wY29kZSAmIFNDUl9OT19GTFVTSCkgJiYKKwkJCSAgICAhKG5wLT5mZWF0dXJlcyAmIEZFX1BGRU4pKSB7CisJCQkJb3Bjb2RlID0gKG9wY29kZSAmIH5TQ1JfTk9fRkxVU0gpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMHgwOgorCQkJLyoKKwkJCSAqICBNT1ZFL0NITU9WIChhYnNvbHV0ZSBhZGRyZXNzKQorCQkJICovCisJCQlpZiAoIShucC0+ZmVhdHVyZXMgJiBGRV9XSURFKSkKKwkJCQlvcGNvZGUgPSAob3Bjb2RlIHwgT1BDX01PVkUpOworCQkJcmVsb2NzID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDB4MToKKwkJCS8qCisJCQkgKiAgTU9WRS9DSE1PViAodGFibGUgaW5kaXJlY3QpCisJCQkgKi8KKwkJCWlmICghKG5wLT5mZWF0dXJlcyAmIEZFX1dJREUpKQorCQkJCW9wY29kZSA9IChvcGNvZGUgfCBPUENfTU9WRSk7CisJCQlyZWxvY3MgPSAwOworCQkJYnJlYWs7CisjaWZkZWYgU1lNX0NPTkZfVEFSR0VUX1JPTEVfU1VQUE9SVAorCQljYXNlIDB4MjoKKwkJCS8qCisJCQkgKiAgTU9WRS9DSE1PViBpbiB0YXJnZXQgcm9sZSAoYWJzb2x1dGUgYWRkcmVzcykKKwkJCSAqLworCQkJb3Bjb2RlICY9IH4weDIwMDAwMDAwOworCQkJaWYgKCEobnAtPmZlYXR1cmVzICYgRkVfV0lERSkpCisJCQkJb3Bjb2RlID0gKG9wY29kZSAmIH5PUENfVENITU9WRSk7CisJCQlyZWxvY3MgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMHgzOgorCQkJLyoKKwkJCSAqICBNT1ZFL0NITU9WIGluIHRhcmdldCByb2xlICh0YWJsZSBpbmRpcmVjdCkKKwkJCSAqLworCQkJb3Bjb2RlICY9IH4weDIwMDAwMDAwOworCQkJaWYgKCEobnAtPmZlYXR1cmVzICYgRkVfV0lERSkpCisJCQkJb3Bjb2RlID0gKG9wY29kZSAmIH5PUENfVENITU9WRSk7CisJCQlyZWxvY3MgPSAwOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSAweDg6CisJCQkvKgorCQkJICogIEpVTVAgLyBDQUxMCisJCQkgKiAgZG9uJ3QgcmVsb2NhdGUgaWYgcmVsYXRpdmUgOi0pCisJCQkgKi8KKwkJCWlmIChvcGNvZGUgJiAweDAwODAwMDAwKQorCQkJCXJlbG9jcyA9IDA7CisJCQllbHNlIGlmICgob3Bjb2RlICYgMHhmODQwMDAwMCkgPT0gMHg4MDQwMDAwMCkvKkpVTVA2NCovCisJCQkJcmVsb2NzID0gMjsKKwkJCWVsc2UKKwkJCQlyZWxvY3MgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMHg0OgorCQljYXNlIDB4NToKKwkJY2FzZSAweDY6CisJCWNhc2UgMHg3OgorCQkJcmVsb2NzID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmVsb2NzID0gMDsKKwkJCWJyZWFrOworCQl9OworCisJCS8qCisJCSAqICBTY3JpcHRpZnk6KSB0aGUgb3Bjb2RlLgorCQkgKi8KKwkJKmN1cisrID0gY3B1X3RvX3NjcihvcGNvZGUpOworCisJCS8qCisJCSAqICBJZiBubyByZWxvY2F0aW9uLCBhc3N1bWUgMSBhcmd1bWVudCAKKwkJICogIGFuZCBqdXN0IHNjcmlwdGl6ZTopIGl0LgorCQkgKi8KKwkJaWYgKCFyZWxvY3MpIHsKKwkJCSpjdXIgPSBjcHVfdG9fc2NyKCpjdXIpOworCQkJKytjdXI7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqICBPdGhlcndpc2UgcGVyZm9ybXMgYWxsIG5lZWRlZCByZWxvY2F0aW9ucy4KKwkJICovCisJCXdoaWxlIChyZWxvY3MtLSkgeworCQkJb2xkID0gKmN1cjsKKworCQkJc3dpdGNoIChvbGQgJiBSRUxPQ19NQVNLKSB7CisJCQljYXNlIFJFTE9DX1JFR0lTVEVSOgorCQkJCW5ldyA9IChvbGQgJiB+UkVMT0NfTUFTSykgKyBucC0+bW1pb19iYTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVMT0NfTEFCRUxfQToKKwkJCQluZXcgPSAob2xkICYgflJFTE9DX01BU0spICsgbnAtPnNjcmlwdGFfYmE7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFTE9DX0xBQkVMX0I6CisJCQkJbmV3ID0gKG9sZCAmIH5SRUxPQ19NQVNLKSArIG5wLT5zY3JpcHRiX2JhOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUxPQ19TT0ZUQzoKKwkJCQluZXcgPSAob2xkICYgflJFTE9DX01BU0spICsgbnAtPmhjYl9iYTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMDoKKwkJCQkvKgorCQkJCSAqICBEb24ndCByZWxvY2F0ZSBhIDAgYWRkcmVzcy4KKwkJCQkgKiAgVGhleSBhcmUgbW9zdGx5IHVzZWQgZm9yIHBhdGNoZWQgb3IgCisJCQkJICogIHNjcmlwdCBzZWxmLW1vZGlmaWVkIGFyZWFzLgorCQkJCSAqLworCQkJCWlmIChvbGQgPT0gMCkgeworCQkJCQluZXcgPSBvbGQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJCWRlZmF1bHQ6CisJCQkJbmV3ID0gMDsKKwkJCQlwYW5pYygic3ltX2Z3X2JpbmRfc2NyaXB0OiAiCisJCQkJICAgICAgIndlaXJkIHJlbG9jYXRpb24gJXhcbiIsIG9sZCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCSpjdXIrKyA9IGNwdV90b19zY3IobmV3KTsKKwkJfQorCX07Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2Z3LmggYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2Z3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmNjgxMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fZncuaApAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIERldmljZSBkcml2ZXIgZm9yIHRoZSBTWU1CSU9TL0xTSUxPR0lDIDUzQzhYWCBhbmQgNTNDMTAxMCBmYW1pbHkgCisgKiBvZiBQQ0ktU0NTSSBJTyBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxICBHZXJhcmQgUm91ZGllciA8Z3JvdWRpZXJAZnJlZS5mcj4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIExpbnV4IHN5bTUzYzh4eCBkcml2ZXIuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCAgR2VyYXJkIFJvdWRpZXIKKyAqCisgKiBUaGUgc3ltNTNjOHh4IGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIG5jcjUzYzh4eCBkcml2ZXIgdGhhdCBoYWQgYmVlbiAKKyAqIGEgcG9ydCBvZiB0aGUgRnJlZUJTRCBuY3IgZHJpdmVyIHRvIExpbnV4LTEuMi4xMy4KKyAqCisgKiBUaGUgb3JpZ2luYWwgbmNyIGRyaXZlciBoYXMgYmVlbiB3cml0dGVuIGZvciAzODZic2QgYW5kIEZyZWVCU0QgYnkKKyAqICAgICAgICAgV29sZmdhbmcgU3RhbmdsbWVpZXIgICAgICAgIDx3b2xmQGNvbG9nbmUuZGU+CisgKiAgICAgICAgIFN0ZWZhbiBFc3NlciAgICAgICAgICAgICAgICA8c2VAbWkuVW5pLUtvZWxuLmRlPgorICogQ29weXJpZ2h0IChDKSAxOTk0ICBXb2xmZ2FuZyBTdGFuZ2xtZWllcgorICoKKyAqIE90aGVyIG1ham9yIGNvbnRyaWJ1dGlvbnM6CisgKgorICogTlZSQU0gZGV0ZWN0aW9uIGFuZCByZWFkaW5nLgorICogQ29weXJpZ2h0IChDKSAxOTk3IFJpY2hhcmQgV2FsdGhhbSA8ZG9ybW91c2VAZmFyc3JvYnQuZGVtb24uY28udWs+CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmCVNZTV9GV19ICisjZGVmaW5lCVNZTV9GV19ICisvKgorICogIE1hY3JvIHVzZWQgdG8gZ2VuZXJhdGUgaW50ZXJmYWNlcyBmb3Igc2NyaXB0IEEuCisgKi8KKyNkZWZpbmUgU1lNX0dFTl9GV19BKHMpCQkJCQkJCVwKKwlTWU1fR0VOX0Eocywgc3RhcnQpCQlTWU1fR0VOX0EocywgZ2V0am9iX2JlZ2luKQlcCisJU1lNX0dFTl9BKHMsIGdldGpvYl9lbmQpCQkJCQlcCisJU1lNX0dFTl9BKHMsIHNlbGVjdCkJCVNZTV9HRU5fQShzLCB3Zl9zZWxfZG9uZSkJXAorCVNZTV9HRU5fQShzLCBzZW5kX2lkZW50KQkJCQkJXAorCVNZTV9HRU5fQShzLCBkaXNwYXRjaCkJCVNZTV9HRU5fQShzLCBpbml0KQkJXAorCVNZTV9HRU5fQShzLCBjbHJhY2spCQlTWU1fR0VOX0EocywgY29tcGxldGVfZXJyb3IpCVwKKwlTWU1fR0VOX0EocywgZG9uZSkJCVNZTV9HRU5fQShzLCBkb25lX2VuZCkJCVwKKwlTWU1fR0VOX0EocywgaWRsZSkJCVNZTV9HRU5fQShzLCB1bmdldGpvYikJCVwKKwlTWU1fR0VOX0EocywgcmVzZWxlY3QpCQkJCQkJXAorCVNZTV9HRU5fQShzLCByZXNlbF90YWcpCQlTWU1fR0VOX0EocywgcmVzZWxfZHNhKQkJXAorCVNZTV9HRU5fQShzLCByZXNlbF9ub190YWcpCQkJCQlcCisJU1lNX0dFTl9BKHMsIGRhdGFfaW4pCQlTWU1fR0VOX0EocywgZGF0YV9pbjIpCQlcCisJU1lNX0dFTl9BKHMsIGRhdGFfb3V0KQkJU1lNX0dFTl9BKHMsIGRhdGFfb3V0MikJCVwKKwlTWU1fR0VOX0EocywgcG0wX2RhdGEpCQlTWU1fR0VOX0EocywgcG0xX2RhdGEpCisKKy8qCisgKiAgTWFjcm8gdXNlZCB0byBnZW5lcmF0ZSBpbnRlcmZhY2VzIGZvciBzY3JpcHQgQi4KKyAqLworI2RlZmluZSBTWU1fR0VOX0ZXX0IocykJCQkJCQkJXAorCVNZTV9HRU5fQihzLCBub19kYXRhKQkJCQkJCVwKKwlTWU1fR0VOX0Iocywgc2VsX2Zvcl9hYm9ydCkJU1lNX0dFTl9CKHMsIHNlbF9mb3JfYWJvcnRfMSkJXAorCVNZTV9HRU5fQihzLCBtc2dfYmFkKQkJU1lNX0dFTl9CKHMsIG1zZ193ZWlyZCkJCVwKKwlTWU1fR0VOX0Iocywgd2R0cl9yZXNwKQkJU1lNX0dFTl9CKHMsIHNlbmRfd2R0cikJCVwKKwlTWU1fR0VOX0Iocywgc2R0cl9yZXNwKQkJU1lNX0dFTl9CKHMsIHNlbmRfc2R0cikJCVwKKwlTWU1fR0VOX0IocywgcHByX3Jlc3ApCQlTWU1fR0VOX0Iocywgc2VuZF9wcHIpCQlcCisJU1lNX0dFTl9CKHMsIG5lZ29fYmFkX3BoYXNlKQkJCQkJXAorCVNZTV9HRU5fQihzLCBpZGVudF9icmVhaykgCVNZTV9HRU5fQihzLCBpZGVudF9icmVha19hdG4pCVwKKwlTWU1fR0VOX0Iocywgc2RhdGFfaW4pCQlTWU1fR0VOX0IocywgcmVzZWxfYmFkX2x1bikJXAorCVNZTV9HRU5fQihzLCBiYWRfaV90X2wpCQlTWU1fR0VOX0IocywgYmFkX2lfdF9sX3EpCVwKKwlTWU1fR0VOX0Iocywgd3NyX21hX2hlbHBlcikKKworLyoKKyAqICBNYWNybyB1c2VkIHRvIGdlbmVyYXRlIGludGVyZmFjZXMgZm9yIHNjcmlwdCBaLgorICovCisjZGVmaW5lIFNZTV9HRU5fRldfWihzKQkJCQkJCQlcCisJU1lNX0dFTl9aKHMsIHNub29wdGVzdCkJCVNZTV9HRU5fWihzLCBzbm9vcGVuZCkKKworLyoKKyAqICBHZW5lcmF0ZXMgc3RydWN0dXJlIGludGVyZmFjZSB0aGF0IGNvbnRhaW5zIAorICogIG9mZnNldHMgd2l0aGluIHNjcmlwdCBBLCBCIGFuZCBaLgorICovCisjZGVmaW5lCVNZTV9HRU5fQShzLCBsYWJlbCkJcyBsYWJlbDsKKyNkZWZpbmUJU1lNX0dFTl9CKHMsIGxhYmVsKQlzIGxhYmVsOworI2RlZmluZQlTWU1fR0VOX1oocywgbGFiZWwpCXMgbGFiZWw7CitzdHJ1Y3Qgc3ltX2Z3YV9vZnMgeworCVNZTV9HRU5fRldfQSh1X3Nob3J0KQorfTsKK3N0cnVjdCBzeW1fZndiX29mcyB7CisJU1lNX0dFTl9GV19CKHVfc2hvcnQpCisjaWZkZWYgU1lNX09QVF9IQU5ETEVfRElSX1VOS05PV04KKwlTWU1fR0VOX0IodV9zaG9ydCwgZGF0YV9pbykKKyNlbmRpZgorCVNZTV9HRU5fQih1X3Nob3J0LCBzdGFydDY0KQorCVNZTV9HRU5fQih1X3Nob3J0LCBwbV9oYW5kbGUpCit9Oworc3RydWN0IHN5bV9md3pfb2ZzIHsKKwlTWU1fR0VOX0ZXX1oodV9zaG9ydCkKK307CisKKy8qCisgKiAgR2VuZXJhdGVzIHN0cnVjdHVyZSBpbnRlcmZhY2UgdGhhdCBjb250YWlucyAKKyAqICBidXMgYWRkcmVzc2VzIHdpdGhpbiBzY3JpcHQgQSwgQiBhbmQgWi4KKyAqLworc3RydWN0IHN5bV9md2FfYmEgeworCVNZTV9HRU5fRldfQSh1MzIpCit9Oworc3RydWN0IHN5bV9md2JfYmEgeworCVNZTV9HRU5fRldfQih1MzIpCisjaWZkZWYgU1lNX09QVF9IQU5ETEVfRElSX1VOS05PV04KKwlTWU1fR0VOX0IodTMyLCBkYXRhX2lvKQorI2VuZGlmCisJU1lNX0dFTl9CKHUzMiwgc3RhcnQ2NCk7CisJU1lNX0dFTl9CKHUzMiwgcG1faGFuZGxlKTsKK307CitzdHJ1Y3Qgc3ltX2Z3el9iYSB7CisJU1lNX0dFTl9GV19aKHUzMikKK307CisjdW5kZWYJU1lNX0dFTl9BCisjdW5kZWYJU1lNX0dFTl9CCisjdW5kZWYJU1lNX0dFTl9aCisKKy8qCisgKiAgTGV0IGNjIGtub3cgYWJvdXQgdGhlIG5hbWUgb2YgdGhlIGNvbnRyb2xsZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKiAgV2UgbmVlZCB0aGlzIGZvciBmdW5jdGlvbiBwcm90b3R5cGUgZGVjbGFyYXRpb25zIGp1c3QgYmVsb3cuCisgKi8KK3N0cnVjdCBzeW1faGNiOworCisvKgorICogIEdlbmVyaWMgc3RydWN0dXJlIHRoYXQgZGVmaW5lcyBhIGZpcm13YXJlLgorICovIAorc3RydWN0IHN5bV9mdyB7CisJY2hhcgkqbmFtZTsJCS8qIE5hbWUgd2Ugd2FudCB0byBwcmludCBvdXQJKi8KKwl1MzIJKmFfYmFzZTsJLyogUG9pbnRlciB0byBzY3JpcHQgQSB0ZW1wbGF0ZQkqLworCWludAlhX3NpemU7CQkvKiBTaXplIG9mIHNjcmlwdCBBCQkqLworCXN0cnVjdAlzeW1fZndhX29mcworCQkqYV9vZnM7CQkvKiBVc2VmdWwgb2Zmc2V0cyBpbiBzY3JpcHQgQQkqLworCXUzMgkqYl9iYXNlOwkvKiBQb2ludGVyIHRvIHNjcmlwdCBCIHRlbXBsYXRlCSovCisJaW50CWJfc2l6ZTsJCS8qIFNpemUgb2Ygc2NyaXB0IEIJCSovCisJc3RydWN0CXN5bV9md2Jfb2ZzCisJCSpiX29mczsJCS8qIFVzZWZ1bCBvZmZzZXRzIGluIHNjcmlwdCBCCSovCisJdTMyCSp6X2Jhc2U7CS8qIFBvaW50ZXIgdG8gc2NyaXB0IFogdGVtcGxhdGUJKi8KKwlpbnQJel9zaXplOwkJLyogU2l6ZSBvZiBzY3JpcHQgWgkJKi8KKwlzdHJ1Y3QJc3ltX2Z3el9vZnMKKwkJKnpfb2ZzOwkJLyogVXNlZnVsIG9mZnNldHMgaW4gc2NyaXB0IFoJKi8KKwkvKiBTZXR1cCBhbmQgcGF0Y2ggbWV0aG9kcyBmb3IgdGhpcyBmaXJtd2FyZSAqLworCXZvaWQJKCpzZXR1cCkoc3RydWN0IHN5bV9oY2IgKiwgc3RydWN0IHN5bV9mdyAqKTsKKwl2b2lkCSgqcGF0Y2gpKHN0cnVjdCBzeW1faGNiICopOworfTsKKworLyoKKyAqICBNYWNybyB1c2VkIHRvIGRlY2xhcmUgYSBmaXJtd2FyZS4KKyAqLworI2RlZmluZSBTWU1fRldfRU5UUlkoZncsIG5hbWUpCQkJCQlcCit7CQkJCQkJCQlcCisJbmFtZSwJCQkJCQkJXAorCSh1MzIgKikgJmZ3IyNhX3Njciwgc2l6ZW9mKGZ3IyNhX3NjciksICZmdyMjYV9vZnMsCVwKKwkodTMyICopICZmdyMjYl9zY3IsIHNpemVvZihmdyMjYl9zY3IpLCAmZncjI2Jfb2ZzLAlcCisJKHUzMiAqKSAmZncjI3pfc2NyLCBzaXplb2YoZncjI3pfc2NyKSwgJmZ3IyN6X29mcywJXAorCWZ3IyNfc2V0dXAsIGZ3IyNfcGF0Y2gJCQkJCVwKK30KKworLyoKKyAqICBNYWNyb3MgdXNlZCBmcm9tIHRoZSBDIGNvZGUgdG8gZ2V0IHVzZWZ1bAorICogIFNDUklQVFMgYnVzIGFkZHJlc3Nlcy4KKyAqLworI2RlZmluZSBTQ1JJUFRBX0JBKG5wLCBsYWJlbCkJKG5wLT5md2FfYmFzLmxhYmVsKQorI2RlZmluZSBTQ1JJUFRCX0JBKG5wLCBsYWJlbCkJKG5wLT5md2JfYmFzLmxhYmVsKQorI2RlZmluZSBTQ1JJUFRaX0JBKG5wLCBsYWJlbCkJKG5wLT5md3pfYmFzLmxhYmVsKQorCisvKgorICogIE1hY3JvcyB1c2VkIGJ5IHNjcmlwdHMgZGVmaW5pdGlvbnMuCisgKgorICogIEhBRERSXzEgZ2VuZXJhdGVzIGEgcmVmZXJlbmNlIHRvIGEgZmllbGQgb2YgdGhlIGNvbnRyb2xsZXIgZGF0YS4KKyAqICBIQUREUl8yIGdlbmVyYXRlcyBhIHJlZmVyZW5jZSB0byBhIGZpZWxkIG9mIHRoZSBjb250cm9sbGVyIGRhdGEKKyAqICAgICAgICAgIHdpdGggb2Zmc2V0LgorICogIFJBRERSXzEgZ2VuZXJhdGVzIGEgcmVmZXJlbmNlIHRvIGEgc2NyaXB0IHByb2Nlc3NvciByZWdpc3Rlci4KKyAqICBSQUREUl8yIGdlbmVyYXRlcyBhIHJlZmVyZW5jZSB0byBhIHNjcmlwdCBwcm9jZXNzb3IgcmVnaXN0ZXIKKyAqICAgICAgICAgIHdpdGggb2Zmc2V0LgorICogIFBBRERSX0EgZ2VuZXJhdGVzIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgcGFydCBvZiBzY3JpcHQgQS4KKyAqICBQQUREUl9CIGdlbmVyYXRlcyBhIHJlZmVyZW5jZSB0byBhbm90aGVyIHBhcnQgb2Ygc2NyaXB0IEIuCisgKgorICogIFNZTV9HRU5fUEFERFJfQSBhbmQgU1lNX0dFTl9QQUREUl9CIGFyZSB1c2VkIHRvIGRlZmluZSByZXNwZWN0aXZlbHkgCisgKiAgdGhlIFBBRERSX0EgYW5kIFBBRERSX0IgbWFjcm9zIGZvciBlYWNoIGZpcm13YXJlIGJ5IHNldHRpbmcgYXJndW1lbnQgCisgKiAgYHMnIHRvIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIHN0cnVjdHVyZS4KKyAqCisgKiAgU0NSX0RBVEFfWkVSTyBpcyB1c2VkIHRvIGFsbG9jYXRlIGEgRFdPUkQgb2YgZGF0YSBpbiBzY3JpcHRzIGFyZWFzLgorICovCisKKyNkZWZpbmUJUkVMT0NfU09GVEMJMHg0MDAwMDAwMAorI2RlZmluZQlSRUxPQ19MQUJFTF9BCTB4NTAwMDAwMDAKKyNkZWZpbmUJUkVMT0NfUkVHSVNURVIJMHg2MDAwMDAwMAorI2RlZmluZQlSRUxPQ19MQUJFTF9CCTB4ODAwMDAwMDAKKyNkZWZpbmUJUkVMT0NfTUFTSwkweGYwMDAwMDAwCisKKyNkZWZpbmUJSEFERFJfMShsYWJlbCkJICAgKFJFTE9DX1NPRlRDICAgIHwgb2Zmc2V0b2Yoc3RydWN0IHN5bV9oY2IsIGxhYmVsKSkKKyNkZWZpbmUJSEFERFJfMihsYWJlbCxvZnMpIChSRUxPQ19TT0ZUQyAgICB8IFwKKwkJCQkob2Zmc2V0b2Yoc3RydWN0IHN5bV9oY2IsIGxhYmVsKSsob2ZzKSkpCisjZGVmaW5lCVJBRERSXzEobGFiZWwpCSAgIChSRUxPQ19SRUdJU1RFUiB8IFJFRyhsYWJlbCkpCisjZGVmaW5lCVJBRERSXzIobGFiZWwsb2ZzKSAoUkVMT0NfUkVHSVNURVIgfCAoKFJFRyhsYWJlbCkpKyhvZnMpKSkKKworI2RlZmluZSBTWU1fR0VOX1BBRERSX0EocywgbGFiZWwpIChSRUxPQ19MQUJFTF9BICB8IG9mZnNldG9mKHMsIGxhYmVsKSkKKyNkZWZpbmUgU1lNX0dFTl9QQUREUl9CKHMsIGxhYmVsKSAoUkVMT0NfTEFCRUxfQiAgfCBvZmZzZXRvZihzLCBsYWJlbCkpCisKKyNkZWZpbmUgU0NSX0RBVEFfWkVSTwkweGYwMGZmMDBmCisKKyNlbmRpZgkvKiBTWU1fRldfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9mdzEuaCBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fZncxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkOTJkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fZncxLmgKQEAgLTAsMCArMSwxODM4IEBACisvKgorICogRGV2aWNlIGRyaXZlciBmb3IgdGhlIFNZTUJJT1MvTFNJTE9HSUMgNTNDOFhYIGFuZCA1M0MxMDEwIGZhbWlseSAKKyAqIG9mIFBDSS1TQ1NJIElPIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgIEdlcmFyZCBSb3VkaWVyIDxncm91ZGllckBmcmVlLmZyPgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGRlcml2ZWQgZnJvbSB0aGUgTGludXggc3ltNTNjOHh4IGRyaXZlci4KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAwICBHZXJhcmQgUm91ZGllcgorICoKKyAqIFRoZSBzeW01M2M4eHggZHJpdmVyIGlzIGRlcml2ZWQgZnJvbSB0aGUgbmNyNTNjOHh4IGRyaXZlciB0aGF0IGhhZCBiZWVuIAorICogYSBwb3J0IG9mIHRoZSBGcmVlQlNEIG5jciBkcml2ZXIgdG8gTGludXgtMS4yLjEzLgorICoKKyAqIFRoZSBvcmlnaW5hbCBuY3IgZHJpdmVyIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIDM4NmJzZCBhbmQgRnJlZUJTRCBieQorICogICAgICAgICBXb2xmZ2FuZyBTdGFuZ2xtZWllciAgICAgICAgPHdvbGZAY29sb2duZS5kZT4KKyAqICAgICAgICAgU3RlZmFuIEVzc2VyICAgICAgICAgICAgICAgIDxzZUBtaS5VbmktS29lbG4uZGU+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTQgIFdvbGZnYW5nIFN0YW5nbG1laWVyCisgKgorICogT3RoZXIgbWFqb3IgY29udHJpYnV0aW9uczoKKyAqCisgKiBOVlJBTSBkZXRlY3Rpb24gYW5kIHJlYWRpbmcuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgUmljaGFyZCBXYWx0aGFtIDxkb3Jtb3VzZUBmYXJzcm9idC5kZW1vbi5jby51az4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKy8qCisgKiAgU2NyaXB0cyBmb3IgU1lNQklPUy1Qcm9jZXNzb3IKKyAqCisgKiAgV2UgaGF2ZSB0byBrbm93IHRoZSBvZmZzZXRzIG9mIGFsbCBsYWJlbHMgYmVmb3JlIHdlIHJlYWNoIAorICogIHRoZW0gKGZvciBmb3J3YXJkIGp1bXBzKS4gVGhlcmVmb3JlIHdlIGRlY2xhcmUgYSBzdHJ1Y3QgCisgKiAgaGVyZS4gSWYgeW91IG1ha2UgY2hhbmdlcyBpbnNpZGUgdGhlIHNjcmlwdCwKKyAqCisgKiAgRE9OVCBGT1JHRVQgVE8gQ0hBTkdFIFRIRSBMRU5HVEhTIEhFUkUhCisgKi8KKworLyoKKyAqICBTY3JpcHQgZnJhZ21lbnRzIHdoaWNoIGFyZSBsb2FkZWQgaW50byB0aGUgb24tY2hpcCBSQU0gCisgKiAgb2YgODI1QSwgODc1LCA4NzYsIDg5NSwgODk1QSwgODk2IGFuZCAxMDEwIGNoaXBzLgorICogIE11c3Qgbm90IGV4Y2VlZCA0SyBieXRlcy4KKyAqLworc3RydWN0IFNZTV9GV0FfU0NSIHsKKwl1MzIgc3RhcnQJCVsgMTFdOworCXUzMiBnZXRqb2JfYmVnaW4JWyAgNF07CisJdTMyIF9zbXNfYTEwCQlbICA1XTsKKwl1MzIgZ2V0am9iX2VuZAkJWyAgNF07CisJdTMyIF9zbXNfYTIwCQlbICA0XTsKKyNpZmRlZiBTWU1fQ09ORl9UQVJHRVRfUk9MRV9TVVBQT1JUCisJdTMyIHNlbGVjdAkJWyAgOF07CisjZWxzZQorCXUzMiBzZWxlY3QJCVsgIDZdOworI2VuZGlmCisJdTMyIF9zbXNfYTMwCQlbICA1XTsKKwl1MzIgd2Zfc2VsX2RvbmUJCVsgIDJdOworCXUzMiBzZW5kX2lkZW50CQlbICAyXTsKKyNpZmRlZiBTWU1fQ09ORl9JQVJCX1NVUFBPUlQKKwl1MzIgc2VsZWN0MgkJWyAgOF07CisjZWxzZQorCXUzMiBzZWxlY3QyCQlbICAyXTsKKyNlbmRpZgorCXUzMiBjb21tYW5kCQlbICAyXTsKKwl1MzIgZGlzcGF0Y2gJCVsgMjhdOworCXUzMiBzZWxfbm9fY21kCQlbIDEwXTsKKwl1MzIgaW5pdAkJWyAgNl07CisJdTMyIGNscmFjawkJWyAgNF07CisJdTMyIGRhdGFpX2RvbmUJCVsgMTFdOworCXUzMiBkYXRhaV9kb25lX3dzcglbIDIwXTsKKwl1MzIgZGF0YW9fZG9uZQkJWyAxMV07CisJdTMyIGRhdGFvX2RvbmVfd3NzCVsgIDZdOworCXUzMiBkYXRhaV9waGFzZQkJWyAgNV07CisJdTMyIGRhdGFvX3BoYXNlCQlbICA1XTsKKwl1MzIgbXNnX2luCQlbICAyXTsKKwl1MzIgbXNnX2luMgkJWyAxMF07CisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJdTMyIHN0YXR1cwkJWyAxNF07CisjZWxzZQorCXUzMiBzdGF0dXMJCVsgMTBdOworI2VuZGlmCisJdTMyIGNvbXBsZXRlCQlbICA2XTsKKwl1MzIgY29tcGxldGUyCQlbICA4XTsKKwl1MzIgX3Ntc19hNDAJCVsgMTJdOworCXUzMiBkb25lCQlbICA1XTsKKwl1MzIgX3Ntc19hNTAJCVsgIDVdOworCXUzMiBfc21zX2E2MAkJWyAgMl07CisJdTMyIGRvbmVfZW5kCQlbICA0XTsKKwl1MzIgY29tcGxldGVfZXJyb3IJWyAgNV07CisJdTMyIHNhdmVfZHAJCVsgMTFdOworCXUzMiByZXN0b3JlX2RwCQlbICA3XTsKKwl1MzIgZGlzY29ubmVjdAkJWyAxMV07CisJdTMyIGRpc2Nvbm5lY3QyCQlbICA1XTsKKwl1MzIgX3Ntc19hNjUJCVsgIDNdOworI2lmZGVmIFNZTV9DT05GX0lBUkJfU1VQUE9SVAorCXUzMiBpZGxlCQlbICA0XTsKKyNlbHNlCisJdTMyIGlkbGUJCVsgIDJdOworI2VuZGlmCisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJdTMyIHVuZ2V0am9iCQlbICA3XTsKKyNlbHNlCisJdTMyIHVuZ2V0am9iCQlbICA1XTsKKyNlbmRpZgorI2lmZGVmIFNZTV9DT05GX1RBUkdFVF9ST0xFX1NVUFBPUlQKKwl1MzIgcmVzZWxlY3QJCVsgIDRdOworI2Vsc2UKKwl1MzIgcmVzZWxlY3QJCVsgIDJdOworI2VuZGlmCisJdTMyIHJlc2VsZWN0ZWQJCVsgMTldOworCXUzMiBfc21zX2E3MAkJWyAgNl07CisJdTMyIF9zbXNfYTgwCQlbICA0XTsKKwl1MzIgcmVzZWxlY3RlZDEJCVsgMjVdOworCXUzMiBfc21zX2E5MAkJWyAgNF07CisJdTMyIHJlc2VsX2x1bjAJCVsgIDddOworCXUzMiBfc21zX2ExMDAJCVsgIDRdOworCXUzMiByZXNlbF90YWcJCVsgIDhdOworI2lmICAgU1lNX0NPTkZfTUFYX1RBU0sqNCA+IDUxMgorCXUzMiBfc21zX2ExMTAJCVsgMjNdOworI2VsaWYgU1lNX0NPTkZfTUFYX1RBU0sqNCA+IDI1NgorCXUzMiBfc21zX2ExMTAJCVsgMTddOworI2Vsc2UKKwl1MzIgX3Ntc19hMTEwCQlbIDEzXTsKKyNlbmRpZgorCXUzMiBfc21zX2ExMjAJCVsgIDJdOworCXUzMiByZXNlbF9nbwkJWyAgNF07CisJdTMyIF9zbXNfYTEzMAkJWyAgN107CisJdTMyIHJlc2VsX2RzYQkJWyAgMl07CisJdTMyIHJlc2VsX2RzYTEJCVsgIDRdOworCXUzMiBfc21zX2ExNDAJCVsgIDddOworCXUzMiByZXNlbF9ub190YWcJWyAgNF07CisJdTMyIF9zbXNfYTE0NQkJWyAgN107CisJdTMyIGRhdGFfaW4JCVtTWU1fQ09ORl9NQVhfU0cgKiAyXTsKKwl1MzIgZGF0YV9pbjIJCVsgIDRdOworCXUzMiBkYXRhX291dAkJW1NZTV9DT05GX01BWF9TRyAqIDJdOworCXUzMiBkYXRhX291dDIJCVsgIDRdOworCXUzMiBwbTBfZGF0YQkJWyAxMl07CisJdTMyIHBtMF9kYXRhX291dAlbICA2XTsKKwl1MzIgcG0wX2RhdGFfZW5kCVsgIDddOworCXUzMiBwbV9kYXRhX2VuZAkJWyAgNF07CisJdTMyIF9zbXNfYTE1MAkJWyAgNF07CisJdTMyIHBtMV9kYXRhCQlbIDEyXTsKKwl1MzIgcG0xX2RhdGFfb3V0CVsgIDZdOworCXUzMiBwbTFfZGF0YV9lbmQJWyAgOV07Cit9OworCisvKgorICogIFNjcmlwdCBmcmFnbWVudHMgd2hpY2ggc3RheSBpbiBtYWluIG1lbW9yeSBmb3IgYWxsIGNoaXBzIAorICogIGV4Y2VwdCBmb3IgY2hpcHMgdGhhdCBzdXBwb3J0IDhLIG9uLWNoaXAgUkFNLgorICovCitzdHJ1Y3QgU1lNX0ZXQl9TQ1IgeworCXUzMiBub19kYXRhCQlbICAyXTsKKyNpZmRlZiBTWU1fQ09ORl9UQVJHRVRfUk9MRV9TVVBQT1JUCisJdTMyIHNlbF9mb3JfYWJvcnQJWyAxOF07CisjZWxzZQorCXUzMiBzZWxfZm9yX2Fib3J0CVsgMTZdOworI2VuZGlmCisJdTMyIHNlbF9mb3JfYWJvcnRfMQlbICAyXTsKKwl1MzIgbXNnX2luX2V0YwkJWyAxMl07CisJdTMyIG1zZ19yZWNlaXZlZAlbICA1XTsKKwl1MzIgbXNnX3dlaXJkX3NlZW4JWyAgNV07CisJdTMyIG1zZ19leHRlbmRlZAlbIDE3XTsKKwl1MzIgX3Ntc19iMTAJCVsgIDRdOworCXUzMiBtc2dfYmFkCQlbICA2XTsKKwl1MzIgbXNnX3dlaXJkCQlbICA0XTsKKwl1MzIgbXNnX3dlaXJkMQkJWyAgOF07CisJdTMyIHdkdHJfcmVzcAkJWyAgNl07CisJdTMyIHNlbmRfd2R0cgkJWyAgNF07CisJdTMyIHNkdHJfcmVzcAkJWyAgNl07CisJdTMyIHNlbmRfc2R0cgkJWyAgNF07CisJdTMyIHBwcl9yZXNwCQlbICA2XTsKKwl1MzIgc2VuZF9wcHIJCVsgIDRdOworCXUzMiBuZWdvX2JhZF9waGFzZQlbICA0XTsKKwl1MzIgbXNnX291dAkJWyAgNF07CisJdTMyIG1zZ19vdXRfZG9uZQlbICA0XTsKKwl1MzIgZGF0YV9vdnJ1bgkJWyAgM107CisJdTMyIGRhdGFfb3ZydW4xCQlbIDIyXTsKKwl1MzIgZGF0YV9vdnJ1bjIJCVsgIDhdOworCXUzMiBhYm9ydF9yZXNlbAkJWyAxNl07CisJdTMyIHJlc2VuZF9pZGVudAlbICA0XTsKKwl1MzIgaWRlbnRfYnJlYWsJCVsgIDRdOworCXUzMiBpZGVudF9icmVha19hdG4JWyAgNF07CisJdTMyIHNkYXRhX2luCQlbICA2XTsKKwl1MzIgcmVzZWxfYmFkX2x1bglbICA0XTsKKwl1MzIgYmFkX2lfdF9sCQlbICA0XTsKKwl1MzIgYmFkX2lfdF9sX3EJCVsgIDRdOworCXUzMiBiYWRfc3RhdHVzCQlbICA3XTsKKwl1MzIgd3NyX21hX2hlbHBlcglbICA0XTsKKworI2lmZGVmIFNZTV9PUFRfSEFORExFX0RJUl9VTktOT1dOCisJLyogVW5rbm93biBkaXJlY3Rpb24gaGFuZGxpbmcgKi8KKwl1MzIgZGF0YV9pbwkJWyAgMl07CisJdTMyIGRhdGFfaW9fY29tCQlbICA4XTsKKwl1MzIgZGF0YV9pb19vdXQJCVsgIDddOworI2VuZGlmCisJLyogRGF0YSBhcmVhICovCisJdTMyIHplcm8JCVsgIDFdOworCXUzMiBzY3JhdGNoCQlbICAxXTsKKwl1MzIgc2NyYXRjaDEJCVsgIDFdOworCXUzMiBwcmV2X2RvbmUJCVsgIDFdOworCXUzMiBkb25lX3BvcwkJWyAgMV07CisJdTMyIG5leHRqb2IJCVsgIDFdOworCXUzMiBzdGFydHBvcwkJWyAgMV07CisJdTMyIHRhcmd0YmwJCVsgIDFdOworfTsKKworLyoKKyAqICBTY3JpcHQgZnJhZ21lbnRzIHVzZWQgYXQgaW5pdGlhbGlzYXRpb25zLgorICogIE9ubHkgcnVucyBvdXQgb2YgbWFpbiBtZW1vcnkuCisgKi8KK3N0cnVjdCBTWU1fRldaX1NDUiB7CisJdTMyIHNub29wdGVzdAkJWyAgOV07CisJdTMyIHNub29wZW5kCQlbICAyXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgU1lNX0ZXQV9TQ1IgU1lNX0ZXQV9TQ1IgPSB7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTVEFSVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIHsKKwkvKgorCSAqICBTd2l0Y2ggdGhlIExFRCBvbi4KKwkgKiAgV2lsbCBiZSBwYXRjaGVkIHdpdGggYSBOT19PUCBpZiBMRUQKKwkgKiAgbm90IG5lZWRlZCBvciBub3QgZGVzaXJlZC4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoZ3ByZWcsIFNDUl9BTkQsIDB4ZmUpLAorCQkwLAorCS8qCisJICogICAgICBDbGVhciBTSUdQLgorCSAqLworCVNDUl9GUk9NX1JFRyAoY3Rlc3QyKSwKKwkJMCwKKwkvKgorCSAqICBTdG9wIGhlcmUgaWYgdGhlIEMgY29kZSB3YW50cyB0byBwZXJmb3JtIAorCSAqICBzb21lIGVycm9yIHJlY292ZXJ5IHByb2NlZHVyZSBtYW51YWxseS4KKwkgKiAgKEluZGljYXRlIHRoaXMgYnkgc2V0dGluZyBTRU0gaW4gSVNUQVQpCisJICovCisJU0NSX0ZST01fUkVHIChpc3RhdCksCisJCTAsCisJLyoKKwkgKiAgUmVwb3J0IHRvIHRoZSBDIGNvZGUgdGhlIG5leHQgcG9zaXRpb24gaW4gCisJICogIHRoZSBzdGFydCBxdWV1ZSB0aGUgU0NSSVBUUyB3aWxsIHNjaGVkdWxlLgorCSAqICBUaGUgQyBjb2RlIG11c3Qgbm90IGNoYW5nZSBTQ1JBVENIQS4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCVBBRERSX0IgKHN0YXJ0cG9zKSwKKwkJUkFERFJfMSAoc2NyYXRjaGEpLAorCVNDUl9JTlQgXiBJRlRSVUUgKE1BU0sgKFNFTSwgU0VNKSksCisJCVNJUl9TQ1JJUFRfU1RPUFBFRCwKKwkvKgorCSAqICBTdGFydCB0aGUgbmV4dCBqb2IuCisJICoKKwkgKiAgQERTQSAgICAgPSBzdGFydCBwb2ludCBmb3IgdGhpcyBqb2IuCisJICogIFNDUkFUQ0hBID0gYWRkcmVzcyBvZiB0aGlzIGpvYiBpbiB0aGUgc3RhcnQgcXVldWUuCisJICoKKwkgKiAgV2Ugd2lsbCByZXN0b3JlIHN0YXJ0cG9zIHdpdGggU0NSQVRDSEEgaWYgd2UgZmFpbHMgdGhlIAorCSAqICBhcmJpdHJhdGlvbiBvciBpZiBpdCBpcyB0aGUgaWRsZSBqb2IuCisJICoKKwkgKiAgVGhlIGJlbG93IEdFVEpPQl9CRUdJTiB0byBHRVRKT0JfRU5EIHNlY3Rpb24gb2YgU0NSSVBUUyAKKwkgKiAgaXMgYSBjcml0aWNhbCBwYXRoLiBJZiBpdCBpcyBwYXJ0aWFsbHkgZXhlY3V0ZWQsIGl0IHRoZW4gCisJICogIG1heSBoYXBwZW4gdGhhdCB0aGUgam9iIGFkZHJlc3MgaXMgbm90IHlldCBpbiB0aGUgRFNBIAorCSAqICBhbmQgdGhlIG5leHQgcXVldWUgcG9zaXRpb24gcG9pbnRzIHRvIHRoZSBuZXh0IEpPQi4KKwkgKi8KK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEdFVEpPQl9CRUdJTiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIENvcHkgdG8gYSBmaXhlZCBsb2NhdGlvbiBib3RoIHRoZSBuZXh0IFNUQVJUUE9TIAorCSAqICBhbmQgdGhlIGN1cnJlbnQgSk9CIGFkZHJlc3MsIHVzaW5nIHNlbGYgbW9kaWZ5aW5nIAorCSAqICBTQ1JJUFRTLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAoc2NyYXRjaGEpLAorCQlQQUREUl9BIChfc21zX2ExMCksCisJU0NSX0NPUFkgKDgpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgX1NNU19BMTAgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJCTAsCisJCVBBRERSX0IgKG5leHRqb2IpLAorCS8qCisJICogIE1vdmUgdGhlIHN0YXJ0IGFkZHJlc3MgdG8gVEVNUCB1c2luZyBzZWxmLQorCSAqICBtb2RpZnlpbmcgU0NSSVBUUyBhbmQganVtcCBpbmRpcmVjdGx5IHRvIAorCSAqICB0aGF0IGFkZHJlc3MuCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlQQUREUl9CIChuZXh0am9iKSwKKwkJUkFERFJfMSAoZHNhKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEdFVEpPQl9FTkQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAoZHNhKSwKKwkJUEFERFJfQSAoX3Ntc19hMjApLAorCVNDUl9DT1BZICg0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IF9TTVNfQTIwID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQkwLAorCQlSQUREUl8xICh0ZW1wKSwKKwlTQ1JfUkVUVVJOLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0VMRUNUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgRFNBCWNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIGEgc2NoZWR1bGVkCisJICogIAlkYXRhIHN0cnVjdHVyZS4KKwkgKgorCSAqICBTQ1JBVENIQSBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgcXVldWUgIAorCSAqICAJZW50cnkgd2hpY2ggcG9pbnRzIHRvIHRoZSBuZXh0IGpvYi4KKwkgKgorCSAqICBTZXQgSW5pdGlhdG9yIG1vZGUuCisJICoKKwkgKiAgKFRhcmdldCBtb2RlIGlzIGxlZnQgYXMgYW4gZXhlcmNpc2UgZm9yIHRoZSByZWFkZXIpCisJICovCisjaWZkZWYgU1lNX0NPTkZfVEFSR0VUX1JPTEVfU1VQUE9SVAorCVNDUl9DTFIgKFNDUl9UUkcpLAorCQkwLAorI2VuZGlmCisJLyoKKwkgKiAgICAgIEFuZCB0cnkgdG8gc2VsZWN0IHRoaXMgdGFyZ2V0LgorCSAqLworCVNDUl9TRUxfVEJMX0FUTiBeIG9mZnNldG9mIChzdHJ1Y3Qgc3ltX2RzYiwgc2VsZWN0KSwKKwkJUEFERFJfQSAodW5nZXRqb2IpLAorCS8qCisJICogIE5vdyB0aGVyZSBhcmUgNCBwb3NzaWJpbGl0aWVzOgorCSAqCisJICogICgxKSBUaGUgY2hpcCBsb3NlcyBhcmJpdHJhdGlvbi4KKwkgKiAgVGhpcyBpcyBvaywgYmVjYXVzZSBpdCB3aWxsIHRyeSBhZ2FpbiwKKwkgKiAgd2hlbiB0aGUgYnVzIGJlY29tZXMgaWRsZS4KKwkgKiAgKEJ1dCBiZXdhcmUgb2YgdGhlIHRpbWVvdXQgZnVuY3Rpb24hKQorCSAqCisJICogICgyKSBUaGUgY2hpcCBpcyByZXNlbGVjdGVkLgorCSAqICBUaGVuIHRoZSBzY3JpcHQgcHJvY2Vzc29yIHRha2VzIHRoZSBqdW1wCisJICogIHRvIHRoZSBSRVNFTEVDVCBsYWJlbC4KKwkgKgorCSAqICAoMykgVGhlIGNoaXAgd2lucyBhcmJpdHJhdGlvbi4KKwkgKiAgVGhlbiBpdCB3aWxsIGV4ZWN1dGUgU0NSSVBUUyBpbnN0cnVjdGlvbiB1bnRpbCAKKwkgKiAgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gdGhhdCBjaGVja3MgU0NTSSBwaGFzZS4KKwkgKiAgVGhlbiB3aWxsIHN0b3AgYW5kIHdhaXQgZm9yIHNlbGVjdGlvbiB0byBiZSAKKwkgKiAgY29tcGxldGUgb3Igc2VsZWN0aW9uIHRpbWUtb3V0IHRvIG9jY3VyLgorCSAqCisJICogIEFmdGVyIGhhdmluZyB3b24gYXJiaXRyYXRpb24sIHRoZSBTQ1JJUFRTICAKKwkgKiAgcHJvY2Vzc29yIGlzIGFibGUgdG8gZXhlY3V0ZSBpbnN0cnVjdGlvbnMgd2hpbGUgCisJICogIHRoZSBTQ1NJIGNvcmUgaXMgcGVyZm9ybWluZyBTQ1NJIHNlbGVjdGlvbi4KKwkgKi8KKworCS8qCisJICogIENvcHkgdGhlIENDQiBoZWFkZXIgdG8gYSBmaXhlZCBsb2NhdGlvbiAKKwkgKiAgaW4gdGhlIEhDQiB1c2luZyBzZWxmLW1vZGlmeWluZyBTQ1JJUFRTLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAoZHNhKSwKKwkJUEFERFJfQSAoX3Ntc19hMzApLAorCVNDUl9DT1BZIChzaXplb2Yoc3RydWN0IHN5bV9jY2JoKSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBfU01TX0EzMCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkJMCwKKwkJSEFERFJfMSAoY2NiX2hlYWQpLAorCS8qCisJICogIEluaXRpYWxpemUgdGhlIHN0YXR1cyByZWdpc3RlcgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJSEFERFJfMSAoY2NiX2hlYWQuc3RhdHVzKSwKKwkJUkFERFJfMSAoc2NyMCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBXRl9TRUxfRE9ORSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfSU5UIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19PVVQpKSwKKwkJU0lSX1NFTF9BVE5fTk9fTVNHX09VVCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTkRfSURFTlQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFNlbGVjdGlvbiBjb21wbGV0ZS4KKwkgKiAgU2VuZCB0aGUgSURFTlRJRlkgYW5kIHBvc3NpYmx5IHRoZSBUQUcgbWVzc2FnZSAKKwkgKiAgYW5kIG5lZ290aWF0aW9uIG1lc3NhZ2UgaWYgcHJlc2VudC4KKwkgKi8KKwlTQ1JfTU9WRV9UQkwgXiBTQ1JfTVNHX09VVCwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fZHNiLCBzbXNnKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTEVDVDIgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworI2lmZGVmIFNZTV9DT05GX0lBUkJfU1VQUE9SVAorCS8qCisJICogIFNldCBJTU1FRElBVEUgQVJCSVRSQVRJT04gaWYgd2UgaGF2ZSBiZWVuIGdpdmVuIAorCSAqICBhIGhpbnQgdG8gZG8gc28uIChTb21lIGpvYiB0byBkbyBhZnRlciB0aGlzIG9uZSkuCisJICovCisJU0NSX0ZST01fUkVHIChIRl9SRUcpLAorCQkwLAorCVNDUl9KVU1QUiBeIElGRkFMU0UgKE1BU0sgKEhGX0hJTlRfSUFSQiwgSEZfSElOVF9JQVJCKSksCisJCTgsCisJU0NSX1JFR19SRUcgKHNjbnRsMSwgU0NSX09SLCBJQVJCKSwKKwkJMCwKKyNlbmRpZgorCS8qCisJICogIEFudGljaXBhdGUgdGhlIENPTU1BTkQgcGhhc2UuCisJICogIFRoaXMgaXMgdGhlIFBIQVNFIHdlIGV4cGVjdCBhdCB0aGlzIHBvaW50LgorCSAqLworCVNDUl9KVU1QIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0NPTU1BTkQpKSwKKwkJUEFERFJfQSAoc2VsX25vX2NtZCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBDT01NQU5EID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICAuLi4gYW5kIHNlbmQgdGhlIGNvbW1hbmQKKwkgKi8KKwlTQ1JfTU9WRV9UQkwgXiBTQ1JfQ09NTUFORCwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fZHNiLCBjbWQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgRElTUEFUQ0ggPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgTVNHX0lOIGlzIHRoZSBvbmx5IHBoYXNlIHRoYXQgc2hhbGwgYmUgCisJICogIGVudGVyZWQgYXQgbGVhc3Qgb25jZSBmb3IgZWFjaCAocmUpc2VsZWN0aW9uLgorCSAqICBTbyB3ZSB0ZXN0IGl0IGZpcnN0LgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChXSEVOIChTQ1JfTVNHX0lOKSksCisJCVBBRERSX0EgKG1zZ19pbiksCisJU0NSX0pVTVAgXiBJRlRSVUUgKElGIChTQ1JfREFUQV9PVVQpKSwKKwkJUEFERFJfQSAoZGF0YW9fcGhhc2UpLAorCVNDUl9KVU1QIF4gSUZUUlVFIChJRiAoU0NSX0RBVEFfSU4pKSwKKwkJUEFERFJfQSAoZGF0YWlfcGhhc2UpLAorCVNDUl9KVU1QIF4gSUZUUlVFIChJRiAoU0NSX1NUQVRVUykpLAorCQlQQUREUl9BIChzdGF0dXMpLAorCVNDUl9KVU1QIF4gSUZUUlVFIChJRiAoU0NSX0NPTU1BTkQpKSwKKwkJUEFERFJfQSAoY29tbWFuZCksCisJU0NSX0pVTVAgXiBJRlRSVUUgKElGIChTQ1JfTVNHX09VVCkpLAorCQlQQUREUl9CIChtc2dfb3V0KSwKKwkvKgorCSAqICBEaXNjYXJkIGFzIG1hbnkgaWxsZWdhbCBwaGFzZXMgYXMgCisJICogIHJlcXVpcmVkIGFuZCB0ZWxsIHRoZSBDIGNvZGUgYWJvdXQuCisJICovCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0lMR19PVVQpKSwKKwkJMTYsCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9JTEdfT1VULAorCQlIQUREUl8xIChzY3JhdGNoKSwKKwlTQ1JfSlVNUFIgXiBJRlRSVUUgKFdIRU4gKFNDUl9JTEdfT1VUKSksCisJCS0xNiwKKwlTQ1JfSlVNUFIgXiBJRkZBTFNFIChXSEVOIChTQ1JfSUxHX0lOKSksCisJCTE2LAorCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfSUxHX0lOLAorCQlIQUREUl8xIChzY3JhdGNoKSwKKwlTQ1JfSlVNUFIgXiBJRlRSVUUgKFdIRU4gKFNDUl9JTEdfSU4pKSwKKwkJLTE2LAorCVNDUl9JTlQsCisJCVNJUl9CQURfUEhBU0UsCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTF9OT19DTUQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFRoZSB0YXJnZXQgZG9lcyBub3Qgc3dpdGNoIHRvIGNvbW1hbmQgCisJICogIHBoYXNlIGFmdGVyIElERU5USUZZIGhhcyBiZWVuIHNlbnQuCisJICoKKwkgKiAgSWYgaXQgc3RheXMgaW4gTVNHIE9VVCBwaGFzZSBzZW5kIGl0IAorCSAqICB0aGUgSURFTlRJRlkgYWdhaW4uCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKFdIRU4gKFNDUl9NU0dfT1VUKSksCisJCVBBRERSX0IgKHJlc2VuZF9pZGVudCksCisJLyoKKwkgKiAgSWYgdGFyZ2V0IGRvZXMgbm90IHN3aXRjaCB0byBNU0cgSU4gcGhhc2UgCisJICogIGFuZCB3ZSBzZW50IGEgbmVnb3RpYXRpb24sIGFzc2VydCB0aGUgCisJICogIGZhaWx1cmUgaW1tZWRpYXRlbHkuCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKFdIRU4gKFNDUl9NU0dfSU4pKSwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorCVNDUl9GUk9NX1JFRyAoSFNfUkVHKSwKKwkJMCwKKwlTQ1JfSU5UIF4gSUZUUlVFIChEQVRBIChIU19ORUdPVElBVEUpKSwKKwkJU0lSX05FR09fRkFJTEVELAorCS8qCisJICogIEp1bXAgdG8gZGlzcGF0Y2hlci4KKwkgKi8KKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgSU5JVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgV2FpdCBmb3IgdGhlIFNDU0kgUkVTRVQgc2lnbmFsIHRvIGJlIAorCSAqICBpbmFjdGl2ZSBiZWZvcmUgcmVzdGFydGluZyBvcGVyYXRpb25zLCAKKwkgKiAgc2luY2UgdGhlIGNoaXAgbWF5IGhhbmcgb24gU0VMX0FUTiAKKwkgKiAgaWYgU0NTSSBSRVNFVCBpcyBhY3RpdmUuCisJICovCisJU0NSX0ZST01fUkVHIChzc3RhdDApLAorCQkwLAorCVNDUl9KVU1QUiBeIElGVFJVRSAoTUFTSyAoSVJTVCwgSVJTVCkpLAorCQktMTYsCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKHN0YXJ0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IENMUkFDSyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFRlcm1pbmF0ZSBwb3NzaWJsZSBwZW5kaW5nIG1lc3NhZ2UgcGhhc2UuCisJICovCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFJX0RPTkUgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFNhdmUgY3VycmVudCBwb2ludGVyIHRvIExBU1RQLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAodGVtcCksCisJCUhBRERSXzEgKGNjYl9oZWFkLmxhc3RwKSwKKwkvKgorCSAqICBJZiB0aGUgU1dJREUgaXMgbm90IGZ1bGwsIGp1bXAgdG8gZGlzcGF0Y2hlci4KKwkgKiAgV2UgYW50aWNpcGF0ZSBhIFNUQVRVUyBwaGFzZS4KKwkgKi8KKwlTQ1JfRlJPTV9SRUcgKHNjbnRsMiksCisJCTAsCisJU0NSX0pVTVAgXiBJRlRSVUUgKE1BU0sgKFdTUiwgV1NSKSksCisJCVBBRERSX0EgKGRhdGFpX2RvbmVfd3NyKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoV0hFTiAoU0NSX1NUQVRVUykpLAorCQlQQUREUl9BIChzdGF0dXMpLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBSV9ET05FX1dTUiA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBUaGUgU1dJREUgaXMgZnVsbC4KKwkgKiAgQ2xlYXIgdGhpcyBjb25kaXRpb24uCisJICovCisJU0NSX1JFR19SRUcgKHNjbnRsMiwgU0NSX09SLCBXU1IpLAorCQkwLAorCS8qCisJICogIFdlIGFyZSBleHBlY3RpbmcgYW4gSUdOT1JFIFJFU0lEVUUgbWVzc2FnZSAKKwkgKiAgZnJvbSB0aGUgZGV2aWNlLCBvdGhlcndpc2Ugd2UgYXJlIGluIGRhdGEgCisJICogIG92ZXJydW4gY29uZGl0aW9uLiBDaGVjayBhZ2FpbnN0IE1TR19JTiBwaGFzZS4KKwkgKi8KKwlTQ1JfSU5UIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19JTikpLAorCQlTSVJfU1dJREVfT1ZFUlJVTiwKKwlTQ1JfSlVNUCBeIElGRkFMU0UgKFdIRU4gKFNDUl9NU0dfSU4pKSwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorCS8qCisJICogIFdlIGFyZSBpbiBNU0dfSU4gcGhhc2UsCisJICogIFJlYWQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UuCisJICogIElmIGl0IGlzIG5vdCBhbiBJR05PUkUgUkVTSURVRSBtZXNzYWdlLAorCSAqICBzaWduYWwgb3ZlcnJ1biBhbmQganVtcCB0byBtZXNzYWdlIAorCSAqICBwcm9jZXNzaW5nLgorCSAqLworCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfTVNHX0lOLAorCQlIQUREUl8xIChtc2dpblswXSksCisJU0NSX0lOVCBeIElGRkFMU0UgKERBVEEgKE1fSUdOX1JFU0lEVUUpKSwKKwkJU0lSX1NXSURFX09WRVJSVU4sCisJU0NSX0pVTVAgXiBJRkZBTFNFIChEQVRBIChNX0lHTl9SRVNJRFVFKSksCisJCVBBRERSX0EgKG1zZ19pbjIpLAorCS8qCisJICogIFdlIGdvdCB0aGUgbWVzc2FnZSB3ZSBleHBlY3RlZC4KKwkgKiAgUmVhZCB0aGUgMm5kIGJ5dGUsIGFuZCBqdW1wIHRvIGRpc3BhdGNoZXIuCisJICovCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfSU4sCisJCUhBRERSXzEgKG1zZ2luWzFdKSwKKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQU9fRE9ORSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgU2F2ZSBjdXJyZW50IHBvaW50ZXIgdG8gTEFTVFAuCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlSQUREUl8xICh0ZW1wKSwKKwkJSEFERFJfMSAoY2NiX2hlYWQubGFzdHApLAorCS8qCisJICogIElmIHRoZSBTT0RMIGlzIG5vdCBmdWxsIGp1bXAgdG8gZGlzcGF0Y2hlci4KKwkgKiAgV2UgYW50aWNpcGF0ZSBhIFNUQVRVUyBwaGFzZS4KKwkgKi8KKwlTQ1JfRlJPTV9SRUcgKHNjbnRsMiksCisJCTAsCisJU0NSX0pVTVAgXiBJRlRSVUUgKE1BU0sgKFdTUywgV1NTKSksCisJCVBBRERSX0EgKGRhdGFvX2RvbmVfd3NzKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoV0hFTiAoU0NSX1NUQVRVUykpLAorCQlQQUREUl9BIChzdGF0dXMpLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBT19ET05FX1dTUyA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBUaGUgU09ETCBpcyBmdWxsLCBjbGVhciB0aGlzIGNvbmRpdGlvbi4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoc2NudGwyLCBTQ1JfT1IsIFdTUyksCisJCTAsCisJLyoKKwkgKiAgQW5kIHNpZ25hbCBhIERBVEEgVU5ERVJSVU4gY29uZGl0aW9uIAorCSAqICB0byB0aGUgQyBjb2RlLgorCSAqLworCVNDUl9JTlQsCisJCVNJUl9TT0RMX1VOREVSUlVOLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBSV9QSEFTRSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBKdW1wIHRvIGN1cnJlbnQgcG9pbnRlci4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCUhBRERSXzEgKGNjYl9oZWFkLmxhc3RwKSwKKwkJUkFERFJfMSAodGVtcCksCisJU0NSX1JFVFVSTiwKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFPX1BIQVNFID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIEp1bXAgdG8gY3VycmVudCBwb2ludGVyLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJSEFERFJfMSAoY2NiX2hlYWQubGFzdHApLAorCQlSQUREUl8xICh0ZW1wKSwKKwlTQ1JfUkVUVVJOLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX0lOID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgR2V0IHRoZSBmaXJzdCBieXRlIG9mIHRoZSBtZXNzYWdlLgorCSAqCisJICogIFRoZSBzY3JpcHQgcHJvY2Vzc29yIGRvZXNuJ3QgbmVnYXRlIHRoZQorCSAqICBBQ0sgc2lnbmFsIGFmdGVyIHRoaXMgdHJhbnNmZXIuCisJICovCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfSU4sCisJCUhBRERSXzEgKG1zZ2luWzBdKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE1TR19JTjIgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIENoZWNrIGZpcnN0IGFnYWluc3QgMSBieXRlIG1lc3NhZ2VzIAorCSAqICB0aGF0IHdlIGhhbmRsZSBmcm9tIFNDUklQVFMuCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKE1fQ09NUExFVEUpKSwKKwkJUEFERFJfQSAoY29tcGxldGUpLAorCVNDUl9KVU1QIF4gSUZUUlVFIChEQVRBIChNX0RJU0NPTk5FQ1QpKSwKKwkJUEFERFJfQSAoZGlzY29ubmVjdCksCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKE1fU0FWRV9EUCkpLAorCQlQQUREUl9BIChzYXZlX2RwKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoTV9SRVNUT1JFX0RQKSksCisJCVBBRERSX0EgKHJlc3RvcmVfZHApLAorCS8qCisJICogIFdlIGhhbmRsZSBhbGwgb3RoZXIgbWVzc2FnZXMgZnJvbSB0aGUgCisJICogIEMgY29kZSwgc28gbm8gbmVlZCB0byB3YXN0ZSBvbi1jaGlwIFJBTSAKKwkgKiAgZm9yIHRob3NlIG9uZXMuCisJICovCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKG1zZ19pbl9ldGMpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU1RBVFVTID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgZ2V0IHRoZSBzdGF0dXMKKwkgKi8KKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX1NUQVRVUywKKwkJSEFERFJfMSAoc2NyYXRjaCksCisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJLyoKKwkgKiAgSWYgU1RBVFVTIGlzIG5vdCBHT09ELCBjbGVhciBJTU1FRElBVEUgQVJCSVRSQVRJT04sIAorCSAqICBzaW5jZSB3ZSBtYXkgaGF2ZSB0byB0YW1wZXIgdGhlIHN0YXJ0IHF1ZXVlIGZyb20gCisJICogIHRoZSBDIGNvZGUuCisJICovCisJU0NSX0pVTVBSIF4gSUZUUlVFIChEQVRBIChTX0dPT0QpKSwKKwkJOCwKKwlTQ1JfUkVHX1JFRyAoc2NudGwxLCBTQ1JfQU5ELCB+SUFSQiksCisJCTAsCisjZW5kaWYKKwkvKgorCSAqICBzYXZlIHN0YXR1cyB0byBzY3NpX3N0YXR1cy4KKwkgKiAgbWFyayBhcyBjb21wbGV0ZS4KKwkgKi8KKwlTQ1JfVE9fUkVHIChTU19SRUcpLAorCQkwLAorCVNDUl9MT0FEX1JFRyAoSFNfUkVHLCBIU19DT01QTEVURSksCisJCTAsCisJLyoKKwkgKiAgQW50aWNpcGF0ZSB0aGUgTUVTU0FHRSBQSEFTRSBmb3IgCisJICogIHRoZSBUQVNLIENPTVBMRVRFIG1lc3NhZ2UuCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKFdIRU4gKFNDUl9NU0dfSU4pKSwKKwkJUEFERFJfQSAobXNnX2luKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQ09NUExFVEUgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQ29tcGxldGUgbWVzc2FnZS4KKwkgKgorCSAqICBXaGVuIHdlIHRlcm1pbmF0ZSB0aGUgY3ljbGUgYnkgY2xlYXJpbmcgQUNLLAorCSAqICB0aGUgdGFyZ2V0IG1heSBkaXNjb25uZWN0IGltbWVkaWF0ZWx5LgorCSAqCisJICogIFdlIGRvbid0IHdhbnQgdG8gYmUgdG9sZCBvZiBhbiAidW5leHBlY3RlZCBkaXNjb25uZWN0IiwKKwkgKiAgc28gd2UgZGlzYWJsZSB0aGlzIGZlYXR1cmUuCisJICovCisJU0NSX1JFR19SRUcgKHNjbnRsMiwgU0NSX0FORCwgMHg3ZiksCisJCTAsCisJLyoKKwkgKiAgVGVybWluYXRlIGN5Y2xlIC4uLgorCSAqLworCVNDUl9DTFIgKFNDUl9BQ0t8U0NSX0FUTiksCisJCTAsCisJLyoKKwkgKiAgLi4uIGFuZCB3YWl0IGZvciB0aGUgZGlzY29ubmVjdC4KKwkgKi8KKwlTQ1JfV0FJVF9ESVNDLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQ09NUExFVEUyID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgU2F2ZSBob3N0IHN0YXR1cy4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSXzEgKHNjcjApLAorCQlIQUREUl8xIChjY2JfaGVhZC5zdGF0dXMpLAorCS8qCisJICogIE1vdmUgYmFjayB0aGUgQ0NCIGhlYWRlciB1c2luZyBzZWxmLW1vZGlmeWluZyAKKwkgKiAgU0NSSVBUUy4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSXzEgKGRzYSksCisJCVBBRERSX0EgKF9zbXNfYTQwKSwKKwlTQ1JfQ09QWSAoc2l6ZW9mKHN0cnVjdCBzeW1fY2NiaCkpLAorCQlIQUREUl8xIChjY2JfaGVhZCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBfU01TX0E0MCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkJMCwKKwkvKgorCSAqICBTb21lIGJyaWRnZXMgbWF5IHJlb3JkZXIgRE1BIHdyaXRlcyB0byBtZW1vcnkuCisJICogIFdlIGRvbm5vdCB3YW50IHRoZSBDUFUgdG8gZGVhbCB3aXRoIGNvbXBsZXRpb25zICAKKwkgKiAgd2l0aG91dCBhbGwgdGhlIHBvc3RlZCB3cml0ZSBoYXZpbmcgYmVlbiBmbHVzaGVkIAorCSAqICB0byBtZW1vcnkuIFRoaXMgRFVNTVkgUkVBRCBzaG91bGQgZmx1c2ggcG9zdGVkIAorCSAqICBidWZmZXJzIHByaW9yIHRvIHRoZSBDUFUgaGF2aW5nIHRvIGRlYWwgd2l0aCAKKwkgKiAgY29tcGxldGlvbnMuCisJICovCisJU0NSX0NPUFkgKDQpLAkJCS8qIERVTU1ZIFJFQUQgKi8KKwkJSEFERFJfMSAoY2NiX2hlYWQuc3RhdHVzKSwKKwkJUkFERFJfMSAoc2NyMCksCisJLyoKKwkgKiAgSWYgY29tbWFuZCByZXN1bHRlZCBpbiBub3QgR09PRCBzdGF0dXMsCisJICogIGNhbGwgdGhlIEMgY29kZSBpZiBuZWVkZWQuCisJICovCisJU0NSX0ZST01fUkVHIChTU19SRUcpLAorCQkwLAorCVNDUl9DQUxMIF4gSUZGQUxTRSAoREFUQSAoU19HT09EKSksCisJCVBBRERSX0IgKGJhZF9zdGF0dXMpLAorCS8qCisJICogIElmIHdlIHBlcmZvcm1lZCBhbiBhdXRvLXNlbnNlLCBjYWxsIAorCSAqICB0aGUgQyBjb2RlIHRvIHN5bmNocm9ueXplIHRhc2sgYWJvcnRzIAorCSAqICB3aXRoIFVOSVQgQVRURU5USU9OIGNvbmRpdGlvbnMuCisJICovCisJU0NSX0ZST01fUkVHIChIRl9SRUcpLAorCQkwLAorCVNDUl9KVU1QIF4gSUZGQUxTRSAoTUFTSyAoMCAsKEhGX1NFTlNFfEhGX0VYVF9FUlIpKSksCisJCVBBRERSX0EgKGNvbXBsZXRlX2Vycm9yKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERPTkUgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIENvcHkgdGhlIERTQSB0byB0aGUgRE9ORSBRVUVVRSBhbmQgCisJICogIHNpZ25hbCBjb21wbGV0aW9uIHRvIHRoZSBob3N0LgorCSAqICBJZiB3ZSBhcmUgaW50ZXJydXB0ZWQgYmV0d2VlbiBET05FIAorCSAqICBhbmQgRE9ORV9FTkQsIHdlIG11c3QgcmVzZXQsIG90aGVyd2lzZSAKKwkgKiAgdGhlIGNvbXBsZXRlZCBDQ0IgbWF5IGJlIGxvc3QuCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlQQUREUl9CIChkb25lX3BvcyksCisJCVBBRERSX0EgKF9zbXNfYTUwKSwKKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSXzEgKGRzYSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBfU01TX0E1MCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkJMCwKKwlTQ1JfQ09QWSAoNCksCisJCVBBRERSX0IgKGRvbmVfcG9zKSwKKwkJUEFERFJfQSAoX3Ntc19hNjApLAorCS8qCisJICogIFRoZSBpbnN0cnVjdGlvbiBiZWxvdyByZWFkcyB0aGUgRE9ORSBRVUVVRSBuZXh0IAorCSAqICBmcmVlIHBvc2l0aW9uIGZyb20gbWVtb3J5LgorCSAqICBJbiBhZGRpdGlvbiBpdCBlbnN1cmVzIHRoYXQgYWxsIFBDSSBwb3N0ZWQgd3JpdGVzICAKKwkgKiAgYXJlIGZsdXNoZWQgYW5kIHNvIHRoZSBEU0EgdmFsdWUgb2YgdGhlIGRvbmUgCisJICogIENDQiBpcyB2aXNpYmxlIGJ5IHRoZSBDUFUgYmVmb3JlIElOVEZMWSBpcyByYWlzZWQuCisJICovCisJU0NSX0NPUFkgKDgpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgX1NNU19BNjAgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJCTAsCisJCVBBRERSX0IgKHByZXZfZG9uZSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBET05FX0VORCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfSU5UX0ZMWSwKKwkJMCwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoc3RhcnQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQ09NUExFVEVfRVJST1IgPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NPUFkgKDQpLAorCQlQQUREUl9CIChzdGFydHBvcyksCisJCVJBRERSXzEgKHNjcmF0Y2hhKSwKKwlTQ1JfSU5ULAorCQlTSVJfQ09NUExFVEVfRVJST1IsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTQVZFX0RQID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBDbGVhciBBQ0sgaW1tZWRpYXRlbHkuCisJICogIE5vIG5lZWQgdG8gZGVsYXkgaXQuCisJICovCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJLyoKKwkgKiAgS2VlcCB0cmFjayB3ZSByZWNlaXZlZCBhIFNBVkUgRFAsIHNvIAorCSAqICB3ZSB3aWxsIHN3aXRjaCB0byB0aGUgb3RoZXIgUE0gY29udGV4dCAKKwkgKiAgb24gdGhlIG5leHQgUE0gc2luY2UgdGhlIERQIG1heSBwb2ludCAKKwkgKiAgdG8gdGhlIGN1cnJlbnQgUE0gY29udGV4dC4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoSEZfUkVHLCBTQ1JfT1IsIEhGX0RQX1NBVkVEKSwKKwkJMCwKKwkvKgorCSAqICBTQVZFX0RQIG1lc3NhZ2U6CisJICogIENvcHkgTEFTVFAgdG8gU0FWRVAuCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlIQUREUl8xIChjY2JfaGVhZC5sYXN0cCksCisJCUhBRERSXzEgKGNjYl9oZWFkLnNhdmVwKSwKKwkvKgorCSAqICBBbnRpY2lwYXRlIHRoZSBNRVNTQUdFIFBIQVNFIGZvciAKKwkgKiAgdGhlIERJU0NPTk5FQ1QgbWVzc2FnZS4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoV0hFTiAoU0NSX01TR19JTikpLAorCQlQQUREUl9BIChtc2dfaW4pLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNUT1JFX0RQID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBDbGVhciBBQ0sgaW1tZWRpYXRlbHkuCisJICogIE5vIG5lZWQgdG8gZGVsYXkgaXQuCisJICovCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJLyoKKwkgKiAgQ29weSBTQVZFUCB0byBMQVNUUC4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCUhBRERSXzEgKGNjYl9oZWFkLnNhdmVwKSwKKwkJSEFERFJfMSAoY2NiX2hlYWQubGFzdHApLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBESVNDT05ORUNUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBESVNDT05ORUNUaW5nICAuLi4KKwkgKgorCSAqICBkaXNhYmxlIHRoZSAidW5leHBlY3RlZCBkaXNjb25uZWN0IiBmZWF0dXJlLAorCSAqICBhbmQgcmVtb3ZlIHRoZSBBQ0sgc2lnbmFsLgorCSAqLworCVNDUl9SRUdfUkVHIChzY250bDIsIFNDUl9BTkQsIDB4N2YpLAorCQkwLAorCVNDUl9DTFIgKFNDUl9BQ0t8U0NSX0FUTiksCisJCTAsCisJLyoKKwkgKiAgV2FpdCBmb3IgdGhlIGRpc2Nvbm5lY3QuCisJICovCisJU0NSX1dBSVRfRElTQywKKwkJMCwKKwkvKgorCSAqICBTdGF0dXMgaXM6IERJU0NPTk5FQ1RFRC4KKwkgKi8KKwlTQ1JfTE9BRF9SRUcgKEhTX1JFRywgSFNfRElTQ09OTkVDVCksCisJCTAsCisJLyoKKwkgKiAgU2F2ZSBob3N0IHN0YXR1cy4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSXzEgKHNjcjApLAorCQlIQUREUl8xIChjY2JfaGVhZC5zdGF0dXMpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgRElTQ09OTkVDVDIgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgTW92ZSBiYWNrIHRoZSBDQ0IgaGVhZGVyIHVzaW5nIHNlbGYtbW9kaWZ5aW5nIAorCSAqICBTQ1JJUFRTLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAoZHNhKSwKKwkJUEFERFJfQSAoX3Ntc19hNjUpLAorCVNDUl9DT1BZIChzaXplb2Yoc3RydWN0IHN5bV9jY2JoKSksCisJCUhBRERSXzEgKGNjYl9oZWFkKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IF9TTVNfQTY1ID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChzdGFydCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBJRExFID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBOb3RoaW5nIHRvIGRvPworCSAqICBTd2l0Y2ggdGhlIExFRCBvZmYgYW5kIHdhaXQgZm9yIHJlc2VsZWN0LgorCSAqICBXaWxsIGJlIHBhdGNoZWQgd2l0aCBhIE5PX09QIGlmIExFRAorCSAqICBub3QgbmVlZGVkIG9yIG5vdCBkZXNpcmVkLgorCSAqLworCVNDUl9SRUdfUkVHIChncHJlZywgU0NSX09SLCAweDAxKSwKKwkJMCwKKyNpZmRlZiBTWU1fQ09ORl9JQVJCX1NVUFBPUlQKKwlTQ1JfSlVNUFIsCisJCTgsCisjZW5kaWYKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFVOR0VUSk9CID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworI2lmZGVmIFNZTV9DT05GX0lBUkJfU1VQUE9SVAorCS8qCisJICogIFNldCBJTU1FRElBVEUgQVJCSVRSQVRJT04sIGZvciB0aGUgbmV4dCB0aW1lLgorCSAqICBUaGlzIHdpbGwgZ2l2ZSB1cyBiZXR0ZXIgY2hhbmNlIHRvIHdpbiBhcmJpdHJhdGlvbiAKKwkgKiAgZm9yIHRoZSBqb2Igd2UganVzdCB3YW50ZWQgdG8gZG8uCisJICovCisJU0NSX1JFR19SRUcgKHNjbnRsMSwgU0NSX09SLCBJQVJCKSwKKwkJMCwKKyNlbmRpZgorCS8qCisJICogIFdlIGFyZSBub3QgYWJsZSB0byByZXN0YXJ0IHRoZSBTQ1JJUFRTIGlmIHdlIGFyZSAKKwkgKiAgaW50ZXJydXB0ZWQgYW5kIHRoZXNlIGluc3RydWN0aW9uIGhhdmVuJ3QgYmVlbiAKKwkgKiAgYWxsIGV4ZWN1dGVkLiBCVFcsIHRoaXMgaXMgdmVyeSB1bmxpa2VseSB0byAKKwkgKiAgaGFwcGVuLCBidXQgd2UgY2hlY2sgdGhhdCBmcm9tIHRoZSBDIGNvZGUuCisJICovCisJU0NSX0xPQURfUkVHIChkc2EsIDB4ZmYpLAorCQkwLAorCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAoc2NyYXRjaGEpLAorCQlQQUREUl9CIChzdGFydHBvcyksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTEVDVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKyNpZmRlZiBTWU1fQ09ORl9UQVJHRVRfUk9MRV9TVVBQT1JUCisJLyoKKwkgKiAgTWFrZSBzdXJlIHdlIGFyZSBpbiBpbml0aWF0b3IgbW9kZS4KKwkgKi8KKwlTQ1JfQ0xSIChTQ1JfVFJHKSwKKwkJMCwKKyNlbmRpZgorCS8qCisJICogIFNsZWVwIHdhaXRpbmcgZm9yIGEgcmVzZWxlY3Rpb24uCisJICovCisJU0NSX1dBSVRfUkVTRUwsCisJCVBBRERSX0Eoc3RhcnQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTRUxFQ1RFRCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgU3dpdGNoIHRoZSBMRUQgb24uCisJICogIFdpbGwgYmUgcGF0Y2hlZCB3aXRoIGEgTk9fT1AgaWYgTEVECisJICogIG5vdCBuZWVkZWQgb3Igbm90IGRlc2lyZWQuCisJICovCisJU0NSX1JFR19SRUcgKGdwcmVnLCBTQ1JfQU5ELCAweGZlKSwKKwkJMCwKKwkvKgorCSAqICBsb2FkIHRoZSB0YXJnZXQgaWQgaW50byB0aGUgc2RpZAorCSAqLworCVNDUl9SRUdfU0ZCUiAoc3NpZCwgU0NSX0FORCwgMHg4RiksCisJCTAsCisJU0NSX1RPX1JFRyAoc2RpZCksCisJCTAsCisJLyoKKwkgKiAgTG9hZCB0aGUgdGFyZ2V0IGNvbnRyb2wgYmxvY2sgYWRkcmVzcworCSAqLworCVNDUl9DT1BZICg0KSwKKwkJUEFERFJfQiAodGFyZ3RibCksCisJCVJBRERSXzEgKGRzYSksCisJU0NSX1NGQlJfUkVHIChkc2EsIFNDUl9TSEwsIDApLAorCQkwLAorCVNDUl9SRUdfUkVHIChkc2EsIFNDUl9TSEwsIDApLAorCQkwLAorCVNDUl9SRUdfUkVHIChkc2EsIFNDUl9BTkQsIDB4M2MpLAorCQkwLAorCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAoZHNhKSwKKwkJUEFERFJfQSAoX3Ntc19hNzApLAorCVNDUl9DT1BZICg0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IF9TTVNfQTcwID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQkwLAorCQlSQUREUl8xIChkc2EpLAorCS8qCisJICogIENvcHkgdGhlIFRDQiBoZWFkZXIgdG8gYSBmaXhlZCBwbGFjZSBpbiAKKwkgKiAgdGhlIEhDQi4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSXzEgKGRzYSksCisJCVBBRERSX0EgKF9zbXNfYTgwKSwKKwlTQ1JfQ09QWSAoc2l6ZW9mKHN0cnVjdCBzeW1fdGNiaCkpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgX1NNU19BODAgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJCTAsCisJCUhBRERSXzEgKHRjYl9oZWFkKSwKKwkvKgorCSAqICBXZSBleHBlY3QgTUVTU0FHRSBJTiBwaGFzZS4KKwkgKiAgSWYgbm90LCBnZXQgaGVscCBmcm9tIHRoZSBDIGNvZGUuCisJICovCisJU0NSX0lOVCBeIElGRkFMU0UgKFdIRU4gKFNDUl9NU0dfSU4pKSwKKwkJU0lSX1JFU0VMX05PX01TR19JTiwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VMRUNURUQxID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIExvYWQgdGhlIHN5bmNocm9ub3VzIHRyYW5zZmVyIHJlZ2lzdGVycy4KKwkgKi8KKwlTQ1JfQ09QWSAoMSksCisJCUhBRERSXzEgKHRjYl9oZWFkLnd2YWwpLAorCQlSQUREUl8xIChzY250bDMpLAorCVNDUl9DT1BZICgxKSwKKwkJSEFERFJfMSAodGNiX2hlYWQuc3ZhbCksCisJCVJBRERSXzEgKHN4ZmVyKSwKKwkvKgorCSAqICBHZXQgdGhlIElERU5USUZZIG1lc3NhZ2UuCisJICovCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfSU4sCisJCUhBRERSXzEgKG1zZ2luKSwKKwkvKgorCSAqICBJZiBJREVOVElGWSBMVU4gIzAsIHVzZSBhIGZhc3RlciBwYXRoIAorCSAqICB0byBmaW5kIHRoZSBMQ0Igc3RydWN0dXJlLgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChNQVNLICgweDgwLCAweGJmKSksCisJCVBBRERSX0EgKHJlc2VsX2x1bjApLAorCS8qCisJICogIElmIG1lc3NhZ2UgaXNuJ3QgYW4gSURFTlRJRlksIAorCSAqICB0ZWxsIHRoZSBDIGNvZGUgYWJvdXQuCisJICovCisJU0NSX0lOVCBeIElGRkFMU0UgKE1BU0sgKDB4ODAsIDB4ODApKSwKKwkJU0lSX1JFU0VMX05PX0lERU5USUZZLAorCS8qCisJICogIEl0IGlzIGFuIElERU5USUZZIG1lc3NhZ2UsCisJICogIExvYWQgdGhlIExVTiBjb250cm9sIGJsb2NrIGFkZHJlc3MuCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlIQUREUl8xICh0Y2JfaGVhZC5sdW50Ymxfc2EpLAorCQlSQUREUl8xIChkc2EpLAorCVNDUl9TRkJSX1JFRyAoZHNhLCBTQ1JfU0hMLCAwKSwKKwkJMCwKKwlTQ1JfUkVHX1JFRyAoZHNhLCBTQ1JfU0hMLCAwKSwKKwkJMCwKKwlTQ1JfUkVHX1JFRyAoZHNhLCBTQ1JfQU5ELCAweGZjKSwKKwkJMCwKKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSXzEgKGRzYSksCisJCVBBRERSX0EgKF9zbXNfYTkwKSwKKwlTQ1JfQ09QWSAoNCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBfU01TX0E5MCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkJMCwKKwkJUkFERFJfMSAoZHNhKSwKKwlTQ1JfSlVNUFIsCisJCTEyLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTRUxfTFVOMCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgTFVOIDAgc3BlY2lhbCBjYXNlIChidXQgdXN1YWwgb25lIDopKQorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJSEFERFJfMSAodGNiX2hlYWQubHVuMF9zYSksCisJCVJBRERSXzEgKGRzYSksCisJLyoKKwkgKiAgSnVtcCBpbmRpcmVjdGx5IHRvIHRoZSByZXNlbGVjdCBhY3Rpb24gZm9yIHRoaXMgTFVOLgorCSAqICAobGNiLmhlYWQucmVzZWxfc2EgYXNzdW1lZCBhdCBvZmZzZXQgemVybyBvZiBsY2IpLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAoZHNhKSwKKwkJUEFERFJfQSAoX3Ntc19hMTAwKSwKKwlTQ1JfQ09QWSAoNCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBfU01TX0ExMDAgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkJMCwKKwkJUkFERFJfMSAodGVtcCksCisJU0NSX1JFVFVSTiwKKwkJMCwKKwkvKiBJbiBub3JtYWwgc2l0dWF0aW9ucywgd2UganVtcCB0byBSRVNFTF9UQUcgb3IgUkVTRUxfTk9fVEFHICovCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTF9UQUcgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBBQ0sgdGhlIElERU5USUZZIHByZXZpb3VzbHkgcmVjZWl2ZWQuCisJICovCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJLyoKKwkgKiAgSXQgc2hhbGwgYmUgYSB0YWdnZWQgY29tbWFuZC4KKwkgKiAgUmVhZCBTSU1QTEUrVEFHLgorCSAqICBUaGUgQyBjb2RlIHdpbGwgZGVhbCB3aXRoIGVycm9ycy4KKwkgKiAgQWdyZXNzaXZlIG9wdGltaXphdGlvbiwgaXMnbnQgaXQ/IDopCisJICovCisJU0NSX01PVkVfQUJTICgyKSBeIFNDUl9NU0dfSU4sCisJCUhBRERSXzEgKG1zZ2luKSwKKwkvKgorCSAqICBDb3B5IHRoZSBMQ0IgaGVhZGVyIHRvIGEgZml4ZWQgcGxhY2UgaW4gCisJICogIHRoZSBIQ0IgdXNpbmcgc2VsZi1tb2RpZnlpbmcgU0NSSVBUUy4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSXzEgKGRzYSksCisJCVBBRERSX0EgKF9zbXNfYTExMCksCisJU0NSX0NPUFkgKHNpemVvZihzdHJ1Y3Qgc3ltX2xjYmgpKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IF9TTVNfQTExMCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQkwLAorCQlIQUREUl8xIChsY2JfaGVhZCksCisJLyoKKwkgKiAgTG9hZCB0aGUgcG9pbnRlciB0byB0aGUgdGFnZ2VkIHRhc2sgCisJICogIHRhYmxlIGZvciB0aGlzIExVTi4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCUhBRERSXzEgKGxjYl9oZWFkLml0bHFfdGJsX3NhKSwKKwkJUkFERFJfMSAoZHNhKSwKKwkvKgorCSAqICBUaGUgU0lETCBzdGlsbCBjb250YWlucyB0aGUgVEFHIHZhbHVlLgorCSAqICBBZ3Jlc3NpdmUgb3B0aW1pemF0aW9uLCBpc24ndCBpdD8gOik6KQorCSAqLworCVNDUl9SRUdfU0ZCUiAoc2lkbCwgU0NSX1NITCwgMCksCisJCTAsCisjaWYgU1lNX0NPTkZfTUFYX1RBU0sqNCA+IDUxMgorCVNDUl9KVU1QUiBeIElGRkFMU0UgKENBUlJZU0VUKSwKKwkJOCwKKwlTQ1JfUkVHX1JFRyAoZHNhMSwgU0NSX09SLCAyKSwKKwkJMCwKKwlTQ1JfUkVHX1JFRyAoc2ZiciwgU0NSX1NITCwgMCksCisJCTAsCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoQ0FSUllTRVQpLAorCQk4LAorCVNDUl9SRUdfUkVHIChkc2ExLCBTQ1JfT1IsIDEpLAorCQkwLAorI2VsaWYgU1lNX0NPTkZfTUFYX1RBU0sqNCA+IDI1NgorCVNDUl9KVU1QUiBeIElGRkFMU0UgKENBUlJZU0VUKSwKKwkJOCwKKwlTQ1JfUkVHX1JFRyAoZHNhMSwgU0NSX09SLCAxKSwKKwkJMCwKKyNlbmRpZgorCS8qCisJICogIFJldHJpZXZlIHRoZSBEU0Egb2YgdGhpcyB0YXNrLgorCSAqICBKVU1QIGluZGlyZWN0bHkgdG8gdGhlIHJlc3RhcnQgcG9pbnQgb2YgdGhlIENDQi4KKwkgKi8KKwlTQ1JfU0ZCUl9SRUcgKGRzYSwgU0NSX0FORCwgMHhmYyksCisJCTAsCisJU0NSX0NPUFkgKDQpLAorCQlSQUREUl8xIChkc2EpLAorCQlQQUREUl9BIChfc21zX2ExMjApLAorCVNDUl9DT1BZICg0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IF9TTVNfQTEyMCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQkwLAorCQlSQUREUl8xIChkc2EpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTRUxfR08gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NPUFkgKDQpLAorCQlSQUREUl8xIChkc2EpLAorCQlQQUREUl9BIChfc21zX2ExMzApLAorCS8qCisJICogIE1vdmUgJ2NjYi5waHlzLmhlYWQuZ28nIGFjdGlvbiB0byAKKwkgKiAgc2NyYXRjaC9zY3JhdGNoMS4gU28gc2NyYXRjaDEgd2lsbCAKKwkgKiAgY29udGFpbiB0aGUgJ3Jlc3RhcnQnIGZpZWxkIG9mIHRoZSAKKwkgKiAgJ2dvJyBzdHJ1Y3R1cmUuCisJICovCisJU0NSX0NPUFkgKDgpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgX1NNU19BMTMwID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJCTAsCisJCVBBRERSX0IgKHNjcmF0Y2gpLAorCVNDUl9DT1BZICg0KSwKKwkJUEFERFJfQiAoc2NyYXRjaDEpLCAvKiBwaHlzLmhlYWQuZ28ucmVzdGFydCAqLworCQlSQUREUl8xICh0ZW1wKSwKKwlTQ1JfUkVUVVJOLAorCQkwLAorCS8qIEluIG5vcm1hbCBzaXR1YXRpb25zIHdlIGJyYW5jaCB0byBSRVNFTF9EU0EgKi8KK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VMX0RTQSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIEFDSyB0aGUgSURFTlRJRlkgb3IgVEFHIHByZXZpb3VzbHkgcmVjZWl2ZWQuCisJICovCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTF9EU0ExID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBDb3B5IHRoZSBDQ0IgaGVhZGVyIHRvIGEgZml4ZWQgbG9jYXRpb24gCisJICogIGluIHRoZSBIQ0IgdXNpbmcgc2VsZi1tb2RpZnlpbmcgU0NSSVBUUy4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSXzEgKGRzYSksCisJCVBBRERSX0EgKF9zbXNfYTE0MCksCisJU0NSX0NPUFkgKHNpemVvZihzdHJ1Y3Qgc3ltX2NjYmgpKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IF9TTVNfQTE0MCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQkwLAorCQlIQUREUl8xIChjY2JfaGVhZCksCisJLyoKKwkgKiAgSW5pdGlhbGl6ZSB0aGUgc3RhdHVzIHJlZ2lzdGVyCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlIQUREUl8xIChjY2JfaGVhZC5zdGF0dXMpLAorCQlSQUREUl8xIChzY3IwKSwKKwkvKgorCSAqICBKdW1wIHRvIGRpc3BhdGNoZXIuCisJICovCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VMX05PX1RBRyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIENvcHkgdGhlIExDQiBoZWFkZXIgdG8gYSBmaXhlZCBwbGFjZSBpbiAKKwkgKiAgdGhlIEhDQiB1c2luZyBzZWxmLW1vZGlmeWluZyBTQ1JJUFRTLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAoZHNhKSwKKwkJUEFERFJfQSAoX3Ntc19hMTQ1KSwKKwlTQ1JfQ09QWSAoc2l6ZW9mKHN0cnVjdCBzeW1fbGNiaCkpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgX1NNU19BMTQ1ID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJCTAsCisJCUhBRERSXzEgKGxjYl9oZWFkKSwKKwkvKgorCSAqICBMb2FkIHRoZSBEU0Egd2l0aCB0aGUgdW5pcXVlIElUTCB0YXNrLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJSEFERFJfMSAobGNiX2hlYWQuaXRsX3Rhc2tfc2EpLAorCQlSQUREUl8xIChkc2EpLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChyZXNlbF9nbyksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBX0lOID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKy8qCisgKiAgQmVjYXVzZSB0aGUgc2l6ZSBkZXBlbmRzIG9uIHRoZQorICogICNkZWZpbmUgU1lNX0NPTkZfTUFYX1NHIHBhcmFtZXRlciwKKyAqICBpdCBpcyBmaWxsZWQgaW4gYXQgcnVudGltZS4KKyAqCisgKiAgIyM9PT09PT09PT09PTwgaT0wOyBpPFNZTV9DT05GX01BWF9TRyA+PT09PT09PT09CisgKiAgfHwJU0NSX0NITU9WX1RCTCBeIFNDUl9EQVRBX0lOLAorICogIHx8CQlvZmZzZXRvZiAoc3RydWN0IHN5bV9kc2IsIGRhdGFbIGldKSwKKyAqICAjIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCiswCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBX0lOMiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfQ0FMTCwKKwkJUEFERFJfQSAoZGF0YWlfZG9uZSksCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKGRhdGFfb3ZydW4pLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQV9PVVQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisvKgorICogIEJlY2F1c2UgdGhlIHNpemUgZGVwZW5kcyBvbiB0aGUKKyAqICAjZGVmaW5lIFNZTV9DT05GX01BWF9TRyBwYXJhbWV0ZXIsCisgKiAgaXQgaXMgZmlsbGVkIGluIGF0IHJ1bnRpbWUuCisgKgorICogICMjPT09PT09PT09PT08IGk9MDsgaTxTWU1fQ09ORl9NQVhfU0cgPj09PT09PT09PQorICogIHx8CVNDUl9DSE1PVl9UQkwgXiBTQ1JfREFUQV9PVVQsCisgKiAgfHwJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2RzYiwgZGF0YVsgaV0pLAorICogICMjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKzAKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfT1VUMiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9DQUxMLAorCQlQQUREUl9BIChkYXRhb19kb25lKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAoZGF0YV9vdnJ1biksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQTTBfREFUQSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBSZWFkIG91ciBob3N0IGZsYWdzIHRvIFNGQlIsIHNvIHdlIHdpbGwgYmUgYWJsZSAKKwkgKiAgdG8gY2hlY2sgYWdhaW5zdCB0aGUgZGF0YSBkaXJlY3Rpb24gd2UgZXhwZWN0LgorCSAqLworCVNDUl9GUk9NX1JFRyAoSEZfUkVHKSwKKwkJMCwKKwkvKgorCSAqICBDaGVjayBhZ2FpbnN0IGFjdHVhbCBEQVRBIFBIQVNFLgorCSAqLworCVNDUl9KVU1QIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0RBVEFfSU4pKSwKKwkJUEFERFJfQSAocG0wX2RhdGFfb3V0KSwKKwkvKgorCSAqICBBY3R1YWwgcGhhc2UgaXMgREFUQSBJTi4KKwkgKiAgQ2hlY2sgYWdhaW5zdCBleHBlY3RlZCBkaXJlY3Rpb24uCisJICovCisJU0NSX0pVTVAgXiBJRkZBTFNFIChNQVNLIChIRl9EQVRBX0lOLCBIRl9EQVRBX0lOKSksCisJCVBBRERSX0IgKGRhdGFfb3ZydW4pLAorCS8qCisJICogIEtlZXAgdHJhY2sgd2UgYXJlIG1vdmluZyBkYXRhIGZyb20gdGhlIAorCSAqICBQTTAgREFUQSBtaW5pLXNjcmlwdC4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoSEZfUkVHLCBTQ1JfT1IsIEhGX0lOX1BNMCksCisJCTAsCisJLyoKKwkgKiAgTW92ZSB0aGUgZGF0YSB0byBtZW1vcnkuCisJICovCisJU0NSX0NITU9WX1RCTCBeIFNDUl9EQVRBX0lOLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMucG0wLnNnKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAocG0wX2RhdGFfZW5kKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBNMF9EQVRBX09VVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIEFjdHVhbCBwaGFzZSBpcyBEQVRBIE9VVC4KKwkgKiAgQ2hlY2sgYWdhaW5zdCBleHBlY3RlZCBkaXJlY3Rpb24uCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKE1BU0sgKEhGX0RBVEFfSU4sIEhGX0RBVEFfSU4pKSwKKwkJUEFERFJfQiAoZGF0YV9vdnJ1biksCisJLyoKKwkgKiAgS2VlcCB0cmFjayB3ZSBhcmUgbW92aW5nIGRhdGEgZnJvbSB0aGUgCisJICogIFBNMCBEQVRBIG1pbmktc2NyaXB0LgorCSAqLworCVNDUl9SRUdfUkVHIChIRl9SRUcsIFNDUl9PUiwgSEZfSU5fUE0wKSwKKwkJMCwKKwkvKgorCSAqICBNb3ZlIHRoZSBkYXRhIGZyb20gbWVtb3J5LgorCSAqLworCVNDUl9DSE1PVl9UQkwgXiBTQ1JfREFUQV9PVVQsCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5wbTAuc2cpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUE0wX0RBVEFfRU5EID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQ2xlYXIgdGhlIGZsYWcgdGhhdCB0b2xkIHdlIHdlcmUgbW92aW5nICAKKwkgKiAgZGF0YSBmcm9tIHRoZSBQTTAgREFUQSBtaW5pLXNjcmlwdC4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoSEZfUkVHLCBTQ1JfQU5ELCAofkhGX0lOX1BNMCkpLAorCQkwLAorCS8qCisJICogIFJldHVybiB0byB0aGUgcHJldmlvdXMgREFUQSBzY3JpcHQgd2hpY2ggCisJICogIGlzIGd1YXJhbnRlZWQgYnkgZGVzaWduIChpZiBubyBidWcpIHRvIGJlIAorCSAqICB0aGUgbWFpbiBEQVRBIHNjcmlwdCBmb3IgdGhpcyB0cmFuc2Zlci4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSXzEgKGRzYSksCisJCVJBRERSXzEgKHNjcmF0Y2hhKSwKKwlTQ1JfUkVHX1JFRyAoc2NyYXRjaGEsIFNDUl9BREQsIG9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYixwaHlzLnBtMC5yZXQpKSwKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBNX0RBVEFfRU5EID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAoc2NyYXRjaGEpLAorCQlQQUREUl9BIChfc21zX2ExNTApLAorCVNDUl9DT1BZICg0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IF9TTVNfQTE1MCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQkwLAorCQlSQUREUl8xICh0ZW1wKSwKKwlTQ1JfUkVUVVJOLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUE0xX0RBVEEgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgUmVhZCBvdXIgaG9zdCBmbGFncyB0byBTRkJSLCBzbyB3ZSB3aWxsIGJlIGFibGUgCisJICogIHRvIGNoZWNrIGFnYWluc3QgdGhlIGRhdGEgZGlyZWN0aW9uIHdlIGV4cGVjdC4KKwkgKi8KKwlTQ1JfRlJPTV9SRUcgKEhGX1JFRyksCisJCTAsCisJLyoKKwkgKiAgQ2hlY2sgYWdhaW5zdCBhY3R1YWwgREFUQSBQSEFTRS4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGRkFMU0UgKFdIRU4gKFNDUl9EQVRBX0lOKSksCisJCVBBRERSX0EgKHBtMV9kYXRhX291dCksCisJLyoKKwkgKiAgQWN0dWFsIHBoYXNlIGlzIERBVEEgSU4uCisJICogIENoZWNrIGFnYWluc3QgZXhwZWN0ZWQgZGlyZWN0aW9uLgorCSAqLworCVNDUl9KVU1QIF4gSUZGQUxTRSAoTUFTSyAoSEZfREFUQV9JTiwgSEZfREFUQV9JTikpLAorCQlQQUREUl9CIChkYXRhX292cnVuKSwKKwkvKgorCSAqICBLZWVwIHRyYWNrIHdlIGFyZSBtb3ZpbmcgZGF0YSBmcm9tIHRoZSAKKwkgKiAgUE0xIERBVEEgbWluaS1zY3JpcHQuCisJICovCisJU0NSX1JFR19SRUcgKEhGX1JFRywgU0NSX09SLCBIRl9JTl9QTTEpLAorCQkwLAorCS8qCisJICogIE1vdmUgdGhlIGRhdGEgdG8gbWVtb3J5LgorCSAqLworCVNDUl9DSE1PVl9UQkwgXiBTQ1JfREFUQV9JTiwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLnBtMS5zZyksCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKHBtMV9kYXRhX2VuZCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQTTFfREFUQV9PVVQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBBY3R1YWwgcGhhc2UgaXMgREFUQSBPVVQuCisJICogIENoZWNrIGFnYWluc3QgZXhwZWN0ZWQgZGlyZWN0aW9uLgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChNQVNLIChIRl9EQVRBX0lOLCBIRl9EQVRBX0lOKSksCisJCVBBRERSX0IgKGRhdGFfb3ZydW4pLAorCS8qCisJICogIEtlZXAgdHJhY2sgd2UgYXJlIG1vdmluZyBkYXRhIGZyb20gdGhlIAorCSAqICBQTTEgREFUQSBtaW5pLXNjcmlwdC4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoSEZfUkVHLCBTQ1JfT1IsIEhGX0lOX1BNMSksCisJCTAsCisJLyoKKwkgKiAgTW92ZSB0aGUgZGF0YSBmcm9tIG1lbW9yeS4KKwkgKi8KKwlTQ1JfQ0hNT1ZfVEJMIF4gU0NSX0RBVEFfT1VULAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMucG0xLnNnKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBNMV9EQVRBX0VORCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIENsZWFyIHRoZSBmbGFnIHRoYXQgdG9sZCB3ZSB3ZXJlIG1vdmluZyAgCisJICogIGRhdGEgZnJvbSB0aGUgUE0xIERBVEEgbWluaS1zY3JpcHQuCisJICovCisJU0NSX1JFR19SRUcgKEhGX1JFRywgU0NSX0FORCwgKH5IRl9JTl9QTTEpKSwKKwkJMCwKKwkvKgorCSAqICBSZXR1cm4gdG8gdGhlIHByZXZpb3VzIERBVEEgc2NyaXB0IHdoaWNoIAorCSAqICBpcyBndWFyYW50ZWVkIGJ5IGRlc2lnbiAoaWYgbm8gYnVnKSB0byBiZSAKKwkgKiAgdGhlIG1haW4gREFUQSBzY3JpcHQgZm9yIHRoaXMgdHJhbnNmZXIuCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlSQUREUl8xIChkc2EpLAorCQlSQUREUl8xIChzY3JhdGNoYSksCisJU0NSX1JFR19SRUcgKHNjcmF0Y2hhLCBTQ1JfQURELCBvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IscGh5cy5wbTEucmV0KSksCisJCTAsCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKHBtX2RhdGFfZW5kKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgU1lNX0ZXQl9TQ1IgU1lNX0ZXQl9TQ1IgPSB7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE5PX0RBVEEgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8geworCVNDUl9KVU1QLAorCQlQQUREUl9CIChkYXRhX292cnVuKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTF9GT1JfQUJPUlQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFdlIGFyZSBqdW1wZWQgaGVyZSBieSB0aGUgQyBjb2RlLCBpZiB3ZSBoYXZlIAorCSAqICBzb21lIHRhcmdldCB0byByZXNldCBvciBzb21lIGRpc2Nvbm5lY3RlZCAKKwkgKiAgam9iIHRvIGFib3J0LiBTaW5jZSBlcnJvciByZWNvdmVyeSBpcyBhIHNlcmlvdXMgCisJICogIGJ1c3luZXNzLCB3ZSB3aWxsIHJlYWxseSByZXNldCB0aGUgU0NTSSBCVVMsIGlmIAorCSAqICBjYXNlIG9mIGEgU0NTSSBpbnRlcnJ1cHQgb2NjdXJyaW5nIGluIHRoaXMgcGF0aC4KKwkgKi8KKworI2lmZGVmIFNZTV9DT05GX1RBUkdFVF9ST0xFX1NVUFBPUlQKKwkvKgorCSAqICBTZXQgaW5pdGlhdG9yIG1vZGUuCisJICovCisJU0NSX0NMUiAoU0NSX1RSRyksCisJCTAsCisjZW5kaWYKKwkvKgorCSAqICAgICAgQW5kIHRyeSB0byBzZWxlY3QgdGhpcyB0YXJnZXQuCisJICovCisJU0NSX1NFTF9UQkxfQVROIF4gb2Zmc2V0b2YgKHN0cnVjdCBzeW1faGNiLCBhYnJ0X3NlbCksCisJCVBBRERSX0EgKHJlc2VsZWN0KSwKKwkvKgorCSAqICBXYWl0IGZvciB0aGUgc2VsZWN0aW9uIHRvIGNvbXBsZXRlIG9yIAorCSAqICB0aGUgc2VsZWN0aW9uIHRvIHRpbWUgb3V0LgorCSAqLworCVNDUl9KVU1QUiBeIElGRkFMU0UgKFdIRU4gKFNDUl9NU0dfT1VUKSksCisJCS04LAorCS8qCisJICogIENhbGwgdGhlIEMgY29kZS4KKwkgKi8KKwlTQ1JfSU5ULAorCQlTSVJfVEFSR0VUX1NFTEVDVEVELAorCS8qCisJICogIFRoZSBDIGNvZGUgc2hvdWxkIGxldCB1cyBjb250aW51ZSBoZXJlLiAKKwkgKiAgU2VuZCB0aGUgJ2tpc3Mgb2YgZGVhdGgnIG1lc3NhZ2UuCisJICogIFdlIGV4cGVjdCBhbiBpbW1lZGlhdGUgZGlzY29ubmVjdCBvbmNlIAorCSAqICB0aGUgdGFyZ2V0IGhhcyBlYXRlbiB0aGUgbWVzc2FnZS4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoc2NudGwyLCBTQ1JfQU5ELCAweDdmKSwKKwkJMCwKKwlTQ1JfTU9WRV9UQkwgXiBTQ1JfTVNHX09VVCwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1faGNiLCBhYnJ0X3RibCksCisJU0NSX0NMUiAoU0NSX0FDS3xTQ1JfQVROKSwKKwkJMCwKKwlTQ1JfV0FJVF9ESVNDLAorCQkwLAorCS8qCisJICogIFRlbGwgdGhlIEMgY29kZSB0aGF0IHdlIGFyZSBkb25lLgorCSAqLworCVNDUl9JTlQsCisJCVNJUl9BQk9SVF9TRU5ULAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0VMX0ZPUl9BQk9SVF8xID4tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgSnVtcCBhdCBzY2hlZHVsZXIuCisJICovCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKHN0YXJ0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE1TR19JTl9FVEMgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIElmIGl0IGlzIGFuIEVYVEVOREVEICh2YXJpYWJsZSBzaXplIG1lc3NhZ2UpCisJICogIEhhbmRsZSBpdC4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoTV9FWFRFTkRFRCkpLAorCQlQQUREUl9CIChtc2dfZXh0ZW5kZWQpLAorCS8qCisJICogIExldCB0aGUgQyBjb2RlIGhhbmRsZSBhbnkgb3RoZXIgCisJICogIDEgYnl0ZSBtZXNzYWdlLgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChNQVNLICgweDAwLCAweGYwKSksCisJCVBBRERSX0IgKG1zZ19yZWNlaXZlZCksCisJU0NSX0pVTVAgXiBJRlRSVUUgKE1BU0sgKDB4MTAsIDB4ZjApKSwKKwkJUEFERFJfQiAobXNnX3JlY2VpdmVkKSwKKwkvKgorCSAqICBXZSBkb25ub3QgaGFuZGxlIDIgYnl0ZXMgbWVzc2FnZXMgZnJvbSBTQ1JJUFRTLgorCSAqICBTbywgbGV0IHRoZSBDIGNvZGUgZGVhbCB3aXRoIHRoZXNlIG9uZXMgdG9vLgorCSAqLworCVNDUl9KVU1QIF4gSUZGQUxTRSAoTUFTSyAoMHgyMCwgMHhmMCkpLAorCQlQQUREUl9CIChtc2dfd2VpcmRfc2VlbiksCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfSU4sCisJCUhBRERSXzEgKG1zZ2luWzFdKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE1TR19SRUNFSVZFRCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9DT1BZICg0KSwJCQkvKiBEVU1NWSBSRUFEICovCisJCUhBRERSXzEgKHNjcmF0Y2gpLAorCQlSQUREUl8xIChzY3JhdGNoYSksCisJU0NSX0lOVCwKKwkJU0lSX01TR19SRUNFSVZFRCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE1TR19XRUlSRF9TRUVOID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9DT1BZICg0KSwJCQkvKiBEVU1NWSBSRUFEICovCisJCUhBRERSXzEgKHNjcmF0Y2gpLAorCQlSQUREUl8xIChzY3JhdGNoYSksCisJU0NSX0lOVCwKKwkJU0lSX01TR19XRUlSRCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE1TR19FWFRFTkRFRCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIENsZWFyIEFDSyBhbmQgZ2V0IHRoZSBuZXh0IGJ5dGUgCisJICogIGFzc3VtZWQgdG8gYmUgdGhlIG1lc3NhZ2UgbGVuZ3RoLgorCSAqLworCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfTVNHX0lOLAorCQlIQUREUl8xIChtc2dpblsxXSksCisJLyoKKwkgKiAgVHJ5IHRvIGNhdGNoIHNvbWUgdW5saWtlbHkgc2l0dWF0aW9ucyBhcyAwIGxlbmd0aCAKKwkgKiAgb3IgdG9vIGxhcmdlIHRoZSBsZW5ndGguCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKDApKSwKKwkJUEFERFJfQiAobXNnX3dlaXJkX3NlZW4pLAorCVNDUl9UT19SRUcgKHNjcmF0Y2hhKSwKKwkJMCwKKwlTQ1JfUkVHX1JFRyAoc2ZiciwgU0NSX0FERCwgKDI1Ni04KSksCisJCTAsCisJU0NSX0pVTVAgXiBJRlRSVUUgKENBUlJZU0VUKSwKKwkJUEFERFJfQiAobXNnX3dlaXJkX3NlZW4pLAorCS8qCisJICogIFdlIGRvbm5vdCBoYW5kbGUgZXh0ZW5kZWQgbWVzc2FnZXMgZnJvbSBTQ1JJUFRTLgorCSAqICBSZWFkIHRoZSBhbW91bnQgb2YgZGF0YSBjb3JyZXBvbmRpbmcgdG8gdGhlIAorCSAqICBtZXNzYWdlIGxlbmd0aCBhbmQgY2FsbCB0aGUgQyBjb2RlLgorCSAqLworCVNDUl9DT1BZICgxKSwKKwkJUkFERFJfMSAoc2NyYXRjaGEpLAorCQlQQUREUl9CIChfc21zX2IxMCksCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBfU01TX0IxMCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfTU9WRV9BQlMgKDApIF4gU0NSX01TR19JTiwKKwkJSEFERFJfMSAobXNnaW5bMl0pLAorCVNDUl9KVU1QLAorCQlQQUREUl9CIChtc2dfcmVjZWl2ZWQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX0JBRCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgdW5pbXBsZW1lbnRlZCBtZXNzYWdlIC0gcmVqZWN0IGl0LgorCSAqLworCVNDUl9JTlQsCisJCVNJUl9SRUpFQ1RfVE9fU0VORCwKKwlTQ1JfU0VUIChTQ1JfQVROKSwKKwkJMCwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoY2xyYWNrKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE1TR19XRUlSRCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIHdlaXJkIG1lc3NhZ2UgcmVjZWl2ZWQKKwkgKiAgaWdub3JlIGFsbCBNU0cgSU4gcGhhc2VzIGFuZCByZWplY3QgaXQuCisJICovCisJU0NSX0lOVCwKKwkJU0lSX1JFSkVDVF9UT19TRU5ELAorCVNDUl9TRVQgKFNDUl9BVE4pLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX1dFSVJEMSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX0lOKSksCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19JTiwKKwkJSEFERFJfMSAoc2NyYXRjaCksCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKG1zZ193ZWlyZDEpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgV0RUUl9SRVNQID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgbGV0IHRoZSB0YXJnZXQgZmV0Y2ggb3VyIGFuc3dlci4KKwkgKi8KKwlTQ1JfU0VUIChTQ1JfQVROKSwKKwkJMCwKKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGRkFMU0UgKFdIRU4gKFNDUl9NU0dfT1VUKSksCisJCVBBRERSX0IgKG5lZ29fYmFkX3BoYXNlKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTkRfV0RUUiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFNlbmQgdGhlIE1fWF9XSURFX1JFUQorCSAqLworCVNDUl9NT1ZFX0FCUyAoNCkgXiBTQ1JfTVNHX09VVCwKKwkJSEFERFJfMSAobXNnb3V0KSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAobXNnX291dF9kb25lKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNEVFJfUkVTUCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIGxldCB0aGUgdGFyZ2V0IGZldGNoIG91ciBhbnN3ZXIuCisJICovCisJU0NSX1NFVCAoU0NSX0FUTiksCisJCTAsCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX09VVCkpLAorCQlQQUREUl9CIChuZWdvX2JhZF9waGFzZSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTRU5EX1NEVFIgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBTZW5kIHRoZSBNX1hfU1lOQ19SRVEKKwkgKi8KKwlTQ1JfTU9WRV9BQlMgKDUpIF4gU0NSX01TR19PVVQsCisJCUhBRERSXzEgKG1zZ291dCksCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKG1zZ19vdXRfZG9uZSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQUFJfUkVTUCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBsZXQgdGhlIHRhcmdldCBmZXRjaCBvdXIgYW5zd2VyLgorCSAqLworCVNDUl9TRVQgKFNDUl9BVE4pLAorCQkwLAorCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9KVU1QIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19PVVQpKSwKKwkJUEFERFJfQiAobmVnb19iYWRfcGhhc2UpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0VORF9QUFIgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgU2VuZCB0aGUgTV9YX1BQUl9SRVEKKwkgKi8KKwlTQ1JfTU9WRV9BQlMgKDgpIF4gU0NSX01TR19PVVQsCisJCUhBRERSXzEgKG1zZ291dCksCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKG1zZ19vdXRfZG9uZSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBORUdPX0JBRF9QSEFTRSA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfSU5ULAorCQlTSVJfTkVHT19QUk9UTywKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX09VVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgVGhlIHRhcmdldCByZXF1ZXN0cyBhIG1lc3NhZ2UuCisJICogIFdlIGRvbm5vdCBzZW5kIG1lc3NhZ2VzIHRoYXQgbWF5IAorCSAqICByZXF1aXJlIHRoZSBkZXZpY2UgdG8gZ28gdG8gYnVzIGZyZWUuCisJICovCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfT1VULAorCQlIQUREUl8xIChtc2dvdXQpLAorCS8qCisJICogIC4uLiB3YWl0IGZvciB0aGUgbmV4dCBwaGFzZQorCSAqICBpZiBpdCdzIGEgbWVzc2FnZSBvdXQsIHNlbmQgaXQgYWdhaW4sIC4uLgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChXSEVOIChTQ1JfTVNHX09VVCkpLAorCQlQQUREUl9CIChtc2dfb3V0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE1TR19PVVRfRE9ORSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIExldCB0aGUgQyBjb2RlIGJlIGF3YXJlIG9mIHRoZSAKKwkgKiAgc2VudCBtZXNzYWdlIGFuZCBjbGVhciB0aGUgbWVzc2FnZS4KKwkgKi8KKwlTQ1JfSU5ULAorCQlTSVJfTVNHX09VVF9ET05FLAorCS8qCisJICogIC4uLiBhbmQgcHJvY2VzcyB0aGUgbmV4dCBwaGFzZQorCSAqLworCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBX09WUlVOID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBaZXJvIHNjcmF0Y2hhIHRoYXQgd2lsbCBjb3VudCB0aGUgCisJICogIGV4dHJhcyBieXRlcy4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCVBBRERSX0IgKHplcm8pLAorCQlSQUREUl8xIChzY3JhdGNoYSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBX09WUlVOMSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBUaGUgdGFyZ2V0IG1heSB3YW50IHRvIHRyYW5zZmVyIHRvbyBtdWNoIGRhdGEuCisJICoKKwkgKiAgSWYgcGhhc2UgaXMgREFUQSBPVVQgd3JpdGUgMSBieXRlIGFuZCBjb3VudCBpdC4KKwkgKi8KKwlTQ1JfSlVNUFIgXiBJRkZBTFNFIChXSEVOIChTQ1JfREFUQV9PVVQpKSwKKwkJMTYsCisJU0NSX0NITU9WX0FCUyAoMSkgXiBTQ1JfREFUQV9PVVQsCisJCUhBRERSXzEgKHNjcmF0Y2gpLAorCVNDUl9KVU1QLAorCQlQQUREUl9CIChkYXRhX292cnVuMiksCisJLyoKKwkgKiAgSWYgV1NSIGlzIHNldCwgY2xlYXIgdGhpcyBjb25kaXRpb24sIGFuZCAKKwkgKiAgY291bnQgdGhpcyBieXRlLgorCSAqLworCVNDUl9GUk9NX1JFRyAoc2NudGwyKSwKKwkJMCwKKwlTQ1JfSlVNUFIgXiBJRkZBTFNFIChNQVNLIChXU1IsIFdTUikpLAorCQkxNiwKKwlTQ1JfUkVHX1JFRyAoc2NudGwyLCBTQ1JfT1IsIFdTUiksCisJCTAsCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKGRhdGFfb3ZydW4yKSwKKwkvKgorCSAqICBGaW5hbGx5IGNoZWNrIGFnYWluc3QgREFUQSBJTiBwaGFzZS4KKwkgKiAgU2lnbmFsIGRhdGEgb3ZlcnJ1biB0byB0aGUgQyBjb2RlIAorCSAqICBhbmQganVtcCB0byBkaXNwYXRjaGVyIGlmIG5vdCBzby4KKwkgKiAgUmVhZCAxIGJ5dGUgb3RoZXJ3aXNlIGFuZCBjb3VudCBpdC4KKwkgKi8KKwlTQ1JfSlVNUFIgXiBJRlRSVUUgKFdIRU4gKFNDUl9EQVRBX0lOKSksCisJCTE2LAorCVNDUl9JTlQsCisJCVNJUl9EQVRBX09WRVJSVU4sCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKKwlTQ1JfQ0hNT1ZfQUJTICgxKSBeIFNDUl9EQVRBX0lOLAorCQlIQUREUl8xIChzY3JhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfT1ZSVU4yID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIENvdW50IHRoaXMgYnl0ZS4KKwkgKiAgVGhpcyB3aWxsIGFsbG93IHRvIHJldHVybiBhIG5lZ2F0aXZlIAorCSAqICByZXNpZHVhbCB0byB1c2VyLgorCSAqLworCVNDUl9SRUdfUkVHIChzY3JhdGNoYSwgIFNDUl9BREQsICAweDAxKSwKKwkJMCwKKwlTQ1JfUkVHX1JFRyAoc2NyYXRjaGExLCBTQ1JfQUREQywgMCksCisJCTAsCisJU0NSX1JFR19SRUcgKHNjcmF0Y2hhMiwgU0NSX0FEREMsIDApLAorCQkwLAorCS8qCisJICogIC4uIGFuZCByZXBlYXQgYXMgcmVxdWlyZWQuCisJICovCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKGRhdGFfb3ZydW4xKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEFCT1JUX1JFU0VMID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9TRVQgKFNDUl9BVE4pLAorCQkwLAorCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCS8qCisJICogIHNlbmQgdGhlIGFib3J0L2Fib3J0YWcvcmVzZXQgbWVzc2FnZQorCSAqICB3ZSBleHBlY3QgYW4gaW1tZWRpYXRlIGRpc2Nvbm5lY3QKKwkgKi8KKwlTQ1JfUkVHX1JFRyAoc2NudGwyLCBTQ1JfQU5ELCAweDdmKSwKKwkJMCwKKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19PVVQsCisJCUhBRERSXzEgKG1zZ291dCksCisJU0NSX0NMUiAoU0NSX0FDS3xTQ1JfQVROKSwKKwkJMCwKKwlTQ1JfV0FJVF9ESVNDLAorCQkwLAorCVNDUl9JTlQsCisJCVNJUl9SRVNFTF9BQk9SVEVELAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChzdGFydCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTkRfSURFTlQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBUaGUgdGFyZ2V0IHN0YXlzIGluIE1TRyBPVVQgcGhhc2UgYWZ0ZXIgaGF2aW5nIGFja2VkIAorCSAqICBJZGVudGlmeSBbKyBUYWcgWysgRXh0ZW5kZWQgbWVzc2FnZSBdXS4gVGFyZ2V0cyBzaGFsbAorCSAqICBiZWhhdmUgdGhpcyB3YXkgb24gcGFyaXR5IGVycm9yLgorCSAqICBXZSBtdXN0IHNlbmQgaXQgYWdhaW4gYWxsIHRoZSBtZXNzYWdlcy4KKwkgKi8KKwlTQ1JfU0VUIChTQ1JfQVROKSwgLyogU2hhbGwgYmUgYXNzZXJ0ZWQgMiBkZXNrZXcgZGVsYXlzIGJlZm9yZSB0aGUgICovCisJCTAsICAgICAgICAgLyogMXJzdCBBQ0sgPSA5MCBucy4gSG9wZSB0aGUgY2hpcCBpc24ndCB0b28gZmFzdCAqLworCVNDUl9KVU1QLAorCQlQQUREUl9BIChzZW5kX2lkZW50KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IElERU5UX0JSRUFLID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9DTFIgKFNDUl9BVE4pLAorCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChzZWxlY3QyKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IElERU5UX0JSRUFLX0FUTiA+LS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9TRVQgKFNDUl9BVE4pLAorCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChzZWxlY3QyKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNEQVRBX0lOID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9DSE1PVl9UQkwgXiBTQ1JfREFUQV9JTiwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fZHNiLCBzZW5zZSksCisJU0NSX0NBTEwsCisJCVBBRERSX0EgKGRhdGFpX2RvbmUpLAorCVNDUl9KVU1QLAorCQlQQUREUl9CIChkYXRhX292cnVuKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VMX0JBRF9MVU4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIE1lc3NhZ2UgaXMgYW4gSURFTlRJRlksIGJ1dCBsdW4gaXMgdW5rbm93bi4KKwkgKiAgU2lnbmFsIHByb2JsZW0gdG8gQyBjb2RlIGZvciBsb2dnaW5nIHRoZSBldmVudC4KKwkgKiAgU2VuZCBhIE1fQUJPUlQgdG8gY2xlYXIgYWxsIHBlbmRpbmcgdGFza3MuCisJICovCisJU0NSX0lOVCwKKwkJU0lSX1JFU0VMX0JBRF9MVU4sCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKGFib3J0X3Jlc2VsKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEJBRF9JX1RfTCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFdlIGRvbm5vdCBoYXZlIGEgdGFzayBmb3IgdGhhdCBJX1RfTC4KKwkgKiAgU2lnbmFsIHByb2JsZW0gdG8gQyBjb2RlIGZvciBsb2dnaW5nIHRoZSBldmVudC4KKwkgKiAgU2VuZCBhIE1fQUJPUlQgbWVzc2FnZS4KKwkgKi8KKwlTQ1JfSU5ULAorCQlTSVJfUkVTRUxfQkFEX0lfVF9MLAorCVNDUl9KVU1QLAorCQlQQUREUl9CIChhYm9ydF9yZXNlbCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBCQURfSV9UX0xfUSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBXZSBkb25ub3QgaGF2ZSBhIHRhc2sgdGhhdCBtYXRjaGVzIHRoZSB0YWcuCisJICogIFNpZ25hbCBwcm9ibGVtIHRvIEMgY29kZSBmb3IgbG9nZ2luZyB0aGUgZXZlbnQuCisJICogIFNlbmQgYSBNX0FCT1JUVEFHIG1lc3NhZ2UuCisJICovCisJU0NSX0lOVCwKKwkJU0lSX1JFU0VMX0JBRF9JX1RfTF9RLAorCVNDUl9KVU1QLAorCQlQQUREUl9CIChhYm9ydF9yZXNlbCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBCQURfU1RBVFVTID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBBbnl0aGluZyBkaWZmZXJlbnQgZnJvbSBJTlRFUk1FRElBVEUgCisJICogIENPTkRJVElPTiBNRVQgc2hvdWxkIGJlIGEgYmFkIFNDU0kgc3RhdHVzLCAKKwkgKiAgZ2l2ZW4gdGhhdCBHT09EIHN0YXR1cyBoYXMgYWxyZWFkeSBiZWVuIHRlc3RlZC4KKwkgKiAgQ2FsbCB0aGUgQyBjb2RlLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJUEFERFJfQiAoc3RhcnRwb3MpLAorCQlSQUREUl8xIChzY3JhdGNoYSksCisJU0NSX0lOVCBeIElGRkFMU0UgKERBVEEgKFNfQ09ORF9NRVQpKSwKKwkJU0lSX0JBRF9TQ1NJX1NUQVRVUywKKwlTQ1JfUkVUVVJOLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgV1NSX01BX0hFTFBFUiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgSGVscGVyIGZvciB0aGUgQyBjb2RlIHdoZW4gV1NSIGJpdCBpcyBzZXQuCisJICogIFBlcmZvcm0gdGhlIG1vdmUgb2YgdGhlIHJlc2lkdWFsIGJ5dGUuCisJICovCisJU0NSX0NITU9WX1RCTCBeIFNDUl9EQVRBX0lOLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMud3Jlc2lkKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorCisjaWZkZWYgU1lNX09QVF9IQU5ETEVfRElSX1VOS05PV04KK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfSU8gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFdlIGp1bXAgaGVyZSBpZiB0aGUgZGF0YSBkaXJlY3Rpb24gd2FzIHVua25vd24gYXQgdGhlIAorCSAqICB0aW1lIHdlIGhhZCB0byBxdWV1ZSB0aGUgY29tbWFuZCB0byB0aGUgc2NyaXB0cyBwcm9jZXNzb3IuCisJICogIFBvaW50ZXJzIGhhZCBiZWVuIHNldCBhcyBmb2xsb3cgaW4gdGhpcyBzaXR1YXRpb246CisJICogICAgc2F2ZXAgICAtLT4gICBEQVRBX0lPCisJICogICAgbGFzdHAgICAtLT4gICBzdGFydCBwb2ludGVyIHdoZW4gREFUQV9JTgorCSAqICAgIHdsYXN0cCAgLS0+ICAgc3RhcnQgcG9pbnRlciB3aGVuIERBVEFfT1VUCisJICogIFRoaXMgc2NyaXB0IHNldHMgc2F2ZXAgYW5kIGxhc3RwIGFjY29yZGluZyB0byB0aGUgCisJICogIGRpcmVjdGlvbiBjaG9zZW4gYnkgdGhlIHRhcmdldC4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoV0hFTiAoU0NSX0RBVEFfT1VUKSksCisJCVBBRERSX0IgKGRhdGFfaW9fb3V0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfSU9fQ09NID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIERpcmVjdGlvbiBpcyBEQVRBIElOLgorCSAqLworCVNDUl9DT1BZICAoNCksCisJCUhBRERSXzEgKGNjYl9oZWFkLmxhc3RwKSwKKwkJSEFERFJfMSAoY2NiX2hlYWQuc2F2ZXApLAorCS8qCisJICogIEp1bXAgdG8gdGhlIFNDUklQVFMgYWNjb3JkaW5nIHRvIGFjdHVhbCBkaXJlY3Rpb24uCisJICovCisJU0NSX0NPUFkgICg0KSwKKwkJSEFERFJfMSAoY2NiX2hlYWQuc2F2ZXApLAorCQlSQUREUl8xICh0ZW1wKSwKKwlTQ1JfUkVUVVJOLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQV9JT19PVVQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgRGlyZWN0aW9uIGlzIERBVEEgT1VULgorCSAqLworCVNDUl9SRUdfUkVHIChIRl9SRUcsIFNDUl9BTkQsICh+SEZfREFUQV9JTikpLAorCQkwLAorCVNDUl9DT1BZICAoNCksCisJCUhBRERSXzEgKGNjYl9oZWFkLndsYXN0cCksCisJCUhBRERSXzEgKGNjYl9oZWFkLmxhc3RwKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQihkYXRhX2lvX2NvbSksCisjZW5kaWYgLyogU1lNX09QVF9IQU5ETEVfRElSX1VOS05PV04gKi8KKworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgWkVSTyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0RBVEFfWkVSTywKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNDUkFUQ0ggPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9EQVRBX1pFUk8sIC8qIE1VU1QgQkUgQkVGT1JFIFNDUkFUQ0gxICovCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTQ1JBVENIMSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfREFUQV9aRVJPLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUFJFVl9ET05FID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0RBVEFfWkVSTywgLyogTVVTVCBCRSBCRUZPUkUgRE9ORV9QT1MgISAqLworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgRE9ORV9QT1MgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0RBVEFfWkVSTywKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE5FWFRKT0IgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9EQVRBX1pFUk8sIC8qIE1VU1QgQkUgQkVGT1JFIFNUQVJUUE9TICEgKi8KK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNUQVJUUE9TID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9EQVRBX1pFUk8sCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBUQVJHVEJMID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfREFUQV9aRVJPLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08Pi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworfTsKKworc3RhdGljIHN0cnVjdCBTWU1fRldaX1NDUiBTWU1fRldaX1NDUiA9IHsKKyAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNOT09QVEVTVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi97CisJLyoKKwkgKiAgUmVhZCB0aGUgdmFyaWFibGUuCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlIQUREUl8xIChzY3JhdGNoKSwKKwkJUkFERFJfMSAoc2NyYXRjaGEpLAorCS8qCisJICogIFdyaXRlIHRoZSB2YXJpYWJsZS4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSXzEgKHRlbXApLAorCQlIQUREUl8xIChzY3JhdGNoKSwKKwkvKgorCSAqICBSZWFkIGJhY2sgdGhlIHZhcmlhYmxlLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJSEFERFJfMSAoc2NyYXRjaCksCisJCVJBRERSXzEgKHRlbXApLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU05PT1BFTkQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQW5kIHN0b3AuCisJICovCisJU0NSX0lOVCwKKwkJOTksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTw+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9mdzIuaCBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fZncyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VhNzE1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fZncyLmgKQEAgLTAsMCArMSwxOTI3IEBACisvKgorICogRGV2aWNlIGRyaXZlciBmb3IgdGhlIFNZTUJJT1MvTFNJTE9HSUMgNTNDOFhYIGFuZCA1M0MxMDEwIGZhbWlseSAKKyAqIG9mIFBDSS1TQ1NJIElPIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgIEdlcmFyZCBSb3VkaWVyIDxncm91ZGllckBmcmVlLmZyPgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGRlcml2ZWQgZnJvbSB0aGUgTGludXggc3ltNTNjOHh4IGRyaXZlci4KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAwICBHZXJhcmQgUm91ZGllcgorICoKKyAqIFRoZSBzeW01M2M4eHggZHJpdmVyIGlzIGRlcml2ZWQgZnJvbSB0aGUgbmNyNTNjOHh4IGRyaXZlciB0aGF0IGhhZCBiZWVuIAorICogYSBwb3J0IG9mIHRoZSBGcmVlQlNEIG5jciBkcml2ZXIgdG8gTGludXgtMS4yLjEzLgorICoKKyAqIFRoZSBvcmlnaW5hbCBuY3IgZHJpdmVyIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIDM4NmJzZCBhbmQgRnJlZUJTRCBieQorICogICAgICAgICBXb2xmZ2FuZyBTdGFuZ2xtZWllciAgICAgICAgPHdvbGZAY29sb2duZS5kZT4KKyAqICAgICAgICAgU3RlZmFuIEVzc2VyICAgICAgICAgICAgICAgIDxzZUBtaS5VbmktS29lbG4uZGU+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTQgIFdvbGZnYW5nIFN0YW5nbG1laWVyCisgKgorICogT3RoZXIgbWFqb3IgY29udHJpYnV0aW9uczoKKyAqCisgKiBOVlJBTSBkZXRlY3Rpb24gYW5kIHJlYWRpbmcuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgUmljaGFyZCBXYWx0aGFtIDxkb3Jtb3VzZUBmYXJzcm9idC5kZW1vbi5jby51az4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKy8qCisgKiAgU2NyaXB0cyBmb3IgU1lNQklPUy1Qcm9jZXNzb3IKKyAqCisgKiAgV2UgaGF2ZSB0byBrbm93IHRoZSBvZmZzZXRzIG9mIGFsbCBsYWJlbHMgYmVmb3JlIHdlIHJlYWNoIAorICogIHRoZW0gKGZvciBmb3J3YXJkIGp1bXBzKS4gVGhlcmVmb3JlIHdlIGRlY2xhcmUgYSBzdHJ1Y3QgCisgKiAgaGVyZS4gSWYgeW91IG1ha2UgY2hhbmdlcyBpbnNpZGUgdGhlIHNjcmlwdCwKKyAqCisgKiAgRE9OVCBGT1JHRVQgVE8gQ0hBTkdFIFRIRSBMRU5HVEhTIEhFUkUhCisgKi8KKworLyoKKyAqICBTY3JpcHQgZnJhZ21lbnRzIHdoaWNoIGFyZSBsb2FkZWQgaW50byB0aGUgb24tY2hpcCBSQU0gCisgKiAgb2YgODI1QSwgODc1LCA4NzYsIDg5NSwgODk1QSwgODk2IGFuZCAxMDEwIGNoaXBzLgorICogIE11c3Qgbm90IGV4Y2VlZCA0SyBieXRlcy4KKyAqLworc3RydWN0IFNZTV9GV0FfU0NSIHsKKwl1MzIgc3RhcnQJCVsgMTRdOworCXUzMiBnZXRqb2JfYmVnaW4JWyAgNF07CisJdTMyIGdldGpvYl9lbmQJCVsgIDRdOworI2lmZGVmIFNZTV9DT05GX1RBUkdFVF9ST0xFX1NVUFBPUlQKKwl1MzIgc2VsZWN0CQlbICA2XTsKKyNlbHNlCisJdTMyIHNlbGVjdAkJWyAgNF07CisjZW5kaWYKKyNpZglTWU1fQ09ORl9ETUFfQUREUkVTU0lOR19NT0RFID09IDIKKwl1MzIgaXNfZG1hcF9kaXJ0eQlbICA0XTsKKyNlbmRpZgorCXUzMiB3Zl9zZWxfZG9uZQkJWyAgMl07CisJdTMyIHNlbF9kb25lCQlbICAyXTsKKwl1MzIgc2VuZF9pZGVudAkJWyAgMl07CisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJdTMyIHNlbGVjdDIJCVsgIDhdOworI2Vsc2UKKwl1MzIgc2VsZWN0MgkJWyAgMl07CisjZW5kaWYKKwl1MzIgY29tbWFuZAkJWyAgMl07CisJdTMyIGRpc3BhdGNoCQlbIDI4XTsKKwl1MzIgc2VsX25vX2NtZAkJWyAxMF07CisJdTMyIGluaXQJCVsgIDZdOworCXUzMiBjbHJhY2sJCVsgIDRdOworCXUzMiBkYXRhaV9kb25lCQlbIDEwXTsKKwl1MzIgZGF0YWlfZG9uZV93c3IJWyAyMF07CisJdTMyIGRhdGFvX2RvbmUJCVsgMTBdOworCXUzMiBkYXRhb19kb25lX3dzcwlbICA2XTsKKwl1MzIgZGF0YWlfcGhhc2UJCVsgIDRdOworCXUzMiBkYXRhb19waGFzZQkJWyAgNl07CisJdTMyIG1zZ19pbgkJWyAgMl07CisJdTMyIG1zZ19pbjIJCVsgMTBdOworI2lmZGVmIFNZTV9DT05GX0lBUkJfU1VQUE9SVAorCXUzMiBzdGF0dXMJCVsgMTRdOworI2Vsc2UKKwl1MzIgc3RhdHVzCQlbIDEwXTsKKyNlbmRpZgorCXUzMiBjb21wbGV0ZQkJWyAgNl07CisJdTMyIGNvbXBsZXRlMgkJWyAxMl07CisJdTMyIGRvbmUJCVsgMTRdOworCXUzMiBkb25lX2VuZAkJWyAgMl07CisJdTMyIGNvbXBsZXRlX2Vycm9yCVsgIDRdOworCXUzMiBzYXZlX2RwCQlbIDEyXTsKKwl1MzIgcmVzdG9yZV9kcAkJWyAgOF07CisJdTMyIGRpc2Nvbm5lY3QJCVsgMTJdOworI2lmZGVmIFNZTV9DT05GX0lBUkJfU1VQUE9SVAorCXUzMiBpZGxlCQlbICA0XTsKKyNlbHNlCisJdTMyIGlkbGUJCVsgIDJdOworI2VuZGlmCisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJdTMyIHVuZ2V0am9iCQlbICA2XTsKKyNlbHNlCisJdTMyIHVuZ2V0am9iCQlbICA0XTsKKyNlbmRpZgorI2lmZGVmIFNZTV9DT05GX1RBUkdFVF9ST0xFX1NVUFBPUlQKKwl1MzIgcmVzZWxlY3QJCVsgIDRdOworI2Vsc2UKKwl1MzIgcmVzZWxlY3QJCVsgIDJdOworI2VuZGlmCisJdTMyIHJlc2VsZWN0ZWQJCVsgMjJdOworCXUzMiByZXNlbF9zY250bDQJWyAyMF07CisJdTMyIHJlc2VsX2x1bjAJCVsgIDZdOworI2lmICAgU1lNX0NPTkZfTUFYX1RBU0sqNCA+IDUxMgorCXUzMiByZXNlbF90YWcJCVsgMjZdOworI2VsaWYgU1lNX0NPTkZfTUFYX1RBU0sqNCA+IDI1NgorCXUzMiByZXNlbF90YWcJCVsgMjBdOworI2Vsc2UKKwl1MzIgcmVzZWxfdGFnCQlbIDE2XTsKKyNlbmRpZgorCXUzMiByZXNlbF9kc2EJCVsgIDJdOworCXUzMiByZXNlbF9kc2ExCQlbICA0XTsKKwl1MzIgcmVzZWxfbm9fdGFnCVsgIDZdOworCXUzMiBkYXRhX2luCQlbU1lNX0NPTkZfTUFYX1NHICogMl07CisJdTMyIGRhdGFfaW4yCQlbICA0XTsKKwl1MzIgZGF0YV9vdXQJCVtTWU1fQ09ORl9NQVhfU0cgKiAyXTsKKwl1MzIgZGF0YV9vdXQyCQlbICA0XTsKKwl1MzIgcG0wX2RhdGEJCVsgMTJdOworCXUzMiBwbTBfZGF0YV9vdXQJWyAgNl07CisJdTMyIHBtMF9kYXRhX2VuZAlbICA2XTsKKwl1MzIgcG0xX2RhdGEJCVsgMTJdOworCXUzMiBwbTFfZGF0YV9vdXQJWyAgNl07CisJdTMyIHBtMV9kYXRhX2VuZAlbICA2XTsKK307CisKKy8qCisgKiAgU2NyaXB0IGZyYWdtZW50cyB3aGljaCBzdGF5IGluIG1haW4gbWVtb3J5IGZvciBhbGwgY2hpcHMgCisgKiAgZXhjZXB0IGZvciBjaGlwcyB0aGF0IHN1cHBvcnQgOEsgb24tY2hpcCBSQU0uCisgKi8KK3N0cnVjdCBTWU1fRldCX1NDUiB7CisJdTMyIHN0YXJ0NjQJCVsgIDJdOworCXUzMiBub19kYXRhCQlbICAyXTsKKyNpZmRlZiBTWU1fQ09ORl9UQVJHRVRfUk9MRV9TVVBQT1JUCisJdTMyIHNlbF9mb3JfYWJvcnQJWyAxOF07CisjZWxzZQorCXUzMiBzZWxfZm9yX2Fib3J0CVsgMTZdOworI2VuZGlmCisJdTMyIHNlbF9mb3JfYWJvcnRfMQlbICAyXTsKKwl1MzIgbXNnX2luX2V0YwkJWyAxMl07CisJdTMyIG1zZ19yZWNlaXZlZAlbICA0XTsKKwl1MzIgbXNnX3dlaXJkX3NlZW4JWyAgNF07CisJdTMyIG1zZ19leHRlbmRlZAlbIDIwXTsKKwl1MzIgbXNnX2JhZAkJWyAgNl07CisJdTMyIG1zZ193ZWlyZAkJWyAgNF07CisJdTMyIG1zZ193ZWlyZDEJCVsgIDhdOworCisJdTMyIHdkdHJfcmVzcAkJWyAgNl07CisJdTMyIHNlbmRfd2R0cgkJWyAgNF07CisJdTMyIHNkdHJfcmVzcAkJWyAgNl07CisJdTMyIHNlbmRfc2R0cgkJWyAgNF07CisJdTMyIHBwcl9yZXNwCQlbICA2XTsKKwl1MzIgc2VuZF9wcHIJCVsgIDRdOworCXUzMiBuZWdvX2JhZF9waGFzZQlbICA0XTsKKwl1MzIgbXNnX291dAkJWyAgNF07CisJdTMyIG1zZ19vdXRfZG9uZQlbICA0XTsKKwl1MzIgZGF0YV9vdnJ1bgkJWyAgMl07CisJdTMyIGRhdGFfb3ZydW4xCQlbIDIyXTsKKwl1MzIgZGF0YV9vdnJ1bjIJCVsgIDhdOworCXUzMiBhYm9ydF9yZXNlbAkJWyAxNl07CisJdTMyIHJlc2VuZF9pZGVudAlbICA0XTsKKwl1MzIgaWRlbnRfYnJlYWsJCVsgIDRdOworCXUzMiBpZGVudF9icmVha19hdG4JWyAgNF07CisJdTMyIHNkYXRhX2luCQlbICA2XTsKKwl1MzIgcmVzZWxfYmFkX2x1bglbICA0XTsKKwl1MzIgYmFkX2lfdF9sCQlbICA0XTsKKwl1MzIgYmFkX2lfdF9sX3EJCVsgIDRdOworCXUzMiBiYWRfc3RhdHVzCQlbICA2XTsKKwl1MzIgcG1faGFuZGxlCQlbIDIwXTsKKwl1MzIgcG1faGFuZGxlMQkJWyAgNF07CisJdTMyIHBtX3NhdmUJCVsgIDRdOworCXUzMiBwbTBfc2F2ZQkJWyAxMl07CisJdTMyIHBtX3NhdmVfZW5kCQlbICA0XTsKKwl1MzIgcG0xX3NhdmUJCVsgMTRdOworCisJLyogV1NSIGhhbmRsaW5nICovCisJdTMyIHBtX3dzcl9oYW5kbGUJWyAzOF07CisJdTMyIHdzcl9tYV9oZWxwZXIJWyAgNF07CisKKyNpZmRlZiBTWU1fT1BUX0hBTkRMRV9ESVJfVU5LTk9XTgorCS8qIFVua25vd24gZGlyZWN0aW9uIGhhbmRsaW5nICovCisJdTMyIGRhdGFfaW8JCVsgIDJdOworCXUzMiBkYXRhX2lvX2luCQlbICAyXTsKKwl1MzIgZGF0YV9pb19jb20JCVsgIDZdOworCXUzMiBkYXRhX2lvX291dAkJWyAgOF07CisjZW5kaWYKKwkvKiBEYXRhIGFyZWEgKi8KKwl1MzIgemVybwkJWyAgMV07CisJdTMyIHNjcmF0Y2gJCVsgIDFdOworCXUzMiBwbTBfZGF0YV9hZGRyCVsgIDFdOworCXUzMiBwbTFfZGF0YV9hZGRyCVsgIDFdOworCXUzMiBkb25lX3BvcwkJWyAgMV07CisJdTMyIHN0YXJ0cG9zCQlbICAxXTsKKwl1MzIgdGFyZ3RibAkJWyAgMV07Cit9OworCisvKgorICogIFNjcmlwdCBmcmFnbWVudHMgdXNlZCBhdCBpbml0aWFsaXNhdGlvbnMuCisgKiAgT25seSBydW5zIG91dCBvZiBtYWluIG1lbW9yeS4KKyAqLworc3RydWN0IFNZTV9GV1pfU0NSIHsKKwl1MzIgc25vb3B0ZXN0CQlbICA2XTsKKwl1MzIgc25vb3BlbmQJCVsgIDJdOworfTsKKworc3RhdGljIHN0cnVjdCBTWU1fRldBX1NDUiBTWU1fRldBX1NDUiA9IHsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNUQVJUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8geworCS8qCisJICogIFN3aXRjaCB0aGUgTEVEIG9uLgorCSAqICBXaWxsIGJlIHBhdGNoZWQgd2l0aCBhIE5PX09QIGlmIExFRAorCSAqICBub3QgbmVlZGVkIG9yIG5vdCBkZXNpcmVkLgorCSAqLworCVNDUl9SRUdfUkVHIChncHJlZywgU0NSX0FORCwgMHhmZSksCisJCTAsCisJLyoKKwkgKiAgICAgIENsZWFyIFNJR1AuCisJICovCisJU0NSX0ZST01fUkVHIChjdGVzdDIpLAorCQkwLAorCS8qCisJICogIFN0b3AgaGVyZSBpZiB0aGUgQyBjb2RlIHdhbnRzIHRvIHBlcmZvcm0gCisJICogIHNvbWUgZXJyb3IgcmVjb3ZlcnkgcHJvY2VkdXJlIG1hbnVhbGx5LgorCSAqICAoSW5kaWNhdGUgdGhpcyBieSBzZXR0aW5nIFNFTSBpbiBJU1RBVCkKKwkgKi8KKwlTQ1JfRlJPTV9SRUcgKGlzdGF0KSwKKwkJMCwKKwkvKgorCSAqICBSZXBvcnQgdG8gdGhlIEMgY29kZSB0aGUgbmV4dCBwb3NpdGlvbiBpbiAKKwkgKiAgdGhlIHN0YXJ0IHF1ZXVlIHRoZSBTQ1JJUFRTIHdpbGwgc2NoZWR1bGUuCisJICogIFRoZSBDIGNvZGUgbXVzdCBub3QgY2hhbmdlIFNDUkFUQ0hBLgorCSAqLworCVNDUl9MT0FEX0FCUyAoc2NyYXRjaGEsIDQpLAorCQlQQUREUl9CIChzdGFydHBvcyksCisJU0NSX0lOVCBeIElGVFJVRSAoTUFTSyAoU0VNLCBTRU0pKSwKKwkJU0lSX1NDUklQVF9TVE9QUEVELAorCS8qCisJICogIFN0YXJ0IHRoZSBuZXh0IGpvYi4KKwkgKgorCSAqICBARFNBICAgICA9IHN0YXJ0IHBvaW50IGZvciB0aGlzIGpvYi4KKwkgKiAgU0NSQVRDSEEgPSBhZGRyZXNzIG9mIHRoaXMgam9iIGluIHRoZSBzdGFydCBxdWV1ZS4KKwkgKgorCSAqICBXZSB3aWxsIHJlc3RvcmUgc3RhcnRwb3Mgd2l0aCBTQ1JBVENIQSBpZiB3ZSBmYWlscyB0aGUgCisJICogIGFyYml0cmF0aW9uIG9yIGlmIGl0IGlzIHRoZSBpZGxlIGpvYi4KKwkgKgorCSAqICBUaGUgYmVsb3cgR0VUSk9CX0JFR0lOIHRvIEdFVEpPQl9FTkQgc2VjdGlvbiBvZiBTQ1JJUFRTIAorCSAqICBpcyBhIGNyaXRpY2FsIHBhdGguIElmIGl0IGlzIHBhcnRpYWxseSBleGVjdXRlZCwgaXQgdGhlbiAKKwkgKiAgbWF5IGhhcHBlbiB0aGF0IHRoZSBqb2IgYWRkcmVzcyBpcyBub3QgeWV0IGluIHRoZSBEU0EgCisJICogIGFuZCB0aGUgbmV4dCBxdWV1ZSBwb3NpdGlvbiBwb2ludHMgdG8gdGhlIG5leHQgSk9CLgorCSAqLworCVNDUl9MT0FEX0FCUyAoZHNhLCA0KSwKKwkJUEFERFJfQiAoc3RhcnRwb3MpLAorCVNDUl9MT0FEX1JFTCAodGVtcCwgNCksCisJCTQsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBHRVRKT0JfQkVHSU4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfU1RPUkVfQUJTICh0ZW1wLCA0KSwKKwkJUEFERFJfQiAoc3RhcnRwb3MpLAorCVNDUl9MT0FEX1JFTCAoZHNhLCA0KSwKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEdFVEpPQl9FTkQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9MT0FEX1JFTCAodGVtcCwgNCksCisJCTAsCisJU0NSX1JFVFVSTiwKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTEVDVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIERTQQljb250YWlucyB0aGUgYWRkcmVzcyBvZiBhIHNjaGVkdWxlZAorCSAqICAJZGF0YSBzdHJ1Y3R1cmUuCisJICoKKwkgKiAgU0NSQVRDSEEgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IHF1ZXVlICAKKwkgKiAgCWVudHJ5IHdoaWNoIHBvaW50cyB0byB0aGUgbmV4dCBqb2IuCisJICoKKwkgKiAgU2V0IEluaXRpYXRvciBtb2RlLgorCSAqCisJICogIChUYXJnZXQgbW9kZSBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyKQorCSAqLworI2lmZGVmIFNZTV9DT05GX1RBUkdFVF9ST0xFX1NVUFBPUlQKKwlTQ1JfQ0xSIChTQ1JfVFJHKSwKKwkJMCwKKyNlbmRpZgorCS8qCisJICogICAgICBBbmQgdHJ5IHRvIHNlbGVjdCB0aGlzIHRhcmdldC4KKwkgKi8KKwlTQ1JfU0VMX1RCTF9BVE4gXiBvZmZzZXRvZiAoc3RydWN0IHN5bV9kc2IsIHNlbGVjdCksCisJCVBBRERSX0EgKHVuZ2V0am9iKSwKKwkvKgorCSAqICBOb3cgdGhlcmUgYXJlIDQgcG9zc2liaWxpdGllczoKKwkgKgorCSAqICAoMSkgVGhlIGNoaXAgbG9zZXMgYXJiaXRyYXRpb24uCisJICogIFRoaXMgaXMgb2ssIGJlY2F1c2UgaXQgd2lsbCB0cnkgYWdhaW4sCisJICogIHdoZW4gdGhlIGJ1cyBiZWNvbWVzIGlkbGUuCisJICogIChCdXQgYmV3YXJlIG9mIHRoZSB0aW1lb3V0IGZ1bmN0aW9uISkKKwkgKgorCSAqICAoMikgVGhlIGNoaXAgaXMgcmVzZWxlY3RlZC4KKwkgKiAgVGhlbiB0aGUgc2NyaXB0IHByb2Nlc3NvciB0YWtlcyB0aGUganVtcAorCSAqICB0byB0aGUgUkVTRUxFQ1QgbGFiZWwuCisJICoKKwkgKiAgKDMpIFRoZSBjaGlwIHdpbnMgYXJiaXRyYXRpb24uCisJICogIFRoZW4gaXQgd2lsbCBleGVjdXRlIFNDUklQVFMgaW5zdHJ1Y3Rpb24gdW50aWwgCisJICogIHRoZSBuZXh0IGluc3RydWN0aW9uIHRoYXQgY2hlY2tzIFNDU0kgcGhhc2UuCisJICogIFRoZW4gd2lsbCBzdG9wIGFuZCB3YWl0IGZvciBzZWxlY3Rpb24gdG8gYmUgCisJICogIGNvbXBsZXRlIG9yIHNlbGVjdGlvbiB0aW1lLW91dCB0byBvY2N1ci4KKwkgKgorCSAqICBBZnRlciBoYXZpbmcgd29uIGFyYml0cmF0aW9uLCB0aGUgU0NSSVBUUyAgCisJICogIHByb2Nlc3NvciBpcyBhYmxlIHRvIGV4ZWN1dGUgaW5zdHJ1Y3Rpb25zIHdoaWxlIAorCSAqICB0aGUgU0NTSSBjb3JlIGlzIHBlcmZvcm1pbmcgU0NTSSBzZWxlY3Rpb24uCisJICovCisJLyoKKwkgKiAgICAgIEluaXRpYWxpemUgdGhlIHN0YXR1cyByZWdpc3RlcnMKKwkgKi8KKwlTQ1JfTE9BRF9SRUwgKHNjcjAsIDQpLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMuaGVhZC5zdGF0dXMpLAorCS8qCisJICogIFdlIG1heSBuZWVkIGhlbHAgZnJvbSBDUFUgaWYgdGhlIERNQSBzZWdtZW50IAorCSAqICByZWdpc3RlcnMgYXJlbid0IHVwLXRvLWRhdGUgZm9yIHRoaXMgSU8uCisJICogIFBhdGNoZWQgd2l0aCBOT09QIGZvciBjaGlwcyB0aGF0IGRvbm5vdCAKKwkgKiAgc3VwcG9ydCBEQUMgYWRkcmVzc2luZy4KKwkgKi8KKyNpZglTWU1fQ09ORl9ETUFfQUREUkVTU0lOR19NT0RFID09IDIKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IElTX0RNQVBfRElSVFkgPi0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9GUk9NX1JFRyAoSFhfUkVHKSwKKwkJMCwKKwlTQ1JfSU5UIF4gSUZUUlVFIChNQVNLIChIWF9ETUFQX0RJUlRZLCBIWF9ETUFQX0RJUlRZKSksCisJCVNJUl9ETUFQX0RJUlRZLAorI2VuZGlmCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBXRl9TRUxfRE9ORSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfSU5UIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19PVVQpKSwKKwkJU0lSX1NFTF9BVE5fTk9fTVNHX09VVCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTF9ET05FID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIEMxMDEwLTMzIGVycmF0YSB3b3JrLWFyb3VuZC4KKwkgKiAgRHVlIHRvIGEgcmFjZSwgdGhlIFNDU0kgY29yZSBtYXkgbm90IGhhdmUgCisJICogIGxvYWRlZCBTQ05UTDMgb24gU0VMX1RCTCBpbnN0cnVjdGlvbi4KKwkgKiAgV2UgcmVsb2FkIGl0IG9uY2UgcGhhc2UgaXMgc3RhYmxlLgorCSAqICBQYXRjaGVkIHdpdGggYSBOT09QIGZvciBvdGhlciBjaGlwcy4KKwkgKi8KKwlTQ1JfTE9BRF9SRUwgKHNjbnRsMywgMSksCisJCW9mZnNldG9mKHN0cnVjdCBzeW1fZHNiLCBzZWxlY3Quc2VsX3NjbnRsMyksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTRU5EX0lERU5UID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBTZWxlY3Rpb24gY29tcGxldGUuCisJICogIFNlbmQgdGhlIElERU5USUZZIGFuZCBwb3NzaWJseSB0aGUgVEFHIG1lc3NhZ2UgCisJICogIGFuZCBuZWdvdGlhdGlvbiBtZXNzYWdlIGlmIHByZXNlbnQuCisJICovCisJU0NSX01PVkVfVEJMIF4gU0NSX01TR19PVVQsCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2RzYiwgc21zZyksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTRUxFQ1QyID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKyNpZmRlZiBTWU1fQ09ORl9JQVJCX1NVUFBPUlQKKwkvKgorCSAqICBTZXQgSU1NRURJQVRFIEFSQklUUkFUSU9OIGlmIHdlIGhhdmUgYmVlbiBnaXZlbiAKKwkgKiAgYSBoaW50IHRvIGRvIHNvLiAoU29tZSBqb2IgdG8gZG8gYWZ0ZXIgdGhpcyBvbmUpLgorCSAqLworCVNDUl9GUk9NX1JFRyAoSEZfUkVHKSwKKwkJMCwKKwlTQ1JfSlVNUFIgXiBJRkZBTFNFIChNQVNLIChIRl9ISU5UX0lBUkIsIEhGX0hJTlRfSUFSQikpLAorCQk4LAorCVNDUl9SRUdfUkVHIChzY250bDEsIFNDUl9PUiwgSUFSQiksCisJCTAsCisjZW5kaWYKKwkvKgorCSAqICBBbnRpY2lwYXRlIHRoZSBDT01NQU5EIHBoYXNlLgorCSAqICBUaGlzIGlzIHRoZSBQSEFTRSB3ZSBleHBlY3QgYXQgdGhpcyBwb2ludC4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGRkFMU0UgKFdIRU4gKFNDUl9DT01NQU5EKSksCisJCVBBRERSX0EgKHNlbF9ub19jbWQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQ09NTUFORCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgLi4uIGFuZCBzZW5kIHRoZSBjb21tYW5kCisJICovCisJU0NSX01PVkVfVEJMIF4gU0NSX0NPTU1BTkQsCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2RzYiwgY21kKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERJU1BBVENIID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIE1TR19JTiBpcyB0aGUgb25seSBwaGFzZSB0aGF0IHNoYWxsIGJlIAorCSAqICBlbnRlcmVkIGF0IGxlYXN0IG9uY2UgZm9yIGVhY2ggKHJlKXNlbGVjdGlvbi4KKwkgKiAgU28gd2UgdGVzdCBpdCBmaXJzdC4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoV0hFTiAoU0NSX01TR19JTikpLAorCQlQQUREUl9BIChtc2dfaW4pLAorCVNDUl9KVU1QIF4gSUZUUlVFIChJRiAoU0NSX0RBVEFfT1VUKSksCisJCVBBRERSX0EgKGRhdGFvX3BoYXNlKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoSUYgKFNDUl9EQVRBX0lOKSksCisJCVBBRERSX0EgKGRhdGFpX3BoYXNlKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoSUYgKFNDUl9TVEFUVVMpKSwKKwkJUEFERFJfQSAoc3RhdHVzKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoSUYgKFNDUl9DT01NQU5EKSksCisJCVBBRERSX0EgKGNvbW1hbmQpLAorCVNDUl9KVU1QIF4gSUZUUlVFIChJRiAoU0NSX01TR19PVVQpKSwKKwkJUEFERFJfQiAobXNnX291dCksCisJLyoKKwkgKiAgRGlzY2FyZCBhcyBtYW55IGlsbGVnYWwgcGhhc2VzIGFzIAorCSAqICByZXF1aXJlZCBhbmQgdGVsbCB0aGUgQyBjb2RlIGFib3V0LgorCSAqLworCVNDUl9KVU1QUiBeIElGRkFMU0UgKFdIRU4gKFNDUl9JTEdfT1VUKSksCisJCTE2LAorCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfSUxHX09VVCwKKwkJSEFERFJfMSAoc2NyYXRjaCksCisJU0NSX0pVTVBSIF4gSUZUUlVFIChXSEVOIChTQ1JfSUxHX09VVCkpLAorCQktMTYsCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0lMR19JTikpLAorCQkxNiwKKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX0lMR19JTiwKKwkJSEFERFJfMSAoc2NyYXRjaCksCisJU0NSX0pVTVBSIF4gSUZUUlVFIChXSEVOIChTQ1JfSUxHX0lOKSksCisJCS0xNiwKKwlTQ1JfSU5ULAorCQlTSVJfQkFEX1BIQVNFLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTRUxfTk9fQ01EID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBUaGUgdGFyZ2V0IGRvZXMgbm90IHN3aXRjaCB0byBjb21tYW5kIAorCSAqICBwaGFzZSBhZnRlciBJREVOVElGWSBoYXMgYmVlbiBzZW50LgorCSAqCisJICogIElmIGl0IHN0YXlzIGluIE1TRyBPVVQgcGhhc2Ugc2VuZCBpdCAKKwkgKiAgdGhlIElERU5USUZZIGFnYWluLgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChXSEVOIChTQ1JfTVNHX09VVCkpLAorCQlQQUREUl9CIChyZXNlbmRfaWRlbnQpLAorCS8qCisJICogIElmIHRhcmdldCBkb2VzIG5vdCBzd2l0Y2ggdG8gTVNHIElOIHBoYXNlIAorCSAqICBhbmQgd2Ugc2VudCBhIG5lZ290aWF0aW9uLCBhc3NlcnQgdGhlIAorCSAqICBmYWlsdXJlIGltbWVkaWF0ZWx5LgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChXSEVOIChTQ1JfTVNHX0lOKSksCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKKwlTQ1JfRlJPTV9SRUcgKEhTX1JFRyksCisJCTAsCisJU0NSX0lOVCBeIElGVFJVRSAoREFUQSAoSFNfTkVHT1RJQVRFKSksCisJCVNJUl9ORUdPX0ZBSUxFRCwKKwkvKgorCSAqICBKdW1wIHRvIGRpc3BhdGNoZXIuCisJICovCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IElOSVQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFdhaXQgZm9yIHRoZSBTQ1NJIFJFU0VUIHNpZ25hbCB0byBiZSAKKwkgKiAgaW5hY3RpdmUgYmVmb3JlIHJlc3RhcnRpbmcgb3BlcmF0aW9ucywgCisJICogIHNpbmNlIHRoZSBjaGlwIG1heSBoYW5nIG9uIFNFTF9BVE4gCisJICogIGlmIFNDU0kgUkVTRVQgaXMgYWN0aXZlLgorCSAqLworCVNDUl9GUk9NX1JFRyAoc3N0YXQwKSwKKwkJMCwKKwlTQ1JfSlVNUFIgXiBJRlRSVUUgKE1BU0sgKElSU1QsIElSU1QpKSwKKwkJLTE2LAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChzdGFydCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBDTFJBQ0sgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBUZXJtaW5hdGUgcG9zc2libGUgcGVuZGluZyBtZXNzYWdlIHBoYXNlLgorCSAqLworCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBSV9ET05FID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBTYXZlIGN1cnJlbnQgcG9pbnRlciB0byBMQVNUUC4KKwkgKi8KKwlTQ1JfU1RPUkVfUkVMICh0ZW1wLCA0KSwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLmhlYWQubGFzdHApLAorCS8qCisJICogIElmIHRoZSBTV0lERSBpcyBub3QgZnVsbCwganVtcCB0byBkaXNwYXRjaGVyLgorCSAqICBXZSBhbnRpY2lwYXRlIGEgU1RBVFVTIHBoYXNlLgorCSAqLworCVNDUl9GUk9NX1JFRyAoc2NudGwyKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoTUFTSyAoV1NSLCBXU1IpKSwKKwkJUEFERFJfQSAoZGF0YWlfZG9uZV93c3IpLAorCVNDUl9KVU1QIF4gSUZUUlVFIChXSEVOIChTQ1JfU1RBVFVTKSksCisJCVBBRERSX0EgKHN0YXR1cyksCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFJX0RPTkVfV1NSID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFRoZSBTV0lERSBpcyBmdWxsLgorCSAqICBDbGVhciB0aGlzIGNvbmRpdGlvbi4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoc2NudGwyLCBTQ1JfT1IsIFdTUiksCisJCTAsCisJLyoKKwkgKiAgV2UgYXJlIGV4cGVjdGluZyBhbiBJR05PUkUgUkVTSURVRSBtZXNzYWdlIAorCSAqICBmcm9tIHRoZSBkZXZpY2UsIG90aGVyd2lzZSB3ZSBhcmUgaW4gZGF0YSAKKwkgKiAgb3ZlcnJ1biBjb25kaXRpb24uIENoZWNrIGFnYWluc3QgTVNHX0lOIHBoYXNlLgorCSAqLworCVNDUl9JTlQgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX0lOKSksCisJCVNJUl9TV0lERV9PVkVSUlVOLAorCVNDUl9KVU1QIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19JTikpLAorCQlQQUREUl9BIChkaXNwYXRjaCksCisJLyoKKwkgKiAgV2UgYXJlIGluIE1TR19JTiBwaGFzZSwKKwkgKiAgUmVhZCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbWVzc2FnZS4KKwkgKiAgSWYgaXQgaXMgbm90IGFuIElHTk9SRSBSRVNJRFVFIG1lc3NhZ2UsCisJICogIHNpZ25hbCBvdmVycnVuIGFuZCBqdW1wIHRvIG1lc3NhZ2UgCisJICogIHByb2Nlc3NpbmcuCisJICovCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfSU4sCisJCUhBRERSXzEgKG1zZ2luWzBdKSwKKwlTQ1JfSU5UIF4gSUZGQUxTRSAoREFUQSAoTV9JR05fUkVTSURVRSkpLAorCQlTSVJfU1dJREVfT1ZFUlJVTiwKKwlTQ1JfSlVNUCBeIElGRkFMU0UgKERBVEEgKE1fSUdOX1JFU0lEVUUpKSwKKwkJUEFERFJfQSAobXNnX2luMiksCisJLyoKKwkgKiAgV2UgZ290IHRoZSBtZXNzYWdlIHdlIGV4cGVjdGVkLgorCSAqICBSZWFkIHRoZSAybmQgYnl0ZSwgYW5kIGp1bXAgdG8gZGlzcGF0Y2hlci4KKwkgKi8KKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19JTiwKKwkJSEFERFJfMSAobXNnaW5bMV0pLAorCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBT19ET05FID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBTYXZlIGN1cnJlbnQgcG9pbnRlciB0byBMQVNUUC4KKwkgKi8KKwlTQ1JfU1RPUkVfUkVMICh0ZW1wLCA0KSwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLmhlYWQubGFzdHApLAorCS8qCisJICogIElmIHRoZSBTT0RMIGlzIG5vdCBmdWxsIGp1bXAgdG8gZGlzcGF0Y2hlci4KKwkgKiAgV2UgYW50aWNpcGF0ZSBhIFNUQVRVUyBwaGFzZS4KKwkgKi8KKwlTQ1JfRlJPTV9SRUcgKHNjbnRsMiksCisJCTAsCisJU0NSX0pVTVAgXiBJRlRSVUUgKE1BU0sgKFdTUywgV1NTKSksCisJCVBBRERSX0EgKGRhdGFvX2RvbmVfd3NzKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoV0hFTiAoU0NSX1NUQVRVUykpLAorCQlQQUREUl9BIChzdGF0dXMpLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBT19ET05FX1dTUyA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBUaGUgU09ETCBpcyBmdWxsLCBjbGVhciB0aGlzIGNvbmRpdGlvbi4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoc2NudGwyLCBTQ1JfT1IsIFdTUyksCisJCTAsCisJLyoKKwkgKiAgQW5kIHNpZ25hbCBhIERBVEEgVU5ERVJSVU4gY29uZGl0aW9uIAorCSAqICB0byB0aGUgQyBjb2RlLgorCSAqLworCVNDUl9JTlQsCisJCVNJUl9TT0RMX1VOREVSUlVOLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBSV9QSEFTRSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBKdW1wIHRvIGN1cnJlbnQgcG9pbnRlci4KKwkgKi8KKwlTQ1JfTE9BRF9SRUwgKHRlbXAsIDQpLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMuaGVhZC5sYXN0cCksCisJU0NSX1JFVFVSTiwKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFPX1BIQVNFID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIEMxMDEwLTY2IGVycmF0YSB3b3JrLWFyb3VuZC4KKwkgKiAgRXh0cmEgY2xvY2tzIG9mIGRhdGEgaG9sZCBtdXN0IGJlIGluc2VydGVkIAorCSAqICBpbiBEQVRBIE9VVCBwaGFzZSBvbiAzMyBNSHogUENJIEJVUy4KKwkgKiAgUGF0Y2hlZCB3aXRoIGEgTk9PUCBmb3Igb3RoZXIgY2hpcHMuCisJICovCisJU0NSX1JFR19SRUcgKHNjbnRsNCwgU0NSX09SLCAoWENMS0hfRFR8WENMS0hfU1QpKSwKKwkJMCwKKwkvKgorCSAqICBKdW1wIHRvIGN1cnJlbnQgcG9pbnRlci4KKwkgKi8KKwlTQ1JfTE9BRF9SRUwgKHRlbXAsIDQpLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMuaGVhZC5sYXN0cCksCisJU0NSX1JFVFVSTiwKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE1TR19JTiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIEdldCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbWVzc2FnZS4KKwkgKgorCSAqICBUaGUgc2NyaXB0IHByb2Nlc3NvciBkb2Vzbid0IG5lZ2F0ZSB0aGUKKwkgKiAgQUNLIHNpZ25hbCBhZnRlciB0aGlzIHRyYW5zZmVyLgorCSAqLworCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfTVNHX0lOLAorCQlIQUREUl8xIChtc2dpblswXSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfSU4yID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBDaGVjayBmaXJzdCBhZ2FpbnN0IDEgYnl0ZSBtZXNzYWdlcyAKKwkgKiAgdGhhdCB3ZSBoYW5kbGUgZnJvbSBTQ1JJUFRTLgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChEQVRBIChNX0NPTVBMRVRFKSksCisJCVBBRERSX0EgKGNvbXBsZXRlKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoTV9ESVNDT05ORUNUKSksCisJCVBBRERSX0EgKGRpc2Nvbm5lY3QpLAorCVNDUl9KVU1QIF4gSUZUUlVFIChEQVRBIChNX1NBVkVfRFApKSwKKwkJUEFERFJfQSAoc2F2ZV9kcCksCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKE1fUkVTVE9SRV9EUCkpLAorCQlQQUREUl9BIChyZXN0b3JlX2RwKSwKKwkvKgorCSAqICBXZSBoYW5kbGUgYWxsIG90aGVyIG1lc3NhZ2VzIGZyb20gdGhlIAorCSAqICBDIGNvZGUsIHNvIG5vIG5lZWQgdG8gd2FzdGUgb24tY2hpcCBSQU0gCisJICogIGZvciB0aG9zZSBvbmVzLgorCSAqLworCVNDUl9KVU1QLAorCQlQQUREUl9CIChtc2dfaW5fZXRjKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNUQVRVUyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIGdldCB0aGUgc3RhdHVzCisJICovCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9TVEFUVVMsCisJCUhBRERSXzEgKHNjcmF0Y2gpLAorI2lmZGVmIFNZTV9DT05GX0lBUkJfU1VQUE9SVAorCS8qCisJICogIElmIFNUQVRVUyBpcyBub3QgR09PRCwgY2xlYXIgSU1NRURJQVRFIEFSQklUUkFUSU9OLCAKKwkgKiAgc2luY2Ugd2UgbWF5IGhhdmUgdG8gdGFtcGVyIHRoZSBzdGFydCBxdWV1ZSBmcm9tIAorCSAqICB0aGUgQyBjb2RlLgorCSAqLworCVNDUl9KVU1QUiBeIElGVFJVRSAoREFUQSAoU19HT09EKSksCisJCTgsCisJU0NSX1JFR19SRUcgKHNjbnRsMSwgU0NSX0FORCwgfklBUkIpLAorCQkwLAorI2VuZGlmCisJLyoKKwkgKiAgc2F2ZSBzdGF0dXMgdG8gc2NzaV9zdGF0dXMuCisJICogIG1hcmsgYXMgY29tcGxldGUuCisJICovCisJU0NSX1RPX1JFRyAoU1NfUkVHKSwKKwkJMCwKKwlTQ1JfTE9BRF9SRUcgKEhTX1JFRywgSFNfQ09NUExFVEUpLAorCQkwLAorCS8qCisJICogIEFudGljaXBhdGUgdGhlIE1FU1NBR0UgUEhBU0UgZm9yIAorCSAqICB0aGUgVEFTSyBDT01QTEVURSBtZXNzYWdlLgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChXSEVOIChTQ1JfTVNHX0lOKSksCisJCVBBRERSX0EgKG1zZ19pbiksCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IENPTVBMRVRFID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIENvbXBsZXRlIG1lc3NhZ2UuCisJICoKKwkgKiAgV2hlbiB3ZSB0ZXJtaW5hdGUgdGhlIGN5Y2xlIGJ5IGNsZWFyaW5nIEFDSywKKwkgKiAgdGhlIHRhcmdldCBtYXkgZGlzY29ubmVjdCBpbW1lZGlhdGVseS4KKwkgKgorCSAqICBXZSBkb24ndCB3YW50IHRvIGJlIHRvbGQgb2YgYW4gInVuZXhwZWN0ZWQgZGlzY29ubmVjdCIsCisJICogIHNvIHdlIGRpc2FibGUgdGhpcyBmZWF0dXJlLgorCSAqLworCVNDUl9SRUdfUkVHIChzY250bDIsIFNDUl9BTkQsIDB4N2YpLAorCQkwLAorCS8qCisJICogIFRlcm1pbmF0ZSBjeWNsZSAuLi4KKwkgKi8KKwlTQ1JfQ0xSIChTQ1JfQUNLfFNDUl9BVE4pLAorCQkwLAorCS8qCisJICogIC4uLiBhbmQgd2FpdCBmb3IgdGhlIGRpc2Nvbm5lY3QuCisJICovCisJU0NSX1dBSVRfRElTQywKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IENPTVBMRVRFMiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFNhdmUgaG9zdCBzdGF0dXMuCisJICovCisJU0NSX1NUT1JFX1JFTCAoc2NyMCwgNCksCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5oZWFkLnN0YXR1cyksCisJLyoKKwkgKiAgU29tZSBicmlkZ2VzIG1heSByZW9yZGVyIERNQSB3cml0ZXMgdG8gbWVtb3J5LgorCSAqICBXZSBkb25ub3Qgd2FudCB0aGUgQ1BVIHRvIGRlYWwgd2l0aCBjb21wbGV0aW9ucyAgCisJICogIHdpdGhvdXQgYWxsIHRoZSBwb3N0ZWQgd3JpdGUgaGF2aW5nIGJlZW4gZmx1c2hlZCAKKwkgKiAgdG8gbWVtb3J5LiBUaGlzIERVTU1ZIFJFQUQgc2hvdWxkIGZsdXNoIHBvc3RlZCAKKwkgKiAgYnVmZmVycyBwcmlvciB0byB0aGUgQ1BVIGhhdmluZyB0byBkZWFsIHdpdGggCisJICogIGNvbXBsZXRpb25zLgorCSAqLworCVNDUl9MT0FEX1JFTCAoc2NyMCwgNCksCS8qIERVTU1ZIFJFQUQgKi8KKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLmhlYWQuc3RhdHVzKSwKKworCS8qCisJICogIElmIGNvbW1hbmQgcmVzdWx0ZWQgaW4gbm90IEdPT0Qgc3RhdHVzLAorCSAqICBjYWxsIHRoZSBDIGNvZGUgaWYgbmVlZGVkLgorCSAqLworCVNDUl9GUk9NX1JFRyAoU1NfUkVHKSwKKwkJMCwKKwlTQ1JfQ0FMTCBeIElGRkFMU0UgKERBVEEgKFNfR09PRCkpLAorCQlQQUREUl9CIChiYWRfc3RhdHVzKSwKKwkvKgorCSAqICBJZiB3ZSBwZXJmb3JtZWQgYW4gYXV0by1zZW5zZSwgY2FsbCAKKwkgKiAgdGhlIEMgY29kZSB0byBzeW5jaHJvbnl6ZSB0YXNrIGFib3J0cyAKKwkgKiAgd2l0aCBVTklUIEFUVEVOVElPTiBjb25kaXRpb25zLgorCSAqLworCVNDUl9GUk9NX1JFRyAoSEZfUkVHKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGRkFMU0UgKE1BU0sgKDAgLChIRl9TRU5TRXxIRl9FWFRfRVJSKSkpLAorCQlQQUREUl9BIChjb21wbGV0ZV9lcnJvciksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBET05FID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBDb3B5IHRoZSBEU0EgdG8gdGhlIERPTkUgUVVFVUUgYW5kIAorCSAqICBzaWduYWwgY29tcGxldGlvbiB0byB0aGUgaG9zdC4KKwkgKiAgSWYgd2UgYXJlIGludGVycnVwdGVkIGJldHdlZW4gRE9ORSAKKwkgKiAgYW5kIERPTkVfRU5ELCB3ZSBtdXN0IHJlc2V0LCBvdGhlcndpc2UgCisJICogIHRoZSBjb21wbGV0ZWQgQ0NCIG1heSBiZSBsb3N0LgorCSAqLworCVNDUl9TVE9SRV9BQlMgKGRzYSwgNCksCisJCVBBRERSX0IgKHNjcmF0Y2gpLAorCVNDUl9MT0FEX0FCUyAoZHNhLCA0KSwKKwkJUEFERFJfQiAoZG9uZV9wb3MpLAorCVNDUl9MT0FEX0FCUyAoc2NyYXRjaGEsIDQpLAorCQlQQUREUl9CIChzY3JhdGNoKSwKKwlTQ1JfU1RPUkVfUkVMIChzY3JhdGNoYSwgNCksCisJCTAsCisJLyoKKwkgKiAgVGhlIGluc3RydWN0aW9uIGJlbG93IHJlYWRzIHRoZSBET05FIFFVRVVFIG5leHQgCisJICogIGZyZWUgcG9zaXRpb24gZnJvbSBtZW1vcnkuCisJICogIEluIGFkZGl0aW9uIGl0IGVuc3VyZXMgdGhhdCBhbGwgUENJIHBvc3RlZCB3cml0ZXMgIAorCSAqICBhcmUgZmx1c2hlZCBhbmQgc28gdGhlIERTQSB2YWx1ZSBvZiB0aGUgZG9uZSAKKwkgKiAgQ0NCIGlzIHZpc2libGUgYnkgdGhlIENQVSBiZWZvcmUgSU5URkxZIGlzIHJhaXNlZC4KKwkgKi8KKwlTQ1JfTE9BRF9SRUwgKHNjcmF0Y2hhLCA0KSwKKwkJNCwKKwlTQ1JfSU5UX0ZMWSwKKwkJMCwKKwlTQ1JfU1RPUkVfQUJTIChzY3JhdGNoYSwgNCksCisJCVBBRERSX0IgKGRvbmVfcG9zKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERPTkVfRU5EID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9KVU1QLAorCQlQQUREUl9BIChzdGFydCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBDT01QTEVURV9FUlJPUiA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfTE9BRF9BQlMgKHNjcmF0Y2hhLCA0KSwKKwkJUEFERFJfQiAoc3RhcnRwb3MpLAorCVNDUl9JTlQsCisJCVNJUl9DT01QTEVURV9FUlJPUiwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNBVkVfRFAgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIENsZWFyIEFDSyBpbW1lZGlhdGVseS4KKwkgKiAgTm8gbmVlZCB0byBkZWxheSBpdC4KKwkgKi8KKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwkvKgorCSAqICBLZWVwIHRyYWNrIHdlIHJlY2VpdmVkIGEgU0FWRSBEUCwgc28gCisJICogIHdlIHdpbGwgc3dpdGNoIHRvIHRoZSBvdGhlciBQTSBjb250ZXh0IAorCSAqICBvbiB0aGUgbmV4dCBQTSBzaW5jZSB0aGUgRFAgbWF5IHBvaW50IAorCSAqICB0byB0aGUgY3VycmVudCBQTSBjb250ZXh0LgorCSAqLworCVNDUl9SRUdfUkVHIChIRl9SRUcsIFNDUl9PUiwgSEZfRFBfU0FWRUQpLAorCQkwLAorCS8qCisJICogIFNBVkVfRFAgbWVzc2FnZToKKwkgKiAgQ29weSBMQVNUUCB0byBTQVZFUC4KKwkgKi8KKwlTQ1JfTE9BRF9SRUwgKHNjcmF0Y2hhLCA0KSwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLmhlYWQubGFzdHApLAorCVNDUl9TVE9SRV9SRUwgKHNjcmF0Y2hhLCA0KSwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLmhlYWQuc2F2ZXApLAorCS8qCisJICogIEFudGljaXBhdGUgdGhlIE1FU1NBR0UgUEhBU0UgZm9yIAorCSAqICB0aGUgRElTQ09OTkVDVCBtZXNzYWdlLgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChXSEVOIChTQ1JfTVNHX0lOKSksCisJCVBBRERSX0EgKG1zZ19pbiksCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU1RPUkVfRFAgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIENsZWFyIEFDSyBpbW1lZGlhdGVseS4KKwkgKiAgTm8gbmVlZCB0byBkZWxheSBpdC4KKwkgKi8KKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwkvKgorCSAqICBDb3B5IFNBVkVQIHRvIExBU1RQLgorCSAqLworCVNDUl9MT0FEX1JFTCAgKHNjcmF0Y2hhLCA0KSwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLmhlYWQuc2F2ZXApLAorCVNDUl9TVE9SRV9SRUwgKHNjcmF0Y2hhLCA0KSwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLmhlYWQubGFzdHApLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBESVNDT05ORUNUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBESVNDT05ORUNUaW5nICAuLi4KKwkgKgorCSAqICBkaXNhYmxlIHRoZSAidW5leHBlY3RlZCBkaXNjb25uZWN0IiBmZWF0dXJlLAorCSAqICBhbmQgcmVtb3ZlIHRoZSBBQ0sgc2lnbmFsLgorCSAqLworCVNDUl9SRUdfUkVHIChzY250bDIsIFNDUl9BTkQsIDB4N2YpLAorCQkwLAorCVNDUl9DTFIgKFNDUl9BQ0t8U0NSX0FUTiksCisJCTAsCisJLyoKKwkgKiAgV2FpdCBmb3IgdGhlIGRpc2Nvbm5lY3QuCisJICovCisJU0NSX1dBSVRfRElTQywKKwkJMCwKKwkvKgorCSAqICBTdGF0dXMgaXM6IERJU0NPTk5FQ1RFRC4KKwkgKi8KKwlTQ1JfTE9BRF9SRUcgKEhTX1JFRywgSFNfRElTQ09OTkVDVCksCisJCTAsCisJLyoKKwkgKiAgU2F2ZSBob3N0IHN0YXR1cy4KKwkgKi8KKwlTQ1JfU1RPUkVfUkVMIChzY3IwLCA0KSwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLmhlYWQuc3RhdHVzKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoc3RhcnQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgSURMRSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgTm90aGluZyB0byBkbz8KKwkgKiAgU3dpdGNoIHRoZSBMRUQgb2ZmIGFuZCB3YWl0IGZvciByZXNlbGVjdC4KKwkgKiAgV2lsbCBiZSBwYXRjaGVkIHdpdGggYSBOT19PUCBpZiBMRUQKKwkgKiAgbm90IG5lZWRlZCBvciBub3QgZGVzaXJlZC4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoZ3ByZWcsIFNDUl9PUiwgMHgwMSksCisJCTAsCisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJU0NSX0pVTVBSLAorCQk4LAorI2VuZGlmCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBVTkdFVEpPQiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKyNpZmRlZiBTWU1fQ09ORl9JQVJCX1NVUFBPUlQKKwkvKgorCSAqICBTZXQgSU1NRURJQVRFIEFSQklUUkFUSU9OLCBmb3IgdGhlIG5leHQgdGltZS4KKwkgKiAgVGhpcyB3aWxsIGdpdmUgdXMgYmV0dGVyIGNoYW5jZSB0byB3aW4gYXJiaXRyYXRpb24gCisJICogIGZvciB0aGUgam9iIHdlIGp1c3Qgd2FudGVkIHRvIGRvLgorCSAqLworCVNDUl9SRUdfUkVHIChzY250bDEsIFNDUl9PUiwgSUFSQiksCisJCTAsCisjZW5kaWYKKwkvKgorCSAqICBXZSBhcmUgbm90IGFibGUgdG8gcmVzdGFydCB0aGUgU0NSSVBUUyBpZiB3ZSBhcmUgCisJICogIGludGVycnVwdGVkIGFuZCB0aGVzZSBpbnN0cnVjdGlvbiBoYXZlbid0IGJlZW4gCisJICogIGFsbCBleGVjdXRlZC4gQlRXLCB0aGlzIGlzIHZlcnkgdW5saWtlbHkgdG8gCisJICogIGhhcHBlbiwgYnV0IHdlIGNoZWNrIHRoYXQgZnJvbSB0aGUgQyBjb2RlLgorCSAqLworCVNDUl9MT0FEX1JFRyAoZHNhLCAweGZmKSwKKwkJMCwKKwlTQ1JfU1RPUkVfQUJTIChzY3JhdGNoYSwgNCksCisJCVBBRERSX0IgKHN0YXJ0cG9zKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VMRUNUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworI2lmZGVmIFNZTV9DT05GX1RBUkdFVF9ST0xFX1NVUFBPUlQKKwkvKgorCSAqICBNYWtlIHN1cmUgd2UgYXJlIGluIGluaXRpYXRvciBtb2RlLgorCSAqLworCVNDUl9DTFIgKFNDUl9UUkcpLAorCQkwLAorI2VuZGlmCisJLyoKKwkgKiAgU2xlZXAgd2FpdGluZyBmb3IgYSByZXNlbGVjdGlvbi4KKwkgKi8KKwlTQ1JfV0FJVF9SRVNFTCwKKwkJUEFERFJfQShzdGFydCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTEVDVEVEID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBTd2l0Y2ggdGhlIExFRCBvbi4KKwkgKiAgV2lsbCBiZSBwYXRjaGVkIHdpdGggYSBOT19PUCBpZiBMRUQKKwkgKiAgbm90IG5lZWRlZCBvciBub3QgZGVzaXJlZC4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoZ3ByZWcsIFNDUl9BTkQsIDB4ZmUpLAorCQkwLAorCS8qCisJICogIGxvYWQgdGhlIHRhcmdldCBpZCBpbnRvIHRoZSBzZGlkCisJICovCisJU0NSX1JFR19TRkJSIChzc2lkLCBTQ1JfQU5ELCAweDhGKSwKKwkJMCwKKwlTQ1JfVE9fUkVHIChzZGlkKSwKKwkJMCwKKwkvKgorCSAqICBMb2FkIHRoZSB0YXJnZXQgY29udHJvbCBibG9jayBhZGRyZXNzCisJICovCisJU0NSX0xPQURfQUJTIChkc2EsIDQpLAorCQlQQUREUl9CICh0YXJndGJsKSwKKwlTQ1JfU0ZCUl9SRUcgKGRzYSwgU0NSX1NITCwgMCksCisJCTAsCisJU0NSX1JFR19SRUcgKGRzYSwgU0NSX1NITCwgMCksCisJCTAsCisJU0NSX1JFR19SRUcgKGRzYSwgU0NSX0FORCwgMHgzYyksCisJCTAsCisJU0NSX0xPQURfUkVMIChkc2EsIDQpLAorCQkwLAorCS8qCisJICogIFdlIGV4cGVjdCBNRVNTQUdFIElOIHBoYXNlLgorCSAqICBJZiBub3QsIGdldCBoZWxwIGZyb20gdGhlIEMgY29kZS4KKwkgKi8KKwlTQ1JfSU5UIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19JTikpLAorCQlTSVJfUkVTRUxfTk9fTVNHX0lOLAorCS8qCisJICogIExvYWQgdGhlIGxlZ2FjeSBzeW5jaHJvbm91cyB0cmFuc2ZlciByZWdpc3RlcnMuCisJICovCisJU0NSX0xPQURfUkVMIChzY250bDMsIDEpLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3ltX3RjYiwgaGVhZC53dmFsKSwKKwlTQ1JfTE9BRF9SRUwgKHN4ZmVyLCAxKSwKKwkJb2Zmc2V0b2Yoc3RydWN0IHN5bV90Y2IsIGhlYWQuc3ZhbCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTF9TQ05UTDQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBUaGUgQzEwMTAgdXNlcyBhIG5ldyBzeW5jaHJvbm91cyB0aW1pbmcgc2NoZW1lLgorCSAqICBXaWxsIGJlIHBhdGNoZWQgd2l0aCBhIE5PX09QIGlmIG5vdCBhIEMxMDEwLgorCSAqLworCVNDUl9MT0FEX1JFTCAoc2NudGw0LCAxKSwKKwkJb2Zmc2V0b2Yoc3RydWN0IHN5bV90Y2IsIGhlYWQudXZhbCksCisJLyoKKwkgKiAgR2V0IHRoZSBJREVOVElGWSBtZXNzYWdlLgorCSAqLworCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfTVNHX0lOLAorCQlIQUREUl8xIChtc2dpbiksCisJLyoKKwkgKiAgSWYgSURFTlRJRlkgTFVOICMwLCB1c2UgYSBmYXN0ZXIgcGF0aCAKKwkgKiAgdG8gZmluZCB0aGUgTENCIHN0cnVjdHVyZS4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoTUFTSyAoMHg4MCwgMHhiZikpLAorCQlQQUREUl9BIChyZXNlbF9sdW4wKSwKKwkvKgorCSAqICBJZiBtZXNzYWdlIGlzbid0IGFuIElERU5USUZZLCAKKwkgKiAgdGVsbCB0aGUgQyBjb2RlIGFib3V0LgorCSAqLworCVNDUl9JTlQgXiBJRkZBTFNFIChNQVNLICgweDgwLCAweDgwKSksCisJCVNJUl9SRVNFTF9OT19JREVOVElGWSwKKwkvKgorCSAqICBJdCBpcyBhbiBJREVOVElGWSBtZXNzYWdlLAorCSAqICBMb2FkIHRoZSBMVU4gY29udHJvbCBibG9jayBhZGRyZXNzLgorCSAqLworCVNDUl9MT0FEX1JFTCAoZHNhLCA0KSwKKwkJb2Zmc2V0b2Yoc3RydWN0IHN5bV90Y2IsIGhlYWQubHVudGJsX3NhKSwKKwlTQ1JfU0ZCUl9SRUcgKGRzYSwgU0NSX1NITCwgMCksCisJCTAsCisJU0NSX1JFR19SRUcgKGRzYSwgU0NSX1NITCwgMCksCisJCTAsCisJU0NSX1JFR19SRUcgKGRzYSwgU0NSX0FORCwgMHhmYyksCisJCTAsCisJU0NSX0xPQURfUkVMIChkc2EsIDQpLAorCQkwLAorCVNDUl9KVU1QUiwKKwkJOCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VMX0xVTjAgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIExVTiAwIHNwZWNpYWwgY2FzZSAoYnV0IHVzdWFsIG9uZSA6KSkKKwkgKi8KKwlTQ1JfTE9BRF9SRUwgKGRzYSwgNCksCisJCW9mZnNldG9mKHN0cnVjdCBzeW1fdGNiLCBoZWFkLmx1bjBfc2EpLAorCS8qCisJICogIEp1bXAgaW5kaXJlY3RseSB0byB0aGUgcmVzZWxlY3QgYWN0aW9uIGZvciB0aGlzIExVTi4KKwkgKi8KKwlTQ1JfTE9BRF9SRUwgKHRlbXAsIDQpLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3ltX2xjYiwgaGVhZC5yZXNlbF9zYSksCisJU0NSX1JFVFVSTiwKKwkJMCwKKwkvKiBJbiBub3JtYWwgc2l0dWF0aW9ucywgd2UganVtcCB0byBSRVNFTF9UQUcgb3IgUkVTRUxfTk9fVEFHICovCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTF9UQUcgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBBQ0sgdGhlIElERU5USUZZIHByZXZpb3VzbHkgcmVjZWl2ZWQuCisJICovCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJLyoKKwkgKiAgSXQgc2hhbGwgYmUgYSB0YWdnZWQgY29tbWFuZC4KKwkgKiAgUmVhZCBTSU1QTEUrVEFHLgorCSAqICBUaGUgQyBjb2RlIHdpbGwgZGVhbCB3aXRoIGVycm9ycy4KKwkgKiAgQWdyZXNzaXZlIG9wdGltaXphdGlvbiwgaXMnbnQgaXQ/IDopCisJICovCisJU0NSX01PVkVfQUJTICgyKSBeIFNDUl9NU0dfSU4sCisJCUhBRERSXzEgKG1zZ2luKSwKKwkvKgorCSAqICBMb2FkIHRoZSBwb2ludGVyIHRvIHRoZSB0YWdnZWQgdGFzayAKKwkgKiAgdGFibGUgZm9yIHRoaXMgTFVOLgorCSAqLworCVNDUl9MT0FEX1JFTCAoZHNhLCA0KSwKKwkJb2Zmc2V0b2Yoc3RydWN0IHN5bV9sY2IsIGhlYWQuaXRscV90Ymxfc2EpLAorCS8qCisJICogIFRoZSBTSURMIHN0aWxsIGNvbnRhaW5zIHRoZSBUQUcgdmFsdWUuCisJICogIEFncmVzc2l2ZSBvcHRpbWl6YXRpb24sIGlzbid0IGl0PyA6KTopCisJICovCisJU0NSX1JFR19TRkJSIChzaWRsLCBTQ1JfU0hMLCAwKSwKKwkJMCwKKyNpZiBTWU1fQ09ORl9NQVhfVEFTSyo0ID4gNTEyCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoQ0FSUllTRVQpLAorCQk4LAorCVNDUl9SRUdfUkVHIChkc2ExLCBTQ1JfT1IsIDIpLAorCQkwLAorCVNDUl9SRUdfUkVHIChzZmJyLCBTQ1JfU0hMLCAwKSwKKwkJMCwKKwlTQ1JfSlVNUFIgXiBJRkZBTFNFIChDQVJSWVNFVCksCisJCTgsCisJU0NSX1JFR19SRUcgKGRzYTEsIFNDUl9PUiwgMSksCisJCTAsCisjZWxpZiBTWU1fQ09ORl9NQVhfVEFTSyo0ID4gMjU2CisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoQ0FSUllTRVQpLAorCQk4LAorCVNDUl9SRUdfUkVHIChkc2ExLCBTQ1JfT1IsIDEpLAorCQkwLAorI2VuZGlmCisJLyoKKwkgKiAgUmV0cmlldmUgdGhlIERTQSBvZiB0aGlzIHRhc2suCisJICogIEpVTVAgaW5kaXJlY3RseSB0byB0aGUgcmVzdGFydCBwb2ludCBvZiB0aGUgQ0NCLgorCSAqLworCVNDUl9TRkJSX1JFRyAoZHNhLCBTQ1JfQU5ELCAweGZjKSwKKwkJMCwKKwlTQ1JfTE9BRF9SRUwgKGRzYSwgNCksCisJCTAsCisJU0NSX0xPQURfUkVMICh0ZW1wLCA0KSwKKwkJb2Zmc2V0b2Yoc3RydWN0IHN5bV9jY2IsIHBoeXMuaGVhZC5nby5yZXN0YXJ0KSwKKwlTQ1JfUkVUVVJOLAorCQkwLAorCS8qIEluIG5vcm1hbCBzaXR1YXRpb25zIHdlIGJyYW5jaCB0byBSRVNFTF9EU0EgKi8KK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VMX0RTQSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIEFDSyB0aGUgSURFTlRJRlkgb3IgVEFHIHByZXZpb3VzbHkgcmVjZWl2ZWQuCisJICovCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTF9EU0ExID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICAgICAgSW5pdGlhbGl6ZSB0aGUgc3RhdHVzIHJlZ2lzdGVycworCSAqLworCVNDUl9MT0FEX1JFTCAoc2NyMCwgNCksCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5oZWFkLnN0YXR1cyksCisJLyoKKwkgKiAgSnVtcCB0byBkaXNwYXRjaGVyLgorCSAqLworCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTF9OT19UQUcgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBMb2FkIHRoZSBEU0Egd2l0aCB0aGUgdW5pcXVlIElUTCB0YXNrLgorCSAqLworCVNDUl9MT0FEX1JFTCAoZHNhLCA0KSwKKwkJb2Zmc2V0b2Yoc3RydWN0IHN5bV9sY2IsIGhlYWQuaXRsX3Rhc2tfc2EpLAorCS8qCisJICogIEpVTVAgaW5kaXJlY3RseSB0byB0aGUgcmVzdGFydCBwb2ludCBvZiB0aGUgQ0NCLgorCSAqLworCVNDUl9MT0FEX1JFTCAodGVtcCwgNCksCisJCW9mZnNldG9mKHN0cnVjdCBzeW1fY2NiLCBwaHlzLmhlYWQuZ28ucmVzdGFydCksCisJU0NSX1JFVFVSTiwKKwkJMCwKKwkvKiBJbiBub3JtYWwgc2l0dWF0aW9ucyB3ZSBicmFuY2ggdG8gUkVTRUxfRFNBICovCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBX0lOID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKy8qCisgKiAgQmVjYXVzZSB0aGUgc2l6ZSBkZXBlbmRzIG9uIHRoZQorICogICNkZWZpbmUgU1lNX0NPTkZfTUFYX1NHIHBhcmFtZXRlciwKKyAqICBpdCBpcyBmaWxsZWQgaW4gYXQgcnVudGltZS4KKyAqCisgKiAgIyM9PT09PT09PT09PTwgaT0wOyBpPFNZTV9DT05GX01BWF9TRyA+PT09PT09PT09CisgKiAgfHwJU0NSX0NITU9WX1RCTCBeIFNDUl9EQVRBX0lOLAorICogIHx8CQlvZmZzZXRvZiAoc3RydWN0IHN5bV9kc2IsIGRhdGFbIGldKSwKKyAqICAjIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCiswCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBX0lOMiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfQ0FMTCwKKwkJUEFERFJfQSAoZGF0YWlfZG9uZSksCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKGRhdGFfb3ZydW4pLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQV9PVVQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisvKgorICogIEJlY2F1c2UgdGhlIHNpemUgZGVwZW5kcyBvbiB0aGUKKyAqICAjZGVmaW5lIFNZTV9DT05GX01BWF9TRyBwYXJhbWV0ZXIsCisgKiAgaXQgaXMgZmlsbGVkIGluIGF0IHJ1bnRpbWUuCisgKgorICogICMjPT09PT09PT09PT08IGk9MDsgaTxTWU1fQ09ORl9NQVhfU0cgPj09PT09PT09PQorICogIHx8CVNDUl9DSE1PVl9UQkwgXiBTQ1JfREFUQV9PVVQsCisgKiAgfHwJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2RzYiwgZGF0YVsgaV0pLAorICogICMjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKzAKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfT1VUMiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9DQUxMLAorCQlQQUREUl9BIChkYXRhb19kb25lKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAoZGF0YV9vdnJ1biksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQTTBfREFUQSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBSZWFkIG91ciBob3N0IGZsYWdzIHRvIFNGQlIsIHNvIHdlIHdpbGwgYmUgYWJsZSAKKwkgKiAgdG8gY2hlY2sgYWdhaW5zdCB0aGUgZGF0YSBkaXJlY3Rpb24gd2UgZXhwZWN0LgorCSAqLworCVNDUl9GUk9NX1JFRyAoSEZfUkVHKSwKKwkJMCwKKwkvKgorCSAqICBDaGVjayBhZ2FpbnN0IGFjdHVhbCBEQVRBIFBIQVNFLgorCSAqLworCVNDUl9KVU1QIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0RBVEFfSU4pKSwKKwkJUEFERFJfQSAocG0wX2RhdGFfb3V0KSwKKwkvKgorCSAqICBBY3R1YWwgcGhhc2UgaXMgREFUQSBJTi4KKwkgKiAgQ2hlY2sgYWdhaW5zdCBleHBlY3RlZCBkaXJlY3Rpb24uCisJICovCisJU0NSX0pVTVAgXiBJRkZBTFNFIChNQVNLIChIRl9EQVRBX0lOLCBIRl9EQVRBX0lOKSksCisJCVBBRERSX0IgKGRhdGFfb3ZydW4pLAorCS8qCisJICogIEtlZXAgdHJhY2sgd2UgYXJlIG1vdmluZyBkYXRhIGZyb20gdGhlIAorCSAqICBQTTAgREFUQSBtaW5pLXNjcmlwdC4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoSEZfUkVHLCBTQ1JfT1IsIEhGX0lOX1BNMCksCisJCTAsCisJLyoKKwkgKiAgTW92ZSB0aGUgZGF0YSB0byBtZW1vcnkuCisJICovCisJU0NSX0NITU9WX1RCTCBeIFNDUl9EQVRBX0lOLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMucG0wLnNnKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAocG0wX2RhdGFfZW5kKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBNMF9EQVRBX09VVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIEFjdHVhbCBwaGFzZSBpcyBEQVRBIE9VVC4KKwkgKiAgQ2hlY2sgYWdhaW5zdCBleHBlY3RlZCBkaXJlY3Rpb24uCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKE1BU0sgKEhGX0RBVEFfSU4sIEhGX0RBVEFfSU4pKSwKKwkJUEFERFJfQiAoZGF0YV9vdnJ1biksCisJLyoKKwkgKiAgS2VlcCB0cmFjayB3ZSBhcmUgbW92aW5nIGRhdGEgZnJvbSB0aGUgCisJICogIFBNMCBEQVRBIG1pbmktc2NyaXB0LgorCSAqLworCVNDUl9SRUdfUkVHIChIRl9SRUcsIFNDUl9PUiwgSEZfSU5fUE0wKSwKKwkJMCwKKwkvKgorCSAqICBNb3ZlIHRoZSBkYXRhIGZyb20gbWVtb3J5LgorCSAqLworCVNDUl9DSE1PVl9UQkwgXiBTQ1JfREFUQV9PVVQsCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5wbTAuc2cpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUE0wX0RBVEFfRU5EID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQ2xlYXIgdGhlIGZsYWcgdGhhdCB0b2xkIHdlIHdlcmUgbW92aW5nICAKKwkgKiAgZGF0YSBmcm9tIHRoZSBQTTAgREFUQSBtaW5pLXNjcmlwdC4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoSEZfUkVHLCBTQ1JfQU5ELCAofkhGX0lOX1BNMCkpLAorCQkwLAorCS8qCisJICogIFJldHVybiB0byB0aGUgcHJldmlvdXMgREFUQSBzY3JpcHQgd2hpY2ggCisJICogIGlzIGd1YXJhbnRlZWQgYnkgZGVzaWduIChpZiBubyBidWcpIHRvIGJlIAorCSAqICB0aGUgbWFpbiBEQVRBIHNjcmlwdCBmb3IgdGhpcyB0cmFuc2Zlci4KKwkgKi8KKwlTQ1JfTE9BRF9SRUwgKHRlbXAsIDQpLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMucG0wLnJldCksCisJU0NSX1JFVFVSTiwKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBNMV9EQVRBID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFJlYWQgb3VyIGhvc3QgZmxhZ3MgdG8gU0ZCUiwgc28gd2Ugd2lsbCBiZSBhYmxlIAorCSAqICB0byBjaGVjayBhZ2FpbnN0IHRoZSBkYXRhIGRpcmVjdGlvbiB3ZSBleHBlY3QuCisJICovCisJU0NSX0ZST01fUkVHIChIRl9SRUcpLAorCQkwLAorCS8qCisJICogIENoZWNrIGFnYWluc3QgYWN0dWFsIERBVEEgUEhBU0UuCisJICovCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfREFUQV9JTikpLAorCQlQQUREUl9BIChwbTFfZGF0YV9vdXQpLAorCS8qCisJICogIEFjdHVhbCBwaGFzZSBpcyBEQVRBIElOLgorCSAqICBDaGVjayBhZ2FpbnN0IGV4cGVjdGVkIGRpcmVjdGlvbi4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGRkFMU0UgKE1BU0sgKEhGX0RBVEFfSU4sIEhGX0RBVEFfSU4pKSwKKwkJUEFERFJfQiAoZGF0YV9vdnJ1biksCisJLyoKKwkgKiAgS2VlcCB0cmFjayB3ZSBhcmUgbW92aW5nIGRhdGEgZnJvbSB0aGUgCisJICogIFBNMSBEQVRBIG1pbmktc2NyaXB0LgorCSAqLworCVNDUl9SRUdfUkVHIChIRl9SRUcsIFNDUl9PUiwgSEZfSU5fUE0xKSwKKwkJMCwKKwkvKgorCSAqICBNb3ZlIHRoZSBkYXRhIHRvIG1lbW9yeS4KKwkgKi8KKwlTQ1JfQ0hNT1ZfVEJMIF4gU0NSX0RBVEFfSU4sCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5wbTEuc2cpLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChwbTFfZGF0YV9lbmQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUE0xX0RBVEFfT1VUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQWN0dWFsIHBoYXNlIGlzIERBVEEgT1VULgorCSAqICBDaGVjayBhZ2FpbnN0IGV4cGVjdGVkIGRpcmVjdGlvbi4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoTUFTSyAoSEZfREFUQV9JTiwgSEZfREFUQV9JTikpLAorCQlQQUREUl9CIChkYXRhX292cnVuKSwKKwkvKgorCSAqICBLZWVwIHRyYWNrIHdlIGFyZSBtb3ZpbmcgZGF0YSBmcm9tIHRoZSAKKwkgKiAgUE0xIERBVEEgbWluaS1zY3JpcHQuCisJICovCisJU0NSX1JFR19SRUcgKEhGX1JFRywgU0NSX09SLCBIRl9JTl9QTTEpLAorCQkwLAorCS8qCisJICogIE1vdmUgdGhlIGRhdGEgZnJvbSBtZW1vcnkuCisJICovCisJU0NSX0NITU9WX1RCTCBeIFNDUl9EQVRBX09VVCwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLnBtMS5zZyksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQTTFfREFUQV9FTkQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBDbGVhciB0aGUgZmxhZyB0aGF0IHRvbGQgd2Ugd2VyZSBtb3ZpbmcgIAorCSAqICBkYXRhIGZyb20gdGhlIFBNMSBEQVRBIG1pbmktc2NyaXB0LgorCSAqLworCVNDUl9SRUdfUkVHIChIRl9SRUcsIFNDUl9BTkQsICh+SEZfSU5fUE0xKSksCisJCTAsCisJLyoKKwkgKiAgUmV0dXJuIHRvIHRoZSBwcmV2aW91cyBEQVRBIHNjcmlwdCB3aGljaCAKKwkgKiAgaXMgZ3VhcmFudGVlZCBieSBkZXNpZ24gKGlmIG5vIGJ1ZykgdG8gYmUgCisJICogIHRoZSBtYWluIERBVEEgc2NyaXB0IGZvciB0aGlzIHRyYW5zZmVyLgorCSAqLworCVNDUl9MT0FEX1JFTCAodGVtcCwgNCksCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5wbTEucmV0KSwKKwlTQ1JfUkVUVVJOLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTw+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworfTsKKworc3RhdGljIHN0cnVjdCBTWU1fRldCX1NDUiBTWU1fRldCX1NDUiA9IHsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNUQVJUNjQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8geworCS8qCisJICogIFNDUklQVCBlbnRyeSBwb2ludCBmb3IgdGhlIDg5NUEsIDg5NiBhbmQgMTAxMC4KKwkgKiAgRm9yIG5vdywgdGhlcmUgaXMgbm8gc3BlY2lmaWMgc3R1ZmYgZm9yIHRob3NlIAorCSAqICBjaGlwcyBhdCB0aGlzIHBvaW50LCBidXQgdGhpcyBtYXkgY29tZS4KKwkgKi8KKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoaW5pdCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBOT19EQVRBID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAoZGF0YV9vdnJ1biksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTRUxfRk9SX0FCT1JUID4tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBXZSBhcmUganVtcGVkIGhlcmUgYnkgdGhlIEMgY29kZSwgaWYgd2UgaGF2ZSAKKwkgKiAgc29tZSB0YXJnZXQgdG8gcmVzZXQgb3Igc29tZSBkaXNjb25uZWN0ZWQgCisJICogIGpvYiB0byBhYm9ydC4gU2luY2UgZXJyb3IgcmVjb3ZlcnkgaXMgYSBzZXJpb3VzIAorCSAqICBidXN5bmVzcywgd2Ugd2lsbCByZWFsbHkgcmVzZXQgdGhlIFNDU0kgQlVTLCBpZiAKKwkgKiAgY2FzZSBvZiBhIFNDU0kgaW50ZXJydXB0IG9jY3VycmluZyBpbiB0aGlzIHBhdGguCisJICovCisjaWZkZWYgU1lNX0NPTkZfVEFSR0VUX1JPTEVfU1VQUE9SVAorCS8qCisJICogIFNldCBpbml0aWF0b3IgbW9kZS4KKwkgKi8KKwlTQ1JfQ0xSIChTQ1JfVFJHKSwKKwkJMCwKKyNlbmRpZgorCS8qCisJICogICAgICBBbmQgdHJ5IHRvIHNlbGVjdCB0aGlzIHRhcmdldC4KKwkgKi8KKwlTQ1JfU0VMX1RCTF9BVE4gXiBvZmZzZXRvZiAoc3RydWN0IHN5bV9oY2IsIGFicnRfc2VsKSwKKwkJUEFERFJfQSAocmVzZWxlY3QpLAorCS8qCisJICogIFdhaXQgZm9yIHRoZSBzZWxlY3Rpb24gdG8gY29tcGxldGUgb3IgCisJICogIHRoZSBzZWxlY3Rpb24gdG8gdGltZSBvdXQuCisJICovCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19PVVQpKSwKKwkJLTgsCisJLyoKKwkgKiAgQ2FsbCB0aGUgQyBjb2RlLgorCSAqLworCVNDUl9JTlQsCisJCVNJUl9UQVJHRVRfU0VMRUNURUQsCisJLyoKKwkgKiAgVGhlIEMgY29kZSBzaG91bGQgbGV0IHVzIGNvbnRpbnVlIGhlcmUuIAorCSAqICBTZW5kIHRoZSAna2lzcyBvZiBkZWF0aCcgbWVzc2FnZS4KKwkgKiAgV2UgZXhwZWN0IGFuIGltbWVkaWF0ZSBkaXNjb25uZWN0IG9uY2UgCisJICogIHRoZSB0YXJnZXQgaGFzIGVhdGVuIHRoZSBtZXNzYWdlLgorCSAqLworCVNDUl9SRUdfUkVHIChzY250bDIsIFNDUl9BTkQsIDB4N2YpLAorCQkwLAorCVNDUl9NT1ZFX1RCTCBeIFNDUl9NU0dfT1VULAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9oY2IsIGFicnRfdGJsKSwKKwlTQ1JfQ0xSIChTQ1JfQUNLfFNDUl9BVE4pLAorCQkwLAorCVNDUl9XQUlUX0RJU0MsCisJCTAsCisJLyoKKwkgKiAgVGVsbCB0aGUgQyBjb2RlIHRoYXQgd2UgYXJlIGRvbmUuCisJICovCisJU0NSX0lOVCwKKwkJU0lSX0FCT1JUX1NFTlQsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTRUxfRk9SX0FCT1JUXzEgPi0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBKdW1wIGF0IHNjaGVkdWxlci4KKwkgKi8KKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoc3RhcnQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX0lOX0VUQyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgSWYgaXQgaXMgYW4gRVhURU5ERUQgKHZhcmlhYmxlIHNpemUgbWVzc2FnZSkKKwkgKiAgSGFuZGxlIGl0LgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChEQVRBIChNX0VYVEVOREVEKSksCisJCVBBRERSX0IgKG1zZ19leHRlbmRlZCksCisJLyoKKwkgKiAgTGV0IHRoZSBDIGNvZGUgaGFuZGxlIGFueSBvdGhlciAKKwkgKiAgMSBieXRlIG1lc3NhZ2UuCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKE1BU0sgKDB4MDAsIDB4ZjApKSwKKwkJUEFERFJfQiAobXNnX3JlY2VpdmVkKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoTUFTSyAoMHgxMCwgMHhmMCkpLAorCQlQQUREUl9CIChtc2dfcmVjZWl2ZWQpLAorCS8qCisJICogIFdlIGRvbm5vdCBoYW5kbGUgMiBieXRlcyBtZXNzYWdlcyBmcm9tIFNDUklQVFMuCisJICogIFNvLCBsZXQgdGhlIEMgY29kZSBkZWFsIHdpdGggdGhlc2Ugb25lcyB0b28uCisJICovCisJU0NSX0pVTVAgXiBJRkZBTFNFIChNQVNLICgweDIwLCAweGYwKSksCisJCVBBRERSX0IgKG1zZ193ZWlyZF9zZWVuKSwKKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19JTiwKKwkJSEFERFJfMSAobXNnaW5bMV0pLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX1JFQ0VJVkVEID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0xPQURfUkVMIChzY3JhdGNoYSwgNCksCS8qIERVTU1ZIFJFQUQgKi8KKwkJMCwKKwlTQ1JfSU5ULAorCQlTSVJfTVNHX1JFQ0VJVkVELAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX1dFSVJEX1NFRU4gPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0xPQURfUkVMIChzY3JhdGNoYSwgNCksCS8qIERVTU1ZIFJFQUQgKi8KKwkJMCwKKwlTQ1JfSU5ULAorCQlTSVJfTVNHX1dFSVJELAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX0VYVEVOREVEID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQ2xlYXIgQUNLIGFuZCBnZXQgdGhlIG5leHQgYnl0ZSAKKwkgKiAgYXNzdW1lZCB0byBiZSB0aGUgbWVzc2FnZSBsZW5ndGguCisJICovCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfSU4sCisJCUhBRERSXzEgKG1zZ2luWzFdKSwKKwkvKgorCSAqICBUcnkgdG8gY2F0Y2ggc29tZSB1bmxpa2VseSBzaXR1YXRpb25zIGFzIDAgbGVuZ3RoIAorCSAqICBvciB0b28gbGFyZ2UgdGhlIGxlbmd0aC4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoMCkpLAorCQlQQUREUl9CIChtc2dfd2VpcmRfc2VlbiksCisJU0NSX1RPX1JFRyAoc2NyYXRjaGEpLAorCQkwLAorCVNDUl9SRUdfUkVHIChzZmJyLCBTQ1JfQURELCAoMjU2LTgpKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoQ0FSUllTRVQpLAorCQlQQUREUl9CIChtc2dfd2VpcmRfc2VlbiksCisJLyoKKwkgKiAgV2UgZG9ubm90IGhhbmRsZSBleHRlbmRlZCBtZXNzYWdlcyBmcm9tIFNDUklQVFMuCisJICogIFJlYWQgdGhlIGFtb3VudCBvZiBkYXRhIGNvcnJlcG9uZGluZyB0byB0aGUgCisJICogIG1lc3NhZ2UgbGVuZ3RoIGFuZCBjYWxsIHRoZSBDIGNvZGUuCisJICovCisJU0NSX1NUT1JFX1JFTCAoc2NyYXRjaGEsIDEpLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9kc2IsIHNtc2dfZXh0LnNpemUpLAorCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9NT1ZFX1RCTCBeIFNDUl9NU0dfSU4sCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2RzYiwgc21zZ19leHQpLAorCVNDUl9KVU1QLAorCQlQQUREUl9CIChtc2dfcmVjZWl2ZWQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX0JBRCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgdW5pbXBsZW1lbnRlZCBtZXNzYWdlIC0gcmVqZWN0IGl0LgorCSAqLworCVNDUl9JTlQsCisJCVNJUl9SRUpFQ1RfVE9fU0VORCwKKwlTQ1JfU0VUIChTQ1JfQVROKSwKKwkJMCwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoY2xyYWNrKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE1TR19XRUlSRCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIHdlaXJkIG1lc3NhZ2UgcmVjZWl2ZWQKKwkgKiAgaWdub3JlIGFsbCBNU0cgSU4gcGhhc2VzIGFuZCByZWplY3QgaXQuCisJICovCisJU0NSX0lOVCwKKwkJU0lSX1JFSkVDVF9UT19TRU5ELAorCVNDUl9TRVQgKFNDUl9BVE4pLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX1dFSVJEMSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX0lOKSksCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19JTiwKKwkJSEFERFJfMSAoc2NyYXRjaCksCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKG1zZ193ZWlyZDEpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgV0RUUl9SRVNQID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgbGV0IHRoZSB0YXJnZXQgZmV0Y2ggb3VyIGFuc3dlci4KKwkgKi8KKwlTQ1JfU0VUIChTQ1JfQVROKSwKKwkJMCwKKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGRkFMU0UgKFdIRU4gKFNDUl9NU0dfT1VUKSksCisJCVBBRERSX0IgKG5lZ29fYmFkX3BoYXNlKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTkRfV0RUUiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFNlbmQgdGhlIE1fWF9XSURFX1JFUQorCSAqLworCVNDUl9NT1ZFX0FCUyAoNCkgXiBTQ1JfTVNHX09VVCwKKwkJSEFERFJfMSAobXNnb3V0KSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAobXNnX291dF9kb25lKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNEVFJfUkVTUCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIGxldCB0aGUgdGFyZ2V0IGZldGNoIG91ciBhbnN3ZXIuCisJICovCisJU0NSX1NFVCAoU0NSX0FUTiksCisJCTAsCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX09VVCkpLAorCQlQQUREUl9CIChuZWdvX2JhZF9waGFzZSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTRU5EX1NEVFIgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBTZW5kIHRoZSBNX1hfU1lOQ19SRVEKKwkgKi8KKwlTQ1JfTU9WRV9BQlMgKDUpIF4gU0NSX01TR19PVVQsCisJCUhBRERSXzEgKG1zZ291dCksCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKG1zZ19vdXRfZG9uZSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQUFJfUkVTUCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBsZXQgdGhlIHRhcmdldCBmZXRjaCBvdXIgYW5zd2VyLgorCSAqLworCVNDUl9TRVQgKFNDUl9BVE4pLAorCQkwLAorCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9KVU1QIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19PVVQpKSwKKwkJUEFERFJfQiAobmVnb19iYWRfcGhhc2UpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0VORF9QUFIgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgU2VuZCB0aGUgTV9YX1BQUl9SRVEKKwkgKi8KKwlTQ1JfTU9WRV9BQlMgKDgpIF4gU0NSX01TR19PVVQsCisJCUhBRERSXzEgKG1zZ291dCksCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKG1zZ19vdXRfZG9uZSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBORUdPX0JBRF9QSEFTRSA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfSU5ULAorCQlTSVJfTkVHT19QUk9UTywKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX09VVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgVGhlIHRhcmdldCByZXF1ZXN0cyBhIG1lc3NhZ2UuCisJICogIFdlIGRvbm5vdCBzZW5kIG1lc3NhZ2VzIHRoYXQgbWF5IAorCSAqICByZXF1aXJlIHRoZSBkZXZpY2UgdG8gZ28gdG8gYnVzIGZyZWUuCisJICovCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfT1VULAorCQlIQUREUl8xIChtc2dvdXQpLAorCS8qCisJICogIC4uLiB3YWl0IGZvciB0aGUgbmV4dCBwaGFzZQorCSAqICBpZiBpdCdzIGEgbWVzc2FnZSBvdXQsIHNlbmQgaXQgYWdhaW4sIC4uLgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChXSEVOIChTQ1JfTVNHX09VVCkpLAorCQlQQUREUl9CIChtc2dfb3V0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE1TR19PVVRfRE9ORSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIExldCB0aGUgQyBjb2RlIGJlIGF3YXJlIG9mIHRoZSAKKwkgKiAgc2VudCBtZXNzYWdlIGFuZCBjbGVhciB0aGUgbWVzc2FnZS4KKwkgKi8KKwlTQ1JfSU5ULAorCQlTSVJfTVNHX09VVF9ET05FLAorCS8qCisJICogIC4uLiBhbmQgcHJvY2VzcyB0aGUgbmV4dCBwaGFzZQorCSAqLworCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBX09WUlVOID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBVc2Ugc2NyYXRjaGEgdG8gY291bnQgdGhlIGV4dHJhIGJ5dGVzLgorCSAqLworCVNDUl9MT0FEX0FCUyAoc2NyYXRjaGEsIDQpLAorCQlQQUREUl9CICh6ZXJvKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfT1ZSVU4xID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFRoZSB0YXJnZXQgbWF5IHdhbnQgdG8gdHJhbnNmZXIgdG9vIG11Y2ggZGF0YS4KKwkgKgorCSAqICBJZiBwaGFzZSBpcyBEQVRBIE9VVCB3cml0ZSAxIGJ5dGUgYW5kIGNvdW50IGl0LgorCSAqLworCVNDUl9KVU1QUiBeIElGRkFMU0UgKFdIRU4gKFNDUl9EQVRBX09VVCkpLAorCQkxNiwKKwlTQ1JfQ0hNT1ZfQUJTICgxKSBeIFNDUl9EQVRBX09VVCwKKwkJSEFERFJfMSAoc2NyYXRjaCksCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKGRhdGFfb3ZydW4yKSwKKwkvKgorCSAqICBJZiBXU1IgaXMgc2V0LCBjbGVhciB0aGlzIGNvbmRpdGlvbiwgYW5kIAorCSAqICBjb3VudCB0aGlzIGJ5dGUuCisJICovCisJU0NSX0ZST01fUkVHIChzY250bDIpLAorCQkwLAorCVNDUl9KVU1QUiBeIElGRkFMU0UgKE1BU0sgKFdTUiwgV1NSKSksCisJCTE2LAorCVNDUl9SRUdfUkVHIChzY250bDIsIFNDUl9PUiwgV1NSKSwKKwkJMCwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAoZGF0YV9vdnJ1bjIpLAorCS8qCisJICogIEZpbmFsbHkgY2hlY2sgYWdhaW5zdCBEQVRBIElOIHBoYXNlLgorCSAqICBTaWduYWwgZGF0YSBvdmVycnVuIHRvIHRoZSBDIGNvZGUgCisJICogIGFuZCBqdW1wIHRvIGRpc3BhdGNoZXIgaWYgbm90IHNvLgorCSAqICBSZWFkIDEgYnl0ZSBvdGhlcndpc2UgYW5kIGNvdW50IGl0LgorCSAqLworCVNDUl9KVU1QUiBeIElGVFJVRSAoV0hFTiAoU0NSX0RBVEFfSU4pKSwKKwkJMTYsCisJU0NSX0lOVCwKKwkJU0lSX0RBVEFfT1ZFUlJVTiwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorCVNDUl9DSE1PVl9BQlMgKDEpIF4gU0NSX0RBVEFfSU4sCisJCUhBRERSXzEgKHNjcmF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQV9PVlJVTjIgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQ291bnQgdGhpcyBieXRlLgorCSAqICBUaGlzIHdpbGwgYWxsb3cgdG8gcmV0dXJuIGEgbmVnYXRpdmUgCisJICogIHJlc2lkdWFsIHRvIHVzZXIuCisJICovCisJU0NSX1JFR19SRUcgKHNjcmF0Y2hhLCAgU0NSX0FERCwgIDB4MDEpLAorCQkwLAorCVNDUl9SRUdfUkVHIChzY3JhdGNoYTEsIFNDUl9BRERDLCAwKSwKKwkJMCwKKwlTQ1JfUkVHX1JFRyAoc2NyYXRjaGEyLCBTQ1JfQUREQywgMCksCisJCTAsCisJLyoKKwkgKiAgLi4gYW5kIHJlcGVhdCBhcyByZXF1aXJlZC4KKwkgKi8KKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAoZGF0YV9vdnJ1bjEpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQUJPUlRfUkVTRUwgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX1NFVCAoU0NSX0FUTiksCisJCTAsCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJLyoKKwkgKiAgc2VuZCB0aGUgYWJvcnQvYWJvcnRhZy9yZXNldCBtZXNzYWdlCisJICogIHdlIGV4cGVjdCBhbiBpbW1lZGlhdGUgZGlzY29ubmVjdAorCSAqLworCVNDUl9SRUdfUkVHIChzY250bDIsIFNDUl9BTkQsIDB4N2YpLAorCQkwLAorCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfTVNHX09VVCwKKwkJSEFERFJfMSAobXNnb3V0KSwKKwlTQ1JfQ0xSIChTQ1JfQUNLfFNDUl9BVE4pLAorCQkwLAorCVNDUl9XQUlUX0RJU0MsCisJCTAsCisJU0NSX0lOVCwKKwkJU0lSX1JFU0VMX0FCT1JURUQsCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKHN0YXJ0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VORF9JREVOVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFRoZSB0YXJnZXQgc3RheXMgaW4gTVNHIE9VVCBwaGFzZSBhZnRlciBoYXZpbmcgYWNrZWQgCisJICogIElkZW50aWZ5IFsrIFRhZyBbKyBFeHRlbmRlZCBtZXNzYWdlIF1dLiBUYXJnZXRzIHNoYWxsCisJICogIGJlaGF2ZSB0aGlzIHdheSBvbiBwYXJpdHkgZXJyb3IuCisJICogIFdlIG11c3Qgc2VuZCBpdCBhZ2FpbiBhbGwgdGhlIG1lc3NhZ2VzLgorCSAqLworCVNDUl9TRVQgKFNDUl9BVE4pLCAvKiBTaGFsbCBiZSBhc3NlcnRlZCAyIGRlc2tldyBkZWxheXMgYmVmb3JlIHRoZSAgKi8KKwkJMCwgICAgICAgICAvKiAxcnN0IEFDSyA9IDkwIG5zLiBIb3BlIHRoZSBjaGlwIGlzbid0IHRvbyBmYXN0ICovCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKHNlbmRfaWRlbnQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgSURFTlRfQlJFQUsgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NMUiAoU0NSX0FUTiksCisJCTAsCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKHNlbGVjdDIpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgSURFTlRfQlJFQUtfQVROID4tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX1NFVCAoU0NSX0FUTiksCisJCTAsCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKHNlbGVjdDIpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0RBVEFfSU4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NITU9WX1RCTCBeIFNDUl9EQVRBX0lOLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9kc2IsIHNlbnNlKSwKKwlTQ1JfQ0FMTCwKKwkJUEFERFJfQSAoZGF0YWlfZG9uZSksCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKGRhdGFfb3ZydW4pLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTRUxfQkFEX0xVTiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgTWVzc2FnZSBpcyBhbiBJREVOVElGWSwgYnV0IGx1biBpcyB1bmtub3duLgorCSAqICBTaWduYWwgcHJvYmxlbSB0byBDIGNvZGUgZm9yIGxvZ2dpbmcgdGhlIGV2ZW50LgorCSAqICBTZW5kIGEgTV9BQk9SVCB0byBjbGVhciBhbGwgcGVuZGluZyB0YXNrcy4KKwkgKi8KKwlTQ1JfSU5ULAorCQlTSVJfUkVTRUxfQkFEX0xVTiwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAoYWJvcnRfcmVzZWwpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQkFEX0lfVF9MID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgV2UgZG9ubm90IGhhdmUgYSB0YXNrIGZvciB0aGF0IElfVF9MLgorCSAqICBTaWduYWwgcHJvYmxlbSB0byBDIGNvZGUgZm9yIGxvZ2dpbmcgdGhlIGV2ZW50LgorCSAqICBTZW5kIGEgTV9BQk9SVCBtZXNzYWdlLgorCSAqLworCVNDUl9JTlQsCisJCVNJUl9SRVNFTF9CQURfSV9UX0wsCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKGFib3J0X3Jlc2VsKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEJBRF9JX1RfTF9RID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFdlIGRvbm5vdCBoYXZlIGEgdGFzayB0aGF0IG1hdGNoZXMgdGhlIHRhZy4KKwkgKiAgU2lnbmFsIHByb2JsZW0gdG8gQyBjb2RlIGZvciBsb2dnaW5nIHRoZSBldmVudC4KKwkgKiAgU2VuZCBhIE1fQUJPUlRUQUcgbWVzc2FnZS4KKwkgKi8KKwlTQ1JfSU5ULAorCQlTSVJfUkVTRUxfQkFEX0lfVF9MX1EsCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKGFib3J0X3Jlc2VsKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEJBRF9TVEFUVVMgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIEFueXRoaW5nIGRpZmZlcmVudCBmcm9tIElOVEVSTUVESUFURSAKKwkgKiAgQ09ORElUSU9OIE1FVCBzaG91bGQgYmUgYSBiYWQgU0NTSSBzdGF0dXMsIAorCSAqICBnaXZlbiB0aGF0IEdPT0Qgc3RhdHVzIGhhcyBhbHJlYWR5IGJlZW4gdGVzdGVkLgorCSAqICBDYWxsIHRoZSBDIGNvZGUuCisJICovCisJU0NSX0xPQURfQUJTIChzY3JhdGNoYSwgNCksCisJCVBBRERSX0IgKHN0YXJ0cG9zKSwKKwlTQ1JfSU5UIF4gSUZGQUxTRSAoREFUQSAoU19DT05EX01FVCkpLAorCQlTSVJfQkFEX1NDU0lfU1RBVFVTLAorCVNDUl9SRVRVUk4sCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQTV9IQU5ETEUgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBQaGFzZSBtaXNtYXRjaCBoYW5kbGluZy4KKwkgKgorCSAqICBTaW5jZSB3ZSBoYXZlIHRvIGRlYWwgd2l0aCAyIFNDU0kgZGF0YSBwb2ludGVycyAgCisJICogIChjdXJyZW50IGFuZCBzYXZlZCksIHdlIG5lZWQgYXQgbGVhc3QgMiBjb250ZXh0cy4KKwkgKiAgRWFjaCBjb250ZXh0IChwbTAgYW5kIHBtMSkgaGFzIGEgc2F2ZWQgYXJlYSwgYSAKKwkgKiAgU0FWRSBtaW5pLXNjcmlwdCBhbmQgYSBEQVRBIHBoYXNlIG1pbmktc2NyaXB0LgorCSAqLworCS8qCisJICogIEdldCB0aGUgUE0gaGFuZGxpbmcgZmxhZ3MuCisJICovCisJU0NSX0ZST01fUkVHIChIRl9SRUcpLAorCQkwLAorCS8qCisJICogIElmIG5vIGZsYWdzICgxcnN0IFBNIGZvciBleGFtcGxlKSwgYXZvaWQgCisJICogIGFsbCB0aGUgYmVsb3cgaGVhdnkgZmxhZ3MgdGVzdGluZy4KKwkgKiAgVGhpcyBtYWtlcyB0aGUgbm9ybWFsIGNhc2UgYSBiaXQgZmFzdGVyLgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChNQVNLICgwLCAoSEZfSU5fUE0wIHwgSEZfSU5fUE0xIHwgSEZfRFBfU0FWRUQpKSksCisJCVBBRERSX0IgKHBtX2hhbmRsZTEpLAorCS8qCisJICogIElmIHdlIHJlY2VpdmVkIGEgU0FWRSBEUCwgc3dpdGNoIHRvIHRoZSAKKwkgKiAgb3RoZXIgUE0gY29udGV4dCBzaW5jZSB0aGUgc2F2ZXAgbWF5IHBvaW50IAorCSAqICB0byB0aGUgY3VycmVudCBQTSBjb250ZXh0LgorCSAqLworCVNDUl9KVU1QUiBeIElGRkFMU0UgKE1BU0sgKEhGX0RQX1NBVkVELCBIRl9EUF9TQVZFRCkpLAorCQk4LAorCVNDUl9SRUdfUkVHIChzZmJyLCBTQ1JfWE9SLCBIRl9BQ1RfUE0pLAorCQkwLAorCS8qCisJICogIElmIHdlIGhhdmUgYmVlbiBpbnRlcnJ1cHQgaW4gYSBQTSBEQVRBIG1pbmktc2NyaXB0LAorCSAqICB3ZSB0YWtlIHRoZSByZXR1cm4gYWRkcmVzcyBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIAorCSAqICBzYXZlZCBhcmVhLgorCSAqICBUaGlzIGVuc3VyZSB0aGUgcmV0dXJuIGFkZHJlc3MgYWx3YXlzIHBvaW50cyB0byB0aGUgCisJICogIG1haW4gREFUQSBzY3JpcHQgZm9yIHRoaXMgdHJhbnNmZXIuCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKE1BU0sgKDAsIChIRl9JTl9QTTAgfCBIRl9JTl9QTTEpKSksCisJCVBBRERSX0IgKHBtX2hhbmRsZTEpLAorCVNDUl9KVU1QUiBeIElGRkFMU0UgKE1BU0sgKEhGX0lOX1BNMCwgSEZfSU5fUE0wKSksCisJCTE2LAorCVNDUl9MT0FEX1JFTCAoaWEsIDQpLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5wbTAucmV0KSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAocG1fc2F2ZSksCisJU0NSX0xPQURfUkVMIChpYSwgNCksCisJCW9mZnNldG9mKHN0cnVjdCBzeW1fY2NiLCBwaHlzLnBtMS5yZXQpLAorCVNDUl9KVU1QLAorCQlQQUREUl9CIChwbV9zYXZlKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBNX0hBTkRMRTEgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIE5vcm1hbCBjYXNlLgorCSAqICBVcGRhdGUgdGhlIHJldHVybiBhZGRyZXNzIHNvIHRoYXQgaXQgCisJICogIHdpbGwgcG9pbnQgYWZ0ZXIgdGhlIGludGVycnVwdGVkIE1PVkUuCisJICovCisJU0NSX1JFR19SRUcgKGlhLCBTQ1JfQURELCA4KSwKKwkJMCwKKwlTQ1JfUkVHX1JFRyAoaWExLCBTQ1JfQUREQywgMCksCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQTV9TQVZFID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBDbGVhciBhbGwgdGhlIGZsYWdzIHRoYXQgdG9sZCB1cyBpZiB3ZSB3ZXJlIAorCSAqICBpbnRlcnJ1cHRlZCBpbiBhIFBNIERBVEEgbWluaS1zY3JpcHQgYW5kL29yIAorCSAqICB3ZSByZWNlaXZlZCBhIFNBVkUgRFAuCisJICovCisJU0NSX1NGQlJfUkVHIChIRl9SRUcsIFNDUl9BTkQsICh+KEhGX0lOX1BNMHxIRl9JTl9QTTF8SEZfRFBfU0FWRUQpKSksCisJCTAsCisJLyoKKwkgKiAgQ2hvb3NlIHRoZSBjdXJyZW50IFBNIGNvbnRleHQuCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKE1BU0sgKEhGX0FDVF9QTSwgSEZfQUNUX1BNKSksCisJCVBBRERSX0IgKHBtMV9zYXZlKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBNMF9TQVZFID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9TVE9SRV9SRUwgKGlhLCA0KSwKKwkJb2Zmc2V0b2Yoc3RydWN0IHN5bV9jY2IsIHBoeXMucG0wLnJldCksCisJLyoKKwkgKiAgSWYgV1NSIGJpdCBpcyBzZXQsIGVpdGhlciBVQSBhbmQgUkJDIG1heSAKKwkgKiAgaGF2ZSB0byBiZSBjaGFuZ2VkIHdoZXRoZXIgdGhlIGRldmljZSB3YW50cyAKKwkgKiAgdG8gaWdub3JlIHRoaXMgcmVzaWR1ZSBvciBub3QuCisJICovCisJU0NSX0ZST01fUkVHIChzY250bDIpLAorCQkwLAorCVNDUl9DQUxMIF4gSUZUUlVFIChNQVNLIChXU1IsIFdTUikpLAorCQlQQUREUl9CIChwbV93c3JfaGFuZGxlKSwKKwkvKgorCSAqICBTYXZlIHRoZSByZW1haW5pbmcgYnl0ZSBjb3VudCwgdGhlIHVwZGF0ZWQgCisJICogIGFkZHJlc3MgYW5kIHRoZSByZXR1cm4gYWRkcmVzcy4KKwkgKi8KKwlTQ1JfU1RPUkVfUkVMIChyYmMsIDQpLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5wbTAuc2cuc2l6ZSksCisJU0NSX1NUT1JFX1JFTCAodWEsIDQpLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5wbTAuc2cuYWRkciksCisJLyoKKwkgKiAgU2V0IHRoZSBjdXJyZW50IHBvaW50ZXIgYXQgdGhlIFBNMCBEQVRBIG1pbmktc2NyaXB0LgorCSAqLworCVNDUl9MT0FEX0FCUyAoaWEsIDQpLAorCQlQQUREUl9CIChwbTBfZGF0YV9hZGRyKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBNX1NBVkVfRU5EID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9TVE9SRV9SRUwgKGlhLCA0KSwKKwkJb2Zmc2V0b2Yoc3RydWN0IHN5bV9jY2IsIHBoeXMuaGVhZC5sYXN0cCksCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBNMV9TQVZFID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9TVE9SRV9SRUwgKGlhLCA0KSwKKwkJb2Zmc2V0b2Yoc3RydWN0IHN5bV9jY2IsIHBoeXMucG0xLnJldCksCisJLyoKKwkgKiAgSWYgV1NSIGJpdCBpcyBzZXQsIGVpdGhlciBVQSBhbmQgUkJDIG1heSAKKwkgKiAgaGF2ZSB0byBiZSBjaGFuZ2VkIHdoZXRoZXIgdGhlIGRldmljZSB3YW50cyAKKwkgKiAgdG8gaWdub3JlIHRoaXMgcmVzaWR1ZSBvciBub3QuCisJICovCisJU0NSX0ZST01fUkVHIChzY250bDIpLAorCQkwLAorCVNDUl9DQUxMIF4gSUZUUlVFIChNQVNLIChXU1IsIFdTUikpLAorCQlQQUREUl9CIChwbV93c3JfaGFuZGxlKSwKKwkvKgorCSAqICBTYXZlIHRoZSByZW1haW5pbmcgYnl0ZSBjb3VudCwgdGhlIHVwZGF0ZWQgCisJICogIGFkZHJlc3MgYW5kIHRoZSByZXR1cm4gYWRkcmVzcy4KKwkgKi8KKwlTQ1JfU1RPUkVfUkVMIChyYmMsIDQpLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5wbTEuc2cuc2l6ZSksCisJU0NSX1NUT1JFX1JFTCAodWEsIDQpLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5wbTEuc2cuYWRkciksCisJLyoKKwkgKiAgU2V0IHRoZSBjdXJyZW50IHBvaW50ZXIgYXQgdGhlIFBNMSBEQVRBIG1pbmktc2NyaXB0LgorCSAqLworCVNDUl9MT0FEX0FCUyAoaWEsIDQpLAorCQlQQUREUl9CIChwbTFfZGF0YV9hZGRyKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAocG1fc2F2ZV9lbmQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUE1fV1NSX0hBTkRMRSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgUGhhc2UgbWlzbWF0Y2ggaGFuZGxpbmcgZnJvbSBTQ1JJUFQgd2l0aCBXU1Igc2V0LgorCSAqICBTdWNoIGEgY29uZGl0aW9uIGNhbiBvY2N1ciBpZiB0aGUgY2hpcCB3YW50cyB0byAKKwkgKiAgZXhlY3V0ZSBhIENITU9WKHNpemUgPiAxKSB3aGVuIHRoZSBXU1IgYml0IGlzIAorCSAqICBzZXQgYW5kIHRoZSB0YXJnZXQgY2hhbmdlcyBQSEFTRS4KKwkgKgorCSAqICBXZSBtdXN0IG1vdmUgdGhlIHJlc2lkdWFsIGJ5dGUgdG8gbWVtb3J5LgorCSAqCisJICogIFVBIGNvbnRhaW5zIGJpdCAwLi4zMSBvZiB0aGUgYWRkcmVzcyB0byAKKwkgKiAgbW92ZSB0aGUgcmVzaWR1YWwgYnl0ZS4KKwkgKiAgTW92ZSBpdCB0byB0aGUgdGFibGUgaW5kaXJlY3QuCisJICovCisJU0NSX1NUT1JFX1JFTCAodWEsIDQpLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMud3Jlc2lkLmFkZHIpLAorCS8qCisJICogIEluY3JlbWVudCBVQSAobW92ZSBhZGRyZXNzIHRvIG5leHQgcG9zaXRpb24pLgorCSAqLworCVNDUl9SRUdfUkVHICh1YSwgU0NSX0FERCwgMSksCisJCTAsCisJU0NSX1JFR19SRUcgKHVhMSwgU0NSX0FEREMsIDApLAorCQkwLAorCVNDUl9SRUdfUkVHICh1YTIsIFNDUl9BRERDLCAwKSwKKwkJMCwKKwlTQ1JfUkVHX1JFRyAodWEzLCBTQ1JfQUREQywgMCksCisJCTAsCisJLyoKKwkgKiAgQ29tcHV0ZSBTQ1JBVENIQSBhczoKKwkgKiAgLSBzaXplIHRvIHRyYW5zZmVyID0gMSBieXRlLgorCSAqICAtIGJpdCAyNC4uMzEgPSBoaWdoIGFkZHJlc3MgYml0IFszMi4uLjM5XS4KKwkgKi8KKwlTQ1JfTE9BRF9BQlMgKHNjcmF0Y2hhLCA0KSwKKwkJUEFERFJfQiAoemVybyksCisJU0NSX1JFR19SRUcgKHNjcmF0Y2hhLCBTQ1JfT1IsIDEpLAorCQkwLAorCVNDUl9GUk9NX1JFRyAocmJjMyksCisJCTAsCisJU0NSX1RPX1JFRyAoc2NyYXRjaGEzKSwKKwkJMCwKKwkvKgorCSAqICBNb3ZlIHRoaXMgdmFsdWUgdG8gdGhlIHRhYmxlIGluZGlyZWN0LgorCSAqLworCVNDUl9TVE9SRV9SRUwgKHNjcmF0Y2hhLCA0KSwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLndyZXNpZC5zaXplKSwKKwkvKgorCSAqICBXYWl0IGZvciBhIHZhbGlkIHBoYXNlLgorCSAqICBXaGlsZSB0ZXN0aW5nIHdpdGggYm9ndXMgUVVBTlRVTSBkcml2ZXMsIHRoZSBDMTAxMCAKKwkgKiAgc29tZXRpbWVzIHJhaXNlZCBhIHNwdXJpb3VzIHBoYXNlIG1pc21hdGNoIHdpdGggCisJICogIFdTUiBhbmQgdGhlIENITU9WKDEpIHRyaWdnZXJlZCBhbm90aGVyIFBNLgorCSAqICBXYWl0aW5nIGV4cGxpY2l0ZWx5IGZvciB0aGUgUEhBU0Ugc2VlbWVkIHRvIGF2b2lkIAorCSAqICB0aGUgbmVzdGVkIHBoYXNlIG1pc21hdGNoLiBCdHcsIHRoaXMgZGlkbid0IGhhcHBlbiAKKwkgKiAgdXNpbmcgbXkgSUJNIGRyaXZlcy4KKwkgKi8KKwlTQ1JfSlVNUFIgXiBJRkZBTFNFIChXSEVOIChTQ1JfREFUQV9JTikpLAorCQkwLAorCS8qCisJICogIFBlcmZvcm0gdGhlIG1vdmUgb2YgdGhlIHJlc2lkdWFsIGJ5dGUuCisJICovCisJU0NSX0NITU9WX1RCTCBeIFNDUl9EQVRBX0lOLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMud3Jlc2lkKSwKKwkvKgorCSAqICBXZSBjYW4gbm93IGhhbmRsZSB0aGUgcGhhc2UgbWlzbWF0Y2ggd2l0aCBVQSBmaXhlZC4KKwkgKiAgUkJDWzAuLjIzXT0wIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgZG9lcyBub3QgcmVxdWlyZSAKKwkgKiAgYSBQTSBjb250ZXh0LiBUaGUgQyBjb2RlIGFsc28gY2hlY2tzIGFnYWluc3QgdGhpcy4KKwkgKi8KKwlTQ1JfRlJPTV9SRUcgKHJiYyksCisJCTAsCisJU0NSX1JFVFVSTiBeIElGRkFMU0UgKERBVEEgKDApKSwKKwkJMCwKKwlTQ1JfRlJPTV9SRUcgKHJiYzEpLAorCQkwLAorCVNDUl9SRVRVUk4gXiBJRkZBTFNFIChEQVRBICgwKSksCisJCTAsCisJU0NSX0ZST01fUkVHIChyYmMyKSwKKwkJMCwKKwlTQ1JfUkVUVVJOIF4gSUZGQUxTRSAoREFUQSAoMCkpLAorCQkwLAorCS8qCisJICogIFJCQ1swLi4yM109MC4KKwkgKiAgTm90IG9ubHkgd2UgZG9ubm90IG5lZWQgYSBQTSBjb250ZXh0LCBidXQgdGhpcyB3b3VsZCAKKwkgKiAgbGVhZCB0byBhIGJvZ3VzIENITU9WKDApLiBUaGlzIGNvbmRpdGlvbiBtZWFucyB0aGF0IAorCSAqICB0aGUgcmVzaWR1YWwgd2FzIHRoZSBsYXN0IGJ5dGUgdG8gbW92ZSBmcm9tIHRoaXMgQ0hNT1YuCisJICogIFNvLCB3ZSBqdXN0IGhhdmUgdG8gbW92ZSB0aGUgY3VycmVudCBkYXRhIHNjcmlwdCBwb2ludGVyIAorCSAqICAoaS5lLiBURU1QKSB0byB0aGUgU0NSSVBUUyBhZGRyZXNzIGZvbGxvd2luZyB0aGUgCisJICogIGludGVycnVwdGVkIENITU9WIGFuZCBqdW1wIHRvIGRpc3BhdGNoZXIuCisJICogIElBIGNvbnRhaW5zIHRoZSBkYXRhIHBvaW50ZXIgdG8gc2F2ZS4KKwkgKi8KKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAocG1fc2F2ZV9lbmQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgV1NSX01BX0hFTFBFUiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgSGVscGVyIGZvciB0aGUgQyBjb2RlIHdoZW4gV1NSIGJpdCBpcyBzZXQuCisJICogIFBlcmZvcm0gdGhlIG1vdmUgb2YgdGhlIHJlc2lkdWFsIGJ5dGUuCisJICovCisJU0NSX0NITU9WX1RCTCBeIFNDUl9EQVRBX0lOLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMud3Jlc2lkKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorCisjaWZkZWYgU1lNX09QVF9IQU5ETEVfRElSX1VOS05PV04KK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfSU8gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFdlIGp1bXAgaGVyZSBpZiB0aGUgZGF0YSBkaXJlY3Rpb24gd2FzIHVua25vd24gYXQgdGhlIAorCSAqICB0aW1lIHdlIGhhZCB0byBxdWV1ZSB0aGUgY29tbWFuZCB0byB0aGUgc2NyaXB0cyBwcm9jZXNzb3IuCisJICogIFBvaW50ZXJzIGhhZCBiZWVuIHNldCBhcyBmb2xsb3cgaW4gdGhpcyBzaXR1YXRpb246CisJICogICAgc2F2ZXAgICAtLT4gICBEQVRBX0lPCisJICogICAgbGFzdHAgICAtLT4gICBzdGFydCBwb2ludGVyIHdoZW4gREFUQV9JTgorCSAqICAgIHdsYXN0cCAgLS0+ICAgc3RhcnQgcG9pbnRlciB3aGVuIERBVEFfT1VUCisJICogIFRoaXMgc2NyaXB0IHNldHMgc2F2ZXAgYW5kIGxhc3RwIGFjY29yZGluZyB0byB0aGUgCisJICogIGRpcmVjdGlvbiBjaG9zZW4gYnkgdGhlIHRhcmdldC4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoV0hFTiAoU0NSX0RBVEFfT1VUKSksCisJCVBBRERSX0IgKGRhdGFfaW9fb3V0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfSU9fSU4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIERpcmVjdGlvbiBpcyBEQVRBIElOLgorCSAqLworCVNDUl9MT0FEX1JFTCAgKHNjcmF0Y2hhLCA0KSwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLmhlYWQubGFzdHApLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQV9JT19DT00gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX1NUT1JFX1JFTCAoc2NyYXRjaGEsIDQpLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMuaGVhZC5zYXZlcCksCisKKwkvKgorCSAqICBKdW1wIHRvIHRoZSBTQ1JJUFRTIGFjY29yZGluZyB0byBhY3R1YWwgZGlyZWN0aW9uLgorCSAqLworCVNDUl9MT0FEX1JFTCAgKHRlbXAsIDQpLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMuaGVhZC5zYXZlcCksCisJU0NSX1JFVFVSTiwKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfSU9fT1VUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIERpcmVjdGlvbiBpcyBEQVRBIE9VVC4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoSEZfUkVHLCBTQ1JfQU5ELCAofkhGX0RBVEFfSU4pKSwKKwkJMCwKKwlTQ1JfTE9BRF9SRUwgIChzY3JhdGNoYSwgNCksCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5oZWFkLndsYXN0cCksCisJU0NSX1NUT1JFX1JFTCAoc2NyYXRjaGEsIDQpLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMuaGVhZC5sYXN0cCksCisJU0NSX0pVTVAsCisJCVBBRERSX0IoZGF0YV9pb19jb20pLAorI2VuZGlmIC8qIFNZTV9PUFRfSEFORExFX0RJUl9VTktOT1dOICovCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFpFUk8gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9EQVRBX1pFUk8sCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTQ1JBVENIID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfREFUQV9aRVJPLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUE0wX0RBVEFfQUREUiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0RBVEFfWkVSTywKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBNMV9EQVRBX0FERFIgPi0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9EQVRBX1pFUk8sCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBET05FX1BPUyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfREFUQV9aRVJPLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU1RBUlRQT1MgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0RBVEFfWkVSTywKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFRBUkdUQkwgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9EQVRBX1pFUk8sCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit9OworCitzdGF0aWMgc3RydWN0IFNZTV9GV1pfU0NSIFNZTV9GV1pfU0NSID0geworIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU05PT1BURVNUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL3sKKwkvKgorCSAqICBSZWFkIHRoZSB2YXJpYWJsZSBmcm9tIG1lbW9yeS4KKwkgKi8KKwlTQ1JfTE9BRF9SRUwgKHNjcmF0Y2hhLCA0KSwKKwkJb2Zmc2V0b2Yoc3RydWN0IHN5bV9oY2IsIHNjcmF0Y2gpLAorCS8qCisJICogIFdyaXRlIHRoZSB2YXJpYWJsZSB0byBtZW1vcnkuCisJICovCisJU0NSX1NUT1JFX1JFTCAodGVtcCwgNCksCisJCW9mZnNldG9mKHN0cnVjdCBzeW1faGNiLCBzY3JhdGNoKSwKKwkvKgorCSAqICBSZWFkIGJhY2sgdGhlIHZhcmlhYmxlIGZyb20gbWVtb3J5LgorCSAqLworCVNDUl9MT0FEX1JFTCAodGVtcCwgNCksCisJCW9mZnNldG9mKHN0cnVjdCBzeW1faGNiLCBzY3JhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNOT09QRU5EID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIEFuZCBzdG9wLgorCSAqLworCVNDUl9JTlQsCisJCTk5LAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTw+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fZ2x1ZS5jIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9nbHVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFkZmY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fZ2x1ZS5jCkBAIC0wLDAgKzEsMjE5NiBAQAorLyoKKyAqIERldmljZSBkcml2ZXIgZm9yIHRoZSBTWU1CSU9TL0xTSUxPR0lDIDUzQzhYWCBhbmQgNTNDMTAxMCBmYW1pbHkgCisgKiBvZiBQQ0ktU0NTSSBJTyBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxICBHZXJhcmQgUm91ZGllciA8Z3JvdWRpZXJAZnJlZS5mcj4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA1ICBNYXR0aGV3IFdpbGNveCA8bWF0dGhld0B3aWwuY3g+CisgKgorICogVGhpcyBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBMaW51eCBzeW01M2M4eHggZHJpdmVyLgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgIEdlcmFyZCBSb3VkaWVyCisgKgorICogVGhlIHN5bTUzYzh4eCBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBuY3I1M2M4eHggZHJpdmVyIHRoYXQgaGFkIGJlZW4gCisgKiBhIHBvcnQgb2YgdGhlIEZyZWVCU0QgbmNyIGRyaXZlciB0byBMaW51eC0xLjIuMTMuCisgKgorICogVGhlIG9yaWdpbmFsIG5jciBkcml2ZXIgaGFzIGJlZW4gd3JpdHRlbiBmb3IgMzg2YnNkIGFuZCBGcmVlQlNEIGJ5CisgKiAgICAgICAgIFdvbGZnYW5nIFN0YW5nbG1laWVyICAgICAgICA8d29sZkBjb2xvZ25lLmRlPgorICogICAgICAgICBTdGVmYW4gRXNzZXIgICAgICAgICAgICAgICAgPHNlQG1pLlVuaS1Lb2Vsbi5kZT4KKyAqIENvcHlyaWdodCAoQykgMTk5NCAgV29sZmdhbmcgU3RhbmdsbWVpZXIKKyAqCisgKiBPdGhlciBtYWpvciBjb250cmlidXRpb25zOgorICoKKyAqIE5WUkFNIGRldGVjdGlvbiBhbmQgcmVhZGluZy4KKyAqIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIFdhbHRoYW0gPGRvcm1vdXNlQGZhcnNyb2J0LmRlbW9uLmNvLnVrPgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlICJzeW1fZ2x1ZS5oIgorI2luY2x1ZGUgInN5bV9udnJhbS5oIgorCisjZGVmaW5lIE5BTUU1M0MJCSJzeW01M2MiCisjZGVmaW5lIE5BTUU1M0M4WFgJInN5bTUzYzh4eCIKKworLyogU1BBUkMganVzdCBoYXMgdG8gYmUgZGlmZmVyZW50IC4uLiAqLworI2lmZGVmIF9fc3BhcmNfXworI2RlZmluZSBJUlFfRk1UICIlcyIKKyNkZWZpbmUgSVJRX1BSTSh4KSBfX2lycV9pdG9hKHgpCisjZWxzZQorI2RlZmluZSBJUlFfRk1UICIlZCIKKyNkZWZpbmUgSVJRX1BSTSh4KSAoeCkKKyNlbmRpZgorCitzdHJ1Y3Qgc3ltX2RyaXZlcl9zZXR1cCBzeW1fZHJpdmVyX3NldHVwID0gU1lNX0xJTlVYX0RSSVZFUl9TRVRVUDsKK3Vuc2lnbmVkIGludCBzeW1fZGVidWdfZmxhZ3MgPSAwOworCitzdGF0aWMgY2hhciAqZXhjbF9zdHJpbmc7CitzdGF0aWMgY2hhciAqc2FmZV9zdHJpbmc7Cittb2R1bGVfcGFyYW1fbmFtZWQoY21kX3Blcl9sdW4sIHN5bV9kcml2ZXJfc2V0dXAubWF4X3RhZywgdXNob3J0LCAwKTsKK21vZHVsZV9wYXJhbV9zdHJpbmcodGFnX2N0cmwsIHN5bV9kcml2ZXJfc2V0dXAudGFnX2N0cmwsIDEwMCwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoYnVyc3QsIHN5bV9kcml2ZXJfc2V0dXAuYnVyc3Rfb3JkZXIsIGJ5dGUsIDApOworbW9kdWxlX3BhcmFtX25hbWVkKGxlZCwgc3ltX2RyaXZlcl9zZXR1cC5zY3NpX2xlZCwgYnl0ZSwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGlmZiwgc3ltX2RyaXZlcl9zZXR1cC5zY3NpX2RpZmYsIGJ5dGUsIDApOworbW9kdWxlX3BhcmFtX25hbWVkKGlycW0sIHN5bV9kcml2ZXJfc2V0dXAuaXJxX21vZGUsIGJ5dGUsIDApOworbW9kdWxlX3BhcmFtX25hbWVkKGJ1c2Noaywgc3ltX2RyaXZlcl9zZXR1cC5zY3NpX2J1c19jaGVjaywgYnl0ZSwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoaG9zdGlkLCBzeW1fZHJpdmVyX3NldHVwLmhvc3RfaWQsIGJ5dGUsIDApOworbW9kdWxlX3BhcmFtX25hbWVkKHZlcmIsIHN5bV9kcml2ZXJfc2V0dXAudmVyYm9zZSwgYnl0ZSwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIHN5bV9kZWJ1Z19mbGFncywgdWludCwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoc2V0dGxlLCBzeW1fZHJpdmVyX3NldHVwLnNldHRsZV9kZWxheSwgYnl0ZSwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQobnZyYW0sIHN5bV9kcml2ZXJfc2V0dXAudXNlX252cmFtLCBieXRlLCAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZChleGNsLCBleGNsX3N0cmluZywgY2hhcnAsIDApOworbW9kdWxlX3BhcmFtX25hbWVkKHNhZmUsIHNhZmVfc3RyaW5nLCBjaGFycCwgMCk7CisKK01PRFVMRV9QQVJNX0RFU0MoY21kX3Blcl9sdW4sICJUaGUgbWF4aW11bSBudW1iZXIgb2YgdGFncyB0byB1c2UgYnkgZGVmYXVsdCIpOworTU9EVUxFX1BBUk1fREVTQyh0YWdfY3RybCwgIk1vcmUgZGV0YWlsZWQgY29udHJvbCBvdmVyIHRhZ3MgcGVyIExVTiIpOworTU9EVUxFX1BBUk1fREVTQyhidXJzdCwgIk1heGltdW0gYnVyc3QuICAwIHRvIGRpc2FibGUsIDI1NSB0byByZWFkIGZyb20gcmVnaXN0ZXJzIik7CitNT0RVTEVfUEFSTV9ERVNDKGxlZCwgIlNldCB0byAxIHRvIGVuYWJsZSBMRUQgc3VwcG9ydCIpOworTU9EVUxFX1BBUk1fREVTQyhkaWZmLCAiMCBmb3Igbm8gZGlmZmVyZW50aWFsIG1vZGUsIDEgZm9yIEJJT1MsIDIgZm9yIGFsd2F5cywgMyBmb3Igbm90IEdQSU8zIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycW0sICIwIGZvciBvcGVuIGRyYWluLCAxIHRvIGxlYXZlIGFsb25lLCAyIGZvciB0b3RlbSBwb2xlIik7CitNT0RVTEVfUEFSTV9ERVNDKGJ1c2NoaywgIjAgdG8gbm90IGNoZWNrLCAxIGZvciBkZXRhY2ggb24gZXJyb3IsIDIgZm9yIHdhcm4gb24gZXJyb3IiKTsKK01PRFVMRV9QQVJNX0RFU0MoaG9zdGlkLCAiVGhlIFNDU0kgSUQgdG8gdXNlIGZvciB0aGUgaG9zdCBhZGFwdGVycyIpOworTU9EVUxFX1BBUk1fREVTQyh2ZXJiLCAiMCBmb3IgbWluaW1hbCB2ZXJib3NpdHksIDEgZm9yIG5vcm1hbCwgMiBmb3IgZXhjZXNzaXZlIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiU2V0IGJpdHMgdG8gZW5hYmxlIGRlYnVnZ2luZyIpOworTU9EVUxFX1BBUk1fREVTQyhzZXR0bGUsICJTZXR0bGUgZGVsYXkgaW4gc2Vjb25kcy4gIERlZmF1bHQgMyIpOworTU9EVUxFX1BBUk1fREVTQyhudnJhbSwgIk9wdGlvbiBjdXJyZW50bHkgbm90IHVzZWQiKTsKK01PRFVMRV9QQVJNX0RFU0MoZXhjbCwgIkxpc3QgaW9wb3J0IGFkZHJlc3NlcyBoZXJlIHRvIHByZXZlbnQgY29udHJvbGxlcnMgZnJvbSBiZWluZyBhdHRhY2hlZCIpOworTU9EVUxFX1BBUk1fREVTQyhzYWZlLCAiU2V0IG90aGVyIHNldHRpbmdzIHRvIGEgXCJzYWZlIG1vZGVcIiIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihTWU1fVkVSU0lPTik7CitNT0RVTEVfQVVUSE9SKCJNYXR0aGV3IFdpbGNveCA8bWF0dGhld0B3aWwuY3g+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5DUiwgU3ltYmlvcyBhbmQgTFNJIDh4eCBhbmQgMTAxMCBQQ0kgU0NTSSBhZGFwdGVycyIpOworCitzdGF0aWMgdm9pZCBzeW0yX3NldHVwX3BhcmFtcyh2b2lkKQoreworCWNoYXIgKnAgPSBleGNsX3N0cmluZzsKKwlpbnQgeGkgPSAwOworCisJd2hpbGUgKHAgJiYgKHhpIDwgOCkpIHsKKwkJY2hhciAqbmV4dF9wOworCQlpbnQgdmFsID0gKGludCkgc2ltcGxlX3N0cnRvdWwocCwgJm5leHRfcCwgMCk7CisJCXN5bV9kcml2ZXJfc2V0dXAuZXhjbHVkZXNbeGkrK10gPSB2YWw7CisJCXAgPSBuZXh0X3A7CisJfQorCisJaWYgKHNhZmVfc3RyaW5nKSB7CisJCWlmICgqc2FmZV9zdHJpbmcgPT0gJ3knKSB7CisJCQlzeW1fZHJpdmVyX3NldHVwLm1heF90YWcgPSAwOworCQkJc3ltX2RyaXZlcl9zZXR1cC5idXJzdF9vcmRlciA9IDA7CisJCQlzeW1fZHJpdmVyX3NldHVwLnNjc2lfbGVkID0gMDsKKwkJCXN5bV9kcml2ZXJfc2V0dXAuc2NzaV9kaWZmID0gMTsKKwkJCXN5bV9kcml2ZXJfc2V0dXAuaXJxX21vZGUgPSAwOworCQkJc3ltX2RyaXZlcl9zZXR1cC5zY3NpX2J1c19jaGVjayA9IDI7CisJCQlzeW1fZHJpdmVyX3NldHVwLmhvc3RfaWQgPSA3OworCQkJc3ltX2RyaXZlcl9zZXR1cC52ZXJib3NlID0gMjsKKwkJCXN5bV9kcml2ZXJfc2V0dXAuc2V0dGxlX2RlbGF5ID0gMTA7CisJCQlzeW1fZHJpdmVyX3NldHVwLnVzZV9udnJhbSA9IDE7CisJCX0gZWxzZSBpZiAoKnNhZmVfc3RyaW5nICE9ICduJykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBOQU1FNTNDOFhYICJJZ25vcmluZyBwYXJhbWV0ZXIgJXMiCisJCQkJCSIgcGFzc2VkIHRvIHNhZmUgb3B0aW9uIiwgc2FmZV9zdHJpbmcpOworCQl9CisJfQorfQorCisvKgorICogV2UgdXNlZCB0byB0cnkgdG8gZGVhbCB3aXRoIDY0LWJpdCBCQVJzIGhlcmUsIGJ1dCBkb24ndCBhbnkgbW9yZS4KKyAqIFRoZXJlIGFyZSBtYW55IHBhcnRzIG9mIHRoaXMgZHJpdmVyIHdoaWNoIHdvdWxkIG5lZWQgdG8gYmUgbW9kaWZpZWQKKyAqIHRvIGhhbmRsZSBhIDY0LWJpdCBiYXNlIGFkZHJlc3MsIGluY2x1ZGluZyBzY3JpcHRzLiAgSSdtIHVuY29tZm9ydGFibGUKKyAqIHdpdGggbWFraW5nIHRob3NlIGNoYW5nZXMgd2hlbiBJIGhhdmUgbm8gd2F5IG9mIHRlc3RpbmcgaXQsIHNvIEknbQorICoganVzdCBnb2luZyB0byBkaXNhYmxlIGl0LgorICoKKyAqIE5vdGUgdGhhdCBzb21lIG1hY2hpbmVzIChlZyBIUCByeDg2MjAgYW5kIFN1cGVyZG9tZSkgaGF2ZSBidXMgYWRkcmVzc2VzCisgKiBiZWxvdyA0R0IgYW5kIHBoeXNpY2FsIGFkZHJlc3NlcyBhYm92ZSA0R0IuICBUaGVzZSB3aWxsIGNvbnRpbnVlIHRvIHdvcmsuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0CitwY2lfZ2V0X2Jhc2VfYWRkcmVzcyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGluZGV4LCB1bnNpZ25lZCBsb25nICpiYXNlcCkKK3sKKwl1MzIgdG1wOworCXVuc2lnbmVkIGxvbmcgYmFzZTsKKyNkZWZpbmUgUENJX0JBUl9PRkZTRVQoaW5kZXgpIChQQ0lfQkFTRV9BRERSRVNTXzAgKyAoaW5kZXg8PDIpKQorCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9CQVJfT0ZGU0VUKGluZGV4KyspLCAmdG1wKTsKKwliYXNlID0gdG1wOworCWlmICgodG1wICYgMHg3KSA9PSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0KSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfQkFSX09GRlNFVChpbmRleCsrKSwgJnRtcCk7CisJCWlmICh0bXAgPiAwKQorCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJCQVIgJWQgaXMgNjQtYml0LCBkaXNhYmxpbmdcbiIsIGluZGV4IC0gMSk7CisJCWJhc2UgPSAwOworCX0KKworCWlmICgoYmFzZSAmIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0UpID09IFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8pIHsKKwkJYmFzZSAmPSBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7CisJfSBlbHNlIHsKKwkJYmFzZSAmPSBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworCX0KKworCSpiYXNlcCA9IGJhc2U7CisJcmV0dXJuIGluZGV4OworI3VuZGVmIFBDSV9CQVJfT0ZGU0VUCit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKnN5bTJfdHJhbnNwb3J0X3RlbXBsYXRlID0gTlVMTDsKKworLyoKKyAqICBVc2VkIGJ5IHRoZSBlaCB0aHJlYWQgdG8gd2FpdCBmb3IgY29tbWFuZCBjb21wbGV0aW9uLgorICogIEl0IGlzIGFsbG9jYXRlZCBvbiB0aGUgZWggdGhyZWFkIHN0YWNrLgorICovCitzdHJ1Y3Qgc3ltX2VoX3dhaXQgeworCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJdm9pZCAoKm9sZF9kb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopOworCWludCB0b19kbzsKKwlpbnQgdGltZWRfb3V0OworfTsKKworLyoKKyAqICBEcml2ZXIgcHJpdmF0ZSBhcmVhIGluIHRoZSBTQ1NJIGNvbW1hbmQgc3RydWN0dXJlLgorICovCitzdHJ1Y3Qgc3ltX3VjbWQgewkJLyogT3ZlcnJpZGUgdGhlIFNDU0kgcG9pbnRlciBzdHJ1Y3R1cmUgKi8KKwlkbWFfYWRkcl90IGRhdGFfbWFwcGluZzsKKwl1X2NoYXIJZGF0YV9tYXBwZWQ7CisJc3RydWN0IHN5bV9laF93YWl0ICplaF93YWl0OworfTsKKworI2RlZmluZSBTWU1fVUNNRF9QVFIoY21kKSAgKChzdHJ1Y3Qgc3ltX3VjbWQgKikoJihjbWQpLT5TQ3ApKQorI2RlZmluZSBTWU1fU09GVENfUFRSKGNtZCkgc3ltX2dldF9oY2IoY21kLT5kZXZpY2UtPmhvc3QpCisKK3N0YXRpYyB2b2lkIF9fdW5tYXBfc2NzaV9kYXRhKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJaW50IGRtYV9kaXIgPSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uOworCisJc3dpdGNoKFNZTV9VQ01EX1BUUihjbWQpLT5kYXRhX21hcHBlZCkgeworCWNhc2UgMjoKKwkJcGNpX3VubWFwX3NnKHBkZXYsIGNtZC0+YnVmZmVyLCBjbWQtPnVzZV9zZywgZG1hX2Rpcik7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcGNpX3VubWFwX3NpbmdsZShwZGV2LCBTWU1fVUNNRF9QVFIoY21kKS0+ZGF0YV9tYXBwaW5nLAorCQkJCSBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgZG1hX2Rpcik7CisJCWJyZWFrOworCX0KKwlTWU1fVUNNRF9QVFIoY21kKS0+ZGF0YV9tYXBwZWQgPSAwOworfQorCitzdGF0aWMgZG1hX2FkZHJfdCBfX21hcF9zY3NpX3NpbmdsZV9kYXRhKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJZG1hX2FkZHJfdCBtYXBwaW5nOworCWludCBkbWFfZGlyID0gY21kLT5zY19kYXRhX2RpcmVjdGlvbjsKKworCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShwZGV2LCBjbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCSBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgZG1hX2Rpcik7CisJaWYgKG1hcHBpbmcpIHsKKwkJU1lNX1VDTURfUFRSKGNtZCktPmRhdGFfbWFwcGVkICA9IDE7CisJCVNZTV9VQ01EX1BUUihjbWQpLT5kYXRhX21hcHBpbmcgPSBtYXBwaW5nOworCX0KKworCXJldHVybiBtYXBwaW5nOworfQorCitzdGF0aWMgaW50IF9fbWFwX3Njc2lfc2dfZGF0YShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCWludCB1c2Vfc2c7CisJaW50IGRtYV9kaXIgPSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uOworCisJdXNlX3NnID0gcGNpX21hcF9zZyhwZGV2LCBjbWQtPmJ1ZmZlciwgY21kLT51c2Vfc2csIGRtYV9kaXIpOworCWlmICh1c2Vfc2cgPiAwKSB7CisJCVNZTV9VQ01EX1BUUihjbWQpLT5kYXRhX21hcHBlZCAgPSAyOworCQlTWU1fVUNNRF9QVFIoY21kKS0+ZGF0YV9tYXBwaW5nID0gdXNlX3NnOworCX0KKworCXJldHVybiB1c2Vfc2c7Cit9CisKKyNkZWZpbmUgdW5tYXBfc2NzaV9kYXRhKG5wLCBjbWQpCVwKKwkJX191bm1hcF9zY3NpX2RhdGEobnAtPnMuZGV2aWNlLCBjbWQpCisjZGVmaW5lIG1hcF9zY3NpX3NpbmdsZV9kYXRhKG5wLCBjbWQpCVwKKwkJX19tYXBfc2NzaV9zaW5nbGVfZGF0YShucC0+cy5kZXZpY2UsIGNtZCkKKyNkZWZpbmUgbWFwX3Njc2lfc2dfZGF0YShucCwgY21kKQlcCisJCV9fbWFwX3Njc2lfc2dfZGF0YShucC0+cy5kZXZpY2UsIGNtZCkKKy8qCisgKiAgQ29tcGxldGUgYSBwZW5kaW5nIENBTSBDQ0IuCisgKi8KK3ZvaWQgc3ltX3hwdF9kb25lKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXVubWFwX3Njc2lfZGF0YShucCwgY21kKTsKKwljbWQtPnNjc2lfZG9uZShjbWQpOworfQorCitzdGF0aWMgdm9pZCBzeW1feHB0X2RvbmUyKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY21kLCBpbnQgY2FtX3N0YXR1cykKK3sKKwlzeW1fc2V0X2NhbV9zdGF0dXMoY21kLCBjYW1fc3RhdHVzKTsKKwlzeW1feHB0X2RvbmUobnAsIGNtZCk7Cit9CisKKworLyoKKyAqICBUZWxsIHRoZSBTQ1NJIGxheWVyIGFib3V0IGEgQlVTIFJFU0VULgorICovCit2b2lkIHN5bV94cHRfYXN5bmNfYnVzX3Jlc2V0KHN0cnVjdCBzeW1faGNiICpucCkKK3sKKwlwcmludGZfbm90aWNlKCIlczogU0NTSSBCVVMgaGFzIGJlZW4gcmVzZXQuXG4iLCBzeW1fbmFtZShucCkpOworCW5wLT5zLnNldHRsZV90aW1lID0gamlmZmllcyArIHN5bV9kcml2ZXJfc2V0dXAuc2V0dGxlX2RlbGF5ICogSFo7CisJbnAtPnMuc2V0dGxlX3RpbWVfdmFsaWQgPSAxOworCWlmIChzeW1fdmVyYm9zZSA+PSAyKQorCQlwcmludGZfaW5mbygiJXM6IGNvbW1hbmQgcHJvY2Vzc2luZyBzdXNwZW5kZWQgZm9yICVkIHNlY29uZHNcbiIsCisJCQkgICAgc3ltX25hbWUobnApLCBzeW1fZHJpdmVyX3NldHVwLnNldHRsZV9kZWxheSk7Cit9CisKKy8qCisgKiAgVGVsbCB0aGUgU0NTSSBsYXllciBhYm91dCBhIEJVUyBERVZJQ0UgUkVTRVQgbWVzc2FnZSBzZW50LgorICovCit2b2lkIHN5bV94cHRfYXN5bmNfc2VudF9iZHIoc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgdGFyZ2V0KQoreworCXByaW50Zl9ub3RpY2UoIiVzOiBUQVJHRVQgJWQgaGFzIGJlZW4gcmVzZXQuXG4iLCBzeW1fbmFtZShucCksIHRhcmdldCk7Cit9CisKKy8qCisgKiAgQ2hvb3NlIHRoZSBtb3JlIGFwcHJvcHJpYXRlIENBTSBzdGF0dXMgaWYgCisgKiAgdGhlIElPIGVuY291bnRlcmVkIGFuIGV4dGVuZGVkIGVycm9yLgorICovCitzdGF0aWMgaW50IHN5bV94ZXJyX2NhbV9zdGF0dXMoaW50IGNhbV9zdGF0dXMsIGludCB4X3N0YXR1cykKK3sKKwlpZiAoeF9zdGF0dXMpIHsKKwkJaWYJKHhfc3RhdHVzICYgWEVfUEFSSVRZX0VSUikKKwkJCWNhbV9zdGF0dXMgPSBESURfUEFSSVRZOworCQllbHNlIGlmCSh4X3N0YXR1cyAmKFhFX0VYVFJBX0RBVEF8WEVfU09ETF9VTlJVTnxYRV9TV0lERV9PVlJVTikpCisJCQljYW1fc3RhdHVzID0gRElEX0VSUk9SOworCQllbHNlIGlmCSh4X3N0YXR1cyAmIFhFX0JBRF9QSEFTRSkKKwkJCWNhbV9zdGF0dXMgPSBESURfRVJST1I7CisJCWVsc2UKKwkJCWNhbV9zdGF0dXMgPSBESURfRVJST1I7CisJfQorCXJldHVybiBjYW1fc3RhdHVzOworfQorCisvKgorICogIEJ1aWxkIENBTSByZXN1bHQgZm9yIGEgZmFpbGVkIG9yIGF1dG8tc2Vuc2VkIElPLgorICovCit2b2lkIHN5bV9zZXRfY2FtX3Jlc3VsdF9lcnJvcihzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fY2NiICpjcCwgaW50IHJlc2lkKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IGNwLT5jbWQ7CisJdV9pbnQgY2FtX3N0YXR1cywgc2NzaV9zdGF0dXMsIGRydl9zdGF0dXM7CisKKwlkcnZfc3RhdHVzICA9IDA7CisJY2FtX3N0YXR1cyAgPSBESURfT0s7CisJc2NzaV9zdGF0dXMgPSBjcC0+c3Nzc19zdGF0dXM7CisKKwlpZiAoY3AtPmhvc3RfZmxhZ3MgJiBIRl9TRU5TRSkgeworCQlzY3NpX3N0YXR1cyA9IGNwLT5zdl9zY3NpX3N0YXR1czsKKwkJcmVzaWQgPSBjcC0+c3ZfcmVzaWQ7CisJCWlmIChzeW1fdmVyYm9zZSAmJiBjcC0+c3ZfeGVycl9zdGF0dXMpCisJCQlzeW1fcHJpbnRfeGVycihjbWQsIGNwLT5zdl94ZXJyX3N0YXR1cyk7CisJCWlmIChjcC0+aG9zdF9zdGF0dXMgPT0gSFNfQ09NUExFVEUgJiYKKwkJICAgIGNwLT5zc3NzX3N0YXR1cyA9PSBTX0dPT0QgJiYKKwkJICAgIGNwLT54ZXJyX3N0YXR1cyA9PSAwKSB7CisJCQljYW1fc3RhdHVzID0gc3ltX3hlcnJfY2FtX3N0YXR1cyhESURfT0ssCisJCQkJCQkJIGNwLT5zdl94ZXJyX3N0YXR1cyk7CisJCQlkcnZfc3RhdHVzID0gRFJJVkVSX1NFTlNFOworCQkJLyoKKwkJCSAqICBCb3VuY2UgYmFjayB0aGUgc2Vuc2UgZGF0YSB0byB1c2VyLgorCQkJICovCisJCQltZW1zZXQoJmNtZC0+c2Vuc2VfYnVmZmVyLCAwLCBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpKTsKKwkJCW1lbWNweShjbWQtPnNlbnNlX2J1ZmZlciwgY3AtPnNuc19iYnVmLAorCQkJICAgICAgbWluKHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlciksCisJCQkJICAoc2l6ZV90KVNZTV9TTlNfQkJVRl9MRU4pKTsKKyNpZiAwCisJCQkvKgorCQkJICogIElmIHRoZSBkZXZpY2UgcmVwb3J0cyBhIFVOSVQgQVRURU5USU9OIGNvbmRpdGlvbiAKKwkJCSAqICBkdWUgdG8gYSBSRVNFVCBjb25kaXRpb24sIHdlIHNob3VsZCBjb25zaWRlciBhbGwgCisJCQkgKiAgZGlzY29ubmVjdCBDQ0JzIGZvciB0aGlzIHVuaXQgYXMgYWJvcnRlZC4KKwkJCSAqLworCQkJaWYgKDEpIHsKKwkJCQl1X2NoYXIgKnA7CisJCQkJcCAgPSAodV9jaGFyICopIGNtZC0+c2Vuc2VfZGF0YTsKKwkJCQlpZiAocFswXT09MHg3MCAmJiBwWzJdPT0weDYgJiYgcFsxMl09PTB4MjkpCisJCQkJCXN5bV9jbGVhcl90YXNrcyhucCwgRElEX0FCT1JULAorCQkJCQkJCWNwLT50YXJnZXQsY3AtPmx1biwgLTEpOworCQkJfQorI2VuZGlmCisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogRXJyb3IgcmV0dXJuIGZyb20gb3VyIGludGVybmFsIHJlcXVlc3Qgc2Vuc2UuICBUaGlzCisJCQkgKiBpcyBiYWQ6IHdlIG11c3QgY2xlYXIgdGhlIGNvbnRpbmdlbnQgYWxsZWdpYW5jZQorCQkJICogY29uZGl0aW9uIG90aGVyd2lzZSB0aGUgZGV2aWNlIHdpbGwgYWx3YXlzIHJldHVybgorCQkJICogQlVTWS4gIFVzZSBhIGJpZyBzdGljay4KKwkJCSAqLworCQkJc3ltX3Jlc2V0X3Njc2lfdGFyZ2V0KG5wLCBjbWQtPmRldmljZS0+aWQpOworCQkJY2FtX3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJfQorCX0gZWxzZSBpZiAoY3AtPmhvc3Rfc3RhdHVzID09IEhTX0NPTVBMRVRFKSAJLyogQmFkIFNDU0kgc3RhdHVzICovCisJCWNhbV9zdGF0dXMgPSBESURfT0s7CisJZWxzZSBpZiAoY3AtPmhvc3Rfc3RhdHVzID09IEhTX1NFTF9USU1FT1VUKQkvKiBTZWxlY3Rpb24gdGltZW91dCAqLworCQljYW1fc3RhdHVzID0gRElEX05PX0NPTk5FQ1Q7CisJZWxzZSBpZiAoY3AtPmhvc3Rfc3RhdHVzID09IEhTX1VORVhQRUNURUQpCS8qIFVuZXhwZWN0ZWQgQlVTIEZSRUUqLworCQljYW1fc3RhdHVzID0gRElEX0VSUk9SOworCWVsc2UgewkJCQkJCS8qIEV4dGVuZGVkIGVycm9yICovCisJCWlmIChzeW1fdmVyYm9zZSkgeworCQkJc3ltX3ByaW50X2FkZHIoY21kLCAiQ09NTUFORCBGQUlMRUQgKCV4ICV4ICV4KS5cbiIsCisJCQkJY3AtPmhvc3Rfc3RhdHVzLCBjcC0+c3Nzc19zdGF0dXMsCisJCQkJY3AtPnhlcnJfc3RhdHVzKTsKKwkJfQorCQkvKgorCQkgKiAgU2V0IHRoZSBtb3N0IGFwcHJvcHJpYXRlIHZhbHVlIGZvciBDQU0gc3RhdHVzLgorCQkgKi8KKwkJY2FtX3N0YXR1cyA9IHN5bV94ZXJyX2NhbV9zdGF0dXMoRElEX0VSUk9SLCBjcC0+eGVycl9zdGF0dXMpOworCX0KKwljbWQtPnJlc2lkID0gcmVzaWQ7CisJY21kLT5yZXN1bHQgPSAoZHJ2X3N0YXR1cyA8PCAyNCkgKyAoY2FtX3N0YXR1cyA8PCAxNikgKyBzY3NpX3N0YXR1czsKK30KKworCisvKgorICogIEJ1aWxkIHRoZSBzY2F0dGVyL2dhdGhlciBhcnJheSBmb3IgYW4gSS9PLgorICovCisKK3N0YXRpYyBpbnQgc3ltX3NjYXR0ZXJfbm9fc2dsaXN0KHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV9jY2IgKmNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IHN5bV90Ymxtb3ZlICpkYXRhID0gJmNwLT5waHlzLmRhdGFbU1lNX0NPTkZfTUFYX1NHLTFdOworCWludCBzZWdtZW50OworCisJY3AtPmRhdGFfbGVuID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisKKwlpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKKwkJZG1hX2FkZHJfdCBiYWRkciA9IG1hcF9zY3NpX3NpbmdsZV9kYXRhKG5wLCBjbWQpOworCQlpZiAoYmFkZHIpIHsKKwkJCXN5bV9idWlsZF9zZ2UobnAsIGRhdGEsIGJhZGRyLCBjbWQtPnJlcXVlc3RfYnVmZmxlbik7CisJCQlzZWdtZW50ID0gMTsKKwkJfSBlbHNlIHsKKwkJCXNlZ21lbnQgPSAtMjsKKwkJfQorCX0gZWxzZSB7CisJCXNlZ21lbnQgPSAwOworCX0KKworCXJldHVybiBzZWdtZW50OworfQorCitzdGF0aWMgaW50IHN5bV9zY2F0dGVyKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV9jY2IgKmNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJaW50IHNlZ21lbnQ7CisJaW50IHVzZV9zZyA9IChpbnQpIGNtZC0+dXNlX3NnOworCisJY3AtPmRhdGFfbGVuID0gMDsKKworCWlmICghdXNlX3NnKQorCQlzZWdtZW50ID0gc3ltX3NjYXR0ZXJfbm9fc2dsaXN0KG5wLCBjcCwgY21kKTsKKwllbHNlIGlmICgodXNlX3NnID0gbWFwX3Njc2lfc2dfZGF0YShucCwgY21kKSkgPiAwKSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2NhdHRlciA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPmJ1ZmZlcjsKKwkJc3RydWN0IHN5bV90Ymxtb3ZlICpkYXRhOworCisJCWlmICh1c2Vfc2cgPiBTWU1fQ09ORl9NQVhfU0cpIHsKKwkJCXVubWFwX3Njc2lfZGF0YShucCwgY21kKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWRhdGEgPSAmY3AtPnBoeXMuZGF0YVtTWU1fQ09ORl9NQVhfU0cgLSB1c2Vfc2ddOworCisJCWZvciAoc2VnbWVudCA9IDA7IHNlZ21lbnQgPCB1c2Vfc2c7IHNlZ21lbnQrKykgeworCQkJZG1hX2FkZHJfdCBiYWRkciA9IHNnX2RtYV9hZGRyZXNzKCZzY2F0dGVyW3NlZ21lbnRdKTsKKwkJCXVuc2lnbmVkIGludCBsZW4gPSBzZ19kbWFfbGVuKCZzY2F0dGVyW3NlZ21lbnRdKTsKKworCQkJc3ltX2J1aWxkX3NnZShucCwgJmRhdGFbc2VnbWVudF0sIGJhZGRyLCBsZW4pOworCQkJY3AtPmRhdGFfbGVuICs9IGxlbjsKKwkJfQorCX0gZWxzZSB7CisJCXNlZ21lbnQgPSAtMjsKKwl9CisKKwlyZXR1cm4gc2VnbWVudDsKK30KKworLyoKKyAqICBRdWV1ZSBhIFNDU0kgY29tbWFuZC4KKyAqLworc3RhdGljIGludCBzeW1fcXVldWVfY29tbWFuZChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBjbWQtPmRldmljZTsKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHA7CisJc3RydWN0IHN5bV9sY2IgKmxwOworCXN0cnVjdCBzeW1fY2NiICpjcDsKKwlpbnQJb3JkZXI7CisKKwkvKgorCSAqICBNaW5pbWFsIGNoZWNraW5ncywgc28gdGhhdCB3ZSB3aWxsIG5vdCAKKwkgKiAgZ28gb3V0c2lkZSBvdXIgdGFibGVzLgorCSAqLworCWlmIChzZGV2LT5pZCA9PSBucC0+bXlhZGRyIHx8CisJICAgIHNkZXYtPmlkID49IFNZTV9DT05GX01BWF9UQVJHRVQgfHwKKwkgICAgc2Rldi0+bHVuID49IFNZTV9DT05GX01BWF9MVU4pIHsKKwkJc3ltX3hwdF9kb25lMihucCwgY21kLCBDQU1fREVWX05PVF9USEVSRSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogIFJldHJpZXZlIHRoZSB0YXJnZXQgZGVzY3JpcHRvci4KKwkgKi8KKwl0cCA9ICZucC0+dGFyZ2V0W3NkZXYtPmlkXTsKKworCS8qCisJICogIENvbXBsZXRlIHRoZSAxc3QgSU5RVUlSWSBjb21tYW5kIHdpdGggZXJyb3IgCisJICogIGNvbmRpdGlvbiBpZiB0aGUgZGV2aWNlIGlzIGZsYWdnZWQgTk9TQ0FOIAorCSAqICBhdCBCT09UIGluIHRoZSBOVlJBTS4gVGhpcyBtYXkgc3BlZWQgdXAgCisJICogIHRoZSBib290IGFuZCBtYWludGFpbiBjb2hlcmVuY3kgd2l0aCBCSU9TIAorCSAqICBkZXZpY2UgbnVtYmVyaW5nLiBDbGVhcmluZyB0aGUgZmxhZyBhbGxvd3MgCisJICogIHVzZXIgdG8gcmVzY2FuIHNraXBwZWQgZGV2aWNlcyBsYXRlci4KKwkgKiAgV2UgYWxzbyByZXR1cm4gZXJyb3IgZm9yIGRldmljZXMgbm90IGZsYWdnZWQgCisJICogIGZvciBTQ0FOIExVTlMgaW4gdGhlIE5WUkFNIHNpbmNlIHNvbWUgbW9uby1sdW4gCisJICogIGRldmljZXMgYmVoYXZlIGJhZGx5IHdoZW4gYXNrZWQgZm9yIHNvbWUgbm9uIAorCSAqICB6ZXJvIExVTi4gQnR3LCB0aGlzIGlzIGFuIGFic29sdXRlIGhhY2suOi0pCisJICovCisJaWYgKGNtZC0+Y21uZFswXSA9PSAweDEyIHx8IGNtZC0+Y21uZFswXSA9PSAweDApIHsKKwkJaWYgKCh0cC0+dXNyZmxhZ3MgJiBTWU1fU0NBTl9CT09UX0RJU0FCTEVEKSB8fAorCQkgICAgKCh0cC0+dXNyZmxhZ3MgJiBTWU1fU0NBTl9MVU5TX0RJU0FCTEVEKSAmJiAKKwkJICAgICBzZGV2LT5sdW4gIT0gMCkpIHsKKwkJCXRwLT51c3JmbGFncyAmPSB+U1lNX1NDQU5fQk9PVF9ESVNBQkxFRDsKKwkJCXN5bV94cHRfZG9uZTIobnAsIGNtZCwgQ0FNX0RFVl9OT1RfVEhFUkUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKgorCSAqICBTZWxlY3QgdGFnZ2VkL3VudGFnZ2VkLgorCSAqLworCWxwID0gc3ltX2xwKHRwLCBzZGV2LT5sdW4pOworCW9yZGVyID0gKGxwICYmIGxwLT5zLnJlcXRhZ3MpID8gTV9TSU1QTEVfVEFHIDogMDsKKworCS8qCisJICogIFF1ZXVlIHRoZSBTQ1NJIElPLgorCSAqLworCWNwID0gc3ltX2dldF9jY2IobnAsIGNtZCwgb3JkZXIpOworCWlmICghY3ApCisJCXJldHVybiAxOwkvKiBNZWFucyByZXNvdXJjZSBzaG9ydGFnZSAqLworCXN5bV9xdWV1ZV9zY3NpaW8obnAsIGNtZCwgY3ApOworCXJldHVybiAwOworfQorCisvKgorICogIFNldHVwIGJ1ZmZlcnMgYW5kIHBvaW50ZXJzIHRoYXQgYWRkcmVzcyB0aGUgQ0RCLgorICovCitzdGF0aWMgaW5saW5lIGludCBzeW1fc2V0dXBfY2RiKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY21kLCBzdHJ1Y3Qgc3ltX2NjYiAqY3ApCit7CisJdTMyCWNtZF9iYTsKKwlpbnQJY21kX2xlbjsKKworCS8qCisJICogIENEQiBpcyAxNiBieXRlcyBtYXguCisJICovCisJaWYgKGNtZC0+Y21kX2xlbiA+IHNpemVvZihjcC0+Y2RiX2J1ZikpIHsKKwkJc3ltX3NldF9jYW1fc3RhdHVzKGNwLT5jbWQsIENBTV9SRVFfSU5WQUxJRCk7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1jcHkoY3AtPmNkYl9idWYsIGNtZC0+Y21uZCwgY21kLT5jbWRfbGVuKTsKKwljbWRfYmEgID0gQ0NCX0JBIChjcCwgY2RiX2J1ZlswXSk7CisJY21kX2xlbiA9IGNtZC0+Y21kX2xlbjsKKworCWNwLT5waHlzLmNtZC5hZGRyCT0gY3B1X3RvX3NjcihjbWRfYmEpOworCWNwLT5waHlzLmNtZC5zaXplCT0gY3B1X3RvX3NjcihjbWRfbGVuKTsKKworCXJldHVybiAwOworfQorCisvKgorICogIFNldHVwIHBvaW50ZXJzIHRoYXQgYWRkcmVzcyB0aGUgZGF0YSBhbmQgc3RhcnQgdGhlIEkvTy4KKyAqLworaW50IHN5bV9zZXR1cF9kYXRhX2FuZF9zdGFydChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgc3RydWN0IHN5bV9jY2IgKmNwKQoreworCWludCBkaXI7CisJc3RydWN0IHN5bV90Y2IgKnRwID0gJm5wLT50YXJnZXRbY3AtPnRhcmdldF07CisJc3RydWN0IHN5bV9sY2IgKmxwID0gc3ltX2xwKHRwLCBjcC0+bHVuKTsKKworCS8qCisJICogIEJ1aWxkIHRoZSBDREIuCisJICovCisJaWYgKHN5bV9zZXR1cF9jZGIobnAsIGNtZCwgY3ApKQorCQlnb3RvIG91dF9hYm9ydDsKKworCS8qCisJICogIE5vIGRpcmVjdGlvbiBtZWFucyBubyBkYXRhLgorCSAqLworCWRpciA9IGNtZC0+c2NfZGF0YV9kaXJlY3Rpb247CisJaWYgKGRpciAhPSBETUFfTk9ORSkgeworCQljcC0+c2VnbWVudHMgPSBzeW1fc2NhdHRlcihucCwgY3AsIGNtZCk7CisJCWlmIChjcC0+c2VnbWVudHMgPCAwKSB7CisJCQlpZiAoY3AtPnNlZ21lbnRzID09IC0yKQorCQkJCXN5bV9zZXRfY2FtX3N0YXR1cyhjbWQsIENBTV9SRVNSQ19VTkFWQUlMKTsKKwkJCWVsc2UKKwkJCQlzeW1fc2V0X2NhbV9zdGF0dXMoY21kLCBDQU1fUkVRX1RPT19CSUcpOworCQkJZ290byBvdXRfYWJvcnQ7CisJCX0KKwl9IGVsc2UgeworCQljcC0+ZGF0YV9sZW4gPSAwOworCQljcC0+c2VnbWVudHMgPSAwOworCX0KKworCS8qCisJICogIFNldCBkYXRhIHBvaW50ZXJzLgorCSAqLworCXN5bV9zZXR1cF9kYXRhX3BvaW50ZXJzKG5wLCBjcCwgZGlyKTsKKworCS8qCisJICogIFdoZW4gYCNpZmVkIDEnLCB0aGUgY29kZSBiZWxvdyBtYWtlcyB0aGUgZHJpdmVyIAorCSAqICBwYW5pYyBvbiB0aGUgZmlyc3QgYXR0ZW1wdCB0byB3cml0ZSB0byBhIFNDU0kgZGV2aWNlLgorCSAqICBJdCBpcyB0aGUgZmlyc3QgdGVzdCB3ZSB3YW50IHRvIGRvIGFmdGVyIGEgZHJpdmVyIAorCSAqICBjaGFuZ2UgdGhhdCBkb2VzIG5vdCBzZWVtIG9idmlvdXNseSBzYWZlLiA6KQorCSAqLworI2lmIDAKKwlzd2l0Y2ggKGNwLT5jZGJfYnVmWzBdKSB7CisJY2FzZSAweDBBOiBjYXNlIDB4MkE6IGNhc2UgMHhBQToKKwkJcGFuaWMoIlhYWFhYWFhYWFhYWFggV1JJVEUgTk9UIFlFVCBBTExPV0VEIFhYWFhYWFhYWFhYWFhYXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorI2VuZGlmCisKKwkvKgorCSAqCWFjdGl2YXRlIHRoaXMgam9iLgorCSAqLworCWlmIChscCkKKwkJc3ltX3N0YXJ0X25leHRfY2NicyhucCwgbHAsIDIpOworCWVsc2UKKwkJc3ltX3B1dF9zdGFydF9xdWV1ZShucCwgY3ApOworCXJldHVybiAwOworCitvdXRfYWJvcnQ6CisJc3ltX2ZyZWVfY2NiKG5wLCBjcCk7CisJc3ltX3hwdF9kb25lKG5wLCBjbWQpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiAgdGltZXIgZGFlbW9uLgorICoKKyAqICBNaXN1c2VkIHRvIGtlZXAgdGhlIGRyaXZlciBydW5uaW5nIHdoZW4KKyAqICBpbnRlcnJ1cHRzIGFyZSBub3QgY29uZmlndXJlZCBjb3JyZWN0bHkuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV90aW1lcihzdHJ1Y3Qgc3ltX2hjYiAqbnApCit7CisJdW5zaWduZWQgbG9uZyB0aGlzdGltZSA9IGppZmZpZXM7CisKKwkvKgorCSAqICBSZXN0YXJ0IHRoZSB0aW1lci4KKwkgKi8KKwlucC0+cy50aW1lci5leHBpcmVzID0gdGhpc3RpbWUgKyBTWU1fQ09ORl9USU1FUl9JTlRFUlZBTDsKKwlhZGRfdGltZXIoJm5wLT5zLnRpbWVyKTsKKworCS8qCisJICogIElmIHdlIGFyZSByZXNldHRpbmcgdGhlIG5jciwgd2FpdCBmb3Igc2V0dGxlX3RpbWUgYmVmb3JlIAorCSAqICBjbGVhcmluZyBpdC4gVGhlbiBjb21tYW5kIHByb2Nlc3Npbmcgd2lsbCBiZSByZXN1bWVkLgorCSAqLworCWlmIChucC0+cy5zZXR0bGVfdGltZV92YWxpZCkgeworCQlpZiAodGltZV9iZWZvcmVfZXEobnAtPnMuc2V0dGxlX3RpbWUsIHRoaXN0aW1lKSkgeworCQkJaWYgKHN5bV92ZXJib3NlID49IDIgKQorCQkJCXByaW50aygiJXM6IGNvbW1hbmQgcHJvY2Vzc2luZyByZXN1bWVkXG4iLAorCQkJCSAgICAgICBzeW1fbmFtZShucCkpOworCQkJbnAtPnMuc2V0dGxlX3RpbWVfdmFsaWQgPSAwOworCQl9CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqCU5vdGhpbmcgdG8gZG8gZm9yIG5vdywgYnV0IHRoYXQgbWF5IGNvbWUuCisJICovCisJaWYgKG5wLT5zLmxhc3R0aW1lICsgNCpIWiA8IHRoaXN0aW1lKSB7CisJCW5wLT5zLmxhc3R0aW1lID0gdGhpc3RpbWU7CisJfQorCisjaWZkZWYgU1lNX0NPTkZfUENJUV9NQVlfTUlTU19DT01QTEVUSU9OUworCS8qCisJICogIFNvbWUgd2F5LWJyb2tlbiBQQ0kgYnJpZGdlcyBtYXkgbGVhZCB0byAKKwkgKiAgY29tcGxldGlvbnMgYmVpbmcgbG9zdCB3aGVuIHRoZSBjbGVhcmluZyAKKwkgKiAgb2YgdGhlIElOVEZMWSBmbGFnIGJ5IHRoZSBDUFUgb2NjdXJzIAorCSAqICBjb25jdXJyZW50bHkgd2l0aCB0aGUgY2hpcCByYWlzaW5nIHRoaXMgZmxhZy4KKwkgKiAgSWYgdGhpcyBldmVyIGhhcHBlbiwgbG9zdCBjb21wbGV0aW9ucyB3aWxsIAorCSAqIGJlIHJlYXBlZCBoZXJlLgorCSAqLworCXN5bV93YWtldXBfZG9uZShucCk7CisjZW5kaWYKK30KKworCisvKgorICogIFBDSSBCVVMgZXJyb3IgaGFuZGxlci4KKyAqLwordm9pZCBzeW1fbG9nX2J1c19lcnJvcihzdHJ1Y3Qgc3ltX2hjYiAqbnApCit7CisJdV9zaG9ydCBwY2lfc3RzOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKG5wLT5zLmRldmljZSwgUENJX1NUQVRVUywgJnBjaV9zdHMpOworCWlmIChwY2lfc3RzICYgMHhmOTAwKSB7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChucC0+cy5kZXZpY2UsIFBDSV9TVEFUVVMsIHBjaV9zdHMpOworCQlwcmludGYoIiVzOiBQQ0kgU1RBVFVTID0gMHglMDR4XG4iLAorCQkJc3ltX25hbWUobnApLCBwY2lfc3RzICYgMHhmOTAwKTsKKwl9Cit9CisKKy8qCisgKiBxdWV1ZWNvbW1hbmQgbWV0aG9kLiAgRW50ZXJlZCB3aXRoIHRoZSBob3N0IGFkYXB0ZXIgbG9jayBoZWxkIGFuZAorICogaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqLworc3RhdGljIGludCBzeW01M2M4eHhfcXVldWVfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQkJCXZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCXN0cnVjdCBzeW1faGNiICpucCA9IFNZTV9TT0ZUQ19QVFIoY21kKTsKKwlzdHJ1Y3Qgc3ltX3VjbWQgKnVjcCA9IFNZTV9VQ01EX1BUUihjbWQpOworCWludCBzdHMgPSAwOworCisJY21kLT5zY3NpX2RvbmUgICAgID0gZG9uZTsKKwltZW1zZXQodWNwLCAwLCBzaXplb2YoKnVjcCkpOworCisJLyoKKwkgKiAgU2hvcnRlbiBvdXIgc2V0dGxlX3RpbWUgaWYgbmVlZGVkIGZvciAKKwkgKiAgdGhpcyBjb21tYW5kIG5vdCB0byB0aW1lIG91dC4KKwkgKi8KKwlpZiAobnAtPnMuc2V0dGxlX3RpbWVfdmFsaWQgJiYgY21kLT50aW1lb3V0X3Blcl9jb21tYW5kKSB7CisJCXVuc2lnbmVkIGxvbmcgdGxpbWl0ID0gamlmZmllcyArIGNtZC0+dGltZW91dF9wZXJfY29tbWFuZDsKKwkJdGxpbWl0IC09IFNZTV9DT05GX1RJTUVSX0lOVEVSVkFMKjI7CisJCWlmICh0aW1lX2FmdGVyKG5wLT5zLnNldHRsZV90aW1lLCB0bGltaXQpKSB7CisJCQlucC0+cy5zZXR0bGVfdGltZSA9IHRsaW1pdDsKKwkJfQorCX0KKworCWlmIChucC0+cy5zZXR0bGVfdGltZV92YWxpZCkKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisKKwlzdHMgPSBzeW1fcXVldWVfY29tbWFuZChucCwgY21kKTsKKwlpZiAoc3RzKQorCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBMaW51eCBlbnRyeSBwb2ludCBvZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzeW01M2M4eHhfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzeW1faGNiICpucCA9IChzdHJ1Y3Qgc3ltX2hjYiAqKWRldl9pZDsKKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1RJTlkpIHByaW50Zl9kZWJ1ZyAoIlsiKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKG5wLT5zLmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXN5bV9pbnRlcnJ1cHQobnApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobnAtPnMuaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19USU5ZKSBwcmludGZfZGVidWcgKCJdXG4iKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqICBMaW51eCBlbnRyeSBwb2ludCBvZiB0aGUgdGltZXIgaGFuZGxlcgorICovCitzdGF0aWMgdm9pZCBzeW01M2M4eHhfdGltZXIodW5zaWduZWQgbG9uZyBucHJlZikKK3sKKwlzdHJ1Y3Qgc3ltX2hjYiAqbnAgPSAoc3RydWN0IHN5bV9oY2IgKilucHJlZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUobnAtPnMuaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJc3ltX3RpbWVyKG5wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKG5wLT5zLmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworfQorCisKKy8qCisgKiAgV2hhdCB0aGUgZWggdGhyZWFkIHdhbnRzIHVzIHRvIHBlcmZvcm0uCisgKi8KKyNkZWZpbmUgU1lNX0VIX0FCT1JUCQkwCisjZGVmaW5lIFNZTV9FSF9ERVZJQ0VfUkVTRVQJMQorI2RlZmluZSBTWU1fRUhfQlVTX1JFU0VUCTIKKyNkZWZpbmUgU1lNX0VIX0hPU1RfUkVTRVQJMworCisvKgorICogIFdoYXQgd2Ugd2lsbCBkbyByZWdhcmRpbmcgdGhlIGludm9sdmVkIFNDU0kgY29tbWFuZC4KKyAqLworI2RlZmluZSBTWU1fRUhfRE9fSUdOT1JFCTAKKyNkZWZpbmUgU1lNX0VIX0RPX0NPTVBMRVRFCTEKKyNkZWZpbmUgU1lNX0VIX0RPX1dBSVQJCTIKKworLyoKKyAqICBPdXIgZ2VuZXJhbCBjb21wbGV0aW9uIGhhbmRsZXIuCisgKi8KK3N0YXRpYyB2b2lkIF9fc3ltX2VoX2RvbmUoc3RydWN0IHNjc2lfY21uZCAqY21kLCBpbnQgdGltZWRfb3V0KQoreworCXN0cnVjdCBzeW1fZWhfd2FpdCAqZXAgPSBTWU1fVUNNRF9QVFIoY21kKS0+ZWhfd2FpdDsKKwlpZiAoIWVwKQorCQlyZXR1cm47CisKKwkvKiBUcnkgdG8gYXZvaWQgYSByYWNlIGhlcmUgKG5vdCAxMDAlIHNhZmUpICovCisJaWYgKCF0aW1lZF9vdXQpIHsKKwkJZXAtPnRpbWVkX291dCA9IDA7CisJCWlmIChlcC0+dG9fZG8gPT0gU1lNX0VIX0RPX1dBSVQgJiYgIWRlbF90aW1lcigmZXAtPnRpbWVyKSkKKwkJCXJldHVybjsKKwl9CisKKwkvKiBSZXZlcnQgZXZlcnl0aGluZyAqLworCVNZTV9VQ01EX1BUUihjbWQpLT5laF93YWl0ID0gTlVMTDsKKwljbWQtPnNjc2lfZG9uZSA9IGVwLT5vbGRfZG9uZTsKKworCS8qIFdha2UgdXAgdGhlIGVoIHRocmVhZCBpZiBpdCB3YW50cyB0byBzbGVlcCAqLworCWlmIChlcC0+dG9fZG8gPT0gU1lNX0VIX0RPX1dBSVQpCisJCWNvbXBsZXRlKCZlcC0+ZG9uZSk7Cit9CisKKy8qCisgKiAgc2NzaV9kb25lKCkgYWxpYXMgd2hlbiBlcnJvciByZWNvdmVyeSBpcyBpbiBwcm9ncmVzcy4gCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9laF9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkgeyBfX3N5bV9laF9kb25lKGNtZCwgMCk7IH0KKworLyoKKyAqICBTb21lIHRpbWVvdXQgaGFuZGxlciB0byBhdm9pZCB3YWl0aW5nIHRvbyBsb25nLgorICovCitzdGF0aWMgdm9pZCBzeW1fZWhfdGltZW91dCh1X2xvbmcgcCkgeyBfX3N5bV9laF9kb25lKChzdHJ1Y3Qgc2NzaV9jbW5kICopcCwgMSk7IH0KKworLyoKKyAqICBHZW5lcmljIG1ldGhvZCBmb3Igb3VyIGVoIHByb2Nlc3NpbmcuCisgKiAgVGhlICdvcCcgYXJndW1lbnQgdGVsbHMgd2hhdCB3ZSBoYXZlIHRvIGRvLgorICovCitzdGF0aWMgaW50IHN5bV9laF9oYW5kbGVyKGludCBvcCwgY2hhciAqb3BuYW1lLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IHN5bV9oY2IgKm5wID0gU1lNX1NPRlRDX1BUUihjbWQpOworCVNZTV9RVUVIRUFEICpxcDsKKwlpbnQgdG9fZG8gPSBTWU1fRUhfRE9fSUdOT1JFOworCWludCBzdHMgPSAtMTsKKwlzdHJ1Y3Qgc3ltX2VoX3dhaXQgZWgsICplcCA9ICZlaDsKKworCWRldl93YXJuKCZjbWQtPmRldmljZS0+c2Rldl9nZW5kZXYsICIlcyBvcGVyYXRpb24gc3RhcnRlZC5cbiIsIG9wbmFtZSk7CisKKyNpZiAwCisJLyogVGhpcyBvbmUgc2hvdWxkIGJlIHRoZSByZXN1bHQgb2Ygc29tZSByYWNlLCB0aHVzIHRvIGlnbm9yZSAqLworCWlmIChjbWQtPnNlcmlhbF9udW1iZXIgIT0gY21kLT5zZXJpYWxfbnVtYmVyX2F0X3RpbWVvdXQpCisJCWdvdG8gcHJlcGFyZTsKKyNlbmRpZgorCisJLyogVGhpcyBvbmUgaXMgcXVldWVkIGluIHNvbWUgcGxhY2UgLT4gdG8gd2FpdCBmb3IgY29tcGxldGlvbiAqLworCUZPUl9FQUNIX1FVRVVFRF9FTEVNRU5UKCZucC0+YnVzeV9jY2JxLCBxcCkgeworCQlzdHJ1Y3Qgc3ltX2NjYiAqY3AgPSBzeW1fcXVlX2VudHJ5KHFwLCBzdHJ1Y3Qgc3ltX2NjYiwgbGlua19jY2JxKTsKKwkJaWYgKGNwLT5jbWQgPT0gY21kKSB7CisJCQl0b19kbyA9IFNZTV9FSF9ET19XQUlUOworCQkJZ290byBwcmVwYXJlOworCQl9CisJfQorCitwcmVwYXJlOgorCS8qIFByZXBhcmUgc3R1ZmYgdG8gZWl0aGVyIGlnbm9yZSwgY29tcGxldGUgb3Igd2FpdCBmb3IgY29tcGxldGlvbiAqLworCXN3aXRjaCh0b19kbykgeworCWRlZmF1bHQ6CisJY2FzZSBTWU1fRUhfRE9fSUdOT1JFOgorCQlicmVhazsKKwljYXNlIFNZTV9FSF9ET19XQUlUOgorCQlpbml0X2NvbXBsZXRpb24oJmVwLT5kb25lKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTWU1fRUhfRE9fQ09NUExFVEU6CisJCWVwLT5vbGRfZG9uZSA9IGNtZC0+c2NzaV9kb25lOworCQljbWQtPnNjc2lfZG9uZSA9IHN5bV9laF9kb25lOworCQlTWU1fVUNNRF9QVFIoY21kKS0+ZWhfd2FpdCA9IGVwOworCX0KKworCS8qIFRyeSB0byBwcm9jZWVkIHRoZSBvcGVyYXRpb24gd2UgaGF2ZSBiZWVuIGFza2VkIGZvciAqLworCXN0cyA9IC0xOworCXN3aXRjaChvcCkgeworCWNhc2UgU1lNX0VIX0FCT1JUOgorCQlzdHMgPSBzeW1fYWJvcnRfc2NzaWlvKG5wLCBjbWQsIDEpOworCQlicmVhazsKKwljYXNlIFNZTV9FSF9ERVZJQ0VfUkVTRVQ6CisJCXN0cyA9IHN5bV9yZXNldF9zY3NpX3RhcmdldChucCwgY21kLT5kZXZpY2UtPmlkKTsKKwkJYnJlYWs7CisJY2FzZSBTWU1fRUhfQlVTX1JFU0VUOgorCQlzeW1fcmVzZXRfc2NzaV9idXMobnAsIDEpOworCQlzdHMgPSAwOworCQlicmVhazsKKwljYXNlIFNZTV9FSF9IT1NUX1JFU0VUOgorCQlzeW1fcmVzZXRfc2NzaV9idXMobnAsIDApOworCQlzeW1fc3RhcnRfdXAgKG5wLCAxKTsKKwkJc3RzID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogT24gZXJyb3IsIHJlc3RvcmUgZXZlcnl0aGluZyBhbmQgY3Jvc3MgZmluZ2VycyA6KSAqLworCWlmIChzdHMpIHsKKwkJU1lNX1VDTURfUFRSKGNtZCktPmVoX3dhaXQgPSBOVUxMOworCQljbWQtPnNjc2lfZG9uZSA9IGVwLT5vbGRfZG9uZTsKKwkJdG9fZG8gPSBTWU1fRUhfRE9fSUdOT1JFOworCX0KKworCWVwLT50b19kbyA9IHRvX2RvOworCS8qIENvbXBsZXRlIHRoZSBjb21tYW5kIHdpdGggbG9ja3MgaGVsZCBhcyByZXF1aXJlZCBieSB0aGUgZHJpdmVyICovCisJaWYgKHRvX2RvID09IFNZTV9FSF9ET19DT01QTEVURSkKKwkJc3ltX3hwdF9kb25lMihucCwgY21kLCBDQU1fUkVRX0FCT1JURUQpOworCisJLyogV2FpdCBmb3IgY29tcGxldGlvbiB3aXRoIGxvY2tzIHJlbGVhc2VkLCBhcyByZXF1aXJlZCBieSBrZXJuZWwgKi8KKwlpZiAodG9fZG8gPT0gU1lNX0VIX0RPX1dBSVQpIHsKKwkJaW5pdF90aW1lcigmZXAtPnRpbWVyKTsKKwkJZXAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKDUqSFopOworCQllcC0+dGltZXIuZnVuY3Rpb24gPSBzeW1fZWhfdGltZW91dDsKKwkJZXAtPnRpbWVyLmRhdGEgPSAodV9sb25nKWNtZDsKKwkJZXAtPnRpbWVkX291dCA9IDE7CS8qIEJlIHBlc3NpbWlzdGljIGZvciBvbmNlIDopICovCisJCWFkZF90aW1lcigmZXAtPnRpbWVyKTsKKwkJc3Bpbl91bmxvY2tfaXJxKG5wLT5zLmhvc3QtPmhvc3RfbG9jayk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmVwLT5kb25lKTsKKwkJc3Bpbl9sb2NrX2lycShucC0+cy5ob3N0LT5ob3N0X2xvY2spOworCQlpZiAoZXAtPnRpbWVkX291dCkKKwkJCXN0cyA9IC0yOworCX0KKwlkZXZfd2FybigmY21kLT5kZXZpY2UtPnNkZXZfZ2VuZGV2LCAiJXMgb3BlcmF0aW9uICVzLlxuIiwgb3BuYW1lLAorCQkJc3RzPT0wID8gImNvbXBsZXRlIiA6c3RzPT0tMiA/ICJ0aW1lZC1vdXQiIDogImZhaWxlZCIpOworCXJldHVybiBzdHMgPyBTQ1NJX0ZBSUxFRCA6IFNDU0lfU1VDQ0VTUzsKK30KKworCisvKgorICogRXJyb3IgaGFuZGxlcnMgY2FsbGVkIGZyb20gdGhlIGVoIHRocmVhZCAob25lIHRocmVhZCBwZXIgSEJBKS4KKyAqLworc3RhdGljIGludCBzeW01M2M4eHhfZWhfYWJvcnRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJcmV0dXJuIHN5bV9laF9oYW5kbGVyKFNZTV9FSF9BQk9SVCwgIkFCT1JUIiwgY21kKTsKK30KKworc3RhdGljIGludCBzeW01M2M4eHhfZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXJldHVybiBzeW1fZWhfaGFuZGxlcihTWU1fRUhfREVWSUNFX1JFU0VULCAiREVWSUNFIFJFU0VUIiwgY21kKTsKK30KKworc3RhdGljIGludCBzeW01M2M4eHhfZWhfYnVzX3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXJldHVybiBzeW1fZWhfaGFuZGxlcihTWU1fRUhfQlVTX1JFU0VULCAiQlVTIFJFU0VUIiwgY21kKTsKK30KKworc3RhdGljIGludCBzeW01M2M4eHhfZWhfaG9zdF9yZXNldF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlyZXR1cm4gc3ltX2VoX2hhbmRsZXIoU1lNX0VIX0hPU1RfUkVTRVQsICJIT1NUIFJFU0VUIiwgY21kKTsKK30KKworLyoKKyAqICBUdW5lIGRldmljZSBxdWV1aW5nIGRlcHRoLCBhY2NvcmRpbmcgdG8gdmFyaW91cyBsaW1pdHMuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV90dW5lX2Rldl9xdWV1aW5nKHN0cnVjdCBzeW1fdGNiICp0cCwgaW50IGx1biwgdV9zaG9ydCByZXF0YWdzKQoreworCXN0cnVjdCBzeW1fbGNiICpscCA9IHN5bV9scCh0cCwgbHVuKTsKKwl1X3Nob3J0CW9sZHRhZ3M7CisKKwlpZiAoIWxwKQorCQlyZXR1cm47CisKKwlvbGR0YWdzID0gbHAtPnMucmVxdGFnczsKKworCWlmIChyZXF0YWdzID4gbHAtPnMuc2NkZXZfZGVwdGgpCisJCXJlcXRhZ3MgPSBscC0+cy5zY2Rldl9kZXB0aDsKKworCWxwLT5zdGFydGVkX2xpbWl0ID0gcmVxdGFncyA/IHJlcXRhZ3MgOiAyOworCWxwLT5zdGFydGVkX21heCAgID0gMTsKKwlscC0+cy5yZXF0YWdzICAgICA9IHJlcXRhZ3M7CisKKwlpZiAocmVxdGFncyAhPSBvbGR0YWdzKSB7CisJCWRldl9pbmZvKCZ0cC0+c2Rldi0+c2Rldl90YXJnZXQtPmRldiwKKwkJICAgICAgICAgInRhZ2dlZCBjb21tYW5kIHF1ZXVpbmcgJXMsIGNvbW1hbmQgcXVldWUgZGVwdGggJWQuXG4iLAorCQkgICAgICAgICAgbHAtPnMucmVxdGFncyA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsCisgCQkgICAgICAgICAgbHAtPnN0YXJ0ZWRfbGltaXQpOworCX0KK30KKworLyoKKyAqICBMaW51eCBzZWxlY3QgcXVldWUgZGVwdGhzIGZ1bmN0aW9uCisgKi8KKyNkZWZpbmUgREVGX0RFUFRICShzeW1fZHJpdmVyX3NldHVwLm1heF90YWcpCisjZGVmaW5lIEFMTF9UQVJHRVRTCS0yCisjZGVmaW5lIE5PX1RBUkdFVAktMQorI2RlZmluZSBBTExfTFVOUwktMgorI2RlZmluZSBOT19MVU4JCS0xCisKK3N0YXRpYyBpbnQgZGV2aWNlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzeW1faGNiICpucCwgaW50IHRhcmdldCwgaW50IGx1bikKK3sKKwlpbnQgYywgaCwgdCwgdSwgdjsKKwljaGFyICpwID0gc3ltX2RyaXZlcl9zZXR1cC50YWdfY3RybDsKKwljaGFyICplcDsKKworCWggPSAtMTsKKwl0ID0gTk9fVEFSR0VUOworCXUgPSBOT19MVU47CisJd2hpbGUgKChjID0gKnArKykgIT0gMCkgeworCQl2ID0gc2ltcGxlX3N0cnRvdWwocCwgJmVwLCAwKTsKKwkJc3dpdGNoKGMpIHsKKwkJY2FzZSAnLyc6CisJCQkrK2g7CisJCQl0ID0gQUxMX1RBUkdFVFM7CisJCQl1ID0gQUxMX0xVTlM7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQlpZiAodCAhPSB0YXJnZXQpCisJCQkJdCA9ICh0YXJnZXQgPT0gdikgPyB2IDogTk9fVEFSR0VUOworCQkJdSA9IEFMTF9MVU5TOworCQkJYnJlYWs7CisJCWNhc2UgJ3UnOgorCQkJaWYgKHUgIT0gbHVuKQorCQkJCXUgPSAobHVuID09IHYpID8gdiA6IE5PX0xVTjsKKwkJCWJyZWFrOworCQljYXNlICdxJzoKKwkJCWlmIChoID09IG5wLT5zLnVuaXQgJiYKKwkJCQkodCA9PSBBTExfVEFSR0VUUyB8fCB0ID09IHRhcmdldCkgJiYKKwkJCQkodSA9PSBBTExfTFVOUyAgICB8fCB1ID09IGx1bikpCisJCQkJcmV0dXJuIHY7CisJCQlicmVhazsKKwkJY2FzZSAnLSc6CisJCQl0ID0gQUxMX1RBUkdFVFM7CisJCQl1ID0gQUxMX0xVTlM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXAgPSBlcDsKKwl9CisJcmV0dXJuIERFRl9ERVBUSDsKK30KKworc3RhdGljIGludCBzeW01M2M4eHhfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHN5bV9oY2IgKm5wID0gc3ltX2dldF9oY2IoZGV2aWNlLT5ob3N0KTsKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSAmbnAtPnRhcmdldFtkZXZpY2UtPmlkXTsKKwlpZiAoIXRwLT5zZGV2KQorCQl0cC0+c2RldiA9IGRldmljZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzeW01M2M4eHhfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3Qgc3ltX2hjYiAqbnAgPSBzeW1fZ2V0X2hjYihkZXZpY2UtPmhvc3QpOworCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W2RldmljZS0+aWRdOworCWlmICh0cC0+c2RldiA9PSBkZXZpY2UpCisJCXRwLT5zZGV2ID0gTlVMTDsKK30KKworLyoKKyAqIExpbnV4IGVudHJ5IHBvaW50IGZvciBkZXZpY2UgcXVldWUgc2l6aW5nLgorICovCitzdGF0aWMgaW50IHN5bTUzYzh4eF9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHN5bV9oY2IgKm5wID0gc3ltX2dldF9oY2IoZGV2aWNlLT5ob3N0KTsKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSAmbnAtPnRhcmdldFtkZXZpY2UtPmlkXTsKKwlzdHJ1Y3Qgc3ltX2xjYiAqbHA7CisJaW50IHJlcXRhZ3MsIGRlcHRoX3RvX3VzZTsKKworCS8qCisJICogIEFsbG9jYXRlIHRoZSBMQ0IgaWYgbm90IHlldC4KKwkgKiAgSWYgaXQgZmFpbCwgd2UgbWF5IHdlbGwgYmUgaW4gdGhlIHNoKnQuIDopCisJICovCisJbHAgPSBzeW1fYWxsb2NfbGNiKG5wLCBkZXZpY2UtPmlkLCBkZXZpY2UtPmx1bik7CisJaWYgKCFscCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqICBHZXQgdXNlciBmbGFncy4KKwkgKi8KKwlscC0+Y3Vycl9mbGFncyA9IGxwLT51c2VyX2ZsYWdzOworCisJLyoKKwkgKiAgU2VsZWN0IHF1ZXVlIGRlcHRoIGZyb20gZHJpdmVyIHNldHVwLgorCSAqICBEb25ub3QgdXNlIG1vcmUgdGhhbiBjb25maWd1cmVkIGJ5IHVzZXIuCisJICogIFVzZSBhdCBsZWFzdCAyLgorCSAqICBEb25ub3QgdXNlIG1vcmUgdGhhbiBvdXIgbWF4aW11bS4KKwkgKi8KKwlyZXF0YWdzID0gZGV2aWNlX3F1ZXVlX2RlcHRoKG5wLCBkZXZpY2UtPmlkLCBkZXZpY2UtPmx1bik7CisJaWYgKHJlcXRhZ3MgPiB0cC0+dXNydGFncykKKwkJcmVxdGFncyA9IHRwLT51c3J0YWdzOworCWlmICghZGV2aWNlLT50YWdnZWRfc3VwcG9ydGVkKQorCQlyZXF0YWdzID0gMDsKKyNpZiAxIC8qIEF2b2lkIHRvIGxvY2FsbHkgcXVldWUgY29tbWFuZHMgZm9yIG5vIGdvb2QgcmVhc29ucyAqLworCWlmIChyZXF0YWdzID4gU1lNX0NPTkZfTUFYX1RBRykKKwkJcmVxdGFncyA9IFNZTV9DT05GX01BWF9UQUc7CisJZGVwdGhfdG9fdXNlID0gKHJlcXRhZ3MgPyByZXF0YWdzIDogMik7CisjZWxzZQorCWRlcHRoX3RvX3VzZSA9IChyZXF0YWdzID8gU1lNX0NPTkZfTUFYX1RBRyA6IDIpOworI2VuZGlmCisJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2aWNlLAorCQkJCShkZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQgPworCQkJCSBNU0dfU0lNUExFX1RBRyA6IDApLAorCQkJCWRlcHRoX3RvX3VzZSk7CisJbHAtPnMuc2NkZXZfZGVwdGggPSBkZXB0aF90b191c2U7CisJc3ltX3R1bmVfZGV2X3F1ZXVpbmcodHAsIGRldmljZS0+bHVuLCByZXF0YWdzKTsKKworCWlmICghc3BpX2luaXRpYWxfZHYoZGV2aWNlLT5zZGV2X3RhcmdldCkpCisJCXNwaV9kdl9kZXZpY2UoZGV2aWNlKTsKKworCXJldHVybiAwOworfQorCisvKgorICogIExpbnV4IGVudHJ5IHBvaW50IGZvciBpbmZvKCkgZnVuY3Rpb24KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKnN5bTUzYzh4eF9pbmZvIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXJldHVybiBTWU1fRFJJVkVSX05BTUU7Cit9CisKKworI2lmZGVmIFNZTV9MSU5VWF9QUk9DX0lORk9fU1VQUE9SVAorLyoKKyAqICBQcm9jIGZpbGUgc3lzdGVtIHN0dWZmCisgKgorICogIEEgcmVhZCBvcGVyYXRpb24gcmV0dXJucyBhZGFwdGVyIGluZm9ybWF0aW9uLgorICogIEEgd3JpdGUgb3BlcmF0aW9uIGlzIGEgY29udHJvbCBjb21tYW5kLgorICogIFRoZSBzdHJpbmcgaXMgcGFyc2VkIGluIHRoZSBkcml2ZXIgY29kZSBhbmQgdGhlIGNvbW1hbmQgaXMgcGFzc2VkIAorICogIHRvIHRoZSBzeW1fdXNlcmNtZCgpIGZ1bmN0aW9uLgorICovCisKKyNpZmRlZiBTWU1fTElOVVhfVVNFUl9DT01NQU5EX1NVUFBPUlQKKworc3RydWN0CXN5bV91c3JjbWQgeworCXVfbG9uZwl0YXJnZXQ7CisJdV9sb25nCWx1bjsKKwl1X2xvbmcJZGF0YTsKKwl1X2xvbmcJY21kOworfTsKKworI2RlZmluZSBVQ19TRVRTWU5DICAgICAgMTAKKyNkZWZpbmUgVUNfU0VUVEFHUwkxMQorI2RlZmluZSBVQ19TRVRERUJVRwkxMgorI2RlZmluZSBVQ19TRVRXSURFCTE0CisjZGVmaW5lIFVDX1NFVEZMQUcJMTUKKyNkZWZpbmUgVUNfU0VUVkVSQk9TRQkxNworI2RlZmluZSBVQ19SRVNFVERFVgkxOAorI2RlZmluZSBVQ19DTEVBUkRFVgkxOQorCitzdGF0aWMgdm9pZCBzeW1fZXhlY191c2VyX2NvbW1hbmQgKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV91c3JjbWQgKnVjKQoreworCXN0cnVjdCBzeW1fdGNiICp0cDsKKwlpbnQgdCwgbDsKKworCXN3aXRjaCAodWMtPmNtZCkgeworCWNhc2UgMDogcmV0dXJuOworCisjaWZkZWYgU1lNX0xJTlVYX0RFQlVHX0NPTlRST0xfU1VQUE9SVAorCWNhc2UgVUNfU0VUREVCVUc6CisJCXN5bV9kZWJ1Z19mbGFncyA9IHVjLT5kYXRhOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgVUNfU0VUVkVSQk9TRToKKwkJbnAtPnZlcmJvc2UgPSB1Yy0+ZGF0YTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyoKKwkJICogV2UgYXNzdW1lIHRoYXQgb3RoZXIgY29tbWFuZHMgYXBwbHkgdG8gdGFyZ2V0cy4KKwkJICogVGhpcyBzaG91bGQgYWx3YXlzIGJlIHRoZSBjYXNlIGFuZCBhdm9pZCB0aGUgYmVsb3cgCisJCSAqIDQgbGluZXMgdG8gYmUgcmVwZWF0ZWQgNiB0aW1lcy4KKwkJICovCisJCWZvciAodCA9IDA7IHQgPCBTWU1fQ09ORl9NQVhfVEFSR0VUOyB0KyspIHsKKwkJCWlmICghKCh1Yy0+dGFyZ2V0ID4+IHQpICYgMSkpCisJCQkJY29udGludWU7CisJCQl0cCA9ICZucC0+dGFyZ2V0W3RdOworCisJCQlzd2l0Y2ggKHVjLT5jbWQpIHsKKworCQkJY2FzZSBVQ19TRVRTWU5DOgorCQkJCWlmICghdWMtPmRhdGEgfHwgdWMtPmRhdGEgPj0gMjU1KSB7CisJCQkJCXRwLT50Z29hbC5pdSA9IHRwLT50Z29hbC5kdCA9CisJCQkJCQl0cC0+dGdvYWwucWFzID0gMDsKKwkJCQkJdHAtPnRnb2FsLm9mZnNldCA9IDA7CisJCQkJfSBlbHNlIGlmICh1Yy0+ZGF0YSA8PSA5ICYmIG5wLT5taW5zeW5jX2R0KSB7CisJCQkJCWlmICh1Yy0+ZGF0YSA8IG5wLT5taW5zeW5jX2R0KQorCQkJCQkJdWMtPmRhdGEgPSBucC0+bWluc3luY19kdDsKKwkJCQkJdHAtPnRnb2FsLml1ID0gdHAtPnRnb2FsLmR0ID0KKwkJCQkJCXRwLT50Z29hbC5xYXMgPSAxOworCQkJCQl0cC0+dGdvYWwud2lkdGggPSAxOworCQkJCQl0cC0+dGdvYWwucGVyaW9kID0gdWMtPmRhdGE7CisJCQkJCXRwLT50Z29hbC5vZmZzZXQgPSBucC0+bWF4b2Zmc19kdDsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodWMtPmRhdGEgPCBucC0+bWluc3luYykKKwkJCQkJCXVjLT5kYXRhID0gbnAtPm1pbnN5bmM7CisJCQkJCXRwLT50Z29hbC5pdSA9IHRwLT50Z29hbC5kdCA9CisJCQkJCQl0cC0+dGdvYWwucWFzID0gMDsKKwkJCQkJdHAtPnRnb2FsLnBlcmlvZCA9IHVjLT5kYXRhOworCQkJCQl0cC0+dGdvYWwub2Zmc2V0ID0gbnAtPm1heG9mZnM7CisJCQkJfQorCQkJCXRwLT50Z29hbC5jaGVja19uZWdvID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVUNfU0VUV0lERToKKwkJCQl0cC0+dGdvYWwud2lkdGggPSB1Yy0+ZGF0YSA/IDEgOiAwOworCQkJCXRwLT50Z29hbC5jaGVja19uZWdvID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVUNfU0VUVEFHUzoKKwkJCQlmb3IgKGwgPSAwOyBsIDwgU1lNX0NPTkZfTUFYX0xVTjsgbCsrKQorCQkJCQlzeW1fdHVuZV9kZXZfcXVldWluZyh0cCwgbCwgdWMtPmRhdGEpOworCQkJCWJyZWFrOworCQkJY2FzZSBVQ19SRVNFVERFVjoKKwkJCQl0cC0+dG9fcmVzZXQgPSAxOworCQkJCW5wLT5pc3RhdF9zZW0gPSBTRU07CisJCQkJT1VUQihucCwgbmNfaXN0YXQsIFNJR1B8U0VNKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVUNfQ0xFQVJERVY6CisJCQkJZm9yIChsID0gMDsgbCA8IFNZTV9DT05GX01BWF9MVU47IGwrKykgeworCQkJCQlzdHJ1Y3Qgc3ltX2xjYiAqbHAgPSBzeW1fbHAodHAsIGwpOworCQkJCQlpZiAobHApIGxwLT50b19jbGVhciA9IDE7CisJCQkJfQorCQkJCW5wLT5pc3RhdF9zZW0gPSBTRU07CisJCQkJT1VUQihucCwgbmNfaXN0YXQsIFNJR1B8U0VNKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVUNfU0VURkxBRzoKKwkJCQl0cC0+dXNyZmxhZ3MgPSB1Yy0+ZGF0YTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2tpcF9zcGFjZXMoY2hhciAqcHRyLCBpbnQgbGVuKQoreworCWludCBjbnQsIGM7CisKKwlmb3IgKGNudCA9IGxlbjsgY250ID4gMCAmJiAoYyA9ICpwdHIrKykgJiYgaXNzcGFjZShjKTsgY250LS0pOworCisJcmV0dXJuIChsZW4gLSBjbnQpOworfQorCitzdGF0aWMgaW50IGdldF9pbnRfYXJnKGNoYXIgKnB0ciwgaW50IGxlbiwgdV9sb25nICpwdikKK3sKKwljaGFyICplbmQ7CisKKwkqcHYgPSBzaW1wbGVfc3RydG91bChwdHIsICZlbmQsIDEwKTsKKwlyZXR1cm4gKGVuZCAtIHB0cik7Cit9CisKK3N0YXRpYyBpbnQgaXNfa2V5d29yZChjaGFyICpwdHIsIGludCBsZW4sIGNoYXIgKnZlcmIpCit7CisJaW50IHZlcmJfbGVuID0gc3RybGVuKHZlcmIpOworCisJaWYgKGxlbiA+PSB2ZXJiX2xlbiAmJiAhbWVtY21wKHZlcmIsIHB0ciwgdmVyYl9sZW4pKQorCQlyZXR1cm4gdmVyYl9sZW47CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworI2RlZmluZSBTS0lQX1NQQUNFUyhwdHIsIGxlbikJCQkJCQlcCisJaWYgKChhcmdfbGVuID0gc2tpcF9zcGFjZXMocHRyLCBsZW4pKSA8IDEpCQkJXAorCQlyZXR1cm4gLUVJTlZBTDsJCQkJCQlcCisJcHRyICs9IGFyZ19sZW47IGxlbiAtPSBhcmdfbGVuOworCisjZGVmaW5lIEdFVF9JTlRfQVJHKHB0ciwgbGVuLCB2KQkJCQkJXAorCWlmICghKGFyZ19sZW4gPSBnZXRfaW50X2FyZyhwdHIsIGxlbiwgJih2KSkpKQkJCVwKKwkJcmV0dXJuIC1FSU5WQUw7CQkJCQkJXAorCXB0ciArPSBhcmdfbGVuOyBsZW4gLT0gYXJnX2xlbjsKKworCisvKgorICogUGFyc2UgYSBjb250cm9sIGNvbW1hbmQKKyAqLworCitzdGF0aWMgaW50IHN5bV91c2VyX2NvbW1hbmQoc3RydWN0IHN5bV9oY2IgKm5wLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCit7CisJY2hhciAqcHRyCT0gYnVmZmVyOworCWludCBsZW4JCT0gbGVuZ3RoOworCXN0cnVjdCBzeW1fdXNyY21kIGNtZCwgKnVjID0gJmNtZDsKKwlpbnQJCWFyZ19sZW47CisJdV9sb25nIAkJdGFyZ2V0OworCisJbWVtc2V0KHVjLCAwLCBzaXplb2YoKnVjKSk7CisKKwlpZiAobGVuID4gMCAmJiBwdHJbbGVuLTFdID09ICdcbicpCisJCS0tbGVuOworCisJaWYJKChhcmdfbGVuID0gaXNfa2V5d29yZChwdHIsIGxlbiwgInNldHN5bmMiKSkgIT0gMCkKKwkJdWMtPmNtZCA9IFVDX1NFVFNZTkM7CisJZWxzZSBpZgkoKGFyZ19sZW4gPSBpc19rZXl3b3JkKHB0ciwgbGVuLCAic2V0dGFncyIpKSAhPSAwKQorCQl1Yy0+Y21kID0gVUNfU0VUVEFHUzsKKwllbHNlIGlmCSgoYXJnX2xlbiA9IGlzX2tleXdvcmQocHRyLCBsZW4sICJzZXR2ZXJib3NlIikpICE9IDApCisJCXVjLT5jbWQgPSBVQ19TRVRWRVJCT1NFOworCWVsc2UgaWYJKChhcmdfbGVuID0gaXNfa2V5d29yZChwdHIsIGxlbiwgInNldHdpZGUiKSkgIT0gMCkKKwkJdWMtPmNtZCA9IFVDX1NFVFdJREU7CisjaWZkZWYgU1lNX0xJTlVYX0RFQlVHX0NPTlRST0xfU1VQUE9SVAorCWVsc2UgaWYJKChhcmdfbGVuID0gaXNfa2V5d29yZChwdHIsIGxlbiwgInNldGRlYnVnIikpICE9IDApCisJCXVjLT5jbWQgPSBVQ19TRVRERUJVRzsKKyNlbmRpZgorCWVsc2UgaWYJKChhcmdfbGVuID0gaXNfa2V5d29yZChwdHIsIGxlbiwgInNldGZsYWciKSkgIT0gMCkKKwkJdWMtPmNtZCA9IFVDX1NFVEZMQUc7CisJZWxzZSBpZgkoKGFyZ19sZW4gPSBpc19rZXl3b3JkKHB0ciwgbGVuLCAicmVzZXRkZXYiKSkgIT0gMCkKKwkJdWMtPmNtZCA9IFVDX1JFU0VUREVWOworCWVsc2UgaWYJKChhcmdfbGVuID0gaXNfa2V5d29yZChwdHIsIGxlbiwgImNsZWFyZGV2IikpICE9IDApCisJCXVjLT5jbWQgPSBVQ19DTEVBUkRFVjsKKwllbHNlCisJCWFyZ19sZW4gPSAwOworCisjaWZkZWYgREVCVUdfUFJPQ19JTkZPCitwcmludGsoInN5bV91c2VyX2NvbW1hbmQ6IGFyZ19sZW49JWQsIGNtZD0lbGRcbiIsIGFyZ19sZW4sIHVjLT5jbWQpOworI2VuZGlmCisKKwlpZiAoIWFyZ19sZW4pCisJCXJldHVybiAtRUlOVkFMOworCXB0ciArPSBhcmdfbGVuOyBsZW4gLT0gYXJnX2xlbjsKKworCXN3aXRjaCh1Yy0+Y21kKSB7CisJY2FzZSBVQ19TRVRTWU5DOgorCWNhc2UgVUNfU0VUVEFHUzoKKwljYXNlIFVDX1NFVFdJREU6CisJY2FzZSBVQ19TRVRGTEFHOgorCWNhc2UgVUNfUkVTRVRERVY6CisJY2FzZSBVQ19DTEVBUkRFVjoKKwkJU0tJUF9TUEFDRVMocHRyLCBsZW4pOworCQlpZiAoKGFyZ19sZW4gPSBpc19rZXl3b3JkKHB0ciwgbGVuLCAiYWxsIikpICE9IDApIHsKKwkJCXB0ciArPSBhcmdfbGVuOyBsZW4gLT0gYXJnX2xlbjsKKwkJCXVjLT50YXJnZXQgPSB+MDsKKwkJfSBlbHNlIHsKKwkJCUdFVF9JTlRfQVJHKHB0ciwgbGVuLCB0YXJnZXQpOworCQkJdWMtPnRhcmdldCA9ICgxPDx0YXJnZXQpOworI2lmZGVmIERFQlVHX1BST0NfSU5GTworcHJpbnRrKCJzeW1fdXNlcl9jb21tYW5kOiB0YXJnZXQ9JWxkXG4iLCB0YXJnZXQpOworI2VuZGlmCisJCX0KKwkJYnJlYWs7CisJfQorCisJc3dpdGNoKHVjLT5jbWQpIHsKKwljYXNlIFVDX1NFVFZFUkJPU0U6CisJY2FzZSBVQ19TRVRTWU5DOgorCWNhc2UgVUNfU0VUVEFHUzoKKwljYXNlIFVDX1NFVFdJREU6CisJCVNLSVBfU1BBQ0VTKHB0ciwgbGVuKTsKKwkJR0VUX0lOVF9BUkcocHRyLCBsZW4sIHVjLT5kYXRhKTsKKyNpZmRlZiBERUJVR19QUk9DX0lORk8KK3ByaW50aygic3ltX3VzZXJfY29tbWFuZDogZGF0YT0lbGRcbiIsIHVjLT5kYXRhKTsKKyNlbmRpZgorCQlicmVhazsKKyNpZmRlZiBTWU1fTElOVVhfREVCVUdfQ09OVFJPTF9TVVBQT1JUCisJY2FzZSBVQ19TRVRERUJVRzoKKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCVNLSVBfU1BBQ0VTKHB0ciwgbGVuKTsKKwkJCWlmCSgoYXJnX2xlbiA9IGlzX2tleXdvcmQocHRyLCBsZW4sICJhbGxvYyIpKSkKKwkJCQl1Yy0+ZGF0YSB8PSBERUJVR19BTExPQzsKKwkJCWVsc2UgaWYJKChhcmdfbGVuID0gaXNfa2V5d29yZChwdHIsIGxlbiwgInBoYXNlIikpKQorCQkJCXVjLT5kYXRhIHw9IERFQlVHX1BIQVNFOworCQkJZWxzZSBpZgkoKGFyZ19sZW4gPSBpc19rZXl3b3JkKHB0ciwgbGVuLCAicXVldWUiKSkpCisJCQkJdWMtPmRhdGEgfD0gREVCVUdfUVVFVUU7CisJCQllbHNlIGlmCSgoYXJnX2xlbiA9IGlzX2tleXdvcmQocHRyLCBsZW4sICJyZXN1bHQiKSkpCisJCQkJdWMtPmRhdGEgfD0gREVCVUdfUkVTVUxUOworCQkJZWxzZSBpZgkoKGFyZ19sZW4gPSBpc19rZXl3b3JkKHB0ciwgbGVuLCAic2NhdHRlciIpKSkKKwkJCQl1Yy0+ZGF0YSB8PSBERUJVR19TQ0FUVEVSOworCQkJZWxzZSBpZgkoKGFyZ19sZW4gPSBpc19rZXl3b3JkKHB0ciwgbGVuLCAic2NyaXB0IikpKQorCQkJCXVjLT5kYXRhIHw9IERFQlVHX1NDUklQVDsKKwkJCWVsc2UgaWYJKChhcmdfbGVuID0gaXNfa2V5d29yZChwdHIsIGxlbiwgInRpbnkiKSkpCisJCQkJdWMtPmRhdGEgfD0gREVCVUdfVElOWTsKKwkJCWVsc2UgaWYJKChhcmdfbGVuID0gaXNfa2V5d29yZChwdHIsIGxlbiwgInRpbWluZyIpKSkKKwkJCQl1Yy0+ZGF0YSB8PSBERUJVR19USU1JTkc7CisJCQllbHNlIGlmCSgoYXJnX2xlbiA9IGlzX2tleXdvcmQocHRyLCBsZW4sICJuZWdvIikpKQorCQkJCXVjLT5kYXRhIHw9IERFQlVHX05FR087CisJCQllbHNlIGlmCSgoYXJnX2xlbiA9IGlzX2tleXdvcmQocHRyLCBsZW4sICJ0YWdzIikpKQorCQkJCXVjLT5kYXRhIHw9IERFQlVHX1RBR1M7CisJCQllbHNlIGlmCSgoYXJnX2xlbiA9IGlzX2tleXdvcmQocHRyLCBsZW4sICJwb2ludGVyIikpKQorCQkJCXVjLT5kYXRhIHw9IERFQlVHX1BPSU5URVI7CisJCQllbHNlCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlwdHIgKz0gYXJnX2xlbjsgbGVuIC09IGFyZ19sZW47CisJCX0KKyNpZmRlZiBERUJVR19QUk9DX0lORk8KK3ByaW50aygic3ltX3VzZXJfY29tbWFuZDogZGF0YT0lbGRcbiIsIHVjLT5kYXRhKTsKKyNlbmRpZgorCQlicmVhazsKKyNlbmRpZiAvKiBTWU1fTElOVVhfREVCVUdfQ09OVFJPTF9TVVBQT1JUICovCisJY2FzZSBVQ19TRVRGTEFHOgorCQl3aGlsZSAobGVuID4gMCkgeworCQkJU0tJUF9TUEFDRVMocHRyLCBsZW4pOworCQkJaWYJKChhcmdfbGVuID0gaXNfa2V5d29yZChwdHIsIGxlbiwgIm5vX2Rpc2MiKSkpCisJCQkJdWMtPmRhdGEgJj0gflNZTV9ESVNDX0VOQUJMRUQ7CisJCQllbHNlCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlwdHIgKz0gYXJnX2xlbjsgbGVuIC09IGFyZ19sZW47CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKGxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUobnAtPnMuaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXN5bV9leGVjX3VzZXJfY29tbWFuZCAobnAsIHVjKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShucC0+cy5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl9CisJcmV0dXJuIGxlbmd0aDsKK30KKworI2VuZGlmCS8qIFNZTV9MSU5VWF9VU0VSX0NPTU1BTkRfU1VQUE9SVCAqLworCisKKyNpZmRlZiBTWU1fTElOVVhfVVNFUl9JTkZPX1NVUFBPUlQKKy8qCisgKiAgSW5mb3JtYXRpb25zIHRocm91Z2ggdGhlIHByb2MgZmlsZSBzeXN0ZW0uCisgKi8KK3N0cnVjdCBpbmZvX3N0ciB7CisJY2hhciAqYnVmZmVyOworCWludCBsZW5ndGg7CisJaW50IG9mZnNldDsKKwlpbnQgcG9zOworfTsKKworc3RhdGljIHZvaWQgY29weV9tZW1faW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJaWYgKGluZm8tPnBvcyArIGxlbiA+IGluZm8tPmxlbmd0aCkKKwkJbGVuID0gaW5mby0+bGVuZ3RoIC0gaW5mby0+cG9zOworCisJaWYgKGluZm8tPnBvcyArIGxlbiA8IGluZm8tPm9mZnNldCkgeworCQlpbmZvLT5wb3MgKz0gbGVuOworCQlyZXR1cm47CisJfQorCWlmIChpbmZvLT5wb3MgPCBpbmZvLT5vZmZzZXQpIHsKKwkJZGF0YSArPSAoaW5mby0+b2Zmc2V0IC0gaW5mby0+cG9zKTsKKwkJbGVuICAtPSAoaW5mby0+b2Zmc2V0IC0gaW5mby0+cG9zKTsKKwl9CisKKwlpZiAobGVuID4gMCkgeworCQltZW1jcHkoaW5mby0+YnVmZmVyICsgaW5mby0+cG9zLCBkYXRhLCBsZW4pOworCQlpbmZvLT5wb3MgKz0gbGVuOworCX0KK30KKworc3RhdGljIGludCBjb3B5X2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY2hhciBidWZbODFdOworCWludCBsZW47CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWxlbiA9IHZzcHJpbnRmKGJ1ZiwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwljb3B5X21lbV9pbmZvKGluZm8sIGJ1ZiwgbGVuKTsKKwlyZXR1cm4gbGVuOworfQorCisvKgorICogIENvcHkgZm9ybWF0dGVkIGluZm9ybWF0aW9uIGludG8gdGhlIGlucHV0IGJ1ZmZlci4KKyAqLworc3RhdGljIGludCBzeW1faG9zdF9pbmZvKHN0cnVjdCBzeW1faGNiICpucCwgY2hhciAqcHRyLCBvZmZfdCBvZmZzZXQsIGludCBsZW4pCit7CisJc3RydWN0IGluZm9fc3RyIGluZm87CisKKwlpbmZvLmJ1ZmZlcgk9IHB0cjsKKwlpbmZvLmxlbmd0aAk9IGxlbjsKKwlpbmZvLm9mZnNldAk9IG9mZnNldDsKKwlpbmZvLnBvcwk9IDA7CisKKwljb3B5X2luZm8oJmluZm8sICJDaGlwICIgTkFNRTUzQyAiJXMsIGRldmljZSBpZCAweCV4LCAiCisJCQkgInJldmlzaW9uIGlkIDB4JXhcbiIsCisJCQkgbnAtPnMuY2hpcF9uYW1lLCBucC0+ZGV2aWNlX2lkLCBucC0+cmV2aXNpb25faWQpOworCWNvcHlfaW5mbygmaW5mbywgIkF0IFBDSSBhZGRyZXNzICVzLCBJUlEgIiBJUlFfRk1UICJcbiIsCisJCXBjaV9uYW1lKG5wLT5zLmRldmljZSksIElSUV9QUk0obnAtPnMuaXJxKSk7CisJY29weV9pbmZvKCZpbmZvLCAiTWluLiBwZXJpb2QgZmFjdG9yICVkLCAlcyBTQ1NJIEJVUyVzXG4iLAorCQkJIChpbnQpIChucC0+bWluc3luY19kdCA/IG5wLT5taW5zeW5jX2R0IDogbnAtPm1pbnN5bmMpLAorCQkJIG5wLT5tYXh3aWRlID8gIldpZGUiIDogIk5hcnJvdyIsCisJCQkgbnAtPm1pbnN5bmNfZHQgPyAiLCBEVCBjYXBhYmxlIiA6ICIiKTsKKworCWNvcHlfaW5mbygmaW5mbywgIk1heC4gc3RhcnRlZCBjb21tYW5kcyAlZCwgIgorCQkJICJtYXguIGNvbW1hbmRzIHBlciBMVU4gJWRcbiIsCisJCQkgU1lNX0NPTkZfTUFYX1NUQVJULCBTWU1fQ09ORl9NQVhfVEFHKTsKKworCXJldHVybiBpbmZvLnBvcyA+IGluZm8ub2Zmc2V0PyBpbmZvLnBvcyAtIGluZm8ub2Zmc2V0IDogMDsKK30KKyNlbmRpZiAvKiBTWU1fTElOVVhfVVNFUl9JTkZPX1NVUFBPUlQgKi8KKworLyoKKyAqICBFbnRyeSBwb2ludCBvZiB0aGUgc2NzaSBwcm9jIGZzIG9mIHRoZSBkcml2ZXIuCisgKiAgLSBmdW5jID0gMCBtZWFucyByZWFkICAocmV0dXJucyBhZGFwdGVyIGluZm9zKQorICogIC0gZnVuYyA9IDEgbWVhbnMgd3JpdGUgKG5vdCB5ZXQgbWVyZ2V0IGZyb20gc3ltNTNjOHh4KQorICovCitzdGF0aWMgaW50IHN5bTUzYzh4eF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgY2hhciAqYnVmZmVyLAorCQkJY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBmdW5jKQoreworCXN0cnVjdCBzeW1faGNiICpucCA9IHN5bV9nZXRfaGNiKGhvc3QpOworCWludCByZXR2OworCisJaWYgKGZ1bmMpIHsKKyNpZmRlZglTWU1fTElOVVhfVVNFUl9DT01NQU5EX1NVUFBPUlQKKwkJcmV0diA9IHN5bV91c2VyX2NvbW1hbmQobnAsIGJ1ZmZlciwgbGVuZ3RoKTsKKyNlbHNlCisJCXJldHYgPSAtRUlOVkFMOworI2VuZGlmCisJfSBlbHNlIHsKKwkJaWYgKHN0YXJ0KQorCQkJKnN0YXJ0ID0gYnVmZmVyOworI2lmZGVmIFNZTV9MSU5VWF9VU0VSX0lORk9fU1VQUE9SVAorCQlyZXR2ID0gc3ltX2hvc3RfaW5mbyhucCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisjZWxzZQorCQlyZXR2ID0gLUVJTlZBTDsKKyNlbmRpZgorCX0KKworCXJldHVybiByZXR2OworfQorI2VuZGlmIC8qIFNZTV9MSU5VWF9QUk9DX0lORk9fU1VQUE9SVCAqLworCisvKgorICoJRnJlZSBjb250cm9sbGVyIHJlc291cmNlcy4KKyAqLworc3RhdGljIHZvaWQgc3ltX2ZyZWVfcmVzb3VyY2VzKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJLyoKKwkgKiAgRnJlZSBPL1Mgc3BlY2lmaWMgcmVzb3VyY2VzLgorCSAqLworCWlmIChucC0+cy5pcnEpCisJCWZyZWVfaXJxKG5wLT5zLmlycSwgbnApOworCWlmIChucC0+cy5pb2FkZHIpCisJCXBjaV9pb3VubWFwKHBkZXYsIG5wLT5zLmlvYWRkcik7CisJaWYgKG5wLT5zLnJhbWFkZHIpCisJCXBjaV9pb3VubWFwKHBkZXYsIG5wLT5zLnJhbWFkZHIpOworCS8qCisJICogIEZyZWUgTy9TIGluZGVwZW5kZW50IHJlc291cmNlcy4KKwkgKi8KKwlzeW1faGNiX2ZyZWUobnApOworCisJc3ltX21mcmVlX2RtYShucCwgc2l6ZW9mKCpucCksICJIQ0IiKTsKK30KKworLyoKKyAqICBBc2svdGVsbCB0aGUgc3lzdGVtIGFib3V0IERNQSBhZGRyZXNzaW5nLgorICovCitzdGF0aWMgaW50IHN5bV9zZXR1cF9idXNfZG1hX21hc2soc3RydWN0IHN5bV9oY2IgKm5wKQoreworI2lmIFNZTV9DT05GX0RNQV9BRERSRVNTSU5HX01PREUgPiAwCisjaWYgICBTWU1fQ09ORl9ETUFfQUREUkVTU0lOR19NT0RFID09IDEKKyNkZWZpbmUJRE1BX0RBQ19NQVNLCTB4MDAwMDAwZmZmZmZmZmZmZlVMTCAvKiA0MC1iaXQgKi8KKyNlbGlmIFNZTV9DT05GX0RNQV9BRERSRVNTSU5HX01PREUgPT0gMgorI2RlZmluZQlETUFfREFDX01BU0sJRE1BXzY0QklUX01BU0sKKyNlbmRpZgorCWlmICgobnAtPmZlYXR1cmVzICYgRkVfREFDKSAmJgorCQkJIXBjaV9zZXRfZG1hX21hc2sobnAtPnMuZGV2aWNlLCBETUFfREFDX01BU0spKSB7CisJCW5wLT51c2VfZGFjID0gMTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKKwlpZiAoIXBjaV9zZXRfZG1hX21hc2sobnAtPnMuZGV2aWNlLCBETUFfMzJCSVRfTUFTSykpCisJCXJldHVybiAwOworCisJcHJpbnRmX3dhcm5pbmcoIiVzOiBObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlXG4iLCBzeW1fbmFtZShucCkpOworCXJldHVybiAtMTsKK30KKworLyoKKyAqICBIb3N0IGF0dGFjaCBhbmQgaW5pdGlhbGlzYXRpb25zLgorICoKKyAqICBBbGxvY2F0ZSBob3N0IGRhdGEgYW5kIG5jYiBzdHJ1Y3R1cmUuCisgKiAgUmVtYXAgTU1JTyByZWdpb24uCisgKiAgRG8gY2hpcCBpbml0aWFsaXphdGlvbi4KKyAqICBJZiBhbGwgaXMgT0ssIGluc3RhbGwgaW50ZXJydXB0IGhhbmRsaW5nIGFuZAorICogIHN0YXJ0IHRoZSB0aW1lciBkYWVtb24uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICogX19kZXZpbml0IHN5bV9hdHRhY2goc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCwKKwkJaW50IHVuaXQsIHN0cnVjdCBzeW1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhvc3RfZGF0YSAqaG9zdF9kYXRhOworCXN0cnVjdCBzeW1faGNiICpucCA9IE5VTEw7CisJc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UgPSBOVUxMOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2LT5wZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHN5bV9mdyAqZnc7CisKKwlwcmludGsoS0VSTl9JTkZPCisJCSJzeW0lZDogPCVzPiByZXYgMHgleCBhdCBwY2kgJXMgaXJxICIgSVJRX0ZNVCAiXG4iLAorCQl1bml0LCBkZXYtPmNoaXAubmFtZSwgZGV2LT5jaGlwLnJldmlzaW9uX2lkLAorCQlwY2lfbmFtZShwZGV2KSwgSVJRX1BSTShwZGV2LT5pcnEpKTsKKworCS8qCisJICogIEdldCB0aGUgZmlybXdhcmUgZm9yIHRoaXMgY2hpcC4KKwkgKi8KKwlmdyA9IHN5bV9maW5kX2Zpcm13YXJlKCZkZXYtPmNoaXApOworCWlmICghZncpCisJCWdvdG8gYXR0YWNoX2ZhaWxlZDsKKworCS8qCisJICoJQWxsb2NhdGUgaG9zdF9kYXRhIHN0cnVjdHVyZQorCSAqLworCWluc3RhbmNlID0gc2NzaV9ob3N0X2FsbG9jKHRwbnQsIHNpemVvZigqaG9zdF9kYXRhKSk7CisJaWYgKCFpbnN0YW5jZSkKKwkJZ290byBhdHRhY2hfZmFpbGVkOworCWhvc3RfZGF0YSA9IChzdHJ1Y3QgaG9zdF9kYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKKworCS8qCisJICogIEFsbG9jYXRlIGltbWVkaWF0ZWx5IHRoZSBob3N0IGNvbnRyb2wgYmxvY2ssIAorCSAqICBzaW5jZSB3ZSBhcmUgb25seSBleHBlY3RpbmcgdG8gc3VjY2VlZC4gOikKKwkgKiAgV2Uga2VlcCB0cmFjayBpbiB0aGUgSENCIG9mIGFsbCB0aGUgcmVzb3VyY2VzIHRoYXQgCisJICogIGFyZSB0byBiZSByZWxlYXNlZCBvbiBlcnJvci4KKwkgKi8KKwlucCA9IF9fc3ltX2NhbGxvY19kbWEoJnBkZXYtPmRldiwgc2l6ZW9mKCpucCksICJIQ0IiKTsKKwlpZiAoIW5wKQorCQlnb3RvIGF0dGFjaF9mYWlsZWQ7CisJbnAtPnMuZGV2aWNlID0gcGRldjsKKwlucC0+YnVzX2RtYXQgPSAmcGRldi0+ZGV2OyAvKiBSZXN1bHQgaW4gMSBETUEgcG9vbCBwZXIgSEJBICovCisJaG9zdF9kYXRhLT5uY2IgPSBucDsKKwlucC0+cy5ob3N0ID0gaW5zdGFuY2U7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgbnApOworCisJLyoKKwkgKiAgQ29weSBzb21lIHVzZWZ1bCBpbmZvcyB0byB0aGUgSENCLgorCSAqLworCW5wLT5oY2JfYmEJPSB2dG9idXMobnApOworCW5wLT52ZXJib3NlCT0gc3ltX2RyaXZlcl9zZXR1cC52ZXJib3NlOworCW5wLT5zLmRldmljZQk9IHBkZXY7CisJbnAtPnMudW5pdAk9IHVuaXQ7CisJbnAtPmRldmljZV9pZAk9IGRldi0+Y2hpcC5kZXZpY2VfaWQ7CisJbnAtPnJldmlzaW9uX2lkCT0gZGV2LT5jaGlwLnJldmlzaW9uX2lkOworCW5wLT5mZWF0dXJlcwk9IGRldi0+Y2hpcC5mZWF0dXJlczsKKwlucC0+Y2xvY2tfZGl2bgk9IGRldi0+Y2hpcC5ucl9kaXZpc29yOworCW5wLT5tYXhvZmZzCT0gZGV2LT5jaGlwLm9mZnNldF9tYXg7CisJbnAtPm1heGJ1cnN0CT0gZGV2LT5jaGlwLmJ1cnN0X21heDsKKwlucC0+bXlhZGRyCT0gZGV2LT5ob3N0X2lkOworCisJLyoKKwkgKiAgRWRpdCBpdHMgbmFtZS4KKwkgKi8KKwlzdHJsY3B5KG5wLT5zLmNoaXBfbmFtZSwgZGV2LT5jaGlwLm5hbWUsIHNpemVvZihucC0+cy5jaGlwX25hbWUpKTsKKwlzcHJpbnRmKG5wLT5zLmluc3RfbmFtZSwgInN5bSVkIiwgbnAtPnMudW5pdCk7CisKKwlpZiAoc3ltX3NldHVwX2J1c19kbWFfbWFzayhucCkpCisJCWdvdG8gYXR0YWNoX2ZhaWxlZDsKKworCS8qCisJICogIFRyeSB0byBtYXAgdGhlIGNvbnRyb2xsZXIgY2hpcCB0bworCSAqICB2aXJ0dWFsIGFuZCBwaHlzaWNhbCBtZW1vcnkuCisJICovCisJbnAtPm1taW9fYmEgPSAodTMyKWRldi0+bW1pb19iYXNlOworCW5wLT5zLmlvYWRkcgk9IGRldi0+cy5pb2FkZHI7CisJbnAtPnMucmFtYWRkcgk9IGRldi0+cy5yYW1hZGRyOworCW5wLT5zLmlvX3dzID0gKG5wLT5mZWF0dXJlcyAmIEZFX0lPMjU2KSA/IDI1NiA6IDEyODsKKworCS8qCisJICogIE1hcCBvbi1jaGlwIFJBTSBpZiBwcmVzZW50IGFuZCBzdXBwb3J0ZWQuCisJICovCisJaWYgKCEobnAtPmZlYXR1cmVzICYgRkVfUkFNKSkKKwkJZGV2LT5yYW1fYmFzZSA9IDA7CisJaWYgKGRldi0+cmFtX2Jhc2UpIHsKKwkJbnAtPnJhbV9iYSA9ICh1MzIpZGV2LT5yYW1fYmFzZTsKKwkJbnAtPnJhbV93cyA9IChucC0+ZmVhdHVyZXMgJiBGRV9SQU04SykgPyA4MTkyIDogNDA5NjsKKwl9CisKKwlpZiAoc3ltX2hjYl9hdHRhY2goaW5zdGFuY2UsIGZ3LCBkZXYtPm52cmFtKSkKKwkJZ290byBhdHRhY2hfZmFpbGVkOworCisJLyoKKwkgKiAgSW5zdGFsbCB0aGUgaW50ZXJydXB0IGhhbmRsZXIuCisJICogIElmIHdlIHN5bmNob25pemUgdGhlIEMgY29kZSB3aXRoIFNDUklQVFMgb24gaW50ZXJydXB0LCAKKwkgKiAgd2UgZG8gbm90IHdhbnQgdG8gc2hhcmUgdGhlIElOVFIgbGluZSBhdCBhbGwuCisJICovCisJaWYgKHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgc3ltNTNjOHh4X2ludHIsIFNBX1NISVJRLCBOQU1FNTNDOFhYLCBucCkpIHsKKwkJcHJpbnRmX2VycigiJXM6IHJlcXVlc3QgaXJxICVkIGZhaWx1cmVcbiIsCisJCQlzeW1fbmFtZShucCksIHBkZXYtPmlycSk7CisJCWdvdG8gYXR0YWNoX2ZhaWxlZDsKKwl9CisJbnAtPnMuaXJxID0gcGRldi0+aXJxOworCisJLyoKKwkgKiAgQWZ0ZXIgU0NTSSBkZXZpY2VzIGhhdmUgYmVlbiBvcGVuZWQsIHdlIGNhbm5vdAorCSAqICByZXNldCB0aGUgYnVzIHNhZmVseSwgc28gd2UgZG8gaXQgaGVyZS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+aG9zdF9sb2NrLCBmbGFncyk7CisJaWYgKHN5bV9yZXNldF9zY3NpX2J1cyhucCwgMCkpCisJCWdvdG8gcmVzZXRfZmFpbGVkOworCisJLyoKKwkgKiAgU3RhcnQgdGhlIFNDUklQVFMuCisJICovCisJc3ltX3N0YXJ0X3VwIChucCwgMSk7CisKKwkvKgorCSAqICBTdGFydCB0aGUgdGltZXIgZGFlbW9uCisJICovCisJaW5pdF90aW1lcigmbnAtPnMudGltZXIpOworCW5wLT5zLnRpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpIG5wOworCW5wLT5zLnRpbWVyLmZ1bmN0aW9uID0gc3ltNTNjOHh4X3RpbWVyOworCW5wLT5zLmxhc3R0aW1lPTA7CisJc3ltX3RpbWVyIChucCk7CisKKwkvKgorCSAqICBGaWxsIExpbnV4IGhvc3QgaW5zdGFuY2Ugc3RydWN0dXJlCisJICogIGFuZCByZXR1cm4gc3VjY2Vzcy4KKwkgKi8KKwlpbnN0YW5jZS0+bWF4X2NoYW5uZWwJPSAwOworCWluc3RhbmNlLT50aGlzX2lkCT0gbnAtPm15YWRkcjsKKwlpbnN0YW5jZS0+bWF4X2lkCT0gbnAtPm1heHdpZGUgPyAxNiA6IDg7CisJaW5zdGFuY2UtPm1heF9sdW4JPSBTWU1fQ09ORl9NQVhfTFVOOworCWluc3RhbmNlLT51bmlxdWVfaWQJPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJaW5zdGFuY2UtPmNtZF9wZXJfbHVuCT0gU1lNX0NPTkZfTUFYX1RBRzsKKwlpbnN0YW5jZS0+Y2FuX3F1ZXVlCT0gKFNZTV9DT05GX01BWF9TVEFSVC0yKTsKKwlpbnN0YW5jZS0+c2dfdGFibGVzaXplCT0gU1lNX0NPTkZfTUFYX1NHOworCWluc3RhbmNlLT5tYXhfY21kX2xlbgk9IDE2OworCUJVR19PTihzeW0yX3RyYW5zcG9ydF90ZW1wbGF0ZSA9PSBOVUxMKTsKKwlpbnN0YW5jZS0+dHJhbnNwb3J0dAk9IHN5bTJfdHJhbnNwb3J0X3RlbXBsYXRlOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gaW5zdGFuY2U7CisKKyByZXNldF9mYWlsZWQ6CisJcHJpbnRmX2VycigiJXM6IEZBVEFMIEVSUk9SOiBDSEVDSyBTQ1NJIEJVUyAtIENBQkxFUywgIgorCQkgICAiVEVSTUlOQVRJT04sIERFVklDRSBQT1dFUiBldGMuIVxuIiwgc3ltX25hbWUobnApKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5ob3N0X2xvY2ssIGZsYWdzKTsKKyBhdHRhY2hfZmFpbGVkOgorCWlmICghaW5zdGFuY2UpCisJCXJldHVybiBOVUxMOworCXByaW50Zl9pbmZvKCIlczogZ2l2aW5nIHVwIC4uLlxuIiwgc3ltX25hbWUobnApKTsKKwlpZiAobnApCisJCXN5bV9mcmVlX3Jlc291cmNlcyhucCwgcGRldik7CisJc2NzaV9ob3N0X3B1dChpbnN0YW5jZSk7CisKKwlyZXR1cm4gTlVMTDsKKyB9CisKKworLyoKKyAqICAgIERldGVjdCBhbmQgdHJ5IHRvIHJlYWQgU1lNQklPUyBhbmQgVEVLUkFNIE5WUkFNLgorICovCisjaWYgU1lNX0NPTkZfTlZSQU1fU1VQUE9SVAorc3RhdGljIHZvaWQgX19kZXZpbml0IHN5bV9nZXRfbnZyYW0oc3RydWN0IHN5bV9kZXZpY2UgKmRldnAsIHN0cnVjdCBzeW1fbnZyYW0gKm52cCkKK3sKKwlkZXZwLT5udnJhbSA9IG52cDsKKwlkZXZwLT5kZXZpY2VfaWQgPSBkZXZwLT5jaGlwLmRldmljZV9pZDsKKwludnAtPnR5cGUgPSAwOworCisJc3ltX3JlYWRfbnZyYW0oZGV2cCwgbnZwKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgc3ltX2dldF9udnJhbShzdHJ1Y3Qgc3ltX2RldmljZSAqZGV2cCwgc3RydWN0IHN5bV9udnJhbSAqbnZwKQoreworfQorI2VuZGlmCS8qIFNZTV9DT05GX05WUkFNX1NVUFBPUlQgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgc3ltX2NoZWNrX3N1cHBvcnRlZChzdHJ1Y3Qgc3ltX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBzeW1fY2hpcCAqY2hpcDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldmljZS0+cGRldjsKKwl1X2NoYXIgcmV2aXNpb247CisJdW5zaWduZWQgbG9uZyBpb19wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWludCBpOworCisJLyoKKwkgKiAgSWYgdXNlciBleGNsdWRlZCB0aGlzIGNoaXAsIGRvIG5vdCBpbml0aWFsaXplIGl0LgorCSAqICBJIGhhdGUgdGhpcyBjb2RlIHNvIG11Y2guICBNdXN0IGtpbGwgaXQuCisJICovCisJaWYgKGlvX3BvcnQpIHsKKwkJZm9yIChpID0gMCA7IGkgPCA4IDsgaSsrKSB7CisJCQlpZiAoc3ltX2RyaXZlcl9zZXR1cC5leGNsdWRlc1tpXSA9PSBpb19wb3J0KQorCQkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgY2hpcCBpcyBzdXBwb3J0ZWQuICBUaGVuIGNvcHkgdGhlIGNoaXAgZGVzY3JpcHRpb24KKwkgKiB0byBvdXIgZGV2aWNlIHN0cnVjdHVyZSBzbyB3ZSBjYW4gbWFrZSBpdCBtYXRjaCB0aGUgYWN0dWFsIGRldmljZQorCSAqIGFuZCBvcHRpb25zLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJnJldmlzaW9uKTsKKwljaGlwID0gc3ltX2xvb2t1cF9jaGlwX3RhYmxlKHBkZXYtPmRldmljZSwgcmV2aXNpb24pOworCWlmICghY2hpcCkgeworCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiZGV2aWNlIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJbWVtY3B5KCZkZXZpY2UtPmNoaXAsIGNoaXAsIHNpemVvZihkZXZpY2UtPmNoaXApKTsKKwlkZXZpY2UtPmNoaXAucmV2aXNpb25faWQgPSByZXZpc2lvbjsKKworCXJldHVybiAwOworfQorCisvKgorICogSWdub3JlIFN5bWJpb3MgY2hpcHMgY29udHJvbGxlZCBieSB2YXJpb3VzIFJBSUQgY29udHJvbGxlcnMuCisgKiBUaGVzZSBjb250cm9sbGVycyBzZXQgdmFsdWUgMHg1MjQxNDk0NCBhdCBSQU0gZW5kIC0gMTYuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHN5bV9jaGVja19yYWlkKHN0cnVjdCBzeW1fZGV2aWNlICpkZXZpY2UpCit7CisJdW5zaWduZWQgaW50IHJhbV9zaXplLCByYW1fdmFsOworCisJaWYgKCFkZXZpY2UtPnMucmFtYWRkcikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZGV2aWNlLT5jaGlwLmZlYXR1cmVzICYgRkVfUkFNOEspCisJCXJhbV9zaXplID0gODE5MjsKKwllbHNlCisJCXJhbV9zaXplID0gNDA5NjsKKworCXJhbV92YWwgPSByZWFkbChkZXZpY2UtPnMucmFtYWRkciArIHJhbV9zaXplIC0gMTYpOworCWlmIChyYW1fdmFsICE9IDB4NTI0MTQ5NDQpCisJCXJldHVybiAwOworCisJZGV2X2luZm8oJmRldmljZS0+cGRldi0+ZGV2LAorCQkJIm5vdCBpbml0aWFsaXppbmcsIGRyaXZlbiBieSBSQUlEIGNvbnRyb2xsZXIuXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc3ltX3NldF93b3JrYXJvdW5kcyhzdHJ1Y3Qgc3ltX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBzeW1fY2hpcCAqY2hpcCA9ICZkZXZpY2UtPmNoaXA7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXZpY2UtPnBkZXY7CisJdV9zaG9ydCBzdGF0dXNfcmVnOworCisJLyoKKwkgKiAgKElURU0gMTIgb2YgYSBERUwgYWJvdXQgdGhlIDg5NiBJIGhhdmVuJ3QgeWV0KS4KKwkgKiAgV2UgbXVzdCBlbnN1cmUgdGhlIGNoaXAgd2lsbCB1c2UgV1JJVEUgQU5EIElOVkFMSURBVEUuCisJICogIFRoZSByZXZpc2lvbiBudW1iZXIgbGltaXQgaXMgZm9yIG5vdyBhcmJpdHJhcnkuCisJICovCisJaWYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05DUl81M0M4OTYgJiYgY2hpcC0+cmV2aXNpb25faWQgPCAweDQpIHsKKwkJY2hpcC0+ZmVhdHVyZXMJfD0gKEZFX1dSSUUgfCBGRV9DTFNFKTsKKwl9CisKKwkvKiBJZiB0aGUgY2hpcCBjYW4gZG8gTWVtb3J5IFdyaXRlIEludmFsaWRhdGUsIGVuYWJsZSBpdCAqLworCWlmIChjaGlwLT5mZWF0dXJlcyAmIEZFX1dSSUUpIHsKKwkJaWYgKHBjaV9zZXRfbXdpKHBkZXYpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyoKKwkgKiAgV29yayBhcm91bmQgZm9yIGVycmFudCBiaXQgaW4gODk1QS4gVGhlIDY2TWh6CisJICogIGNhcGFibGUgYml0IGlzIHNldCBlcnJvbmVvdXNseS4gQ2xlYXIgdGhpcyBiaXQuCisJICogIChJdGVtIDEgREVMIDUzMykKKwkgKgorCSAqICBNYWtlIHN1cmUgQ29uZmlnIHNwYWNlIGFuZCBGZWF0dXJlcyBhZ3JlZS4KKwkgKgorCSAqICBSZWNhbGw6IHdyaXRlcyBhcmUgbm90IG5vcm1hbCB0byBzdGF0dXMgcmVnaXN0ZXIgLQorCSAqICB3cml0ZSBhIDEgdG8gY2xlYXIgYW5kIGEgMCB0byBsZWF2ZSB1bmNoYW5nZWQuCisJICogIENhbiBvbmx5IHJlc2V0IGJpdHMuCisJICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX1NUQVRVUywgJnN0YXR1c19yZWcpOworCWlmIChjaGlwLT5mZWF0dXJlcyAmIEZFXzY2TUhaKSB7CisJCWlmICghKHN0YXR1c19yZWcgJiBQQ0lfU1RBVFVTXzY2TUhaKSkKKwkJCWNoaXAtPmZlYXR1cmVzICY9IH5GRV82Nk1IWjsKKwl9IGVsc2UgeworCQlpZiAoc3RhdHVzX3JlZyAmIFBDSV9TVEFUVVNfNjZNSFopIHsKKwkJCXN0YXR1c19yZWcgPSBQQ0lfU1RBVFVTXzY2TUhaOworCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVEFUVVMsIHN0YXR1c19yZWcpOworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX1NUQVRVUywgJnN0YXR1c19yZWcpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgUmVhZCBhbmQgY2hlY2sgdGhlIFBDSSBjb25maWd1cmF0aW9uIGZvciBhbnkgZGV0ZWN0ZWQgTkNSIAorICogIGJvYXJkcyBhbmQgc2F2ZSBkYXRhIGZvciBhdHRhY2hpbmcgYWZ0ZXIgYWxsIGJvYXJkcyBoYXZlIAorICogIGJlZW4gZGV0ZWN0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorc3ltX2luaXRfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc3ltX2RldmljZSAqZGV2aWNlKQoreworCWludCBpOworCisJZGV2aWNlLT5ob3N0X2lkID0gU1lNX1NFVFVQX0hPU1RfSUQ7CisJZGV2aWNlLT5wZGV2ID0gcGRldjsKKworCWkgPSBwY2lfZ2V0X2Jhc2VfYWRkcmVzcyhwZGV2LCAxLCAmZGV2aWNlLT5tbWlvX2Jhc2UpOworCXBjaV9nZXRfYmFzZV9hZGRyZXNzKHBkZXYsIGksICZkZXZpY2UtPnJhbV9iYXNlKTsKKworI2lmbmRlZiBDT05GSUdfU0NTSV9TWU01M0M4WFhfSU9NQVBQRUQKKwlpZiAoZGV2aWNlLT5tbWlvX2Jhc2UpCisJCWRldmljZS0+cy5pb2FkZHIgPSBwY2lfaW9tYXAocGRldiwgMSwKKwkJCQkJCXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkpOworI2VuZGlmCisJaWYgKCFkZXZpY2UtPnMuaW9hZGRyKQorCQlkZXZpY2UtPnMuaW9hZGRyID0gcGNpX2lvbWFwKHBkZXYsIDAsCisJCQkJCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKKwlpZiAoZGV2aWNlLT5yYW1fYmFzZSkKKwkJZGV2aWNlLT5zLnJhbWFkZHIgPSBwY2lfaW9tYXAocGRldiwgaSwKKwkJCQkJCXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaSkpOworfQorCisvKgorICogVGhlIE5DUiBQUVMgYW5kIFBEUyBjYXJkcyBhcmUgY29uc3RydWN0ZWQgYXMgYSBERUMgYnJpZGdlCisgKiBiZWhpbmQgd2hpY2ggc2l0cyBhIHByb3ByaWV0YXJ5IE5DUiBtZW1vcnkgY29udHJvbGxlciBhbmQKKyAqIGVpdGhlciBmb3VyIG9yIHR3byA1M2M4NzVzIGFzIHNlcGFyYXRlIGRldmljZXMuICBXZSBjYW4gdGVsbAorICogaWYgYW4gODc1IGlzIHBhcnQgb2YgYSBQUVMvUERTIG9yIG5vdCBzaW5jZSBpZiBpdCBpcywgaXQgd2lsbAorICogYmUgb24gdGhlIHNhbWUgYnVzIGFzIHRoZSBtZW1vcnkgY29udHJvbGxlci4gIEluIGl0cyB1c3VhbAorICogbW9kZSBvZiBvcGVyYXRpb24sIHRoZSA4NzVzIGFyZSBzbGF2ZWQgdG8gdGhlIG1lbW9yeQorICogY29udHJvbGxlciBmb3IgYWxsIHRyYW5zZmVycy4gIFRvIG9wZXJhdGUgd2l0aCB0aGUgTGludXgKKyAqIGRyaXZlciwgdGhlIG1lbW9yeSBjb250cm9sbGVyIGlzIGRpc2FibGVkIGFuZCB0aGUgODc1cworICogZnJlZWQgdG8gZnVuY3Rpb24gaW5kZXBlbmRlbnRseS4gIFRoZSBvbmx5IHdyaW5rbGUgaXMgdGhhdAorICogdGhlIHByZXNldCBTQ1NJIElEICh3aGljaCBtYXkgYmUgemVybykgbXVzdCBiZSByZWFkIGluIGZyb20KKyAqIGEgc3BlY2lhbCBjb25maWd1cmF0aW9uIHNwYWNlIHJlZ2lzdGVyIG9mIHRoZSA4NzUuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9jb25maWdfcHFzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc3ltX2RldmljZSAqc3ltX2RldikKK3sKKwlpbnQgc2xvdDsKKwl1OCB0bXA7CisKKwlmb3IgKHNsb3QgPSAwOyBzbG90IDwgMjU2OyBzbG90KyspIHsKKwkJc3RydWN0IHBjaV9kZXYgKm1lbWMgPSBwY2lfZ2V0X3Nsb3QocGRldi0+YnVzLCBzbG90KTsKKworCQlpZiAoIW1lbWMgfHwgbWVtYy0+dmVuZG9yICE9IDB4MTAxYSB8fCBtZW1jLT5kZXZpY2UgPT0gMHgwMDA5KSB7CisJCQlwY2lfZGV2X3B1dChtZW1jKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogYml0IDE6IGFsbG93IGluZGl2aWR1YWwgODc1IGNvbmZpZ3VyYXRpb24gKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUobWVtYywgMHg0NCwgJnRtcCk7CisJCWlmICgodG1wICYgMHgyKSA9PSAwKSB7CisJCQl0bXAgfD0gMHgyOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKG1lbWMsIDB4NDQsIHRtcCk7CisJCX0KKworCQkvKiBiaXQgMjogZHJpdmUgaW5kaXZpZHVhbCA4NzUgaW50ZXJydXB0cyB0byB0aGUgYnVzICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKG1lbWMsIDB4NDUsICZ0bXApOworCQlpZiAoKHRtcCAmIDB4NCkgPT0gMCkgeworCQkJdG1wIHw9IDB4NDsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShtZW1jLCAweDQ1LCB0bXApOworCQl9CisKKwkJcGNpX2Rldl9wdXQobWVtYyk7CisJCWJyZWFrOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4ODQsICZ0bXApOworCXN5bV9kZXYtPmhvc3RfaWQgPSB0bXA7Cit9CisKKy8qCisgKiAgQ2FsbGVkIGJlZm9yZSB1bmxvYWRpbmcgdGhlIG1vZHVsZS4KKyAqICBEZXRhY2ggdGhlIGhvc3QuCisgKiAgV2UgaGF2ZSB0byBmcmVlIHJlc291cmNlcyBhbmQgaGFsdCB0aGUgTkNSIGNoaXAuCisgKi8KK3N0YXRpYyBpbnQgc3ltX2RldGFjaChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXByaW50aygiJXM6IGRldGFjaGluZyAuLi5cbiIsIHN5bV9uYW1lKG5wKSk7CisKKwlkZWxfdGltZXJfc3luYygmbnAtPnMudGltZXIpOworCisJLyoKKwkgKiBSZXNldCBOQ1IgY2hpcC4KKwkgKiBXZSBzaG91bGQgdXNlIHN5bV9zb2Z0X3Jlc2V0KCksIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGRvIAorCSAqIHNvLCBzaW5jZSB3ZSBtYXkgbm90IGJlIHNhZmUgaWYgaW50ZXJydXB0cyBvY2N1ci4KKwkgKi8KKwlwcmludGsoIiVzOiByZXNldHRpbmcgY2hpcFxuIiwgc3ltX25hbWUobnApKTsKKwlPVVRCKG5wLCBuY19pc3RhdCwgU1JTVCk7CisJdWRlbGF5KDEwKTsKKwlPVVRCKG5wLCBuY19pc3RhdCwgMCk7CisKKwlzeW1fZnJlZV9yZXNvdXJjZXMobnAsIHBkZXYpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBEcml2ZXIgaG9zdCB0ZW1wbGF0ZS4KKyAqLworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgc3ltMl90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gInN5bTUzYzh4eCIsCisJLmluZm8JCQk9IHN5bTUzYzh4eF9pbmZvLCAKKwkucXVldWVjb21tYW5kCQk9IHN5bTUzYzh4eF9xdWV1ZV9jb21tYW5kLAorCS5zbGF2ZV9hbGxvYwkJPSBzeW01M2M4eHhfc2xhdmVfYWxsb2MsCisJLnNsYXZlX2NvbmZpZ3VyZQk9IHN5bTUzYzh4eF9zbGF2ZV9jb25maWd1cmUsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gc3ltNTNjOHh4X3NsYXZlX2Rlc3Ryb3ksCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBzeW01M2M4eHhfZWhfYWJvcnRfaGFuZGxlciwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBzeW01M2M4eHhfZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gc3ltNTNjOHh4X2VoX2J1c19yZXNldF9oYW5kbGVyLAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSBzeW01M2M4eHhfZWhfaG9zdF9yZXNldF9oYW5kbGVyLAorCS50aGlzX2lkCQk9IDcsCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORywKKyNpZmRlZiBTWU1fTElOVVhfUFJPQ19JTkZPX1NVUFBPUlQKKwkucHJvY19pbmZvCQk9IHN5bTUzYzh4eF9wcm9jX2luZm8sCisJLnByb2NfbmFtZQkJPSBOQU1FNTNDOFhYLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IGF0dGFjaF9jb3VudDsKKworc3RhdGljIGludCBfX2RldmluaXQgc3ltMl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBzeW1fZGV2aWNlIHN5bV9kZXY7CisJc3RydWN0IHN5bV9udnJhbSBudnJhbTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZTsKKworCW1lbXNldCgmc3ltX2RldiwgMCwgc2l6ZW9mKHN5bV9kZXYpKTsKKwltZW1zZXQoJm52cmFtLCAwLCBzaXplb2YobnZyYW0pKTsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJZ290byBsZWF2ZTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgTkFNRTUzQzhYWCkpCisJCWdvdG8gZGlzYWJsZTsKKworCXN5bV9pbml0X2RldmljZShwZGV2LCAmc3ltX2Rldik7CisJaWYgKHN5bV9jaGVja19zdXBwb3J0ZWQoJnN5bV9kZXYpKQorCQlnb3RvIGZyZWU7CisKKwlpZiAoc3ltX2NoZWNrX3JhaWQoJnN5bV9kZXYpKQorCQlnb3RvIGxlYXZlOwkvKiBEb24ndCBkaXNhYmxlIHRoZSBkZXZpY2UgKi8KKworCWlmIChzeW1fc2V0X3dvcmthcm91bmRzKCZzeW1fZGV2KSkKKwkJZ290byBmcmVlOworCisJc3ltX2NvbmZpZ19wcXMocGRldiwgJnN5bV9kZXYpOworCisJc3ltX2dldF9udnJhbSgmc3ltX2RldiwgJm52cmFtKTsKKworCWluc3RhbmNlID0gc3ltX2F0dGFjaCgmc3ltMl90ZW1wbGF0ZSwgYXR0YWNoX2NvdW50LCAmc3ltX2Rldik7CisJaWYgKCFpbnN0YW5jZSkKKwkJZ290byBmcmVlOworCisJaWYgKHNjc2lfYWRkX2hvc3QoaW5zdGFuY2UsICZwZGV2LT5kZXYpKQorCQlnb3RvIGRldGFjaDsKKwlzY3NpX3NjYW5faG9zdChpbnN0YW5jZSk7CisKKwlhdHRhY2hfY291bnQrKzsKKworCXJldHVybiAwOworCisgZGV0YWNoOgorCXN5bV9kZXRhY2gocGNpX2dldF9kcnZkYXRhKHBkZXYpLCBwZGV2KTsKKyBmcmVlOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisgZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisgbGVhdmU6CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzeW0yX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3Qgc3ltX2hjYiAqbnAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IG5wLT5zLmhvc3Q7CisKKwlzY3NpX3JlbW92ZV9ob3N0KGhvc3QpOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisKKwlzeW1fZGV0YWNoKG5wLCBwZGV2KTsKKworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJYXR0YWNoX2NvdW50LS07Cit9CisKK3N0YXRpYyB2b2lkIHN5bTJfZ2V0X3NpZ25hbGxpbmcoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IHN5bV9oY2IgKm5wID0gc3ltX2dldF9oY2Ioc2hvc3QpOworCWVudW0gc3BpX3NpZ25hbF90eXBlIHR5cGU7CisKKwlzd2l0Y2ggKG5wLT5zY3NpX21vZGUpIHsKKwljYXNlIFNNT0RFX1NFOgorCQl0eXBlID0gU1BJX1NJR05BTF9TRTsKKwkJYnJlYWs7CisJY2FzZSBTTU9ERV9MVkQ6CisJCXR5cGUgPSBTUElfU0lHTkFMX0xWRDsKKwkJYnJlYWs7CisJY2FzZSBTTU9ERV9IVkQ6CisJCXR5cGUgPSBTUElfU0lHTkFMX0hWRDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHlwZSA9IFNQSV9TSUdOQUxfVU5LTk9XTjsKKwkJYnJlYWs7CisJfQorCXNwaV9zaWduYWxsaW5nKHNob3N0KSA9IHR5cGU7Cit9CisKK3N0YXRpYyB2b2lkIHN5bTJfc2V0X29mZnNldChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsIGludCBvZmZzZXQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHN5bV9oY2IgKm5wID0gc3ltX2dldF9oY2Ioc2hvc3QpOworCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W3N0YXJnZXQtPmlkXTsKKworCXRwLT50Z29hbC5vZmZzZXQgPSBvZmZzZXQ7CisJdHAtPnRnb2FsLmNoZWNrX25lZ28gPSAxOworfQorCitzdGF0aWMgdm9pZCBzeW0yX3NldF9wZXJpb2Qoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LCBpbnQgcGVyaW9kKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzeW1faGNiICpucCA9IHN5bV9nZXRfaGNiKHNob3N0KTsKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSAmbnAtPnRhcmdldFtzdGFyZ2V0LT5pZF07CisKKwkvKiBoYXZlIHRvIGhhdmUgRFQgZm9yIHRoZXNlIHRyYW5zZmVycyAqLworCWlmIChwZXJpb2QgPD0gbnAtPm1pbnN5bmMpCisJCXRwLT50Z29hbC5kdCA9IDE7CisKKwl0cC0+dGdvYWwucGVyaW9kID0gcGVyaW9kOworCXRwLT50Z29hbC5jaGVja19uZWdvID0gMTsKK30KKworc3RhdGljIHZvaWQgc3ltMl9zZXRfd2lkdGgoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LCBpbnQgd2lkdGgpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHN5bV9oY2IgKm5wID0gc3ltX2dldF9oY2Ioc2hvc3QpOworCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W3N0YXJnZXQtPmlkXTsKKworCS8qIEl0IGlzIGlsbGVnYWwgdG8gaGF2ZSBEVCBzZXQgb24gbmFycm93IHRyYW5zZmVycy4gIElmIERUIGlzCisJICogY2xlYXIsIHdlIG11c3QgYWxzbyBjbGVhciBJVSBhbmQgUUFTLiAgKi8KKwlpZiAod2lkdGggPT0gMCkKKwkJdHAtPnRnb2FsLml1ID0gdHAtPnRnb2FsLmR0ID0gdHAtPnRnb2FsLnFhcyA9IDA7CisKKwl0cC0+dGdvYWwud2lkdGggPSB3aWR0aDsKKwl0cC0+dGdvYWwuY2hlY2tfbmVnbyA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHN5bTJfc2V0X2R0KHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwgaW50IGR0KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzeW1faGNiICpucCA9IHN5bV9nZXRfaGNiKHNob3N0KTsKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSAmbnAtPnRhcmdldFtzdGFyZ2V0LT5pZF07CisKKwkvKiBXZSBtdXN0IGNsZWFyIFFBUyBhbmQgSVUgaWYgRFQgaXMgY2xlYXIgKi8KKwlpZiAoZHQpCisJCXRwLT50Z29hbC5kdCA9IDE7CisJZWxzZQorCQl0cC0+dGdvYWwuaXUgPSB0cC0+dGdvYWwuZHQgPSB0cC0+dGdvYWwucWFzID0gMDsKKwl0cC0+dGdvYWwuY2hlY2tfbmVnbyA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHN5bTJfc2V0X2l1KHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwgaW50IGl1KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzeW1faGNiICpucCA9IHN5bV9nZXRfaGNiKHNob3N0KTsKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSAmbnAtPnRhcmdldFtzdGFyZ2V0LT5pZF07CisKKwlpZiAoaXUpCisJCXRwLT50Z29hbC5pdSA9IHRwLT50Z29hbC5kdCA9IDE7CisJZWxzZQorCQl0cC0+dGdvYWwuaXUgPSAwOworCXRwLT50Z29hbC5jaGVja19uZWdvID0gMTsKK30KKworc3RhdGljIHZvaWQgc3ltMl9zZXRfcWFzKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwgaW50IHFhcykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc3ltX2hjYiAqbnAgPSBzeW1fZ2V0X2hjYihzaG9zdCk7CisJc3RydWN0IHN5bV90Y2IgKnRwID0gJm5wLT50YXJnZXRbc3RhcmdldC0+aWRdOworCisJaWYgKHFhcykKKwkJdHAtPnRnb2FsLmR0ID0gdHAtPnRnb2FsLnFhcyA9IDE7CisJZWxzZQorCQl0cC0+dGdvYWwucWFzID0gMDsKKwl0cC0+dGdvYWwuY2hlY2tfbmVnbyA9IDE7Cit9CisKKworc3RhdGljIHN0cnVjdCBzcGlfZnVuY3Rpb25fdGVtcGxhdGUgc3ltMl90cmFuc3BvcnRfZnVuY3Rpb25zID0geworCS5zZXRfb2Zmc2V0CT0gc3ltMl9zZXRfb2Zmc2V0LAorCS5zaG93X29mZnNldAk9IDEsCisJLnNldF9wZXJpb2QJPSBzeW0yX3NldF9wZXJpb2QsCisJLnNob3dfcGVyaW9kCT0gMSwKKwkuc2V0X3dpZHRoCT0gc3ltMl9zZXRfd2lkdGgsCisJLnNob3dfd2lkdGgJPSAxLAorCS5zZXRfZHQJCT0gc3ltMl9zZXRfZHQsCisJLnNob3dfZHQJPSAxLAorCS5zZXRfaXUJCT0gc3ltMl9zZXRfaXUsCisJLnNob3dfaXUJPSAxLAorCS5zZXRfcWFzCT0gc3ltMl9zZXRfcWFzLAorCS5zaG93X3Fhcwk9IDEsCisJLmdldF9zaWduYWxsaW5nCT0gc3ltMl9nZXRfc2lnbmFsbGluZywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzeW0yX2lkX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX05DUl81M0M4MTAsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX05DUl81M0M4MjAsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwgLyogbmV3ICovCisJeyBQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9OQ1JfNTNDODI1LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9OQ1JfNTNDODE1LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9MU0lfNTNDODEwQVAsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwgLyogbmV3ICovCisJeyBQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9OQ1JfNTNDODYwLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9MU0lfNTNDMTUxMCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzg5NiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzg5NSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzg4NSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzg3NSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzE1MTAsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwgLyogbmV3ICovCisJeyBQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9MU0lfNTNDODk1QSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTFNJXzUzQzg3NUEsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX0xTSV81M0MxMDEwXzMzLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9MU0lfNTNDMTAxMF82NiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzg3NUosCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzeW0yX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHN5bTJfZHJpdmVyID0geworCS5uYW1lCQk9IE5BTUU1M0M4WFgsCisJLmlkX3RhYmxlCT0gc3ltMl9pZF90YWJsZSwKKwkucHJvYmUJCT0gc3ltMl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHN5bTJfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHN5bTJfaW5pdCh2b2lkKQoreworCWludCBlcnJvcjsKKworCXN5bTJfc2V0dXBfcGFyYW1zKCk7CisJc3ltMl90cmFuc3BvcnRfdGVtcGxhdGUgPSBzcGlfYXR0YWNoX3RyYW5zcG9ydCgmc3ltMl90cmFuc3BvcnRfZnVuY3Rpb25zKTsKKwlpZiAoIXN5bTJfdHJhbnNwb3J0X3RlbXBsYXRlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWVycm9yID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc3ltMl9kcml2ZXIpOworCWlmIChlcnJvcikKKwkJc3BpX3JlbGVhc2VfdHJhbnNwb3J0KHN5bTJfdHJhbnNwb3J0X3RlbXBsYXRlKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzeW0yX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnN5bTJfZHJpdmVyKTsKKwlzcGlfcmVsZWFzZV90cmFuc3BvcnQoc3ltMl90cmFuc3BvcnRfdGVtcGxhdGUpOworfQorCittb2R1bGVfaW5pdChzeW0yX2luaXQpOworbW9kdWxlX2V4aXQoc3ltMl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fZ2x1ZS5oIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9nbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk0M2YxNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fZ2x1ZS5oCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogRGV2aWNlIGRyaXZlciBmb3IgdGhlIFNZTUJJT1MvTFNJTE9HSUMgNTNDOFhYIGFuZCA1M0MxMDEwIGZhbWlseSAKKyAqIG9mIFBDSS1TQ1NJIElPIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgIEdlcmFyZCBSb3VkaWVyIDxncm91ZGllckBmcmVlLmZyPgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGRlcml2ZWQgZnJvbSB0aGUgTGludXggc3ltNTNjOHh4IGRyaXZlci4KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAwICBHZXJhcmQgUm91ZGllcgorICoKKyAqIFRoZSBzeW01M2M4eHggZHJpdmVyIGlzIGRlcml2ZWQgZnJvbSB0aGUgbmNyNTNjOHh4IGRyaXZlciB0aGF0IGhhZCBiZWVuIAorICogYSBwb3J0IG9mIHRoZSBGcmVlQlNEIG5jciBkcml2ZXIgdG8gTGludXgtMS4yLjEzLgorICoKKyAqIFRoZSBvcmlnaW5hbCBuY3IgZHJpdmVyIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIDM4NmJzZCBhbmQgRnJlZUJTRCBieQorICogICAgICAgICBXb2xmZ2FuZyBTdGFuZ2xtZWllciAgICAgICAgPHdvbGZAY29sb2duZS5kZT4KKyAqICAgICAgICAgU3RlZmFuIEVzc2VyICAgICAgICAgICAgICAgIDxzZUBtaS5VbmktS29lbG4uZGU+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTQgIFdvbGZnYW5nIFN0YW5nbG1laWVyCisgKgorICogT3RoZXIgbWFqb3IgY29udHJpYnV0aW9uczoKKyAqCisgKiBOVlJBTSBkZXRlY3Rpb24gYW5kIHJlYWRpbmcuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgUmljaGFyZCBXYWx0aGFtIDxkb3Jtb3VzZUBmYXJzcm9idC5kZW1vbi5jby51az4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgU1lNX0dMVUVfSAorI2RlZmluZSBTWU1fR0xVRV9ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2lmZGVmIF9fc3BhcmNfXworIyAgaW5jbHVkZSA8YXNtL2lycS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNpbmNsdWRlICJzeW01M2M4eHguaCIKKyNpbmNsdWRlICJzeW1fZGVmcy5oIgorI2luY2x1ZGUgInN5bV9taXNjLmgiCisKKy8qCisgKiBDb25maWd1cmF0aW9uIGFkZGVuZHVtIGZvciBMaW51eC4KKyAqLworI2RlZmluZQlTWU1fQ09ORl9USU1FUl9JTlRFUlZBTAkJKChIWisxKS8yKQorCisjZGVmaW5lIFNZTV9PUFRfSEFORExFX0RJUl9VTktOT1dOCisjZGVmaW5lIFNZTV9PUFRfSEFORExFX0RFVklDRV9RVUVVRUlORworI2RlZmluZSBTWU1fT1BUX0xJTUlUX0NPTU1BTkRfUkVPUkRFUklORworCisvKgorICogIFByaW50IGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5LgorICovCisjZGVmaW5lIHByaW50Zl9lbWVyZyhhcmdzLi4uKQlwcmludGsoS0VSTl9FTUVSRyBhcmdzKQorI2RlZmluZQlwcmludGZfYWxlcnQoYXJncy4uLikJcHJpbnRrKEtFUk5fQUxFUlQgYXJncykKKyNkZWZpbmUJcHJpbnRmX2NyaXQoYXJncy4uLikJcHJpbnRrKEtFUk5fQ1JJVCBhcmdzKQorI2RlZmluZQlwcmludGZfZXJyKGFyZ3MuLi4pCXByaW50ayhLRVJOX0VSUglhcmdzKQorI2RlZmluZQlwcmludGZfd2FybmluZyhhcmdzLi4uKQlwcmludGsoS0VSTl9XQVJOSU5HIGFyZ3MpCisjZGVmaW5lCXByaW50Zl9ub3RpY2UoYXJncy4uLikJcHJpbnRrKEtFUk5fTk9USUNFIGFyZ3MpCisjZGVmaW5lCXByaW50Zl9pbmZvKGFyZ3MuLi4pCXByaW50ayhLRVJOX0lORk8gYXJncykKKyNkZWZpbmUJcHJpbnRmX2RlYnVnKGFyZ3MuLi4pCXByaW50ayhLRVJOX0RFQlVHIGFyZ3MpCisjZGVmaW5lCXByaW50ZihhcmdzLi4uKQkJcHJpbnRrKGFyZ3MpCisKKy8qCisgKiAgQSAncmVhZCBiYXJyaWVyJyBmbHVzaGVzIGFueSBkYXRhIHRoYXQgaGF2ZSBiZWVuIHByZWZldGNoZWQgCisgKiAgYnkgdGhlIHByb2Nlc3NvciBkdWUgdG8gb3V0IG9mIG9yZGVyIGV4ZWN1dGlvbi4gU3VjaCBhIGJhcnJpZXIgCisgKiAgbXVzdCBub3RhYmx5IGJlIGluc2VydGVkIHByaW9yIHRvIGxvb2tpbmcgYXQgZGF0YSB0aGF0IGhhdmUgCisgKiAgYmVlbiBETUFlZCwgYXNzdW1pbmcgdGhhdCBwcm9ncmFtIGRvZXMgbWVtb3J5IFJFQURzIGluIHByb3BlciAKKyAqICBvcmRlciBhbmQgdGhhdCB0aGUgZGV2aWNlIGVuc3VyZWQgcHJvcGVyIG9yZGVyaW5nIG9mIFdSSVRFcy4KKyAqCisgKiAgQSAnd3JpdGUgYmFycmllcicgcHJldmVudHMgYW55IHByZXZpb3VzIFdSSVRFcyB0byBwYXNzIGZ1cnRoZXIgCisgKiAgV1JJVEVzLiBTdWNoIGJhcnJpZXJzIG11c3QgYmUgaW5zZXJ0ZWQgZWFjaCB0aW1lIGFub3RoZXIgYWdlbnQgCisgKiAgcmVsaWVzIG9uIG9yZGVyaW5nIG9mIFdSSVRFcy4KKyAqCisgKiAgTm90ZSB0aGF0LCBkdWUgdG8gcG9zdGluZyBvZiBQQ0kgbWVtb3J5IHdyaXRlcywgd2UgYWxzbyBtdXN0IAorICogIGluc2VydCBkdW1teSBQQ0kgcmVhZCB0cmFuc2FjdGlvbnMgd2hlbiBzb21lIG9yZGVyaW5nIGludm9sdmluZyAKKyAqICBib3RoIGRpcmVjdGlvbnMgb3ZlciB0aGUgUENJIGRvZXMgbWF0dGVyLiBQQ0kgdHJhbnNhY3Rpb25zIGFyZSAKKyAqICBmdWxseSBvcmRlcmVkIGluIGVhY2ggZGlyZWN0aW9uLgorICovCisKKyNkZWZpbmUgTUVNT1JZX1JFQURfQkFSUklFUigpCXJtYigpCisjZGVmaW5lIE1FTU9SWV9XUklURV9CQVJSSUVSKCkJd21iKCkKKworLyoKKyAqICBJTyBmdW5jdGlvbnMgZGVmaW5pdGlvbiBmb3IgYmlnL2xpdHRsZSBlbmRpYW4gQ1BVIHN1cHBvcnQuCisgKiAgRm9yIG5vdywgUENJIGNoaXBzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBsaXR0bGUgZW5kaWFuIGFkZHJlc3NpbmcgbW9kZSwgCisgKi8KKworI2lmZGVmCV9fQklHX0VORElBTgorCisjZGVmaW5lCXJlYWR3X2wyYglyZWFkdworI2RlZmluZQlyZWFkbF9sMmIJcmVhZGwKKyNkZWZpbmUJd3JpdGV3X2IybAl3cml0ZXcKKyNkZWZpbmUJd3JpdGVsX2IybAl3cml0ZWwKKworI2Vsc2UJLyogbGl0dGxlIGVuZGlhbiAqLworCisjZGVmaW5lCXJlYWR3X3JhdwlyZWFkdworI2RlZmluZQlyZWFkbF9yYXcJcmVhZGwKKyNkZWZpbmUJd3JpdGV3X3Jhdwl3cml0ZXcKKyNkZWZpbmUJd3JpdGVsX3Jhdwl3cml0ZWwKKworI2VuZGlmIC8qIGVuZGlhbiAqLworCisjaWZkZWYJU1lNX0NPTkZfQ0hJUF9CSUdfRU5ESUFOCisjZXJyb3IJIkNoaXBzIGluIEJJRyBFTkRJQU4gYWRkcmVzc2luZyBtb2RlIGFyZSBub3QgKHlldCkgc3VwcG9ydGVkIgorI2VuZGlmCisKKy8qCisgKiAgSWYgdGhlIENQVSBhbmQgdGhlIGNoaXAgdXNlIHNhbWUgZW5kaWFuLW5lc3MgYWRkcmVzc2luZywKKyAqICBubyBieXRlIHJlb3JkZXJpbmcgaXMgbmVlZGVkIGZvciBzY3JpcHQgcGF0Y2hpbmcuCisgKiAgTWFjcm8gY3B1X3RvX3NjcigpIGlzIHRvIGJlIHVzZWQgZm9yIHNjcmlwdCBwYXRjaGluZy4KKyAqICBNYWNybyBzY3JfdG9fY3B1KCkgaXMgdG8gYmUgdXNlZCBmb3IgZ2V0dGluZyBhIERXT1JEIAorICogIGZyb20gdGhlIHNjcmlwdC4KKyAqLworCisjZGVmaW5lIGNwdV90b19zY3IoZHcpCWNwdV90b19sZTMyKGR3KQorI2RlZmluZSBzY3JfdG9fY3B1KGR3KQlsZTMyX3RvX2NwdShkdykKKworLyoKKyAqICBSZW1hcCBzb21lIHN0YXR1cyBmaWVsZCB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgQ0FNX1JFUV9DTVAJCURJRF9PSworI2RlZmluZSBDQU1fU0VMX1RJTUVPVVQJCURJRF9OT19DT05ORUNUCisjZGVmaW5lIENBTV9DTURfVElNRU9VVAkJRElEX1RJTUVfT1VUCisjZGVmaW5lIENBTV9SRVFfQUJPUlRFRAkJRElEX0FCT1JUCisjZGVmaW5lIENBTV9VTkNPUl9QQVJJVFkJRElEX1BBUklUWQorI2RlZmluZSBDQU1fU0NTSV9CVVNfUkVTRVQJRElEX1JFU0VUCQorI2RlZmluZSBDQU1fUkVRVUVVRV9SRVEJCURJRF9TT0ZUX0VSUk9SCisjZGVmaW5lCUNBTV9VTkVYUF9CVVNGUkVFCURJRF9FUlJPUgorI2RlZmluZQlDQU1fU0NTSV9CVVNZCQlESURfQlVTX0JVU1kKKworI2RlZmluZQlDQU1fREVWX05PVF9USEVSRQlESURfTk9fQ09OTkVDVAorI2RlZmluZQlDQU1fUkVRX0lOVkFMSUQJCURJRF9FUlJPUgorI2RlZmluZQlDQU1fUkVRX1RPT19CSUcJCURJRF9FUlJPUgorCisjZGVmaW5lCUNBTV9SRVNSQ19VTkFWQUlMCURJRF9FUlJPUgorCisvKgorICogIFJlbWFwIGRhdGEgZGlyZWN0aW9uIHZhbHVlcy4KKyAqLworI2RlZmluZSBDQU1fRElSX05PTkUJCURNQV9OT05FCisjZGVmaW5lIENBTV9ESVJfSU4JCURNQV9GUk9NX0RFVklDRQorI2RlZmluZSBDQU1fRElSX09VVAkJRE1BX1RPX0RFVklDRQorI2RlZmluZSBDQU1fRElSX1VOS05PV04JCURNQV9CSURJUkVDVElPTkFMCisKKy8qCisgKiAgVGhlc2Ugb25lcyBhcmUgdXNlZCBhcyByZXR1cm4gY29kZSBmcm9tIAorICogIGVycm9yIHJlY292ZXJ5IGhhbmRsZXJzIHVuZGVyIExpbnV4LgorICovCisjZGVmaW5lIFNDU0lfU1VDQ0VTUwlTVUNDRVNTCisjZGVmaW5lIFNDU0lfRkFJTEVECUZBSUxFRAorCisvKgorICogIFN5c3RlbSBzcGVjaWZpYyB0YXJnZXQgZGF0YSBzdHJ1Y3R1cmUuCisgKiAgTm9uZSBmb3Igbm93LCB1bmRlciBMaW51eC4KKyAqLworLyogI2RlZmluZSBTWU1fSEFWRV9TVENCICovCisKKy8qCisgKiAgU3lzdGVtIHNwZWNpZmljIGx1biBkYXRhIHN0cnVjdHVyZS4KKyAqLworI2RlZmluZSBTWU1fSEFWRV9TTENCCitzdHJ1Y3Qgc3ltX3NsY2IgeworCXVfc2hvcnQJcmVxdGFnczsJLyogTnVtYmVyIG9mIHRhZ3MgcmVxdWVzdGVkIGJ5IHVzZXIgKi8KKwl1X3Nob3J0IHNjZGV2X2RlcHRoOwkvKiBRdWV1ZSBkZXB0aCBzZXQgaW4gc2VsZWN0X3F1ZXVlX2RlcHRoKCkgKi8KK307CisKKy8qCisgKiAgU3lzdGVtIHNwZWNpZmljIGNvbW1hbmQgZGF0YSBzdHJ1Y3R1cmUuCisgKiAgTm90IG5lZWRlZCB1bmRlciBMaW51eC4KKyAqLworLyogc3RydWN0IHN5bV9zY2NiICovCisKKy8qCisgKiAgU3lzdGVtIHNwZWNpZmljIGhvc3QgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBzeW1fc2hjYiB7CisJLyoKKwkgKiAgQ2hpcCBhbmQgY29udHJvbGxlciBpbmRlbnRpZmljYXRpb24uCisJICovCisJaW50CQl1bml0OworCWNoYXIJCWluc3RfbmFtZVsxNl07CisJY2hhcgkJY2hpcF9uYW1lWzhdOworCXN0cnVjdCBwY2lfZGV2CSpkZXZpY2U7CisKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCisJdm9pZCBfX2lvbWVtICoJaW9hZGRyOwkJLyogTU1JTyBrZXJuZWwgaW8gYWRkcmVzcwkqLworCXZvaWQgX19pb21lbSAqCXJhbWFkZHI7CS8qIFJBTSAga2VybmVsIGlvIGFkZHJlc3MJKi8KKwl1X3Nob3J0CQlpb193czsJCS8qIElPIHdpbmRvdyBzaXplCQkqLworCWludAkJaXJxOwkJLyogSVJRIG51bWJlcgkJCSovCisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJLyogVGltZXIgaGFuZGxlciBsaW5rIGhlYWRlcgkqLworCXVfbG9uZwkJbGFzdHRpbWU7CisJdV9sb25nCQlzZXR0bGVfdGltZTsJLyogUmVzZXR0aW5nIHRoZSBTQ1NJIEJVUwkqLworCXVfY2hhcgkJc2V0dGxlX3RpbWVfdmFsaWQ7Cit9OworCisvKgorICogIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29udHJvbGxlci4KKyAqLworI2RlZmluZSBzeW1fbmFtZShucCkgKG5wKS0+cy5pbnN0X25hbWUKKworc3RydWN0IHN5bV9udnJhbTsKKworLyoKKyAqIFRoZSBJTyBtYWNyb3MgcmVxdWlyZSBhIHN0cnVjdCBjYWxsZWQgJ3MnIGFuZCBhcmUgYWJ1c2VkIGluIHN5bV9udnJhbS5jCisgKi8KK3N0cnVjdCBzeW1fZGV2aWNlIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl1bnNpZ25lZCBsb25nIG1taW9fYmFzZTsKKwl1bnNpZ25lZCBsb25nIHJhbV9iYXNlOworCXN0cnVjdCB7CisJCXZvaWQgX19pb21lbSAqaW9hZGRyOworCQl2b2lkIF9faW9tZW0gKnJhbWFkZHI7CisJfSBzOworCXN0cnVjdCBzeW1fY2hpcCBjaGlwOworCXN0cnVjdCBzeW1fbnZyYW0gKm52cmFtOworCXVfc2hvcnQgZGV2aWNlX2lkOworCXVfY2hhciBob3N0X2lkOworfTsKKworLyoKKyAqICBEcml2ZXIgaG9zdCBkYXRhIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IGhvc3RfZGF0YSB7CisJc3RydWN0IHN5bV9oY2IgKm5jYjsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN5bV9oY2IgKiBzeW1fZ2V0X2hjYihzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXJldHVybiAoKHN0cnVjdCBob3N0X2RhdGEgKilob3N0LT5ob3N0ZGF0YSktPm5jYjsKK30KKworI2luY2x1ZGUgInN5bV9mdy5oIgorI2luY2x1ZGUgInN5bV9oaXBkLmgiCisKKy8qCisgKiAgU2V0IHRoZSBzdGF0dXMgZmllbGQgb2YgYSBDQU0gQ0NCLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZCAKK3N5bV9zZXRfY2FtX3N0YXR1cyhzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCBzdGF0dXMpCit7CisJY21kLT5yZXN1bHQgJj0gfigweGZmICA8PCAxNik7CisJY21kLT5yZXN1bHQgfD0gKHN0YXR1cyA8PCAxNik7Cit9CisKKy8qCisgKiAgR2V0IHRoZSBzdGF0dXMgZmllbGQgb2YgYSBDQU0gQ0NCLgorICovCitzdGF0aWMgX19pbmxpbmUgaW50IAorc3ltX2dldF9jYW1fc3RhdHVzKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlyZXR1cm4gaG9zdF9ieXRlKGNtZC0+cmVzdWx0KTsKK30KKworLyoKKyAqICBCdWlsZCBDQU0gcmVzdWx0IGZvciBhIHN1Y2Nlc3NmdWwgSU8gYW5kIGZvciBhIGZhaWxlZCBJTy4KKyAqLworc3RhdGljIF9faW5saW5lIHZvaWQgc3ltX3NldF9jYW1fcmVzdWx0X29rKHN0cnVjdCBzeW1fY2NiICpjcCwgc3RydWN0IHNjc2lfY21uZCAqY21kLCBpbnQgcmVzaWQpCit7CisJY21kLT5yZXNpZCA9IHJlc2lkOworCWNtZC0+cmVzdWx0ID0gKCgoRElEX09LKSA8PCAxNikgKyAoKGNwLT5zc3NzX3N0YXR1cykgJiAweDdmKSk7Cit9Cit2b2lkIHN5bV9zZXRfY2FtX3Jlc3VsdF9lcnJvcihzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fY2NiICpjcCwgaW50IHJlc2lkKTsKKwordm9pZCBzeW1feHB0X2RvbmUoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjY2IpOworI2RlZmluZSBzeW1fcHJpbnRfYWRkcihjbWQsIGFyZy4uLikgZGV2X2luZm8oJmNtZC0+ZGV2aWNlLT5zZGV2X2dlbmRldiAsICMjIGFyZykKK3ZvaWQgc3ltX3hwdF9hc3luY19idXNfcmVzZXQoc3RydWN0IHN5bV9oY2IgKm5wKTsKK3ZvaWQgc3ltX3hwdF9hc3luY19zZW50X2JkcihzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCB0YXJnZXQpOworaW50ICBzeW1fc2V0dXBfZGF0YV9hbmRfc3RhcnQgKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY3Npbywgc3RydWN0IHN5bV9jY2IgKmNwKTsKK3ZvaWQgc3ltX2xvZ19idXNfZXJyb3Ioc3RydWN0IHN5bV9oY2IgKm5wKTsKK3ZvaWQgc3ltX3NuaWZmX2lucXVpcnkoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCByZXNpZCk7CisKKyNlbmRpZiAvKiBTWU1fR0xVRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2hpcGQuYyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1faGlwZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYTE3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2hpcGQuYwpAQCAtMCwwICsxLDU4NjUgQEAKKy8qCisgKiBEZXZpY2UgZHJpdmVyIGZvciB0aGUgU1lNQklPUy9MU0lMT0dJQyA1M0M4WFggYW5kIDUzQzEwMTAgZmFtaWx5IAorICogb2YgUENJLVNDU0kgSU8gcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSAgR2VyYXJkIFJvdWRpZXIgPGdyb3VkaWVyQGZyZWUuZnI+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNSAgTWF0dGhldyBXaWxjb3ggPG1hdHRoZXdAd2lsLmN4PgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGRlcml2ZWQgZnJvbSB0aGUgTGludXggc3ltNTNjOHh4IGRyaXZlci4KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAwICBHZXJhcmQgUm91ZGllcgorICoKKyAqIFRoZSBzeW01M2M4eHggZHJpdmVyIGlzIGRlcml2ZWQgZnJvbSB0aGUgbmNyNTNjOHh4IGRyaXZlciB0aGF0IGhhZCBiZWVuIAorICogYSBwb3J0IG9mIHRoZSBGcmVlQlNEIG5jciBkcml2ZXIgdG8gTGludXgtMS4yLjEzLgorICoKKyAqIFRoZSBvcmlnaW5hbCBuY3IgZHJpdmVyIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIDM4NmJzZCBhbmQgRnJlZUJTRCBieQorICogICAgICAgICBXb2xmZ2FuZyBTdGFuZ2xtZWllciAgICAgICAgPHdvbGZAY29sb2duZS5kZT4KKyAqICAgICAgICAgU3RlZmFuIEVzc2VyICAgICAgICAgICAgICAgIDxzZUBtaS5VbmktS29lbG4uZGU+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTQgIFdvbGZnYW5nIFN0YW5nbG1laWVyCisgKgorICogT3RoZXIgbWFqb3IgY29udHJpYnV0aW9uczoKKyAqCisgKiBOVlJBTSBkZXRlY3Rpb24gYW5kIHJlYWRpbmcuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgUmljaGFyZCBXYWx0aGFtIDxkb3Jtb3VzZUBmYXJzcm9idC5kZW1vbi5jby51az4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSAic3ltX2dsdWUuaCIKKyNpbmNsdWRlICJzeW1fbnZyYW0uaCIKKworI2lmIDAKKyNkZWZpbmUgU1lNX0RFQlVHX0dFTkVSSUNfU1VQUE9SVAorI2VuZGlmCisKKy8qCisgKiAgTmVlZGVkIGZ1bmN0aW9uIHByb3RvdHlwZXMuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9pbnRfbWEgKHN0cnVjdCBzeW1faGNiICpucCk7CitzdGF0aWMgdm9pZCBzeW1faW50X3NpciAoc3RydWN0IHN5bV9oY2IgKm5wKTsKK3N0YXRpYyBzdHJ1Y3Qgc3ltX2NjYiAqc3ltX2FsbG9jX2NjYihzdHJ1Y3Qgc3ltX2hjYiAqbnApOworc3RhdGljIHN0cnVjdCBzeW1fY2NiICpzeW1fY2NiX2Zyb21fZHNhKHN0cnVjdCBzeW1faGNiICpucCwgdTMyIGRzYSk7CitzdGF0aWMgdm9pZCBzeW1fYWxsb2NfbGNiX3RhZ3MgKHN0cnVjdCBzeW1faGNiICpucCwgdV9jaGFyIHRuLCB1X2NoYXIgbG4pOworc3RhdGljIHZvaWQgc3ltX2NvbXBsZXRlX2Vycm9yIChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fY2NiICpjcCk7CitzdGF0aWMgdm9pZCBzeW1fY29tcGxldGVfb2sgKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV9jY2IgKmNwKTsKK3N0YXRpYyBpbnQgc3ltX2NvbXB1dGVfcmVzaWR1YWwoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX2NjYiAqY3ApOworCisvKgorICogIFByaW50IGEgYnVmZmVyIGluIGhleGFkZWNpbWFsIGZvcm1hdCB3aXRoIGEgIi5cbiIgYXQgZW5kLgorICovCitzdGF0aWMgdm9pZCBzeW1fcHJpbnRsX2hleCh1X2NoYXIgKnAsIGludCBuKQoreworCXdoaWxlIChuLS0gPiAwKQorCQlwcmludGYgKCIgJXgiLCAqcCsrKTsKKwlwcmludGYgKCIuXG4iKTsKK30KKworLyoKKyAqICBQcmludCBvdXQgdGhlIGNvbnRlbnQgb2YgYSBTQ1NJIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyBpbnQgc3ltX3Nob3dfbXNnICh1X2NoYXIgKiBtc2cpCit7CisJdV9jaGFyIGk7CisJcHJpbnRmICgiJXgiLCptc2cpOworCWlmICgqbXNnPT1NX0VYVEVOREVEKSB7CisJCWZvciAoaT0xO2k8ODtpKyspIHsKKwkJCWlmIChpLTE+bXNnWzFdKSBicmVhazsKKwkJCXByaW50ZiAoIi0leCIsbXNnW2ldKTsKKwkJfQorCQlyZXR1cm4gKGkrMSk7CisJfSBlbHNlIGlmICgoKm1zZyAmIDB4ZjApID09IDB4MjApIHsKKwkJcHJpbnRmICgiLSV4Iixtc2dbMV0pOworCQlyZXR1cm4gKDIpOworCX0KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgdm9pZCBzeW1fcHJpbnRfbXNnKHN0cnVjdCBzeW1fY2NiICpjcCwgY2hhciAqbGFiZWwsIHVfY2hhciAqbXNnKQoreworCXN5bV9wcmludF9hZGRyKGNwLT5jbWQsICIlczogIiwgbGFiZWwpOworCisJc3ltX3Nob3dfbXNnKG1zZyk7CisJcHJpbnRmKCIuXG4iKTsKK30KKworc3RhdGljIHZvaWQgc3ltX3ByaW50X25lZ29fbXNnKHN0cnVjdCBzeW1faGNiICpucCwgaW50IHRhcmdldCwgY2hhciAqbGFiZWwsIHVfY2hhciAqbXNnKQoreworCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W3RhcmdldF07CisJZGV2X2luZm8oJnRwLT5zZGV2LT5zZGV2X3RhcmdldC0+ZGV2LCAiJXM6ICIsIGxhYmVsKTsKKworCXN5bV9zaG93X21zZyhtc2cpOworCXByaW50ZigiLlxuIik7Cit9CisKKy8qCisgKiAgUHJpbnQgc29tZXRoaW5nIHRoYXQgdGVsbHMgYWJvdXQgZXh0ZW5kZWQgZXJyb3JzLgorICovCit2b2lkIHN5bV9wcmludF94ZXJyKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgaW50IHhfc3RhdHVzKQoreworCWlmICh4X3N0YXR1cyAmIFhFX1BBUklUWV9FUlIpIHsKKwkJc3ltX3ByaW50X2FkZHIoY21kLCAidW5yZWNvdmVyZWQgU0NTSSBwYXJpdHkgZXJyb3IuXG4iKTsKKwl9CisJaWYgKHhfc3RhdHVzICYgWEVfRVhUUkFfREFUQSkgeworCQlzeW1fcHJpbnRfYWRkcihjbWQsICJleHRyYW5lb3VzIGRhdGEgZGlzY2FyZGVkLlxuIik7CisJfQorCWlmICh4X3N0YXR1cyAmIFhFX0JBRF9QSEFTRSkgeworCQlzeW1fcHJpbnRfYWRkcihjbWQsICJpbGxlZ2FsIHNjc2kgcGhhc2UgKDQvNSkuXG4iKTsKKwl9CisJaWYgKHhfc3RhdHVzICYgWEVfU09ETF9VTlJVTikgeworCQlzeW1fcHJpbnRfYWRkcihjbWQsICJPREQgdHJhbnNmZXIgaW4gREFUQSBPVVQgcGhhc2UuXG4iKTsKKwl9CisJaWYgKHhfc3RhdHVzICYgWEVfU1dJREVfT1ZSVU4pIHsKKwkJc3ltX3ByaW50X2FkZHIoY21kLCAiT0REIHRyYW5zZmVyIGluIERBVEEgSU4gcGhhc2UuXG4iKTsKKwl9Cit9CisKKy8qCisgKiAgUmV0dXJuIGEgc3RyaW5nIGZvciBTQ1NJIEJVUyBtb2RlLgorICovCitzdGF0aWMgY2hhciAqc3ltX3Njc2lfYnVzX21vZGUoaW50IG1vZGUpCit7CisJc3dpdGNoKG1vZGUpIHsKKwljYXNlIFNNT0RFX0hWRDoJcmV0dXJuICJIVkQiOworCWNhc2UgU01PREVfU0U6CXJldHVybiAiU0UiOworCWNhc2UgU01PREVfTFZEOiByZXR1cm4gIkxWRCI7CisJfQorCXJldHVybiAiPz8iOworfQorCisvKgorICogIFNvZnQgcmVzZXQgdGhlIGNoaXAuCisgKgorICogIFJhaXNpbmcgU1JTVCB3aGVuIHRoZSBjaGlwIGlzIHJ1bm5pbmcgbWF5IGNhdXNlIAorICogIHByb2JsZW1zIG9uIGR1YWwgZnVuY3Rpb24gY2hpcHMgKHNlZSBiZWxvdykuCisgKiAgT24gdGhlIG90aGVyIGhhbmQsIExWRCBkZXZpY2VzIG5lZWQgc29tZSBkZWxheSAKKyAqICB0byBzZXR0bGUgYW5kIHJlcG9ydCBhY3R1YWwgQlVTIG1vZGUgaW4gU1RFU1Q0LgorICovCitzdGF0aWMgdm9pZCBzeW1fY2hpcF9yZXNldCAoc3RydWN0IHN5bV9oY2IgKm5wKQoreworCU9VVEIobnAsIG5jX2lzdGF0LCBTUlNUKTsKKwl1ZGVsYXkoMTApOworCU9VVEIobnAsIG5jX2lzdGF0LCAwKTsKKwl1ZGVsYXkoMjAwMCk7CS8qIEZvciBCVVMgTU9ERSB0byBzZXR0bGUgKi8KK30KKworLyoKKyAqICBSZWFsbHkgc29mdCByZXNldCB0aGUgY2hpcC46KQorICoKKyAqICBTb21lIDg5NiBhbmQgODc2IGNoaXAgcmV2aXNpb25zIG1heSBoYW5nLXVwIGlmIHdlIHNldCAKKyAqICB0aGUgU1JTVCAoc29mdCByZXNldCkgYml0IGF0IHRoZSB3cm9uZyB0aW1lIHdoZW4gU0NSSVBUUyAKKyAqICBhcmUgcnVubmluZy4KKyAqICBTbywgd2UgbmVlZCB0byBhYm9ydCB0aGUgY3VycmVudCBvcGVyYXRpb24gcHJpb3IgdG8gCisgKiAgc29mdCByZXNldHRpbmcgdGhlIGNoaXAuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9zb2Z0X3Jlc2V0IChzdHJ1Y3Qgc3ltX2hjYiAqbnApCit7CisJdV9jaGFyIGlzdGF0ID0gMDsKKwlpbnQgaTsKKworCWlmICghKG5wLT5mZWF0dXJlcyAmIEZFX0lTVEFUMSkgfHwgIShJTkIobnAsIG5jX2lzdGF0MSkgJiBTQ1JVTikpCisJCWdvdG8gZG9fY2hpcF9yZXNldDsKKworCU9VVEIobnAsIG5jX2lzdGF0LCBDQUJSVCk7CisJZm9yIChpID0gMTAwMDAwIDsgaSA7IC0taSkgeworCQlpc3RhdCA9IElOQihucCwgbmNfaXN0YXQpOworCQlpZiAoaXN0YXQgJiBTSVApIHsKKwkJCUlOVyhucCwgbmNfc2lzdCk7CisJCX0KKwkJZWxzZSBpZiAoaXN0YXQgJiBESVApIHsKKwkJCWlmIChJTkIobnAsIG5jX2RzdGF0KSAmIEFCUlQpCisJCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDUpOworCX0KKwlPVVRCKG5wLCBuY19pc3RhdCwgMCk7CisJaWYgKCFpKQorCQlwcmludGYoIiVzOiB1bmFibGUgdG8gYWJvcnQgY3VycmVudCBjaGlwIG9wZXJhdGlvbiwgIgorCQkgICAgICAgIklTVEFUPTB4JTAyeC5cbiIsIHN5bV9uYW1lKG5wKSwgaXN0YXQpOworZG9fY2hpcF9yZXNldDoKKwlzeW1fY2hpcF9yZXNldChucCk7Cit9CisKKy8qCisgKiAgU3RhcnQgcmVzZXQgcHJvY2Vzcy4KKyAqCisgKiAgVGhlIGludGVycnVwdCBoYW5kbGVyIHdpbGwgcmVpbml0aWFsaXplIHRoZSBjaGlwLgorICovCitzdGF0aWMgdm9pZCBzeW1fc3RhcnRfcmVzZXQoc3RydWN0IHN5bV9oY2IgKm5wKQoreworCXN5bV9yZXNldF9zY3NpX2J1cyhucCwgMSk7Cit9CisgCitpbnQgc3ltX3Jlc2V0X3Njc2lfYnVzKHN0cnVjdCBzeW1faGNiICpucCwgaW50IGVuYWJfaW50KQoreworCXUzMiB0ZXJtOworCWludCByZXR2ID0gMDsKKworCXN5bV9zb2Z0X3Jlc2V0KG5wKTsJLyogU29mdCByZXNldCB0aGUgY2hpcCAqLworCWlmIChlbmFiX2ludCkKKwkJT1VUVyhucCwgbmNfc2llbiwgUlNUKTsKKwkvKgorCSAqICBFbmFibGUgVG9sZXJhbnQsIHJlc2V0IElSUUQgaWYgcHJlc2VudCBhbmQgCisJICogIHByb3Blcmx5IHNldCBJUlEgbW9kZSwgcHJpb3IgdG8gcmVzZXR0aW5nIHRoZSBidXMuCisJICovCisJT1VUQihucCwgbmNfc3Rlc3QzLCBURSk7CisJT1VUQihucCwgbmNfZGNudGwsIChucC0+cnZfZGNudGwgJiBJUlFNKSk7CisJT1VUQihucCwgbmNfc2NudGwxLCBDUlNUKTsKKwl1ZGVsYXkoMjAwKTsKKworCWlmICghU1lNX1NFVFVQX1NDU0lfQlVTX0NIRUNLKQorCQlnb3RvIG91dDsKKwkvKgorCSAqICBDaGVjayBmb3Igbm8gdGVybWluYXRvcnMgb3IgU0NTSSBidXMgc2hvcnRzIHRvIGdyb3VuZC4KKwkgKiAgUmVhZCBTQ1NJIGRhdGEgYnVzLCBkYXRhIHBhcml0eSBiaXRzIGFuZCBjb250cm9sIHNpZ25hbHMuCisJICogIFdlIGFyZSBleHBlY3RpbmcgUkVTRVQgdG8gYmUgVFJVRSBhbmQgb3RoZXIgc2lnbmFscyB0byBiZSAKKwkgKiAgRkFMU0UuCisJICovCisJdGVybSA9CUlOQihucCwgbmNfc3N0YXQwKTsKKwl0ZXJtID0JKCh0ZXJtICYgMikgPDwgNykgKyAoKHRlcm0gJiAxKSA8PCAxNyk7CS8qIHJzdCBzZHAwICovCisJdGVybSB8PSAoKElOQihucCwgbmNfc3N0YXQyKSAmIDB4MDEpIDw8IDI2KSB8CS8qIHNkcDEgICAgICovCisJCSgoSU5XKG5wLCBuY19zYmRsKSAmIDB4ZmYpICAgPDwgOSkgIHwJLyogZDctMCAgICAgKi8KKwkJKChJTlcobnAsIG5jX3NiZGwpICYgMHhmZjAwKSA8PCAxMCkgfAkvKiBkMTUtOCAgICAqLworCQlJTkIobnAsIG5jX3NiY2wpOwkvKiByZXEgYWNrIGJzeSBzZWwgYXRuIG1zZyBjZCBpbyAgICAqLworCisJaWYgKCFucC0+bWF4d2lkZSkKKwkJdGVybSAmPSAweDNmZmZmOworCisJaWYgKHRlcm0gIT0gKDI8PDcpKSB7CisJCXByaW50ZigiJXM6IHN1c3BpY2lvdXMgU0NTSSBkYXRhIHdoaWxlIHJlc2V0dGluZyB0aGUgQlVTLlxuIiwKKwkJCXN5bV9uYW1lKG5wKSk7CisJCXByaW50ZigiJXM6ICVzZHAwLGQ3LTAscnN0LHJlcSxhY2ssYnN5LHNlbCxhdG4sbXNnLGMvZCxpL28gPSAiCisJCQkiMHglbHgsIGV4cGVjdGluZyAweCVseFxuIiwKKwkJCXN5bV9uYW1lKG5wKSwKKwkJCShucC0+ZmVhdHVyZXMgJiBGRV9XSURFKSA/ICJkcDEsZDE1LTgsIiA6ICIiLAorCQkJKHVfbG9uZyl0ZXJtLCAodV9sb25nKSgyPDw3KSk7CisJCWlmIChTWU1fU0VUVVBfU0NTSV9CVVNfQ0hFQ0sgPT0gMSkKKwkJCXJldHYgPSAxOworCX0KK291dDoKKwlPVVRCKG5wLCBuY19zY250bDEsIDApOworCXJldHVybiByZXR2OworfQorCisvKgorICogIFNlbGVjdCBTQ1NJIGNsb2NrIGZyZXF1ZW5jeQorICovCitzdGF0aWMgdm9pZCBzeW1fc2VsZWN0Y2xvY2soc3RydWN0IHN5bV9oY2IgKm5wLCB1X2NoYXIgc2NudGwzKQoreworCS8qCisJICogIElmIG11bHRpcGxpZXIgbm90IHByZXNlbnQgb3Igbm90IHNlbGVjdGVkLCBsZWF2ZSBoZXJlLgorCSAqLworCWlmIChucC0+bXVsdGlwbGllciA8PSAxKSB7CisJCU9VVEIobnAsIG5jX3NjbnRsMywgc2NudGwzKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzeW1fdmVyYm9zZSA+PSAyKQorCQlwcmludGYgKCIlczogZW5hYmxpbmcgY2xvY2sgbXVsdGlwbGllclxuIiwgc3ltX25hbWUobnApKTsKKworCU9VVEIobnAsIG5jX3N0ZXN0MSwgREJMRU4pOwkgICAvKiBFbmFibGUgY2xvY2sgbXVsdGlwbGllciAqLworCS8qCisJICogIFdhaXQgZm9yIHRoZSBMQ0tGUlEgYml0IHRvIGJlIHNldCBpZiBzdXBwb3J0ZWQgYnkgdGhlIGNoaXAuCisJICogIE90aGVyd2lzZSB3YWl0IDUwIG1pY3JvLXNlY29uZHMgKGF0IGxlYXN0KS4KKwkgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfTENLRlJRKSB7CisJCWludCBpID0gMjA7CisJCXdoaWxlICghKElOQihucCwgbmNfc3Rlc3Q0KSAmIExDS0ZSUSkgJiYgLS1pID4gMCkKKwkJCXVkZWxheSgyMCk7CisJCWlmICghaSkKKwkJCXByaW50ZigiJXM6IHRoZSBjaGlwIGNhbm5vdCBsb2NrIHRoZSBmcmVxdWVuY3lcbiIsCisJCQkJc3ltX25hbWUobnApKTsKKwl9IGVsc2UKKwkJdWRlbGF5KCg1MCsxMCkpOworCU9VVEIobnAsIG5jX3N0ZXN0MywgSFNDKTsJCS8qIEhhbHQgdGhlIHNjc2kgY2xvY2sJKi8KKwlPVVRCKG5wLCBuY19zY250bDMsIHNjbnRsMyk7CisJT1VUQihucCwgbmNfc3Rlc3QxLCAoREJMRU58REJMU0VMKSk7LyogU2VsZWN0IGNsb2NrIG11bHRpcGxpZXIJKi8KKwlPVVRCKG5wLCBuY19zdGVzdDMsIDB4MDApOwkJLyogUmVzdGFydCBzY3NpIGNsb2NrIAkqLworfQorCisKKy8qCisgKiAgRGV0ZXJtaW5lIHRoZSBjaGlwJ3MgY2xvY2sgZnJlcXVlbmN5LgorICoKKyAqICBUaGlzIGlzIGVzc2VudGlhbCBmb3IgdGhlIG5lZ290aWF0aW9uIG9mIHRoZSBzeW5jaHJvbm91cyAKKyAqICB0cmFuc2ZlciByYXRlLgorICoKKyAqICBOb3RlOiB3ZSBoYXZlIHRvIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZS4KKyAqICBUSEVSRSBJUyBOTyBTQUZFIERFRkFVTFQgVkFMVUUuCisgKgorICogIE1vc3QgTkNSL1NZTUJJT1MgYm9hcmRzIGFyZSBkZWxpdmVyZWQgd2l0aCBhIDQwIE1oeiBjbG9jay4KKyAqICA1M0M4NjAgYW5kIDUzQzg3NSByZXYuIDEgc3VwcG9ydCBmYXN0MjAgdHJhbnNmZXJzIGJ1dCAKKyAqICBkbyBub3QgaGF2ZSBhIGNsb2NrIGRvdWJsZXIgYW5kIHNvIGFyZSBwcm92aWRlZCB3aXRoIGEgCisgKiAgODAgTUh6IGNsb2NrLiBBbGwgb3RoZXIgZmFzdDIwIGJvYXJkcyBpbmNvcnBvcmF0ZSBhIGRvdWJsZXIgCisgKiAgYW5kIHNvIHNob3VsZCBiZSBkZWxpdmVyZWQgd2l0aCBhIDQwIE1IeiBjbG9jay4KKyAqICBUaGUgcmVjZW50IGZhc3Q0MCBjaGlwcyAoODk1Lzg5Ni84OTVBLzEwMTApIHVzZSBhIDQwIE1oeiBiYXNlIAorICogIGNsb2NrIGFuZCBwcm92aWRlIGEgY2xvY2sgcXVhZHJ1cGxlciAoMTYwIE1oeikuCisgKi8KKworLyoKKyAqICBjYWxjdWxhdGUgU0NTSSBjbG9jayBmcmVxdWVuY3kgKGluIEtIeikKKyAqLworc3RhdGljIHVuc2lnbmVkIGdldGZyZXEgKHN0cnVjdCBzeW1faGNiICpucCwgaW50IGdlbikKK3sKKwl1bnNpZ25lZCBpbnQgbXMgPSAwOworCXVuc2lnbmVkIGludCBmOworCisJLyoKKwkgKiBNZWFzdXJlIEdFTiB0aW1lciBkZWxheSBpbiBvcmRlciAKKwkgKiB0byBjYWxjdWxhdGUgU0NTSSBjbG9jayBmcmVxdWVuY3kKKwkgKgorCSAqIFRoaXMgY29kZSB3aWxsIG5ldmVyIGV4ZWN1dGUgdG9vCisJICogbWFueSBsb29wIGl0ZXJhdGlvbnMgKGlmIERFTEFZIGlzIAorCSAqIHJlYXNvbmFibHkgY29ycmVjdCkuIEl0IGNvdWxkIGdldAorCSAqIHRvbyBsb3cgYSBkZWxheSAodG9vIGhpZ2ggYSBmcmVxLikKKwkgKiBpZiB0aGUgQ1BVIGlzIHNsb3cgZXhlY3V0aW5nIHRoZSAKKwkgKiBsb29wIGZvciBzb21lIHJlYXNvbiAoYW4gTk1JLCBmb3IKKwkgKiBleGFtcGxlKS4gRm9yIHRoaXMgcmVhc29uIHdlIHdpbGwKKwkgKiBpZiBtdWx0aXBsZSBtZWFzdXJlbWVudHMgYXJlIHRvIGJlIAorCSAqIHBlcmZvcm1lZCB0cnVzdCB0aGUgaGlnaGVyIGRlbGF5IAorCSAqIChsb3dlciBmcmVxdWVuY3kgcmV0dXJuZWQpLgorCSAqLworCU9VVFcobnAsIG5jX3NpZW4sIDApOwkvKiBtYXNrIGFsbCBzY3NpIGludGVycnVwdHMgKi8KKwlJTlcobnAsIG5jX3Npc3QpOwkvKiBjbGVhciBwZW5kaW5nIHNjc2kgaW50ZXJydXB0ICovCisJT1VUQihucCwgbmNfZGllbiwgMCk7CS8qIG1hc2sgYWxsIGRtYSBpbnRlcnJ1cHRzICovCisJSU5XKG5wLCBuY19zaXN0KTsJLyogYW5vdGhlciBvbmUsIGp1c3QgdG8gYmUgc3VyZSA6KSAqLworCS8qCisJICogVGhlIEMxMDEwLTMzIGNvcmUgZG9lcyBub3QgcmVwb3J0IEdFTiBpbiBTSVNULAorCSAqIGlmIHRoaXMgaW50ZXJydXB0IGlzIG1hc2tlZCBpbiBTSUVOLgorCSAqIEkgZG9uJ3Qga25vdyB5ZXQgaWYgdGhlIEMxMDEwLTY2IGJlaGF2ZXMgdGhlIHNhbWUgd2F5LgorCSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9DMTApIHsKKwkJT1VUVyhucCwgbmNfc2llbiwgR0VOKTsKKwkJT1VUQihucCwgbmNfaXN0YXQxLCBTSVJRRCk7CisJfQorCU9VVEIobnAsIG5jX3NjbnRsMywgNCk7CSAgIC8qIHNldCBwcmUtc2NhbGVyIHRvIGRpdmlkZSBieSAzICovCisJT1VUQihucCwgbmNfc3RpbWUxLCAwKTsJICAgLyogZGlzYWJsZSBnZW5lcmFsIHB1cnBvc2UgdGltZXIgKi8KKwlPVVRCKG5wLCBuY19zdGltZTEsIGdlbik7ICAvKiBzZXQgdG8gbm9taW5hbCBkZWxheSBvZiAxPDxnZW4gKiAxMjV1cyAqLworCXdoaWxlICghKElOVyhucCwgbmNfc2lzdCkgJiBHRU4pICYmIG1zKysgPCAxMDAwMDApCisJCXVkZWxheSgxMDAwLzQpOyAgICAvKiBjb3VudCBpbiAxLzQgb2YgbXMgKi8KKwlPVVRCKG5wLCBuY19zdGltZTEsIDApOyAgICAvKiBkaXNhYmxlIGdlbmVyYWwgcHVycG9zZSB0aW1lciAqLworCS8qCisJICogVW5kbyBDMTAxMC0zMyBzcGVjaWZpYyBzZXR0aW5ncy4KKwkgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfQzEwKSB7CisJCU9VVFcobnAsIG5jX3NpZW4sIDApOworCQlPVVRCKG5wLCBuY19pc3RhdDEsIDApOworCX0KKyAJLyoKKyAJICogc2V0IHByZXNjYWxlciB0byBkaXZpZGUgYnkgd2hhdGV2ZXIgMCBtZWFucworIAkgKiAwIG91Z2h0IHRvIGNob29zZSBkaXZpZGUgYnkgMiwgYnV0IGFwcGVhcnMKKyAJICogdG8gc2V0IGRpdmlkZSBieSAzLjUgbW9kZSBpbiBteSA1M2M4MTAgLi4uCisgCSAqLworIAlPVVRCKG5wLCBuY19zY250bDMsIDApOworCisgIAkvKgorIAkgKiBhZGp1c3QgZm9yIHByZXNjYWxlciwgYW5kIGNvbnZlcnQgaW50byBLSHogCisgIAkgKi8KKwlmID0gbXMgPyAoKDEgPDwgZ2VuKSAqICg0MzQwKjQpKSAvIG1zIDogMDsKKworCS8qCisJICogVGhlIEMxMDEwLTMzIHJlc3VsdCBpcyBiaWFzZWQgYnkgYSBmYWN0b3IgCisJICogb2YgMi8zIGNvbXBhcmVkIHRvIGVhcmxpZXIgY2hpcHMuCisJICovCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX0MxMCkKKwkJZiA9IChmICogMikgLyAzOworCisJaWYgKHN5bV92ZXJib3NlID49IDIpCisJCXByaW50ZiAoIiVzOiBEZWxheSAoR0VOPSVkKTogJXUgbXNlYywgJXUgS0h6XG4iLAorCQkJc3ltX25hbWUobnApLCBnZW4sIG1zLzQsIGYpOworCisJcmV0dXJuIGY7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzeW1fZ2V0ZnJlcSAoc3RydWN0IHN5bV9oY2IgKm5wKQoreworCXVfaW50IGYxLCBmMjsKKwlpbnQgZ2VuID0gODsKKworCWdldGZyZXEgKG5wLCBnZW4pOwkvKiB0aHJvdyBhd2F5IGZpcnN0IHJlc3VsdCAqLworCWYxID0gZ2V0ZnJlcSAobnAsIGdlbik7CisJZjIgPSBnZXRmcmVxIChucCwgZ2VuKTsKKwlpZiAoZjEgPiBmMikgZjEgPSBmMjsJCS8qIHRydXN0IGxvd2VyIHJlc3VsdAkqLworCXJldHVybiBmMTsKK30KKworLyoKKyAqICBHZXQvcHJvYmUgY2hpcCBTQ1NJIGNsb2NrIGZyZXF1ZW5jeQorICovCitzdGF0aWMgdm9pZCBzeW1fZ2V0Y2xvY2sgKHN0cnVjdCBzeW1faGNiICpucCwgaW50IG11bHQpCit7CisJdW5zaWduZWQgY2hhciBzY250bDMgPSBucC0+c3Zfc2NudGwzOworCXVuc2lnbmVkIGNoYXIgc3Rlc3QxID0gbnAtPnN2X3N0ZXN0MTsKKwl1bnNpZ25lZCBmMTsKKworCW5wLT5tdWx0aXBsaWVyID0gMTsKKwlmMSA9IDQwMDAwOworCS8qCisJICogIFRydWUgd2l0aCA4NzUvODk1Lzg5Ni84OTVBIHdpdGggY2xvY2sgbXVsdGlwbGllciBzZWxlY3RlZAorCSAqLworCWlmIChtdWx0ID4gMSAmJiAoc3Rlc3QxICYgKERCTEVOK0RCTFNFTCkpID09IERCTEVOK0RCTFNFTCkgeworCQlpZiAoc3ltX3ZlcmJvc2UgPj0gMikKKwkJCXByaW50ZiAoIiVzOiBjbG9jayBtdWx0aXBsaWVyIGZvdW5kXG4iLCBzeW1fbmFtZShucCkpOworCQlucC0+bXVsdGlwbGllciA9IG11bHQ7CisJfQorCisJLyoKKwkgKiAgSWYgbXVsdGlwbGllciBub3QgZm91bmQgb3Igc2NudGwzIG5vdCA3LDUsMywKKwkgKiAgcmVzZXQgY2hpcCBhbmQgZ2V0IGZyZXF1ZW5jeSBmcm9tIGdlbmVyYWwgcHVycG9zZSB0aW1lci4KKwkgKiAgT3RoZXJ3aXNlIHRydXN0IHNjbnRsMyBCSU9TIHNldHRpbmcuCisJICovCisJaWYgKG5wLT5tdWx0aXBsaWVyICE9IG11bHQgfHwgKHNjbnRsMyAmIDcpIDwgMyB8fCAhKHNjbnRsMyAmIDEpKSB7CisJCU9VVEIobnAsIG5jX3N0ZXN0MSwgMCk7CQkvKiBtYWtlIHN1cmUgZG91YmxlciBpcyBPRkYgKi8KKwkJZjEgPSBzeW1fZ2V0ZnJlcSAobnApOworCisJCWlmIChzeW1fdmVyYm9zZSkKKwkJCXByaW50ZiAoIiVzOiBjaGlwIGNsb2NrIGlzICV1S0h6XG4iLCBzeW1fbmFtZShucCksIGYxKTsKKworCQlpZgkoZjEgPAk0NTAwMCkJCWYxID0gIDQwMDAwOworCQllbHNlIGlmIChmMSA8CTU1MDAwKQkJZjEgPSAgNTAwMDA7CisJCWVsc2UJCQkJZjEgPSAgODAwMDA7CisKKwkJaWYgKGYxIDwgODAwMDAgJiYgbXVsdCA+IDEpIHsKKwkJCWlmIChzeW1fdmVyYm9zZSA+PSAyKQorCQkJCXByaW50ZiAoIiVzOiBjbG9jayBtdWx0aXBsaWVyIGFzc3VtZWRcbiIsCisJCQkJCXN5bV9uYW1lKG5wKSk7CisJCQlucC0+bXVsdGlwbGllcgk9IG11bHQ7CisJCX0KKwl9IGVsc2UgeworCQlpZgkoKHNjbnRsMyAmIDcpID09IDMpCWYxID0gIDQwMDAwOworCQllbHNlIGlmCSgoc2NudGwzICYgNykgPT0gNSkJZjEgPSAgODAwMDA7CisJCWVsc2UgCQkJCWYxID0gMTYwMDAwOworCisJCWYxIC89IG5wLT5tdWx0aXBsaWVyOworCX0KKworCS8qCisJICogIENvbXB1dGUgY29udHJvbGxlciBzeW5jaHJvbm91cyBwYXJhbWV0ZXJzLgorCSAqLworCWYxCQkqPSBucC0+bXVsdGlwbGllcjsKKwlucC0+Y2xvY2tfa2h6CT0gZjE7Cit9CisKKy8qCisgKiAgR2V0L3Byb2JlIFBDSSBjbG9jayBmcmVxdWVuY3kKKyAqLworc3RhdGljIGludCBzeW1fZ2V0cGNpY2xvY2sgKHN0cnVjdCBzeW1faGNiICpucCkKK3sKKwlpbnQgZiA9IDA7CisKKwkvKgorCSAqICBGb3Igbm93LCB3ZSBvbmx5IG5lZWQgdG8ga25vdyBhYm91dCB0aGUgYWN0dWFsIAorCSAqICBQQ0kgQlVTIGNsb2NrIGZyZXF1ZW5jeSBmb3IgQzEwMTAtNjYgY2hpcHMuCisJICovCisjaWYgMQorCWlmIChucC0+ZmVhdHVyZXMgJiBGRV82Nk1IWikgeworI2Vsc2UKKwlpZiAoMSkgeworI2VuZGlmCisJCU9VVEIobnAsIG5jX3N0ZXN0MSwgU0NMSyk7IC8qIFVzZSB0aGUgUENJIGNsb2NrIGFzIFNDU0kgY2xvY2sgKi8KKwkJZiA9IHN5bV9nZXRmcmVxKG5wKTsKKwkJT1VUQihucCwgbmNfc3Rlc3QxLCAwKTsKKwl9CisJbnAtPnBjaWNsa19raHogPSBmOworCisJcmV0dXJuIGY7Cit9CisKKy8qCisgKiAgU1lNQklPUyBjaGlwIGNsb2NrIGRpdmlzb3IgdGFibGUuCisgKgorICogIERpdmlzb3JzIGFyZSBtdWx0aXBsaWVkIGJ5IDEwLDAwMCwwMDAgaW4gb3JkZXIgdG8gbWFrZSAKKyAqICBjYWxjdWxhdGlvbnMgbW9yZSBzaW1wbGUuCisgKi8KKyNkZWZpbmUgXzVNIDUwMDAwMDAKK3N0YXRpYyB1MzIgZGl2XzEwTVtdID0gezIqXzVNLCAzKl81TSwgNCpfNU0sIDYqXzVNLCA4Kl81TSwgMTIqXzVNLCAxNipfNU19OworCisvKgorICogIEdldCBjbG9jayBmYWN0b3IgYW5kIHN5bmMgZGl2aXNvciBmb3IgYSBnaXZlbiAKKyAqICBzeW5jaHJvbm91cyBmYWN0b3IgcGVyaW9kLgorICovCitzdGF0aWMgaW50IAorc3ltX2dldHN5bmMoc3RydWN0IHN5bV9oY2IgKm5wLCB1X2NoYXIgZHQsIHVfY2hhciBzZmFjLCB1X2NoYXIgKmRpdnAsIHVfY2hhciAqZmFrcCkKK3sKKwl1MzIJY2xrID0gbnAtPmNsb2NrX2toejsJLyogU0NTSSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6CSovCisJaW50CWRpdiA9IG5wLT5jbG9ja19kaXZuOwkvKiBOdW1iZXIgb2YgZGl2aXNvcnMgc3VwcG9ydGVkCSovCisJdTMyCWZhazsJCQkvKiBTeW5jIGZhY3RvciBpbiBzeGZlcgkJKi8KKwl1MzIJcGVyOwkJCS8qIFBlcmlvZCBpbiB0ZW50aHMgb2YgbnMJKi8KKwl1MzIJa3BjOwkJCS8qIChwZXIgKiBjbGspCQkJKi8KKwlpbnQJcmV0OworCisJLyoKKwkgKiAgQ29tcHV0ZSB0aGUgc3luY2hyb25vdXMgcGVyaW9kIGluIHRlbnRocyBvZiBuYW5vLXNlY29uZHMKKwkgKi8KKwlpZiAoZHQgJiYgc2ZhYyA8PSA5KQlwZXIgPSAxMjU7CisJZWxzZSBpZgkoc2ZhYyA8PSAxMCkJcGVyID0gMjUwOworCWVsc2UgaWYJKHNmYWMgPT0gMTEpCXBlciA9IDMwMzsKKwllbHNlIGlmCShzZmFjID09IDEyKQlwZXIgPSA1MDA7CisJZWxzZQkJCXBlciA9IDQwICogc2ZhYzsKKwlyZXQgPSBwZXI7CisKKwlrcGMgPSBwZXIgKiBjbGs7CisJaWYgKGR0KQorCQlrcGMgPDw9IDE7CisKKwkvKgorCSAqICBGb3IgZWFybGllc3QgQzEwIHJldmlzaW9uIDAsIHdlIGNhbm5vdCB1c2UgZXh0cmEgCisJICogIGNsb2NrcyBmb3IgdGhlIHNldHRpbmcgb2YgdGhlIFNDU0kgY2xvY2tpbmcuCisJICogIE5vdGUgdGhhdCB0aGlzIGxpbWl0cyB0aGUgbG93ZXN0IHN5bmMgZGF0YSB0cmFuc2ZlciAKKwkgKiAgdG8gNSBNZWdhLXRyYW5zZmVycyBwZXIgc2Vjb25kIGFuZCBtYXkgcmVzdWx0IGluCisJICogIHVzaW5nIGhpZ2hlciBjbG9jayBkaXZpc29ycy4KKwkgKi8KKyNpZiAxCisJaWYgKChucC0+ZmVhdHVyZXMgJiAoRkVfQzEwfEZFX1UzRU4pKSA9PSBGRV9DMTApIHsKKwkJLyoKKwkJICogIExvb2sgZm9yIHRoZSBsb3dlc3QgY2xvY2sgZGl2aXNvciB0aGF0IGFsbG93cyBhbiAKKwkJICogIG91dHB1dCBzcGVlZCBub3QgZmFzdGVyIHRoYW4gdGhlIHBlcmlvZC4KKwkJICovCisJCXdoaWxlIChkaXYgPiAwKSB7CisJCQktLWRpdjsKKwkJCWlmIChrcGMgPiAoZGl2XzEwTVtkaXZdIDw8IDIpKSB7CisJCQkJKytkaXY7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZmFrID0gMDsJCQkvKiBObyBleHRyYSBjbG9ja3MgKi8KKwkJaWYgKGRpdiA9PSBucC0+Y2xvY2tfZGl2bikgewkvKiBBcmUgd2UgdG9vIGZhc3QgPyAqLworCQkJcmV0ID0gLTE7CisJCX0KKwkJKmRpdnAgPSBkaXY7CisJCSpmYWtwID0gZmFrOworCQlyZXR1cm4gcmV0OworCX0KKyNlbmRpZgorCisJLyoKKwkgKiAgTG9vayBmb3IgdGhlIGdyZWF0ZXN0IGNsb2NrIGRpdmlzb3IgdGhhdCBhbGxvd3MgYW4gCisJICogIGlucHV0IHNwZWVkIGZhc3RlciB0aGFuIHRoZSBwZXJpb2QuCisJICovCisJd2hpbGUgKGRpdi0tID4gMCkKKwkJaWYgKGtwYyA+PSAoZGl2XzEwTVtkaXZdIDw8IDIpKSBicmVhazsKKworCS8qCisJICogIENhbGN1bGF0ZSB0aGUgbG93ZXN0IGNsb2NrIGZhY3RvciB0aGF0IGFsbG93cyBhbiBvdXRwdXQgCisJICogIHNwZWVkIG5vdCBmYXN0ZXIgdGhhbiB0aGUgcGVyaW9kLCBhbmQgdGhlIG1heCBvdXRwdXQgc3BlZWQuCisJICogIElmIGZhayA+PSAxIHdlIHdpbGwgc2V0IGJvdGggWENMS0hfU1QgYW5kIFhDTEtIX0RULgorCSAqICBJZiBmYWsgPj0gMiB3ZSB3aWxsIGFsc28gc2V0IFhDTEtTX1NUIGFuZCBYQ0xLU19EVC4KKwkgKi8KKwlpZiAoZHQpIHsKKwkJZmFrID0gKGtwYyAtIDEpIC8gKGRpdl8xME1bZGl2XSA8PCAxKSArIDEgLSAyOworCQkvKiByZXQgPSAoKDIrZmFrKSpkaXZfMTBNW2Rpdl0pL25wLT5jbG9ja19raHo7ICovCisJfSBlbHNlIHsKKwkJZmFrID0gKGtwYyAtIDEpIC8gZGl2XzEwTVtkaXZdICsgMSAtIDQ7CisJCS8qIHJldCA9ICgoNCtmYWspKmRpdl8xME1bZGl2XSkvbnAtPmNsb2NrX2toejsgKi8KKwl9CisKKwkvKgorCSAqICBDaGVjayBhZ2FpbnN0IG91ciBoYXJkd2FyZSBsaW1pdHMsIG9yIGJ1Z3MgOikuCisJICovCisJaWYgKGZhayA+IDIpIHsKKwkJZmFrID0gMjsKKwkJcmV0ID0gLTE7CisJfQorCisJLyoKKwkgKiAgQ29tcHV0ZSBhbmQgcmV0dXJuIHN5bmMgcGFyYW1ldGVycy4KKwkgKi8KKwkqZGl2cCA9IGRpdjsKKwkqZmFrcCA9IGZhazsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiAgU1lNQklPUyBjaGlwcyBhbGxvdyBidXJzdCBsZW5ndGhzIG9mIDIsIDQsIDgsIDE2LCAzMiwgNjQsCisgKiAgMTI4IHRyYW5zZmVycy4gQWxsIGNoaXBzIHN1cHBvcnQgYXQgbGVhc3QgMTYgdHJhbnNmZXJzIAorICogIGJ1cnN0cy4gVGhlIDgyNUEsIDg3NSBhbmQgODk1IGNoaXBzIHN1cHBvcnQgYnVyc3RzIG9mIHVwIAorICogIHRvIDEyOCB0cmFuc2ZlcnMgYW5kIHRoZSA4OTVBIGFuZCA4OTYgc3VwcG9ydCBidXJzdHMgb2YgdXAKKyAqICB0byA2NCB0cmFuc2ZlcnMuIEFsbCBvdGhlciBjaGlwcyBzdXBwb3J0IHVwIHRvIDE2IAorICogIHRyYW5zZmVycyBidXJzdHMuCisgKgorICogIEZvciBQQ0kgMzIgYml0IGRhdGEgdHJhbnNmZXJzIGVhY2ggdHJhbnNmZXIgaXMgYSBEV09SRC4KKyAqICBJdCBpcyBhIFFVQURXT1JEICg4IGJ5dGVzKSBmb3IgUENJIDY0IGJpdCBkYXRhIHRyYW5zZmVycy4KKyAqCisgKiAgV2UgdXNlIGxvZyBiYXNlIDIgKGJ1cnN0IGxlbmd0aCkgYXMgaW50ZXJuYWwgY29kZSwgd2l0aCAKKyAqICB2YWx1ZSAwIG1lYW5pbmcgImJ1cnN0IGRpc2FibGVkIi4KKyAqLworCisvKgorICogIEJ1cnN0IGxlbmd0aCBmcm9tIGJ1cnN0IGNvZGUuCisgKi8KKyNkZWZpbmUgYnVyc3RfbGVuZ3RoKGJjKSAoIShiYykpPyAwIDogMSA8PCAoYmMpCisKKy8qCisgKiAgQnVyc3QgY29kZSBmcm9tIGlvIHJlZ2lzdGVyIGJpdHMuCisgKi8KKyNkZWZpbmUgYnVyc3RfY29kZShkbW9kZSwgY3Rlc3Q0LCBjdGVzdDUpIFwKKwkoY3Rlc3Q0KSAmIDB4ODA/IDAgOiAoKChkbW9kZSkgJiAweGMwKSA+PiA2KSArICgoY3Rlc3Q1KSAmIDB4MDQpICsgMQorCisvKgorICogIFNldCBpbml0aWFsIGlvIHJlZ2lzdGVyIGJpdHMgZnJvbSBidXJzdCBjb2RlLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBzeW1faW5pdF9idXJzdChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHVfY2hhciBiYykKK3sKKwlucC0+cnZfY3Rlc3Q0CSY9IH4weDgwOworCW5wLT5ydl9kbW9kZQkmPSB+KDB4MyA8PCA2KTsKKwlucC0+cnZfY3Rlc3Q1CSY9IH4weDQ7CisKKwlpZiAoIWJjKSB7CisJCW5wLT5ydl9jdGVzdDQJfD0gMHg4MDsKKwl9CisJZWxzZSB7CisJCS0tYmM7CisJCW5wLT5ydl9kbW9kZQl8PSAoKGJjICYgMHgzKSA8PCA2KTsKKwkJbnAtPnJ2X2N0ZXN0NQl8PSAoYmMgJiAweDQpOworCX0KK30KKworCisvKgorICogUHJpbnQgb3V0IHRoZSBsaXN0IG9mIHRhcmdldHMgdGhhdCBoYXZlIHNvbWUgZmxhZyBkaXNhYmxlZCBieSB1c2VyLgorICovCitzdGF0aWMgdm9pZCBzeW1fcHJpbnRfdGFyZ2V0c19mbGFnKHN0cnVjdCBzeW1faGNiICpucCwgaW50IG1hc2ssIGNoYXIgKm1zZykKK3sKKwlpbnQgY250OworCWludCBpOworCisJZm9yIChjbnQgPSAwLCBpID0gMCA7IGkgPCBTWU1fQ09ORl9NQVhfVEFSR0VUIDsgaSsrKSB7CisJCWlmIChpID09IG5wLT5teWFkZHIpCisJCQljb250aW51ZTsKKwkJaWYgKG5wLT50YXJnZXRbaV0udXNyZmxhZ3MgJiBtYXNrKSB7CisJCQlpZiAoIWNudCsrKQorCQkJCXByaW50ZigiJXM6ICVzIGRpc2FibGVkIGZvciB0YXJnZXRzIiwKKwkJCQkJc3ltX25hbWUobnApLCBtc2cpOworCQkJcHJpbnRmKCIgJWQiLCBpKTsKKwkJfQorCX0KKwlpZiAoY250KQorCQlwcmludGYoIi5cbiIpOworfQorCisvKgorICogIFNhdmUgaW5pdGlhbCBzZXR0aW5ncyBvZiBzb21lIElPIHJlZ2lzdGVycy4KKyAqICBBc3N1bWVkIHRvIGhhdmUgYmVlbiBzZXQgYnkgQklPUy4KKyAqICBXZSBjYW5ub3QgcmVzZXQgdGhlIGNoaXAgcHJpb3IgdG8gcmVhZGluZyB0aGUgCisgKiAgSU8gcmVnaXN0ZXJzLCBzaW5jZSBpbmZvcm1hdGlvbnMgd2lsbCBiZSBsb3N0LgorICogIFNpbmNlIHRoZSBTQ1JJUFRTIHByb2Nlc3NvciBtYXkgYmUgcnVubmluZywgdGhpcyAKKyAqICBpcyBub3Qgc2FmZSBvbiBwYXBlciwgYnV0IGl0IHNlZW1zIHRvIHdvcmsgcXVpdGUgCisgKiAgd2VsbC4gOikKKyAqLworc3RhdGljIHZvaWQgc3ltX3NhdmVfaW5pdGlhbF9zZXR0aW5nIChzdHJ1Y3Qgc3ltX2hjYiAqbnApCit7CisJbnAtPnN2X3NjbnRsMAk9IElOQihucCwgbmNfc2NudGwwKSAmIDB4MGE7CisJbnAtPnN2X3NjbnRsMwk9IElOQihucCwgbmNfc2NudGwzKSAmIDB4MDc7CisJbnAtPnN2X2Rtb2RlCT0gSU5CKG5wLCBuY19kbW9kZSkgICYgMHhjZTsKKwlucC0+c3ZfZGNudGwJPSBJTkIobnAsIG5jX2RjbnRsKSAgJiAweGE4OworCW5wLT5zdl9jdGVzdDMJPSBJTkIobnAsIG5jX2N0ZXN0MykgJiAweDAxOworCW5wLT5zdl9jdGVzdDQJPSBJTkIobnAsIG5jX2N0ZXN0NCkgJiAweDgwOworCW5wLT5zdl9ncGNudGwJPSBJTkIobnAsIG5jX2dwY250bCk7CisJbnAtPnN2X3N0ZXN0MQk9IElOQihucCwgbmNfc3Rlc3QxKTsKKwlucC0+c3Zfc3Rlc3QyCT0gSU5CKG5wLCBuY19zdGVzdDIpICYgMHgyMDsKKwlucC0+c3Zfc3Rlc3Q0CT0gSU5CKG5wLCBuY19zdGVzdDQpOworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9DMTApIHsJLyogQWx3YXlzIGxhcmdlIERNQSBmaWZvICsgdWx0cmEzICovCisJCW5wLT5zdl9zY250bDQJPSBJTkIobnAsIG5jX3NjbnRsNCk7CisJCW5wLT5zdl9jdGVzdDUJPSBJTkIobnAsIG5jX2N0ZXN0NSkgJiAweDA0OworCX0KKwllbHNlCisJCW5wLT5zdl9jdGVzdDUJPSBJTkIobnAsIG5jX2N0ZXN0NSkgJiAweDI0OworfQorCisvKgorICogIFByZXBhcmUgaW8gcmVnaXN0ZXIgdmFsdWVzIHVzZWQgYnkgc3ltX3N0YXJ0X3VwKCkgCisgKiAgYWNjb3JkaW5nIHRvIHNlbGVjdGVkIGFuZCBzdXBwb3J0ZWQgZmVhdHVyZXMuCisgKi8KK3N0YXRpYyBpbnQgc3ltX3ByZXBhcmVfc2V0dGluZyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX252cmFtICpudnJhbSkKK3sKKwl1X2NoYXIJYnVyc3RfbWF4OworCXUzMglwZXJpb2Q7CisJaW50IGk7CisKKwkvKgorCSAqICBXaWRlID8KKwkgKi8KKwlucC0+bWF4d2lkZQk9IChucC0+ZmVhdHVyZXMgJiBGRV9XSURFKT8gMSA6IDA7CisKKwkvKgorCSAqICBHdWVzcyB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjaGlwJ3MgY2xvY2suCisJICovCisJaWYJKG5wLT5mZWF0dXJlcyAmIChGRV9VTFRSQTMgfCBGRV9VTFRSQTIpKQorCQlucC0+Y2xvY2tfa2h6ID0gMTYwMDAwOworCWVsc2UgaWYJKG5wLT5mZWF0dXJlcyAmIEZFX1VMVFJBKQorCQlucC0+Y2xvY2tfa2h6ID0gODAwMDA7CisJZWxzZQorCQlucC0+Y2xvY2tfa2h6ID0gNDAwMDA7CisKKwkvKgorCSAqICBHZXQgdGhlIGNsb2NrIG11bHRpcGxpZXIgZmFjdG9yLgorIAkgKi8KKwlpZgkobnAtPmZlYXR1cmVzICYgRkVfUVVBRCkKKwkJbnAtPm11bHRpcGxpZXIJPSA0OworCWVsc2UgaWYJKG5wLT5mZWF0dXJlcyAmIEZFX0RCTFIpCisJCW5wLT5tdWx0aXBsaWVyCT0gMjsKKwllbHNlCisJCW5wLT5tdWx0aXBsaWVyCT0gMTsKKworCS8qCisJICogIE1lYXN1cmUgU0NTSSBjbG9jayBmcmVxdWVuY3kgZm9yIGNoaXBzIAorCSAqICBpdCBtYXkgdmFyeSBmcm9tIGFzc3VtZWQgb25lLgorCSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9WQVJDTEspCisJCXN5bV9nZXRjbG9jayhucCwgbnAtPm11bHRpcGxpZXIpOworCisJLyoKKwkgKiBEaXZpc29yIHRvIGJlIHVzZWQgZm9yIGFzeW5jICh0aW1lciBwcmUtc2NhbGVyKS4KKwkgKi8KKwlpID0gbnAtPmNsb2NrX2Rpdm4gLSAxOworCXdoaWxlICgtLWkgPj0gMCkgeworCQlpZiAoMTB1bCAqIFNZTV9DT05GX01JTl9BU1lOQyAqIG5wLT5jbG9ja19raHogPiBkaXZfMTBNW2ldKSB7CisJCQkrK2k7CisJCQlicmVhazsKKwkJfQorCX0KKwlucC0+cnZfc2NudGwzID0gaSsxOworCisJLyoKKwkgKiBUaGUgQzEwMTAgdXNlcyBoYXJkd2lyZWQgZGl2aXNvcnMgZm9yIGFzeW5jLgorCSAqIFNvLCB3ZSBqdXN0IHRocm93IGF3YXksIHRoZSBhc3luYy4gZGl2aXNvci46LSkKKwkgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfQzEwKQorCQlucC0+cnZfc2NudGwzID0gMDsKKworCS8qCisJICogTWluaW11bSBzeW5jaHJvbm91cyBwZXJpb2QgZmFjdG9yIHN1cHBvcnRlZCBieSB0aGUgY2hpcC4KKwkgKiBCdHcsICdwZXJpb2QnIGlzIGluIHRlbnRocyBvZiBuYW5vc2Vjb25kcy4KKwkgKi8KKwlwZXJpb2QgPSAoNCAqIGRpdl8xME1bMF0gKyBucC0+Y2xvY2tfa2h6IC0gMSkgLyBucC0+Y2xvY2tfa2h6OworCisJaWYJKHBlcmlvZCA8PSAyNTApCQlucC0+bWluc3luYyA9IDEwOworCWVsc2UgaWYJKHBlcmlvZCA8PSAzMDMpCQlucC0+bWluc3luYyA9IDExOworCWVsc2UgaWYJKHBlcmlvZCA8PSA1MDApCQlucC0+bWluc3luYyA9IDEyOworCWVsc2UJCQkJbnAtPm1pbnN5bmMgPSAocGVyaW9kICsgNDAgLSAxKSAvIDQwOworCisJLyoKKwkgKiBDaGVjayBhZ2FpbnN0IGNoaXAgU0NTSSBzdGFuZGFyZCBzdXBwb3J0IChTQ1NJLTIsVUxUUkEsVUxUUkEyKS4KKwkgKi8KKwlpZgkobnAtPm1pbnN5bmMgPCAyNSAmJgorCQkgIShucC0+ZmVhdHVyZXMgJiAoRkVfVUxUUkF8RkVfVUxUUkEyfEZFX1VMVFJBMykpKQorCQlucC0+bWluc3luYyA9IDI1OworCWVsc2UgaWYJKG5wLT5taW5zeW5jIDwgMTIgJiYKKwkJICEobnAtPmZlYXR1cmVzICYgKEZFX1VMVFJBMnxGRV9VTFRSQTMpKSkKKwkJbnAtPm1pbnN5bmMgPSAxMjsKKworCS8qCisJICogTWF4aW11bSBzeW5jaHJvbm91cyBwZXJpb2QgZmFjdG9yIHN1cHBvcnRlZCBieSB0aGUgY2hpcC4KKwkgKi8KKwlwZXJpb2QgPSAoMTEgKiBkaXZfMTBNW25wLT5jbG9ja19kaXZuIC0gMV0pIC8gKDQgKiBucC0+Y2xvY2tfa2h6KTsKKwlucC0+bWF4c3luYyA9IHBlcmlvZCA+IDI1NDAgPyAyNTQgOiBwZXJpb2QgLyAxMDsKKworCS8qCisJICogSWYgY2hpcCBpcyBhIEMxMDEwLCBndWVzcyB0aGUgc3luYyBsaW1pdHMgaW4gRFQgbW9kZS4KKwkgKi8KKwlpZiAoKG5wLT5mZWF0dXJlcyAmIChGRV9DMTB8RkVfVUxUUkEzKSkgPT0gKEZFX0MxMHxGRV9VTFRSQTMpKSB7CisJCWlmIChucC0+Y2xvY2tfa2h6ID09IDE2MDAwMCkgeworCQkJbnAtPm1pbnN5bmNfZHQgPSA5OworCQkJbnAtPm1heHN5bmNfZHQgPSA1MDsKKwkJCW5wLT5tYXhvZmZzX2R0ID0gbnZyYW0tPnR5cGUgPyA2MiA6IDMxOworCQl9CisJfQorCQorCS8qCisJICogIDY0IGJpdCBhZGRyZXNzaW5nICAoODk1QS84OTYvMTAxMCkgPworCSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9EQUMpIHsKKyNpZiAgIFNZTV9DT05GX0RNQV9BRERSRVNTSU5HX01PREUgPT0gMAorCQlucC0+cnZfY2NudGwxCXw9IChEREFDKTsKKyNlbGlmIFNZTV9DT05GX0RNQV9BRERSRVNTSU5HX01PREUgPT0gMQorCQlpZiAoIW5wLT51c2VfZGFjKQorCQkJbnAtPnJ2X2NjbnRsMQl8PSAoRERBQyk7CisJCWVsc2UKKwkJCW5wLT5ydl9jY250bDEJfD0gKFhUSU1PRCB8IEVYVElCTVYpOworI2VsaWYgU1lNX0NPTkZfRE1BX0FERFJFU1NJTkdfTU9ERSA9PSAyCisJCWlmICghbnAtPnVzZV9kYWMpCisJCQlucC0+cnZfY2NudGwxCXw9IChEREFDKTsKKwkJZWxzZQorCQkJbnAtPnJ2X2NjbnRsMQl8PSAoMCB8IEVYVElCTVYpOworI2VuZGlmCisJfQorCisJLyoKKwkgKiAgUGhhc2UgbWlzbWF0Y2ggaGFuZGxlZCBieSBTQ1JJUFRTICg4OTVBLzg5Ni8xMDEwKSA/CisgIAkgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfTk9QTSkKKwkJbnAtPnJ2X2NjbnRsMAl8PSAoRU5QTUopOworCisgCS8qCisJICogIEMxMDEwLTMzIEVycmF0YTogUGFydCBOdW1iZXI6NjA5LTAzOTYzOCAocmV2LiAxKSBpcyBmaXhlZC4KKwkgKiAgSW4gZHVhbCBjaGFubmVsIG1vZGUsIGNvbnRlbnRpb24gb2NjdXJzIGlmIGludGVybmFsIGN5Y2xlcworCSAqICBhcmUgdXNlZC4gRGlzYWJsZSBpbnRlcm5hbCBjeWNsZXMuCisJICovCisJaWYgKG5wLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9MU0lfNTNDMTAxMF8zMyAmJgorCSAgICBucC0+cmV2aXNpb25faWQgPCAweDEpCisJCW5wLT5ydl9jY250bDAJfD0gIERJTFM7CisKKwkvKgorCSAqICBTZWxlY3QgYnVyc3QgbGVuZ3RoIChkd29yZHMpCisJICovCisJYnVyc3RfbWF4CT0gU1lNX1NFVFVQX0JVUlNUX09SREVSOworCWlmIChidXJzdF9tYXggPT0gMjU1KQorCQlidXJzdF9tYXggPSBidXJzdF9jb2RlKG5wLT5zdl9kbW9kZSwgbnAtPnN2X2N0ZXN0NCwKKwkJCQkgICAgICAgbnAtPnN2X2N0ZXN0NSk7CisJaWYgKGJ1cnN0X21heCA+IDcpCisJCWJ1cnN0X21heCA9IDc7CisJaWYgKGJ1cnN0X21heCA+IG5wLT5tYXhidXJzdCkKKwkJYnVyc3RfbWF4ID0gbnAtPm1heGJ1cnN0OworCisJLyoKKwkgKiAgREVMIDM1MiAtIDUzQzgxMCBSZXYgeDExIC0gUGFydCBOdW1iZXIgNjA5LTAzOTIxNDAgLSBJVEVNIDIuCisJICogIFRoaXMgY2hpcCBhbmQgdGhlIDg2MCBSZXYgMSBtYXkgd3JvbmdseSB1c2UgUENJIGNhY2hlIGxpbmUgCisJICogIGJhc2VkIHRyYW5zYWN0aW9ucyBvbiBMT0FEL1NUT1JFIGluc3RydWN0aW9ucy4gU28gd2UgaGF2ZSAKKwkgKiAgdG8gcHJldmVudCB0aGVzZSBjaGlwcyBmcm9tIHVzaW5nIHN1Y2ggUENJIHRyYW5zYWN0aW9ucyBpbiAKKwkgKiAgdGhpcyBkcml2ZXIuIFRoZSBnZW5lcmljIG5jciBkcml2ZXIgdGhhdCBkb2VzIG5vdCB1c2UgCisJICogIExPQUQvU1RPUkUgaW5zdHJ1Y3Rpb25zIGRvZXMgbm90IG5lZWQgdGhpcyB3b3JrLWFyb3VuZC4KKwkgKi8KKwlpZiAoKG5wLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9OQ1JfNTNDODEwICYmCisJICAgICBucC0+cmV2aXNpb25faWQgPj0gMHgxMCAmJiBucC0+cmV2aXNpb25faWQgPD0gMHgxMSkgfHwKKwkgICAgKG5wLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9OQ1JfNTNDODYwICYmCisJICAgICBucC0+cmV2aXNpb25faWQgPD0gMHgxKSkKKwkJbnAtPmZlYXR1cmVzICY9IH4oRkVfV1JJRXxGRV9FUkx8RkVfRVJNUCk7CisKKwkvKgorCSAqICBTZWxlY3QgYWxsIHN1cHBvcnRlZCBzcGVjaWFsIGZlYXR1cmVzLgorCSAqICBJZiB3ZSBhcmUgdXNpbmcgb24tYm9hcmQgUkFNIGZvciBzY3JpcHRzLCBwcmVmZXRjaCAoUEZFTikgCisJICogIGRvZXMgbm90IGhlbHAsIGJ1dCBidXJzdCBvcCBmZXRjaCAoQk9GKSBkb2VzLgorCSAqICBEaXNhYmxpbmcgUEZFTiBtYWtlcyBzdXJlIEJPRiB3aWxsIGJlIHVzZWQuCisJICovCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX0VSTCkKKwkJbnAtPnJ2X2Rtb2RlCXw9IEVSTDsJCS8qIEVuYWJsZSBSZWFkIExpbmUgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfQk9GKQorCQlucC0+cnZfZG1vZGUJfD0gQk9GOwkJLyogQnVyc3QgT3Bjb2RlIEZldGNoICovCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX0VSTVApCisJCW5wLT5ydl9kbW9kZQl8PSBFUk1QOwkvKiBFbmFibGUgUmVhZCBNdWx0aXBsZSAqLworI2lmIDEKKwlpZiAoKG5wLT5mZWF0dXJlcyAmIEZFX1BGRU4pICYmICFucC0+cmFtX2JhKQorI2Vsc2UKKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfUEZFTikKKyNlbmRpZgorCQlucC0+cnZfZGNudGwJfD0gUEZFTjsJLyogUHJlZmV0Y2ggRW5hYmxlICovCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX0NMU0UpCisJCW5wLT5ydl9kY250bAl8PSBDTFNFOwkvKiBDYWNoZSBMaW5lIFNpemUgRW5hYmxlICovCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX1dSSUUpCisJCW5wLT5ydl9jdGVzdDMJfD0gV1JJRTsJLyogV3JpdGUgYW5kIEludmFsaWRhdGUgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfREZTKQorCQlucC0+cnZfY3Rlc3Q1CXw9IERGUzsJCS8qIERtYSBGaWZvIFNpemUgKi8KKworCS8qCisJICogIFNlbGVjdCBzb21lIG90aGVyCisJICovCisJbnAtPnJ2X2N0ZXN0NAl8PSBNUEVFOyAvKiBNYXN0ZXIgcGFyaXR5IGNoZWNraW5nICovCisJbnAtPnJ2X3NjbnRsMAl8PSAweDBhOyAvKiAgZnVsbCBhcmIuLCBlbmEgcGFyaXR5LCBwYXItPkFUTiAgKi8KKworCS8qCisJICogIEdldCBwYXJpdHkgY2hlY2tpbmcsIGhvc3QgSUQgYW5kIHZlcmJvc2UgbW9kZSBmcm9tIE5WUkFNCisJICovCisJbnAtPm15YWRkciA9IDI1NTsKKwlzeW1fbnZyYW1fc2V0dXBfaG9zdChzaG9zdCwgbnAsIG52cmFtKTsKKworCS8qCisJICogIEdldCBTQ1NJIGFkZHIgb2YgaG9zdCBhZGFwdGVyIChzZXQgYnkgYmlvcz8pLgorCSAqLworCWlmIChucC0+bXlhZGRyID09IDI1NSkgeworCQlucC0+bXlhZGRyID0gSU5CKG5wLCBuY19zY2lkKSAmIDB4MDc7CisJCWlmICghbnAtPm15YWRkcikKKwkJCW5wLT5teWFkZHIgPSBTWU1fU0VUVVBfSE9TVF9JRDsKKwl9CisKKwkvKgorCSAqICBQcmVwYXJlIGluaXRpYWwgaW8gcmVnaXN0ZXIgYml0cyBmb3IgYnVyc3QgbGVuZ3RoCisJICovCisJc3ltX2luaXRfYnVyc3QobnAsIGJ1cnN0X21heCk7CisKKwkvKgorCSAqICBTZXQgU0NTSSBCVVMgbW9kZS4KKwkgKiAgLSBMVkQgY2FwYWJsZSBjaGlwcyAoODk1Lzg5NUEvODk2LzEwMTApIHJlcG9ydCB0aGUgCisJICogICAgY3VycmVudCBCVVMgbW9kZSB0aHJvdWdoIHRoZSBTVEVTVDQgSU8gcmVnaXN0ZXIuCisJICogIC0gRm9yIHByZXZpb3VzIGdlbmVyYXRpb24gY2hpcHMgKDgyNS84MjVBLzg3NSksIAorCSAqICAgIHVzZXIgaGFzIHRvIHRlbGwgdXMgaG93IHRvIGNoZWNrIGFnYWluc3QgSFZELCAKKwkgKiAgICBzaW5jZSBhIDEwMCUgc2FmZSBhbGdvcml0aG0gaXMgbm90IHBvc3NpYmxlLgorCSAqLworCW5wLT5zY3NpX21vZGUgPSBTTU9ERV9TRTsKKwlpZiAobnAtPmZlYXR1cmVzICYgKEZFX1VMVFJBMnxGRV9VTFRSQTMpKQorCQlucC0+c2NzaV9tb2RlID0gKG5wLT5zdl9zdGVzdDQgJiBTTU9ERSk7CisJZWxzZSBpZgkobnAtPmZlYXR1cmVzICYgRkVfRElGRikgeworCQlpZiAoU1lNX1NFVFVQX1NDU0lfRElGRiA9PSAxKSB7CisJCQlpZiAobnAtPnN2X3NjbnRsMykgeworCQkJCWlmIChucC0+c3Zfc3Rlc3QyICYgMHgyMCkKKwkJCQkJbnAtPnNjc2lfbW9kZSA9IFNNT0RFX0hWRDsKKwkJCX0KKwkJCWVsc2UgaWYgKG52cmFtLT50eXBlID09IFNZTV9TWU1CSU9TX05WUkFNKSB7CisJCQkJaWYgKCEoSU5CKG5wLCBuY19ncHJlZykgJiAweDA4KSkKKwkJCQkJbnAtPnNjc2lfbW9kZSA9IFNNT0RFX0hWRDsKKwkJCX0KKwkJfQorCQllbHNlIGlmCShTWU1fU0VUVVBfU0NTSV9ESUZGID09IDIpCisJCQlucC0+c2NzaV9tb2RlID0gU01PREVfSFZEOworCX0KKwlpZiAobnAtPnNjc2lfbW9kZSA9PSBTTU9ERV9IVkQpCisJCW5wLT5ydl9zdGVzdDIgfD0gMHgyMDsKKworCS8qCisJICogIFNldCBMRUQgc3VwcG9ydCBmcm9tIFNDUklQVFMuCisJICogIElnbm9yZSB0aGlzIGZlYXR1cmUgZm9yIGJvYXJkcyBrbm93biB0byB1c2UgYSAKKwkgKiAgc3BlY2lmaWMgR1BJTyB3aXJpbmcgYW5kIGZvciB0aGUgODk1QSwgODk2IAorCSAqICBhbmQgMTAxMCB0aGF0IGRyaXZlIHRoZSBMRUQgZGlyZWN0bHkuCisJICovCisJaWYgKChTWU1fU0VUVVBfU0NTSV9MRUQgfHwgCisJICAgICAobnZyYW0tPnR5cGUgPT0gU1lNX1NZTUJJT1NfTlZSQU0gfHwKKwkgICAgICAobnZyYW0tPnR5cGUgPT0gU1lNX1RFS1JBTV9OVlJBTSAmJgorCSAgICAgICBucC0+ZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfTkNSXzUzQzg5NSkpKSAmJgorCSAgICAhKG5wLT5mZWF0dXJlcyAmIEZFX0xFREMpICYmICEobnAtPnN2X2dwY250bCAmIDB4MDEpKQorCQlucC0+ZmVhdHVyZXMgfD0gRkVfTEVEMDsKKworCS8qCisJICogIFNldCBpcnEgbW9kZS4KKwkgKi8KKwlzd2l0Y2goU1lNX1NFVFVQX0lSUV9NT0RFICYgMykgeworCWNhc2UgMjoKKwkJbnAtPnJ2X2RjbnRsCXw9IElSUU07CisJCWJyZWFrOworCWNhc2UgMToKKwkJbnAtPnJ2X2RjbnRsCXw9IChucC0+c3ZfZGNudGwgJiBJUlFNKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiAgQ29uZmlndXJlIHRhcmdldHMgYWNjb3JkaW5nIHRvIGRyaXZlciBzZXR1cC4KKwkgKiAgSWYgTlZSQU0gcHJlc2VudCBnZXQgdGFyZ2V0cyBzZXR1cCBmcm9tIE5WUkFNLgorCSAqLworCWZvciAoaSA9IDAgOyBpIDwgU1lNX0NPTkZfTUFYX1RBUkdFVCA7IGkrKykgeworCQlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSAmbnAtPnRhcmdldFtpXTsKKworCQl0cC0+dXNyZmxhZ3MgfD0gKFNZTV9ESVNDX0VOQUJMRUQgfCBTWU1fVEFHU19FTkFCTEVEKTsKKwkJdHAtPnVzcnRhZ3MgPSBTWU1fU0VUVVBfTUFYX1RBRzsKKworCQlzeW1fbnZyYW1fc2V0dXBfdGFyZ2V0KG5wLCBpLCBudnJhbSk7CisKKwkJaWYgKCF0cC0+dXNydGFncykKKwkJCXRwLT51c3JmbGFncyAmPSB+U1lNX1RBR1NfRU5BQkxFRDsKKwl9CisKKwkvKgorCSAqICBMZXQgdXNlciBrbm93IGFib3V0IHRoZSBzZXR0aW5ncy4KKwkgKi8KKwlwcmludGYoIiVzOiAlcywgSUQgJWQsIEZhc3QtJWQsICVzLCAlc1xuIiwgc3ltX25hbWUobnApLAorCQlzeW1fbnZyYW1fdHlwZShudnJhbSksIG5wLT5teWFkZHIsCisJCShucC0+ZmVhdHVyZXMgJiBGRV9VTFRSQTMpID8gODAgOiAKKwkJKG5wLT5mZWF0dXJlcyAmIEZFX1VMVFJBMikgPyA0MCA6IAorCQkobnAtPmZlYXR1cmVzICYgRkVfVUxUUkEpICA/IDIwIDogMTAsCisJCXN5bV9zY3NpX2J1c19tb2RlKG5wLT5zY3NpX21vZGUpLAorCQkobnAtPnJ2X3NjbnRsMCAmIDB4YSkJPyAicGFyaXR5IGNoZWNraW5nIiA6ICJOTyBwYXJpdHkiKTsKKwkvKgorCSAqICBUZWxsIGhpbSBtb3JlIG9uIGRlbWFuZC4KKwkgKi8KKwlpZiAoc3ltX3ZlcmJvc2UpIHsKKwkJcHJpbnRmKCIlczogJXMgSVJRIGxpbmUgZHJpdmVyJXNcbiIsCisJCQlzeW1fbmFtZShucCksCisJCQlucC0+cnZfZGNudGwgJiBJUlFNID8gInRvdGVtIHBvbGUiIDogIm9wZW4gZHJhaW4iLAorCQkJbnAtPnJhbV9iYSA/ICIsIHVzaW5nIG9uLWNoaXAgU1JBTSIgOiAiIik7CisJCXByaW50ZigiJXM6IHVzaW5nICVzIGZpcm13YXJlLlxuIiwgc3ltX25hbWUobnApLCBucC0+ZndfbmFtZSk7CisJCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9OT1BNKQorCQkJcHJpbnRmKCIlczogaGFuZGxpbmcgcGhhc2UgbWlzbWF0Y2ggZnJvbSBTQ1JJUFRTLlxuIiwgCisJCQkgICAgICAgc3ltX25hbWUobnApKTsKKwl9CisJLyoKKwkgKiAgQW5kIHN0aWxsIG1vcmUuCisJICovCisJaWYgKHN5bV92ZXJib3NlID49IDIpIHsKKwkJcHJpbnRmICgiJXM6IGluaXRpYWwgU0NOVEwzL0RNT0RFL0RDTlRML0NURVNUMy80LzUgPSAiCisJCQkiKGhleCkgJTAyeC8lMDJ4LyUwMngvJTAyeC8lMDJ4LyUwMnhcbiIsCisJCQlzeW1fbmFtZShucCksIG5wLT5zdl9zY250bDMsIG5wLT5zdl9kbW9kZSwgbnAtPnN2X2RjbnRsLAorCQkJbnAtPnN2X2N0ZXN0MywgbnAtPnN2X2N0ZXN0NCwgbnAtPnN2X2N0ZXN0NSk7CisKKwkJcHJpbnRmICgiJXM6IGZpbmFsICAgU0NOVEwzL0RNT0RFL0RDTlRML0NURVNUMy80LzUgPSAiCisJCQkiKGhleCkgJTAyeC8lMDJ4LyUwMngvJTAyeC8lMDJ4LyUwMnhcbiIsCisJCQlzeW1fbmFtZShucCksIG5wLT5ydl9zY250bDMsIG5wLT5ydl9kbW9kZSwgbnAtPnJ2X2RjbnRsLAorCQkJbnAtPnJ2X2N0ZXN0MywgbnAtPnJ2X2N0ZXN0NCwgbnAtPnJ2X2N0ZXN0NSk7CisJfQorCS8qCisJICogIExldCB1c2VyIGJlIGF3YXJlIG9mIHRhcmdldHMgdGhhdCBoYXZlIHNvbWUgZGlzYWJsZSBmbGFncyBzZXQuCisJICovCisJc3ltX3ByaW50X3RhcmdldHNfZmxhZyhucCwgU1lNX1NDQU5fQk9PVF9ESVNBQkxFRCwgIlNDQU4gQVQgQk9PVCIpOworCWlmIChzeW1fdmVyYm9zZSkKKwkJc3ltX3ByaW50X3RhcmdldHNfZmxhZyhucCwgU1lNX1NDQU5fTFVOU19ESVNBQkxFRCwKKwkJCQkgICAgICAgIlNDQU4gRk9SIExVTlMiKTsKKworCXJldHVybiAwOworfQorCisvKgorICogIFRlc3QgdGhlIHBjaSBidXMgc25vb3AgbG9naWMgOi0oCisgKgorICogIEhhcyB0byBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICovCisjaWZuZGVmIENPTkZJR19TQ1NJX1NZTTUzQzhYWF9JT01BUFBFRAorc3RhdGljIGludCBzeW1fcmVndGVzdCAoc3RydWN0IHN5bV9oY2IgKm5wKQoreworCXJlZ2lzdGVyIHZvbGF0aWxlIHUzMiBkYXRhOworCS8qCisJICogIGNoaXAgcmVnaXN0ZXJzIG1heSBOT1QgYmUgY2FjaGVkLgorCSAqICB3cml0ZSAweGZmZmZmZmZmIHRvIGEgcmVhZCBvbmx5IHJlZ2lzdGVyIGFyZWEsCisJICogIGFuZCB0cnkgdG8gcmVhZCBpdCBiYWNrLgorCSAqLworCWRhdGEgPSAweGZmZmZmZmZmOworCU9VVEwobnAsIG5jX2RzdGF0LCBkYXRhKTsKKwlkYXRhID0gSU5MKG5wLCBuY19kc3RhdCk7CisjaWYgMQorCWlmIChkYXRhID09IDB4ZmZmZmZmZmYpIHsKKyNlbHNlCisJaWYgKChkYXRhICYgMHhlMmYwZmZmZCkgIT0gMHgwMjAwMDA4MCkgeworI2VuZGlmCisJCXByaW50ZiAoIkNBQ0hFIFRFU1QgRkFJTEVEOiByZWcgZHN0YXQtc3N0YXQyIHJlYWRiYWNrICV4LlxuIiwKKwkJCSh1bnNpZ25lZCkgZGF0YSk7CisJCXJldHVybiAoMHgxMCk7CisJfQorCXJldHVybiAoMCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBzeW1fc25vb3B0ZXN0IChzdHJ1Y3Qgc3ltX2hjYiAqbnApCit7CisJdTMyCXN5bV9yZCwgc3ltX3dyLCBzeW1fYmssIGhvc3RfcmQsIGhvc3Rfd3IsIHBjLCBkc3RhdDsKKwlpbnQJaSwgZXJyPTA7CisjaWZuZGVmIENPTkZJR19TQ1NJX1NZTTUzQzhYWF9JT01BUFBFRAorCWVyciB8PSBzeW1fcmVndGVzdCAobnApOworCWlmIChlcnIpIHJldHVybiAoZXJyKTsKKyNlbmRpZgorcmVzdGFydF90ZXN0OgorCS8qCisJICogIEVuYWJsZSBNYXN0ZXIgUGFyaXR5IENoZWNraW5nIGFzIHdlIGludGVuZCAKKwkgKiAgdG8gZW5hYmxlIGl0IGZvciBub3JtYWwgb3BlcmF0aW9ucy4KKwkgKi8KKwlPVVRCKG5wLCBuY19jdGVzdDQsIChucC0+cnZfY3Rlc3Q0ICYgTVBFRSkpOworCS8qCisJICogIGluaXQKKwkgKi8KKwlwYyAgPSBTQ1JJUFRaX0JBKG5wLCBzbm9vcHRlc3QpOworCWhvc3Rfd3IgPSAxOworCXN5bV93ciAgPSAyOworCS8qCisJICogIFNldCBtZW1vcnkgYW5kIHJlZ2lzdGVyLgorCSAqLworCW5wLT5zY3JhdGNoID0gY3B1X3RvX3Njcihob3N0X3dyKTsKKwlPVVRMKG5wLCBuY190ZW1wLCBzeW1fd3IpOworCS8qCisJICogIFN0YXJ0IHNjcmlwdCAoZXhjaGFuZ2UgdmFsdWVzKQorCSAqLworCU9VVEwobnAsIG5jX2RzYSwgbnAtPmhjYl9iYSk7CisJT1VUTF9EU1AobnAsIHBjKTsKKwkvKgorCSAqICBXYWl0ICd0aWwgZG9uZSAod2l0aCB0aW1lb3V0KQorCSAqLworCWZvciAoaT0wOyBpPFNZTV9TTk9PUF9USU1FT1VUOyBpKyspCisJCWlmIChJTkIobnAsIG5jX2lzdGF0KSAmIChJTlRGfFNJUHxESVApKQorCQkJYnJlYWs7CisJaWYgKGk+PVNZTV9TTk9PUF9USU1FT1VUKSB7CisJCXByaW50ZiAoIkNBQ0hFIFRFU1QgRkFJTEVEOiB0aW1lb3V0LlxuIik7CisJCXJldHVybiAoMHgyMCk7CisJfQorCS8qCisJICogIENoZWNrIGZvciBmYXRhbCBETUEgZXJyb3JzLgorCSAqLworCWRzdGF0ID0gSU5CKG5wLCBuY19kc3RhdCk7CisjaWYgMQkvKiBCYW5kIGFpZGluZyBmb3IgYnJva2VuIGhhcmR3YXJlcyB0aGF0IGZhaWwgUENJIHBhcml0eSAqLworCWlmICgoZHN0YXQgJiBNRFBFKSAmJiAobnAtPnJ2X2N0ZXN0NCAmIE1QRUUpKSB7CisJCXByaW50ZiAoIiVzOiBQQ0kgREFUQSBQQVJJVFkgRVJST1IgREVURUNURUQgLSAiCisJCQkiRElTQUJMSU5HIE1BU1RFUiBEQVRBIFBBUklUWSBDSEVDS0lORy5cbiIsCisJCQlzeW1fbmFtZShucCkpOworCQlucC0+cnZfY3Rlc3Q0ICY9IH5NUEVFOworCQlnb3RvIHJlc3RhcnRfdGVzdDsKKwl9CisjZW5kaWYKKwlpZiAoZHN0YXQgJiAoTURQRXxCRnxJSUQpKSB7CisJCXByaW50ZiAoIkNBQ0hFIFRFU1QgRkFJTEVEOiBETUEgZXJyb3IgKGRzdGF0PTB4JTAyeCkuIiwgZHN0YXQpOworCQlyZXR1cm4gKDB4ODApOworCX0KKwkvKgorCSAqICBTYXZlIHRlcm1pbmF0aW9uIHBvc2l0aW9uLgorCSAqLworCXBjID0gSU5MKG5wLCBuY19kc3ApOworCS8qCisJICogIFJlYWQgbWVtb3J5IGFuZCByZWdpc3Rlci4KKwkgKi8KKwlob3N0X3JkID0gc2NyX3RvX2NwdShucC0+c2NyYXRjaCk7CisJc3ltX3JkICA9IElOTChucCwgbmNfc2NyYXRjaGEpOworCXN5bV9iayAgPSBJTkwobnAsIG5jX3RlbXApOworCS8qCisJICogIENoZWNrIHRlcm1pbmF0aW9uIHBvc2l0aW9uLgorCSAqLworCWlmIChwYyAhPSBTQ1JJUFRaX0JBKG5wLCBzbm9vcGVuZCkrOCkgeworCQlwcmludGYgKCJDQUNIRSBURVNUIEZBSUxFRDogc2NyaXB0IGV4ZWN1dGlvbiBmYWlsZWQuXG4iKTsKKwkJcHJpbnRmICgic3RhcnQ9JTA4bHgsIHBjPSUwOGx4LCBlbmQ9JTA4bHhcbiIsIAorCQkJKHVfbG9uZykgU0NSSVBUWl9CQShucCwgc25vb3B0ZXN0KSwgKHVfbG9uZykgcGMsCisJCQkodV9sb25nKSBTQ1JJUFRaX0JBKG5wLCBzbm9vcGVuZCkgKzgpOworCQlyZXR1cm4gKDB4NDApOworCX0KKwkvKgorCSAqICBTaG93IHJlc3VsdHMuCisJICovCisJaWYgKGhvc3Rfd3IgIT0gc3ltX3JkKSB7CisJCXByaW50ZiAoIkNBQ0hFIFRFU1QgRkFJTEVEOiBob3N0IHdyb3RlICVkLCBjaGlwIHJlYWQgJWQuXG4iLAorCQkJKGludCkgaG9zdF93ciwgKGludCkgc3ltX3JkKTsKKwkJZXJyIHw9IDE7CisJfQorCWlmIChob3N0X3JkICE9IHN5bV93cikgeworCQlwcmludGYgKCJDQUNIRSBURVNUIEZBSUxFRDogY2hpcCB3cm90ZSAlZCwgaG9zdCByZWFkICVkLlxuIiwKKwkJCShpbnQpIHN5bV93ciwgKGludCkgaG9zdF9yZCk7CisJCWVyciB8PSAyOworCX0KKwlpZiAoc3ltX2JrICE9IHN5bV93cikgeworCQlwcmludGYgKCJDQUNIRSBURVNUIEZBSUxFRDogY2hpcCB3cm90ZSAlZCwgcmVhZCBiYWNrICVkLlxuIiwKKwkJCShpbnQpIHN5bV93ciwgKGludCkgc3ltX2JrKTsKKwkJZXJyIHw9IDQ7CisJfQorCisJcmV0dXJuIChlcnIpOworfQorCisvKgorICogIGxvZyBtZXNzYWdlIGZvciByZWFsIGhhcmQgZXJyb3JzCisgKgorICogIHN5bTAgdGFyZyAwPzogRVJST1IgKGRzOnNpKSAoc28tc2ktc2QpIChzeC9zMy9zNCkgQCBuYW1lIChkc3A6ZGJjKS4KKyAqICAJICAgICAgcmVnOiByMCByMSByMiByMyByNCByNSByNiAuLi4uLiByZi4KKyAqCisgKiAgZXhjZXB0aW9uIHJlZ2lzdGVyOgorICogIAlkczoJZHN0YXQKKyAqICAJc2k6CXNpc3QKKyAqCisgKiAgU0NTSSBidXMgbGluZXM6CisgKiAgCXNvOgljb250cm9sIGxpbmVzIGFzIGRyaXZlbiBieSBjaGlwLgorICogIAlzaToJY29udHJvbCBsaW5lcyBhcyBzZWVuIGJ5IGNoaXAuCisgKiAgCXNkOglzY3NpIGRhdGEgbGluZXMgYXMgc2VlbiBieSBjaGlwLgorICoKKyAqICB3aWRlL2Zhc3Rtb2RlOgorICogIAlzeDoJc3hmZXIgIChzZWUgdGhlIG1hbnVhbCkKKyAqICAJczM6CXNjbnRsMyAoc2VlIHRoZSBtYW51YWwpCisgKiAgCXM0OglzY250bDQgKHNlZSB0aGUgbWFudWFsKQorICoKKyAqICBjdXJyZW50IHNjcmlwdCBjb21tYW5kOgorICogIAlkc3A6CXNjcmlwdCBhZGRyZXNzIChyZWxhdGl2ZSB0byBzdGFydCBvZiBzY3JpcHQpLgorICogIAlkYmM6CWZpcnN0IHdvcmQgb2Ygc2NyaXB0IGNvbW1hbmQuCisgKgorICogIEZpcnN0IDI0IHJlZ2lzdGVyIG9mIHRoZSBjaGlwOgorICogIAlyMC4ucmYKKyAqLworc3RhdGljIHZvaWQgc3ltX2xvZ19oYXJkX2Vycm9yKHN0cnVjdCBzeW1faGNiICpucCwgdV9zaG9ydCBzaXN0LCB1X2NoYXIgZHN0YXQpCit7CisJdTMyCWRzcDsKKwlpbnQJc2NyaXB0X29mczsKKwlpbnQJc2NyaXB0X3NpemU7CisJY2hhcgkqc2NyaXB0X25hbWU7CisJdV9jaGFyCSpzY3JpcHRfYmFzZTsKKwlpbnQJaTsKKworCWRzcAk9IElOTChucCwgbmNfZHNwKTsKKworCWlmCShkc3AgPiBucC0+c2NyaXB0YV9iYSAmJgorCQkgZHNwIDw9IG5wLT5zY3JpcHRhX2JhICsgbnAtPnNjcmlwdGFfc3opIHsKKwkJc2NyaXB0X29mcwk9IGRzcCAtIG5wLT5zY3JpcHRhX2JhOworCQlzY3JpcHRfc2l6ZQk9IG5wLT5zY3JpcHRhX3N6OworCQlzY3JpcHRfYmFzZQk9ICh1X2NoYXIgKikgbnAtPnNjcmlwdGEwOworCQlzY3JpcHRfbmFtZQk9ICJzY3JpcHRhIjsKKwl9CisJZWxzZSBpZiAobnAtPnNjcmlwdGJfYmEgPCBkc3AgJiYgCisJCSBkc3AgPD0gbnAtPnNjcmlwdGJfYmEgKyBucC0+c2NyaXB0Yl9zeikgeworCQlzY3JpcHRfb2ZzCT0gZHNwIC0gbnAtPnNjcmlwdGJfYmE7CisJCXNjcmlwdF9zaXplCT0gbnAtPnNjcmlwdGJfc3o7CisJCXNjcmlwdF9iYXNlCT0gKHVfY2hhciAqKSBucC0+c2NyaXB0YjA7CisJCXNjcmlwdF9uYW1lCT0gInNjcmlwdGIiOworCX0gZWxzZSB7CisJCXNjcmlwdF9vZnMJPSBkc3A7CisJCXNjcmlwdF9zaXplCT0gMDsKKwkJc2NyaXB0X2Jhc2UJPSBOVUxMOworCQlzY3JpcHRfbmFtZQk9ICJtZW0iOworCX0KKworCXByaW50ZiAoIiVzOiVkOiBFUlJPUiAoJXg6JXgpICgleC0leC0leCkgKCV4LyV4LyV4KSBAICglcyAleDolMDh4KS5cbiIsCisJCXN5bV9uYW1lKG5wKSwgKHVuc2lnbmVkKUlOQihucCwgbmNfc2RpZCkmMHgwZiwgZHN0YXQsIHNpc3QsCisJCSh1bnNpZ25lZClJTkIobnAsIG5jX3NvY2wpLCAodW5zaWduZWQpSU5CKG5wLCBuY19zYmNsKSwKKwkJKHVuc2lnbmVkKUlOQihucCwgbmNfc2JkbCksICh1bnNpZ25lZClJTkIobnAsIG5jX3N4ZmVyKSwKKwkJKHVuc2lnbmVkKUlOQihucCwgbmNfc2NudGwzKSwKKwkJKG5wLT5mZWF0dXJlcyAmIEZFX0MxMCkgPyAgKHVuc2lnbmVkKUlOQihucCwgbmNfc2NudGw0KSA6IDAsCisJCXNjcmlwdF9uYW1lLCBzY3JpcHRfb2ZzLCAgICh1bnNpZ25lZClJTkwobnAsIG5jX2RiYykpOworCisJaWYgKCgoc2NyaXB0X29mcyAmIDMpID09IDApICYmCisJICAgICh1bnNpZ25lZClzY3JpcHRfb2ZzIDwgc2NyaXB0X3NpemUpIHsKKwkJcHJpbnRmICgiJXM6IHNjcmlwdCBjbWQgPSAlMDh4XG4iLCBzeW1fbmFtZShucCksCisJCQlzY3JfdG9fY3B1KChpbnQpICoodTMyICopKHNjcmlwdF9iYXNlICsgc2NyaXB0X29mcykpKTsKKwl9CisKKyAgICAgICAgcHJpbnRmICgiJXM6IHJlZ2R1bXA6Iiwgc3ltX25hbWUobnApKTsKKyAgICAgICAgZm9yIChpPTA7IGk8MjQ7aSsrKQorICAgICAgICAgICAgcHJpbnRmICgiICUwMngiLCAodW5zaWduZWQpSU5CX09GRihucCwgaSkpOworICAgICAgICBwcmludGYgKCIuXG4iKTsKKworCS8qCisJICogIFBDSSBCVVMgZXJyb3IuCisJICovCisJaWYgKGRzdGF0ICYgKE1EUEV8QkYpKQorCQlzeW1fbG9nX2J1c19lcnJvcihucCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3ltX2NoaXAgc3ltX2Rldl90YWJsZVtdID0geworIHtQQ0lfREVWSUNFX0lEX05DUl81M0M4MTAsIDB4MGYsICI4MTAiLCA0LCA4LCA0LCA2NCwKKyBGRV9FUkx9CisgLAorI2lmZGVmIFNZTV9ERUJVR19HRU5FUklDX1NVUFBPUlQKKyB7UENJX0RFVklDRV9JRF9OQ1JfNTNDODEwLCAweGZmLCAiODEwYSIsIDQsICA4LCA0LCAxLAorIEZFX0JPRn0KKyAsCisjZWxzZQorIHtQQ0lfREVWSUNFX0lEX05DUl81M0M4MTAsIDB4ZmYsICI4MTBhIiwgNCwgIDgsIDQsIDEsCisgRkVfQ0FDSEVfU0VUfEZFX0xEU1RSfEZFX1BGRU58RkVfQk9GfQorICwKKyNlbmRpZgorIHtQQ0lfREVWSUNFX0lEX05DUl81M0M4MTUsIDB4ZmYsICI4MTUiLCA0LCAgOCwgNCwgNjQsCisgRkVfQk9GfEZFX0VSTH0KKyAsCisge1BDSV9ERVZJQ0VfSURfTkNSXzUzQzgyNSwgMHgwZiwgIjgyNSIsIDYsICA4LCA0LCA2NCwKKyBGRV9XSURFfEZFX0JPRnxGRV9FUkx8RkVfRElGRn0KKyAsCisge1BDSV9ERVZJQ0VfSURfTkNSXzUzQzgyNSwgMHhmZiwgIjgyNWEiLCA2LCAgOCwgNCwgMiwKKyBGRV9XSURFfEZFX0NBQ0hFMF9TRVR8RkVfQk9GfEZFX0RGU3xGRV9MRFNUUnxGRV9QRkVOfEZFX1JBTXxGRV9ESUZGfQorICwKKyB7UENJX0RFVklDRV9JRF9OQ1JfNTNDODYwLCAweGZmLCAiODYwIiwgNCwgIDgsIDUsIDEsCisgRkVfVUxUUkF8RkVfQ0FDSEVfU0VUfEZFX0JPRnxGRV9MRFNUUnxGRV9QRkVOfQorICwKKyB7UENJX0RFVklDRV9JRF9OQ1JfNTNDODc1LCAweDAxLCAiODc1IiwgNiwgMTYsIDUsIDIsCisgRkVfV0lERXxGRV9VTFRSQXxGRV9DQUNIRTBfU0VUfEZFX0JPRnxGRV9ERlN8RkVfTERTVFJ8RkVfUEZFTnwKKyBGRV9SQU18RkVfRElGRnxGRV9WQVJDTEt9CisgLAorIHtQQ0lfREVWSUNFX0lEX05DUl81M0M4NzUsIDB4ZmYsICI4NzUiLCA2LCAxNiwgNSwgMiwKKyBGRV9XSURFfEZFX1VMVFJBfEZFX0RCTFJ8RkVfQ0FDSEUwX1NFVHxGRV9CT0Z8RkVfREZTfEZFX0xEU1RSfEZFX1BGRU58CisgRkVfUkFNfEZFX0RJRkZ8RkVfVkFSQ0xLfQorICwKKyB7UENJX0RFVklDRV9JRF9OQ1JfNTNDODc1SiwgMHhmZiwgIjg3NUoiLCA2LCAxNiwgNSwgMiwKKyBGRV9XSURFfEZFX1VMVFJBfEZFX0RCTFJ8RkVfQ0FDSEUwX1NFVHxGRV9CT0Z8RkVfREZTfEZFX0xEU1RSfEZFX1BGRU58CisgRkVfUkFNfEZFX0RJRkZ8RkVfVkFSQ0xLfQorICwKKyB7UENJX0RFVklDRV9JRF9OQ1JfNTNDODg1LCAweGZmLCAiODg1IiwgNiwgMTYsIDUsIDIsCisgRkVfV0lERXxGRV9VTFRSQXxGRV9EQkxSfEZFX0NBQ0hFMF9TRVR8RkVfQk9GfEZFX0RGU3xGRV9MRFNUUnxGRV9QRkVOfAorIEZFX1JBTXxGRV9ESUZGfEZFX1ZBUkNMS30KKyAsCisjaWZkZWYgU1lNX0RFQlVHX0dFTkVSSUNfU1VQUE9SVAorIHtQQ0lfREVWSUNFX0lEX05DUl81M0M4OTUsIDB4ZmYsICI4OTUiLCA2LCAzMSwgNywgMiwKKyBGRV9XSURFfEZFX1VMVFJBMnxGRV9RVUFEfEZFX0NBQ0hFX1NFVHxGRV9CT0Z8RkVfREZTfAorIEZFX1JBTXxGRV9MQ0tGUlF9CisgLAorI2Vsc2UKKyB7UENJX0RFVklDRV9JRF9OQ1JfNTNDODk1LCAweGZmLCAiODk1IiwgNiwgMzEsIDcsIDIsCisgRkVfV0lERXxGRV9VTFRSQTJ8RkVfUVVBRHxGRV9DQUNIRV9TRVR8RkVfQk9GfEZFX0RGU3xGRV9MRFNUUnxGRV9QRkVOfAorIEZFX1JBTXxGRV9MQ0tGUlF9CisgLAorI2VuZGlmCisge1BDSV9ERVZJQ0VfSURfTkNSXzUzQzg5NiwgMHhmZiwgIjg5NiIsIDYsIDMxLCA3LCA0LAorIEZFX1dJREV8RkVfVUxUUkEyfEZFX1FVQUR8RkVfQ0FDSEVfU0VUfEZFX0JPRnxGRV9ERlN8RkVfTERTVFJ8RkVfUEZFTnwKKyBGRV9SQU18RkVfUkFNOEt8RkVfNjRCSVR8RkVfREFDfEZFX0lPMjU2fEZFX05PUE18RkVfTEVEQ3xGRV9MQ0tGUlF9CisgLAorIHtQQ0lfREVWSUNFX0lEX0xTSV81M0M4OTVBLCAweGZmLCAiODk1YSIsIDYsIDMxLCA3LCA0LAorIEZFX1dJREV8RkVfVUxUUkEyfEZFX1FVQUR8RkVfQ0FDSEVfU0VUfEZFX0JPRnxGRV9ERlN8RkVfTERTVFJ8RkVfUEZFTnwKKyBGRV9SQU18RkVfUkFNOEt8RkVfREFDfEZFX0lPMjU2fEZFX05PUE18RkVfTEVEQ3xGRV9MQ0tGUlF9CisgLAorIHtQQ0lfREVWSUNFX0lEX0xTSV81M0M4NzVBLCAweGZmLCAiODc1YSIsIDYsIDMxLCA3LCA0LAorIEZFX1dJREV8RkVfVUxUUkF8RkVfUVVBRHxGRV9DQUNIRV9TRVR8RkVfQk9GfEZFX0RGU3xGRV9MRFNUUnxGRV9QRkVOfAorIEZFX1JBTXxGRV9EQUN8RkVfSU8yNTZ8RkVfTk9QTXxGRV9MRURDfEZFX0xDS0ZSUX0KKyAsCisge1BDSV9ERVZJQ0VfSURfTFNJXzUzQzEwMTBfMzMsIDB4MDAsICIxMDEwLTMzIiwgNiwgMzEsIDcsIDgsCisgRkVfV0lERXxGRV9VTFRSQTN8RkVfUVVBRHxGRV9DQUNIRV9TRVR8RkVfQk9GfEZFX0RGQkN8RkVfTERTVFJ8RkVfUEZFTnwKKyBGRV9SQU18RkVfUkFNOEt8RkVfNjRCSVR8RkVfREFDfEZFX0lPMjU2fEZFX05PUE18RkVfTEVEQ3xGRV9DUkN8CisgRkVfQzEwfQorICwKKyB7UENJX0RFVklDRV9JRF9MU0lfNTNDMTAxMF8zMywgMHhmZiwgIjEwMTAtMzMiLCA2LCAzMSwgNywgOCwKKyBGRV9XSURFfEZFX1VMVFJBM3xGRV9RVUFEfEZFX0NBQ0hFX1NFVHxGRV9CT0Z8RkVfREZCQ3xGRV9MRFNUUnxGRV9QRkVOfAorIEZFX1JBTXxGRV9SQU04S3xGRV82NEJJVHxGRV9EQUN8RkVfSU8yNTZ8RkVfTk9QTXxGRV9MRURDfEZFX0NSQ3wKKyBGRV9DMTB8RkVfVTNFTn0KKyAsCisge1BDSV9ERVZJQ0VfSURfTFNJXzUzQzEwMTBfNjYsIDB4ZmYsICIxMDEwLTY2IiwgNiwgMzEsIDcsIDgsCisgRkVfV0lERXxGRV9VTFRSQTN8RkVfUVVBRHxGRV9DQUNIRV9TRVR8RkVfQk9GfEZFX0RGQkN8RkVfTERTVFJ8RkVfUEZFTnwKKyBGRV9SQU18RkVfUkFNOEt8RkVfNjRCSVR8RkVfREFDfEZFX0lPMjU2fEZFX05PUE18RkVfTEVEQ3xGRV82Nk1IWnxGRV9DUkN8CisgRkVfQzEwfEZFX1UzRU59CisgLAorIHtQQ0lfREVWSUNFX0lEX0xTSV81M0MxNTEwLCAweGZmLCAiMTUxMGQiLCA2LCAzMSwgNywgNCwKKyBGRV9XSURFfEZFX1VMVFJBMnxGRV9RVUFEfEZFX0NBQ0hFX1NFVHxGRV9CT0Z8RkVfREZTfEZFX0xEU1RSfEZFX1BGRU58CisgRkVfUkFNfEZFX0lPMjU2fEZFX0xFREN9Cit9OworCisjZGVmaW5lIHN5bV9udW1fZGV2cyBcCisJKHNpemVvZihzeW1fZGV2X3RhYmxlKSAvIHNpemVvZihzeW1fZGV2X3RhYmxlWzBdKSkKKworLyoKKyAqICBMb29rIHVwIHRoZSBjaGlwIHRhYmxlLgorICoKKyAqICBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjaGlwIGVudHJ5IGlmIGZvdW5kLCAKKyAqICB6ZXJvIG90aGVyd2lzZS4KKyAqLworc3RydWN0IHN5bV9jaGlwICoKK3N5bV9sb29rdXBfY2hpcF90YWJsZSAodV9zaG9ydCBkZXZpY2VfaWQsIHVfY2hhciByZXZpc2lvbikKK3sKKwlzdHJ1Y3QJc3ltX2NoaXAgKmNoaXA7CisJaW50CWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3ltX251bV9kZXZzOyBpKyspIHsKKwkJY2hpcCA9ICZzeW1fZGV2X3RhYmxlW2ldOworCQlpZiAoZGV2aWNlX2lkICE9IGNoaXAtPmRldmljZV9pZCkKKwkJCWNvbnRpbnVlOworCQlpZiAocmV2aXNpb24gPiBjaGlwLT5yZXZpc2lvbl9pZCkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gY2hpcDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworI2lmIFNZTV9DT05GX0RNQV9BRERSRVNTSU5HX01PREUgPT0gMgorLyoKKyAqICBMb29rdXAgdGhlIDY0IGJpdCBETUEgc2VnbWVudHMgbWFwLgorICogIFRoaXMgaXMgb25seSB1c2VkIGlmIHRoZSBkaXJlY3QgbWFwcGluZyAKKyAqICBoYXMgYmVlbiB1bnN1Y2Nlc3NmdWwuCisgKi8KK2ludCBzeW1fbG9va3VwX2RtYXAoc3RydWN0IHN5bV9oY2IgKm5wLCB1MzIgaCwgaW50IHMpCit7CisJaW50IGk7CisKKwlpZiAoIW5wLT51c2VfZGFjKQorCQlnb3RvIHdlaXJkOworCisJLyogTG9vayB1cCBleGlzdGluZyBtYXBwaW5ncyAqLworCWZvciAoaSA9IFNZTV9ETUFQX1NJWkUtMTsgaSA+IDA7IGktLSkgeworCQlpZiAoaCA9PSBucC0+ZG1hcF9iYWhbaV0pCisJCQlyZXR1cm4gaTsKKwl9CisJLyogSWYgZGlyZWN0IG1hcHBpbmcgaXMgZnJlZSwgZ2V0IGl0ICovCisJaWYgKCFucC0+ZG1hcF9iYWhbc10pCisJCWdvdG8gbmV3OworCS8qIENvbGxpc2lvbiAtPiBsb29rdXAgZnJlZSBtYXBwaW5ncyAqLworCWZvciAocyA9IFNZTV9ETUFQX1NJWkUtMTsgcyA+IDA7IHMtLSkgeworCQlpZiAoIW5wLT5kbWFwX2JhaFtzXSkKKwkJCWdvdG8gbmV3OworCX0KK3dlaXJkOgorCXBhbmljKCJzeW06IHJhbiBvdXQgb2YgNjQgYml0IERNQSBzZWdtZW50IHJlZ2lzdGVycyIpOworCXJldHVybiAtMTsKK25ldzoKKwlucC0+ZG1hcF9iYWhbc10gPSBoOworCW5wLT5kbWFwX2RpcnR5ID0gMTsKKwlyZXR1cm4gczsKK30KKworLyoKKyAqICBVcGRhdGUgSU8gcmVnaXN0ZXJzIHNjcmF0Y2ggQy4uUiBzbyB0aGV5IHdpbGwgYmUgCisgKiAgaW4gc3luYy4gd2l0aCBxdWV1ZWQgQ0NCIGV4cGVjdGF0aW9ucy4KKyAqLworc3RhdGljIHZvaWQgc3ltX3VwZGF0ZV9kbWFwX3JlZ3Moc3RydWN0IHN5bV9oY2IgKm5wKQoreworCWludCBvLCBpOworCisJaWYgKCFucC0+ZG1hcF9kaXJ0eSkKKwkJcmV0dXJuOworCW8gPSBvZmZzZXRvZihzdHJ1Y3Qgc3ltX3JlZywgbmNfc2NyeFswXSk7CisJZm9yIChpID0gMDsgaSA8IFNZTV9ETUFQX1NJWkU7IGkrKykgeworCQlPVVRMX09GRihucCwgbywgbnAtPmRtYXBfYmFoW2ldKTsKKwkJbyArPSA0OworCX0KKwlucC0+ZG1hcF9kaXJ0eSA9IDA7Cit9CisjZW5kaWYKKworLyogRW5mb3JjZSBhbGwgdGhlIGZpZGRseSBTUEkgcnVsZXMgYW5kIHRoZSBjaGlwIGxpbWl0YXRpb25zICovCitzdGF0aWMgdm9pZCBzeW1fY2hlY2tfZ29hbHMoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsCisJCXN0cnVjdCBzeW1fdHJhbnMgKmdvYWwpCit7CisJaWYgKCFzcGlfc3VwcG9ydF93aWRlKHN0YXJnZXQpKQorCQlnb2FsLT53aWR0aCA9IDA7CisKKwlpZiAoIXNwaV9zdXBwb3J0X3N5bmMoc3RhcmdldCkpIHsKKwkJZ29hbC0+aXUgPSAwOworCQlnb2FsLT5kdCA9IDA7CisJCWdvYWwtPnFhcyA9IDA7CisJCWdvYWwtPnBlcmlvZCA9IDA7CisJCWdvYWwtPm9mZnNldCA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3BpX3N1cHBvcnRfZHQoc3RhcmdldCkpIHsKKwkJaWYgKHNwaV9zdXBwb3J0X2R0X29ubHkoc3RhcmdldCkpCisJCQlnb2FsLT5kdCA9IDE7CisKKwkJaWYgKGdvYWwtPm9mZnNldCA9PSAwKQorCQkJZ29hbC0+ZHQgPSAwOworCX0gZWxzZSB7CisJCWdvYWwtPmR0ID0gMDsKKwl9CisKKwkvKiBTb21lIHRhcmdldHMgZmFpbCB0byBwcm9wZXJseSBuZWdvdGlhdGUgRFQgaW4gU0UgbW9kZSAqLworCWlmICgobnAtPnNjc2lfbW9kZSAhPSBTTU9ERV9MVkQpIHx8ICEobnAtPmZlYXR1cmVzICYgRkVfVTNFTikpCisJCWdvYWwtPmR0ID0gMDsKKworCWlmIChnb2FsLT5kdCkgeworCQkvKiBhbGwgRFQgdHJhbnNmZXJzIG11c3QgYmUgd2lkZSAqLworCQlnb2FsLT53aWR0aCA9IDE7CisJCWlmIChnb2FsLT5vZmZzZXQgPiBucC0+bWF4b2Zmc19kdCkKKwkJCWdvYWwtPm9mZnNldCA9IG5wLT5tYXhvZmZzX2R0OworCQlpZiAoZ29hbC0+cGVyaW9kIDwgbnAtPm1pbnN5bmNfZHQpCisJCQlnb2FsLT5wZXJpb2QgPSBucC0+bWluc3luY19kdDsKKwkJaWYgKGdvYWwtPnBlcmlvZCA+IG5wLT5tYXhzeW5jX2R0KQorCQkJZ29hbC0+cGVyaW9kID0gbnAtPm1heHN5bmNfZHQ7CisJfSBlbHNlIHsKKwkJZ29hbC0+aXUgPSBnb2FsLT5xYXMgPSAwOworCQlpZiAoZ29hbC0+b2Zmc2V0ID4gbnAtPm1heG9mZnMpCisJCQlnb2FsLT5vZmZzZXQgPSBucC0+bWF4b2ZmczsKKwkJaWYgKGdvYWwtPnBlcmlvZCA8IG5wLT5taW5zeW5jKQorCQkJZ29hbC0+cGVyaW9kID0gbnAtPm1pbnN5bmM7CisJCWlmIChnb2FsLT5wZXJpb2QgPiBucC0+bWF4c3luYykKKwkJCWdvYWwtPnBlcmlvZCA9IG5wLT5tYXhzeW5jOworCX0KK30KKworLyoKKyAqICBQcmVwYXJlIHRoZSBuZXh0IG5lZ290aWF0aW9uIG1lc3NhZ2UgaWYgbmVlZGVkLgorICoKKyAqICBGaWxsIGluIHRoZSBwYXJ0IG9mIG1lc3NhZ2UgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIAorICogIG5lZ290aWF0aW9uIGFuZCB0aGUgbmVnb19zdGF0dXMgZmllbGQgb2YgdGhlIENDQi4KKyAqICBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlIGluIGJ5dGVzLgorICovCitzdGF0aWMgaW50IHN5bV9wcmVwYXJlX25lZ28oc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX2NjYiAqY3AsIHVfY2hhciAqbXNncHRyKQoreworCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W2NwLT50YXJnZXRdOworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRwLT5zZGV2LT5zZGV2X3RhcmdldDsKKwlzdHJ1Y3Qgc3ltX3RyYW5zICpnb2FsID0gJnRwLT50Z29hbDsKKwlpbnQgbXNnbGVuID0gMDsKKwlpbnQgbmVnbzsKKworCXN5bV9jaGVja19nb2FscyhucCwgc3RhcmdldCwgZ29hbCk7CisKKwkvKgorCSAqIE1hbnkgZGV2aWNlcyBpbXBsZW1lbnQgUFBSIGluIGEgYnVnZ3kgd2F5LCBzbyBvbmx5IHVzZSBpdCBpZiB3ZQorCSAqIHJlYWxseSB3YW50IHRvLgorCSAqLworCWlmIChnb2FsLT5pdSB8fCBnb2FsLT5kdCB8fCBnb2FsLT5xYXMgfHwgKGdvYWwtPnBlcmlvZCA8IDB4YSkpIHsKKwkJbmVnbyA9IE5TX1BQUjsKKwl9IGVsc2UgaWYgKHNwaV93aWR0aChzdGFyZ2V0KSAhPSBnb2FsLT53aWR0aCkgeworCQluZWdvID0gTlNfV0lERTsKKwl9IGVsc2UgaWYgKHNwaV9wZXJpb2Qoc3RhcmdldCkgIT0gZ29hbC0+cGVyaW9kIHx8CisJCSAgIHNwaV9vZmZzZXQoc3RhcmdldCkgIT0gZ29hbC0+b2Zmc2V0KSB7CisJCW5lZ28gPSBOU19TWU5DOworCX0gZWxzZSB7CisJCWdvYWwtPmNoZWNrX25lZ28gPSAwOworCQluZWdvID0gMDsKKwl9CisKKwlzd2l0Y2ggKG5lZ28pIHsKKwljYXNlIE5TX1NZTkM6CisJCW1zZ3B0clttc2dsZW4rK10gPSBNX0VYVEVOREVEOworCQltc2dwdHJbbXNnbGVuKytdID0gMzsKKwkJbXNncHRyW21zZ2xlbisrXSA9IE1fWF9TWU5DX1JFUTsKKwkJbXNncHRyW21zZ2xlbisrXSA9IGdvYWwtPnBlcmlvZDsKKwkJbXNncHRyW21zZ2xlbisrXSA9IGdvYWwtPm9mZnNldDsKKwkJYnJlYWs7CisJY2FzZSBOU19XSURFOgorCQltc2dwdHJbbXNnbGVuKytdID0gTV9FWFRFTkRFRDsKKwkJbXNncHRyW21zZ2xlbisrXSA9IDI7CisJCW1zZ3B0clttc2dsZW4rK10gPSBNX1hfV0lERV9SRVE7CisJCW1zZ3B0clttc2dsZW4rK10gPSBnb2FsLT53aWR0aDsKKwkJYnJlYWs7CisJY2FzZSBOU19QUFI6CisJCW1zZ3B0clttc2dsZW4rK10gPSBNX0VYVEVOREVEOworCQltc2dwdHJbbXNnbGVuKytdID0gNjsKKwkJbXNncHRyW21zZ2xlbisrXSA9IE1fWF9QUFJfUkVROworCQltc2dwdHJbbXNnbGVuKytdID0gZ29hbC0+cGVyaW9kOworCQltc2dwdHJbbXNnbGVuKytdID0gMDsKKwkJbXNncHRyW21zZ2xlbisrXSA9IGdvYWwtPm9mZnNldDsKKwkJbXNncHRyW21zZ2xlbisrXSA9IGdvYWwtPndpZHRoOworCQltc2dwdHJbbXNnbGVuKytdID0gKGdvYWwtPml1ID8gUFBSX09QVF9JVSA6IDApIHwKKwkJCQkJKGdvYWwtPmR0ID8gUFBSX09QVF9EVCA6IDApIHwKKwkJCQkJKGdvYWwtPnFhcyA/IFBQUl9PUFRfUUFTIDogMCk7CisJCWJyZWFrOworCX0KKworCWNwLT5uZWdvX3N0YXR1cyA9IG5lZ287CisKKwlpZiAobmVnbykgeworCQl0cC0+bmVnb19jcCA9IGNwOyAvKiBLZWVwIHRyYWNrIGEgbmVnbyB3aWxsIGJlIHBlcmZvcm1lZCAqLworCQlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19ORUdPKSB7CisJCQlzeW1fcHJpbnRfbmVnb19tc2cobnAsIGNwLT50YXJnZXQsIAorCQkJCQkgIG5lZ28gPT0gTlNfU1lOQyA/ICJzeW5jIG1zZ291dCIgOgorCQkJCQkgIG5lZ28gPT0gTlNfV0lERSA/ICJ3aWRlIG1zZ291dCIgOgorCQkJCQkgICJwcHIgbXNnb3V0IiwgbXNncHRyKTsKKwkJfQorCX0KKworCXJldHVybiBtc2dsZW47Cit9CisKKy8qCisgKiAgSW5zZXJ0IGEgam9iIGludG8gdGhlIHN0YXJ0IHF1ZXVlLgorICovCit2b2lkIHN5bV9wdXRfc3RhcnRfcXVldWUoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX2NjYiAqY3ApCit7CisJdV9zaG9ydAlxaWR4OworCisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJLyoKKwkgKiAgSWYgdGhlIHByZXZpb3VzbHkgcXVldWVkIENDQiBpcyBub3QgeWV0IGRvbmUsIAorCSAqICBzZXQgdGhlIElBUkIgaGludC4gVGhlIFNDUklQVFMgd2lsbCBnbyB3aXRoIElBUkIgCisJICogIGZvciB0aGlzIGpvYiB3aGVuIHN0YXJ0aW5nIHRoZSBwcmV2aW91cyBvbmUuCisJICogIFdlIGxlYXZlIGRldmljZXMgYSBjaGFuY2UgdG8gd2luIGFyYml0cmF0aW9uIGJ5IAorCSAqICBub3QgdXNpbmcgbW9yZSB0aGFuICdpYXJiX21heCcgY29uc2VjdXRpdmUgCisJICogIGltbWVkaWF0ZSBhcmJpdHJhdGlvbnMuCisJICovCisJaWYgKG5wLT5sYXN0X2NwICYmIG5wLT5pYXJiX2NvdW50IDwgbnAtPmlhcmJfbWF4KSB7CisJCW5wLT5sYXN0X2NwLT5ob3N0X2ZsYWdzIHw9IEhGX0hJTlRfSUFSQjsKKwkJKytucC0+aWFyYl9jb3VudDsKKwl9CisJZWxzZQorCQlucC0+aWFyYl9jb3VudCA9IDA7CisJbnAtPmxhc3RfY3AgPSBjcDsKKyNlbmRpZgorCisjaWYgICBTWU1fQ09ORl9ETUFfQUREUkVTU0lOR19NT0RFID09IDIKKwkvKgorCSAqICBNYWtlIFNDUklQVFMgYXdhcmUgb2YgdGhlIDY0IGJpdCBETUEgCisJICogIHNlZ21lbnQgcmVnaXN0ZXJzIG5vdCBiZWluZyB1cC10by1kYXRlLgorCSAqLworCWlmIChucC0+ZG1hcF9kaXJ0eSkKKwkJY3AtPmhvc3RfeGZsYWdzIHw9IEhYX0RNQVBfRElSVFk7CisjZW5kaWYKKworCS8qCisJICogIEluc2VydCBmaXJzdCB0aGUgaWRsZSB0YXNrIGFuZCB0aGVuIG91ciBqb2IuCisJICogIFRoZSBNQnMgc2hvdWxkIGVuc3VyZSBwcm9wZXIgb3JkZXJpbmcuCisJICovCisJcWlkeCA9IG5wLT5zcXVldWVwdXQgKyAyOworCWlmIChxaWR4ID49IE1BWF9RVUVVRSoyKSBxaWR4ID0gMDsKKworCW5wLT5zcXVldWUgW3FpZHhdCSAgID0gY3B1X3RvX3NjcihucC0+aWRsZXRhc2tfYmEpOworCU1FTU9SWV9XUklURV9CQVJSSUVSKCk7CisJbnAtPnNxdWV1ZSBbbnAtPnNxdWV1ZXB1dF0gPSBjcHVfdG9fc2NyKGNwLT5jY2JfYmEpOworCisJbnAtPnNxdWV1ZXB1dCA9IHFpZHg7CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19RVUVVRSkKKwkJcHJpbnRmICgiJXM6IHF1ZXVlcG9zPSVkLlxuIiwgc3ltX25hbWUgKG5wKSwgbnAtPnNxdWV1ZXB1dCk7CisKKwkvKgorCSAqICBTY3JpcHQgcHJvY2Vzc29yIG1heSBiZSB3YWl0aW5nIGZvciByZXNlbGVjdC4KKwkgKiAgV2FrZSBpdCB1cC4KKwkgKi8KKwlNRU1PUllfV1JJVEVfQkFSUklFUigpOworCU9VVEIobnAsIG5jX2lzdGF0LCBTSUdQfG5wLT5pc3RhdF9zZW0pOworfQorCisjaWZkZWYgU1lNX09QVF9IQU5ETEVfREVWSUNFX1FVRVVFSU5HCisvKgorICogIFN0YXJ0IG5leHQgcmVhZHktdG8tc3RhcnQgQ0NCcy4KKyAqLwordm9pZCBzeW1fc3RhcnRfbmV4dF9jY2JzKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV9sY2IgKmxwLCBpbnQgbWF4bikKK3sKKwlTWU1fUVVFSEVBRCAqcXA7CisJc3RydWN0IHN5bV9jY2IgKmNwOworCisJLyogCisJICogIFBhcmFub2lhLCBhcyB1c3VhbC4gOi0pCisJICovCisJYXNzZXJ0KCFscC0+c3RhcnRlZF90YWdzIHx8ICFscC0+c3RhcnRlZF9ub190YWcpOworCisJLyoKKwkgKiAgVHJ5IHRvIHN0YXJ0IGFzIG1hbnkgY29tbWFuZHMgYXMgYXNrZWQgYnkgY2FsbGVyLgorCSAqICBQcmV2ZW50IGZyb20gaGF2aW5nIGJvdGggdGFnZ2VkIGFuZCB1bnRhZ2dlZCAKKwkgKiAgY29tbWFuZHMgcXVldWVkIHRvIHRoZSBkZXZpY2UgYXQgdGhlIHNhbWUgdGltZS4KKwkgKi8KKwl3aGlsZSAobWF4bi0tKSB7CisJCXFwID0gc3ltX3JlbXF1ZV9oZWFkKCZscC0+d2FpdGluZ19jY2JxKTsKKwkJaWYgKCFxcCkKKwkJCWJyZWFrOworCQljcCA9IHN5bV9xdWVfZW50cnkocXAsIHN0cnVjdCBzeW1fY2NiLCBsaW5rMl9jY2JxKTsKKwkJaWYgKGNwLT50YWcgIT0gTk9fVEFHKSB7CisJCQlpZiAobHAtPnN0YXJ0ZWRfbm9fdGFnIHx8CisJCQkgICAgbHAtPnN0YXJ0ZWRfdGFncyA+PSBscC0+c3RhcnRlZF9tYXgpIHsKKwkJCQlzeW1faW5zcXVlX2hlYWQocXAsICZscC0+d2FpdGluZ19jY2JxKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWxwLT5pdGxxX3RibFtjcC0+dGFnXSA9IGNwdV90b19zY3IoY3AtPmNjYl9iYSk7CisJCQlscC0+aGVhZC5yZXNlbF9zYSA9CisJCQkJY3B1X3RvX3NjcihTQ1JJUFRBX0JBKG5wLCByZXNlbF90YWcpKTsKKwkJCSsrbHAtPnN0YXJ0ZWRfdGFnczsKKwkJfSBlbHNlIHsKKwkJCWlmIChscC0+c3RhcnRlZF9ub190YWcgfHwgbHAtPnN0YXJ0ZWRfdGFncykgeworCQkJCXN5bV9pbnNxdWVfaGVhZChxcCwgJmxwLT53YWl0aW5nX2NjYnEpOworCQkJCWJyZWFrOworCQkJfQorCQkJbHAtPmhlYWQuaXRsX3Rhc2tfc2EgPSBjcHVfdG9fc2NyKGNwLT5jY2JfYmEpOworCQkJbHAtPmhlYWQucmVzZWxfc2EgPQorCQkJICAgICAgY3B1X3RvX3NjcihTQ1JJUFRBX0JBKG5wLCByZXNlbF9ub190YWcpKTsKKwkJCSsrbHAtPnN0YXJ0ZWRfbm9fdGFnOworCQl9CisJCWNwLT5zdGFydGVkID0gMTsKKwkJc3ltX2luc3F1ZV90YWlsKHFwLCAmbHAtPnN0YXJ0ZWRfY2NicSk7CisJCXN5bV9wdXRfc3RhcnRfcXVldWUobnAsIGNwKTsKKwl9Cit9CisjZW5kaWYgLyogU1lNX09QVF9IQU5ETEVfREVWSUNFX1FVRVVFSU5HICovCisKKy8qCisgKiAgVGhlIGNoaXAgbWF5IGhhdmUgY29tcGxldGVkIGpvYnMuIExvb2sgYXQgdGhlIERPTkUgUVVFVUUuCisgKgorICogIE9uIHBhcGVyLCBtZW1vcnkgcmVhZCBiYXJyaWVycyBtYXkgYmUgbmVlZGVkIGhlcmUgdG8gCisgKiAgcHJldmVudCBvdXQgb2Ygb3JkZXIgTE9BRHMgYnkgdGhlIENQVSBmcm9tIGhhdmluZyAKKyAqICBwcmVmZXRjaGVkIHN0YWxlIGRhdGEgcHJpb3IgdG8gRE1BIGhhdmluZyBvY2N1cnJlZC4KKyAqLworc3RhdGljIGludCBzeW1fd2FrZXVwX2RvbmUgKHN0cnVjdCBzeW1faGNiICpucCkKK3sKKwlzdHJ1Y3Qgc3ltX2NjYiAqY3A7CisJaW50IGksIG47CisJdTMyIGRzYTsKKworCW4gPSAwOworCWkgPSBucC0+ZHF1ZXVlZ2V0OworCisJLyogTUVNT1JZX1JFQURfQkFSUklFUigpOyAqLworCXdoaWxlICgxKSB7CisJCWRzYSA9IHNjcl90b19jcHUobnAtPmRxdWV1ZVtpXSk7CisJCWlmICghZHNhKQorCQkJYnJlYWs7CisJCW5wLT5kcXVldWVbaV0gPSAwOworCQlpZiAoKGkgPSBpKzIpID49IE1BWF9RVUVVRSoyKQorCQkJaSA9IDA7CisKKwkJY3AgPSBzeW1fY2NiX2Zyb21fZHNhKG5wLCBkc2EpOworCQlpZiAoY3ApIHsKKwkJCU1FTU9SWV9SRUFEX0JBUlJJRVIoKTsKKwkJCXN5bV9jb21wbGV0ZV9vayAobnAsIGNwKTsKKwkJCSsrbjsKKwkJfQorCQllbHNlCisJCQlwcmludGYgKCIlczogYmFkIERTQSAoJXgpIGluIGRvbmUgcXVldWUuXG4iLAorCQkJCXN5bV9uYW1lKG5wKSwgKHVfaW50KSBkc2EpOworCX0KKwlucC0+ZHF1ZXVlZ2V0ID0gaTsKKworCXJldHVybiBuOworfQorCisvKgorICogIENvbXBsZXRlIGFsbCBDQ0JzIHF1ZXVlZCB0byB0aGUgQ09NUCBxdWV1ZS4KKyAqCisgKiAgVGhlc2UgQ0NCcyBhcmUgYXNzdW1lZDoKKyAqICAtIE5vdCB0byBiZSByZWZlcmVuY2VkIGVpdGhlciBieSBkZXZpY2VzIG9yIAorICogICAgU0NSSVBUUy1yZWxhdGVkIHF1ZXVlcyBhbmQgZGF0YXMuCisgKiAgLSBUbyBoYXZlIHRvIGJlIGNvbXBsZXRlZCB3aXRoIGFuIGVycm9yIGNvbmRpdGlvbiAKKyAqICAgIG9yIHJlcXVldWVkLgorICoKKyAqICBUaGUgZGV2aWNlIHF1ZXVlIGZyZWV6ZSBjb3VudCBpcyBpbmNyZW1lbnRlZCAKKyAqICBmb3IgZWFjaCBDQ0IgdGhhdCBkb2VzIG5vdCBwcmV2ZW50IHRoaXMuCisgKiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhbGwgQ0NCcyBpbnZvbHZlZCAKKyAqICBpbiBlcnJvciBoYW5kbGluZy9yZWNvdmVyeSBoYXZlIGJlZW4gcmVhcGVkLgorICovCitzdGF0aWMgdm9pZCBzeW1fZmx1c2hfY29tcF9xdWV1ZShzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCBjYW1fc3RhdHVzKQoreworCVNZTV9RVUVIRUFEICpxcDsKKwlzdHJ1Y3Qgc3ltX2NjYiAqY3A7CisKKwl3aGlsZSAoKHFwID0gc3ltX3JlbXF1ZV9oZWFkKCZucC0+Y29tcF9jY2JxKSkgIT0gMCkgeworCQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJCWNwID0gc3ltX3F1ZV9lbnRyeShxcCwgc3RydWN0IHN5bV9jY2IsIGxpbmtfY2NicSk7CisJCXN5bV9pbnNxdWVfdGFpbCgmY3AtPmxpbmtfY2NicSwgJm5wLT5idXN5X2NjYnEpOworCQkvKiBMZWF2ZSBxdWlldCBDQ0JzIHdhaXRpbmcgZm9yIHJlc291cmNlcyAqLworCQlpZiAoY3AtPmhvc3Rfc3RhdHVzID09IEhTX1dBSVQpCisJCQljb250aW51ZTsKKwkJY21kID0gY3AtPmNtZDsKKwkJaWYgKGNhbV9zdGF0dXMpCisJCQlzeW1fc2V0X2NhbV9zdGF0dXMoY21kLCBjYW1fc3RhdHVzKTsKKyNpZmRlZiBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcKKwkJaWYgKHN5bV9nZXRfY2FtX3N0YXR1cyhjbWQpID09IENBTV9SRVFVRVVFX1JFUSkgeworCQkJc3RydWN0IHN5bV90Y2IgKnRwID0gJm5wLT50YXJnZXRbY3AtPnRhcmdldF07CisJCQlzdHJ1Y3Qgc3ltX2xjYiAqbHAgPSBzeW1fbHAodHAsIGNwLT5sdW4pOworCQkJaWYgKGxwKSB7CisJCQkJc3ltX3JlbXF1ZSgmY3AtPmxpbmsyX2NjYnEpOworCQkJCXN5bV9pbnNxdWVfdGFpbCgmY3AtPmxpbmsyX2NjYnEsCisJCQkJICAgICAgICAgICAgICAgICZscC0+d2FpdGluZ19jY2JxKTsKKwkJCQlpZiAoY3AtPnN0YXJ0ZWQpIHsKKwkJCQkJaWYgKGNwLT50YWcgIT0gTk9fVEFHKQorCQkJCQkJLS1scC0+c3RhcnRlZF90YWdzOworCQkJCQllbHNlCisJCQkJCQktLWxwLT5zdGFydGVkX25vX3RhZzsKKwkJCQl9CisJCQl9CisJCQljcC0+c3RhcnRlZCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmCisJCXN5bV9mcmVlX2NjYihucCwgY3ApOworCQlzeW1feHB0X2RvbmUobnAsIGNtZCk7CisJfQorfQorCisvKgorICogIENvbXBsZXRlIGFsbCBhY3RpdmUgQ0NCcyB3aXRoIGVycm9yLgorICogIFVzZWQgb24gQ0hJUC9TQ1NJIFJFU0VULgorICovCitzdGF0aWMgdm9pZCBzeW1fZmx1c2hfYnVzeV9xdWV1ZSAoc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgY2FtX3N0YXR1cykKK3sKKwkvKgorCSAqICBNb3ZlIGFsbCBhY3RpdmUgQ0NCcyB0byB0aGUgQ09NUCBxdWV1ZSAKKwkgKiAgYW5kIGZsdXNoIHRoaXMgcXVldWUuCisJICovCisJc3ltX3F1ZV9zcGxpY2UoJm5wLT5idXN5X2NjYnEsICZucC0+Y29tcF9jY2JxKTsKKwlzeW1fcXVlX2luaXQoJm5wLT5idXN5X2NjYnEpOworCXN5bV9mbHVzaF9jb21wX3F1ZXVlKG5wLCBjYW1fc3RhdHVzKTsKK30KKworLyoKKyAqICBTdGFydCBjaGlwLgorICoKKyAqICAncmVhc29uJyBtZWFuczoKKyAqICAgICAwOiBpbml0aWFsaXNhdGlvbi4KKyAqICAgICAxOiBTQ1NJIEJVUyBSRVNFVCBkZWxpdmVyZWQgb3IgcmVjZWl2ZWQuCisgKiAgICAgMjogU0NTSSBCVVMgTU9ERSBjaGFuZ2VkLgorICovCit2b2lkIHN5bV9zdGFydF91cCAoc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgcmVhc29uKQoreworIAlpbnQJaTsKKwl1MzIJcGh5czsKKworIAkvKgorCSAqICBSZXNldCBjaGlwIGlmIGFza2VkLCBvdGhlcndpc2UganVzdCBjbGVhciBmaWZvcy4KKyAJICovCisJaWYgKHJlYXNvbiA9PSAxKQorCQlzeW1fc29mdF9yZXNldChucCk7CisJZWxzZSB7CisJCU9VVEIobnAsIG5jX3N0ZXN0MywgVEV8Q1NGKTsKKwkJT1VUT05CKG5wLCBuY19jdGVzdDMsIENMRik7CisJfQorIAorCS8qCisJICogIENsZWFyIFN0YXJ0IFF1ZXVlCisJICovCisJcGh5cyA9IG5wLT5zcXVldWVfYmE7CisJZm9yIChpID0gMDsgaSA8IE1BWF9RVUVVRSoyOyBpICs9IDIpIHsKKwkJbnAtPnNxdWV1ZVtpXSAgID0gY3B1X3RvX3NjcihucC0+aWRsZXRhc2tfYmEpOworCQlucC0+c3F1ZXVlW2krMV0gPSBjcHVfdG9fc2NyKHBoeXMgKyAoaSsyKSo0KTsKKwl9CisJbnAtPnNxdWV1ZVtNQVhfUVVFVUUqMi0xXSA9IGNwdV90b19zY3IocGh5cyk7CisKKwkvKgorCSAqICBTdGFydCBhdCBmaXJzdCBlbnRyeS4KKwkgKi8KKwlucC0+c3F1ZXVlcHV0ID0gMDsKKworCS8qCisJICogIENsZWFyIERvbmUgUXVldWUKKwkgKi8KKwlwaHlzID0gbnAtPmRxdWV1ZV9iYTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1FVRVVFKjI7IGkgKz0gMikgeworCQlucC0+ZHF1ZXVlW2ldICAgPSAwOworCQlucC0+ZHF1ZXVlW2krMV0gPSBjcHVfdG9fc2NyKHBoeXMgKyAoaSsyKSo0KTsKKwl9CisJbnAtPmRxdWV1ZVtNQVhfUVVFVUUqMi0xXSA9IGNwdV90b19zY3IocGh5cyk7CisKKwkvKgorCSAqICBTdGFydCBhdCBmaXJzdCBlbnRyeS4KKwkgKi8KKwlucC0+ZHF1ZXVlZ2V0ID0gMDsKKworCS8qCisJICogIEluc3RhbGwgcGF0Y2hlcyBpbiBzY3JpcHRzLgorCSAqICBUaGlzIGFsc28gbGV0IHBvaW50IHRvIGZpcnN0IHBvc2l0aW9uIHRoZSBzdGFydCAKKwkgKiAgYW5kIGRvbmUgcXVldWUgcG9pbnRlcnMgdXNlZCBmcm9tIFNDUklQVFMuCisJICovCisJbnAtPmZ3X3BhdGNoKG5wKTsKKworCS8qCisJICogIFdha2V1cCBhbGwgcGVuZGluZyBqb2JzLgorCSAqLworCXN5bV9mbHVzaF9idXN5X3F1ZXVlKG5wLCBDQU1fU0NTSV9CVVNfUkVTRVQpOworCisJLyoKKwkgKiAgSW5pdCBjaGlwLgorCSAqLworCU9VVEIobnAsIG5jX2lzdGF0LCAgMHgwMCk7CQkJLyogIFJlbW92ZSBSZXNldCwgYWJvcnQgKi8KKwl1ZGVsYXkoMjAwMCk7IC8qIFRoZSA4OTUgbmVlZHMgdGltZSBmb3IgdGhlIGJ1cyBtb2RlIHRvIHNldHRsZSAqLworCisJT1VUQihucCwgbmNfc2NudGwwLCBucC0+cnZfc2NudGwwIHwgMHhjMCk7CisJCQkJCS8qICBmdWxsIGFyYi4sIGVuYSBwYXJpdHksIHBhci0+QVROICAqLworCU9VVEIobnAsIG5jX3NjbnRsMSwgMHgwMCk7CQkvKiAgb2RkIHBhcml0eSwgYW5kIHJlbW92ZSBDUlNUISEgKi8KKworCXN5bV9zZWxlY3RjbG9jayhucCwgbnAtPnJ2X3NjbnRsMyk7CS8qIFNlbGVjdCBTQ1NJIGNsb2NrICovCisKKwlPVVRCKG5wLCBuY19zY2lkICAsIFJSRXxucC0+bXlhZGRyKTsJLyogQWRhcHRlciBTQ1NJIGFkZHJlc3MgKi8KKwlPVVRXKG5wLCBuY19yZXNwaWQsIDF1bDw8bnAtPm15YWRkcik7CS8qIElkIHRvIHJlc3BvbmQgdG8gKi8KKwlPVVRCKG5wLCBuY19pc3RhdCAsIFNJR1AJKTsJCS8qICBTaWduYWwgUHJvY2VzcyAqLworCU9VVEIobnAsIG5jX2Rtb2RlICwgbnAtPnJ2X2Rtb2RlKTsJCS8qIEJ1cnN0IGxlbmd0aCwgZG1hIG1vZGUgKi8KKwlPVVRCKG5wLCBuY19jdGVzdDUsIG5wLT5ydl9jdGVzdDUpOwkvKiBMYXJnZSBmaWZvICsgbGFyZ2UgYnVyc3QgKi8KKworCU9VVEIobnAsIG5jX2RjbnRsICwgTk9DT018bnAtPnJ2X2RjbnRsKTsJLyogUHJvdGVjdCBTRkJSICovCisJT1VUQihucCwgbmNfY3Rlc3QzLCBucC0+cnZfY3Rlc3QzKTsJLyogV3JpdGUgYW5kIGludmFsaWRhdGUgKi8KKwlPVVRCKG5wLCBuY19jdGVzdDQsIG5wLT5ydl9jdGVzdDQpOwkvKiBNYXN0ZXIgcGFyaXR5IGNoZWNraW5nICovCisKKwkvKiBFeHRlbmRlZCBTcmVxL1NhY2sgZmlsdGVyaW5nIG5vdCBzdXBwb3J0ZWQgb24gdGhlIEMxMCAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9DMTApCisJCU9VVEIobnAsIG5jX3N0ZXN0MiwgbnAtPnJ2X3N0ZXN0Mik7CisJZWxzZQorCQlPVVRCKG5wLCBuY19zdGVzdDIsIEVYVHxucC0+cnZfc3Rlc3QyKTsKKworCU9VVEIobnAsIG5jX3N0ZXN0MywgVEUpOwkJCS8qIFRvbGVyQU5UIGVuYWJsZSAqLworCU9VVEIobnAsIG5jX3N0aW1lMCwgMHgwYyk7CQkJLyogSFRIIGRpc2FibGVkICBTVE8gMC4yNSBzZWMgKi8KKworCS8qCisJICogIEZvciBub3csIGRpc2FibGUgQUlQIGdlbmVyYXRpb24gb24gQzEwMTAtNjYuCisJICovCisJaWYgKG5wLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9MU0lfNTNDMTAxMF82NikKKwkJT1VUQihucCwgbmNfYWlwY250bDEsIERJU0FJUCk7CisKKwkvKgorCSAqICBDMTAxMDEgcmV2LiAwIGVycmF0YS4KKwkgKiAgRXJyYW50IFNHRSdzIHdoZW4gaW4gbmFycm93LiBXcml0ZSBiaXRzIDQgJiA1IG9mCisJICogIFNURVNUMSByZWdpc3RlciB0byBkaXNhYmxlIFNHRS4gV2UgcHJvYmFibHkgc2hvdWxkIGRvIAorCSAqICB0aGF0IGZyb20gU0NSSVBUUyBmb3IgZWFjaCBzZWxlY3Rpb24vcmVzZWxlY3Rpb24sIGJ1dCAKKwkgKiAgSSBqdXN0IGRvbid0IHdhbnQuIDopCisJICovCisJaWYgKG5wLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9MU0lfNTNDMTAxMF8zMyAmJgorCSAgICBucC0+cmV2aXNpb25faWQgPCAxKQorCQlPVVRCKG5wLCBuY19zdGVzdDEsIElOQihucCwgbmNfc3Rlc3QxKSB8IDB4MzApOworCisJLyoKKwkgKiAgREVMIDQ0MSAtIDUzQzg3NiBSZXYgNSAtIFBhcnQgTnVtYmVyIDYwOS0wMzkyNzg3LzI3ODggLSBJVEVNIDIuCisJICogIERpc2FibGUgb3ZlcmxhcHBlZCBhcmJpdHJhdGlvbiBmb3Igc29tZSBkdWFsIGZ1bmN0aW9uIGRldmljZXMsIAorCSAqICByZWdhcmRsZXNzIHJldmlzaW9uIGlkIChraW5kIG9mIHBvc3QtY2hpcC1kZXNpZ24gZmVhdHVyZS4gOy0pKQorCSAqLworCWlmIChucC0+ZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfTkNSXzUzQzg3NSkKKwkJT1VUQihucCwgbmNfY3Rlc3QwLCAoMTw8NSkpOworCWVsc2UgaWYgKG5wLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9OQ1JfNTNDODk2KQorCQlucC0+cnZfY2NudGwwIHw9IERQUjsKKworCS8qCisJICogIFdyaXRlIENDTlRMMC9DQ05UTDEgZm9yIGNoaXBzIGNhcGFibGUgb2YgNjQgYml0IGFkZHJlc3NpbmcgCisJICogIGFuZC9vciBoYXJkd2FyZSBwaGFzZSBtaXNtYXRjaCwgc2luY2Ugb25seSBzdWNoIGNoaXBzIAorCSAqICBzZWVtIHRvIHN1cHBvcnQgdGhvc2UgSU8gcmVnaXN0ZXJzLgorCSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiAoRkVfREFDfEZFX05PUE0pKSB7CisJCU9VVEIobnAsIG5jX2NjbnRsMCwgbnAtPnJ2X2NjbnRsMCk7CisJCU9VVEIobnAsIG5jX2NjbnRsMSwgbnAtPnJ2X2NjbnRsMSk7CisJfQorCisjaWYJU1lNX0NPTkZfRE1BX0FERFJFU1NJTkdfTU9ERSA9PSAyCisJLyoKKwkgKiAgU2V0IHVwIHNjcmF0Y2ggQyBhbmQgRFJTIElPIHJlZ2lzdGVycyB0byBtYXAgdGhlIDMyIGJpdCAKKwkgKiAgRE1BIGFkZHJlc3MgcmFuZ2Ugb3VyIGRhdGEgc3RydWN0dXJlcyBhcmUgbG9jYXRlZCBpbi4KKwkgKi8KKwlpZiAobnAtPnVzZV9kYWMpIHsKKwkJbnAtPmRtYXBfYmFoWzBdID0gMDsJLyogPz8/ICovCisJCU9VVEwobnAsIG5jX3NjcnhbMF0sIG5wLT5kbWFwX2JhaFswXSk7CisJCU9VVEwobnAsIG5jX2RycywgbnAtPmRtYXBfYmFoWzBdKTsKKwl9CisjZW5kaWYKKworCS8qCisJICogIElmIHBoYXNlIG1pc21hdGNoIGhhbmRsZWQgYnkgc2NyaXB0cyAoODk1QS84OTYvMTAxMCksCisJICogIHNldCBQTSBqdW1wIGFkZHJlc3Nlcy4KKwkgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfTk9QTSkgeworCQlPVVRMKG5wLCBuY19wbWphZDEsIFNDUklQVEJfQkEobnAsIHBtX2hhbmRsZSkpOworCQlPVVRMKG5wLCBuY19wbWphZDIsIFNDUklQVEJfQkEobnAsIHBtX2hhbmRsZSkpOworCX0KKworCS8qCisJICogICAgRW5hYmxlIEdQSU8wIHBpbiBmb3Igd3JpdGluZyBpZiBMRUQgc3VwcG9ydCBmcm9tIFNDUklQVFMuCisJICogICAgQWxzbyBzZXQgR1BJTzUgYW5kIGNsZWFyIEdQSU82IGlmIGhhcmR3YXJlIExFRCBjb250cm9sLgorCSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9MRUQwKQorCQlPVVRCKG5wLCBuY19ncGNudGwsIElOQihucCwgbmNfZ3BjbnRsKSAmIH4weDAxKTsKKwllbHNlIGlmIChucC0+ZmVhdHVyZXMgJiBGRV9MRURDKQorCQlPVVRCKG5wLCBuY19ncGNudGwsIChJTkIobnAsIG5jX2dwY250bCkgJiB+MHg0MSkgfCAweDIwKTsKKworCS8qCisJICogICAgICBlbmFibGUgaW50cworCSAqLworCU9VVFcobnAsIG5jX3NpZW4gLCBTVE98SFRIfE1BfFNHRXxVREN8UlNUfFBBUik7CisJT1VUQihucCwgbmNfZGllbiAsIE1EUEV8QkZ8U1NJfFNJUnxJSUQpOworCisJLyoKKwkgKiAgRm9yIDg5NS82IGVuYWJsZSBTQk1DIGludGVycnVwdCBhbmQgc2F2ZSBjdXJyZW50IFNDU0kgYnVzIG1vZGUuCisJICogIFRyeSB0byBlYXQgdGhlIHNwdXJpb3VzIFNCTUMgaW50ZXJydXB0IHRoYXQgbWF5IG9jY3VyIHdoZW4gCisJICogIHdlIHJlc2V0IHRoZSBjaGlwIGJ1dCBub3QgdGhlIFNDU0kgQlVTIChhdCBpbml0aWFsaXphdGlvbikuCisJICovCisJaWYgKG5wLT5mZWF0dXJlcyAmIChGRV9VTFRSQTJ8RkVfVUxUUkEzKSkgeworCQlPVVRPTlcobnAsIG5jX3NpZW4sIFNCTUMpOworCQlpZiAocmVhc29uID09IDApIHsKKwkJCW1kZWxheSgxMDApOworCQkJSU5XKG5wLCBuY19zaXN0KTsKKwkJfQorCQlucC0+c2NzaV9tb2RlID0gSU5CKG5wLCBuY19zdGVzdDQpICYgU01PREU7CisJfQorCisJLyoKKwkgKiAgRmlsbCBpbiB0YXJnZXQgc3RydWN0dXJlLgorCSAqICBSZWluaXRpYWxpemUgdXNyc3luYy4KKwkgKiAgUmVpbml0aWFsaXplIHVzcndpZGUuCisJICogIFByZXBhcmUgc3luYyBuZWdvdGlhdGlvbiBhY2NvcmRpbmcgdG8gYWN0dWFsIFNDU0kgYnVzIG1vZGUuCisJICovCisJZm9yIChpPTA7aTxTWU1fQ09ORl9NQVhfVEFSR0VUO2krKykgeworCQlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSAmbnAtPnRhcmdldFtpXTsKKworCQl0cC0+dG9fcmVzZXQgID0gMDsKKwkJdHAtPmhlYWQuc3ZhbCA9IDA7CisJCXRwLT5oZWFkLnd2YWwgPSBucC0+cnZfc2NudGwzOworCQl0cC0+aGVhZC51dmFsID0gMDsKKwl9CisKKwkvKgorCSAqICBEb3dubG9hZCBTQ1NJIFNDUklQVFMgdG8gb24tY2hpcCBSQU0gaWYgcHJlc2VudCwKKwkgKiAgYW5kIHN0YXJ0IHNjcmlwdCBwcm9jZXNzb3IuCisJICogIFdlIGRvIHRoZSBkb3dubG9hZCBwcmVmZXJlbnRseSBmcm9tIHRoZSBDUFUuCisJICogIEZvciBwbGF0Zm9ybXMgdGhhdCBtYXkgbm90IHN1cHBvcnQgUENJIG1lbW9yeSBtYXBwaW5nLAorCSAqICB3ZSB1c2Ugc2ltcGxlIFNDUklQVFMgdGhhdCBwZXJmb3JtcyBNRU1PUlkgTU9WRXMuCisJICovCisJcGh5cyA9IFNDUklQVEFfQkEobnAsIGluaXQpOworCWlmIChucC0+cmFtX2JhKSB7CisJCWlmIChzeW1fdmVyYm9zZSA+PSAyKQorCQkJcHJpbnRmKCIlczogRG93bmxvYWRpbmcgU0NTSSBTQ1JJUFRTLlxuIiwgc3ltX25hbWUobnApKTsKKwkJbWVtY3B5X3RvaW8obnAtPnMucmFtYWRkciwgbnAtPnNjcmlwdGEwLCBucC0+c2NyaXB0YV9zeik7CisJCWlmIChucC0+cmFtX3dzID09IDgxOTIpIHsKKwkJCW1lbWNweV90b2lvKG5wLT5zLnJhbWFkZHIgKyA0MDk2LCBucC0+c2NyaXB0YjAsIG5wLT5zY3JpcHRiX3N6KTsKKwkJCXBoeXMgPSBzY3JfdG9fY3B1KG5wLT5zY3JfcmFtX3NlZyk7CisJCQlPVVRMKG5wLCBuY19tbXdzLCBwaHlzKTsKKwkJCU9VVEwobnAsIG5jX21tcnMsIHBoeXMpOworCQkJT1VUTChucCwgbmNfc2ZzLCAgcGh5cyk7CisJCQlwaHlzID0gU0NSSVBUQl9CQShucCwgc3RhcnQ2NCk7CisJCX0KKwl9CisKKwlucC0+aXN0YXRfc2VtID0gMDsKKworCU9VVEwobnAsIG5jX2RzYSwgbnAtPmhjYl9iYSk7CisJT1VUTF9EU1AobnAsIHBoeXMpOworCisJLyoKKwkgKiAgTm90aWZ5IHRoZSBYUFQgYWJvdXQgdGhlIFJFU0VUIGNvbmRpdGlvbi4KKwkgKi8KKwlpZiAocmVhc29uICE9IDApCisJCXN5bV94cHRfYXN5bmNfYnVzX3Jlc2V0KG5wKTsKK30KKworLyoKKyAqICBTd2l0Y2ggdHJhbnMgbW9kZSBmb3IgY3VycmVudCBqb2IgYW5kIGl0cyB0YXJnZXQuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9zZXR0cmFucyhzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCB0YXJnZXQsIHVfY2hhciBvcHRzLCB1X2NoYXIgb2ZzLAorCQkJIHVfY2hhciBwZXIsIHVfY2hhciB3aWRlLCB1X2NoYXIgZGl2LCB1X2NoYXIgZmFrKQoreworCVNZTV9RVUVIRUFEICpxcDsKKwl1X2NoYXIgc3ZhbCwgd3ZhbCwgdXZhbDsKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSAmbnAtPnRhcmdldFt0YXJnZXRdOworCisJYXNzZXJ0KHRhcmdldCA9PSAoSU5CKG5wLCBuY19zZGlkKSAmIDB4MGYpKTsKKworCXN2YWwgPSB0cC0+aGVhZC5zdmFsOworCXd2YWwgPSB0cC0+aGVhZC53dmFsOworCXV2YWwgPSB0cC0+aGVhZC51dmFsOworCisjaWYgMAorCXByaW50ZigiWFhYWCBzdmFsPSV4IHd2YWw9JXggdXZhbD0leCAoJXgpXG4iLCAKKwkJc3ZhbCwgd3ZhbCwgdXZhbCwgbnAtPnJ2X3NjbnRsMyk7CisjZW5kaWYKKwkvKgorCSAqICBTZXQgdGhlIG9mZnNldC4KKwkgKi8KKwlpZiAoIShucC0+ZmVhdHVyZXMgJiBGRV9DMTApKQorCQlzdmFsID0gKHN2YWwgJiB+MHgxZikgfCBvZnM7CisJZWxzZQorCQlzdmFsID0gKHN2YWwgJiB+MHgzZikgfCBvZnM7CisKKwkvKgorCSAqICBTZXQgdGhlIHN5bmMgZGl2aXNvciBhbmQgZXh0cmEgY2xvY2sgZmFjdG9yLgorCSAqLworCWlmIChvZnMgIT0gMCkgeworCQl3dmFsID0gKHd2YWwgJiB+MHg3MCkgfCAoKGRpdisxKSA8PCA0KTsKKwkJaWYgKCEobnAtPmZlYXR1cmVzICYgRkVfQzEwKSkKKwkJCXN2YWwgPSAoc3ZhbCAmIH4weGUwKSB8IChmYWsgPDwgNSk7CisJCWVsc2UgeworCQkJdXZhbCA9IHV2YWwgJiB+KFhDTEtIX1NUfFhDTEtIX0RUfFhDTEtTX1NUfFhDTEtTX0RUKTsKKwkJCWlmIChmYWsgPj0gMSkgdXZhbCB8PSAoWENMS0hfU1R8WENMS0hfRFQpOworCQkJaWYgKGZhayA+PSAyKSB1dmFsIHw9IChYQ0xLU19TVHxYQ0xLU19EVCk7CisJCX0KKwl9CisKKwkvKgorCSAqICBTZXQgdGhlIGJ1cyB3aWR0aC4KKwkgKi8KKwl3dmFsID0gd3ZhbCAmIH5FV1M7CisJaWYgKHdpZGUgIT0gMCkKKwkJd3ZhbCB8PSBFV1M7CisKKwkvKgorCSAqICBTZXQgbWlzYy4gdWx0cmEgZW5hYmxlIGJpdHMuCisJICovCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX0MxMCkgeworCQl1dmFsID0gdXZhbCAmIH4oVTNFTnxBSVBDS0VOKTsKKwkJaWYgKG9wdHMpCXsKKwkJCWFzc2VydChucC0+ZmVhdHVyZXMgJiBGRV9VM0VOKTsKKwkJCXV2YWwgfD0gVTNFTjsKKwkJfQorCX0gZWxzZSB7CisJCXd2YWwgPSB3dmFsICYgflVMVFJBOworCQlpZiAocGVyIDw9IDEyKQl3dmFsIHw9IFVMVFJBOworCX0KKworCS8qCisJICogICBTdG9wIHRoZXJlIGlmIHN5bmMgcGFyYW1ldGVycyBhcmUgdW5jaGFuZ2VkLgorCSAqLworCWlmICh0cC0+aGVhZC5zdmFsID09IHN2YWwgJiYgCisJICAgIHRwLT5oZWFkLnd2YWwgPT0gd3ZhbCAmJgorCSAgICB0cC0+aGVhZC51dmFsID09IHV2YWwpCisJCXJldHVybjsKKwl0cC0+aGVhZC5zdmFsID0gc3ZhbDsKKwl0cC0+aGVhZC53dmFsID0gd3ZhbDsKKwl0cC0+aGVhZC51dmFsID0gdXZhbDsKKworCS8qCisJICogIERpc2FibGUgZXh0ZW5kZWQgU3JlcS9TYWNrIGZpbHRlcmluZyBpZiBwZXIgPCA1MC4KKwkgKiAgTm90IHN1cHBvcnRlZCBvbiB0aGUgQzEwMTAuCisJICovCisJaWYgKHBlciA8IDUwICYmICEobnAtPmZlYXR1cmVzICYgRkVfQzEwKSkKKwkJT1VUT0ZGQihucCwgbmNfc3Rlc3QyLCBFWFQpOworCisJLyoKKwkgKiAgc2V0IGFjdHVhbCB2YWx1ZSBhbmQgc3luY19zdGF0dXMKKwkgKi8KKwlPVVRCKG5wLCBuY19zeGZlciwgIHRwLT5oZWFkLnN2YWwpOworCU9VVEIobnAsIG5jX3NjbnRsMywgdHAtPmhlYWQud3ZhbCk7CisKKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfQzEwKSB7CisJCU9VVEIobnAsIG5jX3NjbnRsNCwgdHAtPmhlYWQudXZhbCk7CisJfQorCisJLyoKKwkgKiAgcGF0Y2ggQUxMIGJ1c3kgY2NicyBvZiB0aGlzIHRhcmdldC4KKwkgKi8KKwlGT1JfRUFDSF9RVUVVRURfRUxFTUVOVCgmbnAtPmJ1c3lfY2NicSwgcXApIHsKKwkJc3RydWN0IHN5bV9jY2IgKmNwOworCQljcCA9IHN5bV9xdWVfZW50cnkocXAsIHN0cnVjdCBzeW1fY2NiLCBsaW5rX2NjYnEpOworCQlpZiAoY3AtPnRhcmdldCAhPSB0YXJnZXQpCisJCQljb250aW51ZTsKKwkJY3AtPnBoeXMuc2VsZWN0LnNlbF9zY250bDMgPSB0cC0+aGVhZC53dmFsOworCQljcC0+cGh5cy5zZWxlY3Quc2VsX3N4ZmVyICA9IHRwLT5oZWFkLnN2YWw7CisJCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9DMTApIHsKKwkJCWNwLT5waHlzLnNlbGVjdC5zZWxfc2NudGw0ID0gdHAtPmhlYWQudXZhbDsKKwkJfQorCX0KK30KKworLyoKKyAqICBXZSByZWNlaXZlZCBhIFdEVFIuCisgKiAgTGV0IGV2ZXJ5dGhpbmcgYmUgYXdhcmUgb2YgdGhlIGNoYW5nZXMuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9zZXR3aWRlKHN0cnVjdCBzeW1faGNiICpucCwgaW50IHRhcmdldCwgdV9jaGFyIHdpZGUpCit7CisJc3RydWN0IHN5bV90Y2IgKnRwID0gJm5wLT50YXJnZXRbdGFyZ2V0XTsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0cC0+c2Rldi0+c2Rldl90YXJnZXQ7CisKKwlpZiAoc3BpX3dpZHRoKHN0YXJnZXQpID09IHdpZGUpCisJCXJldHVybjsKKworCXN5bV9zZXR0cmFucyhucCwgdGFyZ2V0LCAwLCAwLCAwLCB3aWRlLCAwLCAwKTsKKworCXRwLT50Z29hbC53aWR0aCA9IHdpZGU7CisJc3BpX29mZnNldChzdGFyZ2V0KSA9IDA7CisJc3BpX3BlcmlvZChzdGFyZ2V0KSA9IDA7CisJc3BpX3dpZHRoKHN0YXJnZXQpID0gd2lkZTsKKwlzcGlfaXUoc3RhcmdldCkgPSAwOworCXNwaV9kdChzdGFyZ2V0KSA9IDA7CisJc3BpX3FhcyhzdGFyZ2V0KSA9IDA7CisKKwlpZiAoc3ltX3ZlcmJvc2UgPj0gMykKKwkJc3BpX2Rpc3BsYXlfeGZlcl9hZ3JlZW1lbnQoc3RhcmdldCk7Cit9CisKKy8qCisgKiAgV2UgcmVjZWl2ZWQgYSBTRFRSLgorICogIExldCBldmVyeXRoaW5nIGJlIGF3YXJlIG9mIHRoZSBjaGFuZ2VzLgorICovCitzdGF0aWMgdm9pZAorc3ltX3NldHN5bmMoc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgdGFyZ2V0LAorICAgICAgICAgICAgdV9jaGFyIG9mcywgdV9jaGFyIHBlciwgdV9jaGFyIGRpdiwgdV9jaGFyIGZhaykKK3sKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSAmbnAtPnRhcmdldFt0YXJnZXRdOworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRwLT5zZGV2LT5zZGV2X3RhcmdldDsKKwl1X2NoYXIgd2lkZSA9ICh0cC0+aGVhZC53dmFsICYgRVdTKSA/IEJVU18xNl9CSVQgOiBCVVNfOF9CSVQ7CisKKwlzeW1fc2V0dHJhbnMobnAsIHRhcmdldCwgMCwgb2ZzLCBwZXIsIHdpZGUsIGRpdiwgZmFrKTsKKworCXNwaV9wZXJpb2Qoc3RhcmdldCkgPSBwZXI7CisJc3BpX29mZnNldChzdGFyZ2V0KSA9IG9mczsKKwlzcGlfaXUoc3RhcmdldCkgPSBzcGlfZHQoc3RhcmdldCkgPSBzcGlfcWFzKHN0YXJnZXQpID0gMDsKKworCWlmICghdHAtPnRnb2FsLmR0ICYmICF0cC0+dGdvYWwuaXUgJiYgIXRwLT50Z29hbC5xYXMpIHsKKwkJdHAtPnRnb2FsLnBlcmlvZCA9IHBlcjsKKwkJdHAtPnRnb2FsLm9mZnNldCA9IG9mczsKKwkJdHAtPnRnb2FsLmNoZWNrX25lZ28gPSAwOworCX0KKworCXNwaV9kaXNwbGF5X3hmZXJfYWdyZWVtZW50KHN0YXJnZXQpOworfQorCisvKgorICogIFdlIHJlY2VpdmVkIGEgUFBSLgorICogIExldCBldmVyeXRoaW5nIGJlIGF3YXJlIG9mIHRoZSBjaGFuZ2VzLgorICovCitzdGF0aWMgdm9pZCAKK3N5bV9zZXRwcHJvdChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCB0YXJnZXQsIHVfY2hhciBvcHRzLCB1X2NoYXIgb2ZzLAorICAgICAgICAgICAgIHVfY2hhciBwZXIsIHVfY2hhciB3aWRlLCB1X2NoYXIgZGl2LCB1X2NoYXIgZmFrKQoreworCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W3RhcmdldF07CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gdHAtPnNkZXYtPnNkZXZfdGFyZ2V0OworCisJc3ltX3NldHRyYW5zKG5wLCB0YXJnZXQsIG9wdHMsIG9mcywgcGVyLCB3aWRlLCBkaXYsIGZhayk7CisKKwlzcGlfd2lkdGgoc3RhcmdldCkgPSB0cC0+dGdvYWwud2lkdGggPSB3aWRlOworCXNwaV9wZXJpb2Qoc3RhcmdldCkgPSB0cC0+dGdvYWwucGVyaW9kID0gcGVyOworCXNwaV9vZmZzZXQoc3RhcmdldCkgPSB0cC0+dGdvYWwub2Zmc2V0ID0gb2ZzOworCXNwaV9pdShzdGFyZ2V0KSA9IHRwLT50Z29hbC5pdSA9ICEhKG9wdHMgJiBQUFJfT1BUX0lVKTsKKwlzcGlfZHQoc3RhcmdldCkgPSB0cC0+dGdvYWwuZHQgPSAhIShvcHRzICYgUFBSX09QVF9EVCk7CisJc3BpX3FhcyhzdGFyZ2V0KSA9IHRwLT50Z29hbC5xYXMgPSAhIShvcHRzICYgUFBSX09QVF9RQVMpOworCXRwLT50Z29hbC5jaGVja19uZWdvID0gMDsKKworCXNwaV9kaXNwbGF5X3hmZXJfYWdyZWVtZW50KHN0YXJnZXQpOworfQorCisvKgorICogIGdlbmVyaWMgcmVjb3ZlcnkgZnJvbSBzY3NpIGludGVycnVwdAorICoKKyAqICBUaGUgZG9jIHNheXMgdGhhdCB3aGVuIHRoZSBjaGlwIGdldHMgYW4gU0NTSSBpbnRlcnJ1cHQsCisgKiAgaXQgdHJpZXMgdG8gc3RvcCBpbiBhbiBvcmRlcmx5IGZhc2hpb24sIGJ5IGNvbXBsZXRpbmcgCisgKiAgYW4gaW5zdHJ1Y3Rpb24gZmV0Y2ggdGhhdCBoYWQgc3RhcnRlZCBvciBieSBmbHVzaGluZyAKKyAqICB0aGUgRE1BIGZpZm8gZm9yIGEgd3JpdGUgdG8gbWVtb3J5IHRoYXQgd2FzIGV4ZWN1dGluZy4KKyAqICBTdWNoIGEgZmFzaGlvbiBpcyBub3QgZW5vdWdoIHRvIGtub3cgaWYgdGhlIGluc3RydWN0aW9uIAorICogIHRoYXQgd2FzIGp1c3QgYmVmb3JlIHRoZSBjdXJyZW50IERTUCB2YWx1ZSBoYXMgYmVlbiAKKyAqICBleGVjdXRlZCBvciBub3QuCisgKgorICogIFRoZXJlIGFyZSBzb21lIHNtYWxsIFNDUklQVFMgc2VjdGlvbnMgdGhhdCBkZWFsIHdpdGggCisgKiAgdGhlIHN0YXJ0IHF1ZXVlIGFuZCB0aGUgZG9uZSBxdWV1ZSB0aGF0IG1heSBicmVhayBhbnkgCisgKiAgYXNzb21wdGlvbiBmcm9tIHRoZSBDIGNvZGUgaWYgd2UgYXJlIGludGVycnVwdGVkIAorICogIGluc2lkZSwgc28gd2UgcmVzZXQgaWYgdGhpcyBoYXBwZW5zLiBCdHcsIHNpbmNlIHRoZXNlIAorICogIFNDUklQVFMgc2VjdGlvbnMgYXJlIGV4ZWN1dGVkIHdoaWxlIHRoZSBTQ1JJUFRTIGhhc24ndCAKKyAqICBzdGFydGVkIFNDU0kgb3BlcmF0aW9ucywgaXQgaXMgdmVyeSB1bmxpa2VseSB0byBoYXBwZW4uCisgKgorICogIEFsbCB0aGUgZHJpdmVyIGRhdGEgc3RydWN0dXJlcyBhcmUgc3VwcG9zZWQgdG8gYmUgCisgKiAgYWxsb2NhdGVkIGZyb20gdGhlIHNhbWUgNCBHQiBtZW1vcnkgd2luZG93LCBzbyB0aGVyZSAKKyAqICBpcyBhIDEgdG8gMSByZWxhdGlvbnNoaXAgYmV0d2VlbiBEU0EgYW5kIGRyaXZlciBkYXRhIAorICogIHN0cnVjdHVyZXMuIFNpbmNlIHdlIGFyZSBjYXJlZnVsIDopIHRvIGludmFsaWRhdGUgdGhlIAorICogIERTQSB3aGVuIHdlIGNvbXBsZXRlIGEgY29tbWFuZCBvciB3aGVuIHRoZSBTQ1JJUFRTIAorICogIHB1c2hlcyBhIERTQSBpbnRvIGEgcXVldWUsIHdlIGNhbiB0cnVzdCBpdCB3aGVuIGl0IAorICogIHBvaW50cyB0byBhIENDQi4KKyAqLworc3RhdGljIHZvaWQgc3ltX3JlY292ZXJfc2NzaV9pbnQgKHN0cnVjdCBzeW1faGNiICpucCwgdV9jaGFyIGhzdHMpCit7CisJdTMyCWRzcAk9IElOTChucCwgbmNfZHNwKTsKKwl1MzIJZHNhCT0gSU5MKG5wLCBuY19kc2EpOworCXN0cnVjdCBzeW1fY2NiICpjcAk9IHN5bV9jY2JfZnJvbV9kc2EobnAsIGRzYSk7CisKKwkvKgorCSAqICBJZiB3ZSBoYXZlbid0IGJlZW4gaW50ZXJydXB0ZWQgaW5zaWRlIHRoZSBTQ1JJUFRTIAorCSAqICBjcml0aWNhbCBwYXRoZXMsIHdlIGNhbiBzYWZlbHkgcmVzdGFydCB0aGUgU0NSSVBUUyAKKwkgKiAgYW5kIHRydXN0IHRoZSBEU0EgdmFsdWUgaWYgaXQgbWF0Y2hlcyBhIENDQi4KKwkgKi8KKwlpZiAoKCEoZHNwID4gU0NSSVBUQV9CQShucCwgZ2V0am9iX2JlZ2luKSAmJgorCSAgICAgICBkc3AgPCBTQ1JJUFRBX0JBKG5wLCBnZXRqb2JfZW5kKSArIDEpKSAmJgorCSAgICAoIShkc3AgPiBTQ1JJUFRBX0JBKG5wLCB1bmdldGpvYikgJiYKKwkgICAgICAgZHNwIDwgU0NSSVBUQV9CQShucCwgcmVzZWxlY3QpICsgMSkpICYmCisJICAgICghKGRzcCA+IFNDUklQVEJfQkEobnAsIHNlbF9mb3JfYWJvcnQpICYmCisJICAgICAgIGRzcCA8IFNDUklQVEJfQkEobnAsIHNlbF9mb3JfYWJvcnRfMSkgKyAxKSkgJiYKKwkgICAgKCEoZHNwID4gU0NSSVBUQV9CQShucCwgZG9uZSkgJiYKKwkgICAgICAgZHNwIDwgU0NSSVBUQV9CQShucCwgZG9uZV9lbmQpICsgMSkpKSB7CisJCU9VVEIobnAsIG5jX2N0ZXN0MywgbnAtPnJ2X2N0ZXN0MyB8IENMRik7IC8qIGNsZWFyIGRtYSBmaWZvICAqLworCQlPVVRCKG5wLCBuY19zdGVzdDMsIFRFfENTRik7CQkvKiBjbGVhciBzY3NpIGZpZm8gKi8KKwkJLyoKKwkJICogIElmIHdlIGhhdmUgYSBDQ0IsIGxldCB0aGUgU0NSSVBUUyBjYWxsIHVzIGJhY2sgZm9yIAorCQkgKiAgdGhlIGhhbmRsaW5nIG9mIHRoZSBlcnJvciB3aXRoIFNDUkFUQ0hBIGZpbGxlZCB3aXRoIAorCQkgKiAgU1RBUlRQT1MuIFRoaXMgd2F5LCB3ZSB3aWxsIGJlIGFibGUgdG8gZnJlZXplIHRoZSAKKwkJICogIGRldmljZSBxdWV1ZSBhbmQgcmVxdWV1ZSBhd2FpdGluZyBJT3MuCisJCSAqLworCQlpZiAoY3ApIHsKKwkJCWNwLT5ob3N0X3N0YXR1cyA9IGhzdHM7CisJCQlPVVRMX0RTUChucCwgU0NSSVBUQV9CQShucCwgY29tcGxldGVfZXJyb3IpKTsKKwkJfQorCQkvKgorCQkgKiAgT3RoZXJ3aXNlIGp1c3QgcmVzdGFydCB0aGUgU0NSSVBUUy4KKwkJICovCisJCWVsc2UgeworCQkJT1VUTChucCwgbmNfZHNhLCAweGZmZmZmZik7CisJCQlPVVRMX0RTUChucCwgU0NSSVBUQV9CQShucCwgc3RhcnQpKTsKKwkJfQorCX0KKwllbHNlCisJCWdvdG8gcmVzZXRfYWxsOworCisJcmV0dXJuOworCityZXNldF9hbGw6CisJc3ltX3N0YXJ0X3Jlc2V0KG5wKTsKK30KKworLyoKKyAqICBjaGlwIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBzZWxlY3Rpb24gdGltZW91dAorICovCitzdGF0aWMgdm9pZCBzeW1faW50X3N0byAoc3RydWN0IHN5bV9oY2IgKm5wKQoreworCXUzMiBkc3AJPSBJTkwobnAsIG5jX2RzcCk7CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19USU5ZKSBwcmludGYgKCJUIik7CisKKwlpZiAoZHNwID09IFNDUklQVEFfQkEobnAsIHdmX3NlbF9kb25lKSArIDgpCisJCXN5bV9yZWNvdmVyX3Njc2lfaW50KG5wLCBIU19TRUxfVElNRU9VVCk7CisJZWxzZQorCQlzeW1fc3RhcnRfcmVzZXQobnApOworfQorCisvKgorICogIGNoaXAgZXhjZXB0aW9uIGhhbmRsZXIgZm9yIHVuZXhwZWN0ZWQgZGlzY29ubmVjdAorICovCitzdGF0aWMgdm9pZCBzeW1faW50X3VkYyAoc3RydWN0IHN5bV9oY2IgKm5wKQoreworCXByaW50ZiAoIiVzOiB1bmV4cGVjdGVkIGRpc2Nvbm5lY3RcbiIsIHN5bV9uYW1lKG5wKSk7CisJc3ltX3JlY292ZXJfc2NzaV9pbnQobnAsIEhTX1VORVhQRUNURUQpOworfQorCisvKgorICogIGNoaXAgZXhjZXB0aW9uIGhhbmRsZXIgZm9yIFNDU0kgYnVzIG1vZGUgY2hhbmdlCisgKgorICogIHNwaTItcjEyIDExLjIuMyBzYXlzIGEgdHJhbnNjZWl2ZXIgbW9kZSBjaGFuZ2UgbXVzdCAKKyAqICBnZW5lcmF0ZSBhIHJlc2V0IGV2ZW50IGFuZCBhIGRldmljZSB0aGF0IGRldGVjdHMgYSByZXNldCAKKyAqICBldmVudCBzaGFsbCBpbml0aWF0ZSBhIGhhcmQgcmVzZXQuIEl0IHNheXMgYWxzbyB0aGF0IGEKKyAqICBkZXZpY2UgdGhhdCBkZXRlY3RzIGEgbW9kZSBjaGFuZ2Ugc2hhbGwgc2V0IGRhdGEgdHJhbnNmZXIgCisgKiAgbW9kZSB0byBlaWdodCBiaXQgYXN5bmNocm9ub3VzLCBldGMuLi4KKyAqICBTbywganVzdCByZWluaXRpYWxpemluZyBhbGwgZXhjZXB0IGNoaXAgc2hvdWxkIGJlIGVub3VnaC4KKyAqLworc3RhdGljIHZvaWQgc3ltX2ludF9zYm1jIChzdHJ1Y3Qgc3ltX2hjYiAqbnApCit7CisJdV9jaGFyIHNjc2lfbW9kZSA9IElOQihucCwgbmNfc3Rlc3Q0KSAmIFNNT0RFOworCisJLyoKKwkgKiAgTm90aWZ5IHVzZXIuCisJICovCisJcHJpbnRmKCIlczogU0NTSSBCVVMgbW9kZSBjaGFuZ2UgZnJvbSAlcyB0byAlcy5cbiIsIHN5bV9uYW1lKG5wKSwKKwkJc3ltX3Njc2lfYnVzX21vZGUobnAtPnNjc2lfbW9kZSksIHN5bV9zY3NpX2J1c19tb2RlKHNjc2lfbW9kZSkpOworCisJLyoKKwkgKiAgU2hvdWxkIHN1c3BlbmQgY29tbWFuZCBwcm9jZXNzaW5nIGZvciBhIGZldyBzZWNvbmRzIGFuZCAKKwkgKiAgcmVpbml0aWFsaXplIGFsbCBleGNlcHQgdGhlIGNoaXAuCisJICovCisJc3ltX3N0YXJ0X3VwIChucCwgMik7Cit9CisKKy8qCisgKiAgY2hpcCBleGNlcHRpb24gaGFuZGxlciBmb3IgU0NTSSBwYXJpdHkgZXJyb3IuCisgKgorICogIFdoZW4gdGhlIGNoaXAgZGV0ZWN0cyBhIFNDU0kgcGFyaXR5IGVycm9yIGFuZCBpcyAKKyAqICBjdXJyZW50bHkgZXhlY3V0aW5nIGEgKENIKU1PViBpbnN0cnVjdGlvbiwgaXQgZG9lcyAKKyAqICBub3QgaW50ZXJydXB0IGltbWVkaWF0ZWx5LCBidXQgdHJpZXMgdG8gZmluaXNoIHRoZSAKKyAqICB0cmFuc2ZlciBvZiB0aGUgY3VycmVudCBzY2F0dGVyIGVudHJ5IGJlZm9yZSAKKyAqICBpbnRlcnJ1cHRpbmcuIFRoZSBmb2xsb3dpbmcgc2l0dWF0aW9ucyBtYXkgb2NjdXI6CisgKgorICogIC0gVGhlIGNvbXBsZXRlIHNjYXR0ZXIgZW50cnkgaGFzIGJlZW4gdHJhbnNmZXJyZWQgCisgKiAgICB3aXRob3V0IHRoZSBkZXZpY2UgaGF2aW5nIGNoYW5nZWQgcGhhc2UuCisgKiAgICBUaGUgY2hpcCB3aWxsIHRoZW4gaW50ZXJydXB0IHdpdGggdGhlIERTUCBwb2ludGluZyAKKyAqICAgIHRvIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGZvbGxvd3MgdGhlIE1PVi4KKyAqCisgKiAgLSBBIHBoYXNlIG1pc21hdGNoIG9jY3VycyBiZWZvcmUgdGhlIE1PViBmaW5pc2hlZCAKKyAqICAgIGFuZCBwaGFzZSBlcnJvcnMgYXJlIHRvIGJlIGhhbmRsZWQgYnkgdGhlIEMgY29kZS4KKyAqICAgIFRoZSBjaGlwIHdpbGwgdGhlbiBpbnRlcnJ1cHQgd2l0aCBib3RoIFBBUiBhbmQgTUEgCisgKiAgICBjb25kaXRpb25zIHNldC4KKyAqCisgKiAgLSBBIHBoYXNlIG1pc21hdGNoIG9jY3VycyBiZWZvcmUgdGhlIE1PViBmaW5pc2hlZCBhbmQgCisgKiAgICBwaGFzZSBlcnJvcnMgYXJlIHRvIGJlIGhhbmRsZWQgYnkgU0NSSVBUUy4KKyAqICAgIFRoZSBjaGlwIHdpbGwgbG9hZCB0aGUgRFNQIHdpdGggdGhlIHBoYXNlIG1pc21hdGNoIAorICogICAgSlVNUCBhZGRyZXNzIGFuZCBpbnRlcnJ1cHQgdGhlIGhvc3QgcHJvY2Vzc29yLgorICovCitzdGF0aWMgdm9pZCBzeW1faW50X3BhciAoc3RydWN0IHN5bV9oY2IgKm5wLCB1X3Nob3J0IHNpc3QpCit7CisJdV9jaGFyCWhzdHMJPSBJTkIobnAsIEhTX1BSVCk7CisJdTMyCWRzcAk9IElOTChucCwgbmNfZHNwKTsKKwl1MzIJZGJjCT0gSU5MKG5wLCBuY19kYmMpOworCXUzMglkc2EJPSBJTkwobnAsIG5jX2RzYSk7CisJdV9jaGFyCXNiY2wJPSBJTkIobnAsIG5jX3NiY2wpOworCXVfY2hhcgljbWQJPSBkYmMgPj4gMjQ7CisJaW50IHBoYXNlCT0gY21kICYgNzsKKwlzdHJ1Y3Qgc3ltX2NjYiAqY3AJPSBzeW1fY2NiX2Zyb21fZHNhKG5wLCBkc2EpOworCisJcHJpbnRmKCIlczogU0NTSSBwYXJpdHkgZXJyb3IgZGV0ZWN0ZWQ6IFNDUjE9JWQgREJDPSV4IFNCQ0w9JXhcbiIsCisJCXN5bV9uYW1lKG5wKSwgaHN0cywgZGJjLCBzYmNsKTsKKworCS8qCisJICogIENoZWNrIHRoYXQgdGhlIGNoaXAgaXMgY29ubmVjdGVkIHRvIHRoZSBTQ1NJIEJVUy4KKwkgKi8KKwlpZiAoIShJTkIobnAsIG5jX3NjbnRsMSkgJiBJU0NPTikpIHsKKwkJc3ltX3JlY292ZXJfc2NzaV9pbnQobnAsIEhTX1VORVhQRUNURUQpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiAgSWYgdGhlIG5leHVzIGlzIG5vdCBjbGVhcmx5IGlkZW50aWZpZWQsIHJlc2V0IHRoZSBidXMuCisJICogIFdlIHdpbGwgdHJ5IHRvIGRvIGJldHRlciBsYXRlci4KKwkgKi8KKwlpZiAoIWNwKQorCQlnb3RvIHJlc2V0X2FsbDsKKworCS8qCisJICogIENoZWNrIGluc3RydWN0aW9uIHdhcyBhIE1PViwgZGlyZWN0aW9uIHdhcyBJTlBVVCBhbmQgCisJICogIEFUTiBpcyBhc3NlcnRlZC4KKwkgKi8KKwlpZiAoKGNtZCAmIDB4YzApIHx8ICEocGhhc2UgJiAxKSB8fCAhKHNiY2wgJiAweDgpKQorCQlnb3RvIHJlc2V0X2FsbDsKKworCS8qCisJICogIEtlZXAgdHJhY2sgb2YgdGhlIHBhcml0eSBlcnJvci4KKwkgKi8KKwlPVVRPTkIobnAsIEhGX1BSVCwgSEZfRVhUX0VSUik7CisJY3AtPnhlcnJfc3RhdHVzIHw9IFhFX1BBUklUWV9FUlI7CisKKwkvKgorCSAqICBQcmVwYXJlIHRoZSBtZXNzYWdlIHRvIHNlbmQgdG8gdGhlIGRldmljZS4KKwkgKi8KKwlucC0+bXNnb3V0WzBdID0gKHBoYXNlID09IDcpID8gTV9QQVJJVFkgOiBNX0lEX0VSUk9SOworCisJLyoKKwkgKiAgSWYgdGhlIG9sZCBwaGFzZSB3YXMgREFUQSBJTiBwaGFzZSwgd2UgaGF2ZSB0byBkZWFsIHdpdGgKKwkgKiAgdGhlIDMgc2l0dWF0aW9ucyBkZXNjcmliZWQgYWJvdmUuCisJICogIEZvciBvdGhlciBpbnB1dCBwaGFzZXMgKE1TRyBJTiBhbmQgU1RBVFVTKSwgdGhlIGRldmljZSAKKwkgKiAgbXVzdCByZXNlbmQgdGhlIHdob2xlIHRoaW5nIHRoYXQgZmFpbGVkIHBhcml0eSBjaGVja2luZyAKKwkgKiAgb3Igc2lnbmFsIGVycm9yLiBTbywganVtcGluZyB0byBkaXNwYXRjaGVyIHNob3VsZCBiZSBPSy4KKwkgKi8KKwlpZiAocGhhc2UgPT0gMSB8fCBwaGFzZSA9PSA1KSB7CisJCS8qIFBoYXNlIG1pc21hdGNoIGhhbmRsZWQgYnkgU0NSSVBUUyAqLworCQlpZiAoZHNwID09IFNDUklQVEJfQkEobnAsIHBtX2hhbmRsZSkpCisJCQlPVVRMX0RTUChucCwgZHNwKTsKKwkJLyogUGhhc2UgbWlzbWF0Y2ggaGFuZGxlZCBieSB0aGUgQyBjb2RlICovCisJCWVsc2UgaWYgKHNpc3QgJiBNQSkKKwkJCXN5bV9pbnRfbWEgKG5wKTsKKwkJLyogTm8gcGhhc2UgbWlzbWF0Y2ggb2NjdXJyZWQgKi8KKwkJZWxzZSB7CisJCQlzeW1fc2V0X3NjcmlwdF9kcCAobnAsIGNwLCBkc3ApOworCQkJT1VUTF9EU1AobnAsIFNDUklQVEFfQkEobnAsIGRpc3BhdGNoKSk7CisJCX0KKwl9CisJZWxzZSBpZiAocGhhc2UgPT0gNykJLyogV2UgZGVmaW5pdGVseSBjYW5ub3QgaGFuZGxlIHBhcml0eSBlcnJvcnMgKi8KKyNpZiAxCQkJCS8qIGluIG1lc3NhZ2UtaW4gcGhhc2UgZHVlIHRvIHRoZSByZWxlY3Rpb24gICovCisJCWdvdG8gcmVzZXRfYWxsOyAvKiBwYXRoIGFuZCB2YXJpb3VzIG1lc3NhZ2UgYW50aWNpcGF0aW9ucy4gICAqLworI2Vsc2UKKwkJT1VUTF9EU1AobnAsIFNDUklQVEFfQkEobnAsIGNscmFjaykpOworI2VuZGlmCisJZWxzZQorCQlPVVRMX0RTUChucCwgU0NSSVBUQV9CQShucCwgZGlzcGF0Y2gpKTsKKwlyZXR1cm47CisKK3Jlc2V0X2FsbDoKKwlzeW1fc3RhcnRfcmVzZXQobnApOworCXJldHVybjsKK30KKworLyoKKyAqICBjaGlwIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBwaGFzZSBlcnJvcnMuCisgKgorICogIFdlIGhhdmUgdG8gY29uc3RydWN0IGEgbmV3IHRyYW5zZmVyIGRlc2NyaXB0b3IsCisgKiAgdG8gdHJhbnNmZXIgdGhlIHJlc3Qgb2YgdGhlIGN1cnJlbnQgYmxvY2suCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9pbnRfbWEgKHN0cnVjdCBzeW1faGNiICpucCkKK3sKKwl1MzIJZGJjOworCXUzMglyZXN0OworCXUzMglkc3A7CisJdTMyCWRzYTsKKwl1MzIJbnh0ZHNwOworCXUzMgkqdmRzcDsKKwl1MzIJb2Fkciwgb2xlbjsKKwl1MzIJKnRibHA7CisgICAgICAgIHUzMgluZXdjbWQ7CisJdV9pbnQJZGVsdGE7CisJdV9jaGFyCWNtZDsKKwl1X2NoYXIJaGZsYWdzLCBoZmxhZ3MwOworCXN0cnVjdAlzeW1fcG1jICpwbTsKKwlzdHJ1Y3Qgc3ltX2NjYiAqY3A7CisKKwlkc3AJPSBJTkwobnAsIG5jX2RzcCk7CisJZGJjCT0gSU5MKG5wLCBuY19kYmMpOworCWRzYQk9IElOTChucCwgbmNfZHNhKTsKKworCWNtZAk9IGRiYyA+PiAyNDsKKwlyZXN0CT0gZGJjICYgMHhmZmZmZmY7CisJZGVsdGEJPSAwOworCisJLyoKKwkgKiAgbG9jYXRlIG1hdGNoaW5nIGNwIGlmIGFueS4KKwkgKi8KKwljcCA9IHN5bV9jY2JfZnJvbV9kc2EobnAsIGRzYSk7CisKKwkvKgorCSAqICBEb25ub3QgdGFrZSBpbnRvIGFjY291bnQgZG1hIGZpZm8gYW5kIHZhcmlvdXMgYnVmZmVycyBpbiAKKwkgKiAgSU5QVVQgcGhhc2Ugc2luY2UgdGhlIGNoaXAgZmx1c2hlcyBldmVyeXRoaW5nIGJlZm9yZSAKKwkgKiAgcmFpc2luZyB0aGUgTUEgaW50ZXJydXB0IGZvciBpbnRlcnJ1cHRlZCBJTlBVVCBwaGFzZXMuCisJICogIEZvciBEQVRBIElOIHBoYXNlLCB3ZSB3aWxsIGNoZWNrIGZvciB0aGUgU1dJREUgbGF0ZXIuCisJICovCisJaWYgKChjbWQgJiA3KSAhPSAxICYmIChjbWQgJiA3KSAhPSA1KSB7CisJCXVfY2hhciBzczAsIHNzMjsKKworCQlpZiAobnAtPmZlYXR1cmVzICYgRkVfREZCQykKKwkJCWRlbHRhID0gSU5XKG5wLCBuY19kZmJjKTsKKwkJZWxzZSB7CisJCQl1MzIgZGZpZm87CisKKwkJCS8qCisJCQkgKiBSZWFkIERGSUZPLCBDVEVTVFs0LTZdIHVzaW5nIDEgUENJIGJ1cyBvd25lcnNoaXAuCisJCQkgKi8KKwkJCWRmaWZvID0gSU5MKG5wLCBuY19kZmlmbyk7CisKKwkJCS8qCisJCQkgKiAgQ2FsY3VsYXRlIHJlbWFpbmluZyBieXRlcyBpbiBETUEgZmlmby4KKwkJCSAqICAoQ1RFU1Q1ID0gZGZpZm8gPj4gMTYpCisJCQkgKi8KKwkJCWlmIChkZmlmbyAmIChERlMgPDwgMTYpKQorCQkJCWRlbHRhID0gKCgoKGRmaWZvID4+IDgpICYgMHgzMDApIHwKKwkJCQkgICAgICAgICAgKGRmaWZvICYgMHhmZikpIC0gcmVzdCkgJiAweDNmZjsKKwkJCWVsc2UKKwkJCQlkZWx0YSA9ICgoZGZpZm8gJiAweGZmKSAtIHJlc3QpICYgMHg3ZjsKKwkJfQorCisJCS8qCisJCSAqICBUaGUgZGF0YSBpbiB0aGUgZG1hIGZpZm8gaGFzIG5vdCBiZWVuIHRyYW5zZmVyZWQgdG8KKwkJICogIHRoZSB0YXJnZXQgLT4gYWRkIHRoZSBhbW91bnQgdG8gdGhlIHJlc3QKKwkJICogIGFuZCBjbGVhciB0aGUgZGF0YS4KKwkJICogIENoZWNrIHRoZSBzc3RhdDIgcmVnaXN0ZXIgaW4gY2FzZSBvZiB3aWRlIHRyYW5zZmVyLgorCQkgKi8KKwkJcmVzdCArPSBkZWx0YTsKKwkJc3MwICA9IElOQihucCwgbmNfc3N0YXQwKTsKKwkJaWYgKHNzMCAmIE9MRikgcmVzdCsrOworCQlpZiAoIShucC0+ZmVhdHVyZXMgJiBGRV9DMTApKQorCQkJaWYgKHNzMCAmIE9SRikgcmVzdCsrOworCQlpZiAoY3AgJiYgKGNwLT5waHlzLnNlbGVjdC5zZWxfc2NudGwzICYgRVdTKSkgeworCQkJc3MyID0gSU5CKG5wLCBuY19zc3RhdDIpOworCQkJaWYgKHNzMiAmIE9MRjEpIHJlc3QrKzsKKwkJCWlmICghKG5wLT5mZWF0dXJlcyAmIEZFX0MxMCkpCisJCQkJaWYgKHNzMiAmIE9SRjEpIHJlc3QrKzsKKwkJfQorCisJCS8qCisJCSAqICBDbGVhciBmaWZvcy4KKwkJICovCisJCU9VVEIobnAsIG5jX2N0ZXN0MywgbnAtPnJ2X2N0ZXN0MyB8IENMRik7CS8qIGRtYSBmaWZvICAqLworCQlPVVRCKG5wLCBuY19zdGVzdDMsIFRFfENTRik7CQkvKiBzY3NpIGZpZm8gKi8KKwl9CisKKwkvKgorCSAqICBsb2cgdGhlIGluZm9ybWF0aW9uCisJICovCisJaWYgKERFQlVHX0ZMQUdTICYgKERFQlVHX1RJTll8REVCVUdfUEhBU0UpKQorCQlwcmludGYgKCJQJXgleCBSTD0lZCBEPSVkICIsIGNtZCY3LCBJTkIobnAsIG5jX3NiY2wpJjcsCisJCQkodW5zaWduZWQpIHJlc3QsICh1bnNpZ25lZCkgZGVsdGEpOworCisJLyoKKwkgKiAgdHJ5IHRvIGZpbmQgdGhlIGludGVycnVwdGVkIHNjcmlwdCBjb21tYW5kLAorCSAqICBhbmQgdGhlIGFkZHJlc3MgYXQgd2hpY2ggdG8gY29udGludWUuCisJICovCisJdmRzcAk9IE5VTEw7CisJbnh0ZHNwCT0gMDsKKwlpZgkoZHNwID4gIG5wLT5zY3JpcHRhX2JhICYmCisJCSBkc3AgPD0gbnAtPnNjcmlwdGFfYmEgKyBucC0+c2NyaXB0YV9zeikgeworCQl2ZHNwID0gKHUzMiAqKSgoY2hhciopbnAtPnNjcmlwdGEwICsgKGRzcC1ucC0+c2NyaXB0YV9iYS04KSk7CisJCW54dGRzcCA9IGRzcDsKKwl9CisJZWxzZSBpZgkoZHNwID4gIG5wLT5zY3JpcHRiX2JhICYmCisJCSBkc3AgPD0gbnAtPnNjcmlwdGJfYmEgKyBucC0+c2NyaXB0Yl9zeikgeworCQl2ZHNwID0gKHUzMiAqKSgoY2hhciopbnAtPnNjcmlwdGIwICsgKGRzcC1ucC0+c2NyaXB0Yl9iYS04KSk7CisJCW54dGRzcCA9IGRzcDsKKwl9CisKKwkvKgorCSAqICBsb2cgdGhlIGluZm9ybWF0aW9uCisJICovCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfUEhBU0UpIHsKKwkJcHJpbnRmICgiXG5DUD0lcCBEU1A9JXggTlhUPSV4IFZEU1A9JXAgQ01EPSV4ICIsCisJCQljcCwgKHVuc2lnbmVkKWRzcCwgKHVuc2lnbmVkKW54dGRzcCwgdmRzcCwgY21kKTsKKwl9CisKKwlpZiAoIXZkc3ApIHsKKwkJcHJpbnRmICgiJXM6IGludGVycnVwdGVkIFNDUklQVCBhZGRyZXNzIG5vdCBmb3VuZC5cbiIsIAorCQkJc3ltX25hbWUgKG5wKSk7CisJCWdvdG8gcmVzZXRfYWxsOworCX0KKworCWlmICghY3ApIHsKKwkJcHJpbnRmICgiJXM6IFNDU0kgcGhhc2UgZXJyb3IgZml4dXA6IENDQiBhbHJlYWR5IGRlcXVldWVkLlxuIiwgCisJCQlzeW1fbmFtZSAobnApKTsKKwkJZ290byByZXNldF9hbGw7CisJfQorCisJLyoKKwkgKiAgZ2V0IG9sZCBzdGFydGFkZHJlc3MgYW5kIG9sZCBsZW5ndGguCisJICovCisJb2FkciA9IHNjcl90b19jcHUodmRzcFsxXSk7CisKKwlpZiAoY21kICYgMHgxMCkgewkvKiBUYWJsZSBpbmRpcmVjdCAqLworCQl0YmxwID0gKHUzMiAqKSAoKGNoYXIqKSAmY3AtPnBoeXMgKyBvYWRyKTsKKwkJb2xlbiA9IHNjcl90b19jcHUodGJscFswXSk7CisJCW9hZHIgPSBzY3JfdG9fY3B1KHRibHBbMV0pOworCX0gZWxzZSB7CisJCXRibHAgPSAodTMyICopIDA7CisJCW9sZW4gPSBzY3JfdG9fY3B1KHZkc3BbMF0pICYgMHhmZmZmZmY7CisJfQorCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfUEhBU0UpIHsKKwkJcHJpbnRmICgiT0NNRD0leFxuVEJMUD0lcCBPTEVOPSV4IE9BRFI9JXhcbiIsCisJCQkodW5zaWduZWQpIChzY3JfdG9fY3B1KHZkc3BbMF0pID4+IDI0KSwKKwkJCXRibHAsCisJCQkodW5zaWduZWQpIG9sZW4sCisJCQkodW5zaWduZWQpIG9hZHIpOworCX0KKworCS8qCisJICogIGNoZWNrIGNtZCBhZ2FpbnN0IGFzc3VtZWQgaW50ZXJydXB0ZWQgc2NyaXB0IGNvbW1hbmQuCisJICogIElmIGR0IGRhdGEgcGhhc2UsIHRoZSBNT1ZFIGluc3RydWN0aW9uIGhhc24ndCBiaXQgNCBvZiAKKwkgKiAgdGhlIHBoYXNlLgorCSAqLworCWlmICgoKGNtZCAmIDIpID8gY21kIDogKGNtZCAmIH40KSkgIT0gKHNjcl90b19jcHUodmRzcFswXSkgPj4gMjQpKSB7CisJCXN5bV9wcmludF9hZGRyKGNwLT5jbWQsCisJCQkiaW50ZXJuYWwgZXJyb3I6IGNtZD0lMDJ4ICE9ICUwMng9KHZkc3BbMF0gPj4gMjQpXG4iLAorCQkJY21kLCBzY3JfdG9fY3B1KHZkc3BbMF0pID4+IDI0KTsKKworCQlnb3RvIHJlc2V0X2FsbDsKKwl9CisKKwkvKgorCSAqICBpZiBvbGQgcGhhc2Ugbm90IGRhdGFwaGFzZSwgbGVhdmUgaGVyZS4KKwkgKi8KKwlpZiAoY21kICYgMikgeworCQlzeW1fcHJpbnRfYWRkcihjcC0+Y21kLAorCQkJInBoYXNlIGNoYW5nZSAleC0leCAlZEAlMDh4IHJlc2lkPSVkLlxuIiwKKwkJCWNtZCY3LCBJTkIobnAsIG5jX3NiY2wpJjcsICh1bnNpZ25lZClvbGVuLAorCQkJKHVuc2lnbmVkKW9hZHIsICh1bnNpZ25lZClyZXN0KTsKKwkJZ290byB1bmV4cGVjdGVkX3BoYXNlOworCX0KKworCS8qCisJICogIENob29zZSB0aGUgY29ycmVjdCBQTSBzYXZlIGFyZWEuCisJICoKKwkgKiAgTG9vayBhdCB0aGUgUE1fU0FWRSBTQ1JJUFQgaWYgeW91IHdhbnQgdG8gdW5kZXJzdGFuZCAKKwkgKiAgdGhpcyBzdHVmZi4gVGhlIGVxdWl2YWxlbnQgY29kZSBpcyBpbXBsZW1lbnRlZCBpbiAKKwkgKiAgU0NSSVBUUyBmb3IgdGhlIDg5NUEsIDg5NiBhbmQgMTAxMCB0aGF0IGFyZSBhYmxlIHRvIAorCSAqICBoYW5kbGUgUE0gZnJvbSB0aGUgU0NSSVBUUyBwcm9jZXNzb3IuCisJICovCisJaGZsYWdzMCA9IElOQihucCwgSEZfUFJUKTsKKwloZmxhZ3MgPSBoZmxhZ3MwOworCisJaWYgKGhmbGFncyAmIChIRl9JTl9QTTAgfCBIRl9JTl9QTTEgfCBIRl9EUF9TQVZFRCkpIHsKKwkJaWYgKGhmbGFncyAmIEhGX0lOX1BNMCkKKwkJCW54dGRzcCA9IHNjcl90b19jcHUoY3AtPnBoeXMucG0wLnJldCk7CisJCWVsc2UgaWYJKGhmbGFncyAmIEhGX0lOX1BNMSkKKwkJCW54dGRzcCA9IHNjcl90b19jcHUoY3AtPnBoeXMucG0xLnJldCk7CisKKwkJaWYgKGhmbGFncyAmIEhGX0RQX1NBVkVEKQorCQkJaGZsYWdzIF49IEhGX0FDVF9QTTsKKwl9CisKKwlpZiAoIShoZmxhZ3MgJiBIRl9BQ1RfUE0pKSB7CisJCXBtID0gJmNwLT5waHlzLnBtMDsKKwkJbmV3Y21kID0gU0NSSVBUQV9CQShucCwgcG0wX2RhdGEpOworCX0KKwllbHNlIHsKKwkJcG0gPSAmY3AtPnBoeXMucG0xOworCQluZXdjbWQgPSBTQ1JJUFRBX0JBKG5wLCBwbTFfZGF0YSk7CisJfQorCisJaGZsYWdzICY9IH4oSEZfSU5fUE0wIHwgSEZfSU5fUE0xIHwgSEZfRFBfU0FWRUQpOworCWlmIChoZmxhZ3MgIT0gaGZsYWdzMCkKKwkJT1VUQihucCwgSEZfUFJULCBoZmxhZ3MpOworCisJLyoKKwkgKiAgZmlsbGluIHRoZSBwaGFzZSBtaXNtYXRjaCBjb250ZXh0CisJICovCisJcG0tPnNnLmFkZHIgPSBjcHVfdG9fc2NyKG9hZHIgKyBvbGVuIC0gcmVzdCk7CisJcG0tPnNnLnNpemUgPSBjcHVfdG9fc2NyKHJlc3QpOworCXBtLT5yZXQgICAgID0gY3B1X3RvX3NjcihueHRkc3ApOworCisJLyoKKwkgKiAgSWYgd2UgaGF2ZSBhIFNXSURFLAorCSAqICAtIHByZXBhcmUgdGhlIGFkZHJlc3MgdG8gd3JpdGUgdGhlIFNXSURFIGZyb20gU0NSSVBUUywKKwkgKiAgLSBjb21wdXRlIHRoZSBTQ1JJUFRTIGFkZHJlc3MgdG8gcmVzdGFydCBmcm9tLAorCSAqICAtIG1vdmUgY3VycmVudCBkYXRhIHBvaW50ZXIgY29udGV4dCBieSBvbmUgYnl0ZS4KKwkgKi8KKwlueHRkc3AgPSBTQ1JJUFRBX0JBKG5wLCBkaXNwYXRjaCk7CisJaWYgKChjbWQgJiA3KSA9PSAxICYmIGNwICYmIChjcC0+cGh5cy5zZWxlY3Quc2VsX3NjbnRsMyAmIEVXUykgJiYKKwkgICAgKElOQihucCwgbmNfc2NudGwyKSAmIFdTUikpIHsKKwkJdTMyIHRtcDsKKworCQkvKgorCQkgKiAgU2V0IHVwIHRoZSB0YWJsZSBpbmRpcmVjdCBmb3IgdGhlIE1PVkUKKwkJICogIG9mIHRoZSByZXNpZHVhbCBieXRlIGFuZCBhZGp1c3QgdGhlIGRhdGEgCisJCSAqICBwb2ludGVyIGNvbnRleHQuCisJCSAqLworCQl0bXAgPSBzY3JfdG9fY3B1KHBtLT5zZy5hZGRyKTsKKwkJY3AtPnBoeXMud3Jlc2lkLmFkZHIgPSBjcHVfdG9fc2NyKHRtcCk7CisJCXBtLT5zZy5hZGRyID0gY3B1X3RvX3Njcih0bXAgKyAxKTsKKwkJdG1wID0gc2NyX3RvX2NwdShwbS0+c2cuc2l6ZSk7CisJCWNwLT5waHlzLndyZXNpZC5zaXplID0gY3B1X3RvX3NjcigodG1wJjB4ZmYwMDAwMDApIHwgMSk7CisJCXBtLT5zZy5zaXplID0gY3B1X3RvX3Njcih0bXAgLSAxKTsKKworCQkvKgorCQkgKiAgSWYgb25seSB0aGUgcmVzaWR1YWwgYnl0ZSBpcyB0byBiZSBtb3ZlZCwgCisJCSAqICBubyBQTSBjb250ZXh0IGlzIG5lZWRlZC4KKwkJICovCisJCWlmICgodG1wJjB4ZmZmZmZmKSA9PSAxKQorCQkJbmV3Y21kID0gcG0tPnJldDsKKworCQkvKgorCQkgKiAgUHJlcGFyZSB0aGUgYWRkcmVzcyBvZiBTQ1JJUFRTIHRoYXQgd2lsbCAKKwkJICogIG1vdmUgdGhlIHJlc2lkdWFsIGJ5dGUgdG8gbWVtb3J5LgorCQkgKi8KKwkJbnh0ZHNwID0gU0NSSVBUQl9CQShucCwgd3NyX21hX2hlbHBlcik7CisJfQorCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfUEhBU0UpIHsKKwkJc3ltX3ByaW50X2FkZHIoY3AtPmNtZCwgIlBNICV4ICV4ICV4IC8gJXggJXggJXguXG4iLAorCQkJaGZsYWdzMCwgaGZsYWdzLCBuZXdjbWQsCisJCQkodW5zaWduZWQpc2NyX3RvX2NwdShwbS0+c2cuYWRkciksCisJCQkodW5zaWduZWQpc2NyX3RvX2NwdShwbS0+c2cuc2l6ZSksCisJCQkodW5zaWduZWQpc2NyX3RvX2NwdShwbS0+cmV0KSk7CisJfQorCisJLyoKKwkgKiAgUmVzdGFydCB0aGUgU0NSSVBUUyBwcm9jZXNzb3IuCisJICovCisJc3ltX3NldF9zY3JpcHRfZHAgKG5wLCBjcCwgbmV3Y21kKTsKKwlPVVRMX0RTUChucCwgbnh0ZHNwKTsKKwlyZXR1cm47CisKKwkvKgorCSAqICBVbmV4cGVjdGVkIHBoYXNlIGNoYW5nZXMgdGhhdCBvY2N1cnMgd2hlbiB0aGUgY3VycmVudCBwaGFzZSAKKwkgKiAgaXMgbm90IGEgREFUQSBJTiBvciBEQVRBIE9VVCBwaGFzZSBhcmUgZHVlIHRvIGVycm9yIGNvbmRpdGlvbnMuCisJICogIFN1Y2ggZXZlbnQgbWF5IG9ubHkgaGFwcGVuIHdoZW4gdGhlIFNDUklQVFMgaXMgdXNpbmcgYSAKKwkgKiAgbXVsdGlieXRlIFNDU0kgTU9WRS4KKwkgKgorCSAqICBQaGFzZSBjaGFuZ2UJCVNvbWUgcG9zc2libGUgY2F1c2UKKwkgKgorCSAqICBDT01NQU5EICAtLT4gTVNHIElOCVNDU0kgcGFyaXR5IGVycm9yIGRldGVjdGVkIGJ5IHRhcmdldC4KKwkgKiAgQ09NTUFORCAgLS0+IFNUQVRVUwlCYWQgY29tbWFuZCBvciByZWZ1c2VkIGJ5IHRhcmdldC4KKwkgKiAgTVNHIE9VVCAgLS0+IE1TRyBJTiAgICAgTWVzc2FnZSByZWplY3RlZCBieSB0YXJnZXQuCisJICogIE1TRyBPVVQgIC0tPiBDT01NQU5EICAgIEJvZ3VzIHRhcmdldCB0aGF0IGRpc2NhcmRzIGV4dGVuZGVkCisJICogIAkJCW5lZ290aWF0aW9uIG1lc3NhZ2VzLgorCSAqCisJICogIFRoZSBjb2RlIGJlbG93IGRvZXMgbm90IGNhcmUgb2YgdGhlIG5ldyBwaGFzZSBhbmQgc28gCisJICogIHRydXN0cyB0aGUgdGFyZ2V0LiBXaHkgdG8gYW5ub3kgaXQgPworCSAqICBJZiB0aGUgaW50ZXJydXB0ZWQgcGhhc2UgaXMgQ09NTUFORCBwaGFzZSwgd2UgcmVzdGFydCBhdAorCSAqICBkaXNwYXRjaGVyLgorCSAqICBJZiBhIHRhcmdldCBkb2VzIG5vdCBnZXQgYWxsIHRoZSBtZXNzYWdlcyBhZnRlciBzZWxlY3Rpb24sIAorCSAqICB0aGUgY29kZSBhc3N1bWVzIGJsaW5kbHkgdGhhdCB0aGUgdGFyZ2V0IGRpc2NhcmRzIGV4dGVuZGVkIAorCSAqICBtZXNzYWdlcyBhbmQgY2xlYXJzIHRoZSBuZWdvdGlhdGlvbiBzdGF0dXMuCisJICogIElmIHRoZSB0YXJnZXQgZG9lcyBub3Qgd2FudCBhbGwgb3VyIHJlc3BvbnNlIHRvIG5lZ290aWF0aW9uLAorCSAqICB3ZSBmb3JjZSBhIFNJUl9ORUdPX1BST1RPIGludGVycnVwdCAoaXQgaXMgYSBoYWNrIHRoYXQgYXZvaWRzIAorCSAqICBibG9hdCBmb3Igc3VjaCBhIHNob3VsZF9ub3RfaGFwcGVuIHNpdHVhdGlvbikuCisJICogIEluIGFsbCBvdGhlciBzaXR1YXRpb24sIHdlIHJlc2V0IHRoZSBCVVMuCisJICogIEFyZSB0aGVzZSBhc3N1bXB0aW9ucyByZWFzb25uYWJsZSA/IChXYWl0IGFuZCBzZWUgLi4uKQorCSAqLwordW5leHBlY3RlZF9waGFzZToKKwlkc3AgLT0gODsKKwlueHRkc3AgPSAwOworCisJc3dpdGNoIChjbWQgJiA3KSB7CisJY2FzZSAyOgkvKiBDT01NQU5EIHBoYXNlICovCisJCW54dGRzcCA9IFNDUklQVEFfQkEobnAsIGRpc3BhdGNoKTsKKwkJYnJlYWs7CisjaWYgMAorCWNhc2UgMzoJLyogU1RBVFVTICBwaGFzZSAqLworCQlueHRkc3AgPSBTQ1JJUFRBX0JBKG5wLCBkaXNwYXRjaCk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSA2OgkvKiBNU0cgT1VUIHBoYXNlICovCisJCS8qCisJCSAqICBJZiB0aGUgZGV2aWNlIG1heSB3YW50IHRvIHVzZSB1bnRhZ2dlZCB3aGVuIHdlIHdhbnQgCisJCSAqICB0YWdnZWQsIHdlIHByZXBhcmUgYW4gSURFTlRJRlkgd2l0aG91dCBkaXNjLiBncmFudGVkLCAKKwkJICogIHNpbmNlIHdlIHdpbGwgbm90IGJlIGFibGUgdG8gaGFuZGxlIHJlc2VsZWN0LgorCQkgKiAgT3RoZXJ3aXNlLCB3ZSBqdXN0IGRvbid0IGNhcmUuCisJCSAqLworCQlpZgkoZHNwID09IFNDUklQVEFfQkEobnAsIHNlbmRfaWRlbnQpKSB7CisJCQlpZiAoY3AtPnRhZyAhPSBOT19UQUcgJiYgb2xlbiAtIHJlc3QgPD0gMykgeworCQkJCWNwLT5ob3N0X3N0YXR1cyA9IEhTX0JVU1k7CisJCQkJbnAtPm1zZ291dFswXSA9IElERU5USUZZKDAsIGNwLT5sdW4pOworCQkJCW54dGRzcCA9IFNDUklQVEJfQkEobnAsIGlkZW50X2JyZWFrX2F0bik7CisJCQl9CisJCQllbHNlCisJCQkJbnh0ZHNwID0gU0NSSVBUQl9CQShucCwgaWRlbnRfYnJlYWspOworCQl9CisJCWVsc2UgaWYJKGRzcCA9PSBTQ1JJUFRCX0JBKG5wLCBzZW5kX3dkdHIpIHx8CisJCQkgZHNwID09IFNDUklQVEJfQkEobnAsIHNlbmRfc2R0cikgfHwKKwkJCSBkc3AgPT0gU0NSSVBUQl9CQShucCwgc2VuZF9wcHIpKSB7CisJCQlueHRkc3AgPSBTQ1JJUFRCX0JBKG5wLCBuZWdvX2JhZF9waGFzZSk7CisJCQlpZiAoZHNwID09IFNDUklQVEJfQkEobnAsIHNlbmRfcHByKSkgeworCQkJCXN0cnVjdCBzY3NpX2RldmljZSAqZGV2ID0gY3AtPmNtZC0+ZGV2aWNlOworCQkJCWRldi0+cHByID0gMDsKKwkJCX0KKwkJfQorCQlicmVhazsKKyNpZiAwCisJY2FzZSA3OgkvKiBNU0cgSU4gIHBoYXNlICovCisJCW54dGRzcCA9IFNDUklQVEFfQkEobnAsIGNscmFjayk7CisJCWJyZWFrOworI2VuZGlmCisJfQorCisJaWYgKG54dGRzcCkgeworCQlPVVRMX0RTUChucCwgbnh0ZHNwKTsKKwkJcmV0dXJuOworCX0KKworcmVzZXRfYWxsOgorCXN5bV9zdGFydF9yZXNldChucCk7Cit9CisKKy8qCisgKiAgY2hpcCBpbnRlcnJ1cHQgaGFuZGxlcgorICoKKyAqICBJbiBub3JtYWwgc2l0dWF0aW9ucywgaW50ZXJydXB0IGNvbmRpdGlvbnMgb2NjdXIgb25lIGF0IAorICogIGEgdGltZS4gQnV0IHdoZW4gc29tZXRoaW5nIGJhZCBoYXBwZW5zIG9uIHRoZSBTQ1NJIEJVUywgCisgKiAgdGhlIGNoaXAgbWF5IHJhaXNlIHNldmVyYWwgaW50ZXJydXB0IGZsYWdzIGJlZm9yZSAKKyAqICBzdG9wcGluZyBhbmQgaW50ZXJydXB0aW5nIHRoZSBDUFUuIFRoZSBhZGRpdGlvbm5hbCAKKyAqICBpbnRlcnJ1cHQgZmxhZ3MgYXJlIHN0YWNrZWQgaW4gc29tZSBleHRyYSByZWdpc3RlcnMgCisgKiAgYWZ0ZXIgdGhlIFNJUCBhbmQvb3IgRElQIGZsYWcgaGFzIGJlZW4gcmFpc2VkIGluIHRoZSAKKyAqICBJU1RBVC4gQWZ0ZXIgdGhlIENQVSBoYXMgcmVhZCB0aGUgaW50ZXJydXB0IGNvbmRpdGlvbiAKKyAqICBmbGFnIGZyb20gU0lTVCBvciBEU1RBVCwgdGhlIGNoaXAgdW5zdGFja3MgdGhlIG90aGVyIAorICogIGludGVycnVwdCBmbGFncyBhbmQgc2V0cyB0aGUgY29ycmVzcG9uZGluZyBiaXRzIGluIAorICogIFNJU1Qgb3IgRFNUQVQuIFNpbmNlIHRoZSBjaGlwIHN0YXJ0cyBzdGFja2luZyBvbmNlIHRoZSAKKyAqICBTSVAgb3IgRElQIGZsYWcgaXMgc2V0LCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBvZiB0aW1lIAorICogIHdoZXJlIHRoZSBzdGFja2luZyBkb2VzIG5vdCBvY2N1ci4KKyAqCisgKiAgVHlwaWNhbGx5LCBtdWx0aXBsZSBpbnRlcnJ1cHQgY29uZGl0aW9ucyBtYXkgaGFwcGVuIGluIAorICogIHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uczoKKyAqCisgKiAgLSBTQ1NJIHBhcml0eSBlcnJvciArIFBoYXNlIG1pc21hdGNoICAoUEFSfE1BKQorICogICAgV2hlbiBhbiBwYXJpdHkgZXJyb3IgaXMgZGV0ZWN0ZWQgaW4gaW5wdXQgcGhhc2UgCisgKiAgICBhbmQgdGhlIGRldmljZSBzd2l0Y2hlcyB0byBtc2ctaW4gcGhhc2UgaW5zaWRlIGEgCisgKiAgICBibG9jayBNT1YuCisgKiAgLSBTQ1NJIHBhcml0eSBlcnJvciArIFVuZXhwZWN0ZWQgZGlzY29ubmVjdCAoUEFSfFVEQykKKyAqICAgIFdoZW4gYSBzdHVwaWQgZGV2aWNlIGRvZXMgbm90IHdhbnQgdG8gaGFuZGxlIHRoZSAKKyAqICAgIHJlY292ZXJ5IG9mIGFuIFNDU0kgcGFyaXR5IGVycm9yLgorICogIC0gU29tZSBjb21iaW5hdGlvbnMgb2YgU1RPLCBQQVIsIFVEQywgLi4uCisgKiAgICBXaGVuIHVzaW5nIG5vbiBjb21wbGlhbnQgU0NTSSBzdHVmZiwgd2hlbiB1c2VyIGlzIAorICogICAgZG9pbmcgbm9uIGNvbXBsaWFudCBob3QgdGFtcGVyaW5nIG9uIHRoZSBCVVMsIHdoZW4gCisgKiAgICBzb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5zIHRvIGEgZGV2aWNlLCBldGMgLi4uCisgKgorICogIFRoZSBoZXVyaXN0aWMgc3VnZ2VzdGVkIGJ5IFNZTUJJT1MgdG8gaGFuZGxlIAorICogIG11bHRpcGxlIGludGVycnVwdHMgaXMgdG8gdHJ5IHVuc3RhY2tpbmcgYWxsIAorICogIGludGVycnVwdHMgY29uZGl0aW9ucyBhbmQgdG8gaGFuZGxlIHRoZW0gb24gc29tZSAKKyAqICBwcmlvcml0eSBiYXNlZCBvbiBlcnJvciBzZXZlcml0eS4KKyAqICBUaGlzIHdpbGwgd29yayB3aGVuIHRoZSB1bnN0YWNraW5nIGhhcyBiZWVuIAorICogIHN1Y2Nlc3NmdWwsIGJ1dCB3ZSBjYW5ub3QgYmUgMTAwICUgc3VyZSBvZiB0aGF0LCAKKyAqICBzaW5jZSB0aGUgQ1BVIG1heSBoYXZlIGJlZW4gZmFzdGVyIHRvIHVuc3RhY2sgdGhhbiAKKyAqICB0aGUgY2hpcCBpcyBhYmxlIHRvIHN0YWNrLiBIbW1tIC4uLiBCdXQgaXQgc2VlbXMgdGhhdCAKKyAqICBzdWNoIGEgc2l0dWF0aW9uIGlzIHZlcnkgdW5saWtlbHkgdG8gaGFwcGVuLgorICoKKyAqICBJZiB0aGlzIGhhcHBlbiwgZm9yIGV4YW1wbGUgU1RPIGNhdWdodCBieSB0aGUgQ1BVIAorICogIHRoZW4gVURDIGhhcHBlbm5pbmcgYmVmb3JlIHRoZSBDUFUgaGF2ZSByZXN0YXJ0ZWQgCisgKiAgdGhlIFNDUklQVFMsIHRoZSBkcml2ZXIgbWF5IHdyb25nbHkgY29tcGxldGUgdGhlIAorICogIHNhbWUgY29tbWFuZCBvbiBVREMsIHNpbmNlIHRoZSBTQ1JJUFRTIGRpZG4ndCByZXN0YXJ0IAorICogIGFuZCB0aGUgRFNBIHN0aWxsIHBvaW50cyB0byB0aGUgc2FtZSBjb21tYW5kLgorICogIFdlIGF2b2lkIHRoaXMgc2l0dWF0aW9uIGJ5IHNldHRpbmcgdGhlIERTQSB0byBhbiAKKyAqICBpbnZhbGlkIHZhbHVlIHdoZW4gdGhlIENDQiBpcyBjb21wbGV0ZWQgYW5kIGJlZm9yZSAKKyAqICByZXN0YXJ0aW5nIHRoZSBTQ1JJUFRTLgorICoKKyAqICBBbm90aGVyIGlzc3VlIGlzIHRoYXQgd2UgbmVlZCBzb21lIHNlY3Rpb24gb2Ygb3VyIAorICogIHJlY292ZXJ5IHByb2NlZHVyZXMgdG8gYmUgc29tZWhvdyB1bmludGVycnVwdGlibGUgYnV0IAorICogIHRoZSBTQ1JJUFRTIHByb2Nlc3NvciBkb2VzIG5vdCBwcm92aWRlcyBzdWNoIGEgCisgKiAgZmVhdHVyZS4gRm9yIHRoaXMgcmVhc29uLCB3ZSBoYW5kbGUgcmVjb3ZlcnkgcHJlZmVyZW50bHkgCisgKiAgZnJvbSB0aGUgQyBjb2RlIGFuZCBjaGVjayBhZ2FpbnN0IHNvbWUgU0NSSVBUUyBjcml0aWNhbCAKKyAqICBzZWN0aW9ucyBmcm9tIHRoZSBDIGNvZGUuCisgKgorICogIEhvcGVmdWxseSwgdGhlIGludGVycnVwdCBoYW5kbGluZyBvZiB0aGUgZHJpdmVyIGlzIG5vdyAKKyAqICBhYmxlIHRvIHJlc2lzdCB0byB3ZWlyZCBCVVMgZXJyb3IgY29uZGl0aW9ucywgYnV0IGRvbm5vdCAKKyAqICBhc2sgbWUgZm9yIGFueSBndWFyYW50ZWUgdGhhdCBpdCB3aWxsIG5ldmVyIGZhaWwuIDotKQorICogIFVzZSBhdCB5b3VyIG93biBkZWNpc2lvbiBhbmQgcmlzay4KKyAqLworCit2b2lkIHN5bV9pbnRlcnJ1cHQgKHN0cnVjdCBzeW1faGNiICpucCkKK3sKKwl1X2NoYXIJaXN0YXQsIGlzdGF0YzsKKwl1X2NoYXIJZHN0YXQ7CisJdV9zaG9ydAlzaXN0OworCisJLyoKKwkgKiAgaW50ZXJydXB0IG9uIHRoZSBmbHkgPworCSAqICAoU0NSSVBUUyBtYXkgc3RpbGwgYmUgcnVubmluZykKKwkgKgorCSAqICBBIGBkdW1teSByZWFkJyBpcyBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIAorCSAqICBjbGVhciBvZiB0aGUgSU5URiBmbGFnIHJlYWNoZXMgdGhlIGRldmljZSAKKwkgKiAgYW5kIHRoYXQgcG9zdGVkIHdyaXRlcyBhcmUgZmx1c2hlZCB0byBtZW1vcnkKKwkgKiAgYmVmb3JlIHRoZSBzY2FubmluZyBvZiB0aGUgRE9ORSBxdWV1ZS4KKwkgKiAgTm90ZSB0aGF0IFNDUklQVFMgYWxzbyAoZHVtbXkpIHJlYWQgdG8gbWVtb3J5IAorCSAqICBwcmlvciB0byBkZWxpdmVyIHRoZSBJTlRGIGludGVycnVwdCBjb25kaXRpb24uCisJICovCisJaXN0YXQgPSBJTkIobnAsIG5jX2lzdGF0KTsKKwlpZiAoaXN0YXQgJiBJTlRGKSB7CisJCU9VVEIobnAsIG5jX2lzdGF0LCAoaXN0YXQgJiBTSUdQKSB8IElOVEYgfCBucC0+aXN0YXRfc2VtKTsKKwkJaXN0YXQgPSBJTkIobnAsIG5jX2lzdGF0KTsJCS8qIERVTU1ZIFJFQUQgKi8KKwkJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfVElOWSkgcHJpbnRmICgiRiAiKTsKKwkJc3ltX3dha2V1cF9kb25lKG5wKTsKKwl9CisKKwlpZiAoIShpc3RhdCAmIChTSVB8RElQKSkpCisJCXJldHVybjsKKworI2lmIDAJLyogV2Ugc2hvdWxkIG5ldmVyIGdldCB0aGlzIG9uZSAqLworCWlmIChpc3RhdCAmIENBQlJUKQorCQlPVVRCKG5wLCBuY19pc3RhdCwgQ0FCUlQpOworI2VuZGlmCisKKwkvKgorCSAqICBQQVIgYW5kIE1BIGludGVycnVwdHMgbWF5IG9jY3VyIGF0IHRoZSBzYW1lIHRpbWUsCisJICogIGFuZCB3ZSBuZWVkIHRvIGtub3cgb2YgYm90aCBpbiBvcmRlciB0byBoYW5kbGUgCisJICogIHRoaXMgc2l0dWF0aW9uIHByb3Blcmx5LiBXZSB0cnkgdG8gdW5zdGFjayBTQ1NJIAorCSAqICBpbnRlcnJ1cHRzIGZvciB0aGF0IHJlYXNvbi4gQlRXLCBJIGRpc2xpa2UgYSBMT1QgCisJICogIHN1Y2ggYSBsb29wIGluc2lkZSB0aGUgaW50ZXJydXB0IHJvdXRpbmUuCisJICogIEV2ZW4gaWYgRE1BIGludGVycnVwdCBzdGFja2luZyBpcyB2ZXJ5IHVubGlrZWx5IHRvIAorCSAqICBoYXBwZW4sIHdlIGFsc28gdHJ5IHVuc3RhY2tpbmcgdGhlc2Ugb25lcywgc2luY2UgCisJICogIHRoaXMgaGFzIG5vIHBlcmZvcm1hbmNlIGltcGFjdC4KKwkgKi8KKwlzaXN0CT0gMDsKKwlkc3RhdAk9IDA7CisJaXN0YXRjCT0gaXN0YXQ7CisJZG8geworCQlpZiAoaXN0YXRjICYgU0lQKQorCQkJc2lzdCAgfD0gSU5XKG5wLCBuY19zaXN0KTsKKwkJaWYgKGlzdGF0YyAmIERJUCkKKwkJCWRzdGF0IHw9IElOQihucCwgbmNfZHN0YXQpOworCQlpc3RhdGMgPSBJTkIobnAsIG5jX2lzdGF0KTsKKwkJaXN0YXQgfD0gaXN0YXRjOworCX0gd2hpbGUgKGlzdGF0YyAmIChTSVB8RElQKSk7CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19USU5ZKQorCQlwcmludGYgKCI8JWR8JXg6JXh8JXg6JXg+IiwKKwkJCShpbnQpSU5CKG5wLCBuY19zY3IwKSwKKwkJCWRzdGF0LHNpc3QsCisJCQkodW5zaWduZWQpSU5MKG5wLCBuY19kc3ApLAorCQkJKHVuc2lnbmVkKUlOTChucCwgbmNfZGJjKSk7CisJLyoKKwkgKiAgT24gcGFwZXIsIGEgbWVtb3J5IHJlYWQgYmFycmllciBtYXkgYmUgbmVlZGVkIGhlcmUgdG8gCisJICogIHByZXZlbnQgb3V0IG9mIG9yZGVyIExPQURzIGJ5IHRoZSBDUFUgZnJvbSBoYXZpbmcgCisJICogIHByZWZldGNoZWQgc3RhbGUgZGF0YSBwcmlvciB0byBETUEgaGF2aW5nIG9jY3VycmVkLgorCSAqICBBbmQgc2luY2Ugd2UgYXJlIHBhcmFub2lkIC4uLiA6KQorCSAqLworCU1FTU9SWV9SRUFEX0JBUlJJRVIoKTsKKworCS8qCisJICogIEZpcnN0LCBpbnRlcnJ1cHRzIHdlIHdhbnQgdG8gc2VydmljZSBjbGVhbmx5LgorCSAqCisJICogIFBoYXNlIG1pc21hdGNoIChNQSkgaXMgdGhlIG1vc3QgZnJlcXVlbnQgaW50ZXJydXB0IAorCSAqICBmb3IgY2hpcCBlYXJsaWVyIHRoYW4gdGhlIDg5NiBhbmQgc28gd2UgaGF2ZSB0byBzZXJ2aWNlIAorCSAqICBpdCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLgorCSAqICBBIFNDU0kgcGFyaXR5IGVycm9yIChQQVIpIG1heSBiZSBjb21iaW5lZCB3aXRoIGEgcGhhc2UgCisJICogIG1pc21hdGNoIGNvbmRpdGlvbiAoTUEpLgorCSAqICBQcm9ncmFtbWVkIGludGVycnVwdHMgKFNJUikgYXJlIHVzZWQgdG8gY2FsbCB0aGUgQyBjb2RlIAorCSAqICBmcm9tIFNDUklQVFMuCisJICogIFRoZSBzaW5nbGUgc3RlcCBpbnRlcnJ1cHQgKFNTSSkgaXMgbm90IHVzZWQgaW4gdGhpcyAKKwkgKiAgZHJpdmVyLgorCSAqLworCWlmICghKHNpc3QgICYgKFNUT3xHRU58SFRIfFNHRXxVREN8U0JNQ3xSU1QpKSAmJgorCSAgICAhKGRzdGF0ICYgKE1EUEV8QkZ8QUJSVHxJSUQpKSkgeworCQlpZgkoc2lzdCAmIFBBUikJc3ltX2ludF9wYXIgKG5wLCBzaXN0KTsKKwkJZWxzZSBpZiAoc2lzdCAmIE1BKQlzeW1faW50X21hIChucCk7CisJCWVsc2UgaWYgKGRzdGF0ICYgU0lSKQlzeW1faW50X3NpciAobnApOworCQllbHNlIGlmIChkc3RhdCAmIFNTSSkJT1VUT05CX1NURCgpOworCQllbHNlCQkJZ290byB1bmtub3duX2ludDsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogIE5vdywgaW50ZXJydXB0cyB0aGF0IGRvbm5vdCBoYXBwZW4gaW4gbm9ybWFsIAorCSAqICBzaXR1YXRpb25zIGFuZCB0aGF0IHdlIG1heSBuZWVkIHRvIHJlY292ZXIgZnJvbS4KKwkgKgorCSAqICBPbiBTQ1NJIFJFU0VUIChSU1QpLCB3ZSByZXNldCBldmVyeXRoaW5nLgorCSAqICBPbiBTQ1NJIEJVUyBNT0RFIENIQU5HRSAoU0JNQyksIHdlIGNvbXBsZXRlIGFsbCAKKwkgKiAgYWN0aXZlIENDQnMgd2l0aCBSRVNFVCBzdGF0dXMsIHByZXBhcmUgYWxsIGRldmljZXMgCisJICogIGZvciBuZWdvdGlhdGluZyBhZ2FpbiBhbmQgcmVzdGFydCB0aGUgU0NSSVBUUy4KKwkgKiAgT24gU1RPIGFuZCBVREMsIHdlIGNvbXBsZXRlIHRoZSBDQ0Igd2l0aCB0aGUgY29ycmVzLSAKKwkgKiAgcG9uZGluZyBzdGF0dXMgYW5kIHJlc3RhcnQgdGhlIFNDUklQVFMuCisJICovCisJaWYgKHNpc3QgJiBSU1QpIHsKKwkJcHJpbnRmKCIlczogU0NTSSBCVVMgcmVzZXQgZGV0ZWN0ZWQuXG4iLCBzeW1fbmFtZShucCkpOworCQlzeW1fc3RhcnRfdXAgKG5wLCAxKTsKKwkJcmV0dXJuOworCX0KKworCU9VVEIobnAsIG5jX2N0ZXN0MywgbnAtPnJ2X2N0ZXN0MyB8IENMRik7CS8qIGNsZWFyIGRtYSBmaWZvICAqLworCU9VVEIobnAsIG5jX3N0ZXN0MywgVEV8Q1NGKTsJCS8qIGNsZWFyIHNjc2kgZmlmbyAqLworCisJaWYgKCEoc2lzdCAgJiAoR0VOfEhUSHxTR0UpKSAmJgorCSAgICAhKGRzdGF0ICYgKE1EUEV8QkZ8QUJSVHxJSUQpKSkgeworCQlpZgkoc2lzdCAmIFNCTUMpCXN5bV9pbnRfc2JtYyAobnApOworCQllbHNlIGlmIChzaXN0ICYgU1RPKQlzeW1faW50X3N0byAobnApOworCQllbHNlIGlmIChzaXN0ICYgVURDKQlzeW1faW50X3VkYyAobnApOworCQllbHNlCQkJZ290byB1bmtub3duX2ludDsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogIE5vdywgaW50ZXJydXB0cyB3ZSBhcmUgbm90IGFibGUgdG8gcmVjb3ZlciBjbGVhbmx5LgorCSAqCisJICogIExvZyBtZXNzYWdlIGZvciBoYXJkIGVycm9ycy4KKwkgKiAgUmVzZXQgZXZlcnl0aGluZy4KKwkgKi8KKworCXN5bV9sb2dfaGFyZF9lcnJvcihucCwgc2lzdCwgZHN0YXQpOworCisJaWYgKChzaXN0ICYgKEdFTnxIVEh8U0dFKSkgfHwKKwkJKGRzdGF0ICYgKE1EUEV8QkZ8QUJSVHxJSUQpKSkgeworCQlzeW1fc3RhcnRfcmVzZXQobnApOworCQlyZXR1cm47CisJfQorCit1bmtub3duX2ludDoKKwkvKgorCSAqICBXZSBqdXN0IG1pc3MgdGhlIGNhdXNlIG9mIHRoZSBpbnRlcnJ1cHQuIDooCisJICogIFByaW50IGEgbWVzc2FnZS4gVGhlIHRpbWVvdXQgd2lsbCBkbyB0aGUgcmVhbCB3b3JrLgorCSAqLworCXByaW50ZigJIiVzOiB1bmtub3duIGludGVycnVwdChzKSBpZ25vcmVkLCAiCisJCSJJU1RBVD0weCV4IERTVEFUPTB4JXggU0lTVD0weCV4XG4iLAorCQlzeW1fbmFtZShucCksIGlzdGF0LCBkc3RhdCwgc2lzdCk7Cit9CisKKy8qCisgKiAgRGVxdWV1ZSBmcm9tIHRoZSBTVEFSVCBxdWV1ZSBhbGwgQ0NCcyB0aGF0IG1hdGNoIAorICogIGEgZ2l2ZW4gdGFyZ2V0L2x1bi90YXNrIGNvbmRpdGlvbiAoLTEgbWVhbnMgYWxsKSwKKyAqICBhbmQgbW92ZSB0aGVtIGZyb20gdGhlIEJVU1kgcXVldWUgdG8gdGhlIENPTVAgcXVldWUgCisgKiAgd2l0aCBDQU1fUkVRVUVVRV9SRVEgc3RhdHVzIGNvbmRpdGlvbi4KKyAqICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZHVyaW5nIGVycm9yIGhhbmRsaW5nL3JlY292ZXJ5LgorICogIEl0IGlzIGNhbGxlZCB3aXRoIFNDUklQVFMgbm90IHJ1bm5pbmcuCisgKi8KK3N0YXRpYyBpbnQgCitzeW1fZGVxdWV1ZV9mcm9tX3NxdWV1ZShzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCBpLCBpbnQgdGFyZ2V0LCBpbnQgbHVuLCBpbnQgdGFzaykKK3sKKwlpbnQgajsKKwlzdHJ1Y3Qgc3ltX2NjYiAqY3A7CisKKwkvKgorCSAqICBNYWtlIHN1cmUgdGhlIHN0YXJ0aW5nIGluZGV4IGlzIHdpdGhpbiByYW5nZS4KKwkgKi8KKwlhc3NlcnQoKGkgPj0gMCkgJiYgKGkgPCAyKk1BWF9RVUVVRSkpOworCisJLyoKKwkgKiAgV2FsayB1bnRpbCBlbmQgb2YgU1RBUlQgcXVldWUgYW5kIGRlcXVldWUgZXZlcnkgam9iIAorCSAqICB0aGF0IG1hdGNoZXMgdGhlIHRhcmdldC9sdW4vdGFzayBjb25kaXRpb24uCisJICovCisJaiA9IGk7CisJd2hpbGUgKGkgIT0gbnAtPnNxdWV1ZXB1dCkgeworCQljcCA9IHN5bV9jY2JfZnJvbV9kc2EobnAsIHNjcl90b19jcHUobnAtPnNxdWV1ZVtpXSkpOworCQlhc3NlcnQoY3ApOworI2lmZGVmIFNZTV9DT05GX0lBUkJfU1VQUE9SVAorCQkvKiBGb3JnZXQgaGludHMgZm9yIElBUkIsIHRoZXkgbWF5IGJlIG5vIGxvbmdlciByZWxldmFudCAqLworCQljcC0+aG9zdF9mbGFncyAmPSB+SEZfSElOVF9JQVJCOworI2VuZGlmCisJCWlmICgodGFyZ2V0ID09IC0xIHx8IGNwLT50YXJnZXQgPT0gdGFyZ2V0KSAmJgorCQkgICAgKGx1biAgICA9PSAtMSB8fCBjcC0+bHVuICAgID09IGx1bikgICAgJiYKKwkJICAgICh0YXNrICAgPT0gLTEgfHwgY3AtPnRhZyAgICA9PSB0YXNrKSkgeworCQkJc3ltX3NldF9jYW1fc3RhdHVzKGNwLT5jbWQsIENBTV9SRVFVRVVFX1JFUSk7CisJCQlzeW1fcmVtcXVlKCZjcC0+bGlua19jY2JxKTsKKwkJCXN5bV9pbnNxdWVfdGFpbCgmY3AtPmxpbmtfY2NicSwgJm5wLT5jb21wX2NjYnEpOworCQl9CisJCWVsc2UgeworCQkJaWYgKGkgIT0gaikKKwkJCQlucC0+c3F1ZXVlW2pdID0gbnAtPnNxdWV1ZVtpXTsKKwkJCWlmICgoaiArPSAyKSA+PSBNQVhfUVVFVUUqMikgaiA9IDA7CisJCX0KKwkJaWYgKChpICs9IDIpID49IE1BWF9RVUVVRSoyKSBpID0gMDsKKwl9CisJaWYgKGkgIT0gaikJCS8qIENvcHkgYmFjayB0aGUgaWRsZSB0YXNrIGlmIG5lZWRlZCAqLworCQlucC0+c3F1ZXVlW2pdID0gbnAtPnNxdWV1ZVtpXTsKKwlucC0+c3F1ZXVlcHV0ID0gajsJLyogVXBkYXRlIG91ciBjdXJyZW50IHN0YXJ0IHF1ZXVlIHBvaW50ZXIgKi8KKworCXJldHVybiAoaSAtIGopIC8gMjsKK30KKworLyoKKyAqICBjaGlwIGhhbmRsZXIgZm9yIGJhZCBTQ1NJIHN0YXR1cyBjb25kaXRpb24KKyAqCisgKiAgSW4gY2FzZSBvZiBiYWQgU0NTSSBzdGF0dXMsIHdlIHVucXVldWUgYWxsIHRoZSB0YXNrcyAKKyAqICBjdXJyZW50bHkgcXVldWVkIHRvIHRoZSBjb250cm9sbGVyIGJ1dCBub3QgeWV0IHN0YXJ0ZWQgCisgKiAgYW5kIHRoZW4gcmVzdGFydCB0aGUgU0NSSVBUUyBwcm9jZXNzb3IgaW1tZWRpYXRlbHkuCisgKgorICogIFFVRVVFIEZVTEwgYW5kIEJVU1kgY29uZGl0aW9ucyBhcmUgaGFuZGxlZCB0aGUgc2FtZSB3YXkuCisgKiAgQmFzaWNhbGx5IGFsbCB0aGUgbm90IHlldCBzdGFydGVkIHRhc2tzIGFyZSByZXF1ZXVlZCBpbiAKKyAqICBkZXZpY2UgcXVldWUgYW5kIHRoZSBxdWV1ZSBpcyBmcm96ZW4gdW50aWwgYSBjb21wbGV0aW9uLgorICoKKyAqICBGb3IgQ0hFQ0sgQ09ORElUSU9OIGFuZCBDT01NQU5EIFRFUk1JTkFURUQgc3RhdHVzLCB3ZSB1c2UgCisgKiAgdGhlIENDQiBvZiB0aGUgZmFpbGVkIGNvbW1hbmQgdG8gcHJlcGFyZSBhIFJFUVVFU1QgU0VOU0UgCisgKiAgU0NTSSBjb21tYW5kIGFuZCBxdWV1ZSBpdCB0byB0aGUgY29udHJvbGxlciBxdWV1ZS4KKyAqCisgKiAgU0NSQVRDSEEgaXMgYXNzdW1lZCB0byBoYXZlIGJlZW4gbG9hZGVkIHdpdGggU1RBUlRQT1MgCisgKiAgYmVmb3JlIHRoZSBTQ1JJUFRTIGNhbGxlZCB0aGUgQyBjb2RlLgorICovCitzdGF0aWMgdm9pZCBzeW1fc2lyX2JhZF9zY3NpX3N0YXR1cyhzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCBudW0sIHN0cnVjdCBzeW1fY2NiICpjcCkKK3sKKwl1MzIJCXN0YXJ0cDsKKwl1X2NoYXIJCXNfc3RhdHVzID0gY3AtPnNzc3Nfc3RhdHVzOworCXVfY2hhcgkJaF9mbGFncyAgPSBjcC0+aG9zdF9mbGFnczsKKwlpbnQJCW1zZ2xlbjsKKwlpbnQJCWk7CisKKwkvKgorCSAqICBDb21wdXRlIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBqb2IgdG8gc3RhcnQgZnJvbSBTQ1JJUFRTLgorCSAqLworCWkgPSAoSU5MKG5wLCBuY19zY3JhdGNoYSkgLSBucC0+c3F1ZXVlX2JhKSAvIDQ7CisKKwkvKgorCSAqICBUaGUgbGFzdCBDQ0IgcXVldWVkIHVzZWQgZm9yIElBUkIgaGludCBtYXkgYmUgCisJICogIG5vIGxvbmdlciByZWxldmFudC4gRm9yZ2V0IGl0LgorCSAqLworI2lmZGVmIFNZTV9DT05GX0lBUkJfU1VQUE9SVAorCWlmIChucC0+bGFzdF9jcCkKKwkJbnAtPmxhc3RfY3AgPSAwOworI2VuZGlmCisKKwkvKgorCSAqICBOb3cgZGVhbCB3aXRoIHRoZSBTQ1NJIHN0YXR1cy4KKwkgKi8KKwlzd2l0Y2goc19zdGF0dXMpIHsKKwljYXNlIFNfQlVTWToKKwljYXNlIFNfUVVFVUVfRlVMTDoKKwkJaWYgKHN5bV92ZXJib3NlID49IDIpIHsKKwkJCXN5bV9wcmludF9hZGRyKGNwLT5jbWQsICIlc1xuIiwKKwkJCSAgICAgICAgc19zdGF0dXMgPT0gU19CVVNZID8gIkJVU1kiIDogIlFVRVVFIEZVTExcbiIpOworCQl9CisJZGVmYXVsdDoJLyogU19JTlQsIFNfSU5UX0NPTkRfTUVULCBTX0NPTkZMSUNUICovCisJCXN5bV9jb21wbGV0ZV9lcnJvciAobnAsIGNwKTsKKwkJYnJlYWs7CisJY2FzZSBTX1RFUk1JTkFURUQ6CisJY2FzZSBTX0NIRUNLX0NPTkQ6CisJCS8qCisJCSAqICBJZiB3ZSBnZXQgYW4gU0NTSSBlcnJvciB3aGVuIHJlcXVlc3Rpbmcgc2Vuc2UsIGdpdmUgdXAuCisJCSAqLworCQlpZiAoaF9mbGFncyAmIEhGX1NFTlNFKSB7CisJCQlzeW1fY29tcGxldGVfZXJyb3IgKG5wLCBjcCk7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqICBEZXF1ZXVlIGFsbCBxdWV1ZWQgQ0NCcyBmb3IgdGhhdCBkZXZpY2Ugbm90IHlldCBzdGFydGVkLAorCQkgKiAgYW5kIHJlc3RhcnQgdGhlIFNDUklQVFMgcHJvY2Vzc29yIGltbWVkaWF0ZWx5LgorCQkgKi8KKwkJc3ltX2RlcXVldWVfZnJvbV9zcXVldWUobnAsIGksIGNwLT50YXJnZXQsIGNwLT5sdW4sIC0xKTsKKwkJT1VUTF9EU1AobnAsIFNDUklQVEFfQkEobnAsIHN0YXJ0KSk7CisKKyAJCS8qCisJCSAqICBTYXZlIHNvbWUgaW5mbyBvZiB0aGUgYWN0dWFsIElPLgorCQkgKiAgQ29tcHV0ZSB0aGUgZGF0YSByZXNpZHVhbC4KKwkJICovCisJCWNwLT5zdl9zY3NpX3N0YXR1cyA9IGNwLT5zc3NzX3N0YXR1czsKKwkJY3AtPnN2X3hlcnJfc3RhdHVzID0gY3AtPnhlcnJfc3RhdHVzOworCQljcC0+c3ZfcmVzaWQgPSBzeW1fY29tcHV0ZV9yZXNpZHVhbChucCwgY3ApOworCisJCS8qCisJCSAqICBQcmVwYXJlIGFsbCBuZWVkZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciAKKwkJICogIHJlcXVlc3Rpbmcgc2Vuc2UgZGF0YS4KKwkJICovCisKKwkJY3AtPnNjc2lfc21zZzJbMF0gPSBJREVOVElGWSgwLCBjcC0+bHVuKTsKKwkJbXNnbGVuID0gMTsKKworCQkvKgorCQkgKiAgSWYgd2UgYXJlIGN1cnJlbnRseSB1c2luZyBhbnl0aGluZyBkaWZmZXJlbnQgZnJvbSAKKwkJICogIGFzeW5jLiA4IGJpdCBkYXRhIHRyYW5zZmVycyB3aXRoIHRoYXQgdGFyZ2V0LAorCQkgKiAgc3RhcnQgYSBuZWdvdGlhdGlvbiwgc2luY2UgdGhlIGRldmljZSBtYXkgd2FudCAKKwkJICogIHRvIHJlcG9ydCB1cyBhIFVOSVQgQVRURU5USU9OIGNvbmRpdGlvbiBkdWUgdG8gCisJCSAqICBhIGNhdXNlIHdlIGN1cnJlbnRseSBpZ25vcmUsIGFuZCB3ZSBkb25ub3Qgd2FudCAKKwkJICogIHRvIGJlIHN0dWNrIHdpdGggV0lERSBhbmQvb3IgU1lOQyBkYXRhIHRyYW5zZmVyLgorCQkgKgorCQkgKiAgY3AtPm5lZ29fc3RhdHVzIGlzIGZpbGxlZCBieSBzeW1fcHJlcGFyZV9uZWdvKCkuCisJCSAqLworCQljcC0+bmVnb19zdGF0dXMgPSAwOworCQltc2dsZW4gKz0gc3ltX3ByZXBhcmVfbmVnbyhucCwgY3AsICZjcC0+c2NzaV9zbXNnMlttc2dsZW5dKTsKKwkJLyoKKwkJICogIE1lc3NhZ2UgdGFibGUgaW5kaXJlY3Qgc3RydWN0dXJlLgorCQkgKi8KKwkJY3AtPnBoeXMuc21zZy5hZGRyCT0gY3B1X3RvX3NjcihDQ0JfQkEoY3AsIHNjc2lfc21zZzIpKTsKKwkJY3AtPnBoeXMuc21zZy5zaXplCT0gY3B1X3RvX3Njcihtc2dsZW4pOworCisJCS8qCisJCSAqICBzZW5zZSBjb21tYW5kCisJCSAqLworCQljcC0+cGh5cy5jbWQuYWRkcgk9IGNwdV90b19zY3IoQ0NCX0JBKGNwLCBzZW5zZWNtZCkpOworCQljcC0+cGh5cy5jbWQuc2l6ZQk9IGNwdV90b19zY3IoNik7CisKKwkJLyoKKwkJICogIHBhdGNoIHJlcXVlc3RlZCBzaXplIGludG8gc2Vuc2UgY29tbWFuZAorCQkgKi8KKwkJY3AtPnNlbnNlY21kWzBdCQk9IFJFUVVFU1RfU0VOU0U7CisJCWNwLT5zZW5zZWNtZFsxXQkJPSAwOworCQlpZiAoY3AtPmNtZC0+ZGV2aWNlLT5zY3NpX2xldmVsIDw9IFNDU0lfMiAmJiBjcC0+bHVuIDw9IDcpCisJCQljcC0+c2Vuc2VjbWRbMV0JPSBjcC0+bHVuIDw8IDU7CisJCWNwLT5zZW5zZWNtZFs0XQkJPSBTWU1fU05TX0JCVUZfTEVOOworCQljcC0+ZGF0YV9sZW4JCT0gU1lNX1NOU19CQlVGX0xFTjsKKworCQkvKgorCQkgKiAgc2Vuc2UgZGF0YQorCQkgKi8KKwkJbWVtc2V0KGNwLT5zbnNfYmJ1ZiwgMCwgU1lNX1NOU19CQlVGX0xFTik7CisJCWNwLT5waHlzLnNlbnNlLmFkZHIJPSBjcHVfdG9fc2NyKENDQl9CQShjcCwgc25zX2JidWYpKTsKKwkJY3AtPnBoeXMuc2Vuc2Uuc2l6ZQk9IGNwdV90b19zY3IoU1lNX1NOU19CQlVGX0xFTik7CisKKwkJLyoKKwkJICogIHJlcXVldWUgdGhlIGNvbW1hbmQuCisJCSAqLworCQlzdGFydHAgPSBTQ1JJUFRCX0JBKG5wLCBzZGF0YV9pbik7CisKKwkJY3AtPnBoeXMuaGVhZC5zYXZlcAk9IGNwdV90b19zY3Ioc3RhcnRwKTsKKwkJY3AtPnBoeXMuaGVhZC5sYXN0cAk9IGNwdV90b19zY3Ioc3RhcnRwKTsKKwkJY3AtPnN0YXJ0cAkJPSBjcHVfdG9fc2NyKHN0YXJ0cCk7CisJCWNwLT5nb2FscAkJPSBjcHVfdG9fc2NyKHN0YXJ0cCArIDE2KTsKKworCQljcC0+aG9zdF94ZmxhZ3MgPSAwOworCQljcC0+aG9zdF9zdGF0dXMJPSBjcC0+bmVnb19zdGF0dXMgPyBIU19ORUdPVElBVEUgOiBIU19CVVNZOworCQljcC0+c3Nzc19zdGF0dXMgPSBTX0lMTEVHQUw7CisJCWNwLT5ob3N0X2ZsYWdzCT0gKEhGX1NFTlNFfEhGX0RBVEFfSU4pOworCQljcC0+eGVycl9zdGF0dXMgPSAwOworCQljcC0+ZXh0cmFfYnl0ZXMgPSAwOworCisJCWNwLT5waHlzLmhlYWQuZ28uc3RhcnQgPSBjcHVfdG9fc2NyKFNDUklQVEFfQkEobnAsIHNlbGVjdCkpOworCisJCS8qCisJCSAqICBSZXF1ZXVlIHRoZSBjb21tYW5kLgorCQkgKi8KKwkJc3ltX3B1dF9zdGFydF9xdWV1ZShucCwgY3ApOworCisJCS8qCisJCSAqICBHaXZlIGJhY2sgdG8gdXBwZXIgbGF5ZXIgZXZlcnl0aGluZyB3ZSBoYXZlIGRlcXVldWVkLgorCQkgKi8KKwkJc3ltX2ZsdXNoX2NvbXBfcXVldWUobnAsIDApOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiAgQWZ0ZXIgYSBkZXZpY2UgaGFzIGFjY2VwdGVkIHNvbWUgbWFuYWdlbWVudCBtZXNzYWdlIAorICogIGFzIEJVUyBERVZJQ0UgUkVTRVQsIEFCT1JUIFRBU0ssIGV0YyAuLi4sIG9yIHdoZW4gCisgKiAgYSBkZXZpY2Ugc2lnbmFscyBhIFVOSVQgQVRURU5USU9OIGNvbmRpdGlvbiwgc29tZSAKKyAqICB0YXNrcyBhcmUgdGhyb3duIGF3YXkgYnkgdGhlIGRldmljZS4gV2UgYXJlIHJlcXVpcmVkIAorICogIHRvIHJlZmxlY3QgdGhhdCBvbiBvdXIgdGFza3MgbGlzdCBzaW5jZSB0aGUgZGV2aWNlIAorICogIHdpbGwgbmV2ZXIgY29tcGxldGUgdGhlc2UgdGFza3MuCisgKgorICogIFRoaXMgZnVuY3Rpb24gbW92ZSBmcm9tIHRoZSBCVVNZIHF1ZXVlIHRvIHRoZSBDT01QIAorICogIHF1ZXVlIGFsbCBkaXNjb25uZWN0ZWQgQ0NCcyBmb3IgYSBnaXZlbiB0YXJnZXQgdGhhdCAKKyAqICBtYXRjaCB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOgorICogIC0gbHVuPS0xICBtZWFucyBhbnkgbG9naWNhbCBVTklUIG90aGVyd2lzZSBhIGdpdmVuIG9uZS4KKyAqICAtIHRhc2s9LTEgbWVhbnMgYW55IHRhc2ssIG90aGVyd2lzZSBhIGdpdmVuIG9uZS4KKyAqLworaW50IHN5bV9jbGVhcl90YXNrcyhzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCBjYW1fc3RhdHVzLCBpbnQgdGFyZ2V0LCBpbnQgbHVuLCBpbnQgdGFzaykKK3sKKwlTWU1fUVVFSEVBRCBxdG1wLCAqcXA7CisJaW50IGkgPSAwOworCXN0cnVjdCBzeW1fY2NiICpjcDsKKworCS8qCisJICogIE1vdmUgdGhlIGVudGlyZSBCVVNZIHF1ZXVlIHRvIG91ciB0ZW1wb3JhcnkgcXVldWUuCisJICovCisJc3ltX3F1ZV9pbml0KCZxdG1wKTsKKwlzeW1fcXVlX3NwbGljZSgmbnAtPmJ1c3lfY2NicSwgJnF0bXApOworCXN5bV9xdWVfaW5pdCgmbnAtPmJ1c3lfY2NicSk7CisKKwkvKgorCSAqICBQdXQgYWxsIENDQnMgdGhhdCBtYXRjaGVzIG91ciBjcml0ZXJpYSBpbnRvIAorCSAqICB0aGUgQ09NUCBxdWV1ZSBhbmQgcHV0IGJhY2sgb3RoZXIgb25lcyBpbnRvIAorCSAqICB0aGUgQlVTWSBxdWV1ZS4KKwkgKi8KKwl3aGlsZSAoKHFwID0gc3ltX3JlbXF1ZV9oZWFkKCZxdG1wKSkgIT0gMCkgeworCQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJCWNwID0gc3ltX3F1ZV9lbnRyeShxcCwgc3RydWN0IHN5bV9jY2IsIGxpbmtfY2NicSk7CisJCWNtZCA9IGNwLT5jbWQ7CisJCWlmIChjcC0+aG9zdF9zdGF0dXMgIT0gSFNfRElTQ09OTkVDVCB8fAorCQkgICAgY3AtPnRhcmdldCAhPSB0YXJnZXQJICAgICB8fAorCQkgICAgKGx1biAgIT0gLTEgJiYgY3AtPmx1biAhPSBsdW4pICAgfHwKKwkJICAgICh0YXNrICE9IC0xICYmIAorCQkJKGNwLT50YWcgIT0gTk9fVEFHICYmIGNwLT5zY3NpX3Ntc2dbMl0gIT0gdGFzaykpKSB7CisJCQlzeW1faW5zcXVlX3RhaWwoJmNwLT5saW5rX2NjYnEsICZucC0+YnVzeV9jY2JxKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN5bV9pbnNxdWVfdGFpbCgmY3AtPmxpbmtfY2NicSwgJm5wLT5jb21wX2NjYnEpOworCisJCS8qIFByZXNlcnZlIHRoZSBzb2Z0d2FyZSB0aW1lb3V0IGNvbmRpdGlvbiAqLworCQlpZiAoc3ltX2dldF9jYW1fc3RhdHVzKGNtZCkgIT0gQ0FNX0NNRF9USU1FT1VUKQorCQkJc3ltX3NldF9jYW1fc3RhdHVzKGNtZCwgY2FtX3N0YXR1cyk7CisJCSsraTsKKyNpZiAwCitwcmludGYoIlhYWFggVEFTSyBAJXAgQ0xFQVJFRFxuIiwgY3ApOworI2VuZGlmCisJfQorCXJldHVybiBpOworfQorCisvKgorICogIGNoaXAgaGFuZGxlciBmb3IgVEFTS1MgcmVjb3ZlcnkKKyAqCisgKiAgV2UgY2Fubm90IHNhZmVseSBhYm9ydCBhIGNvbW1hbmQsIHdoaWxlIHRoZSBTQ1JJUFRTIAorICogIHByb2Nlc3NvciBpcyBydW5uaW5nLCBzaW5jZSB3ZSBqdXN0IHdvdWxkIGJlIGluIHJhY2UgCisgKiAgd2l0aCBpdC4KKyAqCisgKiAgQXMgbG9uZyBhcyB3ZSBoYXZlIHRhc2tzIHRvIGFib3J0LCB3ZSBrZWVwIHRoZSBTRU0gCisgKiAgYml0IHNldCBpbiB0aGUgSVNUQVQuIFdoZW4gdGhpcyBiaXQgaXMgc2V0LCB0aGUgCisgKiAgU0NSSVBUUyBwcm9jZXNzb3IgaW50ZXJydXB0cyAoU0lSX1NDUklQVF9TVE9QUEVEKSAKKyAqICBlYWNoIHRpbWUgaXQgZW50ZXJzIHRoZSBzY2hlZHVsZXIuCisgKgorICogIElmIHdlIGhhdmUgdG8gcmVzZXQgYSB0YXJnZXQsIGNsZWFyIHRhc2tzIG9mIGEgdW5pdCwKKyAqICBvciB0byBwZXJmb3JtIHRoZSBhYm9ydCBvZiBhIGRpc2Nvbm5lY3RlZCBqb2IsIHdlIAorICogIHJlc3RhcnQgdGhlIFNDUklQVFMgZm9yIHNlbGVjdGluZyB0aGUgdGFyZ2V0LiBPbmNlIAorICogIHNlbGVjdGVkLCB0aGUgU0NSSVBUUyBpbnRlcnJ1cHRzIChTSVJfVEFSR0VUX1NFTEVDVEVEKS4KKyAqICBJZiBpdCBsb3NlcyBhcmJpdHJhdGlvbiwgdGhlIFNDUklQVFMgd2lsbCBpbnRlcnJ1cHQgYWdhaW4gCisgKiAgdGhlIG5leHQgdGltZSBpdCB3aWxsIGVudGVyIGl0cyBzY2hlZHVsZXIsIGFuZCBzbyBvbiAuLi4KKyAqCisgKiAgT24gU0lSX1RBUkdFVF9TRUxFQ1RFRCwgd2Ugc2NhbiBmb3IgdGhlIG1vcmUgCisgKiAgYXBwcm9wcmlhdGUgdGhpbmcgdG8gZG86CisgKgorICogIC0gSWYgbm90aGluZywgd2UganVzdCBzZW50IGEgTV9BQk9SVCBtZXNzYWdlIHRvIHRoZSAKKyAqICAgIHRhcmdldCB0byBnZXQgcmlkIG9mIHRoZSB1c2VsZXNzIFNDU0kgYnVzIG93bmVyc2hpcC4KKyAqICAgIEFjY29yZGluZyB0byB0aGUgc3BlY3MsIG5vIHRhc2tzIHNoYWxsIGJlIGFmZmVjdGVkLgorICogIC0gSWYgdGhlIHRhcmdldCBpcyB0byBiZSByZXNldCwgd2Ugc2VuZCBpdCBhIE1fUkVTRVQgCisgKiAgICBtZXNzYWdlLgorICogIC0gSWYgYSBsb2dpY2FsIFVOSVQgaXMgdG8gYmUgY2xlYXJlZCAsIHdlIHNlbmQgdGhlIAorICogICAgSURFTlRJRlkobHVuKSArIE1fQUJPUlQuCisgKiAgLSBJZiBhbiB1bnRhZ2dlZCB0YXNrIGlzIHRvIGJlIGFib3J0ZWQsIHdlIHNlbmQgdGhlIAorICogICAgSURFTlRJRlkobHVuKSArIE1fQUJPUlQuCisgKiAgLSBJZiBhIHRhZ2dlZCB0YXNrIGlzIHRvIGJlIGFib3J0ZWQsIHdlIHNlbmQgdGhlIAorICogICAgSURFTlRJRlkobHVuKSArIHRhc2sgYXR0cmlidXRlcyArIE1fQUJPUlRfVEFHLgorICoKKyAqICBPbmNlIG91ciAna2lzcyBvZiBkZWF0aCcgOikgbWVzc2FnZSBoYXMgYmVlbiBhY2NlcHRlZCAKKyAqICBieSB0aGUgdGFyZ2V0LCB0aGUgU0NSSVBUUyBpbnRlcnJ1cHRzIGFnYWluIAorICogIChTSVJfQUJPUlRfU0VOVCkuIE9uIHRoaXMgaW50ZXJydXB0LCB3ZSBjb21wbGV0ZSAKKyAqICBhbGwgdGhlIENDQnMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIGFib3J0ZWQgYnkgdGhlIAorICogIHRhcmdldCBhY2NvcmRpbmcgdG8gb3VyIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9zaXJfdGFza19yZWNvdmVyeShzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCBudW0pCit7CisJU1lNX1FVRUhFQUQgKnFwOworCXN0cnVjdCBzeW1fY2NiICpjcDsKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSBOVUxMOyAvKiBnY2MgaXNuJ3QgcXVpdGUgc21hcnQgZW5vdWdoIHlldCAqLworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldDsKKwlpbnQgdGFyZ2V0PS0xLCBsdW49LTEsIHRhc2s7CisJaW50IGksIGs7CisKKwlzd2l0Y2gobnVtKSB7CisJLyoKKwkgKiAgVGhlIFNDUklQVFMgcHJvY2Vzc29yIHN0b3BwZWQgYmVmb3JlIHN0YXJ0aW5nCisJICogIHRoZSBuZXh0IGNvbW1hbmQgaW4gb3JkZXIgdG8gYWxsb3cgdXMgdG8gcGVyZm9ybSAKKwkgKiAgc29tZSB0YXNrIHJlY292ZXJ5LgorCSAqLworCWNhc2UgU0lSX1NDUklQVF9TVE9QUEVEOgorCQkvKgorCQkgKiAgRG8gd2UgaGF2ZSBhbnkgdGFyZ2V0IHRvIHJlc2V0IG9yIHVuaXQgdG8gY2xlYXIgPworCQkgKi8KKwkJZm9yIChpID0gMCA7IGkgPCBTWU1fQ09ORl9NQVhfVEFSR0VUIDsgaSsrKSB7CisJCQl0cCA9ICZucC0+dGFyZ2V0W2ldOworCQkJaWYgKHRwLT50b19yZXNldCB8fCAKKwkJCSAgICAodHAtPmx1bjBwICYmIHRwLT5sdW4wcC0+dG9fY2xlYXIpKSB7CisJCQkJdGFyZ2V0ID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghdHAtPmx1bm1wKQorCQkJCWNvbnRpbnVlOworCQkJZm9yIChrID0gMSA7IGsgPCBTWU1fQ09ORl9NQVhfTFVOIDsgaysrKSB7CisJCQkJaWYgKHRwLT5sdW5tcFtrXSAmJiB0cC0+bHVubXBba10tPnRvX2NsZWFyKSB7CisJCQkJCXRhcmdldAk9IGk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmICh0YXJnZXQgIT0gLTEpCisJCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiAgSWYgbm90LCB3YWxrIHRoZSBidXN5IHF1ZXVlIGZvciBhbnkgCisJCSAqICBkaXNjb25uZWN0ZWQgQ0NCIHRvIGJlIGFib3J0ZWQuCisJCSAqLworCQlpZiAodGFyZ2V0ID09IC0xKSB7CisJCQlGT1JfRUFDSF9RVUVVRURfRUxFTUVOVCgmbnAtPmJ1c3lfY2NicSwgcXApIHsKKwkJCQljcCA9IHN5bV9xdWVfZW50cnkocXAsc3RydWN0IHN5bV9jY2IsbGlua19jY2JxKTsKKwkJCQlpZiAoY3AtPmhvc3Rfc3RhdHVzICE9IEhTX0RJU0NPTk5FQ1QpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChjcC0+dG9fYWJvcnQpIHsKKwkJCQkJdGFyZ2V0ID0gY3AtPnRhcmdldDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyoKKwkJICogIElmIHNvbWUgdGFyZ2V0IGlzIHRvIGJlIHNlbGVjdGVkLCAKKwkJICogIHByZXBhcmUgYW5kIHN0YXJ0IHRoZSBzZWxlY3Rpb24uCisJCSAqLworCQlpZiAodGFyZ2V0ICE9IC0xKSB7CisJCQl0cCA9ICZucC0+dGFyZ2V0W3RhcmdldF07CisJCQlucC0+YWJydF9zZWwuc2VsX2lkCT0gdGFyZ2V0OworCQkJbnAtPmFicnRfc2VsLnNlbF9zY250bDMgPSB0cC0+aGVhZC53dmFsOworCQkJbnAtPmFicnRfc2VsLnNlbF9zeGZlciAgPSB0cC0+aGVhZC5zdmFsOworCQkJT1VUTChucCwgbmNfZHNhLCBucC0+aGNiX2JhKTsKKwkJCU9VVExfRFNQKG5wLCBTQ1JJUFRCX0JBKG5wLCBzZWxfZm9yX2Fib3J0KSk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKgorCQkgKiAgTm93IGxvb2sgZm9yIGEgQ0NCIHRvIGFib3J0IHRoYXQgaGF2ZW4ndCBzdGFydGVkIHlldC4KKwkJICogIEJ0dywgdGhlIFNDUklQVFMgcHJvY2Vzc29yIGlzIHN0aWxsIHN0b3BwZWQsIHNvIAorCQkgKiAgd2UgYXJlIG5vdCBpbiByYWNlLgorCQkgKi8KKwkJaSA9IDA7CisJCWNwID0gTlVMTDsKKwkJRk9SX0VBQ0hfUVVFVUVEX0VMRU1FTlQoJm5wLT5idXN5X2NjYnEsIHFwKSB7CisJCQljcCA9IHN5bV9xdWVfZW50cnkocXAsIHN0cnVjdCBzeW1fY2NiLCBsaW5rX2NjYnEpOworCQkJaWYgKGNwLT5ob3N0X3N0YXR1cyAhPSBIU19CVVNZICYmCisJCQkgICAgY3AtPmhvc3Rfc3RhdHVzICE9IEhTX05FR09USUFURSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghY3AtPnRvX2Fib3J0KQorCQkJCWNvbnRpbnVlOworI2lmZGVmIFNZTV9DT05GX0lBUkJfU1VQUE9SVAorCQkJLyoKKwkJCSAqICAgIElmIHdlIGFyZSB1c2luZyBJTU1FRElBVEUgQVJCSVRSQVRJT04sIHdlIGRvbm5vdCAKKwkJCSAqICAgIHdhbnQgdG8gY2FuY2VsIHRoZSBsYXN0IHF1ZXVlZCBDQ0IsIHNpbmNlIHRoZSAKKwkJCSAqICAgIFNDUklQVFMgbWF5IGhhdmUgYW50aWNpcGF0ZWQgdGhlIHNlbGVjdGlvbi4KKwkJCSAqLworCQkJaWYgKGNwID09IG5wLT5sYXN0X2NwKSB7CisJCQkJY3AtPnRvX2Fib3J0ID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZgorCQkJaSA9IDE7CS8qIE1lYW5zIHdlIGhhdmUgZm91bmQgc29tZSAqLworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFpKSB7CisJCQkvKgorCQkJICogIFdlIGFyZSBkb25lLCBzbyB3ZSBkb25ub3QgbmVlZCAKKwkJCSAqICB0byBzeW5jaHJvbml6ZSB3aXRoIHRoZSBTQ1JJUFRTIGFueWxvbmdlci4KKwkJCSAqICBSZW1vdmUgdGhlIFNFTSBmbGFnIGZyb20gdGhlIElTVEFULgorCQkJICovCisJCQlucC0+aXN0YXRfc2VtID0gMDsKKwkJCU9VVEIobnAsIG5jX2lzdGF0LCBTSUdQKTsKKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqICBDb21wdXRlIGluZGV4IG9mIG5leHQgcG9zaXRpb24gaW4gdGhlIHN0YXJ0IAorCQkgKiAgcXVldWUgdGhlIFNDUklQVFMgaW50ZW5kcyB0byBzdGFydCBhbmQgZGVxdWV1ZSAKKwkJICogIGFsbCBDQ0JzIGZvciB0aGF0IGRldmljZSB0aGF0IGhhdmVuJ3QgYmVlbiBzdGFydGVkLgorCQkgKi8KKwkJaSA9IChJTkwobnAsIG5jX3NjcmF0Y2hhKSAtIG5wLT5zcXVldWVfYmEpIC8gNDsKKwkJaSA9IHN5bV9kZXF1ZXVlX2Zyb21fc3F1ZXVlKG5wLCBpLCBjcC0+dGFyZ2V0LCBjcC0+bHVuLCAtMSk7CisKKwkJLyoKKwkJICogIE1ha2Ugc3VyZSBhdCBsZWFzdCBvdXIgSU8gdG8gYWJvcnQgaGFzIGJlZW4gZGVxdWV1ZWQuCisJCSAqLworI2lmbmRlZiBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcKKwkJYXNzZXJ0KGkgJiYgc3ltX2dldF9jYW1fc3RhdHVzKGNwLT5jbWQpID09IENBTV9SRVFVRVVFX1JFUSk7CisjZWxzZQorCQlzeW1fcmVtcXVlKCZjcC0+bGlua19jY2JxKTsKKwkJc3ltX2luc3F1ZV90YWlsKCZjcC0+bGlua19jY2JxLCAmbnAtPmNvbXBfY2NicSk7CisjZW5kaWYKKwkJLyoKKwkJICogIEtlZXAgdHJhY2sgaW4gY2FtIHN0YXR1cyBvZiB0aGUgcmVhc29uIG9mIHRoZSBhYm9ydC4KKwkJICovCisJCWlmIChjcC0+dG9fYWJvcnQgPT0gMikKKwkJCXN5bV9zZXRfY2FtX3N0YXR1cyhjcC0+Y21kLCBDQU1fQ01EX1RJTUVPVVQpOworCQllbHNlCisJCQlzeW1fc2V0X2NhbV9zdGF0dXMoY3AtPmNtZCwgQ0FNX1JFUV9BQk9SVEVEKTsKKworCQkvKgorCQkgKiAgQ29tcGxldGUgd2l0aCBlcnJvciBldmVyeXRoaW5nIHRoYXQgd2UgaGF2ZSBkZXF1ZXVlZC4KKwkgCSAqLworCQlzeW1fZmx1c2hfY29tcF9xdWV1ZShucCwgMCk7CisJCWJyZWFrOworCS8qCisJICogIFRoZSBTQ1JJUFRTIHByb2Nlc3NvciBoYXMgc2VsZWN0ZWQgYSB0YXJnZXQgCisJICogIHdlIG1heSBoYXZlIHNvbWUgbWFudWFsIHJlY292ZXJ5IHRvIHBlcmZvcm0gZm9yLgorCSAqLworCWNhc2UgU0lSX1RBUkdFVF9TRUxFQ1RFRDoKKwkJdGFyZ2V0ID0gSU5CKG5wLCBuY19zZGlkKSAmIDB4ZjsKKwkJdHAgPSAmbnAtPnRhcmdldFt0YXJnZXRdOworCisJCW5wLT5hYnJ0X3RibC5hZGRyID0gY3B1X3RvX3Njcih2dG9idXMobnAtPmFicnRfbXNnKSk7CisKKwkJLyoKKwkJICogIElmIHRoZSB0YXJnZXQgaXMgdG8gYmUgcmVzZXQsIHByZXBhcmUgYSAKKwkJICogIE1fUkVTRVQgbWVzc2FnZSBhbmQgY2xlYXIgdGhlIHRvX3Jlc2V0IGZsYWcgCisJCSAqICBzaW5jZSB3ZSBkb25ub3QgZXhwZWN0IHRoaXMgb3BlcmF0aW9uIHRvIGZhaWwuCisJCSAqLworCQlpZiAodHAtPnRvX3Jlc2V0KSB7CisJCQlucC0+YWJydF9tc2dbMF0gPSBNX1JFU0VUOworCQkJbnAtPmFicnRfdGJsLnNpemUgPSAxOworCQkJdHAtPnRvX3Jlc2V0ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogIE90aGVyd2lzZSwgbG9vayBmb3Igc29tZSBsb2dpY2FsIHVuaXQgdG8gYmUgY2xlYXJlZC4KKwkJICovCisJCWlmICh0cC0+bHVuMHAgJiYgdHAtPmx1bjBwLT50b19jbGVhcikKKwkJCWx1biA9IDA7CisJCWVsc2UgaWYgKHRwLT5sdW5tcCkgeworCQkJZm9yIChrID0gMSA7IGsgPCBTWU1fQ09ORl9NQVhfTFVOIDsgaysrKSB7CisJCQkJaWYgKHRwLT5sdW5tcFtrXSAmJiB0cC0+bHVubXBba10tPnRvX2NsZWFyKSB7CisJCQkJCWx1biA9IGs7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qCisJCSAqICBJZiBhIGxvZ2ljYWwgdW5pdCBpcyB0byBiZSBjbGVhcmVkLCBwcmVwYXJlIAorCQkgKiAgYW4gSURFTlRJRlkobHVuKSArIEFCT1JUIE1FU1NBR0UuCisJCSAqLworCQlpZiAobHVuICE9IC0xKSB7CisJCQlzdHJ1Y3Qgc3ltX2xjYiAqbHAgPSBzeW1fbHAodHAsIGx1bik7CisJCQlscC0+dG9fY2xlYXIgPSAwOyAvKiBXZSBkb24ndCBleHBlY3QgdG8gZmFpbCBoZXJlICovCisJCQlucC0+YWJydF9tc2dbMF0gPSBJREVOVElGWSgwLCBsdW4pOworCQkJbnAtPmFicnRfbXNnWzFdID0gTV9BQk9SVDsKKwkJCW5wLT5hYnJ0X3RibC5zaXplID0gMjsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogIE90aGVyd2lzZSwgbG9vayBmb3Igc29tZSBkaXNjb25uZWN0ZWQgam9iIHRvIAorCQkgKiAgYWJvcnQgZm9yIHRoaXMgdGFyZ2V0LgorCQkgKi8KKwkJaSA9IDA7CisJCWNwID0gTlVMTDsKKwkJRk9SX0VBQ0hfUVVFVUVEX0VMRU1FTlQoJm5wLT5idXN5X2NjYnEsIHFwKSB7CisJCQljcCA9IHN5bV9xdWVfZW50cnkocXAsIHN0cnVjdCBzeW1fY2NiLCBsaW5rX2NjYnEpOworCQkJaWYgKGNwLT5ob3N0X3N0YXR1cyAhPSBIU19ESVNDT05ORUNUKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGNwLT50YXJnZXQgIT0gdGFyZ2V0KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFjcC0+dG9fYWJvcnQpCisJCQkJY29udGludWU7CisJCQlpID0gMTsJLyogTWVhbnMgd2UgaGF2ZSBzb21lICovCisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqICBJZiB3ZSBoYXZlIG5vbmUsIHByb2JhYmx5IHNpbmNlIHRoZSBkZXZpY2UgaGFzIAorCQkgKiAgY29tcGxldGVkIHRoZSBjb21tYW5kIGJlZm9yZSB3ZSB3b24gYWJpdHJhdGlvbiwKKwkJICogIHNlbmQgYSBNX0FCT1JUIG1lc3NhZ2Ugd2l0aG91dCBJREVOVElGWS4KKwkJICogIEFjY29yZGluZyB0byB0aGUgc3BlY3MsIHRoZSBkZXZpY2UgbXVzdCBqdXN0IAorCQkgKiAgZGlzY29ubmVjdCB0aGUgQlVTIGFuZCBub3QgYWJvcnQgYW55IHRhc2suCisJCSAqLworCQlpZiAoIWkpIHsKKwkJCW5wLT5hYnJ0X21zZ1swXSA9IE1fQUJPUlQ7CisJCQlucC0+YWJydF90Ymwuc2l6ZSA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqICBXZSBoYXZlIHNvbWUgdGFzayB0byBhYm9ydC4KKwkJICogIFNldCB0aGUgSURFTlRJRlkobHVuKQorCQkgKi8KKwkJbnAtPmFicnRfbXNnWzBdID0gSURFTlRJRlkoMCwgY3AtPmx1bik7CisKKwkJLyoKKwkJICogIElmIHdlIHdhbnQgdG8gYWJvcnQgYW4gdW50YWdnZWQgY29tbWFuZCwgd2UgCisJCSAqICB3aWxsIHNlbmQgYSBJREVOVElGWSArIE1fQUJPUlQuCisJCSAqICBPdGhlcndpc2UgKHRhZ2dlZCBjb21tYW5kKSwgd2Ugd2lsbCBzZW5kIAorCQkgKiAgYSBJREVOVElURlkgKyB0YXNrIGF0dHJpYnV0ZXMgKyBBQk9SVCBUQUcuCisJCSAqLworCQlpZiAoY3AtPnRhZyA9PSBOT19UQUcpIHsKKwkJCW5wLT5hYnJ0X21zZ1sxXSA9IE1fQUJPUlQ7CisJCQlucC0+YWJydF90Ymwuc2l6ZSA9IDI7CisJCX0gZWxzZSB7CisJCQlucC0+YWJydF9tc2dbMV0gPSBjcC0+c2NzaV9zbXNnWzFdOworCQkJbnAtPmFicnRfbXNnWzJdID0gY3AtPnNjc2lfc21zZ1syXTsKKwkJCW5wLT5hYnJ0X21zZ1szXSA9IE1fQUJPUlRfVEFHOworCQkJbnAtPmFicnRfdGJsLnNpemUgPSA0OworCQl9CisJCS8qCisJCSAqICBLZWVwIHRyYWNrIG9mIHNvZnR3YXJlIHRpbWVvdXQgY29uZGl0aW9uLCBzaW5jZSB0aGUgCisJCSAqICBwZXJpcGhlcmFsIGRyaXZlciBtYXkgbm90IGNvdW50IHJldHJpZXMgb24gYWJvcnQgCisJCSAqICBjb25kaXRpb25zIG5vdCBkdWUgdG8gdGltZW91dC4KKwkJICovCisJCWlmIChjcC0+dG9fYWJvcnQgPT0gMikKKwkJCXN5bV9zZXRfY2FtX3N0YXR1cyhjcC0+Y21kLCBDQU1fQ01EX1RJTUVPVVQpOworCQljcC0+dG9fYWJvcnQgPSAwOyAvKiBXZSBkb25ub3QgZXhwZWN0IHRvIGZhaWwgaGVyZSAqLworCQlicmVhazsKKworCS8qCisJICogIFRoZSB0YXJnZXQgaGFzIGFjY2VwdGVkIG91ciBtZXNzYWdlIGFuZCBzd2l0Y2hlZCAKKwkgKiAgdG8gQlVTIEZSRUUgcGhhc2UgYXMgd2UgZXhwZWN0ZWQuCisJICovCisJY2FzZSBTSVJfQUJPUlRfU0VOVDoKKwkJdGFyZ2V0ID0gSU5CKG5wLCBuY19zZGlkKSAmIDB4ZjsKKwkJdHAgPSAmbnAtPnRhcmdldFt0YXJnZXRdOworCQlzdGFyZ2V0ID0gdHAtPnNkZXYtPnNkZXZfdGFyZ2V0OworCQkKKwkJLyoKKwkJKiogIElmIHdlIGRpZG4ndCBhYm9ydCBhbnl0aGluZywgbGVhdmUgaGVyZS4KKwkJKi8KKwkJaWYgKG5wLT5hYnJ0X21zZ1swXSA9PSBNX0FCT1JUKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogIElmIHdlIHNlbnQgYSBNX1JFU0VULCB0aGVuIGEgaGFyZHdhcmUgcmVzZXQgaGFzIAorCQkgKiAgYmVlbiBwZXJmb3JtZWQgYnkgdGhlIHRhcmdldC4KKwkJICogIC0gUmVzZXQgZXZlcnl0aGluZyB0byBhc3luYyA4IGJpdAorCQkgKiAgLSBUZWxsIG91cnNlbGYgdG8gbmVnb3RpYXRlIG5leHQgdGltZSA6LSkKKwkJICogIC0gUHJlcGFyZSB0byBjbGVhciBhbGwgZGlzY29ubmVjdGVkIENDQnMgZm9yIAorCQkgKiAgICB0aGlzIHRhcmdldCBmcm9tIG91ciB0YXNrIGxpc3QgKGx1bj10YXNrPS0xKQorCQkgKi8KKwkJbHVuID0gLTE7CisJCXRhc2sgPSAtMTsKKwkJaWYgKG5wLT5hYnJ0X21zZ1swXSA9PSBNX1JFU0VUKSB7CisJCQl0cC0+aGVhZC5zdmFsID0gMDsKKwkJCXRwLT5oZWFkLnd2YWwgPSBucC0+cnZfc2NudGwzOworCQkJdHAtPmhlYWQudXZhbCA9IDA7CisJCQlzcGlfcGVyaW9kKHN0YXJnZXQpID0gMDsKKwkJCXNwaV9vZmZzZXQoc3RhcmdldCkgPSAwOworCQkJc3BpX3dpZHRoKHN0YXJnZXQpID0gMDsKKwkJCXNwaV9pdShzdGFyZ2V0KSA9IDA7CisJCQlzcGlfZHQoc3RhcmdldCkgPSAwOworCQkJc3BpX3FhcyhzdGFyZ2V0KSA9IDA7CisJCQl0cC0+dGdvYWwuY2hlY2tfbmVnbyA9IDE7CisJCX0KKworCQkvKgorCQkgKiAgT3RoZXJ3aXNlLCBjaGVjayBmb3IgdGhlIExVTiBhbmQgVEFTSyhzKSAKKwkJICogIGNvbmNlcm5lZCBieSB0aGUgY2FuY2VsYXRpb24uCisJCSAqICBJZiBpdCBpcyBub3QgQUJPUlRfVEFHIHRoZW4gaXQgaXMgQ0xFQVJfUVVFVUUgCisJCSAqICBvciBhbiBBQk9SVCBtZXNzYWdlIDotKQorCQkgKi8KKwkJZWxzZSB7CisJCQlsdW4gPSBucC0+YWJydF9tc2dbMF0gJiAweDNmOworCQkJaWYgKG5wLT5hYnJ0X21zZ1sxXSA9PSBNX0FCT1JUX1RBRykKKwkJCQl0YXNrID0gbnAtPmFicnRfbXNnWzJdOworCQl9CisKKwkJLyoKKwkJICogIENvbXBsZXRlIGFsbCB0aGUgQ0NCcyB0aGUgZGV2aWNlIHNob3VsZCBoYXZlIAorCQkgKiAgYWJvcnRlZCBkdWUgdG8gb3VyICdraXNzIG9mIGRlYXRoJyBtZXNzYWdlLgorCQkgKi8KKwkJaSA9IChJTkwobnAsIG5jX3NjcmF0Y2hhKSAtIG5wLT5zcXVldWVfYmEpIC8gNDsKKwkJc3ltX2RlcXVldWVfZnJvbV9zcXVldWUobnAsIGksIHRhcmdldCwgbHVuLCAtMSk7CisJCXN5bV9jbGVhcl90YXNrcyhucCwgQ0FNX1JFUV9BQk9SVEVELCB0YXJnZXQsIGx1biwgdGFzayk7CisJCXN5bV9mbHVzaF9jb21wX3F1ZXVlKG5wLCAwKTsKKworIAkJLyoKKwkJICogIElmIHdlIHNlbnQgYSBCRFIsIG1ha2UgdXBwZXIgbGF5ZXIgYXdhcmUgb2YgdGhhdC4KKyAJCSAqLworCQlpZiAobnAtPmFicnRfbXNnWzBdID09IE1fUkVTRVQpCisJCQlzeW1feHB0X2FzeW5jX3NlbnRfYmRyKG5wLCB0YXJnZXQpOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqICBQcmludCB0byB0aGUgbG9nIHRoZSBtZXNzYWdlIHdlIGludGVuZCB0byBzZW5kLgorCSAqLworCWlmIChudW0gPT0gU0lSX1RBUkdFVF9TRUxFQ1RFRCkgeworCQlkZXZfaW5mbygmdHAtPnNkZXYtPnNkZXZfdGFyZ2V0LT5kZXYsICJjb250cm9sIG1zZ291dDoiKTsKKwkJc3ltX3ByaW50bF9oZXgobnAtPmFicnRfbXNnLCBucC0+YWJydF90Ymwuc2l6ZSk7CisJCW5wLT5hYnJ0X3RibC5zaXplID0gY3B1X3RvX3NjcihucC0+YWJydF90Ymwuc2l6ZSk7CisJfQorCisJLyoKKwkgKiAgTGV0IHRoZSBTQ1JJUFRTIHByb2Nlc3NvciBjb250aW51ZS4KKwkgKi8KKwlPVVRPTkJfU1REKCk7Cit9CisKKy8qCisgKiAgR2VyYXJkJ3MgYWxjaGVteTopIHRoYXQgZGVhbHMgd2l0aCB3aXRoIHRoZSBkYXRhIAorICogIHBvaW50ZXIgZm9yIGJvdGggTURQIGFuZCB0aGUgcmVzaWR1YWwgY2FsY3VsYXRpb24uCisgKgorICogIEkgZGlkbid0IHdhbnQgdG8gYmxvYXQgdGhlIGNvZGUgYnkgbW9yZSB0aGFuIDIwMCAKKyAqICBsaW5lcyBmb3IgdGhlIGhhbmRsaW5nIG9mIGJvdGggTURQIGFuZCB0aGUgcmVzaWR1YWwuCisgKiAgVGhpcyBoYXMgYmVlbiBhY2hpZXZlZCBieSB1c2luZyBhIGRhdGEgcG9pbnRlciAKKyAqICByZXByZXNlbnRhdGlvbiBjb25zaXN0aW5nIGluIGFuIGluZGV4IGluIHRoZSBkYXRhIAorICogIGFycmF5IChkcF9zZykgYW5kIGEgbmVnYXRpdmUgb2Zmc2V0IChkcF9vZnMpIHRoYXQgCisgKiAgaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmc6CisgKgorICogIC0gZHBfc2cgPSBTWU1fQ09ORl9NQVhfU0cKKyAqICAgIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBkYXRhIHNjcmlwdC4KKyAqICAtIGRwX3NnIDwgU1lNX0NPTkZfTUFYX1NHCisgKiAgICBkcF9zZyBwb2ludHMgdG8gdGhlIG5leHQgZW50cnkgb2YgdGhlIHNjYXR0ZXIgYXJyYXkgCisgKiAgICB3ZSB3YW50IHRvIHRyYW5zZmVyLgorICogIC0gZHBfb2ZzIDwgMAorICogICAgZHBfb2ZzIHJlcHJlc2VudHMgdGhlIHJlc2lkdWFsIG9mIGJ5dGVzIG9mIHRoZSAKKyAqICAgIHByZXZpb3VzIGVudHJ5IHNjYXR0ZXIgZW50cnkgd2Ugd2lsbCBzZW5kIGZpcnN0LgorICogIC0gZHBfb2ZzID0gMAorICogICAgbm8gcmVzaWR1YWwgdG8gc2VuZCBmaXJzdC4KKyAqCisgKiAgVGhlIGZ1bmN0aW9uIHN5bV9ldmFsdWF0ZV9kcCgpIGFjY2VwdHMgYW4gYXJiaXRyYXkgCisgKiAgb2Zmc2V0IChiYXNpY2FsbHkgZnJvbSB0aGUgTURQIG1lc3NhZ2UpIGFuZCByZXR1cm5zIAorICogIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBvZiBkcF9zZyBhbmQgZHBfb2ZzLgorICovCisKK3N0YXRpYyBpbnQgc3ltX2V2YWx1YXRlX2RwKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV9jY2IgKmNwLCB1MzIgc2NyLCBpbnQgKm9mcykKK3sKKwl1MzIJZHBfc2NyOworCWludAlkcF9vZnMsIGRwX3NnLCBkcF9zZ21pbjsKKwlpbnQJdG1wOworCXN0cnVjdCBzeW1fcG1jICpwbTsKKworCS8qCisJICogIENvbXB1dGUgdGhlIHJlc3VsdGVkIGRhdGEgcG9pbnRlciBpbiB0ZXJtIG9mIGEgc2NyaXB0IAorCSAqICBhZGRyZXNzIHdpdGhpbiBzb21lIERBVEEgc2NyaXB0IGFuZCBhIHNpZ25lZCBieXRlIG9mZnNldC4KKwkgKi8KKwlkcF9zY3IgPSBzY3I7CisJZHBfb2ZzID0gKm9mczsKKwlpZgkoZHBfc2NyID09IFNDUklQVEFfQkEobnAsIHBtMF9kYXRhKSkKKwkJcG0gPSAmY3AtPnBoeXMucG0wOworCWVsc2UgaWYgKGRwX3NjciA9PSBTQ1JJUFRBX0JBKG5wLCBwbTFfZGF0YSkpCisJCXBtID0gJmNwLT5waHlzLnBtMTsKKwllbHNlCisJCXBtID0gTlVMTDsKKworCWlmIChwbSkgeworCQlkcF9zY3IgID0gc2NyX3RvX2NwdShwbS0+cmV0KTsKKwkJZHBfb2ZzIC09IHNjcl90b19jcHUocG0tPnNnLnNpemUpOworCX0KKworCS8qCisJICogIElmIHdlIGFyZSBhdXRvLXNlbnNpbmcsIHRoZW4gd2UgYXJlIGRvbmUuCisJICovCisJaWYgKGNwLT5ob3N0X2ZsYWdzICYgSEZfU0VOU0UpIHsKKwkJKm9mcyA9IGRwX29mczsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiAgRGVkdWNlIHRoZSBpbmRleCBvZiB0aGUgc2cgZW50cnkuCisJICogIEtlZXAgdHJhY2sgb2YgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCB2YWxpZCBlbnRyeS4KKwkgKiAgSWYgcmVzdWx0IGlzIGRwX3NnID0gU1lNX0NPTkZfTUFYX1NHLCB0aGVuIHdlIGFyZSBhdCB0aGUgCisJICogIGVuZCBvZiB0aGUgZGF0YS4KKwkgKi8KKwl0bXAgPSBzY3JfdG9fY3B1KHN5bV9nb2FscChjcCkpOworCWRwX3NnID0gU1lNX0NPTkZfTUFYX1NHOworCWlmIChkcF9zY3IgIT0gdG1wKQorCQlkcF9zZyAtPSAodG1wIC0gOCAtIChpbnQpZHBfc2NyKSAvICgyKjQpOworCWRwX3NnbWluID0gU1lNX0NPTkZfTUFYX1NHIC0gY3AtPnNlZ21lbnRzOworCisJLyoKKwkgKiAgTW92ZSB0byB0aGUgc2cgZW50cnkgdGhlIGRhdGEgcG9pbnRlciBiZWxvbmdzIHRvLgorCSAqCisJICogIElmIHdlIGFyZSBpbnNpZGUgdGhlIGRhdGEgYXJlYSwgd2UgZXhwZWN0IHJlc3VsdCB0byBiZToKKwkgKgorCSAqICBFaXRoZXIsCisJICogICAgICBkcF9vZnMgPSAwIGFuZCBkcF9zZyBpcyB0aGUgaW5kZXggb2YgdGhlIHNnIGVudHJ5CisJICogICAgICB0aGUgZGF0YSBwb2ludGVyIGJlbG9uZ3MgdG8gKG9yIHRoZSBlbmQgb2YgdGhlIGRhdGEpCisJICogIE9yLAorCSAqICAgICAgZHBfb2ZzIDwgMCBhbmQgZHBfc2cgaXMgdGhlIGluZGV4IG9mIHRoZSBzZyBlbnRyeSAKKwkgKiAgICAgIHRoZSBkYXRhIHBvaW50ZXIgYmVsb25ncyB0byArIDEuCisJICovCisJaWYgKGRwX29mcyA8IDApIHsKKwkJaW50IG47CisJCXdoaWxlIChkcF9zZyA+IGRwX3NnbWluKSB7CisJCQktLWRwX3NnOworCQkJdG1wID0gc2NyX3RvX2NwdShjcC0+cGh5cy5kYXRhW2RwX3NnXS5zaXplKTsKKwkJCW4gPSBkcF9vZnMgKyAodG1wICYgMHhmZmZmZmYpOworCQkJaWYgKG4gPiAwKSB7CisJCQkJKytkcF9zZzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRwX29mcyA9IG47CisJCX0KKwl9CisJZWxzZSBpZiAoZHBfb2ZzID4gMCkgeworCQl3aGlsZSAoZHBfc2cgPCBTWU1fQ09ORl9NQVhfU0cpIHsKKwkJCXRtcCA9IHNjcl90b19jcHUoY3AtPnBoeXMuZGF0YVtkcF9zZ10uc2l6ZSk7CisJCQlkcF9vZnMgLT0gKHRtcCAmIDB4ZmZmZmZmKTsKKwkJCSsrZHBfc2c7CisJCQlpZiAoZHBfb2ZzIDw9IDApCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqICBNYWtlIHN1cmUgdGhlIGRhdGEgcG9pbnRlciBpcyBpbnNpZGUgdGhlIGRhdGEgYXJlYS4KKwkgKiAgSWYgbm90LCByZXR1cm4gc29tZSBlcnJvci4KKwkgKi8KKwlpZgkoZHBfc2cgPCBkcF9zZ21pbiB8fCAoZHBfc2cgPT0gZHBfc2dtaW4gJiYgZHBfb2ZzIDwgMCkpCisJCWdvdG8gb3V0X2VycjsKKwllbHNlIGlmCShkcF9zZyA+IFNZTV9DT05GX01BWF9TRyB8fAorCQkgKGRwX3NnID09IFNZTV9DT05GX01BWF9TRyAmJiBkcF9vZnMgPiAwKSkKKwkJZ290byBvdXRfZXJyOworCisJLyoKKwkgKiAgU2F2ZSB0aGUgZXh0cmVtZSBwb2ludGVyIGlmIG5lZWRlZC4KKwkgKi8KKwlpZiAoZHBfc2cgPiBjcC0+ZXh0X3NnIHx8CisgICAgICAgICAgICAoZHBfc2cgPT0gY3AtPmV4dF9zZyAmJiBkcF9vZnMgPiBjcC0+ZXh0X29mcykpIHsKKwkJY3AtPmV4dF9zZyAgPSBkcF9zZzsKKwkJY3AtPmV4dF9vZnMgPSBkcF9vZnM7CisJfQorCisJLyoKKwkgKiAgUmV0dXJuIGRhdGEuCisJICovCisJKm9mcyA9IGRwX29mczsKKwlyZXR1cm4gZHBfc2c7CisKK291dF9lcnI6CisJcmV0dXJuIC0xOworfQorCisvKgorICogIGNoaXAgaGFuZGxlciBmb3IgTU9ESUZZIERBVEEgUE9JTlRFUiBNRVNTQUdFCisgKgorICogIFdlIGFsc28gY2FsbCB0aGlzIGZ1bmN0aW9uIG9uIElHTk9SRSBXSURFIFJFU0lEVUUgCisgKiAgbWVzc2FnZXMgdGhhdCBkbyBub3QgbWF0Y2ggYSBTV0lERSBmdWxsIGNvbmRpdGlvbi4KKyAqICBCdHcsIHdlIGFzc3VtZSBpbiB0aGF0IHNpdHVhdGlvbiB0aGF0IHN1Y2ggYSBtZXNzYWdlIAorICogIGlzIGVxdWl2YWxlbnQgdG8gYSBNT0RJRlkgREFUQSBQT0lOVEVSIChvZmZzZXQ9LTEpLgorICovCisKK3N0YXRpYyB2b2lkIHN5bV9tb2RpZnlfZHAoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX3RjYiAqdHAsIHN0cnVjdCBzeW1fY2NiICpjcCwgaW50IG9mcykKK3sKKwlpbnQgZHBfb2ZzCT0gb2ZzOworCXUzMglkcF9zY3IJPSBzeW1fZ2V0X3NjcmlwdF9kcCAobnAsIGNwKTsKKwl1MzIJZHBfcmV0OworCXUzMgl0bXA7CisJdV9jaGFyCWhmbGFnczsKKwlpbnQJZHBfc2c7CisJc3RydWN0CXN5bV9wbWMgKnBtOworCisJLyoKKwkgKiAgTm90IHN1cHBvcnRlZCBmb3IgYXV0by1zZW5zZS4KKwkgKi8KKwlpZiAoY3AtPmhvc3RfZmxhZ3MgJiBIRl9TRU5TRSkKKwkJZ290byBvdXRfcmVqZWN0OworCisJLyoKKwkgKiAgQXBwbHkgb3VyIGFsY2hlbXk6KSAoc2VlIGNvbW1lbnRzIGluIHN5bV9ldmFsdWF0ZV9kcCgpKSwgCisJICogIHRvIHRoZSByZXN1bHRlZCBkYXRhIHBvaW50ZXIuCisJICovCisJZHBfc2cgPSBzeW1fZXZhbHVhdGVfZHAobnAsIGNwLCBkcF9zY3IsICZkcF9vZnMpOworCWlmIChkcF9zZyA8IDApCisJCWdvdG8gb3V0X3JlamVjdDsKKworCS8qCisJICogIEFuZCBvdXIgYWxjaGVteTopIGFsbG93cyB0byBlYXNpbHkgY2FsY3VsYXRlIHRoZSBkYXRhIAorCSAqICBzY3JpcHQgYWRkcmVzcyB3ZSB3YW50IHRvIHJldHVybiBmb3IgdGhlIG5leHQgZGF0YSBwaGFzZS4KKwkgKi8KKwlkcF9yZXQgPSBjcHVfdG9fc2NyKHN5bV9nb2FscChjcCkpOworCWRwX3JldCA9IGRwX3JldCAtIDggLSAoU1lNX0NPTkZfTUFYX1NHIC0gZHBfc2cpICogKDIqNCk7CisKKwkvKgorCSAqICBJZiBvZmZzZXQgLyBzY2F0dGVyIGVudHJ5IGlzIHplcm8gd2UgZG9ubm90IG5lZWQgCisJICogIGEgY29udGV4dCBmb3IgdGhlIG5ldyBjdXJyZW50IGRhdGEgcG9pbnRlci4KKwkgKi8KKwlpZiAoZHBfb2ZzID09IDApIHsKKwkJZHBfc2NyID0gZHBfcmV0OworCQlnb3RvIG91dF9vazsKKwl9CisKKwkvKgorCSAqICBHZXQgYSBjb250ZXh0IGZvciB0aGUgbmV3IGN1cnJlbnQgZGF0YSBwb2ludGVyLgorCSAqLworCWhmbGFncyA9IElOQihucCwgSEZfUFJUKTsKKworCWlmIChoZmxhZ3MgJiBIRl9EUF9TQVZFRCkKKwkJaGZsYWdzIF49IEhGX0FDVF9QTTsKKworCWlmICghKGhmbGFncyAmIEhGX0FDVF9QTSkpIHsKKwkJcG0gID0gJmNwLT5waHlzLnBtMDsKKwkJZHBfc2NyID0gU0NSSVBUQV9CQShucCwgcG0wX2RhdGEpOworCX0KKwllbHNlIHsKKwkJcG0gPSAmY3AtPnBoeXMucG0xOworCQlkcF9zY3IgPSBTQ1JJUFRBX0JBKG5wLCBwbTFfZGF0YSk7CisJfQorCisJaGZsYWdzICY9IH4oSEZfRFBfU0FWRUQpOworCisJT1VUQihucCwgSEZfUFJULCBoZmxhZ3MpOworCisJLyoKKwkgKiAgU2V0IHVwIHRoZSBuZXcgY3VycmVudCBkYXRhIHBvaW50ZXIuCisJICogIG9mcyA8IDAgdGhlcmUsIGFuZCBmb3IgdGhlIG5leHQgZGF0YSBwaGFzZSwgd2UgCisJICogIHdhbnQgdG8gdHJhbnNmZXIgcGFydCBvZiB0aGUgZGF0YSBvZiB0aGUgc2cgZW50cnkgCisJICogIGNvcnJlc3BvbmRpbmcgdG8gaW5kZXggZHBfc2ctMSBwcmlvciB0byByZXR1cm5pbmcgCisJICogIHRvIHRoZSBtYWluIGRhdGEgc2NyaXB0LgorCSAqLworCXBtLT5yZXQgPSBjcHVfdG9fc2NyKGRwX3JldCk7CisJdG1wICA9IHNjcl90b19jcHUoY3AtPnBoeXMuZGF0YVtkcF9zZy0xXS5hZGRyKTsKKwl0bXAgKz0gc2NyX3RvX2NwdShjcC0+cGh5cy5kYXRhW2RwX3NnLTFdLnNpemUpICsgZHBfb2ZzOworCXBtLT5zZy5hZGRyID0gY3B1X3RvX3Njcih0bXApOworCXBtLT5zZy5zaXplID0gY3B1X3RvX3NjcigtZHBfb2ZzKTsKKworb3V0X29rOgorCXN5bV9zZXRfc2NyaXB0X2RwIChucCwgY3AsIGRwX3Njcik7CisJT1VUTF9EU1AobnAsIFNDUklQVEFfQkEobnAsIGNscmFjaykpOworCXJldHVybjsKKworb3V0X3JlamVjdDoKKwlPVVRMX0RTUChucCwgU0NSSVBUQl9CQShucCwgbXNnX2JhZCkpOworfQorCisKKy8qCisgKiAgY2hpcCBjYWxjdWxhdGlvbiBvZiB0aGUgZGF0YSByZXNpZHVhbC4KKyAqCisgKiAgQXMgSSB1c2VkIHRvIHNheSwgdGhlIHJlcXVpcmVtZW50IG9mIGRhdGEgcmVzaWR1YWwgCisgKiAgaW4gU0NTSSBpcyBicm9rZW4sIHVzZWxlc3MgYW5kIGNhbm5vdCBiZSBhY2hpZXZlZCAKKyAqICB3aXRob3V0IGh1Z2UgY29tcGxleGl0eS4KKyAqICBCdXQgbW9zdCBPU2VzIGFuZCBldmVuIHRoZSBvZmZpY2lhbCBDQU0gcmVxdWlyZSBpdC4KKyAqICBXaGVuIHN0dXBpZGl0eSBoYXBwZW5zIHRvIGJlIHNvIHdpZGVseSBzcHJlYWQgaW5zaWRlIAorICogIGEgY29tbXVuaXR5LCBpdCBnZXRzIGhhcmQgdG8gY29udmluY2UuCisgKgorICogIEFueXdheSwgSSBkb24ndCBjYXJlLCBzaW5jZSBJIGFtIG5vdCBnb2luZyB0byB1c2UgCisgKiAgYW55IHNvZnR3YXJlIHRoYXQgY29uc2lkZXJzIHRoaXMgZGF0YSByZXNpZHVhbCBhcyAKKyAqICBhIHJlbGV2YW50IGluZm9ybWF0aW9uLiA6KQorICovCisKK2ludCBzeW1fY29tcHV0ZV9yZXNpZHVhbChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fY2NiICpjcCkKK3sKKwlpbnQgZHBfc2csIGRwX3NnbWluLCByZXNpZCA9IDA7CisJaW50IGRwX29mcyA9IDA7CisKKwkvKgorCSAqICBDaGVjayBmb3Igc29tZSBkYXRhIGxvc3Qgb3IganVzdCB0aHJvd24gYXdheS4KKwkgKiAgV2UgYXJlIG5vdCByZXF1aXJlZCB0byBiZSBxdWl0ZSBhY2N1cmF0ZSBpbiB0aGlzIAorCSAqICBzaXR1YXRpb24uIEJ0dywgaWYgd2UgYXJlIG9kZCBmb3Igb3V0cHV0IGFuZCB0aGUgCisJICogIGRldmljZSBjbGFpbXMgc29tZSBtb3JlIGRhdGEsIGl0IG1heSB3ZWxsIGhhcHBlbiAKKwkgKiAgdGhhbiBvdXIgcmVzaWR1YWwgYmUgemVyby4gOi0pCisJICovCisJaWYgKGNwLT54ZXJyX3N0YXR1cyAmIChYRV9FWFRSQV9EQVRBfFhFX1NPRExfVU5SVU58WEVfU1dJREVfT1ZSVU4pKSB7CisJCWlmIChjcC0+eGVycl9zdGF0dXMgJiBYRV9FWFRSQV9EQVRBKQorCQkJcmVzaWQgLT0gY3AtPmV4dHJhX2J5dGVzOworCQlpZiAoY3AtPnhlcnJfc3RhdHVzICYgWEVfU09ETF9VTlJVTikKKwkJCSsrcmVzaWQ7CisJCWlmIChjcC0+eGVycl9zdGF0dXMgJiBYRV9TV0lERV9PVlJVTikKKwkJCS0tcmVzaWQ7CisJfQorCisJLyoKKwkgKiAgSWYgYWxsIGRhdGEgaGFzIGJlZW4gdHJhbnNmZXJyZWQsCisJICogIHRoZXJlIGlzIG5vIHJlc2lkdWFsLgorCSAqLworCWlmIChjcC0+cGh5cy5oZWFkLmxhc3RwID09IHN5bV9nb2FscChjcCkpCisJCXJldHVybiByZXNpZDsKKworCS8qCisJICogIElmIG5vIGRhdGEgdHJhbnNmZXIgb2NjdXJzLCBvciBpZiB0aGUgZGF0YQorCSAqICBwb2ludGVyIGlzIHdlaXJkLCByZXR1cm4gZnVsbCByZXNpZHVhbC4KKwkgKi8KKwlpZiAoY3AtPnN0YXJ0cCA9PSBjcC0+cGh5cy5oZWFkLmxhc3RwIHx8CisJICAgIHN5bV9ldmFsdWF0ZV9kcChucCwgY3AsIHNjcl90b19jcHUoY3AtPnBoeXMuaGVhZC5sYXN0cCksCisJCQkgICAgJmRwX29mcykgPCAwKSB7CisJCXJldHVybiBjcC0+ZGF0YV9sZW47CisJfQorCisJLyoKKwkgKiAgSWYgd2Ugd2VyZSBhdXRvLXNlbnNpbmcsIHRoZW4gd2UgYXJlIGRvbmUuCisJICovCisJaWYgKGNwLT5ob3N0X2ZsYWdzICYgSEZfU0VOU0UpIHsKKwkJcmV0dXJuIC1kcF9vZnM7CisJfQorCisJLyoKKwkgKiAgV2UgYXJlIG5vdyBmdWxsIGNvbWZvcnRhYmxlIGluIHRoZSBjb21wdXRhdGlvbiAKKwkgKiAgb2YgdGhlIGRhdGEgcmVzaWR1YWwgKDIncyBjb21wbGVtZW50KS4KKwkgKi8KKwlkcF9zZ21pbiA9IFNZTV9DT05GX01BWF9TRyAtIGNwLT5zZWdtZW50czsKKwlyZXNpZCA9IC1jcC0+ZXh0X29mczsKKwlmb3IgKGRwX3NnID0gY3AtPmV4dF9zZzsgZHBfc2cgPCBTWU1fQ09ORl9NQVhfU0c7ICsrZHBfc2cpIHsKKwkJdV9pbnQgdG1wID0gc2NyX3RvX2NwdShjcC0+cGh5cy5kYXRhW2RwX3NnXS5zaXplKTsKKwkJcmVzaWQgKz0gKHRtcCAmIDB4ZmZmZmZmKTsKKwl9CisKKwkvKgorCSAqICBIb3BlZnVsbHksIHRoZSByZXN1bHQgaXMgbm90IHRvbyB3cm9uZy4KKwkgKi8KKwlyZXR1cm4gcmVzaWQ7Cit9CisKKy8qCisgKiAgTmVnb3RpYXRpb24gZm9yIFdJREUgYW5kIFNZTkNIUk9OT1VTIERBVEEgVFJBTlNGRVIuCisgKgorICogIFdoZW4gd2UgdHJ5IHRvIG5lZ290aWF0ZSwgd2UgYXBwZW5kIHRoZSBuZWdvdGlhdGlvbiBtZXNzYWdlCisgKiAgdG8gdGhlIGlkZW50aWZ5IGFuZCAobWF5YmUpIHNpbXBsZSB0YWcgbWVzc2FnZS4KKyAqICBUaGUgaG9zdCBzdGF0dXMgZmllbGQgaXMgc2V0IHRvIEhTX05FR09USUFURSB0byBtYXJrIHRoaXMKKyAqICBzaXR1YXRpb24uCisgKgorICogIElmIHRoZSB0YXJnZXQgZG9lc24ndCBhbnN3ZXIgdGhpcyBtZXNzYWdlIGltbWVkaWF0ZWx5CisgKiAgKGFzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZCksIHRoZSBTSVJfTkVHT19GQUlMRUQgaW50ZXJydXB0CisgKiAgd2lsbCBiZSByYWlzZWQgZXZlbnR1YWxseS4KKyAqICBUaGUgaGFuZGxlciByZW1vdmVzIHRoZSBIU19ORUdPVElBVEUgc3RhdHVzLCBhbmQgc2V0cyB0aGUKKyAqICBuZWdvdGlhdGVkIHZhbHVlIHRvIHRoZSBkZWZhdWx0IChhc3luYyAvIG5vd2lkZSkuCisgKgorICogIElmIHdlIHJlY2VpdmUgYSBtYXRjaGluZyBhbnN3ZXIgaW1tZWRpYXRlbHksIHdlIGNoZWNrIGl0CisgKiAgZm9yIHZhbGlkaXR5LCBhbmQgc2V0IHRoZSB2YWx1ZXMuCisgKgorICogIElmIHdlIHJlY2VpdmUgYSBSZWplY3QgbWVzc2FnZSBpbW1lZGlhdGVseSwgd2UgYXNzdW1lIHRoZQorICogIG5lZ290aWF0aW9uIGhhcyBmYWlsZWQsIGFuZCBmYWxsIGJhY2sgdG8gc3RhbmRhcmQgdmFsdWVzLgorICoKKyAqICBJZiB3ZSByZWNlaXZlIGEgbmVnb3RpYXRpb24gbWVzc2FnZSB3aGlsZSBub3QgaW4gSFNfTkVHT1RJQVRFCisgKiAgc3RhdGUsIGl0J3MgYSB0YXJnZXQgaW5pdGlhdGVkIG5lZ290aWF0aW9uLiBXZSBwcmVwYXJlIGEKKyAqICAoaG9wZWZ1bGx5KSB2YWxpZCBhbnN3ZXIsIHNldCBvdXIgcGFyYW1ldGVycywgYW5kIHNlbmQgYmFjayAKKyAqICB0aGlzIGFuc3dlciB0byB0aGUgdGFyZ2V0LgorICoKKyAqICBJZiB0aGUgdGFyZ2V0IGRvZXNuJ3QgZmV0Y2ggdGhlIGFuc3dlciAobm8gbWVzc2FnZSBvdXQgcGhhc2UpLAorICogIHdlIGFzc3VtZSB0aGUgbmVnb3RpYXRpb24gaGFzIGZhaWxlZCwgYW5kIGZhbGwgYmFjayB0byBkZWZhdWx0CisgKiAgc2V0dGluZ3MgKFNJUl9ORUdPX1BST1RPIGludGVycnVwdCkuCisgKgorICogIFdoZW4gd2Ugc2V0IHRoZSB2YWx1ZXMsIHdlIGFkanVzdCB0aGVtIGluIGFsbCBjY2JzIGJlbG9uZ2luZyAKKyAqICB0byB0aGlzIHRhcmdldCwgaW4gdGhlIGNvbnRyb2xsZXIncyByZWdpc3RlciwgYW5kIGluIHRoZSAicGh5cyIKKyAqICBmaWVsZCBvZiB0aGUgY29udHJvbGxlcidzIHN0cnVjdCBzeW1faGNiLgorICovCisKKy8qCisgKiAgY2hpcCBoYW5kbGVyIGZvciBTWU5DSFJPTk9VUyBEQVRBIFRSQU5TRkVSIFJFUVVFU1QgKFNEVFIpIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyBpbnQgIAorc3ltX3N5bmNfbmVnb19jaGVjayhzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCByZXEsIHN0cnVjdCBzeW1fY2NiICpjcCkKK3sKKwlpbnQgdGFyZ2V0ID0gY3AtPnRhcmdldDsKKwl1X2NoYXIJY2hnLCBvZnMsIHBlciwgZmFrLCBkaXY7CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19ORUdPKSB7CisJCXN5bV9wcmludF9uZWdvX21zZyhucCwgdGFyZ2V0LCAic3luYyBtc2dpbiIsIG5wLT5tc2dpbik7CisJfQorCisJLyoKKwkgKiAgR2V0IHJlcXVlc3RlZCB2YWx1ZXMuCisJICovCisJY2hnID0gMDsKKwlwZXIgPSBucC0+bXNnaW5bM107CisJb2ZzID0gbnAtPm1zZ2luWzRdOworCisJLyoKKwkgKiAgQ2hlY2sgdmFsdWVzIGFnYWluc3Qgb3VyIGxpbWl0cy4KKwkgKi8KKwlpZiAob2ZzKSB7CisJCWlmIChvZnMgPiBucC0+bWF4b2ZmcykKKwkJCXtjaGcgPSAxOyBvZnMgPSBucC0+bWF4b2Zmczt9CisJfQorCisJaWYgKG9mcykgeworCQlpZiAocGVyIDwgbnAtPm1pbnN5bmMpCisJCQl7Y2hnID0gMTsgcGVyID0gbnAtPm1pbnN5bmM7fQorCX0KKworCS8qCisJICogIEdldCBuZXcgY2hpcCBzeW5jaHJvbm91cyBwYXJhbWV0ZXJzIHZhbHVlLgorCSAqLworCWRpdiA9IGZhayA9IDA7CisJaWYgKG9mcyAmJiBzeW1fZ2V0c3luYyhucCwgMCwgcGVyLCAmZGl2LCAmZmFrKSA8IDApCisJCWdvdG8gcmVqZWN0X2l0OworCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfTkVHTykgeworCQlzeW1fcHJpbnRfYWRkcihjcC0+Y21kLAorCQkJCSJzZHRyOiBvZnM9JWQgcGVyPSVkIGRpdj0lZCBmYWs9JWQgY2hnPSVkLlxuIiwKKwkJCQlvZnMsIHBlciwgZGl2LCBmYWssIGNoZyk7CisJfQorCisJLyoKKwkgKiAgSWYgaXQgd2FzIGFuIGFuc3dlciB3ZSB3YW50IHRvIGNoYW5nZSwgCisJICogIHRoZW4gaXQgaXNuJ3QgYWNjZXB0YWJsZS4gUmVqZWN0IGl0LgorCSAqLworCWlmICghcmVxICYmIGNoZykKKwkJZ290byByZWplY3RfaXQ7CisKKwkvKgorCSAqICBBcHBseSBuZXcgdmFsdWVzLgorCSAqLworCXN5bV9zZXRzeW5jIChucCwgdGFyZ2V0LCBvZnMsIHBlciwgZGl2LCBmYWspOworCisJLyoKKwkgKiAgSXQgd2FzIGFuIGFuc3dlci4gV2UgYXJlIGRvbmUuCisJICovCisJaWYgKCFyZXEpCisJCXJldHVybiAwOworCisJLyoKKwkgKiAgSXQgd2FzIGEgcmVxdWVzdC4gUHJlcGFyZSBhbiBhbnN3ZXIgbWVzc2FnZS4KKwkgKi8KKwlucC0+bXNnb3V0WzBdID0gTV9FWFRFTkRFRDsKKwlucC0+bXNnb3V0WzFdID0gMzsKKwlucC0+bXNnb3V0WzJdID0gTV9YX1NZTkNfUkVROworCW5wLT5tc2dvdXRbM10gPSBwZXI7CisJbnAtPm1zZ291dFs0XSA9IG9mczsKKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX05FR08pIHsKKwkJc3ltX3ByaW50X25lZ29fbXNnKG5wLCB0YXJnZXQsICJzeW5jIG1zZ291dCIsIG5wLT5tc2dvdXQpOworCX0KKworCW5wLT5tc2dpbiBbMF0gPSBNX05PT1A7CisKKwlyZXR1cm4gMDsKKworcmVqZWN0X2l0OgorCXN5bV9zZXRzeW5jIChucCwgdGFyZ2V0LCAwLCAwLCAwLCAwKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHN5bV9zeW5jX25lZ28oc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX3RjYiAqdHAsIHN0cnVjdCBzeW1fY2NiICpjcCkKK3sKKwlpbnQgcmVxID0gMTsKKwlpbnQgcmVzdWx0OworCisJLyoKKwkgKiAgUmVxdWVzdCBvciBhbnN3ZXIgPworCSAqLworCWlmIChJTkIobnAsIEhTX1BSVCkgPT0gSFNfTkVHT1RJQVRFKSB7CisJCU9VVEIobnAsIEhTX1BSVCwgSFNfQlVTWSk7CisJCWlmIChjcC0+bmVnb19zdGF0dXMgJiYgY3AtPm5lZ29fc3RhdHVzICE9IE5TX1NZTkMpCisJCQlnb3RvIHJlamVjdF9pdDsKKwkJcmVxID0gMDsKKwl9CisKKwkvKgorCSAqICBDaGVjayBhbmQgYXBwbHkgbmV3IHZhbHVlcy4KKwkgKi8KKwlyZXN1bHQgPSBzeW1fc3luY19uZWdvX2NoZWNrKG5wLCByZXEsIGNwKTsKKwlpZiAocmVzdWx0KQkvKiBOb3QgYWNjZXB0YWJsZSwgcmVqZWN0IGl0ICovCisJCWdvdG8gcmVqZWN0X2l0OworCWlmIChyZXEpIHsJLyogV2FzIGEgcmVxdWVzdCwgc2VuZCByZXNwb25zZS4gKi8KKwkJY3AtPm5lZ29fc3RhdHVzID0gTlNfU1lOQzsKKwkJT1VUTF9EU1AobnAsIFNDUklQVEJfQkEobnAsIHNkdHJfcmVzcCkpOworCX0KKwllbHNlCQkvKiBXYXMgYSByZXNwb25zZSwgd2UgYXJlIGRvbmUuICovCisJCU9VVExfRFNQKG5wLCBTQ1JJUFRBX0JBKG5wLCBjbHJhY2spKTsKKwlyZXR1cm47CisKK3JlamVjdF9pdDoKKwlPVVRMX0RTUChucCwgU0NSSVBUQl9CQShucCwgbXNnX2JhZCkpOworfQorCisvKgorICogIGNoaXAgaGFuZGxlciBmb3IgUEFSQUxMRUwgUFJPVE9DT0wgUkVRVUVTVCAoUFBSKSBtZXNzYWdlLgorICovCitzdGF0aWMgaW50IAorc3ltX3Bwcl9uZWdvX2NoZWNrKHN0cnVjdCBzeW1faGNiICpucCwgaW50IHJlcSwgaW50IHRhcmdldCkKK3sKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSAmbnAtPnRhcmdldFt0YXJnZXRdOworCXVuc2lnbmVkIGNoYXIgZmFrLCBkaXY7CisJaW50IGR0LCBjaGcgPSAwOworCisJdW5zaWduZWQgY2hhciBwZXIgPSBucC0+bXNnaW5bM107CisJdW5zaWduZWQgY2hhciBvZnMgPSBucC0+bXNnaW5bNV07CisJdW5zaWduZWQgY2hhciB3aWRlID0gbnAtPm1zZ2luWzZdOworCXVuc2lnbmVkIGNoYXIgb3B0cyA9IG5wLT5tc2dpbls3XSAmIFBQUl9PUFRfTUFTSzsKKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX05FR08pIHsKKwkJc3ltX3ByaW50X25lZ29fbXNnKG5wLCB0YXJnZXQsICJwcHIgbXNnaW4iLCBucC0+bXNnaW4pOworCX0KKworCS8qCisJICogIENoZWNrIHZhbHVlcyBhZ2FpbnN0IG91ciBsaW1pdHMuCisJICovCisJaWYgKHdpZGUgPiBucC0+bWF4d2lkZSkgeworCQljaGcgPSAxOworCQl3aWRlID0gbnAtPm1heHdpZGU7CisJfQorCWlmICghd2lkZSB8fCAhKG5wLT5mZWF0dXJlcyAmIEZFX1UzRU4pKQorCQlvcHRzID0gMDsKKworCWlmIChvcHRzICE9IChucC0+bXNnaW5bN10gJiBQUFJfT1BUX01BU0spKQorCQljaGcgPSAxOworCisJZHQgPSBvcHRzICYgUFBSX09QVF9EVDsKKworCWlmIChvZnMpIHsKKwkJdW5zaWduZWQgY2hhciBtYXhvZmZzID0gZHQgPyBucC0+bWF4b2Zmc19kdCA6IG5wLT5tYXhvZmZzOworCQlpZiAob2ZzID4gbWF4b2ZmcykgeworCQkJY2hnID0gMTsKKwkJCW9mcyA9IG1heG9mZnM7CisJCX0KKwl9CisKKwlpZiAob2ZzKSB7CisJCXVuc2lnbmVkIGNoYXIgbWluc3luYyA9IGR0ID8gbnAtPm1pbnN5bmNfZHQgOiBucC0+bWluc3luYzsKKwkJaWYgKHBlciA8IG1pbnN5bmMpIHsKKwkJCWNoZyA9IDE7CisJCQlwZXIgPSBtaW5zeW5jOworCQl9CisJfQorCisJLyoKKwkgKiAgR2V0IG5ldyBjaGlwIHN5bmNocm9ub3VzIHBhcmFtZXRlcnMgdmFsdWUuCisJICovCisJZGl2ID0gZmFrID0gMDsKKwlpZiAob2ZzICYmIHN5bV9nZXRzeW5jKG5wLCBkdCwgcGVyLCAmZGl2LCAmZmFrKSA8IDApCisJCWdvdG8gcmVqZWN0X2l0OworCisJLyoKKwkgKiAgSWYgaXQgd2FzIGFuIGFuc3dlciB3ZSB3YW50IHRvIGNoYW5nZSwgCisJICogIHRoZW4gaXQgaXNuJ3QgYWNjZXB0YWJsZS4gUmVqZWN0IGl0LgorCSAqLworCWlmICghcmVxICYmIGNoZykKKwkJZ290byByZWplY3RfaXQ7CisKKwkvKgorCSAqICBBcHBseSBuZXcgdmFsdWVzLgorCSAqLworCXN5bV9zZXRwcHJvdChucCwgdGFyZ2V0LCBvcHRzLCBvZnMsIHBlciwgd2lkZSwgZGl2LCBmYWspOworCisJLyoKKwkgKiAgSXQgd2FzIGFuIGFuc3dlci4gV2UgYXJlIGRvbmUuCisJICovCisJaWYgKCFyZXEpCisJCXJldHVybiAwOworCisJLyoKKwkgKiAgSXQgd2FzIGEgcmVxdWVzdC4gUHJlcGFyZSBhbiBhbnN3ZXIgbWVzc2FnZS4KKwkgKi8KKwlucC0+bXNnb3V0WzBdID0gTV9FWFRFTkRFRDsKKwlucC0+bXNnb3V0WzFdID0gNjsKKwlucC0+bXNnb3V0WzJdID0gTV9YX1BQUl9SRVE7CisJbnAtPm1zZ291dFszXSA9IHBlcjsKKwlucC0+bXNnb3V0WzRdID0gMDsKKwlucC0+bXNnb3V0WzVdID0gb2ZzOworCW5wLT5tc2dvdXRbNl0gPSB3aWRlOworCW5wLT5tc2dvdXRbN10gPSBvcHRzOworCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfTkVHTykgeworCQlzeW1fcHJpbnRfbmVnb19tc2cobnAsIHRhcmdldCwgInBwciBtc2dvdXQiLCBucC0+bXNnb3V0KTsKKwl9CisKKwlucC0+bXNnaW4gWzBdID0gTV9OT09QOworCisJcmV0dXJuIDA7CisKK3JlamVjdF9pdDoKKwlzeW1fc2V0cHByb3QgKG5wLCB0YXJnZXQsIDAsIDAsIDAsIDAsIDAsIDApOworCS8qCisJICogIElmIGl0IGlzIGEgZGV2aWNlIHJlc3BvbnNlIHRoYXQgc2hvdWxkIHJlc3VsdCBpbiAgCisJICogIFNULCB3ZSBtYXkgd2FudCB0byB0cnkgYSBsZWdhY3kgbmVnb3RpYXRpb24gbGF0ZXIuCisJICovCisJaWYgKCFyZXEgJiYgIW9wdHMpIHsKKwkJdHAtPnRnb2FsLnBlcmlvZCA9IHBlcjsKKwkJdHAtPnRnb2FsLm9mZnNldCA9IG9mczsKKwkJdHAtPnRnb2FsLndpZHRoID0gd2lkZTsKKwkJdHAtPnRnb2FsLml1ID0gdHAtPnRnb2FsLmR0ID0gdHAtPnRnb2FsLnFhcyA9IDA7CisJCXRwLT50Z29hbC5jaGVja19uZWdvID0gMTsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBzeW1fcHByX25lZ28oc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX3RjYiAqdHAsIHN0cnVjdCBzeW1fY2NiICpjcCkKK3sKKwlpbnQgcmVxID0gMTsKKwlpbnQgcmVzdWx0OworCisJLyoKKwkgKiAgUmVxdWVzdCBvciBhbnN3ZXIgPworCSAqLworCWlmIChJTkIobnAsIEhTX1BSVCkgPT0gSFNfTkVHT1RJQVRFKSB7CisJCU9VVEIobnAsIEhTX1BSVCwgSFNfQlVTWSk7CisJCWlmIChjcC0+bmVnb19zdGF0dXMgJiYgY3AtPm5lZ29fc3RhdHVzICE9IE5TX1BQUikKKwkJCWdvdG8gcmVqZWN0X2l0OworCQlyZXEgPSAwOworCX0KKworCS8qCisJICogIENoZWNrIGFuZCBhcHBseSBuZXcgdmFsdWVzLgorCSAqLworCXJlc3VsdCA9IHN5bV9wcHJfbmVnb19jaGVjayhucCwgcmVxLCBjcC0+dGFyZ2V0KTsKKwlpZiAocmVzdWx0KQkvKiBOb3QgYWNjZXB0YWJsZSwgcmVqZWN0IGl0ICovCisJCWdvdG8gcmVqZWN0X2l0OworCWlmIChyZXEpIHsJLyogV2FzIGEgcmVxdWVzdCwgc2VuZCByZXNwb25zZS4gKi8KKwkJY3AtPm5lZ29fc3RhdHVzID0gTlNfUFBSOworCQlPVVRMX0RTUChucCwgU0NSSVBUQl9CQShucCwgcHByX3Jlc3ApKTsKKwl9CisJZWxzZQkJLyogV2FzIGEgcmVzcG9uc2UsIHdlIGFyZSBkb25lLiAqLworCQlPVVRMX0RTUChucCwgU0NSSVBUQV9CQShucCwgY2xyYWNrKSk7CisJcmV0dXJuOworCityZWplY3RfaXQ6CisJT1VUTF9EU1AobnAsIFNDUklQVEJfQkEobnAsIG1zZ19iYWQpKTsKK30KKworLyoKKyAqICBjaGlwIGhhbmRsZXIgZm9yIFdJREUgREFUQSBUUkFOU0ZFUiBSRVFVRVNUIChXRFRSKSBtZXNzYWdlLgorICovCitzdGF0aWMgaW50ICAKK3N5bV93aWRlX25lZ29fY2hlY2soc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgcmVxLCBzdHJ1Y3Qgc3ltX2NjYiAqY3ApCit7CisJaW50IHRhcmdldCA9IGNwLT50YXJnZXQ7CisJdV9jaGFyCWNoZywgd2lkZTsKKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX05FR08pIHsKKwkJc3ltX3ByaW50X25lZ29fbXNnKG5wLCB0YXJnZXQsICJ3aWRlIG1zZ2luIiwgbnAtPm1zZ2luKTsKKwl9CisKKwkvKgorCSAqICBHZXQgcmVxdWVzdGVkIHZhbHVlcy4KKwkgKi8KKwljaGcgID0gMDsKKwl3aWRlID0gbnAtPm1zZ2luWzNdOworCisJLyoKKwkgKiAgQ2hlY2sgdmFsdWVzIGFnYWluc3Qgb3VyIGxpbWl0cy4KKwkgKi8KKwlpZiAod2lkZSA+IG5wLT5tYXh3aWRlKSB7CisJCWNoZyA9IDE7CisJCXdpZGUgPSBucC0+bWF4d2lkZTsKKwl9CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19ORUdPKSB7CisJCXN5bV9wcmludF9hZGRyKGNwLT5jbWQsICJ3ZHRyOiB3aWRlPSVkIGNoZz0lZC5cbiIsCisJCQkJd2lkZSwgY2hnKTsKKwl9CisKKwkvKgorCSAqICBJZiBpdCB3YXMgYW4gYW5zd2VyIHdlIHdhbnQgdG8gY2hhbmdlLCAKKwkgKiAgdGhlbiBpdCBpc24ndCBhY2NlcHRhYmxlLiBSZWplY3QgaXQuCisJICovCisJaWYgKCFyZXEgJiYgY2hnKQorCQlnb3RvIHJlamVjdF9pdDsKKworCS8qCisJICogIEFwcGx5IG5ldyB2YWx1ZXMuCisJICovCisJc3ltX3NldHdpZGUgKG5wLCB0YXJnZXQsIHdpZGUpOworCisJLyoKKwkgKiAgSXQgd2FzIGFuIGFuc3dlci4gV2UgYXJlIGRvbmUuCisJICovCisJaWYgKCFyZXEpCisJCXJldHVybiAwOworCisJLyoKKwkgKiAgSXQgd2FzIGEgcmVxdWVzdC4gUHJlcGFyZSBhbiBhbnN3ZXIgbWVzc2FnZS4KKwkgKi8KKwlucC0+bXNnb3V0WzBdID0gTV9FWFRFTkRFRDsKKwlucC0+bXNnb3V0WzFdID0gMjsKKwlucC0+bXNnb3V0WzJdID0gTV9YX1dJREVfUkVROworCW5wLT5tc2dvdXRbM10gPSB3aWRlOworCisJbnAtPm1zZ2luIFswXSA9IE1fTk9PUDsKKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX05FR08pIHsKKwkJc3ltX3ByaW50X25lZ29fbXNnKG5wLCB0YXJnZXQsICJ3aWRlIG1zZ291dCIsIG5wLT5tc2dvdXQpOworCX0KKworCXJldHVybiAwOworCityZWplY3RfaXQ6CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBzeW1fd2lkZV9uZWdvKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV90Y2IgKnRwLCBzdHJ1Y3Qgc3ltX2NjYiAqY3ApCit7CisJaW50IHJlcSA9IDE7CisJaW50IHJlc3VsdDsKKworCS8qCisJICogIFJlcXVlc3Qgb3IgYW5zd2VyID8KKwkgKi8KKwlpZiAoSU5CKG5wLCBIU19QUlQpID09IEhTX05FR09USUFURSkgeworCQlPVVRCKG5wLCBIU19QUlQsIEhTX0JVU1kpOworCQlpZiAoY3AtPm5lZ29fc3RhdHVzICYmIGNwLT5uZWdvX3N0YXR1cyAhPSBOU19XSURFKQorCQkJZ290byByZWplY3RfaXQ7CisJCXJlcSA9IDA7CisJfQorCisJLyoKKwkgKiAgQ2hlY2sgYW5kIGFwcGx5IG5ldyB2YWx1ZXMuCisJICovCisJcmVzdWx0ID0gc3ltX3dpZGVfbmVnb19jaGVjayhucCwgcmVxLCBjcCk7CisJaWYgKHJlc3VsdCkJLyogTm90IGFjY2VwdGFibGUsIHJlamVjdCBpdCAqLworCQlnb3RvIHJlamVjdF9pdDsKKwlpZiAocmVxKSB7CS8qIFdhcyBhIHJlcXVlc3QsIHNlbmQgcmVzcG9uc2UuICovCisJCWNwLT5uZWdvX3N0YXR1cyA9IE5TX1dJREU7CisJCU9VVExfRFNQKG5wLCBTQ1JJUFRCX0JBKG5wLCB3ZHRyX3Jlc3ApKTsKKwl9IGVsc2UgewkJLyogV2FzIGEgcmVzcG9uc2UuICovCisJCS8qCisJCSAqIE5lZ290aWF0ZSBmb3IgU1lOQyBpbW1lZGlhdGVseSBhZnRlciBXSURFIHJlc3BvbnNlLgorCQkgKiBUaGlzIGFsbG93cyB0byBuZWdvdGlhdGUgZm9yIGJvdGggV0lERSBhbmQgU1lOQyBvbiAKKwkJICogYSBzaW5nbGUgU0NTSSBjb21tYW5kIChTdWdnZXN0ZWQgYnkgSnVzdGluIEdpYmJzKS4KKwkJICovCisJCWlmICh0cC0+dGdvYWwub2Zmc2V0KSB7CisJCQlucC0+bXNnb3V0WzBdID0gTV9FWFRFTkRFRDsKKwkJCW5wLT5tc2dvdXRbMV0gPSAzOworCQkJbnAtPm1zZ291dFsyXSA9IE1fWF9TWU5DX1JFUTsKKwkJCW5wLT5tc2dvdXRbM10gPSB0cC0+dGdvYWwucGVyaW9kOworCQkJbnAtPm1zZ291dFs0XSA9IHRwLT50Z29hbC5vZmZzZXQ7CisKKwkJCWlmIChERUJVR19GTEFHUyAmIERFQlVHX05FR08pIHsKKwkJCQlzeW1fcHJpbnRfbmVnb19tc2cobnAsIGNwLT50YXJnZXQsCisJCQkJICAgICAgICAgICAgICAgICAgICJzeW5jIG1zZ291dCIsIG5wLT5tc2dvdXQpOworCQkJfQorCisJCQljcC0+bmVnb19zdGF0dXMgPSBOU19TWU5DOworCQkJT1VUQihucCwgSFNfUFJULCBIU19ORUdPVElBVEUpOworCQkJT1VUTF9EU1AobnAsIFNDUklQVEJfQkEobnAsIHNkdHJfcmVzcCkpOworCQkJcmV0dXJuOworCQl9IGVsc2UKKwkJCU9VVExfRFNQKG5wLCBTQ1JJUFRBX0JBKG5wLCBjbHJhY2spKTsKKwl9CisKKwlyZXR1cm47CisKK3JlamVjdF9pdDoKKwlPVVRMX0RTUChucCwgU0NSSVBUQl9CQShucCwgbXNnX2JhZCkpOworfQorCisvKgorICogIFJlc2V0IERULCBTWU5DIG9yIFdJREUgdG8gZGVmYXVsdCBzZXR0aW5ncy4KKyAqCisgKiAgQ2FsbGVkIHdoZW4gYSBuZWdvdGlhdGlvbiBkb2VzIG5vdCBzdWNjZWVkIGVpdGhlciAKKyAqICBvbiByZWplY3Rpb24gb3Igb24gcHJvdG9jb2wgZXJyb3IuCisgKgorICogIEEgdGFyZ2V0IHRoYXQgdW5kZXJzdGFuZHMgYSBQUFIgbWVzc2FnZSBzaG91bGQgbmV2ZXIgCisgKiAgcmVqZWN0IGl0LCBhbmQgbWVzc2luZyB3aXRoIGl0IGlzIHZlcnkgdW5saWtlbHkuCisgKiAgU28sIGlmIGEgUFBSIG1ha2VzIHByb2JsZW1zLCB3ZSBtYXkganVzdCB3YW50IHRvIAorICogIHRyeSBhIGxlZ2FjeSBuZWdvdGlhdGlvbiBsYXRlci4KKyAqLworc3RhdGljIHZvaWQgc3ltX25lZ29fZGVmYXVsdChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fdGNiICp0cCwgc3RydWN0IHN5bV9jY2IgKmNwKQoreworCXN3aXRjaCAoY3AtPm5lZ29fc3RhdHVzKSB7CisJY2FzZSBOU19QUFI6CisjaWYgMAorCQlzeW1fc2V0cHByb3QgKG5wLCBjcC0+dGFyZ2V0LCAwLCAwLCAwLCAwLCAwLCAwKTsKKyNlbHNlCisJCWlmICh0cC0+dGdvYWwucGVyaW9kIDwgbnAtPm1pbnN5bmMpCisJCQl0cC0+dGdvYWwucGVyaW9kID0gbnAtPm1pbnN5bmM7CisJCWlmICh0cC0+dGdvYWwub2Zmc2V0ID4gbnAtPm1heG9mZnMpCisJCQl0cC0+dGdvYWwub2Zmc2V0ID0gbnAtPm1heG9mZnM7CisJCXRwLT50Z29hbC5pdSA9IHRwLT50Z29hbC5kdCA9IHRwLT50Z29hbC5xYXMgPSAwOworCQl0cC0+dGdvYWwuY2hlY2tfbmVnbyA9IDE7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBOU19TWU5DOgorCQlzeW1fc2V0c3luYyAobnAsIGNwLT50YXJnZXQsIDAsIDAsIDAsIDApOworCQlicmVhazsKKwljYXNlIE5TX1dJREU6CisJCXN5bV9zZXR3aWRlIChucCwgY3AtPnRhcmdldCwgMCk7CisJCWJyZWFrOworCX0KKwlucC0+bXNnaW4gWzBdID0gTV9OT09QOworCW5wLT5tc2dvdXRbMF0gPSBNX05PT1A7CisJY3AtPm5lZ29fc3RhdHVzID0gMDsKK30KKworLyoKKyAqICBjaGlwIGhhbmRsZXIgZm9yIE1FU1NBR0UgUkVKRUNUIHJlY2VpdmVkIGluIHJlc3BvbnNlIHRvIAorICogIFBQUiwgV0lERSBvciBTWU5DSFJPTk9VUyBuZWdvdGlhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgc3ltX25lZ29fcmVqZWN0ZWQoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX3RjYiAqdHAsIHN0cnVjdCBzeW1fY2NiICpjcCkKK3sKKwlzeW1fbmVnb19kZWZhdWx0KG5wLCB0cCwgY3ApOworCU9VVEIobnAsIEhTX1BSVCwgSFNfQlVTWSk7Cit9CisKKy8qCisgKiAgY2hpcCBleGNlcHRpb24gaGFuZGxlciBmb3IgcHJvZ3JhbW1lZCBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgdm9pZCBzeW1faW50X3NpciAoc3RydWN0IHN5bV9oY2IgKm5wKQoreworCXVfY2hhcgludW0JPSBJTkIobnAsIG5jX2RzcHMpOworCXUzMglkc2EJPSBJTkwobnAsIG5jX2RzYSk7CisJc3RydWN0IHN5bV9jY2IgKmNwCT0gc3ltX2NjYl9mcm9tX2RzYShucCwgZHNhKTsKKwl1X2NoYXIJdGFyZ2V0CT0gSU5CKG5wLCBuY19zZGlkKSAmIDB4MGY7CisJc3RydWN0IHN5bV90Y2IgKnRwCT0gJm5wLT50YXJnZXRbdGFyZ2V0XTsKKwlpbnQJdG1wOworCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfVElOWSkgcHJpbnRmICgiSSMlZCIsIG51bSk7CisKKwlzd2l0Y2ggKG51bSkgeworI2lmICAgU1lNX0NPTkZfRE1BX0FERFJFU1NJTkdfTU9ERSA9PSAyCisJLyoKKwkgKiAgU0NSSVBUUyB0ZWxsIHVzIHRoYXQgd2UgbWF5IGhhdmUgdG8gdXBkYXRlIAorCSAqICA2NCBiaXQgRE1BIHNlZ21lbnQgcmVnaXN0ZXJzLgorCSAqLworCWNhc2UgU0lSX0RNQVBfRElSVFk6CisJCXN5bV91cGRhdGVfZG1hcF9yZWdzKG5wKTsKKwkJZ290byBvdXQ7CisjZW5kaWYKKwkvKgorCSAqICBDb21tYW5kIGhhcyBiZWVuIGNvbXBsZXRlZCB3aXRoIGVycm9yIGNvbmRpdGlvbiAKKwkgKiAgb3IgaGFzIGJlZW4gYXV0by1zZW5zZWQuCisJICovCisJY2FzZSBTSVJfQ09NUExFVEVfRVJST1I6CisJCXN5bV9jb21wbGV0ZV9lcnJvcihucCwgY3ApOworCQlyZXR1cm47CisJLyoKKwkgKiAgVGhlIEMgY29kZSBpcyBjdXJyZW50bHkgdHJ5aW5nIHRvIHJlY292ZXIgZnJvbSBzb21ldGhpbmcuCisJICogIFR5cGljYWxseSwgdXNlciB3YW50IHRvIGFib3J0IHNvbWUgY29tbWFuZC4KKwkgKi8KKwljYXNlIFNJUl9TQ1JJUFRfU1RPUFBFRDoKKwljYXNlIFNJUl9UQVJHRVRfU0VMRUNURUQ6CisJY2FzZSBTSVJfQUJPUlRfU0VOVDoKKwkJc3ltX3Npcl90YXNrX3JlY292ZXJ5KG5wLCBudW0pOworCQlyZXR1cm47CisJLyoKKwkgKiAgVGhlIGRldmljZSBkaWRuJ3QgZ28gdG8gTVNHIE9VVCBwaGFzZSBhZnRlciBoYXZpbmcgCisJICogIGJlZW4gc2VsZWN0ZWQgd2l0aCBBVE4uIFdlIGRvbm5vdCB3YW50IHRvIGhhbmRsZSAKKwkgKiAgdGhhdC4KKwkgKi8KKwljYXNlIFNJUl9TRUxfQVROX05PX01TR19PVVQ6CisJCXByaW50ZiAoIiVzOiVkOiBObyBNU0cgT1VUIHBoYXNlIGFmdGVyIHNlbGVjdGlvbiB3aXRoIEFUTi5cbiIsCisJCQlzeW1fbmFtZSAobnApLCB0YXJnZXQpOworCQlnb3RvIG91dF9zdHVjazsKKwkvKgorCSAqICBUaGUgZGV2aWNlIGRpZG4ndCBzd2l0Y2ggdG8gTVNHIElOIHBoYXNlIGFmdGVyIAorCSAqICBoYXZpbmcgcmVzZWxldGVkIHRoZSBpbml0aWF0b3IuCisJICovCisJY2FzZSBTSVJfUkVTRUxfTk9fTVNHX0lOOgorCQlwcmludGYgKCIlczolZDogTm8gTVNHIElOIHBoYXNlIGFmdGVyIHJlc2VsZWN0aW9uLlxuIiwKKwkJCXN5bV9uYW1lIChucCksIHRhcmdldCk7CisJCWdvdG8gb3V0X3N0dWNrOworCS8qCisJICogIEFmdGVyIHJlc2VsZWN0aW9uLCB0aGUgZGV2aWNlIHNlbnQgYSBtZXNzYWdlIHRoYXQgd2Fzbid0IAorCSAqICBhbiBJREVOVElGWS4KKwkgKi8KKwljYXNlIFNJUl9SRVNFTF9OT19JREVOVElGWToKKwkJcHJpbnRmICgiJXM6JWQ6IE5vIElERU5USUZZIGFmdGVyIHJlc2VsZWN0aW9uLlxuIiwKKwkJCXN5bV9uYW1lIChucCksIHRhcmdldCk7CisJCWdvdG8gb3V0X3N0dWNrOworCS8qCisJICogIFRoZSBkZXZpY2UgcmVzZWxlY3RlZCBhIExVTiB3ZSBkb25ub3Qga25vdyBhYm91dC4KKwkgKi8KKwljYXNlIFNJUl9SRVNFTF9CQURfTFVOOgorCQlucC0+bXNnb3V0WzBdID0gTV9SRVNFVDsKKwkJZ290byBvdXQ7CisJLyoKKwkgKiAgVGhlIGRldmljZSByZXNlbGVjdGVkIGZvciBhbiB1bnRhZ2dlZCBuZXh1cyBhbmQgd2UgCisJICogIGhhdmVuJ3QgYW55LgorCSAqLworCWNhc2UgU0lSX1JFU0VMX0JBRF9JX1RfTDoKKwkJbnAtPm1zZ291dFswXSA9IE1fQUJPUlQ7CisJCWdvdG8gb3V0OworCS8qCisJICogIFRoZSBkZXZpY2UgcmVzZWxlY3RlZCBmb3IgYSB0YWdnZWQgbmV4dXMgdGhhdCB3ZSBkb25ub3QgCisJICogIGhhdmUuCisJICovCisJY2FzZSBTSVJfUkVTRUxfQkFEX0lfVF9MX1E6CisJCW5wLT5tc2dvdXRbMF0gPSBNX0FCT1JUX1RBRzsKKwkJZ290byBvdXQ7CisJLyoKKwkgKiAgVGhlIFNDUklQVFMgbGV0IHVzIGtub3cgdGhhdCB0aGUgZGV2aWNlIGhhcyBncmFiYmVkIAorCSAqICBvdXIgbWVzc2FnZSBhbmQgd2lsbCBhYm9ydCB0aGUgam9iLgorCSAqLworCWNhc2UgU0lSX1JFU0VMX0FCT1JURUQ6CisJCW5wLT5sYXN0bXNnID0gbnAtPm1zZ291dFswXTsKKwkJbnAtPm1zZ291dFswXSA9IE1fTk9PUDsKKwkJcHJpbnRmICgiJXM6JWQ6IG1lc3NhZ2UgJXggc2VudCBvbiBiYWQgcmVzZWxlY3Rpb24uXG4iLAorCQkJc3ltX25hbWUgKG5wKSwgdGFyZ2V0LCBucC0+bGFzdG1zZyk7CisJCWdvdG8gb3V0OworCS8qCisJICogIFRoZSBTQ1JJUFRTIGxldCB1cyBrbm93IHRoYXQgYSBtZXNzYWdlIGhhcyBiZWVuIAorCSAqICBzdWNjZXNzZnVsbHkgc2VudCB0byB0aGUgZGV2aWNlLgorCSAqLworCWNhc2UgU0lSX01TR19PVVRfRE9ORToKKwkJbnAtPmxhc3Rtc2cgPSBucC0+bXNnb3V0WzBdOworCQlucC0+bXNnb3V0WzBdID0gTV9OT09QOworCQkvKiBTaG91bGQgd2UgcmVhbGx5IGNhcmUgb2YgdGhhdCAqLworCQlpZiAobnAtPmxhc3Rtc2cgPT0gTV9QQVJJVFkgfHwgbnAtPmxhc3Rtc2cgPT0gTV9JRF9FUlJPUikgeworCQkJaWYgKGNwKSB7CisJCQkJY3AtPnhlcnJfc3RhdHVzICY9IH5YRV9QQVJJVFlfRVJSOworCQkJCWlmICghY3AtPnhlcnJfc3RhdHVzKQorCQkJCQlPVVRPRkZCKG5wLCBIRl9QUlQsIEhGX0VYVF9FUlIpOworCQkJfQorCQl9CisJCWdvdG8gb3V0OworCS8qCisJICogIFRoZSBkZXZpY2UgZGlkbid0IHNlbmQgYSBHT09EIFNDU0kgc3RhdHVzLgorCSAqICBXZSBtYXkgaGF2ZSBzb21lIHdvcmsgdG8gZG8gcHJpb3IgdG8gYWxsb3cgCisJICogIHRoZSBTQ1JJUFRTIHByb2Nlc3NvciB0byBjb250aW51ZS4KKwkgKi8KKwljYXNlIFNJUl9CQURfU0NTSV9TVEFUVVM6CisJCWlmICghY3ApCisJCQlnb3RvIG91dDsKKwkJc3ltX3Npcl9iYWRfc2NzaV9zdGF0dXMobnAsIG51bSwgY3ApOworCQlyZXR1cm47CisJLyoKKwkgKiAgV2UgYXJlIGFza2VkIGJ5IHRoZSBTQ1JJUFRTIHRvIHByZXBhcmUgYSAKKwkgKiAgUkVKRUNUIG1lc3NhZ2UuCisJICovCisJY2FzZSBTSVJfUkVKRUNUX1RPX1NFTkQ6CisJCXN5bV9wcmludF9tc2coY3AsICJNX1JFSkVDVCB0byBzZW5kIGZvciAiLCBucC0+bXNnaW4pOworCQlucC0+bXNnb3V0WzBdID0gTV9SRUpFQ1Q7CisJCWdvdG8gb3V0OworCS8qCisJICogIFdlIGhhdmUgYmVlbiBPREQgYXQgdGhlIGVuZCBvZiBhIERBVEEgSU4gCisJICogIHRyYW5zZmVyIGFuZCB0aGUgZGV2aWNlIGRpZG4ndCBzZW5kIGEgCisJICogIElHTk9SRSBXSURFIFJFU0lEVUUgbWVzc2FnZS4KKwkgKiAgSXQgaXMgYSBkYXRhIG92ZXJydW4gY29uZGl0aW9uLgorCSAqLworCWNhc2UgU0lSX1NXSURFX09WRVJSVU46CisJCWlmIChjcCkgeworCQkJT1VUT05CKG5wLCBIRl9QUlQsIEhGX0VYVF9FUlIpOworCQkJY3AtPnhlcnJfc3RhdHVzIHw9IFhFX1NXSURFX09WUlVOOworCQl9CisJCWdvdG8gb3V0OworCS8qCisJICogIFdlIGhhdmUgYmVlbiBPREQgYXQgdGhlIGVuZCBvZiBhIERBVEEgT1VUIAorCSAqICB0cmFuc2Zlci4KKwkgKiAgSXQgaXMgYSBkYXRhIHVuZGVycnVuIGNvbmRpdGlvbi4KKwkgKi8KKwljYXNlIFNJUl9TT0RMX1VOREVSUlVOOgorCQlpZiAoY3ApIHsKKwkJCU9VVE9OQihucCwgSEZfUFJULCBIRl9FWFRfRVJSKTsKKwkJCWNwLT54ZXJyX3N0YXR1cyB8PSBYRV9TT0RMX1VOUlVOOworCQl9CisJCWdvdG8gb3V0OworCS8qCisJICogIFRoZSBkZXZpY2Ugd2FudHMgdXMgdG8gdHJhbmZlciBtb3JlIGRhdGEgdGhhbiAKKwkgKiAgZXhwZWN0ZWQgb3IgaW4gdGhlIHdyb25nIGRpcmVjdGlvbi4KKwkgKiAgVGhlIG51bWJlciBvZiBleHRyYSBieXRlcyBpcyBpbiBzY3JhdGNoYS4KKwkgKiAgSXQgaXMgYSBkYXRhIG92ZXJydW4gY29uZGl0aW9uLgorCSAqLworCWNhc2UgU0lSX0RBVEFfT1ZFUlJVTjoKKwkJaWYgKGNwKSB7CisJCQlPVVRPTkIobnAsIEhGX1BSVCwgSEZfRVhUX0VSUik7CisJCQljcC0+eGVycl9zdGF0dXMgfD0gWEVfRVhUUkFfREFUQTsKKwkJCWNwLT5leHRyYV9ieXRlcyArPSBJTkwobnAsIG5jX3NjcmF0Y2hhKTsKKwkJfQorCQlnb3RvIG91dDsKKwkvKgorCSAqICBUaGUgZGV2aWNlIHN3aXRjaGVkIHRvIGFuIGlsbGVnYWwgcGhhc2UgKDQvNSkuCisJICovCisJY2FzZSBTSVJfQkFEX1BIQVNFOgorCQlpZiAoY3ApIHsKKwkJCU9VVE9OQihucCwgSEZfUFJULCBIRl9FWFRfRVJSKTsKKwkJCWNwLT54ZXJyX3N0YXR1cyB8PSBYRV9CQURfUEhBU0U7CisJCX0KKwkJZ290byBvdXQ7CisJLyoKKwkgKiAgV2UgcmVjZWl2ZWQgYSBtZXNzYWdlLgorCSAqLworCWNhc2UgU0lSX01TR19SRUNFSVZFRDoKKwkJaWYgKCFjcCkKKwkJCWdvdG8gb3V0X3N0dWNrOworCQlzd2l0Y2ggKG5wLT5tc2dpbiBbMF0pIHsKKwkJLyoKKwkJICogIFdlIHJlY2VpdmVkIGFuIGV4dGVuZGVkIG1lc3NhZ2UuCisJCSAqICBXZSBoYW5kbGUgTU9ESUZZIERBVEEgUE9JTlRFUiwgU0RUUiwgV0RUUiAKKwkJICogIGFuZCByZWplY3QgYWxsIG90aGVyIGV4dGVuZGVkIG1lc3NhZ2VzLgorCQkgKi8KKwkJY2FzZSBNX0VYVEVOREVEOgorCQkJc3dpdGNoIChucC0+bXNnaW4gWzJdKSB7CisJCQljYXNlIE1fWF9NT0RJRllfRFA6CisJCQkJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfUE9JTlRFUikKKwkJCQkJc3ltX3ByaW50X21zZyhjcCwibW9kaWZ5IERQIixucC0+bXNnaW4pOworCQkJCXRtcCA9IChucC0+bXNnaW5bM108PDI0KSArIChucC0+bXNnaW5bNF08PDE2KSArIAorCQkJCSAgICAgIChucC0+bXNnaW5bNV08PDgpICArIChucC0+bXNnaW5bNl0pOworCQkJCXN5bV9tb2RpZnlfZHAobnAsIHRwLCBjcCwgdG1wKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1fWF9TWU5DX1JFUToKKwkJCQlzeW1fc3luY19uZWdvKG5wLCB0cCwgY3ApOworCQkJCXJldHVybjsKKwkJCWNhc2UgTV9YX1BQUl9SRVE6CisJCQkJc3ltX3Bwcl9uZWdvKG5wLCB0cCwgY3ApOworCQkJCXJldHVybjsKKwkJCWNhc2UgTV9YX1dJREVfUkVROgorCQkJCXN5bV93aWRlX25lZ28obnAsIHRwLCBjcCk7CisJCQkJcmV0dXJuOworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIG91dF9yZWplY3Q7CisJCQl9CisJCQlicmVhazsKKwkJLyoKKwkJICogIFdlIHJlY2VpdmVkIGEgMS8yIGJ5dGUgbWVzc2FnZSBub3QgaGFuZGxlZCBmcm9tIFNDUklQVFMuCisJCSAqICBXZSBhcmUgb25seSBleHBlY3RpbmcgTUVTU0FHRSBSRUpFQ1QgYW5kIElHTk9SRSBXSURFIAorCQkgKiAgUkVTSURVRSBtZXNzYWdlcyB0aGF0IGhhdmVuJ3QgYmVlbiBhbnRpY2lwYXRlZCBieSAKKwkJICogIFNDUklQVFMgb24gU1dJREUgZnVsbCBjb25kaXRpb24uIFVuYW50aWNpcGF0ZWQgSUdOT1JFIAorCQkgKiAgV0lERSBSRVNJRFVFIG1lc3NhZ2VzIGFyZSBhbGlhc2VkIGFzIE1PRElGWSBEUCAoLTEpLgorCQkgKi8KKwkJY2FzZSBNX0lHTl9SRVNJRFVFOgorCQkJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfUE9JTlRFUikKKwkJCQlzeW1fcHJpbnRfbXNnKGNwLCJpZ24gd2lkZSByZXNpZHVlIiwgbnAtPm1zZ2luKTsKKwkJCWlmIChjcC0+aG9zdF9mbGFncyAmIEhGX1NFTlNFKQorCQkJCU9VVExfRFNQKG5wLCBTQ1JJUFRBX0JBKG5wLCBjbHJhY2spKTsKKwkJCWVsc2UKKwkJCQlzeW1fbW9kaWZ5X2RwKG5wLCB0cCwgY3AsIC0xKTsKKwkJCXJldHVybjsKKwkJY2FzZSBNX1JFSkVDVDoKKwkJCWlmIChJTkIobnAsIEhTX1BSVCkgPT0gSFNfTkVHT1RJQVRFKQorCQkJCXN5bV9uZWdvX3JlamVjdGVkKG5wLCB0cCwgY3ApOworCQkJZWxzZSB7CisJCQkJc3ltX3ByaW50X2FkZHIoY3AtPmNtZCwKKwkJCQkJIk1fUkVKRUNUIHJlY2VpdmVkICgleDoleCkuXG4iLAorCQkJCQlzY3JfdG9fY3B1KG5wLT5sYXN0bXNnKSwgbnAtPm1zZ291dFswXSk7CisJCQl9CisJCQlnb3RvIG91dF9jbHJhY2s7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gb3V0X3JlamVjdDsKKwkJfQorCQlicmVhazsKKwkvKgorCSAqICBXZSByZWNlaXZlZCBhbiB1bmtub3duIG1lc3NhZ2UuCisJICogIElnbm9yZSBhbGwgTVNHIElOIHBoYXNlcyBhbmQgcmVqZWN0IGl0LgorCSAqLworCWNhc2UgU0lSX01TR19XRUlSRDoKKwkJc3ltX3ByaW50X21zZyhjcCwgIldFSVJEIG1lc3NhZ2UgcmVjZWl2ZWQiLCBucC0+bXNnaW4pOworCQlPVVRMX0RTUChucCwgU0NSSVBUQl9CQShucCwgbXNnX3dlaXJkKSk7CisJCXJldHVybjsKKwkvKgorCSAqICBOZWdvdGlhdGlvbiBmYWlsZWQuCisJICogIFRhcmdldCBkb2VzIG5vdCBzZW5kIHVzIHRoZSByZXBseS4KKwkgKiAgUmVtb3ZlIHRoZSBIU19ORUdPVElBVEUgc3RhdHVzLgorCSAqLworCWNhc2UgU0lSX05FR09fRkFJTEVEOgorCQlPVVRCKG5wLCBIU19QUlQsIEhTX0JVU1kpOworCS8qCisJICogIE5lZ290aWF0aW9uIGZhaWxlZC4KKwkgKiAgVGFyZ2V0IGRvZXMgbm90IHdhbnQgYW5zd2VyIG1lc3NhZ2UuCisJICovCisJY2FzZSBTSVJfTkVHT19QUk9UTzoKKwkJc3ltX25lZ29fZGVmYXVsdChucCwgdHAsIGNwKTsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJT1VUT05CX1NURCgpOworCXJldHVybjsKK291dF9yZWplY3Q6CisJT1VUTF9EU1AobnAsIFNDUklQVEJfQkEobnAsIG1zZ19iYWQpKTsKKwlyZXR1cm47CitvdXRfY2xyYWNrOgorCU9VVExfRFNQKG5wLCBTQ1JJUFRBX0JBKG5wLCBjbHJhY2spKTsKKwlyZXR1cm47CitvdXRfc3R1Y2s6CisJcmV0dXJuOworfQorCisvKgorICogIEFjcXVpcmUgYSBjb250cm9sIGJsb2NrCisgKi8KK3N0cnVjdCBzeW1fY2NiICpzeW1fZ2V0X2NjYiAoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHVfY2hhciB0YWdfb3JkZXIpCit7CisJdV9jaGFyIHRuID0gY21kLT5kZXZpY2UtPmlkOworCXVfY2hhciBsbiA9IGNtZC0+ZGV2aWNlLT5sdW47CisJc3RydWN0IHN5bV90Y2IgKnRwID0gJm5wLT50YXJnZXRbdG5dOworCXN0cnVjdCBzeW1fbGNiICpscCA9IHN5bV9scCh0cCwgbG4pOworCXVfc2hvcnQgdGFnID0gTk9fVEFHOworCVNZTV9RVUVIRUFEICpxcDsKKwlzdHJ1Y3Qgc3ltX2NjYiAqY3AgPSBOVUxMOworCisJLyoKKwkgKiAgTG9vayBmb3IgYSBmcmVlIENDQgorCSAqLworCWlmIChzeW1fcXVlX2VtcHR5KCZucC0+ZnJlZV9jY2JxKSkKKwkJc3ltX2FsbG9jX2NjYihucCk7CisJcXAgPSBzeW1fcmVtcXVlX2hlYWQoJm5wLT5mcmVlX2NjYnEpOworCWlmICghcXApCisJCWdvdG8gb3V0OworCWNwID0gc3ltX3F1ZV9lbnRyeShxcCwgc3RydWN0IHN5bV9jY2IsIGxpbmtfY2NicSk7CisKKyNpZm5kZWYgU1lNX09QVF9IQU5ETEVfREVWSUNFX1FVRVVFSU5HCisJLyoKKwkgKiAgSWYgdGhlIExDQiBpcyBub3QgeWV0IGF2YWlsYWJsZSBhbmQgdGhlIExVTgorCSAqICBoYXMgYmVlbiBwcm9iZWQgb2ssIHRyeSB0byBhbGxvY2F0ZSB0aGUgTENCLgorCSAqLworCWlmICghbHAgJiYgc3ltX2lzX2JpdCh0cC0+bHVuX21hcCwgbG4pKSB7CisJCWxwID0gc3ltX2FsbG9jX2xjYihucCwgdG4sIGxuKTsKKwkJaWYgKCFscCkKKwkJCWdvdG8gb3V0X2ZyZWU7CisJfQorI2VuZGlmCisKKwkvKgorCSAqICBJZiB0aGUgTENCIGlzIG5vdCBhdmFpbGFibGUgaGVyZSwgdGhlbiB0aGUgCisJICogIGxvZ2ljYWwgdW5pdCBpcyBub3QgeWV0IGRpc2NvdmVyZWQuIEZvciB0aG9zZSAKKwkgKiAgb25lcyBvbmx5IGFjY2VwdCAxIFNDU0kgSU8gcGVyIGxvZ2ljYWwgdW5pdCwgCisJICogIHNpbmNlIHdlIGNhbm5vdCBhbGxvdyBkaXNjb25uZWN0aW9ucy4KKwkgKi8KKwlpZiAoIWxwKSB7CisJCWlmICghc3ltX2lzX2JpdCh0cC0+YnVzeTBfbWFwLCBsbikpCisJCQlzeW1fc2V0X2JpdCh0cC0+YnVzeTBfbWFwLCBsbik7CisJCWVsc2UKKwkJCWdvdG8gb3V0X2ZyZWU7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogIElmIHdlIGhhdmUgYmVlbiBhc2tlZCBmb3IgYSB0YWdnZWQgY29tbWFuZC4KKwkJICovCisJCWlmICh0YWdfb3JkZXIpIHsKKwkJCS8qCisJCQkgKiAgRGVidWdnaW5nIHB1cnBvc2UuCisJCQkgKi8KKyNpZm5kZWYgU1lNX09QVF9IQU5ETEVfREVWSUNFX1FVRVVFSU5HCisJCQlhc3NlcnQobHAtPmJ1c3lfaXRsID09IDApOworI2VuZGlmCisJCQkvKgorCQkJICogIEFsbG9jYXRlIHJlc291cmNlcyBmb3IgdGFncyBpZiBub3QgeWV0LgorCQkJICovCisJCQlpZiAoIWxwLT5jYl90YWdzKSB7CisJCQkJc3ltX2FsbG9jX2xjYl90YWdzKG5wLCB0biwgbG4pOworCQkJCWlmICghbHAtPmNiX3RhZ3MpCisJCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQl9CisJCQkvKgorCQkJICogIEdldCBhIHRhZyBmb3IgdGhpcyBTQ1NJIElPIGFuZCBzZXQgdXAKKwkJCSAqICB0aGUgQ0NCIGJ1cyBhZGRyZXNzIGZvciByZXNlbGVjdGlvbiwgCisJCQkgKiAgYW5kIGNvdW50IGl0IGZvciB0aGlzIExVTi4KKwkJCSAqICBUb2dnbGUgcmVzZWxlY3QgcGF0aCB0byB0YWdnZWQuCisJCQkgKi8KKwkJCWlmIChscC0+YnVzeV9pdGxxIDwgU1lNX0NPTkZfTUFYX1RBU0spIHsKKwkJCQl0YWcgPSBscC0+Y2JfdGFnc1tscC0+aWFfdGFnXTsKKwkJCQlpZiAoKytscC0+aWFfdGFnID09IFNZTV9DT05GX01BWF9UQVNLKQorCQkJCQlscC0+aWFfdGFnID0gMDsKKwkJCQkrK2xwLT5idXN5X2l0bHE7CisjaWZuZGVmIFNZTV9PUFRfSEFORExFX0RFVklDRV9RVUVVRUlORworCQkJCWxwLT5pdGxxX3RibFt0YWddID0gY3B1X3RvX3NjcihjcC0+Y2NiX2JhKTsKKwkJCQlscC0+aGVhZC5yZXNlbF9zYSA9CisJCQkJCWNwdV90b19zY3IoU0NSSVBUQV9CQShucCwgcmVzZWxfdGFnKSk7CisjZW5kaWYKKyNpZmRlZiBTWU1fT1BUX0xJTUlUX0NPTU1BTkRfUkVPUkRFUklORworCQkJCWNwLT50YWdzX3NpID0gbHAtPnRhZ3Nfc2k7CisJCQkJKytscC0+dGFnc19zdW1bY3AtPnRhZ3Nfc2ldOworCQkJCSsrbHAtPnRhZ3Nfc2luY2U7CisjZW5kaWYKKwkJCX0KKwkJCWVsc2UKKwkJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCS8qCisJCSAqICBUaGlzIGNvbW1hbmQgd2lsbCBub3QgYmUgdGFnZ2VkLgorCQkgKiAgSWYgd2UgYWxyZWFkeSBoYXZlIGVpdGhlciBhIHRhZ2dlZCBvciB1bnRhZ2dlZCAKKwkJICogIG9uZSwgcmVmdXNlIHRvIG92ZXJsYXAgdGhpcyB1bnRhZ2dlZCBvbmUuCisJCSAqLworCQllbHNlIHsKKwkJCS8qCisJCQkgKiAgRGVidWdnaW5nIHB1cnBvc2UuCisJCQkgKi8KKyNpZm5kZWYgU1lNX09QVF9IQU5ETEVfREVWSUNFX1FVRVVFSU5HCisJCQlhc3NlcnQobHAtPmJ1c3lfaXRsID09IDAgJiYgbHAtPmJ1c3lfaXRscSA9PSAwKTsKKyNlbmRpZgorCQkJLyoKKwkJCSAqICBDb3VudCB0aGlzIG5leHVzIGZvciB0aGlzIExVTi4KKwkJCSAqICBTZXQgdXAgdGhlIENDQiBidXMgYWRkcmVzcyBmb3IgcmVzZWxlY3Rpb24uCisJCQkgKiAgVG9nZ2xlIHJlc2VsZWN0IHBhdGggdG8gdW50YWdnZWQuCisJCQkgKi8KKwkJCSsrbHAtPmJ1c3lfaXRsOworI2lmbmRlZiBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcKKwkJCWlmIChscC0+YnVzeV9pdGwgPT0gMSkgeworCQkJCWxwLT5oZWFkLml0bF90YXNrX3NhID0gY3B1X3RvX3NjcihjcC0+Y2NiX2JhKTsKKwkJCQlscC0+aGVhZC5yZXNlbF9zYSA9CisJCQkJICAgICAgY3B1X3RvX3NjcihTQ1JJUFRBX0JBKG5wLCByZXNlbF9ub190YWcpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlnb3RvIG91dF9mcmVlOworI2VuZGlmCisJCX0KKwl9CisJLyoKKwkgKiAgUHV0IHRoZSBDQ0IgaW50byB0aGUgYnVzeSBxdWV1ZS4KKwkgKi8KKwlzeW1faW5zcXVlX3RhaWwoJmNwLT5saW5rX2NjYnEsICZucC0+YnVzeV9jY2JxKTsKKyNpZmRlZiBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcKKwlpZiAobHApIHsKKwkJc3ltX3JlbXF1ZSgmY3AtPmxpbmsyX2NjYnEpOworCQlzeW1faW5zcXVlX3RhaWwoJmNwLT5saW5rMl9jY2JxLCAmbHAtPndhaXRpbmdfY2NicSk7CisJfQorCisjZW5kaWYKKwkvKgorCSAqICBSZW1lbWJlciBhbGwgaW5mb3JtYXRpb25zIG5lZWRlZCB0byBmcmVlIHRoaXMgQ0NCLgorCSAqLworCWNwLT50b19hYm9ydCA9IDA7CisJY3AtPnRhZwkgICA9IHRhZzsKKwljcC0+b3JkZXIgID0gdGFnX29yZGVyOworCWNwLT50YXJnZXQgPSB0bjsKKwljcC0+bHVuICAgID0gbG47CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19UQUdTKSB7CisJCXN5bV9wcmludF9hZGRyKGNtZCwgImNjYiBAJXAgdXNpbmcgdGFnICVkLlxuIiwgY3AsIHRhZyk7CisJfQorCitvdXQ6CisJcmV0dXJuIGNwOworb3V0X2ZyZWU6CisJc3ltX2luc3F1ZV9oZWFkKCZjcC0+bGlua19jY2JxLCAmbnAtPmZyZWVfY2NicSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiAgUmVsZWFzZSBvbmUgY29udHJvbCBibG9jaworICovCit2b2lkIHN5bV9mcmVlX2NjYiAoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX2NjYiAqY3ApCit7CisJc3RydWN0IHN5bV90Y2IgKnRwID0gJm5wLT50YXJnZXRbY3AtPnRhcmdldF07CisJc3RydWN0IHN5bV9sY2IgKmxwID0gc3ltX2xwKHRwLCBjcC0+bHVuKTsKKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1RBR1MpIHsKKwkJc3ltX3ByaW50X2FkZHIoY3AtPmNtZCwgImNjYiBAJXAgZnJlZWluZyB0YWcgJWQuXG4iLAorCQkJCWNwLCBjcC0+dGFnKTsKKwl9CisKKwkvKgorCSAqICBJZiBMQ0IgYXZhaWxhYmxlLAorCSAqLworCWlmIChscCkgeworCQkvKgorCQkgKiAgSWYgdGFnZ2VkLCByZWxlYXNlIHRoZSB0YWcsIHNldCB0aGUgcmVsZWN0IHBhdGggCisJCSAqLworCQlpZiAoY3AtPnRhZyAhPSBOT19UQUcpIHsKKyNpZmRlZiBTWU1fT1BUX0xJTUlUX0NPTU1BTkRfUkVPUkRFUklORworCQkJLS1scC0+dGFnc19zdW1bY3AtPnRhZ3Nfc2ldOworI2VuZGlmCisJCQkvKgorCQkJICogIEZyZWUgdGhlIHRhZyB2YWx1ZS4KKwkJCSAqLworCQkJbHAtPmNiX3RhZ3NbbHAtPmlmX3RhZ10gPSBjcC0+dGFnOworCQkJaWYgKCsrbHAtPmlmX3RhZyA9PSBTWU1fQ09ORl9NQVhfVEFTSykKKwkJCQlscC0+aWZfdGFnID0gMDsKKwkJCS8qCisJCQkgKiAgTWFrZSB0aGUgcmVzZWxlY3QgcGF0aCBpbnZhbGlkLCAKKwkJCSAqICBhbmQgdW5jb3VudCB0aGlzIENDQi4KKwkJCSAqLworCQkJbHAtPml0bHFfdGJsW2NwLT50YWddID0gY3B1X3RvX3NjcihucC0+YmFkX2l0bHFfYmEpOworCQkJLS1scC0+YnVzeV9pdGxxOworCQl9IGVsc2UgewkvKiBVbnRhZ2dlZCAqLworCQkJLyoKKwkJCSAqICBNYWtlIHRoZSByZXNlbGVjdCBwYXRoIGludmFsaWQsIAorCQkJICogIGFuZCB1bmNvdW50IHRoaXMgQ0NCLgorCQkJICovCisJCQlscC0+aGVhZC5pdGxfdGFza19zYSA9IGNwdV90b19zY3IobnAtPmJhZF9pdGxfYmEpOworCQkJLS1scC0+YnVzeV9pdGw7CisJCX0KKwkJLyoKKwkJICogIElmIG5vIEpPQiBhY3RpdmUsIG1ha2UgdGhlIExVTiByZXNlbGVjdCBwYXRoIGludmFsaWQuCisJCSAqLworCQlpZiAobHAtPmJ1c3lfaXRscSA9PSAwICYmIGxwLT5idXN5X2l0bCA9PSAwKQorCQkJbHAtPmhlYWQucmVzZWxfc2EgPQorCQkJCWNwdV90b19zY3IoU0NSSVBUQl9CQShucCwgcmVzZWxfYmFkX2x1bikpOworCX0KKwkvKgorCSAqICBPdGhlcndpc2UsIHdlIG9ubHkgYWNjZXB0IDEgSU8gcGVyIExVTi4KKwkgKiAgQ2xlYXIgdGhlIGJpdCB0aGF0IGtlZXBzIHRyYWNrIG9mIHRoaXMgSU8uCisJICovCisJZWxzZQorCQlzeW1fY2xyX2JpdCh0cC0+YnVzeTBfbWFwLCBjcC0+bHVuKTsKKworCS8qCisJICogIFdlIGRvbm5vdCBxdWV1ZSBtb3JlIHRoYW4gMSBjY2IgcGVyIHRhcmdldCAKKwkgKiAgd2l0aCBuZWdvdGlhdGlvbiBhdCBhbnkgdGltZS4gSWYgdGhpcyBjY2Igd2FzIAorCSAqICB1c2VkIGZvciBuZWdvdGlhdGlvbiwgY2xlYXIgdGhpcyBpbmZvIGluIHRoZSB0Y2IuCisJICovCisJaWYgKGNwID09IHRwLT5uZWdvX2NwKQorCQl0cC0+bmVnb19jcCA9IE5VTEw7CisKKyNpZmRlZiBTWU1fQ09ORl9JQVJCX1NVUFBPUlQKKwkvKgorCSAqICBJZiB3ZSBqdXN0IGNvbXBsZXRlIHRoZSBsYXN0IHF1ZXVlZCBDQ0IsCisJICogIGNsZWFyIHRoaXMgaW5mbyB0aGF0IGlzIG5vIGxvbmdlciByZWxldmFudC4KKwkgKi8KKwlpZiAoY3AgPT0gbnAtPmxhc3RfY3ApCisJCW5wLT5sYXN0X2NwID0gMDsKKyNlbmRpZgorCisJLyoKKwkgKiAgTWFrZSB0aGlzIENDQiBhdmFpbGFibGUuCisJICovCisJY3AtPmNtZCA9IE5VTEw7CisJY3AtPmhvc3Rfc3RhdHVzID0gSFNfSURMRTsKKwlzeW1fcmVtcXVlKCZjcC0+bGlua19jY2JxKTsKKwlzeW1faW5zcXVlX2hlYWQoJmNwLT5saW5rX2NjYnEsICZucC0+ZnJlZV9jY2JxKTsKKworI2lmZGVmIFNZTV9PUFRfSEFORExFX0RFVklDRV9RVUVVRUlORworCWlmIChscCkgeworCQlzeW1fcmVtcXVlKCZjcC0+bGluazJfY2NicSk7CisJCXN5bV9pbnNxdWVfdGFpbCgmY3AtPmxpbmsyX2NjYnEsICZucC0+ZHVtbXlfY2NicSk7CisJCWlmIChjcC0+c3RhcnRlZCkgeworCQkJaWYgKGNwLT50YWcgIT0gTk9fVEFHKQorCQkJCS0tbHAtPnN0YXJ0ZWRfdGFnczsKKwkJCWVsc2UKKwkJCQktLWxwLT5zdGFydGVkX25vX3RhZzsKKwkJfQorCX0KKwljcC0+c3RhcnRlZCA9IDA7CisjZW5kaWYKK30KKworLyoKKyAqICBBbGxvY2F0ZSBhIENDQiBmcm9tIG1lbW9yeSBhbmQgaW5pdGlhbGl6ZSBpdHMgZml4ZWQgcGFydC4KKyAqLworc3RhdGljIHN0cnVjdCBzeW1fY2NiICpzeW1fYWxsb2NfY2NiKHN0cnVjdCBzeW1faGNiICpucCkKK3sKKwlzdHJ1Y3Qgc3ltX2NjYiAqY3AgPSBOVUxMOworCWludCBoY29kZTsKKworCS8qCisJICogIFByZXZlbnQgZnJvbSBhbGxvY2F0aW5nIG1vcmUgQ0NCcyB0aGFuIHdlIGNhbiAKKwkgKiAgcXVldWUgdG8gdGhlIGNvbnRyb2xsZXIuCisJICovCisJaWYgKG5wLT5hY3RjY2JzID49IFNZTV9DT05GX01BWF9TVEFSVCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqICBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgQ0NCLgorCSAqLworCWNwID0gc3ltX2NhbGxvY19kbWEoc2l6ZW9mKHN0cnVjdCBzeW1fY2NiKSwgIkNDQiIpOworCWlmICghY3ApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwkvKgorCSAqICBDb3VudCBpdC4KKwkgKi8KKwlucC0+YWN0Y2NicysrOworCisJLyoKKwkgKiAgQ29tcHV0ZSB0aGUgYnVzIGFkZHJlc3Mgb2YgdGhpcyBjY2IuCisJICovCisJY3AtPmNjYl9iYSA9IHZ0b2J1cyhjcCk7CisKKwkvKgorCSAqICBJbnNlcnQgdGhpcyBjY2IgaW50byB0aGUgaGFzaGVkIGxpc3QuCisJICovCisJaGNvZGUgPSBDQ0JfSEFTSF9DT0RFKGNwLT5jY2JfYmEpOworCWNwLT5saW5rX2NjYmggPSBucC0+Y2NiaFtoY29kZV07CisJbnAtPmNjYmhbaGNvZGVdID0gY3A7CisKKwkvKgorCSAqICBJbml0aWFseXplIHRoZSBzdGFydCBhbmQgcmVzdGFydCBhY3Rpb25zLgorCSAqLworCWNwLT5waHlzLmhlYWQuZ28uc3RhcnQgICA9IGNwdV90b19zY3IoU0NSSVBUQV9CQShucCwgaWRsZSkpOworCWNwLT5waHlzLmhlYWQuZ28ucmVzdGFydCA9IGNwdV90b19zY3IoU0NSSVBUQl9CQShucCwgYmFkX2lfdF9sKSk7CisKKyAJLyoKKwkgKiAgSW5pdGlsaWFseXplIHNvbWUgb3RoZXIgZmllbGRzLgorCSAqLworCWNwLT5waHlzLnNtc2dfZXh0LmFkZHIgPSBjcHVfdG9fc2NyKEhDQl9CQShucCwgbXNnaW5bMl0pKTsKKworCS8qCisJICogIENoYWluIGludG8gZnJlZSBjY2IgcXVldWUuCisJICovCisJc3ltX2luc3F1ZV9oZWFkKCZjcC0+bGlua19jY2JxLCAmbnAtPmZyZWVfY2NicSk7CisKKwkvKgorCSAqICBDaGFpbiBpbnRvIG9wdGlvbm5hbCBsaXN0cy4KKwkgKi8KKyNpZmRlZiBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcKKwlzeW1faW5zcXVlX2hlYWQoJmNwLT5saW5rMl9jY2JxLCAmbnAtPmR1bW15X2NjYnEpOworI2VuZGlmCisJcmV0dXJuIGNwOworb3V0X2ZyZWU6CisJaWYgKGNwKQorCQlzeW1fbWZyZWVfZG1hKGNwLCBzaXplb2YoKmNwKSwgIkNDQiIpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogIExvb2sgdXAgYSBDQ0IgZnJvbSBhIERTQSB2YWx1ZS4KKyAqLworc3RhdGljIHN0cnVjdCBzeW1fY2NiICpzeW1fY2NiX2Zyb21fZHNhKHN0cnVjdCBzeW1faGNiICpucCwgdTMyIGRzYSkKK3sKKwlpbnQgaGNvZGU7CisJc3RydWN0IHN5bV9jY2IgKmNwOworCisJaGNvZGUgPSBDQ0JfSEFTSF9DT0RFKGRzYSk7CisJY3AgPSBucC0+Y2NiaFtoY29kZV07CisJd2hpbGUgKGNwKSB7CisJCWlmIChjcC0+Y2NiX2JhID09IGRzYSkKKwkJCWJyZWFrOworCQljcCA9IGNwLT5saW5rX2NjYmg7CisJfQorCisJcmV0dXJuIGNwOworfQorCisvKgorICogIFRhcmdldCBjb250cm9sIGJsb2NrIGluaXRpYWxpc2F0aW9uLgorICogIE5vdGhpbmcgaW1wb3J0YW50IHRvIGRvIGF0IHRoZSBtb21lbnQuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9pbml0X3RjYiAoc3RydWN0IHN5bV9oY2IgKm5wLCB1X2NoYXIgdG4pCit7CisjaWYgMAkvKiAgSG1tbS4uLiB0aGlzIGNoZWNraW5nIGxvb2tzIHBhcmFub2lkLiAqLworCS8qCisJICogIENoZWNrIHNvbWUgYWxpZ25tZW50cyByZXF1aXJlZCBieSB0aGUgY2hpcC4KKwkgKi8JCisJYXNzZXJ0ICgoKG9mZnNldG9mKHN0cnVjdCBzeW1fcmVnLCBuY19zeGZlcikgXgorCQlvZmZzZXRvZihzdHJ1Y3Qgc3ltX3RjYiwgaGVhZC5zdmFsKSkgJjMpID09IDApOworCWFzc2VydCAoKChvZmZzZXRvZihzdHJ1Y3Qgc3ltX3JlZywgbmNfc2NudGwzKSBeCisJCW9mZnNldG9mKHN0cnVjdCBzeW1fdGNiLCBoZWFkLnd2YWwpKSAmMykgPT0gMCk7CisjZW5kaWYKK30KKworLyoKKyAqICBMdW4gY29udHJvbCBibG9jayBhbGxvY2F0aW9uIGFuZCBpbml0aWFsaXphdGlvbi4KKyAqLworc3RydWN0IHN5bV9sY2IgKnN5bV9hbGxvY19sY2IgKHN0cnVjdCBzeW1faGNiICpucCwgdV9jaGFyIHRuLCB1X2NoYXIgbG4pCit7CisJc3RydWN0IHN5bV90Y2IgKnRwID0gJm5wLT50YXJnZXRbdG5dOworCXN0cnVjdCBzeW1fbGNiICpscCA9IHN5bV9scCh0cCwgbG4pOworCisJLyoKKwkgKiAgQWxyZWFkeSBkb25lLCBqdXN0IHJldHVybi4KKwkgKi8KKwlpZiAobHApCisJCXJldHVybiBscDsKKworCS8qCisJICogIERvbm5vdCBhbGxvdyBMVU4gY29udHJvbCBibG9jayAKKwkgKiAgYWxsb2NhdGlvbiBmb3Igbm90IHByb2JlZCBMVU5zLgorCSAqLworCWlmICghc3ltX2lzX2JpdCh0cC0+bHVuX21hcCwgbG4pKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogIEluaXRpYWxpemUgdGhlIHRhcmdldCBjb250cm9sIGJsb2NrIGlmIG5vdCB5ZXQuCisJICovCisJc3ltX2luaXRfdGNiIChucCwgdG4pOworCisJLyoKKwkgKiAgQWxsb2NhdGUgdGhlIExDQiBidXMgYWRkcmVzcyBhcnJheS4KKwkgKiAgQ29tcHV0ZSB0aGUgYnVzIGFkZHJlc3Mgb2YgdGhpcyB0YWJsZS4KKwkgKi8KKwlpZiAobG4gJiYgIXRwLT5sdW50YmwpIHsKKwkJaW50IGk7CisKKwkJdHAtPmx1bnRibCA9IHN5bV9jYWxsb2NfZG1hKDI1NiwgIkxVTlRCTCIpOworCQlpZiAoIXRwLT5sdW50YmwpCisJCQlnb3RvIGZhaWw7CisJCWZvciAoaSA9IDAgOyBpIDwgNjQgOyBpKyspCisJCQl0cC0+bHVudGJsW2ldID0gY3B1X3RvX3Njcih2dG9idXMoJm5wLT5iYWRsdW5fc2EpKTsKKwkJdHAtPmhlYWQubHVudGJsX3NhID0gY3B1X3RvX3Njcih2dG9idXModHAtPmx1bnRibCkpOworCX0KKworCS8qCisJICogIEFsbG9jYXRlIHRoZSB0YWJsZSBvZiBwb2ludGVycyBmb3IgTFVOKHMpID4gMCwgaWYgbmVlZGVkLgorCSAqLworCWlmIChsbiAmJiAhdHAtPmx1bm1wKSB7CisJCXRwLT5sdW5tcCA9IGtjYWxsb2MoU1lNX0NPTkZfTUFYX0xVTiwgc2l6ZW9mKHN0cnVjdCBzeW1fbGNiICopLAorCQkJCUdGUF9LRVJORUwpOworCQlpZiAoIXRwLT5sdW5tcCkKKwkJCWdvdG8gZmFpbDsKKwl9CisKKwkvKgorCSAqICBBbGxvY2F0ZSB0aGUgbGNiLgorCSAqICBNYWtlIGl0IGF2YWlsYWJsZSB0byB0aGUgY2hpcC4KKwkgKi8KKwlscCA9IHN5bV9jYWxsb2NfZG1hKHNpemVvZihzdHJ1Y3Qgc3ltX2xjYiksICJMQ0IiKTsKKwlpZiAoIWxwKQorCQlnb3RvIGZhaWw7CisJaWYgKGxuKSB7CisJCXRwLT5sdW5tcFtsbl0gPSBscDsKKwkJdHAtPmx1bnRibFtsbl0gPSBjcHVfdG9fc2NyKHZ0b2J1cyhscCkpOworCX0KKwllbHNlIHsKKwkJdHAtPmx1bjBwID0gbHA7CisJCXRwLT5oZWFkLmx1bjBfc2EgPSBjcHVfdG9fc2NyKHZ0b2J1cyhscCkpOworCX0KKworCS8qCisJICogIExldCB0aGUgaXRsIHRhc2sgcG9pbnQgdG8gZXJyb3IgaGFuZGxpbmcuCisJICovCisJbHAtPmhlYWQuaXRsX3Rhc2tfc2EgPSBjcHVfdG9fc2NyKG5wLT5iYWRfaXRsX2JhKTsKKworCS8qCisJICogIFNldCB0aGUgcmVzZWxlY3QgcGF0dGVybiB0byBvdXIgZGVmYXVsdC4gOikKKwkgKi8KKwlscC0+aGVhZC5yZXNlbF9zYSA9IGNwdV90b19zY3IoU0NSSVBUQl9CQShucCwgcmVzZWxfYmFkX2x1bikpOworCisJLyoKKwkgKiAgU2V0IHVzZXIgY2FwYWJpbGl0aWVzLgorCSAqLworCWxwLT51c2VyX2ZsYWdzID0gdHAtPnVzcmZsYWdzICYgKFNZTV9ESVNDX0VOQUJMRUQgfCBTWU1fVEFHU19FTkFCTEVEKTsKKworI2lmZGVmIFNZTV9PUFRfSEFORExFX0RFVklDRV9RVUVVRUlORworCS8qCisJICogIEluaXRpYWxpemUgZGV2aWNlIHF1ZXVlaW5nLgorCSAqLworCXN5bV9xdWVfaW5pdCgmbHAtPndhaXRpbmdfY2NicSk7CisJc3ltX3F1ZV9pbml0KCZscC0+c3RhcnRlZF9jY2JxKTsKKwlscC0+c3RhcnRlZF9tYXggICA9IFNZTV9DT05GX01BWF9UQVNLOworCWxwLT5zdGFydGVkX2xpbWl0ID0gU1lNX0NPTkZfTUFYX1RBU0s7CisjZW5kaWYKKwkvKgorCSAqICBJZiB3ZSBhcmUgYnVzeSwgY291bnQgdGhlIElPLgorCSAqLworCWlmIChzeW1faXNfYml0KHRwLT5idXN5MF9tYXAsIGxuKSkgeworCQlscC0+YnVzeV9pdGwgPSAxOworCQlzeW1fY2xyX2JpdCh0cC0+YnVzeTBfbWFwLCBsbik7CisJfQorZmFpbDoKKwlyZXR1cm4gbHA7Cit9CisKKy8qCisgKiAgQWxsb2NhdGUgTENCIHJlc291cmNlcyBmb3IgdGFnZ2VkIGNvbW1hbmQgcXVldWluZy4KKyAqLworc3RhdGljIHZvaWQgc3ltX2FsbG9jX2xjYl90YWdzIChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHVfY2hhciB0biwgdV9jaGFyIGxuKQoreworCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W3RuXTsKKwlzdHJ1Y3Qgc3ltX2xjYiAqbHAgPSBzeW1fbHAodHAsIGxuKTsKKwlpbnQgaTsKKworCS8qCisJICogIElmIExDQiBub3QgYXZhaWxhYmxlLCB0cnkgdG8gYWxsb2NhdGUgaXQuCisJICovCisJaWYgKCFscCAmJiAhKGxwID0gc3ltX2FsbG9jX2xjYihucCwgdG4sIGxuKSkpCisJCWdvdG8gZmFpbDsKKworCS8qCisJICogIEFsbG9jYXRlIHRoZSB0YXNrIHRhYmxlIGFuZCBhbmQgdGhlIHRhZyBhbGxvY2F0aW9uIAorCSAqICBjaXJjdWxhciBidWZmZXIuIFdlIHdhbnQgYm90aCBvciBub25lLgorCSAqLworCWxwLT5pdGxxX3RibCA9IHN5bV9jYWxsb2NfZG1hKFNZTV9DT05GX01BWF9UQVNLKjQsICJJVExRX1RCTCIpOworCWlmICghbHAtPml0bHFfdGJsKQorCQlnb3RvIGZhaWw7CisJbHAtPmNiX3RhZ3MgPSBrY2FsbG9jKFNZTV9DT05GX01BWF9UQVNLLCAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxwLT5jYl90YWdzKSB7CisJCXN5bV9tZnJlZV9kbWEobHAtPml0bHFfdGJsLCBTWU1fQ09ORl9NQVhfVEFTSyo0LCAiSVRMUV9UQkwiKTsKKwkJbHAtPml0bHFfdGJsID0gTlVMTDsKKwkJZ290byBmYWlsOworCX0KKworCS8qCisJICogIEluaXRpYWxpemUgdGhlIHRhc2sgdGFibGUgd2l0aCBpbnZhbGlkIGVudHJpZXMuCisJICovCisJZm9yIChpID0gMCA7IGkgPCBTWU1fQ09ORl9NQVhfVEFTSyA7IGkrKykKKwkJbHAtPml0bHFfdGJsW2ldID0gY3B1X3RvX3NjcihucC0+bm90YXNrX2JhKTsKKworCS8qCisJICogIEZpbGwgdXAgdGhlIHRhZyBidWZmZXIgd2l0aCB0YWcgbnVtYmVycy4KKwkgKi8KKwlmb3IgKGkgPSAwIDsgaSA8IFNZTV9DT05GX01BWF9UQVNLIDsgaSsrKQorCQlscC0+Y2JfdGFnc1tpXSA9IGk7CisKKwkvKgorCSAqICBNYWtlIHRoZSB0YXNrIHRhYmxlIGF2YWlsYWJsZSB0byBTQ1JJUFRTLCAKKwkgKiAgQW5kIGFjY2VwdCB0YWdnZWQgY29tbWFuZHMgbm93LgorCSAqLworCWxwLT5oZWFkLml0bHFfdGJsX3NhID0gY3B1X3RvX3Njcih2dG9idXMobHAtPml0bHFfdGJsKSk7CisKKwlyZXR1cm47CitmYWlsOgorCXJldHVybjsKK30KKworLyoKKyAqICBRdWV1ZSBhIFNDU0kgSU8gdG8gdGhlIGNvbnRyb2xsZXIuCisgKi8KK2ludCBzeW1fcXVldWVfc2NzaWlvKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY21kLCBzdHJ1Y3Qgc3ltX2NjYiAqY3ApCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gY21kLT5kZXZpY2U7CisJc3RydWN0IHN5bV90Y2IgKnRwOworCXN0cnVjdCBzeW1fbGNiICpscDsKKwl1X2NoYXIJKm1zZ3B0cjsKKwl1X2ludCAgIG1zZ2xlbjsKKwlpbnQgY2FuX2Rpc2Nvbm5lY3Q7CisKKwkvKgorCSAqICBLZWVwIHRyYWNrIG9mIHRoZSBJTyBpbiBvdXIgQ0NCLgorCSAqLworCWNwLT5jbWQgPSBjbWQ7CisKKwkvKgorCSAqICBSZXRyaWV2ZSB0aGUgdGFyZ2V0IGRlc2NyaXB0b3IuCisJICovCisJdHAgPSAmbnAtPnRhcmdldFtjcC0+dGFyZ2V0XTsKKworCS8qCisJICogIFJldHJpZXZlIHRoZSBsdW4gZGVzY3JpcHRvci4KKwkgKi8KKwlscCA9IHN5bV9scCh0cCwgc2Rldi0+bHVuKTsKKworCWNhbl9kaXNjb25uZWN0ID0gKGNwLT50YWcgIT0gTk9fVEFHKSB8fAorCQkobHAgJiYgKGxwLT5jdXJyX2ZsYWdzICYgU1lNX0RJU0NfRU5BQkxFRCkpOworCisJbXNncHRyID0gY3AtPnNjc2lfc21zZzsKKwltc2dsZW4gPSAwOworCW1zZ3B0clttc2dsZW4rK10gPSBJREVOVElGWShjYW5fZGlzY29ubmVjdCwgc2Rldi0+bHVuKTsKKworCS8qCisJICogIEJ1aWxkIHRoZSB0YWcgbWVzc2FnZSBpZiBwcmVzZW50LgorCSAqLworCWlmIChjcC0+dGFnICE9IE5PX1RBRykgeworCQl1X2NoYXIgb3JkZXIgPSBjcC0+b3JkZXI7CisKKwkJc3dpdGNoKG9yZGVyKSB7CisJCWNhc2UgTV9PUkRFUkVEX1RBRzoKKwkJCWJyZWFrOworCQljYXNlIE1fSEVBRF9UQUc6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW9yZGVyID0gTV9TSU1QTEVfVEFHOworCQl9CisjaWZkZWYgU1lNX09QVF9MSU1JVF9DT01NQU5EX1JFT1JERVJJTkcKKwkJLyoKKwkJICogIEF2b2lkIHRvbyBtdWNoIHJlb3JkZXJpbmcgb2YgU0NTSSBjb21tYW5kcy4KKwkJICogIFRoZSBhbGdvcml0aG0gdHJpZXMgdG8gcHJldmVudCBjb21wbGV0aW9uIG9mIGFueSAKKwkJICogIHRhZ2dlZCBjb21tYW5kIGZyb20gYmVpbmcgZGVsYXllZCBhZ2FpbnN0IG1vcmUgCisJCSAqICB0aGFuIDMgdGltZXMgdGhlIG1heCBudW1iZXIgb2YgcXVldWVkIGNvbW1hbmRzLgorCQkgKi8KKwkJaWYgKGxwICYmIGxwLT50YWdzX3NpbmNlID4gMypTWU1fQ09ORl9NQVhfVEFHKSB7CisJCQlscC0+dGFnc19zaSA9ICEobHAtPnRhZ3Nfc2kpOworCQkJaWYgKGxwLT50YWdzX3N1bVtscC0+dGFnc19zaV0pIHsKKwkJCQlvcmRlciA9IE1fT1JERVJFRF9UQUc7CisJCQkJaWYgKChERUJVR19GTEFHUyAmIERFQlVHX1RBR1MpfHxzeW1fdmVyYm9zZT4xKSB7CisJCQkJCXN5bV9wcmludF9hZGRyKGNtZCwKKwkJCQkJCSJvcmRlcmVkIHRhZyBmb3JjZWQuXG4iKTsKKwkJCQl9CisJCQl9CisJCQlscC0+dGFnc19zaW5jZSA9IDA7CisJCX0KKyNlbmRpZgorCQltc2dwdHJbbXNnbGVuKytdID0gb3JkZXI7CisKKwkJLyoKKwkJICogIEZvciBsZXNzIHRoYW4gMTI4IHRhZ3MsIGFjdHVhbCB0YWdzIGFyZSBudW1iZXJlZCAKKwkJICogIDEsMyw1LC4uMipNQVhUQUdTKzEsc2luY2Ugd2UgbWF5IGhhdmUgdG8gZGVhbCAKKwkJICogIHdpdGggZGV2aWNlcyB0aGF0IGhhdmUgcHJvYmxlbXMgd2l0aCAjVEFHIDAgb3IgdG9vIAorCQkgKiAgZ3JlYXQgI1RBRyBudW1iZXJzLiBGb3IgbW9yZSB0YWdzICh1cCB0byAyNTYpLCAKKwkJICogIHdlIHVzZSBkaXJlY3RseSBvdXIgdGFnIG51bWJlci4KKwkJICovCisjaWYgU1lNX0NPTkZfTUFYX1RBU0sgPiAoNTEyLzQpCisJCW1zZ3B0clttc2dsZW4rK10gPSBjcC0+dGFnOworI2Vsc2UKKwkJbXNncHRyW21zZ2xlbisrXSA9IChjcC0+dGFnIDw8IDEpICsgMTsKKyNlbmRpZgorCX0KKworCS8qCisJICogIEJ1aWxkIGEgbmVnb3RpYXRpb24gbWVzc2FnZSBpZiBuZWVkZWQuCisJICogIChuZWdvX3N0YXR1cyBpcyBmaWxsZWQgYnkgc3ltX3ByZXBhcmVfbmVnbygpKQorCSAqLworCWNwLT5uZWdvX3N0YXR1cyA9IDA7CisJaWYgKHRwLT50Z29hbC5jaGVja19uZWdvICYmICF0cC0+bmVnb19jcCAmJiBscCkgeworCQltc2dsZW4gKz0gc3ltX3ByZXBhcmVfbmVnbyhucCwgY3AsIG1zZ3B0ciArIG1zZ2xlbik7CisJfQorCisJLyoKKwkgKiAgU3RhcnRxdWV1ZQorCSAqLworCWNwLT5waHlzLmhlYWQuZ28uc3RhcnQgICA9IGNwdV90b19zY3IoU0NSSVBUQV9CQShucCwgc2VsZWN0KSk7CisJY3AtPnBoeXMuaGVhZC5nby5yZXN0YXJ0ID0gY3B1X3RvX3NjcihTQ1JJUFRBX0JBKG5wLCByZXNlbF9kc2EpKTsKKworCS8qCisJICogIHNlbGVjdAorCSAqLworCWNwLT5waHlzLnNlbGVjdC5zZWxfaWQJCT0gY3AtPnRhcmdldDsKKwljcC0+cGh5cy5zZWxlY3Quc2VsX3NjbnRsMwk9IHRwLT5oZWFkLnd2YWw7CisJY3AtPnBoeXMuc2VsZWN0LnNlbF9zeGZlcgk9IHRwLT5oZWFkLnN2YWw7CisJY3AtPnBoeXMuc2VsZWN0LnNlbF9zY250bDQJPSB0cC0+aGVhZC51dmFsOworCisJLyoKKwkgKiAgbWVzc2FnZQorCSAqLworCWNwLT5waHlzLnNtc2cuYWRkcgk9IGNwdV90b19zY3IoQ0NCX0JBKGNwLCBzY3NpX3Ntc2cpKTsKKwljcC0+cGh5cy5zbXNnLnNpemUJPSBjcHVfdG9fc2NyKG1zZ2xlbik7CisKKwkvKgorCSAqICBzdGF0dXMKKwkgKi8KKwljcC0+aG9zdF94ZmxhZ3MJCT0gMDsKKwljcC0+aG9zdF9zdGF0dXMJCT0gY3AtPm5lZ29fc3RhdHVzID8gSFNfTkVHT1RJQVRFIDogSFNfQlVTWTsKKwljcC0+c3Nzc19zdGF0dXMJCT0gU19JTExFR0FMOworCWNwLT54ZXJyX3N0YXR1cwkJPSAwOworCWNwLT5ob3N0X2ZsYWdzCQk9IDA7CisJY3AtPmV4dHJhX2J5dGVzCQk9IDA7CisKKwkvKgorCSAqICBleHRyZW1lIGRhdGEgcG9pbnRlci4KKwkgKiAgc2hhbGwgYmUgcG9zaXRpdmUsIHNvIC0xIGlzIGxvd2VyIHRoYW4gbG93ZXN0LjopCisJICovCisJY3AtPmV4dF9zZyAgPSAtMTsKKwljcC0+ZXh0X29mcyA9IDA7CisKKwkvKgorCSAqICBCdWlsZCB0aGUgQ0RCIGFuZCBEQVRBIGRlc2NyaXB0b3IgYmxvY2sgCisJICogIGFuZCBzdGFydCB0aGUgSU8uCisJICovCisJcmV0dXJuIHN5bV9zZXR1cF9kYXRhX2FuZF9zdGFydChucCwgY21kLCBjcCk7Cit9CisKKy8qCisgKiAgUmVzZXQgYSBTQ1NJIHRhcmdldCAoYWxsIExVTnMgb2YgdGhpcyB0YXJnZXQpLgorICovCitpbnQgc3ltX3Jlc2V0X3Njc2lfdGFyZ2V0KHN0cnVjdCBzeW1faGNiICpucCwgaW50IHRhcmdldCkKK3sKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHA7CisKKwlpZiAodGFyZ2V0ID09IG5wLT5teWFkZHIgfHwgKHVfaW50KXRhcmdldCA+PSBTWU1fQ09ORl9NQVhfVEFSR0VUKQorCQlyZXR1cm4gLTE7CisKKwl0cCA9ICZucC0+dGFyZ2V0W3RhcmdldF07CisJdHAtPnRvX3Jlc2V0ID0gMTsKKworCW5wLT5pc3RhdF9zZW0gPSBTRU07CisJT1VUQihucCwgbmNfaXN0YXQsIFNJR1B8U0VNKTsKKworCXJldHVybiAwOworfQorCisvKgorICogIEFib3J0IGEgU0NTSSBJTy4KKyAqLworc3RhdGljIGludCBzeW1fYWJvcnRfY2NiKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV9jY2IgKmNwLCBpbnQgdGltZWRfb3V0KQoreworCS8qCisJICogIENoZWNrIHRoYXQgdGhlIElPIGlzIGFjdGl2ZS4KKwkgKi8KKwlpZiAoIWNwIHx8ICFjcC0+aG9zdF9zdGF0dXMgfHwgY3AtPmhvc3Rfc3RhdHVzID09IEhTX1dBSVQpCisJCXJldHVybiAtMTsKKworCS8qCisJICogIElmIGEgcHJldmlvdXMgYWJvcnQgZGlkbid0IHN1Y2NlZWQgaW4gdGltZSwKKwkgKiAgcGVyZm9ybSBhIEJVUyByZXNldC4KKwkgKi8KKwlpZiAoY3AtPnRvX2Fib3J0KSB7CisJCXN5bV9yZXNldF9zY3NpX2J1cyhucCwgMSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogIE1hcmsgdGhlIENDQiBmb3IgYWJvcnQgYW5kIGFsbG93IHRpbWUgZm9yLgorCSAqLworCWNwLT50b19hYm9ydCA9IHRpbWVkX291dCA/IDIgOiAxOworCisJLyoKKwkgKiAgVGVsbCB0aGUgU0NSSVBUUyBwcm9jZXNzb3IgdG8gc3RvcCBhbmQgc3luY2hyb25pemUgd2l0aCB1cy4KKwkgKi8KKwlucC0+aXN0YXRfc2VtID0gU0VNOworCU9VVEIobnAsIG5jX2lzdGF0LCBTSUdQfFNFTSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzeW1fYWJvcnRfc2NzaWlvKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY21kLCBpbnQgdGltZWRfb3V0KQoreworCXN0cnVjdCBzeW1fY2NiICpjcDsKKwlTWU1fUVVFSEVBRCAqcXA7CisKKwkvKgorCSAqICBMb29rIHVwIG91ciBDQ0IgY29udHJvbCBibG9jay4KKwkgKi8KKwljcCA9IE5VTEw7CisJRk9SX0VBQ0hfUVVFVUVEX0VMRU1FTlQoJm5wLT5idXN5X2NjYnEsIHFwKSB7CisJCXN0cnVjdCBzeW1fY2NiICpjcDIgPSBzeW1fcXVlX2VudHJ5KHFwLCBzdHJ1Y3Qgc3ltX2NjYiwgbGlua19jY2JxKTsKKwkJaWYgKGNwMi0+Y21kID09IGNtZCkgeworCQkJY3AgPSBjcDI7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBzeW1fYWJvcnRfY2NiKG5wLCBjcCwgdGltZWRfb3V0KTsKK30KKworLyoKKyAqICBDb21wbGV0ZSBleGVjdXRpb24gb2YgYSBTQ1NJIGNvbW1hbmQgd2l0aCBleHRlbnRlZCAKKyAqICBlcnJvciwgU0NTSSBzdGF0dXMgZXJyb3IsIG9yIGhhdmluZyBiZWVuIGF1dG8tc2Vuc2VkLgorICoKKyAqICBUaGUgU0NSSVBUUyBwcm9jZXNzb3IgaXMgbm90IHJ1bm5pbmcgdGhlcmUsIHNvIHdlIAorICogIGNhbiBzYWZlbHkgYWNjZXNzIElPIHJlZ2lzdGVycyBhbmQgcmVtb3ZlIEpPQnMgZnJvbSAgCisgKiAgdGhlIFNUQVJUIHF1ZXVlLgorICogIFNDUkFUQ0hBIGlzIGFzc3VtZWQgdG8gaGF2ZSBiZWVuIGxvYWRlZCB3aXRoIFNUQVJUUE9TIAorICogIGJlZm9yZSB0aGUgU0NSSVBUUyBjYWxsZWQgdGhlIEMgY29kZS4KKyAqLwordm9pZCBzeW1fY29tcGxldGVfZXJyb3Ioc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX2NjYiAqY3ApCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHA7CisJc3RydWN0IHN5bV9sY2IgKmxwOworCWludCByZXNpZDsKKwlpbnQgaTsKKworCS8qCisJICogIFBhcmFub2lkIGNoZWNrLiA6KQorCSAqLworCWlmICghY3AgfHwgIWNwLT5jbWQpCisJCXJldHVybjsKKworCWNtZCA9IGNwLT5jbWQ7CisJc2RldiA9IGNtZC0+ZGV2aWNlOworCWlmIChERUJVR19GTEFHUyAmIChERUJVR19USU5ZfERFQlVHX1JFU1VMVCkpIHsKKwkJZGV2X2luZm8oJnNkZXYtPnNkZXZfZ2VuZGV2LCAiQ0NCPSVwIFNUQVQ9JXgvJXgvJXhcbiIsIGNwLAorCQkJY3AtPmhvc3Rfc3RhdHVzLCBjcC0+c3Nzc19zdGF0dXMsIGNwLT5ob3N0X2ZsYWdzKTsKKwl9CisKKwkvKgorCSAqICBHZXQgdGFyZ2V0IGFuZCBsdW4gcG9pbnRlcnMuCisJICovCisJdHAgPSAmbnAtPnRhcmdldFtjcC0+dGFyZ2V0XTsKKwlscCA9IHN5bV9scCh0cCwgc2Rldi0+bHVuKTsKKworCS8qCisJICogIENoZWNrIGZvciBleHRlbmRlZCBlcnJvcnMuCisJICovCisJaWYgKGNwLT54ZXJyX3N0YXR1cykgeworCQlpZiAoc3ltX3ZlcmJvc2UpCisJCQlzeW1fcHJpbnRfeGVycihjbWQsIGNwLT54ZXJyX3N0YXR1cyk7CisJCWlmIChjcC0+aG9zdF9zdGF0dXMgPT0gSFNfQ09NUExFVEUpCisJCQljcC0+aG9zdF9zdGF0dXMgPSBIU19DT01QX0VSUjsKKwl9CisKKwkvKgorCSAqICBDYWxjdWxhdGUgdGhlIHJlc2lkdWFsLgorCSAqLworCXJlc2lkID0gc3ltX2NvbXB1dGVfcmVzaWR1YWwobnAsIGNwKTsKKworCWlmICghU1lNX1NFVFVQX1JFU0lEVUFMX1NVUFBPUlQpIHsvKiBJZiB1c2VyIGRvZXMgbm90IHdhbnQgcmVzaWR1YWxzICovCisJCXJlc2lkICA9IDA7CQkgLyogdGhyb3cgdGhlbSBhd2F5LiA6KQkJICAgICovCisJCWNwLT5zdl9yZXNpZCA9IDA7CisJfQorI2lmZGVmIERFQlVHXzJfMF9YCitpZiAocmVzaWQpCisJcHJpbnRmKCJYWFhYIFJFU0lEPSAlZCAtIDB4JXhcbiIsIHJlc2lkLCByZXNpZCk7CisjZW5kaWYKKworCS8qCisJICogIERlcXVldWUgYWxsIHF1ZXVlZCBDQ0JzIGZvciB0aGF0IGRldmljZSAKKwkgKiAgbm90IHlldCBzdGFydGVkIGJ5IFNDUklQVFMuCisJICovCisJaSA9IChJTkwobnAsIG5jX3NjcmF0Y2hhKSAtIG5wLT5zcXVldWVfYmEpIC8gNDsKKwlpID0gc3ltX2RlcXVldWVfZnJvbV9zcXVldWUobnAsIGksIGNwLT50YXJnZXQsIHNkZXYtPmx1biwgLTEpOworCisJLyoKKwkgKiAgUmVzdGFydCB0aGUgU0NSSVBUUyBwcm9jZXNzb3IuCisJICovCisJT1VUTF9EU1AobnAsIFNDUklQVEFfQkEobnAsIHN0YXJ0KSk7CisKKyNpZmRlZiBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcKKwlpZiAoY3AtPmhvc3Rfc3RhdHVzID09IEhTX0NPTVBMRVRFICYmCisJICAgIGNwLT5zc3NzX3N0YXR1cyA9PSBTX1FVRVVFX0ZVTEwpIHsKKwkJaWYgKCFscCB8fCBscC0+c3RhcnRlZF90YWdzIC0gaSA8IDIpCisJCQlnb3RvIHdlaXJkbmVzczsKKwkJLyoKKwkJICogIERlY3JlYXNlIHF1ZXVlIGRlcHRoIGFzIG5lZWRlZC4KKwkJICovCisJCWxwLT5zdGFydGVkX21heCA9IGxwLT5zdGFydGVkX3RhZ3MgLSBpIC0gMTsKKwkJbHAtPm51bV9zZ29vZCA9IDA7CisKKwkJaWYgKHN5bV92ZXJib3NlID49IDIpIHsKKwkJCXN5bV9wcmludF9hZGRyKGNtZCwgIiBxdWV1ZSBkZXB0aCBpcyBub3cgJWRcbiIsCisJCQkJCWxwLT5zdGFydGVkX21heCk7CisJCX0KKworCQkvKgorCQkgKiAgUmVwYWlyIHRoZSBDQ0IuCisJCSAqLworCQljcC0+aG9zdF9zdGF0dXMgPSBIU19CVVNZOworCQljcC0+c3Nzc19zdGF0dXMgPSBTX0lMTEVHQUw7CisKKwkJLyoKKwkJICogIExldCdzIHJlcXVldWUgaXQgdG8gZGV2aWNlLgorCQkgKi8KKwkJc3ltX3NldF9jYW1fc3RhdHVzKGNtZCwgQ0FNX1JFUVVFVUVfUkVRKTsKKwkJZ290byBmaW5pc2g7CisJfQord2VpcmRuZXNzOgorI2VuZGlmCisJLyoKKwkgKiAgQnVpbGQgcmVzdWx0IGluIENBTSBjY2IuCisJICovCisJc3ltX3NldF9jYW1fcmVzdWx0X2Vycm9yKG5wLCBjcCwgcmVzaWQpOworCisjaWZkZWYgU1lNX09QVF9IQU5ETEVfREVWSUNFX1FVRVVFSU5HCitmaW5pc2g6CisjZW5kaWYKKwkvKgorCSAqICBBZGQgdGhpcyBvbmUgdG8gdGhlIENPTVAgcXVldWUuCisJICovCisJc3ltX3JlbXF1ZSgmY3AtPmxpbmtfY2NicSk7CisJc3ltX2luc3F1ZV9oZWFkKCZjcC0+bGlua19jY2JxLCAmbnAtPmNvbXBfY2NicSk7CisKKwkvKgorCSAqICBDb21wbGV0ZSBhbGwgdGhvc2UgY29tbWFuZHMgd2l0aCBlaXRoZXIgZXJyb3IgCisJICogIG9yIHJlcXVldWUgY29uZGl0aW9uLgorCSAqLworCXN5bV9mbHVzaF9jb21wX3F1ZXVlKG5wLCAwKTsKKworI2lmZGVmIFNZTV9PUFRfSEFORExFX0RFVklDRV9RVUVVRUlORworCS8qCisJICogIERvbm5vdCBzdGFydCBtb3JlIHRoYW4gMSBjb21tYW5kIGFmdGVyIGFuIGVycm9yLgorCSAqLworCWlmIChscCkKKwkJc3ltX3N0YXJ0X25leHRfY2NicyhucCwgbHAsIDEpOworI2VuZGlmCit9CisKKy8qCisgKiAgQ29tcGxldGUgZXhlY3V0aW9uIG9mIGEgc3VjY2Vzc2Z1bCBTQ1NJIGNvbW1hbmQuCisgKgorICogIE9ubHkgc3VjY2Vzc2Z1bCBjb21tYW5kcyBnbyB0byB0aGUgRE9ORSBxdWV1ZSwgCisgKiAgc2luY2Ugd2UgbmVlZCB0byBoYXZlIHRoZSBTQ1JJUFRTIHByb2Nlc3NvciAKKyAqICBzdG9wcGVkIG9uIGFueSBlcnJvciBjb25kaXRpb24uCisgKiAgVGhlIFNDUklQVFMgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgd2hpbGUgd2UgYXJlIAorICogIGNvbXBsZXRpbmcgc3VjY2Vzc2Z1bCBjb21tYW5kcy4KKyAqLwordm9pZCBzeW1fY29tcGxldGVfb2sgKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV9jY2IgKmNwKQoreworCXN0cnVjdCBzeW1fdGNiICp0cDsKKwlzdHJ1Y3Qgc3ltX2xjYiAqbHA7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCWludCByZXNpZDsKKworCS8qCisJICogIFBhcmFub2lkIGNoZWNrLiA6KQorCSAqLworCWlmICghY3AgfHwgIWNwLT5jbWQpCisJCXJldHVybjsKKwlhc3NlcnQgKGNwLT5ob3N0X3N0YXR1cyA9PSBIU19DT01QTEVURSk7CisKKwkvKgorCSAqICBHZXQgdXNlciBjb21tYW5kLgorCSAqLworCWNtZCA9IGNwLT5jbWQ7CisKKwkvKgorCSAqICBHZXQgdGFyZ2V0IGFuZCBsdW4gcG9pbnRlcnMuCisJICovCisJdHAgPSAmbnAtPnRhcmdldFtjcC0+dGFyZ2V0XTsKKwlscCA9IHN5bV9scCh0cCwgY3AtPmx1bik7CisKKwkvKgorCSAqICBBc3N1bWUgZGV2aWNlIGRpc2NvdmVyZWQgb24gZmlyc3Qgc3VjY2Vzcy4KKwkgKi8KKwlpZiAoIWxwKQorCQlzeW1fc2V0X2JpdCh0cC0+bHVuX21hcCwgY3AtPmx1bik7CisKKwkvKgorCSAqICBJZiBhbGwgZGF0YSBoYXZlIGJlZW4gdHJhbnNmZXJyZWQsIGdpdmVuIHRoYW4gbm8KKwkgKiAgZXh0ZW5kZWQgZXJyb3IgZGlkIG9jY3VyLCB0aGVyZSBpcyBubyByZXNpZHVhbC4KKwkgKi8KKwlyZXNpZCA9IDA7CisJaWYgKGNwLT5waHlzLmhlYWQubGFzdHAgIT0gc3ltX2dvYWxwKGNwKSkKKwkJcmVzaWQgPSBzeW1fY29tcHV0ZV9yZXNpZHVhbChucCwgY3ApOworCisJLyoKKwkgKiAgV3JvbmcgdHJhbnNmZXIgcmVzaWR1YWxzIG1heSBiZSB3b3JzZSB0aGFuIGp1c3QgYWx3YXlzIAorCSAqICByZXR1cm5pbmcgemVyby4gVXNlciBjYW4gZGlzYWJsZSB0aGlzIGZlYXR1cmUgaW4gCisJICogIHN5bTUzYzh4eC5oLiBSZXNpZHVhbCBzdXBwb3J0IGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KKwkgKi8KKwlpZiAoIVNZTV9TRVRVUF9SRVNJRFVBTF9TVVBQT1JUKQorCQlyZXNpZCAgPSAwOworI2lmZGVmIERFQlVHXzJfMF9YCitpZiAocmVzaWQpCisJcHJpbnRmKCJYWFhYIFJFU0lEPSAlZCAtIDB4JXhcbiIsIHJlc2lkLCByZXNpZCk7CisjZW5kaWYKKworCS8qCisJICogIEJ1aWxkIHJlc3VsdCBpbiBDQU0gY2NiLgorCSAqLworCXN5bV9zZXRfY2FtX3Jlc3VsdF9vayhjcCwgY21kLCByZXNpZCk7CisKKyNpZmRlZglTWU1fT1BUX1NOSUZGX0lOUVVJUlkKKwkvKgorCSAqICBPbiBzdGFuZGFyZCBJTlFVSVJZIHJlc3BvbnNlIChFVlBEIGFuZCBDbUR0IAorCSAqICBub3Qgc2V0KSwgc25pZmYgb3V0IGRldmljZSBjYXBhYmlsaXRpZXMuCisJICovCisJaWYgKGNwLT5jZGJfYnVmWzBdID09IElOUVVJUlkgJiYgIShjcC0+Y2RiX2J1ZlsxXSAmIDB4MykpCisJCXN5bV9zbmlmZl9pbnF1aXJ5KG5wLCBjbWQsIHJlc2lkKTsKKyNlbmRpZgorCisjaWZkZWYgU1lNX09QVF9IQU5ETEVfREVWSUNFX1FVRVVFSU5HCisJLyoKKwkgKiAgSWYgbWF4IG51bWJlciBvZiBzdGFydGVkIGNjYnMgaGFkIGJlZW4gcmVkdWNlZCwKKwkgKiAgaW5jcmVhc2UgaXQgaWYgMjAwIGdvb2Qgc3RhdHVzIHJlY2VpdmVkLgorCSAqLworCWlmIChscCAmJiBscC0+c3RhcnRlZF9tYXggPCBscC0+c3RhcnRlZF9saW1pdCkgeworCQkrK2xwLT5udW1fc2dvb2Q7CisJCWlmIChscC0+bnVtX3Nnb29kID49IDIwMCkgeworCQkJbHAtPm51bV9zZ29vZCA9IDA7CisJCQkrK2xwLT5zdGFydGVkX21heDsKKwkJCWlmIChzeW1fdmVyYm9zZSA+PSAyKSB7CisJCQkJc3ltX3ByaW50X2FkZHIoY21kLCAiIHF1ZXVlIGRlcHRoIGlzIG5vdyAlZFxuIiwKKwkJCQkgICAgICAgbHAtPnN0YXJ0ZWRfbWF4KTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJLyoKKwkgKiAgRnJlZSBvdXIgQ0NCLgorCSAqLworCXN5bV9mcmVlX2NjYiAobnAsIGNwKTsKKworI2lmZGVmIFNZTV9PUFRfSEFORExFX0RFVklDRV9RVUVVRUlORworCS8qCisJICogIFJlcXVldWUgYSBjb3VwbGUgb2YgYXdhaXRpbmcgc2NzaSBjb21tYW5kcy4KKwkgKi8KKwlpZiAobHAgJiYgIXN5bV9xdWVfZW1wdHkoJmxwLT53YWl0aW5nX2NjYnEpKQorCQlzeW1fc3RhcnRfbmV4dF9jY2JzKG5wLCBscCwgMik7CisjZW5kaWYKKwkvKgorCSAqICBDb21wbGV0ZSB0aGUgY29tbWFuZC4KKwkgKi8KKwlzeW1feHB0X2RvbmUobnAsIGNtZCk7Cit9CisKKy8qCisgKiAgU29mdC1hdHRhY2ggdGhlIGNvbnRyb2xsZXIuCisgKi8KK2ludCBzeW1faGNiX2F0dGFjaChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IHN5bV9mdyAqZncsIHN0cnVjdCBzeW1fbnZyYW0gKm52cmFtKQoreworCXN0cnVjdCBzeW1faGNiICpucCA9IHN5bV9nZXRfaGNiKHNob3N0KTsKKwlpbnQgaTsKKworCS8qCisJICogIEdldCBzb21lIGluZm8gYWJvdXQgdGhlIGZpcm13YXJlLgorCSAqLworCW5wLT5zY3JpcHRhX3N6CSA9IGZ3LT5hX3NpemU7CisJbnAtPnNjcmlwdGJfc3oJID0gZnctPmJfc2l6ZTsKKwlucC0+c2NyaXB0el9zegkgPSBmdy0+el9zaXplOworCW5wLT5md19zZXR1cAkgPSBmdy0+c2V0dXA7CisJbnAtPmZ3X3BhdGNoCSA9IGZ3LT5wYXRjaDsKKwlucC0+ZndfbmFtZQkgPSBmdy0+bmFtZTsKKworCS8qCisJICogIFNhdmUgc2V0dGluZyBvZiBzb21lIElPIHJlZ2lzdGVycywgc28gd2Ugd2lsbCAKKwkgKiAgYmUgYWJsZSB0byBwcm9iZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMuCisJICovCisJc3ltX3NhdmVfaW5pdGlhbF9zZXR0aW5nIChucCk7CisKKwkvKgorCSAqICBSZXNldCB0aGUgY2hpcCBub3csIHNpbmNlIGl0IGhhcyBiZWVuIHJlcG9ydGVkIAorCSAqICB0aGF0IFNDU0kgY2xvY2sgY2FsaWJyYXRpb24gbWF5IG5vdCB3b3JrIHByb3Blcmx5IAorCSAqICBpZiB0aGUgY2hpcCBpcyBjdXJyZW50bHkgYWN0aXZlLgorCSAqLworCXN5bV9jaGlwX3Jlc2V0KG5wKTsKKworCS8qCisJICogIFByZXBhcmUgY29udHJvbGxlciBhbmQgZGV2aWNlcyBzZXR0aW5ncywgYWNjb3JkaW5nIAorCSAqICB0byBjaGlwIGZlYXR1cmVzLCB1c2VyIHNldC11cCBhbmQgZHJpdmVyIHNldC11cC4KKwkgKi8KKwlzeW1fcHJlcGFyZV9zZXR0aW5nKHNob3N0LCBucCwgbnZyYW0pOworCisJLyoKKwkgKiAgQ2hlY2sgdGhlIFBDSSBjbG9jayBmcmVxdWVuY3kuCisJICogIE11c3QgYmUgcGVyZm9ybWVkIGFmdGVyIHByZXBhcmVfc2V0dGluZyBzaW5jZSBpdCBkZXN0cm95cyAKKwkgKiAgU1RFU1QxIHRoYXQgaXMgdXNlZCB0byBwcm9iZSBmb3IgdGhlIGNsb2NrIGRvdWJsZXIuCisJICovCisJaSA9IHN5bV9nZXRwY2ljbG9jayhucCk7CisJaWYgKGkgPiAzNzAwMCAmJiAhKG5wLT5mZWF0dXJlcyAmIEZFXzY2TUhaKSkKKwkJcHJpbnRmKCIlczogUENJIEJVUyBjbG9jayBzZWVtcyB0b28gaGlnaDogJXUgS0h6LlxuIiwKKwkJCXN5bV9uYW1lKG5wKSwgaSk7CisKKwkvKgorCSAqICBBbGxvY2F0ZSB0aGUgc3RhcnQgcXVldWUuCisJICovCisJbnAtPnNxdWV1ZSA9IHN5bV9jYWxsb2NfZG1hKHNpemVvZih1MzIpKihNQVhfUVVFVUUqMiksIlNRVUVVRSIpOworCWlmICghbnAtPnNxdWV1ZSkKKwkJZ290byBhdHRhY2hfZmFpbGVkOworCW5wLT5zcXVldWVfYmEgPSB2dG9idXMobnAtPnNxdWV1ZSk7CisKKwkvKgorCSAqICBBbGxvY2F0ZSB0aGUgZG9uZSBxdWV1ZS4KKwkgKi8KKwlucC0+ZHF1ZXVlID0gc3ltX2NhbGxvY19kbWEoc2l6ZW9mKHUzMikqKE1BWF9RVUVVRSoyKSwiRFFVRVVFIik7CisJaWYgKCFucC0+ZHF1ZXVlKQorCQlnb3RvIGF0dGFjaF9mYWlsZWQ7CisJbnAtPmRxdWV1ZV9iYSA9IHZ0b2J1cyhucC0+ZHF1ZXVlKTsKKworCS8qCisJICogIEFsbG9jYXRlIHRoZSB0YXJnZXQgYnVzIGFkZHJlc3MgYXJyYXkuCisJICovCisJbnAtPnRhcmd0YmwgPSBzeW1fY2FsbG9jX2RtYSgyNTYsICJUQVJHVEJMIik7CisJaWYgKCFucC0+dGFyZ3RibCkKKwkJZ290byBhdHRhY2hfZmFpbGVkOworCW5wLT50YXJndGJsX2JhID0gdnRvYnVzKG5wLT50YXJndGJsKTsKKworCS8qCisJICogIEFsbG9jYXRlIFNDUklQVFMgYXJlYXMuCisJICovCisJbnAtPnNjcmlwdGEwID0gc3ltX2NhbGxvY19kbWEobnAtPnNjcmlwdGFfc3osICJTQ1JJUFRBMCIpOworCW5wLT5zY3JpcHRiMCA9IHN5bV9jYWxsb2NfZG1hKG5wLT5zY3JpcHRiX3N6LCAiU0NSSVBUQjAiKTsKKwlucC0+c2NyaXB0ejAgPSBzeW1fY2FsbG9jX2RtYShucC0+c2NyaXB0el9zeiwgIlNDUklQVFowIik7CisJaWYgKCFucC0+c2NyaXB0YTAgfHwgIW5wLT5zY3JpcHRiMCB8fCAhbnAtPnNjcmlwdHowKQorCQlnb3RvIGF0dGFjaF9mYWlsZWQ7CisKKwkvKgorCSAqICBBbGxvY2F0ZSB0aGUgYXJyYXkgb2YgbGlzdHMgb2YgQ0NCcyBoYXNoZWQgYnkgRFNBLgorCSAqLworCW5wLT5jY2JoID0ga2NhbGxvYyhzaXplb2Yoc3RydWN0IHN5bV9jY2IgKiopLCBDQ0JfSEFTSF9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5wLT5jY2JoKQorCQlnb3RvIGF0dGFjaF9mYWlsZWQ7CisKKwkvKgorCSAqICBJbml0aWFseXplIHRoZSBDQ0IgZnJlZSBhbmQgYnVzeSBxdWV1ZXMuCisJICovCisJc3ltX3F1ZV9pbml0KCZucC0+ZnJlZV9jY2JxKTsKKwlzeW1fcXVlX2luaXQoJm5wLT5idXN5X2NjYnEpOworCXN5bV9xdWVfaW5pdCgmbnAtPmNvbXBfY2NicSk7CisKKwkvKgorCSAqICBJbml0aWFsaXphdGlvbiBmb3Igb3B0aW9uYWwgaGFuZGxpbmcgCisJICogIG9mIGRldmljZSBxdWV1ZWluZy4KKwkgKi8KKyNpZmRlZiBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcKKwlzeW1fcXVlX2luaXQoJm5wLT5kdW1teV9jY2JxKTsKKyNlbmRpZgorCS8qCisJICogIEFsbG9jYXRlIHNvbWUgQ0NCLiBXZSBuZWVkIGF0IGxlYXN0IE9ORS4KKwkgKi8KKwlpZiAoIXN5bV9hbGxvY19jY2IobnApKQorCQlnb3RvIGF0dGFjaF9mYWlsZWQ7CisKKwkvKgorCSAqICBDYWxjdWxhdGUgQlVTIGFkZHJlc3NlcyB3aGVyZSB3ZSBhcmUgZ29pbmcgCisJICogIHRvIGxvYWQgdGhlIFNDUklQVFMuCisJICovCisJbnAtPnNjcmlwdGFfYmEJPSB2dG9idXMobnAtPnNjcmlwdGEwKTsKKwlucC0+c2NyaXB0Yl9iYQk9IHZ0b2J1cyhucC0+c2NyaXB0YjApOworCW5wLT5zY3JpcHR6X2JhCT0gdnRvYnVzKG5wLT5zY3JpcHR6MCk7CisKKwlpZiAobnAtPnJhbV9iYSkgeworCQlucC0+c2NyaXB0YV9iYQk9IG5wLT5yYW1fYmE7CisJCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9SQU04SykgeworCQkJbnAtPnJhbV93cyA9IDgxOTI7CisJCQlucC0+c2NyaXB0Yl9iYSA9IG5wLT5zY3JpcHRhX2JhICsgNDA5NjsKKyNpZiAwCS8qIE1heSBnZXQgdXNlZnVsIGZvciA2NCBCSVQgUENJIGFkZHJlc3NpbmcgKi8KKwkJCW5wLT5zY3JfcmFtX3NlZyA9IGNwdV90b19zY3IobnAtPnNjcmlwdGFfYmEgPj4gMzIpOworI2VuZGlmCisJCX0KKwkJZWxzZQorCQkJbnAtPnJhbV93cyA9IDQwOTY7CisJfQorCisJLyoKKwkgKiAgQ29weSBzY3JpcHRzIHRvIGNvbnRyb2xsZXIgaW5zdGFuY2UuCisJICovCisJbWVtY3B5KG5wLT5zY3JpcHRhMCwgZnctPmFfYmFzZSwgbnAtPnNjcmlwdGFfc3opOworCW1lbWNweShucC0+c2NyaXB0YjAsIGZ3LT5iX2Jhc2UsIG5wLT5zY3JpcHRiX3N6KTsKKwltZW1jcHkobnAtPnNjcmlwdHowLCBmdy0+el9iYXNlLCBucC0+c2NyaXB0el9zeik7CisKKwkvKgorCSAqICBTZXR1cCB2YXJpYWJsZSBwYXJ0cyBpbiBzY3JpcHRzIGFuZCBjb21wdXRlCisJICogIHNjcmlwdHMgYnVzIGFkZHJlc3NlcyB1c2VkIGZyb20gdGhlIEMgY29kZS4KKwkgKi8KKwlucC0+Zndfc2V0dXAobnAsIGZ3KTsKKworCS8qCisJICogIEJpbmQgU0NSSVBUUyB3aXRoIHBoeXNpY2FsIGFkZHJlc3NlcyB1c2FibGUgYnkgdGhlIAorCSAqICBTQ1JJUFRTIHByb2Nlc3NvciAoYXMgc2VlbiBmcm9tIHRoZSBCVVMgPSBCVVMgYWRkcmVzc2VzKS4KKwkgKi8KKwlzeW1fZndfYmluZF9zY3JpcHQobnAsICh1MzIgKikgbnAtPnNjcmlwdGEwLCBucC0+c2NyaXB0YV9zeik7CisJc3ltX2Z3X2JpbmRfc2NyaXB0KG5wLCAodTMyICopIG5wLT5zY3JpcHRiMCwgbnAtPnNjcmlwdGJfc3opOworCXN5bV9md19iaW5kX3NjcmlwdChucCwgKHUzMiAqKSBucC0+c2NyaXB0ejAsIG5wLT5zY3JpcHR6X3N6KTsKKworI2lmZGVmIFNZTV9DT05GX0lBUkJfU1VQUE9SVAorCS8qCisJICogICAgSWYgdXNlciB3YW50cyBJQVJCIHRvIGJlIHNldCB3aGVuIHdlIHdpbiBhcmJpdHJhdGlvbiAKKwkgKiAgICBhbmQgaGF2ZSBvdGhlciBqb2JzLCBjb21wdXRlIHRoZSBtYXggbnVtYmVyIG9mIGNvbnNlY3V0aXZlIAorCSAqICAgIHNldHRpbmdzIG9mIElBUkIgaGludHMgYmVmb3JlIHdlIGxlYXZlIGRldmljZXMgYSBjaGFuY2UgdG8gCisJICogICAgYXJiaXRyYXRlIGZvciByZXNlbGVjdGlvbi4KKwkgKi8KKyNpZmRlZglTWU1fU0VUVVBfSUFSQl9NQVgKKwlucC0+aWFyYl9tYXggPSBTWU1fU0VUVVBfSUFSQl9NQVg7CisjZWxzZQorCW5wLT5pYXJiX21heCA9IDQ7CisjZW5kaWYKKyNlbmRpZgorCisJLyoKKwkgKiAgUHJlcGFyZSB0aGUgaWRsZSBhbmQgaW52YWxpZCB0YXNrIGFjdGlvbnMuCisJICovCisJbnAtPmlkbGV0YXNrLnN0YXJ0CT0gY3B1X3RvX3NjcihTQ1JJUFRBX0JBKG5wLCBpZGxlKSk7CisJbnAtPmlkbGV0YXNrLnJlc3RhcnQJPSBjcHVfdG9fc2NyKFNDUklQVEJfQkEobnAsIGJhZF9pX3RfbCkpOworCW5wLT5pZGxldGFza19iYQkJPSB2dG9idXMoJm5wLT5pZGxldGFzayk7CisKKwlucC0+bm90YXNrLnN0YXJ0CT0gY3B1X3RvX3NjcihTQ1JJUFRBX0JBKG5wLCBpZGxlKSk7CisJbnAtPm5vdGFzay5yZXN0YXJ0CT0gY3B1X3RvX3NjcihTQ1JJUFRCX0JBKG5wLCBiYWRfaV90X2wpKTsKKwlucC0+bm90YXNrX2JhCQk9IHZ0b2J1cygmbnAtPm5vdGFzayk7CisKKwlucC0+YmFkX2l0bC5zdGFydAk9IGNwdV90b19zY3IoU0NSSVBUQV9CQShucCwgaWRsZSkpOworCW5wLT5iYWRfaXRsLnJlc3RhcnQJPSBjcHVfdG9fc2NyKFNDUklQVEJfQkEobnAsIGJhZF9pX3RfbCkpOworCW5wLT5iYWRfaXRsX2JhCQk9IHZ0b2J1cygmbnAtPmJhZF9pdGwpOworCisJbnAtPmJhZF9pdGxxLnN0YXJ0CT0gY3B1X3RvX3NjcihTQ1JJUFRBX0JBKG5wLCBpZGxlKSk7CisJbnAtPmJhZF9pdGxxLnJlc3RhcnQJPSBjcHVfdG9fc2NyKFNDUklQVEJfQkEobnAsYmFkX2lfdF9sX3EpKTsKKwlucC0+YmFkX2l0bHFfYmEJCT0gdnRvYnVzKCZucC0+YmFkX2l0bHEpOworCisJLyoKKwkgKiAgQWxsb2NhdGUgYW5kIHByZXBhcmUgdGhlIGx1biBKVU1QIHRhYmxlIHRoYXQgaXMgdXNlZCAKKwkgKiAgZm9yIGEgdGFyZ2V0IHByaW9yIHRoZSBwcm9iaW5nIG9mIGRldmljZXMgKGJhZCBsdW4gdGFibGUpLgorCSAqICBBIHByaXZhdGUgdGFibGUgd2lsbCBiZSBhbGxvY2F0ZWQgZm9yIHRoZSB0YXJnZXQgb24gdGhlIAorCSAqICBmaXJzdCBJTlFVSVJZIHJlc3BvbnNlIHJlY2VpdmVkLgorCSAqLworCW5wLT5iYWRsdW50YmwgPSBzeW1fY2FsbG9jX2RtYSgyNTYsICJCQURMVU5UQkwiKTsKKwlpZiAoIW5wLT5iYWRsdW50YmwpCisJCWdvdG8gYXR0YWNoX2ZhaWxlZDsKKworCW5wLT5iYWRsdW5fc2EgPSBjcHVfdG9fc2NyKFNDUklQVEJfQkEobnAsIHJlc2VsX2JhZF9sdW4pKTsKKwlmb3IgKGkgPSAwIDsgaSA8IDY0IDsgaSsrKQkvKiA2NCBsdW5zL3RhcmdldCwgbm8gbGVzcyAqLworCQlucC0+YmFkbHVudGJsW2ldID0gY3B1X3RvX3Njcih2dG9idXMoJm5wLT5iYWRsdW5fc2EpKTsKKworCS8qCisJICogIFByZXBhcmUgdGhlIGJ1cyBhZGRyZXNzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGJ1cyAKKwkgKiAgYWRkcmVzcyBvZiBlYWNoIHRhcmdldCBjb250cm9sIGJsb2NrLgorCSAqICBGb3Igbm93LCBhc3N1bWUgYWxsIGxvZ2ljYWwgdW5pdHMgYXJlIHdyb25nLiA6KQorCSAqLworCWZvciAoaSA9IDAgOyBpIDwgU1lNX0NPTkZfTUFYX1RBUkdFVCA7IGkrKykgeworCQlucC0+dGFyZ3RibFtpXSA9IGNwdV90b19zY3IodnRvYnVzKCZucC0+dGFyZ2V0W2ldKSk7CisJCW5wLT50YXJnZXRbaV0uaGVhZC5sdW50Ymxfc2EgPQorCQkJCWNwdV90b19zY3IodnRvYnVzKG5wLT5iYWRsdW50YmwpKTsKKwkJbnAtPnRhcmdldFtpXS5oZWFkLmx1bjBfc2EgPQorCQkJCWNwdV90b19zY3IodnRvYnVzKCZucC0+YmFkbHVuX3NhKSk7CisJfQorCisJLyoKKwkgKiAgTm93IGNoZWNrIHRoZSBjYWNoZSBoYW5kbGluZyBvZiB0aGUgcGNpIGNoaXBzZXQuCisJICovCisJaWYgKHN5bV9zbm9vcHRlc3QgKG5wKSkgeworCQlwcmludGYoIiVzOiBDQUNIRSBJTkNPUlJFQ1RMWSBDT05GSUdVUkVELlxuIiwgc3ltX25hbWUobnApKTsKKwkJZ290byBhdHRhY2hfZmFpbGVkOworCX0KKworCS8qCisJICogIFNpZ2ghIHdlIGFyZSBkb25lLgorCSAqLworCXJldHVybiAwOworCithdHRhY2hfZmFpbGVkOgorCXJldHVybiAtRU5YSU87Cit9CisKKy8qCisgKiAgRnJlZSBldmVyeXRoaW5nIHRoYXQgaGFzIGJlZW4gYWxsb2NhdGVkIGZvciB0aGlzIGRldmljZS4KKyAqLwordm9pZCBzeW1faGNiX2ZyZWUoc3RydWN0IHN5bV9oY2IgKm5wKQoreworCVNZTV9RVUVIRUFEICpxcDsKKwlzdHJ1Y3Qgc3ltX2NjYiAqY3A7CisJc3RydWN0IHN5bV90Y2IgKnRwOworCXN0cnVjdCBzeW1fbGNiICpscDsKKwlpbnQgdGFyZ2V0LCBsdW47CisKKwlpZiAobnAtPnNjcmlwdHowKQorCQlzeW1fbWZyZWVfZG1hKG5wLT5zY3JpcHR6MCwgbnAtPnNjcmlwdHpfc3osICJTQ1JJUFRaMCIpOworCWlmIChucC0+c2NyaXB0YjApCisJCXN5bV9tZnJlZV9kbWEobnAtPnNjcmlwdGIwLCBucC0+c2NyaXB0Yl9zeiwgIlNDUklQVEIwIik7CisJaWYgKG5wLT5zY3JpcHRhMCkKKwkJc3ltX21mcmVlX2RtYShucC0+c2NyaXB0YTAsIG5wLT5zY3JpcHRhX3N6LCAiU0NSSVBUQTAiKTsKKwlpZiAobnAtPnNxdWV1ZSkKKwkJc3ltX21mcmVlX2RtYShucC0+c3F1ZXVlLCBzaXplb2YodTMyKSooTUFYX1FVRVVFKjIpLCAiU1FVRVVFIik7CisJaWYgKG5wLT5kcXVldWUpCisJCXN5bV9tZnJlZV9kbWEobnAtPmRxdWV1ZSwgc2l6ZW9mKHUzMikqKE1BWF9RVUVVRSoyKSwgIkRRVUVVRSIpOworCisJaWYgKG5wLT5hY3RjY2JzKSB7CisJCXdoaWxlICgocXAgPSBzeW1fcmVtcXVlX2hlYWQoJm5wLT5mcmVlX2NjYnEpKSAhPSAwKSB7CisJCQljcCA9IHN5bV9xdWVfZW50cnkocXAsIHN0cnVjdCBzeW1fY2NiLCBsaW5rX2NjYnEpOworCQkJc3ltX21mcmVlX2RtYShjcCwgc2l6ZW9mKCpjcCksICJDQ0IiKTsKKwkJfQorCX0KKwlrZnJlZShucC0+Y2NiaCk7CisKKwlpZiAobnAtPmJhZGx1bnRibCkKKwkJc3ltX21mcmVlX2RtYShucC0+YmFkbHVudGJsLCAyNTYsIkJBRExVTlRCTCIpOworCisJZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPCBTWU1fQ09ORl9NQVhfVEFSR0VUIDsgdGFyZ2V0KyspIHsKKwkJdHAgPSAmbnAtPnRhcmdldFt0YXJnZXRdOworCQlmb3IgKGx1biA9IDAgOyBsdW4gPCBTWU1fQ09ORl9NQVhfTFVOIDsgbHVuKyspIHsKKwkJCWxwID0gc3ltX2xwKHRwLCBsdW4pOworCQkJaWYgKCFscCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChscC0+aXRscV90YmwpCisJCQkJc3ltX21mcmVlX2RtYShscC0+aXRscV90YmwsIFNZTV9DT05GX01BWF9UQVNLKjQsCisJCQkJICAgICAgICJJVExRX1RCTCIpOworCQkJa2ZyZWUobHAtPmNiX3RhZ3MpOworCQkJc3ltX21mcmVlX2RtYShscCwgc2l6ZW9mKCpscCksICJMQ0IiKTsKKwkJfQorI2lmIFNZTV9DT05GX01BWF9MVU4gPiAxCisJCWtmcmVlKHRwLT5sdW5tcCk7CisjZW5kaWYgCisJfQorCWlmIChucC0+dGFyZ3RibCkKKwkJc3ltX21mcmVlX2RtYShucC0+dGFyZ3RibCwgMjU2LCAiVEFSR1RCTCIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9oaXBkLmggYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2hpcGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTVjYmU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9oaXBkLmgKQEAgLTAsMCArMSwxMzA0IEBACisvKgorICogRGV2aWNlIGRyaXZlciBmb3IgdGhlIFNZTUJJT1MvTFNJTE9HSUMgNTNDOFhYIGFuZCA1M0MxMDEwIGZhbWlseSAKKyAqIG9mIFBDSS1TQ1NJIElPIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgIEdlcmFyZCBSb3VkaWVyIDxncm91ZGllckBmcmVlLmZyPgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGRlcml2ZWQgZnJvbSB0aGUgTGludXggc3ltNTNjOHh4IGRyaXZlci4KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAwICBHZXJhcmQgUm91ZGllcgorICoKKyAqIFRoZSBzeW01M2M4eHggZHJpdmVyIGlzIGRlcml2ZWQgZnJvbSB0aGUgbmNyNTNjOHh4IGRyaXZlciB0aGF0IGhhZCBiZWVuIAorICogYSBwb3J0IG9mIHRoZSBGcmVlQlNEIG5jciBkcml2ZXIgdG8gTGludXgtMS4yLjEzLgorICoKKyAqIFRoZSBvcmlnaW5hbCBuY3IgZHJpdmVyIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIDM4NmJzZCBhbmQgRnJlZUJTRCBieQorICogICAgICAgICBXb2xmZ2FuZyBTdGFuZ2xtZWllciAgICAgICAgPHdvbGZAY29sb2duZS5kZT4KKyAqICAgICAgICAgU3RlZmFuIEVzc2VyICAgICAgICAgICAgICAgIDxzZUBtaS5VbmktS29lbG4uZGU+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTQgIFdvbGZnYW5nIFN0YW5nbG1laWVyCisgKgorICogT3RoZXIgbWFqb3IgY29udHJpYnV0aW9uczoKKyAqCisgKiBOVlJBTSBkZXRlY3Rpb24gYW5kIHJlYWRpbmcuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgUmljaGFyZCBXYWx0aGFtIDxkb3Jtb3VzZUBmYXJzcm9idC5kZW1vbi5jby51az4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgU1lNX0hJUERfSAorI2RlZmluZSBTWU1fSElQRF9ICisKKy8qCisgKiAgR2VuZXJpYyBkcml2ZXIgb3B0aW9ucy4KKyAqCisgKiAgVGhleSBtYXkgYmUgZGVmaW5lZCBpbiBwbGF0Zm9ybSBzcGVjaWZpYyBoZWFkZXJzLCBpZiB0aGV5IAorICogIGFyZSB1c2VmdWwuCisgKgorICogICAgU1lNX09QVF9IQU5ETEVfRElSX1VOS05PV04KKyAqICAgICAgICBXaGVuIHRoaXMgb3B0aW9uIGlzIHNldCwgdGhlIFNDUklQVFMgdXNlZCBieSB0aGUgZHJpdmVyIAorICogICAgICAgIGFyZSBhYmxlIHRvIGhhbmRsZSBTQ1NJIHRyYW5zZmVycyB3aXRoIGRpcmVjdGlvbiBub3QgCisgKiAgICAgICAgc3VwcGxpZWQgYnkgdXNlci4KKyAqICAgICAgICAoc2V0IGZvciBMaW51eC0yLjAuWCkKKyAqCisgKiAgICBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcKKyAqICAgICAgICBXaGVuIHRoaXMgb3B0aW9uIGlzIHNldCwgdGhlIGRyaXZlciB3aWxsIHVzZSBhIHF1ZXVlIHBlciAKKyAqICAgICAgICBkZXZpY2UgYW5kIGhhbmRsZSBRVUVVRSBGVUxMIHN0YXR1cyByZXF1ZXVpbmcgaW50ZXJuYWxseS4KKyAqCisgKiAgICBTWU1fT1BUX0xJTUlUX0NPTU1BTkRfUkVPUkRFUklORworICogICAgICAgIFdoZW4gdGhpcyBvcHRpb24gaXMgc2V0LCB0aGUgZHJpdmVyIHRyaWVzIHRvIGxpbWl0IHRhZ2dlZCAKKyAqICAgICAgICBjb21tYW5kIHJlb3JkZXJpbmcgdG8gc29tZSByZWFzb25uYWJsZSB2YWx1ZS4KKyAqICAgICAgICAoc2V0IGZvciBMaW51eCkKKyAqLworI2lmIDAKKyNkZWZpbmUgU1lNX09QVF9IQU5ETEVfRElSX1VOS05PV04KKyNkZWZpbmUgU1lNX09QVF9IQU5ETEVfREVWSUNFX1FVRVVFSU5HCisjZGVmaW5lIFNZTV9PUFRfTElNSVRfQ09NTUFORF9SRU9SREVSSU5HCisjZW5kaWYKKworLyoKKyAqICBBY3RpdmUgZGVidWdnaW5nIHRhZ3MgYW5kIHZlcmJvc2l0eS4KKyAqICBCb3RoIERFQlVHX0ZMQUdTIGFuZCBzeW1fdmVyYm9zZSBjYW4gYmUgcmVkZWZpbmVkIAorICogIGJ5IHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBjb2RlIHRvIHNvbWV0aGluZyBlbHNlLgorICovCisjZGVmaW5lIERFQlVHX0FMTE9DCSgweDAwMDEpCisjZGVmaW5lIERFQlVHX1BIQVNFCSgweDAwMDIpCisjZGVmaW5lIERFQlVHX1BPTEwJKDB4MDAwNCkKKyNkZWZpbmUgREVCVUdfUVVFVUUJKDB4MDAwOCkKKyNkZWZpbmUgREVCVUdfUkVTVUxUCSgweDAwMTApCisjZGVmaW5lIERFQlVHX1NDQVRURVIJKDB4MDAyMCkKKyNkZWZpbmUgREVCVUdfU0NSSVBUCSgweDAwNDApCisjZGVmaW5lIERFQlVHX1RJTlkJKDB4MDA4MCkKKyNkZWZpbmUgREVCVUdfVElNSU5HCSgweDAxMDApCisjZGVmaW5lIERFQlVHX05FR08JKDB4MDIwMCkKKyNkZWZpbmUgREVCVUdfVEFHUwkoMHgwNDAwKQorI2RlZmluZSBERUJVR19QT0lOVEVSCSgweDA4MDApCisKKyNpZm5kZWYgREVCVUdfRkxBR1MKKyNkZWZpbmUgREVCVUdfRkxBR1MJKDB4MDAwMCkKKyNlbmRpZgorCisjaWZuZGVmIHN5bV92ZXJib3NlCisjZGVmaW5lIHN5bV92ZXJib3NlCShucC0+dmVyYm9zZSkKKyNlbmRpZgorCisvKgorICogIFRoZXNlIG9uZXMgc2hvdWxkIGhhdmUgYmVlbiBhbHJlYWR5IGRlZmluZWQuCisgKi8KKyNpZm5kZWYgYXNzZXJ0CisjZGVmaW5lCWFzc2VydChleHByZXNzaW9uKSB7IFwKKwlpZiAoIShleHByZXNzaW9uKSkgeyBcCisJCSh2b2lkKXBhbmljKCBcCisJCQkiYXNzZXJ0aW9uIFwiJXNcIiBmYWlsZWQ6IGZpbGUgXCIlc1wiLCBsaW5lICVkXG4iLCBcCisJCQkjZXhwcmVzc2lvbiwgXAorCQkJX19GSUxFX18sIF9fTElORV9fKTsgXAorCX0gXAorfQorI2VuZGlmCisKKy8qCisgKiAgTnVtYmVyIG9mIHRhc2tzIHBlciBkZXZpY2Ugd2Ugd2FudCB0byBoYW5kbGUuCisgKi8KKyNpZglTWU1fQ09ORl9NQVhfVEFHX09SREVSID4gOAorI2Vycm9yCSJtb3JlIHRoYW4gMjU2IHRhZ3MgcGVyIGxvZ2ljYWwgdW5pdCBub3QgYWxsb3dlZC4iCisjZW5kaWYKKyNkZWZpbmUJU1lNX0NPTkZfTUFYX1RBU0sJKDE8PFNZTV9DT05GX01BWF9UQUdfT1JERVIpCisKKy8qCisgKiAgRG9ubm90IHVzZSBtb3JlIHRhc2tzIHRoYXQgd2UgY2FuIGhhbmRsZS4KKyAqLworI2lmbmRlZglTWU1fQ09ORl9NQVhfVEFHCisjZGVmaW5lCVNZTV9DT05GX01BWF9UQUcJU1lNX0NPTkZfTUFYX1RBU0sKKyNlbmRpZgorI2lmCVNZTV9DT05GX01BWF9UQUcgPiBTWU1fQ09ORl9NQVhfVEFTSworI3VuZGVmCVNZTV9DT05GX01BWF9UQUcKKyNkZWZpbmUJU1lNX0NPTkZfTUFYX1RBRwlTWU1fQ09ORl9NQVhfVEFTSworI2VuZGlmCisKKy8qCisgKiAgICBUaGlzIG9uZSBtZWFucyAnTk8gVEFHIGZvciB0aGlzIGpvYicKKyAqLworI2RlZmluZSBOT19UQUcJKDI1NikKKworLyoKKyAqICBOdW1iZXIgb2YgU0NTSSB0YXJnZXRzLgorICovCisjaWYJU1lNX0NPTkZfTUFYX1RBUkdFVCA+IDE2CisjZXJyb3IJIm1vcmUgdGhhbiAxNiB0YXJnZXRzIG5vdCBhbGxvd2VkLiIKKyNlbmRpZgorCisvKgorICogIE51bWJlciBvZiBsb2dpY2FsIHVuaXRzIHBlciB0YXJnZXQuCisgKi8KKyNpZglTWU1fQ09ORl9NQVhfTFVOID4gNjQKKyNlcnJvcgkibW9yZSB0aGFuIDY0IGxvZ2ljYWwgdW5pdHMgcGVyIHRhcmdldCBub3QgYWxsb3dlZC4iCisjZW5kaWYKKworLyoKKyAqICAgIEFzeW5jaHJvbm91cyBwcmUtc2NhbGVyIChucykuIFNoYWxsIGJlIDQwIGZvciAKKyAqICAgIHRoZSBTQ1NJIHRpbWluZ3MgdG8gYmUgY29tcGxpYW50LgorICovCisjZGVmaW5lCVNZTV9DT05GX01JTl9BU1lOQyAoNDApCisKKy8qCisgKiAgU2hvcnRlc3QgbWVtb3J5IGNodW5rIGlzICgxPDxTWU1fTUVNX1NISUZUKSwgY3VycmVudGx5IDE2LgorICogIEFjdHVhbCBhbGxvY2F0aW9ucyBoYXBwZW4gYXMgU1lNX01FTV9DTFVTVEVSX1NJWkUgc2l6ZWQuCisgKiAgKDEgUEFHRSBhdCBhIHRpbWUgaXMganVzdCBmaW5lKS4KKyAqLworI2RlZmluZSBTWU1fTUVNX1NISUZUCTQKKyNkZWZpbmUgU1lNX01FTV9DTFVTVEVSX1NJWkUJKDFVTCA8PCBTWU1fTUVNX0NMVVNURVJfU0hJRlQpCisjZGVmaW5lIFNZTV9NRU1fQ0xVU1RFUl9NQVNLCShTWU1fTUVNX0NMVVNURVJfU0laRS0xKQorCisvKgorICogIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBTVEFSVCBhbmQgRE9ORSBxdWV1ZXMuCisgKgorICogIFdlIGxpbWl0IHRvIDEgUEFHRSBpbiBvcmRlciB0byBzdWNjZWVkIGFsbG9jYXRpb24gb2YgCisgKiAgdGhlc2UgcXVldWVzLiBFYWNoIGVudHJ5IGlzIDggYnl0ZXMgbG9uZyAoMiBEV09SRFMpLgorICovCisjaWZkZWYJU1lNX0NPTkZfTUFYX1NUQVJUCisjZGVmaW5lCVNZTV9DT05GX01BWF9RVUVVRSAoU1lNX0NPTkZfTUFYX1NUQVJUKzIpCisjZWxzZQorI2RlZmluZQlTWU1fQ09ORl9NQVhfUVVFVUUgKDcqU1lNX0NPTkZfTUFYX1RBU0srMikKKyNkZWZpbmUJU1lNX0NPTkZfTUFYX1NUQVJUIChTWU1fQ09ORl9NQVhfUVVFVUUtMikKKyNlbmRpZgorCisjaWYJU1lNX0NPTkZfTUFYX1FVRVVFID4gU1lNX01FTV9DTFVTVEVSX1NJWkUvOAorI3VuZGVmCVNZTV9DT05GX01BWF9RVUVVRQorI2RlZmluZQlTWU1fQ09ORl9NQVhfUVVFVUUgKFNZTV9NRU1fQ0xVU1RFUl9TSVpFLzgpCisjdW5kZWYJU1lNX0NPTkZfTUFYX1NUQVJUCisjZGVmaW5lCVNZTV9DT05GX01BWF9TVEFSVCAoU1lNX0NPTkZfTUFYX1FVRVVFLTIpCisjZW5kaWYKKworLyoKKyAqICBGb3IgdGhpcyBvbmUsIHdlIHdhbnQgYSBzaG9ydCBuYW1lIDotKQorICovCisjZGVmaW5lIE1BWF9RVUVVRQlTWU1fQ09ORl9NQVhfUVVFVUUKKworLyoKKyAqICBDb21tb24gZGVmaW5pdGlvbnMgZm9yIGJvdGggYnVzIHNwYWNlIGJhc2VkIGFuZCBsZWdhY3kgSU8gbWV0aG9kcy4KKyAqLworCisjZGVmaW5lIElOQl9PRkYobnAsIG8pCQlpb3JlYWQ4KG5wLT5zLmlvYWRkciArIChvKSkKKyNkZWZpbmUgSU5XX09GRihucCwgbykJCWlvcmVhZDE2KG5wLT5zLmlvYWRkciArIChvKSkKKyNkZWZpbmUgSU5MX09GRihucCwgbykJCWlvcmVhZDMyKG5wLT5zLmlvYWRkciArIChvKSkKKworI2RlZmluZSBPVVRCX09GRihucCwgbywgdmFsKQlpb3dyaXRlOCgodmFsKSwgbnAtPnMuaW9hZGRyICsgKG8pKQorI2RlZmluZSBPVVRXX09GRihucCwgbywgdmFsKQlpb3dyaXRlMTYoKHZhbCksIG5wLT5zLmlvYWRkciArIChvKSkKKyNkZWZpbmUgT1VUTF9PRkYobnAsIG8sIHZhbCkJaW93cml0ZTMyKCh2YWwpLCBucC0+cy5pb2FkZHIgKyAobykpCisKKyNkZWZpbmUgSU5CKG5wLCByKQkJSU5CX09GRihucCwgb2Zmc2V0b2Yoc3RydWN0IHN5bV9yZWcsIHIpKQorI2RlZmluZSBJTlcobnAsIHIpCQlJTldfT0ZGKG5wLCBvZmZzZXRvZihzdHJ1Y3Qgc3ltX3JlZywgcikpCisjZGVmaW5lIElOTChucCwgcikJCUlOTF9PRkYobnAsIG9mZnNldG9mKHN0cnVjdCBzeW1fcmVnLCByKSkKKworI2RlZmluZSBPVVRCKG5wLCByLCB2KQkJT1VUQl9PRkYobnAsIG9mZnNldG9mKHN0cnVjdCBzeW1fcmVnLCByKSwgKHYpKQorI2RlZmluZSBPVVRXKG5wLCByLCB2KQkJT1VUV19PRkYobnAsIG9mZnNldG9mKHN0cnVjdCBzeW1fcmVnLCByKSwgKHYpKQorI2RlZmluZSBPVVRMKG5wLCByLCB2KQkJT1VUTF9PRkYobnAsIG9mZnNldG9mKHN0cnVjdCBzeW1fcmVnLCByKSwgKHYpKQorCisjZGVmaW5lIE9VVE9OQihucCwgciwgbSkJT1VUQihucCwgciwgSU5CKG5wLCByKSB8IChtKSkKKyNkZWZpbmUgT1VUT0ZGQihucCwgciwgbSkJT1VUQihucCwgciwgSU5CKG5wLCByKSAmIH4obSkpCisjZGVmaW5lIE9VVE9OVyhucCwgciwgbSkJT1VUVyhucCwgciwgSU5XKG5wLCByKSB8IChtKSkKKyNkZWZpbmUgT1VUT0ZGVyhucCwgciwgbSkJT1VUVyhucCwgciwgSU5XKG5wLCByKSAmIH4obSkpCisjZGVmaW5lIE9VVE9OTChucCwgciwgbSkJT1VUTChucCwgciwgSU5MKG5wLCByKSB8IChtKSkKKyNkZWZpbmUgT1VUT0ZGTChucCwgciwgbSkJT1VUTChucCwgciwgSU5MKG5wLCByKSAmIH4obSkpCisKKy8qCisgKiAgV2Ugbm9ybWFsbHkgd2FudCB0aGUgY2hpcCB0byBoYXZlIGEgY29uc2lzdGVudCB2aWV3CisgKiAgb2YgZHJpdmVyIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyB3aGVuIHdlIHJlc3RhcnQgaXQuCisgKiAgVGh1cyB0aGVzZSBtYWNyb3MuCisgKi8KKyNkZWZpbmUgT1VUTF9EU1AobnAsIHYpCQkJCVwKKwlkbyB7CQkJCQlcCisJCU1FTU9SWV9XUklURV9CQVJSSUVSKCk7CQlcCisJCU9VVEwobnAsIG5jX2RzcCwgKHYpKTsJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIE9VVE9OQl9TVEQoKQkJCQlcCisJZG8gewkJCQkJXAorCQlNRU1PUllfV1JJVEVfQkFSUklFUigpOwkJXAorCQlPVVRPTkIobnAsIG5jX2RjbnRsLCAoU1REfE5PQ09NKSk7CVwKKwl9IHdoaWxlICgwKQorCisvKgorICogIENvbW1hbmQgY29udHJvbCBibG9jayBzdGF0ZXMuCisgKi8KKyNkZWZpbmUgSFNfSURMRQkJKDApCisjZGVmaW5lIEhTX0JVU1kJCSgxKQorI2RlZmluZSBIU19ORUdPVElBVEUJKDIpCS8qIHN5bmMvd2lkZSBkYXRhIHRyYW5zZmVyKi8KKyNkZWZpbmUgSFNfRElTQ09OTkVDVAkoMykJLyogRGlzY29ubmVjdGVkIGJ5IHRhcmdldCAqLworI2RlZmluZSBIU19XQUlUCQkoNCkJLyogd2FpdGluZyBmb3IgcmVzb3VyY2UJICAqLworCisjZGVmaW5lIEhTX0RPTkVNQVNLCSgweDgwKQorI2RlZmluZSBIU19DT01QTEVURQkoNHxIU19ET05FTUFTSykKKyNkZWZpbmUgSFNfU0VMX1RJTUVPVVQJKDV8SFNfRE9ORU1BU0spCS8qIFNlbGVjdGlvbiB0aW1lb3V0ICAgICAgKi8KKyNkZWZpbmUgSFNfVU5FWFBFQ1RFRAkoNnxIU19ET05FTUFTSykJLyogVW5leHBlY3RlZCBkaXNjb25uZWN0ICAqLworI2RlZmluZSBIU19DT01QX0VSUgkoN3xIU19ET05FTUFTSykJLyogQ29tcGxldGVkIHdpdGggZXJyb3IJICAqLworCisvKgorICogIFNvZnR3YXJlIEludGVycnVwdCBDb2RlcworICovCisjZGVmaW5lCVNJUl9CQURfU0NTSV9TVEFUVVMJKDEpCisjZGVmaW5lCVNJUl9TRUxfQVROX05PX01TR19PVVQJKDIpCisjZGVmaW5lCVNJUl9NU0dfUkVDRUlWRUQJKDMpCisjZGVmaW5lCVNJUl9NU0dfV0VJUkQJCSg0KQorI2RlZmluZQlTSVJfTkVHT19GQUlMRUQJCSg1KQorI2RlZmluZQlTSVJfTkVHT19QUk9UTwkJKDYpCisjZGVmaW5lCVNJUl9TQ1JJUFRfU1RPUFBFRAkoNykKKyNkZWZpbmUJU0lSX1JFSkVDVF9UT19TRU5ECSg4KQorI2RlZmluZQlTSVJfU1dJREVfT1ZFUlJVTgkoOSkKKyNkZWZpbmUJU0lSX1NPRExfVU5ERVJSVU4JKDEwKQorI2RlZmluZQlTSVJfUkVTRUxfTk9fTVNHX0lOCSgxMSkKKyNkZWZpbmUJU0lSX1JFU0VMX05PX0lERU5USUZZCSgxMikKKyNkZWZpbmUJU0lSX1JFU0VMX0JBRF9MVU4JKDEzKQorI2RlZmluZQlTSVJfVEFSR0VUX1NFTEVDVEVECSgxNCkKKyNkZWZpbmUJU0lSX1JFU0VMX0JBRF9JX1RfTAkoMTUpCisjZGVmaW5lCVNJUl9SRVNFTF9CQURfSV9UX0xfUQkoMTYpCisjZGVmaW5lCVNJUl9BQk9SVF9TRU5UCQkoMTcpCisjZGVmaW5lCVNJUl9SRVNFTF9BQk9SVEVECSgxOCkKKyNkZWZpbmUJU0lSX01TR19PVVRfRE9ORQkoMTkpCisjZGVmaW5lCVNJUl9DT01QTEVURV9FUlJPUgkoMjApCisjZGVmaW5lCVNJUl9EQVRBX09WRVJSVU4JKDIxKQorI2RlZmluZQlTSVJfQkFEX1BIQVNFCQkoMjIpCisjaWYJU1lNX0NPTkZfRE1BX0FERFJFU1NJTkdfTU9ERSA9PSAyCisjZGVmaW5lCVNJUl9ETUFQX0RJUlRZCQkoMjMpCisjZGVmaW5lCVNJUl9NQVgJCQkoMjMpCisjZWxzZQorI2RlZmluZQlTSVJfTUFYCQkJKDIyKQorI2VuZGlmCisKKy8qCisgKiAgRXh0ZW5kZWQgZXJyb3IgYml0IGNvZGVzLgorICogIHhlcnJfc3RhdHVzIGZpZWxkIG9mIHN0cnVjdCBzeW1fY2NiLgorICovCisjZGVmaW5lCVhFX0VYVFJBX0RBVEEJKDEpCS8qIHVuZXhwZWN0ZWQgZGF0YSBwaGFzZQkgKi8KKyNkZWZpbmUJWEVfQkFEX1BIQVNFCSgxPDwxKQkvKiBpbGxlZ2FsIHBoYXNlICg0LzUpCQkgKi8KKyNkZWZpbmUJWEVfUEFSSVRZX0VSUgkoMTw8MikJLyogdW5yZWNvdmVyZWQgU0NTSSBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUJWEVfU09ETF9VTlJVTgkoMTw8MykJLyogT0REIHRyYW5zZmVyIGluIERBVEEgT1VUIHBoYXNlICovCisjZGVmaW5lCVhFX1NXSURFX09WUlVOCSgxPDw0KQkvKiBPREQgdHJhbnNmZXIgaW4gREFUQSBJTiBwaGFzZSAqLworCisvKgorICogIE5lZ290aWF0aW9uIHN0YXR1cy4KKyAqICBuZWdvX3N0YXR1cyBmaWVsZCBvZiBzdHJ1Y3Qgc3ltX2NjYi4KKyAqLworI2RlZmluZSBOU19TWU5DCQkoMSkKKyNkZWZpbmUgTlNfV0lERQkJKDIpCisjZGVmaW5lIE5TX1BQUgkJKDMpCisKKy8qCisgKiAgQSBDQ0IgaGFzaGVkIHRhYmxlIGlzIHVzZWQgdG8gcmV0cmlldmUgQ0NCIGFkZHJlc3MgCisgKiAgZnJvbSBEU0EgdmFsdWUuCisgKi8KKyNkZWZpbmUgQ0NCX0hBU0hfU0hJRlQJCTgKKyNkZWZpbmUgQ0NCX0hBU0hfU0laRQkJKDFVTCA8PCBDQ0JfSEFTSF9TSElGVCkKKyNkZWZpbmUgQ0NCX0hBU0hfTUFTSwkJKENDQl9IQVNIX1NJWkUtMSkKKyNpZiAxCisjZGVmaW5lIENDQl9IQVNIX0NPREUoZHNhKQlcCisJKCgoZHNhKSA+PiAoX0xHUlUxNl8oc2l6ZW9mKHN0cnVjdCBzeW1fY2NiKSkpKSAmIENDQl9IQVNIX01BU0spCisjZWxzZQorI2RlZmluZSBDQ0JfSEFTSF9DT0RFKGRzYSkJKCgoZHNhKSA+PiA5KSAmIENDQl9IQVNIX01BU0spCisjZW5kaWYKKworI2lmCVNZTV9DT05GX0RNQV9BRERSRVNTSU5HX01PREUgPT0gMgorLyoKKyAqICBXZSBtYXkgd2FudCB0byB1c2Ugc2VnbWVudCByZWdpc3RlcnMgZm9yIDY0IGJpdCBETUEuCisgKiAgMTYgc2VnbWVudHMgcmVnaXN0ZXJzIC0+IHVwIHRvIDY0IEdCIGFkZHJlc3NhYmxlLgorICovCisjZGVmaW5lIFNZTV9ETUFQX1NISUZUCSg0KQorI2RlZmluZSBTWU1fRE1BUF9TSVpFCSgxdTw8U1lNX0RNQVBfU0hJRlQpCisjZGVmaW5lIFNZTV9ETUFQX01BU0sJKFNZTV9ETUFQX1NJWkUtMSkKKyNlbmRpZgorCisvKgorICogIERldmljZSBmbGFncy4KKyAqLworI2RlZmluZSBTWU1fRElTQ19FTkFCTEVECSgxKQorI2RlZmluZSBTWU1fVEFHU19FTkFCTEVECSgxPDwxKQorI2RlZmluZSBTWU1fU0NBTl9CT09UX0RJU0FCTEVECSgxPDwyKQorI2RlZmluZSBTWU1fU0NBTl9MVU5TX0RJU0FCTEVECSgxPDwzKQorCisvKgorICogIEhvc3QgYWRhcHRlciBtaXNjZWxsYW5lb3VzIGZsYWdzLgorICovCisjZGVmaW5lIFNZTV9BVk9JRF9CVVNfUkVTRVQJKDEpCisKKy8qCisgKiAgTWlzYy4KKyAqLworI2RlZmluZSBTWU1fU05PT1BfVElNRU9VVCAoMTAwMDAwMDApCisjZGVmaW5lIEJVU184X0JJVAkwCisjZGVmaW5lIEJVU18xNl9CSVQJMQorCisvKgorICogIEdhdGhlciBuZWdvdGlhYmxlIHBhcmFtZXRlcnMgdmFsdWUKKyAqLworc3RydWN0IHN5bV90cmFucyB7CisJdTggcGVyaW9kOworCXU4IG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgd2lkdGg6MTsKKwl1bnNpZ25lZCBpbnQgaXU6MTsKKwl1bnNpZ25lZCBpbnQgZHQ6MTsKKwl1bnNpZ25lZCBpbnQgcWFzOjE7CisJdW5zaWduZWQgaW50IGNoZWNrX25lZ286MTsKK307CisKKy8qCisgKiAgR2xvYmFsIFRDQiBIRUFERVIuCisgKgorICogIER1ZSB0byBsYWNrIG9mIGluZGlyZWN0IGFkZHJlc3Npbmcgb24gZWFybGllciBOQ1IgY2hpcHMsCisgKiAgdGhpcyBzdWJzdHJ1Y3R1cmUgaXMgY29waWVkIGZyb20gdGhlIFRDQiB0byBhIGdsb2JhbCAKKyAqICBhZGRyZXNzIGFmdGVyIHNlbGVjdGlvbi4KKyAqICBGb3IgU1lNQklPUyBjaGlwcyB0aGF0IHN1cHBvcnQgTE9BRC9TVE9SRSB0aGlzIGNvcHkgaXMgCisgKiAgbm90IG5lZWRlZCBhbmQgdGh1cyBub3QgcGVyZm9ybWVkLgorICovCitzdHJ1Y3Qgc3ltX3RjYmggeworCS8qCisJICogIFNjcmlwdHMgYnVzIGFkZHJlc3NlcyBvZiBMVU4gdGFibGUgYWNjZXNzZWQgZnJvbSBzY3JpcHRzLgorCSAqICBMVU4gIzAgaXMgYSBzcGVjaWFsIGNhc2UsIHNpbmNlIG11bHRpLWx1biBkZXZpY2VzIGFyZSByYXJlLCAKKwkgKiAgYW5kIHdlIHdlIHdhbnQgdG8gc3BlZWQtdXAgdGhlIGdlbmVyYWwgY2FzZSBhbmQgbm90IHdhc3RlIAorCSAqICByZXNvdXJjZXMuCisJICovCisJdTMyCWx1bnRibF9zYTsJLyogYnVzIGFkZHJlc3Mgb2YgdGhpcyB0YWJsZQkqLworCXUzMglsdW4wX3NhOwkvKiBidXMgYWRkcmVzcyBvZiBMQ0IgIzAJKi8KKwkvKgorCSAqICBBY3R1YWwgU1lOQy9XSURFIElPIHJlZ2lzdGVycyB2YWx1ZSBmb3IgdGhpcyB0YXJnZXQuCisJICogICdzdmFsJywgJ3d2YWwnIGFuZCAndXZhbCcgYXJlIHJlYWQgZnJvbSBTQ1JJUFRTIGFuZCAKKwkgKiAgc28gaGF2ZSBhbGlnbm1lbnQgY29uc3RyYWludHMuCisJICovCisvKjAqLwl1X2NoYXIJdXZhbDsJCS8qIC0+IFNDTlRMNCByZWdpc3RlcgkJKi8KKy8qMSovCXVfY2hhcglzdmFsOwkJLyogLT4gU1hGRVIgIGlvIHJlZ2lzdGVyCSovCisvKjIqLwl1X2NoYXIJZmlsbGVyMTsKKy8qMyovCXVfY2hhcgl3dmFsOwkJLyogLT4gU0NOVEwzIGlvIHJlZ2lzdGVyCSovCit9OworCisvKgorICogIFRhcmdldCBDb250cm9sIEJsb2NrCisgKi8KK3N0cnVjdCBzeW1fdGNiIHsKKwkvKgorCSAqICBUQ0IgaGVhZGVyLgorCSAqICBBc3N1bWVkIGF0IG9mZnNldCAwLgorCSAqLworLyowKi8Jc3RydWN0IHN5bV90Y2JoIGhlYWQ7CisKKwkvKgorCSAqICBMVU4gdGFibGUgdXNlZCBieSB0aGUgU0NSSVBUUyBwcm9jZXNzb3IuCisJICogIEFuIGFycmF5IG9mIGJ1cyBhZGRyZXNzZXMgaXMgdXNlZCBvbiByZXNlbGVjdGlvbi4KKwkgKi8KKwl1MzIJKmx1bnRibDsJLyogTENCcyBidXMgYWRkcmVzcyB0YWJsZQkqLworCisJLyoKKwkgKiAgTFVOIHRhYmxlIHVzZWQgYnkgdGhlIEMgY29kZS4KKwkgKi8KKwlzdHJ1Y3Qgc3ltX2xjYiAqbHVuMHA7CQkvKiBMQ0Igb2YgTFVOICMwICh1c3VhbCBjYXNlKQkqLworI2lmIFNZTV9DT05GX01BWF9MVU4gPiAxCisJc3RydWN0IHN5bV9sY2IgKipsdW5tcDsJCS8qIE90aGVyIExDQnMgWzEuLk1BWF9MVU5dCSovCisjZW5kaWYKKworCS8qCisJICogIEJpdG1hcCB0aGF0IHRlbGxzIGFib3V0IExVTnMgdGhhdCBzdWNjZWVkZWQgYXQgbGVhc3QgCisJICogIDEgSU8gYW5kIHRoZXJlZm9yZSBhc3N1bWVkIHRvIGJlIGEgcmVhbCBkZXZpY2UuCisJICogIEF2b2lkIHVzZWxlc3MgYWxsb2NhdGlvbiBvZiB0aGUgTENCIHN0cnVjdHVyZS4KKwkgKi8KKwl1MzIJbHVuX21hcFsoU1lNX0NPTkZfTUFYX0xVTiszMSkvMzJdOworCisJLyoKKwkgKiAgQml0bWFwIHRoYXQgdGVsbHMgYWJvdXQgTFVOcyB0aGF0IGhhdmVuJ3QgeWV0IGFuIExDQiAKKwkgKiAgYWxsb2NhdGVkIChub3QgZGlzY292ZXJlZCBvciBMQ0IgYWxsb2NhdGlvbiBmYWlsZWQpLgorCSAqLworCXUzMglidXN5MF9tYXBbKFNZTV9DT05GX01BWF9MVU4rMzEpLzMyXTsKKworI2lmZGVmCVNZTV9IQVZFX1NUQ0IKKwkvKgorCSAqICBPL1Mgc3BlY2lmaWMgZGF0YSBzdHJ1Y3R1cmUuCisJICovCisJc3RydWN0IHN5bV9zdGNiIHM7CisjZW5kaWYKKworCS8qIFRyYW5zZmVyIGdvYWwgKi8KKwlzdHJ1Y3Qgc3ltX3RyYW5zIHRnb2FsOworCisJLyoKKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBDQ0IgdXNlZCBmb3IgdGhlIG5lZ290aWF0aW9uIGluIG9yZGVyCisJICogdG8gZW5zdXJlIHRoYXQgb25seSAxIG5lZ290aWF0aW9uIGlzIHF1ZXVlZCBhdCBhIHRpbWUuCisJICovCisJc3RydWN0IHN5bV9jY2IgKiAgbmVnb19jcDsJLyogQ0NCIHVzZWQgZm9yIHRoZSBuZWdvCQkqLworCisJLyoKKwkgKiAgU2V0IHdoZW4gd2Ugd2FudCB0byByZXNldCB0aGUgZGV2aWNlLgorCSAqLworCXVfY2hhcgl0b19yZXNldDsKKworCS8qCisJICogIE90aGVyIHVzZXIgc2V0dGFibGUgbGltaXRzIGFuZCBvcHRpb25zLgorCSAqICBUaGVzZSBsaW1pdHMgYXJlIHJlYWQgZnJvbSB0aGUgTlZSQU0gaWYgcHJlc2VudC4KKwkgKi8KKwl1X2NoYXIJdXNyZmxhZ3M7CisJdV9zaG9ydAl1c3J0YWdzOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKK307CisKKy8qCisgKiAgR2xvYmFsIExDQiBIRUFERVIuCisgKgorICogIER1ZSB0byBsYWNrIG9mIGluZGlyZWN0IGFkZHJlc3Npbmcgb24gZWFybGllciBOQ1IgY2hpcHMsCisgKiAgdGhpcyBzdWJzdHJ1Y3R1cmUgaXMgY29waWVkIGZyb20gdGhlIExDQiB0byBhIGdsb2JhbCAKKyAqICBhZGRyZXNzIGFmdGVyIHNlbGVjdGlvbi4KKyAqICBGb3IgU1lNQklPUyBjaGlwcyB0aGF0IHN1cHBvcnQgTE9BRC9TVE9SRSB0aGlzIGNvcHkgaXMgCisgKiAgbm90IG5lZWRlZCBhbmQgdGh1cyBub3QgcGVyZm9ybWVkLgorICovCitzdHJ1Y3Qgc3ltX2xjYmggeworCS8qCisJICogIFNDUklQVFMgYWRkcmVzcyBqdW1wZWQgYnkgU0NSSVBUUyBvbiByZXNlbGVjdGlvbi4KKwkgKiAgRm9yIG5vdCBwcm9iZWQgbG9naWNhbCB1bml0cywgdGhpcyBhZGRyZXNzIHBvaW50cyB0byAKKwkgKiAgU0NSSVBUUyB0aGF0IGRlYWwgd2l0aCBiYWQgTFUgaGFuZGxpbmcgKG11c3QgYmUgYXQgCisJICogIG9mZnNldCB6ZXJvIG9mIHRoZSBMQ0IgZm9yIHRoYXQgcmVhc29uKS4KKwkgKi8KKy8qMCovCXUzMglyZXNlbF9zYTsKKworCS8qCisJICogIFRhc2sgKGJ1cyBhZGRyZXNzIG9mIGEgQ0NCKSByZWFkIGZyb20gU0NSSVBUUyB0aGF0IHBvaW50cyAKKwkgKiAgdG8gdGhlIHVuaXF1ZSBJVEwgbmV4dXMgYWxsb3dlZCB0byBiZSBkaXNjb25uZWN0ZWQuCisJICovCisJdTMyCWl0bF90YXNrX3NhOworCisJLyoKKwkgKiAgVGFzayB0YWJsZSBidXMgYWRkcmVzcyAocmVhZCBmcm9tIFNDUklQVFMpLgorCSAqLworCXUzMglpdGxxX3RibF9zYTsKK307CisKKy8qCisgKiAgTG9naWNhbCBVbml0IENvbnRyb2wgQmxvY2sKKyAqLworc3RydWN0IHN5bV9sY2IgeworCS8qCisJICogIFRDQiBoZWFkZXIuCisJICogIEFzc3VtZWQgYXQgb2Zmc2V0IDAuCisJICovCisvKjAqLwlzdHJ1Y3Qgc3ltX2xjYmggaGVhZDsKKworCS8qCisJICogIFRhc2sgdGFibGUgcmVhZCBmcm9tIFNDUklQVFMgdGhhdCBjb250YWlucyBwb2ludGVycyB0byAKKwkgKiAgSVRMUSBuZXh1c2VzLiBUaGUgYnVzIGFkZHJlc3MgcmVhZCBmcm9tIFNDUklQVFMgaXMgCisJICogIGluc2lkZSB0aGUgaGVhZGVyLgorCSAqLworCXUzMgkqaXRscV90Ymw7CS8qIEtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MJKi8KKworCS8qCisJICogIEJ1c3kgQ0NCcyBtYW5hZ2VtZW50LgorCSAqLworCXVfc2hvcnQJYnVzeV9pdGxxOwkvKiBOdW1iZXIgb2YgYnVzeSB0YWdnZWQgQ0NCcwkqLworCXVfc2hvcnQJYnVzeV9pdGw7CS8qIE51bWJlciBvZiBidXN5IHVudGFnZ2VkIENDQnMJKi8KKworCS8qCisJICogIENpcmN1bGFyIHRhZyBhbGxvY2F0aW9uIGJ1ZmZlci4KKwkgKi8KKwl1X3Nob3J0CWlhX3RhZzsJCS8qIFRhZyBhbGxvY2F0aW9uIGluZGV4CQkqLworCXVfc2hvcnQJaWZfdGFnOwkJLyogVGFnIHJlbGVhc2UgaW5kZXgJCSovCisJdV9jaGFyCSpjYl90YWdzOwkvKiBDaXJjdWxhciB0YWdzIGJ1ZmZlcgkJKi8KKworCS8qCisJICogIE8vUyBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZS4KKwkgKi8KKyNpZmRlZglTWU1fSEFWRV9TTENCCisJc3RydWN0IHN5bV9zbGNiIHM7CisjZW5kaWYKKworI2lmZGVmIFNZTV9PUFRfSEFORExFX0RFVklDRV9RVUVVRUlORworCS8qCisJICogIE9wdGlvbm5hbHkgdGhlIGRyaXZlciBjYW4gaGFuZGxlIGRldmljZSBxdWV1ZWluZywgCisJICogIGFuZCByZXF1ZXVlcyBpbnRlcm5hbGx5IGNvbW1hbmQgdG8gcmVkby4KKwkgKi8KKwlTWU1fUVVFSEVBRCB3YWl0aW5nX2NjYnE7CisJU1lNX1FVRUhFQUQgc3RhcnRlZF9jY2JxOworCWludAludW1fc2dvb2Q7CisJdV9zaG9ydAlzdGFydGVkX3RhZ3M7CisJdV9zaG9ydAlzdGFydGVkX25vX3RhZzsKKwl1X3Nob3J0CXN0YXJ0ZWRfbWF4OworCXVfc2hvcnQJc3RhcnRlZF9saW1pdDsKKyNlbmRpZgorCisjaWZkZWYgU1lNX09QVF9MSU1JVF9DT01NQU5EX1JFT1JERVJJTkcKKwkvKgorCSAqICBPcHRpb25hbGx5IHRoZSBkcml2ZXIgY2FuIHRyeSB0byBwcmV2ZW50IFNDU0kgCisJICogIElPcyBmcm9tIGJlaW5nIHJlb3JkZXJlZCB0b28gbXVjaC4KKwkgKi8KKwl1X2NoYXIJCXRhZ3Nfc2k7CS8qIEN1cnJlbnQgaW5kZXggdG8gdGFncyBzdW0JKi8KKwl1X3Nob3J0CQl0YWdzX3N1bVsyXTsJLyogVGFncyBzdW0gY291bnRlcnMJCSovCisJdV9zaG9ydAkJdGFnc19zaW5jZTsJLyogIyBvZiB0YWdzIHNpbmNlIGxhc3Qgc3dpdGNoCSovCisjZW5kaWYKKworCS8qCisJICogIFNldCB3aGVuIHdlIHdhbnQgdG8gY2xlYXIgYWxsIHRhc2tzLgorCSAqLworCXVfY2hhciB0b19jbGVhcjsKKworCS8qCisJICogIENhcGFiaWxpdGllcy4KKwkgKi8KKwl1X2NoYXIJdXNlcl9mbGFnczsKKwl1X2NoYXIJY3Vycl9mbGFnczsKK307CisKKy8qCisgKiAgQWN0aW9uIGZyb20gU0NSSVBUUyBvbiBhIHRhc2suCisgKiAgSXMgcGFydCBvZiB0aGUgQ0NCLCBidXQgaXMgYWxzbyB1c2VkIHNlcGFyYXRlbHkgdG8gcGx1ZyAKKyAqICBlcnJvciBoYW5kbGluZyBhY3Rpb24gdG8gcGVyZm9ybSBmcm9tIFNDUklQVFMuCisgKi8KK3N0cnVjdCBzeW1fYWN0c2NyIHsKKwl1MzIJc3RhcnQ7CQkvKiBKdW1wZWQgYnkgU0NSSVBUUyBhZnRlciBzZWxlY3Rpb24JKi8KKwl1MzIJcmVzdGFydDsJLyogSnVtcGVkIGJ5IFNDUklQVFMgb24gcmVsZWN0aW9uCSovCit9OworCisvKgorICogIFBoYXNlIG1pc21hdGNoIGNvbnRleHQuCisgKgorICogIEl0IGlzIHBhcnQgb2YgdGhlIENDQiBhbmQgaXMgdXNlZCBhcyBwYXJhbWV0ZXJzIGZvciB0aGUgCisgKiAgREFUQSBwb2ludGVyLiBXZSBuZWVkIHR3byBjb250ZXh0cyB0byBoYW5kbGUgY29ycmVjdGx5IHRoZSAKKyAqICBTQVZFRCBEQVRBIFBPSU5URVIuCisgKi8KK3N0cnVjdCBzeW1fcG1jIHsKKwlzdHJ1Y3QJc3ltX3RibG1vdmUgc2c7CS8qIFVwZGF0ZWQgaW50ZXJydXB0ZWQgU0cgYmxvY2sJKi8KKwl1MzIJcmV0OwkJLyogU0NSSVBUIHJldHVybiBhZGRyZXNzCSovCit9OworCisvKgorICogIExVTiBjb250cm9sIGJsb2NrIGxvb2t1cC4KKyAqICBXZSB1c2UgYSBkaXJlY3QgcG9pbnRlciBmb3IgTFVOICMwLCBhbmQgYSB0YWJsZSBvZiAKKyAqICBwb2ludGVycyB3aGljaCBpcyBvbmx5IGFsbG9jYXRlZCBmb3IgZGV2aWNlcyB0aGF0IHN1cHBvcnQgCisgKiAgTFVOKHMpID4gMC4KKyAqLworI2lmIFNZTV9DT05GX01BWF9MVU4gPD0gMQorI2RlZmluZSBzeW1fbHAodHAsIGx1bikgKCFsdW4pID8gKHRwKS0+bHVuMHAgOiBOVUxMCisjZWxzZQorI2RlZmluZSBzeW1fbHAodHAsIGx1bikgXAorCSghbHVuKSA/ICh0cCktPmx1bjBwIDogKHRwKS0+bHVubXAgPyAodHApLT5sdW5tcFsobHVuKV0gOiBOVUxMCisjZW5kaWYKKworLyoKKyAqICBTdGF0dXMgYXJlIHVzZWQgYnkgdGhlIGhvc3QgYW5kIHRoZSBzY3JpcHQgcHJvY2Vzc29yLgorICoKKyAqICBUaGUgbGFzdCBmb3VyIGJ5dGVzIChzdGF0dXNbNF0pIGFyZSBjb3BpZWQgdG8gdGhlIAorICogIHNjcmF0Y2hiIHJlZ2lzdGVyIChkZWNsYXJlZCBhcyBzY3IwLi5zY3IzKSBqdXN0IGFmdGVyIHRoZSAKKyAqICBzZWxlY3QvcmVzZWxlY3QsIGFuZCBjb3BpZWQgYmFjayBqdXN0IGFmdGVyIGRpc2Nvbm5lY3RpbmcuCisgKiAgSW5zaWRlIHRoZSBzY3JpcHQgdGhlIFhYX1JFRyBhcmUgdXNlZC4KKyAqLworCisvKgorICogIExhc3QgZm91ciBieXRlcyAoc2NyaXB0KQorICovCisjZGVmaW5lICBIWF9SRUcJc2NyMAorI2RlZmluZSAgSFhfUFJUCW5jX3NjcjAKKyNkZWZpbmUgIEhTX1JFRwlzY3IxCisjZGVmaW5lICBIU19QUlQJbmNfc2NyMQorI2RlZmluZSAgU1NfUkVHCXNjcjIKKyNkZWZpbmUgIFNTX1BSVAluY19zY3IyCisjZGVmaW5lICBIRl9SRUcJc2NyMworI2RlZmluZSAgSEZfUFJUCW5jX3NjcjMKKworLyoKKyAqICBMYXN0IGZvdXIgYnl0ZXMgKGhvc3QpCisgKi8KKyNkZWZpbmUgIGhvc3RfeGZsYWdzICAgcGh5cy5oZWFkLnN0YXR1c1swXQorI2RlZmluZSAgaG9zdF9zdGF0dXMgICBwaHlzLmhlYWQuc3RhdHVzWzFdCisjZGVmaW5lICBzc3NzX3N0YXR1cyAgIHBoeXMuaGVhZC5zdGF0dXNbMl0KKyNkZWZpbmUgIGhvc3RfZmxhZ3MgICAgcGh5cy5oZWFkLnN0YXR1c1szXQorCisvKgorICogIEhvc3QgZmxhZ3MKKyAqLworI2RlZmluZSBIRl9JTl9QTTAJMXUKKyNkZWZpbmUgSEZfSU5fUE0xCSgxdTw8MSkKKyNkZWZpbmUgSEZfQUNUX1BNCSgxdTw8MikKKyNkZWZpbmUgSEZfRFBfU0FWRUQJKDF1PDwzKQorI2RlZmluZSBIRl9TRU5TRQkoMXU8PDQpCisjZGVmaW5lIEhGX0VYVF9FUlIJKDF1PDw1KQorI2RlZmluZSBIRl9EQVRBX0lOCSgxdTw8NikKKyNpZmRlZiBTWU1fQ09ORl9JQVJCX1NVUFBPUlQKKyNkZWZpbmUgSEZfSElOVF9JQVJCCSgxdTw8NykKKyNlbmRpZgorCisvKgorICogIE1vcmUgaG9zdCBmbGFncworICovCisjaWYJU1lNX0NPTkZfRE1BX0FERFJFU1NJTkdfTU9ERSA9PSAyCisjZGVmaW5lCUhYX0RNQVBfRElSVFkJKDF1PDw3KQorI2VuZGlmCisKKy8qCisgKiAgR2xvYmFsIENDQiBIRUFERVIuCisgKgorICogIER1ZSB0byBsYWNrIG9mIGluZGlyZWN0IGFkZHJlc3Npbmcgb24gZWFybGllciBOQ1IgY2hpcHMsCisgKiAgdGhpcyBzdWJzdHJ1Y3R1cmUgaXMgY29waWVkIGZyb20gdGhlIGNjYiB0byBhIGdsb2JhbCAKKyAqICBhZGRyZXNzIGFmdGVyIHNlbGVjdGlvbiAob3IgcmVzZWxlY3Rpb24pIGFuZCBjb3BpZWQgYmFjayAKKyAqICBiZWZvcmUgZGlzY29ubmVjdC4KKyAqICBGb3IgU1lNQklPUyBjaGlwcyB0aGF0IHN1cHBvcnQgTE9BRC9TVE9SRSB0aGlzIGNvcHkgaXMgCisgKiAgbm90IG5lZWRlZCBhbmQgdGh1cyBub3QgcGVyZm9ybWVkLgorICovCisKK3N0cnVjdCBzeW1fY2NiaCB7CisJLyoKKwkgKiAgU3RhcnQgYW5kIHJlc3RhcnQgU0NSSVBUUyBhZGRyZXNzZXMgKG11c3QgYmUgYXQgMCkuCisJICovCisvKjAqLwlzdHJ1Y3Qgc3ltX2FjdHNjciBnbzsKKworCS8qCisJICogIFNDUklQVFMganVtcCBhZGRyZXNzIHRoYXQgZGVhbCB3aXRoIGRhdGEgcG9pbnRlcnMuCisJICogICdzYXZlcCcgcG9pbnRzIHRvIHRoZSBwb3NpdGlvbiBpbiB0aGUgc2NyaXB0IHJlc3BvbnNpYmxlIAorCSAqICBmb3IgdGhlIGFjdHVhbCB0cmFuc2ZlciBvZiBkYXRhLgorCSAqICBJdCdzIHdyaXR0ZW4gb24gcmVjZXB0aW9uIG9mIGEgU0FWRV9EQVRBX1BPSU5URVIgbWVzc2FnZS4KKwkgKi8KKwl1MzIJc2F2ZXA7CQkvKiBKdW1wIGFkZHJlc3MgdG8gc2F2ZWQgZGF0YSBwb2ludGVyCSovCisJdTMyCWxhc3RwOwkJLyogU0NSSVBUUyBhZGRyZXNzIGF0IGVuZCBvZiBkYXRhCSovCisjaWZkZWYJU1lNX09QVF9IQU5ETEVfRElSX1VOS05PV04KKwl1MzIJd2xhc3RwOworI2VuZGlmCisKKwkvKgorCSAqICBTdGF0dXMgZmllbGRzLgorCSAqLworCXU4CXN0YXR1c1s0XTsKK307CisKKy8qCisgKiAgR0VUL1NFVCB0aGUgdmFsdWUgb2YgdGhlIGRhdGEgcG9pbnRlciB1c2VkIGJ5IFNDUklQVFMuCisgKgorICogIFdlIG11c3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgTE9BRC9TVE9SRS1iYXNlZCBTQ1JJUFRTIAorICogIHRoYXQgdXNlIGRpcmVjdGx5IHRoZSBoZWFkZXIgaW4gdGhlIENDQiwgYW5kIHRoZSBOQ1ItR0VORVJJQyAKKyAqICBTQ1JJUFRTIHRoYXQgdXNlIHRoZSBjb3B5IG9mIHRoZSBoZWFkZXIgaW4gdGhlIEhDQi4KKyAqLworI2lmCVNZTV9DT05GX0dFTkVSSUNfU1VQUE9SVAorI2RlZmluZSBzeW1fc2V0X3NjcmlwdF9kcChucCwgY3AsIGRwKQkJCQlcCisJZG8gewkJCQkJCQlcCisJCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9MRFNUUikJCQlcCisJCQljcC0+cGh5cy5oZWFkLmxhc3RwID0gY3B1X3RvX3NjcihkcCk7CVwKKwkJZWxzZQkJCQkJCVwKKwkJCW5wLT5jY2JfaGVhZC5sYXN0cCA9IGNwdV90b19zY3IoZHApOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgc3ltX2dldF9zY3JpcHRfZHAobnAsIGNwKSAJCQkJXAorCXNjcl90b19jcHUoKG5wLT5mZWF0dXJlcyAmIEZFX0xEU1RSKSA/CQkJXAorCQljcC0+cGh5cy5oZWFkLmxhc3RwIDogbnAtPmNjYl9oZWFkLmxhc3RwKQorI2Vsc2UKKyNkZWZpbmUgc3ltX3NldF9zY3JpcHRfZHAobnAsIGNwLCBkcCkJCQkJXAorCWRvIHsJCQkJCQkJXAorCQljcC0+cGh5cy5oZWFkLmxhc3RwID0gY3B1X3RvX3NjcihkcCk7CQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBzeW1fZ2V0X3NjcmlwdF9kcChucCwgY3ApIChjcC0+cGh5cy5oZWFkLmxhc3RwKQorI2VuZGlmCisKKy8qCisgKiAgRGF0YSBTdHJ1Y3R1cmUgQmxvY2sKKyAqCisgKiAgRHVyaW5nIGV4ZWN1dGlvbiBvZiBhIGNjYiBieSB0aGUgc2NyaXB0IHByb2Nlc3NvciwgdGhlIAorICogIERTQSAoZGF0YSBzdHJ1Y3R1cmUgYWRkcmVzcykgcmVnaXN0ZXIgcG9pbnRzIHRvIHRoaXMgCisgKiAgc3Vic3RydWN0dXJlIG9mIHRoZSBjY2IuCisgKi8KK3N0cnVjdCBzeW1fZHNiIHsKKwkvKgorCSAqICBDQ0IgaGVhZGVyLgorCSAqICBBbHNvIGFzc3VtZWQgYXQgb2Zmc2V0IDAgb2YgdGhlIHN5bV9jY2Igc3RydWN0dXJlLgorCSAqLworLyowKi8Jc3RydWN0IHN5bV9jY2JoIGhlYWQ7CisKKwkvKgorCSAqICBQaGFzZSBtaXNtYXRjaCBjb250ZXh0cy4KKwkgKiAgV2UgbmVlZCB0d28gdG8gaGFuZGxlIGNvcnJlY3RseSB0aGUgU0FWRUQgREFUQSBQT0lOVEVSLgorCSAqICBNVVNUIEJPVEggQkUgQVQgT0ZGU0VUIDwgMjU2LCBkdWUgdG8gdXNpbmcgOCBiaXQgYXJpdGhtZXRpYyAKKwkgKiAgZm9yIGFkZHJlc3MgY2FsY3VsYXRpb24gZnJvbSBTQ1JJUFRTLgorCSAqLworCXN0cnVjdCBzeW1fcG1jIHBtMDsKKwlzdHJ1Y3Qgc3ltX3BtYyBwbTE7CisKKwkvKgorCSAqICBUYWJsZSBkYXRhIGZvciBTY3JpcHQKKwkgKi8KKwlzdHJ1Y3Qgc3ltX3RibHNlbCAgc2VsZWN0OworCXN0cnVjdCBzeW1fdGJsbW92ZSBzbXNnOworCXN0cnVjdCBzeW1fdGJsbW92ZSBzbXNnX2V4dDsKKwlzdHJ1Y3Qgc3ltX3RibG1vdmUgY21kOworCXN0cnVjdCBzeW1fdGJsbW92ZSBzZW5zZTsKKwlzdHJ1Y3Qgc3ltX3RibG1vdmUgd3Jlc2lkOworCXN0cnVjdCBzeW1fdGJsbW92ZSBkYXRhIFtTWU1fQ09ORl9NQVhfU0ddOworfTsKKworLyoKKyAqICBPdXIgQ29tbWFuZCBDb250cm9sIEJsb2NrCisgKi8KK3N0cnVjdCBzeW1fY2NiIHsKKwkvKgorCSAqICBUaGlzIGlzIHRoZSBkYXRhIHN0cnVjdHVyZSB3aGljaCBpcyBwb2ludGVkIGJ5IHRoZSBEU0EgCisJICogIHJlZ2lzdGVyIHdoZW4gaXQgaXMgZXhlY3V0ZWQgYnkgdGhlIHNjcmlwdCBwcm9jZXNzb3IuCisJICogIEl0IG11c3QgYmUgdGhlIGZpcnN0IGVudHJ5LgorCSAqLworCXN0cnVjdCBzeW1fZHNiIHBoeXM7CisKKwkvKgorCSAqICBQb2ludGVyIHRvIENBTSBjY2IgYW5kIHJlbGF0ZWQgc3R1ZmYuCisJICovCisJc3RydWN0IHNjc2lfY21uZCAqY21kOwkvKiBDQU0gc2NzaWlvIGNjYgkJKi8KKwl1OAljZGJfYnVmWzE2XTsJLyogQ29weSBvZiBDREIJCQkqLworI2RlZmluZQlTWU1fU05TX0JCVUZfTEVOIDMyCisJdTgJc25zX2JidWZbU1lNX1NOU19CQlVGX0xFTl07IC8qIEJvdW5jZSBidWZmZXIgZm9yIHNlbnNlIGRhdGEgKi8KKwlpbnQJZGF0YV9sZW47CS8qIFRvdGFsIGRhdGEgbGVuZ3RoCQkqLworCWludAlzZWdtZW50czsJLyogTnVtYmVyIG9mIFNHIHNlZ21lbnRzCSovCisKKwl1OAlvcmRlcjsJCS8qIFRhZyB0eXBlIChpZiB0YWdnZWQgY29tbWFuZCkJKi8KKworCS8qCisJICogIE1pc2NlbGxhbmVvdXMgc3RhdHVzJy4KKwkgKi8KKwl1X2NoYXIJbmVnb19zdGF0dXM7CS8qIE5lZ290aWF0aW9uIHN0YXR1cwkJKi8KKwl1X2NoYXIJeGVycl9zdGF0dXM7CS8qIEV4dGVuZGVkIGVycm9yIGZsYWdzCQkqLworCXUzMglleHRyYV9ieXRlczsJLyogRXh0cmFuZW91cyBieXRlcyB0cmFuc2ZlcnJlZAkqLworCisJLyoKKwkgKiAgTWVzc2FnZSBhcmVhcy4KKwkgKiAgV2UgcHJlcGFyZSBhIG1lc3NhZ2UgdG8gYmUgc2VudCBhZnRlciBzZWxlY3Rpb24uCisJICogIFdlIG1heSB1c2UgYSBzZWNvbmQgb25lIGlmIHRoZSBjb21tYW5kIGlzIHJlc2NoZWR1bGVkIAorCSAqICBkdWUgdG8gQ0hFQ0tfQ09ORElUSU9OIG9yIENPTU1BTkQgVEVSTUlOQVRFRC4KKwkgKiAgQ29udGVudHMgYXJlIElERU5USUZZIGFuZCBTSU1QTEVfVEFHLgorCSAqICBXaGlsZSBuZWdvdGlhdGluZyBzeW5jIG9yIHdpZGUgdHJhbnNmZXIsCisJICogIGEgU0RUUiBvciBXRFRSIG1lc3NhZ2UgaXMgYXBwZW5kZWQuCisJICovCisJdV9jaGFyCXNjc2lfc21zZyBbMTJdOworCXVfY2hhcglzY3NpX3Ntc2cyWzEyXTsKKworCS8qCisJICogIEF1dG8gcmVxdWVzdCBzZW5zZSByZWxhdGVkIGZpZWxkcy4KKwkgKi8KKwl1X2NoYXIJc2Vuc2VjbWRbNl07CS8qIFJlcXVlc3QgU2Vuc2UgY29tbWFuZAkqLworCXVfY2hhcglzdl9zY3NpX3N0YXR1czsJLyogU2F2ZWQgU0NTSSBzdGF0dXMgCQkqLworCXVfY2hhcglzdl94ZXJyX3N0YXR1czsJLyogU2F2ZWQgZXh0ZW5kZWQgc3RhdHVzCSovCisJaW50CXN2X3Jlc2lkOwkvKiBTYXZlZCByZXNpZHVhbAkJKi8KKworCS8qCisJICogIE90aGVyIGZpZWxkcy4KKwkgKi8KKwl1MzIJY2NiX2JhOwkJLyogQlVTIGFkZHJlc3Mgb2YgdGhpcyBDQ0IJKi8KKwl1X3Nob3J0CXRhZzsJCS8qIFRhZyBmb3IgdGhpcyB0cmFuc2ZlcgkqLworCQkJCS8qICBOT19UQUcgbWVhbnMgbm8gdGFnCQkqLworCXVfY2hhcgl0YXJnZXQ7CisJdV9jaGFyCWx1bjsKKwlzdHJ1Y3Qgc3ltX2NjYiAqbGlua19jY2JoOwkvKiBIb3N0IGFkYXB0ZXIgQ0NCIGhhc2ggY2hhaW4JKi8KKwlTWU1fUVVFSEVBRCBsaW5rX2NjYnE7CS8qIExpbmsgdG8gZnJlZS9idXN5IENDQiBxdWV1ZQkqLworCXUzMglzdGFydHA7CQkvKiBJbml0aWFsIGRhdGEgcG9pbnRlcgkJKi8KKwl1MzIJZ29hbHA7CQkvKiBFeHBlY3RlZCBsYXN0IGRhdGEgcG9pbnRlcgkqLworI2lmZGVmCVNZTV9PUFRfSEFORExFX0RJUl9VTktOT1dOCisJdTMyCXdnb2FscDsKKyNlbmRpZgorCWludAlleHRfc2c7CQkvKiBFeHRyZW1lIGRhdGEgcG9pbnRlciwgdXNlZAkqLworCWludAlleHRfb2ZzOwkvKiAgdG8gY2FsY3VsYXRlIHRoZSByZXNpZHVhbC4JKi8KKyNpZmRlZiBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcKKwlTWU1fUVVFSEVBRCBsaW5rMl9jY2JxOwkvKiBMaW5rIGZvciBkZXZpY2UgcXVldWVpbmcJKi8KKwl1X2NoYXIJc3RhcnRlZDsJLyogQ0NCIHF1ZXVlZCB0byB0aGUgc3F1ZXVlCSovCisjZW5kaWYKKwl1X2NoYXIJdG9fYWJvcnQ7CS8qIFdhbnQgdGhpcyBJTyB0byBiZSBhYm9ydGVkCSovCisjaWZkZWYgU1lNX09QVF9MSU1JVF9DT01NQU5EX1JFT1JERVJJTkcKKwl1X2NoYXIJdGFnc19zaTsJLyogTHVuIHRhZ3Mgc3VtIGluZGV4ICgwLDEpCSovCisjZW5kaWYKK307CisKKyNkZWZpbmUgQ0NCX0JBKGNwLGxibCkJKGNwLT5jY2JfYmEgKyBvZmZzZXRvZihzdHJ1Y3Qgc3ltX2NjYiwgbGJsKSkKKworI2lmZGVmCVNZTV9PUFRfSEFORExFX0RJUl9VTktOT1dOCisjZGVmaW5lCXN5bV9nb2FscChjcCkgKChjcC0+aG9zdF9mbGFncyAmIEhGX0RBVEFfSU4pID8gY3AtPmdvYWxwIDogY3AtPndnb2FscCkKKyNlbHNlCisjZGVmaW5lCXN5bV9nb2FscChjcCkgKGNwLT5nb2FscCkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBkZXZpY2UgKm1fcG9vbF9pZGVudF90OworCisvKgorICogIEhvc3QgQ29udHJvbCBCbG9jaworICovCitzdHJ1Y3Qgc3ltX2hjYiB7CisJLyoKKwkgKiAgR2xvYmFsIGhlYWRlcnMuCisJICogIER1ZSB0byBwb29ybmVzcyBvZiBhZGRyZXNzaW5nIGNhcGFiaWxpdGllcywgZWFybGllciAKKwkgKiAgY2hpcHMgKDgxMCwgODE1LCA4MjUpIGNvcHkgcGFydCBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIAorCSAqICAoQ0NCLCBUQ0IgYW5kIExDQikgaW4gZml4ZWQgYXJlYXMuCisJICovCisjaWYJU1lNX0NPTkZfR0VORVJJQ19TVVBQT1JUCisJc3RydWN0IHN5bV9jY2JoCWNjYl9oZWFkOworCXN0cnVjdCBzeW1fdGNiaAl0Y2JfaGVhZDsKKwlzdHJ1Y3Qgc3ltX2xjYmgJbGNiX2hlYWQ7CisjZW5kaWYKKwkvKgorCSAqICBJZGxlIHRhc2sgYW5kIGludmFsaWQgdGFzayBhY3Rpb25zIGFuZCAKKwkgKiAgdGhlaXIgYnVzIGFkZHJlc3Nlcy4KKwkgKi8KKwlzdHJ1Y3Qgc3ltX2FjdHNjciBpZGxldGFzaywgbm90YXNrLCBiYWRfaXRsLCBiYWRfaXRscTsKKwl1MzIgaWRsZXRhc2tfYmEsIG5vdGFza19iYSwgYmFkX2l0bF9iYSwgYmFkX2l0bHFfYmE7CisKKwkvKgorCSAqICBEdW1teSBsdW4gdGFibGUgdG8gcHJvdGVjdCB1cyBhZ2FpbnN0IHRhcmdldCAKKwkgKiAgcmV0dXJuaW5nIGJhZCBsdW4gbnVtYmVyIG9uIHJlc2VsZWN0aW9uLgorCSAqLworCXUzMgkqYmFkbHVudGJsOwkvKiBUYWJsZSBwaHlzaWNhbCBhZGRyZXNzCSovCisJdTMyCWJhZGx1bl9zYTsJLyogU0NSSVBUIGhhbmRsZXIgQlVTIGFkZHJlc3MJKi8KKworCS8qCisJICogIEJ1cyBhZGRyZXNzIG9mIHRoaXMgaG9zdCBjb250cm9sIGJsb2NrLgorCSAqLworCXUzMgloY2JfYmE7CisKKwkvKgorCSAqICBCaXQgMzItNjMgb2YgdGhlIG9uLWNoaXAgUkFNIGJ1cyBhZGRyZXNzIGluIExFIGZvcm1hdC4KKwkgKiAgVGhlIFNUQVJUX1JBTTY0IHNjcmlwdCBsb2FkcyB0aGUgTU1SUyBhbmQgTU1XUyBmcm9tIHRoaXMgCisJICogIGZpZWxkLgorCSAqLworCXUzMglzY3JfcmFtX3NlZzsKKworCS8qCisJICogIEluaXRpYWwgdmFsdWUgb2Ygc29tZSBJTyByZWdpc3RlciBiaXRzLgorCSAqICBUaGVzZSB2YWx1ZXMgYXJlIGFzc3VtZWQgdG8gaGF2ZSBiZWVuIHNldCBieSBCSU9TLCBhbmQgbWF5IAorCSAqICBiZSB1c2VkIHRvIHByb2JlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gZGlmZmVyZW5jZXMuCisJICovCisJdV9jaGFyCXN2X3NjbnRsMCwgc3Zfc2NudGwzLCBzdl9kbW9kZSwgc3ZfZGNudGwsIHN2X2N0ZXN0Mywgc3ZfY3Rlc3Q0LAorCQlzdl9jdGVzdDUsIHN2X2dwY250bCwgc3Zfc3Rlc3QyLCBzdl9zdGVzdDQsIHN2X3NjbnRsNCwKKwkJc3Zfc3Rlc3QxOworCisJLyoKKwkgKiAgQWN0dWFsIGluaXRpYWwgdmFsdWUgb2YgSU8gcmVnaXN0ZXIgYml0cyB1c2VkIGJ5IHRoZSAKKwkgKiAgZHJpdmVyLiBUaGV5IGFyZSBsb2FkZWQgYXQgaW5pdGlhbGlzYXRpb24gYWNjb3JkaW5nIHRvICAKKwkgKiAgZmVhdHVyZXMgdGhhdCBhcmUgdG8gYmUgZW5hYmxlZC9kaXNhYmxlZC4KKwkgKi8KKwl1X2NoYXIJcnZfc2NudGwwLCBydl9zY250bDMsIHJ2X2Rtb2RlLCBydl9kY250bCwgcnZfY3Rlc3QzLCBydl9jdGVzdDQsIAorCQlydl9jdGVzdDUsIHJ2X3N0ZXN0MiwgcnZfY2NudGwwLCBydl9jY250bDEsIHJ2X3NjbnRsNDsKKworCS8qCisJICogIFRhcmdldCBkYXRhLgorCSAqLworCXN0cnVjdCBzeW1fdGNiCXRhcmdldFtTWU1fQ09ORl9NQVhfVEFSR0VUXTsKKworCS8qCisJICogIFRhcmdldCBjb250cm9sIGJsb2NrIGJ1cyBhZGRyZXNzIGFycmF5IHVzZWQgYnkgdGhlIFNDUklQVCAKKwkgKiAgb24gcmVzZWxlY3Rpb24uCisJICovCisJdTMyCQkqdGFyZ3RibDsKKwl1MzIJCXRhcmd0YmxfYmE7CisKKwkvKgorCSAqICBETUEgcG9vbCBoYW5kbGUgZm9yIHRoaXMgSEJBLgorCSAqLworCW1fcG9vbF9pZGVudF90CWJ1c19kbWF0OworCisJLyoKKwkgKiAgTy9TIHNwZWNpZmljIGRhdGEgc3RydWN0dXJlCisJICovCisJc3RydWN0IHN5bV9zaGNiIHM7CisKKwkvKgorCSAqICBQaHlzaWNhbCBidXMgYWRkcmVzc2VzIG9mIHRoZSBjaGlwLgorCSAqLworCXUzMgkJbW1pb19iYTsJLyogTU1JTyAzMiBiaXQgQlVTIGFkZHJlc3MJKi8KKwlpbnQJCW1taW9fd3M7CS8qIE1NSU8gV2luZG93IHNpemUJCSovCisKKwl1MzIJCXJhbV9iYTsJCS8qIFJBTSAzMiBiaXQgQlVTIGFkZHJlc3MJKi8KKwlpbnQJCXJhbV93czsJCS8qIFJBTSB3aW5kb3cgc2l6ZQkJKi8KKworCS8qCisJICogIFNDUklQVFMgdmlydHVhbCBhbmQgcGh5c2ljYWwgYnVzIGFkZHJlc3Nlcy4KKwkgKiAgJ3NjcmlwdCcgIGlzIGxvYWRlZCBpbiB0aGUgb24tY2hpcCBSQU0gaWYgcHJlc2VudC4KKwkgKiAgJ3NjcmlwdGgnIHN0YXlzIGluIG1haW4gbWVtb3J5IGZvciBhbGwgY2hpcHMgZXhjZXB0IHRoZSAKKwkgKiAgNTNDODk1QSwgNTNDODk2IGFuZCA1M0MxMDEwIHRoYXQgcHJvdmlkZSA4SyBvbi1jaGlwIFJBTS4KKwkgKi8KKwl1X2NoYXIJCSpzY3JpcHRhMDsJLyogQ29weSBvZiBzY3JpcHRzIEEsIEIsIFoJKi8KKwl1X2NoYXIJCSpzY3JpcHRiMDsKKwl1X2NoYXIJCSpzY3JpcHR6MDsKKwl1MzIJCXNjcmlwdGFfYmE7CS8qIEFjdHVhbCBzY3JpcHRzIEEsIEIsIFoJKi8KKwl1MzIJCXNjcmlwdGJfYmE7CS8qIDMyIGJpdCBidXMgYWRkcmVzc2VzLgkqLworCXUzMgkJc2NyaXB0el9iYTsKKwl1X3Nob3J0CQlzY3JpcHRhX3N6OwkvKiBBY3R1YWwgc2l6ZSBvZiBzY3JpcHQgQSwgQiwgWiovCisJdV9zaG9ydAkJc2NyaXB0Yl9zejsKKwl1X3Nob3J0CQlzY3JpcHR6X3N6OworCisJLyoKKwkgKiAgQnVzIGFkZHJlc3Nlcywgc2V0dXAgYW5kIHBhdGNoIG1ldGhvZHMgZm9yIAorCSAqICB0aGUgc2VsZWN0ZWQgZmlybXdhcmUuCisJICovCisJc3RydWN0IHN5bV9md2FfYmEgZndhX2JhczsJLyogVXNlZnVsIFNDUklQVEEgYnVzIGFkZHJlc3NlcwkqLworCXN0cnVjdCBzeW1fZndiX2JhIGZ3Yl9iYXM7CS8qIFVzZWZ1bCBTQ1JJUFRCIGJ1cyBhZGRyZXNzZXMJKi8KKwlzdHJ1Y3Qgc3ltX2Z3el9iYSBmd3pfYmFzOwkvKiBVc2VmdWwgU0NSSVBUWiBidXMgYWRkcmVzc2VzCSovCisJdm9pZAkJKCpmd19zZXR1cCkoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX2Z3ICpmdyk7CisJdm9pZAkJKCpmd19wYXRjaCkoc3RydWN0IHN5bV9oY2IgKm5wKTsKKwljaGFyCQkqZndfbmFtZTsKKworCS8qCisJICogIEdlbmVyYWwgY29udHJvbGxlciBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9uLgorCSAqLworCXVfc2hvcnQJZGV2aWNlX2lkOwkvKiBQQ0kgZGV2aWNlIGlkCQkqLworCXVfY2hhcglyZXZpc2lvbl9pZDsJLyogUENJIGRldmljZSByZXZpc2lvbiBpZAkqLworCXVfaW50CWZlYXR1cmVzOwkvKiBDaGlwIGZlYXR1cmVzIG1hcAkJKi8KKwl1X2NoYXIJbXlhZGRyOwkJLyogU0NTSSBpZCBvZiB0aGUgYWRhcHRlcgkqLworCXVfY2hhcgltYXhidXJzdDsJLyogbG9nIGJhc2UgMiBvZiBkd29yZHMgYnVyc3QJKi8KKwl1X2NoYXIJbWF4d2lkZTsJLyogTWF4aW11bSB0cmFuc2ZlciB3aWR0aAkqLworCXVfY2hhcgltaW5zeW5jOwkvKiBNaW4gc3luYyBwZXJpb2QgZmFjdG9yIChTVCkJKi8KKwl1X2NoYXIJbWF4c3luYzsJLyogTWF4IHN5bmMgcGVyaW9kIGZhY3RvciAoU1QpCSovCisJdV9jaGFyCW1heG9mZnM7CS8qIE1heCBzY3NpIG9mZnNldCAgICAgICAgKFNUKQkqLworCXVfY2hhcgltaW5zeW5jX2R0OwkvKiBNaW4gc3luYyBwZXJpb2QgZmFjdG9yIChEVCkJKi8KKwl1X2NoYXIJbWF4c3luY19kdDsJLyogTWF4IHN5bmMgcGVyaW9kIGZhY3RvciAoRFQpCSovCisJdV9jaGFyCW1heG9mZnNfZHQ7CS8qIE1heCBzY3NpIG9mZnNldCAgICAgICAgKERUKQkqLworCXVfY2hhcgltdWx0aXBsaWVyOwkvKiBDbG9jayBtdWx0aXBsaWVyICgxLDIsNCkJKi8KKwl1X2NoYXIJY2xvY2tfZGl2bjsJLyogTnVtYmVyIG9mIGNsb2NrIGRpdmlzb3JzCSovCisJdTMyCWNsb2NrX2toejsJLyogU0NTSSBjbG9jayBmcmVxdWVuY3kgaW4gS0h6CSovCisJdTMyCXBjaWNsa19raHo7CS8qIEVzdGltYXRlZCBQQ0kgY2xvY2sgIGluIEtIegkqLworCS8qCisJICogIFN0YXJ0IHF1ZXVlIG1hbmFnZW1lbnQuCisJICogIEl0IGlzIGZpbGxlZCB1cCBieSB0aGUgaG9zdCBwcm9jZXNzb3IgYW5kIGFjY2Vzc2VkIGJ5IHRoZSAKKwkgKiAgU0NSSVBUUyBwcm9jZXNzb3IgaW4gb3JkZXIgdG8gc3RhcnQgU0NTSSBjb21tYW5kcy4KKwkgKi8KKwl2b2xhdGlsZQkJLyogUHJldmVudCBjb2RlIG9wdGltaXphdGlvbnMJKi8KKwl1MzIJKnNxdWV1ZTsJLyogU3RhcnQgcXVldWUgdmlydHVhbCBhZGRyZXNzCSovCisJdTMyCXNxdWV1ZV9iYTsJLyogU3RhcnQgcXVldWUgQlVTIGFkZHJlc3MJKi8KKwl1X3Nob3J0CXNxdWV1ZXB1dDsJLyogTmV4dCBmcmVlIHNsb3Qgb2YgdGhlIHF1ZXVlCSovCisJdV9zaG9ydAlhY3RjY2JzOwkvKiBOdW1iZXIgb2YgYWxsb2NhdGVkIENDQnMJKi8KKworCS8qCisJICogIENvbW1hbmQgY29tcGxldGlvbiBxdWV1ZS4KKwkgKiAgSXQgaXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgc3RhcnQgcXVldWUgdG8gYXZvaWQgb3ZlcmZsb3cuCisJICovCisJdV9zaG9ydAlkcXVldWVnZXQ7CS8qIE5leHQgcG9zaXRpb24gdG8gc2NhbgkqLworCXZvbGF0aWxlCQkvKiBQcmV2ZW50IGNvZGUgb3B0aW1pemF0aW9ucwkqLworCXUzMgkqZHF1ZXVlOwkvKiBDb21wbGV0aW9uIChkb25lKSBxdWV1ZQkqLworCXUzMglkcXVldWVfYmE7CS8qIERvbmUgcXVldWUgQlVTIGFkZHJlc3MJKi8KKworCS8qCisJICogIE1pc2NlbGxhbmVvdXMgYnVmZmVycyBhY2Nlc3NlZCBieSB0aGUgc2NyaXB0cy1wcm9jZXNzb3IuCisJICogIFRoZXkgc2hhbGwgYmUgRFdPUkQgYWxpZ25lZCwgYmVjYXVzZSB0aGV5IG1heSBiZSByZWFkIG9yIAorCSAqICB3cml0dGVuIHdpdGggYSBzY3JpcHQgY29tbWFuZC4KKwkgKi8KKwl1X2NoYXIJCW1zZ291dFs4XTsJLyogQnVmZmVyIGZvciBNRVNTQUdFIE9VVCAJKi8KKwl1X2NoYXIJCW1zZ2luIFs4XTsJLyogQnVmZmVyIGZvciBNRVNTQUdFIElOCSovCisJdTMyCQlsYXN0bXNnOwkvKiBMYXN0IFNDU0kgbWVzc2FnZSBzZW50CSovCisJdTMyCQlzY3JhdGNoOwkvKiBTY3JhdGNoIGZvciBTQ1NJIHJlY2VpdmUJKi8KKwkJCQkJLyogQWxzbyB1c2VkIGZvciBjYWNoZSB0ZXN0IAkqLworCS8qCisJICogIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhdGlvbiBhbmQgc3RhdHVzIHBhcmFtZXRlcnMuCisJICovCisJdV9jaGFyCQl1c3JmbGFnczsJLyogTWlzY2VsbGFuZW91cyB1c2VyIGZsYWdzCSovCisJdV9jaGFyCQlzY3NpX21vZGU7CS8qIEN1cnJlbnQgU0NTSSBCVVMgbW9kZQkqLworCXVfY2hhcgkJdmVyYm9zZTsJLyogVmVyYm9zaXR5IGZvciB0aGlzIGNvbnRyb2xsZXIqLworCisJLyoKKwkgKiAgQ0NCIGxpc3RzIGFuZCBxdWV1ZS4KKwkgKi8KKwlzdHJ1Y3Qgc3ltX2NjYiAqKmNjYmg7CQkJLyogQ0NCcyBoYXNoZWQgYnkgRFNBIHZhbHVlCSovCisJCQkJCS8qIENDQl9IQVNIX1NJWkUgbGlzdHMgb2YgQ0NCcwkqLworCVNZTV9RVUVIRUFECWZyZWVfY2NicTsJLyogUXVldWUgb2YgYXZhaWxhYmxlIENDQnMJKi8KKwlTWU1fUVVFSEVBRAlidXN5X2NjYnE7CS8qIFF1ZXVlIG9mIGJ1c3kgQ0NCcwkJKi8KKworCS8qCisJICogIER1cmluZyBlcnJvciBoYW5kbGluZyBhbmQvb3IgcmVjb3ZlcnksCisJICogIGFjdGl2ZSBDQ0JzIHRoYXQgYXJlIHRvIGJlIGNvbXBsZXRlZCB3aXRoIAorCSAqICBlcnJvciBvciByZXF1ZXVlZCBhcmUgbW92ZWQgZnJvbSB0aGUgYnVzeV9jY2JxCisJICogIHRvIHRoZSBjb21wX2NjYnEgcHJpb3IgdG8gY29tcGxldGlvbi4KKwkgKi8KKwlTWU1fUVVFSEVBRAljb21wX2NjYnE7CisKKyNpZmRlZiBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcKKwlTWU1fUVVFSEVBRAlkdW1teV9jY2JxOworI2VuZGlmCisKKwkvKgorCSAqICBJTU1FRElBVEUgQVJCSVRSQVRJT04gKElBUkIpIGNvbnRyb2wuCisJICoKKwkgKiAgV2Uga2VlcCB0cmFjayBpbiAnbGFzdF9jcCcgb2YgdGhlIGxhc3QgQ0NCIHRoYXQgaGFzIGJlZW4gCisJICogIHF1ZXVlZCB0byB0aGUgU0NSSVBUUyBwcm9jZXNzb3IgYW5kIGNsZWFyICdsYXN0X2NwJyB3aGVuIAorCSAqICB0aGlzIENDQiBjb21wbGV0ZXMuIElmIGxhc3RfY3AgaXMgbm90IHplcm8gYXQgdGhlIG1vbWVudCAKKwkgKiAgd2UgcXVldWUgYSBuZXcgQ0NCLCB3ZSBzZXQgYSBmbGFnIGluICdsYXN0X2NwJyB0aGF0IGlzIAorCSAqICB1c2VkIGJ5IHRoZSBTQ1JJUFRTIGFzIGEgaGludCBmb3Igc2V0dGluZyBJQVJCLgorCSAqICBXZSBkb25ub3Qgc2V0IG1vcmUgdGhhbiAnaWFyYl9tYXgnIGNvbnNlY3V0aXZlIGhpbnRzIGZvciAKKwkgKiAgSUFSQiBpbiBvcmRlciB0byBsZWF2ZSBkZXZpY2VzIGEgY2hhbmNlIHRvIHJlc2VsZWN0LgorCSAqICBCeSB0aGUgd2F5LCBhbnkgbm9uIHplcm8gdmFsdWUgb2YgJ2lhcmJfbWF4JyBpcyB1bmZhaXIuIDopCisJICovCisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJdV9zaG9ydAkJaWFyYl9tYXg7CS8qIE1heC4gIyBjb25zZWN1dGl2ZSBJQVJCIGhpbnRzKi8KKwl1X3Nob3J0CQlpYXJiX2NvdW50OwkvKiBBY3R1YWwgIyBvZiB0aGVzZSBoaW50cwkqLworCXN0cnVjdCBzeW1fY2NiICoJbGFzdF9jcDsKKyNlbmRpZgorCisJLyoKKwkgKiAgQ29tbWFuZCBhYm9ydCBoYW5kbGluZy4KKwkgKiAgV2UgbmVlZCB0byBzeW5jaHJvbml6ZSB0aWdodGx5IHdpdGggdGhlIFNDUklQVFMgCisJICogIHByb2Nlc3NvciBpbiBvcmRlciB0byBoYW5kbGUgdGhpbmdzIGNvcnJlY3RseS4KKwkgKi8KKwl1X2NoYXIJCWFicnRfbXNnWzRdOwkvKiBNZXNzYWdlIHRvIHNlbmQgYnVmZmVyCSovCisJc3RydWN0IHN5bV90Ymxtb3ZlIGFicnRfdGJsOwkvKiBUYWJsZSBmb3IgdGhlIE1PViBvZiBpdCAJKi8KKwlzdHJ1Y3Qgc3ltX3RibHNlbCAgYWJydF9zZWw7CS8qIFN5bmMgcGFyYW1zIGZvciBzZWxlY3Rpb24JKi8KKwl1X2NoYXIJCWlzdGF0X3NlbTsJLyogVGVsbHMgdGhlIGNoaXAgdG8gc3RvcCAoU0VNKQkqLworCisJLyoKKwkgKiAgNjQgYml0IERNQSBoYW5kbGluZy4KKwkgKi8KKyNpZglTWU1fQ09ORl9ETUFfQUREUkVTU0lOR19NT0RFICE9IDAKKwl1X2NoYXIJdXNlX2RhYzsJCS8qIFVzZSBQQ0kgREFDIGN5Y2xlcwkJKi8KKyNpZglTWU1fQ09ORl9ETUFfQUREUkVTU0lOR19NT0RFID09IDIKKwl1X2NoYXIJZG1hcF9kaXJ0eTsJCS8qIERtYSBzZWdtZW50cyByZWdpc3RlcnMgZGlydHkJKi8KKwl1MzIJZG1hcF9iYWhbU1lNX0RNQVBfU0laRV07LyogU2VnbWVudCByZWdpc3RlcnMgbWFwCSovCisjZW5kaWYKKyNlbmRpZgorfTsKKworI2RlZmluZSBIQ0JfQkEobnAsIGxibCkJKG5wLT5oY2JfYmEgKyBvZmZzZXRvZihzdHJ1Y3Qgc3ltX2hjYiwgbGJsKSkKKworCisvKgorICogIEZJUk1XQVJFUyAoc3ltX2Z3LmMpCisgKi8KK3N0cnVjdCBzeW1fZncgKiBzeW1fZmluZF9maXJtd2FyZShzdHJ1Y3Qgc3ltX2NoaXAgKmNoaXApOwordm9pZCBzeW1fZndfYmluZF9zY3JpcHQoc3RydWN0IHN5bV9oY2IgKm5wLCB1MzIgKnN0YXJ0LCBpbnQgbGVuKTsKKworLyoKKyAqICBEcml2ZXIgbWV0aG9kcyBjYWxsZWQgZnJvbSBPL1Mgc3BlY2lmaWMgY29kZS4KKyAqLworY2hhciAqc3ltX2RyaXZlcl9uYW1lKHZvaWQpOwordm9pZCBzeW1fcHJpbnRfeGVycihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCB4X3N0YXR1cyk7CitpbnQgc3ltX3Jlc2V0X3Njc2lfYnVzKHN0cnVjdCBzeW1faGNiICpucCwgaW50IGVuYWJfaW50KTsKK3N0cnVjdCBzeW1fY2hpcCAqc3ltX2xvb2t1cF9jaGlwX3RhYmxlKHVfc2hvcnQgZGV2aWNlX2lkLCB1X2NoYXIgcmV2aXNpb24pOwordm9pZCBzeW1fcHV0X3N0YXJ0X3F1ZXVlKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV9jY2IgKmNwKTsKKyNpZmRlZiBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcKK3ZvaWQgc3ltX3N0YXJ0X25leHRfY2NicyhzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fbGNiICpscCwgaW50IG1heG4pOworI2VuZGlmCit2b2lkIHN5bV9zdGFydF91cChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCByZWFzb24pOwordm9pZCBzeW1faW50ZXJydXB0KHN0cnVjdCBzeW1faGNiICpucCk7CitpbnQgc3ltX2NsZWFyX3Rhc2tzKHN0cnVjdCBzeW1faGNiICpucCwgaW50IGNhbV9zdGF0dXMsIGludCB0YXJnZXQsIGludCBsdW4sIGludCB0YXNrKTsKK3N0cnVjdCBzeW1fY2NiICpzeW1fZ2V0X2NjYihzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdV9jaGFyIHRhZ19vcmRlcik7Cit2b2lkIHN5bV9mcmVlX2NjYihzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fY2NiICpjcCk7CitzdHJ1Y3Qgc3ltX2xjYiAqc3ltX2FsbG9jX2xjYihzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHVfY2hhciB0biwgdV9jaGFyIGxuKTsKK2ludCBzeW1fcXVldWVfc2NzaWlvKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY3Npbywgc3RydWN0IHN5bV9jY2IgKmNwKTsKK2ludCBzeW1fYWJvcnRfc2NzaWlvKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY2NiLCBpbnQgdGltZWRfb3V0KTsKK2ludCBzeW1fcmVzZXRfc2NzaV90YXJnZXQoc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgdGFyZ2V0KTsKK3ZvaWQgc3ltX2hjYl9mcmVlKHN0cnVjdCBzeW1faGNiICpucCk7CitpbnQgc3ltX2hjYl9hdHRhY2goc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHN0cnVjdCBzeW1fZncgKmZ3LCBzdHJ1Y3Qgc3ltX252cmFtICpudnJhbSk7CisKKy8qCisgKiAgQnVpbGQgYSBzY2F0dGVyL2dhdGhlciBlbnRyeS4KKyAqCisgKiAgRm9yIDY0IGJpdCBzeXN0ZW1zLCB3ZSB1c2UgdGhlIDggdXBwZXIgYml0cyBvZiB0aGUgc2l6ZSBmaWVsZCAKKyAqICB0byBwcm92aWRlIGJ1cyBhZGRyZXNzIGJpdHMgMzItMzkgdG8gdGhlIFNDUklQVFMgcHJvY2Vzc29yLgorICogIFRoaXMgYWxsb3dzIHRoZSA4OTVBLCA4OTYsIDEwMTAgdG8gYWRkcmVzcyB1cCB0byAxIFRCIG9mIG1lbW9yeS4KKyAqLworCisjaWYgICBTWU1fQ09ORl9ETUFfQUREUkVTU0lOR19NT0RFID09IDAKKyNkZWZpbmUgc3ltX2J1aWxkX3NnZShucCwgZGF0YSwgYmFkZCwgbGVuKQlcCitkbyB7CQkJCQkJXAorCShkYXRhKS0+YWRkciA9IGNwdV90b19zY3IoYmFkZCk7CVwKKwkoZGF0YSktPnNpemUgPSBjcHVfdG9fc2NyKGxlbik7CQlcCit9IHdoaWxlICgwKQorI2VsaWYgU1lNX0NPTkZfRE1BX0FERFJFU1NJTkdfTU9ERSA9PSAxCisjZGVmaW5lIHN5bV9idWlsZF9zZ2UobnAsIGRhdGEsIGJhZGQsIGxlbikJCQkJXAorZG8gewkJCQkJCQkJCVwKKwkoZGF0YSktPmFkZHIgPSBjcHVfdG9fc2NyKGJhZGQpOwkJCQlcCisJKGRhdGEpLT5zaXplID0gY3B1X3RvX3NjcigoKChiYWRkKSA+PiA4KSAmIDB4ZmYwMDAwMDApICsgbGVuKTsJXAorfSB3aGlsZSAoMCkKKyNlbGlmIFNZTV9DT05GX0RNQV9BRERSRVNTSU5HX01PREUgPT0gMgoraW50IHN5bV9sb29rdXBfZG1hcChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHUzMiBoLCBpbnQgcyk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCAKK3N5bV9idWlsZF9zZ2Uoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX3RibG1vdmUgKmRhdGEsIHU2NCBiYWRkLCBpbnQgbGVuKQoreworCXUzMiBoID0gKGJhZGQ+PjMyKTsKKwlpbnQgcyA9IChoJlNZTV9ETUFQX01BU0spOworCisJaWYgKGggIT0gbnAtPmRtYXBfYmFoW3NdKQorCQlnb3RvIGJhZDsKK2dvb2Q6CisJKGRhdGEpLT5hZGRyID0gY3B1X3RvX3NjcihiYWRkKTsKKwkoZGF0YSktPnNpemUgPSBjcHVfdG9fc2NyKChzPDwyNCkgKyBsZW4pOworCXJldHVybjsKK2JhZDoKKwlzID0gc3ltX2xvb2t1cF9kbWFwKG5wLCBoLCBzKTsKKwlnb3RvIGdvb2Q7Cit9CisjZWxzZQorI2Vycm9yICJVbnN1cHBvcnRlZCBETUEgYWRkcmVzc2luZyBtb2RlIgorI2VuZGlmCisKKy8qCisgKiAgU2V0IHVwIGRhdGEgcG9pbnRlcnMgdXNlZCBieSBTQ1JJUFRTLgorICogIENhbGxlZCBmcm9tIE8vUyBzcGVjaWZpYyBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3ltX3NldHVwX2RhdGFfcG9pbnRlcnMoc3RydWN0IHN5bV9oY2IgKm5wLAorCQlzdHJ1Y3Qgc3ltX2NjYiAqY3AsIGludCBkaXIpCit7CisJdTMyIGxhc3RwLCBnb2FscDsKKworCS8qCisJICogIE5vIHNlZ21lbnRzIG1lYW5zIG5vIGRhdGEuCisJICovCisJaWYgKCFjcC0+c2VnbWVudHMpCisJCWRpciA9IENBTV9ESVJfTk9ORTsKKworCS8qCisJICogIFNldCB0aGUgZGF0YSBwb2ludGVyLgorCSAqLworCXN3aXRjaChkaXIpIHsKKyNpZmRlZglTWU1fT1BUX0hBTkRMRV9ESVJfVU5LTk9XTgorCWNhc2UgQ0FNX0RJUl9VTktOT1dOOgorI2VuZGlmCisJY2FzZSBDQU1fRElSX09VVDoKKwkJZ29hbHAgPSBTQ1JJUFRBX0JBKG5wLCBkYXRhX291dDIpICsgODsKKwkJbGFzdHAgPSBnb2FscCAtIDggLSAoY3AtPnNlZ21lbnRzICogKDIqNCkpOworI2lmZGVmCVNZTV9PUFRfSEFORExFX0RJUl9VTktOT1dOCisJCWNwLT53Z29hbHAgPSBjcHVfdG9fc2NyKGdvYWxwKTsKKwkJaWYgKGRpciAhPSBDQU1fRElSX1VOS05PV04pCisJCQlicmVhazsKKwkJY3AtPnBoeXMuaGVhZC53bGFzdHAgPSBjcHVfdG9fc2NyKGxhc3RwKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisjZWxzZQorCQlicmVhazsKKyNlbmRpZgorCWNhc2UgQ0FNX0RJUl9JTjoKKwkJY3AtPmhvc3RfZmxhZ3MgfD0gSEZfREFUQV9JTjsKKwkJZ29hbHAgPSBTQ1JJUFRBX0JBKG5wLCBkYXRhX2luMikgKyA4OworCQlsYXN0cCA9IGdvYWxwIC0gOCAtIChjcC0+c2VnbWVudHMgKiAoMio0KSk7CisJCWJyZWFrOworCWNhc2UgQ0FNX0RJUl9OT05FOgorCWRlZmF1bHQ6CisjaWZkZWYJU1lNX09QVF9IQU5ETEVfRElSX1VOS05PV04KKwkJY3AtPmhvc3RfZmxhZ3MgfD0gSEZfREFUQV9JTjsKKyNlbmRpZgorCQlsYXN0cCA9IGdvYWxwID0gU0NSSVBUQl9CQShucCwgbm9fZGF0YSk7CisJCWJyZWFrOworCX0KKworCS8qCisJICogIFNldCBhbGwgcG9pbnRlcnMgdmFsdWVzIG5lZWRlZCBieSBTQ1JJUFRTLgorCSAqLworCWNwLT5waHlzLmhlYWQubGFzdHAgPSBjcHVfdG9fc2NyKGxhc3RwKTsKKwljcC0+cGh5cy5oZWFkLnNhdmVwID0gY3B1X3RvX3NjcihsYXN0cCk7CisJY3AtPnN0YXJ0cAkgICAgPSBjcC0+cGh5cy5oZWFkLnNhdmVwOworCWNwLT5nb2FscAkgICAgPSBjcHVfdG9fc2NyKGdvYWxwKTsKKworI2lmZGVmCVNZTV9PUFRfSEFORExFX0RJUl9VTktOT1dOCisJLyoKKwkgKiAgSWYgZGlyZWN0aW9uIGlzIHVua25vd24sIHN0YXJ0IGF0IGRhdGFfaW8uCisJICovCisJaWYgKGRpciA9PSBDQU1fRElSX1VOS05PV04pCisJCWNwLT5waHlzLmhlYWQuc2F2ZXAgPSBjcHVfdG9fc2NyKFNDUklQVEJfQkEobnAsIGRhdGFfaW8pKTsKKyNlbmRpZgorfQorCisvKgorICogIE1FTU9SWSBBTExPQ0FUT1IuCisgKi8KKworI2RlZmluZSBTWU1fTUVNX1BBR0VfT1JERVIgMAkvKiAxIFBBR0UgIG1heGltdW0gKi8KKyNkZWZpbmUgU1lNX01FTV9DTFVTVEVSX1NISUZUCShQQUdFX1NISUZUK1NZTV9NRU1fUEFHRV9PUkRFUikKKyNkZWZpbmUgU1lNX01FTV9GUkVFX1VOVVNFRAkvKiBGcmVlIHVudXNlZCBwYWdlcyBpbW1lZGlhdGVseSAqLworCisjZGVmaW5lIFNZTV9NRU1fV0FSTgkxCS8qIFdhcm4gb24gZmFpbGVkIG9wZXJhdGlvbnMgKi8KKworI2RlZmluZSBzeW1fZ2V0X21lbV9jbHVzdGVyKCkJXAorCSh2b2lkICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0FUT01JQywgU1lNX01FTV9QQUdFX09SREVSKQorI2RlZmluZSBzeW1fZnJlZV9tZW1fY2x1c3RlcihwKQlcCisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylwLCBTWU1fTUVNX1BBR0VfT1JERVIpCisKKy8qCisgKiAgTGluayBiZXR3ZWVuIGZyZWUgbWVtb3J5IGNodW5rcyBvZiBhIGdpdmVuIHNpemUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHN5bV9tX2xpbmsgeworCXN0cnVjdCBzeW1fbV9saW5rICpuZXh0OworfSAqbV9saW5rX3A7CisKKy8qCisgKiAgVmlydHVhbCB0byBidXMgcGh5c2ljYWwgdHJhbnNsYXRpb24gZm9yIGEgZ2l2ZW4gY2x1c3Rlci4KKyAqICBTdWNoIGEgc3RydWN0dXJlIGlzIG9ubHkgdXNlZnVsIHdpdGggRE1BIGFic3RyYWN0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBzeW1fbV92dG9iIHsJLyogVmlydHVhbCB0byBCdXMgYWRkcmVzcyB0cmFuc2xhdGlvbiAqLworCXN0cnVjdCBzeW1fbV92dG9iICpuZXh0OworCXZvaWQgKnZhZGRyOwkJLyogVmlydHVhbCBhZGRyZXNzICovCisJZG1hX2FkZHJfdCBiYWRkcjsJLyogQnVzIHBoeXNpY2FsIGFkZHJlc3MgKi8KK30gKm1fdnRvYl9wOworCisvKiBIYXNoIHRoaXMgc3R1ZmYgYSBiaXQgdG8gc3BlZWQgdXAgdHJhbnNsYXRpb25zICovCisjZGVmaW5lIFZUT0JfSEFTSF9TSElGVAkJNQorI2RlZmluZSBWVE9CX0hBU0hfU0laRQkJKDFVTCA8PCBWVE9CX0hBU0hfU0hJRlQpCisjZGVmaW5lIFZUT0JfSEFTSF9NQVNLCQkoVlRPQl9IQVNIX1NJWkUtMSkKKyNkZWZpbmUgVlRPQl9IQVNIX0NPREUobSkJXAorCSgoKCh1bnNpZ25lZCBsb25nKShtKSkgPj4gU1lNX01FTV9DTFVTVEVSX1NISUZUKSAmIFZUT0JfSEFTSF9NQVNLKQorCisvKgorICogIE1lbW9yeSBwb29sIG9mIGEgZ2l2ZW4ga2luZC4KKyAqICBJZGVhbGx5LCB3ZSB3YW50IHRvIHVzZToKKyAqICAxKSAxIHBvb2wgZm9yIG1lbW9yeSB3ZSBkb25ub3QgbmVlZCB0byBpbnZvbHZlIGluIERNQS4KKyAqICAyKSBUaGUgc2FtZSBwb29sIGZvciBjb250cm9sbGVycyB0aGF0IHJlcXVpcmUgc2FtZSBETUEgCisgKiAgICAgY29uc3RyYWludHMgYW5kIGZlYXR1cmVzLgorICogICAgIFRoZSBPUyBzcGVjaWZpYyBtX3Bvb2xfaWRfdCB0aGluZyBhbmQgdGhlIHN5bV9tX3Bvb2xfbWF0Y2goKSAKKyAqICAgICBtZXRob2QgYXJlIGV4cGVjdGVkIHRvIHRlbGwgdGhlIGRyaXZlciBhYm91dC4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc3ltX21fcG9vbCB7CisJbV9wb29sX2lkZW50X3QJZGV2X2RtYXQ7CS8qIElkZW50aWZpZXMgdGhlIHBvb2wgKHNlZSBhYm92ZSkgKi8KKwl2b2lkICogKCpnZXRfbWVtX2NsdXN0ZXIpKHN0cnVjdCBzeW1fbV9wb29sICopOworI2lmZGVmCVNZTV9NRU1fRlJFRV9VTlVTRUQKKwl2b2lkICgqZnJlZV9tZW1fY2x1c3Rlcikoc3RydWN0IHN5bV9tX3Bvb2wgKiwgdm9pZCAqKTsKKyNlbmRpZgorI2RlZmluZSBNX0dFVF9NRU1fQ0xVU1RFUigpCQltcC0+Z2V0X21lbV9jbHVzdGVyKG1wKQorI2RlZmluZSBNX0ZSRUVfTUVNX0NMVVNURVIocCkJCW1wLT5mcmVlX21lbV9jbHVzdGVyKG1wLCBwKQorCWludCBudW1wOworCW1fdnRvYl9wIHZ0b2JbVlRPQl9IQVNIX1NJWkVdOworCXN0cnVjdCBzeW1fbV9wb29sICpuZXh0OworCXN0cnVjdCBzeW1fbV9saW5rIGhbU1lNX01FTV9DTFVTVEVSX1NISUZUIC0gU1lNX01FTV9TSElGVCArIDFdOworfSAqbV9wb29sX3A7CisKKy8qCisgKiAgQWxsb2MsIGZyZWUgYW5kIHRyYW5zbGF0ZSBhZGRyZXNzZXMgdG8gYnVzIHBoeXNpY2FsIAorICogIGZvciBETUFhYmxlIG1lbW9yeS4KKyAqLwordm9pZCAqX19zeW1fY2FsbG9jX2RtYShtX3Bvb2xfaWRlbnRfdCBkZXZfZG1hdCwgaW50IHNpemUsIGNoYXIgKm5hbWUpOwordm9pZCBfX3N5bV9tZnJlZV9kbWEobV9wb29sX2lkZW50X3QgZGV2X2RtYXQsIHZvaWQgKm0sIGludCBzaXplLCBjaGFyICpuYW1lKTsKK2RtYV9hZGRyX3QgX192dG9idXMobV9wb29sX2lkZW50X3QgZGV2X2RtYXQsIHZvaWQgKm0pOworCisvKgorICogVmVyYnMgdXNlZCBieSB0aGUgZHJpdmVyIGNvZGUgZm9yIERNQWFibGUgbWVtb3J5IGhhbmRsaW5nLgorICogVGhlIF91dnB0dl8gbWFjcm8gYXZvaWRzIGEgbmFzdHkgd2FybmluZyBhYm91dCBwb2ludGVyIHRvIHZvbGF0aWxlIAorICogYmVpbmcgZGlzY2FyZGVkLgorICovCisjZGVmaW5lIF91dnB0dl8ocCkgKCh2b2lkICopKCh1X2xvbmcpKHApKSkKKworI2RlZmluZSBfc3ltX2NhbGxvY19kbWEobnAsIGwsIG4pCV9fc3ltX2NhbGxvY19kbWEobnAtPmJ1c19kbWF0LCBsLCBuKQorI2RlZmluZSBfc3ltX21mcmVlX2RtYShucCwgcCwgbCwgbikJXAorCQkJX19zeW1fbWZyZWVfZG1hKG5wLT5idXNfZG1hdCwgX3V2cHR2XyhwKSwgbCwgbikKKyNkZWZpbmUgc3ltX2NhbGxvY19kbWEobCwgbikJCV9zeW1fY2FsbG9jX2RtYShucCwgbCwgbikKKyNkZWZpbmUgc3ltX21mcmVlX2RtYShwLCBsLCBuKQkJX3N5bV9tZnJlZV9kbWEobnAsIHAsIGwsIG4pCisjZGVmaW5lIHZ0b2J1cyhwKQkJCV9fdnRvYnVzKG5wLT5idXNfZG1hdCwgX3V2cHR2XyhwKSkKKworLyoKKyAqICBXZSBoYXZlIHRvIHByb3ZpZGUgdGhlIGRyaXZlciBtZW1vcnkgYWxsb2NhdG9yIHdpdGggbWV0aG9kcyBmb3IgCisgKiAgaXQgdG8gbWFpbnRhaW4gdmlydHVhbCB0byBidXMgcGh5c2ljYWwgYWRkcmVzcyB0cmFuc2xhdGlvbnMuCisgKi8KKworI2RlZmluZSBzeW1fbV9wb29sX21hdGNoKG1wX2lkMSwgbXBfaWQyKQkobXBfaWQxID09IG1wX2lkMikKKworc3RhdGljIF9faW5saW5lIHZvaWQgKnN5bV9tX2dldF9kbWFfbWVtX2NsdXN0ZXIobV9wb29sX3AgbXAsIG1fdnRvYl9wIHZicCkKK3sKKwl2b2lkICp2YWRkciA9IE5VTEw7CisJZG1hX2FkZHJfdCBiYWRkciA9IDA7CisKKwl2YWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChtcC0+ZGV2X2RtYXQsIFNZTV9NRU1fQ0xVU1RFUl9TSVpFLCAmYmFkZHIsCisJCQlHRlBfQVRPTUlDKTsKKwlpZiAodmFkZHIpIHsKKwkJdmJwLT52YWRkciA9IHZhZGRyOworCQl2YnAtPmJhZGRyID0gYmFkZHI7CisJfQorCXJldHVybiB2YWRkcjsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQgc3ltX21fZnJlZV9kbWFfbWVtX2NsdXN0ZXIobV9wb29sX3AgbXAsIG1fdnRvYl9wIHZicCkKK3sKKwlkbWFfZnJlZV9jb2hlcmVudChtcC0+ZGV2X2RtYXQsIFNZTV9NRU1fQ0xVU1RFUl9TSVpFLCB2YnAtPnZhZGRyLAorCQkJdmJwLT5iYWRkcik7Cit9CisKKyNlbmRpZiAvKiBTWU1fSElQRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX21hbGxvYy5jIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9tYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzRkNDAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9tYWxsb2MuYwpAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIERldmljZSBkcml2ZXIgZm9yIHRoZSBTWU1CSU9TL0xTSUxPR0lDIDUzQzhYWCBhbmQgNTNDMTAxMCBmYW1pbHkgCisgKiBvZiBQQ0ktU0NTSSBJTyBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxICBHZXJhcmQgUm91ZGllciA8Z3JvdWRpZXJAZnJlZS5mcj4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIExpbnV4IHN5bTUzYzh4eCBkcml2ZXIuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCAgR2VyYXJkIFJvdWRpZXIKKyAqCisgKiBUaGUgc3ltNTNjOHh4IGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIG5jcjUzYzh4eCBkcml2ZXIgdGhhdCBoYWQgYmVlbiAKKyAqIGEgcG9ydCBvZiB0aGUgRnJlZUJTRCBuY3IgZHJpdmVyIHRvIExpbnV4LTEuMi4xMy4KKyAqCisgKiBUaGUgb3JpZ2luYWwgbmNyIGRyaXZlciBoYXMgYmVlbiB3cml0dGVuIGZvciAzODZic2QgYW5kIEZyZWVCU0QgYnkKKyAqICAgICAgICAgV29sZmdhbmcgU3RhbmdsbWVpZXIgICAgICAgIDx3b2xmQGNvbG9nbmUuZGU+CisgKiAgICAgICAgIFN0ZWZhbiBFc3NlciAgICAgICAgICAgICAgICA8c2VAbWkuVW5pLUtvZWxuLmRlPgorICogQ29weXJpZ2h0IChDKSAxOTk0ICBXb2xmZ2FuZyBTdGFuZ2xtZWllcgorICoKKyAqIE90aGVyIG1ham9yIGNvbnRyaWJ1dGlvbnM6CisgKgorICogTlZSQU0gZGV0ZWN0aW9uIGFuZCByZWFkaW5nLgorICogQ29weXJpZ2h0IChDKSAxOTk3IFJpY2hhcmQgV2FsdGhhbSA8ZG9ybW91c2VAZmFyc3JvYnQuZGVtb24uY28udWs+CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZkZWYgX19GcmVlQlNEX18KKyNpbmNsdWRlIDxkZXYvc3ltL3N5bV9nbHVlLmg+CisjZWxzZQorI2luY2x1ZGUgInN5bV9nbHVlLmgiCisjZW5kaWYKKworLyoKKyAqICBTaW1wbGUgcG93ZXIgb2YgdHdvIGJ1ZGR5LWxpa2UgZ2VuZXJpYyBhbGxvY2F0b3IuCisgKiAgUHJvdmlkZXMgbmF0dXJhbGx5IGFsaWduZWQgbWVtb3J5IGNodW5rcy4KKyAqCisgKiAgVGhpcyBzaW1wbGUgY29kZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgZmFzdCwgYnV0IHRvIAorICogIHByb3ZpZGUgcG93ZXIgb2YgMiBhbGlnbmVkIG1lbW9yeSBhbGxvY2F0aW9ucy4KKyAqICBTaW5jZSB0aGUgU0NSSVBUUyBwcm9jZXNzb3Igb25seSBzdXBwbGllcyA4IGJpdCBhcml0aG1ldGljLCAKKyAqICB0aGlzIGFsbG9jYXRvciBhbGxvd3Mgc2ltcGxlIGFuZCBmYXN0IGFkZHJlc3MgY2FsY3VsYXRpb25zICAKKyAqICBmcm9tIHRoZSBTQ1JJUFRTIGNvZGUuIEluIGFkZGl0aW9uLCBjYWNoZSBsaW5lIGFsaWdubWVudCAKKyAqICBpcyBndWFyYW50ZWVkIGZvciBwb3dlciBvZiAyIGNhY2hlIGxpbmUgc2l6ZS4KKyAqCisgKiAgVGhpcyBhbGxvY2F0b3IgaGFzIGJlZW4gZGV2ZWxvcHBlZCBmb3IgdGhlIExpbnV4IHN5bTUzYzh4eCAgCisgKiAgZHJpdmVyLCBzaW5jZSB0aGlzIE8vUyBkb2VzIG5vdCBwcm92aWRlIG5hdHVyYWxseSBhbGlnbmVkIAorICogIGFsbG9jYXRpb25zLgorICogIEl0IGhhcyB0aGUgYWR2YW50YWdlIG9mIGFsbG93aW5nIHRoZSBkcml2ZXIgdG8gdXNlIHByaXZhdGUgCisgKiAgcGFnZXMgb2YgbWVtb3J5IHRoYXQgd2lsbCBiZSB1c2VmdWwgaWYgd2UgZXZlciBuZWVkIHRvIGRlYWwgCisgKiAgd2l0aCBJTyBNTVVzIGZvciBQQ0kuCisgKi8KK3N0YXRpYyB2b2lkICpfX19zeW1fbWFsbG9jKG1fcG9vbF9wIG1wLCBpbnQgc2l6ZSkKK3sKKwlpbnQgaSA9IDA7CisJaW50IHMgPSAoMSA8PCBTWU1fTUVNX1NISUZUKTsKKwlpbnQgajsKKwl2b2lkICphOworCW1fbGlua19wIGggPSBtcC0+aDsKKworCWlmIChzaXplID4gU1lNX01FTV9DTFVTVEVSX1NJWkUpCisJCXJldHVybiBOVUxMOworCisJd2hpbGUgKHNpemUgPiBzKSB7CisJCXMgPDw9IDE7CisJCSsraTsKKwl9CisKKwlqID0gaTsKKwl3aGlsZSAoIWhbal0ubmV4dCkgeworCQlpZiAocyA9PSBTWU1fTUVNX0NMVVNURVJfU0laRSkgeworCQkJaFtqXS5uZXh0ID0gKG1fbGlua19wKSBNX0dFVF9NRU1fQ0xVU1RFUigpOworCQkJaWYgKGhbal0ubmV4dCkKKwkJCQloW2pdLm5leHQtPm5leHQgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJKytqOworCQlzIDw8PSAxOworCX0KKwlhID0gaFtqXS5uZXh0OworCWlmIChhKSB7CisJCWhbal0ubmV4dCA9IGhbal0ubmV4dC0+bmV4dDsKKwkJd2hpbGUgKGogPiBpKSB7CisJCQlqIC09IDE7CisJCQlzID4+PSAxOworCQkJaFtqXS5uZXh0ID0gKG1fbGlua19wKSAoYStzKTsKKwkJCWhbal0ubmV4dC0+bmV4dCA9IE5VTEw7CisJCX0KKwl9CisjaWZkZWYgREVCVUcKKwlwcmludGYoIl9fX3N5bV9tYWxsb2MoJWQpID0gJXBcbiIsIHNpemUsICh2b2lkICopIGEpOworI2VuZGlmCisJcmV0dXJuIGE7Cit9CisKKy8qCisgKiAgQ291bnRlci1wYXJ0IG9mIHRoZSBnZW5lcmljIGFsbG9jYXRvci4KKyAqLworc3RhdGljIHZvaWQgX19fc3ltX21mcmVlKG1fcG9vbF9wIG1wLCB2b2lkICpwdHIsIGludCBzaXplKQoreworCWludCBpID0gMDsKKwlpbnQgcyA9ICgxIDw8IFNZTV9NRU1fU0hJRlQpOworCW1fbGlua19wIHE7CisJdW5zaWduZWQgbG9uZyBhLCBiOworCW1fbGlua19wIGggPSBtcC0+aDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRmKCJfX19zeW1fbWZyZWUoJXAsICVkKVxuIiwgcHRyLCBzaXplKTsKKyNlbmRpZgorCisJaWYgKHNpemUgPiBTWU1fTUVNX0NMVVNURVJfU0laRSkKKwkJcmV0dXJuOworCisJd2hpbGUgKHNpemUgPiBzKSB7CisJCXMgPDw9IDE7CisJCSsraTsKKwl9CisKKwlhID0gKHVuc2lnbmVkIGxvbmcpcHRyOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKHMgPT0gU1lNX01FTV9DTFVTVEVSX1NJWkUpIHsKKyNpZmRlZiBTWU1fTUVNX0ZSRUVfVU5VU0VECisJCQlNX0ZSRUVfTUVNX0NMVVNURVIoKHZvaWQgKilhKTsKKyNlbHNlCisJCQkoKG1fbGlua19wKSBhKS0+bmV4dCA9IGhbaV0ubmV4dDsKKwkJCWhbaV0ubmV4dCA9IChtX2xpbmtfcCkgYTsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKwkJYiA9IGEgXiBzOworCQlxID0gJmhbaV07CisJCXdoaWxlIChxLT5uZXh0ICYmIHEtPm5leHQgIT0gKG1fbGlua19wKSBiKSB7CisJCQlxID0gcS0+bmV4dDsKKwkJfQorCQlpZiAoIXEtPm5leHQpIHsKKwkJCSgobV9saW5rX3ApIGEpLT5uZXh0ID0gaFtpXS5uZXh0OworCQkJaFtpXS5uZXh0ID0gKG1fbGlua19wKSBhOworCQkJYnJlYWs7CisJCX0KKwkJcS0+bmV4dCA9IHEtPm5leHQtPm5leHQ7CisJCWEgPSBhICYgYjsKKwkJcyA8PD0gMTsKKwkJKytpOworCX0KK30KKworLyoKKyAqICBWZXJib3NlIGFuZCB6ZXJvaW5nIGFsbG9jYXRvciB0aGF0IHdyYXBwcyB0byB0aGUgZ2VuZXJpYyBhbGxvY2F0b3IuCisgKi8KK3N0YXRpYyB2b2lkICpfX3N5bV9jYWxsb2MyKG1fcG9vbF9wIG1wLCBpbnQgc2l6ZSwgY2hhciAqbmFtZSwgaW50IHVmbGFncykKK3sKKwl2b2lkICpwOworCisJcCA9IF9fX3N5bV9tYWxsb2MobXAsIHNpemUpOworCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfQUxMT0MpIHsKKwkJcHJpbnRmICgibmV3ICUtMTBzWyU0ZF0gQCVwLlxuIiwgbmFtZSwgc2l6ZSwgcCk7CisJfQorCisJaWYgKHApCisJCW1lbXNldChwLCAwLCBzaXplKTsKKwllbHNlIGlmICh1ZmxhZ3MgJiBTWU1fTUVNX1dBUk4pCisJCXByaW50ZiAoIl9fc3ltX2NhbGxvYzI6IGZhaWxlZCB0byBhbGxvY2F0ZSAlc1slZF1cbiIsIG5hbWUsIHNpemUpOworCXJldHVybiBwOworfQorI2RlZmluZSBfX3N5bV9jYWxsb2MobXAsIHMsIG4pCV9fc3ltX2NhbGxvYzIobXAsIHMsIG4sIFNZTV9NRU1fV0FSTikKKworLyoKKyAqICBJdHMgY291bnRlci1wYXJ0LgorICovCitzdGF0aWMgdm9pZCBfX3N5bV9tZnJlZShtX3Bvb2xfcCBtcCwgdm9pZCAqcHRyLCBpbnQgc2l6ZSwgY2hhciAqbmFtZSkKK3sKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19BTExPQykKKwkJcHJpbnRmICgiZnJlZWluZyAlLTEwc1slNGRdIEAlcC5cbiIsIG5hbWUsIHNpemUsIHB0cik7CisKKwlfX19zeW1fbWZyZWUobXAsIHB0ciwgc2l6ZSk7Cit9CisKKy8qCisgKiAgRGVmYXVsdCBtZW1vcnkgcG9vbCB3ZSBkb25ub3QgbmVlZCB0byBpbnZvbHZlIGluIERNQS4KKyAqCisgKiAgV2l0aCBETUEgYWJzdHJhY3Rpb24sIHdlIHVzZSBmdW5jdGlvbnMgKG1ldGhvZHMpLCB0byAKKyAqICBkaXN0aW5ndWlzaCBiZXR3ZWVuIG5vbiBETUFhYmxlIG1lbW9yeSBhbmQgRE1BYWJsZSBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkICpfX19tcDBfZ2V0X21lbV9jbHVzdGVyKG1fcG9vbF9wIG1wKQoreworCXZvaWQgKm0gPSBzeW1fZ2V0X21lbV9jbHVzdGVyKCk7CisJaWYgKG0pCisJCSsrbXAtPm51bXA7CisJcmV0dXJuIG07Cit9CisKKyNpZmRlZglTWU1fTUVNX0ZSRUVfVU5VU0VECitzdGF0aWMgdm9pZCBfX19tcDBfZnJlZV9tZW1fY2x1c3RlcihtX3Bvb2xfcCBtcCwgdm9pZCAqbSkKK3sKKwlzeW1fZnJlZV9tZW1fY2x1c3RlcihtKTsKKwktLW1wLT5udW1wOworfQorI2Vsc2UKKyNkZWZpbmUgX19fbXAwX2ZyZWVfbWVtX2NsdXN0ZXIgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3ltX21fcG9vbCBtcDAgPSB7CisJTlVMTCwKKwlfX19tcDBfZ2V0X21lbV9jbHVzdGVyLAorCV9fX21wMF9mcmVlX21lbV9jbHVzdGVyCit9OworCisvKgorICogIE1ldGhvZHMgdGhhdCBtYWludGFpbnMgRE1BYWJsZSBwb29scyBhY2NvcmRpbmcgdG8gdXNlciBhbGxvY2F0aW9ucy4KKyAqICBOZXcgcG9vbHMgYXJlIGNyZWF0ZWQgb24gdGhlIGZseSB3aGVuIGEgbmV3IHBvb2wgaWQgaXMgcHJvdmlkZWQuCisgKiAgVGhleSBhcmUgZGVsZXRlZCBvbiB0aGUgZmx5IHdoZW4gdGhleSBnZXQgZW1wdGllZC4KKyAqLworLyogR2V0IGEgbWVtb3J5IGNsdXN0ZXIgdGhhdCBtYXRjaGVzIHRoZSBETUEgY29uc3RyYWludHMgb2YgYSBnaXZlbiBwb29sICovCitzdGF0aWMgdm9pZCAqIF9fX2dldF9kbWFfbWVtX2NsdXN0ZXIobV9wb29sX3AgbXApCit7CisJbV92dG9iX3AgdmJwOworCXZvaWQgKnZhZGRyOworCisJdmJwID0gX19zeW1fY2FsbG9jKCZtcDAsIHNpemVvZigqdmJwKSwgIlZUT0IiKTsKKwlpZiAoIXZicCkKKwkJZ290byBvdXRfZXJyOworCisJdmFkZHIgPSBzeW1fbV9nZXRfZG1hX21lbV9jbHVzdGVyKG1wLCB2YnApOworCWlmICh2YWRkcikgeworCQlpbnQgaGMgPSBWVE9CX0hBU0hfQ09ERSh2YWRkcik7CisJCXZicC0+bmV4dCA9IG1wLT52dG9iW2hjXTsKKwkJbXAtPnZ0b2JbaGNdID0gdmJwOworCQkrK21wLT5udW1wOworCX0KKwlyZXR1cm4gdmFkZHI7CitvdXRfZXJyOgorCXJldHVybiBOVUxMOworfQorCisjaWZkZWYJU1lNX01FTV9GUkVFX1VOVVNFRAorLyogRnJlZSBhIG1lbW9yeSBjbHVzdGVyIGFuZCBhc3NvY2lhdGVkIHJlc291cmNlcyBmb3IgRE1BICovCitzdGF0aWMgdm9pZCBfX19mcmVlX2RtYV9tZW1fY2x1c3RlcihtX3Bvb2xfcCBtcCwgdm9pZCAqbSkKK3sKKwltX3Z0b2JfcCAqdmJwcCwgdmJwOworCWludCBoYyA9IFZUT0JfSEFTSF9DT0RFKG0pOworCisJdmJwcCA9ICZtcC0+dnRvYltoY107CisJd2hpbGUgKCp2YnBwICYmICgqdmJwcCktPnZhZGRyICE9IG0pCisJCXZicHAgPSAmKCp2YnBwKS0+bmV4dDsKKwlpZiAoKnZicHApIHsKKwkJdmJwID0gKnZicHA7CisJCSp2YnBwID0gKCp2YnBwKS0+bmV4dDsKKwkJc3ltX21fZnJlZV9kbWFfbWVtX2NsdXN0ZXIobXAsIHZicCk7CisJCV9fc3ltX21mcmVlKCZtcDAsIHZicCwgc2l6ZW9mKCp2YnApLCAiVlRPQiIpOworCQktLW1wLT5udW1wOworCX0KK30KKyNlbmRpZgorCisvKiBGZXRjaCB0aGUgbWVtb3J5IHBvb2wgZm9yIGEgZ2l2ZW4gcG9vbCBpZCAoaS5lLiBETUEgY29uc3RyYWludHMpICovCitzdGF0aWMgX19pbmxpbmUgbV9wb29sX3AgX19fZ2V0X2RtYV9wb29sKG1fcG9vbF9pZGVudF90IGRldl9kbWF0KQoreworCW1fcG9vbF9wIG1wOworCWZvciAobXAgPSBtcDAubmV4dDsKKwkJbXAgJiYgIXN5bV9tX3Bvb2xfbWF0Y2gobXAtPmRldl9kbWF0LCBkZXZfZG1hdCk7CisJCQltcCA9IG1wLT5uZXh0KTsKKwlyZXR1cm4gbXA7Cit9CisKKy8qIENyZWF0ZSBhIG5ldyBtZW1vcnkgRE1BYWJsZSBwb29sICh3aGVuIGZldGNoIGZhaWxlZCkgKi8KK3N0YXRpYyBtX3Bvb2xfcCBfX19jcmVfZG1hX3Bvb2wobV9wb29sX2lkZW50X3QgZGV2X2RtYXQpCit7CisJbV9wb29sX3AgbXAgPSBfX3N5bV9jYWxsb2MoJm1wMCwgc2l6ZW9mKCptcCksICJNUE9PTCIpOworCWlmIChtcCkgeworCQltcC0+ZGV2X2RtYXQgPSBkZXZfZG1hdDsKKwkJbXAtPmdldF9tZW1fY2x1c3RlciA9IF9fX2dldF9kbWFfbWVtX2NsdXN0ZXI7CisjaWZkZWYJU1lNX01FTV9GUkVFX1VOVVNFRAorCQltcC0+ZnJlZV9tZW1fY2x1c3RlciA9IF9fX2ZyZWVfZG1hX21lbV9jbHVzdGVyOworI2VuZGlmCisJCW1wLT5uZXh0ID0gbXAwLm5leHQ7CisJCW1wMC5uZXh0ID0gbXA7CisJCXJldHVybiBtcDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKyNpZmRlZglTWU1fTUVNX0ZSRUVfVU5VU0VECisvKiBEZXN0cm95IGEgRE1BYWJsZSBtZW1vcnkgcG9vbCAod2hlbiBnb3QgZW1wdGllZCkgKi8KK3N0YXRpYyB2b2lkIF9fX2RlbF9kbWFfcG9vbChtX3Bvb2xfcCBwKQoreworCW1fcG9vbF9wICpwcCA9ICZtcDAubmV4dDsKKworCXdoaWxlICgqcHAgJiYgKnBwICE9IHApCisJCXBwID0gJigqcHApLT5uZXh0OworCWlmICgqcHApIHsKKwkJKnBwID0gKCpwcCktPm5leHQ7CisJCV9fc3ltX21mcmVlKCZtcDAsIHAsIHNpemVvZigqcCksICJNUE9PTCIpOworCX0KK30KKyNlbmRpZgorCisvKiBUaGlzIGxvY2sgcHJvdGVjdHMgb25seSB0aGUgbWVtb3J5IGFsbG9jYXRpb24vZnJlZS4gICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN5bTUzYzh4eF9sb2NrKTsKKworLyoKKyAqICBBY3R1YWwgYWxsb2NhdG9yIGZvciBETUFhYmxlIG1lbW9yeS4KKyAqLwordm9pZCAqX19zeW1fY2FsbG9jX2RtYShtX3Bvb2xfaWRlbnRfdCBkZXZfZG1hdCwgaW50IHNpemUsIGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwltX3Bvb2xfcCBtcDsKKwl2b2lkICptID0gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzeW01M2M4eHhfbG9jaywgZmxhZ3MpOworCW1wID0gX19fZ2V0X2RtYV9wb29sKGRldl9kbWF0KTsKKwlpZiAoIW1wKQorCQltcCA9IF9fX2NyZV9kbWFfcG9vbChkZXZfZG1hdCk7CisJaWYgKCFtcCkKKwkJZ290byBvdXQ7CisJbSA9IF9fc3ltX2NhbGxvYyhtcCwgc2l6ZSwgbmFtZSk7CisjaWZkZWYJU1lNX01FTV9GUkVFX1VOVVNFRAorCWlmICghbXAtPm51bXApCisJCV9fX2RlbF9kbWFfcG9vbChtcCk7CisjZW5kaWYKKworIG91dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW01M2M4eHhfbG9jaywgZmxhZ3MpOworCXJldHVybiBtOworfQorCit2b2lkIF9fc3ltX21mcmVlX2RtYShtX3Bvb2xfaWRlbnRfdCBkZXZfZG1hdCwgdm9pZCAqbSwgaW50IHNpemUsIGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwltX3Bvb2xfcCBtcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzeW01M2M4eHhfbG9jaywgZmxhZ3MpOworCW1wID0gX19fZ2V0X2RtYV9wb29sKGRldl9kbWF0KTsKKwlpZiAoIW1wKQorCQlnb3RvIG91dDsKKwlfX3N5bV9tZnJlZShtcCwgbSwgc2l6ZSwgbmFtZSk7CisjaWZkZWYJU1lNX01FTV9GUkVFX1VOVVNFRAorCWlmICghbXAtPm51bXApCisJCV9fX2RlbF9kbWFfcG9vbChtcCk7CisjZW5kaWYKKyBvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3ltNTNjOHh4X2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqICBBY3R1YWwgdmlydHVhbCB0byBidXMgcGh5c2ljYWwgYWRkcmVzcyB0cmFuc2xhdG9yIAorICogIGZvciAzMiBiaXQgYWRkcmVzc2FibGUgRE1BYWJsZSBtZW1vcnkuCisgKi8KK2RtYV9hZGRyX3QgX192dG9idXMobV9wb29sX2lkZW50X3QgZGV2X2RtYXQsIHZvaWQgKm0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwltX3Bvb2xfcCBtcDsKKwlpbnQgaGMgPSBWVE9CX0hBU0hfQ09ERShtKTsKKwltX3Z0b2JfcCB2cCA9IE5VTEw7CisJdm9pZCAqYSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKW0gJiB+U1lNX01FTV9DTFVTVEVSX01BU0spOworCWRtYV9hZGRyX3QgYjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzeW01M2M4eHhfbG9jaywgZmxhZ3MpOworCW1wID0gX19fZ2V0X2RtYV9wb29sKGRldl9kbWF0KTsKKwlpZiAobXApIHsKKwkJdnAgPSBtcC0+dnRvYltoY107CisJCXdoaWxlICh2cCAmJiB2cC0+dmFkZHIgIT0gYSkKKwkJCXZwID0gdnAtPm5leHQ7CisJfQorCWlmICghdnApCisJCXBhbmljKCJzeW06IFZUT0JVUyBGQUlMRUQhXG4iKTsKKwliID0gdnAtPmJhZGRyICsgKG0gLSBhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW01M2M4eHhfbG9jaywgZmxhZ3MpOworCXJldHVybiBiOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9taXNjLmggYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX21pc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDMzZDVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9taXNjLmgKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBEZXZpY2UgZHJpdmVyIGZvciB0aGUgU1lNQklPUy9MU0lMT0dJQyA1M0M4WFggYW5kIDUzQzEwMTAgZmFtaWx5IAorICogb2YgUENJLVNDU0kgSU8gcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSAgR2VyYXJkIFJvdWRpZXIgPGdyb3VkaWVyQGZyZWUuZnI+CisgKgorICogVGhpcyBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBMaW51eCBzeW01M2M4eHggZHJpdmVyLgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgIEdlcmFyZCBSb3VkaWVyCisgKgorICogVGhlIHN5bTUzYzh4eCBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBuY3I1M2M4eHggZHJpdmVyIHRoYXQgaGFkIGJlZW4gCisgKiBhIHBvcnQgb2YgdGhlIEZyZWVCU0QgbmNyIGRyaXZlciB0byBMaW51eC0xLjIuMTMuCisgKgorICogVGhlIG9yaWdpbmFsIG5jciBkcml2ZXIgaGFzIGJlZW4gd3JpdHRlbiBmb3IgMzg2YnNkIGFuZCBGcmVlQlNEIGJ5CisgKiAgICAgICAgIFdvbGZnYW5nIFN0YW5nbG1laWVyICAgICAgICA8d29sZkBjb2xvZ25lLmRlPgorICogICAgICAgICBTdGVmYW4gRXNzZXIgICAgICAgICAgICAgICAgPHNlQG1pLlVuaS1Lb2Vsbi5kZT4KKyAqIENvcHlyaWdodCAoQykgMTk5NCAgV29sZmdhbmcgU3RhbmdsbWVpZXIKKyAqCisgKiBPdGhlciBtYWpvciBjb250cmlidXRpb25zOgorICoKKyAqIE5WUkFNIGRldGVjdGlvbiBhbmQgcmVhZGluZy4KKyAqIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIFdhbHRoYW0gPGRvcm1vdXNlQGZhcnNyb2J0LmRlbW9uLmNvLnVrPgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBTWU1fTUlTQ19ICisjZGVmaW5lIFNZTV9NSVNDX0gKKworLyoKKyAqICBBIGxhIFZNUy9DQU0tMyBxdWV1ZSBtYW5hZ2VtZW50LgorICovCit0eXBlZGVmIHN0cnVjdCBzeW1fcXVlaGVhZCB7CisJc3RydWN0IHN5bV9xdWVoZWFkICpmbGluazsJLyogRm9yd2FyZCAgcG9pbnRlciAqLworCXN0cnVjdCBzeW1fcXVlaGVhZCAqYmxpbms7CS8qIEJhY2t3YXJkIHBvaW50ZXIgKi8KK30gU1lNX1FVRUhFQUQ7CisKKyNkZWZpbmUgc3ltX3F1ZV9pbml0KHB0cikgZG8geyBcCisJKHB0ciktPmZsaW5rID0gKHB0cik7IChwdHIpLT5ibGluayA9IChwdHIpOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgX19pbmxpbmUgc3RydWN0IHN5bV9xdWVoZWFkICpzeW1fcXVlX2ZpcnN0KHN0cnVjdCBzeW1fcXVlaGVhZCAqaGVhZCkKK3sKKwlyZXR1cm4gKGhlYWQtPmZsaW5rID09IGhlYWQpID8gMCA6IGhlYWQtPmZsaW5rOworfQorCitzdGF0aWMgX19pbmxpbmUgc3RydWN0IHN5bV9xdWVoZWFkICpzeW1fcXVlX2xhc3Qoc3RydWN0IHN5bV9xdWVoZWFkICpoZWFkKQoreworCXJldHVybiAoaGVhZC0+YmxpbmsgPT0gaGVhZCkgPyAwIDogaGVhZC0+Ymxpbms7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkIF9fc3ltX3F1ZV9hZGQoc3RydWN0IHN5bV9xdWVoZWFkICogbmV3LAorCXN0cnVjdCBzeW1fcXVlaGVhZCAqIGJsaW5rLAorCXN0cnVjdCBzeW1fcXVlaGVhZCAqIGZsaW5rKQoreworCWZsaW5rLT5ibGluawk9IG5ldzsKKwluZXctPmZsaW5rCT0gZmxpbms7CisJbmV3LT5ibGluawk9IGJsaW5rOworCWJsaW5rLT5mbGluawk9IG5ldzsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQgX19zeW1fcXVlX2RlbChzdHJ1Y3Qgc3ltX3F1ZWhlYWQgKiBibGluaywKKwlzdHJ1Y3Qgc3ltX3F1ZWhlYWQgKiBmbGluaykKK3sKKwlmbGluay0+YmxpbmsgPSBibGluazsKKwlibGluay0+ZmxpbmsgPSBmbGluazsKK30KKworc3RhdGljIF9faW5saW5lIGludCBzeW1fcXVlX2VtcHR5KHN0cnVjdCBzeW1fcXVlaGVhZCAqaGVhZCkKK3sKKwlyZXR1cm4gaGVhZC0+ZmxpbmsgPT0gaGVhZDsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQgc3ltX3F1ZV9zcGxpY2Uoc3RydWN0IHN5bV9xdWVoZWFkICpsaXN0LAorCXN0cnVjdCBzeW1fcXVlaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3Qgc3ltX3F1ZWhlYWQgKmZpcnN0ID0gbGlzdC0+Zmxpbms7CisKKwlpZiAoZmlyc3QgIT0gbGlzdCkgeworCQlzdHJ1Y3Qgc3ltX3F1ZWhlYWQgKmxhc3QgPSBsaXN0LT5ibGluazsKKwkJc3RydWN0IHN5bV9xdWVoZWFkICphdCAgID0gaGVhZC0+Zmxpbms7CisKKwkJZmlyc3QtPmJsaW5rID0gaGVhZDsKKwkJaGVhZC0+ZmxpbmsgID0gZmlyc3Q7CisKKwkJbGFzdC0+ZmxpbmsgPSBhdDsKKwkJYXQtPmJsaW5rICAgPSBsYXN0OworCX0KK30KKworc3RhdGljIF9faW5saW5lIHZvaWQgc3ltX3F1ZV9tb3ZlKHN0cnVjdCBzeW1fcXVlaGVhZCAqb3JpZywKKwlzdHJ1Y3Qgc3ltX3F1ZWhlYWQgKmRlc3QpCit7CisJc3RydWN0IHN5bV9xdWVoZWFkICpmaXJzdCwgKmxhc3Q7CisKKwlmaXJzdCA9IG9yaWctPmZsaW5rOworCWlmIChmaXJzdCAhPSBvcmlnKSB7CisJCWZpcnN0LT5ibGluayA9IGRlc3Q7CisJCWRlc3QtPmZsaW5rICA9IGZpcnN0OworCQlsYXN0ID0gb3JpZy0+Ymxpbms7CisJCWxhc3QtPmZsaW5rICA9IGRlc3Q7CisJCWRlc3QtPmJsaW5rICA9IGxhc3Q7CisJCW9yaWctPmZsaW5rICA9IG9yaWc7CisJCW9yaWctPmJsaW5rICA9IG9yaWc7CisJfSBlbHNlIHsKKwkJZGVzdC0+ZmxpbmsgID0gZGVzdDsKKwkJZGVzdC0+YmxpbmsgID0gZGVzdDsKKwl9Cit9CisKKyNkZWZpbmUgc3ltX3F1ZV9lbnRyeShwdHIsIHR5cGUsIG1lbWJlcikgXAorCSgodHlwZSAqKSgoY2hhciAqKShwdHIpLSh1bnNpZ25lZCBpbnQpKCYoKHR5cGUgKikwKS0+bWVtYmVyKSkpCisKKworI2RlZmluZSBzeW1faW5zcXVlKG5ldywgcG9zKQkJX19zeW1fcXVlX2FkZChuZXcsIHBvcywgKHBvcyktPmZsaW5rKQorCisjZGVmaW5lIHN5bV9yZW1xdWUoZWwpCQkJX19zeW1fcXVlX2RlbCgoZWwpLT5ibGluaywgKGVsKS0+ZmxpbmspCisKKyNkZWZpbmUgc3ltX2luc3F1ZV9oZWFkKG5ldywgaGVhZCkJX19zeW1fcXVlX2FkZChuZXcsIGhlYWQsIChoZWFkKS0+ZmxpbmspCisKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3Qgc3ltX3F1ZWhlYWQgKnN5bV9yZW1xdWVfaGVhZChzdHJ1Y3Qgc3ltX3F1ZWhlYWQgKmhlYWQpCit7CisJc3RydWN0IHN5bV9xdWVoZWFkICplbGVtID0gaGVhZC0+Zmxpbms7CisKKwlpZiAoZWxlbSAhPSBoZWFkKQorCQlfX3N5bV9xdWVfZGVsKGhlYWQsIGVsZW0tPmZsaW5rKTsKKwllbHNlCisJCWVsZW0gPSBOVUxMOworCXJldHVybiBlbGVtOworfQorCisjZGVmaW5lIHN5bV9pbnNxdWVfdGFpbChuZXcsIGhlYWQpCV9fc3ltX3F1ZV9hZGQobmV3LCAoaGVhZCktPmJsaW5rLCBoZWFkKQorCitzdGF0aWMgX19pbmxpbmUgc3RydWN0IHN5bV9xdWVoZWFkICpzeW1fcmVtcXVlX3RhaWwoc3RydWN0IHN5bV9xdWVoZWFkICpoZWFkKQoreworCXN0cnVjdCBzeW1fcXVlaGVhZCAqZWxlbSA9IGhlYWQtPmJsaW5rOworCisJaWYgKGVsZW0gIT0gaGVhZCkKKwkJX19zeW1fcXVlX2RlbChlbGVtLT5ibGluaywgaGVhZCk7CisJZWxzZQorCQllbGVtID0gMDsKKwlyZXR1cm4gZWxlbTsKK30KKworLyoKKyAqICBUaGlzIG9uZSBtYXkgYmUgdXNlZnVsLgorICovCisjZGVmaW5lIEZPUl9FQUNIX1FVRVVFRF9FTEVNRU5UKGhlYWQsIHFwKSBcCisJZm9yIChxcCA9IChoZWFkKS0+Zmxpbms7IHFwICE9IChoZWFkKTsgcXAgPSBxcC0+ZmxpbmspCisvKgorICogIEZyZWVCU0QgZG9lcyBub3Qgb2ZmZXIgb3VyIGtpbmQgb2YgcXVldWUgaW4gdGhlIENBTSBDQ0IuCisgKiAgU28sIHdlIGhhdmUgdG8gY2FzdC4KKyAqLworI2RlZmluZSBzeW1fcXB0cihwKQkoKHN0cnVjdCBzeW1fcXVlaGVhZCAqKSAocCkpCisKKy8qCisgKiAgU2ltcGxlIGJpdG1hcCBvcGVyYXRpb25zLgorICovIAorI2RlZmluZSBzeW1fc2V0X2JpdChwLCBuKQkoKCh1MzIgKikocCkpWyhuKT4+NV0gfD0gICgxPDwoKG4pJjB4MWYpKSkKKyNkZWZpbmUgc3ltX2Nscl9iaXQocCwgbikJKCgodTMyICopKHApKVsobik+PjVdICY9IH4oMTw8KChuKSYweDFmKSkpCisjZGVmaW5lIHN5bV9pc19iaXQocCwgbikJKCgodTMyICopKHApKVsobik+PjVdICYgICAoMTw8KChuKSYweDFmKSkpCisKKy8qCisgKiBUaGUgYmVsb3cgcm91bmQgdXAvZG93biBtYWNyb3MgYXJlIHRvIGJlIHVzZWQgd2l0aCBhIGNvbnN0YW50IAorICogYXMgYXJndW1lbnQgKHNpemVvZiguLi4pIGZvciBleGFtcGxlKSwgZm9yIHRoZSBjb21waWxlciB0byAKKyAqIG9wdGltaXplIHRoZSB3aG9sZSB0aGluZy4KKyAqLworI2RlZmluZSBfVV8oYSxtKQkoYSk8PSgxPDxtKT9tOgorCisvKgorICogUm91bmQgdXAgbG9nYXJpdGhtIHRvIGJhc2UgMiBvZiBhIDE2IGJpdCBjb25zdGFudC4KKyAqLworI2RlZmluZSBfTEdSVTE2XyhhKSBcCisoIFwKKyBfVV8oYSwgMClfVV8oYSwgMSlfVV8oYSwgMilfVV8oYSwgMylfVV8oYSwgNClfVV8oYSwgNSlfVV8oYSwgNilfVV8oYSwgNykgXAorIF9VXyhhLCA4KV9VXyhhLCA5KV9VXyhhLDEwKV9VXyhhLDExKV9VXyhhLDEyKV9VXyhhLDEzKV9VXyhhLDE0KV9VXyhhLDE1KSBcCisgMTYpCisKKyNlbmRpZiAvKiBTWU1fTUlTQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX252cmFtLmMgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX252cmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI3MjFlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fbnZyYW0uYwpAQCAtMCwwICsxLDc3MSBAQAorLyoKKyAqIERldmljZSBkcml2ZXIgZm9yIHRoZSBTWU1CSU9TL0xTSUxPR0lDIDUzQzhYWCBhbmQgNTNDMTAxMCBmYW1pbHkgCisgKiBvZiBQQ0ktU0NTSSBJTyBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxICBHZXJhcmQgUm91ZGllciA8Z3JvdWRpZXJAZnJlZS5mcj4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIExpbnV4IHN5bTUzYzh4eCBkcml2ZXIuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCAgR2VyYXJkIFJvdWRpZXIKKyAqCisgKiBUaGUgc3ltNTNjOHh4IGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIG5jcjUzYzh4eCBkcml2ZXIgdGhhdCBoYWQgYmVlbiAKKyAqIGEgcG9ydCBvZiB0aGUgRnJlZUJTRCBuY3IgZHJpdmVyIHRvIExpbnV4LTEuMi4xMy4KKyAqCisgKiBUaGUgb3JpZ2luYWwgbmNyIGRyaXZlciBoYXMgYmVlbiB3cml0dGVuIGZvciAzODZic2QgYW5kIEZyZWVCU0QgYnkKKyAqICAgICAgICAgV29sZmdhbmcgU3RhbmdsbWVpZXIgICAgICAgIDx3b2xmQGNvbG9nbmUuZGU+CisgKiAgICAgICAgIFN0ZWZhbiBFc3NlciAgICAgICAgICAgICAgICA8c2VAbWkuVW5pLUtvZWxuLmRlPgorICogQ29weXJpZ2h0IChDKSAxOTk0ICBXb2xmZ2FuZyBTdGFuZ2xtZWllcgorICoKKyAqIE90aGVyIG1ham9yIGNvbnRyaWJ1dGlvbnM6CisgKgorICogTlZSQU0gZGV0ZWN0aW9uIGFuZCByZWFkaW5nLgorICogQ29weXJpZ2h0IChDKSAxOTk3IFJpY2hhcmQgV2FsdGhhbSA8ZG9ybW91c2VAZmFyc3JvYnQuZGVtb24uY28udWs+CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAic3ltX2dsdWUuaCIKKyNpbmNsdWRlICJzeW1fbnZyYW0uaCIKKworI2lmZGVmCVNZTV9DT05GX0RFQlVHX05WUkFNCitzdGF0aWMgdV9jaGFyIFRla3JhbV9ib290X2RlbGF5WzddID0gezMsIDUsIDEwLCAyMCwgMzAsIDYwLCAxMjB9OworI2VuZGlmCisKKy8qCisgKiAgR2V0IGhvc3Qgc2V0dXAgZnJvbSBOVlJBTS4KKyAqLwordm9pZCBzeW1fbnZyYW1fc2V0dXBfaG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX252cmFtICpudnJhbSkKK3sKKwkvKgorCSAqICBHZXQgcGFyaXR5IGNoZWNraW5nLCBob3N0IElELCB2ZXJib3NlIG1vZGUgCisJICogIGFuZCBtaXNjZWxsYW5lb3VzIGhvc3QgZmxhZ3MgZnJvbSBOVlJBTS4KKwkgKi8KKwlzd2l0Y2ggKG52cmFtLT50eXBlKSB7CisJY2FzZSBTWU1fU1lNQklPU19OVlJBTToKKwkJaWYgKCEobnZyYW0tPmRhdGEuU3ltYmlvcy5mbGFncyAmIFNZTUJJT1NfUEFSSVRZX0VOQUJMRSkpCisJCQlucC0+cnZfc2NudGwwICAmPSB+MHgwYTsKKwkJbnAtPm15YWRkciA9IG52cmFtLT5kYXRhLlN5bWJpb3MuaG9zdF9pZCAmIDB4MGY7CisJCWlmIChudnJhbS0+ZGF0YS5TeW1iaW9zLmZsYWdzICYgU1lNQklPU19WRVJCT1NFX01TR1MpCisJCQlucC0+dmVyYm9zZSArPSAxOworCQlpZiAobnZyYW0tPmRhdGEuU3ltYmlvcy5mbGFnczEgJiBTWU1CSU9TX1NDQU5fSElfTE8pCisJCQlzaG9zdC0+cmV2ZXJzZV9vcmRlcmluZyA9IDE7CisJCWlmIChudnJhbS0+ZGF0YS5TeW1iaW9zLmZsYWdzMiAmIFNZTUJJT1NfQVZPSURfQlVTX1JFU0VUKQorCQkJbnAtPnVzcmZsYWdzIHw9IFNZTV9BVk9JRF9CVVNfUkVTRVQ7CisJCWJyZWFrOworCWNhc2UgU1lNX1RFS1JBTV9OVlJBTToKKwkJbnAtPm15YWRkciA9IG52cmFtLT5kYXRhLlRla3JhbS5ob3N0X2lkICYgMHgwZjsKKwkJYnJlYWs7CisjaWZkZWYgQ09ORklHX1BBUklTQworCWNhc2UgU1lNX1BBUklTQ19QREM6CisJCWlmIChudnJhbS0+ZGF0YS5wYXJpc2MuaG9zdF9pZCAhPSAtMSkKKwkJCW5wLT5teWFkZHIgPSBudnJhbS0+ZGF0YS5wYXJpc2MuaG9zdF9pZDsKKwkJaWYgKG52cmFtLT5kYXRhLnBhcmlzYy5mYWN0b3IgIT0gLTEpCisJCQlucC0+bWluc3luYyA9IG52cmFtLT5kYXRhLnBhcmlzYy5mYWN0b3I7CisJCWlmIChudnJhbS0+ZGF0YS5wYXJpc2Mud2lkdGggIT0gLTEpCisJCQlucC0+bWF4d2lkZSA9IG52cmFtLT5kYXRhLnBhcmlzYy53aWR0aDsKKwkJc3dpdGNoIChudnJhbS0+ZGF0YS5wYXJpc2MubW9kZSkgeworCQkJY2FzZSAwOiBucC0+c2NzaV9tb2RlID0gU01PREVfU0U7IGJyZWFrOworCQkJY2FzZSAxOiBucC0+c2NzaV9tb2RlID0gU01PREVfSFZEOyBicmVhazsKKwkJCWNhc2UgMjogbnAtPnNjc2lfbW9kZSA9IFNNT0RFX0xWRDsgYnJlYWs7CisJCQlkZWZhdWx0OiBicmVhazsKKwkJfQorI2VuZGlmCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogIEdldCB0YXJnZXQgc2V0LXVwIGZyb20gU3ltYmlvcyBmb3JtYXQgTlZSQU0uCisgKi8KK3N0YXRpYyB2b2lkCitzeW1fU3ltYmlvc19zZXR1cF90YXJnZXQoc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgdGFyZ2V0LCBTeW1iaW9zX252cmFtICpudnJhbSkKK3sKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSAmbnAtPnRhcmdldFt0YXJnZXRdOworCVN5bWJpb3NfdGFyZ2V0ICp0biA9ICZudnJhbS0+dGFyZ2V0W3RhcmdldF07CisKKwl0cC0+dXNydGFncyA9CisJCSh0bi0+ZmxhZ3MgJiBTWU1CSU9TX1FVRVVFX1RBR1NfRU5BQkxFRCk/IFNZTV9TRVRVUF9NQVhfVEFHIDogMDsKKworCWlmICghKHRuLT5mbGFncyAmIFNZTUJJT1NfRElTQ09OTkVDVF9FTkFCTEUpKQorCQl0cC0+dXNyZmxhZ3MgJj0gflNZTV9ESVNDX0VOQUJMRUQ7CisJaWYgKCEodG4tPmZsYWdzICYgU1lNQklPU19TQ0FOX0FUX0JPT1RfVElNRSkpCisJCXRwLT51c3JmbGFncyB8PSBTWU1fU0NBTl9CT09UX0RJU0FCTEVEOworCWlmICghKHRuLT5mbGFncyAmIFNZTUJJT1NfU0NBTl9MVU5TKSkKKwkJdHAtPnVzcmZsYWdzIHw9IFNZTV9TQ0FOX0xVTlNfRElTQUJMRUQ7Cit9CisKKy8qCisgKiAgR2V0IHRhcmdldCBzZXQtdXAgZnJvbSBUZWtyYW0gZm9ybWF0IE5WUkFNLgorICovCitzdGF0aWMgdm9pZAorc3ltX1Rla3JhbV9zZXR1cF90YXJnZXQoc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgdGFyZ2V0LCBUZWtyYW1fbnZyYW0gKm52cmFtKQoreworCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W3RhcmdldF07CisJc3RydWN0IFRla3JhbV90YXJnZXQgKnRuID0gJm52cmFtLT50YXJnZXRbdGFyZ2V0XTsKKworCWlmICh0bi0+ZmxhZ3MgJiBURUtSQU1fVEFHR0VEX0NPTU1BTkRTKSB7CisJCXRwLT51c3J0YWdzID0gMiA8PCBudnJhbS0+bWF4X3RhZ3NfaW5kZXg7CisJfQorCisJaWYgKHRuLT5mbGFncyAmIFRFS1JBTV9ESVNDT05ORUNUX0VOQUJMRSkKKwkJdHAtPnVzcmZsYWdzIHw9IFNZTV9ESVNDX0VOQUJMRUQ7CisgCisJLyogSWYgYW55IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHBhcml0eSwgd2Ugd2lsbCBub3QgdXNlIHRoaXMgb3B0aW9uICovCisJaWYgKCEodG4tPmZsYWdzICYgVEVLUkFNX1BBUklUWV9DSEVDSykpCisJCW5wLT5ydl9zY250bDAgICY9IH4weDBhOyAvKiBTQ1NJIHBhcml0eSBjaGVja2luZyBkaXNhYmxlZCAqLworfQorCisvKgorICogIEdldCB0YXJnZXQgc2V0dXAgZnJvbSBOVlJBTS4KKyAqLwordm9pZCBzeW1fbnZyYW1fc2V0dXBfdGFyZ2V0KHN0cnVjdCBzeW1faGNiICpucCwgaW50IHRhcmdldCwgc3RydWN0IHN5bV9udnJhbSAqbnZwKQoreworCXN3aXRjaCAobnZwLT50eXBlKSB7CisJY2FzZSBTWU1fU1lNQklPU19OVlJBTToKKwkJc3ltX1N5bWJpb3Nfc2V0dXBfdGFyZ2V0KG5wLCB0YXJnZXQsICZudnAtPmRhdGEuU3ltYmlvcyk7CisJCWJyZWFrOworCWNhc2UgU1lNX1RFS1JBTV9OVlJBTToKKwkJc3ltX1Rla3JhbV9zZXR1cF90YXJnZXQobnAsIHRhcmdldCwgJm52cC0+ZGF0YS5UZWtyYW0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKyNpZmRlZglTWU1fQ09ORl9ERUJVR19OVlJBTQorLyoKKyAqICBEdW1wIFN5bWJpb3MgZm9ybWF0IE5WUkFNIGZvciBkZWJ1Z2dpbmcgcHVycG9zZS4KKyAqLworc3RhdGljIHZvaWQgc3ltX2Rpc3BsYXlfU3ltYmlvc19udnJhbShzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIFN5bWJpb3NfbnZyYW0gKm52cmFtKQoreworCWludCBpOworCisJLyogZGlzcGxheSBTeW1iaW9zIG52cmFtIGhvc3QgZGF0YSAqLworCXByaW50ZigiJXM6IEhPU1QgSUQ9JWQlcyVzJXMlcyVzJXNcbiIsCisJCXN5bV9uYW1lKG5wKSwgbnZyYW0tPmhvc3RfaWQgJiAweDBmLAorCQkobnZyYW0tPmZsYWdzICAmIFNZTUJJT1NfU0NBTV9FTkFCTEUpCT8gIiBTQ0FNIgk6IiIsCisJCShudnJhbS0+ZmxhZ3MgICYgU1lNQklPU19QQVJJVFlfRU5BQkxFKQk/ICIgUEFSSVRZIgk6IiIsCisJCShudnJhbS0+ZmxhZ3MgICYgU1lNQklPU19WRVJCT1NFX01TR1MpCT8gIiBWRVJCT1NFIgk6IiIsIAorCQkobnZyYW0tPmZsYWdzICAmIFNZTUJJT1NfQ0hTX01BUFBJTkcpCT8gIiBDSFNfQUxUIgk6IiIsIAorCQkobnZyYW0tPmZsYWdzMiAmIFNZTUJJT1NfQVZPSURfQlVTX1JFU0VUKT8iIE5PX1JFU0VUIgk6IiIsCisJCShudnJhbS0+ZmxhZ3MxICYgU1lNQklPU19TQ0FOX0hJX0xPKQk/ICIgSElfTE8iCToiIik7CisKKwkvKiBkaXNwbGF5IFN5bWJpb3MgbnZyYW0gZHJpdmUgZGF0YSAqLworCWZvciAoaSA9IDAgOyBpIDwgMTUgOyBpKyspIHsKKwkJc3RydWN0IFN5bWJpb3NfdGFyZ2V0ICp0biA9ICZudnJhbS0+dGFyZ2V0W2ldOworCQlwcmludGYoIiVzLSVkOiVzJXMlcyVzIFdJRFRIPSVkIFNZTkM9JWQgVE1PPSVkXG4iLAorCQlzeW1fbmFtZShucCksIGksCisJCSh0bi0+ZmxhZ3MgJiBTWU1CSU9TX0RJU0NPTk5FQ1RfRU5BQkxFKQk/ICIgRElTQyIJOiAiIiwKKwkJKHRuLT5mbGFncyAmIFNZTUJJT1NfU0NBTl9BVF9CT09UX1RJTUUpCT8gIiBTQ0FOX0JPT1QiCTogIiIsCisJCSh0bi0+ZmxhZ3MgJiBTWU1CSU9TX1NDQU5fTFVOUykJCT8gIiBTQ0FOX0xVTlMiCTogIiIsCisJCSh0bi0+ZmxhZ3MgJiBTWU1CSU9TX1FVRVVFX1RBR1NfRU5BQkxFRCk/ICIgVENRIgk6ICIiLAorCQl0bi0+YnVzX3dpZHRoLAorCQl0bi0+c3luY19wZXJpb2QgLyA0LAorCQl0bi0+dGltZW91dCk7CisJfQorfQorCisvKgorICogIER1bXAgVEVLUkFNIGZvcm1hdCBOVlJBTSBmb3IgZGVidWdnaW5nIHB1cnBvc2UuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9kaXNwbGF5X1Rla3JhbV9udnJhbShzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIFRla3JhbV9udnJhbSAqbnZyYW0pCit7CisJaW50IGksIHRhZ3MsIGJvb3RfZGVsYXk7CisJY2hhciAqcmVtOworCisJLyogZGlzcGxheSBUZWtyYW0gbnZyYW0gaG9zdCBkYXRhICovCisJdGFncyA9IDIgPDwgbnZyYW0tPm1heF90YWdzX2luZGV4OworCWJvb3RfZGVsYXkgPSAwOworCWlmIChudnJhbS0+Ym9vdF9kZWxheV9pbmRleCA8IDYpCisJCWJvb3RfZGVsYXkgPSBUZWtyYW1fYm9vdF9kZWxheVtudnJhbS0+Ym9vdF9kZWxheV9pbmRleF07CisJc3dpdGNoICgobnZyYW0tPmZsYWdzICYgVEVLUkFNX1JFTU9WQUJMRV9GTEFHUykgPj4gNikgeworCWRlZmF1bHQ6CisJY2FzZSAwOglyZW0gPSAiIjsJCQlicmVhazsKKwljYXNlIDE6IHJlbSA9ICIgUkVNT1ZBQkxFPWJvb3QgZGV2aWNlIjsJYnJlYWs7CisJY2FzZSAyOiByZW0gPSAiIFJFTU9WQUJMRT1hbGwiOwkJYnJlYWs7CisJfQorCisJcHJpbnRmKCIlczogSE9TVCBJRD0lZCVzJXMlcyVzJXMlcyVzJXMlcyBCT09UIERFTEFZPSVkIHRhZ3M9JWRcbiIsCisJCXN5bV9uYW1lKG5wKSwgbnZyYW0tPmhvc3RfaWQgJiAweDBmLAorCQkobnZyYW0tPmZsYWdzMSAmIFNZTUJJT1NfU0NBTV9FTkFCTEUpCT8gIiBTQ0FNIgk6IiIsCisJCShudnJhbS0+ZmxhZ3MgJiBURUtSQU1fTU9SRV9USEFOXzJfRFJJVkVTKSA/ICIgPjJEUklWRVMiOiIiLAorCQkobnZyYW0tPmZsYWdzICYgVEVLUkFNX0RSSVZFU19TVVBfMUdCKQk/ICIgPjFHQiIJOiIiLAorCQkobnZyYW0tPmZsYWdzICYgVEVLUkFNX1JFU0VUX09OX1BPV0VSX09OKSA/ICIgUkVTRVQiCToiIiwKKwkJKG52cmFtLT5mbGFncyAmIFRFS1JBTV9BQ1RJVkVfTkVHQVRJT04pCT8gIiBBQ1RfTkVHIgk6IiIsCisJCShudnJhbS0+ZmxhZ3MgJiBURUtSQU1fSU1NRURJQVRFX1NFRUspCT8gIiBJTU1fU0VFSyIJOiIiLAorCQkobnZyYW0tPmZsYWdzICYgVEVLUkFNX1NDQU5fTFVOUykJPyAiIFNDQU5fTFVOUyIJOiIiLAorCQkobnZyYW0tPmZsYWdzMSAmIFRFS1JBTV9GMl9GNl9FTkFCTEVEKQk/ICIgRjJfRjYiCToiIiwKKwkJcmVtLCBib290X2RlbGF5LCB0YWdzKTsKKworCS8qIGRpc3BsYXkgVGVrcmFtIG52cmFtIGRyaXZlIGRhdGEgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IDE1OyBpKyspIHsKKwkJaW50IHN5bmMsIGo7CisJCXN0cnVjdCBUZWtyYW1fdGFyZ2V0ICp0biA9ICZudnJhbS0+dGFyZ2V0W2ldOworCQlqID0gdG4tPnN5bmNfaW5kZXggJiAweGY7CisJCXN5bmMgPSBUZWtyYW1fc3luY1tqXTsKKwkJcHJpbnRmKCIlcy0lZDolcyVzJXMlcyVzJXMgUEVSSU9EPSVkXG4iLAorCQlzeW1fbmFtZShucCksIGksCisJCSh0bi0+ZmxhZ3MgJiBURUtSQU1fUEFSSVRZX0NIRUNLKQk/ICIgUEFSSVRZIgk6ICIiLAorCQkodG4tPmZsYWdzICYgVEVLUkFNX1NZTkNfTkVHTykJCT8gIiBTWU5DIgk6ICIiLAorCQkodG4tPmZsYWdzICYgVEVLUkFNX0RJU0NPTk5FQ1RfRU5BQkxFKQk/ICIgRElTQyIJOiAiIiwKKwkJKHRuLT5mbGFncyAmIFRFS1JBTV9TVEFSVF9DTUQpCQk/ICIgU1RBUlQiCTogIiIsCisJCSh0bi0+ZmxhZ3MgJiBURUtSQU1fVEFHR0VEX0NPTU1BTkRTKQk/ICIgVENRIgk6ICIiLAorCQkodG4tPmZsYWdzICYgVEVLUkFNX1dJREVfTkVHTykJCT8gIiBXSURFIgk6ICIiLAorCQlzeW5jKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIHZvaWQgc3ltX2Rpc3BsYXlfU3ltYmlvc19udnJhbShzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIFN5bWJpb3NfbnZyYW0gKm52cmFtKSB7ICh2b2lkKW5wOyAodm9pZCludnJhbTsgfQorc3RhdGljIHZvaWQgc3ltX2Rpc3BsYXlfVGVrcmFtX252cmFtKHN0cnVjdCBzeW1fZGV2aWNlICpucCwgVGVrcmFtX252cmFtICpudnJhbSkgeyAodm9pZClucDsgKHZvaWQpbnZyYW07IH0KKyNlbmRpZgkvKiBTWU1fQ09ORl9ERUJVR19OVlJBTSAqLworCisKKy8qCisgKiAgMjRDMTYgRUVQUk9NIHJlYWRpbmcuCisgKgorICogIEdQT0kwIC0gZGF0YSBpbi9kYXRhIG91dAorICogIEdQSU8xIC0gY2xvY2sKKyAqICBTeW1iaW9zIE5WUkFNIHdpcmluZyBub3cgYWxzbyB1c2VkIGJ5IFRla3JhbS4KKyAqLworCisjZGVmaW5lIFNFVF9CSVQgMAorI2RlZmluZSBDTFJfQklUIDEKKyNkZWZpbmUgU0VUX0NMSyAyCisjZGVmaW5lIENMUl9DTEsgMworCisvKgorICogIFNldC9jbGVhciBkYXRhL2Nsb2NrIGJpdCBpbiBHUElPMAorICovCitzdGF0aWMgdm9pZCBTMjRDMTZfc2V0X2JpdChzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIHVfY2hhciB3cml0ZV9iaXQsIHVfY2hhciAqZ3ByZWcsIAorCQkJICBpbnQgYml0X21vZGUpCit7CisJdWRlbGF5KDUpOworCXN3aXRjaCAoYml0X21vZGUpIHsKKwljYXNlIFNFVF9CSVQ6CisJCSpncHJlZyB8PSB3cml0ZV9iaXQ7CisJCWJyZWFrOworCWNhc2UgQ0xSX0JJVDoKKwkJKmdwcmVnICY9IDB4ZmU7CisJCWJyZWFrOworCWNhc2UgU0VUX0NMSzoKKwkJKmdwcmVnIHw9IDB4MDI7CisJCWJyZWFrOworCWNhc2UgQ0xSX0NMSzoKKwkJKmdwcmVnICY9IDB4ZmQ7CisJCWJyZWFrOworCisJfQorCU9VVEIobnAsIG5jX2dwcmVnLCAqZ3ByZWcpOworCXVkZWxheSg1KTsKK30KKworLyoKKyAqICBTZW5kIFNUQVJUIGNvbmRpdGlvbiB0byBOVlJBTSB0byB3YWtlIGl0IHVwLgorICovCitzdGF0aWMgdm9pZCBTMjRDMTZfc3RhcnQoc3RydWN0IHN5bV9kZXZpY2UgKm5wLCB1X2NoYXIgKmdwcmVnKQoreworCVMyNEMxNl9zZXRfYml0KG5wLCAxLCBncHJlZywgU0VUX0JJVCk7CisJUzI0QzE2X3NldF9iaXQobnAsIDAsIGdwcmVnLCBTRVRfQ0xLKTsKKwlTMjRDMTZfc2V0X2JpdChucCwgMCwgZ3ByZWcsIENMUl9CSVQpOworCVMyNEMxNl9zZXRfYml0KG5wLCAwLCBncHJlZywgQ0xSX0NMSyk7Cit9CisKKy8qCisgKiAgU2VuZCBTVE9QIGNvbmRpdGlvbiB0byBOVlJBTSAtIHB1dHMgTlZSQU0gdG8gc2xlZXAuLi4gWlp6enp6ISEKKyAqLworc3RhdGljIHZvaWQgUzI0QzE2X3N0b3Aoc3RydWN0IHN5bV9kZXZpY2UgKm5wLCB1X2NoYXIgKmdwcmVnKQoreworCVMyNEMxNl9zZXRfYml0KG5wLCAwLCBncHJlZywgU0VUX0NMSyk7CisJUzI0QzE2X3NldF9iaXQobnAsIDEsIGdwcmVnLCBTRVRfQklUKTsKK30KKworLyoKKyAqICBSZWFkIG9yIHdyaXRlIGEgYml0IHRvIHRoZSBOVlJBTSwKKyAqICByZWFkIGlmIEdQSU8wIGlucHV0IGVsc2Ugd3JpdGUgaWYgR1BJTzAgb3V0cHV0CisgKi8KK3N0YXRpYyB2b2lkIFMyNEMxNl9kb19iaXQoc3RydWN0IHN5bV9kZXZpY2UgKm5wLCB1X2NoYXIgKnJlYWRfYml0LCB1X2NoYXIgd3JpdGVfYml0LCAKKwkJCSB1X2NoYXIgKmdwcmVnKQoreworCVMyNEMxNl9zZXRfYml0KG5wLCB3cml0ZV9iaXQsIGdwcmVnLCBTRVRfQklUKTsKKwlTMjRDMTZfc2V0X2JpdChucCwgMCwgZ3ByZWcsIFNFVF9DTEspOworCWlmIChyZWFkX2JpdCkKKwkJKnJlYWRfYml0ID0gSU5CKG5wLCBuY19ncHJlZyk7CisJUzI0QzE2X3NldF9iaXQobnAsIDAsIGdwcmVnLCBDTFJfQ0xLKTsKKwlTMjRDMTZfc2V0X2JpdChucCwgMCwgZ3ByZWcsIENMUl9CSVQpOworfQorCisvKgorICogIE91dHB1dCBhbiBBQ0sgdG8gdGhlIE5WUkFNIGFmdGVyIHJlYWRpbmcsCisgKiAgY2hhbmdlIEdQSU8wIHRvIG91dHB1dCBhbmQgd2hlbiBkb25lIGJhY2sgdG8gYW4gaW5wdXQKKyAqLworc3RhdGljIHZvaWQgUzI0QzE2X3dyaXRlX2FjayhzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIHVfY2hhciB3cml0ZV9iaXQsIHVfY2hhciAqZ3ByZWcsIAorCQkJICAgIHVfY2hhciAqZ3BjbnRsKQoreworCU9VVEIobnAsIG5jX2dwY250bCwgKmdwY250bCAmIDB4ZmUpOworCVMyNEMxNl9kb19iaXQobnAsIE5VTEwsIHdyaXRlX2JpdCwgZ3ByZWcpOworCU9VVEIobnAsIG5jX2dwY250bCwgKmdwY250bCk7Cit9CisKKy8qCisgKiAgSW5wdXQgYW4gQUNLIGZyb20gTlZSQU0gYWZ0ZXIgd3JpdGluZywKKyAqICBjaGFuZ2UgR1BJTzAgdG8gaW5wdXQgYW5kIHdoZW4gZG9uZSBiYWNrIHRvIGFuIG91dHB1dAorICovCitzdGF0aWMgdm9pZCBTMjRDMTZfcmVhZF9hY2soc3RydWN0IHN5bV9kZXZpY2UgKm5wLCB1X2NoYXIgKnJlYWRfYml0LCB1X2NoYXIgKmdwcmVnLCAKKwkJCSAgIHVfY2hhciAqZ3BjbnRsKQoreworCU9VVEIobnAsIG5jX2dwY250bCwgKmdwY250bCB8IDB4MDEpOworCVMyNEMxNl9kb19iaXQobnAsIHJlYWRfYml0LCAxLCBncHJlZyk7CisJT1VUQihucCwgbmNfZ3BjbnRsLCAqZ3BjbnRsKTsKK30KKworLyoKKyAqICBXUklURSBhIGJ5dGUgdG8gdGhlIE5WUkFNIGFuZCB0aGVuIGdldCBhbiBBQ0sgdG8gc2VlIGl0IHdhcyBhY2NlcHRlZCBPSywKKyAqICBHUElPMCBtdXN0IGFscmVhZHkgYmUgc2V0IGFzIGFuIG91dHB1dAorICovCitzdGF0aWMgdm9pZCBTMjRDMTZfd3JpdGVfYnl0ZShzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIHVfY2hhciAqYWNrX2RhdGEsIHVfY2hhciB3cml0ZV9kYXRhLCAKKwkJCSAgICAgdV9jaGFyICpncHJlZywgdV9jaGFyICpncGNudGwpCit7CisJaW50IHg7CisJCisJZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKwkJUzI0QzE2X2RvX2JpdChucCwgTlVMTCwgKHdyaXRlX2RhdGEgPj4gKDcgLSB4KSkgJiAweDAxLCBncHJlZyk7CisJCQorCVMyNEMxNl9yZWFkX2FjayhucCwgYWNrX2RhdGEsIGdwcmVnLCBncGNudGwpOworfQorCisvKgorICogIFJFQUQgYSBieXRlIGZyb20gdGhlIE5WUkFNIGFuZCB0aGVuIHNlbmQgYW4gQUNLIHRvIHNheSB3ZSBoYXZlIGdvdCBpdCwKKyAqICBHUElPMCBtdXN0IGFscmVhZHkgYmUgc2V0IGFzIGFuIGlucHV0CisgKi8KK3N0YXRpYyB2b2lkIFMyNEMxNl9yZWFkX2J5dGUoc3RydWN0IHN5bV9kZXZpY2UgKm5wLCB1X2NoYXIgKnJlYWRfZGF0YSwgdV9jaGFyIGFja19kYXRhLCAKKwkJCSAgICB1X2NoYXIgKmdwcmVnLCB1X2NoYXIgKmdwY250bCkKK3sKKwlpbnQgeDsKKwl1X2NoYXIgcmVhZF9iaXQ7CisKKwkqcmVhZF9kYXRhID0gMDsKKwlmb3IgKHggPSAwOyB4IDwgODsgeCsrKSB7CisJCVMyNEMxNl9kb19iaXQobnAsICZyZWFkX2JpdCwgMSwgZ3ByZWcpOworCQkqcmVhZF9kYXRhIHw9ICgocmVhZF9iaXQgJiAweDAxKSA8PCAoNyAtIHgpKTsKKwl9CisKKwlTMjRDMTZfd3JpdGVfYWNrKG5wLCBhY2tfZGF0YSwgZ3ByZWcsIGdwY250bCk7Cit9CisKKyNpZiBTWU1fQ09ORl9OVlJBTV9XUklURV9TVVBQT1JUCisvKgorICogIFdyaXRlICdsZW4nIGJ5dGVzIHN0YXJ0aW5nIGF0ICdvZmZzZXQnLgorICovCitzdGF0aWMgaW50IHN5bV93cml0ZV9TMjRDMTZfbnZyYW0oc3RydWN0IHN5bV9kZXZpY2UgKm5wLCBpbnQgb2Zmc2V0LAorCQl1X2NoYXIgKmRhdGEsIGludCBsZW4pCit7CisJdV9jaGFyCWdwY250bCwgZ3ByZWc7CisJdV9jaGFyCW9sZF9ncGNudGwsIG9sZF9ncHJlZzsKKwl1X2NoYXIJYWNrX2RhdGE7CisJaW50CXg7CisKKwkvKiBzYXZlIGN1cnJlbnQgc3RhdGUgb2YgR1BDTlRMIGFuZCBHUFJFRyAqLworCW9sZF9ncHJlZwk9IElOQihucCwgbmNfZ3ByZWcpOworCW9sZF9ncGNudGwJPSBJTkIobnAsIG5jX2dwY250bCk7CisJZ3BjbnRsCQk9IG9sZF9ncGNudGwgJiAweDFjOworCisJLyogc2V0IHVwIEdQUkVHICYgR1BDTlRMIHRvIHNldCBHUElPMCBhbmQgR1BJTzEgaW4gdG8ga25vd24gc3RhdGUgKi8KKwlPVVRCKG5wLCBuY19ncHJlZywgIG9sZF9ncHJlZyk7CisJT1VUQihucCwgbmNfZ3BjbnRsLCBncGNudGwpOworCisJLyogdGhpcyBpcyB0byBzZXQgTlZSQU0gaW50byBhIGtub3duIHN0YXRlIHdpdGggR1BJTzAvMSBib3RoIGxvdyAqLworCWdwcmVnID0gb2xkX2dwcmVnOworCVMyNEMxNl9zZXRfYml0KG5wLCAwLCAmZ3ByZWcsIENMUl9DTEspOworCVMyNEMxNl9zZXRfYml0KG5wLCAwLCAmZ3ByZWcsIENMUl9CSVQpOworCQkKKwkvKiBub3cgc2V0IE5WUkFNIGluYWN0aXZlIHdpdGggR1BJTzAvMSBib3RoIGhpZ2ggKi8KKwlTMjRDMTZfc3RvcChucCwgJmdwcmVnKTsKKworCS8qIE5WUkFNIGhhcyB0byBiZSB3cml0dGVuIGluIHNlZ21lbnRzIG9mIDE2IGJ5dGVzICovCisJZm9yICh4ID0gMDsgeCA8IGxlbiA7IHggKz0gMTYpIHsKKwkJZG8geworCQkJUzI0QzE2X3N0YXJ0KG5wLCAmZ3ByZWcpOworCQkJUzI0QzE2X3dyaXRlX2J5dGUobnAsICZhY2tfZGF0YSwKKwkJCQkJICAweGEwIHwgKCgob2Zmc2V0K3gpID4+IDcpICYgMHgwZSksCisJCQkJCSAgJmdwcmVnLCAmZ3BjbnRsKTsKKwkJfSB3aGlsZSAoYWNrX2RhdGEgJiAweDAxKTsKKworCQlTMjRDMTZfd3JpdGVfYnl0ZShucCwgJmFja19kYXRhLCAob2Zmc2V0K3gpICYgMHhmZiwgCisJCQkJICAmZ3ByZWcsICZncGNudGwpOworCisJCWZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKQorCQkJUzI0QzE2X3dyaXRlX2J5dGUobnAsICZhY2tfZGF0YSwgZGF0YVt4K3ldLCAKKwkJCQkJICAmZ3ByZWcsICZncGNudGwpOworCQlTMjRDMTZfc3RvcChucCwgJmdwcmVnKTsKKwl9CisKKwkvKiByZXR1cm4gR1BJTzAvMSB0byBvcmlnaW5hbCBzdGF0ZXMgYWZ0ZXIgaGF2aW5nIGFjY2Vzc2VkIE5WUkFNICovCisJT1VUQihucCwgbmNfZ3BjbnRsLCBvbGRfZ3BjbnRsKTsKKwlPVVRCKG5wLCBuY19ncHJlZywgIG9sZF9ncHJlZyk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBTWU1fQ09ORl9OVlJBTV9XUklURV9TVVBQT1JUICovCisKKy8qCisgKiAgUmVhZCAnbGVuJyBieXRlcyBzdGFydGluZyBhdCAnb2Zmc2V0Jy4KKyAqLworc3RhdGljIGludCBzeW1fcmVhZF9TMjRDMTZfbnZyYW0oc3RydWN0IHN5bV9kZXZpY2UgKm5wLCBpbnQgb2Zmc2V0LCB1X2NoYXIgKmRhdGEsIGludCBsZW4pCit7CisJdV9jaGFyCWdwY250bCwgZ3ByZWc7CisJdV9jaGFyCW9sZF9ncGNudGwsIG9sZF9ncHJlZzsKKwl1X2NoYXIJYWNrX2RhdGE7CisJaW50CXJldHYgPSAxOworCWludAl4OworCisJLyogc2F2ZSBjdXJyZW50IHN0YXRlIG9mIEdQQ05UTCBhbmQgR1BSRUcgKi8KKwlvbGRfZ3ByZWcJPSBJTkIobnAsIG5jX2dwcmVnKTsKKwlvbGRfZ3BjbnRsCT0gSU5CKG5wLCBuY19ncGNudGwpOworCWdwY250bAkJPSBvbGRfZ3BjbnRsICYgMHgxYzsKKworCS8qIHNldCB1cCBHUFJFRyAmIEdQQ05UTCB0byBzZXQgR1BJTzAgYW5kIEdQSU8xIGluIHRvIGtub3duIHN0YXRlICovCisJT1VUQihucCwgbmNfZ3ByZWcsICBvbGRfZ3ByZWcpOworCU9VVEIobnAsIG5jX2dwY250bCwgZ3BjbnRsKTsKKworCS8qIHRoaXMgaXMgdG8gc2V0IE5WUkFNIGludG8gYSBrbm93biBzdGF0ZSB3aXRoIEdQSU8wLzEgYm90aCBsb3cgKi8KKwlncHJlZyA9IG9sZF9ncHJlZzsKKwlTMjRDMTZfc2V0X2JpdChucCwgMCwgJmdwcmVnLCBDTFJfQ0xLKTsKKwlTMjRDMTZfc2V0X2JpdChucCwgMCwgJmdwcmVnLCBDTFJfQklUKTsKKwkJCisJLyogbm93IHNldCBOVlJBTSBpbmFjdGl2ZSB3aXRoIEdQSU8wLzEgYm90aCBoaWdoICovCisJUzI0QzE2X3N0b3AobnAsICZncHJlZyk7CisJCisJLyogYWN0aXZhdGUgTlZSQU0gKi8KKwlTMjRDMTZfc3RhcnQobnAsICZncHJlZyk7CisKKwkvKiB3cml0ZSBkZXZpY2UgY29kZSBhbmQgcmFuZG9tIGFkZHJlc3MgTVNCICovCisJUzI0QzE2X3dyaXRlX2J5dGUobnAsICZhY2tfZGF0YSwKKwkJMHhhMCB8ICgob2Zmc2V0ID4+IDcpICYgMHgwZSksICZncHJlZywgJmdwY250bCk7CisJaWYgKGFja19kYXRhICYgMHgwMSkKKwkJZ290byBvdXQ7CisKKwkvKiB3cml0ZSByYW5kb20gYWRkcmVzcyBMU0IgKi8KKwlTMjRDMTZfd3JpdGVfYnl0ZShucCwgJmFja19kYXRhLAorCQlvZmZzZXQgJiAweGZmLCAmZ3ByZWcsICZncGNudGwpOworCWlmIChhY2tfZGF0YSAmIDB4MDEpCisJCWdvdG8gb3V0OworCisJLyogcmVnZW5lcmF0ZSBTVEFSVCBzdGF0ZSB0byBzZXQgdXAgZm9yIHJlYWRpbmcgKi8KKwlTMjRDMTZfc3RhcnQobnAsICZncHJlZyk7CisJCisJLyogcmV3cml0ZSBkZXZpY2UgY29kZSBhbmQgYWRkcmVzcyBNU0Igd2l0aCByZWFkIGJpdCBzZXQgKGxzYiA9IDB4MDEpICovCisJUzI0QzE2X3dyaXRlX2J5dGUobnAsICZhY2tfZGF0YSwKKwkJMHhhMSB8ICgob2Zmc2V0ID4+IDcpICYgMHgwZSksICZncHJlZywgJmdwY250bCk7CisJaWYgKGFja19kYXRhICYgMHgwMSkKKwkJZ290byBvdXQ7CisKKwkvKiBub3cgc2V0IHVwIEdQSU8wIGZvciBpbnB1dHRpbmcgZGF0YSAqLworCWdwY250bCB8PSAweDAxOworCU9VVEIobnAsIG5jX2dwY250bCwgZ3BjbnRsKTsKKwkJCisJLyogaW5wdXQgYWxsIHJlcXVlc3RlZCBkYXRhIC0gb25seSBwYXJ0IG9mIHRvdGFsIE5WUkFNICovCisJZm9yICh4ID0gMDsgeCA8IGxlbjsgeCsrKSAKKwkJUzI0QzE2X3JlYWRfYnl0ZShucCwgJmRhdGFbeF0sICh4ID09IChsZW4tMSkpLCAmZ3ByZWcsICZncGNudGwpOworCisJLyogZmluYWxseSBwdXQgTlZSQU0gYmFjayBpbiBpbmFjdGl2ZSBtb2RlICovCisJZ3BjbnRsICY9IDB4ZmU7CisJT1VUQihucCwgbmNfZ3BjbnRsLCBncGNudGwpOworCVMyNEMxNl9zdG9wKG5wLCAmZ3ByZWcpOworCXJldHYgPSAwOworb3V0OgorCS8qIHJldHVybiBHUElPMC8xIHRvIG9yaWdpbmFsIHN0YXRlcyBhZnRlciBoYXZpbmcgYWNjZXNzZWQgTlZSQU0gKi8KKwlPVVRCKG5wLCBuY19ncGNudGwsIG9sZF9ncGNudGwpOworCU9VVEIobnAsIG5jX2dwcmVnLCAgb2xkX2dwcmVnKTsKKworCXJldHVybiByZXR2OworfQorCisjdW5kZWYgU0VUX0JJVAorI3VuZGVmIENMUl9CSVQKKyN1bmRlZiBTRVRfQ0xLCisjdW5kZWYgQ0xSX0NMSworCisvKgorICogIFRyeSByZWFkaW5nIFN5bWJpb3MgTlZSQU0uCisgKiAgUmV0dXJuIDAgaWYgT0suCisgKi8KK3N0YXRpYyBpbnQgc3ltX3JlYWRfU3ltYmlvc19udnJhbShzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIFN5bWJpb3NfbnZyYW0gKm52cmFtKQoreworCXN0YXRpYyB1X2NoYXIgU3ltYmlvc190cmFpbGVyWzZdID0gezB4ZmUsIDB4ZmUsIDAsIDAsIDAsIDB9OworCXVfY2hhciAqZGF0YSA9ICh1X2NoYXIgKikgbnZyYW07CisJaW50IGxlbiAgPSBzaXplb2YoKm52cmFtKTsKKwl1X3Nob3J0CWNzdW07CisJaW50IHg7CisKKwkvKiBwcm9iZSB0aGUgMjRjMTYgYW5kIHJlYWQgdGhlIFNZTUJJT1MgMjRjMTYgYXJlYSAqLworCWlmIChzeW1fcmVhZF9TMjRDMTZfbnZyYW0gKG5wLCBTWU1CSU9TX05WUkFNX0FERFJFU1MsIGRhdGEsIGxlbikpCisJCXJldHVybiAxOworCisJLyogY2hlY2sgdmFsaWQgTlZSQU0gc2lnbmF0dXJlLCB2ZXJpZnkgYnl0ZSBjb3VudCBhbmQgY2hlY2tzdW0gKi8KKwlpZiAobnZyYW0tPnR5cGUgIT0gMCB8fAorCSAgICBtZW1jbXAobnZyYW0tPnRyYWlsZXIsIFN5bWJpb3NfdHJhaWxlciwgNikgfHwKKwkgICAgbnZyYW0tPmJ5dGVfY291bnQgIT0gbGVuIC0gMTIpCisJCXJldHVybiAxOworCisJLyogdmVyaWZ5IGNoZWNrc3VtICovCisJZm9yICh4ID0gNiwgY3N1bSA9IDA7IHggPCBsZW4gLSA2OyB4KyspCisJCWNzdW0gKz0gZGF0YVt4XTsKKwlpZiAoY3N1bSAhPSBudnJhbS0+Y2hlY2tzdW0pCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgOTNDNDYgRUVQUk9NIHJlYWRpbmcuCisgKgorICogIEdQT0kwIC0gZGF0YSBpbgorICogIEdQSU8xIC0gZGF0YSBvdXQKKyAqICBHUElPMiAtIGNsb2NrCisgKiAgR1BJTzQgLSBjaGlwIHNlbGVjdAorICoKKyAqICBVc2VkIGJ5IFRla3JhbS4KKyAqLworCisvKgorICogIFB1bHNlIGNsb2NrIGJpdCBpbiBHUElPMAorICovCitzdGF0aWMgdm9pZCBUOTNDNDZfQ2xrKHN0cnVjdCBzeW1fZGV2aWNlICpucCwgdV9jaGFyICpncHJlZykKK3sKKwlPVVRCKG5wLCBuY19ncHJlZywgKmdwcmVnIHwgMHgwNCk7CisJdWRlbGF5KDIpOworCU9VVEIobnAsIG5jX2dwcmVnLCAqZ3ByZWcpOworfQorCisvKiAKKyAqICBSZWFkIGJpdCBmcm9tIE5WUkFNCisgKi8KK3N0YXRpYyB2b2lkIFQ5M0M0Nl9SZWFkX0JpdChzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIHVfY2hhciAqcmVhZF9iaXQsIHVfY2hhciAqZ3ByZWcpCit7CisJdWRlbGF5KDIpOworCVQ5M0M0Nl9DbGsobnAsIGdwcmVnKTsKKwkqcmVhZF9iaXQgPSBJTkIobnAsIG5jX2dwcmVnKTsKK30KKworLyoKKyAqICBXcml0ZSBiaXQgdG8gR1BJTzAKKyAqLworc3RhdGljIHZvaWQgVDkzQzQ2X1dyaXRlX0JpdChzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIHVfY2hhciB3cml0ZV9iaXQsIHVfY2hhciAqZ3ByZWcpCit7CisJaWYgKHdyaXRlX2JpdCAmIDB4MDEpCisJCSpncHJlZyB8PSAweDAyOworCWVsc2UKKwkJKmdwcmVnICY9IDB4ZmQ7CisJCQorCSpncHJlZyB8PSAweDEwOworCQkKKwlPVVRCKG5wLCBuY19ncHJlZywgKmdwcmVnKTsKKwl1ZGVsYXkoMik7CisKKwlUOTNDNDZfQ2xrKG5wLCBncHJlZyk7Cit9CisKKy8qCisgKiAgU2VuZCBTVE9QIGNvbmRpdGlvbiB0byBOVlJBTSAtIHB1dHMgTlZSQU0gdG8gc2xlZXAuLi4gWlpaenp6ISEKKyAqLworc3RhdGljIHZvaWQgVDkzQzQ2X1N0b3Aoc3RydWN0IHN5bV9kZXZpY2UgKm5wLCB1X2NoYXIgKmdwcmVnKQoreworCSpncHJlZyAmPSAweGVmOworCU9VVEIobnAsIG5jX2dwcmVnLCAqZ3ByZWcpOworCXVkZWxheSgyKTsKKworCVQ5M0M0Nl9DbGsobnAsIGdwcmVnKTsKK30KKworLyoKKyAqICBTZW5kIHJlYWQgY29tbWFuZCBhbmQgYWRkcmVzcyB0byBOVlJBTQorICovCitzdGF0aWMgdm9pZCBUOTNDNDZfU2VuZF9Db21tYW5kKHN0cnVjdCBzeW1fZGV2aWNlICpucCwgdV9zaG9ydCB3cml0ZV9kYXRhLCAKKwkJCQl1X2NoYXIgKnJlYWRfYml0LCB1X2NoYXIgKmdwcmVnKQoreworCWludCB4OworCisJLyogc2VuZCA5IGJpdHMsIHN0YXJ0IGJpdCAoMSksIGNvbW1hbmQgKDIpLCBhZGRyZXNzICg2KSAgKi8KKwlmb3IgKHggPSAwOyB4IDwgOTsgeCsrKQorCQlUOTNDNDZfV3JpdGVfQml0KG5wLCAodV9jaGFyKSAod3JpdGVfZGF0YSA+PiAoOCAtIHgpKSwgZ3ByZWcpOworCisJKnJlYWRfYml0ID0gSU5CKG5wLCBuY19ncHJlZyk7Cit9CisKKy8qCisgKiAgUkVBRCAyIGJ5dGVzIGZyb20gdGhlIE5WUkFNCisgKi8KK3N0YXRpYyB2b2lkIFQ5M0M0Nl9SZWFkX1dvcmQoc3RydWN0IHN5bV9kZXZpY2UgKm5wLAorCQl1bnNpZ25lZCBzaG9ydCAqbnZyYW1fZGF0YSwgdW5zaWduZWQgY2hhciAqZ3ByZWcpCit7CisJaW50IHg7CisJdV9jaGFyIHJlYWRfYml0OworCisJKm52cmFtX2RhdGEgPSAwOworCWZvciAoeCA9IDA7IHggPCAxNjsgeCsrKSB7CisJCVQ5M0M0Nl9SZWFkX0JpdChucCwgJnJlYWRfYml0LCBncHJlZyk7CisKKwkJaWYgKHJlYWRfYml0ICYgMHgwMSkKKwkJCSpudnJhbV9kYXRhIHw9ICAoMHgwMSA8PCAoMTUgLSB4KSk7CisJCWVsc2UKKwkJCSpudnJhbV9kYXRhICY9IH4oMHgwMSA8PCAoMTUgLSB4KSk7CisJfQorfQorCisvKgorICogIFJlYWQgVGVrcmFtIE52UkFNIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQgVDkzQzQ2X1JlYWRfRGF0YShzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIHVuc2lnbmVkIHNob3J0ICpkYXRhLAorCQlpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpncHJlZykKK3sKKwlpbnQgeDsKKworCWZvciAoeCA9IDA7IHggPCBsZW47IHgrKykgIHsKKwkJdW5zaWduZWQgY2hhciByZWFkX2JpdDsKKwkJLyogb3V0cHV0IHJlYWQgY29tbWFuZCBhbmQgYWRkcmVzcyAqLworCQlUOTNDNDZfU2VuZF9Db21tYW5kKG5wLCAweDE4MCB8IHgsICZyZWFkX2JpdCwgZ3ByZWcpOworCQlpZiAocmVhZF9iaXQgJiAweDAxKQorCQkJcmV0dXJuIDE7IC8qIEJhZCAqLworCQlUOTNDNDZfUmVhZF9Xb3JkKG5wLCAmZGF0YVt4XSwgZ3ByZWcpOworCQlUOTNDNDZfU3RvcChucCwgZ3ByZWcpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogIFRyeSByZWFkaW5nIDkzQzQ2IFRla3JhbSBOVlJBTS4KKyAqLworc3RhdGljIGludCBzeW1fcmVhZF9UOTNDNDZfbnZyYW0oc3RydWN0IHN5bV9kZXZpY2UgKm5wLCBUZWtyYW1fbnZyYW0gKm52cmFtKQoreworCXVfY2hhciBncGNudGwsIGdwcmVnOworCXVfY2hhciBvbGRfZ3BjbnRsLCBvbGRfZ3ByZWc7CisJaW50IHJldHYgPSAxOworCisJLyogc2F2ZSBjdXJyZW50IHN0YXRlIG9mIEdQQ05UTCBhbmQgR1BSRUcgKi8KKwlvbGRfZ3ByZWcJPSBJTkIobnAsIG5jX2dwcmVnKTsKKwlvbGRfZ3BjbnRsCT0gSU5CKG5wLCBuY19ncGNudGwpOworCisJLyogc2V0IHVwIEdQUkVHICYgR1BDTlRMIHRvIHNldCBHUElPMC8xLzIvNCBpbiB0byBrbm93biBzdGF0ZSwgMCBpbiwKKwkgICAxLzIvNCBvdXQgKi8KKwlncHJlZyA9IG9sZF9ncHJlZyAmIDB4ZTk7CisJT1VUQihucCwgbmNfZ3ByZWcsIGdwcmVnKTsKKwlncGNudGwgPSAob2xkX2dwY250bCAmIDB4ZTkpIHwgMHgwOTsKKwlPVVRCKG5wLCBuY19ncGNudGwsIGdwY250bCk7CisKKwkvKiBpbnB1dCBhbGwgb2YgTlZSQU0sIDY0IHdvcmRzICovCisJcmV0diA9IFQ5M0M0Nl9SZWFkX0RhdGEobnAsICh1X3Nob3J0ICopIG52cmFtLAorCQkJCXNpemVvZigqbnZyYW0pIC8gc2l6ZW9mKHNob3J0KSwgJmdwcmVnKTsKKwkKKwkvKiByZXR1cm4gR1BJTzAvMS8yLzQgdG8gb3JpZ2luYWwgc3RhdGVzIGFmdGVyIGhhdmluZyBhY2Nlc3NlZCBOVlJBTSAqLworCU9VVEIobnAsIG5jX2dwY250bCwgb2xkX2dwY250bCk7CisJT1VUQihucCwgbmNfZ3ByZWcsICBvbGRfZ3ByZWcpOworCisJcmV0dXJuIHJldHY7Cit9CisKKy8qCisgKiAgVHJ5IHJlYWRpbmcgVGVrcmFtIE5WUkFNLgorICogIFJldHVybiAwIGlmIE9LLgorICovCitzdGF0aWMgaW50IHN5bV9yZWFkX1Rla3JhbV9udnJhbSAoc3RydWN0IHN5bV9kZXZpY2UgKm5wLCBUZWtyYW1fbnZyYW0gKm52cmFtKQoreworCXVfY2hhciAqZGF0YSA9ICh1X2NoYXIgKikgbnZyYW07CisJaW50IGxlbiA9IHNpemVvZigqbnZyYW0pOworCXVfc2hvcnQJY3N1bTsKKwlpbnQgeDsKKworCXN3aXRjaCAobnAtPmRldmljZV9pZCkgeworCWNhc2UgUENJX0RFVklDRV9JRF9OQ1JfNTNDODg1OgorCWNhc2UgUENJX0RFVklDRV9JRF9OQ1JfNTNDODk1OgorCWNhc2UgUENJX0RFVklDRV9JRF9OQ1JfNTNDODk2OgorCQl4ID0gc3ltX3JlYWRfUzI0QzE2X252cmFtKG5wLCBURUtSQU1fMjRDMTZfTlZSQU1fQUREUkVTUywKKwkJCQkJICBkYXRhLCBsZW4pOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzg3NToKKwkJeCA9IHN5bV9yZWFkX1MyNEMxNl9udnJhbShucCwgVEVLUkFNXzI0QzE2X05WUkFNX0FERFJFU1MsCisJCQkJCSAgZGF0YSwgbGVuKTsKKwkJaWYgKCF4KQorCQkJYnJlYWs7CisJZGVmYXVsdDoKKwkJeCA9IHN5bV9yZWFkX1Q5M0M0Nl9udnJhbShucCwgbnZyYW0pOworCQlicmVhazsKKwl9CisJaWYgKHgpCisJCXJldHVybiAxOworCisJLyogdmVyaWZ5IGNoZWNrc3VtICovCisJZm9yICh4ID0gMCwgY3N1bSA9IDA7IHggPCBsZW4gLSAxOyB4ICs9IDIpCisJCWNzdW0gKz0gZGF0YVt4XSArIChkYXRhW3grMV0gPDwgOCk7CisJaWYgKGNzdW0gIT0gMHgxMjM0KQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BBUklTQworLyoKKyAqIEhvc3QgZmlybXdhcmUgKFBEQykga2VlcHMgYSB0YWJsZSBmb3IgYWx0ZXJpbmcgU0NTSSBjYXBhYmlsaXRpZXMuCisgKiBNYW55IG5ld2VyIG1hY2hpbmVzIGV4cG9ydCBvbmUgY2hhbm5lbCBvZiA1M2M4OTYgY2hpcCBhcyBTRSwgNTAtcGluIEhELgorICogQWxzbyB1c2VkIGZvciBNdWx0aS1pbml0aWF0b3IgU0NTSSBjbHVzdGVycyB0byBzZXQgdGhlIFNDU0kgSW5pdGlhdG9yIElELgorICovCitzdGF0aWMgaW50IHN5bV9yZWFkX3BhcmlzY19wZGMoc3RydWN0IHN5bV9kZXZpY2UgKm5wLCBzdHJ1Y3QgcGRjX2luaXRpYXRvciAqcGRjKQoreworCXN0cnVjdCBoYXJkd2FyZV9wYXRoIGh3cGF0aDsKKwlnZXRfcGNpX25vZGVfcGF0aChucC0+cGRldiwgJmh3cGF0aCk7CisJaWYgKCFwZGNfZ2V0X2luaXRpYXRvcigmaHdwYXRoLCBwZGMpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBTWU1fUEFSSVNDX1BEQzsKK30KKyNlbHNlCitzdGF0aWMgaW50IHN5bV9yZWFkX3BhcmlzY19wZGMoc3RydWN0IHN5bV9kZXZpY2UgKm5wLCBzdHJ1Y3QgcGRjX2luaXRpYXRvciAqeCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogIFRyeSByZWFkaW5nIFN5bWJpb3Mgb3IgVGVrcmFtIE5WUkFNCisgKi8KK2ludCBzeW1fcmVhZF9udnJhbShzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIHN0cnVjdCBzeW1fbnZyYW0gKm52cCkKK3sKKwlpZiAoIXN5bV9yZWFkX1N5bWJpb3NfbnZyYW0obnAsICZudnAtPmRhdGEuU3ltYmlvcykpIHsKKwkJbnZwLT50eXBlID0gU1lNX1NZTUJJT1NfTlZSQU07CisJCXN5bV9kaXNwbGF5X1N5bWJpb3NfbnZyYW0obnAsICZudnAtPmRhdGEuU3ltYmlvcyk7CisJfSBlbHNlIGlmICghc3ltX3JlYWRfVGVrcmFtX252cmFtKG5wLCAmbnZwLT5kYXRhLlRla3JhbSkpIHsKKwkJbnZwLT50eXBlID0gU1lNX1RFS1JBTV9OVlJBTTsKKwkJc3ltX2Rpc3BsYXlfVGVrcmFtX252cmFtKG5wLCAmbnZwLT5kYXRhLlRla3JhbSk7CisJfSBlbHNlIHsKKwkJbnZwLT50eXBlID0gc3ltX3JlYWRfcGFyaXNjX3BkYyhucCwgJm52cC0+ZGF0YS5wYXJpc2MpOworCX0KKwlyZXR1cm4gbnZwLT50eXBlOworfQorCitjaGFyICpzeW1fbnZyYW1fdHlwZShzdHJ1Y3Qgc3ltX252cmFtICpudnApCit7CisJc3dpdGNoIChudnAtPnR5cGUpIHsKKwljYXNlIFNZTV9TWU1CSU9TX05WUkFNOgorCQlyZXR1cm4gIlN5bWJpb3MgTlZSQU0iOworCWNhc2UgU1lNX1RFS1JBTV9OVlJBTToKKwkJcmV0dXJuICJUZWtyYW0gTlZSQU0iOworCWNhc2UgU1lNX1BBUklTQ19QREM6CisJCXJldHVybiAiUEEtUklTQyBGaXJtd2FyZSI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJObyBOVlJBTSI7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9udnJhbS5oIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9udnJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MzhiZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX252cmFtLmgKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBEZXZpY2UgZHJpdmVyIGZvciB0aGUgU1lNQklPUy9MU0lMT0dJQyA1M0M4WFggYW5kIDUzQzEwMTAgZmFtaWx5IAorICogb2YgUENJLVNDU0kgSU8gcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSAgR2VyYXJkIFJvdWRpZXIgPGdyb3VkaWVyQGZyZWUuZnI+CisgKgorICogVGhpcyBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBMaW51eCBzeW01M2M4eHggZHJpdmVyLgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgIEdlcmFyZCBSb3VkaWVyCisgKgorICogVGhlIHN5bTUzYzh4eCBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBuY3I1M2M4eHggZHJpdmVyIHRoYXQgaGFkIGJlZW4gCisgKiBhIHBvcnQgb2YgdGhlIEZyZWVCU0QgbmNyIGRyaXZlciB0byBMaW51eC0xLjIuMTMuCisgKgorICogVGhlIG9yaWdpbmFsIG5jciBkcml2ZXIgaGFzIGJlZW4gd3JpdHRlbiBmb3IgMzg2YnNkIGFuZCBGcmVlQlNEIGJ5CisgKiAgICAgICAgIFdvbGZnYW5nIFN0YW5nbG1laWVyICAgICAgICA8d29sZkBjb2xvZ25lLmRlPgorICogICAgICAgICBTdGVmYW4gRXNzZXIgICAgICAgICAgICAgICAgPHNlQG1pLlVuaS1Lb2Vsbi5kZT4KKyAqIENvcHlyaWdodCAoQykgMTk5NCAgV29sZmdhbmcgU3RhbmdsbWVpZXIKKyAqCisgKiBPdGhlciBtYWpvciBjb250cmlidXRpb25zOgorICoKKyAqIE5WUkFNIGRldGVjdGlvbiBhbmQgcmVhZGluZy4KKyAqIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIFdhbHRoYW0gPGRvcm1vdXNlQGZhcnNyb2J0LmRlbW9uLmNvLnVrPgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBTWU1fTlZSQU1fSAorI2RlZmluZSBTWU1fTlZSQU1fSAorCisjaW5jbHVkZSAic3ltNTNjOHh4LmgiCisKKy8qCisgKglTeW1iaW9zIE5WUkFNIGRhdGEgZm9ybWF0CisgKi8KKyNkZWZpbmUgU1lNQklPU19OVlJBTV9TSVpFIDM2OAorI2RlZmluZSBTWU1CSU9TX05WUkFNX0FERFJFU1MgMHgxMDAKKworc3RydWN0IFN5bWJpb3NfbnZyYW0geworLyogSGVhZGVyIDYgYnl0ZXMgKi8KKwl1X3Nob3J0IHR5cGU7CQkvKiAweDAwMDAgKi8KKwl1X3Nob3J0IGJ5dGVfY291bnQ7CS8qIGV4Y2x1ZGluZyBoZWFkZXIvdHJhaWxlciAqLworCXVfc2hvcnQgY2hlY2tzdW07CisKKy8qIENvbnRyb2xsZXIgc2V0IHVwIDIwIGJ5dGVzICovCisJdV9jaGFyCXZfbWFqb3I7CS8qIDB4MDAgKi8KKwl1X2NoYXIJdl9taW5vcjsJLyogMHgzMCAqLworCXUzMglib290X2NyYzsKKwl1X3Nob3J0CWZsYWdzOworI2RlZmluZSBTWU1CSU9TX1NDQU1fRU5BQkxFCSgxKQorI2RlZmluZSBTWU1CSU9TX1BBUklUWV9FTkFCTEUJKDE8PDEpCisjZGVmaW5lIFNZTUJJT1NfVkVSQk9TRV9NU0dTCSgxPDwyKQorI2RlZmluZSBTWU1CSU9TX0NIU19NQVBQSU5HCSgxPDwzKQorI2RlZmluZSBTWU1CSU9TX05PX05WUkFNCSgxPDwzKQkvKiA/Pz8gKi8KKwl1X3Nob3J0CWZsYWdzMTsKKyNkZWZpbmUgU1lNQklPU19TQ0FOX0hJX0xPCSgxKQorCXVfc2hvcnQJdGVybV9zdGF0ZTsKKyNkZWZpbmUgU1lNQklPU19URVJNX0NBTlRfUFJPR1JBTQkoMCkKKyNkZWZpbmUgU1lNQklPU19URVJNX0VOQUJMRUQJCSgxKQorI2RlZmluZSBTWU1CSU9TX1RFUk1fRElTQUJMRUQJCSgyKQorCXVfc2hvcnQJcm12YmxfZmxhZ3M7CisjZGVmaW5lIFNZTUJJT1NfUk1WQkxfTk9fU1VQUE9SVAkoMCkKKyNkZWZpbmUgU1lNQklPU19STVZCTF9CT09UX0RFVklDRQkoMSkKKyNkZWZpbmUgU1lNQklPU19STVZCTF9NRURJQV9JTlNUQUxMRUQJKDIpCisJdV9jaGFyCWhvc3RfaWQ7CisJdV9jaGFyCW51bV9oYmE7CS8qIDB4MDQgKi8KKwl1X2NoYXIJbnVtX2RldmljZXM7CS8qIDB4MTAgKi8KKwl1X2NoYXIJbWF4X3NjYW1fZGV2aWNlczsJLyogMHgwNCAqLworCXVfY2hhcgludW1fdmFsaWRfc2NhbV9kZXZpY2VzOwkvKiAweDAwICovCisJdV9jaGFyCWZsYWdzMjsKKyNkZWZpbmUgU1lNQklPU19BVk9JRF9CVVNfUkVTRVQJCSgxPDwyKQorCisvKiBCb290IG9yZGVyIDE0IGJ5dGVzICogNCAqLworCXN0cnVjdCBTeW1iaW9zX2hvc3R7CisJCXVfc2hvcnQJdHlwZTsJCS8qIDQ6OHh4IC8gMDpub2sgKi8KKwkJdV9zaG9ydAlkZXZpY2VfaWQ7CS8qIFBDSSBkZXZpY2UgaWQgKi8KKwkJdV9zaG9ydAl2ZW5kb3JfaWQ7CS8qIFBDSSB2ZW5kb3IgaWQgKi8KKwkJdV9jaGFyCWJ1c19ucjsJCS8qIFBDSSBidXMgbnVtYmVyICovCisJCXVfY2hhcglkZXZpY2VfZm47CS8qIFBDSSBkZXZpY2UvZnVuY3Rpb24gbnVtYmVyIDw8IDMqLworCQl1X3Nob3J0CXdvcmQ4OworCQl1X3Nob3J0CWZsYWdzOworI2RlZmluZQlTWU1CSU9TX0lOSVRfU0NBTl9BVF9CT09UCSgxKQorCQl1X3Nob3J0CWlvX3BvcnQ7CS8qIFBDSSBpb19wb3J0IGFkZHJlc3MgKi8KKwl9IGhvc3RbNF07CisKKy8qIFRhcmdldHMgOCBieXRlcyAqIDE2ICovCisJc3RydWN0IFN5bWJpb3NfdGFyZ2V0IHsKKwkJdV9jaGFyCWZsYWdzOworI2RlZmluZSBTWU1CSU9TX0RJU0NPTk5FQ1RfRU5BQkxFCSgxKQorI2RlZmluZSBTWU1CSU9TX1NDQU5fQVRfQk9PVF9USU1FCSgxPDwxKQorI2RlZmluZSBTWU1CSU9TX1NDQU5fTFVOUwkJKDE8PDIpCisjZGVmaW5lIFNZTUJJT1NfUVVFVUVfVEFHU19FTkFCTEVECSgxPDwzKQorCQl1X2NoYXIJcnN2ZDsKKwkJdV9jaGFyCWJ1c193aWR0aDsJLyogMHgwOC8weDEwICovCisJCXVfY2hhcglzeW5jX29mZnNldDsKKwkJdV9zaG9ydAlzeW5jX3BlcmlvZDsJLyogNCpwZXJpb2QgZmFjdG9yICovCisJCXVfc2hvcnQJdGltZW91dDsKKwl9IHRhcmdldFsxNl07CisvKiBTY2FtIHRhYmxlIDggYnl0ZXMgKiA0ICovCisJc3RydWN0IFN5bWJpb3Nfc2NhbSB7CisJCXVfc2hvcnQJaWQ7CisJCXVfc2hvcnQJbWV0aG9kOworI2RlZmluZSBTWU1CSU9TX1NDQU1fREVGQVVMVF9NRVRIT0QJKDApCisjZGVmaW5lIFNZTUJJT1NfU0NBTV9ET05UX0FTU0lHTgkoMSkKKyNkZWZpbmUgU1lNQklPU19TQ0FNX1NFVF9TUEVDSUZJQ19JRAkoMikKKyNkZWZpbmUgU1lNQklPU19TQ0FNX1VTRV9PUkRFUl9HSVZFTgkoMykKKwkJdV9zaG9ydCBzdGF0dXM7CisjZGVmaW5lIFNZTUJJT1NfU0NBTV9VTktOT1dOCQkoMCkKKyNkZWZpbmUgU1lNQklPU19TQ0FNX0RFVklDRV9OT1RfRk9VTkQJKDEpCisjZGVmaW5lIFNZTUJJT1NfU0NBTV9JRF9OT1RfU0VUCQkoMikKKyNkZWZpbmUgU1lNQklPU19TQ0FNX0lEX1ZBTElECQkoMykKKwkJdV9jaGFyCXRhcmdldF9pZDsKKwkJdV9jaGFyCXJzdmQ7CisJfSBzY2FtWzRdOworCisJdV9jaGFyCXNwYXJlX2RldmljZXNbMTUqOF07CisJdV9jaGFyCXRyYWlsZXJbNl07CQkvKiAweGZlIDB4ZmUgMHgwMCAweDAwIDB4MDAgMHgwMCAqLworfTsKK3R5cGVkZWYgc3RydWN0IFN5bWJpb3NfbnZyYW0JU3ltYmlvc19udnJhbTsKK3R5cGVkZWYgc3RydWN0IFN5bWJpb3NfaG9zdAlTeW1iaW9zX2hvc3Q7Cit0eXBlZGVmIHN0cnVjdCBTeW1iaW9zX3RhcmdldAlTeW1iaW9zX3RhcmdldDsKK3R5cGVkZWYgc3RydWN0IFN5bWJpb3Nfc2NhbQlTeW1iaW9zX3NjYW07CisKKy8qCisgKglUZWtyYW0gTnZSQU0gZGF0YSBmb3JtYXQuCisgKi8KKyNkZWZpbmUgVEVLUkFNX05WUkFNX1NJWkUgNjQKKyNkZWZpbmUgVEVLUkFNXzkzQzQ2X05WUkFNX0FERFJFU1MgMAorI2RlZmluZSBURUtSQU1fMjRDMTZfTlZSQU1fQUREUkVTUyAweDQwCisKK3N0cnVjdCBUZWtyYW1fbnZyYW0geworCXN0cnVjdCBUZWtyYW1fdGFyZ2V0IHsKKwkJdV9jaGFyCWZsYWdzOworI2RlZmluZQlURUtSQU1fUEFSSVRZX0NIRUNLCQkoMSkKKyNkZWZpbmUgVEVLUkFNX1NZTkNfTkVHTwkJKDE8PDEpCisjZGVmaW5lIFRFS1JBTV9ESVNDT05ORUNUX0VOQUJMRQkoMTw8MikKKyNkZWZpbmUJVEVLUkFNX1NUQVJUX0NNRAkJKDE8PDMpCisjZGVmaW5lIFRFS1JBTV9UQUdHRURfQ09NTUFORFMJCSgxPDw0KQorI2RlZmluZSBURUtSQU1fV0lERV9ORUdPCQkoMTw8NSkKKwkJdV9jaGFyCXN5bmNfaW5kZXg7CisJCXVfc2hvcnQJd29yZDI7CisJfSB0YXJnZXRbMTZdOworCXVfY2hhcglob3N0X2lkOworCXVfY2hhcglmbGFnczsKKyNkZWZpbmUgVEVLUkFNX01PUkVfVEhBTl8yX0RSSVZFUwkoMSkKKyNkZWZpbmUgVEVLUkFNX0RSSVZFU19TVVBfMUdCCQkoMTw8MSkKKyNkZWZpbmUJVEVLUkFNX1JFU0VUX09OX1BPV0VSX09OCSgxPDwyKQorI2RlZmluZSBURUtSQU1fQUNUSVZFX05FR0FUSU9OCQkoMTw8MykKKyNkZWZpbmUgVEVLUkFNX0lNTUVESUFURV9TRUVLCQkoMTw8NCkKKyNkZWZpbmUJVEVLUkFNX1NDQU5fTFVOUwkJKDE8PDUpCisjZGVmaW5lCVRFS1JBTV9SRU1PVkFCTEVfRkxBR1MJCSgzPDw2KQkvKiAwOiBkaXNhYmxlOyAqLworCQkJCQkJLyogMTogYm9vdCBkZXZpY2U7IDI6YWxsICovCisJdV9jaGFyCWJvb3RfZGVsYXlfaW5kZXg7CisJdV9jaGFyCW1heF90YWdzX2luZGV4OworCXVfc2hvcnQJZmxhZ3MxOworI2RlZmluZSBURUtSQU1fRjJfRjZfRU5BQkxFRAkJKDEpCisJdV9zaG9ydAlzcGFyZVsyOV07Cit9OwordHlwZWRlZiBzdHJ1Y3QgVGVrcmFtX252cmFtCVRla3JhbV9udnJhbTsKK3R5cGVkZWYgc3RydWN0IFRla3JhbV90YXJnZXQJVGVrcmFtX3RhcmdldDsKKworI2lmbmRlZiBDT05GSUdfUEFSSVNDCitzdHJ1Y3QgcGRjX2luaXRpYXRvciB7IGludCBkdW1teTsgfTsKKyNlbmRpZgorCisvKgorICogIFVuaW9uIG9mIHN1cHBvcnRlZCBOVlJBTSBmb3JtYXRzLgorICovCitzdHJ1Y3Qgc3ltX252cmFtIHsKKwlpbnQgdHlwZTsKKyNkZWZpbmUJU1lNX1NZTUJJT1NfTlZSQU0JKDEpCisjZGVmaW5lCVNZTV9URUtSQU1fTlZSQU0JKDIpCisjZGVmaW5lIFNZTV9QQVJJU0NfUERDCQkoMykKKyNpZiBTWU1fQ09ORl9OVlJBTV9TVVBQT1JUCisJdW5pb24geworCQlTeW1iaW9zX252cmFtIFN5bWJpb3M7CisJCVRla3JhbV9udnJhbSBUZWtyYW07CisJCXN0cnVjdCBwZGNfaW5pdGlhdG9yIHBhcmlzYzsKKwl9IGRhdGE7CisjZW5kaWYKK307CisKKyNpZiBTWU1fQ09ORl9OVlJBTV9TVVBQT1JUCit2b2lkIHN5bV9udnJhbV9zZXR1cF9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fbnZyYW0gKm52cmFtKTsKK3ZvaWQgc3ltX252cmFtX3NldHVwX3RhcmdldCAoc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgdGFyZ2V0LCBzdHJ1Y3Qgc3ltX252cmFtICpudnApOworaW50IHN5bV9yZWFkX252cmFtIChzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIHN0cnVjdCBzeW1fbnZyYW0gKm52cCk7CitjaGFyICpzeW1fbnZyYW1fdHlwZShzdHJ1Y3Qgc3ltX252cmFtICpudnApOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeW1fbnZyYW1fc2V0dXBfaG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX252cmFtICpudnJhbSkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgc3ltX252cmFtX3NldHVwX3RhcmdldChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fbnZyYW0gKm52cmFtKSB7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHN5bV9yZWFkX252cmFtKHN0cnVjdCBzeW1fZGV2aWNlICpucCwgc3RydWN0IHN5bV9udnJhbSAqbnZwKQoreworCW52cC0+dHlwZSA9IDA7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGNoYXIgKnN5bV9udnJhbV90eXBlKHN0cnVjdCBzeW1fbnZyYW0gKm52cCkKK3sKKwlyZXR1cm4gIk5vIE5WUkFNIjsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1lNX05WUkFNX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfY29tbS5oIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF9jb21tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBhZTJiMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfY29tbS5oCkBAIC0wLDAgKzEsNzkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiAgSGlnaCBQZXJmb3JtYW5jZSBkZXZpY2UgZHJpdmVyIGZvciB0aGUgU3ltYmlvcyA1M0M4OTYgY29udHJvbGxlci4KKyoqCisqKiAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDEgIEdlcmFyZCBSb3VkaWVyIDxncm91ZGllckBmcmVlLmZyPgorKioKKyoqICBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIGFsbCB0aGUgU3ltYmlvcyA1M0M4WFggY29udHJvbGxlciBmYW1pbHksIAorKiogIGV4Y2VwdCA1M0M4MTAgcmV2aXNpb25zIDwgMTYsIDUzQzgyNSByZXZpc2lvbnMgPCAxNiBhbmQgYWxsIAorKiogIHJldmlzaW9ucyBvZiA1M0M4MTUgY29udHJvbGxlcnMuCisqKgorKiogIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHRoZSBMaW51eCBwb3J0IG9mIHRoZSBGcmVlQlNEIG5jciBkcml2ZXIuCisqKiAKKyoqICBDb3B5cmlnaHQgKEMpIDE5OTQgIFdvbGZnYW5nIFN0YW5nbG1laWVyCisqKiAgCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKiAgCisqKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyoqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoqCisqKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoqCisqKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgVGhlIExpbnV4IHBvcnQgb2YgdGhlIEZyZWVCU0QgbmNyIGRyaXZlciBoYXMgYmVlbiBhY2hpZXZlZCBpbiAKKyoqICBub3ZlbWJlciAxOTk1IGJ5OgorKioKKyoqICAgICAgICAgIEdlcmFyZCBSb3VkaWVyICAgICAgICAgICAgICA8Z3JvdWRpZXJAZnJlZS5mcj4KKyoqCisqKiAgQmVpbmcgZ2l2ZW4gdGhhdCB0aGlzIGRyaXZlciBvcmlnaW5hdGVzIGZyb20gdGhlIEZyZWVCU0QgdmVyc2lvbiwgYW5kCisqKiAgaW4gb3JkZXIgdG8ga2VlcCBzeW5lcmd5IG9uIGJvdGgsIGFueSBzdWdnZXN0ZWQgZW5oYW5jZW1lbnRzIGFuZCBjb3JyZWN0aW9ucworKiogIHJlY2VpdmVkIG9uIExpbnV4IGFyZSBhdXRvbWF0aWNhbGx5IGEgcG90ZW50aWFsIGNhbmRpZGF0ZSBmb3IgdGhlIEZyZWVCU0QgCisqKiAgdmVyc2lvbi4KKyoqCisqKiAgVGhlIG9yaWdpbmFsIGRyaXZlciBoYXMgYmVlbiB3cml0dGVuIGZvciAzODZic2QgYW5kIEZyZWVCU0QgYnkKKyoqICAgICAgICAgIFdvbGZnYW5nIFN0YW5nbG1laWVyICAgICAgICA8d29sZkBjb2xvZ25lLmRlPgorKiogICAgICAgICAgU3RlZmFuIEVzc2VyICAgICAgICAgICAgICAgIDxzZUBtaS5VbmktS29lbG4uZGU+CisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBNYWpvciBjb250cmlidXRpb25zOgorKiogIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIE5WUkFNIGRldGVjdGlvbiBhbmQgcmVhZGluZy4KKyoqICAgIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIFdhbHRoYW0gPGRvcm1vdXNlQGZhcnNyb2J0LmRlbW9uLmNvLnVrPgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCURlYnVnZ2luZyB0YWdzCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjZGVmaW5lIERFQlVHX0FMTE9DICAgICgweDAwMDEpCisjZGVmaW5lIERFQlVHX1BIQVNFICAgICgweDAwMDIpCisjZGVmaW5lIERFQlVHX1FVRVVFICAgICgweDAwMDgpCisjZGVmaW5lIERFQlVHX1JFU1VMVCAgICgweDAwMTApCisjZGVmaW5lIERFQlVHX1BPSU5URVIgICgweDAwMjApCisjZGVmaW5lIERFQlVHX1NDUklQVCAgICgweDAwNDApCisjZGVmaW5lIERFQlVHX1RJTlkgICAgICgweDAwODApCisjZGVmaW5lIERFQlVHX1RJTUlORyAgICgweDAxMDApCisjZGVmaW5lIERFQlVHX05FR08gICAgICgweDAyMDApCisjZGVmaW5lIERFQlVHX1RBR1MgICAgICgweDA0MDApCisjZGVmaW5lIERFQlVHX1NDQVRURVIgICgweDA4MDApCisjZGVmaW5lIERFQlVHX0lDICAgICAgICAoMHgxMDAwKQorCisvKgorKiogICAgRW5hYmxlL0Rpc2FibGUgZGVidWcgbWVzc2FnZXMuCisqKiAgICBDYW4gYmUgY2hhbmdlZCBhdCBydW50aW1lIHRvby4KKyovCisKKyNpZmRlZiBTQ1NJX05DUl9ERUJVR19JTkZPX1NVUFBPUlQKK3N0YXRpYyBpbnQgbmNyX2RlYnVnID0gU0NTSV9OQ1JfREVCVUdfRkxBR1M7CisJI2RlZmluZSBERUJVR19GTEFHUyBuY3JfZGVidWcKKyNlbHNlCisJI2RlZmluZSBERUJVR19GTEFHUwlTQ1NJX05DUl9ERUJVR19GTEFHUworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGxpc3RfaGVhZCAqbmNyX2xpc3RfcG9wKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJaWYgKCFsaXN0X2VtcHR5KGhlYWQpKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW0gPSBoZWFkLT5uZXh0OworCisJCWxpc3RfZGVsKGVsZW0pOworCQlyZXR1cm4gZWxlbTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworI2lmZGVmIF9fc3BhcmNfXworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglTaW1wbGUgcG93ZXIgb2YgdHdvIGJ1ZGR5LWxpa2UgYWxsb2NhdG9yLgorKioKKyoqCVRoaXMgc2ltcGxlIGNvZGUgaXMgbm90IGludGVuZGVkIHRvIGJlIGZhc3QsIGJ1dCB0byAKKyoqCXByb3ZpZGUgcG93ZXIgb2YgMiBhbGlnbmVkIG1lbW9yeSBhbGxvY2F0aW9ucy4KKyoqCVNpbmNlIHRoZSBTQ1JJUFRTIHByb2Nlc3NvciBvbmx5IHN1cHBsaWVzIDggYml0IAorKioJYXJpdGhtZXRpYywgdGhpcyBhbGxvY2F0b3IgYWxsb3dzIHNpbXBsZSBhbmQgZmFzdCAKKyoqCWFkZHJlc3MgY2FsY3VsYXRpb25zICBmcm9tIHRoZSBTQ1JJUFRTIGNvZGUuCisqKglJbiBhZGRpdGlvbiwgY2FjaGUgbGluZSBhbGlnbm1lbnQgaXMgZ3VhcmFudGVlZCBmb3IgCisqKglwb3dlciBvZiAyIGNhY2hlIGxpbmUgc2l6ZS4KKyoqCUVuaGFuY2VkIGluIGxpbnV4LTIuMy40NCB0byBwcm92aWRlIGEgbWVtb3J5IHBvb2wgCisqKglwZXIgcGNpZGV2IHRvIHN1cHBvcnQgZHluYW1pYyBkbWEgbWFwcGluZy4gKEkgd291bGQgCisqKgloYXZlIHByZWZlcnJlZCBhIHJlYWwgYnVzIGFzdHJhY3Rpb24sIGJ0dykuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjZGVmaW5lIE1FTU9fU0hJRlQJNAkvKiAxNiBieXRlcyBtaW5pbXVtIG1lbW9yeSBjaHVuayAqLworI2lmIFBBR0VfU0laRSA+PSA4MTkyCisjZGVmaW5lIE1FTU9fUEFHRV9PUkRFUgkwCS8qIDEgUEFHRSAgbWF4aW11bSAqLworI2Vsc2UKKyNkZWZpbmUgTUVNT19QQUdFX09SREVSCTEJLyogMiBQQUdFUyBtYXhpbXVtICovCisjZW5kaWYKKyNkZWZpbmUgTUVNT19GUkVFX1VOVVNFRAkvKiBGcmVlIHVudXNlZCBwYWdlcyBpbW1lZGlhdGVseSAqLworI2RlZmluZSBNRU1PX1dBUk4JMQorI2RlZmluZSBNRU1PX0dGUF9GTEFHUwlHRlBfQVRPTUlDCisjZGVmaW5lIE1FTU9fQ0xVU1RFUl9TSElGVAkoUEFHRV9TSElGVCtNRU1PX1BBR0VfT1JERVIpCisjZGVmaW5lIE1FTU9fQ0xVU1RFUl9TSVpFCSgxVUwgPDwgTUVNT19DTFVTVEVSX1NISUZUKQorI2RlZmluZSBNRU1PX0NMVVNURVJfTUFTSwkoTUVNT19DTFVTVEVSX1NJWkUtMSkKKwordHlwZWRlZiB1X2xvbmcgbV9hZGRyX3Q7CS8qIEVub3VnaCBiaXRzIHRvIGJpdC1oYWNrIGFkZHJlc3NlcyAqLwordHlwZWRlZiBzdHJ1Y3QgZGV2aWNlICptX2J1c2hfdDsJLyogU29tZXRoaW5nIHRoYXQgYWRkcmVzc2VzIERNQWFibGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbV9saW5rIHsJCS8qIExpbmsgYmV0d2VlbiBmcmVlIG1lbW9yeSBjaHVua3MgKi8KKwlzdHJ1Y3QgbV9saW5rICpuZXh0OworfSBtX2xpbmtfczsKKwordHlwZWRlZiBzdHJ1Y3QgbV92dG9iIHsJCS8qIFZpcnR1YWwgdG8gQnVzIGFkZHJlc3MgdHJhbnNsYXRpb24gKi8KKwlzdHJ1Y3QgbV92dG9iICpuZXh0OworCW1fYWRkcl90IHZhZGRyOworCW1fYWRkcl90IGJhZGRyOworfSBtX3Z0b2JfczsKKyNkZWZpbmUgVlRPQl9IQVNIX1NISUZUCQk1CisjZGVmaW5lIFZUT0JfSEFTSF9TSVpFCQkoMVVMIDw8IFZUT0JfSEFTSF9TSElGVCkKKyNkZWZpbmUgVlRPQl9IQVNIX01BU0sJCShWVE9CX0hBU0hfU0laRS0xKQorI2RlZmluZSBWVE9CX0hBU0hfQ09ERShtKQlcCisJKCgoKG1fYWRkcl90KSAobSkpID4+IE1FTU9fQ0xVU1RFUl9TSElGVCkgJiBWVE9CX0hBU0hfTUFTSykKKwordHlwZWRlZiBzdHJ1Y3QgbV9wb29sIHsJCS8qIE1lbW9yeSBwb29sIG9mIGEgZ2l2ZW4ga2luZCAqLworCW1fYnVzaF90IGJ1c2g7CisJbV9hZGRyX3QgKCpnZXRwKShzdHJ1Y3QgbV9wb29sICopOworCXZvaWQgKCpmcmVlcCkoc3RydWN0IG1fcG9vbCAqLCBtX2FkZHJfdCk7CisJaW50IG51bXA7CisJbV92dG9iX3MgKih2dG9iW1ZUT0JfSEFTSF9TSVpFXSk7CisJc3RydWN0IG1fcG9vbCAqbmV4dDsKKwlzdHJ1Y3QgbV9saW5rIGhbUEFHRV9TSElGVC1NRU1PX1NISUZUK01FTU9fUEFHRV9PUkRFUisxXTsKK30gbV9wb29sX3M7CisKK3N0YXRpYyB2b2lkICpfX19tX2FsbG9jKG1fcG9vbF9zICptcCwgaW50IHNpemUpCit7CisJaW50IGkgPSAwOworCWludCBzID0gKDEgPDwgTUVNT19TSElGVCk7CisJaW50IGo7CisJbV9hZGRyX3QgYTsKKwltX2xpbmtfcyAqaCA9IG1wLT5oOworCisJaWYgKHNpemUgPiAoUEFHRV9TSVpFIDw8IE1FTU9fUEFHRV9PUkRFUikpCisJCXJldHVybiBOVUxMOworCisJd2hpbGUgKHNpemUgPiBzKSB7CisJCXMgPDw9IDE7CisJCSsraTsKKwl9CisKKwlqID0gaTsKKwl3aGlsZSAoIWhbal0ubmV4dCkgeworCQlpZiAocyA9PSAoUEFHRV9TSVpFIDw8IE1FTU9fUEFHRV9PUkRFUikpIHsKKwkJCWhbal0ubmV4dCA9IChtX2xpbmtfcyAqKW1wLT5nZXRwKG1wKTsKKwkJCWlmIChoW2pdLm5leHQpCisJCQkJaFtqXS5uZXh0LT5uZXh0ID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCSsrajsKKwkJcyA8PD0gMTsKKwl9CisJYSA9IChtX2FkZHJfdCkgaFtqXS5uZXh0OworCWlmIChhKSB7CisJCWhbal0ubmV4dCA9IGhbal0ubmV4dC0+bmV4dDsKKwkJd2hpbGUgKGogPiBpKSB7CisJCQlqIC09IDE7CisJCQlzID4+PSAxOworCQkJaFtqXS5uZXh0ID0gKG1fbGlua19zICopIChhK3MpOworCQkJaFtqXS5uZXh0LT5uZXh0ID0gTlVMTDsKKwkJfQorCX0KKyNpZmRlZiBERUJVRworCXByaW50aygiX19fbV9hbGxvYyglZCkgPSAlcFxuIiwgc2l6ZSwgKHZvaWQgKikgYSk7CisjZW5kaWYKKwlyZXR1cm4gKHZvaWQgKikgYTsKK30KKworc3RhdGljIHZvaWQgX19fbV9mcmVlKG1fcG9vbF9zICptcCwgdm9pZCAqcHRyLCBpbnQgc2l6ZSkKK3sKKwlpbnQgaSA9IDA7CisJaW50IHMgPSAoMSA8PCBNRU1PX1NISUZUKTsKKwltX2xpbmtfcyAqcTsKKwltX2FkZHJfdCBhLCBiOworCW1fbGlua19zICpoID0gbXAtPmg7CisKKyNpZmRlZiBERUJVRworCXByaW50aygiX19fbV9mcmVlKCVwLCAlZClcbiIsIHB0ciwgc2l6ZSk7CisjZW5kaWYKKworCWlmIChzaXplID4gKFBBR0VfU0laRSA8PCBNRU1PX1BBR0VfT1JERVIpKQorCQlyZXR1cm47CisKKwl3aGlsZSAoc2l6ZSA+IHMpIHsKKwkJcyA8PD0gMTsKKwkJKytpOworCX0KKworCWEgPSAobV9hZGRyX3QpIHB0cjsKKworCXdoaWxlICgxKSB7CisjaWZkZWYgTUVNT19GUkVFX1VOVVNFRAorCQlpZiAocyA9PSAoUEFHRV9TSVpFIDw8IE1FTU9fUEFHRV9PUkRFUikpIHsKKwkJCW1wLT5mcmVlcChtcCwgYSk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCWIgPSBhIF4gczsKKwkJcSA9ICZoW2ldOworCQl3aGlsZSAocS0+bmV4dCAmJiBxLT5uZXh0ICE9IChtX2xpbmtfcyAqKSBiKSB7CisJCQlxID0gcS0+bmV4dDsKKwkJfQorCQlpZiAoIXEtPm5leHQpIHsKKwkJCSgobV9saW5rX3MgKikgYSktPm5leHQgPSBoW2ldLm5leHQ7CisJCQloW2ldLm5leHQgPSAobV9saW5rX3MgKikgYTsKKwkJCWJyZWFrOworCQl9CisJCXEtPm5leHQgPSBxLT5uZXh0LT5uZXh0OworCQlhID0gYSAmIGI7CisJCXMgPDw9IDE7CisJCSsraTsKKwl9Cit9CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobmNyNTNjOHh4X2xvY2spOworCitzdGF0aWMgdm9pZCAqX19tX2NhbGxvYzIobV9wb29sX3MgKm1wLCBpbnQgc2l6ZSwgY2hhciAqbmFtZSwgaW50IHVmbGFncykKK3sKKwl2b2lkICpwOworCisJcCA9IF9fX21fYWxsb2MobXAsIHNpemUpOworCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfQUxMT0MpCisJCXByaW50ayAoIm5ldyAlLTEwc1slNGRdIEAlcC5cbiIsIG5hbWUsIHNpemUsIHApOworCisJaWYgKHApCisJCW1lbXNldChwLCAwLCBzaXplKTsKKwllbHNlIGlmICh1ZmxhZ3MgJiBNRU1PX1dBUk4pCisJCXByaW50ayAoTkFNRTUzQzhYWCAiOiBmYWlsZWQgdG8gYWxsb2NhdGUgJXNbJWRdXG4iLCBuYW1lLCBzaXplKTsKKworCXJldHVybiBwOworfQorCisjZGVmaW5lIF9fbV9jYWxsb2MobXAsIHMsIG4pCV9fbV9jYWxsb2MyKG1wLCBzLCBuLCBNRU1PX1dBUk4pCisKK3N0YXRpYyB2b2lkIF9fbV9mcmVlKG1fcG9vbF9zICptcCwgdm9pZCAqcHRyLCBpbnQgc2l6ZSwgY2hhciAqbmFtZSkKK3sKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19BTExPQykKKwkJcHJpbnRrICgiZnJlZWluZyAlLTEwc1slNGRdIEAlcC5cbiIsIG5hbWUsIHNpemUsIHB0cik7CisKKwlfX19tX2ZyZWUobXAsIHB0ciwgc2l6ZSk7CisKK30KKworLyoKKyAqIFdpdGggcGNpIGJ1cyBpb21tdSBzdXBwb3J0LCB3ZSB1c2UgYSBkZWZhdWx0IHBvb2wgb2YgdW5tYXBwZWQgbWVtb3J5IAorICogZm9yIG1lbW9yeSB3ZSBkb25ub3QgbmVlZCB0byBETUEgZnJvbS90byBhbmQgb25lIHBvb2wgcGVyIHBjaWRldiBmb3IgCisgKiBtZW1vcnkgYWNjZXNzZWQgYnkgdGhlIFBDSSBjaGlwLiBgbXAwJyBpcyB0aGUgZGVmYXVsdCBub3QgRE1BYWJsZSBwb29sLgorICovCisKK3N0YXRpYyBtX2FkZHJfdCBfX19tcDBfZ2V0cChtX3Bvb2xfcyAqbXApCit7CisJbV9hZGRyX3QgbSA9IF9fZ2V0X2ZyZWVfcGFnZXMoTUVNT19HRlBfRkxBR1MsIE1FTU9fUEFHRV9PUkRFUik7CisJaWYgKG0pCisJCSsrbXAtPm51bXA7CisJcmV0dXJuIG07Cit9CisKK3N0YXRpYyB2b2lkIF9fX21wMF9mcmVlcChtX3Bvb2xfcyAqbXAsIG1fYWRkcl90IG0pCit7CisJZnJlZV9wYWdlcyhtLCBNRU1PX1BBR0VfT1JERVIpOworCS0tbXAtPm51bXA7Cit9CisKK3N0YXRpYyBtX3Bvb2xfcyBtcDAgPSB7TlVMTCwgX19fbXAwX2dldHAsIF9fX21wMF9mcmVlcH07CisKKy8qCisgKiBETUFhYmxlIHBvb2xzLgorICovCisKKy8qCisgKiBXaXRoIHBjaSBidXMgaW9tbXUgc3VwcG9ydCwgd2UgbWFpbnRhaW4gb25lIHBvb2wgcGVyIHBjaWRldiBhbmQgYSAKKyAqIGhhc2hlZCByZXZlcnNlIHRhYmxlIGZvciB2aXJ0dWFsIHRvIGJ1cyBwaHlzaWNhbCBhZGRyZXNzIHRyYW5zbGF0aW9ucy4KKyAqLworc3RhdGljIG1fYWRkcl90IF9fX2RtYV9nZXRwKG1fcG9vbF9zICptcCkKK3sKKwltX2FkZHJfdCB2cDsKKwltX3Z0b2JfcyAqdmJwOworCisJdmJwID0gX19tX2NhbGxvYygmbXAwLCBzaXplb2YoKnZicCksICJWVE9CIik7CisJaWYgKHZicCkgeworCQlkbWFfYWRkcl90IGRhZGRyOworCQl2cCA9IChtX2FkZHJfdCkgZG1hX2FsbG9jX2NvaGVyZW50KG1wLT5idXNoLAorCQkJCQkJUEFHRV9TSVpFPDxNRU1PX1BBR0VfT1JERVIsCisJCQkJCQkmZGFkZHIsIEdGUF9BVE9NSUMpOworCQlpZiAodnApIHsKKwkJCWludCBoYyA9IFZUT0JfSEFTSF9DT0RFKHZwKTsKKwkJCXZicC0+dmFkZHIgPSB2cDsKKwkJCXZicC0+YmFkZHIgPSBkYWRkcjsKKwkJCXZicC0+bmV4dCA9IG1wLT52dG9iW2hjXTsKKwkJCW1wLT52dG9iW2hjXSA9IHZicDsKKwkJCSsrbXAtPm51bXA7CisJCQlyZXR1cm4gdnA7CisJCX0KKwl9CisJaWYgKHZicCkKKwkJX19tX2ZyZWUoJm1wMCwgdmJwLCBzaXplb2YoKnZicCksICJWVE9CIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fX2RtYV9mcmVlcChtX3Bvb2xfcyAqbXAsIG1fYWRkcl90IG0pCit7CisJbV92dG9iX3MgKip2YnBwLCAqdmJwOworCWludCBoYyA9IFZUT0JfSEFTSF9DT0RFKG0pOworCisJdmJwcCA9ICZtcC0+dnRvYltoY107CisJd2hpbGUgKCp2YnBwICYmICgqdmJwcCktPnZhZGRyICE9IG0pCisJCXZicHAgPSAmKCp2YnBwKS0+bmV4dDsKKwlpZiAoKnZicHApIHsKKwkJdmJwID0gKnZicHA7CisJCSp2YnBwID0gKCp2YnBwKS0+bmV4dDsKKwkJZG1hX2ZyZWVfY29oZXJlbnQobXAtPmJ1c2gsIFBBR0VfU0laRTw8TUVNT19QQUdFX09SREVSLAorCQkJCSAgKHZvaWQgKil2YnAtPnZhZGRyLCAoZG1hX2FkZHJfdCl2YnAtPmJhZGRyKTsKKwkJX19tX2ZyZWUoJm1wMCwgdmJwLCBzaXplb2YoKnZicCksICJWVE9CIik7CisJCS0tbXAtPm51bXA7CisJfQorfQorCitzdGF0aWMgaW5saW5lIG1fcG9vbF9zICpfX19nZXRfZG1hX3Bvb2wobV9idXNoX3QgYnVzaCkKK3sKKwltX3Bvb2xfcyAqbXA7CisJZm9yIChtcCA9IG1wMC5uZXh0OyBtcCAmJiBtcC0+YnVzaCAhPSBidXNoOyBtcCA9IG1wLT5uZXh0KTsKKwlyZXR1cm4gbXA7Cit9CisKK3N0YXRpYyBtX3Bvb2xfcyAqX19fY3JlX2RtYV9wb29sKG1fYnVzaF90IGJ1c2gpCit7CisJbV9wb29sX3MgKm1wOworCW1wID0gX19tX2NhbGxvYygmbXAwLCBzaXplb2YoKm1wKSwgIk1QT09MIik7CisJaWYgKG1wKSB7CisJCW1lbXNldChtcCwgMCwgc2l6ZW9mKCptcCkpOworCQltcC0+YnVzaCA9IGJ1c2g7CisJCW1wLT5nZXRwID0gX19fZG1hX2dldHA7CisJCW1wLT5mcmVlcCA9IF9fX2RtYV9mcmVlcDsKKwkJbXAtPm5leHQgPSBtcDAubmV4dDsKKwkJbXAwLm5leHQgPSBtcDsKKwl9CisJcmV0dXJuIG1wOworfQorCitzdGF0aWMgdm9pZCBfX19kZWxfZG1hX3Bvb2wobV9wb29sX3MgKnApCit7CisJc3RydWN0IG1fcG9vbCAqKnBwID0gJm1wMC5uZXh0OworCisJd2hpbGUgKCpwcCAmJiAqcHAgIT0gcCkKKwkJcHAgPSAmKCpwcCktPm5leHQ7CisJaWYgKCpwcCkgeworCQkqcHAgPSAoKnBwKS0+bmV4dDsKKwkJX19tX2ZyZWUoJm1wMCwgcCwgc2l6ZW9mKCpwKSwgIk1QT09MIik7CisJfQorfQorCitzdGF0aWMgdm9pZCAqX19tX2NhbGxvY19kbWEobV9idXNoX3QgYnVzaCwgaW50IHNpemUsIGNoYXIgKm5hbWUpCit7CisJdV9sb25nIGZsYWdzOworCXN0cnVjdCBtX3Bvb2wgKm1wOworCXZvaWQgKm0gPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5jcjUzYzh4eF9sb2NrLCBmbGFncyk7CisJbXAgPSBfX19nZXRfZG1hX3Bvb2woYnVzaCk7CisJaWYgKCFtcCkKKwkJbXAgPSBfX19jcmVfZG1hX3Bvb2woYnVzaCk7CisJaWYgKG1wKQorCQltID0gX19tX2NhbGxvYyhtcCwgc2l6ZSwgbmFtZSk7CisJaWYgKG1wICYmICFtcC0+bnVtcCkKKwkJX19fZGVsX2RtYV9wb29sKG1wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuY3I1M2M4eHhfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIG07Cit9CisKK3N0YXRpYyB2b2lkIF9fbV9mcmVlX2RtYShtX2J1c2hfdCBidXNoLCB2b2lkICptLCBpbnQgc2l6ZSwgY2hhciAqbmFtZSkKK3sKKwl1X2xvbmcgZmxhZ3M7CisJc3RydWN0IG1fcG9vbCAqbXA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbmNyNTNjOHh4X2xvY2ssIGZsYWdzKTsKKwltcCA9IF9fX2dldF9kbWFfcG9vbChidXNoKTsKKwlpZiAobXApCisJCV9fbV9mcmVlKG1wLCBtLCBzaXplLCBuYW1lKTsKKwlpZiAobXAgJiYgIW1wLT5udW1wKQorCQlfX19kZWxfZG1hX3Bvb2wobXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5jcjUzYzh4eF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBtX2FkZHJfdCBfX3Z0b2J1cyhtX2J1c2hfdCBidXNoLCB2b2lkICptKQoreworCXVfbG9uZyBmbGFnczsKKwltX3Bvb2xfcyAqbXA7CisJaW50IGhjID0gVlRPQl9IQVNIX0NPREUobSk7CisJbV92dG9iX3MgKnZwID0gTlVMTDsKKwltX2FkZHJfdCBhID0gKChtX2FkZHJfdCkgbSkgJiB+TUVNT19DTFVTVEVSX01BU0s7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbmNyNTNjOHh4X2xvY2ssIGZsYWdzKTsKKwltcCA9IF9fX2dldF9kbWFfcG9vbChidXNoKTsKKwlpZiAobXApIHsKKwkJdnAgPSBtcC0+dnRvYltoY107CisJCXdoaWxlICh2cCAmJiAobV9hZGRyX3QpIHZwLT52YWRkciAhPSBhKQorCQkJdnAgPSB2cC0+bmV4dDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmNyNTNjOHh4X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gdnAgPyB2cC0+YmFkZHIgKyAoKChtX2FkZHJfdCkgbSkgLSBhKSA6IDA7Cit9CisKKyNkZWZpbmUgX21fY2FsbG9jX2RtYShucCwgcywgbikJCV9fbV9jYWxsb2NfZG1hKG5wLT5kZXYsIHMsIG4pCisjZGVmaW5lIF9tX2ZyZWVfZG1hKG5wLCBwLCBzLCBuKQlfX21fZnJlZV9kbWEobnAtPmRldiwgcCwgcywgbikKKyNkZWZpbmUgbV9jYWxsb2NfZG1hKHMsIG4pCQlfbV9jYWxsb2NfZG1hKG5wLCBzLCBuKQorI2RlZmluZSBtX2ZyZWVfZG1hKHAsIHMsIG4pCQlfbV9mcmVlX2RtYShucCwgcCwgcywgbikKKyNkZWZpbmUgX3Z0b2J1cyhucCwgcCkJCQlfX3Z0b2J1cyhucC0+ZGV2LCBwKQorI2RlZmluZSB2dG9idXMocCkJCQlfdnRvYnVzKG5wLCBwKQorCisvKgorICogIERlYWwgd2l0aCBETUEgbWFwcGluZy91bm1hcHBpbmcuCisgKi8KKworLyogVG8ga2VlcCB0cmFjayBvZiB0aGUgZG1hIG1hcHBpbmcgKHNnL3NpbmdsZSkgdGhhdCBoYXMgYmVlbiBzZXQgKi8KKyNkZWZpbmUgX19kYXRhX21hcHBlZAlTQ3AucGhhc2UKKyNkZWZpbmUgX19kYXRhX21hcHBpbmcJU0NwLmhhdmVfZGF0YV9pbgorCitzdGF0aWMgdm9pZCBfX3VubWFwX3Njc2lfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzd2l0Y2goY21kLT5fX2RhdGFfbWFwcGVkKSB7CisJY2FzZSAyOgorCQlkbWFfdW5tYXBfc2coZGV2LCBjbWQtPmJ1ZmZlciwgY21kLT51c2Vfc2csCisJCQkJY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZG1hX3VubWFwX3NpbmdsZShkZXYsIGNtZC0+X19kYXRhX21hcHBpbmcsCisJCQkJIGNtZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJYnJlYWs7CisJfQorCWNtZC0+X19kYXRhX21hcHBlZCA9IDA7Cit9CisKK3N0YXRpYyB1X2xvbmcgX19tYXBfc2NzaV9zaW5nbGVfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisKKwlpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPT0gMCkKKwkJcmV0dXJuIDA7CisKKwltYXBwaW5nID0gZG1hX21hcF9zaW5nbGUoZGV2LCBjbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCSBjbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJY21kLT5fX2RhdGFfbWFwcGVkID0gMTsKKwljbWQtPl9fZGF0YV9tYXBwaW5nID0gbWFwcGluZzsKKworCXJldHVybiBtYXBwaW5nOworfQorCitzdGF0aWMgaW50IF9fbWFwX3Njc2lfc2dfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlpbnQgdXNlX3NnOworCisJaWYgKGNtZC0+dXNlX3NnID09IDApCisJCXJldHVybiAwOworCisJdXNlX3NnID0gZG1hX21hcF9zZyhkZXYsIGNtZC0+YnVmZmVyLCBjbWQtPnVzZV9zZywKKwkJCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCWNtZC0+X19kYXRhX21hcHBlZCA9IDI7CisJY21kLT5fX2RhdGFfbWFwcGluZyA9IHVzZV9zZzsKKworCXJldHVybiB1c2Vfc2c7Cit9CisKKyNkZWZpbmUgdW5tYXBfc2NzaV9kYXRhKG5wLCBjbWQpCV9fdW5tYXBfc2NzaV9kYXRhKG5wLT5kZXYsIGNtZCkKKyNkZWZpbmUgbWFwX3Njc2lfc2luZ2xlX2RhdGEobnAsIGNtZCkJX19tYXBfc2NzaV9zaW5nbGVfZGF0YShucC0+ZGV2LCBjbWQpCisjZGVmaW5lIG1hcF9zY3NpX3NnX2RhdGEobnAsIGNtZCkJX19tYXBfc2NzaV9zZ19kYXRhKG5wLT5kZXYsIGNtZCkKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJRHJpdmVyIHNldHVwLgorKioKKyoqCVRoaXMgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkIGZyb20gbGludXggY29uZmlnIAorKioJb3B0aW9ucy4gSXQgY2FuIGJlIG92ZXJyaWRkZW4gYXQgYm9vdC11cCBieSB0aGUgYm9vdCAKKyoqCWNvbW1hbmQgbGluZS4KKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgc3RydWN0IG5jcl9kcml2ZXJfc2V0dXAKKwlkcml2ZXJfc2V0dXAJCQk9IFNDU0lfTkNSX0RSSVZFUl9TRVRVUDsKKworI2lmZGVmCVNDU0lfTkNSX0JPT1RfQ09NTUFORF9MSU5FX1NVUFBPUlQKK3N0YXRpYyBzdHJ1Y3QgbmNyX2RyaXZlcl9zZXR1cAorCWRyaXZlcl9zYWZlX3NldHVwIF9faW5pdGRhdGEJPSBTQ1NJX05DUl9EUklWRVJfU0FGRV9TRVRVUDsKKyNlbmRpZgorCisjZGVmaW5lIGluaXR2ZXJib3NlIChkcml2ZXJfc2V0dXAudmVyYm9zZSkKKyNkZWZpbmUgYm9vdHZlcmJvc2UgKG5wLT52ZXJib3NlKQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCURyaXZlciBzZXR1cCBmcm9tIHRoZSBib290IGNvbW1hbmQgbGluZQorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2lmZGVmIE1PRFVMRQorI2RlZmluZQlBUkdfU0VQCScgJworI2Vsc2UKKyNkZWZpbmUJQVJHX1NFUAknLCcKKyNlbmRpZgorCisjZGVmaW5lIE9QVF9UQUdTCQkxCisjZGVmaW5lIE9QVF9NQVNURVJfUEFSSVRZCTIKKyNkZWZpbmUgT1BUX1NDU0lfUEFSSVRZCQkzCisjZGVmaW5lIE9QVF9ESVNDT05ORUNUSU9OCTQKKyNkZWZpbmUgT1BUX1NQRUNJQUxfRkVBVFVSRVMJNQorI2RlZmluZSBPUFRfVU5VU0VEXzEJCTYKKyNkZWZpbmUgT1BUX0ZPUkNFX1NZTkNfTkVHTwk3CisjZGVmaW5lIE9QVF9SRVZFUlNFX1BST0JFCTgKKyNkZWZpbmUgT1BUX0RFRkFVTFRfU1lOQwk5CisjZGVmaW5lIE9QVF9WRVJCT1NFCQkxMAorI2RlZmluZSBPUFRfREVCVUcJCTExCisjZGVmaW5lIE9QVF9CVVJTVF9NQVgJCTEyCisjZGVmaW5lIE9QVF9MRURfUElOCQkxMworI2RlZmluZSBPUFRfTUFYX1dJREUJCTE0CisjZGVmaW5lIE9QVF9TRVRUTEVfREVMQVkJMTUKKyNkZWZpbmUgT1BUX0RJRkZfU1VQUE9SVAkxNgorI2RlZmluZSBPUFRfSVJRTQkJMTcKKyNkZWZpbmUgT1BUX1BDSV9GSVhfVVAJCTE4CisjZGVmaW5lIE9QVF9CVVNfQ0hFQ0sJCTE5CisjZGVmaW5lIE9QVF9PUFRJTUlaRQkJMjAKKyNkZWZpbmUgT1BUX1JFQ09WRVJZCQkyMQorI2RlZmluZSBPUFRfU0FGRV9TRVRVUAkJMjIKKyNkZWZpbmUgT1BUX1VTRV9OVlJBTQkJMjMKKyNkZWZpbmUgT1BUX0VYQ0xVREUJCTI0CisjZGVmaW5lIE9QVF9IT1NUX0lECQkyNQorCisjaWZkZWYgU0NTSV9OQ1JfSUFSQl9TVVBQT1JUCisjZGVmaW5lIE9QVF9JQVJCCQkyNgorI2VuZGlmCisKK3N0YXRpYyBjaGFyIHNldHVwX3Rva2VuW10gX19pbml0ZGF0YSA9IAorCSJ0YWdzOiIgICAibXBhcjoiCisJInNwYXI6IiAgICJkaXNjOiIKKwkic3BlY2Y6IiAgInVsdHJhOiIKKwkiZnNuOiIgICAgInJldnByb2I6IgorCSJzeW5jOiIgICAidmVyYjoiCisJImRlYnVnOiIgICJidXJzdDoiCisJImxlZDoiICAgICJ3aWRlOiIKKwkic2V0dGxlOiIgImRpZmY6IgorCSJpcnFtOiIgICAicGNpZml4OiIKKwkiYnVzY2hrOiIgIm9wdGltOiIKKwkicmVjb3Zlcnk6IgorCSJzYWZlOiIgICAibnZyYW06IgorCSJleGNsOiIgICAiaG9zdGlkOiIKKyNpZmRlZiBTQ1NJX05DUl9JQVJCX1NVUFBPUlQKKwkiaWFyYjoiCisjZW5kaWYKKwk7CS8qIERPTk5PVCBSRU1PVkUgVEhJUyAnOycgKi8KKworI2lmZGVmIE1PRFVMRQorI2RlZmluZQlBUkdfU0VQCScgJworI2Vsc2UKKyNkZWZpbmUJQVJHX1NFUAknLCcKKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBnZXRfc2V0dXBfdG9rZW4oY2hhciAqcCkKK3sKKwljaGFyICpjdXIgPSBzZXR1cF90b2tlbjsKKwljaGFyICpwYzsKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSAoY3VyICE9IE5VTEwgJiYgKHBjID0gc3RyY2hyKGN1ciwgJzonKSkgIT0gTlVMTCkgeworCQkrK3BjOworCQkrK2k7CisJCWlmICghc3RybmNtcChwLCBjdXIsIHBjIC0gY3VyKSkKKwkJCXJldHVybiBpOworCQljdXIgPSBwYzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgc3ltNTNjOHh4X19zZXR1cChjaGFyICpzdHIpCit7CisjaWZkZWYgU0NTSV9OQ1JfQk9PVF9DT01NQU5EX0xJTkVfU1VQUE9SVAorCWNoYXIgKmN1ciA9IHN0cjsKKwljaGFyICpwYywgKnB2OworCWludCBpLCB2YWwsIGM7CisJaW50IHhpID0gMDsKKworCXdoaWxlIChjdXIgIT0gTlVMTCAmJiAocGMgPSBzdHJjaHIoY3VyLCAnOicpKSAhPSBOVUxMKSB7CisJCWNoYXIgKnBlOworCisJCXZhbCA9IDA7CisJCXB2ID0gcGM7CisJCWMgPSAqKytwdjsKKworCQlpZgkoYyA9PSAnbicpCisJCQl2YWwgPSAwOworCQllbHNlIGlmCShjID09ICd5JykKKwkJCXZhbCA9IDE7CisJCWVsc2UKKwkJCXZhbCA9IChpbnQpIHNpbXBsZV9zdHJ0b3VsKHB2LCAmcGUsIDApOworCisJCXN3aXRjaCAoZ2V0X3NldHVwX3Rva2VuKGN1cikpIHsKKwkJY2FzZSBPUFRfVEFHUzoKKwkJCWRyaXZlcl9zZXR1cC5kZWZhdWx0X3RhZ3MgPSB2YWw7CisJCQlpZiAocGUgJiYgKnBlID09ICcvJykgeworCQkJCWkgPSAwOworCQkJCXdoaWxlICgqcGUgJiYgKnBlICE9IEFSR19TRVAgJiYgCisJCQkJCWkgPCBzaXplb2YoZHJpdmVyX3NldHVwLnRhZ19jdHJsKS0xKSB7CisJCQkJCWRyaXZlcl9zZXR1cC50YWdfY3RybFtpKytdID0gKnBlKys7CisJCQkJfQorCQkJCWRyaXZlcl9zZXR1cC50YWdfY3RybFtpXSA9ICdcMCc7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUFRfTUFTVEVSX1BBUklUWToKKwkJCWRyaXZlcl9zZXR1cC5tYXN0ZXJfcGFyaXR5ID0gdmFsOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX1NDU0lfUEFSSVRZOgorCQkJZHJpdmVyX3NldHVwLnNjc2lfcGFyaXR5ID0gdmFsOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX0RJU0NPTk5FQ1RJT046CisJCQlkcml2ZXJfc2V0dXAuZGlzY29ubmVjdGlvbiA9IHZhbDsKKwkJCWJyZWFrOworCQljYXNlIE9QVF9TUEVDSUFMX0ZFQVRVUkVTOgorCQkJZHJpdmVyX3NldHVwLnNwZWNpYWxfZmVhdHVyZXMgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfRk9SQ0VfU1lOQ19ORUdPOgorCQkJZHJpdmVyX3NldHVwLmZvcmNlX3N5bmNfbmVnbyA9IHZhbDsKKwkJCWJyZWFrOworCQljYXNlIE9QVF9SRVZFUlNFX1BST0JFOgorCQkJZHJpdmVyX3NldHVwLnJldmVyc2VfcHJvYmUgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfREVGQVVMVF9TWU5DOgorCQkJZHJpdmVyX3NldHVwLmRlZmF1bHRfc3luYyA9IHZhbDsKKwkJCWJyZWFrOworCQljYXNlIE9QVF9WRVJCT1NFOgorCQkJZHJpdmVyX3NldHVwLnZlcmJvc2UgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfREVCVUc6CisJCQlkcml2ZXJfc2V0dXAuZGVidWcgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfQlVSU1RfTUFYOgorCQkJZHJpdmVyX3NldHVwLmJ1cnN0X21heCA9IHZhbDsKKwkJCWJyZWFrOworCQljYXNlIE9QVF9MRURfUElOOgorCQkJZHJpdmVyX3NldHVwLmxlZF9waW4gPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfTUFYX1dJREU6CisJCQlkcml2ZXJfc2V0dXAubWF4X3dpZGUgPSB2YWw/IDE6MDsKKwkJCWJyZWFrOworCQljYXNlIE9QVF9TRVRUTEVfREVMQVk6CisJCQlkcml2ZXJfc2V0dXAuc2V0dGxlX2RlbGF5ID0gdmFsOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX0RJRkZfU1VQUE9SVDoKKwkJCWRyaXZlcl9zZXR1cC5kaWZmX3N1cHBvcnQgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfSVJRTToKKwkJCWRyaXZlcl9zZXR1cC5pcnFtID0gdmFsOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX1BDSV9GSVhfVVA6CisJCQlkcml2ZXJfc2V0dXAucGNpX2ZpeF91cAk9IHZhbDsKKwkJCWJyZWFrOworCQljYXNlIE9QVF9CVVNfQ0hFQ0s6CisJCQlkcml2ZXJfc2V0dXAuYnVzX2NoZWNrID0gdmFsOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX09QVElNSVpFOgorCQkJZHJpdmVyX3NldHVwLm9wdGltaXplID0gdmFsOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX1JFQ09WRVJZOgorCQkJZHJpdmVyX3NldHVwLnJlY292ZXJ5ID0gdmFsOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX1VTRV9OVlJBTToKKwkJCWRyaXZlcl9zZXR1cC51c2VfbnZyYW0gPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfU0FGRV9TRVRVUDoKKwkJCW1lbWNweSgmZHJpdmVyX3NldHVwLCAmZHJpdmVyX3NhZmVfc2V0dXAsCisJCQkJc2l6ZW9mKGRyaXZlcl9zZXR1cCkpOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX0VYQ0xVREU6CisJCQlpZiAoeGkgPCBTQ1NJX05DUl9NQVhfRVhDTFVERVMpCisJCQkJZHJpdmVyX3NldHVwLmV4Y2x1ZGVzW3hpKytdID0gdmFsOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX0hPU1RfSUQ6CisJCQlkcml2ZXJfc2V0dXAuaG9zdF9pZCA9IHZhbDsKKwkJCWJyZWFrOworI2lmZGVmIFNDU0lfTkNSX0lBUkJfU1VQUE9SVAorCQljYXNlIE9QVF9JQVJCOgorCQkJZHJpdmVyX3NldHVwLmlhcmIgPSB2YWw7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJzeW01M2M4eHhfc2V0dXA6IHVuZXhwZWN0ZWQgYm9vdCBvcHRpb24gJyUuKnMnIGlnbm9yZWRcbiIsIChpbnQpKHBjLWN1cisxKSwgY3VyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChjdXIgPSBzdHJjaHIoY3VyLCBBUkdfU0VQKSkgIT0gTlVMTCkKKwkJCSsrY3VyOworCX0KKyNlbmRpZiAvKiBTQ1NJX05DUl9CT09UX0NPTU1BTkRfTElORV9TVVBQT1JUICovCisJcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCUdldCBkZXZpY2UgcXVldWUgZGVwdGggZnJvbSBib290IGNvbW1hbmQgbGluZS4KKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjZGVmaW5lIERFRl9ERVBUSAkoZHJpdmVyX3NldHVwLmRlZmF1bHRfdGFncykKKyNkZWZpbmUgQUxMX1RBUkdFVFMJLTIKKyNkZWZpbmUgTk9fVEFSR0VUCS0xCisjZGVmaW5lIEFMTF9MVU5TCS0yCisjZGVmaW5lIE5PX0xVTgkJLTEKKworc3RhdGljIGludCBkZXZpY2VfcXVldWVfZGVwdGgoaW50IHVuaXQsIGludCB0YXJnZXQsIGludCBsdW4pCit7CisJaW50IGMsIGgsIHQsIHUsIHY7CisJY2hhciAqcCA9IGRyaXZlcl9zZXR1cC50YWdfY3RybDsKKwljaGFyICplcDsKKworCWggPSAtMTsKKwl0ID0gTk9fVEFSR0VUOworCXUgPSBOT19MVU47CisJd2hpbGUgKChjID0gKnArKykgIT0gMCkgeworCQl2ID0gc2ltcGxlX3N0cnRvdWwocCwgJmVwLCAwKTsKKwkJc3dpdGNoKGMpIHsKKwkJY2FzZSAnLyc6CisJCQkrK2g7CisJCQl0ID0gQUxMX1RBUkdFVFM7CisJCQl1ID0gQUxMX0xVTlM7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQlpZiAodCAhPSB0YXJnZXQpCisJCQkJdCA9ICh0YXJnZXQgPT0gdikgPyB2IDogTk9fVEFSR0VUOworCQkJdSA9IEFMTF9MVU5TOworCQkJYnJlYWs7CisJCWNhc2UgJ3UnOgorCQkJaWYgKHUgIT0gbHVuKQorCQkJCXUgPSAobHVuID09IHYpID8gdiA6IE5PX0xVTjsKKwkJCWJyZWFrOworCQljYXNlICdxJzoKKwkJCWlmIChoID09IHVuaXQgJiYKKwkJCQkodCA9PSBBTExfVEFSR0VUUyB8fCB0ID09IHRhcmdldCkgJiYKKwkJCQkodSA9PSBBTExfTFVOUyAgICB8fCB1ID09IGx1bikpCisJCQkJcmV0dXJuIHY7CisJCQlicmVhazsKKwkJY2FzZSAnLSc6CisJCQl0ID0gQUxMX1RBUkdFVFM7CisJCQl1ID0gQUxMX0xVTlM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXAgPSBlcDsKKwl9CisJcmV0dXJuIERFRl9ERVBUSDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfZGVmcy5oIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0YWU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfZGVmcy5oCkBAIC0wLDAgKzEsMTMzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogIEhpZ2ggUGVyZm9ybWFuY2UgZGV2aWNlIGRyaXZlciBmb3IgdGhlIFN5bWJpb3MgNTNDODk2IGNvbnRyb2xsZXIuCisqKgorKiogIENvcHlyaWdodCAoQykgMTk5OC0yMDAxICBHZXJhcmQgUm91ZGllciA8Z3JvdWRpZXJAZnJlZS5mcj4KKyoqCisqKiAgVGhpcyBkcml2ZXIgYWxzbyBzdXBwb3J0cyBhbGwgdGhlIFN5bWJpb3MgNTNDOFhYIGNvbnRyb2xsZXIgZmFtaWx5LCAKKyoqICBleGNlcHQgNTNDODEwIHJldmlzaW9ucyA8IDE2LCA1M0M4MjUgcmV2aXNpb25zIDwgMTYgYW5kIGFsbCAKKyoqICByZXZpc2lvbnMgb2YgNTNDODE1IGNvbnRyb2xsZXJzLgorKioKKyoqICBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiB0aGUgTGludXggcG9ydCBvZiB0aGUgRnJlZUJTRCBuY3IgZHJpdmVyLgorKiogCisqKiAgQ29weXJpZ2h0IChDKSAxOTk0ICBXb2xmZ2FuZyBTdGFuZ2xtZWllcgorKiogIAorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiogIAorKiogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyoqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqKgorKiogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqKgorKiogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyoqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFRoZSBMaW51eCBwb3J0IG9mIHRoZSBGcmVlQlNEIG5jciBkcml2ZXIgaGFzIGJlZW4gYWNoaWV2ZWQgaW4gCisqKiAgbm92ZW1iZXIgMTk5NSBieToKKyoqCisqKiAgICAgICAgICBHZXJhcmQgUm91ZGllciAgICAgICAgICAgICAgPGdyb3VkaWVyQGZyZWUuZnI+CisqKgorKiogIEJlaW5nIGdpdmVuIHRoYXQgdGhpcyBkcml2ZXIgb3JpZ2luYXRlcyBmcm9tIHRoZSBGcmVlQlNEIHZlcnNpb24sIGFuZAorKiogIGluIG9yZGVyIHRvIGtlZXAgc3luZXJneSBvbiBib3RoLCBhbnkgc3VnZ2VzdGVkIGVuaGFuY2VtZW50cyBhbmQgY29ycmVjdGlvbnMKKyoqICByZWNlaXZlZCBvbiBMaW51eCBhcmUgYXV0b21hdGljYWxseSBhIHBvdGVudGlhbCBjYW5kaWRhdGUgZm9yIHRoZSBGcmVlQlNEIAorKiogIHZlcnNpb24uCisqKgorKiogIFRoZSBvcmlnaW5hbCBkcml2ZXIgaGFzIGJlZW4gd3JpdHRlbiBmb3IgMzg2YnNkIGFuZCBGcmVlQlNEIGJ5CisqKiAgICAgICAgICBXb2xmZ2FuZyBTdGFuZ2xtZWllciAgICAgICAgPHdvbGZAY29sb2duZS5kZT4KKyoqICAgICAgICAgIFN0ZWZhbiBFc3NlciAgICAgICAgICAgICAgICA8c2VAbWkuVW5pLUtvZWxuLmRlPgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgTWFqb3IgY29udHJpYnV0aW9uczoKKyoqICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBOVlJBTSBkZXRlY3Rpb24gYW5kIHJlYWRpbmcuCisqKiAgICBDb3B5cmlnaHQgKEMpIDE5OTcgUmljaGFyZCBXYWx0aGFtIDxkb3Jtb3VzZUBmYXJzcm9idC5kZW1vbi5jby51az4KKyoqCisqKiAgQWRkZWQgc3VwcG9ydCBmb3IgTUlQUyBiaWcgZW5kaWFuIHN5c3RlbXMuCisqKiAgICBDYXJzdGVuIExhbmdnYWFyZCwgY2Fyc3RlbmxAbWlwcy5jb20KKyoqICAgIENvcHlyaWdodCAoQykgMjAwMCBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoqCisqKiAgQWRkZWQgc3VwcG9ydCBmb3IgSFAgUEFSSVNDIGJpZyBlbmRpYW4gc3lzdGVtcy4KKyoqICAgIENvcHlyaWdodCAoQykgMjAwMCBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIFNZTTUzQzhYWF9ERUZTX0gKKyNkZWZpbmUgU1lNNTNDOFhYX0RFRlNfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKy8qCisqKglJZiB5b3Ugd2FudCBhIGRyaXZlciBhcyBzbWFsbCBhcyBwb3NzaWJsZSwgZG9ubm90IGRlZmluZSB0aGUgCisqKglmb2xsb3dpbmcgb3B0aW9ucy4KKyovCisjZGVmaW5lIFNDU0lfTkNSX0JPT1RfQ09NTUFORF9MSU5FX1NVUFBPUlQKKyNkZWZpbmUgU0NTSV9OQ1JfREVCVUdfSU5GT19TVVBQT1JUCisKKy8qCisqKglUbyBkaXNhYmxlIGludGVncml0eSBjaGVja2luZywgZG8gbm90IGRlZmluZSB0aGUgCisqKglmb2xsb3dpbmcgb3B0aW9uLgorKi8KKyNpZmRlZglDT05GSUdfU0NTSV9OQ1I1M0M4WFhfSU5URUdSSVRZX0NIRUNLCisjCWRlZmluZSBTQ1NJX05DUl9FTkFCTEVfSU5URUdSSVRZX0NIRUNLCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKiBUYWtlIGludG8gYWNjb3VudCBrZXJuZWwgY29uZmlndXJlZCBwYXJhbWV0ZXJzLgorKiogTW9zdCBvZiB0aGVzZSBvcHRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGF0IHN0YXJ0dXAgYnkgYSBjb21tYW5kIGxpbmUuCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8qCisgKiBGb3IgVWx0cmEyIGFuZCBVbHRyYTMgU0NTSSBzdXBwb3J0IG9wdGlvbiwgdXNlIHNwZWNpYWwgZmVhdHVyZXMuIAorICoKKyAqIFZhbHVlIChkZWZhdWx0KSBtZWFuczoKKyAqCWJpdCAwIDogYWxsIGZlYXR1cmVzIGVuYWJsZWQsIGV4Y2VwdDoKKyAqCQliaXQgMSA6IFBDSSBXcml0ZSBBbmQgSW52YWxpZGF0ZS4KKyAqCQliaXQgMiA6IERhdGEgUGhhc2UgTWlzbWF0Y2ggaGFuZGxpbmcgZnJvbSBTQ1JJUFRTLgorICoKKyAqIFVzZSBib290IG9wdGlvbnMgbmNyNTNjOHh4PXNwZWNmOjEgaWYgeW91IHdhbnQgYWxsIGNoaXAgZmVhdHVyZXMgdG8gYmUgCisgKiBlbmFibGVkIGJ5IHRoZSBkcml2ZXIuCisgKi8KKyNkZWZpbmUJU0NTSV9OQ1JfU0VUVVBfU1BFQ0lBTF9GRUFUVVJFUwkJKDMpCisKKyNkZWZpbmUgU0NTSV9OQ1JfTUFYX1NZTkMJCQkoODApCisKKy8qCisgKiBBbGxvdyB0YWdzIGZyb20gMiB0byAyNTYsIGRlZmF1bHQgOAorICovCisjaWZkZWYJQ09ORklHX1NDU0lfTkNSNTNDOFhYX01BWF9UQUdTCisjaWYJQ09ORklHX1NDU0lfTkNSNTNDOFhYX01BWF9UQUdTIDwgMgorI2RlZmluZSBTQ1NJX05DUl9NQVhfVEFHUwkoMikKKyNlbGlmCUNPTkZJR19TQ1NJX05DUjUzQzhYWF9NQVhfVEFHUyA+IDI1NgorI2RlZmluZSBTQ1NJX05DUl9NQVhfVEFHUwkoMjU2KQorI2Vsc2UKKyNkZWZpbmUJU0NTSV9OQ1JfTUFYX1RBR1MJQ09ORklHX1NDU0lfTkNSNTNDOFhYX01BWF9UQUdTCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIFNDU0lfTkNSX01BWF9UQUdTCSg4KQorI2VuZGlmCisKKy8qCisgKiBBbGxvdyB0YWdnZWQgY29tbWFuZCBxdWV1aW5nIHN1cHBvcnQgaWYgY29uZmlndXJlZCB3aXRoIGRlZmF1bHQgbnVtYmVyIAorICogb2YgdGFncyBzZXQgdG8gbWF4IChzZWUgYWJvdmUpLgorICovCisjaWZkZWYJQ09ORklHX1NDU0lfTkNSNTNDOFhYX0RFRkFVTFRfVEFHUworI2RlZmluZQlTQ1NJX05DUl9TRVRVUF9ERUZBVUxUX1RBR1MJQ09ORklHX1NDU0lfTkNSNTNDOFhYX0RFRkFVTFRfVEFHUworI2VsaWYJZGVmaW5lZCBDT05GSUdfU0NTSV9OQ1I1M0M4WFhfVEFHR0VEX1FVRVVFCisjZGVmaW5lCVNDU0lfTkNSX1NFVFVQX0RFRkFVTFRfVEFHUwlTQ1NJX05DUl9NQVhfVEFHUworI2Vsc2UKKyNkZWZpbmUJU0NTSV9OQ1JfU0VUVVBfREVGQVVMVF9UQUdTCSgwKQorI2VuZGlmCisKKy8qCisgKiBJbW1lZGlhdGUgYXJiaXRyYXRpb24KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1NDU0lfTkNSNTNDOFhYX0lBUkIpCisjZGVmaW5lIFNDU0lfTkNSX0lBUkJfU1VQUE9SVAorI2VuZGlmCisKKy8qCisgKiBTeW5jIHRyYW5zZmVyIGZyZXF1ZW5jeSBhdCBzdGFydHVwLgorICogQWxsb3cgZnJvbSA1TWh6IHRvIDgwTWh6IGRlZmF1bHQgMjAgTWh6LgorICovCisjaWZuZGVmCUNPTkZJR19TQ1NJX05DUjUzQzhYWF9TWU5DCisjZGVmaW5lCUNPTkZJR19TQ1NJX05DUjUzQzhYWF9TWU5DCSgyMCkKKyNlbGlmCUNPTkZJR19TQ1NJX05DUjUzQzhYWF9TWU5DID4gU0NTSV9OQ1JfTUFYX1NZTkMKKyN1bmRlZglDT05GSUdfU0NTSV9OQ1I1M0M4WFhfU1lOQworI2RlZmluZQlDT05GSUdfU0NTSV9OQ1I1M0M4WFhfU1lOQwlTQ1NJX05DUl9NQVhfU1lOQworI2VuZGlmCisKKyNpZglDT05GSUdfU0NTSV9OQ1I1M0M4WFhfU1lOQyA9PSAwCisjZGVmaW5lCVNDU0lfTkNSX1NFVFVQX0RFRkFVTFRfU1lOQwkoMjU1KQorI2VsaWYJQ09ORklHX1NDU0lfTkNSNTNDOFhYX1NZTkMgPD0gNQorI2RlZmluZQlTQ1NJX05DUl9TRVRVUF9ERUZBVUxUX1NZTkMJKDUwKQorI2VsaWYJQ09ORklHX1NDU0lfTkNSNTNDOFhYX1NZTkMgPD0gMjAKKyNkZWZpbmUJU0NTSV9OQ1JfU0VUVVBfREVGQVVMVF9TWU5DCSgyNTAvKENPTkZJR19TQ1NJX05DUjUzQzhYWF9TWU5DKSkKKyNlbGlmCUNPTkZJR19TQ1NJX05DUjUzQzhYWF9TWU5DIDw9IDMzCisjZGVmaW5lCVNDU0lfTkNSX1NFVFVQX0RFRkFVTFRfU1lOQwkoMTEpCisjZWxpZglDT05GSUdfU0NTSV9OQ1I1M0M4WFhfU1lOQyA8PSA0MAorI2RlZmluZQlTQ1NJX05DUl9TRVRVUF9ERUZBVUxUX1NZTkMJKDEwKQorI2Vsc2UKKyNkZWZpbmUJU0NTSV9OQ1JfU0VUVVBfREVGQVVMVF9TWU5DIAkoOSkKKyNlbmRpZgorCisvKgorICogRGlzYWxsb3cgZGlzY29ubmVjdGlvbnMgYXQgYm9vdC11cAorICovCisjaWZkZWYgQ09ORklHX1NDU0lfTkNSNTNDOFhYX05PX0RJU0NPTk5FQ1QKKyNkZWZpbmUgU0NTSV9OQ1JfU0VUVVBfRElTQ09OTkVDVElPTgkoMCkKKyNlbHNlCisjZGVmaW5lIFNDU0lfTkNSX1NFVFVQX0RJU0NPTk5FQ1RJT04JKDEpCisjZW5kaWYKKworLyoKKyAqIEZvcmNlIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uIGZvciBhbGwgdGFyZ2V0cworICovCisjaWZkZWYgQ09ORklHX1NDU0lfTkNSNTNDOFhYX0ZPUkNFX1NZTkNfTkVHTworI2RlZmluZSBTQ1NJX05DUl9TRVRVUF9GT1JDRV9TWU5DX05FR08JKDEpCisjZWxzZQorI2RlZmluZSBTQ1NJX05DUl9TRVRVUF9GT1JDRV9TWU5DX05FR08JKDApCisjZW5kaWYKKworLyoKKyAqIERpc2FibGUgbWFzdGVyIHBhcml0eSBjaGVja2luZyAoZmxhd2VkIGhhcmR3YXJlcyBuZWVkIHRoYXQpCisgKi8KKyNpZmRlZiBDT05GSUdfU0NTSV9OQ1I1M0M4WFhfRElTQUJMRV9NUEFSSVRZX0NIRUNLCisjZGVmaW5lIFNDU0lfTkNSX1NFVFVQX01BU1RFUl9QQVJJVFkJKDApCisjZWxzZQorI2RlZmluZSBTQ1NJX05DUl9TRVRVUF9NQVNURVJfUEFSSVRZCSgxKQorI2VuZGlmCisKKy8qCisgKiBEaXNhYmxlIHNjc2kgcGFyaXR5IGNoZWNraW5nIChmbGF3ZWQgZGV2aWNlcyBtYXkgbmVlZCB0aGF0KQorICovCisjaWZkZWYgQ09ORklHX1NDU0lfTkNSNTNDOFhYX0RJU0FCTEVfUEFSSVRZX0NIRUNLCisjZGVmaW5lIFNDU0lfTkNSX1NFVFVQX1NDU0lfUEFSSVRZCSgwKQorI2Vsc2UKKyNkZWZpbmUgU0NTSV9OQ1JfU0VUVVBfU0NTSV9QQVJJVFkJKDEpCisjZW5kaWYKKworLyoKKyAqIFNldHRsZSB0aW1lIGFmdGVyIHJlc2V0IGF0IGJvb3QtdXAKKyAqLworI2RlZmluZSBTQ1NJX05DUl9TRVRVUF9TRVRUTEVfVElNRQkoMikKKworLyoKKyoqCUJyaWRnZSBxdWlya3Mgd29yay1hcm91bmQgb3B0aW9uIGRlZmF1bHRlZCB0byAxLgorKi8KKyNpZm5kZWYJU0NTSV9OQ1JfUENJUV9XT1JLX0FST1VORF9PUFQKKyNkZWZpbmUJU0NTSV9OQ1JfUENJUV9XT1JLX0FST1VORF9PUFQJMQorI2VuZGlmCisKKy8qCisqKglXb3JrLWFyb3VuZCBjb21tb24gYnJpZGdlIG1pc2JlaGF2aW91ci4KKyoqCisqKgktIERvIG5vdCBmbHVzaCBwb3N0ZWQgd3JpdGVzIGluIHRoZSBvcHBvc2l0ZSAKKyoqCSAgZGlyZWN0aW9uIG9uIHJlYWQuCisqKgktIE1heSByZW9yZGVyIERNQSB3cml0ZXMgdG8gbWVtb3J5LgorKioKKyoqCVRoaXMgb3B0aW9uIHNob3VsZCBub3QgYWZmZWN0IHBlcmZvcm1hbmNlcyAKKyoqCXNpZ25pZmljYW50bHksIHNvIGl0IGlzIHRoZSBkZWZhdWx0LgorKi8KKyNpZglTQ1NJX05DUl9QQ0lRX1dPUktfQVJPVU5EX09QVCA9PSAxCisjZGVmaW5lCVNDU0lfTkNSX1BDSVFfTUFZX05PVF9GTFVTSF9QV19VUFNUUkVBTQorI2RlZmluZQlTQ1NJX05DUl9QQ0lRX01BWV9SRU9SREVSX1dSSVRFUworI2RlZmluZQlTQ1NJX05DUl9QQ0lRX01BWV9NSVNTX0NPTVBMRVRJT05TCisKKy8qCisqKglTYW1lIGFzIG9wdGlvbiAxLCBidXQgYWxzbyBkZWFsIHdpdGggCisqKgltaXNjb25maWd1cmVkIGludGVycnVwdHMuCisqKgorKioJLSBFZGdlIHRyaWdnZXJyZWQgaW5zdGVhZCBvZiBsZXZlbCBzZW5zaXRpdmUuCisqKgktIE5vIGludGVycnVwdCBsaW5lIGNvbm5lY3RlZC4KKyoqCS0gSVJRIG51bWJlciBtaXNjb25maWd1cmVkLgorKioJCisqKglJZiBubyBpbnRlcnJ1cHQgaXMgZGVsaXZlcmVkLCB0aGUgZHJpdmVyIHdpbGwgCisqKgljYXRjaCB0aGUgaW50ZXJydXB0IGNvbmRpdGlvbnMgMTAgdGltZXMgcGVyIAorKioJc2Vjb25kLiBObyBuZWVkIHRvIHNheSB0aGF0IHRoaXMgb3B0aW9uIGlzIAorKioJbm90IHJlY29tbWVuZGVkLgorKi8KKyNlbGlmCVNDU0lfTkNSX1BDSVFfV09SS19BUk9VTkRfT1BUID09IDIKKyNkZWZpbmUJU0NTSV9OQ1JfUENJUV9NQVlfTk9UX0ZMVVNIX1BXX1VQU1RSRUFNCisjZGVmaW5lCVNDU0lfTkNSX1BDSVFfTUFZX1JFT1JERVJfV1JJVEVTCisjZGVmaW5lCVNDU0lfTkNSX1BDSVFfTUFZX01JU1NfQ09NUExFVElPTlMKKyNkZWZpbmUJU0NTSV9OQ1JfUENJUV9CUk9LRU5fSU5UUgorCisvKgorKioJU29tZSBicmlkZ2UgZGVzaWduZXJzIGRlY2lkZWQgdG8gZmx1c2ggCisqKglldmVyeXRoaW5nIHByaW9yIHRvIGRlbGl2ZXIgdGhlIGludGVycnVwdC4KKyoqCVRoaXMgb3B0aW9uIHRyaWVzIHRvIGRlYWwgd2l0aCBzdWNoIGEgCisqKgliZWhhdmlvdXIuCisqLworI2VsaWYJU0NTSV9OQ1JfUENJUV9XT1JLX0FST1VORF9PUFQgPT0gMworI2RlZmluZQlTQ1NJX05DUl9QQ0lRX1NZTkNfT05fSU5UUgorI2VuZGlmCisKKy8qCisqKglPdGhlciBwYXJhbWV0ZXJzIG5vdCBjb25maWd1cmFibGUgd2l0aCAibWFrZSBjb25maWciCisqKglBdm9pZCB0byBjaGFuZ2UgdGhlc2UgY29uc3RhbnRzLCB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgorKi8KKworI2RlZmluZSBTQ1NJX05DUl9BTFdBWVNfU0lNUExFX1RBRworI2RlZmluZSBTQ1NJX05DUl9NQVhfU0NBVFRFUgkoMTI3KQorI2RlZmluZSBTQ1NJX05DUl9NQVhfVEFSR0VUCSgxNikKKworLyoKKyoqICAgQ29tcHV0ZSBzb21lIGRlc2lyYWJsZSB2YWx1ZSBmb3IgQ0FOX1FVRVVFIAorKiogICBhbmQgQ01EX1BFUl9MVU4uCisqKiAgIFRoZSBkcml2ZXIgd2lsbCB1c2UgbG93ZXIgdmFsdWVzIGlmIHRoZXNlIAorKiogICBvbmVzIGFwcGVhciB0byBiZSB0b28gbGFyZ2UuCisqLworI2RlZmluZSBTQ1NJX05DUl9DQU5fUVVFVUUJKDgqU0NTSV9OQ1JfTUFYX1RBR1MgKyAyKlNDU0lfTkNSX01BWF9UQVJHRVQpCisjZGVmaW5lIFNDU0lfTkNSX0NNRF9QRVJfTFVOCShTQ1NJX05DUl9NQVhfVEFHUykKKworI2RlZmluZSBTQ1NJX05DUl9TR19UQUJMRVNJWkUJKFNDU0lfTkNSX01BWF9TQ0FUVEVSKQorI2RlZmluZSBTQ1NJX05DUl9USU1FUl9JTlRFUlZBTAkoSFopCisKKyNpZiAxIC8qIGRlZmluZWQgQ09ORklHX1NDU0lfTVVMVElfTFVOICovCisjZGVmaW5lIFNDU0lfTkNSX01BWF9MVU4JKDE2KQorI2Vsc2UKKyNkZWZpbmUgU0NTSV9OQ1JfTUFYX0xVTgkoMSkKKyNlbmRpZgorCisvKgorKioJVGhlc2Ugc2ltcGxlIG1hY3JvcyBsaW1pdCBleHByZXNzaW9uIGludm9sdmluZyAKKyoqCWtlcm5lbCB0aW1lIHZhbHVlcyAoamlmZmllcykgdG8gc29tZSB0aGF0IGhhdmUgCisqKgljaGFuY2Ugbm90IHRvIGJlIHRvbyBtdWNoIGluY29ycmVjdC4gOi0pCisqLworI2RlZmluZSBrdGltZV9nZXQobykJCShqaWZmaWVzICsgKHVfbG9uZykgbykKKyNkZWZpbmUga3RpbWVfZXhwKGIpCQkoKGxvbmcpKGppZmZpZXMpIC0gKGxvbmcpKGIpID49IDApCisjZGVmaW5lIGt0aW1lX2RpZihhLCBiKQkJKChsb25nKShhKSAtIChsb25nKShiKSkKKy8qIFRoZXNlIG9uZXMgYXJlIG5vdCB1c2VkIGluIHRoaXMgZHJpdmVyICovCisjZGVmaW5lIGt0aW1lX2FkZChhLCBvKQkJKChhKSArICh1X2xvbmcpKG8pKQorI2RlZmluZSBrdGltZV9zdWIoYSwgbykJCSgoYSkgLSAodV9sb25nKShvKSkKKworCisvKgorICogIElPIGZ1bmN0aW9ucyBkZWZpbml0aW9uIGZvciBiaWcvbGl0dGxlIGVuZGlhbiBDUFUgc3VwcG9ydC4KKyAqICBGb3Igbm93LCB0aGUgTkNSIGlzIG9ubHkgc3VwcG9ydGVkIGluIGxpdHRsZSBlbmRpYW4gYWRkcmVzc2luZyBtb2RlLCAKKyAqLworCisjaWZkZWYJX19CSUdfRU5ESUFOCisKKyNkZWZpbmUJaW53X2wyYgkJaW53CisjZGVmaW5lCWlubF9sMmIJCWlubAorI2RlZmluZQlvdXR3X2IybAlvdXR3CisjZGVmaW5lCW91dGxfYjJsCW91dGwKKworI2RlZmluZQlyZWFkYl9yYXcJcmVhZGIKKyNkZWZpbmUJd3JpdGViX3Jhdwl3cml0ZWIKKworI2lmIGRlZmluZWQoU0NTSV9OQ1JfQklHX0VORElBTikKKyNkZWZpbmUJcmVhZHdfbDJiCV9fcmF3X3JlYWR3CisjZGVmaW5lCXJlYWRsX2wyYglfX3Jhd19yZWFkbAorI2RlZmluZQl3cml0ZXdfYjJsCV9fcmF3X3dyaXRldworI2RlZmluZQl3cml0ZWxfYjJsCV9fcmF3X3dyaXRlbAorI2RlZmluZQlyZWFkd19yYXcJX19yYXdfcmVhZHcKKyNkZWZpbmUJcmVhZGxfcmF3CV9fcmF3X3JlYWRsCisjZGVmaW5lCXdyaXRld19yYXcJX19yYXdfd3JpdGV3CisjZGVmaW5lCXdyaXRlbF9yYXcJX19yYXdfd3JpdGVsCisjZWxzZQkvKiBPdGhlciBiaWctZW5kaWFuICovCisjZGVmaW5lCXJlYWR3X2wyYglyZWFkdworI2RlZmluZQlyZWFkbF9sMmIJcmVhZGwKKyNkZWZpbmUJd3JpdGV3X2IybAl3cml0ZXcKKyNkZWZpbmUJd3JpdGVsX2IybAl3cml0ZWwKKyNkZWZpbmUJcmVhZHdfcmF3CXJlYWR3CisjZGVmaW5lCXJlYWRsX3JhdwlyZWFkbAorI2RlZmluZQl3cml0ZXdfcmF3CXdyaXRldworI2RlZmluZQl3cml0ZWxfcmF3CXdyaXRlbAorI2VuZGlmCisKKyNlbHNlCS8qIGxpdHRsZSBlbmRpYW4gKi8KKworI2RlZmluZQlpbndfcmF3CQlpbncKKyNkZWZpbmUJaW5sX3JhdwkJaW5sCisjZGVmaW5lCW91dHdfcmF3CW91dHcKKyNkZWZpbmUJb3V0bF9yYXcJb3V0bAorCisjZGVmaW5lCXJlYWRiX3JhdwlyZWFkYgorI2RlZmluZQlyZWFkd19yYXcJcmVhZHcKKyNkZWZpbmUJcmVhZGxfcmF3CXJlYWRsCisjZGVmaW5lCXdyaXRlYl9yYXcJd3JpdGViCisjZGVmaW5lCXdyaXRld19yYXcJd3JpdGV3CisjZGVmaW5lCXdyaXRlbF9yYXcJd3JpdGVsCisKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX19ocHBhX18pICYmICFkZWZpbmVkKF9fbWlwc19fKQorI2lmZGVmCVNDU0lfTkNSX0JJR19FTkRJQU4KKyNlcnJvcgkiVGhlIE5DUiBpbiBCSUcgRU5ESUFOIGFkZHJlc3NpbmcgbW9kZSBpcyBub3QgKHlldCkgc3VwcG9ydGVkIgorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBNRU1PUllfQkFSUklFUigpCW1iKCkKKworCisvKgorICogIElmIHRoZSBOQ1IgdXNlcyBiaWcgZW5kaWFuIGFkZHJlc3NpbmcgbW9kZSBvdmVyIHRoZSAKKyAqICBQQ0ksIGFjdHVhbCBpbyByZWdpc3RlciBhZGRyZXNzZXMgZm9yIGJ5dGUgYW5kIHdvcmQgCisgKiAgYWNjZXNzZXMgbXVzdCBiZSBjaGFuZ2VkIGFjY29yZGluZyB0byBsYW5lIHJvdXRpbmcuCisgKiAgQnR3LCBuY3Jfb2ZmYigpIGFuZCBuY3Jfb2ZmdygpIG1hY3JvcyBvbmx5IGFwcGx5IHRvIAorICogIGNvbnN0YW50cyBhbmQgc28gZG9ubm90IGdlbmVyYXRlIGJsb2F0ZWQgY29kZS4KKyAqLworCisjaWYJZGVmaW5lZChTQ1NJX05DUl9CSUdfRU5ESUFOKQorCisjZGVmaW5lIG5jcl9vZmZiKG8pCSgoKG8pJn4zKSsoKH4oKG8pJjMpKSYzKSkKKyNkZWZpbmUgbmNyX29mZncobykJKCgobykmfjMpKygofigobykmMykpJjIpKQorCisjZWxzZQorCisjZGVmaW5lIG5jcl9vZmZiKG8pCShvKQorI2RlZmluZSBuY3Jfb2ZmdyhvKQkobykKKworI2VuZGlmCisKKy8qCisgKiAgSWYgdGhlIENQVSBhbmQgdGhlIE5DUiB1c2Ugc2FtZSBlbmRpYW4tbmVzcyBhZGRyZXNzaW5nLAorICogIG5vIGJ5dGUgcmVvcmRlcmluZyBpcyBuZWVkZWQgZm9yIHNjcmlwdCBwYXRjaGluZy4KKyAqICBNYWNybyBjcHVfdG9fc2NyKCkgaXMgdG8gYmUgdXNlZCBmb3Igc2NyaXB0IHBhdGNoaW5nLgorICogIE1hY3JvIHNjcl90b19jcHUoKSBpcyB0byBiZSB1c2VkIGZvciBnZXR0aW5nIGEgRFdPUkQgCisgKiAgZnJvbSB0aGUgc2NyaXB0LgorICovCisKKyNpZglkZWZpbmVkKF9fQklHX0VORElBTikgJiYgIWRlZmluZWQoU0NTSV9OQ1JfQklHX0VORElBTikKKworI2RlZmluZSBjcHVfdG9fc2NyKGR3KQljcHVfdG9fbGUzMihkdykKKyNkZWZpbmUgc2NyX3RvX2NwdShkdykJbGUzMl90b19jcHUoZHcpCisKKyNlbGlmCWRlZmluZWQoX19MSVRUTEVfRU5ESUFOKSAmJiBkZWZpbmVkKFNDU0lfTkNSX0JJR19FTkRJQU4pCisKKyNkZWZpbmUgY3B1X3RvX3NjcihkdykJY3B1X3RvX2JlMzIoZHcpCisjZGVmaW5lIHNjcl90b19jcHUoZHcpCWJlMzJfdG9fY3B1KGR3KQorCisjZWxzZQorCisjZGVmaW5lIGNwdV90b19zY3IoZHcpCShkdykKKyNkZWZpbmUgc2NyX3RvX2NwdShkdykJKGR3KQorCisjZW5kaWYKKworLyoKKyAqICBBY2Nlc3MgdG8gdGhlIGNvbnRyb2xsZXIgY2hpcC4KKyAqCisgKiAgSWYgdGhlIENQVSBhbmQgdGhlIE5DUiB1c2Ugc2FtZSBlbmRpYW4tbmVzcyBhZGRyZXNzaW5nLAorICogIG5vIGJ5dGUgcmVvcmRlcmluZyBpcyBuZWVkZWQgZm9yIGFjY2Vzc2luZyBjaGlwIGlvIAorICogIHJlZ2lzdGVycy4gRnVuY3Rpb25zIHN1ZmZpeGVkIGJ5ICdfcmF3JyBhcmUgYXNzdW1lZCAKKyAqICB0byBhY2Nlc3MgdGhlIGNoaXAgb3ZlciB0aGUgUENJIHdpdGhvdXQgZG9pbmcgYnl0ZSAKKyAqICByZW9yZGVyaW5nLiBGdW5jdGlvbnMgc3VmZml4ZWQgYnkgJ19sMmInIGFyZSAKKyAqICBhc3N1bWVkIHRvIHBlcmZvcm0gbGl0dGxlLWVuZGlhbiB0byBiaWctZW5kaWFuIGJ5dGUgCisgKiAgcmVvcmRlcmluZywgdGhvc2Ugc3VmZml4ZWQgYnkgJ19iMmwnIGJsYWgsIGJsYWgsCisgKiAgYmxhaCwgLi4uCisgKi8KKworLyoKKyAqICBNRU1PUlkgbWFwcGVkIElPIGlucHV0IC8gb3V0cHV0CisgKi8KKworI2RlZmluZSBJTkJfT0ZGKG8pCQlyZWFkYl9yYXcoKGNoYXIgX19pb21lbSAqKW5wLT5yZWcgKyBuY3Jfb2ZmYihvKSkKKyNkZWZpbmUgT1VUQl9PRkYobywgdmFsKQl3cml0ZWJfcmF3KCh2YWwpLCAoY2hhciBfX2lvbWVtICopbnAtPnJlZyArIG5jcl9vZmZiKG8pKQorCisjaWYJZGVmaW5lZChfX0JJR19FTkRJQU4pICYmICFkZWZpbmVkKFNDU0lfTkNSX0JJR19FTkRJQU4pCisKKyNkZWZpbmUgSU5XX09GRihvKQkJcmVhZHdfbDJiKChjaGFyIF9faW9tZW0gKilucC0+cmVnICsgbmNyX29mZncobykpCisjZGVmaW5lIElOTF9PRkYobykJCXJlYWRsX2wyYigoY2hhciBfX2lvbWVtICopbnAtPnJlZyArIChvKSkKKworI2RlZmluZSBPVVRXX09GRihvLCB2YWwpCXdyaXRld19iMmwoKHZhbCksIChjaGFyIF9faW9tZW0gKilucC0+cmVnICsgbmNyX29mZncobykpCisjZGVmaW5lIE9VVExfT0ZGKG8sIHZhbCkJd3JpdGVsX2IybCgodmFsKSwgKGNoYXIgX19pb21lbSAqKW5wLT5yZWcgKyAobykpCisKKyNlbGlmCWRlZmluZWQoX19MSVRUTEVfRU5ESUFOKSAmJiBkZWZpbmVkKFNDU0lfTkNSX0JJR19FTkRJQU4pCisKKyNkZWZpbmUgSU5XX09GRihvKQkJcmVhZHdfYjJsKChjaGFyIF9faW9tZW0gKilucC0+cmVnICsgbmNyX29mZncobykpCisjZGVmaW5lIElOTF9PRkYobykJCXJlYWRsX2IybCgoY2hhciBfX2lvbWVtICopbnAtPnJlZyArIChvKSkKKworI2RlZmluZSBPVVRXX09GRihvLCB2YWwpCXdyaXRld19sMmIoKHZhbCksIChjaGFyIF9faW9tZW0gKilucC0+cmVnICsgbmNyX29mZncobykpCisjZGVmaW5lIE9VVExfT0ZGKG8sIHZhbCkJd3JpdGVsX2wyYigodmFsKSwgKGNoYXIgX19pb21lbSAqKW5wLT5yZWcgKyAobykpCisKKyNlbHNlCisKKyNpZmRlZiBDT05GSUdfU0NTSV9OQ1I1M0M4WFhfTk9fV09SRF9UUkFOU0ZFUlMKKy8qIE9ubHkgOCBvciAzMiBiaXQgdHJhbnNmZXJzIGFsbG93ZWQgKi8KKyNkZWZpbmUgSU5XX09GRihvKQkJKHJlYWRiKChjaGFyIF9faW9tZW0gKilucC0+cmVnICsgbmNyX29mZncobykpIDw8IDggfCByZWFkYigoY2hhciBfX2lvbWVtICopbnAtPnJlZyArIG5jcl9vZmZ3KG8pICsgMSkpCisjZWxzZQorI2RlZmluZSBJTldfT0ZGKG8pCQlyZWFkd19yYXcoKGNoYXIgX19pb21lbSAqKW5wLT5yZWcgKyBuY3Jfb2ZmdyhvKSkKKyNlbmRpZgorI2RlZmluZSBJTkxfT0ZGKG8pCQlyZWFkbF9yYXcoKGNoYXIgX19pb21lbSAqKW5wLT5yZWcgKyAobykpCisKKyNpZmRlZiBDT05GSUdfU0NTSV9OQ1I1M0M4WFhfTk9fV09SRF9UUkFOU0ZFUlMKKy8qIE9ubHkgOCBvciAzMiBiaXQgdHJhbnNmZXJzIGFsbG93ZWQgKi8KKyNkZWZpbmUgT1VUV19PRkYobywgdmFsKQlkbyB7IHdyaXRlYigoY2hhcikoKHZhbCkgPj4gOCksIChjaGFyIF9faW9tZW0gKilucC0+cmVnICsgbmNyX29mZncobykpOyB3cml0ZWIoKGNoYXIpKHZhbCksIChjaGFyIF9faW9tZW0gKilucC0+cmVnICsgbmNyX29mZncobykgKyAxKTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIE9VVFdfT0ZGKG8sIHZhbCkJd3JpdGV3X3JhdygodmFsKSwgKGNoYXIgX19pb21lbSAqKW5wLT5yZWcgKyBuY3Jfb2ZmdyhvKSkKKyNlbmRpZgorI2RlZmluZSBPVVRMX09GRihvLCB2YWwpCXdyaXRlbF9yYXcoKHZhbCksIChjaGFyIF9faW9tZW0gKilucC0+cmVnICsgKG8pKQorCisjZW5kaWYKKworI2RlZmluZSBJTkIocikJCUlOQl9PRkYgKG9mZnNldG9mKHN0cnVjdCBuY3JfcmVnLHIpKQorI2RlZmluZSBJTlcocikJCUlOV19PRkYgKG9mZnNldG9mKHN0cnVjdCBuY3JfcmVnLHIpKQorI2RlZmluZSBJTkwocikJCUlOTF9PRkYgKG9mZnNldG9mKHN0cnVjdCBuY3JfcmVnLHIpKQorCisjZGVmaW5lIE9VVEIociwgdmFsKQlPVVRCX09GRiAob2Zmc2V0b2Yoc3RydWN0IG5jcl9yZWcsciksICh2YWwpKQorI2RlZmluZSBPVVRXKHIsIHZhbCkJT1VUV19PRkYgKG9mZnNldG9mKHN0cnVjdCBuY3JfcmVnLHIpLCAodmFsKSkKKyNkZWZpbmUgT1VUTChyLCB2YWwpCU9VVExfT0ZGIChvZmZzZXRvZihzdHJ1Y3QgbmNyX3JlZyxyKSwgKHZhbCkpCisKKy8qCisgKiAgU2V0IGJpdCBmaWVsZCBPTiwgT0ZGIAorICovCisKKyNkZWZpbmUgT1VUT05CKHIsIG0pCU9VVEIociwgSU5CKHIpIHwgKG0pKQorI2RlZmluZSBPVVRPRkZCKHIsIG0pCU9VVEIociwgSU5CKHIpICYgfihtKSkKKyNkZWZpbmUgT1VUT05XKHIsIG0pCU9VVFcociwgSU5XKHIpIHwgKG0pKQorI2RlZmluZSBPVVRPRkZXKHIsIG0pCU9VVFcociwgSU5XKHIpICYgfihtKSkKKyNkZWZpbmUgT1VUT05MKHIsIG0pCU9VVEwociwgSU5MKHIpIHwgKG0pKQorI2RlZmluZSBPVVRPRkZMKHIsIG0pCU9VVEwociwgSU5MKHIpICYgfihtKSkKKworLyoKKyAqICBXZSBub3JtYWxseSB3YW50IHRoZSBjaGlwIHRvIGhhdmUgYSBjb25zaXN0ZW50IHZpZXcKKyAqICBvZiBkcml2ZXIgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHdoZW4gd2UgcmVzdGFydCBpdC4KKyAqICBUaHVzIHRoZXNlIG1hY3Jvcy4KKyAqLworI2RlZmluZSBPVVRMX0RTUCh2KQkJCQlcCisJZG8gewkJCQkJXAorCQlNRU1PUllfQkFSUklFUigpOwkJXAorCQlPVVRMIChuY19kc3AsICh2KSk7CQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBPVVRPTkJfU1REKCkJCQkJXAorCWRvIHsJCQkJCVwKKwkJTUVNT1JZX0JBUlJJRVIoKTsJCVwKKwkJT1VUT05CIChuY19kY250bCwgKFNURHxOT0NPTSkpOwlcCisJfSB3aGlsZSAoMCkKKworCisvKgorKiogICBOQ1I1M0M4WFggZGV2aWNlcyBmZWF0dXJlcyB0YWJsZS4KKyovCitzdHJ1Y3QgbmNyX2NoaXAgeworCXVuc2lnbmVkIHNob3J0CXJldmlzaW9uX2lkOworCXVuc2lnbmVkIGNoYXIJYnVyc3RfbWF4OwkvKiBsb2ctYmFzZS0yIG9mIG1heCBidXJzdCAqLworCXVuc2lnbmVkIGNoYXIJb2Zmc2V0X21heDsKKwl1bnNpZ25lZCBjaGFyCW5yX2Rpdmlzb3I7CisJdW5zaWduZWQgaW50CWZlYXR1cmVzOworI2RlZmluZSBGRV9MRUQwCQkoMTw8MCkKKyNkZWZpbmUgRkVfV0lERQkJKDE8PDEpICAgIC8qIFdpZGUgZGF0YSB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgRkVfVUxUUkEJKDE8PDIpCSAgLyogVWx0cmEgc3BlZWQgMjBNdHJhbnMvc2VjICovCisjZGVmaW5lIEZFX0RCTFIJCSgxPDw0KQkgIC8qIENsb2NrIGRvdWJsZXIgcHJlc2VudCAqLworI2RlZmluZSBGRV9RVUFECQkoMTw8NSkJICAvKiBDbG9jayBxdWFkcnVwbGVyIHByZXNlbnQgKi8KKyNkZWZpbmUgRkVfRVJMCQkoMTw8NikgICAgLyogRW5hYmxlIHJlYWQgbGluZSAqLworI2RlZmluZSBGRV9DTFNFCQkoMTw8NykgICAgLyogQ2FjaGUgbGluZSBzaXplIGVuYWJsZSAqLworI2RlZmluZSBGRV9XUklFCQkoMTw8OCkgICAgLyogV3JpdGUgJiBJbnZhbGlkYXRlIGVuYWJsZSAqLworI2RlZmluZSBGRV9FUk1QCQkoMTw8OSkgICAgLyogRW5hYmxlIHJlYWQgbXVsdGlwbGUgKi8KKyNkZWZpbmUgRkVfQk9GCQkoMTw8MTApICAgLyogQnVyc3Qgb3Bjb2RlIGZldGNoICovCisjZGVmaW5lIEZFX0RGUwkJKDE8PDExKSAgIC8qIERNQSBmaWZvIHNpemUgKi8KKyNkZWZpbmUgRkVfUEZFTgkJKDE8PDEyKSAgIC8qIFByZWZldGNoIGVuYWJsZSAqLworI2RlZmluZSBGRV9MRFNUUgkoMTw8MTMpICAgLyogTG9hZC9TdG9yZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRkVfUkFNCQkoMTw8MTQpICAgLyogT24gY2hpcCBSQU0gcHJlc2VudCAqLworI2RlZmluZSBGRV9WQVJDTEsJKDE8PDE1KSAgIC8qIFNDU0kgY2xvY2sgbWF5IHZhcnkgKi8KKyNkZWZpbmUgRkVfUkFNOEsJKDE8PDE2KSAgIC8qIE9uIGNoaXAgUkFNIHNpemVkIDhLYiAqLworI2RlZmluZSBGRV82NEJJVAkoMTw8MTcpICAgLyogSGF2ZSBhIDY0LWJpdCBQQ0kgaW50ZXJmYWNlICovCisjZGVmaW5lIEZFX0lPMjU2CSgxPDwxOCkgICAvKiBSZXF1aXJlcyBmdWxsIDI1NiBieXRlcyBpbiBQQ0kgc3BhY2UgKi8KKyNkZWZpbmUgRkVfTk9QTQkJKDE8PDE5KSAgIC8qIFNjcmlwdHMgaGFuZGxlcyBwaGFzZSBtaXNtYXRjaCAqLworI2RlZmluZSBGRV9MRURDCQkoMTw8MjApICAgLyogSGFyZHdhcmUgY29udHJvbCBvZiBMRUQgKi8KKyNkZWZpbmUgRkVfRElGRgkJKDE8PDIxKSAgIC8qIFN1cHBvcnQgRGlmZmVyZW50aWFsIFNDU0kgKi8KKyNkZWZpbmUgRkVfNjZNSFogCSgxPDwyMykgICAvKiA2Nk1IeiBQQ0kgU3VwcG9ydCAqLworI2RlZmluZSBGRV9EQUMJIAkoMTw8MjQpICAgLyogU3VwcG9ydCBEQUMgY3ljbGVzICg2NCBiaXQgYWRkcmVzc2luZykgKi8KKyNkZWZpbmUgRkVfSVNUQVQxIAkoMTw8MjUpICAgLyogSGF2ZSBJU1RBVDEsIE1CT1gwLCBNQk9YMSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRkVfREFDX0lOX1VTRQkoMTw8MjYpCSAgLyogUGxhdGZvcm0gZG9lcyBEQUMgY3ljbGVzICovCisjZGVmaW5lIEZFX0VIUAkJKDE8PDI3KSAgIC8qIDcyMDogRXZlbiBob3N0IHBhcml0eSAqLworI2RlZmluZSBGRV9NVVgJCSgxPDwyOCkgICAvKiA3MjA6IE11bHRpcGxleGVkIGJ1cyAqLworI2RlZmluZSBGRV9FQQkJKDE8PDI5KSAgIC8qIDcyMDogRW5hYmxlIEFjayAqLworCisjZGVmaW5lIEZFX0NBQ0hFX1NFVAkoRkVfRVJMfEZFX0NMU0V8RkVfV1JJRXxGRV9FUk1QKQorI2RlZmluZSBGRV9TQ1NJX1NFVAkoRkVfV0lERXxGRV9VTFRSQXxGRV9EQkxSfEZFX1FVQUR8Rl9DTEs4MCkKKyNkZWZpbmUgRkVfU1BFQ0lBTF9TRVQJKEZFX0NBQ0hFX1NFVHxGRV9CT0Z8RkVfREZTfEZFX0xEU1RSfEZFX1BGRU58RkVfUkFNKQorfTsKKworCisvKgorKioJRHJpdmVyIHNldHVwIHN0cnVjdHVyZS4KKyoqCisqKglUaGlzIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCBmcm9tIGxpbnV4IGNvbmZpZyBvcHRpb25zLgorKioJSXQgY2FuIGJlIG92ZXJyaWRkZW4gYXQgYm9vdC11cCBieSB0aGUgYm9vdCBjb21tYW5kIGxpbmUuCisqLworI2RlZmluZSBTQ1NJX05DUl9NQVhfRVhDTFVERVMgOAorc3RydWN0IG5jcl9kcml2ZXJfc2V0dXAgeworCXU4CW1hc3Rlcl9wYXJpdHk7CisJdTgJc2NzaV9wYXJpdHk7CisJdTgJZGlzY29ubmVjdGlvbjsKKwl1OAlzcGVjaWFsX2ZlYXR1cmVzOworCXU4CWZvcmNlX3N5bmNfbmVnbzsKKwl1OAlyZXZlcnNlX3Byb2JlOworCXU4CXBjaV9maXhfdXA7CisJdTgJdXNlX252cmFtOworCXU4CXZlcmJvc2U7CisJdTgJZGVmYXVsdF90YWdzOworCXUxNglkZWZhdWx0X3N5bmM7CisJdTE2CWRlYnVnOworCXU4CWJ1cnN0X21heDsKKwl1OAlsZWRfcGluOworCXU4CW1heF93aWRlOworCXU4CXNldHRsZV9kZWxheTsKKwl1OAlkaWZmX3N1cHBvcnQ7CisJdTgJaXJxbTsKKwl1OAlidXNfY2hlY2s7CisJdTgJb3B0aW1pemU7CisJdTgJcmVjb3Zlcnk7CisJdTgJaG9zdF9pZDsKKwl1MTYJaWFyYjsKKwl1MzIJZXhjbHVkZXNbU0NTSV9OQ1JfTUFYX0VYQ0xVREVTXTsKKwljaGFyCXRhZ19jdHJsWzEwMF07Cit9OworCisvKgorKioJSW5pdGlhbCBzZXR1cC4KKyoqCUNhbiBiZSBvdmVycmlkZW4gYXQgc3RhcnR1cCBieSBhIGNvbW1hbmQgbGluZS4KKyovCisjZGVmaW5lIFNDU0lfTkNSX0RSSVZFUl9TRVRVUAkJCVwKK3sJCQkJCQlcCisJU0NTSV9OQ1JfU0VUVVBfTUFTVEVSX1BBUklUWSwJCVwKKwlTQ1NJX05DUl9TRVRVUF9TQ1NJX1BBUklUWSwJCVwKKwlTQ1NJX05DUl9TRVRVUF9ESVNDT05ORUNUSU9OLAkJXAorCVNDU0lfTkNSX1NFVFVQX1NQRUNJQUxfRkVBVFVSRVMsCVwKKwlTQ1NJX05DUl9TRVRVUF9GT1JDRV9TWU5DX05FR08sCQlcCisJMCwJCQkJCVwKKwkwLAkJCQkJXAorCTEsCQkJCQlcCisJMCwJCQkJCVwKKwlTQ1NJX05DUl9TRVRVUF9ERUZBVUxUX1RBR1MsCQlcCisJU0NTSV9OQ1JfU0VUVVBfREVGQVVMVF9TWU5DLAkJXAorCTB4MDAsCQkJCQlcCisJNywJCQkJCVwKKwkwLAkJCQkJXAorCTEsCQkJCQlcCisJU0NTSV9OQ1JfU0VUVVBfU0VUVExFX1RJTUUsCQlcCisJMCwJCQkJCVwKKwkwLAkJCQkJXAorCTEsCQkJCQlcCisJMCwJCQkJCVwKKwkwLAkJCQkJXAorCTI1NSwJCQkJCVwKKwkweDAwCQkJCQlcCit9CisKKy8qCisqKglCb290IGZhaWwgc2FmZSBzZXR1cC4KKyoqCU92ZXJyaWRlIGluaXRpYWwgc2V0dXAgZnJvbSBib290IGNvbW1hbmQgbGluZToKKyoqCW5jcjUzYzh4eD1zYWZlOnkKKyovCisjZGVmaW5lIFNDU0lfTkNSX0RSSVZFUl9TQUZFX1NFVFVQCQlcCit7CQkJCQkJXAorCTAsCQkJCQlcCisJMSwJCQkJCVwKKwkwLAkJCQkJXAorCTAsCQkJCQlcCisJMCwJCQkJCVwKKwkwLAkJCQkJXAorCTAsCQkJCQlcCisJMSwJCQkJCVwKKwkyLAkJCQkJXAorCTAsCQkJCQlcCisJMjU1LAkJCQkJXAorCTB4MDAsCQkJCQlcCisJMjU1LAkJCQkJXAorCTAsCQkJCQlcCisJMCwJCQkJCVwKKwkxMCwJCQkJCVwKKwkxLAkJCQkJXAorCTEsCQkJCQlcCisJMSwJCQkJCVwKKwkwLAkJCQkJXAorCTAsCQkJCQlcCisJMjU1CQkJCQlcCit9CisKKy8qKioqKioqKioqKioqKioqIE9SSUdJTkFMIENPTlRFTlQgb2YgbmNycmVnLmggZnJvbSBGcmVlQlNEICoqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqCVRoZSBuY3IgNTNjODEwIHJlZ2lzdGVyIHN0cnVjdHVyZS4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitzdHJ1Y3QgbmNyX3JlZyB7CisvKjAwKi8gIHU4CW5jX3NjbnRsMDsgICAgLyogZnVsbCBhcmIuLCBlbmEgcGFyaXR5LCBwYXItPkFUTiAgKi8KKworLyowMSovICB1OAluY19zY250bDE7ICAgIC8qIG5vIHJlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBJU0NPTiAgIDB4MTAgIC8qIGNvbm5lY3RlZCB0byBzY3NpCQkgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIENSU1QgICAgMHgwOCAgLyogZm9yY2UgcmVzZXQgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIElBUkIgICAgMHgwMiAgLyogaW1tZWRpYXRlIGFyYml0cmF0aW9uICAgICAgICAgICAgKi8KKworLyowMiovICB1OAluY19zY250bDI7ICAgIC8qIG5vIGRpc2Nvbm5lY3QgZXhwZWN0ZWQgICAgICAgICAgICovCisJI2RlZmluZSAgIFNEVSAgICAgMHg4MCAgLyogY21kOiBkaXNjb25uZWN0IHdpbGwgcmFpc2UgZXJyb3IgKi8KKwkjZGVmaW5lICAgQ0hNICAgICAweDQwICAvKiBzdGE6IGNoYWluZWQgbW9kZSAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBXU1MgICAgIDB4MDggIC8qIHN0YTogd2lkZSBzY3NpIHNlbmQgICAgICAgICAgIFtXXSovCisJI2RlZmluZSAgIFdTUiAgICAgMHgwMSAgLyogc3RhOiB3aWRlIHNjc2kgcmVjZWl2ZWQgICAgICAgW1ddKi8KKworLyowMyovICB1OAluY19zY250bDM7ICAgIC8qIGNuZiBzeXN0ZW0gY2xvY2sgZGVwZW5kZW50ICAgICAgICovCisJI2RlZmluZSAgIEVXUyAgICAgMHgwOCAgLyogY21kOiBlbmFibGUgd2lkZSBzY3NpICAgICAgICAgW1ddKi8KKwkjZGVmaW5lICAgVUxUUkEgICAweDgwICAvKiBjbWQ6IFVMVFJBIGVuYWJsZSAgICAgICAgICAgICAgICAqLworCQkJCS8qIGJpdHMgMC0yLCA3IHJzdmQgZm9yIEMxMDEwICAgICAgICovCisKKy8qMDQqLyAgdTgJbmNfc2NpZDsJLyogY25mIGhvc3QgYWRhcHRlciBzY3NpIGFkZHJlc3MgICAgKi8KKwkjZGVmaW5lICAgUlJFICAgICAweDQwICAvKiByL3c6ZSBlbmFibGUgcmVzcG9uc2UgdG8gcmVzZWwuICAqLworCSNkZWZpbmUgICBTUkUgICAgIDB4MjAgIC8qIHIvdzplIGVuYWJsZSByZXNwb25zZSB0byBzZWxlY3QgICovCisKKy8qMDUqLyAgdTgJbmNfc3hmZXI7CS8qICMjIyBTeW5jIHNwZWVkIGFuZCBjb3VudCAgICAgICAgICovCisJCQkJLyogYml0cyA2LTcgcnN2ZCBmb3IgQzEwMTAgICAgICAgICAgKi8KKworLyowNiovICB1OAluY19zZGlkOwkvKiAjIyMgRGVzdGluYXRpb24tSUQgICAgICAgICAgICAgICAqLworCisvKjA3Ki8gIHU4CW5jX2dwcmVnOwkvKiA/Pz8gSU8tUGlucyAgICAgICAgICAgICAgICAgICAgICAqLworCisvKjA4Ki8gIHU4CW5jX3NmYnI7CS8qICMjIyBGaXJzdCBieXRlIGluIHBoYXNlICAgICAgICAgICovCisKKy8qMDkqLyAgdTgJbmNfc29jbDsKKwkjZGVmaW5lICAgQ1JFUQkgIDB4ODAJLyogci93OiBTQ1NJLVJFUSAgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgQ0FDSwkgIDB4NDAJLyogci93OiBTQ1NJLUFDSyAgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgQ0JTWQkgIDB4MjAJLyogci93OiBTQ1NJLUJTWSAgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgQ1NFTAkgIDB4MTAJLyogci93OiBTQ1NJLVNFTCAgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgQ0FUTgkgIDB4MDgJLyogci93OiBTQ1NJLUFUTiAgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgQ01TRwkgIDB4MDQJLyogci93OiBTQ1NJLU1TRyAgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgQ0NfRAkgIDB4MDIJLyogci93OiBTQ1NJLUNfRCAgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgQ0lfTwkgIDB4MDEJLyogci93OiBTQ1NJLUlfTyAgICAgICAgICAgICAgICAgICAgKi8KKworLyowYSovICB1OAluY19zc2lkOworCisvKjBiKi8gIHU4CW5jX3NiY2w7CisKKy8qMGMqLyAgdTgJbmNfZHN0YXQ7CisgICAgICAgICNkZWZpbmUgICBERkUgICAgIDB4ODAgIC8qIHN0YTogZG1hIGZpZm8gZW1wdHkgICAgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBNRFBFICAgIDB4NDAgIC8qIGludDogbWFzdGVyIGRhdGEgcGFyaXR5IGVycm9yICAgICovCisgICAgICAgICNkZWZpbmUgICBCRiAgICAgIDB4MjAgIC8qIGludDogc2NyaXB0OiBidXMgZmF1bHQgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBBQlJUICAgIDB4MTAgIC8qIGludDogc2NyaXB0OiBjb21tYW5kIGFib3J0ZWQgICAgICovCisgICAgICAgICNkZWZpbmUgICBTU0kgICAgIDB4MDggIC8qIGludDogc2NyaXB0OiBzaW5nbGUgc3RlcCAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBTSVIgICAgIDB4MDQgIC8qIGludDogc2NyaXB0OiBpbnRlcnJ1cHQgaW5zdHJ1Y3QuICovCisgICAgICAgICNkZWZpbmUgICBJSUQgICAgIDB4MDEgIC8qIGludDogc2NyaXB0OiBpbGxlZ2FsIGluc3RydWN0LiAgICovCisKKy8qMGQqLyAgdTgJbmNfc3N0YXQwOworICAgICAgICAjZGVmaW5lICAgSUxGICAgICAweDgwICAvKiBzdGE6IGRhdGEgaW4gU0lETCByZWdpc3RlciBsc2IgICAqLworICAgICAgICAjZGVmaW5lICAgT1JGICAgICAweDQwICAvKiBzdGE6IGRhdGEgaW4gU09EUiByZWdpc3RlciBsc2IgICAqLworICAgICAgICAjZGVmaW5lICAgT0xGICAgICAweDIwICAvKiBzdGE6IGRhdGEgaW4gU09ETCByZWdpc3RlciBsc2IgICAqLworICAgICAgICAjZGVmaW5lICAgQUlQICAgICAweDEwICAvKiBzdGE6IGFyYml0cmF0aW9uIGluIHByb2dyZXNzICAgICAqLworICAgICAgICAjZGVmaW5lICAgTE9BICAgICAweDA4ICAvKiBzdGE6IGFyYml0cmF0aW9uIGxvc3QgICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgV09BICAgICAweDA0ICAvKiBzdGE6IGFyYml0cmF0aW9uIHdvbiAgICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgSVJTVCAgICAweDAyICAvKiBzdGE6IHNjc2kgcmVzZXQgc2lnbmFsICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgU0RQICAgICAweDAxICAvKiBzdGE6IHNjc2kgcGFyaXR5IHNpZ25hbCAgICAgICAgICAqLworCisvKjBlKi8gIHU4CW5jX3NzdGF0MTsKKwkjZGVmaW5lICAgRkYzMjEwICAweGYwCS8qIHN0YTogYnl0ZXMgaW4gdGhlIHNjc2kgZmlmbyAgICAgICovCisKKy8qMGYqLyAgdTgJbmNfc3N0YXQyOworICAgICAgICAjZGVmaW5lICAgSUxGMSAgICAweDgwICAvKiBzdGE6IGRhdGEgaW4gU0lETCByZWdpc3RlciBtc2JbV10qLworICAgICAgICAjZGVmaW5lICAgT1JGMSAgICAweDQwICAvKiBzdGE6IGRhdGEgaW4gU09EUiByZWdpc3RlciBtc2JbV10qLworICAgICAgICAjZGVmaW5lICAgT0xGMSAgICAweDIwICAvKiBzdGE6IGRhdGEgaW4gU09ETCByZWdpc3RlciBtc2JbV10qLworICAgICAgICAjZGVmaW5lICAgRE0gICAgICAweDA0ICAvKiBzdGE6IERJRkZTRU5TIG1pc21hdGNoICg4OTUvNiBvbmx5KSAqLworICAgICAgICAjZGVmaW5lICAgTERTQyAgICAweDAyICAvKiBzdGE6IGRpc2Nvbm5lY3QgJiByZWNvbm5lY3QgICAgICAqLworCisvKjEwKi8gIHU4CW5jX2RzYTsJLyogLS0+IEJhc2UgcGFnZSAgICAgICAgICAgICAgICAgICAgKi8KKy8qMTEqLyAgdTgJbmNfZHNhMTsKKy8qMTIqLyAgdTgJbmNfZHNhMjsKKy8qMTMqLyAgdTgJbmNfZHNhMzsKKworLyoxNCovICB1OAluY19pc3RhdDsJLyogLS0+IE1haW4gQ29tbWFuZCBhbmQgc3RhdHVzICAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIENBQlJUICAgMHg4MCAgLyogY21kOiBhYm9ydCBjdXJyZW50IG9wZXJhdGlvbiAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIFNSU1QgICAgMHg0MCAgLyogbW9kOiByZXNldCBjaGlwICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIFNJR1AgICAgMHgyMCAgLyogci93OiBtZXNzYWdlIGZyb20gaG9zdCB0byBuY3IgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIFNFTSAgICAgMHgxMCAgLyogci93OiBtZXNzYWdlIGJldHdlZW4gaG9zdCArIG5jciAgKi8KKyAgICAgICAgI2RlZmluZSAgIENPTiAgICAgMHgwOCAgLyogc3RhOiBjb25uZWN0ZWQgdG8gc2NzaSAgICAgICAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIElOVEYgICAgMHgwNCAgLyogc3RhOiBpbnQgb24gdGhlIGZseSAocmVzZXQgYnkgd3IpKi8KKyAgICAgICAgI2RlZmluZSAgIFNJUCAgICAgMHgwMiAgLyogc3RhOiBzY3NpLWludGVycnVwdCAgICAgICAgICAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIERJUCAgICAgMHgwMSAgLyogc3RhOiBob3N0L3NjcmlwdCBpbnRlcnJ1cHQgICAgICAgKi8KKworLyoxNSovICB1OAluY19pc3RhdDE7CS8qIDg5NiBhbmQgbGF0ZXIgY29yZXMgb25seSAqLworICAgICAgICAjZGVmaW5lICAgRkxTSCAgICAweDA0ICAvKiBzdGE6IGNoaXAgaXMgZmx1c2hpbmcgICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgU1JVTiAgICAweDAyICAvKiBzdGE6IHNjcmlwdHMgYXJlIHJ1bm5pbmcgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgU0lSUUQgICAweDAxICAvKiByL3c6IGRpc2FibGUgSU5UIHBpbiAgICAgICAgICAgICAqLworCisvKjE2Ki8gIHU4CW5jX21ib3gwOwkvKiA4OTYgYW5kIGxhdGVyIGNvcmVzIG9ubHkgKi8KKy8qMTcqLyAgdTgJbmNfbWJveDE7CS8qIDg5NiBhbmQgbGF0ZXIgY29yZXMgb25seSAqLworCisvKjE4Ki8JdTgJbmNfY3Rlc3QwOworCSNkZWZpbmUgICBFSFAgICAgIDB4MDQJLyogNzIwIGV2ZW4gaG9zdCBwYXJpdHkgICAgICAgICAgICAgKi8KKy8qMTkqLyAgdTgJbmNfY3Rlc3QxOworCisvKjFhKi8gIHU4CW5jX2N0ZXN0MjsKKwkjZGVmaW5lICAgQ1NJR1AgICAweDQwCisJCQkJLyogYml0cyAwLTIsNyByc3ZkIGZvciBDMTAxMCAgICAgICAgKi8KKworLyoxYiovICB1OAluY19jdGVzdDM7CisJI2RlZmluZSAgIEZMRiAgICAgMHgwOCAgLyogY21kOiBmbHVzaCBkbWEgZmlmbyAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgQ0xGCSAgMHgwNAkvKiBjbWQ6IGNsZWFyIGRtYSBmaWZvCQkgICAgKi8KKwkjZGVmaW5lICAgRk0gICAgICAweDAyICAvKiBtb2Q6IGZldGNoIHBpbiBtb2RlICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBXUklFICAgIDB4MDEgIC8qIG1vZDogd3JpdGUgYW5kIGludmFsaWRhdGUgZW5hYmxlICovCisJCQkJLyogYml0cyA0LTcgcnN2ZCBmb3IgQzEwMTAgICAgICAgICAgKi8KKworLyoxYyovICB1MzIgICAgbmNfdGVtcDsJLyogIyMjIFRlbXBvcmFyeSBzdGFjayAgICAgICAgICAgICAgKi8KKworLyoyMCovCXU4CW5jX2RmaWZvOworLyoyMSovICB1OAluY19jdGVzdDQ7CisJI2RlZmluZSAgIE1VWCAgICAgMHg4MCAgLyogNzIwIGhvc3QgYnVzIG11bHRpcGxleCBtb2RlICAgICAgKi8KKwkjZGVmaW5lICAgQkRJUyAgICAweDgwICAvKiBtb2Q6IGJ1cnN0IGRpc2FibGUgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBNUEVFICAgIDB4MDggIC8qIG1vZDogbWFzdGVyIHBhcml0eSBlcnJvciBlbmFibGUgICovCisKKy8qMjIqLyAgdTgJbmNfY3Rlc3Q1OworCSNkZWZpbmUgICBERlMgICAgIDB4MjAgIC8qIG1vZDogZG1hIGZpZm8gc2l6ZSAgICAgICAgICAgICAgICovCisJCQkJLyogYml0cyAwLTEsIDMtNyByc3ZkIGZvciBDMTAxMCAgICAgICAgICAqLworLyoyMyovICB1OAluY19jdGVzdDY7CisKKy8qMjQqLyAgdTMyICAgIG5jX2RiYzsJLyogIyMjIEJ5dGUgY291bnQgYW5kIGNvbW1hbmQgICAgICAgKi8KKy8qMjgqLyAgdTMyICAgIG5jX2RuYWQ7CS8qICMjIyBOZXh0IGNvbW1hbmQgcmVnaXN0ZXIgICAgICAgICovCisvKjJjKi8gIHUzMiAgICBuY19kc3A7CS8qIC0tPiBTY3JpcHQgUG9pbnRlciAgICAgICAgICAgICAgICovCisvKjMwKi8gIHUzMiAgICBuY19kc3BzOwkvKiAtLT4gU2NyaXB0IHBvaW50ZXIgc2F2ZS9vcGNvZGUjMiAqLworCisvKjM0Ki8gIHU4CW5jX3NjcmF0Y2hhOyAgLyogVGVtcG9yYXJ5IHJlZ2lzdGVyIGEgICAgICAgICAgICAqLworLyozNSovICB1OAluY19zY3JhdGNoYTE7CisvKjM2Ki8gIHU4CW5jX3NjcmF0Y2hhMjsKKy8qMzcqLyAgdTgJbmNfc2NyYXRjaGEzOworCisvKjM4Ki8gIHU4CW5jX2Rtb2RlOworCSNkZWZpbmUgICBCTF8yICAgIDB4ODAgIC8qIG1vZDogYnVyc3QgbGVuZ3RoIHNoaWZ0IHZhbHVlICsyICovCisJI2RlZmluZSAgIEJMXzEgICAgMHg0MCAgLyogbW9kOiBidXJzdCBsZW5ndGggc2hpZnQgdmFsdWUgKzEgKi8KKwkjZGVmaW5lICAgRVJMICAgICAweDA4ICAvKiBtb2Q6IGVuYWJsZSByZWFkIGxpbmUgICAgICAgICAgICAqLworCSNkZWZpbmUgICBFUk1QICAgIDB4MDQgIC8qIG1vZDogZW5hYmxlIHJlYWQgbXVsdGlwbGUgICAgICAgICovCisJI2RlZmluZSAgIEJPRiAgICAgMHgwMiAgLyogbW9kOiBidXJzdCBvcCBjb2RlIGZldGNoICAgICAgICAgKi8KKworLyozOSovICB1OAluY19kaWVuOworLyozYSovICB1OAluY19zYnI7CisKKy8qM2IqLyAgdTgJbmNfZGNudGw7CS8qIC0tPiBTY3JpcHQgZXhlY3V0aW9uIGNvbnRyb2wgICAgICovCisJI2RlZmluZSAgIENMU0UgICAgMHg4MCAgLyogbW9kOiBjYWNoZSBsaW5lIHNpemUgZW5hYmxlICAgICAgKi8KKwkjZGVmaW5lICAgUEZGICAgICAweDQwICAvKiBjbWQ6IHByZS1mZXRjaCBmbHVzaCAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBQRkVOICAgIDB4MjAgIC8qIG1vZDogcHJlLWZldGNoIGVuYWJsZSAgICAgICAgICAgICovCisJI2RlZmluZSAgIEVBICAgICAgMHgyMCAgLyogbW9kOiA3MjAgZW5hYmxlLWFjayAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgU1NNICAgICAweDEwICAvKiBtb2Q6IHNpbmdsZSBzdGVwIG1vZGUgICAgICAgICAgICAqLworCSNkZWZpbmUgICBJUlFNICAgIDB4MDggIC8qIG1vZDogaXJxIG1vZGUgKDEgPSB0b3RlbSBwb2xlICEpICovCisJI2RlZmluZSAgIFNURCAgICAgMHgwNCAgLyogY21kOiBzdGFydCBkbWEgbW9kZSAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgSVJRRCAgICAweDAyICAvKiBtb2Q6IGlycSBkaXNhYmxlICAgICAgICAgICAgICAgICAqLworIAkjZGVmaW5lCSAgTk9DT00gICAweDAxCS8qIGNtZDogcHJvdGVjdCBzZmJyIHdoaWxlIHJlc2VsZWN0ICovCisJCQkJLyogYml0cyAwLTEgcnN2ZCBmb3IgQzEwMTAgICAgICAgICAgKi8KKworLyozYyovICB1MzIJbmNfYWRkZXI7CisKKy8qNDAqLyAgdTE2CW5jX3NpZW47CS8qIC0tPjogaW50ZXJydXB0IGVuYWJsZSAgICAgICAgICAgICovCisvKjQyKi8gIHUxNgluY19zaXN0OwkvKiA8LS06IGludGVycnVwdCBzdGF0dXMgICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgU0JNQyAgICAweDEwMDAvKiBzdGE6IFNDU0kgQnVzIE1vZGUgQ2hhbmdlICg4OTUvNiBvbmx5KSAqLworICAgICAgICAjZGVmaW5lICAgU1RPICAgICAweDA0MDAvKiBzdGE6IHRpbWVvdXQgKHNlbGVjdCkgICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgR0VOICAgICAweDAyMDAvKiBzdGE6IHRpbWVvdXQgKGdlbmVyYWwpICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgSFRIICAgICAweDAxMDAvKiBzdGE6IHRpbWVvdXQgKGhhbmRzaGFrZSkgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgTUEgICAgICAweDgwICAvKiBzdGE6IHBoYXNlIG1pc21hdGNoICAgICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgQ01QICAgICAweDQwICAvKiBzdGE6IGFyYml0cmF0aW9uIGNvbXBsZXRlICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgU0VMICAgICAweDIwICAvKiBzdGE6IHNlbGVjdGVkIGJ5IGFub3RoZXIgZGV2aWNlICAqLworICAgICAgICAjZGVmaW5lICAgUlNMICAgICAweDEwICAvKiBzdGE6IHJlc2VsZWN0ZWQgYnkgYW5vdGhlciBkZXZpY2UqLworICAgICAgICAjZGVmaW5lICAgU0dFICAgICAweDA4ICAvKiBzdGE6IGdyb3NzIGVycm9yIChvdmVyL3VuZGVyZmxvdykqLworICAgICAgICAjZGVmaW5lICAgVURDICAgICAweDA0ICAvKiBzdGE6IHVuZXhwZWN0ZWQgZGlzY29ubmVjdCAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgUlNUICAgICAweDAyICAvKiBzdGE6IHNjc2kgYnVzIHJlc2V0IGRldGVjdGVkICAgICAqLworICAgICAgICAjZGVmaW5lICAgUEFSICAgICAweDAxICAvKiBzdGE6IHNjc2kgcGFyaXR5IGVycm9yICAgICAgICAgICAqLworCisvKjQ0Ki8gIHU4CW5jX3NscGFyOworLyo0NSovICB1OAluY19zd2lkZTsKKy8qNDYqLyAgdTgJbmNfbWFjbnRsOworLyo0NyovICB1OAluY19ncGNudGw7CisvKjQ4Ki8gIHU4CW5jX3N0aW1lMDsgICAgLyogY21kOiB0aW1lb3V0IGZvciBzZWxlY3QmaGFuZHNoYWtlKi8KKy8qNDkqLyAgdTgJbmNfc3RpbWUxOyAgICAvKiBjbWQ6IHRpbWVvdXQgdXNlciBkZWZpbmVkICAgICAgICAqLworLyo0YSovICB1MTYgICBuY19yZXNwaWQ7ICAgIC8qIHN0YTogUmVzZWxlY3QtSURzICAgICAgICAgICAgICAgICovCisKKy8qNGMqLyAgdTgJbmNfc3Rlc3QwOworCisvKjRkKi8gIHU4CW5jX3N0ZXN0MTsKKwkjZGVmaW5lICAgU0NMSyAgICAweDgwCS8qIFVzZSB0aGUgUENJIGNsb2NrIGFzIFNDU0kgY2xvY2sJKi8KKwkjZGVmaW5lICAgREJMRU4gICAweDA4CS8qIGNsb2NrIGRvdWJsZXIgcnVubmluZwkJKi8KKwkjZGVmaW5lICAgREJMU0VMICAweDA0CS8qIGNsb2NrIGRvdWJsZXIgc2VsZWN0ZWQJCSovCisgIAorCisvKjRlKi8gIHU4CW5jX3N0ZXN0MjsKKwkjZGVmaW5lICAgUk9GICAgICAweDQwCS8qIHJlc2V0IHNjc2kgb2Zmc2V0IChhZnRlciBncm9zcyBlcnJvciEpICovCisJI2RlZmluZSAgIERJRiAgICAgMHgyMCAgLyogNzIwIFNDU0kgZGlmZmVyZW50aWFsIG1vZGUgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgRVhUICAgICAweDAyICAvKiBleHRlbmRlZCBmaWx0ZXJpbmcgICAgICAgICAgICAgICAgICAgICAqLworCisvKjRmKi8gIHU4CW5jX3N0ZXN0MzsKKwkjZGVmaW5lICAgVEUgICAgIDB4ODAJLyogYzogdG9sZXJBbnQgZW5hYmxlICovCisJI2RlZmluZSAgIEhTQyAgICAweDIwCS8qIGM6IEhhbHQgU0NTSSBDbG9jayAqLworCSNkZWZpbmUgICBDU0YgICAgMHgwMgkvKiBjOiBjbGVhciBzY3NpIGZpZm8gKi8KKworLyo1MCovICB1MTYgICBuY19zaWRsOwkvKiBMb3dsZXZlbDogbGF0Y2hlZCBmcm9tIHNjc2kgZGF0YSAqLworLyo1MiovICB1OAluY19zdGVzdDQ7CisJI2RlZmluZSAgIFNNT0RFICAweGMwCS8qIFNDU0kgYnVzIG1vZGUgICAgICAoODk1LzYgb25seSkgKi8KKwkjZGVmaW5lICAgIFNNT0RFX0hWRCAweDQwCS8qIEhpZ2ggVm9sdGFnZSBEaWZmZXJlbnRpYWwgICAgICAgKi8KKwkjZGVmaW5lICAgIFNNT0RFX1NFICAweDgwCS8qIFNpbmdsZSBFbmRlZCAgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgIFNNT0RFX0xWRCAweGMwCS8qIExvdyBWb2x0YWdlIERpZmZlcmVudGlhbCAgICAgICAgKi8KKwkjZGVmaW5lICAgTENLRlJRIDB4MjAJLyogRnJlcXVlbmN5IExvY2sgKDg5NS82IG9ubHkpICAgICAqLworCQkJCS8qIGJpdHMgMC01IHJzdmQgZm9yIEMxMDEwICAgICAgICAgICovCisKKy8qNTMqLyAgdTgJbmNfNTNfOworLyo1NCovICB1MTYJbmNfc29kbDsJLyogTG93bGV2ZWw6IGRhdGEgb3V0IHRvIHNjc2kgZGF0YSAgKi8KKy8qNTYqLwl1OAluY19jY250bDA7CS8qIENoaXAgQ29udHJvbCAwICg4OTYpICAgICAgICAgICAgICovCisJI2RlZmluZSAgIEVOUE1KICAweDgwCS8qIEVuYWJsZSBQaGFzZSBNaXNtYXRjaCBKdW1wICAgICAgICovCisJI2RlZmluZSAgIFBNSkNUTCAweDQwCS8qIFBoYXNlIE1pc21hdGNoIEp1bXAgQ29udHJvbCAgICAgICovCisJI2RlZmluZSAgIEVOTkRKICAweDIwCS8qIEVuYWJsZSBOb24gRGF0YSBQTSBKdW1wICAgICAgICAgICovCisJI2RlZmluZSAgIERJU0ZDICAweDEwCS8qIERpc2FibGUgQXV0byBGSUZPIENsZWFyICAgICAgICAgICovCisJI2RlZmluZSAgIERJTFMgICAweDAyCS8qIERpc2FibGUgSW50ZXJuYWwgTG9hZC9TdG9yZSAgICAgICovCisJI2RlZmluZSAgIERQUiAgICAweDAxCS8qIERpc2FibGUgUGlwZSBSZXEgICAgICAgICAgICAgICAgICovCisKKy8qNTcqLwl1OAluY19jY250bDE7CS8qIENoaXAgQ29udHJvbCAxICg4OTYpICAgICAgICAgICAgICovCisJI2RlZmluZSAgIFpNT0QgICAweDgwCS8qIEhpZ2ggSW1wZWRhbmNlIE1vZGUgICAgICAgICAgICAgICovCisJI2RlZmluZQkgIERJQwkgMHgxMAkvKiBEaXNhYmxlIEludGVybmFsIEN5Y2xlcwkgICAgKi8KKwkjZGVmaW5lICAgRERBQyAgIDB4MDgJLyogRGlzYWJsZSBEdWFsIEFkZHJlc3MgQ3ljbGUgICAgICAgKi8KKwkjZGVmaW5lICAgWFRJTU9EIDB4MDQJLyogNjQtYml0IFRhYmxlIEluZC4gSW5kZXhpbmcgTW9kZSAgKi8KKwkjZGVmaW5lICAgRVhUSUJNViAweDAyCS8qIEVuYWJsZSA2NC1iaXQgVGFibGUgSW5kLiBCTU9WICAgICovCisJI2RlZmluZSAgIEVYREJNViAweDAxCS8qIEVuYWJsZSA2NC1iaXQgRGlyZWN0IEJNT1YgICAgICAgICovCisKKy8qNTgqLyAgdTE2CW5jX3NiZGw7CS8qIExvd2xldmVsOiBkYXRhIGZyb20gc2NzaSBkYXRhICAgICovCisvKjVhKi8gIHUxNgluY181YV87CisKKy8qNWMqLyAgdTgJbmNfc2NyMDsJLyogV29ya2luZyByZWdpc3RlciBCICAgICAgICAgICAgICAgKi8KKy8qNWQqLyAgdTgJbmNfc2NyMTsJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qNWUqLyAgdTgJbmNfc2NyMjsJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qNWYqLyAgdTgJbmNfc2NyMzsJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyo2MCovICB1OAluY19zY3J4WzY0XTsJLyogV29ya2luZyByZWdpc3RlciBDLVIgICAgICAgICAgICAgKi8KKy8qYTAqLwl1MzIJbmNfbW1yczsJLyogTWVtb3J5IE1vdmUgUmVhZCBTZWxlY3RvciAgICAgICAgKi8KKy8qYTQqLwl1MzIJbmNfbW13czsJLyogTWVtb3J5IE1vdmUgV3JpdGUgU2VsZWN0b3IgICAgICAgKi8KKy8qYTgqLwl1MzIJbmNfc2ZzOwkJLyogU2NyaXB0IEZldGNoIFNlbGVjdG9yICAgICAgICAgICAgKi8KKy8qYWMqLwl1MzIJbmNfZHJzOwkJLyogRFNBIFJlbGF0aXZlIFNlbGVjdG9yICAgICAgICAgICAgKi8KKy8qYjAqLwl1MzIJbmNfc2JtczsJLyogU3RhdGljIEJsb2NrIE1vdmUgU2VsZWN0b3IgICAgICAgKi8KKy8qYjQqLwl1MzIJbmNfZGJtczsJLyogRHluYW1pYyBCbG9jayBNb3ZlIFNlbGVjdG9yICAgICAgKi8KKy8qYjgqLwl1MzIJbmNfZG5hZDY0OwkvKiBETUEgTmV4dCBBZGRyZXNzIDY0ICAgICAgICAgICAgICAqLworLypiYyovCXUxNgluY19zY250bDQ7CS8qIEMxMDEwIG9ubHkgICAgICAgICAgICAgICAgICAgICAgICovCisJI2RlZmluZSAgIFUzRU4gICAweDgwCS8qIEVuYWJsZSBVbHRyYSAzICAgICAgICAgICAgICAgICAgICovCisJI2RlZmluZSAgIEFJUEVOCSAweDQwICAgLyogQWxsb3cgY2hlY2sgdXBwZXIgYnl0ZSBsYW5lcyAgICAgKi8KKwkjZGVmaW5lICAgWENMS0hfRFQgMHgwOCAvKiBFeHRyYSBjbG9jayBvZiBkYXRhIGhvbGQgb24gRFQKKwkJCQkJdHJhbnNmZXIgZWRnZQkgICAgICAgICAgICAqLworCSNkZWZpbmUgICBYQ0xLSF9TVCAweDA0IC8qIEV4dHJhIGNsb2NrIG9mIGRhdGEgaG9sZCBvbiBTVAorCQkJCQl0cmFuc2ZlciBlZGdlCSAgICAgICAgICAgICovCisKKy8qYmUqLyAgdTgJbmNfYWlwY250bDA7CS8qIEVwYXQgQ29udHJvbCAxIEMxMDEwIG9ubHkgICAgICAgICovCisvKmJmKi8gIHU4CW5jX2FpcGNudGwxOwkvKiBBSVAgQ29udHJvbCBDMTAxMF82NiBPbmx5ICAgICAgICAqLworCisvKmMwKi8JdTMyCW5jX3BtamFkMTsJLyogUGhhc2UgTWlzbWF0Y2ggSnVtcCBBZGRyZXNzIDEgICAgKi8KKy8qYzQqLwl1MzIJbmNfcG1qYWQyOwkvKiBQaGFzZSBNaXNtYXRjaCBKdW1wIEFkZHJlc3MgMiAgICAqLworLypjOCovCXU4CW5jX3JiYzsJCS8qIFJlbWFpbmluZyBCeXRlIENvdW50ICAgICAgICAgICAgICovCisvKmM5Ki8JdTgJbmNfcmJjMTsJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qY2EqLwl1OAluY19yYmMyOwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLypjYiovCXU4CW5jX3JiYzM7CS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qY2MqLwl1OAluY191YTsJCS8qIFVwZGF0ZWQgQWRkcmVzcyAgICAgICAgICAgICAgICAgICovCisvKmNkKi8JdTgJbmNfdWExOwkJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qY2UqLwl1OAluY191YTI7CQkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLypjZiovCXU4CW5jX3VhMzsJCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKmQwKi8JdTMyCW5jX2VzYTsJCS8qIEVudHJ5IFN0b3JhZ2UgQWRkcmVzcyAgICAgICAgICAgICovCisvKmQ0Ki8JdTgJbmNfaWE7CQkvKiBJbnN0cnVjdGlvbiBBZGRyZXNzICAgICAgICAgICAgICAqLworLypkNSovCXU4CW5jX2lhMTsKKy8qZDYqLwl1OAluY19pYTI7CisvKmQ3Ki8JdTgJbmNfaWEzOworLypkOCovCXUzMgluY19zYmM7CQkvKiBTQ1NJIEJ5dGUgQ291bnQgKDMgYnl0ZXMgb25seSkgICAqLworLypkYyovCXUzMgluY19jc2JjOwkvKiBDdW11bGF0aXZlIFNDU0kgQnl0ZSBDb3VudCAgICAgICAqLworCisJCQkJLyogRm9sbG93aW5nIGZvciBDMTAxMCBvbmx5ICAgICAgICAgKi8KKy8qZTAqLyAgdTE2CW5jX2NyY3BhZDsJLyogQ1JDIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qZTIqLyAgdTgJbmNfY3JjY250bDA7CS8qIENSQyBjb250cm9sIHJlZ2lzdGVyICAgICAgICAgICAgICovCisJI2RlZmluZSAgIFNORENSQyAgMHgxMAkvKiBTZW5kIENSQyBSZXF1ZXN0ICAgICAgICAgICAgICAgICAqLworLyplMyovICB1OAluY19jcmNjbnRsMTsJLyogQ1JDIGNvbnRyb2wgcmVnaXN0ZXIgICAgICAgICAgICAgKi8KKy8qZTQqLyAgdTMyCW5jX2NyY2RhdGE7CS8qIENSQyBkYXRhIHJlZ2lzdGVyICAgICAgICAgICAgICAgICovIAorLyplOCovICB1MzIJbmNfZThfOwkJLyogcnN2ZCAJCQkgICAgKi8KKy8qZWMqLyAgdTMyCW5jX2VjXzsJCS8qIHJzdmQgCQkJICAgICovCisvKmYwKi8gIHUxNgluY19kZmJjOwkvKiBETUEgRklGTyBieXRlIGNvdW50ICAgICAgICAgICAgICAqLyAKKworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqCVV0aWxpdHkgbWFjcm9zIGZvciB0aGUgc2NyaXB0LgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNkZWZpbmUgUkVHSihwLHIpIChvZmZzZXRvZihzdHJ1Y3QgbmNyX3JlZywgcCAjIyByKSkKKyNkZWZpbmUgUkVHKHIpIFJFR0ogKG5jXywgcikKKwordHlwZWRlZiB1MzIgbmNyY21kOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKioJU0NTSSBwaGFzZXMKKyoqCisqKglEVCBwaGFzZXMgaWxsZWdhbCBmb3IgbmNyIGRyaXZlci4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjZGVmaW5lCVNDUl9EQVRBX09VVAkweDAwMDAwMDAwCisjZGVmaW5lCVNDUl9EQVRBX0lOCTB4MDEwMDAwMDAKKyNkZWZpbmUJU0NSX0NPTU1BTkQJMHgwMjAwMDAwMAorI2RlZmluZQlTQ1JfU1RBVFVTCTB4MDMwMDAwMDAKKyNkZWZpbmUgU0NSX0RUX0RBVEFfT1VUCTB4MDQwMDAwMDAKKyNkZWZpbmUgU0NSX0RUX0RBVEFfSU4JMHgwNTAwMDAwMAorI2RlZmluZSBTQ1JfTVNHX09VVAkweDA2MDAwMDAwCisjZGVmaW5lIFNDUl9NU0dfSU4gICAgICAweDA3MDAwMDAwCisKKyNkZWZpbmUgU0NSX0lMR19PVVQJMHgwNDAwMDAwMAorI2RlZmluZSBTQ1JfSUxHX0lOCTB4MDUwMDAwMDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqCURhdGEgdHJhbnNmZXIgdmlhIFNDU0kuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqCU1PVkVfQUJTIChMRU4pCisqKgk8PHN0YXJ0IGFkZHJlc3M+PgorKioKKyoqCU1PVkVfSU5EIChMRU4pCisqKgk8PGRuYWRfb2Zmc2V0Pj4KKyoqCisqKglNT1ZFX1RCTAorKioJPDxkbmFkX29mZnNldD4+CisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2RlZmluZSBPUENfTU9WRSAgICAgICAgICAweDA4MDAwMDAwCisKKyNkZWZpbmUgU0NSX01PVkVfQUJTKGwpICgoMHgwMDAwMDAwMCB8IE9QQ19NT1ZFKSB8IChsKSkKKyNkZWZpbmUgU0NSX01PVkVfSU5EKGwpICgoMHgyMDAwMDAwMCB8IE9QQ19NT1ZFKSB8IChsKSkKKyNkZWZpbmUgU0NSX01PVkVfVEJMICAgICAoMHgxMDAwMDAwMCB8IE9QQ19NT1ZFKQorCisjZGVmaW5lIFNDUl9DSE1PVl9BQlMobCkgKCgweDAwMDAwMDAwKSB8IChsKSkKKyNkZWZpbmUgU0NSX0NITU9WX0lORChsKSAoKDB4MjAwMDAwMDApIHwgKGwpKQorI2RlZmluZSBTQ1JfQ0hNT1ZfVEJMICAgICAoMHgxMDAwMDAwMCkKKworc3RydWN0IHNjcl90Ymxtb3ZlIHsKKyAgICAgICAgdTMyICBzaXplOworICAgICAgICB1MzIgIGFkZHI7Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKioJU2VsZWN0aW9uCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqCVNFTF9BQlMgfCBTQ1JfSUQgKDAuLjE1KSAgICBbIHwgUkVMX0pNUF0KKyoqCTw8YWx0ZXJuYXRlX2FkZHJlc3M+PgorKioKKyoqCVNFTF9UQkwgfCA8PCBkbmFkX29mZnNldD4+ICBbIHwgUkVMX0pNUF0KKyoqCTw8YWx0ZXJuYXRlX2FkZHJlc3M+PgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNkZWZpbmUJU0NSX1NFTF9BQlMJMHg0MDAwMDAwMAorI2RlZmluZQlTQ1JfU0VMX0FCU19BVE4JMHg0MTAwMDAwMAorI2RlZmluZQlTQ1JfU0VMX1RCTAkweDQyMDAwMDAwCisjZGVmaW5lCVNDUl9TRUxfVEJMX0FUTgkweDQzMDAwMDAwCisKKworI2lmZGVmIFNDU0lfTkNSX0JJR19FTkRJQU4KK3N0cnVjdCBzY3JfdGJsc2VsIHsKKyAgICAgICAgdTgJc2VsX3NjbnRsMzsKKyAgICAgICAgdTgJc2VsX2lkOworICAgICAgICB1OAlzZWxfc3hmZXI7CisgICAgICAgIHU4CXNlbF9zY250bDQ7CQorfTsKKyNlbHNlCitzdHJ1Y3Qgc2NyX3RibHNlbCB7CisgICAgICAgIHU4CXNlbF9zY250bDQ7CQorICAgICAgICB1OAlzZWxfc3hmZXI7CisgICAgICAgIHU4CXNlbF9pZDsKKyAgICAgICAgdTgJc2VsX3NjbnRsMzsKK307CisjZW5kaWYKKworI2RlZmluZSBTQ1JfSk1QX1JFTCAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBTQ1JfSUQoaWQpCSgoKHUzMikoaWQpKSA8PCAxNikKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqCVdhaXRpbmcgZm9yIERpc2Nvbm5lY3Qgb3IgUmVzZWxlY3QKKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKioJV0FJVF9ESVNDCisqKglkdW1teTogPDxhbHRlcm5hdGVfYWRkcmVzcz4+CisqKgorKioJV0FJVF9SRVNFTAorKioJPDxhbHRlcm5hdGVfYWRkcmVzcz4+CisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2RlZmluZQlTQ1JfV0FJVF9ESVNDCTB4NDgwMDAwMDAKKyNkZWZpbmUgU0NSX1dBSVRfUkVTRUwgIDB4NTAwMDAwMDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqCUJpdCBTZXQgLyBSZXNldAorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKglTRVQgKGZsYWdzIHt8Li4gfSkKKyoqCisqKglDTFIgKGZsYWdzIHt8Li4gfSkKKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjZGVmaW5lIFNDUl9TRVQoZikgICAgICgweDU4MDAwMDAwIHwgKGYpKQorI2RlZmluZSBTQ1JfQ0xSKGYpICAgICAoMHg2MDAwMDAwMCB8IChmKSkKKworI2RlZmluZQlTQ1JfQ0FSUlkJMHgwMDAwMDQwMAorI2RlZmluZQlTQ1JfVFJHCQkweDAwMDAwMjAwCisjZGVmaW5lCVNDUl9BQ0sJCTB4MDAwMDAwNDAKKyNkZWZpbmUJU0NSX0FUTgkJMHgwMDAwMDAwOAorCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKioJTWVtb3J5IHRvIG1lbW9yeSBtb3ZlCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqCUNPUFkgKGJ5dGVjb3VudCkKKyoqCTw8IHNvdXJjZV9hZGRyZXNzID4+CisqKgk8PCBkZXN0aW5hdGlvbl9hZGRyZXNzID4+CisqKgorKioJU0NSX0NPUFkgICBzZXRzIHRoZSBOTyBGTFVTSCBvcHRpb24gYnkgZGVmYXVsdC4KKyoqCVNDUl9DT1BZX0YgZG9lcyBub3Qgc2V0IHRoaXMgb3B0aW9uLgorKioKKyoqCUZvciBjaGlwcyB3aGljaCBkbyBub3Qgc3VwcG9ydCB0aGlzIG9wdGlvbiwKKyoqCW5jcl9jb3B5X2FuZF9iaW5kKCkgd2lsbCByZW1vdmUgdGhpcyBiaXQuCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjZGVmaW5lIFNDUl9OT19GTFVTSCAweDAxMDAwMDAwCisKKyNkZWZpbmUgU0NSX0NPUFkobikgKDB4YzAwMDAwMDAgfCBTQ1JfTk9fRkxVU0ggfCAobikpCisjZGVmaW5lIFNDUl9DT1BZX0YobikgKDB4YzAwMDAwMDAgfCAobikpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKglSZWdpc3RlciBtb3ZlIGFuZCBiaW5hcnkgb3BlcmF0aW9ucworKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKglTRkJSX1JFRyAocmVnLCBvcCwgZGF0YSkgICAgICAgIHJlZyAgPSBTRkJSIG9wIGRhdGEKKyoqCTw8IDAgPj4KKyoqCisqKglSRUdfU0ZCUiAocmVnLCBvcCwgZGF0YSkgICAgICAgIFNGQlIgPSByZWcgb3AgZGF0YQorKioJPDwgMCA+PgorKioKKyoqCVJFR19SRUcgIChyZWcsIG9wLCBkYXRhKSAgICAgICAgcmVnICA9IHJlZyBvcCBkYXRhCisqKgk8PCAwID4+CisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioJT24gODEwQSwgODYwLCA4MjVBLCA4NzUsIDg5NSBhbmQgODk2IGNoaXBzIHRoZSBjb250ZW50IAorKioJb2YgU0ZCUiByZWdpc3RlciBjYW4gYmUgdXNlZCBhcyBkYXRhIChTQ1JfU0ZCUl9EQVRBKS4KKyoqCVRoZSA4OTYgaGFzIGFkZGl0aW9ubmFsIElPIHJlZ2lzdGVycyBzdGFydGluZyBhdCAKKyoqCW9mZnNldCAweDgwLiBCaXQgNyBvZiByZWdpc3RlciBvZmZzZXQgaXMgc3RvcmVkIGluIAorKioJYml0IDcgb2YgdGhlIFNDUklQVFMgaW5zdHJ1Y3Rpb24gZmlyc3QgRFdPUkQuCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjZGVmaW5lIFNDUl9SRUdfT0ZTKG9mcykgKCgoKG9mcykgJiAweDdmKSA8PCAxNnVsKSArICgob2ZzKSAmIDB4ODApKSAKKworI2RlZmluZSBTQ1JfU0ZCUl9SRUcocmVnLG9wLGRhdGEpIFwKKyAgICAgICAgKDB4NjgwMDAwMDAgfCAoU0NSX1JFR19PRlMoUkVHKHJlZykpKSB8IChvcCkgfCAoKChkYXRhKSYweGZmKTw8OHVsKSkKKworI2RlZmluZSBTQ1JfUkVHX1NGQlIocmVnLG9wLGRhdGEpIFwKKyAgICAgICAgKDB4NzAwMDAwMDAgfCAoU0NSX1JFR19PRlMoUkVHKHJlZykpKSB8IChvcCkgfCAoKChkYXRhKSYweGZmKTw8OHVsKSkKKworI2RlZmluZSBTQ1JfUkVHX1JFRyhyZWcsb3AsZGF0YSkgXAorICAgICAgICAoMHg3ODAwMDAwMCB8IChTQ1JfUkVHX09GUyhSRUcocmVnKSkpIHwgKG9wKSB8ICgoKGRhdGEpJjB4ZmYpPDw4dWwpKQorCisKKyNkZWZpbmUgICAgICBTQ1JfTE9BRCAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgICAgICBTQ1JfU0hMICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgICAgICBTQ1JfT1IgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgICAgICBTQ1JfWE9SICAgIDB4MDMwMDAwMDAKKyNkZWZpbmUgICAgICBTQ1JfQU5EICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgICAgICBTQ1JfU0hSICAgIDB4MDUwMDAwMDAKKyNkZWZpbmUgICAgICBTQ1JfQUREICAgIDB4MDYwMDAwMDAKKyNkZWZpbmUgICAgICBTQ1JfQUREQyAgIDB4MDcwMDAwMDAKKworI2RlZmluZSAgICAgIFNDUl9TRkJSX0RBVEEgICAoMHgwMDgwMDAwMD4+OHVsKQkvKiBVc2UgU0ZCUiBhcyBkYXRhICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKglGUk9NX1JFRyAocmVnKQkJICBTRkJSID0gcmVnCisqKgk8PCAwID4+CisqKgorKioJVE9fUkVHCSAocmVnKQkJICByZWcgID0gU0ZCUgorKioJPDwgMCA+PgorKioKKyoqCUxPQURfUkVHIChyZWcsIGRhdGEpCSAgcmVnICA9IDxkYXRhPgorKioJPDwgMCA+PgorKioKKyoqCUxPQURfU0ZCUihkYXRhKSAJICBTRkJSID0gPGRhdGE+CisqKgk8PCAwID4+CisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2RlZmluZQlTQ1JfRlJPTV9SRUcocmVnKSBcCisJU0NSX1JFR19TRkJSKHJlZyxTQ1JfT1IsMCkKKworI2RlZmluZQlTQ1JfVE9fUkVHKHJlZykgXAorCVNDUl9TRkJSX1JFRyhyZWcsU0NSX09SLDApCisKKyNkZWZpbmUJU0NSX0xPQURfUkVHKHJlZyxkYXRhKSBcCisJU0NSX1JFR19SRUcocmVnLFNDUl9MT0FELGRhdGEpCisKKyNkZWZpbmUgU0NSX0xPQURfU0ZCUihkYXRhKSBcCisgICAgICAgIChTQ1JfUkVHX1NGQlIgKGdwcmVnLCBTQ1JfTE9BRCwgZGF0YSkpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKglMT0FEICBmcm9tIG1lbW9yeSAgIHRvIHJlZ2lzdGVyLgorKioJU1RPUkUgZnJvbSByZWdpc3RlciB0byBtZW1vcnkuCisqKgorKioJT25seSBzdXBwb3J0ZWQgYnkgODEwQSwgODYwLCA4MjVBLCA4NzUsIDg5NSBhbmQgODk2LgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKglMT0FEX0FCUyAoTEVOKQorKioJPDxzdGFydCBhZGRyZXNzPj4KKyoqCisqKglMT0FEX1JFTCAoTEVOKSAgICAgICAgKERTQSByZWxhdGl2ZSkKKyoqCTw8ZHNhX29mZnNldD4+CisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2RlZmluZSBTQ1JfUkVHX09GUzIob2ZzKSAoKChvZnMpICYgMHhmZikgPDwgMTZ1bCkKKyNkZWZpbmUgU0NSX05PX0ZMVVNIMgkweDAyMDAwMDAwCisjZGVmaW5lIFNDUl9EU0FfUkVMMgkweDEwMDAwMDAwCisKKyNkZWZpbmUgU0NSX0xPQURfUihyZWcsIGhvdywgbikgXAorICAgICAgICAoMHhlMTAwMDAwMCB8IGhvdyB8IChTQ1JfUkVHX09GUzIoUkVHKHJlZykpKSB8IChuKSkKKworI2RlZmluZSBTQ1JfU1RPUkVfUihyZWcsIGhvdywgbikgXAorICAgICAgICAoMHhlMDAwMDAwMCB8IGhvdyB8IChTQ1JfUkVHX09GUzIoUkVHKHJlZykpKSB8IChuKSkKKworI2RlZmluZSBTQ1JfTE9BRF9BQlMocmVnLCBuKQlTQ1JfTE9BRF9SKHJlZywgU0NSX05PX0ZMVVNIMiwgbikKKyNkZWZpbmUgU0NSX0xPQURfUkVMKHJlZywgbikJU0NSX0xPQURfUihyZWcsIFNDUl9OT19GTFVTSDJ8U0NSX0RTQV9SRUwyLCBuKQorI2RlZmluZSBTQ1JfTE9BRF9BQlNfRihyZWcsIG4pCVNDUl9MT0FEX1IocmVnLCAwLCBuKQorI2RlZmluZSBTQ1JfTE9BRF9SRUxfRihyZWcsIG4pCVNDUl9MT0FEX1IocmVnLCBTQ1JfRFNBX1JFTDIsIG4pCisKKyNkZWZpbmUgU0NSX1NUT1JFX0FCUyhyZWcsIG4pCVNDUl9TVE9SRV9SKHJlZywgU0NSX05PX0ZMVVNIMiwgbikKKyNkZWZpbmUgU0NSX1NUT1JFX1JFTChyZWcsIG4pCVNDUl9TVE9SRV9SKHJlZywgU0NSX05PX0ZMVVNIMnxTQ1JfRFNBX1JFTDIsbikKKyNkZWZpbmUgU0NSX1NUT1JFX0FCU19GKHJlZywgbikJU0NSX1NUT1JFX1IocmVnLCAwLCBuKQorI2RlZmluZSBTQ1JfU1RPUkVfUkVMX0YocmVnLCBuKQlTQ1JfU1RPUkVfUihyZWcsIFNDUl9EU0FfUkVMMiwgbikKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKioJV2FpdGluZyBmb3IgRGlzY29ubmVjdCBvciBSZXNlbGVjdAorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKglKVU1QICAgICAgICAgICAgWyB8IElGVFJVRS9JRkZBTFNFICggLi4uICkgXQorKioJPDxhZGRyZXNzPj4KKyoqCisqKglKVU1QUiAgICAgICAgICAgWyB8IElGVFJVRS9JRkZBTFNFICggLi4uICkgXQorKioJPDxkaXN0YW5jZT4+CisqKgorKioJQ0FMTCAgICAgICAgICAgIFsgfCBJRlRSVUUvSUZGQUxTRSAoIC4uLiApIF0KKyoqCTw8YWRkcmVzcz4+CisqKgorKioJQ0FMTFIgICAgICAgICAgIFsgfCBJRlRSVUUvSUZGQUxTRSAoIC4uLiApIF0KKyoqCTw8ZGlzdGFuY2U+PgorKioKKyoqCVJFVFVSTiAgICAgICAgICBbIHwgSUZUUlVFL0lGRkFMU0UgKCAuLi4gKSBdCisqKgk8PGR1bW15Pj4KKyoqCisqKglJTlQgICAgICAgICAgICAgWyB8IElGVFJVRS9JRkZBTFNFICggLi4uICkgXQorKioJPDxpZGVudD4+CisqKgorKioJSU5UX0ZMWSAgICAgICAgIFsgfCBJRlRSVUUvSUZGQUxTRSAoIC4uLiApIF0KKyoqCTw8aWRlbnQ+PgorKioKKyoqCUNvbmRpdGlvbnM6CisqKgkgICAgIFdIRU4gKHBoYXNlKQorKioJICAgICBJRiAgIChwaGFzZSkKKyoqCSAgICAgQ0FSUllTRVQKKyoqCSAgICAgREFUQSAoZGF0YSwgbWFzaykKKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjZGVmaW5lIFNDUl9OT19PUCAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIFNDUl9KVU1QICAgICAgICAweDgwMDgwMDAwCisjZGVmaW5lIFNDUl9KVU1QNjQgICAgICAweDgwNDgwMDAwCisjZGVmaW5lIFNDUl9KVU1QUiAgICAgICAweDgwODgwMDAwCisjZGVmaW5lIFNDUl9DQUxMICAgICAgICAweDg4MDgwMDAwCisjZGVmaW5lIFNDUl9DQUxMUiAgICAgICAweDg4ODgwMDAwCisjZGVmaW5lIFNDUl9SRVRVUk4gICAgICAweDkwMDgwMDAwCisjZGVmaW5lIFNDUl9JTlQgICAgICAgICAweDk4MDgwMDAwCisjZGVmaW5lIFNDUl9JTlRfRkxZICAgICAweDk4MTgwMDAwCisKKyNkZWZpbmUgSUZGQUxTRShhcmcpICAgKDB4MDAwODAwMDAgfCAoYXJnKSkKKyNkZWZpbmUgSUZUUlVFKGFyZykgICAgKDB4MDAwMDAwMDAgfCAoYXJnKSkKKworI2RlZmluZSBXSEVOKHBoYXNlKSAgICAoMHgwMDAzMDAwMCB8IChwaGFzZSkpCisjZGVmaW5lIElGKHBoYXNlKSAgICAgICgweDAwMDIwMDAwIHwgKHBoYXNlKSkKKworI2RlZmluZSBEQVRBKEQpICAgICAgICAoMHgwMDA0MDAwMCB8ICgoRCkgJiAweGZmKSkKKyNkZWZpbmUgTUFTSyhELE0pICAgICAgKDB4MDAwNDAwMDAgfCAoKChNIF4gMHhmZikgJiAweGZmKSA8PCA4dWwpfCgoRCkgJiAweGZmKSkKKworI2RlZmluZSBDQVJSWVNFVCAgICAgICAoMHgwMDIwMDAwMCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqCVNDU0kgIGNvbnN0YW50cy4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvKgorKioJTWVzc2FnZXMKKyovCisKKyNkZWZpbmUJTV9DT01QTEVURQlDT01NQU5EX0NPTVBMRVRFCisjZGVmaW5lCU1fRVhURU5ERUQJRVhURU5ERURfTUVTU0FHRQorI2RlZmluZQlNX1NBVkVfRFAJU0FWRV9QT0lOVEVSUworI2RlZmluZQlNX1JFU1RPUkVfRFAJUkVTVE9SRV9QT0lOVEVSUworI2RlZmluZQlNX0RJU0NPTk5FQ1QJRElTQ09OTkVDVAorI2RlZmluZQlNX0lEX0VSUk9SCUlOSVRJQVRPUl9FUlJPUgorI2RlZmluZQlNX0FCT1JUCQlBQk9SVF9UQVNLX1NFVAorI2RlZmluZQlNX1JFSkVDVAlNRVNTQUdFX1JFSkVDVAorI2RlZmluZQlNX05PT1AJCU5PUAorI2RlZmluZQlNX1BBUklUWQlNU0dfUEFSSVRZX0VSUk9SCisjZGVmaW5lCU1fTENPTVBMRVRFCUxJTktFRF9DTURfQ09NUExFVEUKKyNkZWZpbmUJTV9GQ09NUExFVEUJTElOS0VEX0ZMR19DTURfQ09NUExFVEUKKyNkZWZpbmUJTV9SRVNFVAkJVEFSR0VUX1JFU0VUCisjZGVmaW5lCU1fQUJPUlRfVEFHCUFCT1JUX1RBU0sKKyNkZWZpbmUJTV9DTEVBUl9RVUVVRQlDTEVBUl9UQVNLX1NFVAorI2RlZmluZQlNX0lOSVRfUkVDCUlOSVRJQVRFX1JFQ09WRVJZCisjZGVmaW5lCU1fUkVMX1JFQwlSRUxFQVNFX1JFQ09WRVJZCisjZGVmaW5lCU1fVEVSTUlOQVRFCSgweDExKQorI2RlZmluZQlNX1NJTVBMRV9UQUcJU0lNUExFX1FVRVVFX1RBRworI2RlZmluZQlNX0hFQURfVEFHCUhFQURfT0ZfUVVFVUVfVEFHCisjZGVmaW5lCU1fT1JERVJFRF9UQUcJT1JERVJFRF9RVUVVRV9UQUcKKyNkZWZpbmUJTV9JR05fUkVTSURVRQlJR05PUkVfV0lERV9SRVNJRFVFCisjZGVmaW5lCU1fSURFTlRJRlkgICAJKDB4ODApCisKKyNkZWZpbmUJTV9YX01PRElGWV9EUAlFWFRFTkRFRF9NT0RJRllfREFUQV9QT0lOVEVSCisjZGVmaW5lCU1fWF9TWU5DX1JFUQlFWFRFTkRFRF9TRFRSCisjZGVmaW5lCU1fWF9XSURFX1JFUQlFWFRFTkRFRF9XRFRSCisjZGVmaW5lCU1fWF9QUFJfUkVRCUVYVEVOREVEX1BQUgorCisvKgorKioJU3RhdHVzCisqLworCisjZGVmaW5lCVNfR09PRAkJKDB4MDApCisjZGVmaW5lCVNfQ0hFQ0tfQ09ORAkoMHgwMikKKyNkZWZpbmUJU19DT05EX01FVAkoMHgwNCkKKyNkZWZpbmUJU19CVVNZCQkoMHgwOCkKKyNkZWZpbmUJU19JTlQJCSgweDEwKQorI2RlZmluZQlTX0lOVF9DT05EX01FVAkoMHgxNCkKKyNkZWZpbmUJU19DT05GTElDVAkoMHgxOCkKKyNkZWZpbmUJU19URVJNSU5BVEVECSgweDIwKQorI2RlZmluZQlTX1FVRVVFX0ZVTEwJKDB4MjgpCisjZGVmaW5lCVNfSUxMRUdBTAkoMHhmZikKKyNkZWZpbmUJU19TRU5TRQkJKDB4ODApCisKKy8qCisgKiBFbmQgb2YgbmNycmVnIGZyb20gRnJlZUJTRAorICovCisKKyNlbmRpZiAvKiBkZWZpbmVkIFNZTTUzQzhYWF9ERUZTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS90MTI4LmMgYi9kcml2ZXJzL3Njc2kvdDEyOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYzI4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvdDEyOC5jCkBAIC0wLDAgKzEsNDQ5IEBACisjZGVmaW5lIEFVVE9TRU5TRQorI2RlZmluZSBQU0VVRE9fRE1BCisKKy8qCisgKiBUcmFudG9yIFQxMjgvVDEyOEYvVDIyOCBkcml2ZXIKKyAqCU5vdGUgOiBhcmNoaXRlY3R1cmFsbHksIHRoZSBUMTAwIGFuZCBUMTMwIGFyZSBkaWZmZXJlbnQgYW5kIHdvbid0IAorICogCXdvcmsKKyAqCisgKiBDb3B5cmlnaHQgMTk5MywgRHJldyBFY2toYXJkdAorICoJVmlzaW9uYXJ5IENvbXB1dGluZworICoJKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyAqCWRyZXdAY29sb3JhZG8uZWR1CisgKiAgICAgICsxICgzMDMpIDQ0MC00ODk0CisgKgorICogRElTVFJJQlVUSU9OIFJFTEVBU0UgMy4KKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKgorICogVHJhbnRvciBTeXN0ZW1zLCBMdGQuCisgKiBUMTI4L1QxMjhGL1QyMjggU0NTSSBIb3N0IEFkYXB0ZXIKKyAqIEhhcmR3YXJlIFNwZWNpZmljYXRpb25zCisgKiAKKyAqIFRyYW50b3IgU3lzdGVtcywgTHRkLiAKKyAqIDU0MTUgUmFuZGFsbCBQbGFjZQorICogRnJlbW9udCwgQ0EgOTQ1MzgKKyAqIDErICg0MTUpIDc3MC0xNDAwLCBGQVggMSsgKDQxNSkgNzcwLTk5MTAKKyAqIAorICogYW5kIAorICoKKyAqIE5DUiA1MzgwIEZhbWlseQorICogU0NTSSBQcm90b2NvbCBDb250cm9sbGVyCisgKiBEYXRhYm9vaworICoKKyAqIE5DUiBNaWNyb2VsZWN0cm9uaWNzCisgKiAxNjM1IEFlcm9wbGF6YSBEcml2ZQorICogQ29sb3JhZG8gU3ByaW5ncywgQ08gODA5MTYKKyAqIDErICg3MTkpIDU3OC0zNDAwCisgKiAxKyAoODAwKSAzMzQtNTQ1NAorICovCisKKy8qCisgKiBPcHRpb25zIDogCisgKiBBVVRPU0VOU0UgLSBpZiBkZWZpbmVkLCBSRVFVRVNUIFNFTlNFIHdpbGwgYmUgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkKKyAqICAgICAgZm9yIGNvbW1hbmRzIHRoYXQgcmV0dXJuIHdpdGggYSBDSEVDSyBDT05ESVRJT04gc3RhdHVzLiAKKyAqCisgKiBQU0VVRE9fRE1BIC0gZW5hYmxlcyBQU0VVRE8tRE1BIGhhcmR3YXJlLCBzaG91bGQgZ2l2ZSBhIDMtNFggcGVyZm9ybWFuY2UKKyAqIGluY3JlYXNlIGNvbXBhcmVkIHRvIHBvbGxlZCBJL08uCisgKgorICogUEFSSVRZIC0gZW5hYmxlIHBhcml0eSBjaGVja2luZy4gIE5vdCBzdXBwb3J0ZWQuCisgKiAKKyAqIFNDU0kyIC0gZW5hYmxlIHN1cHBvcnQgZm9yIFNDU0ktSUkgdGFnZ2VkIHF1ZXVlaW5nLiAgVW50ZXN0ZWQuCisgKgorICoKKyAqIFVOU0FGRSAtIGxlYXZlIGludGVycnVwdHMgZW5hYmxlZCBkdXJpbmcgcHNldWRvLURNQSB0cmFuc2ZlcnMuICBZb3UKKyAqICAgICAgICAgIG9ubHkgcmVhbGx5IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91J3JlIGhhdmluZyBhIHByb2JsZW0gd2l0aAorICogICAgICAgICAgZHJvcHBlZCBjaGFyYWN0ZXJzIGR1cmluZyBoaWdoIHNwZWVkIGNvbW11bmljYXRpb25zLCBhbmQgZXZlbgorICogICAgICAgICAgdGhlbiwgeW91J3JlIGdvaW5nIHRvIGJlIGJldHRlciBvZmYgdHdpZGRsaW5nIHdpdGggdHJhbnNmZXJzaXplLgorICoKKyAqIFVTTEVFUCAtIGVuYWJsZSBzdXBwb3J0IGZvciBkZXZpY2VzIHRoYXQgZG9uJ3QgZGlzY29ubmVjdC4gIFVudGVzdGVkLgorICoKKyAqIFRoZSBjYXJkIGlzIGRldGVjdGVkIGFuZCBpbml0aWFsaXplZCBpbiBvbmUgb2Ygc2V2ZXJhbCB3YXlzIDogCisgKiAxLiAgQXV0b3Byb2JlIChkZWZhdWx0KSAtIHNpbmNlIHRoZSBib2FyZCBpcyBtZW1vcnkgbWFwcGVkLCAKKyAqICAgICBhIEJJT1Mgc2lnbmF0dXJlIGlzIHNjYW5uZWQgZm9yIHRvIGxvY2F0ZSB0aGUgcmVnaXN0ZXJzLgorICogICAgIEFuIGludGVycnVwdCBpcyB0cmlnZ2VyZWQgdG8gYXV0b3Byb2JlIGZvciB0aGUgaW50ZXJydXB0CisgKiAgICAgbGluZS4KKyAqCisgKiAyLiAgV2l0aCBjb21tYW5kIGxpbmUgb3ZlcnJpZGVzIC0gdDEyOD1hZGRyZXNzLGlycSBtYXkgYmUgCisgKiAgICAgdXNlZCBvbiB0aGUgTElMTyBjb21tYW5kIGxpbmUgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzLgorICoKKyAqIDMuICBXaXRoIHRoZSBUMTI4X09WRVJSSURFIGNvbXBpbGUgdGltZSBkZWZpbmUuICBUaGlzIGlzIAorICogICAgIHNwZWNpZmllZCBhcyBhbiBhcnJheSBvZiBhZGRyZXNzLCBpcnEgdHVwbGVzLiAgSWUsIGZvcgorICogICAgIG9uZSBib2FyZCBhdCB0aGUgZGVmYXVsdCAweGNjMDAwIGFkZHJlc3MsIElSUTUsIEkgY291bGQgc2F5IAorICogICAgIC1EVDEyOF9PVkVSUklERT17ezB4Y2MwMDAsIDV9fQorICoJCisgKiAgICAgTm90ZSB0aGF0IGlmIHRoZSBvdmVycmlkZSBtZXRob2RzIGFyZSB1c2VkLCBwbGFjZSBob2xkZXJzIG11c3QKKyAqICAgICBiZSBzcGVjaWZpZWQgZm9yIG90aGVyIGJvYXJkcyBpbiB0aGUgc3lzdGVtLgorICogCisgKiBUMTI4L1QxMjhGIGp1bXBlci9kaXBzd2l0Y2ggc2V0dGluZ3MgKG5vdGUgOiBvbiBteSBzYW1wbGUsIHRoZSBzd2l0Y2hlcyAKKyAqIHdlcmUgZXBveHknZCBzaHV0LCBtZWFuaW5nIEkgY291bGRuJ3QgY2hhbmdlIHRoZSAweGNjMDAwIGJhc2UgYWRkcmVzcykgOgorICoKKyAqIFQxMjggICAgU3c3IFN3OCBTdzYgPSAwd3MgU3c1ID0gYm9vdCAKKyAqIFQxMjhGICAgU3c2IFN3NyBTdzUgPSAwd3MgU3c0ID0gYm9vdCBTdzggPSBmbG9wcHkgZGlzYWJsZQorICogY2MwMDAgICBvZmYgb2ZmICAgICAgCisgKiBjODAwMCAgIG9mZiBvbgorICogZGMwMDAgICBvbiAgb2ZmCisgKiBkODAwMCAgIG9uICBvbgorICoKKyAqIAorICogSW50ZXJydXB0cyAKKyAqIFRoZXJlIGlzIGEgMTIgcGluIGp1bXBlciBibG9jaywganAxLCBudW1iZXJlZCBhcyBmb2xsb3dzIDogCisgKiAgIFQxMjggKEpQMSkgIAkgVDEyOEYgKEo1KQorICogMiA0IDYgOCAxMCAxMgkxMSA5ICA3IDUgMyAxCisgKiAxIDMgNSA3IDkgIDExCTEyIDEwIDggNiA0IDIKKyAqCisgKiAzICAgMi00CisgKiA1ICAgMS0zCisgKiA3ICAgMy01CisgKiBUMTI4RiBvbmx5IAorICogMTAgOC0xMAorICogMTIgNy05CisgKiAxNCAxMC0xMgorICogMTUgOS0xMQorICovCisgCisvKgorICogJExvZzogdDEyOC5jLHYgJAorICovCisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJ0MTI4LmgiCisjZGVmaW5lIEFVVE9QUk9CRV9JUlEKKyNpbmNsdWRlICJOQ1I1MzgwLmgiCisKK3N0YXRpYyBzdHJ1Y3Qgb3ZlcnJpZGUgeworICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKyAgICBpbnQgaXJxOworfSBvdmVycmlkZXMgCisjaWZkZWYgVDEyOF9PVkVSUklERQorICAgIFtdIF9faW5pdGRhdGEgPSBUMTI4X09WRVJSSURFOworI2Vsc2UKKyAgICBbNF0gX19pbml0ZGF0YSA9IHt7MCwgSVJRX0FVVE99LCB7MCwgSVJRX0FVVE99LCAKKyAgICAgICAgezAgLElSUV9BVVRPfSwgezAsIElSUV9BVVRPfX07CisjZW5kaWYKKworI2RlZmluZSBOT19PVkVSUklERVMgKHNpemVvZihvdmVycmlkZXMpIC8gc2l6ZW9mKHN0cnVjdCBvdmVycmlkZSkpCisKK3N0YXRpYyBzdHJ1Y3QgYmFzZSB7CisgICAgdW5zaWduZWQgaW50IGFkZHJlc3M7CisgICAgaW50IG5vYXV0bzsKK30gYmFzZXNbXSBfX2luaXRkYXRhID0geworICAgIHsgMHhjYzAwMCwgMH0sIHsgMHhjODAwMCwgMH0sIHsgMHhkYzAwMCwgMH0sIHsgMHhkODAwMCwgMH0KK307CisKKyNkZWZpbmUgTk9fQkFTRVMgKHNpemVvZiAoYmFzZXMpIC8gc2l6ZW9mIChzdHJ1Y3QgYmFzZSkpCisKK3N0YXRpYyBzdHJ1Y3Qgc2lnbmF0dXJlIHsKKyAgICBjb25zdCBjaGFyICpzdHJpbmc7CisgICAgaW50IG9mZnNldDsKK30gc2lnbmF0dXJlc1tdIF9faW5pdGRhdGEgPSB7Cit7IlRTUk9NOiBTQ1NJIEJJT1MsIFZlcnNpb24gMS4xMiIsIDB4MzZ9LAorfTsKKworI2RlZmluZSBOT19TSUdOQVRVUkVTIChzaXplb2YgKHNpZ25hdHVyZXMpIC8gIHNpemVvZiAoc3RydWN0IHNpZ25hdHVyZSkpCisKKy8qCisgKiBGdW5jdGlvbiA6IHQxMjhfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCisgKgorICogUHVycG9zZSA6IExJTE8gY29tbWFuZCBsaW5lIGluaXRpYWxpemF0aW9uIG9mIHRoZSBvdmVycmlkZXMgYXJyYXksCisgKiAKKyAqIElucHV0cyA6IHN0ciAtIHVudXNlZCwgaW50cyAtIGFycmF5IG9mIGludGVnZXIgcGFyYW1ldGVycyB3aXRoIGludHNbMF0KKyAqCWVxdWFsIHRvIHRoZSBudW1iZXIgb2YgaW50cy4KKyAqCisgKi8KKwordm9pZCBfX2luaXQgdDEyOF9zZXR1cChjaGFyICpzdHIsIGludCAqaW50cyl7CisgICAgc3RhdGljIGludCBjb21tYW5kbGluZV9jdXJyZW50ID0gMDsKKyAgICBpbnQgaTsKKyAgICBpZiAoaW50c1swXSAhPSAyKSAKKwlwcmludGsoInQxMjhfc2V0dXAgOiB1c2FnZSB0MTI4PWFkZHJlc3MsaXJxXG4iKTsKKyAgICBlbHNlIAorCWlmIChjb21tYW5kbGluZV9jdXJyZW50IDwgTk9fT1ZFUlJJREVTKSB7CisJICAgIG92ZXJyaWRlc1tjb21tYW5kbGluZV9jdXJyZW50XS5hZGRyZXNzID0gaW50c1sxXTsKKwkgICAgb3ZlcnJpZGVzW2NvbW1hbmRsaW5lX2N1cnJlbnRdLmlycSA9IGludHNbMl07CisJICAgIGZvciAoaSA9IDA7IGkgPCBOT19CQVNFUzsgKytpKQorCQlpZiAoYmFzZXNbaV0uYWRkcmVzcyA9PSBpbnRzWzFdKSB7CisJCSAgICBiYXNlc1tpXS5ub2F1dG8gPSAxOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgKytjb21tYW5kbGluZV9jdXJyZW50OworCX0KK30KKworLyogCisgKiBGdW5jdGlvbiA6IGludCB0MTI4X2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKiB0cG50KQorICoKKyAqIFB1cnBvc2UgOiBkZXRlY3RzIGFuZCBpbml0aWFsaXplcyBUMTI4LFQxMjhGLCBvciBUMjI4IGNvbnRyb2xsZXJzCisgKgl0aGF0IHdlcmUgYXV0b3Byb2JlZCwgb3ZlcnJpZGRlbiBvbiB0aGUgTElMTyBjb21tYW5kIGxpbmUsIAorICoJb3Igc3BlY2lmaWVkIGF0IGNvbXBpbGUgdGltZS4KKyAqCisgKiBJbnB1dHMgOiB0cG50IC0gdGVtcGxhdGUgZm9yIHRoaXMgU0NTSSBhZGFwdGVyLgorICogCisgKiBSZXR1cm5zIDogMSBpZiBhIGhvc3QgYWRhcHRlciB3YXMgZm91bmQsIDAgaWYgbm90LgorICoKKyAqLworCitpbnQgX19pbml0IHQxMjhfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqIHRwbnQpeworICAgIHN0YXRpYyBpbnQgY3VycmVudF9vdmVycmlkZSA9IDAsIGN1cnJlbnRfYmFzZSA9IDA7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7CisgICAgdW5zaWduZWQgbG9uZyBiYXNlOworICAgIHZvaWQgX19pb21lbSAqcDsKKyAgICBpbnQgc2lnLCBjb3VudDsKKworICAgIHRwbnQtPnByb2NfbmFtZSA9ICJ0MTI4IjsKKyAgICB0cG50LT5wcm9jX2luZm8gPSAmdDEyOF9wcm9jX2luZm87CisKKyAgICBmb3IgKGNvdW50ID0gMDsgY3VycmVudF9vdmVycmlkZSA8IE5PX09WRVJSSURFUzsgKytjdXJyZW50X292ZXJyaWRlKSB7CisJYmFzZSA9IDA7CisJcCA9IE5VTEw7CisKKwlpZiAob3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLmFkZHJlc3MpIHsKKwkgICAgYmFzZSA9IG92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5hZGRyZXNzOworCSAgICBwID0gaW9yZW1hcChiYXNlc1tjdXJyZW50X2Jhc2VdLmFkZHJlc3MsIDB4MjAwMCk7CisJICAgIGlmICghcCkKKwkJYmFzZSA9IDA7CisJfSBlbHNlIAorCSAgICBmb3IgKDsgIWJhc2UgJiYgKGN1cnJlbnRfYmFzZSA8IE5PX0JBU0VTKTsgKytjdXJyZW50X2Jhc2UpIHsKKyNpZiAoVERFQlVHICYgVERFQlVHX0lOSVQpCisgICAgcHJpbnRrKCJzY3NpLXQxMjggOiBwcm9iaW5nIGFkZHJlc3MgJTA4eFxuIiwgYmFzZXNbY3VycmVudF9iYXNlXS5hZGRyZXNzKTsKKyNlbmRpZgorCQlpZiAoYmFzZXNbY3VycmVudF9iYXNlXS5ub2F1dG8pCisJCQljb250aW51ZTsKKwkJcCA9IGlvcmVtYXAoYmFzZXNbY3VycmVudF9iYXNlXS5hZGRyZXNzLCAweDIwMDApOworCQlpZiAoIXApCisJCQljb250aW51ZTsKKwkJZm9yIChzaWcgPSAwOyBzaWcgPCBOT19TSUdOQVRVUkVTOyArK3NpZykgCisJCSAgICBpZiAoY2hlY2tfc2lnbmF0dXJlKHAgKyBzaWduYXR1cmVzW3NpZ10ub2Zmc2V0LAorCQkJCQlzaWduYXR1cmVzW3NpZ10uc3RyaW5nLAorCQkJCQlzdHJsZW4oc2lnbmF0dXJlc1tzaWddLnN0cmluZykpKSB7CisJCQliYXNlID0gYmFzZXNbY3VycmVudF9iYXNlXS5hZGRyZXNzOworI2lmIChUREVCVUcgJiBUREVCVUdfSU5JVCkKKwkJCXByaW50aygic2NzaS10MTI4IDogZGV0ZWN0ZWQgYm9hcmQuXG4iKTsKKyNlbmRpZgorCQkJZ290byBmb3VuZDsKKwkJICAgIH0KKwkJaW91bm1hcChwKTsKKwkgICAgfQorCisjaWYgZGVmaW5lZChUREVCVUcpICYmIChUREVCVUcgJiBUREVCVUdfSU5JVCkKKwlwcmludGsoInNjc2ktdDEyOCA6IGJhc2UgPSAlMDh4XG4iLCAodW5zaWduZWQgaW50KSBiYXNlKTsKKyNlbmRpZgorCisJaWYgKCFiYXNlKQorCSAgICBicmVhazsKKworZm91bmQ6CisJaW5zdGFuY2UgPSBzY3NpX3JlZ2lzdGVyICh0cG50LCBzaXplb2Yoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEpKTsKKwlpZihpbnN0YW5jZSA9PSBOVUxMKQorCQlicmVhazsKKwkJCisJaW5zdGFuY2UtPmJhc2UgPSBiYXNlOworCSgoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKilpbnN0YW5jZS0+aG9zdGRhdGEpLT5iYXNlID0gcDsKKworCU5DUjUzODBfaW5pdChpbnN0YW5jZSwgMCk7CisKKwlpZiAob3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLmlycSAhPSBJUlFfQVVUTykKKwkgICAgaW5zdGFuY2UtPmlycSA9IG92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5pcnE7CisJZWxzZSAKKwkgICAgaW5zdGFuY2UtPmlycSA9IE5DUjUzODBfcHJvYmVfaXJxKGluc3RhbmNlLCBUMTI4X0lSUVMpOworCisJaWYgKGluc3RhbmNlLT5pcnEgIT0gU0NTSV9JUlFfTk9ORSkgCisJICAgIGlmIChyZXF1ZXN0X2lycShpbnN0YW5jZS0+aXJxLCB0MTI4X2ludHIsIFNBX0lOVEVSUlVQVCwgInQxMjgiLCBpbnN0YW5jZSkpIHsKKwkJcHJpbnRrKCJzY3NpJWQgOiBJUlElZCBub3QgZnJlZSwgaW50ZXJydXB0cyBkaXNhYmxlZFxuIiwgCisJCSAgICBpbnN0YW5jZS0+aG9zdF9ubywgaW5zdGFuY2UtPmlycSk7CisJCWluc3RhbmNlLT5pcnEgPSBTQ1NJX0lSUV9OT05FOworCSAgICB9IAorCisJaWYgKGluc3RhbmNlLT5pcnEgPT0gU0NTSV9JUlFfTk9ORSkgeworCSAgICBwcmludGsoInNjc2klZCA6IGludGVycnVwdHMgbm90IGVuYWJsZWQuIGZvciBiZXR0ZXIgaW50ZXJhY3RpdmUgcGVyZm9ybWFuY2UsXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJICAgIHByaW50aygic2NzaSVkIDogcGxlYXNlIGp1bXBlciB0aGUgYm9hcmQgZm9yIGEgZnJlZSBJUlEuXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJfQorCisjaWYgZGVmaW5lZChUREVCVUcpICYmIChUREVCVUcgJiBUREVCVUdfSU5JVCkKKwlwcmludGsoInNjc2klZCA6IGlycSA9ICVkXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgaW5zdGFuY2UtPmlycSk7CisjZW5kaWYKKworCXByaW50aygic2NzaSVkIDogYXQgMHglMDhseCIsIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+YmFzZSk7CisJaWYgKGluc3RhbmNlLT5pcnEgPT0gU0NTSV9JUlFfTk9ORSkKKwkgICAgcHJpbnRrICgiIGludGVycnVwdHMgZGlzYWJsZWQiKTsKKwllbHNlIAorCSAgICBwcmludGsgKCIgaXJxICVkIiwgaW5zdGFuY2UtPmlycSk7CisJcHJpbnRrKCIgb3B0aW9ucyBDQU5fUVVFVUU9JWQgIENNRF9QRVJfTFVOPSVkIHJlbGVhc2U9JWQiLAorCSAgICBDQU5fUVVFVUUsIENNRF9QRVJfTFVOLCBUMTI4X1BVQkxJQ19SRUxFQVNFKTsKKwlOQ1I1MzgwX3ByaW50X29wdGlvbnMoaW5zdGFuY2UpOworCXByaW50aygiXG4iKTsKKworCSsrY3VycmVudF9vdmVycmlkZTsKKwkrK2NvdW50OworICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgdDEyOF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCU5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworCU5DUjUzODBfc2V0dXAoc2hvc3QpOworCWlmIChzaG9zdC0+aXJxKQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBOVUxMKTsKKwlOQ1I1MzgwX2V4aXQoc2hvc3QpOworCWlmIChzaG9zdC0+aW9fcG9ydCAmJiBzaG9zdC0+bl9pb19wb3J0KQorCQlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgc2hvc3QtPm5faW9fcG9ydCk7CisJc2NzaV91bnJlZ2lzdGVyKHNob3N0KTsKKwlpb3VubWFwKGJhc2UpOworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gOiBpbnQgdDEyOF9iaW9zcGFyYW0oRGlzayAqIGRpc2ssIHN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwgaW50ICppcCkKKyAqCisgKiBQdXJwb3NlIDogR2VuZXJhdGVzIGEgQklPUyAvIERPUyBjb21wYXRpYmxlIEgtQy1TIG1hcHBpbmcgZm9yIAorICoJdGhlIHNwZWNpZmllZCBkZXZpY2UgLyBzaXplLgorICogCisgKiBJbnB1dHMgOiBzaXplID0gc2l6ZSBvZiBkZXZpY2UgaW4gc2VjdG9ycyAoNTEyIGJ5dGVzKSwgZGV2ID0gYmxvY2sgZGV2aWNlCisgKgltYWpvciAvIG1pbm9yLCBpcFtdID0ge2hlYWRzLCBzZWN0b3JzLCBjeWxpbmRlcnN9ICAKKyAqCisgKiBSZXR1cm5zIDogYWx3YXlzIDAgKHN1Y2Nlc3MpLCBpbml0aWFsaXplcyBpcAorICoJCisgKi8KKworLyogCisgKiBYWFggTW9zdCBTQ1NJIGJvYXJkcyB1c2UgdGhpcyBtYXBwaW5nLCBJIGNvdWxkIGJlIGluY29ycmVjdC4gIFNvbWUgb25lCisgKiB1c2luZyBoYXJkIGRpc2tzIG9uIGEgdHJhbnRvciBzaG91bGQgdmVyaWZ5IHRoYXQgdGhpcyBtYXBwaW5nIGNvcnJlc3BvbmRzCisgKiB0byB0aGF0IHVzZWQgYnkgdGhlIEJJT1MgLyBBU1BJIGRyaXZlciBieSBydW5uaW5nIHRoZSBsaW51eCBmZGlzayBwcm9ncmFtCisgKiBhbmQgbWF0Y2hpbmcgdGhlIEhfQ19TIGNvb3JkaW5hdGVzIHRvIHdoYXQgRE9TIHVzZXMuCisgKi8KKworaW50IHQxMjhfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJc2VjdG9yX3QgY2FwYWNpdHksIGludCAqIGlwKQoreworICBpcFswXSA9IDY0OworICBpcFsxXSA9IDMyOworICBpcFsyXSA9IGNhcGFjaXR5ID4+IDExOworICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfcHJlYWQgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCAKKyAqCXVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbikKKyAqCisgKiBQdXJwb3NlIDogRmFzdCA1MzgwIHBzZXVkby1kbWEgcmVhZCBmdW5jdGlvbiwgdHJhbnNmZXJzIGxlbiBieXRlcyB0byAKKyAqCWRzdAorICogCisgKiBJbnB1dHMgOiBkc3QgPSBkZXN0aW5hdGlvbiwgbGVuID0gbGVuZ3RoIGluIGJ5dGVzCisgKgorICogUmV0dXJucyA6IDAgb24gc3VjY2Vzcywgbm9uIHplcm8gb24gYSBmYWlsdXJlIHN1Y2ggYXMgYSB3YXRjaGRvZyAKKyAqIAl0aW1lb3V0LgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IE5DUjUzODBfcHJlYWQgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCB1bnNpZ25lZCBjaGFyICpkc3QsCisgICAgaW50IGxlbikgeworICAgIE5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworICAgIHZvaWQgX19pb21lbSAqcmVnOworICAgIHVuc2lnbmVkIGNoYXIgKmQgPSBkc3Q7CisgICAgcmVnaXN0ZXIgaW50IGkgPSBsZW47CisKKyAgICBOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKKyAgICByZWcgPSBiYXNlICsgVF9EQVRBX1JFR19PRkZTRVQ7CisKKyNpZiAwCisgICAgZm9yICg7IGk7IC0taSkgeworCXdoaWxlICghKHJlYWRiKGJhc2UrVF9TVEFUVVNfUkVHX09GRlNFVCkgJiBUX1NUX1JEWSkpIGJhcnJpZXIoKTsKKyNlbHNlCisgICAgd2hpbGUgKCEocmVhZGIoYmFzZStUX1NUQVRVU19SRUdfT0ZGU0VUKSAmIFRfU1RfUkRZKSkgYmFycmllcigpOworICAgIGZvciAoOyBpOyAtLWkpIHsKKyNlbmRpZgorCSpkKysgPSByZWFkYihyZWcpOworICAgIH0KKworICAgIGlmIChyZWFkYihiYXNlICsgVF9TVEFUVVNfUkVHX09GRlNFVCkgJiBUX1NUX1RJTSkgeworCXVuc2lnbmVkIGNoYXIgdG1wOworCXZvaWQgX19pb21lbSAqZm9vID0gYmFzZSArIFRfQ09OVFJPTF9SRUdfT0ZGU0VUOworCXRtcCA9IHJlYWRiKGZvbyk7CisJd3JpdGViKHRtcCB8IFRfQ1JfQ1QsIGZvbyk7CisJd3JpdGViKHRtcCwgZm9vKTsKKwlwcmludGsoInNjc2klZCA6IHdhdGNoZG9nIHRpbWVyIGZpcmVkIGluIE5DUjUzODBfcHJlYWQoKVxuIiwKKwkgICAgaW5zdGFuY2UtPmhvc3Rfbm8pOworCXJldHVybiAtMTsKKyAgICB9IGVsc2UKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfcHdyaXRlIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgCisgKgl1bnNpZ25lZCBjaGFyICpzcmMsIGludCBsZW4pCisgKgorICogUHVycG9zZSA6IEZhc3QgNTM4MCBwc2V1ZG8tZG1hIHdyaXRlIGZ1bmN0aW9uLCB0cmFuc2ZlcnMgbGVuIGJ5dGVzIGZyb20KKyAqCXNyYworICogCisgKiBJbnB1dHMgOiBzcmMgPSBzb3VyY2UsIGxlbiA9IGxlbmd0aCBpbiBieXRlcworICoKKyAqIFJldHVybnMgOiAwIG9uIHN1Y2Nlc3MsIG5vbiB6ZXJvIG9uIGEgZmFpbHVyZSBzdWNoIGFzIGEgd2F0Y2hkb2cgCisgKiAJdGltZW91dC4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBOQ1I1MzgwX3B3cml0ZSAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIHVuc2lnbmVkIGNoYXIgKnNyYywKKyAgICBpbnQgbGVuKSB7CisgICAgTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisgICAgdm9pZCBfX2lvbWVtICpyZWc7CisgICAgdW5zaWduZWQgY2hhciAqcyA9IHNyYzsKKyAgICByZWdpc3RlciBpbnQgaSA9IGxlbjsKKworICAgIE5DUjUzODBfc2V0dXAoaW5zdGFuY2UpOworICAgIHJlZyA9IGJhc2UgKyBUX0RBVEFfUkVHX09GRlNFVDsKKworI2lmIDAKKyAgICBmb3IgKDsgaTsgLS1pKSB7CisJd2hpbGUgKCEocmVhZGIoYmFzZStUX1NUQVRVU19SRUdfT0ZGU0VUKSAmIFRfU1RfUkRZKSkgYmFycmllcigpOworI2Vsc2UKKyAgICB3aGlsZSAoIShyZWFkYihiYXNlK1RfU1RBVFVTX1JFR19PRkZTRVQpICYgVF9TVF9SRFkpKSBiYXJyaWVyKCk7CisgICAgZm9yICg7IGk7IC0taSkgeworI2VuZGlmCisJd3JpdGViKCpzKyssIHJlZyk7CisgICAgfQorCisgICAgaWYgKHJlYWRiKGJhc2UgKyBUX1NUQVRVU19SRUdfT0ZGU0VUKSAmIFRfU1RfVElNKSB7CisJdW5zaWduZWQgY2hhciB0bXA7CisJdm9pZCBfX2lvbWVtICpmb28gPSBiYXNlICsgVF9DT05UUk9MX1JFR19PRkZTRVQ7CisJdG1wID0gcmVhZGIoZm9vKTsKKwl3cml0ZWIodG1wIHwgVF9DUl9DVCwgZm9vKTsKKwl3cml0ZWIodG1wLCBmb28pOworCXByaW50aygic2NzaSVkIDogd2F0Y2hkb2cgdGltZXIgZmlyZWQgaW4gTkNSNTM4MF9wd3JpdGUoKVxuIiwKKwkgICAgaW5zdGFuY2UtPmhvc3Rfbm8pOworCXJldHVybiAtMTsKKyAgICB9IGVsc2UgCisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2luY2x1ZGUgIk5DUjUzODAuYyIKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLm5hbWUgICAgICAgICAgID0gIlRyYW50b3IgVDEyOC9UMTI4Ri9UMjI4IiwKKwkuZGV0ZWN0ICAgICAgICAgPSB0MTI4X2RldGVjdCwKKwkucmVsZWFzZSAgICAgICAgPSB0MTI4X3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZCAgID0gdDEyOF9xdWV1ZV9jb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyID0gdDEyOF9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIgICAgPSB0MTI4X2J1c19yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyICAgPSB0MTI4X2hvc3RfcmVzZXQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gdDEyOF9kZXZpY2VfcmVzZXQsCisJLmJpb3NfcGFyYW0gICAgID0gdDEyOF9iaW9zcGFyYW0sCisJLmNhbl9xdWV1ZSAgICAgID0gQ0FOX1FVRVVFLAorICAgICAgICAudGhpc19pZCAgICAgICAgPSA3LAorCS5zZ190YWJsZXNpemUgICA9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4gICAgPSBDTURfUEVSX0xVTiwKKwkudXNlX2NsdXN0ZXJpbmcgPSBESVNBQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdDEyOC5oIGIvZHJpdmVycy9zY3NpL3QxMjguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjFiYTUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3QxMjguaApAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIFRyYW50b3IgVDEyOC9UMTI4Ri9UMjI4IGRlZmluZXMKKyAqCU5vdGUgOiBhcmNoaXRlY3R1cmFsbHksIHRoZSBUMTAwIGFuZCBUMTI4IGFyZSBkaWZmZXJlbnQgYW5kIHdvbid0IHdvcmsKKyAqCisgKiBDb3B5cmlnaHQgMTk5MywgRHJldyBFY2toYXJkdAorICoJVmlzaW9uYXJ5IENvbXB1dGluZworICoJKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyAqCWRyZXdAY29sb3JhZG8uZWR1CisgKiAgICAgICsxICgzMDMpIDQ0MC00ODk0CisgKgorICogRElTVFJJQlVUSU9OIFJFTEVBU0UgMy4gCisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0IAorICoKKyAqIFRyYW50b3IgU3lzdGVtcywgTHRkLgorICogVDEyOC9UMTI4Ri9UMjI4IFNDU0kgSG9zdCBBZGFwdGVyCisgKiBIYXJkd2FyZSBTcGVjaWZpY2F0aW9ucworICogCisgKiBUcmFudG9yIFN5c3RlbXMsIEx0ZC4gCisgKiA1NDE1IFJhbmRhbGwgUGxhY2UKKyAqIEZyZW1vbnQsIENBIDk0NTM4CisgKiAxKyAoNDE1KSA3NzAtMTQwMCwgRkFYIDErICg0MTUpIDc3MC05OTEwCisgKiAKKyAqIGFuZCAKKyAqCisgKiBOQ1IgNTM4MCBGYW1pbHkKKyAqIFNDU0kgUHJvdG9jb2wgQ29udHJvbGxlcgorICogRGF0YWJvb2sKKyAqCisgKiBOQ1IgTWljcm9lbGVjdHJvbmljcworICogMTYzNSBBZXJvcGxhemEgRHJpdmUKKyAqIENvbG9yYWRvIFNwcmluZ3MsIENPIDgwOTE2CisgKiAxKyAoNzE5KSA1NzgtMzQwMAorICogMSsgKDgwMCkgMzM0LTU0NTQKKyAqLworCisvKgorICogJExvZzogdDEyOC5oLHYgJAorICovCisKKyNpZm5kZWYgVDEyOF9ICisjZGVmaW5lIFQxMjhfSAorCisjZGVmaW5lIFQxMjhfUFVCTElDX1JFTEVBU0UgMworCisjZGVmaW5lIFRERUJVR19JTklUCTB4MQorI2RlZmluZSBUREVCVUdfVFJBTlNGRVIgMHgyCisKKy8qCisgKiBUaGUgdHJhbnRvciBib2FyZHMgYXJlIG1lbW9yeSBtYXBwZWQuIFRoZXkgdXNlIGFuIE5DUjUzODAgb3IgCisgKiBlcXVpdmFsZW50IChteSBzYW1wbGUgYm9hcmQgaGFkIHBhcnQgc2Vjb25kIHNvdXJjZWQgZnJvbSBaSUxPRykuCisgKiBOQ1IncyByZWNvbW1lbmRlZCAiUHNldWRvLURNQSIgYXJjaGl0ZWN0dXJlIGlzIHVzZWQsIHdoZXJlIAorICogYSBQQUwgZHJpdmVzIHRoZSBETUEgc2lnbmFscyBvbiB0aGUgNTM4MCBhbGxvd2luZyBmYXN0LCBibGluZAorICogdHJhbnNmZXJzIHdpdGggcHJvcGVyIGhhbmRzaGFraW5nLiAKKyAqLworCisvKgorICogTm90ZSA6IGEgYm9vdCBzd2l0Y2ggaXMgcHJvdmlkZWQgZm9yIHRoZSBwdXJwb3NlIG9mIGluZm9ybWluZyB0aGUgCisgKiBmaXJtd2FyZSB0byBib290IG9yIG5vdCBib290IGZyb20gYXR0YWNoZWQgU0NTSSBkZXZpY2VzLiAgU28sIEkgaW1hZ2luZQorICogdGhlcmUgYXJlIGZld2VyIHBlb3BsZSB3aG8ndmUgeWFua2VkIHRoZSBST00gbGlrZSB0aGV5IGRvIG9uIHRoZSBTZWFnYXRlCisgKiB0byBtYWtlIGJvb3R1cCBmYXN0ZXIsIGFuZCBJJ2xsIHByb2JhYmx5IHVzZSB0aGlzIGZvciBhdXRvZGV0ZWN0aW9uLgorICovCisjZGVmaW5lIFRfUk9NX09GRlNFVAkJMAorCisvKgorICogTm90ZSA6IG15IHNhbXBsZSBib2FyZCAqV0FTIE5PVCogcG9wdWxhdGVkIHdpdGggdGhlIFNSQU0sIHNvIHRoaXMKKyAqIGNhbid0IGJlIHVzZWQgZm9yIGF1dG9kZXRlY3Rpb24gd2l0aG91dCBhIFJPTSBwcmVzZW50LgorICovCisjZGVmaW5lIFRfUkFNX09GRlNFVAkJMHgxODAwCisKKy8qCisgKiBBbGwgb2YgdGhlIHJlZ2lzdGVycyBhcmUgYWxsb2NhdGVkIDMyIGJ5dGVzIG9mIGFkZHJlc3Mgc3BhY2UsIGV4Y2VwdAorICogZm9yIHRoZSBkYXRhIHJlZ2lzdGVyIChyZWFkL3dyaXRlIHRvL2Zyb20gdGhlIDUzODAgaW4gcHNldWRvLURNQSBtb2RlKQorICovIAorI2RlZmluZSBUX0NPTlRST0xfUkVHX09GRlNFVAkweDFjMDAJLyogcncgKi8KKyNkZWZpbmUgVF9DUl9JTlQJCTB4MTAJLyogRW5hYmxlIGludGVycnVwdHMgKi8KKyNkZWZpbmUgVF9DUl9DVAkJCTB4MDIJLyogUmVzZXQgd2F0Y2hkb2cgdGltZXIgKi8KKworI2RlZmluZSBUX1NUQVRVU19SRUdfT0ZGU0VUCTB4MWMyMAkvKiBybyAqLworI2RlZmluZSBUX1NUX0JPT1QJCTB4ODAJLyogQm9vdCBzd2l0Y2ggKi8KKyNkZWZpbmUgVF9TVF9TMwkJCTB4NDAJLyogVXNlciBzZXR0YWJsZSBzd2l0Y2hlcywgKi8KKyNkZWZpbmUgVF9TVF9TMgkJCTB4MjAJLyogcmVhZCAwIHdoZW4gc3dpdGNoIGlzIG9uLCAxIG9mZiAqLworI2RlZmluZSBUX1NUX1MxCQkJMHgxMAorI2RlZmluZSBUX1NUX1BTMgkJMHgwOAkvKiBTZXQgZm9yIE1pY3JvY2hhbm5lbCAyMjggKi8KKyNkZWZpbmUgVF9TVF9SRFkJCTB4MDQJLyogNTM4MCBEUlEgKi8KKyNkZWZpbmUgVF9TVF9USU0JCTB4MDIJLyogaW5kaWNhdGVzIDQwdXMgd2F0Y2hkb2cgdGltZXIgZmlyZWQgKi8KKyNkZWZpbmUgVF9TVF9aRVJPCQkweDAxCS8qIEFsd2F5cyB6ZXJvICovCisKKyNkZWZpbmUgVF81MzgwX09GRlNFVAkJMHgxZDAwCS8qIDggcmVnaXN0ZXJzIGhlcmUsIHNlZSBOQ1I1MzgwLmggKi8KKworI2RlZmluZSBUX0RBVEFfUkVHX09GRlNFVAkweDFlMDAJLyogcncgNTEyIGJ5dGVzIGxvbmcgKi8KKworI2lmbmRlZiBBU00KK3N0YXRpYyBpbnQgdDEyOF9hYm9ydChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IHQxMjhfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICosCisJCQkgIHNlY3Rvcl90LCBpbnQqKTsKK3N0YXRpYyBpbnQgdDEyOF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICopOworc3RhdGljIGludCB0MTI4X3F1ZXVlX2NvbW1hbmQoU2NzaV9DbW5kICosIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpOworc3RhdGljIGludCB0MTI4X2hvc3RfcmVzZXQoU2NzaV9DbW5kICopOworc3RhdGljIGludCB0MTI4X2J1c19yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IHQxMjhfZGV2aWNlX3Jlc2V0KFNjc2lfQ21uZCAqKTsKKworI2lmbmRlZiBDTURfUEVSX0xVTgorI2RlZmluZSBDTURfUEVSX0xVTiAyCisjZW5kaWYKKworI2lmbmRlZiBDQU5fUVVFVUUKKyNkZWZpbmUgQ0FOX1FVRVVFIDMyIAorI2VuZGlmCisKKyNpZm5kZWYgSE9TVFNfQworCisjZGVmaW5lIE5DUjUzODBfaW1wbGVtZW50YXRpb25fZmllbGRzIFwKKyAgICB2b2lkIF9faW9tZW0gKmJhc2UKKworI2RlZmluZSBOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKSBcCisgICAgdm9pZCBfX2lvbWVtICpiYXNlCisKKyNkZWZpbmUgTkNSNTM4MF9zZXR1cChpbnN0YW5jZSkgXAorICAgIGJhc2UgPSAoKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopKGluc3RhbmNlLT5ob3N0ZGF0YSkpLT5iYXNlCisKKyNkZWZpbmUgVDEyOF9hZGRyZXNzKHJlZykgKGJhc2UgKyBUXzUzODBfT0ZGU0VUICsgKChyZWcpICogMHgyMCkpCisKKyNpZiAhKFRERUJVRyAmIFRERUJVR19UUkFOU0ZFUikgCisjZGVmaW5lIE5DUjUzODBfcmVhZChyZWcpIHJlYWRiKFQxMjhfYWRkcmVzcyhyZWcpKQorI2RlZmluZSBOQ1I1MzgwX3dyaXRlKHJlZywgdmFsdWUpIHdyaXRlYigodmFsdWUpLChUMTI4X2FkZHJlc3MocmVnKSkpCisjZWxzZQorI2RlZmluZSBOQ1I1MzgwX3JlYWQocmVnKQkJCQkJCVwKKyAgICAoKCh1bnNpZ25lZCBjaGFyKSBwcmludGsoInNjc2klZCA6IHJlYWQgcmVnaXN0ZXIgJWQgYXQgYWRkcmVzcyAlMDh4XG4iXAorICAgICwgaW5zdGFuY2UtPmhvc3RubywgKHJlZyksIFQxMjhfYWRkcmVzcyhyZWcpKSksIHJlYWRiKFQxMjhfYWRkcmVzcyhyZWcpKSkKKworI2RlZmluZSBOQ1I1MzgwX3dyaXRlKHJlZywgdmFsdWUpIHsJCQkJCVwKKyAgICBwcmludGsoInNjc2klZCA6IHdyaXRlICUwMnggdG8gcmVnaXN0ZXIgJWQgYXQgYWRkcmVzcyAlMDh4XG4iLCAJXAorCSAgICBpbnN0YW5jZS0+aG9zdG5vLCAodmFsdWUpLCAocmVnKSwgVDEyOF9hZGRyZXNzKHJlZykpOwlcCisgICAgd3JpdGViKCh2YWx1ZSksIChUMTI4X2FkZHJlc3MocmVnKSkpOwkJCQlcCit9CisjZW5kaWYKKworI2RlZmluZSBOQ1I1MzgwX2ludHIgdDEyOF9pbnRyCisjZGVmaW5lIGRvX05DUjUzODBfaW50ciBkb190MTI4X2ludHIKKyNkZWZpbmUgTkNSNTM4MF9xdWV1ZV9jb21tYW5kIHQxMjhfcXVldWVfY29tbWFuZAorI2RlZmluZSBOQ1I1MzgwX2Fib3J0IHQxMjhfYWJvcnQKKyNkZWZpbmUgTkNSNTM4MF9ob3N0X3Jlc2V0IHQxMjhfaG9zdF9yZXNldAorI2RlZmluZSBOQ1I1MzgwX2RldmljZV9yZXNldCB0MTI4X2RldmljZV9yZXNldAorI2RlZmluZSBOQ1I1MzgwX2J1c19yZXNldCB0MTI4X2J1c19yZXNldAorI2RlZmluZSBOQ1I1MzgwX3Byb2NfaW5mbyB0MTI4X3Byb2NfaW5mbworCisvKiAxNSAxNCAxMiAxMCA3IDUgMyAKKyAgIDExMDEgMDEwMCAxMDEwIDEwMDAgKi8KKyAgIAorI2RlZmluZSBUMTI4X0lSUVMgMHhjNGE4IAorCisjZW5kaWYgLyogZWxzZSBkZWYgSE9TVFNfQyAqLworI2VuZGlmIC8qIG5kZWYgQVNNICovCisjZW5kaWYgLyogVDEyOF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdG1zY3NpbS5jIGIvZHJpdmVycy9zY3NpL3Rtc2NzaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTlkZjAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Rtc2NzaW0uYwpAQCAtMCwwICsxLDI2OTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCUZJTEUgTkFNRSA6IFRNU0NTSU0uQwkJCQkJCSoKKyAqCSAgICAgQlkgICA6IEMuTC4gSHVhbmcsICBjaGluZ0B0ZWtyYW0uY29tLnR3CQkJKgorICoJRGVzY3JpcHRpb246IERldmljZSBEcml2ZXIgZm9yIFRla3JhbSBEQy0zOTAoVCkgUENJIFNDU0kJKgorICoJCSAgICAgQnVzIE1hc3RlciBIb3N0IEFkYXB0ZXIJCQkJKgorICogKEMpQ29weXJpZ2h0IDE5OTUtMTk5NiBUZWtyYW0gVGVjaG5vbG9neSBDby4sIEx0ZC4JCQkqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAoQykgQ29weXJpZ2h0OiBwdXQgdW5kZXIgR05VIEdQTCBpbiAxMC85NgkJCQkqCisgKgkJCQkoc2VlIERvY3VtZW50YXRpb24vc2NzaS90bXNjc2ltLnR4dCkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogJElkOiB0bXNjc2ltLmMsdiAyLjYwLjIuMzAgMjAwMC8xMi8yMCAwMTowNzoxMiBnYXJsb2ZmIEV4cCAkCQkqCisgKglFbmhhbmNlbWVudHMgYW5kIGJ1Z2ZpeGVzIGJ5CQkJCQkqCisgKglLdXJ0IEdhcmxvZmYgPGt1cnRAZ2FybG9mZi5kZT4JPGdhcmxvZmZAc3VzZS5kZT4JCSoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCUhJU1RPUlk6CQkJCQkJCSoKKyAqCQkJCQkJCQkJKgorICoJUkVWIwlEQVRFCU5BTUUJREVTQ1JJUFRJT04JCQkJKgorICoJMS4wMCAgOTYvMDQvMjQJQ0xICUZpcnN0IHJlbGVhc2UJCQkJKgorICoJMS4wMSAgOTYvMDYvMTIJQ0xICUZpeGVkIGJ1ZyBvZiBNZWRpYSBDaGFuZ2UgZm9yIFJlbW92YWJsZSAqCisgKgkJCQlEZXZpY2UsIHNjYW4gYWxsIExVTi4gU3VwcG9ydCBQcmUyLjAuMTAgKgorICoJMS4wMiAgOTYvMDYvMTgJQ0xICUZpeGVkIGJ1ZyBvZiBDb21tYW5kIHRpbWVvdXQgLi4uCSoKKyAqCTEuMDMgIDk2LzA5LzI1CUtHCUFkZGVkIHRtc2NzaW1fcHJvY19pbmZvKCkJCSoKKyAqCTEuMDQgIDk2LzEwLzExCUNMSAlVcGRhdGluZyBmb3Igc3VwcG9ydCBLViAyLjAueAkJKgorICoJMS4wNSAgOTYvMTAvMTgJS0cJRml4ZWQgYnVnIGluIERDMzkwX2Fib3J0KG51bGwgcHRyIGRlcmVmKSoKKyAqCTEuMDYgIDk2LzEwLzI1CUtHCUZpeGVkIG1vZHVsZSBzdXBwb3J0CQkJKgorICoJMS4wNyAgOTYvMTEvMDkJS0cJRml4ZWQgdG1zY3NpbV9wcm9jX2luZm8oKQkJKgorICoJMS4wOCAgOTYvMTEvMTgJS0cJRml4ZWQgbnVsbCBwdHIgaW4gREMzOTBfRGlzY29ubmVjdCgpCSoKKyAqCTEuMDkgIDk2LzExLzMwCUtHCUFkZGVkIHJlZ2lzdGVyIHRoZSBhbGxvY2F0ZWQgSU8gc3BhY2UJKgorICoJMS4xMCAgOTYvMTIvMDUJQ0xICU1vZGlmaWVkIHRtc2NzaW1fcHJvY19pbmZvKCksIGFuZCByZXNldCAqCisgKgkJCQlwZW5kaW5nIGludGVycnVwdCBpbiBEQzM5MF9kZXRlY3QoKQkqCisgKgkxLjExICA5Ny8wMi8wNQlLRy9DTEgJRml4ZWRzIHByb2JsZW0gd2l0aCBwYXJ0aXRpb25zIGdyZWF0ZXIJKgorICoJCQkJdGhhbiAxR0IJCQkJKgorICoJMS4xMiAgOTgvMDIvMTUgIE1KICAgICAgUmV3cml0dGVuIFBDSSBwcm9iaW5nCQkJKgorICoJMS4xMyAgOTgvMDQvMDgJS0cJU3VwcG9ydCBmb3Igbm9uIERDMzkwLCBfX2luaXRmdW5jIGRlY2xzLCoKKyAqCQkJCWNoYW5nZWQgbWF4IGRldnMgZnJvbSAxMCB0byAxNgkJKgorICoJMS4xNGEgOTgvMDUvMDUJS0cJRHluYW1pYyBEQ0IgYWxsb2NhdGlvbiwgYWRkLXNpbmdsZS1kZXYJKgorICoJCQkJZm9yIExVTnMgaWYgTFVOX1NDQU4gKEJJT1MpIG5vdCBzZXQJKgorICoJCQkJcnVudGltZSBjb25maWcgdXNpbmcgL3Byb2MgaW50ZXJmYWNlCSoKKyAqCTEuMTRiIDk4LzA1LzA2CUtHCWVsaW1pbmF0ZWQgY2xpICgpOyBzdGkgKCk7IHNwaW5sb2NrcwkqCisgKgkxLjE0YyA5OC8wNS8wNwlLRwkyLjAueCBjb21wYXRpYmlsaXR5CQkJKgorICoJMS4yMGEgOTgvMDUvMDcJS0cJY2hhbmdlZCBuYW1lcyBvZiBmdW5jcyB0byBiZSBjb25zaXN0ZW50ICoKKyAqCQkJCURDMzkwXyAoZW50cnkgcG9pbnRzKSwgZGMzOTBfIChpbnRlcm5hbCkqCisgKgkJCQlyZXdvcmtlZCBsb2NraW5nCQkJKgorICoJMS4yMGIgOTgvMDUvMTIJS0cJYnVnczogdmVyc2lvbiwga2ZyZWUsIF9jdG1wCQkqCisgKgkJCQlkZWJ1ZyBvdXRwdXQJCQkJKgorICoJMS4yMGMgOTgvMDUvMTIJS0cJYnVnczoga2ZyZWUsIHBhcnNpbmcsIEVFcHJvbURlZmF1bHRzCSoKKyAqCTEuMjBkIDk4LzA1LzE0CUtHCWJ1Z3M6IGxpc3QgbGlua2FnZSwgY2xlYXIgZmxhZyBhZnRlciAgCSoKKyAqCQkJCXJlc2V0IG9uIHN0YXJ0dXAsIGNvZGUgY2xlYW51cAkJKgorICoJMS4yMGUgOTgvMDUvMTUJS0cJc3BpbmxvY2sgY29tbWVudHMsIG5hbWUgc3BhY2UgY2xlYW51cAkqCisgKgkJCQlwTGFzdERDQiBub3cgcGFydCBvZiBBQ0Igc3RydWN0dXJlCSoKKyAqCQkJCWFkZGVkIHN0YXRzLCB0aW1lb3V0IGZvciAyLjEsIFRhZ1EgYnVnCSoKKyAqCQkJCVJFU0VUIGFuZCBJTlFVSVJZIGludGVyZmFjZSBjb21tYW5kcwkqCisgKgkxLjIwZiA5OC8wNS8xOAlLRwlzcGlubG9ja3MgZml4ZXMsIG1heF9sdW4gZml4LCBmcmVlIERDQnMJKgorICoJCQkJZm9yIG1pc3NpbmcgTFVOcywgcGVuZGluZyBpbnQJCSoKKyAqCTEuMjBnIDk4LzA1LzE5CUtHCUNsZWFuIHVwOiBBdm9pZCBzaG9ydAkJCSoKKyAqCTEuMjBoIDk4LzA1LzIxCUtHCVJlbW92ZSBBZGFwdFNDU0lJRCwgbWF4X2x1biAuLi4JCSoKKyAqCTEuMjBpIDk4LzA1LzIxCUtHCUFpaWllOiBCdWcgd2l0aCBUYWdRTWFzayAgICAgICAJCSoKKyAqCTEuMjBqIDk4LzA1LzI0CUtHCUhhbmRsZSBTVEFUX0JVU1ksIGhhbmRsZSBwQUNCLT5wTGlua0RDQgkqCisgKgkJCQk9PSAwIGluIHJlbW92ZV9kZXYgYW5kIERvaW5nU1JCX0RvbmUJKgorICoJMS4yMGsgOTgvMDUvMjUJS0cJRE1BX0lOVAkoZXhwZXJpbWVudGFsKQkgICAgICAgCQkqCisgKgkxLjIwbCA5OC8wNS8yNwlLRwlyZW1vdmUgRE1BX0lOVDsgRE1BX0lETEUgY21kcyBhZGRlZDsJKgorICoJMS4yMG0gOTgvMDYvMTAJS0cJZ2xpdGNoIGNvbmZpZ3VyYWJsZTsgbWFkZSBzb21lIGdsb2JhbAkqCisgKgkJCQl2YXJzIHBhcnQgb2YgQUNCOyB1c2UgREMzOTBfcmVhZFgJKgorICoJMS4yMG4gOTgvMDYvMTEJS0cJc3RhcnR1cCBwYXJhbXMJCQkJKgorICoJMS4yMG8gOTgvMDYvMTUJS0cJYWRkZWQgVGFnTWF4TnVtIHRvIGJvb3QvbW9kdWxlIHBhcmFtcwkqCisgKgkJCQlEZXZpY2UgTnIgLT4gSWR4LCBUYWdNYXhOdW0gcG93ZXIgb2YgMiAgKgorICoJMS4yMHAgOTgvMDYvMTcJS0cJRG9jdSB1cGRhdGVzLiBSZXNldCBkZXBlbmRzIG9uIHNldHRpbmdzICoKKyAqCQkJCXBjaV9zZXRfbWFzdGVyIGFkZGVkOyAyLjAueHg6IHBjaWJpb3NfKgkqCisgKgkJCQl1c2VkIGluc3RlYWQgb2YgTWVjaE51bSB0aGluZ3MgLi4uCSoKKyAqCTEuMjBxIDk4LzA2LzIzCUtHCUNoYW5nZWQgZGVmYXVsdHMuIEFkZGVkIGRlYnVnIGNvZGUgZm9yCSoKKyAqCQkJCXJlbW92YWJsZSBtZWRpYSBhbmQgZml4ZWQgaXQuIFRhZ01heE51bQkqCisgKgkJCQlmaXhlZCBmb3IgREMzOTAuIExvY2tpbmc6IEFDQiwgRFJWIGZvcgkqCisgKgkJCQliZXR0ZXIgSVJRIHNoYXJpbmcuIFNwZWxsaW5nOiBRdWV1ZWluZwkqCisgKgkJCQlQYXJzaW5nIGFuZCBnbGl0Y2hfY2ZnIGNoYW5nZXMuIERpc3BsYXkJKgorICoJCQkJcmVhbCBTeW5jU3BlZWQgdmFsdWUuIE1hZGUgRGlzQ29ubgkqCisgKgkJCQlmdW5jdGlvbmFsICghKQkJCQkqCisgKgkxLjIwciA5OC8wNi8zMAlLRwlEZWJ1ZyBtYWNyb3MsIGFsbG93IGRpc2FibGluZyBEc0NuLCBzZXQJKgorICoJCQkJQklUNCBpbiBDdHJsUjQsIEVOX1BBR0VfSU5ULCAyLjAgbW9kdWxlCSoKKyAqCQkJCXBhcmFtIC0xIGZpeGVkLgkJCQkqCisgKgkxLjIwcyA5OC8wOC8yMAlLRwlEZWJ1ZyBpbmZvIG9uIGFib3J0KCksIHRyeSB0byBjaGVjayBQQ0ksKgorICoJCQkJcGh5c190b19idXMgaW5zdGVhZCBvZiBwaHlzX3RvX3ZpcnQsCSoKKyAqCQkJCWZpeGVkIHNlbC4gcHJvY2VzcywgZml4ZWQgbG9ja2luZywJKgorICoJCQkJYWRkZWQgTU9EVUxFX1hYWCBpbmZvcywgY2hhbmdlZCBJUlEJKgorICoJCQkJcmVxdWVzdCBmbGFncywgZGlzYWJsZSBETUFfSU5UCQkqCisgKgkxLjIwdCA5OC8wOS8wNwlLRwlUYWdRIHJlcG9ydCBmaXhlZDsgV3JpdGUgRXJhc2UgRE1BIFN0YXQ7KgorICoJCQkJaW5pdGZ1bmMgLT4gX19pbml0OyBiZXR0ZXIgYWJvcnQ7CSoKKyAqCQkJCVRpbWVvdXQgZm9yIFhGRVJfRE9ORSAmIEJMQVNUX0NPTVBMRVRFOwkqCisgKgkJCQlBbGxvdyB1cCB0byAzMyBjb21tYW5kcyBiZWluZyBwcm9jZXNzZWQgKgorICoJMi4wYSAgOTgvMTAvMTQJS0cJTWF4IENtbmRzIGJhY2sgdG8gMTcuIERNQV9TdGF0IGNsZWFyaW5nICoKKyAqCQkJCWFsbCBmbGFncy4gQ2xlYXIgd2l0aGluIHdoaWxlKCkgbG9vcHMJKgorICoJCQkJaW4gRGF0YUluXzAvT3V0XzAuIE51bGwgcHRyIGluIGR1bXBpbmZvCSoKKyAqCQkJCWZvciBwU1JCPT0wLiBCZXR0ZXIgbG9ja2luZyBkdXJpbmcgaW5pdC4qCisgKgkJCQliaW9zX3BhcmFtKCkgbm93IHJlc3BlY3RzIHBhcnQuIHRhYmxlLgkqCisgKgkyLjBiICA5OC8xMC8yNAlLRwlEb2N1IGZpeGVzLiBUaW1lb3V0IE1zZyBpbiBETUEgQmxhc3QuCSoKKyAqCQkJCURpc2FsbG93IGlsbGVnYWwgaWR4IGluIElOUVVJUlkvUkVNT1ZFCSoKKyAqCTIuMGMgIDk4LzExLzE5CUtHCUNsZWFuZWQgdXAgZGV0ZWN0L2luaXQgZm9yIFNNUCBib3hlcywgCSoKKyAqCQkJCVdyaXRlIEVyYXNlIERNQSAoMS4yMHQpIGNhdXNlZCBwcm9ibGVtcwkqCisgKgkyLjBkICA5OC8xMi8yNQlLRwlDaHJpc3RtYXMgcmVsZWFzZSA7LSkgTWVzc2FnZSBoYW5kbGluZyAgKgorICoJCQkJY29tcGxldGVseSByZXdvcmtlZC4gSGFuZGxlIHRhcmdldCBpbmktCSoKKyAqCQkJCXRpYXRlZCBTRFRSIGNvcnJlY3RseS4JCQkqCisgKgkyLjBkMSA5OS8wMS8yNQlLRwlUcnkgdG8gaGFuZGxlIFJFU1RPUkVfUFRSCQkqCisgKgkyLjBkMiA5OS8wMi8wOAlLRwlDaGVjayBmb3IgZmFpbHVyZSBvZiBrbWFsbG9jLCBjb3JyZWN0IAkqCisgKgkJCQlpbmNsdXNpb24gb2Ygc2NzaWNhbS5oLCBEZWxheVJlc2V0CSoKKyAqCTIuMGQzIDk5LzA1LzMxCUtHCURSSVZFUl9PSyAtPiBESURfT0ssIERJRF9OT19DT05ORUNULAkqCisgKgkJCQlkZXRlY3QgVGFyZ2V0IG1vZGUgYW5kIHdhcm4uCQkqCisgKgkJCQlwY21kLT5yZXN1bHQgaGFuZGxpbmcgY2xlYW5lZCB1cC4JKgorICoJMi4wZDQgOTkvMDYvMDEJS0cJQ2xlYW5lZCBzZWxlY3Rpb24gcHJvY2Vzcy4gRm91bmQgYnVnCSoKKyAqCQkJCXdoaWNoIHByZXZlbnRlZCBtb3JlIHRoYW4gMTYgdGFncy4gTm93OgkqCisgKgkJCQkyNC4gU0RUUiBjbGVhbnVwLiBDbGVhbmVyIG11bHRpLUxVTgkqCisgKgkJCQloYW5kbGluZy4gRG9uJ3QgbW9kaWZ5IENvbnRyb2xSZWdzL0ZJRk8JKgorICoJCQkJd2hlbiBjb25uZWN0ZWQuCQkJCSoKKyAqCTIuMGQ1IDk5LzA2LzAxCUtHCUNsZWFyIERldklELCBGaXggSU5RVUlSWSBhZnRlciBjZmcgY2hnLgkqCisgKgkyLjBkNiA5OS8wNi8wMglLRwlBZGRlZCBBREQgc3BlY2lhbCBjb21tYW5kIHRvIGFsbG93IGNmZy4JKgorICoJCQkJYmVmb3JlIGRldGVjdGlvbi4gUmVzZXQgU1lOQ19ORUdPX0RPTkUJKgorICoJCQkJYWZ0ZXIgYSBidXMgcmVzZXQuCQkJKgorICoJMi4wZDcgOTkvMDYvMDMJS0cJRml4ZWQgYnVncyB3cnQgYWRkLHJlbW92ZSBjb21tYW5kcwkqCisgKgkyLjBkOCA5OS8wNi8wNAlLRwlSZW1vdmVkIGNvcHlpbmcgb2YgY21uZCBpbnRvIENtZEJsb2NrLgkqCisgKgkJCQlGaXhlZCBPb3BzIGluIF9yZWxlYXNlKCkuCQkqCisgKgkyLjBkOSA5OS8wNi8wNglLRwlBbHNvIHRhZyBxdWV1ZSBJTlFVSVJZLCBUX1VfUiwgLi4uCSoKKyAqCQkJCUFsbG93IGFyYi4gbm8uIG9mIFRhZ2dlZCBDbW5kcy4gTWF4IDMyCSoKKyAqCTIuMGQxMDk5LzA2LzIwCUtHCVRhZ01heE5vIGNoYW5nZXMgbm93IGhvbm91cmVkISBRdWV1ZWluZyAqCisgKgkJCQljbGVhcmlmaWVkIChyZW5hbWVkIC4uKSBUYWdNYXNrIGhhbmRsaW5nKgorICoJCQkJY2xlYW5lZC4JCQkJKgorICoJMi4wZDExOTkvMDYvMjgJS0cJY21kLT5yZXN1bHQgbm93IGlkZW50aWNhbCB0byAyLjBkMgkqCisgKgkyLjBkMTI5OS8wNy8wNAlLRwlDaGFuZ2VkIG9yZGVyIG9mIHByb2Nlc3NpbmcgaW4gSVJRCSoKKyAqCTIuMGQxMzk5LzA3LzA1CUtHCURvbid0IHVwZGF0ZSBEQ0IgZmllbGRzIGlmIHJlbW92ZWQJKgorICoJMi4wZDE0OTkvMDcvMDUJS0cJcmVtb3ZlX2RldjogTW92ZSBrZnJlZSgpIHRvIHRoZSBlbmQJKgorICoJMi4wZDE1OTkvMDcvMTIJS0cJdXNlX25ld19laF9jb2RlOiAwLCBVTE9ORyAtPiBVSU5UIHdoZXJlCSoKKyAqCQkJCWFwcHJvcHJpYXRlCQkJCSoKKyAqCTIuMGQxNjk5LzA3LzEzCUtHCVJlZW5hYmxlIFN0YXJ0U0NTSSBpbnRlcnJ1cHQsIFJldHJ5IG1zZwkqCisgKgkyLjBkMTc5OS8wNy8xNQlLRwlSZW1vdmUgZGVidWcgbXNnLiBEaXNhYmxlIHJlY2ZnLiB3aGVuCSoKKyAqCQkJCXRoZXJlIGFyZSBxdWV1ZWQgY21uZHMJCQkqCisgKgkyLjBkMTg5OS8wNy8xOAlLRwlTZWxlY3Rpb24gdGltZW91dDogRG9uJ3QgcmVxdWV1ZQkqCisgKgkyLjBkMTk5OS8wNy8xOAlLRwlBYm9ydDogT25seSBjYWxsIHNjc2lfZG9uZSBpZiBkZXF1ZXVlZAkqCisgKgkyLjBkMjA5OS8wNy8xOQlLRwlSc3RfRGV0ZWN0OiBEb2luZ1NSQl9Eb25lCQkqCisgKgkyLjBkMjE5OS8wOC8xNQlLRwlkZXZfaWQgZm9yIHJlcXVlc3QvZnJlZV9pcnEsIGNtbmRbMF0gZm9yKgorICoJCQkJUkVUUlksIFNSQmRvbmUgZG9lcyBESURfQUJPUlQgZm9yIHRoZSAJKgorICoJCQkJY21kIHBhc3NlZCBieSBEQzM5MF9yZXNldCgpCQkqCisgKgkyLjBkMjI5OS8wOC8yNQlLRwlkZXZfaWQgZml4ZWQuIGNhbl9xdWV1ZTogNDIJCSoKKyAqCTIuMGQyMzk5LzA4LzI1CUtHCVJlbW92ZWQgc29tZSBkZWJ1Z2dpbmcgY29kZS4gZGV2X2lkIAkqCisgKgkJCQlub3cgaXMgc2V0IHRvIHBBQ0IuIFVzZSB1OCx1MTYsdTMyLiAJKgorICoJMi4wZDI0OTkvMTEvMTQJS0cJVW5yZWcuIEkvTyBpZiBmYWlsZWQgSVJRIGFsbG9jLiBDYWxsCSoKKyAqIAkJCQlkb25lICgpIHcvIERJRF9CQURfVEFSR0VUIGluIGNhc2Ugb2YJKgorICoJCQkJbWlzc2luZyBEQ0IuIFdlCWFyZSBvbGQgRUghIQkJKgorICoJMi4wZDI1MDAvMDEvMTUJS0cJMi4zLjN4IGNvbXBhdCBmcm9tIEFuZHJlYXMgU2NodWx0egkqCisgKgkJCQlzZXQgdW5pcXVlX2lkLiBEaXNhYmxlIFJFVFJZIG1lc3NhZ2UuCSoKKyAqCTIuMGQyNjAwLzAxLzI5CUtHCUdvIHRvIG5ldyBFSC4JCQkJKgorICoJMi4wZDI3MDAvMDEvMzEJS0cJLi4uIGJ1dCBtYWludGFpbiAyLjAgY29tcGF0LgkJKgorICoJCQkJYW5kIGZpeCBEQ0IgZnJlZWluZwkJCSoKKyAqCTIuMGQyODAwLzAyLzE0CUtHCVF1ZXVlIHN0YXRpc3RpY3MgZml4ZWQsIGR1bXAgc3BlY2lhbCBjbWQqCisgKgkJCQlXYWl0aW5nX1RpbWVyIGZvciBmYWlsZWQgU3RhcnRTQ1NJCSoKKyAqCQkJCU5ldyBFSDogRG9uJ3QgcmV0dXJuIGNtbmRzIHRvIE1MIG9uIFJTVCAqCisgKgkJCQlVc2Ugb2xkIEVIIChkb24ndCBoYXZlIG5ldyBFSCBmbnMgeWV0KQkqCisgKiAJCQkJUmVzZXQ6IFVubG9jaywgYnV0IHJlZnVzZSB0byBxdWV1ZQkqCisgKiAJCQkJMi4zIF9fc2V0dXAgZnVuY3Rpb24JCQkqCisgKgkyLjBlICAwMC8wNS8yMglLRwlSZXR1cm4gcmVzaWR1YWwgZm9yIDIuMwkJCSoKKyAqCTIuMGUxIDAwLzA1LzI1CUtHCUNvbXBpbGUgZml4ZXMgZm9yIDIuMy45OQkJKgorICoJMi4wZTIgMDAvMDUvMjcJS0cJSmVmZiBHYXJ6aWsncyBwY2lfZW5hYmxlX2RldmljZSgpCSoKKyAqCTIuMGUzIDAwLzA5LzI5CUtHCVNvbWUgMi40IGNoYW5nZXMuIERvbid0IHRyeSBTeW5jIE5lZ28JKgorICoJCQkJYmVmb3JlIElOUVVJUlkgaGFzIHJlcG9ydGVkIGFiaWxpdHkuIAkqCisgKgkJCQlSZWNvZ25pc2UgSU5RVUlSWSBhcyBzY2FubmluZyBjb21tYW5kLgkqCisgKgkyLjBlNCAwMC8xMC8xMwlLRwlBbGxvdyBjb21waWxhdGlvbiBpbnRvIDIuNCBrZXJuZWwJKgorICoJMi4wZTUgMDAvMTEvMTcJS0cJU3RvcmUgSW5xLmZsYWdzIGluIERDQgkJCSoKKyAqCTIuMGU2IDAwLzExLzIyICBLRwkyLjQgaW5pdCBmdW5jdGlvbiAoVGh4IHRvIE8uU2NodW1hbm4pCSoKKyAqIAkJCQkyLjQgUENJIGRldmljZSB0YWJsZSAoVGh4IHRvIEEuUmljaHRlcikJKgorICoJMi4wZTcgMDAvMTEvMjgJS0cJQWxsb3cgb3ZlcnJpZGluZyBvZiBCSU9TIHNldHRpbmdzCSoKKyAqCTIuMGYgIDAwLzEyLzIwCUtHCUhhbmRsZSBmYWlsZWQgSU5RVUlSWXMgZHVyaW5nIHNjYW4JKgorICoJMi4xYSAgMDMvMTEvMjkgIEdMLCBLRwlJbml0aWFsIGZpeGluZyBmb3IgMi42LiBDb252ZXJ0IHRvCSoKKyAqCQkJCXVzZSB0aGUgY3VycmVudCBQQ0ktbWFwcGluZyBBUEksIHVwZGF0ZQkqCisgKgkJCQljb21tYW5kLXF1ZXVpbmcuCQkJKgorICoJMi4xYiAgMDQvMDQvMTMgIEdMCUZpeCBmb3IgNjQtYml0IHBsYXRmb3JtcwkJKgorICoJMi4xYjEgMDQvMDEvMzEJR0wJKGFwcGxpZWQgMDUuMDQpIFJlbW92ZSBpbnRlcm5hbAkJKgorICoJCQkJY29tbWFuZC1xdWV1aW5nLgkJCSoKKyAqCTIuMWIyIDA0LzAyLzAxCUNICShhcHBsaWVkIDA1LjA0KSBGaXggZXJyb3ItaGFuZGxpbmcJKgorICoJMi4xYyAgMDQvMDUvMjMgIEdMCVVwZGF0ZSB0byB1c2UgdGhlIG5ldyBwY2lfZHJpdmVyIEFQSSwJKgorICoJCQkJc29tZSBzY3NpIEVIIHVwZGF0ZXMsIG1vcmUgY2xlYW51cC4JKgorICoJMi4xZCAgMDQvMDUvMjcJR0wJTW92ZWQgc2V0dGluZyBvZiBzY2FuX2RldmljZXMgdG8JKgorICoJCQkJc2xhdmVfYWxsb2MvX2NvbmZpZ3VyZS9fZGVzdHJveSwgYXMJKgorICoJCQkJc3VnZ2VzdGVkIGJ5IENILgkJCSoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogREVCVUcgb3B0aW9ucyAqLworLy8jZGVmaW5lIERDMzkwX0RFQlVHMAorLy8jZGVmaW5lIERDMzkwX0RFQlVHMQorLy8jZGVmaW5lIERDMzkwX0RDQkRFQlVHCisvLyNkZWZpbmUgREMzOTBfUEFSU0VERUJVRworLy8jZGVmaW5lIERDMzkwX1JFTU9WQUJMRURFQlVHCisvLyNkZWZpbmUgREMzOTBfTE9DS0RFQlVHCisKKy8vI2RlZmluZSBOT1AgZG97fXdoaWxlKDApCisjZGVmaW5lIENfTk9QCisKKy8qIERlYnVnIGRlZmluaXRpb25zICovCisjaWZkZWYgREMzOTBfREVCVUcwCisjIGRlZmluZSBERUJVRzAoeCkgeAorI2Vsc2UKKyMgZGVmaW5lIERFQlVHMCh4KSBDX05PUAorI2VuZGlmCisjaWZkZWYgREMzOTBfREVCVUcxCisjIGRlZmluZSBERUJVRzEoeCkgeAorI2Vsc2UKKyMgZGVmaW5lIERFQlVHMSh4KSBDX05PUAorI2VuZGlmCisjaWZkZWYgREMzOTBfRENCREVCVUcKKyMgZGVmaW5lIERDQkRFQlVHKHgpIHgKKyNlbHNlCisjIGRlZmluZSBEQ0JERUJVRyh4KSBDX05PUAorI2VuZGlmCisjaWZkZWYgREMzOTBfUEFSU0VERUJVRworIyBkZWZpbmUgUEFSU0VERUJVRyh4KSB4CisjZWxzZQorIyBkZWZpbmUgUEFSU0VERUJVRyh4KSBDX05PUAorI2VuZGlmCisjaWZkZWYgREMzOTBfUkVNT1ZBQkxFREVCVUcKKyMgZGVmaW5lIFJFTU9WQUJMRURFQlVHKHgpIHgKKyNlbHNlCisjIGRlZmluZSBSRU1PVkFCTEVERUJVRyh4KSBDX05PUAorI2VuZGlmCisjZGVmaW5lIERDQkRFQlVHMSh4KSBDX05PUAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorCisKKyNkZWZpbmUgREMzOTBfQkFOTkVSICJUZWtyYW0gREMzOTAvQU01M0M5NzQiCisjZGVmaW5lIERDMzkwX1ZFUlNJT04gIjIuMWQgMjAwNC0wNS0yNyIKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRDUzQzk3NCAJUENJX0RFVklDRV9JRF9BTURfU0NTSQorCisjaW5jbHVkZSAidG1zY3NpbS5oIgorCisKK3N0YXRpYyB2b2lkIGRjMzkwX0RhdGFPdXRfMCggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKTsKK3N0YXRpYyB2b2lkIGRjMzkwX0RhdGFJbl8wKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpOworc3RhdGljIHZvaWQgZGMzOTBfQ29tbWFuZF8wKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpOworc3RhdGljIHZvaWQgZGMzOTBfU3RhdHVzXzAoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIsIHU4ICpwc3N0YXR1cyk7CitzdGF0aWMgdm9pZCBkYzM5MF9Nc2dPdXRfMCggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKTsKK3N0YXRpYyB2b2lkIGRjMzkwX01zZ0luXzAoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIsIHU4ICpwc3N0YXR1cyk7CitzdGF0aWMgdm9pZCBkYzM5MF9EYXRhT3V0UGhhc2UoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIsIHU4ICpwc3N0YXR1cyk7CitzdGF0aWMgdm9pZCBkYzM5MF9EYXRhSW5QaGFzZSggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKTsKK3N0YXRpYyB2b2lkIGRjMzkwX0NvbW1hbmRQaGFzZSggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKTsKK3N0YXRpYyB2b2lkIGRjMzkwX1N0YXR1c1BoYXNlKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpOworc3RhdGljIHZvaWQgZGMzOTBfTXNnT3V0UGhhc2UoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIsIHU4ICpwc3N0YXR1cyk7CitzdGF0aWMgdm9pZCBkYzM5MF9Nc2dJblBoYXNlKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpOworc3RhdGljIHZvaWQgZGMzOTBfTm9wXzAoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIsIHU4ICpwc3N0YXR1cyk7CitzdGF0aWMgdm9pZCBkYzM5MF9Ob3BfMSggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKTsKKworc3RhdGljIHZvaWQgZGMzOTBfU2V0WGZlclJhdGUoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9kY2IqIHBEQ0IgKTsKK3N0YXRpYyB2b2lkIGRjMzkwX0Rpc2Nvbm5lY3QoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IgKTsKK3N0YXRpYyB2b2lkIGRjMzkwX1Jlc2VsZWN0KCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCICk7CitzdGF0aWMgdm9pZCBkYzM5MF9TUkJkb25lKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfZGNiKiBwRENCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCICk7CitzdGF0aWMgdm9pZCBkYzM5MF9TY3NpUnN0RGV0ZWN0KCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCICk7CitzdGF0aWMgdm9pZCBkYzM5MF9FbmFibGVNc2dPdXRfQWJvcnQoc3RydWN0IGRjMzkwX2FjYiosIHN0cnVjdCBkYzM5MF9zcmIqKTsKK3N0YXRpYyB2b2lkIGRjMzkwX2R1bXBpbmZvKHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9kY2IqIHBEQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIpOworc3RhdGljIHZvaWQgZGMzOTBfUmVzZXREZXZQYXJhbShzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCKTsKKworc3RhdGljIHUzMglkYzM5MF9sYXN0c3RhdHVzID0gMDsKK3N0YXRpYyB1OAlkYzM5MF9hZGFwdGVyQ250ID0gMDsKKworLyogU3RhcnR1cCB2YWx1ZXMsIHRvIGJlIG92ZXJyaWRlbiBvbiB0aGUgY29tbWFuZGxpbmUgKi8KK3N0YXRpYyBpbnQgdG1zY3NpbVtdID0gey0yLCAtMiwgLTIsIC0yLCAtMiwgLTJ9OworCittb2R1bGVfcGFyYW1fYXJyYXkodG1zY3NpbSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModG1zY3NpbSwgIkhvc3QgU0NTSSBJRCwgU3BlZWQgKDA9MTBNSHopLCBEZXZpY2UgRmxhZ3MsIEFkYXB0ZXIgRmxhZ3MsIE1heCBUYWdzIChsb2cyKHRhZ3MpLTEpLCBEZWxheVJlc2V0IChzKSIpOworTU9EVUxFX0FVVEhPUigiQy5MLiBIdWFuZyAvIEt1cnQgR2FybG9mZiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTQ1NJIGhvc3QgYWRhcHRlciBkcml2ZXIgZm9yIFRla3JhbSBEQzM5MCBhbmQgb3RoZXIgQU1ENTNDOTc0QSBiYXNlZCBQQ0kgU0NTSSBhZGFwdGVycyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInNkLHNyLHNnLHN0Iik7CisKK3N0YXRpYyB2b2lkICpkYzM5MF9waGFzZTBbXT17CisgICAgICAgZGMzOTBfRGF0YU91dF8wLAorICAgICAgIGRjMzkwX0RhdGFJbl8wLAorICAgICAgIGRjMzkwX0NvbW1hbmRfMCwKKyAgICAgICBkYzM5MF9TdGF0dXNfMCwKKyAgICAgICBkYzM5MF9Ob3BfMCwKKyAgICAgICBkYzM5MF9Ob3BfMCwKKyAgICAgICBkYzM5MF9Nc2dPdXRfMCwKKyAgICAgICBkYzM5MF9Nc2dJbl8wLAorICAgICAgIGRjMzkwX05vcF8xCisgICAgICAgfTsKKworc3RhdGljIHZvaWQgKmRjMzkwX3BoYXNlMVtdPXsKKyAgICAgICBkYzM5MF9EYXRhT3V0UGhhc2UsCisgICAgICAgZGMzOTBfRGF0YUluUGhhc2UsCisgICAgICAgZGMzOTBfQ29tbWFuZFBoYXNlLAorICAgICAgIGRjMzkwX1N0YXR1c1BoYXNlLAorICAgICAgIGRjMzkwX05vcF8wLAorICAgICAgIGRjMzkwX05vcF8wLAorICAgICAgIGRjMzkwX01zZ091dFBoYXNlLAorICAgICAgIGRjMzkwX01zZ0luUGhhc2UsCisgICAgICAgZGMzOTBfTm9wXzEKKyAgICAgICB9OworCisjaWZkZWYgREMzOTBfREVCVUcxCitzdGF0aWMgY2hhciogZGMzOTBfcDBfc3RyW10gPSB7CisgICAgICAgImRjMzkwX0RhdGFPdXRfMCIsCisgICAgICAgImRjMzkwX0RhdGFJbl8wIiwKKyAgICAgICAiZGMzOTBfQ29tbWFuZF8wIiwKKyAgICAgICAiZGMzOTBfU3RhdHVzXzAiLAorICAgICAgICJkYzM5MF9Ob3BfMCIsCisgICAgICAgImRjMzkwX05vcF8wIiwKKyAgICAgICAiZGMzOTBfTXNnT3V0XzAiLAorICAgICAgICJkYzM5MF9Nc2dJbl8wIiwKKyAgICAgICAiZGMzOTBfTm9wXzEiCisgICAgICAgfTsKKyAgICAgCitzdGF0aWMgY2hhciogZGMzOTBfcDFfc3RyW10gPSB7CisgICAgICAgImRjMzkwX0RhdGFPdXRQaGFzZSIsCisgICAgICAgImRjMzkwX0RhdGFJblBoYXNlIiwKKyAgICAgICAiZGMzOTBfQ29tbWFuZFBoYXNlIiwKKyAgICAgICAiZGMzOTBfU3RhdHVzUGhhc2UiLAorICAgICAgICJkYzM5MF9Ob3BfMCIsCisgICAgICAgImRjMzkwX05vcF8wIiwKKyAgICAgICAiZGMzOTBfTXNnT3V0UGhhc2UiLAorICAgICAgICJkYzM5MF9Nc2dJblBoYXNlIiwKKyAgICAgICAiZGMzOTBfTm9wXzEiCisgICAgICAgfTsKKyNlbmRpZiAgIAorCitzdGF0aWMgdTggIGRjMzkwX2VlcHJvbUJ1ZltNQVhfQURBUFRFUl9OVU1dW0VFX0xFTl07CitzdGF0aWMgdTggIGRjMzkwX2Nsb2NrX3BlcmlvZDFbXSA9IHs0LCA1LCA2LCA3LCA4LCAxMCwgMTMsIDIwfTsKK3N0YXRpYyB1OCAgZGMzOTBfY2xvY2tfc3BlZWRbXSA9IHsxMDAsODAsNjcsNTcsNTAsIDQwLCAzMSwgMjB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9ucyBmb3IgdGhlIG1hbmFnZW1lbnQgb2YgdGhlIGludGVybmFsIHN0cnVjdHVyZXMgCisgKiAoRENCcywgU1JCcywgUXVldWVpbmcpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IGRjMzkwX2RjYiBfX2lubGluZV9fICpkYzM5MF9maW5kRENCICggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgdTggaWQsIHU4IGx1bikKK3sKKyAgIHN0cnVjdCBkYzM5MF9kY2IqIHBEQ0IgPSBwQUNCLT5wTGlua0RDQjsgaWYgKCFwRENCKSByZXR1cm4gTlVMTDsKKyAgIHdoaWxlIChwRENCLT5UYXJnZXRJRCAhPSBpZCB8fCBwRENCLT5UYXJnZXRMVU4gIT0gbHVuKQorICAgICB7CisJcERDQiA9IHBEQ0ItPnBOZXh0RENCOworCWlmIChwRENCID09IHBBQ0ItPnBMaW5rRENCKQorCSAgICAgcmV0dXJuIE5VTEw7CisgICAgIH0KKyAgIERDQkRFQlVHMSggcHJpbnRrIChLRVJOX0RFQlVHICJEQ0IgJXAgKCUwMngsJTAyeCkgZm91bmQuXG4iLAlcCisJCSAgICAgIHBEQ0IsIHBEQ0ItPlRhcmdldElELCBwRENCLT5UYXJnZXRMVU4pKTsKKyAgIHJldHVybiBwRENCOworfQorCisvKiBJbnNlcnQgU1JCIG9pbiB0b3Agb2YgZnJlZSBsaXN0ICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGRjMzkwX0ZyZWVfaW5zZXJ0IChzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCKQoreworICAgIERFQlVHMChwcmludGsgKCJEQzM5MDogRnJlZSBTUkIgJXBcbiIsIHBTUkIpKTsKKyAgICBwU1JCLT5wTmV4dFNSQiA9IHBBQ0ItPnBGcmVlU1JCOworICAgIHBBQ0ItPnBGcmVlU1JCID0gcFNSQjsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBkYzM5MF9Hb2luZ19hcHBlbmQgKHN0cnVjdCBkYzM5MF9kY2IqIHBEQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIpCit7CisgICAgcERDQi0+R29pbmdTUkJDbnQrKzsKKyAgICBERUJVRzAocHJpbnRrKCJEQzM5MDogQXBwZW5kIFNSQiAlcCB0byBHb2luZ1xuIiwgcFNSQikpOworICAgIC8qIEFwcGVuZCB0byB0aGUgbGlzdCBvZiBHb2luZyBjb21tYW5kcyAqLworICAgIGlmKCBwRENCLT5wR29pbmdTUkIgKQorCXBEQ0ItPnBHb2luZ0xhc3QtPnBOZXh0U1JCID0gcFNSQjsKKyAgICBlbHNlCisJcERDQi0+cEdvaW5nU1JCID0gcFNSQjsKKworICAgIHBEQ0ItPnBHb2luZ0xhc3QgPSBwU1JCOworICAgIC8qIE5vIG5leHQgb25lIGluIHNlbnQgbGlzdCAqLworICAgIHBTUkItPnBOZXh0U1JCID0gTlVMTDsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBkYzM5MF9Hb2luZ19yZW1vdmUgKHN0cnVjdCBkYzM5MF9kY2IqIHBEQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIpCit7CisJREVCVUcwKHByaW50aygiREMzOTA6IFJlbW92ZSBTUkIgJXAgZnJvbSBHb2luZ1xuIiwgcFNSQikpOworICAgaWYgKHBTUkIgPT0gcERDQi0+cEdvaW5nU1JCKQorCXBEQ0ItPnBHb2luZ1NSQiA9IHBTUkItPnBOZXh0U1JCOworICAgZWxzZQorICAgICB7CisJc3RydWN0IGRjMzkwX3NyYiogcHNyYiA9IHBEQ0ItPnBHb2luZ1NSQjsKKwl3aGlsZSAocHNyYiAmJiBwc3JiLT5wTmV4dFNSQiAhPSBwU1JCKQorCSAgcHNyYiA9IHBzcmItPnBOZXh0U1JCOworCWlmICghcHNyYikgCisJICB7IHByaW50ayAoS0VSTl9FUlIgIkRDMzkwOiBSZW1vdmUgbm9uLWV4LiBTUkIgJXAgZnJvbSBHb2luZyFcbiIsIHBTUkIpOyByZXR1cm47IH0KKwlwc3JiLT5wTmV4dFNSQiA9IHBTUkItPnBOZXh0U1JCOworCWlmIChwU1JCID09IHBEQ0ItPnBHb2luZ0xhc3QpCisJICBwRENCLT5wR29pbmdMYXN0ID0gcHNyYjsKKyAgICAgfQorICAgcERDQi0+R29pbmdTUkJDbnQtLTsKK30KKworc3RhdGljIHN0cnVjdCBzY2F0dGVybGlzdCogZGMzOTBfc2dfYnVpbGRfc2luZ2xlKHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJbWVtc2V0KHNnLCAwLCBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSk7CisJc2ctPnBhZ2UJPSB2aXJ0X3RvX3BhZ2UoYWRkcik7CisJc2ctPmxlbmd0aAk9IGxlbmd0aDsKKwlzZy0+b2Zmc2V0CT0gKHVuc2lnbmVkIGxvbmcpYWRkciAmIH5QQUdFX01BU0s7CisJcmV0dXJuIHNnOworfQorCisvKiBDcmVhdGUgcGNpIG1hcHBpbmcgKi8KK3N0YXRpYyBpbnQgZGMzOTBfcGNpX21hcCAoc3RydWN0IGRjMzkwX3NyYiogcFNSQikKK3sKKwlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCBzY3NpX2NtbmQgKnBjbWQgPSBwU1JCLT5wY21kOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcFNSQi0+cFNSQkRDQi0+cERDQkFDQi0+cGRldjsKKwlkYzM5MF9jbWRfc2NwX3QqIGNtZHAgPSAoKGRjMzkwX2NtZF9zY3BfdCopKCZwY21kLT5TQ3ApKTsKKworCS8qIE1hcCBzZW5zZSBidWZmZXIgKi8KKwlpZiAocFNSQi0+U1JCRmxhZyAmIEFVVE9fUkVRU0VOU0UpIHsKKwkJcFNSQi0+cFNlZ21lbnRMaXN0CT0gZGMzOTBfc2dfYnVpbGRfc2luZ2xlKCZwU1JCLT5TZWdtZW50eCwgcGNtZC0+c2Vuc2VfYnVmZmVyLCBzaXplb2YocGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisJCXBTUkItPlNHY291bnQJCT0gcGNpX21hcF9zZyhwZGV2LCBwU1JCLT5wU2VnbWVudExpc3QsIDEsCisJCQkJCQkgICAgIERNQV9GUk9NX0RFVklDRSk7CisJCWNtZHAtPnNhdmVkX2RtYV9oYW5kbGUJPSBzZ19kbWFfYWRkcmVzcyhwU1JCLT5wU2VnbWVudExpc3QpOworCisJCS8qIFRPRE86IGVycm9yIGhhbmRsaW5nICovCisJCWlmIChwU1JCLT5TR2NvdW50ICE9IDEpCisJCQllcnJvciA9IDE7CisJCURFQlVHMShwcmludGsoIiVzKCk6IE1hcHBlZCBzZW5zZSBidWZmZXIgJXAgYXQgJXhcbiIsIF9fRlVOQ1RJT05fXywgcGNtZC0+c2Vuc2VfYnVmZmVyLCBjbWRwLT5zYXZlZF9kbWFfaGFuZGxlKSk7CisJLyogTWFwIFNHIGxpc3QgKi8KKwl9IGVsc2UgaWYgKHBjbWQtPnVzZV9zZykgeworCQlwU1JCLT5wU2VnbWVudExpc3QJPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIHBjbWQtPnJlcXVlc3RfYnVmZmVyOworCQlwU1JCLT5TR2NvdW50CQk9IHBjaV9tYXBfc2cocGRldiwgcFNSQi0+cFNlZ21lbnRMaXN0LCBwY21kLT51c2Vfc2csCisJCQkJCQkgICAgIHBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJLyogVE9ETzogZXJyb3IgaGFuZGxpbmcgKi8KKwkJaWYgKCFwU1JCLT5TR2NvdW50KQorCQkJZXJyb3IgPSAxOworCQlERUJVRzEocHJpbnRrKCIlcygpOiBNYXBwZWQgU0cgJXAgd2l0aCAlZCAoJWQpIGVsZW1lbnRzXG4iLFwKKwkJCSAgICAgIF9fRlVOQ1RJT05fXywgcGNtZC0+cmVxdWVzdF9idWZmZXIsIHBTUkItPlNHY291bnQsIHBjbWQtPnVzZV9zZykpOworCS8qIE1hcCBzaW5nbGUgc2VnbWVudCAqLworCX0gZWxzZSBpZiAocGNtZC0+cmVxdWVzdF9idWZmZXIgJiYgcGNtZC0+cmVxdWVzdF9idWZmbGVuKSB7CisJCXBTUkItPnBTZWdtZW50TGlzdAk9IGRjMzkwX3NnX2J1aWxkX3NpbmdsZSgmcFNSQi0+U2VnbWVudHgsIHBjbWQtPnJlcXVlc3RfYnVmZmVyLCBwY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCQlwU1JCLT5TR2NvdW50CQk9IHBjaV9tYXBfc2cocGRldiwgcFNSQi0+cFNlZ21lbnRMaXN0LCAxLAorCQkJCQkJICAgICBwY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCWNtZHAtPnNhdmVkX2RtYV9oYW5kbGUJPSBzZ19kbWFfYWRkcmVzcyhwU1JCLT5wU2VnbWVudExpc3QpOworCisJCS8qIFRPRE86IGVycm9yIGhhbmRsaW5nICovCisJCWlmIChwU1JCLT5TR2NvdW50ICE9IDEpCisJCQllcnJvciA9IDE7CisJCURFQlVHMShwcmludGsoIiVzKCk6IE1hcHBlZCByZXF1ZXN0IGJ1ZmZlciAlcCBhdCAleFxuIiwgX19GVU5DVElPTl9fLCBwY21kLT5yZXF1ZXN0X2J1ZmZlciwgY21kcC0+c2F2ZWRfZG1hX2hhbmRsZSkpOworCS8qIE5vIG1hcHBpbmcgIT8gKi8JCisgICAgCX0gZWxzZQorCQlwU1JCLT5TR2NvdW50ID0gMDsKKworCXJldHVybiBlcnJvcjsKK30KKworLyogUmVtb3ZlIHBjaSBtYXBwaW5nICovCitzdGF0aWMgdm9pZCBkYzM5MF9wY2lfdW5tYXAgKHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIpCit7CisJc3RydWN0IHNjc2lfY21uZCAqcGNtZCA9IHBTUkItPnBjbWQ7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwU1JCLT5wU1JCRENCLT5wRENCQUNCLT5wZGV2OworCURFQlVHMShkYzM5MF9jbWRfc2NwX3QqIGNtZHAgPSAoKGRjMzkwX2NtZF9zY3BfdCopKCZwY21kLT5TQ3ApKSk7CisKKwlpZiAocFNSQi0+U1JCRmxhZykgeworCQlwY2lfdW5tYXBfc2cocGRldiwgJnBTUkItPlNlZ21lbnR4LCAxLCBETUFfRlJPTV9ERVZJQ0UpOworCQlERUJVRzEocHJpbnRrKCIlcygpOiBVbm1hcHBlZCBzZW5zZSBidWZmZXIgYXQgJXhcbiIsIF9fRlVOQ1RJT05fXywgY21kcC0+c2F2ZWRfZG1hX2hhbmRsZSkpOworCX0gZWxzZSBpZiAocGNtZC0+dXNlX3NnKSB7CisJCXBjaV91bm1hcF9zZyhwZGV2LCBwY21kLT5yZXF1ZXN0X2J1ZmZlciwgcGNtZC0+dXNlX3NnLCBwY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCURFQlVHMShwcmludGsoIiVzKCk6IFVubWFwcGVkIFNHIGF0ICVwIHdpdGggJWQgZWxlbWVudHNcbiIsIF9fRlVOQ1RJT05fXywgcGNtZC0+cmVxdWVzdF9idWZmZXIsIHBjbWQtPnVzZV9zZykpOworCX0gZWxzZSBpZiAocGNtZC0+cmVxdWVzdF9idWZmZXIgJiYgcGNtZC0+cmVxdWVzdF9idWZmbGVuKSB7CisJCXBjaV91bm1hcF9zZyhwZGV2LCAmcFNSQi0+U2VnbWVudHgsIDEsIHBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJREVCVUcxKHByaW50aygiJXMoKTogVW5tYXBwZWQgcmVxdWVzdCBidWZmZXIgYXQgJXhcbiIsIF9fRlVOQ1RJT05fXywgY21kcC0+c2F2ZWRfZG1hX2hhbmRsZSkpOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbmxpbmVfXworZGMzOTBfZnJlZXRhZyAoc3RydWN0IGRjMzkwX2RjYiogcERDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQikKK3sKKwlpZiAocFNSQi0+VGFnTnVtYmVyICE9IFNDU0lfTk9fVEFHKSB7CisJCXBEQ0ItPlRhZ01hc2sgJj0gfigxIDw8IHBTUkItPlRhZ051bWJlcik7ICAgLyogZnJlZSB0YWcgbWFzayAqLworCQlwU1JCLT5UYWdOdW1iZXIgPSBTQ1NJX05PX1RBRzsKKwl9Cit9CisKKworc3RhdGljIGludAorZGMzOTBfU3RhcnRTQ1NJKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfZGNiKiBwRENCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCICkKK3sKKyAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kID0gcFNSQi0+cGNtZDsKKyAgICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBzY21kLT5kZXZpY2U7CisgICAgdTggY21kLCBkaXNjX2FsbG93ZWQsIHRyeV9zeW5jX25lZ287CisgICAgY2hhciB0YWdbMl07CisKKyAgICBwU1JCLT5TY3NpUGhhc2UgPSBTQ1NJX05PUDA7CisKKyAgICBpZiAocEFDQi0+Q29ubmVjdGVkKQorICAgIHsKKwkvLyBTaG91bGQgbm90IGhhcHBlbiBub3JtYWxseQorCXByaW50ayAoS0VSTl9XQVJOSU5HICJEQzM5MDogQ2FuJ3Qgc2VsZWN0IHdoZW4gY29ubmVjdGVkISAoJTA4eCwlMDJ4KVxuIiwKKwkJcFNSQi0+U1JCU3RhdGUsIHBTUkItPlNSQkZsYWcpOworCXBTUkItPlNSQlN0YXRlID0gU1JCX1JFQURZOworCXBBQ0ItPlNlbENvbm4rKzsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKHRpbWVfYmVmb3JlIChqaWZmaWVzLCBwQUNCLT5wU2NzaUhvc3QtPmxhc3RfcmVzZXQpKQorICAgIHsKKwlERUJVRzAocHJpbnRrICgiREMzOTA6IFdlIHdlcmUganVzdCByZXNldCBhbmQgZG9uJ3QgYWNjZXB0IGNvbW1hbmRzIHlldCFcbiIpKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgLyogS0c6IE1vdmVkIHBjaSBtYXBwaW5nIGhlcmUgKi8KKyAgICBkYzM5MF9wY2lfbWFwKHBTUkIpOworICAgIC8qIFRPRE86IGVycm9yIGhhbmRsaW5nICovCisgICAgREMzOTBfd3JpdGU4IChTY3NpX0Rlc3RfSUQsIHBEQ0ItPlRhcmdldElEKTsKKyAgICBEQzM5MF93cml0ZTggKFN5bmNfUGVyaW9kLCBwRENCLT5TeW5jUGVyaW9kKTsKKyAgICBEQzM5MF93cml0ZTggKFN5bmNfT2Zmc2V0LCBwRENCLT5TeW5jT2Zmc2V0KTsKKyAgICBEQzM5MF93cml0ZTggKEN0cmxSZWcxLCBwRENCLT5DdHJsUjEpOworICAgIERDMzkwX3dyaXRlOCAoQ3RybFJlZzMsIHBEQ0ItPkN0cmxSMyk7CisgICAgREMzOTBfd3JpdGU4IChDdHJsUmVnNCwgcERDQi0+Q3RybFI0KTsKKyAgICBEQzM5MF93cml0ZTggKFNjc2lDbWQsIENMRUFSX0ZJRk9fQ01EKTsJCS8qIEZsdXNoIEZJRk8gKi8KKyAgICBERUJVRzEocHJpbnRrIChLRVJOX0lORk8gIkRDMzkwOiBTdGFydCBTQ1NJIGNvbW1hbmQ6ICUwMnggKFN5bmM6JTAyeClcbiIsXAorICAgICAgICAgICAgc2NtZC0+Y21uZFswXSwgcERDQi0+U3luY01vZGUpKTsKKworICAgIC8qIERvbid0IGRpc2Nvbm5lY3Qgb24gQVVUT19SRVFTRU5TRSwgY2F1c2UgaXQgbWlnaHQgYmUgYW4KKyAgICAgKiBDb250aW5nZW50IEFsbGVnaWFuY2UgQ29uZGl0aW9uICg2LjYpLCB3aGVyZSBubyB0YWdzIHNob3VsZCBiZSB1c2VkLgorICAgICAqIEFsbCBvdGhlciBoYXZlIHRvIGJlIGFsbG93ZWQgdG8gZGlzY29ubmVjdCB0byBwcmV2ZW50IEluY29ycmVjdCAKKyAgICAgKiBJbml0aWF0b3IgQ29ubmVjdGlvbiAoNi44LjIvNi41LjIpICovCisgICAgLyogQ2hhbmdlZCBLRywgOTkvMDYvMDYgKi8KKyAgICBpZiAoISAocFNSQi0+U1JCRmxhZyAmIEFVVE9fUkVRU0VOU0UpKQorCWRpc2NfYWxsb3dlZCA9IHBEQ0ItPkRldk1vZGUgJiBFTl9ESVNDT05ORUNUXzsKKyAgICBlbHNlCisJZGlzY19hbGxvd2VkID0gMDsKKworICAgIGlmICgocERDQi0+U3luY01vZGUgJiBTWU5DX0VOQUJMRSkgJiYgcERDQi0+VGFyZ2V0TFVOID09IDAgJiYgc2Rldi0+c2R0ciAmJgorCSgoKHNjbWQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSB8fCAocFNSQi0+U1JCRmxhZyAmIEFVVE9fUkVRU0VOU0UpKSAmJgorCSAgIShwRENCLT5TeW5jTW9kZSAmIFNZTkNfTkVHT19ET05FKSkgfHwgc2NtZC0+Y21uZFswXSA9PSBJTlFVSVJZKSkKKyAgICAgIHRyeV9zeW5jX25lZ28gPSAxOworICAgIGVsc2UKKyAgICAgIHRyeV9zeW5jX25lZ28gPSAwOworCisgICAgcFNSQi0+TXNnQ250ID0gMDsKKyAgICBjbWQgPSBTRUxfV19BVE47CisgICAgREMzOTBfd3JpdGU4IChTY3NpRmlmbywgSURFTlRJRlkoZGlzY19hbGxvd2VkLCBwRENCLT5UYXJnZXRMVU4pKTsKKyAgICAvKiBDaGFuZ2UgOTkvMDUvMzE6IERvbid0IHVzZSB0YWdzIHdoZW4gbm90IGRpc2Nvbm5lY3RpbmcgKEJVU1kpICovCisgICAgaWYgKChwRENCLT5TeW5jTW9kZSAmIEVOX1RBR19RVUVVRUlORykgJiYgZGlzY19hbGxvd2VkICYmIHNjc2lfcG9wdWxhdGVfdGFnX21zZyhzY21kLCB0YWcpKSB7CisJREMzOTBfd3JpdGU4KFNjc2lGaWZvLCB0YWdbMF0pOworCXBEQ0ItPlRhZ01hc2sgfD0gMSA8PCB0YWdbMV07CisJcFNSQi0+VGFnTnVtYmVyID0gdGFnWzFdOworCURDMzkwX3dyaXRlOChTY3NpRmlmbywgdGFnWzFdKTsKKwlERUJVRzEocHJpbnRrKEtFUk5fSU5GTyAiREMzOTA6IFNlbGVjdCB3L0Rpc0NuIGZvciBDbWQgJWxpIChTUkIgJXApLCBibG9jayB0YWcgJTAyeFxuIiwgc2NtZC0+cGlkLCBwU1JCLCB0YWdbMV0pKTsKKwljbWQgPSBTRUxfV19BVE4zOworICAgIH0gZWxzZSB7CisJLyogTm8gVGFnUSAqLworLy9ub190YWc6CisJREVCVUcxKHByaW50ayhLRVJOX0lORk8gIkRDMzkwOiBTZWxlY3QgdyVzL0Rpc0NuIGZvciBDbWQgJWxpIChTUkIgJXApLCBObyBUYWdRXG4iLCBkaXNjX2FsbG93ZWQgPyAiIiA6ICJvIiwgc2NtZC0+cGlkLCBwU1JCKSk7CisgICAgfQorCisgICAgcFNSQi0+U1JCU3RhdGUgPSBTUkJfU1RBUlRfOworCisgICAgaWYgKHRyeV9zeW5jX25lZ28pCisgICAgICB7IAorCXU4IFN5bmNfT2ZmID0gcERDQi0+U3luY09mZnNldDsKKyAgICAgICAgREVCVUcwKHByaW50ayAoS0VSTl9JTkZPICJEQzM5MDogTkVXIFN5bmMgTmVnbyBjb2RlIHRyaWdnZXJlZCAoJWkgJWkpXG4iLCBwRENCLT5UYXJnZXRJRCwgcERDQi0+VGFyZ2V0TFVOKSk7CisJcFNSQi0+TXNnT3V0QnVmWzBdID0gRVhURU5ERURfTUVTU0FHRTsKKwlwU1JCLT5Nc2dPdXRCdWZbMV0gPSAzOworCXBTUkItPk1zZ091dEJ1ZlsyXSA9IEVYVEVOREVEX1NEVFI7CisJcFNSQi0+TXNnT3V0QnVmWzNdID0gcERDQi0+TmVnb1BlcmlvZDsKKwlpZiAoIShTeW5jX09mZiAmIDB4MGYpKSBTeW5jX09mZiA9IFNZTkNfTkVHT19PRkZTRVQ7CisJcFNSQi0+TXNnT3V0QnVmWzRdID0gU3luY19PZmY7CisJcFNSQi0+TXNnQ250ID0gNTsKKwkvL3BTUkItPlNSQlN0YXRlID0gU1JCX01TR09VVF87CisJcFNSQi0+U1JCU3RhdGUgfD0gRE9fU1lOQ19ORUdPOworCWNtZCA9IFNFTF9XX0FUTl9TVE9QOworICAgICAgfQorCisgICAgLyogQ29tbWFuZCBpcyB3cml0dGVuIGluIENvbW1hbmRQaGFzZSwgaWYgU0VMX1dfQVROX1NUT1AgLi4uICovCisgICAgaWYgKGNtZCAhPSBTRUxfV19BVE5fU1RPUCkKKyAgICAgIHsKKwlpZiggcFNSQi0+U1JCRmxhZyAmIEFVVE9fUkVRU0VOU0UgKQorCSAgeworCSAgICBEQzM5MF93cml0ZTggKFNjc2lGaWZvLCBSRVFVRVNUX1NFTlNFKTsKKwkgICAgREMzOTBfd3JpdGU4IChTY3NpRmlmbywgcERDQi0+VGFyZ2V0TFVOIDw8IDUpOworCSAgICBEQzM5MF93cml0ZTggKFNjc2lGaWZvLCAwKTsKKwkgICAgREMzOTBfd3JpdGU4IChTY3NpRmlmbywgMCk7CisJICAgIERDMzkwX3dyaXRlOCAoU2NzaUZpZm8sIHNpemVvZihzY21kLT5zZW5zZV9idWZmZXIpKTsKKwkgICAgREMzOTBfd3JpdGU4IChTY3NpRmlmbywgMCk7CisJICAgIERFQlVHMShwcmludGsgKEtFUk5fREVCVUcgIkRDMzkwOiBBdXRvUmVxU2Vuc2UgIVxuIikpOworCSAgfQorCWVsc2UJLyogd3JpdGUgY21uZCB0byBidXMgKi8gCisJICB7CisJICAgIHU4ICpwdHI7IHU4IGk7CisJICAgIHB0ciA9ICh1OCAqKXNjbWQtPmNtbmQ7CisJICAgIGZvciAoaSA9IDA7IGkgPCBzY21kLT5jbWRfbGVuOyBpKyspCisJICAgICAgREMzOTBfd3JpdGU4IChTY3NpRmlmbywgKihwdHIrKykpOworCSAgfQorICAgICAgfQorICAgIERFQlVHMChpZiAocEFDQi0+cEFjdGl2ZURDQikJXAorCSAgIHByaW50ayAoS0VSTl9XQVJOSU5HICJEQzM5MDogQWN0aXZlRENCICE9IDBcbiIpKTsKKyAgICBERUJVRzAoaWYgKHBEQ0ItPnBBY3RpdmVTUkIpCVwKKwkgICBwcmludGsgKEtFUk5fV0FSTklORyAiREMzOTA6IEFjdGl2ZVNSQiAhPSAwXG4iKSk7CisgICAgLy9EQzM5MF93cml0ZTggKERNQV9DbWQsIERNQV9JRExFX0NNRCk7CisgICAgaWYgKERDMzkwX3JlYWQ4IChTY3NpX1N0YXR1cykgJiBJTlRFUlJVUFQpCisgICAgeworCWRjMzkwX2ZyZWV0YWcgKHBEQ0IsIHBTUkIpOworCURFQlVHMChwcmludGsgKCJEQzM5MDogSW50ZXJydXB0IGR1cmluZyBTdGFydCBTQ1NJIChwaWQgJWxpLCB0YXJnZXQgJTAyaS0lMDJpKVxuIiwKKwkJc2NtZC0+cGlkLCBzY21kLT5kZXZpY2UtPmlkLCBzY21kLT5kZXZpY2UtPmx1bikpOworCXBTUkItPlNSQlN0YXRlID0gU1JCX1JFQURZOworCS8vREMzOTBfd3JpdGU4IChTY3NpQ21kLCBDTEVBUl9GSUZPX0NNRCk7CisJcEFDQi0+U2VsTG9zdCsrOworCXJldHVybiAxOworICAgIH0KKyAgICBEQzM5MF93cml0ZTggKFNjc2lDbWQsIGNtZCk7CisgICAgcEFDQi0+cEFjdGl2ZURDQiA9IHBEQ0I7CisgICAgcERDQi0+cEFjdGl2ZVNSQiA9IHBTUkI7CisgICAgcEFDQi0+Q29ubmVjdGVkID0gMTsKKyAgICBwU1JCLT5TY3NpUGhhc2UgPSBTQ1NJX05PUDE7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vI2RlZmluZSBETUFfSU5UIEVOX0RNQV9JTlQgLyp8IEVOX1BBR0VfSU5UKi8KKyNkZWZpbmUgRE1BX0lOVCAwCisKKyNpZiBETUFfSU5UCisvKiBUaGlzIGlzIHNpbWlsYXIgdG8gQU01M0M5NzQuYyAuLi4gKi8KK3N0YXRpYyB1OCAKK2RjMzkwX2RtYV9pbnRyIChzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCKQoreworICBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCOworICB1OCBkc3RhdGU7CisgIERFQlVHMCh1MTYgcHN0YXRlOyBzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHBBQ0ItPnBkZXYpOworICAKKyAgREVCVUcwKHBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVEFUVVMsICZwc3RhdGUpKTsKKyAgREVCVUcwKGlmIChwc3RhdGUgJiAoUENJX1NUQVRVU19TSUdfU1lTVEVNX0VSUk9SIHwgUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFkpKVwKKwl7IHByaW50ayhLRVJOX1dBUk5JTkcgIkRDMzkwOiBQQ0kgc3RhdGUgPSAlMDR4IVxuIiwgcHN0YXRlKTsgXAorCSAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVEFUVVMsIChQQ0lfU1RBVFVTX1NJR19TWVNURU1fRVJST1IgfCBQQ0lfU1RBVFVTX0RFVEVDVEVEX1BBUklUWSkpO30pOworCisgIGRzdGF0ZSA9IERDMzkwX3JlYWQ4IChETUFfU3RhdHVzKTsgCisKKyAgaWYgKCEgcEFDQi0+cEFjdGl2ZURDQiB8fCAhIHBBQ0ItPnBBY3RpdmVEQ0ItPnBBY3RpdmVTUkIpIHJldHVybiBkc3RhdGU7CisgIGVsc2UgcFNSQiAgPSBwQUNCLT5wQWN0aXZlRENCLT5wQWN0aXZlU1JCOworICAKKyAgaWYgKGRzdGF0ZSAmIChETUFfWEZFUl9BQk9SVCB8IERNQV9YRkVSX0VSUk9SIHwgUE9XRVJfRE9XTiB8IFBDSV9NU19BQk9SVCkpCisgICAgeworCXByaW50ayAoS0VSTl9FUlIgIkRDMzkwOiBETUEgZXJyb3IgKCUwMngpIVxuIiwgZHN0YXRlKTsKKwlyZXR1cm4gZHN0YXRlOworICAgIH0KKyAgaWYgKGRzdGF0ZSAmIERNQV9YRkVSX0RPTkUpCisgICAgeworCXUzMiByZXNpZHVhbCwgeGZlckNudDsgaW50IGN0ciA9IDYwMDAwMDA7CisJaWYgKCEgKERDMzkwX3JlYWQ4IChETUFfQ21kKSAmIFJFQURfRElSRUNUSU9OKSkKKwkgIHsKKwkgICAgZG8KKwkgICAgICB7CisJCURFQlVHMShwcmludGsgKEtFUk5fREVCVUcgIkRDMzkwOiByZWFkIHJlc2lkdWFsIGJ5dGVzIC4uLiBcbiIpKTsKKwkJZHN0YXRlID0gREMzOTBfcmVhZDggKERNQV9TdGF0dXMpOworCQlyZXNpZHVhbCA9IERDMzkwX3JlYWQ4IChDdGNSZWdfTG93KSB8IERDMzkwX3JlYWQ4IChDdGNSZWdfTWlkKSA8PCA4IHwKKwkJICBEQzM5MF9yZWFkOCAoQ3RjUmVnX0hpZ2gpIDw8IDE2OworCQlyZXNpZHVhbCArPSBEQzM5MF9yZWFkOCAoQ3VycmVudF9GaWZvKSAmIDB4MWY7CisJICAgICAgfSB3aGlsZSAocmVzaWR1YWwgJiYgISAoZHN0YXRlICYgU0NTSV9JTlRFUlJVUFQpICYmIC0tY3RyKTsKKwkgICAgaWYgKCFjdHIpIHByaW50ayAoS0VSTl9DUklUICJEQzM5MDogZG1hX2ludHI6IERNQSBhYm9ydGVkIHVuZmluaXNoZWQ6ICUwNnggYnl0ZXMgcmVtYWluISFcbiIsIERDMzkwX3JlYWQzMiAoRE1BX1drX0J5dGVDbnRyKSk7CisJICAgIC8qIHJlc2lkdWFsID0gIC4uLiAqLworCSAgfQorCWVsc2UKKwkgICAgcmVzaWR1YWwgPSAwOworCQorCS8qID8/PyAqLworCQorCXhmZXJDbnQgPSBwU1JCLT5TR1RvQmVYZmVyTGVuIC0gcmVzaWR1YWw7CisJcFNSQi0+U0dCdXNBZGRyICs9IHhmZXJDbnQ7CisJcFNSQi0+VG90YWxYZmVycmVkTGVuICs9IHhmZXJDbnQ7CisJcFNSQi0+U0dUb0JlWGZlckxlbiA9IHJlc2lkdWFsOworIyBpZmRlZiBEQzM5MF9ERUJVRzAKKwlwcmludGsgKEtFUk5fSU5GTyAiREMzOTA6IERNQTogcmVzaWR1YWwgPSAlaSwgeGZlciA9ICVpXG4iLCAKKwkJKHVuc2lnbmVkIGludClyZXNpZHVhbCwgKHVuc2lnbmVkIGludCl4ZmVyQ250KTsKKyMgZW5kaWYKKwkKKwlEQzM5MF93cml0ZTggKERNQV9DbWQsIERNQV9JRExFX0NNRCk7CisgICAgfQorICBkYzM5MF9sYXN0c3RhdHVzICY9IH4weGZmMDAwMDAwOyBkYzM5MF9sYXN0c3RhdHVzIHw9IGRzdGF0ZSA8PCAyNDsKKyAgcmV0dXJuIGRzdGF0ZTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18KK2RjMzkwX0ludmFsaWRDbWQoc3RydWN0IGRjMzkwX2FjYiogcEFDQikKK3sKKwlpZiAocEFDQi0+cEFjdGl2ZURDQi0+cEFjdGl2ZVNSQi0+U1JCU3RhdGUgJiAoU1JCX1NUQVJUXyB8IFNSQl9NU0dPVVQpKQorCQlEQzM5MF93cml0ZTgoU2NzaUNtZCwgQ0xFQVJfRklGT19DTUQpOworfQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBfX2lubGluZV9fCitEQzM5MF9JbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBzdHJ1Y3QgZGMzOTBfYWNiICpwQUNCID0gKHN0cnVjdCBkYzM5MF9hY2IqKWRldl9pZDsKKyAgICBzdHJ1Y3QgZGMzOTBfZGNiICpwRENCOworICAgIHN0cnVjdCBkYzM5MF9zcmIgKnBTUkI7CisgICAgdTggIHNzdGF0dXM9MDsKKyAgICB1OCAgcGhhc2U7CisgICAgdm9pZCAgICgqc3RhdGVWKSggc3RydWN0IGRjMzkwX2FjYiosIHN0cnVjdCBkYzM5MF9zcmIqLCB1OCAqKTsKKyAgICB1OCAgaXN0YXRlLCBpc3RhdHVzOworI2lmIERNQV9JTlQKKyAgICB1OCAgZHN0YXR1czsKKyNlbmRpZgorCisgICAgc3N0YXR1cyA9IERDMzkwX3JlYWQ4IChTY3NpX1N0YXR1cyk7CisgICAgaWYoICEoc3N0YXR1cyAmIElOVEVSUlVQVCkgKQorCXJldHVybiBJUlFfTk9ORTsKKworICAgIERFQlVHMShwcmludGsgKEtFUk5fREVCVUcgInNzdGF0dXM9JTAyeCwiLCBzc3RhdHVzKSk7CisKKyNpZiBETUFfSU5UCisgICAgc3Bpbl9sb2NrX2lycShwQUNCLT5wU2NzaUhvc3QtPmhvc3RfbG9jayk7CisgICAgZHN0YXR1cyA9IGRjMzkwX2RtYV9pbnRyIChwQUNCKTsKKyAgICBzcGluX3VubG9ja19pcnEocEFDQi0+cFNjc2lIb3N0LT5ob3N0X2xvY2spOworCisgICAgREVCVUcxKHByaW50ayAoS0VSTl9ERUJVRyAiZHN0YXR1cz0lMDJ4LCIsIGRzdGF0dXMpKTsKKyAgICBpZiAoISAoZHN0YXR1cyAmIFNDU0lfSU5URVJSVVBUKSkKKyAgICAgIHsKKwlERUJVRzAocHJpbnRrIChLRVJOX1dBUk5JTkcgIkRDMzkwIEludCB3L28gU0NTSSBhY3Rpb25zIChvbmx5IERNQT8pXG4iKSk7CisJcmV0dXJuIElSUV9OT05FOworICAgICAgfQorI2Vsc2UKKyAgICAvL0RDMzkwX3dyaXRlMzIgKERNQV9TY3NpQnVzQ3RybCwgV1JUX0VSQVNFX0RNQV9TVEFUIHwgRU5fSU5UX09OX1BDSV9BQk9SVCk7CisgICAgLy9kc3RhdHVzID0gREMzOTBfcmVhZDggKERNQV9TdGF0dXMpOworICAgIC8vREMzOTBfd3JpdGUzMiAoRE1BX1Njc2lCdXNDdHJsLCBFTl9JTlRfT05fUENJX0FCT1JUKTsKKyNlbmRpZgorCisgICAgc3Bpbl9sb2NrX2lycShwQUNCLT5wU2NzaUhvc3QtPmhvc3RfbG9jayk7CisKKyAgICBpc3RhdGUgPSBEQzM5MF9yZWFkOCAoSW50ZXJuX1N0YXRlKTsKKyAgICBpc3RhdHVzID0gREMzOTBfcmVhZDggKElOVF9TdGF0dXMpOyAvKiBUaGlzIGNsZWFycyBTY3NpX1N0YXR1cywgSW50ZXJuX1N0YXRlIGFuZCBJTlRfU3RhdHVzICEgKi8KKworICAgIERFQlVHMShwcmludGsgKEtFUk5fSU5GTyAiSXN0YXR1cyhSZXMsSW52LERpcyxTZXJ2LFN1Y2MsUmVTLFNlbEEsU2VsKT0lMDJ4LCIsaXN0YXR1cykpOworICAgIGRjMzkwX2xhc3RzdGF0dXMgJj0gfjB4MDBmZmZmZmY7CisgICAgZGMzOTBfbGFzdHN0YXR1cyB8PSAvKiBkc3RhdHVzPDwyNCB8ICovIHNzdGF0dXM8PDE2IHwgaXN0YXRlPDw4IHwgaXN0YXR1czsKKworICAgIGlmIChzc3RhdHVzICYgSUxMRUdBTF9PUF9FUlIpCisgICAgeworCXByaW50ayAoIkRDMzkwOiBJbGxlZ2FsIE9wZXJhdGlvbiBkZXRlY3RlZCAoJTA4eCkhXG4iLCBkYzM5MF9sYXN0c3RhdHVzKTsKKwlkYzM5MF9kdW1waW5mbyAocEFDQiwgcEFDQi0+cEFjdGl2ZURDQiwgcEFDQi0+cEFjdGl2ZURDQi0+cEFjdGl2ZVNSQik7CisgICAgfQorCQorICAgIGVsc2UgaWYgKGlzdGF0dXMgJiAgSU5WQUxJRF9DTUQpCisgICAgeworCXByaW50ayAoIkRDMzkwOiBJbnZhbGlkIENvbW1hbmQgZGV0ZWN0ZWQgKCUwOHgpIVxuIiwgZGMzOTBfbGFzdHN0YXR1cyk7CisJZGMzOTBfSW52YWxpZENtZCggcEFDQiApOworCWdvdG8gdW5sb2NrOworICAgIH0KKworICAgIGlmIChpc3RhdHVzICYgIFNDU0lfUkVTRVQpCisgICAgeworCWRjMzkwX1Njc2lSc3REZXRlY3QoIHBBQ0IgKTsKKwlnb3RvIHVubG9jazsKKyAgICB9CisKKyAgICBpZiAoaXN0YXR1cyAmICBESVNDT05ORUNURUQpCisgICAgeworCWRjMzkwX0Rpc2Nvbm5lY3QoIHBBQ0IgKTsKKwlnb3RvIHVubG9jazsKKyAgICB9CisKKyAgICBpZiAoaXN0YXR1cyAmICBSRVNFTEVDVEVEKQorICAgIHsKKwlkYzM5MF9SZXNlbGVjdCggcEFDQiApOworCWdvdG8gdW5sb2NrOworICAgIH0KKworICAgIGVsc2UgaWYgKGlzdGF0dXMgJiAoU0VMRUNURUQgfCBTRUxfQVRURU5USU9OKSkKKyAgICB7CisJcHJpbnRrIChLRVJOX0VSUiAiREMzOTA6IFRhcmdldCBtb2RlIG5vdCBzdXBwb3J0ZWQhXG4iKTsKKwlnb3RvIHVubG9jazsKKyAgICB9CisKKyAgICBpZiAoaXN0YXR1cyAmIChTVUNDRVNTRlVMX09QfFNFUlZJQ0VfUkVRVUVTVCkgKQorICAgIHsKKwlwRENCID0gcEFDQi0+cEFjdGl2ZURDQjsKKwlpZiAoIXBEQ0IpCisJeworCQlwcmludGsgKEtFUk5fRVJSICJEQzM5MDogU3VjLiBvcC8gU2Vydi4gcmVxOiBwQWN0aXZlRENCID0gMCFcbiIpOworCQlnb3RvIHVubG9jazsKKwl9CisJcFNSQiA9IHBEQ0ItPnBBY3RpdmVTUkI7CisJaWYoIHBEQ0ItPkRDQkZsYWcgJiBBQk9SVF9ERVZfICkKKwkgIGRjMzkwX0VuYWJsZU1zZ091dF9BYm9ydCAocEFDQiwgcFNSQik7CisKKwlwaGFzZSA9IHBTUkItPlNjc2lQaGFzZTsKKwlERUJVRzEocHJpbnRrIChLRVJOX0lORk8gIkRDMzkwOiBbJWldJXMoMCkgKCUwMngpXG4iLCBwaGFzZSwgZGMzOTBfcDBfc3RyW3BoYXNlXSwgc3N0YXR1cykpOworCXN0YXRlViA9ICh2b2lkICopIGRjMzkwX3BoYXNlMFtwaGFzZV07CisJKCAqc3RhdGVWICkoIHBBQ0IsIHBTUkIsICZzc3RhdHVzICk7CisKKwlwU1JCLT5TY3NpUGhhc2UgPSBzc3RhdHVzICYgNzsKKwlwaGFzZSA9ICh1OCkgc3N0YXR1cyAmIDc7CisJREVCVUcxKHByaW50ayAoS0VSTl9JTkZPICJEQzM5MDogWyVpXSVzKDEpICglMDJ4KVxuIiwgcGhhc2UsIGRjMzkwX3AxX3N0cltwaGFzZV0sIHNzdGF0dXMpKTsKKwlzdGF0ZVYgPSAodm9pZCAqKSBkYzM5MF9waGFzZTFbcGhhc2VdOworCSggKnN0YXRlViApKCBwQUNCLCBwU1JCLCAmc3N0YXR1cyApOworICAgIH0KKworIHVubG9jazoKKyAgICBzcGluX3VubG9ja19pcnEocEFDQi0+cFNjc2lIb3N0LT5ob3N0X2xvY2spOworICAgIHJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGRvX0RDMzkwX0ludGVycnVwdCggaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBpcnFyZXR1cm5fdCByZXQ7CisgICAgREVCVUcxKHByaW50ayAoS0VSTl9JTkZPICJEQzM5MDogSXJxICglaSkgY2F1Z2h0OiAiLCBpcnEpKTsKKyAgICAvKiBMb2NraW5nIGlzIGRvbmUgaW4gREMzOTBfSW50ZXJydXB0ICovCisgICAgcmV0ID0gREMzOTBfSW50ZXJydXB0KGlycSwgZGV2X2lkLCByZWdzKTsKKyAgICBERUJVRzEocHJpbnRrICgiLi4gSVJRIHJldHVybmVkXG4iKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2RjMzkwX0RhdGFPdXRfMCggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKQoreworICAgIHU4ICAgc3N0YXR1czsKKyAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnBzZ2w7CisgICAgdTMyICAgIFJlc2lkQ250LCB4ZmVyQ250OworICAgIHU4ICAgZHN0YXRlID0gMDsKKworICAgIHNzdGF0dXMgPSAqcHNzdGF0dXM7CisKKyAgICBpZiggIShwU1JCLT5TUkJTdGF0ZSAmIFNSQl9YRkVSUEFEKSApCisgICAgeworCWlmKCBzc3RhdHVzICYgKFBBUklUWV9FUlIgfCBJTExFR0FMX09QX0VSUikgKQorCSAgICBwU1JCLT5TUkJTdGF0dXMgfD0gUEFSSVRZX0VSUk9SOworCisJaWYoIHNzdGF0dXMgJiBDT1VOVF8yX1pFUk8gKQorCXsKKwkgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIEhaOworCisJICAgIC8qIEZ1bmN0aW9uIGNhbGxlZCBmcm9tIHRoZSBJU1Igd2l0aCB0aGUgaG9zdF9sb2NrIGhlbGQgYW5kIGludGVycnVwdHMgZGlzYWJsZWQgKi8KKwkgICAgaWYgKHBTUkItPlNHVG9CZVhmZXJMZW4pCisJCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSAmJiAhKChkc3RhdGUgPSBEQzM5MF9yZWFkOCAoRE1BX1N0YXR1cykpICYgRE1BX1hGRVJfRE9ORSkpIHsKKwkJICAgIHNwaW5fdW5sb2NrX2lycShwQUNCLT5wU2NzaUhvc3QtPmhvc3RfbG9jayk7CisJCSAgICB1ZGVsYXkoNTApOworCQkgICAgc3Bpbl9sb2NrX2lycShwQUNCLT5wU2NzaUhvc3QtPmhvc3RfbG9jayk7CisJCX0KKwkgICAgaWYgKCF0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKKwkJcHJpbnRrIChLRVJOX0NSSVQgIkRDMzkwOiBEZWFkbG9jayBpbiBEYXRhT3V0XzA6IERNQSBhYm9ydGVkIHVuZmluaXNoZWQ6ICUwNnggYnl0ZXMgcmVtYWluISFcbiIsCisJCQlEQzM5MF9yZWFkMzIgKERNQV9Xa19CeXRlQ250cikpOworCSAgICBkYzM5MF9sYXN0c3RhdHVzICY9IH4weGZmMDAwMDAwOworCSAgICBkYzM5MF9sYXN0c3RhdHVzIHw9IGRzdGF0ZSA8PCAyNDsKKwkgICAgcFNSQi0+VG90YWxYZmVycmVkTGVuICs9IHBTUkItPlNHVG9CZVhmZXJMZW47CisJICAgIHBTUkItPlNHSW5kZXgrKzsKKwkgICAgaWYoIHBTUkItPlNHSW5kZXggPCBwU1JCLT5TR2NvdW50ICkKKwkgICAgeworCQlwU1JCLT5wU2VnbWVudExpc3QrKzsKKwkJcHNnbCA9IHBTUkItPnBTZWdtZW50TGlzdDsKKworCQlwU1JCLT5TR0J1c0FkZHIgPSBjcHVfdG9fbGUzMihwY2lfZG1hX2xvMzIoc2dfZG1hX2FkZHJlc3MocHNnbCkpKTsKKwkJcFNSQi0+U0dUb0JlWGZlckxlbiA9IGNwdV90b19sZTMyKHNnX2RtYV9sZW4ocHNnbCkpOworCSAgICB9CisJICAgIGVsc2UKKwkJcFNSQi0+U0dUb0JlWGZlckxlbiA9IDA7CisJfQorCWVsc2UKKwl7CisJICAgIFJlc2lkQ250ICA9ICh1MzIpIERDMzkwX3JlYWQ4IChDdXJyZW50X0ZpZm8pICYgMHgxZjsKKwkgICAgUmVzaWRDbnQgfD0gKHUzMikgREMzOTBfcmVhZDggKEN0Y1JlZ19IaWdoKSA8PCAxNjsKKwkgICAgUmVzaWRDbnQgfD0gKHUzMikgREMzOTBfcmVhZDggKEN0Y1JlZ19NaWQpIDw8IDg7IAorCSAgICBSZXNpZENudCArPSAodTMyKSBEQzM5MF9yZWFkOCAoQ3RjUmVnX0xvdyk7CisKKwkgICAgeGZlckNudCA9IHBTUkItPlNHVG9CZVhmZXJMZW4gLSBSZXNpZENudDsKKwkgICAgcFNSQi0+U0dCdXNBZGRyICs9IHhmZXJDbnQ7CisJICAgIHBTUkItPlRvdGFsWGZlcnJlZExlbiArPSB4ZmVyQ250OworCSAgICBwU1JCLT5TR1RvQmVYZmVyTGVuID0gUmVzaWRDbnQ7CisJfQorICAgIH0KKyAgICBpZiAoKCpwc3N0YXR1cyAmIDcpICE9IFNDU0lfREFUQV9PVVQpCisgICAgeworCSAgICBEQzM5MF93cml0ZTggKERNQV9DbWQsIFdSSVRFX0RJUkVDVElPTitETUFfSURMRV9DTUQpOyAvKiB8IERNQV9JTlQgKi8KKwkgICAgREMzOTBfd3JpdGU4IChTY3NpQ21kLCBDTEVBUl9GSUZPX0NNRCk7CisgICAgfQkgICAgCit9CisKK3N0YXRpYyB2b2lkCitkYzM5MF9EYXRhSW5fMCggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKQoreworICAgIHU4ICAgc3N0YXR1cywgcmVzaWR1YWwsIGJ2YWw7CisgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpwc2dsOworICAgIHUzMiAgICBSZXNpZENudCwgaTsKKyAgICB1bnNpZ25lZCBsb25nICAgeGZlckNudDsKKyAgICB1OCAgICAgICpwdHI7CisKKyAgICBzc3RhdHVzID0gKnBzc3RhdHVzOworCisgICAgaWYoICEocFNSQi0+U1JCU3RhdGUgJiBTUkJfWEZFUlBBRCkgKQorICAgIHsKKwlpZiggc3N0YXR1cyAmIChQQVJJVFlfRVJSIHwgSUxMRUdBTF9PUF9FUlIpKQorCSAgICBwU1JCLT5TUkJTdGF0dXMgfD0gUEFSSVRZX0VSUk9SOworCisJaWYoIHNzdGF0dXMgJiBDT1VOVF8yX1pFUk8gKQorCXsKKwkgICAgaW50IGRzdGF0ZSA9IDA7CisJICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBIWjsKKworCSAgICAvKiBGdW5jdGlvbiBjYWxsZWQgZnJvbSB0aGUgSVNSIHdpdGggdGhlIGhvc3RfbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkICovCisJICAgIGlmIChwU1JCLT5TR1RvQmVYZmVyTGVuKQorCQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkgJiYgISgoZHN0YXRlID0gREMzOTBfcmVhZDggKERNQV9TdGF0dXMpKSAmIERNQV9YRkVSX0RPTkUpKSB7CisJCSAgICBzcGluX3VubG9ja19pcnEocEFDQi0+cFNjc2lIb3N0LT5ob3N0X2xvY2spOworCQkgICAgdWRlbGF5KDUwKTsKKwkJICAgIHNwaW5fbG9ja19pcnEocEFDQi0+cFNjc2lIb3N0LT5ob3N0X2xvY2spOworCQl9CisJICAgIGlmICghdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJcHJpbnRrIChLRVJOX0NSSVQgIkRDMzkwOiBEZWFkbG9jayBpbiBEYXRhSW5fMDogRE1BIGFib3J0ZWQgdW5maW5pc2hlZDogJTA2eCBieXRlcyByZW1haW4hIVxuIiwKKwkJCURDMzkwX3JlYWQzMiAoRE1BX1drX0J5dGVDbnRyKSk7CisJCXByaW50ayAoS0VSTl9DUklUICJEQzM5MDogRGF0YUluXzA6IERNQSBTdGF0ZTogJWlcbiIsIGRzdGF0ZSk7CisJICAgIH0KKwkgICAgZGMzOTBfbGFzdHN0YXR1cyAmPSB+MHhmZjAwMDAwMDsKKwkgICAgZGMzOTBfbGFzdHN0YXR1cyB8PSBkc3RhdGUgPDwgMjQ7CisJICAgIERFQlVHMShSZXNpZENudCA9ICgodW5zaWduZWQgbG9uZykgREMzOTBfcmVhZDggKEN0Y1JlZ19IaWdoKSA8PCAxNikJXAorCQkrICgodW5zaWduZWQgbG9uZykgREMzOTBfcmVhZDggKEN0Y1JlZ19NaWQpIDw8IDgpCQlcCisJCSsgKCh1bnNpZ25lZCBsb25nKSBEQzM5MF9yZWFkOCAoQ3RjUmVnX0xvdykpKTsKKwkgICAgREVCVUcxKHByaW50ayAoS0VSTl9ERUJVRyAiQ291bnRfMl9aZXJvIChSZXNpZENudD0laSxUb0JlWGZlcj0lbGkpLCIsIFJlc2lkQ250LCBwU1JCLT5TR1RvQmVYZmVyTGVuKSk7CisKKwkgICAgREMzOTBfd3JpdGU4IChETUFfQ21kLCBSRUFEX0RJUkVDVElPTitETUFfSURMRV9DTUQpOyAvKiB8IERNQV9JTlQgKi8KKworCSAgICBwU1JCLT5Ub3RhbFhmZXJyZWRMZW4gKz0gcFNSQi0+U0dUb0JlWGZlckxlbjsKKwkgICAgcFNSQi0+U0dJbmRleCsrOworCSAgICBpZiggcFNSQi0+U0dJbmRleCA8IHBTUkItPlNHY291bnQgKQorCSAgICB7CisJCXBTUkItPnBTZWdtZW50TGlzdCsrOworCQlwc2dsID0gcFNSQi0+cFNlZ21lbnRMaXN0OworCisJCXBTUkItPlNHQnVzQWRkciA9IGNwdV90b19sZTMyKHBjaV9kbWFfbG8zMihzZ19kbWFfYWRkcmVzcyhwc2dsKSkpOworCQlwU1JCLT5TR1RvQmVYZmVyTGVuID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihwc2dsKSk7CisJICAgIH0KKwkgICAgZWxzZQorCQlwU1JCLT5TR1RvQmVYZmVyTGVuID0gMDsKKwl9CisJZWxzZQkvKiBwaGFzZSBjaGFuZ2VkICovCisJeworCSAgICByZXNpZHVhbCA9IDA7CisJICAgIGJ2YWwgPSBEQzM5MF9yZWFkOCAoQ3VycmVudF9GaWZvKTsKKwkgICAgd2hpbGUoIGJ2YWwgJiAweDFmICkKKwkgICAgeworCQlERUJVRzEocHJpbnRrIChLRVJOX0RFQlVHICJDaGVjayBmb3IgcmVzaWR1YWxzLCIpKTsKKwkJaWYoIChidmFsICYgMHgxZikgPT0gMSApCisJCXsKKwkJICAgIGZvcihpPTA7IGkgPCAweDEwMDsgaSsrKQorCQkgICAgeworCQkJYnZhbCA9IERDMzkwX3JlYWQ4IChDdXJyZW50X0ZpZm8pOworCQkJaWYoICEoYnZhbCAmIDB4MWYpICkKKwkJCSAgICBnb3RvIGRpbl8xOworCQkJZWxzZSBpZiggaSA9PSAweDBmZiApCisJCQl7CisJCQkgICAgcmVzaWR1YWwgPSAxOyAgIC8qIDsxIHJlc2lkdWFsIGJ5dGUgKi8KKwkJCSAgICBnb3RvIGRpbl8xOworCQkJfQorCQkgICAgfQorCQl9CisJCWVsc2UKKwkJICAgIGJ2YWwgPSBEQzM5MF9yZWFkOCAoQ3VycmVudF9GaWZvKTsKKwkgICAgfQorZGluXzE6CisJICAgIERDMzkwX3dyaXRlOCAoRE1BX0NtZCwgUkVBRF9ESVJFQ1RJT04rRE1BX0JMQVNUX0NNRCk7CisJICAgIGZvciAoaSA9IDB4YTAwMDsgaTsgaS0tKQorCSAgICB7CisJCWJ2YWwgPSBEQzM5MF9yZWFkOCAoRE1BX1N0YXR1cyk7CisJCWlmIChidmFsICYgQkxBU1RfQ09NUExFVEUpCisJCSAgICBicmVhazsKKwkgICAgfQorCSAgICAvKiBJdCBzZWVtcyBhIERNQSBCbGFzdCBhYm9ydCBpc24ndCB0aGF0IGJhZCAuLi4gKi8KKwkgICAgaWYgKCFpKSBwcmludGsgKEtFUk5fRVJSICJEQzM5MDogRE1BIEJsYXN0IGFib3J0ZWQgdW5maW5pc2hlZCFcbiIpOworCSAgICAvL0RDMzkwX3dyaXRlOCAoRE1BX0NtZCwgUkVBRF9ESVJFQ1RJT04rRE1BX0lETEVfQ01EKTsgLyogfCBETUFfSU5UICovCisJICAgIGRjMzkwX2xhc3RzdGF0dXMgJj0gfjB4ZmYwMDAwMDA7IGRjMzkwX2xhc3RzdGF0dXMgfD0gYnZhbCA8PCAyNDsKKworCSAgICBERUJVRzEocHJpbnRrIChLRVJOX0RFQlVHICJCbGFzdDogUmVhZCAlaSB0aW1lcyBETUFfU3RhdHVzICUwMngiLCAweGEwMDAtaSwgYnZhbCkpOworCSAgICBSZXNpZENudCA9ICh1MzIpIERDMzkwX3JlYWQ4IChDdGNSZWdfSGlnaCk7CisJICAgIFJlc2lkQ250IDw8PSA4OworCSAgICBSZXNpZENudCB8PSAodTMyKSBEQzM5MF9yZWFkOCAoQ3RjUmVnX01pZCk7CisJICAgIFJlc2lkQ250IDw8PSA4OworCSAgICBSZXNpZENudCB8PSAodTMyKSBEQzM5MF9yZWFkOCAoQ3RjUmVnX0xvdyk7CisKKwkgICAgeGZlckNudCA9IHBTUkItPlNHVG9CZVhmZXJMZW4gLSBSZXNpZENudDsKKwkgICAgcFNSQi0+U0dCdXNBZGRyICs9IHhmZXJDbnQ7CisJICAgIHBTUkItPlRvdGFsWGZlcnJlZExlbiArPSB4ZmVyQ250OworCSAgICBwU1JCLT5TR1RvQmVYZmVyTGVuID0gUmVzaWRDbnQ7CisKKwkgICAgaWYoIHJlc2lkdWFsICkKKwkgICAgeworCQlidmFsID0gREMzOTBfcmVhZDggKFNjc2lGaWZvKTsJICAgIC8qIGdldCBvbmUgcmVzaWR1YWwgYnl0ZSAqLworCQlwdHIgPSAodTggKikgYnVzX3RvX3ZpcnQoIHBTUkItPlNHQnVzQWRkciApOworCQkqcHRyID0gYnZhbDsKKwkJcFNSQi0+U0dCdXNBZGRyKys7IHhmZXJDbnQrKzsKKwkJcFNSQi0+VG90YWxYZmVycmVkTGVuKys7CisJCXBTUkItPlNHVG9CZVhmZXJMZW4tLTsKKwkgICAgfQorCSAgICBERUJVRzEocHJpbnRrIChLRVJOX0RFQlVHICJYZmVyZWQ6ICVsaSwgVG90YWw6ICVsaSwgUmVtYWluaW5nOiAlbGlcbiIsIHhmZXJDbnQsXAorCQkJICAgcFNSQi0+VG90YWxYZmVycmVkTGVuLCBwU1JCLT5TR1RvQmVYZmVyTGVuKSk7CisKKwl9CisgICAgfQorICAgIGlmICgoKnBzc3RhdHVzICYgNykgIT0gU0NTSV9EQVRBX0lOKQorICAgIHsKKwkgICAgREMzOTBfd3JpdGU4IChTY3NpQ21kLCBDTEVBUl9GSUZPX0NNRCk7CisJICAgIERDMzkwX3dyaXRlOCAoRE1BX0NtZCwgUkVBRF9ESVJFQ1RJT04rRE1BX0lETEVfQ01EKTsgLyogfCBETUFfSU5UICovCisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZGMzOTBfQ29tbWFuZF8wKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpCit7Cit9CisKK3N0YXRpYyB2b2lkCitkYzM5MF9TdGF0dXNfMCggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKQoreworCisgICAgcFNSQi0+VGFyZ2V0U3RhdHVzID0gREMzOTBfcmVhZDggKFNjc2lGaWZvKTsKKyAgICAvL3VkZWxheSAoMSk7CisgICAgcFNSQi0+RW5kTWVzc2FnZSA9IERDMzkwX3JlYWQ4IChTY3NpRmlmbyk7CS8qIGdldCBtZXNzYWdlICovCisKKyAgICAqcHNzdGF0dXMgPSBTQ1NJX05PUDA7CisgICAgcFNSQi0+U1JCU3RhdGUgPSBTUkJfQ09NUExFVEVEOworICAgIERDMzkwX3dyaXRlOCAoU2NzaUNtZCwgTVNHX0FDQ0VQVEVEX0NNRCk7Cit9CisKK3N0YXRpYyB2b2lkCitkYzM5MF9Nc2dPdXRfMCggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKQoreworICAgIGlmKCBwU1JCLT5TUkJTdGF0ZSAmIChTUkJfVU5FWFBFQ1RfUkVTRUwrU1JCX0FCT1JUX1NFTlQpICkKKwkqcHNzdGF0dXMgPSBTQ1NJX05PUDA7CisgICAgLy9EQzM5MF93cml0ZTggKERNQV9DbWQsIERNQV9JRExFX0NNRCk7Cit9CisKKworc3RhdGljIHZvaWQgX19pbmxpbmVfXworZGMzOTBfcmVwcm9nIChzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfZGNiKiBwRENCKQoreworICBEQzM5MF93cml0ZTggKFN5bmNfUGVyaW9kLCBwRENCLT5TeW5jUGVyaW9kKTsKKyAgREMzOTBfd3JpdGU4IChTeW5jX09mZnNldCwgcERDQi0+U3luY09mZnNldCk7CisgIERDMzkwX3dyaXRlOCAoQ3RybFJlZzMsIHBEQ0ItPkN0cmxSMyk7CisgIERDMzkwX3dyaXRlOCAoQ3RybFJlZzQsIHBEQ0ItPkN0cmxSNCk7CisgIGRjMzkwX1NldFhmZXJSYXRlIChwQUNCLCBwRENCKTsKK30KKworCisjaWZkZWYgREMzOTBfREVCVUcwCitzdGF0aWMgdm9pZAorZGMzOTBfcHJpbnRNc2cgKHU4ICpNc2dCdWYsIHU4IGxlbikKK3sKKyAgaW50IGk7CisgIHByaW50ayAoIiAlMDJ4IiwgTXNnQnVmWzBdKTsKKyAgZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKQorICAgIHByaW50ayAoIiAlMDJ4IiwgTXNnQnVmW2ldKTsKKyAgcHJpbnRrICgiXG4iKTsKK30KKyNlbmRpZgorCisjZGVmaW5lIERDMzkwX0VOQUJMRV9NU0dPVVQgREMzOTBfd3JpdGU4IChTY3NpQ21kLCBTRVRfQVROX0NNRCkKKworLyogcmVqZWN0X21zZyAqLworc3RhdGljIHZvaWQgX19pbmxpbmVfXworZGMzOTBfTXNnSW5fcmVqZWN0IChzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCKQoreworICBwU1JCLT5Nc2dPdXRCdWZbMF0gPSBNRVNTQUdFX1JFSkVDVDsKKyAgcFNSQi0+TXNnQ250ID0gMTsKKyAgREMzOTBfRU5BQkxFX01TR09VVDsKKyAgREVCVUcwIChwcmludGsgKEtFUk5fSU5GTyAiREMzOTA6IFJlamVjdCBtZXNzYWdlXG4iKSk7Cit9CisKKy8qIGFib3J0IGNvbW1hbmQgKi8KK3N0YXRpYyB2b2lkCitkYzM5MF9FbmFibGVNc2dPdXRfQWJvcnQgKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCICkKK3sKKyAgICBwU1JCLT5Nc2dPdXRCdWZbMF0gPSBBQk9SVDsgCisgICAgcFNSQi0+TXNnQ250ID0gMTsgREMzOTBfRU5BQkxFX01TR09VVDsKKyAgICBwU1JCLT5wU1JCRENCLT5EQ0JGbGFnICY9IH5BQk9SVF9ERVZfOworfQorCitzdGF0aWMgc3RydWN0IGRjMzkwX3NyYioKK2RjMzkwX01zZ0luX1FUYWcgKHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9kY2IqIHBEQ0IsIHM4IHRhZykKK3sKKyAgc3RydWN0IGRjMzkwX3NyYiogcFNSQiA9IHBEQ0ItPnBHb2luZ1NSQjsKKworICBpZiAocFNSQikKKyAgICB7CisJc3RydWN0IHNjc2lfY21uZCAqc2NtZCA9IHNjc2lfZmluZF90YWcocFNSQi0+cGNtZC0+ZGV2aWNlLCB0YWcpOworCXBTUkIgPSAoc3RydWN0IGRjMzkwX3NyYiAqKXNjbWQtPmhvc3Rfc2NyaWJibGU7CisKKwlpZiAocERDQi0+RENCRmxhZyAmIEFCT1JUX0RFVl8pCisJeworCSAgcFNSQi0+U1JCU3RhdGUgPSBTUkJfQUJPUlRfU0VOVDsKKwkgIGRjMzkwX0VuYWJsZU1zZ091dF9BYm9ydCggcEFDQiwgcFNSQiApOworCX0KKworCWlmICghKHBTUkItPlNSQlN0YXRlICYgU1JCX0RJU0NPTk5FQ1QpKQorCQlnb3RvIG1pbmd4MDsKKworCXBEQ0ItPnBBY3RpdmVTUkIgPSBwU1JCOworCXBTUkItPlNSQlN0YXRlID0gU1JCX0RBVEFfWEZFUjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgbWluZ3gwOgorICAgICAgcFNSQiA9IHBBQ0ItPnBUbXBTUkI7CisgICAgICBwU1JCLT5TUkJTdGF0ZSA9IFNSQl9VTkVYUEVDVF9SRVNFTDsKKyAgICAgIHBEQ0ItPnBBY3RpdmVTUkIgPSBwU1JCOworICAgICAgcFNSQi0+TXNnT3V0QnVmWzBdID0gQUJPUlRfVEFHOworICAgICAgcFNSQi0+TXNnQ250ID0gMTsgREMzOTBfRU5BQkxFX01TR09VVDsKKyAgICB9CisgIHJldHVybiBwU1JCOworfQorCisKKy8qIHNldCBhc3luYyB0cmFuc2ZlciBtb2RlICovCitzdGF0aWMgdm9pZCAKK2RjMzkwX01zZ0luX3NldF9hc3luYyAoc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQikKK3sKKyAgc3RydWN0IGRjMzkwX2RjYiogcERDQiA9IHBTUkItPnBTUkJEQ0I7CisgIGlmICghKHBTUkItPlNSQlN0YXRlICYgRE9fU1lOQ19ORUdPKSkgCisgICAgcHJpbnRrIChLRVJOX0lORk8gIkRDMzkwOiBUYXJnZXQgJWkgaW5pdGlhdGVzIE5vbi1TeW5jP1xuIiwgcERDQi0+VGFyZ2V0SUQpOworICBwU1JCLT5TUkJTdGF0ZSAmPSB+RE9fU1lOQ19ORUdPOworICBwRENCLT5TeW5jTW9kZSAmPSB+KFNZTkNfRU5BQkxFK1NZTkNfTkVHT19ET05FKTsKKyAgcERDQi0+U3luY1BlcmlvZCA9IDA7CisgIHBEQ0ItPlN5bmNPZmZzZXQgPSAwOworICAvL3BEQ0ItPk5lZ29QZXJpb2QgPSA1MDsgLyogMjAwbnMgPD0+IDUgTUh6ICovCisgIHBEQ0ItPkN0cmxSMyA9IEZBU1RfQ0xLOwkvKiBmYXN0IGNsb2NrIC8gbm9ybWFsIHNjc2kgKi8KKyAgcERDQi0+Q3RybFI0ICY9IDB4M2Y7CisgIHBEQ0ItPkN0cmxSNCB8PSBwQUNCLT5nbGl0Y2hfY2ZnOwkvKiBnbGl0Y2ggZWF0ZXIgKi8KKyAgZGMzOTBfcmVwcm9nIChwQUNCLCBwRENCKTsKK30KKworLyogc2V0IHN5bmMgdHJhbnNmZXIgbW9kZSAqLworc3RhdGljIHZvaWQKK2RjMzkwX01zZ0luX3NldF9zeW5jIChzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCKQoreworICB1OCBidmFsOworICB1MTYgd3ZhbCwgd3ZhbDE7CisgIHN0cnVjdCBkYzM5MF9kY2IqIHBEQ0IgPSBwU1JCLT5wU1JCRENCOworICB1OCBvbGRzeW5jcGVyaW9kID0gcERDQi0+U3luY1BlcmlvZDsKKyAgdTggb2xkc3luY29mZnNldCA9IHBEQ0ItPlN5bmNPZmZzZXQ7CisgIAorICBpZiAoIShwU1JCLT5TUkJTdGF0ZSAmIERPX1NZTkNfTkVHTykpCisgICAgeworICAgICAgcHJpbnRrIChLRVJOX0lORk8gIkRDMzkwOiBUYXJnZXQgJWkgaW5pdGlhdGVzIFN5bmM6ICVpbnMgJWkgLi4uIGFuc3dlciAuLi5cbiIsIAorCSAgICAgIHBEQ0ItPlRhcmdldElELCBwU1JCLT5Nc2dJbkJ1ZlszXTw8MiwgcFNSQi0+TXNnSW5CdWZbNF0pOworCisgICAgICAvKiByZWplY3QgKi8KKyAgICAgIC8vZGMzOTBfTXNnSW5fcmVqZWN0IChwQUNCLCBwU1JCKTsKKyAgICAgIC8vcmV0dXJuIGRjMzkwX01zZ0luX3NldF9hc3luYyAocEFDQiwgcFNSQik7CisKKyAgICAgIC8qIFJlcGx5IHdpdGggY29ycmVjdGVkIFNEVFIgTWVzc2FnZSAqLworICAgICAgaWYgKHBTUkItPk1zZ0luQnVmWzRdID4gMTUpCisJeyAKKwkgIHByaW50ayAoS0VSTl9JTkZPICJEQzM5MDogTG93ZXIgU3luYyBPZmZzZXQgdG8gMTVcbiIpOworCSAgcFNSQi0+TXNnSW5CdWZbNF0gPSAxNTsKKwl9CisgICAgICBpZiAocFNSQi0+TXNnSW5CdWZbM10gPCBwRENCLT5OZWdvUGVyaW9kKQorCXsKKwkgIHByaW50ayAoS0VSTl9JTkZPICJEQzM5MDogU2V0IHN5bmMgbmVnbyBwZXJpb2QgdG8gJWluc1xuIiwgcERDQi0+TmVnb1BlcmlvZCA8PCAyKTsKKwkgIHBTUkItPk1zZ0luQnVmWzNdID0gcERDQi0+TmVnb1BlcmlvZDsKKwl9CisgICAgICBtZW1jcHkgKHBTUkItPk1zZ091dEJ1ZiwgcFNSQi0+TXNnSW5CdWYsIDUpOworICAgICAgcFNSQi0+TXNnQ250ID0gNTsKKyAgICAgIERDMzkwX0VOQUJMRV9NU0dPVVQ7CisgICAgfQorCisgIHBTUkItPlNSQlN0YXRlICY9IH5ET19TWU5DX05FR087CisgIHBEQ0ItPlN5bmNNb2RlIHw9IFNZTkNfRU5BQkxFK1NZTkNfTkVHT19ET05FOworICBwRENCLT5TeW5jT2Zmc2V0ICY9IDB4MGYwOworICBwRENCLT5TeW5jT2Zmc2V0IHw9IHBTUkItPk1zZ0luQnVmWzRdOworICBwRENCLT5OZWdvUGVyaW9kID0gcFNSQi0+TXNnSW5CdWZbM107CisKKyAgd3ZhbCA9ICh1MTYpIHBTUkItPk1zZ0luQnVmWzNdOworICB3dmFsID0gd3ZhbCA8PCAyOyB3dmFsIC09IDM7IHd2YWwxID0gd3ZhbCAvIDI1OwkvKiBjb21wdXRlIHNwZWVkICovCisgIGlmKCAod3ZhbDEgKiAyNSkgIT0gd3ZhbCkgd3ZhbDErKzsKKyAgYnZhbCA9IEZBU1RfQ0xLK0ZBU1RfU0NTSTsJLyogZmFzdCBjbG9jayAvIGZhc3Qgc2NzaSAqLworCisgIHBEQ0ItPkN0cmxSNCAmPSAweDNmOwkJLyogR2xpdGNoIGVhdGVyOiAxMm5zIGxlc3MgdGhhbiBub3JtYWwgKi8KKyAgaWYgKHBBQ0ItPmdsaXRjaF9jZmcgIT0gTlNfVE9fR0xJVENIKDApKQorICAgIHBEQ0ItPkN0cmxSNCB8PSBOU19UT19HTElUQ0goKChHTElUQ0hfVE9fTlMocEFDQi0+Z2xpdGNoX2NmZykpIC0gMSkpOworICBlbHNlCisgICAgcERDQi0+Q3RybFI0IHw9IE5TX1RPX0dMSVRDSCgwKTsKKyAgaWYgKHd2YWwxIDwgNCkgcERDQi0+Q3RybFI0IHw9IE5TX1RPX0dMSVRDSCgwKTsgLyogVWx0cmEgKi8KKworICBpZiAod3ZhbDEgPj0gOCkKKyAgICB7CisgICAgICB3dmFsMS0tOwkvKiBUaW1pbmcgY29tcHV0YXRpb24gZGlmZmVycyBieSAxIGZyb20gRkFTVF9TQ1NJICovCisgICAgICBidmFsID0gRkFTVF9DTEs7CQkvKiBmYXN0IGNsb2NrIC8gbm9ybWFsIHNjc2kgKi8KKyAgICAgIHBEQ0ItPkN0cmxSNCB8PSBwQUNCLT5nbGl0Y2hfY2ZnOyAJLyogZ2xpdGNoIGVhdGVyICovCisgICAgfQorCisgIHBEQ0ItPkN0cmxSMyA9IGJ2YWw7CisgIHBEQ0ItPlN5bmNQZXJpb2QgPSAodTgpd3ZhbDE7CisgIAorICBpZiAoKG9sZHN5bmNwZXJpb2QgIT0gd3ZhbDEgfHwgb2xkc3luY29mZnNldCAhPSBwRENCLT5TeW5jT2Zmc2V0KSAmJiBwRENCLT5UYXJnZXRMVU4gPT0gMCkKKyAgICB7CisgICAgICBpZiAoISAoYnZhbCAmIEZBU1RfU0NTSSkpIHd2YWwxKys7CisgICAgICBwcmludGsgKEtFUk5fSU5GTyAiREMzOTA6IFRhcmdldCAlaTogU3luYyB0cmFuc2ZlciAlaS4lMWkgTUh6LCBPZmZzZXQgJWlcbiIsIHBEQ0ItPlRhcmdldElELCAKKwkgICAgICA0MC93dmFsMSwgKCg0MCV3dmFsMSkqMTArd3ZhbDEvMikvd3ZhbDEsIHBEQ0ItPlN5bmNPZmZzZXQgJiAweDBmKTsKKyAgICB9CisgIAorICBkYzM5MF9yZXByb2cgKHBBQ0IsIHBEQ0IpOworfQorCisKKy8qIGhhbmRsZSBSRVNUT1JFX1BUUiAqLworLyogSSBwcmVzdW1lLCB0aGlzIGNvbW1hbmQgaXMgYWxyZWFkeSBtYXBwZWQsIHNvLCBoYXZlIHRvIHJlbWFwLiAqLworc3RhdGljIHZvaWQgCitkYzM5MF9yZXN0b3JlX3B0ciAoc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQikKK3sKKyAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpwY21kID0gcFNSQi0+cGNtZDsKKyAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnBzZ2w7CisgICAgcFNSQi0+VG90YWxYZmVycmVkTGVuID0gMDsKKyAgICBwU1JCLT5TR0luZGV4ID0gMDsKKyAgICBpZiAocGNtZC0+dXNlX3NnKSB7CisJcFNSQi0+cFNlZ21lbnRMaXN0ID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXBjbWQtPnJlcXVlc3RfYnVmZmVyOworCXBzZ2wgPSBwU1JCLT5wU2VnbWVudExpc3Q7CisJLy9kYzM5MF9wY2lfc3luYyhwU1JCKTsKKworCXdoaWxlIChwU1JCLT5Ub3RhbFhmZXJyZWRMZW4gKyAodW5zaWduZWQgbG9uZykgc2dfZG1hX2xlbihwc2dsKSA8IHBTUkItPlNhdmVkX1B0cikKKwl7CisJICAgIHBTUkItPlRvdGFsWGZlcnJlZExlbiArPSAodW5zaWduZWQgbG9uZykgc2dfZG1hX2xlbihwc2dsKTsKKwkgICAgcFNSQi0+U0dJbmRleCsrOworCSAgICBpZiggcFNSQi0+U0dJbmRleCA8IHBTUkItPlNHY291bnQgKQorCSAgICB7CisJCXBTUkItPnBTZWdtZW50TGlzdCsrOworCQlwc2dsID0gcFNSQi0+cFNlZ21lbnRMaXN0OworCQlwU1JCLT5TR0J1c0FkZHIgPSBjcHVfdG9fbGUzMihwY2lfZG1hX2xvMzIoc2dfZG1hX2FkZHJlc3MocHNnbCkpKTsKKwkJcFNSQi0+U0dUb0JlWGZlckxlbiA9IGNwdV90b19sZTMyKHNnX2RtYV9sZW4ocHNnbCkpOworCSAgICB9CisJICAgIGVsc2UKKwkJcFNSQi0+U0dUb0JlWGZlckxlbiA9IDA7CisJfQorCXBTUkItPlNHVG9CZVhmZXJMZW4gLT0gKHBTUkItPlNhdmVkX1B0ciAtIHBTUkItPlRvdGFsWGZlcnJlZExlbik7CisJcFNSQi0+U0dCdXNBZGRyICs9IChwU1JCLT5TYXZlZF9QdHIgLSBwU1JCLT5Ub3RhbFhmZXJyZWRMZW4pOworCXByaW50ayAoS0VSTl9JTkZPICJEQzM5MDogUG9pbnRlciByZXN0b3JlZC4gU2VnbWVudCAlaSwgVG90YWwgJWxpLCBCdXMgJTA4bHhcbiIsCisJCXBTUkItPlNHSW5kZXgsIHBTUkItPlNhdmVkX1B0ciwgcFNSQi0+U0dCdXNBZGRyKTsKKworICAgIH0gZWxzZSBpZihwY21kLT5yZXF1ZXN0X2J1ZmZlcikgeworCS8vZGMzOTBfcGNpX3N5bmMocFNSQik7CisKKwlzZ19kbWFfbGVuKCZwU1JCLT5TZWdtZW50eCkgPSBwY21kLT5yZXF1ZXN0X2J1ZmZsZW4gLSBwU1JCLT5TYXZlZF9QdHI7CisJcFNSQi0+U0djb3VudCA9IDE7CisJcFNSQi0+cFNlZ21lbnRMaXN0ID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSAmcFNSQi0+U2VnbWVudHg7CisgICAgfSBlbHNlIHsKKwkgcFNSQi0+U0djb3VudCA9IDA7CisJIHByaW50ayAoS0VSTl9JTkZPICJEQzM5MDogUkVTVE9SRV9QVFIgbWVzc2FnZSBmb3IgVHJhbnNmZXIgd2l0aG91dCBTY2F0dGVyLUdhdGhlciA/P1xuIik7CisgICAgfQorCisgIHBTUkItPlRvdGFsWGZlcnJlZExlbiA9IHBTUkItPlNhdmVkX1B0cjsKK30KKworCisvKiBBY2NvcmRpbmcgdG8gdGhlIGRvY3MsIHRoZSBBTTUzQzk3NCByZWFkcyB0aGUgbWVzc2FnZSBhbmQgCisgKiBnZW5lcmF0ZXMgYSBTdWNjZXNzZnVsIE9wZXJhdGlvbiBJUlEgYmVmb3JlIGFzc2VydGluZyBBQ0sgZm9yCisgKiB0aGUgbGFzdCBieXRlIChob3cgZG9lcyBpdCBrbm93IHdoZXRoZXIgaXQncyB0aGUgbGFzdCA/KSAqLworLyogVGhlIG9sZCBjb2RlIGhhbmRsZWQgaXQgaW4gYW5vdGhlciB3YXksIGluZGljYXRpbmcsIHRoYXQgb24KKyAqIGV2ZXJ5IG1lc3NhZ2UgYnl0ZSBhbiBJUlEgaXMgZ2VuZXJhdGVkIGFuZCBldmVyeSBieXRlIGhhcyB0bworICogYmUgbWFudWFsbHkgQUNLZWQuIEhtbW0gPyAgKEtHLCA5OC8xMS8yOCkgKi8KKy8qIFRoZSBvbGQgaW1wbGVtZW50YXRpb24gd2FzIGNvcnJlY3QuIFNpZ2ghICovCisKKy8qIENoZWNrIGlmIHRoZSBtZXNzYWdlIGlzIGNvbXBsZXRlICovCitzdGF0aWMgdTggX19pbmxpbmVfXworZGMzOTBfTXNnSW5fY29tcGxldGUgKHU4ICptc2didWYsIHUzMiBsZW4pCit7IAorICBpZiAoKm1zZ2J1ZiA9PSBFWFRFTkRFRF9NRVNTQUdFKQorICB7CisJaWYgKGxlbiA8IDIpIHJldHVybiAwOworCWlmIChsZW4gPCBtc2didWZbMV0gKyAyKSByZXR1cm4gMDsKKyAgfQorICBlbHNlIGlmICgqbXNnYnVmID49IDB4MjAgJiYgKm1zZ2J1ZiA8PSAweDJmKSAvLyB0d28gYnl0ZSBtZXNzYWdlcworCWlmIChsZW4gPCAyKSByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKKworCisvKiByZWFkIGFuZCBldmFsIHJlY2VpdmVkIG1lc3NhZ2VzICovCitzdGF0aWMgdm9pZAorZGMzOTBfTXNnSW5fMCggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKQoreworICAgIHN0cnVjdCBkYzM5MF9kY2IqICAgcERDQiA9IHBBQ0ItPnBBY3RpdmVEQ0I7CisKKyAgICAvKiBSZWFkIHRoZSBtc2cgKi8KKworICAgIHBTUkItPk1zZ0luQnVmW3BBQ0ItPk1zZ0xlbisrXSA9IERDMzkwX3JlYWQ4IChTY3NpRmlmbyk7CisgICAgLy9wU1JCLT5TUkJTdGF0ZSA9IDA7CisKKyAgICAvKiBNc2cgY29tcGxldGUgPyAqLworICAgIGlmIChkYzM5MF9Nc2dJbl9jb21wbGV0ZSAocFNSQi0+TXNnSW5CdWYsIHBBQ0ItPk1zZ0xlbikpCisgICAgICB7CisJREVCVUcwIChwcmludGsgKEtFUk5fSU5GTyAiREMzOTA6IE1zZ0luOiIpOyBkYzM5MF9wcmludE1zZyAocFNSQi0+TXNnSW5CdWYsIHBBQ0ItPk1zZ0xlbikpOworCS8qIE5vdyBldmFsIHRoZSBtc2cgKi8KKwlzd2l0Y2ggKHBTUkItPk1zZ0luQnVmWzBdKSAKKwkgIHsKKwkgIGNhc2UgRElTQ09OTkVDVDogCisJICAgIHBTUkItPlNSQlN0YXRlID0gU1JCX0RJU0NPTk5FQ1Q7IGJyZWFrOworCSAgICAKKwkgIGNhc2UgU0lNUExFX1FVRVVFX1RBRzoKKwkgIGNhc2UgSEVBRF9PRl9RVUVVRV9UQUc6CisJICBjYXNlIE9SREVSRURfUVVFVUVfVEFHOgorCSAgICBwU1JCID0gZGMzOTBfTXNnSW5fUVRhZyAocEFDQiwgcERDQiwgcFNSQi0+TXNnSW5CdWZbMV0pOworCSAgICBicmVhazsKKwkgICAgCisJICBjYXNlIE1FU1NBR0VfUkVKRUNUOiAKKwkgICAgREMzOTBfd3JpdGU4IChTY3NpQ21kLCBSRVNFVF9BVE5fQ01EKTsKKwkgICAgcERDQi0+TmVnb1BlcmlvZCA9IDUwOyAvKiAyMDBucyA8PT4gNSBNSHogKi8KKwkgICAgaWYoIHBTUkItPlNSQlN0YXRlICYgRE9fU1lOQ19ORUdPKQorCSAgICAgIGRjMzkwX01zZ0luX3NldF9hc3luYyAocEFDQiwgcFNSQik7CisJICAgIGJyZWFrOworCSAgICAKKwkgIGNhc2UgRVhURU5ERURfTUVTU0FHRToKKwkgICAgLyogcmVqZWN0IGV2ZXJ5IGV4dGVuZGVkIG1zZyBidXQgU0RUUiAqLworCSAgICBpZiAocFNSQi0+TXNnSW5CdWZbMV0gIT0gMyB8fCBwU1JCLT5Nc2dJbkJ1ZlsyXSAhPSBFWFRFTkRFRF9TRFRSKQorCSAgICAgIGRjMzkwX01zZ0luX3JlamVjdCAocEFDQiwgcFNSQik7CisJICAgIGVsc2UKKwkgICAgICB7CisJCWlmIChwU1JCLT5Nc2dJbkJ1ZlszXSA9PSAwIHx8IHBTUkItPk1zZ0luQnVmWzRdID09IDApCisJCSAgZGMzOTBfTXNnSW5fc2V0X2FzeW5jIChwQUNCLCBwU1JCKTsKKwkJZWxzZQorCQkgIGRjMzkwX01zZ0luX3NldF9zeW5jIChwQUNCLCBwU1JCKTsKKwkgICAgICB9CisJICAgIAorCSAgICAvLyBub3RoaW5nIGhhcyB0byBiZSBkb25lCisJICBjYXNlIENPTU1BTkRfQ09NUExFVEU6IGJyZWFrOworCSAgICAKKwkgICAgLy8gU0FWRSBQT0lOVEVSIG1heSBiZSBpZ25vcmVkIGFzIHdlIGhhdmUgdGhlIHN0cnVjdCBkYzM5MF9zcmIqIGFzc29jaWF0ZWQgd2l0aCB0aGUKKwkgICAgLy8gc2NzaSBjb21tYW5kLiBUaGFua3MsIEdlcmFyZCwgZm9yIHBvaW50aW5nIGl0IG91dC4KKwkgIGNhc2UgU0FWRV9QT0lOVEVSUzogCisJICAgIHBTUkItPlNhdmVkX1B0ciA9IHBTUkItPlRvdGFsWGZlcnJlZExlbjsKKwkgICAgYnJlYWs7CisJICAgIC8vIFRoZSBkZXZpY2UgbWlnaHQgd2FudCB0byByZXN0YXJ0IHRyYW5zZmVyIHdpdGggYSBSRVNUT1JFCisJICBjYXNlIFJFU1RPUkVfUE9JTlRFUlM6CisJICAgIERFQlVHMChwcmludGsgKCJEQzM5MDogUkVTVE9SRSBQT0lOVEVSIG1lc3NhZ2UgcmVjZWl2ZWQgLi4uIHRyeSB0byBoYW5kbGVcbiIpKTsKKwkgICAgZGMzOTBfcmVzdG9yZV9wdHIgKHBBQ0IsIHBTUkIpOworCSAgICBicmVhazsKKworCSAgICAvLyByZWplY3QgdW5rbm93biBtZXNzYWdlcworCSAgZGVmYXVsdDogZGMzOTBfTXNnSW5fcmVqZWN0IChwQUNCLCBwU1JCKTsKKwkgIH0KKwkKKwkvKiBDbGVhciBjb3VudGVyIGFuZCBNc2dJbiBzdGF0ZSAqLworCXBTUkItPlNSQlN0YXRlICY9IH5TUkJfTVNHSU47CisJcEFDQi0+TXNnTGVuID0gMDsKKyAgICAgIH0KKworICAgICpwc3N0YXR1cyA9IFNDU0lfTk9QMDsKKyAgICBEQzM5MF93cml0ZTggKFNjc2lDbWQsIE1TR19BQ0NFUFRFRF9DTUQpOworICAgIC8vREMzOTBfd3JpdGU4IChETUFfQ21kLCBETUFfSURMRV9DTUQpOworfQorCisKK3N0YXRpYyB2b2lkCitkYzM5MF9EYXRhSU9fQ29tbSggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggaW9EaXIpCit7CisgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpwc2dsOworICAgIHVuc2lnbmVkIGxvbmcgIGx2YWw7CisgICAgc3RydWN0IGRjMzkwX2RjYiogICBwRENCID0gcEFDQi0+cEFjdGl2ZURDQjsKKworICAgIGlmIChwU1JCID09IHBBQ0ItPnBUbXBTUkIpCisgICAgeworCWlmIChwRENCKQorCQlwcmludGsoS0VSTl9FUlIgIkRDMzkwOiBwU1JCID09IHBUbXBTUkIhIChUYWdRIEVycm9yPykgKCUwMmktJWkpXG4iLCBwRENCLT5UYXJnZXRJRCwgcERDQi0+VGFyZ2V0TFVOKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0VSUiAiREMzOTA6IHBTUkIgPT0gcFRtcFNSQiEgKFRhZ1EgRXJyb3I/KSAoRENCIDAhKVxuIik7CisKKwkvKiBUcnkgdG8gcmVjb3ZlciAtIHNvbWUgYnJva2VuIGRpc2tzIHJlYWN0IGJhZGx5IHRvIHRhZ2dlZCBJTlFVSVJZICovCisJaWYgKHBEQ0IgJiYgcEFDQi0+c2Nhbl9kZXZpY2VzICYmIHBEQ0ItPkdvaW5nU1JCQ250ID09IDEpIHsKKwkJcFNSQiA9IHBEQ0ItPnBHb2luZ1NSQjsKKwkJcERDQi0+cEFjdGl2ZVNSQiA9IHBTUkI7CisJfSBlbHNlIHsKKwkJcFNSQi0+cFNSQkRDQiA9IHBEQ0I7CisJCWRjMzkwX0VuYWJsZU1zZ091dF9BYm9ydChwQUNCLCBwU1JCKTsKKwkJaWYgKHBEQ0IpCisJCQlwRENCLT5EQ0JGbGFnIHw9IEFCT1JUX0RFVjsKKwkJcmV0dXJuOworCX0KKyAgICB9CisKKyAgICBpZiggcFNSQi0+U0dJbmRleCA8IHBTUkItPlNHY291bnQgKQorICAgIHsKKwlEQzM5MF93cml0ZTggKERNQV9DbWQsIERNQV9JRExFX0NNRCB8IGlvRGlyIC8qIHwgRE1BX0lOVCAqLyk7CisJaWYoICFwU1JCLT5TR1RvQmVYZmVyTGVuICkKKwl7CisJICAgIHBzZ2wgPSBwU1JCLT5wU2VnbWVudExpc3Q7CisJICAgIHBTUkItPlNHQnVzQWRkciA9IGNwdV90b19sZTMyKHBjaV9kbWFfbG8zMihzZ19kbWFfYWRkcmVzcyhwc2dsKSkpOworCSAgICBwU1JCLT5TR1RvQmVYZmVyTGVuID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihwc2dsKSk7CisJICAgIERFQlVHMShwcmludGsgKEtFUk5fREVCVUcgIiBEQzM5MDogTmV4dCBTRyBzZWdtZW50LiIpKTsKKwl9CisJbHZhbCA9IHBTUkItPlNHVG9CZVhmZXJMZW47CisJREVCVUcxKHByaW50ayAoS0VSTl9ERUJVRyAiIERDMzkwOiBTdGFydCB0cmFuc2ZlcjogJWxpIGJ5dGVzIChhZGRyZXNzICUwOGx4KVxuIiwgbHZhbCwgcFNSQi0+U0dCdXNBZGRyKSk7CisJREMzOTBfd3JpdGU4IChDdGNSZWdfTG93LCAodTgpIGx2YWwpOworCWx2YWwgPj49IDg7CisJREMzOTBfd3JpdGU4IChDdGNSZWdfTWlkLCAodTgpIGx2YWwpOworCWx2YWwgPj49IDg7CisJREMzOTBfd3JpdGU4IChDdGNSZWdfSGlnaCwgKHU4KSBsdmFsKTsKKworCURDMzkwX3dyaXRlMzIgKERNQV9YZmVyQ250LCBwU1JCLT5TR1RvQmVYZmVyTGVuKTsKKwlEQzM5MF93cml0ZTMyIChETUFfWGZlckFkZHIsIHBTUkItPlNHQnVzQWRkcik7CisKKwkvL0RDMzkwX3dyaXRlOCAoRE1BX0NtZCwgRE1BX0lETEVfQ01EIHwgaW9EaXIpOyAvKiB8IERNQV9JTlQ7ICovCisJcFNSQi0+U1JCU3RhdGUgPSBTUkJfREFUQV9YRkVSOworCisJREMzOTBfd3JpdGU4IChTY3NpQ21kLCBETUFfQ09NTUFORCtJTkZPX1hGRVJfQ01EKTsKKworCURDMzkwX3dyaXRlOCAoRE1BX0NtZCwgRE1BX1NUQVJUX0NNRCB8IGlvRGlyIHwgRE1BX0lOVCk7CisJLy9ERUJVRzEoREMzOTBfd3JpdGUzMiAoRE1BX1Njc2lCdXNDdHJsLCBXUlRfRVJBU0VfRE1BX1NUQVQgfCBFTl9JTlRfT05fUENJX0FCT1JUKSk7CisJLy9ERUJVRzEocHJpbnRrIChLRVJOX0RFQlVHICJEQzM5MDogRE1BX1N0YXR1czogJTAyeFxuIiwgREMzOTBfcmVhZDggKERNQV9TdGF0dXMpKSk7CisJLy9ERUJVRzEoREMzOTBfd3JpdGUzMiAoRE1BX1Njc2lCdXNDdHJsLCBFTl9JTlRfT05fUENJX0FCT1JUKSk7CisgICAgfQorICAgIGVsc2UgICAgLyogeGZlciBwYWQgKi8KKyAgICB7CisJaWYoIHBTUkItPlNHY291bnQgKQorCXsKKwkgICAgcFNSQi0+QWRhcHRTdGF0dXMgPSBIX09WRVJfVU5ERVJfUlVOOworCSAgICBwU1JCLT5TUkJTdGF0dXMgfD0gT1ZFUl9SVU47CisJICAgIERFQlVHMChwcmludGsgKEtFUk5fV0FSTklORyAiIERDMzkwOiBPdmVycnVuIC0iKSk7CisJfQorCURFQlVHMChwcmludGsgKEtFUk5fV0FSTklORyAiIENsZWFyIHRyYW5zZmVyIHBhZCBcbiIpKTsKKwlEQzM5MF93cml0ZTggKEN0Y1JlZ19Mb3csIDApOworCURDMzkwX3dyaXRlOCAoQ3RjUmVnX01pZCwgMCk7CisJREMzOTBfd3JpdGU4IChDdGNSZWdfSGlnaCwgMCk7CisKKwlwU1JCLT5TUkJTdGF0ZSB8PSBTUkJfWEZFUlBBRDsKKwlEQzM5MF93cml0ZTggKFNjc2lDbWQsIERNQV9DT01NQU5EK1hGRVJfUEFEX0JZVEUpOworLyoKKwlEQzM5MF93cml0ZTggKERNQV9DbWQsIERNQV9JRExFX0NNRCB8IGlvRGlyKTsgLy8gfCBETUFfSU5UOworCURDMzkwX3dyaXRlOCAoRE1BX0NtZCwgRE1BX1NUQVJUX0NNRCB8IGlvRGlyIHwgRE1BX0lOVCk7CisqLworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorZGMzOTBfRGF0YU91dFBoYXNlKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpCit7CisgICAgZGMzOTBfRGF0YUlPX0NvbW0gKHBBQ0IsIHBTUkIsIFdSSVRFX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyB2b2lkCitkYzM5MF9EYXRhSW5QaGFzZSggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKQoreworICAgIGRjMzkwX0RhdGFJT19Db21tIChwQUNCLCBwU1JCLCBSRUFEX0RJUkVDVElPTik7Cit9CisKK3N0YXRpYyB2b2lkCitkYzM5MF9Db21tYW5kUGhhc2UoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIsIHU4ICpwc3N0YXR1cykKK3sKKyAgICBzdHJ1Y3QgZGMzOTBfZGNiKiAgIHBEQ0I7CisgICAgdTggIGksIGNudDsKKyAgICB1OCAgICAgKnB0cjsKKworICAgIERDMzkwX3dyaXRlOCAoU2NzaUNtZCwgUkVTRVRfQVROX0NNRCk7CisgICAgREMzOTBfd3JpdGU4IChTY3NpQ21kLCBDTEVBUl9GSUZPX0NNRCk7CisgICAgaWYoICEocFNSQi0+U1JCRmxhZyAmIEFVVE9fUkVRU0VOU0UpICkKKyAgICB7CisJY250ID0gKHU4KSBwU1JCLT5wY21kLT5jbWRfbGVuOworCXB0ciA9ICh1OCAqKSBwU1JCLT5wY21kLT5jbW5kOworCWZvcihpPTA7IGkgPCBjbnQ7IGkrKykKKwkgICAgREMzOTBfd3JpdGU4IChTY3NpRmlmbywgKihwdHIrKykpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCURDMzkwX3dyaXRlOCAoU2NzaUZpZm8sIFJFUVVFU1RfU0VOU0UpOworCXBEQ0IgPSBwQUNCLT5wQWN0aXZlRENCOworCURDMzkwX3dyaXRlOCAoU2NzaUZpZm8sIHBEQ0ItPlRhcmdldExVTiA8PCA1KTsKKwlEQzM5MF93cml0ZTggKFNjc2lGaWZvLCAwKTsKKwlEQzM5MF93cml0ZTggKFNjc2lGaWZvLCAwKTsKKwlEQzM5MF93cml0ZTggKFNjc2lGaWZvLCBzaXplb2YocFNSQi0+cGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisJREMzOTBfd3JpdGU4IChTY3NpRmlmbywgMCk7CisJREVCVUcwKHByaW50ayhLRVJOX0RFQlVHICJEQzM5MDogQXV0b1JlcVNlbnNlIChDbW5kUGhhc2UpIVxuIikpOworICAgIH0KKyAgICBwU1JCLT5TUkJTdGF0ZSA9IFNSQl9DT01NQU5EOworICAgIERDMzkwX3dyaXRlOCAoU2NzaUNtZCwgSU5GT19YRkVSX0NNRCk7Cit9CisKK3N0YXRpYyB2b2lkCitkYzM5MF9TdGF0dXNQaGFzZSggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKQoreworICAgIERDMzkwX3dyaXRlOCAoU2NzaUNtZCwgQ0xFQVJfRklGT19DTUQpOworICAgIHBTUkItPlNSQlN0YXRlID0gU1JCX1NUQVRVUzsKKyAgICBEQzM5MF93cml0ZTggKFNjc2lDbWQsIElOSVRJQVRPUl9DTURfQ01QTFRFKTsKKyAgICAvL0RDMzkwX3dyaXRlOCAoRE1BX0NtZCwgRE1BX0lETEVfQ01EKTsKK30KKworc3RhdGljIHZvaWQKK2RjMzkwX01zZ091dFBoYXNlKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpCit7CisgICAgdTggICBidmFsLCBpLCBjbnQ7CisgICAgdTggICAgICpwdHI7CisgICAgc3RydWN0IGRjMzkwX2RjYiogICAgcERDQjsKKworICAgIERDMzkwX3dyaXRlOCAoU2NzaUNtZCwgQ0xFQVJfRklGT19DTUQpOworICAgIHBEQ0IgPSBwQUNCLT5wQWN0aXZlRENCOworICAgIGlmKCAhKHBTUkItPlNSQlN0YXRlICYgU1JCX01TR09VVCkgKQorICAgIHsKKwljbnQgPSBwU1JCLT5Nc2dDbnQ7CisJaWYoIGNudCApCisJeworCSAgICBwdHIgPSAodTggKikgcFNSQi0+TXNnT3V0QnVmOworCSAgICBmb3IoaT0wOyBpIDwgY250OyBpKyspCisJCURDMzkwX3dyaXRlOCAoU2NzaUZpZm8sICoocHRyKyspKTsKKwkgICAgcFNSQi0+TXNnQ250ID0gMDsKKwkgICAgaWYoIChwRENCLT5EQ0JGbGFnICYgQUJPUlRfREVWXykgJiYKKwkJKHBTUkItPk1zZ091dEJ1ZlswXSA9PSBBQk9SVCkgKQorCQlwU1JCLT5TUkJTdGF0ZSA9IFNSQl9BQk9SVF9TRU5UOworCX0KKwllbHNlCisJeworCSAgICBidmFsID0gQUJPUlQ7CS8qID8/PyBNU0dfTk9QICovCisJICAgIGlmKCAocFNSQi0+cGNtZC0+Y21uZFswXSA9PSBJTlFVSVJZICkgfHwKKwkJKHBTUkItPnBjbWQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkgfHwKKwkJKHBTUkItPlNSQkZsYWcgJiBBVVRPX1JFUVNFTlNFKSApCisJICAgIHsKKwkJaWYoIHBEQ0ItPlN5bmNNb2RlICYgU1lOQ19FTkFCTEUgKQorCQkgICAgZ290byAgbW9wMTsKKwkgICAgfQorCSAgICBEQzM5MF93cml0ZTggKFNjc2lGaWZvLCBidmFsKTsKKwl9CisJREMzOTBfd3JpdGU4IChTY3NpQ21kLCBJTkZPX1hGRVJfQ01EKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKK21vcDE6CisgICAgICAgIHByaW50ayAoS0VSTl9FUlIgIkRDMzkwOiBPTEQgU3luYyBOZWdvIGNvZGUgdHJpZ2dlcmVkISAoJWkgJWkpXG4iLCBwRENCLT5UYXJnZXRJRCwgcERDQi0+VGFyZ2V0TFVOKTsKKwlEQzM5MF93cml0ZTggKFNjc2lGaWZvLCBFWFRFTkRFRF9NRVNTQUdFKTsKKwlEQzM5MF93cml0ZTggKFNjc2lGaWZvLCAzKTsJLyogICAgO2xlbmd0aCBvZiBleHRlbmRlZCBtc2cgKi8KKwlEQzM5MF93cml0ZTggKFNjc2lGaWZvLCBFWFRFTkRFRF9TRFRSKTsJLyogICAgOyBzeW5jIG5lZ28gKi8KKwlEQzM5MF93cml0ZTggKFNjc2lGaWZvLCBwRENCLT5OZWdvUGVyaW9kKTsKKwlpZiAocERDQi0+U3luY09mZnNldCAmIDB4MGYpCisJCSAgICBEQzM5MF93cml0ZTggKFNjc2lGaWZvLCBwRENCLT5TeW5jT2Zmc2V0KTsKKwllbHNlCisJCSAgICBEQzM5MF93cml0ZTggKFNjc2lGaWZvLCBTWU5DX05FR09fT0ZGU0VUKTsJCSAgICAKKwlwU1JCLT5TUkJTdGF0ZSB8PSBET19TWU5DX05FR087CisJREMzOTBfd3JpdGU4IChTY3NpQ21kLCBJTkZPX1hGRVJfQ01EKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitkYzM5MF9Nc2dJblBoYXNlKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpCit7CisgICAgREMzOTBfd3JpdGU4IChTY3NpQ21kLCBDTEVBUl9GSUZPX0NNRCk7CisgICAgaWYoICEocFNSQi0+U1JCU3RhdGUgJiBTUkJfTVNHSU4pICkKKyAgICB7CisJcFNSQi0+U1JCU3RhdGUgJj0gflNSQl9ESVNDT05ORUNUOworCXBTUkItPlNSQlN0YXRlIHw9IFNSQl9NU0dJTjsKKyAgICB9CisgICAgREMzOTBfd3JpdGU4IChTY3NpQ21kLCBJTkZPX1hGRVJfQ01EKTsKKyAgICAvL0RDMzkwX3dyaXRlOCAoRE1BX0NtZCwgRE1BX0lETEVfQ01EKTsKK30KKworc3RhdGljIHZvaWQKK2RjMzkwX05vcF8wKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpCit7Cit9CisKK3N0YXRpYyB2b2lkCitkYzM5MF9Ob3BfMSggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKQoreworfQorCisKK3N0YXRpYyB2b2lkCitkYzM5MF9TZXRYZmVyUmF0ZSggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX2RjYiogcERDQiApCit7CisgICAgdTggIGJ2YWwsIGksIGNudDsKKyAgICBzdHJ1Y3QgZGMzOTBfZGNiKiAgIHB0cjsKKworICAgIGlmKCAhKHBEQ0ItPlRhcmdldExVTikgKQorICAgIHsKKwlpZiggIXBBQ0ItPnNjYW5fZGV2aWNlcyApCisJeworCSAgICBwdHIgPSBwQUNCLT5wTGlua0RDQjsKKwkgICAgY250ID0gcEFDQi0+RENCQ250OworCSAgICBidmFsID0gcERDQi0+VGFyZ2V0SUQ7CisJICAgIGZvcihpPTA7IGk8Y250OyBpKyspCisJICAgIHsKKwkJaWYoIHB0ci0+VGFyZ2V0SUQgPT0gYnZhbCApCisJCXsKKwkJICAgIHB0ci0+U3luY1BlcmlvZCA9IHBEQ0ItPlN5bmNQZXJpb2Q7CisJCSAgICBwdHItPlN5bmNPZmZzZXQgPSBwRENCLT5TeW5jT2Zmc2V0OworCQkgICAgcHRyLT5DdHJsUjMgPSBwRENCLT5DdHJsUjM7CisJCSAgICBwdHItPkN0cmxSNCA9IHBEQ0ItPkN0cmxSNDsKKwkJICAgIHB0ci0+U3luY01vZGUgPSBwRENCLT5TeW5jTW9kZTsKKwkJfQorCQlwdHIgPSBwdHItPnBOZXh0RENCOworCSAgICB9CisJfQorICAgIH0KKyAgICByZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQKK2RjMzkwX0Rpc2Nvbm5lY3QoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IgKQoreworICAgIHN0cnVjdCBkYzM5MF9kY2IgKnBEQ0I7CisgICAgc3RydWN0IGRjMzkwX3NyYiAqcFNSQiwgKnBzcmI7CisgICAgdTggIGksIGNudDsKKworICAgIERFQlVHMChwcmludGsoS0VSTl9JTkZPICJESVNDLCIpKTsKKworICAgIGlmICghcEFDQi0+Q29ubmVjdGVkKSBwcmludGsoS0VSTl9FUlIgIkRDMzkwOiBEaXNjb25uZWN0IG5vdC1jb25uZWN0ZWQgYnVzP1xuIik7CisgICAgcEFDQi0+Q29ubmVjdGVkID0gMDsKKyAgICBwRENCID0gcEFDQi0+cEFjdGl2ZURDQjsKKyAgICBpZiAoIXBEQ0IpCisgICAgIHsKKwlERUJVRzAocHJpbnRrKEtFUk5fRVJSICJBQ0I6JXAtPkFjdGl2ZURDQjolcCBJT1BvcnQ6JTA0eCBJUlE6JTAyeCAhXG4iLFwKKwkgICAgICAgcEFDQiwgcERDQiwgcEFDQi0+SU9Qb3J0QmFzZSwgcEFDQi0+SVJRTGV2ZWwpKTsKKwltZGVsYXkoNDAwKTsKKwlEQzM5MF9yZWFkOCAoSU5UX1N0YXR1cyk7CS8qIFJlc2V0IFBlbmRpbmcgSU5UICovCisJREMzOTBfd3JpdGU4IChTY3NpQ21kLCBFTl9TRUxfUkVTRUwpOworCXJldHVybjsKKyAgICAgfQorICAgIERDMzkwX3dyaXRlOCAoU2NzaUNtZCwgRU5fU0VMX1JFU0VMKTsKKyAgICBwU1JCID0gcERDQi0+cEFjdGl2ZVNSQjsKKyAgICBwQUNCLT5wQWN0aXZlRENCID0gTlVMTDsKKyAgICBwU1JCLT5TY3NpUGhhc2UgPSBTQ1NJX05PUDA7CisgICAgaWYoIHBTUkItPlNSQlN0YXRlICYgU1JCX1VORVhQRUNUX1JFU0VMICkKKwlwU1JCLT5TUkJTdGF0ZSA9IDA7CisgICAgZWxzZSBpZiggcFNSQi0+U1JCU3RhdGUgJiBTUkJfQUJPUlRfU0VOVCApCisgICAgeworCXBEQ0ItPlRhZ01hc2sgPSAwOworCXBEQ0ItPkRDQkZsYWcgPSAwOworCWNudCA9IHBEQ0ItPkdvaW5nU1JCQ250OworCXBEQ0ItPkdvaW5nU1JCQ250ID0gMDsKKwlwU1JCID0gcERDQi0+cEdvaW5nU1JCOworCWZvciggaT0wOyBpIDwgY250OyBpKyspCisJeworCSAgICBwc3JiID0gcFNSQi0+cE5leHRTUkI7CisJICAgIGRjMzkwX0ZyZWVfaW5zZXJ0IChwQUNCLCBwU1JCKTsKKwkgICAgcFNSQiA9IHBzcmI7CisJfQorCXBEQ0ItPnBHb2luZ1NSQiA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYoIChwU1JCLT5TUkJTdGF0ZSAmIChTUkJfU1RBUlRfK1NSQl9NU0dPVVQpKSB8fAorCSAgICEocFNSQi0+U1JCU3RhdGUgJiAoU1JCX0RJU0NPTk5FQ1QrU1JCX0NPTVBMRVRFRCkpICkKKwl7CS8qIFNlbGVjdGlvbiB0aW1lIG91dCAqLworCQlwU1JCLT5UYXJnZXRTdGF0dXMgPSBTQ1NJX1NUQVRfU0VMX1RJTUVPVVQ7CisJCWdvdG8gIGRpc2MxOworCX0KKwllbHNlIGlmICghKHBTUkItPlNSQlN0YXRlICYgU1JCX0RJU0NPTk5FQ1QpICYmIChwU1JCLT5TUkJTdGF0ZSAmIFNSQl9DT01QTEVURUQpKQorCXsKK2Rpc2MxOgorCSAgICBkYzM5MF9mcmVldGFnIChwRENCLCBwU1JCKTsKKwkgICAgcERDQi0+cEFjdGl2ZVNSQiA9IE5VTEw7CisJICAgIHBTUkItPlNSQlN0YXRlID0gU1JCX0ZSRUU7CisJICAgIGRjMzkwX1NSQmRvbmUoIHBBQ0IsIHBEQ0IsIHBTUkIpOworCX0KKyAgICB9CisgICAgcEFDQi0+TXNnTGVuID0gMDsKK30KKworCitzdGF0aWMgdm9pZAorZGMzOTBfUmVzZWxlY3QoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IgKQoreworICAgIHN0cnVjdCBkYzM5MF9kY2IqICAgcERDQjsKKyAgICBzdHJ1Y3QgZGMzOTBfc3JiKiAgIHBTUkI7CisgICAgdTggIGlkLCBsdW47CisKKyAgICBERUJVRzAocHJpbnRrKEtFUk5fSU5GTyAiUlNFTCwiKSk7CisgICAgcEFDQi0+Q29ubmVjdGVkID0gMTsKKyAgICBwRENCID0gcEFDQi0+cEFjdGl2ZURDQjsKKyAgICBpZiggcERDQiApCisgICAgewkvKiBBcmJpdHJhdGlvbiBsb3N0IGJ1dCBSZXNlbGVjdGlvbiB3b24gKi8KKwlERUJVRzAocHJpbnRrICgiREMzOTA6IChBY3RpdmVEQ0IgIT0gMDogQXJiLiBsb3N0IGJ1dCByZXNlbC4gd29uKSFcbiIpKTsKKwlwU1JCID0gcERDQi0+cEFjdGl2ZVNSQjsKKwlpZiggISggcEFDQi0+c2Nhbl9kZXZpY2VzICkgKQorCXsKKwkgICAgc3RydWN0IHNjc2lfY21uZCAqcGNtZCA9IHBTUkItPnBjbWQ7CisJICAgIHBjbWQtPnJlc2lkID0gcGNtZC0+cmVxdWVzdF9idWZmbGVuOworCSAgICBTRVRfUkVTX0RJRChwY21kLT5yZXN1bHQsIERJRF9TT0ZUX0VSUk9SKTsKKwkgICAgZGMzOTBfR29pbmdfcmVtb3ZlKHBEQ0IsIHBTUkIpOworCSAgICBkYzM5MF9GcmVlX2luc2VydChwQUNCLCBwU1JCKTsKKwkgICAgcGNtZC0+c2NzaV9kb25lIChwY21kKTsKKwkgICAgREVCVUcwKHByaW50ayhLRVJOX0RFQlVHIkRDMzkwOiBSZXR1cm4gU1JCICVwIHRvIGZyZWVcbiIsIHBTUkIpKTsKKwl9CisgICAgfQorICAgIC8qIEdldCBJRCAqLworICAgIGx1biA9IERDMzkwX3JlYWQ4IChTY3NpRmlmbyk7CisgICAgREVCVUcwKHByaW50ayAoIkRldiAlMDJ4LCIsIGx1bikpOworICAgIGlmICghKGx1biAmICgxIDw8IHBBQ0ItPnBTY3NpSG9zdC0+dGhpc19pZCkpKQorICAgICAgcHJpbnRrIChLRVJOX0VSUiAiREMzOTA6IFJlc2VsZWN0aW9uIG11c3Qgc2VsZWN0IGhvc3QgYWRhcHRlcjogJTAyeCFcbiIsIGx1bik7CisgICAgZWxzZQorICAgICAgbHVuIF49IDEgPDwgcEFDQi0+cFNjc2lIb3N0LT50aGlzX2lkOyAvKiBNYXNrIEFkYXB0ZXJJRCAqLworICAgIGlkID0gMDsgd2hpbGUgKGx1biA+Pj0gMSkgaWQrKzsKKyAgICAvKiBHZXQgTFVOICovCisgICAgbHVuID0gREMzOTBfcmVhZDggKFNjc2lGaWZvKTsKKyAgICBpZiAoIShsdW4gJiBJREVOVElGWV9CQVNFKSkgcHJpbnRrIChLRVJOX0VSUiAiREMzOTA6IFJlc2VsOiBFeHBlY3QgaWRlbnRpZnkgbWVzc2FnZSFcbiIpOworICAgIGx1biAmPSA3OworICAgIERFQlVHMChwcmludGsgKCIoJTAyaS0laSksIiwgaWQsIGx1bikpOworICAgIHBEQ0IgPSBkYzM5MF9maW5kRENCIChwQUNCLCBpZCwgbHVuKTsKKyAgICBpZiAoIXBEQ0IpCisgICAgeworCXByaW50ayAoS0VSTl9FUlIgIkRDMzkwOiBSZXNlbGVjdCBmcm9tIG5vbiBleGlzdGluZyBkZXZpY2UgKCUwMmktJWkpXG4iLAorCQkgICAgaWQsIGx1bik7CisJcmV0dXJuOworICAgIH0KKyAgICBwQUNCLT5wQWN0aXZlRENCID0gcERDQjsKKyAgICAvKiBUYWdROiBXZSBleHBlY3QgYSBtZXNzYWdlIHNvb24sIHNvIG5ldmVyIG1pbmQgdGhlIGV4YWN0IFNSQiAqLworICAgIGlmKCBwRENCLT5TeW5jTW9kZSAmIEVOX1RBR19RVUVVRUlORyApCisgICAgeworCXBTUkIgPSBwQUNCLT5wVG1wU1JCOworCXBEQ0ItPnBBY3RpdmVTUkIgPSBwU1JCOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXBTUkIgPSBwRENCLT5wQWN0aXZlU1JCOworCWlmKCAhcFNSQiB8fCAhKHBTUkItPlNSQlN0YXRlICYgU1JCX0RJU0NPTk5FQ1QpICkKKwl7CisJICAgIHBTUkI9IHBBQ0ItPnBUbXBTUkI7CisJICAgIHBTUkItPlNSQlN0YXRlID0gU1JCX1VORVhQRUNUX1JFU0VMOworCSAgICBwcmludGsgKEtFUk5fRVJSICJEQzM5MDogUmVzZWxlY3Qgd2l0aG91dCBvdXRzdGFuZGluZyBjbW5kICglMDJpLSVpKVxuIiwKKwkJICAgIGlkLCBsdW4pOworCSAgICBwRENCLT5wQWN0aXZlU1JCID0gcFNSQjsKKwkgICAgZGMzOTBfRW5hYmxlTXNnT3V0X0Fib3J0ICggcEFDQiwgcFNSQiApOworCX0KKwllbHNlCisJeworCSAgICBpZiggcERDQi0+RENCRmxhZyAmIEFCT1JUX0RFVl8gKQorCSAgICB7CisJCXBTUkItPlNSQlN0YXRlID0gU1JCX0FCT1JUX1NFTlQ7CisJCXByaW50ayAoS0VSTl9JTkZPICJEQzM5MDogUmVzZWxlY3Q6IEFib3J0ICglMDJpLSVpKVxuIiwKKwkJCWlkLCBsdW4pOworCQlkYzM5MF9FbmFibGVNc2dPdXRfQWJvcnQoIHBBQ0IsIHBTUkIgKTsKKwkgICAgfQorCSAgICBlbHNlCisJCXBTUkItPlNSQlN0YXRlID0gU1JCX0RBVEFfWEZFUjsKKwl9CisgICAgfQorCisgICAgREVCVUcxKHByaW50ayAoS0VSTl9ERUJVRyAiUmVzZWwgU1JCKCVwKTogVGFnTnVtICglMDJ4KVxuIiwgcFNSQiwgcFNSQi0+VGFnTnVtYmVyKSk7CisgICAgcFNSQi0+U2NzaVBoYXNlID0gU0NTSV9OT1AwOworICAgIERDMzkwX3dyaXRlOCAoU2NzaV9EZXN0X0lELCBwRENCLT5UYXJnZXRJRCk7CisgICAgREMzOTBfd3JpdGU4IChTeW5jX1BlcmlvZCwgcERDQi0+U3luY1BlcmlvZCk7CisgICAgREMzOTBfd3JpdGU4IChTeW5jX09mZnNldCwgcERDQi0+U3luY09mZnNldCk7CisgICAgREMzOTBfd3JpdGU4IChDdHJsUmVnMSwgcERDQi0+Q3RybFIxKTsKKyAgICBEQzM5MF93cml0ZTggKEN0cmxSZWczLCBwRENCLT5DdHJsUjMpOworICAgIERDMzkwX3dyaXRlOCAoQ3RybFJlZzQsIHBEQ0ItPkN0cmxSNCk7CS8qIDsgR2xpdGNoIGVhdGVyICovCisgICAgREMzOTBfd3JpdGU4IChTY3NpQ21kLCBNU0dfQUNDRVBURURfQ01EKTsJLyogO3RvIHJlbGVhc2UgdGhlIC9BQ0sgc2lnbmFsICovCit9CisKK3N0YXRpYyBpbnQgX19pbmxpbmVfXworZGMzOTBfUmVxdWVzdFNlbnNlKHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9kY2IqIHBEQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIpCit7CisJc3RydWN0IHNjc2lfY21uZCAqcGNtZDsKKworCXBjbWQgPSBwU1JCLT5wY21kOworCisJUkVNT1ZBQkxFREVCVUcocHJpbnRrKEtFUk5fSU5GTyAiREMzOTA6IFJlcXVlc3RTZW5zZShDbWQgJTAyeCwgSWQgJTAyeCwgTFVOICUwMngpXG4iLFwKKwkJCSAgICAgIHBjbWQtPmNtbmRbMF0sIHBEQ0ItPlRhcmdldElELCBwRENCLT5UYXJnZXRMVU4pKTsKKworCXBTUkItPlNSQkZsYWcgfD0gQVVUT19SRVFTRU5TRTsKKwlwU1JCLT5TYXZlZFNHQ291bnQgPSBwY21kLT51c2Vfc2c7CisJcFNSQi0+U2F2ZWRUb3RYTGVuID0gcFNSQi0+VG90YWxYZmVycmVkTGVuOworCXBTUkItPkFkYXB0U3RhdHVzID0gMDsKKwlwU1JCLT5UYXJnZXRTdGF0dXMgPSAwOyAvKiBDSEVDS19DT05ESVRJT048PDE7ICovCisKKwkvKiBXZSBhcmUgY2FsbGVkIGZyb20gU1JCZG9uZSwgb3JpZ2luYWwgUENJIG1hcHBpbmcgaGFzIGJlZW4gcmVtb3ZlZAorCSAqIGFscmVhZHksIG5ldyBvbmUgaXMgc2V0IHVwIGZyb20gU3RhcnRTQ1NJICovCisJcFNSQi0+U0dJbmRleCA9IDA7CisKKwlwU1JCLT5Ub3RhbFhmZXJyZWRMZW4gPSAwOworCXBTUkItPlNHVG9CZVhmZXJMZW4gPSAwOworCXJldHVybiBkYzM5MF9TdGFydFNDU0kocEFDQiwgcERDQiwgcFNSQik7Cit9CisKKworc3RhdGljIHZvaWQKK2RjMzkwX1NSQmRvbmUoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9kY2IqIHBEQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIgKQoreworICAgIHU4IHN0YXR1czsKKyAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpwY21kOworCisgICAgcGNtZCA9IHBTUkItPnBjbWQ7CisgICAgLyogS0c6IE1vdmVkIHBjaV91bm1hcCBoZXJlICovCisgICAgZGMzOTBfcGNpX3VubWFwKHBTUkIpOworCisgICAgc3RhdHVzID0gcFNSQi0+VGFyZ2V0U3RhdHVzOworCisgICAgREVCVUcwKHByaW50ayAoIiBTUkJkb25lICglMDJ4LCUwOHgpLCBTUkIgJXAsIHBpZCAlbGlcbiIsIHN0YXR1cywgcGNtZC0+cmVzdWx0LFwKKwkJcFNSQiwgcGNtZC0+cGlkKSk7CisgICAgaWYocFNSQi0+U1JCRmxhZyAmIEFVVE9fUkVRU0VOU0UpCisgICAgewkvKiBMYXN0IGNvbW1hbmQgd2FzIGEgUmVxdWVzdCBTZW5zZSAqLworCXBTUkItPlNSQkZsYWcgJj0gfkFVVE9fUkVRU0VOU0U7CisJcFNSQi0+QWRhcHRTdGF0dXMgPSAwOworCXBTUkItPlRhcmdldFN0YXR1cyA9IENIRUNLX0NPTkRJVElPTiA8PCAxOworCisJLy9wY21kLT5yZXN1bHQgPSBNS19SRVMoRFJJVkVSX1NFTlNFLERJRF9PSywwLHN0YXR1cyk7CisJaWYgKHN0YXR1cyA9PSAoQ0hFQ0tfQ09ORElUSU9OIDw8IDEpKQorCSAgICBwY21kLT5yZXN1bHQgPSBNS19SRVNfTE5YKDAsIERJRF9CQURfVEFSR0VULCAwLCAvKkNIRUNLX0NPTkRJVElPTiovMCk7CisJZWxzZSAvKiBSZXRyeSAqLworCXsKKwkgICAgaWYoIHBTUkItPnBjbWQtPmNtbmRbMF0gPT0gVEVTVF9VTklUX1JFQURZIC8qIHx8IHBTUkItPnBjbWQtPmNtbmRbMF0gPT0gU1RBUlRfU1RPUCAqLykKKwkgICAgeworCQkvKiBEb24ndCByZXRyeSBvbiBURVNUX1VOSVRfUkVBRFkgKi8KKwkJcGNtZC0+cmVzdWx0ID0gTUtfUkVTX0xOWChEUklWRVJfU0VOU0UsRElEX09LLDAsQ0hFQ0tfQ09ORElUSU9OKTsKKwkJUkVNT1ZBQkxFREVCVUcocHJpbnRrKEtFUk5fSU5GTyAiQ21kPSUwMngsIFJlc3VsdD0lMDh4LCBYZmVyTD0lMDh4XG4iLHBTUkItPnBjbWQtPmNtbmRbMF0sXAorCQkgICAgICAgKHUzMikgcGNtZC0+cmVzdWx0LCAodTMyKSBwU1JCLT5Ub3RhbFhmZXJyZWRMZW4pKTsKKwkgICAgfSBlbHNlIHsKKwkJU0VUX1JFU19EUlYocGNtZC0+cmVzdWx0LCBEUklWRVJfU0VOU0UpOworCQlwY21kLT51c2Vfc2cgPSBwU1JCLT5TYXZlZFNHQ291bnQ7CisJCS8vcFNSQi0+U2NzaUNtZExlbgkgPSAodTgpIChwU1JCLT5TZWdtZW50MVswXSA+PiA4KTsKKwkJREVCVUcwIChwcmludGsgKCJEQzM5MDogUkVUUlkgcGlkICVsaSAoJTAyeCksIHRhcmdldCAlMDJpLSUwMmlcbiIsIHBjbWQtPnBpZCwgcGNtZC0+Y21uZFswXSwgcGNtZC0+ZGV2aWNlLT5pZCwgcGNtZC0+ZGV2aWNlLT5sdW4pKTsKKwkJcFNSQi0+VG90YWxYZmVycmVkTGVuID0gMDsKKwkJU0VUX1JFU19ESUQocGNtZC0+cmVzdWx0LCBESURfU09GVF9FUlJPUik7CisJICAgIH0KKwl9CisJZ290byBjbWRfZG9uZTsKKyAgICB9CisgICAgaWYoIHN0YXR1cyApCisgICAgeworCWlmKCBzdGF0dXNfYnl0ZShzdGF0dXMpID09IENIRUNLX0NPTkRJVElPTiApCisJeworCSAgICBpZiAoZGMzOTBfUmVxdWVzdFNlbnNlKHBBQ0IsIHBEQ0IsIHBTUkIpKSB7CisJCVNFVF9SRVNfRElEKHBjbWQtPnJlc3VsdCwgRElEX0VSUk9SKTsKKwkJZ290byBjbWRfZG9uZTsKKwkgICAgfQorCSAgICByZXR1cm47CisJfQorCWVsc2UgaWYoIHN0YXR1c19ieXRlKHN0YXR1cykgPT0gUVVFVUVfRlVMTCApCisJeworCSAgICBzY3NpX3RyYWNrX3F1ZXVlX2Z1bGwocGNtZC0+ZGV2aWNlLCBwRENCLT5Hb2luZ1NSQkNudCAtIDEpOworCSAgICBwY21kLT51c2Vfc2cgPSBwU1JCLT5TYXZlZFNHQ291bnQ7CisJICAgIERFQlVHMCAocHJpbnRrICgiREMzOTA6IFJFVFJZIHBpZCAlbGkgKCUwMngpLCB0YXJnZXQgJTAyaS0lMDJpXG4iLCBwY21kLT5waWQsIHBjbWQtPmNtbmRbMF0sIHBjbWQtPmRldmljZS0+aWQsIHBjbWQtPmRldmljZS0+bHVuKSk7CisJICAgIHBTUkItPlRvdGFsWGZlcnJlZExlbiA9IDA7CisJICAgIFNFVF9SRVNfRElEKHBjbWQtPnJlc3VsdCwgRElEX1NPRlRfRVJST1IpOworCX0KKwllbHNlIGlmKHN0YXR1cyA9PSBTQ1NJX1NUQVRfU0VMX1RJTUVPVVQpCisJeworCSAgICBwU1JCLT5BZGFwdFN0YXR1cyA9IEhfU0VMX1RJTUVPVVQ7CisJICAgIHBTUkItPlRhcmdldFN0YXR1cyA9IDA7CisJICAgIHBjbWQtPnJlc3VsdCA9IE1LX1JFUygwLERJRF9OT19DT05ORUNULDAsMCk7CisJICAgIC8qIERldmljZXMgYXJlIHJlbW92ZWQgYmVsb3cgLi4uICovCisJfQorCWVsc2UgaWYgKHN0YXR1c19ieXRlKHN0YXR1cykgPT0gQlVTWSAmJiAKKwkJIChwY21kLT5jbW5kWzBdID09IFRFU1RfVU5JVF9SRUFEWSB8fCBwY21kLT5jbW5kWzBdID09IElOUVVJUlkpICYmCisJCSBwQUNCLT5zY2FuX2RldmljZXMpCisJeworCSAgICBwU1JCLT5BZGFwdFN0YXR1cyA9IDA7CisJICAgIHBTUkItPlRhcmdldFN0YXR1cyA9IHN0YXR1czsKKwkgICAgcGNtZC0+cmVzdWx0ID0gTUtfUkVTKDAsMCxwU1JCLT5FbmRNZXNzYWdlLC8qc3RhdHVzKi8wKTsKKwl9CisJZWxzZQorCXsgICAvKiBBbm90aGVyIGVycm9yICovCisJICAgIHBTUkItPlRvdGFsWGZlcnJlZExlbiA9IDA7CisJICAgIFNFVF9SRVNfRElEKHBjbWQtPnJlc3VsdCwgRElEX1NPRlRfRVJST1IpOworCSAgICBnb3RvIGNtZF9kb25lOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsJLyogIFRhcmdldCBzdGF0dXMgPT0gMCAqLworCXN0YXR1cyA9IHBTUkItPkFkYXB0U3RhdHVzOworCWlmKHN0YXR1cyAmIEhfT1ZFUl9VTkRFUl9SVU4pCisJeworCSAgICBwU1JCLT5UYXJnZXRTdGF0dXMgPSAwOworCSAgICBTRVRfUkVTX0RJRChwY21kLT5yZXN1bHQsRElEX09LKTsKKwkgICAgU0VUX1JFU19NU0cocGNtZC0+cmVzdWx0LHBTUkItPkVuZE1lc3NhZ2UpOworCX0KKwllbHNlIGlmKCBwU1JCLT5TUkJTdGF0dXMgJiBQQVJJVFlfRVJST1IpCisJeworCSAgICAvL3BjbWQtPnJlc3VsdCA9IE1LX1JFUygwLERJRF9QQVJJVFkscFNSQi0+RW5kTWVzc2FnZSwwKTsKKwkgICAgU0VUX1JFU19ESUQocGNtZC0+cmVzdWx0LERJRF9QQVJJVFkpOworCSAgICBTRVRfUkVTX01TRyhwY21kLT5yZXN1bHQscFNSQi0+RW5kTWVzc2FnZSk7CisJfQorCWVsc2UJCSAgICAgICAvKiBObyBlcnJvciAqLworCXsKKwkgICAgcFNSQi0+QWRhcHRTdGF0dXMgPSAwOworCSAgICBwU1JCLT5UYXJnZXRTdGF0dXMgPSAwOworCSAgICBTRVRfUkVTX0RJRChwY21kLT5yZXN1bHQsRElEX09LKTsKKwl9CisgICAgfQorCitjbWRfZG9uZToKKyAgICBwY21kLT5yZXNpZCA9IHBjbWQtPnJlcXVlc3RfYnVmZmxlbiAtIHBTUkItPlRvdGFsWGZlcnJlZExlbjsKKworICAgIGRjMzkwX0dvaW5nX3JlbW92ZSAocERDQiwgcFNSQik7CisgICAgLyogQWRkIHRvIGZyZWUgbGlzdCAqLworICAgIGRjMzkwX0ZyZWVfaW5zZXJ0IChwQUNCLCBwU1JCKTsKKworICAgIERFQlVHMChwcmludGsgKEtFUk5fREVCVUcgIkRDMzkwOiBTUkJkb25lOiBkb25lIHBpZCAlbGlcbiIsIHBjbWQtPnBpZCkpOworICAgIHBjbWQtPnNjc2lfZG9uZSAocGNtZCk7CisKKyAgICByZXR1cm47Cit9CisKKworLyogUmVtb3ZlIGFsbCBTUkJzIGZyb20gR29pbmcgbGlzdCBhbmQgaW5mb3JtIG1pZGxldmVsICovCitzdGF0aWMgdm9pZAorZGMzOTBfRG9pbmdTUkJfRG9uZShzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisgICAgc3RydWN0IGRjMzkwX2RjYiAqcERDQiwgKnBkY2I7CisgICAgc3RydWN0IGRjMzkwX3NyYiAqcHNyYiwgKnBzcmIyOworICAgIGludCBpOworICAgIHN0cnVjdCBzY3NpX2NtbmQgKnBjbWQ7CisKKyAgICBwRENCID0gcEFDQi0+cExpbmtEQ0I7CisgICAgcGRjYiA9IHBEQ0I7CisgICAgaWYgKCEgcGRjYikgcmV0dXJuOworICAgIGRvCisgICAgeworCXBzcmIgPSBwZGNiLT5wR29pbmdTUkI7CisJZm9yIChpID0gMDsgaSA8IHBkY2ItPkdvaW5nU1JCQ250OyBpKyspCisJeworCSAgICBwc3JiMiA9IHBzcmItPnBOZXh0U1JCOworCSAgICBwY21kID0gcHNyYi0+cGNtZDsKKwkgICAgZGMzOTBfRnJlZV9pbnNlcnQgKHBBQ0IsIHBzcmIpOworCSAgICBwc3JiICA9IHBzcmIyOworCX0KKwlwZGNiLT5Hb2luZ1NSQkNudCA9IDA7CisJcGRjYi0+cEdvaW5nU1JCID0gTlVMTDsKKwlwZGNiLT5UYWdNYXNrID0gMDsKKwlwZGNiID0gcGRjYi0+cE5leHREQ0I7CisgICAgfSB3aGlsZSggcGRjYiAhPSBwRENCICk7Cit9CisKKworc3RhdGljIHZvaWQKK2RjMzkwX1Jlc2V0U0NTSUJ1cyggc3RydWN0IGRjMzkwX2FjYiogcEFDQiApCit7CisgICAgLy9EQzM5MF93cml0ZTggKFNjc2lDbWQsIFJTVF9ERVZJQ0VfQ01EKTsKKyAgICAvL3VkZWxheSAoMjUwKTsKKyAgICAvL0RDMzkwX3dyaXRlOCAoU2NzaUNtZCwgTk9QX0NNRCk7CisKKyAgICBEQzM5MF93cml0ZTggKFNjc2lDbWQsIENMRUFSX0ZJRk9fQ01EKTsKKyAgICBEQzM5MF93cml0ZTggKERNQV9DbWQsIERNQV9JRExFX0NNRCk7CisgICAgREMzOTBfd3JpdGU4IChTY3NpQ21kLCBSU1RfU0NTSV9CVVNfQ01EKTsKKyAgICBwQUNCLT5Db25uZWN0ZWQgPSAwOworCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZGMzOTBfU2NzaVJzdERldGVjdCggc3RydWN0IGRjMzkwX2FjYiogcEFDQiApCit7CisgICAgcHJpbnRrICgiREMzOTA6IFJzdF9EZXRlY3Q6IGxhc3RzdGF0ID0gJTA4eFxuIiwgZGMzOTBfbGFzdHN0YXR1cyk7CisgICAgLy9ERUJVRzAocHJpbnRrKEtFUk5fSU5GTyAiUlNUX0RFVEVDVCwiKSk7CisKKyAgICBEQzM5MF93cml0ZTggKERNQV9DbWQsIERNQV9JRExFX0NNRCk7CisgICAgLyogVW5sb2NrIGJlZm9yZSA/ICovCisgICAgLyogZGVsYXkgaGFsZiBhIHNlY29uZCAqLworICAgIHVkZWxheSAoMTAwMCk7CisgICAgREMzOTBfd3JpdGU4IChTY3NpQ21kLCBDTEVBUl9GSUZPX0NNRCk7CisgICAgcEFDQi0+cFNjc2lIb3N0LT5sYXN0X3Jlc2V0ID0gamlmZmllcyArIDUqSFovMgorCQkgICAgKyBIWiAqIGRjMzkwX2VlcHJvbUJ1ZltwQUNCLT5BZGFwdGVySW5kZXhdW0VFX0RFTEFZXTsKKyAgICBwQUNCLT5Db25uZWN0ZWQgPSAwOworCisgICAgaWYoIHBBQ0ItPkFDQkZsYWcgJiBSRVNFVF9ERVYgKQorCXBBQ0ItPkFDQkZsYWcgfD0gUkVTRVRfRE9ORTsKKyAgICBlbHNlCisgICAgeyAgIC8qIFJlc2V0IHdhcyBpc3N1ZWQgYnkgc2IgZWxzZSAqLworCXBBQ0ItPkFDQkZsYWcgfD0gUkVTRVRfREVURUNUOworCisJZGMzOTBfUmVzZXREZXZQYXJhbSggcEFDQiApOworCWRjMzkwX0RvaW5nU1JCX0RvbmUoIHBBQ0IsIE5VTEwpOworCS8vZGMzOTBfUmVjb3ZlclNSQiggcEFDQiApOworCXBBQ0ItPnBBY3RpdmVEQ0IgPSBOVUxMOworCXBBQ0ItPkFDQkZsYWcgPSAwOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgREMzOTBfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gY21kLT5kZXZpY2U7CisJc3RydWN0IGRjMzkwX2FjYiAqYWNiID0gKHN0cnVjdCBkYzM5MF9hY2IgKilzZGV2LT5ob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgZGMzOTBfZGNiICpkY2IgPSBzZGV2LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgZGMzOTBfc3JiICpzcmI7CisKKwlpZiAoc2Rldi0+cXVldWVfZGVwdGggPD0gZGNiLT5Hb2luZ1NSQkNudCkKKwkJZ290byBkZXZpY2VfYnVzeTsKKwlpZiAoYWNiLT5wQWN0aXZlRENCKQorCQlnb3RvIGhvc3RfYnVzeTsKKwlpZiAoYWNiLT5BQ0JGbGFnICYgKFJFU0VUX0RFVEVDVHxSRVNFVF9ET05FfFJFU0VUX0RFVikpCisJCWdvdG8gaG9zdF9idXN5OworCisJc3JiID0gYWNiLT5wRnJlZVNSQjsKKwlpZiAodW5saWtlbHkoc3JiID09IE5VTEwpKQorCQlnb3RvIGhvc3RfYnVzeTsKKworCWNtZC0+c2NzaV9kb25lID0gZG9uZTsKKwljbWQtPnJlc3VsdCA9IDA7CisJYWNiLT5DbWRzKys7CisKKwlhY2ItPnBGcmVlU1JCID0gc3JiLT5wTmV4dFNSQjsKKwlzcmItPnBOZXh0U1JCID0gTlVMTDsKKworCXNyYi0+cFNSQkRDQiA9IGRjYjsKKwlzcmItPnBjbWQgPSBjbWQ7CisJY21kLT5ob3N0X3NjcmliYmxlID0gKGNoYXIgKilzcmI7CisgICAgCisJc3JiLT5TR0luZGV4ID0gMDsKKwlzcmItPkFkYXB0U3RhdHVzID0gMDsKKwlzcmItPlRhcmdldFN0YXR1cyA9IDA7CisJc3JiLT5Nc2dDbnQgPSAwOworCisJc3JiLT5TUkJTdGF0dXMgPSAwOworCXNyYi0+U1JCRmxhZyA9IDA7CisJc3JiLT5TUkJTdGF0ZSA9IDA7CisJc3JiLT5Ub3RhbFhmZXJyZWRMZW4gPSAwOworCXNyYi0+U0dCdXNBZGRyID0gMDsKKwlzcmItPlNHVG9CZVhmZXJMZW4gPSAwOworCXNyYi0+U2NzaVBoYXNlID0gMDsKKwlzcmItPkVuZE1lc3NhZ2UgPSAwOworCXNyYi0+VGFnTnVtYmVyID0gU0NTSV9OT19UQUc7CisKKwlpZiAoZGMzOTBfU3RhcnRTQ1NJKGFjYiwgZGNiLCBzcmIpKSB7CisJCWRjMzkwX0ZyZWVfaW5zZXJ0KGFjYiwgc3JiKTsKKwkJZ290byBob3N0X2J1c3k7CisJfQorCisJZGMzOTBfR29pbmdfYXBwZW5kKGRjYiwgc3JiKTsKKworCXJldHVybiAwOworCisgaG9zdF9idXN5OgorCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCisgZGV2aWNlX2J1c3k6CisJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKK30KKworc3RhdGljIHZvaWQgZGMzOTBfZHVtcGluZm8gKHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9kY2IqIHBEQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIpCit7CisgICAgc3RydWN0IHBjaV9kZXYgKnBkZXY7CisgICAgdTE2IHBzdGF0OworCisgICAgaWYgKCFwRENCKSBwRENCID0gcEFDQi0+cEFjdGl2ZURDQjsKKyAgICBpZiAoIXBTUkIgJiYgcERDQikgcFNSQiA9IHBEQ0ItPnBBY3RpdmVTUkI7CisKKyAgICBpZiAocFNSQikgCisgICAgeworCXByaW50ayAoIkRDMzkwOiBTUkI6IFhmZXJyZWQgJTA4bHgsIFJlbWFpbiAlMDhseCwgU3RhdGUgJTA4eCwgUGhhc2UgJTAyeFxuIiwKKwkJcFNSQi0+VG90YWxYZmVycmVkTGVuLCBwU1JCLT5TR1RvQmVYZmVyTGVuLCBwU1JCLT5TUkJTdGF0ZSwKKwkJcFNSQi0+U2NzaVBoYXNlKTsKKwlwcmludGsgKCJEQzM5MDogQWRwYXRlclN0YXR1czogJTAyeCwgU1JCIFN0YXR1cyAlMDJ4XG4iLCBwU1JCLT5BZGFwdFN0YXR1cywgcFNSQi0+U1JCU3RhdHVzKTsKKyAgICB9CisgICAgcHJpbnRrICgiREMzOTA6IFN0YXR1cyBvZiBsYXN0IElSUSAoRE1BL1NDL0ludC9JUlEpOiAlMDh4XG4iLCBkYzM5MF9sYXN0c3RhdHVzKTsKKyAgICBwcmludGsgKCJEQzM5MDogUmVnaXN0ZXIgZHVtcDogU0NTSSBibG9jazpcbiIpOworICAgIHByaW50ayAoIkRDMzkwOiBYZmVyQ250ICBDbWQgU3RhdCBJbnRTIElSUVMgRkZJUyBDdGwxIEN0bDIgQ3RsMyBDdGw0XG4iKTsKKyAgICBwcmludGsgKCJEQzM5MDogICUwNnggICAlMDJ4ICAgJTAyeCAgICUwMngiLAorCSAgICBEQzM5MF9yZWFkOChDdGNSZWdfTG93KSArIChEQzM5MF9yZWFkOChDdGNSZWdfTWlkKSA8PCA4KSArIChEQzM5MF9yZWFkOChDdGNSZWdfSGlnaCkgPDwgMTYpLAorCSAgICBEQzM5MF9yZWFkOChTY3NpQ21kKSwgREMzOTBfcmVhZDgoU2NzaV9TdGF0dXMpLCBEQzM5MF9yZWFkOChJbnRlcm5fU3RhdGUpKTsKKyAgICBwcmludGsgKCIgICAlMDJ4ICAgJTAyeCAgICUwMnggICAlMDJ4ICAgJTAyeCAgICUwMnhcbiIsCisJICAgIERDMzkwX3JlYWQ4KElOVF9TdGF0dXMpLCBEQzM5MF9yZWFkOChDdXJyZW50X0ZpZm8pLCBEQzM5MF9yZWFkOChDdHJsUmVnMSksCisJICAgIERDMzkwX3JlYWQ4KEN0cmxSZWcyKSwgREMzOTBfcmVhZDgoQ3RybFJlZzMpLCBEQzM5MF9yZWFkOChDdHJsUmVnNCkpOworICAgIERDMzkwX3dyaXRlMzIgKERNQV9TY3NpQnVzQ3RybCwgV1JUX0VSQVNFX0RNQV9TVEFUIHwgRU5fSU5UX09OX1BDSV9BQk9SVCk7CisgICAgaWYgKERDMzkwX3JlYWQ4KEN1cnJlbnRfRmlmbykgJiAweDFmKQorICAgICAgeworCXByaW50ayAoIkRDMzkwOiBGSUZPOiIpOworCXdoaWxlIChEQzM5MF9yZWFkOChDdXJyZW50X0ZpZm8pICYgMHgxZikgcHJpbnRrICgiICUwMngiLCBEQzM5MF9yZWFkOChTY3NpRmlmbykpOworCXByaW50ayAoIlxuIik7CisgICAgICB9CisgICAgcHJpbnRrICgiREMzOTA6IFJlZ2lzdGVyIGR1bXA6IERNQSBlbmdpbmU6XG4iKTsKKyAgICBwcmludGsgKCJEQzM5MDogQ21kICAgU1RyQ250ICAgIFNCdXNBICAgIFdya0JDICAgIFdya0FDIFN0YXQgU0J1c0N0cmxcbiIpOworICAgIHByaW50ayAoIkRDMzkwOiAgJTAyeCAlMDh4ICUwOHggJTA4eCAlMDh4ICAgJTAyeCAlMDh4XG4iLAorCSAgICBEQzM5MF9yZWFkOChETUFfQ21kKSwgREMzOTBfcmVhZDMyKERNQV9YZmVyQ250KSwgREMzOTBfcmVhZDMyKERNQV9YZmVyQWRkciksCisJICAgIERDMzkwX3JlYWQzMihETUFfV2tfQnl0ZUNudHIpLCBEQzM5MF9yZWFkMzIoRE1BX1drX0FkZHJDbnRyKSwKKwkgICAgREMzOTBfcmVhZDgoRE1BX1N0YXR1cyksIERDMzkwX3JlYWQzMihETUFfU2NzaUJ1c0N0cmwpKTsKKyAgICBEQzM5MF93cml0ZTMyIChETUFfU2NzaUJ1c0N0cmwsIEVOX0lOVF9PTl9QQ0lfQUJPUlQpOworCisgICAgcGRldiA9IHBBQ0ItPnBkZXY7CisgICAgcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX1NUQVRVUywgJnBzdGF0KTsKKyAgICBwcmludGsgKCJEQzM5MDogUmVnaXN0ZXIgZHVtcDogUENJIFN0YXR1czogJTA0eFxuIiwgcHN0YXQpOworICAgIHByaW50ayAoIkRDMzkwOiBJbiBjYXNlIG9mIGRyaXZlciB0cm91YmxlIHJlYWQgRG9jdW1lbnRhdGlvbi9zY3NpL3Rtc2NzaW0udHh0XG4iKTsKK30KKworCitzdGF0aWMgaW50IERDMzkwX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgZGMzOTBfYWNiICpwQUNCID0gKHN0cnVjdCBkYzM5MF9hY2IqKSBjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IGRjMzkwX2RjYiAqcERDQiA9IChzdHJ1Y3QgZGMzOTBfZGNiKikgY21kLT5kZXZpY2UtPmhvc3RkYXRhOworCisJcHJpbnRrKCJEQzM5MDogQWJvcnQgY29tbWFuZCAocGlkICVsaSwgRGV2aWNlICUwMmktJTAyaSlcbiIsCisJICAgICAgIGNtZC0+cGlkLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCisJLyogYWJvcnQoKSBpcyB0b28gc3R1cGlkIGZvciBhbHJlYWR5IHNlbnQgY29tbWFuZHMgYXQgdGhlIG1vbWVudC4gCisJICogSWYgaXQncyBjYWxsZWQgd2UgYXJlIGluIHRyb3VibGUgYW55d2F5LCBzbyBsZXQncyBkdW1wIHNvbWUgaW5mbyAKKwkgKiBpbnRvIHRoZSBzeXNsb2cgYXQgbGVhc3QuIChLRywgOTgvMDgvMjAsOTkvMDYvMjApICovCisJZGMzOTBfZHVtcGluZm8ocEFDQiwgcERDQiwgTlVMTCk7CisKKwlwRENCLT5EQ0JGbGFnIHw9IEFCT1JUX0RFVl87CisJcHJpbnRrKEtFUk5fSU5GTyAiREMzOTA6IEFib3J0ZWQgcGlkICVsaVxuIiwgY21kLT5waWQpOworCisJcmV0dXJuIEZBSUxFRDsKK30KKworCitzdGF0aWMgdm9pZCBkYzM5MF9SZXNldERldlBhcmFtKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCICkKK3sKKyAgICBzdHJ1Y3QgZGMzOTBfZGNiICpwRENCLCAqcGRjYjsKKworICAgIHBEQ0IgPSBwQUNCLT5wTGlua0RDQjsKKyAgICBpZiAoISBwRENCKSByZXR1cm47CisgICAgcGRjYiA9IHBEQ0I7CisgICAgZG8KKyAgICB7CisJcERDQi0+U3luY01vZGUgJj0gflNZTkNfTkVHT19ET05FOworCXBEQ0ItPlN5bmNQZXJpb2QgPSAwOworCXBEQ0ItPlN5bmNPZmZzZXQgPSAwOworCXBEQ0ItPlRhZ01hc2sgPSAwOworCXBEQ0ItPkN0cmxSMyA9IEZBU1RfQ0xLOworCXBEQ0ItPkN0cmxSNCAmPSBORUdBVEVfUkVRQUNLREFUQSB8IENUUkw0X1JFU0VSVkVEIHwgTkVHQVRFX1JFUUFDSzsKKwlwRENCLT5DdHJsUjQgfD0gcEFDQi0+Z2xpdGNoX2NmZzsKKwlwRENCID0gcERDQi0+cE5leHREQ0I7CisgICAgfQorICAgIHdoaWxlKCBwZGNiICE9IHBEQ0IgKTsKKyAgICBwQUNCLT5BQ0JGbGFnICY9IH4oUkVTRVRfREVWIHwgUkVTRVRfRE9ORSB8IFJFU0VUX0RFVEVDVCk7CisKK30KKworc3RhdGljIGludCBEQzM5MF9idXNfcmVzZXQgKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgZGMzOTBfYWNiKiAgICBwQUNCID0gKHN0cnVjdCBkYzM5MF9hY2IqKSBjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJdTggICBidmFsOworCisJYnZhbCA9IERDMzkwX3JlYWQ4KEN0cmxSZWcxKSB8IERJU19JTlRfT05fU0NTSV9SU1Q7CisJREMzOTBfd3JpdGU4KEN0cmxSZWcxLCBidmFsKTsJLyogZGlzYWJsZSBJUlEgb24gYnVzIHJlc2V0ICovCisKKwlwQUNCLT5BQ0JGbGFnIHw9IFJFU0VUX0RFVjsKKwlkYzM5MF9SZXNldFNDU0lCdXMocEFDQik7CisKKwlkYzM5MF9SZXNldERldlBhcmFtKHBBQ0IpOworCXVkZWxheSgxMDAwKTsKKwlwQUNCLT5wU2NzaUhvc3QtPmxhc3RfcmVzZXQgPSBqaWZmaWVzICsgMypIWi8yIAorCQkrIEhaICogZGMzOTBfZWVwcm9tQnVmW3BBQ0ItPkFkYXB0ZXJJbmRleF1bRUVfREVMQVldOworICAgIAorCURDMzkwX3dyaXRlOChTY3NpQ21kLCBDTEVBUl9GSUZPX0NNRCk7CisJREMzOTBfcmVhZDgoSU5UX1N0YXR1cyk7CQkvKiBSZXNldCBQZW5kaW5nIElOVCAqLworCisJZGMzOTBfRG9pbmdTUkJfRG9uZShwQUNCLCBjbWQpOworCisJcEFDQi0+cEFjdGl2ZURDQiA9IE5VTEw7CisJcEFDQi0+QUNCRmxhZyA9IDA7CisKKwlidmFsID0gREMzOTBfcmVhZDgoQ3RybFJlZzEpICYgfkRJU19JTlRfT05fU0NTSV9SU1Q7CisJREMzOTBfd3JpdGU4KEN0cmxSZWcxLCBidmFsKTsJLyogcmUtZW5hYmxlIGludGVycnVwdCAqLworCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICogZGMzOTBfc2xhdmVfYWxsb2MgLSBDYWxsZWQgYnkgdGhlIHNjc2kgbWlkIGxheWVyIHRvIHRlbGwgdXMgYWJvdXQgYSBuZXcKKyAqIHNjc2kgZGV2aWNlIHRoYXQgd2UgbmVlZCB0byBkZWFsIHdpdGguCisgKgorICogQHNjc2lfZGV2aWNlOiBUaGUgbmV3IHNjc2kgZGV2aWNlIHRoYXQgd2UgbmVlZCB0byBoYW5kbGUuCisgKi8KK3N0YXRpYyBpbnQgZGMzOTBfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2RldmljZSkKK3sKKwlzdHJ1Y3QgZGMzOTBfYWNiICpwQUNCID0gKHN0cnVjdCBkYzM5MF9hY2IqKSBzY3NpX2RldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IGRjMzkwX2RjYiAqcERDQiwgKnBEQ0IyID0gTlVMTDsKKwl1aW50IGlkID0gc2NzaV9kZXZpY2UtPmlkOworCXVpbnQgbHVuID0gc2NzaV9kZXZpY2UtPmx1bjsKKworCXBEQ0IgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGMzOTBfZGNiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwRENCKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQocERDQiwgMCwgc2l6ZW9mKHN0cnVjdCBkYzM5MF9kY2IpKTsKKworCWlmICghcEFDQi0+RENCQ250KyspIHsKKwkJcEFDQi0+cExpbmtEQ0IgPSBwRENCOworCQlwQUNCLT5wRENCUnVuUm9iaW4gPSBwRENCOworCX0gZWxzZSB7CisJCXBBQ0ItPnBMYXN0RENCLT5wTmV4dERDQiA9IHBEQ0I7CisJfQorICAgCisJcERDQi0+cE5leHREQ0IgPSBwQUNCLT5wTGlua0RDQjsKKwlwQUNCLT5wTGFzdERDQiA9IHBEQ0I7CisKKwlwRENCLT5wRENCQUNCID0gcEFDQjsKKwlwRENCLT5UYXJnZXRJRCA9IGlkOworCXBEQ0ItPlRhcmdldExVTiA9IGx1bjsKKworCS8qCisJICogU29tZSB2YWx1ZXMgYXJlIGZvciBhbGwgTFVOczogQ29weSB0aGVtIAorCSAqIEluIGEgY2xlYW4gd2F5OiBXZSB3b3VsZCBoYXZlIGFuIG93biBzdHJ1Y3R1cmUgZm9yIGEgU0NTSS1JRCAKKwkgKi8KKwlpZiAobHVuICYmIChwRENCMiA9IGRjMzkwX2ZpbmREQ0IocEFDQiwgaWQsIDApKSkgeworCQlwRENCLT5EZXZNb2RlID0gcERDQjItPkRldk1vZGU7CisJCXBEQ0ItPlN5bmNNb2RlID0gcERDQjItPlN5bmNNb2RlICYgU1lOQ19ORUdPX0RPTkU7CisJCXBEQ0ItPlN5bmNQZXJpb2QgPSBwRENCMi0+U3luY1BlcmlvZDsKKwkJcERDQi0+U3luY09mZnNldCA9IHBEQ0IyLT5TeW5jT2Zmc2V0OworCQlwRENCLT5OZWdvUGVyaW9kID0gcERDQjItPk5lZ29QZXJpb2Q7CisgICAgICAKKwkJcERDQi0+Q3RybFIzID0gcERDQjItPkN0cmxSMzsKKwkJcERDQi0+Q3RybFI0ID0gcERDQjItPkN0cmxSNDsKKwl9IGVsc2UgeworCQl1OCBpbmRleCA9IHBBQ0ItPkFkYXB0ZXJJbmRleDsKKwkJUEVFcHJvbSBwcm9tID0gKFBFRXByb20pICZkYzM5MF9lZXByb21CdWZbaW5kZXhdW2lkIDw8IDJdOworCisJCXBEQ0ItPkRldk1vZGUgPSBwcm9tLT5FRV9NT0RFMTsKKwkJcERDQi0+TmVnb1BlcmlvZCA9CisJCQkoZGMzOTBfY2xvY2tfcGVyaW9kMVtwcm9tLT5FRV9TUEVFRF0gKiAyNSkgPj4gMjsKKwkJcERDQi0+Q3RybFIzID0gRkFTVF9DTEs7CisJCXBEQ0ItPkN0cmxSNCA9IHBBQ0ItPmdsaXRjaF9jZmcgfCBDVFJMNF9SRVNFUlZFRDsKKwkJaWYgKGRjMzkwX2VlcHJvbUJ1ZltpbmRleF1bRUVfTU9ERTJdICYgQUNUSVZFX05FR0FUSU9OKQorCQkJcERDQi0+Q3RybFI0IHw9IE5FR0FURV9SRVFBQ0tEQVRBIHwgTkVHQVRFX1JFUUFDSzsKKwl9CisKKwlpZiAocERDQi0+RGV2TW9kZSAmIFNZTkNfTkVHT18pCisJCXBEQ0ItPlN5bmNNb2RlIHw9IFNZTkNfRU5BQkxFOworCWVsc2UgeworCQlwRENCLT5TeW5jTW9kZSA9IDA7CisJCXBEQ0ItPlN5bmNPZmZzZXQgJj0gfjB4MGY7CisJfQorCisJcERDQi0+Q3RybFIxID0gcEFDQi0+cFNjc2lIb3N0LT50aGlzX2lkOworCWlmIChwRENCLT5EZXZNb2RlICYgUEFSSVRZX0NIS18pCisJCXBEQ0ItPkN0cmxSMSB8PSBQQVJJVFlfRVJSX1JFUE87CisKKwlwQUNCLT5zY2FuX2RldmljZXMgPSAxOworCXNjc2lfZGV2aWNlLT5ob3N0ZGF0YSA9IHBEQ0I7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZGMzOTBfc2xhdmVfZGVzdHJveSAtIENhbGxlZCBieSB0aGUgc2NzaSBtaWQgbGF5ZXIgdG8gdGVsbCB1cyBhYm91dCBhCisgKiBkZXZpY2UgdGhhdCBpcyBnb2luZyBhd2F5LgorICoKKyAqIEBzY3NpX2RldmljZTogVGhlIHNjc2kgZGV2aWNlIHRoYXQgd2UgbmVlZCB0byByZW1vdmUuCisgKi8KK3N0YXRpYyB2b2lkIGRjMzkwX3NsYXZlX2Rlc3Ryb3koc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2RldmljZSkKK3sKKwlzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCID0gKHN0cnVjdCBkYzM5MF9hY2IqKSBzY3NpX2RldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IGRjMzkwX2RjYiogcERDQiA9IChzdHJ1Y3QgZGMzOTBfZGNiKikgc2NzaV9kZXZpY2UtPmhvc3RkYXRhOworCXN0cnVjdCBkYzM5MF9kY2IqIHBQcmV2RENCID0gcEFDQi0+cExpbmtEQ0I7CisKKwlwQUNCLT5zY2FuX2RldmljZXMgPSAwOworCisJQlVHX09OKHBEQ0ItPkdvaW5nU1JCQ250ID4gMSk7CisJCisJaWYgKHBEQ0IgPT0gcEFDQi0+cExpbmtEQ0IpIHsKKwkJaWYgKHBBQ0ItPnBMYXN0RENCID09IHBEQ0IpIHsKKwkJCXBEQ0ItPnBOZXh0RENCID0gTlVMTDsKKwkJCXBBQ0ItPnBMYXN0RENCID0gTlVMTDsKKwkJfQorCQlwQUNCLT5wTGlua0RDQiA9IHBEQ0ItPnBOZXh0RENCOworCX0gZWxzZSB7CisJCXdoaWxlIChwUHJldkRDQi0+cE5leHREQ0IgIT0gcERDQikKKwkJCXBQcmV2RENCID0gcFByZXZEQ0ItPnBOZXh0RENCOworCQlwUHJldkRDQi0+cE5leHREQ0IgPSBwRENCLT5wTmV4dERDQjsKKwkJaWYgKHBEQ0IgPT0gcEFDQi0+cExhc3REQ0IpCisJCQlwQUNCLT5wTGFzdERDQiA9IHBQcmV2RENCOworCX0KKworCWlmIChwRENCID09IHBBQ0ItPnBBY3RpdmVEQ0IpCisJCXBBQ0ItPnBBY3RpdmVEQ0IgPSBOVUxMOworCWlmIChwRENCID09IHBBQ0ItPnBMaW5rRENCKQorCQlwQUNCLT5wTGlua0RDQiA9IHBEQ0ItPnBOZXh0RENCOworCWlmIChwRENCID09IHBBQ0ItPnBEQ0JSdW5Sb2JpbikKKwkJcEFDQi0+cERDQlJ1blJvYmluID0gcERDQi0+cE5leHREQ0I7CisJa2ZyZWUocERDQik7IAorCQorCXBBQ0ItPkRDQkNudC0tOworfQorCitzdGF0aWMgaW50IGRjMzkwX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0IGRjMzkwX2FjYiAqYWNiID0gKHN0cnVjdCBkYzM5MF9hY2IgKilzZGV2LT5ob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgZGMzOTBfZGNiICpkY2IgPSAoc3RydWN0IGRjMzkwX2RjYiAqKXNkZXYtPmhvc3RkYXRhOworCisJYWNiLT5zY2FuX2RldmljZXMgPSAwOworCWlmIChzZGV2LT50YWdnZWRfc3VwcG9ydGVkICYmIChkY2ItPkRldk1vZGUgJiBUQUdfUVVFVUVJTkdfKSkgeworCQlkY2ItPlN5bmNNb2RlIHw9IEVOX1RBR19RVUVVRUlORzsKKwkJc2NzaV9hY3RpdmF0ZV90Y3Eoc2RldiwgYWNiLT5UYWdNYXhOdW0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLnByb2NfbmFtZQkJPSAidG1zY3NpbSIsIAorCS5uYW1lCQkJPSBEQzM5MF9CQU5ORVIgIiBWIiBEQzM5MF9WRVJTSU9OLAorCS5zbGF2ZV9hbGxvYwkJPSBkYzM5MF9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfY29uZmlndXJlCT0gZGMzOTBfc2xhdmVfY29uZmlndXJlLAorCS5zbGF2ZV9kZXN0cm95CQk9IGRjMzkwX3NsYXZlX2Rlc3Ryb3ksCisJLnF1ZXVlY29tbWFuZAkJPSBEQzM5MF9xdWV1ZWNvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBEQzM5MF9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBEQzM5MF9idXNfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSAxLAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb25zIGZvciBhY2Nlc3MgdG8gREMzOTAgRUVQUk9NCisgKiBhbmQgc29tZSB0byBlbXVsYXRlIGl0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBkYzM5MF9lZXByb21fcHJlcGFyZV9yZWFkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBjbWQpCit7CisJdTggY2FycnlGbGFnID0gMSwgaiA9IDB4ODAsIGJ2YWw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CisJCWlmIChjYXJyeUZsYWcpIHsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDgwLCAweDQwKTsKKwkJCWJ2YWwgPSAweGMwOworCQl9IGVsc2UKKwkJCWJ2YWwgPSAweDgwOworCisJCXVkZWxheSgxNjApOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg4MCwgYnZhbCk7CisJCXVkZWxheSgxNjApOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg4MCwgMCk7CisJCXVkZWxheSgxNjApOworCisJCWNhcnJ5RmxhZyA9IChjbWQgJiBqKSA/IDEgOiAwOworCQlqID4+PSAxOworCX0KK30KKworc3RhdGljIHUxNiBfX2RldmluaXQgZGMzOTBfZWVwcm9tX2dldF9kYXRhKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCBpOworCXUxNiB3dmFsID0gMDsKKwl1OCBidmFsOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJd3ZhbCA8PD0gMTsKKworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg4MCwgMHg4MCk7CisJCXVkZWxheSgxNjApOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg4MCwgMHg0MCk7CisJCXVkZWxheSgxNjApOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDAwLCAmYnZhbCk7CisKKwkJaWYgKGJ2YWwgPT0gMHgyMikKKwkJCXd2YWwgfD0gMTsKKwl9CisKKwlyZXR1cm4gd3ZhbDsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGRjMzkwX3JlYWRfZWVwcm9tKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MTYgKnB0cikKK3sKKwl1OCBjbWQgPSBFRVBST01fUkVBRCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCAweDQwOyBpKyspIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4YzAsIDApOworCQl1ZGVsYXkoMTYwKTsKKworCQlkYzM5MF9lZXByb21fcHJlcGFyZV9yZWFkKHBkZXYsIGNtZCsrKTsKKwkJKnB0cisrID0gZGMzOTBfZWVwcm9tX2dldF9kYXRhKHBkZXYpOworCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDgwLCAwKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4ODAsIDApOworCQl1ZGVsYXkoMTYwKTsKKwl9Cit9CisKKy8qIE92ZXJyaWRlIEVFcHJvbSB2YWx1ZXMgd2l0aCBleHBsaWNpdGx5IHNldCB2YWx1ZXMgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBkYzM5MF9lZXByb21fb3ZlcnJpZGUodTggaW5kZXgpCit7CisJdTggKnB0ciA9ICh1OCAqKSBkYzM5MF9lZXByb21CdWZbaW5kZXhdLCBpZDsKKworCS8qIEFkYXB0ZXIgU2V0dGluZ3MgKi8KKwlpZiAodG1zY3NpbVswXSAhPSAtMikKKwkJcHRyW0VFX0FEQVBUX1NDU0lfSURdID0gKHU4KXRtc2NzaW1bMF07CS8qIEFkYXB0ZXIgSUQgKi8KKwlpZiAodG1zY3NpbVszXSAhPSAtMikKKwkJcHRyW0VFX01PREUyXSA9ICh1OCl0bXNjc2ltWzNdOworCWlmICh0bXNjc2ltWzVdICE9IC0yKQorCQlwdHJbRUVfREVMQVldID0gdG1zY3NpbVs1XTsJCS8qIFJlc2V0IGRlbGF5ICovCisJaWYgKHRtc2NzaW1bNF0gIT0gLTIpCisJCXB0cltFRV9UQUdfQ01EX05VTV0gPSAodTgpdG1zY3NpbVs0XTsJLyogVGFnZ2VkIENtZHMgKi8KKworCS8qIERldmljZSBTZXR0aW5ncyAqLworCWZvciAoaWQgPSAwOyBpZCA8IE1BWF9TQ1NJX0lEOyBpZCsrKSB7CisJCWlmICh0bXNjc2ltWzJdICE9IC0yKQorCQkJcHRyW2lkIDw8IDJdID0gKHU4KXRtc2NzaW1bMl07CQkvKiBFRV9NT0RFMSAqLworCQlpZiAodG1zY3NpbVsxXSAhPSAtMikKKwkJCXB0clsoaWQgPDwgMikgKyAxXSA9ICh1OCl0bXNjc2ltWzFdOwkvKiBFRV9TcGVlZCAqLworCX0KK30KKworc3RhdGljIGludCBfX2RldmluaXRkYXRhIHRtc2NzaW1fZGVmW10gPSB7CisJNywKKwkwIC8qIDEwTUh6ICovLAorCVBBUklUWV9DSEtfIHwgU0VORF9TVEFSVF8gfCBFTl9ESVNDT05ORUNUXyB8IFNZTkNfTkVHT18gfCBUQUdfUVVFVUVJTkdfLAorCU1PUkUyX0RSViB8IEdSRUFURVJfMUcgfCBSU1RfU0NTSV9CVVMgfCBBQ1RJVkVfTkVHQVRJT04gfCBMVU5fQ0hFQ0ssCisJMyAvKiAxNiBUYWdzIHBlciBMVU4gKi8sCisJMSAvKiBzIGRlbGF5IGFmdGVyIFJlc2V0ICovLAorfTsKKworLyogQ29weSBkZWZhdWx0cyBvdmVyIHNldCB2YWx1ZXMgd2hlcmUgbWlzc2luZyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGRjMzkwX2ZpbGxfd2l0aF9kZWZhdWx0cyAodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJaWYgKHRtc2NzaW1baV0gPCAwIHx8IHRtc2NzaW1baV0gPiAyNTUpCisJCQl0bXNjc2ltW2ldID0gdG1zY3NpbV9kZWZbaV07CisJfQorCisJLyogU2FuaXR5IGNoZWNrcyAqLworCWlmICh0bXNjc2ltWzBdID4gNykKKwkJdG1zY3NpbVswXSA9IDc7CisJaWYgKHRtc2NzaW1bMV0gPiA3KQorCQl0bXNjc2ltWzFdID0gNDsKKwlpZiAodG1zY3NpbVs0XSA+IDUpCisJCXRtc2NzaW1bNF0gPSA0OworCWlmICh0bXNjc2ltWzVdID4gMTgwKQorCQl0bXNjc2ltWzVdID0gMTgwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZGMzOTBfY2hlY2tfZWVwcm9tKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBpbmRleCkKK3sKKwl1OCBpbnRlcnBkW10gPSB7MSwgMywgNSwgMTAsIDE2LCAzMCwgNjAsIDEyMH07CisJdTggRUVidWZbMTI4XTsKKwl1MTYgKnB0ciA9ICh1MTYgKilFRWJ1Ziwgd3ZhbCA9IDA7CisJaW50IGk7CisKKwlkYzM5MF9yZWFkX2VlcHJvbShwZGV2LCBwdHIpOworCW1lbWNweShkYzM5MF9lZXByb21CdWZbaW5kZXhdLCBFRWJ1ZiwgRUVfQURBUFRfU0NTSV9JRCk7CisJbWVtY3B5KCZkYzM5MF9lZXByb21CdWZbaW5kZXhdW0VFX0FEQVBUX1NDU0lfSURdLCAKKwkgICAgICAgJkVFYnVmW1JFQUxfRUVfQURBUFRfU0NTSV9JRF0sIEVFX0xFTiAtIEVFX0FEQVBUX1NDU0lfSUQpOworCisJZGMzOTBfZWVwcm9tQnVmW2luZGV4XVtFRV9ERUxBWV0gPSBpbnRlcnBkW2RjMzkwX2VlcHJvbUJ1ZltpbmRleF1bRUVfREVMQVldXTsKKworCWZvciAoaSA9IDA7IGkgPCAweDQwOyBpKyssIHB0cisrKQorCQl3dmFsICs9ICpwdHI7CisKKwkvKiBubyBUZWtyYW0gRUVwcm9tIGZvdW5kICovCisJaWYgKHd2YWwgIT0gMHgxMjM0KSB7CisJCWludCBzcGVlZDsKKworCQlwcmludGsoS0VSTl9JTkZPICJEQzM5MF9pbml0OiBObyBFRVBST00gZm91bmQhIFRyeWluZyBkZWZhdWx0IHNldHRpbmdzIC4uLlxuIik7CisKKwkJLyoKKwkJICogWFhYKGhjaCk6IGJvZ3VzLCBiZWNhdXNlIHdlIG1pZ2h0IGhhdmUgdGVrcmFtIGFuZAorCQkgKiAgICAgICAgICAgbm9uLXRla3JhbSBoYmFzIGluIGEgc2luZ2xlIG1hY2hpbmUuCisJCSAqLworCQlkYzM5MF9maWxsX3dpdGhfZGVmYXVsdHMoKTsKKworCQlzcGVlZCA9IGRjMzkwX2Nsb2NrX3NwZWVkW3Rtc2NzaW1bMV1dOworCQlwcmludGsoS0VSTl9JTkZPICJEQzM5MDogVXNlZCBkZWZhdWx0czogQWRhcHRJRD0laSwgU3BlZWRJZHg9JWkgKCVpLiVpIE1IeiksICIKKwkJICAgICAgICJEZXZNb2RlPTB4JTAyeCwgQWRhcHRNb2RlPTB4JTAyeCwgVGFnZ2VkQ21uZHM9JWkgKCVpKSwgRGVsYXlSZXNldD0laXNcbiIsIAorCQkgICAgICAgdG1zY3NpbVswXSwgdG1zY3NpbVsxXSwgc3BlZWQgLyAxMCwgc3BlZWQgJSAxMCwKKwkJICAgICAgICh1OCl0bXNjc2ltWzJdLCAodTgpdG1zY3NpbVszXSwgdG1zY3NpbVs0XSwgMiA8PCAodG1zY3NpbVs0XSksIHRtc2NzaW1bNV0pOworCX0KK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGRjMzkwX2luaXRfaHcoc3RydWN0IGRjMzkwX2FjYiAqcEFDQiwgdTggaW5kZXgpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBwQUNCLT5wU2NzaUhvc3Q7CisJdTggZHN0YXRlOworCisJLyogRGlzYWJsZSBTQ1NJIGJ1cyByZXNldCBpbnRlcnJ1cHQgKi8KKwlEQzM5MF93cml0ZTgoQ3RybFJlZzEsIERJU19JTlRfT05fU0NTSV9SU1QgfCBzaG9zdC0+dGhpc19pZCk7CisKKwlpZiAocEFDQi0+R21vZGUyICYgUlNUX1NDU0lfQlVTKSB7CisJCWRjMzkwX1Jlc2V0U0NTSUJ1cyhwQUNCKTsKKwkJdWRlbGF5KDEwMDApOworCQlzaG9zdC0+bGFzdF9yZXNldCA9IGppZmZpZXMgKyBIWi8yICsKKwkJCUhaICogZGMzOTBfZWVwcm9tQnVmW3BBQ0ItPkFkYXB0ZXJJbmRleF1bRUVfREVMQVldOworCX0KKworCXBBQ0ItPkFDQkZsYWcgPSAwOworCisJLyogUmVzZXQgUGVuZGluZyBJTlQgKi8KKwlEQzM5MF9yZWFkOChJTlRfU3RhdHVzKTsKKwkKKwkvKiAyNTBtcyBzZWxlY3Rpb24gdGltZW91dCAqLworCURDMzkwX3dyaXRlOChTY3NpX1RpbWVPdXQsIFNFTF9USU1FT1VUKTsKKwkKKwkvKiBDb252ZXJzaW9uIGZhY3RvciA9IDAgLCA0ME1IeiBjbG9jayAqLworCURDMzkwX3dyaXRlOChDbGtfRmFjdG9yLCBDTEtfRlJFUV80ME1IWik7CisJCisJLyogTk9QIGNtZCAtIGNsZWFyIGNvbW1hbmQgcmVnaXN0ZXIgKi8KKwlEQzM5MF93cml0ZTgoU2NzaUNtZCwgTk9QX0NNRCk7CisJCisJLyogRW5hYmxlIEZlYXR1cmUgYW5kIFNDU0ktMiAqLworCURDMzkwX3dyaXRlOChDdHJsUmVnMiwgRU5fRkVBVFVSRStFTl9TQ1NJMl9DTUQpOworCQorCS8qIEZhc3QgY2xvY2sgKi8KKwlEQzM5MF93cml0ZTgoQ3RybFJlZzMsIEZBU1RfQ0xLKTsKKworCS8qIE5lZ2F0aW9uICovCisJREMzOTBfd3JpdGU4KEN0cmxSZWc0LCBwQUNCLT5nbGl0Y2hfY2ZnIHwgLyogZ2xpdGNoIGVhdGVyICovCisJCShkYzM5MF9lZXByb21CdWZbaW5kZXhdW0VFX01PREUyXSAmIEFDVElWRV9ORUdBVElPTikgPworCQkgTkVHQVRFX1JFUUFDS0RBVEEgOiAwKTsKKwkKKwkvKiBDbGVhciBUcmFuc2ZlciBDb3VudCBIaWdoOiBJRCAqLworCURDMzkwX3dyaXRlOChDdGNSZWdfSGlnaCwgMCk7CisJREMzOTBfd3JpdGU4KERNQV9DbWQsIERNQV9JRExFX0NNRCk7CisJREMzOTBfd3JpdGU4KFNjc2lDbWQsIENMRUFSX0ZJRk9fQ01EKTsKKwlEQzM5MF93cml0ZTMyKERNQV9TY3NpQnVzQ3RybCwgRU5fSU5UX09OX1BDSV9BQk9SVCk7CisKKwlkc3RhdGUgPSBEQzM5MF9yZWFkOChETUFfU3RhdHVzKTsKKwlEQzM5MF93cml0ZTgoRE1BX1N0YXR1cywgZHN0YXRlKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZGMzOTBfcHJvYmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGRjMzkwX2FjYiAqcEFDQjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwl1bnNpZ25lZCBsb25nIGlvX3BvcnQ7CisJaW50IGVycm9yID0gLUVOT0RFViwgaTsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJZ290byBvdXQ7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWVycm9yID0gLUVOT01FTTsKKwlzaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmZHJpdmVyX3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IGRjMzkwX2FjYikpOworCWlmICghc2hvc3QpCisJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOworCisJcEFDQiA9IChzdHJ1Y3QgZGMzOTBfYWNiICopc2hvc3QtPmhvc3RkYXRhOworCW1lbXNldChwQUNCLCAwLCBzaXplb2Yoc3RydWN0IGRjMzkwX2FjYikpOworCisJZGMzOTBfY2hlY2tfZWVwcm9tKHBkZXYsIGRjMzkwX2FkYXB0ZXJDbnQpOworCWRjMzkwX2VlcHJvbV9vdmVycmlkZShkYzM5MF9hZGFwdGVyQ250KTsKKworCWlvX3BvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisKKwlzaG9zdC0+dGhpc19pZCA9IGRjMzkwX2VlcHJvbUJ1ZltkYzM5MF9hZGFwdGVyQ250XVtFRV9BREFQVF9TQ1NJX0lEXTsKKwlzaG9zdC0+aW9fcG9ydCA9IGlvX3BvcnQ7CisJc2hvc3QtPm5faW9fcG9ydCA9IDB4ODA7CisJc2hvc3QtPmlycSA9IHBkZXYtPmlycTsKKwlzaG9zdC0+YmFzZSA9IGlvX3BvcnQ7CisJc2hvc3QtPnVuaXF1ZV9pZCA9IGlvX3BvcnQ7CisJc2hvc3QtPmxhc3RfcmVzZXQgPSBqaWZmaWVzOworCQorCXBBQ0ItPnBTY3NpSG9zdCA9IHNob3N0OworCXBBQ0ItPklPUG9ydEJhc2UgPSAodTE2KSBpb19wb3J0OworCXBBQ0ItPklSUUxldmVsID0gcGRldi0+aXJxOworCQorCXNob3N0LT5tYXhfaWQgPSA4OworCisJaWYgKHNob3N0LT5tYXhfaWQgLSAxID09CisJICAgIGRjMzkwX2VlcHJvbUJ1ZltkYzM5MF9hZGFwdGVyQ250XVtFRV9BREFQVF9TQ1NJX0lEXSkKKwkJc2hvc3QtPm1heF9pZC0tOworCisJaWYgKGRjMzkwX2VlcHJvbUJ1ZltkYzM5MF9hZGFwdGVyQ250XVtFRV9NT0RFMl0gJiBMVU5fQ0hFQ0spCisJCXNob3N0LT5tYXhfbHVuID0gODsKKwllbHNlCisJCXNob3N0LT5tYXhfbHVuID0gMTsKKworCXBBQ0ItPnBGcmVlU1JCID0gcEFDQi0+U1JCX2FycmF5OworCXBBQ0ItPlNSQkNvdW50ID0gTUFYX1NSQl9DTlQ7CisJcEFDQi0+QWRhcHRlckluZGV4ID0gZGMzOTBfYWRhcHRlckNudDsKKwlwQUNCLT5UYWdNYXhOdW0gPQorCQkyIDw8IGRjMzkwX2VlcHJvbUJ1ZltkYzM5MF9hZGFwdGVyQ250XVtFRV9UQUdfQ01EX05VTV07CisJcEFDQi0+R21vZGUyID0gZGMzOTBfZWVwcm9tQnVmW2RjMzkwX2FkYXB0ZXJDbnRdW0VFX01PREUyXTsKKworCWZvciAoaSA9IDA7IGkgPCBwQUNCLT5TUkJDb3VudC0xOyBpKyspCisJCXBBQ0ItPlNSQl9hcnJheVtpXS5wTmV4dFNSQiA9ICZwQUNCLT5TUkJfYXJyYXlbaSsxXTsKKwlwQUNCLT5TUkJfYXJyYXlbcEFDQi0+U1JCQ291bnQtMV0ucE5leHRTUkIgPSBOVUxMOworCXBBQ0ItPnBUbXBTUkIgPSAmcEFDQi0+VG1wU1JCOworCisJcEFDQi0+c2VsX3RpbWVvdXQgPSBTRUxfVElNRU9VVDsKKwlwQUNCLT5nbGl0Y2hfY2ZnID0gRUFURVJfMjVOUzsKKwlwQUNCLT5wZGV2ID0gcGRldjsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9fcG9ydCwgc2hvc3QtPm5faW9fcG9ydCwgInRtc2NzaW0iKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkRDMzkwOiByZWdpc3RlciBJTyBwb3J0cyBlcnJvciFcbiIpOworCQlnb3RvIG91dF9ob3N0X3B1dDsKKwl9CisKKwkvKiBSZXNldCBQZW5kaW5nIElOVCAqLworCURDMzkwX3JlYWQ4XyhJTlRfU3RhdHVzLCBpb19wb3J0KTsKKworCWlmIChyZXF1ZXN0X2lycShwZGV2LT5pcnEsIGRvX0RDMzkwX0ludGVycnVwdCwgU0FfU0hJUlEsCisJCQkJInRtc2NzaW0iLCBwQUNCKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkRDMzkwOiByZWdpc3RlciBJUlEgZXJyb3IhXG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247CisJfQorCisJZGMzOTBfaW5pdF9odyhwQUNCLCBkYzM5MF9hZGFwdGVyQ250KTsKKwkKKwlkYzM5MF9hZGFwdGVyQ250Kys7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgc2hvc3QpOworCisJZXJyb3IgPSBzY3NpX2FkZF9ob3N0KHNob3N0LCAmcGRldi0+ZGV2KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2ZyZWVfaXJxOworCXNjc2lfc2Nhbl9ob3N0KHNob3N0KTsKKwlyZXR1cm4gMDsKKworIG91dF9mcmVlX2lycToKKwlmcmVlX2lycShwZGV2LT5pcnEsIHBBQ0IpOworIG91dF9yZWxlYXNlX3JlZ2lvbjoKKwlyZWxlYXNlX3JlZ2lvbihpb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKKyBvdXRfaG9zdF9wdXQ6CisJc2NzaV9ob3N0X3B1dChzaG9zdCk7Cisgb3V0X2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKyBvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGRjMzkwX3JlbW92ZV9vbmUgLSBDYWxsZWQgdG8gcmVtb3ZlIGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyLgorICoKKyAqIEBkZXY6IFRoZSBQQ0kgZGV2aWNlIHRvIHJlbW92ZS4KKyAqLworc3RhdGljIHZvaWQgX19kZXZleGl0IGRjMzkwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX2hvc3QgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKwlzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCID0gKHN0cnVjdCBkYzM5MF9hY2IqKSBzY3NpX2hvc3QtPmhvc3RkYXRhOworCXU4IGJ2YWw7CisKKwlzY3NpX3JlbW92ZV9ob3N0KHNjc2lfaG9zdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzY3NpX2hvc3QtPmhvc3RfbG9jaywgaWZsYWdzKTsKKwlwQUNCLT5BQ0JGbGFnID0gUkVTRVRfREVWOworCWJ2YWwgPSBEQzM5MF9yZWFkOChDdHJsUmVnMSkgfCBESVNfSU5UX09OX1NDU0lfUlNUOworCURDMzkwX3dyaXRlOCAoQ3RybFJlZzEsIGJ2YWwpOwkvKiBkaXNhYmxlIGludGVycnVwdCAqLworCWlmIChwQUNCLT5HbW9kZTIgJiBSU1RfU0NTSV9CVVMpCisJCWRjMzkwX1Jlc2V0U0NTSUJ1cyhwQUNCKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNjc2lfaG9zdC0+aG9zdF9sb2NrLCBpZmxhZ3MpOworCisJZnJlZV9pcnEoc2NzaV9ob3N0LT5pcnEsIHBBQ0IpOworCXJlbGVhc2VfcmVnaW9uKHNjc2lfaG9zdC0+aW9fcG9ydCwgc2NzaV9ob3N0LT5uX2lvX3BvcnQpOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CisJc2NzaV9ob3N0X3B1dChzY3NpX2hvc3QpOworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdG1zY3NpbV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTUQ1M0M5NzQsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdG1zY3NpbV9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRjMzkwX2RyaXZlciA9IHsKKwkubmFtZSAgICAgICAgICAgPSAidG1zY3NpbSIsCisJLmlkX3RhYmxlICAgICAgID0gdG1zY3NpbV9wY2lfdGJsLAorCS5wcm9iZSAgICAgICAgICA9IGRjMzkwX3Byb2JlX29uZSwKKwkucmVtb3ZlICAgICAgICAgPSBfX2RldmV4aXRfcChkYzM5MF9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRjMzkwX21vZHVsZV9pbml0KHZvaWQpCit7CisJaWYgKHRtc2NzaW1bMF0gPT0gLTEgfHwgdG1zY3NpbVswXSA+IDE1KSB7CisJCXRtc2NzaW1bMF0gPSA3OworCQl0bXNjc2ltWzFdID0gNDsKKwkJdG1zY3NpbVsyXSA9IFBBUklUWV9DSEtfIHwgVEFHX1FVRVVFSU5HXzsKKwkJdG1zY3NpbVszXSA9IE1PUkUyX0RSViB8IEdSRUFURVJfMUcgfCBSU1RfU0NTSV9CVVMgfCBBQ1RJVkVfTkVHQVRJT047CisJCXRtc2NzaW1bNF0gPSAyOworCQl0bXNjc2ltWzVdID0gMTA7CisJCXByaW50ayAoS0VSTl9JTkZPICJEQzM5MDogVXNpbmcgc2FmZSBzZXR0aW5ncy5cbiIpOworCX0KKworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmRjMzkwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkYzM5MF9tb2R1bGVfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZGMzOTBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZGMzOTBfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoZGMzOTBfbW9kdWxlX2V4aXQpOworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgZGMzOTBfc2V0dXAgKGNoYXIgKnN0cikKK3sJCisJaW50IGludHNbOF0saSwgaW07CisKKwlnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCWltID0gaW50c1swXTsKKworCWlmIChpbSA+IDYpIHsKKwkJcHJpbnRrIChLRVJOX05PVElDRSAiREMzOTA6IGlnbm9yZSBleHRyYSBwYXJhbXMhXG4iKTsKKwkJaW0gPSA2OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBpbTsgaSsrKQorCQl0bXNjc2ltW2ldID0gaW50c1tpKzFdOworCS8qIGRjMzkwX2NoZWNrcGFyYW1zICgpOyAqLworCXJldHVybiAxOworfQorCitfX3NldHVwKCJ0bXNjc2ltPSIsIGRjMzkwX3NldHVwKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Rtc2NzaW0uaCBiL2RyaXZlcnMvc2NzaS90bXNjc2ltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ0OTUyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS90bXNjc2ltLmgKQEAgLTAsMCArMSw1NjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyoJRmlsZSBOYW1lIDogVE1TQ1NJTS5ICQkJCQkgICAgICAgKgorOyoJCSAgICBURUtSQU0gREMtMzkwKFQpIFBDSSBTQ1NJIEJ1cyBNYXN0ZXIgSG9zdCBBZGFwdGVyICAqCis7KgkJICAgIERldmljZSBEcml2ZXIJCQkJICAgICAgICoKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICRJZDogdG1zY3NpbS5oLHYgMi4xNS4yLjMgMjAwMC8xMS8xNyAyMDo1MjoyNyBnYXJsb2ZmIEV4cCAkICovCisKKyNpZm5kZWYgX1RNU0NTSU1fSAorI2RlZmluZSBfVE1TQ1NJTV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjZGVmaW5lIFNDU0lfSVJRX05PTkUgMjU1CisKKyNkZWZpbmUgTUFYX0FEQVBURVJfTlVNIAk0CisjZGVmaW5lIE1BWF9TR19MSVNUX0JVRiAJMTYJLyogTm90IHVzZWQgKi8KKyNkZWZpbmUgTUFYX1NDU0lfSUQJCTgKKyNkZWZpbmUgTUFYX1NSQl9DTlQJCTUwCS8qIE1heCBudW1iZXIgb2Ygc3RhcnRlZCBjb21tYW5kcyAqLworCisjZGVmaW5lIFNFTF9USU1FT1VUCQkxNTMJLyogMjUwIG1zIHNlbGVjdGlvbiB0aW1lb3V0IChAIDQwIE1IeikgKi8KKworI2RlZmluZSBwY2lfZG1hX2xvMzIoYSkJCQkoYSAmIDB4ZmZmZmZmZmYpCisKK3R5cGVkZWYgdTgJCVVDSEFSOwkvKiAgOCBiaXRzICovCit0eXBlZGVmIHUxNgkJVVNIT1JUOwkvKiAxNiBiaXRzICovCit0eXBlZGVmIHUzMgkJVUlOVDsJLyogMzIgYml0cyAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nCVVMT05HOwkvKiAzMi82NCBiaXRzICovCisKKworLyoKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBTQ1NJIFJlcXVlc3QgQmxvY2sKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0cnVjdCBkYzM5MF9zcmIKK3sKKy8vdTgJCUNtZEJsb2NrWzEyXTsKKworc3RydWN0IGRjMzkwX3NyYgkqcE5leHRTUkI7CitzdHJ1Y3QgZGMzOTBfZGNiCSpwU1JCRENCOworc3RydWN0IHNjc2lfY21uZAkqcGNtZDsKK3N0cnVjdCBzY2F0dGVybGlzdAkqcFNlZ21lbnRMaXN0OworCitzdHJ1Y3Qgc2NhdHRlcmxpc3QgU2VnbWVudHg7CS8qIG1ha2UgYSBvbmUgZW50cnkgb2YgUy9HIGxpc3QgdGFibGUgKi8KKwordW5zaWduZWQgbG9uZwlTR0J1c0FkZHI7CS8qO2Egc2VnbWVudCBzdGFydGluZyBhZGRyZXNzIGFzIHNlZW4gYnkgQU01M0M5NzRBKi8KK3Vuc2lnbmVkIGxvbmcJU0dUb0JlWGZlckxlbjsJLyo7IHRvIGJlIHhmZXIgbGVuZ3RoICovCit1bnNpZ25lZCBsb25nCVRvdGFsWGZlcnJlZExlbjsKK3Vuc2lnbmVkIGxvbmcJU2F2ZWRUb3RYTGVuOwordW5zaWduZWQgbG9uZwlTYXZlZF9QdHI7Cit1MzIJCVNSQlN0YXRlOworCit1OAkJU1JCU3RhdHVzOwordTgJCVNSQkZsYWc7CS8qOyBiMC1BdXRvUmVxU2Vuc2UsYjYtUmVhZCxiNy13cml0ZSAqLworCQkJCS8qOyBiNC1zZXR0aW1lb3V0LGI1LVJlc2lkdWFsIHZhbGlkICovCit1OAkJQWRhcHRTdGF0dXM7Cit1OAkJVGFyZ2V0U3RhdHVzOworCit1OAkJU2NzaVBoYXNlOworczgJCVRhZ051bWJlcjsKK3U4CQlTR0luZGV4OwordTgJCVNHY291bnQ7CisKK3U4CQlNc2dDbnQ7Cit1OAkJRW5kTWVzc2FnZTsKK3U4CQlTYXZlZFNHQ291bnQ7CQkJCisKK3U4CQlNc2dJbkJ1Zls2XTsKK3U4CQlNc2dPdXRCdWZbNl07CisKKy8vdTgJCUlPUkJGbGFnOwkvKjs4MWgtUmVzZXQsIDItcmV0cnkgKi8KK307CisKKworLyoKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBEZXZpY2UgQ29udHJvbCBCbG9jaworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RydWN0IGRjMzkwX2RjYgoreworc3RydWN0IGRjMzkwX2RjYgkqcE5leHREQ0I7CitzdHJ1Y3QgZGMzOTBfYWNiCSpwRENCQUNCOworCisvKiBRdWV1ZWQgU1JCcyAqLworc3RydWN0IGRjMzkwX3NyYgkqcEdvaW5nU1JCOworc3RydWN0IGRjMzkwX3NyYgkqcEdvaW5nTGFzdDsKK3N0cnVjdCBkYzM5MF9zcmIJKnBBY3RpdmVTUkI7Cit1OAkJR29pbmdTUkJDbnQ7CisKK3UzMgkJVGFnTWFzazsKKwordTgJCVRhcmdldElEOwkvKjsgU0NTSSBUYXJnZXQgSUQgIChTQ1NJIE9ubHkpICovCit1OAkJVGFyZ2V0TFVOOwkvKjsgU0NTSSBMb2cuICBVbml0IChTQ1NJIE9ubHkpICovCit1OAkJRGV2TW9kZTsKK3U4CQlEQ0JGbGFnOworCit1OAkJQ3RybFIxOwordTgJCUN0cmxSMzsKK3U4CQlDdHJsUjQ7CisKK3U4CQlTeW5jTW9kZTsJLyo7IDA6YXN5bmMgbW9kZSAqLwordTgJCU5lZ29QZXJpb2Q7CS8qO2ZvciBuZWdvLiAqLwordTgJCVN5bmNQZXJpb2Q7CS8qO2ZvciByZWcuICovCit1OAkJU3luY09mZnNldDsJLyo7Zm9yIHJlZy4gYW5kIG5lZ28uKGxvdyBuaWJibGUpICovCit9OworCisKKy8qCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgQWRhcHRlciBDb250cm9sIEJsb2NrCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdHJ1Y3QgZGMzOTBfYWNiCit7CitzdHJ1Y3QgU2NzaV9Ib3N0ICpwU2NzaUhvc3Q7Cit1MTYJCUlPUG9ydEJhc2U7Cit1OAkJSVJRTGV2ZWw7Cit1OAkJc3RhdHVzOworCit1OAkJU1JCQ291bnQ7Cit1OAkJQWRhcHRlckluZGV4OwkvKjsgbnRoIEFkYXB0ZXIgdGhpcyBkcml2ZXIgKi8KK3U4CQlEQ0JDbnQ7CisKK3U4CQlUYWdNYXhOdW07Cit1OAkJQUNCRmxhZzsKK3U4CQlHbW9kZTI7Cit1OAkJc2Nhbl9kZXZpY2VzOworCitzdHJ1Y3QgZGMzOTBfZGNiCSpwTGlua0RDQjsKK3N0cnVjdCBkYzM5MF9kY2IJKnBMYXN0RENCOworc3RydWN0IGRjMzkwX2RjYgkqcERDQlJ1blJvYmluOworCitzdHJ1Y3QgZGMzOTBfZGNiCSpwQWN0aXZlRENCOworc3RydWN0IGRjMzkwX3NyYgkqcEZyZWVTUkI7CitzdHJ1Y3QgZGMzOTBfc3JiCSpwVG1wU1JCOworCit1OAkJbXNnaW4xMjNbNF07Cit1OAkJQ29ubmVjdGVkOwordTgJCXBhZDsKKworI2lmIGRlZmluZWQoVVNFX1NQSU5MT0NLUykgJiYgVVNFX1NQSU5MT0NLUyA+IDEgJiYgKGRlZmluZWQoQ09ORklHX1NNUCkgfHwgREVCVUdfU1BJTkxPQ0tTID4gMCkKK3NwaW5sb2NrX3QJbG9jazsKKyNlbmRpZgordTgJCXNlbF90aW1lb3V0OwordTgJCWdsaXRjaF9jZmc7CisKK3U4CQlNc2dMZW47Cit1OAkJSWdub3JlX0lSUTsJLyogTm90IHVzZWQgKi8KKworc3RydWN0IHBjaV9kZXYJKnBkZXY7CisKK3Vuc2lnbmVkIGxvbmcJQ21kczsKK3UzMgkJU2VsTG9zdDsKK3UzMgkJU2VsQ29ubjsKK3UzMgkJQ21kSW5ROwordTMyCQlDbWRPdXRPZlNSQjsKKworc3RydWN0IGRjMzkwX3NyYglUbXBTUkI7CitzdHJ1Y3QgZGMzOTBfc3JiCVNSQl9hcnJheVtNQVhfU1JCX0NOVF07IAkvKiA1MCBTUkJzICovCit9OworCisKKy8qOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisjZGVmaW5lIEJJVDMxCTB4ODAwMDAwMDAKKyNkZWZpbmUgQklUMzAJMHg0MDAwMDAwMAorI2RlZmluZSBCSVQyOQkweDIwMDAwMDAwCisjZGVmaW5lIEJJVDI4CTB4MTAwMDAwMDAKKyNkZWZpbmUgQklUMjcJMHgwODAwMDAwMAorI2RlZmluZSBCSVQyNgkweDA0MDAwMDAwCisjZGVmaW5lIEJJVDI1CTB4MDIwMDAwMDAKKyNkZWZpbmUgQklUMjQJMHgwMTAwMDAwMAorI2RlZmluZSBCSVQyMwkweDAwODAwMDAwCisjZGVmaW5lIEJJVDIyCTB4MDA0MDAwMDAKKyNkZWZpbmUgQklUMjEJMHgwMDIwMDAwMAorI2RlZmluZSBCSVQyMAkweDAwMTAwMDAwCisjZGVmaW5lIEJJVDE5CTB4MDAwODAwMDAKKyNkZWZpbmUgQklUMTgJMHgwMDA0MDAwMAorI2RlZmluZSBCSVQxNwkweDAwMDIwMDAwCisjZGVmaW5lIEJJVDE2CTB4MDAwMTAwMDAKKyNkZWZpbmUgQklUMTUJMHgwMDAwODAwMAorI2RlZmluZSBCSVQxNAkweDAwMDA0MDAwCisjZGVmaW5lIEJJVDEzCTB4MDAwMDIwMDAKKyNkZWZpbmUgQklUMTIJMHgwMDAwMTAwMAorI2RlZmluZSBCSVQxMQkweDAwMDAwODAwCisjZGVmaW5lIEJJVDEwCTB4MDAwMDA0MDAKKyNkZWZpbmUgQklUOQkweDAwMDAwMjAwCisjZGVmaW5lIEJJVDgJMHgwMDAwMDEwMAorI2RlZmluZSBCSVQ3CTB4MDAwMDAwODAKKyNkZWZpbmUgQklUNgkweDAwMDAwMDQwCisjZGVmaW5lIEJJVDUJMHgwMDAwMDAyMAorI2RlZmluZSBCSVQ0CTB4MDAwMDAwMTAKKyNkZWZpbmUgQklUMwkweDAwMDAwMDA4CisjZGVmaW5lIEJJVDIJMHgwMDAwMDAwNAorI2RlZmluZSBCSVQxCTB4MDAwMDAwMDIKKyNkZWZpbmUgQklUMAkweDAwMDAwMDAxCisKKy8qOy0tLVVuaXRDdHJsRmxhZyAqLworI2RlZmluZSBVTklUX0FMTE9DQVRFRAlCSVQwCisjZGVmaW5lIFVOSVRfSU5GT19DSEFOR0VEIEJJVDEKKyNkZWZpbmUgRk9STUFUSU5HX01FRElBIEJJVDIKKyNkZWZpbmUgVU5JVF9SRVRSWQlCSVQzCisKKy8qOy0tLVVuaXRGbGFncyAqLworI2RlZmluZSBEQVNEX1NVUFBPUlQJQklUMAorI2RlZmluZSBTQ1NJX1NVUFBPUlQJQklUMQorI2RlZmluZSBBU1BJX1NVUFBPUlQJQklUMgorCisvKjstLS0tU1JCU3RhdGUgbWFjaGluZSBkZWZpbml0aW9uICovCisjZGVmaW5lIFNSQl9GUkVFCTAKKyNkZWZpbmUgU1JCX1dBSVQJQklUMAorI2RlZmluZSBTUkJfUkVBRFkJQklUMQorI2RlZmluZSBTUkJfTVNHT1VUCUJJVDIJLyo7YXJiaXRyYXRpb24rbXNnX291dCAxc3QgYnl0ZSovCisjZGVmaW5lIFNSQl9NU0dJTglCSVQzCisjZGVmaW5lIFNSQl9NU0dJTl9NVUxUSSBCSVQ0CisjZGVmaW5lIFNSQl9DT01NQU5ECUJJVDUKKyNkZWZpbmUgU1JCX1NUQVJUXwlCSVQ2CS8qO2FyYml0cmF0aW9uK21zZ19vdXQrY29tbWFuZF9vdXQqLworI2RlZmluZSBTUkJfRElTQ09OTkVDVAlCSVQ3CisjZGVmaW5lIFNSQl9EQVRBX1hGRVIJQklUOAorI2RlZmluZSBTUkJfWEZFUlBBRAlCSVQ5CisjZGVmaW5lIFNSQl9TVEFUVVMJQklUMTAKKyNkZWZpbmUgU1JCX0NPTVBMRVRFRAlCSVQxMQorI2RlZmluZSBTUkJfQUJPUlRfU0VOVAlCSVQxMgorI2RlZmluZSBET19TWU5DX05FR08JQklUMTMKKyNkZWZpbmUgU1JCX1VORVhQRUNUX1JFU0VMIEJJVDE0CisKKy8qOy0tLVNSQnN0YXR1cyAqLworI2RlZmluZSBTUkJfT0sJCUJJVDAKKyNkZWZpbmUgQUJPUlRJT04JQklUMQorI2RlZmluZSBPVkVSX1JVTglCSVQyCisjZGVmaW5lIFVOREVSX1JVTglCSVQzCisjZGVmaW5lIFBBUklUWV9FUlJPUglCSVQ0CisjZGVmaW5lIFNSQl9FUlJPUglCSVQ1CisKKy8qOy0tLUFDQkZsYWcgKi8KKyNkZWZpbmUgUkVTRVRfREVWCUJJVDAKKyNkZWZpbmUgUkVTRVRfREVURUNUCUJJVDEKKyNkZWZpbmUgUkVTRVRfRE9ORQlCSVQyCisKKy8qOy0tLURDQkZsYWcgKi8KKyNkZWZpbmUgQUJPUlRfREVWXwlCSVQwCisKKy8qOy0tLVNSQkZsYWcgKi8KKyNkZWZpbmUgREFUQU9VVCAJQklUNworI2RlZmluZSBEQVRBSU4JCUJJVDYKKyNkZWZpbmUgUkVTSURVQUxfVkFMSUQJQklUNQorI2RlZmluZSBFTkFCTEVfVElNRVIJQklUNAorI2RlZmluZSBSRVNFVF9ERVYwCUJJVDIKKyNkZWZpbmUgQUJPUlRfREVWCUJJVDEKKyNkZWZpbmUgQVVUT19SRVFTRU5TRQlCSVQwCisKKy8qOy0tLUFkYXB0ZXIgc3RhdHVzICovCisjZGVmaW5lIEhfU1RBVFVTX0dPT0QJIDAKKyNkZWZpbmUgSF9TRUxfVElNRU9VVAkgMHgxMQorI2RlZmluZSBIX09WRVJfVU5ERVJfUlVOIDB4MTIKKyNkZWZpbmUgSF9VTkVYUF9CVVNfRlJFRSAweDEzCisjZGVmaW5lIEhfVEFSR0VUX1BIQVNFX0YgMHgxNAorI2RlZmluZSBIX0lOVkFMSURfQ0NCX09QIDB4MTYKKyNkZWZpbmUgSF9MSU5LX0NDQl9CQUQJIDB4MTcKKyNkZWZpbmUgSF9CQURfVEFSR0VUX0RJUiAweDE4CisjZGVmaW5lIEhfRFVQTElDQVRFX0NDQiAgMHgxOQorI2RlZmluZSBIX0JBRF9DQ0JfT1JfU0cgIDB4MUEKKyNkZWZpbmUgSF9BQk9SVCAJIDB4MEZGCisKKy8qOyBTQ1NJIFN0YXR1cyBieXRlIGNvZGVzKi8gCisvKiBUaGUgdmFsdWVzIGRlZmluZWQgaW4gaW5jbHVkZS9zY3NpL3Njc2kuaCwgdG8gYmUgc2hpZnRlZCA8PCAxICovCisKKyNkZWZpbmUgU0NTSV9TVEFUX1VORVhQX0JVU19GCTB4RkQJLyo7ICBVbmV4cGVjdCBCdXMgRnJlZSAqLworI2RlZmluZSBTQ1NJX1NUQVRfQlVTX1JTVF9ERVRFQ1QgMHhGRQkvKjsgIFNjc2kgQnVzIFJlc2V0IGRldGVjdGVkICovCisjZGVmaW5lIFNDU0lfU1RBVF9TRUxfVElNRU9VVAkweEZGCS8qOyAgU2VsZWN0aW9uIFRpbWUgb3V0ICovCisKKy8qIGNtZC0+cmVzdWx0ICovCisjZGVmaW5lIFJFU19UQVJHRVQJCTB4MDAwMDAwRkYJLyogVGFyZ2V0IFN0YXRlICovCisjZGVmaW5lIFJFU19UQVJHRVRfTE5YCQlTVEFUVVNfTUFTSwkvKiBPbmx5IG9mZmljaWFsIC4uLiAqLworI2RlZmluZSBSRVNfRU5ETVNHCQkweDAwMDBGRjAwCS8qIEVuZCBNZXNzYWdlICovCisjZGVmaW5lIFJFU19ESUQJCQkweDAwRkYwMDAwCS8qIERJRF8gY29kZXMgKi8KKyNkZWZpbmUgUkVTX0RSVgkJCTB4RkYwMDAwMDAJLyogRFJJVkVSXyBjb2RlcyAqLworCisjZGVmaW5lIE1LX1JFUyhkcnYsZGlkLG1zZyx0Z3QpICgoaW50KShkcnYpPDwyNCB8IChpbnQpKGRpZCk8PDE2IHwgKGludCkobXNnKTw8OCB8IChpbnQpKHRndCkpCisjZGVmaW5lIE1LX1JFU19MTlgoZHJ2LGRpZCxtc2csdGd0KSAoKGludCkoZHJ2KTw8MjQgfCAoaW50KShkaWQpPDwxNiB8IChpbnQpKG1zZyk8PDggfCAoaW50KSh0Z3QpPDwxKQorCisjZGVmaW5lIFNFVF9SRVNfVEFSR0VUKHdobywgdGd0KSBkbyB7IHdobyAmPSB+UkVTX1RBUkdFVDsgd2hvIHw9IChpbnQpKHRndCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIFNFVF9SRVNfVEFSR0VUX0xOWCh3aG8sIHRndCkgZG8geyB3aG8gJj0gflJFU19UQVJHRVRfTE5YOyB3aG8gfD0gKGludCkodGd0KSA8PCAxOyB9IHdoaWxlICgwKQorI2RlZmluZSBTRVRfUkVTX01TRyh3aG8sIG1zZykgZG8geyB3aG8gJj0gflJFU19FTkRNU0c7IHdobyB8PSAoaW50KShtc2cpIDw8IDg7IH0gd2hpbGUgKDApCisjZGVmaW5lIFNFVF9SRVNfRElEKHdobywgZGlkKSBkbyB7IHdobyAmPSB+UkVTX0RJRDsgd2hvIHw9IChpbnQpKGRpZCkgPDwgMTY7IH0gd2hpbGUgKDApCisjZGVmaW5lIFNFVF9SRVNfRFJWKHdobywgZHJ2KSBkbyB7IHdobyAmPSB+UkVTX0RSVjsgd2hvIHw9IChpbnQpKGRydikgPDwgMjQ7IH0gd2hpbGUgKDApCisKKy8qOy0tLVN5bmNfTW9kZSAqLworI2RlZmluZSBTWU5DX0RJU0FCTEUJMAorI2RlZmluZSBTWU5DX0VOQUJMRQlCSVQwCisjZGVmaW5lIFNZTkNfTkVHT19ET05FCUJJVDEKKyNkZWZpbmUgV0lERV9FTkFCTEUJQklUMgkvKiBOb3QgdXNlZCA7LSkgKi8KKyNkZWZpbmUgV0lERV9ORUdPX0RPTkUJQklUMwkvKiBOb3QgdXNlZCA7LSkgKi8KKyNkZWZpbmUgRU5fVEFHX1FVRVVFSU5HCUJJVDQKKyNkZWZpbmUgRU5fQVROX1NUT1AJQklUNQorCisjZGVmaW5lIFNZTkNfTkVHT19PRkZTRVQgMTUKKworLyo7LS0tU0NTSSBidXMgcGhhc2UqLworI2RlZmluZSBTQ1NJX0RBVEFfT1VUCTAKKyNkZWZpbmUgU0NTSV9EQVRBX0lOCTEKKyNkZWZpbmUgU0NTSV9DT01NQU5ECTIKKyNkZWZpbmUgU0NTSV9TVEFUVVNfCTMKKyNkZWZpbmUgU0NTSV9OT1AwCTQKKyNkZWZpbmUgU0NTSV9OT1AxCTUKKyNkZWZpbmUgU0NTSV9NU0dfT1VUCTYKKyNkZWZpbmUgU0NTSV9NU0dfSU4JNworCisvKjstLS0tU0NTSSBNU0cgQllURSovIC8qIHNlZSBzY3NpL3Njc2kuaCAqLyAvKiBPbmUgaXMgbWlzc2luZyAhICovCisjZGVmaW5lIEFCT1JUX1RBRwkweDBkCisKKy8qCisgKglTSVNDIHF1ZXJ5IHF1ZXVlCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlkbWFfYWRkcl90CQlzYXZlZF9kbWFfaGFuZGxlOworfSBkYzM5MF9jbWRfc2NwX3Q7CisKKy8qCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyBFRVBST00gYnl0ZSBvZmZzZXQKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordHlwZWRlZiAgc3RydWN0ICBfRUVwcm9tCit7Cit1OAlFRV9NT0RFMTsKK3U4CUVFX1NQRUVEOwordTgJeHgxOwordTgJeHgyOworfSBFRXByb20sICpQRUVwcm9tOworCisjZGVmaW5lIFJFQUxfRUVfQURBUFRfU0NTSV9JRCA2NAorI2RlZmluZSBSRUFMX0VFX01PREUyCTY1CisjZGVmaW5lIFJFQUxfRUVfREVMQVkJNjYKKyNkZWZpbmUgUkVBTF9FRV9UQUdfQ01EX05VTQk2NworCisjZGVmaW5lIEVFX0FEQVBUX1NDU0lfSUQgMzIKKyNkZWZpbmUgRUVfTU9ERTIJMzMKKyNkZWZpbmUgRUVfREVMQVkJMzQKKyNkZWZpbmUgRUVfVEFHX0NNRF9OVU0JMzUKKworI2RlZmluZSBFRV9MRU4JCTQwCisKKy8qOyBFRV9NT0RFMSBiaXRzIGRlZmluaXRpb24qLworI2RlZmluZSBQQVJJVFlfQ0hLXwlCSVQwCisjZGVmaW5lIFNZTkNfTkVHT18JQklUMQorI2RlZmluZSBFTl9ESVNDT05ORUNUXwlCSVQyCisjZGVmaW5lIFNFTkRfU1RBUlRfCUJJVDMKKyNkZWZpbmUgVEFHX1FVRVVFSU5HXwlCSVQ0CisKKy8qOyBFRV9NT0RFMiBiaXRzIGRlZmluaXRpb24qLworI2RlZmluZSBNT1JFMl9EUlYJQklUMAorI2RlZmluZSBHUkVBVEVSXzFHCUJJVDEKKyNkZWZpbmUgUlNUX1NDU0lfQlVTCUJJVDIKKyNkZWZpbmUgQUNUSVZFX05FR0FUSU9OIEJJVDMKKyNkZWZpbmUgTk9fU0VFSyAJQklUNAorI2RlZmluZSBMVU5fQ0hFQ0sJQklUNQorCisjZGVmaW5lIEVOQUJMRV9DRQkxCisjZGVmaW5lIERJU0FCTEVfQ0UJMAorI2RlZmluZSBFRVBST01fUkVBRAkweDgwCisKKy8qCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOwlBTUQgNTNDOTc0IFJlZ2lzdGVycyBiaXQgRGVmaW5pdGlvbgorOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisvKgorOz09PT09PT09PT09PT09PT09PT09Cis7IFNDU0kgUmVnaXN0ZXIKKzs9PT09PT09PT09PT09PT09PT09PQorKi8KKworLyo7IENvbW1hbmQgUmVnLigrMENIKSAocncpICovCisjZGVmaW5lIERNQV9DT01NQU5ECQlCSVQ3CisjZGVmaW5lIE5PUF9DTUQgCQkwCisjZGVmaW5lIENMRUFSX0ZJRk9fQ01ECQkxCisjZGVmaW5lIFJTVF9ERVZJQ0VfQ01ECQkyCisjZGVmaW5lIFJTVF9TQ1NJX0JVU19DTUQJMworCisjZGVmaW5lIElORk9fWEZFUl9DTUQJCTB4MTAKKyNkZWZpbmUgSU5JVElBVE9SX0NNRF9DTVBMVEUJMHgxMQorI2RlZmluZSBNU0dfQUNDRVBURURfQ01ECTB4MTIKKyNkZWZpbmUgWEZFUl9QQURfQllURQkJMHgxOAorI2RlZmluZSBTRVRfQVROX0NNRAkJMHgxQQorI2RlZmluZSBSRVNFVF9BVE5fQ01ECQkweDFCCisKKyNkZWZpbmUgU0VMX1dPX0FUTgkJMHg0MQkvKiBjdXJyZW50bHkgbm90IHVzZWQgKi8KKyNkZWZpbmUgU0VMX1dfQVROCQkweDQyCisjZGVmaW5lIFNFTF9XX0FUTl9TVE9QCQkweDQzCisjZGVmaW5lIFNFTF9XX0FUTjMJCTB4NDYKKyNkZWZpbmUgRU5fU0VMX1JFU0VMCQkweDQ0CisjZGVmaW5lIERJU19TRUxfUkVTRUwJCTB4NDUJLyogY3VycmVudGx5IG5vdCB1c2VkICovCisjZGVmaW5lIFJFU0VMCQkJMHg0MAkvKiAiICovCisjZGVmaW5lIFJFU0VMX0FUTjMJCTB4NDcJLyogIiAqLworCisjZGVmaW5lIERBVEFfWEZFUl9DTUQJCUlORk9fWEZFUl9DTUQKKworCisvKjsgU0NTSSBTdGF0dXMgUmVnLigrMTBIKSAocikgKi8KKyNkZWZpbmUgSU5URVJSVVBUCQlCSVQ3CisjZGVmaW5lIElMTEVHQUxfT1BfRVJSCQlCSVQ2CisjZGVmaW5lIFBBUklUWV9FUlIJCUJJVDUKKyNkZWZpbmUgQ09VTlRfMl9aRVJPCQlCSVQ0CisjZGVmaW5lIEdST1VQX0NPREVfVkFMSUQJQklUMworI2RlZmluZSBTQ1NJX1BIQVNFX01BU0sgCShCSVQyK0JJVDErQklUMCkgCisvKiBCSVQyOiBNU0cgcGhhc2U7IEJJVDE6IEMvRCBwaHlzZTsgQklUMDogSS9PIHBoYXNlICovCisKKy8qOyBJbnRlcnJ1cHQgU3RhdHVzIFJlZy4oKzE0SCkgKHIpICovCisjZGVmaW5lIFNDU0lfUkVTRVQJCUJJVDcKKyNkZWZpbmUgSU5WQUxJRF9DTUQJCUJJVDYKKyNkZWZpbmUgRElTQ09OTkVDVEVECQlCSVQ1CisjZGVmaW5lIFNFUlZJQ0VfUkVRVUVTVCAJQklUNAorI2RlZmluZSBTVUNDRVNTRlVMX09QCQlCSVQzCisjZGVmaW5lIFJFU0VMRUNURUQJCUJJVDIKKyNkZWZpbmUgU0VMX0FUVEVOVElPTgkJQklUMQorI2RlZmluZSBTRUxFQ1RFRAkJQklUMAorCisvKjsgSW50ZXJuYWwgU3RhdGUgUmVnLigrMThIKSAocikgKi8KKyNkZWZpbmUgU1lOQ19PRkZTRVRfRkxBRwlCSVQzCisjZGVmaW5lIElOVFJOX1NUQVRFX01BU0sJKEJJVDIrQklUMStCSVQwKQorLyogMHgwNDogU2VsLiBzdWNjZXNzZnVsICh3L28gc3RvcCksIDB4MDE6IFNlbC4gc3VjY2Vzc2Z1bCAody8gc3RvcCkgKi8KKworLyo7IENsb2NrIEZhY3RvciBSZWcuKCsyNEgpICh3KSAqLworI2RlZmluZSBDTEtfRlJFUV80ME1IWgkJMAorI2RlZmluZSBDTEtfRlJFUV8zNU1IWgkJKEJJVDIrQklUMStCSVQwKQorI2RlZmluZSBDTEtfRlJFUV8zME1IWgkJKEJJVDIrQklUMSkKKyNkZWZpbmUgQ0xLX0ZSRVFfMjVNSFoJCShCSVQyK0JJVDApCisjZGVmaW5lIENMS19GUkVRXzIwTUhaCQlCSVQyCisjZGVmaW5lIENMS19GUkVRXzE1TUhaCQkoQklUMStCSVQwKQorI2RlZmluZSBDTEtfRlJFUV8xME1IWgkJQklUMQorCisvKjsgQ29udHJvbCBSZWcuIDEoKzIwSCkgKHJ3KSAqLworI2RlZmluZSBFWFRFTkRFRF9USU1JTkcgCUJJVDcKKyNkZWZpbmUgRElTX0lOVF9PTl9TQ1NJX1JTVAlCSVQ2CisjZGVmaW5lIFBBUklUWV9FUlJfUkVQTyAJQklUNAorI2RlZmluZSBTQ1NJX0lEX09OX0JVUwkJKEJJVDIrQklUMStCSVQwKSAvKiBob3N0IGFkYXB0ZXIgSUQgKi8KKworLyo7IENvbnRyb2wgUmVnLiAyKCsyQ0gpIChydykgKi8KKyNkZWZpbmUgRU5fRkVBVFVSRQkJQklUNgorI2RlZmluZSBFTl9TQ1NJMl9DTUQJCUJJVDMKKworLyo7IENvbnRyb2wgUmVnLiAzKCszMEgpIChydykgKi8KKyNkZWZpbmUgSURfTVNHX0NIRUNLCQlCSVQ3CisjZGVmaW5lIEVOX1FUQUdfTVNHCQlCSVQ2CisjZGVmaW5lIEVOX0dSUDJfQ01ECQlCSVQ1CisjZGVmaW5lIEZBU1RfU0NTSQkJQklUNAkvKiA7MTBNQi9TRUMgKi8KKyNkZWZpbmUgRkFTVF9DTEsJCUJJVDMJLyogOzI1IC0gNDAgTUhaICovCisKKy8qOyBDb250cm9sIFJlZy4gNCgrMzRIKSAocncpICovCisjZGVmaW5lIEVBVEVSXzEyTlMJCTAKKyNkZWZpbmUgRUFURVJfMjVOUwkJQklUNworI2RlZmluZSBFQVRFUl8zNU5TCQlCSVQ2CisjZGVmaW5lIEVBVEVSXzBOUwkJKEJJVDcrQklUNikKKyNkZWZpbmUgUkVEVUNFRF9QT1dFUgkJQklUNQorI2RlZmluZSBDVFJMNF9SRVNFUlZFRAkJQklUNAkvKiBtdXN0IGJlIDEgYWNjLiB0byBBTTUzQzk3NC5jICovCisjZGVmaW5lIE5FR0FURV9SRVFBQ0tEQVRBCUJJVDIKKyNkZWZpbmUgTkVHQVRFX1JFUUFDSwkJQklUMworCisjZGVmaW5lIEdMSVRDSF9UT19OUyh4KSAoKCh+eD4+NiAmIDIpID4+IDEpIHwgKCh4Pj42ICYgMSkgPDwgMSBeICh4Pj42ICYgMikpKQorI2RlZmluZSBOU19UT19HTElUQ0goeSkgKCgofnk8PDcpIHwgfigoeTw8NikgXiAoKHk8PDUgJiAxPDw2KSB8IH4weDQwKSkpICYgMHhjMCkKKworLyoKKzs9PT09PT09PT09PT09PT09PT09PQorOyBETUEgUmVnaXN0ZXIKKzs9PT09PT09PT09PT09PT09PT09PQorKi8KKy8qOyBETUEgQ29tbWFuZCBSZWcuKCs0MEgpIChydykgKi8KKyNkZWZpbmUgUkVBRF9ESVJFQ1RJT04JCUJJVDcKKyNkZWZpbmUgV1JJVEVfRElSRUNUSU9OIAkwCisjZGVmaW5lIEVOX0RNQV9JTlQJCUJJVDYKKyNkZWZpbmUgRU5fUEFHRV9JTlQJCUJJVDUJLyogcGFnZSB0cmFuc2ZlciBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIE1BUF9UT19NREwJCUJJVDQKKyNkZWZpbmUgRElBR05PU1RJQwkJQklUMgorI2RlZmluZSBETUFfSURMRV9DTUQJCTAKKyNkZWZpbmUgRE1BX0JMQVNUX0NNRAkJQklUMAorI2RlZmluZSBETUFfQUJPUlRfQ01ECQlCSVQxCisjZGVmaW5lIERNQV9TVEFSVF9DTUQJCShCSVQxK0JJVDApCisKKy8qOyBETUEgU3RhdHVzIFJlZy4oKzU0SCkgKHIpICovCisjZGVmaW5lIFBDSV9NU19BQk9SVAkJQklUNgorI2RlZmluZSBCTEFTVF9DT01QTEVURQkJQklUNQorI2RlZmluZSBTQ1NJX0lOVEVSUlVQVAkJQklUNAorI2RlZmluZSBETUFfWEZFUl9ET05FCQlCSVQzCisjZGVmaW5lIERNQV9YRkVSX0FCT1JUCQlCSVQyCisjZGVmaW5lIERNQV9YRkVSX0VSUk9SCQlCSVQxCisjZGVmaW5lIFBPV0VSX0RPV04JCUJJVDAKKworLyo7IERNQSBTQ1NJIEJ1cyBhbmQgQ3RybC4oKzcwSCkgKi8KKyNkZWZpbmUgRU5fSU5UX09OX1BDSV9BQk9SVAlCSVQyNQorI2RlZmluZSBXUlRfRVJBU0VfRE1BX1NUQVQJQklUMjQKKyNkZWZpbmUgUFdfRE9XTl9DVFJMCQlCSVQyMQorI2RlZmluZSBTQ1NJX0JVU1kJCUJJVDIwCisjZGVmaW5lIFNDTEsJCQlCSVQxOQorI2RlZmluZSBTQ0FNCQkJQklUMTgKKyNkZWZpbmUgU0NTSV9MSU5FUwkJMHgwMDAzZmZmZgorCisvKgorOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsgU0NTSSBDaGlwIHJlZ2lzdGVyIGFkZHJlc3Mgb2Zmc2V0Cis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorO1JlZ2lzdGVycyBhcmUgcncgdW5sZXNzIGRlY2xhcmVkIG90aGVyd2lzZSAKKyovCisjZGVmaW5lIEN0Y1JlZ19Mb3cJMHgwMAkvKiByCWN1cnIuIHRyYW5zZmVyIGNvdW50ICovCisjZGVmaW5lIEN0Y1JlZ19NaWQJMHgwNAkvKiByICovCisjZGVmaW5lIEN0Y1JlZ19IaWdoCTB4MzgJLyogciAqLworI2RlZmluZSBTY3NpRmlmbwkweDA4CisjZGVmaW5lIFNjc2lDbWQgCTB4MEMKKyNkZWZpbmUgU2NzaV9TdGF0dXMJMHgxMAkvKiByICovCisjZGVmaW5lIElOVF9TdGF0dXMJMHgxNAkvKiByICovCisjZGVmaW5lIFN5bmNfUGVyaW9kCTB4MTgJLyogdyAqLworI2RlZmluZSBTeW5jX09mZnNldAkweDFDCS8qIHcgKi8KKyNkZWZpbmUgQ2xrX0ZhY3RvcgkweDI0CS8qIHcgKi8KKyNkZWZpbmUgQ3RybFJlZzEJMHgyMAkKKyNkZWZpbmUgQ3RybFJlZzIJMHgyQworI2RlZmluZSBDdHJsUmVnMwkweDMwCisjZGVmaW5lIEN0cmxSZWc0CTB4MzQKKyNkZWZpbmUgRE1BX0NtZCAJMHg0MAorI2RlZmluZSBETUFfWGZlckNudAkweDQ0CS8qIHJ3CXN0YXJ0aW5nIHRyYW5zZmVyIGNvdW50ICgzMiBiaXQpICovCisjZGVmaW5lIERNQV9YZmVyQWRkcgkweDQ4CS8qIHJ3CXN0YXJ0aW5nIHBoeXNpY2FsIGFkZHJlc3MgKDMyIGJpdCkgKi8KKyNkZWZpbmUgRE1BX1drX0J5dGVDbnRyIDB4NEMJLyogcgl3b3JraW5nIGJ5dGUgY291bnRlciAqLworI2RlZmluZSBETUFfV2tfQWRkckNudHIgMHg1MAkvKiByCXdvcmtpbmcgYWRkcmVzcyBjb3VudGVyICovCisjZGVmaW5lIERNQV9TdGF0dXMJMHg1NAkvKiByICovCisjZGVmaW5lIERNQV9NRExfQWRkcgkweDU4CS8qIHJ3CXN0YXJ0aW5nIE1ETCBhZGRyZXNzICovCisjZGVmaW5lIERNQV9Xa19NRExfQ250ciAweDVDCS8qIHIJd29ya2luZyBNREwgY291bnRlciAqLworI2RlZmluZSBETUFfU2NzaUJ1c0N0cmwgMHg3MAkvKiBydwlTQ1NJIEJ1cywgUENJL0RNQSBDdHJsICovCisKKyNkZWZpbmUgU3RjUmVnX0xvdwlDdGNSZWdfTG93CS8qIHcJc3RhcnQgdHJhbnNmZXIgY291bnQgKi8KKyNkZWZpbmUgU3RjUmVnX01pZAlDdGNSZWdfTWlkCS8qIHcgKi8KKyNkZWZpbmUgU3RjUmVnX0hpZ2gJQ3RjUmVnX0hpZ2gJLyogdyAqLworI2RlZmluZSBTY3NpX0Rlc3RfSUQJU2NzaV9TdGF0dXMJLyogdyAqLworI2RlZmluZSBTY3NpX1RpbWVPdXQJSU5UX1N0YXR1cwkvKiB3ICovCisjZGVmaW5lIEludGVybl9TdGF0ZQlTeW5jX1BlcmlvZAkvKiByICovCisjZGVmaW5lIEN1cnJlbnRfRmlmbwlTeW5jX09mZnNldAkvKiByCUN1cnIuIEZJRk8gLyBpbnQuIHN0YXRlICovCisKKworI2RlZmluZSBEQzM5MF9yZWFkOChhZGRyZXNzKQkJCVwKKwkoaW5iIChwQUNCLT5JT1BvcnRCYXNlICsgKGFkZHJlc3MpKSkKKworI2RlZmluZSBEQzM5MF9yZWFkOF8oYWRkcmVzcywgYmFzZSkJCVwKKwkoaW5iICgodTE2KShiYXNlKSArIChhZGRyZXNzKSkpCisKKyNkZWZpbmUgREMzOTBfcmVhZDE2KGFkZHJlc3MpCQkJXAorCShpbncgKHBBQ0ItPklPUG9ydEJhc2UgKyAoYWRkcmVzcykpKQorCisjZGVmaW5lIERDMzkwX3JlYWQzMihhZGRyZXNzKQkJCVwKKwkoaW5sIChwQUNCLT5JT1BvcnRCYXNlICsgKGFkZHJlc3MpKSkKKworI2RlZmluZSBEQzM5MF93cml0ZTgoYWRkcmVzcyx2YWx1ZSkJCVwKKwlvdXRiICgodmFsdWUpLCBwQUNCLT5JT1BvcnRCYXNlICsgKGFkZHJlc3MpKQorCisjZGVmaW5lIERDMzkwX3dyaXRlOF8oYWRkcmVzcyx2YWx1ZSxiYXNlKQlcCisJb3V0YiAoKHZhbHVlKSwgKHUxNikoYmFzZSkgKyAoYWRkcmVzcykpCisKKyNkZWZpbmUgREMzOTBfd3JpdGUxNihhZGRyZXNzLHZhbHVlKQkJXAorCW91dHcgKCh2YWx1ZSksIHBBQ0ItPklPUG9ydEJhc2UgKyAoYWRkcmVzcykpCisKKyNkZWZpbmUgREMzOTBfd3JpdGUzMihhZGRyZXNzLHZhbHVlKQkJXAorCW91dGwgKCh2YWx1ZSksIHBBQ0ItPklPUG9ydEJhc2UgKyAoYWRkcmVzcykpCisKKworI2VuZGlmIC8qIF9UTVNDU0lNX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS91MTQtMzRmLmMgYi9kcml2ZXJzL3Njc2kvdTE0LTM0Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYTIxNTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvdTE0LTM0Zi5jCkBAIC0wLDAgKzEsMTk4NyBAQAorLyoKKyAqICAgICAgdTE0LTM0Zi5jIC0gTG93LWxldmVsIGRyaXZlciBmb3IgVWx0cmFTdG9yIDE0Ri8zNEYgU0NTSSBob3N0IGFkYXB0ZXJzLgorICoKKyAqICAgICAgMDMgSnVuIDIwMDMgUmV2LiA4LjEwIGZvciBsaW51eC0yLjUuNzAKKyAqICAgICAgICArIFVwZGF0ZSBmb3IgbmV3IElSUSBBUEkuCisgKiAgICAgICAgKyBVc2UgImdvdG8iIHdoZW4gYXBwcm9wcmlhdGUuCisgKiAgICAgICAgKyBEcm9wIHUxNC0zNGYuaC4KKyAqICAgICAgICArIFVwZGF0ZSBmb3IgbmV3IG1vZHVsZV9wYXJhbSBBUEkuCisgKiAgICAgICAgKyBNb2R1bGUgcGFyYW1ldGVycyAgY2FuIG5vdyBiZSBzcGVjaWZpZWQgb25seSBpbiB0aGUKKyAqICAgICAgICAgIHNhbWUgZm9ybWF0IGFzIHRoZSBrZXJuZWwgYm9vdCBvcHRpb25zLgorICoKKyAqICAgICAgICAgICAgIGJvb3Qgb3B0aW9uICAgIG9sZCBtb2R1bGUgcGFyYW0gCisgKiAgICAgICAgICAgICAtLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgIGFkZHIsLi4uICAgICAgIGlvX3BvcnQ9YWRkciwuLi4KKyAqICAgICAgICAgICAgIGxjOlt5fG5dICAgICAgIGxpbmtlZF9jb21tPVsxfDBdCisgKiAgICAgICAgICAgICBtcTp4eCAgICAgICAgICBtYXhfcXVldWVfZGVwdGg9eHgKKyAqICAgICAgICAgICAgIHRtOlswfDF8Ml0gICAgIHRhZ19tb2RlPVswfDF8Ml0KKyAqICAgICAgICAgICAgIGV0Olt5fG5dICAgICAgIGV4dF90cmFuPVsxfDBdCisgKiAgICAgICAgICAgICBvZjpbeXxuXSAgICAgICBoYXZlX29sZF9maXJtd2FyZT1bMXwwXQorICoKKyAqICAgICAgICAgIEEgdmFsaWQgZXhhbXBsZSB1c2luZyB0aGUgbmV3IHBhcmFtZXRlciBmb3JtYXQgaXM6CisgKiAgICAgICAgICBtb2Rwcm9iZSB1MTQtMzRmICJ1MTQtMzRmPTB4MzQwLDB4MzMwLGxjOnksdG06MCxtcTo0IgorICoKKyAqICAgICAgICAgIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIG9sZCBmb3JtYXQ6CisgKiAgICAgICAgICBtb2Rwcm9iZSB1MTQtMzRmIGlvX3BvcnQ9MHgzNDAsMHgzMzAgbGlua2VkX2NvbW09MSB0YWdfbW9kZT0wIFwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3F1ZXVlX2RlcHRoPTQKKyAqCisgKiAgICAgICAgICBXaXRoIGFjdHVhbCBtb2R1bGUgY29kZSwgdTE0LTM0ZiBhbmQgdTE0XzM0ZiBhcmUgZXF1aXZhbGVudAorICogICAgICAgICAgYXMgbW9kdWxlIHBhcmFtZXRlciBuYW1lcy4KKyAqCisgKiAgICAgIDEyIEZlYiAyMDAzIFJldi4gOC4wNCBmb3IgbGludXggMi41LjYwCisgKiAgICAgICAgKyBSZWxlYXNlIGlycSBiZWZvcmUgY2FsbGluZyBzY3NpX3JlZ2lzdGVyLgorICoKKyAqICAgICAgMTIgTm92IDIwMDIgUmV2LiA4LjAyIGZvciBsaW51eCAyLjUuNDcKKyAqICAgICAgICArIFJlbGVhc2UgZHJpdmVyX2xvY2sgYmVmb3JlIGNhbGxpbmcgc2NzaV9yZWdpc3Rlci4KKyAqCisgKiAgICAgIDExIE5vdiAyMDAyIFJldi4gOC4wMSBmb3IgbGludXggMi41LjQ3CisgKiAgICAgICAgKyBGaXhlZCBiaW9zX3BhcmFtIGFuZCBzY3NpY2FtX2Jpb3NfcGFyYW0gY2FsbGluZyBwYXJhbWV0ZXJzLgorICoKKyAqICAgICAgMjggT2N0IDIwMDIgUmV2LiA4LjAwIGZvciBsaW51eCAyLjUuNDQtYWM0CisgKiAgICAgICAgKyBVc2UgbmV3IHRjcSBhbmQgYWRqdXN0X3F1ZXVlX2RlcHRoIGFwaS4KKyAqICAgICAgICArIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uICh0bTpbMC0yXSkgdG8gY2hvb3NlIHRoZSB0eXBlIG9mIHRhZ3M6CisgKiAgICAgICAgICAwIC0+IGRpc2FibGUgdGFnZ2luZyA7IDEgLT4gc2ltcGxlIHRhZ3MgIDsgMiAtPiBvcmRlcmVkIHRhZ3MuCisgKiAgICAgICAgICBEZWZhdWx0IGlzIHRtOjAgKHRhZ2dlZCBjb21tYW5kcyBkaXNhYmxlZCkuCisgKiAgICAgICAgICBGb3IgY29tcGF0aWJpbGl0eSB0aGUgInRjOiIgb3B0aW9uIGlzIGFuIGFsaWFzIG9mIHRoZSAidG06IgorICogICAgICAgICAgb3B0aW9uOyB0YzpuIGlzIGVxdWl2YWxlbnQgdG8gdG06MCBhbmQgdGM6eSBpcyBlcXVpdmFsZW50IHRvCisgKiAgICAgICAgICB0bToxLgorICoKKyAqICAgICAgMTAgT2N0IDIwMDIgUmV2LiA3LjcwIGZvciBsaW51eCAyLjUuNDIKKyAqICAgICAgICArIEZvcmVwb3J0IGZyb20gcmV2aXNpb24gNi43MC4KKyAqCisgKiAgICAgIDI1IEp1biAyMDAyIFJldi4gNi43MCBmb3IgbGludXggMi40LjE5CisgKiAgICAgICAgKyBGaXhlZCBlbmRpYW4tbmVzcyBwcm9ibGVtIGR1ZSB0byBiaXRmaWVsZHMuCisgKgorICogICAgICAyMSBGZWIgMjAwMiBSZXYuIDYuNTIgZm9yIGxpbnV4IDIuNC4xOAorICogICAgICAgICsgQmFja3BvcnQgZnJvbSByZXYuIDcuMjIgKHVzZSBpb19yZXF1ZXN0X2xvY2spLgorICoKKyAqICAgICAgMjAgRmViIDIwMDIgUmV2LiA3LjIyIGZvciBsaW51eCAyLjUuNQorICogICAgICAgICsgUmVtb3ZlIGFueSByZWZlcmVuY2UgdG8gdmlydF90b19idXMoKS4KKyAqICAgICAgICArIEZpeCBwaW8gaGFuZyB3aGlsZSBkZXRlY3RpbmcgbXVsdGlwbGUgSEJBcy4KKyAqCisgKiAgICAgIDAxIEphbiAyMDAyIFJldi4gNy4yMCBmb3IgbGludXggMi41LjEKKyAqICAgICAgICArIFVzZSB0aGUgZHluYW1pYyBETUEgbWFwcGluZyBBUEkuCisgKgorICogICAgICAxOSBEZWMgMjAwMSBSZXYuIDcuMDIgZm9yIGxpbnV4IDIuNS4xCisgKiAgICAgICAgKyBVc2UgU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uIGlmIHNldC4KKyAqICAgICAgICArIFVzZSBzZ2xpc3QucGFnZSBpbnN0ZWFkIG9mIHNnbGlzdC5hZGRyZXNzLgorICoKKyAqICAgICAgMTEgRGVjIDIwMDEgUmV2LiA3LjAwIGZvciBsaW51eCAyLjUuMQorICogICAgICAgICsgVXNlIGhvc3QtPmhvc3RfbG9jayBpbnN0ZWFkIG9mIGlvX3JlcXVlc3RfbG9jay4KKyAqCisgKiAgICAgICAxIE1heSAyMDAxIFJldi4gNi4wNSBmb3IgbGludXggMi40LjQKKyAqICAgICAgICArIEZpeCBkYXRhIHRyYW5zZmVyIGRpcmVjdGlvbiBmb3Igb3Bjb2RlIFNFTkRfQ1VFX1NIRUVUICgweDVkKQorICoKKyAqICAgICAgMjUgSmFuIDIwMDEgUmV2LiA2LjAzIGZvciBsaW51eCAyLjQuMAorICogICAgICAgICsgImNoZWNrX3JlZ2lvbiIgY2FsbCByZXBsYWNlZCBieSAicmVxdWVzdF9yZWdpb24iLgorICoKKyAqICAgICAgMjIgTm92IDIwMDAgUmV2LiA2LjAyIGZvciBsaW51eCAyLjQuMC10ZXN0MTEKKyAqICAgICAgICArIFJlbW92ZWQgb2xkIHNjc2kgZXJyb3IgaGFuZGxpbmcgc3VwcG9ydC4KKyAqICAgICAgICArIFRoZSBvYnNvbGV0ZSBib290IG9wdGlvbiBmbGFnIGVoOm4gaXMgc2lsZW50bHkgaWdub3JlZC4KKyAqICAgICAgICArIFJlbW92ZWQgZXJyb3IgbWVzc2FnZXMgd2hpbGUgYSBkaXNrIGRyaXZlIGlzIHBvd2VyZWQgdXAgYXQKKyAqICAgICAgICAgIGJvb3QgdGltZS4KKyAqICAgICAgICArIEltcHJvdmVkIGJvb3QgbWVzc2FnZXM6IGFsbCB0YWdnZWQgY2FwYWJsZSBkZXZpY2UgYXJlCisgKiAgICAgICAgICBpbmRpY2F0ZWQgYXMgInRhZ2dlZCIuCisgKgorICogICAgICAxNiBTZXAgMTk5OSBSZXYuIDUuMTEgZm9yIGxpbnV4IDIuMi4xMiBhbmQgMi4zLjE4CisgKiAgICAgICAgKyBVcGRhdGVkIHRvIHRoZSBuZXcgX19zZXR1cCBpbnRlcmZhY2UgZm9yIGJvb3QgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisgKiAgICAgICAgKyBXaGVuIGxvYWRlZCBhcyBhIG1vZHVsZSwgYWNjZXB0cyB0aGUgbmV3IHBhcmFtZXRlciBib290X29wdGlvbnMKKyAqICAgICAgICAgIHdoaWNoIHZhbHVlIGlzIGEgc3RyaW5nIHdpdGggdGhlIHNhbWUgZm9ybWF0IG9mIHRoZSBrZXJuZWwgYm9vdAorICogICAgICAgICAgY29tbWFuZCBsaW5lIG9wdGlvbnMuIEEgdmFsaWQgZXhhbXBsZSBpczoKKyAqICAgICAgICAgIG1vZHByb2JlIHUxNC0zNGYgJ2Jvb3Rfb3B0aW9ucz0iMHgyMzAsMHgzNDAsbGM6eSxtcTo0IicKKyAqCisgKiAgICAgIDIyIEp1bCAxOTk5IFJldi4gNS4wMCBmb3IgbGludXggMi4yLjEwIGFuZCAyLjMuMTEKKyAqICAgICAgICArIFJlbW92ZWQgcHJlLTIuMiBzb3VyY2UgY29kZSBjb21wYXRpYmlsaXR5LgorICoKKyAqICAgICAgMjYgSnVsIDE5OTggUmV2LiA0LjMzIGZvciBsaW51eCAyLjAuMzUgYW5kIDIuMS4xMTEKKyAqICAgICAgICAgIEFkZGVkIGNvbW1hbmQgbGluZSBvcHRpb24gKGV0Olt5fG5dKSB0byB1c2UgdGhlIGV4aXN0aW5nCisgKiAgICAgICAgICB0cmFuc2xhdGlvbiAocmV0dXJuZWQgYnkgc2NzaWNhbV9iaW9zX3BhcmFtKSBhcyBkaXNrIGdlb21ldHJ5LgorICogICAgICAgICAgVGhlIGRlZmF1bHQgaXMgZXQ6biwgd2hpY2ggdXNlcyB0aGUgZGlzayBnZW9tZXRyeSBqdW1wZXJlZAorICogICAgICAgICAgb24gdGhlIGJvYXJkLgorICogICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZXQ6biBpcyBjb21wYXRpYmxlIHdpdGggYWxsIHByZXZpb3VzIHJldmlzaW9ucworICogICAgICAgICAgb2YgdGhpcyBkcml2ZXIuCisgKgorICogICAgICAyOCBNYXkgMTk5OCBSZXYuIDQuMzIgZm9yIGxpbnV4IDIuMC4zMyBhbmQgMi4xLjEwNAorICogICAgICAgICAgSW5jcmVhc2VkIGJ1c3kgdGltZW91dCBmcm9tIDEwIG1zZWMuIHRvIDIwMCBtc2VjLiB3aGlsZQorICogICAgICAgICAgcHJvY2Vzc2luZyBpbnRlcnJ1cHRzLgorICoKKyAqICAgICAgMTggTWF5IDE5OTggUmV2LiA0LjMxIGZvciBsaW51eCAyLjAuMzMgYW5kIDIuMS4xMDIKKyAqICAgICAgICAgIEltcHJvdmVkIGFib3J0IGhhbmRsaW5nIGR1cmluZyB0aGUgZWggcmVjb3ZlcnkgcHJvY2Vzcy4KKyAqCisgKiAgICAgIDEzIE1heSAxOTk4IFJldi4gNC4zMCBmb3IgbGludXggMi4wLjMzIGFuZCAyLjEuMTAxCisgKiAgICAgICAgICBUaGUgZHJpdmVyIGlzIG5vdyBmdWxseSBTTVAgc2FmZSwgaW5jbHVkaW5nIHRoZQorICogICAgICAgICAgYWJvcnQgYW5kIHJlc2V0IHJvdXRpbmVzLgorICogICAgICAgICAgQWRkZWQgY29tbWFuZCBsaW5lIG9wdGlvbnMgKGVoOlt5fG5dKSB0byBjaG9vc2UgYmV0d2VlbgorICogICAgICAgICAgbmV3X2VoX2NvZGUgYW5kIHRoZSBvbGQgc2NzaSBjb2RlLgorICogICAgICAgICAgSWYgbGludXggdmVyc2lvbiA+PSAyLjEuMTAxIHRoZSBkZWZhdWx0IGlzIGVoOnksIHdoaWxlIHRoZSBlaAorICogICAgICAgICAgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIHByZXZpb3VzIHJlbGVhc2VzIGFuZCB0aGUgb2xkIHNjc2kgY29kZQorICogICAgICAgICAgaXMgdXNlZC4KKyAqCisgKiAgICAgIDE4IEFwciAxOTk4IFJldi4gNC4yMCBmb3IgbGludXggMi4wLjMzIGFuZCAyLjEuOTcKKyAqICAgICAgICAgIFJld29ya2VkIGludGVycnVwdCBoYW5kbGVyLgorICoKKyAqICAgICAgMTEgQXByIDE5OTggcmV2LiA0LjA1IGZvciBsaW51eCAyLjAuMzMgYW5kIDIuMS45NQorICogICAgICAgICAgTWFqb3IgcmVsaWFiaWxpdHkgaW1wcm92ZW1lbnQ6IHdoZW4gYSBiYXRjaCB3aXRoIG92ZXJsYXBwaW5nCisgKiAgICAgICAgICByZXF1ZXN0cyBpcyBkZXRlY3RlZCwgcmVxdWVzdHMgYXJlIHF1ZXVlZCBvbmUgYXQgYSB0aW1lCisgKiAgICAgICAgICBlbGltaW5hdGluZyBhbnkgcG9zc2libGUgYm9hcmQgb3IgZHJpdmUgcmVvcmRlcmluZy4KKyAqCisgKiAgICAgIDEwIEFwciAxOTk4IHJldi4gNC4wNCBmb3IgbGludXggMi4wLjMzIGFuZCAyLjEuOTUKKyAqICAgICAgICAgIEltcHJvdmVkIFNNUCBzdXBwb3J0IChpZiBsaW51eCB2ZXJzaW9uID49IDIuMS45NSkuCisgKgorICogICAgICAgOSBBcHIgMTk5OCByZXYuIDQuMDMgZm9yIGxpbnV4IDIuMC4zMyBhbmQgMi4xLjk0CisgKiAgICAgICAgICBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudDogd2hlbiBzZXF1ZW50aWFsIGkvbyBpcyBkZXRlY3RlZCwKKyAqICAgICAgICAgIGFsd2F5cyB1c2UgZGlyZWN0IHNvcnQgaW5zdGVhZCBvZiByZXZlcnNlIHNvcnQuCisgKgorICogICAgICAgNCBBcHIgMTk5OCByZXYuIDQuMDIgZm9yIGxpbnV4IDIuMC4zMyBhbmQgMi4xLjkyCisgKiAgICAgICAgICBpb19wb3J0IGlzIG5vdyB1bnNpZ25lZCBsb25nLgorICoKKyAqICAgICAgMTcgTWFyIDE5OTggcmV2LiA0LjAxIGZvciBsaW51eCAyLjAuMzMgYW5kIDIuMS44OAorICogICAgICAgICAgVXNlIG5ldyBzY3NpIGVycm9yIGhhbmRsaW5nIGNvZGUgKGlmIGxpbnV4IHZlcnNpb24gPj0gMi4xLjg4KS4KKyAqICAgICAgICAgIFVzZSBuZXcgaW50ZXJydXB0IGNvZGUuCisgKgorICogICAgICAxMiBTZXAgMTk5NyByZXYuIDMuMTEgZm9yIGxpbnV4IDIuMC4zMCBhbmQgMi4xLjU1CisgKiAgICAgICAgICBVc2Ugb2YgdWRlbGF5IGluc2lkZSB0aGUgd2FpdCBsb29wcyB0byBhdm9pZCB0aW1lb3V0CisgKiAgICAgICAgICBwcm9ibGVtcyB3aXRoIGZhc3QgY3B1cy4KKyAqICAgICAgICAgIFJlbW92ZWQgY2hlY2sgYWJvdXQgdXNlbGVzcyBjYWxscyB0byB0aGUgaW50ZXJydXB0IHNlcnZpY2UKKyAqICAgICAgICAgIHJvdXRpbmUgKHJlcG9ydGVkIG9uIFNNUCBzeXN0ZW1zIG9ubHkpLgorICogICAgICAgICAgQXQgaW5pdGlhbGl6YXRpb24gdGltZSAic29ydGVkL3Vuc29ydGVkIiBpcyBkaXNwbGF5ZWQgaW5zdGVhZAorICogICAgICAgICAgb2YgImxpbmtlZC91bmxpbmtlZCIgdG8gcmVpbmZvcmNlIHRoZSBmYWN0IHRoYXQgImxpbmtpbmciIGlzCisgKiAgICAgICAgICBub3RoaW5nIGJ1dCAiZWxldmF0b3Igc29ydGluZyIgaW4gdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiAgICAgIDE3IE1heSAxOTk3IHJldi4gMy4xMCBmb3IgbGludXggMi4wLjMwIGFuZCAyLjEuMzgKKyAqICAgICAgICAgIFVzZSBvZiBzZXJpYWxfbnVtYmVyX2F0X3RpbWVvdXQgaW4gYWJvcnQgYW5kIHJlc2V0IHByb2Nlc3NpbmcuCisgKiAgICAgICAgICBVc2Ugb2YgdGhlIF9faW5pdGZ1bmMgYW5kIF9faW5pdGRhdGEgbWFjcm8gaW4gc2V0dXAgY29kZS4KKyAqICAgICAgICAgIE1pbm9yIGNsZWFudXBzIGluIHRoZSBsaXN0X3N0YXRpc3RpY3MgY29kZS4KKyAqCisgKiAgICAgIDI0IEZlYiAxOTk3IHJldi4gMy4wMCBmb3IgbGludXggMi4wLjI5IGFuZCAyLjEuMjYKKyAqICAgICAgICAgIFdoZW4gbG9hZGluZyBhcyBhIG1vZHVsZSwgcGFyYW1ldGVyIHBhc3NpbmcgaXMgbm93IHN1cHBvcnRlZAorICogICAgICAgICAgYm90aCBpbiAyLjAgYW5kIGluIDIuMSBzdHlsZS4KKyAqICAgICAgICAgIEZpeGVkIGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uIGZvciBzb21lIFNDU0kgb3Bjb2Rlcy4KKyAqICAgICAgICAgIEltbWVkaWF0ZSBhY2tub3dsZWRnZSB0byByZXF1ZXN0IHNlbnNlIGNvbW1hbmRzLgorICogICAgICAgICAgTGlua2VkIGNvbW1hbmRzIHRvIGVhY2ggZGlzayBkZXZpY2UgYXJlIG5vdyByZW9yZGVyZWQgYnkgZWxldmF0b3IKKyAqICAgICAgICAgIHNvcnRpbmcuIFJhcmUgY2FzZXMgaW4gd2hpY2ggcmVvcmRlcmluZyBvZiB3cml0ZSByZXF1ZXN0cyBjb3VsZAorICogICAgICAgICAgY2F1c2Ugd3JvbmcgcmVzdWx0cyBhcmUgbWFuYWdlZC4KKyAqCisgKiAgICAgIDE4IEphbiAxOTk3IHJldi4gMi42MCBmb3IgbGludXggMi4xLjIxIGFuZCAyLjAuMjgKKyAqICAgICAgICAgIEFkZGVkIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIGVuYWJsZS9kaXNhYmxlIGxpbmtlZCBjb21tYW5kcworICogICAgICAgICAgKGxjOlt5fG5dKSwgb2xkIGZpcm13YXJlIHN1cHBvcnQgKG9mOlt5fG5dKSBhbmQgdG8gc2V0IHRoZSBtYXgKKyAqICAgICAgICAgIHF1ZXVlIGRlcHRoIChtcTp4eCkuIERlZmF1bHQgaXMgInUxNC0zNGY9bGM6bixvZjpuLG1xOjgiLgorICogICAgICAgICAgSW1wcm92ZWQgY29tbWFuZCBsaW5raW5nLgorICoKKyAqICAgICAgIDggSmFuIDE5OTcgcmV2LiAyLjUwIGZvciBsaW51eCAyLjEuMjAgYW5kIDIuMC4yNworICogICAgICAgICAgQWRkZWQgbGlua2VkIGNvbW1hbmQgc3VwcG9ydC4KKyAqCisgKiAgICAgICAzIERlYyAxOTk2IHJldi4gMi40MCBmb3IgbGludXggMi4xLjE0IGFuZCAyLjAuMjcKKyAqICAgICAgICAgIEFkZGVkIHF1ZXVlIGRlcHRoIGFkanVzdG1lbnQuCisgKgorICogICAgICAyMiBOb3YgMTk5NiByZXYuIDIuMzAgZm9yIGxpbnV4IDIuMS4xMiBhbmQgMi4wLjI2CisgKiAgICAgICAgICBUaGUgbGlzdCBvZiBpL28gcG9ydHMgdG8gYmUgcHJvYmVkIGNhbiBiZSBvdmVyd3JpdHRlbiBieSB0aGUKKyAqICAgICAgICAgICJ1MTQtMzRmPXBvcnQwLHBvcnQxLC4uLi4iIGJvb3QgY29tbWFuZCBsaW5lIG9wdGlvbi4KKyAqICAgICAgICAgIFNjYXR0ZXIvZ2F0aGVyIGxpc3RzIGFyZSBub3cgYWxsb2NhdGVkIGJ5IGEgbnVtYmVyIG9mIGttYWxsb2MKKyAqICAgICAgICAgIGNhbGxzLCBpbiBvcmRlciB0byBhdm9pZCB0aGUgcHJldmlvdXMgc2l6ZSBsaW1pdCBvZiA2NEtiLgorICoKKyAqICAgICAgMTYgTm92IDE5OTYgcmV2LiAyLjIwIGZvciBsaW51eCAyLjEuMTAgYW5kIDIuMC4yNQorICogICAgICAgICAgQWRkZWQgbXVsdGljaGFubmVsIHN1cHBvcnQuCisgKgorICogICAgICAyNyBTZXAgMTk5NiByZXYuIDIuMTIgZm9yIGxpbnV4IDIuMS4wCisgKiAgICAgICAgICBQb3J0YWJpbGl0eSBjbGVhbnVwcyAodmlydHVhbC9idXMgYWRkcmVzc2luZywgbGl0dGxlL2JpZyBlbmRpYW4KKyAqICAgICAgICAgIHN1cHBvcnQpLgorICoKKyAqICAgICAgMDkgSnVsIDE5OTYgcmV2LiAyLjExIGZvciBsaW51eCAyLjAuNAorICogICAgICAgICAgIkRhdGEgb3Zlci91bmRlci1ydW4iIG5vIGxvbmdlciBpbXBsaWVzIGEgcmVkbyBvbiBhbGwgdGFyZ2V0cy4KKyAqICAgICAgICAgIE51bWJlciBvZiBpbnRlcm5hbCByZXRyaWVzIGlzIG5vdyBsaW1pdGVkLgorICoKKyAqICAgICAgMTYgQXByIDE5OTYgcmV2LiAyLjEwIGZvciBsaW51eCAxLjMuOTAKKyAqICAgICAgICAgIE5ldyBhcmd1bWVudCAicmVzZXRfZmxhZ3MiIHRvIHRoZSByZXNldCByb3V0aW5lLgorICoKKyAqICAgICAgMjEgSnVsIDE5OTUgcmV2LiAyLjAyIGZvciBsaW51eCAxLjMuMTEKKyAqICAgICAgICAgIEZpeGVkIERhdGEgVHJhbnNmZXIgRGlyZWN0aW9uIGZvciBzb21lIFNDU0kgY29tbWFuZHMuCisgKgorICogICAgICAxMyBKdW4gMTk5NSByZXYuIDIuMDEgZm9yIGxpbnV4IDEuMi4xMAorICogICAgICAgICAgSEFWRV9PTERfVVg0Rl9GSVJNV0FSRSBzaG91bGQgYmUgZGVmaW5lZCBmb3IgVTM0RiBib2FyZHMgd2hlbgorICogICAgICAgICAgdGhlIGZpcm13YXJlIHByb20gaXMgbm90IHRoZSBsYXRlc3Qgb25lICgyODAwOC0wMDYpLgorICoKKyAqICAgICAgMTEgTWFyIDE5OTUgcmV2LiAyLjAwIGZvciBsaW51eCAxLjIuMAorICogICAgICAgICAgRml4ZWQgYSBidWcgd2hpY2ggcHJldmVudGVkIG1lZGlhIGNoYW5nZSBkZXRlY3Rpb24gZm9yIHJlbW92YWJsZQorICogICAgICAgICAgZGlzayBkcml2ZXMuCisgKgorICogICAgICAyMyBGZWIgMTk5NSByZXYuIDEuMTggZm9yIGxpbnV4IDEuMS45NAorICogICAgICAgICAgQWRkZWQgYSBjaGVjayBmb3Igc2NzaV9yZWdpc3RlciByZXR1cm5pbmcgTlVMTC4KKyAqCisgKiAgICAgIDExIEZlYiAxOTk1IHJldi4gMS4xNyBmb3IgbGludXggMS4xLjkxCisgKiAgICAgICAgICBVMTRGIHF1YWxpZmllZCB0byBydW4gd2l0aCAzMiBzZ2xpc3RzLgorICogICAgICAgICAgTm93IERFQlVHX1JFU0VUIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisgKgorICogICAgICAgOSBGZWIgMTk5NSByZXYuIDEuMTYgZm9yIGxpbnV4IDEuMS45MAorICogICAgICAgICAgVXNlIGhvc3QtPndpc2hfYmxvY2sgaW5zdGVhZCBvZiBob3N0LT5ibG9jay4KKyAqCisgKiAgICAgICA4IEZlYiAxOTk1IHJldi4gMS4xNSBmb3IgbGludXggMS4xLjg5CisgKiAgICAgICAgICBDbGVhcmVkIHRhcmdldF90aW1lX291dCBjb3VudGVyIHdoaWxlIHBlcmZvcm1pbmcgYSByZXNldC4KKyAqCisgKiAgICAgIDI4IEphbiAxOTk1IHJldi4gMS4xNCBmb3IgbGludXggMS4xLjg2CisgKiAgICAgICAgICBBZGRlZCBtb2R1bGUgc3VwcG9ydC4KKyAqICAgICAgICAgIExvZyBhbmQgZG8gYSByZXRyeSB3aGVuIGEgZGlzayBkcml2ZSByZXR1cm5zIGEgdGFyZ2V0IHN0YXR1cworICogICAgICAgICAgZGlmZmVyZW50IGZyb20gemVybyBvbiBhIHJlY292ZXJlZCBlcnJvci4KKyAqICAgICAgICAgIEF1dG8gZGV0ZWN0cyBpZiBVMTRGIGJvYXJkcyBoYXZlIGFuIG9sZCBmaXJtd2FyZSByZXZpc2lvbi4KKyAqICAgICAgICAgIE1heCBudW1iZXIgb2Ygc2NhdHRlci9nYXRoZXIgbGlzdHMgc2V0IHRvIDE2IGZvciBhbGwgYm9hcmRzCisgKiAgICAgICAgICAobW9zdCBpbnN0YWxsYXRpb24gcnVuIGZpbmUgdXNpbmcgMzMgc2dsaXN0cywgd2hpbGUgb3RoZXIKKyAqICAgICAgICAgIGhhcyBwcm9ibGVtcyB3aGVuIHVzaW5nIG1vcmUgdGhhbiAxNikuCisgKgorICogICAgICAxNiBKYW4gMTk5NSByZXYuIDEuMTMgZm9yIGxpbnV4IDEuMS44MQorICogICAgICAgICAgRGlzcGxheSBhIG1lc3NhZ2UgaWYgY2hlY2tfcmVnaW9uIGRldGVjdHMgYSBwb3J0IGFkZHJlc3MKKyAqICAgICAgICAgIGFscmVhZHkgaW4gdXNlLgorICoKKyAqICAgICAgMTUgRGVjIDE5OTQgcmV2LiAxLjEyIGZvciBsaW51eCAxLjEuNzQKKyAqICAgICAgICAgIFRoZSBob3N0LT5ibG9jayBmbGFnIGlzIHNldCBmb3IgYWxsIHRoZSBkZXRlY3RlZCBJU0EgYm9hcmRzLgorICoKKyAqICAgICAgMzAgTm92IDE5OTQgcmV2LiAxLjExIGZvciBsaW51eCAxLjEuNjgKKyAqICAgICAgICAgIFJlZG8gaS9vIG9uIHRhcmdldCBzdGF0dXMgQ0hFQ0tfQ09ORElUSU9OIGZvciBUWVBFX0RJU0sgb25seS4KKyAqICAgICAgICAgIEFkZGVkIG9wdGlvbmFsIHN1cHBvcnQgZm9yIHVzaW5nIGEgc2luZ2xlIGJvYXJkIGF0IGEgdGltZS4KKyAqCisgKiAgICAgIDE0IE5vdiAxOTk0IHJldi4gMS4xMCBmb3IgbGludXggMS4xLjYzCisgKgorICogICAgICAyOCBPY3QgMTk5NCByZXYuIDEuMDkgZm9yIGxpbnV4IDEuMS41OCAgRmluYWwgQkVUQSByZWxlYXNlLgorICogICAgICAxNiBKdWwgMTk5NCByZXYuIDEuMDAgZm9yIGxpbnV4IDEuMS4yOSAgSW5pdGlhbCBBTFBIQSByZWxlYXNlLgorICoKKyAqICAgICAgICAgIFRoaXMgZHJpdmVyIGlzIGEgdG90YWwgcmVwbGFjZW1lbnQgb2YgdGhlIG9yaWdpbmFsIFVsdHJhU3RvcgorICogICAgICAgICAgc2NzaSBkcml2ZXIsIGJ1dCBpdCBzdXBwb3J0cyBPTkxZIHRoZSAxNEYgYW5kIDM0RiBib2FyZHMuCisgKiAgICAgICAgICBJdCBjYW4gYmUgY29uZmlndXJlZCBpbiB0aGUgc2FtZSBrZXJuZWwgaW4gd2hpY2ggdGhlIG9yaWdpbmFsCisgKiAgICAgICAgICB1bHRyYXN0b3IgZHJpdmVyIGlzIGNvbmZpZ3VyZWQgdG8gYWxsb3cgdGhlIG9yaWdpbmFsIFUyNEYKKyAqICAgICAgICAgIHN1cHBvcnQuCisgKgorICogICAgICAgICAgTXVsdGlwbGUgVTE0RiBhbmQvb3IgVTM0RiBob3N0IGFkYXB0ZXJzIGFyZSBzdXBwb3J0ZWQuCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NC0yMDAzIERhcmlvIEJhbGxhYmlvIChiYWxsYWJpb19kYXJpb0BlbWMuY29tKQorICoKKyAqICBBbHRlcm5hdGUgZW1haWw6IGRhcmlvLmJhbGxhYmlvQGlud2luZC5pdCwgZGFyaW8uYmFsbGFiaW9AdGlzY2FsaW5ldC5pdAorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlCisgKiAgY29kZSByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgY29tbWVudCB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLgorICoKKyAqICAgICAgV0FSTklORzogaWYgeW91ciAxNC8zNEYgYm9hcmQgaGFzIGFuIG9sZCBmaXJtd2FyZSByZXZpc2lvbiAoc2VlIGJlbG93KQorICogICAgICAgICAgICAgICB5b3UgbXVzdCBjaGFuZ2UgIiN1bmRlZiIgaW50byAiI2RlZmluZSIgaW4gdGhlIGZvbGxvd2luZworICogICAgICAgICAgICAgICBzdGF0ZW1lbnQuCisgKi8KKyN1bmRlZiBIQVZFX09MRF9VWDRGX0ZJUk1XQVJFCisvKgorICogIFRoZSBVbHRyYVN0b3IgMTRGLCAyNEYsIGFuZCAzNEYgYXJlIGEgZmFtaWx5IG9mIGludGVsbGlnZW50LCBoaWdoCisgKiAgcGVyZm9ybWFuY2UgU0NTSS0yIGhvc3QgYWRhcHRlcnMuCisgKiAgSGVyZSBpcyB0aGUgc2Nvb3Agb24gdGhlIHZhcmlvdXMgbW9kZWxzOgorICoKKyAqICAxNEYgLSBJU0EgZmlyc3QtcGFydHkgRE1BIEhBIHdpdGggZmxvcHB5IHN1cHBvcnQgYW5kIFdEMTAwMyBlbXVsYXRpb24uCisgKiAgMjRGIC0gRUlTQSBCdXMgTWFzdGVyIEhBIHdpdGggZmxvcHB5IHN1cHBvcnQgYW5kIFdEMTAwMyBlbXVsYXRpb24uCisgKiAgMzRGIC0gVkVTQSBMb2NhbC1CdXMgQnVzIE1hc3RlciBIQSAobm8gV0QxMDAzIGVtdWxhdGlvbikuCisgKgorICogIFRoaXMgY29kZSBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCB1cCB0byB0d28gVTE0RiBib2FyZHMsIHVzaW5nIGJvdGgKKyAqICBmaXJtd2FyZSAyODAwNC0wMDUvMzgwMDQtMDA0IChCSU9TIHJldi4gMi4wMCkgYW5kIHRoZSBsYXRlc3QgZmlybXdhcmUKKyAqICAyODAwNC0wMDYvMzgwMDQtMDA1IChCSU9TIHJldi4gMi4wMSkuCisgKgorICogIFRoZSBsYXRlc3QgZmlybXdhcmUgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gZ2V0IHJlbGlhYmxlIG9wZXJhdGlvbnMgd2hlbgorICogIGNsdXN0ZXJpbmcgaXMgZW5hYmxlZC4gRU5BQkxFX0NMVVNURVJJTkcgcHJvdmlkZXMgYSBwZXJmb3JtYW5jZSBpbmNyZWFzZQorICogIHVwIHRvIDUwJSBvbiBzZXF1ZW50aWFsIGFjY2Vzcy4KKyAqCisgKiAgU2luY2UgdGhlIFNjc2lfSG9zdF9UZW1wbGF0ZSBzdHJ1Y3R1cmUgaXMgc2hhcmVkIGFtb25nIGFsbCAxNEYgYW5kIDM0RiwKKyAqICB0aGUgbGFzdCBzZXR0aW5nIG9mIHVzZV9jbHVzdGVyaW5nIGlzIGluIGVmZmVjdCBmb3IgYWxsIG9mIHRoZXNlIGJvYXJkcy4KKyAqCisgKiAgSGVyZSBhIHNhbXBsZSBjb25maWd1cmF0aW9uIHVzaW5nIHR3byBVMTRGIGJvYXJkczoKKyAqCisgVTE0RjA6IElTQSAweDMzMCwgQklPUyAweGM4MDAwLCBJUlEgMTEsIERNQSA1LCBTRyAzMiwgTUIgMTYsIG9mOm4sIGxjOnksIG1xOjguCisgVTE0RjE6IElTQSAweDM0MCwgQklPUyAweDAwMDAwLCBJUlEgMTAsIERNQSA2LCBTRyAzMiwgTUIgMTYsIG9mOm4sIGxjOnksIG1xOjguCisgKgorICogIFRoZSBib290IGNvbnRyb2xsZXIgbXVzdCBoYXZlIGl0cyBCSU9TIGVuYWJsZWQsIHdoaWxlIG90aGVyIGJvYXJkcyBjYW4KKyAqICBoYXZlIHRoZWlyIEJJT1MgZGlzYWJsZWQsIG9yIGVuYWJsZWQgdG8gYW4gaGlnaGVyIGFkZHJlc3MuCisgKiAgQm9hcmRzIGFyZSBuYW1lZCBVeDRGMCwgVXg0RjEuLi4sIGFjY29yZGluZyB0byB0aGUgcG9ydCBhZGRyZXNzIG9yZGVyIGluCisgKiAgdGhlIGlvX3BvcnRbXSBhcnJheS4KKyAqCisgKiAgVGhlIGZvbGxvd2luZyBmYWN0cyBhcmUgYmFzZWQgb24gcmVhbCB0ZXN0aW5nIHJlc3VsdHMgKG5vdCBvbgorICogIGRvY3VtZW50YXRpb24pIG9uIHRoZSBhYm92ZSBVMTRGIGJvYXJkLgorICoKKyAqICAtIFRoZSBVMTRGIGJvYXJkIHNob3VsZCBiZSBqdW1wZXJlZCBmb3IgYnVzIG9uIHRpbWUgbGVzcyBvciBlcXVhbCB0byA3CisgKiAgICBtaWNyb3NlY29uZHMsIHdoaWxlIHRoZSBkZWZhdWx0IGlzIDExIG1pY3Jvc2Vjb25kcy4gVGhpcyBpcyBvcmRlciB0bworICogICAgZ2V0IGFjY2VwdGFibGUgcGVyZm9ybWFuY2Ugd2hpbGUgdXNpbmcgZmxvcHB5IGRyaXZlIGFuZCBoYXJkIGRpc2sKKyAqICAgIHRvZ2V0aGVyLiBUaGUganVtcGVyaW5nIGZvciA3IG1pY3Jvc2Vjb25kcyBpczogSlAxMyBwaW4gMTUtMTYsCisgKiAgICBKUDE0IHBpbiA3LTggYW5kIHBpbiA5LTEwLgorICogICAgVGhlIHJlZHVjdGlvbiBoYXMgYSBsaXR0bGUgaW1wYWN0IG9uIHNjc2kgcGVyZm9ybWFuY2UuCisgKgorICogIC0gSWYgc2NzaSBidXMgbGVuZ3RoIGV4Y2VlZHMgM20uLCB0aGUgc2NzaSBidXMgc3BlZWQgbmVlZHMgdG8gYmUgcmVkdWNlZAorICogICAgZnJvbSAxME1oeiB0byA1TWh6IChkbyB0aGlzIGJ5IGluc2VydGluZyBhIGp1bXBlciBvbiBKUDEzIHBpbiA3LTgpLgorICoKKyAqICAtIElmIFUxNEYgb24gYm9hcmQgZmlybXdhcmUgaXMgb2xkZXIgdGhhbiAyODAwNC0wMDYvMzgwMDQtMDA1LAorICogICAgdGhlIFUxNEYgYm9hcmQgaXMgdW5hYmxlIHRvIHByb3ZpZGUgcmVsaWFibGUgb3BlcmF0aW9ucyBpZiB0aGUgc2NzaQorICogICAgcmVxdWVzdCBsZW5ndGggZXhjZWVkcyAxNktieXRlLiBXaGVuIHRoaXMgbGVuZ3RoIGlzIGV4Y2VlZGVkIHRoZQorICogICAgYmVoYXZpb3IgaXM6CisgKiAgICAtIGFkYXB0ZXJfc3RhdHVzIGVxdWFsIDB4OTYgb3IgMHhhMyBvciAweDkzIG9yIDB4OTQ7CisgKiAgICAtIGFkYXB0ZXJfc3RhdHVzIGVxdWFsIDAgYW5kIHRhcmdldF9zdGF0dXMgZXF1YWwgMiBvbiBmb3IgYWxsIHRhcmdldHMKKyAqICAgICAgaW4gdGhlIG5leHQgb3BlcmF0aW9uIGZvbGxvd2luZyB0aGUgcmVzZXQuCisgKiAgICBUaGlzIHNlcXVlbmNlIHRha2VzIGEgbG9uZyB0aW1lICg+MyBzZWNvbmRzKSwgc28gaW4gdGhlIG1lYW50aW1lCisgKiAgICB0aGUgU0RfVElNRU9VVCBpbiBzZC5jIGNvdWxkIGV4cGlyZSBnaXZpbmcgcmlzZSB0byBzY3NpIGFib3J0cworICogICAgKFNEX1RJTUVPVVQgaGFzIGJlZW4gaW5jcmVhc2VkIGZyb20gMyB0byA2IHNlY29uZHMgaW4gMS4xLjMxKS4KKyAqICAgIEJlY2F1c2Ugb2YgdGhpcyBJIGhhZCB0byBESVNBQkxFX0NMVVNURVJJTkcgYW5kIHRvIHdvcmsgYXJvdW5kIHRoZQorICogICAgYnVzIHJlc2V0IGluIHRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLCByZXR1cm5pbmcgRElEX0JVU19CVVNZCisgKiAgICBzbyB0aGF0IHRoZSBvcGVyYXRpb25zIGFyZSByZXRyaWVkIHdpdGhvdXQgY29tcGxhaW5zIGZyb20gdGhlIHNjc2kuYworICogICAgY29kZS4KKyAqICAgIEFueSByZXNldCBvZiB0aGUgc2NzaSBidXMgaXMgZ29pbmcgdG8ga2lsbCB0YXBlIG9wZXJhdGlvbnMsIHNpbmNlCisgKiAgICBubyByZXRyeSBpcyBhbGxvd2VkIGZvciB0YXBlcy4gQnVzIHJlc2V0cyBhcmUgbW9yZSBsaWtlbHkgd2hlbiB0aGUKKyAqICAgIHNjc2kgYnVzIGlzIHVuZGVyIGhlYXZ5IGxvYWQuCisgKiAgICBSZXF1ZXN0cyB1c2luZyBzY2F0dGVyL2dhdGhlciBoYXZlIGEgbWF4aW11bSBsZW5ndGggb2YgMTYgeCAxMDI0IGJ5dGVzCisgKiAgICB3aGVuIERJU0FCTEVfQ0xVU1RFUklORyBpcyBpbiBlZmZlY3QsIGJ1dCB1bnNjYXR0ZXJlZCByZXF1ZXN0cyBjb3VsZCBiZQorICogICAgbGFyZ2VyIHRoYW4gMTZLYnl0ZS4KKyAqCisgKiAgICBUaGUgbmV3IGZpcm13YXJlIGhhcyBmaXhlZCBhbGwgdGhlIGFib3ZlIHByb2JsZW1zLgorICoKKyAqICBGb3IgVTM0RiBib2FyZHMgdGhlIGxhdGVzdCBiaW9zIHByb20gaXMgMzgwMDgtMDAyIChCSU9TIHJldi4gMi4wMSksCisgKiAgdGhlIGxhdGVzdCBmaXJtd2FyZSBwcm9tIGlzIDI4MDA4LTAwNi4gT2xkZXIgZmlybXdhcmUgMjgwMDgtMDA1IGhhcworICogIHByb2JsZW1zIHdoZW4gdXNpbmcgbW9yZSB0aGFuIDE2IHNjYXR0ZXIvZ2F0aGVyIGxpc3RzLgorICoKKyAqICBUaGUgbGlzdCBvZiBpL28gcG9ydHMgdG8gYmUgcHJvYmVkIGNhbiBiZSB0b3RhbGx5IHJlcGxhY2VkIGJ5IHRoZQorICogIGJvb3QgY29tbWFuZCBsaW5lIG9wdGlvbjogInUxNC0zNGY9cG9ydDAscG9ydDEscG9ydDIsLi4uIiwgd2hlcmUgdGhlCisgKiAgcG9ydDAsIHBvcnQxLi4uIGFyZ3VtZW50cyBhcmUgSVNBL1ZFU0EgYWRkcmVzc2VzIHRvIGJlIHByb2JlZC4KKyAqICBGb3IgZXhhbXBsZSB1c2luZyAidTE0LTM0Zj0weDIzMCwweDM0MCIsIHRoZSBkcml2ZXIgcHJvYmVzIG9ubHkgdGhlIHR3bworICogIGFkZHJlc3NlcyAweDIzMCBhbmQgMHgzNDAgaW4gdGhpcyBvcmRlcjsgInUxNC0zNGY9MCIgdG90YWxseSBkaXNhYmxlcworICogIHRoaXMgZHJpdmVyLgorICoKKyAqICBBZnRlciB0aGUgb3B0aW9uYWwgbGlzdCBvZiBkZXRlY3Rpb24gcHJvYmVzLCBvdGhlciBwb3NzaWJsZSBjb21tYW5kIGxpbmUKKyAqICBvcHRpb25zIGFyZToKKyAqCisgKiAgZXQ6eSAgdXNlIGRpc2sgZ2VvbWV0cnkgcmV0dXJuZWQgYnkgc2NzaWNhbV9iaW9zX3BhcmFtOworICogIGV0Om4gIHVzZSBkaXNrIGdlb21ldHJ5IGp1bXBlcmVkIG9uIHRoZSBib2FyZDsKKyAqICBsYzp5ICBlbmFibGVzIGxpbmtlZCBjb21tYW5kczsKKyAqICBsYzpuICBkaXNhYmxlcyBsaW5rZWQgY29tbWFuZHM7CisgKiAgdG06MCAgZGlzYWJsZXMgdGFnZ2VkIGNvbW1hbmRzIChzYW1lIGFzIHRjOm4pOworICogIHRtOjEgIHVzZSBzaW1wbGUgcXVldWUgdGFncyAoc2FtZSBhcyB0Yzp5KTsKKyAqICB0bToyICB1c2Ugb3JkZXJlZCBxdWV1ZSB0YWdzIChzYW1lIGFzIHRjOjIpOworICogIG9mOnkgIGVuYWJsZXMgb2xkIGZpcm13YXJlIHN1cHBvcnQ7CisgKiAgb2Y6biAgZGlzYWJsZXMgb2xkIGZpcm13YXJlIHN1cHBvcnQ7CisgKiAgbXE6eHggc2V0IHRoZSBtYXggcXVldWUgZGVwdGggdG8gdGhlIHZhbHVlIHh4ICgyIDw9IHh4IDw9IDgpLgorICoKKyAqICBUaGUgZGVmYXVsdCB2YWx1ZSBpczogInUxNC0zNGY9bGM6bixvZjpuLG1xOjgsdG06MCxldDpuIi4KKyAqICBBbiBleGFtcGxlIHVzaW5nIHRoZSBsaXN0IG9mIGRldGVjdGlvbiBwcm9iZXMgY291bGQgYmU6CisgKiAgInUxNC0zNGY9MHgyMzAsMHgzNDAsbGM6eSx0bToyLG9mOm4sbXE6NCxldDpuIi4KKyAqCisgKiAgV2hlbiBsb2FkaW5nIGFzIGEgbW9kdWxlLCBwYXJhbWV0ZXJzIGNhbiBiZSBzcGVjaWZpZWQgYXMgd2VsbC4KKyAqICBUaGUgYWJvdmUgZXhhbXBsZSB3b3VsZCBiZSAodXNlIDEgaW4gcGxhY2Ugb2YgeSBhbmQgMCBpbiBwbGFjZSBvZiBuKToKKyAqCisgKiAgbW9kcHJvYmUgdTE0LTM0ZiBpb19wb3J0PTB4MjMwLDB4MzQwIGxpbmtlZF9jb21tPTEgaGF2ZV9vbGRfZmlybXdhcmU9MCBcCisgKiAgICAgICAgICAgICAgICBtYXhfcXVldWVfZGVwdGg9NCBleHRfdHJhbj0wIHRhZ19tb2RlPTIKKyAqCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIGxpbmtlZCBjb21tYW5kcyBhcmUgZGVzaWduZWQgdG8gd29yayB3aXRoIGFueSBESVNLCisgKiAgb3IgQ0QtUk9NLCBzaW5jZSB0aGlzIGxpbmtpbmcgaGFzIG9ubHkgdGhlIGludGVudCBvZiBjbHVzdGVyaW5nICh0aW1lLXdpc2UpCisgKiAgYW5kIHJlb3JkZXJpbmcgYnkgZWxldmF0b3Igc29ydGluZyBjb21tYW5kcyBkaXJlY3RlZCB0byBlYWNoIGRldmljZSwKKyAqICB3aXRob3V0IGFueSByZWxhdGlvbiB3aXRoIHRoZSBhY3R1YWwgU0NTSSBwcm90b2NvbCBiZXR3ZWVuIHRoZSBjb250cm9sbGVyCisgKiAgYW5kIHRoZSBkZXZpY2UuCisgKiAgSWYgUSBpcyB0aGUgcXVldWUgZGVwdGggcmVwb3J0ZWQgYXQgYm9vdCB0aW1lIGZvciBlYWNoIGRldmljZSAoYWxzbyBuYW1lZAorICogIGNtZHMvbHVuKSBhbmQgUSA+IDIsIHdoZW5ldmVyIHRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aXZlIGNvbW1hbmQgdG8gdGhlCisgKiAgZGV2aWNlIGFsbCBvdGhlciBjb21tYW5kcyB0byB0aGUgc2FtZSBkZXZpY2UgICh1cCB0byBRLTEpIGFyZSBrZXB0IHdhaXRpbmcKKyAqICBpbiB0aGUgZWxldmF0b3Igc29ydGluZyBxdWV1ZS4gV2hlbiB0aGUgYWN0aXZlIGNvbW1hbmQgY29tcGxldGVzLCB0aGUKKyAqICBjb21tYW5kcyBpbiB0aGlzIHF1ZXVlIGFyZSBzb3J0ZWQgYnkgc2VjdG9yIGFkZHJlc3MuIFRoZSBzb3J0IGlzIGNob3NlbgorICogIGJldHdlZW4gaW5jcmVhc2luZyBvciBkZWNyZWFzaW5nIGJ5IG1pbmltaXppbmcgdGhlIHNlZWsgZGlzdGFuY2UgYmV0d2VlbgorICogIHRoZSBzZWN0b3Igb2YgdGhlIGNvbW1hbmRzIGp1c3QgY29tcGxldGVkIGFuZCB0aGUgc2VjdG9yIG9mIHRoZSBmaXJzdAorICogIGNvbW1hbmQgaW4gdGhlIGxpc3QgdG8gYmUgc29ydGVkLgorICogIFRyaXZpYWwgbWF0aCBhc3N1cmVzIHRoYXQgdGhlIHVuc29ydGVkIGF2ZXJhZ2Ugc2VlayBkaXN0YW5jZSB3aGVuIGRvaW5nCisgKiAgcmFuZG9tIHNlZWtzIG92ZXIgUyBzZWN0b3JzIGlzIFMvMy4KKyAqICBXaGVuIChRLTEpIHJlcXVlc3RzIGFyZSB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgb3ZlciBTIHNlY3RvcnMsIHRoZSBhdmVyYWdlCisgKiAgZGlzdGFuY2UgYmV0d2VlbiB0d28gYWRqYWNlbnQgcmVxdWVzdHMgaXMgUy8oKFEtMSkgKyAxKSwgc28gdGhlIHNvcnRlZAorICogIGF2ZXJhZ2Ugc2VlayBkaXN0YW5jZSBmb3IgKFEtMSkgcmFuZG9tIHJlcXVlc3RzIG92ZXIgUyBzZWN0b3JzIGlzIFMvUS4KKyAqICBUaGUgZWxldmF0b3Igc29ydGluZyBoZW5jZSBkaXZpZGVzIHRoZSBzZWVrIGRpc3RhbmNlIGJ5IGEgZmFjdG9yIFEvMy4KKyAqICBUaGUgYWJvdmUgcHVyZSBnZW9tZXRyaWMgcmVtYXJrcyBhcmUgdmFsaWQgaW4gYWxsIGNhc2VzIGFuZCB0aGUKKyAqICBkcml2ZXIgZWZmZWN0aXZlbHkgcmVkdWNlcyB0aGUgc2VlayBkaXN0YW5jZSBieSB0aGUgcHJlZGljdGVkIGZhY3RvcgorICogIHdoZW4gdGhlcmUgYXJlIFEgY29uY3VycmVudCByZWFkIGkvbyBvcGVyYXRpb25zIG9uIHRoZSBkZXZpY2UsIGJ1dCB0aGlzCisgKiAgZG9lcyBub3QgbmVjZXNzYXJpbHkgcmVzdWx0cyBpbiBhIG5vdGljZWFibGUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQ6CisgKiAgeW91ciBtaWxlYWdlIG1heSB2YXJ5Li4uLgorICoKKyAqICBOb3RlOiBjb21tYW5kIHJlb3JkZXJpbmcgaW5zaWRlIGEgYmF0Y2ggb2YgcXVldWVkIGNvbW1hbmRzIGNvdWxkIGNhdXNlCisgKiAgICAgICAgd3JvbmcgcmVzdWx0cyBvbmx5IGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB3cml0ZSByZXF1ZXN0IGFuZCB0aGUKKyAqICAgICAgICBpbnRlcnNlY3Rpb24gKHNlY3Rvci13aXNlKSBvZiBhbGwgcmVxdWVzdHMgaXMgbm90IGVtcHR5LgorICogICAgICAgIFdoZW4gdGhlIGRyaXZlciBkZXRlY3RzIGEgYmF0Y2ggaW5jbHVkaW5nIG92ZXJsYXBwaW5nIHJlcXVlc3RzCisgKiAgICAgICAgKGEgcmVhbGx5IHJhcmUgZXZlbnQpIHN0cmljdCBzZXJpYWwgKHBpZCkgb3JkZXIgaXMgZW5mb3JjZWQuCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBUaGUgYm9hcmRzIGFyZSBuYW1lZCBVeDRGMCwgVXg0RjEsLi4uIGFjY29yZGluZyB0byB0aGUgZGV0ZWN0aW9uIG9yZGVyLgorICoKKyAqICBJbiBvcmRlciB0byBzdXBwb3J0IG11bHRpcGxlIElTQSBib2FyZHMgaW4gYSByZWxpYWJsZSB3YXksCisgKiAgdGhlIGRyaXZlciBzZXRzIGhvc3QtPndpc2hfYmxvY2sgPSBUUlVFIGZvciBhbGwgSVNBIGJvYXJkcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CisKK3N0YXRpYyBpbnQgdTE0XzM0Zl9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqKTsKK3N0YXRpYyBpbnQgdTE0XzM0Zl9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgaW50IHUxNF8zNGZfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKiwgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpOworc3RhdGljIGludCB1MTRfMzRmX2VoX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgaW50IHUxNF8zNGZfZWhfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIGludCB1MTRfMzRmX2Jpb3NfcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICosIHN0cnVjdCBibG9ja19kZXZpY2UgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rvcl90LCBpbnQgKik7CitzdGF0aWMgaW50IHUxNF8zNGZfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqKTsKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICAgICAgICAgICA9ICJVbHRyYVN0b3IgMTRGLzM0RiByZXYuIDguMTAuMDAgIiwKKyAgICAgICAgICAgICAgICAuZGV0ZWN0ICAgICAgICAgICAgICAgICAgPSB1MTRfMzRmX2RldGVjdCwKKyAgICAgICAgICAgICAgICAucmVsZWFzZSAgICAgICAgICAgICAgICAgPSB1MTRfMzRmX3JlbGVhc2UsCisgICAgICAgICAgICAgICAgLnF1ZXVlY29tbWFuZCAgICAgICAgICAgID0gdTE0XzM0Zl9xdWV1ZWNvbW1hbmQsCisgICAgICAgICAgICAgICAgLmVoX2Fib3J0X2hhbmRsZXIgICAgICAgID0gdTE0XzM0Zl9laF9hYm9ydCwKKyAgICAgICAgICAgICAgICAuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBOVUxMLAorICAgICAgICAgICAgICAgIC5laF9idXNfcmVzZXRfaGFuZGxlciAgICA9IE5VTEwsCisgICAgICAgICAgICAgICAgLmVoX2hvc3RfcmVzZXRfaGFuZGxlciAgID0gdTE0XzM0Zl9laF9ob3N0X3Jlc2V0LAorICAgICAgICAgICAgICAgIC5iaW9zX3BhcmFtICAgICAgICAgICAgICA9IHUxNF8zNGZfYmlvc19wYXJhbSwKKyAgICAgICAgICAgICAgICAuc2xhdmVfY29uZmlndXJlICAgICAgICAgPSB1MTRfMzRmX3NsYXZlX2NvbmZpZ3VyZSwKKyAgICAgICAgICAgICAgICAudGhpc19pZCAgICAgICAgICAgICAgICAgPSA3LAorICAgICAgICAgICAgICAgIC51bmNoZWNrZWRfaXNhX2RtYSAgICAgICA9IDEsCisgICAgICAgICAgICAgICAgLnVzZV9jbHVzdGVyaW5nICAgICAgICAgID0gRU5BQkxFX0NMVVNURVJJTkcKKyAgICAgICAgICAgICAgICB9OworCisjaWYgIWRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKSAmJiAhZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisjZXJyb3IgIkFkanVzdCB5b3VyIDxhc20vYnl0ZW9yZGVyLmg+IGRlZmluZXMiCisjZW5kaWYKKworLyogVmFsdWVzIGZvciB0aGUgUFJPRFVDVF9JRCBwb3J0cyBmb3IgdGhlIDE0LzM0RiAqLworI2RlZmluZSBQUk9EVUNUX0lEMSAgMHg1NgorI2RlZmluZSBQUk9EVUNUX0lEMiAgMHg0MCAgICAgICAgLyogTk9URTogT25seSB1cHBlciBuaWJibGUgaXMgdXNlZCAqLworCisvKiBTdWJ2ZXJzaW9uIHZhbHVlcyAqLworI2RlZmluZSBJU0EgIDAKKyNkZWZpbmUgRVNBIDEKKworI2RlZmluZSBPUF9IT1NUX0FEQVBURVIgICAweDEKKyNkZWZpbmUgT1BfU0NTSSAgICAgICAgICAgMHgyCisjZGVmaW5lIE9QX1JFU0VUICAgICAgICAgIDB4NAorI2RlZmluZSBEVERfU0NTSSAgICAgICAgICAweDAKKyNkZWZpbmUgRFREX0lOICAgICAgICAgICAgMHgxCisjZGVmaW5lIERURF9PVVQgICAgICAgICAgIDB4MgorI2RlZmluZSBEVERfTk9ORSAgICAgICAgICAweDMKKyNkZWZpbmUgSEFfQ01EX0lOUVVJUlkgICAgMHgxCisjZGVmaW5lIEhBX0NNRF9TRUxGX0RJQUcgIDB4MgorI2RlZmluZSBIQV9DTURfUkVBRF9CVUZGICAweDMKKyNkZWZpbmUgSEFfQ01EX1dSSVRFX0JVRkYgMHg0CisKKyN1bmRlZiAgREVCVUdfTElOS0VEX0NPTU1BTkRTCisjdW5kZWYgIERFQlVHX0RFVEVDVAorI3VuZGVmICBERUJVR19JTlRFUlJVUFQKKyN1bmRlZiAgREVCVUdfUkVTRVQKKyN1bmRlZiAgREVCVUdfR0VORVJBVEVfRVJST1JTCisjdW5kZWYgIERFQlVHX0dFTkVSQVRFX0FCT1JUUworI3VuZGVmICBERUJVR19HRU9NRVRSWQorCisjZGVmaW5lIE1BWF9JU0EgMworI2RlZmluZSBNQVhfVkVTQSAxCisjZGVmaW5lIE1BWF9FSVNBIDAKKyNkZWZpbmUgTUFYX1BDSSAwCisjZGVmaW5lIE1BWF9CT0FSRFMgKE1BWF9JU0EgKyBNQVhfVkVTQSArIE1BWF9FSVNBICsgTUFYX1BDSSkKKyNkZWZpbmUgTUFYX0NIQU5ORUwgMQorI2RlZmluZSBNQVhfTFVOIDgKKyNkZWZpbmUgTUFYX1RBUkdFVCA4CisjZGVmaW5lIE1BWF9NQUlMQk9YRVMgMTYKKyNkZWZpbmUgTUFYX1NHTElTVCAzMgorI2RlZmluZSBNQVhfU0FGRV9TR0xJU1QgMTYKKyNkZWZpbmUgTUFYX0lOVEVSTkFMX1JFVFJJRVMgNjQKKyNkZWZpbmUgTUFYX0NNRF9QRVJfTFVOIDIKKyNkZWZpbmUgTUFYX1RBR0dFRF9DTURfUEVSX0xVTiAoTUFYX01BSUxCT1hFUyAtIE1BWF9DTURfUEVSX0xVTikKKworI2RlZmluZSBTS0lQIFVMT05HX01BWAorI2RlZmluZSBGQUxTRSAwCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGUkVFIDAKKyNkZWZpbmUgSU5fVVNFICAgMQorI2RlZmluZSBMT0NLRUQgICAyCisjZGVmaW5lIElOX1JFU0VUIDMKKyNkZWZpbmUgSUdOT1JFICAgNAorI2RlZmluZSBSRUFEWSAgICA1CisjZGVmaW5lIEFCT1JUSU5HIDYKKyNkZWZpbmUgTk9fRE1BICAweGZmCisjZGVmaW5lIE1BWExPT1AgIDEwMDAwCisjZGVmaW5lIFRBR19ESVNBQkxFRCAwCisjZGVmaW5lIFRBR19TSU1QTEUgICAxCisjZGVmaW5lIFRBR19PUkRFUkVEICAyCisKKyNkZWZpbmUgUkVHX0xDTF9NQVNLICAgICAgMAorI2RlZmluZSBSRUdfTENMX0lOVFIgICAgICAxCisjZGVmaW5lIFJFR19TWVNfTUFTSyAgICAgIDIKKyNkZWZpbmUgUkVHX1NZU19JTlRSICAgICAgMworI2RlZmluZSBSRUdfUFJPRFVDVF9JRDEgICA0CisjZGVmaW5lIFJFR19QUk9EVUNUX0lEMiAgIDUKKyNkZWZpbmUgUkVHX0NPTkZJRzEgICAgICAgNgorI2RlZmluZSBSRUdfQ09ORklHMiAgICAgICA3CisjZGVmaW5lIFJFR19PR00gICAgICAgICAgIDgKKyNkZWZpbmUgUkVHX0lDTSAgICAgICAgICAgMTIKKyNkZWZpbmUgUkVHSU9OX1NJWkUgICAgICAgMTNVTAorI2RlZmluZSBCU1lfQVNTRVJURUQgICAgICAweDAxCisjZGVmaW5lIElSUV9BU1NFUlRFRCAgICAgIDB4MDEKKyNkZWZpbmUgQ01EX1JFU0VUICAgICAgICAgMHhjMAorI2RlZmluZSBDTURfT0dNX0lOVFIgICAgICAweDAxCisjZGVmaW5lIENNRF9DTFJfSU5UUiAgICAgIDB4MDEKKyNkZWZpbmUgQ01EX0VOQV9JTlRSICAgICAgMHg4MQorI2RlZmluZSBBU09LICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTU1QgICAgICAgICAgICAgIDB4OTEKKworI2RlZmluZSBZRVNOTyhhKSAoKGEpID8gJ3knIDogJ24nKQorI2RlZmluZSBUTERFVih0eXBlKSAoKHR5cGUpID09IFRZUEVfRElTSyB8fCAodHlwZSkgPT0gVFlQRV9ST00pCisKKyNkZWZpbmUgUEFDS0VEICAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpCisKK3N0cnVjdCBzZ19saXN0IHsKKyAgIHVuc2lnbmVkIGludCBhZGRyZXNzOyAgICAgICAgICAgICAgICAvKiBTZWdtZW50IEFkZHJlc3MgKi8KKyAgIHVuc2lnbmVkIGludCBudW1fYnl0ZXM7ICAgICAgICAgICAgICAvKiBTZWdtZW50IExlbmd0aCAqLworICAgfTsKKworLyogTWFpbEJveCBTQ1NJIENvbW1hbmQgUGFja2V0ICovCitzdHJ1Y3QgbXNjcCB7CisKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKyAgIHVuc2lnbmVkIGNoYXIgc2c6MSwgY2E6MSwgZGNuOjEsIHhkaXI6Miwgb3Bjb2RlOjM7CisgICB1bnNpZ25lZCBjaGFyIGx1bjogMywgY2hhbm5lbDoyLCB0YXJnZXQ6MzsKKyNlbHNlCisgICB1bnNpZ25lZCBjaGFyIG9wY29kZTogMywgICAgICAgICAgICAgLyogdHlwZSBvZiBjb21tYW5kICovCisgICAgICAgICAgICAgICAgIHhkaXI6IDIsICAgICAgICAgICAgICAgLyogZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgZGNuOiAxLCAgICAgICAgICAgICAgICAvKiBkaXNhYmxlIGRpc2Nvbm5lY3QgKi8KKyAgICAgICAgICAgICAgICAgY2E6IDEsICAgICAgICAgICAgICAgICAvKiB1c2UgY2FjaGUgKGlmIGF2YWlsYWJsZSkgKi8KKyAgICAgICAgICAgICAgICAgc2c6IDE7ICAgICAgICAgICAgICAgICAvKiBzY2F0dGVyL2dhdGhlciBvcGVyYXRpb24gKi8KKyAgIHVuc2lnbmVkIGNoYXIgdGFyZ2V0OiAzLCAgICAgICAgICAgICAvKiBTQ1NJIHRhcmdldCBpZCAqLworICAgICAgICAgICAgICAgICBjaGFubmVsOiAyLCAgICAgICAgICAgIC8qIFNDU0kgY2hhbm5lbCBudW1iZXIgKi8KKyAgICAgICAgICAgICAgICAgbHVuOiAzOyAgICAgICAgICAgICAgICAvKiBTQ1NJIGxvZ2ljYWwgdW5pdCBudW1iZXIgKi8KKyNlbmRpZgorCisgICB1bnNpZ25lZCBpbnQgZGF0YV9hZGRyZXNzIFBBQ0tFRDsgICAgLyogdHJhbnNmZXIgZGF0YSBwb2ludGVyICovCisgICB1bnNpZ25lZCBpbnQgZGF0YV9sZW4gUEFDS0VEOyAgICAgICAgLyogbGVuZ3RoIGluIGJ5dGVzICovCisgICB1bnNpZ25lZCBpbnQgbGlua19hZGRyZXNzIFBBQ0tFRDsgICAgLyogZm9yIGxpbmtpbmcgY29tbWFuZCBjaGFpbnMgKi8KKyAgIHVuc2lnbmVkIGNoYXIgY2xpbmtfaWQ7ICAgICAgICAgICAgICAvKiBpZGVudGlmaWVzIGNvbW1hbmQgaW4gY2hhaW4gKi8KKyAgIHVuc2lnbmVkIGNoYXIgdXNlX3NnOyAgICAgICAgICAgICAgICAvKiAoaWYgc2cgaXMgc2V0KSA4IGJ5dGVzIHBlciBsaXN0ICovCisgICB1bnNpZ25lZCBjaGFyIHNlbnNlX2xlbjsKKyAgIHVuc2lnbmVkIGNoYXIgY2RiX2xlbjsgICAgICAgICAgICAgICAvKiA2LCAxMCwgb3IgMTIgKi8KKyAgIHVuc2lnbmVkIGNoYXIgY2RiWzEyXTsgICAgICAgICAgICAgICAvKiBTQ1NJIENvbW1hbmQgRGVzY3JpcHRvciBCbG9jayAqLworICAgdW5zaWduZWQgY2hhciBhZGFwdGVyX3N0YXR1czsgICAgICAgIC8qIG5vbi16ZXJvIGluZGljYXRlcyBIQSBlcnJvciAqLworICAgdW5zaWduZWQgY2hhciB0YXJnZXRfc3RhdHVzOyAgICAgICAgIC8qIG5vbi16ZXJvIGluZGljYXRlcyB0YXJnZXQgZXJyb3IgKi8KKyAgIHVuc2lnbmVkIGludCBzZW5zZV9hZGRyIFBBQ0tFRDsKKworICAgLyogQWRkaXRpb25hbCBmaWVsZHMgYmVnaW4gaGVyZS4gKi8KKyAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OworICAgdW5zaWduZWQgaW50IGNwcF9pbmRleDsgICAgICAgICAgICAgIC8qIGNwIGluZGV4ICovCisKKyAgIC8qIEFsbCB0aGUgY3Agc3RydWN0dXJlIGlzIHplcm8gZmlsbGVkIGJ5IHF1ZXVlY29tbWFuZCBleGNlcHQgdGhlCisgICAgICBmb2xsb3dpbmcgQ1BfVEFJTF9TSVpFIGJ5dGVzLCBpbml0aWFsaXplZCBieSBkZXRlY3QgKi8KKyAgIGRtYV9hZGRyX3QgY3BfZG1hX2FkZHI7IC8qIGRtYSBoYW5kbGUgZm9yIHRoaXMgY3Agc3RydWN0dXJlICovCisgICBzdHJ1Y3Qgc2dfbGlzdCAqc2dsaXN0OyAvKiBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgU0cgbGlzdCAqLworICAgfTsKKworI2RlZmluZSBDUF9UQUlMX1NJWkUgKHNpemVvZihzdHJ1Y3Qgc2dsaXN0ICopICsgc2l6ZW9mKGRtYV9hZGRyX3QpKQorCitzdHJ1Y3QgaG9zdGRhdGEgeworICAgc3RydWN0IG1zY3AgY3BbTUFYX01BSUxCT1hFU107ICAgICAgIC8qIE1haWxib3hlcyBmb3IgdGhpcyBib2FyZCAqLworICAgdW5zaWduZWQgaW50IGNwX3N0YXRbTUFYX01BSUxCT1hFU107IC8qIEZSRUUsIElOX1VTRSwgTE9DS0VELCBJTl9SRVNFVCAqLworICAgdW5zaWduZWQgaW50IGxhc3RfY3BfdXNlZDsgICAgICAgICAgIC8qIEluZGV4IG9mIGxhc3QgbWFpbGJveCB1c2VkICovCisgICB1bnNpZ25lZCBpbnQgaW9jb3VudDsgICAgICAgICAgICAgICAgLyogVG90YWwgaS9vIGRvbmUgZm9yIHRoaXMgYm9hcmQgKi8KKyAgIGludCBib2FyZF9udW1iZXI7ICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgdGhpcyBib2FyZCAqLworICAgY2hhciBib2FyZF9uYW1lWzE2XTsgICAgICAgICAgICAgICAgIC8qIE5hbWUgb2YgdGhpcyBib2FyZCAqLworICAgaW50IGluX3Jlc2V0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRydWUgaWYgYm9hcmQgaXMgZG9pbmcgYSByZXNldCAqLworICAgaW50IHRhcmdldF90b1tNQVhfVEFSR0VUXVtNQVhfQ0hBTk5FTF07IC8qIE4uIG9mIHRpbWVvdXQgZXJyb3JzIG9uIHRhcmdldCAqLworICAgaW50IHRhcmdldF9yZWRvW01BWF9UQVJHRVRdW01BWF9DSEFOTkVMXTsgLyogSWYgVFJVRSByZWRvIGkvbyBvbiB0YXJnZXQgKi8KKyAgIHVuc2lnbmVkIGludCByZXRyaWVzOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaW50ZXJuYWwgcmV0cmllcyAqLworICAgdW5zaWduZWQgbG9uZyBsYXN0X3JldHJpZWRfcGlkOyAgICAgIC8qIFBpZCBvZiBsYXN0IHJldHJpZWQgY29tbWFuZCAqLworICAgdW5zaWduZWQgY2hhciBzdWJ2ZXJzaW9uOyAgICAgICAgICAgIC8qIEJ1cyB0eXBlLCBlaXRoZXIgSVNBIG9yIEVTQSAqLworICAgc3RydWN0IHBjaV9kZXYgKnBkZXY7ICAgICAgICAgICAgICAgIC8qIEFsd2F5cyBOVUxMICovCisgICB1bnNpZ25lZCBjaGFyIGhlYWRzOworICAgdW5zaWduZWQgY2hhciBzZWN0b3JzOworICAgY2hhciBib2FyZF9pZFsyNTZdOyAgICAgICAgICAgICAgICAgIC8qIGRhdGEgZnJvbSBJTlFVSVJZIG9uIHRoaXMgYm9hcmQgKi8KKyAgIH07CisKK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICpzaFtNQVhfQk9BUkRTICsgMV07CitzdGF0aWMgY29uc3QgY2hhciAqZHJpdmVyX25hbWUgPSAiVXg0RiI7CitzdGF0aWMgY2hhciBzaGFbTUFYX0JPQVJEU107CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRyaXZlcl9sb2NrKTsKKworLyogSW5pdGlhbGl6ZSBudW1fYm9hcmRzIHNvIHRoYXQgaWhkbHIgY2FuIHdvcmsgd2hpbGUgZGV0ZWN0IGlzIGluIHByb2dyZXNzICovCitzdGF0aWMgdW5zaWduZWQgaW50IG51bV9ib2FyZHMgPSBNQVhfQk9BUkRTOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpb19wb3J0W10gPSB7CisKKyAgIC8qIFNwYWNlIGZvciBNQVhfSU5UX1BBUkFNIHBvcnRzIHVzYWJsZSB3aGlsZSBsb2FkaW5nIGFzIGEgbW9kdWxlICovCisgICBTS0lQLCAgICBTS0lQLCAgIFNLSVAsICAgU0tJUCwgICBTS0lQLCAgIFNLSVAsICAgU0tJUCwgICBTS0lQLAorICAgU0tJUCwgICAgU0tJUCwKKworICAgLyogUG9zc2libGUgSVNBL1ZFU0EgcG9ydHMgKi8KKyAgIDB4MzMwLCAweDM0MCwgMHgyMzAsIDB4MjQwLCAweDIxMCwgMHgxMzAsIDB4MTQwLAorCisgICAvKiBFbmQgb2YgbGlzdCAqLworICAgMHgwCisgICB9OworCisjZGVmaW5lIEhEKGJvYXJkKSAoKHN0cnVjdCBob3N0ZGF0YSAqKSAmc2hbYm9hcmRdLT5ob3N0ZGF0YSkKKyNkZWZpbmUgQk4oYm9hcmQpIChIRChib2FyZCktPmJvYXJkX25hbWUpCisKKy8qIERldmljZSBpcyBMaXR0bGUgRW5kaWFuICovCisjZGVmaW5lIEgyREVWKHgpIGNwdV90b19sZTMyKHgpCisjZGVmaW5lIERFVjJIKHgpIGxlMzJfdG9fY3B1KHgpCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkb19pbnRlcnJ1cHRfaGFuZGxlcihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgdm9pZCBmbHVzaF9kZXYoc3RydWN0IHNjc2lfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKK3N0YXRpYyBpbnQgZG9fdHJhY2UgPSBGQUxTRTsKK3N0YXRpYyBpbnQgc2V0dXBfZG9uZSA9IEZBTFNFOworc3RhdGljIGludCBsaW5rX3N0YXRpc3RpY3M7CitzdGF0aWMgaW50IGV4dF90cmFuID0gRkFMU0U7CisKKyNpZiBkZWZpbmVkKEhBVkVfT0xEX1VYNEZfRklSTVdBUkUpCitzdGF0aWMgaW50IGhhdmVfb2xkX2Zpcm13YXJlID0gVFJVRTsKKyNlbHNlCitzdGF0aWMgaW50IGhhdmVfb2xkX2Zpcm13YXJlID0gRkFMU0U7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NDU0lfVTE0XzM0Rl9UQUdHRURfUVVFVUUpCitzdGF0aWMgaW50IHRhZ19tb2RlID0gVEFHX1NJTVBMRTsKKyNlbHNlCitzdGF0aWMgaW50IHRhZ19tb2RlID0gVEFHX0RJU0FCTEVEOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TQ1NJX1UxNF8zNEZfTElOS0VEX0NPTU1BTkRTKQorc3RhdGljIGludCBsaW5rZWRfY29tbSA9IFRSVUU7CisjZWxzZQorc3RhdGljIGludCBsaW5rZWRfY29tbSA9IEZBTFNFOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TQ1NJX1UxNF8zNEZfTUFYX1RBR1MpCitzdGF0aWMgaW50IG1heF9xdWV1ZV9kZXB0aCA9IENPTkZJR19TQ1NJX1UxNF8zNEZfTUFYX1RBR1M7CisjZWxzZQorc3RhdGljIGludCBtYXhfcXVldWVfZGVwdGggPSBNQVhfQ01EX1BFUl9MVU47CisjZW5kaWYKKworI2RlZmluZSBNQVhfSU5UX1BBUkFNIDEwCisjZGVmaW5lIE1BWF9CT09UX09QVElPTlNfU0laRSAyNTYKK3N0YXRpYyBjaGFyIGJvb3Rfb3B0aW9uc1tNQVhfQk9PVF9PUFRJT05TX1NJWkVdOworCisjaWYgZGVmaW5lZChNT0RVTEUpCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworbW9kdWxlX3BhcmFtX3N0cmluZyh1MTRfMzRmLCBib290X29wdGlvbnMsIE1BWF9CT09UX09QVElPTlNfU0laRSwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHUxNF8zNGYsICIgZXF1aXZhbGVudCB0byB0aGUgXCJ1MTQtMzRmPS4uLlwiIGtlcm5lbCBib290ICIgXAorIm9wdGlvbi4iIFwKKyIgICAgICBFeGFtcGxlOiBtb2Rwcm9iZSB1MTQtMzRmIFwidTE0XzM0Zj0weDM0MCwweDMzMCxsYzp5LHRtOjAsbXE6NFwiIik7CitNT0RVTEVfQVVUSE9SKCJEYXJpbyBCYWxsYWJpbyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJVbHRyYVN0b3IgMTRGLzM0RiBTQ1NJIERyaXZlciIpOworCisjZW5kaWYKKworc3RhdGljIGludCB1MTRfMzRmX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldikgeworICAgaW50IGosIHRxZCwgdXRxZDsKKyAgIGNoYXIgKnRhZ19zdWZmaXgsICpsaW5rX3N1ZmZpeDsKKyAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBkZXYtPmhvc3Q7CisKKyAgIGogPSAoKHN0cnVjdCBob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YSktPmJvYXJkX251bWJlcjsKKworICAgdXRxZCA9IE1BWF9DTURfUEVSX0xVTjsKKyAgIHRxZCA9IG1heF9xdWV1ZV9kZXB0aDsKKworICAgaWYgKFRMREVWKGRldi0+dHlwZSkgJiYgZGV2LT50YWdnZWRfc3VwcG9ydGVkKQorCisgICAgICBpZiAodGFnX21vZGUgPT0gVEFHX1NJTVBMRSkgeworICAgICAgICAgc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2LCBNU0dfU0lNUExFX1RBRywgdHFkKTsKKyAgICAgICAgIHRhZ19zdWZmaXggPSAiLCBzaW1wbGUgdGFncyI7CisgICAgICAgICB9CisgICAgICBlbHNlIGlmICh0YWdfbW9kZSA9PSBUQUdfT1JERVJFRCkgeworICAgICAgICAgc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2LCBNU0dfT1JERVJFRF9UQUcsIHRxZCk7CisgICAgICAgICB0YWdfc3VmZml4ID0gIiwgb3JkZXJlZCB0YWdzIjsKKyAgICAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2LCAwLCB0cWQpOworICAgICAgICAgdGFnX3N1ZmZpeCA9ICIsIG5vIHRhZ3MiOworICAgICAgICAgfQorCisgICBlbHNlIGlmIChUTERFVihkZXYtPnR5cGUpICYmIGxpbmtlZF9jb21tKSB7CisgICAgICBzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXYsIDAsIHRxZCk7CisgICAgICB0YWdfc3VmZml4ID0gIiwgdW50YWdnZWQiOworICAgICAgfQorCisgICBlbHNlIHsKKyAgICAgIHNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldiwgMCwgdXRxZCk7CisgICAgICB0YWdfc3VmZml4ID0gIiI7CisgICAgICB9CisKKyAgIGlmIChUTERFVihkZXYtPnR5cGUpICYmIGxpbmtlZF9jb21tICYmIGRldi0+cXVldWVfZGVwdGggPiAyKQorICAgICAgbGlua19zdWZmaXggPSAiLCBzb3J0ZWQiOworICAgZWxzZSBpZiAoVExERVYoZGV2LT50eXBlKSkKKyAgICAgIGxpbmtfc3VmZml4ID0gIiwgdW5zb3J0ZWQiOworICAgZWxzZQorICAgICAgbGlua19zdWZmaXggPSAiIjsKKworICAgcHJpbnRrKCIlczogc2NzaSVkLCBjaGFubmVsICVkLCBpZCAlZCwgbHVuICVkLCBjbWRzL2x1biAlZCVzJXMuXG4iLAorICAgICAgICAgIEJOKGopLCBob3N0LT5ob3N0X25vLCBkZXYtPmNoYW5uZWwsIGRldi0+aWQsIGRldi0+bHVuLAorICAgICAgICAgIGRldi0+cXVldWVfZGVwdGgsIGxpbmtfc3VmZml4LCB0YWdfc3VmZml4KTsKKworICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50IHdhaXRfb25fYnVzeSh1bnNpZ25lZCBsb25nIGlvYmFzZSwgdW5zaWduZWQgaW50IGxvb3ApIHsKKworICAgd2hpbGUgKGluYihpb2Jhc2UgKyBSRUdfTENMX0lOVFIpICYgQlNZX0FTU0VSVEVEKSB7CisgICAgICB1ZGVsYXkoMUwpOworICAgICAgaWYgKC0tbG9vcCA9PSAwKSByZXR1cm4gVFJVRTsKKyAgICAgIH0KKworICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50IGJvYXJkX2lucXVpcnkodW5zaWduZWQgaW50IGopIHsKKyAgIHN0cnVjdCBtc2NwICpjcHA7CisgICBkbWFfYWRkcl90IGlkX2RtYV9hZGRyOworICAgdW5zaWduZWQgaW50IHRpbWUsIGxpbWl0ID0gMDsKKworICAgaWRfZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShIRChqKS0+cGRldiwgSEQoaiktPmJvYXJkX2lkLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEQoaiktPmJvYXJkX2lkKSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKyAgIGNwcCA9ICZIRChqKS0+Y3BbMF07CisgICBjcHAtPmNwX2RtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUoSEQoaiktPnBkZXYsIGNwcCwgc2l6ZW9mKHN0cnVjdCBtc2NwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworICAgbWVtc2V0KGNwcCwgMCwgc2l6ZW9mKHN0cnVjdCBtc2NwKSAtIENQX1RBSUxfU0laRSk7CisgICBjcHAtPm9wY29kZSA9IE9QX0hPU1RfQURBUFRFUjsKKyAgIGNwcC0+eGRpciA9IERURF9JTjsKKyAgIGNwcC0+ZGF0YV9hZGRyZXNzID0gSDJERVYoaWRfZG1hX2FkZHIpOworICAgY3BwLT5kYXRhX2xlbiA9IEgyREVWKHNpemVvZihIRChqKS0+Ym9hcmRfaWQpKTsKKyAgIGNwcC0+Y2RiX2xlbiA9IDY7CisgICBjcHAtPmNkYlswXSA9IEhBX0NNRF9JTlFVSVJZOworCisgICBpZiAod2FpdF9vbl9idXN5KHNoW2pdLT5pb19wb3J0LCBNQVhMT09QKSkgeworICAgICAgcHJpbnRrKCIlczogYm9hcmRfaW5xdWlyeSwgYWRhcHRlciBidXN5LlxuIiwgQk4oaikpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisKKyAgIEhEKGopLT5jcF9zdGF0WzBdID0gSUdOT1JFOworCisgICAvKiBDbGVhciB0aGUgaW50ZXJydXB0IGluZGljYXRpb24gKi8KKyAgIG91dGIoQ01EX0NMUl9JTlRSLCBzaFtqXS0+aW9fcG9ydCArIFJFR19TWVNfSU5UUik7CisKKyAgIC8qIFN0b3JlIHBvaW50ZXIgaW4gT0dNIGFkZHJlc3MgYnl0ZXMgKi8KKyAgIG91dGwoSDJERVYoY3BwLT5jcF9kbWFfYWRkciksIHNoW2pdLT5pb19wb3J0ICsgUkVHX09HTSk7CisKKyAgIC8qIElzc3VlIE9HTSBpbnRlcnJ1cHQgKi8KKyAgIG91dGIoQ01EX09HTV9JTlRSLCBzaFtqXS0+aW9fcG9ydCArIFJFR19MQ0xfSU5UUik7CisKKyAgIHNwaW5fdW5sb2NrX2lycSgmZHJpdmVyX2xvY2spOworICAgdGltZSA9IGppZmZpZXM7CisgICB3aGlsZSAoKGppZmZpZXMgLSB0aW1lKSA8IEhaICYmIGxpbWl0KysgPCAyMDAwMCkgdWRlbGF5KDEwMEwpOworICAgc3Bpbl9sb2NrX2lycSgmZHJpdmVyX2xvY2spOworCisgICBpZiAoY3BwLT5hZGFwdGVyX3N0YXR1cyB8fCBIRChqKS0+Y3Bfc3RhdFswXSAhPSBGUkVFKSB7CisgICAgICBIRChqKS0+Y3Bfc3RhdFswXSA9IEZSRUU7CisgICAgICBwcmludGsoIiVzOiBib2FyZF9pbnF1aXJ5LCBlcnIgMHgleC5cbiIsIEJOKGopLCBjcHAtPmFkYXB0ZXJfc3RhdHVzKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorCisgICBwY2lfdW5tYXBfc2luZ2xlKEhEKGopLT5wZGV2LCBjcHAtPmNwX2RtYV9hZGRyLCBzaXplb2Yoc3RydWN0IG1zY3ApLAorICAgICAgICAgICAgICAgICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworICAgcGNpX3VubWFwX3NpbmdsZShIRChqKS0+cGRldiwgaWRfZG1hX2FkZHIsIHNpemVvZihIRChqKS0+Ym9hcmRfaWQpLAorICAgICAgICAgICAgICAgICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50IHBvcnRfZGV0ZWN0IFwKKyAgICAgICh1bnNpZ25lZCBsb25nIHBvcnRfYmFzZSwgdW5zaWduZWQgaW50IGosIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpIHsKKyAgIHVuc2lnbmVkIGNoYXIgaXJxLCBkbWFfY2hhbm5lbCwgc3VidmVyc2lvbiwgaTsKKyAgIHVuc2lnbmVkIGNoYXIgaW5fYnl0ZTsKKyAgIGNoYXIgKmJ1c190eXBlLCBkbWFfbmFtZVsxNl07CisKKyAgIC8qIEFsbG93ZWQgQklPUyBiYXNlIGFkZHJlc3NlcyAoTlVMTCBpbmRpY2F0ZXMgcmVzZXJ2ZWQpICovCisgICB1bnNpZ25lZCBsb25nIGJpb3Nfc2VnbWVudF90YWJsZVs4XSA9IHsKKyAgICAgIDAsCisgICAgICAweGM0MDAwLCAweGM4MDAwLCAweGNjMDAwLCAweGQwMDAwLAorICAgICAgMHhkNDAwMCwgMHhkODAwMCwgMHhkYzAwMAorICAgICAgfTsKKworICAgLyogQWxsb3dlZCBJUlFzICovCisgICB1bnNpZ25lZCBjaGFyIGludGVycnVwdF90YWJsZVs0XSA9IHsgMTUsIDE0LCAxMSwgMTAgfTsKKworICAgLyogQWxsb3dlZCBETUEgY2hhbm5lbHMgZm9yIElTQSAoMCBpbmRpY2F0ZXMgcmVzZXJ2ZWQpICovCisgICB1bnNpZ25lZCBjaGFyIGRtYV9jaGFubmVsX3RhYmxlWzRdID0geyA1LCA2LCA3LCAwIH07CisKKyAgIC8qIEhlYWQvc2VjdG9yIG1hcHBpbmdzICovCisgICBzdHJ1Y3QgeworICAgICAgdW5zaWduZWQgY2hhciBoZWFkczsKKyAgICAgIHVuc2lnbmVkIGNoYXIgc2VjdG9yczsKKyAgICAgIH0gbWFwcGluZ190YWJsZVs0XSA9IHsKKyAgICAgICAgICAgeyAxNiwgNjMgfSwgeyA2NCwgMzIgfSwgeyA2NCwgNjMgfSwgeyA2NCwgMzIgfQorICAgICAgICAgICB9OworCisgICBzdHJ1Y3QgY29uZmlnXzEgeworCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisgICAgICB1bnNpZ25lZCBjaGFyIGRtYV9jaGFubmVsOiAyLCBpbnRlcnJ1cHQ6MiwKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZhYmxlX2Rpc2tzX2FzX2ZpeGVkOjEsIGJpb3Nfc2VnbWVudDogMzsKKyNlbHNlCisgICAgICB1bnNpZ25lZCBjaGFyIGJpb3Nfc2VnbWVudDogMywgcmVtb3ZhYmxlX2Rpc2tzX2FzX2ZpeGVkOiAxLAorICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQ6IDIsIGRtYV9jaGFubmVsOiAyOworI2VuZGlmCisKKyAgICAgIH0gY29uZmlnXzE7CisKKyAgIHN0cnVjdCBjb25maWdfMiB7CisKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKyAgICAgIHVuc2lnbmVkIGNoYXIgdGZyX3BvcnQ6IDIsIGJpb3NfZHJpdmVfbnVtYmVyOiAxLAorICAgICAgICAgICAgICAgICAgICBtYXBwaW5nX21vZGU6IDIsIGhhX3Njc2lfaWQ6IDM7CisjZWxzZQorICAgICAgdW5zaWduZWQgY2hhciBoYV9zY3NpX2lkOiAzLCBtYXBwaW5nX21vZGU6IDIsCisgICAgICAgICAgICAgICAgICAgIGJpb3NfZHJpdmVfbnVtYmVyOiAxLCB0ZnJfcG9ydDogMjsKKyNlbmRpZgorCisgICAgICB9IGNvbmZpZ18yOworCisgICBjaGFyIG5hbWVbMTZdOworCisgICBzcHJpbnRmKG5hbWUsICIlcyVkIiwgZHJpdmVyX25hbWUsIGopOworCisgICBpZiAoIXJlcXVlc3RfcmVnaW9uKHBvcnRfYmFzZSwgUkVHSU9OX1NJWkUsIGRyaXZlcl9uYW1lKSkgeworI2lmIGRlZmluZWQoREVCVUdfREVURUNUKQorICAgICAgcHJpbnRrKCIlczogYWRkcmVzcyAweCUwM2x4IGluIHVzZSwgc2tpcHBpbmcgcHJvYmUuXG4iLCBuYW1lLCBwb3J0X2Jhc2UpOworI2VuZGlmCisgICAgICBnb3RvIGZhaWw7CisgICAgICB9CisKKyAgIHNwaW5fbG9ja19pcnEoJmRyaXZlcl9sb2NrKTsKKworICAgaWYgKGluYihwb3J0X2Jhc2UgKyBSRUdfUFJPRFVDVF9JRDEpICE9IFBST0RVQ1RfSUQxKSBnb3RvIGZyZWVsb2NrOworCisgICBpbl9ieXRlID0gaW5iKHBvcnRfYmFzZSArIFJFR19QUk9EVUNUX0lEMik7CisKKyAgIGlmICgoaW5fYnl0ZSAmIDB4ZjApICE9IFBST0RVQ1RfSUQyKSBnb3RvIGZyZWVsb2NrOworCisgICAqKGNoYXIgKikmY29uZmlnXzEgPSBpbmIocG9ydF9iYXNlICsgUkVHX0NPTkZJRzEpOworICAgKihjaGFyICopJmNvbmZpZ18yID0gaW5iKHBvcnRfYmFzZSArIFJFR19DT05GSUcyKTsKKworICAgaXJxID0gaW50ZXJydXB0X3RhYmxlW2NvbmZpZ18xLmludGVycnVwdF07CisgICBkbWFfY2hhbm5lbCA9IGRtYV9jaGFubmVsX3RhYmxlW2NvbmZpZ18xLmRtYV9jaGFubmVsXTsKKyAgIHN1YnZlcnNpb24gPSAoaW5fYnl0ZSAmIDB4MGYpOworCisgICAvKiBCb2FyZCBkZXRlY3RlZCwgYWxsb2NhdGUgaXRzIElSUSAqLworICAgaWYgKHJlcXVlc3RfaXJxKGlycSwgZG9faW50ZXJydXB0X2hhbmRsZXIsCisgICAgICAgICAgICAgU0FfSU5URVJSVVBUIHwgKChzdWJ2ZXJzaW9uID09IEVTQSkgPyBTQV9TSElSUSA6IDApLAorICAgICAgICAgICAgIGRyaXZlcl9uYW1lLCAodm9pZCAqKSAmc2hhW2pdKSkgeworICAgICAgcHJpbnRrKCIlczogdW5hYmxlIHRvIGFsbG9jYXRlIElSUSAldSwgZGV0YWNoaW5nLlxuIiwgbmFtZSwgaXJxKTsKKyAgICAgIGdvdG8gZnJlZWxvY2s7CisgICAgICB9CisKKyAgIGlmIChzdWJ2ZXJzaW9uID09IElTQSAmJiByZXF1ZXN0X2RtYShkbWFfY2hhbm5lbCwgZHJpdmVyX25hbWUpKSB7CisgICAgICBwcmludGsoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgRE1BIGNoYW5uZWwgJXUsIGRldGFjaGluZy5cbiIsCisgICAgICAgICAgICAgbmFtZSwgZG1hX2NoYW5uZWwpOworICAgICAgZ290byBmcmVlaXJxOworICAgICAgfQorCisgICBpZiAoaGF2ZV9vbGRfZmlybXdhcmUpIHRwbnQtPnVzZV9jbHVzdGVyaW5nID0gRElTQUJMRV9DTFVTVEVSSU5HOworCisgICBzcGluX3VubG9ja19pcnEoJmRyaXZlcl9sb2NrKTsKKyAgIHNoW2pdID0gc2NzaV9yZWdpc3Rlcih0cG50LCBzaXplb2Yoc3RydWN0IGhvc3RkYXRhKSk7CisgICBzcGluX2xvY2tfaXJxKCZkcml2ZXJfbG9jayk7CisKKyAgIGlmIChzaFtqXSA9PSBOVUxMKSB7CisgICAgICBwcmludGsoIiVzOiB1bmFibGUgdG8gcmVnaXN0ZXIgaG9zdCwgZGV0YWNoaW5nLlxuIiwgbmFtZSk7CisgICAgICBnb3RvIGZyZWVkbWE7CisgICAgICB9CisKKyAgIHNoW2pdLT5pb19wb3J0ID0gcG9ydF9iYXNlOworICAgc2hbal0tPnVuaXF1ZV9pZCA9IHBvcnRfYmFzZTsKKyAgIHNoW2pdLT5uX2lvX3BvcnQgPSBSRUdJT05fU0laRTsKKyAgIHNoW2pdLT5iYXNlID0gYmlvc19zZWdtZW50X3RhYmxlW2NvbmZpZ18xLmJpb3Nfc2VnbWVudF07CisgICBzaFtqXS0+aXJxID0gaXJxOworICAgc2hbal0tPnNnX3RhYmxlc2l6ZSA9IE1BWF9TR0xJU1Q7CisgICBzaFtqXS0+dGhpc19pZCA9IGNvbmZpZ18yLmhhX3Njc2lfaWQ7CisgICBzaFtqXS0+Y2FuX3F1ZXVlID0gTUFYX01BSUxCT1hFUzsKKyAgIHNoW2pdLT5jbWRfcGVyX2x1biA9IE1BWF9DTURfUEVSX0xVTjsKKworI2lmIGRlZmluZWQoREVCVUdfREVURUNUKQorICAgeworICAgdW5zaWduZWQgY2hhciBzeXNfbWFzaywgbGNsX21hc2s7CisKKyAgIHN5c19tYXNrID0gaW5iKHNoW2pdLT5pb19wb3J0ICsgUkVHX1NZU19NQVNLKTsKKyAgIGxjbF9tYXNrID0gaW5iKHNoW2pdLT5pb19wb3J0ICsgUkVHX0xDTF9NQVNLKTsKKyAgIHByaW50aygiU1lTX01BU0sgMHgleCwgTENMX01BU0sgMHgleC5cbiIsIHN5c19tYXNrLCBsY2xfbWFzayk7CisgICB9CisjZW5kaWYKKworICAgLyogUHJvYmFibHkgYSBib2d1cyBob3N0IHNjc2kgaWQsIHNldCBpdCB0byB0aGUgZHVtbXkgdmFsdWUgKi8KKyAgIGlmIChzaFtqXS0+dGhpc19pZCA9PSAwKSBzaFtqXS0+dGhpc19pZCA9IC0xOworCisgICAvKiBJZiBCSU9TIGlzIGRpc2FibGVkLCBmb3JjZSBlbmFibGUgaW50ZXJydXB0cyAqLworICAgaWYgKHNoW2pdLT5iYXNlID09IDApIG91dGIoQ01EX0VOQV9JTlRSLCBzaFtqXS0+aW9fcG9ydCArIFJFR19TWVNfTUFTSyk7CisKKyAgIG1lbXNldChIRChqKSwgMCwgc2l6ZW9mKHN0cnVjdCBob3N0ZGF0YSkpOworICAgSEQoaiktPmhlYWRzID0gbWFwcGluZ190YWJsZVtjb25maWdfMi5tYXBwaW5nX21vZGVdLmhlYWRzOworICAgSEQoaiktPnNlY3RvcnMgPSBtYXBwaW5nX3RhYmxlW2NvbmZpZ18yLm1hcHBpbmdfbW9kZV0uc2VjdG9yczsKKyAgIEhEKGopLT5zdWJ2ZXJzaW9uID0gc3VidmVyc2lvbjsKKyAgIEhEKGopLT5wZGV2ID0gTlVMTDsKKyAgIEhEKGopLT5ib2FyZF9udW1iZXIgPSBqOworCisgICBpZiAoaGF2ZV9vbGRfZmlybXdhcmUpIHNoW2pdLT5zZ190YWJsZXNpemUgPSBNQVhfU0FGRV9TR0xJU1Q7CisKKyAgIGlmIChIRChqKS0+c3VidmVyc2lvbiA9PSBFU0EpIHsKKyAgICAgIHNoW2pdLT51bmNoZWNrZWRfaXNhX2RtYSA9IEZBTFNFOworICAgICAgc2hbal0tPmRtYV9jaGFubmVsID0gTk9fRE1BOworICAgICAgc3ByaW50ZihCTihqKSwgIlUzNEYlZCIsIGopOworICAgICAgYnVzX3R5cGUgPSAiVkVTQSI7CisgICAgICB9CisgICBlbHNlIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICBzaFtqXS0+dW5jaGVja2VkX2lzYV9kbWEgPSBUUlVFOworCisgICAgICBmbGFncz1jbGFpbV9kbWFfbG9jaygpOworICAgICAgZGlzYWJsZV9kbWEoZG1hX2NoYW5uZWwpOworICAgICAgY2xlYXJfZG1hX2ZmKGRtYV9jaGFubmVsKTsKKyAgICAgIHNldF9kbWFfbW9kZShkbWFfY2hhbm5lbCwgRE1BX01PREVfQ0FTQ0FERSk7CisgICAgICBlbmFibGVfZG1hKGRtYV9jaGFubmVsKTsKKyAgICAgIHJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCisgICAgICBzaFtqXS0+ZG1hX2NoYW5uZWwgPSBkbWFfY2hhbm5lbDsKKyAgICAgIHNwcmludGYoQk4oaiksICJVMTRGJWQiLCBqKTsKKyAgICAgIGJ1c190eXBlID0gIklTQSI7CisgICAgICB9CisKKyAgIHNoW2pdLT5tYXhfY2hhbm5lbCA9IE1BWF9DSEFOTkVMIC0gMTsKKyAgIHNoW2pdLT5tYXhfaWQgPSBNQVhfVEFSR0VUOworICAgc2hbal0tPm1heF9sdW4gPSBNQVhfTFVOOworCisgICBpZiAoSEQoaiktPnN1YnZlcnNpb24gPT0gSVNBICYmICFib2FyZF9pbnF1aXJ5KGopKSB7CisgICAgICBIRChqKS0+Ym9hcmRfaWRbNDBdID0gMDsKKworICAgICAgaWYgKHN0cmNtcCgmSEQoaiktPmJvYXJkX2lkWzMyXSwgIjA2MDAwNjAwIikpIHsKKyAgICAgICAgIHByaW50aygiJXM6ICVzLlxuIiwgQk4oaiksICZIRChqKS0+Ym9hcmRfaWRbOF0pOworICAgICAgICAgcHJpbnRrKCIlczogZmlybXdhcmUgJXMgaXMgb3V0ZGF0ZWQsIEZXIFBST00gc2hvdWxkIGJlIDI4MDA0LTAwNi5cbiIsCisgICAgICAgICAgICAgICAgQk4oaiksICZIRChqKS0+Ym9hcmRfaWRbMzJdKTsKKyAgICAgICAgIHNoW2pdLT5ob3N0dC0+dXNlX2NsdXN0ZXJpbmcgPSBESVNBQkxFX0NMVVNURVJJTkc7CisgICAgICAgICBzaFtqXS0+c2dfdGFibGVzaXplID0gTUFYX1NBRkVfU0dMSVNUOworICAgICAgICAgfQorICAgICAgfQorCisgICBpZiAoZG1hX2NoYW5uZWwgPT0gTk9fRE1BKSBzcHJpbnRmKGRtYV9uYW1lLCAiJXMiLCAiQk1TVCIpOworICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihkbWFfbmFtZSwgIkRNQSAldSIsIGRtYV9jaGFubmVsKTsKKworICAgc3Bpbl91bmxvY2tfaXJxKCZkcml2ZXJfbG9jayk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBzaFtqXS0+Y2FuX3F1ZXVlOyBpKyspCisgICAgICBIRChqKS0+Y3BbaV0uY3BfZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShIRChqKS0+cGRldiwKKyAgICAgICAgICAgICZIRChqKS0+Y3BbaV0sIHNpemVvZihzdHJ1Y3QgbXNjcCksIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBzaFtqXS0+Y2FuX3F1ZXVlOyBpKyspCisgICAgICBpZiAoISAoKCZIRChqKS0+Y3BbaV0pLT5zZ2xpc3QgPSBrbWFsbG9jKAorICAgICAgICAgICAgc2hbal0tPnNnX3RhYmxlc2l6ZSAqIHNpemVvZihzdHJ1Y3Qgc2dfbGlzdCksCisgICAgICAgICAgICAoc2hbal0tPnVuY2hlY2tlZF9pc2FfZG1hID8gR0ZQX0RNQSA6IDApIHwgR0ZQX0FUT01JQykpKSB7CisgICAgICAgICBwcmludGsoIiVzOiBrbWFsbG9jIFNHbGlzdCBmYWlsZWQsIG1ib3ggJWQsIGRldGFjaGluZy5cbiIsIEJOKGopLCBpKTsKKyAgICAgICAgIGdvdG8gcmVsZWFzZTsKKyAgICAgICAgIH0KKworICAgaWYgKG1heF9xdWV1ZV9kZXB0aCA+IE1BWF9UQUdHRURfQ01EX1BFUl9MVU4pCisgICAgICAgbWF4X3F1ZXVlX2RlcHRoID0gTUFYX1RBR0dFRF9DTURfUEVSX0xVTjsKKworICAgaWYgKG1heF9xdWV1ZV9kZXB0aCA8IE1BWF9DTURfUEVSX0xVTikgbWF4X3F1ZXVlX2RlcHRoID0gTUFYX0NNRF9QRVJfTFVOOworCisgICBpZiAodGFnX21vZGUgIT0gVEFHX0RJU0FCTEVEICYmIHRhZ19tb2RlICE9IFRBR19TSU1QTEUpCisgICAgICB0YWdfbW9kZSA9IFRBR19PUkRFUkVEOworCisgICBpZiAoaiA9PSAwKSB7CisgICAgICBwcmludGsoIlVsdHJhU3RvciAxNEYvMzRGOiBDb3B5cmlnaHQgKEMpIDE5OTQtMjAwMyBEYXJpbyBCYWxsYWJpby5cbiIpOworICAgICAgcHJpbnRrKCIlcyBjb25maWcgb3B0aW9ucyAtPiBvZjolYywgdG06JWQsIGxjOiVjLCBtcTolZCwgZXQ6JWMuXG4iLAorICAgICAgICAgICAgIGRyaXZlcl9uYW1lLCBZRVNOTyhoYXZlX29sZF9maXJtd2FyZSksIHRhZ19tb2RlLAorICAgICAgICAgICAgIFlFU05PKGxpbmtlZF9jb21tKSwgbWF4X3F1ZXVlX2RlcHRoLCBZRVNOTyhleHRfdHJhbikpOworICAgICAgfQorCisgICBwcmludGsoIiVzOiAlcyAweCUwM2x4LCBCSU9TIDB4JTA1eCwgSVJRICV1LCAlcywgU0cgJWQsIE1CICVkLlxuIiwKKyAgICAgICAgICBCTihqKSwgYnVzX3R5cGUsICh1bnNpZ25lZCBsb25nKXNoW2pdLT5pb19wb3J0LCAoaW50KXNoW2pdLT5iYXNlLAorICAgICAgICAgIHNoW2pdLT5pcnEsIGRtYV9uYW1lLCBzaFtqXS0+c2dfdGFibGVzaXplLCBzaFtqXS0+Y2FuX3F1ZXVlKTsKKworICAgaWYgKHNoW2pdLT5tYXhfaWQgPiA4IHx8IHNoW2pdLT5tYXhfbHVuID4gOCkKKyAgICAgIHByaW50aygiJXM6IHdpZGUgU0NTSSBzdXBwb3J0IGVuYWJsZWQsIG1heF9pZCAldSwgbWF4X2x1biAldS5cbiIsCisgICAgICAgICAgICAgQk4oaiksIHNoW2pdLT5tYXhfaWQsIHNoW2pdLT5tYXhfbHVuKTsKKworICAgZm9yIChpID0gMDsgaSA8PSBzaFtqXS0+bWF4X2NoYW5uZWw7IGkrKykKKyAgICAgIHByaW50aygiJXM6IFNDU0kgY2hhbm5lbCAldSBlbmFibGVkLCBob3N0IHRhcmdldCBJRCAlZC5cbiIsCisgICAgICAgICAgICAgQk4oaiksIGksIHNoW2pdLT50aGlzX2lkKTsKKworICAgcmV0dXJuIFRSVUU7CisKK2ZyZWVkbWE6CisgICBpZiAoc3VidmVyc2lvbiA9PSBJU0EpIGZyZWVfZG1hKGRtYV9jaGFubmVsKTsKK2ZyZWVpcnE6CisgICBmcmVlX2lycShpcnEsICZzaGFbal0pOworZnJlZWxvY2s6CisgICBzcGluX3VubG9ja19pcnEoJmRyaXZlcl9sb2NrKTsKKyAgIHJlbGVhc2VfcmVnaW9uKHBvcnRfYmFzZSwgUkVHSU9OX1NJWkUpOworZmFpbDoKKyAgIHJldHVybiBGQUxTRTsKKworcmVsZWFzZToKKyAgIHUxNF8zNGZfcmVsZWFzZShzaFtqXSk7CisgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkIGludGVybmFsX3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKSB7CisgICBpbnQgaSwgYXJnYyA9IGludHNbMF07CisgICBjaGFyICpjdXIgPSBzdHIsICpwYzsKKworICAgaWYgKGFyZ2MgPiAwKSB7CisKKyAgICAgIGlmIChhcmdjID4gTUFYX0lOVF9QQVJBTSkgYXJnYyA9IE1BWF9JTlRfUEFSQU07CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIGlvX3BvcnRbaV0gPSBpbnRzW2kgKyAxXTsKKworICAgICAgaW9fcG9ydFtpXSA9IDA7CisgICAgICBzZXR1cF9kb25lID0gVFJVRTsKKyAgICAgIH0KKworICAgd2hpbGUgKGN1ciAmJiAocGMgPSBzdHJjaHIoY3VyLCAnOicpKSkgeworICAgICAgaW50IHZhbCA9IDAsIGMgPSAqKytwYzsKKworICAgICAgaWYgKGMgPT0gJ24nIHx8IGMgPT0gJ04nKSB2YWwgPSBGQUxTRTsKKyAgICAgIGVsc2UgaWYgKGMgPT0gJ3knIHx8IGMgPT0gJ1knKSB2YWwgPSBUUlVFOworICAgICAgZWxzZSB2YWwgPSAoaW50KSBzaW1wbGVfc3RydG91bChwYywgTlVMTCwgMCk7CisKKyAgICAgIGlmICghc3RybmNtcChjdXIsICJsYzoiLCAzKSkgbGlua2VkX2NvbW0gPSB2YWw7CisgICAgICBlbHNlIGlmICghc3RybmNtcChjdXIsICJvZjoiLCAzKSkgaGF2ZV9vbGRfZmlybXdhcmUgPSB2YWw7CisgICAgICBlbHNlIGlmICghc3RybmNtcChjdXIsICJ0bToiLCAzKSkgdGFnX21vZGUgPSB2YWw7CisgICAgICBlbHNlIGlmICghc3RybmNtcChjdXIsICJ0YzoiLCAzKSkgdGFnX21vZGUgPSB2YWw7CisgICAgICBlbHNlIGlmICghc3RybmNtcChjdXIsICJtcToiLCAzKSkgIG1heF9xdWV1ZV9kZXB0aCA9IHZhbDsKKyAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGN1ciwgImxzOiIsIDMpKSAgbGlua19zdGF0aXN0aWNzID0gdmFsOworICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoY3VyLCAiZXQ6IiwgMykpICBleHRfdHJhbiA9IHZhbDsKKworICAgICAgaWYgKChjdXIgPSBzdHJjaHIoY3VyLCAnLCcpKSkgKytjdXI7CisgICAgICB9CisKKyAgIHJldHVybjsKK30KKworc3RhdGljIGludCBvcHRpb25fc2V0dXAoY2hhciAqc3RyKSB7CisgICBpbnQgaW50c1tNQVhfSU5UX1BBUkFNXTsKKyAgIGNoYXIgKmN1ciA9IHN0cjsKKyAgIGludCBpID0gMTsKKworICAgd2hpbGUgKGN1ciAmJiBpc2RpZ2l0KCpjdXIpICYmIGkgPD0gTUFYX0lOVF9QQVJBTSkgeworICAgICAgaW50c1tpKytdID0gc2ltcGxlX3N0cnRvdWwoY3VyLCBOVUxMLCAwKTsKKworICAgICAgaWYgKChjdXIgPSBzdHJjaHIoY3VyLCAnLCcpKSAhPSBOVUxMKSBjdXIrKzsKKyAgIH0KKworICAgaW50c1swXSA9IGkgLSAxOworICAgaW50ZXJuYWxfc2V0dXAoY3VyLCBpbnRzKTsKKyAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHUxNF8zNGZfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpIHsKKyAgIHVuc2lnbmVkIGludCBqID0gMCwgazsKKworICAgdHBudC0+cHJvY19uYW1lID0gInUxNC0zNGYiOworCisgICBpZihzdHJsZW4oYm9vdF9vcHRpb25zKSkgb3B0aW9uX3NldHVwKGJvb3Rfb3B0aW9ucyk7CisKKyNpZiBkZWZpbmVkKE1PRFVMRSkKKyAgIC8qIGlvX3BvcnQgY291bGQgaGF2ZSBiZWVuIG1vZGlmaWVkIHdoZW4gbG9hZGluZyBhcyBhIG1vZHVsZSAqLworICAgaWYoaW9fcG9ydFswXSAhPSBTS0lQKSB7CisgICAgICBzZXR1cF9kb25lID0gVFJVRTsKKyAgICAgIGlvX3BvcnRbTUFYX0lOVF9QQVJBTV0gPSAwOworICAgICAgfQorI2VuZGlmCisKKyAgIGZvciAoayA9IDA7IGsgPCBNQVhfQk9BUkRTICsgMTsgaysrKSBzaFtrXSA9IE5VTEw7CisKKyAgIGZvciAoayA9IDA7IGlvX3BvcnRba107IGsrKykgeworCisgICAgICBpZiAoaW9fcG9ydFtrXSA9PSBTS0lQKSBjb250aW51ZTsKKworICAgICAgaWYgKGogPCBNQVhfQk9BUkRTICYmIHBvcnRfZGV0ZWN0KGlvX3BvcnRba10sIGosIHRwbnQpKSBqKys7CisgICAgICB9CisKKyAgIG51bV9ib2FyZHMgPSBqOworICAgcmV0dXJuIGo7Cit9CisKK3N0YXRpYyB2b2lkIG1hcF9kbWEodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBqKSB7CisgICB1bnNpZ25lZCBpbnQgZGF0YV9sZW4gPSAwOworICAgdW5zaWduZWQgaW50IGssIGNvdW50LCBwY2lfZGlyOworICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ3BudDsKKyAgIHN0cnVjdCBtc2NwICpjcHA7CisgICBzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudDsKKworICAgY3BwID0gJkhEKGopLT5jcFtpXTsgU0NwbnQgPSBjcHAtPlNDcG50OworICAgcGNpX2RpciA9IFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbjsKKworICAgaWYgKFNDcG50LT5zZW5zZV9idWZmZXIpCisgICAgICBjcHAtPnNlbnNlX2FkZHIgPSBIMkRFVihwY2lfbWFwX3NpbmdsZShIRChqKS0+cGRldiwgU0NwbnQtPnNlbnNlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiBTQ3BudC0+c2Vuc2VfYnVmZmVyLCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKworICAgY3BwLT5zZW5zZV9sZW4gPSBzaXplb2YgU0NwbnQtPnNlbnNlX2J1ZmZlcjsKKworICAgaWYgKCFTQ3BudC0+dXNlX3NnKSB7CisKKyAgICAgIC8qIElmIHdlIGdldCBoZXJlIHdpdGggUENJX0RNQV9OT05FLCBwY2lfbWFwX3NpbmdsZSB0cmlnZ2VycyBhIEJVRygpICovCisgICAgICBpZiAoIVNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4pIHBjaV9kaXIgPSBQQ0lfRE1BX0JJRElSRUNUSU9OQUw7CisKKyAgICAgIGlmIChTQ3BudC0+cmVxdWVzdF9idWZmZXIpCisgICAgICAgICBjcHAtPmRhdGFfYWRkcmVzcyA9IEgyREVWKHBjaV9tYXBfc2luZ2xlKEhEKGopLT5wZGV2LAorICAgICAgICAgICAgICAgICAgU0NwbnQtPnJlcXVlc3RfYnVmZmVyLCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuLCBwY2lfZGlyKSk7CisKKyAgICAgIGNwcC0+ZGF0YV9sZW4gPSBIMkRFVihTQ3BudC0+cmVxdWVzdF9idWZmbGVuKTsKKyAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgc2dwbnQgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKyAgIGNvdW50ID0gcGNpX21hcF9zZyhIRChqKS0+cGRldiwgc2dwbnQsIFNDcG50LT51c2Vfc2csIHBjaV9kaXIpOworCisgICBmb3IgKGsgPSAwOyBrIDwgY291bnQ7IGsrKykgeworICAgICAgY3BwLT5zZ2xpc3Rba10uYWRkcmVzcyA9IEgyREVWKHNnX2RtYV9hZGRyZXNzKCZzZ3BudFtrXSkpOworICAgICAgY3BwLT5zZ2xpc3Rba10ubnVtX2J5dGVzID0gSDJERVYoc2dfZG1hX2xlbigmc2dwbnRba10pKTsKKyAgICAgIGRhdGFfbGVuICs9IHNncG50W2tdLmxlbmd0aDsKKyAgICAgIH0KKworICAgY3BwLT5zZyA9IFRSVUU7CisgICBjcHAtPnVzZV9zZyA9IFNDcG50LT51c2Vfc2c7CisgICBjcHAtPmRhdGFfYWRkcmVzcyA9IEgyREVWKHBjaV9tYXBfc2luZ2xlKEhEKGopLT5wZGV2LCBjcHAtPnNnbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NwbnQtPnVzZV9zZyAqIHNpemVvZihzdHJ1Y3Qgc2dfbGlzdCksIHBjaV9kaXIpKTsKKyAgIGNwcC0+ZGF0YV9sZW4gPSBIMkRFVihkYXRhX2xlbik7Cit9CisKK3N0YXRpYyB2b2lkIHVubWFwX2RtYSh1bnNpZ25lZCBpbnQgaSwgdW5zaWduZWQgaW50IGopIHsKKyAgIHVuc2lnbmVkIGludCBwY2lfZGlyOworICAgc3RydWN0IG1zY3AgKmNwcDsKKyAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OworCisgICBjcHAgPSAmSEQoaiktPmNwW2ldOyBTQ3BudCA9IGNwcC0+U0NwbnQ7CisgICBwY2lfZGlyID0gU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uOworCisgICBpZiAoREVWMkgoY3BwLT5zZW5zZV9hZGRyKSkKKyAgICAgIHBjaV91bm1hcF9zaW5nbGUoSEQoaiktPnBkZXYsIERFVjJIKGNwcC0+c2Vuc2VfYWRkciksCisgICAgICAgICAgICAgICAgICAgICAgIERFVjJIKGNwcC0+c2Vuc2VfbGVuKSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworICAgaWYgKFNDcG50LT51c2Vfc2cpCisgICAgICBwY2lfdW5tYXBfc2coSEQoaiktPnBkZXYsIFNDcG50LT5yZXF1ZXN0X2J1ZmZlciwgU0NwbnQtPnVzZV9zZywgcGNpX2Rpcik7CisKKyAgIGlmICghREVWMkgoY3BwLT5kYXRhX2xlbikpIHBjaV9kaXIgPSBQQ0lfRE1BX0JJRElSRUNUSU9OQUw7CisKKyAgIGlmIChERVYySChjcHAtPmRhdGFfYWRkcmVzcykpCisgICAgICBwY2lfdW5tYXBfc2luZ2xlKEhEKGopLT5wZGV2LCBERVYySChjcHAtPmRhdGFfYWRkcmVzcyksCisgICAgICAgICAgICAgICAgICAgICAgIERFVjJIKGNwcC0+ZGF0YV9sZW4pLCBwY2lfZGlyKTsKK30KKworc3RhdGljIHZvaWQgc3luY19kbWEodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBqKSB7CisgICB1bnNpZ25lZCBpbnQgcGNpX2RpcjsKKyAgIHN0cnVjdCBtc2NwICpjcHA7CisgICBzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudDsKKworICAgY3BwID0gJkhEKGopLT5jcFtpXTsgU0NwbnQgPSBjcHAtPlNDcG50OworICAgcGNpX2RpciA9IFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbjsKKworICAgaWYgKERFVjJIKGNwcC0+c2Vuc2VfYWRkcikpCisgICAgICBwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoSEQoaiktPnBkZXYsIERFVjJIKGNwcC0+c2Vuc2VfYWRkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgIERFVjJIKGNwcC0+c2Vuc2VfbGVuKSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworICAgaWYgKFNDcG50LT51c2Vfc2cpCisgICAgICBwY2lfZG1hX3N5bmNfc2dfZm9yX2NwdShIRChqKS0+cGRldiwgU0NwbnQtPnJlcXVlc3RfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNDcG50LT51c2Vfc2csIHBjaV9kaXIpOworCisgICBpZiAoIURFVjJIKGNwcC0+ZGF0YV9sZW4pKSBwY2lfZGlyID0gUENJX0RNQV9CSURJUkVDVElPTkFMOworCisgICBpZiAoREVWMkgoY3BwLT5kYXRhX2FkZHJlc3MpKQorICAgICAgcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KEhEKGopLT5wZGV2LCBERVYySChjcHAtPmRhdGFfYWRkcmVzcyksCisgICAgICAgICAgICAgICAgICAgICAgIERFVjJIKGNwcC0+ZGF0YV9sZW4pLCBwY2lfZGlyKTsKK30KKworc3RhdGljIHZvaWQgc2NzaV90b19kZXZfZGlyKHVuc2lnbmVkIGludCBpLCB1bnNpZ25lZCBpbnQgaikgeworICAgdW5zaWduZWQgaW50IGs7CisKKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRhdGFfb3V0X2NtZHNbXSA9IHsKKyAgICAgIDB4MGEsIDB4MmEsIDB4MTUsIDB4NTUsIDB4MDQsIDB4MDcsIDB4MTgsIDB4MWQsIDB4MjQsIDB4MmUsCisgICAgICAweDMwLCAweDMxLCAweDMyLCAweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNkLCAweDNmLCAweDQwLAorICAgICAgMHg0MSwgMHg0YywgMHhhYSwgMHhhZSwgMHhiMCwgMHhiMSwgMHhiMiwgMHhiNiwgMHhlYSwgMHgxYiwgMHg1ZAorICAgICAgfTsKKworICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGF0YV9ub25lX2NtZHNbXSA9IHsKKyAgICAgIDB4MDEsIDB4MGIsIDB4MTAsIDB4MTEsIDB4MTMsIDB4MTYsIDB4MTcsIDB4MTksIDB4MmIsIDB4MWUsCisgICAgICAweDJjLCAweGFjLCAweDJmLCAweGFmLCAweDMzLCAweGIzLCAweDM1LCAweDM2LCAweDQ1LCAweDQ3LAorICAgICAgMHg0OCwgMHg0OSwgMHhhOSwgMHg0YiwgMHhhNSwgMHhhNiwgMHhiNSwgMHgwMAorICAgICAgfTsKKworICAgc3RydWN0IG1zY3AgKmNwcDsKKyAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OworCisgICBjcHAgPSAmSEQoaiktPmNwW2ldOyBTQ3BudCA9IGNwcC0+U0NwbnQ7CisKKyAgIGlmIChTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSB7CisgICAgICBjcHAtPnhkaXIgPSBEVERfSU47CisgICAgICByZXR1cm47CisgICAgICB9CisgICBlbHNlIGlmIChTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSB7CisgICAgICBjcHAtPnhkaXIgPSBEVERfT1VUOworICAgICAgcmV0dXJuOworICAgICAgfQorICAgZWxzZSBpZiAoU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9OT05FKSB7CisgICAgICBjcHAtPnhkaXIgPSBEVERfTk9ORTsKKyAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgaWYgKFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiAhPSBETUFfQklESVJFQ1RJT05BTCkKKyAgICAgIHBhbmljKCIlczogcWNvbW0sIGludmFsaWQgU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uLlxuIiwgQk4oaikpOworCisgICBjcHAtPnhkaXIgPSBEVERfSU47CisKKyAgIGZvciAoayA9IDA7IGsgPCBBUlJBWV9TSVpFKGRhdGFfb3V0X2NtZHMpOyBrKyspCisgICAgICBpZiAoU0NwbnQtPmNtbmRbMF0gPT0gZGF0YV9vdXRfY21kc1trXSkgeworICAgICAgICAgY3BwLT54ZGlyID0gRFREX09VVDsKKyAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICBpZiAoY3BwLT54ZGlyID09IERURF9JTikKKyAgICAgIGZvciAoayA9IDA7IGsgPCBBUlJBWV9TSVpFKGRhdGFfbm9uZV9jbWRzKTsgaysrKQorICAgICAgICAgaWYgKFNDcG50LT5jbW5kWzBdID09IGRhdGFfbm9uZV9jbWRzW2tdKSB7CisgICAgICAgICAgICBjcHAtPnhkaXIgPSBEVERfTk9ORTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCit9CisKK3N0YXRpYyBpbnQgdTE0XzM0Zl9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKSB7CisgICB1bnNpZ25lZCBpbnQgaSwgaiwgazsKKyAgIHN0cnVjdCBtc2NwICpjcHA7CisKKyAgIC8qIGogaXMgdGhlIGJvYXJkIG51bWJlciAqLworICAgaiA9ICgoc3RydWN0IGhvc3RkYXRhICopIFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhKS0+Ym9hcmRfbnVtYmVyOworCisgICBpZiAoU0NwbnQtPmhvc3Rfc2NyaWJibGUpCisgICAgICBwYW5pYygiJXM6IHFjb21tLCBwaWQgJWxkLCBTQ3BudCAlcCBhbHJlYWR5IGFjdGl2ZS5cbiIsCisgICAgICAgICAgICBCTihqKSwgU0NwbnQtPnBpZCwgU0NwbnQpOworCisgICAvKiBpIGlzIHRoZSBtYWlsYm94IG51bWJlciwgbG9vayBmb3IgdGhlIGZpcnN0IGZyZWUgbWFpbGJveAorICAgICAgc3RhcnRpbmcgZnJvbSBsYXN0X2NwX3VzZWQgKi8KKyAgIGkgPSBIRChqKS0+bGFzdF9jcF91c2VkICsgMTsKKworICAgZm9yIChrID0gMDsgayA8IHNoW2pdLT5jYW5fcXVldWU7IGsrKywgaSsrKSB7CisKKyAgICAgIGlmIChpID49IHNoW2pdLT5jYW5fcXVldWUpIGkgPSAwOworCisgICAgICBpZiAoSEQoaiktPmNwX3N0YXRbaV0gPT0gRlJFRSkgeworICAgICAgICAgSEQoaiktPmxhc3RfY3BfdXNlZCA9IGk7CisgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgaWYgKGsgPT0gc2hbal0tPmNhbl9xdWV1ZSkgeworICAgICAgcHJpbnRrKCIlczogcWNvbW0sIG5vIGZyZWUgbWFpbGJveC5cbiIsIEJOKGopKTsKKyAgICAgIHJldHVybiAxOworICAgICAgfQorCisgICAvKiBTZXQgcG9pbnRlciB0byBjb250cm9sIHBhY2tldCBzdHJ1Y3R1cmUgKi8KKyAgIGNwcCA9ICZIRChqKS0+Y3BbaV07CisKKyAgIG1lbXNldChjcHAsIDAsIHNpemVvZihzdHJ1Y3QgbXNjcCkgLSBDUF9UQUlMX1NJWkUpOworICAgU0NwbnQtPnNjc2lfZG9uZSA9IGRvbmU7CisgICBjcHAtPmNwcF9pbmRleCA9IGk7CisgICBTQ3BudC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopICZjcHAtPmNwcF9pbmRleDsKKworICAgaWYgKGRvX3RyYWNlKSBwcmludGsoIiVzOiBxY29tbSwgbWJveCAlZCwgdGFyZ2V0ICVkLiVkOiVkLCBwaWQgJWxkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJOKGopLCBpLCBTQ3BudC0+ZGV2aWNlLT5jaGFubmVsLCBTQ3BudC0+ZGV2aWNlLT5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNDcG50LT5kZXZpY2UtPmx1biwgU0NwbnQtPnBpZCk7CisKKyAgIGNwcC0+b3Bjb2RlID0gT1BfU0NTSTsKKyAgIGNwcC0+Y2hhbm5lbCA9IFNDcG50LT5kZXZpY2UtPmNoYW5uZWw7CisgICBjcHAtPnRhcmdldCA9IFNDcG50LT5kZXZpY2UtPmlkOworICAgY3BwLT5sdW4gPSBTQ3BudC0+ZGV2aWNlLT5sdW47CisgICBjcHAtPlNDcG50ID0gU0NwbnQ7CisgICBjcHAtPmNkYl9sZW4gPSBTQ3BudC0+Y21kX2xlbjsKKyAgIG1lbWNweShjcHAtPmNkYiwgU0NwbnQtPmNtbmQsIFNDcG50LT5jbWRfbGVuKTsKKworICAgLyogVXNlIGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uIFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiAqLworICAgc2NzaV90b19kZXZfZGlyKGksIGopOworCisgICAvKiBNYXAgRE1BIGJ1ZmZlcnMgYW5kIFNHIGxpc3QgKi8KKyAgIG1hcF9kbWEoaSwgaik7CisKKyAgIGlmIChsaW5rZWRfY29tbSAmJiBTQ3BudC0+ZGV2aWNlLT5xdWV1ZV9kZXB0aCA+IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBUTERFVihTQ3BudC0+ZGV2aWNlLT50eXBlKSkgeworICAgICAgSEQoaiktPmNwX3N0YXRbaV0gPSBSRUFEWTsKKyAgICAgIGZsdXNoX2RldihTQ3BudC0+ZGV2aWNlLCBTQ3BudC0+cmVxdWVzdC0+c2VjdG9yLCBqLCBGQUxTRSk7CisgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgaWYgKHdhaXRfb25fYnVzeShzaFtqXS0+aW9fcG9ydCwgTUFYTE9PUCkpIHsKKyAgICAgIHVubWFwX2RtYShpLCBqKTsKKyAgICAgIFNDcG50LT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKyAgICAgIHByaW50aygiJXM6IHFjb21tLCB0YXJnZXQgJWQuJWQ6JWQsIHBpZCAlbGQsIGFkYXB0ZXIgYnVzeS5cbiIsCisgICAgICAgICAgICAgQk4oaiksIFNDcG50LT5kZXZpY2UtPmNoYW5uZWwsIFNDcG50LT5kZXZpY2UtPmlkLCBTQ3BudC0+ZGV2aWNlLT5sdW4sIFNDcG50LT5waWQpOworICAgICAgcmV0dXJuIDE7CisgICAgICB9CisKKyAgIC8qIFN0b3JlIHBvaW50ZXIgaW4gT0dNIGFkZHJlc3MgYnl0ZXMgKi8KKyAgIG91dGwoSDJERVYoY3BwLT5jcF9kbWFfYWRkciksIHNoW2pdLT5pb19wb3J0ICsgUkVHX09HTSk7CisKKyAgIC8qIElzc3VlIE9HTSBpbnRlcnJ1cHQgKi8KKyAgIG91dGIoQ01EX09HTV9JTlRSLCBzaFtqXS0+aW9fcG9ydCArIFJFR19MQ0xfSU5UUik7CisKKyAgIEhEKGopLT5jcF9zdGF0W2ldID0gSU5fVVNFOworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdTE0XzM0Zl9laF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ2FyZykgeworICAgdW5zaWduZWQgaW50IGksIGo7CisKKyAgIGogPSAoKHN0cnVjdCBob3N0ZGF0YSAqKSBTQ2FyZy0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSktPmJvYXJkX251bWJlcjsKKworICAgaWYgKFNDYXJnLT5ob3N0X3NjcmliYmxlID09IE5VTEwpIHsKKyAgICAgIHByaW50aygiJXM6IGFib3J0LCB0YXJnZXQgJWQuJWQ6JWQsIHBpZCAlbGQgaW5hY3RpdmUuXG4iLAorICAgICAgICAgICAgIEJOKGopLCBTQ2FyZy0+ZGV2aWNlLT5jaGFubmVsLCBTQ2FyZy0+ZGV2aWNlLT5pZCwgU0NhcmctPmRldmljZS0+bHVuLCBTQ2FyZy0+cGlkKTsKKyAgICAgIHJldHVybiBTVUNDRVNTOworICAgICAgfQorCisgICBpID0gKih1bnNpZ25lZCBpbnQgKilTQ2FyZy0+aG9zdF9zY3JpYmJsZTsKKyAgIHByaW50aygiJXM6IGFib3J0LCBtYm94ICVkLCB0YXJnZXQgJWQuJWQ6JWQsIHBpZCAlbGQuXG4iLAorICAgICAgICAgIEJOKGopLCBpLCBTQ2FyZy0+ZGV2aWNlLT5jaGFubmVsLCBTQ2FyZy0+ZGV2aWNlLT5pZCwgU0NhcmctPmRldmljZS0+bHVuLCBTQ2FyZy0+cGlkKTsKKworICAgaWYgKGkgPj0gc2hbal0tPmNhbl9xdWV1ZSkKKyAgICAgIHBhbmljKCIlczogYWJvcnQsIGludmFsaWQgU0NhcmctPmhvc3Rfc2NyaWJibGUuXG4iLCBCTihqKSk7CisKKyAgIGlmICh3YWl0X29uX2J1c3koc2hbal0tPmlvX3BvcnQsIE1BWExPT1ApKSB7CisgICAgICBwcmludGsoIiVzOiBhYm9ydCwgdGltZW91dCBlcnJvci5cbiIsIEJOKGopKTsKKyAgICAgIHJldHVybiBGQUlMRUQ7CisgICAgICB9CisKKyAgIGlmIChIRChqKS0+Y3Bfc3RhdFtpXSA9PSBGUkVFKSB7CisgICAgICBwcmludGsoIiVzOiBhYm9ydCwgbWJveCAlZCBpcyBmcmVlLlxuIiwgQk4oaiksIGkpOworICAgICAgcmV0dXJuIFNVQ0NFU1M7CisgICAgICB9CisKKyAgIGlmIChIRChqKS0+Y3Bfc3RhdFtpXSA9PSBJTl9VU0UpIHsKKyAgICAgIHByaW50aygiJXM6IGFib3J0LCBtYm94ICVkIGlzIGluIHVzZS5cbiIsIEJOKGopLCBpKTsKKworICAgICAgaWYgKFNDYXJnICE9IEhEKGopLT5jcFtpXS5TQ3BudCkKKyAgICAgICAgIHBhbmljKCIlczogYWJvcnQsIG1ib3ggJWQsIFNDYXJnICVwLCBjcCBTQ3BudCAlcC5cbiIsCisgICAgICAgICAgICAgICBCTihqKSwgaSwgU0NhcmcsIEhEKGopLT5jcFtpXS5TQ3BudCk7CisKKyAgICAgIGlmIChpbmIoc2hbal0tPmlvX3BvcnQgKyBSRUdfU1lTX0lOVFIpICYgSVJRX0FTU0VSVEVEKQorICAgICAgICAgcHJpbnRrKCIlczogYWJvcnQsIG1ib3ggJWQsIGludGVycnVwdCBwZW5kaW5nLlxuIiwgQk4oaiksIGkpOworCisgICAgICBpZiAoU0NhcmctPmVoX3N0YXRlID09IFNDU0lfU1RBVEVfVElNRU9VVCkgeworICAgICAgICAgdW5tYXBfZG1hKGksIGopOworICAgICAgICAgU0NhcmctPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworICAgICAgICAgSEQoaiktPmNwX3N0YXRbaV0gPSBGUkVFOworICAgICAgICAgcHJpbnRrKCIlcywgYWJvcnQsIG1ib3ggJWQsIGVoX3N0YXRlIHRpbWVvdXQsIHBpZCAlbGQuXG4iLAorICAgICAgICAgICAgICAgIEJOKGopLCBpLCBTQ2FyZy0+cGlkKTsKKyAgICAgICAgIHJldHVybiBTVUNDRVNTOworICAgICAgICAgfQorCisgICAgICByZXR1cm4gRkFJTEVEOworICAgICAgfQorCisgICBpZiAoSEQoaiktPmNwX3N0YXRbaV0gPT0gSU5fUkVTRVQpIHsKKyAgICAgIHByaW50aygiJXM6IGFib3J0LCBtYm94ICVkIGlzIGluIHJlc2V0LlxuIiwgQk4oaiksIGkpOworICAgICAgcmV0dXJuIEZBSUxFRDsKKyAgICAgIH0KKworICAgaWYgKEhEKGopLT5jcF9zdGF0W2ldID09IExPQ0tFRCkgeworICAgICAgcHJpbnRrKCIlczogYWJvcnQsIG1ib3ggJWQgaXMgbG9ja2VkLlxuIiwgQk4oaiksIGkpOworICAgICAgcmV0dXJuIFNVQ0NFU1M7CisgICAgICB9CisKKyAgIGlmIChIRChqKS0+Y3Bfc3RhdFtpXSA9PSBSRUFEWSB8fCBIRChqKS0+Y3Bfc3RhdFtpXSA9PSBBQk9SVElORykgeworICAgICAgdW5tYXBfZG1hKGksIGopOworICAgICAgU0NhcmctPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKyAgICAgIFNDYXJnLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKyAgICAgIEhEKGopLT5jcF9zdGF0W2ldID0gRlJFRTsKKyAgICAgIHByaW50aygiJXMsIGFib3J0LCBtYm94ICVkIHJlYWR5LCBESURfQUJPUlQsIHBpZCAlbGQgZG9uZS5cbiIsCisgICAgICAgICAgICAgQk4oaiksIGksIFNDYXJnLT5waWQpOworICAgICAgU0NhcmctPnNjc2lfZG9uZShTQ2FyZyk7CisgICAgICByZXR1cm4gU1VDQ0VTUzsKKyAgICAgIH0KKworICAgcGFuaWMoIiVzOiBhYm9ydCwgbWJveCAlZCwgaW52YWxpZCBjcF9zdGF0LlxuIiwgQk4oaiksIGkpOworfQorCitzdGF0aWMgaW50IHUxNF8zNGZfZWhfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ2FyZykgeworICAgdW5zaWduZWQgaW50IGksIGosIHRpbWUsIGssIGMsIGxpbWl0ID0gMDsKKyAgIGludCBhcmdfZG9uZSA9IEZBTFNFOworICAgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CisKKyAgIGogPSAoKHN0cnVjdCBob3N0ZGF0YSAqKSBTQ2FyZy0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSktPmJvYXJkX251bWJlcjsKKyAgIHByaW50aygiJXM6IHJlc2V0LCBlbnRlciwgdGFyZ2V0ICVkLiVkOiVkLCBwaWQgJWxkLlxuIiwKKyAgICAgICAgICBCTihqKSwgU0NhcmctPmRldmljZS0+Y2hhbm5lbCwgU0NhcmctPmRldmljZS0+aWQsIFNDYXJnLT5kZXZpY2UtPmx1biwgU0NhcmctPnBpZCk7CisKKyAgIGlmIChTQ2FyZy0+aG9zdF9zY3JpYmJsZSA9PSBOVUxMKQorICAgICAgcHJpbnRrKCIlczogcmVzZXQsIHBpZCAlbGQgaW5hY3RpdmUuXG4iLCBCTihqKSwgU0NhcmctPnBpZCk7CisKKyAgIGlmIChIRChqKS0+aW5fcmVzZXQpIHsKKyAgICAgIHByaW50aygiJXM6IHJlc2V0LCBleGl0LCBhbHJlYWR5IGluIHJlc2V0LlxuIiwgQk4oaikpOworICAgICAgcmV0dXJuIEZBSUxFRDsKKyAgICAgIH0KKworICAgaWYgKHdhaXRfb25fYnVzeShzaFtqXS0+aW9fcG9ydCwgTUFYTE9PUCkpIHsKKyAgICAgIHByaW50aygiJXM6IHJlc2V0LCBleGl0LCB0aW1lb3V0IGVycm9yLlxuIiwgQk4oaikpOworICAgICAgcmV0dXJuIEZBSUxFRDsKKyAgICAgIH0KKworICAgSEQoaiktPnJldHJpZXMgPSAwOworCisgICBmb3IgKGMgPSAwOyBjIDw9IHNoW2pdLT5tYXhfY2hhbm5lbDsgYysrKQorICAgICAgZm9yIChrID0gMDsgayA8IHNoW2pdLT5tYXhfaWQ7IGsrKykgeworICAgICAgICAgSEQoaiktPnRhcmdldF9yZWRvW2tdW2NdID0gVFJVRTsKKyAgICAgICAgIEhEKGopLT50YXJnZXRfdG9ba11bY10gPSAwOworICAgICAgICAgfQorCisgICBmb3IgKGkgPSAwOyBpIDwgc2hbal0tPmNhbl9xdWV1ZTsgaSsrKSB7CisKKyAgICAgIGlmIChIRChqKS0+Y3Bfc3RhdFtpXSA9PSBGUkVFKSBjb250aW51ZTsKKworICAgICAgaWYgKEhEKGopLT5jcF9zdGF0W2ldID09IExPQ0tFRCkgeworICAgICAgICAgSEQoaiktPmNwX3N0YXRbaV0gPSBGUkVFOworICAgICAgICAgcHJpbnRrKCIlczogcmVzZXQsIGxvY2tlZCBtYm94ICVkIGZvcmNlZCBmcmVlLlxuIiwgQk4oaiksIGkpOworICAgICAgICAgY29udGludWU7CisgICAgICAgICB9CisKKyAgICAgIGlmICghKFNDcG50ID0gSEQoaiktPmNwW2ldLlNDcG50KSkKKyAgICAgICAgIHBhbmljKCIlczogcmVzZXQsIG1ib3ggJWQsIFNDcG50ID09IE5VTEwuXG4iLCBCTihqKSwgaSk7CisKKyAgICAgIGlmIChIRChqKS0+Y3Bfc3RhdFtpXSA9PSBSRUFEWSB8fCBIRChqKS0+Y3Bfc3RhdFtpXSA9PSBBQk9SVElORykgeworICAgICAgICAgSEQoaiktPmNwX3N0YXRbaV0gPSBBQk9SVElORzsKKyAgICAgICAgIHByaW50aygiJXM6IHJlc2V0LCBtYm94ICVkIGFib3J0aW5nLCBwaWQgJWxkLlxuIiwKKyAgICAgICAgICAgICAgICBCTihqKSwgaSwgU0NwbnQtPnBpZCk7CisgICAgICAgICB9CisKKyAgICAgIGVsc2UgeworICAgICAgICAgSEQoaiktPmNwX3N0YXRbaV0gPSBJTl9SRVNFVDsKKyAgICAgICAgIHByaW50aygiJXM6IHJlc2V0LCBtYm94ICVkIGluIHJlc2V0LCBwaWQgJWxkLlxuIiwKKyAgICAgICAgICAgICAgICBCTihqKSwgaSwgU0NwbnQtPnBpZCk7CisgICAgICAgICB9CisKKyAgICAgIGlmIChTQ3BudC0+aG9zdF9zY3JpYmJsZSA9PSBOVUxMKQorICAgICAgICAgcGFuaWMoIiVzOiByZXNldCwgbWJveCAlZCwgZ2FyYmxlZCBTQ3BudC5cbiIsIEJOKGopLCBpKTsKKworICAgICAgaWYgKCoodW5zaWduZWQgaW50ICopU0NwbnQtPmhvc3Rfc2NyaWJibGUgIT0gaSkKKyAgICAgICAgIHBhbmljKCIlczogcmVzZXQsIG1ib3ggJWQsIGluZGV4IG1pc21hdGNoLlxuIiwgQk4oaiksIGkpOworCisgICAgICBpZiAoU0NwbnQtPnNjc2lfZG9uZSA9PSBOVUxMKQorICAgICAgICAgcGFuaWMoIiVzOiByZXNldCwgbWJveCAlZCwgU0NwbnQtPnNjc2lfZG9uZSA9PSBOVUxMLlxuIiwgQk4oaiksIGkpOworCisgICAgICBpZiAoU0NwbnQgPT0gU0NhcmcpIGFyZ19kb25lID0gVFJVRTsKKyAgICAgIH0KKworICAgaWYgKHdhaXRfb25fYnVzeShzaFtqXS0+aW9fcG9ydCwgTUFYTE9PUCkpIHsKKyAgICAgIHByaW50aygiJXM6IHJlc2V0LCBjYW5ub3QgcmVzZXQsIHRpbWVvdXQgZXJyb3IuXG4iLCBCTihqKSk7CisgICAgICByZXR1cm4gRkFJTEVEOworICAgICAgfQorCisgICBvdXRiKENNRF9SRVNFVCwgc2hbal0tPmlvX3BvcnQgKyBSRUdfTENMX0lOVFIpOworICAgcHJpbnRrKCIlczogcmVzZXQsIGJvYXJkIHJlc2V0IGRvbmUsIGVuYWJsaW5nIGludGVycnVwdHMuXG4iLCBCTihqKSk7CisKKyNpZiBkZWZpbmVkKERFQlVHX1JFU0VUKQorICAgZG9fdHJhY2UgPSBUUlVFOworI2VuZGlmCisKKyAgIEhEKGopLT5pbl9yZXNldCA9IFRSVUU7CisKKyAgIHNwaW5fdW5sb2NrX2lycShzaFtqXS0+aG9zdF9sb2NrKTsKKyAgIHRpbWUgPSBqaWZmaWVzOworICAgd2hpbGUgKChqaWZmaWVzIC0gdGltZSkgPCAoMTAgKiBIWikgJiYgbGltaXQrKyA8IDIwMDAwMCkgdWRlbGF5KDEwMEwpOworICAgc3Bpbl9sb2NrX2lycShzaFtqXS0+aG9zdF9sb2NrKTsKKworICAgcHJpbnRrKCIlczogcmVzZXQsIGludGVycnVwdHMgZGlzYWJsZWQsIGxvb3BzICVkLlxuIiwgQk4oaiksIGxpbWl0KTsKKworICAgZm9yIChpID0gMDsgaSA8IHNoW2pdLT5jYW5fcXVldWU7IGkrKykgeworCisgICAgICBpZiAoSEQoaiktPmNwX3N0YXRbaV0gPT0gSU5fUkVTRVQpIHsKKyAgICAgICAgIFNDcG50ID0gSEQoaiktPmNwW2ldLlNDcG50OworICAgICAgICAgdW5tYXBfZG1hKGksIGopOworICAgICAgICAgU0NwbnQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKyAgICAgICAgIFNDcG50LT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworICAgICAgICAgLyogVGhpcyBtYWlsYm94IGlzIHN0aWxsIHdhaXRpbmcgZm9yIGl0cyBpbnRlcnJ1cHQgKi8KKyAgICAgICAgIEhEKGopLT5jcF9zdGF0W2ldID0gTE9DS0VEOworCisgICAgICAgICBwcmludGsoIiVzLCByZXNldCwgbWJveCAlZCBsb2NrZWQsIERJRF9SRVNFVCwgcGlkICVsZCBkb25lLlxuIiwKKyAgICAgICAgICAgICAgICBCTihqKSwgaSwgU0NwbnQtPnBpZCk7CisgICAgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKEhEKGopLT5jcF9zdGF0W2ldID09IEFCT1JUSU5HKSB7CisgICAgICAgICBTQ3BudCA9IEhEKGopLT5jcFtpXS5TQ3BudDsKKyAgICAgICAgIHVubWFwX2RtYShpLCBqKTsKKyAgICAgICAgIFNDcG50LT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7CisgICAgICAgICBTQ3BudC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisKKyAgICAgICAgIC8qIFRoaXMgbWFpbGJveCB3YXMgbmV2ZXIgcXVldWVkIHRvIHRoZSBhZGFwdGVyICovCisgICAgICAgICBIRChqKS0+Y3Bfc3RhdFtpXSA9IEZSRUU7CisKKyAgICAgICAgIHByaW50aygiJXMsIHJlc2V0LCBtYm94ICVkIGFib3J0aW5nLCBESURfUkVTRVQsIHBpZCAlbGQgZG9uZS5cbiIsCisgICAgICAgICAgICAgICAgQk4oaiksIGksIFNDcG50LT5waWQpOworICAgICAgICAgfQorCisgICAgICBlbHNlCisKKyAgICAgICAgIC8qIEFueSBvdGhlciBtYWlsYm94IGhhcyBhbHJlYWR5IGJlZW4gc2V0IGZyZWUgYnkgaW50ZXJydXB0ICovCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgU0NwbnQtPnNjc2lfZG9uZShTQ3BudCk7CisgICAgICB9CisKKyAgIEhEKGopLT5pbl9yZXNldCA9IEZBTFNFOworICAgZG9fdHJhY2UgPSBGQUxTRTsKKworICAgaWYgKGFyZ19kb25lKSBwcmludGsoIiVzOiByZXNldCwgZXhpdCwgcGlkICVsZCBkb25lLlxuIiwgQk4oaiksIFNDYXJnLT5waWQpOworICAgZWxzZSAgICAgICAgICBwcmludGsoIiVzOiByZXNldCwgZXhpdC5cbiIsIEJOKGopKTsKKworICAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgdTE0XzM0Zl9iaW9zX3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqZGlzaywKKyAgICAgICAgICAgICAgICAgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3QgY2FwYWNpdHksIGludCAqZGtpbmZvKSB7CisgICB1bnNpZ25lZCBpbnQgaiA9IDA7CisgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IGNhcGFjaXR5OworCisgICBka2luZm9bMF0gPSBIRChqKS0+aGVhZHM7CisgICBka2luZm9bMV0gPSBIRChqKS0+c2VjdG9yczsKKyAgIGRraW5mb1syXSA9IHNpemUgLyAoSEQoaiktPmhlYWRzICogSEQoaiktPnNlY3RvcnMpOworCisgICBpZiAoZXh0X3RyYW4gJiYgKHNjc2ljYW1fYmlvc19wYXJhbShiZGV2LCBjYXBhY2l0eSwgZGtpbmZvKSA8IDApKSB7CisgICAgICBka2luZm9bMF0gPSAyNTU7CisgICAgICBka2luZm9bMV0gPSA2MzsKKyAgICAgIGRraW5mb1syXSA9IHNpemUgLyAoZGtpbmZvWzBdICogZGtpbmZvWzFdKTsKKyAgICAgIH0KKworI2lmIGRlZmluZWQgKERFQlVHX0dFT01FVFJZKQorICAgcHJpbnRrICgiJXM6IGJpb3NfcGFyYW0sIGhlYWQ9JWQsIHNlYz0lZCwgY3lsPSVkLlxuIiwgZHJpdmVyX25hbWUsCisgICAgICAgICAgIGRraW5mb1swXSwgZGtpbmZvWzFdLCBka2luZm9bMl0pOworI2VuZGlmCisKKyAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQgc29ydCh1bnNpZ25lZCBsb25nIHNrW10sIHVuc2lnbmVkIGludCBkYVtdLCB1bnNpZ25lZCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJldikgeworICAgdW5zaWduZWQgaW50IGksIGosIGssIHk7CisgICB1bnNpZ25lZCBsb25nIHg7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBuIC0gMTsgaSsrKSB7CisgICAgICBrID0gaTsKKworICAgICAgZm9yIChqID0gayArIDE7IGogPCBuOyBqKyspCisgICAgICAgICBpZiAocmV2KSB7CisgICAgICAgICAgICBpZiAoc2tbal0gPiBza1trXSkgayA9IGo7CisgICAgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChza1tqXSA8IHNrW2tdKSBrID0gajsKKyAgICAgICAgICAgIH0KKworICAgICAgaWYgKGsgIT0gaSkgeworICAgICAgICAgeCA9IHNrW2tdOyBza1trXSA9IHNrW2ldOyBza1tpXSA9IHg7CisgICAgICAgICB5ID0gZGFba107IGRhW2tdID0gZGFbaV07IGRhW2ldID0geTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgcmV0dXJuOworICAgfQorCitzdGF0aWMgaW50IHJlb3JkZXIodW5zaWduZWQgaW50IGosIHVuc2lnbmVkIGxvbmcgY3Vyc2VjLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWhkbHIsIHVuc2lnbmVkIGludCBpbFtdLCB1bnNpZ25lZCBpbnQgbl9yZWFkeSkgeworICAgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CisgICBzdHJ1Y3QgbXNjcCAqY3BwOworICAgdW5zaWduZWQgaW50IGssIG47CisgICB1bnNpZ25lZCBpbnQgcmV2ID0gRkFMU0UsIHMgPSBUUlVFLCByID0gVFJVRTsKKyAgIHVuc2lnbmVkIGludCBpbnB1dF9vbmx5ID0gVFJVRSwgb3ZlcmxhcCA9IEZBTFNFOworICAgdW5zaWduZWQgbG9uZyBzbFtuX3JlYWR5XSwgcGxbbl9yZWFkeV0sIGxsW25fcmVhZHldOworICAgdW5zaWduZWQgbG9uZyBtYXhzZWMgPSAwLCBtaW5zZWMgPSBVTE9OR19NQVgsIHNlZWsgPSAwLCBpc2VlayA9IDA7CisgICB1bnNpZ25lZCBsb25nIGlvc2VlayA9IDA7CisKKyAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgZmx1c2hjb3VudCA9IDAsIGJhdGNoY291bnQgPSAwLCBzb3J0Y291bnQgPSAwOworICAgc3RhdGljIHVuc2lnbmVkIGludCByZWFkeWNvdW50ID0gMCwgb3ZsY291bnQgPSAwLCBpbnB1dGNvdW50ID0gMDsKKyAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgcmVhZHlzb3J0ZWQgPSAwLCByZXZjb3VudCA9IDA7CisgICBzdGF0aWMgdW5zaWduZWQgbG9uZyBzZWVrc29ydGVkID0gMCwgc2Vla25vc29ydCA9IDA7CisKKyAgIGlmIChsaW5rX3N0YXRpc3RpY3MgJiYgISgrK2ZsdXNoY291bnQgJSBsaW5rX3N0YXRpc3RpY3MpKQorICAgICAgcHJpbnRrKCJmYyAlZCBiYyAlZCBpYyAlZCBvYyAlZCByYyAlZCBycyAlZCBzYyAlZCByZSAlZCJcCisgICAgICAgICAgICAgIiBhdiAlbGRLIGFzICVsZEsuXG4iLCBmbHVzaGNvdW50LCBiYXRjaGNvdW50LCBpbnB1dGNvdW50LAorICAgICAgICAgICAgIG92bGNvdW50LCByZWFkeWNvdW50LCByZWFkeXNvcnRlZCwgc29ydGNvdW50LCByZXZjb3VudCwKKyAgICAgICAgICAgICBzZWVrbm9zb3J0IC8gKHJlYWR5Y291bnQgKyAxKSwKKyAgICAgICAgICAgICBzZWVrc29ydGVkIC8gKHJlYWR5Y291bnQgKyAxKSk7CisKKyAgIGlmIChuX3JlYWR5IDw9IDEpIHJldHVybiBGQUxTRTsKKworICAgZm9yIChuID0gMDsgbiA8IG5fcmVhZHk7IG4rKykgeworICAgICAgayA9IGlsW25dOyBjcHAgPSAmSEQoaiktPmNwW2tdOyBTQ3BudCA9IGNwcC0+U0NwbnQ7CisKKyAgICAgIGlmICghKGNwcC0+eGRpciA9PSBEVERfSU4pKSBpbnB1dF9vbmx5ID0gRkFMU0U7CisKKyAgICAgIGlmIChTQ3BudC0+cmVxdWVzdC0+c2VjdG9yIDwgbWluc2VjKSBtaW5zZWMgPSBTQ3BudC0+cmVxdWVzdC0+c2VjdG9yOworICAgICAgaWYgKFNDcG50LT5yZXF1ZXN0LT5zZWN0b3IgPiBtYXhzZWMpIG1heHNlYyA9IFNDcG50LT5yZXF1ZXN0LT5zZWN0b3I7CisKKyAgICAgIHNsW25dID0gU0NwbnQtPnJlcXVlc3QtPnNlY3RvcjsKKyAgICAgIGlvc2VlayArPSBTQ3BudC0+cmVxdWVzdC0+bnJfc2VjdG9yczsKKworICAgICAgaWYgKCFuKSBjb250aW51ZTsKKworICAgICAgaWYgKHNsW25dIDwgc2xbbiAtIDFdKSBzID0gRkFMU0U7CisgICAgICBpZiAoc2xbbl0gPiBzbFtuIC0gMV0pIHIgPSBGQUxTRTsKKworICAgICAgaWYgKGxpbmtfc3RhdGlzdGljcykgeworICAgICAgICAgaWYgKHNsW25dID4gc2xbbiAtIDFdKQorICAgICAgICAgICAgc2VlayArPSBzbFtuXSAtIHNsW24gLSAxXTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlZWsgKz0gc2xbbiAtIDFdIC0gc2xbbl07CisgICAgICAgICB9CisKKyAgICAgIH0KKworICAgaWYgKGxpbmtfc3RhdGlzdGljcykgeworICAgICAgaWYgKGN1cnNlYyA+IHNsWzBdKSBzZWVrICs9IGN1cnNlYyAtIHNsWzBdOyBlbHNlIHNlZWsgKz0gc2xbMF0gLSBjdXJzZWM7CisgICAgICB9CisKKyAgIGlmIChjdXJzZWMgPiAoKG1heHNlYyArIG1pbnNlYykgLyAyKSkgcmV2ID0gVFJVRTsKKworICAgaWYgKGlvc2VlayA+ICgobWF4c2VjIC0gbWluc2VjKSAvIDIpKSByZXYgPSBGQUxTRTsKKworICAgaWYgKCEoKHJldiAmJiByKSB8fCAoIXJldiAmJiBzKSkpIHNvcnQoc2wsIGlsLCBuX3JlYWR5LCByZXYpOworCisgICBpZiAoIWlucHV0X29ubHkpIGZvciAobiA9IDA7IG4gPCBuX3JlYWR5OyBuKyspIHsKKyAgICAgIGsgPSBpbFtuXTsgY3BwID0gJkhEKGopLT5jcFtrXTsgU0NwbnQgPSBjcHAtPlNDcG50OworICAgICAgbGxbbl0gPSBTQ3BudC0+cmVxdWVzdC0+bnJfc2VjdG9yczsgcGxbbl0gPSBTQ3BudC0+cGlkOworCisgICAgICBpZiAoIW4pIGNvbnRpbnVlOworCisgICAgICBpZiAoKHNsW25dID09IHNsW24gLSAxXSkgfHwgKCFyZXYgJiYgKChzbFtuIC0gMV0gKyBsbFtuIC0gMV0pID4gc2xbbl0pKQorICAgICAgICAgIHx8IChyZXYgJiYgKChzbFtuXSArIGxsW25dKSA+IHNsW24gLSAxXSkpKSBvdmVybGFwID0gVFJVRTsKKyAgICAgIH0KKworICAgaWYgKG92ZXJsYXApIHNvcnQocGwsIGlsLCBuX3JlYWR5LCBGQUxTRSk7CisKKyAgIGlmIChsaW5rX3N0YXRpc3RpY3MpIHsKKyAgICAgIGlmIChjdXJzZWMgPiBzbFswXSkgaXNlZWsgPSBjdXJzZWMgLSBzbFswXTsgZWxzZSBpc2VlayA9IHNsWzBdIC0gY3Vyc2VjOworICAgICAgYmF0Y2hjb3VudCsrOyByZWFkeWNvdW50ICs9IG5fcmVhZHk7IHNlZWtub3NvcnQgKz0gc2VlayAvIDEwMjQ7CisgICAgICBpZiAoaW5wdXRfb25seSkgaW5wdXRjb3VudCsrOworICAgICAgaWYgKG92ZXJsYXApIHsgb3ZsY291bnQrKzsgc2Vla3NvcnRlZCArPSBpc2VlayAvIDEwMjQ7IH0KKyAgICAgIGVsc2Ugc2Vla3NvcnRlZCArPSAoaXNlZWsgKyBtYXhzZWMgLSBtaW5zZWMpIC8gMTAyNDsKKyAgICAgIGlmIChyZXYgJiYgIXIpICAgICB7ICByZXZjb3VudCsrOyByZWFkeXNvcnRlZCArPSBuX3JlYWR5OyB9CisgICAgICBpZiAoIXJldiAmJiAhcykgICAgeyBzb3J0Y291bnQrKzsgcmVhZHlzb3J0ZWQgKz0gbl9yZWFkeTsgfQorICAgICAgfQorCisjaWYgZGVmaW5lZChERUJVR19MSU5LRURfQ09NTUFORFMpCisgICBpZiAobGlua19zdGF0aXN0aWNzICYmIChvdmVybGFwIHx8ICEoZmx1c2hjb3VudCAlIGxpbmtfc3RhdGlzdGljcykpKQorICAgICAgZm9yIChuID0gMDsgbiA8IG5fcmVhZHk7IG4rKykgeworICAgICAgICAgayA9IGlsW25dOyBjcHAgPSAmSEQoaiktPmNwW2tdOyBTQ3BudCA9IGNwcC0+U0NwbnQ7CisgICAgICAgICBwcmludGsoIiVzICVkLiVkOiVkIHBpZCAlbGQgbWIgJWQgZmMgJWQgbnIgJWQgc2VjICVsZCBucyAlbGQiXAorICAgICAgICAgICAgICAgICIgY3VyICVsZCBzOiVjIHI6JWMgcmV2OiVjIGluOiVjIG92OiVjIHhkICVkLlxuIiwKKyAgICAgICAgICAgICAgICAoaWhkbHIgPyAiaWhkbHIiIDogInFjb21tIiksIFNDcG50LT5jaGFubmVsLCBTQ3BudC0+dGFyZ2V0LAorICAgICAgICAgICAgICAgIFNDcG50LT5sdW4sIFNDcG50LT5waWQsIGssIGZsdXNoY291bnQsIG5fcmVhZHksCisgICAgICAgICAgICAgICAgU0NwbnQtPnJlcXVlc3QtPnNlY3RvciwgU0NwbnQtPnJlcXVlc3QtPm5yX3NlY3RvcnMsIGN1cnNlYywKKyAgICAgICAgICAgICAgICBZRVNOTyhzKSwgWUVTTk8ociksIFlFU05PKHJldiksIFlFU05PKGlucHV0X29ubHkpLAorICAgICAgICAgICAgICAgIFlFU05PKG92ZXJsYXApLCBjcHAtPnhkaXIpOworICAgICAgICAgfQorI2VuZGlmCisgICByZXR1cm4gb3ZlcmxhcDsKK30KKworc3RhdGljIHZvaWQgZmx1c2hfZGV2KHN0cnVjdCBzY3NpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGN1cnNlYywgdW5zaWduZWQgaW50IGosCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGloZGxyKSB7CisgICBzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudDsKKyAgIHN0cnVjdCBtc2NwICpjcHA7CisgICB1bnNpZ25lZCBpbnQgaywgbiwgbl9yZWFkeSA9IDAsIGlsW01BWF9NQUlMQk9YRVNdOworCisgICBmb3IgKGsgPSAwOyBrIDwgc2hbal0tPmNhbl9xdWV1ZTsgaysrKSB7CisKKyAgICAgIGlmIChIRChqKS0+Y3Bfc3RhdFtrXSAhPSBSRUFEWSAmJiBIRChqKS0+Y3Bfc3RhdFtrXSAhPSBJTl9VU0UpIGNvbnRpbnVlOworCisgICAgICBjcHAgPSAmSEQoaiktPmNwW2tdOyBTQ3BudCA9IGNwcC0+U0NwbnQ7CisKKyAgICAgIGlmIChTQ3BudC0+ZGV2aWNlICE9IGRldikgY29udGludWU7CisKKyAgICAgIGlmIChIRChqKS0+Y3Bfc3RhdFtrXSA9PSBJTl9VU0UpIHJldHVybjsKKworICAgICAgaWxbbl9yZWFkeSsrXSA9IGs7CisgICAgICB9CisKKyAgIGlmIChyZW9yZGVyKGosIGN1cnNlYywgaWhkbHIsIGlsLCBuX3JlYWR5KSkgbl9yZWFkeSA9IDE7CisKKyAgIGZvciAobiA9IDA7IG4gPCBuX3JlYWR5OyBuKyspIHsKKyAgICAgIGsgPSBpbFtuXTsgY3BwID0gJkhEKGopLT5jcFtrXTsgU0NwbnQgPSBjcHAtPlNDcG50OworCisgICAgICBpZiAod2FpdF9vbl9idXN5KHNoW2pdLT5pb19wb3J0LCBNQVhMT09QKSkgeworICAgICAgICAgcHJpbnRrKCIlczogJXMsIHRhcmdldCAlZC4lZDolZCwgcGlkICVsZCwgbWJveCAlZCwgYWRhcHRlciJcCisgICAgICAgICAgICAgICAgIiBidXN5LCB3aWxsIGFib3J0LlxuIiwgQk4oaiksIChpaGRsciA/ICJpaGRsciIgOiAicWNvbW0iKSwKKyAgICAgICAgICAgICAgICBTQ3BudC0+ZGV2aWNlLT5jaGFubmVsLCBTQ3BudC0+ZGV2aWNlLT5pZCwgU0NwbnQtPmRldmljZS0+bHVuLCBTQ3BudC0+cGlkLCBrKTsKKyAgICAgICAgIEhEKGopLT5jcF9zdGF0W2tdID0gQUJPUlRJTkc7CisgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgIH0KKworICAgICAgb3V0bChIMkRFVihjcHAtPmNwX2RtYV9hZGRyKSwgc2hbal0tPmlvX3BvcnQgKyBSRUdfT0dNKTsKKyAgICAgIG91dGIoQ01EX09HTV9JTlRSLCBzaFtqXS0+aW9fcG9ydCArIFJFR19MQ0xfSU5UUik7CisgICAgICBIRChqKS0+Y3Bfc3RhdFtrXSA9IElOX1VTRTsKKyAgICAgIH0KKworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaWhkbHIoaW50IGlycSwgdW5zaWduZWQgaW50IGopIHsKKyAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OworICAgdW5zaWduZWQgaW50IGksIGssIGMsIHN0YXR1cywgdHN0YXR1cywgcmVnLCByZXQ7CisgICBzdHJ1Y3QgbXNjcCAqc3BwLCAqY3BwOworCisgICBpZiAoc2hbal0tPmlycSAhPSBpcnEpCisgICAgICAgcGFuaWMoIiVzOiBpaGRsciwgaXJxICVkLCBzaFtqXS0+aXJxICVkLlxuIiwgQk4oaiksIGlycSwgc2hbal0tPmlycSk7CisKKyAgIC8qIENoZWNrIGlmIHRoaXMgYm9hcmQgbmVlZCB0byBiZSBzZXJ2aWNlZCAqLworICAgaWYgKCEoKHJlZyA9IGluYihzaFtqXS0+aW9fcG9ydCArIFJFR19TWVNfSU5UUikpICYgSVJRX0FTU0VSVEVEKSkgZ290byBub25lOworCisgICBIRChqKS0+aW9jb3VudCsrOworCisgICBpZiAoZG9fdHJhY2UpIHByaW50aygiJXM6IGloZGxyLCBlbnRlciwgaXJxICVkLCBjb3VudCAlZC5cbiIsIEJOKGopLCBpcnEsCisgICAgICAgICAgICAgICAgICAgICAgICBIRChqKS0+aW9jb3VudCk7CisKKyAgIC8qIENoZWNrIGlmIHRoaXMgYm9hcmQgaXMgc3RpbGwgYnVzeSAqLworICAgaWYgKHdhaXRfb25fYnVzeShzaFtqXS0+aW9fcG9ydCwgMjAgKiBNQVhMT09QKSkgeworICAgICAgb3V0YihDTURfQ0xSX0lOVFIsIHNoW2pdLT5pb19wb3J0ICsgUkVHX1NZU19JTlRSKTsKKyAgICAgIHByaW50aygiJXM6IGloZGxyLCBidXN5IHRpbWVvdXQgZXJyb3IsICBpcnEgJWQsIHJlZyAweCV4LCBjb3VudCAlZC5cbiIsCisgICAgICAgICAgICAgQk4oaiksIGlycSwgcmVnLCBIRChqKS0+aW9jb3VudCk7CisgICAgICBnb3RvIG5vbmU7CisgICAgICB9CisKKyAgIHJldCA9IGlubChzaFtqXS0+aW9fcG9ydCArIFJFR19JQ00pOworCisgICAvKiBDbGVhciBpbnRlcnJ1cHQgcGVuZGluZyBmbGFnICovCisgICBvdXRiKENNRF9DTFJfSU5UUiwgc2hbal0tPmlvX3BvcnQgKyBSRUdfU1lTX0lOVFIpOworCisgICAvKiBGaW5kIHRoZSBtYWlsYm94IHRvIGJlIHNlcnZpY2VkIG9uIHRoaXMgYm9hcmQgKi8KKyAgIGZvciAoaSA9IDA7IGkgPCBzaFtqXS0+Y2FuX3F1ZXVlOyBpKyspCisgICAgICBpZiAoSDJERVYoSEQoaiktPmNwW2ldLmNwX2RtYV9hZGRyKSA9PSByZXQpIGJyZWFrOworCisgICBpZiAoaSA+PSBzaFtqXS0+Y2FuX3F1ZXVlKQorICAgICAgcGFuaWMoIiVzOiBpaGRsciwgaW52YWxpZCBtc2NwIGJ1cyBhZGRyZXNzICVwLCBjcDAgJXAuXG4iLCBCTihqKSwKKyAgICAgICAgICAgICh2b2lkICopcmV0LCAodm9pZCAqKUgyREVWKEhEKGopLT5jcFswXS5jcF9kbWFfYWRkcikpOworCisgICBjcHAgPSAmKEhEKGopLT5jcFtpXSk7CisgICBzcHAgPSBjcHA7CisKKyNpZiBkZWZpbmVkKERFQlVHX0dFTkVSQVRFX0FCT1JUUykKKyAgIGlmICgoSEQoaiktPmlvY291bnQgPiA1MDApICYmICgoSEQoaiktPmlvY291bnQgJSA1MDApIDwgMykpIGdvdG8gaGFuZGxlZDsKKyNlbmRpZgorCisgICBpZiAoSEQoaiktPmNwX3N0YXRbaV0gPT0gSUdOT1JFKSB7CisgICAgICBIRChqKS0+Y3Bfc3RhdFtpXSA9IEZSRUU7CisgICAgICBnb3RvIGhhbmRsZWQ7CisgICAgICB9CisgICBlbHNlIGlmIChIRChqKS0+Y3Bfc3RhdFtpXSA9PSBMT0NLRUQpIHsKKyAgICAgIEhEKGopLT5jcF9zdGF0W2ldID0gRlJFRTsKKyAgICAgIHByaW50aygiJXM6IGloZGxyLCBtYm94ICVkIHVubG9ja2VkLCBjb3VudCAlZC5cbiIsIEJOKGopLCBpLAorICAgICAgICAgICAgIEhEKGopLT5pb2NvdW50KTsKKyAgICAgIGdvdG8gaGFuZGxlZDsKKyAgICAgIH0KKyAgIGVsc2UgaWYgKEhEKGopLT5jcF9zdGF0W2ldID09IEZSRUUpIHsKKyAgICAgIHByaW50aygiJXM6IGloZGxyLCBtYm94ICVkIGlzIGZyZWUsIGNvdW50ICVkLlxuIiwgQk4oaiksIGksCisgICAgICAgICAgICAgSEQoaiktPmlvY291bnQpOworICAgICAgZ290byBoYW5kbGVkOworICAgICAgfQorICAgZWxzZSBpZiAoSEQoaiktPmNwX3N0YXRbaV0gPT0gSU5fUkVTRVQpCisgICAgICBwcmludGsoIiVzOiBpaGRsciwgbWJveCAlZCBpcyBpbiByZXNldC5cbiIsIEJOKGopLCBpKTsKKyAgIGVsc2UgaWYgKEhEKGopLT5jcF9zdGF0W2ldICE9IElOX1VTRSkKKyAgICAgIHBhbmljKCIlczogaWhkbHIsIG1ib3ggJWQsIGludmFsaWQgY3Bfc3RhdDogJWQuXG4iLAorICAgICAgICAgICAgQk4oaiksIGksIEhEKGopLT5jcF9zdGF0W2ldKTsKKworICAgSEQoaiktPmNwX3N0YXRbaV0gPSBGUkVFOworICAgU0NwbnQgPSBjcHAtPlNDcG50OworCisgICBpZiAoU0NwbnQgPT0gTlVMTCkgcGFuaWMoIiVzOiBpaGRsciwgbWJveCAlZCwgU0NwbnQgPT0gTlVMTC5cbiIsIEJOKGopLCBpKTsKKworICAgaWYgKFNDcG50LT5ob3N0X3NjcmliYmxlID09IE5VTEwpCisgICAgICBwYW5pYygiJXM6IGloZGxyLCBtYm94ICVkLCBwaWQgJWxkLCBTQ3BudCAlcCBnYXJibGVkLlxuIiwgQk4oaiksIGksCisgICAgICAgICAgICBTQ3BudC0+cGlkLCBTQ3BudCk7CisKKyAgIGlmICgqKHVuc2lnbmVkIGludCAqKVNDcG50LT5ob3N0X3NjcmliYmxlICE9IGkpCisgICAgICBwYW5pYygiJXM6IGloZGxyLCBtYm94ICVkLCBwaWQgJWxkLCBpbmRleCBtaXNtYXRjaCAlZC5cbiIsCisgICAgICAgICAgICBCTihqKSwgaSwgU0NwbnQtPnBpZCwgKih1bnNpZ25lZCBpbnQgKilTQ3BudC0+aG9zdF9zY3JpYmJsZSk7CisKKyAgIHN5bmNfZG1hKGksIGopOworCisgICBpZiAobGlua2VkX2NvbW0gJiYgU0NwbnQtPmRldmljZS0+cXVldWVfZGVwdGggPiAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgVExERVYoU0NwbnQtPmRldmljZS0+dHlwZSkpCisgICAgICBmbHVzaF9kZXYoU0NwbnQtPmRldmljZSwgU0NwbnQtPnJlcXVlc3QtPnNlY3RvciwgaiwgVFJVRSk7CisKKyAgIHRzdGF0dXMgPSBzdGF0dXNfYnl0ZShzcHAtPnRhcmdldF9zdGF0dXMpOworCisjaWYgZGVmaW5lZChERUJVR19HRU5FUkFURV9FUlJPUlMpCisgICBpZiAoKEhEKGopLT5pb2NvdW50ID4gNTAwKSAmJiAoKEhEKGopLT5pb2NvdW50ICUgMjAwKSA8IDIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcC0+YWRhcHRlcl9zdGF0dXMgPSAweDAxOworI2VuZGlmCisKKyAgIHN3aXRjaCAoc3BwLT5hZGFwdGVyX3N0YXR1cykgeworICAgICAgY2FzZSBBU09LOiAgICAgLyogc3RhdHVzIE9LICovCisKKyAgICAgICAgIC8qIEZvcmNlcyBhIHJlc2V0IGlmIGEgZGlzayBkcml2ZSBrZWVwcyByZXR1cm5pbmcgQlVTWSAqLworICAgICAgICAgaWYgKHRzdGF0dXMgPT0gQlVTWSAmJiBTQ3BudC0+ZGV2aWNlLT50eXBlICE9IFRZUEVfVEFQRSkKKyAgICAgICAgICAgIHN0YXR1cyA9IERJRF9FUlJPUiA8PCAxNjsKKworICAgICAgICAgLyogSWYgdGhlcmUgd2FzIGEgYnVzIHJlc2V0LCByZWRvIG9wZXJhdGlvbiBvbiBlYWNoIHRhcmdldCAqLworICAgICAgICAgZWxzZSBpZiAodHN0YXR1cyAhPSBHT09EICYmIFNDcG50LT5kZXZpY2UtPnR5cGUgPT0gVFlQRV9ESVNLCisgICAgICAgICAgICAgICAgICAmJiBIRChqKS0+dGFyZ2V0X3JlZG9bU0NwbnQtPmRldmljZS0+aWRdW1NDcG50LT5kZXZpY2UtPmNoYW5uZWxdKQorICAgICAgICAgICAgc3RhdHVzID0gRElEX0JVU19CVVNZIDw8IDE2OworCisgICAgICAgICAvKiBXb3JrcyBhcm91bmQgYSBmbGF3IGluIHNjc2kuYyAqLworICAgICAgICAgZWxzZSBpZiAodHN0YXR1cyA9PSBDSEVDS19DT05ESVRJT04KKyAgICAgICAgICAgICAgICAgICYmIFNDcG50LT5kZXZpY2UtPnR5cGUgPT0gVFlQRV9ESVNLCisgICAgICAgICAgICAgICAgICAmJiAoU0NwbnQtPnNlbnNlX2J1ZmZlclsyXSAmIDB4ZikgPT0gUkVDT1ZFUkVEX0VSUk9SKQorICAgICAgICAgICAgc3RhdHVzID0gRElEX0JVU19CVVNZIDw8IDE2OworCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBzdGF0dXMgPSBESURfT0sgPDwgMTY7CisKKyAgICAgICAgIGlmICh0c3RhdHVzID09IEdPT0QpCisgICAgICAgICAgICBIRChqKS0+dGFyZ2V0X3JlZG9bU0NwbnQtPmRldmljZS0+aWRdW1NDcG50LT5kZXZpY2UtPmNoYW5uZWxdID0gRkFMU0U7CisKKyAgICAgICAgIGlmIChzcHAtPnRhcmdldF9zdGF0dXMgJiYgU0NwbnQtPmRldmljZS0+dHlwZSA9PSBUWVBFX0RJU0sgJiYKKyAgICAgICAgICAgICAoISh0c3RhdHVzID09IENIRUNLX0NPTkRJVElPTiAmJiBIRChqKS0+aW9jb3VudCA8PSAxMDAwICYmCisgICAgICAgICAgICAgICAoU0NwbnQtPnNlbnNlX2J1ZmZlclsyXSAmIDB4ZikgPT0gTk9UX1JFQURZKSkpCisgICAgICAgICAgICBwcmludGsoIiVzOiBpaGRsciwgdGFyZ2V0ICVkLiVkOiVkLCBwaWQgJWxkLCAiXAorICAgICAgICAgICAgICAgICAgICJ0YXJnZXRfc3RhdHVzIDB4JXgsIHNlbnNlIGtleSAweCV4LlxuIiwgQk4oaiksCisgICAgICAgICAgICAgICAgICAgU0NwbnQtPmRldmljZS0+Y2hhbm5lbCwgU0NwbnQtPmRldmljZS0+aWQsIFNDcG50LT5kZXZpY2UtPmx1biwKKyAgICAgICAgICAgICAgICAgICBTQ3BudC0+cGlkLCBzcHAtPnRhcmdldF9zdGF0dXMsCisgICAgICAgICAgICAgICAgICAgU0NwbnQtPnNlbnNlX2J1ZmZlclsyXSk7CisKKyAgICAgICAgIEhEKGopLT50YXJnZXRfdG9bU0NwbnQtPmRldmljZS0+aWRdW1NDcG50LT5kZXZpY2UtPmNoYW5uZWxdID0gMDsKKworICAgICAgICAgaWYgKEhEKGopLT5sYXN0X3JldHJpZWRfcGlkID09IFNDcG50LT5waWQpIEhEKGopLT5yZXRyaWVzID0gMDsKKworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFTU1Q6ICAgICAvKiBTZWxlY3Rpb24gVGltZSBPdXQgKi8KKworICAgICAgICAgaWYgKEhEKGopLT50YXJnZXRfdG9bU0NwbnQtPmRldmljZS0+aWRdW1NDcG50LT5kZXZpY2UtPmNoYW5uZWxdID4gMSkKKyAgICAgICAgICAgIHN0YXR1cyA9IERJRF9FUlJPUiA8PCAxNjsKKyAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRElEX1RJTUVfT1VUIDw8IDE2OworICAgICAgICAgICAgSEQoaiktPnRhcmdldF90b1tTQ3BudC0+ZGV2aWNlLT5pZF1bU0NwbnQtPmRldmljZS0+Y2hhbm5lbF0rKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFBlcmZvcm0gYSBsaW1pdGVkIG51bWJlciBvZiBpbnRlcm5hbCByZXRyaWVzICovCisgICAgICBjYXNlIDB4OTM6ICAgICAvKiBVbmV4cGVjdGVkIGJ1cyBmcmVlICovCisgICAgICBjYXNlIDB4OTQ6ICAgICAvKiBUYXJnZXQgYnVzIHBoYXNlIHNlcXVlbmNlIGZhaWx1cmUgKi8KKyAgICAgIGNhc2UgMHg5NjogICAgIC8qIElsbGVnYWwgU0NTSSBjb21tYW5kICovCisgICAgICBjYXNlIDB4YTM6ICAgICAvKiBTQ1NJIGJ1cyByZXNldCBlcnJvciAqLworCisgICAgICAgICBmb3IgKGMgPSAwOyBjIDw9IHNoW2pdLT5tYXhfY2hhbm5lbDsgYysrKQorICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHNoW2pdLT5tYXhfaWQ7IGsrKykKKyAgICAgICAgICAgICAgIEhEKGopLT50YXJnZXRfcmVkb1trXVtjXSA9IFRSVUU7CisKKworICAgICAgY2FzZSAweDkyOiAgICAgLyogRGF0YSBvdmVyL3VuZGVyLXJ1biAqLworCisgICAgICAgICBpZiAoU0NwbnQtPmRldmljZS0+dHlwZSAhPSBUWVBFX1RBUEUKKyAgICAgICAgICAgICAmJiBIRChqKS0+cmV0cmllcyA8IE1BWF9JTlRFUk5BTF9SRVRSSUVTKSB7CisKKyNpZiBkZWZpbmVkKERJRF9TT0ZUX0VSUk9SKQorICAgICAgICAgICAgc3RhdHVzID0gRElEX1NPRlRfRVJST1IgPDwgMTY7CisjZWxzZQorICAgICAgICAgICAgc3RhdHVzID0gRElEX0JVU19CVVNZIDw8IDE2OworI2VuZGlmCisKKyAgICAgICAgICAgIEhEKGopLT5yZXRyaWVzKys7CisgICAgICAgICAgICBIRChqKS0+bGFzdF9yZXRyaWVkX3BpZCA9IFNDcG50LT5waWQ7CisgICAgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBzdGF0dXMgPSBESURfRVJST1IgPDwgMTY7CisKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAweDAxOiAgICAgLyogSW52YWxpZCBjb21tYW5kICovCisgICAgICBjYXNlIDB4MDI6ICAgICAvKiBJbnZhbGlkIHBhcmFtZXRlcnMgKi8KKyAgICAgIGNhc2UgMHgwMzogICAgIC8qIEludmFsaWQgZGF0YSBsaXN0ICovCisgICAgICBjYXNlIDB4ODQ6ICAgICAvKiBTQ1NJIGJ1cyBhYm9ydCBlcnJvciAqLworICAgICAgY2FzZSAweDliOiAgICAgLyogQXV0byByZXF1ZXN0IHNlbnNlIGVycm9yICovCisgICAgICBjYXNlIDB4OWY6ICAgICAvKiBVbmV4cGVjdGVkIGNvbW1hbmQgY29tcGxldGUgbWVzc2FnZSBlcnJvciAqLworICAgICAgY2FzZSAweGZmOiAgICAgLyogSW52YWxpZCBwYXJhbWV0ZXIgaW4gdGhlIFMvRyBsaXN0ICovCisgICAgICBkZWZhdWx0OgorICAgICAgICAgc3RhdHVzID0gRElEX0VSUk9SIDw8IDE2OworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgIFNDcG50LT5yZXN1bHQgPSBzdGF0dXMgfCBzcHAtPnRhcmdldF9zdGF0dXM7CisKKyNpZiBkZWZpbmVkKERFQlVHX0lOVEVSUlVQVCkKKyAgIGlmIChTQ3BudC0+cmVzdWx0IHx8IGRvX3RyYWNlKQorI2Vsc2UKKyAgIGlmICgoc3BwLT5hZGFwdGVyX3N0YXR1cyAhPSBBU09LICYmIEhEKGopLT5pb2NvdW50ID4gIDEwMDApIHx8CisgICAgICAgKHNwcC0+YWRhcHRlcl9zdGF0dXMgIT0gQVNPSyAmJgorICAgICAgICBzcHAtPmFkYXB0ZXJfc3RhdHVzICE9IEFTU1QgJiYgSEQoaiktPmlvY291bnQgPD0gMTAwMCkgfHwKKyAgICAgICAgZG9fdHJhY2UgfHwgbXNnX2J5dGUoc3BwLT50YXJnZXRfc3RhdHVzKSkKKyNlbmRpZgorICAgICAgcHJpbnRrKCIlczogaWhkbHIsIG1ib3ggJTJkLCBlcnIgMHgleDoleCwiXAorICAgICAgICAgICAgICIgdGFyZ2V0ICVkLiVkOiVkLCBwaWQgJWxkLCByZWcgMHgleCwgY291bnQgJWQuXG4iLAorICAgICAgICAgICAgIEJOKGopLCBpLCBzcHAtPmFkYXB0ZXJfc3RhdHVzLCBzcHAtPnRhcmdldF9zdGF0dXMsCisgICAgICAgICAgICAgU0NwbnQtPmRldmljZS0+Y2hhbm5lbCwgU0NwbnQtPmRldmljZS0+aWQsIFNDcG50LT5kZXZpY2UtPmx1biwgU0NwbnQtPnBpZCwKKyAgICAgICAgICAgICByZWcsIEhEKGopLT5pb2NvdW50KTsKKworICAgdW5tYXBfZG1hKGksIGopOworCisgICAvKiBTZXQgdGhlIGNvbW1hbmQgc3RhdGUgdG8gaW5hY3RpdmUgKi8KKyAgIFNDcG50LT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworICAgU0NwbnQtPnNjc2lfZG9uZShTQ3BudCk7CisKKyAgIGlmIChkb190cmFjZSkgcHJpbnRrKCIlczogaWhkbHIsIGV4aXQsIGlycSAlZCwgY291bnQgJWQuXG4iLCBCTihqKSwgaXJxLAorICAgICAgICAgICAgICAgICAgICAgICAgSEQoaiktPmlvY291bnQpOworCitoYW5kbGVkOgorICAgcmV0dXJuIElSUV9IQU5ETEVEOworbm9uZToKKyAgIHJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIGlycXJldHVybl90IGRvX2ludGVycnVwdF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnNoYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpIHsKKyAgIHVuc2lnbmVkIGludCBqOworICAgdW5zaWduZWQgbG9uZyBzcGluX2ZsYWdzOworICAgaXJxcmV0dXJuX3QgcmV0OworCisgICAvKiBDaGVjayBpZiB0aGUgaW50ZXJydXB0IG11c3QgYmUgcHJvY2Vzc2VkIGJ5IHRoaXMgaGFuZGxlciAqLworICAgaWYgKChqID0gKHVuc2lnbmVkIGludCkoKGNoYXIgKilzaGFwIC0gc2hhKSkgPj0gbnVtX2JvYXJkcykgcmV0dXJuIElSUV9OT05FOworCisgICBzcGluX2xvY2tfaXJxc2F2ZShzaFtqXS0+aG9zdF9sb2NrLCBzcGluX2ZsYWdzKTsKKyAgIHJldCA9IGloZGxyKGlycSwgaik7CisgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKHNoW2pdLT5ob3N0X2xvY2ssIHNwaW5fZmxhZ3MpOworICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB1MTRfMzRmX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpIHsKKyAgIHVuc2lnbmVkIGludCBpLCBqOworCisgICBmb3IgKGogPSAwOyBzaFtqXSAhPSBOVUxMICYmIHNoW2pdICE9IHNocG50OyBqKyspOworCisgICBpZiAoc2hbal0gPT0gTlVMTCkgcGFuaWMoIiVzOiByZWxlYXNlLCBpbnZhbGlkIFNjc2lfSG9zdCBwb2ludGVyLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXJfbmFtZSk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBzaFtqXS0+Y2FuX3F1ZXVlOyBpKyspCisgICAgICBpZiAoKCZIRChqKS0+Y3BbaV0pLT5zZ2xpc3QpIGtmcmVlKCgmSEQoaiktPmNwW2ldKS0+c2dsaXN0KTsKKworICAgZm9yIChpID0gMDsgaSA8IHNoW2pdLT5jYW5fcXVldWU7IGkrKykKKyAgICAgIHBjaV91bm1hcF9zaW5nbGUoSEQoaiktPnBkZXYsIEhEKGopLT5jcFtpXS5jcF9kbWFfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgbXNjcCksIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisKKyAgIGZyZWVfaXJxKHNoW2pdLT5pcnEsICZzaGFbal0pOworCisgICBpZiAoc2hbal0tPmRtYV9jaGFubmVsICE9IE5PX0RNQSkgZnJlZV9kbWEoc2hbal0tPmRtYV9jaGFubmVsKTsKKworICAgcmVsZWFzZV9yZWdpb24oc2hbal0tPmlvX3BvcnQsIHNoW2pdLT5uX2lvX3BvcnQpOworICAgc2NzaV91bnJlZ2lzdGVyKHNoW2pdKTsKKyAgIHJldHVybiBGQUxTRTsKK30KKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKKyNpZm5kZWYgTU9EVUxFCitfX3NldHVwKCJ1MTQtMzRmPSIsIG9wdGlvbl9zZXR1cCk7CisjZW5kaWYgLyogZW5kIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3VsdHJhc3Rvci5jIGIvZHJpdmVycy9zY3NpL3VsdHJhc3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ODQ5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvdWx0cmFzdG9yLmMKQEAgLTAsMCArMSwxMjA0IEBACisvKgorICoJdWx0cmFzdG9yLmMJQ29weXJpZ2h0IChDKSAxOTkyIERhdmlkIEIuIEdlbnR6ZWwKKyAqCUxvdy1sZXZlbCBTQ1NJIGRyaXZlciBmb3IgVWx0cmFTdG9yIDE0RiwgMjRGLCBhbmQgMzRGCisgKglieSBEYXZpZCBCLiBHZW50emVsLCBXaGl0ZmllbGQgU29mdHdhcmUgU2VydmljZXMsIENhcm5lZ2llLCBQQQorICoJICAgIChnZW50emVsQG5vdmEuZW5ldC5kZWMuY29tKQorICogIHNjYXR0ZXIvZ2F0aGVyIGFkZGVkIGJ5IFNjb3R0IFRheWxvciAobjIxN2NnQHRhbXV0cy50YW11LmVkdSkKKyAqICAyNEYgYW5kIG11bHRpcGxlIGNvbW1hbmQgc3VwcG9ydCBieSBKb2huIEYuIENhcnIgKGpmY0BhdGhlbmEubWl0LmVkdSkKKyAqICAgIEpvaG4ncyB3b3JrIG1vZGlmaWVkIGJ5IENhbGViIEVwc3RlaW4gKGNhZUBqcG1vcmdhbi5jb20pIGFuZCAKKyAqICAgIEVyaWMgWW91bmdkYWxlIChlcmljeUBjYWlzLmNvbSkuCisgKglUaGFua3MgdG8gVWx0cmFTdG9yIGZvciBwcm92aWRpbmcgdGhlIG5lY2Vzc2FyeSBkb2N1bWVudGF0aW9uCisgKgorICogIFRoaXMgaXMgYW4gb2xkIGRyaXZlciwgZm9yIHRoZSAxNEYgYW5kIDM0RiB5b3Ugc2hvdWxkIGJlIHVzaW5nIHRoZQorICogIHUxNC0zNGYgZHJpdmVyIGluc3RlYWQuCisgKi8KKworLyoKKyAqIFRPRE86CisgKgkxLiBGaW5kIG91dCB3aHkgc2NhdHRlci9nYXRoZXIgaXMgbGltaXRlZCB0byAxNiByZXF1ZXN0cyBwZXIgY29tbWFuZC4KKyAqICAgICAgICAgVGhpcyBpcyBmaXhlZCwgYXQgbGVhc3Qgb24gdGhlIDI0RiwgYXMgb2YgdmVyc2lvbiAxLjEyIC0gQ0FFLgorICoJMi4gTG9vayBhdCBjb21tYW5kIGxpbmtpbmcgKG1zY3AuY29tbWFuZF9saW5rIGFuZAorICoJICAgbXNjcC5jb21tYW5kX2xpbmtfaWQpLiAgKERvZXMgbm90IHdvcmsgd2l0aCBtYW55IGRpc2tzLCAKKyAqCQkJCWFuZCBubyBwZXJmb3JtYW5jZSBpbmNyZWFzZS4gIEVSWSkuCisgKgkzLiBBbGxvdyBtdWx0aXBsZSBhZGFwdGVycy4KKyAqLworCisvKgorICogTk9URVM6CisgKiAgICBUaGUgVWx0cmFTdG9yIDE0RiwgMjRGLCBhbmQgMzRGIGFyZSBhIGZhbWlseSBvZiBpbnRlbGxpZ2VudCwgaGlnaAorICogICAgcGVyZm9ybWFuY2UgU0NTSS0yIGhvc3QgYWRhcHRlcnMuICBUaGV5IGFsbCBzdXBwb3J0IGNvbW1hbmQgcXVldWVpbmcKKyAqICAgIGFuZCBzY2F0dGVyL2dhdGhlciBJL08uICBTb21lIG9mIHRoZW0gY2FuIGFsc28gZW11bGF0ZSB0aGUgc3RhbmRhcmQKKyAqICAgIFdEMTAwMyBpbnRlcmZhY2UgZm9yIHVzZSB3aXRoIE9TJ3Mgd2hpY2ggZG9uJ3Qgc3VwcG9ydCBTQ1NJLiAgSGVyZQorICogICAgaXMgdGhlIHNjb29wIG9uIHRoZSB2YXJpb3VzIG1vZGVsczoKKyAqCTE0RiAtIElTQSBmaXJzdC1wYXJ0eSBETUEgSEEgd2l0aCBmbG9wcHkgc3VwcG9ydCBhbmQgV0QxMDAzIGVtdWxhdGlvbi4KKyAqCTE0TiAtIElTQSBIQSB3aXRoIGZsb3BweSBzdXBwb3J0LiAgSSB0aGluayB0aGF0IHRoaXMgaXMgYSBub24tRE1BCisgKgkgICAgICBIQS4gIE5vdGhpbmcgZnVydGhlciBrbm93bi4KKyAqCTI0RiAtIEVJU0EgQnVzIE1hc3RlciBIQSB3aXRoIGZsb3BweSBzdXBwb3J0IGFuZCBXRDEwMDMgZW11bGF0aW9uLgorICoJMzRGIC0gVkwtQnVzIEJ1cyBNYXN0ZXIgSEEgd2l0aCBmbG9wcHkgc3VwcG9ydCAobm8gV0QxMDAzIGVtdWxhdGlvbikuCisgKgorICogICAgVGhlIDE0RiwgMjRGLCBhbmQgMzRGIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuCisgKgorICogICAgUGxhY2VzIGZsYWdnZWQgd2l0aCBhIHRyaXBsZSBxdWVzdGlvbi1tYXJrIGFyZSB0aGluZ3Mgd2hpY2ggYXJlIGVpdGhlcgorICogICAgdW5maW5pc2hlZCwgcXVlc3Rpb25hYmxlLCBvciB3cm9uZy4KKyAqLworCisvKiBDaGFuZ2VzIGZyb20gdmVyc2lvbiAxLjExIGFscGhhIHRvIDEuMTIKKyAqCisgKiBJbmNyZWFzZWQgdGhlIHNpemUgb2YgdGhlIHNjYXR0ZXItZ2F0aGVyIGxpc3QgdG8gMzMgZW50cmllcyBmb3IKKyAqIHRoZSAyNEYgYWRhcHRlciAoaXQgd2FzIDE2KS4gIEkgZG9uJ3QgaGF2ZSB0aGUgc3BlY3MgZm9yIHRoZSAxNEYKKyAqIG9yIHRoZSAzNEYsIHNvIHRoZXkgbWF5IHN1cHBvcnQgbGFyZ2VyIHMtZyBsaXN0cyBhcyB3ZWxsLgorICoKKyAqIENhbGViIEVwc3RlaW4gPGNhZUBqcG1vcmdhbi5jb20+CisgKi8KKworLyogQ2hhbmdlcyBmcm9tIHZlcnNpb24gMS45IHRvIDEuMTEKKyAqCisgKiBQYXRjaGVzIHRvIGJyaW5nIHRoaXMgZHJpdmVyIHVwIHRvIHNwZWVkIHdpdGggdGhlIGRlZmF1bHQga2VybmVsCisgKiBkcml2ZXIgd2hpY2ggc3VwcG9ydHMgb25seSB0aGUgMTRGIGFuZCAzNEYgYWRhcHRlcnMuICBUaGlzIHZlcnNpb24KKyAqIHNob3VsZCBjb21waWxlIGNsZWFubHkgaW50byAwLjk5LjEzLCAwLjk5LjEyIGFuZCBwcm9iYWJseSAwLjk5LjExLgorICoKKyAqIEZpeGVzIGZyb20gRXJpYyBZb3VuZ2RhbGUgdG8gZml4IGEgZmV3IHBvc3NpYmxlIHJhY2UgY29uZGl0aW9ucyBhbmQKKyAqIHNldmVyYWwgcHJvYmxlbXMgd2l0aCBiaXQgdGVzdGluZyBvcGVyYXRpb25zIChpbnN1ZmZpY2llbnQKKyAqIHBhcmVudGhlc2VzKS4KKyAqCisgKiBSZW1vdmVkIHRoZSB1bHRyYXN0b3JfYWJvcnQoKSBhbmQgdWx0cmFzdG9yX3Jlc2V0KCkgZnVuY3Rpb25zCisgKiAoZW5jbG9zZWQgdGhlbSBpbiAjaWYgMCAvICNlbmRpZikuICBUaGVzZSBmdW5jdGlvbnMsIGF0IGxlYXN0IG9uCisgKiB0aGUgMjRGLCBjYXVzZSB0aGUgU0NTSSBidXMgdG8gZG8gb2RkIHRoaW5ncyBhbmQgZ2VuZXJhbGx5IGxlYWQgdG8KKyAqIGtlcm5lbCBwYW5pY3MgYW5kIG1hY2hpbmUgaGFuZ3MuICBUaGlzIGlzIGxpa2UgdGhlIEFkYXB0ZWMgY29kZS4KKyAqCisgKiBVc2UgY2hlY2svc25hcmZfcmVnaW9uIGZvciAxNGYsIDM0ZiB0byBhdm9pZCBJL08gc3BhY2UgYWRkcmVzcyBjb25mbGljdHMuCisgKi8KKworLyogQ2hhbmdlcyBmcm9tIHZlcnNpb24gMS44IHRvIHZlcnNpb24gMS45CisgKgorICogIDAuOTkuMTEgcGF0Y2hlcyAoY2FlQGpwbW9yZ2FuLmNvbSkgKi8KKworLyogQ2hhbmdlcyBmcm9tIHZlcnNpb24gMS43IHRvIHZlcnNpb24gMS44CisgKgorICogQmV0dGVyIGVycm9yIHJlcG9ydGluZy4KKyAqLworCisvKiBDaGFuZ2VzIGZyb20gdmVyc2lvbiAxLjYgdG8gdmVyc2lvbiAxLjcKKyAqCisgKiBSZW1vdmVkIENTSVIgY29tbWFuZCBjb2RlLgorICoKKyAqIEJldHRlciByYWNlIGNvbmRpdGlvbiBhdm9pZGFuY2UgKHhjaGdiIGZ1bmN0aW9uIGFkZGVkKS4KKyAqCisgKiBTZXQgSUNNIGFuZCBPR00gc3RhdHVzIHRvIHplcm8gYXQgcHJvYmUgKDI0RikKKyAqCisgKiByZXNldCBzZW5kcyBzb2Z0IHJlc2V0IHRvIFVsdHJhU3RvciBhZGFwdGVyCisgKgorICogcmVzZXQgYWRhcHRlciBpZiBhZGFwdGVyIGludGVycnVwdHMgd2l0aCBhbiBpbnZhbGlkIE1TQ1AgYWRkcmVzcworICoKKyAqIGhhbmRsZSBhYm9ydGVkIGNvbW1hbmQgaW50ZXJydXB0ICgyNEYpCisgKgorICovCisKKy8qIENoYW5nZXMgZnJvbSB2ZXJzaW9uIDEuNSB0byB2ZXJzaW9uIDEuNjoKKyAqCisgKiBSZWFkIE1TQ1AgYWRkcmVzcyBmcm9tIElDTSBfYmVmb3JlXyBjbGVhcmluZyB0aGUgaW50ZXJydXB0IGZsYWcuCisgKiBUaGlzIGZpeGVzIGEgcmFjZSBjb25kaXRpb24uCisgKi8KKworLyogQ2hhbmdlcyBmcm9tIHZlcnNpb24gMS40IHRvIHZlcnNpb24gMS41OgorICoKKyAqIEFib3J0IG5vdyBjYWxscyBkb25lIHdoZW4gbXVsdGlwbGUgY29tbWFuZHMgYXJlIGVuYWJsZWQuCisgKgorICogQ2xlYXIgYnVzeSB3aGVuIGFib3J0ZWQgY29tbWFuZCBmaW5pc2hlcywgbm90IHdoZW4gYWJvcnQgaXMgY2FsbGVkLgorICoKKyAqIE1vcmUgZGVidWdnaW5nIG1lc3NhZ2VzIGZvciBhYm9ydHMuCisgKi8KKworLyogQ2hhbmdlcyBmcm9tIHZlcnNpb24gMS4zIHRvIHZlcnNpb24gMS40OgorICoKKyAqIEVuYWJsZSBhdXRvbWF0aWMgcmVxdWVzdCBvZiBzZW5zZSBkYXRhIG9uIGVycm9yIChyZXF1aXJlcyBuZXdlciB2ZXJzaW9uCisgKiBvZiBzY3NpLmMgdG8gYmUgdXNlZnVsKS4KKyAqCisgKiBGaXggUE9SVF9PVkVSUklERSBmb3IgMTRGLgorICoKKyAqIEZpeCBhYm9ydCBhbmQgcmVzZXQgdG8gd29yayBwcm9wZXJseSAoY29uZmlnLmFib3J0ZWQgd2Fzbid0IGNsZWFyZWQKKyAqIGFmdGVyIGl0IHdhcyB0ZXN0ZWQsIHNvIGFmdGVyIGEgY29tbWFuZCBhYm9ydCBubyBmdXJ0aGVyIGNvbW1hbmRzIHdvdWxkCisgKiB3b3JrKS4KKyAqCisgKiBCb290IHRpbWUgdGVzdCB0byBlbmFibGUgU0NTSSBidXMgcmVzZXQgKGRlZmF1bHRzIHRvIG5vdCBhbGxvd2luZyByZXNldCkuCisgKgorICogRml4IHRlc3QgZm9yIE9HTSBidXN5IC0tIHRoZSBidXN5IGJpdCBpcyBpbiBkaWZmZXJlbnQgcGxhY2VzIG9uIHRoZSAyNEYuCisgKgorICogUmVsZWFzZSBJQ00gc2xvdCBieSBjbGVhcmluZyBmaXJzdCBieXRlIG9uIDI0Ri4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2RlZmluZSBVTFRSQVNUT1JfUFJJVkFURQkvKiBHZXQgdGhlIHByaXZhdGUgc3R1ZmYgZnJvbSB1bHRyYXN0b3IuaCAqLworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgInVsdHJhc3Rvci5oIgorCisjZGVmaW5lIEZBTFNFIDAKKyNkZWZpbmUgVFJVRSAxCisKKyNpZm5kZWYgVUxUUkFTVE9SX0RFQlVHCisjZGVmaW5lIFVMVFJBU1RPUl9ERUJVRyAoVURfQUJPUlR8VURfQ1NJUnxVRF9SRVNFVCkKKyNlbmRpZgorCisjZGVmaW5lIFZFUlNJT04gIjEuMTIiCisKKyNkZWZpbmUgUEFDS0VECQlfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorI2RlZmluZSBBTElHTkVEKHgpCV9fYXR0cmlidXRlX18oKGFsaWduZWQoeCkpKQorCisKKy8qIFRoZSAxNEYgdXNlcyBhbiBhcnJheSBvZiA0LWJ5dGUgaW50cyBmb3IgaXRzIHNjYXR0ZXIvZ2F0aGVyIGxpc3QuCisgICBUaGUgZGF0YSBjYW4gYmUgdW5hbGlnbmVkLCBidXQgbmVlZCBub3QgYmUuICBJdCdzIGVhc2llciB0byBnaXZlCisgICB0aGUgbGlzdCBub3JtYWwgYWxpZ25tZW50IHNpbmNlIGl0IGRvZXNuJ3QgbmVlZCB0byBmaXQgaW50byBhCisgICBwYWNrZWQgc3RydWN0dXJlLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICB1MzIgYWRkcmVzczsKKyAgdTMyIG51bV9ieXRlczsKK30gdWx0cmFzdG9yX3NnX2xpc3Q7CisKKworLyogTWFpbEJveCBTQ1NJIENvbW1hbmQgUGFja2V0LiAgQmFzaWMgY29tbWFuZCBzdHJ1Y3R1cmUgZm9yIGNvbW11bmljYXRpbmcKKyAgIHdpdGggY29udHJvbGxlci4gKi8KK3N0cnVjdCBtc2NwIHsKKyAgdW5zaWduZWQgY2hhciBvcGNvZGU6IDM7CQkvKiB0eXBlIG9mIGNvbW1hbmQgKi8KKyAgdW5zaWduZWQgY2hhciB4ZGlyOiAyOwkJLyogZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gKi8KKyAgdW5zaWduZWQgY2hhciBkY246IDE7CQkvKiBkaXNhYmxlIGRpc2Nvbm5lY3QgKi8KKyAgdW5zaWduZWQgY2hhciBjYTogMTsJCS8qIHVzZSBjYWNoZSAoaWYgYXZhaWxhYmxlKSAqLworICB1bnNpZ25lZCBjaGFyIHNnOiAxOwkJLyogc2NhdHRlci9nYXRoZXIgb3BlcmF0aW9uICovCisgIHVuc2lnbmVkIGNoYXIgdGFyZ2V0X2lkOiAzOwkJLyogdGFyZ2V0IFNDU0kgaWQgKi8KKyAgdW5zaWduZWQgY2hhciBjaF9ubzogMjsJCS8qIFNDU0kgY2hhbm5lbCAoYWx3YXlzIDAgZm9yIDE0ZikgKi8KKyAgdW5zaWduZWQgY2hhciBsdW46IDM7CQkvKiBsb2dpY2FsIHVuaXQgbnVtYmVyICovCisgIHVuc2lnbmVkIGludCB0cmFuc2Zlcl9kYXRhIFBBQ0tFRDsJLyogdHJhbnNmZXIgZGF0YSBwb2ludGVyICovCisgIHVuc2lnbmVkIGludCB0cmFuc2Zlcl9kYXRhX2xlbmd0aCBQQUNLRUQ7CS8qIGxlbmd0aCBpbiBieXRlcyAqLworICB1bnNpZ25lZCBpbnQgY29tbWFuZF9saW5rIFBBQ0tFRDsJLyogZm9yIGxpbmtpbmcgY29tbWFuZCBjaGFpbnMgKi8KKyAgdW5zaWduZWQgY2hhciBzY3NpX2NvbW1hbmRfbGlua19pZDsJLyogaWRlbnRpZmllcyBjb21tYW5kIGluIGNoYWluICovCisgIHVuc2lnbmVkIGNoYXIgbnVtYmVyX29mX3NnX2xpc3Q7CS8qIChpZiBzZyBpcyBzZXQpIDggYnl0ZXMgcGVyIGxpc3QgKi8KKyAgdW5zaWduZWQgY2hhciBsZW5ndGhfb2Zfc2Vuc2VfYnl0ZTsKKyAgdW5zaWduZWQgY2hhciBsZW5ndGhfb2Zfc2NzaV9jZGJzOwkvKiA2LCAxMCwgb3IgMTIgKi8KKyAgdW5zaWduZWQgY2hhciBzY3NpX2NkYnNbMTJdOwkvKiBTQ1NJIGNvbW1hbmRzICovCisgIHVuc2lnbmVkIGNoYXIgYWRhcHRlcl9zdGF0dXM7CS8qIG5vbi16ZXJvIGluZGljYXRlcyBIQSBlcnJvciAqLworICB1bnNpZ25lZCBjaGFyIHRhcmdldF9zdGF0dXM7CS8qIG5vbi16ZXJvIGluZGljYXRlcyB0YXJnZXQgZXJyb3IgKi8KKyAgdTMyIHNlbnNlX2RhdGEgUEFDS0VEOworICAvKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgZm9yIHNvZnR3YXJlIG9ubHkuICBUaGV5IGFyZSBpbmNsdWRlZCBpbgorICAgICB0aGUgTVNDUCBzdHJ1Y3R1cmUgYmVjYXVzZSB0aGV5IGFyZSBhc3NvY2lhdGVkIHdpdGggU0NTSSByZXF1ZXN0cy4gICovCisgIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKik7CisgIFNjc2lfQ21uZCAqU0NpbnQ7CisgIHVsdHJhc3Rvcl9zZ19saXN0IHNnbGlzdFtVTFRSQVNUT1JfMjRGX01BWF9TR107IC8qIHVzZSBsYXJnZXIgc2l6ZSBmb3IgMjRGICovCit9OworCisKKy8qIFBvcnQgYWRkcmVzc2VzIChyZWxhdGl2ZSB0byB0aGUgYmFzZSBhZGRyZXNzKSAqLworI2RlZmluZSBVMTRGX1BST0RVQ1RfSUQocG9ydCkgKChwb3J0KSArIDB4NCkKKyNkZWZpbmUgQ09ORklHKHBvcnQpICgocG9ydCkgKyAweDYpCisKKy8qIFBvcnQgYWRkcmVzc2VzIHJlbGF0aXZlIHRvIHRoZSBkb29yYmVsbCBiYXNlIGFkZHJlc3MuICAqLworI2RlZmluZSBMQ0xfRE9PUkJFTExfTUFTSyhwb3J0KSAoKHBvcnQpICsgMHgwKQorI2RlZmluZSBMQ0xfRE9PUkJFTExfSU5UUihwb3J0KSAoKHBvcnQpICsgMHgxKQorI2RlZmluZSBTWVNfRE9PUkJFTExfTUFTSyhwb3J0KSAoKHBvcnQpICsgMHgyKQorI2RlZmluZSBTWVNfRE9PUkJFTExfSU5UUihwb3J0KSAoKHBvcnQpICsgMHgzKQorCisKKy8qIFVzZWQgdG8gc3RvcmUgY29uZmlndXJhdGlvbiBpbmZvIHJlYWQgZnJvbSBjb25maWcgaS9vIHJlZ2lzdGVycy4gIE1vc3Qgb2YKKyAgIHRoaXMgaXMgbm90IHVzZWQgeWV0LCBidXQgbWlnaHQgYXMgd2VsbCBzYXZlIGl0LgorICAgCisgICBUaGlzIHN0cnVjdHVyZSBhbHNvIGhvbGRzIHBvcnQgYWRkcmVzc2VzIHRoYXQgYXJlIG5vdCBhdCB0aGUgc2FtZSBvZmZzZXQKKyAgIG9uIHRoZSAxNEYgYW5kIDI0Ri4KKyAgIAorICAgVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYWxsIGRhdGEgdGhhdCBtdXN0IGJlIGR1cGxpY2F0ZWQgdG8gc3VwcG9ydCBtdWx0aXBsZQorICAgYWRhcHRlcnMuICAqLworCitzdGF0aWMgc3RydWN0IHVsdHJhc3Rvcl9jb25maWcKK3sKKyAgdW5zaWduZWQgc2hvcnQgcG9ydF9hZGRyZXNzOwkJLyogYmFzZSBhZGRyZXNzIG9mIGNhcmQgKi8KKyAgdW5zaWduZWQgc2hvcnQgZG9vcmJlbGxfYWRkcmVzczsJLyogYmFzZSBhZGRyZXNzIG9mIGRvb3JiZWxsIENTUnMgKi8KKyAgdW5zaWduZWQgc2hvcnQgb2dtX2FkZHJlc3M7CQkvKiBiYXNlIGFkZHJlc3Mgb2YgT0dNICovCisgIHVuc2lnbmVkIHNob3J0IGljbV9hZGRyZXNzOwkJLyogYmFzZSBhZGRyZXNzIG9mIElDTSAqLworICBjb25zdCB2b2lkICpiaW9zX3NlZ21lbnQ7CisgIHVuc2lnbmVkIGNoYXIgaW50ZXJydXB0OiA0OworICB1bnNpZ25lZCBjaGFyIGRtYV9jaGFubmVsOiAzOworICB1bnNpZ25lZCBjaGFyIGJpb3NfZHJpdmVfbnVtYmVyOiAxOworICB1bnNpZ25lZCBjaGFyIGhlYWRzOworICB1bnNpZ25lZCBjaGFyIHNlY3RvcnM7CisgIHVuc2lnbmVkIGNoYXIgaGFfc2NzaV9pZDogMzsKKyAgdW5zaWduZWQgY2hhciBzdWJ2ZXJzaW9uOiA0OworICB1bnNpZ25lZCBjaGFyIHJldmlzaW9uOworICAvKiBUaGUgc2xvdCBudW1iZXIgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGUgMjRGIChzbG90ICE9IDApIGZyb20KKyAgICAgdGhlIDE0RiBhbmQgMzRGIChzbG90ID09IDApLiAqLworICB1bnNpZ25lZCBjaGFyIHNsb3Q7CisKKyNpZmRlZiBQUklOVF9VMjRGX1ZFUlNJT04KKyAgdm9sYXRpbGUgaW50IGNzaXJfZG9uZTsKKyNlbmRpZgorCisgIC8qIEEgcG9vbCBvZiBNU0NQIHN0cnVjdHVyZXMgZm9yIHRoaXMgYWRhcHRlciwgYW5kIGEgYml0bWFzayBvZgorICAgICBidXN5IHN0cnVjdHVyZXMuICAoSWYgVUxUUkFTVE9SXzE0Rl9NQVhfQ01EUyA9PSAxLCBhIDEgYnl0ZQorICAgICBidXN5IGZsYWcgaXMgdXNlZCBpbnN0ZWFkLikgICovCisKKyNpZiBVTFRSQVNUT1JfTUFYX0NNRFMgPT0gMQorICB1bnNpZ25lZCBjaGFyIG1zY3BfYnVzeTsKKyNlbHNlCisgIHVuc2lnbmVkIGxvbmcgbXNjcF9mcmVlOworI2VuZGlmCisgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgYWJvcnRlZFtVTFRSQVNUT1JfTUFYX0NNRFNdOworICBzdHJ1Y3QgbXNjcCBtc2NwW1VMVFJBU1RPUl9NQVhfQ01EU107Cit9IGNvbmZpZyA9IHswfTsKKworLyogU2V0IHRoaXMgdG8gMSB0byByZXNldCB0aGUgU0NTSSBidXMgb24gZXJyb3IuICAqLworc3RhdGljIGludCB1bHRyYXN0b3JfYnVzX3Jlc2V0OworCisKKy8qIEFsbG93ZWQgQklPUyBiYXNlIGFkZHJlc3NlcyAoTlVMTCBpbmRpY2F0ZXMgcmVzZXJ2ZWQpICovCitzdGF0aWMgY29uc3Qgdm9pZCAqY29uc3QgYmlvc19zZWdtZW50X3RhYmxlWzhdID0geworICBOVUxMLAkgICAgICh2b2lkICopMHhDNDAwMCwgKHZvaWQgKikweEM4MDAwLCAodm9pZCAqKTB4Q0MwMDAsCisgICh2b2lkICopMHhEMDAwMCwgKHZvaWQgKikweEQ0MDAwLCAodm9pZCAqKTB4RDgwMDAsICh2b2lkICopMHhEQzAwMCwKK307CisKKy8qIEFsbG93ZWQgSVJRcyBmb3IgMTRmICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbnRlcnJ1cHRfdGFibGVfMTRmWzRdID0geyAxNSwgMTQsIDExLCAxMCB9OworCisvKiBBbGxvd2VkIERNQSBjaGFubmVscyBmb3IgMTRmICgwIGluZGljYXRlcyByZXNlcnZlZCkgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRtYV9jaGFubmVsX3RhYmxlXzE0Zls0XSA9IHsgNSwgNiwgNywgMCB9OworCisvKiBIZWFkL3NlY3RvciBtYXBwaW5ncyBhbGxvd2VkIGJ5IDE0ZiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgIHVuc2lnbmVkIGNoYXIgaGVhZHM7CisgIHVuc2lnbmVkIGNoYXIgc2VjdG9yczsKK30gbWFwcGluZ190YWJsZVs0XSA9IHsgeyAxNiwgNjMgfSwgeyA2NCwgMzIgfSwgeyA2NCwgNjMgfSwgeyA2NCwgMzIgfSB9OworCisjaWZuZGVmIFBPUlRfT1ZFUlJJREUKKy8qID8/PyBBIHByb2JlIG9mIGFkZHJlc3MgMHgzMTAgc2NyZXdzIHVwIE5FMjAwMCBjYXJkcyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHVsdHJhc3Rvcl9wb3J0c18xNGZbXSA9IHsKKyAgMHgzMzAsIDB4MzQwLCAvKjB4MzEwLCovIDB4MjMwLCAweDI0MCwgMHgyMTAsIDB4MTMwLCAweDE0MCwKK307CisjZW5kaWYKKworc3RhdGljIHZvaWQgdWx0cmFzdG9yX2ludGVycnVwdChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgaXJxcmV0dXJuX3QgZG9fdWx0cmFzdG9yX2ludGVycnVwdChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgaW5saW5lIHZvaWQgYnVpbGRfc2dfbGlzdChzdHJ1Y3QgbXNjcCAqLCBTY3NpX0NtbmQgKlNDcG50KTsKKworCisvKiBBbHdheXMgY2FsbGVkIHdpdGggaG9zdCBsb2NrIGhlbGQgKi8KKworc3RhdGljIGlubGluZSBpbnQgZmluZF9hbmRfY2xlYXJfYml0XzE2KHVuc2lnbmVkIGxvbmcgKmZpZWxkKQoreworICBpbnQgcnY7CisKKyAgaWYgKCpmaWVsZCA9PSAwKSBwYW5pYygiTm8gZnJlZSBtc2NwIik7CisgIGFzbSgieG9ybCAlMCwlMFxuMDpcdGJzZncgJTEsJXcwXG5cdGJ0ciAlMCwlMVxuXHRqbmMgMGIiCisgICAgICA6ICI9JnIiIChydiksICI9bSIgKCpmaWVsZCkgOiAiMSIgKCpmaWVsZCkpOworICByZXR1cm4gcnY7Cit9CisKKy8qIFRoaXMgaGFzIGJlZW4gcmUtaW1wbGVtZW50ZWQgd2l0aCB0aGUgaGVscCBvZiBSaWNoYXJkIEVhcm5zaGF3LAorICAgPHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmc+IGFuZCB3b3JrcyB3aXRoIGdjYy0yLjUuOCBhbmQgZ2NjLTIuNi4wLgorICAgVGhlIGluc3RhYmlsaXR5IG5vdGVkIGJ5IGpmYyBiZWxvdyBhcHBlYXJzIHRvIGJlIGEgYnVnIGluCisgICBnY2MtMi41Lnggd2hlbiBjb21waWxpbmcgdy9vIG9wdGltaXphdGlvbi4gIC0tQ2FsZWIKKworICAgVGhpcyBhc20gaXMgZnJhZ2lsZTogaXQgZG9lc24ndCB3b3JrIHdpdGhvdXQgdGhlIGNhc3RzIGFuZCBpdCBtYXkKKyAgIG5vdCB3b3JrIHdpdGhvdXQgb3B0aW1pemF0aW9uLiAgTWF5YmUgSSBzaG91bGQgYWRkIGEgc3dhcCBidWlsdGluCisgICB0byBnY2MuICAtLWpmYyAgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciB4Y2hnYih1bnNpZ25lZCBjaGFyIHJlZywKKwkJCQkgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKm1lbSkKK3sKKyAgX19hc21fXyAoInhjaGdiICUwLCUxIiA6ICI9cSIgKHJlZyksICI9bSIgKCptZW0pIDogIjAiIChyZWcpKTsKKyAgcmV0dXJuIHJlZzsKK30KKworI2lmIFVMVFJBU1RPUl9ERUJVRyAmIChVRF9DT01NQU5EIHwgVURfQUJPUlQpCisKKy8qIEFsd2F5cyBjYWxsZWQgd2l0aCB0aGUgaG9zdCBsb2NrIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGxvZ191bHRyYXN0b3JfYWJvcnQoc3RydWN0IHVsdHJhc3Rvcl9jb25maWcgKmNvbmZpZywKKwkJCQlpbnQgY29tbWFuZCkKK3sKKyAgc3RhdGljIGNoYXIgZm10WzgwXSA9ICJhYm9ydCAlZCAoJXgpOyBNU0NQIGZyZWUgcG9vbDogJXg7IjsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IFVMVFJBU1RPUl9NQVhfQ01EUzsgaSsrKQorICAgIHsKKyAgICAgIGZtdFsyMCArIGkqMl0gPSAnICc7CisgICAgICBpZiAoISAoY29uZmlnLT5tc2NwX2ZyZWUgJiAoMSA8PCBpKSkpCisJZm10WzIxICsgaSoyXSA9ICcwJyArIGNvbmZpZy0+bXNjcFtpXS50YXJnZXRfaWQ7CisgICAgICBlbHNlCisJZm10WzIxICsgaSoyXSA9ICctJzsKKyAgICB9CisgIGZtdFsyMCArIFVMVFJBU1RPUl9NQVhfQ01EUyAqIDJdID0gJ1xuJzsKKyAgZm10WzIxICsgVUxUUkFTVE9SX01BWF9DTURTICogMl0gPSAwOworICBwcmludGsoZm10LCBjb21tYW5kLCAmY29uZmlnLT5tc2NwW2NvbW1hbmRdLCBjb25maWctPm1zY3BfZnJlZSk7CisKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHVsdHJhc3Rvcl8xNGZfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqIHRwbnQpCit7CisgICAgc2l6ZV90IGk7CisgICAgdW5zaWduZWQgY2hhciBpbl9ieXRlLCB2ZXJzaW9uX2J5dGUgPSAwOworICAgIHN0cnVjdCBjb25maWdfMSB7CisgICAgICB1bnNpZ25lZCBjaGFyIGJpb3Nfc2VnbWVudDogMzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgcmVtb3ZhYmxlX2Rpc2tzX2FzX2ZpeGVkOiAxOworICAgICAgdW5zaWduZWQgY2hhciBpbnRlcnJ1cHQ6IDI7CisgICAgdW5zaWduZWQgY2hhciBkbWFfY2hhbm5lbDogMjsKKyAgICB9IGNvbmZpZ18xOworICAgIHN0cnVjdCBjb25maWdfMiB7CisgICAgICB1bnNpZ25lZCBjaGFyIGhhX3Njc2lfaWQ6IDM7CisgICAgICB1bnNpZ25lZCBjaGFyIG1hcHBpbmdfbW9kZTogMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgYmlvc19kcml2ZV9udW1iZXI6IDE7CisgICAgICB1bnNpZ25lZCBjaGFyIHRmcl9wb3J0OiAyOworICAgIH0gY29uZmlnXzI7CisKKyNpZiAoVUxUUkFTVE9SX0RFQlVHICYgVURfREVURUNUKQorICAgIHByaW50aygiVVMxNEY6IGRldGVjdDogY2FsbGVkXG4iKTsKKyNlbmRpZgorCisgICAgLyogSWYgYSAyNEYgaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLCBkb24ndCBsb29rIGZvciBhIDE0Ri4gICovCisgICAgaWYgKGNvbmZpZy5iaW9zX3NlZ21lbnQpCisJcmV0dXJuIEZBTFNFOworCisjaWZkZWYgUE9SVF9PVkVSUklERQorICAgIGlmKCFyZXF1ZXN0X3JlZ2lvbihQT1JUX09WRVJSSURFLCAweGMsICJ1bHRyYXN0b3IiKSkgeworICAgICAgcHJpbnRrKCJVbHRyYXN0b3IgSS9PIHNwYWNlIGFscmVhZHkgaW4gdXNlXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9OworICAgIGNvbmZpZy5wb3J0X2FkZHJlc3MgPSBQT1JUX09WRVJSSURFOworI2Vsc2UKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh1bHRyYXN0b3JfcG9ydHNfMTRmKTsgaSsrKSB7CisgICAgICBpZighcmVxdWVzdF9yZWdpb24odWx0cmFzdG9yX3BvcnRzXzE0ZltpXSwgMHgwYywgInVsdHJhc3RvciIpKSBjb250aW51ZTsKKyAgICAgIGNvbmZpZy5wb3J0X2FkZHJlc3MgPSB1bHRyYXN0b3JfcG9ydHNfMTRmW2ldOworI2VuZGlmCisKKyNpZiAoVUxUUkFTVE9SX0RFQlVHICYgVURfREVURUNUKQorCXByaW50aygiVVMxNEY6IGRldGVjdDogdGVzdGluZyBwb3J0IGFkZHJlc3MgJTAzWFxuIiwgY29uZmlnLnBvcnRfYWRkcmVzcyk7CisjZW5kaWYKKworCWluX2J5dGUgPSBpbmIoVTE0Rl9QUk9EVUNUX0lEKGNvbmZpZy5wb3J0X2FkZHJlc3MpKTsKKwlpZiAoaW5fYnl0ZSAhPSBVUzE0Rl9QUk9EVUNUX0lEXzApIHsKKyNpZiAoVUxUUkFTVE9SX0RFQlVHICYgVURfREVURUNUKQorIyBpZmRlZiBQT1JUX09WRVJSSURFCisJICAgIHByaW50aygiVVMxNEY6IGRldGVjdDogd3JvbmcgcHJvZHVjdCBJRCAwIC0gJTAyWFxuIiwgaW5fYnl0ZSk7CisjIGVsc2UKKwkgICAgcHJpbnRrKCJVUzE0RjogZGV0ZWN0OiBubyBhZGFwdGVyIGF0IHBvcnQgJTAzWFxuIiwgY29uZmlnLnBvcnRfYWRkcmVzcyk7CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBQT1JUX09WRVJSSURFCisJICAgIGdvdG8gb3V0X3JlbGVhc2VfcG9ydDsKKyNlbHNlCisJICAgIHJlbGVhc2VfcmVnaW9uKGNvbmZpZy5wb3J0X2FkZHJlc3MsIDB4MGMpOworCSAgICBjb250aW51ZTsKKyNlbmRpZgorCX0KKwlpbl9ieXRlID0gaW5iKFUxNEZfUFJPRFVDVF9JRChjb25maWcucG9ydF9hZGRyZXNzKSArIDEpOworCS8qIE9ubHkgdXBwZXIgbmliYmxlIGlzIHNpZ25pZmljYW50IGZvciBQcm9kdWN0IElEIDEgKi8KKwlpZiAoKGluX2J5dGUgJiAweEYwKSAhPSBVUzE0Rl9QUk9EVUNUX0lEXzEpIHsKKyNpZiAoVUxUUkFTVE9SX0RFQlVHICYgVURfREVURUNUKQorIyBpZmRlZiBQT1JUX09WRVJSSURFCisJICAgIHByaW50aygiVVMxNEY6IGRldGVjdDogd3JvbmcgcHJvZHVjdCBJRCAxIC0gJTAyWFxuIiwgaW5fYnl0ZSk7CisjIGVsc2UKKwkgICAgcHJpbnRrKCJVUzE0RjogZGV0ZWN0OiBubyBhZGFwdGVyIGF0IHBvcnQgJTAzWFxuIiwgY29uZmlnLnBvcnRfYWRkcmVzcyk7CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBQT1JUX09WRVJSSURFCisJICAgIGdvdG8gb3V0X3JlbGVhc2VfcG9ydDsKKyNlbHNlCisJICAgIHJlbGVhc2VfcmVnaW9uKGNvbmZpZy5wb3J0X2FkZHJlc3MsIDB4MGMpOworCSAgICBjb250aW51ZTsKKyNlbmRpZgorCX0KKwl2ZXJzaW9uX2J5dGUgPSBpbl9ieXRlOworI2lmbmRlZiBQT1JUX09WRVJSSURFCisJYnJlYWs7CisgICAgfQorICAgIGlmIChpID09IEFSUkFZX1NJWkUodWx0cmFzdG9yX3BvcnRzXzE0ZikpIHsKKyMgaWYgKFVMVFJBU1RPUl9ERUJVRyAmIFVEX0RFVEVDVCkKKwlwcmludGsoIlVTMTRGOiBkZXRlY3Q6IG5vIHBvcnQgYWRkcmVzcyBmb3VuZCFcbiIpOworIyBlbmRpZgorCS8qIGFsbCBwb3J0cyBwcm9iZWQgYWxyZWFkeSByZWxlYXNlZCAtIHdlIGNhbiBqdXN0IGdvIHN0cmFpZ2h0IG91dCAqLworCXJldHVybiBGQUxTRTsKKyAgICB9CisjZW5kaWYKKworI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9ERVRFQ1QpCisgICAgcHJpbnRrKCJVUzE0RjogZGV0ZWN0OiBhZGFwdGVyIGZvdW5kIGF0IHBvcnQgYWRkcmVzcyAlMDNYXG4iLAorCSAgIGNvbmZpZy5wb3J0X2FkZHJlc3MpOworI2VuZGlmCisKKyAgICAvKiBTZXQgbG9jYWwgZG9vcmJlbGwgbWFzayB0byBkaXNhbGxvdyBidXMgcmVzZXQgdW5sZXNzCisgICAgICAgdWx0cmFzdG9yX2J1c19yZXNldCBpcyB0cnVlLiAgKi8KKyAgICBvdXRiKHVsdHJhc3Rvcl9idXNfcmVzZXQgPyAweGMyIDogMHg4MiwgTENMX0RPT1JCRUxMX01BU0soY29uZmlnLnBvcnRfYWRkcmVzcykpOworCisgICAgLyogQWxsIGFib3ZlIHRlc3RzIHBhc3NlZCwgbXVzdCBiZSB0aGUgcmlnaHQgdGhpbmcuICBHZXQgc29tZSB1c2VmdWwKKyAgICAgICBpbmZvLiAqLworCisgICAgLyogUmVnaXN0ZXIgdGhlIEkvTyBzcGFjZSB0aGF0IHdlIHVzZSAqLworCisgICAgKihjaGFyICopJmNvbmZpZ18xID0gaW5iKENPTkZJRyhjb25maWcucG9ydF9hZGRyZXNzICsgMCkpOworICAgICooY2hhciAqKSZjb25maWdfMiA9IGluYihDT05GSUcoY29uZmlnLnBvcnRfYWRkcmVzcyArIDEpKTsKKyAgICBjb25maWcuYmlvc19zZWdtZW50ID0gYmlvc19zZWdtZW50X3RhYmxlW2NvbmZpZ18xLmJpb3Nfc2VnbWVudF07CisgICAgY29uZmlnLmRvb3JiZWxsX2FkZHJlc3MgPSBjb25maWcucG9ydF9hZGRyZXNzOworICAgIGNvbmZpZy5vZ21fYWRkcmVzcyA9IGNvbmZpZy5wb3J0X2FkZHJlc3MgKyAweDg7CisgICAgY29uZmlnLmljbV9hZGRyZXNzID0gY29uZmlnLnBvcnRfYWRkcmVzcyArIDB4QzsKKyAgICBjb25maWcuaW50ZXJydXB0ID0gaW50ZXJydXB0X3RhYmxlXzE0Zltjb25maWdfMS5pbnRlcnJ1cHRdOworICAgIGNvbmZpZy5oYV9zY3NpX2lkID0gY29uZmlnXzIuaGFfc2NzaV9pZDsKKyAgICBjb25maWcuaGVhZHMgPSBtYXBwaW5nX3RhYmxlW2NvbmZpZ18yLm1hcHBpbmdfbW9kZV0uaGVhZHM7CisgICAgY29uZmlnLnNlY3RvcnMgPSBtYXBwaW5nX3RhYmxlW2NvbmZpZ18yLm1hcHBpbmdfbW9kZV0uc2VjdG9yczsKKyAgICBjb25maWcuYmlvc19kcml2ZV9udW1iZXIgPSBjb25maWdfMi5iaW9zX2RyaXZlX251bWJlcjsKKyAgICBjb25maWcuc3VidmVyc2lvbiA9ICh2ZXJzaW9uX2J5dGUgJiAweDBGKTsKKyAgICBpZiAoY29uZmlnLnN1YnZlcnNpb24gPT0gVTM0RikKKwljb25maWcuZG1hX2NoYW5uZWwgPSAwOworICAgIGVsc2UKKwljb25maWcuZG1hX2NoYW5uZWwgPSBkbWFfY2hhbm5lbF90YWJsZV8xNGZbY29uZmlnXzEuZG1hX2NoYW5uZWxdOworCisgICAgaWYgKCFjb25maWcuYmlvc19zZWdtZW50KSB7CisjaWYgKFVMVFJBU1RPUl9ERUJVRyAmIFVEX0RFVEVDVCkKKwlwcmludGsoIlVTMTRGOiBkZXRlY3Q6IG5vdCBkZXRlY3RlZC5cbiIpOworI2VuZGlmCisJZ290byBvdXRfcmVsZWFzZV9wb3J0OworICAgIH0KKworICAgIC8qIEZpbmFsIGNvbnNpc3RlbmN5IGNoZWNrLCB2ZXJpZnkgcHJldmlvdXMgaW5mby4gKi8KKyAgICBpZiAoY29uZmlnLnN1YnZlcnNpb24gIT0gVTM0RikKKwlpZiAoIWNvbmZpZy5kbWFfY2hhbm5lbCB8fCAhKGNvbmZpZ18yLnRmcl9wb3J0ICYgMHgyKSkgeworI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9ERVRFQ1QpCisJICAgIHByaW50aygiVVMxNEY6IGRldGVjdDogY29uc2lzdGVuY3kgY2hlY2sgZmFpbGVkXG4iKTsKKyNlbmRpZgorICAgICAgICAgICBnb3RvIG91dF9yZWxlYXNlX3BvcnQ7CisJfQorCisgICAgLyogSWYgd2Ugd2VyZSBUUlVMWSBwYXJhbm9pZCwgd2UgY291bGQgaXNzdWUgYSBob3N0IGFkYXB0ZXIgaW5xdWlyeQorICAgICAgIGNvbW1hbmQgaGVyZSBhbmQgdmVyaWZ5IHRoZSBkYXRhIHJldHVybmVkLiAgQnV0IGZyYW5rbHksIEknbQorICAgICAgIGV4aGF1c3RlZCEgKi8KKworICAgIC8qIEZpbmFsbHkhICBOb3cgSSdtIHNhdGlzZmllZC4uLiAqLworI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9ERVRFQ1QpCisgICAgcHJpbnRrKCJVUzE0RjogZGV0ZWN0OiBkZXRlY3Qgc3VjY2VlZGVkXG4iCisJICAgIiAgUG9ydCBhZGRyZXNzOiAlMDNYXG4iCisJICAgIiAgQklPUyBzZWdtZW50OiAlMDVYXG4iCisJICAgIiAgSW50ZXJydXB0OiAldVxuIgorCSAgICIgIERNQSBjaGFubmVsOiAldVxuIgorCSAgICIgIEgvQSBTQ1NJIElEOiAldVxuIgorCSAgICIgIFN1YnZlcnNpb246ICV1XG4iLAorCSAgIGNvbmZpZy5wb3J0X2FkZHJlc3MsIGNvbmZpZy5iaW9zX3NlZ21lbnQsIGNvbmZpZy5pbnRlcnJ1cHQsCisJICAgY29uZmlnLmRtYV9jaGFubmVsLCBjb25maWcuaGFfc2NzaV9pZCwgY29uZmlnLnN1YnZlcnNpb24pOworI2VuZGlmCisgICAgdHBudC0+dGhpc19pZCA9IGNvbmZpZy5oYV9zY3NpX2lkOworICAgIHRwbnQtPnVuY2hlY2tlZF9pc2FfZG1hID0gKGNvbmZpZy5zdWJ2ZXJzaW9uICE9IFUzNEYpOworCisjaWYgVUxUUkFTVE9SX01BWF9DTURTID4gMQorICAgIGNvbmZpZy5tc2NwX2ZyZWUgPSB+MDsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBCcnJyLCAmY29uZmlnLm1zY3BbMF0uU0NpbnQtPmhvc3QpIGl0IGlzIHNvbWV0aGluZyBtYWdpY2FsLi4uLgorICAgICAqIFhYWCBhbmQgRklYTUUKKyAgICAgKi8KKyAgICBpZiAocmVxdWVzdF9pcnEoY29uZmlnLmludGVycnVwdCwgZG9fdWx0cmFzdG9yX2ludGVycnVwdCwgMCwgIlVsdHJhc3RvciIsICZjb25maWcubXNjcFswXS5TQ2ludC0+ZGV2aWNlLT5ob3N0KSkgeworCXByaW50aygiVW5hYmxlIHRvIGFsbG9jYXRlIElSUSV1IGZvciBVbHRyYVN0b3IgY29udHJvbGxlci5cbiIsCisJICAgICAgIGNvbmZpZy5pbnRlcnJ1cHQpOworCWdvdG8gb3V0X3JlbGVhc2VfcG9ydDsKKyAgICB9CisgICAgaWYgKGNvbmZpZy5kbWFfY2hhbm5lbCAmJiByZXF1ZXN0X2RtYShjb25maWcuZG1hX2NoYW5uZWwsIlVsdHJhc3RvciIpKSB7CisJcHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgRE1BIGNoYW5uZWwgJXUgZm9yIFVsdHJhU3RvciBjb250cm9sbGVyLlxuIiwKKwkgICAgICAgY29uZmlnLmRtYV9jaGFubmVsKTsKKwlmcmVlX2lycShjb25maWcuaW50ZXJydXB0LCBOVUxMKTsKKwlnb3RvIG91dF9yZWxlYXNlX3BvcnQ7CisgICAgfQorICAgIHRwbnQtPnNnX3RhYmxlc2l6ZSA9IFVMVFJBU1RPUl8xNEZfTUFYX1NHOworICAgIHByaW50aygiVWx0cmFTdG9yIGRyaXZlciB2ZXJzaW9uIiBWRVJTSU9OICIuICBVc2luZyAlZCBTRyBsaXN0cy5cbiIsCisJICAgVUxUUkFTVE9SXzE0Rl9NQVhfU0cpOworCisgICAgcmV0dXJuIFRSVUU7CitvdXRfcmVsZWFzZV9wb3J0OgorICAgIHJlbGVhc2VfcmVnaW9uKGNvbmZpZy5wb3J0X2FkZHJlc3MsIDB4MGMpOworICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludCB1bHRyYXN0b3JfMjRmX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKiB0cG50KQoreworICBpbnQgaTsKKyAgc3RydWN0IFNjc2lfSG9zdCAqIHNocG50ID0gTlVMTDsKKworI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9ERVRFQ1QpCisgIHByaW50aygiVVMyNEY6IGRldGVjdCIpOworI2VuZGlmCisKKyAgLyogcHJvYmUgZWFjaCBFSVNBIHNsb3QgYXQgc2xvdCBhZGRyZXNzIEM4MCAqLworICBmb3IgKGkgPSAxOyBpIDwgMTU7IGkrKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyIGNvbmZpZ18xLCBjb25maWdfMjsKKyAgICAgIHVuc2lnbmVkIHNob3J0IGFkZHIgPSAoaSA8PCAxMikgfCBVTFRSQVNUT1JfMjRGX1BPUlQ7CisKKyAgICAgIGlmIChpbmIoYWRkcikgIT0gVVMyNEZfUFJPRFVDVF9JRF8wICYmCisJICBpbmIoYWRkcisxKSAhPSBVUzI0Rl9QUk9EVUNUX0lEXzEgJiYKKwkgIGluYihhZGRyKzIpICE9IFVTMjRGX1BST0RVQ1RfSURfMikKKwljb250aW51ZTsKKworICAgICAgY29uZmlnLnJldmlzaW9uID0gaW5iKGFkZHIrMyk7CisgICAgICBjb25maWcuc2xvdCA9IGk7CisgICAgICBpZiAoISAoaW5iKGFkZHIrNCkgJiAxKSkKKwl7CisjaWYgKFVMVFJBU1RPUl9ERUJVRyAmIFVEX0RFVEVDVCkKKwkgIHByaW50aygiVTI0RjogZm91bmQgZGlzYWJsZWQgY2FyZCBpbiBzbG90ICV1XG4iLCBpKTsKKyNlbmRpZgorCSAgY29udGludWU7CisJfQorI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9ERVRFQ1QpCisgICAgICBwcmludGsoIlUyNEY6IGZvdW5kIGNhcmQgaW4gc2xvdCAldVxuIiwgaSk7CisjZW5kaWYKKyAgICAgIGNvbmZpZ18xID0gaW5iKGFkZHIgKyA1KTsKKyAgICAgIGNvbmZpZy5iaW9zX3NlZ21lbnQgPSBiaW9zX3NlZ21lbnRfdGFibGVbY29uZmlnXzEgJiA3XTsKKyAgICAgIHN3aXRjaChjb25maWdfMSA+PiA0KQorCXsKKwljYXNlIDE6CisJICBjb25maWcuaW50ZXJydXB0ID0gMTU7CisJICBicmVhazsKKwljYXNlIDI6CisJICBjb25maWcuaW50ZXJydXB0ID0gMTQ7CisJICBicmVhazsKKwljYXNlIDQ6CisJICBjb25maWcuaW50ZXJydXB0ID0gMTE7CisJICBicmVhazsKKwljYXNlIDg6CisJICBjb25maWcuaW50ZXJydXB0ID0gMTA7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgcHJpbnRrKCJVMjRGOiBpbnZhbGlkIElSUVxuIik7CisJICByZXR1cm4gRkFMU0U7CisJfQorCisgICAgICAvKiBCSU9TIGFkZHIgc2V0ICovCisgICAgICAvKiBiYXNlIHBvcnQgc2V0ICovCisgICAgICBjb25maWcucG9ydF9hZGRyZXNzID0gYWRkcjsKKyAgICAgIGNvbmZpZy5kb29yYmVsbF9hZGRyZXNzID0gYWRkciArIDEyOworICAgICAgY29uZmlnLm9nbV9hZGRyZXNzID0gYWRkciArIDB4MTc7CisgICAgICBjb25maWcuaWNtX2FkZHJlc3MgPSBhZGRyICsgMHgxQzsKKyAgICAgIGNvbmZpZ18yID0gaW5iKGFkZHIgKyA3KTsKKyAgICAgIGNvbmZpZy5oYV9zY3NpX2lkID0gY29uZmlnXzIgJiA3OworICAgICAgY29uZmlnLmhlYWRzID0gbWFwcGluZ190YWJsZVsoY29uZmlnXzIgPj4gMykgJiAzXS5oZWFkczsKKyAgICAgIGNvbmZpZy5zZWN0b3JzID0gbWFwcGluZ190YWJsZVsoY29uZmlnXzIgPj4gMykgJiAzXS5zZWN0b3JzOworI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9ERVRFQ1QpCisgICAgICBwcmludGsoIlVTMjRGOiBkZXRlY3Q6IGRldGVjdCBzdWNjZWVkZWRcbiIKKwkgICAgICIgIFBvcnQgYWRkcmVzczogJTAzWFxuIgorCSAgICAgIiAgQklPUyBzZWdtZW50OiAlMDVYXG4iCisJICAgICAiICBJbnRlcnJ1cHQ6ICV1XG4iCisJICAgICAiICBIL0EgU0NTSSBJRDogJXVcbiIsCisJICAgICBjb25maWcucG9ydF9hZGRyZXNzLCBjb25maWcuYmlvc19zZWdtZW50LAorCSAgICAgY29uZmlnLmludGVycnVwdCwgY29uZmlnLmhhX3Njc2lfaWQpOworI2VuZGlmCisgICAgICB0cG50LT50aGlzX2lkID0gY29uZmlnLmhhX3Njc2lfaWQ7CisgICAgICB0cG50LT51bmNoZWNrZWRfaXNhX2RtYSA9IDA7CisgICAgICB0cG50LT5zZ190YWJsZXNpemUgPSBVTFRSQVNUT1JfMjRGX01BWF9TRzsKKworICAgICAgc2hwbnQgPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIDApOworICAgICAgaWYgKCFzaHBudCkgeworICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIih1bHRyYXN0b3I6KSBDb3VsZCBub3QgcmVnaXN0ZXIgc2NzaSBkZXZpY2UuIEFib3J0aW5nIHJlZ2lzdHJhdGlvbi5cbiIpOworICAgICAgICAgICAgIGZyZWVfaXJxKGNvbmZpZy5pbnRlcnJ1cHQsIGRvX3VsdHJhc3Rvcl9pbnRlcnJ1cHQpOworICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKHJlcXVlc3RfaXJxKGNvbmZpZy5pbnRlcnJ1cHQsIGRvX3VsdHJhc3Rvcl9pbnRlcnJ1cHQsIDAsICJVbHRyYXN0b3IiLCBzaHBudCkpCisJeworCSAgcHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgSVJRJXUgZm9yIFVsdHJhU3RvciBjb250cm9sbGVyLlxuIiwKKwkJIGNvbmZpZy5pbnRlcnJ1cHQpOworCSAgcmV0dXJuIEZBTFNFOworCX0KKworICAgICAgc2hwbnQtPmlycSA9IGNvbmZpZy5pbnRlcnJ1cHQ7CisgICAgICBzaHBudC0+ZG1hX2NoYW5uZWwgPSBjb25maWcuZG1hX2NoYW5uZWw7CisgICAgICBzaHBudC0+aW9fcG9ydCA9IGNvbmZpZy5wb3J0X2FkZHJlc3M7CisKKyNpZiBVTFRSQVNUT1JfTUFYX0NNRFMgPiAxCisgICAgICBjb25maWcubXNjcF9mcmVlID0gfjA7CisjZW5kaWYKKyAgICAgIC8qIE1hcmsgSUNNIGFuZCBPR00gZnJlZSAqLworICAgICAgb3V0YigwLCBhZGRyICsgMHgxNik7CisgICAgICBvdXRiKDAsIGFkZHIgKyAweDFCKTsKKworICAgICAgLyogU2V0IGxvY2FsIGRvb3JiZWxsIG1hc2sgdG8gZGlzYWxsb3cgYnVzIHJlc2V0IHVubGVzcworCSB1bHRyYXN0b3JfYnVzX3Jlc2V0IGlzIHRydWUuICAqLworICAgICAgb3V0Yih1bHRyYXN0b3JfYnVzX3Jlc2V0ID8gMHhjMiA6IDB4ODIsIExDTF9ET09SQkVMTF9NQVNLKGFkZHIrMTIpKTsKKyAgICAgIG91dGIoMHgwMiwgU1lTX0RPT1JCRUxMX01BU0soYWRkcisxMikpOworICAgICAgcHJpbnRrKCJVbHRyYVN0b3IgZHJpdmVyIHZlcnNpb24gIiBWRVJTSU9OICIuICBVc2luZyAlZCBTRyBsaXN0cy5cbiIsCisJICAgICB0cG50LT5zZ190YWJsZXNpemUpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQgdWx0cmFzdG9yX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKiB0cG50KQoreworCXRwbnQtPnByb2NfbmFtZSA9ICJ1bHRyYXN0b3IiOworCXJldHVybiB1bHRyYXN0b3JfMTRmX2RldGVjdCh0cG50KSB8fCB1bHRyYXN0b3JfMjRmX2RldGVjdCh0cG50KTsKK30KKworc3RhdGljIGludCB1bHRyYXN0b3JfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpZiAoc2hvc3QtPmlycSkKKwkJZnJlZV9pcnEoc2hvc3QtPmlycSwgTlVMTCk7CisJaWYgKHNob3N0LT5kbWFfY2hhbm5lbCAhPSAweGZmKQorCQlmcmVlX2RtYShzaG9zdC0+ZG1hX2NoYW5uZWwpOworCWlmIChzaG9zdC0+aW9fcG9ydCAmJiBzaG9zdC0+bl9pb19wb3J0KQorCQlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgc2hvc3QtPm5faW9fcG9ydCk7CisJc2NzaV91bnJlZ2lzdGVyKHNob3N0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnVsdHJhc3Rvcl9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKiBzaHBudCkKK3sKKyAgICBzdGF0aWMgY2hhciBidWZbNjRdOworCisgICAgaWYgKGNvbmZpZy5zbG90KQorICAgICAgc3ByaW50ZihidWYsICJVbHRyYVN0b3IgMjRGIFNDU0kgQCBTbG90ICV1IElSUSV1IiwKKwkgICAgICBjb25maWcuc2xvdCwgY29uZmlnLmludGVycnVwdCk7CisgICAgZWxzZSBpZiAoY29uZmlnLnN1YnZlcnNpb24pCisgICAgICBzcHJpbnRmKGJ1ZiwgIlVsdHJhU3RvciAzNEYgU0NTSSBAIFBvcnQgJTAzWCBCSU9TICUwNVggSVJRJXUiLAorCSAgICAgIGNvbmZpZy5wb3J0X2FkZHJlc3MsIChpbnQpY29uZmlnLmJpb3Nfc2VnbWVudCwKKwkgICAgICBjb25maWcuaW50ZXJydXB0KTsKKyAgICBlbHNlCisgICAgICBzcHJpbnRmKGJ1ZiwgIlVsdHJhU3RvciAxNEYgU0NTSSBAIFBvcnQgJTAzWCBCSU9TICUwNVggSVJRJXUgRE1BJXUiLAorCSAgICAgIGNvbmZpZy5wb3J0X2FkZHJlc3MsIChpbnQpY29uZmlnLmJpb3Nfc2VnbWVudCwKKwkgICAgICBjb25maWcuaW50ZXJydXB0LCBjb25maWcuZG1hX2NoYW5uZWwpOworICAgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidWlsZF9zZ19saXN0KHN0cnVjdCBtc2NwICptc2NwLCBTY3NpX0NtbmQgKlNDcG50KQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2w7CisJbG9uZyB0cmFuc2Zlcl9sZW5ndGggPSAwOworCWludCBpLCBtYXg7CisKKwlzbCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCW1heCA9IFNDcG50LT51c2Vfc2c7CisJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCW1zY3AtPnNnbGlzdFtpXS5hZGRyZXNzID0gaXNhX3BhZ2VfdG9fYnVzKHNsW2ldLnBhZ2UpICsgc2xbaV0ub2Zmc2V0OworCQltc2NwLT5zZ2xpc3RbaV0ubnVtX2J5dGVzID0gc2xbaV0ubGVuZ3RoOworCQl0cmFuc2Zlcl9sZW5ndGggKz0gc2xbaV0ubGVuZ3RoOworCX0KKwltc2NwLT5udW1iZXJfb2Zfc2dfbGlzdCA9IG1heDsKKwltc2NwLT50cmFuc2Zlcl9kYXRhID0gaXNhX3ZpcnRfdG9fYnVzKG1zY3AtPnNnbGlzdCk7CisJLyogPz8/IE1heSBub3QgYmUgbmVjZXNzYXJ5LiAgRG9jcyBhcmUgdW5jbGVhciBhcyB0byB3aGV0aGVyIHRyYW5zZmVyCisJICAgbGVuZ3RoIGZpZWxkIGlzIGlnbm9yZWQgb3Igd2hldGhlciBpdCBzaG91bGQgYmUgc2V0IHRvIHRoZSB0b3RhbAorCSAgIG51bWJlciBvZiBieXRlcyBvZiB0aGUgdHJhbnNmZXIuICAqLworCW1zY3AtPnRyYW5zZmVyX2RhdGFfbGVuZ3RoID0gdHJhbnNmZXJfbGVuZ3RoOworfQorCitzdGF0aWMgaW50IHVsdHJhc3Rvcl9xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICpTQ3BudCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKK3sKKyAgICBzdHJ1Y3QgbXNjcCAqbXlfbXNjcDsKKyNpZiBVTFRSQVNUT1JfTUFYX0NNRFMgPiAxCisgICAgaW50IG1zY3BfaW5kZXg7CisjZW5kaWYKKyAgICB1bnNpZ25lZCBpbnQgc3RhdHVzOworCisgICAgLyogTmV4dCB0ZXN0IGlzIGZvciBkZWJ1Z2dpbmc7ICJjYW4ndCBoYXBwZW4iICovCisgICAgaWYgKChjb25maWcubXNjcF9mcmVlICYgKCgxVSA8PCBVTFRSQVNUT1JfTUFYX0NNRFMpIC0gMSkpID09IDApCisJcGFuaWMoInVsdHJhc3Rvcl9xdWV1ZWNvbW1hbmQ6IG5vIGZyZWUgTVNDUFxuIik7CisgICAgbXNjcF9pbmRleCA9IGZpbmRfYW5kX2NsZWFyX2JpdF8xNigmY29uZmlnLm1zY3BfZnJlZSk7CisKKyAgICAvKiBIYXMgdGhlIGNvbW1hbmQgYmVlbiBhYm9ydGVkPyAgKi8KKyAgICBpZiAoeGNoZ2IoMHhmZiwgJmNvbmZpZy5hYm9ydGVkW21zY3BfaW5kZXhdKSAhPSAwKQorICAgICAgeworCXN0YXR1cyA9IERJRF9BQk9SVCA8PCAxNjsKKwlnb3RvIGFib3J0ZWQ7CisgICAgICB9CisKKyAgICBteV9tc2NwID0gJmNvbmZpZy5tc2NwW21zY3BfaW5kZXhdOworCisgICAgKih1bnNpZ25lZCBjaGFyICopbXlfbXNjcCA9IE9QX1NDU0kgfCAoRFREX1NDU0kgPDwgMyk7CisKKyAgICAvKiBUYXBlIGRyaXZlcyBkb24ndCB3b3JrIHByb3Blcmx5IGlmIHRoZSBjYWNoZSBpcyB1c2VkLiAgVGhlIFNDU0kKKyAgICAgICBSRUFEIGNvbW1hbmQgZm9yIGEgdGFwZSBkb2Vzbid0IGhhdmUgYSBibG9jayBvZmZzZXQsIGFuZCB0aGUgYWRhcHRlcgorICAgICAgIGluY29ycmVjdGx5IGFzc3VtZXMgdGhhdCBhbGwgcmVhZHMgZnJvbSB0aGUgdGFwZSByZWFkIHRoZSBzYW1lCisgICAgICAgYmxvY2tzLiAgUmVzdWx0cyB3aWxsIGRlcGVuZCBvbiByZWFkIGJ1ZmZlciBzaXplIGFuZCBvdGhlciBkaXNrCisgICAgICAgYWN0aXZpdHkuIAorCisgICAgICAgPz8/ICBXaGljaCBvdGhlciBkZXZpY2UgdHlwZXMgc2hvdWxkIG5ldmVyIHVzZSB0aGUgY2FjaGU/ICAgKi8KKyAgICBteV9tc2NwLT5jYSA9IFNDcG50LT5kZXZpY2UtPnR5cGUgIT0gVFlQRV9UQVBFOworICAgIG15X21zY3AtPnRhcmdldF9pZCA9IFNDcG50LT5kZXZpY2UtPmlkOworICAgIG15X21zY3AtPmNoX25vID0gMDsKKyAgICBteV9tc2NwLT5sdW4gPSBTQ3BudC0+ZGV2aWNlLT5sdW47CisgICAgaWYgKFNDcG50LT51c2Vfc2cpIHsKKwkvKiBTZXQgc2NhdHRlci9nYXRoZXIgZmxhZyBpbiBTQ1NJIGNvbW1hbmQgcGFja2V0ICovCisJbXlfbXNjcC0+c2cgPSBUUlVFOworCWJ1aWxkX3NnX2xpc3QobXlfbXNjcCwgU0NwbnQpOworICAgIH0gZWxzZSB7CisJLyogVW5zZXQgc2NhdHRlci9nYXRoZXIgZmxhZyBpbiBTQ1NJIGNvbW1hbmQgcGFja2V0ICovCisJbXlfbXNjcC0+c2cgPSBGQUxTRTsKKwlteV9tc2NwLT50cmFuc2Zlcl9kYXRhID0gaXNhX3ZpcnRfdG9fYnVzKFNDcG50LT5yZXF1ZXN0X2J1ZmZlcik7CisJbXlfbXNjcC0+dHJhbnNmZXJfZGF0YV9sZW5ndGggPSBTQ3BudC0+cmVxdWVzdF9idWZmbGVuOworICAgIH0KKyAgICBteV9tc2NwLT5jb21tYW5kX2xpbmsgPSAwOwkJLyo/Pz8qLworICAgIG15X21zY3AtPnNjc2lfY29tbWFuZF9saW5rX2lkID0gMDsJLyo/Pz8qLworICAgIG15X21zY3AtPmxlbmd0aF9vZl9zZW5zZV9ieXRlID0gc2l6ZW9mIFNDcG50LT5zZW5zZV9idWZmZXI7CisgICAgbXlfbXNjcC0+bGVuZ3RoX29mX3Njc2lfY2RicyA9IFNDcG50LT5jbWRfbGVuOworICAgIG1lbWNweShteV9tc2NwLT5zY3NpX2NkYnMsIFNDcG50LT5jbW5kLCBteV9tc2NwLT5sZW5ndGhfb2Zfc2NzaV9jZGJzKTsKKyAgICBteV9tc2NwLT5hZGFwdGVyX3N0YXR1cyA9IDA7CisgICAgbXlfbXNjcC0+dGFyZ2V0X3N0YXR1cyA9IDA7CisgICAgbXlfbXNjcC0+c2Vuc2VfZGF0YSA9IGlzYV92aXJ0X3RvX2J1cygmU0NwbnQtPnNlbnNlX2J1ZmZlcik7CisgICAgbXlfbXNjcC0+ZG9uZSA9IGRvbmU7CisgICAgbXlfbXNjcC0+U0NpbnQgPSBTQ3BudDsKKyAgICBTQ3BudC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopbXlfbXNjcDsKKworICAgIC8qIEZpbmQgZnJlZSBPR00gc2xvdC4gIE9uIDI0RiwgbG9vayBmb3IgT0dNIHN0YXR1cyBieXRlID09IDAuCisgICAgICAgT24gMTRGIGFuZCAzNEYsIHdhaXQgZm9yIGxvY2FsIGludGVycnVwdCBwZW5kaW5nIGZsYWcgdG8gY2xlYXIuIAorICAgICAgIAorICAgICAgIEZJWE1FOiBub3cgd2UgYXJlIHVzaW5nIG5ld19laCB3ZSBzaG91bGQgcHVudCBoZXJlIGFuZCBsZXQgdGhlCisgICAgICAgbWlkbGF5ZXIgc29ydCBpdCBvdXQgKi8KKworcmV0cnk6CisgICAgaWYgKGNvbmZpZy5zbG90KQorCXdoaWxlIChpbmIoY29uZmlnLm9nbV9hZGRyZXNzIC0gMSkgIT0gMCAmJiBjb25maWcuYWJvcnRlZFttc2NwX2luZGV4XSA9PSAweGZmKQorCQliYXJyaWVyKCk7CisKKyAgICAvKiBlbHNlPz8/ICovCisKKyAgICB3aGlsZSAoKGluYihMQ0xfRE9PUkJFTExfSU5UUihjb25maWcuZG9vcmJlbGxfYWRkcmVzcykpICYgKGNvbmZpZy5zbG90ID8gMiA6IDEpKSAgJiYgY29uZmlnLmFib3J0ZWRbbXNjcF9pbmRleF0gPT0gMHhmZikKKyAgICAJYmFycmllcigpOworCisgICAgLyogVG8gYXZvaWQgcmFjZSBjb25kaXRpb25zLCBrZWVwIHRoZSBjb2RlIHRvIHdyaXRlIHRvIHRoZSBhZGFwdGVyCisgICAgICAgYXRvbWljLiAgVGhpcyBzaW1wbGlmaWVzIHRoZSBhYm9ydCBjb2RlLiAgUmlnaHQgbm93IHRoZQorICAgICAgIHNjc2kgbWlkIGxheWVyIGhhcyB0aGUgaG9zdF9sb2NrIGFscmVhZHkgaGVsZAorICAgICAqLworCisgICAgaWYgKGluYihMQ0xfRE9PUkJFTExfSU5UUihjb25maWcuZG9vcmJlbGxfYWRkcmVzcykpICYgKGNvbmZpZy5zbG90ID8gMiA6IDEpKQorICAgICAgZ290byByZXRyeTsKKworICAgIHN0YXR1cyA9IHhjaGdiKDAsICZjb25maWcuYWJvcnRlZFttc2NwX2luZGV4XSk7CisgICAgaWYgKHN0YXR1cyAhPSAweGZmKSB7CisKKyNpZiBVTFRSQVNUT1JfREVCVUcgJiAoVURfQ09NTUFORCB8IFVEX0FCT1JUKQorCXByaW50aygiVVN4NEY6IHF1ZXVlY29tbWFuZDogYWJvcnRlZFxuIik7CisjaWYgVUxUUkFTVE9SX01BWF9DTURTID4gMQorCWxvZ191bHRyYXN0b3JfYWJvcnQoJmNvbmZpZywgbXNjcF9pbmRleCk7CisjZW5kaWYKKyNlbmRpZgorCXN0YXR1cyA8PD0gMTY7CisKKyAgICAgIGFib3J0ZWQ6CisJc2V0X2JpdChtc2NwX2luZGV4LCAmY29uZmlnLm1zY3BfZnJlZSk7CisJLyogSWYgdGhlIGRyaXZlciBxdWV1ZXMgY29tbWFuZHMsIGNhbGwgdGhlIGRvbmUgcHJvYyBoZXJlLiAgT3RoZXJ3aXNlCisJICAgcmV0dXJuIGFuIGVycm9yLiAgKi8KKyNpZiBVTFRSQVNUT1JfTUFYX0NNRFMgPiAxCisJU0NwbnQtPnJlc3VsdCA9IHN0YXR1czsKKwlkb25lKFNDcG50KTsKKwlyZXR1cm4gMDsKKyNlbHNlCisJcmV0dXJuIHN0YXR1czsKKyNlbmRpZgorICAgIH0KKworICAgIC8qIFN0b3JlIHBvaW50ZXIgaW4gT0dNIGFkZHJlc3MgYnl0ZXMgKi8KKyAgICBvdXRsKGlzYV92aXJ0X3RvX2J1cyhteV9tc2NwKSwgY29uZmlnLm9nbV9hZGRyZXNzKTsKKworICAgIC8qIElzc3VlIE9HTSBpbnRlcnJ1cHQgKi8KKyAgICBpZiAoY29uZmlnLnNsb3QpIHsKKwkvKiBXcml0ZSBPR00gY29tbWFuZCByZWdpc3RlciBvbiAyNEYgKi8KKwlvdXRiKDEsIGNvbmZpZy5vZ21fYWRkcmVzcyAtIDEpOworCW91dGIoMHgyLCBMQ0xfRE9PUkJFTExfSU5UUihjb25maWcuZG9vcmJlbGxfYWRkcmVzcykpOworICAgIH0gZWxzZSB7CisJb3V0YigweDEsIExDTF9ET09SQkVMTF9JTlRSKGNvbmZpZy5kb29yYmVsbF9hZGRyZXNzKSk7CisgICAgfQorCisjaWYgKFVMVFJBU1RPUl9ERUJVRyAmIFVEX0NPTU1BTkQpCisgICAgcHJpbnRrKCJVU3g0RjogcXVldWVjb21tYW5kOiByZXR1cm5pbmdcbiIpOworI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworLyogVGhpcyBjb2RlIG11c3QgZGVhbCB3aXRoIDIgY2FzZXM6CisKKyAgIDEuIFRoZSBjb21tYW5kIGhhcyBub3QgYmVlbiB3cml0dGVuIHRvIHRoZSBPR00uICBJbiB0aGlzIGNhc2UsIHNldAorICAgdGhlIGFib3J0IGZsYWcgYW5kIHJldHVybi4KKworICAgMi4gVGhlIGNvbW1hbmQgaGFzIGJlZW4gd3JpdHRlbiB0byB0aGUgT0dNIGFuZCBpcyBzdHVjayBzb21ld2hlcmUgaW4KKyAgIHRoZSBhZGFwdGVyLgorCisgICAyYS4gIE9uIGEgMjRGLCBhc2sgdGhlIGFkYXB0ZXIgdG8gYWJvcnQgdGhlIGNvbW1hbmQuICBJdCB3aWxsIGludGVycnVwdAorICAgd2hlbiBpdCBkb2VzLgorCisgICAyYi4gIENhbGwgdGhlIGNvbW1hbmQncyBkb25lIHByb2NlZHVyZS4KKworICovCisKK3N0YXRpYyBpbnQgdWx0cmFzdG9yX2Fib3J0KFNjc2lfQ21uZCAqU0NwbnQpCit7CisjaWYgVUxUUkFTVE9SX0RFQlVHICYgVURfQUJPUlQKKyAgICBjaGFyIG91dFsxMDhdOworICAgIHVuc2lnbmVkIGNoYXIgaWNtX3N0YXR1cyA9IDAsIG9nbV9zdGF0dXMgPSAwOworICAgIHVuc2lnbmVkIGludCBpY21fYWRkciA9IDAsIG9nbV9hZGRyID0gMDsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGludCBtc2NwX2luZGV4OworICAgIHVuc2lnbmVkIGNoYXIgb2xkX2Fib3J0ZWQ7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopOworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0OworCisgICAgaWYoY29uZmlnLnNsb3QpIAorICAgICAgcmV0dXJuIEZBSUxFRDsgIC8qIERvIG5vdCBhdHRlbXB0IGFuIGFib3J0IGZvciB0aGUgMjRmICovCisgICAgICAKKyAgICAvKiBTaW1wbGUgY29uc2lzdGVuY3kgY2hlY2tpbmcgKi8KKyAgICBpZighU0NwbnQtPmhvc3Rfc2NyaWJibGUpCisgICAgICByZXR1cm4gRkFJTEVEOworCisgICAgbXNjcF9pbmRleCA9ICgoc3RydWN0IG1zY3AgKilTQ3BudC0+aG9zdF9zY3JpYmJsZSkgLSBjb25maWcubXNjcDsKKyAgICBpZiAobXNjcF9pbmRleCA+PSBVTFRSQVNUT1JfTUFYX0NNRFMpCisJcGFuaWMoIlV4NEYgYWJvcnRpbmcgaW52YWxpZCBNU0NQIik7CisKKyNpZiBVTFRSQVNUT1JfREVCVUcgJiBVRF9BQk9SVAorICAgIGlmIChjb25maWcuc2xvdCkKKyAgICAgIHsKKwlpbnQgcG9ydDAgPSAoY29uZmlnLnNsb3QgPDwgMTIpIHwgMHhjODA7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlzdHJjcHkob3V0LCAiT0dNICVkOiV4IElDTSAlZDoleCBwb3J0czogICIpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCSAgeworCSAgICB1bnNpZ25lZCBjaGFyIHAgPSBpbmIocG9ydDAgKyBpKTsKKwkgICAgb3V0WzI4ICsgaSAqIDNdID0gIjAxMjM0NTY3ODlhYmNkZWYiW3AgPj4gNF07CisJICAgIG91dFsyOSArIGkgKiAzXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIltwICYgMTVdOworCSAgICBvdXRbMzAgKyBpICogM10gPSAnICc7CisJICB9CisJb3V0WzI4ICsgaSAqIDNdID0gJ1xuJzsKKwlvdXRbMjkgKyBpICogM10gPSAwOworCW9nbV9zdGF0dXMgPSBpbmIocG9ydDAgKyAyMik7CisJb2dtX2FkZHIgPSAodW5zaWduZWQgaW50KWlzYV9idXNfdG9fdmlydChpbmwocG9ydDAgKyAyMykpOworCWljbV9zdGF0dXMgPSBpbmIocG9ydDAgKyAyNyk7CisJaWNtX2FkZHIgPSAodW5zaWduZWQgaW50KWlzYV9idXNfdG9fdmlydChpbmwocG9ydDAgKyAyOCkpOworCXNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworICAgICAgfQorCisgICAgLyogRmlyc3QgY2hlY2sgdG8gc2VlIGlmIGFuIGludGVycnVwdCBpcyBwZW5kaW5nLiAgSSBzdXNwZWN0IHRoZSBTaVMKKyAgICAgICBjaGlwc2V0IGxvc2VzIGludGVycnVwdHMuICAoSSBhbHNvIHN1c3BlY3QgaXMgbWFuZ2xlcyBkYXRhLCBidXQKKyAgICAgICBvbmUgYnVnIGF0IGEgdGltZS4uLiAqLworICAgIGlmIChjb25maWcuc2xvdCA/IGluYihjb25maWcuaWNtX2FkZHJlc3MgLSAxKSA9PSAyIDoKKwkoaW5iKFNZU19ET09SQkVMTF9JTlRSKGNvbmZpZy5kb29yYmVsbF9hZGRyZXNzKSkgJiAxKSkKKyAgICAgIHsKKwlwcmludGsoIlV4NEY6IGFib3J0IHdoaWxlIGNvbXBsZXRlZCBjb21tYW5kIHBlbmRpbmdcbiIpOworCQorCXNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCS8qIEZJWE1FOiBFd3d3Li4uIG5lZWQgdG8gdGhpbmsgYWJvdXQgcGFzc2luZyBob3N0IGFyb3VuZCBwcm9wZXJseSAqLworCXVsdHJhc3Rvcl9pbnRlcnJ1cHQoMCwgTlVMTCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gU1VDQ0VTUzsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgb2xkX2Fib3J0ZWQgPSB4Y2hnYihESURfQUJPUlQsICZjb25maWcuYWJvcnRlZFttc2NwX2luZGV4XSk7CisKKyAgICAvKiBhYm9ydGVkID09IDB4ZmYgaXMgdGhlIHNpZ25hbCB0aGF0IHF1ZXVlY29tbWFuZCBoYXMgbm90IHlldCBzZW50CisgICAgICAgdGhlIGNvbW1hbmQuICBJdCB3aWxsIG5vdGljZSB0aGUgbmV3IGFib3J0IGZsYWcgYW5kIGZhaWwuICAqLworICAgIGlmIChvbGRfYWJvcnRlZCA9PSAweGZmKQorCXJldHVybiBTVUNDRVNTOworCisgICAgLyogT24gMjRGLCBzZW5kIGFuIGFib3J0IE1TQ1AgcmVxdWVzdC4gIFRoZSBhZGFwdGVyIHdpbGwgaW50ZXJydXB0CisgICAgICAgYW5kIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsIGNhbGwgZG9uZS4gICovCisgICAgaWYgKGNvbmZpZy5zbG90ICYmIGluYihjb25maWcub2dtX2FkZHJlc3MgLSAxKSA9PSAwKQorICAgICAgeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlvdXRsKGlzYV92aXJ0X3RvX2J1cygmY29uZmlnLm1zY3BbbXNjcF9pbmRleF0pLCBjb25maWcub2dtX2FkZHJlc3MpOworCXVkZWxheSg4KTsKKwlvdXRiKDB4ODAsIGNvbmZpZy5vZ21fYWRkcmVzcyAtIDEpOworCW91dGIoMHgyLCBMQ0xfRE9PUkJFTExfSU5UUihjb25maWcuZG9vcmJlbGxfYWRkcmVzcykpOworI2lmIFVMVFJBU1RPUl9ERUJVRyAmIFVEX0FCT1JUCisJbG9nX3VsdHJhc3Rvcl9hYm9ydCgmY29uZmlnLCBtc2NwX2luZGV4KTsKKwlwcmludGsob3V0LCBvZ21fc3RhdHVzLCBvZ21fYWRkciwgaWNtX3N0YXR1cywgaWNtX2FkZHIpOworI2VuZGlmCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkvKiBGSVhNRTogYWRkIGEgd2FpdCBmb3IgdGhlIGFib3J0IHRvIGNvbXBsZXRlICovCisJcmV0dXJuIFNVQ0NFU1M7CisgICAgICB9CisKKyNpZiBVTFRSQVNUT1JfREVCVUcgJiBVRF9BQk9SVAorICAgIGxvZ191bHRyYXN0b3JfYWJvcnQoJmNvbmZpZywgbXNjcF9pbmRleCk7CisjZW5kaWYKKworICAgIC8qIENhbid0IHJlcXVlc3QgYSBncmFjZWZ1bCBhYm9ydC4gIEVpdGhlciB0aGlzIGlzIG5vdCBhIDI0RiBvcgorICAgICAgIHRoZSBPR00gaXMgYnVzeS4gIERvbid0IGZyZWUgdGhlIGNvbW1hbmQgLS0gdGhlIGFkYXB0ZXIgbWlnaHQKKyAgICAgICBzdGlsbCBiZSB1c2luZyBpdC4gIFNldHRpbmcgU0NpbnQgPSAwIGNhdXNlcyB0aGUgaW50ZXJydXB0CisgICAgICAgaGFuZGxlciB0byBpZ25vcmUgdGhlIGNvbW1hbmQuICAqLworCisgICAgLyogRklYTUUgLSBkZXZpY2VzIHRoYXQgaW1wbGVtZW50IHNvZnQgcmVzZXRzIHdpbGwgc3RpbGwgYmUgcnVubmluZworICAgICAgIHRoZSBjb21tYW5kIGFmdGVyIGEgYnVzIHJlc2V0LiAgV2Ugd291bGQgcHJvYmFibHkgcmF0aGVyIGxlYXZlCisgICAgICAgdGhlIGNvbW1hbmQgaW4gdGhlIHF1ZXVlLiAgVGhlIHVwcGVyIGxldmVsIGNvZGUgd2lsbCBhdXRvbWF0aWNhbGx5CisgICAgICAgbGVhdmUgdGhlIGNvbW1hbmQgaW4gdGhlIGFjdGl2ZSBzdGF0ZSBpbnN0ZWFkIG9mIHJlcXVldWVpbmcgaXQuIEVSWSAqLworCisjaWYgVUxUUkFTVE9SX0RFQlVHICYgVURfQUJPUlQKKyAgICBpZiAoY29uZmlnLm1zY3BbbXNjcF9pbmRleF0uU0NpbnQgIT0gU0NwbnQpCisJcHJpbnRrKCJhYm9ydDogY29tbWFuZCBtaXNtYXRjaCwgJXAgIT0gJXBcbiIsCisJICAgICAgIGNvbmZpZy5tc2NwW21zY3BfaW5kZXhdLlNDaW50LCBTQ3BudCk7CisjZW5kaWYKKyAgICBpZiAoY29uZmlnLm1zY3BbbXNjcF9pbmRleF0uU0NpbnQgPT0gMCkKKwlyZXR1cm4gU0NTSV9BQk9SVF9OT1RfUlVOTklORzsKKworICAgIGlmIChjb25maWcubXNjcFttc2NwX2luZGV4XS5TQ2ludCAhPSBTQ3BudCkgcGFuaWMoIkJhZCBhYm9ydCIpOworICAgIGNvbmZpZy5tc2NwW21zY3BfaW5kZXhdLlNDaW50ID0gTlVMTDsKKyAgICBkb25lID0gY29uZmlnLm1zY3BbbXNjcF9pbmRleF0uZG9uZTsKKyAgICBjb25maWcubXNjcFttc2NwX2luZGV4XS5kb25lID0gTlVMTDsKKyAgICBTQ3BudC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworICAgIAorICAgIC8qIFRha2UgdGhlIGhvc3QgbG9jayB0byBndWFyZCBhZ2FpbnN0IHNjc2kgbGF5ZXIgcmUtZW50cnkgKi8KKyAgICBzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKyAgICBkb25lKFNDcG50KTsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisgICAgLyogTmVlZCB0byBzZXQgYSB0aW1lb3V0IGhlcmUgaW4gY2FzZSBjb21tYW5kIG5ldmVyIGNvbXBsZXRlcy4gICovCisgICAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgdWx0cmFzdG9yX2hvc3RfcmVzZXQoU2NzaV9DbW5kICogU0NwbnQpCit7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gU0NwbnQtPmRldmljZS0+aG9zdDsKKyAgICAKKyNpZiAoVUxUUkFTVE9SX0RFQlVHICYgVURfUkVTRVQpCisgICAgcHJpbnRrKCJVUzE0RjogcmVzZXQ6IGNhbGxlZFxuIik7CisjZW5kaWYKKworICAgIGlmKGNvbmZpZy5zbG90KQorICAgIAlyZXR1cm4gRkFJTEVEOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisgICAgLyogUmVzZXQgdGhlIGFkYXB0ZXIgYW5kIFNDU0kgYnVzLiAgVGhlIFNDU0kgYnVzIHJlc2V0IGNhbiBiZQorICAgICAgIGluaGliaXRlZCBieSBjbGVhcmluZyB1bHRyYXN0b3JfYnVzX3Jlc2V0IGJlZm9yZSBwcm9iZS4gICovCisgICAgb3V0YigweGMwLCBMQ0xfRE9PUkJFTExfSU5UUihjb25maWcuZG9vcmJlbGxfYWRkcmVzcykpOworICAgIGlmIChjb25maWcuc2xvdCkKKyAgICAgIHsKKwlvdXRiKDAsIGNvbmZpZy5vZ21fYWRkcmVzcyAtIDEpOworCW91dGIoMCwgY29uZmlnLmljbV9hZGRyZXNzIC0gMSk7CisgICAgICB9CisKKyNpZiBVTFRSQVNUT1JfTUFYX0NNRFMgPT0gMQorICAgIGlmIChjb25maWcubXNjcF9idXN5ICYmIGNvbmZpZy5tc2NwLT5kb25lICYmIGNvbmZpZy5tc2NwLT5TQ2ludCkKKyAgICAgIHsKKwljb25maWcubXNjcC0+U0NpbnQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwljb25maWcubXNjcC0+ZG9uZShjb25maWcubXNjcC0+U0NpbnQpOworICAgICAgfQorICAgIGNvbmZpZy5tc2NwLT5TQ2ludCA9IDA7CisjZWxzZQorICAgIGZvciAoaSA9IDA7IGkgPCBVTFRSQVNUT1JfTUFYX0NNRFM7IGkrKykKKyAgICAgIHsKKwlpZiAoISAoY29uZmlnLm1zY3BfZnJlZSAmICgxIDw8IGkpKSAmJgorCSAgICBjb25maWcubXNjcFtpXS5kb25lICYmIGNvbmZpZy5tc2NwW2ldLlNDaW50KQorCSAgeworCSAgICBjb25maWcubXNjcFtpXS5TQ2ludC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCSAgICBjb25maWcubXNjcFtpXS5kb25lKGNvbmZpZy5tc2NwW2ldLlNDaW50KTsKKwkgICAgY29uZmlnLm1zY3BbaV0uZG9uZSA9IE5VTEw7CisJICB9CisJY29uZmlnLm1zY3BbaV0uU0NpbnQgPSBOVUxMOworICAgICAgfQorI2VuZGlmCisKKyAgICAvKiBGSVhNRSAtIGlmIHRoZSBkZXZpY2UgaW1wbGVtZW50cyBzb2Z0IHJlc2V0cywgdGhlbiB0aGUgY29tbWFuZAorICAgICAgIHdpbGwgc3RpbGwgYmUgcnVubmluZy4gIEVSWSAgCisgICAgICAgCisgICAgICAgRXZlbiBiaWdnZXIgZGVhbCB3aXRoIG5ld19laCEgCisgICAgICovCisKKyAgICBtZW1zZXQoKHVuc2lnbmVkIGNoYXIgKiljb25maWcuYWJvcnRlZCwgMCwgc2l6ZW9mIGNvbmZpZy5hYm9ydGVkKTsKKyNpZiBVTFRSQVNUT1JfTUFYX0NNRFMgPT0gMQorICAgIGNvbmZpZy5tc2NwX2J1c3kgPSAwOworI2Vsc2UKKyAgICBjb25maWcubXNjcF9mcmVlID0gfjA7CisjZW5kaWYKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisgICAgcmV0dXJuIFNDU0lfUkVTRVRfU1VDQ0VTUzsKKworfQorCitpbnQgdWx0cmFzdG9yX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKiBka2luZm8pCit7CisgICAgaW50IHNpemUgPSBjYXBhY2l0eTsKKyAgICB1bnNpZ25lZCBpbnQgcyA9IGNvbmZpZy5oZWFkcyAqIGNvbmZpZy5zZWN0b3JzOworCisgICAgZGtpbmZvWzBdID0gY29uZmlnLmhlYWRzOworICAgIGRraW5mb1sxXSA9IGNvbmZpZy5zZWN0b3JzOworICAgIGRraW5mb1syXSA9IHNpemUgLyBzOwkvKiBJZ25vcmUgcGFydGlhbCBjeWxpbmRlcnMgKi8KKyNpZiAwCisgICAgaWYgKGRraW5mb1syXSA+IDEwMjQpCisJZGtpbmZvWzJdID0gMTAyNDsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1bHRyYXN0b3JfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgdW5zaWduZWQgaW50IHN0YXR1czsKKyNpZiBVTFRSQVNUT1JfTUFYX0NNRFMgPiAxCisgICAgdW5zaWduZWQgaW50IG1zY3BfaW5kZXg7CisjZW5kaWYKKyAgICBzdHJ1Y3QgbXNjcCAqbXNjcDsKKyAgICB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopOworICAgIFNjc2lfQ21uZCAqU0N0bXA7CisKKyNpZiBVTFRSQVNUT1JfTUFYX0NNRFMgPT0gMQorICAgIG1zY3AgPSAmY29uZmlnLm1zY3BbMF07CisjZWxzZQorICAgIG1zY3AgPSAoc3RydWN0IG1zY3AgKilpc2FfYnVzX3RvX3ZpcnQoaW5sKGNvbmZpZy5pY21fYWRkcmVzcykpOworICAgIG1zY3BfaW5kZXggPSBtc2NwIC0gY29uZmlnLm1zY3A7CisgICAgaWYgKG1zY3BfaW5kZXggPj0gVUxUUkFTVE9SX01BWF9DTURTKSB7CisJcHJpbnRrKCJVeDRGIGludGVycnVwdDogYmFkIE1TQ1AgYWRkcmVzcyAleFxuIiwgKHVuc2lnbmVkIGludCkgbXNjcCk7CisJLyogQSBjb21tYW5kIGhhcyBiZWVuIGxvc3QuICBSZXNldCBhbmQgcmVwb3J0IGFuIGVycm9yCisJICAgZm9yIGFsbCBjb21tYW5kcy4gICovCisJdWx0cmFzdG9yX2hvc3RfcmVzZXQoZGV2X2lkKTsKKwlyZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBDbGVhbiBJQ00gc2xvdCAoc2V0IElDTUlOVCBiaXQgdG8gMCkgKi8KKyAgICBpZiAoY29uZmlnLnNsb3QpIHsKKwl1bnNpZ25lZCBjaGFyIGljbV9zdGF0dXMgPSBpbmIoY29uZmlnLmljbV9hZGRyZXNzIC0gMSk7CisjaWYgVUxUUkFTVE9SX0RFQlVHICYgKFVEX0lOVEVSUlVQVHxVRF9FUlJPUnxVRF9BQk9SVCkKKwlpZiAoaWNtX3N0YXR1cyAhPSAxICYmIGljbV9zdGF0dXMgIT0gMikKKwkgICAgcHJpbnRrKCJVUzI0RjogSUNNIHN0YXR1cyAleCBmb3IgTVNDUCAlZCAoJXgpXG4iLCBpY21fc3RhdHVzLAorCQkgICBtc2NwX2luZGV4LCAodW5zaWduZWQgaW50KSBtc2NwKTsKKyNlbmRpZgorCS8qIFRoZSBtYW51YWwgc2F5cyBjbGVhciBpbnRlcnJ1cHQgdGhlbiB3cml0ZSAwIHRvIElDTSBzdGF0dXMuCisJICAgVGhpcyBzZWVtcyBiYWNrd2FyZHMsIGJ1dCBJJ2xsIGRvIGl0IGFueXdheS4gIC0tamZjICovCisJb3V0YigyLCBTWVNfRE9PUkJFTExfSU5UUihjb25maWcuZG9vcmJlbGxfYWRkcmVzcykpOworCW91dGIoMCwgY29uZmlnLmljbV9hZGRyZXNzIC0gMSk7CisJaWYgKGljbV9zdGF0dXMgPT0gNCkgeworCSAgICBwcmludGsoIlVsdHJhU3RvciBhYm9ydCBjb21tYW5kIGZhaWxlZFxuIik7CisJICAgIHJldHVybjsKKwl9CisJaWYgKGljbV9zdGF0dXMgPT0gMykgeworCSAgICB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopID0gbXNjcC0+ZG9uZTsKKwkgICAgaWYgKGRvbmUpIHsKKwkJbXNjcC0+ZG9uZSA9IE5VTEw7CisJCW1zY3AtPlNDaW50LT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCWRvbmUobXNjcC0+U0NpbnQpOworCSAgICB9CisJICAgIHJldHVybjsKKwl9CisgICAgfSBlbHNlIHsKKwlvdXRiKDEsIFNZU19ET09SQkVMTF9JTlRSKGNvbmZpZy5kb29yYmVsbF9hZGRyZXNzKSk7CisgICAgfQorCisgICAgU0N0bXAgPSBtc2NwLT5TQ2ludDsKKyAgICBtc2NwLT5TQ2ludCA9IE5VTEw7CisKKyAgICBpZiAoU0N0bXAgPT0gMCkKKyAgICAgIHsKKyNpZiBVTFRSQVNUT1JfREVCVUcgJiAoVURfQUJPUlR8VURfSU5URVJSVVBUKQorCXByaW50aygiTVNDUCAlZCAoJXgpOiBubyBjb21tYW5kXG4iLCBtc2NwX2luZGV4LCAodW5zaWduZWQgaW50KSBtc2NwKTsKKyNlbmRpZgkKKyNpZiBVTFRSQVNUT1JfTUFYX0NNRFMgPT0gMQorCWNvbmZpZy5tc2NwX2J1c3kgPSBGQUxTRTsKKyNlbHNlCisJc2V0X2JpdChtc2NwX2luZGV4LCAmY29uZmlnLm1zY3BfZnJlZSk7CisjZW5kaWYKKwljb25maWcuYWJvcnRlZFttc2NwX2luZGV4XSA9IDA7CisJcmV0dXJuOworICAgICAgfQorCisgICAgLyogU2F2ZSBkb25lIGxvY2FsbHkgYW5kIHplcm8gYmVmb3JlIGNhbGxpbmcuICBUaGlzIGlzIG5lZWRlZCBhcworICAgICAgIG9uY2Ugd2UgY2FsbCBkb25lLCB3ZSBtYXkgZ2V0IGFub3RoZXIgY29tbWFuZCBxdWV1ZWQgYmVmb3JlIHRoaXMKKyAgICAgICBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGNhbiByZXR1cm4uICovCisgICAgZG9uZSA9IG1zY3AtPmRvbmU7CisgICAgbXNjcC0+ZG9uZSA9IE5VTEw7CisKKyAgICAvKiBMZXQgdGhlIGhpZ2hlciBsZXZlbHMga25vdyB0aGF0IHdlJ3JlIGRvbmUgKi8KKyAgICBzd2l0Y2ggKG1zY3AtPmFkYXB0ZXJfc3RhdHVzKQorICAgICAgeworICAgICAgY2FzZSAwOgorCXN0YXR1cyA9IERJRF9PSyA8PCAxNjsKKwlicmVhazsKKyAgICAgIGNhc2UgMHgwMToJLyogaW52YWxpZCBjb21tYW5kICovCisgICAgICBjYXNlIDB4MDI6CS8qIGludmFsaWQgcGFyYW1ldGVycyAqLworICAgICAgY2FzZSAweDAzOgkvKiBpbnZhbGlkIGRhdGEgbGlzdCAqLworICAgICAgZGVmYXVsdDoKKwlzdGF0dXMgPSBESURfRVJST1IgPDwgMTY7CisJYnJlYWs7CisgICAgICBjYXNlIDB4ODQ6CS8qIFNDU0kgYnVzIGFib3J0ICovCisJc3RhdHVzID0gRElEX0FCT1JUIDw8IDE2OworCWJyZWFrOworICAgICAgY2FzZSAweDkxOgorCXN0YXR1cyA9IERJRF9USU1FX09VVCA8PCAxNjsKKwlicmVhazsKKyAgICAgIH0KKworICAgIFNDdG1wLT5yZXN1bHQgPSBzdGF0dXMgfCBtc2NwLT50YXJnZXRfc3RhdHVzOworCisgICAgU0N0bXAtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCisgICAgLyogRnJlZSB1cCBtc2NwIGJsb2NrIGZvciBuZXh0IGNvbW1hbmQgKi8KKyNpZiBVTFRSQVNUT1JfTUFYX0NNRFMgPT0gMQorICAgIGNvbmZpZy5tc2NwX2J1c3kgPSBGQUxTRTsKKyNlbHNlCisgICAgc2V0X2JpdChtc2NwX2luZGV4LCAmY29uZmlnLm1zY3BfZnJlZSk7CisjZW5kaWYKKworI2lmIFVMVFJBU1RPUl9ERUJVRyAmIChVRF9BQk9SVHxVRF9JTlRFUlJVUFQpCisgICAgaWYgKGNvbmZpZy5hYm9ydGVkW21zY3BfaW5kZXhdKQorCXByaW50aygiVXg0IGludGVycnVwdDogTVNDUCAlZCAoJXgpIGFib3J0ZWQgPSAlZFxuIiwKKwkgICAgICAgbXNjcF9pbmRleCwgKHVuc2lnbmVkIGludCkgbXNjcCwgY29uZmlnLmFib3J0ZWRbbXNjcF9pbmRleF0pOworI2VuZGlmCisgICAgY29uZmlnLmFib3J0ZWRbbXNjcF9pbmRleF0gPSAwOworCisgICAgaWYgKGRvbmUpCisJZG9uZShTQ3RtcCk7CisgICAgZWxzZQorCXByaW50aygiVVMxNEY6IGludGVycnVwdDogdW5leHBlY3RlZCBpbnRlcnJ1cHRcbiIpOworCisgICAgaWYgKGNvbmZpZy5zbG90ID8gaW5iKGNvbmZpZy5pY21fYWRkcmVzcyAtIDEpIDoKKyAgICAgICAoaW5iKFNZU19ET09SQkVMTF9JTlRSKGNvbmZpZy5kb29yYmVsbF9hZGRyZXNzKSkgJiAxKSkKKyNpZiAoVUxUUkFTVE9SX0RFQlVHICYgVURfTVVMVElfQ01EKQorICAgICAgcHJpbnRrKCJVeDRGOiBtdWx0aXBsZSBjb21tYW5kcyBjb21wbGV0ZWRcbiIpOworI2Vsc2UKKyAgICAgIDsKKyNlbmRpZgorCisjaWYgKFVMVFJBU1RPUl9ERUJVRyAmIFVEX0lOVEVSUlVQVCkKKyAgICBwcmludGsoIlVTeDRGOiBpbnRlcnJ1cHQ6IHJldHVybmluZ1xuIik7CisjZW5kaWYKK30KKworc3RhdGljIGlycXJldHVybl90IGRvX3VsdHJhc3Rvcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpkZXYgPSBkZXZfaWQ7CisgICAgCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKyAgICB1bHRyYXN0b3JfaW50ZXJydXB0KGlycSwgZGV2X2lkLCByZWdzKTsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5uYW1lICAgICAgICAgICAgICA9ICJVbHRyYVN0b3IgMTRGLzI0Ri8zNEYiLAorCS5kZXRlY3QgICAgICAgICAgICA9IHVsdHJhc3Rvcl9kZXRlY3QsCisJLnJlbGVhc2UJICAgPSB1bHRyYXN0b3JfcmVsZWFzZSwKKwkuaW5mbyAgICAgICAgICAgICAgPSB1bHRyYXN0b3JfaW5mbywKKwkucXVldWVjb21tYW5kICAgICAgPSB1bHRyYXN0b3JfcXVldWVjb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyICA9IHVsdHJhc3Rvcl9hYm9ydCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyICA9IHVsdHJhc3Rvcl9ob3N0X3Jlc2V0LAkKKwkuYmlvc19wYXJhbSAgICAgICAgPSB1bHRyYXN0b3JfYmlvc3BhcmFtLAorCS5jYW5fcXVldWUgICAgICAgICA9IFVMVFJBU1RPUl9NQVhfQ01EUywKKwkuc2dfdGFibGVzaXplICAgICAgPSBVTFRSQVNUT1JfMTRGX01BWF9TRywKKwkuY21kX3Blcl9sdW4gICAgICAgPSBVTFRSQVNUT1JfTUFYX0NNRFNfUEVSX0xVTiwKKwkudW5jaGVja2VkX2lzYV9kbWEgPSAxLAorCS51c2VfY2x1c3RlcmluZyAgICA9IEVOQUJMRV9DTFVTVEVSSU5HLAorfTsKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3VsdHJhc3Rvci5oIGIvZHJpdmVycy9zY3NpL3VsdHJhc3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMGY4ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvdWx0cmFzdG9yLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqCXVsdHJhc3Rvci5jCShDKSAxOTkxIERhdmlkIEIuIEdlbnR6ZWwKKyAqCUxvdy1sZXZlbCBzY3NpIGRyaXZlciBmb3IgVWx0cmFTdG9yIDE0RgorICoJYnkgRGF2aWQgQi4gR2VudHplbCwgV2hpdGZpZWxkIFNvZnR3YXJlIFNlcnZpY2VzLCBDYXJuZWdpZSwgUEEKKyAqCSAgICAoZ2VudHplbEBub3ZhLmVuZXQuZGVjLmNvbSkKKyAqICBzY2F0dGVyL2dhdGhlciBhZGRlZCBieSBTY290dCBUYXlsb3IgKG4yMTdjZ0B0YW11dHMudGFtdS5lZHUpCisgKiAgMjRGIHN1cHBvcnQgYnkgSm9obiBGLiBDYXJyIChqZmNAYXRoZW5hLm1pdC5lZHUpCisgKiAgICBKb2huJ3Mgd29yayBtb2RpZmllZCBieSBDYWxlYiBFcHN0ZWluIChjYWVAanBtb3JnYW4uY29tKSBhbmQgCisgKiAgICBFcmljIFlvdW5nZGFsZSAoZXJpY0B0YW50YWx1cy5ucmwubmF2eS5taWwpLgorICoJVGhhbmtzIHRvIFVsdHJhU3RvciBmb3IgcHJvdmlkaW5nIHRoZSBuZWNlc3NhcnkgZG9jdW1lbnRhdGlvbgorICovCisKKyNpZm5kZWYgX1VMVFJBU1RPUl9ICisjZGVmaW5lIF9VTFRSQVNUT1JfSAorCitzdGF0aWMgaW50IHVsdHJhc3Rvcl9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICopOworc3RhdGljIGNvbnN0IGNoYXIgKnVsdHJhc3Rvcl9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKiBzaHBudCk7CitzdGF0aWMgaW50IHVsdHJhc3Rvcl9xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICosIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpOworc3RhdGljIGludCB1bHRyYXN0b3JfYWJvcnQoU2NzaV9DbW5kICopOworc3RhdGljIGludCB1bHRyYXN0b3JfaG9zdF9yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IHVsdHJhc3Rvcl9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICosIHN0cnVjdCBibG9ja19kZXZpY2UgKiwgc2VjdG9yX3QsIGludCAqKTsKKworCisjZGVmaW5lIFVMVFJBU1RPUl8xNEZfTUFYX1NHIDE2CisjZGVmaW5lIFVMVFJBU1RPUl8yNEZfTUFYX1NHIDMzCisKKyNkZWZpbmUgVUxUUkFTVE9SX01BWF9DTURTX1BFUl9MVU4gNQorI2RlZmluZSBVTFRSQVNUT1JfTUFYX0NNRFMgMTYKKworI2RlZmluZSBVTFRSQVNUT1JfMjRGX1BPUlQgMHhDODAKKworCisjaWZkZWYgVUxUUkFTVE9SX1BSSVZBVEUKKworI2RlZmluZSBVRF9BQk9SVAkweDAwMDEKKyNkZWZpbmUgVURfQ09NTUFORAkweDAwMDIKKyNkZWZpbmUgVURfREVURUNUCTB4MDAwNAorI2RlZmluZSBVRF9JTlRFUlJVUFQJMHgwMDA4CisjZGVmaW5lIFVEX1JFU0VUCTB4MDAxMAorI2RlZmluZSBVRF9NVUxUSV9DTUQJMHgwMDIwCisjZGVmaW5lIFVEX0NTSVIJCTB4MDA0MAorI2RlZmluZSBVRF9FUlJPUgkweDAwODAKKworLyogI2RlZmluZSBQT1JUX09WRVJSSURFIDB4MzMwICovCisKKy8qIFZhbHVlcyBmb3IgdGhlIFBST0RVQ1RfSUQgcG9ydHMgZm9yIHRoZSAxNEYgKi8KKyNkZWZpbmUgVVMxNEZfUFJPRFVDVF9JRF8wIDB4NTYKKyNkZWZpbmUgVVMxNEZfUFJPRFVDVF9JRF8xIDB4NDAJCS8qIE5PVEU6IE9ubHkgdXBwZXIgbmliYmxlIGlzIHVzZWQgKi8KKworI2RlZmluZSBVUzI0Rl9QUk9EVUNUX0lEXzAgMHg1NgorI2RlZmluZSBVUzI0Rl9QUk9EVUNUX0lEXzEgMHg2MworI2RlZmluZSBVUzI0Rl9QUk9EVUNUX0lEXzIgMHgwMgorCisvKiBTdWJ2ZXJzaW9uIHZhbHVlcyAqLworI2RlZmluZSBVMTRGIDAKKyNkZWZpbmUgVTM0RiAxCisKKy8qIE1TQ1AgZmllbGQgdmFsdWVzICovCisKKy8qIE9wY29kZSAqLworI2RlZmluZSBPUF9IT1NUX0FEQVBURVIgMHgxCisjZGVmaW5lIE9QX1NDU0kgMHgyCisjZGVmaW5lIE9QX1JFU0VUIDB4NAorCisvKiBEYXRlIFRyYW5zZmVyIERpcmVjdGlvbiAqLworI2RlZmluZSBEVERfU0NTSSAweDAKKyNkZWZpbmUgRFREX0lOIDB4MQorI2RlZmluZSBEVERfT1VUIDB4MgorI2RlZmluZSBEVERfTk9ORSAweDMKKworLyogSG9zdCBBZGFwdGVyIGNvbW1hbmQgc3ViY29kZXMgKi8KKyNkZWZpbmUgSEFfQ01EX0lOUVVJUlkgMHgxCisjZGVmaW5lIEhBX0NNRF9TRUxGX0RJQUcgMHgyCisjZGVmaW5lIEhBX0NNRF9SRUFEX0JVRkYgMHgzCisjZGVmaW5lIEhBX0NNRF9XUklURV9CVUZGIDB4NAorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvd2QzM2M5My5jIGIvZHJpdmVycy9zY3NpL3dkMzNjOTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzU0NDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3dkMzNjOTMuYwpAQCAtMCwwICsxLDIwNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYgSm9obiBTaGlmZmxldHQsIEdlb0xvZyBDb25zdWx0aW5nCisgKiAgICBqb2huQGdlb2xvZy5jb20KKyAqICAgIGpzaGlmZmxlQG5ldGNvbS5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoKKyAqIERyZXcgRWNraGFyZHQncyBleGNlbGxlbnQgJ0dlbmVyaWMgTkNSNTM4MCcgc291cmNlcyBmcm9tIExpbnV4LVBDCisgKiBwcm92aWRlZCBtdWNoIG9mIHRoZSBpbnNwaXJhdGlvbiBhbmQgc29tZSBvZiB0aGUgY29kZSBmb3IgdGhpcworICogZHJpdmVyLiBFdmVyeXRoaW5nIEkga25vdyBhYm91dCBBbWlnYSBETUEgd2FzIGdsZWFuZWQgZnJvbSBjYXJlZnVsCisgKiByZWFkaW5nIG9mIEhhbWlzaCBNY2RvbmFsZCdzIG9yaWdpbmFsIHdkMzNjOTMgZHJpdmVyOyBpbiBmYWN0LCBJCisgKiBib3Jyb3dlZCBzaGFtZWxlc3NseSBmcm9tIGFsbCBvdmVyIHRoYXQgc291cmNlLiBUaGFua3MgSGFtaXNoIQorICoKKyAqIF9UaGlzXyBkcml2ZXIgaXMgKEkgZmVlbCkgYW4gaW1wcm92ZW1lbnQgb3ZlciB0aGUgb2xkIG9uZSBpbgorICogc2V2ZXJhbCByZXNwZWN0czoKKyAqCisgKiAgICAtICBUYXJnZXQgRGlzY29ubmVjdGlvbi9SZWNvbm5lY3Rpb24gIGlzIG5vdyBzdXBwb3J0ZWQuIEFueQorICogICAgICAgICAgc3lzdGVtIHdpdGggbW9yZSB0aGFuIG9uZSBkZXZpY2UgYWN0aXZlIG9uIHRoZSBTQ1NJIGJ1cworICogICAgICAgICAgd2lsbCBiZW5lZml0IGZyb20gdGhpcy4gVGhlIGRyaXZlciBkZWZhdWx0cyB0byB3aGF0IEkKKyAqICAgICAgICAgIGNhbGwgJ2FkYXB0aXZlIGRpc2Nvbm5lY3QnIC0gbWVhbmluZyB0aGF0IGVhY2ggY29tbWFuZAorICogICAgICAgICAgaXMgZXZhbHVhdGVkIGluZGl2aWR1YWxseSBhcyB0byB3aGV0aGVyIG9yIG5vdCBpdCBzaG91bGQKKyAqICAgICAgICAgIGJlIHJ1biB3aXRoIHRoZSBvcHRpb24gdG8gZGlzY29ubmVjdC9yZXNlbGVjdCAoaWYgdGhlCisgKiAgICAgICAgICBkZXZpY2UgY2hvb3NlcyksIG9yIGFzIGEgIlNDU0ktYnVzLWhvZyIuCisgKgorICogICAgLSAgU3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlcnMgYXJlIG5vdyBzdXBwb3J0ZWQuIEJlY2F1c2Ugb2YKKyAqICAgICAgICAgIGEgZmV3IGRldmljZXMgdGhhdCBjaG9rZSBhZnRlciB0ZWxsaW5nIHRoZSBkcml2ZXIgdGhhdAorICogICAgICAgICAgdGhleSBjYW4gZG8gc3luYyB0cmFuc2ZlcnMsIHdlIGRvbid0IGF1dG9tYXRpY2FsbHkgdXNlCisgKiAgICAgICAgICB0aGlzIGZhc3RlciBwcm90b2NvbCAtIGl0IGNhbiBiZSBlbmFibGVkIHZpYSB0aGUgY29tbWFuZC0KKyAqICAgICAgICAgIGxpbmUgb24gYSBkZXZpY2UtYnktZGV2aWNlIGJhc2lzLgorICoKKyAqICAgIC0gIFJ1bnRpbWUgb3BlcmF0aW5nIHBhcmFtZXRlcnMgY2FuIG5vdyBiZSBzcGVjaWZpZWQgdGhyb3VnaAorICogICAgICAgdGhlICdhbWlib290JyBvciB0aGUgJ2luc21vZCcgY29tbWFuZCBsaW5lLiBGb3IgYW1pYm9vdCBkbzoKKyAqICAgICAgICAgICJhbWlib290IFt1c3VhbCBzdHVmZl0gd2QzM2M5Mz1ibGFoLGJsYWgsYmxhaCIKKyAqICAgICAgIFRoZSBkZWZhdWx0cyBzaG91bGQgYmUgZ29vZCBmb3IgbW9zdCBwZW9wbGUuIFNlZSB0aGUgY29tbWVudAorICogICAgICAgZm9yICdzZXR1cF9zdHJpbmdzJyBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIC0gIFRoZSBvbGQgZHJpdmVyIHJlbGllZCBleGNsdXNpdmVseSBvbiB3aGF0IHRoZSBXZXN0ZXJuIERpZ2l0YWwKKyAqICAgICAgICAgIGRvY3MgY2FsbCAiQ29tYmluYXRpb24gTGV2ZWwgMiBDb21tYW5kcyIsIHdoaWNoIGFyZSBhIGdyZWF0CisgKiAgICAgICAgICBpZGVhIGluIHRoYXQgdGhlIENQVSBpcyByZWxpZXZlZCBvZiBhIGxvdCBvZiBpbnRlcnJ1cHQKKyAqICAgICAgICAgIG92ZXJoZWFkLiBIb3dldmVyLCBieSBhY2NlcHRpbmcgYSBjZXJ0YWluICh1c2VyLXNldHRhYmxlKQorICogICAgICAgICAgYW1vdW50IG9mIGFkZGl0aW9uYWwgaW50ZXJydXB0cywgdGhpcyBkcml2ZXIgYWNoaWV2ZXMKKyAqICAgICAgICAgIGJldHRlciBjb250cm9sIG92ZXIgdGhlIFNDU0kgYnVzLCBhbmQgZGF0YSB0cmFuc2ZlcnMgYXJlCisgKiAgICAgICAgICBhbG1vc3QgYXMgZmFzdCB3aGlsZSBiZWluZyBtdWNoIGVhc2llciB0byBkZWZpbmUsIHRyYWNrLAorICogICAgICAgICAgYW5kIGRlYnVnLgorICoKKyAqCisgKiBUT0RPOgorICogICAgICAgbW9yZSBzcGVlZC4gbGlua2VkIGNvbW1hbmRzLgorICoKKyAqCisgKiBQZW9wbGUgd2l0aCBidWcgcmVwb3J0cywgd2lzaC1saXN0cywgY29tcGxhaW50cywgY29tbWVudHMsCisgKiBvciBpbXByb3ZlbWVudHMgYXJlIGFza2VkIHRvIHBhaC1sZWVleiBlbWFpbCBtZSAoSm9obiBTaGlmZmxldHQpCisgKiBhdCBqb2huQGdlb2xvZy5jb20gb3IganNoaWZmbGVAbmV0Y29tLmNvbSEgSSdtIGFueGlvdXMgdG8gZ2V0CisgKiB0aGlzIHRoaW5nIGludG8gYXMgZ29vZCBhIHNoYXBlIGFzIHBvc3NpYmxlLCBhbmQgSSdtIHBvc2l0aXZlCisgKiB0aGVyZSBhcmUgbG90cyBvZiBsdXJraW5nIGJ1Z3MgYW5kICJTdHVwaWQgUGxhY2VzIi4KKyAqCisgKiBVcGRhdGVzOgorICoKKyAqIEFkZGVkIHN1cHBvcnQgZm9yIHByZSAtQSBjaGlwcywgd2hpY2ggZG9uJ3QgaGF2ZSBhZHZhbmNlZCBmZWF0dXJlcworICogYW5kIHdpbGwgZ2VuZXJhdGUgQ1NSX1JFU0VMIHJhdGhlciB0aGFuIENTUl9SRVNFTF9BTS4KKyAqCVJpY2hhcmQgSGlyc3QgPHJpY2hhcmRAc2xlZXBpZS5kZW1vbi5jby51az4gIEF1Z3VzdCAyMDAwCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2luY2x1ZGUgIndkMzNjOTMuaCIKKworCisjZGVmaW5lIFdEMzNDOTNfVkVSU0lPTiAgICAiMS4yNiIKKyNkZWZpbmUgV0QzM0M5M19EQVRFICAgICAgICIyMi9GZWIvMjAwMyIKKworTU9EVUxFX0FVVEhPUigiSm9obiBTaGlmZmxldHQiKTsKK01PRFVMRV9ERVNDUklQVElPTigiR2VuZXJpYyBXRDMzQzkzIFNDU0kgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qCisgKiAnc2V0dXBfc3RyaW5ncycgaXMgYSBzaW5nbGUgc3RyaW5nIHVzZWQgdG8gcGFzcyBvcGVyYXRpbmcgcGFyYW1ldGVycyBhbmQKKyAqIHNldHRpbmdzIGZyb20gdGhlIGtlcm5lbC9tb2R1bGUgY29tbWFuZC1saW5lIHRvIHRoZSBkcml2ZXIuICdzZXR1cF9hcmdzW10nCisgKiBpcyBhbiBhcnJheSBvZiBzdHJpbmdzIHRoYXQgZGVmaW5lIHRoZSBjb21waWxlLXRpbWUgZGVmYXVsdCB2YWx1ZXMgZm9yCisgKiB0aGVzZSBzZXR0aW5ncy4gSWYgTGludXggYm9vdHMgd2l0aCBhbiBhbWlib290IG9yIGluc21vZCBjb21tYW5kLWxpbmUsCisgKiB0aG9zZSBzZXR0aW5ncyBhcmUgY29tYmluZWQgd2l0aCAnc2V0dXBfYXJnc1tdJy4gTm90ZSB0aGF0IGFtaWJvb3QKKyAqIGNvbW1hbmQtbGluZXMgYXJlIHByZWZpeGVkIHdpdGggIndkMzNjOTM9IiB3aGlsZSBpbnNtb2QgdXNlcyBhCisgKiAic2V0dXBfc3RyaW5ncz0iIHByZWZpeC4gVGhlIGRyaXZlciByZWNvZ25pemVzIHRoZSBmb2xsb3dpbmcga2V5d29yZHMKKyAqIChsb3dlciBjYXNlIHJlcXVpcmVkKSBhbmQgYXJndW1lbnRzOgorICoKKyAqIC0gIG5vc3luYzpiaXRtYXNrIC1iaXRtYXNrIGlzIGEgYnl0ZSB3aGVyZSB0aGUgMXN0IDcgYml0cyBjb3JyZXNwb25kIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgICB0aGUgNyBwb3NzaWJsZSBTQ1NJIGRldmljZXMuIFNldCBhIGJpdCB0byBuZWdvdGlhdGUgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgYXN5bmNocm9ub3VzIHRyYW5zZmVycyBvbiB0aGF0IGRldmljZS4gVG8gbWFpbnRhaW4KKyAqICAgICAgICAgICAgICAgICAgICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYSBjb21tYW5kLWxpbmUgc3VjaCBhcworICogICAgICAgICAgICAgICAgICAgICJ3ZDMzYzkzPTI1NSIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZWQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAid2QzM2M5Mz1ub3N5bmM6MHhmZiIuCisgKiAtICBub2RtYTp4ICAgICAgICAteCA9IDEgdG8gZGlzYWJsZSBETUEsIHggPSAwIHRvIGVuYWJsZSBpdC4gQXJndW1lbnQgaXMKKyAqICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCAtIGlmIG5vdCBwcmVzZW50LCBzYW1lIGFzICJub2RtYToxIi4KKyAqIC0gIHBlcmlvZDpucyAgICAgIC1ucyBpcyB0aGUgbWluaW11bSAjIG9mIG5hbm9zZWNvbmRzIGluIGEgU0NTSSBkYXRhIHRyYW5zZmVyCisgKiAgICAgICAgICAgICAgICAgICAgcGVyaW9kLiBEZWZhdWx0IGlzIDUwMDsgYWNjZXB0YWJsZSB2YWx1ZXMgYXJlIDI1MCAtIDEwMDAuCisgKiAtICBkaXNjb25uZWN0OnggICAteCA9IDAgdG8gbmV2ZXIgYWxsb3cgZGlzY29ubmVjdHMsIDIgdG8gYWx3YXlzIGFsbG93IHRoZW0uCisgKiAgICAgICAgICAgICAgICAgICAgeCA9IDEgZG9lcyAnYWRhcHRpdmUnIGRpc2Nvbm5lY3RzLCB3aGljaCBpcyB0aGUgZGVmYXVsdAorICogICAgICAgICAgICAgICAgICAgIGFuZCBnZW5lcmFsbHkgdGhlIGJlc3QgY2hvaWNlLgorICogLSAgZGVidWc6eCAgICAgICAgLUlmICdERUJVR0dJTkdfT04nIGlzIGRlZmluZWQsIHggaXMgYSBiaXQgbWFzayB0aGF0IGNhdXNlcworICogICAgICAgICAgICAgICAgICAgIHZhcmlvdXMgdHlwZXMgb2YgZGVidWcgb3V0cHV0IHRvIHByaW50ZWQgLSBzZWUgdGhlIERCX3h4eAorICogICAgICAgICAgICAgICAgICAgIGRlZmluZXMgaW4gd2QzM2M5My5oCisgKiAtICBjbG9jazp4ICAgICAgICAteCA9IGNsb2NrIGlucHV0IGluIE1IeiBmb3IgV0QzM2M5MyBjaGlwLiBOb3JtYWwgdmFsdWVzCisgKiAgICAgICAgICAgICAgICAgICAgd291bGQgYmUgZnJvbSA4IHRocm91Z2ggMjAuIERlZmF1bHQgaXMgOC4KKyAqIC0gIG5leHQgICAgICAgICAgIC1ObyBhcmd1bWVudC4gVXNlZCB0byBzZXBhcmF0ZSBibG9ja3Mgb2Yga2V5d29yZHMgd2hlbgorICogICAgICAgICAgICAgICAgICAgIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSBob3N0IGFkYXB0ZXIgaW4gdGhlIHN5c3RlbS4KKyAqCisgKiBTeW50YXggTm90ZXM6CisgKiAtICBOdW1lcmljIGFyZ3VtZW50cyBjYW4gYmUgZGVjaW1hbCBvciB0aGUgJzB4JyBmb3JtIG9mIGhleCBub3RhdGlvbi4gVGhlcmUKKyAqICAgIF9tdXN0XyBiZSBhIGNvbG9uIGJldHdlZW4gYSBrZXl3b3JkIGFuZCBpdHMgbnVtZXJpYyBhcmd1bWVudCwgd2l0aCBubworICogICAgc3BhY2VzLgorICogLSAgS2V5d29yZHMgYXJlIHNlcGFyYXRlZCBieSBjb21tYXMsIG5vIHNwYWNlcywgaW4gdGhlIHN0YW5kYXJkIGtlcm5lbAorICogICAgY29tbWFuZC1saW5lIG1hbm5lci4KKyAqIC0gIEEga2V5d29yZCBpbiB0aGUgJ250aCcgY29tbWEtc2VwYXJhdGVkIGNvbW1hbmQtbGluZSBtZW1iZXIgd2lsbCBvdmVyd3JpdGUKKyAqICAgIHRoZSAnbnRoJyBlbGVtZW50IG9mIHNldHVwX2FyZ3NbXS4gQSBibGFuayBjb21tYW5kLWxpbmUgbWVtYmVyIChpbgorICogICAgb3RoZXIgd29yZHMsIGEgY29tbWEgd2l0aCBubyBwcmVjZWRpbmcga2V5d29yZCkgd2lsbCBfbm90XyBvdmVyd3JpdGUKKyAqICAgIHRoZSBjb3JyZXNwb25kaW5nIHNldHVwX2FyZ3NbXSBlbGVtZW50LgorICogLSAgSWYgYSBrZXl3b3JkIGlzIHVzZWQgbW9yZSB0aGFuIG9uY2UsIHRoZSBmaXJzdCBvbmUgYXBwbGllcyB0byB0aGUgZmlyc3QKKyAqICAgIFNDU0kgaG9zdCBmb3VuZCwgdGhlIHNlY29uZCB0byB0aGUgc2Vjb25kIGNhcmQsIGV0YywgdW5sZXNzIHRoZSAnbmV4dCcKKyAqICAgIGtleXdvcmQgaXMgdXNlZCB0byBjaGFuZ2UgdGhlIG9yZGVyLgorICoKKyAqIFNvbWUgYW1pYm9vdCBleGFtcGxlcyAoZm9yIGluc21vZCwgdXNlICdzZXR1cF9zdHJpbmdzJyBpbnN0ZWFkIG9mICd3ZDMzYzkzJyk6CisgKiAtICB3ZDMzYzkzPW5vc3luYzoyNTUKKyAqIC0gIHdkMzNjOTM9bm9kbWEKKyAqIC0gIHdkMzNjOTM9bm9kbWE6MQorICogLSAgd2QzM2M5Mz1kaXNjb25uZWN0OjIsbm9zeW5jOjB4MDgscGVyaW9kOjI1MAorICogLSAgd2QzM2M5Mz1kZWJ1ZzoweDFjCisgKi8KKworLyogTm9ybWFsbHksIG5vIGRlZmF1bHRzIGFyZSBzcGVjaWZpZWQgKi8KK3N0YXRpYyBjaGFyICpzZXR1cF9hcmdzW10gPSB7ICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIgfTsKKworc3RhdGljIGNoYXIgKnNldHVwX3N0cmluZ3M7Cittb2R1bGVfcGFyYW0oc2V0dXBfc3RyaW5ncywgY2hhcnAsIDApOworCitzdGF0aWMgdm9pZCB3ZDMzYzkzX2V4ZWN1dGUoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpOworCisjaWZkZWYgQ09ORklHX1dEMzNDOTNfUElPCitzdGF0aWMgaW5saW5lIHVjaGFyCityZWFkX3dkMzNjOTMoY29uc3Qgd2QzM2M5M19yZWdzIHJlZ3MsIHVjaGFyIHJlZ19udW0pCit7CisJdWNoYXIgZGF0YTsKKworCW91dGIocmVnX251bSwgcmVncy5TQVNSKTsKKwlkYXRhID0gaW5iKHJlZ3MuU0NNRCk7CisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworcmVhZF93ZDMzYzkzX2NvdW50KGNvbnN0IHdkMzNjOTNfcmVncyByZWdzKQoreworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwlvdXRiKFdEX1RSQU5TRkVSX0NPVU5UX01TQiwgcmVncy5TQVNSKTsKKwl2YWx1ZSA9IGluYihyZWdzLlNDTUQpIDw8IDE2OworCXZhbHVlIHw9IGluYihyZWdzLlNDTUQpIDw8IDg7CisJdmFsdWUgfD0gaW5iKHJlZ3MuU0NNRCk7CisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgaW5saW5lIHVjaGFyCityZWFkX2F1eF9zdGF0KGNvbnN0IHdkMzNjOTNfcmVncyByZWdzKQoreworCXJldHVybiBpbmIocmVncy5TQVNSKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit3cml0ZV93ZDMzYzkzKGNvbnN0IHdkMzNjOTNfcmVncyByZWdzLCB1Y2hhciByZWdfbnVtLCB1Y2hhciB2YWx1ZSkKK3sKKyAgICAgIG91dGIocmVnX251bSwgcmVncy5TQVNSKTsKKyAgICAgIG91dGIodmFsdWUsIHJlZ3MuU0NNRCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAord3JpdGVfd2QzM2M5M19jb3VudChjb25zdCB3ZDMzYzkzX3JlZ3MgcmVncywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKwlvdXRiKFdEX1RSQU5TRkVSX0NPVU5UX01TQiwgcmVncy5TQVNSKTsKKwlvdXRiKCh2YWx1ZSA+PiAxNikgJiAweGZmLCByZWdzLlNDTUQpOworCW91dGIoKHZhbHVlID4+IDgpICYgMHhmZiwgcmVncy5TQ01EKTsKKwlvdXRiKCB2YWx1ZSAmIDB4ZmYsIHJlZ3MuU0NNRCk7Cit9CisKKyNkZWZpbmUgd3JpdGVfd2QzM2M5M19jbWQocmVncywgY21kKSBcCisJd3JpdGVfd2QzM2M5MygocmVncyksIFdEX0NPTU1BTkQsIChjbWQpKQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3dyaXRlX3dkMzNjOTNfY2RiKGNvbnN0IHdkMzNjOTNfcmVncyByZWdzLCB1aW50IGxlbiwgdWNoYXIgY21uZFtdKQoreworCWludCBpOworCisJb3V0YihXRF9DREJfMSwgcmVncy5TQVNSKTsKKwlmb3IgKGk9MDsgaTxsZW47IGkrKykKKwkJb3V0YihjbW5kW2ldLCByZWdzLlNDTUQpOworfQorCisjZWxzZSAvKiBDT05GSUdfV0QzM0M5M19QSU8gKi8KK3N0YXRpYyBpbmxpbmUgdWNoYXIKK3JlYWRfd2QzM2M5Myhjb25zdCB3ZDMzYzkzX3JlZ3MgcmVncywgdWNoYXIgcmVnX251bSkKK3sKKwkqcmVncy5TQVNSID0gcmVnX251bTsKKwltYigpOworCXJldHVybiAoKnJlZ3MuU0NNRCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCityZWFkX3dkMzNjOTNfY291bnQoY29uc3Qgd2QzM2M5M19yZWdzIHJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworCSpyZWdzLlNBU1IgPSBXRF9UUkFOU0ZFUl9DT1VOVF9NU0I7CisJbWIoKTsKKwl2YWx1ZSA9ICpyZWdzLlNDTUQgPDwgMTY7CisJdmFsdWUgfD0gKnJlZ3MuU0NNRCA8PCA4OworCXZhbHVlIHw9ICpyZWdzLlNDTUQ7CisJbWIoKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWNoYXIKK3JlYWRfYXV4X3N0YXQoY29uc3Qgd2QzM2M5M19yZWdzIHJlZ3MpCit7CisJcmV0dXJuICpyZWdzLlNBU1I7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAord3JpdGVfd2QzM2M5Myhjb25zdCB3ZDMzYzkzX3JlZ3MgcmVncywgdWNoYXIgcmVnX251bSwgdWNoYXIgdmFsdWUpCit7CisJKnJlZ3MuU0FTUiA9IHJlZ19udW07CisJbWIoKTsKKwkqcmVncy5TQ01EID0gdmFsdWU7CisJbWIoKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX3dkMzNjOTNfY291bnQoY29uc3Qgd2QzM2M5M19yZWdzIHJlZ3MsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisJKnJlZ3MuU0FTUiA9IFdEX1RSQU5TRkVSX0NPVU5UX01TQjsKKwltYigpOworCSpyZWdzLlNDTUQgPSB2YWx1ZSA+PiAxNjsKKwkqcmVncy5TQ01EID0gdmFsdWUgPj4gODsKKwkqcmVncy5TQ01EID0gdmFsdWU7CisJbWIoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit3cml0ZV93ZDMzYzkzX2NtZChjb25zdCB3ZDMzYzkzX3JlZ3MgcmVncywgdWNoYXIgY21kKQoreworCSpyZWdzLlNBU1IgPSBXRF9DT01NQU5EOworCW1iKCk7CisJKnJlZ3MuU0NNRCA9IGNtZDsKKwltYigpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3dyaXRlX3dkMzNjOTNfY2RiKGNvbnN0IHdkMzNjOTNfcmVncyByZWdzLCB1aW50IGxlbiwgdWNoYXIgY21uZFtdKQoreworCWludCBpOworCisJKnJlZ3MuU0FTUiA9IFdEX0NEQl8xOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJKnJlZ3MuU0NNRCA9IGNtbmRbaV07Cit9CisjZW5kaWYgLyogQ09ORklHX1dEMzNDOTNfUElPICovCisKK3N0YXRpYyBpbmxpbmUgdWNoYXIKK3JlYWRfMV9ieXRlKGNvbnN0IHdkMzNjOTNfcmVncyByZWdzKQoreworCXVjaGFyIGFzcjsKKwl1Y2hhciB4ID0gMDsKKworCXdyaXRlX3dkMzNjOTMocmVncywgV0RfQ09OVFJPTCwgQ1RSTF9JREkgfCBDVFJMX0VESSB8IENUUkxfUE9MTEVEKTsKKwl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBXRF9DTURfVFJBTlNfSU5GTyB8IDB4ODApOworCWRvIHsKKwkJYXNyID0gcmVhZF9hdXhfc3RhdChyZWdzKTsKKwkJaWYgKGFzciAmIEFTUl9EQlIpCisJCQl4ID0gcmVhZF93ZDMzYzkzKHJlZ3MsIFdEX0RBVEEpOworCX0gd2hpbGUgKCEoYXNyICYgQVNSX0lOVCkpOworCXJldHVybiB4OworfQorCitzdGF0aWMgc3RydWN0IHN4X3BlcmlvZCBzeF90YWJsZVtdID0geworCXsxLCAweDIwfSwKKwl7MjUyLCAweDIwfSwKKwl7Mzc2LCAweDMwfSwKKwl7NTAwLCAweDQwfSwKKwl7NjI0LCAweDUwfSwKKwl7NzUyLCAweDYwfSwKKwl7ODc2LCAweDcwfSwKKwl7MTAwMCwgMHgwMH0sCisJezAsIDB9Cit9OworCitzdGF0aWMgaW50Cityb3VuZF9wZXJpb2QodW5zaWduZWQgaW50IHBlcmlvZCkKK3sKKwlpbnQgeDsKKworCWZvciAoeCA9IDE7IHN4X3RhYmxlW3hdLnBlcmlvZF9uczsgeCsrKSB7CisJCWlmICgocGVyaW9kIDw9IHN4X3RhYmxlW3ggLSAwXS5wZXJpb2RfbnMpICYmCisJCSAgICAocGVyaW9kID4gc3hfdGFibGVbeCAtIDFdLnBlcmlvZF9ucykpIHsKKwkJCXJldHVybiB4OworCQl9CisJfQorCXJldHVybiA3OworfQorCitzdGF0aWMgdWNoYXIKK2NhbGNfc3luY194ZmVyKHVuc2lnbmVkIGludCBwZXJpb2QsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJdWNoYXIgcmVzdWx0OworCisJcGVyaW9kICo9IDQ7CQkvKiBjb252ZXJ0IFNEVFIgY29kZSB0byBucyAqLworCXJlc3VsdCA9IHN4X3RhYmxlW3JvdW5kX3BlcmlvZChwZXJpb2QpXS5yZWdfdmFsdWU7CisJcmVzdWx0IHw9IChvZmZzZXQgPCBPUFRJTVVNX1NYX09GRikgPyBvZmZzZXQgOiBPUFRJTVVNX1NYX09GRjsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQKK3dkMzNjOTNfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEgKmhvc3RkYXRhOworCXN0cnVjdCBzY3NpX2NtbmQgKnRtcDsKKworCWhvc3RkYXRhID0gKHN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhICopIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCURCKERCX1FVRVVFX0NPTU1BTkQsCisJICAgcHJpbnRrKCJRLSVkLSUwMngtJWxkKCAiLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+Y21uZFswXSwgY21kLT5waWQpKQorCisvKiBTZXQgdXAgYSBmZXcgZmllbGRzIGluIHRoZSBzY3NpX2NtbmQgc3RydWN0dXJlIGZvciBvdXIgb3duIHVzZToKKyAqICAtIGhvc3Rfc2NyaWJibGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIG5leHQgY21kIGluIHRoZSBpbnB1dCBxdWV1ZQorICogIC0gc2NzaV9kb25lIHBvaW50cyB0byB0aGUgcm91dGluZSB3ZSBjYWxsIHdoZW4gYSBjbWQgaXMgZmluaXNoZWQKKyAqICAtIHJlc3VsdCBpcyB3aGF0IHlvdSdkIGV4cGVjdAorICovCisJY21kLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwljbWQtPnNjc2lfZG9uZSA9IGRvbmU7CisJY21kLT5yZXN1bHQgPSAwOworCisvKiBXZSB1c2UgdGhlIFNjc2lfUG9pbnRlciBzdHJ1Y3R1cmUgdGhhdCdzIGluY2x1ZGVkIHdpdGggZWFjaCBjb21tYW5kCisgKiBhcyBhIHNjcmF0Y2hwYWQgKGFzIGl0J3MgaW50ZW5kZWQgdG8gYmUgdXNlZCEpLiBUaGUgaGFuZHkgdGhpbmcgYWJvdXQKKyAqIHRoZSBTQ3AueHh4IGZpZWxkcyBpcyB0aGF0IHRoZXkncmUgYWx3YXlzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuCisgKiBjbWQsIGFuZCBhcmUgcHJlc2VydmVkIGFjcm9zcyBkaXNjb25uZWN0LXJlc2VsZWN0LiBUaGlzIG1lYW5zIHdlCisgKiBjYW4gcHJldHR5IG11Y2ggaWdub3JlIFNBVkVfUE9JTlRFUlMgYW5kIFJFU1RPUkVfUE9JTlRFUlMgbWVzc2FnZXMKKyAqIGlmIHdlIGtlZXAgYWxsIHRoZSBjcml0aWNhbCBwb2ludGVycyBhbmQgY291bnRlcnMgaW4gU0NwOgorICogIC0gU0NwLnB0ciBpcyB0aGUgcG9pbnRlciBpbnRvIHRoZSBSQU0gYnVmZmVyCisgKiAgLSBTQ3AudGhpc19yZXNpZHVhbCBpcyB0aGUgc2l6ZSBvZiB0aGF0IGJ1ZmZlcgorICogIC0gU0NwLmJ1ZmZlciBwb2ludHMgdG8gdGhlIGN1cnJlbnQgc2NhdHRlci1nYXRoZXIgYnVmZmVyCisgKiAgLSBTQ3AuYnVmZmVyc19yZXNpZHVhbCB0ZWxscyB1cyBob3cgbWFueSBTLkcuIGJ1ZmZlcnMgdGhlcmUgYXJlCisgKiAgLSBTQ3AuaGF2ZV9kYXRhX2luIGlzIG5vdCB1c2VkCisgKiAgLSBTQ3Auc2VudF9jb21tYW5kIGlzIG5vdCB1c2VkCisgKiAgLSBTQ3AucGhhc2UgcmVjb3JkcyB0aGlzIGNvbW1hbmQncyBTUkNJRF9FUiBiaXQgc2V0dGluZworICovCisKKwlpZiAoY21kLT51c2Vfc2cpIHsKKwkJY21kLT5TQ3AuYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBjbWQtPmJ1ZmZlcjsKKwkJY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IGNtZC0+dXNlX3NnIC0gMTsKKwkJY21kLT5TQ3AucHRyID0gcGFnZV9hZGRyZXNzKGNtZC0+U0NwLmJ1ZmZlci0+cGFnZSkgKworCQkgICAgY21kLT5TQ3AuYnVmZmVyLT5vZmZzZXQ7CisJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBjbWQtPlNDcC5idWZmZXItPmxlbmd0aDsKKwl9IGVsc2UgeworCQljbWQtPlNDcC5idWZmZXIgPSBOVUxMOworCQljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gMDsKKwkJY21kLT5TQ3AucHRyID0gKGNoYXIgKikgY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCX0KKworLyogV0QgZG9jcyBzdGF0ZSB0aGF0IGF0IHRoZSBjb25jbHVzaW9uIG9mIGEgIkxFVkVMMiIgY29tbWFuZCwgdGhlCisgKiBzdGF0dXMgYnl0ZSBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIExVTiByZWdpc3Rlci4gQXBwYXJlbnRseSwKKyAqIHRoaXMgaXMgdGhlIGNhc2Ugb25seSBmb3IgKnVuaW50ZXJydXB0ZWQqIExFVkVMMiBjb21tYW5kcyEgSWYKKyAqIHRoZXJlIGFyZSBhbnkgdW5leHBlY3RlZCBwaGFzZXMgZW50ZXJlZCwgZXZlbiBpZiB0aGV5IGFyZSAxMDAlCisgKiBsZWdhbCAoZGlmZmVyZW50IGRldmljZXMgbWF5IGNob29zZSB0byBkbyB0aGluZ3MgZGlmZmVyZW50bHkpLAorICogdGhlIExFVkVMMiBjb21tYW5kIHNlcXVlbmNlIGlzIGV4aXRlZC4gVGhpcyBvZnRlbiBvY2N1cnMgcHJpb3IKKyAqIHRvIHJlY2VpdmluZyB0aGUgc3RhdHVzIGJ5dGUsIGluIHdoaWNoIGNhc2UgdGhlIGRyaXZlciBkb2VzIGEKKyAqIHN0YXR1cyBwaGFzZSBpbnRlcnJ1cHQgYW5kIGdldHMgdGhlIHN0YXR1cyBieXRlIG9uIGl0cyBvd24uCisgKiBXaGlsZSBzdWNoIGEgY29tbWFuZCBjYW4gdGhlbiBiZSAicmVzdW1lZCIgKGllIHJlc3RhcnRlZCB0bworICogZmluaXNoIHVwIGFzIGEgTEVWRUwyIGNvbW1hbmQpLCB0aGUgTFVOIHJlZ2lzdGVyIHdpbGwgTk9UIGJlCisgKiBhIHZhbGlkIHN0YXR1cyBieXRlIGF0IHRoZSBjb21tYW5kJ3MgY29uY2x1c2lvbiwgYW5kIHdlIG11c3QKKyAqIHVzZSB0aGUgYnl0ZSBvYnRhaW5lZCBkdXJpbmcgdGhlIGVhcmxpZXIgaW50ZXJydXB0LiBIZXJlLCB3ZQorICogcHJlc2V0IFNDcC5TdGF0dXMgdG8gYW4gaWxsZWdhbCB2YWx1ZSAoMHhmZikgc28gdGhhdCB3aGVuCisgKiB0aGlzIGNvbW1hbmQgZmluYWxseSBjb21wbGV0ZXMsIHdlIGNhbiB0ZWxsIHdoZXJlIHRoZSBhY3R1YWwKKyAqIHN0YXR1cyBieXRlIGlzIHN0b3JlZC4KKyAqLworCisJY21kLT5TQ3AuU3RhdHVzID0gSUxMRUdBTF9TVEFUVVNfQllURTsKKworCS8qCisJICogQWRkIHRoZSBjbWQgdG8gdGhlIGVuZCBvZiAnaW5wdXRfUScuIE5vdGUgdGhhdCBSRVFVRVNUIFNFTlNFCisJICogY29tbWFuZHMgYXJlIGFkZGVkIHRvIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBzbyB0aGF0IHRoZSBkZXNpcmVkCisJICogc2Vuc2UgZGF0YSBpcyBub3QgbG9zdCBiZWZvcmUgUkVRVUVTVF9TRU5TRSBleGVjdXRlcy4KKwkgKi8KKworCXNwaW5fbG9ja19pcnEoJmhvc3RkYXRhLT5sb2NrKTsKKworCWlmICghKGhvc3RkYXRhLT5pbnB1dF9RKSB8fCAoY21kLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpKSB7CisJCWNtZC0+aG9zdF9zY3JpYmJsZSA9ICh1Y2hhciAqKSBob3N0ZGF0YS0+aW5wdXRfUTsKKwkJaG9zdGRhdGEtPmlucHV0X1EgPSBjbWQ7CisJfSBlbHNlIHsJCS8qIGZpbmQgdGhlIGVuZCBvZiB0aGUgcXVldWUgKi8KKwkJZm9yICh0bXAgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBob3N0ZGF0YS0+aW5wdXRfUTsKKwkJICAgICB0bXAtPmhvc3Rfc2NyaWJibGU7CisJCSAgICAgdG1wID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgdG1wLT5ob3N0X3NjcmliYmxlKSA7CisJCXRtcC0+aG9zdF9zY3JpYmJsZSA9ICh1Y2hhciAqKSBjbWQ7CisJfQorCisvKiBXZSBrbm93IHRoYXQgdGhlcmUncyBhdCBsZWFzdCBvbmUgY29tbWFuZCBpbiAnaW5wdXRfUScgbm93LgorICogR28gc2VlIGlmIGFueSBvZiB0aGVtIGFyZSBydW5uYWJsZSEKKyAqLworCisJd2QzM2M5M19leGVjdXRlKGNtZC0+ZGV2aWNlLT5ob3N0KTsKKworCURCKERCX1FVRVVFX0NPTU1BTkQsIHByaW50aygiKVEtJWxkICIsIGNtZC0+cGlkKSkKKworCXNwaW5fdW5sb2NrX2lycSgmaG9zdGRhdGEtPmxvY2spOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGF0dGVtcHRzIHRvIHN0YXJ0IGEgc2NzaSBjb21tYW5kLiBJZiB0aGUgaG9zdF9jYXJkIGlzCisgKiBhbHJlYWR5IGNvbm5lY3RlZCwgd2UgZ2l2ZSB1cCBpbW1lZGlhdGVseS4gT3RoZXJ3aXNlLCBsb29rIHRocm91Z2gKKyAqIHRoZSBpbnB1dF9RLCB1c2luZyB0aGUgZmlyc3QgY29tbWFuZCB3ZSBmaW5kIHRoYXQncyBpbnRlbmRlZAorICogZm9yIGEgY3VycmVudGx5IG5vbi1idXN5IHRhcmdldC9sdW4uCisgKgorICogd2QzM2M5M19leGVjdXRlKCkgaXMgYWx3YXlzIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgb3IgZnJvbQorICogdGhlIHdkMzNjOTNfaW50ciBpdHNlbGYsIHdoaWNoIG1lYW5zIHRoYXQgYSB3ZDMzYzkzIGludGVycnVwdAorICogY2Fubm90IG9jY3VyIHdoaWxlIHdlIGFyZSBpbiBoZXJlLgorICovCitzdGF0aWMgdm9pZAord2QzM2M5M19leGVjdXRlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworCXN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhICpob3N0ZGF0YSA9CisJICAgIChzdHJ1Y3QgV0QzM0M5M19ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisJY29uc3Qgd2QzM2M5M19yZWdzIHJlZ3MgPSBob3N0ZGF0YS0+cmVnczsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsICpwcmV2OworCisJREIoREJfRVhFQ1VURSwgcHJpbnRrKCJFWCgiKSkKKwlpZiAoaG9zdGRhdGEtPnNlbGVjdGluZyB8fCBob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJCURCKERCX0VYRUNVVEUsIHByaW50aygiKUVYLTAgIikpCisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFNlYXJjaCB0aHJvdWdoIHRoZSBpbnB1dF9RIGZvciBhIGNvbW1hbmQgZGVzdGluZWQKKwkgKiBmb3IgYW4gaWRsZSB0YXJnZXQvbHVuLgorCSAqLworCisJY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaG9zdGRhdGEtPmlucHV0X1E7CisJcHJldiA9IDA7CisJd2hpbGUgKGNtZCkgeworCQlpZiAoIShob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICYgKDEgPDwgY21kLT5kZXZpY2UtPmx1bikpKQorCQkJYnJlYWs7CisJCXByZXYgPSBjbWQ7CisJCWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNtZC0+aG9zdF9zY3JpYmJsZTsKKwl9CisKKwkvKiBxdWl0IGlmIHF1ZXVlIGVtcHR5IG9yIGFsbCBwb3NzaWJsZSB0YXJnZXRzIGFyZSBidXN5ICovCisKKwlpZiAoIWNtZCkgeworCQlEQihEQl9FWEVDVVRFLCBwcmludGsoIilFWC0xICIpKQorCQlyZXR1cm47CisJfQorCisJLyogIHJlbW92ZSBjb21tYW5kIGZyb20gcXVldWUgKi8KKworCWlmIChwcmV2KQorCQlwcmV2LT5ob3N0X3NjcmliYmxlID0gY21kLT5ob3N0X3NjcmliYmxlOworCWVsc2UKKwkJaG9zdGRhdGEtPmlucHV0X1EgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGU7CisKKyNpZmRlZiBQUk9DX1NUQVRJU1RJQ1MKKwlob3N0ZGF0YS0+Y21kX2NudFtjbWQtPmRldmljZS0+aWRdKys7CisjZW5kaWYKKworCS8qCisJICogU3RhcnQgdGhlIHNlbGVjdGlvbiBwcm9jZXNzCisJICovCisKKwlpZiAoY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKQorCQl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX0RFU1RJTkFUSU9OX0lELCBjbWQtPmRldmljZS0+aWQpOworCWVsc2UKKwkJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9ERVNUSU5BVElPTl9JRCwgY21kLT5kZXZpY2UtPmlkIHwgRFNUSURfRFBEKTsKKworLyogTm93IHdlIG5lZWQgdG8gZmlndXJlIG91dCB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbW1hbmQgaXMgYSBnb29kCisgKiBjYW5kaWRhdGUgZm9yIGRpc2Nvbm5lY3QvcmVzZWxlY3QuIFdlIGd1ZXNzIHRvIHRoZSBiZXN0IG9mIG91cgorICogYWJpbGl0eSwgYmFzZWQgb24gYSBzZXQgb2YgaGllcmFyY2hpY2FsIHJ1bGVzLiBXaGVuIHNldmVyYWwKKyAqIGRldmljZXMgYXJlIG9wZXJhdGluZyBzaW11bHRhbmVvdXNseSwgZGlzY29ubmVjdHMgYXJlIHVzdWFsbHkKKyAqIGFuIGFkdmFudGFnZS4gSW4gYSBzaW5nbGUgZGV2aWNlIHN5c3RlbSwgb3IgaWYgb25seSAxIGRldmljZQorICogaXMgYmVpbmcgYWNjZXNzZWQsIHRyYW5zZmVycyB1c3VhbGx5IGdvIGZhc3RlciBpZiBkaXNjb25uZWN0cworICogYXJlIG5vdCBhbGxvd2VkOgorICoKKyAqICsgQ29tbWFuZHMgc2hvdWxkIE5FVkVSIGRpc2Nvbm5lY3QgaWYgaG9zdGRhdGEtPmRpc2Nvbm5lY3QgPQorICogICBESVNfTkVWRVIgKHRoaXMgaG9sZHMgZm9yIHRhcGUgZHJpdmVzIGFsc28pLCBhbmQgQUxXQVlTCisgKiAgIGRpc2Nvbm5lY3QgaWYgaG9zdGRhdGEtPmRpc2Nvbm5lY3QgPSBESVNfQUxXQVlTLgorICogKyBUYXBlIGRyaXZlIGNvbW1hbmRzIHNob3VsZCBhbHdheXMgYmUgYWxsb3dlZCB0byBkaXNjb25uZWN0LgorICogKyBEaXNjb25uZWN0IHNob3VsZCBiZSBhbGxvd2VkIGlmIGRpc2Nvbm5lY3RlZF9RIGlzbid0IGVtcHR5LgorICogKyBDb21tYW5kcyBzaG91bGQgTk9UIGRpc2Nvbm5lY3QgaWYgaW5wdXRfUSBpcyBlbXB0eS4KKyAqICsgRGlzY29ubmVjdCBzaG91bGQgYmUgYWxsb3dlZCBpZiB0aGVyZSBhcmUgY29tbWFuZHMgaW4gaW5wdXRfUQorICogICBmb3IgYSBkaWZmZXJlbnQgdGFyZ2V0L2x1bi4gSW4gdGhpcyBjYXNlLCB0aGUgb3RoZXIgY29tbWFuZHMKKyAqICAgc2hvdWxkIGJlIG1hZGUgZGlzY29ubmVjdC1hYmxlLCBpZiBub3QgYWxyZWFkeS4KKyAqCisgKiBJIGtub3csIEkga25vdyAtIHRoaXMgY29kZSB3b3VsZCBmbHVuayBtZSBvdXQgb2YgYW55CisgKiAiQyBQcm9ncmFtbWluZyAxMDEiIGNsYXNzIGV2ZXIgb2ZmZXJlZC4gQnV0IGl0J3MgZWFzeQorICogdG8gY2hhbmdlIGFyb3VuZCBhbmQgZXhwZXJpbWVudCB3aXRoIGZvciBub3cuCisgKi8KKworCWNtZC0+U0NwLnBoYXNlID0gMDsJLyogYXNzdW1lIG5vIGRpc2Nvbm5lY3QgKi8KKwlpZiAoaG9zdGRhdGEtPmRpc2Nvbm5lY3QgPT0gRElTX05FVkVSKQorCQlnb3RvIG5vOworCWlmIChob3N0ZGF0YS0+ZGlzY29ubmVjdCA9PSBESVNfQUxXQVlTKQorCQlnb3RvIHllczsKKwlpZiAoY21kLT5kZXZpY2UtPnR5cGUgPT0gMSkJLyogdGFwZSBkcml2ZT8gKi8KKwkJZ290byB5ZXM7CisJaWYgKGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfUSkJLyogb3RoZXIgY29tbWFuZHMgZGlzY29ubmVjdGVkPyAqLworCQlnb3RvIHllczsKKwlpZiAoIShob3N0ZGF0YS0+aW5wdXRfUSkpCS8qIGlucHV0X1EgZW1wdHk/ICovCisJCWdvdG8gbm87CisJZm9yIChwcmV2ID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaG9zdGRhdGEtPmlucHV0X1E7IHByZXY7CisJICAgICBwcmV2ID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgcHJldi0+aG9zdF9zY3JpYmJsZSkgeworCQlpZiAoKHByZXYtPmRldmljZS0+aWQgIT0gY21kLT5kZXZpY2UtPmlkKSB8fAorCQkgICAgKHByZXYtPmRldmljZS0+bHVuICE9IGNtZC0+ZGV2aWNlLT5sdW4pKSB7CisJCQlmb3IgKHByZXYgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBob3N0ZGF0YS0+aW5wdXRfUTsgcHJldjsKKwkJCSAgICAgcHJldiA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIHByZXYtPmhvc3Rfc2NyaWJibGUpCisJCQkJcHJldi0+U0NwLnBoYXNlID0gMTsKKwkJCWdvdG8geWVzOworCQl9CisJfQorCisJZ290byBubzsKKworIHllczoKKwljbWQtPlNDcC5waGFzZSA9IDE7CisKKyNpZmRlZiBQUk9DX1NUQVRJU1RJQ1MKKwlob3N0ZGF0YS0+ZGlzY19hbGxvd2VkX2NudFtjbWQtPmRldmljZS0+aWRdKys7CisjZW5kaWYKKworIG5vOgorCisJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9TT1VSQ0VfSUQsICgoY21kLT5TQ3AucGhhc2UpID8gU1JDSURfRVIgOiAwKSk7CisKKwl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX1RBUkdFVF9MVU4sIGNtZC0+ZGV2aWNlLT5sdW4pOworCXdyaXRlX3dkMzNjOTMocmVncywgV0RfU1lOQ0hST05PVVNfVFJBTlNGRVIsCisJCSAgICAgIGhvc3RkYXRhLT5zeW5jX3hmZXJbY21kLT5kZXZpY2UtPmlkXSk7CisJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSB8PSAoMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKworCWlmICgoaG9zdGRhdGEtPmxldmVsMiA9PSBMMl9OT05FKSB8fAorCSAgICAoaG9zdGRhdGEtPnN5bmNfc3RhdFtjbWQtPmRldmljZS0+aWRdID09IFNTX1VOU0VUKSkgeworCisJCS8qCisJCSAqIERvIGEgJ1NlbGVjdC1XaXRoLUFUTicgY29tbWFuZC4gVGhpcyB3aWxsIGVuZCB3aXRoCisJCSAqIG9uZSBvZiB0aGUgZm9sbG93aW5nIGludGVycnVwdHM6CisJCSAqICAgIENTUl9SRVNFTF9BTTogIGZhaWx1cmUgLSBjYW4gdHJ5IGFnYWluIGxhdGVyLgorCQkgKiAgICBDU1JfVElNRU9VVDogICBmYWlsdXJlIC0gZ2l2ZSB1cC4KKwkJICogICAgQ1NSX1NFTEVDVDogICAgc3VjY2VzcyAtIHByb2NlZWQuCisJCSAqLworCisJCWhvc3RkYXRhLT5zZWxlY3RpbmcgPSBjbWQ7CisKKy8qIEV2ZXJ5IHRhcmdldCBoYXMgaXRzIG93biBzeW5jaHJvbm91cyB0cmFuc2ZlciBzZXR0aW5nLCBrZXB0IGluIHRoZQorICogc3luY194ZmVyIGFycmF5LCBhbmQgYSBjb3JyZXNwb25kaW5nIHN0YXR1cyBieXRlIGluIHN5bmNfc3RhdFtdLgorICogRWFjaCB0YXJnZXQncyBzeW5jX3N0YXRbXSBlbnRyeSBpcyBpbml0aWFsaXplZCB0byBTWF9VTlNFVCwgYW5kIGl0cworICogc3luY194ZmVyW10gZW50cnkgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIGRlZmF1bHQvc2FmZSB2YWx1ZS4gU1NfVU5TRVQKKyAqIG1lYW5zIHRoYXQgdGhlIHBhcmFtZXRlcnMgYXJlIHVuZGV0ZXJtaW5lZCBhcyB5ZXQsIGFuZCB0aGF0IHdlCisgKiBuZWVkIHRvIHNlbmQgYW4gU0RUUiBtZXNzYWdlIHRvIHRoaXMgZGV2aWNlIGFmdGVyIHNlbGVjdGlvbiBpcworICogY29tcGxldGU6IFdlIHNldCBTU19GSVJTVCB0byB0ZWxsIHRoZSBpbnRlcnJ1cHQgcm91dGluZSB0byBkbyBzby4KKyAqIElmIHdlJ3ZlIGJlZW4gYXNrZWQgbm90IHRvIHRyeSBzeW5jaHJvbm91cyB0cmFuc2ZlcnMgb24gdGhpcworICogdGFyZ2V0IChhbmQgX2FsbF8gbHVucyB3aXRoaW4gaXQpLCB3ZSdsbCBzdGlsbCBzZW5kIHRoZSBTRFRSIG1lc3NhZ2UKKyAqIGxhdGVyLCBidXQgYXQgdGhhdCB0aW1lIHdlJ2xsIG5lZ290aWF0ZSBmb3IgYXN5bmMgYnkgc3BlY2lmeWluZyBhCisgKiBzeW5jIGZpZm8gZGVwdGggb2YgMC4KKyAqLworCQlpZiAoaG9zdGRhdGEtPnN5bmNfc3RhdFtjbWQtPmRldmljZS0+aWRdID09IFNTX1VOU0VUKQorCQkJaG9zdGRhdGEtPnN5bmNfc3RhdFtjbWQtPmRldmljZS0+aWRdID0gU1NfRklSU1Q7CisJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfU0VMRUNUSU5HOworCQl3cml0ZV93ZDMzYzkzX2NvdW50KHJlZ3MsIDApOwkvKiBndWFyYW50ZWUgYSBEQVRBX1BIQVNFIGludGVycnVwdCAqLworCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBXRF9DTURfU0VMX0FUTik7CisJfSBlbHNlIHsKKworCQkvKgorCQkgKiBEbyBhICdTZWxlY3QtV2l0aC1BVE4tWGZlcicgY29tbWFuZC4gVGhpcyB3aWxsIGVuZCB3aXRoCisJCSAqIG9uZSBvZiB0aGUgZm9sbG93aW5nIGludGVycnVwdHM6CisJCSAqICAgIENTUl9SRVNFTF9BTTogIGZhaWx1cmUgLSBjYW4gdHJ5IGFnYWluIGxhdGVyLgorCQkgKiAgICBDU1JfVElNRU9VVDogICBmYWlsdXJlIC0gZ2l2ZSB1cC4KKwkJICogICAgYW55dGhpbmcgZWxzZTogc3VjY2VzcyAtIHByb2NlZWQuCisJCSAqLworCisJCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBjbWQ7CisJCXdyaXRlX3dkMzNjOTMocmVncywgV0RfQ09NTUFORF9QSEFTRSwgMCk7CisKKwkJLyogY29weSBjb21tYW5kX2Rlc2NyaXB0b3JfYmxvY2sgaW50byBXRCBjaGlwCisJCSAqICh0YWtlIGFkdmFudGFnZSBvZiBhdXRvLWluY3JlbWVudGluZykKKwkJICovCisKKwkJd3JpdGVfd2QzM2M5M19jZGIocmVncywgY21kLT5jbWRfbGVuLCBjbWQtPmNtbmQpOworCisJCS8qIFRoZSB3ZDMzYzkzIG9ubHkga25vd3MgYWJvdXQgR3JvdXAgMCwgMSwgYW5kIDUgY29tbWFuZHMgd2hlbgorCQkgKiBpdCdzIGRvaW5nIGEgJ3NlbGVjdC1hbmQtdHJhbnNmZXInLiBUbyBiZSBzYWZlLCB3ZSB3cml0ZSB0aGUKKwkJICogc2l6ZSBvZiB0aGUgQ0RCIGludG8gdGhlIE9XTl9JRCByZWdpc3RlciBmb3IgZXZlcnkgY2FzZS4gVGhpcworCQkgKiB3YXkgdGhlcmUgd29uJ3QgYmUgcHJvYmxlbXMgd2l0aCB2ZW5kb3ItdW5pcXVlLCBhdWRpbywgZXRjLgorCQkgKi8KKworCQl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX09XTl9JRCwgY21kLT5jbWRfbGVuKTsKKworCQkvKiBXaGVuIGRvaW5nIGEgbm9uLWRpc2Nvbm5lY3QgY29tbWFuZCB3aXRoIERNQSwgd2UgY2FuIHNhdmUKKwkJICogb3Vyc2VsdmVzIGEgREFUQSBwaGFzZSBpbnRlcnJ1cHQgbGF0ZXIgYnkgc2V0dGluZyBldmVyeXRoaW5nCisJCSAqIHVwIGFoZWFkIG9mIHRpbWUuCisJCSAqLworCisJCWlmICgoY21kLT5TQ3AucGhhc2UgPT0gMCkgJiYgKGhvc3RkYXRhLT5ub19kbWEgPT0gMCkpIHsKKwkJCWlmIChob3N0ZGF0YS0+ZG1hX3NldHVwKGNtZCwKKwkJCSAgICAoY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSA/CisJCQkgICAgIERBVEFfT1VUX0RJUiA6IERBVEFfSU5fRElSKSkKKwkJCQl3cml0ZV93ZDMzYzkzX2NvdW50KHJlZ3MsIDApOwkvKiBndWFyYW50ZWUgYSBEQVRBX1BIQVNFIGludGVycnVwdCAqLworCQkJZWxzZSB7CisJCQkJd3JpdGVfd2QzM2M5M19jb3VudChyZWdzLAorCQkJCQkJICAgIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworCQkJCXdyaXRlX3dkMzNjOTMocmVncywgV0RfQ09OVFJPTCwKKwkJCQkJICAgICAgQ1RSTF9JREkgfCBDVFJMX0VESSB8IENUUkxfRE1BKTsKKwkJCQlob3N0ZGF0YS0+ZG1hID0gRF9ETUFfUlVOTklORzsKKwkJCX0KKwkJfSBlbHNlCisJCQl3cml0ZV93ZDMzYzkzX2NvdW50KHJlZ3MsIDApOwkvKiBndWFyYW50ZWUgYSBEQVRBX1BIQVNFIGludGVycnVwdCAqLworCisJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfUlVOTklOR19MRVZFTDI7CisJCXdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsIFdEX0NNRF9TRUxfQVROX1hGRVIpOworCX0KKworCS8qCisJICogU2luY2UgdGhlIFNDU0kgYnVzIGNhbiBoYW5kbGUgb25seSAxIGNvbm5lY3Rpb24gYXQgYSB0aW1lLAorCSAqIHdlIGdldCBvdXQgb2YgaGVyZSBub3cuIElmIHRoZSBzZWxlY3Rpb24gZmFpbHMsIG9yIHdoZW4KKwkgKiB0aGUgY29tbWFuZCBkaXNjb25uZWN0cywgd2UnbGwgY29tZSBiYWNrIHRvIHRoaXMgcm91dGluZQorCSAqIHRvIHNlYXJjaCB0aGUgaW5wdXRfUSBhZ2Fpbi4uLgorCSAqLworCisJREIoREJfRVhFQ1VURSwKKwkgICBwcmludGsoIiVzJWxkKUVYLTIgIiwgKGNtZC0+U0NwLnBoYXNlKSA/ICJkOiIgOiAiIiwgY21kLT5waWQpKQorfQorCitzdGF0aWMgdm9pZAordHJhbnNmZXJfcGlvKGNvbnN0IHdkMzNjOTNfcmVncyByZWdzLCB1Y2hhciAqIGJ1ZiwgaW50IGNudCwKKwkgICAgIGludCBkYXRhX2luX2Rpciwgc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEgKmhvc3RkYXRhKQoreworCXVjaGFyIGFzcjsKKworCURCKERCX1RSQU5TRkVSLAorCSAgIHByaW50aygiKCVwLCVkLCVzOiIsIGJ1ZiwgY250LCBkYXRhX2luX2RpciA/ICJpbiIgOiAib3V0IikpCisKKwl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX0NPTlRST0wsIENUUkxfSURJIHwgQ1RSTF9FREkgfCBDVFJMX1BPTExFRCk7CisJd3JpdGVfd2QzM2M5M19jb3VudChyZWdzLCBjbnQpOworCXdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsIFdEX0NNRF9UUkFOU19JTkZPKTsKKwlpZiAoZGF0YV9pbl9kaXIpIHsKKwkJZG8geworCQkJYXNyID0gcmVhZF9hdXhfc3RhdChyZWdzKTsKKwkJCWlmIChhc3IgJiBBU1JfREJSKQorCQkJCSpidWYrKyA9IHJlYWRfd2QzM2M5MyhyZWdzLCBXRF9EQVRBKTsKKwkJfSB3aGlsZSAoIShhc3IgJiBBU1JfSU5UKSk7CisJfSBlbHNlIHsKKwkJZG8geworCQkJYXNyID0gcmVhZF9hdXhfc3RhdChyZWdzKTsKKwkJCWlmIChhc3IgJiBBU1JfREJSKQorCQkJCXdyaXRlX3dkMzNjOTMocmVncywgV0RfREFUQSwgKmJ1ZisrKTsKKwkJfSB3aGlsZSAoIShhc3IgJiBBU1JfSU5UKSk7CisJfQorCisJLyogTm90ZTogd2UgYXJlIHJldHVybmluZyB3aXRoIHRoZSBpbnRlcnJ1cHQgVU4tY2xlYXJlZC4KKwkgKiBTaW5jZSAocHJlc3VtYWJseSkgYW4gZW50aXJlIEkvTyBvcGVyYXRpb24gaGFzCisJICogY29tcGxldGVkLCB0aGUgYnVzIHBoYXNlIGlzIHByb2JhYmx5IGRpZmZlcmVudCwgYW5kCisJICogdGhlIGludGVycnVwdCByb3V0aW5lIHdpbGwgZGlzY292ZXIgdGhpcyB3aGVuIGl0CisJICogcmVzcG9uZHMgdG8gdGhlIHVuY2xlYXJlZCBpbnQuCisJICovCisKK30KKworc3RhdGljIHZvaWQKK3RyYW5zZmVyX2J5dGVzKGNvbnN0IHdkMzNjOTNfcmVncyByZWdzLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCWludCBkYXRhX2luX2RpcikKK3sKKwlzdHJ1Y3QgV0QzM0M5M19ob3N0ZGF0YSAqaG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBsZW5ndGg7CisKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgV0QzM0M5M19ob3N0ZGF0YSAqKSBjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKy8qIE5vcm1hbGx5LCB5b3UnZCBleHBlY3QgJ3RoaXNfcmVzaWR1YWwnIHRvIGJlIG5vbi16ZXJvIGhlcmUuCisgKiBJbiBhIHNlcmllcyBvZiBzY2F0dGVyLWdhdGhlciB0cmFuc2ZlcnMsIGhvd2V2ZXIsIHRoaXMKKyAqIHJvdXRpbmUgd2lsbCB1c3VhbGx5IGJlIGNhbGxlZCB3aXRoICd0aGlzX3Jlc2lkdWFsJyBlcXVhbAorICogdG8gMCBhbmQgJ2J1ZmZlcnNfcmVzaWR1YWwnIG5vbi16ZXJvLiBUaGlzIG1lYW5zIHRoYXQgYQorICogcHJldmlvdXMgdHJhbnNmZXIgY29tcGxldGVkLCBjbGVhcmluZyAndGhpc19yZXNpZHVhbCcsIGFuZAorICogbm93IHdlIG5lZWQgdG8gc2V0dXAgdGhlIG5leHQgc2NhdHRlci1nYXRoZXIgYnVmZmVyIGFzIHRoZQorICogc291cmNlIG9yIGRlc3RpbmF0aW9uIGZvciBUSElTIHRyYW5zZmVyLgorICovCisJaWYgKCFjbWQtPlNDcC50aGlzX3Jlc2lkdWFsICYmIGNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpIHsKKwkJKytjbWQtPlNDcC5idWZmZXI7CisJCS0tY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbDsKKwkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IGNtZC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCQljbWQtPlNDcC5wdHIgPSBwYWdlX2FkZHJlc3MoY21kLT5TQ3AuYnVmZmVyLT5wYWdlKSArCisJCSAgICBjbWQtPlNDcC5idWZmZXItPm9mZnNldDsKKwl9CisKKwl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX1NZTkNIUk9OT1VTX1RSQU5TRkVSLAorCQkgICAgICBob3N0ZGF0YS0+c3luY194ZmVyW2NtZC0+ZGV2aWNlLT5pZF0pOworCisvKiAnaG9zdGRhdGEtPm5vX2RtYScgaXMgVFJVRSBpZiB3ZSBkb24ndCBldmVuIHdhbnQgdG8gdHJ5IERNQS4KKyAqIFVwZGF0ZSAndGhpc19yZXNpZHVhbCcgYW5kICdwdHInIGFmdGVyICd0cmFuc2Zlcl9waW8oKScgcmV0dXJucy4KKyAqLworCisJaWYgKGhvc3RkYXRhLT5ub19kbWEgfHwgaG9zdGRhdGEtPmRtYV9zZXR1cChjbWQsIGRhdGFfaW5fZGlyKSkgeworI2lmZGVmIFBST0NfU1RBVElTVElDUworCQlob3N0ZGF0YS0+cGlvX2NudCsrOworI2VuZGlmCisJCXRyYW5zZmVyX3BpbyhyZWdzLCAodWNoYXIgKikgY21kLT5TQ3AucHRyLAorCQkJICAgICBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsLCBkYXRhX2luX2RpciwgaG9zdGRhdGEpOworCQlsZW5ndGggPSBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsOworCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gcmVhZF93ZDMzYzkzX2NvdW50KHJlZ3MpOworCQljbWQtPlNDcC5wdHIgKz0gKGxlbmd0aCAtIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworCX0KKworLyogV2UgYXJlIGFibGUgdG8gZG8gRE1BIChpbiBmYWN0LCB0aGUgQW1pZ2EgaGFyZHdhcmUgaXMKKyAqIGFscmVhZHkgZ29pbmchKSwgc28gc3RhcnQgdXAgdGhlIHdkMzNjOTMgaW4gRE1BIG1vZGUuCisgKiBXZSBzZXQgJ2hvc3RkYXRhLT5kbWEnID0gRF9ETUFfUlVOTklORyBzbyB0aGF0IHdoZW4gdGhlCisgKiB0cmFuc2ZlciBjb21wbGV0ZXMgYW5kIGNhdXNlcyBhbiBpbnRlcnJ1cHQsIHdlJ3JlCisgKiByZW1pbmRlZCB0byB0ZWxsIHRoZSBBbWlnYSB0byBzaHV0IGRvd24gaXRzIGVuZC4gV2UnbGwKKyAqIHBvc3Rwb25lIHRoZSB1cGRhdGluZyBvZiAndGhpc19yZXNpZHVhbCcgYW5kICdwdHInCisgKiB1bnRpbCB0aGVuLgorICovCisKKwllbHNlIHsKKyNpZmRlZiBQUk9DX1NUQVRJU1RJQ1MKKwkJaG9zdGRhdGEtPmRtYV9jbnQrKzsKKyNlbmRpZgorCQl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX0NPTlRST0wsIENUUkxfSURJIHwgQ1RSTF9FREkgfCBDVFJMX0RNQSk7CisJCXdyaXRlX3dkMzNjOTNfY291bnQocmVncywgY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7CisKKwkJaWYgKChob3N0ZGF0YS0+bGV2ZWwyID49IEwyX0RBVEEpIHx8CisJCSAgICAoaG9zdGRhdGEtPmxldmVsMiA9PSBMMl9CQVNJQyAmJiBjbWQtPlNDcC5waGFzZSA9PSAwKSkgeworCQkJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9DT01NQU5EX1BIQVNFLCAweDQ1KTsKKwkJCXdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsIFdEX0NNRF9TRUxfQVROX1hGRVIpOworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19SVU5OSU5HX0xFVkVMMjsKKwkJfSBlbHNlCisJCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBXRF9DTURfVFJBTlNfSU5GTyk7CisKKwkJaG9zdGRhdGEtPmRtYSA9IERfRE1BX1JVTk5JTkc7CisJfQorfQorCit2b2lkCit3ZDMzYzkzX2ludHIoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisJc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEgKmhvc3RkYXRhID0KKwkgICAgKHN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKKwljb25zdCB3ZDMzYzkzX3JlZ3MgcmVncyA9IGhvc3RkYXRhLT5yZWdzOworCXN0cnVjdCBzY3NpX2NtbmQgKnBhdGNoLCAqY21kOworCXVjaGFyIGFzciwgc3IsIHBocywgaWQsIGx1biwgKnVjcCwgbXNnOworCXVuc2lnbmVkIGxvbmcgbGVuZ3RoLCBmbGFnczsKKworCWFzciA9IHJlYWRfYXV4X3N0YXQocmVncyk7CisJaWYgKCEoYXNyICYgQVNSX0lOVCkgfHwgKGFzciAmIEFTUl9CU1kpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdGRhdGEtPmxvY2ssIGZsYWdzKTsKKworI2lmZGVmIFBST0NfU1RBVElTVElDUworCWhvc3RkYXRhLT5pbnRfY250Kys7CisjZW5kaWYKKworCWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGhvc3RkYXRhLT5jb25uZWN0ZWQ7CS8qIGFzc3VtZSB3ZSdyZSBjb25uZWN0ZWQgKi8KKwlzciA9IHJlYWRfd2QzM2M5MyhyZWdzLCBXRF9TQ1NJX1NUQVRVUyk7CS8qIGNsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KKwlwaHMgPSByZWFkX3dkMzNjOTMocmVncywgV0RfQ09NTUFORF9QSEFTRSk7CisKKwlEQihEQl9JTlRSLCBwcmludGsoInslMDJ4OiUwMngtIiwgYXNyLCBzcikpCisKKy8qIEFmdGVyIHN0YXJ0aW5nIGEgRE1BIHRyYW5zZmVyLCB0aGUgbmV4dCBpbnRlcnJ1cHQKKyAqIGlzIGd1YXJhbnRlZWQgdG8gYmUgaW4gcmVzcG9uc2UgdG8gY29tcGxldGlvbiBvZgorICogdGhlIHRyYW5zZmVyLiBTaW5jZSB0aGUgQW1pZ2EgRE1BIGhhcmR3YXJlIHJ1bnMgaW4KKyAqIGluIGFuIG9wZW4tZW5kZWQgZmFzaGlvbiwgaXQgbmVlZHMgdG8gYmUgdG9sZCB3aGVuCisgKiB0byBzdG9wOyBkbyB0aGF0IGhlcmUgaWYgRF9ETUFfUlVOTklORyBpcyB0cnVlLgorICogQWxzbywgd2UgaGF2ZSB0byB1cGRhdGUgJ3RoaXNfcmVzaWR1YWwnIGFuZCAncHRyJworICogYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBUUkFOU0ZFUl9DT1VOVCByZWdpc3RlciwKKyAqIGluIGNhc2UgdGhlIGRldmljZSBkZWNpZGVkIHRvIGRvIGFuIGludGVybWVkaWF0ZQorICogZGlzY29ubmVjdCAoYSBkZXZpY2UgbWF5IGRvIHRoaXMgaWYgaXQgaGFzIHRvIGRvIGEKKyAqIHNlZWssIG9yIGp1c3QgdG8gYmUgbmljZSBhbmQgbGV0IG90aGVyIGRldmljZXMgaGF2ZQorICogc29tZSBidXMgdGltZSBkdXJpbmcgbG9uZyB0cmFuc2ZlcnMpLiBBZnRlciBkb2luZworICogd2hhdGV2ZXIgaXMgbmVlZGVkLCB3ZSBnbyBvbiBhbmQgc2VydmljZSB0aGUgV0QzMzkzCisgKiBpbnRlcnJ1cHQgbm9ybWFsbHkuCisgKi8KKwkgICAgaWYgKGhvc3RkYXRhLT5kbWEgPT0gRF9ETUFfUlVOTklORykgeworCQlEQihEQl9UUkFOU0ZFUiwKKwkJICAgcHJpbnRrKCJbJXAvJWQ6IiwgY21kLT5TQ3AucHRyLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsKSkKKwkJICAgIGhvc3RkYXRhLT5kbWFfc3RvcChjbWQtPmRldmljZS0+aG9zdCwgY21kLCAxKTsKKwkJaG9zdGRhdGEtPmRtYSA9IERfRE1BX09GRjsKKwkJbGVuZ3RoID0gY21kLT5TQ3AudGhpc19yZXNpZHVhbDsKKwkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IHJlYWRfd2QzM2M5M19jb3VudChyZWdzKTsKKwkJY21kLT5TQ3AucHRyICs9IChsZW5ndGggLSBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsKTsKKwkJREIoREJfVFJBTlNGRVIsCisJCSAgIHByaW50aygiJXAvJWRdIiwgY21kLT5TQ3AucHRyLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsKSkKKwl9CisKKy8qIFJlc3BvbmQgdG8gdGhlIHNwZWNpZmljIFdEMzM5MyBpbnRlcnJ1cHQgLSB0aGVyZSBhcmUgcXVpdGUgYSBmZXchICovCisJc3dpdGNoIChzcikgeworCWNhc2UgQ1NSX1RJTUVPVVQ6CisJCURCKERCX0lOVFIsIHByaW50aygiVElNRU9VVCIpKQorCisJCSAgICBpZiAoaG9zdGRhdGEtPnN0YXRlID09IFNfUlVOTklOR19MRVZFTDIpCisJCQlob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKwkJZWxzZSB7CisJCQljbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBob3N0ZGF0YS0+c2VsZWN0aW5nOwkvKiBnZXQgYSB2YWxpZCBjbWQgKi8KKwkJCWhvc3RkYXRhLT5zZWxlY3RpbmcgPSBOVUxMOworCQl9CisKKwkJY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmPSB+KDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfVU5DT05ORUNURUQ7CisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisKKwkJLyogRnJvbSBlc3AuYzoKKwkJICogVGhlcmUgaXMgYSB3aW5kb3cgb2YgdGltZSB3aXRoaW4gdGhlIHNjc2lfZG9uZSgpIHBhdGgKKwkJICogb2YgZXhlY3V0aW9uIHdoZXJlIGludGVycnVwdHMgYXJlIHR1cm5lZCBiYWNrIG9uIGZ1bGwKKwkJICogYmxhc3QgYW5kIGxlZnQgdGhhdCB3YXkuICBEdXJpbmcgdGhhdCB0aW1lIHdlIGNvdWxkCisJCSAqIHJlY29ubmVjdCB0byBhIGRpc2Nvbm5lY3RlZCBjb21tYW5kLCB0aGVuIHdlJ2QgYm9tYgorCQkgKiBvdXQgYmVsb3cuICBXZSBjb3VsZCBhbHNvIGVuZCB1cCBleGVjdXRpbmcgdHdvIGNvbW1hbmRzCisJCSAqIGF0IF9vbmNlXy4gIC4uLmp1c3Qgc28geW91IGtub3cgd2h5IHRoZSByZXN0b3JlX2ZsYWdzKCkKKwkJICogaXMgaGVyZS4uLgorCQkgKi8KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0ZGF0YS0+bG9jaywgZmxhZ3MpOworCisvKiBXZSBhcmUgbm90IGNvbm5lY3RlZCB0byBhIHRhcmdldCAtIGNoZWNrIHRvIHNlZSBpZiB0aGVyZQorICogYXJlIGNvbW1hbmRzIHdhaXRpbmcgdG8gYmUgZXhlY3V0ZWQuCisgKi8KKworCQl3ZDMzYzkzX2V4ZWN1dGUoaW5zdGFuY2UpOworCQlicmVhazsKKworLyogTm90ZTogdGhpcyBpbnRlcnJ1cHQgc2hvdWxkIG5vdCBvY2N1ciBpbiBhIExFVkVMMiBjb21tYW5kICovCisKKwljYXNlIENTUl9TRUxFQ1Q6CisJCURCKERCX0lOVFIsIHByaW50aygiU0VMRUNUIikpCisJCSAgICBob3N0ZGF0YS0+Y29ubmVjdGVkID0gY21kID0KKwkJICAgIChzdHJ1Y3Qgc2NzaV9jbW5kICopIGhvc3RkYXRhLT5zZWxlY3Rpbmc7CisJCWhvc3RkYXRhLT5zZWxlY3RpbmcgPSBOVUxMOworCisJCS8qIGNvbnN0cnVjdCBhbiBJREVOVElGWSBtZXNzYWdlIHdpdGggY29ycmVjdCBkaXNjb25uZWN0IGJpdCAqLworCisJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMF0gPSAoMHg4MCB8IDB4MDAgfCBjbWQtPmRldmljZS0+bHVuKTsKKwkJaWYgKGNtZC0+U0NwLnBoYXNlKQorCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1swXSB8PSAweDQwOworCisJCWlmIChob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gPT0gU1NfRklSU1QpIHsKKyNpZmRlZiBTWU5DX0RFQlVHCisJCQlwcmludGsoIiBzZW5kaW5nIFNEVFIgIik7CisjZW5kaWYKKworCQkJaG9zdGRhdGEtPnN5bmNfc3RhdFtjbWQtPmRldmljZS0+aWRdID0gU1NfV0FJVElORzsKKworLyogVGFjayBvbiBhIDJuZCBtZXNzYWdlIHRvIGFzayBhYm91dCBzeW5jaHJvbm91cyB0cmFuc2ZlcnMuIElmIHdlJ3ZlCisgKiBiZWVuIGFza2VkIHRvIGRvIG9ubHkgYXN5bmNocm9ub3VzIHRyYW5zZmVycyBvbiB0aGlzIGRldmljZSwgd2UKKyAqIHJlcXVlc3QgYSBmaWZvIGRlcHRoIG9mIDAsIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gYXN5bmMgLSBzaG91bGQKKyAqIHNvbHZlIHRoZSBwcm9ibGVtcyBzb21lIHBlb3BsZSBoYXZlIGhhZCB3aXRoIEdWUCdzIEd1cnUgUk9NLgorICovCisKKwkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMV0gPSBFWFRFTkRFRF9NRVNTQUdFOworCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1syXSA9IDM7CisJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzNdID0gRVhURU5ERURfU0RUUjsKKwkJCWlmIChob3N0ZGF0YS0+bm9fc3luYyAmICgxIDw8IGNtZC0+ZGV2aWNlLT5pZCkpIHsKKwkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzRdID0KKwkJCQkgICAgaG9zdGRhdGEtPmRlZmF1bHRfc3hfcGVyIC8gNDsKKwkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzVdID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1s0XSA9IE9QVElNVU1fU1hfUEVSIC8gNDsKKwkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzVdID0gT1BUSU1VTV9TWF9PRkY7CisJCQl9CisJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbGVuID0gNjsKKwkJfSBlbHNlCisJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbGVuID0gMTsKKworCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdGRhdGEtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIENTUl9YRkVSX0RPTkUgfCBQSFNfREFUQV9JTjoKKwljYXNlIENTUl9VTkVYUCB8IFBIU19EQVRBX0lOOgorCWNhc2UgQ1NSX1NSVl9SRVEgfCBQSFNfREFUQV9JTjoKKwkJREIoREJfSU5UUiwKKwkJICAgcHJpbnRrKCJJTi0lZC4lZCIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwsCisJCQkgIGNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpKQorCQkgICAgdHJhbnNmZXJfYnl0ZXMocmVncywgY21kLCBEQVRBX0lOX0RJUik7CisJCWlmIChob3N0ZGF0YS0+c3RhdGUgIT0gU19SVU5OSU5HX0xFVkVMMikKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0ZGF0YS0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgQ1NSX1hGRVJfRE9ORSB8IFBIU19EQVRBX09VVDoKKwljYXNlIENTUl9VTkVYUCB8IFBIU19EQVRBX09VVDoKKwljYXNlIENTUl9TUlZfUkVRIHwgUEhTX0RBVEFfT1VUOgorCQlEQihEQl9JTlRSLAorCQkgICBwcmludGsoIk9VVC0lZC4lZCIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwsCisJCQkgIGNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpKQorCQkgICAgdHJhbnNmZXJfYnl0ZXMocmVncywgY21kLCBEQVRBX09VVF9ESVIpOworCQlpZiAoaG9zdGRhdGEtPnN0YXRlICE9IFNfUlVOTklOR19MRVZFTDIpCisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdGRhdGEtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKy8qIE5vdGU6IHRoaXMgaW50ZXJydXB0IHNob3VsZCBub3Qgb2NjdXIgaW4gYSBMRVZFTDIgY29tbWFuZCAqLworCisJY2FzZSBDU1JfWEZFUl9ET05FIHwgUEhTX0NPTU1BTkQ6CisJY2FzZSBDU1JfVU5FWFAgfCBQSFNfQ09NTUFORDoKKwljYXNlIENTUl9TUlZfUkVRIHwgUEhTX0NPTU1BTkQ6CisJCURCKERCX0lOVFIsIHByaW50aygiQ01ORC0lMDJ4LCVsZCIsIGNtZC0+Y21uZFswXSwgY21kLT5waWQpKQorCQkgICAgdHJhbnNmZXJfcGlvKHJlZ3MsIGNtZC0+Y21uZCwgY21kLT5jbWRfbGVuLCBEQVRBX09VVF9ESVIsCisJCQkJIGhvc3RkYXRhKTsKKwkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RkYXRhLT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBDU1JfWEZFUl9ET05FIHwgUEhTX1NUQVRVUzoKKwljYXNlIENTUl9VTkVYUCB8IFBIU19TVEFUVVM6CisJY2FzZSBDU1JfU1JWX1JFUSB8IFBIU19TVEFUVVM6CisJCURCKERCX0lOVFIsIHByaW50aygiU1RBVFVTPSIpKQorCQljbWQtPlNDcC5TdGF0dXMgPSByZWFkXzFfYnl0ZShyZWdzKTsKKwkJREIoREJfSU5UUiwgcHJpbnRrKCIlMDJ4IiwgY21kLT5TQ3AuU3RhdHVzKSkKKwkJICAgIGlmIChob3N0ZGF0YS0+bGV2ZWwyID49IEwyX0JBU0lDKSB7CisJCQlzciA9IHJlYWRfd2QzM2M5MyhyZWdzLCBXRF9TQ1NJX1NUQVRVUyk7CS8qIGNsZWFyIGludGVycnVwdCAqLworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19SVU5OSU5HX0xFVkVMMjsKKwkJCXdyaXRlX3dkMzNjOTMocmVncywgV0RfQ09NTUFORF9QSEFTRSwgMHg1MCk7CisJCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBXRF9DTURfU0VMX0FUTl9YRkVSKTsKKwkJfSBlbHNlIHsKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RkYXRhLT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBDU1JfWEZFUl9ET05FIHwgUEhTX01FU1NfSU46CisJY2FzZSBDU1JfVU5FWFAgfCBQSFNfTUVTU19JTjoKKwljYXNlIENTUl9TUlZfUkVRIHwgUEhTX01FU1NfSU46CisJCURCKERCX0lOVFIsIHByaW50aygiTVNHX0lOPSIpKQorCisJCW1zZyA9IHJlYWRfMV9ieXRlKHJlZ3MpOworCQlzciA9IHJlYWRfd2QzM2M5MyhyZWdzLCBXRF9TQ1NJX1NUQVRVUyk7CS8qIGNsZWFyIGludGVycnVwdCAqLworCisJCWhvc3RkYXRhLT5pbmNvbWluZ19tc2dbaG9zdGRhdGEtPmluY29taW5nX3B0cl0gPSBtc2c7CisJCWlmIChob3N0ZGF0YS0+aW5jb21pbmdfbXNnWzBdID09IEVYVEVOREVEX01FU1NBR0UpCisJCQltc2cgPSBFWFRFTkRFRF9NRVNTQUdFOworCQllbHNlCisJCQlob3N0ZGF0YS0+aW5jb21pbmdfcHRyID0gMDsKKworCQljbWQtPlNDcC5NZXNzYWdlID0gbXNnOworCQlzd2l0Y2ggKG1zZykgeworCisJCWNhc2UgQ09NTUFORF9DT01QTEVURToKKwkJCURCKERCX0lOVFIsIHByaW50aygiQ0NNUC0lbGQiLCBjbWQtPnBpZCkpCisJCQkgICAgd3JpdGVfd2QzM2M5M19jbWQocmVncywgV0RfQ01EX05FR0FURV9BQ0spOworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19QUkVfQ01QX0RJU0M7CisJCQlicmVhazsKKworCQljYXNlIFNBVkVfUE9JTlRFUlM6CisJCQlEQihEQl9JTlRSLCBwcmludGsoIlNEUCIpKQorCQkJICAgIHdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsIFdEX0NNRF9ORUdBVEVfQUNLKTsKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRVNUT1JFX1BPSU5URVJTOgorCQkJREIoREJfSU5UUiwgcHJpbnRrKCJSRFAiKSkKKwkJCSAgICBpZiAoaG9zdGRhdGEtPmxldmVsMiA+PSBMMl9CQVNJQykgeworCQkJCXdyaXRlX3dkMzNjOTMocmVncywgV0RfQ09NTUFORF9QSEFTRSwgMHg0NSk7CisJCQkJd3JpdGVfd2QzM2M5M19jbWQocmVncywgV0RfQ01EX1NFTF9BVE5fWEZFUik7CisJCQkJaG9zdGRhdGEtPnN0YXRlID0gU19SVU5OSU5HX0xFVkVMMjsKKwkJCX0gZWxzZSB7CisJCQkJd3JpdGVfd2QzM2M5M19jbWQocmVncywgV0RfQ01EX05FR0FURV9BQ0spOworCQkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBESVNDT05ORUNUOgorCQkJREIoREJfSU5UUiwgcHJpbnRrKCJESVMiKSkKKwkJCSAgICBjbWQtPmRldmljZS0+ZGlzY29ubmVjdCA9IDE7CisJCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBXRF9DTURfTkVHQVRFX0FDSyk7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1BSRV9UTVBfRElTQzsKKwkJCWJyZWFrOworCisJCWNhc2UgTUVTU0FHRV9SRUpFQ1Q6CisJCQlEQihEQl9JTlRSLCBwcmludGsoIlJFSiIpKQorI2lmZGVmIFNZTkNfREVCVUcKKwkJCSAgICBwcmludGsoIi1SRUotIik7CisjZW5kaWYKKwkJCWlmIChob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gPT0gU1NfV0FJVElORykKKwkJCQlob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gPSBTU19TRVQ7CisJCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBXRF9DTURfTkVHQVRFX0FDSyk7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgRVhURU5ERURfTUVTU0FHRToKKwkJCURCKERCX0lOVFIsIHByaW50aygiRVhUIikpCisKKwkJCSAgICB1Y3AgPSBob3N0ZGF0YS0+aW5jb21pbmdfbXNnOworCisjaWZkZWYgU1lOQ19ERUJVRworCQkJcHJpbnRrKCIlMDJ4IiwgdWNwW2hvc3RkYXRhLT5pbmNvbWluZ19wdHJdKTsKKyNlbmRpZgorCQkJLyogSXMgdGhpcyB0aGUgbGFzdCBieXRlIG9mIHRoZSBleHRlbmRlZCBtZXNzYWdlPyAqLworCisJCQlpZiAoKGhvc3RkYXRhLT5pbmNvbWluZ19wdHIgPj0gMikgJiYKKwkJCSAgICAoaG9zdGRhdGEtPmluY29taW5nX3B0ciA9PSAodWNwWzFdICsgMSkpKSB7CisKKwkJCQlzd2l0Y2ggKHVjcFsyXSkgewkvKiB3aGF0J3MgdGhlIEVYVEVOREVEIGNvZGU/ICovCisJCQkJY2FzZSBFWFRFTkRFRF9TRFRSOgorCQkJCQlpZCA9IGNhbGNfc3luY194ZmVyKHVjcFszXSwgdWNwWzRdKTsKKwkJCQkJaWYgKGhvc3RkYXRhLT5zeW5jX3N0YXRbY21kLT5kZXZpY2UtPmlkXSAhPQorCQkJCQkgICAgU1NfV0FJVElORykgeworCisvKiBBIGRldmljZSBoYXMgc2VudCBhbiB1bnNvbGljaXRlZCBTRFRSIG1lc3NhZ2U7IHJhdGhlciB0aGFuIGdvCisgKiB0aHJvdWdoIHRoZSBlZmZvcnQgb2YgZGVjb2RpbmcgaXQgYW5kIHRoZW4gZmlndXJpbmcgb3V0IHdoYXQKKyAqIG91ciByZXBseSBzaG91bGQgYmUsIHdlJ3JlIGp1c3QgZ29ubmEgc2F5IHRoYXQgd2UgaGF2ZSBhCisgKiBzeW5jaHJvbm91cyBmaWZvIGRlcHRoIG9mIDAuIFRoaXMgd2lsbCByZXN1bHQgaW4gYXN5bmNocm9ub3VzCisgKiB0cmFuc2ZlcnMgLSBub3QgaWRlYWwgYnV0IHNvIG11Y2ggZWFzaWVyLgorICogQWN0dWFsbHksIHRoaXMgaXMgT0sgYmVjYXVzZSBpdCBhc3N1cmVzIHVzIHRoYXQgaWYgd2UgZG9uJ3QKKyAqIHNwZWNpZmljYWxseSBhc2sgZm9yIHN5bmMgdHJhbnNmZXJzLCB3ZSB3b24ndCBkbyBhbnkuCisgKi8KKworCQkJCQkJd3JpdGVfd2QzM2M5M19jbWQocmVncywgV0RfQ01EX0FTU0VSVF9BVE4pOwkvKiB3YW50IE1FU1NfT1VUICovCisJCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzBdID0KKwkJCQkJCSAgICBFWFRFTkRFRF9NRVNTQUdFOworCQkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1sxXSA9IDM7CisJCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzJdID0KKwkJCQkJCSAgICBFWFRFTkRFRF9TRFRSOworCQkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1szXSA9CisJCQkJCQkgICAgaG9zdGRhdGEtPmRlZmF1bHRfc3hfcGVyIC8KKwkJCQkJCSAgICA0OworCQkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1s0XSA9IDA7CisJCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbGVuID0gNTsKKwkJCQkJCWhvc3RkYXRhLT5zeW5jX3hmZXJbY21kLT5kZXZpY2UtPmlkXSA9CisJCQkJCQkgICAgY2FsY19zeW5jX3hmZXIoaG9zdGRhdGEtPgorCQkJCQkJCQkgICBkZWZhdWx0X3N4X3BlcgorCQkJCQkJCQkgICAvIDQsIDApOworCQkJCQl9IGVsc2UgeworCQkJCQkJaG9zdGRhdGEtPnN5bmNfeGZlcltjbWQtPmRldmljZS0+aWRdID0gaWQ7CisJCQkJCX0KKyNpZmRlZiBTWU5DX0RFQlVHCisJCQkJCXByaW50aygic3luY194ZmVyPSUwMngiLAorCQkJCQkgICAgICAgaG9zdGRhdGEtPnN5bmNfeGZlcltjbWQtPmRldmljZS0+aWRdKTsKKyNlbmRpZgorCQkJCQlob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gPQorCQkJCQkgICAgU1NfU0VUOworCQkJCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLAorCQkJCQkJCSAgV0RfQ01EX05FR0FURV9BQ0spOworCQkJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBFWFRFTkRFRF9XRFRSOgorCQkJCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBXRF9DTURfQVNTRVJUX0FUTik7CS8qIHdhbnQgTUVTU19PVVQgKi8KKwkJCQkJcHJpbnRrKCJzZW5kaW5nIFdEVFIgIik7CisJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMF0gPQorCQkJCQkgICAgRVhURU5ERURfTUVTU0FHRTsKKwkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1sxXSA9IDI7CisJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMl0gPQorCQkJCQkgICAgRVhURU5ERURfV0RUUjsKKwkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1szXSA9IDA7CS8qIDggYml0IHRyYW5zZmVyIHdpZHRoICovCisJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSA0OworCQkJCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLAorCQkJCQkJCSAgV0RfQ01EX05FR0FURV9BQ0spOworCQkJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJd3JpdGVfd2QzM2M5M19jbWQocmVncywgV0RfQ01EX0FTU0VSVF9BVE4pOwkvKiB3YW50IE1FU1NfT1VUICovCisJCQkJCXByaW50aworCQkJCQkgICAgKCJSZWplY3RpbmcgVW5rbm93biBFeHRlbmRlZCBNZXNzYWdlKCUwMngpLiAiLAorCQkJCQkgICAgIHVjcFsyXSk7CisJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMF0gPQorCQkJCQkgICAgTUVTU0FHRV9SRUpFQ1Q7CisJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSAxOworCQkJCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLAorCQkJCQkJCSAgV0RfQ01EX05FR0FURV9BQ0spOworCQkJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWhvc3RkYXRhLT5pbmNvbWluZ19wdHIgPSAwOworCQkJfQorCisJCQkvKiBXZSBuZWVkIHRvIHJlYWQgbW9yZSBNRVNTX0lOIGJ5dGVzIGZvciB0aGUgZXh0ZW5kZWQgbWVzc2FnZSAqLworCisJCQllbHNlIHsKKwkJCQlob3N0ZGF0YS0+aW5jb21pbmdfcHRyKys7CisJCQkJd3JpdGVfd2QzM2M5M19jbWQocmVncywgV0RfQ01EX05FR0FURV9BQ0spOworCQkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiUmVqZWN0aW5nIFVua25vd24gTWVzc2FnZSglMDJ4KSAiLCBtc2cpOworCQkJd3JpdGVfd2QzM2M5M19jbWQocmVncywgV0RfQ01EX0FTU0VSVF9BVE4pOwkvKiB3YW50IE1FU1NfT1VUICovCisJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzBdID0gTUVTU0FHRV9SRUpFQ1Q7CisJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbGVuID0gMTsKKwkJCXdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsIFdEX0NNRF9ORUdBVEVfQUNLKTsKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RkYXRhLT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCisvKiBOb3RlOiB0aGlzIGludGVycnVwdCB3aWxsIG9jY3VyIG9ubHkgYWZ0ZXIgYSBMRVZFTDIgY29tbWFuZCAqLworCisJY2FzZSBDU1JfU0VMX1hGRVJfRE9ORToKKworLyogTWFrZSBzdXJlIHRoYXQgcmVzZWxlY3Rpb24gaXMgZW5hYmxlZCBhdCB0aGlzIHBvaW50IC0gaXQgbWF5CisgKiBoYXZlIGJlZW4gdHVybmVkIG9mZiBmb3IgdGhlIGNvbW1hbmQgdGhhdCBqdXN0IGNvbXBsZXRlZC4KKyAqLworCisJCXdyaXRlX3dkMzNjOTMocmVncywgV0RfU09VUkNFX0lELCBTUkNJRF9FUik7CisJCWlmIChwaHMgPT0gMHg2MCkgeworCQkJREIoREJfSU5UUiwgcHJpbnRrKCJTWC1ET05FLSVsZCIsIGNtZC0+cGlkKSkKKwkJCSAgICBjbWQtPlNDcC5NZXNzYWdlID0gQ09NTUFORF9DT01QTEVURTsKKwkJCWx1biA9IHJlYWRfd2QzM2M5MyhyZWdzLCBXRF9UQVJHRVRfTFVOKTsKKwkJCURCKERCX0lOVFIsIHByaW50aygiOiVkLiVkIiwgY21kLT5TQ3AuU3RhdHVzLCBsdW4pKQorCQkJICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQkJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmPSB+KDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOworCQkJaWYgKGNtZC0+U0NwLlN0YXR1cyA9PSBJTExFR0FMX1NUQVRVU19CWVRFKQorCQkJCWNtZC0+U0NwLlN0YXR1cyA9IGx1bjsKKwkJCWlmIChjbWQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRQorCQkJICAgICYmIGNtZC0+U0NwLlN0YXR1cyAhPSBHT09EKQorCQkJCWNtZC0+cmVzdWx0ID0KKwkJCQkgICAgKGNtZC0+CisJCQkJICAgICByZXN1bHQgJiAweDAwZmZmZikgfCAoRElEX0VSUk9SIDw8IDE2KTsKKwkJCWVsc2UKKwkJCQljbWQtPnJlc3VsdCA9CisJCQkJICAgIGNtZC0+U0NwLlN0YXR1cyB8IChjbWQtPlNDcC5NZXNzYWdlIDw8IDgpOworCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKworLyogV2UgYXJlIG5vIGxvbmdlciAgY29ubmVjdGVkIHRvIGEgdGFyZ2V0IC0gY2hlY2sgdG8gc2VlIGlmCisgKiB0aGVyZSBhcmUgY29tbWFuZHMgd2FpdGluZyB0byBiZSBleGVjdXRlZC4KKyAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdGRhdGEtPmxvY2ssIGZsYWdzKTsKKwkJCXdkMzNjOTNfZXhlY3V0ZShpbnN0YW5jZSk7CisJCX0gZWxzZSB7CisJCQlwcmludGsKKwkJCSAgICAoIiUwMng6JTAyeDolMDJ4LSVsZDogVW5rbm93biBTRUxfWEZFUl9ET05FIHBoYXNlISEtLS0iLAorCQkJICAgICBhc3IsIHNyLCBwaHMsIGNtZC0+cGlkKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RkYXRhLT5sb2NrLCBmbGFncyk7CisJCX0KKwkJYnJlYWs7CisKKy8qIE5vdGU6IHRoaXMgaW50ZXJydXB0IHdpbGwgb2NjdXIgb25seSBhZnRlciBhIExFVkVMMiBjb21tYW5kICovCisKKwljYXNlIENTUl9TRFA6CisJCURCKERCX0lOVFIsIHByaW50aygiU0RQIikpCisJCSAgICBob3N0ZGF0YS0+c3RhdGUgPSBTX1JVTk5JTkdfTEVWRUwyOworCQl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX0NPTU1BTkRfUEhBU0UsIDB4NDEpOworCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBXRF9DTURfU0VMX0FUTl9YRkVSKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdGRhdGEtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIENTUl9YRkVSX0RPTkUgfCBQSFNfTUVTU19PVVQ6CisJY2FzZSBDU1JfVU5FWFAgfCBQSFNfTUVTU19PVVQ6CisJY2FzZSBDU1JfU1JWX1JFUSB8IFBIU19NRVNTX09VVDoKKwkJREIoREJfSU5UUiwgcHJpbnRrKCJNU0dfT1VUPSIpKQorCisvKiBUbyBnZXQgaGVyZSwgd2UndmUgcHJvYmFibHkgcmVxdWVzdGVkIE1FU1NBR0VfT1VUIGFuZCBoYXZlCisgKiBhbHJlYWR5IHB1dCB0aGUgY29ycmVjdCBieXRlcyBpbiBvdXRnb2luZ19tc2dbXSBhbmQgZmlsbGVkCisgKiBpbiBvdXRnb2luZ19sZW4uIFdlIHNpbXBseSBzZW5kIHRoZW0gb3V0IHRvIHRoZSBTQ1NJIGJ1cy4KKyAqIFNvbWV0aW1lcyB3ZSBnZXQgTUVTU0FHRV9PVVQgcGhhc2Ugd2hlbiB3ZSdyZSBub3QgZXhwZWN0aW5nCisgKiBpdCAtIGxpa2Ugd2hlbiBvdXIgU0RUUiBtZXNzYWdlIGlzIHJlamVjdGVkIGJ5IGEgdGFyZ2V0LiBTb21lCisgKiB0YXJnZXRzIHNlbmQgdGhlIFJFSkVDVCBiZWZvcmUgcmVjZWl2aW5nIGFsbCBvZiB0aGUgZXh0ZW5kZWQKKyAqIG1lc3NhZ2UsIGFuZCB0aGVuIHNlZW0gdG8gZ28gYmFjayB0byBNRVNTQUdFX09VVCBmb3IgYSBieXRlCisgKiBvciB0d28uIE5vdCBzdXJlIHdoeSwgb3IgaWYgSSdtIGRvaW5nIHNvbWV0aGluZyB3cm9uZyB0bworICogY2F1c2UgdGhpcyB0byBoYXBwZW4uIFJlZ2FyZGxlc3MsIGl0IHNlZW1zIHRoYXQgc2VuZGluZworICogTk9QIG1lc3NhZ2VzIGluIHRoZXNlIHNpdHVhdGlvbnMgcmVzdWx0cyBpbiBubyBoYXJtIGFuZAorICogbWFrZXMgZXZlcnlvbmUgaGFwcHkuCisgKi8KKwkJICAgIGlmIChob3N0ZGF0YS0+b3V0Z29pbmdfbGVuID09IDApIHsKKwkJCWhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSAxOworCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1swXSA9IE5PUDsKKwkJfQorCQl0cmFuc2Zlcl9waW8ocmVncywgaG9zdGRhdGEtPm91dGdvaW5nX21zZywKKwkJCSAgICAgaG9zdGRhdGEtPm91dGdvaW5nX2xlbiwgREFUQV9PVVRfRElSLCBob3N0ZGF0YSk7CisJCURCKERCX0lOVFIsIHByaW50aygiJTAyeCIsIGhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMF0pKQorCQkgICAgaG9zdGRhdGEtPm91dGdvaW5nX2xlbiA9IDA7CisJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0ZGF0YS0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgQ1NSX1VORVhQX0RJU0M6CisKKy8qIEkgdGhpbmsgSSd2ZSBzZWVuIHRoaXMgYWZ0ZXIgYSByZXF1ZXN0LXNlbnNlIHRoYXQgd2FzIGluIHJlc3BvbnNlCisgKiB0byBhbiBlcnJvciBjb25kaXRpb24sIGJ1dCBub3Qgc3VyZS4gV2UgY2VydGFpbmx5IG5lZWQgdG8gZG8KKyAqIHNvbWV0aGluZyB3aGVuIHdlIGdldCB0aGlzIGludGVycnVwdCAtIHRoZSBxdWVzdGlvbiBpcyAnd2hhdD8nLgorICogTGV0J3MgdGhpbmsgcG9zaXRpdmVseSwgYW5kIGFzc3VtZSBzb21lIGNvbW1hbmQgaGFzIGZpbmlzaGVkCisgKiBpbiBhIGxlZ2FsIG1hbm5lciAobGlrZSBhIGNvbW1hbmQgdGhhdCBwcm92b2tlcyBhIHJlcXVlc3Qtc2Vuc2UpLAorICogc28gd2UgdHJlYXQgaXQgYXMgYSBub3JtYWwgY29tbWFuZC1jb21wbGV0ZS1kaXNjb25uZWN0LgorICovCisKKy8qIE1ha2Ugc3VyZSB0aGF0IHJlc2VsZWN0aW9uIGlzIGVuYWJsZWQgYXQgdGhpcyBwb2ludCAtIGl0IG1heQorICogaGF2ZSBiZWVuIHR1cm5lZCBvZmYgZm9yIHRoZSBjb21tYW5kIHRoYXQganVzdCBjb21wbGV0ZWQuCisgKi8KKworCQl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX1NPVVJDRV9JRCwgU1JDSURfRVIpOworCQlpZiAoY21kID09IE5VTEwpIHsKKwkJCXByaW50aygiIC0gQWxyZWFkeSBkaXNjb25uZWN0ZWQhICIpOworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19VTkNPTk5FQ1RFRDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RkYXRhLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwkJREIoREJfSU5UUiwgcHJpbnRrKCJVTkVYUF9ESVNDLSVsZCIsIGNtZC0+cGlkKSkKKwkJICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQlob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKwkJaG9zdGRhdGEtPnN0YXRlID0gU19VTkNPTk5FQ1RFRDsKKwkJaWYgKGNtZC0+Y21uZFswXSA9PSBSRVFVRVNUX1NFTlNFICYmIGNtZC0+U0NwLlN0YXR1cyAhPSBHT09EKQorCQkJY21kLT5yZXN1bHQgPQorCQkJICAgIChjbWQtPnJlc3VsdCAmIDB4MDBmZmZmKSB8IChESURfRVJST1IgPDwgMTYpOworCQllbHNlCisJCQljbWQtPnJlc3VsdCA9IGNtZC0+U0NwLlN0YXR1cyB8IChjbWQtPlNDcC5NZXNzYWdlIDw8IDgpOworCQljbWQtPnNjc2lfZG9uZShjbWQpOworCisvKiBXZSBhcmUgbm8gbG9uZ2VyIGNvbm5lY3RlZCB0byBhIHRhcmdldCAtIGNoZWNrIHRvIHNlZSBpZgorICogdGhlcmUgYXJlIGNvbW1hbmRzIHdhaXRpbmcgdG8gYmUgZXhlY3V0ZWQuCisgKi8KKwkJLyogbG9vayBhYm92ZSBmb3IgY29tbWVudHMgb24gc2NzaV9kb25lKCkgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdGRhdGEtPmxvY2ssIGZsYWdzKTsKKwkJd2QzM2M5M19leGVjdXRlKGluc3RhbmNlKTsKKwkJYnJlYWs7CisKKwljYXNlIENTUl9ESVNDOgorCisvKiBNYWtlIHN1cmUgdGhhdCByZXNlbGVjdGlvbiBpcyBlbmFibGVkIGF0IHRoaXMgcG9pbnQgLSBpdCBtYXkKKyAqIGhhdmUgYmVlbiB0dXJuZWQgb2ZmIGZvciB0aGUgY29tbWFuZCB0aGF0IGp1c3QgY29tcGxldGVkLgorICovCisKKwkJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9TT1VSQ0VfSUQsIFNSQ0lEX0VSKTsKKwkJREIoREJfSU5UUiwgcHJpbnRrKCJESVNDLSVsZCIsIGNtZC0+cGlkKSkKKwkJICAgIGlmIChjbWQgPT0gTlVMTCkgeworCQkJcHJpbnRrKCIgLSBBbHJlYWR5IGRpc2Nvbm5lY3RlZCEgIik7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOworCQl9CisJCXN3aXRjaCAoaG9zdGRhdGEtPnN0YXRlKSB7CisJCWNhc2UgU19QUkVfQ01QX0RJU0M6CisJCQlob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKwkJCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19VTkNPTk5FQ1RFRDsKKwkJCURCKERCX0lOVFIsIHByaW50aygiOiVkIiwgY21kLT5TQ3AuU3RhdHVzKSkKKwkJCSAgICBpZiAoY21kLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UKKwkJCQkmJiBjbWQtPlNDcC5TdGF0dXMgIT0gR09PRCkKKwkJCQljbWQtPnJlc3VsdCA9CisJCQkJICAgIChjbWQtPgorCQkJCSAgICAgcmVzdWx0ICYgMHgwMGZmZmYpIHwgKERJRF9FUlJPUiA8PCAxNik7CisJCQllbHNlCisJCQkJY21kLT5yZXN1bHQgPQorCQkJCSAgICBjbWQtPlNDcC5TdGF0dXMgfCAoY21kLT5TQ3AuTWVzc2FnZSA8PCA4KTsKKwkJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCQlicmVhazsKKwkJY2FzZSBTX1BSRV9UTVBfRElTQzoKKwkJY2FzZSBTX1JVTk5JTkdfTEVWRUwyOgorCQkJY21kLT5ob3N0X3NjcmliYmxlID0gKHVjaGFyICopIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfUTsKKwkJCWhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfUSA9IGNtZDsKKwkJCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19VTkNPTk5FQ1RFRDsKKworI2lmZGVmIFBST0NfU1RBVElTVElDUworCQkJaG9zdGRhdGEtPmRpc2NfZG9uZV9jbnRbY21kLT5kZXZpY2UtPmlkXSsrOworI2VuZGlmCisKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCIqKiogVW5leHBlY3RlZCBESVNDT05ORUNUIGludGVycnVwdCEgKioqIik7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOworCQl9CisKKy8qIFdlIGFyZSBubyBsb25nZXIgY29ubmVjdGVkIHRvIGEgdGFyZ2V0IC0gY2hlY2sgdG8gc2VlIGlmCisgKiB0aGVyZSBhcmUgY29tbWFuZHMgd2FpdGluZyB0byBiZSBleGVjdXRlZC4KKyAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0ZGF0YS0+bG9jaywgZmxhZ3MpOworCQl3ZDMzYzkzX2V4ZWN1dGUoaW5zdGFuY2UpOworCQlicmVhazsKKworCWNhc2UgQ1NSX1JFU0VMX0FNOgorCWNhc2UgQ1NSX1JFU0VMOgorCQlEQihEQl9JTlRSLCBwcmludGsoIlJFU0VMJXMiLCBzciA9PSBDU1JfUkVTRUxfQU0gPyAiX0FNIiA6ICIiKSkKKworCQkgICAgLyogT2xkIGNoaXBzIChwcmUgLUEgPz8/KSBkb24ndCBoYXZlIGFkdmFuY2VkIGZlYXR1cmVzIGFuZCB3aWxsCisJCSAgICAgKiBnZW5lcmF0ZSBDU1JfUkVTRUwuICBJbiB0aGF0IGNhc2Ugd2UgaGF2ZSB0byBleHRyYWN0IHRoZSBMVU4gdGhlCisJCSAgICAgKiBoYXJkIHdheSAoc2VlIGJlbG93KS4KKwkJICAgICAqIEZpcnN0IHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoaXMgcmVzZWxlY3Rpb24gZGlkbid0CisJCSAgICAgKiBoYXBwZW4gZHVyaW5nIEFyYml0cmF0aW9uL1NlbGVjdGlvbiBvZiBzb21lIG90aGVyIGRldmljZS4KKwkJICAgICAqIElmIHllcywgcHV0IGxvc2luZyBjb21tYW5kIGJhY2sgb24gdG9wIG9mIGlucHV0X1EuCisJCSAgICAgKi8KKwkJICAgIGlmIChob3N0ZGF0YS0+bGV2ZWwyIDw9IEwyX05PTkUpIHsKKworCQkJaWYgKGhvc3RkYXRhLT5zZWxlY3RpbmcpIHsKKwkJCQljbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBob3N0ZGF0YS0+c2VsZWN0aW5nOworCQkJCWhvc3RkYXRhLT5zZWxlY3RpbmcgPSBOVUxMOworCQkJCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCQkJCWNtZC0+aG9zdF9zY3JpYmJsZSA9CisJCQkJICAgICh1Y2hhciAqKSBob3N0ZGF0YS0+aW5wdXRfUTsKKwkJCQlob3N0ZGF0YS0+aW5wdXRfUSA9IGNtZDsKKwkJCX0KKwkJfQorCisJCWVsc2UgeworCisJCQlpZiAoY21kKSB7CisJCQkJaWYgKHBocyA9PSAweDAwKSB7CisJCQkJCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0KKwkJCQkJICAgIH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKwkJCQkJY21kLT5ob3N0X3NjcmliYmxlID0KKwkJCQkJICAgICh1Y2hhciAqKSBob3N0ZGF0YS0+aW5wdXRfUTsKKwkJCQkJaG9zdGRhdGEtPmlucHV0X1EgPSBjbWQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRrCisJCQkJCSAgICAoIi0tLSUwMng6JTAyeDolMDJ4LVRST1VCTEU6IEludHJ1c2l2ZSBSZVNlbGVjdCEtLS0iLAorCQkJCQkgICAgIGFzciwgc3IsIHBocyk7CisJCQkJCXdoaWxlICgxKQorCQkJCQkJcHJpbnRrKCJcciIpOworCQkJCX0KKwkJCX0KKworCQl9CisKKwkJLyogT0sgLSBmaW5kIG91dCB3aGljaCBkZXZpY2UgcmVzZWxlY3RlZCB1cy4gKi8KKworCQlpZCA9IHJlYWRfd2QzM2M5MyhyZWdzLCBXRF9TT1VSQ0VfSUQpOworCQlpZCAmPSBTUkNJRF9NQVNLOworCisJCS8qIGFuZCBleHRyYWN0IHRoZSBsdW4gZnJvbSB0aGUgSUQgbWVzc2FnZS4gKE5vdGUgdGhhdCB3ZSBkb24ndAorCQkgKiBib3RoZXIgdG8gY2hlY2sgZm9yIGEgdmFsaWQgbWVzc2FnZSBoZXJlIC0gSSBndWVzcyB0aGlzIGlzCisJCSAqIG5vdCB0aGUgcmlnaHQgd2F5IHRvIGdvLCBidXQuLi4pCisJCSAqLworCisJCWlmIChzciA9PSBDU1JfUkVTRUxfQU0pIHsKKwkJCWx1biA9IHJlYWRfd2QzM2M5MyhyZWdzLCBXRF9EQVRBKTsKKwkJCWlmIChob3N0ZGF0YS0+bGV2ZWwyIDwgTDJfUkVTRUxFQ1QpCisJCQkJd3JpdGVfd2QzM2M5M19jbWQocmVncywgV0RfQ01EX05FR0FURV9BQ0spOworCQkJbHVuICY9IDc7CisJCX0gZWxzZSB7CisJCQkvKiBPbGQgY2hpcDsgd2FpdCBmb3IgbXNnaW4gcGhhc2UgdG8gcGljayB1cCB0aGUgTFVOLiAqLworCQkJZm9yIChsdW4gPSAyNTU7IGx1bjsgbHVuLS0pIHsKKwkJCQlpZiAoKGFzciA9IHJlYWRfYXV4X3N0YXQocmVncykpICYgQVNSX0lOVCkKKwkJCQkJYnJlYWs7CisJCQkJdWRlbGF5KDEwKTsKKwkJCX0KKwkJCWlmICghKGFzciAmIEFTUl9JTlQpKSB7CisJCQkJcHJpbnRrCisJCQkJICAgICgid2QzM2M5MzogUmVzZWxlY3RlZCB3aXRob3V0IElERU5USUZZXG4iKTsKKwkJCQlsdW4gPSAwOworCQkJfSBlbHNlIHsKKwkJCQkvKiBWZXJpZnkgdGhpcyBpcyBhIGNoYW5nZSB0byBNU0dfSU4gYW5kIHJlYWQgdGhlIG1lc3NhZ2UgKi8KKwkJCQlzciA9IHJlYWRfd2QzM2M5MyhyZWdzLCBXRF9TQ1NJX1NUQVRVUyk7CisJCQkJaWYgKHNyID09IChDU1JfQUJPUlQgfCBQSFNfTUVTU19JTikgfHwKKwkJCQkgICAgc3IgPT0gKENTUl9VTkVYUCB8IFBIU19NRVNTX0lOKSB8fAorCQkJCSAgICBzciA9PSAoQ1NSX1NSVl9SRVEgfCBQSFNfTUVTU19JTikpIHsKKwkJCQkJLyogR290IE1TR19JTiwgZ3JhYiB0YXJnZXQgTFVOICovCisJCQkJCWx1biA9IHJlYWRfMV9ieXRlKHJlZ3MpOworCQkJCQkvKiBOb3cgd2UgZXhwZWN0IGEgJ3BhdXNlZCB3aXRoIEFDSyBhc3NlcnRlZCcgaW50Li4gKi8KKwkJCQkJYXNyID0gcmVhZF9hdXhfc3RhdChyZWdzKTsKKwkJCQkJaWYgKCEoYXNyICYgQVNSX0lOVCkpIHsKKwkJCQkJCXVkZWxheSgxMCk7CisJCQkJCQlhc3IgPSByZWFkX2F1eF9zdGF0KHJlZ3MpOworCQkJCQkJaWYgKCEoYXNyICYgQVNSX0lOVCkpCisJCQkJCQkJcHJpbnRrCisJCQkJCQkJICAgICgid2QzM2M5MzogTm8gaW50IGFmdGVyIExVTiBvbiBSRVNFTCAoJTAyeClcbiIsCisJCQkJCQkJICAgICBhc3IpOworCQkJCQl9CisJCQkJCXNyID0gcmVhZF93ZDMzYzkzKHJlZ3MsIFdEX1NDU0lfU1RBVFVTKTsKKwkJCQkJaWYgKHNyICE9IENTUl9NU0dJTikKKwkJCQkJCXByaW50aworCQkJCQkJICAgICgid2QzM2M5MzogTm90IHBhdXNlZCB3aXRoIEFDSyBvbiBSRVNFTCAoJTAyeClcbiIsCisJCQkJCQkgICAgIHNyKTsKKwkJCQkJbHVuICY9IDc7CisJCQkJCXdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsCisJCQkJCQkJICBXRF9DTURfTkVHQVRFX0FDSyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRrCisJCQkJCSAgICAoIndkMzNjOTM6IE5vdCBNU0dfSU4gb24gcmVzZWxlY3QgKCUwMngpXG4iLAorCQkJCQkgICAgIHNyKTsKKwkJCQkJbHVuID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBOb3cgd2UgbG9vayBmb3IgdGhlIGNvbW1hbmQgdGhhdCdzIHJlY29ubmVjdGluZy4gKi8KKworCQljbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX1E7CisJCXBhdGNoID0gTlVMTDsKKwkJd2hpbGUgKGNtZCkgeworCQkJaWYgKGlkID09IGNtZC0+ZGV2aWNlLT5pZCAmJiBsdW4gPT0gY21kLT5kZXZpY2UtPmx1bikKKwkJCQlicmVhazsKKwkJCXBhdGNoID0gY21kOworCQkJY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgY21kLT5ob3N0X3NjcmliYmxlOworCQl9CisKKwkJLyogSG1tLiBDb3VsZG4ndCBmaW5kIGEgdmFsaWQgY29tbWFuZC4uLi4gV2hhdCB0byBkbz8gKi8KKworCQlpZiAoIWNtZCkgeworCQkJcHJpbnRrCisJCQkgICAgKCItLS1UUk9VQkxFOiB0YXJnZXQgJWQuJWQgbm90IGluIGRpc2Nvbm5lY3QgcXVldWUtLS0iLAorCQkJICAgICBpZCwgbHVuKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RkYXRhLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBPaywgZm91bmQgdGhlIGNvbW1hbmQgLSBub3cgc3RhcnQgaXQgdXAgYWdhaW4uICovCisKKwkJaWYgKHBhdGNoKQorCQkJcGF0Y2gtPmhvc3Rfc2NyaWJibGUgPSBjbWQtPmhvc3Rfc2NyaWJibGU7CisJCWVsc2UKKwkJCWhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfUSA9CisJCQkgICAgKHN0cnVjdCBzY3NpX2NtbmQgKikgY21kLT5ob3N0X3NjcmliYmxlOworCQlob3N0ZGF0YS0+Y29ubmVjdGVkID0gY21kOworCisJCS8qIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgJ2luaXRpYWxpemVfU0NwKCknIG9yICdob3N0ZGF0YS0+YnVzeVtdJworCQkgKiBiZWNhdXNlIHRoZXNlIHRoaW5ncyBhcmUgcHJlc2VydmVkIG92ZXIgYSBkaXNjb25uZWN0LgorCQkgKiBCdXQgd2UgRE8gbmVlZCB0byBmaXggdGhlIERQRCBiaXQgc28gaXQncyBjb3JyZWN0IGZvciB0aGlzIGNvbW1hbmQuCisJCSAqLworCisJCWlmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpCisJCQl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX0RFU1RJTkFUSU9OX0lELCBjbWQtPmRldmljZS0+aWQpOworCQllbHNlCisJCQl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX0RFU1RJTkFUSU9OX0lELAorCQkJCSAgICAgIGNtZC0+ZGV2aWNlLT5pZCB8IERTVElEX0RQRCk7CisJCWlmIChob3N0ZGF0YS0+bGV2ZWwyID49IEwyX1JFU0VMRUNUKSB7CisJCQl3cml0ZV93ZDMzYzkzX2NvdW50KHJlZ3MsIDApOwkvKiB3ZSB3YW50IGEgREFUQV9QSEFTRSBpbnRlcnJ1cHQgKi8KKwkJCXdyaXRlX3dkMzNjOTMocmVncywgV0RfQ09NTUFORF9QSEFTRSwgMHg0NSk7CisJCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBXRF9DTURfU0VMX0FUTl9YRkVSKTsKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfUlVOTklOR19MRVZFTDI7CisJCX0gZWxzZQorCQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7CisKKwkJREIoREJfSU5UUiwgcHJpbnRrKCItJWxkIiwgY21kLT5waWQpKQorCQkgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdGRhdGEtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoIi0tVU5LTk9XTiBJTlRFUlJVUFQ6JTAyeDolMDJ4OiUwMngtLSIsIGFzciwgc3IsIHBocyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RkYXRhLT5sb2NrLCBmbGFncyk7CisJfQorCisJREIoREJfSU5UUiwgcHJpbnRrKCJ9ICIpKQorCit9CisKK3N0YXRpYyB2b2lkCityZXNldF93ZDMzYzkzKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworCXN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhICpob3N0ZGF0YSA9CisJICAgIChzdHJ1Y3QgV0QzM0M5M19ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisJY29uc3Qgd2QzM2M5M19yZWdzIHJlZ3MgPSBob3N0ZGF0YS0+cmVnczsKKwl1Y2hhciBzcjsKKworI2lmZGVmIENPTkZJR19TR0lfSVAyMgorCXsKKwkJaW50IGJ1c3ljb3VudCA9IDA7CisJCWV4dGVybiB2b2lkIHNnaXdkOTNfcmVzZXQodW5zaWduZWQgbG9uZyk7CisJCS8qIHdhaXQgJ3RpbCB0aGUgY2hpcCBnZXRzIHNvbWUgdGltZSBmb3IgdXMgKi8KKwkJd2hpbGUgKChyZWFkX2F1eF9zdGF0KHJlZ3MpICYgQVNSX0JTWSkgJiYgYnVzeWNvdW50KysgPCAxMDApCisJCQl1ZGVsYXkgKDEwKTsKKwkvKgorIAkgKiB0aGVyZSBhcmUgc2NzaSBkZXZpY2VzIG91dCB0aGVyZSwgd2hpY2ggbWFuYWdlIHRvIGxvY2sgdXAKKwkgKiB0aGUgd2QzM2M5MyBpbiBhIGJ1c3kgY29uZGl0aW9uLiBJbiB0aGlzIHN0YXRlIGl0IHdvbid0CisJICogYWNjZXB0IHRoZSByZXNldCBjb21tYW5kLiBUaGUgb25seSB3YXkgdG8gc29sdmUgdGhpcyBpcyB0bworIAkgKiBnaXZlIHRoZSBjaGlwIGEgaGFyZHdhcmUgcmVzZXQgKGlmIHBvc3NpYmxlKS4gVGhlIGNvZGUgYmVsb3cKKwkgKiBkb2VzIHRoaXMgZm9yIHRoZSBTR0kgSW5keSwgd2hlcmUgdGhpcyBpcyBwb3NzaWJsZQorCSAqLworCS8qIHN0aWxsIGJ1c3kgPyAqLworCWlmIChyZWFkX2F1eF9zdGF0KHJlZ3MpICYgQVNSX0JTWSkKKwkJc2dpd2Q5M19yZXNldChpbnN0YW5jZS0+YmFzZSk7IC8qIHllYWgsIGdpdmUgaXQgdGhlIGhhcmQgb25lICovCisJfQorI2VuZGlmCisKKwl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX09XTl9JRCwgT1dOSURfRUFGIHwgT1dOSURfUkFGIHwKKwkJICAgICAgaW5zdGFuY2UtPnRoaXNfaWQgfCBob3N0ZGF0YS0+Y2xvY2tfZnJlcSk7CisJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9DT05UUk9MLCBDVFJMX0lESSB8IENUUkxfRURJIHwgQ1RSTF9QT0xMRUQpOworCXdyaXRlX3dkMzNjOTMocmVncywgV0RfU1lOQ0hST05PVVNfVFJBTlNGRVIsCisJCSAgICAgIGNhbGNfc3luY194ZmVyKGhvc3RkYXRhLT5kZWZhdWx0X3N4X3BlciAvIDQsCisJCQkJICAgICBERUZBVUxUX1NYX09GRikpOworCXdyaXRlX3dkMzNjOTMocmVncywgV0RfQ09NTUFORCwgV0RfQ01EX1JFU0VUKTsKKworCisjaWZkZWYgQ09ORklHX01WTUUxNDdfU0NTSQorCXVkZWxheSgyNSk7CQkvKiBUaGUgb2xkIHdkMzNjOTMgb24gTVZNRTE0NyBuZWVkcyB0aGlzLCBhdCBsZWFzdCAqLworI2VuZGlmCisKKwl3aGlsZSAoIShyZWFkX2F1eF9zdGF0KHJlZ3MpICYgQVNSX0lOVCkpCisJCTsKKwlzciA9IHJlYWRfd2QzM2M5MyhyZWdzLCBXRF9TQ1NJX1NUQVRVUyk7CisKKwlob3N0ZGF0YS0+bWljcm9jb2RlID0gcmVhZF93ZDMzYzkzKHJlZ3MsIFdEX0NEQl8xKTsKKwlpZiAoc3IgPT0gMHgwMCkKKwkJaG9zdGRhdGEtPmNoaXAgPSBDX1dEMzNDOTM7CisJZWxzZSBpZiAoc3IgPT0gMHgwMSkgeworCQl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX1FVRVVFX1RBRywgMHhhNSk7CS8qIGFueSByYW5kb20gbnVtYmVyICovCisJCXNyID0gcmVhZF93ZDMzYzkzKHJlZ3MsIFdEX1FVRVVFX1RBRyk7CisJCWlmIChzciA9PSAweGE1KSB7CisJCQlob3N0ZGF0YS0+Y2hpcCA9IENfV0QzM0M5M0I7CisJCQl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX1FVRVVFX1RBRywgMCk7CisJCX0gZWxzZQorCQkJaG9zdGRhdGEtPmNoaXAgPSBDX1dEMzNDOTNBOworCX0gZWxzZQorCQlob3N0ZGF0YS0+Y2hpcCA9IENfVU5LTk9XTl9DSElQOworCisJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9USU1FT1VUX1BFUklPRCwgVElNRU9VVF9QRVJJT0RfVkFMVUUpOworCXdyaXRlX3dkMzNjOTMocmVncywgV0RfQ09OVFJPTCwgQ1RSTF9JREkgfCBDVFJMX0VESSB8IENUUkxfUE9MTEVEKTsKK30KKworaW50Cit3ZDMzYzkzX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlOworCXN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhICpob3N0ZGF0YTsKKwlpbnQgaTsKKworCWluc3RhbmNlID0gU0NwbnQtPmRldmljZS0+aG9zdDsKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgV0QzM0M5M19ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisKKwlwcmludGsoInNjc2klZDogcmVzZXQuICIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwlkaXNhYmxlX2lycShpbnN0YW5jZS0+aXJxKTsKKworCWhvc3RkYXRhLT5kbWFfc3RvcChpbnN0YW5jZSwgTlVMTCwgMCk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlob3N0ZGF0YS0+YnVzeVtpXSA9IDA7CisJCWhvc3RkYXRhLT5zeW5jX3hmZXJbaV0gPQorCQkgICAgY2FsY19zeW5jX3hmZXIoREVGQVVMVF9TWF9QRVIgLyA0LCBERUZBVUxUX1NYX09GRik7CisJCWhvc3RkYXRhLT5zeW5jX3N0YXRbaV0gPSBTU19VTlNFVDsJLyogdXNpbmcgZGVmYXVsdCBzeW5jIHZhbHVlcyAqLworCX0KKwlob3N0ZGF0YS0+aW5wdXRfUSA9IE5VTEw7CisJaG9zdGRhdGEtPnNlbGVjdGluZyA9IE5VTEw7CisJaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisJaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9RID0gTlVMTDsKKwlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOworCWhvc3RkYXRhLT5kbWEgPSBEX0RNQV9PRkY7CisJaG9zdGRhdGEtPmluY29taW5nX3B0ciA9IDA7CisJaG9zdGRhdGEtPm91dGdvaW5nX2xlbiA9IDA7CisKKwlyZXNldF93ZDMzYzkzKGluc3RhbmNlKTsKKwlTQ3BudC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCWVuYWJsZV9pcnEoaW5zdGFuY2UtPmlycSk7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK2ludAord2QzM2M5M19hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICogY21kKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlOworCXN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhICpob3N0ZGF0YTsKKwl3ZDMzYzkzX3JlZ3MgcmVnczsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICp0bXAsICpwcmV2OworCisJZGlzYWJsZV9pcnEoY21kLT5kZXZpY2UtPmhvc3QtPmlycSk7CisKKwlpbnN0YW5jZSA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCWhvc3RkYXRhID0gKHN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKKwlyZWdzID0gaG9zdGRhdGEtPnJlZ3M7CisKKy8qCisgKiBDYXNlIDEgOiBJZiB0aGUgY29tbWFuZCBoYXNuJ3QgYmVlbiBpc3N1ZWQgeWV0LCB3ZSBzaW1wbHkgcmVtb3ZlIGl0CisgKiAgICAgZnJvbSB0aGUgaW5wdXRfUS4KKyAqLworCisJdG1wID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaG9zdGRhdGEtPmlucHV0X1E7CisJcHJldiA9IDA7CisJd2hpbGUgKHRtcCkgeworCQlpZiAodG1wID09IGNtZCkgeworCQkJaWYgKHByZXYpCisJCQkJcHJldi0+aG9zdF9zY3JpYmJsZSA9IGNtZC0+aG9zdF9zY3JpYmJsZTsKKwkJCWVsc2UKKwkJCQlob3N0ZGF0YS0+aW5wdXRfUSA9CisJCQkJICAgIChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNtZC0+aG9zdF9zY3JpYmJsZTsKKwkJCWNtZC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJCQljbWQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKwkJCXByaW50aworCQkJICAgICgic2NzaSVkOiBBYm9ydCAtIHJlbW92aW5nIGNvbW1hbmQgJWxkIGZyb20gaW5wdXRfUS4gIiwKKwkJCSAgICAgaW5zdGFuY2UtPmhvc3Rfbm8sIGNtZC0+cGlkKTsKKwkJCWVuYWJsZV9pcnEoY21kLT5kZXZpY2UtPmhvc3QtPmlycSk7CisJCQljbWQtPnNjc2lfZG9uZShjbWQpOworCQkJcmV0dXJuIFNVQ0NFU1M7CisJCX0KKwkJcHJldiA9IHRtcDsKKwkJdG1wID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgdG1wLT5ob3N0X3NjcmliYmxlOworCX0KKworLyoKKyAqIENhc2UgMiA6IElmIHRoZSBjb21tYW5kIGlzIGNvbm5lY3RlZCwgd2UncmUgZ29pbmcgdG8gZmFpbCB0aGUgYWJvcnQKKyAqICAgICBhbmQgbGV0IHRoZSBoaWdoIGxldmVsIFNDU0kgZHJpdmVyIHJldHJ5IGF0IGEgbGF0ZXIgdGltZSBvcgorICogICAgIGlzc3VlIGEgcmVzZXQuCisgKgorICogICAgIFRpbWVvdXRzLCBhbmQgdGhlcmVmb3JlIGFib3J0ZWQgY29tbWFuZHMsIHdpbGwgYmUgaGlnaGx5IHVubGlrZWx5CisgKiAgICAgYW5kIGhhbmRsaW5nIHRoZW0gY2xlYW5seSBpbiB0aGlzIHNpdHVhdGlvbiB3b3VsZCBtYWtlIHRoZSBjb21tb24KKyAqICAgICBjYXNlIG9mIG5vcmVzZXRzIGxlc3MgZWZmaWNpZW50LCBhbmQgd291bGQgcG9sbHV0ZSBvdXIgY29kZS4gIFNvLAorICogICAgIHdlIGZhaWwuCisgKi8KKworCWlmIChob3N0ZGF0YS0+Y29ubmVjdGVkID09IGNtZCkgeworCQl1Y2hhciBzciwgYXNyOworCQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwkJcHJpbnRrKCJzY3NpJWQ6IEFib3J0aW5nIGNvbm5lY3RlZCBjb21tYW5kICVsZCAtICIsCisJCSAgICAgICBpbnN0YW5jZS0+aG9zdF9ubywgY21kLT5waWQpOworCisJCXByaW50aygic3RvcHBpbmcgRE1BIC0gIik7CisJCWlmIChob3N0ZGF0YS0+ZG1hID09IERfRE1BX1JVTk5JTkcpIHsKKwkJCWhvc3RkYXRhLT5kbWFfc3RvcChpbnN0YW5jZSwgY21kLCAwKTsKKwkJCWhvc3RkYXRhLT5kbWEgPSBEX0RNQV9PRkY7CisJCX0KKworCQlwcmludGsoInNlbmRpbmcgd2QzM2M5MyBBQk9SVCBjb21tYW5kIC0gIik7CisJCXdyaXRlX3dkMzNjOTMocmVncywgV0RfQ09OVFJPTCwKKwkJCSAgICAgIENUUkxfSURJIHwgQ1RSTF9FREkgfCBDVFJMX1BPTExFRCk7CisJCXdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsIFdEX0NNRF9BQk9SVCk7CisKKy8qIE5vdyB3ZSBoYXZlIHRvIGF0dGVtcHQgdG8gZmx1c2ggb3V0IHRoZSBGSUZPLi4uICovCisKKwkJcHJpbnRrKCJmbHVzaGluZyBmaWZvIC0gIik7CisJCXRpbWVvdXQgPSAxMDAwMDAwOworCQlkbyB7CisJCQlhc3IgPSByZWFkX2F1eF9zdGF0KHJlZ3MpOworCQkJaWYgKGFzciAmIEFTUl9EQlIpCisJCQkJcmVhZF93ZDMzYzkzKHJlZ3MsIFdEX0RBVEEpOworCQl9IHdoaWxlICghKGFzciAmIEFTUl9JTlQpICYmIHRpbWVvdXQtLSA+IDApOworCQlzciA9IHJlYWRfd2QzM2M5MyhyZWdzLCBXRF9TQ1NJX1NUQVRVUyk7CisJCXByaW50aworCQkgICAgKCJhc3I9JTAyeCwgc3I9JTAyeCwgJWxkIGJ5dGVzIHVuLXRyYW5zZmVycmVkICh0aW1lb3V0PSVsZCkgLSAiLAorCQkgICAgIGFzciwgc3IsIHJlYWRfd2QzM2M5M19jb3VudChyZWdzKSwgdGltZW91dCk7CisKKwkJLyoKKwkJICogQWJvcnQgY29tbWFuZCBwcm9jZXNzZWQuCisJCSAqIFN0aWxsIGNvbm5lY3RlZC4KKwkJICogV2UgbXVzdCBkaXNjb25uZWN0LgorCQkgKi8KKworCQlwcmludGsoInNlbmRpbmcgd2QzM2M5MyBESVNDT05ORUNUIGNvbW1hbmQgLSAiKTsKKwkJd3JpdGVfd2QzM2M5M19jbWQocmVncywgV0RfQ01EX0RJU0NPTk5FQ1QpOworCisJCXRpbWVvdXQgPSAxMDAwMDAwOworCQlhc3IgPSByZWFkX2F1eF9zdGF0KHJlZ3MpOworCQl3aGlsZSAoKGFzciAmIEFTUl9DSVApICYmIHRpbWVvdXQtLSA+IDApCisJCQlhc3IgPSByZWFkX2F1eF9zdGF0KHJlZ3MpOworCQlzciA9IHJlYWRfd2QzM2M5MyhyZWdzLCBXRF9TQ1NJX1NUQVRVUyk7CisJCXByaW50aygiYXNyPSUwMngsIHNyPSUwMnguIiwgYXNyLCBzcik7CisKKwkJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmPSB+KDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisJCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOworCQljbWQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKworLyogICAgICBzdGkoKTsqLworCQl3ZDMzYzkzX2V4ZWN1dGUoaW5zdGFuY2UpOworCisJCWVuYWJsZV9pcnEoY21kLT5kZXZpY2UtPmhvc3QtPmlycSk7CisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCXJldHVybiBTVUNDRVNTOworCX0KKworLyoKKyAqIENhc2UgMzogSWYgdGhlIGNvbW1hbmQgaXMgY3VycmVudGx5IGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBidXMsCisgKiB3ZSdyZSBub3QgZ29pbmcgdG8gZXhwZW5kIG11Y2ggZWZmb3J0IGhlcmU6IExldCdzIGp1c3QgcmV0dXJuCisgKiBhbiBBQk9SVF9TTk9PWkUgYW5kIGhvcGUgZm9yIHRoZSBiZXN0Li4uCisgKi8KKworCXRtcCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfUTsKKwl3aGlsZSAodG1wKSB7CisJCWlmICh0bXAgPT0gY21kKSB7CisJCQlwcmludGsKKwkJCSAgICAoInNjc2klZDogQWJvcnQgLSBjb21tYW5kICVsZCBmb3VuZCBvbiBkaXNjb25uZWN0ZWRfUSAtICIsCisJCQkgICAgIGluc3RhbmNlLT5ob3N0X25vLCBjbWQtPnBpZCk7CisJCQlwcmludGsoIkFib3J0IFNOT09aRS4gIik7CisJCQllbmFibGVfaXJxKGNtZC0+ZGV2aWNlLT5ob3N0LT5pcnEpOworCQkJcmV0dXJuIEZBSUxFRDsKKwkJfQorCQl0bXAgPSAoc3RydWN0IHNjc2lfY21uZCAqKSB0bXAtPmhvc3Rfc2NyaWJibGU7CisJfQorCisvKgorICogQ2FzZSA0IDogSWYgd2UgcmVhY2hlZCB0aGlzIHBvaW50LCB0aGUgY29tbWFuZCB3YXMgbm90IGZvdW5kIGluIGFueSBvZgorICogICAgIHRoZSBxdWV1ZXMuCisgKgorICogV2UgcHJvYmFibHkgcmVhY2hlZCB0aGlzIHBvaW50IGJlY2F1c2Ugb2YgYW4gdW5saWtlbHkgcmFjZSBjb25kaXRpb24KKyAqIGJldHdlZW4gdGhlIGNvbW1hbmQgY29tcGxldGluZyBzdWNjZXNzZnVsbHkgYW5kIHRoZSBhYm9ydGlvbiBjb2RlLAorICogc28gd2Ugd29uJ3QgcGFuaWMsIGJ1dCB3ZSB3aWxsIG5vdGlmeSB0aGUgdXNlciBpbiBjYXNlIHNvbWV0aGluZyByZWFsbHkKKyAqIGJyb2tlLgorICovCisKKy8qICAgc3RpKCk7Ki8KKwl3ZDMzYzkzX2V4ZWN1dGUoaW5zdGFuY2UpOworCisJZW5hYmxlX2lycShjbWQtPmRldmljZS0+aG9zdC0+aXJxKTsKKwlwcmludGsoInNjc2klZDogd2FybmluZyA6IFNDU0kgY29tbWFuZCBwcm9iYWJseSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IgorCSAgICAgICAiICAgICAgICAgYmVmb3JlIGFib3J0aW9uLiAiLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJcmV0dXJuIEZBSUxFRDsKK30KKworI2RlZmluZSBNQVhfV0QzM0M5M19IT1NUUyA0CisjZGVmaW5lIE1BWF9TRVRVUF9BUkdTICgoaW50KShzaXplb2Yoc2V0dXBfYXJncykgLyBzaXplb2YoY2hhciAqKSkpCisjZGVmaW5lIFNFVFVQX0JVRkZFUl9TSVpFIDIwMAorc3RhdGljIGNoYXIgc2V0dXBfYnVmZmVyW1NFVFVQX0JVRkZFUl9TSVpFXTsKK3N0YXRpYyBjaGFyIHNldHVwX3VzZWRbTUFYX1NFVFVQX0FSR1NdOworc3RhdGljIGludCBkb25lX3NldHVwID0gMDsKKworaW50Cit3ZDMzYzkzX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgaTsKKwljaGFyICpwMSwgKnAyOworCisJLyogVGhlIGtlcm5lbCBkb2VzIHNvbWUgcHJvY2Vzc2luZyBvZiB0aGUgY29tbWFuZC1saW5lIGJlZm9yZSBjYWxsaW5nCisJICogdGhpcyBmdW5jdGlvbjogSWYgaXQgYmVnaW5zIHdpdGggYW55IGRlY2ltYWwgb3IgaGV4IG51bWJlciBhcmd1bWVudHMsCisJICogaW50c1swXSA9IGhvdyBtYW55IG51bWJlcnMgZm91bmQgYW5kIGludHNbMV0gdGhyb3VnaCBbbl0gYXJlIHRoZSB2YWx1ZXMKKwkgKiB0aGVtc2VsdmVzLiBzdHIgcG9pbnRzIHRvIHdoZXJlIHRoZSBub24tbnVtZXJpYyBhcmd1bWVudHMgKGlmIGFueSkKKwkgKiBzdGFydDogV2UgZG8gb3VyIG93biBwYXJzaW5nIG9mIHRob3NlLiBXZSBjb25zdHJ1Y3Qgc3ludGhldGljICdub3N5bmMnCisJICoga2V5d29yZHMgb3V0IG9mIG51bWVyaWMgYXJncyAodG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyCisJICogdmVyc2lvbnMpIGFuZCB0aGVuIGFkZCB0aGUgcmVzdCBvZiB0aGUgYXJndW1lbnRzLgorCSAqLworCisJcDEgPSBzZXR1cF9idWZmZXI7CisJKnAxID0gJ1wwJzsKKwlpZiAoc3RyKQorCQlzdHJuY3B5KHAxLCBzdHIsIFNFVFVQX0JVRkZFUl9TSVpFIC0gc3RybGVuKHNldHVwX2J1ZmZlcikpOworCXNldHVwX2J1ZmZlcltTRVRVUF9CVUZGRVJfU0laRSAtIDFdID0gJ1wwJzsKKwlwMSA9IHNldHVwX2J1ZmZlcjsKKwlpID0gMDsKKwl3aGlsZSAoKnAxICYmIChpIDwgTUFYX1NFVFVQX0FSR1MpKSB7CisJCXAyID0gc3RyY2hyKHAxLCAnLCcpOworCQlpZiAocDIpIHsKKwkJCSpwMiA9ICdcMCc7CisJCQlpZiAocDEgIT0gcDIpCisJCQkJc2V0dXBfYXJnc1tpXSA9IHAxOworCQkJcDEgPSBwMiArIDE7CisJCQlpKys7CisJCX0gZWxzZSB7CisJCQlzZXR1cF9hcmdzW2ldID0gcDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1NFVFVQX0FSR1M7IGkrKykKKwkJc2V0dXBfdXNlZFtpXSA9IDA7CisJZG9uZV9zZXR1cCA9IDE7CisKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoIndkMzNjOTM9Iiwgd2QzM2M5M19zZXR1cCk7CisKKy8qIGNoZWNrX3NldHVwX2FyZ3MoKSByZXR1cm5zIGluZGV4IGlmIGtleSBmb3VuZCwgMCBpZiBub3QKKyAqLworc3RhdGljIGludAorY2hlY2tfc2V0dXBfYXJncyhjaGFyICprZXksIGludCAqZmxhZ3MsIGludCAqdmFsLCBjaGFyICpidWYpCit7CisJaW50IHg7CisJY2hhciAqY3A7CisKKwlmb3IgKHggPSAwOyB4IDwgTUFYX1NFVFVQX0FSR1M7IHgrKykgeworCQlpZiAoc2V0dXBfdXNlZFt4XSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXN0cm5jbXAoc2V0dXBfYXJnc1t4XSwga2V5LCBzdHJsZW4oa2V5KSkpCisJCQlicmVhazsKKwkJaWYgKCFzdHJuY21wKHNldHVwX2FyZ3NbeF0sICJuZXh0Iiwgc3RybGVuKCJuZXh0IikpKQorCQkJcmV0dXJuIDA7CisJfQorCWlmICh4ID09IE1BWF9TRVRVUF9BUkdTKQorCQlyZXR1cm4gMDsKKwlzZXR1cF91c2VkW3hdID0gMTsKKwljcCA9IHNldHVwX2FyZ3NbeF0gKyBzdHJsZW4oa2V5KTsKKwkqdmFsID0gLTE7CisJaWYgKCpjcCAhPSAnOicpCisJCXJldHVybiArK3g7CisJY3ArKzsKKwlpZiAoKCpjcCA+PSAnMCcpICYmICgqY3AgPD0gJzknKSkgeworCQkqdmFsID0gc2ltcGxlX3N0cnRvdWwoY3AsIE5VTEwsIDApOworCX0KKwlyZXR1cm4gKyt4OworfQorCit2b2lkCit3ZDMzYzkzX2luaXQoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGNvbnN0IHdkMzNjOTNfcmVncyByZWdzLAorCSAgICAgZG1hX3NldHVwX3Qgc2V0dXAsIGRtYV9zdG9wX3Qgc3RvcCwgaW50IGNsb2NrX2ZyZXEpCit7CisJc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEgKmhvc3RkYXRhOworCWludCBpOworCWludCBmbGFnczsKKwlpbnQgdmFsOworCWNoYXIgYnVmWzMyXTsKKworCWlmICghZG9uZV9zZXR1cCAmJiBzZXR1cF9zdHJpbmdzKQorCQl3ZDMzYzkzX3NldHVwKHNldHVwX3N0cmluZ3MpOworCisJaG9zdGRhdGEgPSAoc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEgKikgaW5zdGFuY2UtPmhvc3RkYXRhOworCisJaG9zdGRhdGEtPnJlZ3MgPSByZWdzOworCWhvc3RkYXRhLT5jbG9ja19mcmVxID0gY2xvY2tfZnJlcTsKKwlob3N0ZGF0YS0+ZG1hX3NldHVwID0gc2V0dXA7CisJaG9zdGRhdGEtPmRtYV9zdG9wID0gc3RvcDsKKwlob3N0ZGF0YS0+ZG1hX2JvdW5jZV9idWZmZXIgPSBOVUxMOworCWhvc3RkYXRhLT5kbWFfYm91bmNlX2xlbiA9IDA7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlob3N0ZGF0YS0+YnVzeVtpXSA9IDA7CisJCWhvc3RkYXRhLT5zeW5jX3hmZXJbaV0gPQorCQkgICAgY2FsY19zeW5jX3hmZXIoREVGQVVMVF9TWF9QRVIgLyA0LCBERUZBVUxUX1NYX09GRik7CisJCWhvc3RkYXRhLT5zeW5jX3N0YXRbaV0gPSBTU19VTlNFVDsJLyogdXNpbmcgZGVmYXVsdCBzeW5jIHZhbHVlcyAqLworI2lmZGVmIFBST0NfU1RBVElTVElDUworCQlob3N0ZGF0YS0+Y21kX2NudFtpXSA9IDA7CisJCWhvc3RkYXRhLT5kaXNjX2FsbG93ZWRfY250W2ldID0gMDsKKwkJaG9zdGRhdGEtPmRpc2NfZG9uZV9jbnRbaV0gPSAwOworI2VuZGlmCisJfQorCWhvc3RkYXRhLT5pbnB1dF9RID0gTlVMTDsKKwlob3N0ZGF0YS0+c2VsZWN0aW5nID0gTlVMTDsKKwlob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKwlob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX1EgPSBOVUxMOworCWhvc3RkYXRhLT5zdGF0ZSA9IFNfVU5DT05ORUNURUQ7CisJaG9zdGRhdGEtPmRtYSA9IERfRE1BX09GRjsKKwlob3N0ZGF0YS0+bGV2ZWwyID0gTDJfQkFTSUM7CisJaG9zdGRhdGEtPmRpc2Nvbm5lY3QgPSBESVNfQURBUFRJVkU7CisJaG9zdGRhdGEtPmFyZ3MgPSBERUJVR19ERUZBVUxUUzsKKwlob3N0ZGF0YS0+aW5jb21pbmdfcHRyID0gMDsKKwlob3N0ZGF0YS0+b3V0Z29pbmdfbGVuID0gMDsKKwlob3N0ZGF0YS0+ZGVmYXVsdF9zeF9wZXIgPSBERUZBVUxUX1NYX1BFUjsKKwlob3N0ZGF0YS0+bm9fc3luYyA9IDB4ZmY7CS8qIHN5bmMgZGVmYXVsdHMgdG8gb2ZmICovCisJaG9zdGRhdGEtPm5vX2RtYSA9IDA7CS8qIGRlZmF1bHQgaXMgRE1BIGVuYWJsZWQgKi8KKworI2lmZGVmIFBST0NfSU5URVJGQUNFCisJaG9zdGRhdGEtPnByb2MgPSBQUl9WRVJTSU9OIHwgUFJfSU5GTyB8IFBSX1NUQVRJU1RJQ1MgfAorCSAgICBQUl9DT05ORUNURUQgfCBQUl9JTlBVVFEgfCBQUl9ESVNDUSB8IFBSX1NUT1A7CisjaWZkZWYgUFJPQ19TVEFUSVNUSUNTCisJaG9zdGRhdGEtPmRtYV9jbnQgPSAwOworCWhvc3RkYXRhLT5waW9fY250ID0gMDsKKwlob3N0ZGF0YS0+aW50X2NudCA9IDA7CisjZW5kaWYKKyNlbmRpZgorCisJaWYgKGNoZWNrX3NldHVwX2FyZ3MoIm5vc3luYyIsICZmbGFncywgJnZhbCwgYnVmKSkKKwkJaG9zdGRhdGEtPm5vX3N5bmMgPSB2YWw7CisKKwlpZiAoY2hlY2tfc2V0dXBfYXJncygibm9kbWEiLCAmZmxhZ3MsICZ2YWwsIGJ1ZikpCisJCWhvc3RkYXRhLT5ub19kbWEgPSAodmFsID09IC0xKSA/IDEgOiB2YWw7CisKKwlpZiAoY2hlY2tfc2V0dXBfYXJncygicGVyaW9kIiwgJmZsYWdzLCAmdmFsLCBidWYpKQorCQlob3N0ZGF0YS0+ZGVmYXVsdF9zeF9wZXIgPQorCQkgICAgc3hfdGFibGVbcm91bmRfcGVyaW9kKCh1bnNpZ25lZCBpbnQpIHZhbCldLnBlcmlvZF9uczsKKworCWlmIChjaGVja19zZXR1cF9hcmdzKCJkaXNjb25uZWN0IiwgJmZsYWdzLCAmdmFsLCBidWYpKSB7CisJCWlmICgodmFsID49IERJU19ORVZFUikgJiYgKHZhbCA8PSBESVNfQUxXQVlTKSkKKwkJCWhvc3RkYXRhLT5kaXNjb25uZWN0ID0gdmFsOworCQllbHNlCisJCQlob3N0ZGF0YS0+ZGlzY29ubmVjdCA9IERJU19BREFQVElWRTsKKwl9CisKKwlpZiAoY2hlY2tfc2V0dXBfYXJncygibGV2ZWwyIiwgJmZsYWdzLCAmdmFsLCBidWYpKQorCQlob3N0ZGF0YS0+bGV2ZWwyID0gdmFsOworCisJaWYgKGNoZWNrX3NldHVwX2FyZ3MoImRlYnVnIiwgJmZsYWdzLCAmdmFsLCBidWYpKQorCQlob3N0ZGF0YS0+YXJncyA9IHZhbCAmIERCX01BU0s7CisKKwlpZiAoY2hlY2tfc2V0dXBfYXJncygiY2xvY2siLCAmZmxhZ3MsICZ2YWwsIGJ1ZikpIHsKKwkJaWYgKHZhbCA+IDcgJiYgdmFsIDwgMTEpCisJCQl2YWwgPSBXRDMzQzkzX0ZTXzhfMTA7CisJCWVsc2UgaWYgKHZhbCA+IDExICYmIHZhbCA8IDE2KQorCQkJdmFsID0gV0QzM0M5M19GU18xMl8xNTsKKwkJZWxzZSBpZiAodmFsID4gMTUgJiYgdmFsIDwgMjEpCisJCQl2YWwgPSBXRDMzQzkzX0ZTXzE2XzIwOworCQllbHNlCisJCQl2YWwgPSBXRDMzQzkzX0ZTXzhfMTA7CisJCWhvc3RkYXRhLT5jbG9ja19mcmVxID0gdmFsOworCX0KKworCWlmICgoaSA9IGNoZWNrX3NldHVwX2FyZ3MoIm5leHQiLCAmZmxhZ3MsICZ2YWwsIGJ1ZikpKSB7CisJCXdoaWxlIChpKQorCQkJc2V0dXBfdXNlZFstLWldID0gMTsKKwl9CisjaWZkZWYgUFJPQ19JTlRFUkZBQ0UKKwlpZiAoY2hlY2tfc2V0dXBfYXJncygicHJvYyIsICZmbGFncywgJnZhbCwgYnVmKSkKKwkJaG9zdGRhdGEtPnByb2MgPSB2YWw7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnEoJmhvc3RkYXRhLT5sb2NrKTsKKwlyZXNldF93ZDMzYzkzKGluc3RhbmNlKTsKKwlzcGluX3VubG9ja19pcnEoJmhvc3RkYXRhLT5sb2NrKTsKKworCXByaW50aygid2QzM2M5My0lZDogY2hpcD0lcy8lZCBub19zeW5jPTB4JXggbm9fZG1hPSVkIiwKKwkgICAgICAgaW5zdGFuY2UtPmhvc3Rfbm8sCisJICAgICAgIChob3N0ZGF0YS0+Y2hpcCA9PSBDX1dEMzNDOTMpID8gIldEMzNjOTMiIDogKGhvc3RkYXRhLT5jaGlwID09CisJCQkJCQkJICAgIENfV0QzM0M5M0EpID8KKwkgICAgICAgIldEMzNjOTNBIiA6IChob3N0ZGF0YS0+Y2hpcCA9PQorCQkJICAgICBDX1dEMzNDOTNCKSA/ICJXRDMzYzkzQiIgOiAidW5rbm93biIsCisJICAgICAgIGhvc3RkYXRhLT5taWNyb2NvZGUsIGhvc3RkYXRhLT5ub19zeW5jLCBob3N0ZGF0YS0+bm9fZG1hKTsKKyNpZmRlZiBERUJVR0dJTkdfT04KKwlwcmludGsoIiBkZWJ1Z19mbGFncz0weCUwMnhcbiIsIGhvc3RkYXRhLT5hcmdzKTsKKyNlbHNlCisJcHJpbnRrKCIgZGVidWdnaW5nPU9GRlxuIik7CisjZW5kaWYKKwlwcmludGsoIiAgICAgICAgICAgc2V0dXBfYXJncz0iKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1NFVFVQX0FSR1M7IGkrKykKKwkJcHJpbnRrKCIlcywiLCBzZXR1cF9hcmdzW2ldKTsKKwlwcmludGsoIlxuIik7CisJcHJpbnRrKCIgICAgICAgICAgIFZlcnNpb24gJXMgLSAlcywgQ29tcGlsZWQgJXMgYXQgJXNcbiIsCisJICAgICAgIFdEMzNDOTNfVkVSU0lPTiwgV0QzM0M5M19EQVRFLCBfX0RBVEVfXywgX19USU1FX18pOworfQorCitpbnQKK3dkMzNjOTNfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgbGVuLCBpbnQgaW4pCit7CisKKyNpZmRlZiBQUk9DX0lOVEVSRkFDRQorCisJY2hhciAqYnA7CisJY2hhciB0YnVmWzEyOF07CisJc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEgKmhkOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwlpbnQgeCwgaTsKKwlzdGF0aWMgaW50IHN0b3AgPSAwOworCisJaGQgPSAoc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEgKikgaW5zdGFuY2UtPmhvc3RkYXRhOworCisvKiBJZiAnaW4nIGlzIFRSVUUgd2UgbmVlZCB0byBfcmVhZF8gdGhlIHByb2MgZmlsZS4gV2UgYWNjZXB0IHRoZSBmb2xsb3dpbmcKKyAqIGtleXdvcmRzIChzYW1lIGZvcm1hdCBhcyBjb21tYW5kLWxpbmUsIGJ1dCBvbmx5IE9ORSBwZXIgcmVhZCk6CisgKiAgICBkZWJ1ZworICogICAgZGlzY29ubmVjdAorICogICAgcGVyaW9kCisgKiAgICByZXN5bmMKKyAqICAgIHByb2MKKyAqICAgIG5vZG1hCisgKi8KKworCWlmIChpbikgeworCQlidWZbbGVuXSA9ICdcMCc7CisJCWJwID0gYnVmOworCQlpZiAoIXN0cm5jbXAoYnAsICJkZWJ1ZzoiLCA2KSkgeworCQkJYnAgKz0gNjsKKwkJCWhkLT5hcmdzID0gc2ltcGxlX3N0cnRvdWwoYnAsIE5VTEwsIDApICYgREJfTUFTSzsKKwkJfSBlbHNlIGlmICghc3RybmNtcChicCwgImRpc2Nvbm5lY3Q6IiwgMTEpKSB7CisJCQlicCArPSAxMTsKKwkJCXggPSBzaW1wbGVfc3RydG91bChicCwgTlVMTCwgMCk7CisJCQlpZiAoeCA8IERJU19ORVZFUiB8fCB4ID4gRElTX0FMV0FZUykKKwkJCQl4ID0gRElTX0FEQVBUSVZFOworCQkJaGQtPmRpc2Nvbm5lY3QgPSB4OworCQl9IGVsc2UgaWYgKCFzdHJuY21wKGJwLCAicGVyaW9kOiIsIDcpKSB7CisJCQlicCArPSA3OworCQkJeCA9IHNpbXBsZV9zdHJ0b3VsKGJwLCBOVUxMLCAwKTsKKwkJCWhkLT5kZWZhdWx0X3N4X3BlciA9CisJCQkgICAgc3hfdGFibGVbcm91bmRfcGVyaW9kKCh1bnNpZ25lZCBpbnQpIHgpXS5wZXJpb2RfbnM7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAoYnAsICJyZXN5bmM6IiwgNykpIHsKKwkJCWJwICs9IDc7CisJCQl4ID0gc2ltcGxlX3N0cnRvdWwoYnAsIE5VTEwsIDApOworCQkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKwkJCQlpZiAoeCAmICgxIDw8IGkpKQorCQkJCQloZC0+c3luY19zdGF0W2ldID0gU1NfVU5TRVQ7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAoYnAsICJwcm9jOiIsIDUpKSB7CisJCQlicCArPSA1OworCQkJaGQtPnByb2MgPSBzaW1wbGVfc3RydG91bChicCwgTlVMTCwgMCk7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAoYnAsICJub2RtYToiLCA2KSkgeworCQkJYnAgKz0gNjsKKwkJCWhkLT5ub19kbWEgPSBzaW1wbGVfc3RydG91bChicCwgTlVMTCwgMCk7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAoYnAsICJsZXZlbDI6IiwgNykpIHsKKwkJCWJwICs9IDc7CisJCQloZC0+bGV2ZWwyID0gc2ltcGxlX3N0cnRvdWwoYnAsIE5VTEwsIDApOworCQl9CisJCXJldHVybiBsZW47CisJfQorCisJc3Bpbl9sb2NrX2lycSgmaGQtPmxvY2spOworCWJwID0gYnVmOworCSpicCA9ICdcMCc7CisJaWYgKGhkLT5wcm9jICYgUFJfVkVSU0lPTikgeworCQlzcHJpbnRmKHRidWYsICJcblZlcnNpb24gJXMgLSAlcy4gQ29tcGlsZWQgJXMgJXMiLAorCQkJV0QzM0M5M19WRVJTSU9OLCBXRDMzQzkzX0RBVEUsIF9fREFURV9fLCBfX1RJTUVfXyk7CisJCXN0cmNhdChicCwgdGJ1Zik7CisJfQorCWlmIChoZC0+cHJvYyAmIFBSX0lORk8pIHsKKwkJc3ByaW50Zih0YnVmLCAiXG5jbG9ja19mcmVxPSUwMnggbm9fc3luYz0lMDJ4IG5vX2RtYT0lZCIsCisJCQloZC0+Y2xvY2tfZnJlcSwgaGQtPm5vX3N5bmMsIGhkLT5ub19kbWEpOworCQlzdHJjYXQoYnAsIHRidWYpOworCQlzdHJjYXQoYnAsICJcbnN5bmNfeGZlcltdID0gICAgICAgIik7CisJCWZvciAoeCA9IDA7IHggPCA3OyB4KyspIHsKKwkJCXNwcmludGYodGJ1ZiwgIlx0JTAyeCIsIGhkLT5zeW5jX3hmZXJbeF0pOworCQkJc3RyY2F0KGJwLCB0YnVmKTsKKwkJfQorCQlzdHJjYXQoYnAsICJcbnN5bmNfc3RhdFtdID0gICAgICAgIik7CisJCWZvciAoeCA9IDA7IHggPCA3OyB4KyspIHsKKwkJCXNwcmludGYodGJ1ZiwgIlx0JTAyeCIsIGhkLT5zeW5jX3N0YXRbeF0pOworCQkJc3RyY2F0KGJwLCB0YnVmKTsKKwkJfQorCX0KKyNpZmRlZiBQUk9DX1NUQVRJU1RJQ1MKKwlpZiAoaGQtPnByb2MgJiBQUl9TVEFUSVNUSUNTKSB7CisJCXN0cmNhdChicCwgIlxuY29tbWFuZHMgaXNzdWVkOiAgICAiKTsKKwkJZm9yICh4ID0gMDsgeCA8IDc7IHgrKykgeworCQkJc3ByaW50Zih0YnVmLCAiXHQlbGQiLCBoZC0+Y21kX2NudFt4XSk7CisJCQlzdHJjYXQoYnAsIHRidWYpOworCQl9CisJCXN0cmNhdChicCwgIlxuZGlzY29ubmVjdHMgYWxsb3dlZDoiKTsKKwkJZm9yICh4ID0gMDsgeCA8IDc7IHgrKykgeworCQkJc3ByaW50Zih0YnVmLCAiXHQlbGQiLCBoZC0+ZGlzY19hbGxvd2VkX2NudFt4XSk7CisJCQlzdHJjYXQoYnAsIHRidWYpOworCQl9CisJCXN0cmNhdChicCwgIlxuZGlzY29ubmVjdHMgZG9uZTogICAiKTsKKwkJZm9yICh4ID0gMDsgeCA8IDc7IHgrKykgeworCQkJc3ByaW50Zih0YnVmLCAiXHQlbGQiLCBoZC0+ZGlzY19kb25lX2NudFt4XSk7CisJCQlzdHJjYXQoYnAsIHRidWYpOworCQl9CisJCXNwcmludGYodGJ1ZiwKKwkJCSJcbmludGVycnVwdHM6ICVsZCwgREFUQV9QSEFTRSBpbnRzOiAlbGQgRE1BLCAlbGQgUElPIiwKKwkJCWhkLT5pbnRfY250LCBoZC0+ZG1hX2NudCwgaGQtPnBpb19jbnQpOworCQlzdHJjYXQoYnAsIHRidWYpOworCX0KKyNlbmRpZgorCWlmIChoZC0+cHJvYyAmIFBSX0NPTk5FQ1RFRCkgeworCQlzdHJjYXQoYnAsICJcbmNvbm5lY3RlZDogICAgICIpOworCQlpZiAoaGQtPmNvbm5lY3RlZCkgeworCQkJY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaGQtPmNvbm5lY3RlZDsKKwkJCXNwcmludGYodGJ1ZiwgIiAlbGQtJWQ6JWQoJTAyeCkiLAorCQkJCWNtZC0+cGlkLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sIGNtZC0+Y21uZFswXSk7CisJCQlzdHJjYXQoYnAsIHRidWYpOworCQl9CisJfQorCWlmIChoZC0+cHJvYyAmIFBSX0lOUFVUUSkgeworCQlzdHJjYXQoYnAsICJcbmlucHV0X1E6ICAgICAgICIpOworCQljbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBoZC0+aW5wdXRfUTsKKwkJd2hpbGUgKGNtZCkgeworCQkJc3ByaW50Zih0YnVmLCAiICVsZC0lZDolZCglMDJ4KSIsCisJCQkJY21kLT5waWQsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwgY21kLT5jbW5kWzBdKTsKKwkJCXN0cmNhdChicCwgdGJ1Zik7CisJCQljbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGU7CisJCX0KKwl9CisJaWYgKGhkLT5wcm9jICYgUFJfRElTQ1EpIHsKKwkJc3RyY2F0KGJwLCAiXG5kaXNjb25uZWN0ZWRfUToiKTsKKwkJY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaGQtPmRpc2Nvbm5lY3RlZF9ROworCQl3aGlsZSAoY21kKSB7CisJCQlzcHJpbnRmKHRidWYsICIgJWxkLSVkOiVkKCUwMngpIiwKKwkJCQljbWQtPnBpZCwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLCBjbWQtPmNtbmRbMF0pOworCQkJc3RyY2F0KGJwLCB0YnVmKTsKKwkJCWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNtZC0+aG9zdF9zY3JpYmJsZTsKKwkJfQorCX0KKwlzdHJjYXQoYnAsICJcbiIpOworCXNwaW5fdW5sb2NrX2lycSgmaGQtPmxvY2spOworCSpzdGFydCA9IGJ1ZjsKKwlpZiAoc3RvcCkgeworCQlzdG9wID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChvZmYgPiAweDQwMDAwKQkvKiBBTFdBWVMgc3RvcCBhZnRlciAyNTZrIGJ5dGVzIGhhdmUgYmVlbiByZWFkICovCisJCXN0b3AgPSAxOworCWlmIChoZC0+cHJvYyAmIFBSX1NUT1ApCS8qIHN0b3AgZXZlcnkgb3RoZXIgdGltZSAqLworCQlzdG9wID0gMTsKKwlyZXR1cm4gc3RybGVuKGJwKTsKKworI2Vsc2UJCQkJLyogUFJPQ19JTlRFUkZBQ0UgKi8KKworCXJldHVybiAwOworCisjZW5kaWYJCQkJLyogUFJPQ19JTlRFUkZBQ0UgKi8KKworfQorCit2b2lkCit3ZDMzYzkzX3JlbGVhc2Uodm9pZCkKK3sKK30KKworRVhQT1JUX1NZTUJPTCh3ZDMzYzkzX2hvc3RfcmVzZXQpOworRVhQT1JUX1NZTUJPTCh3ZDMzYzkzX2luaXQpOworRVhQT1JUX1NZTUJPTCh3ZDMzYzkzX3JlbGVhc2UpOworRVhQT1JUX1NZTUJPTCh3ZDMzYzkzX2Fib3J0KTsKK0VYUE9SVF9TWU1CT0wod2QzM2M5M19xdWV1ZWNvbW1hbmQpOworRVhQT1JUX1NZTUJPTCh3ZDMzYzkzX2ludHIpOworRVhQT1JUX1NZTUJPTCh3ZDMzYzkzX3Byb2NfaW5mbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvd2QzM2M5My5oIGIvZHJpdmVycy9zY3NpL3dkMzNjOTMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTNlYzUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3dkMzNjOTMuaApAQCAtMCwwICsxLDM0OCBAQAorLyoKKyAqICAgIHdkMzNjOTMuaCAtICBMaW51eCBkZXZpY2UgZHJpdmVyIGRlZmluaXRpb25zIGZvciB0aGUKKyAqICAgICAgICAgICAgICAgICBDb21tb2RvcmUgQW1pZ2EgQTIwOTEvNTkwIFNDU0kgY29udHJvbGxlciBjYXJkCisgKgorICogICAgSU1QT1JUQU5UOiBUaGlzIGZpbGUgaXMgZm9yIHZlcnNpb24gMS4yNSAtIDA5L0p1bC8xOTk3CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2IEpvaG4gU2hpZmZsZXR0LCBHZW9Mb2cgQ29uc3VsdGluZworICogICAgam9obkBnZW9sb2cuY29tCisgKiAgICBqc2hpZmZsZUBuZXRjb20uY29tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2lmbmRlZiBXRDMzQzkzX0gKKyNkZWZpbmUgV0QzM0M5M19ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2RlZmluZSBQUk9DX0lOVEVSRkFDRSAgICAgLyogYWRkIGNvZGUgZm9yIC9wcm9jL3Njc2kvd2QzM2M5My94eHggaW50ZXJmYWNlICovCisjaWZkZWYgIFBST0NfSU5URVJGQUNFCisjZGVmaW5lIFBST0NfU1RBVElTVElDUyAgICAvKiBhZGQgY29kZSBmb3Iga2VlcGluZyB2YXJpb3VzIHJlYWwgdGltZSBzdGF0cyAqLworI2VuZGlmCisKKyNkZWZpbmUgU1lOQ19ERUJVRyAgICAgICAgIC8qIGV4dHJhIGluZm8gb24gc3luYyBuZWdvdGlhdGlvbiBwcmludGVkICovCisjZGVmaW5lIERFQlVHR0lOR19PTiAgICAgICAvKiBlbmFibGUgY29tbWFuZC1saW5lIGRlYnVnZ2luZyBiaXRtYXNrICovCisjZGVmaW5lIERFQlVHX0RFRkFVTFRTIDAgICAvKiBkZWZhdWx0IGRlYnVnZ2luZyBiaXRtYXNrICovCisKKworI2lmZGVmIERFQlVHR0lOR19PTgorI2RlZmluZSBEQihmLGEpIGlmIChob3N0ZGF0YS0+YXJncyAmIChmKSkgYTsKKyNlbHNlCisjZGVmaW5lIERCKGYsYSkKKyNlbmRpZgorCisjZGVmaW5lIHVjaGFyIHVuc2lnbmVkIGNoYXIKKworCisvKiB3ZCByZWdpc3RlciBuYW1lcyAqLworI2RlZmluZSBXRF9PV05fSUQgICAgMHgwMAorI2RlZmluZSBXRF9DT05UUk9MICAgICAgMHgwMQorI2RlZmluZSBXRF9USU1FT1VUX1BFUklPRCAgMHgwMgorI2RlZmluZSBXRF9DREJfMSAgICAgMHgwMworI2RlZmluZSBXRF9DREJfMiAgICAgMHgwNAorI2RlZmluZSBXRF9DREJfMyAgICAgMHgwNQorI2RlZmluZSBXRF9DREJfNCAgICAgMHgwNgorI2RlZmluZSBXRF9DREJfNSAgICAgMHgwNworI2RlZmluZSBXRF9DREJfNiAgICAgMHgwOAorI2RlZmluZSBXRF9DREJfNyAgICAgMHgwOQorI2RlZmluZSBXRF9DREJfOCAgICAgMHgwYQorI2RlZmluZSBXRF9DREJfOSAgICAgMHgwYgorI2RlZmluZSBXRF9DREJfMTAgICAgMHgwYworI2RlZmluZSBXRF9DREJfMTEgICAgMHgwZAorI2RlZmluZSBXRF9DREJfMTIgICAgMHgwZQorI2RlZmluZSBXRF9UQVJHRVRfTFVOICAgICAgMHgwZgorI2RlZmluZSBXRF9DT01NQU5EX1BIQVNFICAgMHgxMAorI2RlZmluZSBXRF9TWU5DSFJPTk9VU19UUkFOU0ZFUiAweDExCisjZGVmaW5lIFdEX1RSQU5TRkVSX0NPVU5UX01TQiAweDEyCisjZGVmaW5lIFdEX1RSQU5TRkVSX0NPVU5UICAweDEzCisjZGVmaW5lIFdEX1RSQU5TRkVSX0NPVU5UX0xTQiAweDE0CisjZGVmaW5lIFdEX0RFU1RJTkFUSU9OX0lEICAweDE1CisjZGVmaW5lIFdEX1NPVVJDRV9JRCAgICAweDE2CisjZGVmaW5lIFdEX1NDU0lfU1RBVFVTICAgICAweDE3CisjZGVmaW5lIFdEX0NPTU1BTkQgICAgICAweDE4CisjZGVmaW5lIFdEX0RBVEEgICAgICAweDE5CisjZGVmaW5lIFdEX1FVRVVFX1RBRyAgICAweDFhCisjZGVmaW5lIFdEX0FVWElMSUFSWV9TVEFUVVMgICAweDFmCisKKy8qIFdEIGNvbW1hbmRzICovCisjZGVmaW5lIFdEX0NNRF9SRVNFVCAgICAweDAwCisjZGVmaW5lIFdEX0NNRF9BQk9SVCAgICAweDAxCisjZGVmaW5lIFdEX0NNRF9BU1NFUlRfQVROICAweDAyCisjZGVmaW5lIFdEX0NNRF9ORUdBVEVfQUNLICAweDAzCisjZGVmaW5lIFdEX0NNRF9ESVNDT05ORUNUICAweDA0CisjZGVmaW5lIFdEX0NNRF9SRVNFTEVDVCAgICAweDA1CisjZGVmaW5lIFdEX0NNRF9TRUxfQVROICAgICAweDA2CisjZGVmaW5lIFdEX0NNRF9TRUwgICAgICAweDA3CisjZGVmaW5lIFdEX0NNRF9TRUxfQVROX1hGRVIgICAweDA4CisjZGVmaW5lIFdEX0NNRF9TRUxfWEZFUiAgICAweDA5CisjZGVmaW5lIFdEX0NNRF9SRVNFTF9SRUNFSVZFICAweDBhCisjZGVmaW5lIFdEX0NNRF9SRVNFTF9TRU5EICAweDBiCisjZGVmaW5lIFdEX0NNRF9XQUlUX1NFTF9SRUNFSVZFIDB4MGMKKyNkZWZpbmUgV0RfQ01EX1RSQU5TX0FERFIgIDB4MTgKKyNkZWZpbmUgV0RfQ01EX1RSQU5TX0lORk8gIDB4MjAKKyNkZWZpbmUgV0RfQ01EX1RSQU5TRkVSX1BBRCAgIDB4MjEKKyNkZWZpbmUgV0RfQ01EX1NCVF9NT0RFICAgIDB4ODAKKworLyogQVNSIHJlZ2lzdGVyICovCisjZGVmaW5lIEFTUl9JTlQgICAgICAgICAoMHg4MCkKKyNkZWZpbmUgQVNSX0xDSSAgICAgICAgICgweDQwKQorI2RlZmluZSBBU1JfQlNZICAgICAgICAgKDB4MjApCisjZGVmaW5lIEFTUl9DSVAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgQVNSX1BFICAgICAgICAgICgweDAyKQorI2RlZmluZSBBU1JfREJSICAgICAgICAgKDB4MDEpCisKKy8qIFNDU0kgQnVzIFBoYXNlcyAqLworI2RlZmluZSBQSFNfREFUQV9PVVQgICAgMHgwMAorI2RlZmluZSBQSFNfREFUQV9JTiAgICAgMHgwMQorI2RlZmluZSBQSFNfQ09NTUFORCAgICAgMHgwMgorI2RlZmluZSBQSFNfU1RBVFVTICAgICAgMHgwMworI2RlZmluZSBQSFNfTUVTU19PVVQgICAgMHgwNgorI2RlZmluZSBQSFNfTUVTU19JTiAgICAgMHgwNworCisvKiBDb21tYW5kIFN0YXR1cyBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworCisgIC8qIHJlc2V0IHN0YXRlIGludGVycnVwdHMgKi8KKyNkZWZpbmUgQ1NSX1JFU0VUICAgIDB4MDAKKyNkZWZpbmUgQ1NSX1JFU0VUX0FGICAgIDB4MDEKKworICAvKiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gaW50ZXJydXB0cyAqLworI2RlZmluZSBDU1JfUkVTRUxFQ1QgICAgMHgxMAorI2RlZmluZSBDU1JfU0VMRUNUICAgICAgMHgxMQorI2RlZmluZSBDU1JfU0VMX1hGRVJfRE9ORSAgMHgxNgorI2RlZmluZSBDU1JfWEZFUl9ET05FICAgICAgMHgxOAorCisgIC8qIHBhdXNlZCBvciBhYm9ydGVkIGludGVycnVwdHMgKi8KKyNkZWZpbmUgQ1NSX01TR0lOICAgIDB4MjAKKyNkZWZpbmUgQ1NSX1NEUCAgICAgICAgIDB4MjEKKyNkZWZpbmUgQ1NSX1NFTF9BQk9SVCAgICAgIDB4MjIKKyNkZWZpbmUgQ1NSX1JFU0VMX0FCT1JUICAgIDB4MjUKKyNkZWZpbmUgQ1NSX1JFU0VMX0FCT1JUX0FNIDB4MjcKKyNkZWZpbmUgQ1NSX0FCT1JUICAgIDB4MjgKKworICAvKiB0ZXJtaW5hdGVkIGludGVycnVwdHMgKi8KKyNkZWZpbmUgQ1NSX0lOVkFMSUQgICAgIDB4NDAKKyNkZWZpbmUgQ1NSX1VORVhQX0RJU0MgICAgIDB4NDEKKyNkZWZpbmUgQ1NSX1RJTUVPVVQgICAgIDB4NDIKKyNkZWZpbmUgQ1NSX1BBUklUWSAgICAgIDB4NDMKKyNkZWZpbmUgQ1NSX1BBUklUWV9BVE4gICAgIDB4NDQKKyNkZWZpbmUgQ1NSX0JBRF9TVEFUVVMgICAgIDB4NDUKKyNkZWZpbmUgQ1NSX1VORVhQICAgIDB4NDgKKworICAvKiBzZXJ2aWNlIHJlcXVpcmVkIGludGVycnVwdHMgKi8KKyNkZWZpbmUgQ1NSX1JFU0VMICAgIDB4ODAKKyNkZWZpbmUgQ1NSX1JFU0VMX0FNICAgIDB4ODEKKyNkZWZpbmUgQ1NSX0RJU0MgICAgIDB4ODUKKyNkZWZpbmUgQ1NSX1NSVl9SRVEgICAgIDB4ODgKKworICAgLyogT3duIElEL0NEQiBTaXplIHJlZ2lzdGVyICovCisjZGVmaW5lIE9XTklEX0VBRiAgICAweDA4CisjZGVmaW5lIE9XTklEX0VIUCAgICAweDEwCisjZGVmaW5lIE9XTklEX1JBRiAgICAweDIwCisjZGVmaW5lIE9XTklEX0ZTXzggICAweDAwCisjZGVmaW5lIE9XTklEX0ZTXzEyICAweDQwCisjZGVmaW5lIE9XTklEX0ZTXzE2ICAweDgwCisKKyAgIC8qIGRlZmluZSB0aGVzZSBzbyB3ZSBkb24ndCBoYXZlIHRvIGNoYW5nZSBhMjA5MS5jLCBldGMuICovCisjZGVmaW5lIFdEMzNDOTNfRlNfOF8xMCAgT1dOSURfRlNfOAorI2RlZmluZSBXRDMzQzkzX0ZTXzEyXzE1IE9XTklEX0ZTXzEyCisjZGVmaW5lIFdEMzNDOTNfRlNfMTZfMjAgT1dOSURfRlNfMTYKKworICAgLyogQ29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBDVFJMX0hTUCAgICAgMHgwMQorI2RlZmluZSBDVFJMX0hBICAgICAgMHgwMgorI2RlZmluZSBDVFJMX0lESSAgICAgMHgwNAorI2RlZmluZSBDVFJMX0VESSAgICAgMHgwOAorI2RlZmluZSBDVFJMX0hIUCAgICAgMHgxMAorI2RlZmluZSBDVFJMX1BPTExFRCAgMHgwMAorI2RlZmluZSBDVFJMX0JVUlNUICAgMHgyMAorI2RlZmluZSBDVFJMX0JVUyAgICAgMHg0MAorI2RlZmluZSBDVFJMX0RNQSAgICAgMHg4MAorCisgICAvKiBUaW1lb3V0IFBlcmlvZCByZWdpc3RlciAqLworI2RlZmluZSBUSU1FT1VUX1BFUklPRF9WQUxVRSAgMjAgICAgLyogMjAgPSAyMDAgbXMgKi8KKworICAgLyogU3luY2hyb25vdXMgVHJhbnNmZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1RSX0ZTUyAgICAgIDB4ODAKKworICAgLyogRGVzdGluYXRpb24gSUQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRFNUSURfRFBEICAgIDB4NDAKKyNkZWZpbmUgREFUQV9PVVRfRElSIDAKKyNkZWZpbmUgREFUQV9JTl9ESVIgIDEKKyNkZWZpbmUgRFNUSURfU0NDICAgIDB4ODAKKworICAgLyogU291cmNlIElEIHJlZ2lzdGVyICovCisjZGVmaW5lIFNSQ0lEX01BU0sgICAweDA3CisjZGVmaW5lIFNSQ0lEX1NJViAgICAweDA4CisjZGVmaW5lIFNSQ0lEX0RTUCAgICAweDIwCisjZGVmaW5lIFNSQ0lEX0VTICAgICAweDQwCisjZGVmaW5lIFNSQ0lEX0VSICAgICAweDgwCisKKyAgIC8qIFRoaXMgaXMgd2hhdCB0aGUgMzM5MyBjaGlwIGxvb2tzIGxpa2UgdG8gdXMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyNpZmRlZiBDT05GSUdfV0QzM0M5M19QSU8KKyAgIHVuc2lnbmVkIGludCAgIFNBU1I7CisgICB1bnNpZ25lZCBpbnQgICBTQ01EOworI2Vsc2UKKyAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICpTQVNSOworICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgKlNDTUQ7CisjZW5kaWYKK30gd2QzM2M5M19yZWdzOworCisKK3R5cGVkZWYgaW50ICgqZG1hX3NldHVwX3QpIChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwgaW50IGRpcl9pbik7Cit0eXBlZGVmIHZvaWQgKCpkbWFfc3RvcF90KSAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsCisJCXN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCBpbnQgc3RhdHVzKTsKKworCisjZGVmaW5lIElMTEVHQUxfU1RBVFVTX0JZVEUgICAweGZmCisKKyNkZWZpbmUgREVGQVVMVF9TWF9QRVIgICAzNzYgICAgIC8qIChucykgZmFpcmx5IHNhZmUgKi8KKyNkZWZpbmUgREVGQVVMVF9TWF9PRkYgICAwICAgICAgIC8qIGFrYSBhc3luYyAqLworCisjZGVmaW5lIE9QVElNVU1fU1hfUEVSICAgMjUyICAgICAvKiAobnMpIGJlc3Qgd2UgY2FuIGRvIChtdWx0LW9mLTQpICovCisjZGVmaW5lIE9QVElNVU1fU1hfT0ZGICAgMTIgICAgICAvKiBzaXplIG9mIHdkMzM5MyBmaWZvICovCisKK3N0cnVjdCBzeF9wZXJpb2QgeworICAgdW5zaWduZWQgaW50ICAgcGVyaW9kX25zOworICAgdWNoYXIgICAgICAgICAgcmVnX3ZhbHVlOworICAgfTsKKworLyogRkVGOiBkZWZpbmVzIGZvciBob3N0ZGF0YS0+ZG1hX2J1ZmZlcl9wb29sICovCisKKyNkZWZpbmUgQlVGX0NISVBfQUxMT0NFRCAwCisjZGVmaW5lIEJVRl9TQ1NJX0FMTE9DRUQgMQorCitzdHJ1Y3QgV0QzM0M5M19ob3N0ZGF0YSB7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqbmV4dDsKKyAgICB3ZDMzYzkzX3JlZ3MgICAgIHJlZ3M7CisgICAgc3BpbmxvY2tfdCAgICAgICBsb2NrOworICAgIHVjaGFyICAgICAgICAgICAgY2xvY2tfZnJlcTsKKyAgICB1Y2hhciAgICAgICAgICAgIGNoaXA7ICAgICAgICAgICAgIC8qIHdoYXQga2luZCBvZiB3ZDMzYzkzPyAqLworICAgIHVjaGFyICAgICAgICAgICAgbWljcm9jb2RlOyAgICAgICAgLyogbWljcm9jb2RlIHJldiAqLworICAgIHVjaGFyICAgICAgICAgICAgZG1hX2J1ZmZlcl9wb29sOyAgLyogRkVGOiBidWZmZXIgZnJvbSBjaGlwX3JhbT8gKi8KKyAgICBpbnQgICAgICAgICAgICAgIGRtYV9kaXI7ICAgICAgICAgIC8qIGRhdGEgdHJhbnNmZXIgZGlyLiAqLworICAgIGRtYV9zZXR1cF90ICAgICAgZG1hX3NldHVwOworICAgIGRtYV9zdG9wX3QgICAgICAgZG1hX3N0b3A7CisgICAgdW5zaWduZWQgaW50ICAgICBkbWFfeGZlcl9tYXNrOworICAgIHVjaGFyICAgICAgICAgICAgKmRtYV9ib3VuY2VfYnVmZmVyOworICAgIHVuc2lnbmVkIGludCAgICAgZG1hX2JvdW5jZV9sZW47CisgICAgdm9sYXRpbGUgdWNoYXIgICBidXN5WzhdOyAgICAgICAgICAvKiBpbmRleCA9IHRhcmdldCwgYml0ID0gbHVuICovCisgICAgdm9sYXRpbGUgc3RydWN0IHNjc2lfY21uZCAqaW5wdXRfUTsgICAgICAgLyogY29tbWFuZHMgd2FpdGluZyB0byBiZSBzdGFydGVkICovCisgICAgdm9sYXRpbGUgc3RydWN0IHNjc2lfY21uZCAqc2VsZWN0aW5nOyAgICAgLyogdHJ5aW5nIHRvIHNlbGVjdCB0aGlzIGNvbW1hbmQgKi8KKyAgICB2b2xhdGlsZSBzdHJ1Y3Qgc2NzaV9jbW5kICpjb25uZWN0ZWQ7ICAgICAvKiBjdXJyZW50bHkgY29ubmVjdGVkIGNvbW1hbmQgKi8KKyAgICB2b2xhdGlsZSBzdHJ1Y3Qgc2NzaV9jbW5kICpkaXNjb25uZWN0ZWRfUTsvKiBjb21tYW5kcyB3YWl0aW5nIGZvciByZWNvbm5lY3QgKi8KKyAgICB1Y2hhciAgICAgICAgICAgIHN0YXRlOyAgICAgICAgICAgIC8qIHdoYXQgd2UgYXJlIGN1cnJlbnRseSBkb2luZyAqLworICAgIHVjaGFyICAgICAgICAgICAgZG1hOyAgICAgICAgICAgICAgLyogY3VycmVudCBzdGF0ZSBvZiBETUEgKG9uL29mZikgKi8KKyAgICB1Y2hhciAgICAgICAgICAgIGxldmVsMjsgICAgICAgICAgIC8qIGV4dGVudCB0byB3aGljaCBMZXZlbC0yIGNvbW1hbmRzIGFyZSB1c2VkICovCisgICAgdWNoYXIgICAgICAgICAgICBkaXNjb25uZWN0OyAgICAgICAvKiBkaXNjb25uZWN0L3Jlc2VsZWN0IHBvbGljeSAqLworICAgIHVuc2lnbmVkIGludCAgICAgYXJnczsgICAgICAgICAgICAgLyogc2V0IGZyb20gY29tbWFuZC1saW5lIGFyZ3VtZW50ICovCisgICAgdWNoYXIgICAgICAgICAgICBpbmNvbWluZ19tc2dbOF07ICAvKiBmaWxsZWQgZHVyaW5nIG1lc3NhZ2VfaW4gcGhhc2UgKi8KKyAgICBpbnQgICAgICAgICAgICAgIGluY29taW5nX3B0cjsgICAgIC8qIG1haW5seSB1c2VkIHdpdGggRVhURU5ERUQgbWVzc2FnZXMgKi8KKyAgICB1Y2hhciAgICAgICAgICAgIG91dGdvaW5nX21zZ1s4XTsgIC8qIHNlbmQgdGhpcyBkdXJpbmcgbmV4dCBtZXNzYWdlX291dCAqLworICAgIGludCAgICAgICAgICAgICAgb3V0Z29pbmdfbGVuOyAgICAgLyogbGVuZ3RoIG9mIG91dGdvaW5nIG1lc3NhZ2UgKi8KKyAgICB1bnNpZ25lZCBpbnQgICAgIGRlZmF1bHRfc3hfcGVyOyAgIC8qIGRlZmF1bHQgdHJhbnNmZXIgcGVyaW9kIGZvciBTQ1NJIGJ1cyAqLworICAgIHVjaGFyICAgICAgICAgICAgc3luY194ZmVyWzhdOyAgICAgLyogc3luY194ZmVyIHJlZyBzZXR0aW5ncyBwZXIgdGFyZ2V0ICovCisgICAgdWNoYXIgICAgICAgICAgICBzeW5jX3N0YXRbOF07ICAgICAvKiBzdGF0dXMgb2Ygc3luYyBuZWdvdGlhdGlvbiBwZXIgdGFyZ2V0ICovCisgICAgdWNoYXIgICAgICAgICAgICBub19zeW5jOyAgICAgICAgICAvKiBiaXRtYXNrOiBkb24ndCBkbyBzeW5jIG9uIHRoZXNlIHRhcmdldHMgKi8KKyAgICB1Y2hhciAgICAgICAgICAgIG5vX2RtYTsgICAgICAgICAgIC8qIHNldCB0aGlzIGZsYWcgdG8gZGlzYWJsZSBETUEgKi8KKyNpZmRlZiBQUk9DX0lOVEVSRkFDRQorICAgIHVjaGFyICAgICAgICAgICAgcHJvYzsgICAgICAgICAgICAgLyogYml0bWFzazogd2hhdCdzIGluIHByb2Mgb3V0cHV0ICovCisjaWZkZWYgUFJPQ19TVEFUSVNUSUNTCisgICAgdW5zaWduZWQgbG9uZyAgICBjbWRfY250WzhdOyAgICAgICAvKiAjIG9mIGNvbW1hbmRzIGlzc3VlZCBwZXIgdGFyZ2V0ICovCisgICAgdW5zaWduZWQgbG9uZyAgICBpbnRfY250OyAgICAgICAgICAvKiAjIG9mIGludGVycnVwdHMgc2VydmljZWQgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgIHBpb19jbnQ7ICAgICAgICAgIC8qICMgb2YgcGlvIGRhdGEgdHJhbnNmZXJzICovCisgICAgdW5zaWduZWQgbG9uZyAgICBkbWFfY250OyAgICAgICAgICAvKiAjIG9mIERNQSBkYXRhIHRyYW5zZmVycyAqLworICAgIHVuc2lnbmVkIGxvbmcgICAgZGlzY19hbGxvd2VkX2NudFs4XTsgLyogIyBvZiBkaXNjb25uZWN0cyBhbGxvd2VkIHBlciB0YXJnZXQgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgIGRpc2NfZG9uZV9jbnRbOF07IC8qICMgb2YgZGlzY29ubmVjdHMgZG9uZSBwZXIgdGFyZ2V0Ki8KKyNlbmRpZgorI2VuZGlmCisgICAgfTsKKworCisvKiBkZWZpbmVzIGZvciBob3N0ZGF0YS0+Y2hpcCAqLworCisjZGVmaW5lIENfV0QzM0M5MyAgICAgICAwCisjZGVmaW5lIENfV0QzM0M5M0EgICAgICAxCisjZGVmaW5lIENfV0QzM0M5M0IgICAgICAyCisjZGVmaW5lIENfVU5LTk9XTl9DSElQICAxMDAKKworLyogZGVmaW5lcyBmb3IgaG9zdGRhdGEtPnN0YXRlICovCisKKyNkZWZpbmUgU19VTkNPTk5FQ1RFRCAgICAgICAgIDAKKyNkZWZpbmUgU19TRUxFQ1RJTkcgICAgICAgICAgIDEKKyNkZWZpbmUgU19SVU5OSU5HX0xFVkVMMiAgICAgIDIKKyNkZWZpbmUgU19DT05ORUNURUQgICAgICAgICAgIDMKKyNkZWZpbmUgU19QUkVfVE1QX0RJU0MgICAgICAgIDQKKyNkZWZpbmUgU19QUkVfQ01QX0RJU0MgICAgICAgIDUKKworLyogZGVmaW5lcyBmb3IgaG9zdGRhdGEtPmRtYSAqLworCisjZGVmaW5lIERfRE1BX09GRiAgICAgICAgICAwCisjZGVmaW5lIERfRE1BX1JVTk5JTkcgICAgICAxCisKKy8qIGRlZmluZXMgZm9yIGhvc3RkYXRhLT5sZXZlbDIgKi8KKy8qIE5PVEU6IG9ubHkgdGhlIGZpcnN0IDMgYXJlIGltcGxlbWVudGVkIHNvIGZhciAqLworCisjZGVmaW5lIEwyX05PTkUgICAgICAxICAvKiBubyBjb21iaW5hdGlvbiBjb21tYW5kcyAtIHdlIGdldCBsb3RzIG9mIGludHMgKi8KKyNkZWZpbmUgTDJfU0VMRUNUICAgIDIgIC8qIHN0YXJ0IHdpdGggU0VMX0FUTl9YRkVSLCBidXQgbmV2ZXIgcmVzdW1lIGl0ICovCisjZGVmaW5lIEwyX0JBU0lDICAgICAzICAvKiByZXN1bWUgYWZ0ZXIgU1RBVFVTIGludHMgJiBSRFAgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTDJfREFUQSAgICAgIDQgIC8qIHJlc3VtZSBhZnRlciBEQVRBX0lOL09VVCBpbnRzICovCisjZGVmaW5lIEwyX01PU1QgICAgICA1ICAvKiByZXN1bWUgYWZ0ZXIgYW55dGhpbmcgZXhjZXB0IGEgUkVTRUxFQ1QgaW50ICovCisjZGVmaW5lIEwyX1JFU0VMRUNUICA2ICAvKiByZXN1bWUgYWZ0ZXIgZXZlcnl0aGluZywgaW5jbHVkaW5nIFJFU0VMRUNUIGludHMgKi8KKyNkZWZpbmUgTDJfQUxMICAgICAgIDcgIC8qIGFsd2F5cyByZXN1bWUgKi8KKworLyogZGVmaW5lcyBmb3IgaG9zdGRhdGEtPmRpc2Nvbm5lY3QgKi8KKworI2RlZmluZSBESVNfTkVWRVIgICAgMAorI2RlZmluZSBESVNfQURBUFRJVkUgMQorI2RlZmluZSBESVNfQUxXQVlTICAgMgorCisvKiBkZWZpbmVzIGZvciBob3N0ZGF0YS0+YXJncyAqLworCisjZGVmaW5lIERCX1RFU1QxICAgICAgICAgICAgICAxPDwwCisjZGVmaW5lIERCX1RFU1QyICAgICAgICAgICAgICAxPDwxCisjZGVmaW5lIERCX1FVRVVFX0NPTU1BTkQgICAgICAxPDwyCisjZGVmaW5lIERCX0VYRUNVVEUgICAgICAgICAgICAxPDwzCisjZGVmaW5lIERCX0lOVFIgICAgICAgICAgICAgICAxPDw0CisjZGVmaW5lIERCX1RSQU5TRkVSICAgICAgICAgICAxPDw1CisjZGVmaW5lIERCX01BU0sgICAgICAgICAgICAgICAweDNmCisKKy8qIGRlZmluZXMgZm9yIGhvc3RkYXRhLT5zeW5jX3N0YXRbXSAqLworCisjZGVmaW5lIFNTX1VOU0VUICAgICAwCisjZGVmaW5lIFNTX0ZJUlNUICAgICAxCisjZGVmaW5lIFNTX1dBSVRJTkcgICAyCisjZGVmaW5lIFNTX1NFVCAgICAgICAzCisKKy8qIGRlZmluZXMgZm9yIGhvc3RkYXRhLT5wcm9jICovCisKKyNkZWZpbmUgUFJfVkVSU0lPTiAgIDE8PDAKKyNkZWZpbmUgUFJfSU5GTyAgICAgIDE8PDEKKyNkZWZpbmUgUFJfU1RBVElTVElDUyAxPDwyCisjZGVmaW5lIFBSX0NPTk5FQ1RFRCAxPDwzCisjZGVmaW5lIFBSX0lOUFVUUSAgICAxPDw0CisjZGVmaW5lIFBSX0RJU0NRICAgICAxPDw1CisjZGVmaW5lIFBSX1RFU1QgICAgICAxPDw2CisjZGVmaW5lIFBSX1NUT1AgICAgICAxPDw3CisKKwordm9pZCB3ZDMzYzkzX2luaXQgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBjb25zdCB3ZDMzYzkzX3JlZ3MgcmVncywKKyAgICAgICAgIGRtYV9zZXR1cF90IHNldHVwLCBkbWFfc3RvcF90IHN0b3AsIGludCBjbG9ja19mcmVxKTsKK2ludCB3ZDMzYzkzX2Fib3J0IChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOworaW50IHdkMzNjOTNfcXVldWVjb21tYW5kIChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCXZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKK3ZvaWQgd2QzM2M5M19pbnRyIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSk7CitpbnQgd2QzM2M5M19wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqLCBjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCk7CitpbnQgd2QzM2M5M19ob3N0X3Jlc2V0IChzdHJ1Y3Qgc2NzaV9jbW5kICopOwordm9pZCB3ZDMzYzkzX3JlbGVhc2Uodm9pZCk7CisKKyNlbmRpZiAvKiBXRDMzQzkzX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS93ZDcwMDAuYyBiL2RyaXZlcnMvc2NzaS93ZDcwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjRhNzU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3dkNzAwMC5jCkBAIC0wLDAgKzEsMTY2NyBAQAorLyogJElkOiAkCisgKiAgbGludXgvZHJpdmVycy9zY3NpL3dkNzAwMC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MiAgVGhvbWFzIFd1ZW5zY2hlCisgKgljbG9zZWx5IHJlbGF0ZWQgdG8gdGhlIGFoYTE1NDIgZHJpdmVyIGZyb20gVG9tbXkgVGhvcm4KKyAqCSggYXMgY2xvc2UgYXMgZGlmZmVyZW50IGhhcmR3YXJlIGFsbG93cyBvbiBhIGxvd2xldmVsLWRyaXZlciA6LSkgKQorICoKKyAqICBSZXZpc2VkIChhbmQgcmVuYW1lZCkgYnkgSm9obiBCb3lkIDxib3lkQGNpcy5vaGlvLXN0YXRlLmVkdT4gdG8KKyAqICBhY2NvbW1vZGF0ZSBFcmljIFlvdW5nZGFsZSdzIG1vZGlmaWNhdGlvbnMgdG8gc2NzaS5jLiAgTm92IDE5OTIuCisgKgorICogIEFkZGl0aW9uYWwgY2hhbmdlcyB0byBzdXBwb3J0IHNjYXR0ZXIvZ2F0aGVyLiAgRGVjLiAxOTkyLiAgdHcvamIKKyAqCisgKiAgTm8gbG9uZ2VyIHRyaWVzIHRvIHJlc2V0IFNDU0kgYnVzIGF0IGJvb3QgKGl0IHdhc24ndCB3b3JraW5nIGFueXdheSkuCisgKiAgUmV3cml0dGVuIHRvIHN1cHBvcnQgbXVsdGlwbGUgaG9zdCBhZGFwdGVycy4KKyAqICBNaXNjZWxsYW5lb3VzIGNsZWFudXAuCisgKiAgU28gZmFyLCBzdGlsbCBkb2Vzbid0IGRvIHJlc2V0IG9yIGFib3J0IGNvcnJlY3RseSwgc2luY2UgSSBoYXZlIG5vIGlkZWEKKyAqICBob3cgdG8gZG8gdGhlbSB3aXRoIHRoaXMgYm9hcmQgKDheKC4gICAgICAgICAgICAgICAgICAgICAgSmFuIDE5OTQgamIKKyAqCisgKiBUaGlzIGRyaXZlciBub3cgc3VwcG9ydHMgYm90aCBvZiB0aGUgdHdvIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb25zIChwZXIKKyAqIHRoZSAzLjM2IE93bmVyJ3MgTWFudWFsLCBteSBsYXRlc3QgcmVmZXJlbmNlKSBieSB0aGUgc2FtZSBtZXRob2QgYXMKKyAqIGJlZm9yZTsgbmFtZWx5LCBieSBsb29raW5nIGZvciBhIEJJT1Mgc2lnbmF0dXJlLiAgVGh1cywgdGhlIGxvY2F0aW9uIG9mCisgKiB0aGUgQklPUyBzaWduYXR1cmUgZGV0ZXJtaW5lcyB0aGUgYm9hcmQgY29uZmlndXJhdGlvbi4gIFVudGlsIEkgaGF2ZQorICogdGltZSB0byBkbyBzb21ldGhpbmcgbW9yZSBmbGV4aWJsZSwgdXNlcnMgc2hvdWxkIHN0aWNrIHRvIG9uZSBvZiB0aGUKKyAqIGZvbGxvd2luZzoKKyAqCisgKiBTdGFuZGFyZCBjb25maWd1cmF0aW9uIGZvciBzaW5nbGUtYWRhcHRlciBzeXN0ZW1zOgorICogICAgLSBCSU9TIGF0IENFMDBoCisgKiAgICAtIEkvTyBiYXNlIGFkZHJlc3MgMzUwaAorICogICAgLSBJUlEgbGV2ZWwgMTUKKyAqICAgIC0gRE1BIGNoYW5uZWwgNgorICogU3RhbmRhcmQgY29uZmlndXJhdGlvbiBmb3IgYSBzZWNvbmQgYWRhcHRlciBpbiBhIHN5c3RlbToKKyAqICAgIC0gQklPUyBhdCBDODAwaAorICogICAgLSBJL08gYmFzZSBhZGRyZXNzIDMzMGgKKyAqICAgIC0gSVJRIGxldmVsIDExCisgKiAgICAtIERNQSBjaGFubmVsIDUKKyAqCisgKiBBbnlvbmUgd2hvIGNhbiByZWNvbXBpbGUgdGhlIGtlcm5lbCBpcyB3ZWxjb21lIHRvIGFkZCBvdGhlcnMgYXMgbmVlZAorICogYXJpc2VzLCBidXQgdW5wcmVkaWN0YWJsZSByZXN1bHRzIG1heSBvY2N1ciBpZiB0aGVyZSBhcmUgY29uZmxpY3RzLgorICogSW4gYW55IGV2ZW50LCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgYWRhcHRlcnMgaW4gYSBzeXN0ZW0sIHRoZXkgTVVTVAorICogdXNlIGRpZmZlcmVudCBJL08gYmFzZXMsIElSUSBsZXZlbHMsIGFuZCBETUEgY2hhbm5lbHMsIHNpbmNlIHRoZXkgd2lsbCBiZQorICogaW5kaXN0aW5ndWlzaGFibGUgKGFuZCBpbiBkaXJlY3QgY29uZmxpY3QpIG90aGVyd2lzZS4KKyAqCisgKiAgIEFzIGEgcG9pbnQgb2YgaW5mb3JtYXRpb24sIHRoZSBOT19PUCBjb21tYW5kIHRvZ2dsZXMgdGhlIENNRF9SRFkgYml0CisgKiBvZiB0aGUgc3RhdHVzIHBvcnQsIGFuZCB0aGlzIGZhY3QgY291bGQgYmUgdXNlZCBhcyBhIHRlc3QgZm9yIHRoZSBJL08KKyAqIGJhc2UgYWRkcmVzcyAob3IgbW9yZSBnZW5lcmFsbHksIGJvYXJkIGRldGVjdGlvbikuICBUaGVyZSBpcyBhbiBpbnRlcnJ1cHQKKyAqIHN0YXR1cyBwb3J0LCBzbyBJUlEgcHJvYmluZyBjb3VsZCBhbHNvIGJlIGRvbmUuICBJIHN1cHBvc2UgdGhlIGZ1bGwKKyAqIERNQSBkaWFnbm9zdGljIGNvdWxkIGJlIHVzZWQgdG8gZGV0ZWN0IHRoZSBETUEgY2hhbm5lbCBiZWluZyB1c2VkLiAgSQorICogaGF2ZW4ndCBkb25lIGFueSBvZiB0aGlzLCB0aG91Z2gsIGJlY2F1c2UgSSB0aGluayB0aGVyZSdzIHRvbyBtdWNoIG9mCisgKiBhIGNoYW5jZSB0aGF0IHN1Y2ggZXhwbG9yYXRpb25zIGNvdWxkIGJlIGRlc3RydWN0aXZlLCBpZiBzb21lIG90aGVyCisgKiBib2FyZCdzIHJlc291cmNlcyBhcmUgdXNlZCBpbmFkdmVydGVudGx5LiAgU28sIGNhbGwgbWUgYSB3aW1wLCBidXQgSQorICogZG9uJ3Qgd2FudCB0byB0cnkgaXQuICBUaGUgb25seSBraW5kIG9mIGV4cGxvcmF0aW9uIEkgdHJ1c3QgaXMgbWVtb3J5CisgKiBleHBsb3JhdGlvbiwgc2luY2UgaXQncyBtb3JlIGNlcnRhaW4gdGhhdCByZWFkaW5nIG1lbW9yeSB3b24ndCBiZQorICogZGVzdHJ1Y3RpdmUuCisgKgorICogTW9yZSB0byBteSBsaWtpbmcgd291bGQgYmUgYSBMSUxPIGJvb3QgY29tbWFuZCBsaW5lIHNwZWNpZmljYXRpb24sIHN1Y2gKKyAqIGFzIGlzIHVzZWQgYnkgdGhlIGFoYTE1MnggZHJpdmVyIChhbmQgcG9zc2libHkgb3RoZXJzKS4gIEknbGwgbG9vayBpbnRvCisgKiBpdCwgYXMgSSBoYXZlIHRpbWUuLi4KKyAqCisgKiAgIEkgZ2V0IG1haWwgb2NjYXNpb25hbGx5IGZyb20gcGVvcGxlIHdobyBlaXRoZXIgYXJlIHVzaW5nIG9yIGFyZQorICogY29uc2lkZXJpbmcgdXNpbmcgYSBXRDcwMDAgd2l0aCBMaW51eC4gIFRoZXJlIGlzIGEgdmFyaWV0eSBvZgorICogbm9tZW5jbGF0dXJlIGRlc2NyaWJpbmcgV0Q3MDAwJ3MuICBUbyB0aGUgYmVzdCBvZiBteSBrbm93bGVkZ2UsIHRoZQorICogZm9sbG93aW5nIGlzIGEgYnJpZWYgc3VtbWFyeSAoZnJvbSBhbiBvbGQgV0QgZG9jIC0gSSBkb24ndCB3b3JrIGZvcgorICogdGhlbSBvciBhbnl0aGluZyBsaWtlIHRoYXQpOgorICoKKyAqIFdENzAwMC1GQVNTVDI6IFRoaXMgaXMgYSBXRDcwMDAgYm9hcmQgd2l0aCB0aGUgcmVhbC1tb2RlIFNTVCBST00gQklPUworICogICAgICAgIGluc3RhbGxlZC4gIExhc3QgSSBoZWFyZCwgdGhlIEJJT1Mgd2FzIGFjdHVhbGx5IGRvbmUgYnkgQ29sdW1iaWEKKyAqICAgICAgICBEYXRhIFByb2R1Y3RzLiAgVGhlIEJJT1MgaXMgb25seSB1c2VkIGJ5IHRoaXMgZHJpdmVyIChhbmQgdGh1cworICogICAgICAgIGJ5IExpbnV4KSB0byBpZGVudGlmeSB0aGUgYm9hcmQ7IG5vbmUgb2YgaXQgY2FuIGJlIGV4ZWN1dGVkIHVuZGVyCisgKiAgICAgICAgTGludXguCisgKgorICogV0Q3MDAwLUFTQzogVGhpcyBpcyB0aGUgb3JpZ2luYWwgYWRhcHRlciBib2FyZCwgd2l0aCBvciB3aXRob3V0IEJJT1MuCisgKiAgICAgICAgVGhlIGJvYXJkIHVzZXMgYSBXRDMzQzkzIG9yIFdEMzNDOTNBIFNCSUMsIHdoaWNoIGluIHR1cm4gaXMKKyAqICAgICAgICBjb250cm9sbGVkIGJ5IGFuIG9uYm9hcmQgWjgwIHByb2Nlc3Nvci4gIFRoZSBib2FyZCBpbnRlcmZhY2UKKyAqICAgICAgICB2aXNpYmxlIHRvIHRoZSBob3N0IENQVSBpcyBkZWZpbmVkIGVmZmVjdGl2ZWx5IGJ5IHRoZSBaODAncworICogICAgICAgIGZpcm13YXJlLCBhbmQgaXQgaXMgdGhpcyBmaXJtd2FyZSdzIHJldmlzaW9uIGxldmVsIHRoYXQgaXMKKyAqICAgICAgICBkZXRlcm1pbmVkIGFuZCByZXBvcnRlZCBieSB0aGlzIGRyaXZlci4gIChUaGUgdmVyc2lvbiBvZiB0aGUKKyAqICAgICAgICBvbi1ib2FyZCBCSU9TIGlzIG9mIG5vIGludGVyZXN0IHdoYXRzb2V2ZXIuKSAgVGhlIGhvc3QgQ1BVIGhhcworICogICAgICAgIG5vIGFjY2VzcyB0byB0aGUgU0JJQzsgaGVuY2UgdGhlIGZhY3QgdGhhdCBpdCBpcyBhIFdEMzNDOTMgaXMKKyAqICAgICAgICBhbHNvIG9mIG5vIGludGVyZXN0IHRvIHRoaXMgZHJpdmVyLgorICoKKyAqIFdENzAwMC1BWDoKKyAqIFdENzAwMC1NWDoKKyAqIFdENzAwMC1FWDogVGhlc2UgYXJlIG5ld2VyIHZlcnNpb25zIG9mIHRoZSBXRDcwMDAtQVNDLiAgVGhlIC1BU0MgaXMKKyAqICAgICAgICBsYXJnZWx5IGJ1aWx0IGZyb20gZGlzY3JldGUgY29tcG9uZW50czsgdGhlc2UgYm9hcmRzIHVzZSBtb3JlCisgKiAgICAgICAgaW50ZWdyYXRpb24uICBUaGUgLUFYIGlzIGFuIElTQSBidXMgYm9hcmQgKGxpa2UgdGhlIC1BU0MpLAorICogICAgICAgIHRoZSAtTVggaXMgYW4gTUNBIChpLmUuLCBQUy8yKSBidXMgYm9hcmQpLCBhbmQgdGhlIC1FWCBpcyBhbgorICogICAgICAgIEVJU0EgYnVzIGJvYXJkLgorICoKKyAqICBBdCB0aGUgdGltZSBvZiBteSBkb2N1bWVudGF0aW9uLCB0aGUgLT9YIGJvYXJkcyB3ZXJlICJmdXR1cmUiIHByb2R1Y3RzLAorICogIGFuZCB3ZXJlIG5vdCB5ZXQgYXZhaWxhYmxlLiAgSG93ZXZlciwgSSB2YWd1ZWx5IHJlY2FsbCB0aGF0IFRob21hcworICogIFd1ZW5zY2hlIGhhZCBhbiAtQVgsIHNvIEkgYmVsaWV2ZSBhdCBsZWFzdCBpdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcworICogIGRyaXZlci4gIEkgaGF2ZSBubyBwZXJzb25hbCBrbm93bGVkZ2Ugb2YgZWl0aGVyIC1NWCBvciAtRVggYm9hcmRzLgorICoKKyAqICBQLlMuIEp1c3QgcmVjZW50bHksIEkndmUgZGlzY292ZXJlZCAoZGlyZWN0bHkgZnJvbSBXRCBhbmQgRnV0dXJlCisgKiAgRG9tYWluKSB0aGF0IGFsbCBidXQgdGhlIFdENzAwMC1FWCBoYXZlIGJlZW4gb3V0IG9mIHByb2R1Y3Rpb24gZm9yCisgKiAgdHdvIHllYXJzIG5vdy4gIEZEIGhhcyBwcm9kdWN0aW9uIHJpZ2h0cyB0byB0aGUgNzAwMC1FWCwgYW5kIGFyZQorICogIHByb2R1Y2luZyBpdCB1bmRlciBhIG5ldyBuYW1lLCBhbmQgd2l0aCBhIG5ldyBCSU9TLiAgSWYgYW55b25lIGhhcworICogIG9uZSBvZiB0aGUgRkQgYm9hcmRzLCBpdCB3b3VsZCBiZSBuaWNlIHRvIGNvbWUgdXAgd2l0aCBhIHNpZ25hdHVyZQorICogIGZvciBpdC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKLkIuIEphbiAxOTk0LgorICoKKyAqCisgKiAgUmV2aXNpb25zIGJ5IE1pcm9zbGF2IFphZ29yYWMgPHphZ2FAZmx5LmNjLmZlci5ocj4KKyAqCisgKiAgMDgvMjQvMTk5Ni4KKyAqCisgKiAgRW5oYW5jZW1lbnQgZm9yIHdkNzAwMF9kZXRlY3QgZnVuY3Rpb24gaGFzIGJlZW4gbWFkZSwgc28geW91IGRvbid0IGhhdmUKKyAqICB0byBlbnRlciBCSU9TIFJPTSBhZGRyZXNzIGluIGluaXRpYWxpc2F0aW9uIGRhdGEgKHNlZSBzdHJ1Y3QgQ29uZmlnKS4KKyAqICBXZSBjYW5ub3QgZGV0ZWN0IElSUSwgRE1BIGFuZCBJL08gYmFzZSBhZGRyZXNzIGZvciBub3csIHNvIHdlIGhhdmUgdG8KKyAqICBlbnRlciB0aGVtIGFzIGFyZ3VtZW50cyB3aGlsZSB3ZF83MDAwIGlzIGRldGVjdGVkLiBJZiBzb21lb25lIGhhcyBJUlEsCisgKiAgRE1BIG9yIEkvTyBiYXNlIGFkZHJlc3Mgc2V0IHRvIHNvbWUgb3RoZXIgdmFsdWUsIGhlIGNhbiBlbnRlciB0aGVtIGluCisgKiAgY29uZmlndXJhdGlvbiB3aXRob3V0IGFueSBwcm9ibGVtLiBBbHNvIEkgd3JvdGUgYSBmdW5jdGlvbiB3ZDcwMDBfc2V0dXAsCisgKiAgc28gbm93IHlvdSBjYW4gZW50ZXIgV0QtNzAwMCBkZWZpbml0aW9uIGFzIGtlcm5lbCBhcmd1bWVudHMsCisgKiAgYXMgaW4gbGlsby5jb25mOgorICoKKyAqICAgICBhcHBlbmQ9IndkNzAwMD1JUlEsRE1BLElPIgorICoKKyAqICBQUzogSWYgY2FyZCBCSU9TIFJPTSBpcyBkaXNhYmxlZCwgZnVuY3Rpb24gd2Q3MDAwX2RldGVjdCBub3cgd2lsbCByZWNvZ25pemUKKyAqICAgICAgYWRhcHRlciwgdW5saWtlIHRoZSBvbGQgb25lLiBBbnl3YXksIEJJT1MgUk9NIGZyb20gV0Q3MDAwIGFkYXB0ZXIgaXMKKyAqICAgICAgdXNlbGVzcyBmb3IgTGludXguIEJeKQorICoKKyAqCisgKiAgMDkvMDYvMTk5Ni4KKyAqCisgKiAgQXV0b2RldGVjdGluZyBvZiBJL08gYmFzZSBhZGRyZXNzIGZyb20gd2Q3MDAwX2RldGVjdCBmdW5jdGlvbiBpcyByZW1vdmVkLAorICogIHNvbWUgbGl0dGxlIGJ1Z3MgcmVtb3ZlZCwgZXRjLi4uCisgKgorICogIFRoYW5rcyB0byBSb2dlciBTY290dCBmb3IgZHJpdmVyIGRlYnVnZ2luZy4KKyAqCisgKiAgMDYvMDcvMTk5NworICoKKyAqICBBZGRlZCBzdXBwb3J0IGZvciAvcHJvYyBmaWxlIHN5c3RlbSAoL3Byb2Mvc2NzaS93ZDcwMDAvWzAuLi5dIGZpbGVzKS4KKyAqICBOb3csIGRyaXZlciBjYW4gaGFuZGxlIGhhcmQgZGlza3Mgd2l0aCBjYXBhY2l0eSA+MUdCLgorICoKKyAqICAwMS8xNS8xOTk4CisgKgorICogIEFkZGVkIHN1cHBvcnQgZm9yIEJVU19PTiBhbmQgQlVTX09GRiBwYXJhbWV0ZXJzIGluIGNvbmZpZyBsaW5lLgorICogIE1pc2NlbGxhbmVvdXMgY2xlYW51cC4KKyAqCisgKiAgMDMvMDEvMTk5OAorICoKKyAqICBXRDcwMDAgZHJpdmVyIG5vdyB3b3JrIG9uIGtlcm5lbHMgPj0gMi4xLngKKyAqCisgKgorICogMTIvMzEvMjAwMSAtIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICoKKyAqIHVzZSBob3N0LT5ob3N0X2xvY2ssIG5vdCBpb19yZXF1ZXN0X2xvY2ssIGNsZWFudXBzCisgKgorICogMjAwMi8xMC8wNCAtIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKgorICogVXNlIGRldl9pZCBmb3IgaW50ZXJydXB0cywga2lsbCBfX0ZVTkNUSU9OX18gcGFzdGluZworICogQWRkIGEgbG9jayBmb3IgdGhlIHNjYiBwb29sLCBjbGVhbiB1cCBhbGwgb3RoZXIgY2xpL3N0aSB1c2FnZSBzdHVmZgorICogVXNlIHRoZSBhZGFwdGVyIGxvY2sgZm9yIHRoZSBvdGhlciBwbGFjZXMgd2UgaGFkIHRoZSBjbGkncworICoKKyAqIDIwMDIvMTAvMDYgLSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqIFN3aXRjaCB0byBuZXcgc3R5bGUgZXJyb3IgaGFuZGxpbmcKKyAqIENsZWFuIHVwIGRlbGF5IHRvIHVkZWxheSwgYW5kIHlpZWxkaW5nIHNsZWVwcworICogTWFrZSBob3N0IHJlc2V0IGFjdHVhbGx5IHJlc2V0IHRoZSBjYXJkCisgKiBNYWtlIGV2ZXJ5dGhpbmcgc3RhdGljCisgKgorICogMjAwMy8wMi8xMiAtIENocmlzdG9waCBIZWxsd2lnIDxoY2hAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiBDbGVhbmVkIHVwIGhvc3QgdGVtcGxhdGUgZGVmaW50aW9uCisgKiBSZW1vdmVkIG5vdyBvYnNvbGV0ZSB3ZDcwMDAuaAorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKworCisjdW5kZWYgIFdENzAwMF9ERUJVRwkJLyogZ2VuZXJhbCBkZWJ1ZyAgICAgICAgICAgICAgICAqLworI2lmZGVmIFdENzAwMF9ERUJVRworI2RlZmluZSBkcHJpbnRrIHByaW50aworI2Vsc2UKKyNkZWZpbmUgZHByaW50ayhmb3JtYXQsYXJncy4uLikKKyNlbmRpZgorCisvKgorICogIE1haWxib3ggc3RydWN0dXJlIHNpemVzLgorICogIEkgcHJlZmVyIHRvIGtlZXAgdGhlIG51bWJlciBvZiBJQ01CcyBtdWNoIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YKKyAqICBPR01Ccy4gIE9HTUJzIGFyZSB1c2VkIHZlcnkgcXVpY2tseSBieSB0aGUgZHJpdmVyIHRvIHN0YXJ0IG9uZSBvcgorICogIG1vcmUgY29tbWFuZHMsIHdoaWxlIElDTUJzIGFyZSB1c2VkIGJ5IHRoZSBob3N0IGFkYXB0ZXIgcGVyIGNvbW1hbmQuCisgKi8KKyNkZWZpbmUgT0dNQl9DTlQJMTYKKyNkZWZpbmUgSUNNQl9DTlQJMzIKKworLyoKKyAqICBTY2IncyBhcmUgc2hhcmVkIGJ5IGFsbCBhY3RpdmUgYWRhcHRlcnMuICBTbywgaWYgdGhleSBhbGwgYmVjb21lIGJ1c3ksCisgKiAgY2FsbGVycyBtYXkgYmUgbWFkZSB0byB3YWl0IGluIGFsbG9jX3NjYnMgZm9yIHRoZW0gdG8gZnJlZS4gIFRoYXQgY2FuCisgKiAgYmUgYXZvaWRlZCBieSBzZXR0aW5nIE1BWF9TQ0JTIHRvIE5VTV9DT05GSUcgKiBXRDcwMDBfUS4gIElmIHlvdSdkCisgKiAgcmF0aGVyIGNvbnNlcnZlIG1lbW9yeSwgdXNlIGEgc21hbGxlciBudW1iZXIgKD4gMCwgb2YgY291cnNlKSAtIHRoaW5ncworICogIHdpbGwgc2hvdWxkIHN0aWxsIHdvcmsgT0suCisgKi8KKyNkZWZpbmUgTUFYX1NDQlMgICAgICAgIDMyCisKKy8qCisgKiAgSW4gdGhpcyB2ZXJzaW9uLCBzZ190YWJsZXNpemUgbm93IGRlZmF1bHRzIHRvIFdENzAwMF9TRywgYW5kIHdpbGwKKyAqICBiZSBzZXQgdG8gU0dfTk9ORSBmb3Igb2xkZXIgYm9hcmRzLiAgVGhpcyBpcyB0aGUgcmV2ZXJzZSBvZiB0aGUKKyAqICBwcmV2aW91cyBkZWZhdWx0LCBhbmQgd2FzIGNoYW5nZWQgc28gdGhhdCB0aGUgZHJpdmVyLWxldmVsCisgKiAgc2NzaV9ob3N0X3RlbXBsYXRlIHdvdWxkIHJlZmxlY3QgdGhlIGRyaXZlcidzIHN1cHBvcnQgZm9yIHNjYXR0ZXIvCisgKiAgZ2F0aGVyLgorICoKKyAqICBBbHNvLCBpdCBoYXMgYmVlbiByZXBvcnRlZCB0aGF0IGJvYXJkcyBhdCBSZXZpc2lvbiA2IHN1cHBvcnQgc2NhdHRlci8KKyAqICBnYXRoZXIsIHNvIHRoZSBuZXcgZGVmaW5pdGlvbiBvZiBhbiAib2xkZXIiIGJvYXJkIGhhcyBiZWVuIGNoYW5nZWQKKyAqICBhY2NvcmRpbmdseS4KKyAqLworI2RlZmluZSBXRDcwMDBfUQkxNgorI2RlZmluZSBXRDcwMDBfU0cJMTYKKworCisvKgorICogIFdENzAwMC1zcGVjaWZpYyBtYWlsYm94IHN0cnVjdHVyZQorICoKKyAqLwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QgbWFpbGJveCB7CisJdW5jaGFyIHN0YXR1czsKKwl1bmNoYXIgc2NicHRyWzNdOwkvKiBTQ1NJLXN0eWxlIC0gTVNCIGZpcnN0IChiaWcgZW5kaWFuKSAqLworfSBNYWlsYm94OworCisvKgorICogIFRoaXMgc3RydWN0dXJlIHNob3VsZCBjb250YWluIGFsbCBwZXItYWRhcHRlciBnbG9iYWwgZGF0YS4gIEkuZS4sIGFueQorICogIG5ldyBnbG9iYWwgcGVyLWFkYXB0ZXIgZGF0YSBzaG91bGQgcHV0IGluIGhlcmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFkYXB0ZXIgeworCXN0cnVjdCBTY3NpX0hvc3QgKnNoOwkvKiBQb2ludGVyIHRvIFNjc2lfSG9zdCBzdHJ1Y3R1cmUgICAgKi8KKwlpbnQgaW9iYXNlOwkJLyogVGhpcyBhZGFwdGVyJ3MgSS9PIGJhc2UgYWRkcmVzcyAgICovCisJaW50IGlycTsJCS8qIFRoaXMgYWRhcHRlcidzIElSUSBsZXZlbCAgICAgICAgICAqLworCWludCBkbWE7CQkvKiBUaGlzIGFkYXB0ZXIncyBETUEgY2hhbm5lbCAgICAgICAgKi8KKwlpbnQgaW50X2NvdW50ZXI7CS8qIFRoaXMgYWRhcHRlcidzIGludGVycnVwdCBjb3VudGVyICAqLworCWludCBidXNfb247CQkvKiBUaGlzIGFkYXB0ZXIncyBCVVNfT04gdGltZSAgICAgICAgKi8KKwlpbnQgYnVzX29mZjsJCS8qIFRoaXMgYWRhcHRlcidzIEJVU19PRkYgdGltZSAgICAgICAqLworCXN0cnVjdCB7CQkvKiBUaGlzIGFkYXB0ZXIncyBtYWlsYm94ZXMgICAgICAgICAgKi8KKwkJTWFpbGJveCBvZ21iW09HTUJfQ05UXTsJLyogT3V0Z29pbmcgbWFpbGJveGVzICAgICAgICAgICAgICAgICovCisJCU1haWxib3ggaWNtYltJQ01CX0NOVF07CS8qIEluY29taW5nIG1haWxib3hlcyAgICAgICAgICAgICAgICAqLworCX0gbWI7CisJaW50IG5leHRfb2dtYjsJCS8qIHRvIHJlZHVjZSBjb250ZW50aW9uIGF0IG1haWxib3hlcyAqLworCXVuY2hhciBjb250cm9sOwkJLyogc2hhZG93cyBDT05UUk9MIHBvcnQgdmFsdWUgICAgICAgICovCisJdW5jaGFyIHJldjEsIHJldjI7CS8qIGZpbGxlZCBpbiBieSB3ZDcwMDBfcmV2aXNpb24gICAgICAqLworfSBBZGFwdGVyOworCisvKgorICogKGxpbmVhcikgYmFzZSBhZGRyZXNzIGZvciBST00gQklPUworICovCitzdGF0aWMgY29uc3QgbG9uZyB3ZDcwMDBfYmlvc2FkZHJbXSA9IHsKKwkweGMwMDAwLCAweGMyMDAwLCAweGM0MDAwLCAweGM2MDAwLCAweGM4MDAwLCAweGNhMDAwLCAweGNjMDAwLCAweGNlMDAwLAorCTB4ZDAwMDAsIDB4ZDIwMDAsIDB4ZDQwMDAsIDB4ZDYwMDAsIDB4ZDgwMDAsIDB4ZGEwMDAsIDB4ZGMwMDAsIDB4ZGUwMDAKK307CisjZGVmaW5lIE5VTV9BRERSUyAoc2l6ZW9mKHdkNzAwMF9iaW9zYWRkcikvc2l6ZW9mKGxvbmcpKQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgd2Q3MDAwX2lvYmFzZVtdID0geworCTB4MDMwMCwgMHgwMzA4LCAweDAzMTAsIDB4MDMxOCwgMHgwMzIwLCAweDAzMjgsIDB4MDMzMCwgMHgwMzM4LAorCTB4MDM0MCwgMHgwMzQ4LCAweDAzNTAsIDB4MDM1OCwgMHgwMzYwLCAweDAzNjgsIDB4MDM3MCwgMHgwMzc4LAorCTB4MDM4MCwgMHgwMzg4LCAweDAzOTAsIDB4MDM5OCwgMHgwM2EwLCAweDAzYTgsIDB4MDNiMCwgMHgwM2I4LAorCTB4MDNjMCwgMHgwM2M4LCAweDAzZDAsIDB4MDNkOCwgMHgwM2UwLCAweDAzZTgsIDB4MDNmMCwgMHgwM2Y4Cit9OworI2RlZmluZSBOVU1fSU9QT1JUUyAoc2l6ZW9mKHdkNzAwMF9pb2Jhc2UpL3NpemVvZih1bnNpZ25lZCBzaG9ydCkpCisKK3N0YXRpYyBjb25zdCBzaG9ydCB3ZDcwMDBfaXJxW10gPSB7IDMsIDQsIDUsIDcsIDksIDEwLCAxMSwgMTIsIDE0LCAxNSB9OworI2RlZmluZSBOVU1fSVJRUyAoc2l6ZW9mKHdkNzAwMF9pcnEpL3NpemVvZihzaG9ydCkpCisKK3N0YXRpYyBjb25zdCBzaG9ydCB3ZDcwMDBfZG1hW10gPSB7IDUsIDYsIDcgfTsKKyNkZWZpbmUgTlVNX0RNQVMgKHNpemVvZih3ZDcwMDBfZG1hKS9zaXplb2Yoc2hvcnQpKQorCisvKgorICogVGhlIGZvbGxvd2luZyBpcyBzZXQgdXAgYnkgd2Q3MDAwX2RldGVjdCwgYW5kIHVzZWQgdGhlcmVhZnRlciBmb3IKKyAqIHByb2MgYW5kIG90aGVyIGdsb2JhbCBvb2t1cHMKKyAqLworCisjZGVmaW5lIFVOSVRTCTgKK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICp3ZDcwMDBfaG9zdFtVTklUU107CisKKyNkZWZpbmUgQlVTX09OICAgIDY0CQkvKiB4IDEyNW5zID0gODAwMG5zIChCSU9TIGRlZmF1bHQpICovCisjZGVmaW5lIEJVU19PRkYgICAxNQkJLyogeCAxMjVucyA9IDE4NzVucyAoQklPUyBkZWZhdWx0KSAqLworCisvKgorICogIFN0YW5kYXJkIEFkYXB0ZXIgQ29uZmlndXJhdGlvbnMgLSB1c2VkIGJ5IHdkNzAwMF9kZXRlY3QKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXNob3J0IGlycTsJCS8qIElSUSBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXNob3J0IGRtYTsJCS8qIERNQSBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGlvYmFzZTsJLyogSS9PIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJc2hvcnQgYnVzX29uOwkJLyogVGltZSB0aGF0IFdENzAwMCBzcGVuZHMgb24gdGhlIEFULWJ1cyB3aGVuICovCisJLyogdHJhbnNmZXJyaW5nIGRhdGEuIEJJT1MgZGVmYXVsdCBpcyA4MDAwbnMuICovCisJc2hvcnQgYnVzX29mZjsJCS8qIFRpbWUgdGhhdCBXRDcwMDAgc3BlbmRzIE9GRiBUSEUgQlVTIGFmdGVyICAqLworCS8qIHdoaWxlIGl0IGlzIHRyYW5zZmVycmluZyBkYXRhLiAgICAgICAgICAgICAqLworCS8qIEJJT1MgZGVmYXVsdCBpcyAxODc1bnMgICAgICAgICAgICAgICAgICAgICAqLworfSBDb25maWc7CisKKy8qCisgKiBBZGQgaGVyZSB5b3VyIGNvbmZpZ3VyYXRpb24uLi4KKyAqLworc3RhdGljIENvbmZpZyBjb25maWdzW10gPSB7CisJezE1LCA2LCAweDM1MCwgQlVTX09OLCBCVVNfT0ZGfSwJLyogZGVmYXVsdHMgZm9yIHNpbmdsZSBhZGFwdGVyICovCisJezExLCA1LCAweDMyMCwgQlVTX09OLCBCVVNfT0ZGfSwJLyogZGVmYXVsdHMgZm9yIHNlY29uZCBhZGFwdGVyICovCisJezcsIDYsIDB4MzUwLCBCVVNfT04sIEJVU19PRkZ9LAkvKiBNeSBjb25maWd1cmF0aW9uIChaYWdhKSAgICAgKi8KKwl7LTEsIC0xLCAweDAsIEJVU19PTiwgQlVTX09GRn0JLyogRW1wdHkgc2xvdCAgICAgICAgICAgICAgICAgICovCit9OworI2RlZmluZSBOVU1fQ09ORklHUyAoc2l6ZW9mKGNvbmZpZ3MpL3NpemVvZihDb25maWcpKQorCisvKgorICogIFRoZSBmb2xsb3dpbmcgbGlzdCBkZWZpbmVzIHN0cmluZ3MgdG8gbG9vayBmb3IgaW4gdGhlIEJJT1MgdGhhdCBpZGVudGlmeQorICogIGl0IGFzIHRoZSBXRDcwMDAtRkFTU1QyIFNTVCBCSU9TLiAgSSBzdXNwZWN0IHRoYXQgc29tZXRoaW5nIHNob3VsZCBiZQorICogIGFkZGVkIGZvciB0aGUgRnV0dXJlIERvbWFpbiB2ZXJzaW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBzaWduYXR1cmUgeworCWNvbnN0IGNoYXIgKnNpZzsJLyogU3RyaW5nIHRvIGxvb2sgZm9yICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIG9mczsJLyogb2Zmc2V0IGZyb20gQklPUyBiYXNlIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsZW47CQkvKiBsZW5ndGggb2Ygc3RyaW5nICAgICAgICAgICAgICAqLworfSBTaWduYXR1cmU7CisKK3N0YXRpYyBjb25zdCBTaWduYXR1cmUgc2lnbmF0dXJlc1tdID0geworCXsiU1NUQklPUyIsIDB4MDAwMGQsIDd9CS8qICJTU1RCSU9TIiBAIG9mZnNldCAweDAwMDBkICovCit9OworI2RlZmluZSBOVU1fU0lHTkFUVVJFUyAoc2l6ZW9mKHNpZ25hdHVyZXMpL3NpemVvZihTaWduYXR1cmUpKQorCisKKy8qCisgKiAgSS9PIFBvcnQgT2Zmc2V0cyBhbmQgQml0IERlZmluaXRpb25zCisgKiAgNCBhZGRyZXNzZXMgYXJlIHVzZWQuICBUaG9zZSBub3QgZGVmaW5lZCBoZXJlIGFyZSByZXNlcnZlZC4KKyAqLworI2RlZmluZSBBU0NfU1RBVCAgICAgICAgMAkvKiBTdGF0dXMsICBSZWFkICAgICAgICAgICovCisjZGVmaW5lIEFTQ19DT01NQU5EICAgICAwCS8qIENvbW1hbmQsIFdyaXRlICAgICAgICAgKi8KKyNkZWZpbmUgQVNDX0lOVFJfU1RBVCAgIDEJLyogSW50ZXJydXB0IFN0YXR1cywgUmVhZCAqLworI2RlZmluZSBBU0NfSU5UUl9BQ0sgICAgMQkvKiBBY2tub3dsZWRnZSwgV3JpdGUgICAgICovCisjZGVmaW5lIEFTQ19DT05UUk9MICAgICAyCS8qIENvbnRyb2wsIFdyaXRlICAgICAgICAgKi8KKworLyoKKyAqIEFTQyBTdGF0dXMgUG9ydAorICovCisjZGVmaW5lIElOVF9JTQkJMHg4MAkvKiBJbnRlcnJ1cHQgSW1hZ2UgRmxhZyAgICAgICAgICAgKi8KKyNkZWZpbmUgQ01EX1JEWQkJMHg0MAkvKiBDb21tYW5kIFBvcnQgUmVhZHkgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ01EX1JFSgkJMHgyMAkvKiBDb21tYW5kIFBvcnQgQnl0ZSBSZWplY3RlZCAgICAgKi8KKyNkZWZpbmUgQVNDX0lOSVQgICAgICAgIDB4MTAJLyogQVNDIEluaXRpYWxpemVkIEZsYWcgICAgICAgICAgICovCisjZGVmaW5lIEFTQ19TVEFUTUFTSyAgICAweGYwCS8qIFRoZSBsb3dlciA0IEJ5dGVzIGFyZSByZXNlcnZlZCAqLworCisvKgorICogQ09NTUFORCBvcGNvZGVzCisgKgorICogIFVuZm9ydHVuYXRlbHksIEkgaGF2ZSBubyBpZGVhIGhvdyB0byBwcm9wZXJseSB1c2Ugc29tZSBvZiB0aGVzZSBjb21tYW5kcywKKyAqICBhcyB0aGUgT0VNIG1hbnVhbCBkb2VzIG5vdCBtYWtlIGl0IGNsZWFyLiAgSSBoYXZlIG5vdCBiZWVuIGFibGUgdG8gdXNlCisgKiAgZW5hYmxlL2Rpc2FibGUgdW5zb2xpY2l0ZWQgaW50ZXJydXB0cyBvciB0aGUgcmVzZXQgY29tbWFuZHMgd2l0aCBhbnkKKyAqICBkaXNjZXJuaWJsZSBlZmZlY3Qgd2hhdHNvZXZlci4gIEkgdGhpbmsgdGhleSBtYXkgYmUgcmVsYXRlZCB0byBjZXJ0YWluCisgKiAgSUNCIGNvbW1hbmRzLCBidXQgYWdhaW4sIHRoZSBPRU0gbWFudWFsIGRvZXNuJ3QgbWFrZSB0aGF0IGNsZWFyLgorICovCisjZGVmaW5lIE5PX09QICAgICAgICAgICAgIDAJLyogTk8tT1AgdG9nZ2xlcyBDTURfUkRZIGJpdCBpbiBBU0NfU1RBVCAgKi8KKyNkZWZpbmUgSU5JVElBTElaQVRJT04gICAgMQkvKiBpbml0aWFsaXphdGlvbiAoMTAgYnl0ZXMpICAgICAgICAgICAgICAqLworI2RlZmluZSBESVNBQkxFX1VOU19JTlRSICAyCS8qIGRpc2FibGUgdW5zb2xpY2l0ZWQgaW50ZXJydXB0cyAgICAgICAgICovCisjZGVmaW5lIEVOQUJMRV9VTlNfSU5UUiAgIDMJLyogZW5hYmxlIHVuc29saWNpdGVkIGludGVycnVwdHMgICAgICAgICAgKi8KKyNkZWZpbmUgSU5UUl9PTl9GUkVFX09HTUIgNAkvKiBpbnRlcnJ1cHQgb24gZnJlZSBPR01CICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTT0ZUX1JFU0VUICAgICAgICA1CS8qIFNDU0kgYnVzIHNvZnQgcmVzZXQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBUkRfUkVTRVRfQUNLICAgIDYJLyogU0NTSSBidXMgaGFyZCByZXNldCBhY2tub3dsZWRnZSAgICAgICAgKi8KKyNkZWZpbmUgU1RBUlRfT0dNQiAgICAgICAgMHg4MAkvKiBzdGFydCBjb21tYW5kIGluIE9HTUIgKG4pICAgICAgICAgICAgICAqLworI2RlZmluZSBTQ0FOX09HTUJTICAgICAgICAweGMwCS8qIHN0YXJ0IG11bHRpcGxlIGNvbW1hbmRzLCBzaWduYXR1cmUgKG4pICovCisJCQkJLyogICAgd2hlcmUgKG4pID0gbG93ZXIgNiBiaXRzICAgICAgICAgICAgKi8KKy8qCisgKiBGb3IgSU5JVElBTElaQVRJT046CisgKi8KK3R5cGVkZWYgc3RydWN0IGluaXRDbWQgeworCXVuY2hhciBvcDsJCS8qIGNvbW1hbmQgb3Bjb2RlICg9IDEpICAgICAgICAgICAgICAgICAgICAqLworCXVuY2hhciBJRDsJCS8qIEFkYXB0ZXIncyBTQ1NJIElEICAgICAgICAgICAgICAgICAgICAgICAqLworCXVuY2hhciBidXNfb247CQkvKiBCdXMgb24gdGltZSwgeCAxMjVucyAoc2VlIGJlbG93KSAgICAgICAgKi8KKwl1bmNoYXIgYnVzX29mZjsJCS8qIEJ1cyBvZmYgdGltZSwgIiIgICAgICAgICAiIiAgICAgICAgICAgICAqLworCXVuY2hhciByc3ZkOwkJLyogUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJdW5jaGFyIG1haWxib3hlc1szXTsJLyogQWRkcmVzcyBvZiBNYWlsYm94ZXMsIE1TQiBmaXJzdCAgICAgICAgICovCisJdW5jaGFyIG9nbWJzOwkJLyogTnVtYmVyIG9mIG91dGdvaW5nIE1CcywgbWF4IDY0LCAwLDEgPSAxICovCisJdW5jaGFyIGljbWJzOwkJLyogTnVtYmVyIG9mIGluY29taW5nIE1CcywgICAiIiAgICAgICAiIiAgICovCit9IEluaXRDbWQ7CisKKy8qCisgKiBJbnRlcnJ1cHQgU3RhdHVzIFBvcnQgLSBhbHNvIHJldHVybnMgZGlhZ25vc3RpYyBjb2RlcyBhdCBBU0MgcmVzZXQKKyAqCisgKiBpZiBtc2IgaXMgemVybywgdGhlIGxvd2VyIGJpdHMgYXJlIGRpYWdub3N0aWMgc3RhdHVzCisgKiBEaWFnbm9zdGljczoKKyAqIDAxICAgTm8gZGlhZ25vc3RpYyBlcnJvciBvY2N1cnJlZAorICogMDIgICBSQU0gZmFpbHVyZQorICogMDMgICBGSUZPIFIvVyBmYWlsZWQKKyAqIDA0ICAgU0JJQyByZWdpc3RlciByZWFkL3dyaXRlIGZhaWxlZAorICogMDUgICBJbml0aWFsaXphdGlvbiBELUZGIGZhaWxlZAorICogMDYgICBIb3N0IElSUSBELUZGIGZhaWxlZAorICogMDcgICBST00gY2hlY2tzdW0gZXJyb3IKKyAqIEludGVycnVwdCBzdGF0dXMgKGJpdHdpc2UpOgorICogMTBOTk5OTk4gICBvdXRnb2luZyBtYWlsYm94IE5OTk5OTiBpcyBmcmVlCisgKiAxMU5OTk5OTiAgIGluY29taW5nIG1haWxib3ggTk5OTk5OIG5lZWRzIHNlcnZpY2UKKyAqLworI2RlZmluZSBNQl9JTlRSICAgIDB4QzAJCS8qIE1haWxib3ggU2VydmljZSBwb3NzaWJsZS9yZXF1aXJlZCAqLworI2RlZmluZSBJTUJfSU5UUiAgIDB4NDAJCS8qIDEgSW5jb21pbmcgLyAwIE91dGdvaW5nICAgICAgICAgICAqLworI2RlZmluZSBNQl9NQVNLICAgIDB4M2YJCS8qIG1hc2sgZm9yIG1haWxib3ggbnVtYmVyICAgICAgICAgICAqLworCisvKgorICogQ09OVFJPTCBwb3J0IGJpdHMKKyAqLworI2RlZmluZSBJTlRfRU4gICAgIDB4MDgJCS8qIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgRE1BX0VOICAgICAweDA0CQkvKiBETUEgRW5hYmxlICAgICAgICovCisjZGVmaW5lIFNDU0lfUkVTICAgMHgwMgkJLyogU0NTSSBSZXNldCAgICAgICAqLworI2RlZmluZSBBU0NfUkVTICAgIDB4MDEJCS8qIEFTQyBSZXNldCAgICAgICAgKi8KKworLyoKKyAqIERyaXZlciBkYXRhIHN0cnVjdHVyZXM6CisgKiAgIC0gbWIgYW5kIHNjYnMgYXJlIHJlcXVpcmVkIGZvciBpbnRlcmZhY2luZyB3aXRoIHRoZSBob3N0IGFkYXB0ZXIuCisgKiAgICAgQW4gU0NCIGhhcyBleHRyYSBmaWVsZHMgbm90IHZpc2libGUgdG8gdGhlIGFkYXB0ZXI7IG1iJ3MKKyAqICAgICBfY2Fubm90XyBkbyB0aGlzLCBzaW5jZSB0aGUgYWRhcHRlciBhc3N1bWVzIHRoZXkgYXJlIGNvbnRpZ3VvdXMgaW4KKyAqICAgICBtZW1vcnksIDQgYnl0ZXMgZWFjaCwgd2l0aCBJQ01CcyBmb2xsb3dpbmcgT0dNQnMsIGFuZCB1c2VzIHRoaXMgZmFjdAorICogICAgIHRvIGFjY2VzcyB0aGVtLgorICogICAtIEFuIGljYiBpcyBmb3IgaG9zdC1vbmx5IChub24tU0NTSSkgY29tbWFuZHMuICBJQ0JzIGFyZSAxNiBieXRlcyBlYWNoOworICogICAgIHRoZSBhZGRpdGlvbmFsIGJ5dGVzIGFyZSB1c2VkIG9ubHkgYnkgdGhlIGRyaXZlci4KKyAqICAgLSBGb3Igbm93LCBhIHBvb2wgb2YgU0NCcyBhcmUga2VwdCBpbiBnbG9iYWwgc3RvcmFnZSBieSB0aGlzIGRyaXZlciwKKyAqICAgICBhbmQgYXJlIGFsbG9jYXRlZCBhbmQgZnJlZWQgYXMgbmVlZGVkLgorICoKKyAqICBUaGUgNzAwMC1GQVNTVDIgbWFya3MgT0dNQnMgZW1wdHkgYXMgc29vbiBhcyBpdCBoYXMgX3N0YXJ0ZWRfIGEgY29tbWFuZCwKKyAqICBub3Qgd2hlbiBpdCBoYXMgZmluaXNoZWQuICBTaW5jZSB0aGUgU0NCIG11c3QgYmUgYXJvdW5kIGZvciBjb21wbGV0aW9uLAorICogIHByb2JsZW1zIGFyaXNlIHdoZW4gU0NCcyBjb3JyZXNwb25kIHRvIE9HTUJzLCB3aGljaCBtYXkgYmUgcmVhbGxvY2F0ZWQKKyAqICBlYXJsaWVyIChvciBkZWxheWVkIHVubmVjZXNzYXJpbHkgdW50aWwgYSBjb21tYW5kIGNvbXBsZXRlcykuCisgKiAgTWFpbGJveGVzIGFyZSB1c2VkIGFzIHRyYW5zaWVudCBkYXRhIHN0cnVjdHVyZXMsIHNpbXBseSBmb3IKKyAqICBjYXJyeWluZyBTQ0IgYWRkcmVzc2VzIHRvL2Zyb20gdGhlIDcwMDAtRkFTU1QyLgorICoKKyAqICBOb3RlIGFsc28gc2luY2UgU0NCcyBhcmUgbm90ICJwZXJtYW5lbnRseSIgYXNzb2NpYXRlZCB3aXRoIG1haWxib3hlcywKKyAqICB0aGVyZSBpcyBubyBuZWVkIHRvIGtlZXAgYSBnbG9iYWwgbGlzdCBvZiBzY3NpX2NtbmQgcG9pbnRlcnMgaW5kZXhlZAorICogIGJ5IE9HTUIuICAgQWdhaW4sIFNDQnMgcmVmZXJlbmNlIHRoZWlyIHNjc2lfY21uZHMgZGlyZWN0bHksIHNvIG1haWxib3gKKyAqICBpbmRpY2VzIG5lZWQgbm90IGJlIGludm9sdmVkLgorICovCisKKy8qCisgKiAgV0Q3MDAwLXNwZWNpZmljIHNjYXR0ZXIvZ2F0aGVyIGVsZW1lbnQgc3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IHNnYiB7CisJdW5jaGFyIGxlblszXTsKKwl1bmNoYXIgcHRyWzNdOwkJLyogQWxzbyBTQ1NJLXN0eWxlIC0gTVNCIGZpcnN0ICovCit9IFNnYjsKKwordHlwZWRlZiBzdHJ1Y3Qgc2NiIHsJCS8qIENvbW1hbmQgQ29udHJvbCBCbG9jayA1LjQuMSAgICAgICAgICAgICAgICovCisJdW5jaGFyIG9wOwkJLyogQ29tbWFuZCBDb250cm9sIEJsb2NrIE9wZXJhdGlvbiBDb2RlICAgICAgKi8KKwl1bmNoYXIgaWRsdW47CQkvKiBvcD0wLDI6VGFyZ2V0IElkLCBvcD0xOkluaXRpYXRvciBJZCAgICAgICAqLworCS8qIE91dGJvdW5kIGRhdGEgdHJhbnNmZXIsIGxlbmd0aCBpcyBjaGVja2VkICovCisJLyogSW5ib3VuZCBkYXRhIHRyYW5zZmVyLCBsZW5ndGggaXMgY2hlY2tlZCAgKi8KKwkvKiBMb2dpY2FsIFVuaXQgTnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAqLworCXVuY2hhciBjZGJbMTJdOwkJLyogU0NTSSBDb21tYW5kIEJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bmNoYXIgc3RhdHVzOwkvKiBTQ1NJIFJldHVybiBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAqLworCXZvbGF0aWxlIHVuY2hhciB2dWU7CS8qIFZlbmRvciBVbmlxdWUgRXJyb3IgQ29kZSAgICAgICAgICAgICAgICAgICovCisJdW5jaGFyIG1heGxlblszXTsJLyogTWF4aW11bSBEYXRhIFRyYW5zZmVyIExlbmd0aCAgICAgICAgICAgICAgKi8KKwl1bmNoYXIgZGF0YXB0clszXTsJLyogU0NTSSBEYXRhIEJsb2NrIFBvaW50ZXIgICAgICAgICAgICAgICAgICAgKi8KKwl1bmNoYXIgbGlua3B0clszXTsJLyogTmV4dCBDb21tYW5kIExpbmsgUG9pbnRlciAgICAgICAgICAgICAgICAgKi8KKwl1bmNoYXIgZGlyZWM7CQkvKiBUcmFuc2ZlciBEaXJlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAqLworCXVuY2hhciByZXNlcnZlZDJbNl07CS8qIFNDU0kgQ29tbWFuZCBEZXNjcmlwdG9yIEJsb2NrICAgICAgICAgICAgICovCisJLyogZW5kIG9mIGhhcmR3YXJlIFNDQiAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudDsvKiBzY3NpX2NtbmQgdXNpbmcgdGhpcyBTQ0IgICAgICAgICAgICAgICAgICAqLworCVNnYiBzZ2JbV0Q3MDAwX1NHXTsJLyogU2NhdHRlci9nYXRoZXIgbGlzdCBmb3IgdGhpcyBTQ0IgICAgICAgICAgKi8KKwlBZGFwdGVyICpob3N0OwkJLyogaG9zdCBhZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlzdHJ1Y3Qgc2NiICpuZXh0OwkvKiBmb3IgbGlzdHMgb2Ygc2NicyAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBTY2I7CisKKy8qCisgKiAgVGhpcyBkcml2ZXIgaXMgd3JpdHRlbiB0byBhbGxvdyBob3N0LW9ubHkgY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQuCisgKiAgVGhlc2UgdXNlIGEgMTYtYnl0ZSBibG9jayBjYWxsZWQgYW4gSUNCLiAgVGhlIGZvcm1hdCBpcyBleHRlbmRlZCBieSB0aGUKKyAqICBkcml2ZXIgdG8gMTggYnl0ZXMsIHRvIHN1cHBvcnQgdGhlIHN0YXR1cyByZXR1cm5lZCBpbiB0aGUgSUNNQiBhbmQKKyAqICBhbiBleGVjdXRpb24gcGhhc2UgY29kZS4KKyAqCisgKiAgVGhlcmUgYXJlIG90aGVyIGZvcm1hdHMgYmVzaWRlcyB0aGVzZTsgdGhlc2UgYXJlIHRoZSBvbmVzIEkndmUgdHJpZWQKKyAqICB0byB1c2UuICBGb3JtYXRzIGZvciBzb21lIG9mIHRoZSBkZWZpbmVkIElDQiBvcGNvZGVzIGFyZSBub3QgZGVmaW5lZAorICogIChub3RhYmx5LCBnZXQvc2V0IHVuc29saWNpdGVkIGludGVycnVwdCBzdGF0dXMpIGluIG15IGNvcHkgb2YgdGhlIE9FTQorICogIG1hbnVhbCwgYW5kIG90aGVycyBhcmUgYW1iaWd1b3VzL2hhcmQgdG8gZm9sbG93LgorICovCisjZGVmaW5lIElDQl9PUF9NQVNLICAgICAgICAgICAweDgwCS8qIGRpc3Rpbmd1aXNoZXMgc2NicyBmcm9tIGljYnMgICAgICAgICovCisjZGVmaW5lIElDQl9PUF9PUEVOX1JCVUYgICAgICAweDgwCS8qIG9wZW4gcmVjZWl2ZSBidWZmZXIgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElDQl9PUF9SRUNWX0NNRCAgICAgICAweDgxCS8qIHJlY2VpdmUgY29tbWFuZCBmcm9tIGluaXRpYXRvciAgICAgICovCisjZGVmaW5lIElDQl9PUF9SRUNWX0RBVEEgICAgICAweDgyCS8qIHJlY2VpdmUgZGF0YSBmcm9tIGluaXRpYXRvciAgICAgICAgICovCisjZGVmaW5lIElDQl9PUF9SRUNWX1NEQVRBICAgICAweDgzCS8qIHJlY2VpdmUgZGF0YSB3aXRoIHN0YXR1cyBmcm9tIGluaXQuICovCisjZGVmaW5lIElDQl9PUF9TRU5EX0RBVEEgICAgICAweDg0CS8qIHNlbmQgZGF0YSB3aXRoIHN0YXR1cyB0byBpbml0aWF0b3IgICovCisjZGVmaW5lIElDQl9PUF9TRU5EX1NUQVQgICAgICAweDg2CS8qIHNlbmQgY29tbWFuZCBzdGF0dXMgdG8gaW5pdGlhdG9yICAgICovCisJCQkJCS8qIDB4ODcgaXMgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElDQl9PUF9SRUFEX0lOSVQgICAgICAweDg4CS8qIHJlYWQgaW5pdGlhbGl6YXRpb24gYnl0ZXMgICAgICAgICAgICovCisjZGVmaW5lIElDQl9PUF9SRUFEX0lEICAgICAgICAweDg5CS8qIHJlYWQgYWRhcHRlcidzIFNDU0kgSUQgICAgICAgICAgICAgICovCisjZGVmaW5lIElDQl9PUF9TRVRfVU1BU0sgICAgICAweDhBCS8qIHNldCB1bnNvbGljaXRlZCBpbnRlcnJ1cHQgbWFzayAgICAgICovCisjZGVmaW5lIElDQl9PUF9HRVRfVU1BU0sgICAgICAweDhCCS8qIHJlYWQgdW5zb2xpY2l0ZWQgaW50ZXJydXB0IG1hc2sgICAgICovCisjZGVmaW5lIElDQl9PUF9HRVRfUkVWSVNJT04gICAweDhDCS8qIHJlYWQgZmlybXdhcmUgcmV2aXNpb24gbGV2ZWwgICAgICAgICovCisjZGVmaW5lIElDQl9PUF9ESUFHTk9TVElDUyAgICAweDhECS8qIGV4ZWN1dGUgZGlhZ25vc3RpY3MgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElDQl9PUF9TRVRfRVBBUk1TICAgICAweDhFCS8qIHNldCBleGVjdXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICovCisjZGVmaW5lIElDQl9PUF9HRVRfRVBBUk1TICAgICAweDhGCS8qIHJlYWQgZXhlY3V0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICovCisKK3R5cGVkZWYgc3RydWN0IGljYlJlY3ZDbWQgeworCXVuY2hhciBvcDsKKwl1bmNoYXIgSURsdW47CQkvKiBJbml0aWF0b3IgU0NTSSBJRC9sdW4gICAgICovCisJdW5jaGFyIGxlblszXTsJCS8qIGNvbW1hbmQgYnVmZmVyIGxlbmd0aCAgICAgKi8KKwl1bmNoYXIgcHRyWzNdOwkJLyogY29tbWFuZCBidWZmZXIgYWRkcmVzcyAgICAqLworCXVuY2hhciByc3ZkWzddOwkJLyogcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAqLworCXZvbGF0aWxlIHVuY2hhciB2dWU7CS8qIHZlbmRvci11bmlxdWUgZXJyb3IgY29kZSAgKi8KKwl2b2xhdGlsZSB1bmNoYXIgc3RhdHVzOwkvKiByZXR1cm5lZCAoaWNtYikgc3RhdHVzICAgICovCisJdm9sYXRpbGUgdW5jaGFyIHBoYXNlOwkvKiB1c2VkIGJ5IGludGVycnVwdCBoYW5kbGVyICovCit9IEljYlJlY3ZDbWQ7CisKK3R5cGVkZWYgc3RydWN0IGljYlNlbmRTdGF0IHsKKwl1bmNoYXIgb3A7CisJdW5jaGFyIElEbHVuOwkJLyogVGFyZ2V0IFNDU0kgSUQvbHVuICAgICAgICAgICAgICAgICAgKi8KKwl1bmNoYXIgc3RhdDsJCS8qIChvdXRnb2luZykgY29tcGxldGlvbiBzdGF0dXMgYnl0ZSAxICovCisJdW5jaGFyIHJzdmRbMTJdOwkvKiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXZvbGF0aWxlIHVuY2hhciB2dWU7CS8qIHZlbmRvci11bmlxdWUgZXJyb3IgY29kZSAgICAgICAgICAgICovCisJdm9sYXRpbGUgdW5jaGFyIHN0YXR1czsJLyogcmV0dXJuZWQgKGljbWIpIHN0YXR1cyAgICAgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bmNoYXIgcGhhc2U7CS8qIHVzZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIgICAgICAgICAgICovCit9IEljYlNlbmRTdGF0OworCit0eXBlZGVmIHN0cnVjdCBpY2JSZXZMdmwgeworCXVuY2hhciBvcDsKKwl2b2xhdGlsZSB1bmNoYXIgcHJpbWFyeTsJLyogcHJpbWFyeSByZXZpc2lvbiBsZXZlbCAocmV0dXJuZWQpICAgKi8KKwl2b2xhdGlsZSB1bmNoYXIgc2Vjb25kYXJ5OwkvKiBzZWNvbmRhcnkgcmV2aXNpb24gbGV2ZWwgKHJldHVybmVkKSAqLworCXVuY2hhciByc3ZkWzEyXTsJLyogcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bmNoYXIgdnVlOwkvKiB2ZW5kb3ItdW5pcXVlIGVycm9yIGNvZGUgICAgICAgICAgICAqLworCXZvbGF0aWxlIHVuY2hhciBzdGF0dXM7CS8qIHJldHVybmVkIChpY21iKSBzdGF0dXMgICAgICAgICAgICAgICovCisJdm9sYXRpbGUgdW5jaGFyIHBoYXNlOwkvKiB1c2VkIGJ5IGludGVycnVwdCBoYW5kbGVyICAgICAgICAgICAqLworfSBJY2JSZXZMdmw7CisKK3R5cGVkZWYgc3RydWN0IGljYlVuc01hc2sgewkvKiBJJ20gdG90YWxseSBndWVzc2luZyBoZXJlICovCisJdW5jaGFyIG9wOworCXZvbGF0aWxlIHVuY2hhciBtYXNrWzE0XTsJLyogbWFzayBiaXRzICAgICAgICAgICAgICAgICAqLworI2lmIDAKKwl1bmNoYXIgcnN2ZFsxMl07CS8qIHJlc2VydmVkICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZgorCXZvbGF0aWxlIHVuY2hhciB2dWU7CS8qIHZlbmRvci11bmlxdWUgZXJyb3IgY29kZSAgKi8KKwl2b2xhdGlsZSB1bmNoYXIgc3RhdHVzOwkvKiByZXR1cm5lZCAoaWNtYikgc3RhdHVzICAgICovCisJdm9sYXRpbGUgdW5jaGFyIHBoYXNlOwkvKiB1c2VkIGJ5IGludGVycnVwdCBoYW5kbGVyICovCit9IEljYlVuc01hc2s7CisKK3R5cGVkZWYgc3RydWN0IGljYkRpYWcgeworCXVuY2hhciBvcDsKKwl1bmNoYXIgdHlwZTsJCS8qIGRpYWdub3N0aWNzIHR5cGUgY29kZSAoMC0zKSAqLworCXVuY2hhciBsZW5bM107CQkvKiBidWZmZXIgbGVuZ3RoICAgICAgICAgICAgICAgKi8KKwl1bmNoYXIgcHRyWzNdOwkJLyogYnVmZmVyIGFkZHJlc3MgICAgICAgICAgICAgICovCisJdW5jaGFyIHJzdmRbN107CQkvKiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bmNoYXIgdnVlOwkvKiB2ZW5kb3ItdW5pcXVlIGVycm9yIGNvZGUgICAgKi8KKwl2b2xhdGlsZSB1bmNoYXIgc3RhdHVzOwkvKiByZXR1cm5lZCAoaWNtYikgc3RhdHVzICAgICAgKi8KKwl2b2xhdGlsZSB1bmNoYXIgcGhhc2U7CS8qIHVzZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIgICAqLworfSBJY2JEaWFnOworCisjZGVmaW5lIElDQl9ESUFHX1BPV0VSVVAgICAwCS8qIFBvd2VyLXVwIGRpYWdzIG9ubHkgICAgICAgKi8KKyNkZWZpbmUgSUNCX0RJQUdfV0FMS0lORyAgIDEJLyogd2Fsa2luZyAxJ3MgcGF0dGVybiAgICAgICAqLworI2RlZmluZSBJQ0JfRElBR19ETUEgICAgICAgMgkvKiBETUEgLSBzeXN0ZW0gbWVtb3J5IGRpYWdzICovCisjZGVmaW5lIElDQl9ESUFHX0ZVTEwgICAgICAzCS8qIGRvIGJvdGggMSAmIDIgICAgICAgICAgICAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgaWNiUGFybXMgeworCXVuY2hhciBvcDsKKwl1bmNoYXIgcnN2ZDE7CQkvKiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICovCisJdW5jaGFyIGxlblszXTsJCS8qIHBhcm1zIGJ1ZmZlciBsZW5ndGggICAgICAgKi8KKwl1bmNoYXIgcHRyWzNdOwkJLyogcGFybXMgYnVmZmVyIGFkZHJlc3MgICAgICAqLworCXVuY2hhciBpZHhbMl07CQkvKiBpbmRleCAoTVNCLUxTQikgICAgICAgICAgICovCisJdW5jaGFyIHJzdmQyWzVdOwkvKiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICovCisJdm9sYXRpbGUgdW5jaGFyIHZ1ZTsJLyogdmVuZG9yLXVuaXF1ZSBlcnJvciBjb2RlICAqLworCXZvbGF0aWxlIHVuY2hhciBzdGF0dXM7CS8qIHJldHVybmVkIChpY21iKSBzdGF0dXMgICAgKi8KKwl2b2xhdGlsZSB1bmNoYXIgcGhhc2U7CS8qIHVzZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIgKi8KK30gSWNiUGFybXM7CisKK3R5cGVkZWYgc3RydWN0IGljYkFueSB7CisJdW5jaGFyIG9wOworCXVuY2hhciBkYXRhWzE0XTsJLyogZm9ybWF0LXNwZWNpZmljIGRhdGEgICAgICAqLworCXZvbGF0aWxlIHVuY2hhciB2dWU7CS8qIHZlbmRvci11bmlxdWUgZXJyb3IgY29kZSAgKi8KKwl2b2xhdGlsZSB1bmNoYXIgc3RhdHVzOwkvKiByZXR1cm5lZCAoaWNtYikgc3RhdHVzICAgICovCisJdm9sYXRpbGUgdW5jaGFyIHBoYXNlOwkvKiB1c2VkIGJ5IGludGVycnVwdCBoYW5kbGVyICovCit9IEljYkFueTsKKwordHlwZWRlZiB1bmlvbiBpY2IgeworCXVuY2hhciBvcDsJCS8qIElDQiBvcGNvZGUgICAgICAgICAgICAgICAgICAgICAqLworCUljYlJlY3ZDbWQgcmVjdl9jbWQ7CS8qIGZvcm1hdCBmb3IgcmVjZWl2ZSBjb21tYW5kICAgICAqLworCUljYlNlbmRTdGF0IHNlbmRfc3RhdDsJLyogZm9ybWF0IGZvciBzZW5kIHN0YXR1cyAgICAgICAgICovCisJSWNiUmV2THZsIHJldl9sdmw7CS8qIGZvcm1hdCBmb3IgZ2V0IHJldmlzaW9uIGxldmVsICAqLworCUljYkRpYWcgZGlhZzsJCS8qIGZvcm1hdCBmb3IgZXhlY3V0ZSBkaWFnbm9zdGljcyAqLworCUljYlBhcm1zIGVwYXJtczsJLyogZm9ybWF0IGZvciBnZXQvc2V0IGV4ZWMgcGFybXMgICovCisJSWNiQW55IGljYjsJCS8qIGdlbmVyaWMgZm9ybWF0ICAgICAgICAgICAgICAgICAqLworCXVuY2hhciBkYXRhWzE4XTsKK30gSWNiOworCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgY2hhciAqd2Q3MDAwOworbW9kdWxlX3BhcmFtKHdkNzAwMCwgY2hhcnAsIDApOworI2VuZGlmCisKKy8qCisgKiAgRHJpdmVyIFNDQiBzdHJ1Y3R1cmUgcG9vbC4KKyAqCisgKiAgVGhlIFNDQnMgZGVjbGFyZWQgaGVyZSBhcmUgc2hhcmVkIGJ5IGFsbCBob3N0IGFkYXB0ZXJzOyBoZW5jZSwgdGhpcworICogIHN0cnVjdHVyZSBpcyBub3QgcGFydCBvZiB0aGUgQWRhcHRlciBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBTY2Igc2Nic1tNQVhfU0NCU107CitzdGF0aWMgU2NiICpzY2JmcmVlOwkJLyogZnJlZSBsaXN0ICAgICAgICAgKi8KK3N0YXRpYyBpbnQgZnJlZXNjYnMgPSBNQVhfU0NCUzsJLyogZnJlZSBsaXN0IGNvdW50ZXIgKi8KK3N0YXRpYyBzcGlubG9ja190IHNjYnBvb2xfbG9jazsJLyogZ3VhcmRzIHRoZSBzY2IgZnJlZSBsaXN0IGFuZCBjb3VudCAqLworCisvKgorICogIEVORCBvZiBkYXRhL2RlY2xhcmF0aW9ucyAtIGNvZGUgZm9sbG93cy4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHNldHVwX2Vycm9yKGNoYXIgKm1lc2csIGludCAqaW50cykKK3sKKwlpZiAoaW50c1swXSA9PSAzKQorCQlwcmludGsoS0VSTl9FUlIgIndkNzAwMF9zZXR1cDogXCJ3ZDcwMDA9JWQsJWQsMHgleFwiIC0+ICVzXG4iLCBpbnRzWzFdLCBpbnRzWzJdLCBpbnRzWzNdLCBtZXNnKTsKKwllbHNlIGlmIChpbnRzWzBdID09IDQpCisJCXByaW50ayhLRVJOX0VSUiAid2Q3MDAwX3NldHVwOiBcIndkNzAwMD0lZCwlZCwweCV4LCVkXCIgLT4gJXNcbiIsIGludHNbMV0sIGludHNbMl0sIGludHNbM10sIGludHNbNF0sIG1lc2cpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJ3ZDcwMDBfc2V0dXA6IFwid2Q3MDAwPSVkLCVkLDB4JXgsJWQsJWRcIiAtPiAlc1xuIiwgaW50c1sxXSwgaW50c1syXSwgaW50c1szXSwgaW50c1s0XSwgaW50c1s1XSwgbWVzZyk7Cit9CisKKworLyoKKyAqIE5vdGU6IFlvdSBjYW4gbm93IHNldCB0aGVzZSBvcHRpb25zIGZyb20gdGhlIGtlcm5lbCdzICJjb21tYW5kIGxpbmUiLgorICogVGhlIHN5bnRheCBpczoKKyAqCisgKiAgICAgd2Q3MDAwPTxJUlE+LDxETUE+LDxJTz5bLDxCVVNfT04+Wyw8QlVTX09GRj5dXQorICoKKyAqICwgd2hlcmUgQlVTX09OIGFuZCBCVVNfT0ZGIGFyZSBpbiBuYW5vc2Vjb25kcy4gQklPUyBkZWZhdWx0IHZhbHVlcworICogYXJlIDgwMDBucyBmb3IgQlVTX09OIGFuZCAxODc1bnMgZm9yIEJVU19PRkYuCisgKiBlZzoKKyAqICAgICB3ZDcwMDA9Nyw2LDB4MzUwCisgKgorICogd2lsbCBjb25maWd1cmUgdGhlIGRyaXZlciBmb3IgYSBXRC03MDAwIGNvbnRyb2xsZXIKKyAqIHVzaW5nIElSUSAxNSB3aXRoIGEgRE1BIGNoYW5uZWwgNiwgYXQgSU8gYmFzZSBhZGRyZXNzIDB4MzUwLgorICovCitzdGF0aWMgaW50IF9faW5pdCB3ZDcwMDBfc2V0dXAoY2hhciAqc3RyKQoreworCXN0YXRpYyBzaG9ydCB3ZDcwMDBfY2FyZF9udW07CS8qIC5ic3Mgd2lsbCB6ZXJvIHRoaXMgKi8KKwlzaG9ydCBpOworCWludCBpbnRzWzZdOworCisJKHZvaWQpIGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisKKwlpZiAod2Q3MDAwX2NhcmRfbnVtID49IE5VTV9DT05GSUdTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRvbyBtYW55IFwid2Q3MDAwPVwiIGNvbmZpZ3VyYXRpb25zIGluICIgImNvbW1hbmQgbGluZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAwOworCX0KKworCWlmICgoaW50c1swXSA8IDMpIHx8IChpbnRzWzBdID4gNSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgaW4gY29tbWFuZCBsaW5lISAgIiAiVXNhZ2U6IHdkNzAwMD08SVJRPiw8RE1BPixJTz5bLDxCVVNfT04+IiAiWyw8QlVTX09GRj5dXVxuIiwgX19GVU5DVElPTl9fKTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0lSUVM7IGkrKykKKwkJCWlmIChpbnRzWzFdID09IHdkNzAwMF9pcnFbaV0pCisJCQkJYnJlYWs7CisKKwkJaWYgKGkgPT0gTlVNX0lSUVMpIHsKKwkJCXNldHVwX2Vycm9yKCJpbnZhbGlkIElSUS4iLCBpbnRzKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCWNvbmZpZ3Nbd2Q3MDAwX2NhcmRfbnVtXS5pcnEgPSBpbnRzWzFdOworCisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRE1BUzsgaSsrKQorCQkJaWYgKGludHNbMl0gPT0gd2Q3MDAwX2RtYVtpXSkKKwkJCQlicmVhazsKKworCQlpZiAoaSA9PSBOVU1fRE1BUykgeworCQkJc2V0dXBfZXJyb3IoImludmFsaWQgRE1BIGNoYW5uZWwuIiwgaW50cyk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQljb25maWdzW3dkNzAwMF9jYXJkX251bV0uZG1hID0gaW50c1syXTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0lPUE9SVFM7IGkrKykKKwkJCWlmIChpbnRzWzNdID09IHdkNzAwMF9pb2Jhc2VbaV0pCisJCQkJYnJlYWs7CisKKwkJaWYgKGkgPT0gTlVNX0lPUE9SVFMpIHsKKwkJCXNldHVwX2Vycm9yKCJpbnZhbGlkIEkvTyBiYXNlIGFkZHJlc3MuIiwgaW50cyk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQljb25maWdzW3dkNzAwMF9jYXJkX251bV0uaW9iYXNlID0gaW50c1szXTsKKworCQlpZiAoaW50c1swXSA+IDMpIHsKKwkJCWlmICgoaW50c1s0XSA8IDUwMCkgfHwgKGludHNbNF0gPiAzMTg3NSkpIHsKKwkJCQlzZXR1cF9lcnJvcigiQlVTX09OIHZhbHVlIGlzIG91dCBvZiByYW5nZSAoNTAwIiAiIHRvIDMxODc1IG5hbm9zZWNvbmRzKSEiLCBpbnRzKTsKKwkJCQljb25maWdzW3dkNzAwMF9jYXJkX251bV0uYnVzX29uID0gQlVTX09OOworCQkJfSBlbHNlCisJCQkJY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmJ1c19vbiA9IGludHNbNF0gLyAxMjU7CisJCX0gZWxzZQorCQkJY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmJ1c19vbiA9IEJVU19PTjsKKworCQlpZiAoaW50c1swXSA+IDQpIHsKKwkJCWlmICgoaW50c1s1XSA8IDUwMCkgfHwgKGludHNbNV0gPiAzMTg3NSkpIHsKKwkJCQlzZXR1cF9lcnJvcigiQlVTX09GRiB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UgKDUwMCIgIiB0byAzMTg3NSBuYW5vc2Vjb25kcykhIiwgaW50cyk7CisJCQkJY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmJ1c19vZmYgPSBCVVNfT0ZGOworCQkJfSBlbHNlCisJCQkJY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmJ1c19vZmYgPSBpbnRzWzVdIC8gMTI1OworCQl9IGVsc2UKKwkJCWNvbmZpZ3Nbd2Q3MDAwX2NhcmRfbnVtXS5idXNfb2ZmID0gQlVTX09GRjsKKworCQlpZiAod2Q3MDAwX2NhcmRfbnVtKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgKHdkNzAwMF9jYXJkX251bSAtIDEpOyBpKyspIHsKKwkJCQlpbnQgaiA9IGkgKyAxOworCisJCQkJZm9yICg7IGogPCB3ZDcwMDBfY2FyZF9udW07IGorKykKKwkJCQkJaWYgKGNvbmZpZ3NbaV0uaXJxID09IGNvbmZpZ3Nbal0uaXJxKSB7CisJCQkJCQlzZXR1cF9lcnJvcigiZHVwbGljYXRlZCBJUlEhIiwgaW50cyk7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCWlmIChjb25maWdzW2ldLmRtYSA9PSBjb25maWdzW2pdLmRtYSkgeworCQkJCQlzZXR1cF9lcnJvcigiZHVwbGljYXRlZCBETUEgIiAiY2hhbm5lbCEiLCBpbnRzKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWlmIChjb25maWdzW2ldLmlvYmFzZSA9PSBjb25maWdzW2pdLmlvYmFzZSkgeworCQkJCQlzZXR1cF9lcnJvcigiZHVwbGljYXRlZCBJL08gIiAiYmFzZSBhZGRyZXNzISIsIGludHMpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlkcHJpbnRrKEtFUk5fREVCVUcgIndkNzAwMF9zZXR1cDogSVJRPSVkLCBETUE9JWQsIEkvTz0weCV4LCAiCisJCQkiQlVTX09OPSVkbnMsIEJVU19PRkY9JWRuc1xuIiwgY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmlycSwgY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmRtYSwgY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmlvYmFzZSwgY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmJ1c19vbiAqIDEyNSwgY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmJ1c19vZmYgKiAxMjUpOworCisJCXdkNzAwMF9jYXJkX251bSsrOworCX0KKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgid2Q3MDAwPSIsIHdkNzAwMF9zZXR1cCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhbnkyc2NzaSh1bmNoYXIgKiBzY3NpLCBpbnQgYW55KQoreworCSpzY3NpKysgPSAodW5zaWduZWQpYW55ID4+IDE2OworCSpzY3NpKysgPSAodW5zaWduZWQpYW55ID4+IDg7CisJKnNjc2krKyA9IGFueTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2NzaTJpbnQodW5jaGFyICogc2NzaSkKK3sKKwlyZXR1cm4gKHNjc2lbMF0gPDwgMTYpIHwgKHNjc2lbMV0gPDwgOCkgfCBzY3NpWzJdOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2Q3MDAwX2VuYWJsZV9pbnRyKEFkYXB0ZXIgKiBob3N0KQoreworCWhvc3QtPmNvbnRyb2wgfD0gSU5UX0VOOworCW91dGIoaG9zdC0+Y29udHJvbCwgaG9zdC0+aW9iYXNlICsgQVNDX0NPTlRST0wpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3ZDcwMDBfZW5hYmxlX2RtYShBZGFwdGVyICogaG9zdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWhvc3QtPmNvbnRyb2wgfD0gRE1BX0VOOworCW91dGIoaG9zdC0+Y29udHJvbCwgaG9zdC0+aW9iYXNlICsgQVNDX0NPTlRST0wpOworCisJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCXNldF9kbWFfbW9kZShob3N0LT5kbWEsIERNQV9NT0RFX0NBU0NBREUpOworCWVuYWJsZV9kbWEoaG9zdC0+ZG1hKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKworfQorCisKKyNkZWZpbmUgV0FJVG5leHR0aW1lb3V0IDIwMAkvKiAyIHNlY29uZHMgKi8KKworc3RhdGljIGlubGluZSBzaG9ydCBXQUlUKHVuc2lnbmVkIHBvcnQsIHVuc2lnbmVkIG1hc2ssIHVuc2lnbmVkIGFsbG9mLCB1bnNpZ25lZCBub25lb2YpCit7CisJdW5zaWduZWQgV0FJVGJpdHM7CisJdW5zaWduZWQgbG9uZyBXQUlUdGltZW91dCA9IGppZmZpZXMgKyBXQUlUbmV4dHRpbWVvdXQ7CisKKwl3aGlsZSAodGltZV9iZWZvcmVfZXEoamlmZmllcywgV0FJVHRpbWVvdXQpKSB7CisJCVdBSVRiaXRzID0gaW5iKHBvcnQpICYgbWFzazsKKworCQlpZiAoKChXQUlUYml0cyAmIGFsbG9mKSA9PSBhbGxvZikgJiYgKChXQUlUYml0cyAmIG5vbmVvZikgPT0gMCkpCisJCQlyZXR1cm4gKDApOworCX0KKworCXJldHVybiAoMSk7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgY29tbWFuZF9vdXQoQWRhcHRlciAqIGhvc3QsIHVuY2hhciAqIGNtZCwgaW50IGxlbikKK3sKKwlpZiAoIVdBSVQoaG9zdC0+aW9iYXNlICsgQVNDX1NUQVQsIEFTQ19TVEFUTUFTSywgQ01EX1JEWSwgMCkpIHsKKwkJd2hpbGUgKGxlbi0tKSB7CisJCQlkbyB7CisJCQkJb3V0YigqY21kLCBob3N0LT5pb2Jhc2UgKyBBU0NfQ09NTUFORCk7CisJCQkJV0FJVChob3N0LT5pb2Jhc2UgKyBBU0NfU1RBVCwgQVNDX1NUQVRNQVNLLCBDTURfUkRZLCAwKTsKKwkJCX0gd2hpbGUgKGluYihob3N0LT5pb2Jhc2UgKyBBU0NfU1RBVCkgJiBDTURfUkVKKTsKKworCQkJY21kKys7CisJCX0KKworCQlyZXR1cm4gKDEpOworCX0KKworCXByaW50ayhLRVJOX1dBUk5JTkcgIndkNzAwMCBjb21tYW5kX291dDogV0FJVCBmYWlsZWQoJWQpXG4iLCBsZW4gKyAxKTsKKworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqICBUaGlzIHZlcnNpb24gb2YgYWxsb2Nfc2NicyBpcyBpbiBwcmVwYXJhdGlvbiBmb3Igc3VwcG9ydGluZyBtdWx0aXBsZQorICogIGNvbW1hbmRzIHBlciBsdW4gYW5kIGNvbW1hbmQgY2hhaW5pbmcsIGJ5IHF1ZXVlaW5nIHBlbmRpbmcgY29tbWFuZHMuCisgKiAgV2Ugd2lsbCBuZWVkIHRvIGFsbG9jYXRlIFNjYnMgaW4gYmxvY2tzIHNpbmNlIHRoZXkgd2lsbCB3YWl0IHRvIGJlCisgKiAgZXhlY3V0ZWQgc28gdGhlcmUgaXMgdGhlIHBvc3NpYmlsaXR5IG9mIGRlYWRsb2NrIG90aGVyd2lzZS4KKyAqICBBbHNvLCB0byBrZWVwIGxhcmdlciByZXF1ZXN0cyBmcm9tIGJlaW5nIHN0YXJ2ZWQgYnkgc21hbGxlciByZXF1ZXN0cywKKyAqICB3ZSBsaW1pdCBhY2Nlc3MgdG8gdGhpcyByb3V0aW5lIHdpdGggYW4gaW50ZXJuYWwgYnVzeSBmbGFnLCBzbyB0aGF0CisgKiAgdGhlIHNhdGlzZmlhYmlsaXR5IG9mIGEgcmVxdWVzdCBpcyBub3QgZGVwZW5kZW50IG9uIHRoZSBzaXplIG9mIHRoZQorICogIHJlcXVlc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgU2NiICphbGxvY19zY2JzKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGludCBuZWVkZWQpCit7CisJU2NiICpzY2IsICpwID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBXQUlUbmV4dHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyBub3c7CisJaW50IGk7CisKKwlpZiAobmVlZGVkIDw9IDApCisJCXJldHVybiAoTlVMTCk7CS8qIHNhbml0eSBjaGVjayAqLworCisJc3Bpbl91bmxvY2tfaXJxKGhvc3QtPmhvc3RfbG9jayk7CisKKyAgICAgIHJldHJ5OgorCXdoaWxlIChmcmVlc2NicyA8IG5lZWRlZCkgeworCQl0aW1lb3V0ID0gamlmZmllcyArIFdBSVRuZXh0dGltZW91dDsKKwkJZG8geworCQkJLyogRklYTUU6IGNhbiB3ZSBhY3R1YWxseSBqdXN0IHlpZWxkIGhlcmUgPz8gKi8KKwkJCWZvciAobm93ID0gamlmZmllczsgbm93ID09IGppZmZpZXM7KQorCQkJCWNwdV9yZWxheCgpOwkvKiB3YWl0IGEgamlmZnkgKi8KKwkJfSB3aGlsZSAoZnJlZXNjYnMgPCBuZWVkZWQgJiYgdGltZV9iZWZvcmVfZXEoamlmZmllcywgdGltZW91dCkpOworCQkvKgorCQkgKiAgSWYgd2UgZ2V0IGhlcmUgd2l0aCBlbm91Z2ggZnJlZSBTY2JzLCB3ZSBjYW4gdGFrZSB0aGVtLgorCQkgKiAgT3RoZXJ3aXNlLCB3ZSB0aW1lZCBvdXQgYW5kIGRpZG4ndCBnZXQgZW5vdWdoLgorCQkgKi8KKwkJaWYgKGZyZWVzY2JzIDwgbmVlZGVkKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIndkNzAwMDogY2FuJ3QgZ2V0IGVub3VnaCBmcmVlIFNDQnMuXG4iKTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwl9CisKKwkvKiBUYWtlIHRoZSBsb2NrLCB0aGVuIGNoZWNrIHdlIGRpZG50IGdldCBiZWF0ZW4sIGlmIHNvIHRyeSBhZ2FpbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzY2Jwb29sX2xvY2ssIGZsYWdzKTsKKwlpZiAoZnJlZXNjYnMgPCBuZWVkZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NicG9vbF9sb2NrLCBmbGFncyk7CisJCWdvdG8gcmV0cnk7CisJfQorCisJc2NiID0gc2NiZnJlZTsKKwlmcmVlc2NicyAtPSBuZWVkZWQ7CisJZm9yIChpID0gMDsgaSA8IG5lZWRlZDsgaSsrKSB7CisJCXAgPSBzY2JmcmVlOworCQlzY2JmcmVlID0gcC0+bmV4dDsKKwl9CisJcC0+bmV4dCA9IE5VTEw7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2Jwb29sX2xvY2ssIGZsYWdzKTsKKworCXNwaW5fbG9ja19pcnEoaG9zdC0+aG9zdF9sb2NrKTsKKwlyZXR1cm4gKHNjYik7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfc2NiKFNjYiAqIHNjYikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjYnBvb2xfbG9jaywgZmxhZ3MpOworCisJbWVtc2V0KHNjYiwgMCwgc2l6ZW9mKFNjYikpOworCXNjYi0+bmV4dCA9IHNjYmZyZWU7CisJc2NiZnJlZSA9IHNjYjsKKwlmcmVlc2NicysrOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NicG9vbF9sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfc2Nicyh2b2lkKQoreworCWludCBpOworCisJc3Bpbl9sb2NrX2luaXQoJnNjYnBvb2xfbG9jayk7CisKKwkvKiBUaGlzIGlzIG9ubHkgZXZlciBjYWxsZWQgYmVmb3JlIHRoZSBTQ0IgcG9vbCBpcyBhY3RpdmUgKi8KKworCXNjYmZyZWUgPSAmKHNjYnNbMF0pOworCW1lbXNldChzY2JzLCAwLCBzaXplb2Yoc2NicykpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfU0NCUyAtIDE7IGkrKykgeworCQlzY2JzW2ldLm5leHQgPSAmKHNjYnNbaSArIDFdKTsKKwkJc2Nic1tpXS5TQ3BudCA9IE5VTEw7CisJfQorCXNjYnNbTUFYX1NDQlMgLSAxXS5uZXh0ID0gTlVMTDsKKwlzY2JzW01BWF9TQ0JTIC0gMV0uU0NwbnQgPSBOVUxMOworfQorCisKK3N0YXRpYyBpbnQgbWFpbF9vdXQoQWRhcHRlciAqIGhvc3QsIFNjYiAqIHNjYnB0cikKKy8qCisgKiAgTm90ZTogdGhpcyBjYW4gYWxzbyBiZSB1c2VkIGZvciBJQ0JzOyBqdXN0IGNhc3QgdG8gdGhlIHBhcm0gdHlwZS4KKyAqLworeworCWludCBpLCBvZ21iOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5jaGFyIHN0YXJ0X29nbWI7CisJTWFpbGJveCAqb2dtYnMgPSBob3N0LT5tYi5vZ21iOworCWludCAqbmV4dF9vZ21iID0gJihob3N0LT5uZXh0X29nbWIpOworCisJZHByaW50aygid2Q3MDAwX21haWxfb3V0OiAweCUwNmx4IiwgKGxvbmcpIHNjYnB0cik7CisKKwkvKiBXZSBmaXJzdCBsb29rIGZvciBhIGZyZWUgb3V0Z29pbmcgbWFpbGJveCAqLworCXNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPnNoLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlvZ21iID0gKm5leHRfb2dtYjsKKwlmb3IgKGkgPSAwOyBpIDwgT0dNQl9DTlQ7IGkrKykgeworCQlpZiAob2dtYnNbb2dtYl0uc3RhdHVzID09IDApIHsKKwkJCWRwcmludGsoIiB1c2luZyBPR01CIDB4JXgiLCBvZ21iKTsKKwkJCW9nbWJzW29nbWJdLnN0YXR1cyA9IDE7CisJCQlhbnkyc2NzaSgodW5jaGFyICopIG9nbWJzW29nbWJdLnNjYnB0ciwgKGludCkgc2NicHRyKTsKKworCQkJKm5leHRfb2dtYiA9IChvZ21iICsgMSkgJSBPR01CX0NOVDsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCW9nbWIgPSAob2dtYiArIDEpICUgT0dNQl9DTlQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+c2gtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJZHByaW50aygiLCBzY2IgaXMgMHglMDZseCIsIChsb25nKSBzY2JwdHIpOworCisJaWYgKGkgPj0gT0dNQl9DTlQpIHsKKwkJLyoKKwkJICogIEFsdGVybmF0aXZlbHksIHdlIG1pZ2h0IGlzc3VlIHRoZSAiaW50ZXJydXB0IG9uIGZyZWUgT0dNQiIsCisJCSAqICBhbmQgc2xlZXAsIGJ1dCBpdCBtdXN0IGJlIGVuc3VyZWQgdGhhdCBpdCBpc24ndCB0aGUgaW5pdAorCQkgKiAgdGFzayBydW5uaW5nLiAgSW5zdGVhZCwgdGhpcyB2ZXJzaW9uIGFzc3VtZXMgdGhhdCB0aGUgY2FsbGVyCisJCSAqICB3aWxsIGJlIHBlcnNpc3RlbnQsIGFuZCB0cnkgYWdhaW4uICBTaW5jZSBpdCdzIHRoZSBhZGFwdGVyCisJCSAqICB0aGF0IG1hcmtzIE9HTUIncyBmcmVlLCB3YWl0aW5nIGV2ZW4gd2l0aCBpbnRlcnJ1cHRzIG9mZgorCQkgKiAgc2hvdWxkIHdvcmssIHNpbmNlIHRoZXkgYXJlIGZyZWVkIHZlcnkgcXVpY2tseSBpbiBtb3N0IGNhc2VzLgorCQkgKi8KKwkJZHByaW50aygiLCBubyBmcmVlIE9HTUJzLlxuIik7CisJCXJldHVybiAoMCk7CisJfQorCisJd2Q3MDAwX2VuYWJsZV9pbnRyKGhvc3QpOworCisJc3RhcnRfb2dtYiA9IFNUQVJUX09HTUIgfCBvZ21iOworCWNvbW1hbmRfb3V0KGhvc3QsICZzdGFydF9vZ21iLCAxKTsKKworCWRwcmludGsoIiwgYXdhaXRpbmcgaW50ZXJydXB0LlxuIik7CisKKwlyZXR1cm4gKDEpOworfQorCisKK3N0YXRpYyBpbnQgbWFrZV9jb2RlKHVuc2lnbmVkIGhvc3RlcnIsIHVuc2lnbmVkIHNjc2llcnIpCit7CisjaWZkZWYgV0Q3MDAwX0RFQlVHCisJaW50IGluX2Vycm9yID0gaG9zdGVycjsKKyNlbmRpZgorCisJc3dpdGNoICgoaG9zdGVyciA+PiA4KSAmIDB4ZmYpIHsKKwljYXNlIDA6CQkvKiBSZXNlcnZlZCAqLworCQlob3N0ZXJyID0gRElEX0VSUk9SOworCQlicmVhazsKKwljYXNlIDE6CQkvKiBDb21tYW5kIENvbXBsZXRlLCBubyBlcnJvcnMgKi8KKwkJaG9zdGVyciA9IERJRF9PSzsKKwkJYnJlYWs7CisJY2FzZSAyOgkJLyogQ29tbWFuZCBjb21wbGV0ZSwgZXJyb3IgbG9nZ2VkIGluIHNjYiBzdGF0dXMgKHNjc2llcnIpICovCisJCWhvc3RlcnIgPSBESURfT0s7CisJCWJyZWFrOworCWNhc2UgNDoJCS8qIENvbW1hbmQgZmFpbGVkIHRvIGNvbXBsZXRlIC0gdGltZW91dCAqLworCQlob3N0ZXJyID0gRElEX1RJTUVfT1VUOworCQlicmVhazsKKwljYXNlIDU6CQkvKiBDb21tYW5kIHRlcm1pbmF0ZWQ7IEJ1cyByZXNldCBieSBleHRlcm5hbCBkZXZpY2UgKi8KKwkJaG9zdGVyciA9IERJRF9SRVNFVDsKKwkJYnJlYWs7CisJY2FzZSA2OgkJLyogVW5leHBlY3RlZCBDb21tYW5kIFJlY2VpdmVkIHcvIGhvc3QgYXMgdGFyZ2V0ICovCisJCWhvc3RlcnIgPSBESURfQkFEX1RBUkdFVDsKKwkJYnJlYWs7CisJY2FzZSA4MDoJCS8qIFVuZXhwZWN0ZWQgUmVzZWxlY3Rpb24gKi8KKwljYXNlIDgxOgkJLyogVW5leHBlY3RlZCBTZWxlY3Rpb24gKi8KKwkJaG9zdGVyciA9IERJRF9CQURfSU5UUjsKKwkJYnJlYWs7CisJY2FzZSA4MjoJCS8qIEFib3J0IENvbW1hbmQgTWVzc2FnZSAgKi8KKwkJaG9zdGVyciA9IERJRF9BQk9SVDsKKwkJYnJlYWs7CisJY2FzZSA4MzoJCS8qIFNDU0kgQnVzIFNvZnR3YXJlIFJlc2V0ICovCisJY2FzZSA4NDoJCS8qIFNDU0kgQnVzIEhhcmR3YXJlIFJlc2V0ICovCisJCWhvc3RlcnIgPSBESURfUkVTRVQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CQkvKiBSZXNlcnZlZCAqLworCQlob3N0ZXJyID0gRElEX0VSUk9SOworCX0KKyNpZmRlZiBXRDcwMDBfREVCVUcKKwlpZiAoc2NzaWVyciB8fCBob3N0ZXJyKQorCQlkcHJpbnRrKCJcblNDU0kgY29tbWFuZCBlcnJvcjogU0NTSSAweCUwMnggaG9zdCAweCUwNHggcmV0dXJuICVkXG4iLCBzY3NpZXJyLCBpbl9lcnJvciwgaG9zdGVycik7CisjZW5kaWYKKwlyZXR1cm4gKHNjc2llcnIgfCAoaG9zdGVyciA8PCAxNikpOworfQorCisjZGVmaW5lIHdkNzAwMF9pbnRyX2Fjayhob3N0KSAgIG91dGIgKDAsIGhvc3QtPmlvYmFzZSArIEFTQ19JTlRSX0FDSykKKworCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2Q3MDAwX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlBZGFwdGVyICpob3N0ID0gKEFkYXB0ZXIgKikgZGV2X2lkOworCWludCBmbGFnLCBpY21iLCBlcnJzdGF0dXMsIGljbWJfc3RhdHVzOworCWludCBob3N0X2Vycm9yLCBzY3NpX2Vycm9yOworCVNjYiAqc2NiOwkvKiBmb3IgU0NTSSBjb21tYW5kcyAqLworCUljYkFueSAqaWNiOwkvKiBmb3IgaG9zdCBjb21tYW5kcyAqLworCXN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OworCU1haWxib3ggKmljbWJzID0gaG9zdC0+bWIuaWNtYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+c2gtPmhvc3RfbG9jaywgZmxhZ3MpOworCWhvc3QtPmludF9jb3VudGVyKys7CisKKwlkcHJpbnRrKCJ3ZDcwMDBfaW50cjogaXJxID0gJWQsIGhvc3QgPSAweCUwNmx4XG4iLCBpcnEsIChsb25nKSBob3N0KTsKKworCWZsYWcgPSBpbmIoaG9zdC0+aW9iYXNlICsgQVNDX0lOVFJfU1RBVCk7CisKKwlkcHJpbnRrKCJ3ZDcwMDBfaW50cjogaW50ciBzdGF0ID0gMHglMDJ4XG4iLCBmbGFnKTsKKworCWlmICghKGluYihob3N0LT5pb2Jhc2UgKyBBU0NfU1RBVCkgJiBJTlRfSU0pKSB7CisJCS8qIE5COiB0aGVzZSBhcmUgX3ZlcnlfIHBvc3NpYmxlIGlmIElSUSAxNSBpcyBiZWluZyB1c2VkLCBzaW5jZQorCQkgKiBpdCdzIHRoZSAiZ2FyYmFnZSBjb2xsZWN0b3IiIG9uIHRoZSAybmQgODI1OSBQSUMuICBTcGVjaWZpY2FsbHksCisJCSAqIGFueSBpbnRlcnJ1cHQgc2lnbmFsIGludG8gdGhlIDgyNTkgd2hpY2ggY2FuJ3QgYmUgaWRlbnRpZmllZAorCQkgKiBjb21lcyBvdXQgYXMgNyBmcm9tIHRoZSA4MjU5LCB3aGljaCBpcyAxNSB0byB0aGUgaG9zdC4gIFRodXMsIGl0CisJCSAqIGlzIGEgZ29vZCB0aGluZyB0aGUgV0Q3MDAwIGhhcyBhbiBpbnRlcnJ1cHQgc3RhdHVzIHBvcnQsIHNvIHdlCisJCSAqIGNhbiBzb3J0IHRoZXNlIG91dC4gIE90aGVyd2lzZSwgZWxlY3RyaWNhbCBub2lzZSBhbmQgb3RoZXIgc3VjaAorCQkgKiBwcm9ibGVtcyB3b3VsZCBiZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHZhbGlkIGludGVycnVwdHMuLi4KKwkJICovCisJCWRwcmludGsoIndkNzAwMF9pbnRyOiBwaGFudG9tIGludGVycnVwdC4uLlxuIik7CisJCWdvdG8gYWNrOworCX0KKworCWlmICghKGZsYWcgJiBNQl9JTlRSKSkKKwkJZ290byBhY2s7CisKKwkvKiBUaGUgaW50ZXJydXB0IGlzIGZvciBhIG1haWxib3ggKi8KKwlpZiAoIShmbGFnICYgSU1CX0lOVFIpKSB7CisJCWRwcmludGsoIndkNzAwMF9pbnRyOiBmcmVlIG91dGdvaW5nIG1haWxib3hcbiIpOworCQkvKgorCQkgKiBJZiBzbGVlcF9vbigpIGFuZCB0aGUgImludGVycnVwdCBvbiBmcmVlIE9HTUIiIGNvbW1hbmQgYXJlCisJCSAqIHVzZWQgaW4gbWFpbF9vdXQoKSwgd2FrZV91cCgpIHNob3VsZCBjb3JyZXNwb25kaW5nbHkgYmUgY2FsbGVkCisJCSAqIGhlcmUuICBGb3Igbm93LCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisJCSAqLworCQlnb3RvIGFjazsKKwl9CisKKwkvKiBUaGUgaW50ZXJydXB0IGlzIGZvciBhbiBpbmNvbWluZyBtYWlsYm94ICovCisJaWNtYiA9IGZsYWcgJiBNQl9NQVNLOworCWljbWJfc3RhdHVzID0gaWNtYnNbaWNtYl0uc3RhdHVzOworCWlmIChpY21iX3N0YXR1cyAmIDB4ODApIHsJLyogdW5zb2xpY2l0ZWQgLSByZXN1bHQgaW4gSUNNQiAqLworCQlkcHJpbnRrKCJ3ZDcwMDBfaW50cjogdW5zb2xpY2l0ZWQgaW50ZXJydXB0IDB4JTAyeFxuIiwgaWNtYl9zdGF0dXMpOworCQlnb3RvIGFjazsKKwl9CisKKwkvKiBBYWFhcmdoISAoWmFnYSkgKi8KKwlzY2IgPSBpc2FfYnVzX3RvX3ZpcnQoc2NzaTJpbnQoKHVuY2hhciAqKSBpY21ic1tpY21iXS5zY2JwdHIpKTsKKwlpY21ic1tpY21iXS5zdGF0dXMgPSAwOworCWlmIChzY2ItPm9wICYgSUNCX09QX01BU0spIHsJLyogYW4gU0NCIGlzIGRvbmUgKi8KKwkJaWNiID0gKEljYkFueSAqKSBzY2I7CisJCWljYi0+c3RhdHVzID0gaWNtYl9zdGF0dXM7CisJCWljYi0+cGhhc2UgPSAwOworCQlnb3RvIGFjazsKKwl9CisKKwlTQ3BudCA9IHNjYi0+U0NwbnQ7CisJaWYgKC0tKFNDcG50LT5TQ3AucGhhc2UpIDw9IDApIHsJLyogYWxsIHNjYnMgYXJlIGRvbmUgKi8KKwkJaG9zdF9lcnJvciA9IHNjYi0+dnVlIHwgKGljbWJfc3RhdHVzIDw8IDgpOworCQlzY3NpX2Vycm9yID0gc2NiLT5zdGF0dXM7CisJCWVycnN0YXR1cyA9IG1ha2VfY29kZShob3N0X2Vycm9yLCBzY3NpX2Vycm9yKTsKKwkJU0NwbnQtPnJlc3VsdCA9IGVycnN0YXR1czsKKworCQlmcmVlX3NjYihzY2IpOworCisJCVNDcG50LT5zY3NpX2RvbmUoU0NwbnQpOworCX0KKworIGFjazoKKwlkcHJpbnRrKCJ3ZDcwMDBfaW50cjogcmV0dXJuIGZyb20gaW50ZXJydXB0IGhhbmRsZXJcbiIpOworCXdkNzAwMF9pbnRyX2Fjayhob3N0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+c2gtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB3ZDcwMDBfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LAorCQl2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlTY2IgKnNjYjsKKwlTZ2IgKnNnYjsKKwl1bmNoYXIgKmNkYiA9ICh1bmNoYXIgKikgU0NwbnQtPmNtbmQ7CisJdW5jaGFyIGlkbHVuOworCXNob3J0IGNkYmxlbjsKKwlBZGFwdGVyICpob3N0ID0gKEFkYXB0ZXIgKikgU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwljZGJsZW4gPSBTQ3BudC0+Y21kX2xlbjsKKwlpZGx1biA9ICgoU0NwbnQtPmRldmljZS0+aWQgPDwgNSkgJiAweGUwKSB8IChTQ3BudC0+ZGV2aWNlLT5sdW4gJiA3KTsKKwlTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKKwlTQ3BudC0+U0NwLnBoYXNlID0gMTsKKwlzY2IgPSBhbGxvY19zY2JzKFNDcG50LT5kZXZpY2UtPmhvc3QsIDEpOworCXNjYi0+aWRsdW4gPSBpZGx1bjsKKwltZW1jcHkoc2NiLT5jZGIsIGNkYiwgY2RibGVuKTsKKwlzY2ItPmRpcmVjID0gMHg0MDsJLyogRGlzYWJsZSBkaXJlY3Rpb24gY2hlY2sgKi8KKworCXNjYi0+U0NwbnQgPSBTQ3BudDsJLyogc28gd2UgY2FuIGZpbmQgc3R1ZmYgbGF0ZXIgKi8KKwlTQ3BudC0+aG9zdF9zY3JpYmJsZSA9ICh1bmNoYXIgKikgc2NiOworCXNjYi0+aG9zdCA9IGhvc3Q7CisKKwlpZiAoU0NwbnQtPnVzZV9zZykgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBTQ3BudC0+cmVxdWVzdF9idWZmZXI7CisJCXVuc2lnbmVkIGk7CisKKwkJaWYgKFNDcG50LT5kZXZpY2UtPmhvc3QtPnNnX3RhYmxlc2l6ZSA9PSBTR19OT05FKSB7CisJCQlwYW5pYygid2Q3MDAwX3F1ZXVlY29tbWFuZDogc2NhdHRlci9nYXRoZXIgbm90IHN1cHBvcnRlZC5cbiIpOworCQl9CisJCWRwcmludGsoIlVzaW5nIHNjYXR0ZXIvZ2F0aGVyIHdpdGggJWQgZWxlbWVudHMuXG4iLCBTQ3BudC0+dXNlX3NnKTsKKworCQlzZ2IgPSBzY2ItPnNnYjsKKwkJc2NiLT5vcCA9IDE7CisJCWFueTJzY3NpKHNjYi0+ZGF0YXB0ciwgKGludCkgc2diKTsKKwkJYW55MnNjc2koc2NiLT5tYXhsZW4sIFNDcG50LT51c2Vfc2cgKiBzaXplb2YoU2diKSk7CisKKwkJZm9yIChpID0gMDsgaSA8IFNDcG50LT51c2Vfc2c7IGkrKykgeworCQkJYW55MnNjc2koc2diW2ldLnB0ciwgaXNhX3BhZ2VfdG9fYnVzKHNnW2ldLnBhZ2UpICsgc2dbaV0ub2Zmc2V0KTsKKwkJCWFueTJzY3NpKHNnYltpXS5sZW4sIHNnW2ldLmxlbmd0aCk7CisJCX0KKwl9IGVsc2UgeworCQlzY2ItPm9wID0gMDsKKwkJYW55MnNjc2koc2NiLT5kYXRhcHRyLCBpc2FfdmlydF90b19idXMoU0NwbnQtPnJlcXVlc3RfYnVmZmVyKSk7CisJCWFueTJzY3NpKHNjYi0+bWF4bGVuLCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuKTsKKwl9CisKKwkvKiBGSVhNRTogZHJvcCBsb2NrIGFuZCB5aWVsZCBoZXJlID8gKi8KKworCXdoaWxlICghbWFpbF9vdXQoaG9zdCwgc2NiKSkKKwkJY3B1X3JlbGF4KCk7CS8qIGtlZXAgdHJ5aW5nICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3ZDcwMDBfZGlhZ25vc3RpY3MoQWRhcHRlciAqIGhvc3QsIGludCBjb2RlKQoreworCXN0YXRpYyBJY2JEaWFnIGljYiA9IHsgSUNCX09QX0RJQUdOT1NUSUNTIH07CisJc3RhdGljIHVuY2hhciBidWZbMjU2XTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlpY2IudHlwZSA9IGNvZGU7CisJYW55MnNjc2koaWNiLmxlbiwgc2l6ZW9mKGJ1ZikpOworCWFueTJzY3NpKGljYi5wdHIsIChpbnQpICZidWYpOworCWljYi5waGFzZSA9IDE7CisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgaXMgb25seSBjYWxsZWQgYXQgaW5pdCwgc28gdGhlcmUgc2hvdWxkIGJlIE9HTUJzCisJICogYXZhaWxhYmxlLiAgSSdtIGFzc3VtaW5nIHNvIGhlcmUuICBJZiB0aGlzIGlzIGdvaW5nIHRvCisJICogZmFpbCwgSSBjYW4ganVzdCBsZXQgdGhlIHRpbWVvdXQgY2F0Y2ggdGhlIGZhaWx1cmUuCisJICovCisJbWFpbF9vdXQoaG9zdCwgKHN0cnVjdCBzY2IgKikgJmljYik7CisJdGltZW91dCA9IGppZmZpZXMgKyBXQUlUbmV4dHRpbWVvdXQ7CS8qIHdhaXQgdXAgdG8gMiBzZWNvbmRzICovCisJd2hpbGUgKGljYi5waGFzZSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQljcHVfcmVsYXgoKTsJLyogd2FpdCBmb3IgY29tcGxldGlvbiAqLworCQliYXJyaWVyKCk7CisJfQorCisJaWYgKGljYi5waGFzZSkgeworCQlwcmludGsoIndkNzAwMF9kaWFnbm9zdGljczogdGltZWQgb3V0LlxuIik7CisJCXJldHVybiAoMCk7CisJfQorCWlmIChtYWtlX2NvZGUoaWNiLnZ1ZSB8IChpY2Iuc3RhdHVzIDw8IDgpLCAwKSkgeworCQlwcmludGsoIndkNzAwMF9kaWFnbm9zdGljczogZmFpbGVkICgweCUwMngsMHglMDJ4KVxuIiwgaWNiLnZ1ZSwgaWNiLnN0YXR1cyk7CisJCXJldHVybiAoMCk7CisJfQorCisJcmV0dXJuICgxKTsKK30KKworCitzdGF0aWMgaW50IHdkNzAwMF9hZGFwdGVyX3Jlc2V0KEFkYXB0ZXIgKiBob3N0KQoreworCUluaXRDbWQgaW5pdF9jbWQgPSB7CisJCUlOSVRJQUxJWkFUSU9OLAorCQk3LAorCQlob3N0LT5idXNfb24sCisJCWhvc3QtPmJ1c19vZmYsCisJCTAsCisJCXswLCAwLCAwfSwKKwkJT0dNQl9DTlQsCisJCUlDTUJfQ05UCisJfTsKKwlpbnQgZGlhZzsKKwkvKgorCSAqICBSZXNldCB0aGUgYWRhcHRlciAtIG9ubHkuICBUaGUgU0NTSSBidXMgd2FzIGluaXRpYWxpemVkIGF0IHBvd2VyLXVwLAorCSAqICBhbmQgd2UgbmVlZCB0byBkbyB0aGlzIGp1c3Qgc28gd2UgY29udHJvbCB0aGUgbWFpbGJveGVzLCBldGMuCisJICovCisJb3V0YihBU0NfUkVTLCBob3N0LT5pb2Jhc2UgKyBBU0NfQ09OVFJPTCk7CisJdWRlbGF5KDQwKTsJCS8qIHJlc2V0IHB1bHNlOiB0aGlzIGlzIDQwdXMsIG9ubHkgbmVlZCAyNXVzICovCisJb3V0YigwLCBob3N0LT5pb2Jhc2UgKyBBU0NfQ09OVFJPTCk7CisJaG9zdC0+Y29udHJvbCA9IDA7CS8qIHRoaXMgbXVzdCBhbHdheXMgc2hhZG93IEFTQ19DT05UUk9MICovCisKKwlpZiAoV0FJVChob3N0LT5pb2Jhc2UgKyBBU0NfU1RBVCwgQVNDX1NUQVRNQVNLLCBDTURfUkRZLCAwKSkgeworCQlwcmludGsoS0VSTl9FUlIgIndkNzAwMF9pbml0OiBXQUlUIHRpbWVkIG91dC5cbiIpOworCQlyZXR1cm4gLTE7CS8qIC0xID0gbm90IG9rICovCisJfQorCisJaWYgKChkaWFnID0gaW5iKGhvc3QtPmlvYmFzZSArIEFTQ19JTlRSX1NUQVQpKSAhPSAxKSB7CisJCXByaW50aygid2Q3MDAwX2luaXQ6ICIpOworCisJCXN3aXRjaCAoZGlhZykgeworCQljYXNlIDI6CisJCQlwcmludGsoS0VSTl9FUlIgIlJBTSBmYWlsdXJlLlxuIik7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcHJpbnRrKEtFUk5fRVJSICJGSUZPIFIvVyBmYWlsZWRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXByaW50ayhLRVJOX0VSUiAiU0JJQyByZWdpc3RlciBSL1cgZmFpbGVkXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQlwcmludGsoS0VSTl9FUlIgIkluaXRpYWxpemF0aW9uIEQtRkYgZmFpbGVkLlxuIik7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJcHJpbnRrKEtFUk5fRVJSICJIb3N0IElSUSBELUZGIGZhaWxlZC5cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCXByaW50ayhLRVJOX0VSUiAiUk9NIGNoZWNrc3VtIGVycm9yLlxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiZGlhZ25vc3RpYyBjb2RlIDB4JTAyWGggcmVjZWl2ZWQuXG4iLCBkaWFnKTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCS8qIENsZWFyIG1haWxib3hlcyAqLworCW1lbXNldCgmKGhvc3QtPm1iKSwgMCwgc2l6ZW9mKGhvc3QtPm1iKSk7CisKKwkvKiBFeGVjdXRlIGluaXQgY29tbWFuZCAqLworCWFueTJzY3NpKCh1bmNoYXIgKikgJiAoaW5pdF9jbWQubWFpbGJveGVzKSwgKGludCkgJihob3N0LT5tYikpOworCWlmICghY29tbWFuZF9vdXQoaG9zdCwgKHVuY2hhciAqKSAmIGluaXRfY21kLCBzaXplb2YoaW5pdF9jbWQpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIndkNzAwMF9hZGFwdGVyX3Jlc2V0OiBhZGFwdGVyIGluaXRpYWxpemF0aW9uIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKFdBSVQoaG9zdC0+aW9iYXNlICsgQVNDX1NUQVQsIEFTQ19TVEFUTUFTSywgQVNDX0lOSVQsIDApKSB7CisJCXByaW50aygid2Q3MDAwX2FkYXB0ZXJfcmVzZXQ6IFdBSVQgdGltZWQgb3V0LlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2Q3MDAwX2luaXQoQWRhcHRlciAqIGhvc3QpCit7CisJaWYgKHdkNzAwMF9hZGFwdGVyX3Jlc2V0KGhvc3QpID09IC0xKQorCQlyZXR1cm4gMDsKKworCisJaWYgKHJlcXVlc3RfaXJxKGhvc3QtPmlycSwgd2Q3MDAwX2ludHIsIFNBX0lOVEVSUlVQVCwgIndkNzAwMCIsIGhvc3QpKSB7CisJCXByaW50aygid2Q3MDAwX2luaXQ6IGNhbid0IGdldCBJUlEgJWQuXG4iLCBob3N0LT5pcnEpOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAocmVxdWVzdF9kbWEoaG9zdC0+ZG1hLCAid2Q3MDAwIikpIHsKKwkJcHJpbnRrKCJ3ZDcwMDBfaW5pdDogY2FuJ3QgZ2V0IERNQSBjaGFubmVsICVkLlxuIiwgaG9zdC0+ZG1hKTsKKwkJZnJlZV9pcnEoaG9zdC0+aXJxLCBob3N0KTsKKwkJcmV0dXJuICgwKTsKKwl9CisJd2Q3MDAwX2VuYWJsZV9kbWEoaG9zdCk7CisJd2Q3MDAwX2VuYWJsZV9pbnRyKGhvc3QpOworCisJaWYgKCF3ZDcwMDBfZGlhZ25vc3RpY3MoaG9zdCwgSUNCX0RJQUdfRlVMTCkpIHsKKwkJZnJlZV9kbWEoaG9zdC0+ZG1hKTsKKwkJZnJlZV9pcnEoaG9zdC0+aXJxLCBOVUxMKTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlyZXR1cm4gKDEpOworfQorCisKK3N0YXRpYyB2b2lkIHdkNzAwMF9yZXZpc2lvbihBZGFwdGVyICogaG9zdCkKK3sKKwlzdGF0aWMgSWNiUmV2THZsIGljYiA9IHsgSUNCX09QX0dFVF9SRVZJU0lPTiB9OworCisJaWNiLnBoYXNlID0gMTsKKwkvKgorCSAqIExpa2UgZGlhZ25vc3RpY3MsIHRoaXMgaXMgb25seSBkb25lIGF0IGluaXQgdGltZSwgaW4gZmFjdCwgZnJvbQorCSAqIHdkNzAwMF9kZXRlY3QsIHNvIHRoZXJlIHNob3VsZCBiZSBPR01CcyBhdmFpbGFibGUuICBJZiBpdCBmYWlscywKKwkgKiB0aGUgb25seSBkYW1hZ2Ugd2lsbCBiZSB0aGF0IHRoZSByZXZpc2lvbiB3aWxsIHNob3cgdXAgYXMgMC4wLAorCSAqIHdoaWNoIGluIHR1cm4gbWVhbnMgdGhhdCBzY2F0dGVyL2dhdGhlciB3aWxsIGJlIGRpc2FibGVkLgorCSAqLworCW1haWxfb3V0KGhvc3QsIChzdHJ1Y3Qgc2NiICopICZpY2IpOworCXdoaWxlIChpY2IucGhhc2UpIHsKKwkJY3B1X3JlbGF4KCk7CS8qIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKwkJYmFycmllcigpOworCX0KKwlob3N0LT5yZXYxID0gaWNiLnByaW1hcnk7CisJaG9zdC0+cmV2MiA9IGljYi5zZWNvbmRhcnk7Cit9CisKKworI3VuZGVmIFNQUklOVEYKKyNkZWZpbmUgU1BSSU5URihhcmdzLi4uKSB7IGlmIChwb3MgPCAoYnVmZmVyICsgbGVuZ3RoKSkgcG9zICs9IHNwcmludGYgKHBvcywgIyMgYXJncyk7IH0KKworc3RhdGljIGludCB3ZDcwMDBfc2V0X2luZm8oY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoLCBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCWRwcmludGsoIkJ1ZmZlciA9IDwlLipzPiwgbGVuZ3RoID0gJWRcbiIsIGxlbmd0aCwgYnVmZmVyLCBsZW5ndGgpOworCisJLyoKKwkgKiBDdXJyZW50bHkgdGhpcyBpcyBhIG5vLW9wCisJICovCisJZHByaW50aygiU29ycnksIHRoaXMgZnVuY3Rpb24gaXMgY3VycmVudGx5IG91dCBvZiBvcmRlci4uLlxuIik7CisJcmV0dXJuIChsZW5ndGgpOworfQorCisKK3N0YXRpYyBpbnQgd2Q3MDAwX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCAgaW50IGlub3V0KQoreworCUFkYXB0ZXIgKmFkYXB0ZXIgPSAoQWRhcHRlciAqKWhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciAqcG9zID0gYnVmZmVyOworI2lmZGVmIFdENzAwMF9ERUJVRworCU1haWxib3ggKm9nbWJzLCAqaWNtYnM7CisJc2hvcnQgY291bnQ7CisjZW5kaWYKKworCS8qCisJICogSGFzIGRhdGEgYmVlbiB3cml0dGVuIHRvIHRoZSBmaWxlID8KKwkgKi8KKwlpZiAoaW5vdXQpCisJCXJldHVybiAod2Q3MDAwX3NldF9pbmZvKGJ1ZmZlciwgbGVuZ3RoLCBob3N0KSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlTUFJJTlRGKCJIb3N0IHNjc2klZDogV2VzdGVybiBEaWdpdGFsIFdELTcwMDAgKHJldiAlZC4lZClcbiIsIGhvc3QtPmhvc3Rfbm8sIGFkYXB0ZXItPnJldjEsIGFkYXB0ZXItPnJldjIpOworCVNQUklOVEYoIiAgSU8gYmFzZTogICAgICAweCV4XG4iLCBhZGFwdGVyLT5pb2Jhc2UpOworCVNQUklOVEYoIiAgSVJROiAgICAgICAgICAlZFxuIiwgYWRhcHRlci0+aXJxKTsKKwlTUFJJTlRGKCIgIERNQSBjaGFubmVsOiAgJWRcbiIsIGFkYXB0ZXItPmRtYSk7CisJU1BSSU5URigiICBJbnRlcnJ1cHRzOiAgICVkXG4iLCBhZGFwdGVyLT5pbnRfY291bnRlcik7CisJU1BSSU5URigiICBCVVNfT04gdGltZTogICVkIG5hbm9zZWNvbmRzXG4iLCBhZGFwdGVyLT5idXNfb24gKiAxMjUpOworCVNQUklOVEYoIiAgQlVTX09GRiB0aW1lOiAlZCBuYW5vc2Vjb25kc1xuIiwgYWRhcHRlci0+YnVzX29mZiAqIDEyNSk7CisKKyNpZmRlZiBXRDcwMDBfREVCVUcKKwlvZ21icyA9IGFkYXB0ZXItPm1iLm9nbWI7CisJaWNtYnMgPSBhZGFwdGVyLT5tYi5pY21iOworCisJU1BSSU5URigiXG5Db250cm9sIHBvcnQgdmFsdWU6IDB4JXhcbiIsIGFkYXB0ZXItPmNvbnRyb2wpOworCVNQUklOVEYoIkluY29taW5nIG1haWxib3g6XG4iKTsKKwlTUFJJTlRGKCIgIHNpemU6ICVkXG4iLCBJQ01CX0NOVCk7CisJU1BSSU5URigiICBxdWV1ZWQgbWVzc2FnZXM6ICIpOworCisJZm9yIChpID0gY291bnQgPSAwOyBpIDwgSUNNQl9DTlQ7IGkrKykKKwkJaWYgKGljbWJzW2ldLnN0YXR1cykgeworCQkJY291bnQrKzsKKwkJCVNQUklOVEYoIjB4JXggIiwgaSk7CisJCX0KKworCVNQUklOVEYoY291bnQgPyAiXG4iIDogIm5vbmVcbiIpOworCisJU1BSSU5URigiT3V0Z29pbmcgbWFpbGJveDpcbiIpOworCVNQUklOVEYoIiAgc2l6ZTogJWRcbiIsIE9HTUJfQ05UKTsKKwlTUFJJTlRGKCIgIG5leHQgbWVzc2FnZTogMHgleFxuIiwgYWRhcHRlci0+bmV4dF9vZ21iKTsKKwlTUFJJTlRGKCIgIHF1ZXVlZCBtZXNzYWdlczogIik7CisKKwlmb3IgKGkgPSBjb3VudCA9IDA7IGkgPCBPR01CX0NOVDsgaSsrKQorCQlpZiAob2dtYnNbaV0uc3RhdHVzKSB7CisJCQljb3VudCsrOworCQkJU1BSSU5URigiMHgleCAiLCBpKTsKKwkJfQorCisJU1BSSU5URihjb3VudCA/ICJcbiIgOiAibm9uZVxuIik7CisjZW5kaWYKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIENhbGN1bGF0ZSBzdGFydCBvZiBuZXh0IGJ1ZmZlciwgYW5kIHJldHVybiB2YWx1ZS4KKwkgKi8KKwkqc3RhcnQgPSBidWZmZXIgKyBvZmZzZXQ7CisKKwlpZiAoKHBvcyAtIGJ1ZmZlcikgPCBvZmZzZXQpCisJCXJldHVybiAoMCk7CisJZWxzZSBpZiAoKHBvcyAtIGJ1ZmZlciAtIG9mZnNldCkgPCBsZW5ndGgpCisJCXJldHVybiAocG9zIC0gYnVmZmVyIC0gb2Zmc2V0KTsKKwllbHNlCisJCXJldHVybiAobGVuZ3RoKTsKK30KKworCisvKgorICogIFJldHVybnMgdGhlIG51bWJlciBvZiBhZGFwdGVycyB0aGlzIGRyaXZlciBpcyBzdXBwb3J0aW5nLgorICoKKyAqICBUaGUgc291cmNlIGZvciBob3N0cy5jIHNheXMgdG8gd2FpdCB0byBjYWxsIHNjc2lfcmVnaXN0ZXIgdW50aWwgMTAwJQorICogIHN1cmUgYWJvdXQgYW4gYWRhcHRlci4gIFdlIG5lZWQgdG8gZG8gaXQgYSBsaXR0bGUgc29vbmVyIGhlcmU7IHdlCisgKiAgbmVlZCB0aGUgc3RvcmFnZSBzZXQgdXAgYnkgc2NzaV9yZWdpc3RlciBiZWZvcmUgd2Q3MDAwX2luaXQsIGFuZAorICogIGNoYW5naW5nIHRoZSBsb2NhdGlvbiBvZiBhbiBBZGFwdGVyIHN0cnVjdHVyZSBpcyBtb3JlIHRyb3VibGUgdGhhbgorICogIGNhbGxpbmcgc2NzaV91bnJlZ2lzdGVyLgorICoKKyAqLworCitzdGF0aWMgaW50IHdkNzAwMF9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCkKK3sKKwlzaG9ydCBwcmVzZW50ID0gMCwgYmlvc2FkZHJfcHRyLCBzaWdfcHRyLCBpLCBwYXNzOworCXNob3J0IGJpb3NwdHJbTlVNX0NPTkZJR1NdOworCXVuc2lnbmVkIGlvYmFzZTsKKwlBZGFwdGVyICpob3N0ID0gTlVMTDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaDsKKwlpbnQgdW5pdCA9IDA7CisKKwlkcHJpbnRrKCJ3ZDcwMDBfZGV0ZWN0OiBzdGFydGVkXG4iKTsKKworI2lmZGVmIE1PRFVMRQorCWlmICh3ZDcwMDApCisJCXdkNzAwMF9zZXR1cCh3ZDcwMDApOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgVU5JVFM7IHdkNzAwMF9ob3N0W2krK10gPSBOVUxMKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NPTkZJR1M7IGJpb3NwdHJbaSsrXSA9IC0xKTsKKworCXRwbnQtPnByb2NfbmFtZSA9ICJ3ZDcwMDAiOworCXRwbnQtPnByb2NfaW5mbyA9ICZ3ZDcwMDBfcHJvY19pbmZvOworCisJLyoKKwkgKiBTZXQgdXAgU0NCIGZyZWUgbGlzdCwgd2hpY2ggaXMgc2hhcmVkIGJ5IGFsbCBhZGFwdGVycworCSAqLworCWluaXRfc2NicygpOworCisJZm9yIChwYXNzID0gMDsgcGFzcyA8IE5VTV9DT05GSUdTOyBwYXNzKyspIHsKKwkJLyoKKwkJICogRmlyc3QsIHNlYXJjaCBmb3IgQklPUyBTSUdOQVRVUkUuLi4KKwkJICovCisJCWZvciAoYmlvc2FkZHJfcHRyID0gMDsgYmlvc2FkZHJfcHRyIDwgTlVNX0FERFJTOyBiaW9zYWRkcl9wdHIrKykKKwkJCWZvciAoc2lnX3B0ciA9IDA7IHNpZ19wdHIgPCBOVU1fU0lHTkFUVVJFUzsgc2lnX3B0cisrKSB7CisJCQkJZm9yIChpID0gMDsgaSA8IHBhc3M7IGkrKykKKwkJCQkJaWYgKGJpb3NwdHJbaV0gPT0gYmlvc2FkZHJfcHRyKQorCQkJCQkJYnJlYWs7CisKKwkJCQlpZiAoaSA9PSBwYXNzKSB7CisJCQkJCXZvaWQgX19pb21lbSAqYmlvc2FkZHIgPSBpb3JlbWFwKHdkNzAwMF9iaW9zYWRkcltiaW9zYWRkcl9wdHJdICsgc2lnbmF0dXJlc1tzaWdfcHRyXS5vZnMsCisJCQkJCQkJCSBzaWduYXR1cmVzW3NpZ19wdHJdLmxlbik7CisJCQkJCXNob3J0IGJpb3NfbWF0Y2ggPSAxOworCisJCQkJCWlmIChiaW9zYWRkcikKKwkJCQkJCWJpb3NfbWF0Y2ggPSBjaGVja19zaWduYXR1cmUoYmlvc2FkZHIsIHNpZ25hdHVyZXNbc2lnX3B0cl0uc2lnLCBzaWduYXR1cmVzW3NpZ19wdHJdLmxlbik7CisKKwkJCQkJaW91bm1hcChiaW9zYWRkcik7CisKKwkJCQkJaWYgKGJpb3NfbWF0Y2gpCisJCQkJCQlnb3RvIGJpb3NfbWF0Y2hlZDsKKwkJCQl9CisJCQl9CisKKwkgICAgICBiaW9zX21hdGNoZWQ6CisJCS8qCisJCSAqIEJJT1MgU0lHTkFUVVJFIGhhcyBiZWVuIGZvdW5kLgorCQkgKi8KKyNpZmRlZiBXRDcwMDBfREVCVUcKKwkJZHByaW50aygid2Q3MDAwX2RldGVjdDogcGFzcyAlZFxuIiwgcGFzcyArIDEpOworCisJCWlmIChiaW9zYWRkcl9wdHIgPT0gTlVNX0FERFJTKQorCQkJZHByaW50aygiV0QtNzAwMCBTU1QgQklPUyBub3QgZGV0ZWN0ZWQuLi5cbiIpOworCQllbHNlCisJCQlkcHJpbnRrKCJXRC03MDAwIFNTVCBCSU9TIGRldGVjdGVkIGF0IDB4JWx4OiBjaGVja2luZy4uLlxuIiwgd2Q3MDAwX2Jpb3NhZGRyW2Jpb3NhZGRyX3B0cl0pOworI2VuZGlmCisKKwkJaWYgKGNvbmZpZ3NbcGFzc10uaXJxIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCWlmICh1bml0ID09IFVOSVRTKQorCQkJY29udGludWU7CisKKwkJaW9iYXNlID0gY29uZmlnc1twYXNzXS5pb2Jhc2U7CisKKwkJZHByaW50aygid2Q3MDAwX2RldGVjdDogY2hlY2sgSU8gMHgleCByZWdpb24uLi5cbiIsIGlvYmFzZSk7CisKKwkJaWYgKHJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgNCwgIndkNzAwMCIpKSB7CisKKwkJCWRwcmludGsoIndkNzAwMF9kZXRlY3Q6IEFTQyByZXNldCAoSU8gMHgleCkgLi4uIiwgaW9iYXNlKTsKKwkJCS8qCisJCQkgKiBBU0MgcmVzZXQuLi4KKwkJCSAqLworCQkJb3V0YihBU0NfUkVTLCBpb2Jhc2UgKyBBU0NfQ09OVFJPTCk7CisJCQltc2xlZXAoMTApOworCQkJb3V0YigwLCBpb2Jhc2UgKyBBU0NfQ09OVFJPTCk7CisKKwkJCWlmIChXQUlUKGlvYmFzZSArIEFTQ19TVEFULCBBU0NfU1RBVE1BU0ssIENNRF9SRFksIDApKSB7CisJCQkJZHByaW50aygiZmFpbGVkIVxuIik7CisJCQkJZ290byBlcnJfcmVsZWFzZTsKKwkJCX0gZWxzZQorCQkJCWRwcmludGsoIm9rIVxuIik7CisKKwkJCWlmIChpbmIoaW9iYXNlICsgQVNDX0lOVFJfU1RBVCkgPT0gMSkgeworCQkJCS8qCisJCQkJICogIFdlIHJlZ2lzdGVyIGhlcmUsIHRvIGdldCBhIHBvaW50ZXIgdG8gdGhlIGV4dHJhIHNwYWNlLAorCQkJCSAqICB3aGljaCB3ZSdsbCB1c2UgYXMgdGhlIEFkYXB0ZXIgc3RydWN0dXJlIChob3N0KSBmb3IKKwkJCQkgKiAgdGhpcyBhZGFwdGVyLiAgSXQgaXMgbG9jYXRlZCBqdXN0IGFmdGVyIHRoZSByZWdpc3RlcmVkCisJCQkJICogIFNjc2lfSG9zdCBzdHJ1Y3R1cmUgKHNoKSwgYW5kIGlzIGxvY2F0ZWQgYnkgdGhlIGVtcHR5CisJCQkJICogIGFycmF5IGhvc3RkYXRhLgorCQkJCSAqLworCQkJCXNoID0gc2NzaV9yZWdpc3Rlcih0cG50LCBzaXplb2YoQWRhcHRlcikpOworCQkJCWlmIChzaCA9PSBOVUxMKQorCQkJCQlnb3RvIGVycl9yZWxlYXNlOworCisJCQkJaG9zdCA9IChBZGFwdGVyICopIHNoLT5ob3N0ZGF0YTsKKworCQkJCWRwcmludGsoIndkNzAwMF9kZXRlY3Q6IGFkYXB0ZXIgYWxsb2NhdGVkIGF0IDB4JXhcbiIsIChpbnQpIGhvc3QpOworCQkJCW1lbXNldChob3N0LCAwLCBzaXplb2YoQWRhcHRlcikpOworCisJCQkJaG9zdC0+aXJxID0gY29uZmlnc1twYXNzXS5pcnE7CisJCQkJaG9zdC0+ZG1hID0gY29uZmlnc1twYXNzXS5kbWE7CisJCQkJaG9zdC0+aW9iYXNlID0gaW9iYXNlOworCQkJCWhvc3QtPmludF9jb3VudGVyID0gMDsKKwkJCQlob3N0LT5idXNfb24gPSBjb25maWdzW3Bhc3NdLmJ1c19vbjsKKwkJCQlob3N0LT5idXNfb2ZmID0gY29uZmlnc1twYXNzXS5idXNfb2ZmOworCQkJCWhvc3QtPnNoID0gd2Q3MDAwX2hvc3RbdW5pdF0gPSBzaDsKKwkJCQl1bml0Kys7CisKKwkJCQlkcHJpbnRrKCJ3ZDcwMDBfZGV0ZWN0OiBUcnlpbmcgaW5pdCBXRC03MDAwIGNhcmQgYXQgSU8gIiAiMHgleCwgSVJRICVkLCBETUEgJWQuLi5cbiIsIGhvc3QtPmlvYmFzZSwgaG9zdC0+aXJxLCBob3N0LT5kbWEpOworCisJCQkJaWYgKCF3ZDcwMDBfaW5pdChob3N0KSkJLyogSW5pdGlhbGl6YXRpb24gZmFpbGVkICovCisJCQkJCWdvdG8gZXJyX3VucmVnaXN0ZXI7CisKKwkJCQkvKgorCQkJCSAqICBPSyBmcm9tIGhlcmUgLSB3ZSdsbCB1c2UgdGhpcyBhZGFwdGVyL2NvbmZpZ3VyYXRpb24uCisJCQkJICovCisJCQkJd2Q3MDAwX3JldmlzaW9uKGhvc3QpOwkvKiBpbXBvcnRhbnQgZm9yIHNjYXR0ZXIvZ2F0aGVyICovCisKKwkJCQkvKgorCQkJCSAqICBGb3IgYm9hcmRzIGJlZm9yZSByZXYgNi4wLCBzY2F0dGVyL2dhdGhlciBpc24ndCBzdXBwb3J0ZWQuCisJCQkJICovCisJCQkJaWYgKGhvc3QtPnJldjEgPCA2KQorCQkJCQlzaC0+c2dfdGFibGVzaXplID0gU0dfTk9ORTsKKworCQkJCXByZXNlbnQrKzsJLyogY291bnQgaXQgKi8KKworCQkJCWlmIChiaW9zYWRkcl9wdHIgIT0gTlVNX0FERFJTKQorCQkJCQliaW9zcHRyW3Bhc3NdID0gYmlvc2FkZHJfcHRyOworCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiV2VzdGVybiBEaWdpdGFsIFdELTcwMDAgKHJldiAlZC4lZCkgIiwgaG9zdC0+cmV2MSwgaG9zdC0+cmV2Mik7CisJCQkJcHJpbnRrKCJ1c2luZyBJTyAweCV4LCBJUlEgJWQsIERNQSAlZC5cbiIsIGhvc3QtPmlvYmFzZSwgaG9zdC0+aXJxLCBob3N0LT5kbWEpOworCQkJCXByaW50aygiICBCVVNfT04gdGltZTogJWRucywgQlVTX09GRiB0aW1lOiAlZG5zXG4iLCBob3N0LT5idXNfb24gKiAxMjUsIGhvc3QtPmJ1c19vZmYgKiAxMjUpOworCQkJfQorCQl9IGVsc2UKKwkJCWRwcmludGsoIndkNzAwMF9kZXRlY3Q6IElPIDB4JXggcmVnaW9uIGFscmVhZHkgYWxsb2NhdGVkIVxuIiwgaW9iYXNlKTsKKworCQljb250aW51ZTsKKworCSAgICAgIGVycl91bnJlZ2lzdGVyOgorCQlzY3NpX3VucmVnaXN0ZXIoc2gpOworCSAgICAgIGVycl9yZWxlYXNlOgorCQlyZWxlYXNlX3JlZ2lvbihpb2Jhc2UsIDQpOworCisJfQorCisJaWYgKCFwcmVzZW50KQorCQlwcmludGsoIkZhaWxlZCBpbml0aWFsaXphdGlvbiBvZiBXRC03MDAwIFNDU0kgY2FyZCFcbiIpOworCisJcmV0dXJuIChwcmVzZW50KTsKK30KKworc3RhdGljIGludCB3ZDcwMDBfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpZiAoc2hvc3QtPmlycSkKKwkJZnJlZV9pcnEoc2hvc3QtPmlycSwgTlVMTCk7CisJaWYgKHNob3N0LT5pb19wb3J0ICYmIHNob3N0LT5uX2lvX3BvcnQpCisJCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKKwlzY3NpX3VucmVnaXN0ZXIoc2hvc3QpOworCXJldHVybiAwOworfQorCisjaWYgMAorLyoKKyAqICBJIGhhdmUgYWJzb2x1dGVseSBOTyBpZGVhIGhvdyB0byBkbyBhbiBhYm9ydCB3aXRoIHRoZSBXRDcwMDAuLi4KKyAqLworc3RhdGljIGludCB3ZDcwMDBfYWJvcnQoU2NzaV9DbW5kICogU0NwbnQpCit7CisJQWRhcHRlciAqaG9zdCA9IChBZGFwdGVyICopIFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJaWYgKGluYihob3N0LT5pb2Jhc2UgKyBBU0NfU1RBVCkgJiBJTlRfSU0pIHsKKwkJcHJpbnRrKCJ3ZDcwMDBfYWJvcnQ6IGxvc3QgaW50ZXJydXB0XG4iKTsKKwkJd2Q3MDAwX2ludHJfaGFuZGxlKGhvc3QtPmlycSwgTlVMTCwgTlVMTCk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCXJldHVybiBGQUlMRUQ7Cit9CisjZW5kaWYKKworLyoKKyAqICBMYXN0IHJlc29ydC4gUmVpbml0aWFsaXplIHRoZSBib2FyZC4KKyAqLworCitzdGF0aWMgaW50IHdkNzAwMF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCUFkYXB0ZXIgKmhvc3QgPSAoQWRhcHRlciAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCWlmICh3ZDcwMDBfYWRhcHRlcl9yZXNldChob3N0KSA8IDApCisJCXJldHVybiBGQUlMRUQ7CisJd2Q3MDAwX2VuYWJsZV9pbnRyKGhvc3QpOworCXJldHVybiBTVUNDRVNTOworfQorCisvKgorICogIFRoaXMgd2FzIGJvcnJvd2VkIGRpcmVjdGx5IGZyb20gYWhhMTU0Mi5jLiAoWmFnYSkKKyAqLworCitzdGF0aWMgaW50IHdkNzAwMF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICppcCkKK3sKKwljaGFyIGJbQkRFVk5BTUVfU0laRV07CisKKwlkcHJpbnRrKCJ3ZDcwMDBfYmlvc3BhcmFtOiBkZXY9JXMsIHNpemU9JWQsICIsCisJCWJkZXZuYW1lKGJkZXYsIGIpLCBjYXBhY2l0eSk7CisJKHZvaWQpYjsJLyogdW51c2VkIHZhciB3YXJuaW5nPyAqLworCisJLyoKKwkgKiB0cnkgZGVmYXVsdCB0cmFuc2xhdGlvbgorCSAqLworCWlwWzBdID0gNjQ7CisJaXBbMV0gPSAzMjsKKwlpcFsyXSA9IGNhcGFjaXR5ID4+IDExOworCisJLyoKKwkgKiBmb3IgZGlza3MgPjFHQiBkbyBzb21lIGd1ZXNzaW5nCisJICovCisJaWYgKGlwWzJdID49IDEwMjQpIHsKKwkJaW50IGluZm9bM107CisKKwkJLyoKKwkJICogdHJ5IHRvIGZpZ3VyZSBvdXQgdGhlIGdlb21ldHJ5IGZyb20gdGhlIHBhcnRpdGlvbiB0YWJsZQorCQkgKi8KKwkJaWYgKChzY3NpY2FtX2Jpb3NfcGFyYW0oYmRldiwgY2FwYWNpdHksIGluZm8pIDwgMCkgfHwgISgoKGluZm9bMF0gPT0gNjQpICYmIChpbmZvWzFdID09IDMyKSkgfHwgKChpbmZvWzBdID09IDI1NSkgJiYgKGluZm9bMV0gPT0gNjMpKSkpIHsKKwkJCXByaW50aygid2Q3MDAwX2Jpb3NwYXJhbTogdW5hYmxlIHRvIHZlcmlmeSBnZW9tZXRyeSBmb3IgZGlzayB3aXRoID4xR0IuXG4iICIgICAgICAgICAgICAgICAgICB1c2luZyBleHRlbmRlZCB0cmFuc2xhdGlvbi5cbiIpOworCisJCQlpcFswXSA9IDI1NTsKKwkJCWlwWzFdID0gNjM7CisJCQlpcFsyXSA9ICh1bnNpZ25lZCBsb25nKSBjYXBhY2l0eSAvICgyNTUgKiA2Myk7CisJCX0gZWxzZSB7CisJCQlpcFswXSA9IGluZm9bMF07CisJCQlpcFsxXSA9IGluZm9bMV07CisJCQlpcFsyXSA9IGluZm9bMl07CisKKwkJCWlmIChpbmZvWzBdID09IDI1NSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogY3VycmVudCBwYXJ0aXRpb24gdGFibGUgaXMgIiAidXNpbmcgZXh0ZW5kZWQgdHJhbnNsYXRpb24uXG4iLCBfX0ZVTkNUSU9OX18pOworCQl9CisJfQorCisJZHByaW50aygiYmlvcyBnZW9tZXRyeTogaGVhZD0lZCwgc2VjPSVkLCBjeWw9JWRcbiIsIGlwWzBdLCBpcFsxXSwgaXBbMl0pOworCWRwcmludGsoIldBUk5JTkc6IGNoZWNrLCBpZiB0aGUgYmlvcyBnZW9tZXRyeSBpcyBjb3JyZWN0LlxuIik7CisKKwlyZXR1cm4gKDApOworfQorCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgV3VlbnNjaGUsIEpvaG4gQm95ZCwgTWlyb3NsYXYgWmFnb3JhYyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIHRoZSBXRDcwMDAgc2VyaWVzIElTQSBjb250cm9sbGVycyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQkJPSAid2Q3MDAwIiwKKwkucHJvY19pbmZvCQk9IHdkNzAwMF9wcm9jX2luZm8sCisJLm5hbWUJCQk9ICJXZXN0ZXJuIERpZ2l0YWwgV0QtNzAwMCIsCisJLmRldGVjdAkJCT0gd2Q3MDAwX2RldGVjdCwKKwkucmVsZWFzZQkJPSB3ZDcwMDBfcmVsZWFzZSwKKwkucXVldWVjb21tYW5kCQk9IHdkNzAwMF9xdWV1ZWNvbW1hbmQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IHdkNzAwMF9ob3N0X3Jlc2V0LAorCS5iaW9zX3BhcmFtCQk9IHdkNzAwMF9iaW9zcGFyYW0sCisJLmNhbl9xdWV1ZQkJPSBXRDcwMDBfUSwKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gV0Q3MDAwX1NHLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51bmNoZWNrZWRfaXNhX2RtYQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAorfTsKKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvemFsb24uYyBiL2RyaXZlcnMvc2NzaS96YWxvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNTEwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvemFsb24uYwpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIFphbG9uIDUzYzd4eCBkZXZpY2UgZHJpdmVyLgorICogQnkgUmljaGFyZCBIaXJzdCAocmhpcnN0QGxpbnV4Y2FyZS5jb20pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiLi4vcGFyaXNjL2dzYy5oIgorCisjaW5jbHVkZSAibmNyNTNjOHh4LmgiCisKK01PRFVMRV9BVVRIT1IoIlJpY2hhcmQgSGlyc3QiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmx1ZWZpc2gvWmFsb24gNzIwIFNDU0kgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgR1NDX1NDU0lfWkFMT05fT0ZGU0VUIDB4ODAwCisKKyNkZWZpbmUgSU9fTU9EVUxFX0VJTQkJKDEqNCkKKyNkZWZpbmUgSU9fTU9EVUxFX0RDX0FEQVRBCSgyKjQpCisjZGVmaW5lIElPX01PRFVMRV9JSV9DREFUQQkoMyo0KQorI2RlZmluZSBJT19NT0RVTEVfSU9fQ09NTUFORAkoMTIqNCkKKyNkZWZpbmUgSU9fTU9EVUxFX0lPX1NUQVRVUwkoMTMqNCkKKworI2RlZmluZSBJT1NUQVRVU19SWQkJMHg0MAorI2RlZmluZSBJT1NUQVRVU19GRQkJMHg4MAorI2RlZmluZSBJT0lJREFUQV9TTUlOVDVMCTB4NDAwMDAwMDAKKyNkZWZpbmUgSU9JSURBVEFfTUlOVDVFTgkweDIwMDAwMDAwCisjZGVmaW5lIElPSUlEQVRBX1BBQ0tFTgkJMHgxMDAwMDAwMAorI2RlZmluZSBJT0lJREFUQV9QUkVGRVRDSEVOCTB4MDgwMDAwMDAKKyNkZWZpbmUgSU9JSURBVEFfSU9JSQkJMHgwMDAwMDAyMAorCisjZGVmaW5lIENNRF9SRVNFVAkJNQorCitzdGF0aWMgc3RydWN0IG5jcl9jaGlwIHphbG9uNzIwX2NoaXAgX19pbml0ZGF0YSA9IHsKKwkucmV2aXNpb25faWQgPQkweDBmLAorCS5idXJzdF9tYXggPQkzLAorCS5vZmZzZXRfbWF4ID0JOCwKKwkubnJfZGl2aXNvciA9CTQsCisJLmZlYXR1cmVzID0JRkVfV0lERSB8IEZFX0RJRkYgfCBGRV9FSFB8IEZFX01VWCB8IEZFX0VBLAorfTsKKworCisKKyNpZiAwCisvKiBGSVhNRToKKyAqIElzIHRoaXMgZnVuY3Rpb24gZGVhZCBjb2RlPyBvciBpcyBzb21lb25lIHBsYW5uaW5nIG9uIHVzaW5nIGl0IGluIHRoZQorICogZnV0dXJlLiAgVGhlIGNsb2NrID0gKGludCkgcGRjX3Jlc3VsdFsxNl0gZG9lcyBub3QgbG9vayBjb3JyZWN0IHRvCisgKiBtZSAuLi4gSSB0aGluayBpdCBzaG91bGQgYmUgaW9kY19kYXRhWzE2XS4gIFNpbmNlIHRoaXMgY2F1c2UgYSBjb21waWxlCisgKiBlcnJvciB3aXRoIHRoZSBuZXcgZW5jYXBzdWxhdGVkIFBEQywgSSdtIG5vdCBjb21waWxpbmcgaW4gdGhpcyBmdW5jdGlvbi4KKyAqIC0gUkIKKyAqLworLyogcG9rZSBTQ1NJIGNsb2NrIG91dCBvZiBpb2RjIGRhdGEgKi8KKworc3RhdGljIHU4IGlvZGNfZGF0YVszMl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDY0KSkpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGRjX3Jlc3VsdFszMl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDE2KSkpID17MCwwLDAsMH07CisKK3N0YXRpYyBpbnQgCitsYXNpX3Njc2lfY2xvY2sodm9pZCAqIGhwYSwgaW50IGRlZmF1bHRjbG9jaykKK3sKKwlpbnQgY2xvY2ssIHN0YXR1czsKKworCXN0YXR1cyA9IHBkY19pb2RjX3JlYWQoJnBkY19yZXN1bHQsIGhwYSwgMCwgJmlvZGNfZGF0YSwgMzIgKTsKKwlpZiAoc3RhdHVzID09IFBEQ19SRVRfT0spIHsKKwkJY2xvY2sgPSAoaW50KSBwZGNfcmVzdWx0WzE2XTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcGRjX2lvZGNfcmVhZCByZXR1cm5lZCAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQljbG9jayA9IGRlZmF1bHRjbG9jazsgCisJfQorCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTQ1NJIGNsb2NrICVkXG4iLCBfX0ZVTkNUSU9OX18sIGNsb2NrKTsKKyAJcmV0dXJuIGNsb2NrOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHphbG9uN3h4X3RlbXBsYXRlID0geworCS5tb2R1bGUJCT0gVEhJU19NT0RVTEUsCisJLnByb2NfbmFtZQk9ICJ6YWxvbjd4eCIsCit9OworCitzdGF0aWMgaW50IF9faW5pdAoremFsb25fcHJvYmUoc3RydWN0IHBhcmlzY19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ3NjX2lycSBnc2NfaXJxOworCXUzMiB6YWxvbl92ZXJzOworCWludCBlcnJvciA9IC1FTk9ERVY7CisJdm9pZCBfX2lvbWVtICp6YWxvbiA9IGlvcmVtYXAoZGV2LT5ocGEsIDQwOTYpOworCXZvaWQgX19pb21lbSAqaW9fcG9ydCA9IHphbG9uICsgR1NDX1NDU0lfWkFMT05fT0ZGU0VUOworCXN0YXRpYyBpbnQgdW5pdCA9IDA7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3QgbmNyX2RldmljZSBkZXZpY2U7CisKKwlfX3Jhd193cml0ZWwoQ01EX1JFU0VULCB6YWxvbiArIElPX01PRFVMRV9JT19DT01NQU5EKTsKKwl3aGlsZSAoIShfX3Jhd19yZWFkbCh6YWxvbiArIElPX01PRFVMRV9JT19TVEFUVVMpICYgSU9TVEFUVVNfUlkpKQorCQljcHVfcmVsYXgoKTsKKwlfX3Jhd193cml0ZWwoSU9JSURBVEFfTUlOVDVFTiB8IElPSUlEQVRBX1BBQ0tFTiB8IElPSUlEQVRBX1BSRUZFVENIRU4sCisJCXphbG9uICsgSU9fTU9EVUxFX0lJX0NEQVRBKTsKKworCS8qIFhYWDogU2F2ZSB0aGUgWmFsb24gdmVyc2lvbiBmb3IgYnVnIHdvcmthcm91bmRzPyAqLworCXphbG9uX3ZlcnMgPSAoX19yYXdfcmVhZGwoemFsb24gKyBJT19NT0RVTEVfSUlfQ0RBVEEpID4+IDI0KSAmIDB4MDc7CisKKwkvKiBTZXR1cCB0aGUgaW50ZXJydXB0cyBmaXJzdC4KKwkqKiBMYXRlciBvbiByZXF1ZXN0X2lycSgpIHdpbGwgcmVnaXN0ZXIgdGhlIGhhbmRsZXIuCisJKi8KKwlkZXYtPmlycSA9IGdzY19hbGxvY19pcnEoJmdzY19pcnEpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFphbG9uIHZlcnNpb24gJWQsIElSUSAlZFxuIiwgX19GVU5DVElPTl9fLAorCQl6YWxvbl92ZXJzLCBkZXYtPmlycSk7CisKKwlfX3Jhd193cml0ZWwoZ3NjX2lycS50eG5fYWRkciB8IGdzY19pcnEudHhuX2RhdGEsIHphbG9uICsgSU9fTU9EVUxFX0VJTSk7CisKKwlpZiAoemFsb25fdmVycyA9PSAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogWmFsb24gMS4xIG9yIGVhcmxpZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwltZW1zZXQoJmRldmljZSwgMCwgc2l6ZW9mKHN0cnVjdCBuY3JfZGV2aWNlKSk7CisKKwkvKiBUaGUgZm9sbG93aW5nIHRocmVlIGFyZSBuZWVkZWQgYmVmb3JlIGFueSBvdGhlciBhY2Nlc3MuICovCisJX19yYXdfd3JpdGViKDB4MjAsIGlvX3BvcnQgKyAweDM4KTsgLyogRENOVExfUkVHLCAgRUEgICovCisJX19yYXdfd3JpdGViKDB4MDQsIGlvX3BvcnQgKyAweDFiKTsgLyogQ1RFU1QwX1JFRywgRUhQICovCisJX19yYXdfd3JpdGViKDB4ODAsIGlvX3BvcnQgKyAweDIyKTsgLyogQ1RFU1Q0X1JFRywgTVVYICovCisKKwkvKiBJbml0aWFsaXNlIG5jcl9kZXZpY2Ugc3RydWN0dXJlIHdpdGggaXRlbXMgcmVxdWlyZWQgYnkgbmNyX2F0dGFjaC4gKi8KKwlkZXZpY2UuY2hpcAkJPSB6YWxvbjcyMF9jaGlwOworCWRldmljZS5ob3N0X2lkCQk9IDc7CisJZGV2aWNlLmRldgkJPSAmZGV2LT5kZXY7CisJZGV2aWNlLnNsb3QuYmFzZQk9IGRldi0+aHBhICsgR1NDX1NDU0lfWkFMT05fT0ZGU0VUOworCWRldmljZS5zbG90LmJhc2Vfdgk9IGlvX3BvcnQ7CisJZGV2aWNlLnNsb3QuaXJxCQk9IGRldi0+aXJxOworCWRldmljZS5kaWZmZXJlbnRpYWwJPSAyOworCisJaG9zdCA9IG5jcl9hdHRhY2goJnphbG9uN3h4X3RlbXBsYXRlLCB1bml0LCAmZGV2aWNlKTsKKwlpZiAoIWhvc3QpCisJCWdvdG8gZmFpbDsKKworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgbmNyNTNjOHh4X2ludHIsIFNBX1NISVJRLCAiemFsb24iLCBob3N0KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpcnEgcHJvYmxlbSB3aXRoICVkLCBkZXRhY2hpbmdcbiAiLAorCQkJZGV2LT5kZXYuYnVzX2lkLCBkZXYtPmlycSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwl1bml0Kys7CisKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBob3N0KTsKKworCWVycm9yID0gc2NzaV9hZGRfaG9zdChob3N0LCAmZGV2LT5kZXYpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsX2ZyZWVfaXJxOworCisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisJcmV0dXJuIDA7CisKKyBmYWlsX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBob3N0KTsKKyBmYWlsOgorCW5jcjUzYzh4eF9yZWxlYXNlKGhvc3QpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHN0cnVjdCBwYXJpc2NfZGV2aWNlX2lkIHphbG9uX3RibFtdID0geworCXsgSFBIV19BX0RNQSwgSFZFUlNJT05fUkVWX0FOWV9JRCwgSFZFUlNJT05fQU5ZX0lELCAweDAwMDg5IH0sIAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwYXJpc2MsIHphbG9uX3RibCk7CisKK3N0YXRpYyBpbnQgX19leGl0IHphbG9uX3JlbW92ZShzdHJ1Y3QgcGFyaXNjX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKKworCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CisJbmNyNTNjOHh4X3JlbGVhc2UoaG9zdCk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGhvc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFyaXNjX2RyaXZlciB6YWxvbl9kcml2ZXIgPSB7CisJLm5hbWUgPQkJInphbG9uIiwKKwkuaWRfdGFibGUgPQl6YWxvbl90YmwsCisJLnByb2JlID0JemFsb25fcHJvYmUsCisJLnJlbW92ZSA9CV9fZGV2ZXhpdF9wKHphbG9uX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCB6YWxvbjd4eF9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IG5jcjUzYzh4eF9pbml0KCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ2lzdGVyX3BhcmlzY19kcml2ZXIoJnphbG9uX2RyaXZlcik7CisJaWYgKHJldCkKKwkJbmNyNTNjOHh4X2V4aXQoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgemFsb243eHhfZXhpdCh2b2lkKQoreworCXVucmVnaXN0ZXJfcGFyaXNjX2RyaXZlcigmemFsb25fZHJpdmVyKTsKKwluY3I1M2M4eHhfZXhpdCgpOworfQorCittb2R1bGVfaW5pdCh6YWxvbjd4eF9pbml0KTsKK21vZHVsZV9leGl0KHphbG9uN3h4X2V4aXQpOwo=